ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTczZTMKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEgQEAKK0Jhc2VkT25TdHlsZTogJ2dvb2dsZScKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDYyMmFiMTcuLjBkMjBiNjQgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw5OCArMSBAQAotIyMjIFRoZXNlIGZpbGVzIHNob3VsZCBnZXQgaWdub3JlZCBubyBtYXR0ZXIgd2hlcmUgdGhleSBhcHBlYXIuCi0KLSMgRWRpdG9ycyBsZWF2ZSB0aGVzZSBseWluZyBhcm91bmQKLVwjKlwjCi0uIyoKLSp+Ci0qLnN3cAotCi0jIEMgc3R1ZmYKLSoubwotCi0jIFdpbmRvd3Mgc3R1ZmYKLSoub2JqCi0qLmV4ZQotKi5saWIKLQotIyBQYXRjaCBsZWF2ZXMgdGhlc2UgbHlpbmcgYXJyb3VuZAotKi5vcmlnCi0qLnJlagotCi0jIGdjb3Ygc3R1ZmYKLSouZ2NubwotKi5nY292Ci0qLmdjZGEKLQotIyBBdXRvdG9vbHMgc3R1ZmYKLS5kZXBzCi1NYWtlZmlsZQotTWFrZWZpbGUuaW4KLQotIyBMaWJ0b29sIHN0dWZmCi0ubGlicwotKi5sbwotKi5sYQotCi0jIGN0YWdzIHN0dWZmCi1UQUdTCi0KLSMgU3R1ZmYgbWFkZSBieSBvdXIgbWFrZWZpbGVzCi1saWJldmVudC5wYwotbGliZXZlbnRfcHRocmVhZHMucGMKLWxpYmV2ZW50X29wZW5zc2wucGMKLSoubG9nCi0qLnRycwotCi0jIyBUaGUgaW5pdGlhbCAvIG1ha2VzIHRoZXNlIGZpbGVzIG9ubHkgZ2V0IGlnbm9yZWQgaW4gcGFydGljdWxhciBkaXJlY3Rvcmllcy4KLS9hdXRvbTR0ZS5jYWNoZQotCi0jIExpYnRvb2wgYWRkcyB0aGVzZSwgYXQgbGVhc3Qgc29tZXRpbWVzCi0vbTQvbGlidG9vbC5tNAotL200L2x0b3B0aW9ucy5tNAotL200L2x0c3VnYXIubTQKLS9tNC9sdHZlcnNpb24ubTQKLS9tNC9sdH5vYnNvbGV0ZS5tNAotCi0vYWNsb2NhbC5tNAotL2NvbXBpbGUKLS9kb3h5Z2VuCi0vY29uZmlnLmd1ZXNzCi0vY29uZmlnLmxvZwotL2NvbmZpZy5zdGF0dXMKLS9jb25maWcuc3ViCi0vY29uZmlndXJlCi0vZGVwY29tcAotL2NvbmZpZy5oCi0vY29uZmlnLmguaW4KLS9pbnN0YWxsLXNoCi0vbGlidG9vbAotL2x0bWFpbi5zaAotL21pc3NpbmcKLS9zdGFtcC1oMQotCi0vaW5jbHVkZS9ldmVudDIvZXZlbnQtY29uZmlnLmgKLQotL3NhbXBsZS9kbnMtZXhhbXBsZQotL3NhbXBsZS9ldmVudC10ZXN0Ci0vc2FtcGxlL2hlbGxvLXdvcmxkCi0vc2FtcGxlL2h0dHAtc2VydmVyCi0vc2FtcGxlL2xlLXByb3h5Ci0vc2FtcGxlL3NpZ25hbC10ZXN0Ci0vc2FtcGxlL3RpbWUtdGVzdAotCi0vdGVzdC9iZW5jaAotL3Rlc3QvYmVuY2hfY2FzY2FkZQotL3Rlc3QvYmVuY2hfaHR0cAotL3Rlc3QvYmVuY2hfaHR0cGNsaWVudAotL3Rlc3QvcmVncmVzcwotL3Rlc3QvcmVncmVzcy5nZW4uYwotL3Rlc3QvcmVncmVzcy5nZW4uaAotL3Rlc3QvcnBjZ2VuLWF0dGVtcHRlZAotL3Rlc3QvdGVzdC1lb2YKLS90ZXN0L3Rlc3QtaW5pdAotL3Rlc3QvdGVzdC1yYXRlbGltCi0vdGVzdC90ZXN0LXNjcmlwdC5zaAotL3Rlc3QvdGVzdC10aW1lCi0vdGVzdC90ZXN0LXdlb2YKLS90ZXN0L3Rlc3QtY2hhbmdlbGlzdAotCisqLnB5YwpkaWZmIC0tZ2l0IGEvUkVBRE1FLnR4dCBiL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmYTcwYQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS50eHQKQEAgLTAsMCArMSw3IEBACitUaGlzIGlzIHRoZSBSRUFETUUudHh0IGZpbGUgZm9yIGdpdC4gSWYgeW91IGFyZSBsb29raW5nIGF0IHRoaXMgZmlsZSBhbmQgeW91IGdvdCBpdCB0aHJvdWdoIFNWTiwgc29tZWJvZHkgbWVzc2VkIHVwIGFuZCBpdCBzaG91bGQgYmUgZml4ZWQuCisKK1RoaXMgaXMgdGVhbSA5NzEncyBjb2RlLiBXZSBvbmx5IGtlZXAgY29kZSBpbiB0aGlzIGdpdCByZXBvc2l0b3J5LiBGb3IgZGV0YWlscyBhYm91dCBob3cgd2UgdXNlIGdpdCwgc2VlIGRvYy9naXRzZXR1cC50eHQuCisKK1lvdSBjYW4gZ2V0IHRvIHRoaXMgY29kZSBpbiBhIHdlYiBicm93c2VyIHRocm91Z2ggPGh0dHBzOi8vcm9ib3RpY3MubXZsYS5uZXQvZ2l0OTcxPiAodXNlZnVsIGZvciBpZSBzZW5kaW5nIGxpbmtzKS4gWW91IGhhdmUgdG8gdXNlIHlvdXIgU1ZOIGNyZWRlbnRpYWxzIHRvIGxvZyBpbiB0aGVyZS4KKworYW9zL1JFQURNRS50eHQgaGFzIHNvbWUgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQncyB3aGVyZS4KZGlmZiAtLWdpdCBhL2Fvcy9SRUFETUUudHh0IGIvYW9zL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmOTM3NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMzQgQEAKK3NlZSAuLi9SRUFETUUudHh0IGZvciBvdmVyYWxsIGluZm9ybWF0aW9uCisKK1tGSUxFU10KK2NvbmZpZy8gaGFzIHNvbWUgY29uZmlndXJhdGlvbiBmaWxlcworCWFvcy5jb25mIGhhcyBkaXJlY3Rpb25zIGZvciBzZXR0aW5nIHVwIHJlc291cmNlIGxpbWl0cyBzbyB5b3UgY2FuIHJ1biB0aGUgY29kZSBvbiBhbnkgbGludXggbWFjaGluZSAodGhlIGRpcmVjdGlvbnMgYXJlIHRoZXJlIHRvIGtlZXAgdGhlbSB3aXRoIHRoZSBmaWxlKQorCXNldHVwX3JjX2NhcHMuc2ggaXMgYSBzaGVsbCBzY3JpcHQgKHlvdSBoYXZlIHRvIHJ1biBhcyByb290KSB0aGF0IGxldHMgeW91IHJ1biB0aGUgcmVhbHRpbWUgY29kZSB3aXRob3V0IGluc3RhbGxpbmcgYW9zLmNvbmYgZm9yIGFuIGluZGl2aWR1YWwgZmlsZQorCXN0YXJ0ZXIgaXMgYW4gaW5pdC5kIGZpbGUKKwkJaW5zdGFsbCBpdCBieSBwdXR0aW5nIGl0IGluIC9ldGMvaW5pdC5kIGFuIHJ1bm5pbmcgInVwZGF0ZS1yYy5kIHN0YXJ0ZXIgZGVmYXVsdHMiCisJCXJlc3RhcnQgaXQgYnkgcnVubmluZyAiaW52b2tlLXJjLmQgc3RhcnRlciByZXN0YXJ0IiAoZG9lc24ndCBhbHdheXMgd29yayB2ZXJ5IHdlbGwuLi4pCisJdGhlIC5jb25maWcgZmlsZXMgYXJlIGZvciBidWlsZGluZyBsaW51eCBrZXJuZWxzCisKK2xpbnV4LyBoYXMgY29kZSB0aGF0IG9ubHkgcnVucyBvbiBsaW51eCBzeXN0ZW1zCisKK2NvbW1vbi8gaXMgd2hlcmUgc3R1ZmYgdGhhdCBydW5zIG9uIGFsbCBwbGF0Zm9ybXMgaXMKK2NvbW1vbi9pbnB1dC8gaXMgd2hlcmUgdGhlIGZyYW1ld29yayBjb2RlIGZvciByZWFkaW5nIHN0dWZmIGludG8gdGhlIHF1ZXVlcyBzeXN0ZW0gaXMKK2NvbW1vbi9vdXRwdXQvIGlzIHdoZXJlIHRoZSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgdGhpbmdzIG91dCBvZiB0aGUgcXVldWVzIHN5c3RlbSBpcworY29tbW9uL21lc3NhZ2VzIGlzIHdoZXJlIHRoZSBjKysgd3JhcHBlcnMgZm9yICJxdWV1ZXMiIGFyZQorCitbTk9URVNdCitTb21lIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIGluIHNlcGFyYXRlIHRyYW5zbGF0aW9uIHVuaXRzIGluIG9yZGVyIGZvciB0aGVtIHRvIGJlIGd1YXJhbnRlZWQgdG8gd29yay4gQXMgdGhlIEMgc3RhbmRhcmQgc2F5cywKKwlBbHRlcm5hdGl2ZWx5LCBhbiBpbXBsZW1lbnRhdGlvbiBtaWdodCBwZXJmb3JtIHZhcmlvdXMgb3B0aW1pemF0aW9ucyB3aXRoaW4gZWFjaCB0cmFuc2xhdGlvbiB1bml0LCBzdWNoCisJdGhhdCB0aGUgYWN0dWFsIHNlbWFudGljcyB3b3VsZCBhZ3JlZSB3aXRoIHRoZSBhYnN0cmFjdCBzZW1hbnRpY3Mgb25seSB3aGVuIG1ha2luZyBmdW5jdGlvbiBjYWxscyBhY3Jvc3MKKwl0cmFuc2xhdGlvbiB1bml0IGJvdW5kYXJpZXMuIEluIHN1Y2ggYW4gaW1wbGVtZW50YXRpb24sIGF0IHRoZSB0aW1lIG9mIGVhY2ggZnVuY3Rpb24gZW50cnkgYW5kIGZ1bmN0aW9uCisJcmV0dXJuIHdoZXJlIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVkIGZ1bmN0aW9uIGFyZSBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMsIHRoZSB2YWx1ZXMgb2YgYWxsCisJZXh0ZXJuYWxseSBsaW5rZWQgb2JqZWN0cyBhbmQgb2YgYWxsIG9iamVjdHMgYWNjZXNzaWJsZSB2aWEgcG9pbnRlcnMgdGhlcmVpbiB3b3VsZCBhZ3JlZSB3aXRoIHRoZSBhYnN0cmFjdAorCXNlbWFudGljcy4gRnVydGhlcm1vcmUsIGF0IHRoZSB0aW1lIG9mIGVhY2ggc3VjaCBmdW5jdGlvbiBlbnRyeSB0aGUgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjYWxsZWQKKwlmdW5jdGlvbiBhbmQgb2YgYWxsIG9iamVjdHMgYWNjZXNzaWJsZSB2aWEgcG9pbnRlcnMgdGhlcmVpbiB3b3VsZCBhZ3JlZSB3aXRoIHRoZSBhYnN0cmFjdCBzZW1hbnRpY3MuIEluIHRoaXMKKwl0eXBlIG9mIGltcGxlbWVudGF0aW9uLCBvYmplY3RzIHJlZmVycmVkIHRvIGJ5IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzIGFjdGl2YXRlZCBieSB0aGUgc2lnbmFsIGZ1bmN0aW9uCisJd291bGQgcmVxdWlyZSBleHBsaWNpdCBzcGVjaWZpY2F0aW9uIG9mIHZvbGF0aWxlIHN0b3JhZ2UsIGFzIHdlbGwgYXMgb3RoZXIgaW1wbGVtZW50YXRpb24tZGVmaW5lZAorCXJlc3RyaWN0aW9ucy4KKworVGhlIEMrKyBuYW1lc3BhY2UgYW9zIGlzIHVzZWQgZm9yIGFsbCBvZiB0aGUgYW9zIGNvZGUuIFRoZSBjcmlvIGFuZCBsaW51eF9jb2RlIG5hbWVzcGFjZXMgYXJlIGZvciBBUElzIHRoYXQgb25seSBtYWtlIHNlbnNlIG9uIG9uZSBwbGF0Zm9ybSBvciB0aGUgb3RoZXIuCisKK0FsbW9zdCBldmVyeXRoaW5nIGluIGFvcy8gaXMgdGhyZWFkLXNhZmUuIEZpbGVzIHdpdGggYSBtYWluKCkgbWlnaHQgbm90IGJlLCBhbmQgc29tZSBwaWVjZXMgb2YgY29kZSBleHBsaWNpdGx5IHNheSBhdCB0aGVpciBkZWNsYXJhdGlvbiB0aGF0IHRoZXkgYXJlbid0LiBBbHNvLCBjb2RlIHdoaWNoIHNoYXJlcyBub24tY29uc3QgcG9pbnRlcnMgKGluY2x1ZGluZyB0aGlzKSBpcyBub3QgZ2VuZXJhbGx5IHRocmVhZC1zYWZlLiBPdGhlciB0aGFuIHRob3NlIGV4Y2VwdGlvbnMsIGV2ZXJ5dGhpbmcgaXMgYXNzdW1lZCB0byBiZSB0aHJlYWQtc2FmZSBzbyB0aGUgY29tbWVudHMgZG9uJ3Qgc2F5IHNvIGV4cGxpY2l0bHkuCmRpZmYgLS1naXQgYS9hb3MvYnVpbGQvYW9zLmd5cCBiL2Fvcy9idWlsZC9hb3MuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODcxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvYW9zLmd5cApAQCAtMCwwICsxLDYzIEBACisjIFRoaXMgZmlsZSBoYXMgYWxsIG9mIHRoZSBhb3MgdGFyZ2V0cy4KK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgIyBBIHRhcmdldCBmb3IgdGhpbmdzIHVzZWQgYnkgdGhlIGxvZ2dpbmcgaW1wbGVtZW50YXRpb24gKGV4Y2VwdCBkaWUpIHRvCisgICAgIyBkZXBlbmQgb24gdGhhdCBhbGxvd3MgbGlua2luZyBzdWNjZXNzZnVsbHkgd2l0aCBsb2dnaW5nIGNhbGxzLiBIb3dldmVyLAorICAgICMgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0YXJnZXRzIHRoYXQgZGVwZW5kIG9uIHRoaXMgc3RpbGwgbmVlZCBhIGRlcGVuZGVuY3kKKyAgICAjIG9uIGxvZ2dpbmcgc29tZXdoZXJlIG9yIGVsc2UgdGhleSB3b24ndCBsaW5rLgorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nX2ludGVyZmFjZS5jYycsCisgICAgICBdLAorICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsnT1M9PSJsaW51eCInLCB7CisgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbG9nZ2luZy9saW51eF9pbnRlcmZhY2UuY2MnLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDpjb21wbGV4X3RocmVhZF9sb2NhbCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpkaWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9saWJjL2xpYmMuZ3lwOmFvc19zdHJlcnJvcicsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2xpYmMvbGliYy5neXA6YW9zX3N0cmVycm9yJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbG9nZ2luZycsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nX2ltcGwuY2MnLAorICAgICAgXSwKKyAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICBbJ09TPT0ibGludXgiJywgeworICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xvZ2dpbmcvbGludXhfbG9nZ2luZy5jYycsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2lwY19saWIvaXBjX2xpYi5neXA6cXVldWUnLAorICAgICAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2lwY19saWIvaXBjX2xpYi5neXA6cXVldWUnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6b25jZScsCisgICAgICAgICdsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVfdHlwZXMnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnbG9nZ2luZ19pbnRlcmZhY2UnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL2Fvcy5neXBpIGIvYW9zL2J1aWxkL2Fvcy5neXBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZGRkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvYW9zLmd5cGkKQEAgLTAsMCArMSwzMTAgQEAKKyMgVGhpcyBmaWxlIGdldHMgcGFzc2VkIHRvIGd5cCB3aXRoIC1JIHNvIHRoYXQgaXQgZ2V0cyBpbmNsdWRlZCBldmVyeXdoZXJlLgoreworICAndmFyaWFibGVzJzogeworICAgICdBT1MnOiAnPChERVBUSCkvYW9zJywKKyMgQSBkaXJlY3Rvcnkgd2l0aCBldmVyeXRoaW5nIGluIGl0IGlnbm9yZWQgZnJvbSBzb3VyY2UgY29udHJvbC4KKyAgICAnVE1QRElSJzogJzwoREVQVEgpL2Fvcy9idWlsZC90ZW1wJywKKyAgICAnYW9zX2Ficyc6ICc8IShyZWFkbGluayAtZiA8KERFUFRIKS9hb3MpJywgIyBmb3IgdXNlIGluIG5vbi1wYXRoIGNvbnRleHRzCisjIFRoZSAuZ3lwIGZpbGUgdGhhdCBoYXMgdGFyZ2V0cyBmb3IgdGhlIHZhcmlvdXMgZXh0ZXJuYWwgbGlicmFyaWVzLgorICAgICdFWFRFUk5BTFMnOiAnPChBT1MpL2J1aWxkL2V4dGVybmFscy5neXAnLAorIyBUaGUgZGlyZWN0b3J5IHRoYXQgZ2V0cyByc3luY2VkIHRvIHRoZSB0YXJnZXQuCisgICAgJ3JzeW5jX2Rpcic6ICc8KFBST0RVQ1RfRElSKS9vdXRwdXRzJywKKyMgVGhlIGRpcmVjdG9yeSBmb3IgZXhlY3V0YWJsZXMgdGhhdCBkb24ndCBnZXQgcnN5bmNlZCB0byB0aGUgdGFyZ2V0LgorICAgICdvdGhlcl9vdXRwdXRzX2Rpcic6ICc8KFBST0RVQ1RfRElSKS9vdGhlcl9vdXRwdXRzJywKKyMgVGhlIGRpcmVjdG9yeSB0aGF0IGV4ZWN1dGFibGVzIHRoYXQgZGVwZW5kIG9uIDwoRVhURVJOQUxTKTpndGVzdCBnZXQgcHV0IGludG8uCisgICAgJ3Rlc3RfZGlyJzogJzwoUFJPRFVDVF9ESVIpL3Rlc3RzJywKKworIyBTdHVjayBpbnRvIGEgdmFyaWFibGUgKHdpdGggYSBzcGFjZSBvbiB0aGUgZW5kKSB0byBtYWtlIGRpc2FibGluZyBpdCBlYXN5LgorICAgICdjY2FjaGUnOiAnPCEod2hpY2ggY2NhY2hlKSAnLAorCisgICAgJ2Rpc2FibGVfc2FuaXRpemVycyc6IFsKKyAgICAgICMgQmFkIGFsaWdubWVudCBpcyBqdXN0IHNsb3cgb24geDg2IGFuZCB0cmFwcyBvbiBBUk0sIHNvIHdlJ2xsIGZpbmQKKyAgICAgICMgaXQgb3RoZXIgd2F5cywgYW5kIHNvbWUgeDg2IGNvZGUgZG9lcyBpdCBvbiBwdXJwb3NlLgorICAgICAgJ2FsaWdubWVudCcsCisgICAgXSwKKyAgfSwKKyAgJ2NvbmRpdGlvbnMnOiBbCisgICAgWydQTEFURk9STT09ImxpbnV4LWFybV9mcmMtZ2NjIicsIHsKKyAgICAgICAgJ21ha2VfZ2xvYmFsX3NldHRpbmdzJzogWworICAgICAgICAgIFsnQ0MnLCAnPChjY2FjaGUpPCEod2hpY2ggYXJtLWZyYy1saW51eC1nbnVlYWJpLWdjYy00LjkpJ10sCisgICAgICAgICAgWydDWFgnLCAnPChjY2FjaGUpPCEod2hpY2ggYXJtLWZyYy1saW51eC1nbnVlYWJpLWcrKy00LjkpJ10sCisgICAgICAgICAgWydMSU5LX3dyYXBwZXInLCAnPCEocmVhbHBhdGggLXMgPChBT1MpL2J1aWxkL3N0cmlwX2RlYnVnbGluaykgPCEod2hpY2ggYXJtLWZyYy1saW51eC1nbnVlYWJpLW9iamNvcHkpJ10sCisgICAgICAgIF0sCisgICAgICB9LAorICAgIF0sIFsnUExBVEZPUk09PSJsaW51eC1hcm1fZnJjLWNsYW5nIicsIHsKKyAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgICAnYXJtLWNsYW5nLXN5bWxpbmtzJzogJzwhKHJlYWxwYXRoIC1zIDwoQU9TKS9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MpJywKKyAgICAgICAgICAnYXJtLWNsYW5nLXN5c3Jvb3QnOiAnPChhcm0tY2xhbmctc3ltbGlua3MpL3N5c3Jvb3QnLAorIyBGbGFncyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gYWxsIGNvbXBpbGUvbGluay9ldGMgY29tbWFuZHMuCisgICAgICAgICAgJ3BsYXRmbGFncyc6IFsKKyAgICAgICAgICAgICctdGFyZ2V0JywgJ2FybXY3YS1mcmMtbGludXgtZ251ZWFiaScsCisgICAgICAgICAgICAnLW1mbG9hdC1hYmk9c29mdGZwJywKKyAgICAgICAgICAgICctLXN5c3Jvb3Q9PChhcm0tY2xhbmctc3lzcm9vdCknLAorCisgICAgICAgICAgICAjIFRPRE8oYnJpYW5zKTogU2VlIGlmIGl0IHdpbGwgcnVuIHdpdGggdGhpcyBlbmFibGVkLgorICAgICAgICAgICAgIy1taHdkaXY9YXJtLHRodW1iCisgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgJ21ha2VfZ2xvYmFsX3NldHRpbmdzJzogWworICAgICAgICAgIFsnQ0MnLCAnPChjY2FjaGUpPChhcm0tY2xhbmctc3ltbGlua3MpL2Jpbi9jbGFuZyddLAorICAgICAgICAgIFsnQ1hYJywgJzwoY2NhY2hlKTwoYXJtLWNsYW5nLXN5bWxpbmtzKS9iaW4vY2xhbmcrKyddLAorICAgICAgICAgIFsnTElOS193cmFwcGVyJywgJzwhKHJlYWxwYXRoIC1zIDwoQU9TKS9idWlsZC9zdHJpcF9kZWJ1Z2xpbmspIDwhKHdoaWNoIGFybS1mcmMtbGludXgtZ251ZWFiaS1vYmpjb3B5KSddLAorICAgICAgICBdLAorICAgICAgICAndGFyZ2V0X2RlZmF1bHRzJzogeworICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAnPEAocGxhdGZsYWdzKScsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnY2ZsYWdzX2NjJzogWworICAgICAgICAgICAgJy1pc3lzdGVtJywgJzwoYXJtLWNsYW5nLXN5c3Jvb3QpL2luY2x1ZGUvYysrLzQuOS4xJywKKyAgICAgICAgICAgICctaXN5c3RlbScsICc8KGFybS1jbGFuZy1zeXNyb290KS9pbmNsdWRlL2MrKy80LjkuMS9hcm0tZnJjLWxpbnV4LWdudWVhYmknLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2xkZmxhZ3MnOiBbCisgICAgICAgICAgICAnPEAocGxhdGZsYWdzKScsCisgICAgICAgICAgICAnLUwvdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2djYy9hcm0tZnJjLWxpbnV4LWdudWVhYmkvNC45LjEnLAorICAgICAgICAgICAgJy1MPChhcm0tY2xhbmctc3ltbGlua3MpL21vcmVfbGlicycsCisgICAgICAgICAgICAnLUIvdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2djYy9hcm0tZnJjLWxpbnV4LWdudWVhYmkvNC45LjEnLAorICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICB9LAorICAgIF0sIFsnUExBVEZPUk09PSJsaW51eC1hbWQ2NC1jbGFuZyInLCB7CisgICAgICAgICdtYWtlX2dsb2JhbF9zZXR0aW5ncyc6IFsKKyAgICAgICAgICBbJ0NDJywgJzwoY2NhY2hlKTwhKHdoaWNoIGNsYW5nKSddLAorICAgICAgICAgIFsnQ1hYJywgJzwoY2NhY2hlKTwhKHdoaWNoIGNsYW5nKyspJ10sCisgICAgICAgIF0sCisgICAgICB9LAorICAgIF0sIFsnUExBVEZPUk09PSJsaW51eC1hbWQ2NC1nY2NfNC44IicsIHsKKyAgICAgICAgJ21ha2VfZ2xvYmFsX3NldHRpbmdzJzogWworICAgICAgICAgIFsnQ0MnLCAnPChjY2FjaGUpL29wdC9jbGFuZy0zLjUvYmluL2djYyddLAorICAgICAgICAgIFsnQ1hYJywgJzwoY2NhY2hlKS9vcHQvY2xhbmctMy41L2Jpbi9nKysnXSwKKyAgICAgICAgXSwKKyAgICAgIH0sCisgICAgXSwgWydTQU5JVElaRVIhPSJub25lIicsIHsKKyAgICAgICAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKKyAgICAgICAgICAnY2ZsYWdzJzogWworICAgICAgICAgICAgJy1mc2FuaXRpemU9PChTQU5JVElaRVIpJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdsZGZsYWdzJzogWworICAgICAgICAgICAgJy1mc2FuaXRpemU9PChTQU5JVElaRVIpJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdkZWZpbmVzJzogWworIyBHQ0MgZG9lc24ndCBoYXZlIF9faGFzX2ZlYXR1cmUsIHNvIHdlIGhhdmUgdG8gdXNlIHRoaXMgaW5zdGVhZC4KKyAgICAgICAgICAgICdBT1NfU0FOSVRJWkVSXzwoU0FOSVRJWkVSKScsCisgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgIH0sCisgICAgXSwgWydTQU5JVElaRVIhPSJub25lIiBhbmQgQ09NUElMRVIhPSJnY2MiJywgeworICAgICAgICAndGFyZ2V0X2RlZmF1bHRzJzogeworICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAnLWZuby1zYW5pdGl6ZS1yZWNvdmVyJywKKyAgICAgICAgICAgICctZm5vLXNhbml0aXplPTwhKGVjaG8gPChkaXNhYmxlX3Nhbml0aXplcnMpIHwgc2VkICJzLyAvLC9nIiknLAorICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICB9LAorICAgIF0sIFsnU0FOSVRJWkVSIT0idGhyZWFkIicsIHsKKyAgICAgICAgJ2xpYnJhcmllcyc6IFsKKyAgICAgICAgICAnPCEocmVhZGxpbmsgLWYgPChBT1MpLy4uL291dHB1dC9jb21waWxlZC08KEFSQ0hJVEVDVFVSRSk8KEVYVEVSTkFMU19FWFRSQSkvZ3BlcmZ0b29scy0yLjMtcHJlZml4L2xpYi9saWJ0Y21hbGxvYy5hKScsCisgICAgICAgICAgJzwhKHJlYWRsaW5rIC1mIDwoQU9TKS8uLi9vdXRwdXQvY29tcGlsZWQtPChBUkNISVRFQ1RVUkUpPChFWFRFUk5BTFNfRVhUUkEpL2xpYnVud2luZC0xLjEtcHJlZml4L2xpYi9saWJ1bndpbmQuYSknLAorICAgICAgICBdLAorICAgICAgICAnZGVmaW5lcyc6IFsKKyAgICAgICAgICAnVENNQUxMT0MnLAorICAgICAgICBdLAorICAgICAgfSwKKyAgICBdLCBbJ0VYVEVSTkFMU19FWFRSQT09Ii1mUElFIicsIHsKKyAgICAgICAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKKyAgICAgICAgICAnY2ZsYWdzJzogWworICAgICAgICAgICAgJy1mUElFJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdsZGZsYWdzJzogWworICAgICAgICAgICAgJy1mUElFJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdsaW5rX3NldHRpbmdzJzogeworICAgICAgICAgICAgJ2xkZmxhZ3MnOiBbCisgICAgICAgICAgICAgICctcGllJywKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgIH0sCisgICAgXSwgWydTQU5JVElaRVI9PSJtZW1vcnkiJywgeworICAgICAgICAndGFyZ2V0X2RlZmF1bHRzJzogeworICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAnLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucycsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnbGRmbGFncyc6IFsKKyAgICAgICAgICAgICctZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zJywKKyAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgfSwKKyAgICBdLAorICBdLAorICAndGFyZ2V0X2RlZmF1bHRzJzogeworICAgICdkZWZpbmVzJzogWworICAgICAgJ19fU1REQ19GT1JNQVRfTUFDUk9TJywKKyAgICAgICdfX1NURENfQ09OU1RBTlRfTUFDUk9TJywKKyAgICAgICdfX1NURENfTElNSVRfTUFDUk9TJywKKyAgICAgICdBT1NfQ09NUElMRVJfPCEoZWNobyA8KEZVTExfQ09NUElMRVIpIHwgc2VkIFwncy9cLi9fL2dcJyknLAorICAgICAgJ0FPU19BUkNISVRFQ1RVUkVfPChBUkNISVRFQ1RVUkUpJywKKyAgICAgICdfRklMRV9PRkZTRVRfQklUUz02NCcsCisgICAgXSwKKyAgICAnbGRmbGFncyc6IFsKKyAgICAgICctcGlwZScsCisgICAgICAnLXB0aHJlYWQnLAorICAgIF0sCisgICAgJ2xpYnJhcmllcyc6IFsKKyAgICAgICctbG0nLAorICAgICAgJy1scnQnLAorICAgIF0sCisgICAgJ2NmbGFncyc6IFsKKyAgICAgICctcGlwZScsCisKKyAgICAgICctcHRocmVhZCcsCisKKyAgICAgICctV2FsbCcsCisgICAgICAnLVdleHRyYScsCisgICAgICAnLVdzd2l0Y2gtZW51bScsCisgICAgICAnLVdwb2ludGVyLWFyaXRoJywKKyAgICAgICctV3N0cmljdC1hbGlhc2luZz0yJywKKyAgICAgICctV2Nhc3QtcXVhbCcsCisgICAgICAnLVdjYXN0LWFsaWduJywKKyAgICAgICctV3dyaXRlLXN0cmluZ3MnLAorICAgICAgJy1XdHlwZS1saW1pdHMnLAorICAgICAgJy1Xc2lnbi1jb21wYXJlJywKKyAgICAgICctV2Zvcm1hdD0yJywKKyAgICAgICctV2Vycm9yJywKKworICAgICAgJy1nZ2RiMycsCisgICAgICAjIEdlbmVyYXRlIGRlYnVnZ2luZyBpbmZvIHRoYXQgZ2RiIDcuNC4xIGNhbiB1bmRlcnN0YW5kIChXaGVlenkpLgorICAgICAgIyBUT0RPKEJyaWFuKTogUmVtb3ZlIHRoaXMgb25jZSB3ZSB1cGdyYWRlIHRvIEplc3NpZS4KKyAgICAgICctZ2R3YXJmLTMnLAorICAgIF0sCisgICAgJ2NmbGFnc19jJzogWworICAgICAgJy1zdGQ9Z251OTknLAorICAgIF0sCisgICAgJ2NmbGFnc19jYyc6IFsKKyAgICAgICctc3RkPWdudSsrMTEnLAorICAgIF0sCisgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICc8KERFUFRIKScsCisgICAgXSwKKyAgICAjIFRoZXNlIGhhdmUgdG8gYmUgaGVyZSBiZWNhdXNlIGFwcGFyZW50bHkgZ3lwIGV2YWx1YXRlcyB0YXJnZXRfY29uZGl0aW9ucworICAgICMgZXZlbiBpZiB0aGUgdGFyZ2V0IGlzIG5ldmVyIHVzZWQuCisgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICMgU2V0IHRoaXMgdG8gMSB0byBkaXNhYmxlIHJzeW5jaW5nIHRoZSBmaWxlIHRvIHRoZSB0YXJnZXQuCisgICAgICAnbm9fcnN5bmMlJzogMCwKKyAgICAgICMgU2V0IHRoaXMgdG8gMSBpZiB0aGlzIGZpbGUgaXMgYSB0ZXN0IHRoYXQgc2hvdWxkIG5vdCBiZSBydW4gYnkKKyAgICAgICMgYGJ1aWxkLnB5IHRlc3RzYC4KKyAgICAgICdpc19zcGVjaWFsX3Rlc3QlJzogMCwKKyAgICB9LAorICAgICdjb25kaXRpb25zJzogWworICAgICAgWydERUJVRz09InllcyInLCB7CisgICAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgICAnQU9TX0RFQlVHPTEnLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgICAgICBbJ0NPTVBJTEVSIT0iY2xhbmciJywgeworICAgICAgICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAgICAgICAnLU9nJywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgXSwgWydDT01QSUxFUj09ImNsYW5nIiBhbmQgU0FOSVRJWkVSPT0ibm9uZSInLCB7CisgICAgICAgICAgICAgICAgJ2NmbGFncyc6IFsKKyAgICAgICAgICAgICAgICAgICctTzAnLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBdLCBbJ0NPTVBJTEVSPT0iY2xhbmciIGFuZCBTQU5JVElaRVIhPSJub25lIicsIHsKKyAgICAgICAgICAgICAgICAnY2ZsYWdzJzogWworICAgICAgICAgICAgICAgICAgJy1PMScsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXQorICAgICAgICAgIF0sCisgICAgICAgICAgJ2NmbGFncyc6IFsKKyAgICAgICAgICAgICctZm5vLW9taXQtZnJhbWUtcG9pbnRlcicsCisgICAgICAgICAgXSwKKyAgICAgICAgfSwgeyAjICdERUJVRz09Im5vIicKKyAgICAgICAgICAnZGVmaW5lcyc6IFsKKyAgICAgICAgICAgICdBT1NfREVCVUc9MCcsCisgICAgICAgICAgICAnX0ZPUlRJRllfU09VUkNFPTInLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgICAgICAjIFRPRE8oQnJpYW4pOiBSZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2Ugb25jZSB3ZSBnZXQgYSBuZXcgZW5vdWdoCisgICAgICAgICAgICAjIEdDQyBoZXJlIHRoYXQgaXQgc3VwcG9ydHMgLU96LgorICAgICAgICAgICAgWydDT01QSUxFUj09ImdjYyIgYW5kIEFSQ0hJVEVDVFVSRT09ImFybV9mcmMiJywgeworICAgICAgICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAgICAgICAnLU9zJywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICdsZGZsYWdzJzogWworICAgICAgICAgICAgICAgICAgJy1PcycsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAgICAgICAnLU96JywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICdsZGZsYWdzJzogWworICAgICAgICAgICAgICAgICAgJy1PeicsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwgWydBUkNISVRFQ1RVUkU9PSJhbWQ2NCInLCB7CisgICAgICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAgICAgJy1mc3RhY2stcHJvdGVjdG9yLWFsbCcsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICBdLAorICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAnLWZvbWl0LWZyYW1lLXBvaW50ZXInLAorICAgICAgICAgIF0sCisgICAgICAgIH0KKyAgICAgIF0sIFsnT1M9PSJsaW51eCIgYW5kIEFSQ0hJVEVDVFVSRT09ImFybSIgYW5kIENPTVBJTEVSPT0iZ2NjIiBhbmQgREVCVUc9PSJ5ZXMiJywgeworICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAgICMgR0NDIGRvZXNuJ3QgbGlrZSBsZXR0aW5nIHVzIHVzZSByNyAod2hpY2ggaXMgYWxzbyB0aGUgZnJhbWUKKyAgICAgICAgICAgICAgIyBwb2ludGVyKSB0byBwYXNzIHRoZSBzeXNjYWxsIG51bWJlciB0byB0aGUga2VybmVsIGV2ZW4gd2hlbgorICAgICAgICAgICAgICAjIGl0J3MgbWFya2VkIGFzIGNsb2JiZXJlZC4KKyAgICAgICAgICAgICAgIyBTZWUgPGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTYzMzQzNj4gZm9yCisgICAgICAgICAgICAgICMgc29tZSBtb3JlIGRpc2N1c3Npb24uCisgICAgICAgICAgICAnLWZvbWl0LWZyYW1lLXBvaW50ZXInLAorICAgICAgICAgIF0sCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICBbJ0FSQ0hJVEVDVFVSRT09ImFybSInLCB7CisgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgJy1tY3B1PWNvcnRleC1hOScsCisgICAgICAgICAgJy1tZnB1PW5lb24nLAorICAgICAgICAgICctbWZsb2F0LWFiaT1zb2Z0ZnAnLAorICAgICAgICBdLAorICAgICAgICAnbGRmbGFncyc6IFsKKyAgICAgICAgICAnLW1jcHU9Y29ydGV4LWE5JywKKyAgICAgICAgICAnLW1mcHU9bmVvbicsCisgICAgICAgICAgJy1tZmxvYXQtYWJpPXNvZnRmcCcsCisgICAgICAgIF0sCisgICAgICB9XSwKKyAgICAgIFsnQ09NUElMRVI9PSJnY2MiJywgeworICAgICAgICAnY2ZsYWdzJzogWworICAgICAgICAgICctV3VudXNlZC1sb2NhbC10eXBlZGVmcycsCisgICAgICAgIF0sCisgICAgICAgICdkZWZpbmVzJzogWworICAgICAgICAgICdfX2hhc19mZWF0dXJlKG4pPTAnCisgICAgICAgIF0sCisgICAgICB9XSwgWydDT01QSUxFUj09ImNsYW5nIicsIHsKKyAgICAgICAgJ2NmbGFncyc6IFsKKyAgICAgICAgICAnLWZjb2xvci1kaWFnbm9zdGljcycsCisgICAgICAgICAgJy1mbWVzc2FnZS1sZW5ndGg9ODAnLAorICAgICAgICAgICctZm1hY3JvLWJhY2t0cmFjZS1saW1pdD0wJywKKyAgICAgICAgXSwKKyAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgIyBUaGlzIHRlbGxzIGNsYW5nJ3Mgb3B0aW1pemVyIHRoZSBzYW1lIHRoaW5nLgorICAgICAgICAgICdfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQocCwgYSk9KHsgY29uc3QgdHlwZW9mKHApIG15X3BfID0gKHApOyAoKCgodWludHB0cl90KW15X3BfICUgKGEpKSA9PSAwdSkgPyBteV9wXyA6IChfX2J1aWx0aW5fdW5yZWFjaGFibGUoKSwgKG15X3BfKSkpOyB9KScsCisgICAgICAgIF0sCisgICAgICB9XSwKKyAgICBdLAorICAgICd0YXJnZXRfY29uZGl0aW9ucyc6IFsKKyMgRGVmYXVsdCB0byBwdXR0aW5nIG91dHB1dHMgaW50byByc3luY19kaXIuCisgICAgICBbJ25vX3JzeW5jPT0wIGFuZCBfdHlwZSE9InN0YXRpY19saWJyYXJ5IicsIHsKKyAgICAgICAgICAncHJvZHVjdF9kaXInOiAnPChyc3luY19kaXIpJywKKyAgICAgICAgfSwKKyAgICAgIF0sIFsnbm9fcnN5bmM9PTEgYW5kIF90eXBlIT0ic3RhdGljX2xpYnJhcnkiJywgeworICAgICAgICAncHJvZHVjdF9kaXInOiAnPChvdGhlcl9vdXRwdXRzX2RpciknLAorICAgICAgICB9LAorICAgICAgXSwKKyAgICBdLAorICB9LAorfQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL2Fvc19hbGwuZ3lwIGIvYW9zL2J1aWxkL2Fvc19hbGwuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTk5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvYW9zX2FsbC5neXAKQEAgLTAsMCArMSw1NCBAQAorIyBUaGlzIGZpbGUgaGFzIHRoZSBleGVjdXRhYmxlcyBldGMgdGhhdCBBT1MgYnVpbGRzLgorIyBVc2VyIC5neXAgZmlsZXMgZm9yIHRoZSBwcmltZSBzaG91bGQgZGVwZW5kIG9uIDpQcmltZS4KK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ1ByaW1lJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ25vX3JzeW5jJzogMSwKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnQ29tbW9uJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmNvcmUnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbG9nZ2luZy9sb2dnaW5nLmd5cDpiaW5hcnlfbG9nX3dyaXRlcicsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9sb2dnaW5nL2xvZ2dpbmcuZ3lwOmxvZ19zdHJlYW1lcicsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9sb2dnaW5nL2xvZ2dpbmcuZ3lwOmxvZ19kaXNwbGF5ZXInLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cDpyYXdfcXVldWVfdGVzdCcsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwOmlwY19zdHJlc3NfdGVzdCcsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9zdGFydGVyL3N0YXJ0ZXIuZ3lwOnN0YXJ0ZXJfZXhlJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmNvbXBsZXhfdGhyZWFkX2xvY2FsX3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnN0bF9tdXRleF90ZXN0JywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmR1bXBfcnRwcmlvJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fdGVzdCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ0NvbW1vbicsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdub19yc3luYyc6IDEsCisgICAgICB9LAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0eXBlX3RyYWl0c190ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lX3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOm11dGV4X3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOmNvbmRpdGlvbl90ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpvbmNlX3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOmV2ZW50X3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlX3Rlc3R1dGlsc190ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cDpsb2dnaW5nX2ltcGxfdGVzdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6b3B0aW9uc190ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpkaWVfdGVzdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVfdHlwZXNfdGVzdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dHJhcGV6b2lkX3Byb2ZpbGVfdGVzdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6d3JhcHBpbmdfY291bnRlcl90ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbGliYy9saWJjLmd5cDpkaXJuYW1lX3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9saWJjL2xpYmMuZ3lwOmFvc19zdHJlcnJvcl90ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbGliYy9saWJjLmd5cDphb3Nfc3Ryc2lnbmFsX3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnJ1bl9jb21tYW5kX3Rlc3QnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL2FybS1jbGFuZy1zeW1saW5rcy9SRUFETUUgYi9hb3MvYnVpbGQvYXJtLWNsYW5nLXN5bWxpbmtzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTIxMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL2FybS1jbGFuZy1zeW1saW5rcy9SRUFETUUKQEAgLTAsMCArMSwxMSBAQAorVGhpcyBkaXJlY3RvcnkgaGFzIHN5bWxpbmtzIHRvIHZhcmlvdXMgb3RoZXIgZmlsZXMgdG8gaGVscCBjbGFuZyBmaWd1cmUgb3V0IGhvdwordG8gY3Jvc3MgY29tcGlsZSBmb3IgYXJtIHdpdGggRklSU1QncyB0b29sY2hhaW4gc2V0dXAuCisKK3N5c3Jvb3QvIGhhcyBzeW1saW5rcyB0byB2YXJpb3VzIHBsYWNlcyBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIHN5c3Jvb3Qgd2hlbgorICBjb21waWxpbmcuCitiaW4vIGhhcyBzeW1saW5rcyB0byB0aGUgdmFyaW91cyB0b29scyBzbyBjbGFuZyBjYW4gZmluZCB0aGUgbmF0aXZlIHRvb2xjaGFpbi4KK21vcmVfbGlicy8gaGFzIG1vZGlmaWVkIGZpbGVzIG9mIHNldmVyYWwgcHN1ZWRvLXNoYXJlZC1vYmplY3RzIHdoaWNoIGFyZQorICBhY3R1YWxseSBsaW5rZXIgc2NyaXB0cyBhcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBGSVJTVCB0b29sY2hhaW4uIEZvciBzb21lCisgIHJlYXNvbiwgSSBjYW4ndCBnZXQgdGhlIGxpbmtlciB0byBmb2xsb3cgdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3Igb2YKKyAgcHJlZml4aW5nIHRoZSBhYnNvbHV0ZSBwYXRocyBjb250YWluZWQgaW4gdGhlbSB3aXRoIHRoZSBzeXNyb290LCBzbyB3ZSBoYXZlCisgIGNvcGllcyB3aGljaCBkb24ndCBoYXZlIGFueSBwYXRocy4KZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvYmluL2FzIGIvYW9zL2J1aWxkL2FybS1jbGFuZy1zeW1saW5rcy9iaW4vYXMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjViZDRmOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvYmluL2FzCkBAIC0wLDAgKzEgQEAKKy91c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1hcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvYmluL2NsYW5nIGIvYW9zL2J1aWxkL2FybS1jbGFuZy1zeW1saW5rcy9iaW4vY2xhbmcKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzQ1NjI1MAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvYmluL2NsYW5nCkBAIC0wLDAgKzEgQEAKKy91c3IvYmluL2NsYW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL2FybS1jbGFuZy1zeW1saW5rcy9iaW4vY2xhbmcrKyBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvYmluL2NsYW5nKysKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjkzMjI2NQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvYmluL2NsYW5nKysKQEAgLTAsMCArMSBAQAorL3Vzci9iaW4vY2xhbmcrKwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvYmluL2xkIGIvYW9zL2J1aWxkL2FybS1jbGFuZy1zeW1saW5rcy9iaW4vbGQKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTEyZDFlZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvYmluL2xkCkBAIC0wLDAgKzEgQEAKKy91c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1sZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvbW9yZV9saWJzL2xpYmMuc28gYi9hb3MvYnVpbGQvYXJtLWNsYW5nLXN5bWxpbmtzL21vcmVfbGlicy9saWJjLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGJjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvYXJtLWNsYW5nLXN5bWxpbmtzL21vcmVfbGlicy9saWJjLnNvCkBAIC0wLDAgKzEsNSBAQAorLyogR05VIGxkIHNjcmlwdAorICAgVXNlIHRoZSBzaGFyZWQgbGlicmFyeSwgYnV0IHNvbWUgZnVuY3Rpb25zIGFyZSBvbmx5IGluCisgICB0aGUgc3RhdGljIGxpYnJhcnksIHNvIHRyeSB0aGF0IHNlY29uZGFyaWx5LiAgKi8KK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJjLnNvLjYgbGliY19ub25zaGFyZWQuYSAgQVNfTkVFREVEICggbGQtbGludXguc28uMyApICkKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3MvbW9yZV9saWJzL2xpYnB0aHJlYWQuc28gYi9hb3MvYnVpbGQvYXJtLWNsYW5nLXN5bWxpbmtzL21vcmVfbGlicy9saWJwdGhyZWFkLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjAzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvYXJtLWNsYW5nLXN5bWxpbmtzL21vcmVfbGlicy9saWJwdGhyZWFkLnNvCkBAIC0wLDAgKzEsNSBAQAorLyogR05VIGxkIHNjcmlwdAorICAgVXNlIHRoZSBzaGFyZWQgbGlicmFyeSwgYnV0IHNvbWUgZnVuY3Rpb25zIGFyZSBvbmx5IGluCisgICB0aGUgc3RhdGljIGxpYnJhcnksIHNvIHRyeSB0aGF0IHNlY29uZGFyaWx5LiAgKi8KK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJwdGhyZWFkLnNvLjAgbGlicHRocmVhZF9ub25zaGFyZWQuYSApCmRpZmYgLS1naXQgYS9hb3MvYnVpbGQvYXJtLWNsYW5nLXN5bWxpbmtzL3N5c3Jvb3QvaW5jbHVkZSBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3Mvc3lzcm9vdC9pbmNsdWRlCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY0ODc4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvYXJtLWNsYW5nLXN5bWxpbmtzL3N5c3Jvb3QvaW5jbHVkZQpAQCAtMCwwICsxIEBACisvdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS9pbmNsdWRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL2FybS1jbGFuZy1zeW1saW5rcy9zeXNyb290L2xpYiBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3Mvc3lzcm9vdC9saWIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWEwMWYzMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3Mvc3lzcm9vdC9saWIKQEAgLTAsMCArMSBAQAorL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkvbGliClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL2FybS1jbGFuZy1zeW1saW5rcy9zeXNyb290L3VzciBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3Mvc3lzcm9vdC91c3IKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWQ0ZmZkNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9hcm0tY2xhbmctc3ltbGlua3Mvc3lzcm9vdC91c3IKQEAgLTAsMCArMSBAQAorL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkvdXNyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL2Jpbi1sZC5nb2xkL2xkIGIvYW9zL2J1aWxkL2Jpbi1sZC5nb2xkL2xkCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFmODU5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvYmluLWxkLmdvbGQvbGQKQEAgLTAsMCArMSBAQAorL3Vzci9iaW4vbGQuZ29sZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9idWlsZC5weSBiL2Fvcy9idWlsZC9idWlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTNkZWRiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL2J1aWxkLnB5CkBAIC0wLDAgKzEsMTAxMCBAQAorIyEvdXNyL2Jpbi9weXRob24zCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgcmUKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBlcnJubworaW1wb3J0IHF1ZXVlCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgcHR5CitpbXBvcnQgc2lnbmFsCisKK2NsYXNzIFRlc3RUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CisgICIiIlJ1bnMgMSB0ZXN0IGFuZCBrZWVwcyB0cmFjayBvZiBpdHMgY3VycmVudCBzdGF0ZS4KKworICBBIFRlc3RUaHJlYWQgaXMgZWl0aGVyIHdhaXRpbmcgdG8gc3RhcnQgdGhlIHRlc3QsIGFjdHVhbGx5IHJ1bm5pbmcgaXQsIGRvbmUsCisgIHJ1bm5pbmcgaXQsIG9yIHN0b3BwZWQuIFRoZSBmaXJzdCAzIGFsd2F5cyBoYXBwZW4gaW4gdGhhdCBvcmRlciBhbmQgY2FuCisgIGNoYW5nZSB0byBzdG9wcGVkIGF0IGFueSB0aW1lLgorCisgIEl0IHdpbGwgZmluaXNoIChpZSBqb2luKCkgd2lsbCByZXR1cm4pIG9uY2UgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCwgYXQgd2hpY2gKKyAgcG9pbnQgYWNjZXNzaW5nIHByb2Nlc3MgdG8gc2VlIHRoZSBzdGF0dXMgaXMgT0suCisKKyAgQXR0cmlidXRlczoKKyAgICBleGVjdXRhYmxlOiBUaGUgZmlsZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlIHRvIHJ1bi4KKyAgICBhcmdzOiBBIHR1cGxlIG9mIGFyZ3VtZW50cyB0byBnaXZlIHRoZSBleGVjdXRhYmxlLgorICAgIGVudjogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQuCisgICAgZG9uZV9xdWV1ZTogQSBxdWV1ZS5RdWV1ZSB0byBwbGFjZSBzZWxmIG9uIG9uY2UgZG9uZSBydW5uaW5nIHRoZSB0ZXN0LgorICAgIHN0YXJ0X3NlbWFwaG9yZTogQSB0aHJlYWRpbmcuU2VtYXBob3JlIHRvIHdhaXQgb24gYmVmb3JlIHN0YXJ0aW5nLgorICAgIHByb2Nlc3NfbG9jazogQSBsb2NrIGFyb3VuZCBwcm9jZXNzLgorICAgIHByb2Nlc3M6IFRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRlc3QgcHJvY2VzcyBvciBOb25lLiBTeW5jaHJvbml6ZWQgYnkKKyAgICAgICAgcHJvY2Vzc19sb2NrLgorICAgIHN0b3BwZWQ6IFRydWUgaWYgd2UncmUgc3RvcHBlZC4KKyAgICBvdXRwdXQ6IEEgcXVldWUgb2YgbGluZXMgb2Ygb3V0cHV0IGZyb20gdGhlIHRlc3QuCisgICIiIgorCisgIGNsYXNzIE91dHB1dENvcGllcih0aHJlYWRpbmcuVGhyZWFkKToKKyAgICAiIiJDb3BpZXMgdGhlIG91dHB1dCBvZiBhIHRlc3QgZnJvbSBpdHMgb3V0cHV0IHB0eSBpbnRvIGEgcXVldWUuCisKKyAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSBldmVyeXRoaW5nIGxvY2tzIHVwIGlmIHRoZSB0ZXN0IHdyaXRlcworICAgIHRvbyBtdWNoIG91dHB1dCBhbmQgZmlsbHMgdXAgdGhlIHB0eSdzIGJ1ZmZlci4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmZCwgcXVldWUpOgorICAgICAgc3VwZXIoVGVzdFRocmVhZC5PdXRwdXRDb3BpZXIsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgIG5hbWU9KG5hbWUgKyAnLk91dHB1dENvcGllcicpKQorCisgICAgICBzZWxmLmZkID0gZmQKKyAgICAgIHNlbGYucXVldWUgPSBxdWV1ZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgIHdpdGggb3MuZmRvcGVuKHNlbGYuZmQpIGFzIHRvX3JlYWQ6CisgICAgICAgIHRyeToKKyAgICAgICAgICBmb3IgbGluZSBpbiB0b19yZWFkOgorICAgICAgICAgICAgc2VsZi5xdWV1ZS5wdXQobGluZSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyMgQW4gRUlPIGZyb20gdGhlIG1hc3RlciBzaWRlIG9mIHRoZSBwdHkgbWVhbnMgd2UgaGl0IHRoZSBlbmQuCisgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FSU86CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBleGVjdXRhYmxlLCBhcmdzLCBlbnYsIGRvbmVfcXVldWUsIHN0YXJ0X3NlbWFwaG9yZSk6CisgICAgc3VwZXIoVGVzdFRocmVhZCwgc2VsZikuX19pbml0X18oCisgICAgICAgIG5hbWU9b3MucGF0aC5zcGxpdChleGVjdXRhYmxlKVstMV0pCisKKyAgICBzZWxmLmV4ZWN1dGFibGUgPSBleGVjdXRhYmxlCisgICAgc2VsZi5hcmdzID0gYXJncworICAgIHNlbGYuZW52ID0gZW52CisgICAgc2VsZi5kb25lX3F1ZXVlID0gZG9uZV9xdWV1ZQorICAgIHNlbGYuc3RhcnRfc2VtYXBob3JlID0gc3RhcnRfc2VtYXBob3JlCisKKyAgICBzZWxmLm91dHB1dCA9IHF1ZXVlLlF1ZXVlKCkKKworICAgIHNlbGYucHJvY2Vzc19sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgIHNlbGYucHJvY2VzcyA9IE5vbmUKKyAgICBzZWxmLnN0b3BwZWQgPSBGYWxzZQorICAgIHNlbGYucmV0dXJuY29kZSA9IE5vbmUKKyAgICBzZWxmLm91dHB1dF9jb3BpZXIgPSBOb25lCisKKyAgZGVmIHJ1bihzZWxmKToKKyAgICBkZWYgc2V0dXBfdGVzdF9wcm9jZXNzKCk6CisjIFNob3ZlIGl0IGludG8gaXRzIG93biBwcm9jZXNzIGdyb3VwIHNvIHdlIGNhbiBraWxsIGFueSBzdWJwcm9jZXNzZXMgZWFzaWx5LgorICAgICAgb3Muc2V0cGdpZCgwLCAwKQorCisgICAgd2l0aCBzZWxmLnN0YXJ0X3NlbWFwaG9yZToKKyAgICAgIHdpdGggc2VsZi5wcm9jZXNzX2xvY2s6CisgICAgICAgIGlmIHNlbGYuc3RvcHBlZDoKKyAgICAgICAgICByZXR1cm4KKyAgICAgIHRlc3Rfb3V0cHV0KCdTdGFydGluZyB0ZXN0ICVzLi4uJyAlIHNlbGYubmFtZSkKKyAgICAgIG91dHB1dF90b19yZWFkLCBzdWJwcm9jZXNzX291dHB1dCA9IHB0eS5vcGVucHR5KCkKKyAgICAgIHNlbGYub3V0cHV0X2NvcGllciA9IFRlc3RUaHJlYWQuT3V0cHV0Q29waWVyKHNlbGYubmFtZSwgb3V0cHV0X3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dCkKKyAgICAgIHNlbGYub3V0cHV0X2NvcGllci5zdGFydCgpCisgICAgICB0cnk6CisgICAgICAgIHdpdGggc2VsZi5wcm9jZXNzX2xvY2s6CisgICAgICAgICAgc2VsZi5wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbigoc2VsZi5uYW1lLCkgKyBzZWxmLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlPXNlbGYuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1zZWxmLmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPW9wZW4ob3MuZGV2bnVsbCwgJ3InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49c2V0dXBfdGVzdF9wcm9jZXNzKQorICAgICAgZmluYWxseToKKyAgICAgICAgb3MuY2xvc2Uoc3VicHJvY2Vzc19vdXRwdXQpCisgICAgICBzZWxmLnByb2Nlc3Mud2FpdCgpCisgICAgICB3aXRoIHNlbGYucHJvY2Vzc19sb2NrOgorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBzZWxmLnByb2Nlc3MucmV0dXJuY29kZQorICAgICAgICBzZWxmLnByb2Nlc3MgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLnN0b3BwZWQ6CisgICAgICAgICAgc2VsZi5vdXRwdXRfY29waWVyLmpvaW4oKQorICAgICAgICAgIHNlbGYuZG9uZV9xdWV1ZS5wdXQoc2VsZikKKworICBkZWYga2lsbF9wcm9jZXNzKHNlbGYpOgorICAgICIiIkZvcmNpYmx5IHRlcm1pbmF0ZXMgYW55IHJ1bm5pbmcgcHJvY2Vzcy4iIiIKKyAgICB3aXRoIHNlbGYucHJvY2Vzc19sb2NrOgorICAgICAgaWYgbm90IHNlbGYucHJvY2VzczoKKyAgICAgICAgcmV0dXJuCisgICAgICB0cnk6CisgICAgICAgIG9zLmtpbGxwZyhzZWxmLnByb2Nlc3MucGlkLCBzaWduYWwuU0lHS0lMTCkKKyAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRVNSQ0g6CisgICAgICAgICAgIyBXZSBkb24ndCByZWFsbHkgY2FyZSBpZiBpdCdzIGFscmVhZHkgZ29uZS4KKyAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcmFpc2UgZQorICBkZWYgc3RvcChzZWxmKToKKyAgICAiIiJDaGFuZ2VzIHNlbGYgdG8gdGhlIHN0b3BwZWQgc3RhdGUuIiIiCisgICAgd2l0aCBzZWxmLnByb2Nlc3NfbG9jazoKKyAgICAgIHNlbGYuc3RvcHBlZCA9IFRydWUKKworZGVmIGFvc19wYXRoKCk6CisgICIiIlJldHVybnM6CisgICAgQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhb3MgZGlyZWN0b3J5LgorICAiIiIKKyAgcmV0dXJuIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnLi4nKQorCitkZWYgZ2V0X2lwKCk6CisgICIiIlJldHJpZXZlcyB0aGUgSVAgYWRkcmVzcyB0byBkb3dubG9hZCBjb2RlIHRvLiIiIgorICBGSUxFTkFNRSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGFvc19wYXRoKCksICcuLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ291dHB1dCcsICdpcF9hZGRyZXNzLnR4dCcpKQorICBpZiBub3Qgb3MuYWNjZXNzKEZJTEVOQU1FLCBvcy5SX09LKToKKyAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUoRklMRU5BTUUpLCBleGlzdF9vaz1UcnVlKQorICAgIHdpdGggb3BlbihGSUxFTkFNRSwgJ3cnKSBhcyBmOgorICAgICAgZi53cml0ZSgncm9ib1JJTy05NzEubG9jYWwnKQorICB3aXRoIG9wZW4oRklMRU5BTUUsICdyJykgYXMgZjoKKyAgICByZXR1cm4gZi5yZWFkbGluZSgpLnN0cmlwKCkKKworZGVmIGdldF90ZW1wX2RpcigpOgorICAiIiJSZXRyaWV2ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIHdoZW4gZG93bmxvYWRpbmcuIiIiCisgIHJldHVybiAnL2hvbWUvYWRtaW4vdG1wL2Fvc19kb3dubG9hZGVyJworCitkZWYgZ2V0X3RhcmdldF9kaXIoKToKKyAgIiIiUmV0cmlldmVzIHRoZSB0ZW1wb3J5IGRlcGxveSBkaXJlY3RvcnkgZm9yIGRvd25sb2FkaW5nIGNvZGUuIiIiCisgIHJldHVybiAnL2hvbWUvYWRtaW4vcm9ib3RfY29kZScKKworZGVmIHVzZXJfb3V0cHV0KG1lc3NhZ2UpOgorICAiIiJQcmludHMgbWVzc2FnZSB0byB0aGUgdXNlci4iIiIKKyAgcHJpbnQoJ2J1aWxkLnB5OiAnICsgbWVzc2FnZSwgZmlsZT1zeXMuc3RkZXJyKQorCisjIEEgbG9jayB0byBhdm9pZCBtYWtpbmcgYSBtZXNzIGludGVybWluZ2xpbmcgdGVzdC1yZWxhdGVkIG1lc3NhZ2VzLgordGVzdF9vdXRwdXRfbG9jayA9IHRocmVhZGluZy5STG9jaygpCitkZWYgdGVzdF9vdXRwdXQobWVzc2FnZSk6CisgICIiIlByaW50cyBtZXNzYWdlIHRvIHRoZSB1c2VyLiBJbnRlbmRlZCBmb3IgbWVzc2FnZXMgcmVsYXRlZCB0byB0ZXN0cy4iIiIKKyAgd2l0aCB0ZXN0X291dHB1dF9sb2NrOgorICAgIHByaW50KCd0ZXN0czogJyArIG1lc3NhZ2UsIGZpbGU9c3lzLnN0ZG91dCkKKworZGVmIGNhbGxfZG93bmxvYWRfZXh0ZXJuYWxzKGFyZ3VtZW50KToKKyAgIiIiQ2FsbHMgZG93bmxvYWRfZXh0ZXJuYWxzLnNoIGZvciBhIGdpdmVuIHNldCBvZiBleHRlcm5hbHMuCisKKyAgQXJnczoKKyAgICBhcmd1bWVudDogVGhlIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIHNoZWxsIHNjcmlwdCB0byB0ZWxsIGl0IHdoYXQgdG8KKyAgICAgICAgZG93bmxvYWQuCisgICIiIgorICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCisgICAgICAob3MucGF0aC5qb2luKGFvc19wYXRoKCksICdidWlsZCcsICdkb3dubG9hZF9leHRlcm5hbHMuc2gnKSwKKyAgICAgICBhcmd1bWVudCksCisgICAgICBzdGRpbj1vcGVuKG9zLmRldm51bGwsICdyJykpCisKK2NsYXNzIFByb2Nlc3NvcihvYmplY3QpOgorICAiIiJSZXByZXNlbnRzIGEgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSB3ZSBjYW4gYnVpbGQgZm9yLiIiIgorCisgIGNsYXNzIFVua25vd25QbGF0Zm9ybShFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlKToKKyAgICAgIHN1cGVyKFByb2Nlc3Nvci5Vbmtub3duUGxhdGZvcm0sIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKworICBjbGFzcyBQbGF0Zm9ybShvYmplY3QpOgorICAgICIiIlJlcHJlc2VudHMgYSBzaW5nbGUgd2F5IHRvIGJ1aWxkIHRoZSBjb2RlLiIiIgorCisgICAgZGVmIG91dGRpcihzZWxmKToKKyAgICAgICIiIlJldHVybnM6CisgICAgICAgIFRoZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgYnVpbGQgb3V0cHV0cyBnZXQgcHV0IGluIHRvLgorICAgICAgIiIiCisgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAorICAgICAgICAgIGFvc19wYXRoKCksICcuLicsICdvdXRwdXQnLCBzZWxmLm91dG5hbWUoKSkKKyAgICBkZWYgYnVpbGRfbmluamEoc2VsZik6CisgICAgICAiIiJSZXR1cm5zOgorICAgICAgICBUaGUgcGF0aCBvZiB0aGUgYnVpbGQubmluamEgZmlsZS4KKyAgICAgICIiIgorICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLm91dGRpcigpLCAnYnVpbGQubmluamEnKQorCisgICAgZGVmIGRvX2RlcGxveShzZWxmLCBkcnlfcnVuLCBjb21tYW5kKToKKyAgICAgICIiIkhlbHBlciBmb3Igc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgZGVwbG95LgorCisgICAgICBBcmdzOgorICAgICAgICBkcnlfcnVuOiBJZiBUcnVlLCBwcmludHMgdGhlIGNvbW1hbmQgaW5zdGVhZCBvZiBhY3R1YWxseSBydW5uaW5nIGl0LgorICAgICAgICBjb21tYW5kOiBBIHR1cGxlIG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisgICAgICAiIiIKKyAgICAgIHJlYWxfY29tbWFuZCA9ICgoJ2VjaG8nLCkgKyBjb21tYW5kKSBpZiBkcnlfcnVuIGVsc2UgY29tbWFuZAorICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKHJlYWxfY29tbWFuZCwgc3RkaW49b3Blbihvcy5kZXZudWxsLCAncicpKQorCisgICAgZGVmIGRlcGxveShzZWxmLCBkcnlfcnVuKToKKyAgICAgICIiIkRvd25sb2FkcyB0aGUgY29tcGlsZWQgY29kZSB0byB0aGUgdGFyZ2V0IGNvbXB1dGVyLiIiIgorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignZGVwbG95IHNob3VsZCBiZSBvdmVycmlkZW4nKQorICAgIGRlZiBvdXRuYW1lKHNlbGYpOgorICAgICAgIiIiUmV0dXJuczoKKyAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvLgorICAgICAgIiIiCisgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdvdXRuYW1lIHNob3VsZCBiZSBvdmVycmlkZW4nKQorICAgIGRlZiBvcyhzZWxmKToKKyAgICAgICIiIlJldHVybnM6CisgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoaXMgcGxhdGZvcm0gaXMgZm9yLgorCisgICAgICAgIFRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgT1MgZ3lwIHZhcmlhYmxlLgorICAgICAgIiIiCisgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdvcyBzaG91bGQgYmUgb3ZlcnJpZGVuJykKKyAgICBkZWYgZ3lwX3BsYXRmb3JtKHNlbGYpOgorICAgICAgIiIiUmV0dXJuczoKKyAgICAgICAgVGhlIHBsYXRmb3JtIG5hbWUgdGhlIC5neXAgZmlsZXMga25vdy4KKworICAgICAgICBUaGlzIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIFBMQVRGT1JNIGd5cCB2YXJpYWJsZS4KKyAgICAgICIiIgorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignZ3lwX3BsYXRmb3JtIHNob3VsZCBiZSBvdmVycmlkZW4nKQorICAgIGRlZiBhcmNoaXRlY3R1cmUoc2VsZik6CisgICAgICAiIiJSZXR1cm5zOgorICAgICAgICBUaGUgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSBmb3IgdGhpcyBwbGF0Zm9ybS4KKworICAgICAgICBUaGlzIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIEFSQ0hJVEVDVFVSRSBneXAgdmFyaWFibGUuCisgICAgICAiIiIKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ2FyY2hpdGVjdHVyZSBzaG91bGQgYmUgb3ZlcnJpZGVuJykKKyAgICBkZWYgY29tcGlsZXIoc2VsZik6CisgICAgICAiIiJSZXR1cm5zOgorICAgICAgICBUaGUgY29tcGlsZXIgdXNlZCBmb3IgdGhpcyBwbGF0Zm9ybS4KKworICAgICAgICBFdmVyeXRoaW5nIGJlZm9yZSB0aGUgZmlyc3QgXyB3aWxsIGJlIHVzZWQgYXMgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICBDT01QSUxFUiBneXAgdmFyaWFibGUgYW5kIHRoZSB3aG9sZSB0aGluZyB3aWxsIGJlIHVzZWQgYXMgdGhlIHZhbHVlCisgICAgICAgIG9mIHRoZSBGVUxMX0NPTVBJTEVSIGd5cCB2YXJpYWJsZS4KKyAgICAgICIiIgorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignY29tcGlsZXIgc2hvdWxkIGJlIG92ZXJyaWRlbicpCisgICAgZGVmIHNhbml0aXplcihzZWxmKToKKyAgICAgICIiIlJldHVybnM6CisgICAgICAgIFRoZSBzYW5pdGl6ZXIgdXNlZCBvbiB0aGlzIHBsYXRmb3JtLgorCisgICAgICAgIFRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgU0FOSVRJWkVSIGd5cCB2YXJpYWJsZS4KKworICAgICAgICAibm9uZSIgaWYgdGhlcmUgaXNuJ3Qgb25lLgorICAgICAgIiIiCisgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdzYW5pdGl6ZXIgc2hvdWxkIGJlIG92ZXJyaWRlbicpCisgICAgZGVmIGRlYnVnKHNlbGYpOgorICAgICAgIiIiUmV0dXJuczoKKyAgICAgICAgV2hldGhlciBvciBub3QgdGhpcyBwbGF0Zm9ybSBjb21waWxlcyB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKworICAgICAgICBUaGUgREVCVUcgZ3lwIHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvICJ5ZXMiIG9yICJubyIgYmFzZWQgb24gdGhpcy4KKyAgICAgICIiIgorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignZGVidWcgc2hvdWxkIGJlIG92ZXJyaWRlbicpCisgICAgZGVmIGJ1aWxkX2VudihzZWxmKToKKyAgICAgICIiIlJldHVybnM6CisgICAgICAgIEEgbWFwIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgd2hpbGUgYnVpbGRpbmcgdGhpcyBwbGF0Zm9ybS4KKyAgICAgICIiIgorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignYnVpbGRfZW52IHNob3VsZCBiZSBvdmVycmlkZW4nKQorICAgIGRlZiBwcmlvcml0eShzZWxmKToKKyAgICAgICIiIlJldHVybnM6CisgICAgICAgIEEgcmVsYXRpdmUgcHJpb3JpdHkgZm9yIHRoaXMgcGxhdGZvcm0gcmVsYXRpdmUgdG8gb3RoZXIgb25lcy4KKworICAgICAgSGlnaGVyIHByaW9yaXR5IHBsYXRmb3JtcyB3aWxsIGdldCBidWlsdCwgdGVzdGVkLCBldGMgZmlyc3QuIEdlbmVyYWxseSwKKyAgICAgIHBsYXRmb3JtcyB3aGljaCBnaXZlIGhpZ2hlci1xdWFsaXR5IGNvbXBpbGVyIGVycm9ycyBldGMgc2hvdWxkIGNvbWUgZmlyc3QuCisgICAgICAiIiIKKyAgICAgIHJldHVybiAwCisKKyAgZGVmIGNoZWNrX2luc3RhbGxlZChzZWxmLCBwbGF0Zm9ybXMsIGlzX2RlcGxveSk6CisgICAgIiIiTWFrZXMgc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGJ1aWxkIHBsYXRmb3JtcyBhcmUgaW5zdGFsbGVkLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ2NoZWNrX2luc3RhbGxlZCBzaG91bGQgYmUgb3ZlcnJpZGVuJykKKyAgZGVmIHBhcnNlX3BsYXRmb3JtcyhzZWxmLCBwbGF0Zm9ybXNfc3RyaW5nKToKKyAgICAiIiJBcmdzOgorICAgICAgc3RyaW5nOiBBIHVzZXItc3VwcGxpZWQgc3RyaW5nIHNheWluZyB3aGljaCBwbGF0Zm9ybXMgdG8gc2VsZWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgdHVwbGUgb2YgUGxhdGZvcm0gb2JqZWN0cy4KKworICAgIFJhaXNlczoKKyAgICAgIFByb2Nlc3Nvci5Vbmtub3duUGxhdGZvcm06IFBhcnNpbmcgc3RyaW5nIGRpZG4ndCB3b3JrIG91dC4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdwYXJzZV9wbGF0Zm9ybXMgc2hvdWxkIGJlIG92ZXJyaWRlbicpCisgIGRlZiBleHRyYV9neXBfZmxhZ3Moc2VsZik6CisgICAgIiIiUmV0dXJuczoKKyAgICAgIEEgdHVwbGUgb2YgZXh0cmEgZmxhZ3MgdG8gcGFzcyB0byBneXAgKGlmIGFueSkuCisgICAgIiIiCisgICAgcmV0dXJuICgpCisgIGRlZiBtb2RpZnlfbmluamFfZmlsZShzZWxmLCBuaW5qYV9maWxlKToKKyAgICAiIiJNb2RpZmllcyBhIGZyZXNobHkgZ2VuZXJhdGVkIG5pbmphIGZpbGUgYXMgbmVjZXNzYXJ5LgorCisgICAgQXJnczoKKyAgICAgIG5pbmphX2ZpbGU6IFBhdGggdG8gdGhlIGZpbGUgdG8gbW9kaWZ5LgorICAgICIiIgorICAgIHBhc3MKKyAgZGVmIGRvd25sb2FkX2V4dGVybmFscyhzZWxmLCBwbGF0Zm9ybXMpOgorICAgICIiIkNhbGxzIGRvd25sb2FkX2V4dGVybmFscyBhcyBhcHByb3ByaWF0ZSB0byBidWlsZCBwbGF0Zm9ybXMuCisKKyAgICBBcmdzOgorICAgICAgcGxhdGZvcm1zOiBBIGxpc3Qgb2YgcGxhdGZvcm1zIHRvIGRvd25sb2FkIGV4dGVybmFsIGxpYnJhcmllcyBmb3IuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignZG93bmxvYWRfZXh0ZXJuYWxzIHNob3VsZCBiZSBvdmVycmlkZW4nKQorCisgIGRlZiBkb19jaGVja19pbnN0YWxsZWQoc2VsZiwgb3RoZXJfcGFja2FnZXMpOgorICAgICIiIkhlbHBlciBmb3Igc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgY2hlY2tfaW5zdGFsbGVkLgorCisgICAgQXJnczoKKyAgICAgIG90aGVyX3BhY2thZ2VzOiBBIHR1cGxlIG9mIHBsYXRmb3JtLXNwZWNpZmljIHBhY2thZ2VzIHRvIGNoZWNrIGZvci4iIiIKKyAgICBhbGxfcGFja2FnZXMgPSBvdGhlcl9wYWNrYWdlcworICAgICMgTmVjZXNzYXJ5IHRvIGJ1aWxkIHN0dWZmLgorICAgIGFsbF9wYWNrYWdlcyArPSAoJ2NjYWNoZScsICdtYWtlJykKKyAgICAjIE5lY2Vzc2FyeSB0byBkb3dubG9hZCBzdHVmZiB0byBidWlsZC4KKyAgICBhbGxfcGFja2FnZXMgKz0gKCd3Z2V0JywgJ2dpdCcsICdzdWJ2ZXJzaW9uJywgJ3BhdGNoJywgJ3VuemlwJywgJ2J6aXAyJykKKyAgICAjIE5lY2Vzc2FyeSB0byBidWlsZCBleHRlcm5hbHMgc3R1ZmYuCisgICAgYWxsX3BhY2thZ2VzICs9ICgncHl0aG9uJywgJ2djYycsICdnKysnKQorICAgIG5vdF9mb3VuZCA9IFtdCisgICAgdHJ5OgorICAgICAgIyBUT0RPKGJyaWFucyk6IENoZWNrIHZlcnNpb25zIHRvby4KKyAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgICgnZHBrZy1xdWVyeScsCisgICAgICAgICAgIHIiLS1zaG93Zm9ybWF0PScke2JpbmFyeTpQYWNrYWdlfVx0JHtkYjpTdGF0dXMtQWJicmV2fVxuJyIsCisgICAgICAgICAgICctLXNob3cnKSArIGFsbF9wYWNrYWdlcywKKyAgICAgICAgICBzdGRpbj1vcGVuKG9zLmRldm51bGwsICdyJyksCisgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgZm9yIGxpbmUgaW4gcmVzdWx0LmRlY29kZSgndXRmLTgnKS5yc3RyaXAoKS5zcGxpdGxpbmVzKFRydWUpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKCdeKFteXHRdKylcdFteaV1bXmldJCcsIGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgIG5vdF9mb3VuZC5hcHBlbmQobWF0Y2guZ3JvdXAoMSkpCisgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CisgICAgICBvdXRwdXQgPSBlLm91dHB1dC5kZWNvZGUoJ3V0Zi04JykucnN0cmlwKCkKKyAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zcGxpdGxpbmVzKFRydWUpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHInZHBrZy1xdWVyeTogbm8gcGFja2FnZXMgZm91bmQgbWF0Y2hpbmcgKC4qKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgbm90X2ZvdW5kLmFwcGVuZChtYXRjaC5ncm91cCgxKSkKKyAgICBpZiBub3RfZm91bmQ6CisgICAgICB1c2VyX291dHB1dCgnU29tZSBwYWNrYWdlcyBub3QgaW5zdGFsbGVkOiAlcy4nICUgJywgJy5qb2luKG5vdF9mb3VuZCkpCisgICAgICB1c2VyX291dHB1dCgnVHJ5IHNvbWV0aGluZyBsaWtlIGBzdWRvIGFwdC1nZXQgaW5zdGFsbCAlc2AuJyAlCisgICAgICAgICAgICAgICAgICAnICcuam9pbihub3RfZm91bmQpKQorICAgICAgZXhpdCgxKQorCitjbGFzcyBQcmltZVByb2Nlc3NvcihQcm9jZXNzb3IpOgorICAiIiJBIFByb2Nlc3NvciBzdWJjbGFzcyBmb3IgYnVpbGRpbmcgcHJpbWUgY29kZS4iIiIKKworICBjbGFzcyBQbGF0Zm9ybShQcm9jZXNzb3IuUGxhdGZvcm0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmNoaXRlY3R1cmUsIGZvbGRlciwgY29tcGlsZXIsIGRlYnVnLCBzYW5pdGl6ZXIpOgorICAgICAgc3VwZXIoUHJpbWVQcm9jZXNzb3IuUGxhdGZvcm0sIHNlbGYpLl9faW5pdF9fKCkKKworICAgICAgc2VsZi5fX2FyY2hpdGVjdHVyZSA9IGFyY2hpdGVjdHVyZQorICAgICAgc2VsZi5fX2ZvbGRlciA9IGZvbGRlcgorICAgICAgc2VsZi5fX2NvbXBpbGVyID0gY29tcGlsZXIKKyAgICAgIHNlbGYuX19kZWJ1ZyA9IGRlYnVnCisgICAgICBzZWxmLl9fc2FuaXRpemVyID0gc2FuaXRpemVyCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICByZXR1cm4gJ1ByaW1lUHJvY2Vzc29yLlBsYXRmb3JtKGFyY2hpdGVjdHVyZT0lcywgY29tcGlsZXI9JXMsIGRlYnVnPSVzJyBcCisgICAgICAgICAgJywgc2FuaXRpemVyPSVzKScgXAorICAgICAgICAgICUgKHNlbGYuYXJjaGl0ZWN0dXJlKCksIHNlbGYuY29tcGlsZXIoKSwgc2VsZi5kZWJ1ZygpLAorICAgICAgICAgICAgIHNlbGYuc2FuaXRpemVyKCkpCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICByZXR1cm4gJyVzLSVzLSVzJXMtJXMnICUgKHNlbGYuYXJjaGl0ZWN0dXJlKCksIHNlbGYuZm9sZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1kZWJ1ZycgaWYgc2VsZi5kZWJ1ZygpIGVsc2UgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2FuaXRpemVyKCkpCisKKyAgICBkZWYgb3Moc2VsZik6CisgICAgICByZXR1cm4gJ2xpbnV4JworICAgIGRlZiBneXBfcGxhdGZvcm0oc2VsZik6CisgICAgICByZXR1cm4gJyVzLSVzLSVzJyAlIChzZWxmLm9zKCksIHNlbGYuYXJjaGl0ZWN0dXJlKCksIHNlbGYuY29tcGlsZXIoKSkKKyAgICBkZWYgYXJjaGl0ZWN0dXJlKHNlbGYpOgorICAgICAgcmV0dXJuIHNlbGYuX19hcmNoaXRlY3R1cmUKKyAgICBkZWYgZm9sZGVyKHNlbGYpOgorICAgICAgcmV0dXJuIHNlbGYuX19mb2xkZXIKKyAgICBkZWYgY29tcGlsZXIoc2VsZik6CisgICAgICByZXR1cm4gc2VsZi5fX2NvbXBpbGVyCisgICAgZGVmIHNhbml0aXplcihzZWxmKToKKyAgICAgIHJldHVybiBzZWxmLl9fc2FuaXRpemVyCisgICAgZGVmIGRlYnVnKHNlbGYpOgorICAgICAgcmV0dXJuIHNlbGYuX19kZWJ1ZworCisgICAgZGVmIG91dG5hbWUoc2VsZik6CisgICAgICByZXR1cm4gc3RyKHNlbGYpCisKKyAgICBkZWYgcHJpb3JpdHkoc2VsZik6CisgICAgICByID0gMAorICAgICAgaWYgc2VsZi5jb21waWxlcigpID09ICdjbGFuZyc6CisgICAgICAgIHIgKz0gMTAwCisgICAgICBpZiBzZWxmLnNhbml0aXplcigpICE9ICdub25lJzoKKyAgICAgICAgciAtPSA1MAorICAgICAgZWxpZiBzZWxmLmRlYnVnKCk6CisgICAgICAgIHIgLT0gMTAKKyAgICAgIGlmIHNlbGYuYXJjaGl0ZWN0dXJlKCkgPT0gJ2FtZDY0JzoKKyAgICAgICAgciArPSA1CisgICAgICByZXR1cm4gcgorCisgICAgZGVmIGRlcGxveShzZWxmLCBkcnlfcnVuKToKKyAgICAgICIiIkRvd25sb2FkcyBjb2RlIHRvIHRoZSBwcmltZSBpbiBhIHdheSB0aGF0IGF2b2lkcyBjbGFzaGluZyB0b28gYmFkbHkgd2l0aAorICAgICAgc3RhcnRlciAobGlrZSB0aGUgbmFpdmUgZG93bmxvYWQgZXZlcnl0aGluZyBvbmUgYXQgYSB0aW1lKS4iIiIKKyAgICAgIGlmIG5vdCBzZWxmLmFyY2hpdGVjdHVyZSgpLmVuZHN3aXRoKCdfZnJjJyk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRG9uJ3Qga25vdyBob3cgdG8gZG93bmxvYWQgY29kZSB0byBhICVzLiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hcmNoaXRlY3R1cmUoKSkKKyAgICAgIFNVTSA9ICdtZDVzdW0nCisgICAgICBUQVJHRVRfRElSID0gZ2V0X3RhcmdldF9kaXIoKQorICAgICAgVEVNUF9ESVIgPSBnZXRfdGVtcF9kaXIoKQorICAgICAgVEFSR0VUID0gJ2FkbWluQCcgKyBnZXRfaXAoKQorCisgICAgICBmcm9tX2RpciA9IG9zLnBhdGguam9pbihzZWxmLm91dGRpcigpLCAnb3V0cHV0cycpCisgICAgICBzdW1zID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoKFNVTSwpICsgdHVwbGUob3MubGlzdGRpcihmcm9tX2RpcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPW9wZW4ob3MuZGV2bnVsbCwgJ3InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9ZnJvbV9kaXIpCisgICAgICB0b19kb3dubG9hZCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgICgnc3NoJywgVEFSR0VULAorICAgICAgICAgICAiIiJybSAtcmYge1RNUERJUn0gJiYgbWtkaXIgLXAge1RNUERJUn0gJiYgXFwKKyAgICAgICAgICAgICBta2RpciAtcCB7VE9fRElSfSAmJiBjZCB7VE9fRElSfSBcXAorICAgICAgICAgICAgICYmIGVjaG8gJ3tTVU1TfScgfCB7U1VNfSAtYyBcXAorICAgICAgICAgICAgIHwmIGdyZXAgLUYgRkFJTEVEIHwgc2VkICdzL15cXCguKlxcKTogRkFJTEVELiokL1xcMS9nJyIiIi4KKyAgICAgICAgICAgZm9ybWF0KFRNUERJUj1URU1QX0RJUiwgVE9fRElSPVRBUkdFVF9ESVIsIFNVTVM9c3Vtcy5kZWNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICBTVU09U1VNKSkpCisgICAgICBpZiBub3QgdG9fZG93bmxvYWQ6CisgICAgICAgIHVzZXJfb3V0cHV0KCJOb3RoaW5nIHRvIGRvd25sb2FkIikKKyAgICAgICAgcmV0dXJuCisgICAgICBzZWxmLmRvX2RlcGxveSgKKyAgICAgICAgICBkcnlfcnVuLAorICAgICAgICAgICgnc2NwJywgJy1vJywgJ0NvbXByZXNzaW9uIHllcycpCisgICAgICAgICAgKyB0dXBsZShbb3MucGF0aC5qb2luKGZyb21fZGlyLCBmKSBmb3IgZiBpbiB0b19kb3dubG9hZC5kZWNvZGUoJ3V0Zi04Jykuc3BsaXQoJ1xuJylbOi0xXV0pCisgICAgICAgICAgKyAoKCclczolcycgJSAoVEFSR0VULCBURU1QX0RJUikpLCkpCisgICAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgbXZfY21kID0gWydtdiB7VE1QRElSfS8qIHtUT19ESVJ9ICddCisgICAgICAgIG12X2NtZC5hcHBlbmQoJyYmIGNobW9kIHUrcyB7VE9fRElSfS9zdGFydGVyX2V4ZSAnKQorICAgICAgICBtdl9jbWQuYXBwZW5kKCcmJiBlY2hvIFwnRG9uZSBtb3ZpbmcgbmV3IGV4ZWN1dGFibGVzIGludG8gcGxhY2VcJyAnKQorICAgICAgICBtdl9jbWQuYXBwZW5kKCcmJiBiYXNoIC1jIFwnc3luYyAmJiBzeW5jICYmIHN5bmNcJycpCisgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKKyAgICAgICAgICAgICgnc3NoJywgVEFSR0VULAorICAgICAgICAgICAgICcnLmpvaW4obXZfY21kKS5mb3JtYXQoVE1QRElSPVRFTVBfRElSLCBUT19ESVI9VEFSR0VUX0RJUikpKQorCisgICAgZGVmIGJ1aWxkX2VudihzZWxmKToKKyAgICAgIE9USEVSX1NZU1JPT1QgPSAnL3Vzci9saWIvbGx2bS0zLjUvJworICAgICAgU1lNQk9MSVpFUl9QQVRIID0gT1RIRVJfU1lTUk9PVCArICdiaW4vbGx2bS1zeW1ib2xpemVyJworICAgICAgciA9IHt9CisgICAgICBpZiBzZWxmLnNhbml0aXplcigpID09ICdhZGRyZXNzJzoKKyAgICAgICAgclsnQVNBTl9TWU1CT0xJWkVSX1BBVEgnXSA9IFNZTUJPTElaRVJfUEFUSAorICAgICAgICByWydBU0FOX09QVElPTlMnXSA9IFwKKyAgICAgICAgICAgICdkZXRlY3RfbGVha3M9MTpjaGVja19pbml0aWFsaXphdGlvbl9vcmRlcj0xOnN0cmljdF9pbml0X29yZGVyPTEnIFwKKyAgICAgICAgICAgICc6ZGV0ZWN0X3N0YWNrX3VzZV9hZnRlcl9yZXR1cm49MTpkZXRlY3Rfb2RyX3Zpb2xhdGlvbj0yJyBcCisgICAgICAgICAgICAnOmFsbG93X3VzZXJfc2Vndl9oYW5kbGVyPTEnCisgICAgICBlbGlmIHNlbGYuc2FuaXRpemVyKCkgPT0gJ21lbW9yeSc6CisgICAgICAgIHJbJ01TQU5fU1lNQk9MSVpFUl9QQVRIJ10gPSBTWU1CT0xJWkVSX1BBVEgKKyAgICAgIGVsaWYgc2VsZi5zYW5pdGl6ZXIoKSA9PSAndGhyZWFkJzoKKyAgICAgICAgclsnVFNBTl9PUFRJT05TJ10gPSAnZXh0ZXJuYWxfc3ltYm9saXplcl9wYXRoPScgKyBTWU1CT0xJWkVSX1BBVEgKKyAgICAgICAgIyBUaGlzIGlzIGFwcGFyZW50bHkgdGhlIGRlZmF1bHQgZm9yIG5ld2VyIHZlcnNpb25zLCB3aGljaCBkaXNhZ3JlZXMKKyAgICAgICAgIyB3aXRoIGRvY3VtZW50YXRpb24sIHNvIGp1c3QgdHVybiBpdCBvbiBleHBsaWNpdGx5LgorICAgICAgICByWydUU0FOX09QVElPTlMnXSArPSAnOmRldGVjdF9kZWFkbG9ja3M9MScKKyAgICAgICAgIyBQcmludCBtb3JlIHVzZWZ1bCBzdGFja3MgZm9yIG11dGV4IGxvY2tpbmcgb3JkZXIgcHJvYmxlbXMuCisgICAgICAgIHJbJ1RTQU5fT1BUSU9OUyddICs9ICc6c2Vjb25kX2RlYWRsb2NrX3N0YWNrPTEnCisKKyAgICAgIHJbJ0NDQUNIRV9DT01QUkVTUyddID0gJ3llcycKKyAgICAgIHJbJ0NDQUNIRV9ESVInXSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oYW9zX3BhdGgoKSwgJy4uJywgJ291dHB1dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjY2FjaGVfZGlyJykpCisgICAgICByWydDQ0FDSEVfSEFTSERJUiddID0gJ3llcycKKyAgICAgIGlmIHNlbGYuY29tcGlsZXIoKS5zdGFydHN3aXRoKCdjbGFuZycpOgorICAgICAgICAjIGNsYW5nIGRvZXNuJ3QgbGlrZSBiZWluZyBydW4gZGlyZWN0bHkgb24gdGhlIHByZXByb2Nlc3NlZCBmaWxlcy4KKyAgICAgICAgclsnQ0NBQ0hFX0NQUDInXSA9ICd5ZXMnCisgICAgICAjIFdpdGhvdXQgdGhpcywgY2NhY2hlIHNsb3dzIGRvd24gYmVjYXVzZSBvZiB0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlcy4KKyAgICAgICMgVGhlIHJhY2UgY29uZGl0aW9uIHRoYXQgdGhpcyBvcGVucyB1cCBpc24ndCBhIHByb2JsZW0gYmVjYXVzZSB0aGUgYnVpbGQKKyAgICAgICMgc3lzdGVtIGZpbmlzaGVzIG1vZGlmeWluZyBoZWFkZXIgZmlsZXMgYmVmb3JlIGNvbXBpbGluZyBhbnl0aGluZyB0aGF0CisgICAgICAjIHVzZXMgdGhlbS4KKyAgICAgIHJbJ0NDQUNIRV9TTE9QUElORVNTJ10gPSAnaW5jbHVkZV9maWxlX210aW1lJworCisgICAgICBpZiBzZWxmLmFyY2hpdGVjdHVyZSgpID09ICdhbWQ2NCc6CisgICAgICAgIHJbJ1BBVEgnXSA9IG9zLnBhdGguam9pbihhb3NfcGF0aCgpLCAnYnVpbGQnLCAnYmluLWxkLmdvbGQnKSArIFwKKyAgICAgICAgICAgICc6JyArIG9zLmVudmlyb25bJ1BBVEgnXQorCisgICAgICByZXR1cm4gcgorCisgIEFSQ0hJVEVDVFVSRVMgPSAoJ2FybV9mcmMnLCAnYW1kNjQnKQorICBDT01QSUxFUlMgPSAoJ2NsYW5nJywgJ2djYycpCisgIFNBTklUSVpFUlMgPSAoJ2FkZHJlc3MnLCAndW5kZWZpbmVkJywgJ2ludGVnZXInLCAnbWVtb3J5JywgJ3RocmVhZCcsICdub25lJykKKyAgU0FOSVRJWkVSX1RFU1RfV0FSTklOR1MgPSB7CisgICAgICAnbWVtb3J5JzogKFRydWUsCisiIiJXZSBkb24ndCBoYXZlIGFsbCBvZiB0aGUgbGlicmFyaWVzIGluc3RydW1lbnRlZCB3aGljaCBsZWFkcyB0byBsb3RzIG9mIGZhbHNlCisgIGVycm9ycyB3aXRoIG1zYW4gKGVzcGVjaWFsbHkgc3RkbGliYysrKS4KKyAgVE9ETyhicmlhbnMpOiBGaWd1cmUgb3V0IGEgd2F5IHRvIGRlYWwgd2l0aCBpdC4iIiIpLAorICB9CisgIFBJRV9TQU5JVElaRVJTID0gKCdtZW1vcnknLCAndGhyZWFkJykKKworICBkZWYgX19pbml0X18oc2VsZiwgZm9sZGVyLCBpc190ZXN0LCBpc19kZXBsb3kpOgorICAgIHN1cGVyKFByaW1lUHJvY2Vzc29yLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICBzZWxmLl9fZm9sZGVyID0gZm9sZGVyCisKKyAgICBwbGF0Zm9ybXMgPSBbXQorICAgIGZvciBhcmNoaXRlY3R1cmUgaW4gUHJpbWVQcm9jZXNzb3IuQVJDSElURUNUVVJFUzoKKyAgICAgIGZvciBjb21waWxlciBpbiBQcmltZVByb2Nlc3Nvci5DT01QSUxFUlM6CisgICAgICAgIGZvciBkZWJ1ZyBpbiBbVHJ1ZSwgRmFsc2VdOgorICAgICAgICAgIGlmIGFyY2hpdGVjdHVyZSA9PSAnYW1kNjQnIGFuZCBjb21waWxlciA9PSAnZ2NjJzoKKyAgICAgICAgICAgICMgV2UgZG9uJ3QgaGF2ZSBhIGNvbXBpbGVyIHRvIHVzZSBoZXJlLgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICBwbGF0Zm9ybXMuYXBwZW5kKAorICAgICAgICAgICAgICBzZWxmLlBsYXRmb3JtKGFyY2hpdGVjdHVyZSwgZm9sZGVyLCBjb21waWxlciwgZGVidWcsICdub25lJykpCisgICAgZm9yIHNhbml0aXplciBpbiBQcmltZVByb2Nlc3Nvci5TQU5JVElaRVJTOgorICAgICAgZm9yIGNvbXBpbGVyIGluICgnY2xhbmcnLCk6CisgICAgICAgIGlmIGNvbXBpbGVyID09ICdnY2NfNC44JyBhbmQgKHNhbml0aXplciA9PSAndW5kZWZpbmVkJyBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZXIgPT0gJ2ludGVnZXInIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplciA9PSAnbWVtb3J5Jyk6CisgICAgICAgICAgIyBHQ0MgNC44IGRvZXNuJ3Qgc3VwcG9ydCB0aGVzZSBzYW5pdGl6ZXJzLgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHNhbml0aXplciA9PSAnbm9uZSc6CisgICAgICAgICAgIyBXZSBhbHJlYWR5IGFkZGVkIHNhbml0aXplciA9PSAnbm9uZScgYWJvdmUuCisgICAgICAgICAgY29udGludWUKKyAgICAgICAgcGxhdGZvcm1zLmFwcGVuZCgKKyAgICAgICAgICAgIHNlbGYuUGxhdGZvcm0oJ2FtZDY0JywgZm9sZGVyLCBjb21waWxlciwgVHJ1ZSwgc2FuaXRpemVyKSkKKyAgICBzZWxmLl9fcGxhdGZvcm1zID0gZnJvemVuc2V0KHBsYXRmb3JtcykKKworICAgIGlmIGlzX3Rlc3Q6CisgICAgICBkZWZhdWx0X3BsYXRmb3JtcyA9IHNlbGYuc2VsZWN0X3BsYXRmb3JtcyhhcmNoaXRlY3R1cmU9J2FtZDY0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPVRydWUpCisgICAgICBmb3Igc2FuaXRpemVyLCB3YXJuaW5nIGluIFByaW1lUHJvY2Vzc29yLlNBTklUSVpFUl9URVNUX1dBUk5JTkdTLml0ZW1zKCk6CisgICAgICAgIGlmIHdhcm5pbmdbMF06CisgICAgICAgICAgZGVmYXVsdF9wbGF0Zm9ybXMgLT0gc2VsZi5zZWxlY3RfcGxhdGZvcm1zKHNhbml0aXplcj1zYW5pdGl6ZXIpCisgICAgZWxpZiBpc19kZXBsb3k6CisgICAgICBkZWZhdWx0X3BsYXRmb3JtcyA9IHNlbGYuc2VsZWN0X3BsYXRmb3JtcyhhcmNoaXRlY3R1cmU9J2FybV9mcmMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXI9J2djYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1GYWxzZSkKKyAgICBlbHNlOgorICAgICAgZGVmYXVsdF9wbGF0Zm9ybXMgPSBzZWxmLnNlbGVjdF9wbGF0Zm9ybXMoZGVidWc9RmFsc2UpCisgICAgc2VsZi5fX2RlZmF1bHRfcGxhdGZvcm1zID0gZnJvemVuc2V0KGRlZmF1bHRfcGxhdGZvcm1zKQorCisgIGRlZiBmb2xkZXIoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX19mb2xkZXIKKyAgZGVmIHBsYXRmb3JtcyhzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fX3BsYXRmb3JtcworICBkZWYgZGVmYXVsdF9wbGF0Zm9ybXMoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX19kZWZhdWx0X3BsYXRmb3JtcworCisgIGRlZiBkb3dubG9hZF9leHRlcm5hbHMoc2VsZiwgcGxhdGZvcm1zKToKKyAgICB0b19kb3dubG9hZCA9IHNldCgpCisgICAgZm9yIGFyY2hpdGVjdHVyZSBpbiBQcmltZVByb2Nlc3Nvci5BUkNISVRFQ1RVUkVTOgorICAgICAgcGllX3Nhbml0aXplcnMgPSBzZXQoKQorICAgICAgZm9yIHNhbml0aXplciBpbiBQcmltZVByb2Nlc3Nvci5QSUVfU0FOSVRJWkVSUzoKKyAgICAgICAgcGllX3Nhbml0aXplcnMudXBkYXRlKHNlbGYuc2VsZWN0X3BsYXRmb3JtcyhhcmNoaXRlY3R1cmU9YXJjaGl0ZWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplcj1zYW5pdGl6ZXIpKQorICAgICAgaWYgcGxhdGZvcm1zICYgcGllX3Nhbml0aXplcnM6CisgICAgICAgIHRvX2Rvd25sb2FkLmFkZChhcmNoaXRlY3R1cmUgKyAnLWZQSUUnKQorCisgICAgICBpZiBwbGF0Zm9ybXMgJiAoc2VsZi5zZWxlY3RfcGxhdGZvcm1zKGFyY2hpdGVjdHVyZT1hcmNoaXRlY3R1cmUpIC0KKyAgICAgICAgICAgICAgICAgICAgICBwaWVfc2FuaXRpemVycyk6CisgICAgICAgIHRvX2Rvd25sb2FkLmFkZChhcmNoaXRlY3R1cmUpCisKKyAgICBmb3IgZG93bmxvYWRfdGFyZ2V0IGluIHRvX2Rvd25sb2FkOgorICAgICAgY2FsbF9kb3dubG9hZF9leHRlcm5hbHMoZG93bmxvYWRfdGFyZ2V0KQorCisgIGRlZiBwYXJzZV9wbGF0Zm9ybXMoc2VsZiwgcGxhdGZvcm1fc3RyaW5nKToKKyAgICBpZiBwbGF0Zm9ybV9zdHJpbmcgaXMgTm9uZToKKyAgICAgIHJldHVybiBzZWxmLmRlZmF1bHRfcGxhdGZvcm1zKCkKKyAgICByID0gc2VsZi5kZWZhdWx0X3BsYXRmb3JtcygpCisgICAgZm9yIHBhcnQgaW4gcGxhdGZvcm1fc3RyaW5nLnNwbGl0KCcsJyk6CisgICAgICBpZiBwYXJ0ID09ICdhbGwnOgorICAgICAgICByID0gc2VsZi5wbGF0Zm9ybXMoKQorICAgICAgZWxpZiBwYXJ0WzBdID09ICcrJzoKKyAgICAgICAgciA9IHIgfCBzZWxmLnNlbGVjdF9wbGF0Zm9ybXNfc3RyaW5nKHBhcnRbMTpdKQorICAgICAgZWxpZiBwYXJ0WzBdID09ICctJzoKKyAgICAgICAgciA9IHIgLSBzZWxmLnNlbGVjdF9wbGF0Zm9ybXNfc3RyaW5nKHBhcnRbMTpdKQorICAgICAgZWxpZiBwYXJ0WzBdID09ICc9JzoKKyAgICAgICAgciA9IHNlbGYuc2VsZWN0X3BsYXRmb3Jtc19zdHJpbmcocGFydFsxOl0pCisgICAgICBlbHNlOgorICAgICAgICBzZWxlY3RlZCA9IHNlbGYuc2VsZWN0X3BsYXRmb3Jtc19zdHJpbmcocGFydCkKKyAgICAgICAgciA9IHIgLSAoc2VsZi5wbGF0Zm9ybXMoKSAtIHNlbGVjdGVkKQorICAgICAgICBpZiBub3QgcjoKKyAgICAgICAgICByID0gc2VsZWN0ZWQKKyAgICByZXR1cm4gcgorCisgIGRlZiBzZWxlY3RfcGxhdGZvcm1zKHNlbGYsIGFyY2hpdGVjdHVyZT1Ob25lLCBjb21waWxlcj1Ob25lLCBkZWJ1Zz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZXI9Tm9uZSk6CisgICAgciA9IFtdCisgICAgZm9yIHBsYXRmb3JtIGluIHNlbGYucGxhdGZvcm1zKCk6CisgICAgICBpZiBhcmNoaXRlY3R1cmUgaXMgTm9uZSBvciBwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKSA9PSBhcmNoaXRlY3R1cmU6CisgICAgICAgIGlmIGNvbXBpbGVyIGlzIE5vbmUgb3IgcGxhdGZvcm0uY29tcGlsZXIoKSA9PSBjb21waWxlcjoKKyAgICAgICAgICBpZiBkZWJ1ZyBpcyBOb25lIG9yIHBsYXRmb3JtLmRlYnVnKCkgPT0gZGVidWc6CisgICAgICAgICAgICBpZiBzYW5pdGl6ZXIgaXMgTm9uZSBvciBwbGF0Zm9ybS5zYW5pdGl6ZXIoKSA9PSBzYW5pdGl6ZXI6CisgICAgICAgICAgICAgIHIuYXBwZW5kKHBsYXRmb3JtKQorICAgIHJldHVybiBzZXQocikKKworICBkZWYgc2VsZWN0X3BsYXRmb3Jtc19zdHJpbmcoc2VsZiwgcGxhdGZvcm1zX3N0cmluZyk6CisgICAgYXJjaGl0ZWN0dXJlLCBjb21waWxlciwgZGVidWcsIHNhbml0aXplciA9IE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUKKyAgICBmb3IgcGFydCBpbiBwbGF0Zm9ybXNfc3RyaW5nLnNwbGl0KCctJyk6CisgICAgICBpZiBwYXJ0IGluIFByaW1lUHJvY2Vzc29yLkFSQ0hJVEVDVFVSRVM6CisgICAgICAgIGFyY2hpdGVjdHVyZSA9IHBhcnQKKyAgICAgIGVsaWYgcGFydCBpbiBQcmltZVByb2Nlc3Nvci5DT01QSUxFUlM6CisgICAgICAgIGNvbXBpbGVyID0gcGFydAorICAgICAgZWxpZiBwYXJ0IGluIFsnZGVidWcnLCAnZGJnJ106CisgICAgICAgIGRlYnVnID0gVHJ1ZQorICAgICAgZWxpZiBwYXJ0IGluIFsncmVsZWFzZScsICdub2RlYnVnJywgJ25kYiddOgorICAgICAgICBkZWJ1ZyA9IEZhbHNlCisgICAgICBlbGlmIHBhcnQgaW4gUHJpbWVQcm9jZXNzb3IuU0FOSVRJWkVSUzoKKyAgICAgICAgc2FuaXRpemVyID0gcGFydAorICAgICAgZWxpZiBwYXJ0ID09ICdhbGwnOgorICAgICAgICBhcmNoaXRlY3R1cmUgPSBjb21waWxlciA9IGRlYnVnID0gc2FuaXRpemVyID0gTm9uZQorICAgICAgZWxpZiBwYXJ0ID09IHNlbGYuZm9sZGVyKCk6CisgICAgICAgIHBhc3MKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFByb2Nlc3Nvci5Vbmtub3duUGxhdGZvcm0oCisgICAgICAgICAgICAnIiVzIiBub3QgcmVjb2duaXplZCBhcyBhIHBsYXRmb3JtIHN0cmluZyBjb21wb25lbnQuJyAlIHBhcnQpCisgICAgcmV0dXJuIHNlbGYuc2VsZWN0X3BsYXRmb3JtcygKKyAgICAgICAgYXJjaGl0ZWN0dXJlPWFyY2hpdGVjdHVyZSwKKyAgICAgICAgY29tcGlsZXI9Y29tcGlsZXIsCisgICAgICAgIGRlYnVnPWRlYnVnLAorICAgICAgICBzYW5pdGl6ZXI9c2FuaXRpemVyKQorCisgIGRlZiBjaGVja19pbnN0YWxsZWQoc2VsZiwgcGxhdGZvcm1zLCBpc19kZXBsb3kpOgorICAgIHBhY2thZ2VzID0gc2V0KCgnbHppcCcsICdtNCcsICdyZWFscGF0aCcpKQorICAgIHBhY2thZ2VzLmFkZCgncnVieScpCisgICAgcGFja2FnZXMuYWRkKCdjbGFuZy0zLjUnKQorICAgIHBhY2thZ2VzLmFkZCgnY2xhbmctZm9ybWF0LTMuNScpCisgICAgZm9yIHBsYXRmb3JtIGluIHBsYXRmb3JtczoKKyAgICAgIGlmIHBsYXRmb3JtLmNvbXBpbGVyKCkgPT0gJ2NsYW5nJyBvciBwbGF0Zm9ybS5jb21waWxlcigpID09ICdnY2NfNC44JzoKKyAgICAgICAgcGFja2FnZXMuYWRkKCdjbGFuZy0zLjUnKQorICAgICAgaWYgcGxhdGZvcm0uY29tcGlsZXIoKSA9PSAnZ2NjXzQuOCc6CisgICAgICAgIHBhY2thZ2VzLmFkZCgnbGliY2xvb2ctaXNsMzphbWQ2NCcpCisgICAgICBpZiBpc19kZXBsb3k6CisgICAgICAgIHBhY2thZ2VzLmFkZCgnb3BlbnNzaC1jbGllbnQnKQorICAgICAgZWxpZiBwbGF0Zm9ybS5hcmNoaXRlY3R1cmUgPT0gJ2FybV9mcmMnOgorICAgICAgICBwYWNrYWdlcy5hZGQoJ2djYy00LjktYXJtLWZyYy1saW51eC1nbnVlYWJpJykKKyAgICAgICAgcGFja2FnZXMuYWRkKCdnKystNC45LWFybS1mcmMtbGludXgtZ251ZWFiaScpCisKKyAgICBzZWxmLmRvX2NoZWNrX2luc3RhbGxlZCh0dXBsZShwYWNrYWdlcykpCisKK2RlZiBzdHJzaWduYWwobnVtKToKKyAgIyBJdCBlbmRzIHVwIHdpdGggU0lHSU9UIGluc3RlYWQgb3RoZXJ3aXNlLCB3aGljaCBpcyB3ZWlyZC4KKyAgaWYgbnVtID09IHNpZ25hbC5TSUdBQlJUOgorICAgIHJldHVybiAnU0lHQUJSVCcKKyAgIyBTSUdDTEQgaXMgYSB3ZWlyZCB3YXkgdG8gc3BlbGwgaXQuCisgIGlmIG51bSA9PSBzaWduYWwuU0lHQ0hMRDoKKyAgICByZXR1cm4gJ1NJR0NITEQnCisKKyAgU0lHTkFMU19UT19OQU1FUyA9IGRpY3QoKGdldGF0dHIoc2lnbmFsLCBuKSwgbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG4gaW4gZGlyKHNpZ25hbCkgaWYgbi5zdGFydHN3aXRoKCdTSUcnKQorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgJ18nIG5vdCBpbiBuKQorICByZXR1cm4gU0lHTkFMU19UT19OQU1FUy5nZXQobnVtLCAnVW5rbm93biBzaWduYWwgJWQnICUgbnVtKQorCitkZWYgbWFpbigpOgorICBzeXMuYXJndi5wb3AoMCkKKyAgZXhlY19uYW1lID0gc3lzLmFyZ3YucG9wKDApCisgIGRlZiBwcmludF9oZWxwKGV4aXRfc3RhdHVzPU5vbmUsIG1lc3NhZ2U9Tm9uZSk6CisgICAgaWYgbWVzc2FnZToKKyAgICAgIHByaW50KG1lc3NhZ2UpCisgICAgc3lzLnN0ZG91dC53cml0ZSgKKyIiIlVzYWdlOiB7bmFtZX0gWy1qIG5dIFthY3Rpb25dIFstbl0gW3BsYXRmb3JtXSBbdGFyZ2V0fGV4dHJhX2ZsYWddLi4uCitBcmd1bWVudHM6CisgIC1qLCAtLWpvYnMgICAgICAgICAgICAgICBFeHBsaWNpdGx5IHNwZWNpZnkgaG93IG1hbnkgam9icyB0byBydW4gYXQgYSB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzICsgMi4KKyAgLW4sIC0tZHJ5LXJ1biAgICAgICAgICAgIERvbid0IGFjdHVhbGx5IGRvIHdoYXRldmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IG9ubHkgbWVhbmluZ2Z1bCBmb3IgZGVwbG95LgorICBhY3Rpb24gICAgICAgICAgICAgICAgICAgV2hhdCB0byBkby4gRGVmYXVsdHMgdG8gYnVpbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZDogQnVpbGQgdGhlIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbjogUmVtb3ZlIGFsbCB0aGUgYnVpbHQgb3V0cHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHM6IEJ1aWxkIGFuZCB0aGVuIHJ1biB0ZXN0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveTogQnVpbGQgYW5kIHRoZW4gZG93bmxvYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogRHVtcCB0aGUgZW52aXJvbm1lbnQgZm9yIGJ1aWxkaW5nLgorICBwbGF0Zm9ybSAgICAgICAgICAgICAgICAgV2hhdCB2YXJpYW50cyBvZiB0aGUgY29kZSB0byBidWlsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHNvbWV0aGluZyByZWFzb25hYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGJlbG93IGZvciBkZXRhaWxzLgorICB0YXJnZXQuLi4gICAgICAgICAgICAgICAgV2hpY2ggdGFyZ2V0cyB0byBidWlsZC90ZXN0L2V0Yy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGV2ZXJ5dGhpbmcuCisgIGV4dHJhX2ZsYWcuLi4gICAgICAgICAgICBFeHRyYSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWd0ZXN0Xyo6IEFyZ3VtZW50cyB0byBwYXNzIG9uIHRvIHRlc3RzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmludF9sb2dzLCAtLWxvZ19maWxlPSo6IE1vcmUgdGVzdCBhcmd1bWVudHMuCisKK1NwZWNpZnlpbmcgdGFyZ2V0czoKKyBUYXJnZXRzIGFyZSBjb21iaW5hdGlvbnMgb2YgYXJjaGl0ZWN0dXJlLCBjb21waWxlciwgYW5kIGRlYnVnIGZsYWdzLiBXaGljaAorICBvbmVzIGFjdHVhbGx5IGdldCBydW4gaXMgYnVpbHQgdXAgYXMgYSBzZXQuIEl0IGRlZmF1bHRzIHRvIHNvbWV0aGluZworICByZWFzb25hYmxlIGZvciB0aGUgYWN0aW9uIChzcGVjaWZpZWQgYmVsb3cpLgorIFRoZSBwbGF0Zm9ybSBzcGVjaWZpY2F0aW9uICh0aGUgYXJndW1lbnQgZ2l2ZW4gdG8gdGhpcyBzY3JpcHQpIGlzIGEgY29tbWEtCisgIHNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBoeXBoZW4tc2VwYXJhdGVkIHBsYXRmb3JtcywgZWFjaCB3aXRoIGFuIG9wdGlvbmFsCisgIHByZWZpeC4KKyBFYWNoIHNlbGVjdG9yICh0aGUgdGhpbmdzIHNlcGFyYXRlZCBieSBjb21tYXMpIHNlbGVjdHMgYWxsIG9mIHRoZSBwbGF0Zm9ybXMKKyAgd2hpY2ggbWF0Y2ggYWxsIG9mIGl0cyBjb21wb25lbnRzLiBJdHMgZWZmZWN0IG9uIHRoZSBzZXQgb2YgY3VycmVudCBwbGF0Zm9ybXMKKyAgZGVwZW5kcyBvbiB0aGUgcHJlZml4IGNoYXJhY3Rlci4KKyBIZXJlIGFyZSB0aGUgcHJlZml4IGNoYXJhY3RlcnM6CisgICAgKyAgICAgICAgICBBZGRzIHRoZSBzZWxlY3RlZCBwbGF0Zm9ybXMuCisgICAgLSAgICAgICAgICBSZW1vdmVzIHRoZSBzZWxlY3RlZCBwbGF0Zm9ybXMuCisgICAgPSAgICAgICAgICBTZXRzIHRoZSBjdXJyZW50IHNldCB0byB0aGUgc2VsZWN0ZWQgcGxhdGZvcm1zLgorICAgIFtub25lXSAgICAgUmVtb3ZlcyBhbGwgbm9uLXNlbGVjdGVkIHBsYXRmb3Jtcy4KKyAgICAgICAgICAgICAgIElmIHRoaXMgbWFrZXMgdGhlIGN1cnJlbnQgc2V0IGVtcHR5LCBhY3RzIGxpa2UgPS4KKyAgVGhlcmUgaXMgYWxzbyB0aGUgc3BlY2lhbCBwc3VlZG8tcGxhdGZvcm0gImFsbCIgd2hpY2ggc2VsZWN0cyBhbGwgcGxhdGZvcm1zLgorIEFsbCBvZiB0aGUgYXZhaWxhYmxlIHBsYXRmb3JtczoKKyAge2FsbF9wbGF0Zm9ybXN9CisgRGVmYXVsdCBwbGF0Zm9ybXMgZm9yIGRlcGxveWluZzoKKyAge2RlcGxveV9wbGF0Zm9ybXN9CisgRGVmYXVsdCBwbGF0Zm9ybXMgZm9yIHRlc3Rpbmc6CisgIHt0ZXN0X3BsYXRmb3Jtc30KKyBEZWZhdWx0IHBsYXRmb3JtcyBmb3IgZXZlcnl0aGluZyBlbHNlOgorICB7ZGVmYXVsdF9wbGF0Zm9ybXN9CisKK0V4YW1wbGVzIG9mIHNwZWNpZnlpbmcgdGFyZ2V0czoKKyBidWlsZCBldmVyeXRoaW5nOiAiYWxsIgorIG9ubHkgYnVpbGQgdGhpbmdzIHdpdGggY2xhbmc6ICJjbGFuZyIKKyBidWlsZCBldmVyeXRoaW5nIHRoYXQgdXNlcyBHQ0MgNC44IChub3QganVzdCB0aGUgZGVmYXVsdHMpOiAiPWdjY180LjgiCisgYnVpbGQgYWxsIG9mIHRoZSBhcm0gdGFyZ2V0cyB0aGF0IHVzZSBjbGFuZzogImNsYW5nLWFybSIgb3IgImFybS1jbGFuZyIKKyIiIi5mb3JtYXQoCisgICAgbmFtZT1leGVjX25hbWUsCisgICAgYWxsX3BsYXRmb3Jtcz1zdHJfcGxhdGZvcm1zKFByaW1lUHJvY2Vzc29yKEZhbHNlLCBGYWxzZSkucGxhdGZvcm1zKCkpLAorICAgIGRlcGxveV9wbGF0Zm9ybXM9c3RyX3BsYXRmb3JtcyhQcmltZVByb2Nlc3NvcihGYWxzZSwgVHJ1ZSkuZGVmYXVsdF9wbGF0Zm9ybXMoKSksCisgICAgdGVzdF9wbGF0Zm9ybXM9c3RyX3BsYXRmb3JtcyhQcmltZVByb2Nlc3NvcihUcnVlLCBGYWxzZSkuZGVmYXVsdF9wbGF0Zm9ybXMoKSksCisgICAgZGVmYXVsdF9wbGF0Zm9ybXM9c3RyX3BsYXRmb3JtcyhQcmltZVByb2Nlc3NvcihGYWxzZSwgRmFsc2UpLmRlZmF1bHRfcGxhdGZvcm1zKCkpLAorICAgICkpCisgICAgaWYgZXhpdF9zdGF0dXMgaXMgbm90IE5vbmU6CisgICAgICBzeXMuZXhpdChleGl0X3N0YXR1cykKKworICBkZWYgc29ydF9wbGF0Zm9ybXMocGxhdGZvcm1zKToKKyAgICByZXR1cm4gc29ydGVkKAorICAgICAgICBwbGF0Zm9ybXMsIGtleT1sYW1iZGEgcGxhdGZvcm06ICgtcGxhdGZvcm0ucHJpb3JpdHkoKSwgc3RyKHBsYXRmb3JtKSkpCisKKyAgZGVmIHN0cl9wbGF0Zm9ybXMocGxhdGZvcm1zKToKKyAgICByID0gW10KKyAgICBmb3IgcGxhdGZvcm0gaW4gc29ydF9wbGF0Zm9ybXMocGxhdGZvcm1zKToKKyAgICAgIHIuYXBwZW5kKHN0cihwbGF0Zm9ybSkpCisgICAgaWYgbGVuKHIpID4gMToKKyAgICAgIHJbLTFdID0gJ2FuZCAnICsgclstMV0KKyAgICByZXR1cm4gJywgJy5qb2luKHIpCisKKyAgY2xhc3MgQXJndW1lbnRzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgc2VsZi5qb2JzID0gb3Muc3lzY29uZignU0NfTlBST0NFU1NPUlNfT05MTicpICsgMgorICAgICAgc2VsZi5hY3Rpb25fbmFtZSA9ICdidWlsZCcKKyAgICAgIHNlbGYuZHJ5X3J1biA9IEZhbHNlCisgICAgICBzZWxmLnRhcmdldHMgPSBbXQorICAgICAgc2VsZi5wbGF0Zm9ybSA9IE5vbmUKKyAgICAgIHNlbGYuZXh0cmFfZmxhZ3MgPSBbXQorCisgIGFyZ3MgPSBBcmd1bWVudHMoKQorCisgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgIHByaW50X2hlbHAoMSwgJ05vdCBlbm91Z2ggYXJndW1lbnRzJykKKyAgYXJncy5wcm9jZXNzb3IgPSBzeXMuYXJndi5wb3AoMCkKKyAgYXJncy5mb2xkZXIgPSBzeXMuYXJndi5wb3AoMCkKKyAgYXJncy5tYWluX2d5cCA9IHN5cy5hcmd2LnBvcCgwKQorICBWQUxJRF9BQ1RJT05TID0gWydidWlsZCcsICdjbGVhbicsICdkZXBsb3knLCAndGVzdHMnLCAnZW52aXJvbm1lbnQnXQorICB3aGlsZSBzeXMuYXJndjoKKyAgICBhcmcgPSBzeXMuYXJndi5wb3AoMCkKKyAgICBpZiBhcmcgPT0gJy1qJyBvciBhcmcgPT0gJy0tam9icyc6CisgICAgICBhcmdzLmpvYnMgPSBpbnQoc3lzLmFyZ3YucG9wKDApKQorICAgICAgY29udGludWUKKyAgICBpZiBhcmcgaW4gVkFMSURfQUNUSU9OUzoKKyAgICAgIGFyZ3MuYWN0aW9uX25hbWUgPSBhcmcKKyAgICAgIGNvbnRpbnVlCisgICAgaWYgYXJnID09ICctbicgb3IgYXJnID09ICctLWRyeS1ydW4nOgorICAgICAgaWYgYXJncy5hY3Rpb25fbmFtZSAhPSAnZGVwbG95JzoKKyAgICAgICAgcHJpbnRfaGVscCgxLCAnLS1kcnktcnVuIGlzIG9ubHkgdmFsaWQgZm9yIGRlcGxveScpCisgICAgICBhcmdzLmRyeV9ydW4gPSBUcnVlCisgICAgICBjb250aW51ZQorICAgIGlmIGFyZyA9PSAnLWgnIG9yIGFyZyA9PSAnLS1oZWxwJzoKKyAgICAgIHByaW50X2hlbHAoMCkKKyAgICBpZiAocmUubWF0Y2goJ14tLWd0ZXN0Xy4qJCcsIGFyZykgb3IgYXJnID09ICctLXByaW50LWxvZ3MnIG9yCisgICAgICAgIHJlLm1hdGNoKCdeLS1sb2dfZmlsZT0uKiQnLCBhcmcpKToKKyAgICAgIGlmIGFyZ3MuYWN0aW9uX25hbWUgPT0gJ3Rlc3RzJzoKKyAgICAgICAgYXJncy5leHRyYV9mbGFncy5hcHBlbmQoYXJnKQorICAgICAgICBjb250aW51ZQorICAgICAgZWxzZToKKyAgICAgICAgcHJpbnRfaGVscCgxLCAnJXMgaXMgb25seSB2YWxpZCBmb3IgdGVzdHMnICUgYXJnKQorICAgIGlmIGFyZ3MucGxhdGZvcm06CisgICAgICBhcmdzLnRhcmdldHMuYXBwZW5kKGFyZykKKyAgICBlbHNlOgorICAgICAgYXJncy5wbGF0Zm9ybSA9IGFyZworCisgIGlmIGFyZ3MucHJvY2Vzc29yID09ICdwcmltZSc6CisgICAgcHJvY2Vzc29yID0gUHJpbWVQcm9jZXNzb3IoYXJncy5mb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hY3Rpb25fbmFtZSA9PSAndGVzdHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYWN0aW9uX25hbWUgPT0gJ2RlcGxveScpCisgIGVsc2U6CisgICAgcHJpbnRfaGVscCgxLCBtZXNzYWdlPSdVbmtub3duIHByb2Nlc3NvciAiJXMiLicgJSBhcmdzLnByb2Nlc3NvcikKKworICB1bmtub3duX3BsYXRmb3JtX2Vycm9yID0gTm9uZQorICB0cnk6CisgICAgcGxhdGZvcm1zID0gcHJvY2Vzc29yLnBhcnNlX3BsYXRmb3JtcyhhcmdzLnBsYXRmb3JtKQorICBleGNlcHQgUHJvY2Vzc29yLlVua25vd25QbGF0Zm9ybSBhcyBlOgorICAgIHVua25vd25fcGxhdGZvcm1fZXJyb3IgPSBlLm1lc3NhZ2UKKyAgICBhcmdzLnRhcmdldHMuaW5zZXJ0KDAsIGFyZ3MucGxhdGZvcm0pCisgICAgcGxhdGZvcm1zID0gcHJvY2Vzc29yLnBhcnNlX3BsYXRmb3JtcyhOb25lKQorICBpZiBub3QgcGxhdGZvcm1zOgorICAgIHByaW50X2hlbHAoMSwgJ05vIHBsYXRmb3JtcyBzZWxlY3RlZCcpCisKKyAgcHJvY2Vzc29yLmNoZWNrX2luc3RhbGxlZChwbGF0Zm9ybXMsIGFyZ3MuYWN0aW9uX25hbWUgPT0gJ2RlcGxveScpCisgIHByb2Nlc3Nvci5kb3dubG9hZF9leHRlcm5hbHMocGxhdGZvcm1zKQorCisgIGNsYXNzIFRvb2xzQ29uZmlnKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgc2VsZi52YXJpYWJsZXMgPSB7J0FPUyc6IGFvc19wYXRoKCl9CisgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGFvc19wYXRoKCksICdidWlsZCcsICd0b29sc19jb25maWcnKSwgJ3InKSBhcyBmOgorICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgIGlmIGxpbmVbMF0gPT0gJyMnOgorICAgICAgICAgICAgcGFzcworICAgICAgICAgIGVsaWYgbGluZS5pc3NwYWNlKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld19uYW1lLCBuZXdfdmFsdWUgPSBsaW5lLnJzdHJpcCgpLnNwbGl0KCc9JykKKyAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzZWxmLnZhcmlhYmxlcy5pdGVtcygpOgorICAgICAgICAgICAgICBuZXdfdmFsdWUgPSBuZXdfdmFsdWUucmVwbGFjZSgnJHslc30nICUgbmFtZSwgdmFsdWUpCisgICAgICAgICAgICBzZWxmLnZhcmlhYmxlc1tuZXdfbmFtZV0gPSBuZXdfdmFsdWUKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgIHJldHVybiBzZWxmLnZhcmlhYmxlc1trZXldCisKKyAgdG9vbHNfY29uZmlnID0gVG9vbHNDb25maWcoKQorCisgIGRlZiBoYW5kbGVfY2xlYW5fZXJyb3IoZnVuY3Rpb24sIHBhdGgsIGV4Y2luZm8pOgorICAgIF8sIF8gPSBmdW5jdGlvbiwgcGF0aAorICAgIGlmIGlzc3ViY2xhc3MoT1NFcnJvciwgZXhjaW5mb1swXSk6CisgICAgICBpZiBleGNpbmZvWzFdLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgIyBXaG8gY2FyZXMgaWYgdGhlIGZpbGUgd2UncmUgZGVsZXRpbmcgaXNuJ3QgdGhlcmU/CisgICAgICAgIHJldHVybgorICAgIHJhaXNlIGV4Y2luZm9bMV0KKworICBkZWYgbmVlZF90b19ydW5fZ3lwKHBsYXRmb3JtKToKKyAgICAiIiJEZXRlcm1pbmVzIGlmIHdlIG5lZWQgdG8gcnVuIGd5cCBhZ2FpbiBvciBub3QuCisKKyAgICBUaGUgZ2VuZXJhdGVkIGJ1aWxkIGZpbGVzIGFyZSBzdXBwb3NlZCB0byByZS1ydW4gZ3lwIGFnYWluIHRoZW1zZWx2ZXMsIGJ1dAorICAgIHRoYXQgZG9lc24ndCB3b3JrIChvciBhdCBsZWFzdCBpdCB1c2VkIHRvIG5vdCkgYW5kIHdlIHNvbWV0aW1lcyB3YW50IHRvCisgICAgbW9kaWZ5IHRoZSByZXN1bHRzIGFueXdheXMuCisKKyAgICBBcmdzOgorICAgICAgcGxhdGZvcm06IFRoZSBwbGF0Zm9ybSB0byBjaGVjayBmb3IuCisgICAgIiIiCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBsYXRmb3JtLmJ1aWxkX25pbmphKCkpOgorICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBvcy5wYXRoLmdldG10aW1lKF9fZmlsZV9fKSA+IG9zLnBhdGguZ2V0bXRpbWUocGxhdGZvcm0uYnVpbGRfbmluamEoKSk6CisgICAgICByZXR1cm4gVHJ1ZQorICAgIGRpcnMgPSBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihhb3NfcGF0aCgpLCAnLi4nKSkKKyAgICAjIExvb2tpbmcgdGhyb3VnaCB0aGVzZSBmb2xkZXJzIHRha2VzIGEgbG9uZyB0aW1lIGFuZCBpc24ndCB1c2VmdWwuCisgICAgaWYgZGlycy5jb3VudCgnb3V0cHV0Jyk6CisgICAgICBkaXJzLnJlbW92ZSgnb3V0cHV0JykKKyAgICBpZiBkaXJzLmNvdW50KCcuZ2l0Jyk6CisgICAgICBkaXJzLnJlbW92ZSgnLmdpdCcpCisgICAgcmV0dXJuIG5vdCBub3Qgc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICgnZmluZCcsKSArIHR1cGxlKG9zLnBhdGguam9pbihhb3NfcGF0aCgpLCAnLi4nLCBkKSBmb3IgZCBpbiBkaXJzKQorICAgICAgICArICgnLW5ld2VyJywgcGxhdGZvcm0uYnVpbGRfbmluamEoKSwKKyAgICAgICAgICAgJygnLCAnLW5hbWUnLCAnKi5neXAnLCAnLW9yJywgJy1uYW1lJywgJyouZ3lwaScsICcpJyksCisgICAgICAgIHN0ZGluPW9wZW4ob3MuZGV2bnVsbCwgJ3InKSkKKworICBkZWYgZW52KHBsYXRmb3JtKToKKyAgICAiIiJNYWtlcyBzdXJlIHdlIHBhc3MgdGhyb3VnaCBpbXBvcnRhbnQgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMuCisKKyAgICBSZXR1cm5zOgorICAgICAgQW4gZW52aXJvbm1lbnQgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gc3VicHJvY2Vzcy5Qb3BlbiBhbmQgZnJpZW5kcy4KKyAgICAiIiIKKyAgICBidWlsZF9lbnYgPSBkaWN0KHBsYXRmb3JtLmJ1aWxkX2VudigpKQorICAgIGlmIG5vdCAnVEVSTScgaW4gYnVpbGRfZW52OgorICAgICAgYnVpbGRfZW52WydURVJNJ10gPSBvcy5lbnZpcm9uWydURVJNJ10KKyAgICBpZiBub3QgJ1BBVEgnIGluIGJ1aWxkX2VudjoKKyAgICAgIGJ1aWxkX2VudlsnUEFUSCddID0gb3MuZW52aXJvblsnUEFUSCddCisgICAgcmV0dXJuIGJ1aWxkX2VudgorCisgIHNvcnRlZF9wbGF0Zm9ybXMgPSBzb3J0X3BsYXRmb3JtcyhwbGF0Zm9ybXMpCisgIHVzZXJfb3V0cHV0KCdCdWlsZGluZyAlcy4uLicgJSBzdHJfcGxhdGZvcm1zKHNvcnRlZF9wbGF0Zm9ybXMpKQorCisgIGlmIGFyZ3MuYWN0aW9uX25hbWUgPT0gJ3Rlc3RzJzoKKyAgICBmb3Igc2FuaXRpemVyLCB3YXJuaW5nIGluIFByaW1lUHJvY2Vzc29yLlNBTklUSVpFUl9URVNUX1dBUk5JTkdTLml0ZW1zKCk6CisgICAgICB3YXJuZWRfYWJvdXQgPSBwbGF0Zm9ybXMgJiBwcm9jZXNzb3Iuc2VsZWN0X3BsYXRmb3JtcyhzYW5pdGl6ZXI9c2FuaXRpemVyKQorICAgICAgaWYgd2FybmVkX2Fib3V0OgorICAgICAgICB1c2VyX291dHB1dCh3YXJuaW5nWzFdKQorICAgICAgICBpZiB3YXJuaW5nWzBdOgorICAgICAgICAgICMgVE9ETyhicmlhbnMpOiBBZGQgYSAtLWZvcmNlIGZsYWcgb3Igc29tZXRoaW5nIHRvIG92ZXJyaWRlIHRoaXM/CisgICAgICAgICAgdXNlcl9vdXRwdXQoJ1JlZnVzaW5nIHRvIHJ1biB0ZXN0cyBmb3Igc2FuaXRpemVyICVzLicgJSBzYW5pdGl6ZXIpCisgICAgICAgICAgZXhpdCgxKQorCisgIG51bSA9IDEKKyAgZm9yIHBsYXRmb3JtIGluIHNvcnRlZF9wbGF0Zm9ybXM6CisgICAgdXNlcl9vdXRwdXQoJ0J1aWxkaW5nICVzICglZC8lZCkuLi4nICUgKHBsYXRmb3JtLCBudW0sIGxlbihwbGF0Zm9ybXMpKSkKKyAgICBpZiBhcmdzLmFjdGlvbl9uYW1lID09ICdjbGVhbic6CisgICAgICBzaHV0aWwucm10cmVlKHBsYXRmb3JtLm91dGRpcigpLCBvbmVycm9yPWhhbmRsZV9jbGVhbl9lcnJvcikKKyAgICBlbGlmIGFyZ3MuYWN0aW9uX25hbWUgPT0gJ2Vudmlyb25tZW50JzoKKyAgICAgIHVzZXJfb3V0cHV0KCdFbnZpcm9ubWVudCBmb3IgYnVpbGRpbmcgPDxFTkQnKQorICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGVudihwbGF0Zm9ybSkuaXRlbXMoKToKKyAgICAgICAgcHJpbnQoJyVzPSVzJyAlIChuYW1lLCB2YWx1ZSkpCisgICAgICBwcmludCgnRU5EJykKKyAgICBlbHNlOgorICAgICAgaWYgbmVlZF90b19ydW5fZ3lwKHBsYXRmb3JtKToKKyAgICAgICAgdXNlcl9vdXRwdXQoJ1J1bm5pbmcgZ3lwLi4uJykKKyAgICAgICAgZ3lwID0gc3VicHJvY2Vzcy5Qb3BlbigKKyAgICAgICAgICAgICh0b29sc19jb25maWdbJ0dZUCddLAorICAgICAgICAgICAgICctLWNoZWNrJywKKyAgICAgICAgICAgICAnLS1kZXB0aD0lcycgJSBvcy5wYXRoLmpvaW4oYW9zX3BhdGgoKSwgJy4uJyksCisgICAgICAgICAgICAgJy0tbm8tY2lyY3VsYXItY2hlY2snLAorICAgICAgICAgICAgICctZicsICduaW5qYScsCisgICAgICAgICAgICAgJy1JJXMnICUgb3MucGF0aC5qb2luKGFvc19wYXRoKCksICdidWlsZCcsICdhb3MuZ3lwaScpLAorICAgICAgICAgICAgICctSS9kZXYvc3RkaW4nLCAnLUdvdXRwdXRfZGlyPW91dHB1dCcsCisgICAgICAgICAgICAgJy1ET1M9JXMnICUgcGxhdGZvcm0ub3MoKSwKKyAgICAgICAgICAgICAnLURQTEFURk9STT0lcycgJSBwbGF0Zm9ybS5neXBfcGxhdGZvcm0oKSwKKyAgICAgICAgICAgICAnLURBUkNISVRFQ1RVUkU9JXMnICUgcGxhdGZvcm0uYXJjaGl0ZWN0dXJlKCksCisgICAgICAgICAgICAgJy1EQ09NUElMRVI9JXMnICUgcGxhdGZvcm0uY29tcGlsZXIoKS5zcGxpdCgnXycpWzBdLAorICAgICAgICAgICAgICctREZVTExfQ09NUElMRVI9JXMnICUgcGxhdGZvcm0uY29tcGlsZXIoKSwKKyAgICAgICAgICAgICAnLURERUJVRz0lcycgJSAoJ3llcycgaWYgcGxhdGZvcm0uZGVidWcoKSBlbHNlICdubycpLAorICAgICAgICAgICAgICctRFNBTklUSVpFUj0lcycgJSBwbGF0Zm9ybS5zYW5pdGl6ZXIoKSwKKyAgICAgICAgICAgICAnLURFWFRFUk5BTFNfRVhUUkE9JXMnICUKKyAgICAgICAgICAgICAoJy1mUElFJyBpZiBwbGF0Zm9ybS5zYW5pdGl6ZXIoKSBpbiBQcmltZVByb2Nlc3Nvci5QSUVfU0FOSVRJWkVSUworICAgICAgICAgICAgICBlbHNlICcnKSkgKworICAgICAgICAgICAgcHJvY2Vzc29yLmV4dHJhX2d5cF9mbGFncygpICsgKGFyZ3MubWFpbl9neXAsKSwKKyAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgZ3lwLmNvbW11bmljYXRlKCgiIiIKK3sKKyAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKKyAgICAnY29uZmlndXJhdGlvbnMnOiB7CisgICAgICAnJXMnOiB7fQorICAgIH0KKyAgfQorfSIiIiAlIHBsYXRmb3JtLm91dG5hbWUoKSkuZW5jb2RlKCkpCisgICAgICAgIGlmIGd5cC5yZXR1cm5jb2RlOgorICAgICAgICAgIHVzZXJfb3V0cHV0KCJSdW5uaW5nIGd5cCBmYWlsZWQhIikKKyAgICAgICAgICBleGl0KDEpCisgICAgICAgIHByb2Nlc3Nvci5tb2RpZnlfbmluamFfZmlsZShwbGF0Zm9ybS5idWlsZF9uaW5qYSgpKQorICAgICAgICB1c2VyX291dHB1dCgnRG9uZSBydW5uaW5nIGd5cCcpCisgICAgICBlbHNlOgorICAgICAgICB1c2VyX291dHB1dCgiTm90IHJ1bm5pbmcgZ3lwIikKKworICAgICAgdHJ5OgorICAgICAgICBjYWxsID0gKHRvb2xzX2NvbmZpZ1snTklOSkEnXSwKKyAgICAgICAgICAgICAgICAnLUMnLCBwbGF0Zm9ybS5vdXRkaXIoKSkgKyB0dXBsZShhcmdzLnRhcmdldHMpCisgICAgICAgIGlmIGFyZ3Muam9iczoKKyAgICAgICAgICBjYWxsICs9ICgnLWonLCBzdHIoYXJncy5qb2JzKSkKKyAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKGNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1vcGVuKG9zLmRldm51bGwsICdyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52KHBsYXRmb3JtKSkKKyAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgorICAgICAgICBpZiB1bmtub3duX3BsYXRmb3JtX2Vycm9yIGlzIG5vdCBOb25lOgorICAgICAgICAgIHVzZXJfb3V0cHV0KHVua25vd25fcGxhdGZvcm1fZXJyb3IpCisgICAgICAgIHJhaXNlIGUKKworICAgIGlmIGFyZ3MuYWN0aW9uX25hbWUgPT0gJ2RlcGxveSc6CisgICAgICBwbGF0Zm9ybS5kZXBsb3koYXJncy5kcnlfcnVuKQorICAgIGVsaWYgYXJncy5hY3Rpb25fbmFtZSA9PSAndGVzdHMnOgorICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihwbGF0Zm9ybS5vdXRkaXIoKSwgJ3Rlc3RzJykKKyAgICAgIGRvbmVfcXVldWUgPSBxdWV1ZS5RdWV1ZSgpCisgICAgICBydW5uaW5nID0gW10KKyAgICAgIHRlc3Rfc3RhcnRfc2VtYXBob3JlID0gdGhyZWFkaW5nLlNlbWFwaG9yZShhcmdzLmpvYnMpCisgICAgICBpZiBhcmdzLnRhcmdldHM6CisgICAgICAgIHRvX3J1biA9IFtdCisgICAgICAgIGZvciB0YXJnZXQgaW4gYXJncy50YXJnZXRzOgorICAgICAgICAgIGlmIHRhcmdldC5lbmRzd2l0aCgnX3Rlc3QnKToKKyAgICAgICAgICAgIHRvX3J1bi5hcHBlbmQodGFyZ2V0KQorICAgICAgZWxzZToKKyAgICAgICAgdG9fcnVuID0gb3MubGlzdGRpcihkaXJuYW1lKQorICAgICAgZm9yIGYgaW4gdG9fcnVuOgorICAgICAgICB0aHJlYWQgPSBUZXN0VGhyZWFkKG9zLnBhdGguam9pbihkaXJuYW1lLCBmKSwgdHVwbGUoYXJncy5leHRyYV9mbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52KHBsYXRmb3JtKSwgZG9uZV9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N0YXJ0X3NlbWFwaG9yZSkKKyAgICAgICAgcnVubmluZy5hcHBlbmQodGhyZWFkKQorICAgICAgICB0aHJlYWQuc3RhcnQoKQorICAgICAgdHJ5OgorICAgICAgICB3aGlsZSBydW5uaW5nOgorICAgICAgICAgIGRvbmUgPSBkb25lX3F1ZXVlLmdldCgpCisgICAgICAgICAgcnVubmluZy5yZW1vdmUoZG9uZSkKKyAgICAgICAgICB3aXRoIHRlc3Rfb3V0cHV0X2xvY2s6CisgICAgICAgICAgICB0ZXN0X291dHB1dCgnT3V0cHV0IGZyb20gdGVzdCAlczonICUgZG9uZS5uYW1lKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBkb25lLm91dHB1dC5nZXQoRmFsc2UpCisgICAgICAgICAgICAgICAgaWYgbm90IHN5cy5zdGRvdXQuaXNhdHR5KCk6CisgICAgICAgICAgICAgICAgICAjIFJlbW92ZSBjb2xvciBlc2NhcGUgY29kZXMuCisgICAgICAgICAgICAgICAgICBsaW5lID0gcmUuc3ViKHInXHgxQlxbWzAtOTtdKlthLXpBLVpdJywgJycsIGxpbmUpCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShsaW5lKQorICAgICAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBpZiBub3QgZG9uZS5yZXR1cm5jb2RlOgorICAgICAgICAgICAgICB0ZXN0X291dHB1dCgnVGVzdCAlcyBzdWNjZWVkZWQnICUgZG9uZS5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgaWYgZG9uZS5yZXR1cm5jb2RlIDwgMDoKKyAgICAgICAgICAgICAgICBzaWcgPSAtZG9uZS5yZXR1cm5jb2RlCisgICAgICAgICAgICAgICAgdGVzdF9vdXRwdXQoJ1Rlc3QgJXMgd2FzIGtpbGxlZCBieSBzaWduYWwgJWQgKCVzKScgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvbmUubmFtZSwgc2lnLCBzdHJzaWduYWwoc2lnKSkpCisgICAgICAgICAgICAgIGVsaWYgZG9uZS5yZXR1cm5jb2RlICE9IDE6CisgICAgICAgICAgICAgICAgdGVzdF9vdXRwdXQoJ1Rlc3QgJXMgZXhpdGVkIHdpdGggJWQnICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb25lLm5hbWUsIGRvbmUucmV0dXJuY29kZSkpCisgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGVzdF9vdXRwdXQoJ1Rlc3QgJXMgZmFpbGVkJyAlIGRvbmUubmFtZSkKKyAgICAgICAgICAgICAgdXNlcl9vdXRwdXQoJ0Fib3J0aW5nIGJlY2F1c2Ugb2YgdGVzdCBmYWlsdXJlIGZvciAlcy4nICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSkKKyAgICAgICAgICAgICAgZXhpdCgxKQorICAgICAgZmluYWxseToKKyAgICAgICAgaWYgcnVubmluZzoKKyAgICAgICAgICB0ZXN0X291dHB1dCgnS2lsbGluZyBvdGhlciB0ZXN0cy4uLicpCisjIFN0b3AgYWxsIG9mIHRoZW0gYmVmb3JlIGtpbGxpbmcgcHJvY2Vzc2VzIGJlY2F1c2Ugb3RoZXJ3aXNlIHN0b3BwaW5nIHNvbWUgb2YKKyMgdGhlbSB0ZW5kcyB0byBsZXQgb3RoZXIgb25lcyB0aGF0IGFyZSB3YWl0aW5nIHRvIHN0YXJ0IGdvLgorICAgICAgICAgIGZvciB0aHJlYWQgaW4gcnVubmluZzoKKyAgICAgICAgICAgIHRocmVhZC5zdG9wKCkKKyAgICAgICAgICBmb3IgdGhyZWFkIGluIHJ1bm5pbmc6CisgICAgICAgICAgICB0ZXN0X291dHB1dCgnXHRLaWxsaW5nICVzJyAlIHRocmVhZC5uYW1lKQorICAgICAgICAgICAgdGhyZWFkLmtpbGxfcHJvY2VzcygpCisgICAgICAgICAgICB0aHJlYWQua2lsbF9wcm9jZXNzKCkKKyAgICAgICAgICB0ZXN0X291dHB1dCgnV2FpdGluZyBmb3Igb3RoZXIgdGVzdHMgdG8gZGllJykKKyAgICAgICAgICBmb3IgdGhyZWFkIGluIHJ1bm5pbmc6CisgICAgICAgICAgICB0aHJlYWQua2lsbF9wcm9jZXNzKCkKKyAgICAgICAgICAgIHRocmVhZC5qb2luKCkKKyAgICAgICAgICB0ZXN0X291dHB1dCgnRG9uZSBraWxsaW5nIG90aGVyIHRlc3RzJykKKworICAgIHVzZXJfb3V0cHV0KCdEb25lIGJ1aWxkaW5nICVzICglZC8lZCknICUgKHBsYXRmb3JtLCBudW0sIGxlbihwbGF0Zm9ybXMpKSkKKyAgICBudW0gKz0gMQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9kb3dubG9hZF9leHRlcm5hbHMuc2ggYi9hb3MvYnVpbGQvZG93bmxvYWRfZXh0ZXJuYWxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhNDlmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvZG93bmxvYWRfZXh0ZXJuYWxzLnNoCkBAIC0wLDAgKzEsMjIyIEBACisjIS9iaW4vYmFzaAorCisjc2V0IC14CitzZXQgLWUKKworQU9TPSQocmVhZGxpbmsgLWYgJChkaXJuYW1lICQwKS8uLikKKy4gJChkaXJuYW1lICQwKS90b29sc19jb25maWcKKworIyBBIHNlcGFyYXRlIHZhcmlhYmxlIGZvciBzdHVmZiB0aGF0IHNob3VsZCBiZSBpbiBMREZMQUdTIGZvciBldmVyeXRoaW5nIGJlY2F1c2UKKyMgdGhlIHZhbHVlIGZyb20gQ09ORklHVVJFX0ZMQUdTIGhhcyB0byBnZXQgb3ZlcnJpZGVuIGluIHNvbWUgcGxhY2VzLgorQUxMX0xERkxBR1M9IiIKKworIyBGbGFncyB0aGF0IHNob3VsZCBnZXQgcGFzc2VkIHRvIGFsbCBjb25maWd1cmUgc2NyaXB0cy4KKyMgU29tZSBvZiB0aGVtIG5lZWQgdG8gc2V0IExERkxBR1Mgc2VwYXJhdGVseSB0byB3b3JrIGFyb3VuZCBzdHVwaWQgY29uZmlndXJlCisjIHNjcmlwdHMsIHNvIHdlIGNhbid0IGp1c3Qgc2V0IHRoYXQgaGVyZS4KK0NPTkZJR1VSRV9GTEFHUz0iIgorCitpZiBbICIkMSIgPT0gImFybSIgXTsgdGhlbgorICBDT01QSUxFRD0ke0VYVEVSTkFMU30vLi4vY29tcGlsZWQtYXJtCisKKyAgQ1JPU1NfQ09NUElMRT1hcm0tbGludXgtZ251ZWFiaWhmLQorCisgIGV4cG9ydCBDQz0ke0NST1NTX0NPTVBJTEV9Z2NjLTQuNworICBleHBvcnQgQ1hYPSR7Q1JPU1NfQ09NUElMRX1nKystNC43CisgIGV4cG9ydCBDRkxBR1M9Ii1tY3B1PWNvcnRleC1hOCAtbWZwdT1uZW9uIgorICBleHBvcnQgQ1hYRkxBR1M9Ii1tY3B1PWNvcnRleC1hOCAtbWZwdT1uZW9uIgorICBleHBvcnQgT0JKRFVNUD0ke0NST1NTX0NPTVBJTEV9b2JqZHVtcAorICBDT05GSUdVUkVfRkxBR1M9Ii0taG9zdD1hcm0tbGludXgtZ251ZWFiaWhmIENDPSR7Q0N9IENYWD0ke0NYWH0gQ0ZMQUdTPVwiJHtDRkxBR1N9XCIgQ1hYRkxBR1M9XCIke0NYWEZMQUdTfVwiIE9CSkRVTVA9JHtPQkpEVU1QfSIKK2VsaWYgWyAiJDEiID09ICJhcm1fZnJjIiBdOyB0aGVuCisgIENPTVBJTEVEPSR7RVhURVJOQUxTfS8uLi9jb21waWxlZC1hcm1fZnJjCisKKyAgQ1JPU1NfQ09NUElMRT1hcm0tZnJjLWxpbnV4LWdudWVhYmktCisKKyAgZXhwb3J0IENDPSR7Q1JPU1NfQ09NUElMRX1nY2MtNC45CisgIGV4cG9ydCBDWFg9JHtDUk9TU19DT01QSUxFfWcrKy00LjkKKyAgZXhwb3J0IENGTEFHUz0iLW1jcHU9Y29ydGV4LWE5IC1tZnB1PW5lb24gLW1mbG9hdC1hYmk9c29mdGZwIgorICBleHBvcnQgQ1hYRkxBR1M9Ii1tY3B1PWNvcnRleC1hOSAtbWZwdT1uZW9uIC1tZmxvYXQtYWJpPXNvZnRmcCIKKyAgZXhwb3J0IE9CSkRVTVA9JHtDUk9TU19DT01QSUxFfW9iamR1bXAKKyAgQ09ORklHVVJFX0ZMQUdTPSItLWhvc3Q9YXJtLWZyYy1saW51eC1nbnVlYWJpIENDPSR7Q0N9IENYWD0ke0NYWH0gQ0ZMQUdTPVwiJHtDRkxBR1N9XCIgQ1hYRkxBR1M9XCIke0NYWEZMQUdTfVwiIE9CSkRVTVA9JHtPQkpEVU1QfSIKK2VsaWYgWyAiJDEiID09ICJhbWQ2NCIgXTsgdGhlbgorICBDT01QSUxFRD0ke0VYVEVSTkFMU30vLi4vY29tcGlsZWQtYW1kNjQKK2VsaWYgWyAiJDEiID09ICJhbWQ2NC1mUElFIiBdOyB0aGVuCisgIENPTVBJTEVEPSR7RVhURVJOQUxTfS8uLi9jb21waWxlZC1hbWQ2NC1mUElFCisKKyAgZXhwb3J0IENGTEFHUz0iLWZQSUUiCisgIGV4cG9ydCBDWFhGTEFHUz0iLWZQSUUiCisgIEFMTF9MREZMQUdTPSItZlBJRSIKKyAgZXhwb3J0IExERkxBR1M9JHtBTExfTERGTEFHU30KKyAgQ09ORklHVVJFX0ZMQUdTPSJDRkxBR1M9XCIke0NGTEFHU31cIiBDWFhGTEFHUz1cIiR7Q1hYRkxBR1N9XCIgTERGTEFHUz1cIiR7TERGTEFHU31cIiIKK2Vsc2UKKyAgZWNobyAiVW5rbm93biBwbGF0Zm9ybSAkMSB0byBkb3dubG9hZCBleHRlcm5hbHMgZm9yLiIgMT4mMgorICBleGl0IDEKK2ZpCisKK1RNUERJUj0vdG1wLyQkLWFvcy10bXBkaXIKK21rZGlyIC1wICR7RVhURVJOQUxTfQorW1sgLW4gIiR7Q09NUElMRUR9IiBdXSAmJiBta2RpciAtcCAke0NPTVBJTEVEfQorCisjIGdldCBhbmQgYnVpbGQgbmluamEKK1sgLWQgJHtOSU5KQV9ESVJ9IF0gfHwgZ2l0IGNsb25lIC0tYnJhbmNoICR7TklOSkFfUkVMRUFTRX0gaHR0cHM6Ly9naXRodWIuY29tL21hcnRpbmUvbmluamEuZ2l0ICR7TklOSkFfRElSfQorWyAteCAke05JTkpBfSBdIHx8IGVudiAtaSAiUEFUSD0kUEFUSCIgJHtOSU5KQV9ESVJ9L2Jvb3RzdHJhcC5weQorCisjIGdldCBneXAKK1sgLWQgJHtHWVBfRElSfSBdIHx8ICggc3ZuIGNvIGh0dHA6Ly9neXAuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rIC1yICR7R1lQX1JFVklTSU9OfSAke0dZUF9ESVJ9ICYmIHBhdGNoIC1wMSAtZCAke0dZUF9ESVJ9IDwgJHtBT1N9L2V4dGVybmFscy9neXAucGF0Y2ggKQorCisjIGdldCBlaWdlbgorRUlHRU5fVkVSU0lPTj0zLjIuMQorRUlHRU5fRElSPSR7RVhURVJOQUxTfS9laWdlbi0ke0VJR0VOX1ZFUlNJT059CitbIC1mICR7RUlHRU5fRElSfS50YXIuYnoyIF0gfHwgd2dldCBodHRwOi8vYml0YnVja2V0Lm9yZy9laWdlbi9laWdlbi9nZXQvJHtFSUdFTl9WRVJTSU9OfS50YXIuYnoyIC1PICR7RUlHRU5fRElSfS50YXIuYnoyCitbIC1kICR7RUlHRU5fRElSfSBdIHx8ICggbWtkaXIgJHtFSUdFTl9ESVJ9ICYmIHRhciAtLXN0cmlwLWNvbXBvbmVudHM9MSAtQyAke0VJR0VOX0RJUn0gLXhmICR7RUlHRU5fRElSfS50YXIuYnoyICkKKworIyBnZXQgZ3Rlc3QKK0dURVNUX1ZFUlNJT049MS42LjAKK0dURVNUX0RJUj0ke0VYVEVSTkFMU30vZ3Rlc3QtJHtHVEVTVF9WRVJTSU9OfS1wMgorR1RFU1RfWklQPSR7RVhURVJOQUxTfS9ndGVzdC0ke0dURVNUX1ZFUlNJT059LnppcAorWyAtZiAke0dURVNUX1pJUH0gXSB8fCB3Z2V0IGh0dHA6Ly9nb29nbGV0ZXN0Lmdvb2dsZWNvZGUuY29tL2ZpbGVzL2d0ZXN0LSR7R1RFU1RfVkVSU0lPTn0uemlwIC1PICR7R1RFU1RfWklQfQorWyAtZCAke0dURVNUX0RJUn0gXSB8fCAoIHVuemlwICR7R1RFU1RfWklQfSAtZCAke1RNUERJUn0gJiYgbXYgJHtUTVBESVJ9L2d0ZXN0LSR7R1RFU1RfVkVSU0lPTn0gJHtHVEVTVF9ESVJ9ICYmIGNkICR7R1RFU1RfRElSfSAmJiBwYXRjaCAtcDEgPCAke0FPU30vZXh0ZXJuYWxzL2d0ZXN0LnBhdGNoICkKKworIyBnZXQgYW5kIGJ1aWxkIGxpYmpwZWcKK0xJQkpQRUdfVkVSU0lPTj04ZAorTElCSlBFR19ESVI9JHtDT01QSUxFRH0vanBlZy0ke0xJQkpQRUdfVkVSU0lPTn0KKyMgTk9URTogdGhpcyBkaXJlY3RvcnkgZW5kcyB1cCBpbiAjaW5jbHVkZSBuYW1lcworTElCSlBFR19QUkVGSVg9JHtDT01QSUxFRH0vbGlianBlZworTElCSlBFR19MSUI9JHtMSUJKUEVHX1BSRUZJWH0vbGliL2xpYmpwZWcuYQorTElCSlBFR19UQVI9JHtFWFRFUk5BTFN9L2pwZWdzcmMudiR7TElCSlBFR19WRVJTSU9OfS50YXIuZ3oKK1sgLWYgJHtMSUJKUEVHX1RBUn0gXSB8fCB3Z2V0IGh0dHA6Ly93d3cuaWpnLm9yZy9maWxlcy9qcGVnc3JjLnYke0xJQkpQRUdfVkVSU0lPTn0udGFyLmd6IC1PICR7TElCSlBFR19UQVJ9CitbIC1kICR7TElCSlBFR19ESVJ9IF0gfHwgKCBta2RpciAke0xJQkpQRUdfRElSfSAmJiB0YXIgLS1zdHJpcC1jb21wb25lbnRzPTEgLUMgJHtMSUJKUEVHX0RJUn0gLXhmICR7TElCSlBFR19UQVJ9ICkKK1sgLWYgJHtMSUJKUEVHX0xJQn0gXSB8fCBiYXNoIC1jIFwKKwkiY2QgJHtMSUJKUEVHX0RJUn0gJiYgLi9jb25maWd1cmUgLS1kaXNhYmxlLXNoYXJlZCBcCisJJHtDT05GSUdVUkVfRkxBR1N9IC0tcHJlZml4PWByZWFkbGluayAtZiAke0xJQkpQRUdfUFJFRklYfWAgXAorCSYmIG1ha2UgJiYgbWFrZSBpbnN0YWxsIgorCisjIGdldCBhbmQgYnVpbGQgY3RlbXBsYXRlCisjIFRoaXMgaXMgdGhlIG5leHQgcmV2aXNpb24gYWZ0ZXIgdGhlIDIuMiByZWxlYXNlIGFuZCBpdCBvbmx5IGFkZHMgc3BhY2VzIHRvCisjIG1ha2UgZ2NjIDQuNyB3aXRoIC0tc3RkPWMrKzExIGhhcHB5ICh1c2VyLWRlZmluZWQgc3RyaW5nIGxpdGVyYWxzLi4uKS4KK0NURU1QTEFURV9WRVJTSU9OPTEyOQorQ1RFTVBMQVRFX1RBUj0ke0VYVEVSTkFMU30vY3RlbXBsYXRlLSR7Q1RFTVBMQVRFX1ZFUlNJT059LnRhci5negorQ1RFTVBMQVRFX0RJUj0ke0NPTVBJTEVEfS9jdGVtcGxhdGUtJHtDVEVNUExBVEVfVkVSU0lPTn0KK0NURU1QTEFURV9QUkVGSVg9JHtDVEVNUExBVEVfRElSfS1wcmVmaXgKK0NURU1QTEFURV9MSUI9JHtDVEVNUExBVEVfUFJFRklYfS9saWIvbGliY3RlbXBsYXRlLmEKK0NURU1QTEFURV9VUkw9aHR0cDovL2N0ZW1wbGF0ZS5nb29nbGVjb2RlLmNvbQoraWYgW1sgIiR7Q1RFTVBMQVRFX1ZFUlNJT059IiA9fiAvXC4vIF1dOyB0aGVuCisJQ1RFTVBMQVRFX1VSTD0ke0NURU1QTEFURV9VUkx9L2ZpbGVzL2N0ZW1wbGF0ZS0ke0NURU1QTEFURV9WRVJTSU9OfS50YXIuZ3oKKwlbIC1mICR7Q1RFTVBMQVRFX1RBUn0gXSB8fCBcCisJCXdnZXQgJHtDVEVNUExBVEVfVVJMfSAtTyAke0NURU1QTEFURV9UQVJ9CisJWyAtZCAke0NURU1QTEFURV9ESVJ9IF0gfHwgKCBta2RpciAke0NURU1QTEFURV9ESVJ9ICYmIHRhciBcCisJCS0tc3RyaXAtY29tcG9uZW50cz0xIC1DICR7Q1RFTVBMQVRFX0RJUn0gLXhmICR7Q1RFTVBMQVRFX1RBUn0gKQorZWxzZQorCUNURU1QTEFURV9VUkw9JHtDVEVNUExBVEVfVVJMfS9zdm4vdHJ1bmsKKwlbIC1kICR7Q1RFTVBMQVRFX0RJUn0gXSB8fCBcCisJCXN2biBjaGVja291dCAke0NURU1QTEFURV9VUkx9IC1yICR7Q1RFTVBMQVRFX1ZFUlNJT059ICR7Q1RFTVBMQVRFX0RJUn0KK2ZpCitbIC1mICR7Q1RFTVBMQVRFX0xJQn0gXSB8fCBiYXNoIC1jICJjZCAke0NURU1QTEFURV9ESVJ9ICYmIFwKKwkuL2NvbmZpZ3VyZSAtLWRpc2FibGUtc2hhcmVkIFwKKwkke0NPTkZJR1VSRV9GTEFHU30gLS1wcmVmaXg9YHJlYWRsaW5rIC1mICR7Q1RFTVBMQVRFX1BSRUZJWH1gIFwKKwkmJiBtYWtlICYmIG1ha2UgaW5zdGFsbCIKKworIyBnZXQgYW5kIGJ1aWxkIGdmbGFncworR0ZMQUdTX1ZFUlNJT049Mi4wCitHRkxBR1NfVEFSPSR7RVhURVJOQUxTfS9nZmxhZ3MtJHtHRkxBR1NfVkVSU0lPTn0udGFyLmd6CitHRkxBR1NfRElSPSR7Q09NUElMRUR9L2dmbGFncy0ke0dGTEFHU19WRVJTSU9OfQorR0ZMQUdTX1BSRUZJWD0ke0dGTEFHU19ESVJ9LXByZWZpeAorR0ZMQUdTX0xJQj0ke0dGTEFHU19QUkVGSVh9L2xpYi9saWJnZmxhZ3MuYQorR0ZMQUdTX1VSTD1odHRwczovL2dmbGFncy5nb29nbGVjb2RlLmNvbS9maWxlcy9nZmxhZ3MtJHtHRkxBR1NfVkVSU0lPTn0udGFyLmd6CitbIC1mICR7R0ZMQUdTX1RBUn0gXSB8fCB3Z2V0ICR7R0ZMQUdTX1VSTH0gLU8gJHtHRkxBR1NfVEFSfQorWyAtZCAke0dGTEFHU19ESVJ9IF0gfHwgKCBta2RpciAke0dGTEFHU19ESVJ9ICYmIHRhciBcCisgIC0tc3RyaXAtY29tcG9uZW50cz0xIC1DICR7R0ZMQUdTX0RJUn0gLXhmICR7R0ZMQUdTX1RBUn0gKQorWyAtZiAke0dGTEFHU19MSUJ9IF0gfHwgYmFzaCAtYyAiY2QgJHtHRkxBR1NfRElSfSAmJiAuL2NvbmZpZ3VyZSBcCisgICR7Q09ORklHVVJFX0ZMQUdTfSAtLXByZWZpeD1gcmVhZGxpbmsgLWYgJHtHRkxBR1NfUFJFRklYfWAgXAorICAmJiBtYWtlICYmIG1ha2UgaW5zdGFsbCIKKworIyBnZXQgYW5kIGJ1aWxkIGxpYmV2ZW50CitMSUJFVkVOVF9WRVJTSU9OPTIuMC4yMQorTElCRVZFTlRfVEFSPSR7RVhURVJOQUxTfS9saWJldmVudC0ke0xJQkVWRU5UX1ZFUlNJT059LnRhci5negorTElCRVZFTlRfRElSPSR7Q09NUElMRUR9L2xpYmV2ZW50LSR7TElCRVZFTlRfVkVSU0lPTn0KK0xJQkVWRU5UX1BSRUZJWD0ke0xJQkVWRU5UX0RJUn0tcHJlZml4CitMSUJFVkVOVF9MSUI9JHtMSUJFVkVOVF9QUkVGSVh9L2xpYi9saWJldmVudC5hCitMSUJFVkVOVF9VUkw9aHR0cHM6Ly9naXRodWIuY29tL2Rvd25sb2Fkcy9saWJldmVudC9saWJldmVudAorTElCRVZFTlRfVVJMPSR7TElCRVZFTlRfVVJMfS9saWJldmVudC0ke0xJQkVWRU5UX1ZFUlNJT059LXN0YWJsZS50YXIuZ3oKK1sgLWYgJHtMSUJFVkVOVF9UQVJ9IF0gfHwgd2dldCAke0xJQkVWRU5UX1VSTH0gLU8gJHtMSUJFVkVOVF9UQVJ9CitbIC1kICR7TElCRVZFTlRfRElSfSBdIHx8ICggbWtkaXIgJHtMSUJFVkVOVF9ESVJ9ICYmIHRhciBcCisgIC0tc3RyaXAtY29tcG9uZW50cz0xIC1DICR7TElCRVZFTlRfRElSfSAteGYgJHtMSUJFVkVOVF9UQVJ9ICkKK1sgLWYgJHtMSUJFVkVOVF9MSUJ9IF0gfHwgYmFzaCAtYyAiY2QgJHtMSUJFVkVOVF9ESVJ9ICYmIC4vY29uZmlndXJlIFwKKwkke0NPTkZJR1VSRV9GTEFHU30gLS1wcmVmaXg9YHJlYWRsaW5rIC1mICR7TElCRVZFTlRfUFJFRklYfWAgXAorCSYmIG1ha2UgJiYgbWFrZSBpbnN0YWxsIgorCisjIGdldCBhbmQgYnVpbGQgZ21wCitHTVBfVkVSU0lPTj01LjEuMworR01QX1RBUj0ke0VYVEVSTkFMU30vZ21wLSR7R01QX1ZFUlNJT059LnRhci5segorR01QX0RJUj0ke0NPTVBJTEVEfS9nbXAtJHtHTVBfVkVSU0lPTn0KK0dNUF9QUkVGSVg9JHtHTVBfRElSfS1wcmVmaXgKK0dNUF9MSUI9JHtHTVBfUFJFRklYfS9saWIvbGliZ21wLmEKK0dNUF9VUkw9aHR0cHM6Ly9nbXBsaWIub3JnL2Rvd25sb2FkL2dtcC9nbXAtJHtHTVBfVkVSU0lPTn0udGFyLmx6CitbIC1mICR7R01QX1RBUn0gXSB8fCB3Z2V0ICR7R01QX1VSTH0gLU8gJHtHTVBfVEFSfQorWyAtZCAke0dNUF9ESVJ9IF0gfHwgKCBta2RpciAke0dNUF9ESVJ9ICYmIHRhciBcCisJLS1zdHJpcC1jb21wb25lbnRzPTEgLUMgJHtHTVBfRElSfSAteGYgJHtHTVBfVEFSfSApCitbIC1mICR7R01QX0xJQn0gXSB8fCBiYXNoIC1jICJjZCAke0dNUF9ESVJ9ICYmIC4vY29uZmlndXJlIFwKKwkke0NPTkZJR1VSRV9GTEFHU30gLS1wcmVmaXg9JChyZWFkbGluayAtZiAke0dNUF9QUkVGSVh9KSBcCisJJiYgbWFrZSAmJiBtYWtlIGluc3RhbGwiCisKKyMgZ2V0IGFuZCBidWlsZCBsaWJjZGQKK0xJQkNERF9WRVJTSU9OPTA5NGcKK0xJQkNERF9UQVI9JHtFWFRFUk5BTFN9L2xpYmNkZC0ke0xJQkNERF9WRVJTSU9OfS50YXIuZ3oKK0xJQkNERF9ESVI9JHtDT01QSUxFRH0vbGliY2RkLSR7TElCQ0REX1ZFUlNJT059CitMSUJDRERfUFJFRklYPSR7TElCQ0REX0RJUn0tcHJlZml4CitMSUJDRERfTElCPSR7TElCQ0REX1BSRUZJWH0vbGliL2xpYmNkZC5hCitMSUJDRERfVVJMPWZ0cDovL2Z0cC5pZm9yLm1hdGguZXRoei5jaC9wdWIvZnVrdWRhL2NkZC9jZGRsaWItJHtMSUJDRERfVkVSU0lPTn0udGFyLmd6CitbIC1mICR7TElCQ0REX1RBUn0gXSB8fCBcCisgICAgICAgIHdnZXQgJHtMSUJDRERfVVJMfSAtTyAke0xJQkNERF9UQVJ9CitbIC1kICR7TElCQ0REX0RJUn0gXSB8fCAoIG1rZGlyICR7TElCQ0REX0RJUn0gJiYgdGFyIFwKKyAgICAgICAgLS1zdHJpcC1jb21wb25lbnRzPTEgLUMgJHtMSUJDRERfRElSfSAteGYgJHtMSUJDRERfVEFSfSApCitbIC1mICR7TElCQ0REX0xJQn0gXSB8fCBcCisJYmFzaCAtYyAiY2QgJHtMSUJDRERfRElSfSAmJiAuL2NvbmZpZ3VyZSBcCisJLS1kaXNhYmxlLXNoYXJlZCAke0NPTkZJR1VSRV9GTEFHU30gXAorCUxERkxBR1M9XCIke0FMTF9MREZMQUdTfSAtTCR7R01QX1BSRUZJWH0vbGliXCIgXAorCS0tcHJlZml4PSQocmVhZGxpbmsgLWYgJHtMSUJDRERfUFJFRklYfSkgXAorCSYmIG1ha2UgZ21wZGlyPSR7R01QX1BSRUZJWH0gJiYgbWFrZSBpbnN0YWxsIgorCisjIGdldCBhbmQgYnVpbGQgbGlidW53aW5kCitMSUJVTldJTkRfVkVSU0lPTj0xLjEKK0xJQlVOV0lORF9UQVI9JHtFWFRFUk5BTFN9L2xpYnVud2luZC0ke0xJQlVOV0lORF9WRVJTSU9OfS50YXIuZ3oKK0xJQlVOV0lORF9ESVI9JHtDT01QSUxFRH0vbGlidW53aW5kLSR7TElCVU5XSU5EX1ZFUlNJT059CitMSUJVTldJTkRfUFJFRklYPSR7TElCVU5XSU5EX0RJUn0tcHJlZml4CitMSUJVTldJTkRfTElCPSR7TElCVU5XSU5EX1BSRUZJWH0vbGliL2xpYnVud2luZC5hCitMSUJVTldJTkRfVVJMPWh0dHA6Ly9kb3dubG9hZC5zYXZhbm5haC5nbnUub3JnL3JlbGVhc2VzL2xpYnVud2luZC9saWJ1bndpbmQtJHtMSUJVTldJTkRfVkVSU0lPTn0udGFyLmd6CitbIC1mICR7TElCVU5XSU5EX1RBUn0gXSB8fCBcCisJd2dldCAke0xJQlVOV0lORF9VUkx9IC1PICR7TElCVU5XSU5EX1RBUn0KK1sgLWQgJHtMSUJVTldJTkRfRElSfSBdIHx8ICggbWtkaXIgJHtMSUJVTldJTkRfRElSfSAmJiB0YXIgXAorCS0tc3RyaXAtY29tcG9uZW50cz0xIC1DICR7TElCVU5XSU5EX0RJUn0gLXhmICR7TElCVU5XSU5EX1RBUn0gKQorWyAtZiAke0xJQlVOV0lORF9MSUJ9IF0gfHwgXAorCWJhc2ggLWMgImNkICR7TElCVU5XSU5EX0RJUn0gJiYgLi9jb25maWd1cmUgXAorCS0tcHJlZml4PSQocmVhZGxpbmsgLWYgJHtMSUJVTldJTkRfUFJFRklYfSkgXAorCSR7Q09ORklHVVJFX0ZMQUdTfSBcCisJJiYgbWFrZSAmJiBtYWtlIGluc3RhbGwiCisKKyMgZ2V0IGFuZCBidWlsZCBncGVyZnRvb2xzCitHUEVSRlRPT0xTX1ZFUlNJT049Mi4zCitHUEVSRlRPT0xTX1RBUj0ke0VYVEVSTkFMU30vZ3BlcmZ0b29scy0ke0dQRVJGVE9PTFNfVkVSU0lPTn0udGFyLmd6CitHUEVSRlRPT0xTX0RJUj0ke0NPTVBJTEVEfS9ncGVyZnRvb2xzLSR7R1BFUkZUT09MU19WRVJTSU9OfQorR1BFUkZUT09MU19QUkVGSVg9JHtHUEVSRlRPT0xTX0RJUn0tcHJlZml4CitUQ01BTExPQ19MSUI9JHtHUEVSRlRPT0xTX1BSRUZJWH0vbGliL2xpYnRjbWFsbG9jLmEKK0dQRVJGVE9PTFNfVVJMPWh0dHBzOi8vZ29vZ2xlZHJpdmUuY29tL2hvc3QvMEI2TnRHc0xoSWNmN01XeE1NRjlKZFROM1VWay9ncGVyZnRvb2xzLTIuMy50YXIuZ3oKK1sgLWYgJHtHUEVSRlRPT0xTX1RBUn0gXSB8fCBcCisJd2dldCAke0dQRVJGVE9PTFNfVVJMfSAtTyAke0dQRVJGVE9PTFNfVEFSfQorWyAtZCAke0dQRVJGVE9PTFNfRElSfSBdIHx8ICggbWtkaXIgJHtHUEVSRlRPT0xTX0RJUn0gJiYgdGFyIFwKKwktLXN0cmlwLWNvbXBvbmVudHM9MSAtQyAke0dQRVJGVE9PTFNfRElSfSAteGYgJHtHUEVSRlRPT0xTX1RBUn0gKQorWyAtZiAke1RDTUFMTE9DX0xJQn0gXSB8fCBcCisJYmFzaCAtYyAiY2QgJHtHUEVSRlRPT0xTX0RJUn0gJiYgLi9jb25maWd1cmUgXAorCSR7Q09ORklHVVJFX0ZMQUdTfSAtLXByZWZpeD0kKHJlYWRsaW5rIC1mICR7R1BFUkZUT09MU19QUkVGSVh9KSBcCisJTERGTEFHUz1cIiR7QUxMX0xERkxBR1N9IC1MJHtMSUJVTldJTkRfUFJFRklYfS9saWIgLVdsLC1ycGF0aC1saW5rPSR7TElCVU5XSU5EX1BSRUZJWH0vbGliXCIgXAorCUNQUEZMQUdTPVwiLUkgJHtMSUJVTldJTkRfUFJFRklYfS9pbmNsdWRlXCIgXAorCSYmIG1ha2UgJiYgbWFrZSBpbnN0YWxsIgorCisjIGdldCBhbmQgYnVpbGQgc2Vhc29ja3MKK1NFQVNPQ0tTX1ZFUlNJT049MS4xLjIKK1NFQVNPQ0tTX1BBVENIPTEKK1NFQVNPQ0tTX0RJUj0ke0VYVEVSTkFMU30vc2Vhc29ja3MtJHtTRUFTT0NLU19WRVJTSU9OfS1wJHtTRUFTT0NLU19QQVRDSH0KK1sgLWQgJHtTRUFTT0NLU19ESVJ9IF0gfHwgKCBnaXQgY2xvbmUgLS1icmFuY2ggdiR7U0VBU09DS1NfVkVSU0lPTn0gXAorICBodHRwczovL2dpdGh1Yi5jb20vbWF0dGdvZGJvbHQvc2Vhc29ja3MuZ2l0ICR7U0VBU09DS1NfRElSfSAmJiBcCisgIHBhdGNoIC1wMSAtZCAke1NFQVNPQ0tTX0RJUn0gPCAke0FPU30vZXh0ZXJuYWxzL3NlYXNvY2tzLnBhdGNoICkKKworcm0gLXJmICR7VE1QRElSfQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL2V4dGVybmFscy5neXAgYi9hb3MvYnVpbGQvZXh0ZXJuYWxzLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJiYWEyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL2V4dGVybmFscy5neXAKQEAgLTAsMCArMSwyMTkgQEAKKyMgVGhpcyBmaWxlIGhhcyB0YXJnZXRzIGZvciB2YXJpb3VzIGV4dGVybmFsIGxpYnJhcmllcy4KKyMgZG93bmxvYWRfZXh0ZXJuYWxzLnNoIG1ha2VzIHN1cmUgdGhhdCBhbGwgb2YgdGhlbSBoYXZlIGJlZW4gZG93bmxvYWRlZC4KK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAnZXh0ZXJuYWxzJzogJzwoQU9TKS8uLi9vdXRwdXQvZG93bmxvYWRlZCcsCisgICAgJ2V4dGVybmFsc19hYnMnOiAnPCEocmVhZGxpbmsgLWYgLi4vLi4vb3V0cHV0L2Rvd25sb2FkZWQpJywKKyAgICAnY29tcGlsZWQnOiAnPChleHRlcm5hbHMpLy4uL2NvbXBpbGVkLTwoQVJDSElURUNUVVJFKTwoRVhURVJOQUxTX0VYVFJBKScsCisgICAgJ2NvbXBpbGVkX2Ficyc6ICc8KGV4dGVybmFsc19hYnMpLy4uL2NvbXBpbGVkLTwoQVJDSElURUNUVVJFKTwoRVhURVJOQUxTX0VYVFJBKScsCisKKyMgVGhlc2UgdmVyc2lvbnMgaGF2ZSB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgb25lcyBpbiBkb3dubG9hZF9leHRlcm5hbHMuc2guCisgICAgJ2VpZ2VuX3ZlcnNpb24nOiAnMy4yLjEnLAorICAgICdndGVzdF92ZXJzaW9uJzogJzEuNi4wLXAyJywKKyAgICAnY3RlbXBsYXRlX3ZlcnNpb24nOiAnMTI5JywKKyAgICAnZ2ZsYWdzX3ZlcnNpb24nOiAnMi4wJywKKyAgICAnY29tcGlsZXJfcnRfdmVyc2lvbic6ICdSRUxFQVNFXzMyX2ZpbmFsJywKKyAgICAnbGliZXZlbnRfdmVyc2lvbic6ICcyLjAuMjEnLAorICAgICdsaWJjZGRfdmVyc2lvbic6ICcwOTRnJywKKyAgICAnc3RtMzJmbGFzaF9jb21taXQnOiAnODM5OWZiZTFiYWYyYjdkMDk3NzQ2Nzg2NDU4MDIxZDkyODk1ZDcxYicsCisgICAgJ3NlYXNvY2tzX3ZlcnNpb24nOiAnMS4xLjItcDEnLAorCisgICAgJ2FsbHdwaWxpYic6ICc8KEFPUykvZXh0ZXJuYWxzL2FsbHdwaWxpYicsCisgICAgJ2ZvcndwaWxpYic6ICc8KEFPUykvZXh0ZXJuYWxzL2ZvcndwaWxpYicsCisgIH0sCisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdXUElMaWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9kaXJzJzogWworICAgICAgICAgICc8KGZvcndwaWxpYiknLAorICAgICAgICAgICc8KGFsbHdwaWxpYikvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZScsCisgICAgICAgICAgJzwoYWxsd3BpbGliKS93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZScsCisgICAgICAgICAgJzwoYWxsd3BpbGliKS9oYWwvaW5jbHVkZScsCisgICAgICAgICAgJzwoYWxsd3BpbGliKS9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0JywKKyAgICAgICAgICAnPChhbGx3cGlsaWIpL2hhbC9saWIvQXRoZW5hJywKKyAgICAgICAgXSwKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAnPEAoaGVhZGVyX2RpcnMpJworICAgICAgXSwKKyAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICctV25vLWVycm9yJywKKyAgICAgICAgJy1mbm8tc3RyaWN0LWFsaWFzaW5nJywKKyAgICAgICAgJy1PMCcsCisgICAgICBdLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICc8IUAobHMgPChhbGx3cGlsaWIpL3dwaWxpYmMvd3BpbGliQysrL3NyYy8qLmNwcCknLAorICAgICAgICAnPCFAKGxzIDwoYWxsd3BpbGliKS93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjLyouY3BwKScsCisgICAgICAgICc8IUAobHMgPChhbGx3cGlsaWIpL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSW50ZXJuYWwvKi5jcHApJywKKyAgICAgICAgJzwhQChscyA8KGFsbHdwaWxpYikvaGFsL2xpYi9BdGhlbmEvKi5jcHApJywKKyAgICAgICAgJzwhQChscyA8KGFsbHdwaWxpYikvaGFsL2xpYi9BdGhlbmEvY3RyZS8qLmNwcCknLAorICAgICAgICAnPChmb3J3cGlsaWIpL2RtYS5jYycsCisgICAgICBdLAorICAgICAgJ2xpbmtfc2V0dGluZ3MnOiB7CisgICAgICAgICdsaWJyYXJ5X2RpcnMnOiBbCisgICAgICAgICAgJzwoYWxsd3BpbGliKS9uaS1saWJyYXJpZXMnLAorICAgICAgICBdLAorICAgICAgICAnbGlicmFyaWVzJzogWworICAgICAgICAgICctbHB0aHJlYWQnLAorICAgICAgICAgICctbEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbicsCisgICAgICAgICAgJy1sUm9ib1JJT19GUkNfQ2hpcE9iamVjdCcsCisgICAgICAgICAgJy1sTmlGcGdhTHYnLAorICAgICAgICAgICctbE5pRnBnYScsCisgICAgICAgICAgJy1sTmlSaW9TcnYnLAorICAgICAgICAgICctbHNwaScsCisgICAgICAgICAgJy1saTJjJywKKyAgICAgICAgXSwKKyAgICAgIH0sCisgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAnPEAoaGVhZGVyX2RpcnMpJworICAgICAgICBdLAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdvcGVuY3YnLAorICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAnbGlua19zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2xpYnJhcmllcyc6IFsKKyAgICAgICAgICAnLWxvcGVuY3ZfY29yZScsCisgICAgICAgICAgJy1sb3BlbmN2X2ltZ3Byb2MnLAorICAgICAgICBdLAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJldmVudCcsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdsaW5rX3NldHRpbmdzJzogeworICAgICAgICAnbGlicmFyaWVzJzogWyc8KGNvbXBpbGVkX2FicykvbGliZXZlbnQtPChsaWJldmVudF92ZXJzaW9uKS1wcmVmaXgvbGliL2xpYmV2ZW50LmEnXSwKKyAgICAgIH0sCisgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnPChjb21waWxlZCkvbGliZXZlbnQtPChsaWJldmVudF92ZXJzaW9uKS1wcmVmaXgvaW5jbHVkZSddLAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdlaWdlbicsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdkaXJlY3RfZGVwZW5kZW50X3NldHRpbmdzJzogeworICAgICAgICAnY2ZsYWdzJzogWworICAgICAgICAgICctaXN5c3RlbScsICc8KGV4dGVybmFscykvZWlnZW4tPChlaWdlbl92ZXJzaW9uKScKKyAgICAgICAgXSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlianBlZycsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdkaXJlY3RfZGVwZW5kZW50X3NldHRpbmdzJzogeworICAgICAgICAnbGlicmFyaWVzJzogWyc8KGNvbXBpbGVkX2FicykvbGlianBlZy9saWIvbGlianBlZy5hJ10sCisgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgJy1pc3lzdGVtJywgJzwoY29tcGlsZWQpJywKKyAgICAgICAgXSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisjIERlcGVuZGVudHMgc2hvdWxkIG9ubHkgdXNlIHRoZSAiZ3Rlc3QvZ3Rlc3RfcHJvZC5oIiBoZWFkZXIuCisjIFRoaXMgdGFyZ2V0IGlzIE5PVCB0aGUgY29ycmVjdCBvbmUgZm9yICJhb3MvY29tbW9uL2d0ZXN0X3Byb2QuaCIuIFRoYXQgb25lIGlzCisjICAgYW9zL2NvbW1vbi9jb21tb24uZ3lwOmd0ZXN0X3Byb2QuIFRoaXMgdGFyZ2V0IGp1c3QgZGVhbHMgd2l0aCBzZXR0aW5nIHVwIHRvCisjICAgdXNlIHRoZSBndGVzdCBoZWFkZXIuCisgICAgICAndGFyZ2V0X25hbWUnOiAnZ3Rlc3RfcHJvZCcsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAnPChleHRlcm5hbHMpL2d0ZXN0LTwoZ3Rlc3RfdmVyc2lvbikvaW5jbHVkZScKKyAgICAgICAgXSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZ3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICc8KGV4dGVybmFscykvZ3Rlc3QtPChndGVzdF92ZXJzaW9uKS9zcmMvZ3Rlc3QtYWxsLmNjJywKKyAgICAgICAgJzwoQU9TKS9leHRlcm5hbHMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgJzwoZXh0ZXJuYWxzKS9ndGVzdC08KGd0ZXN0X3ZlcnNpb24pJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnZ3Rlc3RfcHJvZCcsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICdndGVzdF9wcm9kJywKKyAgICAgIF0sCisgICAgICAnY2ZsYWdzISc6IFsnLVdlcnJvciddLAorICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJzwoZXh0ZXJuYWxzKS9ndGVzdC08KGd0ZXN0X3ZlcnNpb24pL2luY2x1ZGUnXSwKKyAgICAgICAgJ3RhcmdldF9jb25kaXRpb25zJzogWworICAgICAgICAgIFsnX3R5cGU9PSJleGVjdXRhYmxlIiBhbmQgaXNfc3BlY2lhbF90ZXN0PT0wJywgeworICAgICAgICAgICAgICAncHJvZHVjdF9kaXInOiAnPCh0ZXN0X2RpciknLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdLCBbJ190eXBlPT0iZXhlY3V0YWJsZSIgYW5kIGlzX3NwZWNpYWxfdGVzdD09MScsIHsKKyAgICAgICAgICAgICAgJ3Byb2R1Y3RfZGlyJzogJzwodGVzdF9kaXIpLXNwZWNpYWwnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdLAorICAgICAgICBdLAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdjdGVtcGxhdGUnLAorICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAnbGlua19zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2xpYnJhcmllcyc6IFsnPChjb21waWxlZF9hYnMpL2N0ZW1wbGF0ZS08KGN0ZW1wbGF0ZV92ZXJzaW9uKS1wcmVmaXgvbGliL2xpYmN0ZW1wbGF0ZS5hJ10sCisgICAgICB9LAorICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJzwoY29tcGlsZWQpL2N0ZW1wbGF0ZS08KGN0ZW1wbGF0ZV92ZXJzaW9uKS1wcmVmaXgvaW5jbHVkZSddLAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdnZmxhZ3MnLAorICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAnbGlua19zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2xpYnJhcmllcyc6IFsnPChjb21waWxlZF9hYnMpL2dmbGFncy08KGdmbGFnc192ZXJzaW9uKS1wcmVmaXgvbGliL2xpYmdmbGFncy5hJ10sCisgICAgICB9LAorICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJzwoY29tcGlsZWQpL2dmbGFncy08KGdmbGFnc192ZXJzaW9uKS1wcmVmaXgvaW5jbHVkZSddLAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJjZGQnLAorICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAnbGlua19zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2xpYnJhcmllcyc6IFsnPChjb21waWxlZF9hYnMpL2xpYmNkZC08KGxpYmNkZF92ZXJzaW9uKS1wcmVmaXgvbGliL2xpYmNkZC5hJ10sCisgICAgICB9LAorICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJzwoY29tcGlsZWRfYWJzKS8nXSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc2Vhc29ja3MnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICc8IUAoZmluZCA8KGV4dGVybmFscykvc2Vhc29ja3MtPChzZWFzb2Nrc192ZXJzaW9uKS9zcmMvbWFpbi9jIC1uYW1lICouY3BwKScsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgJzwoQU9TKS9leHRlcm5hbHMvc2Vhc29ja3MnLAorICAgICAgICAnPChleHRlcm5hbHNfYWJzKS9zZWFzb2Nrcy08KHNlYXNvY2tzX3ZlcnNpb24pL3NyYy9tYWluL2MnLAorICAgICAgXSwKKyAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICctV25vLXVudXNlZC1wYXJhbWV0ZXInLAorICAgICAgICAnLVduby1mb3JtYXQtbm9ubGl0ZXJhbCcsCisgICAgICAgICctV25vLWVycm9yPWNhc3QtYWxpZ24nLAorICAgICAgICAnLVduby1zd2l0Y2gtZW51bScsCisgICAgICAgICctV25vLWNhc3QtcXVhbCcsCisgICAgICAgICctV25vLWVycm9yPXN0cmljdC1hbGlhc2luZycsCisgICAgICBdLAorICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CisgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICAgJzwoQU9TKS9leHRlcm5hbHMvc2Vhc29ja3MnLAorICAgICAgICAgICc8KGV4dGVybmFscykvc2Vhc29ja3MtPChzZWFzb2Nrc192ZXJzaW9uKS9zcmMvbWFpbi9jJywKKyAgICAgICAgXSwKKyAgICAgICAgJ2NmbGFncyc6IFsKKyAgICAgICAgICAjIFNpbmNlIHNlYXNvY2tzL1dlYlNvY2tldC5oIGhhcyBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgdGhhdCBkb24ndCB1c2UKKyAgICAgICAgICAjIHRoZWlyIHBhcmFtZXRlcnMsIHRoZSBjb21waWxhdGlvbiBvZiBodHRwX3N0YXR1cyB3b3VsZCBmYWlsIHdpdGhvdXQKKyAgICAgICAgICAjIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uLgorICAgICAgICAgICctV25vLXVudXNlZC1wYXJhbWV0ZXInLAorICAgICAgICBdLAorICAgICAgfSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy5neXBpIGIvYW9zL2J1aWxkL3F1ZXVlcy5neXBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDM0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzLmd5cGkKQEAgLTAsMCArMSw4MyBAQAorIyBJbmNsdWRlIHRoaXMgZmlsZSBpbiBhbnkgdGFyZ2V0IHRoYXQgbmVlZHMgdG8gdXNlIGZpbGVzIGdlbmVyYXRlZCBmcm9tIHF1ZXVlCisjICAgZXRjLiBkZWZpbml0aW9ucy4KKyMKKyMgVG8gdXNlLCBjcmVhdGUgYSB0YXJnZXQgb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorIyB7CisjICAgJ3RhcmdldF9uYW1lJzogJ215X3F1ZXVlcycsCisjICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLCAjIG9yIGFueSBvdGhlciB0eXBlIHRoYXQgY2FuIGhhbmRsZSAuY2MgZmlsZXMKKyMgICAnc291cmNlcyc6IFsKKyMgICAgICdhb3MvZXhhbXBsZS9RdWV1ZS5xJywKKyMgICAgICdhb3MvZXhhbXBsZS9Db250cm9sTG9vcC5xJywKKyMgICBdLAorIyAgICd2YXJpYWJsZXMnOiB7CisjICAgICAnaGVhZGVyX3BhdGgnOiAnYW9zL2V4YW1wbGUnLAorIyAgIH0sCisjICAgJ2luY2x1ZGVzJzogWydwYXRoL3RvL3F1ZXVlcy5neXBpJ10sCisjIH0sCisjIENvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMgdGFyZ2V0IHdpbGwgYmUgYWJsZSB0byAjaW5jbHVkZQorIyAgICJhb3MvZXhhbXBsZS9RdWV1ZS5xLmgiIGFuZCAiYW9zL2V4YW1wbGUvQ29udHJvbExvb3AucS5oIi4KKyMKKyMgdXNpbmcgPGh0dHA6Ly9zcmMuY2hyb21pdW0ub3JnL3N2bi90cnVuay9zcmMvYnVpbGQvcHJvdG9jLmd5cGk+IGFzIGFuCisjIGV4YW1wbGUgb2YgaG93IHRoaXMgc2hvdWxkIHdvcmsKK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAjJ2hlYWRlcl9wYXRoJzogJz4hKHB5dGhvbiAtYyAiaW1wb3J0IG9zLnBhdGg7IHByaW50IG9zLnBhdGgucmVscGF0aChcJzwoUlVMRV9JTlBVVF9QQVRIKVwnLCBcJzwoREVQVEgpXCcpIiknLAorICAgICdwcmVmaXhfZGlyJzogJzwoU0hBUkVEX0lOVEVSTUVESUFURV9ESVIpLzwhKGVjaG8gPChoZWFkZXJfcGF0aCkgfCBzZWQgInMvW15BLVphLXowLTldL18vZyIpJywKKyAgICAnb3V0X2Rpcic6ICc8KHByZWZpeF9kaXIpLzwoX3RhcmdldF9uYW1lKS88KGhlYWRlcl9wYXRoKScsCisgICAgJ2dlbl9uYW1lc3BhY2UlJzogJz4hKGVjaG8gPihoZWFkZXJfcGF0aCkgfCBzZWQgInM6XChbXi9dKlwpLio6XFwxOmciKScsCisgICAgJ291dHB1dF9oJzogJzwob3V0X2RpcikvPChSVUxFX0lOUFVUX1JPT1QpLnEuaCcsCisgICAgJ291dHB1dF9jYyc6ICc8KG91dF9kaXIpLzwoUlVMRV9JTlBVVF9ST09UKS5xLmNjJywKKyAgICAnb3V0cHV0X21haW4nOiAnPChvdXRfZGlyKS88KFJVTEVfSU5QVVRfUk9PVClfbWFpbi5jYycsCisgICAgJ25vX3JzeW5jJzogMSwKKyAgICAnYW9zX3FfZGVwZW5kZW50X3BhdGhzJSc6IFtdLAorICB9LAorICAncnVsZXMnOiBbCisgICAgeworICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ3NjcmlwdCc6ICc8KEFPUykvYnVpbGQvcXVldWVzL2NvbXBpbGVyLnJiJywKKyAgICAgIH0sCisgICAgICAncnVsZV9uYW1lJzogJ2dlbnF1ZXVlJywKKyAgICAgICdleHRlbnNpb24nOiAncScsCisgICAgICAnb3V0cHV0cyc6IFsKKyAgICAgICAgJzwob3V0cHV0X2gpJywKKyAgICAgICAgJzwob3V0cHV0X2NjKScsCisgICAgICBdLAorICAgICAgJ2lucHV0cyc6IFsKKyAgICAgICAgJzwoc2NyaXB0KScsCisgICAgICAgICc8IUAoZmluZCA8KEFPUykvYnVpbGQvcXVldWVzLyAtbmFtZSAqLnJiKScsCisgICAgICAgICc8KEFPUykvY29tbW9uL3F1ZXVlLmgnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi90aW1lLmgnLAorICAgICAgICAnPkAoYW9zX3FfZGVwZW5kZW50X3BhdGhzKScsCisgICAgICBdLAorICAgICAgJ2FjdGlvbic6IFsncnVieScsICc8KHNjcmlwdCknLAorICAgICAgICAnLUknLCAnPChERVBUSCknLAorICAgICAgICAnPChSVUxFX0lOUFVUX1BBVEgpJywKKyAgICAgICAgJy1jcHBfb3V0JywKKyAgICAgICAgJzwoaGVhZGVyX3BhdGgpJywKKyAgICAgICAgJy1jcHBfYmFzZScsCisgICAgICAgICc8KHByZWZpeF9kaXIpLzwoX3RhcmdldF9uYW1lKSddLAorICAgICAgJ21lc3NhZ2UnOiAnR2VuZXJhdGluZyBDKysgY29kZSBmb3IgPChoZWFkZXJfcGF0aCkvPChSVUxFX0lOUFVUX1BBVEgpJywKKyAgICAgICdwcm9jZXNzX291dHB1dHNfYXNfc291cmNlcyc6IDEsCisgICAgfSwKKyAgXSwKKyAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAnPChwcmVmaXhfZGlyKS88KF90YXJnZXRfbmFtZSknLAorICBdLAorICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgJzwocHJlZml4X2RpcikvPChfdGFyZ2V0X25hbWUpJywKKyAgICBdLAorICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAnYW9zX3FfZGVwZW5kZW50X3BhdGhzJzogWyc8QChfc291cmNlcyknXSwKKyAgICB9LAorICB9LAorICAnZGVwZW5kZW5jaWVzJzogWworICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVzJywKKyAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOm9uY2UnLAorICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVfdHlwZXMnLAorICBdLAorICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlcycsCisgIF0sCisgICdoYXJkX2RlcGVuZGVuY3knOiAxLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9jb21waWxlci5yYiBiL2Fvcy9idWlsZC9xdWV1ZXMvY29tcGlsZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjMDAwNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9xdWV1ZXMvY29tcGlsZXIucmIKQEAgLTAsMCArMSwxMzEgQEAKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvbG9hZC5yYicKKworZGVmIHBhcnNlX2FyZ3MoZ2xvYmFscyxhcmdzKQorCWkgPSAwCisJd2hpbGUoaSA8IGFyZ3MubGVuZ3RoKQorCQlpZihhcmdzW2ldID09ICItSSIpCisJCQlhcmdzLmRlbGV0ZV9hdChpKQorCQkJaWYoIWFyZ3NbaV0pCisJCQkJJHN0ZGVyci5wdXRzICJoZXkhIC1JIGlzIGZvbGxvd2VkIGJ5IG5vdGhpbmcuIgorCQkJCSRzdGRlcnIucHV0cyAiXHRub3QgYSBzdXBwb3J0ZWQgdXNhZ2UuLi4iCisJCQkJJHN0ZGVyci5wdXRzICJcdFdvdC4gV290LiIKKwkJCQlleGl0ISgtMSkKKwkJCWVuZAorCQkJcGF0aCA9IGFyZ3MuZGVsZXRlX2F0KGkpCisJCQlnbG9iYWxzLmFkZF9wYXRoKHBhdGgpCisJCWVsc2lmKGFyZ3NbaV0gPT0gIi1jcHBfb3V0IikKKwkJCWFyZ3MuZGVsZXRlX2F0KGkpCisJCQlwYXRoID0gYXJncy5kZWxldGVfYXQoaSkKKwkJCWlmKHBhdGggPX4gL1wuLykKKwkJCQkkc3RkZXJyLnB1dHMgImhleSEgcGF0aCAje3BhdGh9IGhhcyBhIFwiLlwiIGNoYXIgd2hpY2ggaXMgIgorCQkJCSRzdGRlcnIucHV0cyAiXHRub3QgYSBzdXBwb3J0ZWQgdXNhZ2UuLi4iCisJCQkJJHN0ZGVyci5wdXRzICJcdFdvdC4gV290LiIKKwkJCQlleGl0ISgtMSkKKwkJCWVsc2lmKCFwYXRoKQorCQkJCSRzdGRlcnIucHV0cyAiaGV5ISBObyBjcHBfb3V0IHBhdGggcHJvdmlkZWQuIgorCQkJCSRzdGRlcnIucHV0cyAiXHR1bW0sIHlvdSBjb3VsZCB0cnkgLWNwcF9vdXQgXCJcIiIKKwkJCQkkc3RkZXJyLnB1dHMgIlx0VGhhdCBtaWdodCBkbyB0aGUgdHJpY2siCisJCQkJJHN0ZGVyci5wdXRzICJcdFdvdC4gV290LiIKKwkJCQlleGl0ISgtMSkKKwkJCWVuZAorCQkJJGNwcF9vdXQgPSBwYXRoLnNwbGl0KC9cXHxcLy8pCisJCWVsc2lmKGFyZ3NbaV0gPT0gIi1jcHBfYmFzZSIpCisJCQlhcmdzLmRlbGV0ZV9hdChpKQorCQkJcGF0aCA9IGFyZ3MuZGVsZXRlX2F0KGkpCisJCQkkY3BwX2Jhc2UgPSBGaWxlLmV4cGFuZF9wYXRoKHBhdGgpCisJCQlpZighRmlsZS5leGlzdHM/KCRjcHBfYmFzZSkpCisJCQkJJHN0ZGVyci5wdXRzICJvdXRwdXQgZGlyZWN0b3J5ICN7JGNwcF9iYXNlLmluc3BlY3R9IGRvZXMgbm90IGV4aXN0LiIKKwkJCQkkc3RkZXJyLnB1dHMgIlx0SSdtIG5vdCBnb2luZyB0byBtYWtlIHRoYXQhIHNoZWVzaCwgd2hvIGRvIHlvdSB0aGluayBJIGFtPyIKKwkJCQkkc3RkZXJyLnB1dHMgIlx0V290LiBXb3QuIgorCQkJCWV4aXQhKC0xKQorCQkJZW5kCisJCWVsc2lmKGFyZ3NbaV0gPX4gL14tLykKKwkJCSRzdGRlcnIucHV0cyAiaGV5ISB1bmtub3duIGFyZ3VtZW50ICN7YXJnc1tpXX0uIgorCQkJJHN0ZGVyci5wdXRzICJcdFdvdC4gV290LiIKKwkJCWV4aXQhKC0xKQorCQllbHNlCisJCQlpICs9IDEKKwkJZW5kCisJZW5kCisJaWYoISRjcHBfYmFzZSkKKwkJJHN0ZGVyci5wdXRzICJoZXkhIG1pc3NpbmcgLWNwcF9iYXNlIGFyZ3VtZW50LiIKKwkJJHN0ZGVyci5wdXRzICJcdFdvdC4gV290LiIKKwkJZXhpdCEoLTEpCisJZW5kCisJaWYoISRjcHBfb3V0KQorCQkkc3RkZXJyLnB1dHMgImhleSEgbWlzc2luZyAtY3BwX291dCBhcmd1bWVudC4iCisJCSRzdGRlcnIucHV0cyAiXHRXb3QuIFdvdC4iCisJCWV4aXQhKC0xKQorCWVuZAorZW5kCitkZWYgZm9ybWF0X3BpcGVsaW5lKG91dHB1dCkKKyAgcmVhZF9pbiwgd3JpdGVfaW4gPSBJTy5waXBlKCkKKyAgY2hpbGQgPSBQcm9jZXNzLnNwYXduKCcvdXNyL2Jpbi9jbGFuZy1mb3JtYXQtMy41IC0tc3R5bGU9Z29vZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHs6aW49PnJlYWRfaW4sIHdyaXRlX2luPT46Y2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgOm91dD0+b3V0cHV0LmZpbGVub30pCisgIHJlYWRfaW4uY2xvc2UKKyAgW2NoaWxkLCB3cml0ZV9pbl0KK2VuZAorZGVmIGJ1aWxkKGZpbGVuYW1lLGdsb2JhbHNfdGVtcGxhdGUpCisJZ2xvYmFscyA9IEdsb2JhbHMubmV3KCkKKwlnbG9iYWxzX3RlbXBsYXRlLnBhdGhzLmVhY2ggZG8gfHBhdGh8CisJCWdsb2JhbHMuYWRkX3BhdGgocGF0aCkKKwllbmQKKwlmaWxlbmFtZSA9IEZpbGUuZXhwYW5kX3BhdGgoZmlsZW5hbWUpCisJcV9maWxlID0gUUZpbGUucGFyc2UoZmlsZW5hbWUpCisJb3V0cHV0X2ZpbGUgPSBxX2ZpbGUucV9ldmFsKGdsb2JhbHMpCisJcV9maWxlbmFtZSA9IEZpbGUuYmFzZW5hbWUoZmlsZW5hbWUpCisJcmVsX3BhdGggPSAoJGNwcF9vdXQgKyBbcV9maWxlbmFtZV0pLmpvaW4oIi8iKQorCisJRmlsZVV0aWxzLm1rZGlyX3AoUGF0aG5hbWUubmV3KCRjcHBfYmFzZSkgKyAkY3BwX291dC5qb2luKCIvIikpCisKKwljcHBfdHJlZSA9IG91dHB1dF9maWxlLm1ha2VfY3BwX3RyZWUocmVsX3BhdGgpCisKKwloX2ZpbGVfcGF0aCA9ICRjcHBfYmFzZSArICIvIiArIHJlbF9wYXRoICsgIi5oIgorCWNjX2ZpbGVfcGF0aCA9ICRjcHBfYmFzZSArICIvIiArIHJlbF9wYXRoICsgIi5jYyIKKwljcHBfdHJlZS5hZGRfY2NfaW5jbHVkZSgocmVsX3BhdGggKyAiLmgiKS5pbnNwZWN0KQorCWNwcF90cmVlLmFkZF9jY19pbmNsdWRlKCJhb3MvY29tbW9uL2J5dGVvcmRlci5oIi5pbnNwZWN0KQorCWNwcF90cmVlLmFkZF9jY19pbmNsdWRlKCI8aW50dHlwZXMuaD4iKQorCWNwcF90cmVlLmFkZF9jY19pbmNsdWRlKCJhb3MvY29tbW9uL3F1ZXVlX3R5cGVzLmgiLmluc3BlY3QpCisgIGNwcF90cmVlLmFkZF9jY19pbmNsdWRlKCJhb3MvY29tbW9uL29uY2UuaCIuaW5zcGVjdCkKKyAgY3BwX3RyZWUuYWRkX2NjX2luY2x1ZGUoImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nX3ByaW50Zl9mb3JtYXRzLmgiLmluc3BlY3QpCisJY3BwX3RyZWUuYWRkX2NjX3VzaW5nKCI6OmFvczo6dG9fbmV0d29yayIpCisJY3BwX3RyZWUuYWRkX2NjX3VzaW5nKCI6OmFvczo6dG9faG9zdCIpCisKKwloZWFkZXJfZmlsZSA9IFdyaXRlSWZmQ2hhbmdlZC5uZXcoaF9maWxlX3BhdGgpCisJY2NfZmlsZSA9IFdyaXRlSWZmQ2hhbmdlZC5uZXcoY2NfZmlsZV9wYXRoKQorICBoZWFkZXJfY2hpbGQsIGhlYWRlcl9vdXRwdXQgPSBmb3JtYXRfcGlwZWxpbmUoaGVhZGVyX2ZpbGUpCisgIGNjX2NoaWxkLCBjY19vdXRwdXQgPSBmb3JtYXRfcGlwZWxpbmUoY2NfZmlsZSkKKwljcHBfdHJlZS53cml0ZV9oZWFkZXJfZmlsZSgkY3BwX2Jhc2UsaGVhZGVyX291dHB1dCkKKwljcHBfdHJlZS53cml0ZV9jY19maWxlKCRjcHBfYmFzZSxjY19vdXRwdXQpCisJaGVhZGVyX291dHB1dC5jbG9zZSgpCisJY2Nfb3V0cHV0LmNsb3NlKCkKKyAgaWYgIVByb2Nlc3Mud2FpdDIoY2NfY2hpbGQpWzFdLnN1Y2Nlc3M/CisgICAgJHN0ZGVyci5wdXRzICJGb3JtYXR0aW5nIGNjIGZpbGUgZmFpbGVkLiIKKyAgICBleGl0IDEKKyAgZW5kCisgIGlmICFQcm9jZXNzLndhaXQyKGhlYWRlcl9jaGlsZClbMV0uc3VjY2Vzcz8KKyAgICAkc3RkZXJyLnB1dHMgIkZvcm1hdHRpbmcgaGVhZGVyIGZpbGUgZmFpbGVkLiIKKyAgICBleGl0IDEKKyAgZW5kCisgIGhlYWRlcl9maWxlLmNsb3NlKCkKKyAgY2NfZmlsZS5jbG9zZSgpCitlbmQKK2JlZ2luCisJYXJncyA9IEFSR1YuZHVwCisJZ2xvYmFscyA9IEdsb2JhbHMubmV3KCkKKwlwYXJzZV9hcmdzKGdsb2JhbHMsYXJncykKKwlpZihhcmdzLmxlbmd0aCA9PSAwKQorCQkkc3RkZXJyLnB1dHMgImhleSEgeW91IHdhbnQgbWUgdG8gZG8gc29tZXRoaW5nLCIKKwkJJHN0ZGVyci5wdXRzICJcdGJ1dCB5b3UgZ2F2ZSBtZSBubyBxIGZpbGVzIHRvIGJ1aWxkISIKKwkJJHN0ZGVyci5wdXRzICJcdFdvdC4gV290LiIKKwkJZXhpdCEoLTEpCisJZW5kCisJYXJncy5lYWNoIGRvIHxmaWxlbmFtZXwKKwkJYnVpbGQoZmlsZW5hbWUsZ2xvYmFscykKKwllbmQKKwlleGl0KDApCityZXNjdWUgUUVycm9yID0+IGUKKwkkc3RkZXJyLnByaW50KGUudG9fcykKKwlleGl0ISgtMSkKK2VuZApkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9jcHBfcHJldHR5X3ByaW50L2F1dG9fZ2VuLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9jcHBfcHJldHR5X3ByaW50L2F1dG9fZ2VuLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZmI0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL2NwcF9wcmV0dHlfcHJpbnQvYXV0b19nZW4ucmIKQEAgLTAsMCArMSwzMDYgQEAKK21vZHVsZSBDUFAKK2VuZAorY2xhc3MgQ1BQOjpDb21tZW50CisJZGVmIGluaXRpYWxpemUodGV4dCkKKwkJQHRleHQgPSB0ZXh0CisJZW5kCisJZGVmIHBwKHN0YXRlKQorCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJaWYoQHRleHQuaW5jbHVkZT8oIlxuIikpCisJCQlzdGF0ZS5wcmludCgiLyogI3tAdGV4dH0gKi8iKQorCQllbHNlCisJCQlzdGF0ZS5wcmludCgiLy8gI3tAdGV4dH0iKQorCQllbmQKKwllbmQKK2VuZAorY2xhc3MgQ1BQOjpUT0RPIDwgQ1BQOjpDb21tZW50CisJZGVmIGluaXRpYWxpemUob3duZXIsdGV4dCkKKwkJQHRleHQgPSAiVE9ETygje293bmVyfSk6ICN7dGV4dH0iCisJZW5kCitlbmQKK2NsYXNzIENQUDo6U3RhdGljVmFyCisJY2xhc3MgRm9yd2FyZERlYworCQlkZWYgaW5pdGlhbGl6ZShmdW5jKSA7IEBmdW5jID0gZnVuYyA7IGVuZAorCQlkZWYgcHAoc3RhdGUpIDsgQGZ1bmMucHBfZm9yd2FyZF9kZWMoc3RhdGUpIDsgZW5kCisJZW5kCisJYXR0cl9hY2Nlc3NvciA6YXJncywgOnN0YXRpYworCWRlZiBpbml0aWFsaXplKHR5cGVfY2xhc3MsIHZhbF90eXBlLCBuYW1lLCBhcmdzID0gQ1BQOjpBcmdzLm5ldygpKQorCQlAdHlwZV9jbGFzcyA9IHR5cGVfY2xhc3MKKwkJQHZhbF90eXBlID0gdmFsX3R5cGUKKwkJQG5hbWUgPSBuYW1lCisJCUBhcmdzID0gYXJncworCQlAc3RhdGljID0gdHJ1ZQorCWVuZAorCWRlZiBmb3J3YXJkX2RlYygpIDsgRm9yd2FyZERlYy5uZXcoc2VsZikgOyBlbmQKKwlkZWYgcHBfZm9yd2FyZF9kZWMoc3RhdGUpCisgICAgaWYgKEBzdGF0aWMpCisgICAgICBzdGF0ZS5wcmludCgic3RhdGljICIpCisJCWVuZAorCQlzdGF0ZS5wcmludCgiI3tAdmFsX3R5cGV9ICN7QG5hbWV9IikKKwllbmQKKwlkZWYgcHAoc3RhdGUpCisJCXN0YXRlLnByaW50KCIje0B2YWxfdHlwZX0gI3tAdHlwZV9jbGFzcy5jaG9wX21ldGhvZF9wcmVmaXh9I3tAbmFtZX0oIikKKwkJc3RhdGUucHAoQGFyZ3MpCisJCXN0YXRlLnByaW50KCIpIikKKwllbmQKKwlhbGlhc19tZXRob2QgOnBwX2hlYWRlcl9maWxlLCA6cHBfZm9yd2FyZF9kZWMKKwlhbGlhc19tZXRob2QgOnBwX2NjX2ZpbGUsIDpwcAorZW5kCitjbGFzcyBDUFA6Ok1lbWJlckZ1bmMKKwljbGFzcyBGb3J3YXJkRGVjCisJCWRlZiBpbml0aWFsaXplKGZ1bmMpIDsgQGZ1bmMgPSBmdW5jIDsgZW5kCisJCWRlZiBwcChzdGF0ZSkgOyBAZnVuYy5wcF9mb3J3YXJkX2RlYyhzdGF0ZSkgOyBlbmQKKwllbmQKKwlhdHRyX2FjY2Vzc29yIDphcmdzLDpzdWl0ZSw6cmV0dXJuX3R5cGUsOm5hbWUsOnByZV9mdW5jX3R5cGVzLDpjb25zdCw6c3RhdGljLDp2aXJ0dWFsCisJZGVmIGluaXRpYWxpemUodHlwZV9jbGFzcyxyZXR1cm5fdHlwZSxuYW1lKQorCQlAdHlwZV9jbGFzcyA9IHR5cGVfY2xhc3MKKwkJQHJldHVybl90eXBlID0gcmV0dXJuX3R5cGUKKwkJQG5hbWUgPSBuYW1lCisJCUBjb25zdCA9IGZhbHNlCisJCUBzdGF0aWMgPSBmYWxzZQorCQlAdmlydHVhbCA9IGZhbHNlCisJCUBhcmdzID0gQ1BQOjpBcmdzLm5ldygpCisJCUBzdWl0ZSA9IENQUDo6U3VpdGUubmV3KCkKKwllbmQKKwlhdHRyX2FjY2Vzc29yIDppbmxpbmUKKwlkZWYgZm9yd2FyZF9kZWMoKSA7IEZvcndhcmREZWMubmV3KHNlbGYpIDsgZW5kCisJZGVmIHBwX2ZvcndhcmRfZGVjKHN0YXRlKQorCQlyZXR1cm4gc2VsZi5wcF9pbmxpbmUoc3RhdGUpIGlmKEBpbmxpbmUpCisgICAgICAgIGlmIChAc3RhdGljKQorICAgICAgICAgIHN0YXRlLnByaW50KCJzdGF0aWMgIikKKwkJCQllbHNpZiAoQHZpcnR1YWwpCisgICAgICAgICAgc3RhdGUucHJpbnQoInZpcnR1YWwgIikKKyAgICAgICAgZW5kCisJCXN0YXRlLnByaW50KCIje0ByZXR1cm5fdHlwZX0gI3tAcHJlX2Z1bmNfdHlwZXN9I3tAbmFtZX0oIikKKwkJc3RhdGUucHAoQGFyZ3MpCisJCXN0YXRlLnByaW50KCIpIikKKyAgICAgICAgaWYgKEBjb25zdCkKKyAgICAgICAgICBzdGF0ZS5wcmludCgiIGNvbnN0IikKKyAgICAgICAgZW5kCisJZW5kCisJZGVmIHBwX2lubGluZShzdGF0ZSkKKyAgICAgICAgaWYgKEBzdGF0aWMpCisgICAgICAgICAgc3RhdGUucHJpbnQoInN0YXRpYyAiKQorCQkJCWVsc2lmIChAdmlydHVhbCkKKyAgICAgICAgICBzdGF0ZS5wcmludCgidmlydHVhbCAiKQorICAgICAgICBlbmQKKwkJc3RhdGUucHJpbnQoIiN7QHJldHVybl90eXBlfSAje0BwcmVfZnVuY190eXBlc30je0BuYW1lfSgiKQorCQlzdGF0ZS5wcChAYXJncykKKwkJc3RhdGUucHJpbnQoIikgIikKKyAgICAgICAgaWYgKEBjb25zdCkKKyAgICAgICAgICBzdGF0ZS5wcmludCgiIGNvbnN0IikKKyAgICAgICAgZW5kCisJCUBzdWl0ZS5wcF9vbmVfbGluZShzdGF0ZSkKKwllbmQKKwlkZWYgcHAoc3RhdGUpCisJCXJldHVybiBpZihAaW5saW5lKQorCQlzdGF0ZS5wcmludCgiI3tAcmV0dXJuX3R5cGV9ICN7QHByZV9mdW5jX3R5cGVzfSN7QHR5cGVfY2xhc3MuY2hvcF9tZXRob2RfcHJlZml4fSN7QG5hbWV9KCIpCisJCXN0YXRlLnBwKEBhcmdzKQorCQlzdGF0ZS5wcmludCgiKSAiKQorCQlpZiAoQGNvbnN0KQorCQkJc3RhdGUucHJpbnQoImNvbnN0ICIpCisJCWVuZAorCQlzdGF0ZS5wcChAc3VpdGUpCisJCXN0YXRlLnZfcGFkKDIpCisJZW5kCisJYWxpYXNfbWV0aG9kIDpwcF9oZWFkZXJfZmlsZSwgOnBwX2ZvcndhcmRfZGVjCisJYWxpYXNfbWV0aG9kIDpwcF9jY19maWxlLCA6cHAKKwkKK2VuZAorY2xhc3MgQ1BQOjpDb25zdHJ1Y3RvcgorCWNsYXNzIEZvcndhcmREZWMKKwkJZGVmIGluaXRpYWxpemUoZnVuYykgOyBAZnVuYyA9IGZ1bmMgOyBlbmQKKwkJZGVmIHBwKHN0YXRlKSA7IEBmdW5jLnBwX2ZvcndhcmRfZGVjKHN0YXRlKSA7IGVuZAorCWVuZAorCWF0dHJfYWNjZXNzb3IgOmFyZ3MsOnN1aXRlLDpyZXR1cm5fdHlwZSw6bmFtZQorCWRlZiBpbml0aWFsaXplKHR5cGVfY2xhc3MpCisJCUB0eXBlX2NsYXNzID0gdHlwZV9jbGFzcworCQlAYXJncyA9IENQUDo6QXJncy5uZXcoKQorCQlAc3VpdGUgPSBDUFA6OlN1aXRlLm5ldygpCisJCUB2YXJfY29ucyA9IENQUDo6QXJncy5uZXcoKQorCWVuZAorCWRlZiBmb3J3YXJkX2RlYygpIDsgRm9yd2FyZERlYy5uZXcoc2VsZikgOyBlbmQKKwlkZWYgYWRkX2NvbnMoKmFyZ3MpCisJCUB2YXJfY29ucy5wdXNoKENQUDo6RnVuY0NhbGwuYnVpbGQoKmFyZ3MpKQorCWVuZAorCWRlZiBwcF9mb3J3YXJkX2RlYyhzdGF0ZSkKKwkJc3RhdGUucHJpbnQoIiN7QHR5cGVfY2xhc3MubmFtZX0oIikKKwkJc3RhdGUucHAoQGFyZ3MpCisJCXN0YXRlLnByaW50KCIpIikKKwllbmQKKwlkZWYgcHBfaW5saW5lKHN0YXRlKQorCQlwcChzdGF0ZSxmYWxzZSkKKwllbmQKKwlkZWYgcHAoc3RhdGUscHJlZml4ID0gdHJ1ZSkKKwkJc3RhdGUubmVlZHNfc2VtaSA9IGZhbHNlCisJCXN0YXRlLnByaW50KEB0eXBlX2NsYXNzLmNob3BfbWV0aG9kX3ByZWZpeCkgaWYocHJlZml4KQorCQlzdGF0ZS5wcmludCgiI3tAdHlwZV9jbGFzcy5uYW1lfSgiKQorCQlzdGF0ZS5wcChAYXJncykKKwkJaWYoQHZhcl9jb25zLmxlbmd0aCA+PSAxKQorCQkJc3RhdGUucHJpbnQoIikiKQorCQkJc3RhdGUuZW5kbGluZSgpCisJCQlzdGF0ZS5pbmRlbnQgKz0gNAorCQkJc3RhdGUucHJpbnQoIjogIikKKwkJCXN0YXRlLnBwKEB2YXJfY29ucykKKwkJCXN0YXRlLmluZGVudCAtPSA0CisJCQlzdGF0ZS5wcmludCgiICIpCisJCWVsc2UKKwkJCXN0YXRlLnByaW50KCIpICIpCisJCWVuZAorCQlzdGF0ZS5wcChAc3VpdGUpCisJCXN0YXRlLnZfcGFkKDIpCisJZW5kCisJYWxpYXNfbWV0aG9kIDpwcF9oZWFkZXJfZmlsZSwgOnBwX2ZvcndhcmRfZGVjCisJYWxpYXNfbWV0aG9kIDpwcF9jY19maWxlLCA6cHAKK2VuZAorY2xhc3MgQ1BQOjpEZXN0cnVjdG9yCisJY2xhc3MgRm9yd2FyZERlYworCQlkZWYgaW5pdGlhbGl6ZShmdW5jKSA7IEBmdW5jID0gZnVuYyA7IGVuZAorCQlkZWYgcHAoc3RhdGUpIDsgQGZ1bmMucHBfZm9yd2FyZF9kZWMoc3RhdGUpIDsgZW5kCisJZW5kCisJYXR0cl9hY2Nlc3NvciA6YXJncyw6c3VpdGUsOnJldHVybl90eXBlLDpuYW1lCisJZGVmIGluaXRpYWxpemUodHlwZV9jbGFzcykKKwkJQHR5cGVfY2xhc3MgPSB0eXBlX2NsYXNzCisJCUBhcmdzID0gQ1BQOjpBcmdzLm5ldygpCisJCUBzdWl0ZSA9IENQUDo6U3VpdGUubmV3KCkKKwllbmQKKwlkZWYgZm9yd2FyZF9kZWMoKSA7IEZvcndhcmREZWMubmV3KHNlbGYpIDsgZW5kCisJZGVmIHBwX2ZvcndhcmRfZGVjKHN0YXRlKQorCQlzdGF0ZS5wcmludCgifiN7QHR5cGVfY2xhc3MubmFtZX0oIikKKwkJc3RhdGUucHAoQGFyZ3MpCisJCXN0YXRlLnByaW50KCIpIikKKwllbmQKKwlkZWYgcHAoc3RhdGUpCisJCXN0YXRlLnByaW50KCIje0B0eXBlX2NsYXNzLmNob3BfbWV0aG9kX3ByZWZpeH1+I3tAdHlwZV9jbGFzcy5uYW1lfSgiKQorCQlzdGF0ZS5wcChAYXJncykKKwkJc3RhdGUucHJpbnQoIikgIikKKwkJc3RhdGUucHAoQHN1aXRlKQorCQlzdGF0ZS52X3BhZCgyKQorCWVuZAorCWFsaWFzX21ldGhvZCA6cHBfaGVhZGVyX2ZpbGUsIDpwcF9mb3J3YXJkX2RlYworCWFsaWFzX21ldGhvZCA6cHBfY2NfZmlsZSwgOnBwCitlbmQKK2NsYXNzIENQUDo6SW5jbHVkZQorCWF0dHJfYWNjZXNzb3IgOmZpbGVuYW1lCisJZGVmIGluaXRpYWxpemUoZmlsZW5hbWUpCisJCUBmaWxlbmFtZSA9IGZpbGVuYW1lCisJZW5kCisJZGVmIHBwKHN0YXRlKQorCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJc3RhdGUuc3VwcHJlc3NfaW5kZW50KCkKKwkJc3RhdGUucHJpbnQoIiNpbmNsdWRlICN7QGZpbGVuYW1lfSIpCisJCXN0YXRlLmVuZGxpbmUoKQorCWVuZAorZW5kCitjbGFzcyBDUFA6OkluY2x1ZGVHdWFyZAorCWF0dHJfYWNjZXNzb3IgOm5hbWUsOnN1aXRlCisJZGVmIGluaXRpYWxpemUoc3VpdGUgPSBDUFA6OlN1aXRlLm5ldygpKQorCQlAc3VpdGUgPSBzdWl0ZQorCWVuZAorCWRlZiBzZWxmLnJhbmRfbmFtZShsZW4gPSA0MCkKKwkJc3RyID0gIiIKKwkJbGVuLnRpbWVzIHsgc3RyICs9ICgocmFuZCgyNikgKyA/QSkuY2hyKX0KKwkJcmV0dXJuIHN0cgorCWVuZAorCWRlZiBwcChzdGF0ZSkKKwkJQG5hbWUgfHw9IEluY2x1ZGVHdWFyZC5yYW5kX25hbWUKKwkJc3RhdGUubmVlZHNfc2VtaSA9IGZhbHNlCisJCXN0YXRlLnN1cHByZXNzX2luZGVudCgpCisJCXN0YXRlLnByaW50KCIjaWZuZGVmICN7QG5hbWV9IikKKwkJc3RhdGUuZW5kbGluZSgpCisJCXN0YXRlLnN1cHByZXNzX2luZGVudCgpCisJCXN0YXRlLnByaW50KCIjZGVmaW5lICN7QG5hbWV9IikKKwkJc3RhdGUuZW5kbGluZSgpCisJCWlmKEBzdWl0ZS5yZXNwb25kX3RvPyg6cHBfbm9fYnJhY2VzKSkKKwkJCUBzdWl0ZS5wcF9ub19icmFjZXMoc3RhdGUpCisJCWVsc2UKKwkJCXN0YXRlLnBwKEBzdWl0ZSkKKwkJZW5kCisJCXN0YXRlLmVuZGxpbmUoKQorCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJc3RhdGUuc3VwcHJlc3NfaW5kZW50KCkKKwkJc3RhdGUucHJpbnQoIiNlbmRpZiAgLy8gI3tAbmFtZX0iKQorCQlzdGF0ZS5lbmRsaW5lKCkKKwllbmQKK2VuZAorY2xhc3MgQ1BQOjpJZm5EZWYKKwlhdHRyX2FjY2Vzc29yIDpuYW1lLDpzdWl0ZQorCWRlZiBpbml0aWFsaXplKHN1aXRlID0gQ1BQOjpTdWl0ZS5uZXcoKSkKKwkJQHN1aXRlID0gc3VpdGUKKwllbmQKKwlkZWYgcHAoc3RhdGUpCisJCXN0YXRlLm5lZWRzX3NlbWkgPSBmYWxzZQorCQlzdGF0ZS5zdXBwcmVzc19pbmRlbnQoKQorCQlzdGF0ZS5wcmludCgiI2lmbmRlZiAje0BuYW1lfSIpCisJCXN0YXRlLmVuZGxpbmUoKQorCQlpZihAc3VpdGUucmVzcG9uZF90bz8oOnBwX25vX2JyYWNlcykpCisJCQlAc3VpdGUucHBfbm9fYnJhY2VzKHN0YXRlKQorCQllbHNlCisJCQlzdGF0ZS5wcChAc3VpdGUpCisJCWVuZAorCQlzdGF0ZS5lbmRsaW5lKCkKKwkJc3RhdGUubmVlZHNfc2VtaSA9IGZhbHNlCisJCXN0YXRlLnN1cHByZXNzX2luZGVudCgpCisJCXN0YXRlLnByaW50KCIjZW5kaWYgIC8vICN7QG5hbWV9IikKKwkJc3RhdGUuZW5kbGluZSgpCisJZW5kCitlbmQKK2NsYXNzIENQUDo6UHJlcHJvY2Vzc29ySWYKKwlhdHRyX2FjY2Vzc29yIDpuYW1lLDpzdWl0ZQorCWRlZiBpbml0aWFsaXplKGlmc3VpdGUsIGVsc2VzdWl0ZSkKKwkJQGlmc3VpdGUgPSBpZnN1aXRlCisJCUBlbHNlc3VpdGUgPSBlbHNlc3VpdGUKKwllbmQKKwlkZWYgd3JpdGVfaWYoc3RhdGUpCisJCXN0YXRlLm5lZWRzX3NlbWkgPSBmYWxzZQorCQlzdGF0ZS5zdXBwcmVzc19pbmRlbnQoKQorCQlzdGF0ZS5wcmludCgiI2lmICN7QG5hbWV9IikKKwkJc3RhdGUuZW5kbGluZSgpCisJZW5kCisJZGVmIHdyaXRlX2Vsc2Uoc3RhdGUpCisJCXN0YXRlLm5lZWRzX3NlbWkgPSBmYWxzZQorCQlzdGF0ZS5zdXBwcmVzc19pbmRlbnQoKQorCQlzdGF0ZS5wcmludCgiI2Vsc2UgIC8vICN7QG5hbWV9IikKKwkJc3RhdGUuZW5kbGluZSgpCisJZW5kCisJZGVmIHdyaXRlX2VuZGlmKHN0YXRlKQorCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJc3RhdGUuc3VwcHJlc3NfaW5kZW50KCkKKwkJc3RhdGUucHJpbnQoIiNlbmRpZiAgLy8gI3tAbmFtZX0iKQorCQlzdGF0ZS5lbmRsaW5lKCkKKwllbmQKKwlkZWYgcHBfaW5saW5lKHN0YXRlKQorCQlzZWxmLndyaXRlX2lmKHN0YXRlKQorCQlAaWZzdWl0ZS5wcF9pbmxpbmUoc3RhdGUpCisJCWlmKEBlbHNlc3VpdGUgIT0gbmlsKQorCQkJc2VsZi53cml0ZV9lbHNlKHN0YXRlKQorCQkJQGVsc2VzdWl0ZS5wcF9pbmxpbmUoc3RhdGUpCisJCWVuZAorCQlzZWxmLndyaXRlX2VuZGlmKHN0YXRlKQorCWVuZAorCWRlZiBwcChzdGF0ZSkKKwkJc2VsZi53cml0ZV9pZihzdGF0ZSkKKwkJaWYoQGlmc3VpdGUucmVzcG9uZF90bz8oOnBwX25vX2JyYWNlcykpCisJCQlAaWZzdWl0ZS5wcF9ub19icmFjZXMoc3RhdGUpCisJCWVsc2UKKwkJCXN0YXRlLnBwKEBpZnN1aXRlKQorCQllbmQKKwkJaWYoQGVsc2VzdWl0ZSAhPSBuaWwpCisJCQlzZWxmLndyaXRlX2Vsc2Uoc3RhdGUpCisJCQlpZihAZWxzZXN1aXRlLnJlc3BvbmRfdG8/KDpwcF9ub19icmFjZXMpKQorCQkJCUBlbHNlc3VpdGUucHBfbm9fYnJhY2VzKHN0YXRlKQorCQkJZWxzZQorCQkJCXN0YXRlLnBwKEBlbHNlc3VpdGUpCisJCQllbmQKKwkJZW5kCisJCXNlbGYud3JpdGVfZW5kaWYoc3RhdGUpCisJZW5kCitlbmQKK2NsYXNzIENQUDo6VXNpbmcKKwlkZWYgaW5pdGlhbGl6ZSh1c2luZykKKwkJQHVzaW5nID0gdXNpbmcKKwllbmQKKwlkZWYgcHAoc3RhdGUpCisJCXN0YXRlLnByaW50KCJ1c2luZyAje0B1c2luZ30iKQorCWVuZAorZW5kCmRpZmYgLS1naXQgYS9hb3MvYnVpbGQvcXVldWVzL2NwcF9wcmV0dHlfcHJpbnQvZGVwX2ZpbGVfcGFpci5yYiBiL2Fvcy9idWlsZC9xdWV1ZXMvY3BwX3ByZXR0eV9wcmludC9kZXBfZmlsZV9wYWlyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjNmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL2NwcF9wcmV0dHlfcHJpbnQvZGVwX2ZpbGVfcGFpci5yYgpAQCAtMCwwICsxLDQ3MCBAQAorY2xhc3MgR3JvdXBFbGVtZW50CisJZGVmIGFkZF9ncm91cF9kZXAoZ3JvdXBfZGVwKQorCQlAZ3JvdXBfZGVwID0gZ3JvdXBfZGVwCisJZW5kCisJZGVmIGFkanVzdF9ncm91cChzdGF0ZSxvbGRfZ3JvdXApCisJCWlmKEBncm91cF9kZXAgIT0gb2xkX2dyb3VwKQorCQkJQGdyb3VwX2RlcC5hZGp1c3RfZnJvbShzdGF0ZSxvbGRfZ3JvdXApCisJCWVuZAorCQlyZXR1cm4gQGdyb3VwX2RlcAorCWVuZAorZW5kCitjbGFzcyBEZXBNYXNrIDwgR3JvdXBFbGVtZW50CisJZGVmIGluaXRpYWxpemUoZWxlbSkKKwkJQGVsZW0gPSBlbGVtCisJCUBkZXBzID0gW10KKwllbmQKKwlkZWYgYWRkX2RlcChkZXApCisJCUBkZXBzIDw8IGRlcAorCQlzZWxmCisJZW5kCisJZGVmIG1ldGhvZF9taXNzaW5nKG1ldGhvZCwqYXJncywmYmxrKQorCQlAZWxlbS5zZW5kKG1ldGhvZCwqYXJncywmYmxrKQorCWVuZAorCWFsaWFzX21ldGhvZCA6b2xkX3Jlc3BvbmRfdG8sIDpyZXNwb25kX3RvPworCWRlZiByZXNwb25kX3RvPyhtZXRob2QpCisJCW9sZF9yZXNwb25kX3RvKG1ldGhvZCkgfHwgQGVsZW0ucmVzcG9uZF90bz8obWV0aG9kKQorCWVuZAorZW5kCisKK2NsYXNzIE1lbWJlckVsZW1lbnRIZWFkZXIgPCBHcm91cEVsZW1lbnQKKwlkZWYgaW5pdGlhbGl6ZShlbGVtKQorCQlAZWxlbSA9IGVsZW0KKwllbmQKKwlkZWYgcHAoc3RhdGUpCisJCWlmKEBlbGVtLnJlc3BvbmRfdG8/KDpwcF9oZWFkZXJfZmlsZSkpCisJCQlAZWxlbS5wcF9oZWFkZXJfZmlsZShzdGF0ZSkKKwkJZWxzZQorCQkJc3RhdGUucHAoQGVsZW0pCisJCWVuZAorCWVuZAorCWRlZiBzZWxmLmNoZWNrKHBsYW4sZWxlbSkKKwkJcGxhbi5wdXNoKHNlbGYubmV3KGVsZW0pKQorCWVuZAorZW5kCitjbGFzcyBNZW1iZXJFbGVtZW50SW5saW5lIDwgR3JvdXBFbGVtZW50CisJZGVmIGluaXRpYWxpemUoZWxlbSkKKwkJQGVsZW0gPSBlbGVtCisJZW5kCisJZGVmIHBwKHN0YXRlKQorCQlpZihAZWxlbS5yZXNwb25kX3RvPyg6cHBfaW5saW5lKSkKKwkJCUBlbGVtLnBwX2lubGluZShzdGF0ZSkKKwkJZWxzZQorCQkJc3RhdGUucHAoQGVsZW0pCisJCWVuZAorCWVuZAorZW5kCitjbGFzcyBNZW1iZXJFbGVtZW50Q0MgPCBHcm91cEVsZW1lbnQKKwlhdHRyX2FjY2Vzc29yIDpwcF9vdmVycmlkZQorCWRlZiBpbml0aWFsaXplKGVsZW0pCisJCUBlbGVtID0gZWxlbQorCWVuZAorCWRlZiBwcChzdGF0ZSkKKwkJcmV0dXJuIHN0YXRlLnBwKEBlbGVtKSBpZihAcHBfb3ZlcnJpZGUpCisJCUBlbGVtLnBwX2NjX2ZpbGUoc3RhdGUpCisJZW5kCisJZGVmIHNlbGYuY2hlY2socGxhbixlbGVtKQorCQlwbGFuLnB1c2goc2VsZi5uZXcoZWxlbSkpIGlmKGVsZW0ucmVzcG9uZF90bz8oOnBwX2NjX2ZpbGUpKQorCWVuZAorZW5kCitjbGFzcyBJbXBsaWNpdE5hbWUKKwlhdHRyX2FjY2Vzc29yIDpwYXJlbnQKKwlkZWYgaW5pdGlhbGl6ZShuYW1lLHBhcmVudCkKKwkJQG5hbWUgPSBuYW1lCisJCUBwYXJlbnQgPSBwYXJlbnQKKwllbmQKKwlkZWYgY2xvc2Uoc3RhdGUpCisJCXN0YXRlLmVuZGxpbmUoKQorCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJc3RhdGUucHJpbnQoIn0gIC8vIG5hbWVzcGFjZSAje0BuYW1lfVxuIikKKwllbmQKKwlkZWYgbmFtZSgpCisJCWlmKEBwYXJlbnQpCisJCQlyZXR1cm4gQHBhcmVudC5uYW1lICsgIi4iICsgQG5hbWUKKwkJZWxzZQorCQkJcmV0dXJuICIuIiArIEBuYW1lCisJCWVuZAorCWVuZAorCWRlZiBvcGVuKHN0YXRlKQorCQlzdGF0ZS5lbmRsaW5lKCkKKwkJc3RhdGUubmVlZHNfc2VtaSA9IGZhbHNlCisJCXN0YXRlLnByaW50KCJuYW1lc3BhY2UgI3tAbmFtZX0ge1xuIikKKwllbmQKKwlkZWYgYWRqdXN0X2Zyb20oc3RhdGUsb2xkX2dyb3VwKQorCQljbG9zZV9ncnBzID0gW10KKwkJZ3JwID0gb2xkX2dyb3VwCisJCXdoaWxlKGdycCkKKwkJCWNsb3NlX2dycHMgPDwgZ3JwCisJCQlncnAgPSBncnAucGFyZW50CisJCWVuZAorCQlvcGVuX2dycHMgPSBbXQorCQlncnAgPSBzZWxmCisJCXdoaWxlKGdycCkKKwkJCW9wZW5fZ3JwcyA8PCBncnAKKwkJCWdycCA9IGdycC5wYXJlbnQKKwkJZW5kCisJCXdoaWxlKG9wZW5fZ3Jwc1stMV0gPT0gY2xvc2VfZ3Jwc1stMV0gJiYgY2xvc2VfZ3Jwc1stMV0pCisJCQljbG9zZV9ncnBzLnBvcCgpCisJCQlvcGVuX2dycHMucG9wKCkKKwkJZW5kCisJCWNsb3NlX2dycHMuZWFjaCBkbyB8Z3JwfAorCQkJZ3JwLmNsb3NlKHN0YXRlKQorCQllbmQKKwkJb3Blbl9ncnBzLnJldmVyc2UuZWFjaCBkbyB8Z3JwfAorCQkJZ3JwLm9wZW4oc3RhdGUpCisJCWVuZAorCWVuZAorCWRlZiBhZGp1c3RfdG8oc3RhdGUsbmV3X2dyb3VwKQorCQlncnAgPSBzZWxmCisJCXdoaWxlKGdycCkKKwkJCWdycC5jbG9zZShzdGF0ZSkKKwkJCWdycCA9IGdycC5wYXJlbnQKKwkJZW5kCisJZW5kCitlbmQKK2NsYXNzIEdyb3VwUGxhbiA8IEdyb3VwRWxlbWVudAorCWF0dHJfYWNjZXNzb3IgOmltcGxpY2l0CisJZGVmIGluaXRpYWxpemUoZ3JvdXBfZWxlbSxtZW1iZXJzID0gW10pCisJCUBncm91cF9lbGVtID0gZ3JvdXBfZWxlbQorCQlAbWVtYmVycyA9IENQUDo6U3VpdGUubmV3KG1lbWJlcnMpCisJZW5kCisJZGVmIHB1c2gobWVtKQorCQltZW0uYWRkX2dyb3VwX2RlcChAaW1wbGljaXQpIGlmKEBpbXBsaWNpdCkKKwkJQG1lbWJlcnMgPDwgbWVtCisJZW5kCisJZGVmIHBwKHN0YXRlKQorCQlpZihAZ3JvdXBfZWxlbSkKKwkJCUBncm91cF9lbGVtLm9wZW4oc3RhdGUpCisJCWVuZAorCQlncm91cCA9IG5pbAorCQlAbWVtYmVycy5lYWNoIGRvIHxtZW1iZXJ8CisJCQlncm91cCA9IG1lbWJlci5hZGp1c3RfZ3JvdXAoc3RhdGUsZ3JvdXApCisJCQkjcHV0cyAiYXQ6I3tncm91cC5uYW1lfSIgaWYoZ3JvdXAucmVzcG9uZF90bz8oOm5hbWUpKQorCQkJc3RhdGUuZW5kbGluZSgpCisJCQlzdGF0ZS5uZWVkc19zZW1pID0gdHJ1ZQorCQkJc3RhdGUucHAobWVtYmVyKQorCQkJc3RhdGUuZW5kbGluZSgpCisJCWVuZAorCQlncm91cC5hZGp1c3RfdG8oc3RhdGUsbmlsKSBpZihncm91cCkKKwkJaWYoQGdyb3VwX2VsZW0pCisJCQlAZ3JvdXBfZWxlbS5jbG9zZShzdGF0ZSkKKwkJZW5kCisJZW5kCitlbmQKK2NsYXNzIENDX01hc2sKKwlkZWYgaW5pdGlhbGl6ZShlbGVtKQorCQlAZWxlbSA9IGVsZW0KKwllbmQKKwlkZWYgcGxhbl9jYyhwbGFuKQorCQllbGVtID0gTWVtYmVyRWxlbWVudENDLm5ldyhAZWxlbSkKKwkJZWxlbS5wcF9vdmVycmlkZSA9IHRydWUKKwkJcGxhbi5wdXNoKGVsZW0pCisJZW5kCisJZGVmIHBsYW5faGVhZGVyKHBsYW4pOworCWVuZAorZW5kCittb2R1bGUgVHlwZXMKKwljbGFzcyBUeXBlRGVmCisJCWRlZiBpbml0aWFsaXplKHR5cGUsbmFtZSkKKwkJCUB0eXBlID0gdHlwZQorCQkJQG5hbWUgPSBuYW1lCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcCgidHlwZWRlZiAje0B0eXBlLm5hbWV9ICN7QG5hbWV9IikKKwkJZW5kCisJZW5kCisJY2xhc3MgVHlwZQorCQlhdHRyX2FjY2Vzc29yIDpuYW1lLDpzdGF0aWMsOmRlYyw6c3BhY2UKKwkJZGVmIGluaXRpYWxpemUobmFtZXNwYWNlLG5hbWUpCisJCQlAc3BhY2UgPSBuYW1lc3BhY2UKKwkJCUBuYW1lID0gbmFtZQorCQkJQG1lbWJlcnMgPSBbXQorCQkJQHByb3RlY3Rpb25zID0ge30KKwkJCUBkZXBzID0gW10KKwkJZW5kCisgICAgZGVmIHBhcmVudF9jbGFzcworICAgICAgQHBhcmVudC5zcGxpdCgnICcpWzFdIGlmIEBwYXJlbnQKKyAgICBlbmQKKwkJY2xhc3MgUHJvdGVjdGlvbkdyb3VwCisJCQlkZWYgaW5pdGlhbGl6ZShuYW1lKQorCQkJCUBuYW1lID0gbmFtZQorCQkJZW5kCisJCQlkZWYgYWRqdXN0X2Zyb20oc3RhdGUsb3RoZXIpCisJCQkJc3RhdGUuaW5kZW50IC09IDEKKwkJCQlzdGF0ZS5wcCgiI0BuYW1lOiIpCisJCQkJc3RhdGUuZW5kbGluZQorCQkJCXN0YXRlLmluZGVudCArPSAxCisJCQllbmQKKwkJCWRlZiBhZGp1c3RfdG8oc3RhdGUsb3RoZXIpCisJCQkJb3RoZXIuYWRqdXN0X2Zyb20oc3RhdGUsc2VsZikgaWYgb3RoZXIKKwkJCWVuZAorCQllbmQKKwkJUHJvdGVjdGlvbkdyb3VwcyA9IHsgOnB1YmxpYyA9PiBQcm90ZWN0aW9uR3JvdXAubmV3KDpwdWJsaWMpLAorCQkJOnByb3RlY3RlZCA9PiBQcm90ZWN0aW9uR3JvdXAubmV3KDpwcm90ZWN0ZWQpLAorCQkgCTpwcml2YXRlID0+IFByb3RlY3Rpb25Hcm91cC5uZXcoOnByaXZhdGUpfQorCQlkZWYgc2V0X3BhcmVudChwYXJlbnQpCisJCQlAcGFyZW50ID0gcGFyZW50CisJCWVuZAorCQlkZWYgY2hvcF9tZXRob2RfcHJlZml4KCkKKwkJCUBzcGFjZS5jaG9wX21ldGhvZF9wcmVmaXggKyAiI0BuYW1lOjoiCisJCWVuZAorCQlkZWYgZGVmX2Z1bmMoKmFyZ3MpCisJCQlmdW5jID0gQ1BQOjpNZW1iZXJGdW5jLm5ldyhzZWxmLCphcmdzKQorCQkJQHByb3RlY3Rpb25zW2Z1bmNdID0gQHByb3RlY3Rpb24KKwkJCUBtZW1iZXJzIDw8IGZ1bmMKKwkJCXJldHVybiBmdW5jCisJCWVuZAorCQlkZWYgYWRkX2NjX2NvbW1lbnQoKmFyZ3MpCisJCQlhcmdzLmVhY2ggZG8gfGFyZ3wKKwkJCQlAbWVtYmVycy5wdXNoKENDX01hc2submV3KENQUDo6Q29tbWVudC5uZXcoYXJnKSkpCisJCQllbmQKKwkJZW5kCisJCWRlZiBwbGFuX2NjKHBsYW4pCisJCQlAbWVtYmVycy5lYWNoIGRvIHxtZW1iZXJ8CisJCQkJaWYobWVtYmVyLnJlc3BvbmRfdG8/KDpwbGFuX2NjKSkKKwkJCQkJbWVtYmVyLnBsYW5fY2MocGxhbikKKwkJCQllbHNpZihtZW1iZXIucmVzcG9uZF90bz8oOnBwX2NjX2ZpbGUpKQorCQkJCQlwbGFuLnB1c2goTWVtYmVyRWxlbWVudENDLm5ldyhtZW1iZXIpKQorCQkJCWVuZAorCQkJZW5kCisJCWVuZAorCQlkZWYgcGxhbl9oZWFkZXIocGxhbikKKwkJCWdyb3VwX3BsYW4gPSBHcm91cFBsYW4ubmV3KHNlbGYpCisJCQlwbGFuLnB1c2goZ3JvdXBfcGxhbikKKwkJCUBtZW1iZXJzLmVhY2ggZG8gfG1lbWJlcnwKKwkJCQlncm91cF9wbGFuLmltcGxpY2l0ID0gUHJvdGVjdGlvbkdyb3Vwc1tAcHJvdGVjdGlvbnNbbWVtYmVyXV0KKwkJCQlpZihtZW1iZXIucmVzcG9uZF90bz8oOnBsYW5faGVhZGVyKSkKKwkJCQkJbWVtYmVyLnBsYW5faGVhZGVyKGdyb3VwX3BsYW4pCisJCQkJZWxzZQorCQkJCQlncm91cF9wbGFuLnB1c2goTWVtYmVyRWxlbWVudEhlYWRlci5uZXcobWVtYmVyKSkKKwkJCQllbmQKKwkJCQkjbWVtYmVyLnBsYW5fY2MocGxhbikKKwkJCWVuZAorCQllbmQKKwkJZGVmIG9wZW4oc3RhdGUpCisJCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJCXN0YXRlLnZfcGFkKDIpCisJCQlpZihAc3RhdGljKQorCQkJCXN0YXRlLnByaW50KCJzdGF0aWMgIikKKwkJCWVuZAorCQkJc2VsZi50ZW1wbGF0ZV9oZWFkZXIoc3RhdGUpIGlmKHNlbGYucmVzcG9uZF90bz8oOnRlbXBsYXRlX2hlYWRlcikpCisJCQlzdGF0ZS5wcmludCgiI3tzZWxmLmNsYXNzLnR5cGVfbmFtZX0gI3tAbmFtZX0iKQorCQkJc2VsZi50ZW1wbGF0ZV9zcGVjX2FyZ3Moc3RhdGUpIGlmKHNlbGYucmVzcG9uZF90bz8oOnRlbXBsYXRlX3NwZWNfYXJncykpCisJCQlpZihAcGFyZW50KQorCQkJCXN0YXRlLnByaW50KCIgOiAje0BwYXJlbnR9IHtcbiIpCisJCQllbHNlCisJCQkJc3RhdGUucHAoIiB7XG4iKQorCQkJZW5kCisJCQlzdGF0ZS5pbmRlbnQgKz0gMgorCQllbmQKKwkJZGVmIGNsb3NlKHN0YXRlKQorCQkJc3RhdGUuaW5kZW50IC09IDIKKwkJCXN0YXRlLm5lZWRzX3NlbWkgPSB0cnVlCisJCQlpZihAZGVjKQorCQkJCXN0YXRlLnByaW50KCJcbn0gI3tAZGVjfSIpCisJCQllbHNlCisJCQkJc3RhdGUucHJpbnQoIlxufSIpCisJCQllbmQKKwkJCXN0YXRlLnZfcGFkKDIpCisJCWVuZAorCQlkZWYgYWRkX2RlcChvdGhlcikKKwkJCUBkZXBzIDw8IG90aGVyCisJCQlzZWxmCisJCWVuZAorCWVuZAorCWNsYXNzIENsYXNzIDwgVHlwZQorCQlkZWYgYWRkX21lbWJlcihwcm90ZWN0aW9uLG1lbWJlcikKKwkJCUBwcm90ZWN0aW9uID0gcHJvdGVjdGlvbgorCQkJQG1lbWJlcnMucHVzaChtZW1iZXIpCisJCQlAcHJvdGVjdGlvbnNbbWVtYmVyXSA9IHByb3RlY3Rpb24KKwkJCXJldHVybiBtZW1iZXIKKwkJZW5kCisJCWRlZiBhZGRfc3RydWN0KCphcmdzKQorCQkJYWRkX21lbWJlcig6cHVibGljLCBUeXBlczo6U3RydWN0Lm5ldyhzZWxmLCphcmdzKSkKKwkJZW5kCisJCWRlZiBwdWJsaWMoKSA7IEBwcm90ZWN0aW9uID0gOnB1YmxpYyA7IGVuZCAKKwkJZGVmIHByb3RlY3RlZCgpIDsgQHByb3RlY3Rpb24gPSA6cHJvdGVjdGVkIDsgZW5kIAorCQlkZWYgcHJpdmF0ZSgpIDsgQHByb3RlY3Rpb24gPSA6cHJpdmF0ZSA7IGVuZCAKKwkJZGVmIHNlbGYudHlwZV9uYW1lKCkgOyAiY2xhc3MiIDsgZW5kCisJZW5kCisJY2xhc3MgUHJlcHJvY2Vzc29ySWYgPCBUeXBlCisJCWRlZiBpbml0aWFsaXplKCphcmdzKQorCQkJc3VwZXIoKmFyZ3MpCisJCWVuZAorCQlkZWYgYWRkX21lbWJlcihtZW1iZXIpCisJCQlAbWVtYmVycy5wdXNoKG1lbWJlcikKKwkJCXJldHVybiBtZW1iZXIKKwkJZW5kCisJCWRlZiBzZWxmLnR5cGVfbmFtZSgpIDsgIiNpZiIgOyBlbmQKKwkJZGVmIG9wZW4oc3RhdGUpCisJCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJCXN0YXRlLnByaW50KCJcbiNpZiAje0BuYW1lfSIpCisJCWVuZAorCQlkZWYgY2xvc2Uoc3RhdGUpCisJCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJCXN0YXRlLnByaW50KCJcbiNlbmRpZiAgLy8gI3tAbmFtZX0iKQorCQllbmQKKwllbmQKKwljbGFzcyBTdHJ1Y3QgPCBUeXBlCisJCWF0dHJfYWNjZXNzb3IgOm1lbWJlcnMKKwkJZGVmIGFkZF9tZW1iZXIobWVtYmVyKQorCQkJQG1lbWJlcnMucHVzaChtZW1iZXIpCisJCQlyZXR1cm4gbWVtYmVyCisJCWVuZAorCQlkZWYgc2VsZi50eXBlX25hbWUoKSA7ICJzdHJ1Y3QiIDsgZW5kCisJZW5kCisJY2xhc3MgVGVtcGxhdGVDbGFzcyA8IENsYXNzCisJCWRlZiBpbml0aWFsaXplKCphcmdzKQorCQkJc3VwZXIoKmFyZ3MpCisJCQlAdF9hcmdzID0gQ1BQOjpBcmdzLm5ldygpCisJCWVuZAorCQlkZWYgc3BlY19hcmdzKCkKKwkJCXJldHVybiBAc3BlY19hcmdzIHx8PSBDUFA6OkFyZ3MubmV3KCkKKwkJZW5kCisJCWRlZiB0ZW1wbGF0ZV9oZWFkZXIoc3RhdGUpCisJCQlpZihAdF9hcmdzLmxlbmd0aCA+IDApCisJCQkJc3RhdGUucHAoInRlbXBsYXRlIDwgIikKKwkJCQlzdGF0ZS5wcChAdF9hcmdzKQorCQkJZWxzZQorCQkJCXN0YXRlLnBwKCJ0ZW1wbGF0ZSA8ICIpCisJCQllbmQKKwkJCXN0YXRlLnBwKCI+XG4iKQorCQllbmQKKwkJZGVmIHBsYW5fY2MocGxhbikKKworCQllbmQKKwkJZGVmIHBsYW5faGVhZGVyKHBsYW4pCisJCQlncm91cF9wbGFuID0gR3JvdXBQbGFuLm5ldyhzZWxmKQorCQkJcGxhbi5wdXNoKGdyb3VwX3BsYW4pCisJCQlAbWVtYmVycy5lYWNoIGRvIHxtZW1iZXJ8CisJCQkJZ3JvdXBfcGxhbi5pbXBsaWNpdCA9IFByb3RlY3Rpb25Hcm91cHNbQHByb3RlY3Rpb25zW21lbWJlcl1dCisJCQkJaWYobWVtYmVyLnJlc3BvbmRfdG8/KDpwbGFuX2hlYWRlcikpCisJCQkJCW1lbWJlci5wbGFuX2hlYWRlcihncm91cF9wbGFuKQorCQkJCWVsc2UKKwkJCQkJZ3JvdXBfcGxhbi5wdXNoKE1lbWJlckVsZW1lbnRJbmxpbmUubmV3KG1lbWJlcikpCisJCQkJZW5kCisJCQllbmQKKwkJZW5kCisJCWRlZiB0ZW1wbGF0ZV9zcGVjX2FyZ3Moc3RhdGUpCisJCQlpZihAc3BlY19hcmdzKQorCQkJCXN0YXRlLnBwKCI8ICIpCisJCQkJc3RhdGUucHAoQHNwZWNfYXJncykKKwkJCQlzdGF0ZS5wcCgiPiIpCisJCQllbmQKKwkJZW5kCisJZW5kCitlbmQKK2NsYXNzIERlcEZpbGVQYWlyCisJY2xhc3MgTmFtZVNwYWNlCisJCWRlZiBpbml0aWFsaXplKG5hbWUscGFyZW50KQorCQkJQG5hbWUsQHBhcmVudCA9IG5hbWUscGFyZW50CisJCQlAbWVtYmVycyA9IFtdCisJCWVuZAorCQlkZWYgYWRkX3N0cnVjdCgqYXJncykKKwkJCWFkZCBUeXBlczo6U3RydWN0Lm5ldyhzZWxmLCphcmdzKQorCQllbmQKKwkJZGVmIGFkZF90ZW1wbGF0ZSgqYXJncykKKwkJCWFkZCBUeXBlczo6VGVtcGxhdGVDbGFzcy5uZXcoc2VsZiwqYXJncykKKwkJZW5kCisJCWRlZiBhZGRfY2xhc3MoKmFyZ3MpCisJCQlhZGQgVHlwZXM6OkNsYXNzLm5ldyhzZWxmLCphcmdzKQorCQllbmQKKwkJZGVmIGFkZF9jYyhhcmcpCisJCQlAbWVtYmVycy5wdXNoKENDX01hc2submV3KGFyZykpCisJCWVuZAorCQlkZWYgY2hvcF9tZXRob2RfcHJlZml4KCkKKwkJCSIiCisJCWVuZAorCQlkZWYgY2xhc3NfY29tbWVudCgqYXJncykKKwkJCWFkZCBDUFA6OkNvbW1lbnQubmV3KCphcmdzKQorCQllbmQKKwkJZGVmIHZhcl9kZWNfY29tbWVudCgqYXJncykKKwkJCWFkZCBDUFA6OkNvbW1lbnQubmV3KCphcmdzKQorCQllbmQKKwkJZGVmIGFkZF92YXJfZGVjKGFyZykKKwkJCWFkZCBEZXBNYXNrLm5ldyhhcmcpCisJCWVuZAorCQlkZWYgcGxhbl9jYyhwbGFuKQorCQkJcGxhbi5pbXBsaWNpdCA9IEltcGxpY2l0TmFtZS5uZXcoQG5hbWUscGxhbi5pbXBsaWNpdCkKKwkJCUBtZW1iZXJzLmVhY2ggZG8gfG1lbWJlcnwKKwkJCQlpZihtZW1iZXIucmVzcG9uZF90bz8oOnBsYW5fY2MpKQorCQkJCQltZW1iZXIucGxhbl9jYyhwbGFuKQorCQkJCWVsc2UKKwkJCQkJTWVtYmVyRWxlbWVudENDLmNoZWNrKHBsYW4sbWVtYmVyKQorCQkJCWVuZAorCQkJZW5kCisJCQlwbGFuLmltcGxpY2l0ID0gcGxhbi5pbXBsaWNpdC5wYXJlbnQKKwkJZW5kCisJCWRlZiBwbGFuX2hlYWRlcihwbGFuKQorCQkJcGxhbi5pbXBsaWNpdCA9IEltcGxpY2l0TmFtZS5uZXcoQG5hbWUscGxhbi5pbXBsaWNpdCkKKwkJCUBtZW1iZXJzLmVhY2ggZG8gfG1lbWJlcnwKKwkJCQlpZihtZW1iZXIucmVzcG9uZF90bz8oOnBsYW5faGVhZGVyKSkKKwkJCQkJbWVtYmVyLnBsYW5faGVhZGVyKHBsYW4pCisJCQkJZWxzZQorCQkJCQlNZW1iZXJFbGVtZW50SGVhZGVyLmNoZWNrKHBsYW4sbWVtYmVyKQorCQkJCWVuZAorCQkJZW5kCisJCQlwbGFuLmltcGxpY2l0ID0gcGxhbi5pbXBsaWNpdC5wYXJlbnQKKwkJZW5kCisJCWRlZiBhZGQgdmFsCisJCQlAbWVtYmVycyA8PCB2YWwKKwkJCXZhbAorCQllbmQKKwllbmQKKwlkZWYgaW5pdGlhbGl6ZShyZWxfcGF0aCkKKwkJQHJlbF9wYXRoID0gcmVsX3BhdGgKKwkJQGNjX2luY2x1ZGVzID0gW10KKwkJQGhlYWRlcl9pbmNsdWRlcyA9IFtdCisJCUBzcGFjZXMgPSBbXQorCQlAY2NfdXNpbmdzID0gW10KKwkJQGNhY2hlID0ge30KKwllbmQKKwlkZWYgYWRkX2NjX2luY2x1ZGUoaW5jX3BhdGgpCisJCUBjY19pbmNsdWRlcyA8PCBDUFA6OkluY2x1ZGUubmV3KGluY19wYXRoKQorCWVuZAorCWRlZiBhZGRfY2NfdXNpbmcodXNpbmcpCisJCUBjY191c2luZ3MgPDwgQ1BQOjpVc2luZy5uZXcodXNpbmcpCisJZW5kCisJZGVmIGFkZF9oZWFkZXJfaW5jbHVkZShpbmNfcGF0aCkKKwkJQGhlYWRlcl9pbmNsdWRlcyA8PCBDUFA6OkluY2x1ZGUubmV3KGluY19wYXRoKQorCWVuZAorCWRlZiBhZGRfbmFtZXNwYWNlKG5hbWUscGFyZW50KQorCQlzcGFjZSA9IE5hbWVTcGFjZS5uZXcobmFtZSxwYXJlbnQpCisJCWlmKHBhcmVudCAhPSBzZWxmKQorCQkJcGFyZW50LmFkZChzcGFjZSkKKwkJZWxzZQorCQkJQHNwYWNlcy5wdXNoKHNwYWNlKQorCQllbmQKKwkJcmV0dXJuIHNwYWNlCisJZW5kCisJZGVmIHNldCh0eXBlLGNhY2hlZCkKKwkJQGNhY2hlW3R5cGVdID0gY2FjaGVkCisJZW5kCisJZGVmIGdldCh0eXBlKQorCQljYWNoZWQgPSBAY2FjaGVbdHlwZV0KKwkJcmV0dXJuIGNhY2hlZCBpZiBjYWNoZWQKKwkJY2FjaGVkID0gdHlwZS5jcmVhdGUoc2VsZikKKwkJY2FjaGVkX2NoZWNrID0gQGNhY2hlW3R5cGVdCisJCXJldHVybiBjYWNoZWRfY2hlY2sgaWYgY2FjaGVkX2NoZWNrCisJCXNldCh0eXBlLGNhY2hlZCkKKwkJcmV0dXJuIGNhY2hlZAorCWVuZAorCWRlZiB3cml0ZV9jY19maWxlKGNwcF9iYXNlLGNjX2ZpbGUpCisJCXBsYW5fY2MgPSBHcm91cFBsYW4ubmV3KG5pbCxlbGVtc19jYyA9IFtdKQorCQlAc3BhY2VzLmVhY2ggZG8gfHNwYWNlfAorCQkJc3BhY2UucGxhbl9jYyhwbGFuX2NjKQorCQllbmQKKwkJc3VpdGUgPSBDUFA6OlN1aXRlLm5ldyhAY2NfaW5jbHVkZXMgKyBAY2NfdXNpbmdzICsgW3BsYW5fY2NdKQorCQlDUFAucHJldHR5X3ByaW50KHN1aXRlLGNjX2ZpbGUpCisJZW5kCisJZGVmIHdyaXRlX2hlYWRlcl9maWxlKGNwcF9iYXNlLGhlYWRlcl9maWxlKQorCQlwbGFuX2hlYWRlciA9IEdyb3VwUGxhbi5uZXcobmlsLGVsZW1zX2NjID0gW10pCisJCUBzcGFjZXMuZWFjaCBkbyB8c3BhY2V8CisJCQlzcGFjZS5wbGFuX2hlYWRlcihwbGFuX2hlYWRlcikKKwkJZW5kCisJCXN1aXRlID0gQ1BQOjpTdWl0ZS5uZXcoQGhlYWRlcl9pbmNsdWRlcyArIFtwbGFuX2hlYWRlcl0pCisJCWluY2x1ZGVfZ3VhcmQgPSBDUFA6OkluY2x1ZGVHdWFyZC5uZXcoc3VpdGUpCisJCWluY2x1ZGVfZ3VhcmQubmFtZSA9IEByZWxfcGF0aC51cGNhc2UuZ3N1YigvW1wuXC9cXF0vLCJfIikgKyAiX0hfIgorCQlDUFAucHJldHR5X3ByaW50KGluY2x1ZGVfZ3VhcmQsaGVhZGVyX2ZpbGUpCisJZW5kCitlbmQKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9xdWV1ZXMvY3BwX3ByZXR0eV9wcmludC9maWxlX3BhaXJfdHlwZXMucmIgYi9hb3MvYnVpbGQvcXVldWVzL2NwcF9wcmV0dHlfcHJpbnQvZmlsZV9wYWlyX3R5cGVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Y2U0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL2NwcF9wcmV0dHlfcHJpbnQvZmlsZV9wYWlyX3R5cGVzLnJiCkBAIC0wLDAgKzEsMjA0IEBACittb2R1bGUgQ1BQCitlbmQKK2NsYXNzIENQUDo6VHlwZVBhaXIKKwlhdHRyX2FjY2Vzc29yIDpuYW1lLDpzdGF0aWMsOmRlYworCWRlZiBpbml0aWFsaXplKG5hbWVzcGFjZSxuYW1lKQorCQlAc3BhY2UsQG5hbWUgPSBuYW1lc3BhY2UsbmFtZQorCQlAbWVtYmVycyA9IFtdCisJCUBwcm90ZWN0aW9ucyA9IHt9CisJCUBkb250X3NvcnQgPSB7fQorCWVuZAorCVByb3RlY3Rpb25UYWJsZSA9IHsgOnB1YmxpYyA9PiAwLDpwcm90ZWN0ZWQgPT4gMSw6cHJpdmF0ZSA9PiAyIH0KKwlkZWYgY29tcChtMSxtMikKKwkJaWYoIShAZG9udF9zb3J0W20xXSB8fCBAZG9udF9zb3J0W20yXSkpCisJCQlpZihAcHJvdGVjdGlvbnNbbTFdICYmIEBwcm90ZWN0aW9uc1ttMl0pCisJCQkJY29tcCA9IFByb3RlY3Rpb25UYWJsZVtAcHJvdGVjdGlvbnNbbTFdXSA8PT4gUHJvdGVjdGlvblRhYmxlW0Bwcm90ZWN0aW9uc1ttMl1dCisJCQkJcmV0dXJuIGNvbXAgaWYoY29tcCAhPSAwKQorCQkJZW5kCisJCQljb21wID0gVHlwZVRhYmxlW20xLmNsYXNzXSA8PT4gVHlwZVRhYmxlW20yLmNsYXNzXQorCQkJcmV0dXJuIGNvbXAgaWYoY29tcCAhPSAwKQorCQllbmQKKwkJcmV0dXJuIEBzdGFibGVbbTFdIDw9PiBAc3RhYmxlW20yXQorCWVuZAorCWRlZiBzZXRfcGFyZW50KHBhcmVudCkKKwkJQHBhcmVudCA9IHBhcmVudAorCWVuZAorCWRlZiBhZGRfY2xhc3MobmFtZSkKKwkJcmV0dXJuIGFkZF9tZW1iZXIoOnB1YmxpYyxDUFA6OkNsYXNzUGFpci5uZXcoc2VsZixuYW1lKSkKKwllbmQKKwlkZWYgYWRkX3N0cnVjdChuYW1lKQorCQlyZXR1cm4gYWRkX21lbWJlcig6cHVibGljLENQUDo6U3RydWN0UGFpci5uZXcoc2VsZixuYW1lKSkKKwllbmQKKwlkZWYgYWRkX2NjX2NvbW1lbnQoKnN0cnMpCisJCXN0cnMuZWFjaCBkbyB8c3RyfAorCQkJQG1lbWJlcnMgPDwgY29tbWVudCA9IENQUDo6Q0NNZW1iZXJXcmFwcGVyLm5ldyhDUFA6OkNvbW1lbnQubmV3KHN0cikpCisJCQlAcHJvdGVjdGlvbnNbY29tbWVudF0gPSBAcHJvdGVjdGlvbgorCQllbmQKKwkJI0Bkb250X3NvcnRbY29tbWVudF0gPSB0cnVlCisJZW5kCisJZGVmIG1ldGhvZF9wcmVmaXgoKQorCQlAc3BhY2UubWV0aG9kX3ByZWZpeCArICIjQG5hbWU6OiIKKwllbmQKKwlkZWYgY2hvcF9tZXRob2RfcHJlZml4KCkKKwkJQHNwYWNlLmNob3BfbWV0aG9kX3ByZWZpeCArICIjQG5hbWU6OiIKKwllbmQKKwlkZWYgcHAoc3RhdGUpCisJCUBzdGFibGUgPSB7fQorCQlAbWVtYmVycy5lYWNoX3dpdGhfaW5kZXggeyB8bWVtLGl8IEBzdGFibGVbbWVtXSA9IGkgfQorCQltZW1iZXJzID0gQG1lbWJlcnMuc29ydCB7IHxtMSxtMnwgY29tcChtMSxtMikgfQorCisJCXN0YXRlLm5lZWRzX3NlbWkgPSBmYWxzZQorCQlzdGF0ZS52X3BhZCgyKQorCQlpZihAc3RhdGljKQorCQkJc3RhdGUucHJpbnQoInN0YXRpYyAiKQorCQllbmQKKwkJaWYoQHBhcmVudCkKKwkJCXN0YXRlLnByaW50KCIje3NlbGYuY2xhc3MudHlwZV9uYW1lfSAje0BuYW1lfSA6ICN7QHBhcmVudH0ge1xuIikKKwkJZWxzZQorCQkJc3RhdGUucHJpbnQoIiN7c2VsZi5jbGFzcy50eXBlX25hbWV9ICN7QG5hbWV9IHtcbiIpCisJCWVuZCAKKwkJc3RhdGUuaW5kZW50ICs9IDIKKwkJcHJvdGVjdGlvbiA9IG5pbCAKKwkJbWVtYmVycy5lYWNoIGRvIHxtZW1iZXJ8CisJCQlpZihwcm90ZWN0aW9uICE9IEBwcm90ZWN0aW9uc1ttZW1iZXJdKQorCQkJCXN0YXRlLmluZGVudCAtPSAxCisJCQkJc3RhdGUubmVlZHNfc2VtaSA9IGZhbHNlCisJCQkJc3RhdGUudl9wYWQoMikgaWYocHJvdGVjdGlvbikKKwkJCQlwcm90ZWN0aW9uID0gQHByb3RlY3Rpb25zW21lbWJlcl0KKwkJCQlzdGF0ZS5wcmludCgiI3twcm90ZWN0aW9ufTpcbiIpCisJCQkJc3RhdGUuaW5kZW50ICs9IDEKKwkJCQlzdGF0ZS5lbmRsaW5lKCkKKwkJCWVuZAorCQkJc3RhdGUuZW5kbGluZSgpCisJCQlzdGF0ZS5uZWVkc19zZW1pID0gdHJ1ZQorCQkJaWYobWVtYmVyLnJlc3BvbmRfdG8/KDpwcF9oZWFkZXJfZmlsZSkpCisJCQkJbWVtYmVyLnBwX2hlYWRlcl9maWxlKHN0YXRlKQorCQkJZWxzZQorCQkJCXN0YXRlLnBwKG1lbWJlcikKKwkJCWVuZAorCQkJc3RhdGUuZW5kbGluZSgpCisJCWVuZCAKKwkJc3RhdGUuaW5kZW50IC09IDIKKwkJc3RhdGUubmVlZHNfc2VtaSA9IHRydWUKKwkJaWYoQGRlYykKKwkJc3RhdGUucHJpbnQoIlxufSAje0BkZWN9IikKKwkJZWxzZQorCQlzdGF0ZS5wcmludCgiXG59IikKKwkJZW5kCisJCXN0YXRlLnZfcGFkKDIpCisJZW5kCisJZGVmIHBwX2hlYWRlcl9maWxlKHN0YXRlKQorCQlwcChzdGF0ZSkKKwllbmQKKwlkZWYgcHBfY2NfZmlsZShzdGF0ZSkKKwkJQG1lbWJlcnMuZWFjaCBkbyB8bWVtYmVyfAorCQkJc3RhdGUubmVlZHNfc2VtaSA9IHRydWUKKwkJCW1lbWJlci5wcF9jY19maWxlKHN0YXRlKSBpZihtZW1iZXIucmVzcG9uZF90bz8oOnBwX2NjX2ZpbGUpKQorCQkJc3RhdGUuZW5kbGluZSgpCisJCWVuZAorCWVuZAorCWRlZiBkZWZfZnVuYygqYXJncykKKwkJZnVuYyA9IENQUDo6TWVtYmVyRnVuYy5uZXcoc2VsZiwqYXJncykKKwkJQHByb3RlY3Rpb25zW2Z1bmNdID0gQHByb3RlY3Rpb24KKwkJQG1lbWJlcnMgPDwgZnVuYworCQlyZXR1cm4gZnVuYworCWVuZAorZW5kCitjbGFzcyBDUFA6OkNDTWVtYmVyV3JhcHBlcgorCWRlZiBpbml0aWFsaXplKG1lbWJlcikKKwkJQG1lbWJlciA9IG1lbWJlcgorCWVuZAorCWRlZiBwcF9oZWFkZXJfZmlsZShzdGF0ZSkgOyBlbmQKKwlkZWYgcHBfY2NfZmlsZShzdGF0ZSkKKwkJc3RhdGUucHAoQG1lbWJlcikKKwllbmQKK2VuZAorY2xhc3MgQ1BQOjpDbGFzc1BhaXIgPCBDUFA6OlR5cGVQYWlyCisJYXR0cl9hY2Nlc3NvciA6bmFtZQorCWRlZiBpbml0aWFsaXplKG5hbWVzcGFjZSxuYW1lKQorCQlzdXBlcihuYW1lc3BhY2UsbmFtZSkKKwkJQHByb3RlY3Rpb24gPSA6cHVibGljICNkZWZhdWx0IHRvIHB1YmxpYworCWVuZAorCWRlZiBhZGRfbWVtYmVyKHByb3RlY3Rpb24sbWVtYmVyKQorCQlAcHJvdGVjdGlvbiA9IHByb3RlY3Rpb24KKwkJQG1lbWJlcnMgPDwgbWVtYmVyCisJCUBwcm90ZWN0aW9uc1ttZW1iZXJdID0gcHJvdGVjdGlvbgorCQlyZXR1cm4gbWVtYmVyCisJZW5kCisJZGVmIHB1YmxpYygpIDsgQHByb3RlY3Rpb24gPSA6cHVibGljIDsgZW5kCisJZGVmIHByb3RlY3RlZCgpIDsgQHByb3RlY3Rpb24gPSA6cHJvdGVjdGVkIDsgZW5kCisJZGVmIHByaXZhdGUoKSA7IEBwcm90ZWN0aW9uID0gOnByaXZhdGUgOyBlbmQKKwlkZWYgc2VsZi50eXBlX25hbWUoKSA7ICJjbGFzcyIgOyBlbmQKK2VuZAorY2xhc3MgQ1BQOjpTdHJ1Y3RQYWlyIDwgQ1BQOjpUeXBlUGFpcgorCWRlZiBzZWxmLnR5cGVfbmFtZSgpIDsgInN0cnVjdCIgOyBlbmQKKwlkZWYgYWRkX21lbWJlcihtZW1iZXIpCisJCUBtZW1iZXJzIDw8IG1lbWJlcgorCQlyZXR1cm4gbWVtYmVyCisJZW5kCitlbmQKK0NQUDo6VHlwZVBhaXI6OlR5cGVUYWJsZSA9IHsgQ1BQOjpTdHJ1Y3RQYWlyID0+IDAsIENQUDo6Q2xhc3NQYWlyID0+IDEsQ1BQOjpDb25zdHJ1Y3RvciA9PiAyIH0KK0NQUDo6VHlwZVBhaXI6OlR5cGVUYWJsZS5kZWZhdWx0ID0gMworY2xhc3MgQ1BQOjpUZW1wbGF0ZUNsYXNzIDwgQ1BQOjpDbGFzc1BhaXIKKwlkZWYgaW5pdGlhbGl6ZShuYW1lc3BhY2UsbmFtZSkKKwkJc3VwZXIobmFtZXNwYWNlLG5hbWUpCisJCUB0X2FyZ3MgPSBDUFA6OkFyZ3MubmV3KCkKKwllbmQKKwlkZWYgc3BlY19hcmdzKCkKKwkJcmV0dXJuIEBzcGVjX2FyZ3MgfHw9IENQUDo6QXJncy5uZXcoKQorCWVuZAorCWRlZiBwcChzdGF0ZSkKKwkJQHN0YWJsZSA9IHt9CisJCUBtZW1iZXJzLmVhY2hfd2l0aF9pbmRleCB7IHxtZW0saXwgQHN0YWJsZVttZW1dID0gaSB9CisJCW1lbWJlcnMgPSBAbWVtYmVycy5zb3J0IHsgfG0xLG0yfCBjb21wKG0xLG0yKSB9CisJCXN0YXRlLm5lZWRzX3NlbWkgPSBmYWxzZQorCQlzdGF0ZS52X3BhZCgyKQorCQlpZihAdF9hcmdzLmxlbmd0aCA+IDApCisJCQlzdGF0ZS5wcCgidGVtcGxhdGUgPCAiKQorCQkJc3RhdGUucHAoQHRfYXJncykKKwkJZWxzZQorCQkJc3RhdGUucHAoInRlbXBsYXRlIDwgIikKKwkJZW5kCisJCXN0YXRlLnBwKCI+XG4iKQorCQlzdGF0ZS5wcCgiY2xhc3MgI0BuYW1lIikKKwkJaWYoQHNwZWNfYXJncykKKwkJCXN0YXRlLnBwKCI8ICIpCisJCQlzdGF0ZS5wcChAc3BlY19hcmdzKQorCQkJc3RhdGUucHAoIj4geyIpCisJCWVsc2UKKwkJCXN0YXRlLnBwKCIgeyIpCisJCWVuZAorCQlzdGF0ZS5lbmRsaW5lKCkKKwkJc3RhdGUuaW5kZW50ICs9IDIKKwkJcHJvdGVjdGlvbiA9IG5pbCAKKwkJbWVtYmVycy5lYWNoIGRvIHxtZW1iZXJ8CisJCQlpZihwcm90ZWN0aW9uICE9IEBwcm90ZWN0aW9uc1ttZW1iZXJdKQorCQkJCXN0YXRlLmluZGVudCAtPSAxCisJCQkJc3RhdGUubmVlZHNfc2VtaSA9IGZhbHNlCisJCQkJc3RhdGUudl9wYWQoMikgaWYocHJvdGVjdGlvbikKKwkJCQlwcm90ZWN0aW9uID0gQHByb3RlY3Rpb25zW21lbWJlcl0KKwkJCQlzdGF0ZS5wcmludCgiI3twcm90ZWN0aW9ufTpcbiIpCisJCQkJc3RhdGUuaW5kZW50ICs9IDEKKwkJCQlzdGF0ZS5lbmRsaW5lKCkKKwkJCWVuZAorCQkJc3RhdGUuZW5kbGluZSgpCisJCQlzdGF0ZS5uZWVkc19zZW1pID0gdHJ1ZQorCQkJaWYobWVtYmVyLnJlc3BvbmRfdG8/KDpwcF9pbmxpbmUpKQorCQkJCW1lbWJlci5wcF9pbmxpbmUoc3RhdGUpCisJCQllbHNlCisJCQkJc3RhdGUucHAobWVtYmVyKQorCQkJZW5kCisJCQlzdGF0ZS5lbmRsaW5lKCkKKwkJZW5kIAorCQlzdGF0ZS5pbmRlbnQgLT0gMgorCQlzdGF0ZS5uZWVkc19zZW1pID0gdHJ1ZQorCQlpZihAZGVjKQorCQkJc3RhdGUucHJpbnQoIlxufSAje0BkZWN9IikKKwkJZWxzZQorCQkJc3RhdGUucHJpbnQoIlxufSIpCisJCWVuZAorCQlzdGF0ZS52X3BhZCgyKQorCWVuZAorCWRlZiBwcF9jY19maWxlKHN0YXRlKTsgZW5kCitlbmQKKwpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9jcHBfcHJldHR5X3ByaW50L3N0YW5kYXJkX3R5cGVzLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9jcHBfcHJldHR5X3ByaW50L3N0YW5kYXJkX3R5cGVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmY1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL2NwcF9wcmV0dHlfcHJpbnQvc3RhbmRhcmRfdHlwZXMucmIKQEAgLTAsMCArMSwzNjMgQEAKK21vZHVsZSBDUFAKKwljbGFzcyBDbGFzcworCisJZW5kCisJY2xhc3MgRnVuY3QKKwkJYXR0cl9hY2Nlc3NvciA6cmV0dmFsLDpuYW1lLDphcmdzLDpzdWl0ZQorCQlkZWYgaW5pdGlhbGl6ZShyZXR2YWwgPSBuaWwsbmFtZSA9IG5pbCxhcmdzID0gQXJncy5uZXcoKSxzdWl0ZSA9IFN1aXRlLm5ldygpKQorCQkJQHJldHZhbCxAbmFtZSxAYXJncyxAc3VpdGUgPSByZXR2YWwsbmFtZSxhcmdzLHN1aXRlCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcChAcmV0dmFsKQorCQkJc3RhdGUucHJpbnQoIiAiKQorCQkJc3RhdGUucHAoQG5hbWUpCisJCQlzdGF0ZS5wcmludCgiKCIpCisJCQlzdGF0ZS5wcChAYXJncykKKwkJCXN0YXRlLnByaW50KCIpIikKKwkJCXN0YXRlLnBwKEBzdWl0ZSkKKwkJZW5kCisJZW5kCisJY2xhc3MgSWYKKwkJYXR0cl9hY2Nlc3NvciA6Y29uZCw6c3VpdGUsOmVsc2Vfc3VpdGUKKwkJZGVmIGluaXRpYWxpemUoY29uZCA9IG5pbCxzdWl0ZSA9IFN1aXRlLm5ldygpLGVsc2Vfc3VpdGUgPSBuaWwpCisJCQlAY29uZCxAc3VpdGUsQGVsc2Vfc3VpdGUgPSBjb25kLHN1aXRlLGVsc2Vfc3VpdGUKKwkJZW5kCisJCWRlZiBwcChzdGF0ZSkKKwkJCXN0YXRlLnByaW50KCJpZiAoIikKKwkJCXN0YXRlLnBwKEBjb25kKQorCQkJc3RhdGUucHJpbnQoIikgIikKKwkJCXN0YXRlLm5lZWRzX3NlbWkgPSBmYWxzZQorCQkJc3RhdGUucHAoQHN1aXRlKQorCQkJaWYoQGVsc2Vfc3VpdGUpCisJCQkJc3RhdGUucHJpbnQoIiBlbHNlICIpCisJCQkJc3RhdGUucHAoQGVsc2Vfc3VpdGUpCisJCQllbmQKKwkJZW5kCisJCWRlZiBlbHNlX3N1aXRlKCkKKwkJCXJldHVybihAZWxzZV9zdWl0ZSB8fD0gU3VpdGUubmV3KCkpCisJCWVuZAorCWVuZAorCWNsYXNzIEZvcgorCQlhdHRyX2FjY2Vzc29yIDppbml0LDpjb25kLDp1cGRhdGUsOnN1aXRlCisJCWRlZiBpbml0aWFsaXplKGluaXQgPSBuaWwsY29uZCA9IG5pbCx1cGRhdGUgPSBuaWwsc3VpdGUgPSBTdWl0ZS5uZXcoKSkKKwkJCUBpbml0LEBjb25kLEB1cGRhdGUsQHN1aXRlID0gaW5pdCxjb25kLHVwZGF0ZSxzdWl0ZQorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHJpbnQoImZvciAoIikKKwkJCUFyZ3MubmV3KFtAaW5pdCxAY29uZCxAdXBkYXRlXSkucHAoc3RhdGUsIjsiKQorCQkJc3RhdGUucHJpbnQoIikgIikKKwkJCXN0YXRlLm5lZWRzX3NlbWkgPSBmYWxzZQorCQkJc3RhdGUucHAoQHN1aXRlKQorCQllbmQKKwllbmQKKwljbGFzcyBBcmdzIDwgQXJyYXkKKwkJYXR0cl9hY2Nlc3NvciA6ZG9udF93cmFwCisJCWRlZiBwcChzdGF0ZSxzZXAgPSAiLCIpCisJCQlwb3MgPSBzdGFydCA9IHN0YXRlLmNvbAorCQkJc2VsZi5lYWNoX3dpdGhfaW5kZXggZG8gfGFyZyxpfAorCQkJCSNwdXRzICIje3N0YXRlLmNvbCAtIHN0YXJ0fSAsICN7c3RhcnR9IgorCQkJCXN0YXRlLnByaW50KHNlcCkgaWYoaSAhPSAwKQorCQkJCWlmKHBvcyA+IDgwKQorCQkJCQlzdGF0ZS53cmFwKHN0YXRlLmluZGVudCArIDQpCisJCQkJCXBvcyA9IHN0YXJ0ID0gc3RhdGUuY29sCisJCQkJZWxzaWYoc3RhdGUuY29sICogMiAtIHBvcyA+IDgwICYmICFAZG9udF93cmFwKQorCQkJCQlzdGF0ZS53cmFwKHN0YXJ0KQorCQkJCQlzdGFydCA9IHBvcworCQkJCWVsc2UKKwkJCQkJc3RhdGUucHJpbnQoIiAiKSBpZihpICE9IDApCisJCQkJCXBvcyA9IHN0YXRlLmNvbAorCQkJCWVuZAorCQkJCXN0YXRlLnBwKGFyZykKKwkJCWVuZAorCQllbmQKKwllbmQKKwljbGFzcyBTdWl0ZSA8IEFycmF5CisJCWRlZiBwcChzdGF0ZSkKKwkJCXN0YXRlLnByaW50KCJ7IikKKwkJCXN0YXRlLj4+CisJCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJCXNlbGYucHBfbm9fYnJhY2VzKHN0YXRlKQorCQkJc3RhdGUuPDwKKwkJCXN0YXRlLnByaW50KCJ9IikKKwkJZW5kCisJCWRlZiBwcF9ub19icmFjZXMoc3RhdGUpCisJCQlzZWxmLmVhY2ggZG8gfGFyZyxpfAorCQkJCXN0YXRlLmVuZGxpbmUoKQorCQkJCXN0YXRlLm5lZWRzX3NlbWkgPSB0cnVlCisJCQkJc3RhdGUucHAoYXJnKQorCQkJCXN0YXRlLmVuZGxpbmUoKQorCQkJZW5kCisJCWVuZAorCQlkZWYgcHBfb25lX2xpbmUoc3RhdGUpCisJCQlpZihzZWxmLmxlbmd0aCA9PSAxKQorCQkJCXN0YXRlLm5lZWRzX3NlbWkgPSB0cnVlCisJCQkJc3RhdGUucHJpbnQoInsgIikKKwkJCQlzdGF0ZS5wcChzZWxmWzBdKQorCQkJCXN0YXRlLnByaW50KCI7IikgaWYoc3RhdGUubmVlZHNfc2VtaSkKKwkJCQlzdGF0ZS5uZWVkc19zZW1pID0gZmFsc2UKKwkJCQlzdGF0ZS5wcmludCgiIH0iKQorCQkJZWxzZQorCQkJCXNlbGYucHAoc3RhdGUpCisJCQllbmQKKwkJZW5kCisJZW5kCisJY2xhc3MgRnVuY0NhbGwKKwkJYXR0cl9hY2Nlc3NvciA6bmFtZSw6YXJncworCQlkZWYgaW5pdGlhbGl6ZShuYW1lID0gbmlsLGFyZ3MgPSBBcmdzLm5ldygpKQorCQkJQG5hbWUsQGFyZ3MgPSBuYW1lLGFyZ3MKKwkJZW5kCisJCWRlZiBzZWxmLmJ1aWxkKG5hbWUsKmFyZ3MpCisJCQlzZWxmLm5ldyhuYW1lLEFyZ3MubmV3KGFyZ3MpKQorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHAoQG5hbWUpCisJCQlzdGF0ZS5wcmludCgiKCIpCisJCQlzdGF0ZS5wcChAYXJncykKKwkJCXN0YXRlLnByaW50KCIpIikKKwkJZW5kCisJZW5kCisJY2xhc3MgQklUX09SCisJCWF0dHJfYWNjZXNzb3IgOnZhbDEsOnZhbDIKKwkJZGVmIGluaXRpYWxpemUodmFsMSx2YWwyKQorCQkJQHZhbDEsQHZhbDIgPSB2YWwxLHZhbDIKKwkJZW5kCisJCWRlZiBwcChzdGF0ZSkKKwkJCXN0YXRlLnBwKEB2YWwxKQorCQkJc3RhdGUucHJpbnQoIiB8ICIpCisJCQlzdGF0ZS5wcChAdmFsMikKKwkJZW5kCisJZW5kCisJY2xhc3MgTFQKKwkJYXR0cl9hY2Nlc3NvciA6dmFsMSw6dmFsMgorCQlkZWYgaW5pdGlhbGl6ZSh2YWwxLHZhbDIpCisJCQlAdmFsMSxAdmFsMiA9IHZhbDEsdmFsMgorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHAoQHZhbDEpCisJCQlzdGF0ZS5wcmludCgiIDwgIikKKwkJCXN0YXRlLnBwKEB2YWwyKQorCQllbmQKKwllbmQKKwljbGFzcyBEaXYKKwkJYXR0cl9hY2Nlc3NvciA6dmFsMSw6dmFsMgorCQlkZWYgaW5pdGlhbGl6ZSh2YWwxLHZhbDIpCisJCQlAdmFsMSxAdmFsMiA9IHZhbDEsdmFsMgorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHAoQHZhbDEpCisJCQlzdGF0ZS5wcmludCgiIC8gIikKKwkJCXN0YXRlLnBwKEB2YWwyKQorCQllbmQKKwllbmQKKwljbGFzcyBBZGQKKwkJYXR0cl9hY2Nlc3NvciA6dmFsMSw6dmFsMgorCQlkZWYgaW5pdGlhbGl6ZSh2YWwxLHZhbDIpCisJCQlAdmFsMSxAdmFsMiA9IHZhbDEsdmFsMgorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHAoQHZhbDEpCisJCQlzdGF0ZS5wcmludCgiICsgIikKKwkJCXN0YXRlLnBwKEB2YWwyKQorCQllbmQKKwllbmQKKwljbGFzcyBNZW1iZXIKKwkJYXR0cl9hY2Nlc3NvciA6b2JqLDpuYW1lCisJCWRlZiBpbml0aWFsaXplKG9iaixuYW1lKQorCQkJQG9iaixAbmFtZSA9IG9iaixuYW1lCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcChAb2JqKQorCQkJc3RhdGUucHJpbnQoIi4iKQorCQkJc3RhdGUucHAoQG5hbWUpCisJCWVuZAorCWVuZAorCWNsYXNzIFBvaW50ZXJNZW1iZXIKKwkJYXR0cl9hY2Nlc3NvciA6b2JqLDpuYW1lCisJCWRlZiBpbml0aWFsaXplKG9iaixuYW1lKQorCQkJQG9iaixAbmFtZSA9IG9iaixuYW1lCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcChAb2JqKQorCQkJc3RhdGUucHJpbnQoIi0+IikKKwkJCXN0YXRlLnBwKEBuYW1lKQorCQllbmQKKwllbmQKKwljbGFzcyBNaW51cworCQlhdHRyX2FjY2Vzc29yIDp2YWwKKwkJZGVmIGluaXRpYWxpemUodmFsKQorCQkJQHZhbCA9IHZhbAorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHJpbnQoIi0iKQorCQkJc3RhdGUucHAoQHZhbCkKKwkJZW5kCisJZW5kCisJY2xhc3MgTm90CisJCWF0dHJfYWNjZXNzb3IgOnZhbAorCQlkZWYgaW5pdGlhbGl6ZSh2YWwpCisJCQlAdmFsID0gdmFsCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcmludCgiISIpCisJCQlzdGF0ZS5wcChAdmFsKQorCQllbmQKKwllbmQKKwljbGFzcyBBZGRyZXNzCisJCWF0dHJfYWNjZXNzb3IgOnZhbAorCQlkZWYgaW5pdGlhbGl6ZSh2YWwpCisJCQlAdmFsID0gdmFsCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcmludCgiJiIpCisJCQlzdGF0ZS5wcChAdmFsKQorCQllbmQKKwllbmQKKwljbGFzcyBQYXJhbgorCQlhdHRyX2FjY2Vzc29yIDp2YWwKKwkJZGVmIGluaXRpYWxpemUodmFsKQorCQkJQHZhbCA9IHZhbAorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHJpbnQoIigiKQorCQkJc3RhdGUucHAoQHZhbCkKKwkJCXN0YXRlLnByaW50KCIpIikKKwkJZW5kCisJZW5kCisJY2xhc3MgQXNzaWduCisJCWF0dHJfYWNjZXNzb3IgOmx2YWwsOnJ2YWwKKwkJZGVmIGluaXRpYWxpemUobHZhbCA9IG5pbCxydmFsID0gQXJncy5uZXcoKSkKKwkJCUBsdmFsLEBydmFsID0gbHZhbCxydmFsCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcChAbHZhbCkKKwkJCXN0YXRlLnByaW50KCIgPSAiKQorCQkJc3RhdGUucHAoQHJ2YWwpCisJCWVuZAorCWVuZAorCWNsYXNzIFBvaW50ZXJEZXJlZgorCQlhdHRyX2FjY2Vzc29yIDp2YWwKKwkJZGVmIGluaXRpYWxpemUodmFsKQorCQkJQHZhbCA9IHZhbAorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHJpbnQoIioiKQorCQkJc3RhdGUucHAoQHZhbCkKKwkJZW5kCisJZW5kCisJY2xhc3MgQ2FzdAorCQlhdHRyX2FjY2Vzc29yIDp0byw6dmFsCisJCWRlZiBpbml0aWFsaXplKHRvLHZhbCkKKwkJCUB0byxAdmFsID0gdG8sdmFsCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcmludCgiKCIpCisJCQlzdGF0ZS5wcChAdG8pCisJCQlzdGF0ZS5wcmludCgiKSIpCisJCQlzdGF0ZS5wcChAdmFsKQorCQllbmQKKwllbmQKKwljbGFzcyBWYXJEZWMKKwkJYXR0cl9hY2Nlc3NvciA6dHlwZSw6bmFtZQorCQlkZWYgaW5pdGlhbGl6ZSh0eXBlID0gbmlsLG5hbWUgPSBuaWwpCisJCQlAdHlwZSxAbmFtZSA9IHR5cGUsbmFtZQorCQllbmQKKwkJZGVmIHBwKHN0YXRlKQorCQkJc3RhdGUucHAoQHR5cGUpCisJCQlzdGF0ZS5wcmludCgiICIpCisJCQlzdGF0ZS5wcChAbmFtZSkKKwkJZW5kCisJZW5kCisJY2xhc3MgUmV0dXJuCisJCWF0dHJfYWNjZXNzb3IgOnZhbAorCQlkZWYgaW5pdGlhbGl6ZSh2YWwgPSBuaWwpCisJCQlAdmFsID0gdmFsCisJCWVuZAorCQlkZWYgcHAoc3RhdGUpCisJCQlzdGF0ZS5wcmludCgicmV0dXJuICIpCisJCQlzdGF0ZS5wcChAdmFsKQorCQllbmQKKwllbmQKKwljbGFzcyBUcmF2ZXJzYWxTdGF0ZQorCQlhdHRyX2FjY2Vzc29yIDpuZWVkc19zZW1pLDppbmRlbnQsOmNvbAorCQlkZWYgaW5pdGlhbGl6ZShmaWxlKQorCQkJQGZpbGUgPSBmaWxlCisJCQlAaW5kZW50ID0gMAorCQkJQG5vdF9pbmRlbnRlZCA9IHRydWUKKwkJCUBqdXN0X2VuZGxpbmVkID0gdHJ1ZQorCQkJQGhvbGRfcG9pbnRzID0gW10KKwkJCUBjb2wgPSAwCisJCWVuZAorCQlkZWYgc2V0X2hvbGRfcG9pbnQoKQorCQkJQGhvbGRfcG9pbnRzLnB1c2goQGNvbCkKKwkJZW5kCisJCWRlZiB3cmFwKGNvbCkKKwkJCUBmaWxlLnByaW50KCJcbiIpCisJCQlAZmlsZS5wcmludCgiICIgKiBjb2wpCisJCQlAY29sID0gY29sCisJCWVuZAorCQlkZWYgc3VwcHJlc3NfaW5kZW50KCkKKwkJCUBub3RfaW5kZW50ZWQgPSBmYWxzZQorCQllbmQKKwkJZGVmIDw8KCkKKwkJCUBpbmRlbnQgLT0gMgorCQllbmQKKwkJZGVmID4+KCkKKwkJCUBpbmRlbnQgKz0gMgorCQllbmQKKwkJZGVmIHBwKGFzdCkKKwkJCXJldHVybiBhc3QucHAoc2VsZikgaWYoYXN0LnJlc3BvbmRfdG8/KDpwcCkpCisJCQlzZWxmLnByaW50KGFzdCkKKwkJZW5kCisJCWRlZiBwcmludChjaGFycykKKwkJCXJldHVybiBwcmludF9ub19zcGxpdChjaGFycykgaWYoIWNoYXJzLnJlc3BvbmRfdG8/KDpzcGxpdCkpCisJCQljaGFycy5zcGxpdCgvXG4vLC0xKS5lYWNoX3dpdGhfaW5kZXggZG8gfGxpbmUsaXwKKwkJCQllbmRsaW5lKCkgaWYoaSAhPSAwKQorCQkJCXByaW50X25vX3NwbGl0KGxpbmUpIGlmKGxpbmUgJiYgbGluZS5sZW5ndGggPiAwKQorCQkJZW5kCisJCWVuZAorCQlkZWYgcHJpbnRfbm9fc3BsaXQoY2hhcnMpCisJCQlpZihAbm90X2luZGVudGVkKQorCQkJCUBmaWxlLnByaW50KCIgIipAaW5kZW50KQorCQkJCUBjb2wgKz0gQGluZGVudAorCQkJCUBub3RfaW5kZW50ZWQgPSBmYWxzZQorCQkJZW5kCisJCQlpZihjaGFycykKKwkJCQljaGFycyA9IGNoYXJzLnRvX3MKKwkJCQlpZihjaGFycy5sZW5ndGggPiAwKQorCQkJCQlAY29sICs9IGNoYXJzLmxlbmd0aAorCQkJCQlAZmlsZS5wcmludChjaGFycykKKwkJCQkJQGp1c3RfZW5kbGluZWQgPSBmYWxzZQorCQkJCQlAdl9wYWQgPSAwCisJCQkJZW5kCisJCQllbmQKKwkJZW5kCisJCWRlZiBlbmRsaW5lKCkKKwkJCXJldHVybiBpZihAanVzdF9lbmRsaW5lZCkKKwkJCUBmaWxlLnByaW50KCI7IikgaWYoQG5lZWRzX3NlbWkpCisJCQlAbmVlZHNfc2VtaSA9IGZhbHNlCisJCQlAZmlsZS5wcmludCgiXG4iKQorCQkJQG5vdF9pbmRlbnRlZCA9IHRydWUKKwkJCUBqdXN0X2VuZGxpbmVkID0gdHJ1ZQorCQkJQGhvbGRfcG9pbnRzLmNsZWFyKCkKKwkJCUB2X3BhZCArPSAxCisJCQlAY29sID0gMAorCQllbmQKKwkJZGVmIHZfcGFkKG4pCisJCQl3aGlsZShAdl9wYWQgPCBuKQorCQkJCWZvcmNlX2VuZGxpbmUoKQorCQkJZW5kCisJCWVuZAorCQlkZWYgZm9yY2VfZW5kbGluZSgpCisJCQlAanVzdF9lbmRsaW5lZCA9IGZhbHNlCisJCQllbmRsaW5lKCkKKwkJZW5kCisJZW5kCisJZGVmIHNlbGYucHJldHR5X3ByaW50KGFzdCxmaWxlKQorCQlzdGF0ZSA9IFRyYXZlcnNhbFN0YXRlLm5ldyhmaWxlKQorCQlpZihhc3QucmVzcG9uZF90bz8oOnBwX25vX2JyYWNlcykpCisJCQlhc3QucHBfbm9fYnJhY2VzKHN0YXRlKSAKKwkJZWxzZQorCQkJc3RhdGUucHAoYXN0KQorCQllbmQKKwllbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9sb2FkLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9sb2FkLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTQ1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL2xvYWQucmIKQEAgLTAsMCArMSwxNSBAQAorJExPQURfUEFUSC51bnNoaWZ0KCIuIikKK1sidG9rZW5pemVyLnJiIiwicV9maWxlLnJiIiwicXVldWVfZ3JvdXAucmIiLCJxdWV1ZS5yYiIsIm5hbWVzcGFjZXMucmIiLAorImludGVyZmFjZS5yYiIsImVycm9ycy5yYiIsICJxX3N0cnVjdC5yYiJdLmVhY2ggZG8gfG5hbWV8CisJcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi9vYmplY3RzLyIgKyBuYW1lCitlbmQKK1sic3RhbmRhcmRfdHlwZXMucmIiLCJhdXRvX2dlbi5yYiIsImZpbGVfcGFpcl90eXBlcy5yYiIsCisiZGVwX2ZpbGVfcGFpci5yYiJdLmVhY2ggZG8gfG5hbWV8CisJcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi9jcHBfcHJldHR5X3ByaW50LyIgKyBuYW1lCitlbmQKK1sicV9maWxlLnJiIiwibWVzc2FnZV9kZWMucmIiLCJxdWV1ZV9kZWMucmIiLCAicV9zdHJ1Y3QucmIiXS5lYWNoIGRvIHxuYW1lfAorCXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvb3V0cHV0LyIgKyBuYW1lCitlbmQKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvd3JpdGVfaWZmX2NoYW5nZWQucmInCityZXF1aXJlICJmaWxldXRpbHMiCityZXF1aXJlICJwYXRobmFtZSIKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9xdWV1ZXMvb2JqZWN0cy9lcnJvcnMucmIgYi9hb3MvYnVpbGQvcXVldWVzL29iamVjdHMvZXJyb3JzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NzZhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL29iamVjdHMvZXJyb3JzLnJiCkBAIC0wLDAgKzEsNDMgQEAKK2NsYXNzIFFFcnJvciA8IEV4Y2VwdGlvbgorCWRlZiBpbml0aWFsaXplKG1zZykKKwkJc3VwZXIoKQorCQlAbXNnID0gbXNnCisJCUBxc3RhY2t0cmFjZSA9IFtdCisJZW5kCisJZGVmIHNlbGYuc2V0X25hbWUobmFtZSkKKwkJQHByZXR0eV9uYW1lID0gbmFtZQorCWVuZAorCWRlZiBzZWxmLnByZXR0eV9uYW1lKCkKKwkJQHByZXR0eV9uYW1lCisJZW5kCisJZGVmIHRvX3MKKwkJbXNnID0gIkVycm9yOigje3NlbGYuY2xhc3MucHJldHR5X25hbWV9KVxuXHQiCisJCW1zZyArPSBAbXNnCisJCW1zZyArPSAiXG4iIGlmKG1zZ1stMV0gIT0gIlxuIikKKwkJQHFzdGFja3RyYWNlLmVhY2ggZG8gfHBhcnR8CisJCQlwYXJ0ID0gcGFydC5xX3N0YWNrX25hbWUgaWYocGFydC5yZXNwb25kX3RvPyg6cV9zdGFja19uYW1lKSkKKwkJCW1zZyArPSAiXHRmcm9tOiAje3BhcnR9XG4iCisJCWVuZAorCQlyZXR1cm4gbXNnCisJZW5kCisJc2V0X25hbWUoIkJhc2UgTGV2ZWwgRXhjZXB0aW9uLiIpCisJYXR0cl9hY2Nlc3NvciA6cXN0YWNrdHJhY2UKK2VuZAorY2xhc3MgUVN5bnRheEVycm9yIDwgUUVycm9yCisJZGVmIGluaXRpYWxpemUobXNnKQorCQlzdXBlcihtc2cpCisJZW5kCisJc2V0X25hbWUoIlN5bnRheCBFcnJvciIpCitlbmQKK2NsYXNzIFFOYW1lc3BhY2VDb2xsaXNpb24gPCBRRXJyb3IKKwlkZWYgaW5pdGlhbGl6ZShtc2cpCisJCXN1cGVyKG1zZykKKwllbmQKKwlzZXRfbmFtZSgiTmFtZXNwYWNlIENvbGxpc2lvbiIpCitlbmQKK2NsYXNzIFFJbXBvcnROb3RGb3VuZEVycm9yIDwgUUVycm9yCisJZGVmIGluaXRpYWxpemUobXNnKQorCQlzdXBlcihtc2cpCisJZW5kCisJc2V0X25hbWUoIkNvdWxkbid0IEZpbmQgVGFyZ2V0IG9mIEltcG9ydCBTdGF0ZW1lbnQiKQorZW5kCmRpZmYgLS1naXQgYS9hb3MvYnVpbGQvcXVldWVzL29iamVjdHMvaW50ZXJmYWNlLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL2ludGVyZmFjZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjMzMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL2ludGVyZmFjZS5yYgpAQCAtMCwwICsxLDY5IEBACitjbGFzcyBNZXNzYWdlRWxlbWVudFJlcQorCWRlZiBpbml0aWFsaXplKHR5cGUsbmFtZSkKKwkJQHR5cGUgPSB0eXBlCisJCUBuYW1lID0gbmFtZQorCWVuZAorCWRlZiBzZWxmLnBhcnNlKHRva2VucykKKwkJdHlwZSA9IHRva2Vucy5leHBlY3QoOnRXb3JkKS5kYXRhCisJCW5hbWUgPSB0b2tlbnMuZXhwZWN0KDp0V29yZCkuZGF0YQorCQl0b2tlbnMuZXhwZWN0KDp0U2VtaSkKKwkJcmV0dXJuIHNlbGYubmV3KHR5cGUsbmFtZSkKKwllbmQgCitlbmQgCitjbGFzcyBRdWV1ZVJlcQorCWRlZiBpbml0aWFsaXplKG5hbWUsdHlwZSA9IG5pbCkKKwkJQG5hbWUgPSBuYW1lCisJCUB0eXBlID0gdHlwZQorCWVuZAorCWRlZiBzZWxmLnBhcnNlKHRva2VucykKKwkJdHlwZV9vcl9uYW1lID0gdG9rZW5zLmV4cGVjdCg6dFdvcmQpLmRhdGEKKwkJaWYodG9rZW5zLnBlYWsgPT0gOnRTZW1pKQorCQkJdG9rZW5zLmV4cGVjdCg6dFNlbWkpCisJCQlyZXR1cm4gc2VsZi5uZXcodHlwZV9vcl9uYW1lKQorCQllbHNlCisJCQluYW1lID0gdG9rZW5zLmV4cGVjdCg6dFdvcmQpLmRhdGEKKwkJCXRva2Vucy5leHBlY3QoOnRTZW1pKQorCQkJcmV0dXJuIHNlbGYubmV3KG5hbWUsdHlwZV9vcl9uYW1lKQorCQllbmQKKwllbmQKK2VuZAorY2xhc3MgSW50ZXJmYWNlU3RtdCA8IFFTdG10CisJZGVmIGluaXRpYWxpemUobmFtZSxlbGVtZW50cykKKwkJQG5hbWUgPSBuYW1lCisJCUBlbGVtZW50cyA9IGVsZW1lbnRzCisJZW5kCisJZGVmIHFfZXZhbChsb2NhbHMpCisKKwllbmQKKwlkZWYgc2VsZi5jaGVja190eXBlKHRva2VucyxuZXdfdHlwZSxvbGRfdHlwZSkKKwkJcmV0dXJuIG5ld190eXBlIGlmKG9sZF90eXBlID09IG5pbCkKKwkJaWYobmV3X3R5cGUgIT0gb2xkX3R5cGUpCisJCQl0b2tlbnMucUVycm9yKDw8RVJST1JfTVNHKQorZXJyb3I6IGludGVybWl4aW5nIHF1ZXVlIGRlZmluaXRpb25zIChhIHF1ZXVlX2dyb3VwIGZlYXR1cmUpCisJYW5kIHR5cGUgZGVmaW5pdGlvbnMgKGEgbWVzc2FnZV9ncm91cCBmZWF0dXJlKQorCXRoaXMgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgdHlwZSB2YWx1ZS4KKwlXb3QuIFdvdC4KK0VSUk9SX01TRworCQllbmQKKwkJcmV0dXJuIG9sZF90eXBlCisJZW5kCisJZGVmIHNlbGYucGFyc2UodG9rZW5zKQorCQluYW1lID0gdG9rZW5zLmV4cGVjdCg6dFdvcmQpLmRhdGEKKwkJdmFsdWVzID0gW10KKwkJdHlwZSA9IG5pbAorCQl0b2tlbnMuZXhwZWN0KDp0T3BlbkIpCisJCXdoaWxlKHRva2Vucy5wZWFrICE9IDp0Q2xvc2VCKQorCQkJaWYodG9rZW5zLnBlYWsuZGF0YSA9PSAicXVldWUiKQorCQkJCXRva2Vucy5leHBlY3QoOnRXb3JkKQorCQkJCXZhbHVlcyA8PCBRdWV1ZVJlcS5wYXJzZSh0b2tlbnMpCisJCQkJdHlwZSA9IGNoZWNrX3R5cGUodG9rZW5zLDpxdWV1ZV9ncm91cCx0eXBlKQorCQkJZWxzZQorCQkJCXZhbHVlcyA8PCBNZXNzYWdlRWxlbWVudFJlcS5wYXJzZSh0b2tlbnMpCisJCQkJdHlwZSA9IGNoZWNrX3R5cGUodG9rZW5zLDptZXNzYWdlX2dyb3VwLHR5cGUpCisJCQllbmQKKwkJZW5kIAorCQl0b2tlbnMuZXhwZWN0KDp0Q2xvc2VCKQorCQl0b2tlbnMuZXhwZWN0KDp0U2VtaSkKKwkJc2VsZi5uZXcobmFtZSx2YWx1ZXMpCisJZW5kCitlbmQKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9xdWV1ZXMvb2JqZWN0cy9uYW1lc3BhY2VzLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL25hbWVzcGFjZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzYWE4MAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9xdWV1ZXMvb2JqZWN0cy9uYW1lc3BhY2VzLnJiCkBAIC0wLDAgKzEsMjExIEBACitjbGFzcyBMb2NhbFNpdHVhdGlvbgorCWF0dHJfYWNjZXNzb3IgOmdsb2JhbHMsOmxvY2FsCisJZGVmIGluaXRpYWxpemUoZ2xvYmFscykKKwkJQGdsb2JhbHMgPSBnbG9iYWxzCisJCUBsb2NhbCA9IG5pbAorCWVuZAorCWRlZiBwYWNrYWdlPShxdWFsaWZpZWQpCisJCWlmKEBsb2NhbCkKKwkJCXJhaXNlIFFTeW50YXhFcnJvci5uZXcoPDxFUlJPUl9NU0cpCitZb3UgYXJlIHJlZGVmaW5pbmcgdGhlIHBhY2thZ2UgcGF0aC4KKyBTdHVmZiBtaWdodCBicmVhayBpZiB5b3UgZG8gdGhhdC4KKyBPdGhlciBvcHRpb25zIGluY2x1ZGU6IHVzaW5nIGFub3RoZXIgaGVhZGVyIGZpbGUsIGFuZCBqdXN0IHVzaW5nIHRoZSBzYW1lIG5hbWVzcGFjZS4KKyBJZiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdSBuZWVkIHRoaXMgeW91IGNhbiByZW1vdmUgdGhpcyBjaGVjayBhdAorIAkje19fRklMRV9ffToje19fTElORV9ffS4KKyBPciBmaWxlIGEgZmVhdHVyZSByZXF1ZXN0LgorIEJ1dCB0aGF0IHdvdWxkIGJlIHdlaXJkLi4uCisgV290LiBXb3QuCitFUlJPUl9NU0cKKwkJZW5kCisJCUBsb2NhbCA9IEBnbG9iYWxzLnNwYWNlCisJCXF1YWxpZmllZC5uYW1lcy5lYWNoIGRvIHxuYW1lfAorCQkJQGxvY2FsID0gQGxvY2FsLmdldF9tYWtlKG5hbWUpCisJCWVuZAorCWVuZAorCWRlZiByZWdpc3Rlcih2YWx1ZSkKKwkJaWYoIUBsb2NhbCkKKwkJCXJhaXNlIFFFcnJvci5uZXcoPDxFUlJPUl9NU0cpCitUaGVyZSBpcyBubyBwYWNrYWdlIHBhdGggZGVmaW5lZCwgVGhpcyBpcyBhIGJpZyBwcm9ibGVtIGJlY2F1c2UKKyB3ZSBhcmUga2luZG9mIGV4cGVjdGluZyB5b3UgdG8gaGF2ZSBhIHBhY2thZ2UgcGF0aC4uLgorIHVzZSBhIDoKKyAgICBwYWNrYWdlIG15X3N1cGVyLmNvb2wucHJvamVjdDsKKyBzdGF0ZW1lbnQgdG8gcmVtZWR5IHRoaXMgc2l0dWF0aW9uLiAob3IgZmlsZSBhIGZlYXR1cmUgcmVxdWVzdCkKKyBXb3QuIFdvdC4KK0VSUk9SX01TRworCQllbmQKKwkJQGxvY2FsW3ZhbHVlLm5hbWVdID0gdmFsdWUKKwkJdmFsdWUucGFyZW50ID0gQGxvY2FsIGlmKHZhbHVlLnJlc3BvbmRfdG8/KDpwYXJlbnQ9KSkKKwkJdmFsdWUubG9jID0gQGxvY2FsCisJZW5kCisJZGVmIGJpbmQoYmluZF90bykKKwkJcmV0dXJuIEJvdW5kU2l0dWF0aW9uLm5ldyhzZWxmLGJpbmRfdG8pCisJZW5kCitlbmQKK2NsYXNzIEJvdW5kU2l0dWF0aW9uIDwgTG9jYWxTaXR1YXRpb24KKwlkZWYgaW5pdGlhbGl6ZShsb2NhbHMsYmluZF90bykKKwkJQGdsb2JhbHMgPSBsb2NhbHMuZ2xvYmFscworCQlAbG9jYWwgPSBiaW5kX3RvCisJZW5kCitlbmQKK2NsYXNzIE5hbWVTcGFjZQorCWF0dHJfYWNjZXNzb3IgOnBhcmVudCw6bmFtZQorCWRlZiBpbml0aWFsaXplKG5hbWUgPSBuaWwscGFyZW50ID0gbmlsKQorCQlAbmFtZSA9IG5hbWUKKwkJQHBhcmVudCA9IHBhcmVudAorCQlAc3BhY2VzID0ge30KKwllbmQKKwlkZWYgW109KGtleSx2YWwpCisJCWlmKG9sZF92YWwgPSBAc3BhY2VzW2tleV0pCisJCQlvbGRfdmFsID0gb2xkX3ZhbC5jcmVhdGVkX2J5IGlmKG9sZF92YWwucmVzcG9uZF90bz8oOmNyZWF0ZWRfYnkpICYmIG9sZF92YWwuY3JlYXRlZF9ieSkKKwkJCWlmKG9sZF92YWwucmVzcG9uZF90bz8oOnFfc3RhY2tfbmFtZSkpCisJCQkJb2xkX3ZhbCA9IG9sZF92YWwucV9zdGFja19uYW1lCisJCQllbHNlCisJCQkJb2xkX3ZhbCA9ICJlaCwgaXQgaXMgYSAje29sZF92YWwuY2xhc3N9IHRoYXRzIGFsbCBJIGtub3cuLi4iCisJCQllbmQKKwkJCXJhaXNlIFFOYW1lc3BhY2VDb2xsaXNpb24ubmV3KDw8RVJST1JfTVNHKQorV29haCEgVGhlIG5hbWUgI3txdWV1ZV9uYW1lKGtleSkuaW5zcGVjdH0gaXMgYWxyZWFkeSB0YWtlbiBieSBzb21lIGNoYXAgYXQgI3tvbGRfdmFsfS4KK1x0RmluZCBzb21ld2hlcmUgZWxzZSB0byBwZWRkbGUgeW91ciB3YXJlcy4KK1x0V290LiBXb3QuCitFUlJPUl9NU0cKKwkJZW5kCisJCUBzcGFjZXNba2V5XSA9IHZhbAorCWVuZAorCWRlZiB0b19jcHBfaWQobmFtZSkKKwkJdHh0ID0gQG5hbWUgKyAiOjoiICsgbmFtZQorCQlyZXR1cm4gQHBhcmVudC50b19jcHBfaWQodHh0KSBpZihAcGFyZW50ICYmIHBhcmVudC5uYW1lKQorCQlyZXR1cm4gIjo6IiArIHR4dAorCWVuZAorCWRlZiBxdWV1ZV9uYW1lKHF1ZXVlKQorCQlnZXRfbmFtZSgpICsgIi4iICsgcXVldWUKKwllbmQKKwlkZWYgW10oa2V5KQorCQkjcHV0cyAiZ2V0dGluZyAje2dldF9uYW1lfS4je2tleX0iCisJCUBzcGFjZXNba2V5XQorCWVuZAorCWRlZiBnZXRfbWFrZShuYW1lKQorCQlAc3BhY2VzW25hbWVdIHx8PSBzZWxmLmNsYXNzLm5ldyhuYW1lLHNlbGYpCisJZW5kCisJZGVmIGdldF9uYW1lKCkKKwkJaWYoQHBhcmVudCkKKwkJCXJldHVybiAiI3tAcGFyZW50LmdldF9uYW1lfS4je0BuYW1lfSIKKwkJZWxzZQorCQkJcmV0dXJuICIje0BuYW1lfSIKKwkJZW5kCisJZW5kCisJZGVmIGNyZWF0ZShjcHBfdHJlZSkKKwkJaWYoQHBhcmVudCAmJiBAcGFyZW50Lm5hbWUpCisJCQlwYXJlbnQgPSBjcHBfdHJlZS5nZXQoQHBhcmVudCkKKwkJZWxzZQorCQkJcGFyZW50ID0gY3BwX3RyZWUKKwkJZW5kCisJCXJldHVybiBjcHBfdHJlZS5hZGRfbmFtZXNwYWNlKEBuYW1lLHBhcmVudCkKKwllbmQKKwlkZWYgdG9fcygpCisJCSI8TmFtZVNwYWNlOiAje2dldF9uYW1lKCl9PiIKKwllbmQKKwlkZWYgaW5zcGVjdCgpCisJCSI8TmFtZVNwYWNlOiAje2dldF9uYW1lKCl9PiIKKwllbmQKKwlkZWYgcm9vdCgpCisJCXJldHVybiBzZWxmIGlmKEBwYXJlbnQgPT0gbmlsKQorCQlyZXR1cm4gQHBhcmVudC5yb290CisJZW5kCitlbmQKK2NsYXNzIEdsb2JhbHMKKwlhdHRyX2FjY2Vzc29yIDpzcGFjZQorCWRlZiBpbml0aWFsaXplKCkKKwkJQHNwYWNlID0gTmFtZVNwYWNlLm5ldygpCisJCUBzcGFjZS5nZXRfbWFrZSgiYW9zIikKKwkJQGluY2x1ZGVfcGF0aHMgPSBbXQorCWVuZAorCWRlZiBwYXRocygpCisJCUBpbmNsdWRlX3BhdGhzCisJZW5kCisJZGVmIGFkZF9wYXRoKHBhdGgpCisJCUBpbmNsdWRlX3BhdGhzIDw8IHBhdGgKKwllbmQKKwlkZWYgZmluZF9maWxlKGZpbGVuYW1lKQorCQlAaW5jbHVkZV9wYXRocy5lYWNoIGRvIHxwYXRoX25hbWV8CisJCQluZXdfcGF0aCA9IEZpbGUuZXhwYW5kX3BhdGgocGF0aF9uYW1lKSArICIvIiArIGZpbGVuYW1lCisJCQlpZihGaWxlLmV4aXN0cz8obmV3X3BhdGgpKQorCQkJCXJldHVybiBuZXdfcGF0aCAKKwkJCWVuZAorCQllbmQKKwkJcmFpc2UgUUltcG9ydE5vdEZvdW5kRXJyb3IubmV3KDw8RVJST1JfTVNHKQorUHJvYmxlbSBMb2FkaW5nOiN7ZmlsZW5hbWUuaW5zcGVjdH0gSSBsb29rZWQgaW46CitcdCN7KEBpbmNsdWRlX3BhdGhzLmNvbGxlY3Qge3xuYW1lfCBuYW1lLmluc3BlY3R9KS5qb2luKCJcblx0Iil9CitcdGJ1dCBhbGFzLCBpdCB3YXMgbm93aGVyZSB0byBiZSBmb3VuZC4KK1x0SXQgaXMgcG9wdWxhciB0byBpbmNsdWRlIHRoZSB0b3Agb2YgdGhlIHJlcG9zaXRvcnkgYXMgdGhlIGluY2x1ZGUgcGF0aCBzdGFydCwgCitcdGFuZCB0aGVuIHJlZmVyZW5jZSBvZmYgb2YgdGhhdC4gCitcdEkgd291bGQgc3VnZ2VzdCBkb2luZyB0aGF0IGFuZCB0aGVuIHRyeWluZyB0byBidWlsZCBhZ2Fpbi4KK1x0V290LiBXb3QuCitFUlJPUl9NU0cKKwllbmQKK2VuZAorY2xhc3MgUXVhbGlmaWVkTmFtZQorCWF0dHJfYWNjZXNzb3IgOm5hbWVzLDpvZmZfcm9vdAorCWRlZiBpbml0aWFsaXplKG5hbWVzLG9mZl9yb290ID0gZmFsc2UpCisJCUBuYW1lcyA9IG5hbWVzCisJCUBvZmZfcm9vdCA9IG9mZl9yb290CisJZW5kCisJZGVmIHRlc3RfbG9va3VwKG5hbWVzcGFjZSkKKwkJQG5hbWVzLmVhY2ggZG8gfG5hbWV8CisJCQlyZXR1cm4gbmlsIGlmKCFuYW1lc3BhY2UucmVzcG9uZF90bz8oOltdKSkKKwkJCW5hbWVzcGFjZSA9IG5hbWVzcGFjZVtuYW1lXQorCQkJcmV0dXJuIG5pbCBpZighbmFtZXNwYWNlKQorCQllbmQKKwkJcmV0dXJuIG5hbWVzcGFjZQorCWVuZAorCWRlZiBpc19zaW1wbGU/KCkKKwkJcmV0dXJuICFAb2ZmX3Jvb3QgJiYgQG5hbWVzLmxlbmd0aCA9PSAxCisJZW5kCisJZGVmIHRvX3NpbXBsZSgpCisJCXJldHVybiBAbmFtZXNbLTFdCisJZW5kCisJZGVmIHRvX3MoKQorCQlpZihAb2ZmX3Jvb3QpCisJCQlyZXR1cm4gIi4je0BuYW1lcy5qb2luKCIuIil9IgorCQllbHNlCisJCQlyZXR1cm4gQG5hbWVzLmpvaW4oIi4iKQorCQllbmQKKwllbmQKKwlkZWYgbG9va3VwKGxvY2FscykKKwkJaWYoQG9mZl9yb290KQorCQkJbG9jYWwgPSBsb2NhbHMuZ2xvYmFscy5zcGFjZQorCQllbHNlCisJCQlsb2NhbCA9IGxvY2Fscy5sb2NhbAorCQllbmQKKwkJdGFyZ2V0ID0gbmlsCisJCXdoaWxlKCF0YXJnZXQgJiYgbG9jYWwpCisJCQl0YXJnZXQgPSB0ZXN0X2xvb2t1cChsb2NhbCkKKwkJCWxvY2FsID0gbG9jYWwucGFyZW50CisJCWVuZAorCQlyZXR1cm4gdGFyZ2V0IGlmKHRhcmdldCkKKwkJaWYoQG9mZl9yb290KQorCQkJcmFpc2UgUUVycm9yLm5ldyg8PEVSUk9SX01TRykKK0kgd2FzIGxvb2tpbmcgZm9yIC4je0BuYW1lcy5qb2luKCIuIil9LCBidXQgYWxhcywgaXQgd2FzIG5vdCB1bmRlcgorXHR0aGUgcm9vdCBuYW1lc3BhY2UuCitcdEknbSByZWFsbHkgc29ycnkgb2xkIGNoYXAuCitcdFdvdC4gV290LgorRVJST1JfTVNHCisJCWVsc2UKKwkJCXJhaXNlIFFFcnJvci5uZXcoPDxFUlJPUl9NU0cpCitJIHdhcyBsb29raW5nIGZvciAje0BuYW1lcy5qb2luKCIuIil9LCBidXQgYWxhcywgSSBjb3VsZCBub3QgZmluZAorXHRpdCBpbiAje2xvY2Fscy5sb2NhbC5nZXRfbmFtZX0gb3IgYW55IHBhcmVudCBuYW1lc3BhY2VzLgorXHRJJ20gcmVhbGx5IHNvcnJ5IG9sZCBjaGFwLgorXHRXb3QuIFdvdC4KK0VSUk9SX01TRworCQllbmQKKwllbmQKKwlkZWYgc2VsZi5wYXJzZSh0b2tlbnMpCisJCW5hbWVzID0gW10KKwkJb2ZmX3Jvb3QgPSAodG9rZW5zLnBlYWsgPT0gOnREb3QpCisJCXRva2Vucy5uZXh0IGlmKG9mZl9yb290KQorCQluYW1lcyA8PCB0b2tlbnMuZXhwZWN0KDp0V29yZCkuZGF0YQorCQl3aGlsZSh0b2tlbnMucGVhayA9PSA6dERvdCkKKwkJCXRva2Vucy5uZXh0CisJCQluYW1lcyA8PCB0b2tlbnMuZXhwZWN0KDp0V29yZCkuZGF0YQorCQllbmQKKwkJcmV0dXJuIHNlbGYubmV3KG5hbWVzLG9mZl9yb290KQorCWVuZAorZW5kCmRpZmYgLS1naXQgYS9hb3MvYnVpbGQvcXVldWVzL29iamVjdHMvcV9maWxlLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL3FfZmlsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNiNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL3FfZmlsZS5yYgpAQCAtMCwwICsxLDE1MCBAQAorY2xhc3MgUVN0bXQKKwlkZWYgc2V0X2xpbmUodmFsKQorCQlAZmlsZV9saW5lID0gdmFsCisJCXJldHVybiBzZWxmCisJZW5kCisJZGVmIHFfc3RhY2tfbmFtZSgpCisJCUBmaWxlX2xpbmUKKwllbmQKKwlkZWYgc2VsZi5tZXRob2RfYWRkZWQobmFtZSkKKwkJQHdyYXBwZWQgfHw9IHt9CisJCXJldHVybiBpZihuYW1lICE9IDpxX2V2YWwgJiYgbmFtZSAhPSA6cV9ldmFsX2V4dGVybikKKwkJcmV0dXJuIGlmKEB3cmFwcGVkW25hbWVdKQorCQlAd3JhcHBlZFtuYW1lXSA9IHRydWUKKwkJbWV0aG9kID0gc2VsZi5pbnN0YW5jZV9tZXRob2QobmFtZSkKKwkJZGVmaW5lX21ldGhvZChuYW1lKSBkbyB8KmFyZ3MsJmJsa3wKKwkJCWJlZ2luIAorCQkJCW1ldGhvZC5iaW5kKHNlbGYpLmNhbGwoKmFyZ3MsJmJsaykKKwkJCXJlc2N1ZSBRRXJyb3IgPT4gZQorCQkJCWUucXN0YWNrdHJhY2UgPDwgc2VsZgorCQkJCXJhaXNlIGUKKwkJCWVuZCAKKwkJZW5kIAorCWVuZCAKKworZW5kCitjbGFzcyBJbXBvcnRTdG10IDwgUVN0bXQKKwlkZWYgaW5pdGlhbGl6ZShmaWxlbmFtZSkKKwkJQGZpbGVuYW1lID0gZmlsZW5hbWUKKwllbmQKKwlkZWYgcV9ldmFsKGxvY2FscykKKwkJZmlsZW5hbWUgPSBsb2NhbHMuZ2xvYmFscy5maW5kX2ZpbGUoQGZpbGVuYW1lKQorCQkjcHV0cyAiaW1wb3J0aW5nICN7ZmlsZW5hbWUuaW5zcGVjdH0iCisJCXFfZmlsZSA9IFFGaWxlLnBhcnNlKGZpbGVuYW1lKQorCQlxX291dHB1dCA9IHFfZmlsZS5xX2V2YWxfZXh0ZXJuKGxvY2Fscy5nbG9iYWxzKQorCQlxX291dHB1dC5leHRlcm4gPSB0cnVlCisJCXJldHVybiBUYXJnZXQ6OlFJbmNsdWRlLm5ldyhAZmlsZW5hbWUgKyAiLmgiKQorCWVuZAorCWRlZiBzZWxmLnBhcnNlKHRva2VucykKKwkJbGluZSA9IHRva2Vucy5wb3MKKwkJdG9faW1wb3J0ID0gKHRva2Vucy5leHBlY3QoOnRTdHJpbmcpIGRvIHx0b2tlbnwKKwkJCTw8RVJST1JfTVNHCitJIGZvdW5kIGEgI3t0b2tlbi5odW1hbml6ZX0gYXQgI3t0b2tlbi5wb3N9LgorXHRJIHdhcyByZWFsbHkgbG9va2luZyBmb3IgYSAiZmlsZW5hbWUiIGZvciB0aGlzIGltcG9ydCBzdGF0ZW1lbnQuCitcdFNvbWV0aGluZyBsaWtlOiBpbXBvcnQgInN1cGVyX2Nvb2xfZmlsZSI7CitcdFdvdC5Xb3QKK0VSUk9SX01TRworCQllbmQpLmRhdGEKKwkJdG9rZW5zLmV4cGVjdCg6dFNlbWkpIGRvIHx0b2tlbnwKKwkJCTw8RVJST1JfTVNHCitJIGZvdW5kIGEgI3t0b2tlbi5odW1hbml6ZX0gYXQgI3t0b2tlbi5wb3N9LgorXHRJIHdhcyByZWFsbHkgbG9va2luZyBmb3IgYSAiOyIgdG8gZmluaXNoIG9mZiB0aGlzIGltcG9ydCBzdGF0ZW1lbnQKK1x0YXQgbGluZSAje2xpbmV9OworXHRTb21ldGhpbmcgbGlrZTogaW1wb3J0ICN7dG9faW1wb3J0Lmluc3BlY3R9OworXHRXb3QuV290ICAgICAgICAgICAgICAgICN7IiAiKnRvX2ltcG9ydC5pbnNwZWN0Lmxlbmd0aH1eCitFUlJPUl9NU0cKKwkJZW5kCisJCXJldHVybiBzZWxmLm5ldyh0b19pbXBvcnQpLnNldF9saW5lKGxpbmUpCisJZW5kCitlbmQKK2NsYXNzIFBhY2thZ2VTdG10IDwgUVN0bXQKKwlkZWYgaW5pdGlhbGl6ZShuYW1lKQorCQlAbmFtZSA9IG5hbWUKKwllbmQKKwlkZWYgcV9ldmFsKGxvY2FscykKKwkJbG9jYWxzLnBhY2thZ2UgPSBAbmFtZQorCQlyZXR1cm4gbmlsCisJZW5kCisJZGVmIHNlbGYucGFyc2UodG9rZW5zKQorCQlsaW5lID0gdG9rZW5zLnBvcworCQlxdWFsaWZpZWRfbmFtZSA9IFF1YWxpZmllZE5hbWUucGFyc2UodG9rZW5zKQorCQl0b2tlbnMuZXhwZWN0KDp0U2VtaSkKKwkJcmV0dXJuIHNlbGYubmV3KHF1YWxpZmllZF9uYW1lKS5zZXRfbGluZShsaW5lKQorCWVuZAorZW5kCitjbGFzcyBRRmlsZQorCWF0dHJfYWNjZXNzb3IgOm5hbWVzcGFjZQorCWRlZiBpbml0aWFsaXplKGZpbGVuYW1lLHN1aXRlKQorCQlAZmlsZW5hbWUsQHN1aXRlID0gZmlsZW5hbWUsc3VpdGUKKwllbmQKKwlkZWYgcV9ldmFsKGdsb2JhbHMgPSBHbG9iYWxzLm5ldygpKQorCQlsb2NhbF9wb3MgPSBMb2NhbFNpdHVhdGlvbi5uZXcoZ2xvYmFscykKKwkJcV9maWxlID0gVGFyZ2V0OjpRRmlsZS5uZXcoKQorCQlAc3VpdGUuZWFjaCBkbyB8bmFtZXwKKwkJCXZhbCA9IG5hbWUucV9ldmFsKGxvY2FsX3BvcykKKwkJCWlmKHZhbCkKKwkJCQlpZih2YWwucmVzcG9uZF90bz8oOmNyZWF0ZSkpCisJCQkJCXFfZmlsZS5hZGRfdHlwZSh2YWwpCisJCQkJZW5kCisJCQllbmQKKwkJZW5kCisJCUBuYW1lc3BhY2UgPSBsb2NhbF9wb3MubG9jYWwKKwkJcmV0dXJuIHFfZmlsZQorCWVuZAorCWRlZiBxX2V2YWxfZXh0ZXJuKGdsb2JhbHMpCisJCWxvY2FsX3BvcyA9IExvY2FsU2l0dWF0aW9uLm5ldyhnbG9iYWxzKQorCQlxX2ZpbGUgPSBUYXJnZXQ6OlFGaWxlLm5ldygpCisJCUBzdWl0ZS5lYWNoIGRvIHxuYW1lfAorCQkJaWYobmFtZS5yZXNwb25kX3RvPyg6cV9ldmFsX2V4dGVybikpCisJCQkJdmFsID0gbmFtZS5xX2V2YWxfZXh0ZXJuKGxvY2FsX3BvcykKKwkJCWVsc2UKKwkJCQl2YWwgPSBuYW1lLnFfZXZhbChsb2NhbF9wb3MpCisJCQllbmQKKwkJCWlmKHZhbCkKKwkJCQlpZih2YWwucmVzcG9uZF90bz8oOmNyZWF0ZSkpCisJCQkJCXFfZmlsZS5hZGRfdHlwZSh2YWwpCisJCQkJZW5kCisJCQllbmQKKwkJZW5kCisJCXJldHVybiBxX2ZpbGUKKwllbmQKKwlkZWYgc2VsZi5wYXJzZShmaWxlbmFtZSkKKwkJdG9rZW5zID0gVG9rZW5pemVyLm5ldyhmaWxlbmFtZSkKKwkJc3VpdGUgPSBbXQorCQl3aGlsZSh0b2tlbnMucGVhayAhPSA6dEVuZCkKKwkJCXRva2VuID0gdG9rZW5zLmV4cGVjdCg6dFdvcmQpIGRvIHx0b2tlbnwgI3N5bWJvbAorCQkJPDxFUlJPUl9NU0cKK0kgZm91bmQgYSAje3Rva2VuLmh1bWFuaXplfSBhdCAje3Rva2VuLnBvc30uCitcdEkgd2FzIHJlYWxseSBsb29raW5nIGZvciBhICJwYWNrYWdlIiwgImltcG9ydCIsICJxdWV1ZV9ncm91cCIsCitcdCJtZXNzYWdlIiwgb3IgInF1ZXVlIiBzdGF0ZW1lbnQgdG8gZ2V0IHRoaW5ncyBtb3ZpbmcuCitcdFNvbWV0aGluZyBsaWtlOiBpbXBvcnQgInN1cGVyX2Nvb2xfZmlsZSI7CitcdFdvdC5Xb3QKK0VSUk9SX01TRworCQkJZW5kCisJCQljYXNlIHRva2VuLmRhdGEKKwkJCXdoZW4gInBhY2thZ2UiCisJCQkJc3VpdGUgPDwgUGFja2FnZVN0bXQucGFyc2UodG9rZW5zKQorCQkJd2hlbiAiaW1wb3J0IgorCQkJCXN1aXRlIDw8IEltcG9ydFN0bXQucGFyc2UodG9rZW5zKQorCQkJd2hlbiAicXVldWVfZ3JvdXAiCisJCQkJc3VpdGUgPDwgUXVldWVHcm91cFN0bXQucGFyc2UodG9rZW5zKQorCQkJd2hlbiAibWVzc2FnZSIKKwkJCQlzdWl0ZSA8PCBNZXNzYWdlU3RtdC5wYXJzZSh0b2tlbnMpCisJCQl3aGVuICJxdWV1ZSIKKwkJCQlzdWl0ZSA8PCBRdWV1ZVN0bXQucGFyc2UodG9rZW5zKQorCQkJd2hlbiAiaW50ZXJmYWNlIgorCQkJCXN1aXRlIDw8IEludGVyZmFjZVN0bXQucGFyc2UodG9rZW5zKQorCQkJd2hlbiAic3RydWN0IgorCQkJCXN1aXRlIDw8IFN0cnVjdFN0bXQucGFyc2UodG9rZW5zKQorCQkJZWxzZQorCQkJCXRva2Vucy5xRXJyb3IoPDxFUlJPUl9NU0cpCitleHBlY3RlZCBhICJwYWNrYWdlIiwiaW1wb3J0IiwicXVldWUiLCJzdHJ1Y3QiLCJxdWV1ZV9ncm91cCIsIG9yICJtZXNzYWdlIiBzdGF0ZW1lbnQgcmF0aGVyCisJdGhhbiBhICN7dG9rZW4uZGF0YS5pbnNwZWN0fSwgKHdoYXRldmVyIHRoYXQgaXM/KQorCW9oISBubyEgYSBmZWF0dXJlIHJlcXVlc3QhPworCVdvdC4gV290LgorRVJST1JfTVNHCisJCQllbmQKKwkJZW5kCisJCXJldHVybiBzZWxmLm5ldyhmaWxlbmFtZSxzdWl0ZSkKKwllbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL3Ffc3RydWN0LnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL3Ffc3RydWN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDdmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL29iamVjdHMvcV9zdHJ1Y3QucmIKQEAgLTAsMCArMSwzNyBAQAorCitjbGFzcyBTdHJ1Y3RTdG10IAorCWRlZiBpbml0aWFsaXplKG5hbWUsc3VpdGUpCisJCUBuYW1lID0gbmFtZQorCQlAc3VpdGUgPSBzdWl0ZQorCWVuZAorCWRlZiBxX2V2YWwobG9jYWxzKQorCQlncm91cCA9IFRhcmdldDo6U3RydWN0RGVjLm5ldyhAbmFtZSkKKwkJbG9jYWxzLnJlZ2lzdGVyKGdyb3VwKQorCQlAc3VpdGUuZWFjaCBkbyB8c3RtdHwKKwkJCXN0bXQucV9ldmFsKGxvY2Fscy5iaW5kKGdyb3VwKSkKKwkJZW5kIAorCQlyZXR1cm4gZ3JvdXAKKwllbmQKKwlkZWYgc2VsZi5wYXJzZSh0b2tlbnMpCisJCW5hbWUgPSB0b2tlbnMuZXhwZWN0KDp0V29yZCkuZGF0YQorCQl2YWx1ZXMgPSBbXQorCQl0b2tlbnMuZXhwZWN0KDp0T3BlbkIpCisJCXdoaWxlKHRva2Vucy5wZWFrICE9IDp0Q2xvc2VCKQorCQkJdmFsdWVzIDw8IE1lc3NhZ2VFbGVtZW50U3RtdC5wYXJzZSh0b2tlbnMpCisJCWVuZAorCQluYW1lcyA9IHt9CisJCXZhbHVlcy5lYWNoIGRvIHx2YWx8CisJCQlpZihuYW1lc1t2YWwubmFtZV0pCisJCQkJcmFpc2UgUVN5bnRheEVycm9yLm5ldyg8PEVSUk9SX01TRykKK0hleSEgZHVwbGljYXRlIG5hbWUgI3t2YWwubmFtZS5pbnNwZWN0fSBpbiB5b3VyIG1lc3NhZ2UgZGVjbGFyYXRpb24gc3RhdGVtZW50IChtZXNzYWdlICN7bmFtZX0pLgorXHRJIGZvdW5kIHRoZW0gYXQ6ICN7bmFtZXNbdmFsLm5hbWVdLnFfc3RhY2tfbmFtZSgpfSBhbmQgI3t2YWwucV9zdGFja19uYW1lKCl9LgorXHRXb3QuIFdvdC4KK0VSUk9SX01TRworCQkJZW5kCisJCQluYW1lc1t2YWwubmFtZV0gPSB2YWwKKwkJZW5kCisJCXRva2Vucy5leHBlY3QoOnRDbG9zZUIpCisJCXRva2Vucy5leHBlY3QoOnRTZW1pKQorCQlzZWxmLm5ldyhuYW1lLHZhbHVlcykKKwllbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL3F1ZXVlLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL3F1ZXVlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxY2QxODEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL29iamVjdHMvcXVldWUucmIKQEAgLTAsMCArMSwxNzMgQEAKK2NsYXNzIE1lc3NhZ2VFbGVtZW50U3RtdCA8IFFTdG10CisJYXR0cl9hY2Nlc3NvciA6bmFtZQorCWRlZiBpbml0aWFsaXplKHR5cGVfbmFtZSxuYW1lLGxlbmd0aCA9IG5pbCkgI2xlbmd0aHMgYXJlIGZvciBhcnJheXMKKwkJQHR5cGVfbmFtZSA9IHR5cGVfbmFtZQorCQlAdHlwZSA9IHR5cGVfbmFtZS50b19zCisgICAgQHR5cGUgPSAnOjphb3M6OnRpbWU6OlRpbWUnIGlmIEB0eXBlID09ICdUaW1lJworCQlAbmFtZSA9IG5hbWUKKwkJQGxlbmd0aCA9IGxlbmd0aAorCWVuZAorCUNvbW1vbk1pc3Rha2VzID0geyJzaG9ydCIgPT4gImludDE2X3QiLCJpbnQiID0+ICJpbnQzMl90IiwibG9uZyIgPT4gImludDY0X3QiLCJ0aW1lIiA9PiAiVGltZSJ9CisJZGVmIGNoZWNrX3R5cGVfZXJyb3IobG9jYWxzKQorCQlpZighKFNpemVzW0B0eXBlXSB8fCAoQGxlbmd0aCAhPSBuaWwgJiYgQHR5cGUgPT0gImNoYXIiKSkgKQorCQkJaWYoY29ycmVjdGlvbiA9IENvbW1vbk1pc3Rha2VzW0B0eXBlXSkKKwkJCQlyYWlzZSBRRXJyb3IubmV3KDw8RVJST1JfTVNHKQorSGV5ISB5b3UgaGF2ZSBhIFwiI3tAdHlwZX1cIiBpbiB5b3VyIG1lc3NhZ2Ugc3RhdGVtZW50LgorXHRwbGVhc2UgdXNlICN7Y29ycmVjdGlvbn0gaW5zdGVhZC4gWW91ciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB3ZQorXHR3YW50IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBzaXplcyBvZiB0aGUgbWVzc2FnZXMgc3RheSB0aGUgc2FtZSBhY3Jvc3MgcGxhdGZvcm1zLgorXHRXb3QuIFdvdC4KK0VSUk9SX01TRworCQkJZWxzaWYoQHR5cGUgPT0gImNoYXIiKQorCQkJCXJhaXNlIFFFcnJvci5uZXcoPDxFUlJPUl9NU0cpCitIZXkhIHlvdSBoYXZlIGEgXCIje0B0eXBlfVwiIGluIHlvdXIgbWVzc2FnZSBzdGF0ZW1lbnQuCitcdHlvdSBuZWVkIHlvdXIgZGVjbGFyYXRpb24gdG8gYmUgYSBjaGFyIGFycmF5IGxpa2U6IGNoYXJbMTBdLgorXHRvciwgcGxlYXNlIHVzZSBpbnQ4X3Qgb3IgdWludDhfdC4KK1x0V290LiBXb3QuCitFUlJPUl9NU0cKKwkJCWVsc2UKKwkJCQlAaXNfc3RydWN0X3R5cGUgPSB0cnVlCisJCQkJcmV0dXJuIGlmKGxvb2t1cF90eXBlKGxvY2FscykpCisJCQkJcmFpc2UgUUVycm9yLm5ldyg8PEVSUk9SX01TRykKK0hleSEgeW91IGhhdmUgYSBcIiN7QHR5cGV9XCIgaW4geW91ciBtZXNzYWdlIHN0YXRlbWVudC4KK1x0VGhhdCBpcyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHR5cGVzLgorXHRoZXJlIGlzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB0eXBlczoKK1x0aW50ezgsMTYsMzIsNjR9X3QsdWludHs4LDE2LDMyLDY0fV90LGJvb2wsZmxvYXQsZG91YmxlCitcdFdvdC4gV290LgorRVJST1JfTVNHCisJCQllbmQKKwkJZW5kCisJZW5kCisKKwlQcmludEZvcm1hdCA9IHsiYm9vbCIgPT4gIiVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IiA9PiAiJWYiLAorICAgICAgICAgICAgICAgICAgICAgICAiY2hhciIgPT4gIiVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZSIgPT4gIiVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInVpbnQ4X3QiID0+ICIlXCIgUFJJdTggXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAidWludDE2X3QiID0+ICIlXCIgUFJJdTE2IFwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInVpbnQzMl90IiA9PiAiJVwiIFBSSXUzMiBcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICJ1aW50NjRfdCIgPT4gIiVcIiBQUkl1NjQgXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAiaW50OF90IiA9PiAiJVwiIFBSSWQ4IFwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImludDE2X3QiID0+ICIlXCIgUFJJZDE2IFwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImludDMyX3QiID0+ICIlXCIgUFJJZDMyIFwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImludDY0X3QiID0+ICIlXCIgUFJJZDY0IFwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIjo6YW9zOjp0aW1lOjpUaW1lIiA9PiAiXCIgQU9TX1RJTUVfRk9STUFUIFwiIn0KKyAgICAgICAgZGVmIHRvUHJpbnRGb3JtYXQoKQorCQlpZihmb3JtYXQgPSBQcmludEZvcm1hdFtAdHlwZV0pCisJCQlyZXR1cm4gZm9ybWF0OworCQllbmQKKwkJcmFpc2UgUUVycm9yLm5ldyg8PEVSUk9SX01TRykKK1NvbWVob3cgdGhpcyBzbGlwcGVkIHBhc3QgbWUsIGJ1dAorXHRJIGNvdWxkbid0IGZpbmQgdGhlIHByaW50IGZvcm1hdCBvZiAje0B0eXBlfS4gUmVhbGx5LCBteSBiYWQuCitcdFdvdC4gV290LgorRVJST1JfTVNHCisJZW5kCisKKwlTaXplcyA9IHsiYm9vbCIgPT4gMSwgImZsb2F0IiA9PiA0LCJkb3VibGUiID0+IDgsIjo6YW9zOjp0aW1lOjpUaW1lIiA9PiA4fQorCVs4LDE2LDMyLDY0XS5lYWNoIGRvIHxsZW58CisJCVNpemVzWyJpbnQje2xlbn1fdCJdID0gbGVuIC8gOAorCQlTaXplc1sidWludCN7bGVufV90Il0gPSBsZW4gLyA4CisJZW5kCisJWmVybyA9IHsiZmxvYXQiID0+ICIwLjBmIiwiZG91YmxlIiA9PiAiMC4wIiwiYm9vbCIgPT4gImZhbHNlIiwiOjphb3M6OnRpbWU6OlRpbWUiID0+ICI6OmFvczo6dGltZTo6VGltZSgwLCAwKSJ9CisJZGVmIHNpemUoKQorCQlpZihzaXplID0gU2l6ZXNbQHR5cGVdKTsgcmV0dXJuIHNpemU7IGVuZAorCQlyZXR1cm4gMSBpZihAdHlwZSA9PSAiY2hhciIpCisJCXJhaXNlIFFFcnJvci5uZXcoPDxFUlJPUl9NU0cpCitTb21laG93IHRoaXMgc2xpcHBlZCBwYXN0IG1lLCBidXQKK1x0SSBjb3VsZG4ndCBmaW5kIHRoZSBzaXplIG9mICN7QHR5cGV9LiBSZWFsbHksIG15IGJhZC4KK1x0V290LiBXb3QuCitFUlJPUl9NU0cKKwllbmQKKwlkZWYgbG9va3VwX3R5cGUobG9jYWxzKQorCQlyZXR1cm4gQHR5cGVfbmFtZS5sb29rdXAobG9jYWxzKQorCWVuZAorCWRlZiBxX2V2YWwobG9jYWxzKQorCQljaGVja190eXBlX2Vycm9yKGxvY2FscykKKwkJaWYoQGlzX3N0cnVjdF90eXBlKQorCQkJdHZhbCA9IGxvb2t1cF90eXBlKGxvY2FscykKKwkJCW1lbWJlciA9IFRhcmdldDo6TWVzc2FnZVN0cnVjdEVsZW1lbnQubmV3KHR2YWwsIEBuYW1lKQorICAgICAgaWYgKEBsZW5ndGggIT0gbmlsKQorICAgICAgICBpbm5lcl9tZW1iZXIgPSBtZW1iZXIKKyAgICAgICAgbWVtYmVyID0gVGFyZ2V0OjpNZXNzYWdlQXJyYXlFbGVtZW50Lm5ldyhpbm5lcl9tZW1iZXIsIEBsZW5ndGgpCisgICAgICBlbmQKKwkJZWxzZQorCQkJbWVtYmVyID0gVGFyZ2V0OjpNZXNzYWdlRWxlbWVudC5uZXcoQHR5cGUsQG5hbWUpCisJCQltZW1iZXIuc2l6ZSA9IHNpemUoKQorCQkJbWVtYmVyLnplcm8gPSBaZXJvW0B0eXBlXSB8fCAiMCI7CisJCQltZW1iZXIucHJpbnRmb3JtYXQgPSB0b1ByaW50Rm9ybWF0KCkKKworCQkJaWYoQGxlbmd0aCAhPSBuaWwpCisgICAgICAgIGlubmVyX21lbWJlciA9IG1lbWJlcgorCQkJCW1lbWJlciA9IFRhcmdldDo6TWVzc2FnZUFycmF5RWxlbWVudC5uZXcoaW5uZXJfbWVtYmVyLEBsZW5ndGgpCisJCQllbmQKKwkJZW5kCisJCWxvY2Fscy5sb2NhbC5hZGRfbWVtYmVyKG1lbWJlcikKKwllbmQKKwlkZWYgc2VsZi5wYXJzZSh0b2tlbnMpCisJCWxpbmUgPSB0b2tlbnMucG9zCisJCSN0eXBlID0gdG9rZW5zLmV4cGVjdCg6dFdvcmQpLmRhdGEKKwkJdHlwZV9uYW1lID0gUXVhbGlmaWVkTmFtZS5wYXJzZSh0b2tlbnMpCisJCWxlbiA9IG5pbAorCQlpZih0b2tlbnMucGVhayA9PSA6dE9wZW5CKQorCQkJdG9rZW5zLmV4cGVjdCg6dE9wZW5CKQorCQkJbGVuID0gdG9rZW5zLmV4cGVjdCg6dE51bWJlcikuZGF0YQorCQkJdG9rZW5zLmV4cGVjdCg6dENsb3NlQikKKwkJZW5kCisJCW5hbWUgPSB0b2tlbnMuZXhwZWN0KDp0V29yZCkuZGF0YQorCQl0b2tlbnMuZXhwZWN0KDp0U2VtaSkKKwkJcmV0dXJuIHNlbGYubmV3KHR5cGVfbmFtZSxuYW1lLGxlbikuc2V0X2xpbmUobGluZSkKKwllbmQKK2VuZAorY2xhc3MgTWVzc2FnZVN0bXQgPCBRU3RtdAorCWRlZiBpbml0aWFsaXplKG5hbWUsc3VpdGUpCisJCUBuYW1lID0gbmFtZQorCQlAc3VpdGUgPSBzdWl0ZQorCWVuZAorCWRlZiBxX2V2YWwobG9jYWxzKQorCQlncm91cCA9IFRhcmdldDo6TWVzc2FnZURlYy5uZXcoQG5hbWUpCisJCWxvY2Fscy5yZWdpc3Rlcihncm91cCkKKwkJQHN1aXRlLmVhY2ggZG8gfHN0bXR8CisJCQlzdG10LnFfZXZhbChsb2NhbHMuYmluZChncm91cCkpCisJCWVuZCAKKwkJcmV0dXJuIGdyb3VwCisJZW5kCisJZGVmIHNlbGYucGFyc2UodG9rZW5zKQorCQluYW1lID0gdG9rZW5zLmV4cGVjdCg6dFdvcmQpLmRhdGEKKwkJdmFsdWVzID0gW10KKwkJdG9rZW5zLmV4cGVjdCg6dE9wZW5CKQorCQl3aGlsZSh0b2tlbnMucGVhayAhPSA6dENsb3NlQikKKwkJCXZhbHVlcyA8PCBNZXNzYWdlRWxlbWVudFN0bXQucGFyc2UodG9rZW5zKQorCQllbmQKKwkJbmFtZXMgPSB7fQorCQl2YWx1ZXMuZWFjaCBkbyB8dmFsfAorCQkJaWYobmFtZXNbdmFsLm5hbWVdKQorCQkJCXJhaXNlIFFTeW50YXhFcnJvci5uZXcoPDxFUlJPUl9NU0cpCitIZXkhIGR1cGxpY2F0ZSBuYW1lICN7dmFsLm5hbWUuaW5zcGVjdH0gaW4geW91ciBtZXNzYWdlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCAobWVzc2FnZSAje25hbWV9KS4KK1x0SSBmb3VuZCB0aGVtIGF0OiAje25hbWVzW3ZhbC5uYW1lXS5xX3N0YWNrX25hbWUoKX0gYW5kICN7dmFsLnFfc3RhY2tfbmFtZSgpfS4KK1x0V290LiBXb3QuCitFUlJPUl9NU0cKKwkJCWVuZAorCQkJbmFtZXNbdmFsLm5hbWVdID0gdmFsCisJCWVuZAorCQl0b2tlbnMuZXhwZWN0KDp0Q2xvc2VCKQorCQl0b2tlbnMuZXhwZWN0KDp0U2VtaSkKKwkJc2VsZi5uZXcobmFtZSx2YWx1ZXMpCisJZW5kCitlbmQKK2NsYXNzIFF1ZXVlU3RtdCA8IFFTdG10CisJZGVmIGluaXRpYWxpemUodHlwZSxuYW1lKQorCQlAdHlwZSxAbmFtZSA9IHR5cGUsbmFtZQorCWVuZAorCWRlZiBxX2V2YWwobG9jYWxzKQorCQlxdWV1ZSA9IFRhcmdldDo6UXVldWVEZWMubmV3KEB0eXBlLmxvb2t1cChsb2NhbHMpLEBuYW1lKQorCQlsb2NhbHMucmVnaXN0ZXIocXVldWUpCisJCWxvY2Fscy5sb2NhbC5hZGRfcXVldWUocXVldWUpIGlmKGxvY2Fscy5sb2NhbC5yZXNwb25kX3RvPyg6YWRkX3F1ZXVlKSkKKwkJcmV0dXJuIHF1ZXVlCisJZW5kCisJZGVmIHNlbGYucGFyc2UodG9rZW5zKQorCQlsaW5lID0gdG9rZW5zLnBvcworCQl0eXBlX25hbWUgPSBRdWFsaWZpZWROYW1lLnBhcnNlKHRva2VucykKKwkJbmFtZSA9IHRva2Vucy5leHBlY3QoOnRXb3JkKS5kYXRhCisJCXRva2Vucy5leHBlY3QoOnRTZW1pKQorCQlyZXR1cm4gc2VsZi5uZXcodHlwZV9uYW1lLG5hbWUpLnNldF9saW5lKGxpbmUpCisJZW5kCitlbmQKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9xdWV1ZXMvb2JqZWN0cy9xdWV1ZV9ncm91cC5yYiBiL2Fvcy9idWlsZC9xdWV1ZXMvb2JqZWN0cy9xdWV1ZV9ncm91cC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzY4MzRmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL3F1ZXVlcy9vYmplY3RzL3F1ZXVlX2dyb3VwLnJiCkBAIC0wLDAgKzEsMTE1IEBACitjbGFzcyBRdWV1ZUdyb3VwVHlwZVN0bXQgPCBRU3RtdAorCWRlZiBpbml0aWFsaXplKG5hbWUsc3VpdGUpCisJCUBuYW1lLEBzdWl0ZSA9IG5hbWUsc3VpdGUKKwllbmQKKwlkZWYgcV9ldmFsKGxvY2FscykKKwkJZ3JvdXAgPSBUYXJnZXQ6OlF1ZXVlR3JvdXBEZWMubmV3KEBuYW1lKQorCQlncm91cC5jcmVhdGVkX2J5ID0gc2VsZgorCQlsb2NhbHMucmVnaXN0ZXIoZ3JvdXApCisJCUBzdWl0ZS5lYWNoIGRvIHxzdG10fAorCQkJc3RtdC5xX2V2YWwobG9jYWxzLmJpbmQoZ3JvdXApKQorCQllbmQKKwkJcmV0dXJuIGdyb3VwCisJZW5kCitlbmQKK2NsYXNzIEltcGxlbWVudHNTdG10IDwgUVN0bXQKKwlkZWYgaW5pdGlhbGl6ZShuYW1lKQorCQlAbmFtZSA9IG5hbWUKKwllbmQKKwlkZWYgcV9ldmFsKGxvY2FscykKKworCWVuZAorCWRlZiBzZWxmLnBhcnNlKHRva2VucykKKwkJbmFtZSA9IFF1YWxpZmllZE5hbWUucGFyc2UodG9rZW5zKQorCQl0b2tlbnMuZXhwZWN0KDp0U2VtaSkKKwkJcmV0dXJuIHNlbGYubmV3KG5hbWUpCisJZW5kCitlbmQKK2NsYXNzIFF1ZXVlR3JvdXBTdG10IDwgUVN0bXQKKwlkZWYgaW5pdGlhbGl6ZSh0eXBlLG5hbWUpCisJCUB0eXBlLEBuYW1lID0gdHlwZSxuYW1lCisJZW5kCisJZGVmIHFfZXZhbChsb2NhbHMpCisJCWdyb3VwID0gVGFyZ2V0OjpRdWV1ZUdyb3VwLm5ldyhAdHlwZS5sb29rdXAobG9jYWxzKSxAbmFtZSkKKwkJZ3JvdXAuY3JlYXRlZF9ieSA9IHNlbGYKKwkJbG9jYWxzLnJlZ2lzdGVyKGdyb3VwKQorCQlyZXR1cm4gZ3JvdXAKKwllbmQKKwlkZWYgc2VsZi5wYXJzZSh0b2tlbnMpCisJCWxpbmUgPSB0b2tlbnMucG9zCisJCXR5cGVfbmFtZSA9IFF1YWxpZmllZE5hbWUucGFyc2UodG9rZW5zKQorCQlpZih0eXBlX25hbWUubmFtZXMuaW5jbHVkZT8oInF1ZXVlX2dyb3VwIikpCisJCQl0b2tlbnMucUVycm9yKDw8RVJST1JfTVNHKQorSSB3YXMgbG9va2luZyBhdCB0aGUgaWRlbnRpZmllciB5b3UgZ2F2ZSAKK1x0Zm9yIHRoZSBxdWV1ZSBncm91cCB0eXBlIGJldHdlZW4gbGluZSAje2xpbmV9IGFuZCAje3Rva2Vucy5wb3N9CitcdFRoZXJlIHNob3VsZG4ndCBiZSBhIHF1ZXVlX2dyb3VwIHR5cGUgY2FsbGVkIHF1ZXVlX2dyb3VwCitcdG9yIGluY2x1ZGluZyBxdWV1ZV9ncm91cCBpbiBpdCdzIHBhdGgsIGl0IGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KK1x0V290LiBXb3QuCitFUlJPUl9NU0cKKwkJZW5kCisJCWlmKHRva2Vucy5wZWFrID09IDp0T3BlbkIpCisJCQlpZih0eXBlX25hbWUuaXNfc2ltcGxlPygpKQorCQkJCXR5cGVfbmFtZSA9IHR5cGVfbmFtZS50b19zaW1wbGUKKwkJCWVsc2UKKwkJCQl0b2tlbnMucUVycm9yKDw8RVJST1JfTVNHKQorWW91IGdhdmUgdGhlIG5hbWU6ICIje3R5cGVfbmFtZS50b19zfSIgYnV0IHlvdSdyZSBvbmx5IGFsbG93ZWQgdG8gCitcdGhhdmUgc2ltcGxlIG5hbWVzIGxpa2UgIiN7dHlwZV9uYW1lLm5hbWVzWy0xXX0iIGluIHF1ZXVlX2dyb3VwIGRlZmluaXRpb25zCitcdHRyeSBzb21ldGhpbmcgbGlrZToKK1x0cXVldWVfZ3JvdXAgQ29udHJvbExvb3AgeyB9CitcdFdvdC4gV290LgorRVJST1JfTVNHCisJCQllbmQKKwkJCXRva2Vucy5leHBlY3QoOnRPcGVuQikKKwkJCXN1aXRlID0gW10KKwkJCXdoaWxlKHRva2Vucy5wZWFrICE9IDp0Q2xvc2VCKQorCQkJCXRva2VuID0gdG9rZW5zLmV4cGVjdCg6dFdvcmQpIGRvIHx0b2tlbnwKKwkJCQkJPDxFUlJPUl9NU0cKK0knbSBhIGxpdHRsZSBjb25mdXNlZCwgSSBmb3VuZCBhICN7dG9rZW4uaHVtYW5pemV9IGF0ICN7dG9rZW4ucG9zfQorXHRidXQgd2hhdCBJIHJlYWxseSB3YW50ZWQgd2FzIGFuIGlkZW50aWZpZXIgc2lnbmlmeWluZyBhIG5lc3RlZCAKK1x0bWVzc2FnZSBkZWNsYXJhdGlvbiwgb3IgcXVldWUgZGVmaW5pdGlvbiwgb3IgYW4gaW1wbGltZW50cyBzdGF0ZW1lbnQuCitcdFdvdC5Xb3QKK0VSUk9SX01TRworCQkJCWVuZAorCQkJCWNhc2UgdG9rZW4uZGF0YQorCQkJCXdoZW4gIm1lc3NhZ2UiCisJCQkJCXN1aXRlIDw8IE1lc3NhZ2VTdG10LnBhcnNlKHRva2VucykKKwkJCQl3aGVuICJxdWV1ZSIKKwkJCQkJc3VpdGUgPDwgUXVldWVTdG10LnBhcnNlKHRva2VucykKKwkJCQl3aGVuICJpbXBsZW1lbnRzIgorCQkJCQlzdWl0ZSA8PCBJbXBsZW1lbnRzU3RtdC5wYXJzZSh0b2tlbnMpCisJCQkJZWxzZQorCQkJCQl0b2tlbnMucUVycm9yKDw8RVJST1JfTVNHKQorZXhwZWN0ZWQgYSAicXVldWUiLCJpbXBsZW1lbnRzIiBvciAibWVzc2FnZSIgc3RhdGVtZW50IHJhdGhlcgorXHR0aGFuIGEgI3t0b2tlbi5kYXRhLmluc3BlY3R9LgorXHRXb3QuIFdvdC4KK0VSUk9SX01TRworCQkJCWVuZCAKKwkJCWVuZAorCQkJdG9rZW5zLmV4cGVjdCg6dENsb3NlQikKKwkJCW9iaiA9IFF1ZXVlR3JvdXBUeXBlU3RtdC5uZXcodHlwZV9uYW1lLHN1aXRlKS5zZXRfbGluZShsaW5lKQorCQllbHNlCisJCQluYW1lID0gKHRva2Vucy5leHBlY3QoOnRXb3JkKSBkbyB8dG9rZW58CisJCQkJPDxFUlJPUl9NU0cKK0kgZm91bmQgYSAje3Rva2VuLmh1bWFuaXplfSBhdCAje3Rva2VuLnBvc30KK1x0YnV0IEkgd2FzIGluIHRoZSBtaWRkbGUgb2YgcGFyc2luZyBhIHF1ZXVlX2dyb3VwIHN0YXRlbWVudCwgYW5kCitcdHdoYXQgSSByZWFsbHkgd2FudGVkIHdhcyBhbiBpZGVudGlmaWVyIHRvIHN0b3JlIHRoZSBxdWV1ZSBncm91cC4KK1x0U29tZXRoaW5nIGxpa2U6IHF1ZXVlX2dyb3VwIGNvbnRyb2xfbG9vcHMuRHJpdmV0cmFpbiBteV9jb29sX2dyb3VwOworXHRXb3QuV290CitFUlJPUl9NU0cKKwkJCWVuZCkuZGF0YQorCQkJb2JqID0gUXVldWVHcm91cFN0bXQubmV3KHR5cGVfbmFtZSxuYW1lKS5zZXRfbGluZShsaW5lKQorCQkJaWYodG9rZW5zLnBlYWsgPT0gOnREb3QpCisJCQkJdG9rZW5zLnFFcnJvcig8PEVSUk9SX01TRykKK0hleSEgSXQgbG9va3MgbGlrZSB5b3UncmUgdHJ5aW5nIHRvIHVzZSBhIGNvbXBsZXggaWRlbnRpZmllciBhdDogI3t0b2tlbnMucG9zfQorXHRUaGF0cyBub3QgZ29pbmcgdG8gd29yay4gUXVldWUgR3JvdXAgZGVmaW5pdGlvbnMgaGF2ZSB0byBiZSBvZiB0aGUgZm9ybToKK1x0cXVldWVfZ3JvdXAgQ29tcGxleElEIFNpbXBsZUlECitcdFdvdC4gV290LgorRVJST1JfTVNHCisJCQllbmQJCisJCWVuZAorCQl0b2tlbnMuZXhwZWN0KDp0U2VtaSkgZG8gfHRva2VufAorCQkJdG9rZW4ucG9zCisJCWVuZAorCQlyZXR1cm4gb2JqCisJZW5kCitlbmQKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9xdWV1ZXMvb2JqZWN0cy90b2tlbml6ZXIucmIgYi9hb3MvYnVpbGQvcXVldWVzL29iamVjdHMvdG9rZW5pemVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzNiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL29iamVjdHMvdG9rZW5pemVyLnJiCkBAIC0wLDAgKzEsMjEzIEBACitjbGFzcyBCdWZmZXJlZFJlYWRlcgorCWRlZiBpbml0aWFsaXplKGZpbGUpCisJCUBmaWxlID0gZmlsZQorCQlAbGluZSA9IDEKKwkJQGNoYXJzID0gW10KKwkJQGNvbF9udW1zID0gW10KKwkJQGNvbCA9IDAKKwllbmQKKwlkZWYgZmlsZW5hbWUKKwkJcmV0dXJuIEZpbGUuYmFzZW5hbWUoQGZpbGUucGF0aCkKKwllbmQKKwlkZWYgcG9zKCkKKwkJIiN7ZmlsZW5hbWUoKX06I3tsaW5lbm8oKX0sI3tAY29sfSIKKwllbmQKKwlkZWYgY2xlYXJfY29tbWVudCgpCisJCUBmaWxlLmdldHMKKwkJQGxpbmUgKz0gMQorCWVuZAorCWRlZiBsaW5lbm8oKQorCQlyZXR1cm4gQGxpbmUKKwkJcmV0dXJuIEBmaWxlLmxpbmVubyArIDEKKwllbmQKKwlkZWYgcG9wX2NoYXIoKQorCQl2YWwgPSBAY2hhcnMucG9wKCkgfHwgQGZpbGUucmVhZCgxKQorCQlAY29sX251bXNbQGxpbmVdID0gQGNvbCArPSAxCisJCWlmKHZhbCA9PSAiXG4iKQorCQkJQGxpbmUgKz0gMQorCQkJQGNvbCA9IDAKKwkJZW5kCisKKwkJcmV0dXJuIHZhbAorCWVuZAorCWRlZiB1bnBvcF9jaGFyKGNoYXIpCisJCWlmKGNoYXIgPT0gIlxuIikKKwkJCUBsaW5lIC09IDEKKwkJCUBjb2wgPSBAY29sX251bXNbQGxpbmVdCisJCWVuZAorCQlAY29sIC09IDEKKwkJQGNoYXJzLnB1c2goY2hhcikKKwllbmQKK2VuZAorY2xhc3MgVG9rZW5pemVyCisJVE9LRU5fVFlQRVMgPSB7InsiID0+IDp0T3BlbkIsIn0iPT4gOnRDbG9zZUIsIjsiID0+IDp0U2VtaSwiLCIgPT4gOnRDb21tYSwKKwkJIigiID0+IDp0T3BlblBhcmFuLCIpIiA9PiA6dENsb3NlUGFyYW4sIj0iID0+IDp0QXNzaWduLCIuIiA9PiA6dERvdCwKKwkJIjw8Ij0+IDp0TFNoaWZ0LCIqIiA9PiA6dE11bHQsIisiID0+IDp0QWRkLCJbIiA9PiA6dE9wZW5CLAorCQkiXSIgPT4gOnRDbG9zZUJ9CisJSHVtYW5pemUgPSBUT0tFTl9UWVBFUy5pbnZlcnQKKwljbGFzcyBUb2tlbgorCQlhdHRyX2FjY2Vzc29yIDp0eXBlLDpkYXRhLDpwb3MKKwkJZGVmIHRvX3MKKwkJCWlmKEB0eXBlID09IDp0U3RyaW5nKQorCQkJCXZhbCA9IEBkYXRhLmluc3BlY3QudG9fcworCQkJZWxzaWYoQHR5cGUgPT0gOnRXb3JkKQorCQkJCXZhbCA9IEBkYXRhLnRvX3MKKwkJCWVsc2UKKwkJCQl2YWwgPSBAZGF0YS50b19zCisJCQllbmQKKwkJCXJldHVybiAiI3t2YWwubGp1c3QoNTApfToje0B0eXBlfSIKKwkJZW5kCisJCWRlZiBodW1hbml6ZSgpCisJCQlpZihAdHlwZSA9PSA6dFN0cmluZykKKwkJCQlyZXR1cm4gIiN7QGRhdGEuaW5zcGVjdC50b19zfSBzdHJpbmciCisJCQllbHNpZihAdHlwZSA9PSA6dFdvcmQpCisJCQkJcmV0dXJuICIje0BkYXRhLmluc3BlY3R9IGlkZW50aWZpZXIiCisJCQllbmQKKwkJCXJldHVybiBIdW1hbml6ZVtAdHlwZV0uaW5zcGVjdAorCQllbmQKKwkJZGVmIGluc3BlY3QoKQorCQkJZGF0YSA9ICIiCisJCQlkYXRhID0gIiAje0BkYXRhLmluc3BlY3R9IiBpZihAZGF0YSkKKwkJCSI8VG9rZW4gOiN7QHR5cGV9I3tkYXRhfSBhdCAje0Bwb3N9PiIKKwkJZW5kCisJCWRlZiA9PShvdGhlcikKKwkJCWlmKG90aGVyLmNsYXNzID09IFN5bWJvbCkKKwkJCQlyZXR1cm4gQHR5cGUgPT0gb3RoZXIKKwkJCWVsc2lmKG90aGVyLmNsYXNzID09IHNlbGYuY2xhc3MpCisJCQkJcmV0dXJuIEB0eXBlID09IG90aGVyLnR5cGUgJiYgQGRhdGEgPT0gb3RoZXIuZGF0YQorCQkJZWxzZQorCQkJCXJldHVybiBuaWwKKwkJCWVuZAorCQllbmQKKwllbmQKKwlkZWYgaW5pdGlhbGl6ZShmaWxlKQorCQlmaWxlID0gRmlsZS5vcGVuKGZpbGUsInIiKSBpZihmaWxlLmNsYXNzID09IFN0cmluZykKKwkJQHJlYWQgPSBCdWZmZXJlZFJlYWRlci5uZXcoZmlsZSkKKwllbmQKKwlkZWYgcUVycm9yKGVycm9yKQorCQlzeW50YXhfZXJyb3IoZXJyb3IpCisJZW5kCisJZGVmIHN5bnRheF9lcnJvcihtc2cpCisJCWVyciA9IFFTeW50YXhFcnJvci5uZXcobXNnKQorCQllcnIucXN0YWNrdHJhY2UgPDwgIiN7QHJlYWQubGluZW5vfSBvZiAje0ByZWFkLmZpbGVuYW1lfSIKKwkJcmFpc2UgZXJyCisJZW5kCisJZGVmIHBlYWtfdG9rZW4oKQorCQlAcGVha190b2tlbiA9IG5leHRfdG9rZW4oKQorCWVuZAorCWRlZiBwZWFrKCkKKwkJcGVha190b2tlbigpCisJZW5kCisJZGVmIG5leHQoKQorCQluZXh0X3Rva2VuKCkKKwllbmQKKwlkZWYgcG9zKCkKKwkJQHJlYWQucG9zCisJZW5kCisJZGVmIHRva2VuaXplKHN0cmluZ190b2tlbikKKwkJdG9rZW4gPSBUb2tlbi5uZXcoKQorCQl0b2tlbi50eXBlID0gVE9LRU5fVFlQRVNbc3RyaW5nX3Rva2VuXQorCQlyZXR1cm4gdG9rZW4KKwllbmQKKwlkZWYgbmV4dF90b2tlbigpCisJCWlmKHRva2VuID0gQHBlYWtfdG9rZW4pCisJCQlAcGVha190b2tlbiA9IG5pbAorCQkJcmV0dXJuIHRva2VuCisJCWVuZAorCQl0b2tlbiA9IG5leHRfdG9rZW5fY2FjaGUoKQorCQlwb3MgPSBzZWxmLnBvcygpCisJCXRva2VuLnBvcyA9IHBvcworCQlyZXR1cm4gdG9rZW4KKwllbmQKKwlkZWYgbmV4dF90b2tlbl9jYWNoZSgpCisJCXRva2VuID0gVG9rZW4ubmV3KCkKKwkJdG9rZW4uZGF0YSA9ICIiCisJCXdoaWxlIChjaGFyID0gQHJlYWQucG9wX2NoYXIoKSkKKwkJCSNwdXRzICIje2NoYXIuaW5zcGVjdH06I3t0b2tlbi5pbnNwZWN0fSIKKwkJCWlmKGNoYXIgPT0gIi8iKQorCQkJCWlmKEByZWFkLnBvcF9jaGFyID09ICIvIikKKwkJCQkJQHJlYWQuY2xlYXJfY29tbWVudCgpCisJCQkJZWxzZQorCQkJCQlzeW50YXhfZXJyb3IoInVuZXhwZWN0ZWQgI3tjaGFyLmluc3BlY3R9IikKKwkJCQllbmQKKwkJCWVsc2lmKGNoYXIgPT0gIiMiKQorCQkJCUByZWFkLmNsZWFyX2NvbW1lbnQoKQorCQkJZWxzaWYoY2hhciA9fiAvW1xzXHJcbl0vKQorCQkJCWlmKHRva2VuLnR5cGUpCisJCQkJCXJldHVybiB0b2tlbgorCQkJCWVuZAorCQkJZWxzaWYoY2hhciA9fiAvXCIvKQorCQkJCXRva2VuLnR5cGUgPSA6dFN0cmluZworCQkJCXRva2VuLmRhdGEgPSAiIgorCQkJCXdoaWxlKChjaGFyID0gQHJlYWQucG9wX2NoYXIpICE9ICJcIiIpCisJCQkJCXRva2VuLmRhdGEgKz0gY2hhcgorCQkJCWVuZAorCQkJCXJldHVybiB0b2tlbgorCQkJZWxzaWYoY2hhciA9fiAvWzEtOV0vKQorCQkJCXRva2VuLnR5cGUgPSA6dE51bWJlcgorCQkJCXRva2VuLmRhdGEgPSBjaGFyLnRvX2kKKwkJCQl3aGlsZShjaGFyICE9ICIuIikKKwkJCQkJY2hhciA9IEByZWFkLnBvcF9jaGFyCisJCQkJCWlmKGNoYXIgPX4gL1swLTldLykKKwkJCQkJCXRva2VuLmRhdGEgPSBjaGFyLnRvX2kgKyB0b2tlbi5kYXRhICogMTAKKwkJCQkJZWxzaWYoY2hhciA9PSAiLiIpCisJCQkJCWVsc2UKKwkJCQkJCUByZWFkLnVucG9wX2NoYXIoY2hhcikKKwkJCQkJCXJldHVybiB0b2tlbgorCQkJCQllbmQKKwkJCQllbmQKKwkJCQlzZWNvbmRfY2hhciA9IDAKKwkJCQltYW4gPSAwCisJCQkJd2hpbGUodHJ1ZSkKKwkJCQkJY2hhciA9IEByZWFkLnBvcF9jaGFyCisJCQkJCWlmKGNoYXIgPX4gL1swLTldLykKKwkJCQkJCXNlY29uZF9jaGFyID0gY2hhci50b19pICsgc2Vjb25kX2NoYXIgKiAxMAorCQkJCQkJbWFuID0gbWFuICogMTAKKwkJCQkJZWxzZQorCQkJCQkJQHJlYWQudW5wb3BfY2hhcihjaGFyKQorCQkJCQkJdG9rZW4uZGF0YSArPSBzZWNvbmRfY2hhciAvIG1hbi50b19mCisJCQkJCQlyZXR1cm4gdG9rZW4KKwkJCQkJZW5kCisJCQkJZW5kCisJCQllbHNpZihjaGFyID09ICI6IikKKwkJCQlpZihAcmVhZC5wb3BfY2hhciA9PSAiPSIpCisJCQkJCXJldHVybiB0b2tlbml6ZSgiOj0iKQorCQkJCWVuZAorCQkJCXN5bnRheF9lcnJvcigidW5leHBlY3RlZCBcIjpcIiIpCisJCQllbHNpZihjaGFyID1+IC9bO1x7XH09KClcIixcKlwrXC5cW1xdXS8pCisJCQkJcmV0dXJuKHRva2VuaXplKGNoYXIpKQorCQkJZWxzaWYoY2hhciA9fiAvW2EtekEtWl9dLykKKwkJCQl0b2tlbi50eXBlID0gOnRXb3JkCisJCQkJdG9rZW4uZGF0YSA9IGNoYXIKKwkJCQl3aGlsZSh0cnVlKQorCQkJCQljaGFyID0gQHJlYWQucG9wX2NoYXIoKQorCQkJCQlpZihjaGFyICYmIGNoYXIgPX4gL1x3LykKKwkJCQkJCXRva2VuLmRhdGEgKz0gY2hhcgorCQkJCQllbHNlCisJCQkJCQlAcmVhZC51bnBvcF9jaGFyKGNoYXIpCisJCQkJCQlyZXR1cm4gdG9rZW4KKwkJCQkJZW5kCisJCQkJZW5kCisJCQllbHNpZihjaGFyID09ICI8IikKKwkJCQlpZigoY2hhciA9IEByZWFkLnBvcF9jaGFyKCkpID09ICI8IikKKwkJCQkJcmV0dXJuIHRva2VuaXplKCI8PCIpCisJCQkJZWxzZQorCQkJCQlAcmVhZC51bnBvcF9jaGFyKGNoYXIpCisJCQkJCXJldHVybiB0b2tlbml6ZSgiPCIpCisJCQkJZW5kCisJCQllbHNlCisJCQkJc3ludGF4X2Vycm9yKCJ1bmV4cGVjdGVkICN7Y2hhci5pbnNwZWN0fSIpCisJCQllbmQKKwkJZW5kCisJCXRva2VuLnR5cGUgPSA6dEVuZAorCQlyZXR1cm4gdG9rZW4KKwllbmQKKwlkZWYgZXhwZWN0KHR5cGUsJmJsaykKKwkJdG9rZW4gPSBzZWxmLm5leHQKKwkJaWYodG9rZW4gIT0gdHlwZSkKKwkJCXN5bnRheF9lcnJvcihibGsuY2FsbCh0b2tlbikpIGlmKGJsaykKKwkJCXN5bnRheF9lcnJvcigidW5leHBlY3RlZDogI3t0b2tlbi50eXBlfSIpCisJCWVuZAorCQlyZXR1cm4gdG9rZW4KKwllbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9vdXRwdXQvbWVzc2FnZV9kZWMucmIgYi9hb3MvYnVpbGQvcXVldWVzL291dHB1dC9tZXNzYWdlX2RlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjRlMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL3F1ZXVlcy9vdXRwdXQvbWVzc2FnZV9kZWMucmIKQEAgLTAsMCArMSw0MjggQEAKK2JlZ2luCisgIHJlcXVpcmUgInNoYTEiCityZXNjdWUgTG9hZEVycm9yCisgIHJlcXVpcmUgImRpZ2VzdC9zaGExIgorZW5kCisKK2NsYXNzIFRhcmdldDo6U3RydWN0QmFzZSA8IFRhcmdldDo6Tm9kZQorICBkZWYgY3JlYXRlX0RvR2V0VHlwZSh0eXBlX2NsYXNzLCBjcHBfdHJlZSkKKyAgICBtZW1iZXJfZnVuYyA9IENQUDo6TWVtYmVyRnVuYy5uZXcodHlwZV9jbGFzcywiY29uc3QgOjphb3M6Ok1lc3NhZ2VUeXBlKiIsIkRvR2V0VHlwZSIpCisgICAgbWVtYmVyX2Z1bmMuc3RhdGljID0gdHJ1ZQorICAgIGZpZWxkcyA9IFtdCisgICAgcmVnaXN0ZXJfbWVtYmVycyA9IFtdCisgICAgQG1lbWJlcnMuZWFjaCBkbyB8bWVtYmVyfAorICAgICAgdElkID0gbWVtYmVyLmdldFR5cGVJRCgpCisgICAgICBmaWVsZE5hbWUgPSBtZW1iZXIubmFtZS5pbnNwZWN0CisgICAgICBpZihtZW1iZXIucmVzcG9uZF90bz8oOmFkZF9UeXBlUmVnaXN0ZXIpKQorICAgICAgICByZWdpc3Rlcl9tZW1iZXJzLnB1c2gobWVtYmVyKQorICAgICAgZW5kCisgICAgICBmaWVsZHMgPDwgIm5ldyA6OmFvczo6TWVzc2FnZVR5cGU6OkZpZWxkeyN7dElkfSwgI3ttZW1iZXIucmVzcG9uZF90bz8oOmxlbmd0aCkgPyBtZW1iZXIubGVuZ3RoIDogMH0sICN7ZmllbGROYW1lfX0iCisgICAgZW5kCisgICAgcmVnaXN0ZXJfbWVtYmVycy51bmlxIGRvIHxtZW1iZXJ8CisgICAgICBtZW1iZXIudHlwZQorICAgIGVuZC5lYWNoIGRvIHxtZW1iZXJ8CisgICAgICBtZW1iZXIuYWRkX1R5cGVSZWdpc3RlcihjcHBfdHJlZSwgdHlwZV9jbGFzcywgbWVtYmVyX2Z1bmMpCisgICAgZW5kCisgICAgaWQgPSBnZXRUeXBlSUQoKQorICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICgic3RhdGljIGNvbnN0IDo6YW9zOjpNZXNzYWdlVHlwZSBrTXNnTWVzc2FnZVR5cGUoI3t0eXBlX2NsYXNzLnBhcmVudF9jbGFzcyA/IHR5cGVfY2xhc3MucGFyZW50X2NsYXNzICsgJzo6U2l6ZSgpJyA6IDB9LCAje2lkfSwgI3soQGxvYy5yZXNwb25kX3RvPyg6cXVldWVfbmFtZSkgPyBAbG9jLnF1ZXVlX25hbWUoQG5hbWUpIDogIiN7QGxvYy5nZXRfbmFtZSgpfS4je0BuYW1lfSIpLmluc3BlY3R9LCB7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIje2ZpZWxkcy5qb2luKCIsICIpfX0pIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2xhc3MuYWRkX21lbWJlcihtZW1iZXJfZnVuYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgIjo6YW9zOjp0eXBlX2NhY2hlOjpBZGQoa01zZ01lc3NhZ2VUeXBlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgQ1BQOjpSZXR1cm4ubmV3KCIma01zZ01lc3NhZ2VUeXBlIikKKyAgZW5kCisgIGRlZiBjcmVhdGVfSW5PcmRlckNvbnN0cnVjdG9yKHR5cGVfY2xhc3MsIGNwcF90cmVlKQorICAgIGlmIEBtZW1iZXJzLmVtcHR5PworICAgICAgcmV0dXJuCisgICAgZW5kCisgICAgY29ucyA9IENQUDo6Q29uc3RydWN0b3IubmV3KHR5cGVfY2xhc3MpCisgICAgdHlwZV9jbGFzcy5hZGRfbWVtYmVyKGNvbnMpCisgICAgQG1lbWJlcnMuZWFjaCBkbyB8bWVtYmVyfAorICAgICAgaWYgbWVtYmVyLnJlc3BvbmRfdG8/KDp0eXBlX25hbWUpCisgICAgICAgIHR5cGVfbmFtZSA9ICIje21lbWJlci50eXBlX25hbWUoY3BwX3RyZWUpfSAje21lbWJlci5uYW1lfV9pbiIKKyAgICAgIGVsc2UKKyAgICAgICAgdHlwZV9uYW1lID0gbWVtYmVyLmNyZWF0ZV91c2FnZShjcHBfdHJlZSwgIiN7bWVtYmVyLm5hbWV9X2luIikKKyAgICAgIGVuZAorCisgICAgICBjb25zLmFyZ3MgPDwgdHlwZV9uYW1lCisgICAgICBjb25zLmFkZF9jb25zKG1lbWJlci5uYW1lLCBtZW1iZXIubmFtZSArICdfaW4nKQorICAgIGVuZAorICBlbmQKKyAgZGVmIGNyZWF0ZV9EZWZhdWx0Q29uc3RydWN0b3IodHlwZV9jbGFzcywgY3BwX3RyZWUpCisgICAgY29ucyA9IENQUDo6Q29uc3RydWN0b3IubmV3KHR5cGVfY2xhc3MpCisgICAgdHlwZV9jbGFzcy5hZGRfbWVtYmVyKGNvbnMpCisgICAgY29ucy5hZGRfY29ucyh0eXBlX2NsYXNzLnBhcmVudF9jbGFzcykgaWYgdHlwZV9jbGFzcy5wYXJlbnRfY2xhc3MKKyAgICBjb25zLnN1aXRlIDw8IENQUDo6RnVuY0NhbGwuYnVpbGQoJ1plcm8nKQorICBlbmQKKyAgZGVmIGNyZWF0ZV9aZXJvKHR5cGVfY2xhc3MsY3BwX3RyZWUpCisgICAgbWVtYmVyX2Z1bmMgPSBDUFA6Ok1lbWJlckZ1bmMubmV3KHR5cGVfY2xhc3MsInZvaWQiLCJaZXJvIikKKyAgICB0eXBlX2NsYXNzLmFkZF9tZW1iZXIobWVtYmVyX2Z1bmMpCisgICAgQG1lbWJlcnMuZWFjaCBkbyB8ZWxlbXwKKyAgICAgIGVsZW0uemVyb0NhbGwobWVtYmVyX2Z1bmMuc3VpdGUpCisgICAgZW5kCisgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgQ1BQOjpGdW5jQ2FsbC5uZXcodHlwZV9jbGFzcy5wYXJlbnRfY2xhc3MgKyAnOjpaZXJvJykgaWYgdHlwZV9jbGFzcy5wYXJlbnRfY2xhc3MKKyAgZW5kCisgIGRlZiBjcmVhdGVfU2l6ZSh0eXBlX2NsYXNzLGNwcF90cmVlKQorICAgIG1lbWJlcl9mdW5jID0gQ1BQOjpNZW1iZXJGdW5jLm5ldyh0eXBlX2NsYXNzLCJzaXplX3QiLCJTaXplIikKKyAgICBtZW1iZXJfZnVuYy5pbmxpbmUgPSB0cnVlCisgICAgbWVtYmVyX2Z1bmMuc3RhdGljID0gdHJ1ZQorICAgIHR5cGVfY2xhc3MuYWRkX21lbWJlcihtZW1iZXJfZnVuYy5mb3J3YXJkX2RlYykKKyAgICBzaXplID0gMAorICAgIEBtZW1iZXJzLmVhY2ggZG8gfGVsZW18CisgICAgICBzaXplICs9IGVsZW0uc2l6ZQorICAgIGVuZAorICAgIGlmIHR5cGVfY2xhc3MucGFyZW50X2NsYXNzCisgICAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCBDUFA6OlJldHVybi5uZXcoQ1BQOjpBZGQubmV3KHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIje3R5cGVfY2xhc3MucGFyZW50X2NsYXNzfTo6U2l6ZSgpIikpCisgICAgZWxzZQorICAgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgQ1BQOjpSZXR1cm4ubmV3KHNpemUpCisgICAgZW5kCisgIGVuZAorICBkZWYgY3JlYXRlX1NlcmlhbGl6ZSh0eXBlX2NsYXNzLGNwcF90cmVlKQorICAgIG1lbWJlcl9mdW5jID0gQ1BQOjpNZW1iZXJGdW5jLm5ldyh0eXBlX2NsYXNzLCJzaXplX3QiLCJTZXJpYWxpemUiKQorICAgIHR5cGVfY2xhc3MuYWRkX21lbWJlcihtZW1iZXJfZnVuYykKKyAgICBtZW1iZXJfZnVuYy5hcmdzIDw8ICJjaGFyICpidWZmZXIiCisgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgIiN7dHlwZV9jbGFzcy5wYXJlbnRfY2xhc3N9OjpTZXJpYWxpemUoYnVmZmVyKSIgaWYgdHlwZV9jbGFzcy5wYXJlbnRfY2xhc3MKKyAgICBtZW1iZXJfZnVuYy5jb25zdCA9IHRydWUKKyAgICBvZmZzZXQgPSB0eXBlX2NsYXNzLnBhcmVudF9jbGFzcyA/IHR5cGVfY2xhc3MucGFyZW50X2NsYXNzICsgJzo6U2l6ZSgpJyA6ICcwJworICAgIEBtZW1iZXJzLmVhY2ggZG8gfGVsZW18CisgICAgICBlbGVtLnRvTmV0d29yayhvZmZzZXQsbWVtYmVyX2Z1bmMuc3VpdGUpCisgICAgICBvZmZzZXQgKz0gIiArICN7ZWxlbS5zaXplfSI7CisgICAgZW5kCisgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgQ1BQOjpSZXR1cm4ubmV3KENQUDo6RnVuY0NhbGwubmV3KCdTaXplJykpCisgIGVuZAorICBkZWYgY3JlYXRlX0Rlc2VyaWFsaXplKHR5cGVfY2xhc3MsY3BwX3RyZWUpCisgICAgbWVtYmVyX2Z1bmMgPSBDUFA6Ok1lbWJlckZ1bmMubmV3KHR5cGVfY2xhc3MsInNpemVfdCIsIkRlc2VyaWFsaXplIikKKyAgICB0eXBlX2NsYXNzLmFkZF9tZW1iZXIobWVtYmVyX2Z1bmMpCisgICAgbWVtYmVyX2Z1bmMuYXJncyA8PCAiY29uc3QgY2hhciAqYnVmZmVyIgorICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICIje3R5cGVfY2xhc3MucGFyZW50X2NsYXNzfTo6RGVzZXJpYWxpemUoYnVmZmVyKSIgaWYgdHlwZV9jbGFzcy5wYXJlbnRfY2xhc3MKKyAgICBvZmZzZXQgPSB0eXBlX2NsYXNzLnBhcmVudF9jbGFzcyA/IHR5cGVfY2xhc3MucGFyZW50X2NsYXNzICsgJzo6U2l6ZSgpJyA6ICcwJworICAgIEBtZW1iZXJzLmVhY2ggZG8gfGVsZW18CisgICAgICBlbGVtLnRvSG9zdChvZmZzZXQsbWVtYmVyX2Z1bmMuc3VpdGUpCisgICAgICBvZmZzZXQgKz0gIiArICN7ZWxlbS5zaXplfSI7CisgICAgZW5kCisgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgQ1BQOjpSZXR1cm4ubmV3KENQUDo6RnVuY0NhbGwubmV3KCdTaXplJykpCisgIGVuZAorICBkZWYgY3JlYXRlX0VxdWFsc05vVGltZSh0eXBlX2NsYXNzLGNwcF90cmVlKQorICAgIG1lbWJlcl9mdW5jID0gQ1BQOjpNZW1iZXJGdW5jLm5ldyh0eXBlX2NsYXNzLCJib29sIiwiRXF1YWxzTm9UaW1lIikKKyAgICBtZW1iZXJfZnVuYy5jb25zdCA9IHRydWUKKyAgICB0eXBlX2NsYXNzLmFkZF9tZW1iZXIobWVtYmVyX2Z1bmMpCisgICAgbWVtYmVyX2Z1bmMuYXJncyA8PCAiY29uc3QgI3t0eXBlX2NsYXNzLm5hbWV9ICZvdGhlciIKKyAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCAiaWYgKCEje3R5cGVfY2xhc3MucGFyZW50X2NsYXNzfTo6RXF1YWxzTm9UaW1lKG90aGVyKSkgcmV0dXJuIGZhbHNlOyIgaWYgdHlwZV9jbGFzcy5wYXJlbnRfY2xhc3MKKyAgICBAbWVtYmVycy5lYWNoIGRvIHxlbGVtfAorICAgICAgaWYgZWxlbS5yZXNwb25kX3RvPyA6Y3JlYXRlX0VxdWFsc05vVGltZQorICAgICAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCAiaWYgKCFvdGhlci4je2VsZW0ubmFtZX0uRXF1YWxzTm9UaW1lKCN7ZWxlbS5uYW1lfSkpIHJldHVybiBmYWxzZTsiCisgICAgICBlbHNpZiBlbGVtLnJlc3BvbmRfdG8/KDpsZW5ndGgpICYmIGVsZW0ubWVtYmVyX3R5cGUucmVzcG9uZF90bz8oOmNyZWF0ZV9FcXVhbHNOb1RpbWUpCisgICAgICAgIDAudXB0byhlbGVtLmxlbmd0aCAtIDEpIGRvIHxpfAorICAgICAgICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICJpZiAoIW90aGVyLiN7ZWxlbS5uYW1lfVsje2l9XS5FcXVhbHNOb1RpbWUoI3tlbGVtLm5hbWV9WyN7aX1dKSkgcmV0dXJuIGZhbHNlOyIKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICJpZiAob3RoZXIuI3tlbGVtLm5hbWV9ICE9ICN7ZWxlbS5uYW1lfSkgcmV0dXJuIGZhbHNlOyIKKyAgICAgIGVuZAorICAgIGVuZAorICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8IENQUDo6UmV0dXJuLm5ldygndHJ1ZScpCisgIGVuZAorICBkZWYgc2ltcGxlU3RyKCkKKyAgICByZXR1cm4gIntcbiIgKyBAbWVtYmVycy5jb2xsZWN0KCkgeyB8ZWxlbXwgZWxlbS5zaW1wbGVTdHIoKSArICJcbiJ9LmpvaW4oIiIpICsgIn0iCisgIGVuZAorICBkZWYgZ2V0VHlwZUlEKCkKKyAgICByZXR1cm4gIjB4IiArICgoKERpZ2VzdDo6U0hBMS5oZXhkaWdlc3Qoc2ltcGxlU3RyKCkpWzAuLjNdLnRvX2koMTYpKSA8PCAxNikgfCBzaXplKS50b19zKDE2KQorICBlbmQKKyAgZGVmIGFkZF9tZW1iZXIobWVtYmVyKQorICAgIEBtZW1iZXJzIDw8IG1lbWJlcgorICBlbmQKKyAgZGVmIHNpemUoKQorICAgIHJldHVybiBAc2l6ZSBpZihAc2l6ZSkKKyAgICBAc2l6ZSA9IDAKKyAgICBAbWVtYmVycy5lYWNoIGRvIHxlbGVtfAorICAgICAgQHNpemUgKz0gZWxlbS5zaXplCisgICAgZW5kCisgICAgcmV0dXJuIEBzaXplCisgIGVuZAorZW5kCisKK2NsYXNzIFRhcmdldDo6TWVzc2FnZURlYyA8IFRhcmdldDo6U3RydWN0QmFzZQorICBhdHRyX2FjY2Vzc29yIDpuYW1lLDpsb2MsOnBhcmVudCw6bXNnX2hhc2gKKyAgZGVmIGluaXRpYWxpemUobmFtZSkKKyAgICBAbmFtZSA9IG5hbWUKKyAgICBAbWVtYmVycyA9IFtdCisgIGVuZAorICBkZWYgZXh0ZXJuPSh2YWx1ZSkKKyAgICBAZXh0ZXJuPXZhbHVlCisgIGVuZAorICBkZWYgZ2V0X25hbWUoKQorICAgIGlmKEBwYXJlbnQpCisgICAgICByZXR1cm4gIiN7QHBhcmVudC5nZXRfbmFtZX0uI3tAbmFtZX0iCisgICAgZWxzZQorICAgICAgcmV0dXJuICIje0BuYW1lfSIKKyAgICBlbmQKKyAgZW5kCisgIGRlZiBjcmVhdGVfUHJpbnQodHlwZV9jbGFzcyxjcHBfdHJlZSkKKyAgICBtZW1iZXJfZnVuYyA9IENQUDo6TWVtYmVyRnVuYy5uZXcodHlwZV9jbGFzcywic2l6ZV90IiwiUHJpbnQiKQorICAgIHR5cGVfY2xhc3MuYWRkX21lbWJlcihtZW1iZXJfZnVuYykKKyAgICBtZW1iZXJfZnVuYy5hcmdzIDw8ICJjaGFyICpidWZmZXIiCisgICAgbWVtYmVyX2Z1bmMuYXJncyA8PCAic2l6ZV90IGxlbmd0aCIKKyAgICBtZW1iZXJfZnVuYy5jb25zdCA9IHRydWUKKyAgICBmb3JtYXQgPSAiXCIiCisgICAgYXJncyA9IFtdCisgICAgQG1lbWJlcnMuZWFjaCBkbyB8ZWxlbXwKKyAgICAgIGZvcm1hdCArPSAiLCAiCisgICAgICBmb3JtYXQgKz0gZWxlbS50b1ByaW50Rm9ybWF0KCkKKyAgICAgIGVsZW0uZmV0Y2hQcmludEFyZ3MoYXJncykKKyAgICBlbmQKKyAgICBmb3JtYXQgKz0gIlwiIgorICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICJzaXplX3Qgc3VwZXJfc2l6ZSA9IDo6YW9zOjpNZXNzYWdlOjpQcmludChidWZmZXIsIGxlbmd0aCkiCisgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgImJ1ZmZlciArPSBzdXBlcl9zaXplIgorICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICJsZW5ndGggLT0gc3VwZXJfc2l6ZSIKKyAgICBpZiAhYXJncy5lbXB0eT8KKyAgICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICJyZXR1cm4gc3VwZXJfc2l6ZSArIHNucHJpbnRmKGJ1ZmZlciwgbGVuZ3RoLCAiICsgKFtmb3JtYXRdICsgYXJncykuam9pbigiLCAiKSArICIpIjsKKyAgICBlbHNlCisgICAgICAjIHNucHJpbnRmIHdpbGwgcmV0dXJuIHplcm8uCisgICAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCAicmV0dXJuIHN1cGVyX3NpemUiCisgICAgZW5kCisgIGVuZAorICBkZWYgY3JlYXRlX0dldFR5cGUodHlwZV9jbGFzcywgY3BwX3RyZWUpCisgICAgbWVtYmVyX2Z1bmMgPSBDUFA6Ok1lbWJlckZ1bmMubmV3KHR5cGVfY2xhc3MsImNvbnN0IDo6YW9zOjpNZXNzYWdlVHlwZSoiLCJHZXRUeXBlIikKKyAgICB0eXBlX2NsYXNzLmFkZF9tZW1iZXIobWVtYmVyX2Z1bmMpCisgICAgbWVtYmVyX2Z1bmMuc3RhdGljID0gdHJ1ZQorICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICJzdGF0aWMgOjphb3M6Ok9uY2U8Y29uc3QgOjphb3M6Ok1lc3NhZ2VUeXBlPiBnZXR0ZXIoI3t0eXBlX2NsYXNzLm5hbWV9OjpEb0dldFR5cGUpIgorICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8IENQUDo6UmV0dXJuLm5ldygiZ2V0dGVyLkdldCgpIikKKyAgZW5kCisgIGRlZiBzZWxmLmJ1aWxkZXJfbG9jKGxvYykKKyAgICByZXR1cm4gQGJ1aWxkZXJfbG9jIGlmKEBidWlsZGVyX2xvYykKKyAgICByZXR1cm4gQGJ1aWxkZXJfbG9jID0gbG9jLnJvb3QuZ2V0X21ha2UoImFvcyIpCisgIGVuZAorICBkZWYgdHlwZV9uYW1lKGJ1aWxkZXJfbG9jLG5hbWUpCisgICAgaWYoYnVpbGRlcl9sb2MgPT0gQGxvYykgI3VzZSByZWxhdGl2ZSBuYW1lCisgICAgICByZXR1cm4gbmFtZQorICAgIGVsc2UgI3VzZSBmdWxsIG5hbWUKKyAgICAgIHJldHVybiBAbG9jLnRvX2NwcF9pZChuYW1lKQorICAgIGVuZAorICBlbmQKKyAgZGVmIGNyZWF0ZShjcHBfdHJlZSkKKyAgICByZXR1cm4gc2VsZiBpZihAZXh0ZXJuKQorICAgIG9yaWdfbmFtZXNwYWNlID0gbmFtZXNwYWNlID0gY3BwX3RyZWUuZ2V0KEBsb2MpCisgICAgbmFtZSA9ICIiCisgICAgaWYobmFtZXNwYWNlLmNsYXNzIDwgVHlwZXM6OlR5cGUpICNpcyBuZXN0ZWQKKyAgICAgIG5hbWUgPSBuYW1lc3BhY2UubmFtZSArICJfIiArIG5hbWUKKyAgICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zcGFjZQorICAgIGVuZAorICAgIHR5cGVfY2xhc3MgPSBuYW1lc3BhY2UuYWRkX3N0cnVjdChuYW1lICsgQG5hbWUpCisgICAgaWYobmFtZS5sZW5ndGggPiAwKQorICAgICAgb3JpZ19uYW1lc3BhY2UuYWRkX21lbWJlcig6cHVibGljLCBUeXBlczo6VHlwZURlZi5uZXcodHlwZV9jbGFzcyxAbmFtZSkpCisgICAgZW5kCisgICAgY3BwX3RyZWUuc2V0KHNlbGYsdHlwZV9jbGFzcykKKyAgICB0eXBlX2NsYXNzLnNldF9wYXJlbnQoInB1YmxpYyA6OmFvczo6TWVzc2FnZSIpCisgICAgdHMgPSBzZWxmLnNpbXBsZVN0cigpCisgICAgc2VsZi5tc2dfaGFzaCA9ICIweCN7RGlnZXN0OjpTSEExLmhleGRpZ2VzdCh0cylbLTguLi0xXX0iCisgICAgdHlwZV9jbGFzcy5hZGRfbWVtYmVyKCJlbnVtIHtrUXVldWVMZW5ndGggPSAxMDAsIGtIYXNoID0gI3tzZWxmLm1zZ19oYXNofX0iKQorICAgIEBtZW1iZXJzLmVhY2ggZG8gfGVsZW18CisgICAgICB0eXBlX2NsYXNzLmFkZF9tZW1iZXIoZWxlbS5jcmVhdGVfdXNhZ2UoY3BwX3RyZWUpKQorICAgIGVuZAorCisgICAgY3JlYXRlX1NlcmlhbGl6ZSh0eXBlX2NsYXNzLGNwcF90cmVlKQorICAgIGNyZWF0ZV9EZXNlcmlhbGl6ZSh0eXBlX2NsYXNzLGNwcF90cmVlKQorICAgIGNyZWF0ZV9aZXJvKHR5cGVfY2xhc3MsY3BwX3RyZWUpCisgICAgY3JlYXRlX1NpemUodHlwZV9jbGFzcyxjcHBfdHJlZSkKKyAgICBjcmVhdGVfUHJpbnQodHlwZV9jbGFzcyxjcHBfdHJlZSkKKyAgICBjcmVhdGVfR2V0VHlwZSh0eXBlX2NsYXNzLCBjcHBfdHJlZSkKKyAgICBjcmVhdGVfRG9HZXRUeXBlKHR5cGVfY2xhc3MsIGNwcF90cmVlKQorICAgIGNyZWF0ZV9EZWZhdWx0Q29uc3RydWN0b3IodHlwZV9jbGFzcywgY3BwX3RyZWUpCisgICAgY3JlYXRlX0luT3JkZXJDb25zdHJ1Y3Rvcih0eXBlX2NsYXNzLCBjcHBfdHJlZSkKKyAgICBjcmVhdGVfRXF1YWxzTm9UaW1lKHR5cGVfY2xhc3MsIGNwcF90cmVlKQorCisgICAgYl9uYW1lc3BhY2UgPSBjcHBfdHJlZS5nZXQoYl9sb2MgPSBzZWxmLmNsYXNzLmJ1aWxkZXJfbG9jKEBsb2MpKQorCisgICAgdGVtcGxhdGUgPSBiX25hbWVzcGFjZS5hZGRfdGVtcGxhdGUoIk1lc3NhZ2VCdWlsZGVyIikKKyAgICB0ZW1wbGF0ZS5zcGVjX2FyZ3MgPDwgdCA9IEBsb2MudG9fY3BwX2lkKEBuYW1lKQorICAgIG1zZ19wdHJfdCA9ICJTY29wZWRNZXNzYWdlUHRyPCAje3R9PiIKKyAgICBtc2dfYmxkX3QgPSAiTWVzc2FnZUJ1aWxkZXI8ICN7dH0+IgorICAgIHRlbXBsYXRlLmFkZF9tZW1iZXIoOnByaXZhdGUsIiN7bXNnX3B0cl90fSBtc2dfcHRyXyIpCisgICAgdGVtcGxhdGUuYWRkX21lbWJlcig6cHJpdmF0ZSwiI3ttc2dfYmxkX3R9KGNvbnN0ICN7bXNnX2JsZF90fSYpIikKKyAgICB0ZW1wbGF0ZS5hZGRfbWVtYmVyKDpwcml2YXRlLCJ2b2lkIG9wZXJhdG9yPShjb25zdCAje21zZ19ibGRfdH0mKSIpCisgICAgdGVtcGxhdGUuYWRkX21lbWJlcig6cHJpdmF0ZSwiZnJpZW5kIGNsYXNzIDo6YW9zOjpRdWV1ZTwgI3t0fT4iKQorCisgICAgY29ucyA9IENQUDo6Q29uc3RydWN0b3IubmV3KHRlbXBsYXRlKQorICAgIHRlbXBsYXRlLmFkZF9tZW1iZXIoOnByaXZhdGUsY29ucykKKyAgICBjb25zLmFyZ3MgPDwgIlJhd1F1ZXVlICpxdWV1ZSIKKyAgICBjb25zLmFyZ3MgPDwgIiN7dH0gKm1zZyIKKyAgICBjb25zLmFkZF9jb25zKCJtc2dfcHRyXyIsInF1ZXVlIiwibXNnIikKKyAgICB0ZW1wbGF0ZS5wdWJsaWMKKyAgICBEZWZpbmVNZW1iZXJzKGNwcF90cmVlLCB0ZW1wbGF0ZSwgbXNnX2JsZF90KQorICBlbmQKKyAgZGVmIERlZmluZU1lbWJlcnMoY3BwX3RyZWUsIHRlbXBsYXRlLCBtc2dfYmxkX3QpIAorICAgIHNlbmQgPSB0ZW1wbGF0ZS5kZWZfZnVuYygiYm9vbCIsIlNlbmQiKQorICAgIHNlbmQuc3VpdGUgPDwgQ1BQOjpSZXR1cm4ubmV3KCJtc2dfcHRyXy5TZW5kKCkiKQorICAgIEBtZW1iZXJzLmVhY2ggZG8gfGVsZW18Cis9YmVnaW4KKyAgICAgIE1lc3NhZ2VCdWlsZGVyPGZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpbjo6R29hbD4gJnN0ZWVyaW5nKAorICAgICAgICAgICAgICBkb3VibGUgc3RlZXJpbmcpIHsKKyAgICAgICAgICAgIG1zZ19wdHJfLT5zdGVlcmluZyA9IHN0ZWVyaW5nOworICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICAgIH0KKz1lbmQKKyAgICAgIHNldHRlciA9IHRlbXBsYXRlLmRlZl9mdW5jKG1zZ19ibGRfdCwiJiN7ZWxlbS5uYW1lfSIpCisgICAgICAgIHNldHRlci5hcmdzIDw8IGVsZW0uY3JlYXRlX3VzYWdlKGNwcF90cmVlKQorICAgICAgZWxlbS5zZXRfbWVzc2FnZV9idWlsZGVyKHNldHRlci5zdWl0ZSkKKyAgICAgIHNldHRlci5zdWl0ZSA8PCBDUFA6OlJldHVybi5uZXcoIip0aGlzIikKKworICAgIGVuZAorICBlbmQKK2VuZAorY2xhc3MgVGFyZ2V0OjpNZXNzYWdlRWxlbWVudCA8IFRhcmdldDo6Tm9kZQorICBhdHRyX2FjY2Vzc29yIDpuYW1lLDpsb2MsOnNpemUsOnplcm8sOnR5cGUsOnByaW50Zm9ybWF0CisgIGRlZiBpbml0aWFsaXplKHR5cGUsbmFtZSkKKyAgICBAdHlwZSxAbmFtZSA9IHR5cGUsbmFtZQorICBlbmQKKyAgZGVmIHR5cGUoKQorICAgIHJldHVybiBAdHlwZQorICBlbmQKKyAgZGVmIHR5cGVfbmFtZShjcHBfdHJlZSkKKyAgICByZXR1cm4gdHlwZSgpCisgIGVuZAorICBkZWYgdG9QcmludEZvcm1hdCgpCisgICAgcmV0dXJuIHByaW50Zm9ybWF0CisgIGVuZAorICBkZWYgY3JlYXRlX3VzYWdlKGNwcF90cmVlLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gQG5hbWUKKyAgICBlbmQKKyAgICAiI3tAdHlwZX0gI3t0aGlzX25hbWV9IgorICBlbmQKKyAgZGVmIHRvTmV0d29yayhvZmZzZXQsc3VpdGUsIHBhcmVudCA9ICIiLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gQG5hbWUKKyAgICBlbmQKKyAgICBzdWl0ZSA8PCBmX2NhbGwgPSBDUFA6OkZ1bmNDYWxsLmJ1aWxkKCJ0b19uZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImI3twYXJlbnR9I3t0aGlzX25hbWV9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImYnVmZmVyWyN7b2Zmc2V0fV0iKQorICAgIGZfY2FsbC5hcmdzLmRvbnRfd3JhcCA9IHRydWUKKyAgZW5kCisgIGRlZiB0b0hvc3Qob2Zmc2V0LHN1aXRlLCBwYXJlbnQgPSAiIiwgdGhpc19uYW1lPW5pbCkKKyAgICBpZiAodGhpc19uYW1lID09IG5pbCkKKyAgICAgIHRoaXNfbmFtZSA9IEBuYW1lCisgICAgZW5kCisgICAgc3VpdGUgPDwgZl9jYWxsID0gQ1BQOjpGdW5jQ2FsbC5idWlsZCgidG9faG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJmJ1ZmZlclsje29mZnNldH1dIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImI3twYXJlbnR9I3t0aGlzX25hbWV9IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZl9jYWxsLmFyZ3MuZG9udF93cmFwID0gdHJ1ZQorICBlbmQKKyAgZGVmIGdldFR5cGVJRCgpCisgICAgJzB4JyArICgoRGlnZXN0OjpTSEExLmhleGRpZ2VzdChAdHlwZSlbMC4uM10udG9faSgxNikgPDwgMTYpIHwKKyAgICAgICAgICAgIDB4MjAwMCB8ICMgbWFya3MgaXQgYXMgcHJpbWl0aXZlCisgICAgICAgICAgICBzaXplKS50b19zKDE2KQorICBlbmQKKyAgZGVmIHNpbXBsZVN0cigpCisgICAgIiN7QHR5cGV9ICN7QG5hbWV9IgorICBlbmQKKyAgZGVmIHNldF9tZXNzYWdlX2J1aWxkZXIoc3VpdGUsIHRoaXNfbmFtZT1uaWwpCisgICAgdGhpc19uYW1lIHx8PSBAbmFtZQorICAgIHN1aXRlIDw8ICJtc2dfcHRyXy0+I3t0aGlzX25hbWV9ID0gI3t0aGlzX25hbWV9IgorICBlbmQKKworICBkZWYgemVyb0NhbGwoc3VpdGUsIHBhcmVudCA9ICIiLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gQG5hbWUKKyAgICBlbmQKKyAgICBzdWl0ZSA8PCBDUFA6OkFzc2lnbi5uZXcocGFyZW50ICsgdGhpc19uYW1lLEB6ZXJvKQorICBlbmQKKyAgZGVmIGZldGNoUHJpbnRBcmdzKGFyZ3MsIHBhcmVudCA9ICIiLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gQG5hbWUKKyAgICBlbmQKKyAgICBpZiAoQHR5cGUgPT0gJ2Jvb2wnKQorICAgICAgYXJncy5wdXNoKCIje3BhcmVudH0je3RoaXNfbmFtZX0gPyAnVCcgOiAnZiciKQorICAgIGVsc2lmIChAdHlwZSA9PSAnOjphb3M6OnRpbWU6OlRpbWUnKQorICAgICAgYXJncy5wdXNoKCJBT1NfVElNRV9BUkdTKCN7cGFyZW50fSN7dGhpc19uYW1lfS5zZWMoKSwgI3twYXJlbnR9I3t0aGlzX25hbWV9Lm5zZWMoKSkiKQorICAgIGVsc2UKKyAgICAgIGFyZ3MucHVzaCgiI3twYXJlbnR9I3t0aGlzX25hbWV9IikKKyAgICBlbmQKKyAgZW5kCitlbmQKK2NsYXNzIFRhcmdldDo6TWVzc2FnZUFycmF5RWxlbWVudCA8IFRhcmdldDo6Tm9kZQorICBhdHRyX2FjY2Vzc29yIDpsb2MsIDpsZW5ndGgKKyAgZGVmIGluaXRpYWxpemUodHlwZSxsZW5ndGgpCisgICAgQHR5cGUsQGxlbmd0aCA9IHR5cGUsbGVuZ3RoCisgIGVuZAorICBkZWYgemVybygpCisgICAgcmV0dXJuIEB0eXBlLnplcm8oKQorICBlbmQKKyAgZGVmIG5hbWUoKQorICAgIHJldHVybiBAdHlwZS5uYW1lKCkKKyAgZW5kCisKKyAgZGVmIGFkZF9UeXBlUmVnaXN0ZXIoKmFyZ3MpCisgICAgaWYgQHR5cGUucmVzcG9uZF90bz8oOmFkZF9UeXBlUmVnaXN0ZXIpCisgICAgICBAdHlwZS5hZGRfVHlwZVJlZ2lzdGVyKCphcmdzKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdG9QcmludEZvcm1hdCgpCisgICAgcmV0dXJuIChbQHR5cGUudG9QcmludEZvcm1hdF0gKiBAbGVuZ3RoKS5qb2luKCIsICIpCisgIGVuZAorICBkZWYgY3JlYXRlX3VzYWdlKGNwcF90cmVlLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gbmFtZQorICAgIGVuZAorICAgIHJldHVybiAiOjpzdGQ6OmFycmF5PCAje0B0eXBlLnR5cGVfbmFtZShjcHBfdHJlZSl9LCAje0BsZW5ndGh9PiAje3RoaXNfbmFtZX0iCisgIGVuZAorICBkZWYgdHlwZSgpCisgICAgcmV0dXJuICI6OnN0ZDo6YXJyYXk8ICN7QHR5cGUudHlwZSgpfSwgI3tAbGVuZ3RofT4iCisgIGVuZAorICBkZWYgbWVtYmVyX3R5cGUoKQorICAgIHJldHVybiBAdHlwZQorICBlbmQKKyAgZGVmIHNpbXBsZVN0cigpCisgICAgcmV0dXJuICIje0B0eXBlLnR5cGV9ICN7QG5hbWV9WyN7QGxlbmd0aH1dIgorICBlbmQKKyAgZGVmIGdldFR5cGVJRCgpCisgICAgcmV0dXJuIEB0eXBlLmdldFR5cGVJRCgpCisgIGVuZAorICBkZWYgc2l6ZSgpCisgICAgcmV0dXJuIEB0eXBlLnNpemUgKiBAbGVuZ3RoCisgIGVuZAorICBkZWYgdG9OZXR3b3JrKG9mZnNldCwgc3VpdGUsIHBhcmVudD0iIiwgdGhpc19uYW1lPW5pbCkKKyAgICBpZiAodGhpc19uYW1lID09IG5pbCkKKyAgICAgIHRoaXNfbmFtZSA9IG5hbWUKKyAgICBlbmQKKyAgICBvZmZzZXQgPSAob2Zmc2V0ID09IDApID8gIiIgOiAiI3tvZmZzZXR9ICsgIgorICAgIGZvcl9sb29wX3ZhciA9IGdldEZvckxvb3BWYXIoKQorICAgIHN1aXRlIDw8IGZvcl9zdG10ID0gQ1BQOjpGb3IubmV3KCJpbnQgI3tmb3JfbG9vcF92YXJ9ID0gMCIsIiN7Zm9yX2xvb3BfdmFyfSA8ICN7QGxlbmd0aH0iLCIje2Zvcl9sb29wX3Zhcn0rKyIpCisgICAgQHR5cGUudG9OZXR3b3JrKCIje29mZnNldH0gKCN7Zm9yX2xvb3BfdmFyfSAqICN7QHR5cGUuc2l6ZX0pIiwgZm9yX3N0bXQuc3VpdGUsIHBhcmVudCwgIiN7dGhpc19uYW1lfVsje2Zvcl9sb29wX3Zhcn1dIikKKyAgZW5kCisgIGRlZiB0b0hvc3Qob2Zmc2V0LCBzdWl0ZSwgcGFyZW50PSIiLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gbmFtZQorICAgIGVuZAorICAgIG9mZnNldCA9IChvZmZzZXQgPT0gMCkgPyAiIiA6ICIje29mZnNldH0gKyAiCisgICAgZm9yX2xvb3BfdmFyID0gZ2V0Rm9yTG9vcFZhcigpCisgICAgc3VpdGUgPDwgZm9yX3N0bXQgPSBDUFA6OkZvci5uZXcoImludCAje2Zvcl9sb29wX3Zhcn0gPSAwIiwiI3tmb3JfbG9vcF92YXJ9IDwgI3tAbGVuZ3RofSIsIiN7Zm9yX2xvb3BfdmFyfSsrIikKKyAgICBAdHlwZS50b0hvc3QoIiN7b2Zmc2V0fSAoI3tmb3JfbG9vcF92YXJ9ICogI3tAdHlwZS5zaXplfSkiLCBmb3Jfc3RtdC5zdWl0ZSwgcGFyZW50LCAiI3t0aGlzX25hbWV9WyN7Zm9yX2xvb3BfdmFyfV0iKQorICBlbmQKKyAgZGVmIHNldF9tZXNzYWdlX2J1aWxkZXIoc3VpdGUsIHRoaXNfbmFtZT1uaWwpCisgICAgaWYgKHRoaXNfbmFtZSA9PSBuaWwpCisgICAgICB0aGlzX25hbWUgPSBuYW1lCisgICAgZW5kCisKKyAgICBmb3JfbG9vcF92YXIgPSBnZXRGb3JMb29wVmFyKCkKKyAgICBzdWl0ZSA8PCBmb3Jfc3RtdCA9IENQUDo6Rm9yLm5ldygiaW50ICN7Zm9yX2xvb3BfdmFyfSA9IDAiLCIje2Zvcl9sb29wX3Zhcn0gPCAje0BsZW5ndGh9IiwiI3tmb3JfbG9vcF92YXJ9KysiKQorICAgIEB0eXBlLnNldF9tZXNzYWdlX2J1aWxkZXIoZm9yX3N0bXQuc3VpdGUsICIje3RoaXNfbmFtZX1bI3tmb3JfbG9vcF92YXJ9XSIpCisgIGVuZAorICBkZWYgemVyb0NhbGwoc3VpdGUsIHBhcmVudD0iIiwgdGhpc19uYW1lPW5pbCkKKyAgICBpZiAodGhpc19uYW1lID09IG5pbCkKKyAgICAgIHRoaXNfbmFtZSA9IG5hbWUKKyAgICBlbmQKKworICAgIG9mZnNldCA9IChvZmZzZXQgPT0gMCkgPyAiIiA6ICIje29mZnNldH0gKyAiCisgICAgZm9yX2xvb3BfdmFyID0gZ2V0Rm9yTG9vcFZhcigpCisgICAgc3VpdGUgPDwgZm9yX3N0bXQgPSBDUFA6OkZvci5uZXcoImludCAje2Zvcl9sb29wX3Zhcn0gPSAwIiwiI3tmb3JfbG9vcF92YXJ9IDwgI3tAbGVuZ3RofSIsIiN7Zm9yX2xvb3BfdmFyfSsrIikKKyAgICBAdHlwZS56ZXJvQ2FsbChmb3Jfc3RtdC5zdWl0ZSwgcGFyZW50LCAiI3t0aGlzX25hbWV9WyN7Zm9yX2xvb3BfdmFyfV0iKQorICBlbmQKKyAgZGVmIGZldGNoUHJpbnRBcmdzKGFyZ3MsIHBhcmVudCA9ICIiLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gbmFtZQorICAgIGVuZAorICAgIGZvciBpIGluIDAuLihAbGVuZ3RoLTEpCisgICAgICBAdHlwZS5mZXRjaFByaW50QXJncyhhcmdzLCBwYXJlbnQsICIje3RoaXNfbmFtZX1bI3tpfV0iKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9vdXRwdXQvcV9maWxlLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9vdXRwdXQvcV9maWxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MWJkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL291dHB1dC9xX2ZpbGUucmIKQEAgLTAsMCArMSwxOTggQEAKK2JlZ2luCisgIHJlcXVpcmUgInNoYTEiCityZXNjdWUgTG9hZEVycm9yCisgIHJlcXVpcmUgImRpZ2VzdC9zaGExIgorZW5kCisKKyRpID0gMAorZGVmIGdldEZvckxvb3BWYXIoKQorICAkaSA9ICRpICsgMQorICByZXR1cm4gIl9hdXRvZ2VuX2luZGV4XyN7JGl9IgorZW5kCisKK21vZHVsZSBUYXJnZXQKK2VuZAorY2xhc3MgVGFyZ2V0OjpOb2RlCisJYXR0cl9hY2Nlc3NvciA6Y3JlYXRlZF9ieQorCWRlZiBnZXRfbmFtZSgpCisJCWlmKEBwYXJlbnQpCisJCQlyZXR1cm4gIiN7QHBhcmVudC5nZXRfbmFtZX0uI3tAbmFtZX0iCisJCWVsc2UKKwkJCXJldHVybiAiI3tAbmFtZX0iCisJCWVuZCAKKwllbmQKK2VuZAorY2xhc3MgVGFyZ2V0OjpRRmlsZSA8IFRhcmdldDo6Tm9kZQorCWRlZiBpbml0aWFsaXplKCkgI25lZWRzIHRvIGtub3cgcmVwb19wYXRoLCAKKwkJQGNsYXNzX3R5cGVzID0gW10KKwllbmQKKwlkZWYgYWRkX3R5cGUodHlwZSkKKwkJQGNsYXNzX3R5cGVzIDw8IHR5cGUKKwllbmQKKwlkZWYgZXh0ZXJuPSh2YWx1ZSkKKwkJQGNsYXNzX3R5cGVzLmVhY2ggZG8gfHR5cGV8CisJCQl0eXBlLmV4dGVybj12YWx1ZQorCQllbmQKKwllbmQKKwlkZWYgbWFrZV9jcHBfdHJlZShyZWxfcGF0aCkKKwkJY3BwX3RyZWUgPSBEZXBGaWxlUGFpci5uZXcocmVsX3BhdGgpCisJCWNwcF90cmVlLmFkZF9oZWFkZXJfaW5jbHVkZSgiPGFycmF5PiIpCisJCWNwcF90cmVlLmFkZF9oZWFkZXJfaW5jbHVkZSgiXCJhb3MvY29tbW9uL21hY3Jvcy5oXCIiKQorCQljcHBfdHJlZS5hZGRfaGVhZGVyX2luY2x1ZGUoIlwiYW9zL2NvbW1vbi9xdWV1ZS5oXCIiKQorCQlAY2xhc3NfdHlwZXMuZWFjaCBkbyB8dHlwZXwKKwkJCWNwcF90cmVlLmdldCh0eXBlKQorCQllbmQKKwkJcmV0dXJuIGNwcF90cmVlCisJZW5kCitlbmQKK2NsYXNzIFRhcmdldDo6UUluY2x1ZGUgPCBUYXJnZXQ6Ok5vZGUKKwlkZWYgaW5pdGlhbGl6ZShwYXRoKQorCQlAcGF0aCA9IHBhdGgKKwllbmQKKwlkZWYgY3JlYXRlKGNwcF90cmVlKQorIwkJaW5jID0gY3BwX3RyZWUuaGVhZGVyLmFkZF9pbmNsdWRlKCJcIiN7QHBhdGh9XCIiKQorCQlpbmMgPSBjcHBfdHJlZS5hZGRfaGVhZGVyX2luY2x1ZGUoIlwiI3tAcGF0aH1cIiIpCisJCWNwcF90cmVlLnNldChzZWxmLGluYykKKwllbmQKK2VuZAorY2xhc3MgVGFyZ2V0OjpRdWV1ZUdyb3VwRGVjIDwgVGFyZ2V0OjpOb2RlCisJYXR0cl9hY2Nlc3NvciA6bmFtZSw6bG9jLDpwYXJlbnQsOnF1ZXVlcworCWRlZiBpbml0aWFsaXplKG5hbWUpCisJCUBuYW1lID0gbmFtZQorCQlAcXVldWVzID0gW10KKwkJQHN1YnMgPSB7fQorCWVuZAorCWRlZiByb290KCkKKwkJQHBhcmVudC5yb290KCkKKwllbmQKKwlkZWYgW109KGtleSx2YWwpCisJCSNwdXRzICIje2tleX09ICN7dmFsfSIKKwkJQHN1YnNba2V5XSA9IHZhbAorCWVuZAorCWRlZiBleHRlcm49KHZhbHVlKQorCQlAZXh0ZXJuPXZhbHVlCisJZW5kCisJZGVmIGdldF9uYW1lKCkKKwkJaWYoQHBhcmVudCkKKwkJCXJldHVybiAiI3tAcGFyZW50LmdldF9uYW1lfS4je0BuYW1lfSIKKwkJZWxzZQorCQkJcmV0dXJuICIje0BuYW1lfSIKKwkJZW5kIAorCWVuZAorCWRlZiB0b19jcHBfaWQoaWQpCisJCW5hbWUgPSAiI3tAbmFtZX06OiN7aWR9IgorCQlyZXR1cm4gQHBhcmVudC50b19jcHBfaWQobmFtZSkgaWYoQHBhcmVudCkKKwkJcmV0dXJuIG5hbWUKKwllbmQKKwlkZWYgW10oa2V5KQorCQkjcHV0cyAiI3trZXl9IgorCQlAc3Vic1trZXldCisJZW5kCisJZGVmIGFkZF9xdWV1ZShxdWV1ZSkKKwkJQHF1ZXVlcy5wdXNoKHF1ZXVlKQorCWVuZAorCWRlZiBoYXNoX3dpdGhfbmFtZShuYW1lKQorCQl0cyA9IChAcXVldWVzLmNvbGxlY3QgeyB8cXVldWV8CisJCQlxdWV1ZS5tc2dfaGFzaCgpCisJCX0pLmpvaW4oIiIpICsgbmFtZQorCQlyZXR1cm4gIjB4I3tEaWdlc3Q6OlNIQTEuaGV4ZGlnZXN0KHRzKVstOC4uLTFdfSIKKwllbmQKKwlkZWYgY3JlYXRlKGNwcF90cmVlKQorCQlyZXR1cm4gaWYoQGV4dGVybikKKwkJbmFtZXNwYWNlID0gY3BwX3RyZWUuZ2V0KEBsb2MpCisJCXR5cGVfY2xhc3MgPSBUeXBlczo6Q2xhc3MubmV3KG5hbWVzcGFjZSxAbmFtZSkKKwkJY3BwX3RyZWUuc2V0KHNlbGYsdHlwZV9jbGFzcykgICNicmVha3MgaW5maW5pdGUgcmVjdXJzaW9uCisJCXR5cGVfY2xhc3Muc2V0X3BhcmVudCgicHVibGljIDo6YW9zOjpRdWV1ZUdyb3VwIikKKwkJQHF1ZXVlcy5lYWNoIGRvIHxxdWV1ZXwKKwkJCXR5cGVfY2xhc3MuYWRkX21lbWJlcig6cHVibGljLHF1ZXVlLmNyZWF0ZV91c2FnZShjcHBfdHJlZSkpCisJCWVuZAorCQljcmVhdGVfQ29uc3RydWN0b3IodHlwZV9jbGFzcyxjcHBfdHJlZSkKKwkJbmFtZXNwYWNlLmFkZCh0eXBlX2NsYXNzKQorCWVuZAorCWRlZiBjcmVhdGVfQ29uc3RydWN0b3IodHlwZV9jbGFzcyxjcHBfdHJlZSkKKwkJbWVtYmVyX2Z1bmMgPSBDUFA6OkNvbnN0cnVjdG9yLm5ldyh0eXBlX2NsYXNzKQorCQl0eXBlX2NsYXNzLmFkZF9tZW1iZXIoOnB1YmxpYyxtZW1iZXJfZnVuYykKKwkJI2NwcF90cmVlLmNjX2ZpbGUuYWRkX2Z1bmN0KG1lbWJlcl9mdW5jKQorCQltZW1iZXJfZnVuYy5hcmdzIDw8ICJjb25zdCBjaGFyICpuYW1lIjsKKwkJbWVtYmVyX2Z1bmMuYXJncyA8PCAidWludDMyX3QgaGFzaCI7CisJCW1lbWJlcl9mdW5jLmFkZF9jb25zKCI6OmFvczo6UXVldWVHcm91cCIsIm5hbWUiLCAiaGFzaCIpCisJCUBxdWV1ZXMuZWFjaCBkbyB8cXVldWV8CisJCQltZW1iZXJfZnVuYy5hcmdzIDw8ICJjb25zdCBjaGFyICoje3F1ZXVlLm5hbWV9X25hbWUiOworCQkJbWVtYmVyX2Z1bmMuYWRkX2NvbnMocXVldWUubmFtZSwiI3txdWV1ZS5uYW1lfV9uYW1lIikKKwkJZW5kCisJZW5kCitlbmQKK2NsYXNzIFRhcmdldDo6UXVldWVHcm91cCA8IFRhcmdldDo6Tm9kZQorCWF0dHJfYWNjZXNzb3IgOm5hbWUsOmxvYworCWRlZiBpbml0aWFsaXplKHR5cGUsbmFtZSkKKwkJQHR5cGUsQG5hbWUgPSB0eXBlLG5hbWUKKwllbmQKKwlkZWYgdHlwZV9uYW1lKCkKKwkJaWYoQHR5cGUubG9jID09IEBsb2MpICN1c2UgcmVsYXRpdmUgbmFtZQorCQkJcmV0dXJuIEB0eXBlLm5hbWUKKwkJZWxzZSAjdXNlIGZ1bGwgbmFtZQorCQkJcmV0dXJuIEB0eXBlLmxvYy50b19jcHBfaWQoQHR5cGUubmFtZSkKKwkJZW5kIAorCWVuZAorCWRlZiBjcmVhdGUoY3BwX3RyZWUpCisJCW5hbWVzcGFjZSA9IGNwcF90cmVlLmdldChAbG9jKQorCQl0eXBlID0gY3BwX3RyZWUuZ2V0KEB0eXBlKQorCQljcHBfdHJlZS5zZXQoc2VsZixzZWxmKQorCQluYW1lc3BhY2UuYWRkX2NjKCJzdGF0aWMgI3t0eXBlX25hbWV9ICoje0BuYW1lfV9wdHIiKQorCQljb3VudGVyID0gIiN7QG5hbWV9X2NvdW50ZXIiCisJCW5hbWVzcGFjZS5hZGRfY2MoInN0YXRpYyBpbnQgI3tjb3VudGVyfSIpCisKKwkJc3RyID0gPDxDT01NRU5UX0VORAorU2Nod2FyeiBjb3VudGVyIHRvIGNvbnN0cnVjdCBhbmQgZGVzdHJ1Y3QgdGhlICN7QG5hbWV9IG9iamVjdC4KK011c3QgYmUgY29uc3RydWN0ZWQgYmVmb3JlICYje0BuYW1lfSBpcyBjb25zdHJ1Y3RlZCBzbyB0aGF0ICN7QG5hbWV9X3B0cgoraXMgdmFsaWQgc28gd2UgY2FuIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QuCitDT01NRU5UX0VORAorCQlzdHIuc3BsaXQoL1xuLykuZWFjaCBkbyB8c3RyX3NlY3wKKwkJCW5hbWVzcGFjZS5jbGFzc19jb21tZW50KHN0cl9zZWMpCisJCWVuZAorCQlpbml0X2NsYXNzID0gbmFtZXNwYWNlLmFkZF9jbGFzcygiSW5pdGlhbGl6ZXJGb3JfIiArIEBuYW1lKS5hZGRfZGVwKHR5cGUpCisJCQorCisJCWluaXRfY2xhc3MuYWRkX2NjX2NvbW1lbnQoCisgICAgICAgICJUaGUgY291bnRlciBpcyBpbml0aWFsaXplZCBhdCBsb2FkLXRpbWUsIGkuZS4sIGJlZm9yZSBhbnkgb2YgdGhlIHN0YXRpYyIsCisJCSJvYmplY3RzIGFyZSBpbml0aWFsaXplZC4iKQorCisKKwkJY29ucyA9IENQUDo6Q29uc3RydWN0b3IubmV3KGluaXRfY2xhc3MpCisJCWluaXRfY2xhc3MuYWRkX21lbWJlcig6cHVibGljLGNvbnMpCisJCWNvbnMuc3VpdGUgPDwgaWZfc3RtdCA9IENQUDo6SWYubmV3KCIwID09ICN7Y291bnRlcn0rKyIpCisKKwkJY29uc19jYWxsID0gQ1BQOjpGdW5jQ2FsbC5uZXcoIm5ldyAje3R5cGVfbmFtZX0iKQorCQljb25zX2NhbGwuYXJncy5wdXNoKEBsb2MucXVldWVfbmFtZShAbmFtZSkuaW5zcGVjdCkKKworCQljb25zX2NhbGwuYXJncy5wdXNoKEB0eXBlLmhhc2hfd2l0aF9uYW1lKEBsb2MucXVldWVfbmFtZShAbmFtZSkuaW5zcGVjdCkpCisJCUB0eXBlLnF1ZXVlcy5jb2xsZWN0IGRvIHxxdWV1ZXwKKwkJCWNvbnNfY2FsbC5hcmdzLnB1c2goQGxvYy5xdWV1ZV9uYW1lKEBuYW1lICsgIi4iICsgcXVldWUubmFtZSkuaW5zcGVjdCkKKwkJZW5kCisJCWlmX3N0bXQuc3VpdGUgPDwgQ1BQOjpBc3NpZ24ubmV3KCIje0BuYW1lfV9wdHIiLGNvbnNfY2FsbCkKKworCisJCWRlc3RydWN0ID0gQ1BQOjpEZXN0cnVjdG9yLm5ldyhpbml0X2NsYXNzKQorCQlkZXN0cnVjdC5zdWl0ZSA8PCBpZl9zdG10ID0gQ1BQOjpJZi5uZXcoIjAgPT0gLS0je2NvdW50ZXJ9IikKKwkJaWZfc3RtdC5zdWl0ZSA8PCAiZGVsZXRlICN7QG5hbWV9X3B0ciIKKwkJaWZfc3RtdC5zdWl0ZSA8PCBDUFA6OkFzc2lnbi5uZXcoIiN7QG5hbWV9X3B0ciIsIk5VTEwiKQorCisJCWluaXRfY2xhc3MuYWRkX21lbWJlcig6cHVibGljLGRlc3RydWN0KQorCQlpbml0X2NsYXNzLnN0YXRpYyA9IHRydWUKKwkJaW5pdF9jbGFzcy5kZWMgPSBAbmFtZSArICJfaW5pdGlhbGl6ZXIiOworCisJCXN0ciA9IDw8Q09NTUVOVF9FTkQKK0NyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgbmV3IG9iamVjdCBpbiB0aGUgcG9pbnRlci4gIFNpbmNlIHdlIGhhdmUgYWxyZWFkeQorY3JlYXRlZCB0aGUgaW5pdGlhbGl6ZXIKK0NPTU1FTlRfRU5ECisJCXN0ci5zcGxpdCgvXG4vKS5tYXB7fHN0cl9zZWN8IENQUDo6Q29tbWVudC5uZXcoc3RyX3NlYyl9LmVhY2ggZG8gfGNvbW1lbnR8CisgICAgICBuYW1lc3BhY2UuYWRkKGNvbW1lbnQpCisgICAgZW5kCisJCW5hbWVzcGFjZS5hZGQoInN0YXRpYyBVTlVTRURfVkFSSUFCTEUgI3t0eXBlX25hbWV9ICYje0BuYW1lfSIgKworICAgICAgICAgICAgICAgICAgIiA9ICN7QG5hbWV9X2luaXRpYWxpemVyLmdldCgpIikKKworCQlnZXQgPSBpbml0X2NsYXNzLmRlZl9mdW5jKHR5cGVfbmFtZSwiZ2V0IikgIy5hZGRfZGVwKHR5cGUpCisJCWdldC5wcmVfZnVuY190eXBlcyA9ICImIgorCQlnZXQuc3VpdGUgPDwgQ1BQOjpSZXR1cm4ubmV3KCIqI3tAbmFtZX1fcHRyIikKKwllbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9vdXRwdXQvcV9zdHJ1Y3QucmIgYi9hb3MvYnVpbGQvcXVldWVzL291dHB1dC9xX3N0cnVjdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTM4YmIzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL3F1ZXVlcy9vdXRwdXQvcV9zdHJ1Y3QucmIKQEAgLTAsMCArMSwxNTYgQEAKK2NsYXNzIFRhcmdldDo6U3RydWN0RGVjIDwgVGFyZ2V0OjpTdHJ1Y3RCYXNlCisgIGF0dHJfYWNjZXNzb3IgOm5hbWUsOmxvYyw6cGFyZW50LCA6ZXh0ZXJuCisgIGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgQG5hbWUgPSBuYW1lCisgICAgQG1lbWJlcnMgPSBbXQorICBlbmQKKyAgZGVmIGFkZF9tZW1iZXIobWVtYmVyKQorICAgIEBtZW1iZXJzIDw8IG1lbWJlcgorICBlbmQKKyAgZGVmIGNyZWF0ZV9HZXRUeXBlKHR5cGVfY2xhc3MsIGNwcF90cmVlKQorICAgIG1lbWJlcl9mdW5jID0gQ1BQOjpNZW1iZXJGdW5jLm5ldyh0eXBlX2NsYXNzLCJjb25zdCA6OmFvczo6TWVzc2FnZVR5cGUqIiwiR2V0VHlwZSIpCisgICAgdHlwZV9jbGFzcy5hZGRfbWVtYmVyKG1lbWJlcl9mdW5jKQorICAgIG1lbWJlcl9mdW5jLnN0YXRpYyA9IHRydWUKKyAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCAic3RhdGljIDo6YW9zOjpPbmNlPGNvbnN0IDo6YW9zOjpNZXNzYWdlVHlwZT4gZ2V0dGVyKCN7dHlwZV9jbGFzcy5uYW1lfTo6RG9HZXRUeXBlKSIKKyAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCBDUFA6OlJldHVybi5uZXcoImdldHRlci5HZXQoKSIpCisgIGVuZAorICBkZWYgY3JlYXRlKGNwcF90cmVlKQorICAgIHJldHVybiBzZWxmIGlmKEBleHRlcm4pCisgICAgb3JpZ19uYW1lc3BhY2UgPSBuYW1lc3BhY2UgPSBjcHBfdHJlZS5nZXQoQGxvYykKKyAgICBuYW1lID0gIiIKKyAgICBpZihuYW1lc3BhY2UuY2xhc3MgPCBUeXBlczo6VHlwZSkgI2lzIG5lc3RlZAorICAgICAgbmFtZSA9IG5hbWVzcGFjZS5uYW1lICsgIl8iICsgbmFtZQorICAgICAgbmFtZXNwYWNlID0gbmFtZXNwYWNlLnNwYWNlCisgICAgZW5kCisgICAgdHlwZV9jbGFzcyA9IG5hbWVzcGFjZS5hZGRfc3RydWN0KG5hbWUgKyBAbmFtZSkKKworICAgIEBtZW1iZXJzLmVhY2ggZG8gfGVsZW18CisgICAgICB0eXBlX2NsYXNzLmFkZF9tZW1iZXIoZWxlbS5jcmVhdGVfdXNhZ2UoY3BwX3RyZWUpKQorICAgIGVuZAorICAgIGNyZWF0ZV9Eb0dldFR5cGUodHlwZV9jbGFzcywgY3BwX3RyZWUpCisgICAgY3JlYXRlX0dldFR5cGUodHlwZV9jbGFzcywgY3BwX3RyZWUpCisgICAgY3JlYXRlX0RlZmF1bHRDb25zdHJ1Y3Rvcih0eXBlX2NsYXNzLCBjcHBfdHJlZSkKKyAgICBjcmVhdGVfSW5PcmRlckNvbnN0cnVjdG9yKHR5cGVfY2xhc3MsIGNwcF90cmVlKQorICAgIGNyZWF0ZV9aZXJvKHR5cGVfY2xhc3MsIGNwcF90cmVlKQorICAgIGNyZWF0ZV9TaXplKHR5cGVfY2xhc3MsIGNwcF90cmVlKQorICAgIGNyZWF0ZV9TZXJpYWxpemUodHlwZV9jbGFzcywgY3BwX3RyZWUpCisgICAgY3JlYXRlX0Rlc2VyaWFsaXplKHR5cGVfY2xhc3MsIGNwcF90cmVlKQorICAgIGNyZWF0ZV9FcXVhbHNOb1RpbWUodHlwZV9jbGFzcywgY3BwX3RyZWUpCisgICAgcmV0dXJuIHR5cGVfY2xhc3MKKyAgZW5kCisgIGRlZiBnZXRQcmludEZvcm1hdCgpCisgICAgcmV0dXJuICJ7IiArIEBtZW1iZXJzLmNvbGxlY3QgeyB8ZWxlbXwgZWxlbS50b1ByaW50Rm9ybWF0KCkgfS5qb2luKCIsICIpICsgIn0iCisgIGVuZAorICBkZWYgZmV0Y2hQcmludEFyZ3MoYXJncywgcGFyZW50ID0gIiIpCisgICAgQG1lbWJlcnMuZWFjaCBkbyB8ZWxlbXwKKyAgICAgIGVsZW0uZmV0Y2hQcmludEFyZ3MoYXJncywgcGFyZW50KQorICAgIGVuZAorICBlbmQKKyAgZGVmIHRvSG9zdChvZmZzZXQsIHN1aXRlLCBwYXJlbnQpCisgICAgQG1lbWJlcnMuZWFjaCBkbyB8ZWxlbXwKKyAgICAgIGVsZW0udG9Ib3N0KG9mZnNldCwgc3VpdGUsIHBhcmVudCkKKyAgICAgIG9mZnNldCArPSAiICsgI3tlbGVtLnNpemUoKX0iCisgICAgZW5kCisgIGVuZAorICBkZWYgdG9OZXR3b3JrKG9mZnNldCwgc3VpdGUsIHBhcmVudCkKKyAgICBAbWVtYmVycy5lYWNoIGRvIHxlbGVtfAorICAgICAgZWxlbS50b05ldHdvcmsob2Zmc2V0LCBzdWl0ZSwgcGFyZW50KQorICAgICAgb2Zmc2V0ICs9ICIgKyAje2VsZW0uc2l6ZSgpfSIKKyAgICBlbmQKKyAgZW5kCisgIGRlZiB6ZXJvQ2FsbChzdWl0ZSwgcGFyZW50KQorICAgIEBtZW1iZXJzLmVhY2ggZG8gfGVsZW18CisgICAgICBlbGVtLnplcm9DYWxsKHN1aXRlLCBwYXJlbnQpCisgICAgZW5kCisgIGVuZAorZW5kCitjbGFzcyBUYXJnZXQ6Ok1lc3NhZ2VTdHJ1Y3RFbGVtZW50IDwgVGFyZ2V0OjpOb2RlCisgIGF0dHJfYWNjZXNzb3IgOm5hbWUsOmxvYworICBkZWYgaW5pdGlhbGl6ZSh0eXBlLG5hbWUpCisgICAgQHR5cGUsIEBuYW1lID0gdHlwZSwgbmFtZQorICBlbmQKKyAgZGVmIHR5cGUoKQorICAgIHJldHVybiBAdHlwZS5nZXRfbmFtZQorICBlbmQKKyAgZGVmIGNyZWF0ZV9FcXVhbHNOb1RpbWUodHlwZV9jbGFzcyxjcHBfdHJlZSkKKyAgICBtZW1iZXJfZnVuYyA9IENQUDo6TWVtYmVyRnVuYy5uZXcodHlwZV9jbGFzcywiYm9vbCIsIkVxdWFsc05vVGltZSIpCisgICAgbWVtYmVyX2Z1bmMuY29uc3QgPSB0cnVlCisgICAgdHlwZV9jbGFzcy5hZGRfbWVtYmVyKG1lbWJlcl9mdW5jKQorICAgIG1lbWJlcl9mdW5jLmFyZ3MgPDwgImNvbnN0ICN7dHlwZV9jbGFzcy5uYW1lfSAmb3RoZXIiCisgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgImlmICghI3t0eXBlX2NsYXNzLnBhcmVudF9jbGFzc306OkVxdWFsc05vVGltZShvdGhlcikpIHJldHVybiBmYWxzZTsiIGlmIHR5cGVfY2xhc3MucGFyZW50X2NsYXNzCisgICAgQG1lbWJlcnMuZWFjaCBkbyB8ZWxlbXwKKyAgICAgIGlmIGVsZW0ucmVzcG9uZF90bz8gOmNyZWF0ZV9FcXVhbHNOb1RpbWUKKyAgICAgICAgbWVtYmVyX2Z1bmMuc3VpdGUgPDwgImlmICghb3RoZXIuI3tlbGVtLm5hbWV9LkVxdWFsc05vVGltZSgje2VsZW0ubmFtZX0pKSByZXR1cm4gZmFsc2U7IgorICAgICAgZWxzaWYgZWxlbS5yZXNwb25kX3RvPyg6bGVuZ3RoKSAmJiBlbGVtLm1lbWJlcl90eXBlLnJlc3BvbmRfdG8/KDpjcmVhdGVfRXF1YWxzTm9UaW1lKQorICAgICAgICAwLnVwdG8oZWxlbS5sZW5ndGggLSAxKSBkbyB8aXwKKyAgICAgICAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCAiaWYgKCFvdGhlci4je2VsZW0ubmFtZX1bI3tpfV0uRXF1YWxzTm9UaW1lKCN7ZWxlbS5uYW1lfVsje2l9XSkpIHJldHVybiBmYWxzZTsiCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCAiaWYgKG90aGVyLiN7ZWxlbS5uYW1lfSAhPSAje2VsZW0ubmFtZX0pIHJldHVybiBmYWxzZTsiCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBtZW1iZXJfZnVuYy5zdWl0ZSA8PCBDUFA6OlJldHVybi5uZXcoJ3RydWUnKQorICBlbmQKKyAgZGVmIHR5cGVfbmFtZShjcHBfdHJlZSkKKyAgICB0eXBlID0gY3BwX3RyZWUuZ2V0KEB0eXBlKQorICAgIGlmKEB0eXBlLmxvYyA9PSBAbG9jKSAjdXNlIHJlbGF0aXZlIG5hbWUKKyAgICAgIHJldHVybiB0eXBlLm5hbWUKKyAgICBlbHNlICN1c2UgZnVsbCBuYW1lCisgICAgICByZXR1cm4gQHR5cGUubG9jLnRvX2NwcF9pZCh0eXBlLm5hbWUpCisgICAgZW5kIAorICBlbmQKKyAgZGVmIHNpemUoKQorICAgIHJldHVybiBAdHlwZS5zaXplKCkKKyAgZW5kCisgIGRlZiB0b1ByaW50Rm9ybWF0KCkKKyAgICBAdHlwZS5nZXRQcmludEZvcm1hdCgpCisgIGVuZAorICBkZWYgY3JlYXRlX3VzYWdlKGNwcF90cmVlLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gQG5hbWUKKyAgICBlbmQKKyAgICByZXR1cm4gIiN7dHlwZV9uYW1lKGNwcF90cmVlKX0gI3t0aGlzX25hbWV9IgorICBlbmQKKyAgZGVmIGFkZF9UeXBlUmVnaXN0ZXIoY3BwX3RyZWUsIG9fdHlwZSwgbWVtYmVyX2Z1bmMpCisgICAgdHlwZSA9IGNwcF90cmVlLmdldChAdHlwZSkKKyAgICB0TmFtZSA9IEB0eXBlLmxvYy50b19jcHBfaWQodHlwZS5uYW1lKQorICAgIG1lbWJlcl9mdW5jLnN1aXRlIDw8ICIje3ROYW1lfTo6R2V0VHlwZSgpIgorICBlbmQKKyAgZGVmIGZldGNoUHJpbnRBcmdzKGFyZ3MsIHBhcmVudCA9ICIiLCB0aGlzX25hbWU9bmlsKQorICAgIGlmICh0aGlzX25hbWUgPT0gbmlsKQorICAgICAgdGhpc19uYW1lID0gQG5hbWUKKyAgICBlbmQKKyAgICBAdHlwZS5mZXRjaFByaW50QXJncyhhcmdzLCBwYXJlbnQgKyAiI3t0aGlzX25hbWV9LiIpCisgIGVuZAorICBkZWYgdG9OZXR3b3JrKG9mZnNldCxzdWl0ZSwgcGFyZW50ID0gIiIsIHRoaXNfbmFtZT1uaWwpCisgICAgaWYgKHRoaXNfbmFtZSA9PSBuaWwpCisgICAgICB0aGlzX25hbWUgPSBAbmFtZQorICAgIGVuZAorICAgIEB0eXBlLnRvTmV0d29yayhvZmZzZXQsIHN1aXRlLCBwYXJlbnQgKyAiI3t0aGlzX25hbWV9LiIpCisgIGVuZAorICBkZWYgdG9Ib3N0KG9mZnNldCxzdWl0ZSwgcGFyZW50ID0gIiIsIHRoaXNfbmFtZT1uaWwpCisgICAgaWYgKHRoaXNfbmFtZSA9PSBuaWwpCisgICAgICB0aGlzX25hbWUgPSBAbmFtZQorICAgIGVuZAorICAgIEB0eXBlLnRvSG9zdChvZmZzZXQsIHN1aXRlLCBwYXJlbnQgKyAiI3t0aGlzX25hbWV9LiIpCisgIGVuZAorICBkZWYgc2V0X21lc3NhZ2VfYnVpbGRlcihzdWl0ZSwgdGhpc19uYW1lPW5pbCkKKyAgICBpZiAodGhpc19uYW1lID09IG5pbCkKKyAgICAgIHRoaXNfbmFtZSA9IEBuYW1lCisgICAgZW5kCisgICAgc3VpdGUgPDwgIm1zZ19wdHJfLT4je3RoaXNfbmFtZX0gPSAje3RoaXNfbmFtZX0iCisgIGVuZAorCisgIGRlZiB6ZXJvQ2FsbChzdWl0ZSwgcGFyZW50ID0gIiIsIHRoaXNfbmFtZT1uaWwpCisgICAgaWYgKHRoaXNfbmFtZSA9PSBuaWwpCisgICAgICB0aGlzX25hbWUgPSBAbmFtZQorICAgIGVuZAorICAgIEB0eXBlLnplcm9DYWxsKHN1aXRlLCBwYXJlbnQgKyAiI3t0aGlzX25hbWV9LiIpCisgIGVuZAorICBkZWYgc2ltcGxlU3RyKCkKKyAgICAiI3tAdHlwZS5zaW1wbGVTdHIoKX0gI3tAbmFtZX0iCisgIGVuZAorICBkZWYgZ2V0VHlwZUlEKCkKKyAgICByZXR1cm4gQHR5cGUuZ2V0VHlwZUlEKCkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9xdWV1ZXMvb3V0cHV0L3F1ZXVlX2RlYy5yYiBiL2Fvcy9idWlsZC9xdWV1ZXMvb3V0cHV0L3F1ZXVlX2RlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFjMDMzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL3F1ZXVlcy9vdXRwdXQvcXVldWVfZGVjLnJiCkBAIC0wLDAgKzEsODkgQEAKK2NsYXNzIFRhcmdldDo6UXVldWVEZWMgPCBUYXJnZXQ6Ok5vZGUKKwlhdHRyX2FjY2Vzc29yIDpuYW1lLDpsb2MKKwlkZWYgaW5pdGlhbGl6ZSh0eXBlLG5hbWUpCisJCUB0eXBlLEBuYW1lID0gdHlwZSxuYW1lCisJZW5kCisJZGVmIG1zZ19oYXNoKCkKKwkJcmV0dXJuIEB0eXBlLm1zZ19oYXNoCisJZW5kCisJZGVmIGZ1bGxfbWVzc2FnZV9uYW1lKGNwcF90cmVlKQorCQl0eXBlID0gY3BwX3RyZWUuZ2V0KEB0eXBlKQorCQlyZXR1cm4gQHR5cGUubG9jLnRvX2NwcF9pZCh0eXBlLm5hbWUpCisJZW5kCisJZGVmIGZ1bGxfYnVpbGRlcl9uYW1lKGNwcF90cmVlKQorCQlyZXR1cm4gIjo6YW9zOjpNZXNzYWdlQnVpbGRlcjwgI3tmdWxsX21lc3NhZ2VfbmFtZShjcHBfdHJlZSl9PiIKKwllbmQKKwlkZWYgZnVsbF90eXBlX25hbWUoY3BwX3RyZWUpCisJCXJldHVybiAiOjphb3M6OlF1ZXVlPCAje2Z1bGxfbWVzc2FnZV9uYW1lKGNwcF90cmVlKX0+IgorCWVuZAorCWRlZiB0eXBlX25hbWUoY3BwX3RyZWUscXVldWVfdHlwZSA9ICI6OmFvczo6UXVldWUiKQorCQl0eXBlID0gY3BwX3RyZWUuZ2V0KEB0eXBlKQorCQlpZihAdHlwZS5sb2MgPT0gQGxvYykgI3VzZSByZWxhdGl2ZSBuYW1lCisJCQlyZXR1cm4gIiN7cXVldWVfdHlwZX08I3t0eXBlLm5hbWV9PiIKKwkJZWxzZSAjdXNlIGZ1bGwgbmFtZQorCQkJcmV0dXJuICIje3F1ZXVlX3R5cGV9PCAje0B0eXBlLmxvYy50b19jcHBfaWQodHlwZS5uYW1lKX0+IgorCQllbmQKKwllbmQKKwlkZWYgY3JlYXRlX3VzYWdlKGNwcF90cmVlKQorCQkiI3t0eXBlX25hbWUoY3BwX3RyZWUpfSAje0BuYW1lfSIKKwllbmQKKwlkZWYgY3JlYXRlKGNwcF90cmVlKQorCQluYW1lc3BhY2UgPSBjcHBfdHJlZS5nZXQoQGxvYykKKwkJdHlwZSA9IGNwcF90cmVlLmdldChAdHlwZSkKKwkJY3BwX3RyZWUuc2V0KHNlbGYsc2VsZikKKwkJdHlwZV9uYW1lID0gdHlwZV9uYW1lKGNwcF90cmVlKQorCQlmdWxsX3R5cGVfbmFtZSA9IGZ1bGxfdHlwZV9uYW1lKGNwcF90cmVlKQorCQluYW1lc3BhY2UuYWRkX2NjKCJzdGF0aWMgI3t0eXBlX25hbWV9ICoje0BuYW1lfV9wdHIiKQorCQljb3VudGVyID0gIiN7QG5hbWV9X2NvdW50ZXIiCisJCW5hbWVzcGFjZS5hZGRfY2MoInN0YXRpYyBpbnQgI3tjb3VudGVyfSIpCisKKwkJc3RyID0gPDxDT01NRU5UX0VORAorU2Nod2FyeiBjb3VudGVyIHRvIGNvbnN0cnVjdCBhbmQgZGVzdHJ1Y3QgdGhlICN7QG5hbWV9IHF1ZXVlLgorTXVzdCBiZSBjb25zdHJ1Y3RlZCBiZWZvcmUgJiN7QG5hbWV9IGlzIGNvbnN0cnVjdGVkIHNvIHRoYXQgI3tAbmFtZX1fcHRyCitpcyB2YWxpZCBzbyB3ZSBjYW4gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4KK0NPTU1FTlRfRU5ECisJCXN0ci5zcGxpdCgvXG4vKS5lYWNoIGRvIHxzdHJfc2VjfAorCQkJbmFtZXNwYWNlLmNsYXNzX2NvbW1lbnQoc3RyX3NlYykKKwkJZW5kCisJCWluaXRfY2xhc3MgPSBuYW1lc3BhY2UuYWRkX2NsYXNzKCJJbml0aWFsaXplckZvcl8iICsgQG5hbWUpCisKKwkJaW5pdF9jbGFzcy5hZGRfY2NfY29tbWVudCgKKyAgICAgICAgIlRoZSBjb3VudGVyIGlzIGluaXRpYWxpemVkIGF0IGxvYWQtdGltZSwgaS5lLiwgYmVmb3JlIGFueSBvZiB0aGUgc3RhdGljIiwKKwkJIm9iamVjdHMgYXJlIGluaXRpYWxpemVkLiIpCisKKworCQljb25zID0gQ1BQOjpDb25zdHJ1Y3Rvci5uZXcoaW5pdF9jbGFzcykKKwkJaW5pdF9jbGFzcy5hZGRfbWVtYmVyKDpwdWJsaWMsY29ucykKKwkJY29ucy5zdWl0ZSA8PCBpZl9zdG10ID0gQ1BQOjpJZi5uZXcoIjAgPT0gI3tjb3VudGVyfSsrIikKKworCQljb25zX2NhbGwgPSBDUFA6OkZ1bmNDYWxsLm5ldygibmV3ICN7dHlwZV9uYW1lfSIpCisJCWNvbnNfY2FsbC5hcmdzLnB1c2goQGxvYy5xdWV1ZV9uYW1lKEBuYW1lKS5pbnNwZWN0KQorCQlpZl9zdG10LnN1aXRlIDw8IENQUDo6QXNzaWduLm5ldygiI3tAbmFtZX1fcHRyIixjb25zX2NhbGwpCisKKworCQlkZXN0cnVjdCA9IENQUDo6RGVzdHJ1Y3Rvci5uZXcoaW5pdF9jbGFzcykKKwkJaW5pdF9jbGFzcy5hZGRfbWVtYmVyKDpwdWJsaWMsZGVzdHJ1Y3QpCisJCWRlc3RydWN0LnN1aXRlIDw8IGlmX3N0bXQgPSBDUFA6OklmLm5ldygiMCA9PSAtLSN7Y291bnRlcn0iKQorCQlpZl9zdG10LnN1aXRlIDw8ICJkZWxldGUgI3tAbmFtZX1fcHRyIgorCQlpZl9zdG10LnN1aXRlIDw8IENQUDo6QXNzaWduLm5ldygiI3tAbmFtZX1fcHRyIiwiTlVMTCIpCisKKwkJaW5pdF9jbGFzcy5zdGF0aWMgPSB0cnVlCisJCWluaXRfY2xhc3MuZGVjID0gQG5hbWUgKyAiX2luaXRpYWxpemVyIjsKKworCQlzdHIgPSA8PENPTU1FTlRfRU5ECitDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIG5ldyBvYmplY3QgaW4gdGhlIHBvaW50ZXIuICBTaW5jZSB3ZSBoYXZlIGFscmVhZHkKK2NyZWF0ZWQgdGhlIGluaXRpYWxpemVyCitDT01NRU5UX0VORAorCQlzdHIuc3BsaXQoL1xuLykubWFwe3xzdHJfc2VjfCBDUFA6OkNvbW1lbnQubmV3KHN0cl9zZWMpfS5lYWNoIGRvIHxjb21tZW50fAorICAgICAgbmFtZXNwYWNlLmFkZChjb21tZW50KQorICAgIGVuZAorCQluYW1lc3BhY2UuYWRkKCJzdGF0aWMgVU5VU0VEX1ZBUklBQkxFICN7dHlwZV9uYW1lfSAmI3tAbmFtZX0iICsKKyAgICAgICAgICAgICAgICAgICIgPSAje0BuYW1lfV9pbml0aWFsaXplci5nZXQoKSIpCisKKwkJZ2V0ID0gaW5pdF9jbGFzcy5kZWZfZnVuYyhmdWxsX3R5cGVfbmFtZSwiZ2V0IikKKwkJZ2V0LnByZV9mdW5jX3R5cGVzID0gIiYiCisJCWdldC5zdWl0ZSA8PCBDUFA6OlJldHVybi5uZXcoIioje0BuYW1lfV9wdHIiKQorCQkKKwllbmQKK2VuZAorCmRpZmYgLS1naXQgYS9hb3MvYnVpbGQvcXVldWVzL3ByaW50X2ZpZWxkLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9wcmludF9maWVsZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWNjMWRhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2J1aWxkL3F1ZXVlcy9wcmludF9maWVsZC5yYgpAQCAtMCwwICsxLDkxIEBACityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL2xvYWQucmInCisKKyMgVE9ETyhicmlhbnMpOiBTcGVjaWFsLWNhc2UgVGltZSB0b28gYW5kIGZsb2F0L2RvdWJsZSBpZiB3ZSBjYW4gZmluZCBhIGdvb2Qgd2F5IHRvIGRvIGl0LgorR2VuZXJpY1R5cGVOYW1lcyA9IFsnZmxvYXQnLCAnZG91YmxlJywgJ2NoYXInLCAnOjphb3M6OnRpbWU6OlRpbWUnXQorSW50ZWdlclNpemVzID0gWzgsIDE2LCAzMiwgNjRdCisKK1dyaXRlSWZmQ2hhbmdlZC5vcGVuKEFSR1ZbMF0pIGRvIHxvdXRwdXR8CisgIG91dHB1dC5wdXRzIDw8RU5ECisvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5ICN7RmlsZS5leHBhbmRfcGF0aChfX0ZJTEVfXyl9LgorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vYnl0ZW9yZGVyLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9wcmludF9maWVsZF9oZWxwZXJzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfcHJpbnRmX2Zvcm1hdHMuaCIKKworbmFtZXNwYWNlIGFvcyB7CisKK2Jvb2wgUHJpbnRGaWVsZChjaGFyICpvdXRwdXQsIHNpemVfdCAqb3V0cHV0X2J5dGVzLCBjb25zdCB2b2lkICppbnB1dCwKKyAgICAgICAgICAgICAgICBzaXplX3QgKmlucHV0X2J5dGVzLCB1aW50MzJfdCB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworI3tHZW5lcmljVHlwZU5hbWVzLmNvbGxlY3QgZG8gfG5hbWV8CisgIG1lc3NhZ2VfZWxlbWVudCA9IFRhcmdldDo6TWVzc2FnZUVsZW1lbnQubmV3KG5hbWUsICd2YWx1ZScpCisgIHN0YXRlbWVudCA9IE1lc3NhZ2VFbGVtZW50U3RtdC5uZXcobmFtZSwgJ3ZhbHVlJykKKyAgbWVzc2FnZV9lbGVtZW50LnNpemUgPSBzdGF0ZW1lbnQuc2l6ZQorICBwcmludF9hcmdzID0gW10KKyAgbWVzc2FnZV9lbGVtZW50LmZldGNoUHJpbnRBcmdzKHByaW50X2FyZ3MpCisgIG5leHQgPDxFTkQyCisgICAgY2FzZSAje21lc3NhZ2VfZWxlbWVudC5nZXRUeXBlSUQoKX06CisgICAgICB7CisgICAgICAgIGlmICgqaW5wdXRfYnl0ZXMgPCAje3N0YXRlbWVudC5zaXplfSkgcmV0dXJuIGZhbHNlOworICAgICAgICAqaW5wdXRfYnl0ZXMgLT0gI3tzdGF0ZW1lbnQuc2l6ZX07CisgICAgICAgICN7bmFtZX0gdmFsdWU7CisgICAgICAgIHRvX2hvc3Qoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihpbnB1dCksICZ2YWx1ZSk7CisgICAgICAgIGludCByZXQgPSBzbnByaW50ZihvdXRwdXQsICpvdXRwdXRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiI3tzdGF0ZW1lbnQudG9QcmludEZvcm1hdCgpfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAje3ByaW50X2FyZ3NbMF19KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocmV0KSA+PSAqb3V0cHV0X2J5dGVzKSByZXR1cm4gZmFsc2U7CisgICAgICAgICpvdXRwdXRfYnl0ZXMgLT0gcmV0OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KK0VORDIKK2VuZC5qb2luKCcnKX0KKyN7SW50ZWdlclNpemVzLmNvbGxlY3QgZG8gfHNpemV8CisgIFt0cnVlLCBmYWxzZV0uY29sbGVjdCBkbyB8c2lnbmVkfAorICAgIHNpemVfYnl0ZXMgPSBzaXplIC8gOAorICAgIG5hbWUgPSAiI3tzaWduZWQgPyAnJyA6ICd1J31pbnQje3NpemV9X3QiCisgICAgbWVzc2FnZV9lbGVtZW50ID0gVGFyZ2V0OjpNZXNzYWdlRWxlbWVudC5uZXcobmFtZSwgJ3ZhbHVlJykKKyAgICBtZXNzYWdlX2VsZW1lbnQuc2l6ZSA9IHNpemVfYnl0ZXMKKyAgICBuZXh0IDw8RU5EMgorICAgIGNhc2UgI3ttZXNzYWdlX2VsZW1lbnQuZ2V0VHlwZUlEKCl9OgorICAgICAgeworICAgICAgICBpZiAoKmlucHV0X2J5dGVzIDwgI3tzaXplX2J5dGVzfSkgcmV0dXJuIGZhbHNlOworICAgICAgICAqaW5wdXRfYnl0ZXMgLT0gI3tzaXplX2J5dGVzfTsKKyAgICAgICAgI3tuYW1lfSB2YWx1ZTsKKyAgICAgICAgdG9faG9zdChzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KGlucHV0KSwgJnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFByaW50SW50ZWdlcjwje25hbWV9PihvdXRwdXQsIHZhbHVlLCBvdXRwdXRfYnl0ZXMpOworICAgICAgfQorRU5EMgorICBlbmQKK2VuZC5mbGF0dGVuLmpvaW4oJycpfQorI3sKKyAgbWVzc2FnZV9lbGVtZW50ID0gVGFyZ2V0OjpNZXNzYWdlRWxlbWVudC5uZXcoJ2Jvb2wnLCAndmFsdWUnKQorICBtZXNzYWdlX2VsZW1lbnQuc2l6ZSA9IDEKKyAgciA9IDw8RU5EMgorICAgIGNhc2UgI3ttZXNzYWdlX2VsZW1lbnQuZ2V0VHlwZUlEKCl9OgorICAgICAgeworICAgICAgICBpZiAoKmlucHV0X2J5dGVzIDwgMSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoKm91dHB1dF9ieXRlcyA8IDEpIHJldHVybiBmYWxzZTsKKyAgICAgICAgKmlucHV0X2J5dGVzIC09IDE7CisgICAgICAgIGJvb2wgdmFsdWUgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KGlucHV0KVswXTsKKyAgICAgICAgKm91dHB1dF9ieXRlcyAtPSAxOworICAgICAgICAqb3V0cHV0ID0gdmFsdWUgPyAnVCcgOiAnZic7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorRU5EMgorfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFvcworRU5ECitlbmQKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9xdWV1ZXMvcV9zcGVjcy9uZXN0ZWRfc3RydWN0cy5xIGIvYW9zL2J1aWxkL3F1ZXVlcy9xX3NwZWNzL25lc3RlZF9zdHJ1Y3RzLnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2MjYyMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9xdWV1ZXMvcV9zcGVjcy9uZXN0ZWRfc3RydWN0cy5xCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgYW9zLnRlc3Q7CisKK2ltcG9ydCAicV9zcGVjcy9zdHJ1Y3RfdGVzdC5xIjsKKworCittZXNzYWdlIFBvc2l0aW9uIHsKKwlpbnQzMl90IGE7CisJaW50MzJfdFsyXSBiOworCS5hb3MudGVzdDIuQ2xhd0hhbGZQb3NpdGlvbiB0b3A7CisJLmFvcy50ZXN0Mi5DbGF3SGFsZlBvc2l0aW9uIGJvdHRvbTsKKwlib29sIGM7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9xX3NwZWNzL3N0cnVjdF9xdWV1ZV9ncm91cC5xIGIvYW9zL2J1aWxkL3F1ZXVlcy9xX3NwZWNzL3N0cnVjdF9xdWV1ZV9ncm91cC5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzUwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL3Ffc3BlY3Mvc3RydWN0X3F1ZXVlX2dyb3VwLnEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBhb3MudGVzdDsKKworc3RydWN0IENsYXcgeworCWludDMyX3QgYTsKKwlpbnQzMl90IGI7Cit9OworCisJbWVzc2FnZSBIUG9zaXRpb24geworCQlDbGF3IHRvcDsKKwl9OworCisvLyBBbGwgYW5nbGVzIGhlcmUgYXJlIDAgaG9yaXpvbnRhbCwgcG9zaXRpdmUgdXAuIAorcXVldWVfZ3JvdXAgQ2xhd0dyb3VwIHsKKworCW1lc3NhZ2UgUG9zaXRpb24geworCQlDbGF3IHRvcDsKKwl9OworCXF1ZXVlIFBvc2l0aW9uIGtqa3M7Cit9OworCmRpZmYgLS1naXQgYS9hb3MvYnVpbGQvcXVldWVzL3Ffc3BlY3Mvc3RydWN0X3Rlc3QucSBiL2Fvcy9idWlsZC9xdWV1ZXMvcV9zcGVjcy9zdHJ1Y3RfdGVzdC5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjIyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL3Ffc3BlY3Mvc3RydWN0X3Rlc3QucQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGFvcy50ZXN0MjsKKworc3RydWN0IFN1YlN0cnVjdCB7CisJaW50MzJfdCBnOworfTsKKworc3RydWN0IENsYXdIYWxmUG9zaXRpb24geworCWRvdWJsZSBwb3NpdGlvbjsgCisJYm9vbCBoYWxsX2VmZmVjdDsKKwlTdWJTdHJ1Y3QgY2xhbXB5OworfTsKKwpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy9xdWV1ZV9wcmltaXRpdmVzLnJiIGIvYW9zL2J1aWxkL3F1ZXVlcy9xdWV1ZV9wcmltaXRpdmVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMWMzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvcXVldWVzL3F1ZXVlX3ByaW1pdGl2ZXMucmIKQEAgLTAsMCArMSw1NCBAQAorcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9sb2FkLnJiJworCityZXF1aXJlICdmaWxldXRpbHMnCisKK1R5cGVOYW1lcyA9IFs4LCAxNiwgMzIsIDY0XS5jb2xsZWN0IGRvIHxzaXplfAorICBbInVpbnQje3NpemV9X3QiLCAiaW50I3tzaXplfV90Il0KK2VuZC5mbGF0dGVuICsgWydib29sJywgJ2Zsb2F0JywgJ2NoYXInLCAnZG91YmxlJywgJzo6YW9zOjp0aW1lOjpUaW1lJ10KKworRmlsZVV0aWxzLm1rZGlyX3AoRmlsZS5kaXJuYW1lKEFSR1ZbMF0pKQorV3JpdGVJZmZDaGFuZ2VkLm9wZW4oQVJHVlswXSkgZG8gfG91dHB1dHwKKyAgb3V0cHV0LnB1dHMgPDxFTkQKKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgI3tGaWxlLmV4cGFuZF9wYXRoKF9fRklMRV9fKX0uCisvLyBETyBOT1QgRURJVCBCWSBIQU5EIQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgcXVldWVfcHJpbWl0aXZlX3R5cGVzIHsKKyN7VHlwZU5hbWVzLmNvbGxlY3QgZG8gfG5hbWV8CisgIG1lc3NhZ2VfZWxlbWVudCA9IFRhcmdldDo6TWVzc2FnZUVsZW1lbnQubmV3KG5hbWUsICd2YWx1ZScpCisgIHN0YXRlbWVudCA9IE1lc3NhZ2VFbGVtZW50U3RtdC5uZXcobmFtZSwgJ3ZhbHVlJykKKyAgbWVzc2FnZV9lbGVtZW50LnNpemUgPSBzdGF0ZW1lbnQuc2l6ZQorICBuYW1lID0gJ1RpbWUnIGlmIG5hbWUgPT0gJzo6YW9zOjp0aW1lOjpUaW1lJworICBuZXh0IDw8RU5EMgorICBzdGF0aWMgY29uc3QgdWludDMyX3QgI3tuYW1lfV9wID0gI3ttZXNzYWdlX2VsZW1lbnQuZ2V0VHlwZUlEKCl9OworRU5EMgorZW5kLmpvaW4oJycpfQorfSAgLy8gbmFtZXNwYWNlIHF1ZXVlX3ByaW1pdGl2ZV90eXBlcworCisvLyBBIGNsYXNzIGZvciBtYXBwaW5nIGFuIGFjdHVhbCB0eXBlIHRvIGEgdHlwZSBJRC4KKy8vIFRoZXJlIGFyZSBzcGVjaWFsaXphdGlvbnMgZm9yIGFsbCBvZiB0aGUgYWN0dWFsIHByaW1pdGl2ZSB0eXBlcy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlSUQgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGlkOworfTsKKworI3tUeXBlTmFtZXMuY29sbGVjdCBkbyB8bmFtZXwKKyAgbWVzc2FnZV9lbGVtZW50ID0gVGFyZ2V0OjpNZXNzYWdlRWxlbWVudC5uZXcobmFtZSwgJ3ZhbHVlJykKKyAgc3RhdGVtZW50ID0gTWVzc2FnZUVsZW1lbnRTdG10Lm5ldyhuYW1lLCAndmFsdWUnKQorICBtZXNzYWdlX2VsZW1lbnQuc2l6ZSA9IHN0YXRlbWVudC5zaXplCisgIG5leHQgPDxFTkQyCit0ZW1wbGF0ZTw+CitjbGFzcyBUeXBlSUQ8ICN7bmFtZX0+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBpZCA9ICN7bWVzc2FnZV9lbGVtZW50LmdldFR5cGVJRCgpfTsKK307CitFTkQyCitlbmQuam9pbignJyl9Cit9ICAvLyBuYW1lc3BhY2UgYW9zCitFTkQKK2VuZApkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3F1ZXVlcy93cml0ZV9pZmZfY2hhbmdlZC5yYiBiL2Fvcy9idWlsZC9xdWV1ZXMvd3JpdGVfaWZmX2NoYW5nZWQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzNzNhOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC9xdWV1ZXMvd3JpdGVfaWZmX2NoYW5nZWQucmIKQEAgLTAsMCArMSwzMCBAQAorcmVxdWlyZSAndGVtcGZpbGUnCisKKyMgV3JpdGVzIGEgZmlsZSBsaWtlIG5vcm1hbCBleGNlcHQgZG9lc24ndCBkbyBhbnl0aGluZyBpZiB0aGUgbmV3IGNvbnRlbnRzIGFyZQorIyB0aGUgc2FtZSBhcyB3aGF0J3MgYWxyZWFkeSB0aGVyZS4gVXNlZnVsIGZvciBoZWxwaW5nIGJ1aWxkIHRvb2xzIG5vdCByZWJ1aWxkCisjIGlmIGdlbmVyYXRlZCBmaWxlcyBhcmUgcmUtZ2VuZXJhdGVkIGJ1dCBkb24ndCBjaGFuZ2UuCisjIFVzYWJsZSBhcyBhIHN0YW5kYXJkIEZpbGUsIGluY2x1ZGluZyB0byByZWRpcmVjdCB0byB3aXRoIElPLnBvcGVuIGV0Yy4KK2NsYXNzIFdyaXRlSWZmQ2hhbmdlZCA8IFRlbXBmaWxlCisgIGRlZiBpbml0aWFsaXplKGZpbGVuYW1lKQorICAgIHN1cGVyKCd3cml0ZV9pZmZfY2hhbmdlZCcpCisgICAgQGZpbGVuYW1lID0gZmlsZW5hbWUKKyAgZW5kCisgIGRlZiBXcml0ZUlmZkNoYW5nZWQub3BlbihmaWxlbmFtZSkKKyAgICBvdXQgPSBXcml0ZUlmZkNoYW5nZWQubmV3KGZpbGVuYW1lKQorICAgIHlpZWxkIG91dAorICAgIG91dC5jbG9zZQorICBlbmQKKyAgZGVmIGNsb3NlCisgICAgZmx1c2gKKyAgICBjb250ZW50cyA9IEZpbGUub3BlbihwYXRoLCAncicpIGRvIHxmfAorICAgICAgZi5yZWFkbGluZXMobmlsKQorICAgIGVuZAorICAgIGlmICFGaWxlLmV4aXN0cz8oQGZpbGVuYW1lKSB8fAorICAgICAgICBGaWxlLm5ldyhAZmlsZW5hbWUsICdyJykucmVhZGxpbmVzKG5pbCkgIT0gY29udGVudHMKKyAgICAgIEZpbGUub3BlbihAZmlsZW5hbWUsICd3JykgZG8gfG91dHwKKyAgICAgICAgb3V0LndyaXRlKGNvbnRlbnRzWzBdKQorICAgICAgZW5kCisgICAgZW5kCisgICAgc3VwZXIKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9zdHJpcF9kZWJ1Z2xpbmsgYi9hb3MvYnVpbGQvc3RyaXBfZGVidWdsaW5rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZjZTk1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvYnVpbGQvc3RyaXBfZGVidWdsaW5rCkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9kYXNoCisKK3NldCAtZQorCitPQkpDT1BZPSQxCitzaGlmdAorCisjIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYW55IC1vIGZsYWdzLgorT1VUUFVUPWBlY2hvICIkQCIgfCBhd2sgXAorICAnQkVHSU4geyBSUz0iICIgfTsgb3V0cHV0IHsgcHJpbnQgOyBvdXRwdXQgPSAwIH07IC8tby8geyBvdXRwdXQgPSAxIH0nYAorREVCVUdfRElSPSQoZGlybmFtZSAkKGRpcm5hbWUgJHtPVVRQVVR9KSkvdW5zdHJpcHBlZF9maWxlcworbWtkaXIgLXAgJHtERUJVR19ESVJ9CitERUJVR19GSUxFPSR7REVCVUdfRElSfS8kKGJhc2VuYW1lICR7T1VUUFVUfSkuZnVsbAorCisiJEAiCisKK2NwICR7T1VUUFVUfSAke0RFQlVHX0ZJTEV9Ciske09CSkNPUFl9IC0tc3RyaXAtZGVidWcgLS1hZGQtZ251LWRlYnVnbGluaz0ke0RFQlVHX0ZJTEV9ICR7T1VUUFVUfQpkaWZmIC0tZ2l0IGEvYW9zL2J1aWxkL3Rvb2xzX2NvbmZpZyBiL2Fvcy9idWlsZC90b29sc19jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MzFhZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9idWlsZC90b29sc19jb25maWcKQEAgLTAsMCArMSwxNSBAQAorIyBUaGlzIGlzIGEgc2hlbGwgZnJhZ21lbnQgdGhhdCBzZXRzIHVwIHZhcmlhYmxlcyByZWxhdGVkIHRvIHdoZXJlIHRoZSB0b29scworIyB0aGF0IGRvd25sb2FkX2V4dGVybmFscy5zaCBkb3dubG9hZHMgc28gYnVpbGQuc2ggY2FuIHVzZS4KKyMgSXQgYWxzbyBnZXRzIHBhcnNlZCBieSBidWlsZC5weSwgc28gaXQgaGFzIHRvIHN0YXkganVzdCB2YXJpYWJsZSBhc3NpZ25tZW50cworIyBhbmQgY29tbWVudHMuCisKK0VYVEVSTkFMUz0ke0FPU30vLi4vb3V0cHV0L2Rvd25sb2FkZWQKKworTklOSkFfUkVMRUFTRT12MS40LjAKK05JTkpBX0RJUj0ke0VYVEVSTkFMU30vbmluamEtJHtOSU5KQV9SRUxFQVNFfQorTklOSkE9JHtOSU5KQV9ESVJ9L25pbmphCisKKyMgRnJvbSBjaHJvbWl1bUAxNTQzNjA6dHJ1bmsvc3JjL0RFUFMuCitHWVBfUkVWSVNJT049MTczOAorR1lQX0RJUj0ke0VYVEVSTkFMU30vZ3lwLSR7R1lQX1JFVklTSU9OfQorR1lQPSR7R1lQX0RJUn0vZ3lwCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9uX3Rlc3QuY2MgYi9hb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9uX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5NGIzMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25fdGVzdC5jYwpAQCAtMCwwICsxLDQ4MiBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWVfdGVzdHV0aWxzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdG9yLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5xLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL3Rlc3RfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2V2ZW50LmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBjb21tb24geworbmFtZXNwYWNlIGFjdGlvbnMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBUZXN0QWN0b3JJbmRleAorICAgIDogcHVibGljIGFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3RvckJhc2U8YWN0aW9uczo6VGVzdEFjdGlvblF1ZXVlR3JvdXA+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFRlc3RBY3RvckluZGV4KGFjdGlvbnM6OlRlc3RBY3Rpb25RdWV1ZUdyb3VwICpzKQorICAgICAgOiBhb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0b3JCYXNlPGFjdGlvbnM6OlRlc3RBY3Rpb25RdWV1ZUdyb3VwPihzKSB7fQorCisgIGJvb2wgUnVuQWN0aW9uKGNvbnN0IHVpbnQzMl90ICZuZXdfaW5kZXgpIG92ZXJyaWRlIHsKKyAgICBpbmRleCA9IG5ld19pbmRleDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHVpbnQzMl90IGluZGV4ID0gMDsKK307CisKKzo6c3RkOjp1bmlxdWVfcHRyPAorICAgIGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxhY3Rpb25zOjpUZXN0QWN0aW9uUXVldWVHcm91cD4+CitNYWtlVGVzdEFjdGlvbkluZGV4KHVpbnQzMl90IGluZGV4KSB7CisgIHJldHVybiA6OnN0ZDo6dW5pcXVlX3B0cjwKKyAgICAgIGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxhY3Rpb25zOjpUZXN0QWN0aW9uUXVldWVHcm91cD4+KAorICAgICAgbmV3IGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxhY3Rpb25zOjpUZXN0QWN0aW9uUXVldWVHcm91cD4oCisgICAgICAgICAgJmFjdGlvbnM6OnRlc3RfYWN0aW9uLCBpbmRleCkpOworfQorCitjbGFzcyBUZXN0QWN0b3JOT1AKKyAgICA6IHB1YmxpYyBhb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0b3JCYXNlPGFjdGlvbnM6OlRlc3RBY3Rpb25RdWV1ZUdyb3VwPiB7CisgcHVibGljOgorICBleHBsaWNpdCBUZXN0QWN0b3JOT1AoYWN0aW9uczo6VGVzdEFjdGlvblF1ZXVlR3JvdXAgKnMpCisgICAgICA6IGFjdGlvbnM6OkFjdG9yQmFzZTxhY3Rpb25zOjpUZXN0QWN0aW9uUXVldWVHcm91cD4ocykge30KKworICBib29sIFJ1bkFjdGlvbihjb25zdCB1aW50MzJfdCAmKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Cit9OworCis6OnN0ZDo6dW5pcXVlX3B0cjwKKyAgICBhb3M6OmNvbW1vbjo6YWN0aW9uczo6VHlwZWRBY3Rpb248YWN0aW9uczo6VGVzdEFjdGlvblF1ZXVlR3JvdXA+PgorTWFrZVRlc3RBY3Rpb25OT1AoKSB7CisgIHJldHVybiBNYWtlVGVzdEFjdGlvbkluZGV4KDApOworfQorCitjbGFzcyBUZXN0QWN0b3JTaG91bGRDYW5jZWwKKyAgICA6IHB1YmxpYyBhb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0b3JCYXNlPGFjdGlvbnM6OlRlc3RBY3Rpb25RdWV1ZUdyb3VwPiB7CisgcHVibGljOgorICBleHBsaWNpdCBUZXN0QWN0b3JTaG91bGRDYW5jZWwoYWN0aW9uczo6VGVzdEFjdGlvblF1ZXVlR3JvdXAgKnMpCisgICAgICA6IGFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3RvckJhc2U8YWN0aW9uczo6VGVzdEFjdGlvblF1ZXVlR3JvdXA+KHMpIHt9CisKKyAgYm9vbCBSdW5BY3Rpb24oY29uc3QgdWludDMyX3QgJikgb3ZlcnJpZGUgeworICAgIHdoaWxlICghU2hvdWxkQ2FuY2VsKCkpIHsKKyAgICAgIExPRyhGQVRBTCwgIk5PVCBDQU5DRUxFRCEhXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKzo6c3RkOjp1bmlxdWVfcHRyPAorICAgIGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxhY3Rpb25zOjpUZXN0QWN0aW9uUXVldWVHcm91cD4+CitNYWtlVGVzdEFjdGlvblNob3VsZENhbmNlbCgpIHsKKyAgcmV0dXJuIE1ha2VUZXN0QWN0aW9uSW5kZXgoMCk7Cit9CisKK2NsYXNzIFRlc3RBY3RvcjJOb3AKKyAgICA6IHB1YmxpYyBhb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0b3JCYXNlPGFjdGlvbnM6OlRlc3RBY3Rpb24yUXVldWVHcm91cD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgVGVzdEFjdG9yMk5vcChhY3Rpb25zOjpUZXN0QWN0aW9uMlF1ZXVlR3JvdXAgKnMpCisgICAgICA6IGFjdGlvbnM6OkFjdG9yQmFzZTxhY3Rpb25zOjpUZXN0QWN0aW9uMlF1ZXVlR3JvdXA+KHMpIHt9CisKKyAgYm9vbCBSdW5BY3Rpb24oY29uc3QgYWN0aW9uczo6TXlQYXJhbXMgJikgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworOjpzdGQ6OnVuaXF1ZV9wdHI8CisgICAgYW9zOjpjb21tb246OmFjdGlvbnM6OlR5cGVkQWN0aW9uPGFjdGlvbnM6OlRlc3RBY3Rpb24yUXVldWVHcm91cD4+CitNYWtlVGVzdEFjdGlvbjJOT1AoY29uc3QgYWN0aW9uczo6TXlQYXJhbXMgJnBhcmFtcykgeworICByZXR1cm4gOjpzdGQ6OnVuaXF1ZV9wdHI8CisgICAgICBhb3M6OmNvbW1vbjo6YWN0aW9uczo6VHlwZWRBY3Rpb248YWN0aW9uczo6VGVzdEFjdGlvbjJRdWV1ZUdyb3VwPj4oCisgICAgICBuZXcgYW9zOjpjb21tb246OmFjdGlvbnM6OlR5cGVkQWN0aW9uPGFjdGlvbnM6OlRlc3RBY3Rpb24yUXVldWVHcm91cD4oCisgICAgICAgICAgJmFjdGlvbnM6OnRlc3RfYWN0aW9uMiwgcGFyYW1zKSk7Cit9CisKK2NsYXNzIEFjdGlvblRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEFjdGlvblRlc3QoKSB7CisgICAgLy8gRmx1c2ggdGhlIHJvYm90IHN0YXRlIHF1ZXVlIHNvIHdlIGNhbiB1c2UgY2xlYW4gc2hhcmVkIG1lbW9yeSBmb3IgdGhpcy4KKyAgICAvLyB0ZXN0LgorICAgIGFjdGlvbnM6OnRlc3RfYWN0aW9uLmdvYWwuQ2xlYXIoKTsKKyAgICBhY3Rpb25zOjp0ZXN0X2FjdGlvbi5zdGF0dXMuQ2xlYXIoKTsKKyAgICBhY3Rpb25zOjp0ZXN0X2FjdGlvbjIuZ29hbC5DbGVhcigpOworICAgIGFjdGlvbnM6OnRlc3RfYWN0aW9uMi5zdGF0dXMuQ2xlYXIoKTsKKyAgfQorCisgIHZpcnR1YWwgfkFjdGlvblRlc3QoKSB7CisgICAgYWN0aW9uczo6dGVzdF9hY3Rpb24uZ29hbC5DbGVhcigpOworICAgIGFjdGlvbnM6OnRlc3RfYWN0aW9uLnN0YXR1cy5DbGVhcigpOworICAgIGFjdGlvbnM6OnRlc3RfYWN0aW9uMi5nb2FsLkNsZWFyKCk7CisgICAgYWN0aW9uczo6dGVzdF9hY3Rpb24yLnN0YXR1cy5DbGVhcigpOworICB9CisKKyAgLy8gQnJpbmcgdXAgYW5kIGRvd24gQ29yZS4KKyAgOjphb3M6OmNvbW1vbjo6dGVzdGluZzo6R2xvYmFsQ29yZUluc3RhbmNlIG15X2NvcmU7CisgIDo6YW9zOjpjb21tb246OmFjdGlvbnM6OkFjdGlvblF1ZXVlIGFjdGlvbl9xdWV1ZV87Cit9OworCisvLyBUZXN0cyB0aGF0IHRoZSB0aGUgYWN0aW9ucyBleGlzdCBpbiBhIHNhZmUgc3RhdGUgYXQgc3RhcnR1cC4KK1RFU1RfRihBY3Rpb25UZXN0LCBEb2VzTm90aGluZykgeworICAvLyBUaWNrIGFuIGVtcHR5IHF1ZXVlIGFuZCBtYWtlIHN1cmUgaXQgd2FzIG5vdCBydW5uaW5nLgorICBFWFBFQ1RfRkFMU0UoYWN0aW9uX3F1ZXVlXy5SdW5uaW5nKCkpOworICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBzdGFydGluZyB3aXRoIGFuIG9sZCBydW4gbWVzc2FnZSBpbiB0aGUgZ29hbCBxdWV1ZSBhY3R1YWxseSB3b3Jrcy4KKy8vIFRoaXMgdXNlZCB0byByZXN1bHQgaW4gdGhlIGNsaWVudCBoYW5naW5nLCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIHRvIGl0cworLy8gY2FuY2VsIG1lc3NhZ2UuCitURVNUX0YoQWN0aW9uVGVzdCwgU3RhcnRXaXRoT2xkR29hbCkgeworICBBU1NFUlRfVFJVRShhY3Rpb25zOjp0ZXN0X2FjdGlvbi5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnJ1big5NzEpLlNlbmQoKSk7CisKKyAgVGVzdEFjdG9yTk9QIG5vcF9hY3QoJmFjdGlvbnM6OnRlc3RfYWN0aW9uKTsKKworICBBU1NFUlRfRkFMU0UoYWN0aW9uczo6dGVzdF9hY3Rpb24uc3RhdHVzLkZldGNoTGF0ZXN0KCkpOworICA6OnN0ZDo6dGhyZWFkIGluaXRfdGhyZWFkKFsmbm9wX2FjdF0oKSB7IG5vcF9hY3QuSW5pdGlhbGl6ZSgpOyB9KTsKKyAgOjphb3M6OnRpbWU6OlNsZWVwRm9yKDo6YW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMoMC4xKSk7CisgIEFTU0VSVF9UUlVFKGFjdGlvbnM6OnRlc3RfYWN0aW9uLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkucnVuKDEpLlNlbmQoKSk7CisgIGluaXRfdGhyZWFkLmpvaW4oKTsKKyAgQVNTRVJUX1RSVUUoYWN0aW9uczo6dGVzdF9hY3Rpb24uc3RhdHVzLkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfRVEoMHUsIGFjdGlvbnM6OnRlc3RfYWN0aW9uLnN0YXR1cy0+cnVubmluZyk7CisgIEVYUEVDVF9FUSgwdSwgYWN0aW9uczo6dGVzdF9hY3Rpb24uc3RhdHVzLT5sYXN0X3J1bm5pbmcpOworCisgIGFjdGlvbl9xdWV1ZV8uRW5xdWV1ZUFjdGlvbihNYWtlVGVzdEFjdGlvbk5PUCgpKTsKKyAgbm9wX2FjdC5XYWl0Rm9yQWN0aW9uUmVxdWVzdCgpOworCisgIC8vIFdlIHN0YXJ0ZWQgYW4gYWN0aW9uIGFuZCBpdCBzaG91bGQgYmUgcnVubmluZy4KKyAgRVhQRUNUX1RSVUUoYWN0aW9uX3F1ZXVlXy5SdW5uaW5nKCkpOworCisgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKworICBFWFBFQ1RfVFJVRShhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSk7CisKKyAgLy8gUnVuIHRoZSBhY3Rpb24gc28gaXQgY2FuIHNpZ25hbCBjb21wbGV0aW9uLgorICBub3BfYWN0LlJ1bkl0ZXJhdGlvbigpOworICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKworICAvLyBNYWtlIHN1cmUgaXQgc3RvcHBlZC4KKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgcXVldWVzIGFyZSBwcm9wZXJseSBjb25maWd1cmVkIGZvciB0ZXN0aW5nLiBUZXN0cyB0aGF0IHF1ZXVlcworLy8gd29yayBleGFjdGx5IGFzIHVzZWQgaW4gdGhlIHRlc3RzLgorVEVTVF9GKEFjdGlvblRlc3QsIFF1ZXVlQ2hlY2spIHsKKyAgYWN0aW9uczo6VGVzdEFjdGlvblF1ZXVlR3JvdXAgKnNlbmRfc2lkZSA9ICZhY3Rpb25zOjp0ZXN0X2FjdGlvbjsKKyAgYWN0aW9uczo6VGVzdEFjdGlvblF1ZXVlR3JvdXAgKnJlY3Zfc2lkZSA9ICZhY3Rpb25zOjp0ZXN0X2FjdGlvbjsKKworICBzZW5kX3NpZGUtPmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkucnVuKDEpLlNlbmQoKTsKKworICBFWFBFQ1RfVFJVRShyZWN2X3NpZGUtPmdvYWwuRmV0Y2hMYXRlc3QoKSk7CisgIEVYUEVDVF9UUlVFKHJlY3Zfc2lkZS0+Z29hbC0+cnVuKTsKKworICBzZW5kX3NpZGUtPmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkucnVuKDApLlNlbmQoKTsKKworICBFWFBFQ1RfVFJVRShyZWN2X3NpZGUtPmdvYWwuRmV0Y2hMYXRlc3QoKSk7CisgIEVYUEVDVF9GQUxTRShyZWN2X3NpZGUtPmdvYWwtPnJ1bik7CisKKyAgc2VuZF9zaWRlLT5zdGF0dXMuTWFrZVdpdGhCdWlsZGVyKCkucnVubmluZyg1KS5sYXN0X3J1bm5pbmcoNikuU2VuZCgpOworCisgIEVYUEVDVF9UUlVFKHJlY3Zfc2lkZS0+c3RhdHVzLkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfRVEoNSwgc3RhdGljX2Nhc3Q8aW50PihyZWN2X3NpZGUtPnN0YXR1cy0+cnVubmluZykpOworICBFWFBFQ1RfRVEoNiwgc3RhdGljX2Nhc3Q8aW50PihyZWN2X3NpZGUtPnN0YXR1cy0+bGFzdF9ydW5uaW5nKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYW4gYWN0aW9uIHN0YXJ0cyBhbmQgc3RvcHMuCitURVNUX0YoQWN0aW9uVGVzdCwgQWN0aW9uUXVldWVXYXNSdW5uaW5nKSB7CisgIFRlc3RBY3Rvck5PUCBub3BfYWN0KCZhY3Rpb25zOjp0ZXN0X2FjdGlvbik7CisKKyAgLy8gVGljayBhbiBlbXB0eSBxdWV1ZSBhbmQgbWFrZSBzdXJlIGl0IHdhcyBub3QgcnVubmluZy4KKyAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisgIEVYUEVDVF9GQUxTRShhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSk7CisKKyAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKE1ha2VUZXN0QWN0aW9uTk9QKCkpOworICBub3BfYWN0LldhaXRGb3JBY3Rpb25SZXF1ZXN0KCk7CisKKyAgLy8gV2Ugc3RhcnRlZCBhbiBhY3Rpb24gYW5kIGl0IHNob3VsZCBiZSBydW5uaW5nLgorICBFWFBFQ1RfVFJVRShhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSk7CisKKyAgLy8gVGljayBpdCBhbmQgbWFrZSBzdXJlIGl0IGlzIHN0aWxsIHJ1bm5pbmcuCisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworICBFWFBFQ1RfVFJVRShhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSk7CisKKyAgLy8gUnVuIHRoZSBhY3Rpb24gc28gaXQgY2FuIHNpZ25hbCBjb21wbGV0aW9uLgorICBub3BfYWN0LlJ1bkl0ZXJhdGlvbigpOworICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKworICAvLyBNYWtlIHN1cmUgaXQgc3RvcHBlZC4KKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gY2FuY2VsIHR3byBhY3Rpb25zIGFuZCBoYXZlIHRoZW0gYm90aCBzdG9wLgorVEVTVF9GKEFjdGlvblRlc3QsIEFjdGlvblF1ZXVlQ2FuY2VsQWxsKSB7CisgIFRlc3RBY3Rvck5PUCBub3BfYWN0KCZhY3Rpb25zOjp0ZXN0X2FjdGlvbik7CisKKyAgLy8gVGljayBhbiBlbXB0eSBxdWV1ZSBhbmQgbWFrZSBzdXJlIGl0IHdhcyBub3QgcnVubmluZy4KKyAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisgIEVYUEVDVF9GQUxTRShhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSk7CisKKyAgLy8gRW5xdWV1ZSB0d28gYWN0aW9ucyB0byB0ZXN0IGJvdGggY2FuY2VsLiBXZSBjYW4gaGF2ZSBhbiBhY3Rpb24gYW5kIGEgbmV4dAorICAvLyBhY3Rpb24gc28gd2Ugd2FudCB0byB0ZXN0IHRoYXQuCisgIGFjdGlvbl9xdWV1ZV8uRW5xdWV1ZUFjdGlvbihNYWtlVGVzdEFjdGlvbk5PUCgpKTsKKyAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKE1ha2VUZXN0QWN0aW9uTk9QKCkpOworICBub3BfYWN0LldhaXRGb3JBY3Rpb25SZXF1ZXN0KCk7CisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworCisgIC8vIENoZWNrIHRoYXQgY3VycmVudCBhbmQgbmV4dCBleGlzdC4KKyAgRVhQRUNUX1RSVUUoYWN0aW9uX3F1ZXVlXy5HZXRDdXJyZW50QWN0aW9uU3RhdGUobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOworICBFWFBFQ1RfVFJVRShhY3Rpb25fcXVldWVfLkdldE5leHRBY3Rpb25TdGF0ZShudWxscHRyLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyLCBudWxscHRyKSk7CisKKyAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworCisgIC8vIEl0IHNob3VsZCBzdGlsbCBiZSBydW5uaW5nIGFzIHRoZSBhY3RvciBjb3VsZCBub3QgaGF2ZSBzaWduYWxlZC4KKyAgRVhQRUNUX1RSVUUoYWN0aW9uX3F1ZXVlXy5SdW5uaW5nKCkpOworCisgIGJvb2wgc2VudF9zdGFydGVkLCBzZW50X2NhbmNlbCwgaW50ZXJydXB0ZWQ7CisgIEVYUEVDVF9UUlVFKGFjdGlvbl9xdWV1ZV8uR2V0Q3VycmVudEFjdGlvblN0YXRlKAorICAgICAgbnVsbHB0ciwgJnNlbnRfc3RhcnRlZCwgJnNlbnRfY2FuY2VsLCAmaW50ZXJydXB0ZWQsIG51bGxwdHIsIG51bGxwdHIpKTsKKyAgRVhQRUNUX1RSVUUoc2VudF9zdGFydGVkKTsKKyAgRVhQRUNUX1RSVUUoc2VudF9jYW5jZWwpOworICBFWFBFQ1RfRkFMU0UoaW50ZXJydXB0ZWQpOworCisgIEVYUEVDVF9GQUxTRShhY3Rpb25fcXVldWVfLkdldE5leHRBY3Rpb25TdGF0ZShudWxscHRyLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOworCisgIC8vIFJ1biB0aGUgYWN0aW9uIHNvIGl0IGNhbiBzaWduYWwgY29tcGxldGlvbi4KKyAgbm9wX2FjdC5SdW5JdGVyYXRpb24oKTsKKyAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisKKyAgLy8gTWFrZSBzdXJlIGl0IHN0b3BwZWQuCisgIEVYUEVDVF9GQUxTRShhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYW4gYWN0aW9uIHRoYXQgd291bGQgYmxvY2sgZm9yZXZlciBzdG9wcyB3aGVuIGNhbmNlbGVkLgorVEVTVF9GKEFjdGlvblRlc3QsIEFjdGlvblF1ZXVlQ2FuY2VsT25lKSB7CisgIFRlc3RBY3RvclNob3VsZENhbmNlbCBjYW5jZWxfYWN0KCZhY3Rpb25zOjp0ZXN0X2FjdGlvbik7CisKKyAgLy8gRW5xdWV1ZSBibG9ja2luZyBhY3Rpb24uCisgIGFjdGlvbl9xdWV1ZV8uRW5xdWV1ZUFjdGlvbihNYWtlVGVzdEFjdGlvblNob3VsZENhbmNlbCgpKTsKKworICBjYW5jZWxfYWN0LldhaXRGb3JBY3Rpb25SZXF1ZXN0KCk7CisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworICBFWFBFQ1RfVFJVRShhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSk7CisKKyAgLy8gVGVsbCBhY3Rpb24gdG8gY2FuY2VsLgorICBhY3Rpb25fcXVldWVfLkNhbmNlbEN1cnJlbnRBY3Rpb24oKTsKKyAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisKKyAgLy8gVGhpcyB3aWxsIGJsb2NrIGZvcmV2ZXIgb24gZmFpbHVyZS4KKyAgLy8gVE9ETyhiZW4pOiBwcm9sbHkgYSBiYWQgd2F5IHRvIGZhaWwKKyAgY2FuY2VsX2FjdC5SdW5JdGVyYXRpb24oKTsKKyAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisKKyAgLy8gSXQgc2hvdWxkIHN0aWxsIGJlIHJ1bm5pbmcgYXMgdGhlIGFjdG9yIGNvdWxkIG5vdCBoYXZlIHNpZ25hbGxlZC4KKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbiBhY3Rpb24gc3RhcnRzIGFuZCBzdG9wcy4KK1RFU1RfRihBY3Rpb25UZXN0LCBBY3Rpb25RdWV1ZVR3b0FjdGlvbnMpIHsKKyAgVGVzdEFjdG9yTk9QIG5vcF9hY3QoJmFjdGlvbnM6OnRlc3RfYWN0aW9uKTsKKworICAvLyBUaWNrIGFuIGVtcHR5IHF1ZXVlIGFuZCBtYWtlIHN1cmUgaXQgd2FzIG5vdCBydW5uaW5nLgorICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKworICAvLyBFbnF1ZXVlIGFjdGlvbiB0byBiZSBjYW5jZWxlZC4KKyAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKE1ha2VUZXN0QWN0aW9uTk9QKCkpOworICBub3BfYWN0LldhaXRGb3JBY3Rpb25SZXF1ZXN0KCk7CisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworCisgIC8vIFNob3VsZCBzdGlsbCBiZSBydW5uaW5nIGFzIHRoZSBhY3RvciBjb3VsZCBub3QgaGF2ZSBzaWduYWxsZWQuCisgIEVYUEVDVF9UUlVFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKworICAvLyBpZCBmb3IgdGhlIGZpcnN0IHRpbWUgcnVuLgorICB1aW50MzJfdCBub3BfYWN0X2lkID0gMDsKKyAgLy8gQ2hlY2sgdGhlIGludGVybmFsIHN0YXRlIGFuZCB3cml0ZSBkb3duIGlkIGZvciBsYXRlciB1c2UuCisgIGJvb2wgc2VudF9zdGFydGVkLCBzZW50X2NhbmNlbCwgaW50ZXJydXB0ZWQ7CisgIEVYUEVDVF9UUlVFKGFjdGlvbl9xdWV1ZV8uR2V0Q3VycmVudEFjdGlvblN0YXRlKG51bGxwdHIsICZzZW50X3N0YXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZW50X2NhbmNlbCwgJmludGVycnVwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9wX2FjdF9pZCwgbnVsbHB0cikpOworICBFWFBFQ1RfVFJVRShzZW50X3N0YXJ0ZWQpOworICBFWFBFQ1RfRkFMU0Uoc2VudF9jYW5jZWwpOworICBFWFBFQ1RfRkFMU0UoaW50ZXJydXB0ZWQpOworICBBU1NFUlRfTkUoMHUsIG5vcF9hY3RfaWQpOworCisgIC8vIEFkZCB0aGUgbmV4dCBhY3Rpb24gd2hpY2ggc2hvdWxkIGVuc3VyZSB0aGUgZmlyc3Qgc3RvcHBlZC4KKyAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKE1ha2VUZXN0QWN0aW9uTk9QKCkpOworCisgIC8vIGlkIGZvciB0aGUgc2Vjb25kIHJ1bi4KKyAgdWludDMyX3Qgbm9wX2FjdDJfaWQgPSAwOworICAvLyBDaGVjayB0aGUgaW50ZXJuYWwgc3RhdGUgYW5kIHdyaXRlIGRvd24gaWQgZm9yIGxhdGVyIHVzZS4KKyAgRVhQRUNUX1RSVUUoYWN0aW9uX3F1ZXVlXy5HZXROZXh0QWN0aW9uU3RhdGUobnVsbHB0ciwgJnNlbnRfc3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbnRfY2FuY2VsLCAmaW50ZXJydXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub3BfYWN0Ml9pZCwgbnVsbHB0cikpOworICBFWFBFQ1RfTkUobm9wX2FjdF9pZCwgbm9wX2FjdDJfaWQpOworICBFWFBFQ1RfRkFMU0Uoc2VudF9zdGFydGVkKTsKKyAgRVhQRUNUX0ZBTFNFKHNlbnRfY2FuY2VsKTsKKyAgRVhQRUNUX0ZBTFNFKGludGVycnVwdGVkKTsKKyAgQVNTRVJUX05FKDB1LCBub3BfYWN0Ml9pZCk7CisKKyAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisKKyAgLy8gUnVuIHRoZSBhY3Rpb24gc28gaXQgY2FuIHNpZ25hbCBjb21wbGV0aW9uLgorICBub3BfYWN0LlJ1bkl0ZXJhdGlvbigpOworICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgLy8gV2FpdCBmb3IgdGhlIGZpcnN0IGlkIHRvIGZpbmlzaCwgbmVlZGVkIGZvciB0aGUgY29ycmVjdCBudW1iZXIgb2YgZmV0Y2hlcy4KKyAgbm9wX2FjdC5XYWl0Rm9yU3RvcChub3BfYWN0X2lkKTsKKworICAvLyBTdGFydCB0aGUgbmV4dCBhY3Rpb24gb24gdGhlIGFjdG9yIHNpZGUuCisgIG5vcF9hY3QuV2FpdEZvckFjdGlvblJlcXVlc3QoKTsKKworICAvLyBDaGVjayB0aGUgbmV3IGFjdGlvbiBpcyB0aGUgcmlnaHQgb25lLgorICB1aW50MzJfdCB0ZXN0X2lkID0gMDsKKyAgRVhQRUNUX1RSVUUoYWN0aW9uX3F1ZXVlXy5HZXRDdXJyZW50QWN0aW9uU3RhdGUoCisgICAgICBudWxscHRyLCAmc2VudF9zdGFydGVkLCAmc2VudF9jYW5jZWwsICZpbnRlcnJ1cHRlZCwgJnRlc3RfaWQsIG51bGxwdHIpKTsKKyAgRVhQRUNUX1RSVUUoc2VudF9zdGFydGVkKTsKKyAgRVhQRUNUX0ZBTFNFKHNlbnRfY2FuY2VsKTsKKyAgRVhQRUNUX0ZBTFNFKGludGVycnVwdGVkKTsKKyAgRVhQRUNUX0VRKG5vcF9hY3QyX2lkLCB0ZXN0X2lkKTsKKworICAvLyBNYWtlIHN1cmUgaXQgaXMgc3RpbGwgZ29pbmcuCisgIEVYUEVDVF9UUlVFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKworICAvLyBSdW4gdGhlIG5leHQgYWN0aW9uIHNvIGl0IGNhbiBhY2NvbXBsaXNoIHNpZ25hbCBjb21wbGV0aW9uLgorICBub3BfYWN0LlJ1bkl0ZXJhdGlvbigpOworICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgbm9wX2FjdC5XYWl0Rm9yU3RvcChub3BfYWN0X2lkKTsKKworICAvLyBNYWtlIHN1cmUgaXQgc3RvcHBlZC4KKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBkbyBnZXQgYW4gaW5kZXggd2l0aCBvdXIgZ29hbAorVEVTVF9GKEFjdGlvblRlc3QsIEFjdGlvbkluZGV4KSB7CisgIFRlc3RBY3RvckluZGV4IGlkeF9hY3QoJmFjdGlvbnM6OnRlc3RfYWN0aW9uKTsKKworICAvLyBUaWNrIGFuIGVtcHR5IHF1ZXVlIGFuZCBtYWtlIHN1cmUgaXQgd2FzIG5vdCBydW5uaW5nLgorICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKworICAvLyBFbnF1ZXVlIGFjdGlvbiB0byBwb3N0IGluZGV4LgorICBhY3Rpb25fcXVldWVfLkVucXVldWVBY3Rpb24oTWFrZVRlc3RBY3Rpb25JbmRleCg1KSk7CisgIEVYUEVDVF9UUlVFKGFjdGlvbnM6OnRlc3RfYWN0aW9uLmdvYWwuRmV0Y2hMYXRlc3QoKSk7CisgIEVYUEVDVF9FUSg1dSwgYWN0aW9uczo6dGVzdF9hY3Rpb24uZ29hbC0+cGFyYW1zKTsKKyAgRVhQRUNUX0VRKDB1LCBpZHhfYWN0LmluZGV4KTsKKworICBpZHhfYWN0LldhaXRGb3JBY3Rpb25SZXF1ZXN0KCk7CisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworCisgIC8vIENoZWNrIHRoZSBuZXcgYWN0aW9uIGlzIHRoZSByaWdodCBvbmUuCisgIHVpbnQzMl90IHRlc3RfaWQgPSAwOworICBFWFBFQ1RfVFJVRShhY3Rpb25fcXVldWVfLkdldEN1cnJlbnRBY3Rpb25TdGF0ZShudWxscHRyLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmdGVzdF9pZCwgbnVsbHB0cikpOworCisgIC8vIFJ1biB0aGUgbmV4dCBhY3Rpb24gc28gaXQgY2FuIGFjY29tcGxpc2ggc2lnbmFsIGNvbXBsZXRpb24uCisgIGlkeF9hY3QuUnVuSXRlcmF0aW9uKCk7CisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworICBpZHhfYWN0LldhaXRGb3JTdG9wKHRlc3RfaWQpOworICBFWFBFQ1RfRVEoNXUsIGlkeF9hY3QuaW5kZXgpOworCisgIC8vIEVucXVldWUgYWN0aW9uIHRvIHBvc3QgaW5kZXguCisgIGFjdGlvbl9xdWV1ZV8uRW5xdWV1ZUFjdGlvbihNYWtlVGVzdEFjdGlvbkluZGV4KDMpKTsKKyAgRVhQRUNUX1RSVUUoYWN0aW9uczo6dGVzdF9hY3Rpb24uZ29hbC5GZXRjaExhdGVzdCgpKTsKKyAgRVhQRUNUX0VRKDN1LCBhY3Rpb25zOjp0ZXN0X2FjdGlvbi5nb2FsLT5wYXJhbXMpOworCisgIC8vIFJ1biB0aGUgbmV4dCBhY3Rpb24gc28gaXQgY2FuIGFjY29tcGxpc2ggc2lnbmFsIGNvbXBsZXRpb24uCisgIGlkeF9hY3QuUnVuSXRlcmF0aW9uKCk7CisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworICBpZHhfYWN0LldhaXRGb3JTdG9wKHRlc3RfaWQpOworICBFWFBFQ1RfRVEoM3UsIGlkeF9hY3QuaW5kZXgpOworfQorCisvLyBUZXN0cyB0aGF0IGFuIGFjdGlvbiB3aXRoIGEgc3RydWN0dXJlIHBhcmFtcyB3b3Jrcy4KK1RFU1RfRihBY3Rpb25UZXN0LCBTdHJ1Y3RQYXJhbVR5cGUpIHsKKyAgVGVzdEFjdG9yMk5vcCBub3BfYWN0KCZhY3Rpb25zOjp0ZXN0X2FjdGlvbjIpOworCisgIC8vIFRpY2sgYW4gZW1wdHkgcXVldWUgYW5kIG1ha2Ugc3VyZSBpdCB3YXMgbm90IHJ1bm5pbmcuCisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworICBFWFBFQ1RfRkFMU0UoYWN0aW9uX3F1ZXVlXy5SdW5uaW5nKCkpOworCisgIGFjdGlvbnM6Ok15UGFyYW1zIHA7CisgIHAucGFyYW0xID0gNS4wOworICBwLnBhcmFtMiA9IDc7CisKKyAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKE1ha2VUZXN0QWN0aW9uMk5PUChwKSk7CisgIG5vcF9hY3QuV2FpdEZvckFjdGlvblJlcXVlc3QoKTsKKworICAvLyBXZSBzdGFydGVkIGFuIGFjdGlvbiBhbmQgaXQgc2hvdWxkIGJlIHJ1bm5pbmcuCisgIEVYUEVDVF9UUlVFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKworICAvLyBUaWNrIGl0IGFuZCBtYWtlIHN1cmUgaXQgaXMgc3RpbGwgcnVubmluZy4KKyAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisgIEVYUEVDVF9UUlVFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKworICAvLyBSdW4gdGhlIGFjdGlvbiBzbyBpdCBjYW4gc2lnbmFsIGNvbXBsZXRpb24uCisgIG5vcF9hY3QuUnVuSXRlcmF0aW9uKCk7CisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworCisgIC8vIE1ha2Ugc3VyZSBpdCBzdG9wcGVkLgorICBFWFBFQ1RfRkFMU0UoYWN0aW9uX3F1ZXVlXy5SdW5uaW5nKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGNhbmNlbGxpbmcgYW4gYWN0aW9uIGJlZm9yZSB0aGUgbWVzc2FnZSBjb25maXJtaW5nIGl0IHN0YXJ0ZWQgaXMKKy8vIHJlY2VpdmVkIHdvcmtzLgorLy8gU2l0dWF0aW9ucyBsaWtlIHRoaXMgdXNlZCB0byBsb2NrIHRoZSBhY3Rpb24gcXVldWUgdXAgd2FpdGluZyBmb3IgYW4gYWN0aW9uCisvLyB0byByZXBvcnQgdGhhdCBpdCBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLgorLy8gVGhpcyBzaXR1YXRpb24gaXMga2luZCBvZiBhIHJhY2UgY29uZGl0aW9uLCBidXQgaXQgaGFwcGVucyB2ZXJ5IGNvbnNpc3RlbnRseQorLy8gd2hlbiBoaXR0aW5nIGJ1dHRvbnMgd2hpbGUgdGhlIHJvYm90IGlzIGluIHRlbGVvcC1kaXNhYmxlZC4gVG8gaGl0IHRoZSByYWNlCisvLyBjb25kaXRpb24gY29uc2lzdGVudGx5IGluIHRoZSB0ZXN0LCB0aGVyZSBhcmUgYSBjb3VwbGUgb2YgRXZlbnRzIGluc2VydGVkIGluCisvLyBiZXR3ZWVuIHZhcmlvdXMgdGhpbmdzIHJ1bm5pbmcuCitURVNUX0YoQWN0aW9uVGVzdCwgQ2FuY2VsQmVmb3JlU3RhcnQpIHsKKyAgRXZlbnQgdGhyZWFkX3JlYWR5LCByZWFkeV90b19zdGFydCwgcmVhZHlfdG9fc3RvcDsKKyAgOjpzdGQ6OnRocmVhZCBhY3Rpb25fdGhyZWFkKAorICAgICAgW3RoaXMsICZ0aHJlYWRfcmVhZHksICZyZWFkeV90b19zdGFydCwgJnJlYWR5X3RvX3N0b3BdKCkgeworICAgICAgICBUZXN0QWN0b3JOT1Agbm9wX2FjdCgmYWN0aW9uczo6dGVzdF9hY3Rpb24pOworICAgICAgICBub3BfYWN0LkluaXRpYWxpemUoKTsKKyAgICAgICAgdGhyZWFkX3JlYWR5LlNldCgpOworICAgICAgICByZWFkeV90b19zdGFydC5XYWl0KCk7CisgICAgICAgIG5vcF9hY3QuV2FpdEZvckFjdGlvblJlcXVlc3QoKTsKKyAgICAgICAgTE9HKERFQlVHLCAiZ290IGEgcmVxdWVzdCB0byBydW5cbiIpOworICAgICAgICBjb25zdCB1aW50MzJfdCBydW5uaW5nX2lkID0gbm9wX2FjdC5SdW5JdGVyYXRpb24oKTsKKyAgICAgICAgTE9HKERFQlVHLCAid2FpdGluZyBmb3IgJSIgUFJJeDMyICIgdG8gYmUgc3RvcHBlZFxuIiwgcnVubmluZ19pZCk7CisgICAgICAgIHJlYWR5X3RvX3N0b3AuU2V0KCk7CisgICAgICAgIG5vcF9hY3QuV2FpdEZvclN0b3AocnVubmluZ19pZCk7CisgICAgICB9KTsKKworICBhY3Rpb25fcXVldWVfLkNhbmNlbEFsbEFjdGlvbnMoKTsKKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKyAgdGhyZWFkX3JlYWR5LldhaXQoKTsKKyAgTE9HKERFQlVHLCAic3RhcnRpbmcgYWN0aW9uXG4iKTsKKyAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKE1ha2VUZXN0QWN0aW9uTk9QKCkpOworICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgIHJlYWR5X3RvX3N0YXJ0LlNldCgpOworICBMT0coREVCVUcsICJzdGFydGVkIGFjdGlvblxuIik7CisgIEVYUEVDVF9UUlVFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKyAgcmVhZHlfdG9fc3RvcC5XYWl0KCk7CisgIEVYUEVDVF9UUlVFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKyAgTE9HKERFQlVHLCAiYWN0aW9uIGlzIHJlYWR5IHRvIHN0b3BcbiIpOworCisgIGFjdGlvbl9xdWV1ZV8uVGljaygpOworICBhY3Rpb25fcXVldWVfLkNhbmNlbEFsbEFjdGlvbnMoKTsKKyAgRVhQRUNUX0ZBTFNFKGFjdGlvbl9xdWV1ZV8uUnVubmluZygpKTsKKyAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICBBU1NFUlRfRkFMU0UoYWN0aW9uX3F1ZXVlXy5SdW5uaW5nKCkpOworICBhY3Rpb25fdGhyZWFkLmpvaW4oKTsKKworICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgIEFTU0VSVF9GQUxTRShhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYWN0aW9ucworfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuY2MgYi9hb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjNmMzg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuY2MKQEAgLTAsMCArMSw3NSBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbW1vbiB7CituYW1lc3BhY2UgYWN0aW9ucyB7CisKK3ZvaWQgQWN0aW9uUXVldWU6OkVucXVldWVBY3Rpb24oOjpzdGQ6OnVuaXF1ZV9wdHI8QWN0aW9uPiBhY3Rpb24pIHsKKyAgaWYgKGN1cnJlbnRfYWN0aW9uXykgeworICAgIExPRyhJTkZPLCAiUXVldWVpbmcgYWN0aW9uLCBjYW5jZWxpbmcgcHJpb3JcbiIpOworICAgIGN1cnJlbnRfYWN0aW9uXy0+Q2FuY2VsKCk7CisgICAgbmV4dF9hY3Rpb25fID0gOjpzdGQ6Om1vdmUoYWN0aW9uKTsKKyAgfSBlbHNlIHsKKyAgICBMT0coSU5GTywgIlF1ZXVlaW5nIGFjdGlvblxuIik7CisgICAgY3VycmVudF9hY3Rpb25fID0gOjpzdGQ6Om1vdmUoYWN0aW9uKTsKKyAgICBjdXJyZW50X2FjdGlvbl8tPlN0YXJ0KCk7CisgIH0KK30KKwordm9pZCBBY3Rpb25RdWV1ZTo6Q2FuY2VsQ3VycmVudEFjdGlvbigpIHsKKyAgTE9HKElORk8sICJDYW5jZWxpbmcgY3VycmVudCBhY3Rpb25cbiIpOworICBpZiAoY3VycmVudF9hY3Rpb25fKSB7CisgICAgY3VycmVudF9hY3Rpb25fLT5DYW5jZWwoKTsKKyAgfQorfQorCit2b2lkIEFjdGlvblF1ZXVlOjpDYW5jZWxBbGxBY3Rpb25zKCkgeworICBMT0coREVCVUcsICJDYW5jZWxsaW5nIGFsbCBhY3Rpb25zXG4iKTsKKyAgaWYgKGN1cnJlbnRfYWN0aW9uXykgeworICAgIGN1cnJlbnRfYWN0aW9uXy0+Q2FuY2VsKCk7CisgIH0KKyAgbmV4dF9hY3Rpb25fLnJlc2V0KCk7Cit9CisKK3ZvaWQgQWN0aW9uUXVldWU6OlRpY2soKSB7CisgIGlmIChjdXJyZW50X2FjdGlvbl8pIHsKKyAgICBpZiAoIWN1cnJlbnRfYWN0aW9uXy0+UnVubmluZygpKSB7CisgICAgICBMT0coSU5GTywgIkFjdGlvbiBpcyBkb25lLlxuIik7CisgICAgICBjdXJyZW50X2FjdGlvbl8gPSA6OnN0ZDo6bW92ZShuZXh0X2FjdGlvbl8pOworICAgICAgaWYgKGN1cnJlbnRfYWN0aW9uXykgeworICAgICAgICBMT0coSU5GTywgIlJ1bm5pbmcgbmV4dCBhY3Rpb25cbiIpOworICAgICAgICBjdXJyZW50X2FjdGlvbl8tPlN0YXJ0KCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Jvb2wgQWN0aW9uUXVldWU6OlJ1bm5pbmcoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPihjdXJyZW50X2FjdGlvbl8pOyB9CisKK2Jvb2wgQWN0aW9uUXVldWU6OkdldEN1cnJlbnRBY3Rpb25TdGF0ZShib29sKiBoYXNfc3RhcnRlZCwgYm9vbCogc2VudF9zdGFydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHNlbnRfY2FuY2VsLCBib29sKiBpbnRlcnJ1cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcnVuX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvbGRfcnVuX3ZhbHVlKSB7CisgIGlmIChjdXJyZW50X2FjdGlvbl8pIHsKKyAgICBjdXJyZW50X2FjdGlvbl8tPkdldFN0YXRlKGhhc19zdGFydGVkLCBzZW50X3N0YXJ0ZWQsIHNlbnRfY2FuY2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQsIHJ1bl92YWx1ZSwgb2xkX3J1bl92YWx1ZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFjdGlvblF1ZXVlOjpHZXROZXh0QWN0aW9uU3RhdGUoYm9vbCogaGFzX3N0YXJ0ZWQsIGJvb2wqIHNlbnRfc3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBzZW50X2NhbmNlbCwgYm9vbCogaW50ZXJydXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHJ1bl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogb2xkX3J1bl92YWx1ZSkgeworICBpZiAobmV4dF9hY3Rpb25fKSB7CisgICAgbmV4dF9hY3Rpb25fLT5HZXRTdGF0ZShoYXNfc3RhcnRlZCwgc2VudF9zdGFydGVkLCBzZW50X2NhbmNlbCwgaW50ZXJydXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fdmFsdWUsIG9sZF9ydW5fdmFsdWUpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFjdGlvbnMKK30gIC8vIG5hbWVzcGFjZSBjb21tb24KK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cCBiL2Fvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWM5YzdhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwCkBAIC0wLDAgKzEsNzEgQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2FjdGlvbl9saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhY3Rpb25zLmNjJywKKyAgICAgICAgJ2FjdG9yLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVzJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cDpxdWV1ZV9sb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVzJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cDpxdWV1ZV9sb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdhY3Rpb25fcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ2FjdGlvbnMucSddLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9wYXRoJzogJ2Fvcy9jb21tb24vYWN0aW9ucycsCisgICAgICB9LAorICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Rlc3RfYWN0aW9uX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWyd0ZXN0X2FjdGlvbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAnYW9zL2NvbW1vbi9hY3Rpb25zJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnYWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJ2FjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2FjdGlvbl90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhY3Rpb25fdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdhY3Rpb25fbGliJywKKyAgICAgICAgJ3Rlc3RfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90ZXN0dXRpbHMnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVzJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJ2FjdGlvbl9xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6ZXZlbnQnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuaCBiL2Fvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4ODkwMwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmgKQEAgLTAsMCArMSwzNTggQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9BQ1RJT05TX0FDVElPTlNfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9BQ1RJT05TX0FDVElPTlNfSF8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgY29tbW9uIHsKK25hbWVzcGFjZSBhY3Rpb25zIHsKKworY2xhc3MgQWN0aW9uOworCisvLyBBIHF1ZXVlIHdoaWNoIHF1ZXVlcyBBY3Rpb25zLCB2ZXJpZmllcyBhIHNpbmdsZSBhY3Rpb24gaXMgcnVubmluZywgYW5kCisvLyBjYW5jZWxzIEFjdGlvbnMuCitjbGFzcyBBY3Rpb25RdWV1ZSB7CisgcHVibGljOgorICAvLyBRdWV1ZXMgdXAgYW4gYWN0aW9uIGZvciBzZW5kaW5nLgorICB2b2lkIEVucXVldWVBY3Rpb24oOjpzdGQ6OnVuaXF1ZV9wdHI8QWN0aW9uPiBhY3Rpb24pOworCisgIC8vIENhbmNlbHMgdGhlIGN1cnJlbnQgYWN0aW9uLCBhbmQgcnVucyB0aGUgbmV4dCBvbmUgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lIGhhcworICAvLyBmaW5pc2hlZCBhbmQgdGhlIGFjdGlvbiBxdWV1ZSB0aWNrcyBhZ2Fpbi4KKyAgdm9pZCBDYW5jZWxDdXJyZW50QWN0aW9uKCk7CisKKyAgLy8gQ2FuY2VscyBhbGwgcnVubmluZyBhY3Rpb25zLgorICB2b2lkIENhbmNlbEFsbEFjdGlvbnMoKTsKKworICAvLyBSdW5zIHRoZSBuZXh0IGFjdGlvbiB3aGVuIHRoZSBjdXJyZW50IG9uZSBpcyBmaW5pc2hlZCBydW5uaW5nIGFuZCBwb2xscyB0aGUKKyAgLy8gcnVubmluZyBhY3Rpb24gc3RhdGUgZm9yIHVzZSBieSBSdW5uaW5nLgorICB2b2lkIFRpY2soKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgYW55IGFjdGlvbiBpcyBydW5uaW5nIG9yIGNvdWxkIGJlIHJ1bm5pbmcuCisgIGJvb2wgUnVubmluZygpOworCisgIC8vIFJldHJpZXZlcyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGN1cnJlbnQgYWN0aW9uIGZvciB0ZXN0aW5nLgorICAvLyBTZWUgY29tbWVudHMgb24gdGhlIHByaXZhdGUgbWVtYmVycyBvZiBUeXBlZEFjdGlvbjxULCBTPiBmb3IgZGV0YWlscy4KKyAgYm9vbCBHZXRDdXJyZW50QWN0aW9uU3RhdGUoYm9vbCogaGFzX3N0YXJ0ZWQsIGJvb2wqIHNlbnRfc3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogc2VudF9jYW5jZWwsIGJvb2wqIGludGVycnVwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcnVuX3ZhbHVlLCB1aW50MzJfdCogb2xkX3J1bl92YWx1ZSk7CisKKyAgLy8gUmV0cmlldmVzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbmV4dCBhY3Rpb24gZm9yIHRlc3RpbmcuCisgIC8vIFNlZSBjb21tZW50cyBvbiB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mIFR5cGVkQWN0aW9uPFQsIFM+IGZvciBkZXRhaWxzLgorICBib29sIEdldE5leHRBY3Rpb25TdGF0ZShib29sKiBoYXNfc3RhcnRlZCwgYm9vbCogc2VudF9zdGFydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBzZW50X2NhbmNlbCwgYm9vbCogaW50ZXJydXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBydW5fdmFsdWUsIHVpbnQzMl90KiBvbGRfcnVuX3ZhbHVlKTsKKworIHByaXZhdGU6CisgIDo6c3RkOjp1bmlxdWVfcHRyPEFjdGlvbj4gY3VycmVudF9hY3Rpb25fOworICA6OnN0ZDo6dW5pcXVlX3B0cjxBY3Rpb24+IG5leHRfYWN0aW9uXzsKK307CisKKy8vIFRoZSBiYXNpYyBpbnRlcmZhY2UgYW4gQWN0aW9uUXVldWUgY2FuIGFjY2Vzcy4KK2NsYXNzIEFjdGlvbiB7CisgcHVibGljOgorICB2aXJ0dWFsIH5BY3Rpb24oKSB7fQorCisgIC8vIENhbmNlbHMgdGhlIGFjdGlvbi4KKyAgdm9pZCBDYW5jZWwoKSB7IERvQ2FuY2VsKCk7IH0KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgY3VycmVudGx5IHJ1bm5pbmcuCisgIGJvb2wgUnVubmluZygpIHsgcmV0dXJuIERvUnVubmluZygpOyB9CisgIC8vIFN0YXJ0cyB0aGUgYWN0aW9uLgorICB2b2lkIFN0YXJ0KCkgeyBEb1N0YXJ0KCk7IH0KKworICAvLyBXYWl0cyB1bnRpbCB0aGUgYWN0aW9uIGhhcyBmaW5pc2hlZC4KKyAgdm9pZCBXYWl0VW50aWxEb25lKCkgeyBEb1dhaXRVbnRpbERvbmUoKTsgfQorCisgIC8vIFJ1biBhbGwgdGhlIGNoZWNrcyBmb3Igb25lIGl0ZXJhdGlvbiBvZiB3YWl0aW5nLiBXaWxsIHJldHVybiB0cnVlIHdoZW4gdGhlCisgIC8vIGFjdGlvbiBoYXMgY29tcGxldGVkLCBzdWNjZXNzZnVsbHkgb3Igbm90LiBUaGlzIGlzIG5vbi1ibG9ja2luZy4KKyAgYm9vbCBDaGVja0l0ZXJhdGlvbigpIHsgcmV0dXJuIERvQ2hlY2tJdGVyYXRpb24oZmFsc2UpOyB9CisKKyAgLy8gUmV0cmlldmVzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgYWN0aW9uIGZvciB0ZXN0aW5nLgorICAvLyBTZWUgY29tbWVudHMgb24gdGhlIHByaXZhdGUgbWVtYmVycyBvZiBUeXBlZEFjdGlvbjxULCBTPiBmb3IgZGV0YWlscy4KKyAgdm9pZCBHZXRTdGF0ZShib29sKiBoYXNfc3RhcnRlZCwgYm9vbCogc2VudF9zdGFydGVkLCBib29sKiBzZW50X2NhbmNlbCwKKyAgICAgICAgICAgICAgICBib29sKiBpbnRlcnJ1cHRlZCwgdWludDMyX3QqIHJ1bl92YWx1ZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCogb2xkX3J1bl92YWx1ZSkgeworICAgIERvR2V0U3RhdGUoaGFzX3N0YXJ0ZWQsIHNlbnRfc3RhcnRlZCwgc2VudF9jYW5jZWwsIGludGVycnVwdGVkLCBydW5fdmFsdWUsCisgICAgICAgICAgICAgICBvbGRfcnVuX3ZhbHVlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQ2FuY2VscyB0aGUgYWN0aW9uLgorICB2aXJ0dWFsIHZvaWQgRG9DYW5jZWwoKSA9IDA7CisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIHJ1bm5pbmcgb3Igd2UgZG9uJ3QgaGF2ZSBhbiBpbml0aWFsIHJlc3BvbnNlCisgIC8vIGJhY2sgZnJvbSBpdCB0byBzaWduYWwgd2hldGhlciBvciBub3QgaXQgaXMgcnVubmluZy4KKyAgdmlydHVhbCBib29sIERvUnVubmluZygpID0gMDsKKyAgLy8gU3RhcnRzIHRoZSBhY3Rpb24gaWYgYSBnb2FsIGhhcyBiZWVuIGNyZWF0ZWQuCisgIHZpcnR1YWwgdm9pZCBEb1N0YXJ0KCkgPSAwOworICAvLyBCbG9ja3MgdW50aWwgY29tcGxldGUuCisgIHZpcnR1YWwgdm9pZCBEb1dhaXRVbnRpbERvbmUoKSA9IDA7CisgIC8vIFVwZGF0ZXMgc3RhdHVzIGZvciBvbmUgY3ljbGUgb2Ygd2FpdGluZworICB2aXJ0dWFsIGJvb2wgRG9DaGVja0l0ZXJhdGlvbihib29sIGJsb2NraW5nKSA9IDA7CisgIC8vIEZvciB0ZXN0aW5nIHdlIHdpbGwgbmVlZCB0byBnZXQgdGhlIGludGVybmFsIHN0YXRlLgorICAvLyBTZWUgY29tbWVudHMgb24gdGhlIHByaXZhdGUgbWVtYmVycyBvZiBUeXBlZEFjdGlvbjxULCBTPiBmb3IgZGV0YWlscy4KKyAgdmlydHVhbCB2b2lkIERvR2V0U3RhdGUoYm9vbCogaGFzX3N0YXJ0ZWQsIGJvb2wqIHNlbnRfc3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogc2VudF9jYW5jZWwsIGJvb2wqIGludGVycnVwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcnVuX3ZhbHVlLCB1aW50MzJfdCogb2xkX3J1bl92YWx1ZSkgPSAwOworfTsKKworLy8gVGVtcGxhdGVkIHN1YmNsYXNzIHRvIGhvbGQgdGhlIHR5cGUgaW5mb3JtYXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgcHVibGljOgorICAvLyBBIGNvbnZlbmllbnQgd2F5IHRvIHJlZmVyIHRvIHRoZSB0eXBlIG9mIG91ciBnb2Fscy4KKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoCisgICAgICAqKHN0YXRpY19jYXN0PFQqPihudWxscHRyKS0+Z29hbC5NYWtlTWVzc2FnZSgpLmdldCgpKSk+Ojp0eXBlIEdvYWxUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTwKKyAgICAgIGRlY2x0eXBlKHN0YXRpY19jYXN0PEdvYWxUeXBlKj4obnVsbHB0ciktPnBhcmFtcyk+Ojp0eXBlIFBhcmFtVHlwZTsKKworICBUeXBlZEFjdGlvbihUKiBxdWV1ZV9ncm91cCwgY29uc3QgUGFyYW1UeXBlICZwYXJhbXMpCisgICAgICA6IHF1ZXVlX2dyb3VwXyhxdWV1ZV9ncm91cCksCisgICAgICAgIGdvYWxfKHF1ZXVlX2dyb3VwXy0+Z29hbC5NYWtlTWVzc2FnZSgpKSwKKyAgICAgICAgLy8gVGhpcyBhZGRzIDEgdG8gdGhlIGNvdW50ZXIgKGF0b21pY2FsbHkgYmVjYXVzZSBpdCdzIHBvdGVudGlhbGx5CisgICAgICAgIC8vIHNoYXJlZCBhY3Jvc3MgdGhyZWFkcykgYW5kIHRoZW4gYml0d2lzZS1PUnMgdGhlIGJvdHRvbSBvZiB0aGUgUElEIHRvCisgICAgICAgIC8vIGRpZmZlcmVudGlhdGUgaXQgZnJvbSBvdGhlciBwcm9jZXNzZXMncyB2YWx1ZXMgKGllIGEgdW5pcXVlIGlkKS4KKyAgICAgICAgcnVuX3ZhbHVlXyhydW5fY291bnRlcl8uZmV0Y2hfYWRkKDEsIDo6c3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgfAorICAgICAgICAgICAgICAgICAgICgoZ2V0cGlkKCkgJiAweEZGRkYpIDw8IDE2KSksCisgICAgICAgIHBhcmFtc18ocGFyYW1zKSB7CisgICAgTE9HKElORk8sICJBY3Rpb24gJSIgUFJJeDMyICIgY3JlYXRlZCBvbiBxdWV1ZSAlc1xuIiwgcnVuX3ZhbHVlXywKKyAgICAgICAgcXVldWVfZ3JvdXBfLT5nb2FsLm5hbWUoKSk7CisgICAgLy8gQ2xlYXIgb3V0IGFueSBvbGQgc3RhdHVzIG1lc3NhZ2VzIGZyb20gYmVmb3JlIG5vdy4KKyAgICBxdWV1ZV9ncm91cF8tPnN0YXR1cy5GZXRjaExhdGVzdCgpOworICAgIGlmIChxdWV1ZV9ncm91cF8tPnN0YXR1cy5nZXQoKSkgeworICAgICAgTE9HX1NUUlVDVChERUJVRywgImhhdmUgc3RhdHVzIiwgKnF1ZXVlX2dyb3VwXy0+c3RhdHVzKTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIH5UeXBlZEFjdGlvbigpIHsKKyAgICBMT0coREVCVUcsICJDYWxsaW5nIGRlc3RydWN0b3Igb2YgJSIgUFJJeDMyICJcbiIsIHJ1bl92YWx1ZV8pOworICAgIERvQ2FuY2VsKCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGdvYWwgdGhhdCB3aWxsIGJlIHNlbnQgd2hlbiB0aGUgYWN0aW9uIGlzIHNlbnQuCisgIEdvYWxUeXBlKiBHZXRHb2FsKCkgeyByZXR1cm4gZ29hbF8uZ2V0KCk7IH0KKworIHByaXZhdGU6CisgIHZvaWQgRG9DYW5jZWwoKSBvdmVycmlkZTsKKworICBib29sIERvUnVubmluZygpIG92ZXJyaWRlOworCisgIHZvaWQgRG9XYWl0VW50aWxEb25lKCkgb3ZlcnJpZGU7CisKKyAgYm9vbCBEb0NoZWNrSXRlcmF0aW9uKGJvb2wgYmxvY2tpbmcpOworCisgIC8vIFNldHMgdGhlIHN0YXJ0ZWQgZmxhZyAoYWxzbyBwb3NzaWJseSB0aGUgaW50ZXJydXB0ZWQgZmxhZykuCisgIHZvaWQgQ2hlY2tTdGFydGVkKCk7CisKKyAgLy8gQ2hlY2tzIGZvciBpbnRlcnJ1cHQuCisgIHZvaWQgQ2hlY2tJbnRlcnJ1cHRlZCgpOworCisgIHZvaWQgRG9TdGFydCgpIG92ZXJyaWRlOworCisgIHZvaWQgRG9HZXRTdGF0ZShib29sKiBoYXNfc3RhcnRlZCwgYm9vbCogc2VudF9zdGFydGVkLCBib29sKiBzZW50X2NhbmNlbCwKKyAgICAgICAgICAgICAgICAgIGJvb2wqIGludGVycnVwdGVkLCB1aW50MzJfdCogcnVuX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG9sZF9ydW5fdmFsdWUpIG92ZXJyaWRlIHsKKyAgICBpZiAoaGFzX3N0YXJ0ZWQgIT0gbnVsbHB0cikgKmhhc19zdGFydGVkID0gaGFzX3N0YXJ0ZWRfOworICAgIGlmIChzZW50X3N0YXJ0ZWQgIT0gbnVsbHB0cikgKnNlbnRfc3RhcnRlZCA9IHNlbnRfc3RhcnRlZF87CisgICAgaWYgKHNlbnRfY2FuY2VsICE9IG51bGxwdHIpICpzZW50X2NhbmNlbCA9IHNlbnRfY2FuY2VsXzsKKyAgICBpZiAoaW50ZXJydXB0ZWQgIT0gbnVsbHB0cikgKmludGVycnVwdGVkID0gaW50ZXJydXB0ZWRfOworICAgIGlmIChydW5fdmFsdWUgIT0gbnVsbHB0cikgKnJ1bl92YWx1ZSA9IHJ1bl92YWx1ZV87CisgICAgaWYgKG9sZF9ydW5fdmFsdWUgIT0gbnVsbHB0cikgKm9sZF9ydW5fdmFsdWUgPSBvbGRfcnVuX3ZhbHVlXzsKKyAgfQorCisgIFQqIGNvbnN0IHF1ZXVlX2dyb3VwXzsKKyAgOjphb3M6OlNjb3BlZE1lc3NhZ2VQdHI8R29hbFR5cGU+IGdvYWxfOworCisgIC8vIFRyYWNrIGlmIHdlIGhhdmUgc2VlbiBhIHJlc3BvbnNlIHRvIHRoZSBzdGFydCBtZXNzYWdlLgorICBib29sIGhhc19zdGFydGVkXyA9IGZhbHNlOworICAvLyBUcmFjayBpZiB3ZSBoYXZlIHNlbnQgYW4gaW5pdGlhbCBzdGFydCBtZXNzYWdlLgorICBib29sIHNlbnRfc3RhcnRlZF8gPSBmYWxzZTsKKworICBib29sIHNlbnRfY2FuY2VsXyA9IGZhbHNlOworCisgIC8vIEdldHMgc2V0IHRvIHRydWUgaWYgd2UgZXZlciBzZWUgc29tZWJvZHkgZWxzZSdzIHZhbHVlIGluIHJ1bm5pbmcuCisgIGJvb2wgaW50ZXJydXB0ZWRfID0gZmFsc2U7CisKKyAgLy8gVGhlIHZhbHVlIHdlJ3JlIGdvaW5nIHRvIHVzZSBmb3IgZ29hbC5ydW4gZXRjLgorICBjb25zdCB1aW50MzJfdCBydW5fdmFsdWVfOworCisgIC8vIGZsYWcgcGFzc2VkIHRvIGFjdGlvbiBpbiBvcmRlciB0byBoYXZlIGRpZmZlcmluZyB0eXBlcworICBjb25zdCBQYXJhbVR5cGUgcGFyYW1zXzsKKworICAvLyBUaGUgb2xkIHZhbHVlIGZvciBydW5uaW5nIHRoYXQgd2UgbWF5IGhhdmUgc2Vlbi4gSWYgd2Ugc2VlIGFueSB2YWx1ZSBvdGhlcgorICAvLyB0aGFuIHRoaXMgb3IgcnVuX3ZhbHVlXywgc29tZWJvZHkgZWxzZSBnb3QgaW4gdGhlIHdheSBhbmQgd2UncmUgZG9uZS4gMCBpZgorICAvLyB0aGVyZSB3YXMgbm90aGluZyB0aGVyZSB0byBzdGFydCB3aXRoLiBPbmx5IHZhbGlkIGFmdGVyIHNlbnRfc3RhcnRlZF8KKyAgLy8gY2hhbmdlcyB0byB0cnVlLgorICB1aW50MzJfdCBvbGRfcnVuX3ZhbHVlXzsKKworICBzdGF0aWMgOjpzdGQ6OmF0b21pYzx1aW50MTZfdD4gcnVuX2NvdW50ZXJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cis6OnN0ZDo6YXRvbWljPHVpbnQxNl90PiBUeXBlZEFjdGlvbjxUPjo6cnVuX2NvdW50ZXJfezB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVHlwZWRBY3Rpb248VD46OkRvQ2FuY2VsKCkgeworICBpZiAoIXNlbnRfc3RhcnRlZF8pIHsKKyAgICBMT0coSU5GTywgIkFjdGlvbiAlIiBQUkl4MzIgIiBvbiBxdWV1ZSAlcyB3YXMgbmV2ZXIgc3RhcnRlZFxuIiwgcnVuX3ZhbHVlXywKKyAgICAgICAgcXVldWVfZ3JvdXBfLT5nb2FsLm5hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKGludGVycnVwdGVkXykgeworICAgICAgTE9HKElORk8sCisgICAgICAgICAgIkFjdGlvbiAlIiBQUkl4MzIgIiBvbiBxdWV1ZSAlcyB3YXMgaW50ZXJydXB0ZWQgLT4gbm90IGNhbmNlbGxpbmdcbiIsCisgICAgICAgICAgcnVuX3ZhbHVlXywgcXVldWVfZ3JvdXBfLT5nb2FsLm5hbWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzZW50X2NhbmNlbF8pIHsKKyAgICAgICAgTE9HKElORk8sICJBY3Rpb24gJSIgUFJJeDMyICIgb24gcXVldWUgJXMgYWxyZWFkeSBjYW5jZWxsZWRcbiIsCisgICAgICAgICAgICBydW5fdmFsdWVfLCBxdWV1ZV9ncm91cF8tPmdvYWwubmFtZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPLCAiQ2FuY2VsaW5nIGFjdGlvbiAlIiBQUkl4MzIgIiBvbiBxdWV1ZSAlc1xuIiwgcnVuX3ZhbHVlXywKKyAgICAgICAgICAgIHF1ZXVlX2dyb3VwXy0+Z29hbC5uYW1lKCkpOworICAgICAgICBxdWV1ZV9ncm91cF8tPmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkucnVuKDApLlNlbmQoKTsKKyAgICAgICAgc2VudF9jYW5jZWxfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIFR5cGVkQWN0aW9uPFQ+OjpEb1J1bm5pbmcoKSB7CisgIGlmICghc2VudF9zdGFydGVkXykgeworICAgIExPRyhERUJVRywgImhhdmVuJ3Qgc2VudCBzdGFydCBtZXNzYWdlIHlldFxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChoYXNfc3RhcnRlZF8pIHsKKyAgICBxdWV1ZV9ncm91cF8tPnN0YXR1cy5GZXRjaE5leHQoKTsKKyAgICBDaGVja0ludGVycnVwdGVkKCk7CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKHF1ZXVlX2dyb3VwXy0+c3RhdHVzLkZldGNoTmV4dCgpKSB7CisgICAgICBMT0dfU1RSVUNUKERFQlVHLCAiZ290IHN0YXR1cyIsICpxdWV1ZV9ncm91cF8tPnN0YXR1cyk7CisgICAgICBDaGVja1N0YXJ0ZWQoKTsKKyAgICAgIGlmIChoYXNfc3RhcnRlZF8pIENoZWNrSW50ZXJydXB0ZWQoKTsKKyAgICB9CisgIH0KKyAgaWYgKGludGVycnVwdGVkXykgcmV0dXJuIGZhbHNlOworICAvLyBXZSd2ZSBhc2tlZCBpdCB0byBzdGFydCBidXQgaGF2ZW4ndCBnb3R0ZW4gY29uZmlybWF0aW9uIHRoYXQgaXQncyBzdGFydGVkCisgIC8vIHlldC4KKyAgaWYgKCFoYXNfc3RhcnRlZF8pIHJldHVybiB0cnVlOworICByZXR1cm4gcXVldWVfZ3JvdXBfLT5zdGF0dXMuZ2V0KCkgJiYKKyAgICAgICAgIHF1ZXVlX2dyb3VwXy0+c3RhdHVzLT5ydW5uaW5nID09IHJ1bl92YWx1ZV87Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBUeXBlZEFjdGlvbjxUPjo6RG9XYWl0VW50aWxEb25lKCkgeworICBDSEVDSyhzZW50X3N0YXJ0ZWRfKTsKKyAgcXVldWVfZ3JvdXBfLT5zdGF0dXMuRmV0Y2hOZXh0KCk7CisgIExPR19TVFJVQ1QoREVCVUcsICJnb3Qgc3RhdHVzIiwgKnF1ZXVlX2dyb3VwXy0+c3RhdHVzKTsKKyAgQ2hlY2tJbnRlcnJ1cHRlZCgpOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChEb0NoZWNrSXRlcmF0aW9uKHRydWUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBUeXBlZEFjdGlvbjxUPjo6RG9DaGVja0l0ZXJhdGlvbihib29sIGJsb2NraW5nKSB7CisgIENIRUNLKHNlbnRfc3RhcnRlZF8pOworICBpZiAoaW50ZXJydXB0ZWRfKSByZXR1cm4gdHJ1ZTsKKyAgQ2hlY2tTdGFydGVkKCk7CisgIGlmIChibG9ja2luZykgeworICAgIHF1ZXVlX2dyb3VwXy0+c3RhdHVzLkZldGNoTmV4dEJsb2NraW5nKCk7CisgICAgTE9HX1NUUlVDVChERUJVRywgImdvdCBzdGF0dXMiLCAqcXVldWVfZ3JvdXBfLT5zdGF0dXMpOworICB9IGVsc2UgeworICAgIGlmICghcXVldWVfZ3JvdXBfLT5zdGF0dXMuRmV0Y2hOZXh0KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTE9HX1NUUlVDVChERUJVRywgImdvdCBzdGF0dXMiLCAqcXVldWVfZ3JvdXBfLT5zdGF0dXMpOworICB9CisgIENoZWNrU3RhcnRlZCgpOworICBDaGVja0ludGVycnVwdGVkKCk7CisgIGlmIChoYXNfc3RhcnRlZF8gJiYgKHF1ZXVlX2dyb3VwXy0+c3RhdHVzLmdldCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX2dyb3VwXy0+c3RhdHVzLT5ydW5uaW5nICE9IHJ1bl92YWx1ZV8pKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVHlwZWRBY3Rpb248VD46OkNoZWNrU3RhcnRlZCgpIHsKKyAgaWYgKGhhc19zdGFydGVkXykgcmV0dXJuOworICBpZiAocXVldWVfZ3JvdXBfLT5zdGF0dXMuZ2V0KCkpIHsKKyAgICBpZiAocXVldWVfZ3JvdXBfLT5zdGF0dXMtPnJ1bm5pbmcgPT0gcnVuX3ZhbHVlXyB8fAorICAgICAgICAocXVldWVfZ3JvdXBfLT5zdGF0dXMtPnJ1bm5pbmcgPT0gMCAmJgorICAgICAgICAgcXVldWVfZ3JvdXBfLT5zdGF0dXMtPmxhc3RfcnVubmluZyA9PSBydW5fdmFsdWVfKSkgeworICAgICAgLy8gSXQncyBjdXJyZW50bHkgcnVubmluZyBvdXIgaW5zdGFuY2UuCisgICAgICBoYXNfc3RhcnRlZF8gPSB0cnVlOworICAgICAgTE9HKElORk8sICJBY3Rpb24gJSIgUFJJeDMyICIgb24gcXVldWUgJXMgaGFzIGJlZW4gc3RhcnRlZFxuIiwKKyAgICAgICAgICBydW5fdmFsdWVfLCBxdWV1ZV9ncm91cF8tPmdvYWwubmFtZSgpKTsKKyAgICB9IGVsc2UgaWYgKG9sZF9ydW5fdmFsdWVfICE9IDAgJiYKKyAgICAgICAgICAgICAgIHF1ZXVlX2dyb3VwXy0+c3RhdHVzLT5ydW5uaW5nID09IG9sZF9ydW5fdmFsdWVfKSB7CisgICAgICBMT0coREVCVUcsICJzdGlsbCBydW5uaW5nIG9sZCBpbnN0YW5jZSAlIiBQUkl4MzIgIlxuIiwgb2xkX3J1bl92YWx1ZV8pOworICAgIH0gZWxzZSB7CisgICAgICBMT0coV0FSTklORywgIkFjdGlvbiAlIiBQUkl4MzIgIiBvbiBxdWV1ZSAlcyBpbnRlcnJ1cHRlZCBieSAlIiBQUkl4MzIKKyAgICAgICAgICAgICAgICAgICAiIGJlZm9yZSBzdGFydGluZ1xuIiwKKyAgICAgICAgICBydW5fdmFsdWVfLCBxdWV1ZV9ncm91cF8tPmdvYWwubmFtZSgpLCBxdWV1ZV9ncm91cF8tPnN0YXR1cy0+cnVubmluZyk7CisgICAgICBoYXNfc3RhcnRlZF8gPSB0cnVlOworICAgICAgaW50ZXJydXB0ZWRfID0gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgTE9HKFdBUk5JTkcsICJObyBzdGF0dXMgbWVzc2FnZSByZWNpZXZlZC5cbiIpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBUeXBlZEFjdGlvbjxUPjo6Q2hlY2tJbnRlcnJ1cHRlZCgpIHsKKyAgaWYgKCFpbnRlcnJ1cHRlZF8gJiYgaGFzX3N0YXJ0ZWRfICYmIHF1ZXVlX2dyb3VwXy0+c3RhdHVzLmdldCgpKSB7CisgICAgaWYgKHF1ZXVlX2dyb3VwXy0+c3RhdHVzLT5ydW5uaW5nICE9IDAgJiYKKyAgICAgICAgcXVldWVfZ3JvdXBfLT5zdGF0dXMtPnJ1bm5pbmcgIT0gcnVuX3ZhbHVlXykgeworICAgICAgTE9HKFdBUk5JTkcsICJBY3Rpb24gJSIgUFJJeDMyICIgb24gcXVldWUgJXMgaW50ZXJydXB0ZWQgYnkgJSIgUFJJeDMyCisgICAgICAgICAgICAgICAgICAgIiBhZnRlciBzdGFydGluZ1xuIiwKKyAgICAgICAgICBydW5fdmFsdWVfLCBxdWV1ZV9ncm91cF8tPmdvYWwubmFtZSgpLCBxdWV1ZV9ncm91cF8tPnN0YXR1cy0+cnVubmluZyk7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBUeXBlZEFjdGlvbjxUPjo6RG9TdGFydCgpIHsKKyAgaWYgKGdvYWxfKSB7CisgICAgTE9HKElORk8sICJTdGFydGluZyBhY3Rpb24gJSIgUFJJeDMyICJcbiIsIHJ1bl92YWx1ZV8pOworICAgIGdvYWxfLT5ydW4gPSBydW5fdmFsdWVfOworICAgIGdvYWxfLT5wYXJhbXMgPSBwYXJhbXNfOworICAgIHNlbnRfc3RhcnRlZF8gPSB0cnVlOworICAgIGlmICghZ29hbF8uU2VuZCgpKSB7CisgICAgICBMT0coRVJST1IsICJzZW5kaW5nIGdvYWwgZm9yIGFjdGlvbiAlIiBQUkl4MzIgIiBvbiBxdWV1ZSAlcyBmYWlsZWRcbiIsCisgICAgICAgICAgcnVuX3ZhbHVlXywgcXVldWVfZ3JvdXBfLT5nb2FsLm5hbWUoKSk7CisgICAgICAvLyBEb24ndCB3YWl0IHRvIHNlZSBhIG1lc3NhZ2Ugd2l0aCBpdC4KKyAgICAgIGhhc19zdGFydGVkXyA9IHRydWU7CisgICAgfQorICAgIHF1ZXVlX2dyb3VwXy0+c3RhdHVzLkZldGNoTmV4dCgpOworICAgIGlmIChxdWV1ZV9ncm91cF8tPnN0YXR1cy5nZXQoKSkgeworICAgICAgTE9HX1NUUlVDVChERUJVRywgImdvdCBzdGF0dXMiLCAqcXVldWVfZ3JvdXBfLT5zdGF0dXMpOworICAgIH0KKyAgICBpZiAocXVldWVfZ3JvdXBfLT5zdGF0dXMuZ2V0KCkgJiYgcXVldWVfZ3JvdXBfLT5zdGF0dXMtPnJ1bm5pbmcgIT0gMCkgeworICAgICAgb2xkX3J1bl92YWx1ZV8gPSBxdWV1ZV9ncm91cF8tPnN0YXR1cy0+cnVubmluZzsKKyAgICAgIExPRyhJTkZPLCAiQWN0aW9uICUiIFBSSXgzMiAiIG9uIHF1ZXVlICVzIGFscmVhZHkgcnVubmluZ1xuIiwKKyAgICAgICAgICBvbGRfcnVuX3ZhbHVlXywgcXVldWVfZ3JvdXBfLT5nb2FsLm5hbWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG9sZF9ydW5fdmFsdWVfID0gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgTE9HKFdBUk5JTkcsICJBY3Rpb24gJSIgUFJJeDMyICIgb24gcXVldWUgJXMgYWxyZWFkeSBzdGFydGVkXG4iLCBydW5fdmFsdWVfLAorICAgICAgICBxdWV1ZV9ncm91cF8tPmdvYWwubmFtZSgpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYWN0aW9ucworfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgorfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fQUNUSU9OU19BQ1RJT05TX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5xIGIvYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzA0NmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMucQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGFvcy5jb21tb24uYWN0aW9uczsKKworaW50ZXJmYWNlIFN0YXR1c0ludGVyZmFjZSB7CisgIC8vIDAgaWYgdGhlIGFjdGlvbiBpc24ndCBydW5uaW5nIG9yIHRoZSB2YWx1ZSBmcm9tIGdvYWwucnVuLgorICB1aW50MzJfdCBydW5uaW5nOworfTsKKworaW50ZXJmYWNlIEdvYWxJbnRlcmZhY2UgeworICAvLyAwIHRvIHN0b3Agb3IgYW4gYXJiaXRyYXJ5IHZhbHVlIHRvIHB1dCBpbiBzdGF0dXMucnVubmluZy4KKyAgdWludDMyX3QgcnVuOworfTsKKworbWVzc2FnZSBTdGF0dXMgeworICAvLyBUaGUgcnVuIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBvciAwLgorICB1aW50MzJfdCBydW5uaW5nOworICAvLyBBIHJ1biB2YWx1ZSB3ZSB3ZXJlIHByZXZpb3VzbHkgcnVubmluZyBvciAwLgorICB1aW50MzJfdCBsYXN0X3J1bm5pbmc7CisgIC8vIElmIGZhbHNlIHRoZSBhY3Rpb24gZmFpbGVkIHRvIGNvbXBsZXRlIGFuZCBtYXkgYmUgaW4gYSBiYWQgc3RhdGUsCisgIC8vIHRoaXMgaXMgYSBjcml0aWNhbCBwcm9ibGVtIG5vdCBhIGNhbmNlbGxhdGlvbi4KKyAgYm9vbCBzdWNjZXNzOworfTsKKworbWVzc2FnZSBHb2FsIHsKKyAgLy8gVGhlIHVuaXF1ZSB2YWx1ZSB0byBwdXQgaW50byBzdGF0dXMucnVubmluZyB3aGlsZSBydW5uaW5nIHRoaXMgaW5zdGFuY2Ugb3IKKyAgLy8gMCB0byBjYW5jZWwuCisgIHVpbnQzMl90IHJ1bjsKKyAgLy8gRGVmYXVsdCBwYXJhbWV0ZXIuICBUaGUgbW9yZSB1c2VmdWwgdGhpbmcgdG8gZG8gd291bGQgYmUgdG8gZGVmaW5lIHlvdXIgb3duCisgIC8vIGdvYWwgdHlwZSB0byBjaGFuZ2UgcGFyYW0gdG8gYSB1c2VmdWwgc3RydWN0dXJlLgorICBkb3VibGUgcGFyYW1zOworfTsKKworaW50ZXJmYWNlIEFjdGlvblF1ZXVlR3JvdXAgeworICBxdWV1ZSBTdGF0dXMgc3RhdHVzOworICBxdWV1ZSBHb2FsIGdvYWw7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9hY3Rpb25zL2FjdG9yLmNjIGIvYW9zL2NvbW1vbi9hY3Rpb25zL2FjdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNmJlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuY2MKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdG9yLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbW1vbiB7CituYW1lc3BhY2UgYWN0aW9ucyB7CisKK30gIC8vIG5hbWVzcGFjZSBhY3Rpb25zCit9ICAvLyBuYW1lc3BhY2UgY29tbW9uCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaCBiL2Fvcy9jb21tb24vYWN0aW9ucy9hY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTAyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaApAQCAtMCwwICsxLDI0NyBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX0FDVElPTlNfQUNUT1JfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9BQ1RJT05TX0FDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbW1vbiB7CituYW1lc3BhY2UgYWN0aW9ucyB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgQWN0b3JCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKAorICAgICAgKihzdGF0aWNfY2FzdDxUKj4obnVsbHB0ciktPmdvYWwuTWFrZU1lc3NhZ2UoKS5nZXQoKSkpPjo6dHlwZSBHb2FsVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8CisgICAgICBkZWNsdHlwZShzdGF0aWNfY2FzdDxHb2FsVHlwZSo+KG51bGxwdHIpLT5wYXJhbXMpPjo6dHlwZSBQYXJhbVR5cGU7CisKKyAgQWN0b3JCYXNlKFQqIGFjcSkgOiBhY3Rpb25fcV8oYWNxKSB7fQorCisgIC8vIFdpbGwgcmV0dXJuIHRydWUgaWYgZmluaXNoZWQgb3IgYXNrZWQgdG8gY2FuY2VsLgorICAvLyBXaWxsIHJldHVybiBmYWxzZSBpZiBpdCBmYWlsZWQgYWNjb21wbGlzaCBpdHMgZ29hbAorICAvLyBkdWUgdG8gYSBwcm9ibGVtIHdpdGggdGhlIHN5c3RlbS4KKyAgdmlydHVhbCBib29sIFJ1bkFjdGlvbihjb25zdCBQYXJhbVR5cGUmIHBhcmFtcykgPSAwOworCisgIC8vIFJ1bnMgYWN0aW9uIHdoaWxlIGVuYWJsZWQuCisgIHZvaWQgUnVuKCk7CisKKyAgLy8gR2V0cyByZWFkeSB0byBydW4gYWN0aW9ucy4KKyAgdm9pZCBJbml0aWFsaXplKCk7CisKKyAgLy8gQ2hlY2tzIGlmIGFuIGFjdGlvbiB3YXMgaW5pdGlhbGx5IHJ1bm5pbmcgd2hlbiB0aGUgdGhyZWFkIHN0YXJ0ZWQuCisgIGJvb2wgQ2hlY2tJbml0aWFsUnVubmluZygpOworCisgIC8vIFdhaXQgaGVyZSB1bnRpbCBzb21lb25lIGFza3MgdXMgdG8gZ28uCisgIHZvaWQgV2FpdEZvckFjdGlvblJlcXVlc3QoKTsKKworICAvLyBEbyB3b3JrIHNvbi4KKyAgdWludDMyX3QgUnVuSXRlcmF0aW9uKCk7CisKKyAgLy8gV2FpdCBmb3Igc3RvcCBpcyBzaWduYWxsZWQuCisgIHZvaWQgV2FpdEZvclN0b3AodWludDMyX3QgcnVubmluZ19pZCk7CisKKyAgLy8gV2lsbCBydW4gdW50aWwgdGhlIGRvbmUgY29uZGl0aW9uIGlzIG1ldCBvciB0aW1lcyBvdXQuCisgIC8vIFdpbGwgcmV0dXJuIGZhbHNlIGlmIHN1Y2Nlc3NmdWwgb3IgZW5kX3RpbWUgaXMgcmVhY2hlZCBhbmQgdHJ1ZSBpZiB0aGUKKyAgLy8gYWN0aW9uIHdhcyBjYW5jZWxlZCBvciBmYWlsZWQuCisgIC8vIERvbmUgY29uZGl0aW9uIGFyZSBkZWZpbmVkIGFzIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB0cnVlIHdoZW4gZG9uZSBhbmQgaGF2ZQorICAvLyBzb21lIHNvcnQgb2YgYmxvY2tpbmcgc3RhdGVtZW50IChzdWNoIGFzIEZldGNoTmV4dEJsb2NraW5nKSB0byB0aHJvdHRsZQorICAvLyBzcGluIHJhdGUuCisgIC8vIGVuZF90aW1lIGlzIHdoZW4gdG8gc3RvcCBhbmQgcmV0dXJuIHRydWUuIFRpbWUoMCwgMCkgKHRoZSBkZWZhdWx0KSBtZWFucworICAvLyBuZXZlciB0aW1lIG91dC4KKyAgYm9vbCBXYWl0VW50aWwoOjpzdGQ6OmZ1bmN0aW9uPGJvb2wodm9pZCk+IGRvbmVfY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICBjb25zdCA6OmFvczo6dGltZTo6VGltZSYgZW5kX3RpbWUgPSA6OmFvczo6dGltZTo6VGltZSgwLCAwKSk7CisKKyAgLy8gV2FpdHMgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZSBmcm9tIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBhY3Rpb24gd2FzIGNhbmNlbGVkIG9yIGZhaWxlZCwgYW5kIHRydWUgaWYgdGhlIHdhaXQKKyAgLy8gc3VjY2VlZGVkLgorICBib29sIFdhaXRPckNhbmNlbChjb25zdCA6OmFvczo6dGltZTo6VGltZSYgZHVyYXRpb24pIHsKKyAgICByZXR1cm4gIVdhaXRVbnRpbChbXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kuVG9NU2VjKCksIDI1MDApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgOjphb3M6OnRpbWU6OlRpbWU6Ok5vdygpICsgZHVyYXRpb24pOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGNhbmNlbGVkLgorICBib29sIFNob3VsZENhbmNlbCgpOworCisgcHJvdGVjdGVkOgorICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHdlIHNob3VsZCBzdG9wIEFTQVAuCisgIGJvb2wgYWJvcnRfID0gZmFsc2U7CisKKyAgLy8gVGhlIHF1ZXVlIGZvciB0aGlzIGFjdGlvbi4KKyAgVCogYWN0aW9uX3FfOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIEFjdG9yQmFzZTxUPjo6Q2hlY2tJbml0aWFsUnVubmluZygpIHsKKyAgTE9HKERFQlVHLCAiV2FpdGluZyBmb3IgaW5wdXQgdG8gc3RhcnRcbiIpOworCisgIGlmIChhY3Rpb25fcV8tPmdvYWwuRmV0Y2hMYXRlc3QoKSkgeworICAgIExPR19TVFJVQ1QoREVCVUcsICJnb2FsIHF1ZXVlIiwgKmFjdGlvbl9xXy0+Z29hbCk7CisgICAgY29uc3QgdWludDMyX3QgaW5pdGlhbGx5X3J1bm5pbmcgPSBhY3Rpb25fcV8tPmdvYWwtPnJ1bjsKKyAgICBpZiAoaW5pdGlhbGx5X3J1bm5pbmcgIT0gMCkgeworICAgICAgd2hpbGUgKGFjdGlvbl9xXy0+Z29hbC0+cnVuID09IGluaXRpYWxseV9ydW5uaW5nKSB7CisgICAgICAgIExPRyhJTkZPLCAicnVuIGlzIHN0aWxsICUiIFBSSXgzMiAiXG4iLCBpbml0aWFsbHlfcnVubmluZyk7CisgICAgICAgIGFjdGlvbl9xXy0+Z29hbC5GZXRjaE5leHRCbG9ja2luZygpOworICAgICAgICBMT0dfU1RSVUNUKERFQlVHLCAiZ29hbCBxdWV1ZSIsICphY3Rpb25fcV8tPmdvYWwpOworICAgICAgfQorICAgIH0KKyAgICBMT0coREVCVUcsICJEb25lIHdhaXRpbmcsIGdvYWxcbiIpOworICAgIHJldHVybiB0cnVlOworICB9CisgIExPRyhERUJVRywgIkRvbmUgd2FpdGluZywgbm8gZ29hbFxuIik7CisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIEFjdG9yQmFzZTxUPjo6V2FpdEZvckFjdGlvblJlcXVlc3QoKSB7CisgIHdoaWxlIChhY3Rpb25fcV8tPmdvYWwuZ2V0KCkgPT0gbnVsbHB0ciB8fCAhYWN0aW9uX3FfLT5nb2FsLT5ydW4pIHsKKyAgICBMT0coSU5GTywgIldhaXRpbmcgZm9yIGFuIGFjdGlvbiByZXF1ZXN0LlxuIik7CisgICAgYWN0aW9uX3FfLT5nb2FsLkZldGNoTmV4dEJsb2NraW5nKCk7CisgICAgTE9HX1NUUlVDVChERUJVRywgImdvYWwgcXVldWUiLCAqYWN0aW9uX3FfLT5nb2FsKTsKKyAgICBpZiAoIWFjdGlvbl9xXy0+Z29hbC0+cnVuKSB7CisgICAgICBpZiAoIWFjdGlvbl9xXy0+c3RhdHVzLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgICAucnVubmluZygwKQorICAgICAgICAgICAgICAgLmxhc3RfcnVubmluZygwKQorICAgICAgICAgICAgICAgLnN1Y2Nlc3MoIWFib3J0XykKKyAgICAgICAgICAgICAgIC5TZW5kKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SLCAiRmFpbGVkIHRvIHNlbmQgdGhlIHN0YXR1cy5cbiIpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3VpbnQzMl90IEFjdG9yQmFzZTxUPjo6UnVuSXRlcmF0aW9uKCkgeworICBDSEVDSyhhY3Rpb25fcV8tPmdvYWwuZ2V0KCkgIT0gbnVsbHB0cik7CisgIGNvbnN0IHVpbnQzMl90IHJ1bm5pbmdfaWQgPSBhY3Rpb25fcV8tPmdvYWwtPnJ1bjsKKyAgTE9HKElORk8sICJTdGFydGluZyBhY3Rpb24gJSIgUFJJeDMyICJcbiIsIHJ1bm5pbmdfaWQpOworICBpZiAoIWFjdGlvbl9xXy0+c3RhdHVzLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgIC5ydW5uaW5nKHJ1bm5pbmdfaWQpCisgICAgICAgICAgIC5sYXN0X3J1bm5pbmcoMCkKKyAgICAgICAgICAgLnN1Y2Nlc3MoIWFib3J0XykKKyAgICAgICAgICAgLlNlbmQoKSkgeworICAgIExPRyhFUlJPUiwgIkZhaWxlZCB0byBzZW5kIHRoZSBzdGF0dXMuXG4iKTsKKyAgfQorICBMT0dfU1RSVUNUKElORk8sICJnb2FsIiwgKmFjdGlvbl9xXy0+Z29hbCk7CisgIGFib3J0XyA9ICFSdW5BY3Rpb24oYWN0aW9uX3FfLT5nb2FsLT5wYXJhbXMpOworICBMT0coSU5GTywgIkRvbmUgd2l0aCBhY3Rpb24gJSIgUFJJeDMyICJcbiIsIHJ1bm5pbmdfaWQpOworCisgIC8vIElmIHdlIGhhdmUgYSBuZXcgb25lIHRvIHJ1biwgd2Ugc2hvdWxkbid0IHNheSB3ZSdyZSBzdG9wcGVkIGluIGJldHdlZW4uCisgIGlmIChhY3Rpb25fcV8tPmdvYWwtPnJ1biA9PSAwIHx8IGFjdGlvbl9xXy0+Z29hbC0+cnVuID09IHJ1bm5pbmdfaWQpIHsKKyAgICBpZiAoIWFjdGlvbl9xXy0+c3RhdHVzLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgLnJ1bm5pbmcoMCkKKyAgICAgICAgICAgICAubGFzdF9ydW5uaW5nKHJ1bm5pbmdfaWQpCisgICAgICAgICAgICAgLnN1Y2Nlc3MoIWFib3J0XykKKyAgICAgICAgICAgICAuU2VuZCgpKSB7CisgICAgICBMT0coRVJST1IsICJGYWlsZWQgdG8gc2VuZCB0aGUgc3RhdHVzLlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIExPRyhJTkZPLCAiU2VuZGluZyBEb25lIHN0YXR1cyAlIiBQUkl4MzIgIlxuIiwgcnVubmluZ19pZCk7CisgICAgfQorICB9IGVsc2UgeworICAgIExPRyhJTkZPLCAic2tpcHBpbmcgc2VuZGluZyBzdG9wcGVkIHN0YXR1cyBmb3IgJSIgUFJJeDMyICJcbiIsIHJ1bm5pbmdfaWQpOworICB9CisKKyAgcmV0dXJuIHJ1bm5pbmdfaWQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBBY3RvckJhc2U8VD46OldhaXRGb3JTdG9wKHVpbnQzMl90IHJ1bm5pbmdfaWQpIHsKKyAgYXNzZXJ0KGFjdGlvbl9xXy0+Z29hbC5nZXQoKSAhPSBudWxscHRyKTsKKyAgd2hpbGUgKGFjdGlvbl9xXy0+Z29hbC0+cnVuID09IHJ1bm5pbmdfaWQpIHsKKyAgICBMT0coSU5GTywgIldhaXRpbmcgZm9yIHRoZSBhY3Rpb24gKCUiIFBSSXgzMiAiKSB0byBiZSBzdG9wcGVkLlxuIiwKKyAgICAgICAgcnVubmluZ19pZCk7CisgICAgYWN0aW9uX3FfLT5nb2FsLkZldGNoTmV4dEJsb2NraW5nKCk7CisgICAgTE9HX1NUUlVDVChERUJVRywgImdvYWwgcXVldWUiLCAqYWN0aW9uX3FfLT5nb2FsKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgQWN0b3JCYXNlPFQ+OjpSdW4oKSB7CisgIEluaXRpYWxpemUoKTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFdhaXQgZm9yIGEgcmVxdWVzdCB0byBjb21lIGluIGJlZm9yZSBzdGFydGluZy4KKyAgICBXYWl0Rm9yQWN0aW9uUmVxdWVzdCgpOworCisgICAgTE9HX1NUUlVDVChJTkZPLCAicnVubmluZyB3aXRoIGdvYWwiLCAqYWN0aW9uX3FfLT5nb2FsKTsKKworICAgIC8vIFBlcmZvcm0gdGhlIGFjdGlvbiBvbmNlLgorICAgIHVpbnQzMl90IHJ1bm5pbmdfaWQgPSBSdW5JdGVyYXRpb24oKTsKKworICAgIExPRyhJTkZPLCAiZG9uZSBydW5uaW5nXG4iKTsKKworICAgIC8vIERvbid0IHN0YXJ0IGFnYWluIHVudGlsIGFza2VkLgorICAgIFdhaXRGb3JTdG9wKHJ1bm5pbmdfaWQpOworICAgIExPRyhERUJVRywgImFjdGlvbiAlIiBQUkl4MzIgIiB3YXMgc3RvcHBlZFxuIiwgcnVubmluZ19pZCk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIEFjdG9yQmFzZTxUPjo6SW5pdGlhbGl6ZSgpIHsKKyAgLy8gTWFrZSBzdXJlIHRoZSBsYXN0IGpvYiBpcyBkb25lIGFuZCB3ZSBoYXZlIGEgc2lnbmFsLgorICBpZiAoQ2hlY2tJbml0aWFsUnVubmluZygpKSB7CisgICAgTE9HKERFQlVHLCAiYWN0aW9uICUiIFBSSXgzMiAiIHdhcyBzdG9wcGVkXG4iLCBhY3Rpb25fcV8tPmdvYWwtPnJ1bik7CisgIH0KKworICBpZiAoIWFjdGlvbl9xXy0+c3RhdHVzLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgIC5ydW5uaW5nKDApCisgICAgICAgICAgIC5sYXN0X3J1bm5pbmcoMCkKKyAgICAgICAgICAgLnN1Y2Nlc3MoIWFib3J0XykKKyAgICAgICAgICAgLlNlbmQoKSkgeworICAgIExPRyhFUlJPUiwgIkZhaWxlZCB0byBzZW5kIHRoZSBzdGF0dXMuXG4iKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgQWN0b3JCYXNlPFQ+OjpXYWl0VW50aWwoOjpzdGQ6OmZ1bmN0aW9uPGJvb2wodm9pZCk+IGRvbmVfY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFvczo6dGltZTo6VGltZSYgZW5kX3RpbWUpIHsKKyAgd2hpbGUgKCFkb25lX2NvbmRpdGlvbigpKSB7CisgICAgaWYgKFNob3VsZENhbmNlbCgpIHx8IGFib3J0XykgeworICAgICAgLy8gQ2xlYXIgYWJvcnQgYml0IGFzIHdlIGhhdmUganVzdCBhYm9ydGVkLgorICAgICAgYWJvcnRfID0gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGVuZF90aW1lICE9IDo6YW9zOjp0aW1lOjpUaW1lKDAsIDApICYmCisgICAgICAgIDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKSA+PSBlbmRfdGltZSkgeworICAgICAgTE9HKERFQlVHLCAiV2FpdFVudGlsIHRpbWVkIG91dFxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIGlmIChTaG91bGRDYW5jZWwoKSB8fCBhYm9ydF8pIHsKKyAgICAvLyBDbGVhciBhYm9ydCBiaXQgYXMgd2UgaGF2ZSBqdXN0IGFib3J0ZWQuCisgICAgYWJvcnRfID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBBY3RvckJhc2U8VD46OlNob3VsZENhbmNlbCgpIHsKKyAgaWYgKGFjdGlvbl9xXy0+Z29hbC5GZXRjaE5leHQoKSkgeworICAgIExPR19TVFJVQ1QoREVCVUcsICJnb2FsIHF1ZXVlIiwgKmFjdGlvbl9xXy0+Z29hbCk7CisgIH0KKyAgYm9vbCBhbnMgPSAhYWN0aW9uX3FfLT5nb2FsLT5ydW47CisgIGlmIChhbnMpIHsKKyAgICBMT0coSU5GTywgIlRpbWUgdG8gc3RvcCBhY3Rpb25cbiIpOworICB9CisgIHJldHVybiBhbnM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhY3Rpb25zCit9ICAvLyBuYW1lc3BhY2UgY29tbW9uCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9BQ1RJT05TX0FDVE9SX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2FjdGlvbnMvdGVzdF9hY3Rpb24ucSBiL2Fvcy9jb21tb24vYWN0aW9ucy90ZXN0X2FjdGlvbi5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTFjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2FjdGlvbnMvdGVzdF9hY3Rpb24ucQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGFvcy5jb21tb24uYWN0aW9uczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5xIjsKKworcXVldWVfZ3JvdXAgVGVzdEFjdGlvblF1ZXVlR3JvdXAgeworICBpbXBsZW1lbnRzIGFvcy5jb21tb24uYWN0aW9ucy5BY3Rpb25RdWV1ZUdyb3VwOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgdWludDMyX3QgcnVuOworICAgIHVpbnQzMl90IHBhcmFtczsKKyAgfTsKKworICBxdWV1ZSBHb2FsIGdvYWw7CisgIHF1ZXVlIGFvcy5jb21tb24uYWN0aW9ucy5TdGF0dXMgc3RhdHVzOworfTsKKworc3RydWN0IE15UGFyYW1zIHsKKyAgZG91YmxlIHBhcmFtMTsKKyAgaW50MzJfdCBwYXJhbTI7Cit9OworCitxdWV1ZV9ncm91cCBUZXN0QWN0aW9uMlF1ZXVlR3JvdXAgeworICBpbXBsZW1lbnRzIGFvcy5jb21tb24uYWN0aW9ucy5BY3Rpb25RdWV1ZUdyb3VwOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgdWludDMyX3QgcnVuOworICAgIE15UGFyYW1zIHBhcmFtczsKKyAgfTsKKworICBxdWV1ZSBHb2FsIGdvYWw7CisgIHF1ZXVlIGFvcy5jb21tb24uYWN0aW9ucy5TdGF0dXMgc3RhdHVzOworfTsKKworcXVldWVfZ3JvdXAgVGVzdEFjdGlvblF1ZXVlR3JvdXAgdGVzdF9hY3Rpb247CitxdWV1ZV9ncm91cCBUZXN0QWN0aW9uMlF1ZXVlR3JvdXAgdGVzdF9hY3Rpb24yOwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9ieXRlb3JkZXIuaCBiL2Fvcy9jb21tb24vYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2ZWNmNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vYnl0ZW9yZGVyLmgKQEAgLTAsMCArMSwyMDEgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9CWVRFT1JERVJfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9CWVRFT1JERVJfSF8KKworI2lmbmRlZiBfX1ZYV09SS1NfXworI2luY2x1ZGUgPGVuZGlhbi5oPiAvLyBlbmRpYW4oMykKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBDb250YWlucyBmdW5jdGlvbnMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBob3N0IGFuZCBuZXR3b3JrIGJ5dGUgb3JkZXIgZm9yCisvLyB0aGluZ3Mgb3RoZXIgdGhhbiAxNi8zMiBiaXQgaW50ZWdlcnMgKHRob3NlIGFyZSBwcm92aWRlZCBieSBieXRlb3JkZXIoMykpLgorLy8gQWxzbyBnaXZlcyBhIG5pY2UgdGVtcGxhdGVkIGludGVyZmFjZSB0byB0aGVzZSBmdW5jdGlvbnMuCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIGludF90eXBlLCBpbnRfdHlwZSAoKmZ1bmN0aW9uKShpbnRfdHlwZSk+CitzdGF0aWMgaW5saW5lIHZvaWQgY29waWVyKGNvbnN0IHZvaWQgKmluLCB2b2lkICpvdXQpIHsKKyAgLy8gSGF2ZSBjb25maXJtZWQgYnkgbG9va2luZyBhdCB0aGUgYXNzZW1ibHkgY29kZSB0aGF0IHRoaXMgZ2VuZXJhdGVzIHRoZSBzYW1lCisgIC8vIGNvZGUgYXMgdGhlICh1bmRlZmluZWQgYnkgdGhlIGMrKyBzdGFuZGFyZCkgd2F5IG9mIHVzaW5nIGEgdW5pb24gdG8gZG8gaXQuCisgIC8vICh3aGljaCBpcyBwcmV0dHkgZWZmaWNpZW50KQorICBpbnRfdHlwZSB0ZW1wOworICBtZW1jcHkoJnRlbXAsIGluLCBzaXplb2YoaW50X3R5cGUpKTsKKyAgdGVtcCA9IGZ1bmN0aW9uKHRlbXApOworICBtZW1jcHkob3V0LCAmdGVtcCwgc2l6ZW9mKGludF90eXBlKSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgaW50X3R5cGUsIHR5cGVuYW1lIFQsIGludF90eXBlICgqZnVuY3Rpb24pKGludF90eXBlKT4KK3N0YXRpYyBpbmxpbmUgVCBtZW1jcGllcihUIGluKSB7CisgIGNvcGllcjxpbnRfdHlwZSwgZnVuY3Rpb24+KCZpbiwgJmluKTsKKyAgcmV0dXJuIGluOworfQorCisvLyBOZWVkZWQgYmVjYXVzZSBiZTY0dG9oIGV0YyBhcmUgbWFjcm9zIChub3QgdGhhdCB0aGUgbWFucGFnZSBzYXlzCisvLyBhbnl0aGluZy4uLikuCisvLyBUaGVzZSBhcmUgdXNlZCBpbnN0ZWFkIG9mIG50b2hzIGV0YyBiZWNhdXNlIGdjYyBkaWRuJ3QgaW5saW5lIHRob3NlLgorI2lmZGVmIF9fY2xhbmdfXworLy8gQXBwYXJlbnRseSB0aGUgbWFjcm9zIHVzZSAicmVnaXN0ZXIiLCBhbmQgY2xhbmcgZG9lc24ndCBsaWtlIHRoYXQuCisjZGVmaW5lIHJlZ2lzdGVyCisjZW5kaWYKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgX2JlNjR0b2godWludDY0X3QgaW4pIHsgcmV0dXJuIGJlNjR0b2goaW4pOyB9CitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IF9odG9iZTY0KHVpbnQ2NF90IGluKSB7IHJldHVybiBodG9iZTY0KGluKTsgfQorc3RhdGljIGlubGluZSB1aW50MzJfdCBfYmUzMnRvaCh1aW50MzJfdCBpbikgeyByZXR1cm4gYmUzMnRvaChpbik7IH0KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX2h0b2JlMzIodWludDMyX3QgaW4pIHsgcmV0dXJuIGh0b2JlMzIoaW4pOyB9CitzdGF0aWMgaW5saW5lIHVpbnQxNl90IF9iZTE2dG9oKHVpbnQxNl90IGluKSB7IHJldHVybiBiZTE2dG9oKGluKTsgfQorc3RhdGljIGlubGluZSB1aW50MTZfdCBfaHRvYmUxNih1aW50MTZfdCBpbikgeyByZXR1cm4gaHRvYmUxNihpbik7IH0KKyNpZmRlZiBfX2NsYW5nX18KKyN1bmRlZiByZWdpc3RlcgorI2VuZGlmCisKK3RlbXBsYXRlPGludCBieXRlcywgdHlwZW5hbWUgVD4gY2xhc3MgZG9fbnRvaCB7CisgcHVibGljOgorICBzdGF0aWMgaW5saW5lIFQgYXBwbHkoVCBuZXQpOworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weShjb25zdCBjaGFyICppbiwgVCAmbmV0KTsKK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBkb19udG9oPDEsIFQ+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgVCBhcHBseShUIG5ldCkgeyByZXR1cm4gbmV0OyB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5KGNvbnN0IGNoYXIgKmluLCBUICpob3N0KSB7IGhvc3RbMF0gPSBpblswXTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIGRvX250b2g8MiwgVD4geworIHB1YmxpYzoKKyAgc3RhdGljIGlubGluZSBUIGFwcGx5KFQgbmV0KSB7IHJldHVybiBtZW1jcGllcjx1aW50MTZfdCwgVCwgX2JlMTZ0b2g+KG5ldCk7IH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgY2hhciAqaW4sIFQgKmhvc3QpIHsKKyAgICBjb3BpZXI8dWludDE2X3QsIF9iZTE2dG9oPihpbiwgaG9zdCk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBkb19udG9oPDQsIFQ+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgVCBhcHBseShUIG5ldCkgeyByZXR1cm4gbWVtY3BpZXI8dWludDMyX3QsIFQsIF9iZTMydG9oPihuZXQpOyB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5KGNvbnN0IGNoYXIgKmluLCBUICpob3N0KSB7CisgICAgY29waWVyPHVpbnQzMl90LCBfYmUzMnRvaD4oaW4sIGhvc3QpOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgZG9fbnRvaDw4LCBUPiB7CisgcHVibGljOgorICBzdGF0aWMgaW5saW5lIFQgYXBwbHkoVCBuZXQpIHsgcmV0dXJuIG1lbWNwaWVyPHVpbnQ2NF90LCBULCBfYmU2NHRvaD4obmV0KTsgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgY29weShjb25zdCBjaGFyICppbiwgVCAqaG9zdCkgeworICAgIGNvcGllcjx1aW50NjRfdCwgX2JlNjR0b2g+KGluLCBob3N0KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHNpemVfdCBTaXplPgorc3RydWN0IGRvX250b2hfaW50IHsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgY2hhciAqaW4sIGNoYXIgKmhvc3QpOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZG9fbnRvaF9pbnQ8MT4geworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weShjb25zdCBjaGFyICppbiwgY2hhciAqaG9zdCkgeyBob3N0WzBdID0gaW5bMF07IH0KK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRvX250b2hfaW50PDI+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgY2hhciAqaW4sIGNoYXIgKmhvc3QpIHsKKyAgICBjb3BpZXI8dWludDE2X3QsIF9iZTE2dG9oPihpbiwgaG9zdCk7CisgIH0KK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRvX250b2hfaW50PDQ+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgY2hhciAqaW4sIGNoYXIgKmhvc3QpIHsKKyAgICBjb3BpZXI8dWludDMyX3QsIF9iZTMydG9oPihpbiwgaG9zdCk7CisgIH0KK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRvX250b2hfaW50PDg+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgY2hhciAqaW4sIGNoYXIgKmhvc3QpIHsKKyAgICBjb3BpZXI8dWludDY0X3QsIF9iZTY0dG9oPihpbiwgaG9zdCk7CisgIH0KK307CisKK3RlbXBsYXRlPGludCBieXRlcywgdHlwZW5hbWUgVD4gY2xhc3MgZG9faHRvbiB7CisgcHVibGljOgorICBzdGF0aWMgaW5saW5lIFQgYXBwbHkoVCBob3N0KTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgVCAqaG9zdCwgY2hhciAqb3V0KTsKK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBkb19odG9uPDEsIFQ+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgVCBhcHBseShUIGhvc3QpIHsgcmV0dXJuIGhvc3Q7IH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgVCAqaG9zdCwgY2hhciAqb3V0KSB7IG91dFswXSA9IGhvc3RbMF07IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBkb19odG9uPDIsIFQ+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgVCBhcHBseShUIGhvc3QpIHsgcmV0dXJuIG1lbWNwaWVyPHVpbnQxNl90LCBULCBfaHRvYmUxNj4oaG9zdCk7IH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgVCAqaG9zdCwgY2hhciAqb3V0KSB7CisgICAgY29waWVyPHVpbnQxNl90LCBfaHRvYmUxNj4oaG9zdCwgb3V0KTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIGRvX2h0b248NCwgVD4geworIHB1YmxpYzoKKyAgc3RhdGljIGlubGluZSBUIGFwcGx5KFQgaG9zdCkgeyByZXR1cm4gbWVtY3BpZXI8dWludDMyX3QsIFQsIF9odG9iZTMyPihob3N0KTsgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgY29weShjb25zdCBUICpob3N0LCBjaGFyICpvdXQpIHsKKyAgICBjb3BpZXI8dWludDMyX3QsIF9odG9iZTMyPihob3N0LCBvdXQpOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgZG9faHRvbjw4LCBUPiB7CisgcHVibGljOgorICBzdGF0aWMgaW5saW5lIFQgYXBwbHkoVCBob3N0KSB7IHJldHVybiBtZW1jcGllcjx1aW50NjRfdCwgVCwgX2h0b2JlNjQ+KGhvc3QpOyB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5KGNvbnN0IFQgKmhvc3QsIGNoYXIgKm91dCkgeworICAgIGNvcGllcjx1aW50NjRfdCwgX2h0b2JlNjQ+KGhvc3QsIG91dCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxzaXplX3QgU2l6ZT4KK3N0cnVjdCBkb19odG9uX2ludCB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5KGNvbnN0IGNoYXIgKmhvc3QsIGNoYXIgKm91dCk7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBkb19odG9uX2ludDwxPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5KGNvbnN0IGNoYXIgKmhvc3QsIGNoYXIgKm91dCkgeyBvdXRbMF0gPSBob3N0WzBdOyB9Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBkb19odG9uX2ludDwyPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5KGNvbnN0IGNoYXIgKmhvc3QsIGNoYXIgKm91dCkgeworICAgIGNvcGllcjx1aW50MTZfdCwgX2h0b2JlMTY+KGhvc3QsIG91dCk7CisgIH0KK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRvX2h0b25faW50PDQ+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHkoY29uc3QgY2hhciAqaG9zdCwgY2hhciAqb3V0KSB7CisgICAgY29waWVyPHVpbnQzMl90LCBfaHRvYmUzMj4oaG9zdCwgb3V0KTsKKyAgfQorfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZG9faHRvbl9pbnQ8OD4geworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weShjb25zdCBjaGFyICpob3N0LCBjaGFyICpvdXQpIHsKKyAgICBjb3BpZXI8dWludDY0X3QsIF9odG9iZTY0Pihob3N0LCBvdXQpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQ29udmVydHMgVCBmcm9tIG5ldHdvcmsgdG8gaG9zdCBieXRlIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIFQgbnRvaChUIG5ldCkgeworICByZXR1cm4gZG9fbnRvaDxzaXplb2YobmV0KSwgVD46OmFwcGx5KG5ldCk7Cit9CisvLyBDb252ZXJ0cyBUIGZyb20gaG9zdCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgVCBodG9uKFQgaG9zdCkgeworICByZXR1cm4gZG9faHRvbjxzaXplb2YoaG9zdCksIFQ+OjphcHBseShob3N0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIHZvaWQgdG9faG9zdChjb25zdCBjaGFyICppbnB1dCwgVCAqaG9zdCkgeworICBkb19udG9oPHNpemVvZigqaG9zdCksIFQ+Ojpjb3B5KGlucHV0LCBob3N0KTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSB2b2lkIHRvX25ldHdvcmsoY29uc3QgVCAqaG9zdCwgY2hhciAqb3V0cHV0KSB7CisgIGRvX2h0b248c2l6ZW9mKCpob3N0KSwgVD46OmNvcHkoaG9zdCwgb3V0cHV0KTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBTaXplPgorc3RhdGljIGlubGluZSB2b2lkIHRvX2hvc3QoY29uc3QgY2hhciAqaW5wdXQsIGNoYXIgKmhvc3QpIHsKKyAgZG9fbnRvaF9pbnQ8U2l6ZT46OmNvcHkoaW5wdXQsIGhvc3QpOworfQordGVtcGxhdGUgPHNpemVfdCBTaXplPgorc3RhdGljIGlubGluZSB2b2lkIHRvX25ldHdvcmsoY29uc3QgY2hhciAqaG9zdCwgY2hhciAqb3V0cHV0KSB7CisgIGRvX2h0b25faW50PFNpemU+Ojpjb3B5KGhvc3QsIG91dHB1dCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vY29tbW9uLmd5cCBiL2Fvcy9jb21tb24vY29tbW9uLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjEyMDBlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9jb21tb24uZ3lwCkBAIC0wLDAgKzEsMzcwIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICd0ZXN0X3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi90ZXN0X3F1ZXVlLnEnLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICdhb3MvY29tbW9uJywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncXVldWVfdGVzdHV0aWxzJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAncXVldWVfdGVzdHV0aWxzLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICdvbmNlJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2lwY19saWIvaXBjX2xpYi5neXA6c2hhcmVkX21lbScsCisgICAgICAgICdtdXRleCcsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwOnNoYXJlZF9tZW0nLAorICAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAndGltZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3RpbWUuY2MnCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmdfaW50ZXJmYWNlJywKKyAgICAgICAgJ211dGV4JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncXVldWVfdHlwZXMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ3ByaW50X2ZpZWxkX2NjJzogJzwoU0hBUkVEX0lOVEVSTUVESUFURV9ESVIpL3ByaW50X2ZpZWxkLmNjJywKKyAgICAgICAgJ3F1ZXVlX3ByaW1pdGl2ZXNfaCc6ICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKS9hb3NfcXVldWVfcHJpbWl0aXZlcy9hb3MvcXVldWVfcHJpbWl0aXZlcy5oJywKKyAgICAgIH0sCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3F1ZXVlX3R5cGVzLmNjJywKKyAgICAgICAgJzwocHJpbnRfZmllbGRfY2MpJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZ19pbnRlcmZhY2UnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cDpzaGFyZWRfbWVtJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2lwY19saWIvaXBjX2xpYi5neXA6Y29yZV9saWInLAorICAgICAgICAnbXV0ZXgnLAorICAgICAgICAndGltZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICd0aW1lJywKKyAgICAgIF0sCisgICAgICAnYWN0aW9ucyc6IFsKKyAgICAgICAgeworICAgICAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICAgICAnc2NyaXB0JzogJzwoQU9TKS9idWlsZC9xdWV1ZXMvcHJpbnRfZmllbGQucmInLAorICAgICAgICAgIH0sCisgICAgICAgICAgJ2FjdGlvbl9uYW1lJzogJ2dlbl9wcmludF9maWVsZCcsCisgICAgICAgICAgJ2lucHV0cyc6IFsKKyAgICAgICAgICAgICc8KHNjcmlwdCknLAorICAgICAgICAgICAgJzwhQChmaW5kIDwoQU9TKS9idWlsZC9xdWV1ZXMvIC1uYW1lICoucmIpJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdvdXRwdXRzJzogWworICAgICAgICAgICAgJzwocHJpbnRfZmllbGRfY2MpJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdhY3Rpb24nOiBbJ3J1YnknLCAnPChzY3JpcHQpJywgJzwocHJpbnRfZmllbGRfY2MpJ10sCisgICAgICAgICAgJ21lc3NhZ2UnOiAnR2VuZXJhdGluZyBwcmludF9maWVsZC5jYycsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAgICAgJ3NjcmlwdCc6ICc8KEFPUykvYnVpbGQvcXVldWVzL3F1ZXVlX3ByaW1pdGl2ZXMucmInLAorICAgICAgICAgIH0sCisgICAgICAgICAgJ2FjdGlvbl9uYW1lJzogJ2dlbl9xdWV1ZV9wcmltaXRpdmVzJywKKyAgICAgICAgICAnaW5wdXRzJzogWworICAgICAgICAgICAgJzwoc2NyaXB0KScsCisgICAgICAgICAgICAnPCFAKGZpbmQgPChBT1MpL2J1aWxkL3F1ZXVlcy8gLW5hbWUgKi5yYiknLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ291dHB1dHMnOiBbCisgICAgICAgICAgICAnPChxdWV1ZV9wcmltaXRpdmVzX2gpJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdhY3Rpb24nOiBbJ3J1YnknLCAnPChzY3JpcHQpJywgJzwocXVldWVfcHJpbWl0aXZlc19oKSddLAorICAgICAgICAgICdtZXNzYWdlJzogJ0dlbmVyYXRpbmcgcXVldWVfcHJpbWl0aXZlcy5oJywKKyAgICAgICAgfSwKKyAgICAgIF0sCisgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAnPChTSEFSRURfSU5URVJNRURJQVRFX0RJUikvYW9zX3F1ZXVlX3ByaW1pdGl2ZXMnLAorICAgICAgICBdLAorICAgICAgfSwKKyAgICAgICdoYXJkX2RlcGVuZGVuY3knOiAxLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3F1ZXVlX3R5cGVzX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3F1ZXVlX3R5cGVzX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdxdWV1ZV90eXBlcycsCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAndGVzdF9xdWV1ZScsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJ3F1ZXVlX3Rlc3R1dGlscycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3F1ZXVlcycsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3F1ZXVlLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cDpxdWV1ZScsCisgICAgICAgICd0aW1lJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2lwY19saWIvaXBjX2xpYi5neXA6cXVldWUnLAorICAgICAgICAndGltZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Njb3BlZF9mZCcsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgIyAnc2NvcGVkX2ZkLmgnCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3F1ZXVlX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3F1ZXVlX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAncXVldWVfdGVzdHV0aWxzJywKKyAgICAgICAgJ3Rlc3RfcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnRocmVhZCcsCisgICAgICAgICdkaWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICd0eXBlX3RyYWl0c190ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICd0eXBlX3RyYWl0c190ZXN0LmNwcCcsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2d0ZXN0X3Byb2QnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdF9wcm9kJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdF9wcm9kJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnb25jZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0X3Byb2QnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0X3Byb2QnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdvbmNlX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ29uY2VfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdvbmNlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAndGltZV90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICd0aW1lX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAndGltZScsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpkZWF0aF90ZXN0X2xvZ19pbXBsZW1lbnRhdGlvbicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RpZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2RpZS5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbGliYy9saWJjLmd5cDphb3Nfc3RyZXJyb3InLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9saWJjL2xpYmMuZ3lwOmFvc19zdHJlcnJvcicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvbmRpdGlvbicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2lwY19saWIvY29uZGl0aW9uLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnbXV0ZXgnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cDphb3Nfc3luYycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwOmFvc19zeW5jJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbXV0ZXgnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL211dGV4LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cDphb3Nfc3luYycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwOmFvc19zeW5jJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZXZlbnQnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2V2ZW50LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cDphb3Nfc3luYycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwOmFvc19zeW5jJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncXVldWVfdGVzdHV0aWxzX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3F1ZXVlX3Rlc3R1dGlsc190ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJ3F1ZXVlX3Rlc3R1dGlscycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbXV0ZXhfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnbXV0ZXhfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdtdXRleCcsCisgICAgICAgICdkaWUnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6ZGVhdGhfdGVzdF9sb2dfaW1wbGVtZW50YXRpb24nLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnRocmVhZCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICdxdWV1ZV90ZXN0dXRpbHMnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdldmVudF90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdldmVudF90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJ2V2ZW50JywKKyAgICAgICAgJ3F1ZXVlX3Rlc3R1dGlscycsCisgICAgICAgICd0aW1lJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY29uZGl0aW9uX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2NvbmRpdGlvbl90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJ2NvbmRpdGlvbicsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dGhyZWFkJywKKyAgICAgICAgJ3RpbWUnLAorICAgICAgICAnbXV0ZXgnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICdxdWV1ZV90ZXN0dXRpbHMnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cDpjb3JlX2xpYicsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwOmFvc19zeW5jJywKKyAgICAgICAgJ2RpZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dGhyZWFkJywKKyAgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RpZV90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdkaWVfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdkaWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGxfbXV0ZXgnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICMnc3RsX211dGV4LmgnCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2lwY19saWIvaXBjX2xpYi5neXA6YW9zX3N5bmMnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwOmFvc19zeW5jJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGxfbXV0ZXhfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnc3RsX211dGV4X3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdzdGxfbXV0ZXgnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJ3F1ZXVlX3Rlc3R1dGlscycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dGhyZWFkJywKKyAgICAgICAgJ2RpZScsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2NvbW1vbm1hdGguaCBiL2Fvcy9jb21tb24vY29tbW9ubWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzM3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2NvbW1vbm1hdGguaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIEFPU19DT01NT05fTUFUSF9IXworI2RlZmluZSBBT1NfQ09NTU9OX01BVEhfSF8KKworbmFtZXNwYWNlIGFvcyB7CisKKy8vIENsaXBzIGEgdmFsdWUgc28gdGhhdCBpdCBpcyBpbiBbbWluLCBtYXhdCitzdGF0aWMgaW5saW5lIGRvdWJsZSBDbGlwKGRvdWJsZSB2YWx1ZSwgZG91YmxlIG1pbiwgZG91YmxlIG1heCkgeworICBpZiAodmFsdWUgPiBtYXgpIHsKKyAgICB2YWx1ZSA9IG1heDsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8IG1pbikgeworICAgIHZhbHVlID0gbWluOworICB9CisgIHJldHVybiB2YWx1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGludCBzaWduKFQgdmFsKSB7CisgIGlmICh2YWwgPiBUKDApKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX01BVEhfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vY29uZGl0aW9uLmggYi9hb3MvY29tbW9uL2NvbmRpdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjY2MwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2NvbmRpdGlvbi5oCkBAIC0wLDAgKzEsODMgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9DT05ESVRJT05fSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9DT05ESVRJT05fSF8KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvYW9zX3N5bmMuaCIKKworbmFtZXNwYWNlIGFvcyB7CisKK2NsYXNzIE11dGV4OworCisvLyBBIGNvbmRpdGlvbiB2YXJpYWJsZSAoSVBDIG1lY2hhbmlzbSB3aGVyZSAxIHByb2Nlc3MvdGFzayBjYW4gbm90aWZ5IGFsbAorLy8gb3RoZXJzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBoYXBwZW4pIHdpdGhvdXQgdGhlIHJhY2UgY29uZGl0aW9uCisvLyB3aGVyZSBhIG5vdGlmaWNhdGlvbiBpcyBzZW50IGFmdGVyIHNvbWUgcHJvY2VzcyBoYXMgY2hlY2tlZCBpZiB0aGUgdGhpbmcgaGFzCisvLyBoYXBwZW5lZCBidXQgYmVmb3JlIGl0IGhhcyBzdGFydGVkIGxpc3RlbmluZyBmb3Igbm90aWZpY2F0aW9ucy4KKy8vCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgTE9HKEZBVEFMKSBpZiBhbnl0aGluZyB3ZWlyZCBoYXBwZW5zLgorLy8KKy8vIEEgc2ltcGxlIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIGNvbmRpdGlvbiB2YXJpYWJsZSAoYWRhcHRlZCBmcm9tCisvLyBwdGhyZWFkX2NvbmQoMykpOgorLy8KKy8vIGludCB4LCB5OworLy8gTXV0ZXggbXV0ZXg7CisvLyBDb25kaXRpb24gY29uZGl0aW9uKCZtdXRleCk7CisvLworLy8gLy8gV2FpdGluZyB1bnRpbCB4IGlzIGdyZWF0ZXIgdGhhbiB5OgorLy8geworLy8gICBNdXRleExvY2tlciBsb2NrZXIoJm11dGV4KTsKKy8vICAgd2hpbGUgKCEoeCA+IHkpKSBjb25kaXRpb24uV2FpdCgpOworLy8gICAvLyBkbyB3aGF0ZXZlcgorLy8gfQorLy8KKy8vIC8vIE1vZGlmeWluZyB4IGFuZC9vciB5OgorLy8geworLy8gICBNdXRleExvY2tlciBsb2NrZXIoJm11dGV4KTsKKy8vICAgLy8gbW9kaWZ5IHggYW5kIHkKKy8vICAgaWYgKHggPiB5KSBjb25kaXRpb24uQnJvYWRjYXN0KCk7CisvLyB9CisvLworLy8gTm90aWNlIHRoZSBsb29wIGFyb3VuZCB0aGUgV2FpdCgpLiBUaGlzIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBvdGhlcgorLy8gcHJvY2VzcyBjYW4gbG9jayB0aGUgbXV0ZXggYW5kIG1vZGlmeSB0aGUgc2hhcmVkIHN0YXRlIChwb3NzaWJseSB1bmRvaW5nCisvLyB3aGF0ZXZlciB0aGUgV2FpdCgpZXIgd2FzIHdhaXRpbmcgZm9yKSBpbiBiZXR3ZWVuIHRoZSBCcm9hZGNhc3QoKWVyIHVubG9ja2luZworLy8gdGhlIG11dGV4IGFuZCB0aGUgV2FpdCgpZXIocykgcmVsb2NraW5nIGl0LgorLy8KKy8vIE11bHRpcGxlIGNvbmRpdGlvbiB2YXJpYWJsZXMgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBtdXRleCBidXQKKy8vIGV4YWN0bHkgb25lIG11dGV4IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29uZGl0aW9uIHZhcmlhYmxlLgorY2xhc3MgQ29uZGl0aW9uIHsKKyBwdWJsaWM6CisgIC8vIG0gaXMgdGhlIG11dGV4IHRoYXQgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25kaXRpb24gdmFyaWFibGUuIFRoaXMKKyAgLy8gb2JqZWN0IHdpbGwgaG9sZCBvbiB0byBhIHJlZmVyZW5jZSB0byBpdCBidXQgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAuCisgIGV4cGxpY2l0IENvbmRpdGlvbihNdXRleCAqbSk7CisKKyAgLy8gV2FpdHMgZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUgdG8gYmUgc2lnbmFsbGVkLCBhdG9taWNhbGx5IHVubG9ja2luZyB0aGUKKyAgLy8gbXV0ZXggYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZGl0aW9uIHZhcmlhYmxlIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBtdXRleAorICAvLyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25kaXRpb24gdmFyaWFibGUgbXVzdCBiZSBsb2NrZWQgd2hlbiB0aGlzIGlzIGNhbGxlZAorICAvLyBhbmQgd2lsbCBiZSBsb2NrZWQgd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAvLyBOT1RFOiBUaGUgcmVsb2NraW5nIG9mIHRoZSBtdXRleCBpcyBub3QgcGVyZm9ybWVkIGF0b21pY2FsbHkgd2l0aCB3YWtpbmcKKyAgLy8gdXAuCisgIC8vIFJldHVybnMgZmFsc2UuCisgIGJvb2wgV2FpdCgpIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworCisgIC8vIFNpZ25hbHMgYXBwcm94aW1hdGVseSAxIG90aGVyIHByb2Nlc3MgY3VycmVudGx5IFdhaXQoKWluZyBvbiB0aGlzIGNvbmRpdGlvbgorICAvLyB2YXJpYWJsZS4gQ2FsbGluZyB0aGlzIGRvZXMgbm90IHJlcXVpcmUgdGhlIG11dGV4IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgIC8vIGNvbmRpdGlvbiB2YXJpYWJsZSB0byBiZSBsb2NrZWQuCisgIC8vIE9uZSBvZiB0aGUgcHJvY2Vzc2VzIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbGV2ZWwgd2lsbCBiZSB3b2tlbi4KKyAgLy8gSWYgdGhlcmUgYXJlbid0IGFueSB3YWl0aW5nIGF0IHRoZSB0aW1lLCBub25lIHdpbGwgYmUgd29rZW4uIFRoZXJlIGlzIGEKKyAgLy8gc21hbGwgcmFjZSBjb25kaXRpb24gaW4gdGhlIExpbnV4IGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIHJlc3VsdCBpbiBtb3JlCisgIC8vIHRoYW4gMSBiZWluZyB3b2tlbi4KKyAgdm9pZCBTaWduYWwoKTsKKyAgLy8gV2FrZXMgYWxsIHByb2Nlc3NlcyB0aGF0IGFyZSBjdXJyZW50bHkgV2FpdCgpaW5nIG9uIHRoaXMgY29uZGl0aW9uCisgIC8vIHZhcmlhYmxlLiBDYWxsaW5nIHRoaXMgZG9lcyBub3QgcmVxdWlyZSB0aGUgbXV0ZXggYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGJlIGxvY2tlZC4KKyAgdm9pZCBCcm9hZGNhc3QoKTsKKworICAvLyBSZXRyaWV2ZXMgdGhlIG11dGV4IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmRpdGlvbiB2YXJpYWJsZS4KKyAgTXV0ZXggKm0oKSB7IHJldHVybiBtXzsgfQorCisgcHJpdmF0ZToKKyAgYW9zX2NvbmRpdGlvbiBpbXBsXzsKKyAgTXV0ZXggKm1fOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fQ09ORElUSU9OX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2NvbmRpdGlvbl90ZXN0LmNjIGIvYW9zL2NvbW1vbi9jb25kaXRpb25fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzEwMjczCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9jb25kaXRpb25fdGVzdC5jYwpAQCAtMCwwICsxLDM2NyBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vY29uZGl0aW9uLmgiCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbXV0ZXguaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL2NvcmVfbGliLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL21hY3Jvcy5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvYW9zX3N5bmMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2RpZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC90aHJlYWQuaCIKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7Cit1c2luZyA6OmFvczo6Y29tbW9uOjp0ZXN0aW5nOjpHbG9iYWxDb3JlSW5zdGFuY2U7CisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBDb25kaXRpb25UZXN0Q29tbW9uIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBDb25kaXRpb25UZXN0Q29tbW9uKCkge30KKworICB2b2lkIFNldHRsZSgpIHsKKyAgICB0aW1lOjpTbGVlcEZvcig6OlRpbWU6OkluU2Vjb25kcygwLjAwOCkpOworICB9CisKKyBwcml2YXRlOgorICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29uZGl0aW9uVGVzdENvbW1vbik7Cit9OworCisvLyBTb21lIHNpbXBsZSB0ZXN0cyB0aGF0IGRvbid0IHJlbHkgb24gYSBHbG9iYWxDb3JlSW5zdGFuY2UgdG8gaGVscCB3aXRoCisvLyBkZWJ1Z2dpbmcgcHJvYmxlbXMgdGhhdCBjYXVzZSB0ZXN0cyB1c2luZyB0aGF0IHRvIGp1c3QgY29tcGxldGVseSBsb2NrIHVwLgorY2xhc3MgU2ltcGxlQ29uZGl0aW9uVGVzdCA6IHB1YmxpYyBDb25kaXRpb25UZXN0Q29tbW9uIHsKKyBwdWJsaWM6CisgIFNpbXBsZUNvbmRpdGlvblRlc3QoKSA6IGNvbmRpdGlvbl8oJm11dGV4Xykge30KKworICBNdXRleCBtdXRleF87CisgIENvbmRpdGlvbiBjb25kaXRpb25fOworCisgcHJpdmF0ZToKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNpbXBsZUNvbmRpdGlvblRlc3QpOworfTsKKworLy8gTWFrZXMgc3VyZSB0aGF0IG5vdGhpbmcgY3Jhc2hlcyBvciBhbnl0aGluZyB3aXRoIGEgYmFzaWMgV2FpdCgpIGFuZCB0aGVuCisvLyBTaWduYWwoKS4KKy8vIFRoaXMgdGVzdCBpcyB3cml0dGVuIHRvIGhvcGVmdWxseSBmYWlsIGluc3RlYWQgb2YgZGVhZGxvY2tpbmcgb24gZmFpbHVyZSwgYnV0CisvLyBpdCdzIHRyaWNreSBiZWNhdXNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGtpbGwgdGhlIGNoaWxkIGluIHRoZSBtaWRkbGUuCitURVNUX0YoU2ltcGxlQ29uZGl0aW9uVGVzdCwgQmFzaWMpIHsKKyAgOjpzdGQ6OmF0b21pY19ib29sIGNoaWxkX2ZpbmlzaGVkKGZhbHNlKTsKKyAgQ29uZGl0aW9uIGNoaWxkX3JlYWR5KCZtdXRleF8pOworICBBU1NFUlRfRkFMU0UobXV0ZXhfLkxvY2soKSk7CisgIHV0aWw6OkZ1bmN0aW9uVGhyZWFkIGNoaWxkKFt0aGlzLCAmY2hpbGRfZmluaXNoZWQsICZjaGlsZF9yZWFkeV0oCisgICAgICB1dGlsOjpGdW5jdGlvblRocmVhZCAqKSB7CisgICAgQVNTRVJUX0ZBTFNFKG11dGV4Xy5Mb2NrKCkpOworICAgIGNoaWxkX3JlYWR5LkJyb2FkY2FzdCgpOworICAgIEFTU0VSVF9GQUxTRShjb25kaXRpb25fLldhaXQoKSk7CisgICAgY2hpbGRfZmluaXNoZWQuc3RvcmUodHJ1ZSk7CisgICAgbXV0ZXhfLlVubG9jaygpOworICB9KTsKKyAgY2hpbGQuU3RhcnQoKTsKKyAgQVNTRVJUX0ZBTFNFKGNoaWxkX3JlYWR5LldhaXQoKSk7CisgIEVYUEVDVF9GQUxTRShjaGlsZF9maW5pc2hlZC5sb2FkKCkpOworICBjb25kaXRpb25fLlNpZ25hbCgpOworICBtdXRleF8uVW5sb2NrKCk7CisgIGNoaWxkLkpvaW4oKTsKKyAgRVhQRUNUX1RSVUUoY2hpbGRfZmluaXNoZWQubG9hZCgpKTsKK30KKworY2xhc3MgQ29uZGl0aW9uVGVzdCA6IHB1YmxpYyBDb25kaXRpb25UZXN0Q29tbW9uIHsKKyBwdWJsaWM6CisgIHN0cnVjdCBTaGFyZWQgeworICAgIFNoYXJlZCgpIDogY29uZGl0aW9uKCZtdXRleCkge30KKworICAgIE11dGV4IG11dGV4OworICAgIENvbmRpdGlvbiBjb25kaXRpb247CisgIH07CisgIHN0YXRpY19hc3NlcnQoc2htX29rPFNoYXJlZD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJpdCdzIGdvaW5nIHRvIGdldCBzaGFyZWQgYmV0d2VlbiBmb3JrZWQgcHJvY2Vzc2VzIik7CisKKyAgQ29uZGl0aW9uVGVzdCgpIDogc2hhcmVkXyhzdGF0aWNfY2FzdDxTaGFyZWQgKj4oc2htX21hbGxvYyhzaXplb2YoU2hhcmVkKSkpKSB7CisgICAgbmV3IChzaGFyZWRfKSBTaGFyZWQoKTsKKyAgfQorICB+Q29uZGl0aW9uVGVzdCgpIHsKKyAgICBzaGFyZWRfLT5+U2hhcmVkKCk7CisgIH0KKworICBHbG9iYWxDb3JlSW5zdGFuY2UgbXlfY29yZTsKKworICBTaGFyZWQgKmNvbnN0IHNoYXJlZF87CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgU2V0RGllVGVzdE1vZGUodHJ1ZSk7CisgIH0KKworIHByaXZhdGU6CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDb25kaXRpb25UZXN0KTsKK307CisKK2NsYXNzIENvbmRpdGlvblRlc3RQcm9jZXNzIHsKKyBwdWJsaWM6CisgIGVudW0gY2xhc3MgQWN0aW9uIHsKKyAgICBrV2FpdExvY2tTdGFydCwgIC8vIGxvY2ssIGRlbGF5LCB3YWl0LCB1bmxvY2sKKyAgICBrV2FpdCwgIC8vIGRlbGF5LCBsb2NrLCB3YWl0LCB1bmxvY2sKKyAgICBrV2FpdE5vVW5sb2NrLCAgLy8gZGVsYXksIGxvY2ssIHdhaXQKKyAgfTsKKworICAvLyBUaGlzIGFtb3VudCBnZXRzIGFkZGVkIHRvIGFueSBwYXNzZWQgaW4gZGVsYXkgdG8gbWFrZSB0aGUgdGVzdCByZXBlYXRhYmxlLgorICBzdGF0aWMgY29uc3RleHByIDo6VGltZSBrTWluaW11bURlbGF5ID0gOjpUaW1lOjpJblNlY29uZHMoMC4xNSk7CisgIHN0YXRpYyBjb25zdGV4cHIgOjpUaW1lIGtEZWZhdWx0VGltZW91dCA9IDo6VGltZTo6SW5TZWNvbmRzKDAuMTUpOworCisgIC8vIGRlbGF5IGlzIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGRvaW5nIGFjdGlvbiB0byBjb25kaXRpb24uCisgIC8vIHRpbWVvdXQgaXMgaG93IGxvbmcgdG8gd2FpdCBhZnRlciBkZWxheSBiZWZvcmUgZGVjaWRpbmcgdGhhdCBpdCdzIGh1bmcuCisgIENvbmRpdGlvblRlc3RQcm9jZXNzKGNvbnN0IDo6VGltZSAmZGVsYXksIEFjdGlvbiBhY3Rpb24sIENvbmRpdGlvbiAqY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OlRpbWUgJnRpbWVvdXQgPSBrRGVmYXVsdFRpbWVvdXQpCisgICAgOiBkZWxheV8oa01pbmltdW1EZWxheSArIGRlbGF5KSwgYWN0aW9uXyhhY3Rpb24pLCBjb25kaXRpb25fKGNvbmRpdGlvbiksCisgICAgICB0aW1lb3V0XyhkZWxheV8gKyB0aW1lb3V0KSwgY2hpbGRfKC0xKSwKKyAgICAgIHNoYXJlZF8oc3RhdGljX2Nhc3Q8U2hhcmVkICo+KHNobV9tYWxsb2Moc2l6ZW9mKFNoYXJlZCkpKSkgeworICAgIG5ldyAoc2hhcmVkXykgU2hhcmVkKCk7CisgIH0KKyAgfkNvbmRpdGlvblRlc3RQcm9jZXNzKCkgeworICAgIENIRUNLX0VRKGNoaWxkXywgLTEpOworICB9CisKKyAgdm9pZCBTdGFydCgpIHsKKyAgICBBU1NFUlRfRkFMU0Uoc2hhcmVkXy0+c3RhcnRlZCk7CisKKyAgICBjaGlsZF8gPSBmb3JrKCk7CisgICAgaWYgKGNoaWxkXyA9PSAwKSB7ICAvLyBpbiBjaGlsZAorICAgICAgOjphb3M6OmNvbW1vbjo6dGVzdGluZzo6UHJldmVudEV4aXQoKTsKKyAgICAgIFJ1bigpOworICAgICAgZXhpdChFWElUX1NVQ0NFU1MpOworICAgIH0gZWxzZSB7ICAvLyBpbiBwYXJlbnQKKyAgICAgIENIRUNLX05FKGNoaWxkXywgLTEpOworCisgICAgICBBU1NFUlRfRVEoMCwgZnV0ZXhfd2FpdCgmc2hhcmVkXy0+cmVhZHkpKTsKKworICAgICAgc2hhcmVkXy0+c3RhcnRlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgYm9vbCBJc0ZpbmlzaGVkKCkgeworICAgIHJldHVybiBzaGFyZWRfLT5maW5pc2hlZDsKKyAgfQorCisgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IEh1bmcoKSB7CisgICAgaWYgKCFzaGFyZWRfLT5zdGFydGVkKSB7CisgICAgICBBRERfRkFJTFVSRSgpOworICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJub3Qgc3RhcnRlZCB5ZXQiOworICAgIH0KKyAgICBpZiAoc2hhcmVkXy0+ZmluaXNoZWQpIHsKKyAgICAgIEpvaW4oKTsKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCAiYWxyZWFkeSByZXR1cm5lZCI7CisgICAgfQorICAgIGlmIChzaGFyZWRfLT5kZWxheWVkKSB7CisgICAgICBpZiAoc2hhcmVkXy0+c3RhcnRfdGltZSA+IDo6VGltZTo6Tm93KCkgKyB0aW1lb3V0XykgeworICAgICAgICBLaWxsKCk7CisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKSA8PCAiYWxyZWFkeSBiZWVuIHRvbyBsb25nIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQ0hFQ0tfRVEoMCwgZnV0ZXhfd2FpdCgmc2hhcmVkXy0+ZG9uZV9kZWxheWluZykpOworICAgIH0KKyAgICB0aW1lOjpTbGVlcEZvcig6OlRpbWU6OkluU2Vjb25kcygwLjAxKSk7CisgICAgaWYgKCFzaGFyZWRfLT5maW5pc2hlZCkgdGltZTo6U2xlZXBVbnRpbChzaGFyZWRfLT5zdGFydF90aW1lICsgdGltZW91dF8pOworICAgIGlmIChzaGFyZWRfLT5maW5pc2hlZCkgeworICAgICAgSm9pbigpOworICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJjb21wbGV0ZWQgd2l0aGluIHRpbWVvdXQiOworICAgIH0gZWxzZSB7CisgICAgICBLaWxsKCk7CisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCkgPDwgInRvb2sgdG9vIGxvbmciOworICAgIH0KKyAgfQorICA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBUZXN0KCkgeworICAgIFN0YXJ0KCk7CisgICAgcmV0dXJuIEh1bmcoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RydWN0IFNoYXJlZCB7CisgICAgU2hhcmVkKCkKKyAgICAgIDogc3RhcnRlZChmYWxzZSksIGRlbGF5ZWQoZmFsc2UpLCBkb25lX2RlbGF5aW5nKDApLCBzdGFydF90aW1lKDAsIDApLAorICAgICAgICBmaW5pc2hlZChmYWxzZSksIHJlYWR5KDApIHsKKyAgICB9CisKKyAgICB2b2xhdGlsZSBib29sIHN0YXJ0ZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBkZWxheWVkOworICAgIGFvc19mdXRleCBkb25lX2RlbGF5aW5nOworICAgIDo6VGltZSBzdGFydF90aW1lOworICAgIHZvbGF0aWxlIGJvb2wgZmluaXNoZWQ7CisgICAgYW9zX2Z1dGV4IHJlYWR5OworICB9OworICBzdGF0aWNfYXNzZXJ0KHNobV9vazxTaGFyZWQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiaXQncyBnb2luZyB0byBnZXQgc2hhcmVkIGJldHdlZW4gZm9ya2VkIHByb2Nlc3NlcyIpOworCisgIHZvaWQgUnVuKCkgeworICAgIGlmIChhY3Rpb25fID09IEFjdGlvbjo6a1dhaXRMb2NrU3RhcnQpIHsKKyAgICAgIEFTU0VSVF9FUSgxLCBmdXRleF9zZXQoJnNoYXJlZF8tPnJlYWR5KSk7CisgICAgICBBU1NFUlRfRkFMU0UoY29uZGl0aW9uXy0+bSgpLT5Mb2NrKCkpOworICAgIH0KKyAgICB0aW1lOjpTbGVlcEZvcihkZWxheV8pOworICAgIHNoYXJlZF8tPnN0YXJ0X3RpbWUgPSA6OlRpbWU6Ok5vdygpOworICAgIHNoYXJlZF8tPmRlbGF5ZWQgPSB0cnVlOworICAgIEFTU0VSVF9ORSgtMSwgZnV0ZXhfc2V0KCZzaGFyZWRfLT5kb25lX2RlbGF5aW5nKSk7CisgICAgaWYgKGFjdGlvbl8gIT0gQWN0aW9uOjprV2FpdExvY2tTdGFydCkgeworICAgICAgQVNTRVJUX0VRKDEsIGZ1dGV4X3NldCgmc2hhcmVkXy0+cmVhZHkpKTsKKyAgICAgIEFTU0VSVF9GQUxTRShjb25kaXRpb25fLT5tKCktPkxvY2soKSk7CisgICAgfQorICAgIC8vIFRPRE8oYnJpYW5zKTogVGVzdCB0aGlzIHJldHVybmluZyB0cnVlIChha2EgdGhlIG93bmVyIGR5aW5nKS4KKyAgICBBU1NFUlRfRkFMU0UoY29uZGl0aW9uXy0+V2FpdCgpKTsKKyAgICBzaGFyZWRfLT5maW5pc2hlZCA9IHRydWU7CisgICAgaWYgKGFjdGlvbl8gIT0gQWN0aW9uOjprV2FpdE5vVW5sb2NrKSB7CisgICAgICBjb25kaXRpb25fLT5tKCktPlVubG9jaygpOworICAgIH0KKyAgfQorCisgIHZvaWQgSm9pbigpIHsKKyAgICBDSEVDS19ORShjaGlsZF8sIC0xKTsKKyAgICBpbnQgc3RhdHVzOworICAgIGRvIHsKKyAgICAgIENIRUNLX0VRKHdhaXRwaWQoY2hpbGRfLCAmc3RhdHVzLCAwKSwgY2hpbGRfKTsKKyAgICB9IHdoaWxlICghKFdJRkVYSVRFRChzdGF0dXMpIHx8IFdJRlNJR05BTEVEKHN0YXR1cykpKTsKKyAgICBjaGlsZF8gPSAtMTsKKyAgfQorICB2b2lkIEtpbGwoKSB7CisgICAgQ0hFQ0tfTkUoY2hpbGRfLCAtMSk7CisgICAgUENIRUNLKGtpbGwoY2hpbGRfLCBTSUdURVJNKSk7CisgICAgSm9pbigpOworICB9CisKKyAgY29uc3QgOjpUaW1lIGRlbGF5XzsKKyAgY29uc3QgQWN0aW9uIGFjdGlvbl87CisgIENvbmRpdGlvbiAqY29uc3QgY29uZGl0aW9uXzsKKyAgY29uc3QgOjpUaW1lIHRpbWVvdXRfOworCisgIHBpZF90IGNoaWxkXzsKKworICBTaGFyZWQgKmNvbnN0IHNoYXJlZF87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbmRpdGlvblRlc3RQcm9jZXNzKTsKK307Citjb25zdGV4cHIgOjpUaW1lIENvbmRpdGlvblRlc3RQcm9jZXNzOjprTWluaW11bURlbGF5OworY29uc3RleHByIDo6VGltZSBDb25kaXRpb25UZXN0UHJvY2Vzczo6a0RlZmF1bHRUaW1lb3V0OworCisvLyBNYWtlcyBzdXJlIHRoYXQgdGhlIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCBldmVyeXRoaW5nIHdvcmsgZm9yIGEgcmVhbGx5IHNpbXBsZQorLy8gV2FpdCgpIGFuZCB0aGVuIFNpZ25hbCgpLgorVEVTVF9GKENvbmRpdGlvblRlc3QsIEJhc2ljKSB7CisgIENvbmRpdGlvblRlc3RQcm9jZXNzIGNoaWxkKDo6VGltZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVGVzdFByb2Nlc3M6OkFjdGlvbjo6a1dhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFyZWRfLT5jb25kaXRpb24pOworICBjaGlsZC5TdGFydCgpOworICBTZXR0bGUoKTsKKyAgRVhQRUNUX0ZBTFNFKGNoaWxkLklzRmluaXNoZWQoKSk7CisgIHNoYXJlZF8tPmNvbmRpdGlvbi5TaWduYWwoKTsKKyAgRVhQRUNUX0ZBTFNFKGNoaWxkLkh1bmcoKSk7Cit9CisKKy8vIE1ha2VzIHN1cmUgdGhhdCB0aGUgd29ya2VyIGNoaWxkIGxvY2tzIGJlZm9yZSBpdCB0cmllcyB0byBXYWl0KCkgZXRjLgorVEVTVF9GKENvbmRpdGlvblRlc3QsIExvY2tpbmcpIHsKKyAgQ29uZGl0aW9uVGVzdFByb2Nlc3MgY2hpbGQoOjpUaW1lKDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25UZXN0UHJvY2Vzczo6QWN0aW9uOjprV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJlZF8tPmNvbmRpdGlvbik7CisgIEFTU0VSVF9GQUxTRShzaGFyZWRfLT5tdXRleC5Mb2NrKCkpOworICBjaGlsZC5TdGFydCgpOworICBTZXR0bGUoKTsKKyAgLy8gVGhpcyBTaWduYWwoKSBzaG91bGRuJ3QgZG8gYW55dGhpbmcgYmVjYXVzZSB0aGUgY2hpbGQgc2hvdWxkIHN0aWxsIGJlCisgIC8vIHdhaXRpbmcgdG8gbG9jayB0aGUgbXV0ZXguCisgIHNoYXJlZF8tPmNvbmRpdGlvbi5TaWduYWwoKTsKKyAgU2V0dGxlKCk7CisgIHNoYXJlZF8tPm11dGV4LlVubG9jaygpOworICBFWFBFQ1RfVFJVRShjaGlsZC5IdW5nKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSB3b3JrIGNoaWxkIG9ubHkgY2F0Y2hlcyBhIFNpZ25hbCgpIGFmdGVyIHRoZSBtdXRleCBnZXRzCisvLyB1bmxvY2tlZC4KK1RFU1RfRihDb25kaXRpb25UZXN0LCBMb2NrRmlyc3QpIHsKKyAgQ29uZGl0aW9uVGVzdFByb2Nlc3MgY2hpbGQoOjpUaW1lKDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25UZXN0UHJvY2Vzczo6QWN0aW9uOjprV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJlZF8tPmNvbmRpdGlvbik7CisgIEFTU0VSVF9GQUxTRShzaGFyZWRfLT5tdXRleC5Mb2NrKCkpOworICBjaGlsZC5TdGFydCgpOworICBTZXR0bGUoKTsKKyAgc2hhcmVkXy0+Y29uZGl0aW9uLlNpZ25hbCgpOworICBTZXR0bGUoKTsKKyAgRVhQRUNUX0ZBTFNFKGNoaWxkLklzRmluaXNoZWQoKSk7CisgIHNoYXJlZF8tPm11dGV4LlVubG9jaygpOworICBTZXR0bGUoKTsKKyAgRVhQRUNUX0ZBTFNFKGNoaWxkLklzRmluaXNoZWQoKSk7CisgIHNoYXJlZF8tPmNvbmRpdGlvbi5TaWduYWwoKTsKKyAgRVhQRUNUX0ZBTFNFKGNoaWxkLkh1bmcoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIG11dGV4IGdldHMgcmVsb2NrZWQgYWZ0ZXIgV2FpdCgpIHJldHVybnMuCitURVNUX0YoQ29uZGl0aW9uVGVzdCwgUmVsb2NraW5nKSB7CisgIENvbmRpdGlvblRlc3RQcm9jZXNzIGNoaWxkKDo6VGltZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVGVzdFByb2Nlc3M6OkFjdGlvbjo6a1dhaXROb1VubG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJlZF8tPmNvbmRpdGlvbik7CisgIGNoaWxkLlN0YXJ0KCk7CisgIFNldHRsZSgpOworICBzaGFyZWRfLT5jb25kaXRpb24uU2lnbmFsKCk7CisgIEVYUEVDVF9GQUxTRShjaGlsZC5IdW5nKCkpOworICBFWFBFQ1RfRVEoTXV0ZXg6OlN0YXRlOjprTG9ja0ZhaWxlZCwgc2hhcmVkXy0+bXV0ZXguVHJ5TG9jaygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBTaWduYWwoKSBzdG9wcyBleGFjdGx5IDEgV2FpdCgpZXIuCitURVNUX0YoQ29uZGl0aW9uVGVzdCwgU2lnbmFsT25lKSB7CisgIENvbmRpdGlvblRlc3RQcm9jZXNzIGNoaWxkMSg6OlRpbWUoMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25UZXN0UHJvY2Vzczo6QWN0aW9uOjprV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFyZWRfLT5jb25kaXRpb24pOworICBDb25kaXRpb25UZXN0UHJvY2VzcyBjaGlsZDIoOjpUaW1lKDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVGVzdFByb2Nlc3M6OkFjdGlvbjo6a1dhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcmVkXy0+Y29uZGl0aW9uKTsKKyAgQ29uZGl0aW9uVGVzdFByb2Nlc3MgY2hpbGQzKDo6VGltZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvblRlc3RQcm9jZXNzOjpBY3Rpb246OmtXYWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJlZF8tPmNvbmRpdGlvbik7CisgIGF1dG8gbnVtYmVyX2ZpbmlzaGVkID0gWyZdKCkgeyByZXR1cm4gKGNoaWxkMS5Jc0ZpbmlzaGVkKCkgPyAxIDogMCkgKworICAgIChjaGlsZDIuSXNGaW5pc2hlZCgpID8gMSA6IDApICsgKGNoaWxkMy5Jc0ZpbmlzaGVkKCkgPyAxIDogMCk7IH07CisgIGNoaWxkMS5TdGFydCgpOworICBjaGlsZDIuU3RhcnQoKTsKKyAgY2hpbGQzLlN0YXJ0KCk7CisgIFNldHRsZSgpOworICBFWFBFQ1RfRVEoMCwgbnVtYmVyX2ZpbmlzaGVkKCkpOworICBzaGFyZWRfLT5jb25kaXRpb24uU2lnbmFsKCk7CisgIFNldHRsZSgpOworICBFWFBFQ1RfRVEoMSwgbnVtYmVyX2ZpbmlzaGVkKCkpOworICBzaGFyZWRfLT5jb25kaXRpb24uU2lnbmFsKCk7CisgIFNldHRsZSgpOworICBFWFBFQ1RfRVEoMiwgbnVtYmVyX2ZpbmlzaGVkKCkpOworICBzaGFyZWRfLT5jb25kaXRpb24uU2lnbmFsKCk7CisgIFNldHRsZSgpOworICBFWFBFQ1RfRVEoMywgbnVtYmVyX2ZpbmlzaGVkKCkpOworICBFWFBFQ1RfRkFMU0UoY2hpbGQxLkh1bmcoKSk7CisgIEVYUEVDVF9GQUxTRShjaGlsZDIuSHVuZygpKTsKKyAgRVhQRUNUX0ZBTFNFKGNoaWxkMy5IdW5nKCkpOworfQorCisvLyBUZXN0cyB0aGF0IEJyb2RjYXN0KCkgd2FrZXMgbXVsdGlwbGUgV2FpdCgpZXJzLgorVEVTVF9GKENvbmRpdGlvblRlc3QsIEJyb2FkY2FzdCkgeworICBDb25kaXRpb25UZXN0UHJvY2VzcyBjaGlsZDEoOjpUaW1lKDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVGVzdFByb2Nlc3M6OkFjdGlvbjo6a1dhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcmVkXy0+Y29uZGl0aW9uKTsKKyAgQ29uZGl0aW9uVGVzdFByb2Nlc3MgY2hpbGQyKDo6VGltZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvblRlc3RQcm9jZXNzOjpBY3Rpb246OmtXYWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJlZF8tPmNvbmRpdGlvbik7CisgIENvbmRpdGlvblRlc3RQcm9jZXNzIGNoaWxkMyg6OlRpbWUoMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25UZXN0UHJvY2Vzczo6QWN0aW9uOjprV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFyZWRfLT5jb25kaXRpb24pOworICBjaGlsZDEuU3RhcnQoKTsKKyAgY2hpbGQyLlN0YXJ0KCk7CisgIGNoaWxkMy5TdGFydCgpOworICBTZXR0bGUoKTsKKyAgc2hhcmVkXy0+Y29uZGl0aW9uLkJyb2FkY2FzdCgpOworICBFWFBFQ1RfRkFMU0UoY2hpbGQxLkh1bmcoKSk7CisgIEVYUEVDVF9GQUxTRShjaGlsZDIuSHVuZygpKTsKKyAgRVhQRUNUX0ZBTFNFKGNoaWxkMy5IdW5nKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AtdG1wbC5oIGIvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AtdG1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjM5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC10bXBsLmgKQEAgLTAsMCArMSwxMzAgQEAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL21lc3NhZ2VzL3JvYm90X3N0YXRlLnEuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBjb250cm9scyB7CisKKy8vIFRPRE8oYXNjaHVoKTogVGVzdHMuCisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIDo6YW9zOjp0aW1lOjpUaW1lIENvbnRyb2xMb29wPFQ+OjprU3RhbGVMb2dJbnRlcnZhbDsKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIDo6YW9zOjp0aW1lOjpUaW1lIENvbnRyb2xMb29wPFQ+OjprUHdtRGlzYWJsZVRpbWU7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBDb250cm9sTG9vcDxUPjo6WmVyb091dHB1dHMoKSB7CisgIGFvczo6U2NvcGVkTWVzc2FnZVB0cjxPdXRwdXRUeXBlPiBvdXRwdXQgPQorICAgICAgY29udHJvbF9sb29wXy0+b3V0cHV0Lk1ha2VNZXNzYWdlKCk7CisgIFplcm8ob3V0cHV0LmdldCgpKTsKKyAgb3V0cHV0LlNlbmQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIENvbnRyb2xMb29wPFQ+OjpJdGVyYXRlKCkgeworICBub19nb2FsXy5QcmludCgpOworICBkcml2ZXJfc3RhdGlvbl9vbGRfLlByaW50KCk7CisgIG5vX3NlbnNvcl9zdGF0ZV8uUHJpbnQoKTsKKyAgbm9fZHJpdmVyX3N0YXRpb25fLlByaW50KCk7CisgIG1vdG9yc19vZmZfbG9nXy5QcmludCgpOworCisgIGNvbnRyb2xfbG9vcF8tPnBvc2l0aW9uLkZldGNoQW5vdGhlcigpOworICBjb25zdCBQb3NpdGlvblR5cGUgKmNvbnN0IHBvc2l0aW9uID0gY29udHJvbF9sb29wXy0+cG9zaXRpb24uZ2V0KCk7CisgIExPR19TVFJVQ1QoREVCVUcsICJwb3NpdGlvbiIsICpwb3NpdGlvbik7CisKKyAgLy8gRmV0Y2ggdGhlIGxhdGVzdCBjb250cm9sIGxvb3AgZ29hbC4gSWYgdGhlcmUgaXMgbm8gbmV3CisgIC8vIGdvYWwsIHdlIHdpbGwganVzdCByZXVzZSB0aGUgb2xkIG9uZS4KKyAgY29udHJvbF9sb29wXy0+Z29hbC5GZXRjaExhdGVzdCgpOworICBjb25zdCBHb2FsVHlwZSAqZ29hbCA9IGNvbnRyb2xfbG9vcF8tPmdvYWwuZ2V0KCk7CisgIGlmIChnb2FsKSB7CisgICAgTE9HX1NUUlVDVChERUJVRywgImdvYWwiLCAqZ29hbCk7CisgIH0gZWxzZSB7CisgICAgTE9HX0lOVEVSVkFMKG5vX2dvYWxfKTsKKyAgfQorCisgIDo6YW9zOjpyb2JvdF9zdGF0ZS5GZXRjaExhdGVzdCgpOworICBpZiAoITo6YW9zOjpyb2JvdF9zdGF0ZS5nZXQoKSkgeworICAgIExPR19JTlRFUlZBTChub19zZW5zb3Jfc3RhdGVfKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHNlbnNvcl9yZWFkZXJfcGlkXyAhPSA6OmFvczo6cm9ib3Rfc3RhdGUtPnJlYWRlcl9waWQpIHsKKyAgICBMT0coSU5GTywgIm5ldyBzZW5zb3IgcmVhZGVyIFBJRCAlIiBQUklkMzIgIiwgb2xkIHdhcyAlIiBQUklkMzIgIlxuIiwKKyAgICAgICAgOjphb3M6OnJvYm90X3N0YXRlLT5yZWFkZXJfcGlkLCBzZW5zb3JfcmVhZGVyX3BpZF8pOworICAgIHJlc2V0XyA9IHRydWU7CisgICAgc2Vuc29yX3JlYWRlcl9waWRfID0gOjphb3M6OnJvYm90X3N0YXRlLT5yZWFkZXJfcGlkOworICB9CisKKyAgYm9vbCBvdXRwdXRzX2VuYWJsZWQgPSBmYWxzZTsKKworICAvLyBDaGVjayB0byBzZWUgaWYgd2UgZ290IGEgZHJpdmVyIHN0YXRpb24gcGFja2V0IHJlY2VudGx5LgorICBpZiAoOjphb3M6OmpveXN0aWNrX3N0YXRlLkZldGNoTGF0ZXN0KCkpIHsKKyAgICBpZiAoOjphb3M6OmpveXN0aWNrX3N0YXRlLT5lbmFibGVkKSBvdXRwdXRzX2VuYWJsZWQgPSB0cnVlOworICAgIGlmICg6OmFvczo6cm9ib3Rfc3RhdGUtPm91dHB1dHNfZW5hYmxlZCkgeworICAgICAgLy8gSWYgdGhlIGRyaXZlcidzIHN0YXRpb24gcmVwb3J0cyBiZWluZyBkaXNhYmxlZCwgd2UncmUgcHJvYmFibHkgbm90CisgICAgICAvLyBhY3R1YWxseSBnb2luZyB0byBzZW5kIG1vdG9yIHZhbHVlcyByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIEZQR0EKKyAgICAgIC8vIHJlcG9ydHMuCisgICAgICBpZiAoOjphb3M6OmpveXN0aWNrX3N0YXRlLT5lbmFibGVkKSB7CisgICAgICAgIGxhc3RfcHdtX3NlbnRfID0gOjphb3M6OnJvYm90X3N0YXRlLT5zZW50X3RpbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0coV0FSTklORywgIm91dHB1dHMgZW5hYmxlZCB3aGlsZSBkaXNhYmxlZFxuIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmICg6OmFvczo6am95c3RpY2tfc3RhdGUtPmVuYWJsZWQpIHsKKyAgICAgIExPRyhXQVJOSU5HLCAib3V0cHV0cyBkaXNhYmxlZCB3aGlsZSBlbmFibGVkXG4iKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoOjphb3M6OmpveXN0aWNrX3N0YXRlLklzTmV3ZXJUaGFuTVMoa0RTUGFja2V0VGltZW91dE1zKSkgeworICAgIGlmICg6OmFvczo6am95c3RpY2tfc3RhdGUtPmVuYWJsZWQpIHsKKyAgICAgIG91dHB1dHNfZW5hYmxlZCA9IHRydWU7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICg6OmFvczo6am95c3RpY2tfc3RhdGUuZ2V0KCkpIHsKKyAgICAgIExPR19JTlRFUlZBTChkcml2ZXJfc3RhdGlvbl9vbGRfKTsKKyAgICB9IGVsc2UgeworICAgICAgTE9HX0lOVEVSVkFMKG5vX2RyaXZlcl9zdGF0aW9uXyk7CisgICAgfQorICB9CisKKyAgY29uc3QgYm9vbCBtb3RvcnNfb2ZmID0KKyAgICAgICg6OmFvczo6dGltZTo6VGltZTo6Tm93KCkgLSBsYXN0X3B3bV9zZW50XykgPj0ga1B3bURpc2FibGVUaW1lOworICBpZiAobW90b3JzX29mZikgeworICAgIGlmICg6OmFvczo6am95c3RpY2tfc3RhdGUuZ2V0KCkgJiYgOjphb3M6OmpveXN0aWNrX3N0YXRlLT5lbmFibGVkKSB7CisgICAgICBMT0dfSU5URVJWQUwobW90b3JzX29mZl9sb2dfKTsKKyAgICB9CisgICAgb3V0cHV0c19lbmFibGVkID0gZmFsc2U7CisgIH0KKworICBhb3M6OlNjb3BlZE1lc3NhZ2VQdHI8U3RhdHVzVHlwZT4gc3RhdHVzID0KKyAgICAgIGNvbnRyb2xfbG9vcF8tPnN0YXR1cy5NYWtlTWVzc2FnZSgpOworICBpZiAoc3RhdHVzLmdldCgpID09IG51bGxwdHIpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAob3V0cHV0c19lbmFibGVkKSB7CisgICAgYW9zOjpTY29wZWRNZXNzYWdlUHRyPE91dHB1dFR5cGU+IG91dHB1dCA9CisgICAgICAgIGNvbnRyb2xfbG9vcF8tPm91dHB1dC5NYWtlTWVzc2FnZSgpOworICAgIFJ1bkl0ZXJhdGlvbihnb2FsLCBwb3NpdGlvbiwgb3V0cHV0LmdldCgpLCBzdGF0dXMuZ2V0KCkpOworCisgICAgTE9HX1NUUlVDVChERUJVRywgIm91dHB1dCIsICpvdXRwdXQpOworICAgIG91dHB1dC5TZW5kKCk7CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIG91dHB1dHMgYXJlIGRpc2FibGVkLCBzbyBwYXNzIG51bGxwdHIgaW4gZm9yIHRoZSBvdXRwdXQuCisgICAgUnVuSXRlcmF0aW9uKGdvYWwsIHBvc2l0aW9uLCBudWxscHRyLCBzdGF0dXMuZ2V0KCkpOworICAgIFplcm9PdXRwdXRzKCk7CisgIH0KKworICBMT0dfU1RSVUNUKERFQlVHLCAic3RhdHVzIiwgKnN0YXR1cyk7CisgIHN0YXR1cy5TZW5kKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBDb250cm9sTG9vcDxUPjo6UnVuKCkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIEl0ZXJhdGUoKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbHMKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wLmNjIGIvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxNDI1NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wLmNjCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbnRyb2xzIHsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xzCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC5oIGIvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZlNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaApAQCAtMCwwICsxLDE3NiBAQAorI2lmbmRlZiBBT1NfQ09OVFJPTF9MT09QX0NPTlRST0xfTE9PUF9IXworI2RlZmluZSBBT1NfQ09OVFJPTF9MT09QX0NPTlRST0xfTE9PUF9IXworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9sb2dfaW50ZXJ2YWwuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgY29udHJvbHMgeworCisvLyBJbnRlcmZhY2UgdG8gZGVzY3JpYmUgcnVubmFibGUgam9icy4KK2NsYXNzIFJ1bm5hYmxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflJ1bm5hYmxlKCkge30KKyAgLy8gUnVucyBmb3JldmVyLgorICB2aXJ0dWFsIHZvaWQgUnVuKCkgPSAwOworICAvLyBEb2VzIG9uZSBxdWljayBwaWVjZSBvZiB3b3JrIGFuZCByZXR1cm4uICBEb2VzIF9ub3RfIGJsb2NrLgorICB2aXJ0dWFsIHZvaWQgSXRlcmF0ZSgpID0gMDsKK307CisKK2NsYXNzIFNlcmlhbGl6YWJsZUNvbnRyb2xMb29wIDogcHVibGljIFJ1bm5hYmxlIHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgdGhlIHNpemUgb2YgYWxsIHRoZSBkYXRhIHRvIGJlIHNlbnQgd2hlbiBzZXJpYWxpemVkLgorICB2aXJ0dWFsIHNpemVfdCBTZXJhbGl6ZWRTaXplKCkgPSAwOworICAvLyBTZXJpYWxpemUgdGhlIGN1cnJlbnQgZGF0YS4KKyAgdmlydHVhbCB2b2lkIFNlcmlhbGl6ZShjaGFyICpidWZmZXIpIGNvbnN0ID0gMDsKKyAgLy8gU2VyaWFsaXplIHplcm9lZCBkYXRhIGluIGNhc2UgdGhlIGRhdGEgaXMgb3V0IG9mIGRhdGUuCisgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemVaZXJvTWVzc2FnZShjaGFyICpidWZmZXIpIGNvbnN0ID0gMDsKKyAgLy8gRGVzZXJpYWxpemUgZGF0YSBpbnRvIHRoZSBjb250cm9sIGxvb3AuCisgIHZpcnR1YWwgdm9pZCBEZXNlcmlhbGl6ZShjb25zdCBjaGFyICpidWZmZXIpID0gMDsKKyAgLy8gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250cm9sIGxvb3AuCisgIC8vIE1vc3QgbGlrZWx5IHRoZSBoYXNoIG9mIHRoZSBxdWV1ZSBncm91cC4KKyAgdmlydHVhbCB1aW50MzJfdCBVbmlxdWVJRCgpID0gMDsKK307CisKKy8vIENvbnRyb2wgbG9vcHMgcnVuIHRoaXMgb2Z0ZW4sICJzdGFydGluZyIgYXQgdGltZSAwLgorY29uc3RleHByIHRpbWU6OlRpbWUga0xvb3BGcmVxdWVuY3kgPSB0aW1lOjpUaW1lOjpJblNlY29uZHMoMC4wMDUpOworCisvLyBQcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBhc3Npc3QgaW4gd3JpdGluZyBjb250cm9sIGxvb3BzLgorLy8gVGhpcyB0ZW1wbGF0ZSBleHBlY3RzIHRvIGJlIGNvbnN0cnVjdGVkIHdpdGggYSBxdWV1ZSBncm91cCBhcyBhbiBhcmd1bWVudAorLy8gdGhhdCBoYXMgYSBnb2FsLCBwb3NpdGlvbiwgc3RhdHVzLCBhbmQgb3V0cHV0IHF1ZXVlLgorLy8gSXQgd2lsbCB0aGVuIGNhbGwgdGhlIFJ1bkl0ZXJhdGlvbiBtZXRob2QgZXZlcnkgY3ljbGUgdGhhdCBpdCBoYXMgZW5vdWdoCisvLyB2YWxpZCBkYXRhIGZvciB0aGUgY29udHJvbCBsb29wIHRvIHJ1bi4KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgQ29udHJvbExvb3AgOiBwdWJsaWMgU2VyaWFsaXphYmxlQ29udHJvbExvb3AgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIHNvbWUgY29udmVuaWVudCB0eXBlZGVmcyB0byByZWZlcmVuY2UgdGhlIEdvYWwsIFBvc2l0aW9uLCBTdGF0dXMsCisgIC8vIGFuZCBPdXRwdXQgc3RydWN0dXJlcy4KKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8CisgICAgICBkZWNsdHlwZSgqKHN0YXRpY19jYXN0PFQgKj4oTlVMTCktPmdvYWwuTWFrZU1lc3NhZ2UoKS5nZXQoKSkpPjo6dHlwZQorICAgICAgICBHb2FsVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8CisgICAgICBkZWNsdHlwZSgqKHN0YXRpY19jYXN0PFQgKj4oTlVMTCktPnBvc2l0aW9uLk1ha2VNZXNzYWdlKCkuZ2V0KCkpKT46OnR5cGUKKyAgICAgICAgUG9zaXRpb25UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTwKKyAgICBkZWNsdHlwZSgqKHN0YXRpY19jYXN0PFQgKj4oTlVMTCktPnN0YXR1cy5NYWtlTWVzc2FnZSgpLmdldCgpKSk+Ojp0eXBlCisgICAgICBTdGF0dXNUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTwKKyAgICBkZWNsdHlwZSgqKHN0YXRpY19jYXN0PFQgKj4oTlVMTCktPm91dHB1dC5NYWtlTWVzc2FnZSgpLmdldCgpKSk+Ojp0eXBlCisgICAgICBPdXRwdXRUeXBlOworCisgIENvbnRyb2xMb29wKFQgKmNvbnRyb2xfbG9vcCkgOiBjb250cm9sX2xvb3BfKGNvbnRyb2xfbG9vcCkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWYgYWxsIHRoZSBjb3VudGVycyBldGMgaW4gdGhlIHNlbnNvciBkYXRhIGhhdmUgYmVlbiByZXNldC4KKyAgLy8gVGhpcyB3aWxsIHJldHVybiB0cnVlIG9ubHkgYSBzaW5nbGUgdGltZSBwZXIgcmVzZXQuCisgIGJvb2wgV2FzUmVzZXQoKSB7CisgICAgaWYgKHJlc2V0XykgeworICAgICAgcmVzZXRfID0gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIENvbnN0cnVjdHMgYW5kIHNlbmRzIGEgbWVzc2FnZSBvbiB0aGUgb3V0cHV0IHF1ZXVlIHdoaWNoIHNldHMgZXZlcnl0aGluZyB0bworICAvLyBhIHNhZmUgc3RhdGUgKGdlbmVyYWxseSBtb3RvcnMgb2ZmKS4gRm9yIHNvbWUgc3ViY2xhc3NlcywgdGhpcyB3aWxsIGJlIGEKKyAgLy8gYml0IGRpZmZlcmVudCAoaWUgcGlzdG9ucykuCisgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlIGNyZWF0ZXMgYSBuZXcgT3V0cHV0IG1lc3NhZ2UsIGNhbGxzIFplcm8oKSBvbiBpdCwKKyAgLy8gYW5kIHRoZW4gc2VuZHMgaXQuCisgIHZpcnR1YWwgdm9pZCBaZXJvT3V0cHV0cygpOworCisgIC8vIFNldHMgdGhlIG91dHB1dCB0byB6ZXJvLgorICAvLyBPdmVyLXJpZGUgaWYgYSB2YWx1ZSBvZiB6ZXJvIGlzIG5vdCAib2ZmIiBmb3IgdGhpcyBzdWJzeXN0ZW0uCisgIHZpcnR1YWwgdm9pZCBaZXJvKE91dHB1dFR5cGUgKm91dHB1dCkgeyBvdXRwdXQtPlplcm8oKTsgfQorCisgIC8vIFJ1bnMgdGhlIGxvb3AgZm9yZXZlci4KKyAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKworICAvLyBSdW5zIG9uZSBjeWNsZSBvZiB0aGUgbG9vcC4KKyAgdm9pZCBJdGVyYXRlKCkgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcXVldWUgZ3JvdXAuCisgIGNvbnN0IGNoYXIgKm5hbWUoKSB7IHJldHVybiBjb250cm9sX2xvb3BfLT5uYW1lKCk7IH0KKworICAvLyBNZXRob2RzIHRvIHNlcmlhbGl6ZSBhbGwgdGhlIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrLgorICBzaXplX3QgU2VyYWxpemVkU2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIGNvbnRyb2xfbG9vcF8tPmdvYWwtPlNpemUoKTsgfQorICB2b2lkIFNlcmlhbGl6ZShjaGFyICpidWZmZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBjb250cm9sX2xvb3BfLT5nb2FsLT5TZXJpYWxpemUoYnVmZmVyKTsKKyAgfQorICB2b2lkIFNlcmlhbGl6ZVplcm9NZXNzYWdlKGNoYXIgKmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIEdvYWxUeXBlIHplcm9fZ29hbDsKKyAgICB6ZXJvX2dvYWwuWmVybygpOworICAgIHplcm9fZ29hbC5TZXJpYWxpemUoYnVmZmVyKTsKKyAgfQorCisgIHZvaWQgRGVzZXJpYWxpemUoY29uc3QgY2hhciAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgU2NvcGVkTWVzc2FnZVB0cjxHb2FsVHlwZT4gbmV3X21zZyA9IGNvbnRyb2xfbG9vcF8tPmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBuZXdfbXNnLT5EZXNlcmlhbGl6ZShidWZmZXIpOworICAgIG5ld19tc2cuU2VuZCgpOworICB9CisKKyAgdWludDMyX3QgVW5pcXVlSUQoKSBvdmVycmlkZSB7IHJldHVybiBjb250cm9sX2xvb3BfLT5oYXNoKCk7IH0KKworIHByb3RlY3RlZDoKKyAgLy8gUnVucyBhbiBpdGVyYXRpb24gb2YgdGhlIGNvbnRyb2wgbG9vcC4KKyAgLy8gZ29hbCBpcyB0aGUgbGFzdCBnb2FsIHRoYXQgd2FzIHNlbnQuICBJdCBtaWdodCBiZSBhbnkgbnVtYmVyIG9mIGN5Y2xlcyBvbGQKKyAgLy8gb3IgbnVsbHB0ciBpZiB3ZSBoYXZlbid0IGV2ZXIgcmVjZWl2ZWQgYSBnb2FsLgorICAvLyBwb3NpdGlvbiBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiwgb3IgbnVsbHB0ciBpZiB3ZSBkaWRuJ3QgZ2V0IGEgcG9zaXRpb24KKyAgLy8gdGhpcyBjeWNsZS4KKyAgLy8gb3V0cHV0IGlzIHRoZSB2YWx1ZXMgdG8gYmUgc2VudCB0byB0aGUgbW90b3JzLiAgVGhpcyBpcyBudWxscHRyIGlmIHRoZQorICAvLyBvdXRwdXQgaXMgZ29pbmcgdG8gYmUgaWdub3JlZCBhbmQgc2V0IHRvIDAuCisgIC8vIHN0YXR1cyBpcyB0aGUgc3RhdHVzIG9mIHRoZSBjb250cm9sIGxvb3AuCisgIC8vIEJvdGggb3V0cHV0IGFuZCBzdGF0dXMgc2hvdWxkIGJlIGZpbGxlZCBpbiBieSB0aGUgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgdm9pZCBSdW5JdGVyYXRpb24oY29uc3QgR29hbFR5cGUgKmdvYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9zaXRpb25UeXBlICpwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRUeXBlICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzVHlwZSAqc3RhdHVzKSA9IDA7CisKKyAgVCAqcXVldWVfZ3JvdXAoKSB7IHJldHVybiBjb250cm9sX2xvb3BfOyB9CisgIGNvbnN0IFQgKnF1ZXVlX2dyb3VwKCkgY29uc3QgeyByZXR1cm4gY29udHJvbF9sb29wXzsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0ZXhwciA6OmFvczo6dGltZTo6VGltZSBrU3RhbGVMb2dJbnRlcnZhbCA9CisgICAgICA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMSk7CisgIC8vIFRoZSBhbW91bnQgb2YgdGltZSBhZnRlciB0aGUgbGFzdCBQV00gcHVsc2Ugd2UgY29uc2lkZXIgbW90b3JzIGVuYWJsZWQgZm9yLgorICAvLyAxMDBtcyBpcyB0aGUgcmVzdWx0IG9mIHVzaW5nIGFuIG9zY2lsbGlzY29wZSB0byBsb29rIGF0IHRoZSBpbnB1dCBhbmQKKyAgLy8gb3V0cHV0IG9mIGEgVGFsb24uIFRoZSBJbmZvIFNoZWV0IGFsc28gbGlzdHMgMTAwbXMgZm9yIFRhbG9uIFNSLCBUYWxvbiBTUlgsCisgIC8vIGFuZCBWaWN0b3IgU1AuCisgIHN0YXRpYyBjb25zdGV4cHIgOjphb3M6OnRpbWU6OlRpbWUga1B3bURpc2FibGVUaW1lID0KKyAgICAgIDo6YW9zOjp0aW1lOjpUaW1lOjpJbk1TKDEwMCk7CisKKyAgLy8gTWF4aW11bSBhZ2Ugb2YgZHJpdmVyIHN0YXRpb24gcGFja2V0cyBiZWZvcmUgdGhlIGxvb3Agd2lsbCBiZSBkaXNhYmxlZC4KKyAgc3RhdGljIGNvbnN0IGludCBrRFNQYWNrZXRUaW1lb3V0TXMgPSA1MDA7CisKKyAgLy8gUG9pbnRlciB0byB0aGUgcXVldWUgZ3JvdXAKKyAgVCAqY29udHJvbF9sb29wXzsKKworICBib29sIHJlc2V0XyA9IGZhbHNlOworICBpbnQzMl90IHNlbnNvcl9yZWFkZXJfcGlkXyA9IDA7CisKKyAgOjphb3M6OnRpbWU6OlRpbWUgbGFzdF9wd21fc2VudF97MCwgMH07CisKKyAgdHlwZWRlZiA6OmFvczo6dXRpbDo6U2ltcGxlTG9nSW50ZXJ2YWwgU2ltcGxlTG9nSW50ZXJ2YWw7CisgIFNpbXBsZUxvZ0ludGVydmFsIG5vX2RyaXZlcl9zdGF0aW9uXyA9CisgICAgICBTaW1wbGVMb2dJbnRlcnZhbChrU3RhbGVMb2dJbnRlcnZhbCwgRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm8gZHJpdmVyIHN0YXRpb24gcGFja2V0Iik7CisgIFNpbXBsZUxvZ0ludGVydmFsIGRyaXZlcl9zdGF0aW9uX29sZF8gPQorICAgICAgU2ltcGxlTG9nSW50ZXJ2YWwoa1N0YWxlTG9nSW50ZXJ2YWwsIEVSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgImRyaXZlciBzdGF0aW9uIHBhY2tldCBpcyB0b28gb2xkIik7CisgIFNpbXBsZUxvZ0ludGVydmFsIG5vX3NlbnNvcl9zdGF0ZV8gPQorICAgICAgU2ltcGxlTG9nSW50ZXJ2YWwoa1N0YWxlTG9nSW50ZXJ2YWwsIEVSUk9SLCAibm8gc2Vuc29yIHN0YXRlIik7CisgIFNpbXBsZUxvZ0ludGVydmFsIG1vdG9yc19vZmZfbG9nXyA9CisgICAgICBTaW1wbGVMb2dJbnRlcnZhbChrU3RhbGVMb2dJbnRlcnZhbCwgV0FSTklORywgIm1vdG9ycyBkaXNhYmxlZCIpOworICBTaW1wbGVMb2dJbnRlcnZhbCBub19nb2FsXyA9CisgICAgICBTaW1wbGVMb2dJbnRlcnZhbChrU3RhbGVMb2dJbnRlcnZhbCwgRVJST1IsICJubyBnb2FsIik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbHMKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wLXRtcGwuaCIgIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcF90ZXN0LmNjIGIvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ2MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BfdGVzdC5jYwpAQCAtMCwwICsxLDU5IEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BfdGVzdC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tZXNzYWdlcy9yb2JvdF9zdGF0ZS5xLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjb25zdGV4cHIgOjphb3M6OnRpbWU6OlRpbWUgQ29udHJvbExvb3BUZXN0OjprVGltZVRpY2s7Citjb25zdGV4cHIgOjphb3M6OnRpbWU6OlRpbWUgQ29udHJvbExvb3BUZXN0OjprRFNQYWNrZXRUaW1lOworCitDb250cm9sTG9vcFRlc3Q6OkNvbnRyb2xMb29wVGVzdCgpIHsKKyAgOjphb3M6OmpveXN0aWNrX3N0YXRlLkNsZWFyKCk7CisgIDo6YW9zOjpyb2JvdF9zdGF0ZS5DbGVhcigpOworCisgIDo6YW9zOjp0aW1lOjpUaW1lOjpFbmFibGVNb2NrVGltZShjdXJyZW50X3RpbWVfKTsKKworICBTZW5kTWVzc2FnZXMoZmFsc2UpOworfQorCitDb250cm9sTG9vcFRlc3Q6On5Db250cm9sTG9vcFRlc3QoKSB7CisgIDo6YW9zOjpqb3lzdGlja19zdGF0ZS5DbGVhcigpOworICA6OmFvczo6cm9ib3Rfc3RhdGUuQ2xlYXIoKTsKKworICA6OmFvczo6dGltZTo6VGltZTo6RGlzYWJsZU1vY2tUaW1lKCk7Cit9CisKK3ZvaWQgQ29udHJvbExvb3BUZXN0OjpTZW5kTWVzc2FnZXMoYm9vbCBlbmFibGVkKSB7CisgIGlmIChjdXJyZW50X3RpbWVfIC0gbGFzdF9kc190aW1lXyA+PSBrRFNQYWNrZXRUaW1lKSB7CisgICAgbGFzdF9kc190aW1lXyA9IGN1cnJlbnRfdGltZV87CisgICAgYXV0byBuZXdfc3RhdGUgPSA6OmFvczo6am95c3RpY2tfc3RhdGUuTWFrZU1lc3NhZ2UoKTsKKyAgICBuZXdfc3RhdGUtPmZha2UgPSB0cnVlOworCisgICAgbmV3X3N0YXRlLT5lbmFibGVkID0gZW5hYmxlZDsKKyAgICBuZXdfc3RhdGUtPmF1dG9ub21vdXMgPSBmYWxzZTsKKyAgICBuZXdfc3RhdGUtPnRlYW1faWQgPSB0ZWFtX2lkXzsKKworICAgIG5ld19zdGF0ZS5TZW5kKCk7CisgIH0KKworICB7CisgICAgYXV0byBuZXdfc3RhdGUgPSA6OmFvczo6cm9ib3Rfc3RhdGUuTWFrZU1lc3NhZ2UoKTsKKworICAgIG5ld19zdGF0ZS0+cmVhZGVyX3BpZCA9IHJlYWRlcl9waWRfOworICAgIG5ld19zdGF0ZS0+b3V0cHV0c19lbmFibGVkID0gZW5hYmxlZDsKKyAgICBuZXdfc3RhdGUtPmJyb3duZWRfb3V0ID0gZmFsc2U7CisKKyAgICBuZXdfc3RhdGUtPmlzXzN2M19hY3RpdmUgPSB0cnVlOworICAgIG5ld19zdGF0ZS0+aXNfNXZfYWN0aXZlID0gdHJ1ZTsKKyAgICBuZXdfc3RhdGUtPnZvbHRhZ2VfM3YzID0gMy4zOworICAgIG5ld19zdGF0ZS0+dm9sdGFnZV81diA9IDUuMDsKKworICAgIG5ld19zdGF0ZS0+dm9sdGFnZV9yb2JvcmlvX2luID0gMTIuNDsKKworICAgIG5ld19zdGF0ZS5TZW5kKCk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wX3Rlc3QuaCBiL2Fvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQxM2EzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BfdGVzdC5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9DT05UUk9MU19DT05UUk9MX0xPT1BfVEVTVF9IXworI2RlZmluZSBBT1NfQ09NTU9OX0NPTlRST0xTX0NPTlRST0xfTE9PUF9URVNUX0hfCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEhhbmRsZXMgc2V0dGluZyB1cCB0aGUgZW52aXJvbm1lbnQgdGhhdCBhbGwgY29udHJvbCBsb29wcyBuZWVkIHRvIGFjdHVhbGx5CisvLyBydW4uCisvLyBUaGlzIGluY2x1ZGVzIHNlbmRpbmcgdGhlIHF1ZXVlIG1lc3NhZ2VzIGFuZCBDbGVhcigpaW5nIHRoZSBxdWV1ZXMgd2hlbgorLy8gYXBwcm9wcmlhdGUuCisvLyBJdCBhbHNvIGluY2x1ZGVzIGRlYWxpbmcgd2l0aCA6OmFvczo6dGltZS4KK2NsYXNzIENvbnRyb2xMb29wVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgQ29udHJvbExvb3BUZXN0KCk7CisgIHZpcnR1YWwgfkNvbnRyb2xMb29wVGVzdCgpOworCisgIHZvaWQgc2V0X3RlYW1faWQodWludDE2X3QgdGVhbV9pZCkgeyB0ZWFtX2lkXyA9IHRlYW1faWQ7IH0KKyAgdWludDE2X3QgdGVhbV9pZCgpIGNvbnN0IHsgcmV0dXJuIHRlYW1faWRfOyB9CisKKyAgLy8gU2VuZHMgb3V0IGFsbCBvZiB0aGUgcmVxdWlyZWQgcXVldWUgbWVzc2FnZXMuCisgIHZvaWQgU2VuZE1lc3NhZ2VzKGJvb2wgZW5hYmxlZCk7CisgIC8vIFRpY2tzIHRpbWUgZm9yIGEgc2luZ2xlIGNvbnRyb2wgbG9vcCBjeWNsZS4KKyAgdm9pZCBUaWNrVGltZSgpIHsKKyAgICA6OmFvczo6dGltZTo6VGltZTo6U2V0TW9ja1RpbWUoY3VycmVudF90aW1lXyArPSBrVGltZVRpY2spOworICB9CisKKyAgLy8gU2ltdWxhdGVzIGV2ZXJ5dGhpbmcgdGhhdCBoYXBwZW5zIGR1cmluZyAxIGxvb3AgdGltZSBzdGVwLgorICB2b2lkIFNpbXVsYXRlVGltZXN0ZXAoYm9vbCBlbmFibGVkKSB7CisgICAgU2VuZE1lc3NhZ2VzKGVuYWJsZWQpOworICAgIFRpY2tUaW1lKCk7CisgIH0KKworICAvLyBTaW11bGF0ZSBhIHJlc2V0IG9mIHRoZSBwcm9jZXNzIHJlYWRpbmcgc2Vuc29ycywgd2hpY2ggdGVsbHMgbG9vcHMgdGhhdCBhbGwKKyAgLy8gaW5kZXggY291bnRzIGV0YyB3aWxsIGJlIHJlc2V0LgorICB2b2lkIFNpbXVsYXRlU2Vuc29yUmVzZXQoKSB7CisgICAgKytyZWFkZXJfcGlkXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0ZXhwciA6OmFvczo6dGltZTo6VGltZSBrVGltZVRpY2sgPSA6OmFvczo6dGltZTo6VGltZTo6SW5VUyg1MDAwKTsKKyAgc3RhdGljIGNvbnN0ZXhwciA6OmFvczo6dGltZTo6VGltZSBrRFNQYWNrZXRUaW1lID0KKyAgICAgIDo6YW9zOjp0aW1lOjpUaW1lOjpJbk1TKDIwKTsKKworICB1aW50MTZfdCB0ZWFtX2lkXyA9IDk3MTsKKyAgaW50MzJfdCByZWFkZXJfcGlkXyA9IDE7CisKKyAgOjphb3M6OnRpbWU6OlRpbWUgbGFzdF9kc190aW1lXyA9IDo6YW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMoMCk7CisgIDo6YW9zOjp0aW1lOjpUaW1lIGN1cnJlbnRfdGltZV8gPSA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDApOworCisgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6Okdsb2JhbENvcmVJbnN0YW5jZSBteV9jb3JlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX0NPTlRST0xTX0NPTlRST0xfTE9PUF9URVNUX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcHMucSBiL2Fvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wcy5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMGJmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcHMucQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGFvcy5jb250cm9sX2xvb3BzOworCitpbnRlcmZhY2UgQ29udHJvbExvb3AgeworICBxdWV1ZSBnb2FsOworICBxdWV1ZSBwb3NpdGlvbjsKKyAgcXVldWUgb3V0cHV0OworICBxdWV1ZSBzdGF0dXM7Cit9OworCittZXNzYWdlIEdvYWwgeworICBkb3VibGUgZ29hbDsKK307CisKK21lc3NhZ2UgUG9zaXRpb24geworICBkb3VibGUgcG9zaXRpb247Cit9OworCittZXNzYWdlIE91dHB1dCB7CisgIGRvdWJsZSB2b2x0YWdlOworfTsKKworbWVzc2FnZSBTdGF0dXMgeworICBib29sIGRvbmU7Cit9OworCisvLyBTaW5nbGUgSW5wdXQgU2luZ2xlIE91dHB1dCBjb250cm9sIGxvb3AuCitxdWV1ZV9ncm91cCBTSVNPIHsKKyAgaW1wbGVtZW50cyBDb250cm9sTG9vcDsKKworICBxdWV1ZSBHb2FsIGdvYWw7CisgIHF1ZXVlIFBvc2l0aW9uIHBvc2l0aW9uOworICBxdWV1ZSBPdXRwdXQgb3V0cHV0OworICBxdWV1ZSBTdGF0dXMgc3RhdHVzOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwIGIvYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwYmM3OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwCkBAIC0wLDAgKzEsOTQgQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3JlcGxheV9jb250cm9sX2xvb3AnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICMncmVwbGF5X2NvbnRyb2xfbG9vcC5oJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlcycsCisgICAgICAgICdjb250cm9sX2xvb3AnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbG9nZ2luZy9sb2dnaW5nLmd5cDpsb2dfcmVwbGF5JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cDpxdWV1ZV9sb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZXMnLAorICAgICAgICAnY29udHJvbF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xvZ2dpbmcvbG9nZ2luZy5neXA6bG9nX3JlcGxheScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvbnRyb2xfbG9vcF90ZXN0JywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY29udHJvbF9sb29wX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL21lc3NhZ2VzL21lc3NhZ2VzLmd5cDpyb2JvdF9zdGF0ZScsCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlX3Rlc3R1dGlscycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlX3Rlc3R1dGlscycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3BvbHl0b3BlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAjJ3BvbHl0b3BlLmgnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6ZWlnZW4nLAorICAgICAgICAnPChFWFRFUk5BTFMpOmxpYmNkZCcsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6ZWlnZW4nLAorICAgICAgICAnPChFWFRFUk5BTFMpOmxpYmNkZCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcHMucScgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICdhb3MvY29tbW9uL2NvbnRyb2xzJywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvbnRyb2xfbG9vcCcsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2NvbnRyb2xfbG9vcC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbWVzc2FnZXMvbWVzc2FnZXMuZ3lwOnJvYm90X3N0YXRlJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnBoYXNlZF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJ2NvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOmxvZ19pbnRlcnZhbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVzJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbWVzc2FnZXMvbWVzc2FnZXMuZ3lwOnJvYm90X3N0YXRlJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnBoYXNlZF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJ2NvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOmxvZ19pbnRlcnZhbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVzJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCBiL2Fvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzczNDZlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9jb250cm9scy9wb2x5dG9wZS5oCkBAIC0wLDAgKzEsMTMwIEBACisjaWZuZGVmIEFPU19DT01NT05fQ09OVFJPTFNfUE9MWVRPUEVfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9DT05UUk9MU19QT0xZVE9QRV9IXworCisjaW5jbHVkZSAiRWlnZW4vRGVuc2UiCisjaW5jbHVkZSAibGliY2RkLTA5NGctcHJlZml4L2luY2x1ZGUvc2V0b3Blci5oIgorI2luY2x1ZGUgImxpYmNkZC0wOTRnLXByZWZpeC9pbmNsdWRlL2NkZC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBjb250cm9scyB7CisKKy8vIEEgbiBkaW1lbnNpb24gcG9seXRvcGUuCit0ZW1wbGF0ZSA8aW50IG51bWJlcl9vZl9kaW1lbnNpb25zPgorY2xhc3MgSFBvbHl0b3BlIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYSBwb2x5dG9wZSBnaXZlbiB0aGUgSCBhbmQgayBtYXRyaWNpZXMuCisgIEhQb2x5dG9wZShFaWdlbjo6TWF0cml4PGRvdWJsZSwgRWlnZW46OkR5bmFtaWMsIG51bWJlcl9vZl9kaW1lbnNpb25zPiBILAorICAgICAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIEVpZ2VuOjpEeW5hbWljLCAxPiBrKQorICAgICAgOiBIXyhIKSwKKyAgICAgICAga18oaykgeworICB9CisKKyAgLy8gVGhpcyBpcyBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBzaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW50aWF0aW9ucyBvZiB0aGlzCisgIC8vIHRlbXBsYXRlLgorICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UgYmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZSBtZXRob2RzLiBJdCBpcworICAvLyBub3QgdGhyZWFkLXNhZmUuCisgIHN0YXRpYyB2b2lkIEluaXQoKSB7CisgICAgZGRfc2V0X2dsb2JhbF9jb25zdGFudHMoKTsKKyAgfQorCisgIC8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gSC4KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIEVpZ2VuOjpEeW5hbWljLAorICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9kaW1lbnNpb25zPiAmSCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSF87CisgIH0KKworICAvLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGsuCisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBFaWdlbjo6RHluYW1pYywKKyAgICAgICAgICAgICAgICAgICAgICAxPiAmaygpIGNvbnN0IHsKKyAgICByZXR1cm4ga187CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBpbiB0aGUgcG9seXRvcGUuCisgIGludCBuZGltKCkgY29uc3QgeyByZXR1cm4gbnVtYmVyX29mX2RpbWVuc2lvbnM7IH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29uc3RyYWludHMgY3VycmVudGx5IGluIHRoZSBwb2x5dG9wZS4KKyAgaW50IG51bV9jb25zdHJhaW50cygpIGNvbnN0IHsgcmV0dXJuIGtfLnJvd3MoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9pbnQgaXMgaW5zaWRlIHRoZSBwb2x5dG9wZS4KKyAgYm9vbCBJc0luc2lkZShFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2RpbWVuc2lvbnMsIDE+IHBvaW50KSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHZlcnRpY2VzIGluc2lkZSB0aGUgcG9seXRvcGUuCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfZGltZW5zaW9ucywgRWlnZW46OkR5bmFtaWM+IFZlcnRpY2VzKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgRWlnZW46OkR5bmFtaWMsIG51bWJlcl9vZl9kaW1lbnNpb25zPiBIXzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIEVpZ2VuOjpEeW5hbWljLCAxPiBrXzsKK307CisKK3RlbXBsYXRlIDxpbnQgbnVtYmVyX29mX2RpbWVuc2lvbnM+Citib29sIEhQb2x5dG9wZTxudW1iZXJfb2ZfZGltZW5zaW9ucz46OklzSW5zaWRlKAorICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfZGltZW5zaW9ucywgMT4gcG9pbnQpIGNvbnN0IHsKKyAgYXV0byBldiA9IEhfICogcG9pbnQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NvbnN0cmFpbnRzKCk7ICsraSkgeworICAgIGlmIChldihpLCAwKSA+IGtfKGksIDApKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8aW50IG51bWJlcl9vZl9kaW1lbnNpb25zPgorRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9kaW1lbnNpb25zLCBFaWdlbjo6RHluYW1pYz4KKyAgICBIUG9seXRvcGU8bnVtYmVyX29mX2RpbWVuc2lvbnM+OjpWZXJ0aWNlcygpIGNvbnN0IHsKKyAgZGRfTWF0cml4UHRyIG1hdHJpeCA9IGRkX0NyZWF0ZU1hdHJpeChudW1fY29uc3RyYWludHMoKSwgbmRpbSgpICsgMSk7CisKKyAgLy8gQ29weSB0aGUgZGF0YSBvdmVyLiBUT0RPKGFzY2h1aCk6IElzIHRoZXJlIGEgYmV0dGVyIHdheT8gIEkgaGF0ZSBjb3B5aW5nLi4uCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NvbnN0cmFpbnRzKCk7ICsraSkgeworICAgIGRkX3NldF9kKG1hdHJpeC0+bWF0cml4W2ldWzBdLCBrXyhpLCAwKSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuZGltKCk7ICsraikgeworICAgICAgZGRfc2V0X2QobWF0cml4LT5tYXRyaXhbaV1baiArIDFdLCAtSF8oaSwgaikpOworICAgIH0KKyAgfQorCisgIG1hdHJpeC0+cmVwcmVzZW50YXRpb24gPSBkZF9JbmVxdWFsaXR5OworICBtYXRyaXgtPm51bWJ0eXBlID0gZGRfUmVhbDsKKworICBkZF9FcnJvclR5cGUgZXJyb3I7CisgIGRkX1BvbHloZWRyYVB0ciBwb2x5aGVkcmEgPSBkZF9ERE1hdHJpeDJQb2x5KG1hdHJpeCwgJmVycm9yKTsKKyAgaWYgKGVycm9yICE9IGRkX05vRXJyb3IgfHwgcG9seWhlZHJhID09IE5VTEwpIHsKKyAgICBkZF9Xcml0ZUVycm9yTWVzc2FnZXMoc3RkZXJyLCBlcnJvcik7CisgICAgZGRfRnJlZU1hdHJpeChtYXRyaXgpOworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfZGltZW5zaW9ucywgRWlnZW46OkR5bmFtaWM+IGFucygwLCAwKTsKKyAgICByZXR1cm4gYW5zOworICB9CisKKyAgZGRfTWF0cml4UHRyIHZlcnRleF9tYXRyaXggPSBkZF9Db3B5R2VuZXJhdG9ycyhwb2x5aGVkcmEpOworCisgIGludCBudW1fdmVydGljZXMgPSAwOworICBpbnQgbnVtX3JheXMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnRleF9tYXRyaXgtPnJvd3NpemU7ICsraSkgeworICAgIGlmIChkZF9nZXRfZCh2ZXJ0ZXhfbWF0cml4LT5tYXRyaXhbaV1bMF0pID09IDApIHsKKyAgICAgIG51bV9yYXlzICs9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIG51bV92ZXJ0aWNlcyArPSAxOworICAgIH0KKyAgfQorCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfZGltZW5zaW9ucywgRWlnZW46OkR5bmFtaWM+IHZlcnRpY2VzKAorICAgICAgbnVtYmVyX29mX2RpbWVuc2lvbnMsIG51bV92ZXJ0aWNlcyk7CisKKyAgaW50IHZlcnRleF9pbmRleCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVydGV4X21hdHJpeC0+cm93c2l6ZTsgKytpKSB7CisgICAgaWYgKGRkX2dldF9kKHZlcnRleF9tYXRyaXgtPm1hdHJpeFtpXVswXSkgIT0gMCkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1iZXJfb2ZfZGltZW5zaW9uczsgKytqKSB7CisgICAgICAgIHZlcnRpY2VzKGosIHZlcnRleF9pbmRleCkgPSBkZF9nZXRfZCh2ZXJ0ZXhfbWF0cml4LT5tYXRyaXhbaV1baiArIDFdKTsKKyAgICAgIH0KKyAgICAgICsrdmVydGV4X2luZGV4OworICAgIH0KKyAgfQorICBkZF9GcmVlTWF0cml4KHZlcnRleF9tYXRyaXgpOworICBkZF9GcmVlUG9seWhlZHJhKHBvbHloZWRyYSk7CisgIGRkX0ZyZWVNYXRyaXgobWF0cml4KTsKKworICByZXR1cm4gdmVydGljZXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9scworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fQ09OVFJPTFNfUE9MWVRPUEVfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vY29udHJvbHMvcmVwbGF5X2NvbnRyb2xfbG9vcC5oIGIvYW9zL2NvbW1vbi9jb250cm9scy9yZXBsYXlfY29udHJvbF9sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ODI2NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vY29udHJvbHMvcmVwbGF5X2NvbnRyb2xfbG9vcC5oCkBAIC0wLDAgKzEsMTg1IEBACisjaWZuZGVmIEFPU19DT01NT05fQ09OVFJPTFNfUkVQTEFZX0NPTlRST0xfTE9PUF9IXworI2RlZmluZSBBT1NfQ09NTU9OX0NPTlRST0xTX1JFUExBWV9DT05UUk9MX0xPT1BfSF8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ19yZXBsYXkuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbnRyb2xzIHsKKworLy8gSGFuZGxlcyByZWFkaW5nIGxvZ2dlZCBtZXNzYWdlcyBhbmQgcnVubmluZyB0aGVtIHRocm91Z2ggYSBjb250cm9sIGxvb3AKKy8vIGFnYWluLgorLy8gVCBzaG91bGQgYmUgYSBxdWV1ZSBncm91cCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggQ29udHJvbExvb3AuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIENvbnRyb2xMb29wUmVwbGF5ZXIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb250cm9sTG9vcDxUPjo6R29hbFR5cGUgR29hbFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQ29udHJvbExvb3A8VD46OlBvc2l0aW9uVHlwZSBQb3NpdGlvblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQ29udHJvbExvb3A8VD46OlN0YXR1c1R5cGUgU3RhdHVzVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb250cm9sTG9vcDxUPjo6T3V0cHV0VHlwZSBPdXRwdXRUeXBlOworCisgIC8vIGxvb3BfZ3JvdXAgaXMgd2hlcmUgdG8gc2VuZCB0aGUgbWVzc2FnZXMgb3V0LgorICAvLyBwcm9jZXNzX25hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByb2Nlc3Mgd2hpY2ggd3JvdGUgdGhlIGxvZyBtZXNzYWdlcyBpbiB0aGUKKyAgLy8gZmlsZShzKS4KKyAgQ29udHJvbExvb3BSZXBsYXllcihUICpsb29wX2dyb3VwLCBjb25zdCA6OnN0ZDo6c3RyaW5nICZwcm9jZXNzX25hbWUpCisgICAgICA6IGxvb3BfZ3JvdXBfKGxvb3BfZ3JvdXApIHsKKyAgICAvLyBDbGVhciBvdXQgYW55IG9sZCBtZXNzYWdlcyB3aGljaCB3aWxsIGNvbmZ1c2UgdGhlIGNvZGUuCisgICAgbG9vcF9ncm91cF8tPnN0YXR1cy5GZXRjaExhdGVzdCgpOworICAgIGxvb3BfZ3JvdXBfLT5vdXRwdXQuRmV0Y2hMYXRlc3QoKTsKKworICAgIHJlcGxheWVyXy5BZGREaXJlY3RRdWV1ZVNlbmRlcigid3BpbGliX2ludGVyZmFjZS5EU1JlYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqb3lzdGlja19zdGF0ZSIsIDo6YW9zOjpqb3lzdGlja19zdGF0ZSk7CisgICAgcmVwbGF5ZXJfLkFkZERpcmVjdFF1ZXVlU2VuZGVyKCJ3cGlsaWJfaW50ZXJmYWNlLlNlbnNvclJlYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb2JvdF9zdGF0ZSIsIDo6YW9zOjpyb2JvdF9zdGF0ZSk7CisKKyAgICByZXBsYXllcl8uQWRkSGFuZGxlcigKKyAgICAgICAgcHJvY2Vzc19uYW1lLCAicG9zaXRpb24iLAorICAgICAgICA6OnN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBQb3NpdGlvblR5cGUgJik+KDo6c3RkOjpyZWYocG9zaXRpb25fKSkpOworICAgIHJlcGxheWVyXy5BZGRIYW5kbGVyKAorICAgICAgICBwcm9jZXNzX25hbWUsICJvdXRwdXQiLAorICAgICAgICA6OnN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBPdXRwdXRUeXBlICYpPig6OnN0ZDo6cmVmKG91dHB1dF8pKSk7CisgICAgcmVwbGF5ZXJfLkFkZEhhbmRsZXIoCisgICAgICAgIHByb2Nlc3NfbmFtZSwgInN0YXR1cyIsCisgICAgICAgIDo6c3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFN0YXR1c1R5cGUgJik+KDo6c3RkOjpyZWYoc3RhdHVzXykpKTsKKyAgICAvLyBUaGUgdGltaW5nIG9mIGdvYWwgbWVzc2FnZXMgZG9lc24ndCBtYXR0ZXIsIGFuZCB3ZSBkb24ndCBuZWVkIHRvIGxvb2sKKyAgICAvLyBiYWNrIGF0IHRoZW0gYWZ0ZXIgcnVubmluZyB0aGUgbG9vcC4KKyAgICByZXBsYXllcl8uQWRkRGlyZWN0UXVldWVTZW5kZXIocHJvY2Vzc19uYW1lLCAiZ29hbCIsIGxvb3BfZ3JvdXBfLT5nb2FsKTsKKyAgfQorCisgIC8vIFJlcGxheXMgbWVzc2FnZXMgZnJvbSBhIGZpbGUuCisgIC8vIGZpbGVuYW1lIGNhbiBiZSBzdHJhaWdodCBmcm9tIHRoZSBjb21tYW5kIGxpbmU7IGFsbCBzYW5pdHkgY2hlY2tpbmcgZXRjIGlzCisgIC8vIGhhbmRsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgdm9pZCBQcm9jZXNzRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyBwcml2YXRlOgorICAvLyBBIG1lc3NhZ2UgaGFuZGxlciB3aGljaCBzYXZlcyBvZmYgbWVzc2FnZXMgYW5kIHJlY29yZHMgd2hldGhlciBpdCBjdXJyZW50bHkKKyAgLy8gaGFzIGEgbmV3IG9uZSBvciBub3QuCisgIHRlbXBsYXRlIDxjbGFzcyBTPgorICBjbGFzcyBDYXB0dXJlTWVzc2FnZSB7CisgICBwdWJsaWM6CisgICAgQ2FwdHVyZU1lc3NhZ2UoKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFMgJm1lc3NhZ2UpIHsKKyAgICAgIENIRUNLKCFoYXZlX25ld19tZXNzYWdlXyk7CisgICAgICBzYXZlZF9tZXNzYWdlXyA9IG1lc3NhZ2U7CisgICAgICBoYXZlX25ld19tZXNzYWdlXyA9IHRydWU7CisgICAgfQorCisgICAgY29uc3QgUyAmc2F2ZWRfbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIHNhdmVkX21lc3NhZ2VfOyB9CisgICAgYm9vbCBoYXZlX25ld19tZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gaGF2ZV9uZXdfbWVzc2FnZV87IH0KKyAgICB2b2lkIGNsZWFyX25ld19tZXNzYWdlKCkgeyBoYXZlX25ld19tZXNzYWdlXyA9IGZhbHNlOyB9CisKKyAgIHByaXZhdGU6CisgICAgUyBzYXZlZF9tZXNzYWdlXzsKKyAgICBib29sIGhhdmVfbmV3X21lc3NhZ2VfID0gZmFsc2U7CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ2FwdHVyZU1lc3NhZ2UpOworICB9OworCisgIC8vIFJ1bnMgdGhyb3VnaCB0aGUgZmlsZSBjdXJyZW50bHkgbG9hZGVkIGluIHJlcGxheWVyXy4KKyAgLy8gUmV0dXJucyBhZnRlciBnb2luZyB0aHJvdWdoIHRoZSBlbnRpcmUgZmlsZS4KKyAgdm9pZCBEb1Byb2Nlc3NGaWxlKCk7CisKKyAgVCAqY29uc3QgbG9vcF9ncm91cF87CisKKyAgQ2FwdHVyZU1lc3NhZ2U8UG9zaXRpb25UeXBlPiBwb3NpdGlvbl87CisgIENhcHR1cmVNZXNzYWdlPE91dHB1dFR5cGU+IG91dHB1dF87CisgIENhcHR1cmVNZXNzYWdlPFN0YXR1c1R5cGU+IHN0YXR1c187CisKKyAgLy8gVGhlIG91dHB1dCB0aGF0IHRoZSBsb29wIHNlbmRzIGZvciBaZXJvT3V0cHV0cygpLiBJdCBtaWdodCBub3QgYWN0dWFsbHkgYmUKKyAgLy8gYWxsIGZpZWxkcyB6ZXJvZWQsIHNvIHdlIHBpY2sgdGhlIGZpcnN0IG9uZSBhbmQgcmVtZW1iZXIgaXQgdG8gY29tcGFyZS4KKyAgQ2FwdHVyZU1lc3NhZ2U8T3V0cHV0VHlwZT4gemVyb19vdXRwdXRfOworCisgIDo6YW9zOjpsb2dnaW5nOjpsaW51eF9jb2RlOjpMb2dSZXBsYXllciByZXBsYXllcl87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgQ29udHJvbExvb3BSZXBsYXllcjxUPjo6UHJvY2Vzc0ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgaW50IGZkOworICBpZiAoc3RyY21wKGZpbGVuYW1lLCAiLSIpID09IDApIHsKKyAgICBmZCA9IFNURElOX0ZJTEVOTzsKKyAgfSBlbHNlIHsKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgfQorICBpZiAoZmQgPT0gLTEpIHsKKyAgICBQTE9HKEZBVEFMLCAiY291bGRuJ3Qgb3BlbiBmaWxlICclcycgZm9yIHJlYWRpbmciLCBmaWxlbmFtZSk7CisgIH0KKworICByZXBsYXllcl8uT3BlbkZpbGUoZmQpOworICBEb1Byb2Nlc3NGaWxlKCk7CisgIHJlcGxheWVyXy5DbG9zZUN1cnJlbnRGaWxlKCk7CisKKyAgUENIRUNLKGNsb3NlKGZkKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBDb250cm9sTG9vcFJlcGxheWVyPFQ+OjpEb1Byb2Nlc3NGaWxlKCkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIERpZyB0aHJvdWdoIG1lc3NhZ2VzIHVudGlsIHdlIGdldCBhIHN0YXR1cywgd2hpY2ggaW5kaWNhdGVzIHRoZSBlbmQgb2YKKyAgICAvLyB0aGUgY29udHJvbCBsb29wIGN5Y2xlLgorICAgIHdoaWxlICghc3RhdHVzXy5oYXZlX25ld19tZXNzYWdlKCkpIHsKKyAgICAgIGlmIChyZXBsYXllcl8uUHJvY2Vzc01lc3NhZ2UoKSkgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNlbmQgb3V0IHRoZSBwb3NpdGlvbiBtZXNzYWdlIChhZnRlciBhZGp1c3RpbmcgdGhlIHRpbWUgb2Zmc2V0KSBzbyB0aGUKKyAgICAvLyBsb29wIHdpbGwgcnVuIHJpZ2h0IG5vdy4KKyAgICBpZiAoIXBvc2l0aW9uXy5oYXZlX25ld19tZXNzYWdlKCkpIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiZG9uJ3QgaGF2ZSBhIG5ldyBwb3NpdGlvbiB0aGlzIGN5Y2xlIC0+IHNraXBwaW5nXG4iKTsKKyAgICAgIHN0YXR1c18uY2xlYXJfbmV3X21lc3NhZ2UoKTsKKyAgICAgIHBvc2l0aW9uXy5jbGVhcl9uZXdfbWVzc2FnZSgpOworICAgICAgb3V0cHV0Xy5jbGVhcl9uZXdfbWVzc2FnZSgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIDo6YW9zOjp0aW1lOjpPZmZzZXRUb05vdyhwb3NpdGlvbl8uc2F2ZWRfbWVzc2FnZSgpLnNlbnRfdGltZSk7CisgICAgeworICAgICAgYXV0byBwb3NpdGlvbl9tZXNzYWdlID0gbG9vcF9ncm91cF8tPnBvc2l0aW9uLk1ha2VNZXNzYWdlKCk7CisgICAgICAqcG9zaXRpb25fbWVzc2FnZSA9IHBvc2l0aW9uXy5zYXZlZF9tZXNzYWdlKCk7CisgICAgICBDSEVDSyhwb3NpdGlvbl9tZXNzYWdlLlNlbmQoKSk7CisgICAgfQorICAgIHBvc2l0aW9uXy5jbGVhcl9uZXdfbWVzc2FnZSgpOworCisgICAgLy8gV2FpdCBmb3IgdGhlIGxvb3AgdG8gZmluaXNoIHJ1bm5pbmcuCisgICAgbG9vcF9ncm91cF8tPnN0YXR1cy5GZXRjaE5leHRCbG9ja2luZygpOworCisgICAgLy8gUG9pbnQgb3V0IGlmIHRoZSBzdGF0dXMgaXMgZGlmZmVyZW50LgorICAgIGlmICghbG9vcF9ncm91cF8tPnN0YXR1cy0+RXF1YWxzTm9UaW1lKHN0YXR1c18uc2F2ZWRfbWVzc2FnZSgpKSkgeworICAgICAgTE9HX1NUUlVDVChXQVJOSU5HLCAiZXhwZWN0ZWQgc3RhdHVzIiwgc3RhdHVzXy5zYXZlZF9tZXNzYWdlKCkpOworICAgICAgTE9HX1NUUlVDVChXQVJOSU5HLCAiZ290IHN0YXR1cyIsICpsb29wX2dyb3VwXy0+c3RhdHVzKTsKKyAgICB9CisgICAgc3RhdHVzXy5jbGVhcl9uZXdfbWVzc2FnZSgpOworCisgICAgLy8gUG9pbnQgb3V0IGlmIHRoZSBvdXRwdXQgaXMgZGlmZmVyZW50LiBUaGlzIGlzIGEgbG90IG1vcmUgY29tcGxpY2F0ZWQgdGhhbgorICAgIC8vIGZvciB0aGUgc3RhdHVzIGJlY2F1c2UgdGhlcmUgaXNuJ3QgYWx3YXlzIGFuIG91dHB1dCBsb2dnZWQuCisgICAgYm9vbCBsb29wX25ld19vdXRwdXQgPSBsb29wX2dyb3VwXy0+b3V0cHV0LkZldGNoTGF0ZXN0KCk7CisgICAgaWYgKG91dHB1dF8uaGF2ZV9uZXdfbWVzc2FnZSgpKSB7CisgICAgICBpZiAoIWxvb3BfbmV3X291dHB1dCkgeworICAgICAgICBMT0dfU1RSVUNUKFdBUk5JTkcsICJubyBvdXRwdXQsIGV4cGVjdGVkIiwgb3V0cHV0Xy5zYXZlZF9tZXNzYWdlKCkpOworICAgICAgfSBlbHNlIGlmICghbG9vcF9ncm91cF8tPm91dHB1dC0+RXF1YWxzTm9UaW1lKG91dHB1dF8uc2F2ZWRfbWVzc2FnZSgpKSkgeworICAgICAgICBMT0dfU1RSVUNUKFdBUk5JTkcsICJleHBlY3RlZCBvdXRwdXQiLCBvdXRwdXRfLnNhdmVkX21lc3NhZ2UoKSk7CisgICAgICAgIExPR19TVFJVQ1QoV0FSTklORywgImdvdCBvdXRwdXQiLCAqbG9vcF9ncm91cF8tPm91dHB1dCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsb29wX25ld19vdXRwdXQpIHsKKyAgICAgIGlmICh6ZXJvX291dHB1dF8uaGF2ZV9uZXdfbWVzc2FnZSgpKSB7CisgICAgICAgIGlmICghbG9vcF9ncm91cF8tPm91dHB1dC0+RXF1YWxzTm9UaW1lKHplcm9fb3V0cHV0Xy5zYXZlZF9tZXNzYWdlKCkpKSB7CisgICAgICAgICAgTE9HX1NUUlVDVChXQVJOSU5HLCAiZXhwZWN0ZWQgbnVsbCBvdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgemVyb19vdXRwdXRfLnNhdmVkX21lc3NhZ2UoKSk7CisgICAgICAgICAgTE9HX1NUUlVDVChXQVJOSU5HLCAiZ290IG91dHB1dCIsICpsb29wX2dyb3VwXy0+b3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgemVyb19vdXRwdXRfKCpsb29wX2dyb3VwXy0+b3V0cHV0KTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0cHV0Xy5jbGVhcl9uZXdfbWVzc2FnZSgpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9scworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fQ09OVFJPTFNfUkVQTEFZX0NPTlRST0xfTE9PUF9IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9kZWJ1Z2dpbmctdGlwcy50eHQgYi9hb3MvY29tbW9uL2RlYnVnZ2luZy10aXBzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWE1MGYzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9kZWJ1Z2dpbmctdGlwcy50eHQKQEAgLTAsMCArMSw0NSBAQAorW0dlbmVyYWxdCitDaGVjayB0aGUgbG9ncyEgVmVyeSBmZXcgdGhpbmdzIHdpbGwgZmFpbCB3aXRob3V0IHB1dHRpbmcgc29tZXRoaW5nIGluIHRoZSBsb2dzLgorICBJZiB0aGV5IGRvLCB0aGF0IGlzIGEgYnVnIHVubGVzcyBvdXIgY29kZSBpcyBuZXZlciBnZXR0aW5nIHJ1biAodGhlcmUgYXJlCisgICAgaW5udW1lcmFibGUgd2F5cyB0aGF0IGNvdWxkIGhhcHBlbiwgYnV0IGl0IGdlbmVyYWxseSBkb2Vzbid0KS4KKyAgVG8gY2hlY2sgdGhlIGxvZ3MsIHJ1biBgbG9nX2Rpc3BsYXllcmAgaWYgYGJpbmFyeV9sb2dfd3JpdGVyYCBoYXMgYmVlbiBzdGFydGVkCisgICAgb3IganVzdCBydW4gYGxvZ19zdHJlYW1lcmAgaWYgeW91IHdhbnQgdG8gZG8gc2ltcGxlIHRlc3Rpbmcgd2l0aG91dCB3cml0aW5nCisJbG9ncyB0byBhIGZpbGUuIFNlZSBgbG9nX2Rpc3BsYXllciAtLWhlbHBgIGZvciBvcHRpb25zLgorQWxsIG9mIHRoZSBiaW5hcmllcyBnZXQgcHV0IGluIHRoZSBzYW1lIHBsYWNlLiBUaGF0IGlzCisgIHNyYy9vdXRwdXRzL3ByaW1lL291dHB1dHMgb24gdGhlIGJ1aWxkIG1hY2hpbmUgYW5kCisgIC9ob21lL2RyaXZlci9yb2JvdF9jb2RlL2JpbiBvbiBsaW51eC4KKworW1N0YXJ0dXBdCitMb3cgbGV2ZWwgc3RhcnR1cCBlcnJvcnMgb2Z0ZW4gZW5kIHVwIGluCisgIC90bXAvYW9zX2ZhdGFsX2Vycm9yLiogdW5kZXIgbGludXguIEFsc28gaGVscGZ1bCBhcmUgdGhlIC90bXAvc3RhcnRlcipfc3RkKgorICBmaWxlcyAoaWYgdGhlIHN0YW5kYXJkIHN0YXJ0IHNjcmlwdHMgYXJlIGJlaW5nIHVzZWQpLgorICAgIElmIGxvdHMgb2YgdGhlIC90bXAvc3RhcnRlcl8qc3RkKiBmaWxlcyAod2l0aCBkaWZmZXJlbnQgbnVtYmVycykgYXJlIGJlaW5nCisgICAgY3JlYXRlZCwgdGhhdCBtZWFucyB0aGF0IHN0YXJ0ZXJfZXhlIGlzIGR5aW5nIGNvbnN0YW50bHkuCisKK1tBbnl0aGluZyBOb3QgUnVubmluZ10KK0NoZWNrIHN0YXJ0ZXJfZXhlJ3MgbG9nIG1lc3NhZ2VzLiBUaGV5IG1pZ2h0IG1lbnRpb24gdGhhdCBpdCBpcyBjb25zdGFudGx5IGR5aW5nCisgIG9uIHN0YXJ0dXAgYW5kIGJlaW5nIHJlc3RhcnRlZC4KKworW0NvbnRyb2wgTG9vcChzKSBOb3QgV29ya2luZ10KK0FyZSByb2JvdF9zdGF0ZSBtZXNzYWdlcyBnb2luZyBvdXQ/IEFuIGFvczo6Sm95c3RpY2tJbnB1dCAob2Z0ZW4KKyAgam95c3RpY2tfcmVhZGVyKSBzaG91bGQgYmUgc2VuZGluZyB0aGVtLgorICBBbHNvLCBrRmFrZUpveXN0aWNrcyBpbiBhb3MvcHJpbWUvaW5wdXQvam95c3RpY2tfcmVhZGVyLmNjIGhhcyB0byBiZSBzZXQgdG8KKyAgICBmYWxzZSBpbiBvcmRlciBmb3IgYW55dGhpbmcgdG8gZ2V0IG91dHB1dC4KK0lzIGl0IGJlaW5nIGZlZCBnb2FsIG1lc3NhZ2VzPworSXMgaXQgZ2V0dGluZyBwb3NpdGlvbiBtZXNzYWdlcz8KK0lzIHNvbWV0aGluZyBsb29raW5nIGF0IHRoZSBvdXRwdXQgYW5kIGRvaW5nIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBpdD8KKworW05vIERyaXZlciBTdGF0aW9uIFBhY2tldHNdCitUT0RPKGJyaWFucyk6IFRoaXMgaXMgb3V0IG9mIGRhdGUuCitDaGVjayB0byBtYWtlIHN1cmUgdGhhdCBKU1IgKGEgY1JJTy1zaWRlIHRhc2spIGlzIHNheWluZyB0aGF0IGl0J3Mgc2VuZGluZworICBtZXNzYWdlcy4gQWxzbyBjaGVjayBKb3lzdGlja1JlYWRlciAob3Igd2hhdGV2ZXIgaW5oZXJpdHMgZnJvbQorICBhb3M6OkpveXN0aWNrSW5wdXQpIGlzIHJ1bm5pbmcgYW5kIHNlZSBpZiBpdCdzIHJlY2VpdmluZyBhbnl0aGluZy4KKworW0F0dGFjaGluZyBhIERlYnVnZ2VyXQorQXR0YWNoaW5nIEdEQiB0byBhbiBleGlzdGluZyByb2JvdCBjb2RlIHByb2Nlc3Mgd29ya3MgbGlrZSBub3JtYWwgKHlvdSBoYXZlIHRvCisgIHN1IHJvb3QgZmlyc3QgYmVjYXVzZSB0aGF0J3Mgd2hhdCBhbGwgb2YgdGhlIGNvZGUgY3VycmVudGx5IHJ1bnMgYXMpLgorSWYgYSBwcm9jZXNzIGlzIGR5aW5nIHJlcGVhdGVkbHksIHRoZSBlYXNpZXN0IHdheSB0byBkZWJ1ZyBpdCBpcyB0byBraWxsCisgIHN0YXJ0ZXJfbG9vcC5zaCBhbmQgKGl0IGhhcyB0byBiZSBhZnRlciB0aGF0KSBzdGFydGVyX2V4ZS4gQWZ0ZXIgZG9pbmcgdGhhdCwKKyAgTk9USElORyB3aWxsIGdldCByZXN0YXJ0ZWQgKGluY2x1ZGluZyB0aGUgbm9ybWFsIHJlc3RhcnQgYWZ0ZXIgY2hhbmdpbmcgYQorICBiaW5hcnkpIHNvIHRoYXQgeW91IGNhbiBzdGFydCBhIHByb2Nlc3MgdW5kZXIgR0RCIGxpa2UgdXN1YWwgKHNob3VsZG4ndCBuZWVkCisgIGFueXRoaW5nIHNwZWNpYWwgaWYgZG9uZSBhcyByb290KS4KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vZGllLmNjIGIvYW9zL2NvbW1vbi9kaWUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliMmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vZGllLmNjCkBAIC0wLDAgKzEsODUgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2RpZS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGF0b21pYz4KKworbmFtZXNwYWNlIGFvcyB7CisKK3ZvaWQgRGllKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgVkRpZShmb3JtYXQsIGFyZ3MpOworICAvLyB2YV9lbmQoYXJncykgIC8vIG5vdCBiZWNhdXNlIFZEaWUgbmV2ZXIgcmV0dXJucworfQorCituYW1lc3BhY2UgeworCisvLyBDYWxjdWxhdGVzIHRoZSBmaWxlbmFtZSB0byBkdW1wIHRoZSBtZXNzYWdlIGludG8uCitjb25zdCBzdGQ6OnN0cmluZyBHZXRGaWxlbmFtZSgpIHsKKyNpZmRlZiBfX1ZYV09SS1NfXworICBjb25zdCBjaGFyICpuYW1lID0gdGFza05hbWUoMCk7ICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhpcyB0YXNrCisgIGlmIChuYW1lID09IE5VTEwpIG5hbWUgPSAiPHVua25vd24+IjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlyc3RfcGFydCA9ICIvYW9zX2ZhdGFsX2Vycm9yLiI7CisgIHJldHVybiBmaXJzdF9wYXJ0ICsgc3RkOjpzdHJpbmcobmFtZSk7CisjZWxzZQorICBjaGFyICpmaWxlbmFtZTsKKyAgaWYgKGFzcHJpbnRmKCZmaWxlbmFtZSwgIi90bXAvYW9zX2ZhdGFsX2Vycm9yLiVqZCIsCisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnRtYXhfdD4oZ2V0cGlkKCkpKSA+IDApIHsKKyAgICBzdGQ6OnN0cmluZyByKGZpbGVuYW1lKTsKKyAgICBmcmVlKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gcjsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImFvcyBmYXRhbDogYXNwcmludGYoJXAsIFwidGhpbmdpZSB3aXRoICUlamRcIiwgJWpkKSIKKyAgICAgICAgICAgICIgZmFpbGVkIHdpdGggJWRcbiIsICZmaWxlbmFtZSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludG1heF90PihnZXRwaWQoKSksIGVycm5vKTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgfQorI2VuZGlmCit9CisKKzo6c3RkOjphdG9taWNfYm9vbCB0ZXN0X21vZGUoZmFsc2UpOworCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBWRGllKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzX2luKSB7CisgIC8vIFdlIGRvbid0IGJvdGhlciB2YV9lbmRpbmcgZWl0aGVyIG9mIHRoZXNlIGJlY2F1c2Ugd2UncmUgZ29pbmcgbm93aGVyZSBhbmQKKyAgLy8gdnh3b3JrcyBoYXMgc29tZSB3ZWlyZCBidWdzIHRoYXQgc29tZXRpbWVzIHNob3cgdXAuLi4KKyAgdmFfbGlzdCBhcmdzMSwgYXJnczI7CisKKyAgZnB1dHMoImFvcyBmYXRhbDogRVJST1IhISBkZXRhaWxzIGZvbGxvd2luZ1xuIiwgc3RkZXJyKTsKKyAgdmFfY29weShhcmdzMSwgYXJnc19pbik7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcmdzMSk7CisgIGlmICghdGVzdF9tb2RlLmxvYWQoKSkgeworICAgIGZwdXRzKCJhb3MgZmF0YWw6IEVSUk9SISEgc2VlIHN0ZGVyciBmb3IgZGV0YWlsc1xuIiwgc3Rkb3V0KTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gR2V0RmlsZW5hbWUoKTsKKyAgICBpZiAoIWZpbGVuYW1lLmVtcHR5KCkpIHsKKyAgICAgIEZJTEUgKmVycm9yX2ZpbGUgPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAidyIpOworICAgICAgaWYgKGVycm9yX2ZpbGUgIT0gTlVMTCkgeworICAgICAgICB2YV9jb3B5KGFyZ3MyLCBhcmdzX2luKTsKKyAgICAgICAgdmZwcmludGYoZXJyb3JfZmlsZSwgZm9ybWF0LCBhcmdzMik7CisgICAgICAgIGZjbG9zZShlcnJvcl9maWxlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYW9zIGZhdGFsOiBmb3BlbignJXMnLCBcIndcIikgZmFpbGVkIHdpdGggJWRcbiIsCisgICAgICAgICAgICAgICAgZmlsZW5hbWUuY19zdHIoKSwgZXJybm8pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGFib3J0KCk7Cit9CisKK3ZvaWQgU2V0RGllVGVzdE1vZGUoYm9vbCBuZXdfdGVzdF9tb2RlKSB7CisgIHRlc3RfbW9kZS5zdG9yZShuZXdfdGVzdF9tb2RlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9kaWUuaCBiL2Fvcy9jb21tb24vZGllLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmZjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vZGllLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX0RJRV9IXworI2RlZmluZSBBT1NfQ09NTU9OX0RJRV9IXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL21hY3Jvcy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbGliYy9hb3Nfc3RyZXJyb3IuaCIKKworbmFtZXNwYWNlIGFvcyB7CisKKy8vIFRlcm1pbmF0ZXMgdGhlIHRhc2svcHJvY2VzcyBhbmQgbG9ncyBhIG1lc3NhZ2UgKHdpdGhvdXQgdXNpbmcgdGhlIGxvZ2dpbmcKKy8vIGZyYW1ld29yaykuIERlc2lnbmVkIGZvciB1c2UgaW4gY29kZSB0aGF0IGNhbid0IHVzZSB0aGUgbG9nZ2luZyBmcmFtZXdvcmsKKy8vIChjb2RlIHRoYXQgY2FuIHNob3VsZCBMT0coRkFUQUwpLCB3aGljaCBjYWxscyB0aGlzKS4KK3ZvaWQgRGllKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorICAgIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDEsIDIpKSk7Cit2b2lkIFZEaWUoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCisgICAgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQorICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChHT09EX1BSSU5URl9GT1JNQVRfVFlQRSwgMSwgMCkpKTsKKworCisvLyBUaGUgc2FtZSBhcyBEaWUgZXhjZXB0IGFwcGVuZHMgIiBiZWNhdXNlIG9mICVkICglcykiIChmb3JtYXR0ZWQgd2l0aCBlcnJubworLy8gYW5kIGFvc19zdHJlcnJvcihlcnJubykpIHRvIHRoZSBtZXNzYWdlLgorI2RlZmluZSBQRGllKGZvcm1hdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBlcnJvciA9IGVycm5vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6YW9zOjpEaWUoZm9ybWF0ICIgYmVjYXVzZSBvZiAlZCAoJXMpIiwgIyNhcmdzLCBlcnJvciwgXAorICAgICAgICAgICAgICAgYW9zX3N0cmVycm9yKGVycm9yKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKworLy8gVGhlIHNhbWUgYXMgRGllIGV4Y2VwdCBhcHBlbmRzICIgYmVjYXVzZSBvZiAlZCAoJXMpIiAoZm9ybWF0dGVkIHdpdGggZXJyb3IKKy8vIGFuZCBhb3Nfc3RyZXJyb3IoZXJyb3IpKSB0byB0aGUgbWVzc2FnZS4KKy8vIFBDSEVDSyBpcyB0byBQRGllIGFzIFBSQ0hFQ0sgaXMgdG8gUFJEaWUKKy8vCisvLyBFeGFtcGxlOgorLy8gY29uc3QgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfbG9jayh3aGF0ZXZlcik7CisvLyBpZiAocmV0ICE9IDApIFBSRGllKHJldCwgInB0aHJlYWRfbXV0ZXhfbG9jayglcCkgZmFpbGVkIiwgd2hhdGV2ZXIpOworI2RlZmluZSBQUkRpZShlcnJvciwgZm9ybWF0LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6YW9zOjpEaWUoZm9ybWF0ICIgYmVjYXVzZSBvZiAlZCAoJXMpIiwgIyNhcmdzLCBlcnJvciwgXAorICAgICAgICAgICAgICAgYW9zX3N0cmVycm9yKGVycm9yKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKworLy8gVHVybnMgb24gKG9yIG9mZikgInRlc3QgbW9kZSIsIHdoZXJlIChWKURpZSBkb2Vzbid0IHdyaXRlIG91dCBmaWxlcyBhbmQKKy8vIGRvZXNuJ3QgcHJpbnQgdG8gc3Rkb3V0LgorLy8gVGVzdCBtb2RlIGRlZmF1bHRzIHRvIGZhbHNlLgordm9pZCBTZXREaWVUZXN0TW9kZShib29sIHRlc3RfbW9kZSk7CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX0RJRV9IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9kaWVfdGVzdC5jYyBiL2Fvcy9jb21tb24vZGllX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3NTQzYwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vZGllX3Rlc3QuY2MKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworVEVTVChEaWVEZWF0aFRlc3QsIFdvcmtzKSB7CisgIEVYUEVDVF9FWElUKERpZSgic3RyPSVzIG51bT0lZFxuIiwgImhpIiwgNSksCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICIuKnN0cj1oaSBudW09NVxuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2V2ZW50LmggYi9hb3MvY29tbW9uL2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzOWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vZXZlbnQuaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIEFPU19DT01NT05fRVZFTlRfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9FVkVOVF9IXworCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9hb3Nfc3luYy5oIgorCituYW1lc3BhY2UgYW9zIHsKKworLy8gQW4gYWJzdHJhY3Rpb24gb2YgYW4gZXZlbnQgd2hpY2ggaXMgZWFzeSB0byBpbXBsZW1lbnQgZm9yIExpbnV4IGFuZCBpbiBvdGhlcgorLy8gZW52aXJvbm1lbnRzLgorLy8gT24gTGludXggYXQgbGVhc3QsIHRoaXMgaXMgZGVmaW5pdGVseSBzYWZlIGZvciBwYXNzaW5nIHRocm91Z2ggQyBjb2RlIHdpdGgKKy8vIG1lbWNweSBldGMuCisvLworLy8gQW4gZXZlbnQgaXMgZWl0aGVyICJzZXQiIG9yICJ1bnNldCIuIEFueSB0aHJlYWQgY2FuIHRyYW5zaXRpb24gaXQgYmV0d2VlbgorLy8gdGhlc2UgdHdvIHN0YXRlcyBhbmQgb3RoZXIgdGhyZWFkcyBjYW4gd2FpdCBmb3IgYW4gdW5zZXQtPnNldCB0cmFuc2l0aW9uLgorLy8gVGhpcyBpcyBub3QgYSBwYXJ0aWN1bGFybHkgcG93ZXJmdWwgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZSwgYnV0IGl0IGNhbiBiZQorLy8gbXVjaCBlYXNpZXIgdG8gdXNlIHRoYW4gbW9yZSBjb21wbGljYXRlZCBvbmVzIGluIHNvbWUgc2l0dWF0aW9ucy4gVGhlIG5hbWUgaXMKKy8vIHRha2VuIGZyb20gUHl0aG9uJ3MgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNhbWUgdGhpbmcuCisvLworLy8gQW4gZXZlbnQgaXMgZXF1aXZhbGVudCB0byBhIHNlbWFwaG9yZSB3aGljaCBpcyBlaXRoZXIgc2V0IHRvIDAgb3IgaW5maW5pdHkuCisvLyBJdCBpcyBhbHNvIGVxdWl2YWxlbnQgdG8gYSBjb25kaXRpb24gdmFyaWFibGUgd2l0aCB0aGUgbW9uaXRvcmVkIGNvbmRpdGlvbgorLy8gYmVpbmcgImlzIGl0IHNldCBvciBub3QiLgorLy8KKy8vIElNUE9SVEFOVDogWW91IGNhbiBOT1QgdXNlIHRoaXMgdG8gc3VjY2Vzc2Z1bGx5IHJlcGxhY2UgYSBzdGFuZGFyZCBjb25kaXRpb24KKy8vIHZhcmlhYmxlIGluIG1vc3QgY2FzZXMuIFdoZW4gdGhlIGNvbmRpdGlvbiBiZWluZyBtb25pdG9yZWQgY2hhbmdlcyBzZXBhcmF0ZWx5CisvLyBmcm9tIHRoZSBhY3R1YWwgc3RhdGUgb2YgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZS9ldmVudCwgdGhlcmUgV0lMTCBiZSByYWNlCisvLyBjb25kaXRpb25zIGlmIHlvdSB0cnkgdG8gdXNlIHRoaXMgY2xhc3MuCisvLworLy8gSXQgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIHRvIGRlc3Ryb3kgYW4gRXZlbnQgd2hpbGUgdGhlcmUgYXJlIGN1cnJlbnQKKy8vIFdhaXQoKWVycy4KK2NsYXNzIEV2ZW50IHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYW4gdW5zZXQgZXZlbnQuCisgIEV2ZW50KCk7CisgIC8vIFRoZXJlIG11c3QgYmUgbm8gd2FpdGVycyB3aGVuIGFuIEV2ZW50IGlzIGRlc3Ryb3llZC4KKyAgfkV2ZW50KCkgPSBkZWZhdWx0OworCisgIC8vIFdhaXRzIGZvciB0aGUgZXZlbnQgdG8gYmUgc2V0LiBSZXR1cm5zIGltbWVkaWF0ZWx5IGlmIGl0IGlzIGFscmVhZHkgc2V0LgorICB2b2lkIFdhaXQoKTsKKworICAvLyBXYWtlcyB1cCBhbGwgV2FpdCgpZXJzIGFuZCBzZXRzIHRoZSBldmVudCAoYXRvbWljYWxseSkuCisgIHZvaWQgU2V0KCk7CisgIC8vIFVuc2V0cyB0aGUgZXZlbnQgc28gZnV0dXJlIFdhaXQoKSBjYWxsZXJzIHdpbGwgYmxvY2sgaW5zdGVhZCBvZiByZXR1cm5pbmcKKyAgLy8gaW1tZWRpYXRlbHkuCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHByZXZpb3VzbHkgc2V0LgorICBib29sIENsZWFyKCk7CisKKyBwcml2YXRlOgorICBhb3NfZnV0ZXggaW1wbF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9ldmVudF90ZXN0LmNjIGIvYW9zL2NvbW1vbi9ldmVudF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjcxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2V2ZW50X3Rlc3QuY2MKQEAgLTAsMCArMSw3MSBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vZXZlbnQuaCIKKworI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgRXZlbnRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBFdmVudCB0ZXN0X2V2ZW50OworCisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6OkVuYWJsZVRlc3RMb2dnaW5nKCk7CisgIH0KK307CisKKy8vIE1ha2VzIHN1cmUgdGhhdCBiYXNpYyBvcGVyYXRpb25zIHdpdGggbm8gYmxvY2tpbmcgb3IgYW55dGhpbmcgd29yay4KK1RFU1RfRihFdmVudFRlc3QsIEJhc2ljKSB7CisgIEVYUEVDVF9GQUxTRSh0ZXN0X2V2ZW50LkNsZWFyKCkpOworICBFWFBFQ1RfRkFMU0UodGVzdF9ldmVudC5DbGVhcigpKTsKKworICB0ZXN0X2V2ZW50LlNldCgpOworICB0ZXN0X2V2ZW50LldhaXQoKTsKKyAgRVhQRUNUX1RSVUUodGVzdF9ldmVudC5DbGVhcigpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RfZXZlbnQuQ2xlYXIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdHNhbiB1bmRlcnN0YW5kcyB0aGF0IGV2ZW50cyBlc3RhYmxpc2ggYSBoYXBwZW5zLWJlZm9yZQorLy8gcmVsYXRpb25zaGlwLgorVEVTVF9GKEV2ZW50VGVzdCwgVGhyZWFkU2FuaXRpemVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAwMDsgKytpKSB7CisgICAgaW50IHZhcmlhYmxlID0gMDsKKyAgICB0ZXN0X2V2ZW50LkNsZWFyKCk7CisgICAgOjpzdGQ6OnRocmVhZCB0aHJlYWQoW3RoaXMsICZ2YXJpYWJsZV0oKSB7CisgICAgICB0ZXN0X2V2ZW50LldhaXQoKTsKKyAgICAgIC0tdmFyaWFibGU7CisgICAgfSk7CisgICAgKyt2YXJpYWJsZTsKKyAgICB0ZXN0X2V2ZW50LlNldCgpOworICAgIHRocmVhZC5qb2luKCk7CisgICAgRVhQRUNUX0VRKDAsIHZhcmlhYmxlKTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGF0IGFuIGV2ZW50IGJsb2NrcyBjb3JyZWN0bHkuCitURVNUX0YoRXZlbnRUZXN0LCBCbG9ja3MpIHsKKyAgdGltZTo6VGltZSBzdGFydF90aW1lLCBmaW5pc2hfdGltZTsKKyAgLy8gV2l0aG91dCB0aGlzLCBpdCBzb21ldGltZXMgbWFuYWdlcyB0byBmYWlsIHVuZGVyIHRzYW4uCisgIEV2ZW50IHN0YXJ0ZWQ7CisgIDo6c3RkOjp0aHJlYWQgdGhyZWFkKFt0aGlzLCAmc3RhcnRfdGltZSwgJmZpbmlzaF90aW1lLCAmc3RhcnRlZF0oKSB7CisgICAgc3RhcnRfdGltZSA9IHRpbWU6OlRpbWU6Ok5vdygpOworICAgIHN0YXJ0ZWQuU2V0KCk7CisgICAgdGVzdF9ldmVudC5XYWl0KCk7CisgICAgZmluaXNoX3RpbWUgPSB0aW1lOjpUaW1lOjpOb3coKTsKKyAgfSk7CisgIHN0YXRpYyBjb25zdCB0aW1lOjpUaW1lIGtXYWl0VGltZSA9IHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjA1KTsKKyAgc3RhcnRlZC5XYWl0KCk7CisgIHRpbWU6OlNsZWVwRm9yKGtXYWl0VGltZSk7CisgIHRlc3RfZXZlbnQuU2V0KCk7CisgIHRocmVhZC5qb2luKCk7CisgIEVYUEVDVF9HRShmaW5pc2hfdGltZSAtIHN0YXJ0X3RpbWUsIGtXYWl0VGltZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2d0ZXN0X3Byb2QuaCBiL2Fvcy9jb21tb24vZ3Rlc3RfcHJvZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGIwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2d0ZXN0X3Byb2QuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIEFPU19DT01NT05fR1RFU1RfUFJPRF9IXworI2RlZmluZSBBT1NfQ09NTU9OX0dURVNUX1BST0RfSF8KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3Byb2QuaCIKKworLy8gVGhlc2UgbWFjcm9zIHJlcGxhY2UgZ3Rlc3QncyBGUklFTkRfVEVTVCBpZiB0aGUgdGVzdCBpcyBpbiBhIGRpZmZlcmVudAorLy8gbmFtZXNwYWNlIHRoYW4gdGhlIGNvZGUgdGhhdCBuZWVkcyB0byBtYWtlIGl0IGEgZnJpZW5kLgorLy8gRXhhbXBsZToKKy8vICBmb28uaDoKKy8vICAgbmFtZXNwYWNlIGJsYSB7CisvLyAgIG5hbWVzcGFjZSB0ZXN0aW5nIHsKKy8vCisvLyAgIEZPUldBUkRfREVDTEFSRV9URVNUX0NBU0UoRm9vVGVzdCwgQmFyKTsKKy8vCisvLyAgIH0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLworLy8gICBjbGFzcyBGb28geworLy8gICAgIEZSSUVORF9URVNUX05BTUVTUEFDRShGb29UZXN0LCBCYXIsIHRlc3RpbmcpOworLy8gICB9OworLy8KKy8vICAgfSAgLy8gbmFtZXNwYWNlIGJsYQorLy8gIGZvb190ZXN0LmNjOgorLy8gICBuYW1lc3BhY2UgYmxhIHsKKy8vICAgbmFtZXNwYWNlIHRlc3RpbmcgeworLy8KKy8vICAgVEVTVChGb29UZXN0LCBCYXIpIHsKKy8vICAgICBhY2Nlc3MgcHJpdmF0ZSBtZW1iZXJzIG9mIEZvbworLy8gICB9CisvLworLy8gICB9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworLy8gICB9ICAvLyBuYW1lc3BhY2UgYmxhCisjZGVmaW5lIEZPUldBUkRfREVDTEFSRV9URVNUX0NBU0UodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAorICAgIGNsYXNzIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0OworI2RlZmluZSBGUklFTkRfVEVTVF9OQU1FU1BBQ0UodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSwgbmFtZXNwYWNlX25hbWUpIFwKKyAgICBmcmllbmQgY2xhc3MgbmFtZXNwYWNlX25hbWU6OnRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0CisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9HVEVTVF9QUk9EX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2lucHV0L2RyaXZlcl9zdGF0aW9uX2RhdGEuY2MgYi9hb3MvY29tbW9uL2lucHV0L2RyaXZlcl9zdGF0aW9uX2RhdGEuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmOThiZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vaW5wdXQvZHJpdmVyX3N0YXRpb25fZGF0YS5jYwpAQCAtMCwwICsxLDEwMCBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vaW5wdXQvZHJpdmVyX3N0YXRpb25fZGF0YS5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBpbnB1dCB7CituYW1lc3BhY2UgZHJpdmVyX3N0YXRpb24geworCitEYXRhOjpEYXRhKCkgOiBjdXJyZW50X3ZhbHVlc18oKSwgb2xkX3ZhbHVlc18oKSB7fQorCit2b2lkIERhdGE6OlVwZGF0ZShjb25zdCBKb3lzdGlja1N0YXRlICZuZXdfdmFsdWVzKSB7CisgIG9sZF92YWx1ZXNfID0gY3VycmVudF92YWx1ZXNfOworICBjdXJyZW50X3ZhbHVlc18gPSBuZXdfdmFsdWVzOworfQorCituYW1lc3BhY2UgeworCitib29sIEdldEJ1dHRvbihjb25zdCBCdXR0b25Mb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgIGNvbnN0IEpveXN0aWNrU3RhdGUgJnZhbHVlcykgeworICByZXR1cm4gdmFsdWVzLmpveXN0aWNrc1tsb2NhdGlvbi5qb3lzdGljaygpIC0gMV0uYnV0dG9ucyAmCisgICAgICAoMSA8PCAobG9jYXRpb24ubnVtYmVyKCkgLSAxKSk7Cit9CisKK2Jvb2wgRG9HZXRQT1YoY29uc3QgUE9WTG9jYXRpb24gbG9jYXRpb24sIGNvbnN0IEpveXN0aWNrU3RhdGUgJnZhbHVlcykgeworICByZXR1cm4gdmFsdWVzLmpveXN0aWNrc1tsb2NhdGlvbi5qb3lzdGljaygpIC0gMV0ucG92ID09IGxvY2F0aW9uLm51bWJlcigpOworfQorCitib29sIEdldENvbnRyb2xCaXRWYWx1ZShjb25zdCBDb250cm9sQml0IGJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEpveXN0aWNrU3RhdGUgJnZhbHVlcykgeworICBzd2l0Y2ggKGJpdCkgeworICAgIGNhc2UgQ29udHJvbEJpdDo6a1Rlc3RNb2RlOgorICAgICAgcmV0dXJuIHZhbHVlcy50ZXN0X21vZGU7CisgICAgY2FzZSBDb250cm9sQml0OjprRm1zQXR0YWNoZWQ6CisgICAgICByZXR1cm4gdmFsdWVzLmZtc19hdHRhY2hlZDsKKyAgICBjYXNlIENvbnRyb2xCaXQ6OmtBdXRvbm9tb3VzOgorICAgICAgcmV0dXJuIHZhbHVlcy5hdXRvbm9tb3VzOworICAgIGNhc2UgQ29udHJvbEJpdDo6a0VuYWJsZWQ6CisgICAgICByZXR1cm4gdmFsdWVzLmVuYWJsZWQ7CisgICAgZGVmYXVsdDoKKyAgICAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIERhdGE6OklzUHJlc3NlZChjb25zdCBCdXR0b25Mb2NhdGlvbiBsb2NhdGlvbikgY29uc3QgeworICByZXR1cm4gR2V0QnV0dG9uKGxvY2F0aW9uLCBjdXJyZW50X3ZhbHVlc18pOworfQorCitib29sIERhdGE6OlBvc0VkZ2UoY29uc3QgQnV0dG9uTG9jYXRpb24gbG9jYXRpb24pIGNvbnN0IHsKKyAgcmV0dXJuICFHZXRCdXR0b24obG9jYXRpb24sIG9sZF92YWx1ZXNfKSAmJgorICAgICAgR2V0QnV0dG9uKGxvY2F0aW9uLCBjdXJyZW50X3ZhbHVlc18pOworfQorCitib29sIERhdGE6Ok5lZ0VkZ2UoY29uc3QgQnV0dG9uTG9jYXRpb24gbG9jYXRpb24pIGNvbnN0IHsKKyAgcmV0dXJuIEdldEJ1dHRvbihsb2NhdGlvbiwgb2xkX3ZhbHVlc18pICYmCisgICAgICAhR2V0QnV0dG9uKGxvY2F0aW9uLCBjdXJyZW50X3ZhbHVlc18pOworfQorCitib29sIERhdGE6OklzUHJlc3NlZChjb25zdCBQT1ZMb2NhdGlvbiBsb2NhdGlvbikgY29uc3QgeworICByZXR1cm4gRG9HZXRQT1YobG9jYXRpb24sIGN1cnJlbnRfdmFsdWVzXyk7Cit9CisKK2Jvb2wgRGF0YTo6UG9zRWRnZShjb25zdCBQT1ZMb2NhdGlvbiBsb2NhdGlvbikgY29uc3QgeworICByZXR1cm4gIURvR2V0UE9WKGxvY2F0aW9uLCBvbGRfdmFsdWVzXykgJiYKKyAgICAgICAgIERvR2V0UE9WKGxvY2F0aW9uLCBjdXJyZW50X3ZhbHVlc18pOworfQorCitib29sIERhdGE6Ok5lZ0VkZ2UoY29uc3QgUE9WTG9jYXRpb24gbG9jYXRpb24pIGNvbnN0IHsKKyAgcmV0dXJuIERvR2V0UE9WKGxvY2F0aW9uLCBvbGRfdmFsdWVzXykgJiYKKyAgICAgICAgICFEb0dldFBPVihsb2NhdGlvbiwgY3VycmVudF92YWx1ZXNfKTsKK30KKworaW50MzJfdCBEYXRhOjpHZXRQT1YoaW50IGpveXN0aWNrKSBjb25zdCB7CisgIHJldHVybiBjdXJyZW50X3ZhbHVlc18uam95c3RpY2tzW2pveXN0aWNrIC0gMV0ucG92OworfQorCitpbnQzMl90IERhdGE6OkdldE9sZFBPVihpbnQgam95c3RpY2spIGNvbnN0IHsKKyAgcmV0dXJuIG9sZF92YWx1ZXNfLmpveXN0aWNrc1tqb3lzdGljayAtIDFdLnBvdjsKK30KKworYm9vbCBEYXRhOjpHZXRDb250cm9sQml0KGNvbnN0IENvbnRyb2xCaXQgYml0KSBjb25zdCB7CisgIHJldHVybiBHZXRDb250cm9sQml0VmFsdWUoYml0LCBjdXJyZW50X3ZhbHVlc18pOworfQorCitib29sIERhdGE6OlBvc0VkZ2UoY29uc3QgQ29udHJvbEJpdCBiaXQpIGNvbnN0IHsKKyAgcmV0dXJuICFHZXRDb250cm9sQml0VmFsdWUoYml0LCBvbGRfdmFsdWVzXykgJiYKKyAgICAgIEdldENvbnRyb2xCaXRWYWx1ZShiaXQsIGN1cnJlbnRfdmFsdWVzXyk7Cit9CisKK2Jvb2wgRGF0YTo6TmVnRWRnZShjb25zdCBDb250cm9sQml0IGJpdCkgY29uc3QgeworICByZXR1cm4gR2V0Q29udHJvbEJpdFZhbHVlKGJpdCwgb2xkX3ZhbHVlc18pICYmCisgICAgICAhR2V0Q29udHJvbEJpdFZhbHVlKGJpdCwgY3VycmVudF92YWx1ZXNfKTsKK30KKworZmxvYXQgRGF0YTo6R2V0QXhpcyhKb3lzdGlja0F4aXMgYXhpcykgY29uc3QgeworICByZXR1cm4gY3VycmVudF92YWx1ZXNfLmpveXN0aWNrc1theGlzLmpveXN0aWNrKCkgLSAxXS5heGlzW2F4aXMubnVtYmVyKCkgLSAxXTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGRyaXZlcl9zdGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgaW5wdXQKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vaW5wdXQvZHJpdmVyX3N0YXRpb25fZGF0YS5oIGIvYW9zL2NvbW1vbi9pbnB1dC9kcml2ZXJfc3RhdGlvbl9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3YWQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vaW5wdXQvZHJpdmVyX3N0YXRpb25fZGF0YS5oCkBAIC0wLDAgKzEsMTExIEBACisjaWZuZGVmIEFPU19DT01NT05fSU5QVVRfRFJJVkVSX1NUQVRJT05fREFUQV9IXworI2RlZmluZSBBT1NfQ09NTU9OX0lOUFVUX0RSSVZFUl9TVEFUSU9OX0RBVEFfSF8KKworLy8gVGhpcyBmaWxlIGRlZmluZXMgc2V2ZXJhbCB0eXBlcyB0byBzdXBwb3J0IG5pY2VseSBsb29raW5nIGF0IHRoZSBkYXRhCisvLyByZWNlaXZlZCBmcm9tIHRoZSBkcml2ZXIncyBzdGF0aW9uLgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tZXNzYWdlcy9yb2JvdF9zdGF0ZS5xLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGlucHV0IHsKK25hbWVzcGFjZSBkcml2ZXJfc3RhdGlvbiB7CisKKy8vIFJlcHJlc2VudHMgYSBmZWF0dXJlIG9mIGEgam95c3RpY2sgKGEgYnV0dG9uIG9yIGFuIGF4aXMpLgorLy8gQWxsIGluZGljZXMgYXJlIDEtYmFzZWQuCitjbGFzcyBKb3lzdGlja0ZlYXR1cmUgeworIHB1YmxpYzoKKyAgSm95c3RpY2tGZWF0dXJlKGludCBqb3lzdGljaywgaW50IG51bWJlcikKKyAgICAgIDogam95c3RpY2tfKGpveXN0aWNrKSwgbnVtYmVyXyhudW1iZXIpIHt9CisKKyAgLy8gSG93IG1hbnkgam95c3RpY2tzIHRoZXJlIGFyZS4KKyAgc3RhdGljIGNvbnN0IGludCBrSm95c3RpY2tzID0gc2l6ZW9mKEpveXN0aWNrU3RhdGU6OmpveXN0aWNrcykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSm95c3RpY2tTdGF0ZTo6am95c3RpY2tzWzBdKTsKKworICAvLyBXaGljaCBqb3lzdGljayBudW1iZXIgdGhpcyBpcyAoMS1iYXNlZCkuCisgIGludCBqb3lzdGljaygpIGNvbnN0IHsgcmV0dXJuIGpveXN0aWNrXzsgfQorICAvLyBXaGljaCBmZWF0dXJlIG9uIGpveXN0aWNrKCkgdGhpcyBpcyAoMS1iYXNlZCkuCisgIGludCBudW1iZXIoKSBjb25zdCB7IHJldHVybiBudW1iZXJfOyB9CisKKyBwcml2YXRlOgorICBjb25zdCBpbnQgam95c3RpY2tfLCBudW1iZXJfOworfTsKKworLy8gUmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgYSBidXR0b24uCisvLyBVc2UgRGF0YSB0byBhY3R1YWxseSBnZXQgdGhlIHZhbHVlLgorLy8gU2FmZSBmb3Igc3RhdGljIGluaXRpYWxpemF0aW9uLgorY2xhc3MgQnV0dG9uTG9jYXRpb24gOiBwdWJsaWMgSm95c3RpY2tGZWF0dXJlIHsKKyBwdWJsaWM6CisgIEJ1dHRvbkxvY2F0aW9uKGludCBqb3lzdGljaywgaW50IG51bWJlcikKKyAgICAgIDogSm95c3RpY2tGZWF0dXJlKGpveXN0aWNrLCBudW1iZXIpIHt9CisKKyAgLy8gSG93IG1hbnkgYnV0dG9ucyB0aGVyZSBhcmUgYXZhaWxhYmxlIG9uIGVhY2ggam95c3RpY2suCisgIHN0YXRpYyBjb25zdCBpbnQga0J1dHRvbnMgPSAxMjsKK307CisKKy8vIFJlcHJlc2VudHMgdGhlIGRpcmVjdGlvbiBvZiBhIFBPViBvbiBhIGpveXN0aWNrLgorLy8gVXNlIERhdGEgdG8gYWN0dWFsbHkgZ2V0IHRoZSB2YWx1ZS4KKy8vIFNhZmUgZm9yIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KK2NsYXNzIFBPVkxvY2F0aW9uIDogcHVibGljIEpveXN0aWNrRmVhdHVyZSB7CisgcHVibGljOgorICBQT1ZMb2NhdGlvbihpbnQgam95c3RpY2ssIGludCBudW1iZXIpCisgICAgICA6IEpveXN0aWNrRmVhdHVyZShqb3lzdGljaywgbnVtYmVyKSB7fQorfTsKKworLy8gUmVwcmVzZW50cyB2YXJpb3VzIGJpdHMgb2YgY29udHJvbCBpbmZvcm1hdGlvbiB0aGF0IHRoZSBEUyBzZW5kcy4KKy8vIFVzZSBEYXRhIHRvIGFjdHVhbGx5IGdldCB0aGUgdmFsdWUuCitlbnVtIGNsYXNzIENvbnRyb2xCaXQgeworICBrVGVzdE1vZGUsIGtGbXNBdHRhY2hlZCwga0F1dG9ub21vdXMsIGtFbmFibGVkCit9OworCisvLyBSZXByZXNlbnRzIGEgc2luZ2xlIGF4aXMgb2YgYSBqb3lzdGljay4KKy8vIFVzZSBEYXRhIHRvIGFjdHVhbGx5IGdldCB0aGUgdmFsdWUuCisvLyBTYWZlIGZvciBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCitjbGFzcyBKb3lzdGlja0F4aXMgOiBwdWJsaWMgSm95c3RpY2tGZWF0dXJlIHsKKyBwdWJsaWM6CisgIEpveXN0aWNrQXhpcyhpbnQgam95c3RpY2ssIGludCBudW1iZXIpCisgICAgICA6IEpveXN0aWNrRmVhdHVyZShqb3lzdGljaywgbnVtYmVyKSB7fQorCisgIC8vIEhvdyBtYW55IGF4ZXMgdGhlcmUgYXJlIGF2YWlsYWJsZSBvbiBlYWNoIGpveXN0aWNrLgorICBzdGF0aWMgY29uc3QgaW50IGtBeGVzID0gc2l6ZW9mKEpveXN0aWNrOjpheGlzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSm95c3RpY2s6OmF4aXNbMF0pOworfTsKKworY2xhc3MgRGF0YSB7CisgcHVibGljOgorICAvLyBJbml0aWFsaXplcyB0aGUgZGF0YSB0byBhbGwgYnV0dG9ucyBhbmQgY29udHJvbCBiaXRzIG9mZiBhbmQgYWxsIGpveXN0aWNrcworICAvLyBhdCAwLgorICBEYXRhKCk7CisKKyAgLy8gVXBkYXRlcyB0aGUgY3VycmVudCBpbmZvcm1hdGlvbiB3aXRoIGEgbmV3IHNldCBvZiB2YWx1ZXMuCisgIHZvaWQgVXBkYXRlKGNvbnN0IEpveXN0aWNrU3RhdGUgJm5ld192YWx1ZXMpOworCisgIGJvb2wgSXNQcmVzc2VkKFBPVkxvY2F0aW9uIGxvY2F0aW9uKSBjb25zdDsKKyAgYm9vbCBQb3NFZGdlKFBPVkxvY2F0aW9uIGxvY2F0aW9uKSBjb25zdDsKKyAgYm9vbCBOZWdFZGdlKFBPVkxvY2F0aW9uIGxvY2F0aW9uKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyAidmFsdWVzIiBmb3IgdGhlIFBPVi4KKyAgaW50MzJfdCBHZXRQT1YoaW50IGpveXN0aWNrKSBjb25zdDsKKyAgaW50MzJfdCBHZXRPbGRQT1YoaW50IGpveXN0aWNrKSBjb25zdDsKKworICBib29sIElzUHJlc3NlZChCdXR0b25Mb2NhdGlvbiBsb2NhdGlvbikgY29uc3Q7CisgIGJvb2wgUG9zRWRnZShCdXR0b25Mb2NhdGlvbiBsb2NhdGlvbikgY29uc3Q7CisgIGJvb2wgTmVnRWRnZShCdXR0b25Mb2NhdGlvbiBsb2NhdGlvbikgY29uc3Q7CisKKyAgYm9vbCBHZXRDb250cm9sQml0KENvbnRyb2xCaXQgYml0KSBjb25zdDsKKyAgYm9vbCBQb3NFZGdlKENvbnRyb2xCaXQgYml0KSBjb25zdDsKKyAgYm9vbCBOZWdFZGdlKENvbnRyb2xCaXQgYml0KSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgcmFuZ2UgWy0xLjAsIDEuMF0uCisgIGZsb2F0IEdldEF4aXMoSm95c3RpY2tBeGlzIGF4aXMpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgSm95c3RpY2tTdGF0ZSBjdXJyZW50X3ZhbHVlc18sIG9sZF92YWx1ZXNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRyaXZlcl9zdGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgaW5wdXQKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX0lOUFVUX0RSSVZFUl9TVEFUSU9OX0RBVEFfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vaW5wdXQvaW5wdXQuZ3lwIGIvYW9zL2NvbW1vbi9pbnB1dC9pbnB1dC5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3NGNlNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vaW5wdXQvaW5wdXQuZ3lwCkBAIC0wLDAgKzEsMTcgQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RyaXZlcl9zdGF0aW9uX2RhdGEnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdkcml2ZXJfc3RhdGlvbl9kYXRhLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9tZXNzYWdlcy9tZXNzYWdlcy5neXA6cm9ib3Rfc3RhdGUnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9tZXNzYWdlcy9tZXNzYWdlcy5neXA6cm9ib3Rfc3RhdGUnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9saWJjL1JFQURNRSBiL2Fvcy9jb21tb24vbGliYy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlZTgxNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbGliYy9SRUFETUUKQEAgLTAsMCArMSwxOCBAQAorVGhpcyBkaXJlY3RvcnkgaGFzIHJlcGxhY2VtZW50cyBmb3Igc29tZSBsaWJjIGZ1bmN0aW9ucyB0aGF0IHdlIGRvbid0IHdhbnQgdG8KK3VzZSBiZWNhdXNlIHRoZXkncmUgbm90IHRocmVhZC1zYWZlIGFuZC9vciB0aGV5IGFsbG9jYXRlIG1lbW9yeS4KKworU29tZSBvZiB0aGVtIGFyZSBpbXBsZW1lbnRlZCBhcyBDKysgZnVuY3Rpb25zIGJlY2F1c2UgaXQgbWFrZXMgZml4aW5nIHRoZQorbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWVzIHRoYXQgY2F1c2UgdGhlIHN0YW5kYXJkIHZlcnNpb25zIHRvIGJlIG5vdCB0aHJlYWQtc2FmZQorcG9zc2libGUgYW5kIHNvbWUgb2YgdGhlbSBhcmUgc3RpbGwgY2FsbGFibGUgZnJvbSBDIHdoZW4gaXQgbWFrZXMgc2Vuc2UuCisKKzxodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS9mdW5jdGlvbnMvVjJfY2hhcDAyLmh0bWwjdGFnXzE1XzA5XzAxPgoraGFzIGEgbGlzdCBvZiB0aGUgbm90LXRocmVhZC1zYWZlIFBPU0lYIGZ1bmN0aW9ucy4gV2UndmUgZ290dGVuIHJpZCBvZiBhbGwgb2YKK3Rob3NlIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZzoKKyAgZ2V0ZW52KDMpOiA8aHR0cDovL2F1c3Rpbmdyb3VwYnVncy5uZXQvdmlldy5waHA/aWQ9MTg4PiBwcm9wb3NlcyBjaGFuZ2luZworICAgIFBPU0lYIHRvIHJlcXVpcmUgaXQgdG8gcmV0dXJuIGEgcG9pbnRlciBpbnRvIGVudmlyb24sIG1ha2luZyBpdCB0aHJlYWQtc2FmZSwKKyAgICB3aGljaCBnbGliYyBhbHJlYWR5IGRvZXMuCisgIGluZXRfbnRvYSgzKTogR2xpYmMgdXNlcyBhIHRocmVhZC1sb2NhbCBidWZmZXIsIHdoaWNoIG1ha2VzIGl0IHRocmVhZC1zYWZlLAorICAgIGFuZCB1c2VzIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGdvIGF3YXkgc29vbi4KKyAgcmVhZGRpcigzKTogR2xpYmMgYWxyZWFkeSBndWFyYW50ZWVzIHRoYXQgb25seSBpbnZvY2F0aW9ucyBvbiB0aGUgc2FtZQorICAgIGRpcmVjdG9yeSBzdHJlYW0gYXJlbid0IHRocmVhZC1zYWZlLCBhbmQgdGhlcmUncyB0YWxrIG9mIGNoYW5naW5nIFBPU0lYIHRvCisgICAgc2F5IHRoZSBzYW1lIHRoaW5nLgpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJlcnJvci5jYyBiL2Fvcy9jb21tb24vbGliYy9hb3Nfc3RyZXJyb3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5NzM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbGliYy9hb3Nfc3RyZXJyb3IuY2MKQEAgLTAsMCArMSw0MSBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vbGliYy9hb3Nfc3RyZXJyb3IuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIFRoaXMgY29kZSB1c2VzIGFuIG92ZXJsb2FkZWQgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZXN1bHQgZnJvbSBlaXRoZXIKKy8vIHZlcnNpb24gb2Ygc3RyZXJyb3JfciBjb3JyZWN0bHkgd2l0aG91dCBuZWVkaW5nIGEgd2F5IHRvIGdldCB0aGUgY2hvaWNlIG91dAorLy8gb2YgdGhlIGNvbXBpbGVyL2dsaWJjL3doYXRldmVyIGV4cGxpY2l0bHkuCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHNpemVfdCBrQnVmZmVyU2l6ZSA9IDEyODsKKworLy8gSGFuZGxlIHRoZSByZXN1bHQgZnJvbSB0aGUgR05VIHZlcnNpb24gb2Ygc3RyZXJyb3Jfci4gSXQgbmV2ZXIgZmFpbHMsIHNvCisvLyB0aGF0J3MgcHJldHR5IGVhc3kuLi4KK19fYXR0cmlidXRlX18oKHVudXNlZCkpCitjaGFyICphb3Nfc3RyZXJyb3JfaGFuZGxlX3Jlc3VsdChpbnQgLyplcnJvciovLCBjaGFyICpyZXQsIGNoYXIgKiAvKmJ1ZmZlciovKSB7CisgIHJldHVybiByZXQ7Cit9CisKKy8vIEhhbmRsZSB0aGUgcmVzdWx0IGZyb20gdGhlIFBPU0lYIHZlcnNpb24gb2Ygc3RyZXJyb3Jfci4KK19fYXR0cmlidXRlX18oKHVudXNlZCkpCitjaGFyICphb3Nfc3RyZXJyb3JfaGFuZGxlX3Jlc3VsdChpbnQgZXJyb3IsIGludCByZXQsIGNoYXIgKmJ1ZmZlcikgeworICBpZiAocmV0ICE9IDApIHsKKyAgICBjb25zdCBpbnQgciA9IHNucHJpbnRmKGJ1ZmZlciwga0J1ZmZlclNpemUsICJVbmtub3duIGVycm9yICVkIiwgZXJyb3IpOworICAgIGFzc2VydChyID4gMCk7CisgIH0KKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IGNoYXIgKmFvc19zdHJlcnJvcihpbnQgZXJyb3IpIHsKKyAgc3RhdGljIHRocmVhZF9sb2NhbCBjaGFyIGJ1ZmZlcltrQnVmZmVyU2l6ZV07CisKKyAgLy8gQ2FsbCB0aGUgb3ZlcmxvYWQgZm9yIHdoaWNoZXZlciB2ZXJzaW9uIHdlJ3JlIHVzaW5nLgorICByZXR1cm4gYW9zX3N0cmVycm9yX2hhbmRsZV9yZXN1bHQoCisgICAgICBlcnJvciwgc3RyZXJyb3JfcihlcnJvciwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSksIGJ1ZmZlcik7Cit9CmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xpYmMvYW9zX3N0cmVycm9yLmggYi9hb3MvY29tbW9uL2xpYmMvYW9zX3N0cmVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjZTQyNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbGliYy9hb3Nfc3RyZXJyb3IuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIEFPU19DT01NT05fTElCQ19BT1NfU1RSRVJST1JfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9MSUJDX0FPU19TVFJFUlJPUl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFRocmVhZC1zYWZlIHZlcnNpb24gb2Ygc3RyZXJyb3IoMykgKGV4Y2VwdCBpdCBtYXkgY2hhbmdlIGVycm5vKS4KKy8vCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byBzdGF0aWMgZGF0YSBvciBhIHRocmVhZC1sb2NhbCBidWZmZXIuCisvLworLy8gTmVjZXNzYXJ5IGJlY2F1c2Ugc3RyZXJyb3JfcigzKSBpcyBzdWNoIGEgbWVzcyAod2hpY2ggdmVyc2lvbiB5b3UgZ2V0IGlzCisvLyBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSBieSBibGFjayBtYWdpYyByZWxhdGVkIHRvIGZlYXR1cmUgbWFjcm8KKy8vIGRlZmluaXRpb25zLCBjb21waWxlciBmbGFncywgZ2xpYmMgdmVyc2lvbiwgYW5kIGV2ZW4gd2hldGhlciB5b3UncmUgdXNpbmcgZysrCisvLyBvciBjbGFuZysrKSBhbmQgc3RyZXJyb3JfbCgzKSBtaWdodCBub3Qgd29yayBpZiB5b3UgZW5kIHVwIHdpdGggdGhlIG1hZ2ljCisvLyBMQ19HTE9CQUxfTE9DQUxFIGxvY2FsZS4KK2NvbnN0IGNoYXIgKmFvc19zdHJlcnJvcihpbnQgZXJyb3IpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIEFPU19DT01NT05fTElCQ19BT1NfU1RSRVJST1JfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbGliYy9hb3Nfc3RyZXJyb3JfdGVzdC5jYyBiL2Fvcy9jb21tb24vbGliYy9hb3Nfc3RyZXJyb3JfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDU3NGZlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJlcnJvcl90ZXN0LmNjCkBAIC0wLDAgKzEsMjkgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xpYmMvYW9zX3N0cmVycm9yLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbGliYyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRyaWVzIGEgY291cGxlIG9mIGVhc3kgb25lcy4KK1RFU1QoU3RyZXJyb3JUZXN0LCBCYXNpYykgeworICBFWFBFQ1RfU1RSRVEoIkFyZ3VtZW50IGxpc3QgdG9vIGxvbmciLCBhb3Nfc3RyZXJyb3IoRTJCSUcpKTsKKyAgRVhQRUNUX1NUUkVRKCJCYWQgZmlsZSBkZXNjcmlwdG9yIiwgYW9zX3N0cmVycm9yKEVCQURGKSk7CisgIEVYUEVDVF9TVFJFUSgiVW5rbm93biBlcnJvciA0MDIxIiwgYW9zX3N0cmVycm9yKDQwMjEpKTsKK30KKworLy8gUnVucyB0aHJvdWdoIGFsbCBlcnJubyB2YWx1ZXMgYW5kIG1ha2VzIHN1cmUgaXQgZ2l2ZXMgdGhlIHNhbWUgcmVzdWx0IGFzCisvLyBzdHJlcnJvcigzKS4KK1RFU1QoU3RyZXJyb3JUZXN0LCBBbGwpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk1OyArK2kpIHsKKyAgICBTQ09QRURfVFJBQ0UoIml0ZXJhdGlvbiAiICsgOjpzdGQ6OnRvX3N0cmluZyhpKSk7CisgICAgRVhQRUNUX1NUUkVRKHN0cmVycm9yKGkpLCBhb3Nfc3RyZXJyb3IoaSkpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgbGliYworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJzaWduYWwuY2MgYi9hb3MvY29tbW9uL2xpYmMvYW9zX3N0cnNpZ25hbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzIxYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJzaWduYWwuY2MKQEAgLTAsMCArMSwyMiBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vbGliYy9hb3Nfc3Ryc2lnbmFsLmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKK2NvbnN0IGNoYXIgKmFvc19zdHJzaWduYWwoaW50IHNpZ25hbCkgeworICBzdGF0aWMgdGhyZWFkX2xvY2FsIGNoYXIgYnVmZmVyWzUxMl07CisKKyAgaWYgKHNpZ25hbCA+PSBTSUdSVE1JTiAmJiBzaWduYWwgPD0gU0lHUlRNQVgpIHsKKyAgICBDSEVDSyhzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiUmVhbC10aW1lIHNpZ25hbCAlZCIsCisgICAgICAgICAgICAgICAgICAgc2lnbmFsIC0gU0lHUlRNSU4pID4gMCk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIGlmIChzaWduYWwgPiAwICYmIHNpZ25hbCA8IE5TSUcgJiYgc3lzX3NpZ2xpc3Rbc2lnbmFsXSAhPSBudWxscHRyKSB7CisgICAgcmV0dXJuIHN5c19zaWdsaXN0W3NpZ25hbF07CisgIH0KKworICBDSEVDSyhzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiVW5rbm93biBzaWduYWwgJWQiLCBzaWduYWwpID4gMCk7CisgIHJldHVybiBidWZmZXI7Cit9CmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xpYmMvYW9zX3N0cnNpZ25hbC5oIGIvYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY3OTVjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJzaWduYWwuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIEFPU19DT01NT05fTElCQ19BT1NfU1RSU0lHTkFMX0hfCisjZGVmaW5lIEFPU19DT01NT05fTElCQ19BT1NfU1RSU0lHTkFMX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gVGhyZWFkLXNhZmUgdmVyc2lvbiBvZiBzdHJzaWduYWwoMykgKGV4Y2VwdCBpdCB3aWxsIG5ldmVyIHJldHVybiBOVUxMKS4KKy8vCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byBzdGF0aWMgZGF0YSBvciBhIHRocmVhZC1sb2NhbCBidWZmZXIuCitjb25zdCBjaGFyICphb3Nfc3Ryc2lnbmFsKGludCBzaWduYWwpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIEFPU19DT01NT05fTElCQ19BT1NfU1RSU0lHTkFMX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xpYmMvYW9zX3N0cnNpZ25hbF90ZXN0LmNjIGIvYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJzaWduYWxfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDkwYjIxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJzaWduYWxfdGVzdC5jYwpAQCAtMCwwICsxLDQ3IEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJzaWduYWwuaCIKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGxpYmMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUcmllcyBhIGNvdXBsZSBvZiBlYXN5IG9uZXMuCitURVNUKFN0cnNpZ25hbFRlc3QsIEJhc2ljKSB7CisgIEVYUEVDVF9TVFJFUSgiSGFuZ3VwIiwgYW9zX3N0cnNpZ25hbChTSUdIVVApKTsKKyAgRVhQRUNUX1NUUkVRKCJCcm9rZW4gcGlwZSIsIGFvc19zdHJzaWduYWwoU0lHUElQRSkpOworICBFWFBFQ1RfU1RSRVEoIlJlYWwtdGltZSBzaWduYWwgMiIsIGFvc19zdHJzaWduYWwoU0lHUlRNSU4gKyAyKSk7CisgIEVYUEVDVF9TVFJFUSgiVW5rbm93biBzaWduYWwgMTU1IiwgYW9zX3N0cnNpZ25hbCgxNTUpKTsKK30KKworY2xhc3MgU2lnbmFsTmFtZVRlc3RlciB7CisgcHVibGljOgorICB2b2lkIG9wZXJhdG9yKCkoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSUdSVE1BWCArIDU7ICsraSkgeworICAgICAgRVhQRUNUX1NUUkVRKHN0cnNpZ25hbChpKSwgYW9zX3N0cnNpZ25hbChpKSk7CisgICAgfQorICB9Cit9OworCisvLyBUZXN0cyB0aGF0IGFsbCB0aGUgc2lnbmFscyBnaXZlIHRoZSBzYW1lIHJlc3VsdCBhcyBzdHJzaWduYWwoMykuCitURVNUKFN0cnNpZ25hbFRlc3QsIEFsbCkgeworICAvLyBTaWdoLCBzdHJzaWduYWwgYWxsb2NhdGVzIGEgYnVmZmVyIHRoYXQgdXNlcyBwdGhyZWFkIGxvY2FsIHN0b3JhZ2UuICBUaGlzCisgIC8vIGludGVyYWN0cyBwb29ybHkgd2l0aCBhc2FuLiAgU3Bhd25pbmcgYSB0aHJlYWQgY2F1c2VzIHRoZSBzdG9yYWdlIHRvIGdldAorICAvLyBjbGVhbmVkIHVwIGJlZm9yZSBhc2FuIGNoZWNrcy4KKyAgU2lnbmFsTmFtZVRlc3RlciB0OworI2lmZGVmIEFPU19TQU5JVElaRVJfdGhyZWFkCisgIC8vIHRzYW4gZG9lc24ndCBsaWtlIHRoaXMgdXNhZ2Ugb2YgOjpzdGQ6OnRocmVhZC4gSXQgbG9va3MgbGlrZQorICAvLyA8aHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTc1MDc+LgorICB0KCk7CisjZWxzZQorICA6OnN0ZDo6dGhyZWFkIHRocmVhZCg6OnN0ZDo6cmVmKHQpKTsKKyAgdGhyZWFkLmpvaW4oKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGxpYmMKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbGliYy9kaXJuYW1lLmNjIGIvYW9zL2NvbW1vbi9saWJjL2Rpcm5hbWUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0Mzg5OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbGliYy9kaXJuYW1lLmNjCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xpYmMvZGlybmFtZS5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBsaWJjIHsKK25hbWVzcGFjZSB7CisKKzo6c3RkOjpzdHJpbmcgRG9EaXJuYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcgJnBhdGgsIHNpemVfdCBsYXN0X3NsYXNoKSB7CisgIC8vIElmIHRoZXJlIGFyZW4ndCBhbnkgb3RoZXIgJy8ncyBpbiBpdC4KKyAgaWYgKGxhc3Rfc2xhc2ggPT0gOjpzdGQ6OnN0cmluZzo6bnBvcykgcmV0dXJuICIuIjsKKworICAvLyBCYWNrIHVwIGFzIGxvbmcgYXMgd2Ugc2VlICcvJ3MuCisgIGRvIHsKKyAgICAvLyBJZiB3ZSBnZXQgYWxsIHRoZSB3YXkgdG8gdGhlIGJlZ2lubmluZy4KKyAgICBpZiAobGFzdF9zbGFzaCA9PSAwKSByZXR1cm4gIi8iOworICAgIC0tbGFzdF9zbGFzaDsKKyAgfSB3aGlsZSAocGF0aFtsYXN0X3NsYXNoXSA9PSAnLycpOworCisgIHJldHVybiBwYXRoLnN1YnN0cigwLCBsYXN0X3NsYXNoICsgMSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCis6OnN0ZDo6c3RyaW5nIERpcm5hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyAmcGF0aCkgeworICAvLyBXaXRob3V0IHRoaXMsIHdlIGVuZCB1cCB3aXRoIGludGVnZXIgdW5kZXJmbG93cyBiZWxvdywgd2hpY2ggaXMgdGVjaG5pY2FsbHkKKyAgLy8gdW5kZWZpbmVkLgorICBpZiAocGF0aC5zaXplKCkgPT0gMCkgcmV0dXJuICIuIjsKKworICBzaXplX3QgbGFzdF9zbGFzaCA9IHBhdGgucmZpbmQoJy8nKTsKKworICAvLyBJZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnLycuCisgIGlmIChsYXN0X3NsYXNoID09IHBhdGguc2l6ZSgpIC0gMSkgeworICAgIGxhc3Rfc2xhc2ggPSBEb0Rpcm5hbWUocGF0aCwgbGFzdF9zbGFzaCkucmZpbmQoJy8nKTsKKyAgfQorCisgIHJldHVybiBEb0Rpcm5hbWUocGF0aCwgbGFzdF9zbGFzaCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsaWJjCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xpYmMvZGlybmFtZS5oIGIvYW9zL2NvbW1vbi9saWJjL2Rpcm5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDVmOGYxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9saWJjL2Rpcm5hbWUuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIEFPU19DT01NT05fTElCQ19ESVJOQU1FX0hfCisjZGVmaW5lIEFPU19DT01NT05fTElCQ19ESVJOQU1FX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGxpYmMgeworCisvLyBUaHJlYWQtc2FmZSB2ZXJzaW9uIG9mIGRpcm5hbWUoMykuCis6OnN0ZDo6c3RyaW5nIERpcm5hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyAmcGF0aCk7CisKK30gIC8vIG5hbWVzcGFjZSBsaWJjCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9MSUJDX0RJUk5BTUVfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbGliYy9kaXJuYW1lX3Rlc3QuY2MgYi9hb3MvY29tbW9uL2xpYmMvZGlybmFtZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDc5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2xpYmMvZGlybmFtZV90ZXN0LmNjCkBAIC0wLDAgKzEsNzkgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xpYmMvZGlybmFtZS5oIgorCisjaW5jbHVkZSA8bGliZ2VuLmg+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBsaWJjIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGVzdHMgdGhlIGV4YW1wbGVzIGZyb20gdGhlIExpbnV4IG1hbi1wYWdlcyByZWxlYXNlIDMuNDQgZGlybmFtZSgzKS4KK1RFU1QoRGlybmFtZVRlc3QsIE1hblBhZ2VFeGFtcGxlcykgeworICBFWFBFQ1RfRVEoIi91c3IiLCBEaXJuYW1lKCIvdXNyL2xpYiIpKTsKKyAgRVhQRUNUX0VRKCIvIiwgRGlybmFtZSgiL3Vzci8iKSk7CisgIEVYUEVDVF9FUSgiLiIsIERpcm5hbWUoInVzciIpKTsKKyAgRVhQRUNUX0VRKCIvIiwgRGlybmFtZSgiLyIpKTsKKyAgRVhQRUNUX0VRKCIuIiwgRGlybmFtZSgiLiIpKTsKKyAgRVhQRUNUX0VRKCIuIiwgRGlybmFtZSgiLi4iKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgaXQgaGFuZGxlcyBtdWx0aXBsZSAnLydzIGluIGEgcm93IGNvcnJlY3RseS4KK1RFU1QoRGlybmFtZVRlc3QsIE11bHRpcGxlU2xhc2hlcykgeworICBFWFBFQ1RfRVEoIi8vdXNyIiwgRGlybmFtZSgiLy91c3IvL2xpYiIpKTsKKyAgRVhQRUNUX0VRKCIvL3Vzci9saWIiLCBEaXJuYW1lKCIvL3Vzci9saWIvL2JsYSIpKTsKKyAgRVhQRUNUX0VRKCIvIiwgRGlybmFtZSgiLy91c3IvLyIpKTsKKyAgRVhQRUNUX0VRKCIuIiwgRGlybmFtZSgidXNyLy8iKSk7CisgIEVYUEVDVF9FUSgiLyIsIERpcm5hbWUoIi8vIikpOworICBFWFBFQ1RfRVEoIi4iLCBEaXJuYW1lKCIuLy8iKSk7CisgIEVYUEVDVF9FUSgiLiIsIERpcm5hbWUoIi4uLy8iKSk7Cit9CisKK1RFU1QoRGlybmFtZVRlc3QsIFdlaXJkSW5wdXRzKSB7CisgIEVYUEVDVF9FUSgiLiIsIERpcm5hbWUoIiIpKTsKKyAgRVhQRUNUX0VRKCIuIiwgRGlybmFtZSgiLi4uIikpOworfQorCisvLyBSdW5zIHRocm91Z2ggYSBidW5jaCBvZiByYW5kb21seSBjb25zdHJ1Y3RlZCBwYXRobmFtZXMgYW5kIG1ha2VzIHN1cmUgaXQKKy8vIGdpdmVzIHRoZSBzYW1lIHJlc3VsdCBhcyBkaXJuYW1lKDMpLgorVEVTVChEaXJuYW1lVGVzdCwgUmFuZG9tKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGtUZXN0Qnl0ZXNbXSA9ICJhMC8vLi4gIjsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ5dGVzU2l6ZSA9IHNpemVvZihrVGVzdEJ5dGVzKSAtIDE7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RQYXRoU2l6ZSA9IDY7CisKKyAgOjpzdGQ6OnN0cmluZyB0ZXN0X3N0cmluZyhrVGVzdFBhdGhTaXplLCAnXDAnKTsKKyAgY2hhciB0ZXN0X3BhdGhba1Rlc3RQYXRoU2l6ZSArIDFdOworICBmb3IgKHNpemVfdCBpMCA9IDA7IGkwIDwga1Rlc3RCeXRlc1NpemU7ICsraTApIHsKKyAgICB0ZXN0X3N0cmluZ1swXSA9IGtUZXN0Qnl0ZXNbaTBdOworICAgIGZvciAoc2l6ZV90IGkxID0gMDsgaTEgPCBrVGVzdEJ5dGVzU2l6ZTsgKytpMSkgeworICAgICAgLy8gZGlybmFtZSgzKSByZXR1cm5zICIvLyIgaW4gdGhpcyBjYXNlIHdoaWNoIGlzIHdlaXJkIGFuZCBvdXIgRGlybmFtZQorICAgICAgLy8gZG9lc24ndC4KKyAgICAgIGlmICh0ZXN0X3N0cmluZ1swXSA9PSAnLycgJiYga1Rlc3RCeXRlc1tpMV0gPT0gJy8nKSBjb250aW51ZTsKKworICAgICAgdGVzdF9zdHJpbmdbMV0gPSBrVGVzdEJ5dGVzW2kxXTsKKyAgICAgIGZvciAoc2l6ZV90IGkyID0gMDsgaTIgPCBrVGVzdEJ5dGVzU2l6ZTsgKytpMikgeworICAgICAgICB0ZXN0X3N0cmluZ1syXSA9IGtUZXN0Qnl0ZXNbaTJdOworICAgICAgICBmb3IgKHNpemVfdCBpMyA9IDA7IGkzIDwga1Rlc3RCeXRlc1NpemU7ICsraTMpIHsKKyAgICAgICAgICB0ZXN0X3N0cmluZ1szXSA9IGtUZXN0Qnl0ZXNbaTNdOworICAgICAgICAgIGZvciAoc2l6ZV90IGk0ID0gMDsgaTQgPCBrVGVzdEJ5dGVzU2l6ZTsgKytpNCkgeworICAgICAgICAgICAgdGVzdF9zdHJpbmdbNF0gPSBrVGVzdEJ5dGVzW2k0XTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGk1ID0gMDsgaTUgPCBrVGVzdEJ5dGVzU2l6ZTsgKytpNSkgeworICAgICAgICAgICAgICB0ZXN0X3N0cmluZ1s1XSA9IGtUZXN0Qnl0ZXNbaTVdOworCisgICAgICAgICAgICAgIG1lbWNweSh0ZXN0X3BhdGgsIHRlc3Rfc3RyaW5nLmNfc3RyKCksIGtUZXN0UGF0aFNpemUpOworICAgICAgICAgICAgICB0ZXN0X3BhdGhba1Rlc3RQYXRoU2l6ZV0gPSAnXDAnOworCisgICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSgicGF0aCBpcyAnIiArIHRlc3Rfc3RyaW5nICsgIiciKTsKKyAgICAgICAgICAgICAgRVhQRUNUX0VRKDo6c3RkOjpzdHJpbmcoZGlybmFtZSh0ZXN0X3BhdGgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERpcm5hbWUodGVzdF9zdHJpbmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBsaWJjCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xpYmMvbGliYy5neXAgYi9hb3MvY29tbW9uL2xpYmMvbGliYy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmYzM1NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbGliYy9saWJjLmd5cApAQCAtMCwwICsxLDYyIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdhb3Nfc3Ryc2lnbmFsJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnYW9zX3N0cnNpZ25hbC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmdfaW50ZXJmYWNlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYW9zX3N0cnNpZ25hbF90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhb3Nfc3Ryc2lnbmFsX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdhb3Nfc3Ryc2lnbmFsJywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZGlybmFtZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2Rpcm5hbWUuY2MnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkaXJuYW1lX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2Rpcm5hbWVfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2Rpcm5hbWUnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYW9zX3N0cmVycm9yJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnYW9zX3N0cmVycm9yLmNjJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYW9zX3N0cmVycm9yX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2Fvc19zdHJlcnJvcl90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnYW9zX3N0cmVycm9yJywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXAgYi9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkNThiNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cApAQCAtMCwwICsxLDUwIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsb2dnaW5nX2ltcGxfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnbG9nZ2luZ19pbXBsX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3F1ZXVlX2xvZ2dpbmcnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdxdWV1ZV9sb2dnaW5nLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6ZGllJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90eXBlcycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpkaWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdtYXRyaXhfbG9nZ2luZycsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ21hdHJpeF9sb2dnaW5nLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6ZGllJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90eXBlcycsCisgICAgICAgICc8KEVYVEVSTkFMUyk6ZWlnZW4nLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6ZGllJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90eXBlcycsCisgICAgICAgICc8KEVYVEVSTkFMUyk6ZWlnZW4nLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCBiL2Fvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiODhjNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgKQEAgLTAsMCArMSwyNjEgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9MT0dHSU5HX0xPR0dJTkdfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9MT0dHSU5HX0xPR0dJTkdfSF8KKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsb2dnaW5nIGNsaWVudCBpbnRlcmZhY2UuIEl0IHdvcmtzIHdpdGggYm90aCBDIGFuZCBDKysKKy8vIGNvZGUuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL21hY3Jvcy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbGliYy9hb3Nfc3RyZXJyb3IuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQ4X3QgbG9nX2xldmVsOworCisjZGVmaW5lIERFQ0xfTEVWRUxTIFwKK0RFQ0xfTEVWRUwoREVCVUcsIDApOyAvKiBzdHVmZiB0aGF0IGdldHMgcHJpbnRlZCBvdXQgZXZlcnkgY3ljbGUgKi8gXAorREVDTF9MRVZFTChJTkZPLCAxKTsgLyogdGhpbmdzIGxpa2UgUG9zRWRnZS9OZWdFZGdlICovIFwKKy8qIHRoaW5ncyB0aGF0IG1pZ2h0IHN0aWxsIHdvcmsgaWYgdGhleSBoYXBwZW4gb2NjYXNpb25hbGx5ICovIFwKK0RFQ0xfTEVWRUwoV0FSTklORywgMik7IFwKKy8qLTEgc28gdGhhdCB2eHdvcmtzIG1hY3JvIG9mIHNhbWUgbmFtZSB3aWxsIGhhdmUgc2FtZSBlZmZlY3QgaWYgdXNlZCovIFwKK0RFQ0xfTEVWRUwoRVJST1IsIC0xKTsgLyogZXJyb3JzICovIFwKKy8qIHNlcmlvdXMgZXJyb3JzLiB0aGUgbG9nZ2luZyBjb2RlIHdpbGwgdGVybWluYXRlIHRoZSBwcm9jZXNzL3Rhc2sgKi8gXAorREVDTF9MRVZFTChGQVRBTCwgNCk7IFwKK0RFQ0xfTEVWRUwoTE9HX1VOS05PV04sIDUpOyAvKiB1bmtub3duIGxvZ2dpbmcgbGV2ZWwgKi8KKyNkZWZpbmUgREVDTF9MRVZFTChuYW1lLCB2YWx1ZSkgc3RhdGljIGNvbnN0IGxvZ19sZXZlbCBuYW1lID0gdmFsdWU7CitERUNMX0xFVkVMUzsKKyN1bmRlZiBERUNMX0xFVkVMCisKKy8vIE5vdCBzdGF0aWMgY29uc3Qgc2l6ZV90IGZvciBDIGNvZGUuCisjZGVmaW5lIExPR19NRVNTQUdFX0xFTiA0MDAKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBBY3R1YWxseSBpbXBsZW1lbnRzIHRoZSBiYXNpYyBsb2dnaW5nIGNhbGwuCisvLyBEb2VzIG5vdCBjaGVjayB0aGF0IGxldmVsIGlzIHZhbGlkLgordm9pZCBsb2dfZG8obG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KEdPT0RfUFJJTlRGX0ZPUk1BVF9UWVBFLCAyLCAzKSkpOworCit2b2lkIGxvZ19jb3JrKGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisgIF9fYXR0cmlidXRlX18oKGZvcm1hdChHT09EX1BSSU5URl9GT1JNQVRfVFlQRSwgMywgNCkpKTsKKy8vIEltcGxlbWVudHMgdGhlIHVuY29yayBsb2dnaW5nIGNhbGwuCit2b2lkIGxvZ191bmNvcmsoaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBsb2dfbGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisgIF9fYXR0cmlidXRlX18oKGZvcm1hdChHT09EX1BSSU5URl9GT1JNQVRfVFlQRSwgNSwgNikpKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLy8gQSBtYWdpY2FsIHN0YXRpYyBjb25zdCBjaGFyW10gb3Igc3RyaW5nIGxpdGVyYWwgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIG5hbWUKKy8vIG9mIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24uCisvLyBJdCdzIGN1cnJlbnRseSB1c2luZyBfX1BSRVRUWV9GVU5DVElPTl9fIGJlY2F1c2UgYm90aCBHQ0MgYW5kIENsYW5nIHN1cHBvcnQKKy8vIHRoYXQgYW5kIGl0IGdpdmVzIG5pY2VyIHJlc3VsdHMgaW4gQysrIHRoYW4gdGhlIHN0YW5kYXJkIF9fZnVuY19fICh3aGljaAorLy8gd291bGQgYWxzbyB3b3JrKS4KKy8vI2RlZmluZSBMT0dfQ1VSUkVOVF9GVU5DVElPTiBfX1BSRVRUWV9GVU5DVElPTl9fCisjZGVmaW5lIExPR19DVVJSRU5UX0ZVTkNUSU9OIF9fZnVuY19fCisKKyNkZWZpbmUgTE9HX1NPVVJDRU5BTUUgX19GSUxFX18KKworLy8gVGhlIGJhc2ljIGxvZ2dpbmcgY2FsbC4KKyNkZWZpbmUgTE9HKGxldmVsLCBmb3JtYXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2dfZG8obGV2ZWwsIExPR19TT1VSQ0VOQU1FICI6ICIgU1RSSU5HSUZZKF9fTElORV9fKSAiOiAlczogIiBmb3JtYXQsIFwKKyAgICAgICAgICAgTE9HX0NVUlJFTlRfRlVOQ1RJT04sICMjYXJncyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBzbyB0aGF0IEdDQyBrbm93cyB0aGF0IGl0IHdvbid0IHJldHVybiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGV2ZWwgPT0gRkFUQUwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAibG9nX2RvKEZBVEFMKSBmZWxsIHRocm91Z2ghISEhIVxuIik7ICAgICAgICAgICAgICAgIFwKKyAgICAgIHByaW50Zigic2VlIHN0ZGVyclxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLy8gU2FtZSBhcyBMT0cgZXhjZXB0IGFwcGVuZHMgIiBkdWUgdG8gJWQgKCVzKVxuIiAoZm9ybWF0dGVkIHdpdGggZXJybm8gYW5kCisvLyBhb3Nfc3RyZXJyb3IoZXJybm8pKSB0byB0aGUgbWVzc2FnZS4KKyNkZWZpbmUgUExPRyhsZXZlbCwgZm9ybWF0LCBhcmdzLi4uKSBQRUxPRyhsZXZlbCwgZXJybm8sIGZvcm1hdCwgIyNhcmdzKQorCisvLyBMaWtlIFBMT0cgZXhjZXB0IGFsbG93cyBzcGVjaWZ5aW5nIGFuIGVycm9yIG90aGVyIHRoYW4gZXJybm8uCisjZGVmaW5lIFBFTE9HKGxldmVsLCBlcnJvcl9pbiwgZm9ybWF0LCBhcmdzLi4uKSAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgZXJyb3IgPSBlcnJvcl9pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9HKGxldmVsLCBmb3JtYXQgIiBkdWUgdG8gJWQgKCVzKVxuIiwgIyNhcmdzLCBlcnJvciwgXAorICAgICAgICBhb3Nfc3RyZXJyb3IoZXJyb3IpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCk7CisKKy8vIEFsbG93cyBmb3JtYXQgdG8gbm90IGJlIGEgc3RyaW5nIGNvbnN0YW50LgorI2RlZmluZSBMT0dfRFlOQU1JQyhsZXZlbCwgZm9ybWF0LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjaGFyIGxvZ19idWZbTE9HX01FU1NBR0VfTEVOXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCByZXQgPSBzbnByaW50Zihsb2dfYnVmLCBzaXplb2YobG9nX2J1ZiksIGZvcm1hdCwgIyNhcmdzKTsgICAgICAgXAorICAgIGlmIChyZXQgPCAwIHx8ICh1aW50bWF4X3QpcmV0ID49IExPR19NRVNTQUdFX0xFTikgeyAgICAgICAgICAgICAgICAgXAorICAgICAgTE9HKEVSUk9SLCAibmV4dCBtZXNzYWdlIHdhcyB0b28gbG9uZyBzbyBub3Qgc3ViYmluZyBpbiBhcmdzXG4iKTsgXAorICAgICAgTE9HKGxldmVsLCAiJXMiLCBmb3JtYXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTE9HKGxldmVsLCAiJXMiLCBsb2dfYnVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvLyBBbGxvd3MgImJvdHRsaW5nIHVwIiBtdWx0aXBsZSBsb2cgZnJhZ21lbnRzIHdoaWNoIGNhbiB0aGVuIGFsbCBiZSBsb2dnZWQgaW4KKy8vIG9uZSBtZXNzYWdlIHdpdGggTE9HX1VOQ09SSy4KKy8vIENhbGxzIGZyb20gYSBnaXZlbiB0aHJlYWQvdGFzayB3aWxsIGJlIGdyb3VwZWQgdG9nZXRoZXIuCisjZGVmaW5lIExPR19DT1JLKGZvcm1hdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvZ19jb3JrKF9fTElORV9fLCBMT0dfQ1VSUkVOVF9GVU5DVElPTiwgZm9ybWF0LCAjI2FyZ3MpOyBcCisgIH0gd2hpbGUgKDApCisvLyBBY3R1YWxseSBsb2dzIGFsbCBvZiB0aGUgc2F2ZWQgdXAgbG9nIGZyYWdtZW50cyAoaW5jbHVkaW5nIGZvcm1hdCBhbmQgYXJncyBvbgorLy8gdGhlIGVuZCkuCisjZGVmaW5lIExPR19VTkNPUksobGV2ZWwsIGZvcm1hdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9nX3VuY29yayhfX0xJTkVfXywgTE9HX0NVUlJFTlRfRlVOQ1RJT04sIGxldmVsLCBMT0dfU09VUkNFTkFNRSwgZm9ybWF0LCBcCisgICAgICAgICAgICAgICAjI2FyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCituYW1lc3BhY2UgYW9zIHsKKworLy8gQ0hFQ0sqIG1hY3Jvcywgc2ltaWxhciB0byBnbG9nCisvLyAoPGh0dHA6Ly9nb29nbGUtZ2xvZy5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvZG9jL2dsb2cuaHRtbD4pJ3MsIGV4Y2VwdCB0aGV5CisvLyBkb24ndCBzdXBwb3J0IHN0cmVhbWluZyBpbiBleHRyYSB0ZXh0LiBTb21lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBib3Jyb3dlZAorLy8gZnJvbSB0aGVyZSB0b28uCisvLyBUaGV5IGFsbCBMT0coRkFUQUwpIHdpdGggYSBoZWxwZnVsIG1lc3NhZ2Ugd2hlbiB0aGUgY2hlY2sgZmFpbHMuCisvLyBQb3J0aW9ucyBjb3B5cmlnaHQgKGMpIDE5OTksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBDSEVDSyBkaWVzIHdpdGggYSBmYXRhbCBlcnJvciBpZiBjb25kaXRpb24gaXMgbm90IHRydWUuICBJdCBpcyAqbm90KgorLy8gY29udHJvbGxlZCBieSBOREVCVUcsIHNvIHRoZSBjaGVjayB3aWxsIGJlIGV4ZWN1dGVkIHJlZ2FyZGxlc3Mgb2YKKy8vIGNvbXBpbGF0aW9uIG1vZGUuICBUaGVyZWZvcmUsIGl0IGlzIHNhZmUgdG8gZG8gdGhpbmdzIGxpa2U6CisvLyAgICBDSEVDSyhmcC0+V3JpdGUoeCkgPT0gNCkKKyNkZWZpbmUgQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoX19idWlsdGluX2V4cGVjdCghKGNvbmRpdGlvbiksIDApKSB7ICAgICAgICBcCisgICAgTE9HKEZBVEFMLCAiQ0hFQ0soJXMpIGZhaWxlZFxuIiwgI2NvbmRpdGlvbik7IFwKKyAgfQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBDSEVDS19PUCBtYWNyby4KKy8vIFRoZSAoaW50LCBpbnQpIHNwZWNpYWxpemF0aW9uIHdvcmtzIGFyb3VuZCB0aGUgaXNzdWUgdGhhdCB0aGUgY29tcGlsZXIKKy8vIHdpbGwgbm90IGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBvbiB2YWx1ZXMgb2YKKy8vIHVubmFtZWQgZW51bSB0eXBlLgorI2RlZmluZSBERUZJTkVfQ0hFQ0tfT1BfSU1QTChuYW1lLCBvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHZvaWQgTG9nSW1wbCMjbmFtZShjb25zdCBUMSAmdjEsIGNvbnN0IFQyICZ2MiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4cHJ0ZXh0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFfX2J1aWx0aW5fZXhwZWN0KHYxIG9wIHYyLCAxKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGxvZ19kbyhGQVRBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIExPR19TT1VSQ0VOQU1FICI6ICIgU1RSSU5HSUZZKF9fTElORV9fKSAiOiBDSEVDSyglcykgZmFpbGVkXG4iLCBcCisgICAgICAgICAgICAgZXhwcnRleHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAibG9nX2RvKEZBVEFMKSBmZWxsIHRocm91Z2ghISEhIVxuIik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJpbnRmKCJzZWUgc3RkZXJyXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhYm9ydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB2b2lkIExvZ0ltcGwjI25hbWUoaW50IHYxLCBpbnQgdjIsIGNvbnN0IGNoYXIgKmV4cHJ0ZXh0KSB7ICAgICAgICAgIFwKKyAgICA6OmFvczo6TG9nSW1wbCMjbmFtZTxpbnQsIGludD4odjEsIHYyLCBleHBydGV4dCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIFdlIHVzZSB0aGUgZnVsbCBuYW1lIENoZWNrX0VRLCBDaGVja19ORSwgZXRjLiBpbiBjYXNlIHRoZSBmaWxlIGluY2x1ZGluZworLy8gYmFzZS9sb2dnaW5nLmggcHJvdmlkZXMgaXRzIG93biAjZGVmaW5lcyBmb3IgdGhlIHNpbXBsZXIgbmFtZXMgRVEsIE5FLCBldGMuCisvLyBUaGlzIGhhcHBlbnMgaWYsIGZvciBleGFtcGxlLCB0aG9zZSBhcmUgdXNlZCBhcyB0b2tlbiBuYW1lcyBpbiBhCisvLyB5YWNjIGdyYW1tYXIuCitERUZJTkVfQ0hFQ0tfT1BfSU1QTChDaGVja19FUSwgPT0pICAvLyBDb21waWxhdGlvbiBlcnJvciB3aXRoIENIRUNLX0VRKE5VTEwsIHgpPworREVGSU5FX0NIRUNLX09QX0lNUEwoQ2hlY2tfTkUsICE9KSAgLy8gVXNlIENIRUNLKHggPT0gTlVMTCkgaW5zdGVhZC4KK0RFRklORV9DSEVDS19PUF9JTVBMKENoZWNrX0xFLCA8PSkKK0RFRklORV9DSEVDS19PUF9JTVBMKENoZWNrX0xULCA8ICkKK0RFRklORV9DSEVDS19PUF9JTVBMKENoZWNrX0dFLCA+PSkKK0RFRklORV9DSEVDS19PUF9JTVBMKENoZWNrX0dULCA+ICkKKworI2RlZmluZSBDSEVDS19PUChuYW1lLCBvcCwgdmFsMSwgdmFsMikgIFwKKyAgOjphb3M6OkxvZ0ltcGxDaGVjayMjbmFtZSh2YWwxLCB2YWwyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSSU5HSUZZKHZhbDEpIFNUUklOR0lGWShvcCkgU1RSSU5HSUZZKHZhbDIpKQorCisjZGVmaW5lIENIRUNLX0VRKHZhbDEsIHZhbDIpIENIRUNLX09QKF9FUSwgPT0sIHZhbDEsIHZhbDIpCisjZGVmaW5lIENIRUNLX05FKHZhbDEsIHZhbDIpIENIRUNLX09QKF9ORSwgIT0sIHZhbDEsIHZhbDIpCisjZGVmaW5lIENIRUNLX0xFKHZhbDEsIHZhbDIpIENIRUNLX09QKF9MRSwgPD0sIHZhbDEsIHZhbDIpCisjZGVmaW5lIENIRUNLX0xUKHZhbDEsIHZhbDIpIENIRUNLX09QKF9MVCwgPCAsIHZhbDEsIHZhbDIpCisjZGVmaW5lIENIRUNLX0dFKHZhbDEsIHZhbDIpIENIRUNLX09QKF9HRSwgPj0sIHZhbDEsIHZhbDIpCisjZGVmaW5lIENIRUNLX0dUKHZhbDEsIHZhbDIpIENIRUNLX09QKF9HVCwgPiAsIHZhbDEsIHZhbDIpCisKKy8vIEEgc21hbGwgaGVscGVyIGZvciBDSEVDS19OT1ROVUxMKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBUKiBDaGVja05vdE51bGwoY29uc3QgY2hhciAqdmFsdWVfbmFtZSwgVCAqdCkgeworICBpZiAodCA9PSBOVUxMKSB7CisgICAgTE9HKEZBVEFMLCAiJyVzJyBtdXN0IG5vdCBiZSBOVUxMXG4iLCB2YWx1ZV9uYW1lKTsKKyAgfQorICByZXR1cm4gdDsKK30KKworLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgaXMgbm9uIE5VTEwuICBUaGlzIHZlcnkgdXNlZnVsIGluIGNvbnN0cnVjdG9yCisvLyBpbml0aWFsaXplciBsaXN0cy4KKyNkZWZpbmUgQ0hFQ0tfTk9UTlVMTCh2YWwpIDo6YW9zOjpDaGVja05vdE51bGwoU1RSSU5HSUZZKHZhbCksIHZhbCkKKworaW5saW5lIGludCBDaGVja1N5c2NhbGwoY29uc3QgY2hhciAqc3lzY2FsbF9zdHJpbmcsIGludCB2YWx1ZSkgeworICBpZiAoX19idWlsdGluX2V4cGVjdCh2YWx1ZSA9PSAtMSwgZmFsc2UpKSB7CisgICAgUExPRyhGQVRBTCwgIiVzIGZhaWxlZCIsIHN5c2NhbGxfc3RyaW5nKTsKKyAgfQorICByZXR1cm4gdmFsdWU7Cit9CisKK2lubGluZSB2b2lkIENoZWNrU3lzY2FsbFJldHVybihjb25zdCBjaGFyICpzeXNjYWxsX3N0cmluZywgaW50IHZhbHVlKSB7CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0KHZhbHVlICE9IDAsIGZhbHNlKSkgeworICAgIFBFTE9HKEZBVEFMLCB2YWx1ZSwgIiVzIGZhaWxlZCIsIHN5c2NhbGxfc3RyaW5nKTsKKyAgfQorfQorCisvLyBDaGVjayB0aGF0IHN5c2NhbGwgZG9lcyBub3QgcmV0dXJuIC0xLiBJZiBpdCBkb2VzLCBQTE9HKEZBVEFMKXMuIFRoaXMgaXMKKy8vIHVzZWZ1bCBmb3IgcXVpY2tseSBjaGVja2luZyBzeXNjYWxscyB3aGVyZSBpdCdzIG5vdCB2ZXJ5IHVzZWZ1bCB0byBwcmludCBvdXQKKy8vIHRoZSB2YWx1ZXMgb2YgYW55IG9mIHRoZSBhcmd1bWVudHMuIFJldHVybnMgdGhlIHJlc3VsdCBvdGhlcndpc2UuCisvLworLy8gRXhhbXBsZTogY29uc3QgaW50IGZkID0gUENIRUNLKG9wZW4oIi90bXAvd2hhdGV2ZXIiLCBPX1dST05MWSkpCisjZGVmaW5lIFBDSEVDSyhzeXNjYWxsKSA6OmFvczo6Q2hlY2tTeXNjYWxsKFNUUklOR0lGWShzeXNjYWxsKSwgc3lzY2FsbCkKKworLy8gUEVMT0coRkFUQUwpcyB3aXRoIHRoZSByZXN1bHQgb2Ygc3lzY2FsbCBpZiBpdCByZXR1cm5zIGFueXRoaW5nIG90aGVyIHRoYW4gMC4KKy8vIFRoaXMgaXMgdXNlZnVsIGZvciBxdWlja2x5IGNoZWNraW5nIHRoaW5ncyBsaWtlIG1hbnkgb2YgdGhlIHB0aHJlYWRzCisvLyBmdW5jdGlvbnMgd2hlcmUgaXQncyBub3QgdmVyeSB1c2VmdWwgdG8gcHJpbnQgb3V0IHRoZSB2YWx1ZXMgb2YgYW55IG9mIHRoZQorLy8gYXJndW1lbnRzLgorLy8KKy8vIEV4YW1wbGU6IFBSQ0hFQ0sobXVubWFwKGFkZHJlc3MsIGxlbmd0aCkpCisjZGVmaW5lIFBSQ0hFQ0soc3lzY2FsbCkgOjphb3M6OkNoZWNrU3lzY2FsbFJldHVybihTVFJJTkdJRlkoc3lzY2FsbCksIHN5c2NhbGwpCisKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nX2ltcGwuY2MgYi9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NzY5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmNjCkBAIC0wLDAgKzEsMzMwIEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgImFvcy9jb21tb24vb25jZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWVfdHlwZXMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19wcmludGZfZm9ybWF0cy5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBsb2dnaW5nIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIGludGVybmFsOjpDb250ZXh0OwordXNpbmcgaW50ZXJuYWw6Omdsb2JhbF90b3BfaW1wbGVtZW50YXRpb247CisKKy8vIFRoZSByb290IExvZ0ltcGxlbWVudGF0aW9uLiBJdCBvbmx5IGxvZ3MgdG8gc3RkZXJyL3N0ZG91dC4KKy8vIFNvbWUgb2YgdGhlIHRoaW5ncyBzcGVjaWZpZWQgaW4gdGhlIExvZ0ltcGxlbWVudGF0aW9uIGRvY3VtZW50YXRpb24gZG9lc24ndAorLy8gYXBwbHkgaGVyZSAobW9zdGx5IHRoZSBwYXJ0cyBhYm91dCBiZWluZyBhYmxlIHRvIHVzZSBMT0cpIGJlY2F1c2UgdGhpcyBpcyB0aGUKKy8vIHJvb3Qgb25lLgorY2xhc3MgUm9vdExvZ0ltcGxlbWVudGF0aW9uIDogcHVibGljIExvZ0ltcGxlbWVudGF0aW9uIHsKKyBwdWJsaWM6CisgIHZvaWQgaGF2ZV9vdGhlcl9pbXBsZW1lbnRhdGlvbigpIHsgb25seV9pbXBsZW1lbnRhdGlvbl8gPSBmYWxzZTsgfQorCisgcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIHNldF9uZXh0KExvZ0ltcGxlbWVudGF0aW9uICopIHsKKyAgICBMT0coRkFUQUwsICJjYW4ndCBoYXZlIGEgbmV4dCBsb2dnZXIgZnJvbSBoZXJlXG4iKTsKKyAgfQorCisgIF9fYXR0cmlidXRlX18oKGZvcm1hdChHT09EX1BSSU5URl9GT1JNQVRfVFlQRSwgMywgMCkpKQorICB2aXJ0dWFsIHZvaWQgRG9Mb2cobG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApIHsKKyAgICBMb2dNZXNzYWdlIG1lc3NhZ2U7CisgICAgaW50ZXJuYWw6OkZpbGxJbk1lc3NhZ2UobGV2ZWwsIGZvcm1hdCwgYXAsICZtZXNzYWdlKTsKKyAgICBpbnRlcm5hbDo6UHJpbnRNZXNzYWdlKHN0ZGVyciwgbWVzc2FnZSk7CisgICAgaWYgKCFvbmx5X2ltcGxlbWVudGF0aW9uXykgeworICAgICAgZnB1dHMoInJvb3QgbG9nZ2VyIGdvdCB1c2VkLCBzZWUgc3RkZXJyIGZvciBtZXNzYWdlXG4iLCBzdGRvdXQpOworICAgIH0KKyAgfQorCisgIGJvb2wgb25seV9pbXBsZW1lbnRhdGlvbl8gPSB0cnVlOworfTsKKworUm9vdExvZ0ltcGxlbWVudGF0aW9uICpyb290X2ltcGxlbWVudGF0aW9uID0gbnVsbHB0cjsKKwordm9pZCBTZXRHbG9iYWxJbXBsZW1lbnRhdGlvbihMb2dJbXBsZW1lbnRhdGlvbiAqaW1wbGVtZW50YXRpb24pIHsKKyAgaWYgKHJvb3RfaW1wbGVtZW50YXRpb24gPT0gbnVsbHB0cikgeworICAgIGZwdXRzKCJTb21lYm9keSBkaWRuJ3QgY2FsbCBsb2dnaW5nOjpJbml0KCkhXG4iLCBzdGRlcnIpOworICAgIGFib3J0KCk7CisgIH0KKworICBDb250ZXh0ICpjb250ZXh0ID0gQ29udGV4dDo6R2V0KCk7CisKKyAgY29udGV4dC0+aW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbjsKKyAgZ2xvYmFsX3RvcF9pbXBsZW1lbnRhdGlvbi5zdG9yZShpbXBsZW1lbnRhdGlvbik7Cit9CisKK3ZvaWQgTmV3Q29udGV4dCgpIHsKKyAgQ29udGV4dDo6RGVsZXRlKCk7Cit9CisKK3ZvaWQgKkRvSW5pdCgpIHsKKyAgU2V0R2xvYmFsSW1wbGVtZW50YXRpb24ocm9vdF9pbXBsZW1lbnRhdGlvbiA9IG5ldyBSb290TG9nSW1wbGVtZW50YXRpb24oKSk7CisKKyAgaWYgKHB0aHJlYWRfYXRmb3JrKE5VTEwgLypwcmVwYXJlKi8sIE5VTEwgLypwYXJlbnQqLywKKyAgICAgICAgICAgICAgICAgICAgIE5ld0NvbnRleHQgLypjaGlsZCovKSAhPSAwKSB7CisgICAgTE9HKEZBVEFMLCAicHRocmVhZF9hdGZvcmsoTlVMTCwgTlVMTCwgJXApIGZhaWxlZFxuIiwKKyAgICAgICAgTmV3Q29udGV4dCk7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlCituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKwordm9pZCBGaWxsSW5NZXNzYWdlQmFzZShsb2dfbGV2ZWwgbGV2ZWwsIExvZ01lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgQ29udGV4dCAqY29udGV4dCA9IENvbnRleHQ6OkdldCgpOworCisgIG1lc3NhZ2UtPmxldmVsID0gbGV2ZWw7CisgIG1lc3NhZ2UtPnNvdXJjZSA9IGNvbnRleHQtPnNvdXJjZTsKKyAgbWVtY3B5KG1lc3NhZ2UtPm5hbWUsIGNvbnRleHQtPm5hbWUsIGNvbnRleHQtPm5hbWVfc2l6ZSk7CisgIG1lc3NhZ2UtPm5hbWVfbGVuZ3RoID0gY29udGV4dC0+bmFtZV9zaXplOworCisgIHRpbWU6OlRpbWUgbm93ID0gdGltZTo6VGltZTo6Tm93KCk7CisgIG1lc3NhZ2UtPnNlY29uZHMgPSBub3cuc2VjKCk7CisgIG1lc3NhZ2UtPm5zZWNvbmRzID0gbm93Lm5zZWMoKTsKKworICBtZXNzYWdlLT5zZXF1ZW5jZSA9IGNvbnRleHQtPnNlcXVlbmNlKys7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIEZpbGxJbk1lc3NhZ2VTdHJ1Y3R1cmUobG9nX2xldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2Vfc3RyaW5nLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlVHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6ZnVuY3Rpb248c2l6ZV90KGNoYXIgKik+ICZzZXJpYWxpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSAqbWVzc2FnZSkgeworICB0eXBlX2NhY2hlOjpBZGRTaG0odHlwZS0+aWQpOworICBtZXNzYWdlLT5zdHJ1Y3R1cmUudHlwZV9pZCA9IHR5cGUtPmlkOworCisgIEZpbGxJbk1lc3NhZ2VCYXNlKGxldmVsLCBtZXNzYWdlKTsKKworICBpZiAobWVzc2FnZV9zdHJpbmcuc2l6ZSgpICsgc2l6ZSA+IHNpemVvZihtZXNzYWdlLT5zdHJ1Y3R1cmUuc2VyaWFsaXplZCkpIHsKKyAgICBMT0coRkFUQUwsICJzZXJpYWxpemVkIHN0cnVjdCAlcyAoc2l6ZSAlemQpIGFuZCBtZXNzYWdlICVzIHRvbyBiaWdcbiIsCisgICAgICAgIHR5cGUtPm5hbWUuY19zdHIoKSwgc2l6ZSwgbWVzc2FnZV9zdHJpbmcuY19zdHIoKSk7CisgIH0KKyAgbWVzc2FnZS0+c3RydWN0dXJlLnN0cmluZ19sZW5ndGggPSBtZXNzYWdlX3N0cmluZy5zaXplKCk7CisgIG1lbWNweShtZXNzYWdlLT5zdHJ1Y3R1cmUuc2VyaWFsaXplZCwgbWVzc2FnZV9zdHJpbmcuZGF0YSgpLAorICAgICAgICAgbWVzc2FnZS0+c3RydWN0dXJlLnN0cmluZ19sZW5ndGgpOworCisgIG1lc3NhZ2UtPm1lc3NhZ2VfbGVuZ3RoID0gc2VyaWFsaXplKAorICAgICAgJm1lc3NhZ2UtPnN0cnVjdHVyZS5zZXJpYWxpemVkW21lc3NhZ2UtPnN0cnVjdHVyZS5zdHJpbmdfbGVuZ3RoXSk7CisgIG1lc3NhZ2UtPnR5cGUgPSBMb2dNZXNzYWdlOjpUeXBlOjprU3RydWN0OworfQorCit2b2lkIEZpbGxJbk1lc3NhZ2VNYXRyaXgobG9nX2xldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2Vfc3RyaW5nLCB1aW50MzJfdCB0eXBlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlICptZXNzYWdlKSB7CisgIENIRUNLKE1lc3NhZ2VUeXBlOjpJc1ByaW1pdGl2ZSh0eXBlX2lkKSk7CisgIG1lc3NhZ2UtPm1hdHJpeC50eXBlID0gdHlwZV9pZDsKKworICBjb25zdCBhdXRvIGVsZW1lbnRfc2l6ZSA9IE1lc3NhZ2VUeXBlOjpTaXplb2YodHlwZV9pZCk7CisKKyAgRmlsbEluTWVzc2FnZUJhc2UobGV2ZWwsIG1lc3NhZ2UpOworCisgIG1lc3NhZ2UtPm1lc3NhZ2VfbGVuZ3RoID0gcm93cyAqIGNvbHMgKiBlbGVtZW50X3NpemU7CisgIGlmIChtZXNzYWdlX3N0cmluZy5zaXplKCkgKyBtZXNzYWdlLT5tZXNzYWdlX2xlbmd0aCA+CisgICAgICBzaXplb2YobWVzc2FnZS0+bWF0cml4LmRhdGEpKSB7CisgICAgTE9HKEZBVEFMLCAiJWR4JWQgbWF0cml4IG9mIHR5cGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAiIChzaXplICV1KSBhbmQgbWVzc2FnZSAlcyBpcyB0b28gYmlnXG4iLAorICAgICAgICByb3dzLCBjb2xzLCB0eXBlX2lkLCBlbGVtZW50X3NpemUsIG1lc3NhZ2Vfc3RyaW5nLmNfc3RyKCkpOworICB9CisgIG1lc3NhZ2UtPm1hdHJpeC5zdHJpbmdfbGVuZ3RoID0gbWVzc2FnZV9zdHJpbmcuc2l6ZSgpOworICBtZW1jcHkobWVzc2FnZS0+bWF0cml4LmRhdGEsIG1lc3NhZ2Vfc3RyaW5nLmRhdGEoKSwKKyAgICAgICAgIG1lc3NhZ2UtPm1hdHJpeC5zdHJpbmdfbGVuZ3RoKTsKKworICBtZXNzYWdlLT5tYXRyaXgucm93cyA9IHJvd3M7CisgIG1lc3NhZ2UtPm1hdHJpeC5jb2xzID0gY29sczsKKyAgU2VyaWFsaXplTWF0cml4KHR5cGVfaWQsICZtZXNzYWdlLT5tYXRyaXguZGF0YVttZXNzYWdlLT5tYXRyaXguc3RyaW5nX2xlbmd0aF0sCisgICAgICAgICAgICAgICAgICBkYXRhLCByb3dzLCBjb2xzKTsKKyAgbWVzc2FnZS0+dHlwZSA9IExvZ01lc3NhZ2U6OlR5cGU6OmtNYXRyaXg7Cit9CisKK3ZvaWQgRmlsbEluTWVzc2FnZShsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCwKKyAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlICptZXNzYWdlKSB7CisgIEZpbGxJbk1lc3NhZ2VCYXNlKGxldmVsLCBtZXNzYWdlKTsKKworICBtZXNzYWdlLT5tZXNzYWdlX2xlbmd0aCA9CisgICAgICBFeGVjdXRlRm9ybWF0KG1lc3NhZ2UtPm1lc3NhZ2UsIHNpemVvZihtZXNzYWdlLT5tZXNzYWdlKSwgZm9ybWF0LCBhcCk7CisgIG1lc3NhZ2UtPnR5cGUgPSBMb2dNZXNzYWdlOjpUeXBlOjprU3RyaW5nOworfQorCit2b2lkIFByaW50TWVzc2FnZShGSUxFICpvdXRwdXQsIGNvbnN0IExvZ01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyNkZWZpbmUgQkFTRV9BUkdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFPU19MT0dHSU5HX0JBU0VfQVJHUyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWVzc2FnZS5uYW1lX2xlbmd0aCwgbWVzc2FnZS5uYW1lLCBzdGF0aWNfY2FzdDxpbnQzMl90PihtZXNzYWdlLnNvdXJjZSksIFwKKyAgICAgIG1lc3NhZ2Uuc2VxdWVuY2UsIG1lc3NhZ2UubGV2ZWwsIG1lc3NhZ2Uuc2Vjb25kcywgbWVzc2FnZS5uc2Vjb25kcykKKyAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHsKKyAgICBjYXNlIExvZ01lc3NhZ2U6OlR5cGU6OmtTdHJpbmc6CisgICAgICBmcHJpbnRmKG91dHB1dCwgQU9TX0xPR0dJTkdfQkFTRV9GT1JNQVQgIiUuKnMiLCBCQVNFX0FSR1MsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5tZXNzYWdlX2xlbmd0aCksIG1lc3NhZ2UubWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExvZ01lc3NhZ2U6OlR5cGU6OmtTdHJ1Y3Q6IHsKKyAgICAgIGNoYXIgYnVmZmVyWzIwNDhdOworICAgICAgc2l6ZV90IG91dHB1dF9sZW5ndGggPSBzaXplb2YoYnVmZmVyKTsKKyAgICAgIHNpemVfdCBpbnB1dF9sZW5ndGggPSBtZXNzYWdlLm1lc3NhZ2VfbGVuZ3RoOworICAgICAgaWYgKCFQcmludE1lc3NhZ2UoCisgICAgICAgICAgICAgIGJ1ZmZlciwgJm91dHB1dF9sZW5ndGgsCisgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RydWN0dXJlLnNlcmlhbGl6ZWQgKyBtZXNzYWdlLnN0cnVjdHVyZS5zdHJpbmdfbGVuZ3RoLAorICAgICAgICAgICAgICAmaW5wdXRfbGVuZ3RoLCB0eXBlX2NhY2hlOjpHZXQobWVzc2FnZS5zdHJ1Y3R1cmUudHlwZV9pZCkpKSB7CisgICAgICAgIExPRyhGQVRBTCwKKyAgICAgICAgICAgICJwcmludGluZyBtZXNzYWdlICglLipzKSBvZiB0eXBlICVzIGludG8gJXp1LWJ5dGUgYnVmZmVyIGZhaWxlZFxuIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5tZXNzYWdlX2xlbmd0aCksIG1lc3NhZ2UubWVzc2FnZSwKKyAgICAgICAgICAgIHR5cGVfY2FjaGU6OkdldChtZXNzYWdlLnN0cnVjdHVyZS50eXBlX2lkKS5uYW1lLmNfc3RyKCksCisgICAgICAgICAgICBzaXplb2YoYnVmZmVyKSk7CisgICAgICB9CisgICAgICBpZiAoaW5wdXRfbGVuZ3RoID4gMCkgeworICAgICAgICBMT0coV0FSTklORywgIiV6dSBleHRyYSBieXRlcyBvbiBtZXNzYWdlIG9mIHR5cGUgJXNcbiIsIGlucHV0X2xlbmd0aCwKKyAgICAgICAgICAgIHR5cGVfY2FjaGU6OkdldChtZXNzYWdlLnN0cnVjdHVyZS50eXBlX2lkKS5uYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZnByaW50ZihvdXRwdXQsIEFPU19MT0dHSU5HX0JBU0VfRk9STUFUICIlLipzOiAlLipzXG4iLCBCQVNFX0FSR1MsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5zdHJ1Y3R1cmUuc3RyaW5nX2xlbmd0aCksCisgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RydWN0dXJlLnNlcmlhbGl6ZWQsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKGJ1ZmZlcikgLSBvdXRwdXRfbGVuZ3RoKSwgYnVmZmVyKTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgTG9nTWVzc2FnZTo6VHlwZTo6a01hdHJpeDogeworICAgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgICBzaXplX3Qgb3V0cHV0X2xlbmd0aCA9IHNpemVvZihidWZmZXIpOworICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZV9sZW5ndGggIT0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KG1lc3NhZ2UubWF0cml4LnJvd3MgKiBtZXNzYWdlLm1hdHJpeC5jb2xzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlOjpTaXplb2YobWVzc2FnZS5tYXRyaXgudHlwZSkpKSB7CisgICAgICAgIExPRyhGQVRBTCwgImV4cGVjdGVkICVkIGJ5dGVzIG9mIG1hdHJpeCBkYXRhIGJ1dCBoYXZlICV6dVxuIiwKKyAgICAgICAgICAgIG1lc3NhZ2UubWF0cml4LnJvd3MgKiBtZXNzYWdlLm1hdHJpeC5jb2xzICoKKyAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZTo6U2l6ZW9mKG1lc3NhZ2UubWF0cml4LnR5cGUpLAorICAgICAgICAgICAgbWVzc2FnZS5tZXNzYWdlX2xlbmd0aCk7CisgICAgICB9CisgICAgICBpZiAoIVByaW50TWF0cml4KGJ1ZmZlciwgJm91dHB1dF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF0cml4LmRhdGEgKyBtZXNzYWdlLm1hdHJpeC5zdHJpbmdfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdHJpeC50eXBlLCBtZXNzYWdlLm1hdHJpeC5yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1hdHJpeC5jb2xzKSkgeworICAgICAgICBMT0coRkFUQUwsICJwcmludGluZyAlZHglZCBtYXRyaXggb2YgdHlwZSAlIiBQUkl1MzIgIiBmYWlsZWRcbiIsCisgICAgICAgICAgICBtZXNzYWdlLm1hdHJpeC5yb3dzLCBtZXNzYWdlLm1hdHJpeC5jb2xzLCBtZXNzYWdlLm1hdHJpeC50eXBlKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYob3V0cHV0LCBBT1NfTE9HR0lOR19CQVNFX0ZPUk1BVCAiJS4qczogJS4qc1xuIiwgQkFTRV9BUkdTLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2UubWF0cml4LnN0cmluZ19sZW5ndGgpLAorICAgICAgICAgICAgICBtZXNzYWdlLm1hdHJpeC5kYXRhLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihidWZmZXIpIC0gb3V0cHV0X2xlbmd0aCksIGJ1ZmZlcik7CisgICAgfSBicmVhazsKKyAgfQorI3VuZGVmIEJBU0VfQVJHUworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKwordm9pZCBMb2dJbXBsZW1lbnRhdGlvbjo6TG9nU3RydWN0KAorICAgIGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgOjpzdGQ6OnN0cmluZyAmbWVzc2FnZSwgc2l6ZV90IHNpemUsCisgICAgY29uc3QgTWVzc2FnZVR5cGUgKnR5cGUsIGNvbnN0IDo6c3RkOjpmdW5jdGlvbjxzaXplX3QoY2hhciAqKT4gJnNlcmlhbGl6ZSkgeworICBjaGFyIHNlcmlhbGl6ZWRbMTAyNF07CisgIGlmIChzaXplID4gc2l6ZW9mKHNlcmlhbGl6ZWQpKSB7CisgICAgTE9HKEZBVEFMLCAic3RydWN0dXJlIG9mIHR5cGUgJXMgdG9vIGJpZyB0byBzZXJpYWxpemVcbiIsCisgICAgICAgIHR5cGUtPm5hbWUuY19zdHIoKSk7CisgIH0KKyAgc2l6ZV90IHVzZWQgPSBzZXJpYWxpemUoc2VyaWFsaXplZCk7CisgIGNoYXIgcHJpbnRlZFsxMDI0XTsKKyAgc2l6ZV90IHByaW50ZWRfYnl0ZXMgPSBzaXplb2YocHJpbnRlZCk7CisgIGlmICghUHJpbnRNZXNzYWdlKHByaW50ZWQsICZwcmludGVkX2J5dGVzLCBzZXJpYWxpemVkLCAmdXNlZCwgKnR5cGUpKSB7CisgICAgTE9HKEZBVEFMLCAiUHJpbnRNZXNzYWdlKCVwLCAlcCg9JXpkKSwgJXAsICVwKD0lemQpLCAlcChuYW1lPSVzKSkgZmFpbGVkXG4iLAorICAgICAgICBwcmludGVkLCAmcHJpbnRlZF9ieXRlcywgcHJpbnRlZF9ieXRlcywgc2VyaWFsaXplZCwgJnVzZWQsIHVzZWQsIHR5cGUsCisgICAgICAgIHR5cGUtPm5hbWUuY19zdHIoKSk7CisgIH0KKyAgRG9Mb2dWYXJpYWRpYyhsZXZlbCwgIiUuKnM6ICUuKnNcbiIsIHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5zaXplKCkpLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSgpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKHByaW50ZWQpIC0gcHJpbnRlZF9ieXRlcyksIHByaW50ZWQpOworfQorCit2b2lkIExvZ0ltcGxlbWVudGF0aW9uOjpMb2dNYXRyaXgoCisgICAgbG9nX2xldmVsIGxldmVsLCBjb25zdCA6OnN0ZDo6c3RyaW5nICZtZXNzYWdlLCB1aW50MzJfdCB0eXBlX2lkLAorICAgIGludCByb3dzLCBpbnQgY29scywgY29uc3Qgdm9pZCAqZGF0YSkgeworICBjaGFyIHNlcmlhbGl6ZWRbMTAyNF07CisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHJvd3MgKiBjb2xzICogTWVzc2FnZVR5cGU6OlNpemVvZih0eXBlX2lkKSkgPgorICAgICAgc2l6ZW9mKHNlcmlhbGl6ZWQpKSB7CisgICAgTE9HKEZBVEFMLCAibWF0cml4IG9mIHNpemUgJXUgdG9vIGJpZyB0byBzZXJpYWxpemVcbiIsCisgICAgICAgIHJvd3MgKiBjb2xzICogTWVzc2FnZVR5cGU6OlNpemVvZih0eXBlX2lkKSk7CisgIH0KKyAgU2VyaWFsaXplTWF0cml4KHR5cGVfaWQsIHNlcmlhbGl6ZWQsIGRhdGEsIHJvd3MsIGNvbHMpOworICBjaGFyIHByaW50ZWRbMTAyNF07CisgIHNpemVfdCBwcmludGVkX2J5dGVzID0gc2l6ZW9mKHByaW50ZWQpOworICBpZiAoIVByaW50TWF0cml4KHByaW50ZWQsICZwcmludGVkX2J5dGVzLCBzZXJpYWxpemVkLCB0eXBlX2lkLCByb3dzLCBjb2xzKSkgeworICAgIExPRyhGQVRBTCwgIlByaW50TWF0cml4KCVwLCAlcCg9JXpkKSwgJXAsICUiIFBSSXUzMiAiLCAlZCwgJWQpIGZhaWxlZFxuIiwKKyAgICAgICAgcHJpbnRlZCwgJnByaW50ZWRfYnl0ZXMsIHByaW50ZWRfYnl0ZXMsIHNlcmlhbGl6ZWQsIHR5cGVfaWQsIHJvd3MsCisgICAgICAgIGNvbHMpOworICB9CisgIERvTG9nVmFyaWFkaWMobGV2ZWwsICIlLipzOiAlLipzXG4iLCBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2Uuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihwcmludGVkKSAtIHByaW50ZWRfYnl0ZXMpLCBwcmludGVkKTsKK30KKwordm9pZCBIYW5kbGVNZXNzYWdlTG9nSW1wbGVtZW50YXRpb246OkRvTG9nKGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXApIHsKKyAgTG9nTWVzc2FnZSBtZXNzYWdlOworICBpbnRlcm5hbDo6RmlsbEluTWVzc2FnZShsZXZlbCwgZm9ybWF0LCBhcCwgJm1lc3NhZ2UpOworICBIYW5kbGVNZXNzYWdlKG1lc3NhZ2UpOworfQorCit2b2lkIEhhbmRsZU1lc3NhZ2VMb2dJbXBsZW1lbnRhdGlvbjo6TG9nU3RydWN0KAorICAgIGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgOjpzdGQ6OnN0cmluZyAmbWVzc2FnZV9zdHJpbmcsIHNpemVfdCBzaXplLAorICAgIGNvbnN0IE1lc3NhZ2VUeXBlICp0eXBlLCBjb25zdCA6OnN0ZDo6ZnVuY3Rpb248c2l6ZV90KGNoYXIgKik+ICZzZXJpYWxpemUpIHsKKyAgTG9nTWVzc2FnZSBtZXNzYWdlOworICBpbnRlcm5hbDo6RmlsbEluTWVzc2FnZVN0cnVjdHVyZShsZXZlbCwgbWVzc2FnZV9zdHJpbmcsIHNpemUsIHR5cGUsIHNlcmlhbGl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UpOworICBIYW5kbGVNZXNzYWdlKG1lc3NhZ2UpOworfQorCit2b2lkIEhhbmRsZU1lc3NhZ2VMb2dJbXBsZW1lbnRhdGlvbjo6TG9nTWF0cml4KAorICAgIGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgOjpzdGQ6OnN0cmluZyAmbWVzc2FnZV9zdHJpbmcsIHVpbnQzMl90IHR5cGVfaWQsCisgICAgaW50IHJvd3MsIGludCBjb2xzLCBjb25zdCB2b2lkICpkYXRhKSB7CisgIExvZ01lc3NhZ2UgbWVzc2FnZTsKKyAgaW50ZXJuYWw6OkZpbGxJbk1lc3NhZ2VNYXRyaXgobGV2ZWwsIG1lc3NhZ2Vfc3RyaW5nLCB0eXBlX2lkLCByb3dzLCBjb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAmbWVzc2FnZSk7CisgIEhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7Cit9CisKK1N0cmVhbUxvZ0ltcGxlbWVudGF0aW9uOjpTdHJlYW1Mb2dJbXBsZW1lbnRhdGlvbihGSUxFICpzdHJlYW0pCisgICAgOiBzdHJlYW1fKHN0cmVhbSkge30KKwordm9pZCBTdHJlYW1Mb2dJbXBsZW1lbnRhdGlvbjo6SGFuZGxlTWVzc2FnZShjb25zdCBMb2dNZXNzYWdlICZtZXNzYWdlKSB7CisgIGludGVybmFsOjpQcmludE1lc3NhZ2Uoc3RyZWFtXywgbWVzc2FnZSk7Cit9CisKK3ZvaWQgTG9nTmV4dChsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICBMb2dJbXBsZW1lbnRhdGlvbjo6RG9WTG9nKGxldmVsLCBmb3JtYXQsIGFwLCAyKTsKKyAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBBZGRJbXBsZW1lbnRhdGlvbihMb2dJbXBsZW1lbnRhdGlvbiAqaW1wbGVtZW50YXRpb24pIHsKKyAgQ29udGV4dCAqY29udGV4dCA9IENvbnRleHQ6OkdldCgpOworCisgIGlmIChpbXBsZW1lbnRhdGlvbi0+bmV4dCgpICE9IE5VTEwpIHsKKyAgICBMT0coRkFUQUwsICIlcCBhbHJlYWR5IGhhcyBhIG5leHQgaW1wbGVtZW50YXRpb24sIGJ1dCBpdCdzIG5vdCIKKyAgICAgICAgIiBiZWluZyB1c2VkIHlldFxuIiwgaW1wbGVtZW50YXRpb24pOworICB9CisKKyAgTG9nSW1wbGVtZW50YXRpb24gKm9sZCA9IGNvbnRleHQtPmltcGxlbWVudGF0aW9uOworICBpZiAob2xkICE9IE5VTEwpIHsKKyAgICBpbXBsZW1lbnRhdGlvbi0+c2V0X25leHQob2xkKTsKKyAgfQorICBTZXRHbG9iYWxJbXBsZW1lbnRhdGlvbihpbXBsZW1lbnRhdGlvbik7CisgIHJvb3RfaW1wbGVtZW50YXRpb24tPmhhdmVfb3RoZXJfaW1wbGVtZW50YXRpb24oKTsKK30KKwordm9pZCBJbml0KCkgeworICBzdGF0aWMgT25jZTx2b2lkPiBvbmNlKERvSW5pdCk7CisgIG9uY2UuR2V0KCk7Cit9CisKK3ZvaWQgTG9hZCgpIHsKKyAgQ29udGV4dDo6R2V0KCk7Cit9CisKK3ZvaWQgQ2xlYW51cCgpIHsKKyAgQ29udGV4dDo6RGVsZXRlKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsb2dnaW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmggYi9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3YzFhMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nX2ltcGwuaApAQCAtMCwwICsxLDM2MiBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX0xPR0dJTkdfTE9HR0lOR19JTVBMX0hfCisjZGVmaW5lIEFPU19DT01NT05fTE9HR0lOR19MT0dHSU5HX0lNUExfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL211dGV4LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tYWNyb3MuaCIKKworbmFtZXNwYWNlIGFvcyB7CisKK3N0cnVjdCBNZXNzYWdlVHlwZTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcworCisvLyBUaGlzIGZpbGUgaGFzIGFsbCBvZiB0aGUgbG9nZ2luZyBpbXBsZW1lbnRhdGlvbi4gSXQgY2FuJ3QgYmUgI2luY2x1ZGVkIGJ5IEMKKy8vIGNvZGUgbGlrZSBsb2dnaW5nLmggY2FuLgorLy8gSXQgaXMgdXNlZnVsIGZvciB0aGUgcmVzdCBvZiB0aGUgbG9nZ2luZyBpbXBsZW1lbnRhdGlvbiBhbmQgb3RoZXIgQysrIGNvZGUKKy8vIHRoYXQgbmVlZHMgdG8gZG8gc3BlY2lhbCB0aGluZ3Mgd2l0aCBsb2dnaW5nLgorLy8KKy8vIEl0IGlzIGltcGxlbWVudGVkIGluIGxvZ2dpbmdfaW1wbC5jYyBhbmQgbG9nZ2luZ19pbnRlcmZhY2UuY2MuIFRoZXkgYXJlCisvLyBzZXBhcmF0ZSBzbyB0aGF0IGNvZGUgdXNlZCBieSBsb2dnaW5nX2ltcGwuY2MgY2FuIGxpbmsgaW4KKy8vIGxvZ2dpbmdfaW50ZXJmYWNlLmNjIHRvIHVzZSBsb2dnaW5nIHdpdGhvdXQgY3JlYXRpbmcgYSBjaXJjdWxhciBkZXBlbmRlbmN5LgorLy8gSG93ZXZlciwgYW55IGV4ZWN1dGFibGVzIHdpdGggc3VjaCBjb2RlIHN0aWxsIG5lZWQgbG9nZ2luZ19pbXBsLmNjIGxpbmtlZCBpbi4KKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbG9nZ2luZyB7CisKKy8vIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlZCBvdGhlcndpc2UsIGZvcm1hdCBtdXN0IGFsd2F5cyBiZSBhIHN0cmluZyBjb25zdGFudCwKKy8vIGFyZ3MgYXJlIHByaW50Zi1zdHlsZSBhcmd1bWVudHMgZm9yIGZvcm1hdCwgYW5kIGFwIGlzIGEgdmFfbGlzdCBvZiBhcmdzLgorLy8gVGhlIHZhbGlkaXR5IG9mIGZvcm1hdCBhbmQgYXJncyB0b2dldGhlciB3aWxsIGJlIGNoZWNrZWQgYXQgY29tcGlsZSB0aW1lCisvLyB1c2luZyBhIGdjYyBmdW5jdGlvbiBhdHRyaWJ1dGUuCisKKy8vIFRoZSBzdHJ1Y3QgdGhhdCB0aGUgY29kZSB1c2VzIGZvciBtYWtpbmcgbG9nZ2luZyBjYWxscy4KK3N0cnVjdCBMb2dNZXNzYWdlIHsKKyAgZW51bSBjbGFzcyBUeXBlIDogdWludDhfdCB7CisgICAga1N0cmluZywga1N0cnVjdCwga01hdHJpeAorICB9OworCisgIGludDMyX3Qgc2Vjb25kcywgbnNlY29uZHM7CisgIC8vIG1lc3NhZ2VfbGVuZ3RoIGlzIGp1c3QgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIGRhdGEgKHdoaWNoIG1lbWJlciBkZXBlbmRzCisgIC8vIG9uIHRoZSB0eXBlKS4KKyAgc2l6ZV90IG1lc3NhZ2VfbGVuZ3RoLCBuYW1lX2xlbmd0aDsKKyAgcGlkX3Qgc291cmNlOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihzb3VyY2UpID09IDQsICJ0aGF0J3MgaG93IHRoZXkgZ2V0IHByaW50ZWQiKTsKKyAgLy8gUGVyIHRhc2svdGhyZWFkLgorICB1aW50MTZfdCBzZXF1ZW5jZTsKKyAgVHlwZSB0eXBlOworICBsb2dfbGV2ZWwgbGV2ZWw7CisgIGNoYXIgbmFtZVsxMDBdOworICB1bmlvbiB7CisgICAgY2hhciBtZXNzYWdlW0xPR19NRVNTQUdFX0xFTl07CisgICAgc3RydWN0IHsKKyAgICAgIHVpbnQzMl90IHR5cGVfaWQ7CisgICAgICBzaXplX3Qgc3RyaW5nX2xlbmd0aDsKKyAgICAgIC8vIFRoZSBtZXNzYWdlIHN0cmluZyBhbmQgdGhlbiB0aGUgc2VyaWFsaXplZCBzdHJ1Y3R1cmUuCisgICAgICBjaGFyIHNlcmlhbGl6ZWRbTE9HX01FU1NBR0VfTEVOIC0gc2l6ZW9mKHR5cGUpIC0gc2l6ZW9mKHN0cmluZ19sZW5ndGgpXTsKKyAgICB9IHN0cnVjdHVyZTsKKyAgICBzdHJ1Y3QgeworICAgICAgLy8gVGhlIHR5cGUgSUQgb2YgdGhlIGVsZW1lbnQgdHlwZS4KKyAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICBpbnQgcm93cywgY29sczsKKyAgICAgIHNpemVfdCBzdHJpbmdfbGVuZ3RoOworICAgICAgLy8gVGhlIG1lc3NhZ2Ugc3RyaW5nIGFuZCB0aGVuIHRoZSBzZXJpYWxpemVkIG1hdHJpeC4KKyAgICAgIGNoYXIKKyAgICAgICAgICBkYXRhW0xPR19NRVNTQUdFX0xFTiAtIHNpemVvZih0eXBlKSAtIHNpemVvZihyb3dzKSAtIHNpemVvZihjb2xzKV07CisgICAgfSBtYXRyaXg7CisgIH07Cit9Oworc3RhdGljX2Fzc2VydChzaG1fb2s8TG9nTWVzc2FnZT46OnZhbHVlLCAiaXQncyBnb2luZyBpbiBhIHF1ZXVlIik7CisKKy8vIFJldHVybnMgbGVmdCA+IHJpZ2h0LiBMT0dfVU5LTk9XTiBpcyBtb3N0IGltcG9ydGFudC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBsb2dfZ3RfaW1wb3J0YW50KGxvZ19sZXZlbCBsZWZ0LCBsb2dfbGV2ZWwgcmlnaHQpIHsKKyAgaWYgKGxlZnQgPT0gRVJST1IpIGxlZnQgPSAzOworICBpZiAocmlnaHQgPT0gRVJST1IpIHJpZ2h0ID0gMzsKKyAgcmV0dXJuIGxlZnQgPiByaWdodDsKK30KKworLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgbGV2ZWwgb3IgInVua25vd24iLgorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpsb2dfc3RyKGxvZ19sZXZlbCBsZXZlbCkgeworI2RlZmluZSBERUNMX0xFVkVMKG5hbWUsIHZhbHVlKSBpZiAobGV2ZWwgPT0gbmFtZSkgcmV0dXJuICNuYW1lOworICBERUNMX0xFVkVMUzsKKyN1bmRlZiBERUNMX0xFVkVMCisgIHJldHVybiAidW5rbm93biI7Cit9CisvLyBSZXR1cm5zIHRoZSBsb2cgbGV2ZWwgcmVwcmVzZW50ZWQgYnkgc3RyIG9yIExPR19VTktOT1dOLgorc3RhdGljIGlubGluZSBsb2dfbGV2ZWwgc3RyX2xvZyhjb25zdCBjaGFyICpzdHIpIHsKKyNkZWZpbmUgREVDTF9MRVZFTChuYW1lLCB2YWx1ZSkgaWYgKCFzdHJjbXAoc3RyLCAjbmFtZSkpIHJldHVybiBuYW1lOworICBERUNMX0xFVkVMUzsKKyN1bmRlZiBERUNMX0xFVkVMCisgIHJldHVybiBMT0dfVU5LTk9XTjsKK30KKworLy8gVGFrZXMgYSBtZXNzYWdlIGFuZCBsb2dzIGl0LiBJdCB3aWxsIHNldCBldmVyeXRoaW5nIHVwIGFuZCB0aGVuIGNhbGwgRG9Mb2cKKy8vIGZvciB0aGUgY3VycmVudCBMb2dJbXBsZW1lbnRhdGlvbi4KK3ZvaWQgVkxvZyhsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDIsIDApKSk7CisvLyBBZGRzIHRvIHRoZSBzYXZlZCB1cCBtZXNzYWdlLgordm9pZCBWQ29yayhpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDMsIDApKSk7CisvLyBBY3R1YWxseSBsb2dzIHRoZSBzYXZlZCB1cCBtZXNzYWdlLgordm9pZCBWVW5Db3JrKGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgbG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDUsIDApKSk7CisKKy8vIFdpbGwgY2FsbCBWTG9nIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBmb3IgdGhlIG5leHQgbG9nZ2VyIGluIHRoZSBjaGFpbi4KK3ZvaWQgTG9nTmV4dChsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDIsIDMpKSk7CisKKy8vIFRha2VzIGEgc3RydWN0dXJlIGFuZCBsb2cgaXQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgRG9Mb2dTdHJ1Y3QobG9nX2xldmVsLCBjb25zdCA6OnN0ZDo6c3RyaW5nICYsIGNvbnN0IFQgJik7CisvLyBUYWtlcyBhIG1hdHJpeCBhbmQgbG9ncyBpdC4KK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBEb0xvZ01hdHJpeChsb2dfbGV2ZWwsIGNvbnN0IDo6c3RkOjpzdHJpbmcgJiwgY29uc3QgVCAmKTsKKworLy8gUmVwcmVzZW50cyBhIHN5c3RlbSB0aGF0IGNhbiBhY3R1YWxseSB0YWtlIGxvZyBtZXNzYWdlcyBhbmQgZG8gc29tZXRoaW5nCisvLyB1c2VmdWwgd2l0aCB0aGVtLgorLy8gQWxsIG9mIHRoZSBjb2RlICh0cmFuc2l0aXZlbHkgdG9vISkgaW4gdGhlIERvTG9nIGhlcmUgY2FuIG1ha2UKKy8vIG5vcm1hbCBMT0cgYW5kIExPR19EWU5BTUlDIGNhbGxzIGJ1dCBjYW4gTk9UIGNhbGwgTE9HX0NPUksvTE9HX1VOQ09SSy4gVGhlc2UKKy8vIGNhbGxzIHdpbGwgbm90IHJlc3VsdCBpbiBEb0xvZyByZWN1cnNpbmcuIEhvd2V2ZXIsIGltcGxlbWVudGF0aW9ucyBtdXN0IGJlCisvLyBzYWZlIHRvIGNhbGwgZnJvbSBtdWx0aXBsZSB0aHJlYWRzL3Rhc2tzIGF0IHRoZSBzYW1lIHRpbWUuIEFsc28sIGFueSBvdGhlcgorLy8gb3ZlcnJpZGVuIG1ldGhvZHMgbWF5IGVuZCB1cCBsb2dnaW5nIHRocm91Z2ggYSBnaXZlbiBpbXBsZW1lbnRhdGlvbidzIERvTG9nLgorY2xhc3MgTG9nSW1wbGVtZW50YXRpb24geworIHB1YmxpYzoKKyAgTG9nSW1wbGVtZW50YXRpb24oKSA6IG5leHRfKE5VTEwpIHt9CisKKyAgLy8gVGhlIG9uZSB0aGF0IHRoaXMgb25lJ3MgaW1wbGVtZW50YXRpb24gbG9ncyB0by4KKyAgLy8gTlVMTCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIG5leHQgb25lLgorICBMb2dJbXBsZW1lbnRhdGlvbiAqbmV4dCgpIHsgcmV0dXJuIG5leHRfOyB9CisgIC8vIFZpcnR1YWwgaW4gY2FzZSBhIHN1YmNsYXNzIHdhbnRzIHRvIHBlcmZvcm0gY2hlY2tzLiBUaGVyZSB3aWxsIGJlIGEgdmFsaWQKKyAgLy8gbG9nZ2VyIG90aGVyIHRoYW4gdGhpcyBvbmUgYXZhaWxhYmxlIHdoaWxlIHRoaXMgaXMgY2FsbGVkLgorICB2aXJ0dWFsIHZvaWQgc2V0X25leHQoTG9nSW1wbGVtZW50YXRpb24gKm5leHQpIHsgbmV4dF8gPSBuZXh0OyB9CisKKyBwcml2YXRlOgorICAvLyBBY3R1YWxseSBsb2dzIHRoZSBnaXZlbiBtZXNzYWdlLiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHNvbWVob3cgY3JlYXRlIGEKKyAgLy8gTG9nTWVzc2FnZSBhbmQgdGhlbiBjYWxsIGludGVybmFsOjpGaWxsSW5NZXNzYWdlLgorICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDMsIDApKSkKKyAgdmlydHVhbCB2b2lkIERvTG9nKGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKSA9IDA7CisgIF9fYXR0cmlidXRlX18oKGZvcm1hdChHT09EX1BSSU5URl9GT1JNQVRfVFlQRSwgMywgNCkpKQorICB2b2lkIERvTG9nVmFyaWFkaWMobG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgRG9Mb2cobGV2ZWwsIGZvcm1hdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgIH0KKworICAvLyBMb2dzIHRoZSBjb250ZW50cyBvZiBhbiBhdXRvLWdlbmVyYXRlZCBzdHJ1Y3R1cmUuIFRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlCisgIC8vIGp1c3QgY29udmVydHMgaXQgdG8gYSBzdHJpbmcgd2l0aCBQcmludE1lc3NhZ2UgYW5kIHRoZW4gY2FsbHMgRG9Mb2cgd2l0aAorICAvLyB0aGF0LCBob3dldmVyIHNvbWUgaW1wbGVtZW50YXRpb25zIGNhbiBiZSBhIGxvdCBtb3JlIGVmZmljaWVudCB0aGFuIHRoYXQuCisgIC8vIHNpemUgYW5kIHR5cGUgYXJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBTaXplKCkgYW5kIFR5cGUoKSBvbiB0aGUgdHlwZSBvZgorICAvLyB0aGUgbWVzc2FnZS4KKyAgLy8gc2VyaWFsaXplIHdpbGwgY2FsbCBTZXJpYWxpemUgb24gdGhlIG1lc3NhZ2UuCisgIHZpcnR1YWwgdm9pZCBMb2dTdHJ1Y3QobG9nX2xldmVsIGxldmVsLCBjb25zdCA6OnN0ZDo6c3RyaW5nICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBjb25zdCBNZXNzYWdlVHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6ZnVuY3Rpb248c2l6ZV90KGNoYXIgKik+ICZzZXJpYWxpemUpOworICAvLyBTaW1pbGlhciB0byBMb2dTdHJ1Y3QsIGV4Y2VwdCBmb3IgbWF0cml4ZXMuCisgIC8vIHR5cGVfaWQgaXMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXguCisgIC8vIGRhdGEgcG9pbnRzIHRvIHJvd3MqY29scyp0eXBlX2lkLlNpemUoKSBieXRlcyBvZiBkYXRhIGluIHJvdy1tYWpvciBvcmRlci4KKyAgdmlydHVhbCB2b2lkIExvZ01hdHJpeChsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZV9pZCwgaW50IHJvd3MsIGludCBjb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEpOworCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBjYWxsIHNpbWlsYXIgbWV0aG9kcyBvbiB0aGUgImN1cnJlbnQiIExvZ0ltcGxlbWVudGF0aW9uIG9yCisgIC8vIERpZSBpZiB0aGV5IGNhbid0IGZpbmQgb25lLgorICAvLyBsZXZlbHMgaXMgaG93IG1hbnkgTG9nSW1wbGVtZW50YXRpb25zIHRvIG5vdCB1c2Ugb2ZmIHRoZSBzdGFjay4KKyAgc3RhdGljIHZvaWQgRG9WTG9nKGxvZ19sZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwLCBpbnQgbGV2ZWxzKQorICAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KEdPT0RfUFJJTlRGX0ZPUk1BVF9UWVBFLCAyLCAwKSkpOworICAvLyBUaGlzIG9uZSBpcyBpbXBsZW1lbnRlZCBpbiBxdWV1ZV9sb2dnaW5nLmNjLgorICBzdGF0aWMgdm9pZCBEb0xvZ1N0cnVjdChsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBjb25zdCBNZXNzYWdlVHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpzdGQ6OmZ1bmN0aW9uPHNpemVfdChjaGFyICopPiAmc2VyaWFsaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWxzKTsKKyAgLy8gVGhpcyBvbmUgaXMgaW1wbGVtZW50ZWQgaW4gbWF0cml4X2xvZ2dpbmcuY2MuCisgIHN0YXRpYyB2b2lkIERvTG9nTWF0cml4KGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgOjpzdGQ6OnN0cmluZyAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZV9pZCwgaW50IHJvd3MsIGludCBjb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGV2ZWxzKTsKKworICAvLyBGcmllbmRzIHNvIHRoYXQgdGhleSBjYW4gYWNjZXNzIHRoZSBzdGF0aWMgRG8qIGZ1bmN0aW9ucy4KKyAgZnJpZW5kIHZvaWQgVkxvZyhsb2dfbGV2ZWwsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisgIGZyaWVuZCB2b2lkIExvZ05leHQobG9nX2xldmVsLCBjb25zdCBjaGFyICosIC4uLik7CisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBmcmllbmQgdm9pZCBEb0xvZ1N0cnVjdChsb2dfbGV2ZWwsIGNvbnN0IDo6c3RkOjpzdHJpbmcgJiwgY29uc3QgVCAmKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIGZyaWVuZCB2b2lkIERvTG9nTWF0cml4KGxvZ19sZXZlbCwgY29uc3QgOjpzdGQ6OnN0cmluZyAmLCBjb25zdCBUICYpOworCisgIExvZ0ltcGxlbWVudGF0aW9uICpuZXh0XzsKK307CisKKy8vIEltcGxlbWVudHMgYWxsIG9mIHRoZSBEb0xvZyogbWV0aG9kcyBpbiB0ZXJtcyBvZiBhIChwdXJlIHZpcnR1YWwgaW4gdGhpcworLy8gY2xhc3MpIEhhbmRsZU1lc3NhZ2UgbWV0aG9kIHRoYXQgdGFrZXMgYSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlLgorY2xhc3MgSGFuZGxlTWVzc2FnZUxvZ0ltcGxlbWVudGF0aW9uIDogcHVibGljIExvZ0ltcGxlbWVudGF0aW9uIHsKKyBwdWJsaWM6CisgIF9fYXR0cmlidXRlX18oKGZvcm1hdChHT09EX1BSSU5URl9GT1JNQVRfVFlQRSwgMywgMCkpKQorICB2aXJ0dWFsIHZvaWQgRG9Mb2cobG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgTG9nU3RydWN0KGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgOjpzdGQ6OnN0cmluZyAmbWVzc2FnZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGNvbnN0IE1lc3NhZ2VUeXBlICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpmdW5jdGlvbjxzaXplX3QoY2hhciAqKT4gJnNlcmlhbGl6ZSkKKyAgICAgIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgTG9nTWF0cml4KGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgOjpzdGQ6OnN0cmluZyAmbWVzc2FnZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZV9pZCwgaW50IHJvd3MsIGludCBjb2xzLCBjb25zdCB2b2lkICpkYXRhKQorICAgICAgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIEhhbmRsZU1lc3NhZ2UoY29uc3QgTG9nTWVzc2FnZSAmbWVzc2FnZSkgPSAwOworfTsKKworLy8gQSBsb2cgaW1wbGVtZW50YXRpb24gdGhhdCBkdW1wcyBhbGwgbWVzc2FnZXMgdG8gYSBDIHN0ZGlvIHN0cmVhbS4KK2NsYXNzIFN0cmVhbUxvZ0ltcGxlbWVudGF0aW9uIDogcHVibGljIEhhbmRsZU1lc3NhZ2VMb2dJbXBsZW1lbnRhdGlvbiB7CisgcHVibGljOgorICBTdHJlYW1Mb2dJbXBsZW1lbnRhdGlvbihGSUxFICpzdHJlYW0pOworCisgcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIEhhbmRsZU1lc3NhZ2UoY29uc3QgTG9nTWVzc2FnZSAmbWVzc2FnZSkgb3ZlcnJpZGU7CisKKyAgRklMRSAqY29uc3Qgc3RyZWFtXzsKK307CisKKy8vIEFkZHMgYW5vdGhlciBpbXBsZW1lbnRhdGlvbiB0byB0aGUgc3RhY2sgb2YgaW1wbGVtZW50YXRpb25zIGluIHRoaXMKKy8vIHRhc2svdGhyZWFkLgorLy8gQW55IHRhc2tzL3RocmVhZHMgY3JlYXRlZCBhZnRlciB0aGlzIGNhbGwgd2lsbCBhbHNvIHVzZSB0aGlzIGltcGxlbWVudGF0aW9uLgorLy8gVGhlIGN1dG9mZiBpcyB3aGVuIHRoZSBzdGF0ZSBpbiBhIGdpdmVuIHRhc2svdGhyZWFkIGlzIGNyZWF0ZWQgKGVpdGhlciBsYXppbHkKKy8vIHdoZW4gbmVlZGVkIG9yIGJ5IGNhbGxpbmcgTG9hZCgpKS4KKy8vIFRoZSBsb2dnaW5nIHN5c3RlbSB0YWtlcyBvd25lcnNoaXAgb2YgaW1wbGVtZW50YXRpb24uIEl0IHdpbGwgZGVsZXRlIGl0IGlmCisvLyBuZWNlc3NhcnksIHNvIGl0IG11c3QgYmUgY3JlYXRlZCB3aXRoIG5ldy4KK3ZvaWQgQWRkSW1wbGVtZW50YXRpb24oTG9nSW1wbGVtZW50YXRpb24gKmltcGxlbWVudGF0aW9uKTsKKworLy8gTXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBwZXIgcHJvY2Vzcy9sb2FkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzCisvLyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gaXMgc2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIGZyb20gbXVsdGlwbGUKKy8vIHRhc2tzL3RocmVhZHMuCit2b2lkIEluaXQoKTsKKworLy8gRm9yY2VzIGFsbCBvZiB0aGUgc3RhdGUgdGhhdCBpcyB1c3VhbGx5IGxhemlseSBjcmVhdGVkIHdoZW4gZmlyc3QgbmVlZGVkIHRvCisvLyBiZSBjcmVhdGVkIHdoZW4gY2FsbGVkLiBDbGVhbnVwKCkgd2lsbCBkZWxldGUgaXQuCit2b2lkIExvYWQoKTsKKy8vIFJlc2V0cyBhbGwgaW5mb3JtYXRpb24gaW4gdGhpcyB0YXNrL3RocmVhZCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KKy8vIE5PVEU6IFRoaXMgaXMgbm90IHRoZSBvcHBvc2l0ZSBvZiBJbml0KCkuIFRoZSBzdGF0ZSB0aGF0IHRoaXMgZGVsZXRlcyBpcworLy8gbGF6aWx5IGNyZWF0ZWQgd2hlbiBuZWVkZWQuIEl0IGlzIGFjdHVhbGx5IHRoZSBvcHBvc2l0ZSBvZiBMb2FkKCkuCit2b2lkIENsZWFudXAoKTsKKworLy8gVGhpcyBpcyB3aGVyZSBhbGwgb2YgdGhlIGNvZGUgdGhhdCBpcyBvbmx5IHVzZWQgYnkgYWN0dWFsIExvZ0ltcGxlbWVudGF0aW9ucworLy8gZ29lcy4KK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2V4dGVybiA6OnN0ZDo6YXRvbWljPExvZ0ltcGxlbWVudGF0aW9uICo+IGdsb2JhbF90b3BfaW1wbGVtZW50YXRpb247CisKKy8vIEFuIHNlcGFyYXRlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYWNjZXNzaWJsZSBmcm9tIGVhY2ggdGFzay90aHJlYWQuCisvLyBOT1RFOiBJdCB3aWxsIGdldCBkZWxldGVkIGluIHRoZSBjaGlsZCBvZiBhIGZvcmsuCisvLworLy8gR2V0KCkgYW5kIERlbGV0ZSgpIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgaW50ZXJmYWNlLmNjCisvLyBmaWxlLgorc3RydWN0IENvbnRleHQgeworICBDb250ZXh0KCk7CisKKyAgLy8gR2V0cyB0aGUgQ29udGV4dCBvYmplY3QgZm9yIHRoaXMgdGFzay90aHJlYWQuIFdpbGwgY3JlYXRlIG9uZSB0aGUgZmlyc3QKKyAgLy8gdGltZSBpdCBpcyBjYWxsZWQuCisgIC8vCisgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgZWFjaCBwbGF0Zm9ybSB3aWxsIGxhemlseSBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZQorICAvLyBhbmQgdGhlbiBpbml0aWFsaXplIG5hbWUgdGhlIGZpcnN0IHRpbWUuCisgIC8vIElNUE9SVEFOVDogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2FuIG5vdCB1c2UgbG9nZ2luZy4KKyAgc3RhdGljIENvbnRleHQgKkdldCgpOworICAvLyBEZWxldGVzIHRoZSBDb250ZXh0IG9iamVjdCBmb3IgdGhpcyB0YXNrL3RocmVhZCBzbyB0aGF0IHRoZSBuZXh0IEdldCgpIGlzCisgIC8vIGNhbGxlZCBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBvbmUuCisgIC8vIEl0IGlzIHZhbGlkIHRvIGNhbGwgdGhpcyB3aGVuIEdldCgpIGhhcyBuZXZlciBiZWVuIGNhbGxlZC4KKyAgLy8gVGhpcyBhbHNvIGdldHMgY2FsbGVkIGFmdGVyIGEgZm9yaygyKSBpbiB0aGUgbmV3IHByb2Nlc3MsIHdoZXJlIGl0IHNob3VsZAorICAvLyBzdGlsbCB3b3JrIHRvIGNsZWFuIHVwIGFueSBzdGF0ZS4KKyAgc3RhdGljIHZvaWQgRGVsZXRlKCk7CisKKyAgLy8gV2hpY2ggb25lIHRvIGxvZyB0byByaWdodCBub3cuCisgIC8vIFdpbGwgYmUgTlVMTCBpZiB0aGVyZSBpcyBubyBsb2dnaW5nIGltcGxlbWVudGF0aW9uIHRvIHVzZSByaWdodCBub3cuCisgIExvZ0ltcGxlbWVudGF0aW9uICppbXBsZW1lbnRhdGlvbjsKKworICAvLyBBIG5hbWUgcmVwcmVzZW50aW5nIHRoaXMgdGFzay8ocHJvY2VzcyBhbmQgdGhyZWFkKS4KKyAgY2hhciBuYW1lW3NpemVvZihMb2dNZXNzYWdlOjpuYW1lKV07CisgIHNpemVfdCBuYW1lX3NpemU7CisKKyAgLy8gV2hhdCB0byBhc3NpZ24gTG9nTWVzc2FnZTo6c291cmNlIHRvIGluIHRoaXMgdGFzay90aHJlYWQuCisgIHBpZF90IHNvdXJjZTsKKworICAvLyBUaGUgc2VxdWVuY2UgdmFsdWUgdG8gc2VuZCBvdXQgd2l0aCB0aGUgbmV4dCBtZXNzYWdlLgorICB1aW50MTZfdCBzZXF1ZW5jZTsKKworICAvLyBDb250YWlucyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaW1wbGVtZW50aW5nIExPR19DT1JLIGFuZAorICAvLyBMT0dfVU5DT1JLLgorICBzdHJ1Y3QgeworICAgIGNoYXIgbWVzc2FnZVtMT0dfTUVTU0FHRV9MRU5dOworICAgIGludCBsaW5lX21pbiwgbGluZV9tYXg7CisgICAgLy8gU2V0cyB0aGUgZGF0YSB1cCB0byByZWNvcmQgYSBuZXcgc2VyaWVzIG9mIGNvcmtlZCBsb2dzLgorICAgIHZvaWQgUmVzZXQoKSB7CisgICAgICBtZXNzYWdlWzBdID0gJ1wwJzsgIC8vIG1ha2Ugc3RybGVuIG9mIGl0IDAKKyAgICAgIGxpbmVfbWluID0gSU5UX01BWDsKKyAgICAgIGxpbmVfbWF4ID0gLTE7CisgICAgICBmdW5jdGlvbiA9IE5VTEw7CisgICAgfQorICAgIC8vIFRoZSBmdW5jdGlvbiB0aGF0IHRoZSBjYWxscyBhcmUgaW4uCisgICAgLy8gUkVNRU1CRVI6IFdoaWxlIHRoZSBjb21waWxlci9saW5rZXIgd2lsbCBwcm9iYWJseSBvcHRpbWl6ZSBhbGwgb2YgdGhlCisgICAgLy8gaWRlbnRpY2FsIHN0cmluZ3MgdG8gcG9pbnQgdG8gdGhlIHNhbWUgZGF0YSwgaXQgbWlnaHQgbm90LCBzbyB1c2luZyA9PSB0bworICAgIC8vIGNvbXBhcmUgdGhpcyB3aXRoIGFub3RoZXIgdmFsdWUgaXMgYSBiYWQgaWRlYS4KKyAgICBjb25zdCBjaGFyICpmdW5jdGlvbjsKKyAgfSBjb3JrX2RhdGE7Cit9OworCisvLyBGaWxscyBpbiBhbGwgdGhlIHBhcnRzIG9mIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBpbnB1dHMgKHdpdGggdHlwZQorLy8ga1N0cnVjdCkuCit2b2lkIEZpbGxJbk1lc3NhZ2VTdHJ1Y3R1cmUobG9nX2xldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2Vfc3RyaW5nLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlVHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6ZnVuY3Rpb248c2l6ZV90KGNoYXIgKik+ICZzZXJpYWxpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSAqbWVzc2FnZSk7CisKKy8vIEZpbGxzIGluIGFsbCB0aGUgcGFydHMgb2YgdGhlIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBpbnB1dHMgKHdpdGgKKy8vIHR5cGUga01hdHJpeCkuCit2b2lkIEZpbGxJbk1lc3NhZ2VNYXRyaXgobG9nX2xldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2Vfc3RyaW5nLCB1aW50MzJfdCB0eXBlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzLCBpbnQgY29scywgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlICptZXNzYWdlKTsKKworLy8gRmlsbHMgaW4gKm1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBpbnB1dHMgKHdpdGggdHlwZSBrU3RyaW5nKS4KKy8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBMb2dJbXBsZW1lbnRhdGlvbjo6RG9Mb2cuCit2b2lkIEZpbGxJbk1lc3NhZ2UobG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXAsCisgICAgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSAqbWVzc2FnZSkKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDIsIDApKSk7CisKK19fYXR0cmlidXRlX18oKGZvcm1hdChHT09EX1BSSU5URl9GT1JNQVRfVFlQRSwgMywgNCkpKQorc3RhdGljIGlubGluZSB2b2lkIEZpbGxJbk1lc3NhZ2VWYXJhcmdzKGxvZ19sZXZlbCBsZXZlbCwgTG9nTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgRmlsbEluTWVzc2FnZShsZXZlbCwgZm9ybWF0LCBhcCwgbWVzc2FnZSk7CisgIHZhX2VuZChhcCk7Cit9CisKKy8vIFByaW50cyBtZXNzYWdlIHRvIG91dHB1dC4KK3ZvaWQgUHJpbnRNZXNzYWdlKEZJTEUgKm91dHB1dCwgY29uc3QgTG9nTWVzc2FnZSAmbWVzc2FnZSk7CisKKy8vIFByaW50cyBmb3JtYXQgKHdpdGggYXApIGludG8gb3V0cHV0IGFuZCBjb3JyZWN0bHkgZGVhbHMgd2l0aCB0aGUgcmVzdWx0CisvLyBiZWluZyB0b28gbG9uZyBldGMuCitzaXplX3QgRXhlY3V0ZUZvcm1hdChjaGFyICpvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcCkKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDMsIDApKSk7CisKKy8vIFJ1bnMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGN1cnJlbnQgTG9nSW1wbGVtZW50YXRpb24gKGhhbmRsZXMgc3dpdGNoaW5nCisvLyBpdCBvdXQgd2hpbGUgcnVubmluZyBmdW5jdGlvbiBldGMpLgorLy8gbGV2ZWxzIGlzIGhvdyBtYW55IExvZ0ltcGxlbWVudGF0aW9ucyB0byBub3QgdXNlIG9mZiB0aGUgc3RhY2suCit2b2lkIFJ1bldpdGhDdXJyZW50SW1wbGVtZW50YXRpb24oCisgICAgaW50IGxldmVscywgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoTG9nSW1wbGVtZW50YXRpb24gKik+IGZ1bmN0aW9uKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fTE9HR0lOR19MT0dHSU5HX0lNUExfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nX2ltcGxfdGVzdC5jYyBiL2Fvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nX2ltcGxfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWM5NjJiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbF90ZXN0LmNjCkBAIC0wLDAgKzEsMjM5IEBACisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfcHJpbnRmX2Zvcm1hdHMuaCIKKwordXNpbmcgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQ7Cit1c2luZyA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3M7Cit1c2luZyA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmU7CisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGxvZ2dpbmcgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBUZXN0TG9nSW1wbGVtZW50YXRpb24gOiBwdWJsaWMgTG9nSW1wbGVtZW50YXRpb24geworICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoR09PRF9QUklOVEZfRk9STUFUX1RZUEUsIDMsIDApKSkKKyAgdmlydHVhbCB2b2lkIERvTG9nKGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKSB7CisgICAgaW50ZXJuYWw6OkZpbGxJbk1lc3NhZ2UobGV2ZWwsIGZvcm1hdCwgYXAsICZtZXNzYWdlXyk7CisKKyAgICBpZiAobGV2ZWwgPT0gRkFUQUwpIHsKKyAgICAgIGludGVybmFsOjpQcmludE1lc3NhZ2Uoc3RkZXJyLCBtZXNzYWdlXyk7CisgICAgICBhYm9ydCgpOworICAgIH0KKworICAgIHVzZWRfID0gdHJ1ZTsKKyAgfQorCisgIExvZ01lc3NhZ2UgbWVzc2FnZV87CisKKyBwdWJsaWM6CisgIGNvbnN0IExvZ01lc3NhZ2UgJm1lc3NhZ2UoKSB7IHJldHVybiBtZXNzYWdlXzsgfQorICBib29sIHVzZWQoKSB7IHJldHVybiB1c2VkXzsgfQorICB2b2lkIHJlc2V0X3VzZWQoKSB7IHVzZWRfID0gZmFsc2U7IH0KKworICBUZXN0TG9nSW1wbGVtZW50YXRpb24oKSA6IHVzZWRfKGZhbHNlKSB7fQorCisgIGJvb2wgdXNlZF87Cit9OworY2xhc3MgTG9nZ2luZ1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEFzc2VydGlvblJlc3VsdCBXYXNBbnl0aGluZ0xvZ2dlZCgpIHsKKyAgICBpZiAobG9nX2ltcGxlbWVudGF0aW9uLT51c2VkKCkpIHsKKyAgICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCkgPDwgInJlYWQgbWVzc2FnZSAnIiA8PAorICAgICAgICAgIGxvZ19pbXBsZW1lbnRhdGlvbi0+bWVzc2FnZSgpLm1lc3NhZ2UgPDwgIiciOworICAgIH0KKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpOworICB9CisgIEFzc2VydGlvblJlc3VsdCBXYXNMb2dnZWQobG9nX2xldmVsIGxldmVsLCBjb25zdCBzdGQ6OnN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYgKCFsb2dfaW1wbGVtZW50YXRpb24tPnVzZWQoKSkgeworICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAibm90aGluZyB3YXMgbG9nZ2VkIjsKKyAgICB9CisgICAgaWYgKGxvZ19pbXBsZW1lbnRhdGlvbi0+bWVzc2FnZSgpLmxldmVsICE9IGxldmVsKSB7CisgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJhIG1lc3NhZ2Ugd2l0aCBsZXZlbCAiIDw8CisgICAgICAgICAgbG9nX3N0cihsb2dfaW1wbGVtZW50YXRpb24tPm1lc3NhZ2UoKS5sZXZlbCkgPDwKKyAgICAgICAgICAiIHdhcyBsb2dnZWQgaW5zdGVhZCBvZiAiIDw8IGxvZ19zdHIobGV2ZWwpOworICAgIH0KKyAgICBpbnRlcm5hbDo6Q29udGV4dCAqY29udGV4dCA9IGludGVybmFsOjpDb250ZXh0OjpHZXQoKTsKKyAgICBpZiAobG9nX2ltcGxlbWVudGF0aW9uLT5tZXNzYWdlKCkuc291cmNlICE9IGNvbnRleHQtPnNvdXJjZSkgeworICAgICAgTE9HKEZBVEFMLCAiZ290IGEgbWVzc2FnZSBmcm9tICUiIFBSSXUzMiAiLCBidXQgd2UncmUgJSIgUFJJdTMyICJcbiIsCisgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGxvZ19pbXBsZW1lbnRhdGlvbi0+bWVzc2FnZSgpLnNvdXJjZSksCisgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbnRleHQtPnNvdXJjZSkpOworICAgIH0KKyAgICBpZiAobG9nX2ltcGxlbWVudGF0aW9uLT5tZXNzYWdlKCkubmFtZV9sZW5ndGggIT0gY29udGV4dC0+bmFtZV9zaXplIHx8CisgICAgICAgIG1lbWNtcChsb2dfaW1wbGVtZW50YXRpb24tPm1lc3NhZ2UoKS5uYW1lLCBjb250ZXh0LT5uYW1lLAorICAgICAgICAgICAgICAgY29udGV4dC0+bmFtZV9zaXplKSAhPQorICAgICAgICAgICAgMCkgeworICAgICAgTE9HKEZBVEFMLCAiZ290IGEgbWVzc2FnZSBmcm9tICUuKnMsIGJ1dCB3ZSdyZSAlc1xuIiwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGxvZ19pbXBsZW1lbnRhdGlvbi0+bWVzc2FnZSgpLm5hbWVfbGVuZ3RoKSwKKyAgICAgICAgICBsb2dfaW1wbGVtZW50YXRpb24tPm1lc3NhZ2UoKS5uYW1lLCBjb250ZXh0LT5uYW1lKTsKKyAgICB9CisgICAgaWYgKHN0cnN0cihsb2dfaW1wbGVtZW50YXRpb24tPm1lc3NhZ2UoKS5tZXNzYWdlLCBtZXNzYWdlLmNfc3RyKCkpCisgICAgICAgID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgImdvdCBhIG1lc3NhZ2Ugb2YgJyIgPDwKKyAgICAgICAgICBsb2dfaW1wbGVtZW50YXRpb24tPm1lc3NhZ2UoKS5tZXNzYWdlIDw8CisgICAgICAgICAgIicgYnV0IGV4cGVjdGVkIGl0IHRvIGNvbnRhaW4gJyIgPDwgbWVzc2FnZSA8PCAiJyI7CisgICAgfQorCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKSA8PCBsb2dfaW1wbGVtZW50YXRpb24tPm1lc3NhZ2UoKS5tZXNzYWdlOworICB9CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgc3RhdGljIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKworICAgICAgSW5pdCgpOworICAgICAgQWRkSW1wbGVtZW50YXRpb24obG9nX2ltcGxlbWVudGF0aW9uID0gbmV3IFRlc3RMb2dJbXBsZW1lbnRhdGlvbigpKTsKKyAgICB9CisKKyAgICBsb2dfaW1wbGVtZW50YXRpb24tPnJlc2V0X3VzZWQoKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgQ2xlYW51cCgpOworICB9CisKKyAgc3RhdGljIFRlc3RMb2dJbXBsZW1lbnRhdGlvbiAqbG9nX2ltcGxlbWVudGF0aW9uOworfTsKK1Rlc3RMb2dJbXBsZW1lbnRhdGlvbiAqTG9nZ2luZ1Rlc3Q6OmxvZ19pbXBsZW1lbnRhdGlvbihOVUxMKTsKK3R5cGVkZWYgTG9nZ2luZ1Rlc3QgTG9nZ2luZ0RlYXRoVGVzdDsKKworLy8gVGVzdHMgYm90aCBiYXNpYyBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkgYW5kIHRoYXQgdGhlIHRlc3Qgc2V0dXAgd29ya3MKKy8vIGNvcnJlY3RseS4KK1RFU1RfRihMb2dnaW5nVGVzdCwgQmFzaWMpIHsKKyAgRVhQRUNUX0ZBTFNFKFdhc0FueXRoaW5nTG9nZ2VkKCkpOworICBMT0coSU5GTywgInRlc3QgbG9nIDFcbiIpOworICBFWFBFQ1RfVFJVRShXYXNMb2dnZWQoSU5GTywgInRlc3QgbG9nIDFcbiIpKTsKKyAgTE9HKElORk8sICJ0ZXN0IGxvZyAxLjVcbiIpOworICAvLyB0aGVyZSdzIGEgc3VidGxlIHR5cG8gb24gcHVycG9zZS4uLgorICBFWFBFQ1RfRkFMU0UoV2FzTG9nZ2VkKElORk8sICJ0ZXN0IGxvZyAxNVxuIikpOworICBMT0coRVJST1IsICJ0ZXN0IGxvZyAyPSVkXG4iLCA1NSk7CisgIEVYUEVDVF9UUlVFKFdhc0xvZ2dlZChFUlJPUiwgInRlc3QgbG9nIDI9NTVcbiIpKTsKKyAgTE9HKEVSUk9SLCAidGVzdCBsb2cgM1xuIik7CisgIEVYUEVDVF9GQUxTRShXYXNMb2dnZWQoV0FSTklORywgInRlc3QgbG9nIDNcbiIpKTsKKyAgTE9HKFdBUk5JTkcsICJ0ZXN0IGxvZyA0XG4iKTsKKyAgRVhQRUNUX1RSVUUoV2FzQW55dGhpbmdMb2dnZWQoKSk7Cit9CitURVNUX0YoTG9nZ2luZ1Rlc3QsIENvcmspIHsKKyAgc3RhdGljIGNvbnN0IGludCBiZWdpbl9saW5lID0gX19MSU5FX187CisgIExPR19DT1JLKCJmaXJzdCBwYXJ0ICIpOworICBMT0dfQ09SSygic2Vjb25kIHBhcnQgKD0lZCkgIiwgMTkpOworICBFWFBFQ1RfRkFMU0UoV2FzQW55dGhpbmdMb2dnZWQoKSk7CisgIExPR19DT1JLKCJ0aGlyZCBwYXJ0ICIpOworICBzdGF0aWMgY29uc3QgaW50IGVuZF9saW5lID0gX19MSU5FX187CisgIExPR19VTkNPUksoV0FSTklORywgImxhc3QgcGFydCAlZFxuIiwgNSk7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGV4cGVjdGVkOworICBleHBlY3RlZCA8PCAibG9nZ2luZ19pbXBsX3Rlc3QuY2M6ICI7CisgIGV4cGVjdGVkIDw8IChiZWdpbl9saW5lICsgMSk7CisgIGV4cGVjdGVkIDw8ICItIjsKKyAgZXhwZWN0ZWQgPDwgKGVuZF9saW5lICsgMSk7CisgIGV4cGVjdGVkIDw8ICI6ICI7CisgIGV4cGVjdGVkIDw8IF9fZnVuY19fOworICBleHBlY3RlZCA8PCAiOiBmaXJzdCBwYXJ0IHNlY29uZCBwYXJ0ICg9MTkpIHRoaXJkIHBhcnQgbGFzdCBwYXJ0IDVcbiI7CisgIEVYUEVDVF9UUlVFKFdhc0xvZ2dlZChXQVJOSU5HLCBleHBlY3RlZC5zdHIoKSkpOworfQorCitURVNUX0YoTG9nZ2luZ0RlYXRoVGVzdCwgRmF0YWwpIHsKKyAgQVNTRVJUX0VYSVQoTE9HKEZBVEFMLCAidGhpcyBzaG91bGQgY3Jhc2ggaXRcbiIpLAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLAorICAgICAgICAgICAgICAidGhpcyBzaG91bGQgY3Jhc2ggaXQiKTsKK30KKworVEVTVF9GKExvZ2dpbmdEZWF0aFRlc3QsIFBDSEVDSykgeworICBFWFBFQ1RfREVBVEgoUENIRUNLKGZwcmludGYoc3RkaW4sICJub3BlIikpLAorICAgICAgICAgICAgICAgIi4qZnByaW50ZlxcKHN0ZGluLCBcIm5vcGVcIlxcKS4qZmFpbGVkLioiKTsKK30KKworVEVTVF9GKExvZ2dpbmdUZXN0LCBQQ0hFQ0spIHsKKyAgRVhQRUNUX0VRKDcsIFBDSEVDSyhwcmludGYoImFiYzEyM1xuIikpKTsKK30KKworVEVTVF9GKExvZ2dpbmdUZXN0LCBQcmludGZEaXJlY3RpdmVzKSB7CisgIExPRyhJTkZPLCAidGVzdCBsb2cgJSUxICUlZFxuIik7CisgIEVYUEVDVF9UUlVFKFdhc0xvZ2dlZChJTkZPLCAidGVzdCBsb2cgJTEgJWRcbiIpKTsKKyAgTE9HX0RZTkFNSUMoV0FSTklORywgInRlc3QgbG9nICUlMiAlJWZcbiIpOworICBFWFBFQ1RfVFJVRShXYXNMb2dnZWQoV0FSTklORywgInRlc3QgbG9nICUyICVmXG4iKSk7CisgIExPR19DT1JLKCJsb2cgMyBwYXJ0ICUlMSAlJWQgIik7CisgIExPR19VTkNPUksoREVCVUcsICJsb2cgMyBwYXJ0ICUlMiAlJWZcbiIpOworICBFWFBFQ1RfVFJVRShXYXNMb2dnZWQoREVCVUcsICJsb2cgMyBwYXJ0ICUxICVkIGxvZyAzIHBhcnQgJTIgJWZcbiIpKTsKK30KKworVEVTVF9GKExvZ2dpbmdUZXN0LCBUaW1pbmcpIHsKKyAgLy8gRm9yIHdyaXRpbmcgb25seS4KKyAgLy9zdGF0aWMgY29uc3QgbG9uZyBrVGltaW5nQ3ljbGVzID0gNTAwMDAwMDsKKyAgc3RhdGljIGNvbnN0IGxvbmcga1RpbWluZ0N5Y2xlcyA9IDUwMDA7CisKKyAgdGltZTo6VGltZSBzdGFydCA9IHRpbWU6OlRpbWU6Ok5vdygpOworICBmb3IgKGxvbmcgaSA9IDA7IGkgPCBrVGltaW5nQ3ljbGVzOyArK2kpIHsKKyAgICBMT0coSU5GTywgImFcbiIpOworICB9CisgIHRpbWU6OlRpbWUgZW5kID0gdGltZTo6VGltZTo6Tm93KCk7CisgIHRpbWU6OlRpbWUgZGlmZiA9IGVuZCAtIHN0YXJ0OworICBwcmludGYoInNob3J0IG1lc3NhZ2UgdG9vayAlIiBQUklkNjQgIiBuc2VjIGZvciAlbGRcbiIsCisgICAgICAgICBkaWZmLlRvTlNlYygpLCBrVGltaW5nQ3ljbGVzKTsKKworICBzdGFydCA9IHRpbWU6OlRpbWU6Ok5vdygpOworICBmb3IgKGxvbmcgaSA9IDA7IGkgPCBrVGltaW5nQ3ljbGVzOyArK2kpIHsKKyAgICBMT0coSU5GTywgInNvbWV0aGluZyBsb25nZXIgdGhhbiBqdXN0IFwiYVwiIHRvIGxvZyB0byB0ZXN0IHRpbWluZ1xuIik7CisgIH0KKyAgZW5kID0gdGltZTo6VGltZTo6Tm93KCk7CisgIGRpZmYgPSBlbmQgLSBzdGFydDsKKyAgcHJpbnRmKCJsb25nIG1lc3NhZ2UgdG9vayAlIiBQUklkNjQgIiBuc2VjIGZvciAlbGRcbiIsCisgICAgICAgICBkaWZmLlRvTlNlYygpLCBrVGltaW5nQ3ljbGVzKTsKK30KKworVEVTVChMb2dnaW5nUHJpbnRGb3JtYXRUZXN0LCBUaW1lKSB7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworCisgIC8vIEVhc3kgb25lcy4KKyAgQVNTRVJUX0VRKDE4LCBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBBT1NfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU9TX1RJTUVfQVJHUygyLCAwKSkpOworICBFWFBFQ1RfRVEoIjAwMDAwMDAwMDIuMDAwMDAwcyIsIDo6c3RkOjpzdHJpbmcoYnVmZmVyKSk7CisgIEFTU0VSVF9FUSgxOCwgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgQU9TX1RJTUVfRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgIEFPU19USU1FX0FSR1MoMiwgMSkpKTsKKyAgRVhQRUNUX0VRKCIwMDAwMDAwMDAyLjAwMDAwMHMiLCA6OnN0ZDo6c3RyaW5nKGJ1ZmZlcikpOworCisgIC8vIFRoaXMgb25lIHNob3VsZCBiZSBleGFjdC4KKyAgQVNTRVJUX0VRKDE4LCBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBBT1NfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU9TX1RJTUVfQVJHUygyLCAxMDAwKSkpOworICBFWFBFQ1RfRVEoIjAwMDAwMDAwMDIuMDAwMDAxcyIsIDo6c3RkOjpzdHJpbmcoYnVmZmVyKSk7CisKKyAgLy8gTWFrZSBzdXJlIHJvdW5kaW5nIHdvcmtzIGNvcnJlY3RseS4KKyAgQVNTRVJUX0VRKDE4LCBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBBT1NfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU9TX1RJTUVfQVJHUygyLCA5OTkpKSk7CisgIEVYUEVDVF9FUSgiMDAwMDAwMDAwMi4wMDAwMDFzIiwgOjpzdGQ6OnN0cmluZyhidWZmZXIpKTsKKyAgQVNTRVJUX0VRKDE4LCBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBBT1NfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU9TX1RJTUVfQVJHUygyLCA1MDApKSk7CisgIEVYUEVDVF9FUSgiMDAwMDAwMDAwMi4wMDAwMDFzIiwgOjpzdGQ6OnN0cmluZyhidWZmZXIpKTsKKyAgQVNTRVJUX0VRKDE4LCBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBBT1NfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU9TX1RJTUVfQVJHUygyLCA0OTkpKSk7CisgIEVYUEVDVF9FUSgiMDAwMDAwMDAwMi4wMDAwMDBzIiwgOjpzdGQ6OnN0cmluZyhidWZmZXIpKTsKKworICAvLyBUaGlzIHVzZWQgdG8gcmVzdWx0IGluICIwMDAwMDAwMDAxLjA5OTUwMHMiLgorICBBU1NFUlRfRVEoMTgsIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIEFPU19USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBT1NfVElNRV9BUkdTKDEsIDk5NTAwMDAwMCkpKTsKKyAgRVhQRUNUX0VRKCIwMDAwMDAwMDAxLjk5NTAwMHMiLCA6OnN0ZDo6c3RyaW5nKGJ1ZmZlcikpOworfQorCitURVNUKExvZ2dpbmdQcmludEZvcm1hdFRlc3QsIEJhc2UpIHsKKyAgY2hhciBidWZmZXJbMTAyNF07CisKKyAgc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcga0V4cGVjdGVkMSA9CisgICAgICAibmFtZSg5NzEpKDAxNjc4KTogRVJST1IgICBhdCAwMDAwMDAwMDAxLjk5NTAwMHM6ICI7CisgIEFTU0VSVF9HVChzaXplb2YoYnVmZmVyKSwga0V4cGVjdGVkMS5zaXplKCkpOworICBBU1NFUlRfRVEoCisgICAgICBrRXhwZWN0ZWQxLnNpemUoKSwKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oc25wcmludGYoCisgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgQU9TX0xPR0dJTkdfQkFTRV9GT1JNQVQsCisgICAgICAgICAgQU9TX0xPR0dJTkdfQkFTRV9BUkdTKDQsICJuYW1lIiwgOTcxLCAxNjc4LCBFUlJPUiwgMSwgOTk1MDAwMDAwKSkpKTsKKyAgRVhQRUNUX0VRKGtFeHBlY3RlZDEsIDo6c3RkOjpzdHJpbmcoYnVmZmVyKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW50ZXJmYWNlLmNjIGIvYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWM1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwxNDEgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9kaWUuaCIKKworLy8gVGhpcyBmaWxlIG9ubHkgY29udGFpbnMgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIGxpbmsgKGllIG5vIGltcGxlbWVudGF0aW9ucykuCisvLyBTZWUgbG9nZ2luZ19pbXBsLmggZm9yIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS4KKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbG9nZ2luZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCis6OnN0ZDo6YXRvbWljPExvZ0ltcGxlbWVudGF0aW9uICo+IGdsb2JhbF90b3BfaW1wbGVtZW50YXRpb24oTlVMTCk7CisKK0NvbnRleHQ6OkNvbnRleHQoKQorICAgIDogaW1wbGVtZW50YXRpb24oZ2xvYmFsX3RvcF9pbXBsZW1lbnRhdGlvbi5sb2FkKCkpLAorICAgICAgc2VxdWVuY2UoMCkgeworICBjb3JrX2RhdGEuUmVzZXQoKTsKK30KKworc2l6ZV90IEV4ZWN1dGVGb3JtYXQoY2hhciAqb3V0cHV0LCBzaXplX3Qgb3V0cHV0X3NpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXApIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbnRpbnVlZCA9ICIuLi5cbiI7CisgIGNvbnN0IHNpemVfdCBzaXplID0gb3V0cHV0X3NpemUgLSBzdHJsZW4oY29udGludWVkKTsKKyAgY29uc3QgaW50IHJldCA9IHZzbnByaW50ZihvdXRwdXQsIHNpemUsIGZvcm1hdCwgYXApOworICB0eXBlZGVmIDo6c3RkOjpjb21tb25fdHlwZTx0eXBlb2YocmV0KSwgdHlwZW9mKHNpemUpPjo6dHlwZSBSZXRUeXBlOworICBpZiAocmV0IDwgMCkgeworICAgIFBMT0coRkFUQUwsICJ2c25wcmludGYoJXAsICV6ZCwgJXMsIGFyZ3MpIGZhaWxlZCIsCisgICAgICAgICBvdXRwdXQsIHNpemUsIGZvcm1hdCk7CisgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8UmV0VHlwZT4ocmV0KSA+PSBzdGF0aWNfY2FzdDxSZXRUeXBlPihzaXplKSkgeworICAgIC8vIE92ZXJ3cml0ZSB0aGUgJ1wwJyBhdCB0aGUgZW5kIG9mIHRoZSBleGlzdGluZyBkYXRhIGFuZAorICAgIC8vIGNvcHkgaW4gdGhlIG9uZSBvbiB0aGUgZW5kIG9mIGNvbnRpbnVlZC4KKyAgICBtZW1jcHkoJm91dHB1dFtzaXplIC0gMV0sIGNvbnRpbnVlZCwgc3RybGVuKGNvbnRpbnVlZCkgKyAxKTsKKyAgfQorICByZXR1cm4gOjpzdGQ6Om1pbjxSZXRUeXBlPihyZXQsIHNpemUpOworfQorCit2b2lkIFJ1bldpdGhDdXJyZW50SW1wbGVtZW50YXRpb24oCisgICAgaW50IGxldmVscywgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoTG9nSW1wbGVtZW50YXRpb24gKik+IGZ1bmN0aW9uKSB7CisgIENvbnRleHQgKmNvbnRleHQgPSBDb250ZXh0OjpHZXQoKTsKKworICBMb2dJbXBsZW1lbnRhdGlvbiAqY29uc3QgdG9wX2ltcGxlbWVudGF0aW9uID0gY29udGV4dC0+aW1wbGVtZW50YXRpb247CisgIExvZ0ltcGxlbWVudGF0aW9uICpuZXdfaW1wbGVtZW50YXRpb24gPSB0b3BfaW1wbGVtZW50YXRpb247CisgIExvZ0ltcGxlbWVudGF0aW9uICppbXBsZW1lbnRhdGlvbiA9IE5VTEw7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV2ZWxzOyArK2kpIHsKKyAgICBpbXBsZW1lbnRhdGlvbiA9IG5ld19pbXBsZW1lbnRhdGlvbjsKKyAgICBpZiAobmV3X2ltcGxlbWVudGF0aW9uID09IE5VTEwpIHsKKyAgICAgIERpZSgibm8gbG9nZ2luZyBpbXBsZW1lbnRhdGlvbiB0byB1c2VcbiIpOworICAgIH0KKyAgICBuZXdfaW1wbGVtZW50YXRpb24gPSBuZXdfaW1wbGVtZW50YXRpb24tPm5leHQoKTsKKyAgfQorICBjb250ZXh0LT5pbXBsZW1lbnRhdGlvbiA9IG5ld19pbXBsZW1lbnRhdGlvbjsKKyAgZnVuY3Rpb24oaW1wbGVtZW50YXRpb24pOworICBjb250ZXh0LT5pbXBsZW1lbnRhdGlvbiA9IHRvcF9pbXBsZW1lbnRhdGlvbjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK3VzaW5nIGludGVybmFsOjpDb250ZXh0OworCit2b2lkIExvZ0ltcGxlbWVudGF0aW9uOjpEb1ZMb2cobG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVscykgeworICBpbnRlcm5hbDo6UnVuV2l0aEN1cnJlbnRJbXBsZW1lbnRhdGlvbigKKyAgICAgIGxldmVscywgWyZdKExvZ0ltcGxlbWVudGF0aW9uICogaW1wbGVtZW50YXRpb24pIHsKKyAgICB2YV9saXN0IGFwMTsKKyAgICB2YV9jb3B5KGFwMSwgYXApOworICAgIGltcGxlbWVudGF0aW9uLT5Eb0xvZyhsZXZlbCwgZm9ybWF0LCBhcDEpOworICAgIHZhX2VuZChhcDEpOworCisgICAgaWYgKGxldmVsID09IEZBVEFMKSB7CisgICAgICBWRGllKGZvcm1hdCwgYXApOworICAgIH0KKyAgfSk7Cit9CisKK3ZvaWQgVkxvZyhsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkgeworICBMb2dJbXBsZW1lbnRhdGlvbjo6RG9WTG9nKGxldmVsLCBmb3JtYXQsIGFwLCAxKTsKK30KKwordm9pZCBWQ29yayhpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkgeworICBDb250ZXh0ICpjb250ZXh0ID0gQ29udGV4dDo6R2V0KCk7CisKKyAgY29uc3Qgc2l6ZV90IG1lc3NhZ2VfbGVuZ3RoID0gc3RybGVuKGNvbnRleHQtPmNvcmtfZGF0YS5tZXNzYWdlKTsKKyAgaWYgKGxpbmUgPiBjb250ZXh0LT5jb3JrX2RhdGEubGluZV9tYXgpIGNvbnRleHQtPmNvcmtfZGF0YS5saW5lX21heCA9IGxpbmU7CisgIGlmIChsaW5lIDwgY29udGV4dC0+Y29ya19kYXRhLmxpbmVfbWluKSBjb250ZXh0LT5jb3JrX2RhdGEubGluZV9taW4gPSBsaW5lOworCisgIGlmIChjb250ZXh0LT5jb3JrX2RhdGEuZnVuY3Rpb24gPT0gTlVMTCkgeworICAgIGNvbnRleHQtPmNvcmtfZGF0YS5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICB9IGVsc2UgeworICAgIGlmIChzdHJjbXAoY29udGV4dC0+Y29ya19kYXRhLmZ1bmN0aW9uLCBmdW5jdGlvbikgIT0gMCkgeworICAgICAgTE9HKEZBVEFMLCAic3RhcnRlZCBjb3JraW5nIGRhdGEgaW4gZnVuY3Rpb24gJXMgYnV0IHRoZW4gbW92ZWQgdG8gJXNcbiIsCisgICAgICAgICAgY29udGV4dC0+Y29ya19kYXRhLmZ1bmN0aW9uLCBmdW5jdGlvbik7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWw6OkV4ZWN1dGVGb3JtYXQoY29udGV4dC0+Y29ya19kYXRhLm1lc3NhZ2UgKyBtZXNzYWdlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNvbnRleHQtPmNvcmtfZGF0YS5tZXNzYWdlKSAtIG1lc3NhZ2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGFwKTsKK30KKwordm9pZCBWVW5Db3JrKGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgbG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkgeworICBDb250ZXh0ICpjb250ZXh0ID0gQ29udGV4dDo6R2V0KCk7CisKKyAgVkNvcmsobGluZSwgZnVuY3Rpb24sIGZvcm1hdCwgYXApOworCisgIGxvZ19kbyhsZXZlbCwgIiVzOiAlZC0lZDogJXM6ICVzIiwgZmlsZSwKKyAgICAgICAgIGNvbnRleHQtPmNvcmtfZGF0YS5saW5lX21pbiwgY29udGV4dC0+Y29ya19kYXRhLmxpbmVfbWF4LCBmdW5jdGlvbiwKKyAgICAgICAgIGNvbnRleHQtPmNvcmtfZGF0YS5tZXNzYWdlKTsKKworICBjb250ZXh0LT5jb3JrX2RhdGEuUmVzZXQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGxvZ2dpbmcKK30gIC8vIG5hbWVzcGFjZSBhb3MKKwordm9pZCBsb2dfZG8obG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgYW9zOjpsb2dnaW5nOjpWTG9nKGxldmVsLCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBsb2dfY29yayhpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICBhb3M6OmxvZ2dpbmc6OlZDb3JrKGxpbmUsIGZ1bmN0aW9uLCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBsb2dfdW5jb3JrKGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgbG9nX2xldmVsIGxldmVsLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworICBhb3M6OmxvZ2dpbmc6OlZVbkNvcmsobGluZSwgZnVuY3Rpb24sIGxldmVsLCBmaWxlLCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nX3ByaW50Zl9mb3JtYXRzLmggYi9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19wcmludGZfZm9ybWF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTgzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19wcmludGZfZm9ybWF0cy5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9MT0dHSU5HX0xPR0dJTkdfUFJJTlRGX0ZPUk1BVFNfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9MT0dHSU5HX0xPR0dJTkdfUFJJTlRGX0ZPUk1BVFNfSF8KKworI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisKKy8vIFRoaXMgZmlsZSBoYXMgcHJpbnRmKDMpIGZvcm1hdHMgYW5kIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzIGZvciBwcmludGluZyBvdXQKKy8vIHRpbWVzIGFuZCBsb2cgbWVzc2FnZXMuCisvLyBUaGV5IGFyZSBhbGwgc3BsaXQgb3V0IGFzIG1hY3JvcyBiZWNhdXNlIHRoZXJlIGFyZSAyIHRoaW5ncyB0aGF0IHdhbnQgdG8KKy8vIHByaW50IHVzaW5nIHRoZSBzYW1lIGZvcm1hdDogbG9nX2Rpc3BsYXllciBhbmQgUHJpbnRNZXNzYWdlIGluCisvLyBsb2dnaW5nX2ltcGwuY2MuCisKKyNkZWZpbmUgQU9TX1RJTUVfRk9STUFUIFwKKyAgIiUwMTAiIFBSSWQzMiAiLiUwIiBTVFJJTkdJRlkoQU9TX1RJTUVfTlNFQ09ORFNfRElHSVRTKSBQUklkMzIgInMiCisjZGVmaW5lIEFPU19USU1FX0FSR1Moc2VjLCBuc2VjKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlYywgKG5zZWMgKyAoQU9TX1RJTUVfTlNFQ09ORFNfREVOT01JTkFUT1IgLyAyKSkgLyBcCisgICAgICBBT1NfVElNRV9OU0VDT05EU19ERU5PTUlOQVRPUgorCisjZGVmaW5lIEFPU19MT0dHSU5HX0JBU0VfRk9STUFUIFwKKyAgIiUuKnMoJSIgUFJJZDMyICIpKCUwNSIgUFJJdTE2ICIpOiAlLTdzIGF0ICIgQU9TX1RJTUVfRk9STUFUICI6ICIKKyNkZWZpbmUgQU9TX0xPR0dJTkdfQkFTRV9BUkdTKG5hbWVfbGVuZ3RoLCBuYW1lLCBzb3VyY2UsIHNlcXVlbmNlLCBsZXZlbCwgc2VjLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVfbGVuZ3RoKSwgbmFtZSwgc291cmNlLCBzZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6YW9zOjpsb2dnaW5nOjpsb2dfc3RyKGxldmVsKSwgQU9TX1RJTUVfQVJHUyhzZWMsIG5zZWMpCisKKy8vIFRoZXNlIDIgZGVmaW5lIGhvdyBtYW55IGRpZ2l0cyB3ZSB1c2UgdG8gcHJpbnQgb3V0IHRoZSBuc2Vjb25kcyBmaWVsZHMgb2YKKy8vIHRpbWVzLiBUaGV5IGhhdmUgdG8gc3RheSBtYXRjaGluZy4KKyNkZWZpbmUgQU9TX1RJTUVfTlNFQ09ORFNfRElHSVRTIDYKKyNkZWZpbmUgQU9TX1RJTUVfTlNFQ09ORFNfREVOT01JTkFUT1IgMTAwMAorCisjZW5kaWYgIC8vIEFPU19DT01NT05fTE9HR0lOR19MT0dHSU5HX1BSSU5URl9GT1JNQVRTX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xvZ2dpbmcvbWF0cml4X2xvZ2dpbmctdG1wbC5oIGIvYW9zL2NvbW1vbi9sb2dnaW5nL21hdHJpeF9sb2dnaW5nLXRtcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmMzY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9sb2dnaW5nL21hdHJpeF9sb2dnaW5nLXRtcGwuaApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImFvcy9xdWV1ZV9wcmltaXRpdmVzLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGxvZ2dpbmcgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgRG9Mb2dNYXRyaXgobG9nX2xldmVsIGxldmVsLCBjb25zdCA6OnN0ZDo6c3RyaW5nICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBUICZtYXRyaXgpIHsKKyAgc3RhdGljX2Fzc2VydCghVDo6SXNSb3dNYWpvciwgIndlIG9ubHkgaGFuZGxlIGNvbHVtbi1tYWpvciBzdG9yYWdlIik7CisgIExvZ0ltcGxlbWVudGF0aW9uOjpEb0xvZ01hdHJpeChsZXZlbCwgbWVzc2FnZSwgVHlwZUlEPHR5cGVuYW1lIFQ6OlNjYWxhcj46OmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSwgbWF0cml4LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9sb2dnaW5nL21hdHJpeF9sb2dnaW5nLmNjIGIvYW9zL2NvbW1vbi9sb2dnaW5nL21hdHJpeF9sb2dnaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzMwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL2xvZ2dpbmcvbWF0cml4X2xvZ2dpbmcuY2MKQEAgLTAsMCArMSwzNSBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9tYXRyaXhfbG9nZ2luZy5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90eXBlcy5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBsb2dnaW5nIHsKKwordm9pZCBMb2dJbXBsZW1lbnRhdGlvbjo6RG9Mb2dNYXRyaXgobG9nX2xldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpzdGQ6OnN0cmluZyAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGVfaWQsIGludCByb3dzLCBpbnQgY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZXZlbHMpIHsKKyAgaW50ZXJuYWw6OlJ1bldpdGhDdXJyZW50SW1wbGVtZW50YXRpb24oCisgICAgICBsZXZlbHMsIFsmXShMb2dJbXBsZW1lbnRhdGlvbiAqIGltcGxlbWVudGF0aW9uKSB7CisgICAgaW1wbGVtZW50YXRpb24tPkxvZ01hdHJpeChsZXZlbCwgbWVzc2FnZSwgdHlwZV9pZCwgcm93cywgY29scywgZGF0YSk7CisgIH0pOworCisgIGlmIChsZXZlbCA9PSBGQVRBTCkgeworICAgIGNoYXIgc2VyaWFsaXplZFsxMDI0XTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90Pihyb3dzICogY29scyAqIE1lc3NhZ2VUeXBlOjpTaXplb2YodHlwZV9pZCkpID4KKyAgICAgICAgc2l6ZW9mKHNlcmlhbGl6ZWQpKSB7CisgICAgICBEaWUoIkxPRyhGQVRBTCkgbWF0cml4IHRvbyBiaWcgdG8gc2VyaWFsaXplIik7CisgICAgfQorICAgIFNlcmlhbGl6ZU1hdHJpeCh0eXBlX2lkLCBzZXJpYWxpemVkLCBkYXRhLCByb3dzLCBjb2xzKTsKKyAgICBjaGFyIHByaW50ZWRbTE9HX01FU1NBR0VfTEVOXTsKKyAgICBzaXplX3QgcHJpbnRlZF9ieXRlcyA9IHNpemVvZihwcmludGVkKTsKKyAgICBpZiAoIVByaW50TWF0cml4KHByaW50ZWQsICZwcmludGVkX2J5dGVzLCBzZXJpYWxpemVkLCB0eXBlX2lkLCByb3dzLCBjb2xzKSkgeworICAgICAgRGllKCJMT0coRkFUQUwpIFByaW50TWF0cml4IGNhbGwgZmFpbGVkIik7CisgICAgfQorICAgIERpZSgiJS4qczogJS4qc1xuIiwgc3RhdGljX2Nhc3Q8aW50PihtZXNzYWdlLnNpemUoKSksIG1lc3NhZ2UuZGF0YSgpLAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHByaW50ZWRfYnl0ZXMpLCBwcmludGVkKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9sb2dnaW5nL21hdHJpeF9sb2dnaW5nLmggYi9hb3MvY29tbW9uL2xvZ2dpbmcvbWF0cml4X2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZhYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9sb2dnaW5nL21hdHJpeF9sb2dnaW5nLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX0xPR0dJTkdfTUFUUklYX0xPR0dJTkdfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9MT0dHSU5HX01BVFJJWF9MT0dHSU5HX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9kaWUuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbG9nZ2luZyB7CisKKy8vIExvZ3MgdGhlIGNvbnRlbnRzIG9mIGEgbWF0cml4IGFuZCBhIGNvbnN0YW50IHN0cmluZy4KKy8vIG1hdHJpeCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGFuIEVpZ2VuIG1hdHJpeCAob3Igc29tZXRoaW5nIHNpbWlsYXIpLgorI2RlZmluZSBMT0dfTUFUUklYKGxldmVsLCBtZXNzYWdlLCBtYXRyaXgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBrQW9zTG9nZ2luZ01lc3NhZ2UoICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0dfU09VUkNFTkFNRSAiOiAiIFNUUklOR0lGWShfX0xJTkVfXykgIjogIiBtZXNzYWdlKTsgICAgICBcCisgICAgOjphb3M6OmxvZ2dpbmc6OkRvTG9nTWF0cml4KGxldmVsLCBrQW9zTG9nZ2luZ01lc3NhZ2UsIG1hdHJpeCk7IFwKKyAgICAvKiBzbyB0aGF0IEdDQyBrbm93cyB0aGF0IGl0IHdvbid0IHJldHVybiAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsZXZlbCA9PSBGQVRBTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6OmFvczo6RGllKCJEb0xvZ1N0cnVjdChGQVRBTCkgZmVsbCB0aHJvdWdoISEhISFcbiIpOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIERvTG9nTWF0cml4KGxvZ19sZXZlbCBsZXZlbCwgY29uc3QgOjpzdGQ6OnN0cmluZyAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVCAmbWF0cml4KTsKKworfSAgLy8gbmFtZXNwYWNlIGxvZ2dpbmcKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9tYXRyaXhfbG9nZ2luZy10bXBsLmgiCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9MT0dHSU5HX01BVFJJWF9MT0dHSU5HX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy10bXBsLmggYi9hb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy10bXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhODllNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLXRtcGwuaApAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbG9nZ2luZyB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBEb0xvZ1N0cnVjdChsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IFQgJnN0cnVjdHVyZSkgeworICBMb2dJbXBsZW1lbnRhdGlvbjo6RG9Mb2dTdHJ1Y3QobGV2ZWwsIG1lc3NhZ2UsIFQ6OlNpemUoKSwgVDo6R2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdHJ1Y3R1cmVdKGNoYXIgKiBidWZmZXIpLT5zaXplX3R7CisgICAgcmV0dXJuIHN0cnVjdHVyZS5TZXJpYWxpemUoYnVmZmVyKTsKKyAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuY2MgYi9hb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTk2YzI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuY2MKQEAgLTAsMCArMSwzNSBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90eXBlcy5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBsb2dnaW5nIHsKKwordm9pZCBMb2dJbXBsZW1lbnRhdGlvbjo6RG9Mb2dTdHJ1Y3QoCisgICAgbG9nX2xldmVsIGxldmVsLCBjb25zdCA6OnN0ZDo6c3RyaW5nICZtZXNzYWdlLCBzaXplX3Qgc2l6ZSwKKyAgICBjb25zdCBNZXNzYWdlVHlwZSAqdHlwZSwgY29uc3QgOjpzdGQ6OmZ1bmN0aW9uPHNpemVfdChjaGFyICopPiAmc2VyaWFsaXplLAorICAgIGludCBsZXZlbHMpIHsKKyAgaW50ZXJuYWw6OlJ1bldpdGhDdXJyZW50SW1wbGVtZW50YXRpb24oCisgICAgICBsZXZlbHMsIFsmXShMb2dJbXBsZW1lbnRhdGlvbiAqIGltcGxlbWVudGF0aW9uKSB7CisgICAgaW1wbGVtZW50YXRpb24tPkxvZ1N0cnVjdChsZXZlbCwgbWVzc2FnZSwgc2l6ZSwgdHlwZSwgc2VyaWFsaXplKTsKKyAgfSk7CisKKyAgaWYgKGxldmVsID09IEZBVEFMKSB7CisgICAgY2hhciBzZXJpYWxpemVkWzEwMjRdOworICAgIGlmIChzaXplID4gc2l6ZW9mKHNlcmlhbGl6ZWQpKSB7CisgICAgICBEaWUoIkxPRyhGQVRBTCkgc3RydWN0dXJlIHRvbyBiaWcgdG8gc2VyaWFsaXplIik7CisgICAgfQorICAgIHNpemVfdCB1c2VkID0gc2VyaWFsaXplKHNlcmlhbGl6ZWQpOworICAgIGNoYXIgcHJpbnRlZFtMT0dfTUVTU0FHRV9MRU5dOworICAgIHNpemVfdCBwcmludGVkX2J5dGVzID0gc2l6ZW9mKHByaW50ZWQpOworICAgIGlmICghUHJpbnRNZXNzYWdlKHByaW50ZWQsICZwcmludGVkX2J5dGVzLCBzZXJpYWxpemVkLCAmdXNlZCwgKnR5cGUpKSB7CisgICAgICBEaWUoIkxPRyhGQVRBTCkgUHJpbnRNZXNzYWdlIGNhbGwgZmFpbGVkIik7CisgICAgfQorICAgIERpZSgiJS4qczogJS4qc1xuIiwgc3RhdGljX2Nhc3Q8aW50PihtZXNzYWdlLnNpemUoKSksIG1lc3NhZ2UuZGF0YSgpLAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHByaW50ZWRfYnl0ZXMpLCBwcmludGVkKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuaCBiL2Fvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwMTY3YQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX0xPR0dJTkdfUVVFVUVfTE9HR0lOR19IXworI2RlZmluZSBBT1NfQ09NTU9OX0xPR0dJTkdfUVVFVUVfTE9HR0lOR19IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9kaWUuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbG9nZ2luZyB7CisKKy8vIExvZ3MgdGhlIGNvbnRlbnRzIG9mIGEgc3RydWN0dXJlIChvciBRdWV1ZSBtZXNzYWdlKSBhbmQgYSBjb25zdGFudCBzdHJpbmcuCisvLyBzdHJ1Y3R1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBxdWV1ZSB0eXBlcy4KKyNkZWZpbmUgTE9HX1NUUlVDVChsZXZlbCwgbWVzc2FnZSwgc3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcga0Fvc0xvZ2dpbmdNZXNzYWdlKCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9HX1NPVVJDRU5BTUUgIjogIiBTVFJJTkdJRlkoX19MSU5FX18pICI6ICIgbWVzc2FnZSk7ICAgICAgICAgXAorICAgIDo6YW9zOjpsb2dnaW5nOjpEb0xvZ1N0cnVjdChsZXZlbCwga0Fvc0xvZ2dpbmdNZXNzYWdlLCBzdHJ1Y3R1cmUpOyBcCisgICAgLyogc28gdGhhdCBHQ0Mga25vd3MgdGhhdCBpdCB3b24ndCByZXR1cm4gKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGV2ZWwgPT0gRkFUQUwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOjphb3M6OkRpZSgiRG9Mb2dTdHJ1Y3QoRkFUQUwpIGZlbGwgdGhyb3VnaCEhISEhXG4iKTsgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoZmFsc2UpCisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBEb0xvZ1N0cnVjdChsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IFQgJnN0cnVjdHVyZSk7CisKK30gIC8vIG5hbWVzcGFjZSBsb2dnaW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy10bXBsLmgiCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9MT0dHSU5HX1FVRVVFX0xPR0dJTkdfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbWFjcm9zLmggYi9hb3MvY29tbW9uL21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTU4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL21hY3Jvcy5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgX0FPU19DT01NT05fTUFDUk9TX0hfCisjZGVmaW5lIF9BT1NfQ09NTU9OX01BQ1JPU19IXworCisvLyBUaGlzIGZpbGUgaGFzIHNvbWUgY29tbW9uIG1hY3JvcyBldGMuCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgdGhlIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPSBmdW5jdGlvbnMKKy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHByaXZhdGU6IGRlY2xhcmF0aW9ucyBmb3IgYSBjbGFzcworI2RlZmluZSBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGUKKworLy8gQSBtYWNybyB0byB3cmFwIGFyZ3VtZW50cyB0byBtYWNyb3MgdGhhdCBjb250YWluIGNvbW1hcy4KKy8vIFVzZWZ1bCBmb3IgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOaW5nIHRlbXBsYXRlZCB0eXBlcyB3aXRoIG11bHRpcGxlIHRlbXBsYXRlCisvLyBhcmd1bWVudHMuCisjZGVmaW5lIE1BQ1JPX0FSRyguLi4pIF9fVkFfQVJHU19fCisvLyBEb3VibGUtd3JhcHMgbWFjcm8gYXJndW1lbnRzLgorLy8gTmVjZXNzYXJ5IHRvIHVzZSBjb21tYXMgaW4gZ3Rlc3QgcHJlZGljYXRlIGFyZ3VtZW50cy4KKyNkZWZpbmUgTUFDUk9fREFSRyguLi4pIChfX1ZBX0FSR1NfXykKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFVOVVNFRF9WQVJJQUJMRSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9WQVJJQUJMRQorI2VuZGlmCisKKyNkZWZpbmUgU1RSSU5HSUZZKHgpIFRPX1NUUklORyh4KQorI2RlZmluZSBUT19TVFJJTkcoeCkgI3gKKworI2lmZGVmIF9fVlhXT1JLU19fCisvLyBXZSdyZSB1c2luZyBhbmNpZW50IGdsaWJjLCBzbyBzdGlja2luZyB0byBqdXN0IHdoYXQgdGhlIHN5c2NhbGwgY2FuIGhhbmRsZSBpcworLy8gcHJvYmFibHkgc2FmZXIuCisjZGVmaW5lIEdPT0RfUFJJTlRGX0ZPUk1BVF9UWVBFIHByaW50ZgorI2Vsc2UKKyNpZmRlZiBfX2NsYW5nX18KKyNkZWZpbmUgR09PRF9QUklOVEZfRk9STUFUX1RZUEUgX19wcmludGZfXworI2Vsc2UKKyNkZWZpbmUgR09PRF9QUklOVEZfRk9STUFUX1RZUEUgZ251X3ByaW50ZgorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmICAvLyBfQU9TX0NPTU1PTl9NQUNST1NfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbWVzc2FnZXMvbWVzc2FnZXMuZ3lwIGIvYW9zL2NvbW1vbi9tZXNzYWdlcy9tZXNzYWdlcy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzMzZiOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbWVzc2FnZXMvbWVzc2FnZXMuZ3lwCkBAIC0wLDAgKzEsMTUgQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3JvYm90X3N0YXRlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAncm9ib3Rfc3RhdGUucScsCisgICAgICBdLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9wYXRoJzogJ2Fvcy9jb21tb24vbWVzc2FnZXMnLAorICAgICAgfSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vYnVpbGQvcXVldWVzLmd5cGknXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9tZXNzYWdlcy9yb2JvdF9zdGF0ZS5xIGIvYW9zL2NvbW1vbi9tZXNzYWdlcy9yb2JvdF9zdGF0ZS5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlY2I2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL21lc3NhZ2VzL3JvYm90X3N0YXRlLnEKQEAgLTAsMCArMSw2NyBAQAorcGFja2FnZSBhb3M7CisKK3N0cnVjdCBKb3lzdGljayB7CisgIC8vIEEgYml0bWFzayBvZiB0aGUgYnV0dG9uIHN0YXRlLgorICB1aW50MTZfdCBidXR0b25zOworCisgIC8vIFRoZSA0IGpveXN0aWNrIGF4ZXMuCisgIGRvdWJsZVs0XSBheGlzOworCisgIC8vIFRoZSBQT1YgYXhpcy4KKyAgaW50MzJfdCBwb3Y7Cit9OworCittZXNzYWdlIEpveXN0aWNrU3RhdGUgeworICBKb3lzdGlja1s0XSBqb3lzdGlja3M7CisKKyAgYm9vbCB0ZXN0X21vZGU7CisgIGJvb2wgZm1zX2F0dGFjaGVkOworICBib29sIGVuYWJsZWQ7CisgIGJvb2wgYXV0b25vbW91czsKKyAgdWludDE2X3QgdGVhbV9pZDsKKworICAvLyBJZiB0aGlzIGlzIHRydWUsIHRoZW4gdGhpcyBtZXNzYWdlIGlzbid0IGFjdHVhbGx5IGZyb20gdGhlIGNvbnRyb2wKKyAgLy8gc3lzdGVtIGFuZCBzbyBzaG91bGQgbm90IGJlIHRydXN0ZWQgYXMgZXZpZGVuY2UgdGhhdCB0aGUgYnV0dG9uIGlucHV0cworICAvLyBldGMgYXJlIGFjdHVhbGx5IHJlYWwgYW5kIHNob3VsZCBiZSBhY3RlZCBvbi4KKyAgLy8gSG93ZXZlciwgbW9zdCB0aGluZ3Mgc2hvdWxkIGlnbm9yZSB0aGlzIHNvIHRoYXQgc2VuZGluZyBmYWtlIG1lc3NhZ2VzIGlzCisgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZy4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpbiBiZWhhdmlvciBzaG91bGQgYmUgbW90b3JzIG5vdAorICAvLyBhY3R1YWxseSB0dXJuaW5nIG9uLgorICBib29sIGZha2U7Cit9OworCisvLyBUaGlzIHF1ZXVlIGlzIGNoZWNrZWQgYnkgYWxsIGNvbnRyb2wgbG9vcHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCisvLyBqb3lzdGljayBjb2RlIGhhc24ndCBkaWVkLgorcXVldWUgSm95c3RpY2tTdGF0ZSBqb3lzdGlja19zdGF0ZTsKKworbWVzc2FnZSBSb2JvdFN0YXRlIHsKKyAgLy8gVGhlIFBJRCBvZiB0aGUgcHJvY2VzcyByZWFkaW5nIHNlbnNvcnMuCisgIC8vIFRoaXMgaXMgaGVyZSBzbyBjb250cm9sIGxvb3BzIGNhbiB0ZWxsIHdoZW4gaXQgY2hhbmdlcy4KKyAgaW50MzJfdCByZWFkZXJfcGlkOworCisgIC8vIFRydWUgd2hlbiBvdXRwdXRzIGFyZSBlbmFibGVkLgorICAvLyBNb3RvciBjb250cm9sbGVycyBrZWVwIGdvaW5nIGZvciBhIGJpdCBhZnRlciB0aGlzIGdvZXMgdG8gZmFsc2UuCisgIGJvb2wgb3V0cHV0c19lbmFibGVkOworICAvLyBJbmRpY2F0ZXMgd2hldGhlciBzb21ldGhpbmcgaXMgYnJvd25lZCBvdXQgKEkgdGhpbmsgbW90b3IgY29udHJvbGxlcgorICAvLyBvdXRwdXRzKS4gSU1QT1JUQU5UOiBUaGlzIGlzIE5PVCAhb3V0cHV0c19lbmFibGVkLiBvdXRwdXRzX2VuYWJsZWQgZ29lcyB0bworICAvLyBmYWxzZSBmb3Igb3RoZXIgcmVhc29ucyB0b28gKGRpc2FibGVkLCBlLXN0b3BwZWQsIG1heWJlIG1vcmUpLgorICBib29sIGJyb3duZWRfb3V0OworCisgIC8vIFdoZXRoZXIgdGhlIHR3byBzZW5zb3IgcmFpbHMgYXJlIGN1cnJlbnRseSB3b3JraW5nLgorICBib29sIGlzXzN2M19hY3RpdmU7CisgIGJvb2wgaXNfNXZfYWN0aXZlOworICAvLyBUaGUgY3VycmVudCB2b2x0YWdlcyBtZWFzdXJlZCBvbiB0aGUgdHdvIHNlbnNvciByYWlscy4KKyAgZG91YmxlIHZvbHRhZ2VfM3YzOworICBkb3VibGUgdm9sdGFnZV81djsKKworICAvLyBUaGUgaW5wdXQgdm9sdGFnZSB0byB0aGUgcm9ib1JJTy4KKyAgZG91YmxlIHZvbHRhZ2Vfcm9ib3Jpb19pbjsKKworICAvLyBGcm9tIHRoZSBEcml2ZXJTdGF0aW9uIG9iamVjdCwgYWthIHdoYXQgRk1TIHNlZXMgYW5kIHdoYXQgc2hvd3MgdXAgb24gdGhlCisgIC8vIGFjdHVhbCBkcml2ZXIncyBzdGF0aW9uLgorICBkb3VibGUgdm9sdGFnZV9iYXR0ZXJ5OworfTsKKworLy8gTWVzc2FnZXMgYXJlIHNlbnQgb3V0IG9uIHRoaXMgcXVldWUgYWxvbmcgd2l0aCByZWFkaW5nIHNlbnNvcnMuIEl0IGNvbnRhaW5zCisvLyBnbG9iYWwgcm9ib3Qgc3RhdGUgYW5kIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgdGhlIHByb2Nlc3MgcmVhZGluZyBzZW5zb3JzCisvLyBoYXMgYmVlbiByZXN0YXJ0ZWQsIGFsb25nIHdpdGggYWxsIGNvdW50ZXJzIGV0YyBpdCBrZWVwcyB0cmFjayBvZi4KK3F1ZXVlIFJvYm90U3RhdGUgcm9ib3Rfc3RhdGU7CmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL211dGV4LmggYi9hb3MvY29tbW9uL211dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzNWIxMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbXV0ZXguaApAQCAtMCwwICsxLDE0NCBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX01VVEVYX0hfCisjZGVmaW5lIEFPU19DT01NT05fTVVURVhfSF8KKworI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9hb3Nfc3luYy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisKK25hbWVzcGFjZSBhb3MgeworCitjbGFzcyBDb25kaXRpb247CisKKy8vIEFuIGFic3RyYWN0aW9uIG9mIGEgbXV0ZXggdGhhdCBpcyBlYXN5IHRvIGltcGxlbWVudCBmb3IgZW52aXJvbm1lbnRzIG90aGVyCisvLyB0aGFuIExpbnV4IHRvby4KKy8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIG9yIHByb2Nlc3NlcyBjb250ZW5kaW5nIGZvciB0aGUgbXV0ZXgsCisvLyBoaWdoZXIgcHJpb3JpdHkgb25lcyB3aWxsIHN1Y2NlZWQgaW4gbG9ja2luZyBmaXJzdCwKKy8vIGFuZCB0YXNrcyBvZiBlcXVhbCBwcmlvcml0aWVzIGhhdmUgdGhlIHNhbWUgY2hhbmNlIG9mIGdldHRpbmcgdGhlIGxvY2suCisvLyBUbyBkZWFsIHdpdGggcHJpb3JpdHkgaW52ZXJzaW9uLCB0aGUgbGludXggaW1wbGVtZW50YXRpb24gZG9lcyBwcmlvcml0eQorLy8gaW5oZXJpdGFuY2UuCisvLyBCZWZvcmUgZGVzdHJveWluZyBhIG11dGV4LCBpdCBpcyBpbXBvcnRhbnQgdG8gbWFrZSBzdXJlIGl0IGlzbid0IGxvY2tlZC4KKy8vIE90aGVyd2lzZSwgdGhlIGRlc3RydWN0b3Igd2lsbCBMT0coRkFUQUwpLgorY2xhc3MgTXV0ZXggeworIHB1YmxpYzoKKyAgLy8gU3RhdGVzIHRoYXQgc2lnbmlmeSB0aGUgcmVzdWx0IG9mIFRyeUxvY2suCisgIGVudW0gY2xhc3MgU3RhdGUgeworICAgIC8vIFRoZSBtdXRleCB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5LgorICAgIGtMb2NrZWQsCisgICAgLy8gVHJ5TG9jayB0cmllZCB0byBncmFiIHRoZSBtdXRleCBhbmQgZmFpbGVkLgorICAgIGtMb2NrRmFpbGVkCisgIH07CisKKyAgLy8gQ3JlYXRlcyBhbiB1bmxvY2tlZCBtdXRleC4KKyAgTXV0ZXgoKTsKKyAgLy8gVmVyaWZpZXMgdGhhdCBpdCBpc24ndCBsb2NrZWQuCisgIC8vCisgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgZnJlZWluZyBhIGxvY2tlZCBtdXRleCBtZWFucyB0aGVyZSBpcyBmcmVlZAorICAvLyBtZW1vcnkgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcm9idXN0IGxpc3QsIHdoaWNoIGJyZWFrcyB0aGluZ3MgaG9ycmlibHkuCisgIH5NdXRleCgpOworCisgIC8vIExvY2tzIHRoZSBtdXRleC4gSWYgaXQgZmFpbHMsIGl0IGNhbGxzIExPRyhGQVRBTCkuCisgIC8vIFJldHVybnMgZmFsc2UuCisgIGJvb2wgTG9jaygpIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworICAvLyBVbmxvY2tzIHRoZSBtdXRleC4gRmFpbHMgbGlrZSBMb2NrLgorICAvLyBNdWx0aXBsZSB1bmxvY2tpbmcgaXMgdW5kZWZpbmVkLgorICB2b2lkIFVubG9jaygpOworICAvLyBMb2NrcyB0aGUgbXV0ZXggdW5sZXNzIGl0IGlzIGFscmVhZHkgbG9ja2VkLgorICAvLyBSZXR1cm5zIHRoZSBuZXcgc3RhdGUgb2YgdGhlIG11dGV4LgorICAvLyBEb2Vzbid0IHdhaXQgZm9yIHRoZSBtdXRleCB0byBiZSB1bmxvY2tlZCBpZiBpdCBpcyBsb2NrZWQuCisgIFN0YXRlIFRyeUxvY2soKSBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRhc2sgaGFzIHRoaXMgbXV0ZXggbG9ja2VkLgorICAvLyBUaGlzIGlzIG1haW5seSBmb3IgSVBDUmVjdXJzaXZlTXV0ZXhMb2NrZXIgdG8gdXNlLgorICBib29sIE93bmVkQnlTZWxmKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBhb3NfbXV0ZXggaW1wbF87CisKKyAgZnJpZW5kIGNsYXNzIENvbmRpdGlvbjsgIC8vIGZvciBhY2Nlc3MgdG8gaW1wbF8KK307CisKKy8vIEEgY2xhc3MgdGhhdCBsb2NrcyBhIE11dGV4IHdoZW4gY29uc3RydWN0ZWQgYW5kIHVubG9ja3MgaXQgd2hlbiBkZXN0cnVjdGVkLgorLy8gRGVzaWduZWQgdG8gYmUgdXNlZCBhcyBhIGxvY2FsIHZhcmlhYmxlIHNvIHRoYXQKKy8vIHRoZSBtdXRleCB3aWxsIGJlIHVubG9ja2VkIHdoZW4gdGhlIHNjb3BlIGlzIGV4aXRlZC4KKy8vIFRoaXMgb25lIGltbWVkaWF0ZWx5IERpZXMgaWYgdGhlIHByZXZpb3VzIG93bmVyIGRpZWQuIFRoaXMgbWFrZXMgaXQgYSBnb29kCisvLyBjaG9pY2UgZm9yIG11dGV4ZXMgdGhhdCBhcmUgb25seSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzLCBidXQgTk9UIGZvcgorLy8gbXV0ZXhlcyBzaGFyZWQgYnkgbXVsdGlwbGUgcHJvY2Vzc2VzLiBGb3IgdGhvc2UsIHVzZSBJUENNdXRleExvY2tlci4KK2NsYXNzIE11dGV4TG9ja2VyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE11dGV4TG9ja2VyKE11dGV4ICptdXRleCkgOiBtdXRleF8obXV0ZXgpIHsKKyAgICBpZiAoX19idWlsdGluX2V4cGVjdChtdXRleF8tPkxvY2soKSwgZmFsc2UpKSB7CisgICAgICA6OmFvczo6RGllKCJwcmV2aW91cyBvd25lciBvZiBtdXRleCAlcCBkaWVkIGJ1dCBpdCBzaG91bGRuJ3QgYmUgYWJsZSB0byIsCisgICAgICAgICAgICAgICAgIHRoaXMpOworICAgIH0KKyAgfQorICB+TXV0ZXhMb2NrZXIoKSB7CisgICAgbXV0ZXhfLT5VbmxvY2soKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXggKmNvbnN0IG11dGV4XzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTXV0ZXhMb2NrZXIpOworfTsKKworLy8gQSB2ZXJzaW9uIG9mIE11dGV4TG9ja2VyIHdoaWNoIHJlcG9ydHMgdGhlIHByZXZpb3VzIG93bmVyIGR5aW5nIGluc3RlYWQgb2YKKy8vIGltbWVkaWF0ZWx5IExPRyhGQVRBTClpbmcuCitjbGFzcyBJUENNdXRleExvY2tlciB7CisgcHVibGljOgorICBleHBsaWNpdCBJUENNdXRleExvY2tlcihNdXRleCAqbXV0ZXgpCisgICAgICA6IG11dGV4XyhtdXRleCksIG93bmVyX2RpZWRfKG11dGV4Xy0+TG9jaygpKSB7fQorICB+SVBDTXV0ZXhMb2NrZXIoKSB7CisgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoIW93bmVyX2RpZWRfY2hlY2tlZF8sIGZhbHNlKSkgeworICAgICAgOjphb3M6OkRpZSgibm9ib2R5IGNoZWNrZWQgaWYgdGhlIHByZXZpb3VzIG93bmVyIG9mIG11dGV4ICVwIGRpZWQiLCB0aGlzKTsKKyAgICB9CisgICAgbXV0ZXhfLT5VbmxvY2soKTsKKyAgfQorCisgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBwcmV2aW91cyBvd25lciBkaWVkLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQgYXQgbGVhc3QKKyAgLy8gb25jZSwgdGhlIGRlc3RydWN0b3Igd2lsbCA6OmFvczo6RGllLgorICBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKSBib29sIG93bmVyX2RpZWQoKSB7CisgICAgb3duZXJfZGllZF9jaGVja2VkXyA9IHRydWU7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9leHBlY3Qob3duZXJfZGllZF8sIGZhbHNlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXggKmNvbnN0IG11dGV4XzsKKyAgY29uc3QgYm9vbCBvd25lcl9kaWVkXzsKKyAgYm9vbCBvd25lcl9kaWVkX2NoZWNrZWRfID0gZmFsc2U7CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKElQQ011dGV4TG9ja2VyKTsKK307CisKKy8vIEEgdmVyc2lvbiBvZiBJUENNdXRleExvY2tlciB3aGljaCBvbmx5IGxvY2tzIChhbmQgdW5sb2NrcykgdGhlIG11dGV4IGlmIHRoZQorLy8gY3VycmVudCB0YXNrIGRvZXMgbm90IGFscmVhZHkgaG9sZCBpdC4KK2NsYXNzIElQQ1JlY3Vyc2l2ZU11dGV4TG9ja2VyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IElQQ1JlY3Vyc2l2ZU11dGV4TG9ja2VyKE11dGV4ICptdXRleCkKKyAgICAgIDogbXV0ZXhfKG11dGV4KSwKKyAgICAgICAgbG9ja2VkXyghbXV0ZXhfLT5Pd25lZEJ5U2VsZigpKSwKKyAgICAgICAgb3duZXJfZGllZF8obG9ja2VkXyA/IG11dGV4Xy0+TG9jaygpIDogZmFsc2UpIHt9CisgIH5JUENSZWN1cnNpdmVNdXRleExvY2tlcigpIHsKKyAgICBpZiAoX19idWlsdGluX2V4cGVjdCghb3duZXJfZGllZF9jaGVja2VkXywgZmFsc2UpKSB7CisgICAgICA6OmFvczo6RGllKCJub2JvZHkgY2hlY2tlZCBpZiB0aGUgcHJldmlvdXMgb3duZXIgb2YgbXV0ZXggJXAgZGllZCIsIHRoaXMpOworICAgIH0KKyAgICBpZiAobG9ja2VkXykgbXV0ZXhfLT5VbmxvY2soKTsKKyAgfQorCisgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBwcmV2aW91cyBvd25lciBkaWVkLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQgYXQgbGVhc3QKKyAgLy8gb25jZSwgdGhlIGRlc3RydWN0b3Igd2lsbCA6OmFvczo6RGllLgorICBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKSBib29sIG93bmVyX2RpZWQoKSB7CisgICAgb3duZXJfZGllZF9jaGVja2VkXyA9IHRydWU7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9leHBlY3Qob3duZXJfZGllZF8sIGZhbHNlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXggKmNvbnN0IG11dGV4XzsKKyAgY29uc3QgYm9vbCBsb2NrZWRfLCBvd25lcl9kaWVkXzsKKyAgYm9vbCBvd25lcl9kaWVkX2NoZWNrZWRfID0gZmFsc2U7CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKElQQ1JlY3Vyc2l2ZU11dGV4TG9ja2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX01VVEVYX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL211dGV4X3Rlc3QuY2MgYi9hb3MvY29tbW9uL211dGV4X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxNGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbXV0ZXhfdGVzdC5jYwpAQCAtMCwwICsxLDI3MyBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vbXV0ZXguaCIKKworI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL2Fvc19zeW5jLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9kaWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvZGVhdGhfdGVzdF9sb2dfaW1wbGVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvdGhyZWFkLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL2NvcmVfbGliLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNdXRleFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIE11dGV4IHRlc3RfbXV0ZXhfOworCisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6OkVuYWJsZVRlc3RMb2dnaW5nKCk7CisgICAgU2V0RGllVGVzdE1vZGUodHJ1ZSk7CisgIH0KK307CisKK3R5cGVkZWYgTXV0ZXhUZXN0IE11dGV4RGVhdGhUZXN0OwordHlwZWRlZiBNdXRleFRlc3QgTXV0ZXhMb2NrZXJUZXN0OwordHlwZWRlZiBNdXRleFRlc3QgTXV0ZXhMb2NrZXJEZWF0aFRlc3Q7Cit0eXBlZGVmIE11dGV4VGVzdCBJUENNdXRleExvY2tlclRlc3Q7Cit0eXBlZGVmIE11dGV4VGVzdCBJUENNdXRleExvY2tlckRlYXRoVGVzdDsKK3R5cGVkZWYgTXV0ZXhUZXN0IElQQ1JlY3Vyc2l2ZU11dGV4TG9ja2VyVGVzdDsKKworVEVTVF9GKE11dGV4VGVzdCwgVHJ5TG9jaykgeworICBFWFBFQ1RfRVEoTXV0ZXg6OlN0YXRlOjprTG9ja2VkLCB0ZXN0X211dGV4Xy5UcnlMb2NrKCkpOworICBFWFBFQ1RfRVEoTXV0ZXg6OlN0YXRlOjprTG9ja0ZhaWxlZCwgdGVzdF9tdXRleF8uVHJ5TG9jaygpKTsKKworICB0ZXN0X211dGV4Xy5VbmxvY2soKTsKK30KKworVEVTVF9GKE11dGV4VGVzdCwgTG9jaykgeworICBBU1NFUlRfRkFMU0UodGVzdF9tdXRleF8uTG9jaygpKTsKKyAgRVhQRUNUX0VRKE11dGV4OjpTdGF0ZTo6a0xvY2tGYWlsZWQsIHRlc3RfbXV0ZXhfLlRyeUxvY2soKSk7CisKKyAgdGVzdF9tdXRleF8uVW5sb2NrKCk7Cit9CisKK1RFU1RfRihNdXRleFRlc3QsIFVubG9jaykgeworICBBU1NFUlRfRkFMU0UodGVzdF9tdXRleF8uTG9jaygpKTsKKyAgRVhQRUNUX0VRKE11dGV4OjpTdGF0ZTo6a0xvY2tGYWlsZWQsIHRlc3RfbXV0ZXhfLlRyeUxvY2soKSk7CisgIHRlc3RfbXV0ZXhfLlVubG9jaygpOworICBFWFBFQ1RfRVEoTXV0ZXg6OlN0YXRlOjprTG9ja2VkLCB0ZXN0X211dGV4Xy5UcnlMb2NrKCkpOworCisgIHRlc3RfbXV0ZXhfLlVubG9jaygpOworfQorCisvLyBTZWVzIHdoYXQgaGFwcGVucyB3aXRoIG11bHRpcGxlIHVubG9ja3MuCitURVNUX0YoTXV0ZXhEZWF0aFRlc3QsIFJlcGVhdFVubG9jaykgeworICBsb2dnaW5nOjpJbml0KCk7CisgIEFTU0VSVF9GQUxTRSh0ZXN0X211dGV4Xy5Mb2NrKCkpOworICB0ZXN0X211dGV4Xy5VbmxvY2soKTsKKyAgRVhQRUNUX0RFQVRIKAorICAgICAgeworICAgICAgICBsb2dnaW5nOjpBZGRJbXBsZW1lbnRhdGlvbihuZXcgdXRpbDo6RGVhdGhUZXN0TG9nSW1wbGVtZW50YXRpb24oKSk7CisgICAgICAgIHRlc3RfbXV0ZXhfLlVubG9jaygpOworICAgICAgfSwKKyAgICAgICIuKm11bHRpcGxlIHVubG9jay4qIik7Cit9CisKKy8vIFNlZXMgd2hhdCBoYXBwZW5zIGlmIHlvdSB1bmxvY2sgd2l0aG91dCBldmVyIGxvY2tpbmcgKG9yIHVubG9ja2luZykgaXQuCitURVNUX0YoTXV0ZXhEZWF0aFRlc3QsIE5ldmVyTG9jaykgeworICBsb2dnaW5nOjpJbml0KCk7CisgIEVYUEVDVF9ERUFUSCgKKyAgICAgIHsKKyAgICAgICAgbG9nZ2luZzo6QWRkSW1wbGVtZW50YXRpb24obmV3IHV0aWw6OkRlYXRoVGVzdExvZ0ltcGxlbWVudGF0aW9uKCkpOworICAgICAgICB0ZXN0X211dGV4Xy5VbmxvY2soKTsKKyAgICAgIH0sCisgICAgICAiLiptdWx0aXBsZSB1bmxvY2suKiIpOworfQorCisvLyBTZWVzIHdoYXQgaGFwcGVucyB3aXRoIG11bHRpcGxlIGxvY2tzLgorVEVTVF9GKE11dGV4RGVhdGhUZXN0LCBSZXBlYXRMb2NrKSB7CisgIEVYUEVDVF9ERUFUSCgKKyAgICAgIHsKKyAgICAgICAgbG9nZ2luZzo6QWRkSW1wbGVtZW50YXRpb24obmV3IHV0aWw6OkRlYXRoVGVzdExvZ0ltcGxlbWVudGF0aW9uKCkpOworICAgICAgICBBU1NFUlRfRkFMU0UodGVzdF9tdXRleF8uTG9jaygpKTsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKHRlc3RfbXV0ZXhfLkxvY2soKSk7CisgICAgICB9LAorICAgICAgIi4qbXVsdGlwbGUgbG9jay4qIik7Cit9CisKK1RFU1RfRihNdXRleERlYXRoVGVzdCwgRGVzdHJveUxvY2tlZCkgeworICBFWFBFQ1RfREVBVEgoCisgICAgICB7CisgICAgICAgIGxvZ2dpbmc6OkFkZEltcGxlbWVudGF0aW9uKG5ldyB1dGlsOjpEZWF0aFRlc3RMb2dJbXBsZW1lbnRhdGlvbigpKTsKKyAgICAgICAgTXV0ZXggbmV3X211dGV4OworICAgICAgICBBU1NFUlRfRkFMU0UobmV3X211dGV4LkxvY2soKSk7CisgICAgICB9LAorICAgICAgIi4qZGVzdHJveWluZyBsb2NrZWQgbXV0ZXguKiIpOworfQorCituYW1lc3BhY2UgeworCitjbGFzcyBBZGRlclRocmVhZCA6IHB1YmxpYyA6OmFvczo6dXRpbDo6VGhyZWFkIHsKKyBwdWJsaWM6CisgIEFkZGVyVGhyZWFkKGludCAqY291bnRlciwgTXV0ZXggKm11dGV4LCA6OmFvczo6dGltZTo6VGltZSBzbGVlcF9iZWZvcmVfdGltZSwKKyAgICAgICAgICAgICAgOjphb3M6OnRpbWU6OlRpbWUgc2xlZXBfYWZ0ZXJfdGltZSkKKyAgICAgIDogY291bnRlcl8oY291bnRlciksCisgICAgICAgIG11dGV4XyhtdXRleCksCisgICAgICAgIHNsZWVwX2JlZm9yZV90aW1lXyhzbGVlcF9iZWZvcmVfdGltZSksCisgICAgICAgIHNsZWVwX2FmdGVyX3RpbWVfKHNsZWVwX2FmdGVyX3RpbWUpIHt9CisgIHZpcnR1YWwgdm9pZCBSdW4oKSBvdmVycmlkZSB7CisgICAgOjphb3M6OnRpbWU6OlNsZWVwRm9yKHNsZWVwX2JlZm9yZV90aW1lXyk7CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG11dGV4Xyk7CisgICAgKysoKmNvdW50ZXJfKTsKKyAgICA6OmFvczo6dGltZTo6U2xlZXBGb3Ioc2xlZXBfYWZ0ZXJfdGltZV8pOworICB9CisKKyBwcml2YXRlOgorICBpbnQgKmNvbnN0IGNvdW50ZXJfOworICBNdXRleCAqY29uc3QgbXV0ZXhfOworICBjb25zdCA6OmFvczo6dGltZTo6VGltZSBzbGVlcF9iZWZvcmVfdGltZV8sIHNsZWVwX2FmdGVyX3RpbWVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFZlcmlmaWVzIHRoYXQgVGhyZWFkU2FuaXRpemVyIHVuZGVyc3RhbmRzIHRoYXQgYSBjb250ZW5kZWQgbXV0ZXggZXN0YWJsaXNoZXMKKy8vIGEgaGFwcGVucy1iZWZvcmUgcmVsYXRpb25zaGlwLgorVEVTVF9GKE11dGV4VGVzdCwgVGhyZWFkU2FuaXRpemVyQ29udGVuZGVkKSB7CisgIGludCBjb3VudGVyID0gMDsKKyAgQWRkZXJUaHJlYWQgdGhyZWFkc1syXXsKKyAgICAgIHsmY291bnRlciwgJnRlc3RfbXV0ZXhfLCA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMiksCisgICAgICAgOjphb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcygwKX0sCisgICAgICB7JmNvdW50ZXIsICZ0ZXN0X211dGV4XywgOjphb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcygwKSwKKyAgICAgICA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDApfSwgfTsKKyAgZm9yIChhdXRvICZjIDogdGhyZWFkcykgeworICAgIGMuU3RhcnQoKTsKKyAgfQorICBmb3IgKGF1dG8gJmMgOiB0aHJlYWRzKSB7CisgICAgYy5XYWl0VW50aWxEb25lKCk7CisgIH0KKyAgRVhQRUNUX0VRKDIsIGNvdW50ZXIpOworfQorCisvLyBWZXJpZmllcnMgdGhhdCBUaHJlYWRTYW5pdGl6ZXIgdW5kZXJzdGFuZHMgaG93IGEgbXV0ZXggd29ya3MuCisvLyBGb3Igc29tZSByZWFzb24gdGhpcyB1c2VkIHRvIGZhaWwgd2hlbiB0aGUgb3RoZXIgdGVzdHMgZGlkbid0Li4uCitURVNUX0YoTXV0ZXhUZXN0LCBUaHJlYWRTYW5pdGl6ZXJNdXRleExvY2tlcikgeworICBpbnQgY291bnRlciA9IDA7CisgIDo6c3RkOjp0aHJlYWQgdGhyZWFkKFsmY291bnRlciwgdGhpc10oKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKyAgICAgIE11dGV4TG9ja2VyIGxvY2tlcigmdGVzdF9tdXRleF8pOworICAgICAgKytjb3VudGVyOworICAgIH0KKyAgfSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKCZ0ZXN0X211dGV4Xyk7CisgICAgLS1jb3VudGVyOworICB9CisgIHRocmVhZC5qb2luKCk7CisgIEVYUEVDVF9FUSgwLCBjb3VudGVyKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBUaHJlYWRTYW5pdGl6ZXIgdW5kZXJzdGFuZHMgdGhhdCBhbiB1bmNvbnRlbmRlZCBtdXRleAorLy8gZXN0YWJsaXNoZXMgYSBoYXBwZW5zLWJlZm9yZSByZWxhdGlvbnNoaXAuCitURVNUX0YoTXV0ZXhUZXN0LCBUaHJlYWRTYW5pdGl6ZXJVbmNvbnRlbmRlZCkgeworICBpbnQgY291bnRlciA9IDA7CisgIEFkZGVyVGhyZWFkIHRocmVhZHNbMl17CisgICAgICB7JmNvdW50ZXIsICZ0ZXN0X211dGV4XywgOjphb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjIpLAorICAgICAgIDo6YW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMoMCl9LAorICAgICAgeyZjb3VudGVyLCAmdGVzdF9tdXRleF8sIDo6YW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMoMCksCisgICAgICAgOjphb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcygwKX0sIH07CisgIGZvciAoYXV0byAmYyA6IHRocmVhZHMpIHsKKyAgICBjLlN0YXJ0KCk7CisgIH0KKyAgZm9yIChhdXRvICZjIDogdGhyZWFkcykgeworICAgIGMuV2FpdFVudGlsRG9uZSgpOworICB9CisgIEVYUEVDVF9FUSgyLCBjb3VudGVyKTsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgTG9ja2VyVGhyZWFkIDogcHVibGljIHV0aWw6OlRocmVhZCB7CisgcHVibGljOgorICBMb2NrZXJUaHJlYWQoTXV0ZXggKm11dGV4LCBib29sIGxvY2ssIGJvb2wgdW5sb2NrKQorICAgICAgOiBtdXRleF8obXV0ZXgpLCBsb2NrXyhsb2NrKSwgdW5sb2NrXyh1bmxvY2spIHt9CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgUnVuKCkgb3ZlcnJpZGUgeworICAgIGlmIChsb2NrXykgQVNTRVJUX0ZBTFNFKG11dGV4Xy0+TG9jaygpKTsKKyAgICBpZiAodW5sb2NrXykgbXV0ZXhfLT5VbmxvY2soKTsKKyAgfQorCisgIE11dGV4ICpjb25zdCBtdXRleF87CisgIGNvbnN0IGJvb2wgbG9ja18sIHVubG9ja187Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gTWFrZXMgc3VyZSB0aGF0IHdlIGRvbid0IFNJR1NFR1Ygb3Igc29tZXRoaW5nIHdpdGggbXVsdGlwbGUgdGhyZWFkcy4KK1RFU1RfRihNdXRleFRlc3QsIE11bHRpVGhyZWFkZWRMb2NrKSB7CisgIExvY2tlclRocmVhZCB0KCZ0ZXN0X211dGV4XywgdHJ1ZSwgdHJ1ZSk7CisgIHQuU3RhcnQoKTsKKyAgQVNTRVJUX0ZBTFNFKHRlc3RfbXV0ZXhfLkxvY2soKSk7CisgIHRlc3RfbXV0ZXhfLlVubG9jaygpOworICB0LkpvaW4oKTsKK30KKworVEVTVF9GKE11dGV4TG9ja2VyVGVzdCwgQmFzaWMpIHsKKyAgeworICAgIGFvczo6TXV0ZXhMb2NrZXIgbG9ja2VyKCZ0ZXN0X211dGV4Xyk7CisgICAgRVhQRUNUX0VRKE11dGV4OjpTdGF0ZTo6a0xvY2tGYWlsZWQsIHRlc3RfbXV0ZXhfLlRyeUxvY2soKSk7CisgIH0KKyAgRVhQRUNUX0VRKE11dGV4OjpTdGF0ZTo6a0xvY2tlZCwgdGVzdF9tdXRleF8uVHJ5TG9jaygpKTsKKworICB0ZXN0X211dGV4Xy5VbmxvY2soKTsKK30KKworVEVTVF9GKElQQ011dGV4TG9ja2VyVGVzdCwgQmFzaWMpIHsKKyAgeworICAgIGFvczo6SVBDTXV0ZXhMb2NrZXIgbG9ja2VyKCZ0ZXN0X211dGV4Xyk7CisgICAgRVhQRUNUX0VRKE11dGV4OjpTdGF0ZTo6a0xvY2tGYWlsZWQsIHRlc3RfbXV0ZXhfLlRyeUxvY2soKSk7CisgICAgRVhQRUNUX0ZBTFNFKGxvY2tlci5vd25lcl9kaWVkKCkpOworICB9CisgIEVYUEVDVF9FUShNdXRleDo6U3RhdGU6OmtMb2NrZWQsIHRlc3RfbXV0ZXhfLlRyeUxvY2soKSk7CisKKyAgdGVzdF9tdXRleF8uVW5sb2NrKCk7Cit9CisKKy8vIFRlc3RzIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBjYWxsZXIgZG9lc24ndCBjaGVjayBpZiB0aGUgcHJldmlvdXMgb3duZXIgZGllZAorLy8gd2l0aCBhbiBJUENNdXRleExvY2tlci4KK1RFU1RfRihJUENNdXRleExvY2tlckRlYXRoVGVzdCwgTm9DaGVja093bmVyRGllZCkgeworICBFWFBFQ1RfREVBVEgoeyBhb3M6OklQQ011dGV4TG9ja2VyIGxvY2tlcigmdGVzdF9tdXRleF8pOyB9LAorICAgICAgICAgICAgICAgIm5vYm9keSBjaGVja2VkIGlmIHRoZSBwcmV2aW91cyBvd25lciBvZiBtdXRleCBbXiBdKyBkaWVkLioiKTsKK30KKworVEVTVF9GKElQQ1JlY3Vyc2l2ZU11dGV4TG9ja2VyVGVzdCwgQmFzaWMpIHsKKyAgeworICAgIGFvczo6SVBDUmVjdXJzaXZlTXV0ZXhMb2NrZXIgbG9ja2VyKCZ0ZXN0X211dGV4Xyk7CisgICAgRVhQRUNUX0VRKE11dGV4OjpTdGF0ZTo6a0xvY2tGYWlsZWQsIHRlc3RfbXV0ZXhfLlRyeUxvY2soKSk7CisgICAgRVhQRUNUX0ZBTFNFKGxvY2tlci5vd25lcl9kaWVkKCkpOworICB9CisgIEVYUEVDVF9FUShNdXRleDo6U3RhdGU6OmtMb2NrZWQsIHRlc3RfbXV0ZXhfLlRyeUxvY2soKSk7CisKKyAgdGVzdF9tdXRleF8uVW5sb2NrKCk7Cit9CisKKy8vIFRlc3RzIGFjdHVhbGx5IGxvY2tpbmcgYSBtdXRleCByZWN1cnNpdmVseSB3aXRoIElQQ1JlY3Vyc2l2ZU11dGV4TG9ja2VyLgorVEVTVF9GKElQQ1JlY3Vyc2l2ZU11dGV4TG9ja2VyVGVzdCwgUmVjdXJzaXZlTG9jaykgeworICB7CisgICAgYW9zOjpJUENSZWN1cnNpdmVNdXRleExvY2tlciBsb2NrZXIoJnRlc3RfbXV0ZXhfKTsKKyAgICBFWFBFQ1RfRVEoTXV0ZXg6OlN0YXRlOjprTG9ja0ZhaWxlZCwgdGVzdF9tdXRleF8uVHJ5TG9jaygpKTsKKyAgICB7CisgICAgICBhb3M6OklQQ1JlY3Vyc2l2ZU11dGV4TG9ja2VyIGxvY2tlcigmdGVzdF9tdXRleF8pOworICAgICAgRVhQRUNUX0VRKE11dGV4OjpTdGF0ZTo6a0xvY2tGYWlsZWQsIHRlc3RfbXV0ZXhfLlRyeUxvY2soKSk7CisgICAgICBFWFBFQ1RfRkFMU0UobG9ja2VyLm93bmVyX2RpZWQoKSk7CisgICAgfQorICAgIEVYUEVDVF9FUShNdXRleDo6U3RhdGU6OmtMb2NrRmFpbGVkLCB0ZXN0X211dGV4Xy5UcnlMb2NrKCkpOworICAgIEVYUEVDVF9GQUxTRShsb2NrZXIub3duZXJfZGllZCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoTXV0ZXg6OlN0YXRlOjprTG9ja2VkLCB0ZXN0X211dGV4Xy5UcnlMb2NrKCkpOworCisgIHRlc3RfbXV0ZXhfLlVubG9jaygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9uZXR3b3JrL25ldHdvcmsuZ3lwIGIvYW9zL2NvbW1vbi9uZXR3b3JrL25ldHdvcmsuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNTJmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL25ldHdvcmsvbmV0d29yay5neXAKQEAgLTAsMCArMSwzNiBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAndGVhbV9udW1iZXInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICd0ZWFtX251bWJlci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmNvbmZpZ3VyYXRpb24nLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOm9uY2UnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6c3RyaW5nX3RvX251bScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3NvY2tldCcsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3JlY2VpdmVfc29ja2V0LmNjJywKKyAgICAgICAgJ3NlbmRfc29ja2V0LmNjJywKKyAgICAgICAgJ3NvY2tldC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOmluZXRfYWRkcicsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDpjb25maWd1cmF0aW9uJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9uZXR3b3JrL3JlY2VpdmVfc29ja2V0LmNjIGIvYW9zL2NvbW1vbi9uZXR3b3JrL3JlY2VpdmVfc29ja2V0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTc3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL25ldHdvcmsvcmVjZWl2ZV9zb2NrZXQuY2MKQEAgLTAsMCArMSwzMyBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vbmV0d29yay9yZWNlaXZlX3NvY2tldC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbmV0d29yayB7CisKK3N0YXRpYyBjb25zdCBjaGFyICpsb2NhbGhvc3QgPSAiMC4wLjAuMCI7CisKK2ludCBSZWNlaXZlU29ja2V0OjpDb25uZWN0KE5ldHdvcmtQb3J0IHBvcnQpIHsKKyAgUmVzZXQoKTsKKyAgY29uc3QgaW50IHJldCA9IFNvY2tldDo6Q29ubmVjdChwb3J0LCBsb2NhbGhvc3QpOworICBpZiAocmV0ICE9IDApIHsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKGJpbmQoc29ja2V0XywgJmFkZHJfLmFkZHIsCisgICAgICAgICAgIHNpemVvZihhZGRyXykpID09IC0xKSB7CisgICAgUExPRyhFUlJPUiwgImZhaWxlZCB0byBiaW5kIHRvIGFkZHJlc3MgJyVzJyIsIGxvY2FsaG9zdCk7CisgICAgcmV0dXJuIGxhc3RfcmV0XyA9IC0xOworICB9CisgIHJldHVybiBsYXN0X3JldF8gPSAwOworfQorCit9ICAvLyBuYW1lc3BhY2UgbmV0d29yaworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9uZXR3b3JrL3JlY2VpdmVfc29ja2V0LmggYi9hb3MvY29tbW9uL25ldHdvcmsvcmVjZWl2ZV9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmEwNzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9uZXR3b3JrL3JlY2VpdmVfc29ja2V0LmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX05FVFdPUktfUkVDRUlWRV9TT0NLRVRfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9ORVRXT1JLX1JFQ0VJVkVfU09DS0VUX0hfCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL25ldHdvcmsvc29ja2V0LmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIG5ldHdvcmsgeworCitjbGFzcyBSZWNlaXZlU29ja2V0IDogcHVibGljIFNvY2tldCB7CisgcHVibGljOgorICBleHBsaWNpdCBSZWNlaXZlU29ja2V0KE5ldHdvcmtQb3J0IHBvcnQpIHsgQ29ubmVjdChwb3J0KTsgfQorICBpbnQgQ29ubmVjdChOZXR3b3JrUG9ydCBwb3J0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBuZXR3b3JrCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9ORVRXT1JLX1JFQ0VJVkVfU09DS0VUX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL25ldHdvcmsvc2VuZF9zb2NrZXQuY2MgYi9hb3MvY29tbW9uL25ldHdvcmsvc2VuZF9zb2NrZXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4Njg5MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbmV0d29yay9zZW5kX3NvY2tldC5jYwpAQCAtMCwwICsxLDMxIEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9uZXR3b3JrL3NlbmRfc29ja2V0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBuZXR3b3JrIHsKKworaW50IFNlbmRTb2NrZXQ6OkNvbm5lY3QoTmV0d29ya1BvcnQgcG9ydCwgY29uc3QgY2hhciAqcm9ib3RfaXAsIGludCB0eXBlKSB7CisgIFJlc2V0KCk7CisgIGNvbnN0IGludCByZXQgPSBTb2NrZXQ6OkNvbm5lY3QocG9ydCwgcm9ib3RfaXAsIHR5cGUpOworICBpZiAocmV0ICE9IDApIHsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKGNvbm5lY3Qoc29ja2V0XywgJmFkZHJfLmFkZHIsIHNpemVvZihhZGRyXykpIDwgMCkgeworICAgIFBMT0coRVJST1IsICJjb3VsZG4ndCBjb25uZWN0IHRvIGlwICclcyciLCByb2JvdF9pcCk7CisgICAgcmV0dXJuIGxhc3RfcmV0XyA9IDE7CisgIH0KKworICByZXR1cm4gbGFzdF9yZXRfID0gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5ldHdvcmsKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbmV0d29yay9zZW5kX3NvY2tldC5oIGIvYW9zL2NvbW1vbi9uZXR3b3JrL3NlbmRfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkYjcyNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbmV0d29yay9zZW5kX3NvY2tldC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9ORVRXT1JLX1NFTkRfU09DS0VUX0hfCisjZGVmaW5lIEFPU19DT01NT05fTkVUV09SS19TRU5EX1NPQ0tFVF9IXworCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9uZXR3b3JrL3NvY2tldC5oIgorCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbmV0d29ya19wb3J0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL2luZXRfYWRkci5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBuZXR3b3JrIHsKKworY2xhc3MgU2VuZFNvY2tldCA6IHB1YmxpYyBTb2NrZXQgeworIHB1YmxpYzoKKyAgLy8gQ29ubmVjdCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNlLgorICBTZW5kU29ja2V0KCkge30KKyAgLy8gQ2FsbHMgQ29ubmVjdCBhdXRvbWF0aWNhbGx5LgorICBTZW5kU29ja2V0KE5ldHdvcmtQb3J0IHBvcnQsIDo6YW9zOjpOZXR3b3JrQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgQ29ubmVjdChwb3J0LAorICAgICAgICAgICAgOjphb3M6OnV0aWw6Ok1ha2VJUEFkZHJlc3MoOjphb3M6OmNvbmZpZ3VyYXRpb246OkdldE93bklQQWRkcmVzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcykpOworICB9CisgIGludCBDb25uZWN0KE5ldHdvcmtQb3J0IHBvcnQsIGNvbnN0IGNoYXIgKnJvYm90X2lwLCBpbnQgdHlwZSA9IFNPQ0tfREdSQU0pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG5ldHdvcmsKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX05FVFdPUktfU0VORF9TT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbmV0d29yay9zb2NrZXQuY2MgYi9hb3MvY29tbW9uL25ldHdvcmsvc29ja2V0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzRmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL25ldHdvcmsvc29ja2V0LmNjCkBAIC0wLDAgKzEsODMgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL25ldHdvcmsvc29ja2V0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9ieXRlb3JkZXIuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbmV0d29yayB7CisKK2ludCBTb2NrZXQ6OkNvbm5lY3QoTmV0d29ya1BvcnQgcG9ydCwgY29uc3QgY2hhciAqYWRkcmVzcywgaW50IHR5cGUpIHsKKyAgbGFzdF9yZXRfID0gMDsKKyAgaWYgKChzb2NrZXRfID0gc29ja2V0KEFGX0lORVQsIHR5cGUsIDApKSA8IDApIHsKKyAgICBQTE9HKEVSUk9SLCAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQiKTsKKyAgICByZXR1cm4gbGFzdF9yZXRfID0gMTsKKyAgfQorCisgIG1lbXNldCgmYWRkcl8sIDAsIHNpemVvZihhZGRyXykpOworICBhZGRyXy5pbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgYWRkcl8uaW4uc2luX3BvcnQgPSBodG9uPHVpbnQxNl90PihzdGF0aWNfY2FzdDx1aW50MTZfdD4ocG9ydCkpOworI2lmbmRlZiBfX1ZYV09SS1NfXworICBjb25zdCBpbnQgZmFpbHVyZV9yZXR1cm4gPSAwOworI2Vsc2UKKyAgY29uc3QgaW50IGZhaWx1cmVfcmV0dXJuID0gLTE7CisjZW5kaWYKKyAgaWYgKGluZXRfYXRvbihhZGRyZXNzLCAmYWRkcl8uaW4uc2luX2FkZHIpID09IGZhaWx1cmVfcmV0dXJuKSB7CisgICAgUExPRyhFUlJPUiwgImludmFsaWQgSVAgYWRkcmVzcyAnJXMnIiwgYWRkcmVzcyk7CisgICAgcmV0dXJuIGxhc3RfcmV0XyA9IC0xOworICB9CisKKyAgcmV0dXJuIGxhc3RfcmV0XyA9IDA7Cit9CisKK1NvY2tldDo6U29ja2V0KCkgOiBzb2NrZXRfKC0xKSwgbGFzdF9yZXRfKDIpIHt9CisKK1NvY2tldDo6flNvY2tldCgpIHsKKyAgY2xvc2Uoc29ja2V0Xyk7Cit9CisKK3ZvaWQgU29ja2V0OjpSZXNldCgpIHsKKyAgaWYgKHNvY2tldF8gIT0gLTEpIHsKKyAgICBjbG9zZShzb2NrZXRfKTsKKyAgICBzb2NrZXRfID0gLTE7CisgIH0KKyAgbGFzdF9yZXRfID0gMDsKK30KKworaW50IFNvY2tldDo6UmVjZWl2ZSh2b2lkICpidWYsIGludCBsZW5ndGgpIHsKKyAgY29uc3QgaW50IHJldCA9IHJlY3Yoc29ja2V0Xywgc3RhdGljX2Nhc3Q8Y2hhciAqPihidWYpLCBsZW5ndGgsIDApOworICBsYXN0X3JldF8gPSAocmV0ID09IC0xKSA/IC0xIDogMDsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IFNvY2tldDo6UmVjZWl2ZSh2b2lkICpidWYsIGludCBsZW5ndGgsIHRpbWU6OlRpbWUgdGltZW91dCkgeworICB0aW1ldmFsIHRpbWVvdXRfdGltZXZhbCA9IHRpbWVvdXQuVG9UaW1ldmFsKCk7CisgIGZkX3NldCBmZHM7CisgIEZEX1pFUk8oJmZkcyk7CisgIEZEX1NFVChzb2NrZXRfLCAmZmRzKTsKKyAgc3dpdGNoIChzZWxlY3QoRkRfU0VUU0laRSwgJmZkcywgTlVMTCwgTlVMTCwgJnRpbWVvdXRfdGltZXZhbCkpIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gUmVjZWl2ZShidWYsIGxlbmd0aCk7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIGxhc3RfcmV0XyA9IDA7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICByZXR1cm4gbGFzdF9yZXRfID0gMDsKKyAgICAgIH0KKyAgICAgIFBMT0coRkFUQUwsICJzZWxlY3QoRkRfU0VUU0laRSwgJXAsIE5VTEwsIE5VTEwsICVwKSBmYWlsZWQiLAorICAgICAgICAgICZmZHMsICZ0aW1lb3V0X3RpbWV2YWwpOworICB9Cit9CisKK2ludCBTb2NrZXQ6OlNlbmQoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuZ3RoKSB7CisgIGNvbnN0IGludCByZXQgPSB3cml0ZShzb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihidWYpLCBsZW5ndGgpOworICBsYXN0X3JldF8gPSAocmV0ID09IC0xKSA/IC0xIDogMDsKKyAgcmV0dXJuIHJldDsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5ldHdvcmsKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbmV0d29yay9zb2NrZXQuaCBiL2Fvcy9jb21tb24vbmV0d29yay9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZThlYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9uZXR3b3JrL3NvY2tldC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9ORVRXT1JLX1NPQ0tFVF9IXworI2RlZmluZSBBT1NfQ09NTU9OX05FVFdPUktfU09DS0VUX0hfCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL25ldHdvcmtfcG9ydC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBuZXR3b3JrIHsKKworY2xhc3MgU29ja2V0IHsKKyBwdWJsaWM6CisgIGludCBMYXN0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbGFzdF9yZXRfOyB9CisKKyAgaW50IFNlbmQoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuZ3RoKTsKKworICAvLyBidWYgaXMgd2hlcmUgdG8gcHV0IHRoZSBkYXRhIGFuZCBsZW5ndGggaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgdG8KKyAgLy8gcHV0IGluIGZvciBhbGwgb3ZlcmxvYWRzLgorICAvLyBBbGwgb3ZlcmxvYWRzIHJldHVybiBob3cgbWFueSBieXRlcyB3ZXJlIHJlY2VpdmVkIG9yIC0xIGZvciBlcnJvci4gMCBpcyBhCisgIC8vIHZhbGlkIHJldHVybiB2YWx1ZSBmb3IgYWxsIG92ZXJsb2Fkcy4KKyAgLy8gTm8gdGltZW91dC4KKyAgaW50IFJlY2VpdmUodm9pZCAqYnVmLCBpbnQgbGVuZ3RoKTsKKyAgLy8gdGltZW91dCBpcyByZWxhdGl2ZQorICBpbnQgUmVjZWl2ZSh2b2lkICpidWYsIGludCBsZW5ndGgsIHRpbWU6OlRpbWUgdGltZW91dCk7CisKKyBwcm90ZWN0ZWQ6CisgIGludCBDb25uZWN0KE5ldHdvcmtQb3J0IHBvcnQsIGNvbnN0IGNoYXIgKmFkZHJlc3MsIGludCB0eXBlID0gU09DS19ER1JBTSk7CisgIFNvY2tldCgpOworICB+U29ja2V0KCk7CisKKyAgLy8gUmVzZXRzIHNvY2tldF8gYW5kIGxhc3RfcmV0Xy4KKyAgdm9pZCBSZXNldCgpOworCisgIHVuaW9uIHsKKyAgICBzb2NrYWRkcl9pbiBpbjsKKyAgICBzb2NrYWRkciBhZGRyOworICB9IGFkZHJfOyAvLyBmaWxsZWQgaW4gYnkgQ29ubmVjdAorCisgIGludCBzb2NrZXRfOworICBpbnQgbGFzdF9yZXRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG5ldHdvcmsKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX05FVFdPUktfU09DS0VUX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL25ldHdvcmsvdGVhbV9udW1iZXIuY2MgYi9hb3MvY29tbW9uL25ldHdvcmsvdGVhbV9udW1iZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0MTEzYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbmV0d29yay90ZWFtX251bWJlci5jYwpAQCAtMCwwICsxLDgxIEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9uZXR3b3JrL3RlYW1fbnVtYmVyLmgiCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImFvcy9jb21tb24vb25jZS5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9zdHJpbmdfdG9fbnVtLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIG5ldHdvcmsgeworbmFtZXNwYWNlIHsKKwordWludDE2X3Qgb3ZlcnJpZGVfdGVhbTsKKworOjpzdGQ6OnN0cmluZyBHZXRIb3N0bmFtZSgpIHsKKyAgY2hhciBidWZbMjU2XTsKKyAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOworICBQQ0hFQ0soZ2V0aG9zdG5hbWUoYnVmLCBzaXplb2YoYnVmKSAtIDEpKTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworaW50IFBhcnNlVGVhbU51bWJlcihjb25zdCBzdGQ6OnN0cmluZyAmaG9zdG5hbWUsIHVpbnQxNl90ICp0ZWFtbnVtYmVyKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaG9zdG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoaG9zdG5hbWVbaV0gPT0gJy0nKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBudW1fYXNfcyA9IGhvc3RuYW1lLnN1YnN0cihpICsgMSk7CisKKyAgICAgIGludCBudW07CisgICAgICBpZiAoITo6YW9zOjp1dGlsOjpTdHJpbmdUb051bWJlcihudW1fYXNfcywgJm51bSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKGhvc3RuYW1lLnN1YnN0cigwLCBpKSA9PSAicm9ib1JJTyIgJiYKKyAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhudW0pID09IG51bV9hc19zKSB7CisgICAgICAgICp0ZWFtbnVtYmVyID0gbnVtOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQorCit1aW50MTZfdCAqRG9HZXRUZWFtTnVtYmVyKCkgeworICBpZiAob3ZlcnJpZGVfdGVhbSAhPSAwKSByZXR1cm4gJm92ZXJyaWRlX3RlYW07CisKKyAgc3RhdGljIHVpbnQxNl90IHI7CisKKyAgY29uc3QgY2hhciAqb3ZlcnJpZGVfbnVtYmVyID0gZ2V0ZW52KCJBT1NfVEVBTV9OVU1CRVIiKTsKKyAgaWYgKG92ZXJyaWRlX251bWJlciAhPSBudWxscHRyKSB7CisgICAgaWYgKCE6OmFvczo6dXRpbDo6U3RyaW5nVG9OdW1iZXIob3ZlcnJpZGVfbnVtYmVyLCAmcikpIHsKKyAgICAgIExPRyhGQVRBTCwgImVycm9yIHBhcnNpbmcgQU9TX1RFQU1fTlVNQkVSICclcydcbiIsIG92ZXJyaWRlX251bWJlcik7CisgICAgfQorICAgIExPRyhXQVJOSU5HLCAidGVhbSBudW1iZXIgb3ZlcnJpZGRlbiBieSBBT1NfVEVBTV9OVU1CRVIgdG8gJSIgUFJJdTE2ICJcbiIsCisgICAgICAgIHIpOworICB9IGVsc2UgeworICAgIGludCBlcnJvciA9IFBhcnNlVGVhbU51bWJlcihHZXRIb3N0bmFtZSgpLCAmcik7CisgICAgaWYgKGVycm9yKSB7CisgICAgICBMT0coRkFUQUwsICJJbnZhbGlkIGhvc3RuYW1lICVzXG4iLCBHZXRIb3N0bmFtZSgpLmNfc3RyKCkpOworICAgIH0KKyAgICBMT0coSU5GTywgInRlYW0gbnVtYmVyIGlzICUiIFBSSXUxNiAiXG4iLCByKTsKKyAgfQorICByZXR1cm4gJnI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit1aW50MTZfdCBHZXRUZWFtTnVtYmVyKCkgeworICBzdGF0aWMgT25jZTx1aW50MTZfdD4gb25jZShEb0dldFRlYW1OdW1iZXIpOworICByZXR1cm4gKm9uY2UuR2V0KCk7Cit9CisKK3ZvaWQgT3ZlcnJpZGVUZWFtTnVtYmVyKHVpbnQxNl90IHRlYW0pIHsgb3ZlcnJpZGVfdGVhbSA9IHRlYW07IH0KKworfSAgLy8gbmFtZXNwYWNlIG5ldHdvcmsKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vbmV0d29yay90ZWFtX251bWJlci5oIGIvYW9zL2NvbW1vbi9uZXR3b3JrL3RlYW1fbnVtYmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYjliYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbmV0d29yay90ZWFtX251bWJlci5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9ORVRXT1JLX1RFQU1fTlVNQkVSX0hfCisjZGVmaW5lIEFPU19DT01NT05fTkVUV09SS19URUFNX05VTUJFUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIG5ldHdvcmsgeworCisvLyBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdGVhbSBudW1iZXIgYmFzZWQgb2ZmIG9mIHRoZSBuZXR3b3JrIGFkZHJlc3MuCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBkbyB0aGUgY29tcGxpY2F0ZWQgc3R1ZmYgb25jZSBzbyBpdCBpcyBjaGVhcCB0byBjYWxsCisvLyByZXBlYXRlZGx5LgordWludDE2X3QgR2V0VGVhbU51bWJlcigpOworCisvLyBPdmVycmlkZXMgdGhlIHRlYW0gbnVtYmVyIHJldHVybmVkIGZyb20gR2V0VGVhbU51bWJlcigpLiBNdXN0IGJlIGNhbGxlZAorLy8gYmVmb3JlIEdldFRlYW1OdW1iZXIoKSBpcyBldmVyIGNhbGxlZC4KKy8vIE92ZXJyaWRpbmcgdG8gdGVhbSAwIHdvbid0IHdvcmsuCisvLyBJbnRlbmRlZCBvbmx5IGZvciB0ZXN0cy4KKy8vIEd1YXJhbnRlZWQgdG8gYmUgc2FmZSB0byBjYWxsIGR1cmluZyBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK3ZvaWQgT3ZlcnJpZGVUZWFtTnVtYmVyKHVpbnQxNl90IHRlYW0pOworCit9ICAvLyBuYW1lc3BhY2UgbmV0d29yaworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fTkVUV09SS19URUFNX05VTUJFUl9IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9uZXR3b3JrX3BvcnQuaCBiL2Fvcy9jb21tb24vbmV0d29ya19wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyMzY3NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vbmV0d29ya19wb3J0LmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX05FVFdPUktfUE9SVF9IXworI2RlZmluZSBBT1NfQ09NTU9OX05FVFdPUktfUE9SVF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhb3MgeworCisvLyBDb25zdGFudHMgcmVwcmVzZW50aW5nIHRoZSB2YXJpb3VzIHBvcnRzIHVzZWQgZm9yIGNvbW11bmljYXRpb25zIGFuZCBzb21lCisvLyBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgZWFjaCBpcyB1c2VkIGZvci4KK2VudW0gY2xhc3MgTmV0d29ya1BvcnQgOiB1aW50MTZfdCB7CisgIC8vIFVEUCBzb2NrZXQgc2VuZGluZyBtb3RvciB2YWx1ZXMgZnJvbSB0aGUgcHJpbWUgdG8gdGhlIGNyaW8uCisgIGtNb3RvcnMgPSA5NzEwLAorICAvLyBVRFAgc29ja2V0IGZvcndhcmRpbmcgZHJpdmVycyBzdGF0aW9uIHBhY2tldHMgZnJvbSB0aGUgY3JpbyB0byB0aGUgcHJpbWUuCisgIGtEUyA9IDk3MTEsCisgIC8vIFVEUCBzb2NrZXQgc2VuZGluZyBzZW5zb3IgdmFsdWVzIGZyb20gdGhlIGNyaW8gdG8gdGhlIHByaW1lLgorICBrU2Vuc29ycyA9IDk3MTIsCisgIC8vIEhUVFAgc2VydmVyIHRoYXQgc2VuZHMgb3V0IGNhbWVyYSBmZWVkcyBpbiBtanBnIGZvcm1hdC4KKyAgLy8gU2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGJlY2F1c2UgdGhpcyBudW1iZXIgc2hvd3MgdXAgZWxzZXdoZXJlIHRvby4KKyAga0NhbWVyYVN0cmVhbWVyID0gOTcxNCwKK307CisKKy8vIENvbnN0YW50cyByZXByZXNlbnRpbmcgdGhlIHZhcmlvdXMgZGV2aWNlcyB0aGF0IHRhbGsgb24gdGhlIG5ldHdvcmsgYW5kIHRoZQorLy8gbGFzdCBzZWdtZW50IG9mIHRoZWlyIElQIGFkZHJlc3Nlcy4KK2VudW0gY2xhc3MgTmV0d29ya0FkZHJlc3MgOiB1aW50OF90IHsKKyAgLy8gVGhlIGNvbXB1dGVyIHRoYXQgdGhlIGNSSU8gdGFsa3MgdG8uCisgIGtQcmltZSA9IDE3OSwKKyAga0NSSU8gPSAyLAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fTkVUV09SS19QT1JUX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL29uY2UtdG1wbC5oIGIvYW9zL2NvbW1vbi9vbmNlLXRtcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjE4Mzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9vbmNlLXRtcGwuaApAQCAtMCwwICsxLDQzIEBACisjaWZkZWYgX19WWFdPUktTX18KKyNpbmNsdWRlIDx0YXNrTGliLmg+CisjZWxzZQorI2luY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImFvcy9jb21tb24vdHlwZV90cmFpdHMuaCIKKworLy8gSXQgZG9lc24ndCB1c2UgcHRocmVhZF9vbmNlLCBiZWNhdXNlIEJyaWFuIGxvb2tlZCBhdCB0aGUgcHRocmVhZHMKKy8vIGltcGxlbWVudGF0aW9uIGZvciB2eHdvcmtzIGFuZCBub3RpY2VkIHRoYXQgaXQgaXMgY29tcGxldGVseSBhbmQgZW50aXJlbHkKKy8vIGJyb2tlbiBmb3IgZG9pbmcganVzdCBhYm91dCBhbnl0aGluZyAoaW5jbHVkaW5nIGl0cyBwdGhyZWFkX29uY2UpLiBJdCBoYXMgdGhlCisvLyBzYW1lIGltcGxlbWVudGF0aW9uIHVuZGVyIGxpbnV4IGZvciBzaW1wbGljaXR5LgorCituYW1lc3BhY2UgYW9zIHsKKworLy8gU2V0dGluZyBmdW5jdGlvbl8gbXVsdGlwbGUgdGltZXMgd291bGQgYmUgT0sgYmVjYXVzZSBpdCdsbCBnZXQgc2V0IHRvIHRoZQorLy8gc2FtZSB2YWx1ZSBlYWNoIHRpbWUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorT25jZTxUPjo6T25jZShGdW5jdGlvbiBmdW5jdGlvbikKKyAgICA6IGZ1bmN0aW9uXyhmdW5jdGlvbikgeworICBzdGF0aWNfYXNzZXJ0KHNobV9vazxPbmNlPFQ+Pjo6dmFsdWUsICJPbmNlIHNob3VsZCB3b3JrIGluIHNoYXJlZCBtZW1vcnkiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgT25jZTxUPjo6UmVzZXQoKSB7CisgIF9fYXRvbWljX3N0b3JlX24oJnJ1bl8sIGZhbHNlLCBfX0FUT01JQ19TRVFfQ1NUKTsKKyAgX19hdG9taWNfc3RvcmVfbigmZG9uZV8sIGZhbHNlLCBfX0FUT01JQ19TRVFfQ1NUKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgKk9uY2U8VD46OkdldCgpIHsKKyAgaWYgKF9fYXRvbWljX2V4Y2hhbmdlX24oJnJ1bl8sIHRydWUsIF9fQVRPTUlDX1JFTEFYRUQpID09IGZhbHNlKSB7CisgICAgcmVzdWx0XyA9IGZ1bmN0aW9uXygpOworICAgIF9fYXRvbWljX3N0b3JlX24oJmRvbmVfLCB0cnVlLCBfX0FUT01JQ19SRUxFQVNFKTsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoIV9fYXRvbWljX2xvYWRfbigmZG9uZV8sIF9fQVRPTUlDX0FDUVVJUkUpKSB7CisgICAgICBzY2hlZF95aWVsZCgpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0XzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9vbmNlLmggYi9hb3MvY29tbW9uL29uY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZiY2IxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9vbmNlLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX09OQ0VfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9PTkNFX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vZ3Rlc3RfcHJvZC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworRk9SV0FSRF9ERUNMQVJFX1RFU1RfQ0FTRShPbmNlVGVzdCwgTWVtb3J5Q2xlYXJpbmcpOworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBEZXNpZ25lZCBmb3IgdGhlIHNhbWUgdGhpbmcgYXMgcHRocmVhZF9vbmNlOiB0byBydW4gc29tZXRoaW5nIGV4YWN0bHkgMSB0aW1lLgorLy8KKy8vIEludGVuZGVkIHVzZSBjYXNlOgorLy8gICBjb25zdCBjaGFyICpDYWxjdWxhdGVTb21ldGhpbmdDb29sKCkgeworLy8gICAgIHN0YXRpYyA6OmFvczo6T25jZTxjb25zdCBjaGFyPiBvbmNlKERvQ2FsY3VsYXRlU29tZXRoaW5nQ29vbCk7CisvLyAgICAgcmV0dXJuIG9uY2UuR2V0KCk7CisvLyAgIH0KKy8vCisvLyBJTVBPUlRBTlQ6IEluc3RhbmNlcyBfbXVzdF8gYmUgcGxhY2VkIGluIG1lbW9yeSB0aGF0IGdldHMgMC1pbml0aWFsaXplZAorLy8gYXV0b21hdGljYWxseSBvciBSZXNldCgpIG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSEhCisvLyBUaGUgZXhwZWN0ZWQgdXNlIGNhc2UgaXMgdG8gdXNlIG9uZSBvZiB0aGVzZSBhcyBhIHN0YXRpYyB2YXJpYWJsZSwgYW5kIHRob3NlCisvLyBkbyBnZXQgMC1pbml0aWFsaXplZCB1bmRlciB0aGUgQysrIHN0YW5kYXJkLiBHbG9iYWwgdmFyaWFibGVzIGFyZSB0cmVhdGVkIHRoZQorLy8gc2FtZSB3YXkgYnkgdGhlIEMrKyBTdGFuZGFyZC4KKy8vIFBsYWNpbmcgYW4gaW5zdGFuY2UgaW4gc2hhcmVkIG1lbW9yeSAoYW5kIHVzaW5nIFJlc2V0KCkpIGlzIGFsc28gc3VwcG9ydGVkLgorLy8gVGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IGluaXRpYWxpemUgYWxsIG9mIHRoZSBtZW1iZXIgdmFyaWFibGVzIQorLy8gVGhpcyBpcyBiZWNhdXNlIGluaXRpYWxpemluZyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24KKy8vIGlmIGluaXRpYWxpemF0aW9uIG9mIHN0YXRpYyB2YXJpYWJsZXMgaXNuJ3QgdGhyZWFkIHNhZmUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgT25jZSB7CisgcHVibGljOgorICB0eXBlZGVmIFQgKigqRnVuY3Rpb24pKCk7CisgIGV4cGxpY2l0IE9uY2UoRnVuY3Rpb24gZnVuY3Rpb24pOworCisgIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGZ1bmN0aW9uXy4gVGhlIGZpcnN0IGNhbGwgd2lsbCBhY3R1YWxseSBydW4KKyAgLy8gaXQgYW5kIHRoZW4gYW55IG90aGVyIG9uZXMgd2lsbCBibG9jayAoaWYgbmVjZXNzYXJ5KSB1bnRpbCBpdCdzIGZpbmlzaGVkCisgIC8vIGFuZCB0aGVuIHJldHVybiB0aGUgc2FtZSB0aGluZy4KKyAgVCAqR2V0KCk7CisKKyAgLy8gV2lsbCBjbGVhciBvdXQgYWxsIHRoZSBtZW1iZXIgdmFyaWFibGVzLiBJZiB0aGlzIGlzIGdvaW5nIHRvIGJlIHVzZWQKKyAgLy8gaW5zdGVhZCBvZiBjcmVhdGluZyBhbiBpbnN0YW5jZSBpbiAwLWluaXRpYWxpemVkIG1lbW9yeSwgdGhlbiB0aGlzIG1ldGhvZAorICAvLyBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIEdldCgpIGlzIGNhbGxlZCBhbnl3aGVyZS4KKyAgLy8gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgY2FsbGVkIHRvIHJ1biB0aGUgZnVuY3Rpb24gYWdhaW4gdGhlIG5leHQgdGltZQorICAvLyBHZXQoKSBpcyBjYWxsZWQuIEhvd2V2ZXIsIGNhbGxpbmcgaXQgYWdhaW4gaXMgbm90IHRocmVhZCBzYWZlLgorICB2b2lkIFJlc2V0KCk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgZnVuY3Rpb24gdG8gcnVuIHRvIGNhbGN1bGF0ZSByZXN1bHRfLgorICBGdW5jdGlvbiBmdW5jdGlvbl87CisgIC8vIFdoZXRoZXIgb3Igbm90IGl0IGlzIHJ1bm5pbmcuIEdldHMgYXRvbWljYWxseSBzd2FwcGVkIGZyb20gZmFsc2UgdG8gdHJ1ZSBieQorICAvLyB0aGUgdGhyZWFkIHRoYXQgYWN0dWFsbHkgcnVucyBmdW5jdGlvbl8uCisgIGJvb2wgcnVuXzsKKyAgLy8gV2hldGhlciBvciBub3QgaXQgaXMgZG9uZS4gR2V0cyBzZXQgdG8gdHJ1ZSBhZnRlciB0aGUgdGhyZWFkIHRoYXQgaXMKKyAgLy8gcnVubmluZyBmdW5jdGlvbl8gZmluaXNoZXMgcnVubmluZyBpdCBhbmQgc3RvcmluZyB0aGUgcmVzdWx0IGluIHJlc3VsdF8uCisgIGJvb2wgZG9uZV87CisgIC8vIFdoYXQgZnVuY3Rpb25fIHJldHVybmVkIHdoZW4gaXQgd2FzIGV4ZWN1dGVkLgorICBUICpyZXN1bHRfOworCisgIEZSSUVORF9URVNUX05BTUVTUEFDRShPbmNlVGVzdCwgTWVtb3J5Q2xlYXJpbmcsIHRlc3RpbmcpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9vbmNlLXRtcGwuaCIKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX09OQ0VfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vb25jZV90ZXN0LmNjIGIvYW9zL2NvbW1vbi9vbmNlX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3M2I1YgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vb25jZV90ZXN0LmNjCkBAIC0wLDAgKzEsMTMwIEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9vbmNlLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBPbmNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIGludCAqRnVuY3Rpb24oKSB7CisgICAgKyt0aW1lc19ydW5fOworICAgIHZhbHVlXyA9IDk3MSArIHRpbWVzX3J1bl87CisgICAgcmV0dXJuICZ2YWx1ZV87CisgIH0KKworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIHsKKyAgICB2YWx1ZV8gPSAwOworICAgIHRpbWVzX3J1bl8gPSAwOworICB9CisKKyAgc3RhdGljIGludCB2YWx1ZV87CisgIHN0YXRpYyBpbnQgdGltZXNfcnVuXzsKK307CitpbnQgT25jZVRlc3Q6OnZhbHVlXywgT25jZVRlc3Q6OnRpbWVzX3J1bl87CisKKy8vIE1ha2VzIHN1cmUgdGhhdCBpdCBjYWxscyB0aGUgZnVuY3Rpb24gYXQgdGhlIHJpZ2h0IHRpbWUgYW5kIHRoYXQgaXQgY29ycmVjdGx5CisvLyBwYXNzZXMgdGhlIHJlc3VsdCBvdXQuCitURVNUX0YoT25jZVRlc3QsIFdvcmtzKSB7CisgIHN0YXRpYyBPbmNlPGludD4gb25jZShGdW5jdGlvbik7CisKKyAgRVhQRUNUX0VRKDAsIHZhbHVlXyk7CisgIEVYUEVDVF9FUSgwLCB0aW1lc19ydW5fKTsKKworICBFWFBFQ1RfRVEodmFsdWVfLCAqb25jZS5HZXQoKSk7CisgIEVYUEVDVF9ORSgwLCB2YWx1ZV8pOworICBFWFBFQ1RfTkUoMCwgdGltZXNfcnVuXyk7CisgIC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBwYXNzaW5nIGl0IHRocm91Z2ggYW4gYXNzaWdubWVudCBieSB2YWx1ZSBvciBzb21ldGhpbmcKKyAgLy8gZWxzZSB3ZWlyZC4KKyAgRVhQRUNUX0VRKCZ2YWx1ZV8sIG9uY2UuR2V0KCkpOworfQorCisvLyBNYWtlcyBzdXJlIHRoYXQgaGF2aW5nIGEgT25jZSBhdCBuYW1lc3BhY2Ugc2NvcGUgd29ya3MgY29ycmVjdGx5LgorbmFtZXNwYWNlIHsKKworT25jZTxpbnQ+IGdsb2JhbF9vbmNlKE9uY2VUZXN0OjpGdW5jdGlvbik7CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUX0YoT25jZVRlc3QsIEdsb2JhbCkgeworICBFWFBFQ1RfRVEodmFsdWVfLCAqZ2xvYmFsX29uY2UuR2V0KCkpOworICBFWFBFQ1RfTkUoMCwgdmFsdWVfKTsKKyAgRVhQRUNUX05FKDAsIHRpbWVzX3J1bl8pOworfQorCisvLyBNYWtlcyBzdXJlIHRoYXQgYW4gaW5zdGFuY2Uga2VlcHMgcmV0dXJuaW5nIHRoZSBzYW1lIHZhbHVlIHdpdGhvdXQgcnVubmluZworLy8gdGhlIGZ1bmN0aW9uIGFnYWluLgorVEVTVF9GKE9uY2VUZXN0LCBNdWx0aXBsZUdldHMpIHsKKyAgc3RhdGljIE9uY2U8aW50PiBvbmNlKEZ1bmN0aW9uKTsKKworICBFWFBFQ1RfRVEodmFsdWVfLCAqb25jZS5HZXQoKSk7CisgIEVYUEVDVF9FUSgxLCB0aW1lc19ydW5fKTsKKyAgRVhQRUNUX0VRKHZhbHVlXywgKm9uY2UuR2V0KCkpOworICBFWFBFQ1RfRVEoMSwgdGltZXNfcnVuXyk7CisgIEVYUEVDVF9FUSh2YWx1ZV8sICpvbmNlLkdldCgpKTsKKyAgRVhQRUNUX0VRKDEsIHRpbWVzX3J1bl8pOworfQorCisvLyBUZXN0cyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgbWV0aG9kcyBjbGVhciBvdXQgdGhlIGluc3RhbmNlIHZhcmlhYmxlcyBhdAorLy8gdGhlIHJpZ2h0IHRpbWVzLgorVEVTVF9GKE9uY2VUZXN0LCBNZW1vcnlDbGVhcmluZykgeworICBPbmNlPGludD4gb25jZShOVUxMKTsKKworICBvbmNlLnJ1bl8gPSAxOworICBvbmNlLmRvbmVfID0gdHJ1ZTsKKyAgLy8gUnVuIHRoZSBjb25zdHJ1Y3RvciBhZ2FpbiB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCB0b3VjaCB0aGUgdmFyaWFibGVzIHNldAorICAvLyBhYm92ZS4KKyAgbmV3ICgmb25jZSlPbmNlPGludD4oRnVuY3Rpb24pOworCisgIC8vIFNob3VsZCByZXR1cm4gYSByYW5kb20sIChwb3RlbnRpYWxseSkgdW5pbml0aWFsaXplZCB2YWx1ZS4KKyAgb25jZS5HZXQoKTsKKyAgRVhQRUNUX0VRKDAsIHRpbWVzX3J1bl8pOworCisgIG9uY2UuUmVzZXQoKTsKKyAgRVhQRUNUX0VRKDAsIHRpbWVzX3J1bl8pOworICBFWFBFQ1RfRVEodmFsdWVfLCAqb25jZS5HZXQoKSk7CisgIEVYUEVDVF9FUSgxLCB0aW1lc19ydW5fKTsKK30KKworbmFtZXNwYWNlIHsKKworaW50IHNlY29uZF9yZXN1bHQgPSAwOworaW50ICpTZWNvbmRGdW5jdGlvbigpIHsKKyAgc3RhdGljIGludCByZXN1bHQgPSAyNTQ7CisgIHNlY29uZF9yZXN1bHQgPSArK3Jlc3VsdDsKKyAgcmV0dXJuICZzZWNvbmRfcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gTWFrZXMgc3VyZSB0aGF0IG11bHRpcGxlIGluc3RhbmNlcyBkb24ndCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLgorVEVTVF9GKE9uY2VUZXN0LCBNdWx0aXBsZUluc3RhbmNlcykgeworICBzdGF0aWMgT25jZTxpbnQ+IG9uY2UxKEZ1bmN0aW9uKTsKKyAgc3RhdGljIE9uY2U8aW50PiBvbmNlMihTZWNvbmRGdW5jdGlvbik7CisKKyAgRVhQRUNUX0VRKCZ2YWx1ZV8sIG9uY2UxLkdldCgpKTsKKyAgRVhQRUNUX0VRKCZzZWNvbmRfcmVzdWx0LCBvbmNlMi5HZXQoKSk7CisgIEVYUEVDVF9FUSgmdmFsdWVfLCBvbmNlMS5HZXQoKSk7CisgIEVYUEVDVF9FUSgmc2Vjb25kX3Jlc3VsdCwgb25jZTIuR2V0KCkpOworfQorCisvLyBUZXN0cyBjYWxsaW5nIFJlc2V0KCkgdG8gcnVuIHRoZSBmdW5jdGlvbiBhIHNlY29uZCB0aW1lLgorVEVTVF9GKE9uY2VUZXN0LCBSZWNhbGN1bGF0ZSkgeworICBPbmNlPGludD4gb25jZShGdW5jdGlvbik7CisgIG9uY2UuUmVzZXQoKTsKKworICBFWFBFQ1RfRVEodmFsdWVfLCAqb25jZS5HZXQoKSk7CisgIEVYUEVDVF9FUSgxLCB0aW1lc19ydW5fKTsKKworICB2YWx1ZV8gPSAwOworICBvbmNlLlJlc2V0KCk7CisgIEVYUEVDVF9FUSh2YWx1ZV8sICpvbmNlLkdldCgpKTsKKyAgRVhQRUNUX0VRKDIsIHRpbWVzX3J1bl8pOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9wcmludF9maWVsZF9oZWxwZXJzLmggYi9hb3MvY29tbW9uL3ByaW50X2ZpZWxkX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQyZmFiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9wcmludF9maWVsZF9oZWxwZXJzLmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1BSSU5UX0ZJRUxEX0hFTFBFUlNfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9QUklOVF9GSUVMRF9IRUxQRVJTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW9zIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBib29sIFByaW50SW50ZWdlcihjaGFyICpidWYsIFQgdmFsLCBzaXplX3QgKm91dHB1dCkgeworICBzdGF0aWMgY29uc3QgYm9vbCBpc19zaWduZWQgPSA6OnN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZTsKKyAgY29uc3QgYm9vbCBpc19uZWdhdGl2ZSA9CisgICAgICBpc19zaWduZWQgPyAodmFsICYgKHN0YXRpY19jYXN0PFQ+KDEpIDw8IChzaXplb2YoVCkgKiA4IC0gMSkpKSA6IGZhbHNlOworCisgIHNpemVfdCBsZW4gPSAwOworICBpZiAoaXNfbmVnYXRpdmUpIHsKKyAgICBkbyB7CisgICAgICBpZiAobGVuID09ICpvdXRwdXQpIHJldHVybiBmYWxzZTsKKyAgICAgIGJ1ZltsZW4rK10gPSAnMCcgLSAodmFsICUgMTApOworICAgICAgdmFsIC89IDEwOworICAgIH0gd2hpbGUgKHZhbCAhPSAwKTsKKyAgICBpZiAobGVuID09ICpvdXRwdXQpIHJldHVybiBmYWxzZTsKKyAgICBidWZbbGVuKytdID0gJy0nOworICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIGlmIChsZW4gPT0gKm91dHB1dCkgcmV0dXJuIGZhbHNlOworICAgICAgYnVmW2xlbisrXSA9ICcwJyArICh2YWwgJSAxMCk7CisgICAgICB2YWwgLz0gMTA7CisgICAgfSB3aGlsZSAodmFsICE9IDApOworICB9CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKGxlbiA+PiAxKTsgaSsrKSB7CisgICAgc3RkOjpzd2FwKGJ1ZltsZW4gLSAxIC0gaV0sIGJ1ZltpXSk7CisgIH0KKyAgKm91dHB1dCAtPSBsZW47CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9QUklOVF9GSUVMRF9IRUxQRVJTX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3F1ZXVlLmNjIGIvYW9zL2NvbW1vbi9xdWV1ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTNlNjJiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9xdWV1ZS5jYwpAQCAtMCwwICsxLDM3IEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZS5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9ieXRlb3JkZXIuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCituYW1lc3BhY2UgYW9zIHsKKwordm9pZCBNZXNzYWdlOjpaZXJvKCkgeworICBzZW50X3RpbWUuc2V0X3NlYygwKTsKKyAgc2VudF90aW1lLnNldF9uc2VjKDApOworfQorCitzaXplX3QgTWVzc2FnZTo6RGVzZXJpYWxpemUoY29uc3QgY2hhciAqYnVmZmVyKSB7CisgIGludDMyX3Qgc2VjOworICBpbnQzMl90IG5zZWM7CisgIHRvX2hvc3QoJmJ1ZmZlclswXSwgJnNlYyk7CisgIHRvX2hvc3QoJmJ1ZmZlcls0XSwgJm5zZWMpOworICBzZW50X3RpbWUuc2V0X3NlYyhzZWMpOworICBzZW50X3RpbWUuc2V0X25zZWMobnNlYyk7CisgIHJldHVybiBTaXplKCk7Cit9CisvLyBTZXJpYWxpemVzIHRoZSBjb21tb24gZmllbGRzIGludG8gdGhlIGJ1ZmZlci4KK3NpemVfdCBNZXNzYWdlOjpTZXJpYWxpemUoY2hhciAqYnVmZmVyKSBjb25zdCB7CisgIC8vIFRPRE8oYXNjaHVoKTogdG9fbmV0d29yayBzaG91bGRuJ3QgbmVlZCBhIHBvaW50ZXIuCisgIGludDMyX3Qgc2VjID0gc2VudF90aW1lLnNlYygpOworICBpbnQzMl90IG5zZWMgPSBzZW50X3RpbWUubnNlYygpOworICB0b19uZXR3b3JrKCZzZWMsICZidWZmZXJbMF0pOworICB0b19uZXR3b3JrKCZuc2VjLCAmYnVmZmVyWzRdKTsKKyAgcmV0dXJuIFNpemUoKTsKK30KKworc2l6ZV90IE1lc3NhZ2U6OlByaW50KGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkgY29uc3QgeworICByZXR1cm4gc25wcmludGYoYnVmZmVyLCBsZW5ndGgsICIlIiBQUklkMzIgIi4lMDkiIFBSSWQzMiAicyIsCisgICAgICAgICAgICAgICAgICBzZW50X3RpbWUuc2VjKCksIHNlbnRfdGltZS5uc2VjKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3F1ZXVlLmggYi9hb3MvY29tbW9uL3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2YWRlYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vcXVldWUuaApAQCAtMCwwICsxLDI4MiBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1FVRVVFX0hfCisjZGVmaW5lIEFPU19DT01NT05fUVVFVUVfSF8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL3F1ZXVlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisKK25hbWVzcGFjZSBhb3MgeworCitzdHJ1Y3QgTWVzc2FnZVR5cGU7CisKKy8vIFRoaXMgY2xhc3MgaXMgYSBiYXNlIGNsYXNzIGZvciBhbGwgbWVzc2FnZXMgc2VudCBvdmVyIHF1ZXVlcy4KKy8vIEFsbCBvZiB0aGUgbWV0aG9kcyBhcmUgb3ZlcmxvYWRlZCBpbiAoZ2VuZXJhdGVkKSBzdWJjbGFzc2VzIHRvIGRvIHRoZSBzYW1lCisvLyB0aGluZyBmb3IgdGhlIHdob2xlIHRoaW5nLgorY2xhc3MgTWVzc2FnZSB7CisgcHVibGljOgorICB0eXBlZGVmIDo6YW9zOjp0aW1lOjpUaW1lIFRpbWU7CisgIC8vIFRoZSB0aW1lIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIHNlbnQgYXQuCisgIFRpbWUgc2VudF90aW1lOworCisgIE1lc3NhZ2UoKSA6IHNlbnRfdGltZSgwLCAwKSB7fQorCisgIC8vIFplcm9zIG91dCB0aGUgdGltZS4KKyAgdm9pZCBaZXJvKCk7CisgIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBmaWVsZHMuCisgIHN0YXRpYyBzaXplX3QgU2l6ZSgpIHsgcmV0dXJuIHNpemVvZihUaW1lKTsgfQorCisgIC8vIERlc2VyaWFsaXplcyB0aGUgY29tbW9uIGZpZWxkcyBmcm9tIHRoZSBidWZmZXIuCisgIHNpemVfdCBEZXNlcmlhbGl6ZShjb25zdCBjaGFyICpidWZmZXIpOworICAvLyBTZXJpYWxpemVzIHRoZSBjb21tb24gZmllbGRzIGludG8gdGhlIGJ1ZmZlci4KKyAgc2l6ZV90IFNlcmlhbGl6ZShjaGFyICpidWZmZXIpIGNvbnN0OworCisgIC8vIFBvcHVsYXRlcyBzZW50X3RpbWUgd2l0aCB0aGUgY3VycmVudCB0aW1lLgorICB2b2lkIFNldFRpbWVUb05vdygpIHsgc2VudF90aW1lID0gVGltZTo6Tm93KCk7IH0KKworICAvLyBXcml0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIHRvIHRoZSBwcm92aWRlZCBidWZmZXIuCisgIHNpemVfdCBQcmludChjaGFyICpidWZmZXIsIGludCBsZW5ndGgpIGNvbnN0OworCisgIC8vIENvbXBhcmVzIHR3byBtZXNzYWdlcyBmb3IgZXF1YWxpdHksIGV4Y2x1ZGluZyB0aGVpciBzZW50X3RpbWUuCisgIGJvb2wgRXF1YWxzTm9UaW1lKGNvbnN0IE1lc3NhZ2UgJiAvKm90aGVyKi8pIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICBzdGF0aWMgY29uc3QgTWVzc2FnZVR5cGUgKkdldFR5cGUoKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBRdWV1ZTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBNZXNzYWdlQnVpbGRlcjsKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBTY29wZWRNZXNzYWdlUHRyOworCisvLyBBIFNjb3BlZE1lc3NhZ2VQdHI8PiBtYW5hZ2VzIGEgcXVldWUgbWVzc2FnZSBwb2ludGVyLgorLy8gSXQgZnJlZXMgaXQgcHJvcGVybHkgd2hlbiB0aGUgU2NvcGVkTWVzc2FnZVB0cjw+IGdvZXMgb3V0IG9mIHNjb3BlIG9yIGdldHMKKy8vIHNlbnQuICBCeSBkZXNpZ24sIHRoZXJlIGlzIG5vIHdheSB0byBnZXQgdGhlIFNjb3BlZE1lc3NhZ2VQdHIgdG8gcmVsZWFzZSB0aGUKKy8vIG1lc3NhZ2UgcG9pbnRlciB0byBleHRlcm5hbCBjb2RlLgordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBTY29wZWRNZXNzYWdlUHRyIHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlLgorICAvLyBUaGlzIHN0YXlzIHZhbGlkIHVudGlsIFNlbmQgb3IgdGhlIGRlc3RydWN0b3IgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgY29uc3QgVCAqZ2V0KCkgY29uc3QgeyByZXR1cm4gbXNnXzsgfQorICBUICpnZXQoKSB7IHJldHVybiBtc2dfOyB9CisKKyAgY29uc3QgVCAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGNvbnN0IFQgKm1zZyA9IGdldCgpOworICAgIGFzc2VydChtc2cgIT0gTlVMTCk7CisgICAgcmV0dXJuICptc2c7CisgIH0KKworICBUICZvcGVyYXRvciooKSB7CisgICAgVCAqbXNnID0gZ2V0KCk7CisgICAgYXNzZXJ0KG1zZyAhPSBOVUxMKTsKKyAgICByZXR1cm4gKm1zZzsKKyAgfQorCisgIGNvbnN0IFQgKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgY29uc3QgVCAqbXNnID0gZ2V0KCk7CisgICAgYXNzZXJ0KG1zZyAhPSBOVUxMKTsKKyAgICByZXR1cm4gbXNnOworICB9CisKKyAgVCAqb3BlcmF0b3ItPigpIHsKKyAgICBUICptc2cgPSBnZXQoKTsKKyAgICBhc3NlcnQobXNnICE9IE5VTEwpOworICAgIHJldHVybiBtc2c7CisgIH0KKworICBvcGVyYXRvciBib29sKCkgeworICAgIHJldHVybiBtc2dfICE9IE5VTEw7CisgIH0KKworICAvLyBTZW5kcyB0aGUgbWVzc2FnZSBhbmQgcmVtb3ZlcyBvdXIgcmVmZXJlbmNlIHRvIGl0LgorICAvLyBJZiB0aGUgcXVldWUgaXMgZnVsbCwgb3Zlci1yaWRlIHRoZSBvbGRlc3QgbWVzc2FnZSBpbiBpdCB3aXRoIG91ciBuZXcKKyAgLy8gbWVzc2FnZS4KKyAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgIC8vIFRoZSBtZXNzYWdlIHdpbGwgYmUgZnJlZWQuCisgIGJvb2wgU2VuZCgpOworCisgIC8vIFNlbmRzIHRoZSBtZXNzYWdlIGFuZCByZW1vdmVzIG91ciByZWZlcmVuY2UgdG8gaXQuCisgIC8vIElmIHRoZSBxdWV1ZSBpcyBmdWxsLCBibG9jayB1bnRpbCBpdCBpcyBubyBsb25nZXIgZnVsbC4KKyAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgIC8vIFRoZSBtZXNzYWdlIHdpbGwgYmUgZnJlZWQuCisgIGJvb2wgU2VuZEJsb2NraW5nKCk7CisKKyAgLy8gRnJlZXMgdGhlIGNvbnRhaW5lZCBtZXNzYWdlLgorICB+U2NvcGVkTWVzc2FnZVB0cigpIHsKKyAgICByZXNldCgpOworICB9CisKKyAgLy8gSW1wbGVtZW50cyBhIG1vdmUgY29uc3RydWN0b3IuICBUaGlzIG9ubHkgdGFrZXMgcnZhbHVlIHJlZmVyZW5jZXMKKyAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIGFsbG93IHNvbWVvbmUgdG8gc2F5CisgIC8vIFNjb3BlZE1lc3NhZ2VQdHI8WD4gcHRyID0gcXVldWUuTWFrZU1lc3NhZ2UoKTsKKyAgLy8gYnV0IHdlIGRvbid0IHdhbnQgdG8gYWxsb3cgdGhlbSB0byB0aGVuIHNheQorICAvLyBTY29wZWRNZXNzYWdlUHRyPFg+IG5ld19wdHIgPSBwdHI7CisgIC8vIEFuZCwgaWYgdGhleSBkbyBhY3R1YWxseSB3YW50IHRvIG1vdmUgdGhlIHBvaW50ZXIsIHRoZW4gaXQgd2lsbCBjb3JyZWN0bHkKKyAgLy8gY2xlYXIgb3V0IHRoZSBzb3VyY2Ugc28gdGhlcmUgYXJlbid0IDIgcG9pbnRlcnMgdG8gdGhlIG1lc3NhZ2UgbHlpbmcKKyAgLy8gYXJvdW5kLgorICBTY29wZWRNZXNzYWdlUHRyKFNjb3BlZE1lc3NhZ2VQdHI8VD4gJiZwdHIpCisgICAgICA6IHF1ZXVlXyhwdHIucXVldWVfKSwgbXNnXyhwdHIubXNnXykgeworICAgIHB0ci5tc2dfID0gTlVMTDsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gUHJvdmlkZSBhY2Nlc3MgdG8gc2V0X3F1ZXVlIGFuZCB0aGUgY29uc3RydWN0b3IgZm9yIGluaXQuCisgIGZyaWVuZCBjbGFzcyBhb3M6OlF1ZXVlPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PFQ+Ojp0eXBlPjsKKyAgLy8gUHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGNvcHkgY29uc3RydWN0b3IgZm9yIE1ha2VXaXRoQnVpbGRlci4KKyAgZnJpZW5kIGNsYXNzIGFvczo6TWVzc2FnZUJ1aWxkZXI8VD47CisKKyAgLy8gT25seSBRdWV1ZSBzaG91bGQgYmUgYWJsZSB0byBidWlsZCBhIG1lc3NhZ2UuCisgIFNjb3BlZE1lc3NhZ2VQdHIoUmF3UXVldWUgKnF1ZXVlLCBUICptc2cpCisgICAgICA6IHF1ZXVlXyhxdWV1ZSksIG1zZ18obXNnKSB7fQorCisgIC8vIFNldHMgdGhlIHBvaW50ZXIgdG8gbXNnLCBmcmVlaW5nIHRoZSBvbGQgdmFsdWUgaWYgaXQgd2FzIHRoZXJlLgorICAvLyBUaGlzIGlzIHByaXZhdGUgYmVjYXVzZSBub2JvZHkgc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGEgcG9pbnRlciB0byBhIG1lc3NhZ2UKKyAgLy8gdGhhdCBuZWVkcyB0byBiZSBzY29wZWQgd2l0aG91dCB1c2luZyB0aGUgcXVldWUuCisgIHZvaWQgcmVzZXQoVCAqbXNnID0gTlVMTCk7CisKKyAgLy8gU2V0cyB0aGUgcXVldWUgdGhhdCBvd25zIHRoaXMgbWVzc2FnZS4KKyAgdm9pZCBzZXRfcXVldWUoUmF3UXVldWUgKnF1ZXVlKSB7IHF1ZXVlXyA9IHF1ZXVlOyB9CisKKyAgLy8gVGhlIHF1ZXVlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgYSBwYXJ0IG9mLgorICBSYXdRdWV1ZSAqcXVldWVfOworICAvLyBUaGUgbWVzc2FnZSBvciBOVUxMLgorICBUICptc2dfOworCisgIC8vIFByb3RlY3QgZXZpbCBjb25zdHJ1Y3RvcnMuCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTY29wZWRNZXNzYWdlUHRyPFQ+KTsKK307CisKKy8vIFNwZWNpYWxpemF0aW9ucyBmb3IgdGhlIEJ1aWxkZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaW4gdGhlIC5xLmgKKy8vIGhlYWRlciBmaWxlcyB3aXRoIGFsbCBvZiB0aGUgaGFuZHkgYnVpbGRlciBtZXRob2RzLgordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBNZXNzYWdlQnVpbGRlciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgTWVzc2FnZTsKKyAgYm9vbCBTZW5kKCk7Cit9OworCisvLyBUT0RPKGFzY2h1aCk6IEJhc2UgY2xhc3MKKy8vIFQgbXVzdCBiZSBhIE1lc3NhZ2Ugd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG1lc3NhZ2VzIGdlbmVyYXRlZCBieQorLy8gdGhlIC5xIGZpbGVzLgordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBRdWV1ZSB7CisgcHVibGljOgorICB0eXBlZGVmIFQgTWVzc2FnZTsKKworICBRdWV1ZShjb25zdCBjaGFyICpxdWV1ZV9uYW1lKQorICAgICAgOiBxdWV1ZV9uYW1lXyhxdWV1ZV9uYW1lKSwgcXVldWVfKE5VTEwpLCBxdWV1ZV9tc2dfKE5VTEwsIE5VTEwpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNobV9vazxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiVGhlIHByb3ZpZGVkIG1lc3NhZ2UgdHlwZSBjYW4ndCBiZSBwdXQgaW4gc2htZW0uIik7CisgIH0KKworICAvLyBJbml0aWFsaXplcyB0aGUgcXVldWUuICBUaGlzIG1heSBvcHRpb25hbGx5IGJlIGNhbGxlZCB0byBkbyBhbnkgb25lIHRpbWUKKyAgLy8gd29yayBiZWZvcmUgc2VuZGluZyBpbmZvcm1hdGlvbiwgYW5kIG1heSBiZSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisgIC8vIEluaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCwgYnV0IHRoaXMgd2lsbCBjYXVzZSBzZW5kaW5nIHRvCisgIC8vIHRha2UgYSBkaWZmZXJlbnQgYW1vdW50IG9mIHRpbWUgdGhlIGZpcnN0IGN5Y2xlLgorICB2b2lkIEluaXQoKTsKKworICAvLyBSZW1vdmVzIGFsbCBpbnRlcm5hbCByZWZlcmVuY2VzIHRvIHNoYXJlZCBtZW1vcnkgc28gc2hhcmVkIG1lbW9yeSBjYW4gYmUKKyAgLy8gcmVzdGFydGVkIHNhZmVseS4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiB0ZXN0aW5nLgorICB2b2lkIENsZWFyKCk7CisKKyAgLy8gRmV0Y2hlcyB0aGUgbmV4dCBtZXNzYWdlIGZyb20gdGhlIHF1ZXVlLgorICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGEgbmV3IG1lc3NhZ2UgYXZhaWxhYmxlIGFuZCB3ZSBzdWNjZXNzZnVsbHkKKyAgLy8gZmV0Y2hlZCBpdC4KKyAgYm9vbCBGZXRjaE5leHQoKTsKKworICAvLyBGZXRjaGVzIHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUsIHdhaXRpbmcgaWYgbmVjZXNzYXJ5IHVudGlsIHRoZXJlCisgIC8vIGlzIG9uZS4KKyAgdm9pZCBGZXRjaE5leHRCbG9ja2luZygpOworCisgIC8vIEZldGNoZXMgdGhlIGxhc3QgbWVzc2FnZSBmcm9tIHRoZSBxdWV1ZS4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhIG5ldyBtZXNzYWdlIGF2YWlsYWJsZSBhbmQgd2Ugc3VjY2Vzc2Z1bGx5CisgIC8vIGZldGNoZWQgaXQuCisgIGJvb2wgRmV0Y2hMYXRlc3QoKTsKKworICAvLyBGZXRjaGVzIHRoZSBsYXRlc3QgbWVzc2FnZSBmcm9tIHRoZSBxdWV1ZSwgb3IgYmxvY2tzIGlmIHdlIGhhdmUgYWxyZWFkeQorICAvLyBmZXRjaGVkIGl0IHVudGlsIGFub3RoZXIgaXMgYXZpbGFibGUuCisgIHZvaWQgRmV0Y2hBbm90aGVyKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgYWdlIG9mIHRoZSBtZXNzYWdlLgorICBjb25zdCB0aW1lOjpUaW1lIEFnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGltZTo6VGltZTo6Tm93KCkgLSBxdWV1ZV9tc2dfLT5zZW50X3RpbWU7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxhdGVzdCB2YWx1ZSBpbiB0aGUgcXVldWUgaXMgbmV3ZXIgdGhhbiBhZ2UgbXNlY29uZHMuCisgIC8vIERFUFJFQ0FURUQoYnJpYW5zKTogVXNlIElzTmV3ZXJUaGFuKGNvbnN0IHRpbWU6OlRpbWUmKSBpbnN0ZWFkLgorICBib29sIElzTmV3ZXJUaGFuTVMoaW50IGFnZSkgY29uc3QgeworICAgIC8vIFRPRE8oYXNjaHVoKTogTG9nIHZlcnkgdmVyYm9zZWx5IGlmIHNvbWV0aGluZyBpcyBfZXZlcl8gc3RhbGUuCisgICAgcmV0dXJuIElzTmV3ZXJUaGFuKHRpbWU6OlRpbWU6OkluTVMoYWdlKSk7CisgIH0KKworICBib29sIElzTmV3ZXJUaGFuKGNvbnN0IHRpbWU6OlRpbWUgJmFnZSkgY29uc3QgeworICAgIHJldHVybiBnZXQoKSAhPSBudWxscHRyICYmIEFnZSgpIDwgYWdlOworICB9CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4KKyAgLy8gVGhpcyBwb2ludGVyIHdpbGwgYmUgdmFsaWQgdW50aWwgYSBuZXcgbWVzc2FnZSBpcyBmZXRjaGVkLgorICBjb25zdCBUICpnZXQoKSBjb25zdCB7IHJldHVybiBxdWV1ZV9tc2dfLmdldCgpOyB9CisKKyAgLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZS4KKyAgLy8gVGhlIG1lc3NhZ2Ugd2lsbCBiZSB2YWxpZCB1bnRpbCBhIG5ldyBtZXNzYWdlIGlzIGZldGNoZWQuCisgIGNvbnN0IFQgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBjb25zdCBUICptc2cgPSBnZXQoKTsKKyAgICBhc3NlcnQobXNnICE9IE5VTEwpOworICAgIHJldHVybiAqbXNnOworICB9CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4KKyAgLy8gVGhpcyBwb2ludGVyIHdpbGwgYmUgdmFsaWQgdW50aWwgYSBuZXcgbWVzc2FnZSBpcyBmZXRjaGVkLgorICBjb25zdCBUICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIGNvbnN0IFQgKm1zZyA9IGdldCgpOworICAgIGFzc2VydChtc2cgIT0gTlVMTCk7CisgICAgcmV0dXJuIG1zZzsKKyAgfQorCisgIC8vIFJldHVybnMgYSBzY29wZWRfcHRyIGNvbnRhaW5pbmcgYSBtZXNzYWdlLgorICAvLyBHQ0Mgd2lsbCBvcHRpbWl6ZSBhd2F5IHRoZSBjb3B5IGNvbnN0cnVjdG9yLCBzbyB0aGlzIGlzIHNhZmUuCisgIFNjb3BlZE1lc3NhZ2VQdHI8VD4gTWFrZU1lc3NhZ2UoKTsKKworICAvLyBSZXR1cm5zIGEgbWVzc2FnZSBidWlsZGVyIHRoYXQgY29udGFpbnMgYSBwcmUtYWxsb2NhdGVkIG1lc3NhZ2UuCisgIC8vIFRoaXMgbWVzc2FnZSB3aWxsIHN0YXJ0IG91dCBjb21wbGV0ZWx5IHplcm9lZC4KKyAgYW9zOjpNZXNzYWdlQnVpbGRlcjxUPiBNYWtlV2l0aEJ1aWxkZXIoKTsKKworICBjb25zdCBjaGFyICpuYW1lKCkgY29uc3QgeyByZXR1cm4gcXVldWVfbmFtZV87IH0KKworIHByaXZhdGU6CisgIGNvbnN0IGNoYXIgKnF1ZXVlX25hbWVfOworCisgIFQgKk1ha2VSYXdNZXNzYWdlKCk7CisKKyAgLy8gUG9pbnRlciB0byB0aGUgcXVldWUgdGhhdCB0aGlzIG9iamVjdCBmZXRjaGVzIGZyb20uCisgIFJhd1F1ZXVlICpxdWV1ZV87CisgIGludCBpbmRleF8gPSAwOworICAvLyBTY29wZWQgcG9pbnRlciBob2xkaW5nIHRoZSBsYXRlc3QgbWVzc2FnZSBvciBOVUxMLgorICBTY29wZWRNZXNzYWdlUHRyPGNvbnN0IFQ+IHF1ZXVlX21zZ187CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFF1ZXVlPFQ+KTsKK307CisKKy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBxdWV1ZSBncm91cHMuCitjbGFzcyBRdWV1ZUdyb3VwIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYSBxdWV1ZSBncm91cCBnaXZlbiBpdHMgbmFtZSBhbmQgYSB1bmlxdWUgaGFzaCBvZiB0aGUgbmFtZSBhbmQKKyAgLy8gdHlwZS4KKyAgUXVldWVHcm91cChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBoYXNoKSA6IG5hbWVfKG5hbWUpLCBoYXNoXyhoYXNoKSB7fQorCisgIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlIGdyb3VwLgorICBjb25zdCBjaGFyICpuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQorICAvLyBSZXR1cm5zIGEgdW5pcXVlIGhhc2ggcmVwcmVzZW50aW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHF1ZXVlIGdyb3VwLgorICB1aW50MzJfdCBoYXNoKCkgY29uc3QgeyByZXR1cm4gaGFzaF87IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICB1aW50MzJfdCBoYXNoXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL3F1ZXVlLXRtcGwuaCIKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX1FVRVVFX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3F1ZXVlX3Rlc3QuY2MgYi9hb3MvY29tbW9uL3F1ZXVlX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwMzAxZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vcXVldWVfdGVzdC5jYwpAQCAtMCwwICsxLDMyNCBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3Rlc3RfcXVldWUucS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWVfdGVzdHV0aWxzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3RocmVhZC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBjb21tb24geworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBRdWV1ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgU2V0RGllVGVzdE1vZGUodHJ1ZSk7CisgIH0KKworICBHbG9iYWxDb3JlSW5zdGFuY2UgbXlfY29yZTsKKyAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0IHF1ZXVlIHNvIHRoYXQgaXQgaW52YWxpZGF0ZXMgdGhlIHF1ZXVlCisgIC8vIHRoYXQgaXQgcG9pbnRzIHRvLiAgT3RoZXJ3aXNlLCB3ZSB3aWxsIGhhdmUgYSBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkgdGhhdAorICAvLyBpcyBubyBsb25nZXIgdmFsaWQuCisgIDo6YW9zOjpRdWV1ZTxUZXN0aW5nTWVzc2FnZT4gbXlfdGVzdF9xdWV1ZTsKKworICBRdWV1ZVRlc3QoKSA6IG15X3Rlc3RfcXVldWUoIi5hb3MuY29tbW9uLnRlc3RpbmcudGVzdF9xdWV1ZSIpIHt9Cit9OworCitjbGFzcyBNeVRocmVhZCA6IHB1YmxpYyB1dGlsOjpUaHJlYWQgeworIHB1YmxpYzoKKyAgTXlUaHJlYWQoKSA6IHRocmVhZGVkX3Rlc3RfcXVldWUoIi5hb3MuY29tbW9uLnRlc3RpbmcudGVzdF9xdWV1ZSIpIHt9CisKKyAgdmlydHVhbCB2b2lkIFJ1bigpIHsKKyAgICB0aHJlYWRlZF90ZXN0X3F1ZXVlLkZldGNoTmV4dEJsb2NraW5nKCk7CisgICAgRVhQRUNUX1RSVUUodGhyZWFkZWRfdGVzdF9xdWV1ZS0+dGVzdF9ib29sKTsKKyAgICBFWFBFQ1RfRVEoMHg5NzEsIHRocmVhZGVkX3Rlc3RfcXVldWUtPnRlc3RfaW50KTsKKyAgfQorCisgIDo6YW9zOjpRdWV1ZTxUZXN0aW5nTWVzc2FnZT4gdGhyZWFkZWRfdGVzdF9xdWV1ZTsKKyBwcml2YXRlOgorICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTXlUaHJlYWQpOworfTsKKworCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBzZW5kIGEgbWVzc2FnZSB0byBhbm90aGVyIHRocmVhZCBhbmQgaXQgYmxvY2tpbmcgcmVjZWl2ZXMKKy8vIGl0IGF0IHRoZSBjb3JyZWN0IHRpbWUuCitURVNUX0YoUXVldWVUZXN0LCBGZXRjaEJsb2NraW5nKSB7CisgIE15VGhyZWFkIHQ7CisgIHQuU3RhcnQoKTsKKyAgdXNsZWVwKDUwMDAwKTsKKyAgbXlfdGVzdF9xdWV1ZS5NYWtlV2l0aEJ1aWxkZXIoKS50ZXN0X2Jvb2wodHJ1ZSkudGVzdF9pbnQoMHg5NzEpLlNlbmQoKTsKKyAgdC5Kb2luKCk7CisgIEVYUEVDVF9MRSh0LnRocmVhZGVkX3Rlc3RfcXVldWUuQWdlKCksIHRpbWU6OlRpbWU6OkluTVMoNTcpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gc2VuZCBhIG1lc3NhZ2Ugd2l0aCB0aGUgbWVzc2FnZSBwb2ludGVyIGFuZCBnZXQgaXQgYmFjay4KK1RFU1RfRihRdWV1ZVRlc3QsIFNlbmRNZXNzYWdlKSB7CisgIFNjb3BlZE1lc3NhZ2VQdHI8VGVzdGluZ01lc3NhZ2U+IG1zZyA9IG15X3Rlc3RfcXVldWUuTWFrZU1lc3NhZ2UoKTsKKyAgbXNnLT50ZXN0X2Jvb2wgPSB0cnVlOworICBtc2ctPnRlc3RfaW50ID0gMHg5NzE7CisgIG1zZy5TZW5kKCk7CisKKyAgQVNTRVJUX1RSVUUobXlfdGVzdF9xdWV1ZS5GZXRjaExhdGVzdCgpKTsKKyAgRVhQRUNUX1RSVUUobXlfdGVzdF9xdWV1ZS0+dGVzdF9ib29sKTsKKyAgRVhQRUNUX0VRKDB4OTcxLCBteV90ZXN0X3F1ZXVlLT50ZXN0X2ludCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIHNlbmQgYSBtZXNzYWdlIHdpdGggdGhlIGJ1aWxkZXIgYW5kIGdldCBpdCBiYWNrLgorVEVTVF9GKFF1ZXVlVGVzdCwgU2VuZFdpdGhCdWlsZGVyKSB7CisgIG15X3Rlc3RfcXVldWUuTWFrZVdpdGhCdWlsZGVyKCkudGVzdF9ib29sKHRydWUpLnRlc3RfaW50KDB4OTcxKS5TZW5kKCk7CisKKyAgQVNTRVJUX1RSVUUobXlfdGVzdF9xdWV1ZS5GZXRjaExhdGVzdCgpKTsKKyAgRVhQRUNUX0VRKHRydWUsIG15X3Rlc3RfcXVldWUtPnRlc3RfYm9vbCk7CisgIEVYUEVDVF9FUSgweDk3MSwgbXlfdGVzdF9xdWV1ZS0+dGVzdF9pbnQpOworICBFWFBFQ1RfRVEodHJ1ZSwgbXlfdGVzdF9xdWV1ZS5Jc05ld2VyVGhhbk1TKDEwMDAwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbXVsdGlwbGUgcXVldWUgaW5zdGFuY2VzIGRvbid0IGJyZWFrIGVhY2ggb3RoZXIuCitURVNUX0YoUXVldWVUZXN0LCBNdWx0aXBsZVF1ZXVlcykgeworICBteV90ZXN0X3F1ZXVlLk1ha2VXaXRoQnVpbGRlcigpLnRlc3RfYm9vbCh0cnVlKS50ZXN0X2ludCgweDk3MSkuU2VuZCgpOworICBBU1NFUlRfVFJVRShteV90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfVFJVRShteV90ZXN0X3F1ZXVlLmdldCgpKTsKKworICB7CisgICAgOjphb3M6OlF1ZXVlPFRlc3RpbmdNZXNzYWdlPiBteV9vdGhlcl90ZXN0X3F1ZXVlKAorICAgICAgICAiLmFvcy5jb21tb24udGVzdGluZy5xdWV1ZV9uYW1lIik7CisgICAgbXlfb3RoZXJfdGVzdF9xdWV1ZS5NYWtlTWVzc2FnZSgpOworICAgIEVYUEVDVF9GQUxTRShteV9vdGhlcl90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICAgIEVYUEVDVF9GQUxTRShteV90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICB9CisKKyAgRVhQRUNUX1RSVUUobXlfdGVzdF9xdWV1ZS5nZXQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdXNpbmcgYSBxdWV1ZSBmcm9tIG11bHRpcGxlIHRocmVhZHMgd29ya3MgY29ycmVjdGx5LgorVEVTVF9GKFF1ZXVlVGVzdCwgTXVsdGlwbGVUaHJlYWRzKSB7CisgIG15X3Rlc3RfcXVldWUuTWFrZVdpdGhCdWlsZGVyKCkudGVzdF9ib29sKHRydWUpLnRlc3RfaW50KDB4OTcxKS5TZW5kKCk7CisgIEFTU0VSVF9UUlVFKG15X3Rlc3RfcXVldWUuRmV0Y2hMYXRlc3QoKSk7CisgIG15X3Rlc3RfcXVldWUuTWFrZVdpdGhCdWlsZGVyKCkudGVzdF9ib29sKHRydWUpLnRlc3RfaW50KDB4MjU0KS5TZW5kKCk7CisgIEVYUEVDVF9FUSgweDk3MSwgbXlfdGVzdF9xdWV1ZS0+dGVzdF9pbnQpOworCisgIDo6YW9zOjp1dGlsOjpGdW5jdGlvblRocmVhZDo6UnVuSW5PdGhlclRocmVhZChbdGhpc10oKSB7CisgICAgQVNTRVJUX1RSVUUobXlfdGVzdF9xdWV1ZS5GZXRjaExhdGVzdCgpKTsKKyAgICBFWFBFQ1RfRVEoMHgyNTQsIG15X3Rlc3RfcXVldWUtPnRlc3RfaW50KTsKKyAgfSk7CisgIEVYUEVDVF9FUSgweDI1NCwgbXlfdGVzdF9xdWV1ZS0+dGVzdF9pbnQpOworfQorCisvLyBNYWtlcyBzdXJlIHRoYXQgTWFrZVdpdGhCdWlsZGVyIHplcm9zIHRoZSBtZXNzYWdlIGluaXRpYWxseS4KKy8vIFRoaXMgbWlnaHQgcmFuZG9tbHkgc3VjY2VlZCBzb21ldGltZXMsIGJ1dCBpdCB3aWxsIGZhaWwgd2l0aCBhc2FuIGlmIGl0CisvLyBkb2Vzbid0LgorVEVTVF9GKFF1ZXVlVGVzdCwgQnVpbGRlclplcm8pIHsKKyAgbXlfdGVzdF9xdWV1ZS5NYWtlV2l0aEJ1aWxkZXIoKS5TZW5kKCk7CisKKyAgQVNTRVJUX1RSVUUobXlfdGVzdF9xdWV1ZS5GZXRjaExhdGVzdCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG15X3Rlc3RfcXVldWUtPnRlc3RfYm9vbCk7CisgIEVYUEVDVF9FUSgwLCBteV90ZXN0X3F1ZXVlLT50ZXN0X2ludCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdmFyaW91cyBwb2ludGVyIGRlcmVmIGZ1bmN0aW9ucyBhdCBsZWFzdCBzZWVtIHRvIHdvcmsuCitURVNUX0YoUXVldWVUZXN0LCBQb2ludGVyRGVyZWYpIHsKKyAgbXlfdGVzdF9xdWV1ZS5NYWtlV2l0aEJ1aWxkZXIoKS50ZXN0X2Jvb2wodHJ1ZSkudGVzdF9pbnQoMHg5NzEpLlNlbmQoKTsKKworICBBU1NFUlRfVFJVRShteV90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICBjb25zdCBUZXN0aW5nTWVzc2FnZSAqbXNnX3B0ciA9IG15X3Rlc3RfcXVldWUuZ2V0KCk7CisgIEFTU0VSVF9ORShzdGF0aWNfY2FzdDxUZXN0aW5nTWVzc2FnZSo+KE5VTEwpLCBtc2dfcHRyKTsKKyAgRVhQRUNUX0VRKDB4OTcxLCBtc2dfcHRyLT50ZXN0X2ludCk7CisgIEVYUEVDVF9FUShtc2dfcHRyLCAmKCpteV90ZXN0X3F1ZXVlKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmV0Y2hOZXh0IGRvZXNuJ3QgbWlzcyBhbnkgbWVzc2FnZXMuCitURVNUX0YoUXVldWVUZXN0LCBGZXRjaE5leHQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgbXlfdGVzdF9xdWV1ZS5NYWtlV2l0aEJ1aWxkZXIoKS50ZXN0X2Jvb2wodHJ1ZSkudGVzdF9pbnQoaSkuU2VuZCgpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgQVNTRVJUX1RSVUUobXlfdGVzdF9xdWV1ZS5GZXRjaE5leHQoKSk7CisgICAgRVhQRUNUX0VRKGksIG15X3Rlc3RfcXVldWUtPnRlc3RfaW50KTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGF0IEZldGNoTGF0ZXN0IHNraXBzIGEgbWlzc2luZyBtZXNzYWdlLgorVEVTVF9GKFF1ZXVlVGVzdCwgRmV0Y2hMYXRlc3QpIHsKKyAgbXlfdGVzdF9xdWV1ZS5NYWtlV2l0aEJ1aWxkZXIoKS50ZXN0X2Jvb2wodHJ1ZSkudGVzdF9pbnQoMHgyNTQpLlNlbmQoKTsKKyAgbXlfdGVzdF9xdWV1ZS5NYWtlV2l0aEJ1aWxkZXIoKS50ZXN0X2Jvb2wodHJ1ZSkudGVzdF9pbnQoMHg5NzEpLlNlbmQoKTsKKworICBBU1NFUlRfVFJVRShteV90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfRVEoMHg5NzEsIG15X3Rlc3RfcXVldWUtPnRlc3RfaW50KTsKK30KKworLy8gVGVzdHMgdGhhdCBGZXRjaExhdGVzdCB3b3JrcyB3aXRoIG11bHRpcGxlIHJlYWRlcnMuCitURVNUX0YoUXVldWVUZXN0LCBGZXRjaExhdGVzdE11bHRpcGxlKSB7CisgIDo6YW9zOjpRdWV1ZTxUZXN0aW5nTWVzc2FnZT4gbXlfc2Vjb25kX3Rlc3RfcXVldWUoCisgICAgICAiLmFvcy5jb21tb24udGVzdGluZy50ZXN0X3F1ZXVlIik7CisgIG15X3Rlc3RfcXVldWUuTWFrZVdpdGhCdWlsZGVyKCkudGVzdF9ib29sKHRydWUpLnRlc3RfaW50KDB4MjU0KS5TZW5kKCk7CisgIG15X3Rlc3RfcXVldWUuTWFrZVdpdGhCdWlsZGVyKCkudGVzdF9ib29sKHRydWUpLnRlc3RfaW50KDB4OTcxKS5TZW5kKCk7CisKKyAgQVNTRVJUX1RSVUUobXlfdGVzdF9xdWV1ZS5GZXRjaExhdGVzdCgpKTsKKyAgRVhQRUNUX0VRKDB4OTcxLCBteV90ZXN0X3F1ZXVlLT50ZXN0X2ludCk7CisgIEFTU0VSVF9UUlVFKG15X3NlY29uZF90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICBBU1NFUlRfVFJVRShteV9zZWNvbmRfdGVzdF9xdWV1ZS5nZXQoKSAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDB4OTcxLCBteV9zZWNvbmRfdGVzdF9xdWV1ZS0+dGVzdF9pbnQpOworfQorCisKKy8vIFRlc3RzIHRoYXQgZmV0Y2hpbmcgd2l0aG91dCBhIG5ldyBtZXNzYWdlIHJldHVybnMgZmFsc2UuCitURVNUX0YoUXVldWVUZXN0LCBGZXRjaExhdGVzdFdpdGhvdXRNZXNzYWdlKSB7CisgIG15X3Rlc3RfcXVldWUuTWFrZVdpdGhCdWlsZGVyKCkudGVzdF9ib29sKHRydWUpLnRlc3RfaW50KDB4MjU0KS5TZW5kKCk7CisgIEVYUEVDVF9UUlVFKG15X3Rlc3RfcXVldWUuRmV0Y2hMYXRlc3QoKSk7CisgIEVYUEVDVF9GQUxTRShteV90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfRkFMU0UobXlfdGVzdF9xdWV1ZS5GZXRjaExhdGVzdCgpKTsKKyAgRVhQRUNUX0VRKDB4MjU0LCBteV90ZXN0X3F1ZXVlLT50ZXN0X2ludCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZmV0Y2hpbmcgd2l0aG91dCBhIG1lc3NhZ2UgcmV0dXJucyBmYWxzZS4KK1RFU1RfRihRdWV1ZVRlc3QsIEZldGNoT25GcmVzaFF1ZXVlKSB7CisgIEVYUEVDVF9GQUxTRShteV90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8VGVzdGluZ01lc3NhZ2UqPihOVUxMKSwgbXlfdGVzdF9xdWV1ZS5nZXQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZmV0Y2ggbmV4dCB3aXRob3V0IGEgbWVzc2FnZSByZXR1cm5zIGZhbHNlLgorVEVTVF9GKFF1ZXVlVGVzdCwgRmV0Y2hOZXh0T25GcmVzaFF1ZXVlKSB7CisgIEVYUEVDVF9GQUxTRShteV90ZXN0X3F1ZXVlLkZldGNoTmV4dCgpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PFRlc3RpbmdNZXNzYWdlKj4oTlVMTCksIG15X3Rlc3RfcXVldWUuZ2V0KCkpOworfQorCisvLyBUZXN0cyB0aGF0IGZldGNoIG5leHQgd2l0aG91dCBhIG5ldyBtZXNzYWdlIHJldHVybnMgZmFsc2UuCitURVNUX0YoUXVldWVUZXN0LCBGZXRjaE5leHRXaXRob3V0TWVzc2FnZSkgeworICBteV90ZXN0X3F1ZXVlLk1ha2VXaXRoQnVpbGRlcigpLnRlc3RfYm9vbCh0cnVlKS50ZXN0X2ludCgweDI1NCkuU2VuZCgpOworICBFWFBFQ1RfVFJVRShteV90ZXN0X3F1ZXVlLkZldGNoTmV4dCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG15X3Rlc3RfcXVldWUuRmV0Y2hOZXh0KCkpOworICBFWFBFQ1RfTkUoc3RhdGljX2Nhc3Q8VGVzdGluZ01lc3NhZ2UqPihOVUxMKSwgbXlfdGVzdF9xdWV1ZS5nZXQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYWdlIG1ha2VzIHNvbWUgc2Vuc2UuCitURVNUX0YoUXVldWVUZXN0LCBBZ2UpIHsKKyAgbXlfdGVzdF9xdWV1ZS5NYWtlV2l0aEJ1aWxkZXIoKS50ZXN0X2Jvb2wodHJ1ZSkudGVzdF9pbnQoMHg5NzEpLlNlbmQoKTsKKworICBBU1NFUlRfVFJVRShteV90ZXN0X3F1ZXVlLkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfVFJVRShteV90ZXN0X3F1ZXVlLklzTmV3ZXJUaGFuTVMoMTAwKSk7CisgIGNvbnN0IFRpbWUgYWdlID0gbXlfdGVzdF9xdWV1ZS5BZ2UoKTsKKyAgRVhQRUNUX0VRKDAsIGFnZS5zZWMoKSk7CisgIEVYUEVDVF9HRSgxMDAwMDAwMDAsIGFnZS5uc2VjKCkpOworfQorCisKK2NsYXNzIEdyb3VwVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgR2xvYmFsQ29yZUluc3RhbmNlIG15X2NvcmU7CisgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBncm91cCBzbyB0aGF0IGl0IGludmFsaWRhdGVzIHRoZSBxdWV1ZQorICAvLyB0aGF0IGl0IHBvaW50cyB0by4gIE90aGVyd2lzZSwgd2Ugd2lsbCBoYXZlIGEgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5IHRoYXQKKyAgLy8gaXMgbm8gbG9uZ2VyIHZhbGlkLgorICBUd29RdWV1ZXMgbXlfdGVzdF9xdWV1ZWdyb3VwOworCisgIEdyb3VwVGVzdCgpCisgICAgICA6IG15X3Rlc3RfcXVldWVncm91cCgiLmFvcy5jb21tb24udGVzdGluZy50ZXN0X3F1ZXVlZ3JvdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDU2MTExNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIuYW9zLmNvbW1vbi50ZXN0aW5nLnRlc3RfcXVldWVncm91cC5maXJzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmFvcy5jb21tb24udGVzdGluZy50ZXN0X3F1ZXVlZ3JvdXAuc2Vjb25kIikge30KK307CisKKy8vIFRlc3RzIHRoYXQgdGhlIGhhc2ggZ2V0cyBwcmVzZXJ2ZWQuCitURVNUX0YoR3JvdXBUZXN0LCBIYXNoKSB7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50MzJfdD4oMHgyMDU2MTExNCksIG15X3Rlc3RfcXVldWVncm91cC5oYXNoKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBoYXNoIHdvcmtzLgorVEVTVF9GKEdyb3VwVGVzdCwgUmVhbEhhc2gpIHsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQzMl90PigweDkzNTk2YjJmKSwgdGVzdF9xdWV1ZWdyb3VwLmhhc2goKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbmFtZSB3b3Jrcy4KK1RFU1RfRihHcm91cFRlc3QsIE5hbWUpIHsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIuYW9zLmNvbW1vbi50ZXN0aW5nLnRlc3RfcXVldWVncm91cCIpLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcobXlfdGVzdF9xdWV1ZWdyb3VwLm5hbWUoKSkpOworfQorCisKK2NsYXNzIE1lc3NhZ2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBUZXN0aW5nTWVzc2FnZSBtc2c7Cit9OworCitURVNUX0YoTWVzc2FnZVRlc3QsIFplcm9pbmcpIHsKKyAgbXNnLnRlc3RfYm9vbCA9IHRydWU7CisgIG1zZy50ZXN0X2ludCA9IDB4MjU0OworICBtc2cuU2V0VGltZVRvTm93KCk7CisKKyAgbXNnLlplcm8oKTsKKworICBFWFBFQ1RfRkFMU0UobXNnLnRlc3RfYm9vbCk7CisgIEVYUEVDVF9FUSgwLCBtc2cudGVzdF9pbnQpOworICBFWFBFQ1RfRVEoMCwgbXNnLnNlbnRfdGltZS5zZWMoKSk7CisgIEVYUEVDVF9FUSgwLCBtc2cuc2VudF90aW1lLm5zZWMoKSk7Cit9CisKK1RFU1RfRihNZXNzYWdlVGVzdCwgU2l6ZSkgeworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PigxMyksIG1zZy5TaXplKCkpOworfQorCitURVNUX0YoTWVzc2FnZVRlc3QsIFNlcmlhbGl6ZSkgeworICBjaGFyIHNlcmlhbGl6ZWRfZGF0YVttc2cuU2l6ZSgpXTsKKyAgbXNnLnRlc3RfYm9vbCA9IHRydWU7CisgIG1zZy50ZXN0X2ludCA9IDB4MjU0OworICBtc2cuU2V0VGltZVRvTm93KCk7CisKKyAgbXNnLlNlcmlhbGl6ZShzZXJpYWxpemVkX2RhdGEpOworCisgIFRlc3RpbmdNZXNzYWdlIG5ld19tc2c7CisgIG5ld19tc2cuRGVzZXJpYWxpemUoc2VyaWFsaXplZF9kYXRhKTsKKworICBFWFBFQ1RfRVEobXNnLnRlc3RfYm9vbCwgbmV3X21zZy50ZXN0X2Jvb2wpOworICBFWFBFQ1RfRVEobXNnLnRlc3RfaW50LCBuZXdfbXNnLnRlc3RfaW50KTsKKyAgRVhQRUNUX0VRKG1zZy5zZW50X3RpbWUsIG5ld19tc2cuc2VudF90aW1lKTsKK30KKworLy8gVGVzdHMgdGhhdCBQcmludCBwcmludHMgb3V0IGEgbWVzc2FnZSBuaWNlbHkuCitURVNUX0YoTWVzc2FnZVRlc3QsIFByaW50KSB7CisgIGNoYXIgcHJpbnRkYXRhWzEwMjRdOworICBtc2cudGVzdF9ib29sID0gdHJ1ZTsKKyAgbXNnLnRlc3RfaW50ID0gMjA1NjsKKyAgbXNnLnNlbnRfdGltZSA9IFRpbWUoOTcxLCAyNTQpOworCisgIHN0ZDo6c3RyaW5nIGdvbGRlbigiOTcxLjAwMDAwMDI1NHMsIFQsIDIwNTYiKTsKKyAgRVhQRUNUX0VRKGdvbGRlbi5zaXplKCksIG1zZy5QcmludChwcmludGRhdGEsIHNpemVvZihwcmludGRhdGEpKSk7CisKKyAgRVhQRUNUX0VRKGdvbGRlbiwgc3RkOjpzdHJpbmcocHJpbnRkYXRhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGhhc2ggbmV2ZXIgY2hhbmdlcy4gIElmIGl0IGNoYW5nZXMsIHRoZW4gc29tZW9uZSBicm9rZSB0aGUKKy8vIGhhc2ggcm91dGluZSBvciBjaGFuZ2VkIHRoZSBtZXNzYWdlIGRlY2xhcmF0aW9uLiAgQm90aCBjaGFuZ2VzIG5lZWQgdG8gYmUKKy8vIHZhbGlkYXRlZCBieSBoYW5kLgorVEVTVF9GKE1lc3NhZ2VUZXN0LCBIYXNoKSB7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50MzJfdD4oMHhjMzM2NTFhYyksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oVGVzdGluZ01lc3NhZ2U6OmtIYXNoKSk7Cit9CisKK1RFU1RfRihNZXNzYWdlVGVzdCwgU2V0Tm93KSB7CisgIG1zZy5TZXRUaW1lVG9Ob3coKTsKKyAgRVhQRUNUX0xFKG1zZy5zZW50X3RpbWUgLSBUaW1lOjpOb3coKSwgVGltZTo6SW5NUygyMCkpOworfQorCisvLyBUZXN0cyB0aGF0IEVxdWFsc05vVGltZSB3b3Jrcy4KK1RFU1RfRihNZXNzYWdlVGVzdCwgRXF1YWxzTm9UaW1lKSB7CisgIG1zZy50ZXN0X2Jvb2wgPSB0cnVlOworICBtc2cudGVzdF9pbnQgPSA5NzE7CisgIFRlc3RpbmdNZXNzYWdlIG90aGVyOworICBvdGhlci50ZXN0X2ludCA9IDk3MTsKKyAgRVhQRUNUX0ZBTFNFKG90aGVyLkVxdWFsc05vVGltZShtc2cpKTsKKyAgRVhQRUNUX0ZBTFNFKG1zZy5FcXVhbHNOb1RpbWUob3RoZXIpKTsKKyAgb3RoZXIudGVzdF9ib29sID0gdHJ1ZTsKKyAgRVhQRUNUX1RSVUUob3RoZXIuRXF1YWxzTm9UaW1lKG1zZykpOworICBFWFBFQ1RfVFJVRShtc2cuRXF1YWxzTm9UaW1lKG90aGVyKSk7CisgIG1zZy5TZXRUaW1lVG9Ob3coKTsKKyAgRVhQRUNUX1RSVUUobXNnLkVxdWFsc05vVGltZShvdGhlcikpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuY2MgYi9hb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDBiNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuY2MKQEAgLTAsMCArMSwxNzcgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vb25jZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbXV0ZXguaCIKKwordXNpbmcgOjphb3M6OmxvZ2dpbmc6OkxvZ01lc3NhZ2U7CisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbW1vbiB7CituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgeworCitjbGFzcyBUZXN0TG9nSW1wbGVtZW50YXRpb24gOiBwdWJsaWMgbG9nZ2luZzo6SGFuZGxlTWVzc2FnZUxvZ0ltcGxlbWVudGF0aW9uIHsKKyBwdWJsaWM6CisgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8TG9nTWVzc2FnZT4gJm1lc3NhZ2VzKCkgeyByZXR1cm4gbWVzc2FnZXNfOyB9CisKKyAgLy8gVGhpcyBjbGFzcyBoYXMgdG8gYmUgYSBzaW5nbGV0b24gc28gdGhhdCBldmVyeWJvZHkgY2FuIGdldCBhY2Nlc3MgdG8gdGhlCisgIC8vIHNhbWUgaW5zdGFuY2UgdG8gcmVhZCBvdXQgdGhlIG1lc3NhZ2VzIGV0Yy4KKyAgc3RhdGljIFRlc3RMb2dJbXBsZW1lbnRhdGlvbiAqR2V0SW5zdGFuY2UoKSB7CisgICAgc3RhdGljIE9uY2U8VGVzdExvZ0ltcGxlbWVudGF0aW9uPiBvbmNlKENyZWF0ZUluc3RhbmNlKTsKKyAgICByZXR1cm4gb25jZS5HZXQoKTsKKyAgfQorCisgIC8vIENsZWFycyBvdXQgYWxsIG9mIHRoZSBtZXNzYWdlcyBhbHJlYWR5IHJlY29yZGVkLgorICB2b2lkIENsZWFyTWVzc2FnZXMoKSB7CisgICAgOjphb3M6Ok11dGV4TG9ja2VyIGxvY2tlcigmbWVzc2FnZXNfbXV0ZXhfKTsKKyAgICBtZXNzYWdlc18uY2xlYXIoKTsKKyAgfQorCisgIC8vIFByaW50cyBvdXQgYWxsIG9mIHRoZSBtZXNzYWdlcyAobGlrZSB3aGVuIGEgdGVzdCBmYWlscykuCisgIHZvaWQgUHJpbnRBbGxNZXNzYWdlcygpIHsKKyAgICA6OmFvczo6TXV0ZXhMb2NrZXIgbG9ja2VyKCZtZXNzYWdlc19tdXRleF8pOworICAgIGZvciAoYXV0byBpdCA9IG1lc3NhZ2VzXy5iZWdpbigpOyBpdCAhPSBtZXNzYWdlc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIGxvZ2dpbmc6OmludGVybmFsOjpQcmludE1lc3NhZ2Uoc3Rkb3V0LCAqaXQpOworICAgIH0KKyAgfQorCisgIHZvaWQgU2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkgeworICAgIGlmIChzdHJjbXAoIi0iLCBmaWxlbmFtZSkgIT0gMCkgeworICAgICAgRklMRSAqbmV3ZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAidyIpOworCisgICAgICBpZiAobmV3ZmlsZSkgeworICAgICAgICBvdXRwdXRfZmlsZV8gPSBuZXdmaWxlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgUHJpbnRNZXNzYWdlc0FzVGhleUNvbWVJbigpIHsgcHJpbnRfYXNfbWVzc2FnZXNfY29tZV9pbl8gPSB0cnVlOyB9CisKKyBwcml2YXRlOgorICBUZXN0TG9nSW1wbGVtZW50YXRpb24oKSB7fQorICB+VGVzdExvZ0ltcGxlbWVudGF0aW9uKCkgeworICAgIGlmIChvdXRwdXRfZmlsZV8gIT0gc3Rkb3V0KSB7CisgICAgICBmY2xvc2Uob3V0cHV0X2ZpbGVfKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgVGVzdExvZ0ltcGxlbWVudGF0aW9uICpDcmVhdGVJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gbmV3IFRlc3RMb2dJbXBsZW1lbnRhdGlvbigpOworICB9CisKKyAgdmlydHVhbCB2b2lkIEhhbmRsZU1lc3NhZ2UoY29uc3QgTG9nTWVzc2FnZSAmbWVzc2FnZSkgb3ZlcnJpZGUgeworICAgIDo6YW9zOjpNdXRleExvY2tlciBsb2NrZXIoJm1lc3NhZ2VzX211dGV4Xyk7CisgICAgaWYgKG1lc3NhZ2UubGV2ZWwgPT0gRkFUQUwgfHwgcHJpbnRfYXNfbWVzc2FnZXNfY29tZV9pbl8pIHsKKyAgICAgIGxvZ2dpbmc6OmludGVybmFsOjpQcmludE1lc3NhZ2Uob3V0cHV0X2ZpbGVfLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICBtZXNzYWdlc18ucHVzaF9iYWNrKG1lc3NhZ2UpOworICB9CisKKyAgOjpzdGQ6OnZlY3RvcjxMb2dNZXNzYWdlPiBtZXNzYWdlc187CisgIGJvb2wgcHJpbnRfYXNfbWVzc2FnZXNfY29tZV9pbl8gPSBmYWxzZTsKKyAgRklMRSAqb3V0cHV0X2ZpbGVfID0gc3Rkb3V0OworICA6OmFvczo6TXV0ZXggbWVzc2FnZXNfbXV0ZXhfOworfTsKKworY2xhc3MgTXlUZXN0RXZlbnRMaXN0ZW5lciA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyAmLyp0ZXN0X2luZm8qLykgeworICAgIFRlc3RMb2dJbXBsZW1lbnRhdGlvbjo6R2V0SW5zdGFuY2UoKS0+Q2xlYXJNZXNzYWdlcygpOworICB9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyAmdGVzdF9pbmZvKSB7CisgICAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+RmFpbGVkKCkpIHsKKyAgICAgIHByaW50ZigiVGVzdCAlcyBmYWlsZWQuIFVzZSAnLS1wcmludC1sb2dzJyB0byBzZWUgYWxsIGxvZyBtZXNzYWdlcy5cbiIsCisgICAgICAgICAgICAgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoIGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQgJnJlc3VsdCkgeworICAgIGlmIChyZXN1bHQuZmFpbGVkKCkpIHsKKyAgICAgIGNvbnN0IGNoYXIgKmZhaWx1cmVfdHlwZSA9ICJ1bmtub3duIjsKKyAgICAgIHN3aXRjaCAocmVzdWx0LnR5cGUoKSkgeworICAgICAgICBjYXNlIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OlR5cGU6OmtOb25GYXRhbEZhaWx1cmU6CisgICAgICAgICAgZmFpbHVyZV90eXBlID0gIkVYUEVDVCI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6VHlwZTo6a0ZhdGFsRmFpbHVyZToKKyAgICAgICAgICBmYWlsdXJlX3R5cGUgPSAiQVNTRVJUIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjpUeXBlOjprU3VjY2VzczoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGxvZ19kbyhFUlJPUiwgIiVzOiAlZDogZ3Rlc3QgJXMgZmFpbHVyZVxuJXNcbiIsCisgICAgICAgICAgICAgcmVzdWx0LmZpbGVfbmFtZSgpLAorICAgICAgICAgICAgIHJlc3VsdC5saW5lX251bWJlcigpLAorICAgICAgICAgICAgIGZhaWx1cmVfdHlwZSwKKyAgICAgICAgICAgICByZXN1bHQubWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK307CisKK3ZvaWQgKkRvRW5hYmxlVGVzdExvZ2dpbmcoKSB7CisgIGxvZ2dpbmc6OkluaXQoKTsKKyAgbG9nZ2luZzo6QWRkSW1wbGVtZW50YXRpb24oVGVzdExvZ0ltcGxlbWVudGF0aW9uOjpHZXRJbnN0YW5jZSgpKTsKKworICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5BcHBlbmQoCisgICAgICBuZXcgTXlUZXN0RXZlbnRMaXN0ZW5lcigpKTsKKworICByZXR1cm4gTlVMTDsKK30KKworT25jZTx2b2lkPiBlbmFibGVfdGVzdF9sb2dnaW5nX29uY2UoRG9FbmFibGVUZXN0TG9nZ2luZyk7CisKK2NvbnN0IHNpemVfdCBrQ29yZVNpemUgPSAweDEwMDAwMDsKKwordm9pZCBUZXJtaW5hdGVFeGl0SGFuZGxlcigpIHsKKyAgX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0dsb2JhbENvcmVJbnN0YW5jZTo6R2xvYmFsQ29yZUluc3RhbmNlKCkgeworICBnbG9iYWxfY29yZSA9ICZnbG9iYWxfY29yZV9kYXRhXzsKKyAgZ2xvYmFsX2NvcmUtPm93bmVyID0gdHJ1ZTsKKyAgLy8gVXNlIG1tYXAoMikgbWFudWFsbHkgaW5zdGVhZCBvZiB0aHJvdWdoIG1hbGxvYygzKSBzbyB0aGF0IHdlIGNhbiBwYXNzCisgIC8vIE1BUF9TSEFSRUQgd2hpY2ggYWxsb3dzIGZvcmtlZCBwcm9jZXNzZXMgdG8gY29tbXVuaWNhdGUgdXNpbmcgdGhlCisgIC8vICJzaGFyZWQiIG1lbW9yeS4KKyAgdm9pZCAqbWVtb3J5ID0gbW1hcChOVUxMLCBrQ29yZVNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKyAgQ0hFQ0tfTkUobWVtb3J5LCBNQVBfRkFJTEVEKTsKKworICBhb3NfY29yZV91c2VfYWRkcmVzc19hc19zaGFyZWRfbWVtKG1lbW9yeSwga0NvcmVTaXplKTsKKworICBFbmFibGVUZXN0TG9nZ2luZygpOworfQorCitHbG9iYWxDb3JlSW5zdGFuY2U6On5HbG9iYWxDb3JlSW5zdGFuY2UoKSB7CisgIFBDSEVDSyhtdW5tYXAoZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QsIGtDb3JlU2l6ZSkpOworICBnbG9iYWxfY29yZSA9IE5VTEw7Cit9CisKK3ZvaWQgRW5hYmxlVGVzdExvZ2dpbmcoKSB7CisgIGVuYWJsZV90ZXN0X2xvZ2dpbmdfb25jZS5HZXQoKTsKK30KKwordm9pZCBQcmV2ZW50RXhpdCgpIHsKKyAgQ0hFQ0tfRVEoYXRleGl0KFRlcm1pbmF0ZUV4aXRIYW5kbGVyKSwgMCk7Cit9CisKK3ZvaWQgU2V0TG9nRmlsZU5hbWUoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgVGVzdExvZ0ltcGxlbWVudGF0aW9uOjpHZXRJbnN0YW5jZSgpLT5TZXRPdXRwdXRGaWxlKGZpbGVuYW1lKTsKK30KKwordm9pZCBGb3JjZVByaW50TG9nc0R1cmluZ1Rlc3RzKCkgeworICBUZXN0TG9nSW1wbGVtZW50YXRpb246OkdldEluc3RhbmNlKCktPlByaW50TWVzc2FnZXNBc1RoZXlDb21lSW4oKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBjb21tb24KK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vcXVldWVfdGVzdHV0aWxzLmggYi9hb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGZmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oCkBAIC0wLDAgKzEsNTIgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9RVUVVRV9URVNUVVRJTFNfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9RVUVVRV9URVNUVVRJTFNfSF8KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvc2hhcmVkX21lbS5oIgorCisvLyBUaGlzIGZpbGUgaGFzIHNvbWUgZ2VuZXJhbCBoZWxwZXIgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGVzdGluZyB0aGluZ3MKKy8vIHRoYXQgdXNlIHNoYXJlZCBtZW1vcnkgZXRjLgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBjb21tb24geworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBNYW5hZ2VzIGNyZWF0aW5nIGFuZCBjbGVhbmluZyB1cCAic2hhcmVkIG1lbW9yeSIgd2hpY2ggd29ya3Mgd2l0aGluIHRoaXMKKy8vIHByb2Nlc3MgYW5kIGFueSB0aGF0IGl0IGZvcmsoMilzLgorY2xhc3MgR2xvYmFsQ29yZUluc3RhbmNlIHsKKyBwdWJsaWM6CisgIC8vIENhbGxzIEVuYWJsZVRlc3RMb2dnaW5nKCkuCisgIEdsb2JhbENvcmVJbnN0YW5jZSgpOworICB+R2xvYmFsQ29yZUluc3RhbmNlKCk7CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgYW9zX2NvcmUgZ2xvYmFsX2NvcmVfZGF0YV87Cit9OworCisvLyBFbmFibGVzIHRoZSBsb2dnaW5nIGZyYW1ld29yayBmb3IgdXNlIGR1cmluZyBhIGd0ZXN0IHRlc3QuCisvLyBJdCB3aWxsIHByaW50IG91dCBhbGwgV0FSTklORyBhbmQgYWJvdmUgbWVzc2FnZXMgYWxsIG9mIHRoZSB0aW1lLiBJdCB3aWxsCisvLyBhbHNvIHByaW50IG91dCBhbGwgbG9nIG1lc3NhZ2VzIHdoZW4gYSB0ZXN0IGZhaWxzLgorLy8gVGhpcyBmdW5jdGlvbiBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBvbmNlIGluIGVhY2ggcHJvY2VzcyAoYWZ0ZXIgZ3Rlc3QgaXMKKy8vIGluaXRpYWxpemVkKSwgaG93ZXZlciBpdCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiB0aGF0Lgordm9pZCBFbmFibGVUZXN0TG9nZ2luZygpOworCisvLyBSZWdpc3RlcnMgYW4gZXhpdCBoYW5kbGVyICh1c2luZyBhdGV4aXQoMykpIHdoaWNoIHdpbGwgY2FsbCBfZXhpdCgyKS4KKy8vIEludGVuZGVkIHRvIGJlIGNhbGxlZCBpbiBhIGZyZXNobHkgZm9yaygyKWVkIHByb2Nlc3Mgd2hlcmUgaXQgd2lsbCBydW4gYmVmb3JlCisvLyBhbnkgb3RoZXIgZXhpdCBoYW5kbGVycyB0aGF0IHdlcmUgYWxyZWFkeSByZWdpc3RlcmVkIGFuZCBwcmV2ZW50IHRoZW0gZnJvbQorLy8gYmVpbmcgcnVuLgordm9pZCBQcmV2ZW50RXhpdCgpOworCisvLyBSZWRpcmVjdCB0aGUgbWVzc2FnZXMgZW5hYmxlZCBieSBFbmFibGVUZXN0TG9nZ2luZygpIGZ1bmN0aW9uIHRvIGEgZmlsZS4KKy8vIEJ5IGRlZmF1bHQgdGhlIG1lc3NhZ2VzIGFyZSBwcmludGVkIHRvIHN0YW5kYXJkIG91dHB1dC4KK3ZvaWQgU2V0TG9nRmlsZU5hbWUoY29uc3QgY2hhciogZmlsZW5hbWUpOworCisvLyBGb3JjZSB0aGUgbWVzc2FnZXMgdG8gYmUgcHJpbnRlZCBhcyB0aGV5IGFyZSBoYW5kbGVkIGJ5IHRoZSBsb2dnaW5nCisvLyBmcmFtZXdvcmsuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgdGVzdHMgdGhhdCBoYW5nIHdoZXJlIG5vIG1lc3NhZ2VzIHdvdWxkCisvLyBvdGhlcndpc2UgYmUgcHJpbnRlZC4gVGhpcyBpcyBhbHNvIHVzZWZ1bCBmb3IgdGVzdHMgdGhhdCBkbyBwYXNzLCBidXQgd2hlcmUKKy8vIHdlIHdhbnQgdG8gdXNlIGdyYXBoaW5nIHRvb2xzIHRvIHZlcmlmeSB3aGF0J3MgaGFwcGVuaW5nLgordm9pZCBGb3JjZVByaW50TG9nc0R1cmluZ1Rlc3RzKCk7CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgY29tbW9uCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9RVUVVRV9URVNUVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vcXVldWVfdGVzdHV0aWxzX3Rlc3QuY2MgYi9hb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlsc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWZlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlsc190ZXN0LmNjCkBAIC0wLDAgKzEsMzEgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oIgorCisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbW1vbiB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRlc3RzIGxvZ2dpbmcgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorLy8gdHNhbiB1c2VkIHRvIGNvbXBsYWluIGFib3V0IHRoaXMuCitURVNUKFF1ZXVlVGVzdHV0aWxzVGVzdCwgTXVsdGl0aHJlYWRlZExvZykgeworICBFbmFibGVUZXN0TG9nZ2luZygpOworCisgIDo6c3RkOjp0aHJlYWQgdGhyZWFkKFtdKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisgICAgICBMT0coSU5GTywgInRlc3QgZnJvbSB0aHJlYWRcbiIpOworICAgIH0KKyAgfSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisgICAgTE9HKElORk8sICJub3QgZnJvbSB0aHJlYWRcbiIpOworICB9CisgIHRocmVhZC5qb2luKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgY29tbW9uCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3F1ZXVlX3R5cGVzLmNjIGIvYW9zL2NvbW1vbi9xdWV1ZV90eXBlcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk1MDVkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9xdWV1ZV90eXBlcy5jYwpAQCAtMCwwICsxLDQ0MiBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWVfdHlwZXMuaCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vYnl0ZW9yZGVyLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9zaGFyZWRfbWVtLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL2NvcmVfbGliLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tdXRleC5oIgorCituYW1lc3BhY2UgYW9zIHsKKworc3NpemVfdCBNZXNzYWdlVHlwZTo6U2VyaWFsaXplKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IG1heF9ieXRlcykgY29uc3QgeworICBjaGFyICpjb25zdCBidWZmZXJfc3RhcnQgPSBidWZmZXI7CisgIHVpbnQxNl90IGZpZWxkc19zaXplID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJfZmllbGRzOyArK2kpIHsKKyAgICBmaWVsZHNfc2l6ZSArPSBzaXplb2YoZmllbGRzW2ldLT50eXBlKTsKKyAgICBmaWVsZHNfc2l6ZSArPSBzaXplb2YoZmllbGRzW2ldLT5sZW5ndGgpOworICAgIGZpZWxkc19zaXplICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgZmllbGRzX3NpemUgKz0gZmllbGRzW2ldLT5uYW1lLnNpemUoKTsKKyAgfQorICBpZiAobWF4X2J5dGVzIDwgc2l6ZW9mKGlkKSArIHNpemVvZihzdXBlcl9zaXplKSArIHNpemVvZih1aW50MTZfdCkgKworICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1iZXJfZmllbGRzKSArIG5hbWUuc2l6ZSgpICsgZmllbGRzX3NpemUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICB1aW50MTZfdCBsZW5ndGg7CisKKyAgdG9fbmV0d29yaygmc3VwZXJfc2l6ZSwgYnVmZmVyKTsKKyAgYnVmZmVyICs9IHNpemVvZihzdXBlcl9zaXplKTsKKyAgdG9fbmV0d29yaygmaWQsIGJ1ZmZlcik7CisgIGJ1ZmZlciArPSBzaXplb2YoaWQpOworICBsZW5ndGggPSBuYW1lLnNpemUoKTsKKyAgdG9fbmV0d29yaygmbGVuZ3RoLCBidWZmZXIpOworICBidWZmZXIgKz0gc2l6ZW9mKGxlbmd0aCk7CisgIHRvX25ldHdvcmsoJm51bWJlcl9maWVsZHMsIGJ1ZmZlcik7CisgIGJ1ZmZlciArPSBzaXplb2YobnVtYmVyX2ZpZWxkcyk7CisgIG1lbWNweShidWZmZXIsIG5hbWUuZGF0YSgpLCBsZW5ndGgpOworICBidWZmZXIgKz0gbmFtZS5zaXplKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJfZmllbGRzOyArK2kpIHsKKyAgICB0b19uZXR3b3JrKCZmaWVsZHNbaV0tPnR5cGUsIGJ1ZmZlcik7CisgICAgYnVmZmVyICs9IHNpemVvZihmaWVsZHNbaV0tPnR5cGUpOworICAgIHRvX25ldHdvcmsoJmZpZWxkc1tpXS0+bGVuZ3RoLCBidWZmZXIpOworICAgIGJ1ZmZlciArPSBzaXplb2YoZmllbGRzW2ldLT5sZW5ndGgpOworICAgIGxlbmd0aCA9IGZpZWxkc1tpXS0+bmFtZS5zaXplKCk7CisgICAgdG9fbmV0d29yaygmbGVuZ3RoLCBidWZmZXIpOworICAgIGJ1ZmZlciArPSBzaXplb2YobGVuZ3RoKTsKKyAgICBtZW1jcHkoYnVmZmVyLCBmaWVsZHNbaV0tPm5hbWUuZGF0YSgpLCBsZW5ndGgpOworICAgIGJ1ZmZlciArPSBsZW5ndGg7CisgIH0KKworICByZXR1cm4gYnVmZmVyIC0gYnVmZmVyX3N0YXJ0OworfQorCitNZXNzYWdlVHlwZSAqTWVzc2FnZVR5cGU6OkRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90ICpieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXNlcmlhbGl6ZV9sZW5ndGgpIHsKKyAgdWludDE2X3QgbmFtZV9sZW5ndGg7CisgIGRlY2x0eXBlKE1lc3NhZ2VUeXBlOjpzdXBlcl9zaXplKSBzdXBlcl9zaXplOworICBkZWNsdHlwZShNZXNzYWdlVHlwZTo6aWQpIGlkOworICBkZWNsdHlwZShNZXNzYWdlVHlwZTo6bnVtYmVyX2ZpZWxkcykgbnVtYmVyX2ZpZWxkczsKKyAgaWYgKCpieXRlcyA8IHNpemVvZihzdXBlcl9zaXplKSArIHNpemVvZihpZCkgKyBzaXplb2YobmFtZV9sZW5ndGgpICsKKyAgICAgICAgICAgICAgICAgICBzaXplb2YobnVtYmVyX2ZpZWxkcykpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICAqYnl0ZXMgLT0gc2l6ZW9mKHN1cGVyX3NpemUpICsgc2l6ZW9mKGlkKSArIHNpemVvZihuYW1lX2xlbmd0aCkgKworICAgICAgICAgICAgc2l6ZW9mKG51bWJlcl9maWVsZHMpOworCisgIHRvX2hvc3QoYnVmZmVyLCAmc3VwZXJfc2l6ZSk7CisgIGJ1ZmZlciArPSBzaXplb2Yoc3VwZXJfc2l6ZSk7CisgIHRvX2hvc3QoYnVmZmVyLCAmaWQpOworICBidWZmZXIgKz0gc2l6ZW9mKGlkKTsKKyAgdG9faG9zdChidWZmZXIsICZuYW1lX2xlbmd0aCk7CisgIGJ1ZmZlciArPSBzaXplb2YobmFtZV9sZW5ndGgpOworICB0b19ob3N0KGJ1ZmZlciwgJm51bWJlcl9maWVsZHMpOworICBidWZmZXIgKz0gc2l6ZW9mKG51bWJlcl9maWVsZHMpOworCisgIGlmICgqYnl0ZXMgPCBuYW1lX2xlbmd0aCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgICpieXRlcyAtPSBuYW1lX2xlbmd0aDsKKworICBGaWVsZCAqKmZpZWxkcyA9IG5ldyBGaWVsZCAqW251bWJlcl9maWVsZHNdOworICA6OnN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlVHlwZT4gcigKKyAgICAgIG5ldyBNZXNzYWdlVHlwZShzdXBlcl9zaXplLCBpZCwgOjpzdGQ6OnN0cmluZyhidWZmZXIsIG5hbWVfbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfZmllbGRzLCBmaWVsZHMpKTsKKyAgYnVmZmVyICs9IG5hbWVfbGVuZ3RoOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyX2ZpZWxkczsgKytpKSB7CisgICAgdWludDE2X3QgZmllbGRfbmFtZV9sZW5ndGg7CisgICAgaWYgKCpieXRlcyA8IHNpemVvZihmaWVsZHNbaV0tPnR5cGUpICsgc2l6ZW9mKGZpZWxkX25hbWVfbGVuZ3RoKSArCisgICAgICAgICAgICAgICAgICAgICAoZGVzZXJpYWxpemVfbGVuZ3RoID8gc2l6ZW9mKGZpZWxkc1tpXS0+bGVuZ3RoKSA6IDApKSB7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgKmJ5dGVzIC09IHNpemVvZihmaWVsZHNbaV0tPnR5cGUpICsgc2l6ZW9mKGZpZWxkX25hbWVfbGVuZ3RoKTsKKworICAgIHRvX2hvc3QoYnVmZmVyLCAmZmllbGRzW2ldLT50eXBlKTsKKyAgICBidWZmZXIgKz0gc2l6ZW9mKGZpZWxkc1tpXS0+dHlwZSk7CisgICAgaWYgKGRlc2VyaWFsaXplX2xlbmd0aCkgeworICAgICAgdG9faG9zdChidWZmZXIsICZmaWVsZHNbaV0tPmxlbmd0aCk7CisgICAgICBidWZmZXIgKz0gc2l6ZW9mKGZpZWxkc1tpXS0+bGVuZ3RoKTsKKyAgICAgICpieXRlcyAtPSBzaXplb2YoZmllbGRzW2ldLT5sZW5ndGgpOworICAgIH0KKyAgICB0b19ob3N0KGJ1ZmZlciwgJmZpZWxkX25hbWVfbGVuZ3RoKTsKKyAgICBidWZmZXIgKz0gc2l6ZW9mKGZpZWxkX25hbWVfbGVuZ3RoKTsKKworICAgIGlmICgqYnl0ZXMgPCBmaWVsZF9uYW1lX2xlbmd0aCkgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgICpieXRlcyAtPSBmaWVsZF9uYW1lX2xlbmd0aDsKKyAgICBmaWVsZHNbaV0tPm5hbWUgPSA6OnN0ZDo6c3RyaW5nKGJ1ZmZlciwgZmllbGRfbmFtZV9sZW5ndGgpOworICAgIGJ1ZmZlciArPSBmaWVsZF9uYW1lX2xlbmd0aDsKKyAgfQorCisgIHJldHVybiByLnJlbGVhc2UoKTsKK30KKworYm9vbCBQcmludEFycmF5KGNoYXIgKm91dHB1dCwgc2l6ZV90ICpvdXRwdXRfYnl0ZXMsIGNvbnN0IHZvaWQgKmlucHV0LAorICAgICAgICAgICAgICAgIHNpemVfdCAqaW5wdXRfYnl0ZXMsIHVpbnQzMl90IHR5cGVfaWQsIHVpbnQzMl90IGxlbmd0aCkgeworICBpZiAoKm91dHB1dF9ieXRlcyA8IDEpIHJldHVybiBmYWxzZTsKKyAgKm91dHB1dF9ieXRlcyAtPSAxOworICAqKG91dHB1dCsrKSA9ICdbJzsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKm91dHB1dF9ieXRlcyA8IDIpIHJldHVybiBmYWxzZTsKKyAgICAgICpvdXRwdXRfYnl0ZXMgLT0gMjsKKyAgICAgICoob3V0cHV0KyspID0gJywnOworICAgICAgKihvdXRwdXQrKykgPSAnICc7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IG91dHB1dF9ieXRlc19iZWZvcmUgPSAqb3V0cHV0X2J5dGVzLAorICAgICAgICAgICAgICAgICBpbnB1dF9ieXRlc19iZWZvcmUgPSAqaW5wdXRfYnl0ZXM7CisgICAgaWYgKE1lc3NhZ2VUeXBlOjpJc1ByaW1pdGl2ZSh0eXBlX2lkKSkgeworICAgICAgaWYgKCFQcmludEZpZWxkKG91dHB1dCwgb3V0cHV0X2J5dGVzLCBpbnB1dCwgaW5wdXRfYnl0ZXMsIHR5cGVfaWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFQcmludE1lc3NhZ2Uob3V0cHV0LCBvdXRwdXRfYnl0ZXMsIGlucHV0LCBpbnB1dF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2FjaGU6OkdldCh0eXBlX2lkKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gSWdub3JlIHRoZSB0cmFpbGluZyAnXDAnIHRoYXQgdGhlIHN1YmNhbGwgcHV0IG9uLgorICAgICAgKm91dHB1dF9ieXRlcyArPSAxOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBwb2ludGVycy4KKyAgICBvdXRwdXQgKz0gb3V0cHV0X2J5dGVzX2JlZm9yZSAtICpvdXRwdXRfYnl0ZXM7CisgICAgaW5wdXQgPQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KGlucHV0KSArIGlucHV0X2J5dGVzX2JlZm9yZSAtICppbnB1dF9ieXRlczsKKyAgfQorICBpZiAoKm91dHB1dF9ieXRlcyA8IDIpIHJldHVybiBmYWxzZTsKKyAgKm91dHB1dF9ieXRlcyAtPSAyOworICAqKG91dHB1dCsrKSA9ICddJzsKKyAgKihvdXRwdXQrKykgPSAnXDAnOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcmludE1lc3NhZ2UoY2hhciAqb3V0cHV0LCBzaXplX3QgKm91dHB1dF9ieXRlcywgY29uc3Qgdm9pZCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICBzaXplX3QgKmlucHV0X2J5dGVzLCBjb25zdCBNZXNzYWdlVHlwZSAmdHlwZSkgeworICAqaW5wdXRfYnl0ZXMgLT0gdHlwZS5zdXBlcl9zaXplOworICBpbnB1dCA9IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oaW5wdXQpICsgdHlwZS5zdXBlcl9zaXplOworCisgIGlmICgqb3V0cHV0X2J5dGVzIDwgdHlwZS5uYW1lLnNpemUoKSArIDEpIHJldHVybiBmYWxzZTsKKyAgKm91dHB1dF9ieXRlcyAtPSB0eXBlLm5hbWUuc2l6ZSgpICsgMTsKKyAgbWVtY3B5KG91dHB1dCwgdHlwZS5uYW1lLmRhdGEoKSwgdHlwZS5uYW1lLnNpemUoKSk7CisgIG91dHB1dCArPSB0eXBlLm5hbWUuc2l6ZSgpOworICAqKG91dHB1dCsrKSA9ICd7JzsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLm51bWJlcl9maWVsZHM7ICsraSkgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCpvdXRwdXRfYnl0ZXMgPCAyKSByZXR1cm4gZmFsc2U7CisgICAgICAqb3V0cHV0X2J5dGVzIC09IDI7CisgICAgICAqKG91dHB1dCsrKSA9ICcsJzsKKyAgICAgICoob3V0cHV0KyspID0gJyAnOworICAgIH0KKworICAgIGlmICgqb3V0cHV0X2J5dGVzIDwgdHlwZS5maWVsZHNbaV0tPm5hbWUuc2l6ZSgpICsgMSkgcmV0dXJuIGZhbHNlOworICAgICpvdXRwdXRfYnl0ZXMgLT0gdHlwZS5maWVsZHNbaV0tPm5hbWUuc2l6ZSgpICsgMTsKKyAgICBtZW1jcHkob3V0cHV0LCB0eXBlLmZpZWxkc1tpXS0+bmFtZS5kYXRhKCksIHR5cGUuZmllbGRzW2ldLT5uYW1lLnNpemUoKSk7CisgICAgb3V0cHV0ICs9IHR5cGUuZmllbGRzW2ldLT5uYW1lLnNpemUoKTsKKyAgICAqKG91dHB1dCsrKSA9ICc6JzsKKworICAgIGNvbnN0IHNpemVfdCBvdXRwdXRfYnl0ZXNfYmVmb3JlID0gKm91dHB1dF9ieXRlcywKKyAgICAgICAgICAgICAgICAgaW5wdXRfYnl0ZXNfYmVmb3JlID0gKmlucHV0X2J5dGVzOworICAgIGNvbnN0IHVpbnQzMl90IHR5cGVfaWQgPSB0eXBlLmZpZWxkc1tpXS0+dHlwZTsKKyAgICBpZiAodHlwZS5maWVsZHNbaV0tPmxlbmd0aCA+IDApIHsKKyAgICAgIGlmICghUHJpbnRBcnJheShvdXRwdXQsIG91dHB1dF9ieXRlcywgaW5wdXQsIGlucHV0X2J5dGVzLCB0eXBlX2lkLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZmllbGRzW2ldLT5sZW5ndGgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIElnbm9yZSB0aGUgdHJhaWxpbmcgJ1wwJyB0aGF0IHRoZSBzdWJjYWxsIHB1dCBvbi4KKyAgICAgICpvdXRwdXRfYnl0ZXMgKz0gMTsKKyAgICB9IGVsc2UgaWYgKE1lc3NhZ2VUeXBlOjpJc1ByaW1pdGl2ZSh0eXBlX2lkKSkgeworICAgICAgaWYgKCFQcmludEZpZWxkKG91dHB1dCwgb3V0cHV0X2J5dGVzLCBpbnB1dCwgaW5wdXRfYnl0ZXMsIHR5cGVfaWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFQcmludE1lc3NhZ2Uob3V0cHV0LCBvdXRwdXRfYnl0ZXMsIGlucHV0LCBpbnB1dF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2FjaGU6OkdldCh0eXBlX2lkKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gSWdub3JlIHRoZSB0cmFpbGluZyAnXDAnIHRoYXQgdGhlIHN1YmNhbGwgcHV0IG9uLgorICAgICAgKm91dHB1dF9ieXRlcyArPSAxOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBwb2ludGVycy4KKyAgICBvdXRwdXQgKz0gb3V0cHV0X2J5dGVzX2JlZm9yZSAtICpvdXRwdXRfYnl0ZXM7CisgICAgaW5wdXQgPQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KGlucHV0KSArIGlucHV0X2J5dGVzX2JlZm9yZSAtICppbnB1dF9ieXRlczsKKyAgfQorICBpZiAoKm91dHB1dF9ieXRlcyA8IDIpIHJldHVybiBmYWxzZTsKKyAgKm91dHB1dF9ieXRlcyAtPSAyOworICAqKG91dHB1dCsrKSA9ICd9JzsKKyAgKihvdXRwdXQrKykgPSAnXDAnOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcmludE1hdHJpeChjaGFyICpvdXRwdXQsIHNpemVfdCAqb3V0cHV0X2J5dGVzLCBjb25zdCB2b2lkICppbnB1dCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZV9pZCwgaW50IHJvd3MsIGludCBjb2xzKSB7CisgIENIRUNLKE1lc3NhZ2VUeXBlOjpJc1ByaW1pdGl2ZSh0eXBlX2lkKSk7CisgIGNvbnN0IHNpemVfdCBlbGVtZW50X3NpemUgPSBNZXNzYWdlVHlwZTo6U2l6ZW9mKHR5cGVfaWQpOworCisgIGlmICgqb3V0cHV0X2J5dGVzIDwgMSkgcmV0dXJuIGZhbHNlOworICAqb3V0cHV0X2J5dGVzIC09IDE7CisgICoob3V0cHV0KyspID0gJ1snOworCisgIGJvb2wgZmlyc3Rfcm93ID0gdHJ1ZTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93czsgKytyb3cpIHsKKyAgICBpZiAoZmlyc3Rfcm93KSB7CisgICAgICBmaXJzdF9yb3cgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCpvdXRwdXRfYnl0ZXMgPCAyKSByZXR1cm4gZmFsc2U7CisgICAgICAqb3V0cHV0X2J5dGVzIC09IDI7CisgICAgICAqKG91dHB1dCsrKSA9ICcsJzsKKyAgICAgICoob3V0cHV0KyspID0gJyAnOworICAgIH0KKworICAgIGlmICgqb3V0cHV0X2J5dGVzIDwgMSkgcmV0dXJuIGZhbHNlOworICAgICpvdXRwdXRfYnl0ZXMgLT0gMTsKKyAgICAqKG91dHB1dCsrKSA9ICdbJzsKKworICAgIGJvb2wgZmlyc3RfY29sID0gdHJ1ZTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBjb2xzOyArK2NvbCkgeworICAgICAgaWYgKGZpcnN0X2NvbCkgeworICAgICAgICBmaXJzdF9jb2wgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqb3V0cHV0X2J5dGVzIDwgMikgcmV0dXJuIGZhbHNlOworICAgICAgICAqb3V0cHV0X2J5dGVzIC09IDI7CisgICAgICAgICoob3V0cHV0KyspID0gJywnOworICAgICAgICAqKG91dHB1dCsrKSA9ICcgJzsKKyAgICAgIH0KKworICAgICAgY29uc3Qgc2l6ZV90IG91dHB1dF9ieXRlc19iZWZvcmUgPSAqb3V0cHV0X2J5dGVzOworICAgICAgc2l6ZV90IGlucHV0X2J5dGVzID0gZWxlbWVudF9zaXplOworICAgICAgaWYgKCFQcmludEZpZWxkKG91dHB1dCwgb3V0cHV0X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oaW5wdXQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvdyArIGNvbCAqIHJvd3MpICogZWxlbWVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICZpbnB1dF9ieXRlcywgdHlwZV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgQ0hFQ0tfRVEoMHUsIGlucHV0X2J5dGVzKTsKKyAgICAgIC8vIFVwZGF0ZSB0aGUgb3V0cHV0IHBvaW50ZXIuCisgICAgICBvdXRwdXQgKz0gb3V0cHV0X2J5dGVzX2JlZm9yZSAtICpvdXRwdXRfYnl0ZXM7CisgICAgfQorCisgICAgaWYgKCpvdXRwdXRfYnl0ZXMgPCAxKSByZXR1cm4gZmFsc2U7CisgICAgKm91dHB1dF9ieXRlcyAtPSAxOworICAgICoob3V0cHV0KyspID0gJ10nOworICB9CisgIGlmICgqb3V0cHV0X2J5dGVzIDwgMikgcmV0dXJuIGZhbHNlOworICAqb3V0cHV0X2J5dGVzIC09IDI7CisgICoob3V0cHV0KyspID0gJ10nOworICAqKG91dHB1dCsrKSA9ICdcMCc7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNlcmlhbGl6ZU1hdHJpeChpbnQgdHlwZV9pZCwgdm9pZCAqb3V0cHV0X3ZvaWQsIGNvbnN0IHZvaWQgKmlucHV0X3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgcm93cywgaW50IGNvbHMpIHsKKyAgY2hhciAqY29uc3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3Q8Y2hhciAqPihvdXRwdXRfdm9pZCk7CisgIGNvbnN0IGNoYXIgKmNvbnN0IGlucHV0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihpbnB1dF92b2lkKTsKKworICBDSEVDSyhNZXNzYWdlVHlwZTo6SXNQcmltaXRpdmUodHlwZV9pZCkpOworICBjb25zdCBzaXplX3QgZWxlbWVudF9zaXplID0gTWVzc2FnZVR5cGU6OlNpemVvZih0eXBlX2lkKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3MgKiBjb2xzOyArK2kpIHsKKyAgICBzd2l0Y2goZWxlbWVudF9zaXplKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIHRvX25ldHdvcms8MT4oJmlucHV0W2kgKiBlbGVtZW50X3NpemVdLCAmb3V0cHV0W2kgKiBlbGVtZW50X3NpemVdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHRvX25ldHdvcms8Mj4oJmlucHV0W2kgKiBlbGVtZW50X3NpemVdLCAmb3V0cHV0W2kgKiBlbGVtZW50X3NpemVdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIHRvX25ldHdvcms8ND4oJmlucHV0W2kgKiBlbGVtZW50X3NpemVdLCAmb3V0cHV0W2kgKiBlbGVtZW50X3NpemVdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIHRvX25ldHdvcms8OD4oJmlucHV0W2kgKiBlbGVtZW50X3NpemVdLCAmb3V0cHV0W2kgKiBlbGVtZW50X3NpemVdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0coRkFUQUwsICJpbGxlZ2FsIHByaW1pdGl2ZSB0eXBlIHNpemUgJXp1XG4iLCBlbGVtZW50X3NpemUpOworICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgdHlwZV9jYWNoZSB7CituYW1lc3BhY2UgeworCitzdHJ1Y3QgQ2FjaGVFbnRyeSB7CisgIGNvbnN0IE1lc3NhZ2VUeXBlICZ0eXBlOworICBib29sIGluX3NobTsKKworICBDYWNoZUVudHJ5KGNvbnN0IE1lc3NhZ2VUeXBlICZ0eXBlLCBib29sIGluX3NobSkKKyAgICAgIDogdHlwZSh0eXBlKSwgaW5fc2htKGluX3NobSkge30KK307CisKK3N0cnVjdCBTaG1UeXBlIHsKKyAgdWludDMyX3QgaWQ7CisgIHZvbGF0aWxlIFNobVR5cGUgKm5leHQ7CisKKyAgc2l6ZV90IHNlcmlhbGl6ZWRfc2l6ZTsKKyAgY2hhciBzZXJpYWxpemVkW107Cit9OworCis6OnN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgQ2FjaGVFbnRyeT4gY2FjaGU7Cis6OmFvczo6TXV0ZXggY2FjaGVfbG9jazsKKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgQWRkKGNvbnN0IE1lc3NhZ2VUeXBlICZ0eXBlKSB7CisgIDo6YW9zOjpNdXRleExvY2tlciBsb2NrZXIoJmNhY2hlX2xvY2spOworICBpZiAoY2FjaGUuY291bnQodHlwZS5pZCkgPT0gMCkgeworICAgIGNhY2hlLmVtcGxhY2UoOjpzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsIDo6c3RkOjpmb3J3YXJkX2FzX3R1cGxlKHR5cGUuaWQpLAorICAgICAgICAgICAgICAgICAgOjpzdGQ6OmZvcndhcmRfYXNfdHVwbGUodHlwZSwgZmFsc2UpKTsKKyAgfQorfQorCitjb25zdCBNZXNzYWdlVHlwZSAmR2V0KHVpbnQzMl90IHR5cGVfaWQpIHsKKyAgOjphb3M6Ok11dGV4TG9ja2VyIGxvY2tlcigmY2FjaGVfbG9jayk7CisKKyAgeworICAgIGNvbnN0IGF1dG8gY2FjaGVkID0gY2FjaGUuZmluZCh0eXBlX2lkKTsKKyAgICBpZiAoY2FjaGVkICE9IGNhY2hlLmVuZCgpKSB7CisgICAgICByZXR1cm4gY2FjaGVkLT5zZWNvbmQudHlwZTsKKyAgICB9CisgIH0KKworICBpZiAoYW9zX2NvcmVfaXNfaW5pdCgpKSB7CisgICAgLy8gTm8gbmVlZCB0byBsb2NrIGJlY2F1c2UgdGhlIG9ubHkgdGhpbmcgdGhhdCBoYXBwZW5zIGlzIHNvbWVib2R5IGFkZHMgb24KKyAgICAvLyB0byB0aGUgZW5kLCBhbmQgdGhleSBzaG91bGRuJ3QgYmUgYWRkaW5nIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IuCisgICAgY29uc3Qgdm9sYXRpbGUgU2htVHlwZSAqYyA9IHN0YXRpY19jYXN0PHZvbGF0aWxlIFNobVR5cGUgKj4oCisgICAgICAgIGdsb2JhbF9jb3JlLT5tZW1fc3RydWN0LT5xdWV1ZV90eXBlcy5wb2ludGVyKTsKKyAgICB3aGlsZSAoYyAhPSBudWxscHRyKSB7CisgICAgICBpZiAoYy0+aWQgPT0gdHlwZV9pZCkgeworICAgICAgICBzaXplX3QgYnl0ZXMgPSBjLT5zZXJpYWxpemVkX3NpemU7CisgICAgICAgIE1lc3NhZ2VUeXBlICp0eXBlID0gTWVzc2FnZVR5cGU6OkRlc2VyaWFsaXplKAorICAgICAgICAgICAgY29uc3RfY2FzdDxjb25zdCBjaGFyICo+KGMtPnNlcmlhbGl6ZWQpLCAmYnl0ZXMpOworICAgICAgICBjYWNoZS5lbXBsYWNlKDo6c3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpmb3J3YXJkX2FzX3R1cGxlKHR5cGVfaWQpLAorICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpmb3J3YXJkX2FzX3R1cGxlKCp0eXBlLCB0cnVlKSk7CisgICAgICAgIHJldHVybiAqdHlwZTsKKyAgICAgIH0KKyAgICAgIGMgPSBjLT5uZXh0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBMT0coSU5GTywgIkZZSTogbm8gc2htLiBnb2luZyB0byBMT0coRkFUQUwpIG5vd1xuIik7CisgIH0KKworICBMT0coRkFUQUwsICJNZXNzYWdlVHlwZSBmb3IgaWQgMHglIiBQUkl4MzIgIiBub3QgZm91bmRcbiIsIHR5cGVfaWQpOworfQorCit2b2lkIEFkZFNobSh1aW50MzJfdCB0eXBlX2lkKSB7CisgIGlmICghYW9zX2NvcmVfaXNfaW5pdCgpKSB7CisgICAgTE9HKEZBVEFMLCAiY2FuJ3QgQWRkU2htKCUiIFBSSXUzMiAiKSB3aXRob3V0IHNobSFcbiIsIHR5cGVfaWQpOworICB9CisKKyAgY29uc3QgTWVzc2FnZVR5cGU6OkZpZWxkICoqZmllbGRzOworICBpbnQgbnVtYmVyX2ZpZWxkczsKKyAgeworICAgIDo6YW9zOjpNdXRleExvY2tlciBsb2NrZXIoJmNhY2hlX2xvY2spOworICAgIENhY2hlRW50cnkgJmNhY2hlZCA9IGNhY2hlLmF0KHR5cGVfaWQpOworICAgIGlmIChjYWNoZWQuaW5fc2htKSByZXR1cm47CisKKyAgICBmaWVsZHMgPSBjYWNoZWQudHlwZS5maWVsZHM7CisgICAgbnVtYmVyX2ZpZWxkcyA9IGNhY2hlZC50eXBlLm51bWJlcl9maWVsZHM7CisKKyAgICBpZiAobXV0ZXhfbG9jaygmZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QtPnF1ZXVlX3R5cGVzLmxvY2spICE9IDApIHsKKyAgICAgIExPRyhGQVRBTCwgImxvY2tpbmcgcXVldWVfdHlwZXMgbG9jayBmYWlsZWRcbiIpOworICAgIH0KKyAgICB2b2xhdGlsZSBTaG1UeXBlICpjdXJyZW50ID0gc3RhdGljX2Nhc3Q8dm9sYXRpbGUgU2htVHlwZSAqPigKKyAgICAgICAgZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QtPnF1ZXVlX3R5cGVzLnBvaW50ZXIpOworICAgIGlmIChjdXJyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChjdXJyZW50LT5pZCA9PSB0eXBlX2lkKSB7CisgICAgICAgICAgY2FjaGVkLmluX3NobSA9IHRydWU7CisgICAgICAgICAgbXV0ZXhfdW5sb2NrKCZnbG9iYWxfY29yZS0+bWVtX3N0cnVjdC0+cXVldWVfdHlwZXMubG9jayk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJyZW50LT5uZXh0ID09IG51bGxwdHIpIGJyZWFrOworICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgY2hhciBidWZmZXJbNzY4XTsKKyAgICBzc2l6ZV90IHNpemUgPSBjYWNoZWQudHlwZS5TZXJpYWxpemUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICAgIExPRyhGQVRBTCwgInR5cGUgJXMgaXMgdG9vIGJpZyB0byBmaXQgaW50byAlemQgYnl0ZXNcbiIsCisgICAgICAgICAgY2FjaGVkLnR5cGUubmFtZS5jX3N0cigpLCBzaXplb2YoYnVmZmVyKSk7CisgICAgfQorCisgICAgdm9sYXRpbGUgU2htVHlwZSAqc2htID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8dm9sYXRpbGUgU2htVHlwZSAqPihzaG1fbWFsbG9jKHNpemVvZihTaG1UeXBlKSArIHNpemUpKTsKKyAgICBzaG0tPmlkID0gdHlwZV9pZDsKKyAgICBzaG0tPm5leHQgPSBudWxscHRyOworICAgIHNobS0+c2VyaWFsaXplZF9zaXplID0gc2l6ZTsKKyAgICBtZW1jcHkoY29uc3RfY2FzdDxjaGFyICo+KHNobS0+c2VyaWFsaXplZCksIGJ1ZmZlciwgc2l6ZSk7CisKKyAgICBpZiAoY3VycmVudCA9PSBOVUxMKSB7CisgICAgICBnbG9iYWxfY29yZS0+bWVtX3N0cnVjdC0+cXVldWVfdHlwZXMucG9pbnRlciA9IGNvbnN0X2Nhc3Q8U2htVHlwZSAqPihzaG0pOworICAgIH0gZWxzZSB7CisgICAgICBjdXJyZW50LT5uZXh0ID0gc2htOworICAgIH0KKyAgICBtdXRleF91bmxvY2soJmdsb2JhbF9jb3JlLT5tZW1fc3RydWN0LT5xdWV1ZV90eXBlcy5sb2NrKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyX2ZpZWxkczsgKytpKSB7CisgICAgaWYgKCFNZXNzYWdlVHlwZTo6SXNQcmltaXRpdmUoZmllbGRzW2ldLT50eXBlKSkgeworICAgICAgQWRkU2htKGZpZWxkc1tpXS0+dHlwZSk7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0eXBlX2NhY2hlCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3F1ZXVlX3R5cGVzLmggYi9hb3MvY29tbW9uL3F1ZXVlX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5NDNjMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vcXVldWVfdHlwZXMuaApAQCAtMCwwICsxLDE0OCBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1FVRVVFX1RZUEVTX0hfCisjZGVmaW5lIEFPU19DT01NT05fUVVFVUVfVFlQRVNfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL21hY3Jvcy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vYnl0ZW9yZGVyLmgiCisKK25hbWVzcGFjZSBhb3MgeworCisvLyBUaGUgdHlwZSBJRHMgdGhpcyB1c2VzIGFyZSAyIHBhcnRzOiBhIDE2IGJpdCBzaXplIGFuZCBhIDE2IGJpdCBoYXNoLiBTaXplcworLy8gZm9yIHByaW1pdGl2ZSB0eXBlcyBhcmUgc3RvcmVkIHdpdGggODE5MiAoMHgyMDAwKSBhZGRlZC4KKy8vCisvLyBTZXJpYWxpemluZy9kZXNlcmlhbGl6aW5nIGluY2x1ZGVzIGFsbCBvZiB0aGUgZmllbGRzIHRvby4KK3N0cnVjdCBNZXNzYWdlVHlwZSB7CisgIHN0cnVjdCBGaWVsZCB7CisgICAgLy8gVGhlIHR5cGUgSUQgZm9yIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuCisgICAgdWludDMyX3QgdHlwZTsKKyAgICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBpZiBpdCBpcyBvbmUgb3IgMC4KKyAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgOjpzdGQ6OnN0cmluZyBuYW1lOworICB9OworCisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiBhbGwgdGhlIEZpZWxkIHBvaW50ZXJzIGluIGZpZWxkc19pbml0aWFsaXplci4KKyAgTWVzc2FnZVR5cGUoc2l6ZV90IHN1cGVyX3NpemUsIHVpbnQzMl90IGlkLCBjb25zdCA6OnN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICA6OnN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBGaWVsZCAqPiBmaWVsZHNfaW5pdGlhbGl6ZXIpCisgICAgICA6IHN1cGVyX3NpemUoc3VwZXJfc2l6ZSksIGlkKGlkKSwgbmFtZShuYW1lKSB7CisgICAgbnVtYmVyX2ZpZWxkcyA9IGZpZWxkc19pbml0aWFsaXplci5zaXplKCk7CisgICAgZmllbGRzID0gbmV3IGNvbnN0IEZpZWxkICpbbnVtYmVyX2ZpZWxkc107CisgICAgaW50IGkgPSAwOworICAgIGZvciAoY29uc3QgRmllbGQgKmMgOiBmaWVsZHNfaW5pdGlhbGl6ZXIpIHsKKyAgICAgIGZpZWxkc1tpKytdID0gYzsKKyAgICB9CisgIH0KKworICB+TWVzc2FnZVR5cGUoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJfZmllbGRzOyArK2kpIHsKKyAgICAgIGRlbGV0ZSBmaWVsZHNbaV07CisgICAgfQorICAgIGRlbGV0ZVtdIGZpZWxkczsKKyAgfQorCisgIC8vIFJldHVybnMgLTEgaWYgbWF4X2J5dGVzIGlzIHRvbyBzbWFsbC4KKyAgc3NpemVfdCBTZXJpYWxpemUoY2hhciAqYnVmZmVyLCBzaXplX3QgbWF4X2J5dGVzKSBjb25zdDsKKyAgLy8gYnl0ZXMgc2hvdWxkIHN0YXJ0IG91dCBhcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiBidWZmZXIgYW5kIGdldHMKKyAgLy8gcmVkdWNlZCBieSB0aGUgbnVtYmVyIGFjdHVhbGx5IHJlYWQgYmVmb3JlIHJldHVybmluZy4KKyAgLy8gZGVzZXJpYWxpemVfbGVuZ3RoIGlzIHdoZXRoZXIgdG8gbG9vayBmb3IgYSBsZW5ndGggZmllbGQgaW4gdGhlIHNlcmlhbGl6ZWQKKyAgLy8gZGF0YS4KKyAgLy8gUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBhbGxvY2F0ZWQgd2l0aCBuZXcgb3IgbnVsbHB0ciBmb3IgZXJyb3IuCisgIHN0YXRpYyBNZXNzYWdlVHlwZSAqRGVzZXJpYWxpemUoY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgKmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVzZXJpYWxpemVfbGVuZ3RoID0gdHJ1ZSk7CisKKyAgc3RhdGljIGJvb2wgSXNQcmltaXRpdmUodWludDMyX3QgdHlwZV9pZCkgeworICAgIHJldHVybiAodHlwZV9pZCAmIDB4MjAwMCkgIT0gMDsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgU2l6ZW9mKHVpbnQzMl90IHR5cGVfaWQpIHsKKyAgICBpZiAoSXNQcmltaXRpdmUodHlwZV9pZCkpIHsKKyAgICAgIHJldHVybiAodHlwZV9pZCAmIDB4RkZGRikgLSAweDIwMDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlX2lkICYgMHhGRkZGOworICAgIH0KKyAgfQorCisgIC8vIEhvdyBtYW55IChzZXJpYWxpemVkKSBieXRlcyB0aGUgc3VwZXJjbGFzcyB0YWtlcyB1cC4KKyAgdWludDE2X3Qgc3VwZXJfc2l6ZTsKKyAgLy8gVGhlIHR5cGUgSUQgZm9yIHRoaXMuCisgIHVpbnQzMl90IGlkOworICA6OnN0ZDo6c3RyaW5nIG5hbWU7CisKKyAgdWludDE2X3QgbnVtYmVyX2ZpZWxkczsKKyAgY29uc3QgRmllbGQgKipmaWVsZHM7CisKKyBwcml2YXRlOgorICAvLyBJbnRlcm5hbCBjb25zdHJ1Y3RvciBmb3IgRGVzZXJpYWxpemUgdG8gdXNlLgorICBNZXNzYWdlVHlwZSh1aW50MTZfdCBzdXBlcl9zaXplLCB1aW50MzJfdCBpZCwgOjpzdGQ6OnN0cmluZyAmJm5hbWUsCisgICAgICAgICAgICAgIHVpbnQxNl90IG51bWJlcl9maWVsZHMsIEZpZWxkICoqZmllbGRzKQorICAgICAgOiBzdXBlcl9zaXplKHN1cGVyX3NpemUpLAorICAgICAgICBpZChpZCksCisgICAgICAgIG5hbWUobmFtZSksCisgICAgICAgIG51bWJlcl9maWVsZHMobnVtYmVyX2ZpZWxkcyksCisgICAgICAgIGZpZWxkcyhjb25zdF9jYXN0PGNvbnN0IEZpZWxkICoqPihmaWVsZHMpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJfZmllbGRzOyArK2kpIHsKKyAgICAgIGZpZWxkc1tpXSA9IG5ldyBGaWVsZCgpOworICAgIH0KKyAgfQorCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZXNzYWdlVHlwZSk7Cit9OworCisvLyBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBmb3IgYm90aCBvZiB0aGVzZS4KKy8vCisvLyBvdXRwdXQgaXMgd2hlcmUgdG8gd3JpdGUgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gKCdcMCctdGVybWluYXRlZAorLy8gaHVtYW4tcmVhZGFibGUgc3RyaW5nKS4KKy8vIG91dHB1dF9ieXRlcyBzaG91bGQgcG9pbnQgdG8gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgdG8gd3JpdGUgaW4KKy8vIG91dHB1dC4gSXQgd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHdyaXR0ZW4uCisvLyBpbnB1dCBpcyB3aGVyZSB0byByZWFkIHRoZSBkYXRhIGluIGZyb20gKGluIG5ldHdvcmsgYnl0ZSBvcmRlciwgYWthIGZyb20KKy8vIFNlcmlhbGl6ZSkuCisvLyBpbnB1dF9ieXRlcyBzaG91bGQgcG9pbnQgdG8gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgdG8gcmVhZCBmcm9tIGlucHV0LgorLy8gSXQgd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlYWQuCisvLyB0eXBlIGlzIHdoaWNoIHR5cGUgdG8gcHJpbnQuCisvLyBSZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3MgYW5kIGZhbHNlIGZvciBub3QuCisvLworLy8gUHJpbnRzIHRoZSB2YWx1ZSBmcm9tIDEgcHJpbWl0aXZlIG1lc3NhZ2UgZmllbGQgaW50byBvdXRwdXQuCisvLyBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpcyBnZW5lcmF0ZWQgYnkgdGhlIHJ1YnkgY29kZS4KKy8vIERvZXMgbm90IGluY2x1ZGUgYSB0cmFpbGluZyAnXDAnIGluIHdoYXQgaXQgc3VidHJhY3RzIGZyb20gKm91dHB1dF9ieXRlcy4KK2Jvb2wgUHJpbnRGaWVsZChjaGFyICpvdXRwdXQsIHNpemVfdCAqb3V0cHV0X2J5dGVzLCBjb25zdCB2b2lkICppbnB1dCwKKyAgICAgICAgICAgICAgICBzaXplX3QgKmlucHV0X2J5dGVzLCB1aW50MzJfdCB0eXBlKQorICAgIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworLy8gUHJpbnRzIGEgd2hvbGUgbWVzc2FnZSBpbnRvIG91dHB1dC4KKy8vIFRoaXMgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IGFuZCBQcmludEZpZWxkIHRvIHByaW50IG91dCB0aGUgd2hvbGUgdGhpbmcuCitib29sIFByaW50TWVzc2FnZShjaGFyICpvdXRwdXQsIHNpemVfdCAqb3V0cHV0X2J5dGVzLCBjb25zdCB2b2lkICppbnB1dCwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCAqaW5wdXRfYnl0ZXMsIGNvbnN0IE1lc3NhZ2VUeXBlICZ0eXBlKQorICAgIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworLy8gQ2FsbHMgUHJpbnRGaWVsZCB0byBwcmludCBvdXQgYSBtYXRyaXggb2YgdmFsdWVzLgorYm9vbCBQcmludE1hdHJpeChjaGFyICpvdXRwdXQsIHNpemVfdCAqb3V0cHV0X2J5dGVzLCBjb25zdCB2b2lkICppbnB1dCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgaW50IHJvd3MsIGludCBjb2xzKTsKKworLy8gIlNlcmlhbGl6ZXMiIGEgbWF0cml4IChiYXNpY2FsbHkganVzdCBjb252ZXJ0cyB0byBuZXR3b3JrIGJ5dGUgb3JkZXIpLiBUaGUKKy8vIHJlc3VsdCBjYW4gYmUgcGFzc2VkIHRvIFByaW50TWF0cml4Lgordm9pZCBTZXJpYWxpemVNYXRyaXgoaW50IHR5cGVfaWQsIHZvaWQgKm91dHB1dF92b2lkLCBjb25zdCB2b2lkICppbnB1dF92b2lkLAorICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3MsIGludCBjb2xzKTsKKworLy8gSW1wbGVtZW50cyBhIGNhY2hlIG9mIHR5cGVzIHdoaWNoIGdlbmVyYWxseSB3b3JrcyBwZXItcHJvY2VzcyBidXQgY2FuICh3aGVuCisvLyBpbnN0cnVjdGVkKSBwdXQgYSB0eXBlIGluIHNoYXJlZCBtZW1vcnkgd2hpY2ggb3RoZXIgcHJvY2Vzc2VzIHdpbGwKKy8vIGF1dG9tYXRpY2FsbHkgYmUgYWJsZSB0byByZXRyaWV2ZS4KKy8vIEFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIHRocmVhZC1zYWZlLgorbmFtZXNwYWNlIHR5cGVfY2FjaGUgeworCisvLyBNYWtlcyBzdXJlIGEgdHlwZSBpcyBpbiB0aGUgdHlwZSBjYWNoZS4gVGhpcyB3aWxsIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHR5cGUuCisvLyBUaGUgdHlwZXMgb2YgYW55IG5vbi1wcmltaXRpdmUgZmllbGRzIG9mIHR5cGUgbXVzdCBhbHJlYWR5IGJlIGFkZGVkLgordm9pZCBBZGQoY29uc3QgTWVzc2FnZVR5cGUgJnR5cGUpOworLy8gUmV0cmlldmVzIGEgdHlwZSBmcm9tIHRoZSB0eXBlIGNhY2hlIG9yIHNobS4gTE9HKEZBVEFMKXMgaWYgaXQgY2FuJ3QgZmluZCBpdC4KK2NvbnN0IE1lc3NhZ2VUeXBlICZHZXQodWludDMyX3QgdHlwZV9pZCk7CisvLyBNYWtlcyBzdXJlIGEgdHlwZSBpcyBpbiB0aGUgbGlzdCBpbiBzaG0uIEFkZCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZAorLy8gZm9yIHR5cGUuCisvLyBBbHNvIGFkZHMgdGhlIHR5cGVzIG9mIGFueSBub24tcHJpbWl0aXZlIGZpZWxkcyBvZiB0eXBlLgordm9pZCBBZGRTaG0odWludDMyX3QgdHlwZV9pZCk7CisKK30gIC8vIG5hbWVzcGFjZSB0eXBlX2NhY2hlCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9RVUVVRV9UWVBFU19IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9xdWV1ZV90eXBlc190ZXN0LmNjIGIvYW9zL2NvbW1vbi9xdWV1ZV90eXBlc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODgyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3F1ZXVlX3R5cGVzX3Rlc3QuY2MKQEAgLTAsMCArMSwyNzQgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3Rlc3RfcXVldWUucS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vYnl0ZW9yZGVyLmgiCisjaW5jbHVkZSAiYW9zL3F1ZXVlX3ByaW1pdGl2ZXMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWVfdGVzdHV0aWxzLmgiCisKK3VzaW5nIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6OlN0cnVjdHVyZTsKK3VzaW5nIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6Ok1lc3NhZ2VXaXRoU3RydWN0dXJlOwordXNpbmcgOjphb3M6OmNvbW1vbjo6dGVzdGluZzo6T3RoZXJUZXN0aW5nTWVzc2FnZTsKK3VzaW5nIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6Ok1lc3NhZ2VXaXRoQXJyYXlzOworCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordHlwZWRlZiBNZXNzYWdlVHlwZTo6RmllbGQgRmllbGQ7CisKK3N0YXRpYyBjb25zdCBNZXNzYWdlVHlwZSBrVGVzdFR5cGUxKDUsIDB4MTIzNCwgIlRlc3RUeXBlMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmV3IEZpZWxkezAsIDAsICJmaWVsZDEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGR7MCwgMCwgImZpZWxkMiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZHswLCAwLCAiZmllbGQzIn19KTsKKworY2xhc3MgUXVldWVUeXBlc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIFF1ZXVlVHlwZXNUZXN0KCkgeworICAgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6OkVuYWJsZVRlc3RMb2dnaW5nKCk7CisgIH0KKworICA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBFcXVhbChjb25zdCBNZXNzYWdlVHlwZSAmbCwgY29uc3QgTWVzc2FnZVR5cGUgJnIpIHsKKyAgICB1c2luZyA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmU7CisgICAgaWYgKGwuaWQgIT0gci5pZCkgeworICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiaWQgIiA8PCBsLmlkIDw8ICIgIT0gIiA8PCByLmlkOworICAgIH0KKyAgICBpZiAobC5uYW1lICE9IHIubmFtZSkgeworICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAibmFtZSAnIiA8PCBsLm5hbWUgPDwgIicgIT0gJyIgPDwgci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInIjsKKyAgICB9CisgICAgaWYgKGwubnVtYmVyX2ZpZWxkcyAhPSByLm51bWJlcl9maWVsZHMpIHsKKyAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIm51bWJlcl9maWVsZHMgIiA8PCBsLm51bWJlcl9maWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAhPSAiIDw8IHIubnVtYmVyX2ZpZWxkczsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsLm51bWJlcl9maWVsZHM7ICsraSkgeworICAgICAgU0NPUEVEX1RSQUNFKCJmaWVsZCAiICsgOjpzdGQ6OnRvX3N0cmluZyhpKSk7CisgICAgICBpZiAobC5maWVsZHNbaV0tPnR5cGUgIT0gci5maWVsZHNbaV0tPnR5cGUpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAidHlwZSAiIDw8IGwuZmllbGRzW2ldLT50eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAhPSAiIDw8IHIuZmllbGRzW2ldLT50eXBlOworICAgICAgfQorICAgICAgaWYgKGwuZmllbGRzW2ldLT5uYW1lICE9IHIuZmllbGRzW2ldLT5uYW1lKSB7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIm5hbWUgJyIgPDwgbC5maWVsZHNbaV0tPm5hbWUgPDwgIicgIT0gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByLmZpZWxkc1tpXS0+bmFtZSA8PCAiJyI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorfTsKKworVEVTVF9GKFF1ZXVlVHlwZXNUZXN0LCBTZXJpYWxpemF0aW9uKSB7CisgIGNoYXIgYnVmZmVyWzUxMl07CisgIHNzaXplX3Qgc2l6ZTsKKyAgc2l6ZV90IG91dF9zaXplOworICA6OnN0ZDo6dW5pcXVlX3B0cjxNZXNzYWdlVHlwZT4gZGVzZXJpYWxpemVkOworCisgIHNpemUgPSBrVGVzdFR5cGUxLlNlcmlhbGl6ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgQVNTRVJUX0dUKHNpemUsIDEpOworICBBU1NFUlRfTEUoc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplKSwgc2l6ZW9mKGJ1ZmZlcikpOworCisgIG91dF9zaXplID0gc2l6ZTsKKyAgZGVzZXJpYWxpemVkLnJlc2V0KE1lc3NhZ2VUeXBlOjpEZXNlcmlhbGl6ZShidWZmZXIsICZvdXRfc2l6ZSkpOworICBFWFBFQ1RfRVEoMHUsIG91dF9zaXplKTsKKyAgRVhQRUNUX1RSVUUoRXF1YWwoa1Rlc3RUeXBlMSwgKmRlc2VyaWFsaXplZCkpOworCisgIG91dF9zaXplID0gc2l6ZSAtIDE7CisgIGRlc2VyaWFsaXplZC5yZXNldChNZXNzYWdlVHlwZTo6RGVzZXJpYWxpemUoYnVmZmVyLCAmb3V0X3NpemUpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGRlc2VyaWFsaXplZC5nZXQoKSk7CisKKyAgb3V0X3NpemUgPSBzaXplICsgMTsKKyAgQVNTRVJUX0xFKG91dF9zaXplLCBzaXplb2YoYnVmZmVyKSk7CisgIGRlc2VyaWFsaXplZC5yZXNldChNZXNzYWdlVHlwZTo6RGVzZXJpYWxpemUoYnVmZmVyLCAmb3V0X3NpemUpKTsKKyAgRVhQRUNUX0VRKDF1LCBvdXRfc2l6ZSk7CisgIEVYUEVDVF9UUlVFKEVxdWFsKGtUZXN0VHlwZTEsICpkZXNlcmlhbGl6ZWQpKTsKK30KKworY2xhc3MgUHJpbnRNZXNzYWdlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgY2hhciBpbnB1dFsxMjhdLCBvdXRwdXRbMjU2XTsKKyAgc2l6ZV90IGlucHV0X2J5dGVzLCBvdXRwdXRfYnl0ZXM7Cit9OworCitjbGFzcyBQcmludEZpZWxkVGVzdCA6IHB1YmxpYyBQcmludE1lc3NhZ2VUZXN0IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIFRlc3RJbnRlZ2VyKFQgdmFsdWUsIDo6c3RkOjpzdHJpbmcgcmVzdWx0KSB7CisgICAgaW5wdXRfYnl0ZXMgPSBzaXplb2YodmFsdWUpOworICAgIHRvX25ldHdvcmsoJnZhbHVlLCBpbnB1dCk7CisgICAgb3V0cHV0X2J5dGVzID0gc2l6ZW9mKG91dHB1dCk7CisgICAgQVNTRVJUX1RSVUUoCisgICAgICAgIFByaW50RmllbGQob3V0cHV0LCAmb3V0cHV0X2J5dGVzLCBpbnB1dCwgJmlucHV0X2J5dGVzLCBUeXBlSUQ8VD46OmlkKSk7CisgICAgRVhQRUNUX0VRKDB1LCBpbnB1dF9ieXRlcyk7CisgICAgRVhQRUNUX0VRKHNpemVvZihvdXRwdXQpIC0gcmVzdWx0LnNpemUoKSwgb3V0cHV0X2J5dGVzKTsKKyAgICBFWFBFQ1RfRVEocmVzdWx0LCA6OnN0ZDo6c3RyaW5nKG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSBvdXRwdXRfYnl0ZXMpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIFRlc3RBbGxJbnRlZ2VycyhUIG11bHRpcGxlKSB7CisgICAgZm9yIChUIGkgPSA6OnN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpOworICAgICAgICAgaSA8IDo6c3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgLSBtdWx0aXBsZTsgaSArPSBtdWx0aXBsZSkgeworICAgICAgVGVzdEludGVnZXI8VD4oaSwgOjpzdGQ6OnRvX3N0cmluZyhpKSk7CisgICAgfQorICB9Cit9OworCitURVNUX0YoUHJpbnRGaWVsZFRlc3QsIEJhc2ljKSB7CisgIFRlc3RJbnRlZ2VyPHVpbnQxNl90Pig5NzEsICI5NzEiKTsKKyAgVGVzdEludGVnZXI8dWludDhfdD4oOCwgIjgiKTsKKyAgVGVzdEludGVnZXI8dWludDhfdD4oMjU0LCAiMjU0Iik7CisgIFRlc3RJbnRlZ2VyPHVpbnQ4X3Q+KDAsICIwIik7CisgIFRlc3RJbnRlZ2VyPGludDhfdD4oMjU0LCAiLTIiKTsKKyAgVGVzdEludGVnZXI8aW50OF90Pig2NywgIjY3Iik7CisgIFRlc3RJbnRlZ2VyPGludDhfdD4oMCwgIjAiKTsKKworICBpbnB1dF9ieXRlcyA9IDE7CisgIGlucHV0WzBdID0gMTsKKyAgb3V0cHV0X2J5dGVzID0gc2l6ZW9mKG91dHB1dCk7CisgIEFTU0VSVF9UUlVFKFByaW50RmllbGQob3V0cHV0LCAmb3V0cHV0X2J5dGVzLCBpbnB1dCwgJmlucHV0X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX3ByaW1pdGl2ZV90eXBlczo6Ym9vbF9wKSk7CisgIEVYUEVDVF9FUSgwdSwgaW5wdXRfYnl0ZXMpOworICBFWFBFQ1RfRVEoc2l6ZW9mKG91dHB1dCkgLSAxLCBvdXRwdXRfYnl0ZXMpOworICBFWFBFQ1RfRVEoOjpzdGQ6OnN0cmluZygiVCIpLAorICAgICAgICAgICAgOjpzdGQ6OnN0cmluZyhvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gb3V0cHV0X2J5dGVzKSk7CisKKyAgaW5wdXRfYnl0ZXMgPSAxOworICBpbnB1dFswXSA9IDA7CisgIG91dHB1dF9ieXRlcyA9IHNpemVvZihvdXRwdXQpOworICBBU1NFUlRfVFJVRShQcmludEZpZWxkKG91dHB1dCwgJm91dHB1dF9ieXRlcywgaW5wdXQsICZpbnB1dF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV9wcmltaXRpdmVfdHlwZXM6OmJvb2xfcCkpOworICBFWFBFQ1RfRVEoMHUsIGlucHV0X2J5dGVzKTsKKyAgRVhQRUNUX0VRKHNpemVvZihvdXRwdXQpIC0gMSwgb3V0cHV0X2J5dGVzKTsKKyAgRVhQRUNUX0VRKDo6c3RkOjpzdHJpbmcoImYiKSwKKyAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcob3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIG91dHB1dF9ieXRlcykpOworfQorCisvLyBSdW5zIHRocm91Z2ggbG90cyBvZiBpbnRlZ2VycyBhbmQgbWFrZXMgc3VyZSBQcmludEZpZWxkIGdpdmVzIHRoZSBzYW1lIHJlc3VsdAorLy8gYXMgOjpzdGQ6OnRvX3N0cmluZy4KK1RFU1RfRihQcmludEZpZWxkVGVzdCwgSW50ZWdlcnMpIHsKKyAgVGVzdEFsbEludGVnZXJzPHVpbnQ4X3Q+KDEpOworICBUZXN0QWxsSW50ZWdlcnM8aW50OF90PigxKTsKKyAgVGVzdEFsbEludGVnZXJzPHVpbnQxNl90PigxKTsKKyAgVGVzdEFsbEludGVnZXJzPGludDE2X3Q+KDMpOworICBUZXN0QWxsSW50ZWdlcnM8dWludDMyX3Q+KDQzMTI5KTsKKyAgVGVzdEFsbEludGVnZXJzPGludDMyX3Q+KDY1NDMyMSk7CisgIFRlc3RBbGxJbnRlZ2Vyczx1aW50NjRfdD4oMTIzNDU2Nzg5MTAxMTEyKTsKKyAgVGVzdEFsbEludGVnZXJzPGludDY0X3Q+KDkxMDExMTIxMjQ5ODU2NTMyKTsKK30KKworLy8gVGVzdHMgUHJpbnRGaWVsZCB3aXRoIHRyYWlsaW5nIGlucHV0IGJ5dGVzIGFuZCBvbmx5IDEgZXh0cmEgb3V0cHV0IGJ5dGUuCitURVNUX0YoUHJpbnRGaWVsZFRlc3QsIE90aGVyU2l6ZXMpIHsKKyAgc3RhdGljIGNvbnN0IGZsb2F0IGtEYXRhID0gMTYuNzg7CisgIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIGtTdHJpbmcoIjE2Ljc4MDAwMSIpOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtFeHRyYUlucHV0Qnl0ZXMgPSA0OworICBpbnB1dF9ieXRlcyA9IHNpemVvZihrRGF0YSkgKyBrRXh0cmFJbnB1dEJ5dGVzOworICB0b19uZXR3b3JrKCZrRGF0YSwgaW5wdXQpOworICBvdXRwdXRfYnl0ZXMgPSBrU3RyaW5nLnNpemUoKSArIDE7CisgIENIRUNLX0xFKG91dHB1dF9ieXRlcywgc2l6ZW9mKG91dHB1dCkpOworICBBU1NFUlRfVFJVRShQcmludEZpZWxkKG91dHB1dCwgJm91dHB1dF9ieXRlcywgaW5wdXQsICZpbnB1dF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmU6OkdldFR5cGUoKS0+ZmllbGRzWzJdLT50eXBlKSk7CisgIEVYUEVDVF9FUShrRXh0cmFJbnB1dEJ5dGVzLCBpbnB1dF9ieXRlcyk7CisgIEVYUEVDVF9FUSgxdSwgb3V0cHV0X2J5dGVzKTsKKyAgRVhQRUNUX0VRKGtTdHJpbmcsIDo6c3RkOjpzdHJpbmcob3V0cHV0KSk7Cit9CisKK1RFU1RfRihQcmludEZpZWxkVGVzdCwgSW5wdXRUb29TbWFsbCkgeworICBzdGF0aWMgY29uc3QgZmxvYXQga0RhdGEgPSAwOworICBpbnB1dF9ieXRlcyA9IHNpemVvZihrRGF0YSkgLSAxOworICBvdXRwdXRfYnl0ZXMgPSBzaXplb2Yob3V0cHV0KTsKKyAgRVhQRUNUX0ZBTFNFKFByaW50RmllbGQob3V0cHV0LCAmb3V0cHV0X2J5dGVzLCBpbnB1dCwgJmlucHV0X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmU6OkdldFR5cGUoKS0+ZmllbGRzWzJdLT50eXBlKSk7Cit9CisKK1RFU1RfRihQcmludEZpZWxkVGVzdCwgT3V0cHV0VG9vU21hbGwpIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtEYXRhID0gMTIzNDU7CisgIGlucHV0X2J5dGVzID0gc2l6ZW9mKGlucHV0KTsKKyAgdG9fbmV0d29yaygma0RhdGEsIGlucHV0KTsKKyAgb3V0cHV0X2J5dGVzID0gNDsKKyAgRVhQRUNUX0ZBTFNFKFByaW50RmllbGQob3V0cHV0LCAmb3V0cHV0X2J5dGVzLCBpbnB1dCwgJmlucHV0X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmU6OkdldFR5cGUoKS0+ZmllbGRzWzFdLT50eXBlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBPdGhlclRlc3RpbmdNZXNzYWdlIGtUZXN0TWVzc2FnZTEodHJ1ZSwgODk3MSwgMy4yKTsKK3N0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIGtUZXN0TWVzc2FnZTFTdHJpbmcgPQorICAgICIuYW9zLmNvbW1vbi50ZXN0aW5nLk90aGVyVGVzdGluZ01lc3NhZ2V7dGVzdF9ib29sOlQsIHRlc3RfaW50Ojg5NzEiCisgICAgIiwgdGVzdF9kb3VibGU6My4yMDAwMDB9IjsKK3N0YXRpYyBjb25zdCBTdHJ1Y3R1cmUga1Rlc3RTdHJ1Y3R1cmUxKGZhbHNlLCA5NzMsIDguNTYpOworc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcga1Rlc3RTdHJ1Y3R1cmUxU3RyaW5nID0KKyAgICAiLmFvcy5jb21tb24udGVzdGluZy5TdHJ1Y3R1cmV7c3RydWN0X2Jvb2w6Ziwgc3RydWN0X2ludDo5NzMiCisgICAgIiwgc3RydWN0X2Zsb2F0OjguNTYwMDAwfSI7CitzdGF0aWMgY29uc3QgOjphb3M6OmNvbW1vbjo6dGVzdGluZzo6U3RydWN0dXJlIGtTdHJ1Y3R1cmVWYWx1ZSh0cnVlLCA5NzMsIDMuMTQpOworc3RhdGljIGNvbnN0IE1lc3NhZ2VXaXRoQXJyYXlzIGtUZXN0TWVzc2FnZVdpdGhBcnJheXMoe3s5NzEsIDI1NCwgMTY3OH19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3trU3RydWN0dXJlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTdHJ1Y3R1cmVWYWx1ZX19KTsKK3N0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIGtUZXN0TWVzc2FnZVdpdGhBcnJheXNTdHJpbmcgPQorICAgICIuYW9zLmNvbW1vbi50ZXN0aW5nLk1lc3NhZ2VXaXRoQXJyYXlze3Rlc3RfaW50Ols5NzEsIDI1NCwgMTY3OF0sICIKKyAgICAidGVzdF9zdHJ1Y3Q6Wy5hb3MuY29tbW9uLnRlc3RpbmcuU3RydWN0dXJle3N0cnVjdF9ib29sOlQsIHN0cnVjdF9pbnQ6OTczLCAiCisgICAgInN0cnVjdF9mbG9hdDozLjE0MDAwMH0sIC5hb3MuY29tbW9uLnRlc3RpbmcuU3RydWN0dXJle3N0cnVjdF9ib29sOlQsICIKKyAgICAic3RydWN0X2ludDo5NzMsIHN0cnVjdF9mbG9hdDozLjE0MDAwMH1dfSI7CisKK1RFU1RfRihQcmludE1lc3NhZ2VUZXN0LCBCYXNpYykgeworICBDSEVDS19HRShzaXplb2YoaW5wdXQpLCBrVGVzdE1lc3NhZ2UxLlNpemUoKSk7CisgIGlucHV0X2J5dGVzID0ga1Rlc3RNZXNzYWdlMS5TZXJpYWxpemUoaW5wdXQpOworICBvdXRwdXRfYnl0ZXMgPSBzaXplb2Yob3V0cHV0KTsKKyAgQVNTRVJUX1RSVUUoUHJpbnRNZXNzYWdlKG91dHB1dCwgJm91dHB1dF9ieXRlcywgaW5wdXQsICZpbnB1dF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICprVGVzdE1lc3NhZ2UxLkdldFR5cGUoKSkpOworICBFWFBFQ1RfRVEoa1Rlc3RNZXNzYWdlMVN0cmluZywgOjpzdGQ6OnN0cmluZyhvdXRwdXQpKTsKKyAgRVhQRUNUX0VRKGtUZXN0TWVzc2FnZTFTdHJpbmcuc2l6ZSgpICsgMSwgc2l6ZW9mKG91dHB1dCkgLSBvdXRwdXRfYnl0ZXMpOworfQorCitURVNUX0YoUHJpbnRNZXNzYWdlVGVzdCwgT3V0cHV0VG9vU21hbGwpIHsKKyAgQ0hFQ0tfR0Uoc2l6ZW9mKGlucHV0KSwga1Rlc3RNZXNzYWdlMS5TaXplKCkpOworICBpbnB1dF9ieXRlcyA9IGtUZXN0TWVzc2FnZTEuU2VyaWFsaXplKGlucHV0KTsKKyAgb3V0cHV0X2J5dGVzID0ga1Rlc3RNZXNzYWdlMVN0cmluZy5zaXplKCk7CisgIEVYUEVDVF9GQUxTRShQcmludE1lc3NhZ2Uob3V0cHV0LCAmb3V0cHV0X2J5dGVzLCBpbnB1dCwgJmlucHV0X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtUZXN0TWVzc2FnZTEuR2V0VHlwZSgpKSk7Cit9CisKK1RFU1RfRihQcmludE1lc3NhZ2VUZXN0LCBJbnB1dFRvb1NtYWxsKSB7CisgIGlucHV0X2J5dGVzID0ga1Rlc3RNZXNzYWdlMS5TaXplKCkgLSAxOworICBvdXRwdXRfYnl0ZXMgPSBzaXplb2Yob3V0cHV0KTsKKyAgRVhQRUNUX0ZBTFNFKFByaW50TWVzc2FnZShvdXRwdXQsICZvdXRwdXRfYnl0ZXMsIGlucHV0LCAmaW5wdXRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqa1Rlc3RNZXNzYWdlMS5HZXRUeXBlKCkpKTsKK30KKworVEVTVF9GKFByaW50TWVzc2FnZVRlc3QsIFN0cnVjdHVyZSkgeworICBDSEVDS19HRShzaXplb2YoaW5wdXQpLCBrVGVzdFN0cnVjdHVyZTEuU2l6ZSgpKTsKKyAgaW5wdXRfYnl0ZXMgPSBrVGVzdFN0cnVjdHVyZTEuU2VyaWFsaXplKGlucHV0KTsKKyAgb3V0cHV0X2J5dGVzID0gc2l6ZW9mKG91dHB1dCk7CisgIEFTU0VSVF9UUlVFKFByaW50TWVzc2FnZShvdXRwdXQsICZvdXRwdXRfYnl0ZXMsIGlucHV0LCAmaW5wdXRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqa1Rlc3RTdHJ1Y3R1cmUxLkdldFR5cGUoKSkpOworICBFWFBFQ1RfRVEoa1Rlc3RTdHJ1Y3R1cmUxU3RyaW5nLCA6OnN0ZDo6c3RyaW5nKG91dHB1dCkpOworICBFWFBFQ1RfRVEoa1Rlc3RTdHJ1Y3R1cmUxU3RyaW5nLnNpemUoKSArIDEsIHNpemVvZihvdXRwdXQpIC0gb3V0cHV0X2J5dGVzKTsKK30KKworVEVTVF9GKFByaW50TWVzc2FnZVRlc3QsIE1hdHJpeCkgeworICBzdGF0aWMgY29uc3QgdWludDE2X3Qga1Rlc3RNYXRyaXhbXSA9IHs5NzEsIDI1NCwgMTc2OCwgODk3MSwgOTk3MSwgOTczfTsKKyAgdWludDE2X3QgdGVzdF9tYXRyaXhbc2l6ZW9mKGtUZXN0TWF0cml4KSAvIHNpemVvZihrVGVzdE1hdHJpeFswXSldOworICBTZXJpYWxpemVNYXRyaXgocXVldWVfcHJpbWl0aXZlX3R5cGVzOjp1aW50MTZfdF9wLCB0ZXN0X21hdHJpeCwga1Rlc3RNYXRyaXgsCisgICAgICAgICAgICAgICAgICAzLCAyKTsKKyAgc3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcga091dHB1dCA9CisgICAgICAiW1s5NzEsIDg5NzFdLCBbMjU0LCA5OTcxXSwgWzE3NjgsIDk3M11dIjsKKyAgb3V0cHV0X2J5dGVzID0gc2l6ZW9mKG91dHB1dCk7CisgIEFTU0VSVF9UUlVFKFByaW50TWF0cml4KG91dHB1dCwgJm91dHB1dF9ieXRlcywgdGVzdF9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX3ByaW1pdGl2ZV90eXBlczo6dWludDE2X3RfcCwgMywgMikpOworICBFWFBFQ1RfRVEoa091dHB1dCwgOjpzdGQ6OnN0cmluZyhvdXRwdXQpKTsKKyAgRVhQRUNUX0VRKGtPdXRwdXQuc2l6ZSgpICsgMSwgc2l6ZW9mKG91dHB1dCkgLSBvdXRwdXRfYnl0ZXMpOworfQorCitURVNUX0YoUHJpbnRNZXNzYWdlVGVzdCwgQXJyYXkpIHsKKyAgQ0hFQ0tfR0Uoc2l6ZW9mKGlucHV0KSwga1Rlc3RNZXNzYWdlV2l0aEFycmF5cy5TaXplKCkpOworICBpbnB1dF9ieXRlcyA9IGtUZXN0TWVzc2FnZVdpdGhBcnJheXMuU2VyaWFsaXplKGlucHV0KTsKKyAgb3V0cHV0X2J5dGVzID0gc2l6ZW9mKG91dHB1dCk7CisgIEFTU0VSVF9UUlVFKFByaW50TWVzc2FnZShvdXRwdXQsICZvdXRwdXRfYnl0ZXMsIGlucHV0LCAmaW5wdXRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqa1Rlc3RNZXNzYWdlV2l0aEFycmF5cy5HZXRUeXBlKCkpKTsKKyAgRVhQRUNUX0VRKGtUZXN0TWVzc2FnZVdpdGhBcnJheXNTdHJpbmcsIDo6c3RkOjpzdHJpbmcob3V0cHV0KSk7CisgIEVYUEVDVF9FUShrVGVzdE1lc3NhZ2VXaXRoQXJyYXlzU3RyaW5nLnNpemUoKSArIDEsCisgICAgICAgICAgICBzaXplb2Yob3V0cHV0KSAtIG91dHB1dF9ieXRlcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3Njb3BlZF9mZC5oIGIvYW9zL2NvbW1vbi9zY29wZWRfZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VjZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9zY29wZWRfZmQuaApAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL21hY3Jvcy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBhb3MgeworCisvLyBTbWFydCAicG9pbnRlciIgKGNvbnRhaW5lcikgZm9yIGEgZmlsZSBkZXNjcmlwdG9yLgorY2xhc3MgU2NvcGVkRkQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2NvcGVkRkQoaW50IGZkID0gLTEpIDogZmRfKGZkKSB7fQorICB+U2NvcGVkRkQoKSB7CisgICAgQ2xvc2UoKTsKKyAgfQorICBpbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gZmRfOyB9CisgIGludCByZWxlYXNlKCkgeworICAgIGNvbnN0IGludCByID0gZmRfOworICAgIGZkXyA9IC0xOworICAgIHJldHVybiByOworICB9CisgIHZvaWQgcmVzZXQoaW50IG5ld19mZCA9IC0xKSB7CisgICAgaWYgKGZkXyAhPSBuZXdfZmQpIHsKKyAgICAgIENsb3NlKCk7CisgICAgICBmZF8gPSBuZXdfZmQ7CisgICAgfQorICB9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBmZF8gIT0gLTE7IH0KKyBwcml2YXRlOgorICBpbnQgZmRfOworICB2b2lkIENsb3NlKCkgeworICAgIGlmIChmZF8gIT0gLTEpIHsKKyAgICAgIGlmIChjbG9zZShmZF8pID09IC0xKSB7CisgICAgICAgIFBMT0coV0FSTklORywgImNsb3NlKCVkKSBmYWlsZWQiLCBmZF8pOworICAgICAgfQorICAgIH0KKyAgfQorICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2NvcGVkRkQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9zY29wZWRfcHRyLmggYi9hb3MvY29tbW9uL3Njb3BlZF9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRmNzhlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi9zY29wZWRfcHRyLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1NDT1BFRF9QVFJfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9TQ09QRURfUFRSX0hfCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL21hY3Jvcy5oIgorCituYW1lc3BhY2UgYW9zIHsKKworLy8gQSBzaW1wbGUgc2NvcGVkX3B0ciBpbXBsZW1lbnRhdGlvbiB0aGF0IHdvcmtzIHVuZGVyIGJvdGggbGludXggYW5kIHZ4d29ya3MuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3Mgc2NvcGVkX3B0ciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworICAKKyAgZXhwbGljaXQgc2NvcGVkX3B0cihUICpwID0gTlVMTCkgOiBwXyhwKSB7fQorICB+c2NvcGVkX3B0cigpIHsKKyAgICBkZWxldGUgcF87CisgIH0KKworICBUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcF87IH0KKyAgVCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBfOyB9CisgIFQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIHBfOyB9CisKKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHBfICE9IE5VTEw7IH0KKworICB2b2lkIHN3YXAoc2NvcGVkX3B0cjxUPiAmb3RoZXIpIHsKKyAgICBUICp0ZW1wID0gb3RoZXIucF87CisgICAgb3RoZXIucF8gPSBwXzsKKyAgICBwXyA9IG90aGVyLnBfOworICB9CisgIHZvaWQgcmVzZXQoVCAqcCA9IE5VTEwpIHsKKyAgICBpZiAocF8gIT0gTlVMTCkgZGVsZXRlIHBfOworICAgIHBfID0gcDsKKyAgfQorCisgcHJpdmF0ZToKKyAgVCAqcF87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKHNjb3BlZF9wdHI8VD4pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fU0NPUEVEX1BUUl9IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9zdGxfbXV0ZXguaCBiL2Fvcy9jb21tb24vc3RsX211dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MjMxMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vc3RsX211dGV4LmgKQEAgLTAsMCArMSwxNDQgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9TVExfTVVURVhfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9TVExfTVVURVhfSF8KKworI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9hb3Nfc3luYy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisKK25hbWVzcGFjZSBhb3MgeworCisvLyBBIG11dGV4IHdpdGggdGhlIHNhbWUgQVBJIGFuZCBzZW1hbnRpY3MgYXMgOjpzdGQ6Om11dGV4LCB3aXRoIHRoZSBhZGRpdGlvbiBvZgorLy8gbWV0aG9kcyBmb3IgY2hlY2tpbmcgaWYgdGhlIHByZXZpb3VzIG93bmVyIGRpZWQgYW5kIGEgY29uc3RleHByIGRlZmF1bHQKKy8vIGNvbnN0cnVjdG9yLgorLy8gRGVmaW5pdGVseSBzYWZlIHRvIHB1dCBpbiBTSE0uCisvLyBUaGlzIHVzZXMgdGhlIHB0aHJlYWRfbXV0ZXggc2VtYW50aWNzIGZvciBvd25lci1kaWVkOiBvbmNlIHNvbWVib2R5IGRpZXMgd2l0aAorLy8gdGhlIGxvY2sgaGVsZCwgYW55Ym9keSBlbHNlIHdobyB0YWtlcyBpdCB3aWxsIHNlZSB0cnVlIGZvciBvd25lcl9kaWVkKCkgdW50aWwKKy8vIG9uZSBvZiB0aGVtIGNhbGxzIGNvbnNpc3RlbnQoKS4gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB1bmxvY2soKSB3aGVuCisvLyBvd25lcl9kaWVkKCkgcmV0dXJucyB0cnVlLgorY2xhc3Mgc3RsX211dGV4IHsKKyBwdWJsaWM6CisgIGNvbnN0ZXhwciBzdGxfbXV0ZXgoKSA6IG5hdGl2ZV9oYW5kbGVfKCkge30KKworICB2b2lkIGxvY2soKSB7CisgICAgY29uc3QgaW50IHJldCA9IG11dGV4X2dyYWIoJm5hdGl2ZV9oYW5kbGVfKTsKKyAgICBzd2l0Y2ggKHJldCkgeworICAgICAgY2FzZSAwOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgb3duZXJfZGllZF8gPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhGQVRBTCwgIm11dGV4X2dyYWIoJXApIGZhaWxlZCB3aXRoICVkXG4iLCAmbmF0aXZlX2hhbmRsZV8sIHJldCk7CisgICAgfQorICB9CisKKyAgYm9vbCB0cnlfbG9jaygpIHsKKyAgICBjb25zdCBpbnQgcmV0ID0gbXV0ZXhfdHJ5bG9jaygmbmF0aXZlX2hhbmRsZV8pOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSAxOgorICAgICAgICBvd25lcl9kaWVkXyA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSA0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0coRkFUQUwsICJtdXRleF90cnlsb2NrKCVwKSBmYWlsZWQgd2l0aCAlZFxuIiwgJm5hdGl2ZV9oYW5kbGVfLCByZXQpOworICAgIH0KKyAgfQorCisgIHZvaWQgdW5sb2NrKCkgeworICAgIENIRUNLKCFvd25lcl9kaWVkXyk7CisgICAgbXV0ZXhfdW5sb2NrKCZuYXRpdmVfaGFuZGxlXyk7CisgIH0KKworICB0eXBlZGVmIGFvc19tdXRleCAqbmF0aXZlX2hhbmRsZV90eXBlOworICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpIHsgcmV0dXJuICZuYXRpdmVfaGFuZGxlXzsgfQorCisgIGJvb2wgb3duZXJfZGllZCgpIGNvbnN0IHsgcmV0dXJuIG93bmVyX2RpZWRfOyB9CisgIHZvaWQgY29uc2lzdGVudCgpIHsgb3duZXJfZGllZF8gPSBmYWxzZTsgfQorCisgcHJpdmF0ZToKKyAgYW9zX211dGV4IG5hdGl2ZV9oYW5kbGVfOworCisgIGJvb2wgb3duZXJfZGllZF8gPSBmYWxzZTsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oc3RsX211dGV4KTsKK307CisKKy8vIEEgbXV0ZXggd2l0aCB0aGUgc2FtZSBBUEkgYW5kIHNlbWFudGljcyBhcyA6OnN0ZDo6cmVjdXJzaXZlX211dGV4LCB3aXRoIHRoZQorLy8gYWRkaXRpb24gb2YgbWV0aG9kcyBmb3IgY2hlY2tpbmcgaWYgdGhlIHByZXZpb3VzIG93bmVyIGRpZWQgYW5kIGEgY29uc3RleHByCisvLyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorLy8gRGVmaW5pdGVseSBzYWZlIHRvIHB1dCBpbiBTSE0uCisvLyBUaGlzIHVzZXMgdGhlIHB0aHJlYWRfbXV0ZXggc2VtYW50aWNzIGZvciBvd25lci1kaWVkOiBvbmNlIHNvbWVib2R5IGRpZXMgd2l0aAorLy8gdGhlIGxvY2sgaGVsZCwgYW55Ym9keSBlbHNlIHdobyB0YWtlcyBpdCB3aWxsIHNlZSB0cnVlIGZvciBvd25lcl9kaWVkKCkgdW50aWwKKy8vIG9uZSBvZiB0aGVtIGNhbGxzIGNvbnNpc3RlbnQoKS4gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB1bmxvY2soKSBvciBsb2NrKCkKKy8vIGFnYWluIHdoZW4gb3duZXJfZGllZCgpIHJldHVybnMgdHJ1ZS4KK2NsYXNzIHN0bF9yZWN1cnNpdmVfbXV0ZXggeworIHB1YmxpYzoKKyAgY29uc3RleHByIHN0bF9yZWN1cnNpdmVfbXV0ZXgoKSB7fQorCisgIHZvaWQgbG9jaygpIHsKKyAgICBpZiAobXV0ZXhfaXNsb2NrZWQobXV0ZXhfLm5hdGl2ZV9oYW5kbGUoKSkpIHsKKyAgICAgIENIRUNLKCFvd25lcl9kaWVkKCkpOworICAgICAgKytyZWN1cnNpdmVfbG9ja3NfOworICAgIH0gZWxzZSB7CisgICAgICBtdXRleF8ubG9jaygpOworICAgICAgaWYgKG11dGV4Xy5vd25lcl9kaWVkKCkpIHsKKyAgICAgICAgcmVjdXJzaXZlX2xvY2tzXyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBDSEVDS19FUSgwLCByZWN1cnNpdmVfbG9ja3NfKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYm9vbCB0cnlfbG9jaygpIHsKKyAgICBpZiAobXV0ZXhfaXNsb2NrZWQobXV0ZXhfLm5hdGl2ZV9oYW5kbGUoKSkpIHsKKyAgICAgIENIRUNLKCFvd25lcl9kaWVkKCkpOworICAgICAgKytyZWN1cnNpdmVfbG9ja3NfOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtdXRleF8udHJ5X2xvY2soKSkgeworICAgICAgICBpZiAobXV0ZXhfLm93bmVyX2RpZWQoKSkgeworICAgICAgICAgIHJlY3Vyc2l2ZV9sb2Nrc18gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENIRUNLX0VRKDAsIHJlY3Vyc2l2ZV9sb2Nrc18pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIHVubG9jaygpIHsKKyAgICBpZiAocmVjdXJzaXZlX2xvY2tzXyA9PSAwKSB7CisgICAgICBtdXRleF8udW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC0tcmVjdXJzaXZlX2xvY2tzXzsKKyAgICB9CisgIH0KKworICB0eXBlZGVmIHN0bF9tdXRleDo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKKyAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoKSB7IHJldHVybiBtdXRleF8ubmF0aXZlX2hhbmRsZSgpOyB9CisKKyAgYm9vbCBvd25lcl9kaWVkKCkgY29uc3QgeyByZXR1cm4gbXV0ZXhfLm93bmVyX2RpZWQoKTsgfQorICB2b2lkIGNvbnNpc3RlbnQoKSB7IG11dGV4Xy5jb25zaXN0ZW50KCk7IH0KKworIHByaXZhdGU6CisgIHN0bF9tdXRleCBtdXRleF87CisgIGludCByZWN1cnNpdmVfbG9ja3NfID0gMDsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oc3RsX3JlY3Vyc2l2ZV9tdXRleCk7Cit9OworCisvLyBDb252ZW5pZW50IHR5cGVkZWZzIGZvciB2YXJpb3VzIHR5cGVzIG9mIGxvY2tpbmcgb2JqZWN0cy4KK3R5cGVkZWYgOjpzdGQ6OmxvY2tfZ3VhcmQ8c3RsX211dGV4PiBtdXRleF9sb2NrX2d1YXJkOwordHlwZWRlZiA6OnN0ZDo6bG9ja19ndWFyZDxzdGxfcmVjdXJzaXZlX211dGV4PiByZWN1cnNpdmVfbG9ja19ndWFyZDsKK3R5cGVkZWYgOjpzdGQ6OnVuaXF1ZV9sb2NrPHN0bF9tdXRleD4gbXV0ZXhfdW5pcXVlX2xvY2s7Cit0eXBlZGVmIDo6c3RkOjp1bmlxdWVfbG9jazxzdGxfcmVjdXJzaXZlX211dGV4PiByZWN1cnNpdmVfdW5pcXVlX2xvY2s7CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX1NUTF9NVVRFWF9IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi9zdGxfbXV0ZXhfdGVzdC5jYyBiL2Fvcy9jb21tb24vc3RsX211dGV4X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4NDQxNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vc3RsX211dGV4X3Rlc3QuY2MKQEAgLTAsMCArMSw3NCBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vc3RsX211dGV4LmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvdGhyZWFkLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9kaWUuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIFN0bE11dGV4RGVhdGhUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6OkVuYWJsZVRlc3RMb2dnaW5nKCk7CisgICAgU2V0RGllVGVzdE1vZGUodHJ1ZSk7CisgIH0KK307CisKK3R5cGVkZWYgU3RsTXV0ZXhEZWF0aFRlc3QgU3RsUmVjdXJzaXZlTXV0ZXhEZWF0aFRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgbG9ja2luZy91bmxvY2tpbmcgd2l0aG91dCBhbnkgYmxvY2tpbmcgd29ya3MuCitURVNUKFN0bE11dGV4VGVzdCwgQmFzaWMpIHsKKyAgc3RsX211dGV4IG11dGV4OworCisgIG11dGV4LmxvY2soKTsKKyAgbXV0ZXgudW5sb2NrKCk7CisKKyAgQVNTRVJUX1RSVUUobXV0ZXgudHJ5X2xvY2soKSk7CisgIEFTU0VSVF9GQUxTRShtdXRleC50cnlfbG9jaygpKTsKKyAgbXV0ZXgudW5sb2NrKCk7CisKKyAgbXV0ZXgubG9jaygpOworICBBU1NFUlRfRkFMU0UobXV0ZXgudHJ5X2xvY2soKSk7CisgIG11dGV4LnVubG9jaygpOworfQorCisvLyBUZXN0cyB0aGF0IHVubG9ja2luZyBhbiB1bmxvY2tlZCBtdXRleCBmYWlscy4KK1RFU1RfRihTdGxNdXRleERlYXRoVGVzdCwgTXVsdGlwbGVVbmxvY2spIHsKKyAgc3RsX211dGV4IG11dGV4OworICBtdXRleC5sb2NrKCk7CisgIG11dGV4LnVubG9jaygpOworICBFWFBFQ1RfREVBVEgobXV0ZXgudW5sb2NrKCksICIuKm11bHRpcGxlIHVubG9jay4qIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgbG9ja2luZy91bmxvY2tpbmcgKGluY2x1ZGluZyByZWN1cnNpdmVseSkgd2l0aG91dCBhbnkgYmxvY2tpbmcKKy8vIHdvcmtzLgorVEVTVChTdGxSZWN1cnNpdmVNdXRleFRlc3QsIEJhc2ljKSB7CisgIHN0bF9yZWN1cnNpdmVfbXV0ZXggbXV0ZXg7CisKKyAgbXV0ZXgubG9jaygpOworICBtdXRleC51bmxvY2soKTsKKworICBBU1NFUlRfVFJVRShtdXRleC50cnlfbG9jaygpKTsKKyAgQVNTRVJUX1RSVUUobXV0ZXgudHJ5X2xvY2soKSk7CisgIG11dGV4LnVubG9jaygpOworICBtdXRleC51bmxvY2soKTsKKworICBtdXRleC5sb2NrKCk7CisgIEFTU0VSVF9UUlVFKG11dGV4LnRyeV9sb2NrKCkpOworICBtdXRleC51bmxvY2soKTsKKwltdXRleC51bmxvY2soKTsKK30KKworLy8gVGVzdHMgdGhhdCB1bmxvY2tpbmcgYW4gdW5sb2NrZWQgcmVjdXJzaXZlIG11dGV4IGZhaWxzLgorVEVTVF9GKFN0bFJlY3Vyc2l2ZU11dGV4RGVhdGhUZXN0LCBNdWx0aXBsZVVubG9jaykgeworICBzdGxfcmVjdXJzaXZlX211dGV4IG11dGV4OworICBtdXRleC5sb2NrKCk7CisgIG11dGV4LnVubG9jaygpOworICBFWFBFQ1RfREVBVEgobXV0ZXgudW5sb2NrKCksICIuKm11bHRpcGxlIHVubG9jay4qIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3Rlc3RfcXVldWUucSBiL2Fvcy9jb21tb24vdGVzdF9xdWV1ZS5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyN2I2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3Rlc3RfcXVldWUucQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGFvcy5jb21tb24udGVzdGluZzsKKworc3RydWN0IFN0cnVjdHVyZSB7CisgIGJvb2wgc3RydWN0X2Jvb2w7CisgIHVpbnQxNl90IHN0cnVjdF9pbnQ7CisgIGZsb2F0IHN0cnVjdF9mbG9hdDsKK307CisKK21lc3NhZ2UgTWVzc2FnZVdpdGhTdHJ1Y3R1cmUgeworICBib29sIG90aGVyX21lbWJlcjsKKyAgU3RydWN0dXJlIHN0cnVjdDE7CisgIFN0cnVjdHVyZSBzdHJ1Y3QyOworfTsKKworbWVzc2FnZSBUZXN0aW5nTWVzc2FnZSB7CisgIGJvb2wgdGVzdF9ib29sOworICBpbnQzMl90IHRlc3RfaW50OworfTsKKworbWVzc2FnZSBPdGhlclRlc3RpbmdNZXNzYWdlIHsKKyAgYm9vbCB0ZXN0X2Jvb2w7CisgIGludDMyX3QgdGVzdF9pbnQ7CisgIGRvdWJsZSB0ZXN0X2RvdWJsZTsKK307CisKK21lc3NhZ2UgTWVzc2FnZVdpdGhBcnJheXMgeworICB1aW50MTZfdFszXSB0ZXN0X2ludDsKKyAgU3RydWN0dXJlWzJdIHRlc3Rfc3RydWN0OworfTsKKworcXVldWUgVGVzdGluZ01lc3NhZ2UgdGVzdF9xdWV1ZTsKKworcXVldWVfZ3JvdXAgVHdvUXVldWVzIHsKKyAgcXVldWUgVGVzdGluZ01lc3NhZ2UgZmlyc3Q7CisgIHF1ZXVlIE90aGVyVGVzdGluZ01lc3NhZ2Ugc2Vjb25kOworfTsKKworcXVldWVfZ3JvdXAgVHdvUXVldWVzIHRlc3RfcXVldWVncm91cDsKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vdGltZS5jYyBiL2Fvcy9jb21tb24vdGltZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzE4YWZiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi90aW1lLmNjCkBAIC0wLDAgKzEsMjMzIEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisvLyBXZSBvbmx5IHVzZSBnbG9iYWxfY29yZSBmcm9tIGhlcmUsIHdoaWNoIGlzIHdlYWssIHNvIHdlIGRvbid0IHJlYWxseSBoYXZlIGEKKy8vIGRlcGVuZGVuY3kgb24gaXQuCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9zaGFyZWRfbWVtLmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbXV0ZXguaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdGltZSB7CisKKy8vIFN0YXRlIHJlcXVpcmVkIHRvIGVuYWJsZSBhbmQgdXNlIG1vY2sgdGltZS4KK25hbWVzcGFjZSB7CisvLyBUcnVlIGlmIG1vY2sgdGltZSBpcyBlbmFibGVkLgorLy8gVGhpcyBkb2VzIG5vdCBuZWVkIHRvIGJlIGNoZWNrZWQgd2l0aCB0aGUgbXV0ZXggaGVsZCBiZWNhdXNlIHNldHRpbmcgdGltZSB0bworLy8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBpcyBhdG9taWMsIGFuZCBhbGwgZnV0dXJlIG9wZXJhdGlvbnMgYXJlIGF0b21pYworLy8gYW55d2F5cy4gIElmIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gc2V0dGluZyBvciBjbGVhcmluZyB3aGV0aGVyIHRpbWUgaXMKKy8vIGVuYWJsZWQgb3Igbm90LCBpdCB3aWxsIHN0aWxsIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgY3VycmVudF9tb2NrX3RpbWUgaXMKKy8vIGFsc28gc2V0IGF0b21pY2FsbHkgd2l0aCBlbmFibGVkLgorYm9vbCBtb2NrX3RpbWVfZW5hYmxlZCA9IGZhbHNlOworLy8gTXV0ZXggdG8gbWFrZSB0aW1lIHJlYWRzIGFuZCB3cml0ZXMgdGhyZWFkIHNhZmUuCitNdXRleCB0aW1lX211dGV4OworLy8gQ3VycmVudCB0aW1lIHdoZW4gdGltZSBpcyBtb2NrZWQuCitUaW1lIGN1cnJlbnRfbW9ja190aW1lKDAsIDApOworCisvLyBUT0RPKGFzY2h1aCk6IFRoaXMgZG9lc24ndCBpbmNsdWRlIFNsZWVwRm9yIGFuZCBTbGVlcFVudGlsLgorLy8gVE9ETyhhc2NodWgpOiBDcmVhdGUgYSBjbG9jayBzb3VyY2Ugb2JqZWN0IGFuZCBjaGFuZ2UgdGhlIGRlZmF1bHQ/CisvLyAgVGhhdCB3b3VsZCBsZXQgbWUgY3JlYXRlIGEgTW9ja1RpbWUgY2xvY2sgc291cmNlLgorCitUaW1lIE5vd0ltcGwoY2xvY2tpZF90IGNsb2NrKSB7CisgIHRpbWVzcGVjIHRlbXA7CisgIGlmIChjbG9ja19nZXR0aW1lKGNsb2NrLCAmdGVtcCkgIT0gMCkgeworICAgIFBMT0coRkFUQUwsICJjbG9ja19nZXR0aW1lKCVqZCwgJXApIGZhaWxlZCIsCisgICAgICAgICBzdGF0aWNfY2FzdDx1aW50bWF4X3Q+KGNsb2NrKSwgJnRlbXApOworICB9CisKKyAgY29uc3QgdGltZXNwZWMgb2Zmc2V0ID0gKGdsb2JhbF9jb3JlID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRpbWVzcGVjezAsIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdsb2JhbF9jb3JlLT5tZW1fc3RydWN0LT50aW1lX29mZnNldDsKKyAgcmV0dXJuIFRpbWUodGVtcCkgKyBUaW1lKG9mZnNldCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIFRpbWU6OkVuYWJsZU1vY2tUaW1lKGNvbnN0IFRpbWUgJm5vdykgeworICBNdXRleExvY2tlciB0aW1lX211dGV4X2xvY2tlcigmdGltZV9tdXRleCk7CisgIG1vY2tfdGltZV9lbmFibGVkID0gdHJ1ZTsKKyAgY3VycmVudF9tb2NrX3RpbWUgPSBub3c7Cit9CisKK3ZvaWQgVGltZTo6VXBkYXRlTW9ja1RpbWUoKSB7CisgIFNldE1vY2tUaW1lKE5vd0ltcGwoa0RlZmF1bHRDbG9jaykpOworfQorCit2b2lkIFRpbWU6OkRpc2FibGVNb2NrVGltZSgpIHsKKyAgTXV0ZXhMb2NrZXIgdGltZV9tdXRleF9sb2NrZXIoJnRpbWVfbXV0ZXgpOworICBtb2NrX3RpbWVfZW5hYmxlZCA9IGZhbHNlOworfQorCit2b2lkIFRpbWU6OlNldE1vY2tUaW1lKGNvbnN0IFRpbWUgJm5vdykgeworICBNdXRleExvY2tlciB0aW1lX211dGV4X2xvY2tlcigmdGltZV9tdXRleCk7CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0KCFtb2NrX3RpbWVfZW5hYmxlZCwgMCkpIHsKKyAgICBMT0coRkFUQUwsICJUcmllZCB0byBzZXQgbW9jayB0aW1lIGFuZCBtb2NrIHRpbWUgaXMgbm90IGVuYWJsZWRcbiIpOworICB9CisgIGN1cnJlbnRfbW9ja190aW1lID0gbm93OworfQorCit2b2lkIFRpbWU6OkluY3JlbWVudE1vY2tUaW1lKGNvbnN0IFRpbWUgJmFtb3VudCkgeworICBzdGF0aWMgOjphb3M6Ok11dGV4IG11dGV4OworICA6OmFvczo6TXV0ZXhMb2NrZXIgc3luYygmbXV0ZXgpOworICBTZXRNb2NrVGltZShOb3coKSArIGFtb3VudCk7Cit9CisKK1RpbWUgVGltZTo6Tm93KGNsb2NraWRfdCBjbG9jaykgeworICB7CisgICAgTXV0ZXhMb2NrZXIgdGltZV9tdXRleF9sb2NrZXIoJnRpbWVfbXV0ZXgpOworICAgIGlmIChtb2NrX3RpbWVfZW5hYmxlZCkgeworICAgICAgcmV0dXJuIGN1cnJlbnRfbW9ja190aW1lOworICAgIH0KKyAgfQorICByZXR1cm4gTm93SW1wbChjbG9jayk7Cit9CisKK3ZvaWQgVGltZTo6Q2hlY2tJbXBsKGludDMyX3QgbnNlYykgeworICBzdGF0aWNfYXNzZXJ0KGFvczo6c2htX29rPFRpbWU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiaXQgc2hvdWxkIGJlIGFibGUgdG8gZ28gdGhyb3VnaCBzaGFyZWQgbWVtb3J5Iik7CisgIGlmIChuc2VjID49IGtOU2VjSW5TZWMgfHwgbnNlYyA8IDApIHsKKyAgICBMT0coRkFUQUwsICIwIDw9IG5zZWMoJSIgUFJJZDMyICIpIDwgJSIgUFJJZDMyICIgaXNuJ3QgdHJ1ZS5cbiIsCisgICAgICAgIG5zZWMsIGtOU2VjSW5TZWMpOworICB9Cit9CisKK1RpbWUgJlRpbWU6Om9wZXJhdG9yKz0oY29uc3QgVGltZSAmcmhzKSB7CisgIHNlY18gKz0gcmhzLnNlY187CisgIG5zZWNfICs9IHJocy5uc2VjXzsKKyAgaWYgKG5zZWNfID49IGtOU2VjSW5TZWMpIHsKKyAgICBuc2VjXyAtPSBrTlNlY0luU2VjOworICAgIHNlY18gKz0gMTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9Citjb25zdCBUaW1lIFRpbWU6Om9wZXJhdG9yKyhjb25zdCBUaW1lICZyaHMpIGNvbnN0IHsKKyAgcmV0dXJuIFRpbWUoKnRoaXMpICs9IHJoczsKK30KK1RpbWUgJlRpbWU6Om9wZXJhdG9yLT0oY29uc3QgVGltZSAmcmhzKSB7CisgIHNlY18gLT0gcmhzLnNlY187CisgIG5zZWNfIC09IHJocy5uc2VjXzsKKyAgaWYgKG5zZWNfIDwgMCkgeworICAgIG5zZWNfICs9IGtOU2VjSW5TZWM7CisgICAgc2VjXyAtPSAxOworICB9CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IFRpbWUgVGltZTo6b3BlcmF0b3ItKGNvbnN0IFRpbWUgJnJocykgY29uc3QgeworICByZXR1cm4gVGltZSgqdGhpcykgLT0gcmhzOworfQorVGltZSAmVGltZTo6b3BlcmF0b3IqPShpbnQzMl90IHJocykgeworICBjb25zdCBpbnQ2NF90IHRlbXAgPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pihuc2VjXykgKgorICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmhzKTsKKyAgc2VjXyAqPSByaHM7ICAvLyBiZXR0ZXIgbm90IG92ZXJmbG93LCBvciB0aGUgcmVzdWx0IGlzIGp1c3QgdG9vIGJpZworICBuc2VjXyA9IHRlbXAgJSBrTlNlY0luU2VjOworICBzZWNfICs9ICh0ZW1wIC0gbnNlY18pIC8ga05TZWNJblNlYzsKKyAgaWYgKG5zZWNfIDwgMCkgeworICAgIG5zZWNfICs9IGtOU2VjSW5TZWM7CisgICAgc2VjXyAtPSAxOworICB9CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IFRpbWUgVGltZTo6b3BlcmF0b3IqKGludDMyX3QgcmhzKSBjb25zdCB7CisgIHJldHVybiBUaW1lKCp0aGlzKSAqPSByaHM7Cit9CitUaW1lICZUaW1lOjpvcGVyYXRvci89KGludDMyX3QgcmhzKSB7CisgIG5zZWNfID0gKHNlY18gJSByaHMpICogKGtOU2VjSW5TZWMgLyByaHMpICsgbnNlY18gLyByaHM7CisgIHNlY18gLz0gcmhzOworICBpZiAobnNlY18gPCAwKSB7CisgICAgbnNlY18gKz0ga05TZWNJblNlYzsKKyAgICBzZWNfIC09IDE7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorY29uc3QgVGltZSBUaW1lOjpvcGVyYXRvci8oaW50MzJfdCByaHMpIGNvbnN0IHsKKyAgcmV0dXJuIFRpbWUoKnRoaXMpIC89IHJoczsKK30KK2RvdWJsZSBUaW1lOjpvcGVyYXRvci8oY29uc3QgVGltZSAmcmhzKSBjb25zdCB7CisgIHJldHVybiBUb1NlY29uZHMoKSAvIHJocy5Ub1NlY29uZHMoKTsKK30KK1RpbWUgJlRpbWU6Om9wZXJhdG9yJT0oaW50MzJfdCByaHMpIHsKKyAgbnNlY18gPSBUb05TZWMoKSAlIHJoczsKKyAgY29uc3QgaW50IHdyYXBzID0gbnNlY18gLyAoKHJocyAvIGtOU2VjSW5TZWMgKyAxKSAqIGtOU2VjSW5TZWMpOworICBzZWNfID0gd3JhcHMgKyByaHMgLyBrTlNlY0luU2VjOworICBuc2VjXyAtPSBrTlNlY0luU2VjICogd3JhcHM7CisgIGlmIChuc2VjXyA8IDApIHsKKyAgICBuc2VjXyArPSBrTlNlY0luU2VjOworICAgIHNlY18gLT0gMTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9Citjb25zdCBUaW1lIFRpbWU6Om9wZXJhdG9yJShpbnQzMl90IHJocykgY29uc3QgeworICByZXR1cm4gVGltZSgqdGhpcykgJT0gcmhzOworfQorCitjb25zdCBUaW1lIFRpbWU6Om9wZXJhdG9yLSgpIGNvbnN0IHsKKyAgcmV0dXJuIFRpbWUoLXNlY18gLSAxLCBrTlNlY0luU2VjIC0gbnNlY18pOworfQorCitib29sIFRpbWU6Om9wZXJhdG9yPT0oY29uc3QgVGltZSAmcmhzKSBjb25zdCB7CisgIHJldHVybiBzZWNfID09IHJocy5zZWNfICYmIG5zZWNfID09IHJocy5uc2VjXzsKK30KK2Jvb2wgVGltZTo6b3BlcmF0b3IhPShjb25zdCBUaW1lICZyaHMpIGNvbnN0IHsKKyAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKK30KK2Jvb2wgVGltZTo6b3BlcmF0b3I8KGNvbnN0IFRpbWUgJnJocykgY29uc3QgeworICByZXR1cm4gc2VjXyA8IHJocy5zZWNfIHx8IChzZWNfID09IHJocy5zZWNfICYmIG5zZWNfIDwgcmhzLm5zZWNfKTsKK30KK2Jvb2wgVGltZTo6b3BlcmF0b3I+KGNvbnN0IFRpbWUgJnJocykgY29uc3QgeworICByZXR1cm4gc2VjXyA+IHJocy5zZWNfIHx8IChzZWNfID09IHJocy5zZWNfICYmIG5zZWNfID4gcmhzLm5zZWNfKTsKK30KK2Jvb2wgVGltZTo6b3BlcmF0b3I8PShjb25zdCBUaW1lICZyaHMpIGNvbnN0IHsKKyAgcmV0dXJuIHNlY18gPCByaHMuc2VjXyB8fCAoc2VjXyA9PSByaHMuc2VjXyAmJiBuc2VjXyA8PSByaHMubnNlY18pOworfQorYm9vbCBUaW1lOjpvcGVyYXRvcj49KGNvbnN0IFRpbWUgJnJocykgY29uc3QgeworICByZXR1cm4gc2VjXyA+IHJocy5zZWNfIHx8IChzZWNfID09IHJocy5zZWNfICYmIG5zZWNfID49IHJocy5uc2VjXyk7Cit9CisKK2Jvb2wgVGltZTo6SXNXaXRoaW4oY29uc3QgVGltZSAmb3RoZXIsIGludDY0X3QgYW1vdW50KSBjb25zdCB7CisgIGNvbnN0IGludDY0X3QgdGVtcCA9IFRvTlNlYygpIC0gb3RoZXIuVG9OU2VjKCk7CisgIHJldHVybiB0ZW1wIDw9IGFtb3VudCAmJiB0ZW1wID49IC1hbW91bnQ7Cit9CisKK3N0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBUaW1lJiB0aW1lKSB7CisgIHJldHVybiBvcyA8PCAiVGltZXsiIDw8IHRpbWUuc2VjXyA8PCAicywgIiA8PCB0aW1lLm5zZWNfIDw8ICJuc30iOworfQorCit2b2lkIFNsZWVwRm9yKGNvbnN0IFRpbWUgJnRpbWUsIGNsb2NraWRfdCBjbG9jaykgeworICB0aW1lc3BlYyBjb252ZXJ0ZWQodGltZS5Ub1RpbWVzcGVjKCkpLCByZW1haW5pbmc7CisgIGludCBmYWlsdXJlID0gRUlOVFI7CisgIGRvIHsKKyAgICAvLyBUaGlzIGNoZWNrcyB3aGV0aGVyIHRoZSBsYXN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCBhY3R1YWxseSBmYWlsZWQgb3IgZ290CisgICAgLy8gaW50ZXJydXB0ZWQuCisgICAgaWYgKGZhaWx1cmUgIT0gRUlOVFIpIHsKKyAgICAgIFBFTE9HKEZBVEFMLCBmYWlsdXJlLCAiY2xvY2tfbmFub3NsZWVwKCVqZCwgMCwgJXAsICVwKSBmYWlsZWQiLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50bWF4X3Q+KGNsb2NrKSwgJmNvbnZlcnRlZCwgJnJlbWFpbmluZyk7CisgICAgfQorICAgIGZhaWx1cmUgPSBjbG9ja19uYW5vc2xlZXAoY2xvY2ssIDAsICZjb252ZXJ0ZWQsICZyZW1haW5pbmcpOworICAgIG1lbWNweSgmY29udmVydGVkLCAmcmVtYWluaW5nLCBzaXplb2YoY29udmVydGVkKSk7CisgIH0gd2hpbGUgKGZhaWx1cmUgIT0gMCk7Cit9CisKK3ZvaWQgU2xlZXBVbnRpbChjb25zdCBUaW1lICZ0aW1lLCBjbG9ja2lkX3QgY2xvY2spIHsKKyAgdGltZXNwZWMgY29udmVydGVkKHRpbWUuVG9UaW1lc3BlYygpKTsKKyAgaW50IGZhaWx1cmU7CisgIHdoaWxlICgoZmFpbHVyZSA9IGNsb2NrX25hbm9zbGVlcChjbG9jaywgVElNRVJfQUJTVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb252ZXJ0ZWQsIE5VTEwpKSAhPSAwKSB7CisgICAgaWYgKGZhaWx1cmUgIT0gRUlOVFIpIHsKKyAgICAgIFBFTE9HKEZBVEFMLCBmYWlsdXJlLCAiY2xvY2tfbmFub3NsZWVwKCVqZCwgVElNRVJfQUJTVElNRSwgJXAsIE5VTEwpIgorICAgICAgICAgICAgIiBmYWlsZWQiLCBzdGF0aWNfY2FzdDxpbnRtYXhfdD4oY2xvY2spLCAmY29udmVydGVkKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBPZmZzZXRUb05vdyhjb25zdCBUaW1lICZub3cpIHsKKyAgQ0hFQ0tfTk9UTlVMTChnbG9iYWxfY29yZSk7CisgIGdsb2JhbF9jb3JlLT5tZW1fc3RydWN0LT50aW1lX29mZnNldC50dl9uc2VjID0gMDsKKyAgZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QtPnRpbWVfb2Zmc2V0LnR2X3NlYyA9IDA7CisgIGdsb2JhbF9jb3JlLT5tZW1fc3RydWN0LT50aW1lX29mZnNldCA9IChub3cgLSBUaW1lOjpOb3coKSkuVG9UaW1lc3BlYygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGltZQorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi90aW1lLmggYi9hb3MvY29tbW9uL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZlOWEwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi90aW1lLmgKQEAgLTAsMCArMSwyNzEgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9USU1FX0hfCisjZGVmaW5lIEFPU19DT01NT05fVElNRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHRpbWUgeworCisvLyBBIG5pY2Ugc3RydWN0dXJlIGZvciByZXByZXNlbnRpbmcgdGltZXMuCisvLyAwIDw9IG5zZWNfIDwga05TZWNJblNlYyBzaG91bGQgYWx3YXlzIGJlIHRydWUuIEFsbCBmdW5jdGlvbnMgaGVyZSB3aWxsIG1ha2UKKy8vIHN1cmUgdGhhdCB0aGF0IGlzIHRydWUgaWYgaXQgd2FzIG9uIGFsbCBpbnB1dHMgKGluY2x1ZGluZyAqdGhpcykuCisvLworLy8gTmVnYXRpdmUgdGltZXMgYXJlIHN1cHBvcnRlZCBzbyB0aGF0IGFsbCBvZiB0aGUgbm9ybWFsIGFyaXRobWV0aWMgaWRlbnRpdGllcworLy8gd29yay4gbnNlY18gaXMgc3RpbGwgYWx3YXlzIHBvc2l0aXZlLgorLy8KKy8vIFRoZSBhcml0aG1ldGljIGFuZCBjb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgb3ZlcmxvYWRlZCBiZWNhdXNlIHRoZXkgbWFrZQorLy8gY29tcGxldGUgc2Vuc2UgYW5kIGFyZSB2ZXJ5IHVzZWZ1bC4gVGhlIGRlZmF1bHQgY29weSBhbmQgYXNzaWdubWVudCBzdHVmZiBpcworLy8gbGVmdCBiZWNhdXNlIGl0IHdvcmtzIGZpbmUuIE11bHRpcGxpY2F0aW9uIG9mIFRpbWVzIGJ5IFRpbWVzIGlzCisvLyBub3QgaW1wbGVtZW50ZWQgYmVjYXVzZSBJIGNhbid0IHRoaW5rIG9mIGFueSB1c2VzIGZvciB0aGVtIGFuZCB0aGVyZSBhcmUKKy8vIG11bHRpcGxlIHdheXMgdG8gZG8gaXQuIERpdmlzaW9uIG9mIFRpbWVzIGJ5IFRpbWVzIGlzIGltcGxlbWVudGVkIGFzIHRoZQorLy8gcmF0aW8gb2YgdGhlbS4gTXVsdGlwbGljYXRpb24sIGRpdmlzaW9uLCBhbmQgbW9kdWx1cyBvZiBUaW1lcyBieSBpbnRlZ2VycyBhcmUKKy8vIGltcGxlbWVudGVkIGFzIGludGVycHJldGluZyB0aGUgYXJndW1lbnQgYXMgbmFub3NlY29uZHMuIE1vZHVsdXMgdGFrZXMgdGhlCisvLyBzaWduIGZyb20gdGhlIGZpcnN0IG9wZXJhbmQuCitzdHJ1Y3QgVGltZSB7CisjaWZkZWYgU1dJRworLy8gQWxsIG9mIHRoZSB1c2VzIG9mIGNvbnN0ZXhwciBoZXJlIGNhbiBzYWZlbHkgYmUgc2ltcGx5IHJlbW92ZWQuCisvLyBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IGNvbnN0ZXhwciBpbXBsaWNpdGx5IG1ha2VzCisvLyBtZW1iZXIgZnVuY3Rpb25zIGNvbnN0IGlzIG5vdCB2YWxpZCwgc28gdGhleSBhbGwgaGF2ZSB0byBiZSBleHBsaWNpdGx5IG1hcmtlZAorLy8gY29uc3QuCisjZGVmaW5lIGNvbnN0ZXhwcgorI2VuZGlmICAvLyBTV0lHCisgcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTlNlY0luU2VjID0gMTAwMDAwMDAwMDsKKyAgc3RhdGljIGNvbnN0IGludDMyX3Qga05TZWNJbk1TZWMgPSAxMDAwMDAwOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTlNlY0luVVNlYyA9IDEwMDA7CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtNU2VjSW5TZWMgPSAxMDAwOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBrVVNlY0luU2VjID0gMTAwMDAwMDsKKyAgY29uc3RleHByIFRpbWUoaW50MzJfdCBzZWMgPSAwLCBpbnQzMl90IG5zZWMgPSAwKQorICAgICAgOiBzZWNfKHNlYyksIG5zZWNfKENoZWNrQ29uc3RleHByKG5zZWMpKSB7CisgIH0KKyAgI2lmbmRlZiBTV0lHCisgIGV4cGxpY2l0IGNvbnN0ZXhwciBUaW1lKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdmFsdWUpCisgICAgICA6IHNlY18odmFsdWUudHZfc2VjKSwgbnNlY18oQ2hlY2tDb25zdGV4cHIodmFsdWUudHZfbnNlYykpIHsKKyAgfQorICBzdHJ1Y3QgdGltZXNwZWMgVG9UaW1lc3BlYygpIGNvbnN0IHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgYW5zOworICAgIGFucy50dl9zZWMgPSBzZWNfOworICAgIGFucy50dl9uc2VjID0gbnNlY187CisgICAgcmV0dXJuIGFuczsKKyAgfQorICBleHBsaWNpdCBjb25zdGV4cHIgVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCAmdmFsdWUpCisgICAgICA6IHNlY18odmFsdWUudHZfc2VjKSwgbnNlY18oQ2hlY2tDb25zdGV4cHIodmFsdWUudHZfdXNlYyAqIGtOU2VjSW5VU2VjKSkgeworICB9CisgIHN0cnVjdCB0aW1ldmFsIFRvVGltZXZhbCgpIGNvbnN0IHsKKyAgICBzdHJ1Y3QgdGltZXZhbCBhbnM7CisgICAgYW5zLnR2X3NlYyA9IHNlY187CisgICAgYW5zLnR2X3VzZWMgPSBuc2VjXyAvIGtOU2VjSW5VU2VjOworICAgIHJldHVybiBhbnM7CisgIH0KKyAgI2VuZGlmICAvLyBTV0lHCisKKyAgLy8gQ0xPQ0tfTU9OT1RPTklDIG9uIGxpbnV4IGFuZCBDTE9DS19SRUFMVElNRSBvbiB0aGUgY1JJTyBiZWNhdXNlIHRoZQorICAvLyBjUklPIGRvZXNuJ3QgaGF2ZSBhbnkgb3RoZXJzLgorICAvLyBDTE9DS19SRUFMVElNRSBpcyB0aGUgZGVmYXVsdCByZWFsdGltZSBjbG9jayBhbmQgQ0xPQ0tfTU9OT1RPTklDIGRvZXNuJ3QKKyAgLy8gY2hhbmdlIHdoZW4gc29tZWJvZHkgY2hhbmdlcyB0aGUgd2FsbCBjbG9jayAobGlrZSB0aGUgbnRwIGRlYW1vbiBvcgorICAvLyB3aGF0ZXZlcikuIFNlZSBjbG9ja19nZXR0aW1lKDIpIGZvciBkZXRhaWxzLgorICAvLworICAvLyBUaGlzIGlzIHRoZSBjbG9jayB0aGF0IGNvZGUgdGhhdCBqdXN0IHdhbnRzIHRvIHNsZWVwIGZvciBhIGNlcnRhaW4gYW1vdW50CisgIC8vIG9mIHRpbWUgb3IgbWVhc3VyZSBob3cgbG9uZyBzb21ldGhpbmcgdGFrZXMgc2hvdWxkIHVzZS4KKyAgI2lmbmRlZiBfX1ZYV09SS1NfXworICBzdGF0aWMgY29uc3QgY2xvY2tpZF90IGtEZWZhdWx0Q2xvY2sgPSBDTE9DS19NT05PVE9OSUM7CisgICNlbHNlCisgIHN0YXRpYyBjb25zdCBjbG9ja2lkX3Qga0RlZmF1bHRDbG9jayA9IENMT0NLX1JFQUxUSU1FOworICAjZW5kaWYKKyAgLy8gQ3JlYXRlcyBhIFRpbWUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY2xvY2sgb3IKKyAgLy8gZGllcy4KKyAgc3RhdGljIFRpbWUgTm93KGNsb2NraWRfdCBjbG9jayA9IGtEZWZhdWx0Q2xvY2spOworCisgIC8vIENvbnN0cnVjdHMgYSBUaW1lIHJlcHJlc2VudGluZyBzZWNvbmRzLgorICBzdGF0aWMgY29uc3RleHByIFRpbWUgSW5TZWNvbmRzKGRvdWJsZSBzZWNvbmRzKSB7CisgICAgcmV0dXJuIChzZWNvbmRzIDwgMC4wKSA/CisgICAgICAgIFRpbWUoc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2Vjb25kcykgLSAxLAorICAgICAgICAgICAgIChzZWNvbmRzIC0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2Vjb25kcykgKyAxLjApICoga05TZWNJblNlYykgOgorICAgICAgICBUaW1lKHN0YXRpY19jYXN0PGludDMyX3Q+KHNlY29uZHMpLAorICAgICAgICAgICAgIChzZWNvbmRzIC0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2Vjb25kcykpICoga05TZWNJblNlYyk7CisgIH0KKworICAvLyBDb25zdHJ1Y3RzIGEgdGltZSByZXByZXNlbnRpbmcgbWljcm9zZWNvbmRzLgorICBzdGF0aWMgY29uc3RleHByIFRpbWUgSW5OUyhpbnQ2NF90IG5zZWNvbmRzKSB7CisgICAgcmV0dXJuIChuc2Vjb25kcyA8IDApID8KKyAgICAgICAgVGltZShuc2Vjb25kcyAvIHN0YXRpY19jYXN0PGludDY0X3Q+KGtOU2VjSW5TZWMpIC0gMSwKKyAgICAgICAgICAgICAobnNlY29uZHMgJSBrTlNlY0luU2VjKSArIGtOU2VjSW5TZWMpIDoKKyAgICAgICAgVGltZShuc2Vjb25kcyAvIHN0YXRpY19jYXN0PGludDY0X3Q+KGtOU2VjSW5TZWMpLAorICAgICAgICAgICAgIG5zZWNvbmRzICUga05TZWNJblNlYyk7CisgIH0KKworICAvLyBDb25zdHJ1Y3RzIGEgdGltZSByZXByZXNlbnRpbmcgbWljcm9zZWNvbmRzLgorICBzdGF0aWMgY29uc3RleHByIFRpbWUgSW5VUyhpbnQgdXNlY29uZHMpIHsKKyAgICByZXR1cm4gKHVzZWNvbmRzIDwgMCkgPworICAgICAgICBUaW1lKHVzZWNvbmRzIC8ga1VTZWNJblNlYyAtIDEsCisgICAgICAgICAgICAgKHVzZWNvbmRzICUga1VTZWNJblNlYykgKiBrTlNlY0luVVNlYyArIGtOU2VjSW5TZWMpIDoKKyAgICAgIFRpbWUodXNlY29uZHMgLyBrVVNlY0luU2VjLCAodXNlY29uZHMgJSBrVVNlY0luU2VjKSAqIGtOU2VjSW5VU2VjKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdHMgYSB0aW1lIHJlcHJlc2VudGluZyBtc2Vjb25kcy4KKyAgc3RhdGljIGNvbnN0ZXhwciBUaW1lIEluTVMoaW50IG1zZWNvbmRzKSB7CisgICAgcmV0dXJuIChtc2Vjb25kcyA8IDApID8KKyAgICAgICAgVGltZShtc2Vjb25kcyAvIGtNU2VjSW5TZWMgLSAxLAorICAgICAgICAgICAgIChtc2Vjb25kcyAlIGtNU2VjSW5TZWMpICoga05TZWNJbk1TZWMgKyBrTlNlY0luU2VjKSA6CisgICAgICAgIFRpbWUobXNlY29uZHMgLyBrTVNlY0luU2VjLCAobXNlY29uZHMgJSBrTVNlY0luU2VjKSAqIGtOU2VjSW5NU2VjKTsKKyAgfQorCisgIC8vIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHRpbWUgaXMgd2l0aGluIGFtb3VudCBuYW5vc2Vjb25kcyBvZiBvdGhlci4KKyAgYm9vbCBJc1dpdGhpbihjb25zdCBUaW1lICZvdGhlciwgaW50NjRfdCBhbW91bnQpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHRpbWUgcmVwcmVzZW50ZWQgYWxsIGluIG5hbm9zZWNvbmRzLgorICBpbnQ2NF90IGNvbnN0ZXhwciBUb05TZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KHNlY18pICogc3RhdGljX2Nhc3Q8aW50NjRfdD4oa05TZWNJblNlYykgKworICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pihuc2VjXyk7CisgIH0KKyNpZmRlZiBfX1ZYV09SS1NfXworICAvLyBSZXR1cm5zIHRoZSB0aW1lIHJlcHJlc2VudGVkIGFsbCBpbiBzeXN0ZW0gY2xvY2sgdGlja3MuIFRoZSBzeXN0ZW0gY2xvY2sKKyAgLy8gcmF0ZSBpcyByZXRyaWV2ZWQgdXNpbmcgc3lzQ2xrUmF0ZUdldCgpLgorICBpbnQgVG9UaWNrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVG9OU2VjKCkgLyBzdGF0aWNfY2FzdDxpbnQ2NF90PihrTlNlY0luU2VjIC8gc3lzQ2xrUmF0ZUdldCgpKTsKKyAgfQorICAvLyBDb25zdHJ1Y3RzIGEgVGltZSByZXByZXNlbnRpbmcgdGlja3MuCisgIHN0YXRpYyBUaW1lIEluVGlja3MoaW50IHRpY2tzKSB7CisgICAgcmV0dXJuIFRpbWU6OkluU2Vjb25kcyhzdGF0aWNfY2FzdDxkb3VibGU+KHRpY2tzKSAvIHN5c0Nsa1JhdGVHZXQoKSk7CisgIH0KKyNlbmRpZgorCisgIC8vIFJldHVybnMgdGhlIHRpbWUgcmVwcmVzZW50ZWQgaW4gbWlsbGlzZWNvbmRzLgorICBpbnQ2NF90IGNvbnN0ZXhwciBUb01TZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KHNlY18pICogc3RhdGljX2Nhc3Q8aW50NjRfdD4oa01TZWNJblNlYykgKworICAgICAgICAoc3RhdGljX2Nhc3Q8aW50NjRfdD4obnNlY18pIC8gc3RhdGljX2Nhc3Q8aW50NjRfdD4oa05TZWNJbk1TZWMpKTsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHRpbWUgcmVwcmVzZW50IGluIG1pY3Jvc2Vjb25kcy4KKyAgaW50NjRfdCBjb25zdGV4cHIgVG9VU2VjKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90PihzZWNfKSAqIHN0YXRpY19jYXN0PGludDY0X3Q+KGtVU2VjSW5TZWMpICsKKyAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KG5zZWNfKSAvIHN0YXRpY19jYXN0PGludDY0X3Q+KGtOU2VjSW5VU2VjKSk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSB0aW1lIHJlcHJlc2VudGVkIGluIGZyYWN0aW9uYWwgc2Vjb25kcy4KKyAgZG91YmxlIGNvbnN0ZXhwciBUb1NlY29uZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oc2VjXykgKyBzdGF0aWNfY2FzdDxkb3VibGU+KG5zZWNfKSAvIGtOU2VjSW5TZWM7CisgIH0KKworICAjaWZuZGVmIFNXSUcKKyAgVGltZSAmb3BlcmF0b3IrPShjb25zdCBUaW1lICZyaHMpOworICBUaW1lICZvcGVyYXRvci09KGNvbnN0IFRpbWUgJnJocyk7CisgIFRpbWUgJm9wZXJhdG9yKj0oaW50MzJfdCByaHMpOworICBUaW1lICZvcGVyYXRvci89KGludDMyX3QgcmhzKTsKKyAgVGltZSAmb3BlcmF0b3IlPShpbnQzMl90IHJocyk7CisgIFRpbWUgJm9wZXJhdG9yJT0oZG91YmxlIHJocykgPSBkZWxldGU7CisgIFRpbWUgJm9wZXJhdG9yKj0oZG91YmxlIHJocykgPSBkZWxldGU7CisgIFRpbWUgJm9wZXJhdG9yLz0oZG91YmxlIHJocykgPSBkZWxldGU7CisgIGNvbnN0IFRpbWUgb3BlcmF0b3IqKGRvdWJsZSByaHMpIGNvbnN0ID0gZGVsZXRlOworICBjb25zdCBUaW1lIG9wZXJhdG9yLyhkb3VibGUgcmhzKSBjb25zdCA9IGRlbGV0ZTsKKyAgY29uc3QgVGltZSBvcGVyYXRvciUoZG91YmxlIHJocykgY29uc3QgPSBkZWxldGU7CisgICNlbmRpZgorICBjb25zdCBUaW1lIG9wZXJhdG9yKyhjb25zdCBUaW1lICZyaHMpIGNvbnN0OworICBjb25zdCBUaW1lIG9wZXJhdG9yLShjb25zdCBUaW1lICZyaHMpIGNvbnN0OworICBjb25zdCBUaW1lIG9wZXJhdG9yKihpbnQzMl90IHJocykgY29uc3Q7CisgIGNvbnN0IFRpbWUgb3BlcmF0b3IvKGludDMyX3QgcmhzKSBjb25zdDsKKyAgZG91YmxlIG9wZXJhdG9yLyhjb25zdCBUaW1lICZyaHMpIGNvbnN0OworICBjb25zdCBUaW1lIG9wZXJhdG9yJShpbnQzMl90IHJocykgY29uc3Q7CisKKyAgY29uc3QgVGltZSBvcGVyYXRvci0oKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVGltZSAmcmhzKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRpbWUgJnJocykgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFRpbWUgJnJocykgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFRpbWUgJnJocykgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBUaW1lICZyaHMpIGNvbnN0OworICBib29sIG9wZXJhdG9yPj0oY29uc3QgVGltZSAmcmhzKSBjb25zdDsKKworICAjaWZuZGVmIFNXSUcKKyAgLy8gRm9yIGd0ZXN0IGV0Yy4KKyAgZnJpZW5kIHN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBUaW1lICZ0aW1lKTsKKyAgI2VuZGlmICAvLyBTV0lHCisKKyAgaW50MzJfdCBjb25zdGV4cHIgc2VjKCkgY29uc3QgeyByZXR1cm4gc2VjXzsgfQorICB2b2lkIHNldF9zZWMoaW50MzJfdCBzZWMpIHsgc2VjXyA9IHNlYzsgfQorICBpbnQzMl90IGNvbnN0ZXhwciBuc2VjKCkgY29uc3QgeyByZXR1cm4gbnNlY187IH0KKyAgdm9pZCBzZXRfbnNlYyhpbnQzMl90IG5zZWMpIHsKKyAgICBuc2VjXyA9IG5zZWM7CisgICAgQ2hlY2soKTsKKyAgfQorCisgIC8vIEFic29sdXRlIHZhbHVlLgorICBUaW1lIGFicygpIGNvbnN0IHsKKyAgICBpZiAoKnRoaXMgPiBUaW1lKDAsIDApKSByZXR1cm4gKnRoaXM7CisgICAgaWYgKG5zZWNfID09IDApIHJldHVybiBUaW1lKC1zZWNfLCAwKTsKKyAgICByZXR1cm4gVGltZSgtc2VjXyAtIDEsIGtOU2VjSW5TZWMgLSBuc2VjXyk7CisgIH0KKworICAvLyBFbmFibGVzIHJldHVybmluZyB0aGUgbW9jayB0aW1lIHZhbHVlIGZvciBOb3cgaW5zdGVhZCBvZiBjaGVja2luZyB0aGUKKyAgLy8gc3lzdGVtIGNsb2NrLgorICBzdGF0aWMgdm9pZCBFbmFibGVNb2NrVGltZShjb25zdCBUaW1lICZub3cgPSBOb3coKSk7CisgIC8vIENhbGxzIFNldE1vY2tUaW1lIHdpdGggdGhlIGN1cnJlbnQgYWN0dWFsIHRpbWUuCisgIHN0YXRpYyB2b2lkIFVwZGF0ZU1vY2tUaW1lKCk7CisgIC8vIFNldHMgbm93IHdoZW4gdGltZSBpcyBiZWluZyBtb2NrZWQuCisgIHN0YXRpYyB2b2lkIFNldE1vY2tUaW1lKGNvbnN0IFRpbWUgJm5vdyk7CisgIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGp1c3QgaW5jcmVtZW50IHRoZSBtb2NrIHRpbWUgYnkgYSBjZXJ0YWluIGFtb3VudCBpbgorICAvLyBhIHRocmVhZCBzYWZlIHdheS4KKyAgc3RhdGljIHZvaWQgSW5jcmVtZW50TW9ja1RpbWUoY29uc3QgVGltZSAmYW1vdW50KTsKKyAgLy8gRGlzYWJsZXMgbW9ja2luZyB0aW1lLgorICBzdGF0aWMgdm9pZCBEaXNhYmxlTW9ja1RpbWUoKTsKKworIHByaXZhdGU6CisgIGludDMyX3Qgc2VjXywgbnNlY187CisKKyAgLy8gTE9HKEZBVEFMKXMgaWYgbnNlYyBpcyA+PSBrTlNlY0luU2VjIG9yIG5lZ2F0aXZlLgorICBzdGF0aWMgdm9pZCBDaGVja0ltcGwoaW50MzJfdCBuc2VjKTsKKyAgdm9pZCBDaGVjaygpIHsgQ2hlY2tJbXBsKG5zZWNfKTsgfQorICAvLyBBIGNvbnN0ZXhwciB2ZXJzaW9uIG9mIENoZWNrSW1wbCB0aGF0IHJldHVybnMgdGhlIGdpdmVuIHZhbHVlIHdoZW4gaXQKKyAgLy8gc3VjY2VlZHMgb3IgZXZhbHVhdGVzIHRvIG5vbi1jb25zdGV4cHIgYW5kIHJldHVybnMgMCB3aGVuIGl0IGZhaWxzLgorICAvLyBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSB1c3VhbCBMT0coRkFUQUwpIGlmIHRoaXMgaXMgdXNlZCB3aGVyZSBpdCBpc24ndAorICAvLyByZXF1aXJlZCB0byBiZSBjb25zdGV4cHIgb3IgYSBjb21waWxlIGVycm9yIGlmIGl0IGlzLgorICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ2hlY2tDb25zdGV4cHIoaW50MzJfdCBuc2VjKSB7CisgICAgcmV0dXJuIChuc2VjID49IGtOU2VjSW5TZWMgfHwgbnNlYyA8IDApID8gQ2hlY2tJbXBsKG5zZWMpLCAwIDogbnNlYzsKKyAgfQorCisjaWZkZWYgU1dJRworI3VuZGVmIGNvbnN0ZXhwcgorI2VuZGlmICAvLyBTV0lHCit9OworCisvLyBTbGVlcHMgZm9yIHRoZSBhbW91bnQgb2YgdGltZSByZXByZXNlbnRlZCBieSB0aW1lIGNvdW50ZWQgYnkgY2xvY2suCit2b2lkIFNsZWVwRm9yKGNvbnN0IFRpbWUgJnRpbWUsIGNsb2NraWRfdCBjbG9jayA9IFRpbWU6OmtEZWZhdWx0Q2xvY2spOworLy8gU2xlZXBzIHVudGlsIGNsb2NrIGlzIGF0IHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IHRpbWUuCit2b2lkIFNsZWVwVW50aWwoY29uc3QgVGltZSAmdGltZSwgY2xvY2tpZF90IGNsb2NrID0gVGltZTo6a0RlZmF1bHRDbG9jayk7CisKKy8vIFNldHMgdGhlIGdsb2JhbCBvZmZzZXQgZm9yIGFsbCB0aW1lcyBzbyA6OmFvczo6dGltZTo6VGltZTo6Tm93KCkgd2lsbCByZXR1cm4KKy8vIG5vdy4KKy8vIFRoZXJlIGlzIG5vIHN5bmNocm9uaXphdGlvbiBoZXJlLCBzbyB0aGlzIGlzIG9ubHkgc2FmZSB3aGVuIG9ubHkgYSBzaW5nbGUKKy8vIHRhc2sgaXMgcnVubmluZy4KKy8vIFRoaXMgaXMgb25seSBhbGxvd2VkIHdoZW4gdGhlIHNoYXJlZCBtZW1vcnkgY29yZSBpbmZyYXN0cnVjdHVyZSBoYXMgYmVlbgorLy8gaW5pdGlhbGl6ZWQgaW4gdGhpcyBwcm9jZXNzLgordm9pZCBPZmZzZXRUb05vdyhjb25zdCBUaW1lICZub3cpOworCisvLyBSQUlJIGNsYXNzIHRoYXQgZnJlZXplcyBUaW1lOjpOb3coKSAodG8gYXZvaWQgbWFraW5nIGxhcmdlIG51bWJlcnMgb2YKKy8vIHN5c2NhbGxzIHRvIGZpbmQgdGhlIHJlYWwgdGltZSkuCitjbGFzcyBUaW1lRnJlZXplciB7CisgcHVibGljOgorICBUaW1lRnJlZXplcigpIHsKKyAgICBUaW1lOjpFbmFibGVNb2NrVGltZSgpOworICB9CisgIH5UaW1lRnJlZXplcigpIHsKKyAgICBUaW1lOjpEaXNhYmxlTW9ja1RpbWUoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRpbWVGcmVlemVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0aW1lCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9USU1FX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3RpbWVfdGVzdC5jYyBiL2Fvcy9jb21tb24vdGltZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGRkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3RpbWVfdGVzdC5jYwpAQCAtMCwwICsxLDIzMyBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL2RlYXRoX3Rlc3RfbG9nX2ltcGxlbWVudGF0aW9uLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHRpbWUgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitURVNUKFRpbWVUZXN0LCB0aW1lc3BlY0NvbnZlcnNpb25zKSB7CisgIHRpbWVzcGVjIHN0YXJ0ezEyMzQsIDU2Nzh9OyAgLy8gTk9MSU5UCisgIFRpbWUgdGltZShzdGFydCk7CisgIEVYUEVDVF9FUShzdGFydC50dl9zZWMsIHN0YXRpY19jYXN0PHRpbWVfdD4odGltZS5zZWMoKSkpOworICBFWFBFQ1RfRVEoc3RhcnQudHZfbnNlYywgdGltZS5uc2VjKCkpOworICB0aW1lc3BlYyBlbmQgPSB0aW1lLlRvVGltZXNwZWMoKTsKKyAgRVhQRUNUX0VRKHN0YXJ0LnR2X3NlYywgZW5kLnR2X3NlYyk7CisgIEVYUEVDVF9FUShzdGFydC50dl9uc2VjLCBlbmQudHZfbnNlYyk7Cit9CisKK1RFU1QoVGltZVRlc3QsIHRpbWV2YWxDb252ZXJzaW9ucykgeworICB0aW1ldmFsIHN0YXJ0ezEyMzQsIDU2Nzh9OyAgLy8gTk9MSU5UCisgIFRpbWUgdGltZShzdGFydCk7CisgIEVYUEVDVF9FUShzdGFydC50dl9zZWMsIHN0YXRpY19jYXN0PGxvbmc+KHRpbWUuc2VjKCkpKTsKKyAgRVhQRUNUX0VRKHN0YXJ0LnR2X3VzZWMsIHRpbWUubnNlYygpIC8gVGltZTo6a05TZWNJblVTZWMpOworICB0aW1ldmFsIGVuZCA9IHRpbWUuVG9UaW1ldmFsKCk7CisgIEVYUEVDVF9FUShzdGFydC50dl9zZWMsIGVuZC50dl9zZWMpOworICBFWFBFQ1RfRVEoc3RhcnQudHZfdXNlYywgZW5kLnR2X3VzZWMpOworfQorCitURVNUKFRpbWVEZWF0aFRlc3QsIENvbnN0cnVjdG9yQ2hlY2tpbmcpIHsKKyAgbG9nZ2luZzo6SW5pdCgpOworICBFWFBFQ1RfREVBVEgoCisgICAgICB7CisgICAgICAgIGxvZ2dpbmc6OkFkZEltcGxlbWVudGF0aW9uKG5ldyB1dGlsOjpEZWF0aFRlc3RMb2dJbXBsZW1lbnRhdGlvbigpKTsKKyAgICAgICAgVGltZSgwLCAtMSk7CisgICAgICB9LAorICAgICAgIi4qMCA8PSBuc2VjXFwoLTFcXCkgPCAxMCsgLioiKTsKKyAgRVhQRUNUX0RFQVRIKAorICAgICAgeworICAgICAgICBsb2dnaW5nOjpBZGRJbXBsZW1lbnRhdGlvbihuZXcgdXRpbDo6RGVhdGhUZXN0TG9nSW1wbGVtZW50YXRpb24oKSk7CisgICAgICAgIFRpbWUoMCwgVGltZTo6a05TZWNJblNlYyk7CisgICAgICB9LAorICAgICAgIi4qMCA8PSBuc2VjXFwoMTArXFwpIDwgMTArIC4qIik7Cit9CisKKy8vIEl0J3Mga2luZCBvZiBoYXJkIG5vdCB0byB0ZXN0IE5vdyBhbmQgU2xlZXBGb3IgYXQgdGhlIHNhbWUgdGltZS4KK1RFU1QoVGltZVRlc3QsIE5vd0FuZFNsZWVwRm9yKSB7CisgIC8vIHdpdGhvdXQgdGhpcywgaXQgdGVuZHMgdG8gZmFpbCB0aGUgZmlyc3QgdGltZSAoZW5kcyB1cCBzbGVlcGluZyBmb3Igd2F5CisgIC8vIGxvbmdlciB0aGFuIGl0IHNob3VsZCB0aGUgc2Vjb25kIHRpbWUsIHdoZXJlIGl0IGFjdHVhbGx5IG1hdHRlcnMpCisgIFNsZWVwRm9yKFRpbWUoMCwgVGltZTo6a05TZWNJblNlYyAvIDEwKSk7CisgIFRpbWUgc3RhcnQgPSBUaW1lOjpOb3coKTsKKyAgc3RhdGljIGNvbnN0ZXhwciBUaW1lIGtTbGVlcFRpbWUgPSBUaW1lKDAsIFRpbWU6OmtOU2VjSW5TZWMgKiAyIC8gMTApOworICBTbGVlcEZvcihrU2xlZXBUaW1lKTsKKyAgVGltZSBkaWZmZXJlbmNlID0gVGltZTo6Tm93KCkgLSBzdGFydDsKKyAgRVhQRUNUX0dFKGRpZmZlcmVuY2UsIGtTbGVlcFRpbWUpOworICBFWFBFQ1RfTFQoZGlmZmVyZW5jZSwga1NsZWVwVGltZSArIFRpbWUoMCwgVGltZTo6a05TZWNJblNlYyAvIDEwMCkpOworfQorCitURVNUKFRpbWVUZXN0LCBBYnNvbHV0ZVNsZWVwKSB7CisgIFRpbWUgc3RhcnQgPSBUaW1lOjpOb3coKTsKKyAgU2xlZXBGb3IoVGltZSgwLCBUaW1lOjprTlNlY0luU2VjIC8gMTApKTsKKyAgc3RhdGljIGNvbnN0ZXhwciBUaW1lIGtTbGVlcFRpbWUgPSBUaW1lKDAsIFRpbWU6OmtOU2VjSW5TZWMgKiAyIC8gMTApOworICBTbGVlcFVudGlsKHN0YXJ0ICsga1NsZWVwVGltZSk7CisgIFRpbWUgZGlmZmVyZW5jZSA9IFRpbWU6Ok5vdygpIC0gc3RhcnQ7CisgIEVYUEVDVF9HRShkaWZmZXJlbmNlLCBrU2xlZXBUaW1lKTsKKyAgRVhQRUNUX0xUKGRpZmZlcmVuY2UsIGtTbGVlcFRpbWUgKyBUaW1lKDAsIFRpbWU6OmtOU2VjSW5TZWMgLyAxMDApKTsKK30KKworVEVTVChUaW1lVGVzdCwgQWRkaXRpb24pIHsKKyAgVGltZSB0KDU0LCA1MDApOworICBFWFBFQ1RfRVEoTUFDUk9fREFSRyhUaW1lKDU0LCA1NTAwKSksIHQgKyBNQUNST19EQVJHKFRpbWUoMCwgNTAwMCkpKTsKKyAgRVhQRUNUX0VRKE1BQ1JPX0RBUkcoVGltZSg1NiwgNTAwKSksIHQgKyBNQUNST19EQVJHKFRpbWUoMiwgMCkpKTsKKyAgRVhQRUNUX0VRKE1BQ1JPX0RBUkcoVGltZSg1NywgNjUwMCkpLCB0ICsgTUFDUk9fREFSRyhUaW1lKDMsIDYwMDApKSk7CisgIEVYUEVDVF9FUShNQUNST19EQVJHKFRpbWUoNTAsIDMwMCkpLAorICAgICAgICAgICAgdCArIE1BQ1JPX0RBUkcoVGltZSgtNSwgVGltZTo6a05TZWNJblNlYyAtIDIwMCkpKTsKKyAgRVhQRUNUX0VRKFRpbWUoLTQ2LCA1MDApLCB0ICsgVGltZSgtMTAwLCAwKSk7CisgIEVYUEVDVF9FUShUaW1lKC00NywgVGltZTo6a05TZWNJblNlYyAtIDUwMCksCisgICAgICAgICAgICBUaW1lKC0xMDEsIFRpbWU6OmtOU2VjSW5TZWMgLSAxMDAwKSArIHQpOworfQorVEVTVChUaW1lVGVzdCwgU3VidHJhY3Rpb24pIHsKKyAgVGltZSB0KDU0LCA1MDApOworICBFWFBFQ1RfRVEoTUFDUk9fREFSRyhUaW1lKDU0LCAzMDApKSwgdCAtIE1BQ1JPX0RBUkcoVGltZSgwLCAyMDApKSk7CisgIEVYUEVDVF9FUShNQUNST19EQVJHKFRpbWUoNDIsIDUwMCkpLCB0IC0gTUFDUk9fREFSRyhUaW1lKDEyLCAwKSkpOworICBFWFBFQ1RfRVEoTUFDUk9fREFSRyhUaW1lKDUwLCAxMDApKSwgdCAtIE1BQ1JPX0RBUkcoVGltZSg0LCA0MDApKSk7CisgIEVYUEVDVF9FUShNQUNST19EQVJHKFRpbWUoNTMsIDYwMCkpLAorICAgICAgICAgICAgdCAtIE1BQ1JPX0RBUkcoVGltZSgwLCBUaW1lOjprTlNlY0luU2VjIC0gMTAwKSkpOworICBFWFBFQ1RfRVEoTUFDUk9fREFSRyhUaW1lKDU1LCA4MDApKSwKKyAgICAgICAgICAgIHQgLSBNQUNST19EQVJHKFRpbWUoLTIsIFRpbWU6OmtOU2VjSW5TZWMgLSAzMDApKSk7CisgIEVYUEVDVF9FUShUaW1lKDU0LCA1NTAwKSwgdCAtIFRpbWUoLTEsIFRpbWU6OmtOU2VjSW5TZWMgLSA1MDAwKSk7CisgIEVYUEVDVF9FUShUaW1lKC01MCwgVGltZTo6a05TZWNJblNlYyAtIDMwMCksCisgICAgICAgICAgICBUaW1lKDUsIDIwMCkgLSB0KTsKK30KKworVEVTVChUaW1lVGVzdCwgTXVsdGlwbGljYXRpb24pIHsKKyAgVGltZSB0KDU0LCBUaW1lOjprTlNlY0luU2VjIC8gMyk7CisgIEVYUEVDVF9FUShNQUNST19EQVJHKFRpbWUoMTA4LCBUaW1lOjprTlNlY0luU2VjIC8gMyAqIDIpKSwgdCAqIDIpOworICBFWFBFQ1RfRVEoTUFDUk9fREFSRyhUaW1lKDI3MSwgVGltZTo6a05TZWNJblNlYyAvIDMgKiAyIC0gMSkpLCB0ICogNSk7CisgIEVYUEVDVF9FUShUaW1lKC0xMDksIFRpbWU6OmtOU2VjSW5TZWMgLyAzICsgMSksIHQgKiAtMik7CisgIEVYUEVDVF9FUShUaW1lKC01NSwgVGltZTo6a05TZWNJblNlYyAvIDMgKiAyICsgMSksIHQgKiAtMSk7CisgIEVYUEVDVF9FUShUaW1lKC0yMTgsIFRpbWU6OmtOU2VjSW5TZWMgLyAzICogMiArIDIpLCAodCAqIC0xKSAqIDQpOworfQorVEVTVChUaW1lVGVzdCwgRGl2aXNpb25CeUludCkgeworICBFWFBFQ1RfRVEoVGltZSg1LCBUaW1lOjprTlNlY0luU2VjIC8gMTAgKiA0ICsgNTApLCBUaW1lKDU0LCA1MDApIC8gMTApOworICBFWFBFQ1RfRVEoVGltZSgyLCBUaW1lOjprTlNlY0luU2VjIC8gNCAqIDMpLAorICAgICAgICAgICAgVGltZSg1LCBUaW1lOjprTlNlY0luU2VjIC8gMikgLyAyKTsKKyAgRVhQRUNUX0VRKFRpbWUoLTMsIFRpbWU6OmtOU2VjSW5TZWMgLyA0ICogMyksCisgICAgICAgICAgICBUaW1lKC01LCBUaW1lOjprTlNlY0luU2VjIC8gMikgLyAyKTsKK30KK1RFU1QoVGltZVRlc3QsIERpdmlzaW9uQnlUaW1lKSB7CisgIEVYUEVDVF9ET1VCTEVfRVEoMiwgVGltZSgxMCwgMCkgLyBUaW1lKDUsIDApKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSg5LCBUaW1lKDI3LCAwKSAvIFRpbWUoMywgMCkpOworICBFWFBFQ1RfRE9VQkxFX0VRKDkuMjUsIFRpbWUoMzcsIDApIC8gVGltZSg0LCAwKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoNS4yNSwgVGltZSgzNiwgVGltZTo6a05TZWNJblNlYyAvIDQgKiAzKSAvIFRpbWUoNywgMCkpOworICBFWFBFQ1RfRE9VQkxFX0VRKC01LjI1LCBUaW1lKC0zNywgVGltZTo6a05TZWNJblNlYyAvIDQpIC8gVGltZSg3LCAwKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLTUuMjUsIFRpbWUoMzYsIFRpbWU6OmtOU2VjSW5TZWMgLyA0ICogMykgLyBUaW1lKC03LCAwKSk7Cit9CisKK1RFU1QoVGltZVRlc3QsIE5lZ2F0aW9uKSB7CisgIEVYUEVDVF9FUShUaW1lKC01LCAxMjM0KSwgLVRpbWUoNCwgVGltZTo6a05TZWNJblNlYyAtIDEyMzQpKTsKKyAgRVhQRUNUX0VRKFRpbWUoNSwgVGltZTo6a05TZWNJblNlYyAqIDIgLyAzICsgMSksCisgICAgICAgICAgICAtVGltZSgtNiwgVGltZTo6a05TZWNJblNlYyAvIDMpKTsKK30KKworVEVTVChUaW1lVGVzdCwgQ29tcGFyaXNvbnMpIHsKKyAgRVhQRUNUX1RSVUUoVGltZSg5NzEsIDI1NCkgPiBUaW1lKDk3MSwgMjUzKSk7CisgIEVYUEVDVF9UUlVFKFRpbWUoOTcxLCAyNTQpID49IFRpbWUoOTcxLCAyNTMpKTsKKyAgRVhQRUNUX1RSVUUoVGltZSg5NzEsIDI1NCkgPCBUaW1lKDk3MSwgMjU1KSk7CisgIEVYUEVDVF9UUlVFKFRpbWUoOTcxLCAyNTQpIDw9IFRpbWUoOTcxLCAyNTUpKTsKKyAgRVhQRUNUX1RSVUUoVGltZSg5NzEsIDI1NCkgPj0gVGltZSg5NzEsIDI1MykpOworICBFWFBFQ1RfVFJVRShUaW1lKDk3MSwgMjU0KSA8PSBUaW1lKDk3MSwgMjU0KSk7CisgIEVYUEVDVF9UUlVFKFRpbWUoOTcxLCAyNTQpID49IFRpbWUoOTcxLCAyNTQpKTsKKyAgRVhQRUNUX1RSVUUoVGltZSg5NzIsIDI1NCkgPiBUaW1lKDk3MSwgMjU0KSk7CisgIEVYUEVDVF9UUlVFKFRpbWUoOTcxLCAyNTQpIDwgVGltZSg5NzIsIDI1NCkpOworCisgIEVYUEVDVF9UUlVFKFRpbWUoLTk3MSwgMjU0KSA+IFRpbWUoLTk3MSwgMjUzKSk7CisgIEVYUEVDVF9UUlVFKFRpbWUoLTk3MSwgMjU0KSA+PSBUaW1lKC05NzEsIDI1MykpOworICBFWFBFQ1RfVFJVRShUaW1lKC05NzEsIDI1NCkgPCBUaW1lKC05NzEsIDI1NSkpOworICBFWFBFQ1RfVFJVRShUaW1lKC05NzEsIDI1NCkgPD0gVGltZSgtOTcxLCAyNTUpKTsKKyAgRVhQRUNUX1RSVUUoVGltZSgtOTcxLCAyNTQpID49IFRpbWUoLTk3MSwgMjUzKSk7CisgIEVYUEVDVF9UUlVFKFRpbWUoLTk3MSwgMjU0KSA8PSBUaW1lKC05NzEsIDI1NCkpOworICBFWFBFQ1RfVFJVRShUaW1lKC05NzEsIDI1NCkgPj0gVGltZSgtOTcxLCAyNTQpKTsKKyAgRVhQRUNUX1RSVUUoVGltZSgtOTcyLCAyNTQpIDwgVGltZSgtOTcxLCAyNTQpKTsKKyAgRVhQRUNUX1RSVUUoVGltZSgtOTcxLCAyNTQpID4gVGltZSgtOTcyLCAyNTQpKTsKK30KKworVEVTVChUaW1lVGVzdCwgV2l0aGluKSB7CisgIEVYUEVDVF9UUlVFKE1BQ1JPX0RBUkcoVGltZSg1NSwgNTAwMCkuSXNXaXRoaW4oVGltZSg1NSwgNDkwMCksIDEwMCkpKTsKKyAgRVhQRUNUX0ZBTFNFKE1BQ1JPX0RBUkcoVGltZSg1NSwgNTAwMCkuSXNXaXRoaW4oVGltZSg1NSwgNDkwMCksIDk5KSkpOworICBFWFBFQ1RfVFJVRShNQUNST19EQVJHKFRpbWUoNSwgMCkuSXNXaXRoaW4oVGltZSg0LCBUaW1lOjprTlNlY0luU2VjIC0gMjAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MCkpKTsKKyAgRVhQRUNUX1RSVUUoVGltZSgtNSwgVGltZTo6a05TZWNJblNlYyAtIDIwMCkuSXNXaXRoaW4oVGltZSgtNCwgMCksIDI1MCkpOworICBFWFBFQ1RfVFJVRShUaW1lKC01LCAyMDApLklzV2l0aGluKFRpbWUoLTUsIDApLCAyNTApKTsKK30KKworVEVTVChUaW1lVGVzdCwgTW9kdWx1cykgeworICBFWFBFQ1RfRVEoTUFDUk9fREFSRyhUaW1lKDAsIFRpbWU6OmtOU2VjSW5TZWMgLyAxMCAqIDIpKSwKKyAgICAgICAgICAgIE1BQ1JPX0RBUkcoVGltZSg1MCwgMCkgJSAoVGltZTo6a05TZWNJblNlYyAvIDEwICogMykpKTsKKyAgRVhQRUNUX0VRKFRpbWUoLTEsIFRpbWU6OmtOU2VjSW5TZWMgLyAxMCAqIDgpLAorICAgICAgICAgICAgVGltZSgtNTAsIDApICUgKFRpbWU6OmtOU2VjSW5TZWMgLyAxMCAqIDMpKTsKKyAgRVhQRUNUX0VRKFRpbWUoLTEsIFRpbWU6OmtOU2VjSW5TZWMgLyAxMCAqIDgpLAorICAgICAgICAgICAgVGltZSgtNTAsIDApICUgKC1UaW1lOjprTlNlY0luU2VjIC8gMTAgKiAzKSk7CisgIEVYUEVDVF9FUShUaW1lKDAsIFRpbWU6OmtOU2VjSW5TZWMgLyAxMCAqIDIpLAorICAgICAgICAgICAgVGltZSg1MCwgMCkgJSAoLVRpbWU6OmtOU2VjSW5TZWMgLyAxMCAqIDMpKTsKKyAgRVhQRUNUX0VRKFRpbWUoMSwgVGltZTo6a05TZWNJblNlYyAvIDEwKSwKKyAgICAgICAgICAgIFRpbWUoNjAsIFRpbWU6OmtOU2VjSW5TZWMgLyAxMCkgJSAoVGltZTo6a05TZWNJblNlYyAvIDEwICogMTIpKTsKK30KKworVEVTVChUaW1lVGVzdCwgSW5TZWNvbmRzKSB7CisgIEVYUEVDVF9FUShNQUNST19EQVJHKFRpbWUoMiwgVGltZTo6a05TZWNJblNlYyAvIDEwMCAqIDU1IC0gMSkpLAorICAgICAgICAgICAgVGltZTo6SW5TZWNvbmRzKDIuNTUpKTsKKyAgRVhQRUNUX0VRKE1BQ1JPX0RBUkcoVGltZSgtMywgVGltZTo6a05TZWNJblNlYyAvIDEwMCAqIDQ1KSksCisgICAgICAgICAgICBUaW1lOjpJblNlY29uZHMoLTIuNTUpKTsKK30KKworVEVTVChUaW1lVGVzdCwgVG9TZWNvbmRzKSB7CisgIEVYUEVDVF9ET1VCTEVfRVEoMTMuMjMsIFRpbWU6OkluU2Vjb25kcygxMy4yMykuVG9TZWNvbmRzKCkpOworICBFWFBFQ1RfTkVBUigtMTMuMjMsIFRpbWU6OkluU2Vjb25kcygtMTMuMjMpLlRvU2Vjb25kcygpLAorICAgICAgICAgICAgICAxLjAgLyBUaW1lOjprTlNlY0luU2VjICogMik7Cit9CisKK1RFU1QoVGltZVRlc3QsIEluTVMpIHsKKyAgVGltZSB0ID0gVGltZTo6SW5NUygyNTQ5NzEpOworICBFWFBFQ1RfRVEoMjU0LCB0LnNlYygpKTsKKyAgRVhQRUNUX0VRKDk3MTAwMDAwMCwgdC5uc2VjKCkpOworCisgIFRpbWUgdDIgPSBUaW1lOjpJbk1TKC0yNTQ5NzEpOworICBFWFBFQ1RfRVEoLTI1NSwgdDIuc2VjKCkpOworICBFWFBFQ1RfRVEoVGltZTo6a05TZWNJblNlYyAtIDk3MTAwMDAwMCwgdDIubnNlYygpKTsKK30KKworVEVTVChUaW1lVGVzdCwgVG9NU2VjKSB7CisgIEVYUEVDVF9FUSgyNTQ5NzEsIFRpbWUoMjU0LCA5NzEwMDAwMDApLlRvTVNlYygpKTsKKyAgRVhQRUNUX0VRKC0yNTQ5NzEsIFRpbWUoLTI1NSwgVGltZTo6a05TZWNJblNlYyAtIDk3MTAwMDAwMCkuVG9NU2VjKCkpOworfQorCitURVNUKFRpbWVUZXN0LCBJbk5TKSB7CisgIFRpbWUgdCA9IFRpbWU6OkluTlMoc3RhdGljX2Nhc3Q8aW50NjRfdD4oOTczMjU0MTExOTcxbGwpKTsKKyAgRVhQRUNUX0VRKDk3MywgdC5zZWMoKSk7CisgIEVYUEVDVF9FUSgyNTQxMTE5NzEsIHQubnNlYygpKTsKKworICBUaW1lIHQyID0gVGltZTo6SW5OUyhzdGF0aWNfY2FzdDxpbnQ2NF90PigtOTczMjU0MTExOTcxbGwpKTsKKyAgRVhQRUNUX0VRKC05NzQsIHQyLnNlYygpKTsKKyAgRVhQRUNUX0VRKFRpbWU6OmtOU2VjSW5TZWMgLSAyNTQxMTE5NzEsIHQyLm5zZWMoKSk7Cit9CisKK1RFU1QoVGltZVRlc3QsIEluVVMpIHsKKyAgVGltZSB0ID0gVGltZTo6SW5VUygyNTQxMTE5NzEpOworICBFWFBFQ1RfRVEoMjU0LCB0LnNlYygpKTsKKyAgRVhQRUNUX0VRKDExMTk3MTAwMCwgdC5uc2VjKCkpOworCisgIFRpbWUgdDIgPSBUaW1lOjpJblVTKC0yNTQxMTE5NzEpOworICBFWFBFQ1RfRVEoLTI1NSwgdDIuc2VjKCkpOworICBFWFBFQ1RfRVEoVGltZTo6a05TZWNJblNlYyAtIDExMTk3MTAwMCwgdDIubnNlYygpKTsKK30KKworVEVTVChUaW1lVGVzdCwgVG9VU2VjKSB7CisgIEVYUEVDVF9FUSgyNTQwMDA5NzEsIFRpbWUoMjU0LCA5NzEwMDApLlRvVVNlYygpKTsKKyAgRVhQRUNUX0VRKC0yNTQwMDA5NzEsIFRpbWUoLTI1NSwgVGltZTo6a05TZWNJblNlYyAtIDk3MTAwMCkuVG9VU2VjKCkpOworfQorCitURVNUKFRpbWVUZXN0LCBBYnMpIHsKKyAgRVhQRUNUX0VRKE1BQ1JPX0RBUkcoVGltZSg5NzEsIDExMTQpKSwgTUFDUk9fREFSRyhUaW1lKDk3MSwgMTExNCkuYWJzKCkpKTsKKyAgRVhQRUNUX0VRKE1BQ1JPX0RBUkcoVGltZSgyNTMsIFRpbWU6OmtOU2VjSW5TZWMgKiAwLjMpKSwKKyAgICAgICAgICAgIE1BQ1JPX0RBUkcoVGltZSgtMjU0LCBUaW1lOjprTlNlY0luU2VjICogMC43KS5hYnMoKSkpOworICBFWFBFQ1RfRVEoTUFDUk9fREFSRygtVGltZSgtOTcxLCA5NzMpLlRvTlNlYygpKSwKKyAgICAgICAgICAgIE1BQ1JPX0RBUkcoVGltZSg5NzAsIFRpbWU6OmtOU2VjSW5TZWMgLSA5NzMpLlRvTlNlYygpKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgdGltZQorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi90eXBlX3RyYWl0cy5oIGIvYW9zL2NvbW1vbi90eXBlX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNWZhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3R5cGVfdHJhaXRzLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1RZUEVfVFJBSVRTXworI2RlZmluZSBBT1NfQ09NTU9OX1RZUEVfVFJBSVRTXworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRwPgorc3RydWN0IGhhc190cml2aWFsX2NvcHlfYXNzaWduIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKy8vIFRoaXMgY2hhbmdlZCBiZXR3ZWVuIDQuNC41IGFuZCA0LjYuMy4gVW5sZXNzIHNvbWVib2R5IGRpc2NvdmVycyBvdGhlcndpc2UsCisvLyA0LjYgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgcGxhY2UgdG8gc3dpdGNoLgorI2lmICgoX19HTlVDX18gPCA0KSB8fCAoX19HTlVDX01JTk9SX18gPCA2KSkgJiYgIWRlZmluZWQoX19jbGFuZ19fKQorICAgIDo6c3RkOjpoYXNfdHJpdmlhbF9hc3NpZ248VHA+Ojp2YWx1ZT4ge307CisjZWxzZQorICAgIDo6c3RkOjpoYXNfdHJpdmlhbF9jb3B5X2Fzc2lnbjxUcD46OnZhbHVlPiB7fTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQSBjbGFzcyB0ZW1wbGF0ZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgaXQgaXMgc2FmZSB0byBwYXNzIGEgdHlwZQorLy8gdGhyb3VnaCB0aGUgc2hhcmVkIG1lbW9yeSBzeXN0ZW0gKGFrYSB3aGV0aGVyIG9yIG5vdCB5b3UgY2FuIG1lbWNweSBpdCkuCisvLyBVc2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCBzdGF0aWNfYXNzZXJ0LgorLy8KKy8vIERvZXNuJ3QgbmVlZCBhIHRyaXZpYWwgY29uc3RydWN0b3IgYmVjYXVzZSBpdCdzIGJ5dGVzIG9ubHkgbmVlZCB0byBnZXQKKy8vIGNvcGllZC4gSWYgaXQgaGFzIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3Rvciwgc29tZWJvZHkgaGFzIHRvIG1ha2Ugc3VyZSB0byBjYWxsCisvLyBpdCB3aGVuIGFwcHJvcHJpYXRlLgorLy8gU2VlIGFsc28gKDMuOSkgW2Jhc2ljLnR5cGVzXSBpbiB0aGUgQysrMTEgc3RhbmRhcmQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcD4KK3N0cnVjdCBzaG1fb2sgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgIChzdGQ6Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I8VHA+Ojp2YWx1ZSAmJgorICAgICBhb3M6Omhhc190cml2aWFsX2NvcHlfYXNzaWduPFRwPjo6dmFsdWUpPiB7fTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vdHlwZV90cmFpdHNfdGVzdC5jcHAgYi9hb3MvY29tbW9uL3R5cGVfdHJhaXRzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTA0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3R5cGVfdHJhaXRzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOTggQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL3R5cGVfdHJhaXRzLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgQmFkVmlydHVhbEZ1bmN0aW9uIHsKKyAgdmlydHVhbCB2b2lkIFRlc3QoKSB7fQorfTsKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIFZpcnR1YWxGdW5jdGlvbikgeworICBFWFBFQ1RfRkFMU0Uoc2htX29rPEJhZFZpcnR1YWxGdW5jdGlvbj46OnZhbHVlKTsKK30KK2NsYXNzIEJhZFB1cmVWaXJ0dWFsRnVuY3Rpb24geworICB2aXJ0dWFsIHZvaWQgVGVzdCgpID0gMDsKK307CitURVNUKFR5cGVUcmFpdHNUZXN0LCBQdXJlVmlydHVhbEZ1bmN0aW9uKSB7CisgIEVYUEVDVF9GQUxTRShzaG1fb2s8QmFkUHVyZVZpcnR1YWxGdW5jdGlvbj46OnZhbHVlKTsKK30KK2NsYXNzIEJhZEluaGVyaXRlZFZpcnR1YWwgOiBwdWJsaWMgQmFkVmlydHVhbEZ1bmN0aW9uIHt9OworVEVTVChUeXBlVHJhaXRzVGVzdCwgSW5oZXJpdGVkVmlydHVhbEZ1bmN0aW9uKSB7CisgIEVYUEVDVF9GQUxTRShzaG1fb2s8QmFkSW5oZXJpdGVkVmlydHVhbD46OnZhbHVlKTsKK30KK2NsYXNzIEJhZFZpcnR1YWxEZXN0cnVjdG9yIHsKKyAgdmlydHVhbCB+QmFkVmlydHVhbERlc3RydWN0b3IoKTsKK307CitURVNUKFR5cGVUcmFpdHNUZXN0LCBWaXJ0dWFsRGVzdHJ1Y3RvcikgeworICBFWFBFQ1RfRkFMU0Uoc2htX29rPEJhZFZpcnR1YWxEZXN0cnVjdG9yPjo6dmFsdWUpOworfQorY2xhc3MgQm9yaW5nIHt9OworY2xhc3MgQmFkVmlydHVhbEJhc2UgOiBwdWJsaWMgdmlydHVhbCBCb3Jpbmcge307CitURVNUKFR5cGVUcmFpdHNUZXN0LCBWaXJ0dWFsQmFzZSkgeworICBFWFBFQ1RfRkFMU0Uoc2htX29rPEJhZFZpcnR1YWxCYXNlPjo6dmFsdWUpOworfQorCitjbGFzcyBHb29kU2ltcGxlIHsKKyBwdWJsaWM6CisgIGludCB0ZXN0MSwgdGVzdDI7CisgIGRvdWJsZSB0ZXN0MzsKK307CisvLyBNYWtlIHN1cmUgdGhhdCBpdCBsZXRzIHNpbXBsZSBjbGFzc2VzIHRocm91Z2ggYW5kIHRoYXQgdGhlIGNvbXBpbGVyIGlzbid0CisvLyBjb21wbGV0ZWx5IG51dHMuCitURVNUKFR5cGVUcmFpdHNUZXN0LCBCYXNpYykgeworICBFWFBFQ1RfVFJVRShzaG1fb2s8R29vZFNpbXBsZT46OnZhbHVlKTsKKyAgR29vZFNpbXBsZSB0ZXN0ezUsIDQsIDM0LjJ9OworICBFWFBFQ1RfRVEoNSwgdGVzdC50ZXN0MSk7CisgIEVYUEVDVF9FUSg0LCB0ZXN0LnRlc3QyKTsKKyAgRVhQRUNUX0VRKDM0LjIsIHRlc3QudGVzdDMpOworICBtZW1zZXQoJnRlc3QsIDAsIHNpemVvZih0ZXN0KSk7CisgIEVYUEVDVF9FUSgwLCB0ZXN0LnRlc3QxKTsKKyAgRVhQRUNUX0VRKDAsIHRlc3QudGVzdDIpOworICBFWFBFQ1RfRVEoMCwgdGVzdC50ZXN0Myk7Cit9CisKK2NsYXNzIEdvb2RXaXRoQ29uc3RydWN0b3IgeworIHB1YmxpYzoKKyAgaW50IHZhbF87CisgIEdvb2RXaXRoQ29uc3RydWN0b3IoaW50IHZhbCkgOiB2YWxfKHZhbCkge30KK307CisvLyBNYWtlIHN1cmUgdGhhdCBpdCBsZXRzIGNsYXNzZXMgd2l0aCBjb25zdHJ1Y3RvcnMgdGhyb3VnaC4KK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIEdvb2RXaXRoQ29uc3RydWN0b3IpIHsKKyAgRVhQRUNUX1RSVUUoc2htX29rPEdvb2RXaXRoQ29uc3RydWN0b3I+Ojp2YWx1ZSk7CisgIEdvb2RXaXRoQ29uc3RydWN0b3IgdGVzdCg5NzEpOworICBFWFBFQ1RfRVEoOTcxLCB0ZXN0LnZhbF8pOworfQorCitjbGFzcyBHb29kUHVibGljUHJpdmF0ZUZ1bmN0aW9uIHsKKyBwdWJsaWM6CisgIGludDMyX3QgYV87CisgIHZvaWQgc2V0X2EoaW50MzJfdCBhKSB7IGFfID0gYTsgfQorICBpbnQzMl90IGIoKSB7IHJldHVybiBiXzsgfQorICB2b2lkIHNldF9iKGludDMyX3QgYikgeyBiXyA9IGI7IH0KKyBwcml2YXRlOgorICBpbnQzMl90IGJfOworfTsKKy8vIE1ha2Ugc3VyZSB0aGF0IG1lbWJlciBmdW5jdGlvbnMgc3RpbGwgd29yay4KK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIEZ1bmN0aW9uKSB7CisgIEVYUEVDVF9UUlVFKHNobV9vazxHb29kUHVibGljUHJpdmF0ZUZ1bmN0aW9uPjo6dmFsdWUpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KDgpLCBzaXplb2YoR29vZFB1YmxpY1ByaXZhdGVGdW5jdGlvbikpIDw8CisgICAgICAiVGhlIGNvbXBpbGVyIGRpZCBzb21ldGhpbmcgd2VpcmQsIGJ1dCBpdCBtaWdodCBub3QgYmUgYSBwcm9ibGVtLiI7CisgIEdvb2RQdWJsaWNQcml2YXRlRnVuY3Rpb24gdGVzdDsKKyAgdGVzdC5hXyA9IDU7CisgIHRlc3Quc2V0X2IoOTcxKTsKKyAgRVhQRUNUX0VRKDUsIHRlc3QuYV8pOworICBFWFBFQ1RfRVEoOTcxLCB0ZXN0LmIoKSk7CisgIHRlc3Quc2V0X2EoNzQpOworICBFWFBFQ1RfRVEoNzQsIHRlc3QuYV8pOworICBtZW1zZXQoJnRlc3QsIDAsIHNpemVvZih0ZXN0KSk7CisgIEVYUEVDVF9FUSgwLCB0ZXN0LmFfKTsKKyAgRVhQRUNUX0VRKDAsIHRlc3QuYigpKTsKKyAgdGVzdC5zZXRfYSgxMjMpOworICB0ZXN0LnNldF9iKDI1NCk7CisgIEVYUEVDVF9FUSgxMjMsIHRlc3QuYV8pOworICBFWFBFQ1RfRVEoMjU0LCB0ZXN0LmIoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3VuaXF1ZV9tYWxsb2NfcHRyLmggYi9hb3MvY29tbW9uL3VuaXF1ZV9tYWxsb2NfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYzM3YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vdW5pcXVlX21hbGxvY19wdHIuaApAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW9zIHsKKworbmFtZXNwYWNlIHsKKworLy8gV3JpdHRlbiBhcyBhIGZ1bmN0b3Igc28gdGhhdCBpdCBkb2Vzbid0IGhhdmUgdG8gZ2V0IHBhc3NlZCB0bworLy8gc3RkOjp1bmlxdWVfcHRyJ3MgY29uc3RydWN0b3IgYXMgYW4gYXJndW1lbnQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB2b2lkKCpmdW5jdGlvbikoVCAqKT4KK2NsYXNzIGNvbnN0X3dyYXAgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFQgKnB0cikgeworICAgIGZ1bmN0aW9uKGNvbnN0X2Nhc3Q8VCAqPihwdHIpKTsKKyAgfQorfTsKKworLy8gV3JhcHBlciBmdW5jdGlvbiB0byBkZWFsIHdpdGggdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gQyBhbmQgQysrIChDKysgZG9lc24ndAorLy8gYXV0b21hdGljYWxseSBjb252ZXJ0IFQqIHRvIHZvaWQqIGxpa2UgQykuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBmcmVlX3R5cGUoVCAqcHRyKSB7IDo6ZnJlZShyZWludGVycHJldF9jYXN0PHZvaWQgKj4ocHRyKSk7IH0KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIEEgc3RkOjp1bmlxdWVfcHRyIHRoYXQgc2hvdWxkIGdldCBmcmVlZCB3aXRoIGEgQy1zdHlsZSBmcmVlIGZ1bmN0aW9uCisvLyAoZnJlZSgyKSBieSBkZWZhdWx0KS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHZvaWQoKmZ1bmN0aW9uKShUICopID0gZnJlZV90eXBlPFQ+PgorY2xhc3MgdW5pcXVlX2NfcHRyIDogcHVibGljIHN0ZDo6dW5pcXVlX3B0cjxULCBjb25zdF93cmFwPFQsIGZ1bmN0aW9uPj4geworIHB1YmxpYzoKKyAgdW5pcXVlX2NfcHRyKFQgKnZhbHVlKSA6IHN0ZDo6dW5pcXVlX3B0cjxULCBjb25zdF93cmFwPFQsIGZ1bmN0aW9uPj4odmFsdWUpIHt9CisKKyAgLy8gcGVyZmVjdCBmb3J3YXJkaW5nIG9mIHRoZXNlIDIgdG8gbWFrZSB1bmlxdWVfcHRyIHdvcmsKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KKyAgdW5pcXVlX2NfcHRyKEFyZ3MmJi4uLiBhcmdzKQorICAgIDogc3RkOjp1bmlxdWVfcHRyPFQsIGNvbnN0X3dyYXA8VCwgZnVuY3Rpb24+PihzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIHsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgorICB1bmlxdWVfY19wdHI8VCwgZnVuY3Rpb24+ICZvcGVyYXRvcj0oQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VCwgY29uc3Rfd3JhcDxULCBmdW5jdGlvbj4+OjpvcGVyYXRvcj0oCisgICAgICAgIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvZGVhdGhfdGVzdF9sb2dfaW1wbGVtZW50YXRpb24uaCBiL2Fvcy9jb21tb24vdXRpbC9kZWF0aF90ZXN0X2xvZ19pbXBsZW1lbnRhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjEyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvZGVhdGhfdGVzdF9sb2dfaW1wbGVtZW50YXRpb24uaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIEFPU19DT01NT05fVVRJTF9ERUFUSF9URVNUX0xPR19JTVBMRU1FTlRBVElPTl9IXworI2RlZmluZSBBT1NfQ09NTU9OX1VUSUxfREVBVEhfVEVTVF9MT0dfSU1QTEVNRU5UQVRJT05fSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB1dGlsIHsKKworLy8gUHJpbnRzIGFsbCBGQVRBTCBtZXNzYWdlcyB0byBzdGRlcnIgYW5kIHRoZW4gYWJvcnQoMylzIGJlZm9yZSB0aGUgcmVndWxhcgorLy8gc3R1ZmYgY2FuIHByaW50IG91dCBhbnl0aGluZyBlbHNlLiBJZ25vcmVzIGFsbCBvdGhlciBtZXNzYWdlcy4KKy8vIFRoaXMgaXMgdXNlZnVsIGluIGRlYXRoIHRlc3RzIHRoYXQgZXhwZWN0IGEgTE9HKEZBVEFMKSB0byBjYXVzZSB0aGUgZGVhdGguCitjbGFzcyBEZWF0aFRlc3RMb2dJbXBsZW1lbnRhdGlvbiA6IHB1YmxpYyBsb2dnaW5nOjpIYW5kbGVNZXNzYWdlTG9nSW1wbGVtZW50YXRpb24geworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEhhbmRsZU1lc3NhZ2UoY29uc3QgbG9nZ2luZzo6TG9nTWVzc2FnZSAmbWVzc2FnZSkgb3ZlcnJpZGUgeworICAgIGlmIChtZXNzYWdlLmxldmVsID09IEZBVEFMKSB7CisgICAgICBsb2dnaW5nOjppbnRlcm5hbDo6UHJpbnRNZXNzYWdlKHN0ZGVyciwgbWVzc2FnZSk7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfQ09NTU9OX1VUSUxfREVBVEhfVEVTVF9MT0dfSU1QTEVNRU5UQVRJT05fSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vdXRpbC9pbmV0X2FkZHIuY2MgYi9hb3MvY29tbW9uL3V0aWwvaW5ldF9hZGRyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YmRlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvaW5ldF9hZGRyLmNjCkBAIC0wLDAgKzEsNDEgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvaW5ldF9hZGRyLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZm5kZWYgX19WWFdPUktTX18KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vYnl0ZW9yZGVyLmgiCisjZWxzZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBodG9uKFQpOworCit0ZW1wbGF0ZTx1aW50MzJfdD4KK3VpbnQzMl90IGh0b24odWludDMyX3QgdikgeyByZXR1cm4gdjsgfQorCisjZW5kaWYKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdXRpbCB7CisKK2NvbnN0IGNoYXIgKk1ha2VJUEFkZHJlc3MoY29uc3QgaW5fYWRkciAmYmFzZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICA6OmFvczo6TmV0d29ya0FkZHJlc3MgbGFzdF9zZWdtZW50KSB7CisgIGluX2FkZHIgYWRkcmVzcyA9IGJhc2VfYWRkcmVzczsKKyAgU2V0TGFzdFNlZ21lbnQoJmFkZHJlc3MsIGxhc3Rfc2VnbWVudCk7CisKKyNpZmRlZiBfX1ZYV09SS1NfXworICBjaGFyICpyID0gc3RhdGljX2Nhc3Q8Y2hhciAqPihtYWxsb2MoSU5FVF9BRERSX0xFTikpOworICBpbmV0X250b2FfYihhZGRyZXNzLCByKTsKKyAgcmV0dXJuIHI7CisjZWxzZQorICByZXR1cm4gc3RyZHVwKGluZXRfbnRvYShhZGRyZXNzKSk7CisjZW5kaWYKK30KKwordm9pZCBTZXRMYXN0U2VnbWVudChpbl9hZGRyICphZGRyZXNzLCA6OmFvczo6TmV0d29ya0FkZHJlc3MgbGFzdF9zZWdtZW50KSB7CisgIGFkZHJlc3MtPnNfYWRkciAmPSB+KGh0b248dWludDMyX3Q+KDB4RkYpKTsKKyAgYWRkcmVzcy0+c19hZGRyIHw9IGh0b248dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGxhc3Rfc2VnbWVudCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi91dGlsL2luZXRfYWRkci5oIGIvYW9zL2NvbW1vbi91dGlsL2luZXRfYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzY4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvaW5ldF9hZGRyLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1VUSUxfSU5FVF9BRERSX0hfCisjZGVmaW5lIEFPU19DT01NT05fVVRJTF9JTkVUX0FERFJfSF8KKworI2lmZGVmIF9fVlhXT1JLU19fCisjaW5jbHVkZSA8aW5ldExpYi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL25ldHdvcmtfcG9ydC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB1dGlsIHsKKworLy8gTWFrZXMgYW4gSVAgYWRkcmVzcyBzdHJpbmcgZnJvbSBiYXNlX2FkZHJlc3Mgd2l0aCB0aGUgbGFzdCBieXRlIHNldCB0bworLy8gbGFzdF9zZWdtZW50LgorLy8gUmV0dXJucyBhIG1hbGxvYygzKWVkIHN0cmluZy4KK2NvbnN0IGNoYXIgKk1ha2VJUEFkZHJlc3MoY29uc3QgaW5fYWRkciAmYmFzZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICA6OmFvczo6TmV0d29ya0FkZHJlc3MgbGFzdF9zZWdtZW50KTsKKworLy8gU2V0cyB0aGUgbGFzdCBieXRlIG9mICphZGRyZXNzIHRvIGxhc3Rfc2VnbWVudC4KK3ZvaWQgU2V0TGFzdFNlZ21lbnQoaW5fYWRkciAqYWRkcmVzcywgOjphb3M6Ok5ldHdvcmtBZGRyZXNzIGxhc3Rfc2VnbWVudCk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9VVElMX0lORVRfQUREUl9IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi91dGlsL2xvZ19pbnRlcnZhbC5oIGIvYW9zL2NvbW1vbi91dGlsL2xvZ19pbnRlcnZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOGEzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvbG9nX2ludGVydmFsLmgKQEAgLTAsMCArMSw5MyBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1VUSUxfTE9HX0lOVEVSVkFMX0hfCisjZGVmaW5lIEFPU19DT01NT05fVVRJTF9MT0dfSU5URVJWQUxfSF8KKworI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHV0aWwgeworCisvLyBBIGNsYXNzIHRvIGhlbHAgd2l0aCBsb2dnaW5nIHRoaW5ncyB0aGF0IGhhcHBlbiBhIGxvdCBvbmx5IG9jY2FzaW9uYWxseS4KKy8vCisvLyBJbnRlbmRlZCB1c2UgeworLy8gICBzdGF0aWMgTG9nSW50ZXJ2YWwgaW50ZXJ2YWwoOjphb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjIpKTsKKy8vCisvLyAgIGlmIChXYW50VG9Mb2coKSkgeworLy8gICAgIGludGVydmFsLldhbnRUb0xvZygpOworLy8gICB9CisvLyAgIGlmIChpbnRlcnZhbC5TaG91bGRMb2coKSkgeworLy8gICAgIExPRyhERUJVRywgInRoaW5naWUgaGFwcGVuZWQhICglZCB0aW1lcylcbiIsIGludGVydmFsLkNvdW50KCkpOworLy8gICB9CisvLyB9CitjbGFzcyBMb2dJbnRlcnZhbCB7CisgcHVibGljOgorICBjb25zdGV4cHIgTG9nSW50ZXJ2YWwoY29uc3QgOjphb3M6OnRpbWU6OlRpbWUgJmludGVydmFsKQorICAgICAgOiBjb3VudF8oMCksIGludGVydmFsXyhpbnRlcnZhbCksIGxhc3RfZG9uZV8oMCwgMCkge30KKworICB2b2lkIFdhbnRUb0xvZygpIHsKKyAgICBpZiAoY291bnRfID09IDApIHsKKyAgICAgIGxhc3RfZG9uZV8gPSA6OmFvczo6dGltZTo6VGltZTo6Tm93KCk7CisgICAgfQorICAgICsrY291bnRfOworICB9CisgIGJvb2wgU2hvdWxkTG9nKCkgeworICAgIGNvbnN0IDo6YW9zOjp0aW1lOjpUaW1lIG5vdyA9IDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKTsKKyAgICBjb25zdCBib29sIHIgPSAobm93IC0gbGFzdF9kb25lXykgPj0gaW50ZXJ2YWxfICYmIGNvdW50XyA+IDA7CisgICAgaWYgKHIpIHsKKyAgICAgIGxhc3RfZG9uZV8gPSBub3c7CisgICAgfQorICAgIHJldHVybiByOworICB9CisgIGludCBDb3VudCgpIHsKKyAgICBjb25zdCBpbnQgciA9IGNvdW50XzsKKyAgICBjb3VudF8gPSAwOworICAgIHJldHVybiByOworICB9CisKKyAgY29uc3QgOjphb3M6OnRpbWU6OlRpbWUgJmludGVydmFsKCkgY29uc3QgeyByZXR1cm4gaW50ZXJ2YWxfOyB9CisKKyBwcml2YXRlOgorICBpbnQgY291bnRfOworICBjb25zdCA6OmFvczo6dGltZTo6VGltZSBpbnRlcnZhbF87CisgIDo6YW9zOjp0aW1lOjpUaW1lIGxhc3RfZG9uZV87Cit9OworCisvLyBUaGlzIG9uZSBpcyBldmVuIGVhc2llciB0byB1c2UuIEl0IGFsd2F5cyBsb2dzIHdpdGggYSBtZXNzYWdlICIlcyAlZAorLy8gdGltZXNcbiIuIENhbGwgTE9HX0lOVEVSVkFMIHdoZXJldmVyIGl0IHNob3VsZCBsb2cgYW5kIG1ha2Ugc3VyZSBQcmludCBnZXRzCisvLyBjYWxsZWQgb2Z0ZW4gKGllIG5vdCBhZnRlciBhIGNvbmRpdGlvbmFsIHJldHVybikKK2NsYXNzIFNpbXBsZUxvZ0ludGVydmFsIHsKKyBwdWJsaWM6CisgIFNpbXBsZUxvZ0ludGVydmFsKGNvbnN0IDo6YW9zOjp0aW1lOjpUaW1lICZpbnRlcnZhbCwgbG9nX2xldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nICZtZXNzYWdlKQorICAgICAgOiBpbnRlcnZhbF8oaW50ZXJ2YWwpLCBsZXZlbF8obGV2ZWwpLCBtZXNzYWdlXyhtZXNzYWdlKSB7fQorCisjZGVmaW5lIExPR19JTlRFUlZBTChzaW1wbGVfbG9nKSBcCisgIHNpbXBsZV9sb2cuV2FudFRvTG9nKExPR19TT1VSQ0VOQU1FICI6ICIgU1RSSU5HSUZZKF9fTElORV9fKSkKKyAgdm9pZCBXYW50VG9Mb2coY29uc3QgY2hhciAqY29udGV4dCkgeworICAgIGNvbnRleHRfID0gY29udGV4dDsKKyAgICBpbnRlcnZhbF8uV2FudFRvTG9nKCk7CisgIH0KKworICB2b2lkIFByaW50KCkgeworICAgIGlmIChpbnRlcnZhbF8uU2hvdWxkTG9nKCkpIHsKKyAgICAgIENIRUNLX05PVE5VTEwoY29udGV4dF8pOworICAgICAgbG9nX2RvKGxldmVsXywgIiVzOiAlLipzICVkIHRpbWVzIG92ZXIgJWYgc2VjXG4iLCBjb250ZXh0XywKKyAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2VfLnNpemUoKSksIG1lc3NhZ2VfLmRhdGEoKSwKKyAgICAgICAgICAgICBpbnRlcnZhbF8uQ291bnQoKSwgaW50ZXJ2YWxfLmludGVydmFsKCkuVG9TZWNvbmRzKCkpOworICAgICAgY29udGV4dF8gPSBOVUxMOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgTG9nSW50ZXJ2YWwgaW50ZXJ2YWxfOworICBjb25zdCBsb2dfbGV2ZWwgbGV2ZWxfOworICBjb25zdCA6OnN0ZDo6c3RyaW5nIG1lc3NhZ2VfOworICBjb25zdCBjaGFyICpjb250ZXh0XyA9IE5VTEw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fVVRJTF9MT0dfSU5URVJWQUxfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vdXRpbC9vcHRpb25zLmggYi9hb3MvY29tbW9uL3V0aWwvb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YzRmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvb3B0aW9ucy5oCkBAIC0wLDAgKzEsOTIgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9VVElMX09QVElPTlNfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9VVElMX09QVElPTlNfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW9zIHsKKwordGVtcGxhdGUgPGNsYXNzIE93bmVyPgorY2xhc3MgT3B0aW9uczsKKworLy8gQW4gIm9wdGlvbiIgdGhhdCBjYW4gYmUgY29tYmluZWQgd2l0aCBvdGhlciBvcHRpb25zIGFuZCBwYXNzZWQgYXMgb25lCisvLyBhcmd1bWVudC4gVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBlbXVsYXRlIGludGVncmFsIGNvbnN0YW50cyAoZXhjZXB0IGJlCisvLyB0eXBlLXNhZmUpLCBzbyBpdHMgaW5zdGFuY2VzIGNhbiBiZSBjb21iaW5lZCB3aXRoIG9wZXJhdG9yfCAoY3JlYXRpbmcgYW4KKy8vIE9wdGlvbnMpLCBhbmQgYW4gT3B0aW9ucyBjYW4gYmUgdGVzdGVkIGZvciBtZW1iZXJzaGlwIHdpdGggb3BlcmF0b3ImLgorLy8gT3duZXIgaXMgdGhlIG9ubHkgY2xhc3MgdGhhdCBjYW4gY29uc3RydWN0IE9wdGlvbiBpbnN0YW5jZXMgYW5kIGlzIHVzZWQgdG8KKy8vIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBvcHRpb25zIGZvciBkaWZmZXJlbnQgY2xhc3Nlcy4gSXQgaXMgc2FmZSB0byBvbmx5IGhhdmUKKy8vIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgT3duZXIgaW4gc2NvcGUgd2hlbiBpbnN0YW50aWF0aW5nIGVpdGhlciBvZiB0aGVzZQorLy8gdGVtcGxhdGUgY2xhc3Nlcy4KK3RlbXBsYXRlIDxjbGFzcyBPd25lcj4KK2NsYXNzIE9wdGlvbnMgeworIHB1YmxpYzoKKyAgLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBvcHRpb25zLiBJbnN0YW5jZXMgb2YgdGhpcyBzaG91bGQgYmUgY3JlYXRlZCBhcworICAvLyBjb25zdGFudHMgYnkgT3duZXIuCisgIGNsYXNzIE9wdGlvbiB7CisgICBwdWJsaWM6CisgICAgY29uc3RleHByIE9wdGlvbnMgb3BlcmF0b3J8KE9wdGlvbiBvcHRpb24pIGNvbnN0IHsKKyAgICAgIHJldHVybiBPcHRpb25zKGJpdF8gfCBvcHRpb24uYml0Xyk7CisgICAgfQorCisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShPcHRpb24gb3RoZXIpIGNvbnN0IHsgcmV0dXJuIGJpdF8gPT0gb3RoZXIuYml0XzsgfQorCisgICAgY29uc3RleHByIHVuc2lnbmVkIGludCBwcmludGFibGUoKSBjb25zdCB7IHJldHVybiBiaXRfOyB9CisKKyAgIHByaXZhdGU6CisgICAgLy8gQml0IG11c3QgaGF2ZSBleGFjdGx5IDEgYml0IHNldCBhbmQgdGhhdCBtdXN0IGJlIGEgZGlmZmVyZW50IG9uZSBmb3IgZWFjaAorICAgIC8vIGluc3RhbmNlLgorICAgIGV4cGxpY2l0IGNvbnN0ZXhwciBPcHRpb24odW5zaWduZWQgaW50IGJpdCkgOiBiaXRfKGJpdCkge30KKworICAgIHVuc2lnbmVkIGludCBiaXRfOworCisgICAgZnJpZW5kIGNsYXNzIE9wdGlvbnM7CisgICAgZnJpZW5kIE93bmVyOworICB9OworCisgIGNvbnN0ZXhwciBPcHRpb25zKE9wdGlvbiBvcHRpb24pIDogYml0c18ob3B0aW9uLmJpdF8pIHt9CisKKyAgY29uc3RleHByIGJvb2wgb3BlcmF0b3ImKE9wdGlvbiBvcHRpb24pIGNvbnN0IHsKKyAgICByZXR1cm4gKGJpdHNfICYgb3B0aW9uLmJpdF8pICE9IDA7CisgIH0KKworICBjb25zdGV4cHIgT3B0aW9ucyBvcGVyYXRvcnwoT3B0aW9uIG9wdGlvbikgY29uc3QgeworICAgIHJldHVybiBPcHRpb25zKGJpdHNfIHwgb3B0aW9uLmJpdF8pOworICB9CisgIGNvbnN0ZXhwciBPcHRpb25zIG9wZXJhdG9yfChPcHRpb25zIG9wdGlvbnMpIGNvbnN0IHsKKyAgICByZXR1cm4gT3B0aW9ucyhiaXRzXyB8IG9wdGlvbnMuYml0c18pOworICB9CisKKyAgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShPcHRpb25zIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGJpdHNfID09IG90aGVyLmJpdHNfOworICB9CisKKyAgY29uc3RleHByIHVuc2lnbmVkIGludCBwcmludGFibGUoKSBjb25zdCB7IHJldHVybiBiaXRzXzsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBubyBPcHRpb25zIG90aGVyIHRoYW4gdGhlIG9uZXMgaW4gb3B0aW9ucyBhcmUgc2V0LgorICAvLyBVc2VmdWwgZm9yIHZhbGlkYXRpbmcgdGhhdCBubyBpbGxlZ2FsIG9wdGlvbnMgYXJlIHBhc3NlZC4KKyAgY29uc3RleHByIGJvb2wgTm9PdGhlcnNTZXQoT3B0aW9ucyBvcHRpb25zKSBjb25zdCB7CisgICAgcmV0dXJuIChiaXRzXyAmIH5vcHRpb25zLmJpdHNfKSA9PSAwOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGV4YWN0bHkgMSBvZiB0aGUgT3B0aW9ucyBpbiBvcHRpb25zIGlzIHNldC4KKyAgLy8gVXNlZnVsIGZvciB2YWxpZGF0aW5nIHRoYXQgb25lIG9mIGEgZ3JvdXAgb2YgbXV0dWFsbHkgZXhjbHVzaXZlIG9wdGlvbnMgaGFzCisgIC8vIGJlZW4gcGFzc2VkLgorICBjb25zdGV4cHIgYm9vbCBFeGFjdGx5T25lU2V0KE9wdGlvbnMgb3B0aW9ucykgY29uc3QgeworICAgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQoYml0c18gJiBvcHRpb25zLmJpdHNfKSA9PSAxOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgT3B0aW9ucyBpbiBvcHRpb25zIGFyZSBzZXQuCisgIGNvbnN0ZXhwciBib29sIEFsbFNldChPcHRpb25zIG9wdGlvbnMpIGNvbnN0IHsKKyAgICByZXR1cm4gKGJpdHNfICYgb3B0aW9ucy5iaXRzXykgPT0gb3B0aW9ucy5iaXRzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgZXhwbGljaXQgY29uc3RleHByIE9wdGlvbnModW5zaWduZWQgaW50IGJpdHMpIDogYml0c18oYml0cykge30KKworICB1bnNpZ25lZCBpbnQgYml0c187CisKKyAgZnJpZW5kIGNsYXNzIE9wdGlvbjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBvcHRpb25zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9VVElMX09QVElPTlNfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vdXRpbC9vcHRpb25zX3Rlc3QuY2MgYi9hb3MvY29tbW9uL3V0aWwvb3B0aW9uc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NzM0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvb3B0aW9uc190ZXN0LmNjCkBAIC0wLDAgKzEsNTYgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvb3B0aW9ucy5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE9wdGlvbnNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIE9wdGlvbnM8T3B0aW9uc1Rlc3Q+OjpPcHRpb24ga09uZXsxfSwga1R3b3syfSwga1RocmVlezR9LAorICAgICAga0ZvdXJ7OH07Cit9OworCitjb25zdGV4cHIgT3B0aW9uczxPcHRpb25zVGVzdD46Ok9wdGlvbiBPcHRpb25zVGVzdDo6a09uZSwgT3B0aW9uc1Rlc3Q6OmtUd28sCisgICAgT3B0aW9uc1Rlc3Q6OmtUaHJlZSwgT3B0aW9uc1Rlc3Q6OmtGb3VyOworCitURVNUX0YoT3B0aW9uc1Rlc3QsIEJhc2ljKSB7CisgIGNvbnN0IE9wdGlvbnM8T3B0aW9uc1Rlc3Q+IG9uZV90aHJlZSA9IGtPbmUgfCBrVGhyZWU7CisgIEVYUEVDVF9UUlVFKG9uZV90aHJlZSAmIGtPbmUpOworICBFWFBFQ1RfRkFMU0Uob25lX3RocmVlICYga1R3byk7CisgIEVYUEVDVF9UUlVFKG9uZV90aHJlZSAmIGtUaHJlZSk7Cit9CisKK1RFU1RfRihPcHRpb25zVGVzdCwgTm9PdGhlcnNTZXQpIHsKKyAgY29uc3QgT3B0aW9uczxPcHRpb25zVGVzdD4gb25lX3RocmVlID0ga09uZSB8IGtUaHJlZTsKKyAgRVhQRUNUX1RSVUUob25lX3RocmVlLk5vT3RoZXJzU2V0KG9uZV90aHJlZSkpOworICBFWFBFQ1RfVFJVRShvbmVfdGhyZWUuTm9PdGhlcnNTZXQoa09uZSB8IGtUd28gfCBrVGhyZWUpKTsKKyAgRVhQRUNUX1RSVUUob25lX3RocmVlLk5vT3RoZXJzU2V0KGtPbmUgfCBrVGhyZWUgfCBrRm91cikpOworICBFWFBFQ1RfVFJVRShvbmVfdGhyZWUuTm9PdGhlcnNTZXQoa09uZSB8IGtUd28gfCBrVGhyZWUgfCBrRm91cikpOworICBFWFBFQ1RfRkFMU0Uob25lX3RocmVlLk5vT3RoZXJzU2V0KGtPbmUpKTsKKyAgRVhQRUNUX0ZBTFNFKG9uZV90aHJlZS5Ob090aGVyc1NldChrVGhyZWUpKTsKKyAgRVhQRUNUX0ZBTFNFKG9uZV90aHJlZS5Ob090aGVyc1NldChrVHdvIHwga0ZvdXIpKTsKK30KKworVEVTVF9GKE9wdGlvbnNUZXN0LCBFeGFjdGx5T25lU2V0KSB7CisgIGNvbnN0IE9wdGlvbnM8T3B0aW9uc1Rlc3Q+IG9uZV90aHJlZSA9IGtPbmUgfCBrVGhyZWU7CisgIEVYUEVDVF9UUlVFKG9uZV90aHJlZS5FeGFjdGx5T25lU2V0KGtPbmUgfCBrVHdvKSk7CisgIEVYUEVDVF9GQUxTRShvbmVfdGhyZWUuRXhhY3RseU9uZVNldChvbmVfdGhyZWUpKTsKKyAgRVhQRUNUX1RSVUUob25lX3RocmVlLkV4YWN0bHlPbmVTZXQoa1R3byB8IGtUaHJlZSB8IGtGb3VyKSk7CisgIEVYUEVDVF9GQUxTRShvbmVfdGhyZWUuRXhhY3RseU9uZVNldChrT25lIHwga1R3byB8IGtUaHJlZSB8IGtGb3VyKSk7Cit9CisKK1RFU1RfRihPcHRpb25zVGVzdCwgQWxsU2V0KSB7CisgIGNvbnN0IE9wdGlvbnM8T3B0aW9uc1Rlc3Q+IG9uZV90aHJlZSA9IGtPbmUgfCBrVGhyZWU7CisgIEVYUEVDVF9UUlVFKG9uZV90aHJlZS5BbGxTZXQob25lX3RocmVlKSk7CisgIEVYUEVDVF9UUlVFKG9uZV90aHJlZS5BbGxTZXQoa09uZSkpOworICBFWFBFQ1RfRkFMU0Uob25lX3RocmVlLkFsbFNldChrVHdvKSk7CisgIEVYUEVDVF9UUlVFKG9uZV90aHJlZS5BbGxTZXQoa1RocmVlKSk7CisgIEVYUEVDVF9GQUxTRShvbmVfdGhyZWUuQWxsU2V0KGtGb3VyKSk7CisgIEVYUEVDVF9GQUxTRShvbmVfdGhyZWUuQWxsU2V0KGtPbmUgfCBrVHdvIHwga0ZvdXIpKTsKKyAgRVhQRUNUX0ZBTFNFKG9uZV90aHJlZS5BbGxTZXQoa1R3byB8IGtUaHJlZSB8IGtGb3VyKSk7CisgIEVYUEVDVF9GQUxTRShvbmVfdGhyZWUuQWxsU2V0KGtPbmUgfCBrVHdvIHwga1RocmVlIHwga0ZvdXIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5jYyBiL2Fvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjlkY2RiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmNjCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvcGhhc2VkX2xvb3AuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdGltZSB7CisKK3ZvaWQgUGhhc2VkTG9vcFhNUyhpbnQgbXMsIGludCBvZmZzZXQpIHsKKyAgLy8gVE9ETyhicmlhbnMpOiBUZXN0cyEKKyAgY29uc3QgVGltZSBmcmVxdWVuY3kgPSBUaW1lOjpJbk1TKG1zKTsKKyAgU2xlZXBVbnRpbCgoVGltZTo6Tm93KCkgLyBzdGF0aWNfY2FzdDxpbnQzMl90PihmcmVxdWVuY3kuVG9OU2VjKCkpKSAqCisgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZnJlcXVlbmN5LlRvTlNlYygpKSArCisgICAgICAgICAgICAgZnJlcXVlbmN5ICsgVGltZTo6SW5VUyhvZmZzZXQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRpbWluZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmggYi9hb3MvY29tbW9uL3V0aWwvcGhhc2VkX2xvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2M0MTdhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1VUSUxfUEhBU0VEX0xPT1BfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9VVElMX1BIQVNFRF9MT09QX0hfCisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB0aW1lIHsKKworLy8gV2lsbCBub3QgYmUgYWNjdXJhdGUgaWYgbXMgaXNuJ3QgYSBmYWN0b3Igb2YgMTAwMC4KKy8vIG9mZnNldCBpcyBpbiB1cy4KK3ZvaWQgUGhhc2VkTG9vcFhNUyhpbnQgbXMsIGludCBvZmZzZXQpOworCit9ICAvLyBuYW1lc3BhY2UgdGltZQorfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fVVRJTF9QSEFTRURfTE9PUF9IXwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi91dGlsL3J1bl9jb21tYW5kLmNjIGIvYW9zL2NvbW1vbi91dGlsL3J1bl9jb21tYW5kLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTE5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvcnVuX2NvbW1hbmQuY2MKQEAgLTAsMCArMSw3MyBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9ydW5fY29tbWFuZC5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSB7CisKKy8vIFJBSUkgY2xhc3MgdG8gYmxvY2sgU0lHQ0hMRCBhbmQgdGhlbiByZXN0b3JlIGl0IG9uIGRlc3RydWN0aW9uLgorY2xhc3MgQmxvY2tTSUdDSExEIHsKKyBwdWJsaWM6CisgIEJsb2NrU0lHQ0hMRCgpIHsKKyAgICBzaWdzZXRfdCB0b19ibG9jazsKKyAgICBzaWdlbXB0eXNldCgmdG9fYmxvY2spOworICAgIHNpZ2FkZHNldCgmdG9fYmxvY2ssIFNJR0NITEQpOworICAgIGlmIChzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZ0b19ibG9jaywgJm9yaWdpbmFsX2Jsb2NrZWRfKSA9PSAtMSkgeworICAgICAgUExPRyhGQVRBTCwgInNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJXAsICVwKSBmYWlsZWQiLAorICAgICAgICAgICAmdG9fYmxvY2ssICZvcmlnaW5hbF9ibG9ja2VkXyk7CisgICAgfQorICB9CisgIH5CbG9ja1NJR0NITEQoKSB7CisgICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3JpZ2luYWxfYmxvY2tlZF8sIG51bGxwdHIpID09IC0xKSB7CisgICAgICBQTE9HKEZBVEFMLCAic2lncHJvY21hc2soU0lHX1NFVE1BU0ssICVwLCBudWxscHRyKSBmYWlsZWQiLAorICAgICAgICAgICAmb3JpZ2luYWxfYmxvY2tlZF8pOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgc2lnc2V0X3Qgb3JpZ2luYWxfYmxvY2tlZF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworaW50IFJ1bkNvbW1hbmQoY29uc3QgY2hhciAqY29tbWFuZCkgeworICBCbG9ja1NJR0NITEQgYmxvY2tlcjsKKyAgY29uc3QgcGlkX3QgcGlkID0gZm9yaygpOworICBzd2l0Y2ggKHBpZCkgeworICAgIGNhc2UgMDogIC8vIGluIGNoaWxkCisgICAgICB7CisgICAgICAgIGludCBuZXdfc3RkaW4gPSBvcGVuKCIvZGV2L251bGwiLCBPX1JET05MWSk7CisgICAgICAgIGlmIChuZXdfc3RkaW4gPT0gLTEpIF9leGl0KDEyNyk7CisgICAgICAgIGludCBuZXdfc3Rkb3V0ID0gb3BlbigiL2Rldi9udWxsIiwgT19XUk9OTFkpOworICAgICAgICBpZiAobmV3X3N0ZG91dCA9PSAtMSkgX2V4aXQoMTI3KTsKKyAgICAgICAgaW50IG5ld19zdGRlcnIgPSBvcGVuKCIvZGV2L251bGwiLCBPX1dST05MWSk7CisgICAgICAgIGlmIChuZXdfc3RkZXJyID09IC0xKSBfZXhpdCgxMjcpOworICAgICAgICBpZiAoZHVwMihuZXdfc3RkaW4sIDApICE9IDApIF9leGl0KDEyNyk7CisgICAgICAgIGlmIChkdXAyKG5ld19zdGRvdXQsIDEpICE9IDEpIF9leGl0KDEyNyk7CisgICAgICAgIGlmIChkdXAyKG5ld19zdGRlcnIsIDIpICE9IDIpIF9leGl0KDEyNyk7CisgICAgICAgIGV4ZWNsKCIvYmluL3NoIiwgInNoIiwgIi1jIiwgY29tbWFuZCwgbnVsbHB0cik7CisgICAgICAgIF9leGl0KDEyNyk7CisgICAgICB9CisgICAgY2FzZSAtMToKKyAgICAgIHJldHVybiAtMTsKKyAgICBkZWZhdWx0OgorICAgICAgaW50IHN0YXQ7CisgICAgICB3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0LCAwKSA9PSAtMSkgeworICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzdGF0OworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvcnVuX2NvbW1hbmQuaCBiL2Fvcy9jb21tb24vdXRpbC9ydW5fY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTY0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvcnVuX2NvbW1hbmQuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIEFPU19DT01NT05fVVRJTF9SVU5fQ09NTUFORF9IXworI2RlZmluZSBBT1NfQ09NTU9OX1VUSUxfUlVOX0NPTU1BTkRfSF8KKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdXRpbCB7CisKKy8vIEltcHJvdmVkIHJlcGxhY2VtZW50IGZvciBzeXN0ZW0oMykuIERvZXNuJ3QgYmxvY2sgc2lnbmFscyBsaWtlIHN5c3RlbSgzKSBhbmQKKy8vIGlzIHRocmVhZC1zYWZlLiBBbHNvIG1ha2VzIHN1cmUgYWxsIDMgc3RhbmRhcmQgc3RyZWFtcyBhcmUgL2Rldi9udWxsLgorLy8KKy8vIFRoaXMgbWVhbnMgdGhhdCBpdCBwYXNzZXMgY29tbWFuZCB0byBgL2Jpbi9zaCAtY2AgYW5kIHJldHVybnMgLTEgb3IgYSBzdGF0dXMKKy8vIGxpa2UgZnJvbSB3YWl0KDIpLgoraW50IFJ1bkNvbW1hbmQoY29uc3QgY2hhciAqY29tbWFuZCk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9VVElMX1JVTl9DT01NQU5EX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvcnVuX2NvbW1hbmRfdGVzdC5jYyBiL2Fvcy9jb21tb24vdXRpbC9ydW5fY29tbWFuZF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZmYzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvcnVuX2NvbW1hbmRfdGVzdC5jYwpAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3J1bl9jb21tYW5kLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3RocmVhZC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworVEVTVChSdW5Db21tYW5kVGVzdCwgVHJ1ZSkgeworICBpbnQgcmVzdWx0ID0gUnVuQ29tbWFuZCgidHJ1ZSIpOworICBBU1NFUlRfTkUoLTEsIHJlc3VsdCk7CisgIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKDAsIFdFWElUU1RBVFVTKHJlc3VsdCkpOworfQorCitURVNUKFJ1bkNvbW1hbmRUZXN0LCBGYWxzZSkgeworICBpbnQgcmVzdWx0ID0gUnVuQ29tbWFuZCgiZmFsc2UiKTsKKyAgQVNTRVJUX05FKC0xLCByZXN1bHQpOworICBBU1NFUlRfVFJVRShXSUZFWElURUQocmVzdWx0KSk7CisgIEVYUEVDVF9FUSgxLCBXRVhJVFNUQVRVUyhyZXN1bHQpKTsKK30KKworVEVTVChSdW5Db21tYW5kVGVzdCwgQ29tbWFuZE5vdEZvdW5kKSB7CisgIGludCByZXN1bHQgPSBSdW5Db21tYW5kKCJhamZsa2phc2RsZmEiKTsKKyAgQVNTRVJUX05FKC0xLCByZXN1bHQpOworICBBU1NFUlRfVFJVRShXSUZFWElURUQocmVzdWx0KSk7CisgIEVYUEVDVF9FUSgxMjcsIFdFWElUU1RBVFVTKHJlc3VsdCkpOworfQorCitURVNUKFJ1bkNvbW1hbmRUZXN0LCBLaWxsZWRCeVNpZ25hbCkgeworICBpbnQgcmVzdWx0ID0gUnVuQ29tbWFuZCgia2lsbCAtUVVJVCAkJCIpOworICBBU1NFUlRfTkUoLTEsIHJlc3VsdCk7CisgIEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHJlc3VsdCkpOworICBFWFBFQ1RfRVEoU0lHUVVJVCwgV1RFUk1TSUcocmVzdWx0KSk7Cit9CisKK1RFU1QoUnVuQ29tbWFuZFRlc3QsIE11bHRpcGxlVGhyZWFkcykgeworICBpbnQgcmVzdWx0MSwgcmVzdWx0MjsKKyAgdXRpbDo6RnVuY3Rpb25UaHJlYWQgdDEoWyZyZXN1bHQxXSh1dGlsOjpUaHJlYWQgKikgeworICAgIHJlc3VsdDEgPSBSdW5Db21tYW5kKCJ0cnVlIik7CisgIH0pOworICB1dGlsOjpGdW5jdGlvblRocmVhZCB0MihbJnJlc3VsdDJdKHV0aWw6OlRocmVhZCAqKSB7CisgICAgcmVzdWx0MiA9IFJ1bkNvbW1hbmQoInRydWUiKTsKKyAgfSk7CisgIHQxLlN0YXJ0KCk7CisgIHQyLlN0YXJ0KCk7CisgIHQxLldhaXRVbnRpbERvbmUoKTsKKyAgdDIuV2FpdFVudGlsRG9uZSgpOworICBBU1NFUlRfTkUoLTEsIHJlc3VsdDEpOworICBBU1NFUlRfTkUoLTEsIHJlc3VsdDIpOworICBBU1NFUlRfVFJVRShXSUZFWElURUQocmVzdWx0MSkpOworICBBU1NFUlRfVFJVRShXSUZFWElURUQocmVzdWx0MikpOworICBFWFBFQ1RfRVEoMCwgV0VYSVRTVEFUVVMocmVzdWx0MSkpOworICBFWFBFQ1RfRVEoMCwgV0VYSVRTVEFUVVMocmVzdWx0MikpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vdXRpbC9zdHJpbmdfdG9fbnVtLmggYi9hb3MvY29tbW9uL3V0aWwvc3RyaW5nX3RvX251bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWVkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvc3RyaW5nX3RvX251bS5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgQU9TX0NPTU1PTl9VVElMX1NUUklOR19UT19OVU1fSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9VVElMX1NUUklOR19UT19OVU1fSF8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB1dGlsIHsKKworLy8gQ29udmVydHMgYSBzdHJpbmcgaW50byBhIHNwZWNpZmllZCBudW1lcmljIHR5cGUuIElmIGl0IGNhbid0IGJlIGNvbnZlcnRlZAorLy8gY29tcGxldGVseSBvciBhdCBhbGwsIG9yIGlmIHRoZSBjb252ZXJ0ZWQgbnVtYmVyIHdvdWxkIG92ZXJmbG93IHRoZQorLy8gc3BlY2lmaWVkIHR5cGUsIGl0IHJldHVybnMgZmFsc2UuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIGJvb2wgU3RyaW5nVG9OdW1iZXIoY29uc3QgOjpzdGQ6OnN0cmluZyAmaW5wdXQsIFQgKm91dF9udW0pIHsKKyAgOjpzdGQ6OmlzdHJpbmdzdHJlYW0gc3RyZWFtKGlucHV0KTsKKyAgc3RyZWFtID4+ICpvdXRfbnVtOworCisgIGlmIChzdHJlYW0uZmFpbCgpIHx8ICFzdHJlYW0uZW9mKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCit9ICAvLyB1dGlsCit9ICAvLyBhb3MKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvc3RyaW5nX3RvX251bV90ZXN0LmNjIGIvYW9zL2NvbW1vbi91dGlsL3N0cmluZ190b19udW1fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVkZTQyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi91dGlsL3N0cmluZ190b19udW1fdGVzdC5jYwpAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3N0cmluZ190b19udW0uaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK1RFU1QoU3RyaW5nVG9OdW1UZXN0LCBDb3JyZWN0TnVtYmVyKSB7CisgIGludCByZXN1bHQ7CisgIEFTU0VSVF9UUlVFKFN0cmluZ1RvTnVtYmVyPGludD4oOjpzdGQ6OnN0cmluZygiNDIiKSwgJnJlc3VsdCkpOworICBFWFBFQ1RfRVEocmVzdWx0LCA0Mik7Cit9CisKK1RFU1QoU3RyaW5nVG9OdW1UZXN0LCBOZWdhdGl2ZVRlc3QpIHsKKyAgaW50IHJlc3VsdDsKKyAgQVNTRVJUX1RSVUUoU3RyaW5nVG9OdW1iZXI8aW50Pig6OnN0ZDo6c3RyaW5nKCItNDIiKSwgJnJlc3VsdCkpOworICBFWFBFQ1RfRVEocmVzdWx0LCAtNDIpOworfQorCitURVNUKFN0cmluZ1RvTnVtVGVzdCwgTm9uTnVtYmVyKSB7CisgIGludCByZXN1bHQ7CisgIEFTU0VSVF9GQUxTRShTdHJpbmdUb051bWJlcjxpbnQ+KDo6c3RkOjpzdHJpbmcoIkRhbmllbCIpLCAmcmVzdWx0KSk7Cit9CisKK1RFU1QoU3RyaW5nVG9OdW1UZXN0LCBOdW1iZXJXaXRoVGV4dCkgeworICBpbnQgcmVzdWx0OworICBBU1NFUlRfRkFMU0UoU3RyaW5nVG9OdW1iZXI8aW50Pig6OnN0ZDo6c3RyaW5nKCI0MkRhbmllbCIpLCAmcmVzdWx0KSk7Cit9CisKK1RFU1QoU3RyaW5nVG9OdW1UZXN0LCBPdmVyZmxvd1Rlc3QpIHsKKyAgdWludDMyX3QgcmVzdWx0OworICAvLyAyIDw8IDMyIHNob3VsZCBvdmVyZmxvdy4KKyAgQVNTRVJUX0ZBTFNFKFN0cmluZ1RvTnVtYmVyPHVpbnQzMl90Pig6OnN0ZDo6c3RyaW5nKCI0Mjk0OTY3Mjk2IiksICZyZXN1bHQpKTsKK30KKworVEVTVChTdHJpbmdUb051bVRlc3QsIEZsb2F0aW5nUG9pbnRUZXN0KSB7CisgIGRvdWJsZSByZXN1bHQ7CisgIEFTU0VSVF9UUlVFKFN0cmluZ1RvTnVtYmVyPGRvdWJsZT4oOjpzdGQ6OnN0cmluZygiMy4xNDE1OTI3IikpKTsKKyAgRVhQRUNUX0VRKHJlc3VsdCwgMy4xNDE1OTI3KTsKK30KKworfSAgLy8gdGVzdGluZworfSAgLy8gdXRpbAorfSAgLy8gYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvdGhyZWFkLmNjIGIvYW9zL2NvbW1vbi91dGlsL3RocmVhZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE4ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi91dGlsL3RocmVhZC5jYwpAQCAtMCwwICsxLDc2IEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3RocmVhZC5oIgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdXRpbCB7CisKK1RocmVhZDo6VGhyZWFkKCkgOiBzdGFydGVkXyhmYWxzZSksIGpvaW5lZF8oZmFsc2UpLCBzaG91bGRfdGVybWluYXRlXyhmYWxzZSkge30KKworVGhyZWFkOjp+VGhyZWFkKCkgeworICBDSEVDSyghKHN0YXJ0ZWRfICYmICFqb2luZWRfKSk7Cit9CisKK3ZvaWQgVGhyZWFkOjpTdGFydCgpIHsKKyAgQ0hFQ0soIXN0YXJ0ZWRfKTsKKyAgc3RhcnRlZF8gPSB0cnVlOworICBDSEVDSyhwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkXywgTlVMTCwgJlRocmVhZDo6U3RhdGljUnVuLCB0aGlzKSA9PSAwKTsKK30KKwordm9pZCBUaHJlYWQ6OkpvaW4oKSB7CisgIENIRUNLKCFqb2luZWRfICYmIHN0YXJ0ZWRfKTsKKyAgam9pbmVkXyA9IHRydWU7CisgIHNob3VsZF90ZXJtaW5hdGVfLnN0b3JlKHRydWUpOworICBDSEVDSyhwdGhyZWFkX2pvaW4odGhyZWFkXywgTlVMTCkgPT0gMCk7Cit9CisKK2Jvb2wgVGhyZWFkOjpUcnlKb2luKCkgeworICBDSEVDSygham9pbmVkXyAmJiBzdGFydGVkXyk7CisjaWZkZWYgQU9TX1NBTklUSVpFUl90aHJlYWQKKyAgLy8gVGhyZWFkU2FuaXRpemVyIG1pc3NlcyB0aGUgdHJ5am9pbiBhbmQgdGhlbiBjb21wbGFpbnMgYWJvdXQgbGVha2luZyB0aGUKKyAgLy8gdGhyZWFkLiBJbnN0ZWFkLCB3ZSdsbCBqdXN0IGNoZWNrIGlmIHRoZSB0aHJlYWQgaXMgc3RpbGwgYXJvdW5kIGFuZCB0aGVuCisgIC8vIGRvIGEgcmVndWxhciBKb2luKCkgaWZmIGl0IGlzbid0LgorICAvLyBUT0RPKGJyaWFucyk6IFJlbW92ZSB0aGlzIG9uY2UgdHNhbiBsZWFybnMgYWJvdXQgcHRocmVhZF90cnlqb2luX25wLgorICBjb25zdCBpbnQga2lsbF9yZXQgPSBwdGhyZWFkX2tpbGwodGhyZWFkXywgMCk7CisgIC8vIElmIGl0J3Mgc3RpbGwgYXJvdW5kLgorICBpZiAoa2lsbF9yZXQgPT0gMCkgcmV0dXJuIGZhbHNlOworICAvLyBJZiBpdCBkaWVkLCB3ZSdsbCBnZXQgRVNSQ0guIE90aGVyd2lzZSwgc29tZXRoaW5nIHdlbnQgd3JvbmcuCisgIGlmIChraWxsX3JldCAhPSBFU1JDSCkgeworICAgIFBFTE9HKEZBVEFMLCBraWxsX3JldCwgInB0aHJlYWRfa2lsbCh0aHJlYWRfLCAwKSBmYWlsZWQiKTsKKyAgfQorICBKb2luKCk7CisgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgY29uc3QgaW50IHJldCA9IHB0aHJlYWRfdHJ5am9pbl9ucCh0aHJlYWRfLCBudWxscHRyKTsKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgam9pbmVkXyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAocmV0ID09IEVCVVNZKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIFBFTE9HKEZBVEFMLCByZXQsICJwdGhyZWFkX3RyeWpvaW5fbnAodGhyZWFkXywgbnVsbHB0cikgZmFpbGVkIik7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIFRocmVhZDo6UmVxdWVzdFN0b3AoKSB7CisgIENIRUNLKCFqb2luZWRfICYmIHN0YXJ0ZWRfKTsKKyAgc2hvdWxkX3Rlcm1pbmF0ZV8uc3RvcmUodHJ1ZSk7Cit9CisKK3ZvaWQgVGhyZWFkOjpXYWl0VW50aWxEb25lKCkgeworICBDSEVDSygham9pbmVkXyAmJiBzdGFydGVkXyk7CisgIGpvaW5lZF8gPSB0cnVlOworICBDSEVDSyhwdGhyZWFkX2pvaW4odGhyZWFkXywgTlVMTCkgPT0gMCk7Cit9CisKK3ZvaWQgKlRocmVhZDo6U3RhdGljUnVuKHZvaWQgKnNlbGYpIHsKKyAgc3RhdGljX2Nhc3Q8VGhyZWFkICo+KHNlbGYpLT5SdW4oKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvdGhyZWFkLmggYi9hb3MvY29tbW9uL3V0aWwvdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzZTM0MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vdXRpbC90aHJlYWQuaApAQCAtMCwwICsxLDkwIEBACisjaWZuZGVmIEFPU19DT01NT05fVVRJTF9USFJFQURfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9VVElMX1RIUkVBRF9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL21hY3Jvcy5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB1dGlsIHsKKworLy8gQSBuaWNlIHdyYXBwZXIgYXJvdW5kIGEgcHRocmVhZHMgdGhyZWFkLgorLy8KKy8vIFRPRE8oYXNjaHVoKTogVGVzdCB0aGlzLgorY2xhc3MgVGhyZWFkIHsKKyBwdWJsaWM6CisgIFRocmVhZCgpOworICB2aXJ0dWFsIH5UaHJlYWQoKTsKKworICAvLyBBY3R1YWxseSBjcmVhdGVzIHRoZSB0aHJlYWQuCisgIHZvaWQgU3RhcnQoKTsKKworICAvLyBBc2tzIHRoZSBjb2RlIHRvIHN0b3AgYW5kIHRoZW4gd2FpdHMgdW50aWwgaXQgaGFzIGRvbmUgc28uCisgIC8vIFRoaXMgb3IgVHJ5Sm9pbigpIChyZXR1cm5pbmcgdHJ1ZSkgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGZvciBldmVyeQorICAvLyBpbnN0YW5jZS4KKyAgdm9pZCBKb2luKCk7CisKKyAgLy8gSWYgdGhlIGNvZGUgaGFzIGFscmVhZHkgZmluaXNoZWQsIHJldHVybnMgdHJ1ZS4gRG9lcyBub3QgYmxvY2sgd2FpdGluZyBpZgorICAvLyBpdCBpc24ndC4KKyAgLy8gSm9pbigpIG11c3Qgbm90IGJlIGNhbGxlZCBvbiB0aGlzIGluc3RhbmNlIGlmIHRoaXMgcmV0dXJucyB0cnVlLgorICAvLyBUaGlzIG11c3QgcmV0dXJuIHRydWUgb3IgSm9pbigpIG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBmb3IgZXZlcnkKKyAgLy8gaW5zdGFuY2UuCisgIGJvb2wgVHJ5Sm9pbigpOworCisgIC8vIEFza3MgdGhlIGNvZGUgdG8gc3RvcCAoaW4gcHJlcGFyYXRpb24gZm9yIGEgSm9pbigpKS4KKyAgdm9pZCBSZXF1ZXN0U3RvcCgpOworCisgIC8vIFdhaXRzIHVudGlsIHRoZSBjb2RlIGhhcyBzdG9wcGVkLiBEb2VzIG5vdCBhc2sgaXQgdG8gZG8gc28uCisgIHZvaWQgV2FpdFVudGlsRG9uZSgpOworCisgcHJvdGVjdGVkOgorICAvLyBTdWJjbGFzc2VzIG5lZWQgdG8gY2FsbCB0aGlzIHBlcmlvZGljYWxseSBpZiB0aGV5IGFyZSBnb2luZyB0byBsb29wIHRvCisgIC8vIGNoZWNrIHdoZXRoZXIgdGhleSBoYXZlIGJlZW4gYXNrZWQgdG8gc3RvcC4KKyAgYm9vbCBzaG91bGRfY29udGludWUoKSB7CisgICAgcmV0dXJuICFzaG91bGRfdGVybWluYXRlXy5sb2FkKCk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFdoZXJlIHN1YmNsYXNzZXMgYWN0dWFsbHkgZG8gc29tZXRoaW5nLgorICAvLworICAvLyBUaGV5IHNob3VsZCBub3QgYmxvY2sgZm9yIGxvbmcgcGVyaW9kcyBvZiB0aW1lIHdpdGhvdXQgY2hlY2tpbmcKKyAgLy8gc2hvdWxkX2NvbnRpbnVlKCkuCisgIHZpcnR1YWwgdm9pZCBSdW4oKSA9IDA7CisKKyAgc3RhdGljIHZvaWQgKlN0YXRpY1J1bih2b2lkICpzZWxmKTsKKworICBwdGhyZWFkX3QgdGhyZWFkXzsKKyAgYm9vbCBzdGFydGVkXzsKKyAgYm9vbCBqb2luZWRfOworICA6OnN0ZDo6YXRvbWljX2Jvb2wgc2hvdWxkX3Rlcm1pbmF0ZV87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRocmVhZCk7Cit9OworCitjbGFzcyBGdW5jdGlvblRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworIHB1YmxpYzoKKyAgRnVuY3Rpb25UaHJlYWQoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoRnVuY3Rpb25UaHJlYWQgKik+IGZ1bmN0aW9uKQorICAgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pIHt9CisKKyAgLy8gUnVucyBmdW5jdGlvbiBpbiBhIG5ldyB0aHJlYWQgYW5kIHdhaXRzIGZvciBpdCB0byByZXR1cm4uCisgIHN0YXRpYyB2b2lkIFJ1bkluT3RoZXJUaHJlYWQoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZnVuY3Rpb24pIHsKKyAgICBGdW5jdGlvblRocmVhZCB0KFsmZnVuY3Rpb25dKEZ1bmN0aW9uVGhyZWFkICopIHsgZnVuY3Rpb24oKTsgfSk7CisgICAgdC5TdGFydCgpOworICAgIHQuSm9pbigpOworICB9CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgUnVuKCkgb3ZlcnJpZGUgeworICAgIGZ1bmN0aW9uXyh0aGlzKTsKKyAgfQorCisgIGNvbnN0IDo6c3RkOjpmdW5jdGlvbjx2b2lkKEZ1bmN0aW9uVGhyZWFkICopPiBmdW5jdGlvbl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fVVRJTF9USFJFQURfSF8KZGlmZiAtLWdpdCBhL2Fvcy9jb21tb24vdXRpbC90cmFwZXpvaWRfcHJvZmlsZS5jYyBiL2Fvcy9jb21tb24vdXRpbC90cmFwZXpvaWRfcHJvZmlsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhkMDJjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi91dGlsL3RyYXBlem9pZF9wcm9maWxlLmNjCkBAIC0wLDAgKzEsMTMwIEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3RyYXBlem9pZF9wcm9maWxlLmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorCit1c2luZyA6OkVpZ2VuOjpNYXRyaXg7CisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHV0aWwgeworCitUcmFwZXpvaWRQcm9maWxlOjpUcmFwZXpvaWRQcm9maWxlKGNvbnN0IHRpbWU6OlRpbWUgJmRlbHRhX3RpbWUpCisgICAgOiBtYXhpbXVtX2FjY2VsZXJhdGlvbl8oMCksCisgICAgICBtYXhpbXVtX3ZlbG9jaXR5XygwKSwKKyAgICAgIHRpbWVzdGVwXyhkZWx0YV90aW1lKSB7CisgIG91dHB1dF8uc2V0WmVybygpOworfQorCit2b2lkIFRyYXBlem9pZFByb2ZpbGU6OlVwZGF0ZVZhbHMoZG91YmxlIGFjY2VsZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVsdGFfdGltZSkgeworICBvdXRwdXRfKDApICs9IG91dHB1dF8oMSkgKiBkZWx0YV90aW1lICsKKyAgICAgIDAuNSAqIGFjY2VsZXJhdGlvbiAqIGRlbHRhX3RpbWUgKiBkZWx0YV90aW1lOworICBvdXRwdXRfKDEpICs9IGFjY2VsZXJhdGlvbiAqIGRlbHRhX3RpbWU7Cit9CisKK2NvbnN0IE1hdHJpeDxkb3VibGUsIDIsIDE+ICZUcmFwZXpvaWRQcm9maWxlOjpVcGRhdGUoCisgICAgZG91YmxlIGdvYWxfcG9zaXRpb24sCisgICAgZG91YmxlIGdvYWxfdmVsb2NpdHkpIHsKKyAgQ2FsY3VsYXRlVGltZXMoZ29hbF9wb3NpdGlvbiAtIG91dHB1dF8oMCksIGdvYWxfdmVsb2NpdHkpOworCisgIGRvdWJsZSBuZXh0X3RpbWVzdGVwID0gdGltZXN0ZXBfLlRvU2Vjb25kcygpOworCisgIGlmIChhY2NlbGVyYXRpb25fdGltZV8gPiBuZXh0X3RpbWVzdGVwKSB7CisgICAgVXBkYXRlVmFscyhhY2NlbGVyYXRpb25fLCBuZXh0X3RpbWVzdGVwKTsKKyAgfSBlbHNlIHsKKyAgICBVcGRhdGVWYWxzKGFjY2VsZXJhdGlvbl8sIGFjY2VsZXJhdGlvbl90aW1lXyk7CisKKyAgICBuZXh0X3RpbWVzdGVwIC09IGFjY2VsZXJhdGlvbl90aW1lXzsKKyAgICBpZiAoY29uc3RhbnRfdGltZV8gPiBuZXh0X3RpbWVzdGVwKSB7CisgICAgICBVcGRhdGVWYWxzKDAsIG5leHRfdGltZXN0ZXApOworICAgIH0gZWxzZSB7CisgICAgICBVcGRhdGVWYWxzKDAsIGNvbnN0YW50X3RpbWVfKTsKKyAgICAgIG5leHRfdGltZXN0ZXAgLT0gY29uc3RhbnRfdGltZV87CisgICAgICBpZiAoZGVjZWxlcmF0aW9uX3RpbWVfID4gbmV4dF90aW1lc3RlcCkgeworICAgICAgICBVcGRhdGVWYWxzKGRlY2VsZXJhdGlvbl8sIG5leHRfdGltZXN0ZXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVXBkYXRlVmFscyhkZWNlbGVyYXRpb25fLCBkZWNlbGVyYXRpb25fdGltZV8pOworICAgICAgICBuZXh0X3RpbWVzdGVwIC09IGRlY2VsZXJhdGlvbl90aW1lXzsKKyAgICAgICAgVXBkYXRlVmFscygwLCBuZXh0X3RpbWVzdGVwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gb3V0cHV0XzsKK30KKwordm9pZCBUcmFwZXpvaWRQcm9maWxlOjpDYWxjdWxhdGVUaW1lcyhkb3VibGUgZGlzdGFuY2VfdG9fdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZ29hbF92ZWxvY2l0eSkgeworICBpZiAoZGlzdGFuY2VfdG9fdGFyZ2V0ID09IDApIHsKKyAgICAvLyBXZSdyZSB0aGVyZS4gU3RvcCBldmVyeXRoaW5nLgorICAgIC8vIFRPRE8oYXNjaHVoKTogRGVhbCB3aXRoIHZlbG9jaXR5IG5vdCByaWdodC4KKyAgICBhY2NlbGVyYXRpb25fdGltZV8gPSAwOworICAgIGFjY2VsZXJhdGlvbl8gPSAwOworICAgIGNvbnN0YW50X3RpbWVfID0gMDsKKyAgICBkZWNlbGVyYXRpb25fdGltZV8gPSAwOworICAgIGRlY2VsZXJhdGlvbl8gPSAwOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChkaXN0YW5jZV90b190YXJnZXQgPCAwKSB7CisgICAgLy8gUmVjdXJzZSB3aXRoIGV2ZXJ5dGhpbmcgaW52ZXJ0ZWQuCisgICAgb3V0cHV0XygxKSAqPSAtMTsKKyAgICBDYWxjdWxhdGVUaW1lcygtZGlzdGFuY2VfdG9fdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgIC1nb2FsX3ZlbG9jaXR5KTsKKyAgICBvdXRwdXRfKDEpICo9IC0xOworICAgIGFjY2VsZXJhdGlvbl8gKj0gLTE7CisgICAgZGVjZWxlcmF0aW9uXyAqPSAtMTsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdGFudF90aW1lXyA9IDA7CisgIGFjY2VsZXJhdGlvbl8gPSBtYXhpbXVtX2FjY2VsZXJhdGlvbl87CisgIGRvdWJsZSBtYXhpbXVtX2FjY2VsZXJhdGlvbl92ZWxvY2l0eSA9IGRpc3RhbmNlX3RvX3RhcmdldCAqIDIgKgorICAgICAgc3RkOjphYnMoYWNjZWxlcmF0aW9uXykgKyBvdXRwdXRfKDEpICogb3V0cHV0XygxKTsKKyAgaWYgKG1heGltdW1fYWNjZWxlcmF0aW9uX3ZlbG9jaXR5ID4gMCkgeworICAgIG1heGltdW1fYWNjZWxlcmF0aW9uX3ZlbG9jaXR5ID0gc3FydChtYXhpbXVtX2FjY2VsZXJhdGlvbl92ZWxvY2l0eSk7CisgIH0gZWxzZSB7CisgICAgbWF4aW11bV9hY2NlbGVyYXRpb25fdmVsb2NpdHkgPSAtc3FydCgtbWF4aW11bV9hY2NlbGVyYXRpb25fdmVsb2NpdHkpOworICB9CisKKyAgLy8gU2luY2Ugd2Uga25vdyB3aGF0IHdlJ2QgaGF2ZSB0byBkbyBpZiB3ZSBrZXB0IGFmdGVyIGl0IHRvIGRlY2VsZXJhdGUsIHdlCisgIC8vIGtub3cgdGhlIHNpZ24gb2YgdGhlIGFjY2VsZXJhdGlvbi4KKyAgaWYgKG1heGltdW1fYWNjZWxlcmF0aW9uX3ZlbG9jaXR5ID4gZ29hbF92ZWxvY2l0eSkgeworICAgIGRlY2VsZXJhdGlvbl8gPSAtbWF4aW11bV9hY2NlbGVyYXRpb25fOworICB9IGVsc2UgeworICAgIGRlY2VsZXJhdGlvbl8gPSBtYXhpbXVtX2FjY2VsZXJhdGlvbl87CisgIH0KKworICAvLyBXZSBub3cga25vdyB0aGUgdG9wIHZlbG9jaXR5IHdlIGNhbiBnZXQgdG8uCisgIGRvdWJsZSB0b3BfdmVsb2NpdHkgPSBzcXJ0KChkaXN0YW5jZV90b190YXJnZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dF8oMSkgKiBvdXRwdXRfKDEpKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMi4wICogYWNjZWxlcmF0aW9uXykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYWxfdmVsb2NpdHkgKiBnb2FsX3ZlbG9jaXR5KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMi4wICogZGVjZWxlcmF0aW9uXykpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjAgLyAoMi4wICogZGVjZWxlcmF0aW9uXykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wIC8gKDIuMCAqIGFjY2VsZXJhdGlvbl8pKSk7CisKKyAgLy8gSWYgaXQgY2FuIGdvIHRvbyBmYXN0LCB3ZSBub3cga25vdyBob3cgbG9uZyB3ZSBnZXQgdG8gYWNjZWxlcmF0ZSBmb3IgYW5kCisgIC8vIGhvdyBsb25nIHRvIGdvIGF0IGNvbnN0YW50IHZlbG9jaXR5LgorICBpZiAodG9wX3ZlbG9jaXR5ID4gbWF4aW11bV92ZWxvY2l0eV8pIHsKKyAgICBhY2NlbGVyYXRpb25fdGltZV8gPSAobWF4aW11bV92ZWxvY2l0eV8gLSBvdXRwdXRfKDEpKSAvCisgICAgICAgIG1heGltdW1fYWNjZWxlcmF0aW9uXzsKKyAgICBjb25zdGFudF90aW1lXyA9IChkaXN0YW5jZV90b190YXJnZXQgKworICAgICAgICAgICAgICAgICAgICAgIChnb2FsX3ZlbG9jaXR5ICogZ29hbF92ZWxvY2l0eSAtCisgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW1fdmVsb2NpdHlfICogbWF4aW11bV92ZWxvY2l0eV8pIC8KKyAgICAgICAgICAgICAgICAgICAgICAoMi4wICogbWF4aW11bV9hY2NlbGVyYXRpb25fKSkgLyBtYXhpbXVtX3ZlbG9jaXR5XzsKKyAgfSBlbHNlIHsKKyAgICBhY2NlbGVyYXRpb25fdGltZV8gPSAodG9wX3ZlbG9jaXR5IC0gb3V0cHV0XygxKSkgLworICAgICAgICBhY2NlbGVyYXRpb25fOworICB9CisKKyAgQ0hFQ0tfR1QodG9wX3ZlbG9jaXR5LCAtbWF4aW11bV92ZWxvY2l0eV8pOworCisgIGlmIChvdXRwdXRfKDEpID4gbWF4aW11bV92ZWxvY2l0eV8pIHsKKyAgICBjb25zdGFudF90aW1lXyA9IDA7CisgICAgYWNjZWxlcmF0aW9uX3RpbWVfID0gMDsKKyAgfQorCisgIGRlY2VsZXJhdGlvbl90aW1lXyA9IChnb2FsX3ZlbG9jaXR5IC0gdG9wX3ZlbG9jaXR5KSAvCisgICAgICBkZWNlbGVyYXRpb25fOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi91dGlsL3RyYXBlem9pZF9wcm9maWxlLmggYi9hb3MvY29tbW9uL3V0aWwvdHJhcGV6b2lkX3Byb2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTYzMzUyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi91dGlsL3RyYXBlem9pZF9wcm9maWxlLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1VUSUxfVFJBUEVaT0lEX1BST0ZJTEVfSF8KKyNkZWZpbmUgQU9TX0NPTU1PTl9VVElMX1RSQVBFWk9JRF9QUk9GSUxFX0hfCisKKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKworI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHV0aWwgeworCisvLyBDYWxjdWxhdGVzIGEgdHJhcGV6b2lkYWwgbW90aW9uIHByb2ZpbGUgKGxpa2UgZm9yIGEgY29udHJvbCBsb29wJ3MgZ29hbHMpLgorLy8gU3VwcG9ydHMgaGF2aW5nIHRoZSBlbmQgc3BlZWQgYW5kIHBvc2l0aW9uIGNoYW5nZWQgaW4gdGhlIG1pZGRsZS4KKy8vCisvLyBUaGUgb25seSB1bml0cyBhc3N1bXB0aW9uIHRoYXQgdGhpcyBjbGFzcyBtYWtlcyBpcyB0aGF0IHRoZSB1bml0IG9mIHRpbWUgaXMKKy8vIHNlY29uZHMuCitjbGFzcyBUcmFwZXpvaWRQcm9maWxlIHsKKyBwdWJsaWM6CisgIC8vIGRlbHRhX3RpbWUgaXMgaG93IGxvbmcgYmV0d2VlbiBlYWNoIGNhbGwgdG8gVXBkYXRlLgorICBUcmFwZXpvaWRQcm9maWxlKGNvbnN0IHRpbWU6OlRpbWUgJmRlbHRhX3RpbWUpOworCisgIC8vIFVwZGF0ZXMgdGhlIHN0YXRlLgorICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gJlVwZGF0ZShkb3VibGUgZ29hbF9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGdvYWxfdmVsb2NpdHkpOworICAvLyBVc2VmdWwgZm9yIHByZXZlbnRpbmcgd2luZHVwIGV0Yy4KKyAgdm9pZCBNb3ZlQ3VycmVudFN0YXRlKGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiAmY3VycmVudCkgeworICAgIG91dHB1dF8gPSBjdXJyZW50OworICB9CisKKyAgLy8gVXNlZnVsIGZvciBwcmV2ZW50aW5nIHdpbmR1cCBldGMuCisgIHZvaWQgTW92ZUdvYWwoZG91YmxlIGR4KSB7IG91dHB1dF8oMCwgMCkgKz0gZHg7IH0KKworICB2b2lkIFNldEdvYWwoZG91YmxlIHgpIHsgb3V0cHV0XygwLCAwKSA9IHg7IH0KKworICB2b2lkIHNldF9tYXhpbXVtX2FjY2VsZXJhdGlvbihkb3VibGUgbWF4aW11bV9hY2NlbGVyYXRpb24pIHsKKyAgICBtYXhpbXVtX2FjY2VsZXJhdGlvbl8gPSBtYXhpbXVtX2FjY2VsZXJhdGlvbjsKKyAgfQorICB2b2lkIHNldF9tYXhpbXVtX3ZlbG9jaXR5KGRvdWJsZSBtYXhpbXVtX3ZlbG9jaXR5KSB7CisgICAgbWF4aW11bV92ZWxvY2l0eV8gPSBtYXhpbXVtX3ZlbG9jaXR5OworICB9CisKKyBwcml2YXRlOgorICAvLyBCYXNpYyBraW5lbWF0aWNzIHRvIHVwZGF0ZSBvdXRwdXRfLCBnaXZlbiB0aGF0IHdlIGFyZSBnb2luZyB0byBhY2NlbGVyYXRlCisgIC8vIGJ5IGFjY2VsZXJhdGlvbiBvdmVyIGRlbHRhX3RpbWUuCisgIHZvaWQgVXBkYXRlVmFscyhkb3VibGUgYWNjZWxlcmF0aW9uLCBkb3VibGUgZGVsdGFfdGltZSk7CisgIC8vIENhbGN1bGF0ZXMgaG93IGxvbmcgdG8gZ28gZm9yIGVhY2ggc2VnbWVudC4KKyAgdm9pZCBDYWxjdWxhdGVUaW1lcyhkb3VibGUgZGlzdGFuY2VfdG9fdGFyZ2V0LCBkb3VibGUgZ29hbF92ZWxvY2l0eSk7CisgIC8vIG91dHB1dF8gaXMgd2hlcmUgaXQgc2hvdWxkIGdvIGF0IHRpbWVfLgorICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gb3V0cHV0XzsKKworICBkb3VibGUgYWNjZWxlcmF0aW9uX3RpbWVfOworICBkb3VibGUgYWNjZWxlcmF0aW9uXzsKKyAgZG91YmxlIGNvbnN0YW50X3RpbWVfOworICBkb3VibGUgZGVjZWxlcmF0aW9uX3RpbWVfOworICBkb3VibGUgZGVjZWxlcmF0aW9uXzsKKworICBkb3VibGUgbWF4aW11bV9hY2NlbGVyYXRpb25fOworICBkb3VibGUgbWF4aW11bV92ZWxvY2l0eV87CisKKyAgLy8gSG93IGxvbmcgYmV0d2VlbiBjYWxscyB0byBVcGRhdGUuCisgIGNvbnN0IHRpbWU6OlRpbWUgdGltZXN0ZXBfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFwZXpvaWRQcm9maWxlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0NPTU1PTl9VVElMX1RSQVBFWk9JRF9QUk9GSUxFX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvdHJhcGV6b2lkX3Byb2ZpbGVfdGVzdC5jYyBiL2Fvcy9jb21tb24vdXRpbC90cmFwZXpvaWRfcHJvZmlsZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZmVmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29tbW9uL3V0aWwvdHJhcGV6b2lkX3Byb2ZpbGVfdGVzdC5jYwpAQCAtMCwwICsxLDExNiBAQAorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKworI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC90cmFwZXpvaWRfcHJvZmlsZS5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB1dGlsIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgVHJhcGV6b2lkUHJvZmlsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVc7CisKKyBwcm90ZWN0ZWQ6CisgIFRyYXBlem9pZFByb2ZpbGVUZXN0KCkgOiBwcm9maWxlXyhkZWx0YV90aW1lKSB7CisgICAgcG9zaXRpb25fLnNldFplcm8oKTsKKyAgICBwcm9maWxlXy5zZXRfbWF4aW11bV9hY2NlbGVyYXRpb24oMC43NSk7CisgICAgcHJvZmlsZV8uc2V0X21heGltdW1fdmVsb2NpdHkoMS43NSk7CisgIH0KKworICAvLyBSdW5zIGFuIGl0ZXJhdGlvbi4KKyAgdm9pZCBSdW5JdGVyYXRpb24oZG91YmxlIGdvYWxfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBnb2FsX3ZlbG9jaXR5KSB7CisgICAgcG9zaXRpb25fID0gcHJvZmlsZV8uVXBkYXRlKGdvYWxfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYWxfdmVsb2NpdHkpOworICB9CisKKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+ICZwb3NpdGlvbigpIHsgcmV0dXJuIHBvc2l0aW9uXzsgfQorCisgIFRyYXBlem9pZFByb2ZpbGUgcHJvZmlsZV87CisKKyAgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgQXQoZG91YmxlIHBvc2l0aW9uLCBkb3VibGUgdmVsb2NpdHkpIHsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtEb3VibGVOZWFyID0gMC4wMDAwMTsKKyAgICBpZiAoOjpzdGQ6OmFicyh2ZWxvY2l0eSAtIHBvc2l0aW9uXygxKSkgPiBrRG91YmxlTmVhcikgeworICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJ2ZWxvY2l0eSBpcyAiIDw8IHBvc2l0aW9uXygxKSA8PAorICAgICAgICAgICIgbm90ICIgPDwgdmVsb2NpdHk7CisgICAgfQorICAgIGlmICg6OnN0ZDo6YWJzKHBvc2l0aW9uIC0gcG9zaXRpb25fKDApKSA+IGtEb3VibGVOZWFyKSB7CisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgInBvc2l0aW9uIGlzICIgPDwgcG9zaXRpb25fKDApIDw8CisgICAgICAgICAgIiBub3QgIiA8PCBwb3NpdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpIDw8ICJhdCAiIDw8IHBvc2l0aW9uIDw8CisgICAgICAgICIgbW92aW5nIGF0ICIgPDwgdmVsb2NpdHk7CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCB0aW1lOjpUaW1lIGRlbHRhX3RpbWU7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHBvc2l0aW9uXzsKK307Citjb25zdCB0aW1lOjpUaW1lIFRyYXBlem9pZFByb2ZpbGVUZXN0OjpkZWx0YV90aW1lID0gdGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMDEpOworCitURVNUX0YoVHJhcGV6b2lkUHJvZmlsZVRlc3QsIFJlYWNoZXNHb2FsKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDUwOyArK2kpIHsKKyAgICBSdW5JdGVyYXRpb24oMywgMCk7CisgIH0KKyAgRVhQRUNUX1RSVUUoQXQoMywgMCkpOworfQorCisvLyBUZXN0cyB0aGF0IGRlY3Jlc2luZyB0aGUgbWF4aW11bSB2ZWxvY2l0eSBpbiB0aGUgbWlkZGxlIHdoZW4gaXQgaXMgYWxyZWFkeQorLy8gbW92aW5nIGZhc3RlciB0aGFuIHRoZSBuZXcgbWF4IGlzIGhhbmRsZWQgY29ycmVjdGx5LgorVEVTVF9GKFRyYXBlem9pZFByb2ZpbGVUZXN0LCBDb250aW5vdXNVbmRlclZlbENoYW5nZSkgeworICBwcm9maWxlXy5zZXRfbWF4aW11bV92ZWxvY2l0eSgxLjc1KTsKKyAgUnVuSXRlcmF0aW9uKDEyLjAsIDApOworICBkb3VibGUgbGFzdF9wb3MgPSBwb3NpdGlvbigpKDApOworICBkb3VibGUgbGFzdF92ZWwgPSAxLjc1OworICBmb3IgKGludCBpID0gMDsgaSA8IDE2MDA7ICsraSkgeworICAgIGlmIChpID09IDQwMCkgeworICAgICAgcHJvZmlsZV8uc2V0X21heGltdW1fdmVsb2NpdHkoMC43NSk7CisgICAgfQorICAgIFJ1bkl0ZXJhdGlvbigxMi4wLCAwKTsKKyAgICBpZiAoaSA+PSA0MDApIHsKKyAgICAgIEVYUEVDVF9UUlVFKDo6c3RkOjphYnMobGFzdF9wb3MgLSBwb3NpdGlvbigpKDApKSA8PSAxLjc1ICogMC4wMSk7CisgICAgICBFWFBFQ1RfTkVBUihsYXN0X3ZlbCwgOjpzdGQ6OmFicyhsYXN0X3BvcyAtIHBvc2l0aW9uKCkoMCkpLCAwLjAwMDEpOworICAgIH0KKyAgICBsYXN0X3ZlbCA9IDo6c3RkOjphYnMobGFzdF9wb3MgLSBwb3NpdGlvbigpKDApKTsKKyAgICBsYXN0X3BvcyA9IHBvc2l0aW9uKCkoMCk7CisgIH0KKyAgRVhQRUNUX1RSVUUoQXQoMTIuMCwgMCkpOworfQorCisvLyBUaGVyZSBpcyBzb21lIHNvbWV3aGF0IHRyaWNreSBjb2RlIGZvciBkZWFsaW5nIHdpdGggZ29pbmcgYmFja3dhcmRzLgorVEVTVF9GKFRyYXBlem9pZFByb2ZpbGVUZXN0LCBCYWNrd2FyZHMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDA7ICsraSkgeworICAgIFJ1bkl0ZXJhdGlvbigtMiwgMCk7CisgIH0KKyAgRVhQRUNUX1RSVUUoQXQoLTIsIDApKTsKK30KKworVEVTVF9GKFRyYXBlem9pZFByb2ZpbGVUZXN0LCBTd2l0Y2hHb2FsSW5NaWRkbGUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7ICsraSkgeworICAgIFJ1bkl0ZXJhdGlvbigtMiwgMCk7CisgIH0KKyAgRVhQRUNUX0ZBTFNFKEF0KC0yLCAwKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTUwOyArK2kpIHsKKyAgICBSdW5JdGVyYXRpb24oMCwgMCk7CisgIH0KKyAgRVhQRUNUX1RSVUUoQXQoMCwgMCkpOworfQorCisvLyBDaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaGl0cyB0b3Agc3BlZWQuCitURVNUX0YoVHJhcGV6b2lkUHJvZmlsZVRlc3QsIFRvcFNwZWVkKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyArK2kpIHsKKyAgICBSdW5JdGVyYXRpb24oNCwgMCk7CisgIH0KKyAgRVhQRUNUX05FQVIoMS41LCBwb3NpdGlvbigpKDEpLCAxMGUtNSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwMDsgKytpKSB7CisgICAgUnVuSXRlcmF0aW9uKDQsIDApOworICB9CisgIEVYUEVDVF9UUlVFKEF0KDQsIDApKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvdXRpbC5neXAgYi9hb3MvY29tbW9uL3V0aWwvdXRpbC5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhMzdjOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vdXRpbC91dGlsLmd5cApAQCAtMCwwICsxLDE1MyBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncnVuX2NvbW1hbmQnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdydW5fY29tbWFuZC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmdfaW50ZXJmYWNlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncnVuX2NvbW1hbmRfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAncnVuX2NvbW1hbmRfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3J1bl9jb21tYW5kJywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJ3RocmVhZCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RlYXRoX3Rlc3RfbG9nX2ltcGxlbWVudGF0aW9uJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAjJ2RlYXRoX3Rlc3RfbG9nX2ltcGxlbWVudGF0aW9uJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaW5ldF9hZGRyJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnaW5ldF9hZGRyLmNjJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncGhhc2VkX2xvb3AnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdwaGFzZWRfbG9vcC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsb2dfaW50ZXJ2YWwnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICMnbG9nX2ludGVydmFsLmgnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzdHJpbmdfdG9fbnVtJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAjJ3N0cmluZ190b19udW0uaCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0cmluZ190b19udW1fdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnc3RyaW5nX3RvX251bV90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnOnN0cmluZ190b19udW0nLAorICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAndGhyZWFkJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAndGhyZWFkLmNjJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAndHJhcGV6b2lkX3Byb2ZpbGUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICd0cmFwZXpvaWRfcHJvZmlsZS5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTplaWdlbicsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTplaWdlbicsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3RyYXBlem9pZF9wcm9maWxlX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3RyYXBlem9pZF9wcm9maWxlX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc6dHJhcGV6b2lkX3Byb2ZpbGUnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnd3JhcHBpbmdfY291bnRlcicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3dyYXBwaW5nX2NvdW50ZXIuY2MnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICd3cmFwcGluZ19jb3VudGVyX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3dyYXBwaW5nX2NvdW50ZXJfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3dyYXBwaW5nX2NvdW50ZXInLAorICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnb3B0aW9uc190ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdvcHRpb25zX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi91dGlsL3dyYXBwaW5nX2NvdW50ZXIuY2MgYi9hb3MvY29tbW9uL3V0aWwvd3JhcHBpbmdfY291bnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWY1MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi91dGlsL3dyYXBwaW5nX2NvdW50ZXIuY2MKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC93cmFwcGluZ19jb3VudGVyLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHV0aWwgeworCitXcmFwcGluZ0NvdW50ZXI6OldyYXBwaW5nQ291bnRlcihpbnQzMl90IGluaXRpYWxfY291bnQpCisgICAgOiBjb3VudF8oaW5pdGlhbF9jb3VudCksIGxhc3RfY291bnRfKDApIHt9CisKK2ludDMyX3QgV3JhcHBpbmdDb3VudGVyOjpVcGRhdGUodWludDhfdCBjdXJyZW50KSB7CisgIGlmIChsYXN0X2NvdW50XyA+IGN1cnJlbnQpIHsKKyAgICBjb3VudF8gKz0gMHgxMDA7CisgIH0KKyAgY291bnRfID0gKGNvdW50XyAmIDB4ZmZmZmZmMDApIHwgY3VycmVudDsKKyAgbGFzdF9jb3VudF8gPSBjdXJyZW50OworICByZXR1cm4gY291bnRfOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbW1vbi91dGlsL3dyYXBwaW5nX2NvdW50ZXIuaCBiL2Fvcy9jb21tb24vdXRpbC93cmFwcGluZ19jb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmMzYxMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb21tb24vdXRpbC93cmFwcGluZ19jb3VudGVyLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBBT1NfQ09NTU9OX1VUSUxfV1JBUFBJTkdfQ09VTlRFUl9IXworI2RlZmluZSBBT1NfQ09NTU9OX1VUSUxfV1JBUFBJTkdfQ09VTlRFUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIHV0aWwgeworCisvLyBEZWFscyBjb3JyZWN0bHkgd2l0aCAxLWJ5dGUgY291bnRlcnMgd2hpY2ggd3JhcC4KKy8vIFRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgY291bnRlciBuZXZlciB3cmFwcyB0d2ljZSBiZXR3ZWVuIFVwZGF0ZSBjYWxscy4KKy8vIEl0IHdpbGwgYWxzbyBmYWlsIGlmIHRoZSBjb3VudGVyIGV2ZXIgZ29lcyBkb3duICh0aGF0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMKKy8vICsyNTUgaW5zdGVhZCBvZiAtMSwgZm9yIGV4YW1wbGUpLgorY2xhc3MgV3JhcHBpbmdDb3VudGVyIHsKKyBwdWJsaWM6CisgIFdyYXBwaW5nQ291bnRlcihpbnQzMl90IGluaXRpYWxfY291bnQgPSAwKTsKKworICAvLyBVcGRhdGVzIHRoZSBpbnRlcm5hbCBjb3VudGVyIHdpdGggYSBuZXcgcmF3IHZhbHVlLgorICAvLyBSZXR1cm5zIGNvdW50KCkgZm9yIGNvbnZlbmllbmNlLgorICBpbnQzMl90IFVwZGF0ZSh1aW50OF90IGN1cnJlbnQpOworCisgIC8vIFJlc2V0cyB0aGUgYWN0dWFsIGNvdW50IHRvIHZhbHVlLgorICB2b2lkIFJlc2V0KGludDMyX3QgdmFsdWUgPSAwKSB7IGNvdW50XyA9IHZhbHVlOyB9CisKKyAgaW50MzJfdCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIGNvdW50XzsgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCBjb3VudF87CisgIHVpbnQ4X3QgbGFzdF9jb3VudF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19DT01NT05fVVRJTF9XUkFQUElOR19DT1VOVEVSX0hfCmRpZmYgLS1naXQgYS9hb3MvY29tbW9uL3V0aWwvd3JhcHBpbmdfY291bnRlcl90ZXN0LmNjIGIvYW9zL2NvbW1vbi91dGlsL3dyYXBwaW5nX2NvdW50ZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjU3ZmIwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbW1vbi91dGlsL3dyYXBwaW5nX2NvdW50ZXJfdGVzdC5jYwpAQCAtMCwwICsxLDU4IEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3dyYXBwaW5nX2NvdW50ZXIuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK1RFU1QoV3JhcHBpbmdDb3VudGVyVGVzdCwgQmFzaWMpIHsKKyAgV3JhcHBpbmdDb3VudGVyIHRlc3RfY291bnRlcjsKKyAgRVhQRUNUX0VRKDAsIHRlc3RfY291bnRlci5jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIHRlc3RfY291bnRlci5VcGRhdGUoMSkpOworICBFWFBFQ1RfRVEoMSwgdGVzdF9jb3VudGVyLlVwZGF0ZSgxKSk7CisgIEVYUEVDVF9FUSgyLCB0ZXN0X2NvdW50ZXIuVXBkYXRlKDIpKTsKKyAgRVhQRUNUX0VRKDcsIHRlc3RfY291bnRlci5VcGRhdGUoNykpOworICBFWFBFQ1RfRVEoNywgdGVzdF9jb3VudGVyLmNvdW50KCkpOworICBFWFBFQ1RfRVEoMTIzLCB0ZXN0X2NvdW50ZXIuVXBkYXRlKDEyMykpOworICBFWFBFQ1RfRVEoMTIzLCB0ZXN0X2NvdW50ZXIuY291bnQoKSk7Cit9CisKK1RFU1QoV3JhcHBpbmdDb3VudGVyVGVzdCwgUmVzZXQpIHsKKyAgV3JhcHBpbmdDb3VudGVyIHRlc3RfY291bnRlcjsKKyAgdGVzdF9jb3VudGVyLlVwZGF0ZSg1KTsKKyAgdGVzdF9jb3VudGVyLlJlc2V0KCk7CisgIEVYUEVDVF9FUSgwLCB0ZXN0X2NvdW50ZXIuY291bnQoKSk7CisgIHRlc3RfY291bnRlci5SZXNldCg1Nik7CisgIEVYUEVDVF9FUSg1NiwgdGVzdF9jb3VudGVyLmNvdW50KCkpOworfQorCituYW1lc3BhY2Ugewordm9pZCB0ZXN0X3dyYXBwaW5nKGludDE2X3Qgc3RhcnQsIGludDE2X3Qgc3RlcCkgeworICBXcmFwcGluZ0NvdW50ZXIgdGVzdF9jb3VudGVyOworICBmb3IgKGludDE2X3QgaSA9IHN0YXJ0OyBpIDwgSU5UMTZfTUFYIC0gc3RlcDsgaSArPSBzdGVwKSB7CisgICAgRVhQRUNUX0VRKGksIHRlc3RfY291bnRlci5VcGRhdGUoaSAmIDB4RkYpKTsKKyAgfQorfQorfQorCisvLyBUaGlzIHRlc3RzIHRoZSBiYXNpYyB3cmFwcGluZyBmdW5jdGlvbmFsaXR5LgorVEVTVChXcmFwcGluZ0NvdW50ZXJUZXN0LCBSZWFzb25hYmxlV3JhcHBpbmcpIHsKKyAgdGVzdF93cmFwcGluZygwLCAxMyk7CisgIHRlc3Rfd3JhcHBpbmcoMCwgNTMpOworICB0ZXN0X3dyYXBwaW5nKDAsIDY0KTsKKyAgdGVzdF93cmFwcGluZygwLCA3Myk7Cit9CisKKy8vIEl0IHdvdWxkIGJlIHJlYXNvbmFibGUgZm9yIHRoZXNlIHRvIGZhaWwgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZXMuCitURVNUKFdyYXBwaW5nQ291bnRlclRlc3QsIFVucmVhc29uYWJsZVdyYXBwaW5nKSB7CisgIHRlc3Rfd3JhcHBpbmcoMCwgMTI4KTsKKyAgdGVzdF93cmFwcGluZygwLCAyMTMpOworICB0ZXN0X3dyYXBwaW5nKDAsIDI1NSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2NvbmZpZy8xMC1uZXQtZXRoMC5ydWxlcyBiL2Fvcy9jb25maWcvMTAtbmV0LWV0aDAucnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4ZDgwNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb25maWcvMTAtbmV0LWV0aDAucnVsZXMKQEAgLTAsMCArMSw2IEBACisjIFRoaXMgaXMgYSBmaWxlIHRoYXQgd2lsbCBtYWtlIGFueSBOSUMgZXRoMC4KKyMgSXQgcHJldmVudHMgdGhlIHBlcnNpc3RlbnQgbmV0IHJ1bGVzIGdlbmVyYXRvciBmcm9tIHJ1bm5pbmcgYmVjYXVzZSB0aGF0IGVuZHMKKyMgdXAgbmFtaW5nIHRoZSAxIE5JQyBldGgxIGluc3RlYWQgb2Ygd2hlbiB5b3UgbW92ZSBhIGRpc2sgYmV0d2VlbiBib3hlcy4KKyMgUHV0IGl0IGluIC9ldGMvdWRldi9ydWxlcy5kLyB0byB1c2UgaXQuCisKK1NVQlNZU1RFTT09Im5ldCIsIEFDVElPTj09ImFkZCIsIEFUVFJ7dHlwZX09PSIxIiwgS0VSTkVMPT0iZXRoKiIsIE5BTUU9ImV0aDAiCmRpZmYgLS1naXQgYS9hb3MvY29uZmlnL2Fvcy5jb25mIGIvYW9zL2NvbmZpZy9hb3MuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGEyNTBmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbmZpZy9hb3MuY29uZgpAQCAtMCwwICsxLDYgQEAKKyMgcHV0IHRoaXMgZmlsZSBpbiAvZXRjL3NlY3VyaXR5L2xpbWl0cy5kLyB0byBtYWtlIGl0IHdvcmsKKyMgeW91IGhhdmUgdG8gY3JlYXRlIGEgZ3JvdXAgbmFtZWQgYW9zIChncm91cGFkZCBhb3MpIGFuZCB0aGVuIGFkZCBhbnlib2R5IHlvdSB3YW50IHRvIGl0ICh2aW0gL2V0Yy9ncm91cCkKKyMgU2VlIGxpbWl0cy5jb25mKDUpIGZvciBkZXRhaWxzLgorCitAYW9zIGhhcmQgbWVtbG9jayB1bmxpbWl0ZWQKK0Bhb3MgaGFyZCBydHByaW8gNDAKZGlmZiAtLWdpdCBhL2Fvcy9jb25maWcvY29uZmlndXJlLXByaW1lLnR4dCBiL2Fvcy9jb25maWcvY29uZmlndXJlLXByaW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWRhY2NkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2NvbmZpZy9jb25maWd1cmUtcHJpbWUudHh0CkBAIC0wLDAgKzEsNzkgQEAKK1RoaXMgZmlsZSBjb250YWlucyBub3RlcyBvbiBzZXR0aW5nIHVwIGEgbmV3IEJCQiBpbWFnZS4KK0RvaW5nIGl0IHJpZ2h0IHJlcXVpcmVzIGtub3dpbmcgd2hhdCB5b3UncmUgZG9pbmcgYXMgYSBEZWJpYW4gc3lzYWRtaW4sIHNvIHRoZQorbWFpbiBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBhdm9pZCBmb3JnZXR0aW5nIGFueXRoaW5nLgorCitEYW5pZWwgbGFzdCB1cGRhdGVkIHRoaXMgb24gMjAxNC0wMS0yMCB3aXRoIERlYmlhbiBXaGVlenkuCisKKzEuICBJbnN0YWxsIERlYmlhbiBzdGFibGUuCisgICAgRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZToKKyAgICBodHRwOi8vYmxvZ3MuYnUuZWR1L21oaXJzY2gvMjAxMy8xMS9pbnN0YWxsLWRlYmlhbi03LXRvLWVtbWMtaW50ZXJuYWwtZmxhc2gtZHJpdmUtb2YtYmVhZ2xlYm9uZS1ibGFjay8KKyAgICBDcmVhdGUgYSAiZHJpdmVyIiB1c2VyLgorMi4gIEluc3RhbGwgYW9zLmNvbmYgYW5kIHN0YXJ0ZXIuCisJICBJIGp1c3QgY2hhbmdlZCBhb3MuY29uZiB0byBnaXZlIGRyaXZlciBwZXJtaXNzaW9ucyBpbnN0ZWFkIG9mIHRoZSBncm91cC4KKzMuICBJbnN0YWxsIGFuZCBjb25maWd1cmUgZXhpbTQuCisgICAgVE9ETyAoZGFuaWVsKTogV2UgbWlnaHQgbm90IG5lZWQgdGhpcy4KKyAgICBgYXB0LWdldCBpbnN0YWxsIGV4aW00LWNvbmZpZ2AKKyAgICBgZHBrZy1yZWNvbmZpZ3VyZSBleGltNC1jb25maWdgIGFuZCBzZWxlY3QgdGhlIG9wdGlvbiBmb3IgbWFraW5nIG1pbmltYWwKKyAgICBETlMgcXVlcmllcyAoaXQgYWxzbyBzYXlzIHNvbWUganVuayBhYm91dCBtb2RlbXMpLgorNC4gIENvbmZpZ3VyZSB0aGUgbmV0d29yay4KKyAgICBFZGl0IC9ldGMvbmV0d29yay9pbnRlcmZhY2VzIHRvIGdpdmUgaXQgdGhlIHJpZ2h0IHN0YXRpYyBJUCBhZGRyZXNzLgorCSAgU2V0IHVwIGV0aDEgbGlrZSB0aGUgZGVmYXVsdCBldGgwIGluIGNhc2UgdGhlIE5JQyBnZXRzIGFzc2lnbmVkIHRoYXQgKHNlZQorICAgICM4IGJlbG93KS4gVGhhdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIGFueSBtb3JlLCBidXQgaXQncyBwcm9iYWJseSBnb29kCisJCXRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgYmVjYXVzZSBpdCBjYW4gYmUgYSBwYWluIHRvIGZpbmQgYSBzY3JlZW4gdG8gZml4CisJCWl0IG90aGVyd2lzZS4KKzUuICBJbnN0YWxsIHN0dWZmLgorICAgIFRoaXMgaW5jbHVkZXMgdGhlIHJlYWx0aW1lIGtlcm5lbC4KKyAgICBOb3RlIHRoYXQgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB5b3UgY2FuJ3QgYXB0LWdldCBpbnN0YWxsIHRoZQorICAgIHJlYWx0aW1lIGtlcm5lbCBwYWNrYWdlcyBkaXJlY3RseSBvbiB0aGUgYmVhZ2xlYm9uZS4KKyAgICBZb3UgbXVzdCBkb3dubG9hZCB0aGVtIG9uIHlvdXIgY29tcHV0ZXIsIGNvcHkgdGhlbSB0byB0aGUgYmVhZ2xlYm9uZSwKKyAgICBhbmQgaW5zdGFsbCB0aGVtIHVzaW5nIGRwa2cgLWkuCisgICAgPGh0dHA6Ly9yb2JvdGljcy5tdmxhLm5ldC9maWxlcy9mcmM5NzEvcGFja2FnZXMvPi4KKyAgICBBZnRlciB5b3UgZG8gdGhpcywgeW91IHdpbGwgc3RpbGwgbmVlZCB0byBtb2RpZnkgdGhlIHpJbWFnZQorICAgIHN5bWxpbmsgdG8gcG9pbnQgdG8gdGhlIHJpZ2h0IGtlcm5lbC4KKyAgICBgcm0gL2Jvb3QvekltYWdlYAorICAgIGBsbiAtcyAvYm9vdC92bWxpbnV6LTMuOC4xMy45LXJ0MjArIC9ib290L3pJbWFnZWAKKyAgICBBZnRlciB5b3UgcmVib290LCB5b3Ugc2hvdWxkIGJlIHJ1bm5pbmcgdGhlIHJ0IGtlcm5lbC4KKyAgICAoQ2hlY2sgaXQgd2l0aCBgdW5hbWUgLXJgLikKKyAgICBCZXNpZGVzIHRoZSByZWFsdGltZSBrZXJuZWwgcGFja2FnZXMsIHlvdSdsbCBmaWd1cmUgZXZlcnl0aGluZyBlbHNlIG91dAorICAgIGFzIHlvdSBzdGFydCB0cnlpbmcgdG8gcnVuIHN0dWZmLgorNi4gIE1ha2UgU1NIIGxvZ2lucyBmYXN0ZXIuCisgICAgQWRkIHRoZSBsaW5lICJVc2VETlMgbm8iIHRvIC9ldGMvc3NoL3NzaGRfY29uZmlnLgorNy4gIE1ha2UgaXQgc28gdGhhdCB0aGUgcHJvZ3JhbW1pbmcgdGVhbSBjYW4gbG9nIGluIHdpdGhvdXQgcGFzc3dvcmRzLgorICAgIEV2ZXJ5Ym9keSB3aWxsIGhhdmUgdG8gcnVuIGBzc2gtY29weS1pZCAtaSB+Ly5zc2gvaWRfcnNhLnB1YiBCQkJgIChzZWUKKyAgICA8aHR0cDovL3d3dy5kZWJpYW4tYWRtaW5pc3RyYXRpb24ub3JnL2FydGljbGVzLzE1Mj4gZm9yIGRldGFpbHMpLgorOC4gIE1ha2UgdWRldiBzdG9wIGJlaW5nIGFubm95aW5nIGFuZCBuYW1pbmcgTklDcyBldGgxLgorICAgIHVkZXYgd2FudHMgdG8gcmVtZW1iZXIgdGhlIGV0aGVybmV0IE5JQyBmcm9tIGVhY2ggZGV2aWNlIGFuZCBuYW1lIHRoZSBvbmUKKyAgICBpbiBhIG5ldyBCQkIgZXRoMSwgd2hpY2ggYnJlYWtzIHN0dWZmLiBJZiB0aGF0IGhhcHBlbnMsIHJlbW92aW5nCisgICAgL2V0Yy91ZGV2L3J1bGVzLmQvNzAtcGVyc2lzdGVudC1uZXQucnVsZXMgd2lsbCBtYWtlIGl0IGF1dG9nZW5lcmF0ZSBhCisgICAgbmV3IG9uZSBhbmQgZml4IGl0LgorICAgIFRvIHByZXZlbnQgdGhpcyBwcm9ibGVtIGZyb20gaGFwcGVuaW5nIGluIHRoZSBmaXJzdCBwbGFjZSwgZm9sbG93IHRoZQorICAgIGRpcmVjdGlvbnMgaW4gMTAtbmV0LWV0aDAucnVsZXMuCis5LiAgU2V0IHVwIC9ldGMvZnN0YWIgc2FuZWx5LgorICAgIE9wZW4gL2V0Yy9mc3RhYiBvbiB0aGUgYmJiIGFuZCByZW1vdmUgdGhlIGxhc3QgdHdvIGxpbmVzLCB3aGljaCB0aGUKKyAgICBjb21tZW50cyBpbmRpY2F0ZSBtb3VudCBib3RoIHBhcnRpdGlvbnMgb24gdGhlIHVTRCBjYXJkLgorCUJlY2F1c2UgdGhlIHVTRCBjYXJkIHNob3dzIHVwIGFzIC9kZXYvbW1jYmxrMCBhbmQgcHVzaGVzIHRoZSBpbnRlcm5hbCBlbW1jCisJdG8gL2Rldi9tbWNibGsxIHdoZW4gaXQncyBwbHVnZ2VkIGluLCB1c2luZyB0aG9zZSBuYW1lcyBmb3IgdGhlIHR3byBvZiB0aGVtCisJZG9lc24ndCB3b3JrIHZlcnkgd2VsbC4gSW5zdGVhZCwgd2UgdXNlIC9kZXYvZGlzay9ieS1wYXRoLgorCUFkZCAiL2Rldi9kaXNrL2J5LXBhdGgvcGxhdGZvcm0tbW1jLjE0LXBhcnQxIC9ib290L3Vib290IG1zZG9zIGRlZmF1bHRzIDAgMiIKKwl0byBtb3VudCB0aGUgdWJvb3QgcGFydGl0aW9uLgorICAgIEFsc28gYWRkCisJIi9kZXYvZGlzay9ieS1wYXRoL3BsYXRmb3JtLW1tYy41LXBhcnQxIC9ob21lL2RyaXZlci90bXAvcm9ib3RfbG9ncyBleHQ0IGRlZmF1bHRzLG5vYXRpbWUsZGF0YT13cml0ZWJhY2sgMCAwIgorCXRvIG1vdW50IHRoZSB1U0QgY2FyZCBpbiB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoZSBsb2dzIHRvIGdvIHRvIGl0LgorMTAuIFNldCB1cCBsb2dnaW5nLgorICAgIEZhaXJseSBzdHJhaWdodGZvcndhcmQgaGVyZS4gV2Ugd2FudCBpdCB0byBsb2cgdG8gdGhlIHVTRCBjYXJkLCBzbzoKKyAgICBgbWtkaXIgfi90bXBgCisgICAgYG1rZGlyIC9tZWRpYS9kcml2ZXIvc2RjYXJkL3JvYm90X2xvZ3NgCisgICAgYGxuIC1zIC9tZWRpYS9kcml2ZXIvc2RjYXJkL3JvYm90X2xvZ3Mgfi90bXAvcm9ib3RfbG9nc2AKKzExLiBTZXQgdGhlIGNvcnJlY3QgZGF0ZS4KKyAgICBgZGF0ZWAgdG8gY2hlY2sgaWYgZGF0ZSBpcyBjb3JyZWN0LgorICAgIGBkYXRlIC1zIDxkYXRlIHN0cmluZz5gIHRvIHNldCBpdCBpZiBpdCBpc24ndC4KKzEyLiBGaXggdGhlIGxvY2FsZSBzZXR1cCBmb3IgU1NIaW5nIGluLgorICAgIGBkcGtnLXJlY29uZmlndXJlIGxvY2FsZXNgLCBsZWF2ZSBpdCB3aXRoICJlbl9VUy5VVEYtOCIgb25seSBiZWluZworCWVuYWJsZWQsIGFuZCB0aGVuIHNlbGVjdCAiTm9uZSIgaW5zdGVhZCBvZiB0aGF0IGZvciB0aGUgZGVmYXVsdCBpbgorCXRoZSBzZWNvbmQgc2NyZWVuLgorMzAuIERvd25sb2FkIHRoZSBjb2RlIQorNTAuIENsb25lIHRoZSBpbWFnZSB0byB0aGUgcmVzdCBvZiB0aGUgQkJCcy4KKyAgICBCb290IHVwIGZyb20gYSB1U0QgY2FyZC4KKyAgICBgZGQgaWY9L2Rldi9tbWNibGsxIHwgZ3ppcCAtYyA+IEJCQi5pbWcuZ3pgCisgICAgWW91IGNhbiB0aGVuIGNvcHkgdGhpcyBpbWFnZSB0byB5b3VyIGNvbXB1dGVyLgorICAgIFVzZSB0aGlzIGltYWdlIHRvIGZsYXNoIG90aGVyIHVTRCBjYXJkcyBhbmQvb3IgQkJCcy4KZGlmZiAtLWdpdCBhL2Fvcy9jb25maWcvcm9ib3RDb21tYW5kIGIvYW9zL2NvbmZpZy9yb2JvdENvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2I3MjZhNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9jb25maWcvcm9ib3RDb21tYW5kCkBAIC0wLDAgKzEgQEAKKy9ob21lL2FkbWluL3JvYm90X2NvZGUvc3RhcnRlci5zaApkaWZmIC0tZ2l0IGEvYW9zL2NvbmZpZy9zZXR1cF9ydF9jYXBzLnNoIGIvYW9zL2NvbmZpZy9zZXR1cF9ydF9jYXBzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiYTRmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvY29uZmlnL3NldHVwX3J0X2NhcHMuc2gKQEAgLTAsMCArMSw4IEBACisjIS9iaW4vYmFzaAorCisjIFNldHMgY2FwYWJpbGl0aWVzIG9uIGEgYmluYXJ5IHNvIGl0IGNhbiBydW4gYXMgcmVhbHRpbWUgY29kZSBhcyBhIHVzZXIgd2hvCisjIGRvZXNuJ3QgaGF2ZSB0aG9zZSBybGltaXRzIG9yIHNvbWUgb3RoZXIgcmVhc29uIHRoZXkgY2FuLgorIyBIYXMgdG8gYmUgcnVuIGFzIHJvb3QuCisKK3NldGNhcCAnQ0FQX0lQQ19MT0NLK3BpZSBDQVBfU1lTX05JQ0UrcGllJyAkMAorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9SRUFETUUgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1OTViNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL1JFQURNRQpAQCAtMCwwICsxLDMgQEAKK1RoaXMgaXMgb3VyIHZlcnNpb24gb2YgV1BJTGliLiBXZSBjb3B5IHRoZSB3cGlsaWJjLyBhbmQgaGFsLyBmb2xkZXJzIGZyb20KK291ciBjdXN0b21pemVkIHZlcnNpb24gcGVyaW9kaWNhbGx5LiBUaGUgY29tbWl0IG1lc3NhZ2VzIGFsbCBpbmNsdWRlIHRoZSBjb21taXQKK3doaWNoIGlzIGJlaW5nIGNvcGllZCBpbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgRlBHQSBpbWFnZSB2ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL0NNYWtlTGlzdHMudHh0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDJlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKK3Byb2plY3QoSEFMKQorCitmaWxlKEdMT0JfUkVDVVJTRSBTUkNfRklMRVMgbGliL0F0aGVuYS8qLmNwcCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMobGliL0F0aGVuYSBsaWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QgaW5jbHVkZSkKK2FkZF9saWJyYXJ5KEhBTEF0aGVuYSBTVEFUSUMgJHtTUkNfRklMRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEhBTEF0aGVuYSAke05JX0xJQlN9KQorSU5TVEFMTChUQVJHRVRTIEhBTEF0aGVuYSBBUkNISVZFIERFU1RJTkFUSU9OIGxpYiBDT01QT05FTlQgbGliKQorSU5TVEFMTChGSUxFUyAke05JX0xJQlN9ICR7V1BJX0xEX0xJQlN9IERFU1RJTkFUSU9OIGxpYiBDT01QT05FTlQgbmlfbGliKQorSU5TVEFMTChESVJFQ1RPUlkgaW5jbHVkZSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfUFJFRklYfSBDT01QT05FTlQgaGVhZGVycykKKworYWRkX2xpYnJhcnkoSEFMQXRoZW5hX3NoYXJlZCBTSEFSRUQgJHtTUkNfRklMRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEhBTEF0aGVuYV9zaGFyZWQgJHtOSV9MSUJTfSkKK0lOU1RBTEwoVEFSR0VUUyBIQUxBdGhlbmFfc2hhcmVkIExJQlJBUlkgREVTVElOQVRJT04gbGliIENPTVBPTkVOVCBsaWIpCisjIGxpYi8gYyBtIGdjY19zIGxkLWxpbnV4CisjIHVzci9saWIgCisjIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbiBGUkNfRlBHQV9DaGlwT2JqZWN0IFJvYm9SSU9fRlJDX0NoaXBPYmplY3QKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9SRUFETUUub3JnIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL1JFQURNRS5vcmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViMTMyYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9SRUFETUUub3JnCkBAIC0wLDAgKzEsOTQgQEAKKworKiBQdXJwb3NlCitUaGUgSEFMIGlzIGEgaGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIgdGhhdCBwcm92aWRlcyBhIHVuaWZvcm0KK2ludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBhIG51bWJlciBvZiBwcmltYXJpbHkgSS9PCitmZWF0dXJlcyBpbiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybS4gVGhlIGZlYXR1cmVzIGluY2x1ZGU6CistIEFuYWxvZyBpbnB1dCwgYWNjdW11bGF0aW9uIGFuZCB0cmlnZ2VycworLSBQV00sIFJlbGF5IGFuZCBTb2xlbm9pZCBvdXRwdXQKKy0gRGlnaXRhbCBpbnB1dCBhbmQgb3V0cHV0CistIEkyQyBhbmQgU1BJIGNvbW11bmljYXRpb24KKy0gRW5jb2RlcnMgYW5kIGNvdW50ZXJzCistIEludGVycnVwdHMgYW5kIE5vdGlmaWVycworCitUaGUgaW5pdGlhbCBnb2FsIGlzIHRvIGFsbG93IGEgaGlnaGVyIGxldmVsIGxpa2UgV1BJTGliIHRvIHN1cHBvcnQKK2JvdGggdGhlIENSSU8gYW5kIHRoZSB1cGNvbWluZyBBdGhlbmEgcGxhdGZvcm0gb25seSBieSBjaGFuZ2luZyB3aGljaAordmVyc2lvbiBvZiB0aGUgSEFMIGl0J3MgcnVubmluZyBvbi4KKworKiBFZGl0aW5nCitZb3UgY2FuIGFsd2F5cyB1c2UgYW55IHRleHQgZWRpdG9yIGFuZCB0aGVuIGJ1aWxkIHdpdGggTWF2ZW4uIFRoZXJlCithcmUgYWxzbyBlY2xpcHNlIHByb2plY3QgZmlsZXMgc28gdGhhdCBpdCBjYW4gYmUgZWRpdGVkIGluIHRoZSBzYW1lCitlY2xpcHNlIGVudmlyb25tZW50IHRoYXQgdGVhbXMgZGV2ZWxvcCB3aXRoLiBGb3IgdGhlIEF0aGVuYVhYLCB0aGlzCitjYW4gYmUgZm91bmQgaW4gdGhlID1yb290PSBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LiBJdCBpbXBvcnRzIGFzIGFuCitGUkMgUm9ib3QgQysrIEVjbGlwc2UgcHJvamVjdC4gVGhlIFdpbmRyaXZlciBwcm9qZWN0IGNhbiBiZSBpbXBvcnRlZAorZnJvbSB0aGUgPXNyYz0gZGlyZWN0b3J5LgorCisqIEJ1aWxkaW5nIHdpdGggTWF2ZW4KK1RoZXJlIGFyZSBtdWx0aXBsZSBidWlsZCB0YXJnZXRzIHRoYXQgdGhlIEhBTCBzdXBwb3J0cy4gSW5zdHJ1Y3Rpb25zCitmb3Igc2V0dGluZyB1cCB0aGUgZW52aXJvbm1lbnQgYW5kIGJ1aWxkaW5nIGVhY2ggb2YgdGhlc2UgaXMgZGVzY3JpYmVkCitiZWxvdy4gQ3VycmVudCB0YXJnZXRzIGFyZSBsaXN0ZWQgYmVsb3c6CistIEFsbDogQWxsIG9mIHRoZSBmb2xsb3dpbmcgdGFyZ2V0cy4KKy0gaW5jbHVkZTogVGhlIGhlYWRlciBmaWxlcyBmb3IgdGhlIEhBTC4KKy0gQXphbGVhOiBDUklPIEMrKyBidWlsZC4KKy0gQXRoZW5hWFg6IEF0aGVuYSBEb3MgRXF1aXMgQysrIGJ1aWxkLgorLSBBdGhlbmFYWEphdmE6IEF0aGVuYSBEb3MgRXF1aXMgSmF2YSBidWlsZCB3aXRoIGF1dG8tZ2VuZXJhdGVkIEpOQQorICB3cmFwcGVycy4KKworT3V0cHV0IGZyb20gZWFjaCBidWlsZCB0YXJnZXQgaXMgcGxhY2VkIGluIHRoZSBkaXJlY3RvcnkKKz10YXJnZXQvPHRhcmdldC1uYW1lPj0uIFNvLCB0aGUgQXphbGVhIG91dHB1dCBpcyBwbGFjZWQgaW4KKz10YXJnZXQvQXphbGVhPS4KKworKiogQWxsCitOb3RlOiBXaW5kb3dzIG9ubHkgZHVlIHRvIHRoZSBXaW5kcml2ZXIgcmVxdWlyZW1lbnQuCisxLiBFbnN1cmUgdGhhdCA9QzpcV2luZFJpdmVyXGdudVwzLjQuNC12eHdvcmtzLTYuM1x4ODYtd2luMzJcYmluPSBpcworICAgb24gdGhlIHN5c3RlbSBwYXRoIHNvIHRoYXQgPWNjcHBjPSBhbmQgPWFycHBjPSBjYW4gYmUgYWNjZXNzZWQuCisyLiBTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlID1XSU5EX0JBU0U9IHRvID1DOlxXaW5kUml2ZXJcdnh3b3Jrcy02LjM9LgorMy4gRW5zdXJlIHRoYXQKKyAgID0kSE9NRS93cGlsaWIvdG9vbGNoYWlucy9hcm0tbm9uZS1saW51eC1nbnVlYWJpLTQuNC4xL2Jpbi89IGlzIG9uCisgICB0aGUgc3lzdGVtIHBhdGggc28gdGhhdCA9YXJtLW5vbmUtbGludXgtZ251ZWFiaS1nKys9IGFuZAorICAgPWFybS1ub25lLWxpbnV4LWdudWVhYmktYXI9IGNhbiBiZSBhY2Nlc3NlZC4KKzQuIENoZWNrb3V0IGFuZCBpbnN0YWxsIHRoZSBOSS1MaWJyYXJpZXMgZnJvbSBHaXRodWI6CisgICBbW2h0dHBzOi8vZ2l0aHViLmNvbS9maXJzdC9OSS1MaWJyYXJpZXNdXS4KKzUuIFJ1biB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQ6CisgICA9bXZuIGNsZWFuIGluc3RhbGw9Cis2LiBTdWNjZXNzCisKKyoqIGluY2x1ZGUKKzEuID1jZD0gaW50byB0aGUgaW5jbHVkZSBkaXJlY3Rvcnk6ID1jZCBpbmNsdWRlPQorMi4gUnVuIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZDoKKyAgID1tdm4gY2xlYW4gaW5zdGFsbD0KKzMuIFN1Y2Nlc3MKKworKiogQXphbGVhCitOb3RlOiBXaW5kb3dzIG9ubHkuCisxLiBFbnN1cmUgdGhhdCA9QzpcV2luZFJpdmVyXGdudVwzLjQuNC12eHdvcmtzLTYuM1x4ODYtd2luMzJcYmluPSBpcworICAgb24gdGhlIHN5c3RlbSBwYXRoIHNvIHRoYXQgPWNjcHBjPSBhbmQgPWFycHBjPSBjYW4gYmUgYWNjZXNzZWQuCisyLiBTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlID1XSU5EX0JBU0U9IHRvID1DOlxXaW5kUml2ZXJcdnh3b3Jrcy02LjM9LgorMy4gPWNkPSBpbnRvIHRoZSBBdGhlbmFYWCBkaXJlY3Rvcnk6ID1jZCBBdGhlbmFYWD0KKzQuID1jZD0gaW50byB0aGUgQXphbGVhIGRpcmVjdG9yeTogID1jZCBBemFsZWE9Cis1LiBSdW4gdGhlIGZvbGxvd2luZyBtYXZlbiBjb21tYW5kOgorICAgPW12biBjbGVhbiBpbnN0YWxsPQorNi4gU3VjY2VzcworCisqKiBBdGhlbmFYWAorMS4gRW5zdXJlIHRoYXQKKyAgID0kSE9NRS93cGlsaWIvdG9vbGNoYWlucy9hcm0tbm9uZS1saW51eC1nbnVlYWJpLTQuNC4xL2Jpbi89IGlzIG9uCisgICB0aGUgc3lzdGVtIHBhdGggc28gdGhhdCA9YXJtLW5vbmUtbGludXgtZ251ZWFiaS1nKys9IGFuZAorICAgPWFybS1ub25lLWxpbnV4LWdudWVhYmktYXI9IGNhbiBiZSBhY2Nlc3NlZC4KKzIuIEluc3RhbGwgdGhlIGluY2x1ZGUgdGFyZ2V0LgorMy4gPWNkPSBpbnRvIHRoZSBBdGhlbmFYWCBkaXJlY3Rvcnk6ID1jZCBBdGhlbmFYWD0KKzQuIFJ1biB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQ6CisgICA9bXZuIGNsZWFuIGluc3RhbGw9Cis1LiBTdWNjZXNzCisKKyoqIEF0aGVuYVhYSmF2YQorMS4gRW5zdXJlIHRoYXQKKyAgID0kSE9NRS93cGlsaWIvdG9vbGNoYWlucy9hcm0tbm9uZS1saW51eC1nbnVlYWJpLTQuNC4xL2Jpbi89IGlzIG9uCisgICB0aGUgc3lzdGVtIHBhdGggc28gdGhhdCA9YXJtLW5vbmUtbGludXgtZ251ZWFiaS1nKys9IGFuZAorICAgPWFybS1ub25lLWxpbnV4LWdudWVhYmktYXI9IGNhbiBiZSBhY2Nlc3NlZC4KKzIuIENoZWNrb3V0IGFuZCBpbnN0YWxsIHRoZSBOSS1MaWJyYXJpZXMgZnJvbSBHaXRodWI6CisgICBbW2h0dHBzOi8vZ2l0aHViLmNvbS9maXJzdC9OSS1MaWJyYXJpZXNdXS4KKzMuIEluc3RhbGwgdGhlIGluY2x1ZGUgdGFyZ2V0LgorNC4gPWNkPSBpbnRvIHRoZSBBdGhlbmFYWEphdmEgZGlyZWN0b3J5OiA9Y2QgQXRoZW5hWFhKYXZhPQorNS4gUnVuIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZDoKKyAgID1tdm4gY2xlYW4gaW5zdGFsbD0KKzYuIFN1Y2Nlc3MKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9BY2NlbGVyb21ldGVyLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9BY2NlbGVyb21ldGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDNmYjJhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0FjY2VsZXJvbWV0ZXIuaHBwCkBAIC0wLDAgKzEsMTUgQEAKKyNwcmFnbWEgb25jZQorCitlbnVtIEFjY2VsZXJvbWV0ZXJSYW5nZSB7CisJa1JhbmdlXzJHID0gMCwKKwlrUmFuZ2VfNEcgPSAxLAorCWtSYW5nZV84RyA9IDIsCit9OworCitleHRlcm4gIkMiIHsKKwl2b2lkIHNldEFjY2VsZXJvbWV0ZXJBY3RpdmUoYm9vbCk7CisJdm9pZCBzZXRBY2NlbGVyb21ldGVyUmFuZ2UoQWNjZWxlcm9tZXRlclJhbmdlKTsKKwlkb3VibGUgZ2V0QWNjZWxlcm9tZXRlclgoKTsKKwlkb3VibGUgZ2V0QWNjZWxlcm9tZXRlclkoKTsKKwlkb3VibGUgZ2V0QWNjZWxlcm9tZXRlclooKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9BbmFsb2cuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0FuYWxvZy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxYWE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9BbmFsb2cuaHBwCkBAIC0wLDAgKzEsODAgQEAKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgX192eHdvcmtzCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCitlbnVtIEFuYWxvZ1RyaWdnZXJUeXBlCit7CisJa0luV2luZG93ID0gMCwKKwlrU3RhdGUgPSAxLAorCWtSaXNpbmdQdWxzZSA9IDIsCisJa0ZhbGxpbmdQdWxzZSA9IDMKK307CisKK2V4dGVybiAiQyIKK3sKKwkvLyBBbmFsb2cgb3V0cHV0IGZ1bmN0aW9ucworCXZvaWQqIGluaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0KHZvaWQqIHBvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEFuYWxvZ091dHB1dCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBkb3VibGUgdm9sdGFnZSwgaW50MzJfdCAqc3RhdHVzKTsKKwlkb3VibGUgZ2V0QW5hbG9nT3V0cHV0KHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBjaGVja0FuYWxvZ091dHB1dENoYW5uZWwodWludDMyX3QgcGluKTsKKworCS8vIEFuYWxvZyBpbnB1dCBmdW5jdGlvbnMKKwl2b2lkKiBpbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0KHZvaWQqIHBvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGNoZWNrQW5hbG9nTW9kdWxlKHVpbnQ4X3QgbW9kdWxlKTsKKwlib29sIGNoZWNrQW5hbG9nSW5wdXRDaGFubmVsKHVpbnQzMl90IHBpbik7CisKKwl2b2lkIHNldEFuYWxvZ1NhbXBsZVJhdGUoZG91YmxlIHNhbXBsZXNQZXJTZWNvbmQsIGludDMyX3QgKnN0YXR1cyk7CisJZmxvYXQgZ2V0QW5hbG9nU2FtcGxlUmF0ZShpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0QW5hbG9nQXZlcmFnZUJpdHModm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgdWludDMyX3QgYml0cywgaW50MzJfdCAqc3RhdHVzKTsKKwl1aW50MzJfdCBnZXRBbmFsb2dBdmVyYWdlQml0cyh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0QW5hbG9nT3ZlcnNhbXBsZUJpdHModm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgdWludDMyX3QgYml0cywgaW50MzJfdCAqc3RhdHVzKTsKKwl1aW50MzJfdCBnZXRBbmFsb2dPdmVyc2FtcGxlQml0cyh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWludDE2X3QgZ2V0QW5hbG9nVmFsdWUodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQzMl90IGdldEFuYWxvZ0F2ZXJhZ2VWYWx1ZSh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWludDMyX3QgZ2V0QW5hbG9nVm9sdHNUb1ZhbHVlKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGRvdWJsZSB2b2x0YWdlLCBpbnQzMl90ICpzdGF0dXMpOworCWZsb2F0IGdldEFuYWxvZ1ZvbHRhZ2Uodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlmbG9hdCBnZXRBbmFsb2dBdmVyYWdlVm9sdGFnZSh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXVpbnQzMl90IGdldEFuYWxvZ0xTQldlaWdodCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWludDMyX3QgZ2V0QW5hbG9nT2Zmc2V0KHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisKKwlib29sIGlzQWNjdW11bGF0b3JDaGFubmVsKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBpbml0QWNjdW11bGF0b3Iodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHJlc2V0QWNjdW11bGF0b3Iodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEFjY3VtdWxhdG9yQ2VudGVyKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgY2VudGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0QWNjdW11bGF0b3JEZWFkYmFuZCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90IGRlYWRiYW5kLCBpbnQzMl90ICpzdGF0dXMpOworCWludDY0X3QgZ2V0QWNjdW11bGF0b3JWYWx1ZSh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXVpbnQzMl90IGdldEFjY3VtdWxhdG9yQ291bnQodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGdldEFjY3VtdWxhdG9yT3V0cHV0KHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDY0X3QgKnZhbHVlLCB1aW50MzJfdCAqY291bnQsCisJCQlpbnQzMl90ICpzdGF0dXMpOworCisJdm9pZCogaW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIodm9pZCogcG9ydF9wb2ludGVyLCB1aW50MzJfdCAqaW5kZXgsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBjbGVhbkFuYWxvZ1RyaWdnZXIodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEFuYWxvZ1RyaWdnZXJMaW1pdHNSYXcodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgaW50MzJfdCBsb3dlciwgaW50MzJfdCB1cHBlciwKKwkJCWludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRBbmFsb2dUcmlnZ2VyTGltaXRzVm9sdGFnZSh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBkb3VibGUgbG93ZXIsIGRvdWJsZSB1cHBlciwKKwkJCWludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRBbmFsb2dUcmlnZ2VyQXZlcmFnZWQodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgYm9vbCB1c2VBdmVyYWdlZFZhbHVlLAorCQkJaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZCh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBib29sIHVzZUZpbHRlcmVkVmFsdWUsCisJCQlpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0QW5hbG9nVHJpZ2dlckluV2luZG93KHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlclN0YXRlKHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRBbmFsb2dUcmlnZ2VyT3V0cHV0KHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIHR5cGUsCisJCQlpbnQzMl90ICpzdGF0dXMpOworCisJLy8vLyBGbG9hdCBKTkEgSGFjaworCS8vIEZsb2F0CisJaW50IGdldEFuYWxvZ1NhbXBsZVJhdGVJbnRIYWNrKGludDMyX3QgKnN0YXR1cyk7CisJaW50IGdldEFuYWxvZ1ZvbHRhZ2VJbnRIYWNrKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJaW50IGdldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlSW50SGFjayh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCisJLy8gRG91YmxlcworCXZvaWQgc2V0QW5hbG9nU2FtcGxlUmF0ZUludEhhY2soaW50IHNhbXBsZXNQZXJTZWNvbmQsIGludDMyX3QgKnN0YXR1cyk7CisJaW50MzJfdCBnZXRBbmFsb2dWb2x0c1RvVmFsdWVJbnRIYWNrKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludCB2b2x0YWdlLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2VJbnRIYWNrKHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludCBsb3dlciwgaW50IHVwcGVyLAorCQkJaW50MzJfdCAqc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9DQU4uaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0NBTi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiNTg5YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9DQU4uaHBwCkBAIC0wLDAgKzEsMjYgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIgorCit2b2lkIGNhblR4U2VuZCh1aW50MzJfdCBhcmJJRCwgdWludDhfdCBsZW5ndGgsIGludDMyX3QgcGVyaW9kID0gQ0FOX1NFTkRfUEVSSU9EX05PX1JFUEVBVCk7CisKK3ZvaWQgY2FuVHhQYWNrSW50OCAodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0LCB1aW50OF90ICB2YWx1ZSk7Cit2b2lkIGNhblR4UGFja0ludDE2KHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCwgdWludDE2X3QgdmFsdWUpOwordm9pZCBjYW5UeFBhY2tJbnQzMih1aW50MzJfdCBhcmJJRCwgdWludDhfdCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKTsKK3ZvaWQgY2FuVHhQYWNrRlhQMTYodWludDMyX3QgYXJiSUQsIHVpbnQ4X3Qgb2Zmc2V0LCBkb3VibGUgICB2YWx1ZSk7Cit2b2lkIGNhblR4UGFja0ZYUDMyKHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCwgZG91YmxlICAgdmFsdWUpOworCit1aW50OF90ICBjYW5UeFVucGFja0ludDggKHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7Cit1aW50MzJfdCBjYW5UeFVucGFja0ludDMyKHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7Cit1aW50MTZfdCBjYW5UeFVucGFja0ludDE2KHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7Citkb3VibGUgICBjYW5UeFVucGFja0ZYUDE2KHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7Citkb3VibGUgICBjYW5UeFVucGFja0ZYUDMyKHVpbnQzMl90IGFyYklELCB1aW50OF90IG9mZnNldCk7CisKK2Jvb2wgY2FuUnhSZWNlaXZlKHVpbnQzMl90IGFyYklEKTsKKwordWludDhfdCAgY2FuUnhVbnBhY2tJbnQ4ICh1aW50MzJfdCBhcmJJRCwgdWludDhfdCBvZmZzZXQpOwordWludDE2X3QgY2FuUnhVbnBhY2tJbnQxNih1aW50MzJfdCBhcmJJRCwgdWludDhfdCBvZmZzZXQpOwordWludDMyX3QgY2FuUnhVbnBhY2tJbnQzMih1aW50MzJfdCBhcmJJRCwgdWludDhfdCBvZmZzZXQpOworZG91YmxlICAgY2FuUnhVbnBhY2tGWFAxNih1aW50MzJfdCBhcmJJRCwgdWludDhfdCBvZmZzZXQpOworZG91YmxlICAgY2FuUnhVbnBhY2tGWFAzMih1aW50MzJfdCBhcmJJRCwgdWludDhfdCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0NvbXByZXNzb3IuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0NvbXByZXNzb3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjIyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvQ29tcHJlc3Nvci5ocHAKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiBDb21wcmVzc29yLmgKKyAqIE1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggYSBjb21wcmVzc29yIHdpdGggdGhlIENBTiBQQ00gZGV2aWNlCisgKi8KKworI2lmZGVmIF9fdnh3b3JrcworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfX0hBTF9DT01QUkVTU09SX0hfXworI2RlZmluZSBfX0hBTF9DT01QUkVTU09SX0hfXworCitleHRlcm4gIkMiIHsKKwl2b2lkICppbml0aWFsaXplQ29tcHJlc3Nvcih1aW50OF90IG1vZHVsZSk7CisJYm9vbCBjaGVja0NvbXByZXNzb3JNb2R1bGUodWludDhfdCBtb2R1bGUpOworCQorCWJvb2wgZ2V0Q29tcHJlc3Nvcih2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwkKKwl2b2lkIHNldENsb3NlZExvb3BDb250cm9sKHZvaWQgKnBjbV9wb2ludGVyLCBib29sIHZhbHVlLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0Q2xvc2VkTG9vcENvbnRyb2wodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJCisJYm9vbCBnZXRQcmVzc3VyZVN3aXRjaCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlmbG9hdCBnZXRDb21wcmVzc29yQ3VycmVudCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKworCWJvb2wgZ2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZFN0aWNreUZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgY2xlYXJBbGxQQ01TdGlja3lGYXVsdHModm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvRGlnaXRhbC5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvRGlnaXRhbC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3Nzk3NgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9EaWdpdGFsLmhwcApAQCAtMCwwICsxLDEyNCBAQAorI3ByYWdtYSBvbmNlCisjaWZkZWYgX192eHdvcmtzCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKworZW51bSBNb2RlCit7CisJa1R3b1B1bHNlID0gMCwKKwlrU2VtaXBlcmlvZCA9IDEsCisJa1B1bHNlTGVuZ3RoID0gMiwKKwlrRXh0ZXJuYWxEaXJlY3Rpb24gPSAzCit9OworCitleHRlcm4gIkMiCit7CisJdm9pZCogaW5pdGlhbGl6ZURpZ2l0YWxQb3J0KHZvaWQqIHBvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGNoZWNrUFdNQ2hhbm5lbCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlcik7CisJYm9vbCBjaGVja1JlbGF5Q2hhbm5lbCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlcik7CisKKwl2b2lkIHNldFBXTSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgdW5zaWduZWQgc2hvcnQgdmFsdWUsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBhbGxvY2F0ZVBXTUNoYW5uZWwodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBmcmVlUFdNQ2hhbm5lbCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl1bnNpZ25lZCBzaG9ydCBnZXRQV00odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBsYXRjaFBXTVplcm8odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRQV01QZXJpb2RTY2FsZSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgdWludDMyX3Qgc3F1ZWxjaE1hc2ssIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCogYWxsb2NhdGVQV00oaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGZyZWVQV00odm9pZCogcHdtR2VuZXJhdG9yLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0UFdNUmF0ZShkb3VibGUgcmF0ZSwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldFBXTUR1dHlDeWNsZSh2b2lkKiBwd21HZW5lcmF0b3IsIGRvdWJsZSBkdXR5Q3ljbGUsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRQV01PdXRwdXRDaGFubmVsKHZvaWQqIHB3bUdlbmVyYXRvciwgdWludDMyX3QgcGluLCBpbnQzMl90ICpzdGF0dXMpOworCisJdm9pZCBzZXRSZWxheUZvcndhcmQodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGJvb2wgb24sIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRSZWxheVJldmVyc2Uodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGJvb2wgb24sIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRSZWxheUZvcndhcmQodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRSZWxheVJldmVyc2Uodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisKKwlib29sIGFsbG9jYXRlRElPKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBib29sIGlucHV0LCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgZnJlZURJTyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldERJTyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgc2hvcnQgdmFsdWUsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRESU8odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRESU9EaXJlY3Rpb24odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBwdWxzZSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgZG91YmxlIHB1bHNlTGVuZ3RoLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgaXNQdWxzaW5nKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgaXNBbnlQdWxzaW5nKGludDMyX3QgKnN0YXR1cyk7CisKKwl2b2lkIHNldEZpbHRlclNlbGVjdCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50IGZpbHRlcl9pbmRleCwKKwkgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKKwlpbnQgZ2V0RmlsdGVyU2VsZWN0KHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90KiBzdGF0dXMpOworCisJdm9pZCBzZXRGaWx0ZXJQZXJpb2QoaW50IGZpbHRlcl9pbmRleCwgdWludDMyX3QgdmFsdWUsIGludDMyX3QgKnN0YXR1cyk7CisJdWludDMyX3QgZ2V0RmlsdGVyUGVyaW9kKGludCBmaWx0ZXJfaW5kZXgsIGludDMyX3QgKnN0YXR1cyk7CisKKwl2b2lkKiBpbml0aWFsaXplQ291bnRlcihNb2RlIG1vZGUsIHVpbnQzMl90ICppbmRleCwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGZyZWVDb3VudGVyKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldENvdW50ZXJBdmVyYWdlU2l6ZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3Qgc2l6ZSwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldENvdW50ZXJVcFNvdXJjZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIHVpbnQzMl90IHBpbiwgYm9vbCBhbmFsb2dUcmlnZ2VyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlclVwU291cmNlRWRnZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSwKKwkJCWludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBjbGVhckNvdW50ZXJVcFNvdXJjZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyRG93blNvdXJjZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIHVpbnQzMl90IHBpbiwgYm9vbCBhbmFsb2dUcmlnZ2VyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlckRvd25Tb3VyY2VFZGdlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlLAorCQkJaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGNsZWFyQ291bnRlckRvd25Tb3VyY2Uodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlclVwRG93bk1vZGUodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlckV4dGVybmFsRGlyZWN0aW9uTW9kZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyU2VtaVBlcmlvZE1vZGUodm9pZCogY291bnRlcl9wb2ludGVyLCBib29sIGhpZ2hTZW1pUGVyaW9kLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlclB1bHNlTGVuZ3RoTW9kZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGRvdWJsZSB0aHJlc2hvbGQsIGludDMyX3QgKnN0YXR1cyk7CisJaW50MzJfdCBnZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludCBzYW1wbGVzVG9BdmVyYWdlLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgcmVzZXRDb3VudGVyKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQzMl90IGdldENvdW50ZXIodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWRvdWJsZSBnZXRDb3VudGVyUGVyaW9kKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldENvdW50ZXJNYXhQZXJpb2Qodm9pZCogY291bnRlcl9wb2ludGVyLCBkb3VibGUgbWF4UGVyaW9kLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlclVwZGF0ZVdoZW5FbXB0eSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGJvb2wgZW5hYmxlZCwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldENvdW50ZXJTdG9wcGVkKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldENvdW50ZXJEaXJlY3Rpb24odm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0Q291bnRlclJldmVyc2VEaXJlY3Rpb24odm9pZCogY291bnRlcl9wb2ludGVyLCBib29sIHJldmVyc2VEaXJlY3Rpb24sIGludDMyX3QgKnN0YXR1cyk7CisKKwl2b2lkKiBpbml0aWFsaXplRW5jb2Rlcih1aW50OF90IHBvcnRfYV9tb2R1bGUsIHVpbnQzMl90IHBvcnRfYV9waW4sIGJvb2wgcG9ydF9hX2FuYWxvZ190cmlnZ2VyLAorCQkJdWludDhfdCBwb3J0X2JfbW9kdWxlLCB1aW50MzJfdCBwb3J0X2JfcGluLCBib29sIHBvcnRfYl9hbmFsb2dfdHJpZ2dlciwKKwkJCWJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgaW50MzJfdCAqaW5kZXgsIGludDMyX3QgKnN0YXR1cyk7IC8vIFRPRE86IGZpeCByb3V0aW5nCisJdm9pZCBmcmVlRW5jb2Rlcih2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCByZXNldEVuY29kZXIodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWludDMyX3QgZ2V0RW5jb2Rlcih2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7IC8vIFJhdyB2YWx1ZQorCWRvdWJsZSBnZXRFbmNvZGVyUGVyaW9kKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEVuY29kZXJNYXhQZXJpb2Qodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBkb3VibGUgbWF4UGVyaW9kLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0RW5jb2RlclN0b3BwZWQodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCWJvb2wgZ2V0RW5jb2RlckRpcmVjdGlvbih2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBzZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbih2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgdWludDMyX3Qgc2FtcGxlc1RvQXZlcmFnZSwKKwkJCWludDMyX3QgKnN0YXR1cyk7CisJdWludDMyX3QgZ2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2Uodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0RW5jb2RlckluZGV4U291cmNlKHZvaWQgKmVuY29kZXJfcG9pbnRlciwgdWludDMyX3QgcGluLCBib29sIGFuYWxvZ1RyaWdnZXIsIGJvb2wgYWN0aXZlSGlnaCwKKwkJCWJvb2wgZWRnZVNlbnNpdGl2ZSwgaW50MzJfdCAqc3RhdHVzKTsKKworCXVpbnQxNl90IGdldExvb3BUaW1pbmcoaW50MzJfdCAqc3RhdHVzKTsKKworCXZvaWQgc3BpSW5pdGlhbGl6ZSh1aW50OF90IHBvcnQsIGludDMyX3QgKnN0YXR1cyk7CisJaW50MzJfdCBzcGlUcmFuc2FjdGlvbih1aW50OF90IHBvcnQsIHVpbnQ4X3QgKmRhdGFUb1NlbmQsIHVpbnQ4X3QgKmRhdGFSZWNlaXZlZCwgdWludDhfdCBzaXplKTsKKwlpbnQzMl90IHNwaVdyaXRlKHVpbnQ4X3QgcG9ydCwgdWludDhfdCogZGF0YVRvU2VuZCwgdWludDhfdCBzZW5kU2l6ZSk7CisJaW50MzJfdCBzcGlSZWFkKHVpbnQ4X3QgcG9ydCwgdWludDhfdCAqYnVmZmVyLCB1aW50OF90IGNvdW50KTsKKwl2b2lkIHNwaUNsb3NlKHVpbnQ4X3QgcG9ydCk7CisJdm9pZCBzcGlTZXRTcGVlZCh1aW50OF90IHBvcnQsIHVpbnQzMl90IHNwZWVkKTsKKwl2b2lkIHNwaVNldEJpdHNQZXJXb3JkKHVpbnQ4X3QgcG9ydCwgdWludDhfdCBicHcpOworCXZvaWQgc3BpU2V0T3B0cyh1aW50OF90IHBvcnQsIGludCBtc2JfZmlyc3QsIGludCBzYW1wbGVfb25fdHJhaWxpbmcsIGludCBjbGtfaWRsZV9oaWdoKTsKKwl2b2lkIHNwaVNldENoaXBTZWxlY3RBY3RpdmVIaWdoKHVpbnQ4X3QgcG9ydCwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIHNwaVNldENoaXBTZWxlY3RBY3RpdmVMb3codWludDhfdCBwb3J0LCBpbnQzMl90ICpzdGF0dXMpOworCWludDMyX3Qgc3BpR2V0SGFuZGxlKHVpbnQ4X3QgcG9ydCk7CisJdm9pZCBzcGlTZXRIYW5kbGUodWludDhfdCBwb3J0LCBpbnQzMl90IGhhbmRsZSk7CisKKwl2b2lkIGkyQ0luaXRpYWxpemUodWludDhfdCBwb3J0LCBpbnQzMl90ICpzdGF0dXMpOworCWludDMyX3QgaTJDVHJhbnNhY3Rpb24odWludDhfdCBwb3J0LCB1aW50OF90IGRldmljZUFkZHJlc3MsIHVpbnQ4X3QgKmRhdGFUb1NlbmQsIHVpbnQ4X3Qgc2VuZFNpemUsIHVpbnQ4X3QgKmRhdGFSZWNlaXZlZCwgdWludDhfdCByZWNlaXZlU2l6ZSk7CisJaW50MzJfdCBpMkNXcml0ZSh1aW50OF90IHBvcnQsIHVpbnQ4X3QgZGV2aWNlQWRkcmVzcywgdWludDhfdCAqZGF0YVRvU2VuZCwgdWludDhfdCBzZW5kU2l6ZSk7CisJaW50MzJfdCBpMkNSZWFkKHVpbnQ4X3QgcG9ydCwgdWludDhfdCBkZXZpY2VBZGRyZXNzLCB1aW50OF90ICpidWZmZXIsIHVpbnQ4X3QgY291bnQpOworCXZvaWQgaTJDQ2xvc2UodWludDhfdCBwb3J0KTsKKworCS8vLy8gRmxvYXQgSk5BIEhhY2sKKwkvLyBkb3VibGUKKwl2b2lkIHNldFBXTVJhdGVJbnRIYWNrKGludCByYXRlLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0UFdNRHV0eUN5Y2xlSW50SGFjayh2b2lkKiBwd21HZW5lcmF0b3IsIGludDMyX3QgZHV0eUN5Y2xlLCBpbnQzMl90ICpzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0Vycm9ycy5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvRXJyb3JzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRjM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0Vycm9ycy5ocHAKQEAgLTAsMCArMSw2NSBAQAorI3ByYWdtYSBvbmNlCisKKyNkZWZpbmUgQ1RSX1J4VGltZW91dF9NRVNTQUdFICJDVFJFIENBTiBSZWNpZXZlIFRpbWVvdXQiCisjZGVmaW5lIENUUl9UeFRpbWVvdXRfTUVTU0FHRSAiQ1RSRSBDQU4gVHJhbnNtaXQgVGltZW91dCIKKyNkZWZpbmUgQ1RSX0ludmFsaWRQYXJhbVZhbHVlX01FU1NBR0UgIkNUUkUgQ0FOIEludmFsaWQgUGFyYW1ldGVyIgorI2RlZmluZSBDVFJfVW5leHBlY3RlZEFyYklkX01FU1NBR0UgIkNUUkUgVW5leHBlY3RlZCBBcmJpdHJhdGlvbiBJRCAoQ0FOIE5vZGUgSUQpIgorI2RlZmluZSBDVFJfVHhGYWlsZWRfTUVTU0FHRSAiQ1RSRSBDQU4gVHJhbnNtaXQgRXJyb3IiCisjZGVmaW5lIENUUl9TaWdOb3RVcGRhdGVkX01FU1NBR0UgIkNUUkUgQ0FOIFNpZ25hbCBOb3QgVXBkYXRlZCIKKworI2RlZmluZSBOaUZwZ2FfU3RhdHVzX0ZpZm9UaW1lb3V0X01FU1NBR0UgIk5JRlBHQTogRklGTyB0aW1lb3V0IGVycm9yIgorI2RlZmluZSBOaUZwZ2FfU3RhdHVzX1RyYW5zZmVyQWJvcnRlZF9NRVNTQUdFICJOSUZQR0E6IFRyYW5zZmVyIGFib3J0ZWQgZXJyb3IiCisjZGVmaW5lIE5pRnBnYV9TdGF0dXNfTWVtb3J5RnVsbF9NRVNTQUdFICJOSUZQR0E6IE1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCwgbWVtb3J5IGZ1bGwiCisjZGVmaW5lIE5pRnBnYV9TdGF0dXNfU29mdHdhcmVGYXVsdF9NRVNTQUdFICJOSUZQR0E6IFVuZXhlcGVjdGVkIHNvZnR3YXJlIGVycm9yIgorI2RlZmluZSBOaUZwZ2FfU3RhdHVzX0ludmFsaWRQYXJhbWV0ZXJfTUVTU0FHRSAiTklGUEdBOiBJbnZhbGlkIFBhcmFtZXRlciIKKyNkZWZpbmUgTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kX01FU1NBR0UgIk5JRlBHQTogUmVzb3VyY2Ugbm90IGZvdW5kIgorI2RlZmluZSBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90SW5pdGlhbGl6ZWRfTUVTU0FHRSAiTklGUEdBOiBSZXNvdXJjZSBub3QgaW5pdGlhbGl6ZWQiCisjZGVmaW5lIE5pRnBnYV9TdGF0dXNfSGFyZHdhcmVGYXVsdF9NRVNTQUdFICJOSUZQR0E6IEhhcmR3YXJlIEZhdWx0IgorI2RlZmluZSBOaUZwZ2FfU3RhdHVzX0lycVRpbWVvdXRfTUVTU0FHRSAiTklGUEdBOiBJbnRlcnJ1cHQgdGltZW91dCIKKyNkZWZpbmUgTmlGcGdhX1N0YXR1c19WZXJzaW9uTWlzbWF0Y2hfTUVTU0FHRSAiTklGUEdBOiBWZXJzaW9uIE1pc21hdGNoIgorCisjZGVmaW5lIEVSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXJfTUVTU0FHRSAiQ0FOOiBJbnZhbGlkIEJ1ZmZlciIKKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTWVzc2FnZU5vdEZvdW5kX01FU1NBR0UgIkNBTjogTWVzc2FnZSBub3QgZm91bmQiCisjZGVmaW5lIFdBUk5fQ0FOU2Vzc2lvbk11eF9Ob1Rva2VuX01FU1NBR0UgIkNBTjogTm8gdG9rZW4iCisjZGVmaW5lIEVSUl9DQU5TZXNzaW9uTXV4X05vdEFsbG93ZWRfTUVTU0FHRSAiQ0FOOiBOb3QgYWxsb3dlZCIKKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTm90SW5pdGlhbGl6ZWRfTUVTU0FHRSAiQ0FOOiBOb3QgaW5pdGlhbGl6ZWQiIAorCisjZGVmaW5lIFNBTVBMRV9SQVRFX1RPT19ISUdIIDEwMDEKKyNkZWZpbmUgU0FNUExFX1JBVEVfVE9PX0hJR0hfTUVTU0FHRSAiSEFMOiBBbmFsb2cgbW9kdWxlIHNhbXBsZSByYXRlIGlzIHRvbyBoaWdoIgorI2RlZmluZSBWT0xUQUdFX09VVF9PRl9SQU5HRSAxMDAyCisjZGVmaW5lIFZPTFRBR0VfT1VUX09GX1JBTkdFX01FU1NBR0UgIkhBTDogVm9sdGFnZSB0byBjb252ZXJ0IHRvIHJhdyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UgWzA7IDVdIgorI2RlZmluZSBMT09QX1RJTUlOR19FUlJPUiAxMDA0CisjZGVmaW5lIExPT1BfVElNSU5HX0VSUk9SX01FU1NBR0UgIkhBTDogRGlnaXRhbCBtb2R1bGUgbG9vcCB0aW1pbmcgaXMgbm90IHRoZSBleHBlY3RlZCB2YWx1ZSIKKyNkZWZpbmUgU1BJX1dSSVRFX05PX01PU0kgMTAxMgorI2RlZmluZSBTUElfV1JJVEVfTk9fTU9TSV9NRVNTQUdFICJIQUw6IENhbm5vdCB3cml0ZSB0byBTUEkgcG9ydCB3aXRoIG5vIE1PU0kgb3V0cHV0IgorI2RlZmluZSBTUElfUkVBRF9OT19NSVNPIDEwMTMKKyNkZWZpbmUgU1BJX1JFQURfTk9fTUlTT19NRVNTQUdFICJIQUw6IENhbm5vdCByZWFkIGZyb20gU1BJIHBvcnQgd2l0aCBubyBNSVNPIGlucHV0IgorI2RlZmluZSBTUElfUkVBRF9OT19EQVRBIDEwMTQKKyNkZWZpbmUgU1BJX1JFQURfTk9fREFUQV9NRVNTQUdFICJIQUw6IE5vIGRhdGEgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSBTUEkiCisjZGVmaW5lIElOQ09NUEFUSUJMRV9TVEFURSAxMDE1CisjZGVmaW5lIElOQ09NUEFUSUJMRV9TVEFURV9NRVNTQUdFICJIQUw6IEluY29tcGF0aWJsZSBTdGF0ZTogVGhlIG9wZXJhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVkIgorI2RlZmluZSBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTIC0xMDA0CisjZGVmaW5lIE5PX0FWQUlMQUJMRV9SRVNPVVJDRVNfTUVTU0FHRSAiSEFMOiBObyBhdmFpbGFibGUgcmVzb3VyY2VzIHRvIGFsbG9jYXRlIgorI2RlZmluZSBOVUxMX1BBUkFNRVRFUiAtMTAwNQorI2RlZmluZSBOVUxMX1BBUkFNRVRFUl9NRVNTQUdFICJIQUw6IEEgcG9pbnRlciBwYXJhbWV0ZXIgdG8gYSBtZXRob2QgaXMgTlVMTCIKKyNkZWZpbmUgQU5BTE9HX1RSSUdHRVJfTElNSVRfT1JERVJfRVJST1IgLTEwMTAKKyNkZWZpbmUgQU5BTE9HX1RSSUdHRVJfTElNSVRfT1JERVJfRVJST1JfTUVTU0FHRSAiSEFMOiBBbmFsb2dUcmlnZ2VyIGxpbWl0cyBlcnJvci4gIExvd2VyIGxpbWl0ID4gVXBwZXIgTGltaXQiCisjZGVmaW5lIEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUiAtMTAxMQorI2RlZmluZSBBTkFMT0dfVFJJR0dFUl9QVUxTRV9PVVRQVVRfRVJST1JfTUVTU0FHRSAiSEFMOiBBdHRlbXB0ZWQgdG8gcmVhZCBBbmFsb2dUcmlnZ2VyIHB1bHNlIG91dHB1dC4iCisjZGVmaW5lIFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0UgLTEwMjgKKyNkZWZpbmUgUEFSQU1FVEVSX09VVF9PRl9SQU5HRV9NRVNTQUdFICJIQUw6IEEgcGFyYW1ldGVyIGlzIG91dCBvZiByYW5nZS4iCisjZGVmaW5lIFJFU09VUkNFX0lTX0FMTE9DQVRFRCAtMTAyOQorI2RlZmluZSBSRVNPVVJDRV9JU19BTExPQ0FURURfTUVTU0FHRSAiSEFMOiBSZXNvdXJjZSBhbHJlYWR5IGFsbG9jYXRlZCIKKworI2RlZmluZSBWSV9FUlJPUl9TWVNURU1fRVJST1JfTUVTU0FHRSAiSEFMIC0gVklTQTogU3lzdGVtIEVycm9yIjsKKyNkZWZpbmUgVklfRVJST1JfSU5WX09CSkVDVF9NRVNTQUdFICJIQUwgLSBWSVNBOiBJbnZhbGlkIE9iamVjdCIKKyNkZWZpbmUgVklfRVJST1JfUlNSQ19MT0NLRURfTUVTU0FHRSAiSEFMIC0gVklTQTogUmVzb3VyY2UgTG9ja2VkIgorI2RlZmluZSBWSV9FUlJPUl9SU1JDX05GT1VORF9NRVNTQUdFICJIQUwgLSBWSVNBOiBSZXNvdXJjZSBOb3QgRm91bmQiCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9SU1JDX05BTUVfTUVTU0FHRSAiSEFMIC0gVklTQTogSW52YWxpZCBSZXNvdXJjZSBOYW1lIiAgCisjZGVmaW5lIFZJX0VSUk9SX1FVRVVFX09WRVJGTE9XX01FU1NBR0UgIkhBTCAtIFZJU0E6IFF1ZXVlIE92ZXJmbG93IiAKKyNkZWZpbmUgVklfRVJST1JfSU9fTUVTU0FHRSAiSEFMIC0gVklTQTogR2VuZXJhbCBJTyBFcnJvciIKKyNkZWZpbmUgVklfRVJST1JfQVNSTF9QQVJJVFlfTUVTU0FHRSAiSEFMIC0gVklTQTogUGFyaXR5IEVycm9yIgorI2RlZmluZSBWSV9FUlJPUl9BU1JMX0ZSQU1JTkdfTUVTU0FHRSAiSEFMIC0gVklTQTogRnJhbWluZyBFcnJvciIKKyNkZWZpbmUgVklfRVJST1JfQVNSTF9PVkVSUlVOX01FU1NBR0UgIkhBTCAtIFZJU0E6IEJ1ZmZlciBPdmVycnVuIEVycm9yIiAKKyNkZWZpbmUgVklfRVJST1JfUlNSQ19CVVNZX01FU1NBR0UgIkhBTCAtIFZJU0E6IFJlc291cmNlIEJ1c3kiCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9QQVJBTUVURVJfTUVTU0FHRSAiSEFMIC0gVklTQTogSW52YWxpZCBQYXJhbWV0ZXIiIApkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0hBTC5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvSEFMLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzZhY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0hBTC5ocHAKQEAgLTAsMCArMSwyNTcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAJCQkgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJBY2NlbGVyb21ldGVyLmhwcCIKKyNpbmNsdWRlICJBbmFsb2cuaHBwIgorI2luY2x1ZGUgIkNvbXByZXNzb3IuaHBwIgorI2luY2x1ZGUgIkRpZ2l0YWwuaHBwIgorI2luY2x1ZGUgIlNvbGVub2lkLmhwcCIKKyNpbmNsdWRlICJOb3RpZmllci5ocHAiCisjaW5jbHVkZSAiSW50ZXJydXB0cy5ocHAiCisjaW5jbHVkZSAiRXJyb3JzLmhwcCIKKyNpbmNsdWRlICJQRFAuaHBwIgorI2luY2x1ZGUgIlBvd2VyLmhwcCIKKworI2luY2x1ZGUgIlV0aWxpdGllcy5ocHAiCisjaW5jbHVkZSAiU2VtYXBob3JlLmhwcCIKKyNpbmNsdWRlICJUYXNrLmhwcCIKKworI2RlZmluZSBIQUxfSU9fQ09ORklHX0RBVEFfU0laRSAzMgorI2RlZmluZSBIQUxfU1lTX1NUQVRVU19EQVRBX1NJWkUgNDQKKyNkZWZpbmUgSEFMX1VTRVJfU1RBVFVTX0RBVEFfU0laRSAoOTg0IC0gSEFMX0lPX0NPTkZJR19EQVRBX1NJWkUgLSBIQUxfU1lTX1NUQVRVU19EQVRBX1NJWkUpCisKKyNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0RTRW5oYW5jZWRJT19JbnB1dCAxNworI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfRFNFbmhhbmNlZElPX091dHB1dCAxOAorI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfS2luZWN0X0hlYWRlciAxOQorI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfS2luZWN0X0V4dHJhMSAyMAorI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfS2luZWN0X1ZlcnRpY2VzMSAyMQorI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfS2luZWN0X0V4dHJhMiAyMgorI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfS2luZWN0X1ZlcnRpY2VzMiAyMworI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfS2luZWN0X0pveXN0aWNrIDI0CisjZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9LaW5lY3RfQ3VzdG9tIDI1CisKK25hbWVzcGFjZSBIQUxVc2FnZVJlcG9ydGluZworeworCWVudW0gdFJlc291cmNlVHlwZQorCXsKKwkJa1Jlc291cmNlVHlwZV9Db250cm9sbGVyLAorCQlrUmVzb3VyY2VUeXBlX01vZHVsZSwKKwkJa1Jlc291cmNlVHlwZV9MYW5ndWFnZSwKKwkJa1Jlc291cmNlVHlwZV9DQU5QbHVnaW4sCisJCWtSZXNvdXJjZVR5cGVfQWNjZWxlcm9tZXRlciwKKwkJa1Jlc291cmNlVHlwZV9BRFhMMzQ1LAorCQlrUmVzb3VyY2VUeXBlX0FuYWxvZ0NoYW5uZWwsCisJCWtSZXNvdXJjZVR5cGVfQW5hbG9nVHJpZ2dlciwKKwkJa1Jlc291cmNlVHlwZV9BbmFsb2dUcmlnZ2VyT3V0cHV0LAorCQlrUmVzb3VyY2VUeXBlX0NBTkphZ3VhciwKKwkJa1Jlc291cmNlVHlwZV9Db21wcmVzc29yLAorCQlrUmVzb3VyY2VUeXBlX0NvdW50ZXIsCisJCWtSZXNvdXJjZVR5cGVfRGFzaGJvYXJkLAorCQlrUmVzb3VyY2VUeXBlX0RpZ2l0YWxJbnB1dCwKKwkJa1Jlc291cmNlVHlwZV9EaWdpdGFsT3V0cHV0LAorCQlrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25DSU8sCisJCWtSZXNvdXJjZVR5cGVfRHJpdmVyU3RhdGlvbkVJTywKKwkJa1Jlc291cmNlVHlwZV9Ecml2ZXJTdGF0aW9uTENELAorCQlrUmVzb3VyY2VUeXBlX0VuY29kZXIsCisJCWtSZXNvdXJjZVR5cGVfR2VhclRvb3RoLAorCQlrUmVzb3VyY2VUeXBlX0d5cm8sCisJCWtSZXNvdXJjZVR5cGVfSTJDLAorCQlrUmVzb3VyY2VUeXBlX0ZyYW1ld29yaywKKwkJa1Jlc291cmNlVHlwZV9KYWd1YXIsCisJCWtSZXNvdXJjZVR5cGVfSm95c3RpY2ssCisJCWtSZXNvdXJjZVR5cGVfS2luZWN0LAorCQlrUmVzb3VyY2VUeXBlX0tpbmVjdFN0aWNrLAorCQlrUmVzb3VyY2VUeXBlX1BJRENvbnRyb2xsZXIsCisJCWtSZXNvdXJjZVR5cGVfUHJlZmVyZW5jZXMsCisJCWtSZXNvdXJjZVR5cGVfUFdNLAorCQlrUmVzb3VyY2VUeXBlX1JlbGF5LAorCQlrUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsCisJCWtSZXNvdXJjZVR5cGVfU2VyaWFsUG9ydCwKKwkJa1Jlc291cmNlVHlwZV9TZXJ2bywKKwkJa1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwKKwkJa1Jlc291cmNlVHlwZV9TUEksCisJCWtSZXNvdXJjZVR5cGVfVGFzaywKKwkJa1Jlc291cmNlVHlwZV9VbHRyYXNvbmljLAorCQlrUmVzb3VyY2VUeXBlX1ZpY3RvciwKKwkJa1Jlc291cmNlVHlwZV9CdXR0b24sCisJCWtSZXNvdXJjZVR5cGVfQ29tbWFuZCwKKwkJa1Jlc291cmNlVHlwZV9BeGlzQ2FtZXJhLAorCQlrUmVzb3VyY2VUeXBlX1BDVmlkZW9TZXJ2ZXIsCisJCWtSZXNvdXJjZVR5cGVfU21hcnREYXNoYm9hcmQsCisJCWtSZXNvdXJjZVR5cGVfVGFsb24sCisJCWtSZXNvdXJjZVR5cGVfSGlUZWNobmljQ29sb3JTZW5zb3IsCisJCWtSZXNvdXJjZVR5cGVfSGlUZWNobmljQWNjZWwsCisJCWtSZXNvdXJjZVR5cGVfSGlUZWNobmljQ29tcGFzcywKKwkJa1Jlc291cmNlVHlwZV9TUkYwOCwKKwkJa1Jlc291cmNlVHlwZV9EaWdpdGFsR2xpdGNoRmlsdGVyLAorCX07CisKKwllbnVtIHRJbnN0YW5jZXMKKwl7CisJCWtMYW5ndWFnZV9MYWJWSUVXID0gMSwKKwkJa0xhbmd1YWdlX0NQbHVzUGx1cyA9IDIsCisJCWtMYW5ndWFnZV9KYXZhID0gMywKKwkJa0xhbmd1YWdlX1B5dGhvbiA9IDQsCisKKwkJa0NBTlBsdWdpbl9CbGFja0phZ0JyaWRnZSA9IDEsCisJCWtDQU5QbHVnaW5fMkNBTiA9IDIsCisKKwkJa0ZyYW1ld29ya19JdGVyYXRpdmUgPSAxLAorCQlrRnJhbWV3b3JrX1NpbXBsZSA9IDIsCisKKwkJa1JvYm90RHJpdmVfQXJjYWRlU3RhbmRhcmQgPSAxLAorCQlrUm9ib3REcml2ZV9BcmNhZGVCdXR0b25TcGluID0gMiwKKwkJa1JvYm90RHJpdmVfQXJjYWRlUmF0aW9DdXJ2ZSA9IDMsCisJCWtSb2JvdERyaXZlX1RhbmsgPSA0LAorCQlrUm9ib3REcml2ZV9NZWNhbnVtUG9sYXIgPSA1LAorCQlrUm9ib3REcml2ZV9NZWNhbnVtQ2FydGVzaWFuID0gNiwKKworCQlrRHJpdmVyU3RhdGlvbkNJT19BbmFsb2cgPSAxLAorCQlrRHJpdmVyU3RhdGlvbkNJT19EaWdpdGFsSW4gPSAyLAorCQlrRHJpdmVyU3RhdGlvbkNJT19EaWdpdGFsT3V0ID0gMywKKworCQlrRHJpdmVyU3RhdGlvbkVJT19BY2NlbGVyYXRpb24gPSAxLAorCQlrRHJpdmVyU3RhdGlvbkVJT19BbmFsb2dJbiA9IDIsCisJCWtEcml2ZXJTdGF0aW9uRUlPX0FuYWxvZ091dCA9IDMsCisJCWtEcml2ZXJTdGF0aW9uRUlPX0J1dHRvbiA9IDQsCisJCWtEcml2ZXJTdGF0aW9uRUlPX0xFRCA9IDUsCisJCWtEcml2ZXJTdGF0aW9uRUlPX0RpZ2l0YWxJbiA9IDYsCisJCWtEcml2ZXJTdGF0aW9uRUlPX0RpZ2l0YWxPdXQgPSA3LAorCQlrRHJpdmVyU3RhdGlvbkVJT19GaXhlZERpZ2l0YWxPdXQgPSA4LAorCQlrRHJpdmVyU3RhdGlvbkVJT19QV00gPSA5LAorCQlrRHJpdmVyU3RhdGlvbkVJT19FbmNvZGVyID0gMTAsCisJCWtEcml2ZXJTdGF0aW9uRUlPX1RvdWNoU2xpZGVyID0gMTEsCisKKwkJa0FEWEwzNDVfU1BJID0gMSwKKwkJa0FEWEwzNDVfSTJDID0gMiwKKworCQlrQ29tbWFuZF9TY2hlZHVsZXIgPSAxLAorCisJCWtTbWFydERhc2hib2FyZF9JbnN0YW5jZSA9IDEsCisJfTsKK30KKworc3RydWN0IEhBTENvbnRyb2xXb3JkIHsKKwl1aW50MzJfdCBlbmFibGVkIDogMTsKKwl1aW50MzJfdCBhdXRvbm9tb3VzIDogMTsKKwl1aW50MzJfdCB0ZXN0IDoxOworCXVpbnQzMl90IGVTdG9wIDogMTsKKwl1aW50MzJfdCBmbXNBdHRhY2hlZDoxOworCXVpbnQzMl90IGRzQXR0YWNoZWQ6MTsKKwl1aW50MzJfdCBjb250cm9sX3Jlc2VydmVkIDogMjY7Cit9OworCitlbnVtIEhBTEFsbGlhbmNlU3RhdGlvbklEIHsKKwlrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMSwKKwlrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMiwKKwlrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMywKKwlrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTEsCisJa0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUyLAorCWtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMywKK307CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBheGVzIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gYSBzaW5nbGUgSEFMSm95c3RpY2tBeGVzCisJc3RydWN0LiBUaGlzIGlzIHVzZWQgZm9yIGFsbG9jYXRpbmcgYnVmZmVycywgbm90IGJvdW5kcyBjaGVja2luZywgc2luY2UKKwl0aGVyZSBhcmUgdXN1YWxseSBsZXNzIGF4ZXMgaW4gcHJhY3RpY2UuICovCitzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4Sm95c3RpY2tBeGVzID0gMTI7CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4Sm95c3RpY2tQT1ZzID0gMTI7CisKK3N0cnVjdCBIQUxKb3lzdGlja0F4ZXMgeworCXVpbnQxNl90IGNvdW50OworCWludDE2X3QgYXhlc1trTWF4Sm95c3RpY2tBeGVzXTsKK307CisKK3N0cnVjdCBIQUxKb3lzdGlja1BPVnMgeworCXVpbnQxNl90IGNvdW50OworCWludDE2X3QgcG92c1trTWF4Sm95c3RpY2tQT1ZzXTsKK307CisKK3N0cnVjdCBIQUxKb3lzdGlja0J1dHRvbnMgeworCXVpbnQzMl90IGJ1dHRvbnM7CisJdWludDhfdCBjb3VudDsKK307CisKK3N0cnVjdCBIQUxKb3lzdGlja0Rlc2NyaXB0b3IgeworCXVpbnQ4X3QgaXNYYm94OworCXVpbnQ4X3QgdHlwZTsKKwljaGFyIG5hbWVbMjU2XTsKKwl1aW50OF90IGF4aXNDb3VudDsKKwl1aW50OF90IGF4aXNUeXBlczsKKwl1aW50OF90IGJ1dHRvbkNvdW50OworCXVpbnQ4X3QgcG92Q291bnQ7Cit9OworCitpbmxpbmUgZmxvYXQgaW50VG9GbG9hdChpbnQgdmFsdWUpCit7CisJcmV0dXJuIChmbG9hdCl2YWx1ZTsKK30KKworaW5saW5lIGludCBmbG9hdFRvSW50KGZsb2F0IHZhbHVlKQoreworCXJldHVybiByb3VuZCh2YWx1ZSk7Cit9CisKK2V4dGVybiAiQyIKK3sKKwlleHRlcm4gY29uc3QgdWludDMyX3QgZGlvX2tOdW1TeXN0ZW1zOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBzb2xlbm9pZF9rTnVtRE83XzBFbGVtZW50czsKKwlleHRlcm4gY29uc3QgdWludDMyX3QgaW50ZXJydXB0X2tOdW1TeXN0ZW1zOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kOworCisJdm9pZCogZ2V0UG9ydCh1aW50OF90IHBpbik7CisJdm9pZCogZ2V0UG9ydFdpdGhNb2R1bGUodWludDhfdCBtb2R1bGUsIHVpbnQ4X3QgcGluKTsKKwljb25zdCBjaGFyKiBnZXRIQUxFcnJvck1lc3NhZ2UoaW50MzJfdCBjb2RlKTsKKworCXVpbnQxNl90IGdldEZQR0FWZXJzaW9uKGludDMyX3QgKnN0YXR1cyk7CisJdWludDMyX3QgZ2V0RlBHQVJldmlzaW9uKGludDMyX3QgKnN0YXR1cyk7CisJdWludDMyX3QgZ2V0RlBHQVRpbWUoaW50MzJfdCAqc3RhdHVzKTsKKworCWJvb2wgZ2V0RlBHQUJ1dHRvbihpbnQzMl90ICpzdGF0dXMpOworCisJaW50IEhBTFNldEVycm9yRGF0YShjb25zdCBjaGFyICplcnJvcnMsIGludCBlcnJvcnNMZW5ndGgsIGludCB3YWl0X21zKTsKKworCWludCBIQUxHZXRDb250cm9sV29yZChIQUxDb250cm9sV29yZCAqZGF0YSk7CisJaW50IEhBTEdldEFsbGlhbmNlU3RhdGlvbihlbnVtIEhBTEFsbGlhbmNlU3RhdGlvbklEICphbGxpYW5jZVN0YXRpb24pOworCWludCBIQUxHZXRKb3lzdGlja0F4ZXModWludDhfdCBqb3lzdGlja051bSwgSEFMSm95c3RpY2tBeGVzICpheGVzKTsKKwlpbnQgSEFMR2V0Sm95c3RpY2tQT1ZzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIEhBTEpveXN0aWNrUE9WcyAqcG92cyk7CisJaW50IEhBTEdldEpveXN0aWNrQnV0dG9ucyh1aW50OF90IGpveXN0aWNrTnVtLCBIQUxKb3lzdGlja0J1dHRvbnMgKmJ1dHRvbnMpOworCWludCBIQUxHZXRKb3lzdGlja0Rlc2NyaXB0b3IodWludDhfdCBqb3lzdGlja051bSwgSEFMSm95c3RpY2tEZXNjcmlwdG9yICpkZXNjKTsKKwlpbnQgSEFMU2V0Sm95c3RpY2tPdXRwdXRzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQzMl90IG91dHB1dHMsIHVpbnQxNl90IGxlZnRSdW1ibGUsIHVpbnQxNl90IHJpZ2h0UnVtYmxlKTsKKwlpbnQgSEFMR2V0TWF0Y2hUaW1lKGZsb2F0ICptYXRjaFRpbWUpOworCisJdm9pZCBIQUxTZXROZXdEYXRhU2VtKE1VTFRJV0FJVF9JRCBzZW0pOworCQorCWJvb2wgSEFMR2V0U3lzdGVtQWN0aXZlKGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBIQUxHZXRCcm93bmVkT3V0KGludDMyX3QgKnN0YXR1cyk7CisKKwlpbnQgSEFMSW5pdGlhbGl6ZShpbnQgbW9kZSA9IDApOworCXZvaWQgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1TdGFydGluZygpOworCXZvaWQgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1EaXNhYmxlZCgpOworCXZvaWQgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1BdXRvbm9tb3VzKCk7CisJdm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCgpOworCXZvaWQgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1UZXN0KCk7CisKKwl1aW50MzJfdCBIQUxSZXBvcnQodWludDhfdCByZXNvdXJjZSwgdWludDhfdCBpbnN0YW5jZU51bWJlciwgdWludDhfdCBjb250ZXh0ID0gMCwKKwkJCWNvbnN0IGNoYXIgKmZlYXR1cmUgPSBOVUxMKTsKK30KKworLy8gVE9ETzogSEFDS1MgZm9yIG5vdy4uLgorZXh0ZXJuICJDIgoreworCisJdm9pZCBOdW1lcmljQXJyYXlSZXNpemUoKTsKKwl2b2lkIFJUU2V0Q2xlYW51cFByb2MoKTsKKwl2b2lkIEVEVlJfQ3JlYXRlUmVmZXJlbmNlKCk7CisJdm9pZCBPY2N1cigpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0ludGVycnVwdHMuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML0ludGVycnVwdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNmU4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvSW50ZXJydXB0cy5ocHAKQEAgLTAsMCArMSwzMCBAQAorI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJlcnJuby5oIgorCitleHRlcm4gIkMiCit7CisJdHlwZWRlZiB2b2lkICgqSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uKSh1aW50MzJfdCBpbnRlcnJ1cHRBc3NlcnRlZE1hc2ssIHZvaWQgKnBhcmFtKTsKKworCXZvaWQqIGluaXRpYWxpemVJbnRlcnJ1cHRzKHVpbnQzMl90IGludGVycnVwdEluZGV4LCBib29sIHdhdGNoZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBjbGVhbkludGVycnVwdHModm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisKKwl1aW50MzJfdCB3YWl0Rm9ySW50ZXJydXB0KHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBkb3VibGUgdGltZW91dCwgYm9vbCBpZ25vcmVQcmV2aW91cywgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGVuYWJsZUludGVycnVwdHModm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBkaXNhYmxlSW50ZXJydXB0cyh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlkb3VibGUgcmVhZFJpc2luZ1RpbWVzdGFtcCh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlkb3VibGUgcmVhZEZhbGxpbmdUaW1lc3RhbXAodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCByZXF1ZXN0SW50ZXJydXB0cyh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgdWludDhfdCByb3V0aW5nX21vZHVsZSwgdWludDMyX3Qgcm91dGluZ19waW4sCisJCQlib29sIHJvdXRpbmdfYW5hbG9nX3RyaWdnZXIsIGludDMyX3QgKnN0YXR1cyk7CisJdm9pZCBhdHRhY2hJbnRlcnJ1cHRIYW5kbGVyKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwKKwkJCXZvaWQqIHBhcmFtLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0SW50ZXJydXB0VXBTb3VyY2VFZGdlKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UsCisJCQlpbnQzMl90ICpzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML05vdGlmaWVyLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Ob3RpZmllci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3Njg2YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Ob3RpZmllci5ocHAKQEAgLTAsMCArMSwxNSBAQAorI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK2V4dGVybiAiQyIKK3sKKwl2b2lkKiBpbml0aWFsaXplTm90aWZpZXIodm9pZCAoKlByb2Nlc3NRdWV1ZSkodWludDMyX3QsIHZvaWQqKSwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGNsZWFuTm90aWZpZXIodm9pZCogbm90aWZpZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKworCXZvaWQgdXBkYXRlTm90aWZpZXJBbGFybSh2b2lkKiBub3RpZmllcl9wb2ludGVyLCB1aW50MzJfdCB0cmlnZ2VyVGltZSwgaW50MzJfdCAqc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9QRFAuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1BEUC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkZTIyYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9QRFAuaHBwCkBAIC0wLDAgKzEsMTkgQEAKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgX192eHdvcmtzCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCitleHRlcm4gIkMiCit7CisJZG91YmxlIGdldFBEUFRlbXBlcmF0dXJlKGludDMyX3QgKnN0YXR1cyk7CisJZG91YmxlIGdldFBEUFZvbHRhZ2UoaW50MzJfdCAqc3RhdHVzKTsKKwlkb3VibGUgZ2V0UERQQ2hhbm5lbEN1cnJlbnQodWludDhfdCBjaGFubmVsLCBpbnQzMl90ICpzdGF0dXMpOworCWRvdWJsZSBnZXRQRFBUb3RhbEN1cnJlbnQoaW50MzJfdCAqc3RhdHVzKTsKKwlkb3VibGUgZ2V0UERQVG90YWxQb3dlcihpbnQzMl90ICpzdGF0dXMpOworCWRvdWJsZSBnZXRQRFBUb3RhbEVuZXJneShpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgcmVzZXRQRFBUb3RhbEVuZXJneShpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgY2xlYXJQRFBTdGlja3lGYXVsdHMoaW50MzJfdCAqc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Qb3dlci5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvUG93ZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzBjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvUG93ZXIuaHBwCkBAIC0wLDAgKzEsMjEgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiAiQyIKK3sKKwlmbG9hdCBnZXRWaW5Wb2x0YWdlKGludDMyX3QgKnN0YXR1cyk7CisJZmxvYXQgZ2V0VmluQ3VycmVudChpbnQzMl90ICpzdGF0dXMpOworCWZsb2F0IGdldFVzZXJWb2x0YWdlNlYoaW50MzJfdCAqc3RhdHVzKTsKKwlmbG9hdCBnZXRVc2VyQ3VycmVudDZWKGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRVc2VyQWN0aXZlNlYoaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHM2VihpbnQzMl90ICpzdGF0dXMpOworCWZsb2F0IGdldFVzZXJWb2x0YWdlNVYoaW50MzJfdCAqc3RhdHVzKTsKKwlmbG9hdCBnZXRVc2VyQ3VycmVudDVWKGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBnZXRVc2VyQWN0aXZlNVYoaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHM1VihpbnQzMl90ICpzdGF0dXMpOworCWZsb2F0IGdldFVzZXJWb2x0YWdlM1YzKGludDMyX3QgKnN0YXR1cyk7CisJZmxvYXQgZ2V0VXNlckN1cnJlbnQzVjMoaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldFVzZXJBY3RpdmUzVjMoaW50MzJfdCAqc3RhdHVzKTsKKwlpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHMzVjMoaW50MzJfdCAqc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9TZW1hcGhvcmUuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1NlbWFwaG9yZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyMDExZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9TZW1hcGhvcmUuaHBwCkBAIC0wLDAgKzEsNTMgQEAKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgX192eHdvcmtzCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjZW5kaWYKKworI2lmZGVmIF9fdnh3b3JrcwordHlwZWRlZiBTRU1fSUQgTVVURVhfSUQ7Cit0eXBlZGVmIFNFTV9JRCBTRU1BUEhPUkVfSUQ7Cit0eXBlZGVmIFNFTV9JRCBNVUxUSVdBSVRfSUQ7CisjZWxzZQorY2xhc3MgTXV0ZXhJbnRlcmZhY2U7Cit0eXBlZGVmIE11dGV4SW50ZXJmYWNlKiBNVVRFWF9JRDsKK3R5cGVkZWYgc2VtX3QqIFNFTUFQSE9SRV9JRDsKK3R5cGVkZWYgcHRocmVhZF9jb25kX3QqIE1VTFRJV0FJVF9JRDsKKyNlbmRpZgorCitleHRlcm4gIkMiCit7CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IFNFTUFQSE9SRV9RX0ZJRk87CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IFNFTUFQSE9SRV9RX1BSSU9SSVRZOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfREVMRVRFX1NBRkU7CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IFNFTUFQSE9SRV9JTlZFUlNJT05fU0FGRTsKKworCWV4dGVybiBjb25zdCBpbnQzMl90IFNFTUFQSE9SRV9OT19XQUlUOworCWV4dGVybiBjb25zdCBpbnQzMl90IFNFTUFQSE9SRV9XQUlUX0ZPUkVWRVI7CisKKwlleHRlcm4gY29uc3QgdWludDMyX3QgU0VNQVBIT1JFX0VNUFRZOworCWV4dGVybiBjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfRlVMTDsKKworCU1VVEVYX0lEIGluaXRpYWxpemVNdXRleFJlY3Vyc2l2ZSgpOworCU1VVEVYX0lEIGluaXRpYWxpemVNdXRleE5vcm1hbCgpOworCXZvaWQgZGVsZXRlTXV0ZXgoTVVURVhfSUQgc2VtKTsKKwlpbnQ4X3QgbG9ja011dGV4KE1VVEVYX0lEIHNlbSk7CisJaW50OF90IHRyeUxvY2tNdXRleChNVVRFWF9JRCBzZW0pOworCWludDhfdCB1bmxvY2tNdXRleChNVVRFWF9JRCBzZW0pOworCisJU0VNQVBIT1JFX0lEIGluaXRpYWxpemVTZW1hcGhvcmUodWludDMyX3QgaW5pdGlhbF92YWx1ZSk7CisJdm9pZCBkZWxldGVTZW1hcGhvcmUoU0VNQVBIT1JFX0lEIHNlbSk7CisJaW50OF90IHRha2VTZW1hcGhvcmUoU0VNQVBIT1JFX0lEIHNlbSk7CisJaW50OF90IHRyeVRha2VTZW1hcGhvcmUoU0VNQVBIT1JFX0lEIHNlbSk7CisJaW50OF90IGdpdmVTZW1hcGhvcmUoU0VNQVBIT1JFX0lEIHNlbSk7CisKKwlNVUxUSVdBSVRfSUQgaW5pdGlhbGl6ZU11bHRpV2FpdCgpOworCXZvaWQgZGVsZXRlTXVsdGlXYWl0KE1VTFRJV0FJVF9JRCBzZW0pOworCWludDhfdCB0YWtlTXVsdGlXYWl0KE1VTFRJV0FJVF9JRCBzZW0sIE1VVEVYX0lEIG0sIGludDMyX3QgdGltZW91dCk7CisJaW50OF90IGdpdmVNdWx0aVdhaXQoTVVMVElXQUlUX0lEIHNlbSk7Cit9CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9Tb2xlbm9pZC5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvU29sZW5vaWQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTRkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvU29sZW5vaWQuaHBwCkBAIC0wLDAgKzEsMjIgQEAKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgX192eHdvcmtzCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCitleHRlcm4gIkMiCit7CisJdm9pZCogaW5pdGlhbGl6ZVNvbGVub2lkUG9ydCh2b2lkKiBwb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7CisJYm9vbCBjaGVja1NvbGVub2lkTW9kdWxlKHVpbnQ4X3QgbW9kdWxlKTsKKworCWJvb2wgZ2V0U29sZW5vaWQodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0U29sZW5vaWQodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBib29sIHZhbHVlLCBpbnQzMl90ICpzdGF0dXMpOworCXZvaWQgc2V0U29sZW5vaWRzKHZvaWQqIHNvbGVub2lkX3BvcnRfcG9pbnRlciwgdWludDhfdCB2YWx1ZSwgdWludDhfdCBtYXNrLCBpbnQzMl90ICpzdGF0dXMpOworCisJaW50IGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KHZvaWQqIHNvbGVub2lkX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldFBDTVNvbGVub2lkVm9sdGFnZVN0aWNreUZhdWx0KHZvaWQqIHNvbGVub2lkX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwlib29sIGdldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KHZvaWQqIHNvbGVub2lkX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKTsKKwl2b2lkIGNsZWFyQWxsUENNU3RpY2t5RmF1bHRzX3NvbCh2b2lkICpzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvVGFzay5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvVGFzay5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzZWQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9UYXNrLmhwcApAQCAtMCwwICsxLDU1IEBACisjcHJhZ21hIG9uY2UKKworI2lmZGVmIF9fdnh3b3JrcworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX0ZVTkNQVFJfREVGSU5FRAorI2RlZmluZSBfRlVOQ1BUUl9ERUZJTkVECisjaWZkZWYgX19jcGx1c3BsdXMKK3R5cGVkZWYgaW50ICgqRlVOQ1BUUikoLi4uKTsKKy8qIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgaW50ICovCisjZWxzZQordHlwZWRlZiBpbnQgKCpGVU5DUFRSKSAoKTsgLyogcHRyIHRvIGZ1bmN0aW9uIHJldHVybmluZyBpbnQgKi8KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworI2VuZGlmIC8qIF9GVU5DUFRSX0RFRklORUQgKi8KKworI2lmbmRlZiBfU1RBVFVTX0RFRklORUQKKyNkZWZpbmUgX1NUQVRVU19ERUZJTkVECit0eXBlZGVmIGludCBTVEFUVVM7CisjZW5kaWYgLyogX1NUQVRVU19ERUZJTkVEICovCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNkZWZpbmUgTlVMTF9UQVNLIC0xCit0eXBlZGVmIGludDMyX3QgVEFTSzsKKyNlbHNlCisjZGVmaW5lIE5VTExfVEFTSyBOVUxMCit0eXBlZGVmIHB0aHJlYWRfdCogVEFTSzsKKyNlbmRpZgorCitleHRlcm4gIkMiCit7CisJZXh0ZXJuIGNvbnN0IHVpbnQzMl90IFZYV09SS1NfRlBfVEFTSzsKKwlleHRlcm4gY29uc3QgaW50MzJfdCBIQUxfb2JqTGliX09CSl9JRF9FUlJPUjsKKwlleHRlcm4gY29uc3QgaW50MzJfdCBIQUxfb2JqTGliX09CSl9ERUxFVEVEOworCWV4dGVybiBjb25zdCBpbnQzMl90IEhBTF90YXNrTGliX0lMTEVHQUxfT1BUSU9OUzsKKwlleHRlcm4gY29uc3QgaW50MzJfdCBIQUxfbWVtTGliX05PVF9FTk9VR0hfTUVNT1JZOworCWV4dGVybiBjb25zdCBpbnQzMl90IEhBTF90YXNrTGliX0lMTEVHQUxfUFJJT1JJVFk7CisKKwlUQVNLIHNwYXduVGFzayhjaGFyICogbmFtZSwgaW50IHByaW9yaXR5LCBpbnQgb3B0aW9ucywgaW50IHN0YWNrU2l6ZSwgRlVOQ1BUUiBlbnRyeVB0LAorCQkJdWludDMyX3QgYXJnMCwgdWludDMyX3QgYXJnMSwgdWludDMyX3QgYXJnMiwgdWludDMyX3QgYXJnMywgdWludDMyX3QgYXJnNCwKKwkJCXVpbnQzMl90IGFyZzUsIHVpbnQzMl90IGFyZzYsIHVpbnQzMl90IGFyZzcsIHVpbnQzMl90IGFyZzgsIHVpbnQzMl90IGFyZzkpOworCVNUQVRVUyByZXN0YXJ0VGFzayhUQVNLIHRhc2spOworCVNUQVRVUyBkZWxldGVUYXNrKFRBU0sgdGFzayk7CisJU1RBVFVTIGlzVGFza1JlYWR5KFRBU0sgdGFzayk7CisJU1RBVFVTIGlzVGFza1N1c3BlbmRlZChUQVNLIHRhc2spOworCVNUQVRVUyBzdXNwZW5kVGFzayhUQVNLIHRhc2spOworCVNUQVRVUyByZXN1bWVUYXNrKFRBU0sgdGFzayk7CisJU1RBVFVTIHZlcmlmeVRhc2tJRChUQVNLIHRhc2spOworCVNUQVRVUyBzZXRUYXNrUHJpb3JpdHkoVEFTSyB0YXNrLCBpbnQgcHJpb3JpdHkpOworCVNUQVRVUyBnZXRUYXNrUHJpb3JpdHkoVEFTSyB0YXNrLCBpbnQqIHByaW9yaXR5KTsKK30KKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1V0aWxpdGllcy5ocHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvVXRpbGl0aWVzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjRjZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML1V0aWxpdGllcy5ocHAKQEAgLTAsMCArMSwxNyBAQAorI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK2V4dGVybiAiQyIKK3sKKwlleHRlcm4gY29uc3QgaW50MzJfdCBIQUxfTk9fV0FJVDsKKwlleHRlcm4gY29uc3QgaW50MzJfdCBIQUxfV0FJVF9GT1JFVkVSOworCisJdm9pZCBkZWxheVRpY2tzKGludDMyX3QgdGlja3MpOworCXZvaWQgZGVsYXlNaWxsaXMoZG91YmxlIG1zKTsKKwl2b2lkIGRlbGF5U2Vjb25kcyhkb3VibGUgcyk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvY3BwL1Jlc291cmNlLmhwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9pbmNsdWRlL0hBTC9jcHAvUmVzb3VyY2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTQwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvY3BwL1Jlc291cmNlLmhwcApAQCAtMCwwICsxLDQ1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIi4uL0Vycm9ycy5ocHAiCisjaW5jbHVkZSAiU3luY2hyb25pemVkLmhwcCIKKyNpZmRlZiBfX3Z4d29ya3MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qKgorICogVGhlIFJlc291cmNlIGNsYXNzIGlzIGEgY29udmVuaWVudCB3YXkgdG8gdHJhY2sgYWxsb2NhdGVkIHJlc291cmNlcy4KKyAqIEl0IHRyYWNrcyB0aGVtIGFzIGluZGljaWVzIGluIHRoZSByYW5nZSBbMCAuLiBlbGVtZW50cyAtIDFdLgorICogRS5nLiB0aGUgbGlicmFyeSB1c2VzIHRoaXMgdG8gdHJhY2sgaGFyZHdhcmUgY2hhbm5lbCBhbGxvY2F0aW9uLgorICoKKyAqIFRoZSBSZXNvdXJjZSBjbGFzcyBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaGFyZHdhcmUgY2hhbm5lbHMgb3Igb3RoZXIKKyAqIHJlc291cmNlczsgaXQganVzdCB0cmFja3Mgd2hpY2ggaW5kaWNlcyB3ZXJlIG1hcmtlZCBpbiB1c2UgYnkKKyAqIEFsbG9jYXRlIGFuZCBub3QgeWV0IGZyZWVkIGJ5IEZyZWUuCisgKi8KK2NsYXNzIFJlc291cmNlCit7CitwdWJsaWM6CisJdmlydHVhbCB+UmVzb3VyY2UoKTsKKwlzdGF0aWMgdm9pZCBDcmVhdGVSZXNvdXJjZU9iamVjdChSZXNvdXJjZSAqKnIsIHVpbnQzMl90IGVsZW1lbnRzKTsKKwl1aW50MzJfdCBBbGxvY2F0ZShjb25zdCBjaGFyICpyZXNvdXJjZURlc2MpOworCXVpbnQzMl90IEFsbG9jYXRlKHVpbnQzMl90IGluZGV4LCBjb25zdCBjaGFyICpyZXNvdXJjZURlc2MpOworCXZvaWQgRnJlZSh1aW50MzJfdCBpbmRleCk7CisKK3ByaXZhdGU6CisJZXhwbGljaXQgUmVzb3VyY2UodWludDMyX3Qgc2l6ZSk7CisKKwlib29sICptX2lzQWxsb2NhdGVkOworCVJlZW50cmFudE11dGV4IG1fYWxsb2NhdGVMb2NrOworCXVpbnQzMl90IG1fc2l6ZTsKKworCXN0YXRpYyBSZWVudHJhbnRNdXRleCBtX2NyZWF0ZUxvY2s7CisKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVzb3VyY2UpOworfTsKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGIxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9IQUwvY3BwL1N5bmNocm9uaXplZC5ocHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSAiSEFML1NlbWFwaG9yZS5ocHAiCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgdGhlIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPSBmdW5jdGlvbnMKKy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHByaXZhdGU6IGRlY2xhcmF0aW9ucyBmb3IgYSBjbGFzcworI2RlZmluZSBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGUKKworY2xhc3MgU3luY2hyb25pemVkOworCisvKioKKyAqIFdyYXAgYSBwdGhlYWQgbXV0ZXggZm9yIGVhc2llciB1c2UgaW4gQysrLiBGb3IgYSBzdGF0aWMKKyAqIGluc3RhbmNlLCB0aGUgY29uc3RydWN0b3IgcnVucyBhdCBwcm9ncmFtIGxvYWQgdGltZSBiZWZvcmUgbWFpbigpIGNhbiBzcGF3bgorICogYW55IHRhc2tzLiBVc2UgdGhhdCB0byBmaXggcmFjZSBjb25kaXRpb25zIGluIHNldHVwIGNvZGUuCisgKgorICogVGhpcyB1c2VzIGEgcHRocmVhZCBtdXRleCB3aGljaCBoYXMgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgc2V0LCBtYWtpbmcgaXQKKyAqICJyZWVudHJhbnQiIGluIHRoZSBzZW5zZSB0aGF0IHRoZSBvd25pbmcgdGFzayBjYW4gbG9jayBpdCBtb3JlIHRoYW4gb25jZS4gVGhlCisgKiB0YXNrIHdpbGwgbmVlZCB0byB1bmxvY2sgdGhlIG11dGV4IHRoZSBzYW1lIG51bWJlciBvZiB0aW1lcyB0byBtYWtlIGl0CisgKiBhdmFpbGFibGUgZm9yIG90aGVyIHRocmVhZHMgdG8gYWNxdWlyZS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIHNhZmUgdG8gdXNlIGluIHN0YXRpYyB2YXJpYWJsZXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBkZXBlbmQgb24KKyAqIGFueSBvdGhlciBDKysgc3RhdGljIGNvbnN0cnVjdG9ycyBvciBkZXN0cnVjdG9ycy4KKyAqLworY2xhc3MgUmVlbnRyYW50TXV0ZXggeworIHB1YmxpYzoKKyAgdHlwZWRlZiBwdGhyZWFkX211dGV4X3QgKm5hdGl2ZV9oYW5kbGVfdHlwZTsKKworICBjb25zdGV4cHIgUmVlbnRyYW50TXV0ZXgoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgIFJlZW50cmFudE11dGV4KGNvbnN0IFJlZW50cmFudE11dGV4ICYpID0gZGVsZXRlOworICBSZWVudHJhbnRNdXRleCAmb3BlcmF0b3I9KGNvbnN0IFJlZW50cmFudE11dGV4ICYpID0gZGVsZXRlOworCisgIC8qKgorICAgKiBMb2NrIHRoZSBtdXRleCwgYmxvY2tpbmcgdW50aWwgaXQncyBhdmFpbGFibGUuCisgICAqLworICB2b2lkIGxvY2soKSB7IHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsgfQorCisgIC8qKgorICAgKiBVbmxvY2sgdGhlIG11dGV4LgorICAgKi8KKyAgdm9pZCB1bmxvY2soKSB7IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOyB9CisKKyAgLyoqCisgICAqIFRyaWVzIHRvIGxvY2sgdGhlIG11dGV4LgorICAgKi8KKyAgYm9vbCB0cnlfbG9jaygpIG5vZXhjZXB0IHsgcmV0dXJuICFwdGhyZWFkX211dGV4X3RyeWxvY2soJm11dGV4Xyk7IH0KKworICBwdGhyZWFkX211dGV4X3QgKm5hdGl2ZV9oYW5kbGUoKSB7IHJldHVybiAmbXV0ZXhfOyB9CisKKyBwcml2YXRlOgorICAvLyBEbyB0aGUgZXF1aXZhbGVudCBvZiBzZXR0aW5nIFBUSFJFQURfUFJJT19JTkhFUklUIGFuZAorICAvLyBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUC4KKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICNlcnJvciAiU2hvdWxkIHdvcmssIGJ1dCBuZWVkIHRvIHJ1biB0ZXN0IGNhc2UgdG8gdmVyaWZ5IgorICBwdGhyZWFkX211dGV4X3QgbXV0ZXhfID0geworICAgICAgezAsIDAsIDAsIDAsIDB4MjAgfCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwgMCwgezAsIDB9fX07CisjZWxzZQorICBwdGhyZWFkX211dGV4X3QgbXV0ZXhfID0geworICAgICAgezAsIDAsIDAsIDB4MjAgfCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwgMCwgezB9fX07CisjZW5kaWYKK307CisKKy8qKgorICogV3JhcCBhIHB0aGVhZCBtdXRleCBmb3IgZWFzaWVyIHVzZSBpbiBDKysuIEZvciBhIHN0YXRpYworICogaW5zdGFuY2UsIHRoZSBjb25zdHJ1Y3RvciBydW5zIGF0IHByb2dyYW0gbG9hZCB0aW1lIGJlZm9yZSBtYWluKCkgY2FuIHNwYXduCisgKiBhbnkgdGFza3MuIFVzZSB0aGF0IHRvIGZpeCByYWNlIGNvbmRpdGlvbnMgaW4gc2V0dXAgY29kZS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIHNhZmUgdG8gdXNlIGluIHN0YXRpYyB2YXJpYWJsZXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBkZXBlbmQgb24KKyAqIGFueSBvdGhlciBDKysgc3RhdGljIGNvbnN0cnVjdG9ycyBvciBkZXN0cnVjdG9ycy4KKyAqLworY2xhc3MgTXV0ZXggeworIHB1YmxpYzoKKyAgdHlwZWRlZiBwdGhyZWFkX211dGV4X3QgKm5hdGl2ZV9oYW5kbGVfdHlwZTsKKworICBjb25zdGV4cHIgTXV0ZXgoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgIE11dGV4KGNvbnN0IE11dGV4ICYpID0gZGVsZXRlOworICBNdXRleCAmb3BlcmF0b3I9KGNvbnN0IE11dGV4ICYpID0gZGVsZXRlOworCisgIC8qKgorICAgKiBMb2NrIHRoZSBtdXRleCwgYmxvY2tpbmcgdW50aWwgaXQncyBhdmFpbGFibGUuCisgICAqLworICB2b2lkIGxvY2soKSB7IHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsgfQorCisgIC8qKgorICAgKiBVbmxvY2sgdGhlIG11dGV4LgorICAgKi8KKyAgdm9pZCB1bmxvY2soKSB7IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOyB9CisKKyAgLyoqCisgICAqIFRyaWVzIHRvIGxvY2sgdGhlIG11dGV4LgorICAgKi8KKyAgYm9vbCB0cnlfbG9jaygpIG5vZXhjZXB0IHsgcmV0dXJuICFwdGhyZWFkX211dGV4X3RyeWxvY2soJm11dGV4Xyk7IH0KKworICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpIHsgcmV0dXJuICZtdXRleF87IH0KKworIHByaXZhdGU6CisgIC8vIERvIHRoZSBlcXVpdmFsZW50IG9mIHNldHRpbmcgUFRIUkVBRF9QUklPX0lOSEVSSVQuCisjaWYgX19XT1JEU0laRSA9PSA2NAorICAjZXJyb3IgIlNob3VsZCB3b3JrLCBidXQgbmVlZCB0byBydW4gdGVzdCBjYXNlIHRvIHZlcmlmeSIKKyAgcHRocmVhZF9tdXRleF90IG11dGV4XyA9IHsgeyAwLCAwLCAwLCAwLCAweDIwLCAwLCB7IDAsIDAgfSB9IH07CisjZWxzZQorICBwdGhyZWFkX211dGV4X3QgbXV0ZXhfID0geyB7IDAsIDAsIDAsIDB4MjAsIDAsIHsgMCB9IH0gfTsKKyNlbmRpZgorfTsKKworCisvKioKKyAqIFByb3ZpZGUgZWFzeSBzdXBwb3J0IGZvciBjcml0aWNhbCByZWdpb25zLgorICoKKyAqIEEgY3JpdGljYWwgcmVnaW9uIGlzIGFuIGFyZWEgb2YgY29kZSB0aGF0IGlzIGFsd2F5cyBleGVjdXRlZCB1bmRlciBtdXR1YWwgZXhjbHVzaW9uLiBPbmx5CisgKiBvbmUgdGFzayBjYW4gYmUgZXhlY3V0aW5nIHRoaXMgY29kZSBhdCBhbnkgdGltZS4gVGhlIGlkZWEgaXMgdGhhdCBjb2RlIHRoYXQgbWFuaXB1bGF0ZXMgZGF0YQorICogdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiB0d28gb3IgbW9yZSB0YXNrcyBoYXMgdG8gYmUgcHJldmVudGVkIGZyb20gZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUKKyAqIG90aGVyd2lzZSBhIHJhY2UgY29uZGl0aW9uIGlzIHBvc3NpYmxlIHdoZW4gYm90aCB0YXNrcyB0cnkgdG8gdXBkYXRlIHRoZSBkYXRhLiBUeXBpY2FsbHkKKyAqIHNlbWFwaG9yZXMgYXJlIHVzZWQgdG8gZW5zdXJlIG9ubHkgc2luZ2xlIHRhc2sgYWNjZXNzIHRvIHRoZSBkYXRhLgorICoKKyAqIFN5bmNocm9uaXplZCBvYmplY3RzIGFyZSBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBzZW1hcGhvcmVzIHRvIGhlbHAgZW5zdXJlCisgKiB0aGF0IHNlbWFwaG9yZXMgYXJlIGFsd2F5cyB1bmxvY2tlZCAoc2VtR2l2ZSkgYWZ0ZXIgbG9ja2luZyAoc2VtVGFrZSkuCisgKgorICogWW91IGFsbG9jYXRlIGEgU3luY2hyb25pemVkIGFzIGEgbG9jYWwgdmFyaWFibGUsICpub3QqIG9uIHRoZSBoZWFwLiBUaGF0CisgKiBtYWtlcyBpdCBhICJzdGFjayBvYmplY3QiIHdob3NlIGRlc3RydWN0b3IgcnVucyBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgZ29lcworICogb3V0IG9mIHNjb3BlLiBFLmcuCisgKgorICogICB7IFN5bmNocm9uaXplZCBfc3luYyhhUmVlbnRyYW50U2VtYXBob3JlKTsgLi4uIGNyaXRpY2FsIHJlZ2lvbiAuLi4gfQorICovCitjbGFzcyBTeW5jaHJvbml6ZWQKK3sKK3B1YmxpYzoKKyNpZm5kZWYgX192eHdvcmtzCisJZXhwbGljaXQgU3luY2hyb25pemVkKFNFTUFQSE9SRV9JRCk7CisjZW5kaWYKKwl2aXJ0dWFsIH5TeW5jaHJvbml6ZWQoKTsKK3ByaXZhdGU6CisJU0VNQVBIT1JFX0lEIG1fc2VtYXBob3JlOworCisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN5bmNocm9uaXplZCk7Cit9OworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvaW5jbHVkZS9Mb2cuaHBwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvTG9nLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjIyMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2luY2x1ZGUvTG9nLmhwcApAQCAtMCwwICsxLDEwMyBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworaW5saW5lIHN0ZDo6c3RyaW5nIE5vd1RpbWUoKTsKKworZW51bSBUTG9nTGV2ZWwge2xvZ05PTkUsIGxvZ0VSUk9SLCBsb2dXQVJOSU5HLCBsb2dJTkZPLCBsb2dERUJVRywgbG9nREVCVUcxLCBsb2dERUJVRzIsIGxvZ0RFQlVHMywgbG9nREVCVUc0fTsKKworY2xhc3MgTG9nCit7CitwdWJsaWM6CisgICAgTG9nKCk7CisgICAgdmlydHVhbCB+TG9nKCk7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtJiBHZXQoVExvZ0xldmVsIGxldmVsID0gbG9nSU5GTyk7CitwdWJsaWM6CisgICAgc3RhdGljIFRMb2dMZXZlbCYgUmVwb3J0aW5nTGV2ZWwoKTsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgVG9TdHJpbmcoVExvZ0xldmVsIGxldmVsKTsKKyAgICBzdGF0aWMgVExvZ0xldmVsIEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxldmVsKTsKK3Byb3RlY3RlZDoKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7Citwcml2YXRlOgorICAgIExvZyhjb25zdCBMb2cmKTsKKyAgICBMb2cmIG9wZXJhdG9yID0oY29uc3QgTG9nJik7Cit9OworCitpbmxpbmUgTG9nOjpMb2coKQoreworfQorCitpbmxpbmUgc3RkOjpvc3RyaW5nc3RyZWFtJiBMb2c6OkdldChUTG9nTGV2ZWwgbGV2ZWwpCit7CisgICAgb3MgPDwgIi0gIiA8PCBOb3dUaW1lKCk7CisgICAgb3MgPDwgIiAiIDw8IFRvU3RyaW5nKGxldmVsKSA8PCAiOiAiOworICAgIG9zIDw8IHN0ZDo6c3RyaW5nKGxldmVsID4gbG9nREVCVUcgPyBsZXZlbCAtIGxvZ0RFQlVHIDogMCwgJ1x0Jyk7CisgICAgcmV0dXJuIG9zOworfQorCitpbmxpbmUgTG9nOjp+TG9nKCkKK3sKKyAgICBvcyA8PCBzdGQ6OmVuZGw7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIG9zLnN0cigpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworfQorCitpbmxpbmUgVExvZ0xldmVsJiBMb2c6OlJlcG9ydGluZ0xldmVsKCkKK3sKKyAgICBzdGF0aWMgVExvZ0xldmVsIHJlcG9ydGluZ0xldmVsID0gbG9nREVCVUc0OworICAgIHJldHVybiByZXBvcnRpbmdMZXZlbDsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIExvZzo6VG9TdHJpbmcoVExvZ0xldmVsIGxldmVsKQoreworCXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBidWZmZXJbXSA9IHsiTk9ORSIsICJFUlJPUiIsICJXQVJOSU5HIiwgIklORk8iLCAiREVCVUciLCAiREVCVUcxIiwgIkRFQlVHMiIsICJERUJVRzMiLCAiREVCVUc0In07CisgICAgcmV0dXJuIGJ1ZmZlcltsZXZlbF07Cit9CisKK2lubGluZSBUTG9nTGV2ZWwgTG9nOjpGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsZXZlbCkKK3sKKyAgICBpZiAobGV2ZWwgPT0gIkRFQlVHNCIpCisgICAgICAgIHJldHVybiBsb2dERUJVRzQ7CisgICAgaWYgKGxldmVsID09ICJERUJVRzMiKQorICAgICAgICByZXR1cm4gbG9nREVCVUczOworICAgIGlmIChsZXZlbCA9PSAiREVCVUcyIikKKyAgICAgICAgcmV0dXJuIGxvZ0RFQlVHMjsKKyAgICBpZiAobGV2ZWwgPT0gIkRFQlVHMSIpCisgICAgICAgIHJldHVybiBsb2dERUJVRzE7CisgICAgaWYgKGxldmVsID09ICJERUJVRyIpCisgICAgICAgIHJldHVybiBsb2dERUJVRzsKKyAgICBpZiAobGV2ZWwgPT0gIklORk8iKQorICAgICAgICByZXR1cm4gbG9nSU5GTzsKKyAgICBpZiAobGV2ZWwgPT0gIldBUk5JTkciKQorICAgICAgICByZXR1cm4gbG9nV0FSTklORzsKKyAgICBpZiAobGV2ZWwgPT0gIkVSUk9SIikKKyAgICAgICAgcmV0dXJuIGxvZ0VSUk9SOworICAgIGlmIChsZXZlbCA9PSAiTk9ORSIpCisgICAgCXJldHVybiBsb2dOT05FOworICAgIExvZygpLkdldChsb2dXQVJOSU5HKSA8PCAiVW5rbm93biBsb2dnaW5nIGxldmVsICciIDw8IGxldmVsIDw8ICInLiBVc2luZyBJTkZPIGxldmVsIGFzIGRlZmF1bHQuIjsKKyAgICByZXR1cm4gbG9nSU5GTzsKK30KKwordHlwZWRlZiBMb2cgRklMRUxvZzsKKworI2RlZmluZSBGSUxFX0xPRyhsZXZlbCkgXAorICAgIGlmIChsZXZlbCA+IEZJTEVMb2c6OlJlcG9ydGluZ0xldmVsKCkpIDsgXAorICAgIGVsc2UgTG9nKCkuR2V0KGxldmVsKQorCitpbmxpbmUgc3RkOjpzdHJpbmcgTm93VGltZSgpCit7CisgICAgY2hhciBidWZmZXJbMTFdOworICAgIHRpbWVfdCB0OworICAgIHRpbWUoJnQpOworICAgIHRtICogciA9IGdtdGltZSgmdCk7CisgICAgc3RyZnRpbWUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVIOiVNOiVTIiwgcik7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisgICAgY2hhciByZXN1bHRbMTAwXSA9IHswfTsKKyAgICBzcHJpbnRmKHJlc3VsdCwgIiVzLiUwM2xkIiwgYnVmZmVyLCAobG9uZyl0di50dl91c2VjIC8gMTAwMCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0FjY2VsZXJvbWV0ZXIuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQWNjZWxlcm9tZXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5NWM5YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0FjY2VsZXJvbWV0ZXIuY3BwCkBAIC0wLDAgKzEsMjM0IEBACisjaW5jbHVkZSAiSEFML0FjY2VsZXJvbWV0ZXIuaHBwIgorCisjaW5jbHVkZSAiQ2hpcE9iamVjdC5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8vIFRoZSA3LWJpdCBJMkMgYWRkcmVzcyB3aXRoIGEgMCAic2VuZCIgYml0CitzdGF0aWMgY29uc3QgdWludDhfdCBrU2VuZEFkZHJlc3MgPSAoMHgxYyA8PCAxKSB8IDA7CisKKy8vIFRoZSA3LWJpdCBJMkMgYWRkcmVzcyB3aXRoIGEgMSAicmVjZWl2ZSIgYml0CitzdGF0aWMgY29uc3QgdWludDhfdCBrUmVjZWl2ZUFkZHJlc3MgPSAoMHgxYyA8PCAxKSB8IDE7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb250cm9sVHhSeCA9IDE7CitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29udHJvbFN0YXJ0ID0gMjsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb250cm9sU3RvcCA9IDQ7CisKK3N0YXRpYyB0QWNjZWwgKmFjY2VsID0gMDsKK3N0YXRpYyBBY2NlbGVyb21ldGVyUmFuZ2UgYWNjZWxlcm9tZXRlclJhbmdlOworCisvLyBSZWdpc3RlciBhZGRyZXNzZXMKK2VudW0gUmVnaXN0ZXIgeworCWtSZWdfU3RhdHVzID0gMHgwMCwKKwlrUmVnX091dFhNU0IgPSAweDAxLAorCWtSZWdfT3V0WExTQiA9IDB4MDIsCisJa1JlZ19PdXRZTVNCID0gMHgwMywKKwlrUmVnX091dFlMU0IgPSAweDA0LAorCWtSZWdfT3V0Wk1TQiA9IDB4MDUsCisJa1JlZ19PdXRaTFNCID0gMHgwNiwKKwlrUmVnX1N5c21vZCA9IDB4MEIsCisJa1JlZ19JbnRTb3VyY2UgPSAweDBDLAorCWtSZWdfV2hvQW1JID0gMHgwRCwKKwlrUmVnX1hZWkRhdGFDZmcgPSAweDBFLAorCWtSZWdfSFBGaWx0ZXJDdXRvZmYgPSAweDBGLAorCWtSZWdfUExTdGF0dXMgPSAweDEwLAorCWtSZWdfUExDZmcgPSAweDExLAorCWtSZWdfUExDb3VudCA9IDB4MTIsCisJa1JlZ19QTEJmWmNvbXAgPSAweDEzLAorCWtSZWdfUExUaHNSZWcgPSAweDE0LAorCWtSZWdfRkZNdENmZyA9IDB4MTUsCisJa1JlZ19GRk10U3JjID0gMHgxNiwKKwlrUmVnX0ZGTXRUaHMgPSAweDE3LAorCWtSZWdfRkZNdENvdW50ID0gMHgxOCwKKwlrUmVnX1RyYW5zaWVudENmZyA9IDB4MUQsCisJa1JlZ19UcmFuc2llbnRTcmMgPSAweDFFLAorCWtSZWdfVHJhbnNpZW50VGhzID0gMHgxRiwKKwlrUmVnX1RyYW5zaWVudENvdW50ID0gMHgyMCwKKwlrUmVnX1B1bHNlQ2ZnID0gMHgyMSwKKwlrUmVnX1B1bHNlU3JjID0gMHgyMiwKKwlrUmVnX1B1bHNlVGhzeCA9IDB4MjMsCisJa1JlZ19QdWxzZVRoc3kgPSAweDI0LAorCWtSZWdfUHVsc2VUaHN6ID0gMHgyNSwKKwlrUmVnX1B1bHNlVG1sdCA9IDB4MjYsCisJa1JlZ19QdWxzZUx0Y3kgPSAweDI3LAorCWtSZWdfUHVsc2VXaW5kID0gMHgyOCwKKwlrUmVnX0FTbHBDb3VudCA9IDB4MjksCisJa1JlZ19DdHJsUmVnMSA9IDB4MkEsCisJa1JlZ19DdHJsUmVnMiA9IDB4MkIsCisJa1JlZ19DdHJsUmVnMyA9IDB4MkMsCisJa1JlZ19DdHJsUmVnNCA9IDB4MkQsCisJa1JlZ19DdHJsUmVnNSA9IDB4MkUsCisJa1JlZ19PZmZYID0gMHgyRiwKKwlrUmVnX09mZlkgPSAweDMwLAorCWtSZWdfT2ZmWiA9IDB4MzEKK307CisKK2V4dGVybiAiQyIgdWludDMyX3QgZ2V0RlBHQVRpbWUoaW50MzJfdCAqc3RhdHVzKTsKKworc3RhdGljIHZvaWQgd3JpdGVSZWdpc3RlcihSZWdpc3RlciByZWcsIHVpbnQ4X3QgZGF0YSk7CitzdGF0aWMgdWludDhfdCByZWFkUmVnaXN0ZXIoUmVnaXN0ZXIgcmVnKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBhY2NlbGVyb21ldGVyLgorICovCitzdGF0aWMgdm9pZCBpbml0aWFsaXplQWNjZWxlcm9tZXRlcigpIHsKKwlpbnQzMl90IHN0YXR1czsKKworCWlmKCFhY2NlbCkgeworCQlhY2NlbCA9IHRBY2NlbDo6Y3JlYXRlKCZzdGF0dXMpOworCisJCS8vIEVuYWJsZSBJMkMKKwkJYWNjZWwtPndyaXRlQ05GRygxLCAmc3RhdHVzKTsKKworCQkvLyBTZXQgdGhlIGNvdW50ZXIgdG8gMTAwIGticHMKKwkJYWNjZWwtPndyaXRlQ05UUigyMTMsICZzdGF0dXMpOworCisJCS8vIFRoZSBkZXZpY2UgaWRlbnRpZmljYXRpb24gbnVtYmVyIHNob3VsZCBiZSAweDJhCisJCWFzc2VydChyZWFkUmVnaXN0ZXIoa1JlZ19XaG9BbUkpID09IDB4MmEpOworCX0KK30KKworc3RhdGljIHZvaWQgd3JpdGVSZWdpc3RlcihSZWdpc3RlciByZWcsIHVpbnQ4X3QgZGF0YSkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MzJfdCBpbml0aWFsVGltZTsKKworCWFjY2VsLT53cml0ZUFERFIoa1NlbmRBZGRyZXNzLCAmc3RhdHVzKTsKKworCS8vIFNlbmQgYSBzdGFydCB0cmFuc21pdC9yZWNlaXZlIG1lc3NhZ2Ugd2l0aCB0aGUgcmVnaXN0ZXIgYWRkcmVzcworCWFjY2VsLT53cml0ZUNOVEwoa0NvbnRyb2xTdGFydCB8IGtDb250cm9sVHhSeCwgJnN0YXR1cyk7CisJYWNjZWwtPndyaXRlREFUTyhyZWcsICZzdGF0dXMpOworCWFjY2VsLT5zdHJvYmVHTygmc3RhdHVzKTsKKworCS8vIEV4ZWN1dGUgYW5kIHdhaXQgdW50aWwgaXQncyBkb25lICh1cCB0byBhIG1pbGxpc2Vjb25kKQorCWluaXRpYWxUaW1lID0gZ2V0RlBHQVRpbWUoJnN0YXR1cyk7CisJd2hpbGUoYWNjZWwtPnJlYWRTVEFUKCZzdGF0dXMpICYgMSkgeworCQlpZihnZXRGUEdBVGltZSgmc3RhdHVzKSA+IGluaXRpYWxUaW1lICsgMTAwMCkgYnJlYWs7CisJfQorCisJLy8gU2VuZCBhIHN0b3AgdHJhbnNtaXQvcmVjZWl2ZSBtZXNzYWdlIHdpdGggdGhlIGRhdGEKKwlhY2NlbC0+d3JpdGVDTlRMKGtDb250cm9sU3RvcCB8IGtDb250cm9sVHhSeCwgJnN0YXR1cyk7CisJYWNjZWwtPndyaXRlREFUTyhkYXRhLCAmc3RhdHVzKTsKKwlhY2NlbC0+c3Ryb2JlR08oJnN0YXR1cyk7CisKKwkvLyBFeGVjdXRlIGFuZCB3YWl0IHVudGlsIGl0J3MgZG9uZSAodXAgdG8gYSBtaWxsaXNlY29uZCkKKwlpbml0aWFsVGltZSA9IGdldEZQR0FUaW1lKCZzdGF0dXMpOworCXdoaWxlKGFjY2VsLT5yZWFkU1RBVCgmc3RhdHVzKSAmIDEpIHsKKwkJaWYoZ2V0RlBHQVRpbWUoJnN0YXR1cykgPiBpbml0aWFsVGltZSArIDEwMDApIGJyZWFrOworCX0KKworCWZmbHVzaChzdGRvdXQpOworfQorCitzdGF0aWMgdWludDhfdCByZWFkUmVnaXN0ZXIoUmVnaXN0ZXIgcmVnKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQzMl90IGluaXRpYWxUaW1lOworCisJLy8gU2VuZCBhIHN0YXJ0IHRyYW5zbWl0L3JlY2VpdmUgbWVzc2FnZSB3aXRoIHRoZSByZWdpc3RlciBhZGRyZXNzCisJYWNjZWwtPndyaXRlQUREUihrU2VuZEFkZHJlc3MsICZzdGF0dXMpOworCWFjY2VsLT53cml0ZUNOVEwoa0NvbnRyb2xTdGFydCB8IGtDb250cm9sVHhSeCwgJnN0YXR1cyk7CisJYWNjZWwtPndyaXRlREFUTyhyZWcsICZzdGF0dXMpOworCWFjY2VsLT5zdHJvYmVHTygmc3RhdHVzKTsKKworCS8vIEV4ZWN1dGUgYW5kIHdhaXQgdW50aWwgaXQncyBkb25lICh1cCB0byBhIG1pbGxpc2Vjb25kKQorCWluaXRpYWxUaW1lID0gZ2V0RlBHQVRpbWUoJnN0YXR1cyk7CisJd2hpbGUoYWNjZWwtPnJlYWRTVEFUKCZzdGF0dXMpICYgMSkgeworCQlpZihnZXRGUEdBVGltZSgmc3RhdHVzKSA+IGluaXRpYWxUaW1lICsgMTAwMCkgYnJlYWs7CisJfQorCisJLy8gUmVjZWl2ZSBhIG1lc3NhZ2Ugd2l0aCB0aGUgZGF0YSBhbmQgc3RvcAorCWFjY2VsLT53cml0ZUFERFIoa1JlY2VpdmVBZGRyZXNzLCAmc3RhdHVzKTsKKwlhY2NlbC0+d3JpdGVDTlRMKGtDb250cm9sU3RhcnQgfCBrQ29udHJvbFN0b3AgfCBrQ29udHJvbFR4UngsICZzdGF0dXMpOworCWFjY2VsLT5zdHJvYmVHTygmc3RhdHVzKTsKKworCS8vIEV4ZWN1dGUgYW5kIHdhaXQgdW50aWwgaXQncyBkb25lICh1cCB0byBhIG1pbGxpc2Vjb25kKQorCWluaXRpYWxUaW1lID0gZ2V0RlBHQVRpbWUoJnN0YXR1cyk7CisJd2hpbGUoYWNjZWwtPnJlYWRTVEFUKCZzdGF0dXMpICYgMSkgeworCQlpZihnZXRGUEdBVGltZSgmc3RhdHVzKSA+IGluaXRpYWxUaW1lICsgMTAwMCkgYnJlYWs7CisJfQorCisJZmZsdXNoKHN0ZG91dCk7CisKKwlyZXR1cm4gYWNjZWwtPnJlYWREQVRJKCZzdGF0dXMpOworfQorCisvKioKKyAqIENvbnZlcnQgYSAxMi1iaXQgcmF3IGFjY2VsZXJhdGlvbiB2YWx1ZSBpbnRvIGEgc2NhbGVkIGRvdWJsZSBpbiB1bml0cyBvZgorICogMSBnLWZvcmNlLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBhY2NlbGVyb21ldGVyIHJhbmdlLgorICovCitzdGF0aWMgZG91YmxlIHVucGFja0F4aXMoaW50MTZfdCByYXcpIHsKKwkvLyBUaGUgcmF3IHZhbHVlIGlzIGFjdHVhbGx5IDEyIGJpdHMsIG5vdCAxNiwgc28gd2UgbmVlZCB0byBwcm9wb2dhdGUgdGhlCisJLy8gMidzIGNvbXBsZW1lbnQgc2lnbiBiaXQgdG8gdGhlIHVudXNlZCA0IGJpdHMgZm9yIHRoaXMgdG8gd29yayB3aXRoCisJLy8gbmVnYXRpdmUgbnVtYmVycy4KKwlyYXcgPDw9IDQ7CisJcmF3ID4+PSA0OworCisJc3dpdGNoKGFjY2VsZXJvbWV0ZXJSYW5nZSkgeworCWNhc2Uga1JhbmdlXzJHOiByZXR1cm4gcmF3IC8gMTAyNC4wOworCWNhc2Uga1JhbmdlXzRHOiByZXR1cm4gcmF3IC8gNTEyLjA7CisJY2FzZSBrUmFuZ2VfOEc6IHJldHVybiByYXcgLyAyNTYuMDsKKwlkZWZhdWx0OiByZXR1cm4gMC4wOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIGFjY2VsZXJvbWV0ZXIgdG8gYWN0aXZlIG9yIHN0YW5kYnkgbW9kZS4gIEl0IG11c3QgYmUgaW4gc3RhbmRieQorICogbW9kZSB0byBjaGFuZ2UgYW55IGNvbmZpZ3VyYXRpb24uCisgKi8KK3ZvaWQgc2V0QWNjZWxlcm9tZXRlckFjdGl2ZShib29sIGFjdGl2ZSkgeworCWluaXRpYWxpemVBY2NlbGVyb21ldGVyKCk7CisKKwl1aW50OF90IGN0cmxSZWcxID0gcmVhZFJlZ2lzdGVyKGtSZWdfQ3RybFJlZzEpOworCWN0cmxSZWcxICY9IH4xOyAvLyBDbGVhciB0aGUgZXhpc3RpbmcgYWN0aXZlIGJpdAorCXdyaXRlUmVnaXN0ZXIoa1JlZ19DdHJsUmVnMSwgY3RybFJlZzEgfCAoYWN0aXZlPyAxIDogMCkpOworfQorCisvKioKKyAqIFNldCB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHRoYXQgY2FuIGJlIG1lYXN1cmVkIChlaXRoZXIgMiwgNCwgb3IgOCBnLWZvcmNlcykuCisgKiBUaGUgYWNjZWxlcm9tZXRlciBzaG91bGQgYmUgaW4gc3RhbmRieSBtb2RlIHdoZW4gdGhpcyBpcyBjYWxsZWQuCisgKi8KK3ZvaWQgc2V0QWNjZWxlcm9tZXRlclJhbmdlKEFjY2VsZXJvbWV0ZXJSYW5nZSByYW5nZSkgeworCWluaXRpYWxpemVBY2NlbGVyb21ldGVyKCk7CisKKwlhY2NlbGVyb21ldGVyUmFuZ2UgPSByYW5nZTsKKworCXVpbnQ4X3QgeHl6RGF0YUNmZyA9IHJlYWRSZWdpc3RlcihrUmVnX1hZWkRhdGFDZmcpOworCXh5ekRhdGFDZmcgJj0gfjM7IC8vIENsZWFyIHRoZSBleGlzdGluZyB0d28gcmFuZ2UgYml0cworCXdyaXRlUmVnaXN0ZXIoa1JlZ19YWVpEYXRhQ2ZnLCB4eXpEYXRhQ2ZnIHwgcmFuZ2UpOworfQorCisvKioKKyAqIEdldCB0aGUgeC1heGlzIGFjY2VsZXJhdGlvbgorICoKKyAqIFRoaXMgaXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBpbiB1bml0cyBvZiAxIGctZm9yY2UKKyAqLworZG91YmxlIGdldEFjY2VsZXJvbWV0ZXJYKCkgeworCWluaXRpYWxpemVBY2NlbGVyb21ldGVyKCk7CisKKwlpbnQgcmF3ID0gKHJlYWRSZWdpc3RlcihrUmVnX091dFhNU0IpIDw8IDQpIHwgKHJlYWRSZWdpc3RlcihrUmVnX091dFhMU0IpID4+IDQpOworCXJldHVybiB1bnBhY2tBeGlzKHJhdyk7Cit9CisKKy8qKgorICogR2V0IHRoZSB5LWF4aXMgYWNjZWxlcmF0aW9uCisgKgorICogVGhpcyBpcyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIGluIHVuaXRzIG9mIDEgZy1mb3JjZQorICovCitkb3VibGUgZ2V0QWNjZWxlcm9tZXRlclkoKSB7CisJaW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXIoKTsKKworCWludCByYXcgPSAocmVhZFJlZ2lzdGVyKGtSZWdfT3V0WU1TQikgPDwgNCkgfCAocmVhZFJlZ2lzdGVyKGtSZWdfT3V0WUxTQikgPj4gNCk7CisJcmV0dXJuIHVucGFja0F4aXMocmF3KTsKK30KKworLyoqCisgKiBHZXQgdGhlIHotYXhpcyBhY2NlbGVyYXRpb24KKyAqCisgKiBUaGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gdW5pdHMgb2YgMSBnLWZvcmNlCisgKi8KK2RvdWJsZSBnZXRBY2NlbGVyb21ldGVyWigpIHsKKwlpbml0aWFsaXplQWNjZWxlcm9tZXRlcigpOworCisJaW50IHJhdyA9IChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRaTVNCKSA8PCA0KSB8IChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRaTFNCKSA+PiA0KTsKKwlyZXR1cm4gdW5wYWNrQXhpcyhyYXcpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQW5hbG9nLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0FuYWxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhNzA0MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0FuYWxvZy5jcHAKQEAgLTAsMCArMSw3MjUgQEAKKworI2luY2x1ZGUgIkhBTC9BbmFsb2cuaHBwIgorCisjaW5jbHVkZSAiUG9ydC5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIkNoaXBPYmplY3QuaCIKKyNpbmNsdWRlICJIQUwvY3BwL1N5bmNocm9uaXplZC5ocHAiCisjaW5jbHVkZSAiSEFML2NwcC9SZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQUlDYWxpYnJhdGlvbi5oIgorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0xvYWRPdXQuaCIKKworc3RhdGljIGNvbnN0IGxvbmcga1RpbWViYXNlID0gNDAwMDAwMDA7IC8vLzwgNDAgTUh6IGNsb2NrCitzdGF0aWMgY29uc3QgbG9uZyBrRGVmYXVsdE92ZXJzYW1wbGVCaXRzID0gMDsKK3N0YXRpYyBjb25zdCBsb25nIGtEZWZhdWx0QXZlcmFnZUJpdHMgPSA3Oworc3RhdGljIGNvbnN0IGZsb2F0IGtEZWZhdWx0U2FtcGxlUmF0ZSA9IDUwMDAwLjA7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga0FuYWxvZ0lucHV0UGlucyA9IDg7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga0FuYWxvZ091dHB1dFBpbnMgPSAyOworCitzdGF0aWMgY29uc3QgdWludDMyX3Qga0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHMgPSAyOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBY2N1bXVsYXRvckNoYW5uZWxzW10gPSB7MCwgMX07CisKK3N0cnVjdCBBbmFsb2dQb3J0IHsKKyAgUG9ydCBwb3J0OworICB0QWNjdW11bGF0b3IgKmFjY3VtdWxhdG9yOworfTsKKworYm9vbCBhbmFsb2dTYW1wbGVSYXRlU2V0ID0gZmFsc2U7CitSZWVudHJhbnRNdXRleCBhbmFsb2dSZWdpc3RlcldpbmRvd011dGV4OwordEFJKiBhbmFsb2dJbnB1dFN5c3RlbSA9IE5VTEw7Cit0QU8qIGFuYWxvZ091dHB1dFN5c3RlbSA9IE5VTEw7Cit1aW50MzJfdCBhbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUgPSAwOworCisvLyBVdGlsaXR5IG1ldGhvZHMgZGVmaW5lZCBiZWxvdy4KK3VpbnQzMl90IGdldEFuYWxvZ051bUFjdGl2ZUNoYW5uZWxzKGludDMyX3QgKnN0YXR1cyk7Cit1aW50MzJfdCBnZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoaW50MzJfdCAqc3RhdHVzKTsKK3ZvaWQgc2V0QW5hbG9nTnVtQ2hhbm5lbHNUb0FjdGl2YXRlKHVpbnQzMl90IGNoYW5uZWxzKTsKKworYm9vbCBhbmFsb2dTeXN0ZW1Jbml0aWFsaXplZCA9IGZhbHNlOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGFuYWxvZyBTeXN0ZW0uCisgKi8KK3ZvaWQgaW5pdGlhbGl6ZUFuYWxvZyhpbnQzMl90ICpzdGF0dXMpIHsKKyAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGFuYWxvZ1JlZ2lzdGVyV2luZG93TXV0ZXgpOworICBpZiAoYW5hbG9nU3lzdGVtSW5pdGlhbGl6ZWQpIHJldHVybjsKKyAgYW5hbG9nSW5wdXRTeXN0ZW0gPSB0QUk6OmNyZWF0ZShzdGF0dXMpOworICBhbmFsb2dPdXRwdXRTeXN0ZW0gPSB0QU86OmNyZWF0ZShzdGF0dXMpOworICBzZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoa0FuYWxvZ0lucHV0UGlucyk7CisgIHNldEFuYWxvZ1NhbXBsZVJhdGUoa0RlZmF1bHRTYW1wbGVSYXRlLCBzdGF0dXMpOworICBhbmFsb2dTeXN0ZW1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYW5hbG9nIGlucHV0IHBvcnQgdXNpbmcgdGhlIGdpdmVuIHBvcnQgb2JqZWN0LgorICovCit2b2lkKiBpbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0KHZvaWQqIHBvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIGluaXRpYWxpemVBbmFsb2coc3RhdHVzKTsKKyAgUG9ydCogcG9ydCA9IChQb3J0KikgcG9ydF9wb2ludGVyOworCisgIC8vIEluaXRpYWxpemUgcG9ydCBzdHJ1Y3R1cmUKKyAgQW5hbG9nUG9ydCogYW5hbG9nX3BvcnQgPSBuZXcgQW5hbG9nUG9ydCgpOworICBhbmFsb2dfcG9ydC0+cG9ydCA9ICpwb3J0OworICBpZiAoaXNBY2N1bXVsYXRvckNoYW5uZWwoYW5hbG9nX3BvcnQsIHN0YXR1cykpIHsKKyAgICBhbmFsb2dfcG9ydC0+YWNjdW11bGF0b3IgPSB0QWNjdW11bGF0b3I6OmNyZWF0ZShwb3J0LT5waW4sIHN0YXR1cyk7CisgIH0gZWxzZSBhbmFsb2dfcG9ydC0+YWNjdW11bGF0b3IgPSBOVUxMOworCisgIC8vIFNldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgYW5hbG9nSW5wdXRTeXN0ZW0tPndyaXRlU2Nhbkxpc3QocG9ydC0+cGluLCBwb3J0LT5waW4sIHN0YXR1cyk7CisgIHNldEFuYWxvZ0F2ZXJhZ2VCaXRzKGFuYWxvZ19wb3J0LCBrRGVmYXVsdEF2ZXJhZ2VCaXRzLCBzdGF0dXMpOworICBzZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhhbmFsb2dfcG9ydCwga0RlZmF1bHRPdmVyc2FtcGxlQml0cywgc3RhdHVzKTsKKyAgcmV0dXJuIGFuYWxvZ19wb3J0OworfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGFuYWxvZyBvdXRwdXQgcG9ydCB1c2luZyB0aGUgZ2l2ZW4gcG9ydCBvYmplY3QuCisgKi8KK3ZvaWQqIGluaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0KHZvaWQqIHBvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIGluaXRpYWxpemVBbmFsb2coc3RhdHVzKTsKKyAgUG9ydCogcG9ydCA9IChQb3J0KikgcG9ydF9wb2ludGVyOworCisgIC8vIEluaXRpYWxpemUgcG9ydCBzdHJ1Y3R1cmUKKyAgQW5hbG9nUG9ydCogYW5hbG9nX3BvcnQgPSBuZXcgQW5hbG9nUG9ydCgpOworICBhbmFsb2dfcG9ydC0+cG9ydCA9ICpwb3J0OworICByZXR1cm4gYW5hbG9nX3BvcnQ7Cit9CisKKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgbW9kdWxlIG51bWJlciBpcyB2YWxpZC4KKyAqCisgKiBAcmV0dXJuIEFuYWxvZyBtb2R1bGUgaXMgdmFsaWQgYW5kIHByZXNlbnQKKyAqLworYm9vbCBjaGVja0FuYWxvZ01vZHVsZSh1aW50OF90IG1vZHVsZSkgeworICByZXR1cm4gbW9kdWxlID09IDE7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGUgYW5hbG9nIG91dHB1dCBjaGFubmVsIG51bWJlciBpcyB2YWx1ZS4KKyAqIFZlcmlmeSB0aGF0IHRoZSBhbmFsb2cgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycworICogYXJlIDAtYmFzZWQuCisgKgorICogQHJldHVybiBBbmFsb2cgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIGNoZWNrQW5hbG9nSW5wdXRDaGFubmVsKHVpbnQzMl90IHBpbikgeworICBpZiAocGluIDwga0FuYWxvZ0lucHV0UGlucykKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGFuYWxvZyBvdXRwdXQgY2hhbm5lbCBudW1iZXIgaXMgdmFsdWUuCisgKiBWZXJpZnkgdGhhdCB0aGUgYW5hbG9nIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMKKyAqIGFyZSAwLWJhc2VkLgorICoKKyAqIEByZXR1cm4gQW5hbG9nIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBjaGVja0FuYWxvZ091dHB1dENoYW5uZWwodWludDMyX3QgcGluKSB7CisgIGlmIChwaW4gPCBrQW5hbG9nT3V0cHV0UGlucykKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIHNldEFuYWxvZ091dHB1dCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBkb3VibGUgdm9sdGFnZSwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisKKyAgdWludDE2X3QgcmF3VmFsdWUgPSAodWludDE2X3QpKHZvbHRhZ2UgLyA1LjAgKiAweDEwMDApOworCisgIGlmKHZvbHRhZ2UgPCAwLjApIHJhd1ZhbHVlID0gMDsKKyAgZWxzZSBpZih2b2x0YWdlID4gNS4wKSByYXdWYWx1ZSA9IDB4MTAwMDsKKworICBhbmFsb2dPdXRwdXRTeXN0ZW0tPndyaXRlTVhQKHBvcnQtPnBvcnQucGluLCByYXdWYWx1ZSwgc3RhdHVzKTsKK30KKworZG91YmxlIGdldEFuYWxvZ091dHB1dCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKworICB1aW50MTZfdCByYXdWYWx1ZSA9IGFuYWxvZ091dHB1dFN5c3RlbS0+cmVhZE1YUChwb3J0LT5wb3J0LnBpbiwgc3RhdHVzKTsKKworICByZXR1cm4gcmF3VmFsdWUgKiA1LjAgLyAweDEwMDA7Cit9CisKKy8qKgorICogU2V0IHRoZSBzYW1wbGUgcmF0ZS4KKyAqCisgKiBUaGlzIGlzIGEgZ2xvYmFsIHNldHRpbmcgZm9yIHRoZSBBdGhlbmEgYW5kIGVmZmVjdHMgYWxsIGNoYW5uZWxzLgorICoKKyAqIEBwYXJhbSBzYW1wbGVzUGVyU2Vjb25kIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCBwZXIgc2Vjb25kLgorICovCit2b2lkIHNldEFuYWxvZ1NhbXBsZVJhdGUoZG91YmxlIHNhbXBsZXNQZXJTZWNvbmQsIGludDMyX3QgKnN0YXR1cykgeworICAvLyBUT0RPOiBUaGlzIHdpbGwgY2hhbmdlIHdoZW4gdmFyaWFibGUgc2l6ZSBzY2FuIGxpc3RzIGFyZSBpbXBsZW1lbnRlZC4KKyAgLy8gVE9ETzogTmVlZCBmbG9hdCBjb21wYXJpc29uIHdpdGggZXBzaWxvbi4KKyAgLy93cGlfYXNzZXJ0KCFzYW1wbGVSYXRlU2V0IHx8IEdldFNhbXBsZVJhdGUoKSA9PSBzYW1wbGVzUGVyU2Vjb25kKTsKKyAgYW5hbG9nU2FtcGxlUmF0ZVNldCA9IHRydWU7CisKKyAgLy8gQ29tcHV0ZSB0aGUgY29udmVydCByYXRlCisgIHVpbnQzMl90IHRpY2tzUGVyU2FtcGxlID0gKHVpbnQzMl90KSgoZmxvYXQpa1RpbWViYXNlIC8gc2FtcGxlc1BlclNlY29uZCk7CisgIHVpbnQzMl90IHRpY2tzUGVyQ29udmVyc2lvbiA9IHRpY2tzUGVyU2FtcGxlIC8gZ2V0QW5hbG9nTnVtQ2hhbm5lbHNUb0FjdGl2YXRlKHN0YXR1cyk7CisgIC8vIHRpY2tzUGVyQ29udmVyc2lvbiBtdXN0IGJlIGF0IGxlYXN0IDgwCisgIGlmICh0aWNrc1BlckNvbnZlcnNpb24gPCA4MCkgeworICAgIGlmICgoKnN0YXR1cykgPj0gMCkgKnN0YXR1cyA9IFNBTVBMRV9SQVRFX1RPT19ISUdIOworICAgIHRpY2tzUGVyQ29udmVyc2lvbiA9IDgwOworICB9CisKKyAgLy8gQXRvbWljYWxseSBzZXQgdGhlIHNjYW4gc2l6ZSBhbmQgdGhlIGNvbnZlcnQgcmF0ZSBzbyB0aGF0IHRoZSBzYW1wbGUgcmF0ZSBpcyBjb25zdGFudAorICB0QUk6OnRDb25maWcgY29uZmlnOworICBjb25maWcuU2NhblNpemUgPSBnZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoc3RhdHVzKTsKKyAgY29uZmlnLkNvbnZlcnRSYXRlID0gdGlja3NQZXJDb252ZXJzaW9uOworICBhbmFsb2dJbnB1dFN5c3RlbS0+d3JpdGVDb25maWcoY29uZmlnLCBzdGF0dXMpOworCisgIC8vIEluZGljYXRlIHRoYXQgdGhlIHNjYW4gc2l6ZSBoYXMgYmVlbiBjb21taXRlZCB0byBoYXJkd2FyZS4KKyAgc2V0QW5hbG9nTnVtQ2hhbm5lbHNUb0FjdGl2YXRlKDApOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBzYW1wbGUgcmF0ZS4KKyAqCisgKiBUaGlzIGFzc3VtZXMgb25lIGVudHJ5IGluIHRoZSBzY2FuIGxpc3QuCisgKiBUaGlzIGlzIGEgZ2xvYmFsIHNldHRpbmcgZm9yIHRoZSBBdGhlbmEgYW5kIGVmZmVjdHMgYWxsIGNoYW5uZWxzLgorICoKKyAqIEByZXR1cm4gU2FtcGxlIHJhdGUuCisgKi8KK2Zsb2F0IGdldEFuYWxvZ1NhbXBsZVJhdGUoaW50MzJfdCAqc3RhdHVzKSB7CisgIHVpbnQzMl90IHRpY2tzUGVyQ29udmVyc2lvbiA9IGFuYWxvZ0lucHV0U3lzdGVtLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpOworICB1aW50MzJfdCB0aWNrc1BlclNhbXBsZSA9IHRpY2tzUGVyQ29udmVyc2lvbiAqIGdldEFuYWxvZ051bUFjdGl2ZUNoYW5uZWxzKHN0YXR1cyk7CisgIHJldHVybiAoZmxvYXQpa1RpbWViYXNlIC8gKGZsb2F0KXRpY2tzUGVyU2FtcGxlOworfQorCisvKioKKyAqIFNldCB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzLgorICoKKyAqIFRoaXMgc2V0cyB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzLiBUaGUgYWN0dWFsIG51bWJlciBvZiBhdmVyYWdlZCBzYW1wbGVzIGlzIDIqKmJpdHMuCisgKiBVc2UgYXZlcmFnaW5nIHRvIGltcHJvdmUgdGhlIHN0YWJpbGl0eSBvZiB5b3VyIG1lYXN1cmVtZW50IGF0IHRoZSBleHBlbnNlIG9mIHNhbXBsaW5nIHJhdGUuCisgKiBUaGUgYXZlcmFnaW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gYW5hbG9nX3BvcnRfcG9pbnRlciBQb2ludGVyIHRvIHRoZSBhbmFsb2cgcG9ydCB0byBjb25maWd1cmUuCisgKiBAcGFyYW0gYml0cyBOdW1iZXIgb2YgYml0cyB0byBhdmVyYWdlLgorICovCit2b2lkIHNldEFuYWxvZ0F2ZXJhZ2VCaXRzKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIHVpbnQzMl90IGJpdHMsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dQb3J0KiBwb3J0ID0gKEFuYWxvZ1BvcnQqKSBhbmFsb2dfcG9ydF9wb2ludGVyOworICBhbmFsb2dJbnB1dFN5c3RlbS0+d3JpdGVBdmVyYWdlQml0cyhwb3J0LT5wb3J0LnBpbiwgYml0cywgc3RhdHVzKTsKK30KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cy4KKyAqCisgKiBUaGlzIGdldHMgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cyBmcm9tIHRoZSBGUEdBLiBUaGUgYWN0dWFsIG51bWJlciBvZiBhdmVyYWdlZCBzYW1wbGVzIGlzIDIqKmJpdHMuCisgKiBUaGUgYXZlcmFnaW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gYW5hbG9nX3BvcnRfcG9pbnRlciBQb2ludGVyIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCisgKiBAcmV0dXJuIEJpdHMgdG8gYXZlcmFnZS4KKyAqLwordWludDMyX3QgZ2V0QW5hbG9nQXZlcmFnZUJpdHModm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIHVpbnQzMl90IHJlc3VsdCA9IGFuYWxvZ0lucHV0U3lzdGVtLT5yZWFkQXZlcmFnZUJpdHMocG9ydC0+cG9ydC5waW4sIHN0YXR1cyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogU2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLgorICoKKyAqIFRoaXMgc2V0cyB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cy4gVGhlIGFjdHVhbCBudW1iZXIgb2Ygb3ZlcnNhbXBsZWQgdmFsdWVzIGlzIDIqKmJpdHMuCisgKiBVc2Ugb3ZlcnNhbXBsaW5nIHRvIGltcHJvdmUgdGhlIHJlc29sdXRpb24gb2YgeW91ciBtZWFzdXJlbWVudHMgYXQgdGhlIGV4cGVuc2Ugb2Ygc2FtcGxpbmcgcmF0ZS4KKyAqIFRoZSBvdmVyc2FtcGxpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBhbmFsb2dfcG9ydF9wb2ludGVyIFBvaW50ZXIgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KKyAqIEBwYXJhbSBiaXRzIE51bWJlciBvZiBiaXRzIHRvIG92ZXJzYW1wbGUuCisgKi8KK3ZvaWQgc2V0QW5hbG9nT3ZlcnNhbXBsZUJpdHModm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgdWludDMyX3QgYml0cywgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGFuYWxvZ0lucHV0U3lzdGVtLT53cml0ZU92ZXJzYW1wbGVCaXRzKHBvcnQtPnBvcnQucGluLCBiaXRzLCBzdGF0dXMpOworfQorCisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLgorICoKKyAqIFRoaXMgZ2V0cyB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cyBmcm9tIHRoZSBGUEdBLiBUaGUgYWN0dWFsIG51bWJlciBvZiBvdmVyc2FtcGxlZCB2YWx1ZXMgaXMKKyAqIDIqKmJpdHMuIFRoZSBvdmVyc2FtcGxpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBhbmFsb2dfcG9ydF9wb2ludGVyIFBvaW50ZXIgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KKyAqIEByZXR1cm4gQml0cyB0byBvdmVyc2FtcGxlLgorICovCit1aW50MzJfdCBnZXRBbmFsb2dPdmVyc2FtcGxlQml0cyh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgdWludDMyX3QgcmVzdWx0ID0gYW5hbG9nSW5wdXRTeXN0ZW0tPnJlYWRPdmVyc2FtcGxlQml0cyhwb3J0LT5wb3J0LnBpbiwgc3RhdHVzKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBHZXQgYSBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGUgY2hhbm5lbCBvbiB0aGlzIG1vZHVsZS4KKyAqCisgKiBUaGUgc2FtcGxlIGlzIGEgMTItYml0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgMFYgdG8gNVYgcmFuZ2Ugb2YgdGhlIEEvRCBjb252ZXJ0ZXIgaW4gdGhlIG1vZHVsZS4KKyAqIFRoZSB1bml0cyBhcmUgaW4gQS9EIGNvbnZlcnRlciBjb2Rlcy4gIFVzZSBHZXRWb2x0YWdlKCkgdG8gZ2V0IHRoZSBhbmFsb2cgdmFsdWUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAqCisgKiBAcGFyYW0gYW5hbG9nX3BvcnRfcG9pbnRlciBQb2ludGVyIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCisgKiBAcmV0dXJuIEEgc2FtcGxlIHN0cmFpZ2h0IGZyb20gdGhlIGNoYW5uZWwgb24gdGhpcyBtb2R1bGUuCisgKi8KK2ludDE2X3QgZ2V0QW5hbG9nVmFsdWUodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGludDE2X3QgdmFsdWU7CisgIGNoZWNrQW5hbG9nSW5wdXRDaGFubmVsKHBvcnQtPnBvcnQucGluKTsKKworICB0QUk6OnRSZWFkU2VsZWN0IHJlYWRTZWxlY3Q7CisgIHJlYWRTZWxlY3QuQ2hhbm5lbCA9IHBvcnQtPnBvcnQucGluOworICByZWFkU2VsZWN0LkF2ZXJhZ2VkID0gZmFsc2U7CisKKyAgeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhhbmFsb2dSZWdpc3RlcldpbmRvd011dGV4KTsKKyAgICBhbmFsb2dJbnB1dFN5c3RlbS0+d3JpdGVSZWFkU2VsZWN0KHJlYWRTZWxlY3QsIHN0YXR1cyk7CisgICAgYW5hbG9nSW5wdXRTeXN0ZW0tPnN0cm9iZUxhdGNoT3V0cHV0KHN0YXR1cyk7CisgICAgdmFsdWUgPSAoaW50MTZfdCkgYW5hbG9nSW5wdXRTeXN0ZW0tPnJlYWRPdXRwdXQoc3RhdHVzKTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZXQgYSBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhlIGNoYW5uZWwuCisgKgorICogVGhlIHNhbXBsZSBpcyAxMi1iaXQgKyB0aGUgdmFsdWUgY29uZmlndXJlZCBpbiBTZXRPdmVyc2FtcGxlQml0cygpLgorICogVGhlIHZhbHVlIGNvbmZpZ3VyZWQgaW4gU2V0QXZlcmFnZUJpdHMoKSB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgYXZlcmFnZWQgMioqYml0cyBudW1iZXIgb2Ygc2FtcGxlcy4KKyAqIFRoaXMgaXMgbm90IGEgc2xpZGluZyB3aW5kb3cuICBUaGUgc2FtcGxlIHdpbGwgbm90IGNoYW5nZSB1bnRpbCAyKiooT3ZlcnNhbXBsQml0cyArIEF2ZXJhZ2VCaXRzKSBzYW1wbGVzCisgKiBoYXZlIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgbW9kdWxlIG9uIHRoaXMgY2hhbm5lbC4KKyAqIFVzZSBHZXRBdmVyYWdlVm9sdGFnZSgpIHRvIGdldCB0aGUgYW5hbG9nIHZhbHVlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgKgorICogQHBhcmFtIGFuYWxvZ19wb3J0X3BvaW50ZXIgUG9pbnRlciB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgorICogQHJldHVybiBBIHNhbXBsZSBmcm9tIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhlIGNoYW5uZWwuCisgKi8KK2ludDMyX3QgZ2V0QW5hbG9nQXZlcmFnZVZhbHVlKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dQb3J0KiBwb3J0ID0gKEFuYWxvZ1BvcnQqKSBhbmFsb2dfcG9ydF9wb2ludGVyOworICBpbnQzMl90IHZhbHVlOworICBjaGVja0FuYWxvZ0lucHV0Q2hhbm5lbChwb3J0LT5wb3J0LnBpbik7CisKKyAgdEFJOjp0UmVhZFNlbGVjdCByZWFkU2VsZWN0OworICByZWFkU2VsZWN0LkNoYW5uZWwgPSBwb3J0LT5wb3J0LnBpbjsKKyAgcmVhZFNlbGVjdC5BdmVyYWdlZCA9IHRydWU7CisKKyAgeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhhbmFsb2dSZWdpc3RlcldpbmRvd011dGV4KTsKKyAgICBhbmFsb2dJbnB1dFN5c3RlbS0+d3JpdGVSZWFkU2VsZWN0KHJlYWRTZWxlY3QsIHN0YXR1cyk7CisgICAgYW5hbG9nSW5wdXRTeXN0ZW0tPnN0cm9iZUxhdGNoT3V0cHV0KHN0YXR1cyk7CisgICAgdmFsdWUgPSAoaW50MzJfdCkgYW5hbG9nSW5wdXRTeXN0ZW0tPnJlYWRPdXRwdXQoc3RhdHVzKTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZXQgYSBzY2FsZWQgc2FtcGxlIHN0cmFpZ2h0IGZyb20gdGhlIGNoYW5uZWwgb24gdGhpcyBtb2R1bGUuCisgKgorICogVGhlIHZhbHVlIGlzIHNjYWxlZCB0byB1bml0cyBvZiBWb2x0cyB1c2luZyB0aGUgY2FsaWJyYXRlZCBzY2FsaW5nIGRhdGEgZnJvbSBHZXRMU0JXZWlnaHQoKSBhbmQgR2V0T2Zmc2V0KCkuCisgKgorICogQHBhcmFtIGFuYWxvZ19wb3J0X3BvaW50ZXIgUG9pbnRlciB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgorICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGUgY2hhbm5lbCBvbiB0aGlzIG1vZHVsZS4KKyAqLworZmxvYXQgZ2V0QW5hbG9nVm9sdGFnZSh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgaW50MTZfdCB2YWx1ZSA9IGdldEFuYWxvZ1ZhbHVlKGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIHVpbnQzMl90IExTQldlaWdodCA9IGdldEFuYWxvZ0xTQldlaWdodChhbmFsb2dfcG9ydF9wb2ludGVyLCBzdGF0dXMpOworICBpbnQzMl90IG9mZnNldCA9IGdldEFuYWxvZ09mZnNldChhbmFsb2dfcG9ydF9wb2ludGVyLCBzdGF0dXMpOworICBmbG9hdCB2b2x0YWdlID0gTFNCV2VpZ2h0ICogMS4wZS05ICogdmFsdWUgLSBvZmZzZXQgKiAxLjBlLTk7CisgIHJldHVybiB2b2x0YWdlOworfQorCisvKioKKyAqIEdldCBhIHNjYWxlZCBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhlIGNoYW5uZWwuCisgKgorICogVGhlIHZhbHVlIGlzIHNjYWxlZCB0byB1bml0cyBvZiBWb2x0cyB1c2luZyB0aGUgY2FsaWJyYXRlZCBzY2FsaW5nIGRhdGEgZnJvbSBHZXRMU0JXZWlnaHQoKSBhbmQgR2V0T2Zmc2V0KCkuCisgKiBVc2luZyBvdmVyc2FtcGxpbmcgd2lsbCBjYXVzZSB0aGlzIHZhbHVlIHRvIGJlIGhpZ2hlciByZXNvbHV0aW9uLCBidXQgaXQgd2lsbCB1cGRhdGUgbW9yZSBzbG93bHkuCisgKiBVc2luZyBhdmVyYWdpbmcgd2lsbCBjYXVzZSB0aGlzIHZhbHVlIHRvIGJlIG1vcmUgc3RhYmxlLCBidXQgaXQgd2lsbCB1cGRhdGUgbW9yZSBzbG93bHkuCisgKgorICogQHBhcmFtIGFuYWxvZ19wb3J0X3BvaW50ZXIgUG9pbnRlciB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgorICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhlIGNoYW5uZWwuCisgKi8KK2Zsb2F0IGdldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBpbnQzMl90IHZhbHVlID0gZ2V0QW5hbG9nQXZlcmFnZVZhbHVlKGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIHVpbnQzMl90IExTQldlaWdodCA9IGdldEFuYWxvZ0xTQldlaWdodChhbmFsb2dfcG9ydF9wb2ludGVyLCBzdGF0dXMpOworICBpbnQzMl90IG9mZnNldCA9IGdldEFuYWxvZ09mZnNldChhbmFsb2dfcG9ydF9wb2ludGVyLCBzdGF0dXMpOworICB1aW50MzJfdCBvdmVyc2FtcGxlQml0cyA9IGdldEFuYWxvZ092ZXJzYW1wbGVCaXRzKGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIGZsb2F0IHZvbHRhZ2UgPSAoKExTQldlaWdodCAqIDEuMGUtOSAqIHZhbHVlKSAvIChmbG9hdCkoMSA8PCBvdmVyc2FtcGxlQml0cykpIC0gb2Zmc2V0ICogMS4wZS05OworICByZXR1cm4gdm9sdGFnZTsKK30KKworLyoqCisgKiBDb252ZXJ0IGEgdm9sdGFnZSB0byBhIHJhdyB2YWx1ZSBmb3IgYSBzcGVjaWZpZWQgY2hhbm5lbC4KKyAqCisgKiBUaGlzIHByb2Nlc3MgZGVwZW5kcyBvbiB0aGUgY2FsaWJyYXRpb24gb2YgZWFjaCBjaGFubmVsLCBzbyB0aGUgY2hhbm5lbAorICogbXVzdCBiZSBzcGVjaWZpZWQuCisgKgorICogQHRvZG8gVGhpcyBhc3N1bWVzIHJhdyB2YWx1ZXMuICBPdmVyc2FtcGxpbmcgbm90IHN1cHBvcnRlZCBhcyBpcy4KKyAqCisgKiBAcGFyYW0gYW5hbG9nX3BvcnRfcG9pbnRlciBQb2ludGVyIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCisgKiBAcGFyYW0gdm9sdGFnZSBUaGUgdm9sdGFnZSB0byBjb252ZXJ0LgorICogQHJldHVybiBUaGUgcmF3IHZhbHVlIGZvciB0aGUgY2hhbm5lbC4KKyAqLworaW50MzJfdCBnZXRBbmFsb2dWb2x0c1RvVmFsdWUodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgZG91YmxlIHZvbHRhZ2UsIGludDMyX3QgKnN0YXR1cykgeworICBpZiAodm9sdGFnZSA+IDUuMCkgeworICAgIHZvbHRhZ2UgPSA1LjA7CisgICAgKnN0YXR1cyA9IFZPTFRBR0VfT1VUX09GX1JBTkdFOworICB9CisgIGlmICh2b2x0YWdlIDwgMC4wKSB7CisgICAgdm9sdGFnZSA9IDAuMDsKKyAgICAqc3RhdHVzID0gVk9MVEFHRV9PVVRfT0ZfUkFOR0U7CisgIH0KKyAgdWludDMyX3QgTFNCV2VpZ2h0ID0gZ2V0QW5hbG9nTFNCV2VpZ2h0KGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIGludDMyX3Qgb2Zmc2V0ID0gZ2V0QW5hbG9nT2Zmc2V0KGFuYWxvZ19wb3J0X3BvaW50ZXIsIHN0YXR1cyk7CisgIGludDMyX3QgdmFsdWUgPSAoaW50MzJfdCkgKCh2b2x0YWdlICsgb2Zmc2V0ICogMS4wZS05KSAvIChMU0JXZWlnaHQgKiAxLjBlLTkpKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEdldCB0aGUgZmFjdG9yeSBzY2FsaW5nIGxlYXN0IHNpZ25pZmljYW50IGJpdCB3ZWlnaHQgY29uc3RhbnQuCisgKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdlaWdodCBjb25zdGFudCBmb3IgdGhlIGNoYW5uZWwgdGhhdCB3YXMgY2FsaWJyYXRlZCBpbgorICogbWFudWZhY3R1cmluZyBhbmQgc3RvcmVkIGluIGFuIGVlcHJvbSBpbiB0aGUgbW9kdWxlLgorICoKKyAqIFZvbHRzID0gKChMU0JfV2VpZ2h0ICogMWUtOSkgKiByYXcpIC0gKE9mZnNldCAqIDFlLTkpCisgKgorICogQHBhcmFtIGFuYWxvZ19wb3J0X3BvaW50ZXIgUG9pbnRlciB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgorICogQHJldHVybiBMZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0LgorICovCit1aW50MzJfdCBnZXRBbmFsb2dMU0JXZWlnaHQodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIHVpbnQzMl90IGxzYldlaWdodCA9IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRMU0JXZWlnaHQoMCwgcG9ydC0+cG9ydC5waW4sIHN0YXR1cyk7IC8vIFhYWDogYWlTeXN0ZW1JbmRleCA9PSAwPworICByZXR1cm4gbHNiV2VpZ2h0OworfQorCisvKioKKyAqIEdldCB0aGUgZmFjdG9yeSBzY2FsaW5nIG9mZnNldCBjb25zdGFudC4KKyAqIFRoZSBvZmZzZXQgY29uc3RhbnQgZm9yIHRoZSBjaGFubmVsIHRoYXQgd2FzIGNhbGlicmF0ZWQgaW4gbWFudWZhY3R1cmluZyBhbmQgc3RvcmVkCisgKiBpbiBhbiBlZXByb20gaW4gdGhlIG1vZHVsZS4KKyAqCisgKiBWb2x0cyA9ICgoTFNCX1dlaWdodCAqIDFlLTkpICogcmF3KSAtIChPZmZzZXQgKiAxZS05KQorICoKKyAqIEBwYXJhbSBhbmFsb2dfcG9ydF9wb2ludGVyIFBvaW50ZXIgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KKyAqIEByZXR1cm4gT2Zmc2V0IGNvbnN0YW50LgorICovCitpbnQzMl90IGdldEFuYWxvZ09mZnNldCh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgaW50MzJfdCBvZmZzZXQgPSBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkFJQ2FsaWJyYXRpb25fZ2V0T2Zmc2V0KDAsIHBvcnQtPnBvcnQucGluLCBzdGF0dXMpOyAvLyBYWFg6IGFpU3lzdGVtSW5kZXggPT0gMD8KKyAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9uIHRoZSBtb2R1bGUgaW4gdXNlLgorICoKKyAqIEByZXR1cm4gQWN0aXZlIGNoYW5uZWxzLgorICovCit1aW50MzJfdCBnZXRBbmFsb2dOdW1BY3RpdmVDaGFubmVscyhpbnQzMl90ICpzdGF0dXMpIHsKKyAgdWludDMyX3Qgc2NhblNpemUgPSBhbmFsb2dJbnB1dFN5c3RlbS0+cmVhZENvbmZpZ19TY2FuU2l6ZShzdGF0dXMpOworICBpZiAoc2NhblNpemUgPT0gMCkKKyAgICByZXR1cm4gODsKKyAgcmV0dXJuIHNjYW5TaXplOworfQorCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBjaGFubmVscy4KKyAqCisgKiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSBhdG9taWMgdXBkYXRlIG9mIGJvdGggdGhlCisgKiBudW1iZXIgb2YgYWN0aXZlIGNoYW5uZWxzIGFuZCB0aGUgc2FtcGxlIHJhdGUuCisgKgorICogV2hlbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGNoYW5nZXMsIHVzZSB0aGUgbmV3IHZhbHVlLiAgT3RoZXJ3aXNlLAorICogcmV0dXJuIHRoZSBjdXJlbnQgdmFsdWUuCisgKgorICogQHJldHVybiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgYWN0aXZlIGNoYW5uZWxzIGZpZWxkLgorICovCit1aW50MzJfdCBnZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoaW50MzJfdCAqc3RhdHVzKSB7CisgIGlmKGFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZSA9PSAwKSByZXR1cm4gZ2V0QW5hbG9nTnVtQWN0aXZlQ2hhbm5lbHMoc3RhdHVzKTsKKyAgcmV0dXJuIGFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZTsKK30KKworLyoqCisgKiBTZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgY2hhbm5lbHMuCisgKgorICogU3RvcmUgdGhlIG51bWJlciBvZiBhY3RpdmUgY2hhbm5lbHMgdG8gc2V0LiAgRG9uJ3QgYWN0dWFsbHkgY29tbWl0IHRvIGhhcmR3YXJlCisgKiB1bnRpbCBTZXRTYW1wbGVSYXRlKCkuCisgKgorICogQHBhcmFtIGNoYW5uZWxzIE51bWJlciBvZiBhY3RpdmUgY2hhbm5lbHMuCisgKi8KK3ZvaWQgc2V0QW5hbG9nTnVtQ2hhbm5lbHNUb0FjdGl2YXRlKHVpbnQzMl90IGNoYW5uZWxzKSB7CisgIGFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZSA9IGNoYW5uZWxzOworfQorCisvLy8vIEFjY3VtdWxhdG9yIFN0dWZmCisKKy8qKgorICogSXMgdGhlIGNoYW5uZWwgYXR0YWNoZWQgdG8gYW4gYWNjdW11bGF0b3IuCisgKgorICogQHJldHVybiBUaGUgYW5hbG9nIGNoYW5uZWwgaXMgYXR0YWNoZWQgdG8gYW4gYWNjdW11bGF0b3IuCisgKi8KK2Jvb2wgaXNBY2N1bXVsYXRvckNoYW5uZWwodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGZvciAodWludDMyX3QgaT0wOyBpIDwga0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHM7IGkrKykgeworICAgIGlmIChwb3J0LT5wb3J0LnBpbiA9PSBrQWNjdW11bGF0b3JDaGFubmVsc1tpXSkgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yLgorICovCit2b2lkIGluaXRBY2N1bXVsYXRvcih2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgc2V0QWNjdW11bGF0b3JDZW50ZXIoYW5hbG9nX3BvcnRfcG9pbnRlciwgMCwgc3RhdHVzKTsKKyAgcmVzZXRBY2N1bXVsYXRvcihhbmFsb2dfcG9ydF9wb2ludGVyLCBzdGF0dXMpOworfQorCisvKioKKyAqIFJlc2V0cyB0aGUgYWNjdW11bGF0b3IgdG8gdGhlIGluaXRpYWwgdmFsdWUuCisgKi8KK3ZvaWQgcmVzZXRBY2N1bXVsYXRvcih2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nUG9ydCogcG9ydCA9IChBbmFsb2dQb3J0KikgYW5hbG9nX3BvcnRfcG9pbnRlcjsKKyAgaWYgKHBvcnQtPmFjY3VtdWxhdG9yID09IE5VTEwpIHsKKyAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7CisgICAgcmV0dXJuOworICB9CisgIHBvcnQtPmFjY3VtdWxhdG9yLT5zdHJvYmVSZXNldChzdGF0dXMpOworfQorCisvKioKKyAqIFNldCB0aGUgY2VudGVyIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci4KKyAqCisgKiBUaGUgY2VudGVyIHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIEEvRCB2YWx1ZSBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIGFjY3VtdWxhdG9yLiBUaGlzCisgKiBpcyB1c2VkIGZvciB0aGUgY2VudGVyIHZhbHVlIG9mIGRldmljZXMgbGlrZSBneXJvcyBhbmQgYWNjZWxlcm9tZXRlcnMgdG8gbWFrZSBpbnRlZ3JhdGlvbiB3b3JrCisgKiBhbmQgdG8gdGFrZSB0aGUgZGV2aWNlIG9mZnNldCBpbnRvIGFjY291bnQgd2hlbiBpbnRlZ3JhdGluZy4KKyAqCisgKiBUaGlzIGNlbnRlciB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlZCBhbmQgYXZlcmFnZWQgc291cmNlIGZyb20gY2hhbm5lbCAxLgorICogQmVjYXVzZSBvZiB0aGlzLCBhbnkgbm9uLXplcm8gb3ZlcnNhbXBsZSBiaXRzIHdpbGwgYWZmZWN0IHRoZSBzaXplIG9mIHRoZSB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4KKyAqLwordm9pZCBzZXRBY2N1bXVsYXRvckNlbnRlcih2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90IGNlbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGlmIChwb3J0LT5hY2N1bXVsYXRvciA9PSBOVUxMKSB7CisgICAgKnN0YXR1cyA9IE5VTExfUEFSQU1FVEVSOworICAgIHJldHVybjsKKyAgfQorICBwb3J0LT5hY2N1bXVsYXRvci0+d3JpdGVDZW50ZXIoY2VudGVyLCBzdGF0dXMpOworfQorCisvKioKKyAqIFNldCB0aGUgYWNjdW11bGF0b3IncyBkZWFkYmFuZC4KKyAqLwordm9pZCBzZXRBY2N1bXVsYXRvckRlYWRiYW5kKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgZGVhZGJhbmQsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dQb3J0KiBwb3J0ID0gKEFuYWxvZ1BvcnQqKSBhbmFsb2dfcG9ydF9wb2ludGVyOworICBpZiAocG9ydC0+YWNjdW11bGF0b3IgPT0gTlVMTCkgeworICAgICpzdGF0dXMgPSBOVUxMX1BBUkFNRVRFUjsKKyAgICByZXR1cm47CisgIH0KKyAgcG9ydC0+YWNjdW11bGF0b3ItPndyaXRlRGVhZGJhbmQoZGVhZGJhbmQsIHN0YXR1cyk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCisgKgorICogUmVhZCB0aGUgdmFsdWUgdGhhdCBoYXMgYmVlbiBhY2N1bXVsYXRpbmcgb24gY2hhbm5lbCAxLgorICogVGhlIGFjY3VtdWxhdG9yIGlzIGF0dGFjaGVkIGFmdGVyIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZS4KKyAqCisgKiBAcmV0dXJuIFRoZSA2NC1iaXQgdmFsdWUgYWNjdW11bGF0ZWQgc2luY2UgdGhlIGxhc3QgUmVzZXQoKS4KKyAqLworaW50NjRfdCBnZXRBY2N1bXVsYXRvclZhbHVlKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dQb3J0KiBwb3J0ID0gKEFuYWxvZ1BvcnQqKSBhbmFsb2dfcG9ydF9wb2ludGVyOworICBpZiAocG9ydC0+YWNjdW11bGF0b3IgPT0gTlVMTCkgeworICAgICpzdGF0dXMgPSBOVUxMX1BBUkFNRVRFUjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQ2NF90IHZhbHVlID0gcG9ydC0+YWNjdW11bGF0b3ItPnJlYWRPdXRwdXRfVmFsdWUoc3RhdHVzKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFJlYWQgdGhlIG51bWJlciBvZiBhY2N1bXVsYXRlZCB2YWx1ZXMuCisgKgorICogUmVhZCB0aGUgY291bnQgb2YgdGhlIGFjY3VtdWxhdGVkIHZhbHVlcyBzaW5jZSB0aGUgYWNjdW11bGF0b3Igd2FzIGxhc3QgUmVzZXQoKS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGltZXMgc2FtcGxlcyBmcm9tIHRoZSBjaGFubmVsIHdlcmUgYWNjdW11bGF0ZWQuCisgKi8KK3VpbnQzMl90IGdldEFjY3VtdWxhdG9yQ291bnQodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGlmIChwb3J0LT5hY2N1bXVsYXRvciA9PSBOVUxMKSB7CisgICAgKnN0YXR1cyA9IE5VTExfUEFSQU1FVEVSOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBwb3J0LT5hY2N1bXVsYXRvci0+cmVhZE91dHB1dF9Db3VudChzdGF0dXMpOworfQorCisvKioKKyAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcyBhdG9taWNhbGx5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHZhbHVlIGFuZCBjb3VudCBmcm9tIHRoZSBGUEdBIGF0b21pY2FsbHkuCisgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhdmVyYWdpbmcuCisgKgorICogQHBhcmFtIHZhbHVlIFBvaW50ZXIgdG8gdGhlIDY0LWJpdCBhY2N1bXVsYXRlZCBvdXRwdXQuCisgKiBAcGFyYW0gY291bnQgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGlvbiBjeWNsZXMuCisgKi8KK3ZvaWQgZ2V0QWNjdW11bGF0b3JPdXRwdXQodm9pZCogYW5hbG9nX3BvcnRfcG9pbnRlciwgaW50NjRfdCAqdmFsdWUsIHVpbnQzMl90ICpjb3VudCwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1BvcnQqIHBvcnQgPSAoQW5hbG9nUG9ydCopIGFuYWxvZ19wb3J0X3BvaW50ZXI7CisgIGlmIChwb3J0LT5hY2N1bXVsYXRvciA9PSBOVUxMKSB7CisgICAgKnN0YXR1cyA9IE5VTExfUEFSQU1FVEVSOworICAgIHJldHVybjsKKyAgfQorICBpZiAodmFsdWUgPT0gTlVMTCB8fCBjb3VudCA9PSBOVUxMKSB7CisgICAgKnN0YXR1cyA9IE5VTExfUEFSQU1FVEVSOworICAgIHJldHVybjsKKyAgfQorCisgIHRBY2N1bXVsYXRvcjo6dE91dHB1dCBvdXRwdXQgPSBwb3J0LT5hY2N1bXVsYXRvci0+cmVhZE91dHB1dChzdGF0dXMpOworCisgICp2YWx1ZSA9IG91dHB1dC5WYWx1ZTsKKyAgKmNvdW50ID0gb3V0cHV0LkNvdW50OworfQorCisKK3N0cnVjdCB0cmlnZ2VyX3QgeworICB0QW5hbG9nVHJpZ2dlciogdHJpZ2dlcjsKKyAgQW5hbG9nUG9ydCogcG9ydDsKKyAgdWludDMyX3QgaW5kZXg7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdHJpZ2dlcl90IEFuYWxvZ1RyaWdnZXI7CisKK3N0YXRpYyBSZXNvdXJjZSAqdHJpZ2dlcnMgPSBOVUxMOworCit2b2lkKiBpbml0aWFsaXplQW5hbG9nVHJpZ2dlcih2b2lkKiBwb3J0X3BvaW50ZXIsIHVpbnQzMl90ICppbmRleCwgaW50MzJfdCAqc3RhdHVzKSB7CisgIFBvcnQqIHBvcnQgPSAoUG9ydCopIHBvcnRfcG9pbnRlcjsKKyAgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZ0cmlnZ2VycywgdEFuYWxvZ1RyaWdnZXI6OmtOdW1TeXN0ZW1zKTsKKworICBBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyID0gbmV3IEFuYWxvZ1RyaWdnZXIoKTsKKyAgdHJpZ2dlci0+cG9ydCA9IChBbmFsb2dQb3J0KikgaW5pdGlhbGl6ZUFuYWxvZ0lucHV0UG9ydChwb3J0LCBzdGF0dXMpOworICB0cmlnZ2VyLT5pbmRleCA9IHRyaWdnZXJzLT5BbGxvY2F0ZSgiQW5hbG9nIFRyaWdnZXIiKTsKKyAgKmluZGV4ID0gdHJpZ2dlci0+aW5kZXg7CisgIC8vIFRPRE86IGlmIChpbmRleCA9PSB+MHVsKSB7IENsb25lRXJyb3IodHJpZ2dlcnMpOyByZXR1cm47IH0KKworICB0cmlnZ2VyLT50cmlnZ2VyID0gdEFuYWxvZ1RyaWdnZXI6OmNyZWF0ZSh0cmlnZ2VyLT5pbmRleCwgc3RhdHVzKTsKKyAgdHJpZ2dlci0+dHJpZ2dlci0+d3JpdGVTb3VyY2VTZWxlY3RfQ2hhbm5lbChwb3J0LT5waW4sIHN0YXR1cyk7CisKKyAgcmV0dXJuIHRyaWdnZXI7Cit9CisKK3ZvaWQgY2xlYW5BbmFsb2dUcmlnZ2VyKHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyID0gKEFuYWxvZ1RyaWdnZXIqKSBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyOworICB0cmlnZ2Vycy0+RnJlZSh0cmlnZ2VyLT5pbmRleCk7CisgIGRlbGV0ZSB0cmlnZ2VyLT50cmlnZ2VyOworICBkZWxldGUgdHJpZ2dlcjsKK30KKwordm9pZCBzZXRBbmFsb2dUcmlnZ2VyTGltaXRzUmF3KHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludDMyX3QgbG93ZXIsIGludDMyX3QgdXBwZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyID0gKEFuYWxvZ1RyaWdnZXIqKSBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyOworICBpZiAobG93ZXIgPiB1cHBlcikgeworCSpzdGF0dXMgPSBBTkFMT0dfVFJJR0dFUl9MSU1JVF9PUkRFUl9FUlJPUjsKKyAgfQorICB0cmlnZ2VyLT50cmlnZ2VyLT53cml0ZUxvd2VyTGltaXQobG93ZXIsIHN0YXR1cyk7CisgIHRyaWdnZXItPnRyaWdnZXItPndyaXRlVXBwZXJMaW1pdCh1cHBlciwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICogVGhlIGxpbWl0cyBhcmUgZ2l2ZW4gYXMgZmxvYXRpbmcgcG9pbnQgdm9sdGFnZSB2YWx1ZXMuCisgKi8KK3ZvaWQgc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2Uodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgZG91YmxlIGxvd2VyLCBkb3VibGUgdXBwZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyID0gKEFuYWxvZ1RyaWdnZXIqKSBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyOworICBpZiAobG93ZXIgPiB1cHBlcikgeworCSpzdGF0dXMgPSBBTkFMT0dfVFJJR0dFUl9MSU1JVF9PUkRFUl9FUlJPUjsKKyAgfQorICAvLyBUT0RPOiBUaGlzIGRlcGVuZHMgb24gdGhlIGF2ZXJhZ2VkIHNldHRpbmcuICBPbmx5IHJhdyB2YWx1ZXMgd2lsbCB3b3JrIGFzIGlzLgorICB0cmlnZ2VyLT50cmlnZ2VyLT53cml0ZUxvd2VyTGltaXQoZ2V0QW5hbG9nVm9sdHNUb1ZhbHVlKHRyaWdnZXItPnBvcnQsIGxvd2VyLCBzdGF0dXMpLCBzdGF0dXMpOworICB0cmlnZ2VyLT50cmlnZ2VyLT53cml0ZVVwcGVyTGltaXQoZ2V0QW5hbG9nVm9sdHNUb1ZhbHVlKHRyaWdnZXItPnBvcnQsIHVwcGVyLCBzdGF0dXMpLCBzdGF0dXMpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgYW5hbG9nIHRyaWdnZXIgdG8gdXNlIHRoZSBhdmVyYWdlZCB2cy4gcmF3IHZhbHVlcy4KKyAqIElmIHRoZSB2YWx1ZSBpcyB0cnVlLCB0aGVuIHRoZSBhdmVyYWdlZCB2YWx1ZSBpcyBzZWxlY3RlZCBmb3IgdGhlIGFuYWxvZyB0cmlnZ2VyLCBvdGhlcndpc2UKKyAqIHRoZSBpbW1lZGlhdGUgdmFsdWUgaXMgdXNlZC4KKyAqLwordm9pZCBzZXRBbmFsb2dUcmlnZ2VyQXZlcmFnZWQodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgYm9vbCB1c2VBdmVyYWdlZFZhbHVlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nVHJpZ2dlciogdHJpZ2dlciA9IChBbmFsb2dUcmlnZ2VyKikgYW5hbG9nX3RyaWdnZXJfcG9pbnRlcjsKKyAgaWYgKHRyaWdnZXItPnRyaWdnZXItPnJlYWRTb3VyY2VTZWxlY3RfRmlsdGVyKHN0YXR1cykgIT0gMCkgeworCSpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7CisJLy8gVE9ETzogd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIkhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgYXZlcmFnZSBhbmQgZmlsdGVyaW5nIGF0IHRoZSBzYW1lIHRpbWUuIik7CisgIH0KKyAgdHJpZ2dlci0+dHJpZ2dlci0+d3JpdGVTb3VyY2VTZWxlY3RfQXZlcmFnZWQodXNlQXZlcmFnZWRWYWx1ZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGFuYWxvZyB0cmlnZ2VyIHRvIHVzZSBhIGZpbHRlcmVkIHZhbHVlLgorICogVGhlIGFuYWxvZyB0cmlnZ2VyIHdpbGwgb3BlcmF0ZSB3aXRoIGEgMyBwb2ludCBhdmVyYWdlIHJlamVjdGlvbiBmaWx0ZXIuIFRoaXMgaXMgZGVzaWduZWQgdG8KKyAqIGhlbHAgd2l0aCAzNjAgZGVncmVlIHBvdCBhcHBsaWNhdGlvbnMgZm9yIHRoZSBwZXJpb2Qgd2hlcmUgdGhlIHBvdCBjcm9zc2VzIHRocm91Z2ggemVyby4KKyAqLwordm9pZCBzZXRBbmFsb2dUcmlnZ2VyRmlsdGVyZWQodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgYm9vbCB1c2VGaWx0ZXJlZFZhbHVlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQW5hbG9nVHJpZ2dlciogdHJpZ2dlciA9IChBbmFsb2dUcmlnZ2VyKikgYW5hbG9nX3RyaWdnZXJfcG9pbnRlcjsKKyAgaWYgKHRyaWdnZXItPnRyaWdnZXItPnJlYWRTb3VyY2VTZWxlY3RfQXZlcmFnZWQoc3RhdHVzKSAhPSAwKSB7CisJKnN0YXR1cyA9IElOQ09NUEFUSUJMRV9TVEFURTsKKwkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiSGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhdmVyYWdlIGFuZCBmaWx0ZXJpbmcgYXQgdGhlIHNhbWUgdGltZS4iKTsKKyAgfQorICB0cmlnZ2VyLT50cmlnZ2VyLT53cml0ZVNvdXJjZVNlbGVjdF9GaWx0ZXIodXNlRmlsdGVyZWRWYWx1ZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEluV2luZG93IG91dHB1dCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKiBUcnVlIGlmIHRoZSBhbmFsb2cgaW5wdXQgaXMgYmV0d2VlbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy4KKyAqIEByZXR1cm4gVGhlIEluV2luZG93IG91dHB1dCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKi8KK2Jvb2wgZ2V0QW5hbG9nVHJpZ2dlckluV2luZG93KHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyID0gKEFuYWxvZ1RyaWdnZXIqKSBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyOworICByZXR1cm4gdHJpZ2dlci0+dHJpZ2dlci0+cmVhZE91dHB1dF9Jbkh5c3RlcmVzaXModHJpZ2dlci0+aW5kZXgsIHN0YXR1cykgIT0gMDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICogVHJ1ZSBpZiBhYm92ZSB1cHBlciBsaW1pdC4KKyAqIEZhbHNlIGlmIGJlbG93IGxvd2VyIGxpbWl0LgorICogSWYgaW4gSHlzdGVyZXNpcywgbWFpbnRhaW4gcHJldmlvdXMgc3RhdGUuCisgKiBAcmV0dXJuIFRoZSBUcmlnZ2VyU3RhdGUgb3V0cHV0IG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqLworYm9vbCBnZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlclN0YXRlKHZvaWQqIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyID0gKEFuYWxvZ1RyaWdnZXIqKSBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyOworICByZXR1cm4gdHJpZ2dlci0+dHJpZ2dlci0+cmVhZE91dHB1dF9PdmVyTGltaXQodHJpZ2dlci0+aW5kZXgsIHN0YXR1cykgIT0gMDsKK30KKworLyoqCisgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQuCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0LgorICovCitib29sIGdldEFuYWxvZ1RyaWdnZXJPdXRwdXQodm9pZCogYW5hbG9nX3RyaWdnZXJfcG9pbnRlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEFuYWxvZ1RyaWdnZXIqIHRyaWdnZXIgPSAoQW5hbG9nVHJpZ2dlciopIGFuYWxvZ190cmlnZ2VyX3BvaW50ZXI7CisgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgIHN3aXRjaCh0eXBlKSB7CisgIGNhc2Uga0luV2luZG93OgorCXJlc3VsdCA9IHRyaWdnZXItPnRyaWdnZXItPnJlYWRPdXRwdXRfSW5IeXN0ZXJlc2lzKHRyaWdnZXItPmluZGV4LCBzdGF0dXMpOworCWJyZWFrOyAvLyBYWFg6IEJhY2twb3J0CisgIGNhc2Uga1N0YXRlOgorCXJlc3VsdCA9IHRyaWdnZXItPnRyaWdnZXItPnJlYWRPdXRwdXRfT3ZlckxpbWl0KHRyaWdnZXItPmluZGV4LCBzdGF0dXMpOworCWJyZWFrOyAvLyBYWFg6IEJhY2twb3J0CisgIGNhc2Uga1Jpc2luZ1B1bHNlOgorICBjYXNlIGtGYWxsaW5nUHVsc2U6CisJKnN0YXR1cyA9IEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUjsKKwlyZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisKKy8vLy8gRmxvYXQgSk5BIEhhY2sKKy8vIEZsb2F0CitpbnQgZ2V0QW5hbG9nU2FtcGxlUmF0ZUludEhhY2soaW50MzJfdCAqc3RhdHVzKSB7CisgIHJldHVybiBmbG9hdFRvSW50KGdldEFuYWxvZ1NhbXBsZVJhdGUoc3RhdHVzKSk7Cit9CisKK2ludCBnZXRBbmFsb2dWb2x0YWdlSW50SGFjayh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgcmV0dXJuIGZsb2F0VG9JbnQoZ2V0QW5hbG9nVm9sdGFnZShhbmFsb2dfcG9ydF9wb2ludGVyLCBzdGF0dXMpKTsKK30KKworaW50IGdldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlSW50SGFjayh2b2lkKiBhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgcmV0dXJuIGZsb2F0VG9JbnQoZ2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2UoYW5hbG9nX3BvcnRfcG9pbnRlciwgc3RhdHVzKSk7Cit9CisKKworLy8gRG91Ymxlcwordm9pZCBzZXRBbmFsb2dTYW1wbGVSYXRlSW50SGFjayhpbnQgc2FtcGxlc1BlclNlY29uZCwgaW50MzJfdCAqc3RhdHVzKSB7CisgIHNldEFuYWxvZ1NhbXBsZVJhdGUoaW50VG9GbG9hdChzYW1wbGVzUGVyU2Vjb25kKSwgc3RhdHVzKTsKK30KKworaW50MzJfdCBnZXRBbmFsb2dWb2x0c1RvVmFsdWVJbnRIYWNrKHZvaWQqIGFuYWxvZ19wb3J0X3BvaW50ZXIsIGludCB2b2x0YWdlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgcmV0dXJuIGdldEFuYWxvZ1ZvbHRzVG9WYWx1ZShhbmFsb2dfcG9ydF9wb2ludGVyLCBpbnRUb0Zsb2F0KHZvbHRhZ2UpLCBzdGF0dXMpOworfQorCit2b2lkIHNldEFuYWxvZ1RyaWdnZXJMaW1pdHNWb2x0YWdlSW50SGFjayh2b2lkKiBhbmFsb2dfdHJpZ2dlcl9wb2ludGVyLCBpbnQgbG93ZXIsIGludCB1cHBlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIHNldEFuYWxvZ1RyaWdnZXJMaW1pdHNWb2x0YWdlKGFuYWxvZ190cmlnZ2VyX3BvaW50ZXIsIGludFRvRmxvYXQobG93ZXIpLCBpbnRUb0Zsb2F0KHVwcGVyKSwgc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0NoaXBPYmplY3QuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0NoaXBPYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBjMzRkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvQ2hpcE9iamVjdC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGVkYW50aWMiCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XaWdub3JlZC1xdWFsaWZpZXJzIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L1JvYm9SSU9fRlJDX0NoaXBPYmplY3RfQWxpYXNlcy5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvdERNQUNoYW5uZWxEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC90RE1BTWFuYWdlci5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvdEludGVycnVwdE1hbmFnZXIuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW0uaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW1JbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS9uSW50ZXJmYWNlR2xvYmFscy5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWNjZWwuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY3VtdWxhdG9yLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBSS5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWxhcm0uaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFuYWxvZ1RyaWdnZXIuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFPLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RCSVNULmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RDb3VudGVyLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RESU8uaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdERNQS5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RW5jb2Rlci5oIgorI2luY2x1ZGUgIkZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90R2xvYmFsLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RJbnRlcnJ1cHQuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFBvd2VyLmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQV00uaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFJlbGF5LmgiCisjaW5jbHVkZSAiRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RTUEkuaCIKKyNpbmNsdWRlICJGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFN5c1dhdGNoZG9nLmgiCisKKy8vIEZJWE1FOiB0aGVzZSBzaG91bGQgbm90IGJlIGhlcmUhCit1c2luZyBuYW1lc3BhY2UgbkZQR0E7Cit1c2luZyBuYW1lc3BhY2UgblJvYm9SSU9fRlBHQU5hbWVzcGFjZTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9Db21wcmVzc29yLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0NvbXByZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDUwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9Db21wcmVzc29yLmNwcApAQCAtMCwwICsxLDExNiBAQAorI2luY2x1ZGUgIkhBTC9Db21wcmVzc29yLmhwcCIKKyNpbmNsdWRlICJjdHJlL1BDTS5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCitzdGF0aWMgY29uc3QgaW50IE5VTV9NT0RVTEVfTlVNQkVSUyA9IDYzOworZXh0ZXJuIFBDTSAqbW9kdWxlc1tOVU1fTU9EVUxFX05VTUJFUlNdOworZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZVBDTShpbnQgbW9kdWxlKTsKKwordm9pZCAqaW5pdGlhbGl6ZUNvbXByZXNzb3IodWludDhfdCBtb2R1bGUpIHsKKwlpbml0aWFsaXplUENNKG1vZHVsZSk7CisJCisJcmV0dXJuIG1vZHVsZXNbbW9kdWxlXTsKK30KKworYm9vbCBjaGVja0NvbXByZXNzb3JNb2R1bGUodWludDhfdCBtb2R1bGUpIHsKKwlyZXR1cm4gbW9kdWxlIDwgTlVNX01PRFVMRV9OVU1CRVJTOworfQorCitib29sIGdldENvbXByZXNzb3Iodm9pZCAqcGNtX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworCVBDTSAqbW9kdWxlID0gKFBDTSAqKXBjbV9wb2ludGVyOworCWJvb2wgdmFsdWU7CisJCisJKnN0YXR1cyA9IG1vZHVsZS0+R2V0Q29tcHJlc3Nvcih2YWx1ZSk7CisJCisJcmV0dXJuIHZhbHVlOworfQorCisKK3ZvaWQgc2V0Q2xvc2VkTG9vcENvbnRyb2wodm9pZCAqcGNtX3BvaW50ZXIsIGJvb2wgdmFsdWUsIGludDMyX3QgKnN0YXR1cykgeworCVBDTSAqbW9kdWxlID0gKFBDTSAqKXBjbV9wb2ludGVyOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPlNldENsb3NlZExvb3BDb250cm9sKHZhbHVlKTsKK30KKworCitib29sIGdldENsb3NlZExvb3BDb250cm9sKHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlib29sIHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldENsb3NlZExvb3BDb250cm9sKHZhbHVlKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9CisKKworYm9vbCBnZXRQcmVzc3VyZVN3aXRjaCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJUENNICptb2R1bGUgPSAoUENNICopcGNtX3BvaW50ZXI7CisJYm9vbCB2YWx1ZTsKKwkKKwkqc3RhdHVzID0gbW9kdWxlLT5HZXRQcmVzc3VyZSh2YWx1ZSk7CisJCisJcmV0dXJuIHZhbHVlOworfQorCisKK2Zsb2F0IGdldENvbXByZXNzb3JDdXJyZW50KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlmbG9hdCB2YWx1ZTsKKwkKKwkqc3RhdHVzID0gbW9kdWxlLT5HZXRDb21wcmVzc29yQ3VycmVudCh2YWx1ZSk7CisJCisJcmV0dXJuIHZhbHVlOworfQorYm9vbCBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJUENNICptb2R1bGUgPSAoUENNICopcGNtX3BvaW50ZXI7CisJYm9vbCB2YWx1ZTsKKwkKKwkqc3RhdHVzID0gbW9kdWxlLT5HZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdCh2YWx1ZSk7CisJCisJcmV0dXJuIHZhbHVlOworfQorYm9vbCBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJUENNICptb2R1bGUgPSAoUENNICopcGNtX3BvaW50ZXI7CisJYm9vbCB2YWx1ZTsKKwkKKwkqc3RhdHVzID0gbW9kdWxlLT5HZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdCh2YWx1ZSk7CisJCisJcmV0dXJuIHZhbHVlOworfQorYm9vbCBnZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlib29sIHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQodmFsdWUpOworCQorCXJldHVybiB2YWx1ZTsKK30KK2Jvb2wgZ2V0Q29tcHJlc3NvclNob3J0ZWRGYXVsdCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJUENNICptb2R1bGUgPSAoUENNICopcGNtX3BvaW50ZXI7CisJYm9vbCB2YWx1ZTsKKwkKKwkqc3RhdHVzID0gbW9kdWxlLT5HZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KHZhbHVlKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9Citib29sIGdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJUENNICptb2R1bGUgPSAoUENNICopcGNtX3BvaW50ZXI7CisJYm9vbCB2YWx1ZTsKKwkKKwkqc3RhdHVzID0gbW9kdWxlLT5HZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQodmFsdWUpOworCQorCXJldHVybiB2YWx1ZTsKK30KK2Jvb2wgZ2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KHZvaWQgKnBjbV9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQQ00gKm1vZHVsZSA9IChQQ00gKilwY21fcG9pbnRlcjsKKwlib29sIHZhbHVlOworCQorCSpzdGF0dXMgPSBtb2R1bGUtPkdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCh2YWx1ZSk7CisJCisJcmV0dXJuIHZhbHVlOworfQordm9pZCBjbGVhckFsbFBDTVN0aWNreUZhdWx0cyh2b2lkICpwY21fcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJUENNICptb2R1bGUgPSAoUENNICopcGNtX3BvaW50ZXI7CisJCisJKnN0YXR1cyA9IG1vZHVsZS0+Q2xlYXJTdGlja3lGYXVsdHMoKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0RpZ2l0YWwuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRGlnaXRhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhYWYwOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0RpZ2l0YWwuY3BwCkBAIC0wLDAgKzEsMTU2MyBAQAorCisjaW5jbHVkZSAiSEFML0RpZ2l0YWwuaHBwIgorCisjaW5jbHVkZSAiUG9ydC5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIkNoaXBPYmplY3QuaCIKKyNpbmNsdWRlICJIQUwvY3BwL1N5bmNocm9uaXplZC5ocHAiCisjaW5jbHVkZSAiSEFML2NwcC9SZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImkyY2xpYi9pMmMtbGliLmgiCisjaW5jbHVkZSAic3BpbGliL3NwaS1saWIuaCIKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtFeHBlY3RlZExvb3BUaW1pbmcgPSA0MDsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrRGlnaXRhbFBpbnMgPSAyNjsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrUHdtUGlucyA9IDIwOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxheVBpbnMgPSA4Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtOdW1IZWFkZXJzID0gMTA7IC8vIE51bWJlciBvZiBub24tTVhQIHBpbnMKKworUmVlbnRyYW50TXV0ZXgmIHNwaUdldFNlbWFwaG9yZSh1aW50OF90IHBvcnQpOworCisvKioKKyAqIGtEZWZhdWx0UHdtUGVyaW9kIGlzIGluIG1zCisgKgorICogLSAyMG1zIHBlcmlvZHMgKDUwIEh6KSBhcmUgdGhlICJzYWZlc3QiIHNldHRpbmcgaW4gdGhhdCB0aGlzIHdvcmtzIGZvciBhbGwgZGV2aWNlcworICogLSAyMG1zIHBlcmlvZHMgc2VlbSB0byBiZSBkZXNpcmFibGUgZm9yIFZleCBNb3RvcnMKKyAqIC0gMjBtcyBwZXJpb2RzIGFyZSB0aGUgc3BlY2lmaWVkIHBlcmlvZCBmb3IgSFMtMzIySEQgc2Vydm9zLCBidXQgd29yayByZWxpYWJseSBkb3duCisgKiAgICAgIHRvIDEwLjAgbXM7IHN0YXJ0aW5nIGF0IGFib3V0IDguNW1zLCB0aGUgc2Vydm8gc29tZXRpbWVzIGh1bXMgYW5kIGdldCBob3Q7CisgKiAgICAgIGJ5IDUuMG1zIHRoZSBodW0gaXMgbmVhcmx5IGNvbnRpbnVvdXMKKyAqIC0gMTBtcyBwZXJpb2RzIHdvcmsgd2VsbCBmb3IgVmljdG9yIDg4NAorICogLSA1bXMgcGVyaW9kcyBhbGxvd3MgaGlnaGVyIHVwZGF0ZSByYXRlcyBmb3IgTHVtaW5hcnkgTWljcm8gSmFndWFyIHNwZWVkIGNvbnRyb2xsZXJzLgorICogICAgICBEdWUgdG8gdGhlIHNoaXBwaW5nIGZpcm13YXJlIG9uIHRoZSBKYWd1YXIsIHdlIGNhbid0IHJ1biB0aGUgdXBkYXRlIHBlcmlvZCBsZXNzCisgKiAgICAgIHRoYW4gNS4wNSBtcy4KKyAqCisgKiBrRGVmYXVsdFB3bVBlcmlvZCBpcyB0aGUgMXggcGVyaW9kICg1LjA1IG1zKS4gIEluIGhhcmR3YXJlLCB0aGUgcGVyaW9kIHNjYWxpbmcgaXMgaW1wbGVtZW50ZWQgYXMgYW4KKyAqIG91dHB1dCBzcXVlbGNoIHRvIGdldCBsb25nZXIgcGVyaW9kcyBmb3Igb2xkIGRldmljZXMuCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBrRGVmYXVsdFB3bVBlcmlvZCA9IDUuMDU7CisvKioKKyAqIGtEZWZhdWx0UHdtQ2VudGVyIGlzIHRoZSBQV00gcmFuZ2UgY2VudGVyIGluIG1zCisgKi8KK3N0YXRpYyBjb25zdCBmbG9hdCBrRGVmYXVsdFB3bUNlbnRlciA9IDEuNTsKKy8qKgorICoga0RlZmF1bHRQV01TdGVwc0Rvd24gaXMgdGhlIG51bWJlciBvZiBQV00gc3RlcHMgYmVsb3cgdGhlIGNlbnRlcnBvaW50CisgKi8KK3N0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0UHdtU3RlcHNEb3duID0gMTAwMDsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtQd21EaXNhYmxlZCA9IDA7CisKK3N0cnVjdCBEaWdpdGFsUG9ydCB7CisgIFBvcnQgcG9ydDsKKyAgdWludDMyX3QgUFdNR2VuZXJhdG9ySUQ7Cit9OworCisvLyBYWFg6IFNldCB0aGVzZSBiYWNrIHRvIHN0YXRpYyBvbmNlIHdlIGZpZ3VyZSBvdXQgdGhlIG1lbW9yeSBjbG9iYmVyaW5nIGlzc3VlCisvLyBDcmVhdGUgYSBzZW1hcGhvcmUgdG8gcHJvdGVjdCBjaGFuZ2VzIHRvIHRoZSBkaWdpdGFsIG91dHB1dCB2YWx1ZXMKK1JlZW50cmFudE11dGV4IGRpZ2l0YWxESU9TZW1hcGhvcmU7CisvLyBDcmVhdGUgYSBzZW1hcGhvcmUgdG8gcHJvdGVjdCBjaGFuZ2VzIHRvIHRoZSByZWxheSB2YWx1ZXMKK1JlZW50cmFudE11dGV4IGRpZ2l0YWxSZWxheVNlbWFwaG9yZTsKKy8vIENyZWF0ZSBhIHNlbWFwaG9yZSB0byBwcm90ZWN0IGNoYW5nZXMgdG8gdGhlIERPIFBXTSBjb25maWcKK1JlZW50cmFudE11dGV4IGRpZ2l0YWxQd21TZW1hcGhvcmU7CitSZWVudHJhbnRNdXRleCBkaWdpdGFsSTJDT25Cb2FyZFNlbWFwaG9yZTsKK1JlZW50cmFudE11dGV4IGRpZ2l0YWxJMkNNWFBTZW1hcGhvcmU7CisKK3RESU8qIGRpZ2l0YWxTeXN0ZW0gPSBOVUxMOwordFJlbGF5KiByZWxheVN5c3RlbSA9IE5VTEw7Cit0UFdNKiBwd21TeXN0ZW0gPSBOVUxMOworUmVzb3VyY2UgKkRJT0NoYW5uZWxzID0gTlVMTDsKK1Jlc291cmNlICpET19QV01HZW5lcmF0b3JzID0gTlVMTDsKK1Jlc291cmNlICpQV01DaGFubmVscyA9IE5VTEw7CisKK2Jvb2wgZGlnaXRhbFN5c3RlbXNJbml0aWFsaXplZCA9IGZhbHNlOworCit1aW50OF90IGkyQ09uYm9hcmRPYmpDb3VudCA9IDA7Cit1aW50OF90IGkyQ01YUE9iakNvdW50ID0gMDsKK3VpbnQ4X3QgaTJDT25Cb2FyZEhhbmRsZSA9IDA7Cit1aW50OF90IGkyQ01YUEhhbmRsZSA9IDA7CisKK2ludDMyX3QgbV9zcGlDUzBIYW5kbGUgPSAwOworaW50MzJfdCBtX3NwaUNTMUhhbmRsZSA9IDA7CitpbnQzMl90IG1fc3BpQ1MySGFuZGxlID0gMDsKK2ludDMyX3QgbV9zcGlDUzNIYW5kbGUgPSAwOworaW50MzJfdCBtX3NwaU1YUEhhbmRsZSA9IDA7CitSZWVudHJhbnRNdXRleCBzcGlPbmJvYXJkU2VtYXBob3JlOworUmVlbnRyYW50TXV0ZXggc3BpTVhQU2VtYXBob3JlOwordFNQSSAqc3BpU3lzdGVtOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGRpZ2l0YWwgc3lzdGVtLgorICovCit2b2lkIGluaXRpYWxpemVEaWdpdGFsKGludDMyX3QgKnN0YXR1cykgeworICBpZiAoZGlnaXRhbFN5c3RlbXNJbml0aWFsaXplZCkgcmV0dXJuOworCisgIFJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmRElPQ2hhbm5lbHMsIHRESU86OmtOdW1TeXN0ZW1zICoga0RpZ2l0YWxQaW5zKTsKKyAgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZET19QV01HZW5lcmF0b3JzLCB0RElPOjprTnVtUFdNRHV0eUN5Y2xlQUVsZW1lbnRzICsgdERJTzo6a051bVBXTUR1dHlDeWNsZUJFbGVtZW50cyk7CisgIFJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmUFdNQ2hhbm5lbHMsIHRQV006OmtOdW1TeXN0ZW1zICoga1B3bVBpbnMpOworICBkaWdpdGFsU3lzdGVtID0gdERJTzo6Y3JlYXRlKHN0YXR1cyk7CisKKyAgLy8gUmVsYXkgU2V0dXAKKyAgcmVsYXlTeXN0ZW0gPSB0UmVsYXk6OmNyZWF0ZShzdGF0dXMpOworCisgIC8vIFR1cm4gb2ZmIGFsbCByZWxheSBvdXRwdXRzLgorICByZWxheVN5c3RlbS0+d3JpdGVWYWx1ZV9Gb3J3YXJkKDAsIHN0YXR1cyk7CisgIHJlbGF5U3lzdGVtLT53cml0ZVZhbHVlX1JldmVyc2UoMCwgc3RhdHVzKTsKKworICAvLyBQV00gU2V0dXAKKyAgcHdtU3lzdGVtID0gdFBXTTo6Y3JlYXRlKHN0YXR1cyk7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIDk0MDMgSU9Ob2RlIGhhcyBoYWQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBiZWZvcmUgY29udGludWluZy4KKyAgd2hpbGUocHdtU3lzdGVtLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpID09IDApIGRlbGF5VGlja3MoMSk7CisKKyAgaWYgKHB3bVN5c3RlbS0+cmVhZExvb3BUaW1pbmcoc3RhdHVzKSAhPSBrRXhwZWN0ZWRMb29wVGltaW5nKSB7CisJLy8gVE9ETzogY2hhciBlcnJbMTI4XTsKKwkvLyBUT0RPOiBzcHJpbnRmKGVyciwgIkRJTyBMb29wVGltaW5nOiAlZCwgZXhwZWN0aW5nOiAlbHVcbiIsIGRpZ2l0YWxNb2R1bGVzW3BvcnQtPm1vZHVsZS0xXS0+cmVhZExvb3BUaW1pbmcoc3RhdHVzKSwga0V4cGVjdGVkTG9vcFRpbWluZyk7CisJKnN0YXR1cyA9IExPT1BfVElNSU5HX0VSUk9SOyAvLyBOT1RFOiBEb2Vzbid0IGRpc3BsYXkgdGhlIGVycm9yCisgIH0KKworICAvL0NhbGN1bGF0ZSB0aGUgbGVuZ3RoLCBpbiBtcywgb2Ygb25lIERJTyBsb29wCisgIGRvdWJsZSBsb29wVGltZSA9IHB3bVN5c3RlbS0+cmVhZExvb3BUaW1pbmcoc3RhdHVzKS8oa1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCoxZTMpOworCisgIHB3bVN5c3RlbS0+d3JpdGVDb25maWdfUGVyaW9kKCh1aW50MTZfdCkgKGtEZWZhdWx0UHdtUGVyaW9kL2xvb3BUaW1lICsgLjUpLCBzdGF0dXMpOworICB1aW50MTZfdCBtaW5IaWdoID0gKHVpbnQxNl90KSAoKGtEZWZhdWx0UHdtQ2VudGVyLWtEZWZhdWx0UHdtU3RlcHNEb3duKmxvb3BUaW1lKS9sb29wVGltZSArIC41KTsKKyAgcHdtU3lzdGVtLT53cml0ZUNvbmZpZ19NaW5IaWdoKG1pbkhpZ2gsIHN0YXR1cyk7CisvLyAgcHJpbnRmKCJNaW5IaWdoOiAlZFxuIiwgbWluSGlnaCk7CisgIC8vIEVuc3VyZSB0aGF0IFBXTSBvdXRwdXQgdmFsdWVzIGFyZSBzZXQgdG8gT0ZGCisgIGZvciAodWludDMyX3QgcHdtX2luZGV4ID0gMDsgcHdtX2luZGV4IDwga1B3bVBpbnM7IHB3bV9pbmRleCsrKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBwb3J0IHN0cnVjdHVyZQorICAgIERpZ2l0YWxQb3J0KiBkaWdpdGFsX3BvcnQgPSBuZXcgRGlnaXRhbFBvcnQoKTsKKyAgICBkaWdpdGFsX3BvcnQtPnBvcnQucGluID0gcHdtX2luZGV4OworCisgICAgc2V0UFdNKGRpZ2l0YWxfcG9ydCwga1B3bURpc2FibGVkLCBzdGF0dXMpOworICAgIHNldFBXTVBlcmlvZFNjYWxlKGRpZ2l0YWxfcG9ydCwgMywgc3RhdHVzKTsgLy8gU2V0IGFsbCB0byA0eCBieSBkZWZhdWx0LgorICB9CisKKyAgZGlnaXRhbFN5c3RlbXNJbml0aWFsaXplZCA9IHRydWU7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgZGlnaXRhbCBwb3J0LgorICovCit2b2lkKiBpbml0aWFsaXplRGlnaXRhbFBvcnQodm9pZCogcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgaW5pdGlhbGl6ZURpZ2l0YWwoc3RhdHVzKTsKKyAgUG9ydCogcG9ydCA9IChQb3J0KikgcG9ydF9wb2ludGVyOworCisgIC8vIEluaXRpYWxpemUgcG9ydCBzdHJ1Y3R1cmUKKyAgRGlnaXRhbFBvcnQqIGRpZ2l0YWxfcG9ydCA9IG5ldyBEaWdpdGFsUG9ydCgpOworICBkaWdpdGFsX3BvcnQtPnBvcnQgPSAqcG9ydDsKKworICByZXR1cm4gZGlnaXRhbF9wb3J0OworfQorCitib29sIGNoZWNrUFdNQ2hhbm5lbCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlcikgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICByZXR1cm4gcG9ydC0+cG9ydC5waW4gPCBrUHdtUGluczsKK30KKworYm9vbCBjaGVja1JlbGF5Q2hhbm5lbCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlcikgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICByZXR1cm4gcG9ydC0+cG9ydC5waW4gPCBrUmVsYXlQaW5zOworfQorCisvKioKKyAqIE1hcCBESU8gcGluIG51bWJlcnMgZnJvbSB0aGVpciBwaHlzaWNhbCBudW1iZXIgKDEwIHRvIDI2KSB0byB0aGVpciBwb3NpdGlvbgorICogaW4gdGhlIGJpdCBmaWVsZC4KKyAqLwordWludDMyX3QgcmVtYXBNWFBDaGFubmVsKHVpbnQzMl90IHBpbikgeworICAgIHJldHVybiBwaW4gLSAxMDsKK30KKwordWludDMyX3QgcmVtYXBNWFBQV01DaGFubmVsKHVpbnQzMl90IHBpbikgeworCWlmKHBpbiA8IDE0KSB7CisJCXJldHVybiBwaW4gLSAxMDsJLy9maXJzdCBibG9jayBvZiA0IHB3bXMgKE1YUCAwLTMpCisJfSBlbHNlIHsKKwkJcmV0dXJuIHBpbiAtIDY7CS8vYmxvY2sgb2YgUFdNcyBhZnRlciBTUEkKKwl9Cit9CisKKy8qKgorICogU2V0IGEgUFdNIGNoYW5uZWwgdG8gdGhlIGRlc2lyZWQgdmFsdWUuIFRoZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDI1NSBhbmQgdGhlIHBlcmlvZCBpcyBjb250cm9sbGVkCisgKiBieSB0aGUgUFdNIFBlcmlvZCBhbmQgTWluSGlnaCByZWdpc3RlcnMuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHNldC4KKyAqIEBwYXJhbSB2YWx1ZSBUaGUgUFdNIHZhbHVlIHRvIHNldC4KKyAqLwordm9pZCBzZXRQV00odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIHVuc2lnbmVkIHNob3J0IHZhbHVlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgY2hlY2tQV01DaGFubmVsKHBvcnQpOworCisgIGlmKHBvcnQtPnBvcnQucGluIDwgdFBXTTo6a051bUhkclJlZ2lzdGVycykgeworICAgIHB3bVN5c3RlbS0+d3JpdGVIZHIocG9ydC0+cG9ydC5waW4sIHZhbHVlLCBzdGF0dXMpOworICB9IGVsc2UgeworICAgIHB3bVN5c3RlbS0+d3JpdGVNWFAocG9ydC0+cG9ydC5waW4gLSB0UFdNOjprTnVtSGRyUmVnaXN0ZXJzLCB2YWx1ZSwgc3RhdHVzKTsKKyAgfQorfQorCisvKioKKyAqIEdldCBhIHZhbHVlIGZyb20gYSBQV00gY2hhbm5lbC4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1LgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0byByZWFkIGZyb20uCisgKiBAcmV0dXJuIFRoZSByYXcgUFdNIHZhbHVlLgorICovCit1bnNpZ25lZCBzaG9ydCBnZXRQV00odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICBjaGVja1BXTUNoYW5uZWwocG9ydCk7CisKKyAgaWYocG9ydC0+cG9ydC5waW4gPCB0UFdNOjprTnVtSGRyUmVnaXN0ZXJzKSB7CisgICAgcmV0dXJuIHB3bVN5c3RlbS0+cmVhZEhkcihwb3J0LT5wb3J0LnBpbiwgc3RhdHVzKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcHdtU3lzdGVtLT5yZWFkTVhQKHBvcnQtPnBvcnQucGluIC0gdFBXTTo6a051bUhkclJlZ2lzdGVycywgc3RhdHVzKTsKKyAgfQorfQorCit2b2lkIGxhdGNoUFdNWmVybyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKwlwd21TeXN0ZW0tPndyaXRlWmVyb0xhdGNoKHBvcnQtPnBvcnQucGluLCB0cnVlLCBzdGF0dXMpOworCXB3bVN5c3RlbS0+d3JpdGVaZXJvTGF0Y2gocG9ydC0+cG9ydC5waW4sIGZhbHNlLCBzdGF0dXMpOworfQorCisvKioKKyAqIFNldCBob3cgaG93IG9mdGVuIHRoZSBQV00gc2lnbmFsIGlzIHNxdWVsY2hlZCwgdGh1cyBzY2FsaW5nIHRoZSBwZXJpb2QuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIGNvbmZpZ3VyZS4KKyAqIEBwYXJhbSBzcXVlbGNoTWFzayBUaGUgMi1iaXQgbWFzayBvZiBvdXRwdXRzIHRvIHNxdWVsY2guCisgKi8KK3ZvaWQgc2V0UFdNUGVyaW9kU2NhbGUodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIHVpbnQzMl90IHNxdWVsY2hNYXNrLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgY2hlY2tQV01DaGFubmVsKHBvcnQpOworCisgIGlmKHBvcnQtPnBvcnQucGluIDwgdFBXTTo6a051bVBlcmlvZFNjYWxlSGRyRWxlbWVudHMpIHsKKyAgICBwd21TeXN0ZW0tPndyaXRlUGVyaW9kU2NhbGVIZHIocG9ydC0+cG9ydC5waW4sIHNxdWVsY2hNYXNrLCBzdGF0dXMpOworICB9IGVsc2UgeworICAgIHB3bVN5c3RlbS0+d3JpdGVQZXJpb2RTY2FsZU1YUChwb3J0LT5wb3J0LnBpbiAtIHRQV006OmtOdW1QZXJpb2RTY2FsZUhkckVsZW1lbnRzLCBzcXVlbGNoTWFzaywgc3RhdHVzKTsKKyAgfQorfQorCisvKioKKyAqIEFsbG9jYXRlIGEgRE8gUFdNIEdlbmVyYXRvci4KKyAqIEFsbG9jYXRlIFBXTSBnZW5lcmF0b3JzIHNvIHRoYXQgdGhleSBhcmUgbm90IGFjY2lkZW50YWxseSByZXVzZWQuCisgKgorICogQHJldHVybiBQV00gR2VuZXJhdG9yIHJlZm51bQorICovCit2b2lkKiBhbGxvY2F0ZVBXTShpbnQzMl90ICpzdGF0dXMpIHsKKyAgcmV0dXJuICh2b2lkKilET19QV01HZW5lcmF0b3JzLT5BbGxvY2F0ZSgiRE9fUFdNIik7Cit9CisKKy8qKgorICogRnJlZSB0aGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgRE8gUFdNIGdlbmVyYXRvci4KKyAqCisgKiBAcGFyYW0gcHdtR2VuZXJhdG9yIFRoZSBwd21HZW4gdG8gZnJlZSB0aGF0IHdhcyBhbGxvY2F0ZWQgd2l0aCBBbGxvY2F0ZURPX1BXTSgpCisgKi8KK3ZvaWQgZnJlZVBXTSh2b2lkKiBwd21HZW5lcmF0b3IsIGludDMyX3QgKnN0YXR1cykgeworICB1aW50MzJfdCBpZCA9ICh1aW50MzJfdCkgcHdtR2VuZXJhdG9yOworICBpZiAoaWQgPT0gfjB1bCkgcmV0dXJuOworICBET19QV01HZW5lcmF0b3JzLT5GcmVlKGlkKTsKK30KKworLyoqCisgKiBDaGFuZ2UgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgRE8gUFdNIGdlbmVyYXRvci4KKyAqCisgKiBUaGUgdmFsaWQgcmFuZ2UgaXMgZnJvbSAwLjYgSHogdG8gMTkga0h6LiAgVGhlIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGlzIGxvZ2FyaXRobWljLgorICoKKyAqIEBwYXJhbSByYXRlIFRoZSBmcmVxdWVuY3kgdG8gb3V0cHV0IGFsbCBkaWdpdGFsIG91dHB1dCBQV00gc2lnbmFscy4KKyAqLwordm9pZCBzZXRQV01SYXRlKGRvdWJsZSByYXRlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgLy8gQ3VycmVudGx5IHJvdW5kaW5nIGluIHRoZSBsb2cgcmF0ZSBkb21haW4uLi4gaGVhdnkgd2VpZ2h0IHRvd2FyZCBwaWNraW5nIGEgaGlnaGVyIGZyZXEuCisgIC8vIFRPRE86IFJvdW5kIGluIHRoZSBsaW5lYXIgcmF0ZSBkb21haW4uCisgIHVpbnQ4X3QgcHdtUGVyaW9kUG93ZXIgPSAodWludDhfdCkobG9nKDEuMCAvIChwd21TeXN0ZW0tPnJlYWRMb29wVGltaW5nKHN0YXR1cykgKiAwLjI1RS02ICogcmF0ZSkpL2xvZygyLjApICsgMC41KTsKKyAgZGlnaXRhbFN5c3RlbS0+d3JpdGVQV01QZXJpb2RQb3dlcihwd21QZXJpb2RQb3dlciwgc3RhdHVzKTsKK30KKworCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgZHV0eS1jeWNsZSBvZiB0aGUgUFdNIGdlbmVyYXRvcgorICoKKyAqIEBwYXJhbSBwd21HZW5lcmF0b3IgVGhlIGdlbmVyYXRvciBpbmRleCByZXNlcnZlZCBieSBBbGxvY2F0ZURPX1BXTSgpCisgKiBAcGFyYW0gZHV0eUN5Y2xlIFRoZSBwZXJjZW50IGR1dHkgY3ljbGUgdG8gb3V0cHV0IFswLi4xXS4KKyAqLwordm9pZCBzZXRQV01EdXR5Q3ljbGUodm9pZCogcHdtR2VuZXJhdG9yLCBkb3VibGUgZHV0eUN5Y2xlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgdWludDMyX3QgaWQgPSAodWludDMyX3QpIHB3bUdlbmVyYXRvcjsKKyAgaWYgKGlkID09IH4wdWwpIHJldHVybjsKKyAgaWYgKGR1dHlDeWNsZSA+IDEuMCkgZHV0eUN5Y2xlID0gMS4wOworICBpZiAoZHV0eUN5Y2xlIDwgMC4wKSBkdXR5Q3ljbGUgPSAwLjA7CisgIGZsb2F0IHJhd0R1dHlDeWNsZSA9IDI1Ni4wICogZHV0eUN5Y2xlOworICBpZiAocmF3RHV0eUN5Y2xlID4gMjU1LjUpIHJhd0R1dHlDeWNsZSA9IDI1NS41OworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGRpZ2l0YWxQd21TZW1hcGhvcmUpOworICAgIHVpbnQ4X3QgcHdtUGVyaW9kUG93ZXIgPSBkaWdpdGFsU3lzdGVtLT5yZWFkUFdNUGVyaW9kUG93ZXIoc3RhdHVzKTsKKyAgICBpZiAocHdtUGVyaW9kUG93ZXIgPCA0KSB7CisJICAvLyBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgZHV0eSBjeWNsZSBkcm9wcyBjbG9zZSB0byB0aGUgaGlnaGVzdCBmcmVxdWVuY2llcy4KKwkgIHJhd0R1dHlDeWNsZSA9IHJhd0R1dHlDeWNsZSAvIHBvdygyLjAsIDQgLSBwd21QZXJpb2RQb3dlcik7CisJfQorCWlmKGlkIDwgNCkKKwkJZGlnaXRhbFN5c3RlbS0+d3JpdGVQV01EdXR5Q3ljbGVBKGlkLCAodWludDhfdClyYXdEdXR5Q3ljbGUsIHN0YXR1cyk7CisJZWxzZSAKKwkJZGlnaXRhbFN5c3RlbS0+d3JpdGVQV01EdXR5Q3ljbGVCKGlkIC0gNCwgKHVpbnQ4X3QpcmF3RHV0eUN5Y2xlLCBzdGF0dXMpOworICB9Cit9CisKKy8qKgorICogQ29uZmlndXJlIHdoaWNoIERPIGNoYW5uZWwgdGhlIFBXTSBzaWduYWwgaXMgb3V0cHV0IG9uCisgKgorICogQHBhcmFtIHB3bUdlbmVyYXRvciBUaGUgZ2VuZXJhdG9yIGluZGV4IHJlc2VydmVkIGJ5IEFsbG9jYXRlRE9fUFdNKCkKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBEaWdpdGFsIE91dHB1dCBjaGFubmVsIHRvIG91dHB1dCBvbgorICovCit2b2lkIHNldFBXTU91dHB1dENoYW5uZWwodm9pZCogcHdtR2VuZXJhdG9yLCB1aW50MzJfdCBwaW4sIGludDMyX3QgKnN0YXR1cykgeworICB1aW50MzJfdCBpZCA9ICh1aW50MzJfdCkgcHdtR2VuZXJhdG9yOworICBpZiAoaWQgPiA1KSByZXR1cm47CisgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlUFdNT3V0cHV0U2VsZWN0KGlkLCBwaW4sIHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBzdGF0ZSBvZiBhIHJlbGF5LgorICogU2V0IHRoZSBzdGF0ZSBvZiBhIHJlbGF5IG91dHB1dCB0byBiZSBmb3J3YXJkLiBSZWxheXMgaGF2ZSB0d28gb3V0cHV0cyBhbmQgZWFjaCBpcworICogaW5kZXBlbmRlbnRseSBzZXQgdG8gMHYgb3IgMTJ2LgorICovCit2b2lkIHNldFJlbGF5Rm9yd2FyZCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgYm9vbCBvbiwgaW50MzJfdCAqc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIGNoZWNrUmVsYXlDaGFubmVsKHBvcnQpOworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGRpZ2l0YWxSZWxheVNlbWFwaG9yZSk7CisgICAgdWludDhfdCBmb3J3YXJkUmVsYXlzID0gcmVsYXlTeXN0ZW0tPnJlYWRWYWx1ZV9Gb3J3YXJkKHN0YXR1cyk7CisgICAgaWYgKG9uKQorICAgICAgZm9yd2FyZFJlbGF5cyB8PSAxIDw8IHBvcnQtPnBvcnQucGluOworICAgIGVsc2UKKyAgICAgIGZvcndhcmRSZWxheXMgJj0gfigxIDw8IHBvcnQtPnBvcnQucGluKTsKKyAgICByZWxheVN5c3RlbS0+d3JpdGVWYWx1ZV9Gb3J3YXJkKGZvcndhcmRSZWxheXMsIHN0YXR1cyk7CisgIH0KK30KKworLyoqCisgKiBTZXQgdGhlIHN0YXRlIG9mIGEgcmVsYXkuCisgKiBTZXQgdGhlIHN0YXRlIG9mIGEgcmVsYXkgb3V0cHV0IHRvIGJlIHJldmVyc2UuIFJlbGF5cyBoYXZlIHR3byBvdXRwdXRzIGFuZCBlYWNoIGlzCisgKiBpbmRlcGVuZGVudGx5IHNldCB0byAwdiBvciAxMnYuCisgKi8KK3ZvaWQgc2V0UmVsYXlSZXZlcnNlKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBib29sIG9uLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgY2hlY2tSZWxheUNoYW5uZWwocG9ydCk7CisgIHsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoZGlnaXRhbFJlbGF5U2VtYXBob3JlKTsKKyAgICB1aW50OF90IHJldmVyc2VSZWxheXMgPSByZWxheVN5c3RlbS0+cmVhZFZhbHVlX1JldmVyc2Uoc3RhdHVzKTsKKyAgICBpZiAob24pCisgICAgICByZXZlcnNlUmVsYXlzIHw9IDEgPDwgcG9ydC0+cG9ydC5waW47CisgICAgZWxzZQorICAgICAgcmV2ZXJzZVJlbGF5cyAmPSB+KDEgPDwgcG9ydC0+cG9ydC5waW4pOworICAgIHJlbGF5U3lzdGVtLT53cml0ZVZhbHVlX1JldmVyc2UocmV2ZXJzZVJlbGF5cywgc3RhdHVzKTsKKyAgfQorfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZm9yd2FyZCByZWxheSBjaGFubmVsCisgKi8KK2Jvb2wgZ2V0UmVsYXlGb3J3YXJkKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgdWludDhfdCBmb3J3YXJkUmVsYXlzID0gcmVsYXlTeXN0ZW0tPnJlYWRWYWx1ZV9Gb3J3YXJkKHN0YXR1cyk7CisgIHJldHVybiAoZm9yd2FyZFJlbGF5cyAmICgxIDw8IHBvcnQtPnBvcnQucGluKSkgIT0gMDsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJldmVyc2UgcmVsYXkgY2hhbm5lbAorICovCitib29sIGdldFJlbGF5UmV2ZXJzZSh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIHVpbnQ4X3QgcmV2ZXJzZVJlbGF5cyA9IHJlbGF5U3lzdGVtLT5yZWFkVmFsdWVfUmV2ZXJzZShzdGF0dXMpOworICByZXR1cm4gKHJldmVyc2VSZWxheXMgJiAoMSA8PCBwb3J0LT5wb3J0LnBpbikpICE9IDA7Cit9CisKKy8qKgorICogQWxsb2NhdGUgRGlnaXRhbCBJL08gY2hhbm5lbHMuCisgKiBBbGxvY2F0ZSBjaGFubmVscyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBhY2NpZGVudGx5IHJldXNlZC4gQWxzbyB0aGUgZGlyZWN0aW9uIGlzIHNldCBhdCB0aGUKKyAqIHRpbWUgb2YgdGhlIGFsbG9jYXRpb24uCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERpZ2l0YWwgSS9PIGNoYW5uZWwKKyAqIEBwYXJhbSBpbnB1dCBJZiB0cnVlIG9wZW4gYXMgaW5wdXQ7IGlmIGZhbHNlIG9wZW4gYXMgb3V0cHV0CisgKiBAcmV0dXJuIFdhcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkCisgKi8KK2Jvb2wgYWxsb2NhdGVESU8odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGJvb2wgaW5wdXQsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICBjaGFyIGJ1Zls2NF07CisgIHNucHJpbnRmKGJ1ZiwgNjQsICJESU8gJWQiLCBwb3J0LT5wb3J0LnBpbik7CisgIGlmIChESU9DaGFubmVscy0+QWxsb2NhdGUocG9ydC0+cG9ydC5waW4sIGJ1ZikgPT0gfjB1bCkgeworICAgICpzdGF0dXMgPSBSRVNPVVJDRV9JU19BTExPQ0FURUQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhkaWdpdGFsRElPU2VtYXBob3JlKTsKKworICAgIHRESU86OnRPdXRwdXRFbmFibGUgb3V0cHV0RW5hYmxlID0gZGlnaXRhbFN5c3RlbS0+cmVhZE91dHB1dEVuYWJsZShzdGF0dXMpOworCisgICAgaWYocG9ydC0+cG9ydC5waW4gPCBrTnVtSGVhZGVycykgeworICAgICAgdWludDMyX3QgYml0VG9TZXQgPSAxIDw8IHBvcnQtPnBvcnQucGluOworICAgICAgaWYgKGlucHV0KSB7CisgICAgICAgIG91dHB1dEVuYWJsZS5IZWFkZXJzID0gb3V0cHV0RW5hYmxlLkhlYWRlcnMgJiAofmJpdFRvU2V0KTsgLy8gY2xlYXIgdGhlIGJpdCBmb3IgcmVhZAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0RW5hYmxlLkhlYWRlcnMgPSBvdXRwdXRFbmFibGUuSGVhZGVycyB8IGJpdFRvU2V0OyAvLyBzZXQgdGhlIGJpdCBmb3Igd3JpdGUKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdWludDMyX3QgYml0VG9TZXQgPSAxIDw8IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5wb3J0LnBpbik7CisKKyAgICAgIC8vIERpc2FibGUgc3BlY2lhbCBmdW5jdGlvbnMgb24gdGhpcyBwaW4KKyAgICAgIHNob3J0IHNwZWNpYWxGdW5jdGlvbnMgPSBkaWdpdGFsU3lzdGVtLT5yZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHN0YXR1cyk7CisgICAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzcGVjaWFsRnVuY3Rpb25zICYgfmJpdFRvU2V0LCBzdGF0dXMpOworCisgICAgICBpZiAoaW5wdXQpIHsKKyAgICAgICAgb3V0cHV0RW5hYmxlLk1YUCA9IG91dHB1dEVuYWJsZS5NWFAgJiAofmJpdFRvU2V0KTsgLy8gY2xlYXIgdGhlIGJpdCBmb3IgcmVhZAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0RW5hYmxlLk1YUCA9IG91dHB1dEVuYWJsZS5NWFAgfCBiaXRUb1NldDsgLy8gc2V0IHRoZSBiaXQgZm9yIHdyaXRlCisgICAgICB9CisgICAgfQorCisgICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVPdXRwdXRFbmFibGUob3V0cHV0RW5hYmxlLCBzdGF0dXMpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIGFsbG9jYXRlUFdNQ2hhbm5lbCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJCURpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisJCWNoYXIgYnVmWzY0XTsKKwkJc25wcmludGYoYnVmLCA2NCwgIlBXTSAlZCIsIHBvcnQtPnBvcnQucGluKTsKKwkJaWYgKFBXTUNoYW5uZWxzLT5BbGxvY2F0ZShwb3J0LT5wb3J0LnBpbiwgYnVmKSA9PSB+MHVsKSB7CisgICAgICAqc3RhdHVzID0gUkVTT1VSQ0VfSVNfQUxMT0NBVEVEOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCQlpZiAocG9ydC0+cG9ydC5waW4gPiB0UFdNOjprTnVtSGRyUmVnaXN0ZXJzLTEpIHsKKwkJCXNucHJpbnRmKGJ1ZiwgNjQsICJQV00gJWQgYW5kIERJTyAlZCIsIHBvcnQtPnBvcnQucGluLCByZW1hcE1YUFBXTUNoYW5uZWwocG9ydC0+cG9ydC5waW4pICsgMTApOworCQkJaWYgKERJT0NoYW5uZWxzLT5BbGxvY2F0ZShyZW1hcE1YUFBXTUNoYW5uZWwocG9ydC0+cG9ydC5waW4pICsgMTAsIGJ1ZikgPT0gfjB1bCkgcmV0dXJuIGZhbHNlOworCQkgICAgdWludDMyX3QgYml0VG9TZXQgPSAxIDw8IHJlbWFwTVhQUFdNQ2hhbm5lbChwb3J0LT5wb3J0LnBpbik7CisJCSAgICBzaG9ydCBzcGVjaWFsRnVuY3Rpb25zID0gZGlnaXRhbFN5c3RlbS0+cmVhZEVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzdGF0dXMpOworCQkgICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3BlY2lhbEZ1bmN0aW9ucyB8IGJpdFRvU2V0LCBzdGF0dXMpOworCQl9CisJCXJldHVybiB0cnVlOworfQorCit2b2lkIGZyZWVQV01DaGFubmVsKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICAgIFBXTUNoYW5uZWxzLT5GcmVlKHBvcnQtPnBvcnQucGluKTsKKyAgICBpZihwb3J0LT5wb3J0LnBpbiA+IHRQV006OmtOdW1IZHJSZWdpc3RlcnMtMSkgeworICAgICAgICBESU9DaGFubmVscy0+RnJlZShyZW1hcE1YUFBXTUNoYW5uZWwocG9ydC0+cG9ydC5waW4pICsgMTApOworICAgICAgICB1aW50MzJfdCBiaXRUb1Vuc2V0ID0gMSA8PCByZW1hcE1YUFBXTUNoYW5uZWwocG9ydC0+cG9ydC5waW4pOworICAgICAgICBzaG9ydCBzcGVjaWFsRnVuY3Rpb25zID0gZGlnaXRhbFN5c3RlbS0+cmVhZEVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzdGF0dXMpOworICAgICAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzcGVjaWFsRnVuY3Rpb25zICYgfmJpdFRvVW5zZXQsIHN0YXR1cyk7CisgICAgfQorfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIGRpZ2l0YWwgSS9PIGNoYW5uZWwuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERpZ2l0YWwgSS9PIGNoYW5uZWwgdG8gZnJlZQorICovCit2b2lkIGZyZWVESU8odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICBESU9DaGFubmVscy0+RnJlZShwb3J0LT5wb3J0LnBpbik7Cit9CisKKy8qKgorICogV3JpdGUgYSBkaWdpdGFsIEkvTyBiaXQgdG8gdGhlIEZQR0EuCisgKiBTZXQgYSBzaW5nbGUgdmFsdWUgb24gYSBkaWdpdGFsIEkvTyBjaGFubmVsLgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBEaWdpdGFsIEkvTyBjaGFubmVsCisgKiBAcGFyYW0gdmFsdWUgVGhlIHN0YXRlIHRvIHNldCB0aGUgZGlnaXRhbCBjaGFubmVsIChpZiBpdCBpcyBjb25maWd1cmVkIGFzIGFuIG91dHB1dCkKKyAqLwordm9pZCBzZXRESU8odm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIHNob3J0IHZhbHVlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgaWYgKHZhbHVlICE9IDAgJiYgdmFsdWUgIT0gMSkgeworICAgIGlmICh2YWx1ZSAhPSAwKQorICAgICAgdmFsdWUgPSAxOworICB9CisgIHsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoZGlnaXRhbERJT1NlbWFwaG9yZSk7CisgICAgdERJTzo6dERPIGN1cnJlbnRESU8gPSBkaWdpdGFsU3lzdGVtLT5yZWFkRE8oc3RhdHVzKTsKKworICAgIGlmKHBvcnQtPnBvcnQucGluIDwga051bUhlYWRlcnMpIHsKKyAgICAgIGlmKHZhbHVlID09IDApIHsKKyAgICAgICAgY3VycmVudERJTy5IZWFkZXJzID0gY3VycmVudERJTy5IZWFkZXJzICYgfigxIDw8IHBvcnQtPnBvcnQucGluKTsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gMSkgeworICAgICAgICBjdXJyZW50RElPLkhlYWRlcnMgPSBjdXJyZW50RElPLkhlYWRlcnMgfCAoMSA8PCBwb3J0LT5wb3J0LnBpbik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmKHZhbHVlID09IDApIHsKKyAgICAgICAgY3VycmVudERJTy5NWFAgPSBjdXJyZW50RElPLk1YUCAmIH4oMSA8PCByZW1hcE1YUENoYW5uZWwocG9ydC0+cG9ydC5waW4pKTsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gMSkgeworICAgICAgICBjdXJyZW50RElPLk1YUCA9IGN1cnJlbnRESU8uTVhQIHwgKDEgPDwgcmVtYXBNWFBDaGFubmVsKHBvcnQtPnBvcnQucGluKSk7CisgICAgICB9CisKKyAgICAgIHVpbnQzMl90IGJpdFRvU2V0ID0gMSA8PCByZW1hcE1YUENoYW5uZWwocG9ydC0+cG9ydC5waW4pOworICAgICAgc2hvcnQgc3BlY2lhbEZ1bmN0aW9ucyA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3RhdHVzKTsKKyAgICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHNwZWNpYWxGdW5jdGlvbnMgJiB+Yml0VG9TZXQsIHN0YXR1cyk7CisgICAgfQorICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRE8oY3VycmVudERJTywgc3RhdHVzKTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIHRoZSBmaWx0ZXIgaW5kZXggZnJvbSB0aGUgRlBHQS4KKyAqIFNldCB0aGUgZmlsdGVyIGluZGV4IHVzZWQgdG8gZmlsdGVyIG91dCBzaG9ydCBwdWxzZXMuCisgKgorICogQHBhcmFtIGRpZ2l0YWxfcG9ydF9wb2ludGVyIFRoZSBkaWdpdGFsIEkvTyBjaGFubmVsCisgKiBAcGFyYW0gZmlsdGVyX2luZGV4IFRoZSBmaWx0ZXIgaW5kZXguICBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMy4KKyAqLwordm9pZCBzZXRGaWx0ZXJTZWxlY3Qodm9pZCogZGlnaXRhbF9wb3J0X3BvaW50ZXIsIGludCBmaWx0ZXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKWRpZ2l0YWxfcG9ydF9wb2ludGVyOworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGRpZ2l0YWxESU9TZW1hcGhvcmUpOworICAgIGlmIChwb3J0LT5wb3J0LnBpbiA8IGtOdW1IZWFkZXJzKSB7CisgICAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUZpbHRlclNlbGVjdEhkcihwb3J0LT5wb3J0LnBpbiwgZmlsdGVyX2luZGV4LCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUZpbHRlclNlbGVjdE1YUChyZW1hcE1YUENoYW5uZWwocG9ydC0+cG9ydC5waW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2luZGV4LCBzdGF0dXMpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJlYWQgdGhlIGZpbHRlciBpbmRleCBmcm9tIHRoZSBGUEdBLgorICogR2V0IHRoZSBmaWx0ZXIgaW5kZXggdXNlZCB0byBmaWx0ZXIgb3V0IHNob3J0IHB1bHNlcy4KKyAqCisgKiBAcGFyYW0gZGlnaXRhbF9wb3J0X3BvaW50ZXIgVGhlIGRpZ2l0YWwgSS9PIGNoYW5uZWwKKyAqIEByZXR1cm4gZmlsdGVyX2luZGV4IFRoZSBmaWx0ZXIgaW5kZXguICBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMy4KKyAqLworaW50IGdldEZpbHRlclNlbGVjdCh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCogc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KilkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhkaWdpdGFsRElPU2VtYXBob3JlKTsKKyAgICBpZiAocG9ydC0+cG9ydC5waW4gPCBrTnVtSGVhZGVycykgeworICAgICAgcmV0dXJuIGRpZ2l0YWxTeXN0ZW0tPnJlYWRGaWx0ZXJTZWxlY3RIZHIocG9ydC0+cG9ydC5waW4sIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBkaWdpdGFsU3lzdGVtLT5yZWFkRmlsdGVyU2VsZWN0TVhQKHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5wb3J0LnBpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgZmlsdGVyIHBlcmlvZCBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIgaW5kZXguCisgKgorICogU2V0IHRoZSBmaWx0ZXIgcGVyaW9kIGluIEZQR0EgY3ljbGVzLiAgRXZlbiB0aG91Z2ggdGhlcmUgYXJlIDIgZGlmZmVyZW50CisgKiBmaWx0ZXIgaW5kZXggZG9tYWlucyAoTVhQIHZzIEhEUiksIGlnbm9yZSB0aGF0IGRpc3RpbmN0aW9uIGZvciBub3cgc2luY2UgaXQKKyAqIGNvbXBpbGljYXRlcyB0aGUgaW50ZXJmYWNlLiAgVGhhdCBjYW4gYmUgY2hhbmdlZCBsYXRlci4KKyAqCisgKiBAcGFyYW0gZmlsdGVyX2luZGV4IFRoZSBmaWx0ZXIgaW5kZXgsIDAgLSAyLgorICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgb2YgY3ljbGVzIHRoYXQgdGhlIHNpZ25hbCBtdXN0IG5vdCB0cmFuc2l0aW9uIHRvIGJlCisgKiBjb3VudGVkIGFzIGEgdHJhbnNpdGlvbi4KKyAqLwordm9pZCBzZXRGaWx0ZXJQZXJpb2QoaW50IGZpbHRlcl9pbmRleCwgdWludDMyX3QgdmFsdWUsIGludDMyX3QqIHN0YXR1cykgeworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGRpZ2l0YWxESU9TZW1hcGhvcmUpOworICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRmlsdGVyUGVyaW9kSGRyKGZpbHRlcl9pbmRleCwgdmFsdWUsIHN0YXR1cyk7CisgICAgaWYgKCpzdGF0dXMgPT0gMCkgeworICAgICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVGaWx0ZXJQZXJpb2RNWFAoZmlsdGVyX2luZGV4LCB2YWx1ZSwgc3RhdHVzKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZXQgdGhlIGZpbHRlciBwZXJpb2QgZm9yIHRoZSBzcGVjaWZpZWQgZmlsdGVyIGluZGV4LgorICoKKyAqIEdldCB0aGUgZmlsdGVyIHBlcmlvZCBpbiBGUEdBIGN5Y2xlcy4gIEV2ZW4gdGhvdWdoIHRoZXJlIGFyZSAyIGRpZmZlcmVudAorICogZmlsdGVyIGluZGV4IGRvbWFpbnMgKE1YUCB2cyBIRFIpLCBpZ25vcmUgdGhhdCBkaXN0aW5jdGlvbiBmb3Igbm93IHNpbmNlIGl0CisgKiBjb21waWxpY2F0ZXMgdGhlIGludGVyZmFjZS4gIFNldCBzdGF0dXMgdG8gTmlGcGdhX1N0YXR1c19Tb2Z0d2FyZUZhdWx0IGlmIHRoZQorICogZmlsdGVyIHZhbHVlcyBtaXNzLW1hdGNoLgorICoKKyAqIEBwYXJhbSBmaWx0ZXJfaW5kZXggVGhlIGZpbHRlciBpbmRleCwgMCAtIDIuCisgKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciBvZiBjeWNsZXMgdGhhdCB0aGUgc2lnbmFsIG11c3Qgbm90IHRyYW5zaXRpb24gdG8gYmUKKyAqIGNvdW50ZWQgYXMgYSB0cmFuc2l0aW9uLgorICovCit1aW50MzJfdCBnZXRGaWx0ZXJQZXJpb2QoaW50IGZpbHRlcl9pbmRleCwgaW50MzJfdCogc3RhdHVzKSB7CisgIHVpbnQzMl90IGhkcl9wZXJpb2QgPSAwOworICB1aW50MzJfdCBteHBfcGVyaW9kID0gMDsKKyAgeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhkaWdpdGFsRElPU2VtYXBob3JlKTsKKyAgICBoZHJfcGVyaW9kID0gZGlnaXRhbFN5c3RlbS0+cmVhZEZpbHRlclBlcmlvZEhkcihmaWx0ZXJfaW5kZXgsIHN0YXR1cyk7CisgICAgaWYgKCpzdGF0dXMgPT0gMCkgeworICAgICAgbXhwX3BlcmlvZCA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRGaWx0ZXJQZXJpb2RNWFAoZmlsdGVyX2luZGV4LCBzdGF0dXMpOworICAgIH0KKyAgfQorICBpZiAoaGRyX3BlcmlvZCAhPSBteHBfcGVyaW9kKSB7CisgICAgcHJpbnRmKCJQZXJpb2RzICVkICVkXG4iLCBoZHJfcGVyaW9kLCBteHBfcGVyaW9kKTsKKyAgICAqc3RhdHVzID0gTmlGcGdhX1N0YXR1c19Tb2Z0d2FyZUZhdWx0OworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gaGRyX3BlcmlvZDsKK30KKworLyoqCisgKiBSZWFkIGEgZGlnaXRhbCBJL08gYml0IGZyb20gdGhlIEZQR0EuCisgKiBHZXQgYSBzaW5nbGUgdmFsdWUgZnJvbSBhIGRpZ2l0YWwgSS9PIGNoYW5uZWwuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGRpZ2l0YWwgSS9PIGNoYW5uZWwKKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAorICovCitib29sIGdldERJTyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIHRESU86OnRESSBjdXJyZW50RElPID0gZGlnaXRhbFN5c3RlbS0+cmVhZERJKHN0YXR1cyk7CisgIC8vU2hpZnQgMDAwMDAwMDEgb3ZlciBjaGFubmVsLTEgcGxhY2VzLgorICAvL0FORCBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50RElPCisgIC8vaWYgaXQgPT0gMCwgdGhlbiByZXR1cm4gZmFsc2UKKyAgLy9lbHNlIHJldHVybiB0cnVlCisKKyAgaWYocG9ydC0+cG9ydC5waW4gPCBrTnVtSGVhZGVycykgeworICAgIHJldHVybiAoKGN1cnJlbnRESU8uSGVhZGVycyA+PiBwb3J0LT5wb3J0LnBpbikgJiAxKSAhPSAwOworICB9IGVsc2UgeworICAgIC8vIERpc2FibGUgc3BlY2lhbCBmdW5jdGlvbnMKKyAgICB1aW50MzJfdCBiaXRUb1NldCA9IDEgPDwgcmVtYXBNWFBDaGFubmVsKHBvcnQtPnBvcnQucGluKTsKKyAgICBzaG9ydCBzcGVjaWFsRnVuY3Rpb25zID0gZGlnaXRhbFN5c3RlbS0+cmVhZEVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzdGF0dXMpOworICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHNwZWNpYWxGdW5jdGlvbnMgJiB+Yml0VG9TZXQsIHN0YXR1cyk7CisKKyAgICByZXR1cm4gKChjdXJyZW50RElPLk1YUCA+PiByZW1hcE1YUENoYW5uZWwocG9ydC0+cG9ydC5waW4pKSAmIDEpICE9IDA7CisgIH0KK30KKworLyoqCisgKiBSZWFkIHRoZSBkaXJlY3Rpb24gb2YgYSB0aGUgRGlnaXRhbCBJL08gbGluZXMKKyAqIEEgMSBiaXQgbWVhbnMgb3V0cHV0IGFuZCBhIDAgYml0IG1lYW5zIGlucHV0LgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBkaWdpdGFsIEkvTyBjaGFubmVsCisgKiBAcmV0dXJuIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCisgKi8KK2Jvb2wgZ2V0RElPRGlyZWN0aW9uKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRGlnaXRhbFBvcnQqIHBvcnQgPSAoRGlnaXRhbFBvcnQqKSBkaWdpdGFsX3BvcnRfcG9pbnRlcjsKKyAgdERJTzo6dE91dHB1dEVuYWJsZSBjdXJyZW50T3V0cHV0RW5hYmxlID0gZGlnaXRhbFN5c3RlbS0+cmVhZE91dHB1dEVuYWJsZShzdGF0dXMpOworCS8vU2hpZnQgMDAwMDAwMDEgb3ZlciBwb3J0LT5wb3J0LnBpbi0xIHBsYWNlcy4KKyAgLy9BTkQgaXQgYWdhaW5zdCB0aGUgY3VycmVudE91dHB1dEVuYWJsZQorICAvL2lmIGl0ID09IDAsIHRoZW4gcmV0dXJuIGZhbHNlCisgIC8vZWxzZSByZXR1cm4gdHJ1ZQorCisgIGlmKHBvcnQtPnBvcnQucGluIDwga051bUhlYWRlcnMpIHsKKyAgICByZXR1cm4gKChjdXJyZW50T3V0cHV0RW5hYmxlLkhlYWRlcnMgPj4gcG9ydC0+cG9ydC5waW4pICYgMSkgIT0gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKChjdXJyZW50T3V0cHV0RW5hYmxlLk1YUCA+PiByZW1hcE1YUENoYW5uZWwocG9ydC0+cG9ydC5waW4pKSAmIDEpICE9IDA7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHNpbmdsZSBwdWxzZS4KKyAqIFdyaXRlIGEgcHVsc2UgdG8gdGhlIHNwZWNpZmllZCBkaWdpdGFsIG91dHB1dCBjaGFubmVsLiBUaGVyZSBjYW4gb25seSBiZSBhIHNpbmdsZSBwdWxzZSBnb2luZyBhdCBhbnkgdGltZS4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgRGlnaXRhbCBPdXRwdXQgY2hhbm5lbCB0aGF0IHRoZSBwdWxzZSBzaG91bGQgYmUgb3V0cHV0IG9uCisgKiBAcGFyYW0gcHVsc2VMZW5ndGggVGhlIGFjdGl2ZSBsZW5ndGggb2YgdGhlIHB1bHNlIChpbiBzZWNvbmRzKQorICovCit2b2lkIHB1bHNlKHZvaWQqIGRpZ2l0YWxfcG9ydF9wb2ludGVyLCBkb3VibGUgcHVsc2VMZW5ndGgsIGludDMyX3QgKnN0YXR1cykgeworICBEaWdpdGFsUG9ydCogcG9ydCA9IChEaWdpdGFsUG9ydCopIGRpZ2l0YWxfcG9ydF9wb2ludGVyOworICB0RElPOjp0UHVsc2UgcHVsc2U7CisKKyAgaWYocG9ydC0+cG9ydC5waW4gPCBrTnVtSGVhZGVycykgeworICAgIHB1bHNlLkhlYWRlcnMgPSAxIDw8IHBvcnQtPnBvcnQucGluOworICB9IGVsc2UgeworICAgIHB1bHNlLk1YUCA9IDEgPDwgcmVtYXBNWFBDaGFubmVsKHBvcnQtPnBvcnQucGluKTsKKyAgfQorCisgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlUHVsc2VMZW5ndGgoKHVpbnQ4X3QpKDEuMGU5ICogcHVsc2VMZW5ndGggLyAocHdtU3lzdGVtLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpICogMjUpKSwgc3RhdHVzKTsKKyAgZGlnaXRhbFN5c3RlbS0+d3JpdGVQdWxzZShwdWxzZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBDaGVjayBhIERJTyBsaW5lIHRvIHNlZSBpZiBpdCBpcyBjdXJyZW50bHkgZ2VuZXJhdGluZyBhIHB1bHNlLgorICoKKyAqIEByZXR1cm4gQSBwdWxzZSBpcyBpbiBwcm9ncmVzcworICovCitib29sIGlzUHVsc2luZyh2b2lkKiBkaWdpdGFsX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIERpZ2l0YWxQb3J0KiBwb3J0ID0gKERpZ2l0YWxQb3J0KikgZGlnaXRhbF9wb3J0X3BvaW50ZXI7CisgIHRESU86OnRQdWxzZSBwdWxzZVJlZ2lzdGVyID0gZGlnaXRhbFN5c3RlbS0+cmVhZFB1bHNlKHN0YXR1cyk7CisKKyAgaWYocG9ydC0+cG9ydC5waW4gPCBrTnVtSGVhZGVycykgeworICAgIHJldHVybiAocHVsc2VSZWdpc3Rlci5IZWFkZXJzICYgKDEgPDwgcG9ydC0+cG9ydC5waW4pKSAhPSAwOworICB9IGVsc2UgeworICAgIHJldHVybiAocHVsc2VSZWdpc3Rlci5NWFAgJiAoMSA8PCByZW1hcE1YUENoYW5uZWwocG9ydC0+cG9ydC5waW4pKSkgIT0gMDsKKyAgfQorfQorCisvKioKKyAqIENoZWNrIGlmIGFueSBESU8gbGluZSBpcyBjdXJyZW50bHkgZ2VuZXJhdGluZyBhIHB1bHNlLgorICoKKyAqIEByZXR1cm4gQSBwdWxzZSBvbiBzb21lIGxpbmUgaXMgaW4gcHJvZ3Jlc3MKKyAqLworYm9vbCBpc0FueVB1bHNpbmcoaW50MzJfdCAqc3RhdHVzKSB7CisgIHRESU86OnRQdWxzZSBwdWxzZVJlZ2lzdGVyID0gZGlnaXRhbFN5c3RlbS0+cmVhZFB1bHNlKHN0YXR1cyk7CisgIHJldHVybiBwdWxzZVJlZ2lzdGVyLkhlYWRlcnMgIT0gMCAmJiBwdWxzZVJlZ2lzdGVyLk1YUCAhPSAwOworfQorCitzdHJ1Y3QgY291bnRlcl90IHsKKyAgdENvdW50ZXIqIGNvdW50ZXI7CisgIHVpbnQzMl90IGluZGV4OworfTsKK3R5cGVkZWYgc3RydWN0IGNvdW50ZXJfdCBDb3VudGVyOworCitzdGF0aWMgUmVzb3VyY2UgKmNvdW50ZXJzID0gTlVMTDsKKwordm9pZCogaW5pdGlhbGl6ZUNvdW50ZXIoTW9kZSBtb2RlLCB1aW50MzJfdCAqaW5kZXgsIGludDMyX3QgKnN0YXR1cykgeworCVJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmY291bnRlcnMsIHRDb3VudGVyOjprTnVtU3lzdGVtcyk7CisJKmluZGV4ID0gY291bnRlcnMtPkFsbG9jYXRlKCJDb3VudGVyIik7CisJaWYgKCppbmRleCA9PSB+MHVsKSB7CisJCSpzdGF0dXMgPSBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTOworCQlyZXR1cm4gTlVMTDsKKwl9CisJQ291bnRlciogY291bnRlciA9IG5ldyBDb3VudGVyKCk7CisJY291bnRlci0+Y291bnRlciA9IHRDb3VudGVyOjpjcmVhdGUoKmluZGV4LCBzdGF0dXMpOworCWNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX01vZGUobW9kZSwgc3RhdHVzKTsKKwljb3VudGVyLT5jb3VudGVyLT53cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKDEsIHN0YXR1cyk7CisJY291bnRlci0+aW5kZXggPSAqaW5kZXg7CisJcmV0dXJuIGNvdW50ZXI7Cit9CisKK3ZvaWQgZnJlZUNvdW50ZXIodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgaWYgKGNvdW50ZXJfcG9pbnRlciAhPSBOVUxMKSB7CisJICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisJICBkZWxldGUgY291bnRlci0+Y291bnRlcjsKKwkgIGNvdW50ZXJzLT5GcmVlKGNvdW50ZXItPmluZGV4KTsKKyAgfSBlbHNlIHsKKwkgICpzdGF0dXMgPSBOVUxMX1BBUkFNRVRFUjsKKyAgfQorfQorCit2b2lkIHNldENvdW50ZXJBdmVyYWdlU2l6ZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3Qgc2l6ZSwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZShzaXplLCBzdGF0dXMpOworfQorCisvKioKKyAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCB1cC4KKyAqIFNldCB0aGUgdXAgY291bnRpbmcgRGlnaXRhbFNvdXJjZS4KKyAqLwordm9pZCBzZXRDb3VudGVyVXBTb3VyY2Uodm9pZCogY291bnRlcl9wb2ludGVyLCB1aW50MzJfdCBwaW4sIGJvb2wgYW5hbG9nVHJpZ2dlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKworICB1aW50OF90IG1vZHVsZTsKKworICBpZihwaW4gPj0ga051bUhlYWRlcnMpIHsKKyAgICBwaW4gPSByZW1hcE1YUENoYW5uZWwocGluKTsKKyAgICBtb2R1bGUgPSAxOworICB9IGVsc2UgeworICAgIG1vZHVsZSA9IDA7CisgIH0KKworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19VcFNvdXJjZV9Nb2R1bGUobW9kdWxlLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19VcFNvdXJjZV9DaGFubmVsKHBpbiwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcihhbmFsb2dUcmlnZ2VyLCBzdGF0dXMpOworCisgIGlmKGNvdW50ZXItPmNvdW50ZXItPnJlYWRDb25maWdfTW9kZShzdGF0dXMpID09IGtUd29QdWxzZSB8fAorCSBjb3VudGVyLT5jb3VudGVyLT5yZWFkQ29uZmlnX01vZGUoc3RhdHVzKSA9PSBrRXh0ZXJuYWxEaXJlY3Rpb24pIHsKKwlzZXRDb3VudGVyVXBTb3VyY2VFZGdlKGNvdW50ZXJfcG9pbnRlciwgdHJ1ZSwgZmFsc2UsIHN0YXR1cyk7CisgIH0KKyAgY291bnRlci0+Y291bnRlci0+c3Ryb2JlUmVzZXQoc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGVkZ2Ugc2Vuc2l0aXZpdHkgb24gYW4gdXAgY291bnRpbmcgc291cmNlLgorICogU2V0IHRoZSB1cCBzb3VyY2UgdG8gZWl0aGVyIGRldGVjdCByaXNpbmcgZWRnZXMgb3IgZmFsbGluZyBlZGdlcy4KKyAqLwordm9pZCBzZXRDb3VudGVyVXBTb3VyY2VFZGdlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19VcFJpc2luZ0VkZ2UocmlzaW5nRWRnZSwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBGYWxsaW5nRWRnZShmYWxsaW5nRWRnZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBEaXNhYmxlIHRoZSB1cCBjb3VudGluZyBzb3VyY2UgdG8gdGhlIGNvdW50ZXIuCisgKi8KK3ZvaWQgY2xlYXJDb3VudGVyVXBTb3VyY2Uodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19VcEZhbGxpbmdFZGdlKGZhbHNlLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19VcFJpc2luZ0VkZ2UoZmFsc2UsIHN0YXR1cyk7CisgIC8vIEluZGV4IDAgb2YgZGlnaXRhbCBpcyBhbHdheXMgMC4KKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBTb3VyY2VfQ2hhbm5lbCgwLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19VcFNvdXJjZV9BbmFsb2dUcmlnZ2VyKGZhbHNlLCBzdGF0dXMpOworfQorCisvKioKKyAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCBkb3duLgorICogU2V0IHRoZSBkb3duIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCisgKi8KK3ZvaWQgc2V0Q291bnRlckRvd25Tb3VyY2Uodm9pZCogY291bnRlcl9wb2ludGVyLCB1aW50MzJfdCBwaW4sIGJvb2wgYW5hbG9nVHJpZ2dlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgdW5zaWduZWQgY2hhciBtb2RlID0gY291bnRlci0+Y291bnRlci0+cmVhZENvbmZpZ19Nb2RlKHN0YXR1cyk7CisgIGlmIChtb2RlICE9IGtUd29QdWxzZSAmJiBtb2RlICE9IGtFeHRlcm5hbERpcmVjdGlvbikgeworCS8vIFRPRE86IHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJDb3VudGVyIG9ubHkgc3VwcG9ydHMgRG93blNvdXJjZSBpbiBUd29QdWxzZSBhbmQgRXh0ZXJuYWxEaXJlY3Rpb24gbW9kZXMuIik7CisJKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7CisJcmV0dXJuOworICB9CisKKyAgdWludDhfdCBtb2R1bGU7CisKKyAgaWYocGluID49IGtOdW1IZWFkZXJzKSB7CisgICAgcGluID0gcmVtYXBNWFBDaGFubmVsKHBpbik7CisgICAgbW9kdWxlID0gMTsKKyAgfSBlbHNlIHsKKyAgICBtb2R1bGUgPSAwOworICB9CisKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93blNvdXJjZV9Nb2R1bGUobW9kdWxlLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duU291cmNlX0NoYW5uZWwocGluLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duU291cmNlX0FuYWxvZ1RyaWdnZXIoYW5hbG9nVHJpZ2dlciwgc3RhdHVzKTsKKworICBzZXRDb3VudGVyRG93blNvdXJjZUVkZ2UoY291bnRlcl9wb2ludGVyLCB0cnVlLCBmYWxzZSwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+c3Ryb2JlUmVzZXQoc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGVkZ2Ugc2Vuc2l0aXZpdHkgb24gYSBkb3duIGNvdW50aW5nIHNvdXJjZS4KKyAqIFNldCB0aGUgZG93biBzb3VyY2UgdG8gZWl0aGVyIGRldGVjdCByaXNpbmcgZWRnZXMgb3IgZmFsbGluZyBlZGdlcy4KKyAqLwordm9pZCBzZXRDb3VudGVyRG93blNvdXJjZUVkZ2Uodm9pZCogY291bnRlcl9wb2ludGVyLCBib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX0Rvd25SaXNpbmdFZGdlKHJpc2luZ0VkZ2UsIHN0YXR1cyk7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX0Rvd25GYWxsaW5nRWRnZShmYWxsaW5nRWRnZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBEaXNhYmxlIHRoZSBkb3duIGNvdW50aW5nIHNvdXJjZSB0byB0aGUgY291bnRlci4KKyAqLwordm9pZCBjbGVhckNvdW50ZXJEb3duU291cmNlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93bkZhbGxpbmdFZGdlKGZhbHNlLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duUmlzaW5nRWRnZShmYWxzZSwgc3RhdHVzKTsKKyAgLy8gSW5kZXggMCBvZiBkaWdpdGFsIGlzIGFsd2F5cyAwLgorICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duU291cmNlX0NoYW5uZWwoMCwgc3RhdHVzKTsKKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKGZhbHNlLCBzdGF0dXMpOworfQorCisvKioKKyAqIFNldCBzdGFuZGFyZCB1cCAvIGRvd24gY291bnRpbmcgbW9kZSBvbiB0aGlzIGNvdW50ZXIuCisgKiBVcCBhbmQgZG93biBjb3VudHMgYXJlIHNvdXJjZWQgaW5kZXBlbmRlbnRseSBmcm9tIHR3byBpbnB1dHMuCisgKi8KK3ZvaWQgc2V0Q291bnRlclVwRG93bk1vZGUodm9pZCogY291bnRlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Nb2RlKGtUd29QdWxzZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgZXh0ZXJuYWwgZGlyZWN0aW9uIG1vZGUgb24gdGhpcyBjb3VudGVyLgorICogQ291bnRzIGFyZSBzb3VyY2VkIG9uIHRoZSBVcCBjb3VudGVyIGlucHV0LgorICogVGhlIERvd24gY291bnRlciBpbnB1dCByZXByZXNlbnRzIHRoZSBkaXJlY3Rpb24gdG8gY291bnQuCisgKi8KK3ZvaWQgc2V0Q291bnRlckV4dGVybmFsRGlyZWN0aW9uTW9kZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX01vZGUoa0V4dGVybmFsRGlyZWN0aW9uLCBzdGF0dXMpOworfQorCisvKioKKyAqIFNldCBTZW1pLXBlcmlvZCBtb2RlIG9uIHRoaXMgY291bnRlci4KKyAqIENvdW50cyB1cCBvbiBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcy4KKyAqLwordm9pZCBzZXRDb3VudGVyU2VtaVBlcmlvZE1vZGUodm9pZCogY291bnRlcl9wb2ludGVyLCBib29sIGhpZ2hTZW1pUGVyaW9kLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Nb2RlKGtTZW1pcGVyaW9kLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19VcFJpc2luZ0VkZ2UoaGlnaFNlbWlQZXJpb2QsIHN0YXR1cyk7CisgIHNldENvdW50ZXJVcGRhdGVXaGVuRW1wdHkoY291bnRlcl9wb2ludGVyLCBmYWxzZSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNvdW50ZXIgdG8gY291bnQgaW4gdXAgb3IgZG93biBiYXNlZCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBwdWxzZS4KKyAqIFRoaXMgbW9kZSBpcyBtb3N0IHVzZWZ1bCBmb3IgZGlyZWN0aW9uIHNlbnNpdGl2ZSBnZWFyIHRvb3RoIHNlbnNvcnMuCisgKiBAcGFyYW0gdGhyZXNob2xkIFRoZSBwdWxzZSBsZW5ndGggYmV5b25kIHdoaWNoIHRoZSBjb3VudGVyIGNvdW50cyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLiAgVW5pdHMgYXJlIHNlY29uZHMuCisgKi8KK3ZvaWQgc2V0Q291bnRlclB1bHNlTGVuZ3RoTW9kZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGRvdWJsZSB0aHJlc2hvbGQsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX01vZGUoa1B1bHNlTGVuZ3RoLCBzdGF0dXMpOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19QdWxzZUxlbmd0aFRocmVzaG9sZCgodWludDMyX3QpKHRocmVzaG9sZCAqIDEuMGU2KSAqIGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQsIHN0YXR1cyk7Cit9CisKKy8qKgorICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHJldHVybiBTYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBiZWluZyBhdmVyYWdlZCAoZnJvbSAxIHRvIDEyNykKKyAqLworaW50MzJfdCBnZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZSh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIHJldHVybiBjb3VudGVyLT5jb3VudGVyLT5yZWFkVGltZXJDb25maWdfQXZlcmFnZVNpemUoc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIFNhbXBsZXMgdG8gQXZlcmFnZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9mIHRoZSB0aW1lciB0bworICogYXZlcmFnZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBwZXJpb2QuIFBlcmZvcm0gYXZlcmFnaW5nIHRvIGFjY291bnQgZm9yCisgKiBtZWNoYW5pY2FsIGltcGVyZmVjdGlvbnMgb3IgYXMgb3ZlcnNhbXBsaW5nIHRvIGluY3JlYXNlIHJlc29sdXRpb24uCisgKiBAcGFyYW0gc2FtcGxlc1RvQXZlcmFnZSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXZlcmFnZSBmcm9tIDEgdG8gMTI3LgorICovCit2b2lkIHNldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50IHNhbXBsZXNUb0F2ZXJhZ2UsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGlmIChzYW1wbGVzVG9BdmVyYWdlIDwgMSB8fCBzYW1wbGVzVG9BdmVyYWdlID4gMTI3KSB7CisJKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7CisgIH0KKyAgY291bnRlci0+Y291bnRlci0+d3JpdGVUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZShzYW1wbGVzVG9BdmVyYWdlLCBzdGF0dXMpOworfQorCisvKioKKyAqIFJlc2V0IHRoZSBDb3VudGVyIHRvIHplcm8uCisgKiBTZXQgdGhlIGNvdW50ZXIgdmFsdWUgdG8gemVyby4gVGhpcyBkb2Vzbid0IGVmZmVjdCB0aGUgcnVubmluZyBzdGF0ZSBvZiB0aGUgY291bnRlciwganVzdCBzZXRzCisgKiB0aGUgY3VycmVudCB2YWx1ZSB0byB6ZXJvLgorICovCit2b2lkIHJlc2V0Q291bnRlcih2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGNvdW50ZXItPmNvdW50ZXItPnN0cm9iZVJlc2V0KHN0YXR1cyk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlLgorICogUmVhZCB0aGUgdmFsdWUgYXQgdGhpcyBpbnN0YW50LiBJdCBtYXkgc3RpbGwgYmUgcnVubmluZywgc28gaXQgcmVmbGVjdHMgdGhlIGN1cnJlbnQgdmFsdWUuIE5leHQKKyAqIHRpbWUgaXQgaXMgcmVhZCwgaXQgbWlnaHQgaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZS4KKyAqLworaW50MzJfdCBnZXRDb3VudGVyKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgaW50MzJfdCB2YWx1ZSA9IGNvdW50ZXItPmNvdW50ZXItPnJlYWRPdXRwdXRfVmFsdWUoc3RhdHVzKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKgorICogR2V0IHRoZSBQZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IGNvdW50LgorICogUmV0dXJucyB0aGUgdGltZSBpbnRlcnZhbCBvZiB0aGUgbW9zdCByZWNlbnQgY291bnQuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHZlbG9jaXR5IGNhbGN1bGF0aW9ucworICogdG8gZGV0ZXJtaW5lIHNoYWZ0IHNwZWVkLgorICogQHJldHVybnMgVGhlIHBlcmlvZCBvZiB0aGUgbGFzdCB0d28gcHVsc2VzIGluIHVuaXRzIG9mIHNlY29uZHMuCisgKi8KK2RvdWJsZSBnZXRDb3VudGVyUGVyaW9kKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgdENvdW50ZXI6OnRUaW1lck91dHB1dCBvdXRwdXQgPSBjb3VudGVyLT5jb3VudGVyLT5yZWFkVGltZXJPdXRwdXQoc3RhdHVzKTsKKyAgZG91YmxlIHBlcmlvZDsKKyAgaWYgKG91dHB1dC5TdGFsbGVkKQl7CisJLy8gUmV0dXJuIGluZmluaXR5CisJZG91YmxlIHplcm8gPSAwLjA7CisJcGVyaW9kID0gMS4wIC8gemVybzsKKyAgfSBlbHNlIHsKKwkvLyBvdXRwdXQuUGVyaW9kIGlzIGEgZml4ZWQgcG9pbnQgbnVtYmVyIHRoYXQgY291bnRzIGJ5IDIgKDI0IGJpdHMsIDI1IGludGVnZXIgYml0cykKKwlwZXJpb2QgPSAoZG91YmxlKShvdXRwdXQuUGVyaW9kIDw8IDEpIC8gKGRvdWJsZSlvdXRwdXQuQ291bnQ7CisgIH0KKyAgcmV0dXJuIHBlcmlvZCAqIDIuNWUtODsgIC8vIHJlc3VsdCAqIHRpbWViYXNlIChjdXJyZW50bHkgNDBucykKK30KKworLyoqCisgKiBTZXQgdGhlIG1heGltdW0gcGVyaW9kIHdoZXJlIHRoZSBkZXZpY2UgaXMgc3RpbGwgY29uc2lkZXJlZCAibW92aW5nIi4KKyAqIFNldHMgdGhlIG1heGltdW0gcGVyaW9kIHdoZXJlIHRoZSBkZXZpY2UgaXMgY29uc2lkZXJlZCBtb3ZpbmcuIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAqIHRoZSAic3RvcHBlZCIgc3RhdGUgb2YgdGhlIGNvdW50ZXIgdXNpbmcgdGhlIEdldFN0b3BwZWQgbWV0aG9kLgorICogQHBhcmFtIG1heFBlcmlvZCBUaGUgbWF4aW11bSBwZXJpb2Qgd2hlcmUgdGhlIGNvdW50ZWQgZGV2aWNlIGlzIGNvbnNpZGVyZWQgbW92aW5nIGluCisgKiBzZWNvbmRzLgorICovCit2b2lkIHNldENvdW50ZXJNYXhQZXJpb2Qodm9pZCogY291bnRlcl9wb2ludGVyLCBkb3VibGUgbWF4UGVyaW9kLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgQ291bnRlciogY291bnRlciA9IChDb3VudGVyKikgY291bnRlcl9wb2ludGVyOworICBjb3VudGVyLT5jb3VudGVyLT53cml0ZVRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKCh1aW50MzJfdCkobWF4UGVyaW9kICogNC4wZTgpLCBzdGF0dXMpOworfQorCisvKioKKyAqIFNlbGVjdCB3aGV0aGVyIHlvdSB3YW50IHRvIGNvbnRpbnVlIHVwZGF0aW5nIHRoZSBldmVudCB0aW1lciBvdXRwdXQgd2hlbiB0aGVyZSBhcmUgbm8gc2FtcGxlcyBjYXB0dXJlZC4KKyAqIFRoZSBvdXRwdXQgb2YgdGhlIGV2ZW50IHRpbWVyIGhhcyBhIGJ1ZmZlciBvZiBwZXJpb2RzIHRoYXQgYXJlIGF2ZXJhZ2VkIGFuZCBwb3N0ZWQgdG8KKyAqIGEgcmVnaXN0ZXIgb24gdGhlIEZQR0EuICBXaGVuIHRoZSB0aW1lciBkZXRlY3RzIHRoYXQgdGhlIGV2ZW50IHNvdXJjZSBoYXMgc3RvcHBlZAorICogKGJhc2VkIG9uIHRoZSBNYXhQZXJpb2QpIHRoZSBidWZmZXIgb2Ygc2FtcGxlcyB0byBiZSBhdmVyYWdlZCBpcyBlbXB0aWVkLiAgSWYgeW91CisgKiBlbmFibGUgdGhlIHVwZGF0ZSB3aGVuIGVtcHR5LCB5b3Ugd2lsbCBiZSBub3RpZmllZCBvZiB0aGUgc3RvcHBlZCBzb3VyY2UgYW5kIHRoZSBldmVudAorICogdGltZSB3aWxsIHJlcG9ydCAwIHNhbXBsZXMuICBJZiB5b3UgZGlzYWJsZSB1cGRhdGUgd2hlbiBlbXB0eSwgdGhlIG1vc3QgcmVjZW50IGF2ZXJhZ2UKKyAqIHdpbGwgcmVtYWluIG9uIHRoZSBvdXRwdXQgdW50aWwgYSBuZXcgc2FtcGxlIGlzIGFjcXVpcmVkLiAgWW91IHdpbGwgbmV2ZXIgc2VlIDAgc2FtcGxlcworICogb3V0cHV0IChleGNlcHQgd2hlbiB0aGVyZSBoYXZlIGJlZW4gbm8gZXZlbnRzIHNpbmNlIGFuIEZQR0EgcmVzZXQpIGFuZCB5b3Ugd2lsbCBsaWtlbHkgbm90CisgKiBzZWUgdGhlIHN0b3BwZWQgYml0IGJlY29tZSB0cnVlIChzaW5jZSBpdCBpcyB1cGRhdGVkIGF0IHRoZSBlbmQgb2YgYW4gYXZlcmFnZSBhbmQgdGhlcmUgYXJlCisgKiBubyBzYW1wbGVzIHRvIGF2ZXJhZ2UpLgorICovCit2b2lkIHNldENvdW50ZXJVcGRhdGVXaGVuRW1wdHkodm9pZCogY291bnRlcl9wb2ludGVyLCBib29sIGVuYWJsZWQsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGNvdW50ZXItPmNvdW50ZXItPndyaXRlVGltZXJDb25maWdfVXBkYXRlV2hlbkVtcHR5KGVuYWJsZWQsIHN0YXR1cyk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBjbG9jayBpcyBzdG9wcGVkLgorICogRGV0ZXJtaW5lIGlmIHRoZSBjbG9ja2VkIGlucHV0IGlzIHN0b3BwZWQgYmFzZWQgb24gdGhlIE1heFBlcmlvZCB2YWx1ZSBzZXQgdXNpbmcgdGhlCisgKiBTZXRNYXhQZXJpb2QgbWV0aG9kLiBJZiB0aGUgY2xvY2sgZXhjZWVkcyB0aGUgTWF4UGVyaW9kLCB0aGVuIHRoZSBkZXZpY2UgKGFuZCBjb3VudGVyKSBhcmUKKyAqIGFzc3VtZWQgdG8gYmUgc3RvcHBlZCBhbmQgaXQgcmV0dXJucyB0cnVlLgorICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vc3QgcmVjZW50IGNvdW50ZXIgcGVyaW9kIGV4Y2VlZHMgdGhlIE1heFBlcmlvZCB2YWx1ZSBzZXQgYnkKKyAqIFNldE1heFBlcmlvZC4KKyAqLworYm9vbCBnZXRDb3VudGVyU3RvcHBlZCh2b2lkKiBjb3VudGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIHJldHVybiBjb3VudGVyLT5jb3VudGVyLT5yZWFkVGltZXJPdXRwdXRfU3RhbGxlZChzdGF0dXMpOworfQorCisvKioKKyAqIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgY291bnRlciB2YWx1ZSBjaGFuZ2VkLgorICogQHJldHVybiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGNvdW50ZXIgdmFsdWUgY2hhbmdlZC4KKyAqLworYm9vbCBnZXRDb3VudGVyRGlyZWN0aW9uKHZvaWQqIGNvdW50ZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIENvdW50ZXIqIGNvdW50ZXIgPSAoQ291bnRlciopIGNvdW50ZXJfcG9pbnRlcjsKKyAgYm9vbCB2YWx1ZSA9IGNvdW50ZXItPmNvdW50ZXItPnJlYWRPdXRwdXRfRGlyZWN0aW9uKHN0YXR1cyk7CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBTZXQgdGhlIENvdW50ZXIgdG8gcmV0dXJuIHJldmVyc2VkIHNlbnNpbmcgb24gdGhlIGRpcmVjdGlvbi4KKyAqIFRoaXMgYWxsb3dzIGNvdW50ZXJzIHRvIGNoYW5nZSB0aGUgZGlyZWN0aW9uIHRoZXkgYXJlIGNvdW50aW5nIGluIHRoZSBjYXNlIG9mIDFYIGFuZCAyWAorICogcXVhZHJhdHVyZSBlbmNvZGluZyBvbmx5LiBBbnkgb3RoZXIgY291bnRlciBtb2RlIGlzbid0IHN1cHBvcnRlZC4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHRydWUgaWYgdGhlIHZhbHVlIGNvdW50ZWQgc2hvdWxkIGJlIG5lZ2F0ZWQuCisgKi8KK3ZvaWQgc2V0Q291bnRlclJldmVyc2VEaXJlY3Rpb24odm9pZCogY291bnRlcl9wb2ludGVyLCBib29sIHJldmVyc2VEaXJlY3Rpb24sIGludDMyX3QgKnN0YXR1cykgeworICBDb3VudGVyKiBjb3VudGVyID0gKENvdW50ZXIqKSBjb3VudGVyX3BvaW50ZXI7CisgIGlmIChjb3VudGVyLT5jb3VudGVyLT5yZWFkQ29uZmlnX01vZGUoc3RhdHVzKSA9PSBrRXh0ZXJuYWxEaXJlY3Rpb24pIHsKKwlpZiAocmV2ZXJzZURpcmVjdGlvbikKKwkgIHNldENvdW50ZXJEb3duU291cmNlRWRnZShjb3VudGVyX3BvaW50ZXIsIHRydWUsIHRydWUsIHN0YXR1cyk7CisJZWxzZQorCSAgc2V0Q291bnRlckRvd25Tb3VyY2VFZGdlKGNvdW50ZXJfcG9pbnRlciwgZmFsc2UsIHRydWUsIHN0YXR1cyk7CisgIH0KK30KKworc3RydWN0IGVuY29kZXJfdCB7CisgIHRFbmNvZGVyKiBlbmNvZGVyOworICB1aW50MzJfdCBpbmRleDsKK307Cit0eXBlZGVmIHN0cnVjdCBlbmNvZGVyX3QgRW5jb2RlcjsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBERUNPRElOR19TQ0FMSU5HX0ZBQ1RPUiA9IDAuMjU7CitzdGF0aWMgUmVzb3VyY2UgKnF1YWRFbmNvZGVycyA9IE5VTEw7CisKK3ZvaWQqIGluaXRpYWxpemVFbmNvZGVyKHVpbnQ4X3QgcG9ydF9hX21vZHVsZSwgdWludDMyX3QgcG9ydF9hX3BpbiwgYm9vbCBwb3J0X2FfYW5hbG9nX3RyaWdnZXIsCisJCQkJCQl1aW50OF90IHBvcnRfYl9tb2R1bGUsIHVpbnQzMl90IHBvcnRfYl9waW4sIGJvb2wgcG9ydF9iX2FuYWxvZ190cmlnZ2VyLAorCQkJCQkJYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBpbnQzMl90ICppbmRleCwgaW50MzJfdCAqc3RhdHVzKSB7CisKKyAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIHN0cnVjdHVyZQorICBFbmNvZGVyKiBlbmNvZGVyID0gbmV3IEVuY29kZXIoKTsKKworICBpZihwb3J0X2FfcGluID49IGtOdW1IZWFkZXJzKSB7CisgICAgcG9ydF9hX3BpbiA9IHJlbWFwTVhQQ2hhbm5lbChwb3J0X2FfcGluKTsKKyAgICBwb3J0X2FfbW9kdWxlID0gMTsKKyAgfQorCisgIGlmKHBvcnRfYl9waW4gPj0ga051bUhlYWRlcnMpIHsKKyAgICBwb3J0X2JfcGluID0gcmVtYXBNWFBDaGFubmVsKHBvcnRfYl9waW4pOworICAgIHBvcnRfYl9tb2R1bGUgPSAxOworICB9CisKKyAgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZxdWFkRW5jb2RlcnMsIHRFbmNvZGVyOjprTnVtU3lzdGVtcyk7CisgIGVuY29kZXItPmluZGV4ID0gcXVhZEVuY29kZXJzLT5BbGxvY2F0ZSgiNFggRW5jb2RlciIpOworICAqaW5kZXggPSBlbmNvZGVyLT5pbmRleDsKKyAgLy8gVE9ETzogaWYgKGluZGV4ID09IH4wdWwpIHsgQ2xvbmVFcnJvcihxdWFkRW5jb2RlcnMpOyByZXR1cm47IH0KKyAgZW5jb2Rlci0+ZW5jb2RlciA9IHRFbmNvZGVyOjpjcmVhdGUoZW5jb2Rlci0+aW5kZXgsIHN0YXR1cyk7CisgIGVuY29kZXItPmVuY29kZXItPndyaXRlQ29uZmlnX0FTb3VyY2VfTW9kdWxlKHBvcnRfYV9tb2R1bGUsIHN0YXR1cyk7CisgIGVuY29kZXItPmVuY29kZXItPndyaXRlQ29uZmlnX0FTb3VyY2VfQ2hhbm5lbChwb3J0X2FfcGluLCBzdGF0dXMpOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19BU291cmNlX0FuYWxvZ1RyaWdnZXIocG9ydF9hX2FuYWxvZ190cmlnZ2VyLCBzdGF0dXMpOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19CU291cmNlX01vZHVsZShwb3J0X2JfbW9kdWxlLCBzdGF0dXMpOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19CU291cmNlX0NoYW5uZWwocG9ydF9iX3Bpbiwgc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfQlNvdXJjZV9BbmFsb2dUcmlnZ2VyKHBvcnRfYl9hbmFsb2dfdHJpZ2dlciwgc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+c3Ryb2JlUmVzZXQoc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfUmV2ZXJzZShyZXZlcnNlRGlyZWN0aW9uLCBzdGF0dXMpOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKDQsIHN0YXR1cyk7CisKKyAgcmV0dXJuIGVuY29kZXI7Cit9CisKK3ZvaWQgZnJlZUVuY29kZXIodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRW5jb2RlciogZW5jb2RlciA9IChFbmNvZGVyKikgZW5jb2Rlcl9wb2ludGVyOworICBxdWFkRW5jb2RlcnMtPkZyZWUoZW5jb2Rlci0+aW5kZXgpOworICBkZWxldGUgZW5jb2Rlci0+ZW5jb2RlcjsKK30KKworLyoqCisgKiBSZXNldCB0aGUgRW5jb2RlciBkaXN0YW5jZSB0byB6ZXJvLgorICogUmVzZXRzIHRoZSBjdXJyZW50IGNvdW50IHRvIHplcm8gb24gdGhlIGVuY29kZXIuCisgKi8KK3ZvaWQgcmVzZXRFbmNvZGVyKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEVuY29kZXIqIGVuY29kZXIgPSAoRW5jb2RlciopIGVuY29kZXJfcG9pbnRlcjsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+c3Ryb2JlUmVzZXQoc3RhdHVzKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSByYXcgdmFsdWUgZnJvbSB0aGUgZW5jb2Rlci4KKyAqIFRoZSByYXcgdmFsdWUgaXMgdGhlIGFjdHVhbCBjb3VudCB1bnNjYWxlZCBieSB0aGUgMXgsIDJ4LCBvciA0eCBzY2FsZQorICogZmFjdG9yLgorICogQHJldHVybiBDdXJyZW50IHJhdyBjb3VudCBmcm9tIHRoZSBlbmNvZGVyCisgKi8KK2ludDMyX3QgZ2V0RW5jb2Rlcih2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIHJldHVybiBlbmNvZGVyLT5lbmNvZGVyLT5yZWFkT3V0cHV0X1ZhbHVlKHN0YXR1cyk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgcGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBwdWxzZS4KKyAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgRW5jb2RlciBwdWxzZSBpbiBzZWNvbmRzLgorICogVGhpcyBtZXRob2QgY29tcGVuc3RhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgR2V0UmF0ZSgpIGluIGZhdm9yIG9mIHRoaXMgbWV0aG9kLiAgVGhpcyByZXR1cm5zIHVuc2NhbGVkIHBlcmlvZHMgYW5kIEdldFJhdGUoKSBzY2FsZXMgdXNpbmcgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCisgKgorICogQHJldHVybiBQZXJpb2QgaW4gc2Vjb25kcyBvZiB0aGUgbW9zdCByZWNlbnQgcHVsc2UuCisgKi8KK2RvdWJsZSBnZXRFbmNvZGVyUGVyaW9kKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEVuY29kZXIqIGVuY29kZXIgPSAoRW5jb2RlciopIGVuY29kZXJfcG9pbnRlcjsKKyAgdEVuY29kZXI6OnRUaW1lck91dHB1dCBvdXRwdXQgPSBlbmNvZGVyLT5lbmNvZGVyLT5yZWFkVGltZXJPdXRwdXQoc3RhdHVzKTsKKyAgZG91YmxlIHZhbHVlOworICBpZiAob3V0cHV0LlN0YWxsZWQpIHsKKwkvLyBSZXR1cm4gaW5maW5pdHkKKwlkb3VibGUgemVybyA9IDAuMDsKKwl2YWx1ZSA9IDEuMCAvIHplcm87CisgIH0gZWxzZSB7CisJLy8gb3V0cHV0LlBlcmlvZCBpcyBhIGZpeGVkIHBvaW50IG51bWJlciB0aGF0IGNvdW50cyBieSAyICgyNCBiaXRzLCAyNSBpbnRlZ2VyIGJpdHMpCisJdmFsdWUgPSAoZG91YmxlKShvdXRwdXQuUGVyaW9kIDw8IDEpIC8gKGRvdWJsZSlvdXRwdXQuQ291bnQ7CisgIH0KKyAgZG91YmxlIG1lYXN1cmVkUGVyaW9kID0gdmFsdWUgKiAyLjVlLTg7CisgIHJldHVybiBtZWFzdXJlZFBlcmlvZCAvIERFQ09ESU5HX1NDQUxJTkdfRkFDVE9SOworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gcGVyaW9kIGZvciBzdG9wcGVkIGRldGVjdGlvbi4KKyAqIFNldHMgdGhlIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBwZXJpb2Qgb2YgdGhlIEVuY29kZXIgYmVmb3JlIGl0IHdpbGwgYXNzdW1lCisgKiB0aGF0IHRoZSBhdHRhY2hlZCBkZXZpY2UgaXMgc3RvcHBlZC4gVGhpcyB0aW1lb3V0IGFsbG93cyB1c2VycyB0byBkZXRlcm1pbmUgaWYgdGhlIHdoZWVscyBvcgorICogb3RoZXIgc2hhZnQgaGFzIHN0b3BwZWQgcm90YXRpbmcuCisgKiBUaGlzIG1ldGhvZCBjb21wZW5zYXRlcyBmb3IgdGhlIGRlY29kaW5nIHR5cGUuCisgKgorICogQGRlcHJlY2F0ZWQgVXNlIFNldE1pblJhdGUoKSBpbiBmYXZvciBvZiB0aGlzIG1ldGhvZC4gIFRoaXMgdGFrZXMgdW5zY2FsZWQgcGVyaW9kcyBhbmQgU2V0TWluUmF0ZSgpIHNjYWxlcyB1c2luZyB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqCisgKiBAcGFyYW0gbWF4UGVyaW9kIFRoZSBtYXhpbXVtIHRpbWUgYmV0d2VlbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYmVmb3JlIHRoZSBGUEdBIHdpbGwKKyAqIHJlcG9ydCB0aGUgZGV2aWNlIHN0b3BwZWQuIFRoaXMgaXMgZXhwcmVzc2VkIGluIHNlY29uZHMuCisgKi8KK3ZvaWQgc2V0RW5jb2Rlck1heFBlcmlvZCh2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGRvdWJsZSBtYXhQZXJpb2QsIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIGVuY29kZXItPmVuY29kZXItPndyaXRlVGltZXJDb25maWdfU3RhbGxQZXJpb2QoKHVpbnQzMl90KShtYXhQZXJpb2QgKiA0LjBlOCAqIERFQ09ESU5HX1NDQUxJTkdfRkFDVE9SKSwgc3RhdHVzKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGVuY29kZXIgaXMgc3RvcHBlZC4KKyAqIFVzaW5nIHRoZSBNYXhQZXJpb2QgdmFsdWUsIGEgYm9vbGVhbiBpcyByZXR1cm5lZCB0aGF0IGlzIHRydWUgaWYgdGhlIGVuY29kZXIgaXMgY29uc2lkZXJlZAorICogc3RvcHBlZCBhbmQgZmFsc2UgaWYgaXQgaXMgc3RpbGwgbW92aW5nLiBBIHN0b3BwZWQgZW5jb2RlciBpcyBvbmUgd2hlcmUgdGhlIG1vc3QgcmVjZW50IHB1bHNlCisgKiB3aWR0aCBleGNlZWRzIHRoZSBNYXhQZXJpb2QuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVuY29kZXIgaXMgY29uc2lkZXJlZCBzdG9wcGVkLgorICovCitib29sIGdldEVuY29kZXJTdG9wcGVkKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEVuY29kZXIqIGVuY29kZXIgPSAoRW5jb2RlciopIGVuY29kZXJfcG9pbnRlcjsKKyAgcmV0dXJuIGVuY29kZXItPmVuY29kZXItPnJlYWRUaW1lck91dHB1dF9TdGFsbGVkKHN0YXR1cykgIT0gMDsKK30KKworLyoqCisgKiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGVuY29kZXIgdmFsdWUgY2hhbmdlZC4KKyAqIEByZXR1cm4gVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBlbmNvZGVyIHZhbHVlIGNoYW5nZWQuCisgKi8KK2Jvb2wgZ2V0RW5jb2RlckRpcmVjdGlvbih2b2lkKiBlbmNvZGVyX3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIHJldHVybiBlbmNvZGVyLT5lbmNvZGVyLT5yZWFkT3V0cHV0X0RpcmVjdGlvbihzdGF0dXMpOworfQorCisvKioKKyAqIFNldCB0aGUgZGlyZWN0aW9uIHNlbnNpbmcgZm9yIHRoaXMgZW5jb2Rlci4KKyAqIFRoaXMgc2V0cyB0aGUgZGlyZWN0aW9uIHNlbnNpbmcgb24gdGhlIGVuY29kZXIgc28gdGhhdCBpdCBjb3VsZCBjb3VudCBpbiB0aGUgY29ycmVjdAorICogc29mdHdhcmUgZGlyZWN0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vdW50aW5nLgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gdHJ1ZSBpZiB0aGUgZW5jb2RlciBkaXJlY3Rpb24gc2hvdWxkIGJlIHJldmVyc2VkCisgKi8KK3ZvaWQgc2V0RW5jb2RlclJldmVyc2VEaXJlY3Rpb24odm9pZCogZW5jb2Rlcl9wb2ludGVyLCBib29sIHJldmVyc2VEaXJlY3Rpb24sIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIGVuY29kZXItPmVuY29kZXItPndyaXRlQ29uZmlnX1JldmVyc2UocmV2ZXJzZURpcmVjdGlvbiwgc3RhdHVzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIFNhbXBsZXMgdG8gQXZlcmFnZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9mIHRoZSB0aW1lciB0bworICogYXZlcmFnZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBwZXJpb2QuIFBlcmZvcm0gYXZlcmFnaW5nIHRvIGFjY291bnQgZm9yCisgKiBtZWNoYW5pY2FsIGltcGVyZmVjdGlvbnMgb3IgYXMgb3ZlcnNhbXBsaW5nIHRvIGluY3JlYXNlIHJlc29sdXRpb24uCisgKiBAcGFyYW0gc2FtcGxlc1RvQXZlcmFnZSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXZlcmFnZSBmcm9tIDEgdG8gMTI3LgorICovCit2b2lkIHNldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKHZvaWQqIGVuY29kZXJfcG9pbnRlciwgdWludDMyX3Qgc2FtcGxlc1RvQXZlcmFnZSwgaW50MzJfdCAqc3RhdHVzKSB7CisgIEVuY29kZXIqIGVuY29kZXIgPSAoRW5jb2RlciopIGVuY29kZXJfcG9pbnRlcjsKKyAgaWYgKHNhbXBsZXNUb0F2ZXJhZ2UgPCAxIHx8IHNhbXBsZXNUb0F2ZXJhZ2UgPiAxMjcpIHsKKwkqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKKyAgfQorICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHNhbXBsZXNUb0F2ZXJhZ2UsIHN0YXR1cyk7Cit9CisKKy8qKgorICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHJldHVybiBTYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBiZWluZyBhdmVyYWdlZCAoZnJvbSAxIHRvIDEyNykKKyAqLwordWludDMyX3QgZ2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2Uodm9pZCogZW5jb2Rlcl9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKyAgRW5jb2RlciogZW5jb2RlciA9IChFbmNvZGVyKikgZW5jb2Rlcl9wb2ludGVyOworICByZXR1cm4gZW5jb2Rlci0+ZW5jb2Rlci0+cmVhZFRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHN0YXR1cyk7Cit9CisKKy8qKgorICogU2V0IGFuIGluZGV4IHNvdXJjZSBmb3IgYW4gZW5jb2Rlciwgd2hpY2ggaXMgYW4gaW5wdXQgdGhhdCByZXNldHMgdGhlCisgKiBlbmNvZGVyJ3MgY291bnQuCisgKi8KK3ZvaWQgc2V0RW5jb2RlckluZGV4U291cmNlKHZvaWQgKmVuY29kZXJfcG9pbnRlciwgdWludDMyX3QgcGluLCBib29sIGFuYWxvZ1RyaWdnZXIsIGJvb2wgYWN0aXZlSGlnaCwKKyAgICBib29sIGVkZ2VTZW5zaXRpdmUsIGludDMyX3QgKnN0YXR1cykgeworICBFbmNvZGVyKiBlbmNvZGVyID0gKEVuY29kZXIqKSBlbmNvZGVyX3BvaW50ZXI7CisgIGVuY29kZXItPmVuY29kZXItPndyaXRlQ29uZmlnX0luZGV4U291cmNlX0NoYW5uZWwoKHVuc2lnbmVkIGNoYXIpcGluLCBzdGF0dXMpOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUoKHVuc2lnbmVkIGNoYXIpMCwgc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlcihhbmFsb2dUcmlnZ2VyLCBzdGF0dXMpOworICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19JbmRleEFjdGl2ZUhpZ2goYWN0aXZlSGlnaCwgc3RhdHVzKTsKKyAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfSW5kZXhFZGdlU2Vuc2l0aXZlKGVkZ2VTZW5zaXRpdmUsIHN0YXR1cyk7Cit9CisKKy8qKgorICogR2V0IHRoZSBsb29wIHRpbWluZyBvZiB0aGUgUFdNIHN5c3RlbQorICoKKyAqIEByZXR1cm4gVGhlIGxvb3AgdGltZQorICovCit1aW50MTZfdCBnZXRMb29wVGltaW5nKGludDMyX3QgKnN0YXR1cykgeworICByZXR1cm4gcHdtU3lzdGVtLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc3BpIHBvcnQuIE9wZW5zIHRoZSBwb3J0IGlmIG5lY2Vzc2FyeSBhbmQgc2F2ZXMgdGhlIGhhbmRsZS4KKyAqIElmIG9wZW5pbmcgdGhlIE1YUCBwb3J0LCBhbHNvIHNldHMgdXAgdGhlIHBpbiBmdW5jdGlvbnMgYXBwcm9wcmlhdGVseQorICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKKyAqLwordm9pZCBzcGlJbml0aWFsaXplKHVpbnQ4X3QgcG9ydCwgaW50MzJfdCAqc3RhdHVzKSB7CisJaWYoc3BpU3lzdGVtID09IE5VTEwpCisJCXNwaVN5c3RlbSA9IHRTUEk6OmNyZWF0ZShzdGF0dXMpOworCWlmKHNwaUdldEhhbmRsZShwb3J0KSAhPTAgKSByZXR1cm47CisJc3dpdGNoKHBvcnQpeworCWNhc2UgMDoKKwkJc3BpU2V0SGFuZGxlKDAsIHNwaWxpYl9vcGVuKCIvZGV2L3NwaWRldjAuMCIpKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzcGlTZXRIYW5kbGUoMSwgc3BpbGliX29wZW4oIi9kZXYvc3BpZGV2MC4xIikpOworCQlicmVhazsKKwljYXNlIDI6CisJCXNwaVNldEhhbmRsZSgyLCBzcGlsaWJfb3BlbigiL2Rldi9zcGlkZXYwLjIiKSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc3BpU2V0SGFuZGxlKDMsIHNwaWxpYl9vcGVuKCIvZGV2L3NwaWRldjAuMyIpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpbml0aWFsaXplRGlnaXRhbChzdGF0dXMpOworCQlpZighYWxsb2NhdGVESU8oZ2V0UG9ydCgxNCksIGZhbHNlLCBzdGF0dXMpKXtwcmludGYoIkZhaWxlZCB0byBhbGxvY2F0ZSBESU8gMTRcbiIpOyByZXR1cm47fQorCQlpZighYWxsb2NhdGVESU8oZ2V0UG9ydCgxNSksIGZhbHNlLCBzdGF0dXMpKSB7cHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgRElPIDE1XG4iKTsgcmV0dXJuO30KKwkJaWYoIWFsbG9jYXRlRElPKGdldFBvcnQoMTYpLCB0cnVlLCBzdGF0dXMpKSB7cHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgRElPIDE2XG4iKTsgcmV0dXJuO30KKwkJaWYoIWFsbG9jYXRlRElPKGdldFBvcnQoMTcpLCBmYWxzZSwgc3RhdHVzKSkge3ByaW50ZigiRmFpbGVkIHRvIGFsbG9jYXRlIERJTyAxN1xuIik7IHJldHVybjt9CisJCWRpZ2l0YWxTeXN0ZW0tPndyaXRlRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3RhdHVzKXwweDAwRjAsIHN0YXR1cyk7CisJCXNwaVNldEhhbmRsZSg0LCBzcGlsaWJfb3BlbigiL2Rldi9zcGlkZXYxLjAiKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogR2VuZXJpYyB0cmFuc2FjdGlvbi4KKyAqCisgKiBUaGlzIGlzIGEgbG93ZXItbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBzcGkgaGFyZHdhcmUgZ2l2aW5nIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBlYWNoIHRyYW5zYWN0aW9uLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKiBAcGFyYW0gZGF0YVRvU2VuZCBCdWZmZXIgb2YgZGF0YSB0byBzZW5kIGFzIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgorICogQHBhcmFtIGRhdGFSZWNlaXZlZCBCdWZmZXIgdG8gcmVhZCBkYXRhIGludG8uCisgKiBAcGFyYW0gc2l6ZSBOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuIFswLi43XQorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIC0xIGZvciBlcnJvcgorICovCitpbnQzMl90IHNwaVRyYW5zYWN0aW9uKHVpbnQ4X3QgcG9ydCwgdWludDhfdCAqZGF0YVRvU2VuZCwgdWludDhfdCAqZGF0YVJlY2VpdmVkLCB1aW50OF90IHNpemUpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHNwaUdldFNlbWFwaG9yZShwb3J0KSk7CisJcmV0dXJuIHNwaWxpYl93cml0ZXJlYWQoc3BpR2V0SGFuZGxlKHBvcnQpLCAoY29uc3QgY2hhciopIGRhdGFUb1NlbmQsIChjaGFyKikgZGF0YVJlY2VpdmVkLCAoaW50MzJfdCkgc2l6ZSk7Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIHdyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBXcml0ZSB0byBhIGRldmljZSBhbmQgd2FpdCB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCisgKgorICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKKyAqIEBwYXJhbSBkYXRUb1NlbmQgVGhlIGRhdGEgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVyIG9uIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gc2VuZFNpemUgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gLTEgZm9yIGFuIGVycm9yCisgKi8KK2ludDMyX3Qgc3BpV3JpdGUodWludDhfdCBwb3J0LCB1aW50OF90KiBkYXRhVG9TZW5kLCB1aW50OF90IHNlbmRTaXplKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhzcGlHZXRTZW1hcGhvcmUocG9ydCkpOworCXJldHVybiBzcGlsaWJfd3JpdGUoc3BpR2V0SGFuZGxlKHBvcnQpLCAoY29uc3QgY2hhciopIGRhdGFUb1NlbmQsIChpbnQzMl90KSBzZW5kU2l6ZSk7Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIHJlYWQgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqICAgVGhpcyBtZXRoZG9kIGRvZXMgbm90IHdyaXRlIGFueSBkYXRhIG91dCB0byB0aGUgZGV2aWNlCisgKiAgIE1vc3Qgc3BpIGRldmljZXMgd2lsbCByZXF1aXJlIGEgcmVnaXN0ZXIgYWRkcmVzcyB0byBiZSB3cml0dGVuIGJlZm9yZQorICogICB0aGV5IGJlZ2luIHJldHVybmluZyBkYXRhCisgKgorICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKKyAqIEBwYXJhbSBidWZmZXIgQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgZGF0YSByZWFkIGZyb20gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhlIHRyYW5zYWN0aW9uLiBbMS4uN10KKyAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIC0xIGZvciBlcnJvci4KKyAqLworaW50MzJfdCBzcGlSZWFkKHVpbnQ4X3QgcG9ydCwgdWludDhfdCAqYnVmZmVyLCB1aW50OF90IGNvdW50KQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhzcGlHZXRTZW1hcGhvcmUocG9ydCkpOworCXJldHVybiBzcGlsaWJfcmVhZChzcGlHZXRIYW5kbGUocG9ydCksIChjaGFyKikgYnVmZmVyLCAoaW50MzJfdCkgY291bnQpOworfQorCisvKioKKyAqIENsb3NlIHRoZSBTUEkgcG9ydAorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKi8KK3ZvaWQgc3BpQ2xvc2UodWludDhfdCBwb3J0KSB7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHNwaUdldFNlbWFwaG9yZShwb3J0KSk7CisJc3BpbGliX2Nsb3NlKHNwaUdldEhhbmRsZShwb3J0KSk7CisJc3BpU2V0SGFuZGxlKHBvcnQsIDApOworCXJldHVybjsKK30KKworLyoqCisgKiBTZXQgdGhlIGNsb2NrIHNwZWVkIGZvciB0aGUgU1BJIGJ1cy4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yIE1YUAorICogQHBhcmFtIHNwZWVkIFRoZSBzcGVlZCBpbiBIeiAoMC0xTUh6KQorICovCit2b2lkIHNwaVNldFNwZWVkKHVpbnQ4X3QgcG9ydCwgdWludDMyX3Qgc3BlZWQpIHsKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoc3BpR2V0U2VtYXBob3JlKHBvcnQpKTsKKwlzcGlsaWJfc2V0c3BlZWQoc3BpR2V0SGFuZGxlKHBvcnQpLCBzcGVlZCk7Cit9CisKKy8qKgorICogU2V0IHRoZSBTUEkgb3B0aW9ucworICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKiBAcGFyYW0gbXNiX2ZpcnN0IFRydWUgdG8gd3JpdGUgdGhlIE1TQiBmaXJzdCwgRmFsc2UgZm9yIExTQiBmaXJzdAorICogQHBhcmFtIHNhbXBsZV9vbl90cmFpbGluZyBUcnVlIHRvIHNhbXBsZSBvbiB0aGUgdHJhaWxpbmcgZWRnZSwgRmFsc2UgdG8gc2FtcGxlIG9uIHRoZSBsZWFkaW5nIGVkZ2UKKyAqIEBwYXJhbSBjbGtfaWRsZV9oaWdoIFRydWUgdG8gc2V0IHRoZSBjbG9jayB0byBhY3RpdmUgbG93LCBGYWxzZSB0byBzZXQgdGhlIGNsb2NrIGFjdGl2ZSBoaWdoCisgKi8KK3ZvaWQgc3BpU2V0T3B0cyh1aW50OF90IHBvcnQsIGludCBtc2JfZmlyc3QsIGludCBzYW1wbGVfb25fdHJhaWxpbmcsIGludCBjbGtfaWRsZV9oaWdoKSB7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHNwaUdldFNlbWFwaG9yZShwb3J0KSk7CisJc3BpbGliX3NldG9wdHMoc3BpR2V0SGFuZGxlKHBvcnQpLCBtc2JfZmlyc3QsIHNhbXBsZV9vbl90cmFpbGluZywgY2xrX2lkbGVfaGlnaCk7Cit9CisKKy8qKgorICogU2V0IHRoZSBDUyBBY3RpdmUgaGlnaCBmb3IgYSBTUEkgcG9ydAorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCisgKi8KK3ZvaWQgc3BpU2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2godWludDhfdCBwb3J0LCBpbnQzMl90ICpzdGF0dXMpeworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhzcGlHZXRTZW1hcGhvcmUocG9ydCkpOworCWlmKHBvcnQgPCA0KQorCXsKKwkJc3BpU3lzdGVtLT53cml0ZUNoaXBTZWxlY3RBY3RpdmVIaWdoX0hkcihzcGlTeXN0ZW0tPnJlYWRDaGlwU2VsZWN0QWN0aXZlSGlnaF9IZHIoc3RhdHVzKSB8ICgxPDxwb3J0KSwgc3RhdHVzKTsKKwl9CisJZWxzZQorCXsKKwkJc3BpU3lzdGVtLT53cml0ZUNoaXBTZWxlY3RBY3RpdmVIaWdoX01YUCgxLCBzdGF0dXMpOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIENTIEFjdGl2ZSBsb3cgZm9yIGEgU1BJIHBvcnQKKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yIE1YUAorICovCit2b2lkIHNwaVNldENoaXBTZWxlY3RBY3RpdmVMb3codWludDhfdCBwb3J0LCBpbnQzMl90ICpzdGF0dXMpeworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhzcGlHZXRTZW1hcGhvcmUocG9ydCkpOworCWlmKHBvcnQgPCA0KQorCXsKKwkJc3BpU3lzdGVtLT53cml0ZUNoaXBTZWxlY3RBY3RpdmVIaWdoX0hkcihzcGlTeXN0ZW0tPnJlYWRDaGlwU2VsZWN0QWN0aXZlSGlnaF9IZHIoc3RhdHVzKSAmIH4oMTw8cG9ydCksIHN0YXR1cyk7CisJfQorCWVsc2UKKwl7CisJCXNwaVN5c3RlbS0+d3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaF9NWFAoMCwgc3RhdHVzKTsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSBzdG9yZWQgaGFuZGxlIGZvciBhIFNQSSBwb3J0CisgKgorICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKKyAqIEByZXR1cm4gVGhlIHN0b3JlZCBoYW5kbGUgZm9yIHRoZSBTUEkgcG9ydC4gMCByZXByZXNlbnRzIG5vIHN0b3JlZCBoYW5kbGUuCisgKi8KK2ludDMyX3Qgc3BpR2V0SGFuZGxlKHVpbnQ4X3QgcG9ydCl7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHNwaUdldFNlbWFwaG9yZShwb3J0KSk7CisJc3dpdGNoKHBvcnQpeworCWNhc2UgMDoKKwkJcmV0dXJuIG1fc3BpQ1MwSGFuZGxlOworCWNhc2UgMToKKwkJcmV0dXJuIG1fc3BpQ1MxSGFuZGxlOworCWNhc2UgMjoKKwkJcmV0dXJuIG1fc3BpQ1MySGFuZGxlOworCWNhc2UgMzoKKwkJcmV0dXJuIG1fc3BpQ1MzSGFuZGxlOworCWNhc2UgNDoKKwkJcmV0dXJuIG1fc3BpTVhQSGFuZGxlOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIHN0b3JlZCBoYW5kbGUgZm9yIGEgU1BJIHBvcnQKKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yIE1YUC4KKyAqIEBwYXJhbSBoYW5kbGUgVGhlIHZhbHVlIG9mIHRoZSBoYW5kbGUgZm9yIHRoZSBwb3J0LgorICovCit2b2lkIHNwaVNldEhhbmRsZSh1aW50OF90IHBvcnQsIGludDMyX3QgaGFuZGxlKXsKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMoc3BpR2V0U2VtYXBob3JlKHBvcnQpKTsKKwlzd2l0Y2gocG9ydCl7CisJY2FzZSAwOgorCQltX3NwaUNTMEhhbmRsZSA9IGhhbmRsZTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltX3NwaUNTMUhhbmRsZSA9IGhhbmRsZTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltX3NwaUNTMkhhbmRsZSA9IGhhbmRsZTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQltX3NwaUNTM0hhbmRsZSA9IGhhbmRsZTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQltX3NwaU1YUEhhbmRsZSA9IGhhbmRsZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIEdldCB0aGUgc2VtYXBob3JlIGZvciBhIFNQSSBwb3J0CisgKgorICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKKyAqIEByZXR1cm4gVGhlIHNlbWFwaG9yZSBmb3IgdGhlIFNQSSBwb3J0LgorICovCitSZWVudHJhbnRNdXRleCYgc3BpR2V0U2VtYXBob3JlKHVpbnQ4X3QgcG9ydCkgeworCWlmKHBvcnQgPCA0KQorCQlyZXR1cm4gc3BpT25ib2FyZFNlbWFwaG9yZTsKKwllbHNlCisJCXJldHVybiBzcGlNWFBTZW1hcGhvcmU7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBJMkMgcG9ydC4gT3BlbnMgdGhlIHBvcnQgaWYgbmVjZXNzYXJ5IGFuZCBzYXZlcyB0aGUgaGFuZGxlLgorICogSWYgb3BlbmluZyB0aGUgTVhQIHBvcnQsIGFsc28gc2V0cyB1cCB0aGUgcGluIGZ1bmN0aW9ucyBhcHByb3ByaWF0ZWx5CisgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBvcGVuLCAwIGZvciB0aGUgb24tYm9hcmQsIDEgZm9yIHRoZSBNWFAuCisgKi8KK3ZvaWQgaTJDSW5pdGlhbGl6ZSh1aW50OF90IHBvcnQsIGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVEaWdpdGFsKHN0YXR1cyk7CisKKwlpZihwb3J0ID4gMSkKKwl7CisJCS8vU2V0IHBvcnQgb3V0IG9mIHJhbmdlIGVycm9yIGhlcmUKKwkJcmV0dXJuOworCX0KKworCVJlZW50cmFudE11dGV4ICZsb2NrID0gcG9ydCA9PSAwID8gZGlnaXRhbEkyQ09uQm9hcmRTZW1hcGhvcmUgOiBkaWdpdGFsSTJDTVhQU2VtYXBob3JlOworCXsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobG9jayk7CisJCWlmKHBvcnQgPT0gMCkgeworCQkJaTJDT25ib2FyZE9iakNvdW50Kys7CisJCQlpZiAoaTJDT25Cb2FyZEhhbmRsZSA+IDApIHJldHVybjsKKwkJCWkyQ09uQm9hcmRIYW5kbGUgPSBpMmNsaWJfb3BlbigiL2Rldi9pMmMtMiIpOworCQl9IGVsc2UgaWYocG9ydCA9PSAxKSB7CisJCQlpMkNNWFBPYmpDb3VudCsrOworCQkJaWYgKGkyQ01YUEhhbmRsZSA+IDApIHJldHVybjsKKwkJCWlmKCFhbGxvY2F0ZURJTyhnZXRQb3J0KDI0KSwgZmFsc2UsIHN0YXR1cykpIHJldHVybjsKKwkJCWlmKCFhbGxvY2F0ZURJTyhnZXRQb3J0KDI1KSwgZmFsc2UsIHN0YXR1cykpIHJldHVybjsKKwkJCWRpZ2l0YWxTeXN0ZW0tPndyaXRlRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3RhdHVzKXwweEMwMDAsIHN0YXR1cyk7CisJCQlpMkNNWFBIYW5kbGUgPSBpMmNsaWJfb3BlbigiL2Rldi9pMmMtMSIpOworCQl9CisJcmV0dXJuOworCX0KK30KKworLyoqCisgKiBHZW5lcmljIHRyYW5zYWN0aW9uLgorICoKKyAqIFRoaXMgaXMgYSBsb3dlci1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIEkyQyBoYXJkd2FyZSBnaXZpbmcgeW91IG1vcmUgY29udHJvbCBvdmVyIGVhY2ggdHJhbnNhY3Rpb24uCisgKgorICogQHBhcmFtIGRhdGFUb1NlbmQgQnVmZmVyIG9mIGRhdGEgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSBzZW5kU2l6ZSBOdW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4gWzAuLjZdCisgKiBAcGFyYW0gZGF0YVJlY2VpdmVkIEJ1ZmZlciB0byByZWFkIGRhdGEgaW50by4KKyAqIEBwYXJhbSByZWNlaXZlU2l6ZSBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBkZXZpY2UuIFswLi43XQorICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgorICovCitpbnQzMl90IGkyQ1RyYW5zYWN0aW9uKHVpbnQ4X3QgcG9ydCwgdWludDhfdCBkZXZpY2VBZGRyZXNzLCB1aW50OF90ICpkYXRhVG9TZW5kLCB1aW50OF90IHNlbmRTaXplLCB1aW50OF90ICpkYXRhUmVjZWl2ZWQsIHVpbnQ4X3QgcmVjZWl2ZVNpemUpCit7CisJaWYocG9ydCA+IDEpIHsKKwkJLy9TZXQgcG9ydCBvdXQgb2YgcmFuZ2UgZXJyb3IgaGVyZQorCQlyZXR1cm4gLTE7CisJfQorCS8qaWYgKHNlbmRTaXplID4gNikgLy8gT3B0aW9uYWwsIHByb3ZpZGVzIGJldHRlciBlcnJvciBtZXNzYWdlLglUT0RPOiBBcmUgdGhlc2UgbGltaXRzIHN0aWxsIHJpZ2h0PyBJbXBsZW1lbnQgZXJyb3IuIENoZWNrIGZvciBudWxsIGJ1ZmZlcgorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInNlbmRTaXplIik7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAocmVjZWl2ZVNpemUgPiA3KSAvLyBPcHRpb25hbCwgcHJvdmlkZXMgYmV0dGVyIGVycm9yIG1lc3NhZ2UuCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAicmVjZWl2ZVNpemUiKTsKKwkJcmV0dXJuIHRydWU7CisJfSovCisJaW50MzJfdCBoYW5kbGUgPSBwb3J0ID09IDAgPyBpMkNPbkJvYXJkSGFuZGxlOmkyQ01YUEhhbmRsZTsKKwlSZWVudHJhbnRNdXRleCAmbG9jayA9IHBvcnQgPT0gMCA/IGRpZ2l0YWxJMkNPbkJvYXJkU2VtYXBob3JlIDogZGlnaXRhbEkyQ01YUFNlbWFwaG9yZTsKKworCXsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobG9jayk7CisJCXJldHVybiBpMmNsaWJfd3JpdGVyZWFkKGhhbmRsZSwgZGV2aWNlQWRkcmVzcywgKGNvbnN0IGNoYXIqKSBkYXRhVG9TZW5kLCAoaW50MzJfdCkgc2VuZFNpemUsIChjaGFyKikgZGF0YVJlY2VpdmVkLCAoaW50MzJfdCkgcmVjZWl2ZVNpemUpOworCX0KK30KKworLyoqCisgKiBFeGVjdXRlIGEgd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFdyaXRlIGEgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlciBvbiBhIGRldmljZSBhbmQgd2FpdCB1bnRpbCB0aGUKKyAqICAgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCisgKgorICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZSB0byBiZSB3cml0dGVuLgorICogQHBhcmFtIGRhdGEgVGhlIGJ5dGUgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVyIG9uIHRoZSBkZXZpY2UuCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2ludDMyX3QgaTJDV3JpdGUodWludDhfdCBwb3J0LCB1aW50OF90IGRldmljZUFkZHJlc3MsIHVpbnQ4X3QqIGRhdGFUb1NlbmQsIHVpbnQ4X3Qgc2VuZFNpemUpCit7CisJaWYocG9ydCA+IDEpIHsKKwkJLy9TZXQgcG9ydCBvdXQgb2YgcmFuZ2UgZXJyb3IgaGVyZQorCQlyZXR1cm4gLTE7CisJfQorCS8qaWYgKHNlbmRTaXplID4gNikgLy8gT3B0aW9uYWwsIHByb3ZpZGVzIGJldHRlciBlcnJvciBtZXNzYWdlLglUT0RPOiBBcmUgdGhlc2UgbGltaXRzIHN0aWxsIHJpZ2h0PyBJbXBsZW1lbnQgZXJyb3IuIENoZWNrIGZvciBudWxsIGJ1ZmZlcgorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInNlbmRTaXplIik7CisJCXJldHVybiB0cnVlOworCX0qLworCWludDMyX3QgaGFuZGxlID0gcG9ydCA9PSAwID8gaTJDT25Cb2FyZEhhbmRsZTppMkNNWFBIYW5kbGU7CisJUmVlbnRyYW50TXV0ZXggJmxvY2sgPSBwb3J0ID09IDAgPyBkaWdpdGFsSTJDT25Cb2FyZFNlbWFwaG9yZSA6IGRpZ2l0YWxJMkNNWFBTZW1hcGhvcmU7CisJeworICAgIDo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhsb2NrKTsKKwkJcmV0dXJuIGkyY2xpYl93cml0ZShoYW5kbGUsIGRldmljZUFkZHJlc3MsIChjb25zdCBjaGFyKikgZGF0YVRvU2VuZCwgKGludDMyX3QpIHNlbmRTaXplKTsKKwl9Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIHJlYWQgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFJlYWQgMSB0byA3IGJ5dGVzIGZyb20gYSBkZXZpY2UuCisgKiBNb3N0IEkyQyBkZXZpY2VzIHdpbGwgYXV0by1pbmNyZW1lbnQgdGhlIHJlZ2lzdGVyIHBvaW50ZXIgaW50ZXJuYWxseQorICogICBhbGxvd2luZyB5b3UgdG8gcmVhZCB1cCB0byA3IGNvbnNlY3V0aXZlIHJlZ2lzdGVycyBvbiBhIGRldmljZSBpbiBhCisgKiAgIHNpbmdsZSB0cmFuc2FjdGlvbi4KKyAqCisgKiBAcGFyYW0gcmVnaXN0ZXJBZGRyZXNzIFRoZSByZWdpc3RlciB0byByZWFkIGZpcnN0IGluIHRoZSB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhlIHRyYW5zYWN0aW9uLiBbMS4uN10KKyAqIEBwYXJhbSBidWZmZXIgQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgZGF0YSByZWFkIGZyb20gdGhlIGRldmljZS4KKyAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KKyAqLworaW50MzJfdCBpMkNSZWFkKHVpbnQ4X3QgcG9ydCwgdWludDhfdCBkZXZpY2VBZGRyZXNzLCB1aW50OF90ICpidWZmZXIsIHVpbnQ4X3QgY291bnQpCit7CisJaWYocG9ydCA+IDEpIHsKKwkJLy9TZXQgcG9ydCBvdXQgb2YgcmFuZ2UgZXJyb3IgaGVyZQorCQlyZXR1cm4gLTE7CisJfQorCS8qCWlmIChjb3VudCA8IDEgfHwgY291bnQgPiA3KSBUb2RvOiBBcmUgdGhlc2UgbGltaXRzIHN0aWxsIHJpZ2h0PyBJbXBsZW1lbnQgZXJyb3IKKwkJeworCQkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgImNvdW50Iik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoYnVmZmVyID09IE5VTEwpCisJCXsKKwkJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJidWZmZXIiKTsKKwkJCXJldHVybiB0cnVlOworCQl9Ki8KKwlpbnQzMl90IGhhbmRsZSA9IHBvcnQgPT0gMCA/IGkyQ09uQm9hcmRIYW5kbGU6aTJDTVhQSGFuZGxlOworCVJlZW50cmFudE11dGV4ICZsb2NrID0gcG9ydCA9PSAwID8gZGlnaXRhbEkyQ09uQm9hcmRTZW1hcGhvcmUgOiBkaWdpdGFsSTJDTVhQU2VtYXBob3JlOworCXsKKyAgICA6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobG9jayk7CisJCXJldHVybiBpMmNsaWJfcmVhZChoYW5kbGUsIGRldmljZUFkZHJlc3MsIChjaGFyKikgYnVmZmVyLCAoaW50MzJfdCkgY291bnQpOworCX0KKworfQorCit2b2lkIGkyQ0Nsb3NlKHVpbnQ4X3QgcG9ydCkgeworCWlmKHBvcnQgPiAxKSB7CisJCS8vU2V0IHBvcnQgb3V0IG9mIHJhbmdlIGVycm9yIGhlcmUKKwkJcmV0dXJuOworCX0KKwlSZWVudHJhbnRNdXRleCAmbG9jayA9IHBvcnQgPT0gMCA/IGRpZ2l0YWxJMkNPbkJvYXJkU2VtYXBob3JlIDogZGlnaXRhbEkyQ01YUFNlbWFwaG9yZTsKKwl7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKGxvY2spOworCQlpZigocG9ydCA9PSAwID8gaTJDT25ib2FyZE9iakNvdW50LS06aTJDTVhQT2JqQ291bnQtLSkgPT0gMCkgeworCQkJaW50MzJfdCBoYW5kbGUgPSBwb3J0ID09IDAgPyBpMkNPbkJvYXJkSGFuZGxlOmkyQ01YUEhhbmRsZTsKKwkJCWkyY2xpYl9jbG9zZShoYW5kbGUpOworCQl9CisJfQorCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvRlJDX0ZQR0FfQ2hpcE9iamVjdF9BbGlhc2VzLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L0ZSQ19GUEdBX0NoaXBPYmplY3RfQWxpYXNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmJhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L0ZSQ19GUEdBX0NoaXBPYmplY3RfQWxpYXNlcy5oCkBAIC0wLDAgKzEsMTAgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fRlJDX0ZQR0FfQ2hpcE9iamVjdF9BbGlhc2VzX2hfXw0KKyNkZWZpbmUgX19GUkNfRlBHQV9DaGlwT2JqZWN0X0FsaWFzZXNfaF9fDQorDQorI2RlZmluZSBuUnVudGltZUZQR0FOYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorI2RlZmluZSBuSW52YXJpYW50RlBHQU5hbWVzcGFjZSBuRlJDX0MwRUZfMV8xXzANCisNCisjZW5kaWYgLy8gX19GUkNfRlBHQV9DaGlwT2JqZWN0X0FsaWFzZXNfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9Sb2JvUklPX0ZSQ19DaGlwT2JqZWN0X0FsaWFzZXMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhZTA4MgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzLmgKQEAgLTAsMCArMSw5IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX1JvYm9SSU9fRlJDX0NoaXBPYmplY3RfQWxpYXNlc19oX18NCisjZGVmaW5lIF9fUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzX2hfXw0KKw0KKyNkZWZpbmUgblJvYm9SSU9fRlBHQU5hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCisNCisjZW5kaWYgLy8gX19Sb2JvUklPX0ZSQ19DaGlwT2JqZWN0X0FsaWFzZXNfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9mcGdhaW50ZXJmYWNlY2FwaS9OaUZwZ2EuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvZnBnYWludGVyZmFjZWNhcGkvTmlGcGdhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiMDY2NQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvZnBnYWludGVyZmFjZWNhcGkvTmlGcGdhLmgKQEAgLTAsMCArMSwyNDUwIEBACisvKg0KKyAqIEZQR0EgSW50ZXJmYWNlIEMgQVBJIDE0LjAgaGVhZGVyIGZpbGUuDQorICoNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsDQorICogTmF0aW9uYWwgSW5zdHJ1bWVudHMgQ29ycG9yYXRpb24uDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKi8NCisNCisjaWZuZGVmIF9fTmlGcGdhX2hfXw0KKyNkZWZpbmUgX19OaUZwZ2FfaF9fDQorDQorLyoNCisgKiBEZXRlcm1pbmUgcGxhdGZvcm0gZGV0YWlscy4NCisgKi8NCisjaWYgZGVmaW5lZChfTV9JWDg2KSBcDQorIHx8IGRlZmluZWQoX01fWDY0KSBcDQorIHx8IGRlZmluZWQoX01fQU1ENjQpIFwNCisgfHwgZGVmaW5lZChpMzg2KSBcDQorIHx8IGRlZmluZWQoX19pMzg2KSBcDQorIHx8IGRlZmluZWQoX19pMzg2X18pIFwNCisgfHwgZGVmaW5lZChfX2k0ODZfXykgXA0KKyB8fCBkZWZpbmVkKF9faTU4Nl9fKSBcDQorIHx8IGRlZmluZWQoX19pNjg2X18pIFwNCisgfHwgZGVmaW5lZChfX2FtZDY0X18pIFwNCisgfHwgZGVmaW5lZChfX2FtZDY0KSBcDQorIHx8IGRlZmluZWQoX194ODZfNjRfXykgXA0KKyB8fCBkZWZpbmVkKF9feDg2XzY0KSBcDQorIHx8IGRlZmluZWQoX19JQTMyX18pIFwNCisgfHwgZGVmaW5lZChfWDg2XykgXA0KKyB8fCBkZWZpbmVkKF9fVEhXX0lOVEVMX18pIFwNCisgfHwgZGVmaW5lZChfX0k4Nl9fKSBcDQorIHx8IGRlZmluZWQoX19JTlRFTF9fKSBcDQorIHx8IGRlZmluZWQoX19YODZfXykgXA0KKyB8fCBkZWZpbmVkKF9fMzg2X18pIFwNCisgfHwgZGVmaW5lZChfX0k4Nl9fKSBcDQorIHx8IGRlZmluZWQoTV9JMzg2KSBcDQorIHx8IGRlZmluZWQoTV9JODYpIFwNCisgfHwgZGVmaW5lZChfTV9JMzg2KSBcDQorIHx8IGRlZmluZWQoX01fSTg2KQ0KKyAgICNpZiBkZWZpbmVkKF9XSU4zMikgXA0KKyAgICB8fCBkZWZpbmVkKF9XSU42NCkgXA0KKyAgICB8fCBkZWZpbmVkKF9fV0lOMzJfXykgXA0KKyAgICB8fCBkZWZpbmVkKF9fVE9TX1dJTl9fKSBcDQorICAgIHx8IGRlZmluZWQoX19XSU5ET1dTX18pIFwNCisgICAgfHwgZGVmaW5lZChfV0lORE9XUykgXA0KKyAgICB8fCBkZWZpbmVkKF9fV0lORE9XU18zODZfXykgXA0KKyAgICB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pDQorICAgICAgLyogRWl0aGVyIFdpbmRvd3Mgb3IgUGhhciBMYXAgRVRTLiAqLw0KKyAgICAgICNkZWZpbmUgTmlGcGdhX1dpbmRvd3MgMQ0KKyAgICNlbGlmIGRlZmluZWQoX19saW51eF9fKSBcDQorICAgICAgfHwgZGVmaW5lZChfX2xpbnV4KSBcDQorICAgICAgfHwgZGVmaW5lZChsaW51eCkgXA0KKyAgICAgIHx8IGRlZmluZWQoX19nbnVfbGludXhfXykNCisgICAgICAjZGVmaW5lIE5pRnBnYV9MaW51eCAxDQorICAgI2VsaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pDQorICAgICAgI2RlZmluZSBOaUZwZ2FfTWFjT3NYIDENCisgICAjZWxzZQ0KKyAgICAgICNlcnJvciBVbnN1cHBvcnRlZCBPUy4NCisgICAjZW5kaWYNCisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYykgXA0KKyAgIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIFwNCisgICB8fCBkZWZpbmVkKF9fUE9XRVJQQ19fKSBcDQorICAgfHwgZGVmaW5lZChfX3BwY19fKSBcDQorICAgfHwgZGVmaW5lZChfX1BQQykgXA0KKyAgIHx8IGRlZmluZWQoX01fUFBDKSBcDQorICAgfHwgZGVmaW5lZChfQVJDSF9QUEMpIFwNCisgICB8fCBkZWZpbmVkKF9fUFBDX18pIFwNCisgICB8fCBkZWZpbmVkKF9fcHBjKQ0KKyAgICNpZiBkZWZpbmVkKF9fdnh3b3JrcykNCisgICAgICAjZGVmaW5lIE5pRnBnYV9WeFdvcmtzIDENCisgICAjZWxzZQ0KKyAgICAgICNlcnJvciBVbnN1cHBvcnRlZCBPUy4NCisgICAjZW5kaWYNCisjZWxpZiBkZWZpbmVkKF9fYXJtX18pIFwNCisgICB8fCBkZWZpbmVkKF9fdGh1bWJfXykgXA0KKyAgIHx8IGRlZmluZWQoX19UQVJHRVRfQVJDSF9BUk0pIFwNCisgICB8fCBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfVEhVTUIpIFwNCisgICB8fCBkZWZpbmVkKF9BUk0pIFwNCisgICB8fCBkZWZpbmVkKF9NX0FSTSkgXA0KKyAgIHx8IGRlZmluZWQoX01fQVJNVCkNCisjaWYgZGVmaW5lZChfX2xpbnV4X18pIFwNCisgfHwgZGVmaW5lZChfX2xpbnV4KSBcDQorIHx8IGRlZmluZWQobGludXgpIFwNCisgfHwgZGVmaW5lZChfX2dudV9saW51eF9fKQ0KKyAgICNkZWZpbmUgTmlGcGdhX0xpbnV4IDENCisjZWxzZQ0KKyAgICAgICNlcnJvciBVbnN1cHBvcnRlZCBPUy4NCisgICAjZW5kaWYNCisjZWxzZQ0KKyAgICNlcnJvciBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuDQorI2VuZGlmDQorDQorLyoNCisgKiBEZXRlcm1pbmUgY29tcGlsZXIuDQorICovDQorI2lmIGRlZmluZWQoX01TQ19WRVIpDQorICAgI2RlZmluZSBOaUZwZ2FfTXN2YyAxDQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykNCisgICAjZGVmaW5lIE5pRnBnYV9HY2MgMQ0KKyNlbGlmIGRlZmluZWQoX0NWSV8pICYmICFkZWZpbmVkKF9UUENfKQ0KKyAgICNkZWZpbmUgTmlGcGdhX0N2aSAxDQorICAgLyogRW5hYmxlcyBDVkkgTGlicmFyeSBQcm90ZWN0aW9uIEVycm9ycy4gKi8NCisgICAjcHJhZ21hIEVuYWJsZUxpYnJhcnlSdW50aW1lQ2hlY2tpbmcNCisjZWxzZQ0KKyAgIC8qIFVua25vd24gY29tcGlsZXIuICovDQorI2VuZGlmDQorDQorLyoNCisgKiBEZXRlcm1pbmUgY29tcGxpYW5jZSB3aXRoIGRpZmZlcmVudCBDL0MrKyBsYW5ndWFnZSBzdGFuZGFyZHMuDQorICovDQorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpDQorICAgI2RlZmluZSBOaUZwZ2FfQ3BwIDENCisgICAjaWYgX19jcGx1c3BsdXMgPj0gMTk5NzA3TA0KKyAgICAgICNkZWZpbmUgTmlGcGdhX0NwcDk4IDENCisgICAgICAjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTA0KKyAgICAgICAgICNkZWZpbmUgTmlGcGdhX0NwcDExIDENCisgICAgICAjZW5kaWYNCisgICAjZW5kaWYNCisjZW5kaWYNCisjaWYgZGVmaW5lZChfX1NURENfXykNCisgICAjZGVmaW5lIE5pRnBnYV9DODkgMQ0KKyAgICNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pDQorICAgICAgI2RlZmluZSBOaUZwZ2FfQzkwIDENCisgICAgICAjaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk0MDlMDQorICAgICAgICAgI2RlZmluZSBOaUZwZ2FfQzk0IDENCisgICAgICAgICAjaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMDQorICAgICAgICAgICAgI2RlZmluZSBOaUZwZ2FfQzk5IDENCisgICAgICAgICAgICAjaWYgX19TVERDX1ZFUlNJT05fXyA+PSAyMDExMTJMDQorICAgICAgICAgICAgICAgI2RlZmluZSBOaUZwZ2FfQzExIDENCisgICAgICAgICAgICAjZW5kaWYNCisgICAgICAgICAjZW5kaWYNCisgICAgICAjZW5kaWYNCisgICAjZW5kaWYNCisjZW5kaWYNCisNCisvKg0KKyAqIERldGVybWluZSBhYmlsaXR5IHRvIGlubGluZSBmdW5jdGlvbnMuDQorICovDQorI2lmIE5pRnBnYV9DcHAgfHwgTmlGcGdhX0M5OQ0KKyAgIC8qIFRoZSBpbmxpbmUga2V5d29yZCBleGlzdHMgaW4gQysrIGFuZCBDOTkuICovDQorI2RlZmluZSBOaUZwZ2FfSW5saW5lIGlubGluZQ0KKyNlbGlmIE5pRnBnYV9Nc3ZjDQorICAgLyogVmlzdWFsIEMrKyAoYXQgbGVhc3Qgc2luY2UgNi4wKSBhbHNvIHN1cHBvcnRzIGFuIGFsdGVybmF0ZSBrZXl3b3JkLiAqLw0KKyAgICNkZWZpbmUgTmlGcGdhX0lubGluZSBfX2lubGluZQ0KKyNlbGlmIE5pRnBnYV9HY2MNCisgICAvKiBHQ0MgKGF0IGxlYXN0IHNpbmNlIDIuOTUuMikgYWxzbyBzdXBwb3J0cyBhbiBhbHRlcm5hdGUga2V5d29yZC4gKi8NCisgICAjZGVmaW5lIE5pRnBnYV9JbmxpbmUgX19pbmxpbmVfXw0KKyNlbGlmICFkZWZpbmVkKE5pRnBnYV9JbmxpbmUpDQorICAgLyoNCisgICAgKiBEaXNhYmxlIGlubGluaW5nIGlmIGlubGluZSBzdXBwb3J0IGlzIHVua25vd24uIFRvIG1hbnVhbGx5IGVuYWJsZQ0KKyAgICAqIGlubGluaW5nLCAjZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8gYmVmb3JlICNpbmNsdWRpbmcgTmlGcGdhLmg6DQorICAgICoNCisgICAgKiAgICAjZGVmaW5lIE5pRnBnYV9JbmxpbmUgaW5saW5lDQorICAgICovDQorICAgI2RlZmluZSBOaUZwZ2FfSW5saW5lDQorI2VuZGlmDQorDQorLyoNCisgKiBEZWZpbmUgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcywgaWYgdGhleSBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gZGVmaW5lZC4NCisgKi8NCisjaWYgTmlGcGdhX0V4YWN0V2lkdGhJbnRlZ2VyVHlwZXNEZWZpbmVkIFwNCisgfHwgZGVmaW5lZChfU1RESU5UKSBcDQorIHx8IGRlZmluZWQoX1NURElOVF9IKSBcDQorIHx8IGRlZmluZWQoX1NURElOVF9IXykgXA0KKyB8fCBkZWZpbmVkKF9JTlRUWVBFU19IKSBcDQorIHx8IGRlZmluZWQoX0lOVFRZUEVTX0hfKSBcDQorIHx8IGRlZmluZWQoX1NZU19TVERJTlRfSCkgXA0KKyB8fCBkZWZpbmVkKF9TWVNfU1RESU5UX0hfKSBcDQorIHx8IGRlZmluZWQoX1NZU19JTlRUWVBFU19IKSBcDQorIHx8IGRlZmluZWQoX1NZU19JTlRUWVBFU19IXykgXA0KKyB8fCBkZWZpbmVkKF9TVERJTlRfSF9JTkNMVURFRCkgXA0KKyB8fCBkZWZpbmVkKF9NU0NfU1RESU5UX0hfKSBcDQorIHx8IGRlZmluZWQoX1BTVERJTlRfSF9JTkNMVURFRCkNCisgICAvKiBBc3N1bWUgdGhhdCBleGFjdC13aWR0aCBpbnRlZ2VyIHR5cGVzIGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQuICovDQorI2VsaWYgTmlGcGdhX1Z4V29ya3MNCisgICAvKiBWeFdvcmtzIChhdCBsZWFzdCA2LjMgYW5kIGVhcmxpZXIpIGRpZCBub3QgaGF2ZSBzdGRpbnQuaC4gKi8NCisgICAjaW5jbHVkZSA8dHlwZXMvdnhUeXBlcy5oPg0KKyNlbGlmIE5pRnBnYV9DOTkgXA0KKyAgIHx8IE5pRnBnYV9HY2MgLyogR0NDIChhdCBsZWFzdCBzaW5jZSAzLjApIGhhcyBhIHN0ZGludC5oLiAqLyBcDQorICAgfHwgZGVmaW5lZChIQVZFX1NURElOVF9IKQ0KKyAgIC8qIEFzc3VtZSB0aGF0IHN0ZGludC5oIGNhbiBiZSBpbmNsdWRlZC4gKi8NCisgICAjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2VsaWYgTmlGcGdhX01zdmMgXA0KKyAgIHx8IE5pRnBnYV9DdmkNCisgICAvKiBNYW51YWxseSBkZWZpbmUgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcy4gKi8NCisgICB0eXBlZGVmICAgc2lnbmVkICAgIGNoYXIgIGludDhfdDsNCisgICB0eXBlZGVmIHVuc2lnbmVkICAgIGNoYXIgdWludDhfdDsNCisgICB0eXBlZGVmICAgICAgICAgICAgc2hvcnQgIGludDE2X3Q7DQorICAgdHlwZWRlZiB1bnNpZ25lZCAgIHNob3J0IHVpbnQxNl90Ow0KKyAgIHR5cGVkZWYgICAgICAgICAgICAgIGludCAgaW50MzJfdDsNCisgICB0eXBlZGVmIHVuc2lnbmVkICAgICBpbnQgdWludDMyX3Q7DQorICAgdHlwZWRlZiAgICAgICAgICBfX2ludDY0ICBpbnQ2NF90Ow0KKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsNCisjZWxzZQ0KKyAgIC8qDQorICAgICogRXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyBtdXN0IGJlIGRlZmluZWQgYnkgdGhlIHVzZXIsIGFuZCB0aGUgZm9sbG93aW5nDQorICAgICogbWFjcm8gbXVzdCBiZSAjZGVmaW5lZCwgYmVmb3JlICNpbmNsdWRpbmcgTmlGcGdhLmg6DQorICAgICoNCisgICAgKiAgICAjZGVmaW5lIE5pRnBnYV9FeGFjdFdpZHRoSW50ZWdlclR5cGVzRGVmaW5lZCAxDQorICAgICovDQorICAgI2Vycm9yIEV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMgbXVzdCBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLiBTZWUgY29tbWVudC4NCisjZW5kaWYNCisNCisvKiBJbmNsdWRlZCBmb3IgZGVmaW5pdGlvbiBvZiBzaXplX3QuICovDQorI2luY2x1ZGUgPHN0ZGRlZi5oPg0KKw0KKyNpZiBOaUZwZ2FfQ3BwDQorZXh0ZXJuICJDIg0KK3sNCisjZW5kaWYNCisNCisvKioNCisgKiBBIGJvb2xlYW4gdmFsdWU7IGVpdGhlciBOaUZwZ2FfRmFsc2Ugb3IgTmlGcGdhX1RydWUuDQorICovDQordHlwZWRlZiB1aW50OF90IE5pRnBnYV9Cb29sOw0KKw0KKy8qKg0KKyAqIFJlcHJlc2VudHMgYSBmYWxzZSBjb25kaXRpb24uDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9Cb29sIE5pRnBnYV9GYWxzZSA9IDA7DQorDQorLyoqDQorICogUmVwcmVzZW50cyBhIHRydWUgY29uZGl0aW9uLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfQm9vbCBOaUZwZ2FfVHJ1ZSA9IDE7DQorDQorLyoqDQorICogUmVwcmVzZW50cyB0aGUgcmVzdWx0aW5nIHN0YXR1cyBvZiBhIGZ1bmN0aW9uIGNhbGwgdGhyb3VnaCBpdHMgcmV0dXJuIHZhbHVlLg0KKyAqIDAgaXMgc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIGFyZSBlcnJvcnMsIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHdhcm5pbmdzLg0KKyAqLw0KK3R5cGVkZWYgaW50MzJfdCBOaUZwZ2FfU3RhdHVzOw0KKw0KKy8qKg0KKyAqIE5vIGVycm9ycyBvciB3YXJuaW5ncy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1N1Y2Nlc3MgPSAwOw0KKw0KKy8qKg0KKyAqIFRoZSB0aW1lb3V0IGV4cGlyZWQgYmVmb3JlIHRoZSBGSUZPIG9wZXJhdGlvbiBjb3VsZCBjb21wbGV0ZS4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZpZm9UaW1lb3V0ID0gLTUwNDAwOw0KKw0KKy8qKg0KKyAqIE5vIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzIGJlY2F1c2UgdGhlIHRyYW5zZmVyIHdhcyBhYm9ydGVkIGJ5IHRoZSBjbGllbnQuDQorICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGxldGVkIGFzIHNwZWNpZmllZC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1RyYW5zZmVyQWJvcnRlZCA9IC01MDQwNTsNCisNCisvKioNCisgKiBBIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gVHJ5IGFnYWluIGFmdGVyIHJlYm9vdGluZy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX01lbW9yeUZ1bGwgPSAtNTIwMDA7DQorDQorLyoqDQorICogQW4gdW5leHBlY3RlZCBzb2Z0d2FyZSBlcnJvciBvY2N1cnJlZC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1NvZnR3YXJlRmF1bHQgPSAtNTIwMDM7DQorDQorLyoqDQorICogQSBwYXJhbWV0ZXIgdG8gYSBmdW5jdGlvbiB3YXMgbm90IHZhbGlkLiBUaGlzIGNvdWxkIGJlIGEgTlVMTCBwb2ludGVyLCBhIGJhZA0KKyAqIHZhbHVlLCBldGMuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyID0gLTUyMDA1Ow0KKw0KKy8qKg0KKyAqIEEgcmVxdWlyZWQgcmVzb3VyY2Ugd2FzIG5vdCBmb3VuZC4gVGhlIE5pRnBnYS4qIGxpYnJhcnksIHRoZSBSSU8gcmVzb3VyY2UsIG9yDQorICogc29tZSBvdGhlciByZXNvdXJjZSBtYXkgYmUgbWlzc2luZy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90Rm91bmQgPSAtNTIwMDY7DQorDQorLyoqDQorICogQSByZXF1aXJlZCByZXNvdXJjZSB3YXMgbm90IHByb3Blcmx5IGluaXRpYWxpemVkLiBUaGlzIGNvdWxkIG9jY3VyIGlmDQorICogTmlGcGdhX0luaXRpYWxpemUgd2FzIG5vdCBjYWxsZWQgb3IgYSByZXF1aXJlZCBOaUZwZ2FfSXJxQ29udGV4dCB3YXMgbm90DQorICogcmVzZXJ2ZWQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEluaXRpYWxpemVkID0gLTUyMDEwOw0KKw0KKy8qKg0KKyAqIEEgaGFyZHdhcmUgZmFpbHVyZSBoYXMgb2NjdXJyZWQuIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIGNvbXBsZXRlZCBhcw0KKyAqIHNwZWNpZmllZC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0hhcmR3YXJlRmF1bHQgPSAtNTIwMTg7DQorDQorLyoqDQorICogVGhlIEZQR0EgaXMgYWxyZWFkeSBydW5uaW5nLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUFscmVhZHlSdW5uaW5nID0gLTYxMDAzOw0KKw0KKy8qKg0KKyAqIEFuIGVycm9yIG9jY3VycmVkIGRvd25sb2FkaW5nIHRoZSBWSSB0byB0aGUgRlBHQSBkZXZpY2UuIFZlcmlmeSB0aGF0DQorICogdGhlIHRhcmdldCBpcyBjb25uZWN0ZWQgYW5kIHBvd2VyZWQgYW5kIHRoYXQgdGhlIHJlc291cmNlIG9mIHRoZSB0YXJnZXQNCisgKiBpcyBwcm9wZXJseSBjb25maWd1cmVkLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRG93bmxvYWRFcnJvciA9IC02MTAxODsNCisNCisvKioNCisgKiBUaGUgYml0ZmlsZSB3YXMgbm90IGNvbXBpbGVkIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlJ3MgZGV2aWNlIHR5cGUuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19EZXZpY2VUeXBlTWlzbWF0Y2ggPSAtNjEwMjQ7DQorDQorLyoqDQorICogQW4gZXJyb3Igd2FzIGRldGVjdGVkIGluIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgY29tcHV0ZXIgYW5kIHRoZQ0KKyAqIEZQR0EgdGFyZ2V0Lg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQ29tbXVuaWNhdGlvblRpbWVvdXQgPSAtNjEwNDY7DQorDQorLyoqDQorICogVGhlIHRpbWVvdXQgZXhwaXJlZCBiZWZvcmUgYW55IG9mIHRoZSBJUlFzIHdlcmUgYXNzZXJ0ZWQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19JcnFUaW1lb3V0ID0gLTYxMDYwOw0KKw0KKy8qKg0KKyAqIFRoZSBzcGVjaWZpZWQgYml0ZmlsZSBpcyBpbnZhbGlkIG9yIGNvcnJ1cHQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19Db3JydXB0Qml0ZmlsZSA9IC02MTA3MDsNCisNCisvKioNCisgKiBUaGUgcmVxdWVzdGVkIEZJRk8gZGVwdGggaXMgaW52YWxpZC4gSXQgaXMgZWl0aGVyIDAgb3IgYW4gYW1vdW50IG5vdA0KKyAqIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19CYWREZXB0aCA9IC02MTA3MjsNCisNCisvKioNCisgKiBUaGUgbnVtYmVyIG9mIEZJRk8gZWxlbWVudHMgaXMgaW52YWxpZC4gRWl0aGVyIHRoZSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHRoZQ0KKyAqIGRlcHRoIG9mIHRoZSBob3N0IG1lbW9yeSBETUEgRklGTywgb3IgbW9yZSBlbGVtZW50cyB3ZXJlIHJlcXVlc3RlZCBmb3INCisgKiByZWxlYXNlIHRoYW4gaGFkIGJlZW4gYWNxdWlyZWQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19CYWRSZWFkV3JpdGVDb3VudCA9IC02MTA3MzsNCisNCisvKioNCisgKiBBIGhhcmR3YXJlIGNsb2NraW5nIGVycm9yIG9jY3VycmVkLiBBIGRlcml2ZWQgY2xvY2sgbG9zdCBsb2NrIHdpdGggaXRzIGJhc2UNCisgKiBjbG9jayBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgTGFiVklFVyBGUEdBIFZJLiBJZiBhbnkgYmFzZSBjbG9ja3Mgd2l0aA0KKyAqIGRlcml2ZWQgY2xvY2tzIGFyZSByZWZlcmVuY2luZyBhbiBleHRlcm5hbCBzb3VyY2UsIG1ha2Ugc3VyZSB0aGF0IHRoZQ0KKyAqIGV4dGVybmFsIHNvdXJjZSBpcyBjb25uZWN0ZWQgYW5kIHdpdGhpbiB0aGUgc3VwcG9ydGVkIGZyZXF1ZW5jeSwgaml0dGVyLA0KKyAqIGFjY3VyYWN5LCBkdXR5IGN5Y2xlLCBhbmQgdm9sdGFnZSBzcGVjaWZpY2F0aW9ucy4gQWxzbyB2ZXJpZnkgdGhhdCB0aGUNCisgKiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGJhc2UgY2xvY2sgbWF0Y2ggdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGluIHRoZQ0KKyAqIEZQR0EgQmFzZSBDbG9jayBQcm9wZXJ0aWVzLiBJZiBhbGwgYmFzZSBjbG9ja3Mgd2l0aCBkZXJpdmVkIGNsb2NrcyBhcmUNCisgKiBnZW5lcmF0ZWQgZnJvbSBmcmVlLXJ1bm5pbmcsIG9uLWJvYXJkIHNvdXJjZXMsIHBsZWFzZSBjb250YWN0IE5hdGlvbmFsDQorICogSW5zdHJ1bWVudHMgdGVjaG5pY2FsIHN1cHBvcnQgYXQgbmkuY29tL3N1cHBvcnQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19DbG9ja0xvc3RMb2NrID0gLTYxMDgzOw0KKw0KKy8qKg0KKyAqIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZSBGUEdBIGlzIGJ1c3kuIFN0b3AgYWxsDQorICogYWN0aXZpdGllcyBvbiB0aGUgRlBHQSBiZWZvcmUgcmVxdWVzdGluZyB0aGlzIG9wZXJhdGlvbi4gSWYgdGhlIHRhcmdldCBpcyBpbg0KKyAqIFNjYW4gSW50ZXJmYWNlIHByb2dyYW1taW5nIG1vZGUsIHB1dCBpdCBpbiBGUEdBIEludGVyZmFjZSBwcm9ncmFtbWluZyBtb2RlLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3kgPSAtNjExNDE7DQorDQorLyoqDQorICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIEZQR0EgaXMgYnVzeSBvcGVyYXRpbmcgaW4NCisgKiBGUEdBIEludGVyZmFjZSBDIEFQSSBtb2RlLiBTdG9wIGFsbCBhY3Rpdml0aWVzIG9uIHRoZSBGUEdBIGJlZm9yZSByZXF1ZXN0aW5nDQorICogdGhpcyBvcGVyYXRpb24uDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GcGdhQnVzeUZwZ2FJbnRlcmZhY2VDQXBpID0gLTYxMjAwOw0KKw0KKy8qKg0KKyAqIFRoZSBjaGFzc2lzIGlzIGluIFNjYW4gSW50ZXJmYWNlIHByb2dyYW1taW5nIG1vZGUuIEluIG9yZGVyIHRvIHJ1biBGUEdBIFZJcywNCisgKiB5b3UgbXVzdCBnbyB0byB0aGUgY2hhc3NpcyBwcm9wZXJ0aWVzIHBhZ2UsIHNlbGVjdCBGUEdBIHByb2dyYW1taW5nIG1vZGUsIGFuZA0KKyAqIGRlcGxveSBzZXR0aW5ncy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5U2NhbkludGVyZmFjZSA9IC02MTIwMTsNCisNCisvKioNCisgKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBidXN5IG9wZXJhdGluZyBpbg0KKyAqIEZQR0EgSW50ZXJmYWNlIG1vZGUuIFN0b3AgYWxsIGFjdGl2aXRpZXMgb24gdGhlIEZQR0EgYmVmb3JlIHJlcXVlc3RpbmcgdGhpcw0KKyAqIG9wZXJhdGlvbi4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5RnBnYUludGVyZmFjZSA9IC02MTIwMjsNCisNCisvKioNCisgKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBidXN5IG9wZXJhdGluZyBpbg0KKyAqIEludGVyYWN0aXZlIG1vZGUuIFN0b3AgYWxsIGFjdGl2aXRpZXMgb24gdGhlIEZQR0EgYmVmb3JlIHJlcXVlc3RpbmcgdGhpcw0KKyAqIG9wZXJhdGlvbi4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5SW50ZXJhY3RpdmUgPSAtNjEyMDM7DQorDQorLyoqDQorICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIEZQR0EgaXMgYnVzeSBvcGVyYXRpbmcgaW4NCisgKiBFbXVsYXRpb24gbW9kZS4gU3RvcCBhbGwgYWN0aXZpdGllcyBvbiB0aGUgRlBHQSBiZWZvcmUgcmVxdWVzdGluZyB0aGlzDQorICogb3BlcmF0aW9uLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3lFbXVsYXRpb24gPSAtNjEyMDQ7DQorDQorLyoqDQorICogTGFiVklFVyBGUEdBIGRvZXMgbm90IHN1cHBvcnQgdGhlIFJlc2V0IG1ldGhvZCBmb3IgYml0ZmlsZXMgdGhhdCBhbGxvdw0KKyAqIHJlbW92YWwgb2YgaW1wbGljaXQgZW5hYmxlIHNpZ25hbHMgaW4gc2luZ2xlLWN5Y2xlIFRpbWVkIExvb3BzLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfUmVzZXRDYWxsZWRXaXRoSW1wbGljaXRFbmFibGVSZW1vdmFsID0gLTYxMjExOw0KKw0KKy8qKg0KKyAqIExhYlZJRVcgRlBHQSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBBYm9ydCBtZXRob2QgZm9yIGJpdGZpbGVzIHRoYXQgYWxsb3cNCisgKiByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZSBUaW1lZCBMb29wcy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0Fib3J0Q2FsbGVkV2l0aEltcGxpY2l0RW5hYmxlUmVtb3ZhbCA9IC02MTIxMjsNCisNCisvKioNCisgKiBMYWJWSUVXIEZQR0EgZG9lcyBub3Qgc3VwcG9ydCBDbG9zZSBhbmQgUmVzZXQgaWYgTGFzdCBSZWZlcmVuY2UgZm9yIGJpdGZpbGVzDQorICogdGhhdCBhbGxvdyByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZSBUaW1lZCBMb29wcy4NCisgKiBQYXNzIHRoZSBOaUZwZ2FfQ2xvc2VBdHRyaWJ1dGVfTm9SZXNldElmTGFzdFNlc3Npb24gYXR0cmlidXRlIHRvIE5pRnBnYV9DbG9zZQ0KKyAqIGluc3RlYWQgb2YgMC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0Nsb3NlQW5kUmVzZXRDYWxsZWRXaXRoSW1wbGljaXRFbmFibGVSZW1vdmFsID0gLTYxMjEzOw0KKw0KKy8qKg0KKyAqIEZvciBiaXRmaWxlcyB0aGF0IGFsbG93IHJlbW92YWwgb2YgaW1wbGljaXQgZW5hYmxlIHNpZ25hbHMgaW4gc2luZ2xlLWN5Y2xlDQorICogVGltZWQgTG9vcHMsIExhYlZJRVcgRlBHQSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIHByaW9yIHRvIHJ1bm5pbmcgdGhlDQorICogYml0ZmlsZS4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ltcGxpY2l0RW5hYmxlUmVtb3ZhbEJ1dE5vdFlldFJ1biA9IC02MTIxNDsNCisNCisvKioNCisgKiBCaXRmaWxlcyB0aGF0IGFsbG93IHJlbW92YWwgb2YgaW1wbGljaXQgZW5hYmxlIHNpZ25hbHMgaW4gc2luZ2xlLWN5Y2xlIFRpbWVkDQorICogTG9vcHMgY2FuIHJ1biBvbmx5IG9uY2UuIERvd25sb2FkIHRoZSBiaXRmaWxlIGFnYWluIGJlZm9yZSByZS1ydW5uaW5nIHRoZSBWSS4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1J1bkFmdGVyU3RvcHBlZENhbGxlZFdpdGhJbXBsaWNpdEVuYWJsZVJlbW92YWwgPSAtNjEyMTU7DQorDQorLyoqDQorICogQSBnYXRlZCBjbG9jayBoYXMgdmlvbGF0ZWQgdGhlIGhhbmRzaGFraW5nIHByb3RvY29sLiBJZiB5b3UgYXJlIHVzaW5nDQorICogZXh0ZXJuYWwgZ2F0ZWQgY2xvY2tzLCBlbnN1cmUgdGhhdCB0aGV5IGZvbGxvdyB0aGUgcmVxdWlyZWQgY2xvY2sgZ2F0aW5nDQorICogcHJvdG9jb2wuIElmIHlvdSBhcmUgZ2VuZXJhdGluZyB5b3VyIGNsb2NrcyBpbnRlcm5hbGx5LCBwbGVhc2UgY29udGFjdA0KKyAqIE5hdGlvbmFsIEluc3RydW1lbnRzIFRlY2huaWNhbCBTdXBwb3J0Lg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfR2F0ZWRDbG9ja0hhbmRzaGFraW5nVmlvbGF0aW9uID0gLTYxMjE2Ow0KKw0KKy8qKg0KKyAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YNCisgKiB1bmFjcXVpcmVkIGVsZW1lbnRzIGxlZnQgaW4gdGhlIGhvc3QgbWVtb3J5IERNQSBGSUZPLiBUaGVyZSBhcmUgY3VycmVudGx5DQorICogZmV3ZXIgdW5hY3F1aXJlZCBlbGVtZW50cyBsZWZ0IGluIHRoZSBGSUZPIHRoYW4gYXJlIGJlaW5nIHJlcXVlc3RlZC4gUmVsZWFzZQ0KKyAqIHNvbWUgYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGFjcXVpcmluZyBtb3JlIGVsZW1lbnRzLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRWxlbWVudHNOb3RQZXJtaXNzaWJsZVRvQmVBY3F1aXJlZCA9IC02MTIxOTsNCisNCisvKioNCisgKiBBbiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yIG9jY3VycmVkLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSW50ZXJuYWxFcnJvciA9IC02MTQ5OTsNCisNCisvKioNCisgKiBUaGUgTkktUklPIGRyaXZlciB3YXMgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBGSUZPLiBUaGlzIGNhbiBoYXBwZW4NCisgKiB3aGVuIHRoZSBjb21iaW5lZCBkZXB0aCBvZiBhbGwgRE1BIEZJRk9zIGV4Y2VlZHMgdGhlIG1heGltdW0gZGVwdGggZm9yIHRoZQ0KKyAqIGNvbnRyb2xsZXIsIG9yIHdoZW4gdGhlIGNvbnRyb2xsZXIgcnVucyBvdXQgb2Ygc3lzdGVtIG1lbW9yeS4gWW91IG1heSBiZSBhYmxlDQorICogdG8gcmVjb25maWd1cmUgdGhlIGNvbnRyb2xsZXIgd2l0aCBhIGdyZWF0ZXIgbWF4aW11bSBGSUZPIGRlcHRoLiBGb3IgbW9yZQ0KKyAqIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgTkkgS25vd2xlZGdlQmFzZSBhcnRpY2xlIDY1T0YyRVJRLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfVG90YWxEbWFGaWZvRGVwdGhFeGNlZWRlZCA9IC02MzAwMzsNCisNCisvKioNCisgKiBBY2Nlc3MgdG8gdGhlIHJlbW90ZSBzeXN0ZW0gd2FzIGRlbmllZC4gVXNlIE1BWCB0byBjaGVjayB0aGUgUmVtb3RlIERldmljZQ0KKyAqIEFjY2VzcyBzZXR0aW5ncyB1bmRlciBTb2Z0d2FyZT4+TkktUklPPj5OSS1SSU8gU2V0dGluZ3Mgb24gdGhlIHJlbW90ZSBzeXN0ZW0uDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19BY2Nlc3NEZW5pZWQgPSAtNjMwMzM7DQorDQorLyoqDQorICogVGhlIE5JLVJJTyBzb2Z0d2FyZSBvbiB0aGUgaG9zdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzb2Z0d2FyZSBvbiB0aGUNCisgKiB0YXJnZXQuIFVwZ3JhZGUgdGhlIE5JLVJJTyBzb2Z0d2FyZSBvbiB0aGUgaG9zdCBpbiBvcmRlciB0byBjb25uZWN0IHRvIHRoaXMNCisgKiB0YXJnZXQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19Ib3N0VmVyc2lvbk1pc21hdGNoID0gLTYzMDM4Ow0KKw0KKy8qKg0KKyAqIEEgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQgdG8gdGhlIHNwZWNpZmllZCByZW1vdGUgZGV2aWNlLiBFbnN1cmUNCisgKiB0aGF0IHRoZSBkZXZpY2UgaXMgb24gYW5kIGFjY2Vzc2libGUgb3ZlciB0aGUgbmV0d29yaywgdGhhdCBOSS1SSU8gc29mdHdhcmUNCisgKiBpcyBpbnN0YWxsZWQsIGFuZCB0aGF0IHRoZSBSSU8gc2VydmVyIGlzIHJ1bm5pbmcgYW5kIHByb3Blcmx5IGNvbmZpZ3VyZWQuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19ScGNDb25uZWN0aW9uRXJyb3IgPSAtNjMwNDA7DQorDQorLyoqDQorICogVGhlIFJQQyBzZXNzaW9uIGlzIGludmFsaWQuIFRoZSB0YXJnZXQgbWF5IGhhdmUgcmVzZXQgb3IgYmVlbiByZWJvb3RlZC4gQ2hlY2sNCisgKiB0aGUgbmV0d29yayBjb25uZWN0aW9uIGFuZCByZXRyeSB0aGUgb3BlcmF0aW9uLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfUnBjU2Vzc2lvbkVycm9yID0gLTYzMDQzOw0KKw0KKy8qKg0KKyAqIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGNvbXBsZXRlIGJlY2F1c2UgYW5vdGhlciBzZXNzaW9uIGlzIGFjY2Vzc2luZyB0aGUNCisgKiBGSUZPLiBDbG9zZSB0aGUgb3RoZXIgc2Vzc2lvbiBhbmQgcmV0cnkuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GaWZvUmVzZXJ2ZWQgPSAtNjMwODI7DQorDQorLyoqDQorICogQSBDb25maWd1cmUgRklGTywgU3RvcCBGSUZPLCBSZWFkIEZJRk8sIG9yIFdyaXRlIEZJRk8gZnVuY3Rpb24gd2FzIGNhbGxlZA0KKyAqIHdoaWxlIHRoZSBob3N0IGhhZCBhY3F1aXJlZCBlbGVtZW50cyBvZiB0aGUgRklGTy4gUmVsZWFzZSBhbGwgYWNxdWlyZWQNCisgKiBlbGVtZW50cyBiZWZvcmUgY29uZmlndXJpbmcsIHN0b3BwaW5nLCByZWFkaW5nLCBvciB3cml0aW5nLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRmlmb0VsZW1lbnRzQ3VycmVudGx5QWNxdWlyZWQgPSAtNjMwODM7DQorDQorLyoqDQorICogQSBmdW5jdGlvbiB3YXMgY2FsbGVkIHVzaW5nIGEgbWlzYWxpZ25lZCBhZGRyZXNzLiBUaGUgYWRkcmVzcyBtdXN0IGJlIGENCisgKiBtdWx0aXBsZSBvZiB0aGUgc2l6ZSBvZiB0aGUgZGF0YXR5cGUuDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19NaXNhbGlnbmVkQWNjZXNzID0gLTYzMDg0Ow0KKw0KKy8qKg0KKyAqIFRoZSBGUEdBIFJlYWQvV3JpdGUgQ29udHJvbCBGdW5jdGlvbiBpcyBhY2Nlc3NpbmcgYSBjb250cm9sIG9yIGluZGljYXRvcg0KKyAqIHdpdGggZGF0YSB0aGF0IGV4Y2VlZHMgdGhlIG1heGltdW0gc2l6ZSBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgdGFyZ2V0Lg0KKyAqIFJlZmVyIHRvIHRoZSBoYXJkd2FyZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbGltaXRhdGlvbnMgb24gZGF0YSB0eXBlcyBmb3INCisgKiB0aGlzIHRhcmdldC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0NvbnRyb2xPckluZGljYXRvclRvb0xhcmdlID0gLTYzMDg1Ow0KKw0KKy8qKg0KKyAqIEEgdmFsaWQgLmx2Yml0eCBiaXRmaWxlIGlzIHJlcXVpcmVkLiBJZiB5b3UgYXJlIHVzaW5nIGEgdmFsaWQgLmx2Yml0eA0KKyAqIGJpdGZpbGUsIHRoZSBiaXRmaWxlIG1heSBub3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzb2Z0d2FyZSB5b3UgYXJlIHVzaW5nLg0KKyAqIERldGVybWluZSB3aGljaCB2ZXJzaW9uIG9mIExhYlZJRVcgd2FzIHVzZWQgdG8gbWFrZSB0aGUgYml0ZmlsZSwgdXBkYXRlIHlvdXINCisgKiBzb2Z0d2FyZSB0byB0aGF0IHZlcnNpb24gb3IgbGF0ZXIsIGFuZCB0cnkgYWdhaW4uDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19CaXRmaWxlUmVhZEVycm9yID0gLTYzMTAxOw0KKw0KKy8qKg0KKyAqIFRoZSBzcGVjaWZpZWQgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgb2YgdGhlIGJpdGZpbGUuIElmIHRoZQ0KKyAqIGJpdGZpbGUgaGFzIGJlZW4gcmVjb21waWxlZCwgcmVnZW5lcmF0ZSB0aGUgQyBBUEkgYW5kIHJlYnVpbGQgdGhlDQorICogYXBwbGljYXRpb24uDQorICovDQorc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19TaWduYXR1cmVNaXNtYXRjaCA9IC02MzEwNjsNCisNCisvKioNCisgKiBUaGUgYml0ZmlsZSB5b3UgYXJlIHRyeWluZyB0byB1c2UgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZg0KKyAqIE5JLVJJTyBpbnN0YWxsZWQgb24gdGhlIHRhcmdldCBhbmQvb3IgdGhlIGhvc3QuIERldGVybWluZSB3aGljaCB2ZXJzaW9ucyBvZg0KKyAqIE5JLVJJTyBhbmQgTGFiVklFVyB3ZXJlIHVzZWQgdG8gbWFrZSB0aGUgYml0ZmlsZSwgdXBkYXRlIHRoZSBzb2Z0d2FyZSBvbiB0aGUNCisgKiB0YXJnZXQgYW5kIGhvc3QgdG8gdGhhdCB2ZXJzaW9uIG9yIGxhdGVyLCBhbmQgdHJ5IGFnYWluLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSW5jb21wYXRpYmxlQml0ZmlsZSA9IC02MzEwNzsNCisNCisvKioNCisgKiBFaXRoZXIgdGhlIHN1cHBsaWVkIHJlc291cmNlIG5hbWUgaXMgaW52YWxpZCBhcyBhIFJJTyByZXNvdXJjZSBuYW1lLCBvciB0aGUNCisgKiBkZXZpY2Ugd2FzIG5vdCBmb3VuZC4gVXNlIE1BWCB0byBmaW5kIHRoZSBwcm9wZXIgcmVzb3VyY2UgbmFtZSBmb3IgdGhlDQorICogaW50ZW5kZWQgZGV2aWNlLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSW52YWxpZFJlc291cmNlTmFtZSA9IC02MzE5MjsNCisNCisvKioNCisgKiBUaGUgcmVxdWVzdGVkIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZC4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZlYXR1cmVOb3RTdXBwb3J0ZWQgPSAtNjMxOTM7DQorDQorLyoqDQorICogVGhlIE5JLVJJTyBzb2Z0d2FyZSBvbiB0aGUgdGFyZ2V0IHN5c3RlbSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMNCisgKiBzb2Z0d2FyZS4gVXBncmFkZSB0aGUgTkktUklPIHNvZnR3YXJlIG9uIHRoZSB0YXJnZXQgc3lzdGVtLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfVmVyc2lvbk1pc21hdGNoID0gLTYzMTk0Ow0KKw0KKy8qKg0KKyAqIFRoZSBzZXNzaW9uIGlzIGludmFsaWQgb3IgaGFzIGJlZW4gY2xvc2VkLg0KKyAqLw0KK3N0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSW52YWxpZFNlc3Npb24gPSAtNjMxOTU7DQorDQorLyoqDQorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZW4gRlBHQSBzZXNzaW9ucyBoYXMgYmVlbiByZWFjaGVkLiBDbG9zZSBzb21lIG9wZW4NCisgKiBzZXNzaW9ucy4NCisgKi8NCitzdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX091dE9mSGFuZGxlcyA9IC02MzE5ODsNCisNCisvKioNCisgKiBUZXN0cyB3aGV0aGVyIGEgc3RhdHVzIGlzIGFuIGVycm9yLg0KKyAqDQorICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgdG8gY2hlY2sgZm9yIGFuIGVycm9yDQorICogQHJldHVybiB3aGV0aGVyIHRoZSBzdGF0dXMgd2FzIGFuIGVycm9yDQorICovDQorc3RhdGljIE5pRnBnYV9JbmxpbmUgTmlGcGdhX0Jvb2wgTmlGcGdhX0lzRXJyb3IoY29uc3QgTmlGcGdhX1N0YXR1cyBzdGF0dXMpDQorew0KKyAgIHJldHVybiBzdGF0dXMgPCBOaUZwZ2FfU3RhdHVzX1N1Y2Nlc3M7DQorfQ0KKw0KKy8qKg0KKyAqIFRlc3RzIHdoZXRoZXIgYSBzdGF0dXMgaXMgbm90IGFuIGVycm9yLiBTdWNjZXNzIGFuZCB3YXJuaW5ncyBhcmUgbm90IGVycm9ycy4NCisgKg0KKyAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIHRvIGNoZWNrIGZvciBhbiBlcnJvcg0KKyAqIEByZXR1cm4gd2hldGhlciB0aGUgc3RhdHVzIHdhcyBhIHN1Y2Nlc3Mgb3Igd2FybmluZw0KKyAqLw0KK3N0YXRpYyBOaUZwZ2FfSW5saW5lIE5pRnBnYV9Cb29sIE5pRnBnYV9Jc05vdEVycm9yKGNvbnN0IE5pRnBnYV9TdGF0dXMgc3RhdHVzKQ0KK3sNCisgICByZXR1cm4gc3RhdHVzID49IE5pRnBnYV9TdGF0dXNfU3VjY2VzczsNCit9DQorDQorLyoqDQorICogQ29uZGl0aW9uYWxseSBzZXRzIHRoZSBzdGF0dXMgdG8gYSBuZXcgdmFsdWUuIFRoZSBwcmV2aW91cyBzdGF0dXMgaXMNCisgKiBwcmVzZXJ2ZWQgdW5sZXNzIHRoZSBuZXcgc3RhdHVzIGlzIG1vcmUgb2YgYW4gZXJyb3IsIHdoaWNoIG1lYW5zIHRoYXQNCisgKiB3YXJuaW5ncyBhbmQgZXJyb3JzIG92ZXJ3cml0ZSBzdWNjZXNzZXMsIGFuZCBlcnJvcnMgb3ZlcndyaXRlIHdhcm5pbmdzLiBOZXcNCisgKiBlcnJvcnMgZG8gbm90IG92ZXJ3cml0ZSBvbGRlciBlcnJvcnMsIGFuZCBuZXcgd2FybmluZ3MgZG8gbm90IG92ZXJ3cml0ZQ0KKyAqIG9sZGVyIHdhcm5pbmdzLg0KKyAqDQorICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgdG8gY29uZGl0aW9uYWxseSBzZXQNCisgKiBAcGFyYW0gbmV3U3RhdHVzIG5ldyBzdGF0dXMgdmFsdWUgdGhhdCBtYXkgYmUgc2V0DQorICogQHJldHVybiB0aGUgcmVzdWx0aW5nIHN0YXR1cw0KKyAqLw0KK3N0YXRpYyBOaUZwZ2FfSW5saW5lIE5pRnBnYV9TdGF0dXMgTmlGcGdhX01lcmdlU3RhdHVzKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1N0YXR1cyogY29uc3Qgc3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmlGcGdhX1N0YXR1cyAgbmV3U3RhdHVzKQ0KK3sNCisgICBpZiAoIXN0YXR1cykNCisgICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyOw0KKyAgIGlmIChOaUZwZ2FfSXNOb3RFcnJvcigqc3RhdHVzKQ0KKyAgICYmICAoKnN0YXR1cyA9PSBOaUZwZ2FfU3RhdHVzX1N1Y2Nlc3MgfHwgTmlGcGdhX0lzRXJyb3IobmV3U3RhdHVzKSkpDQorICAgICAgKnN0YXR1cyA9IG5ld1N0YXR1czsNCisgICByZXR1cm4gKnN0YXR1czsNCit9DQorDQorLyoqDQorICogVGhpcyBtYWNybyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gb25seSBpZiB0aGUgc3RhdHVzIGlzIG5vdCBhbiBlcnJvci4gVGhlDQorICogZXhwcmVzc2lvbiBtdXN0IGV2YWx1YXRlIHRvIGFuIE5pRnBnYV9TdGF0dXMsIHN1Y2ggYXMgYSBjYWxsIHRvIGFueSBOaUZwZ2FfKg0KKyAqIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZSBzdGF0dXMgd2lsbCBiZSBzZXQgdG8gdGhlIHJldHVybmVkIHN0YXR1cyBpZiB0aGUNCisgKiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZC4NCisgKg0KKyAqIFlvdSBjYW4gdXNlIHRoaXMgbWFjcm8gdG8gbWltaWMgc3RhdHVzIGNoYWluaW5nIGluIExhYlZJRVcsIHdoZXJlIHRoZSBzdGF0dXMNCisgKiBkb2VzIG5vdCBoYXZlIHRvIGJlIGV4cGxpY2l0bHkgY2hlY2tlZCBhZnRlciBlYWNoIGNhbGwuIFN1Y2ggY29kZSBtYXkgbG9vaw0KKyAqIGxpa2UgdGhlIGZvbGxvd2luZyBleGFtcGxlLg0KKyAqDQorICogICAgTmlGcGdhX1N0YXR1cyBzdGF0dXMgPSBOaUZwZ2FfU3RhdHVzX1N1Y2Nlc3M7DQorICogICAgTmlGcGdhX0lmSXNOb3RFcnJvcihzdGF0dXMsIE5pRnBnYV9Xcml0ZVUzMiguLi4pKTsNCisgKiAgICBOaUZwZ2FfSWZJc05vdEVycm9yKHN0YXR1cywgTmlGcGdhX1dyaXRlVTMyKC4uLikpOw0KKyAqICAgIE5pRnBnYV9JZklzTm90RXJyb3Ioc3RhdHVzLCBOaUZwZ2FfV3JpdGVVMzIoLi4uKSk7DQorICoNCisgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyB0byBjaGVjayBmb3IgYW4gZXJyb3INCisgKiBAcGFyYW0gZXhwcmVzc2lvbiBleHByZXNzaW9uIHRvIGNhbGwgaWYgdGhlIGluY29taW5nIHN0YXR1cyBpcyBub3QgYW4gZXJyb3INCisgKi8NCisjZGVmaW5lIE5pRnBnYV9JZklzTm90RXJyb3Ioc3RhdHVzLCBleHByZXNzaW9uKSBcDQorICAgaWYgKE5pRnBnYV9Jc05vdEVycm9yKHN0YXR1cykpIFwNCisgICAgICBOaUZwZ2FfTWVyZ2VTdGF0dXMoJnN0YXR1cywgKGV4cHJlc3Npb24pKTsgXA0KKw0KKy8qKg0KKyAqIFlvdSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgYWxsIG90aGVyIGZ1bmN0aW9uIGNhbGxzLiBUaGlzIGZ1bmN0aW9uDQorICogbG9hZHMgdGhlIE5pRnBnYSBsaWJyYXJ5IHNvIHRoYXQgYWxsIHRoZSBvdGhlciBmdW5jdGlvbnMgd2lsbCB3b3JrLiBJZiB0aGlzDQorICogZnVuY3Rpb24gc3VjY2VlZHMsIHlvdSBtdXN0IGNhbGwgTmlGcGdhX0ZpbmFsaXplIGFmdGVyIGFsbCBvdGhlciBmdW5jdGlvbg0KKyAqIGNhbGxzLg0KKyAqDQorICogQHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuDQorICoNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0luaXRpYWxpemUodm9pZCk7DQorDQorLyoqDQorICogWW91IG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIGFsbCBvdGhlciBmdW5jdGlvbiBjYWxscyBpZg0KKyAqIE5pRnBnYV9Jbml0aWFsaXplIHN1Y2NlZWRzLiBUaGlzIGZ1bmN0aW9uIHVubG9hZHMgdGhlIE5pRnBnYSBsaWJyYXJ5Lg0KKyAqDQorICogQHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuDQorICoNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0ZpbmFsaXplKHZvaWQpOw0KKw0KKy8qKg0KKyAqIEEgaGFuZGxlIHRvIGFuIEZQR0Egc2Vzc2lvbi4NCisgKi8NCit0eXBlZGVmIHVpbnQzMl90IE5pRnBnYV9TZXNzaW9uOw0KKw0KKy8qKg0KKyAqIEF0dHJpYnV0ZXMgdGhhdCBOaUZwZ2FfT3BlbiBhY2NlcHRzLg0KKyAqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICBOaUZwZ2FfT3BlbkF0dHJpYnV0ZV9Ob1J1biA9IDENCit9IE5pRnBnYV9PcGVuQXR0cmlidXRlOw0KKw0KKy8qKg0KKyAqIE9wZW5zIGEgc2Vzc2lvbiB0byB0aGUgRlBHQS4gVGhpcyBjYWxsIGVuc3VyZXMgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlDQorICogYml0ZmlsZSBhcmUgcHJvZ3JhbW1lZCB0byB0aGUgRlBHQS4gVGhlIEZQR0EgcnVucyB1bmxlc3MgdGhlDQorICogTmlGcGdhX09wZW5BdHRyaWJ1dGVfTm9SdW4gYXR0cmlidXRlIGlzIHVzZWQuDQorICoNCisgKiBCZWNhdXNlIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBkZWZhdWx0IGN1cnJlbnQgd29ya2luZw0KKyAqIGRpcmVjdG9yaWVzIGZvciBhcHBsaWNhdGlvbnMsIHlvdSBtdXN0IHBhc3MgYW4gYWJzb2x1dGUgcGF0aCBmb3IgdGhlIGJpdGZpbGUNCisgKiBwYXJhbWV0ZXIuIElmIHlvdSBwYXNzIG9ubHkgdGhlIGZpbGVuYW1lIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aCwgdGhlDQorICogb3BlcmF0aW5nIHN5c3RlbSBtYXkgbm90IGJlIGFibGUgdG8gbG9jYXRlIHRoZSBiaXRmaWxlLiBGb3IgZXhhbXBsZSwgdGhlDQorICogZGVmYXVsdCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3JpZXMgYXJlIEM6XG5pLXJ0XHN5c3RlbVwgZm9yIFBoYXIgTGFwIEVUUyBhbmQNCisgKiAvYy8gZm9yIFZ4V29ya3MuIEJlY2F1c2UgdGhlIGdlbmVyYXRlZCAqX0JpdGZpbGUgY29uc3RhbnQgaXMgYSAjZGVmaW5lIHRvIGENCisgKiBzdHJpbmcgbGl0ZXJhbCwgeW91IGNhbiB1c2UgQy9DKysgc3RyaW5nLWxpdGVyYWwgY29uY2F0ZW5hdGlvbiB0byBmb3JtIGFuDQorICogYWJzb2x1dGUgcGF0aC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBiaXRmaWxlIGlzIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiBhDQorICogUGhhciBMYXAgRVRTIHN5c3RlbSwgcGFzcyB0aGUgZm9sbG93aW5nIGZvciB0aGUgYml0ZmlsZSBwYXJhbWV0ZXIuDQorICoNCisgKiAgICAiQzpcXCIgTmlGcGdhX015QXBwbGljYXRpb25fQml0ZmlsZQ0KKyAqDQorICogQHBhcmFtIGJpdGZpbGUgcGF0aCB0byB0aGUgYml0ZmlsZQ0KKyAqIEBwYXJhbSBzaWduYXR1cmUgc2lnbmF0dXJlIG9mIHRoZSBiaXRmaWxlDQorICogQHBhcmFtIHJlc291cmNlIFJJTyByZXNvdXJjZSBzdHJpbmcgdG8gb3BlbiAoIlJJTzAiIG9yICJyaW86Ly9teXN5c3RlbS9SSU8iKQ0KKyAqIEBwYXJhbSBhdHRyaWJ1dGUgYml0d2lzZSBPUiBvZiBhbnkgTmlGcGdhX09wZW5BdHRyaWJ1dGVzLCBvciAwDQorICogQHBhcmFtIHNlc3Npb24gb3V0cHV0cyB0aGUgc2Vzc2lvbiBoYW5kbGUsIHdoaWNoIG11c3QgYmUgY2xvc2VkIHdoZW4gbm8NCisgKiAgICAgICAgICAgICAgICBsb25nZXIgbmVlZGVkDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9PcGVuKGNvbnN0IGNoYXIqICAgICBiaXRmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgIHNpZ25hdHVyZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICByZXNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBhdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiogc2Vzc2lvbik7DQorDQorLyoqDQorICogQXR0cmlidXRlcyB0aGF0IE5pRnBnYV9DbG9zZSBhY2NlcHRzLg0KKyAqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICBOaUZwZ2FfQ2xvc2VBdHRyaWJ1dGVfTm9SZXNldElmTGFzdFNlc3Npb24gPSAxDQorfSBOaUZwZ2FfQ2xvc2VBdHRyaWJ1dGU7DQorDQorLyoqDQorICogQ2xvc2VzIHRoZSBzZXNzaW9uIHRvIHRoZSBGUEdBLiBUaGUgRlBHQSByZXNldHMgdW5sZXNzIGVpdGhlciBhbm90aGVyIHNlc3Npb24NCisgKiBpcyBzdGlsbCBvcGVuIG9yIHlvdSB1c2UgdGhlIE5pRnBnYV9DbG9zZUF0dHJpYnV0ZV9Ob1Jlc2V0SWZMYXN0U2Vzc2lvbg0KKyAqIGF0dHJpYnV0ZS4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gYXR0cmlidXRlIGJpdHdpc2UgT1Igb2YgYW55IE5pRnBnYV9DbG9zZUF0dHJpYnV0ZXMsIG9yIDANCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0Nsb3NlKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgYXR0cmlidXRlKTsNCisNCisvKioNCisgKiBBdHRyaWJ1dGVzIHRoYXQgTmlGcGdhX1J1biBhY2NlcHRzLg0KKyAqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICBOaUZwZ2FfUnVuQXR0cmlidXRlX1dhaXRVbnRpbERvbmUgPSAxDQorfSBOaUZwZ2FfUnVuQXR0cmlidXRlOw0KKw0KKy8qKg0KKyAqIFJ1bnMgdGhlIEZQR0EgVkkgb24gdGhlIHRhcmdldC4gSWYgeW91IHVzZSBOaUZwZ2FfUnVuQXR0cmlidXRlX1dhaXRVbnRpbERvbmUsDQorICogTmlGcGdhX1J1biBibG9ja3MgdGhlIHRocmVhZCB1bnRpbCB0aGUgRlBHQSBmaW5pc2hlcyBydW5uaW5nLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBhdHRyaWJ1dGUgYml0d2lzZSBPUiBvZiBhbnkgTmlGcGdhX1J1bkF0dHJpYnV0ZXMsIG9yIDANCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1J1bihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBhdHRyaWJ1dGUpOw0KKw0KKy8qKg0KKyAqIEFib3J0cyB0aGUgRlBHQSBWSS4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0Fib3J0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24pOw0KKw0KKy8qKg0KKyAqIFJlc2V0cyB0aGUgRlBHQSBWSS4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1Jlc2V0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24pOw0KKw0KKy8qKg0KKyAqIFJlLWRvd25sb2FkcyB0aGUgRlBHQSBiaXRzdHJlYW0gdG8gdGhlIHRhcmdldC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0Rvd25sb2FkKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24pOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGEgYm9vbGVhbiB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEJvb2woTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wqICAgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGEgc2lnbmVkIDgtYml0IGludGVnZXIgdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRJOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCogICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkVTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogUmVhZHMgYSBzaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRJMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZFUxNihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqICAgICAgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkSTMyKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRVMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBSZWFkcyBhIHNpZ25lZCA2NC1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEk2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogICAgICAgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkVTY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGEgYm9vbGVhbiB2YWx1ZSB0byBhIGdpdmVuIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUJvb2woTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wgICAgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyBhIHNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlSTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgICAgICAgICB2YWx1ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIHVuc2lnbmVkIDgtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVVOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBXcml0ZXMgYSBzaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVJMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBXcml0ZXMgYW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVVMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBXcml0ZXMgYSBzaWduZWQgMzItYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVJMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBXcml0ZXMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVVMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBXcml0ZXMgYSBzaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVJNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBXcml0ZXMgYW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQ0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVVNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAgICAgIHZhbHVlKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5IGluZGljYXRvciBvcg0KKyAqIGNvbnRyb2wuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5Qm9vbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wqICAgYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2Ygc2lnbmVkIDgtYml0IGludGVnZXIgdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheQ0KKyAqIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheUk4KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCogICAgICAgIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGFuIGVudGlyZSBhcnJheSBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkNCisgKiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlVOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiAgICAgICBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2Ygc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkNCisgKiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlJMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiAgICAgICBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkNCisgKiBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlVMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogICAgICBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5DQorICogaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5STMyKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogICAgICAgYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGFuIGVudGlyZSBhcnJheSBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5DQorICogaW5kaWNhdG9yIG9yIGNvbnRyb2wuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5VTMyKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqICAgICAgYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGFuIGVudGlyZSBhcnJheSBvZiBzaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheQ0KKyAqIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheUk2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqICAgICAgIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsNCisNCisvKioNCisgKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheQ0KKyAqIGluZGljYXRvciBvciBjb250cm9sLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheVU2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiAgICAgIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsNCisNCisvKioNCisgKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkgY29udHJvbCBvcg0KKyAqIGluZGljYXRvci4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcg0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheUJvb2woTmlGcGdhX1Nlc3Npb24gICAgIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmlGcGdhX0Jvb2wqIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICBzaXplKTsNCisNCisvKioNCisgKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5DQorICogY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3INCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlJOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QqICBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5DQorICogY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQ0KKyAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3INCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlVOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiBzaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkNCisgKiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcg0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheUkxNihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheQ0KKyAqIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5VTE2KE5pRnBnYV9TZXNzaW9uICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiBzaWduZWQgMzItYml0IGludGVnZXIgdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkNCisgKiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcg0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheUkzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheQ0KKyAqIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5VTMyKE5pRnBnYV9TZXNzaW9uICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiBzaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkNCisgKiBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlDQorICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlDQorICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcg0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheUk2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheQ0KKyAqIGNvbnRyb2wgb3IgaW5kaWNhdG9yLg0KKyAqDQorICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICBjb250cm9sIG9yIGluZGljYXRvci4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUNCisgKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5VTY0KE5pRnBnYV9TZXNzaW9uICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGNvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSk7DQorDQorLyoqDQorICogRW51bWVyYXRpb24gb2YgYWxsIDMyIHBvc3NpYmxlIElSUXMuIE11bHRpcGxlIElSUXMgY2FuIGJlIGJpdHdpc2UgT1JlZA0KKyAqIHRvZ2V0aGVyIGxpa2UgdGhpczoNCisgKg0KKyAqICAgIE5pRnBnYV9JcnFfMyB8IE5pRnBnYV9JcnFfMjMNCisgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgTmlGcGdhX0lycV8wICA9IDEgPDwgMCwNCisgICBOaUZwZ2FfSXJxXzEgID0gMSA8PCAxLA0KKyAgIE5pRnBnYV9JcnFfMiAgPSAxIDw8IDIsDQorICAgTmlGcGdhX0lycV8zICA9IDEgPDwgMywNCisgICBOaUZwZ2FfSXJxXzQgID0gMSA8PCA0LA0KKyAgIE5pRnBnYV9JcnFfNSAgPSAxIDw8IDUsDQorICAgTmlGcGdhX0lycV82ICA9IDEgPDwgNiwNCisgICBOaUZwZ2FfSXJxXzcgID0gMSA8PCA3LA0KKyAgIE5pRnBnYV9JcnFfOCAgPSAxIDw8IDgsDQorICAgTmlGcGdhX0lycV85ICA9IDEgPDwgOSwNCisgICBOaUZwZ2FfSXJxXzEwID0gMSA8PCAxMCwNCisgICBOaUZwZ2FfSXJxXzExID0gMSA8PCAxMSwNCisgICBOaUZwZ2FfSXJxXzEyID0gMSA8PCAxMiwNCisgICBOaUZwZ2FfSXJxXzEzID0gMSA8PCAxMywNCisgICBOaUZwZ2FfSXJxXzE0ID0gMSA8PCAxNCwNCisgICBOaUZwZ2FfSXJxXzE1ID0gMSA8PCAxNSwNCisgICBOaUZwZ2FfSXJxXzE2ID0gMSA8PCAxNiwNCisgICBOaUZwZ2FfSXJxXzE3ID0gMSA8PCAxNywNCisgICBOaUZwZ2FfSXJxXzE4ID0gMSA8PCAxOCwNCisgICBOaUZwZ2FfSXJxXzE5ID0gMSA8PCAxOSwNCisgICBOaUZwZ2FfSXJxXzIwID0gMSA8PCAyMCwNCisgICBOaUZwZ2FfSXJxXzIxID0gMSA8PCAyMSwNCisgICBOaUZwZ2FfSXJxXzIyID0gMSA8PCAyMiwNCisgICBOaUZwZ2FfSXJxXzIzID0gMSA8PCAyMywNCisgICBOaUZwZ2FfSXJxXzI0ID0gMSA8PCAyNCwNCisgICBOaUZwZ2FfSXJxXzI1ID0gMSA8PCAyNSwNCisgICBOaUZwZ2FfSXJxXzI2ID0gMSA8PCAyNiwNCisgICBOaUZwZ2FfSXJxXzI3ID0gMSA8PCAyNywNCisgICBOaUZwZ2FfSXJxXzI4ID0gMSA8PCAyOCwNCisgICBOaUZwZ2FfSXJxXzI5ID0gMSA8PCAyOSwNCisgICBOaUZwZ2FfSXJxXzMwID0gMSA8PCAzMCwNCisgICBOaUZwZ2FfSXJxXzMxID0gMVUgPDwgMzENCit9IE5pRnBnYV9JcnE7DQorDQorLyoqDQorICogUmVwcmVzZW50cyBhbiBpbmZpbml0ZSB0aW1lb3V0Lg0KKyAqLw0KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0ID0gMHhGRkZGRkZGRjsNCisNCisvKioNCisgKiBTZWUgTmlGcGdhX1Jlc2VydmVJcnFDb250ZXh0IGZvciBtb3JlIGluZm9ybWF0aW9uLg0KKyAqLw0KK3R5cGVkZWYgdm9pZCogTmlGcGdhX0lycUNvbnRleHQ7DQorDQorLyoqDQorICogSVJRIGNvbnRleHRzIGFyZSBzaW5nbGUtdGhyZWFkZWQ7IG9ubHkgb25lIHRocmVhZCBjYW4gd2FpdCB3aXRoIGENCisgKiBwYXJ0aWN1bGFyIGNvbnRleHQgYXQgYW55IGdpdmVuIHRpbWUuIFRvIG1pbmltaXplIGppdHRlciB3aGVuIGZpcnN0DQorICogd2FpdGluZyBvbiBJUlFzLCByZXNlcnZlIGFzIG1hbnkgY29udGV4dHMgYXMgdGhlIGFwcGxpY2F0aW9uDQorICogcmVxdWlyZXMuDQorICoNCisgKiBJZiBhIGNvbnRleHQgaXMgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkICh0aGUgcmV0dXJuZWQgc3RhdHVzIGlzIG5vdCBhbiBlcnJvciksDQorICogaXQgbXVzdCBiZSB1bnJlc2VydmVkIGxhdGVyLiBPdGhlcndpc2UgYSBtZW1vcnkgbGVhayB3aWxsIG9jY3VyLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250ZXh0IG91dHB1dHMgdGhlIElSUSBjb250ZXh0DQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZXNlcnZlSXJxQ29udGV4dChOaUZwZ2FfU2Vzc2lvbiAgICAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfSXJxQ29udGV4dCogY29udGV4dCk7DQorDQorLyoqDQorICogVW5yZXNlcnZlcyBhbiBJUlEgY29udGV4dCBvYnRhaW5lZCBmcm9tIE5pRnBnYV9SZXNlcnZlSXJxQ29udGV4dC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gY29udGV4dCBJUlEgY29udGV4dCB0byB1bnJlc2VydmUNCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1VucmVzZXJ2ZUlycUNvbnRleHQoTmlGcGdhX1Nlc3Npb24gICAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9JcnFDb250ZXh0IGNvbnRleHQpOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgYSBibG9ja2luZyBmdW5jdGlvbiB0aGF0IHN0b3BzIHRoZSBjYWxsaW5nIHRocmVhZCB1bnRpbCB0aGUNCisgKiBGUEdBIGFzc2VydHMgYW55IElSUSBpbiB0aGUgaXJxcyBwYXJhbWV0ZXIsIG9yIHVudGlsIHRoZSBmdW5jdGlvbg0KKyAqIGNhbGwgdGltZXMgb3V0LiAgQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdXNlDQorICogTmlGcGdhX1Jlc2VydmVJcnFDb250ZXh0IHRvIHJlc2VydmUgYW4gSVJRIGNvbnRleHQuIE5vIG90aGVyDQorICogdGhyZWFkcyBjYW4gdXNlIHRoZSBzYW1lIGNvbnRleHQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4NCisgKg0KKyAqIFlvdSBjYW4gdXNlIHRoZSBpcnFzQXNzZXJ0ZWQgcGFyYW1ldGVyIHRvIGRldGVybWluZSB3aGljaCBJUlFzIHdlcmUgYXNzZXJ0ZWQNCisgKiBmb3IgZWFjaCBmdW5jdGlvbiBjYWxsLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBjb250ZXh0IElSUSBjb250ZXh0IHdpdGggd2hpY2ggdG8gd2FpdA0KKyAqIEBwYXJhbSBpcnFzIGJpdHdpc2UgT1Igb2YgTmlGcGdhX0lycXMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBpcnFzQXNzZXJ0ZWQgaWYgbm9uLU5VTEwsIG91dHB1dHMgYml0d2lzZSBPUiBvZiBJUlFzIHRoYXQgd2VyZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ZWQNCisgKiBAcGFyYW0gdGltZWRPdXQgaWYgbm9uLU5VTEwsIG91dHB1dHMgd2hldGhlciB0aGUgdGltZW91dCBleHBpcmVkDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9XYWl0T25JcnFzKE5pRnBnYV9TZXNzaW9uICAgIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfSXJxQ29udGV4dCBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgaXJxcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogICAgICAgICBpcnFzQXNzZXJ0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfQm9vbCogICAgICB0aW1lZE91dCk7DQorDQorLyoqDQorICogQWNrbm93bGVkZ2VzIGFuIElSUSBvciBzZXQgb2YgSVJRcy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gaXJxcyBiaXR3aXNlIE9SIG9mIE5pRnBnYV9JcnFzDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY2tub3dsZWRnZUlycXMoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaXJxcyk7DQorDQorLyoqDQorICogU3BlY2lmaWVzIHRoZSBkZXB0aCBvZiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8uIFRoaXMgbWV0aG9kIGlzDQorICogb3B0aW9uYWwuIEluIG9yZGVyIHRvIHNlZSB0aGUgYWN0dWFsIGRlcHRoIGNvbmZpZ3VyZWQsIHVzZQ0KKyAqIE5pRnBnYV9Db25maWd1cmVGaWZvMi4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBGSUZPIHRvIGNvbmZpZ3VyZQ0KKyAqIEBwYXJhbSBkZXB0aCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZQ0KKyAqICAgICAgICAgICAgICBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQ29uZmlndXJlRmlmbyhOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGRlcHRoKTsNCisNCisvKioNCisgKiBTcGVjaWZpZXMgdGhlIGRlcHRoIG9mIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTy4gVGhpcyBtZXRob2QgaXMNCisgKiBvcHRpb25hbC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBGSUZPIHRvIGNvbmZpZ3VyZQ0KKyAqIEBwYXJhbSByZXF1ZXN0ZWREZXB0aCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0DQorICogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBETUEgRklGTw0KKyAqIEBwYXJhbSBhY3R1YWxEZXB0aCBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUNCisgKiAgICAgICAgICAgICAgICAgICAgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8sIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4NCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0NvbmZpZ3VyZUZpZm8yKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICByZXF1ZXN0ZWREZXB0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBhY3R1YWxEZXB0aCk7DQorDQorLyoqDQorICogU3RhcnRzIGEgRklGTy4gVGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gRklGTyB0byBzdGFydA0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhcnRGaWZvKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8pOw0KKw0KKy8qKg0KKyAqIFN0b3BzIGEgRklGTy4gVGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gRklGTyB0byBzdG9wDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdG9wRmlmbyhOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8pOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIGJvb2xlYW5zLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvQm9vbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfQm9vbCogICBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2Ygc2lnbmVkIDgtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvSTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqICAgICAgICBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZGF0YSBvdXRwdXRzIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZA0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9VOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqICAgICAgIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBSZWFkcyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBzaWduZWQgMTYtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvSTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiAgICAgICBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgMTYtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvVTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogICAgICBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2Ygc2lnbmVkIDMyLWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb0kzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogICAgICAgZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZA0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb1UzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqICAgICAgZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZGF0YSBvdXRwdXRzIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZA0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9JNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqICAgICAgIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBSZWFkcyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZGF0YSBvdXRwdXRzIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZA0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9VNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiAgICAgIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIGJvb2xlYW5zLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5DQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9Cb29sKE5pRnBnYV9TZXNzaW9uICAgICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOaUZwZ2FfQm9vbCogZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBzaWduZWQgOC1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gd3JpdGUNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbXB0eUVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZW1wdHkNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlRmlmb0k4KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QqICBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5DQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9VOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBzaWduZWQgMTYtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5DQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9JMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gd3JpdGUNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbXB0eUVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZW1wdHkNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlRmlmb1UxNihOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gd3JpdGUNCisgKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbXB0eUVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZW1wdHkNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlRmlmb0kzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90KiBkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQ0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvVTMyKE5pRnBnYV9TZXNzaW9uICBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQ0KKyAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQ0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvSTY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIFdyaXRlcyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgdW5zaWduZWQgNjQtYml0IGludGVnZXJzLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlDQorICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5DQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9VNjQoTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG51bWJlck9mRWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgYm9vbGVhbnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5DQorICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlDQorICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvDQorICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzDQorICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUNCisgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsDQorICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPDQorICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzQm9vbCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wqKiAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3IgcmVhZGluZyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBzaWduZWQgOC1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkNCisgKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUNCisgKiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYmVmb3JlIHJlYWRpbmcuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3Qgd3JpdGUgdG8NCisgKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMNCisgKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQ0KKyAqIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwNCisgKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8NCisgKiBlbGVtZW50cyBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNJOCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90KiogICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3IgcmVhZGluZyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiB1bnNpZ25lZCA4LWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCByZWFkaW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gY29weQ0KKyAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQ0KKyAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bw0KKyAqIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cw0KKyAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlDQorICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiByZXF1ZXN0ZWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbA0KKyAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTw0KKyAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1JlYWRFbGVtZW50c1U4KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiAgICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCAxNi1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkNCisgKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUNCisgKiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYmVmb3JlIHJlYWRpbmcuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3Qgd3JpdGUgdG8NCisgKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMNCisgKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQ0KKyAqIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwNCisgKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8NCisgKiBlbGVtZW50cyBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNJMTYoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCoqICAgICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgMTYtYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5DQorICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlDQorICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvDQorICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzDQorICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUNCisgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsDQorICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPDQorICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzVTE2KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiAgIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqKiAgICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCAzMi1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkNCisgKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUNCisgKiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYmVmb3JlIHJlYWRpbmcuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3Qgd3JpdGUgdG8NCisgKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMNCisgKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQ0KKyAqIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwNCisgKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8NCisgKiBlbGVtZW50cyBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNJMzIoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCoqICAgICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgMzItYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5DQorICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlDQorICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvDQorICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzDQorICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUNCisgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsDQorICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPDQorICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzVTMyKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiAgIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKiAgICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCA2NC1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkNCisgKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUNCisgKiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYmVmb3JlIHJlYWRpbmcuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3Qgd3JpdGUgdG8NCisgKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMNCisgKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQ0KKyAqIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwNCisgKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8NCisgKiBlbGVtZW50cyBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZA0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNJNjQoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCoqICAgICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgNjQtYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5DQorICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlDQorICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvDQorICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzDQorICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUNCisgKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsDQorICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPDQorICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzVTY0KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiAgIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqKiAgICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBib29sZWFucy4NCisgKg0KKyAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlDQorICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZg0KKyAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cw0KKyAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcg0KKyAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcg0KKyAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkDQorICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c0Jvb2woDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9Cb29sKiogIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCA4LWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUNCisgKiBmaXJzdCBpbnRvIGEgc2VwYXJhdGUgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mDQorICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzDQorICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyDQorICogd3JpdGluZyB0byB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyDQorICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQNCisgKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkDQorICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzDQorICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzSTgoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCoqICAgICAgIGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7DQorDQorLyoqDQorICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHVuc2lnbmVkIDgtYml0DQorICogaW50ZWdlcnMuDQorICoNCisgKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQ0KKyAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YNCisgKiBlbGVtZW50cyB0byB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMNCisgKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXINCisgKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXINCisgKiBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZA0KKyAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQNCisgKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMNCisgKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4NCisgKg0KKyAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24NCisgKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlDQorICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZA0KKyAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQNCisgKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXINCisgKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNVOCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqICAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2lnbmVkIDE2LWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUNCisgKiBmaXJzdCBpbnRvIGEgc2VwYXJhdGUgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mDQorICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzDQorICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyDQorICogd3JpdGluZyB0byB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyDQorICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQNCisgKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkDQorICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzDQorICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzSTE2KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiogICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCAxNi1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlDQorICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZg0KKyAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cw0KKyAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcg0KKyAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcg0KKyAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkDQorICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c1UxNigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqKiAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2lnbmVkIDMyLWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUNCisgKiBmaXJzdCBpbnRvIGEgc2VwYXJhdGUgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mDQorICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzDQorICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyDQorICogd3JpdGluZyB0byB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyDQorICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQNCisgKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkDQorICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzDQorICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzSTMyKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiogICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCAzMi1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlDQorICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZg0KKyAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cw0KKyAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcg0KKyAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcg0KKyAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkDQorICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c1UzMigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKiAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2lnbmVkIDY0LWJpdA0KKyAqIGludGVnZXJzLg0KKyAqDQorICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUNCisgKiBmaXJzdCBpbnRvIGEgc2VwYXJhdGUgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mDQorICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzDQorICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyDQorICogd3JpdGluZyB0byB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyDQorICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQNCisgKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkDQorICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzDQorICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQ0KKyAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQNCisgKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cw0KKyAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0DQorICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlDQorICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyDQorICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTw0KKyAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsDQorICovDQorTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzSTY0KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiogICAgICBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOw0KKw0KKy8qKg0KKyAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCA2NC1iaXQNCisgKiBpbnRlZ2Vycy4NCisgKg0KKyAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlDQorICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZg0KKyAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cw0KKyAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcg0KKyAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcg0KKyAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkDQorICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUNCisgKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkDQorICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMNCisgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dA0KKyAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcg0KKyAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzDQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8NCisgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAqLw0KK05pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c1U2NCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqKiAgICAgZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsNCisNCisvKioNCisgKiBSZWxlYXNlcyBwcmV2aW91c2x5IGFjcXVpcmVkIEZJRk8gZWxlbWVudHMuDQorICoNCisgKiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlDQorICogaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXIgYWNxdWlyaW5nIHRoZW0uIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZA0KKyAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cw0KKyAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLg0KKyAqDQorICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbg0KKyAqIEBwYXJhbSBmaWZvIEZJRk8gZnJvbSB3aGljaCB0byByZWxlYXNlIGVsZW1lbnRzDQorICogQHBhcmFtIGVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWxlYXNlDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWxlYXNlRmlmb0VsZW1lbnRzKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHMpOw0KKw0KKy8qKg0KKyAqIEdldHMgYW4gZW5kcG9pbnQgcmVmZXJlbmNlIHRvIGEgcGVlci10by1wZWVyIEZJRk8uDQorICoNCisgKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uDQorICogQHBhcmFtIGZpZm8gcGVlci10by1wZWVyIEZJRk8NCisgKiBAcGFyYW0gZW5kcG9pbnQgb3V0cHV0cyB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlDQorICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwNCisgKi8NCitOaUZwZ2FfU3RhdHVzIE5pRnBnYV9HZXRQZWVyVG9QZWVyRmlmb0VuZHBvaW50KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqICAgICAgZW5kcG9pbnQpOw0KKw0KKyNpZiBOaUZwZ2FfQ3BwDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvbkludGVyZmFjZUdsb2JhbHMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvbkludGVyZmFjZUdsb2JhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQwN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uSW52YXJpYW50RlBHQU5hbWVzcGFjZS9uSW50ZXJmYWNlR2xvYmFscy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ19DMEVGXzFfMV8wX25JbnRlcmZhY2VHbG9iYWxzX2hfXw0KKyNkZWZpbmUgX19uRlJDX0MwRUZfMV8xXzBfbkludGVyZmFjZUdsb2JhbHNfaF9fDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDX0MwRUZfMV8xXzANCit7DQorICAgZXh0ZXJuIHVuc2lnbmVkIGludCBnX2N1cnJlbnRUYXJnZXRDbGFzczsNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfQzBFRl8xXzFfMF9uSW50ZXJmYWNlR2xvYmFsc19oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25JbnZhcmlhbnRGUEdBTmFtZXNwYWNlL3RBSS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uSW52YXJpYW50RlBHQU5hbWVzcGFjZS90QUkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDEyMWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uSW52YXJpYW50RlBHQU5hbWVzcGFjZS90QUkuaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfQzBFRl8xXzFfMF9BSV9oX18NCisjZGVmaW5lIF9fbkZSQ19DMEVGXzFfMV8wX0FJX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDX0MwRUZfMV8xXzANCit7DQorDQorY2xhc3MgdEFJDQorew0KK3B1YmxpYzoNCisgICB0QUkoKXt9DQorICAgdmlydHVhbCB+dEFJKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0QUkqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDIsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENhbE9LX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ2FsT0sodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHREb25lVGltZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkRG9uZVRpbWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtT2Zmc2V0UmVnaXN0ZXJzID0gOCwNCisgICB9IHRPZmZzZXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRPZmZzZXQodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bUxTQldlaWdodFJlZ2lzdGVycyA9IDgsDQorICAgfSB0TFNCV2VpZ2h0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRMU0JXZWlnaHQodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBSShjb25zdCB0QUkmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QUkmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ19DMEVGXzFfMV8wX0FJX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvdEdsb2JhbC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uSW52YXJpYW50RlBHQU5hbWVzcGFjZS90R2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3NDExNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvbkludmFyaWFudEZQR0FOYW1lc3BhY2UvdEdsb2JhbC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ19DMEVGXzFfMV8wX0dsb2JhbF9oX18NCisjZGVmaW5lIF9fbkZSQ19DMEVGXzFfMV8wX0dsb2JhbF9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ19DMEVGXzFfMV8wDQorew0KKw0KK2NsYXNzIHRHbG9iYWwNCit7DQorcHVibGljOg0KKyAgIHRHbG9iYWwoKXt9DQorICAgdmlydHVhbCB+dEdsb2JhbCgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEdsb2JhbCogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFZlcnNpb25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVmVyc2lvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExvY2FsVGltZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkTG9jYWxUaW1lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmV2aXNpb25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFJldmlzaW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVzZXJ2ZWRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRSZXNlcnZlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0R2xvYmFsKGNvbnN0IHRHbG9iYWwmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0R2xvYmFsJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfQzBFRl8xXzFfMF9HbG9iYWxfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uSW52YXJpYW50RlBHQU5hbWVzcGFjZS90TG9hZE91dC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uSW52YXJpYW50RlBHQU5hbWVzcGFjZS90TG9hZE91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzRlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25JbnZhcmlhbnRGUEdBTmFtZXNwYWNlL3RMb2FkT3V0LmgKQEAgLTAsMCArMSw3OSBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDX0MwRUZfMV8xXzBfTG9hZE91dF9oX18NCisjZGVmaW5lIF9fbkZSQ19DMEVGXzFfMV8wX0xvYWRPdXRfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfQzBFRl8xXzFfMA0KK3sNCisNCitjbGFzcyB0TG9hZE91dA0KK3sNCitwdWJsaWM6DQorICAgdExvYWRPdXQoKXt9DQorICAgdmlydHVhbCB+dExvYWRPdXQoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRMb2FkT3V0KiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVhZHlfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCBib29sIHJlYWRSZWFkeSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERvbmVUaW1lX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWREb25lVGltZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1WZW5kb3JJRFJlZ2lzdGVycyA9IDgsDQorICAgfSB0VmVuZG9ySURfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVmVuZG9ySUQodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVNlcmlhbE51bWJlclJlZ2lzdGVycyA9IDgsDQorICAgfSB0U2VyaWFsTnVtYmVyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRTZXJpYWxOdW1iZXIodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bU1vZHVsZUlEUmVnaXN0ZXJzID0gOCwNCisgICB9IHRNb2R1bGVJRF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRNb2R1bGVJRCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdExvYWRPdXQoY29uc3QgdExvYWRPdXQmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0TG9hZE91dCYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDX0MwRUZfMV8xXzBfTG9hZE91dF9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvbkludGVyZmFjZUdsb2JhbHMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS9uSW50ZXJmYWNlR2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZjVhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvbkludGVyZmFjZUdsb2JhbHMuaApAQCAtMCwwICsxLDE1IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9uSW50ZXJmYWNlR2xvYmFsc19oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX25JbnRlcmZhY2VHbG9iYWxzX2hfXw0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKyAgIGV4dGVybiB1bnNpZ25lZCBpbnQgZ19jdXJyZW50VGFyZ2V0Q2xhc3M7DQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTVfMV8wX0FfbkludGVyZmFjZUdsb2JhbHNfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBSS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOGY2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFJLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0FJX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfQUlfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0QUkNCit7DQorcHVibGljOg0KKyAgIHRBSSgpe30NCisgICB2aXJ0dWFsIH50QUkoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBSSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgU2NhblNpemUgOiAzOw0KKyAgICAgICAgIHVuc2lnbmVkIENvbnZlcnRSYXRlIDogMjY7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBDb252ZXJ0UmF0ZSA6IDI2Ow0KKyAgICAgICAgIHVuc2lnbmVkIFNjYW5TaXplIDogMzsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDI5Ow0KKyAgICAgIH07DQorICAgfSB0Q29uZmlnOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIENoYW5uZWwgOiAzOw0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VkIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VkIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBDaGFubmVsIDogMzsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDQ7DQorICAgICAgfTsNCisgICB9IHRSZWFkU2VsZWN0Ow0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU2NhblNpemUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Db252ZXJ0UmF0ZSh1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfU2NhblNpemUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRDb25maWdfQ29udmVydFJhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRMb29wVGltaW5nX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRMb29wVGltaW5nKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bU92ZXJzYW1wbGVCaXRzRWxlbWVudHMgPSA4LA0KKyAgIH0gdE92ZXJzYW1wbGVCaXRzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZU92ZXJzYW1wbGVCaXRzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZE92ZXJzYW1wbGVCaXRzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bUF2ZXJhZ2VCaXRzRWxlbWVudHMgPSA4LA0KKyAgIH0gdEF2ZXJhZ2VCaXRzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUF2ZXJhZ2VCaXRzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEF2ZXJhZ2VCaXRzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVNjYW5MaXN0RWxlbWVudHMgPSA4LA0KKyAgIH0gdFNjYW5MaXN0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNjYW5MaXN0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFNjYW5MaXN0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TGF0Y2hPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZUxhdGNoT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVhZFNlbGVjdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVSZWFkU2VsZWN0KHRSZWFkU2VsZWN0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlUmVhZFNlbGVjdF9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVSZWFkU2VsZWN0X0F2ZXJhZ2VkKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRSZWFkU2VsZWN0IHJlYWRSZWFkU2VsZWN0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFJlYWRTZWxlY3RfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRSZWFkU2VsZWN0X0F2ZXJhZ2VkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBSShjb25zdCB0QUkmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QUkmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0FJX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QU8uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QU8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTYwZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBTy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0FPX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfQU9faF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0QU8NCit7DQorcHVibGljOg0KKyAgIHRBTygpe30NCisgICB2aXJ0dWFsIH50QU8oKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBTyogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1NWFBSZWdpc3RlcnMgPSAyLA0KKyAgIH0gdE1YUF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVNWFAodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkTVhQKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorcHJpdmF0ZToNCisgICB0QU8oY29uc3QgdEFPJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFPJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxNV8xXzBfQV9BT19oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY2VsLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY2VsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzMThkZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWNjZWwuaApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfQWNjZWxfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9BY2NlbF9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRBY2NlbA0KK3sNCitwdWJsaWM6DQorICAgdEFjY2VsKCl7fQ0KKyAgIHZpcnR1YWwgfnRBY2NlbCgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEFjY2VsKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0U1RBVF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFNUQVQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDTlRSX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNOVFIodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ05UUih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERBVE9fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlREFUTyh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWREQVRPKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q05GR19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDTkZHKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENORkcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDTlRMX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNOVEwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ05UTCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERBVElfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWREQVRJKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0R09fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZUdPKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0QUREUl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVBRERSKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEFERFIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdEFjY2VsKGNvbnN0IHRBY2NlbCYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRBY2NlbCYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTVfMV8wX0FfQWNjZWxfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBY2N1bXVsYXRvci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBY2N1bXVsYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MWM1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY3VtdWxhdG9yLmgKQEAgLTAsMCArMSw4NyBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfQWNjdW11bGF0b3JfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9BY2N1bXVsYXRvcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRBY2N1bXVsYXRvcg0KK3sNCitwdWJsaWM6DQorICAgdEFjY3VtdWxhdG9yKCl7fQ0KKyAgIHZpcnR1YWwgfnRBY2N1bXVsYXRvcigpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEFjY3VtdWxhdG9yKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAyLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgc2lnbmVkIGxvbmcgbG9uZyBWYWx1ZTsNCisgICAgICAgICB1bnNpZ25lZCBDb3VudCA6IDMyOw0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUyIDogMzI7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUzIDogMzI7DQorICAgICAgfTsNCisgICB9IHRPdXRwdXQ7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgbG9uZyBsb25nIHJlYWRPdXRwdXRfVmFsdWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRPdXRwdXRfQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDZW50ZXJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2VudGVyKHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZENlbnRlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERlYWRiYW5kX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURlYWRiYW5kKHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZERlYWRiYW5kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVzZXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBY2N1bXVsYXRvcihjb25zdCB0QWNjdW11bGF0b3ImKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QWNjdW11bGF0b3ImKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0FjY3VtdWxhdG9yX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWxhcm0uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWxhcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzM5NDA1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBbGFybS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0FsYXJtX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfQWxhcm1faF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0QWxhcm0NCit7DQorcHVibGljOg0KKyAgIHRBbGFybSgpe30NCisgICB2aXJ0dWFsIH50QWxhcm0oKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBbGFybSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEVuYWJsZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRW5hYmxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VHJpZ2dlclRpbWVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlVHJpZ2dlclRpbWUodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRyaWdnZXJUaW1lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBbGFybShjb25zdCB0QWxhcm0mKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QWxhcm0mKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0FsYXJtX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QW5hbG9nVHJpZ2dlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBbmFsb2dUcmlnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4OWJjMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QW5hbG9nVHJpZ2dlci5oCkBAIC0wLDAgKzEsMTI5IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9BbmFsb2dUcmlnZ2VyX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfQW5hbG9nVHJpZ2dlcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRBbmFsb2dUcmlnZ2VyDQorew0KK3B1YmxpYzoNCisgICB0QW5hbG9nVHJpZ2dlcigpe30NCisgICB2aXJ0dWFsIH50QW5hbG9nVHJpZ2dlcigpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEFuYWxvZ1RyaWdnZXIqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDgsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgSW5IeXN0ZXJlc2lzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBPdmVyTGltaXQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFJpc2luZyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmFsbGluZyA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmcgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE92ZXJMaW1pdCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5IeXN0ZXJlc2lzIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDQ7DQorICAgICAgfTsNCisgICB9IHRPdXRwdXQ7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgQ2hhbm5lbCA6IDM7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZWQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZpbHRlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmxvYXRpbmdSb2xsb3ZlciA6IDE7DQorICAgICAgICAgc2lnbmVkIFJvbGxvdmVyTGltaXQgOiA4Ow0KKyNlbHNlDQorICAgICAgICAgc2lnbmVkIFJvbGxvdmVyTGltaXQgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIEZsb2F0aW5nUm9sbG92ZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZpbHRlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZWQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIENoYW5uZWwgOiAzOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMTQ7DQorICAgICAgfTsNCisgICB9IHRTb3VyY2VTZWxlY3Q7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFNvdXJjZVNlbGVjdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3QodFNvdXJjZVNlbGVjdCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfQXZlcmFnZWQoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9GaWx0ZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9GbG9hdGluZ1JvbGxvdmVyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfUm9sbG92ZXJMaW1pdChzaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRTb3VyY2VTZWxlY3QgcmVhZFNvdXJjZVNlbGVjdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTb3VyY2VTZWxlY3RfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRTb3VyY2VTZWxlY3RfQXZlcmFnZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU291cmNlU2VsZWN0X0ZpbHRlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRTb3VyY2VTZWxlY3RfRmxvYXRpbmdSb2xsb3Zlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgc2hvcnQgcmVhZFNvdXJjZVNlbGVjdF9Sb2xsb3ZlckxpbWl0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VXBwZXJMaW1pdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVVcHBlckxpbWl0KHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZFVwcGVyTGltaXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRMb3dlckxpbWl0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUxvd2VyTGltaXQoc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkTG93ZXJMaW1pdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1PdXRwdXRFbGVtZW50cyA9IDgsDQorICAgfSB0T3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdE91dHB1dCByZWFkT3V0cHV0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9Jbkh5c3RlcmVzaXModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkT3V0cHV0X092ZXJMaW1pdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfUmlzaW5nKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9GYWxsaW5nKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBbmFsb2dUcmlnZ2VyKGNvbnN0IHRBbmFsb2dUcmlnZ2VyJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFuYWxvZ1RyaWdnZXImKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0FuYWxvZ1RyaWdnZXJfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RCSVNULmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEJJU1QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI4NjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RCSVNULmgKQEAgLTAsMCArMSw5MCBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfQklTVF9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0JJU1RfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0QklTVA0KK3sNCitwdWJsaWM6DQorICAgdEJJU1QoKXt9DQorICAgdmlydHVhbCB+dEJJU1QoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRCSVNUKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RE8wU3F1YXJlVGlja3NfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE8wU3F1YXJlVGlja3ModW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZERPMFNxdWFyZVRpY2tzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RW5hYmxlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUVuYWJsZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRFbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRETzFTcXVhcmVFbmFibGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE8xU3F1YXJlRW5hYmxlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZERPMVNxdWFyZUVuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERPMFNxdWFyZUVuYWJsZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVETzBTcXVhcmVFbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRE8wU3F1YXJlRW5hYmxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RE8xU3F1YXJlVGlja3NfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE8xU3F1YXJlVGlja3ModW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZERPMVNxdWFyZVRpY2tzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bURPUmVnaXN0ZXJzID0gMiwNCisgICB9IHRET19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVETyh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRE8odW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCitwcml2YXRlOg0KKyAgIHRCSVNUKGNvbnN0IHRCSVNUJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEJJU1QmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0JJU1RfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RDb3VudGVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdENvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZmNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RDb3VudGVyLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0NvdW50ZXJfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9Db3VudGVyX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdENvdW50ZXINCit7DQorcHVibGljOg0KKyAgIHRDb3VudGVyKCl7fQ0KKyAgIHZpcnR1YWwgfnRDb3VudGVyKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0Q291bnRlciogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gOCwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBEaXJlY3Rpb24gOiAxOw0KKyAgICAgICAgIHNpZ25lZCBWYWx1ZSA6IDMxOw0KKyNlbHNlDQorICAgICAgICAgc2lnbmVkIFZhbHVlIDogMzE7DQorICAgICAgICAgdW5zaWduZWQgRGlyZWN0aW9uIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0T3V0cHV0Ow0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBEb3duU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4QWN0aXZlSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhFZGdlU2Vuc2l0aXZlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcFJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVwRmFsbGluZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25SaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEb3duRmFsbGluZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE1vZGUgOiAyOw0KKyAgICAgICAgIHVuc2lnbmVkIFB1bHNlTGVuZ3RoVGhyZXNob2xkIDogNjsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFB1bHNlTGVuZ3RoVGhyZXNob2xkIDogNjsNCisgICAgICAgICB1bnNpZ25lZCBNb2RlIDogMjsNCisgICAgICAgICB1bnNpZ25lZCBEb3duRmFsbGluZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25SaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcEZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcFJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4RWRnZVNlbnNpdGl2ZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhBY3RpdmVIaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgVXBTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9DaGFubmVsIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0Q29uZmlnOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDIzOw0KKyAgICAgICAgIHNpZ25lZCBDb3VudCA6IDg7DQorICAgICAgICAgdW5zaWduZWQgU3RhbGxlZCA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbGVkIDogMTsNCisgICAgICAgICBzaWduZWQgQ291bnQgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDIzOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRUaW1lck91dHB1dDsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbFBlcmlvZCA6IDI0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VTaXplIDogNzsNCisgICAgICAgICB1bnNpZ25lZCBVcGRhdGVXaGVuRW1wdHkgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgVXBkYXRlV2hlbkVtcHR5IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlU2l6ZSA6IDc7DQorICAgICAgICAgdW5zaWduZWQgU3RhbGxQZXJpb2QgOiAyNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0VGltZXJDb25maWc7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfRGlyZWN0aW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZE91dHB1dF9WYWx1ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWcodENvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcFNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleEFjdGl2ZUhpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleEVkZ2VTZW5zaXRpdmUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcFJpc2luZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcEZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRG93blJpc2luZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Eb3duRmFsbGluZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Nb2RlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfUHVsc2VMZW5ndGhUaHJlc2hvbGQodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfVXBTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfVXBTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19VcFNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19Eb3duU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0Rvd25Tb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Eb3duU291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0luZGV4U291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0luZGV4U291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhBY3RpdmVIaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19JbmRleEVkZ2VTZW5zaXRpdmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1VwUmlzaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfVXBGYWxsaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRG93blJpc2luZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0Rvd25GYWxsaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfTW9kZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkQ29uZmlnX1B1bHNlTGVuZ3RoVGhyZXNob2xkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZXJPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0VGltZXJPdXRwdXQgcmVhZFRpbWVyT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXJPdXRwdXRfUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBjaGFyIHJlYWRUaW1lck91dHB1dF9Db3VudCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRUaW1lck91dHB1dF9TdGFsbGVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVzZXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZXJDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWcodFRpbWVyQ29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfU3RhbGxQZXJpb2QodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfQXZlcmFnZVNpemUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0VGltZXJDb25maWcgcmVhZFRpbWVyQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXJDb25maWdfU3RhbGxQZXJpb2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkVGltZXJDb25maWdfQXZlcmFnZVNpemUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJDb25maWdfVXBkYXRlV2hlbkVtcHR5KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRDb3VudGVyKGNvbnN0IHRDb3VudGVyJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdENvdW50ZXImKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0NvdW50ZXJfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RESU8uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RElPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5NjU5YgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RElPLmgKQEAgLTAsMCArMSwyNDggQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0RJT19oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0RJT19oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRESU8NCit7DQorcHVibGljOg0KKyAgIHRESU8oKXt9DQorICAgdmlydHVhbCB+dERJTygpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdERJTyogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOw0KKyAgICAgICAgIHVuc2lnbmVkIFJlc2VydmVkIDogNjsNCisgICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIE1YUCA6IDE2Ow0KKyAgICAgICAgIHVuc2lnbmVkIFJlc2VydmVkIDogNjsNCisgICAgICAgICB1bnNpZ25lZCBIZWFkZXJzIDogMTA7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdERPOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsNCisgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsNCisgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRPdXRwdXRFbmFibGU7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOw0KKyAgICAgICAgIHVuc2lnbmVkIFJlc2VydmVkIDogNjsNCisgICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIE1YUCA6IDE2Ow0KKyAgICAgICAgIHVuc2lnbmVkIFJlc2VydmVkIDogNjsNCisgICAgICAgICB1bnNpZ25lZCBIZWFkZXJzIDogMTA7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdFB1bHNlOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsNCisgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsNCisgICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRESTsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RE9fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE8odERPIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fSGVhZGVycyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPX1Jlc2VydmVkKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVET19NWFAodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRETyByZWFkRE8odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZERPX0hlYWRlcnModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRE9fUmVzZXJ2ZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZERPX01YUCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1QV01EdXR5Q3ljbGVBRWxlbWVudHMgPSA0LA0KKyAgIH0gdFBXTUR1dHlDeWNsZUFfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUFdNRHV0eUN5Y2xlQSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQV01EdXR5Q3ljbGVBKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVBXTUR1dHlDeWNsZUJFbGVtZW50cyA9IDIsDQorICAgfSB0UFdNRHV0eUN5Y2xlQl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQV01EdXR5Q3ljbGVCKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFBXTUR1dHlDeWNsZUIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtRmlsdGVyU2VsZWN0SGRyRWxlbWVudHMgPSAxNiwNCisgICB9IHRGaWx0ZXJTZWxlY3RIZHJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRmlsdGVyU2VsZWN0SGRyKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEZpbHRlclNlbGVjdEhkcih1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE91dHB1dEVuYWJsZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVPdXRwdXRFbmFibGUodE91dHB1dEVuYWJsZSB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZU91dHB1dEVuYWJsZV9IZWFkZXJzKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlT3V0cHV0RW5hYmxlX1Jlc2VydmVkKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVPdXRwdXRFbmFibGVfTVhQKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0T3V0cHV0RW5hYmxlIHJlYWRPdXRwdXRFbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE91dHB1dEVuYWJsZV9IZWFkZXJzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZE91dHB1dEVuYWJsZV9SZXNlcnZlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkT3V0cHV0RW5hYmxlX01YUCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1QV01PdXRwdXRTZWxlY3RFbGVtZW50cyA9IDYsDQorICAgfSB0UFdNT3V0cHV0U2VsZWN0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTU91dHB1dFNlbGVjdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQV01PdXRwdXRTZWxlY3QodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRQdWxzZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQdWxzZSh0UHVsc2UgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQdWxzZV9IZWFkZXJzKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlUHVsc2VfUmVzZXJ2ZWQodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVB1bHNlX01YUCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFB1bHNlIHJlYWRQdWxzZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkUHVsc2VfSGVhZGVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQdWxzZV9SZXNlcnZlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkUHVsc2VfTVhQKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RElfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0REkgcmVhZERJKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRESV9IZWFkZXJzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERJX1Jlc2VydmVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRESV9NWFAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bUZpbHRlclNlbGVjdE1YUEVsZW1lbnRzID0gMTYsDQorICAgfSB0RmlsdGVyU2VsZWN0TVhQX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUZpbHRlclNlbGVjdE1YUCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRGaWx0ZXJTZWxlY3RNWFAodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRQdWxzZUxlbmd0aF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQdWxzZUxlbmd0aCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQdWxzZUxlbmd0aCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFBXTVBlcmlvZFBvd2VyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTVBlcmlvZFBvd2VyKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkUFdNUGVyaW9kUG93ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtRmlsdGVyUGVyaW9kTVhQUmVnaXN0ZXJzID0gMywNCisgICB9IHRGaWx0ZXJQZXJpb2RNWFBfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRmlsdGVyUGVyaW9kTVhQKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkRmlsdGVyUGVyaW9kTVhQKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1GaWx0ZXJQZXJpb2RIZHJSZWdpc3RlcnMgPSAzLA0KKyAgIH0gdEZpbHRlclBlcmlvZEhkcl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVGaWx0ZXJQZXJpb2RIZHIodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRGaWx0ZXJQZXJpb2RIZHIodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCitwcml2YXRlOg0KKyAgIHRESU8oY29uc3QgdERJTyYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRESU8mKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0RJT19oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdERNQS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RETUEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjU3ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RETUEuaApAQCAtMCwwICsxLDE4OCBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfRE1BX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfRE1BX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdERNQQ0KK3sNCitwdWJsaWM6DQorICAgdERNQSgpe30NCisgICB2aXJ0dWFsIH50RE1BKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0RE1BKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBQYXVzZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMF9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTBfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQwX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQwX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTFfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkxX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMV9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQWNjdW11bGF0b3IwIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQWNjdW11bGF0b3IxIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfREkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BbmFsb2dUcmlnZ2VycyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJzX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJzX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyVGltZXJzX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfRW5jb2RlclRpbWVycyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9jayA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfRW5jb2RlclRpbWVycyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlclRpbWVyc19IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlclRpbWVyc19Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyc19IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlcnNfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQW5hbG9nVHJpZ2dlcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9ESSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FjY3VtdWxhdG9yMSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FjY3VtdWxhdG9yMCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQxX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMV9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTFfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMV9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDBfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkwX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTBfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBQYXVzZSA6IDE7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyMDsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmdFZGdlIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWwgOiA0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogODsNCisgICAgICB9Ow0KKyAgIH0gdEV4dGVybmFsVHJpZ2dlcnM7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJhdGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUmF0ZSh1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkUmF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWcodENvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19QYXVzZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSTBfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJMF9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQwX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJMV9Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUkxX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDFfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQxX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQWNjdW11bGF0b3IwKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9ESShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BbmFsb2dUcmlnZ2Vycyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9Db3VudGVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQ291bnRlcnNfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9Db3VudGVyVGltZXJzX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9Db3VudGVyVGltZXJzX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfRW5jb2RlcnMoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfRW5jb2RlclRpbWVycyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0V4dGVybmFsQ2xvY2soYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdENvbmZpZyByZWFkQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19QYXVzZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMF9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSTBfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQwX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQwX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSTFfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUkxX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMV9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQWNjdW11bGF0b3IwKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQWNjdW11bGF0b3IxKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfREkodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BbmFsb2dUcmlnZ2Vycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0NvdW50ZXJzX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0NvdW50ZXJzX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9Db3VudGVyVGltZXJzX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0VuY29kZXJzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfRW5jb2RlclRpbWVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRXh0ZXJuYWxDbG9jayh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1FeHRlcm5hbFRyaWdnZXJzRWxlbWVudHMgPSA0LA0KKyAgIH0gdEV4dGVybmFsVHJpZ2dlcnNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vycyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0RXh0ZXJuYWxUcmlnZ2VycyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlcih1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19SaXNpbmdFZGdlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX0ZhbGxpbmdFZGdlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRFeHRlcm5hbFRyaWdnZXJzIHJlYWRFeHRlcm5hbFRyaWdnZXJzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRXh0ZXJuYWxUcmlnZ2Vyc19SaXNpbmdFZGdlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEV4dGVybmFsVHJpZ2dlcnNfRmFsbGluZ0VkZ2UodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdERNQShjb25zdCB0RE1BJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdERNQSYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTVfMV8wX0FfRE1BX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RW5jb2Rlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2YjljMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RW5jb2Rlci5oCkBAIC0wLDAgKzEsMTk5IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9FbmNvZGVyX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfRW5jb2Rlcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRFbmNvZGVyDQorew0KK3B1YmxpYzoNCisgICB0RW5jb2Rlcigpe30NCisgICB2aXJ0dWFsIH50RW5jb2Rlcigpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEVuY29kZXIqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDgsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgRGlyZWN0aW9uIDogMTsNCisgICAgICAgICBzaWduZWQgVmFsdWUgOiAzMTsNCisjZWxzZQ0KKyAgICAgICAgIHNpZ25lZCBWYWx1ZSA6IDMxOw0KKyAgICAgICAgIHVuc2lnbmVkIERpcmVjdGlvbiA6IDE7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdE91dHB1dDsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEJTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEJTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleEFjdGl2ZUhpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4RWRnZVNlbnNpdGl2ZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmV2ZXJzZSA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleEVkZ2VTZW5zaXRpdmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4QWN0aXZlSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEJTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyMTsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAyMzsNCisgICAgICAgICBzaWduZWQgQ291bnQgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsZWQgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgU3RhbGxlZCA6IDE7DQorICAgICAgICAgc2lnbmVkIENvdW50IDogODsNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAyMzsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0VGltZXJPdXRwdXQ7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgU3RhbGxQZXJpb2QgOiAyNDsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlU2l6ZSA6IDc7DQorICAgICAgICAgdW5zaWduZWQgVXBkYXRlV2hlbkVtcHR5IDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFVwZGF0ZVdoZW5FbXB0eSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZVNpemUgOiA3Ow0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsUGVyaW9kIDogMjQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdFRpbWVyQ29uZmlnOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0T3V0cHV0IHJlYWRPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkT3V0cHV0X0RpcmVjdGlvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRPdXRwdXRfVmFsdWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQVNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQVNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19BU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19CU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19CU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0JTb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhBY3RpdmVIaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhFZGdlU2Vuc2l0aXZlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfUmV2ZXJzZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0FTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfQVNvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0FTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfQlNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19CU291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfQlNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4QWN0aXZlSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhFZGdlU2Vuc2l0aXZlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19SZXZlcnNlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZXJPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0VGltZXJPdXRwdXQgcmVhZFRpbWVyT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXJPdXRwdXRfUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBjaGFyIHJlYWRUaW1lck91dHB1dF9Db3VudCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRUaW1lck91dHB1dF9TdGFsbGVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVzZXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZXJDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWcodFRpbWVyQ29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfU3RhbGxQZXJpb2QodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfQXZlcmFnZVNpemUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0VGltZXJDb25maWcgcmVhZFRpbWVyQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXJDb25maWdfU3RhbGxQZXJpb2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkVGltZXJDb25maWdfQXZlcmFnZVNpemUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJDb25maWdfVXBkYXRlV2hlbkVtcHR5KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRFbmNvZGVyKGNvbnN0IHRFbmNvZGVyJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEVuY29kZXImKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0VuY29kZXJfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RHbG9iYWwuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90R2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwMTRkZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90R2xvYmFsLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX0dsb2JhbF9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX0dsb2JhbF9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRHbG9iYWwNCit7DQorcHVibGljOg0KKyAgIHRHbG9iYWwoKXt9DQorICAgdmlydHVhbCB+dEdsb2JhbCgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEdsb2JhbCogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUmFkaW8gOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIENvbW0gOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIE1vZGUgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFJTTCA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBSU0wgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE1vZGUgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIENvbW0gOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFJhZGlvIDogODsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDI1Ow0KKyAgICAgIH07DQorICAgfSB0TEVEczsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TEVEc19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVMRURzKHRMRURzIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlTEVEc19SYWRpbyh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlTEVEc19Db21tKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVMRURzX01vZGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUxFRHNfUlNMKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRMRURzIHJlYWRMRURzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZExFRHNfUmFkaW8odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkTEVEc19Db21tKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZExFRHNfTW9kZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRMRURzX1JTTCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFZlcnNpb25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVmVyc2lvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExvY2FsVGltZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkTG9jYWxUaW1lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VXNlckJ1dHRvbl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFVzZXJCdXR0b24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSZXZpc2lvbl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkUmV2aXNpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdEdsb2JhbChjb25zdCB0R2xvYmFsJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEdsb2JhbCYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTVfMV8wX0FfR2xvYmFsX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90SW50ZXJydXB0LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEludGVycnVwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjMzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEludGVycnVwdC5oCkBAIC0wLDAgKzEsMTAwIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9JbnRlcnJ1cHRfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9JbnRlcnJ1cHRfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxNV8xXzBfQQ0KK3sNCisNCitjbGFzcyB0SW50ZXJydXB0DQorew0KK3B1YmxpYzoNCisgICB0SW50ZXJydXB0KCl7fQ0KKyAgIHZpcnR1YWwgfnRJbnRlcnJ1cHQoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRJbnRlcnJ1cHQqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDgsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgV2FpdEZvckFjayA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBXYWl0Rm9yQWNrIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9DaGFubmVsIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDk7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEZhbGxpbmdUaW1lU3RhbXBfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZEZhbGxpbmdUaW1lU3RhbXAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Tb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19SaXNpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRmFsbGluZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19XYWl0Rm9yQWNrKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1NvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1NvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19SaXNpbmdFZGdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19GYWxsaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfV2FpdEZvckFjayh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJpc2luZ1RpbWVTdGFtcF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkUmlzaW5nVGltZVN0YW1wKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRJbnRlcnJ1cHQoY29uc3QgdEludGVycnVwdCYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRJbnRlcnJ1cHQmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX0ludGVycnVwdF9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFBXTS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQV00uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNmNWUyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQV00uaApAQCAtMCwwICsxLDEyMCBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfUFdNX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTVfMV8wX0FfUFdNX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdFBXTQ0KK3sNCitwdWJsaWM6DQorICAgdFBXTSgpe30NCisgICB2aXJ0dWFsIH50UFdNKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0UFdNKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAxNjsNCisgICAgICAgICB1bnNpZ25lZCBNaW5IaWdoIDogMTY7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBNaW5IaWdoIDogMTY7DQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kIDogMTY7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1BlcmlvZCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19NaW5IaWdoKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZENvbmZpZ19QZXJpb2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZENvbmZpZ19NaW5IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TG9vcFRpbWluZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRMb29wVGltaW5nKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVBlcmlvZFNjYWxlTVhQRWxlbWVudHMgPSAxMCwNCisgICB9IHRQZXJpb2RTY2FsZU1YUF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQZXJpb2RTY2FsZU1YUCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQZXJpb2RTY2FsZU1YUCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1QZXJpb2RTY2FsZUhkckVsZW1lbnRzID0gMTAsDQorICAgfSB0UGVyaW9kU2NhbGVIZHJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUGVyaW9kU2NhbGVIZHIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUGVyaW9kU2NhbGVIZHIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtWmVyb0xhdGNoRWxlbWVudHMgPSAyMCwNCisgICB9IHRaZXJvTGF0Y2hfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlWmVyb0xhdGNoKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFplcm9MYXRjaCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1IZHJSZWdpc3RlcnMgPSAxMCwNCisgICB9IHRIZHJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlSGRyKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZEhkcih1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtTVhQUmVnaXN0ZXJzID0gMTAsDQorICAgfSB0TVhQX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZU1YUCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRNWFAodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCitwcml2YXRlOg0KKyAgIHRQV00oY29uc3QgdFBXTSYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRQV00mKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX1BXTV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFBvd2VyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFBvd2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4NGM2NgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UG93ZXIuaApAQCAtMCwwICsxLDIxNyBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfUG93ZXJfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9Qb3dlcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRQb3dlcg0KK3sNCitwdWJsaWM6DQorICAgdFBvd2VyKCl7fQ0KKyAgIHZpcnR1YWwgfnRQb3dlcigpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdFBvd2VyKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBVc2VyM1YzIDogODsNCisgICAgICAgICB1bnNpZ25lZCBVc2VyNVYgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVzZXI2ViA6IDg7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBVc2VyNlYgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVzZXI1ViA6IDg7DQorICAgICAgICAgdW5zaWduZWQgVXNlcjNWMyA6IDg7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyNDsNCisgICAgICB9Ow0KKyAgIH0gdFN0YXR1czsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBPdmVyQ3VycmVudEZhdWx0Q291bnQzVjMgOiAxMDsNCisgICAgICAgICB1bnNpZ25lZCBPdmVyQ3VycmVudEZhdWx0Q291bnQ1ViA6IDEwOw0KKyAgICAgICAgIHVuc2lnbmVkIE92ZXJDdXJyZW50RmF1bHRDb3VudDZWIDogMTA7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBPdmVyQ3VycmVudEZhdWx0Q291bnQ2ViA6IDEwOw0KKyAgICAgICAgIHVuc2lnbmVkIE92ZXJDdXJyZW50RmF1bHRDb3VudDVWIDogMTA7DQorICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50M1YzIDogMTA7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMDsNCisgICAgICB9Ow0KKyAgIH0gdE92ZXJDdXJyZW50RmF1bHRDb3VudHM7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgVXNlcjNWMyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXNlcjVWIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVc2VyNlYgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgVXNlcjZWIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVc2VyNVYgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVzZXIzVjMgOiAxOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzsNCisgICAgICB9Ow0KKyAgIH0gdERpc2FibGU7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFVzZXJWb2x0YWdlM1YzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFVzZXJWb2x0YWdlM1YzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0U3RhdHVzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdFN0YXR1cyByZWFkU3RhdHVzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFN0YXR1c19Vc2VyM1YzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFN0YXR1c19Vc2VyNVYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkU3RhdHVzX1VzZXI2Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFVzZXJWb2x0YWdlNlZfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlclZvbHRhZ2U2Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE9uQ2hpcFRlbXBlcmF0dXJlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE9uQ2hpcFRlbXBlcmF0dXJlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VXNlclZvbHRhZ2U1Vl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRVc2VyVm9sdGFnZTVWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVzZXRGYXVsdENvdW50c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgc3Ryb2JlUmVzZXRGYXVsdENvdW50cyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE92ZXJDdXJyZW50RmF1bHRDb3VudHNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0T3ZlckN1cnJlbnRGYXVsdENvdW50cyByZWFkT3ZlckN1cnJlbnRGYXVsdENvdW50cyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkT3ZlckN1cnJlbnRGYXVsdENvdW50c19PdmVyQ3VycmVudEZhdWx0Q291bnQzVjModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE92ZXJDdXJyZW50RmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50NVYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE92ZXJDdXJyZW50RmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50NlYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRJbnRlZ3JhdGVkSU9fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkSW50ZWdyYXRlZElPKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TVhQX0RJT1ZvbHRhZ2VfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkTVhQX0RJT1ZvbHRhZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRVc2VyQ3VycmVudDNWM19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRVc2VyQ3VycmVudDNWMyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFZpblZvbHRhZ2VfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVmluVm9sdGFnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFVzZXJDdXJyZW50NlZfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlckN1cnJlbnQ2Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFVzZXJDdXJyZW50NVZfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlckN1cnJlbnQ1Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEFPVm9sdGFnZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRBT1ZvbHRhZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRWaW5DdXJyZW50X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFZpbkN1cnJlbnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHREaXNhYmxlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURpc2FibGUodERpc2FibGUgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVEaXNhYmxlX1VzZXIzVjMoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURpc2FibGVfVXNlcjVWKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVEaXNhYmxlX1VzZXI2Vihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0RGlzYWJsZSByZWFkRGlzYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWREaXNhYmxlX1VzZXIzVjModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRGlzYWJsZV9Vc2VyNVYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRGlzYWJsZV9Vc2VyNlYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdFBvd2VyKGNvbnN0IHRQb3dlciYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRQb3dlciYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTVfMV8wX0FfUG93ZXJfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RSZWxheS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RSZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjAyODYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFJlbGF5LmgKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTVfMV8wX0FfUmVsYXlfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxNV8xXzBfQV9SZWxheV9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRSZWxheQ0KK3sNCitwdWJsaWM6DQorICAgdFJlbGF5KCl7fQ0KKyAgIHZpcnR1YWwgfnRSZWxheSgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdFJlbGF5KiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBGb3J3YXJkIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogNDsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFJldmVyc2UgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEZvcndhcmQgOiA0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogODsNCisgICAgICB9Ow0KKyAgIH0gdFZhbHVlOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRWYWx1ZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVWYWx1ZSh0VmFsdWUgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVWYWx1ZV9Gb3J3YXJkKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVWYWx1ZV9SZXZlcnNlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRWYWx1ZSByZWFkVmFsdWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkVmFsdWVfRm9yd2FyZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRWYWx1ZV9SZXZlcnNlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRSZWxheShjb25zdCB0UmVsYXkmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0UmVsYXkmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDE1XzFfMF9BX1JlbGF5X2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90U1BJLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFNQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTJiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFNQSS5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDE1XzFfMF9BX1NQSV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX1NQSV9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDE1XzFfMF9BDQorew0KKw0KK2NsYXNzIHRTUEkNCit7DQorcHVibGljOg0KKyAgIHRTUEkoKXt9DQorICAgdmlydHVhbCB+dFNQSSgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdFNQSSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgSGRyIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBNWFAgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgTVhQIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBIZHIgOiA0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogNTsNCisgICAgICB9Ow0KKyAgIH0gdENoaXBTZWxlY3RBY3RpdmVIaWdoOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDaGlwU2VsZWN0QWN0aXZlSGlnaF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaCh0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2ggdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaF9IZHIodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNoaXBTZWxlY3RBY3RpdmVIaWdoX01YUCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2ggcmVhZENoaXBTZWxlY3RBY3RpdmVIaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoaXBTZWxlY3RBY3RpdmVIaWdoX0hkcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGlwU2VsZWN0QWN0aXZlSGlnaF9NWFAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdFNQSShjb25zdCB0U1BJJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdFNQSSYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTVfMV8wX0FfU1BJX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90U3lzV2F0Y2hkb2cuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90U3lzV2F0Y2hkb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RjZDEzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RTeXNXYXRjaGRvZy5oCkBAIC0wLDAgKzEsMTA4IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxNV8xXzBfQV9TeXNXYXRjaGRvZ19oX18NCisjZGVmaW5lIF9fbkZSQ18yMDE1XzFfMF9BX1N5c1dhdGNoZG9nX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTVfMV8wX0ENCit7DQorDQorY2xhc3MgdFN5c1dhdGNoZG9nDQorew0KK3B1YmxpYzoNCisgICB0U3lzV2F0Y2hkb2coKXt9DQorICAgdmlydHVhbCB+dFN5c1dhdGNoZG9nKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0U3lzV2F0Y2hkb2cqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAxLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFN5c3RlbUFjdGl2ZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUG93ZXJBbGl2ZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU3lzRGlzYWJsZUNvdW50IDogMTU7DQorICAgICAgICAgdW5zaWduZWQgUG93ZXJEaXNhYmxlQ291bnQgOiAxNTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFBvd2VyRGlzYWJsZUNvdW50IDogMTU7DQorICAgICAgICAgdW5zaWduZWQgU3lzRGlzYWJsZUNvdW50IDogMTU7DQorICAgICAgICAgdW5zaWduZWQgUG93ZXJBbGl2ZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU3lzdGVtQWN0aXZlIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0U3RhdHVzOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRTdGF0dXNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0U3RhdHVzIHJlYWRTdGF0dXModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU3RhdHVzX1N5c3RlbUFjdGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRTdGF0dXNfUG93ZXJBbGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkU3RhdHVzX1N5c0Rpc2FibGVDb3VudCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkU3RhdHVzX1Bvd2VyRGlzYWJsZUNvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29tbWFuZF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb21tYW5kKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkQ29tbWFuZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENoYWxsZW5nZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoYWxsZW5nZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEFjdGl2ZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVBY3RpdmUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQWN0aXZlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZXJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Rm9yY2VkS2lsbHNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkRm9yY2VkS2lsbHModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdFN5c1dhdGNoZG9nKGNvbnN0IHRTeXNXYXRjaGRvZyYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRTeXNXYXRjaGRvZyYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTVfMV8wX0FfU3lzV2F0Y2hkb2dfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvbkludGVyZmFjZUdsb2JhbHMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0Y2M3NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmgKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTJfMV82XzRfbkludGVyZmFjZUdsb2JhbHNfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9uSW50ZXJmYWNlR2xvYmFsc19oX18NCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisgICBleHRlcm4gdW5zaWduZWQgaW50IGdfY3VycmVudFRhcmdldENsYXNzOw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X25JbnRlcmZhY2VHbG9iYWxzX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBSS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEFJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjNDIzYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBSS5oCkBAIC0wLDAgKzEsMTQ5IEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9BSV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X0FJX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTJfMV82XzQNCit7DQorDQorY2xhc3MgdEFJDQorew0KK3B1YmxpYzoNCisgICB0QUkoKXt9DQorICAgdmlydHVhbCB+dEFJKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0QUkqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDIsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgQ2hhbm5lbCA6IDM7DQorICAgICAgICAgdW5zaWduZWQgTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlZCA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlZCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBDaGFubmVsIDogMzsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDU7DQorICAgICAgfTsNCisgICB9IHRSZWFkU2VsZWN0Ow0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFNjYW5TaXplIDogMzsNCisgICAgICAgICB1bnNpZ25lZCBDb252ZXJ0UmF0ZSA6IDI2Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgQ29udmVydFJhdGUgOiAyNjsNCisgICAgICAgICB1bnNpZ25lZCBTY2FuU2l6ZSA6IDM7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyOTsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1NjYW5TaXplKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQ29udmVydFJhdGUodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1NjYW5TaXplKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkQ29uZmlnX0NvbnZlcnRSYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TG9vcFRpbWluZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkTG9vcFRpbWluZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1PdmVyc2FtcGxlQml0c0VsZW1lbnRzID0gOCwNCisgICB9IHRPdmVyc2FtcGxlQml0c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVPdmVyc2FtcGxlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRPdmVyc2FtcGxlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1BdmVyYWdlQml0c0VsZW1lbnRzID0gOCwNCisgICB9IHRBdmVyYWdlQml0c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVBdmVyYWdlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRBdmVyYWdlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TY2FuTGlzdEVsZW1lbnRzID0gOCwNCisgICB9IHRTY2FuTGlzdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTY2FuTGlzdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTY2FuTGlzdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExhdGNoT3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVMYXRjaE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlYWRTZWxlY3RfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUmVhZFNlbGVjdCh0UmVhZFNlbGVjdCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVJlYWRTZWxlY3RfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlUmVhZFNlbGVjdF9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVJlYWRTZWxlY3RfQXZlcmFnZWQoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFJlYWRTZWxlY3QgcmVhZFJlYWRTZWxlY3QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUmVhZFNlbGVjdF9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFJlYWRTZWxlY3RfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFJlYWRTZWxlY3RfQXZlcmFnZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdEFJKGNvbnN0IHRBSSYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRBSSYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTJfMV82XzRfQUlfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEFjY3VtdWxhdG9yLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90QWNjdW11bGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA5NzJhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEFjY3VtdWxhdG9yLmgKQEAgLTAsMCArMSw4NyBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTJfMV82XzRfQWNjdW11bGF0b3JfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9BY2N1bXVsYXRvcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRBY2N1bXVsYXRvcg0KK3sNCitwdWJsaWM6DQorICAgdEFjY3VtdWxhdG9yKCl7fQ0KKyAgIHZpcnR1YWwgfnRBY2N1bXVsYXRvcigpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEFjY3VtdWxhdG9yKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSAyLA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgc2lnbmVkIGxvbmcgbG9uZyBWYWx1ZTsNCisgICAgICAgICB1bnNpZ25lZCBDb3VudCA6IDMyOw0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUyIDogMzI7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUzIDogMzI7DQorICAgICAgfTsNCisgICB9IHRPdXRwdXQ7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgbG9uZyBsb25nIHJlYWRPdXRwdXRfVmFsdWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRPdXRwdXRfQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDZW50ZXJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2VudGVyKHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZENlbnRlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERlYWRiYW5kX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURlYWRiYW5kKHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZERlYWRiYW5kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVzZXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBY2N1bXVsYXRvcihjb25zdCB0QWNjdW11bGF0b3ImKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QWNjdW11bGF0b3ImKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X0FjY3VtdWxhdG9yX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBbGFybS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEFsYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlYjMzZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBbGFybS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X0FsYXJtX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTJfMV82XzRfQWxhcm1faF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0QWxhcm0NCit7DQorcHVibGljOg0KKyAgIHRBbGFybSgpe30NCisgICB2aXJ0dWFsIH50QWxhcm0oKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRBbGFybSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEVuYWJsZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRW5hYmxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VHJpZ2dlclRpbWVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlVHJpZ2dlclRpbWUodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRyaWdnZXJUaW1lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBbGFybShjb25zdCB0QWxhcm0mKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QWxhcm0mKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X0FsYXJtX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RBbmFsb2dUcmlnZ2VyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90QW5hbG9nVHJpZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTUwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90QW5hbG9nVHJpZ2dlci5oCkBAIC0wLDAgKzEsMTMzIEBACisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhDQorDQorI2lmbmRlZiBfX25GUkNfMjAxMl8xXzZfNF9BbmFsb2dUcmlnZ2VyX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTJfMV82XzRfQW5hbG9nVHJpZ2dlcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRBbmFsb2dUcmlnZ2VyDQorew0KK3B1YmxpYzoNCisgICB0QW5hbG9nVHJpZ2dlcigpe30NCisgICB2aXJ0dWFsIH50QW5hbG9nVHJpZ2dlcigpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEFuYWxvZ1RyaWdnZXIqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDgsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgSW5IeXN0ZXJlc2lzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBPdmVyTGltaXQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFJpc2luZyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmFsbGluZyA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmcgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIE92ZXJMaW1pdCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5IeXN0ZXJlc2lzIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDQ7DQorICAgICAgfTsNCisgICB9IHRPdXRwdXQ7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgQ2hhbm5lbCA6IDM7DQorICAgICAgICAgdW5zaWduZWQgTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlZCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmlsdGVyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGbG9hdGluZ1JvbGxvdmVyIDogMTsNCisgICAgICAgICBzaWduZWQgUm9sbG92ZXJMaW1pdCA6IDg7DQorI2Vsc2UNCisgICAgICAgICBzaWduZWQgUm9sbG92ZXJMaW1pdCA6IDg7DQorICAgICAgICAgdW5zaWduZWQgRmxvYXRpbmdSb2xsb3ZlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRmlsdGVyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlZCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBDaGFubmVsIDogMzsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDE1Ow0KKyAgICAgIH07DQorICAgfSB0U291cmNlU2VsZWN0Ow0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRTb3VyY2VTZWxlY3RfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0KHRTb3VyY2VTZWxlY3QgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0X01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0X0F2ZXJhZ2VkKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfRmlsdGVyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfRmxvYXRpbmdSb2xsb3Zlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0X1JvbGxvdmVyTGltaXQoc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0U291cmNlU2VsZWN0IHJlYWRTb3VyY2VTZWxlY3QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkU291cmNlU2VsZWN0X0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkU291cmNlU2VsZWN0X01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRTb3VyY2VTZWxlY3RfQXZlcmFnZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU291cmNlU2VsZWN0X0ZpbHRlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRTb3VyY2VTZWxlY3RfRmxvYXRpbmdSb2xsb3Zlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgc2hvcnQgcmVhZFNvdXJjZVNlbGVjdF9Sb2xsb3ZlckxpbWl0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VXBwZXJMaW1pdF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVVcHBlckxpbWl0KHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZFVwcGVyTGltaXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRMb3dlckxpbWl0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUxvd2VyTGltaXQoc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkTG93ZXJMaW1pdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1PdXRwdXRFbGVtZW50cyA9IDgsDQorICAgfSB0T3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdE91dHB1dCByZWFkT3V0cHV0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9Jbkh5c3RlcmVzaXModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkT3V0cHV0X092ZXJMaW1pdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfUmlzaW5nKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9GYWxsaW5nKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRBbmFsb2dUcmlnZ2VyKGNvbnN0IHRBbmFsb2dUcmlnZ2VyJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFuYWxvZ1RyaWdnZXImKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X0FuYWxvZ1RyaWdnZXJfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdENvdW50ZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RDb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzYTdmMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RDb3VudGVyLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X0NvdW50ZXJfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9Db3VudGVyX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtSW50ZXJmYWNlLmgiDQorDQorbmFtZXNwYWNlIG5GUEdBDQorew0KK25hbWVzcGFjZSBuRlJDXzIwMTJfMV82XzQNCit7DQorDQorY2xhc3MgdENvdW50ZXINCit7DQorcHVibGljOg0KKyAgIHRDb3VudGVyKCl7fQ0KKyAgIHZpcnR1YWwgfnRDb3VudGVyKCl7fQ0KKw0KKyAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOw0KKyAgIHN0YXRpYyB0Q291bnRlciogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gOCwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBEaXJlY3Rpb24gOiAxOw0KKyAgICAgICAgIHNpZ25lZCBWYWx1ZSA6IDMxOw0KKyNlbHNlDQorICAgICAgICAgc2lnbmVkIFZhbHVlIDogMzE7DQorICAgICAgICAgdW5zaWduZWQgRGlyZWN0aW9uIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0T3V0cHV0Ow0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBEb3duU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4QWN0aXZlSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcEZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEb3duUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93bkZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBNb2RlIDogMjsNCisgICAgICAgICB1bnNpZ25lZCBQdWxzZUxlbmd0aFRocmVzaG9sZCA6IDY7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUHVsc2VMZW5ndGhUaHJlc2hvbGQgOiA2Ow0KKyAgICAgICAgIHVuc2lnbmVkIE1vZGUgOiAyOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25GYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93blJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVwRmFsbGluZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFVwUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhBY3RpdmVIaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9Nb2R1bGUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgVXBTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgVXBTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9DaGFubmVsIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0Q29uZmlnOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDIzOw0KKyAgICAgICAgIHNpZ25lZCBDb3VudCA6IDg7DQorICAgICAgICAgdW5zaWduZWQgU3RhbGxlZCA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbGVkIDogMTsNCisgICAgICAgICBzaWduZWQgQ291bnQgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDIzOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRUaW1lck91dHB1dDsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbFBlcmlvZCA6IDI0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VTaXplIDogNzsNCisgICAgICAgICB1bnNpZ25lZCBVcGRhdGVXaGVuRW1wdHkgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgVXBkYXRlV2hlbkVtcHR5IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBdmVyYWdlU2l6ZSA6IDc7DQorICAgICAgICAgdW5zaWduZWQgU3RhbGxQZXJpb2QgOiAyNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOw0KKyAgICAgIH07DQorICAgfSB0VGltZXJDb25maWc7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfRGlyZWN0aW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZE91dHB1dF9WYWx1ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWcodENvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcFNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleEFjdGl2ZUhpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcFJpc2luZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcEZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRG93blJpc2luZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Eb3duRmFsbGluZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Nb2RlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfUHVsc2VMZW5ndGhUaHJlc2hvbGQodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfVXBTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfVXBTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19VcFNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19Eb3duU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0Rvd25Tb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Eb3duU291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0luZGV4U291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0luZGV4U291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhBY3RpdmVIaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19VcFJpc2luZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1VwRmFsbGluZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0Rvd25SaXNpbmdFZGdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Eb3duRmFsbGluZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX01vZGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZENvbmZpZ19QdWxzZUxlbmd0aFRocmVzaG9sZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZXJPdXRwdXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB0VGltZXJPdXRwdXQgcmVhZFRpbWVyT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXJPdXRwdXRfUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHNpZ25lZCBjaGFyIHJlYWRUaW1lck91dHB1dF9Db3VudCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRUaW1lck91dHB1dF9TdGFsbGVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVzZXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZXJDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWcodFRpbWVyQ29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfU3RhbGxQZXJpb2QodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfQXZlcmFnZVNpemUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0VGltZXJDb25maWcgcmVhZFRpbWVyQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXJDb25maWdfU3RhbGxQZXJpb2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkVGltZXJDb25maWdfQXZlcmFnZVNpemUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJDb25maWdfVXBkYXRlV2hlbkVtcHR5KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRDb3VudGVyKGNvbnN0IHRDb3VudGVyJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdENvdW50ZXImKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X0NvdW50ZXJfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdERJTy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdERJTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmI2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90RElPLmgKQEAgLTAsMCArMSwzMzAgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X0RJT19oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X0RJT19oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRESU8NCit7DQorcHVibGljOg0KKyAgIHRESU8oKXt9DQorICAgdmlydHVhbCB+dERJTygpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdERJTyogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMiwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAxNjsNCisgICAgICAgICB1bnNpZ25lZCBNaW5IaWdoIDogMTY7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBNaW5IaWdoIDogMTY7DQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kIDogMTY7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdFBXTUNvbmZpZzsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBSZWxheUZ3ZCA6IDg7DQorICAgICAgICAgdW5zaWduZWQgUmVsYXlSZXYgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIEkyQ0hlYWRlciA6IDQ7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBJMkNIZWFkZXIgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIFJlbGF5UmV2IDogODsNCisgICAgICAgICB1bnNpZ25lZCBSZWxheUZ3ZCA6IDg7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyMDsNCisgICAgICB9Ow0KKyAgIH0gdFNsb3dWYWx1ZTsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBUcmFuc2FjdGlvbiA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRG9uZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQWJvcnRlZCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRGF0YVJlY2VpdmVkSGlnaCA6IDI0Ow0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgRGF0YVJlY2VpdmVkSGlnaCA6IDI0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEFib3J0ZWQgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIERvbmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFRyYW5zYWN0aW9uIDogMTsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDI3Ow0KKyAgICAgIH07DQorICAgfSB0STJDU3RhdHVzOw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3MgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIEJ5dGVzVG9SZWFkIDogMzsNCisgICAgICAgICB1bnNpZ25lZCBCeXRlc1RvV3JpdGUgOiAzOw0KKyAgICAgICAgIHVuc2lnbmVkIERhdGFUb1NlbmRIaWdoIDogMTY7DQorICAgICAgICAgdW5zaWduZWQgQml0d2lzZUhhbmRzaGFrZSA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBCaXR3aXNlSGFuZHNoYWtlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEYXRhVG9TZW5kSGlnaCA6IDE2Ow0KKyAgICAgICAgIHVuc2lnbmVkIEJ5dGVzVG9Xcml0ZSA6IDM7DQorICAgICAgICAgdW5zaWduZWQgQnl0ZXNUb1JlYWQgOiAzOw0KKyAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3MgOiA4Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzE7DQorICAgICAgfTsNCisgICB9IHRJMkNDb25maWc7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kUG93ZXIgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIE91dHB1dFNlbGVjdF8wIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBPdXRwdXRTZWxlY3RfMSA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgT3V0cHV0U2VsZWN0XzIgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIE91dHB1dFNlbGVjdF8zIDogNDsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIE91dHB1dFNlbGVjdF8zIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBPdXRwdXRTZWxlY3RfMiA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgT3V0cHV0U2VsZWN0XzEgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIE91dHB1dFNlbGVjdF8wIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBQZXJpb2RQb3dlciA6IDQ7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyMDsNCisgICAgICB9Ow0KKyAgIH0gdERPX1BXTUNvbmZpZzsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bUZpbHRlclNlbGVjdEVsZW1lbnRzID0gMTYsDQorICAgfSB0RmlsdGVyU2VsZWN0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUZpbHRlclNlbGVjdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRGaWx0ZXJTZWxlY3QodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRJMkNEYXRhVG9TZW5kX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUkyQ0RhdGFUb1NlbmQodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZEkyQ0RhdGFUb1NlbmQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRET19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVETyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZERPKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bUZpbHRlclBlcmlvZEVsZW1lbnRzID0gMywNCisgICB9IHRGaWx0ZXJQZXJpb2RfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRmlsdGVyUGVyaW9kKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEZpbHRlclBlcmlvZCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdE91dHB1dEVuYWJsZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVPdXRwdXRFbmFibGUodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRPdXRwdXRFbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRQdWxzZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQdWxzZSh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFB1bHNlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0U2xvd1ZhbHVlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3dWYWx1ZSh0U2xvd1ZhbHVlIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlU2xvd1ZhbHVlX1JlbGF5RndkKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93VmFsdWVfUmVsYXlSZXYodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3dWYWx1ZV9JMkNIZWFkZXIodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFNsb3dWYWx1ZSByZWFkU2xvd1ZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFNsb3dWYWx1ZV9SZWxheUZ3ZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTbG93VmFsdWVfUmVsYXlSZXYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkU2xvd1ZhbHVlX0kyQ0hlYWRlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEkyQ1N0YXR1c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRJMkNTdGF0dXMgcmVhZEkyQ1N0YXR1cyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRJMkNTdGF0dXNfVHJhbnNhY3Rpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkSTJDU3RhdHVzX0RvbmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkSTJDU3RhdHVzX0Fib3J0ZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRJMkNTdGF0dXNfRGF0YVJlY2VpdmVkSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEkyQ0RhdGFSZWNlaXZlZF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkSTJDRGF0YVJlY2VpdmVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RElfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkREkodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRQdWxzZUxlbmd0aF9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVQdWxzZUxlbmd0aCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQdWxzZUxlbmd0aCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1QV01QZXJpb2RTY2FsZUVsZW1lbnRzID0gMTAsDQorICAgfSB0UFdNUGVyaW9kU2NhbGVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUFdNUGVyaW9kU2NhbGUodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUFdNUGVyaW9kU2NhbGUodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtRE9fUFdNRHV0eUN5Y2xlRWxlbWVudHMgPSA0LA0KKyAgIH0gdERPX1BXTUR1dHlDeWNsZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVET19QV01EdXR5Q3ljbGUodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRE9fUFdNRHV0eUN5Y2xlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0QkZMX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUJGTChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRCRkwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRJMkNDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlSTJDQ29uZmlnKHRJMkNDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVJMkNDb25maWdfQWRkcmVzcyh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlSTJDQ29uZmlnX0J5dGVzVG9SZWFkKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVJMkNDb25maWdfQnl0ZXNUb1dyaXRlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVJMkNDb25maWdfRGF0YVRvU2VuZEhpZ2godW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVJMkNDb25maWdfQml0d2lzZUhhbmRzaGFrZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0STJDQ29uZmlnIHJlYWRJMkNDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkSTJDQ29uZmlnX0FkZHJlc3ModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkSTJDQ29uZmlnX0J5dGVzVG9SZWFkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEkyQ0NvbmZpZ19CeXRlc1RvV3JpdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZEkyQ0NvbmZpZ19EYXRhVG9TZW5kSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRJMkNDb25maWdfQml0d2lzZUhhbmRzaGFrZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERPX1BXTUNvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVET19QV01Db25maWcodERPX1BXTUNvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPX1BXTUNvbmZpZ19QZXJpb2RQb3dlcih1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fUFdNQ29uZmlnX091dHB1dFNlbGVjdF8wKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVET19QV01Db25maWdfT3V0cHV0U2VsZWN0XzEodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPX1BXTUNvbmZpZ19PdXRwdXRTZWxlY3RfMih1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fUFdNQ29uZmlnX091dHB1dFNlbGVjdF8zKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRET19QV01Db25maWcgcmVhZERPX1BXTUNvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRET19QV01Db25maWdfUGVyaW9kUG93ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRE9fUFdNQ29uZmlnX091dHB1dFNlbGVjdF8wKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERPX1BXTUNvbmZpZ19PdXRwdXRTZWxlY3RfMSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRET19QV01Db25maWdfT3V0cHV0U2VsZWN0XzIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRE9fUFdNQ29uZmlnX091dHB1dFNlbGVjdF8zKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0STJDU3RhcnRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZUkyQ1N0YXJ0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0TG9vcFRpbWluZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRMb29wVGltaW5nKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UFdNQ29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTUNvbmZpZyh0UFdNQ29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlUFdNQ29uZmlnX1BlcmlvZCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTUNvbmZpZ19NaW5IaWdoKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0UFdNQ29uZmlnIHJlYWRQV01Db25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFBXTUNvbmZpZ19QZXJpb2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFBXTUNvbmZpZ19NaW5IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVBXTVZhbHVlUmVnaXN0ZXJzID0gMTAsDQorICAgfSB0UFdNVmFsdWVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlUFdNVmFsdWUodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFBXTVZhbHVlKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorcHJpdmF0ZToNCisgICB0RElPKGNvbnN0IHRESU8mKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0RElPJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9ESU9faF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdERNQS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdERNQS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmVjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90RE1BLmgKQEAgLTAsMCArMSwxODggQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X0RNQV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X0RNQV9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRETUENCit7DQorcHVibGljOg0KKyAgIHRETUEoKXt9DQorICAgdmlydHVhbCB+dERNQSgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdERNQSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUGF1c2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTBfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkwX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkxX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMV9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FjY3VtdWxhdG9yMCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FjY3VtdWxhdG9yMSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0RJIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQW5hbG9nVHJpZ2dlcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyc19Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyc19IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlclRpbWVyc19Mb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyVGltZXJzX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVycyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJUaW1lcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2sgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9jayA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJUaW1lcnMgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVycyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJUaW1lcnNfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlcnNfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJzX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FuYWxvZ1RyaWdnZXJzIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfREkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BY2N1bXVsYXRvcjEgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BY2N1bXVsYXRvcjAgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkxX0hpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTFfTG93IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDBfSGlnaCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJQXZlcmFnZWQwX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FJMF9IaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkwX0xvdyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUGF1c2UgOiAxOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjA7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmlzaW5nRWRnZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDg7DQorICAgICAgfTsNCisgICB9IHRFeHRlcm5hbFRyaWdnZXJzOw0KKw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSYXRlX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhdGUodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFJhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfUGF1c2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUkwX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSTBfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDBfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSTFfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJMV9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQxX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BY2N1bXVsYXRvcjEoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfREkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQW5hbG9nVHJpZ2dlcnMoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQ291bnRlcnNfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0NvdW50ZXJzX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0VuY29kZXJzKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0VuY29kZXJUaW1lcnMoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FeHRlcm5hbENsb2NrKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfUGF1c2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSTBfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUkwX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUkxX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMV9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDFfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDFfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0RJKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQW5hbG9nVHJpZ2dlcnModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9Db3VudGVyc19Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9Db3VudGVyc19IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9Db3VudGVyVGltZXJzX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9FbmNvZGVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0VuY29kZXJUaW1lcnModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0V4dGVybmFsQ2xvY2sodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtRXh0ZXJuYWxUcmlnZ2Vyc0VsZW1lbnRzID0gNCwNCisgICB9IHRFeHRlcm5hbFRyaWdnZXJzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdEV4dGVybmFsVHJpZ2dlcnMgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnNfUmlzaW5nRWRnZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19GYWxsaW5nRWRnZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB0RXh0ZXJuYWxUcmlnZ2VycyByZWFkRXh0ZXJuYWxUcmlnZ2Vycyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEV4dGVybmFsVHJpZ2dlcnNfUmlzaW5nRWRnZSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRFeHRlcm5hbFRyaWdnZXJzX0ZhbGxpbmdFZGdlKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRETUEoY29uc3QgdERNQSYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRETUEmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X0RNQV9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90RW5jb2Rlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjU1OTIwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEVuY29kZXIuaApAQCAtMCwwICsxLDE5OSBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTJfMV82XzRfRW5jb2Rlcl9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X0VuY29kZXJfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0RW5jb2Rlcg0KK3sNCitwdWJsaWM6DQorICAgdEVuY29kZXIoKXt9DQorICAgdmlydHVhbCB+dEVuY29kZXIoKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRFbmNvZGVyKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bVN5c3RlbXMgPSA0LA0KKyAgIH0gdElmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIERpcmVjdGlvbiA6IDE7DQorICAgICAgICAgc2lnbmVkIFZhbHVlIDogMzE7DQorI2Vsc2UNCisgICAgICAgICBzaWduZWQgVmFsdWUgOiAzMTsNCisgICAgICAgICB1bnNpZ25lZCBEaXJlY3Rpb24gOiAxOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRPdXRwdXQ7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEJTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhBY3RpdmVIaWdoIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBFbmFibGUgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgRW5hYmxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBJbmRleEFjdGl2ZUhpZ2ggOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBCU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBBU291cmNlX0NoYW5uZWwgOiA0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjE7DQorICAgICAgfTsNCisgICB9IHRDb25maWc7DQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kIDogMjM7DQorICAgICAgICAgc2lnbmVkIENvdW50IDogODsNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbGVkIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsZWQgOiAxOw0KKyAgICAgICAgIHNpZ25lZCBDb3VudCA6IDg7DQorICAgICAgICAgdW5zaWduZWQgUGVyaW9kIDogMjM7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsNCisgICAgICB9Ow0KKyAgIH0gdFRpbWVyT3V0cHV0Ow0KKyAgIHR5cGVkZWYNCisgICB1bmlvbnsNCisgICAgICBzdHJ1Y3R7DQorI2lmZGVmIF9fdnh3b3Jrcw0KKyAgICAgICAgIHVuc2lnbmVkIFN0YWxsUGVyaW9kIDogMjQ7DQorICAgICAgICAgdW5zaWduZWQgQXZlcmFnZVNpemUgOiA3Ow0KKyAgICAgICAgIHVuc2lnbmVkIFVwZGF0ZVdoZW5FbXB0eSA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBVcGRhdGVXaGVuRW1wdHkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VTaXplIDogNzsNCisgICAgICAgICB1bnNpZ25lZCBTdGFsbFBlcmlvZCA6IDI0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRUaW1lckNvbmZpZzsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0T3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdE91dHB1dCByZWFkT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9EaXJlY3Rpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkT3V0cHV0X1ZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0FTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0FTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQVNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQlNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQlNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19CU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4QWN0aXZlSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1JldmVyc2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdENvbmZpZyByZWFkQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19BU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0FTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19BU291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0JTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfQlNvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0JTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfSW5kZXhTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfSW5kZXhTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19JbmRleEFjdGl2ZUhpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1JldmVyc2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyT3V0cHV0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdFRpbWVyT3V0cHV0IHJlYWRUaW1lck91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyT3V0cHV0X1BlcmlvZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBzaWduZWQgY2hhciByZWFkVGltZXJPdXRwdXRfQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJPdXRwdXRfU3RhbGxlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFJlc2V0X0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVSZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyQ29uZmlnX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnKHRUaW1lckNvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZ19VcGRhdGVXaGVuRW1wdHkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdFRpbWVyQ29uZmlnIHJlYWRUaW1lckNvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0RW5jb2Rlcihjb25zdCB0RW5jb2RlciYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRFbmNvZGVyJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9FbmNvZGVyX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RHbG9iYWwuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RHbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzgyZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEdsb2JhbC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X0dsb2JhbF9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X0dsb2JhbF9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRHbG9iYWwNCit7DQorcHVibGljOg0KKyAgIHRHbG9iYWwoKXt9DQorICAgdmlydHVhbCB+dEdsb2JhbCgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEdsb2JhbCogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFZlcnNpb25fSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVmVyc2lvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdExvY2FsVGltZV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkTG9jYWxUaW1lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RlBHQV9MRURfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRlBHQV9MRUQoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkRlBHQV9MRUQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSZXZpc2lvbl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkUmV2aXNpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdEdsb2JhbChjb25zdCB0R2xvYmFsJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEdsb2JhbCYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTJfMV82XzRfR2xvYmFsX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RJbnRlcnJ1cHQuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RJbnRlcnJ1cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDE4NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdEludGVycnVwdC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X0ludGVycnVwdF9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X0ludGVycnVwdF9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRJbnRlcnJ1cHQNCit7DQorcHVibGljOg0KKyAgIHRJbnRlcnJ1cHQoKXt9DQorICAgdmlydHVhbCB+dEludGVycnVwdCgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdEludGVycnVwdCogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gOCwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBTb3VyY2VfQ2hhbm5lbCA6IDQ7DQorICAgICAgICAgdW5zaWduZWQgU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFJpc2luZ0VkZ2UgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBXYWl0Rm9yQWNrIDogMTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIFdhaXRGb3JBY2sgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU291cmNlX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU291cmNlX0NoYW5uZWwgOiA0Ow0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogOTsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZVN0YW1wX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUaW1lU3RhbXAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Tb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19SaXNpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRmFsbGluZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19XYWl0Rm9yQWNrKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1NvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX1NvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19SaXNpbmdFZGdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19GYWxsaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfV2FpdEZvckFjayh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0SW50ZXJydXB0KGNvbnN0IHRJbnRlcnJ1cHQmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0SW50ZXJydXB0Jik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9JbnRlcnJ1cHRfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFNQSS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFNQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzIwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90U1BJLmgKQEAgLTAsMCArMSwyMjggQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X1NQSV9oX18NCisjZGVmaW5lIF9fbkZSQ18yMDEyXzFfNl80X1NQSV9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRTUEkNCit7DQorcHVibGljOg0KKyAgIHRTUEkoKXt9DQorICAgdmlydHVhbCB+dFNQSSgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdFNQSSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorICAgdHlwZWRlZg0KKyAgIHVuaW9uew0KKyAgICAgIHN0cnVjdHsNCisjaWZkZWYgX192eHdvcmtzDQorICAgICAgICAgdW5zaWduZWQgUmVjZWl2ZWREYXRhT3ZlcmZsb3cgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIElkbGUgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgSWRsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgUmVjZWl2ZWREYXRhT3ZlcmZsb3cgOiAxOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjsNCisgICAgICB9Ow0KKyAgIH0gdFN0YXR1czsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBCdXNCaXRXaWR0aCA6IDg7DQorICAgICAgICAgdW5zaWduZWQgQ2xvY2tIYWxmUGVyaW9kRGVsYXkgOiA4Ow0KKyAgICAgICAgIHVuc2lnbmVkIE1TQmZpcnN0IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBEYXRhT25GYWxsaW5nIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBMYXRjaEZpcnN0IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBMYXRjaExhc3QgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZyYW1lUG9sYXJpdHkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIFdyaXRlT25seSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgQ2xvY2tQb2xhcml0eSA6IDE7DQorI2Vsc2UNCisgICAgICAgICB1bnNpZ25lZCBDbG9ja1BvbGFyaXR5IDogMTsNCisgICAgICAgICB1bnNpZ25lZCBXcml0ZU9ubHkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEZyYW1lUG9sYXJpdHkgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIExhdGNoTGFzdCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTGF0Y2hGaXJzdCA6IDE7DQorICAgICAgICAgdW5zaWduZWQgRGF0YU9uRmFsbGluZyA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTVNCZmlyc3QgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIENsb2NrSGFsZlBlcmlvZERlbGF5IDogODsNCisgICAgICAgICB1bnNpZ25lZCBCdXNCaXRXaWR0aCA6IDg7DQorI2VuZGlmDQorICAgICAgfTsNCisgICAgICBzdHJ1Y3R7DQorICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyMzsNCisgICAgICB9Ow0KKyAgIH0gdENvbmZpZzsNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBTQ0xLX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIFNDTEtfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBNT1NJX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIE1PU0lfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBNSVNPX0NoYW5uZWwgOiA0Ow0KKyAgICAgICAgIHVuc2lnbmVkIE1JU09fTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBTU19DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBTU19Nb2R1bGUgOiAxOw0KKyNlbHNlDQorICAgICAgICAgdW5zaWduZWQgU1NfTW9kdWxlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBTU19DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBNSVNPX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTUlTT19DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBNT1NJX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgTU9TSV9DaGFubmVsIDogNDsNCisgICAgICAgICB1bnNpZ25lZCBTQ0xLX01vZHVsZSA6IDE7DQorICAgICAgICAgdW5zaWduZWQgU0NMS19DaGFubmVsIDogNDsNCisjZW5kaWYNCisgICAgICB9Ow0KKyAgICAgIHN0cnVjdHsNCisgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDIwOw0KKyAgICAgIH07DQorICAgfSB0Q2hhbm5lbHM7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFN0YXR1c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRTdGF0dXMgcmVhZFN0YXR1cyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRTdGF0dXNfUmVjZWl2ZWREYXRhT3ZlcmZsb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkU3RhdHVzX0lkbGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSZWNlaXZlZERhdGFfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFJlY2VpdmVkRGF0YSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdERhdGFUb0xvYWRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlRGF0YVRvTG9hZCh1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkRGF0YVRvTG9hZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWcodENvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19CdXNCaXRXaWR0aCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Nsb2NrSGFsZlBlcmlvZERlbGF5KHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfTVNCZmlyc3QoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19EYXRhT25GYWxsaW5nKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfTGF0Y2hGaXJzdChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0xhdGNoTGFzdChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0ZyYW1lUG9sYXJpdHkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Xcml0ZU9ubHkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19DbG9ja1BvbGFyaXR5KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfQnVzQml0V2lkdGgodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0Nsb2NrSGFsZlBlcmlvZERlbGF5KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19NU0JmaXJzdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRGF0YU9uRmFsbGluZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfTGF0Y2hGaXJzdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfTGF0Y2hMYXN0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19GcmFtZVBvbGFyaXR5KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Xcml0ZU9ubHkodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0Nsb2NrUG9sYXJpdHkodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDbGVhclJlY2VpdmVkRGF0YV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgc3Ryb2JlQ2xlYXJSZWNlaXZlZERhdGEodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRSZWNlaXZlZEVsZW1lbnRzX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFJlY2VpdmVkRWxlbWVudHModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRMb2FkX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVMb2FkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVzZXRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0Q2hhbm5lbHNfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHModENoYW5uZWxzIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHNfU0NMS19DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDaGFubmVsc19TQ0xLX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHNfTU9TSV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDaGFubmVsc19NT1NJX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHNfTUlTT19DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVDaGFubmVsc19NSVNPX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHNfU1NfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hhbm5lbHNfU1NfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHRDaGFubmVscyByZWFkQ2hhbm5lbHModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ2hhbm5lbHNfU0NMS19DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoYW5uZWxzX1NDTEtfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoYW5uZWxzX01PU0lfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGFubmVsc19NT1NJX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGFubmVsc19NSVNPX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ2hhbm5lbHNfTUlTT19Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ2hhbm5lbHNfU1NfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGFubmVsc19TU19Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRBdmFpbGFibGVUb0xvYWRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkQXZhaWxhYmxlVG9Mb2FkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0UmVhZFJlY2VpdmVkRGF0YV9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgc3Ryb2JlUmVhZFJlY2VpdmVkRGF0YSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0U1BJKGNvbnN0IHRTUEkmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0U1BJJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9TUElfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFNvbGVub2lkLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90U29sZW5vaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI3ZWVhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFNvbGVub2lkLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTJfMV82XzRfU29sZW5vaWRfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9Tb2xlbm9pZF9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRTb2xlbm9pZA0KK3sNCitwdWJsaWM6DQorICAgdFNvbGVub2lkKCl7fQ0KKyAgIHZpcnR1YWwgfnRTb2xlbm9pZCgpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdFNvbGVub2lkKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgICAga051bURPN18wRWxlbWVudHMgPSAyLA0KKyAgIH0gdERPN18wX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCB3cml0ZURPN18wKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERPN18wKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisNCisNCitwcml2YXRlOg0KKyAgIHRTb2xlbm9pZChjb25zdCB0U29sZW5vaWQmKTsNCisgICB2b2lkIG9wZXJhdG9yPShjb25zdCB0U29sZW5vaWQmKTsNCit9Ow0KKw0KK30NCit9DQorDQorI2VuZGlmIC8vIF9fbkZSQ18yMDEyXzFfNl80X1NvbGVub2lkX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RTeXNXYXRjaGRvZy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUnVudGltZUZQR0FOYW1lc3BhY2UvdFN5c1dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMDFmZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RTeXNXYXRjaGRvZy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCENCisNCisjaWZuZGVmIF9fbkZSQ18yMDEyXzFfNl80X1N5c1dhdGNoZG9nX2hfXw0KKyNkZWZpbmUgX19uRlJDXzIwMTJfMV82XzRfU3lzV2F0Y2hkb2dfaF9fDQorDQorI2luY2x1ZGUgInRTeXN0ZW1JbnRlcmZhY2UuaCINCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorbmFtZXNwYWNlIG5GUkNfMjAxMl8xXzZfNA0KK3sNCisNCitjbGFzcyB0U3lzV2F0Y2hkb2cNCit7DQorcHVibGljOg0KKyAgIHRTeXNXYXRjaGRvZygpe30NCisgICB2aXJ0dWFsIH50U3lzV2F0Y2hkb2coKXt9DQorDQorICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7DQorICAgc3RhdGljIHRTeXNXYXRjaGRvZyogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICAgICBrTnVtU3lzdGVtcyA9IDEsDQorICAgfSB0SWZhY2VDb25zdGFudHM7DQorDQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdENvbW1hbmRfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQ29tbWFuZCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZENvbW1hbmQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRDaGFsbGVuZ2VfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDaGFsbGVuZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRBY3RpdmVfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlQWN0aXZlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZEFjdGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFRpbWVyX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUaW1lcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorDQorDQorcHJpdmF0ZToNCisgICB0U3lzV2F0Y2hkb2coY29uc3QgdFN5c1dhdGNoZG9nJik7DQorICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdFN5c1dhdGNoZG9nJik7DQorfTsNCisNCit9DQorfQ0KKw0KKyNlbmRpZiAvLyBfX25GUkNfMjAxMl8xXzZfNF9TeXNXYXRjaGRvZ19oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90V2F0Y2hkb2cuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJ1bnRpbWVGUEdBTmFtZXNwYWNlL3RXYXRjaGRvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODllZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L25SdW50aW1lRlBHQU5hbWVzcGFjZS90V2F0Y2hkb2cuaApAQCAtMCwwICsxLDEwOCBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisvLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQ0KKw0KKyNpZm5kZWYgX19uRlJDXzIwMTJfMV82XzRfV2F0Y2hkb2dfaF9fDQorI2RlZmluZSBfX25GUkNfMjAxMl8xXzZfNF9XYXRjaGRvZ19oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbUludGVyZmFjZS5oIg0KKw0KK25hbWVzcGFjZSBuRlBHQQ0KK3sNCituYW1lc3BhY2UgbkZSQ18yMDEyXzFfNl80DQorew0KKw0KK2NsYXNzIHRXYXRjaGRvZw0KK3sNCitwdWJsaWM6DQorICAgdFdhdGNoZG9nKCl7fQ0KKyAgIHZpcnR1YWwgfnRXYXRjaGRvZygpe30NCisNCisgICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsNCisgICBzdGF0aWMgdFdhdGNoZG9nKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgICAgIGtOdW1TeXN0ZW1zID0gMSwNCisgICB9IHRJZmFjZUNvbnN0YW50czsNCisNCisgICB0eXBlZGVmDQorICAgdW5pb257DQorICAgICAgc3RydWN0ew0KKyNpZmRlZiBfX3Z4d29ya3MNCisgICAgICAgICB1bnNpZ25lZCBTeXN0ZW1BY3RpdmUgOiAxOw0KKyAgICAgICAgIHVuc2lnbmVkIEFsaXZlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBTeXNEaXNhYmxlQ291bnQgOiAxNTsNCisgICAgICAgICB1bnNpZ25lZCBEaXNhYmxlQ291bnQgOiAxNTsNCisjZWxzZQ0KKyAgICAgICAgIHVuc2lnbmVkIERpc2FibGVDb3VudCA6IDE1Ow0KKyAgICAgICAgIHVuc2lnbmVkIFN5c0Rpc2FibGVDb3VudCA6IDE1Ow0KKyAgICAgICAgIHVuc2lnbmVkIEFsaXZlIDogMTsNCisgICAgICAgICB1bnNpZ25lZCBTeXN0ZW1BY3RpdmUgOiAxOw0KKyNlbmRpZg0KKyAgICAgIH07DQorICAgICAgc3RydWN0ew0KKyAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7DQorICAgICAgfTsNCisgICB9IHRTdGF0dXM7DQorDQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdFN0YXR1c19JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHRTdGF0dXMgcmVhZFN0YXR1cyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCBib29sIHJlYWRTdGF0dXNfU3lzdGVtQWN0aXZlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisgICB2aXJ0dWFsIGJvb2wgcmVhZFN0YXR1c19BbGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkU3RhdHVzX1N5c0Rpc2FibGVDb3VudCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkU3RhdHVzX0Rpc2FibGVDb3VudCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7DQorDQorDQorICAgdHlwZWRlZiBlbnVtDQorICAgew0KKyAgIH0gdEtpbGxfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHN0cm9iZUtpbGwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKyAgIHR5cGVkZWYgZW51bQ0KKyAgIHsNCisgICB9IHRGZWVkX0lmYWNlQ29uc3RhbnRzOw0KKw0KKyAgIHZpcnR1YWwgdm9pZCBzdHJvYmVGZWVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0VGltZXJfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0RXhwaXJhdGlvbl9JZmFjZUNvbnN0YW50czsNCisNCisgICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHBpcmF0aW9uKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRFeHBpcmF0aW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsNCisNCisNCisgICB0eXBlZGVmIGVudW0NCisgICB7DQorICAgfSB0SW1tb3J0YWxfSWZhY2VDb25zdGFudHM7DQorDQorICAgdmlydHVhbCB2b2lkIHdyaXRlSW1tb3J0YWwoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKyAgIHZpcnR1YWwgYm9vbCByZWFkSW1tb3J0YWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOw0KKw0KKw0KKw0KKw0KK3ByaXZhdGU6DQorICAgdFdhdGNoZG9nKGNvbnN0IHRXYXRjaGRvZyYpOw0KKyAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRXYXRjaGRvZyYpOw0KK307DQorDQorfQ0KK30NCisNCisjZW5kaWYgLy8gX19uRlJDXzIwMTJfMV82XzRfV2F0Y2hkb2dfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9wcmludEZwZ2FWZXJzaW9uLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3ByaW50RnBnYVZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODhmMWRmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC9wcmludEZwZ2FWZXJzaW9uLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisNCisjaWZuZGVmIF9fcHJpbnRGUEdBVmVyc2lvbl9oX18NCisjZGVmaW5lIF9fcHJpbnRGUEdBVmVyc2lvbl9oX18NCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorDQordGVtcGxhdGU8dHlwZW5hbWUgdHRHbG9iYWw+DQoraW5saW5lIHZvaWQgcHJpbnRGUEdBVmVyc2lvbih0dEdsb2JhbCAmZ2xvYmFsKQ0KK3sNCisgICB0UmlvU3RhdHVzQ29kZSBjbGVhblN0YXR1cz0wOw0KKyAgIHVpbnQzMl90IGhhcmR3YXJlR3VpZFs0XTsNCisgICB0U3lzdGVtSW50ZXJmYWNlICZzeXN0ZW0gPSAqZ2xvYmFsLmdldFN5c3RlbUludGVyZmFjZSgpOw0KKyAgIHN5c3RlbS5nZXRIYXJkd2FyZUZwZ2FTaWduYXR1cmUoaGFyZHdhcmVHdWlkLCAmY2xlYW5TdGF0dXMpOw0KKyAgIGNvbnN0IHVpbnQzMl90ICpzb2Z0d2FyZUd1aWQgPSBzeXN0ZW0uZ2V0RXhwZWN0ZWRGUEdBU2lnbmF0dXJlKCk7DQorICAgcHJpbnRmKCJGUEdBIEhhcmR3YXJlIEdVSUQ6IDB4Iik7DQorICAgZm9yKGludCBpPTA7IGk8NDsgaSsrKQ0KKyAgIHsNCisgICAgICBwcmludGYoIiUwOFgiLCBoYXJkd2FyZUd1aWRbaV0pOw0KKyAgIH0NCisgICBwcmludGYoIlxuIik7DQorICAgcHJpbnRmKCJGUEdBIFNvZnR3YXJlIEdVSUQ6IDB4Iik7DQorICAgZm9yKGludCBpPTA7IGk8NDsgaSsrKQ0KKyAgIHsNCisgICAgICBwcmludGYoIiUwOFgiLCBzb2Z0d2FyZUd1aWRbaV0pOw0KKyAgIH0NCisgICBwcmludGYoIlxuIik7DQorICAgdWludDE2X3QgZnBnYUhhcmR3YXJlVmVyc2lvbiA9IGdsb2JhbC5yZWFkVmVyc2lvbigmY2xlYW5TdGF0dXMpOw0KKyAgIHVpbnQxNl90IGZwZ2FTb2Z0d2FyZVZlcnNpb24gPSBzeXN0ZW0uZ2V0RXhwZWN0ZWRGUEdBVmVyc2lvbigpOw0KKyAgIHByaW50ZigiRlBHQSBIYXJkd2FyZSBWZXJzaW9uOiAlWFxuIiwgZnBnYUhhcmR3YXJlVmVyc2lvbik7DQorICAgcHJpbnRmKCJGUEdBIFNvZnR3YXJlIFZlcnNpb246ICVYXG4iLCBmcGdhU29mdHdhcmVWZXJzaW9uKTsNCisgICB1aW50MzJfdCBmcGdhSGFyZHdhcmVSZXZpc2lvbiA9IGdsb2JhbC5yZWFkUmV2aXNpb24oJmNsZWFuU3RhdHVzKTsNCisgICB1aW50MzJfdCBmcGdhU29mdHdhcmVSZXZpc2lvbiA9IHN5c3RlbS5nZXRFeHBlY3RlZEZQR0FSZXZpc2lvbigpOw0KKyAgIHByaW50ZigiRlBHQSBIYXJkd2FyZSBSZXZpc2lvbjogJVguJVguJVhcbiIsIChmcGdhSGFyZHdhcmVSZXZpc2lvbiA+PiAyMCkgJiAweEZGRiwgKGZwZ2FIYXJkd2FyZVJldmlzaW9uID4+IDEyKSAmIDB4RkYsIGZwZ2FIYXJkd2FyZVJldmlzaW9uICYgMHhGRkYpOw0KKyAgIHByaW50ZigiRlBHQSBTb2Z0d2FyZSBSZXZpc2lvbjogJVguJVguJVhcbiIsIChmcGdhU29mdHdhcmVSZXZpc2lvbiA+PiAyMCkgJiAweEZGRiwgKGZwZ2FTb2Z0d2FyZVJldmlzaW9uID4+IDEyKSAmIDB4RkYsIGZwZ2FTb2Z0d2FyZVJldmlzaW9uICYgMHhGRkYpOw0KK30NCisNCit9DQorDQorI2VuZGlmIC8vIF9fcHJpbnRGUEdBVmVyc2lvbl9oX18NCisNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RETUFDaGFubmVsRGVzY3JpcHRvci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90RE1BQ2hhbm5lbERlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE1OTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90RE1BQ2hhbm5lbERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDE3IEBACisvLyBEZXNjcmliZXMgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb25maWd1cmUgYSBETUEgY2hhbm5lbC4NCisvLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKw0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisNCisjaWZuZGVmIF9fdERNQUNoYW5uZWxEZXNjcmlwdG9yX2hfXw0KKyNkZWZpbmUgX190RE1BQ2hhbm5lbERlc2NyaXB0b3JfaF9fDQorDQorc3RydWN0IHRETUFDaGFubmVsRGVzY3JpcHRvcg0KK3sNCisgICB1aW50MzJfdCBjaGFubmVsOw0KKyAgIHVpbnQzMl90IGJhc2VBZGRyZXNzOw0KKyAgIHVpbnQzMl90IGRlcHRoOw0KKyAgIGJvb2wgdGFyZ2V0VG9Ib3N0Ow0KK307DQorDQorI2VuZGlmIC8vIF9fdERNQUNoYW5uZWxEZXNjcmlwdG9yX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdERNQU1hbmFnZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdERNQU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjk1MjAzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90RE1BTWFuYWdlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENsYXNzIGZvciBoYW5kbGluZyBETUEgdHJhbnNmZXJzLg0KKy8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorDQorI2lmbmRlZiBfX3RETUFNYW5hZ2VyX2hfXw0KKyNkZWZpbmUgX190RE1BTWFuYWdlcl9oX18NCisNCisjaW5jbHVkZSAidFN5c3RlbS5oIg0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorY2xhc3MgdERNQU1hbmFnZXIgOiBwdWJsaWMgdFN5c3RlbQ0KK3sNCitwdWJsaWM6DQorICAgdERNQU1hbmFnZXIodWludDMyX3QgZG1hQ2hhbm5lbCwgdWludDMyX3QgaG9zdEJ1ZmZlclNpemUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIH50RE1BTWFuYWdlcigpOw0KKyAgIHZvaWQgc3RhcnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdm9pZCBzdG9wKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIGJvb2wgaXNTdGFydGVkKCkge3JldHVybiBfc3RhcnRlZDt9DQorICAgdm9pZCByZWFkKA0KKyAgICAgIHVpbnQzMl90KiAgICAgIGJ1ZiwNCisgICAgICBzaXplX3QgICAgICAgICBudW0sDQorICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwNCisgICAgICBzaXplX3QqICAgICAgICByZW1haW5pbmcsDQorICAgICAgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdm9pZCB3cml0ZSgNCisgICAgICB1aW50MzJfdCogICAgICBidWYsDQorICAgICAgc2l6ZV90ICAgICAgICAgbnVtLA0KKyAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsDQorICAgICAgc2l6ZV90KiAgICAgICAgcmVtYWluaW5nLA0KKyAgICAgIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KK3ByaXZhdGU6DQorICAgYm9vbCBfc3RhcnRlZDsNCisgICB1aW50MzJfdCBfZG1hQ2hhbm5lbDsNCisgICB1aW50MzJfdCBfaG9zdEJ1ZmZlclNpemU7DQorDQorfTsNCisNCit9DQorDQorI2VuZGlmIC8vIF9fdERNQU1hbmFnZXJfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90SW50ZXJydXB0TWFuYWdlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90SW50ZXJydXB0TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjc4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RJbnRlcnJ1cHRNYW5hZ2VyLmgKQEAgLTAsMCArMSw2MSBAQAorLy8gQ2xhc3MgZm9yIGhhbmRsaW5nIGludGVycnVwdHMuDQorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisNCisjaWZuZGVmIF9fdEludGVycnVwdE1hbmFnZXJfaF9fDQorI2RlZmluZSBfX3RJbnRlcnJ1cHRNYW5hZ2VyX2hfXw0KKw0KKyNpbmNsdWRlICJ0U3lzdGVtLmgiDQorDQorbmFtZXNwYWNlIG5pDQorew0KKyAgIG5hbWVzcGFjZSBkc2MNCisgICB7DQorICAgICAgbmFtZXNwYWNlIG9zZGVwDQorICAgICAgew0KKyAgICAgICAgIGNsYXNzIENyaXRpY2FsU2VjdGlvbjsNCisgICAgICB9DQorICAgfQ0KK30NCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorDQordHlwZWRlZiB2b2lkICgqdEludGVycnVwdEhhbmRsZXIpKHVpbnQzMl90IGludGVycnVwdEFzc2VydGVkTWFzaywgdm9pZCAqcGFyYW0pOw0KKw0KK2NsYXNzIHRJbnRlcnJ1cHRNYW5hZ2VyIDogcHVibGljIHRTeXN0ZW0NCit7DQorcHVibGljOg0KKyAgIHRJbnRlcnJ1cHRNYW5hZ2VyKHVpbnQzMl90IGludGVycnVwdE1hc2ssIGJvb2wgd2F0Y2hlciwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgfnRJbnRlcnJ1cHRNYW5hZ2VyKCk7DQorICAgdm9pZCByZWdpc3RlckhhbmRsZXIodEludGVycnVwdEhhbmRsZXIgaGFuZGxlciwgdm9pZCAqcGFyYW0sIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHVpbnQzMl90IHdhdGNoKGludDMyX3QgdGltZW91dEluTXMsIGJvb2wgaWdub3JlUHJldmlvdXMsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZvaWQgZW5hYmxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKyAgIHZvaWQgZGlzYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICBib29sIGlzRW5hYmxlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCitwcml2YXRlOg0KKyAgIGNsYXNzIHRJbnRlcnJ1cHRUaHJlYWQ7DQorICAgZnJpZW5kIGNsYXNzIHRJbnRlcnJ1cHRUaHJlYWQ7DQorICAgdm9pZCBoYW5kbGVyKCk7DQorICAgc3RhdGljIGludCBoYW5kbGVyV3JhcHBlcih0SW50ZXJydXB0TWFuYWdlciAqcEludGVycnVwdCk7DQorDQorICAgdm9pZCBhY2tub3dsZWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2b2lkIHJlc2VydmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdm9pZCB1bnJlc2VydmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7DQorICAgdEludGVycnVwdEhhbmRsZXIgX2hhbmRsZXI7DQorICAgdWludDMyX3QgX2ludGVycnVwdE1hc2s7DQorICAgdEludGVycnVwdFRocmVhZCAqX3RocmVhZDsNCisgICBOaUZwZ2FfSXJxQ29udGV4dCBfcmlvQ29udGV4dDsNCisgICBib29sIF93YXRjaGVyOw0KKyAgIGJvb2wgX2VuYWJsZWQ7DQorICAgdm9pZCAqX3VzZXJQYXJhbTsNCisNCisgICAvLyBtYWludGFpbiB0aGUgaW50ZXJydXB0cyB0aGF0IGFyZSBhbHJlYWR5IGRlYWx0IHdpdGguDQorICAgc3RhdGljIHVpbnQzMl90IF9nbG9iYWxJbnRlcnJ1cHRNYXNrOw0KKyAgIHN0YXRpYyBuaTo6ZHNjOjpvc2RlcDo6Q3JpdGljYWxTZWN0aW9uICpfZ2xvYmFsSW50ZXJydXB0TWFza1NlbWFwaG9yZTsNCit9Ow0KKw0KK30NCisNCisNCisjZW5kaWYgLy8gX190SW50ZXJydXB0TWFuYWdlcl9oX18NCisNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW0uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ZSQ19GUEdBX0NoaXBPYmplY3QvdFN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTllNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW0uaApAQCAtMCwwICsxLDQ4IEBACisvLyBCYXNlIGNsYXNzIGZvciBnZW5lcmF0ZWQgY2hpcCBvYmplY3RzDQorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisNCisjaWZuZGVmIF9fdFN5c3RlbV9oX18NCisjZGVmaW5lIF9fdFN5c3RlbV9oX18NCisNCisjaW5jbHVkZSAiZnBnYWludGVyZmFjZWNhcGkvTmlGcGdhLmgiDQordHlwZWRlZiBOaUZwZ2FfU3RhdHVzIHRSaW9TdGF0dXNDb2RlOw0KKw0KKyNkZWZpbmUgRlJDX0ZQR0FfUFJFTE9BRF9CSVRGSUxFDQorDQordHlwZWRlZiB1aW50MzJfdCBOaUZwZ2FfU2Vzc2lvbjsNCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorDQorY2xhc3MgdFN5c3RlbQ0KK3sNCitwdWJsaWM6DQorICAgdFN5c3RlbSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB+dFN5c3RlbSgpOw0KKyAgIHZvaWQgZ2V0RnBnYUd1aWQodWludDMyX3QgKmd1aWRfcHRyLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsNCisgICB2b2lkIHJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOw0KKw0KK3Byb3RlY3RlZDoNCisgICBzdGF0aWMgTmlGcGdhX1Nlc3Npb24gX0RldmljZUhhbmRsZTsNCisNCisjaWZkZWYgRlJDX0ZQR0FfUFJFTE9BRF9CSVRGSUxFDQorICAgdm9pZCBOaUZwZ2FfU2hhcmVkT3Blbl9jb21tb24oY29uc3QgY2hhciogICAgIGJpdGZpbGUpOw0KKyAgIE5pRnBnYV9TdGF0dXMgTmlGcGdhX1NoYXJlZE9wZW4oY29uc3QgY2hhciogICAgIGJpdGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICBzaWduYXR1cmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICByZXNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24qIHNlc3Npb24pOw0KKyAgIE5pRnBnYV9TdGF0dXMgTmlGcGdhTHZfU2hhcmVkT3Blbihjb25zdCBjaGFyKiBjb25zdCAgICAgYml0ZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgICAgIGFwaVNpZ25hdHVyZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgICAgIHJlc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICAgICAgYXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiogY29uc3Qgc2Vzc2lvbik7DQorcHJpdmF0ZToNCisgICAgc3RhdGljIGNoYXIgKl9GaWxlTmFtZTsNCisgICAgc3RhdGljIGNoYXIgKl9CaXRmaWxlOw0KKyNlbmRpZg0KK307DQorDQorfQ0KKw0KKyNlbmRpZiAvLyBfX3RTeXN0ZW1faF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90U3lzdGVtSW50ZXJmYWNlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW1JbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk0MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvRlJDX0ZQR0FfQ2hpcE9iamVjdC90U3lzdGVtSW50ZXJmYWNlLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisNCisjaWZuZGVmIF9fdFN5c3RlbUludGVyZmFjZV9oX18NCisjZGVmaW5lIF9fdFN5c3RlbUludGVyZmFjZV9oX18NCisNCituYW1lc3BhY2UgbkZQR0ENCit7DQorDQorY2xhc3MgdFN5c3RlbUludGVyZmFjZQ0KK3sNCitwdWJsaWM6DQorICAgdFN5c3RlbUludGVyZmFjZSgpe30NCisgICB2aXJ0dWFsIH50U3lzdGVtSW50ZXJmYWNlKCl7fQ0KKw0KKyAgIHZpcnR1YWwgY29uc3QgdWludDE2X3QgZ2V0RXhwZWN0ZWRGUEdBVmVyc2lvbigpPTA7DQorICAgdmlydHVhbCBjb25zdCB1aW50MzJfdCBnZXRFeHBlY3RlZEZQR0FSZXZpc2lvbigpPTA7DQorICAgdmlydHVhbCBjb25zdCB1aW50MzJfdCAqIGNvbnN0IGdldEV4cGVjdGVkRlBHQVNpZ25hdHVyZSgpPTA7DQorICAgdmlydHVhbCB2b2lkIGdldEhhcmR3YXJlRnBnYVNpZ25hdHVyZSh1aW50MzJfdCAqZ3VpZF9wdHIsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpPTA7DQorICAgdmlydHVhbCB1aW50MzJfdCBnZXRMVkhhbmRsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKT0wOw0KKyAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SGFuZGxlKCk9MDsNCisgICB2aXJ0dWFsIHZvaWQgcmVzZXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk9MDsNCit9Ow0KKw0KK30NCisNCisjZW5kaWYgLy8gX190U3lzdGVtSW50ZXJmYWNlX2hfXw0KKw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0hBTC5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9IQUwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWYwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9IQUwuY3BwCkBAIC0wLDAgKzEsMzczIEBACisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKKyNpbmNsdWRlICJQb3J0LmgiCisjaW5jbHVkZSAiSEFML0Vycm9ycy5ocHAiCisjaW5jbHVkZSAiY3RyZS9jdHJlLmgiCisjaW5jbHVkZSAidmlzYS92aXNhLmgiCisjaW5jbHVkZSAiQ2hpcE9iamVjdC5oIgorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0xvYWRPdXQuaCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgiCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4gLy8gbGludXggZm9yIGtpbGwKK2NvbnN0IHVpbnQzMl90IHNvbGVub2lkX2tOdW1ETzdfMEVsZW1lbnRzID0gODsKK2NvbnN0IHVpbnQzMl90IGRpb19rTnVtU3lzdGVtcyA9IHRESU86OmtOdW1TeXN0ZW1zOworY29uc3QgdWludDMyX3QgaW50ZXJydXB0X2tOdW1TeXN0ZW1zID0gdEludGVycnVwdDo6a051bVN5c3RlbXM7Citjb25zdCB1aW50MzJfdCBrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kID0gNDA7CisKK3N0YXRpYyB0R2xvYmFsICpnbG9iYWw7CitzdGF0aWMgdFN5c1dhdGNoZG9nICp3YXRjaGRvZzsKKwordm9pZCogZ2V0UG9ydCh1aW50OF90IHBpbikKK3sKKwlQb3J0KiBwb3J0ID0gbmV3IFBvcnQoKTsKKwlwb3J0LT5waW4gPSBwaW47CisJcG9ydC0+bW9kdWxlID0gMTsKKwlyZXR1cm4gcG9ydDsKK30KKworLyoqCisgKiBAZGVwcmVjYXRlZCBVc2VzIG1vZHVsZSBudW1iZXJzCisgKi8KK3ZvaWQqIGdldFBvcnRXaXRoTW9kdWxlKHVpbnQ4X3QgbW9kdWxlLCB1aW50OF90IHBpbikKK3sKKwlQb3J0KiBwb3J0ID0gbmV3IFBvcnQoKTsKKwlwb3J0LT5waW4gPSBwaW47CisJcG9ydC0+bW9kdWxlID0gbW9kdWxlOworCXJldHVybiBwb3J0OworfQorCitjb25zdCBjaGFyKiBnZXRIQUxFcnJvck1lc3NhZ2UoaW50MzJfdCBjb2RlKQoreworCXN3aXRjaChjb2RlKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiAiIjsKKwkJY2FzZSBDVFJfUnhUaW1lb3V0OgorCQkJcmV0dXJuIENUUl9SeFRpbWVvdXRfTUVTU0FHRTsKKwkJY2FzZSBDVFJfVHhUaW1lb3V0OgorCQkJcmV0dXJuIENUUl9UeFRpbWVvdXRfTUVTU0FHRTsKKwkJY2FzZSBDVFJfSW52YWxpZFBhcmFtVmFsdWU6CisJCQlyZXR1cm4gQ1RSX0ludmFsaWRQYXJhbVZhbHVlX01FU1NBR0U7CisJCWNhc2UgQ1RSX1VuZXhwZWN0ZWRBcmJJZDoKKwkJCXJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkX01FU1NBR0U7CisJCWNhc2UgQ1RSX1R4RmFpbGVkOgorCQkJcmV0dXJuIENUUl9UeEZhaWxlZF9NRVNTQUdFOworCQljYXNlIENUUl9TaWdOb3RVcGRhdGVkOgorCQkJcmV0dXJuIENUUl9TaWdOb3RVcGRhdGVkX01FU1NBR0U7CisJCWNhc2UgTmlGcGdhX1N0YXR1c19GaWZvVGltZW91dDoKKwkJCXJldHVybiBOaUZwZ2FfU3RhdHVzX0ZpZm9UaW1lb3V0X01FU1NBR0U7CisJCWNhc2UgTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWQ6CisJCQlyZXR1cm4gTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWRfTUVTU0FHRTsKKwkJY2FzZSBOaUZwZ2FfU3RhdHVzX01lbW9yeUZ1bGw6IAorCQkJcmV0dXJuIE5pRnBnYV9TdGF0dXNfTWVtb3J5RnVsbF9NRVNTQUdFOworCQljYXNlIE5pRnBnYV9TdGF0dXNfU29mdHdhcmVGYXVsdDoKKwkJCXJldHVybiBOaUZwZ2FfU3RhdHVzX1NvZnR3YXJlRmF1bHRfTUVTU0FHRTsKKwkJY2FzZSBOaUZwZ2FfU3RhdHVzX0ludmFsaWRQYXJhbWV0ZXI6CisJCQlyZXR1cm4gTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyX01FU1NBR0U7CisJCWNhc2UgTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kOgorCQkJcmV0dXJuIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RGb3VuZF9NRVNTQUdFOyAKKwkJY2FzZSBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90SW5pdGlhbGl6ZWQ6CisJCQlyZXR1cm4gTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEluaXRpYWxpemVkX01FU1NBR0U7IAorCQljYXNlIE5pRnBnYV9TdGF0dXNfSGFyZHdhcmVGYXVsdDoKKwkJCXJldHVybiBOaUZwZ2FfU3RhdHVzX0hhcmR3YXJlRmF1bHRfTUVTU0FHRTsKKwkJY2FzZSBOaUZwZ2FfU3RhdHVzX0lycVRpbWVvdXQ6CisJCQlyZXR1cm4gTmlGcGdhX1N0YXR1c19JcnFUaW1lb3V0X01FU1NBR0U7CisJCWNhc2UgTmlGcGdhX1N0YXR1c19WZXJzaW9uTWlzbWF0Y2g6CisJCQlyZXR1cm4gTmlGcGdhX1N0YXR1c19WZXJzaW9uTWlzbWF0Y2hfTUVTU0FHRTsKKwkJY2FzZSBTQU1QTEVfUkFURV9UT09fSElHSDoKKwkJCXJldHVybiBTQU1QTEVfUkFURV9UT09fSElHSF9NRVNTQUdFOworCQljYXNlIFZPTFRBR0VfT1VUX09GX1JBTkdFOgorCQkJcmV0dXJuIFZPTFRBR0VfT1VUX09GX1JBTkdFX01FU1NBR0U7CisJCWNhc2UgTE9PUF9USU1JTkdfRVJST1I6CisJCQlyZXR1cm4gTE9PUF9USU1JTkdfRVJST1JfTUVTU0FHRTsKKwkJY2FzZSBTUElfV1JJVEVfTk9fTU9TSToKKwkJCXJldHVybiBTUElfV1JJVEVfTk9fTU9TSV9NRVNTQUdFOworCQljYXNlIFNQSV9SRUFEX05PX01JU086CisJCQlyZXR1cm4gU1BJX1JFQURfTk9fTUlTT19NRVNTQUdFOworCQljYXNlIFNQSV9SRUFEX05PX0RBVEE6CisJCQlyZXR1cm4gU1BJX1JFQURfTk9fREFUQV9NRVNTQUdFOworCQljYXNlIElOQ09NUEFUSUJMRV9TVEFURToKKwkJCXJldHVybiBJTkNPTVBBVElCTEVfU1RBVEVfTUVTU0FHRTsKKwkJY2FzZSBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTOgorCQkJcmV0dXJuIE5PX0FWQUlMQUJMRV9SRVNPVVJDRVNfTUVTU0FHRTsKKwkJY2FzZSBOVUxMX1BBUkFNRVRFUjoKKwkJCXJldHVybiBOVUxMX1BBUkFNRVRFUl9NRVNTQUdFOworCQljYXNlIEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SOgorCQkJcmV0dXJuIEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SX01FU1NBR0U7CisJCWNhc2UgQU5BTE9HX1RSSUdHRVJfUFVMU0VfT1VUUFVUX0VSUk9SOgorCQkJcmV0dXJuIEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUl9NRVNTQUdFOworCQljYXNlIFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U6CisJCQlyZXR1cm4gUEFSQU1FVEVSX09VVF9PRl9SQU5HRV9NRVNTQUdFOworCQljYXNlIEVSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXI6CisJCQlyZXR1cm4gRVJSX0NBTlNlc3Npb25NdXhfSW52YWxpZEJ1ZmZlcl9NRVNTQUdFOworCQljYXNlIEVSUl9DQU5TZXNzaW9uTXV4X01lc3NhZ2VOb3RGb3VuZDoKKwkJCXJldHVybiBFUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmRfTUVTU0FHRTsKKwkJY2FzZSBXQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbjoKKwkJCXJldHVybiBXQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbl9NRVNTQUdFOworCQljYXNlIEVSUl9DQU5TZXNzaW9uTXV4X05vdEFsbG93ZWQ6CisJCQlyZXR1cm4gRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZF9NRVNTQUdFOworCQljYXNlIEVSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkOgorCQkJcmV0dXJuIEVSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkX01FU1NBR0U7CisJCWNhc2UgVklfRVJST1JfU1lTVEVNX0VSUk9SOgorCQkJcmV0dXJuIFZJX0VSUk9SX1NZU1RFTV9FUlJPUl9NRVNTQUdFOworCQljYXNlIFZJX0VSUk9SX0lOVl9PQkpFQ1Q6CisJCQlyZXR1cm4gVklfRVJST1JfSU5WX09CSkVDVF9NRVNTQUdFOworCQljYXNlIFZJX0VSUk9SX1JTUkNfTE9DS0VEOgorCQkJcmV0dXJuIFZJX0VSUk9SX1JTUkNfTE9DS0VEX01FU1NBR0U7CisJCWNhc2UgVklfRVJST1JfUlNSQ19ORk9VTkQ6CisJCQlyZXR1cm4gVklfRVJST1JfUlNSQ19ORk9VTkRfTUVTU0FHRTsKKwkJY2FzZSBWSV9FUlJPUl9JTlZfUlNSQ19OQU1FOgorCQkJcmV0dXJuIFZJX0VSUk9SX0lOVl9SU1JDX05BTUVfTUVTU0FHRTsKKwkJY2FzZSBWSV9FUlJPUl9RVUVVRV9PVkVSRkxPVzoKKwkJCXJldHVybiBWSV9FUlJPUl9RVUVVRV9PVkVSRkxPV19NRVNTQUdFOworCQljYXNlIFZJX0VSUk9SX0lPOgorCQkJcmV0dXJuIFZJX0VSUk9SX0lPX01FU1NBR0U7CisJCWNhc2UgVklfRVJST1JfQVNSTF9QQVJJVFk6CisJCQlyZXR1cm4gVklfRVJST1JfQVNSTF9QQVJJVFlfTUVTU0FHRTsKKwkJY2FzZSBWSV9FUlJPUl9BU1JMX0ZSQU1JTkc6CisJCQlyZXR1cm4gVklfRVJST1JfQVNSTF9GUkFNSU5HX01FU1NBR0U7CisJCWNhc2UgVklfRVJST1JfQVNSTF9PVkVSUlVOOgorCQkJcmV0dXJuIFZJX0VSUk9SX0FTUkxfT1ZFUlJVTl9NRVNTQUdFOworCQljYXNlIFZJX0VSUk9SX1JTUkNfQlVTWToKKwkJCXJldHVybiBWSV9FUlJPUl9SU1JDX0JVU1lfTUVTU0FHRTsKKwkJY2FzZSBWSV9FUlJPUl9JTlZfUEFSQU1FVEVSOgorCQkJcmV0dXJuIFZJX0VSUk9SX0lOVl9QQVJBTUVURVJfTUVTU0FHRTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiVW5rbm93biBlcnJvciBzdGF0dXMiOworCX0KK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEZQR0EgVmVyc2lvbiBudW1iZXIuCisgKiBGb3Igbm93LCBleHBlY3QgdGhpcyB0byBiZSBjb21wZXRpdGlvbiB5ZWFyLgorICogQHJldHVybiBGUEdBIFZlcnNpb24gbnVtYmVyLgorICovCit1aW50MTZfdCBnZXRGUEdBVmVyc2lvbihpbnQzMl90ICpzdGF0dXMpCit7CisJcmV0dXJuIGdsb2JhbC0+cmVhZFZlcnNpb24oc3RhdHVzKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEZQR0EgUmV2aXNpb24gbnVtYmVyLgorICogVGhlIGZvcm1hdCBvZiB0aGUgcmV2aXNpb24gaXMgMyBudW1iZXJzLgorICogVGhlIDEyIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgdGhlIE1ham9yIFJldmlzaW9uLgorICogdGhlIG5leHQgOCBiaXRzIGFyZSB0aGUgTWlub3IgUmV2aXNpb24uCisgKiBUaGUgMTIgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgdGhlIEJ1aWxkIE51bWJlci4KKyAqIEByZXR1cm4gRlBHQSBSZXZpc2lvbiBudW1iZXIuCisgKi8KK3VpbnQzMl90IGdldEZQR0FSZXZpc2lvbihpbnQzMl90ICpzdGF0dXMpCit7CisJcmV0dXJuIGdsb2JhbC0+cmVhZFJldmlzaW9uKHN0YXR1cyk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgbWljcm9zZWNvbmQtcmVzb2x1dGlvbiB0aW1lciBvbiB0aGUgRlBHQS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRpbWUgaW4gbWljcm9zZWNvbmRzIGFjY29yZGluZyB0byB0aGUgRlBHQSAoc2luY2UgRlBHQSByZXNldCkuCisgKi8KK3VpbnQzMl90IGdldEZQR0FUaW1lKGludDMyX3QgKnN0YXR1cykKK3sKKwlyZXR1cm4gZ2xvYmFsLT5yZWFkTG9jYWxUaW1lKHN0YXR1cyk7Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgIlVTRVIiIGJ1dHRvbiBvbiB0aGUgUm9ib1JJTworICogQHJldHVybiB0cnVlIGlmIHRoZSBidXR0b24gaXMgY3VycmVudGx5IHByZXNzZWQgZG93bgorICovCitib29sIGdldEZQR0FCdXR0b24oaW50MzJfdCAqc3RhdHVzKQoreworCXJldHVybiBnbG9iYWwtPnJlYWRVc2VyQnV0dG9uKHN0YXR1cyk7Cit9CisKK2ludCBIQUxTZXRFcnJvckRhdGEoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgZXJyb3JzTGVuZ3RoLCBpbnQgd2FpdF9tcykKK3sKKwlyZXR1cm4gc2V0RXJyb3JEYXRhKGVycm9ycywgZXJyb3JzTGVuZ3RoLCB3YWl0X21zKTsKK30KKworaW50IEhBTEdldENvbnRyb2xXb3JkKEhBTENvbnRyb2xXb3JkICpkYXRhKQoreworCXJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Q29udHJvbFdvcmQoKENvbnRyb2xXb3JkX3QqKSBkYXRhKTsKK30KKworaW50IEhBTEdldEFsbGlhbmNlU3RhdGlvbihlbnVtIEhBTEFsbGlhbmNlU3RhdGlvbklEICphbGxpYW5jZVN0YXRpb24pCit7CisJcmV0dXJuIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRBbGxpYW5jZVN0YXRpb24oKEFsbGlhbmNlU3RhdGlvbklEX3QqKSBhbGxpYW5jZVN0YXRpb24pOworfQorCitpbnQgSEFMR2V0Sm95c3RpY2tBeGVzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIEhBTEpveXN0aWNrQXhlcyAqYXhlcykKK3sKKwlyZXR1cm4gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrQXhlcyhqb3lzdGlja051bSwgKEpveXN0aWNrQXhlc190KikgYXhlcywga01heEpveXN0aWNrQXhlcyk7Cit9CisKK2ludCBIQUxHZXRKb3lzdGlja1BPVnModWludDhfdCBqb3lzdGlja051bSwgSEFMSm95c3RpY2tQT1ZzICpwb3ZzKQoreworCXJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tQT1ZzKGpveXN0aWNrTnVtLCAoSm95c3RpY2tQT1ZfdCopIHBvdnMsIGtNYXhKb3lzdGlja1BPVnMpOworfQorCitpbnQgSEFMR2V0Sm95c3RpY2tCdXR0b25zKHVpbnQ4X3Qgam95c3RpY2tOdW0sIEhBTEpveXN0aWNrQnV0dG9ucyAqYnV0dG9ucykKK3sKKwlyZXR1cm4gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrQnV0dG9ucyhqb3lzdGlja051bSwgJmJ1dHRvbnMtPmJ1dHRvbnMsICZidXR0b25zLT5jb3VudCk7Cit9CisKK2ludCBIQUxHZXRKb3lzdGlja0Rlc2NyaXB0b3IodWludDhfdCBqb3lzdGlja051bSwgSEFMSm95c3RpY2tEZXNjcmlwdG9yICpkZXNjKQoreworCXJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tEZXNjKGpveXN0aWNrTnVtLCAmZGVzYy0+aXNYYm94LCAmZGVzYy0+dHlwZSwgKGNoYXIgKikoJmRlc2MtPm5hbWUpLCAKKwkJJmRlc2MtPmF4aXNDb3VudCwgJmRlc2MtPmF4aXNUeXBlcywgJmRlc2MtPmJ1dHRvbkNvdW50LCAmZGVzYy0+cG92Q291bnQpOworfQorCitpbnQgSEFMU2V0Sm95c3RpY2tPdXRwdXRzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQzMl90IG91dHB1dHMsIHVpbnQxNl90IGxlZnRSdW1ibGUsIHVpbnQxNl90IHJpZ2h0UnVtYmxlKQoreworCXJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fc2V0Sm95c3RpY2tPdXRwdXRzKGpveXN0aWNrTnVtLCBvdXRwdXRzLCBsZWZ0UnVtYmxlLCByaWdodFJ1bWJsZSk7Cit9CisKK2ludCBIQUxHZXRNYXRjaFRpbWUoZmxvYXQgKm1hdGNoVGltZSkKK3sKKwlyZXR1cm4gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldE1hdGNoVGltZShtYXRjaFRpbWUpOworfQorCit2b2lkIEhBTFNldE5ld0RhdGFTZW0oTVVMVElXQUlUX0lEIHNlbSkKK3sKKwlzZXROZXdEYXRhU2VtKHNlbSk7Cit9CisKK2Jvb2wgSEFMR2V0U3lzdGVtQWN0aXZlKGludDMyX3QgKnN0YXR1cykKK3sKKwlyZXR1cm4gd2F0Y2hkb2ctPnJlYWRTdGF0dXNfU3lzdGVtQWN0aXZlKHN0YXR1cyk7Cit9CisJCitib29sIEhBTEdldEJyb3duZWRPdXQoaW50MzJfdCAqc3RhdHVzKQoreworCXJldHVybiAhKHdhdGNoZG9nLT5yZWFkU3RhdHVzX1Bvd2VyQWxpdmUoc3RhdHVzKSk7Cit9CisKKy8qKgorICogQ2FsbCB0aGlzIHRvIHN0YXJ0IHVwIEhBTC4gVGhpcyBpcyByZXF1aXJlZCBmb3Igcm9ib3QgcHJvZ3JhbXMuCisgKi8KK2ludCBIQUxJbml0aWFsaXplKGludCBtb2RlKQoreworICAgIHNldGxpbmVidWYoc3RkaW4pOworICAgIHNldGxpbmVidWYoc3Rkb3V0KTsKKworICAgIHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR1RFUk0pOworCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX1Jlc2VydmUobnVsbHB0cik7CisJLy8gaW1hZ2UgNDsgRml4ZXMgZXJyb3JzIGNhdXNlZCBieSBtdWx0aXBsZSBwcm9jZXNzZXMuIFRhbGsgdG8gTkkgYWJvdXQgdGhpcworCW5GUEdBOjpuUm9ib1JJT19GUEdBTmFtZXNwYWNlOjpnX2N1cnJlbnRUYXJnZXRDbGFzcyA9CisJCQluTG9hZE91dDo6a1RhcmdldENsYXNzX1JvYm9SSU87CisKKwlpbnQzMl90IHN0YXR1czsKKwlnbG9iYWwgPSB0R2xvYmFsOjpjcmVhdGUoJnN0YXR1cyk7CisJd2F0Y2hkb2cgPSB0U3lzV2F0Y2hkb2c6OmNyZWF0ZSgmc3RhdHVzKTsKKworCS8vIEtpbGwgYW55IHByZXZpb3VzIHJvYm90IHByb2dyYW1zCisJc3RkOjpmc3RyZWFtIGZzOworCS8vIEJ5IG1ha2luZyB0aGlzIGJvdGggaW4vb3V0LCBpdCB3b24ndCBnaXZlIHVzIGFuIGVycm9yIGlmIGl0IGRvZXNudCBleGlzdAorCWZzLm9wZW4oIi92YXIvbG9jay9mcmMucGlkIiwgc3RkOjpmc3RyZWFtOjppbiB8IHN0ZDo6ZnN0cmVhbTo6b3V0KTsKKwlpZiAoZnMuYmFkKCkpCisJCXJldHVybiAwOworCisJcGlkX3QgcGlkID0gMDsKKwlpZiAoIWZzLmVvZigpICYmICFmcy5mYWlsKCkpCisJeworCQlmcyA+PiBwaWQ7CisJCS8vc2VlIGlmIHRoZSBwaWQgaXMgYXJvdW5kLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggaW5pdCBpZD0xLCBvciBvdXJzZWx2ZXMKKwkJaWYgKHBpZCA+PSAyICYmIGtpbGwocGlkLCAwKSA9PSAwICYmIHBpZCAhPSBnZXRwaWQoKSkKKwkJeworCQkJc3RkOjpjb3V0IDw8ICJLaWxsaW5nIHByZXZpb3VzbHkgcnVubmluZyBGUkMgcHJvZ3JhbS4uLiIKKwkJCQkJPDwgc3RkOjplbmRsOworCQkJa2lsbChwaWQsIFNJR1RFUk0pOyAvLyB0cnkgdG8ga2lsbCBpdAorCQkJZGVsYXlNaWxsaXMoMTAwKTsKKwkJCWlmIChraWxsKHBpZCwgMCkgPT0gMCkKKwkJCXsKKwkJCQkvLyBzdGlsbCBub3Qgc3VjY2Vzc2Z1bGwKKwkJCQlpZiAobW9kZSA9PSAwKQorCQkJCXsKKwkJCQkJc3RkOjpjb3V0IDw8ICJGUkMgcGlkICIgPDwgcGlkCisJCQkJCQkJPDwgIiBkaWQgbm90IGRpZSB3aXRoaW4gMTEwbXMuIEFib3J0aW5nIgorCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJcmV0dXJuIDA7IC8vIGp1c3QgZmFpbAorCQkJCX0KKwkJCQllbHNlIGlmIChtb2RlID09IDEpIC8vIGtpbGwgLTkgaXQKKwkJCQkJa2lsbChwaWQsIFNJR0tJTEwpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXN0ZDo6Y291dCA8PCAiV0FSTklORzogRlJDIHBpZCAiIDw8IHBpZAorCQkJCQkJCTw8ICIgZGlkIG5vdCBkaWUgd2l0aGluIDExMG1zLiIgPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorCWZzLmNsb3NlKCk7CisJLy8gd2Ugd2lsbCByZS1vcGVuIGl0IHdyaXRlIG9ubHkgdG8gdHJ1bmNhdGUgdGhlIGZpbGUKKwlmcy5vcGVuKCIvdmFyL2xvY2svZnJjLnBpZCIsIHN0ZDo6ZnN0cmVhbTo6b3V0IHwgc3RkOjpmc3RyZWFtOjp0cnVuYyk7CisJZnMuc2Vla3AoMCk7CisJcGlkID0gZ2V0cGlkKCk7CisJZnMgPDwgcGlkIDw8IHN0ZDo6ZW5kbDsKKwlmcy5jbG9zZSgpOworCXJldHVybiAxOworfQorCit2b2lkIEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcodm9pZCkKK3sKKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcoKTsKK30KKwordm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKHZvaWQpCit7CisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKCk7Cit9CisKK3ZvaWQgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1BdXRvbm9tb3VzKHZvaWQpCit7CisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMoKTsKK30KKwordm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCh2b2lkKQoreworCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1UZWxlb3AoKTsKK30KKwordm9pZCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlc3Qodm9pZCkKK3sKKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCgpOworfQorCit1aW50MzJfdCBIQUxSZXBvcnQodWludDhfdCByZXNvdXJjZSwgdWludDhfdCBpbnN0YW5jZU51bWJlciwgdWludDhfdCBjb250ZXh0LAorCQljb25zdCBjaGFyICpmZWF0dXJlKQoreworCWlmKGZlYXR1cmUgPT0gTlVMTCkKKwl7CisJCWZlYXR1cmUgPSAiIjsKKwl9CisKKwlyZXR1cm4gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25Vc2FnZVJlcG9ydGluZ19yZXBvcnQocmVzb3VyY2UsIGluc3RhbmNlTnVtYmVyLCBjb250ZXh0LCBmZWF0dXJlKTsKK30KKworLy8gVE9ETzogSEFDS1MKK3ZvaWQgTnVtZXJpY0FycmF5UmVzaXplKCkKK3sKK30KK3ZvaWQgUlRTZXRDbGVhbnVwUHJvYygpCit7Cit9Cit2b2lkIEVEVlJfQ3JlYXRlUmVmZXJlbmNlKCkKK3sKK30KK3ZvaWQgT2NjdXIoKQoreworfQorCit2b2lkIGltYXFHZXRFcnJvclRleHQoKQoreworfQordm9pZCBpbWFxR2V0TGFzdEVycm9yKCkKK3sKK30KK3ZvaWQgbmlUaW1lc3RhbXA2NCgpCit7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9JbnRlcnJ1cHRzLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL0ludGVycnVwdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmQyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9JbnRlcnJ1cHRzLmNwcApAQCAtMCwwICsxLDEyMCBAQAorI2luY2x1ZGUgIkhBTC9JbnRlcnJ1cHRzLmhwcCIKKyNpbmNsdWRlICJDaGlwT2JqZWN0LmgiCisKK3N0cnVjdCBJbnRlcnJ1cHQgLy8gRklYTUU6IHdoeSBpcyB0aGlzIGludGVybmFsPworeworCXRJbnRlcnJ1cHQgKmFuSW50ZXJydXB0OworCXRJbnRlcnJ1cHRNYW5hZ2VyICptYW5hZ2VyOworfTsKKwordm9pZCogaW5pdGlhbGl6ZUludGVycnVwdHModWludDMyX3QgaW50ZXJydXB0SW5kZXgsIGJvb2wgd2F0Y2hlciwgaW50MzJfdCAqc3RhdHVzKQoreworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSBuZXcgSW50ZXJydXB0KCk7CisJLy8gRXhwZWN0cyB0aGUgY2FsbGluZyBsZWFmIGNsYXNzIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdCBpbmRleC4KKwlhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQgPSB0SW50ZXJydXB0OjpjcmVhdGUoaW50ZXJydXB0SW5kZXgsIHN0YXR1cyk7CisJYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19XYWl0Rm9yQWNrKGZhbHNlLCBzdGF0dXMpOworCWFuSW50ZXJydXB0LT5tYW5hZ2VyID0gbmV3IHRJbnRlcnJ1cHRNYW5hZ2VyKAorCQkoMSA8PCBpbnRlcnJ1cHRJbmRleCkgfCAoMSA8PCAoaW50ZXJydXB0SW5kZXggKyA4KSksIHdhdGNoZXIsIHN0YXR1cyk7CisJcmV0dXJuIGFuSW50ZXJydXB0OworfQorCit2b2lkIGNsZWFuSW50ZXJydXB0cyh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKQoreworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSAoSW50ZXJydXB0KilpbnRlcnJ1cHRfcG9pbnRlcjsKKwlkZWxldGUgYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0OworCWRlbGV0ZSBhbkludGVycnVwdC0+bWFuYWdlcjsKKwlhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQgPSBOVUxMOworCWFuSW50ZXJydXB0LT5tYW5hZ2VyID0gTlVMTDsKK30KKworLyoqCisgKiBJbiBzeW5jaHJvbm91cyBtb2RlLCB3YWl0IGZvciB0aGUgZGVmaW5lZCBpbnRlcnJ1cHQgdG8gb2NjdXIuCisgKiBAcGFyYW0gdGltZW91dCBUaW1lb3V0IGluIHNlY29uZHMKKyAqIEBwYXJhbSBpZ25vcmVQcmV2aW91cyBJZiB0cnVlLCBpZ25vcmUgaW50ZXJydXB0cyB0aGF0IGhhcHBlbmVkIGJlZm9yZQorICogd2FpdEZvckludGVycnVwdCB3YXMgY2FsbGVkLgorICogQHJldHVybiBUaGUgbWFzayBvZiBpbnRlcnJ1cHRzIHRoYXQgZmlyZWQuCisgKi8KK3VpbnQzMl90IHdhaXRGb3JJbnRlcnJ1cHQodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGRvdWJsZSB0aW1lb3V0LCBib29sIGlnbm9yZVByZXZpb3VzLCBpbnQzMl90ICpzdGF0dXMpCit7CisJdWludDMyX3QgcmVzdWx0OworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSAoSW50ZXJydXB0KilpbnRlcnJ1cHRfcG9pbnRlcjsKKworCXJlc3VsdCA9IGFuSW50ZXJydXB0LT5tYW5hZ2VyLT53YXRjaCgoaW50MzJfdCkodGltZW91dCAqIDFlMyksIGlnbm9yZVByZXZpb3VzLCBzdGF0dXMpOworCisJLy8gRG9uJ3QgcmVwb3J0IGEgdGltZW91dCBhcyBhbiBlcnJvciAtIHRoZSByZXR1cm4gY29kZSBpcyBlbm91Z2ggdG8gdGVsbAorCS8vIHRoYXQgYSB0aW1lb3V0IGhhcHBlbmVkLgorCWlmKCpzdGF0dXMgPT0gLU5pRnBnYV9TdGF0dXNfSXJxVGltZW91dCkgeworCQkqc3RhdHVzID0gTmlGcGdhX1N0YXR1c19TdWNjZXNzOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRW5hYmxlIGludGVycnVwdHMgdG8gb2NjdXIgb24gdGhpcyBpbnB1dC4KKyAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIHdoZW4gdGhlIFJlcXVlc3RJbnRlcnJ1cHQgY2FsbCBpcyBtYWRlLiBUaGlzIGdpdmVzIHRpbWUgdG8gZG8gdGhlCisgKiBzZXR1cCBvZiB0aGUgb3RoZXIgb3B0aW9ucyBiZWZvcmUgc3RhcnRpbmcgdG8gZmllbGQgaW50ZXJydXB0cy4KKyAqLwordm9pZCBlbmFibGVJbnRlcnJ1cHRzKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpCit7CisJSW50ZXJydXB0KiBhbkludGVycnVwdCA9IChJbnRlcnJ1cHQqKWludGVycnVwdF9wb2ludGVyOworCWFuSW50ZXJydXB0LT5tYW5hZ2VyLT5lbmFibGUoc3RhdHVzKTsKK30KKworLyoqCisgKiBEaXNhYmxlIEludGVycnVwdHMgd2l0aG91dCB3aXRob3V0IGRlYWxsb2NhdGluZyBzdHJ1Y3R1cmVzLgorICovCit2b2lkIGRpc2FibGVJbnRlcnJ1cHRzKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpCit7CisJSW50ZXJydXB0KiBhbkludGVycnVwdCA9IChJbnRlcnJ1cHQqKWludGVycnVwdF9wb2ludGVyOworCWFuSW50ZXJydXB0LT5tYW5hZ2VyLT5kaXNhYmxlKHN0YXR1cyk7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSByaXNpbmcgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQgbW9zdCByZWNlbnRseS4KKyAqIFRoaXMgaXMgaW4gdGhlIHNhbWUgdGltZSBkb21haW4gYXMgR2V0Q2xvY2soKS4KKyAqIEByZXR1cm4gVGltZXN0YW1wIGluIHNlY29uZHMgc2luY2UgYm9vdC4KKyAqLworZG91YmxlIHJlYWRSaXNpbmdUaW1lc3RhbXAodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cykKK3sKKwlJbnRlcnJ1cHQqIGFuSW50ZXJydXB0ID0gKEludGVycnVwdCopaW50ZXJydXB0X3BvaW50ZXI7CisJdWludDMyX3QgdGltZXN0YW1wID0gYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT5yZWFkUmlzaW5nVGltZVN0YW1wKHN0YXR1cyk7CisJcmV0dXJuIHRpbWVzdGFtcCAqIDFlLTY7Cit9CisKKy8qKgorKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGZhbGxpbmcgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQgbW9zdCByZWNlbnRseS4KKyogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgorKiBAcmV0dXJuIFRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIGJvb3QuCisqLworZG91YmxlIHJlYWRGYWxsaW5nVGltZXN0YW1wKHZvaWQqIGludGVycnVwdF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpCit7CisJSW50ZXJydXB0KiBhbkludGVycnVwdCA9IChJbnRlcnJ1cHQqKWludGVycnVwdF9wb2ludGVyOworCXVpbnQzMl90IHRpbWVzdGFtcCA9IGFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+cmVhZEZhbGxpbmdUaW1lU3RhbXAoc3RhdHVzKTsKKwlyZXR1cm4gdGltZXN0YW1wICogMWUtNjsKK30KKwordm9pZCByZXF1ZXN0SW50ZXJydXB0cyh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgdWludDhfdCByb3V0aW5nX21vZHVsZSwgdWludDMyX3Qgcm91dGluZ19waW4sCisJCWJvb2wgcm91dGluZ19hbmFsb2dfdHJpZ2dlciwgaW50MzJfdCAqc3RhdHVzKQoreworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSAoSW50ZXJydXB0KilpbnRlcnJ1cHRfcG9pbnRlcjsKKwlhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQtPndyaXRlQ29uZmlnX1dhaXRGb3JBY2soZmFsc2UsIHN0YXR1cyk7CisJYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19Tb3VyY2VfQW5hbG9nVHJpZ2dlcihyb3V0aW5nX2FuYWxvZ190cmlnZ2VyLCBzdGF0dXMpOworCWFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+d3JpdGVDb25maWdfU291cmNlX0NoYW5uZWwocm91dGluZ19waW4sIHN0YXR1cyk7CisJYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19Tb3VyY2VfTW9kdWxlKHJvdXRpbmdfbW9kdWxlLCBzdGF0dXMpOworfQorCit2b2lkIGF0dGFjaEludGVycnVwdEhhbmRsZXIodm9pZCogaW50ZXJydXB0X3BvaW50ZXIsIEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLCB2b2lkKiBwYXJhbSwKKwkJaW50MzJfdCAqc3RhdHVzKQoreworCUludGVycnVwdCogYW5JbnRlcnJ1cHQgPSAoSW50ZXJydXB0KilpbnRlcnJ1cHRfcG9pbnRlcjsKKwlhbkludGVycnVwdC0+bWFuYWdlci0+cmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXIsIHBhcmFtLCBzdGF0dXMpOworfQorCit2b2lkIHNldEludGVycnVwdFVwU291cmNlRWRnZSh2b2lkKiBpbnRlcnJ1cHRfcG9pbnRlciwgYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlLAorCQlpbnQzMl90ICpzdGF0dXMpCit7CisJSW50ZXJydXB0KiBhbkludGVycnVwdCA9IChJbnRlcnJ1cHQqKWludGVycnVwdF9wb2ludGVyOworCWFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+d3JpdGVDb25maWdfUmlzaW5nRWRnZShyaXNpbmdFZGdlLCBzdGF0dXMpOworCWFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+d3JpdGVDb25maWdfRmFsbGluZ0VkZ2UoZmFsbGluZ0VkZ2UsIHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmMzY2YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0FJQ2FsaWJyYXRpb24uaApAQCAtMCwwICsxLDE5IEBACisNCisjaWZuZGVmIF9fQUlDYWxpYnJhdGlvbl9oX18NCisjZGVmaW5lIF9fQUlDYWxpYnJhdGlvbl9oX18NCisNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIg0KK3sNCisjZW5kaWYNCisNCisJdWludDMyX3QgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25BSUNhbGlicmF0aW9uX2dldExTQldlaWdodChjb25zdCB1aW50MzJfdCBhaVN5c3RlbUluZGV4LCBjb25zdCB1aW50MzJfdCBjaGFubmVsLCBpbnQzMl90ICpzdGF0dXMpOw0KKwlpbnQzMl90IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRPZmZzZXQoY29uc3QgdWludDMyX3QgYWlTeXN0ZW1JbmRleCwgY29uc3QgdWludDMyX3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8vIF9fQUlDYWxpYnJhdGlvbl9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTkludGVyZmFjZVBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDk5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaApAQCAtMCwwICsxLDgyIEBACisvLyBDQU5JbnRlcmZhY2VQbHVnaW4uaA0KKy8vDQorLy8gIERlZmluZXMgdGhlIEFQSSBmb3IgYnVpbGRpbmcgYSBDQU4gSW50ZXJmYWNlIFBsdWdpbiB0byBzdXBwb3J0DQorLy8gICAgUFdNLWNhYmxlLWZyZWUgQ0FOIG1vdG9yIGNvbnRyb2wgb24gRlJDIHJvYm90cy4gIFRoaXMgYWxsb3dzIHlvdQ0KKy8vICAgIHRvIGNvbm5lY3QgYW55IENBTiBpbnRlcmZhY2UgdG8gdGhlIHNlY3VyZSBKYWd1YXIgQ0FOIGRyaXZlci4NCisvLw0KKw0KKyNpZm5kZWYgX19DQU5JbnRlcmZhY2VQbHVnaW5faF9fDQorI2RlZmluZSBfX0NBTkludGVyZmFjZVBsdWdpbl9oX18NCisNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQorI2RlZmluZSBDQU5fSVNfRlJBTUVfUkVNT1RFIDB4ODAwMDAwMDANCisjZGVmaW5lIENBTl9JU19GUkFNRV8xMUJJVCAgMHg0MDAwMDAwMA0KKyNkZWZpbmUgQ0FOXzI5QklUX01FU1NBR0VfSURfTUFTSyAweDFGRkZGRkZGDQorI2RlZmluZSBDQU5fMTFCSVRfTUVTU0FHRV9JRF9NQVNLIDB4MDAwMDA3RkYNCisNCitjbGFzcyBDQU5JbnRlcmZhY2VQbHVnaW4NCit7DQorcHVibGljOg0KKwlDQU5JbnRlcmZhY2VQbHVnaW4oKSB7fQ0KKwl2aXJ0dWFsIH5DQU5JbnRlcmZhY2VQbHVnaW4oKSB7fQ0KKw0KKwkvKioNCisJICogVGhpcyBlbnRyeS1wb2ludCBvZiB0aGUgQ0FOSW50ZXJmYWNlUGx1Z2luIGlzIHBhc3NlZCBhIG1lc3NhZ2UgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIHRvIHNlbmQgdG8NCisJICogYSBkZXZpY2Ugb24gdGhlIENBTiBidXMuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSBjb250ZXh0cyBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgcmVlbnRyYW50Lg0KKwkgKiANCisJICogQHBhcmFtIG1lc3NhZ2VJRCBUaGUgMjktYml0IENBTiBtZXNzYWdlIElEIGluIHRoZSBsc2JzLiAgVGhlIG1zYiBjYW4gaW5kaWNhdGUgYSByZW1vdGUgZnJhbWUuDQorCSAqIEBwYXJhbSBkYXRhIEEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGJldHdlZW4gMCBhbmQgOCBieXRlcyB0byBzZW5kIHdpdGggdGhlIG1lc3NhZ2UuICBNYXkgYmUgTlVMTCBpZiBkYXRhU2l6ZSBpcyAwLg0KKwkgKiBAcGFyYW0gZGF0YVNpemUgVGhlIG51bWJlciBvZiBieXRlcyB0byBzZW5kIHdpdGggdGhlIG1lc3NhZ2UuDQorCSAqIEByZXR1cm4gUmV0dXJuIGFueSBlcnJvciBjb2RlLiAgT24gc3VjY2VzcyByZXR1cm4gMC4NCisJICovDQorCXZpcnR1YWwgaW50MzJfdCBzZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUpID0gMDsNCisNCisJLyoqDQorCSAqIFRoaXMgZW50cnktcG9pbnQgb2YgdGhlIENBTkludGVyZmFjZVBsdWdpbiBpcyBwYXNzZWQgYnVmZmVycyB3aGljaCBzaG91bGQgYmUgcG9wdWxhdGVkIHdpdGgNCisJICogYW55IHJlY2VpdmVkIG1lc3NhZ2VzIGZyb20gZGV2aWNlcyBvbiB0aGUgQ0FOIGJ1cy4NCisJICogDQorCSAqIFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBieSBhIHNpbmdsZSB0YXNrIGluIHRoZSBKYWd1YXIgZHJpdmVyLCBzbyBpdCBuZWVkIG5vdCBiZSByZWVudHJhbnQuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJsb2NrIGZvciBzb21lIHBlcmlvZCBvZiB0aW1lIHdhaXRpbmcgZm9yIGEgbWVzc2FnZSBmcm9tIHRoZSBDQU4gYnVzLg0KKwkgKiBJdCBtYXkgdGltZW91dCBwZXJpb2RpY2FsbHkgKHJldHVybmluZyBub24temVybyB0byBpbmRpY2F0ZSBubyBtZXNzYWdlIHdhcyBwb3B1bGF0ZWQpIHRvIGFsbG93IGZvcg0KKwkgKiBzaHV0ZG93biBhbmQgdW5sb2FkaW5nIG9mIHRoZSBwbHVnaW4uDQorCSAqIA0KKwkgKiBAcGFyYW0gbWVzc2FnZUlEIEEgcmVmZXJlbmNlIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGEgcmVjZWl2ZWQgMjktYml0IENBTiBtZXNzYWdlIElEIGluIHRoZSBsc2JzLg0KKwkgKiBAcGFyYW0gZGF0YSBBIHBvaW50ZXIgdG8gYSBidWZmZXIgb2YgOCBieXRlcyB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkYXRhIHJlY2VpdmVkIHdpdGggdGhlIG1lc3NhZ2UuDQorCSAqIEBwYXJhbSBkYXRhU2l6ZSBBIHJlZmVyZW5jZSB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSByZWNlaXZlZCAoMCAtIDggYnl0ZXMpLg0KKwkgKiBAcmV0dXJuIFRoaXMgc2hvdWxkIHJldHVybiAwIGlmIGEgbWVzc2FnZSB3YXMgcG9wdWxhdGVkLCBub24tMCBpZiBubyBtZXNzYWdlIHdhcyBub3QgcG9wdWxhdGVkLg0KKwkgKi8NCisJdmlydHVhbCBpbnQzMl90IHJlY2VpdmVNZXNzYWdlKHVpbnQzMl90ICZtZXNzYWdlSUQsIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgJmRhdGFTaXplKSA9IDA7DQorDQorI2lmIGRlZmluZWQoX19saW51eCkNCisJLyoqDQorCSAqIFRoaXMgZW50cnktcG9pbnQgb2YgdGhlIENBTkludGVyZmFjZVBsdWdpbiByZXR1cm5zIHN0YXR1cyBvZiB0aGUgQ0FOIGJ1cy4NCisJICogDQorCSAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIGNvbnRleHRzIGFuZCBtdXN0IHRoZXJlZm9yZSBiZSByZWVudHJhbnQuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGRldGFpbGVkIGhhcmR3YXJlIHN0YXR1cyBpZiBhdmFpbGFibGUgZm9yIGRpYWdub3N0aWNzIG9mIHRoZSBDQU4gaW50ZXJmYWNlLg0KKwkgKiANCisJICogQHBhcmFtIGJ1c09mZkNvdW50IFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBzZW5kTWVzc2FnZSBmYWlsZWQgd2l0aCBhIGJ1c09mZiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgbWVzc2FnZXMNCisJICogIGFyZSBub3Qgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkIG9uIHRoZSBidXMuDQorCSAqIEBwYXJhbSB0eEZ1bGxDb3VudCBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgc2VuZE1lc3NhZ2UgZmFpbGVkIHdpdGggYSB0eEZpZm9GdWxsIGVycm9yIGluZGljYXRpbmcgdGhhdCBtZXNzYWdlcw0KKwkgKiAgYXJlIG5vdCBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYnkgYW55IENBTiBkZXZpY2UuDQorCSAqIEBwYXJhbSByZWNlaXZlRXJyb3JDb3VudCBUaGUgY291bnQgb2YgcmVjZWl2ZSBlcnJvcnMgYXMgcmVwb3J0ZWQgYnkgdGhlIENBTiBkcml2ZXIuDQorCSAqIEBwYXJhbSB0cmFuc21pdEVycm9yQ291bnQgVGhlIGNvdW50IG9mIHRyYW5zbWl0IGVycm9ycyBhcyByZXBvcnRlZCBieSB0aGUgQ0FOIGRyaXZlci4NCisJICogQHJldHVybiBUaGlzIHNob3VsZCByZXR1cm4gMCBpZiBhbGwgc3RhdHVzIHdhcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yIGNvZGUgaWYgbm90Lg0KKwkgKi8NCisJdmlydHVhbCBpbnQzMl90IGdldFN0YXR1cyh1aW50MzJfdCAmYnVzT2ZmQ291bnQsIHVpbnQzMl90ICZ0eEZ1bGxDb3VudCwgdWludDMyX3QgJnJlY2VpdmVFcnJvckNvdW50LCB1aW50MzJfdCAmdHJhbnNtaXRFcnJvckNvdW50KSB7cmV0dXJuIDA7fQ0KKyNlbmRpZg0KK307DQorDQorLyoqDQorICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHJlZ2lzdGVyIGEgQ0FOSW50ZXJmYWNlUGx1Z2luIHRvIHByb3ZpZGUgYWNjZXNzIGEgQ0FOIGJ1cy4NCisgKiANCisgKiBAcGFyYW0gaW50ZXJmYWNlIEEgcG9pbnRlciB0byBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIENBTkludGVyZmFjZVBsdWdpbiBhbmQgaW1wbGVtZW50cw0KKyAqIHRoZSBwdXJlIHZpcnR1YWwgaW50ZXJmYWNlLiAgSWYgTlVMTCwgdW5yZWdpc3RlciB0aGUgY3VycmVudCBwbHVnaW4uDQorICovDQordm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWdpc3RlckludGVyZmFjZShDQU5JbnRlcmZhY2VQbHVnaW4qIGludGVyZmFjZSk7DQorDQorI2VuZGlmIC8vIF9fQ0FOSW50ZXJmYWNlUGx1Z2luX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhhNmYxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENBTlNlc3Npb25NdXguaA0KKy8vDQorLy8gIERlZmluZXMgdGhlIEFQSSBmb3IgYnVpbGRpbmcgYSBDQU4gSW50ZXJmYWNlIFBsdWdpbiB0byBzdXBwb3J0DQorLy8gICAgUFdNLWNhYmxlLWZyZWUgQ0FOIG1vdG9yIGNvbnRyb2wgb24gRlJDIHJvYm90cy4gIFRoaXMgYWxsb3dzIHlvdQ0KKy8vICAgIHRvIGNvbm5lY3QgYW55IENBTiBpbnRlcmZhY2UgdG8gdGhlIHNlY3VyZSBKYWd1YXIgQ0FOIGRyaXZlci4NCisvLw0KKw0KKyNpZm5kZWYgX19DQU5TZXNzaW9uTXV4X2hfXw0KKyNkZWZpbmUgX19DQU5TZXNzaW9uTXV4X2hfXw0KKw0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykNCisjaW5jbHVkZSA8dnhXb3Jrcy5oPg0KKyNlbHNlDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgQ0FOX1NFTkRfUEVSSU9EX05PX1JFUEVBVCAwDQorI2RlZmluZSBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcgLTENCisNCisvKiBGbGFncyBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgbWVzc2FnZUlEICovDQorI2RlZmluZSBDQU5fSVNfRlJBTUVfUkVNT1RFIDB4ODAwMDAwMDANCisjZGVmaW5lIENBTl9JU19GUkFNRV8xMUJJVCAgMHg0MDAwMDAwMA0KKw0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfSW52YWxpZEJ1ZmZlciAgIC00NDA4Ng0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTWVzc2FnZU5vdEZvdW5kIC00NDA4Nw0KKyNkZWZpbmUgV0FSTl9DQU5TZXNzaW9uTXV4X05vVG9rZW4gICAgICAgICA0NDA4Nw0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZCAgICAgIC00NDA4OA0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTm90SW5pdGlhbGl6ZWQgIC00NDA4OQ0KKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfU2Vzc2lvbk92ZXJydW4gICA0NDA1MA0KKw0KK3N0cnVjdCB0Q0FOU3RyZWFtTWVzc2FnZXsNCisJdWludDMyX3QgbWVzc2FnZUlEOw0KKwl1aW50MzJfdCB0aW1lU3RhbXA7DQorCXVpbnQ4X3QgZGF0YVs4XTsNCisJdWludDhfdCBkYXRhU2l6ZTsNCit9Ow0KKw0KK25hbWVzcGFjZSBuQ0FOU2Vzc2lvbk11eA0KK3sNCisJdm9pZCBzZW5kTWVzc2FnZV93cmFwcGVyKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwgdWludDhfdCBkYXRhU2l6ZSwgaW50MzJfdCBwZXJpb2RNcywgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCByZWNlaXZlTWVzc2FnZV93cmFwcGVyKHVpbnQzMl90ICptZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgKmRhdGFTaXplLCB1aW50MzJfdCAqdGltZVN0YW1wLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIG9wZW5TdHJlYW1TZXNzaW9uKHVpbnQzMl90ICpzZXNzaW9uSGFuZGxlLCB1aW50MzJfdCBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQzMl90IG1heE1lc3NhZ2VzLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIGNsb3NlU3RyZWFtU2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uSGFuZGxlKTsNCisJdm9pZCByZWFkU3RyZWFtU2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uSGFuZGxlLCBzdHJ1Y3QgdENBTlN0cmVhbU1lc3NhZ2UgKm1lc3NhZ2VzLCB1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCwgdWludDMyX3QgKm1lc3NhZ2VzUmVhZCwgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCBnZXRDQU5TdGF0dXMoZmxvYXQgKnBlcmNlbnRCdXNVdGlsaXphdGlvbiwgdWludDMyX3QgKmJ1c09mZkNvdW50LCB1aW50MzJfdCAqdHhGdWxsQ291bnQsIHVpbnQzMl90ICpyZWNlaXZlRXJyb3JDb3VudCwgdWludDMyX3QgKnRyYW5zbWl0RXJyb3JDb3VudCwgaW50MzJfdCAqc3RhdHVzKTsNCit9DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIg0KK3sNCisjZW5kaWYNCisNCisJdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kTXMsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVjZWl2ZU1lc3NhZ2UodWludDMyX3QgKm1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDhfdCAqZGF0YSwgdWludDhfdCAqZGF0YVNpemUsIHVpbnQzMl90ICp0aW1lU3RhbXAsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfb3BlblN0cmVhbVNlc3Npb24odWludDMyX3QgKnNlc3Npb25IYW5kbGUsIHVpbnQzMl90IG1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDMyX3QgbWF4TWVzc2FnZXMsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfY2xvc2VTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUpOw0KKwl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3JlYWRTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUsIHN0cnVjdCB0Q0FOU3RyZWFtTWVzc2FnZSAqbWVzc2FnZXMsIHVpbnQzMl90IG1lc3NhZ2VzVG9SZWFkLCB1aW50MzJfdCAqbWVzc2FnZXNSZWFkLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X2dldENBTlN0YXR1cyhmbG9hdCAqcGVyY2VudEJ1c1V0aWxpemF0aW9uLCB1aW50MzJfdCAqYnVzT2ZmQ291bnQsIHVpbnQzMl90ICp0eEZ1bGxDb3VudCwgdWludDMyX3QgKnJlY2VpdmVFcnJvckNvdW50LCB1aW50MzJfdCAqdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90ICpzdGF0dXMpOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYgLy8gX19DQU5TZXNzaW9uTXV4X2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA4MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIAkJCQkJTk9USUNFDQorICogDQorICogCVRoZXNlIGFyZSB0aGUgb25seSBleHRlcm5hbGx5IGV4cG9zZWQgZnVuY3Rpb25zIHRvIHRoZQ0KKyAqICAgTmV0d29ya0NvbW11bmljYXRpb24gbGlicmFyeQ0KKyAqIA0KKyAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgRlJDIFNwZWMgZm9yIENvbW0gUHJvdG9jb2wNCisgKiBSZXZpc2lvbiA0LjUsIEp1bmUgMzAsIDIwMDgNCisgKg0KKyAqIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorICogDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBfX0ZSQ19DT01NX0hfXw0KKyNkZWZpbmUgX19GUkNfQ09NTV9IX18NCisNCisjaWZkZWYgU0lNVUxBVElPTg0KKyNpbmNsdWRlIDx2eFdvcmtzX2NvbXBhdC5oPg0KKyNpZmRlZiBVU0VfVEhSSUZUDQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbHNlDQorI2RlZmluZSBFWFBPUlRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19jZGVjbA0KKyNlbmRpZg0KKyNlbHNlDQorI2lmIGRlZmluZWQoX192eHdvcmtzKQ0KKyNpbmNsdWRlIDx2eFdvcmtzLmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbHNlDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKyNpbmNsdWRlIDxwdGhyZWFkLmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgRVJSX0ZSQ1N5c3RlbV9OZXRDb21tTm90UmVzcG9uZGluZyAtNDQwNDkNCisjZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTm9EU0Nvbm5lY3Rpb24gLTQ0MDE4DQorDQorZW51bSBBbGxpYW5jZVN0YXRpb25JRF90IHsNCisJa0FsbGlhbmNlU3RhdGlvbklEX3JlZDEsDQorCWtBbGxpYW5jZVN0YXRpb25JRF9yZWQyLA0KKwlrQWxsaWFuY2VTdGF0aW9uSURfcmVkMywNCisJa0FsbGlhbmNlU3RhdGlvbklEX2JsdWUxLA0KKwlrQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTIsDQorCWtBbGxpYW5jZVN0YXRpb25JRF9ibHVlMywNCit9Ow0KKw0KK2VudW0gTWF0Y2hUeXBlX3Qgew0KKwlrTWF0Y2hUeXBlX25vbmUsDQorCWtNYXRjaFR5cGVfcHJhY3RpY2UsDQorCWtNYXRjaFR5cGVfcXVhbGlmaWNhdGlvbiwNCisJa01hdGNoVHlwZV9lbGltaW5hdGlvbiwNCit9Ow0KKw0KK3N0cnVjdCBDb250cm9sV29yZF90IHsNCisjaWZuZGVmIF9fdnh3b3Jrcw0KKwl1aW50MzJfdCBlbmFibGVkIDogMTsNCisJdWludDMyX3QgYXV0b25vbW91cyA6IDE7DQorCXVpbnQzMl90IHRlc3QgOjE7DQorCXVpbnQzMl90IGVTdG9wIDogMTsNCisJdWludDMyX3QgZm1zQXR0YWNoZWQ6MTsNCisJdWludDMyX3QgZHNBdHRhY2hlZDoxOw0KKwl1aW50MzJfdCBjb250cm9sX3Jlc2VydmVkIDogMjY7DQorI2Vsc2UNCisJdWludDMyX3QgY29udHJvbF9yZXNlcnZlZCA6IDI2Ow0KKwl1aW50MzJfdCBkc0F0dGFjaGVkOjE7DQorCXVpbnQzMl90IGZtc0F0dGFjaGVkOjE7DQorCXVpbnQzMl90IGVTdG9wIDogMTsNCisJdWludDMyX3QgdGVzdCA6MTsNCisJdWludDMyX3QgYXV0b25vbW91cyA6IDE7DQorCXVpbnQzMl90IGVuYWJsZWQgOiAxOw0KKyNlbmRpZg0KK307DQorDQorc3RydWN0IEpveXN0aWNrQXhlc190IHsNCisJdWludDE2X3QgY291bnQ7DQorCWludDE2X3QgYXhlc1sxXTsNCit9Ow0KKw0KK3N0cnVjdCBKb3lzdGlja1BPVl90IHsNCisJdWludDE2X3QgY291bnQ7DQorCWludDE2X3QgcG92c1sxXTsNCit9Ow0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX1Jlc2VydmUodm9pZCAqaW5zdGFuY2UpOw0KKyNpZm5kZWYgU0lNVUxBVElPTg0KKwl2b2lkIEVYUE9SVF9GVU5DIGdldEZQR0FIYXJkd2FyZVZlcnNpb24odWludDE2X3QgKmZwZ2FWZXJzaW9uLCB1aW50MzJfdCAqZnBnYVJldmlzaW9uKTsNCisjZW5kaWYNCisJaW50IEVYUE9SVF9GVU5DIHNldFN0YXR1c0RhdGEoZmxvYXQgYmF0dGVyeSwgdWludDhfdCBkc0RpZ2l0YWxPdXQsIHVpbnQ4X3QgdXBkYXRlTnVtYmVyLA0KKwkJCWNvbnN0IGNoYXIgKnVzZXJEYXRhSGlnaCwgaW50IHVzZXJEYXRhSGlnaExlbmd0aCwNCisJCQljb25zdCBjaGFyICp1c2VyRGF0YUxvdywgaW50IHVzZXJEYXRhTG93TGVuZ3RoLCBpbnQgd2FpdF9tcyk7DQorCWludCBFWFBPUlRfRlVOQyBzZXRFcnJvckRhdGEoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgZXJyb3JzTGVuZ3RoLCBpbnQgd2FpdF9tcyk7DQorCQ0KKyNpZmRlZiBTSU1VTEFUSU9ODQorCXZvaWQgRVhQT1JUX0ZVTkMgc2V0TmV3RGF0YVNlbShIQU5ETEUpOw0KKyNlbHNlDQorIyBpZiBkZWZpbmVkIChfX3Z4d29ya3MpDQorCXZvaWQgRVhQT1JUX0ZVTkMgc2V0TmV3RGF0YVNlbShTRU1fSUQpOw0KKyMgZWxzZQ0KKwl2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0ocHRocmVhZF9jb25kX3QgKik7DQorIyBlbmRpZg0KKyNlbmRpZg0KKw0KKwkvLyB0aGlzIHVpbnQzMl90IGlzIHJlYWxseSBhIExWUmVmTnVtDQorCWludCBFWFBPUlRfRlVOQyBzZXROZXdEYXRhT2NjdXJSZWYodWludDMyX3QgcmVmbnVtKTsNCisNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRDb250cm9sV29yZChzdHJ1Y3QgQ29udHJvbFdvcmRfdCAqY29udHJvbFdvcmQpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEFsbGlhbmNlU3RhdGlvbihlbnVtIEFsbGlhbmNlU3RhdGlvbklEX3QgKmFsbGlhbmNlU3RhdGlvbik7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0TWF0Y2hUaW1lKGZsb2F0ICptYXRjaFRpbWUpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrQXhlcyh1aW50OF90IGpveXN0aWNrTnVtLCBzdHJ1Y3QgSm95c3RpY2tBeGVzX3QgKmF4ZXMsIHVpbnQ4X3QgbWF4QXhlcyk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tCdXR0b25zKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQzMl90ICpidXR0b25zLCB1aW50OF90ICpjb3VudCk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tQT1ZzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHN0cnVjdCBKb3lzdGlja1BPVl90ICpwb3ZzLCB1aW50OF90IG1heFBPVnMpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX3NldEpveXN0aWNrT3V0cHV0cyh1aW50OF90IGpveXN0aWNrTnVtLCB1aW50MzJfdCBoaWRPdXRwdXRzLCB1aW50MTZfdCBsZWZ0UnVtYmxlLCB1aW50MTZfdCByaWdodFJ1bWJsZSk7DQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tEZXNjKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQ4X3QgKmlzWEJveCwgdWludDhfdCAqdHlwZSwgY2hhciAqbmFtZSwNCisJCXVpbnQ4X3QgKmF4aXNDb3VudCwgdWludDhfdCAqYXhpc1R5cGVzLCB1aW50OF90ICpidXR0b25Db3VudCwgdWludDhfdCAqcG92Q291bnQpOw0KKw0KKwl2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRWZXJzaW9uU3RyaW5nKGNoYXIgKnZlcnNpb24pOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKHZvaWQpOw0KKwl2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1EaXNhYmxlZCh2b2lkKTsNCisJdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cyh2b2lkKTsNCisJdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtVGVsZW9wKHZvaWQpOw0KKwl2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1UZXN0KHZvaWQpOw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlODhhMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05ldHdvcmtDb21tdW5pY2F0aW9uL0xvYWRPdXQuaApAQCAtMCwwICsxLDU4IEBACisNCisjaWZuZGVmIF9fTG9hZE91dF9oX18NCisjZGVmaW5lIF9fTG9hZE91dF9oX18NCisNCisjaWZkZWYgU0lNVUxBVElPTg0KKyNpbmNsdWRlIDx2eFdvcmtzX2NvbXBhdC5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fY2RlY2wNCisjZWxpZiBkZWZpbmVkIChfX3Z4d29ya3MpDQorI2luY2x1ZGUgPHZ4V29ya3MuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2Vsc2UNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbmRpZg0KKw0KKyNkZWZpbmUga01heE1vZHVsZU51bWJlciAyDQorbmFtZXNwYWNlIG5Mb2FkT3V0DQorew0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChTSU1VTEFUSU9OKQ0KKyAgICB0eXBlZGVmIGVudW0gew0KKyAgICAgICAga01vZHVsZVR5cGVfVW5rbm93biA9IDB4MDAsDQorICAgICAgICBrTW9kdWxlVHlwZV9BbmFsb2cgPSAweDAxLA0KKyAgICAgICAga01vZHVsZVR5cGVfRGlnaXRhbCA9IDB4MDIsDQorICAgICAgICBrTW9kdWxlVHlwZV9Tb2xlbm9pZCA9IDB4MDMsDQorICAgIH0gdE1vZHVsZVR5cGU7DQorICAgIGJvb2wgRVhQT1JUX0ZVTkMgZ2V0TW9kdWxlUHJlc2VuY2UodE1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgdWludDhfdCBtb2R1bGVOdW1iZXIpOw0KKyNlbmRpZg0KKyAgICB0eXBlZGVmIGVudW0gew0KKyAgICAgICAga1RhcmdldENsYXNzX1Vua25vd24gPSAweDAwLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzEgPSAweDEwLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzIgPSAweDIwLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzMgPSAweDMwLA0KKyAgICAgICAga1RhcmdldENsYXNzX1JvYm9SSU8gPSAweDQwLA0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChTSU1VTEFUSU9OKQ0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzJfQW5hbG9nID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9BbmFsb2csDQorICAgICAgICBrVGFyZ2V0Q2xhc3NfRlJDMl9EaWdpdGFsID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9EaWdpdGFsLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzJfU29sZW5vaWQgPSBrVGFyZ2V0Q2xhc3NfRlJDMiB8IGtNb2R1bGVUeXBlX1NvbGVub2lkLA0KKyNlbmRpZg0KKyAgICAgICAga1RhcmdldENsYXNzX0ZhbWlseU1hc2sgPSAweEYwLA0KKyAgICAgICAga1RhcmdldENsYXNzX01vZHVsZU1hc2sgPSAweDBGLA0KKyAgICB9IHRUYXJnZXRDbGFzczsNCisgICAgdFRhcmdldENsYXNzIEVYUE9SVF9GVU5DIGdldFRhcmdldENsYXNzKCk7DQorfQ0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChTSU1VTEFUSU9OKQ0KKyAgICB1aW50MzJfdCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkxvYWRPdXRfZ2V0TW9kdWxlUHJlc2VuY2UodWludDMyX3QgbW9kdWxlVHlwZSwgdWludDhfdCBtb2R1bGVOdW1iZXIpOw0KKyNlbmRpZg0KKyAgICB1aW50MzJfdCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkxvYWRPdXRfZ2V0VGFyZ2V0Q2xhc3MoKTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8vIF9fTG9hZE91dF9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWMyYTNhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaApAQCAtMCwwICsxLDE0MyBAQAorDQorI2lmbmRlZiBfX1VzYWdlUmVwb3J0aW5nX2hfXw0KKyNkZWZpbmUgX19Vc2FnZVJlcG9ydGluZ19oX18NCisNCisjaWZkZWYgU0lNVUxBVElPTg0KKyNpbmNsdWRlIDx2eFdvcmtzX2NvbXBhdC5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fY2RlY2wNCisjZWxpZiBkZWZpbmVkIChfX3Z4d29ya3MpDQorI2luY2x1ZGUgPHZ4V29ya3MuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2Vsc2UNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMNCisjZW5kaWYNCisNCisjZGVmaW5lIGtVc2FnZVJlcG9ydGluZ192ZXJzaW9uIDENCisNCituYW1lc3BhY2UgblVzYWdlUmVwb3J0aW5nDQorew0KKyAgICB0eXBlZGVmIGVudW0NCisgICAgew0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Db250cm9sbGVyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Nb2R1bGUsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0xhbmd1YWdlLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9DQU5QbHVnaW4sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FjY2VsZXJvbWV0ZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FEWEwzNDUsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FuYWxvZ0NoYW5uZWwsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXJPdXRwdXQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NBTkphZ3VhciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQ29tcHJlc3NvciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQ291bnRlciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRGFzaGJvYXJkLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9EaWdpdGFsSW5wdXQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RpZ2l0YWxPdXRwdXQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25DSU8sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25FSU8sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25MQ0QsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0VuY29kZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0dlYXJUb290aCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfR3lybywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSTJDLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9GcmFtZXdvcmssDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0phZ3VhciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSm95c3RpY2ssDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0tpbmVjdCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfS2luZWN0U3RpY2ssDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1BJRENvbnRyb2xsZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1ByZWZlcmVuY2VzLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9QV00sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1JlbGF5LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9TZXJpYWxQb3J0LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9TZXJ2bywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfU29sZW5vaWQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1NQSSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVGFzaywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVWx0cmFzb25pYywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVmljdG9yLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9CdXR0b24sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NvbW1hbmQsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0F4aXNDYW1lcmEsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1BDVmlkZW9TZXJ2ZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1NtYXJ0RGFzaGJvYXJkLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9UYWxvbiwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSGlUZWNobmljQ29sb3JTZW5zb3IsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0hpVGVjaG5pY0FjY2VsLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9IaVRlY2huaWNDb21wYXNzLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9TUkYwOCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQW5hbG9nT3V0cHV0LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9WaWN0b3JTUCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVGFsb25TUlgsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NBTlRhbG9uU1JYLA0KKyAgICB9IHRSZXNvdXJjZVR5cGU7DQorDQorICAgIHR5cGVkZWYgZW51bQ0KKyAgICB7DQorICAgICAgICBrTGFuZ3VhZ2VfTGFiVklFVyA9IDEsDQorICAgICAgICBrTGFuZ3VhZ2VfQ1BsdXNQbHVzID0gMiwNCisgICAgICAgIGtMYW5ndWFnZV9KYXZhID0gMywNCisgICAgICAgIGtMYW5ndWFnZV9QeXRob24gPSA0LA0KKw0KKyAgICAgICAga0NBTlBsdWdpbl9CbGFja0phZ0JyaWRnZSA9IDEsDQorICAgICAgICBrQ0FOUGx1Z2luXzJDQU4gPSAyLA0KKw0KKyAgICAgICAga0ZyYW1ld29ya19JdGVyYXRpdmUgPSAxLA0KKyAgICAgICAga0ZyYW1ld29ya19TaW1wbGUgPSAyLA0KKw0KKyAgICAgICAga1JvYm90RHJpdmVfQXJjYWRlU3RhbmRhcmQgPSAxLA0KKyAgICAgICAga1JvYm90RHJpdmVfQXJjYWRlQnV0dG9uU3BpbiA9IDIsDQorICAgICAgICBrUm9ib3REcml2ZV9BcmNhZGVSYXRpb0N1cnZlID0gMywNCisgICAgICAgIGtSb2JvdERyaXZlX1RhbmsgPSA0LA0KKyAgICAgICAga1JvYm90RHJpdmVfTWVjYW51bVBvbGFyID0gNSwNCisgICAgICAgIGtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4gPSA2LA0KKw0KKyAgICAgICAga0RyaXZlclN0YXRpb25DSU9fQW5hbG9nID0gMSwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxJbiA9IDIsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkNJT19EaWdpdGFsT3V0ID0gMywNCisNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0FjY2VsZXJhdGlvbiA9IDEsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19BbmFsb2dJbiA9IDIsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19BbmFsb2dPdXQgPSAzLA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fQnV0dG9uID0gNCwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0xFRCA9IDUsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19EaWdpdGFsSW4gPSA2LA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbE91dCA9IDcsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19GaXhlZERpZ2l0YWxPdXQgPSA4LA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fUFdNID0gOSwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0VuY29kZXIgPSAxMCwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX1RvdWNoU2xpZGVyID0gMTEsDQorDQorICAgICAgICBrQURYTDM0NV9TUEkgPSAxLA0KKyAgICAgICAga0FEWEwzNDVfSTJDID0gMiwNCisNCisgICAgICAgIGtDb21tYW5kX1NjaGVkdWxlciA9IDEsDQorDQorICAgICAgICBrU21hcnREYXNoYm9hcmRfSW5zdGFuY2UgPSAxLA0KKyAgICB9IHRJbnN0YW5jZXM7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXBvcnQgdGhlIHVzYWdlIG9mIGEgcmVzb3VyY2Ugb2YgaW50ZXJlc3QuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2Ugb25lIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIHRSZXNvdXJjZVR5cGUgYWJvdmUgKG1heCB2YWx1ZSA1MSkuDQorICAgICAqIEBwYXJhbSBpbnN0YW5jZU51bWJlciBhbiBpbmRleCB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlIGluc3RhbmNlLg0KKyAgICAgKiBAcGFyYW0gY29udGV4dCBhbiBvcHRpb25hbCBhZGRpdGlvbmFsIGNvbnRleHQgbnVtYmVyIGZvciBzb21lIGNhc2VzIChzdWNoIGFzIG1vZHVsZSBudW1iZXIpLiAgU2V0IHRvIDAgdG8gb21pdC4NCisgICAgICogQHBhcmFtIGZlYXR1cmUgYSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgZGVzY3JpYmluZyBmZWF0dXJlcyBpbiB1c2Ugb24gYSBzcGVjaWZpYyByZXNvdXJjZS4gIFNldHRpbmcgdGhlIHNhbWUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGZlYXR1cmUgc3RyaW5nLg0KKyAgICAgKi8NCisgICAgdWludDMyX3QgRVhQT1JUX0ZVTkMgcmVwb3J0KHRSZXNvdXJjZVR5cGUgcmVzb3VyY2UsIHVpbnQ4X3QgaW5zdGFuY2VOdW1iZXIsIHVpbnQ4X3QgY29udGV4dCA9IDAsIGNvbnN0IGNoYXIgKmZlYXR1cmUgPSBOVUxMKTsNCit9DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorICAgIHVpbnQzMl90IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uVXNhZ2VSZXBvcnRpbmdfcmVwb3J0KHVpbnQ4X3QgcmVzb3VyY2UsIHVpbnQ4X3QgaW5zdGFuY2VOdW1iZXIsIHVpbnQ4X3QgY29udGV4dCwgY29uc3QgY2hhciAqZmVhdHVyZSk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvLyBfX1VzYWdlUmVwb3J0aW5nX2hfXw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05vdGlmaWVyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL05vdGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTMyNTEyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvTm90aWZpZXIuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKyNpbmNsdWRlICJIQUwvTm90aWZpZXIuaHBwIgorI2luY2x1ZGUgIkNoaXBPYmplY3QuaCIKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUaW1lckludGVycnVwdE51bWJlciA9IDI4OworCitzdHJ1Y3QgTm90aWZpZXIKK3sKKwl0QWxhcm0gKmFsYXJtOworCXRJbnRlcnJ1cHRNYW5hZ2VyICptYW5hZ2VyOworfTsKKwordm9pZCogaW5pdGlhbGl6ZU5vdGlmaWVyKHZvaWQgKCpQcm9jZXNzUXVldWUpKHVpbnQzMl90LCB2b2lkKiksIGludDMyX3QgKnN0YXR1cykKK3sKKwlOb3RpZmllciogbm90aWZpZXIgPSBuZXcgTm90aWZpZXIoKTsKKwlub3RpZmllci0+bWFuYWdlciA9IG5ldyB0SW50ZXJydXB0TWFuYWdlcigxIDw8IGtUaW1lckludGVycnVwdE51bWJlciwgZmFsc2UsIHN0YXR1cyk7CisJbm90aWZpZXItPm1hbmFnZXItPnJlZ2lzdGVySGFuZGxlcihQcm9jZXNzUXVldWUsIE5VTEwsIHN0YXR1cyk7CisJbm90aWZpZXItPm1hbmFnZXItPmVuYWJsZShzdGF0dXMpOworCW5vdGlmaWVyLT5hbGFybSA9IHRBbGFybTo6Y3JlYXRlKHN0YXR1cyk7CisJcmV0dXJuIG5vdGlmaWVyOworfQorCit2b2lkIGNsZWFuTm90aWZpZXIodm9pZCogbm90aWZpZXJfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKQoreworCU5vdGlmaWVyKiBub3RpZmllciA9IChOb3RpZmllciopbm90aWZpZXJfcG9pbnRlcjsKKwlub3RpZmllci0+YWxhcm0tPndyaXRlRW5hYmxlKGZhbHNlLCBzdGF0dXMpOworCWRlbGV0ZSBub3RpZmllci0+YWxhcm07CisJbm90aWZpZXItPmFsYXJtID0gTlVMTDsKKwlub3RpZmllci0+bWFuYWdlci0+ZGlzYWJsZShzdGF0dXMpOworCWRlbGV0ZSBub3RpZmllci0+bWFuYWdlcjsKKwlub3RpZmllci0+bWFuYWdlciA9IE5VTEw7Cit9CisKK3ZvaWQgdXBkYXRlTm90aWZpZXJBbGFybSh2b2lkKiBub3RpZmllcl9wb2ludGVyLCB1aW50MzJfdCB0cmlnZ2VyVGltZSwgaW50MzJfdCAqc3RhdHVzKQoreworCU5vdGlmaWVyKiBub3RpZmllciA9IChOb3RpZmllciopbm90aWZpZXJfcG9pbnRlcjsKKwkvLyB3cml0ZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgcXVldWUgaW50byB0aGUgdHJpZ2dlciB0aW1lCisJbm90aWZpZXItPmFsYXJtLT53cml0ZVRyaWdnZXJUaW1lKHRyaWdnZXJUaW1lLCBzdGF0dXMpOworCS8vIEVuYWJsZSB0aGUgYWxhcm0uICBUaGUgaGFyZHdhcmUgZGlzYWJsZXMgaXRzZWxmIGFmdGVyIGVhY2ggYWxhcm0uCisJbm90aWZpZXItPmFsYXJtLT53cml0ZUVuYWJsZSh0cnVlLCBzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvUERQLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1BEUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyOWMwNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1BEUC5jcHAKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgIkhBTC9QRFAuaHBwIgorI2luY2x1ZGUgImN0cmUvUERQLmgiCitzdGF0aWMgUERQIHBkcDsKKworZG91YmxlIGdldFBEUFRlbXBlcmF0dXJlKGludDMyX3QgKnN0YXR1cykgeworCWRvdWJsZSB0ZW1wZXJhdHVyZTsKKwkKKwkqc3RhdHVzID0gcGRwLkdldFRlbXBlcmF0dXJlKHRlbXBlcmF0dXJlKTsKKwkKKwlyZXR1cm4gdGVtcGVyYXR1cmU7Cit9CisKK2RvdWJsZSBnZXRQRFBWb2x0YWdlKGludDMyX3QgKnN0YXR1cykgeworCWRvdWJsZSB2b2x0YWdlOworCQorCSpzdGF0dXMgPSBwZHAuR2V0Vm9sdGFnZSh2b2x0YWdlKTsKKwkKKwlyZXR1cm4gdm9sdGFnZTsKK30KKworZG91YmxlIGdldFBEUENoYW5uZWxDdXJyZW50KHVpbnQ4X3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKSB7CisJZG91YmxlIGN1cnJlbnQ7CisJCisJKnN0YXR1cyA9IHBkcC5HZXRDaGFubmVsQ3VycmVudChjaGFubmVsLCBjdXJyZW50KTsKKwkKKwlyZXR1cm4gY3VycmVudDsKK30KKworZG91YmxlIGdldFBEUFRvdGFsQ3VycmVudChpbnQzMl90ICpzdGF0dXMpIHsKKwlkb3VibGUgY3VycmVudDsKKwkKKwkqc3RhdHVzID0gcGRwLkdldFRvdGFsQ3VycmVudChjdXJyZW50KTsKKwkKKwlyZXR1cm4gY3VycmVudDsKK30KKworZG91YmxlIGdldFBEUFRvdGFsUG93ZXIoaW50MzJfdCAqc3RhdHVzKSB7CisJZG91YmxlIHBvd2VyOworCQorCSpzdGF0dXMgPSBwZHAuR2V0VG90YWxQb3dlcihwb3dlcik7CisJCisJcmV0dXJuIHBvd2VyOworfQorCitkb3VibGUgZ2V0UERQVG90YWxFbmVyZ3koaW50MzJfdCAqc3RhdHVzKSB7CisJZG91YmxlIGVuZXJneTsKKwkKKwkqc3RhdHVzID0gcGRwLkdldFRvdGFsRW5lcmd5KGVuZXJneSk7CisJCisJcmV0dXJuIGVuZXJneTsKK30KKwordm9pZCByZXNldFBEUFRvdGFsRW5lcmd5KGludDMyX3QgKnN0YXR1cykgeworCSpzdGF0dXMgPSBwZHAuUmVzZXRFbmVyZ3koKTsKK30KKwordm9pZCBjbGVhclBEUFN0aWNreUZhdWx0cyhpbnQzMl90ICpzdGF0dXMpIHsKKwkqc3RhdHVzID0gcGRwLkNsZWFyU3RpY2t5RmF1bHRzKCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvUG9ydC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvUG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzljMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9Qb3J0LmgKQEAgLTAsMCArMSw3IEBACisjcHJhZ21hIG9uY2UKKwordHlwZWRlZiBzdHJ1Y3QgcG9ydF90Cit7CisJdWludDhfdCBwaW47CisJdWludDhfdCBtb2R1bGU7Cit9IFBvcnQ7CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9Qb3dlci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9Qb3dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkYjA0MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1Bvd2VyLmNwcApAQCAtMCwwICsxLDEyNyBAQAorI2luY2x1ZGUgIkhBTC9Qb3dlci5ocHAiCisjaW5jbHVkZSAiQ2hpcE9iamVjdC5oIgorCitzdGF0aWMgdFBvd2VyICpwb3dlciA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVQb3dlcihpbnQzMl90ICpzdGF0dXMpIHsKKwlpZihwb3dlciA9PSBOVUxMKSB7CisJCXBvd2VyID0gdFBvd2VyOjpjcmVhdGUoc3RhdHVzKTsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSByb2JvUklPIGlucHV0IHZvbHRhZ2UKKyAqLworZmxvYXQgZ2V0VmluVm9sdGFnZShpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRWaW5Wb2x0YWdlKHN0YXR1cykgLyA0LjA5NmYgKiAwLjAyNTczM2YgLSAwLjAyOWY7Cit9CisKKy8qKgorICogR2V0IHRoZSByb2JvUklPIGlucHV0IGN1cnJlbnQKKyAqLworZmxvYXQgZ2V0VmluQ3VycmVudChpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRWaW5DdXJyZW50KHN0YXR1cykgLyA0LjA5NmYgKiAwLjAxNzA0MiAtIDAuMDcxZjsKK30KKworLyoqCisgKiBHZXQgdGhlIDZWIHJhaWwgdm9sdGFnZQorICovCitmbG9hdCBnZXRVc2VyVm9sdGFnZTZWKGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVQb3dlcihzdGF0dXMpOworCXJldHVybiBwb3dlci0+cmVhZFVzZXJWb2x0YWdlNlYoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDA3MDE5ZiAtIDAuMDE0ZjsKK30KKworLyoqCisgKiBHZXQgdGhlIDZWIHJhaWwgY3VycmVudAorICovCitmbG9hdCBnZXRVc2VyQ3VycmVudDZWKGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVQb3dlcihzdGF0dXMpOworCXJldHVybiBwb3dlci0+cmVhZFVzZXJDdXJyZW50NlYoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDA1NTY2ZiAtIDAuMDA5ZjsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgNlYgcmFpbAorICovCitib29sIGdldFVzZXJBY3RpdmU2VihpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRTdGF0dXNfVXNlcjZWKHN0YXR1cykgPT0gNDsKK30KKworLyoqCisgKiBHZXQgdGhlIGZhdWx0IGNvdW50IGZvciB0aGUgNlYgcmFpbAorICovCitpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHM2VihpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gKGludClwb3dlci0+cmVhZE92ZXJDdXJyZW50RmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50NlYoc3RhdHVzKTsKK30KKworLyoqCisgKiBHZXQgdGhlIDVWIHJhaWwgdm9sdGFnZQorICovCitmbG9hdCBnZXRVc2VyVm9sdGFnZTVWKGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVQb3dlcihzdGF0dXMpOworCXJldHVybiBwb3dlci0+cmVhZFVzZXJWb2x0YWdlNVYoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDA1OTYyZiAtIDAuMDEzZjsKK30KKworLyoqCisgKiBHZXQgdGhlIDVWIHJhaWwgY3VycmVudAorICovCitmbG9hdCBnZXRVc2VyQ3VycmVudDVWKGludDMyX3QgKnN0YXR1cykgeworCWluaXRpYWxpemVQb3dlcihzdGF0dXMpOworCXJldHVybiBwb3dlci0+cmVhZFVzZXJDdXJyZW50NVYoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDAxOTk2ZiAtIDAuMDAyZjsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgNVYgcmFpbAorICovCitib29sIGdldFVzZXJBY3RpdmU1VihpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRTdGF0dXNfVXNlcjVWKHN0YXR1cykgPT0gNDsKK30KKworLyoqCisgKiBHZXQgdGhlIGZhdWx0IGNvdW50IGZvciB0aGUgNVYgcmFpbAorICovCitpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHM1VihpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gKGludClwb3dlci0+cmVhZE92ZXJDdXJyZW50RmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50NVYoc3RhdHVzKTsKK30KKwordW5zaWduZWQgY2hhciBnZXRVc2VyU3RhdHVzNVYoaW50MzJfdCAqc3RhdHVzKSB7CisJaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7CisJcmV0dXJuIHBvd2VyLT5yZWFkU3RhdHVzX1VzZXI1VihzdGF0dXMpOworfQorCisvKioKKyAqIEdldCB0aGUgMy4zViByYWlsIHZvbHRhZ2UKKyAqLworZmxvYXQgZ2V0VXNlclZvbHRhZ2UzVjMoaW50MzJfdCAqc3RhdHVzKSB7CisJaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7CisJcmV0dXJuIHBvd2VyLT5yZWFkVXNlclZvbHRhZ2UzVjMoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDA0OTAyZiAtIDAuMDFmOworfQorCisvKioKKyAqIEdldCB0aGUgMy4zViByYWlsIGN1cnJlbnQKKyAqLworZmxvYXQgZ2V0VXNlckN1cnJlbnQzVjMoaW50MzJfdCAqc3RhdHVzKSB7CisJaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7CisJcmV0dXJuIHBvd2VyLT5yZWFkVXNlckN1cnJlbnQzVjMoc3RhdHVzKSAvIDQuMDk2ZiAqIDAuMDAyNDg2ZiAtIDAuMDAzZjsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgMy4zViByYWlsCisgKi8KK2Jvb2wgZ2V0VXNlckFjdGl2ZTNWMyhpbnQzMl90ICpzdGF0dXMpIHsKKwlpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKKwlyZXR1cm4gcG93ZXItPnJlYWRTdGF0dXNfVXNlcjNWMyhzdGF0dXMpID09IDQ7Cit9CisKKy8qKgorICogR2V0IHRoZSBmYXVsdCBjb3VudCBmb3IgdGhlIDMuM1YgcmFpbAorICovCitpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHMzVjMoaW50MzJfdCAqc3RhdHVzKSB7CisJaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7CisJcmV0dXJuIChpbnQpcG93ZXItPnJlYWRPdmVyQ3VycmVudEZhdWx0Q291bnRzX092ZXJDdXJyZW50RmF1bHRDb3VudDNWMyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvU2VtYXBob3JlLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1NlbWFwaG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzMGYzYwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1NlbWFwaG9yZS5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKyNpbmNsdWRlICJIQUwvU2VtYXBob3JlLmhwcCIKKyNpbmNsdWRlICJIQUwvY3BwL1N5bmNocm9uaXplZC5ocHAiCisKKyNpbmNsdWRlICJMb2cuaHBwIgorCisvLyBzZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKK1RMb2dMZXZlbCBzZW1hcGhvcmVMb2dMZXZlbCA9IGxvZ0RFQlVHOworCisjZGVmaW5lIFNFTUFQSE9SRV9MT0cobGV2ZWwpIFwKKyAgICBpZiAobGV2ZWwgPiBzZW1hcGhvcmVMb2dMZXZlbCkgOyBcCisgICAgZWxzZSBMb2coKS5HZXQobGV2ZWwpCisKKy8vIFNlZTogaHR0cDovL3d3dy52eGRldi5jb20vZG9jcy92eDU1bWFuL3Z4d29ya3MvcmVmL3NlbU1MaWIuaHRtbAorY29uc3QgdWludDMyX3QgU0VNQVBIT1JFX1FfRklGTz0gMHgwMTsgLy8gVE9ETzogU3VwcG9ydAorY29uc3QgdWludDMyX3QgU0VNQVBIT1JFX1FfUFJJT1JJVFkgPSAweDAxOyAvLyBUT0RPOiBTdXBwb3J0Citjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfREVMRVRFX1NBRkUgPSAweDA0OyAvLyBUT0RPOiBTdXBwb3J0Citjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfSU5WRVJTSU9OX1NBRkUgPSAweDA4OyAvLyBUT0RPOiBTdXBwb3J0CisKK2NvbnN0IGludDMyX3QgU0VNQVBIT1JFX05PX1dBSVQgPSAwOworY29uc3QgaW50MzJfdCBTRU1BUEhPUkVfV0FJVF9GT1JFVkVSID0gLTE7CisKK2NvbnN0IHVpbnQzMl90IFNFTUFQSE9SRV9FTVBUWSA9IDA7Citjb25zdCB1aW50MzJfdCBTRU1BUEhPUkVfRlVMTCA9IDE7CisKK2NsYXNzIE11dGV4SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBsb2NrKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgdHJ5X2xvY2soKSA9IDA7CisgIHZpcnR1YWwgcHRocmVhZF9tdXRleF90ICpuYXRpdmVfaGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIH5NdXRleEludGVyZmFjZSgpIHt9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0ZXhUeXBlPgorY2xhc3MgVGVtcGxhdGVkTXV0ZXhXcmFwcGVyIDogcHVibGljIE11dGV4SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBsb2NrKCkgeyBtXy5sb2NrKCk7IH0KKyAgdmlydHVhbCB2b2lkIHVubG9jaygpIHsgbV8udW5sb2NrKCk7IH0KKyAgdmlydHVhbCBib29sIHRyeV9sb2NrKCkgeyByZXR1cm4gbV8udHJ5X2xvY2soKTsgfQorICBwdGhyZWFkX211dGV4X3QgKm5hdGl2ZV9oYW5kbGUoKSB7IHJldHVybiBtXy5uYXRpdmVfaGFuZGxlKCk7IH0KKworIHByaXZhdGU6CisgIE11dGV4VHlwZSBtXzsKK307CisKK01VVEVYX0lEIGluaXRpYWxpemVNdXRleFJlY3Vyc2l2ZSgpCit7CisgIHJldHVybiBuZXcgVGVtcGxhdGVkTXV0ZXhXcmFwcGVyPFJlZW50cmFudE11dGV4PigpOworfQorCitNVVRFWF9JRCBpbml0aWFsaXplTXV0ZXhOb3JtYWwoKQoreworICByZXR1cm4gbmV3IFRlbXBsYXRlZE11dGV4V3JhcHBlcjxNdXRleD4oKTsKK30KKwordm9pZCBkZWxldGVNdXRleChNVVRFWF9JRCBtdXRleCkKK3sKKwlkZWxldGUgbXV0ZXg7Cit9CisKKy8qKgorICogTG9jayB0aGUgc2VtYXBob3JlLCBibG9ja2luZyB1bnRpbCBpdCdzIGF2YWlsYWJsZS4KKyAqIEByZXR1cm4gMCBmb3Igc3VjY2VzcywgLTEgZm9yIGVycm9yLiBJZiAtMSwgdGhlIGVycm9yIHdpbGwgYmUgaW4gZXJybm8uCisgKi8KK2ludDhfdCBsb2NrTXV0ZXgoTVVURVhfSUQgbXV0ZXgpCit7CisgICAgbXV0ZXgtPmxvY2soKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBUcmllcyB0byBsb2NrIHRoZSBtdXRleC4KKyAqIEByZXR1cm4gMSBpZiB3ZSBnb3QgdGhlIGxvY2ssIDAgb3RoZXJ3aXNlLgorICovCitpbnQ4X3QgdHJ5TG9ja011dGV4KE1VVEVYX0lEIG11dGV4KQoreworICAgIHJldHVybiBtdXRleC0+dHJ5X2xvY2soKTsKK30KKworLyoqCisgKiBVbmxvY2sgdGhlIHNlbWFwaG9yZS4KKyAqIEByZXR1cm4gMCBmb3Igc3VjY2VzcywgLTEgZm9yIGVycm9yLiBJZiAtMSwgdGhlIGVycm9yIHdpbGwgYmUgaW4gZXJybm8uCisgKi8KK2ludDhfdCB1bmxvY2tNdXRleChNVVRFWF9JRCBtdXRleCkKK3sKKwltdXRleC0+dW5sb2NrKCk7CisgIHJldHVybiAwOworfQorCitTRU1BUEhPUkVfSUQgaW5pdGlhbGl6ZVNlbWFwaG9yZSh1aW50MzJfdCBpbml0aWFsX3ZhbHVlKSB7CisgIFNFTUFQSE9SRV9JRCBzZW0gPSBuZXcgc2VtX3Q7CisgIHNlbV9pbml0KHNlbSwgMCwgaW5pdGlhbF92YWx1ZSk7CisgIHJldHVybiBzZW07Cit9CisKK3ZvaWQgZGVsZXRlU2VtYXBob3JlKFNFTUFQSE9SRV9JRCBzZW0pIHsKKyAgc2VtX2Rlc3Ryb3koc2VtKTsKKyAgZGVsZXRlIHNlbTsKK30KKworLyoqCisgKiBMb2NrIHRoZSBzZW1hcGhvcmUsIGJsb2NraW5nIHVudGlsIGl0J3MgYXZhaWxhYmxlLgorICogQHJldHVybiAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZXJyb3IuIElmIC0xLCB0aGUgZXJyb3Igd2lsbCBiZSBpbiBlcnJuby4KKyAqLworaW50OF90IHRha2VTZW1hcGhvcmUoU0VNQVBIT1JFX0lEIHNlbSkKK3sKKyAgICByZXR1cm4gc2VtX3dhaXQoc2VtKTsKK30KKworaW50OF90IHRyeVRha2VTZW1hcGhvcmUoU0VNQVBIT1JFX0lEIHNlbSkKK3sKKyAgICByZXR1cm4gc2VtX3RyeXdhaXQoc2VtKTsKK30KKworLyoqCisgKiBVbmxvY2sgdGhlIHNlbWFwaG9yZS4KKyAqIEByZXR1cm4gMCBmb3Igc3VjY2VzcywgLTEgZm9yIGVycm9yLiBJZiAtMSwgdGhlIGVycm9yIHdpbGwgYmUgaW4gZXJybm8uCisgKi8KK2ludDhfdCBnaXZlU2VtYXBob3JlKFNFTUFQSE9SRV9JRCBzZW0pCit7CisgIHJldHVybiBzZW1fcG9zdChzZW0pOworfQorCisKK01VTFRJV0FJVF9JRCBpbml0aWFsaXplTXVsdGlXYWl0KCkgeworICBwdGhyZWFkX2NvbmRhdHRyX3QgYXR0cjsKKyAgcHRocmVhZF9jb25kYXR0cl9pbml0KCZhdHRyKTsKKyAgTVVMVElXQUlUX0lEIGNvbmQgPSBuZXcgcHRocmVhZF9jb25kX3QoKTsKKyAgcHRocmVhZF9jb25kX2luaXQoY29uZCwgJmF0dHIpOworICBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3koJmF0dHIpOworICByZXR1cm4gY29uZDsKK30KKwordm9pZCBkZWxldGVNdWx0aVdhaXQoTVVMVElXQUlUX0lEIHNlbSkgeworICBwdGhyZWFkX2NvbmRfZGVzdHJveShzZW0pOworICBkZWxldGUgc2VtOworfQorCitpbnQ4X3QgdGFrZU11bHRpV2FpdChNVUxUSVdBSVRfSUQgc2VtLCBNVVRFWF9JRCBtLCBpbnQzMl90IHRpbWVvdXQpIHsKKyAgbG9ja011dGV4KG0pOworICBpbnQ4X3QgdmFsID0gcHRocmVhZF9jb25kX3dhaXQoc2VtLCBtLT5uYXRpdmVfaGFuZGxlKCkpOworICB1bmxvY2tNdXRleChtKTsKKyAgcmV0dXJuIHZhbDsKK30KKworaW50OF90IGdpdmVNdWx0aVdhaXQoTVVMVElXQUlUX0lEIHNlbSkgeworICByZXR1cm4gcHRocmVhZF9jb25kX2Jyb2FkY2FzdChzZW0pOworfQorCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1NvbGVub2lkLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1NvbGVub2lkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjhiZmFmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvU29sZW5vaWQuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKworI2luY2x1ZGUgIkhBTC9Tb2xlbm9pZC5ocHAiCisKKyNpbmNsdWRlICJQb3J0LmgiCisjaW5jbHVkZSAiSEFML0Vycm9ycy5ocHAiCisjaW5jbHVkZSAiQ2hpcE9iamVjdC5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgiCisjaW5jbHVkZSAiY3RyZS9QQ00uaCIKKworc3RhdGljIGNvbnN0IGludCBOVU1fTU9EVUxFX05VTUJFUlMgPSA2MzsKKworUENNICptb2R1bGVzW05VTV9NT0RVTEVfTlVNQkVSU10gPSB7IE5VTEwgfTsKKworc3RydWN0IHNvbGVub2lkX3BvcnRfdCB7CisJUENNICptb2R1bGU7CisJdWludDMyX3QgcGluOworfTsKKwordm9pZCBpbml0aWFsaXplUENNKGludCBtb2R1bGUpIHsKKwlpZighbW9kdWxlc1ttb2R1bGVdKSB7CisJCW1vZHVsZXNbbW9kdWxlXSA9IG5ldyBQQ00obW9kdWxlKTsKKwl9Cit9CisKK3ZvaWQqIGluaXRpYWxpemVTb2xlbm9pZFBvcnQodm9pZCAqcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlQb3J0KiBwb3J0ID0gKFBvcnQqKSBwb3J0X3BvaW50ZXI7CisJaW5pdGlhbGl6ZVBDTShwb3J0LT5tb2R1bGUpOworCQorCXNvbGVub2lkX3BvcnRfdCAqc29sZW5vaWRfcG9ydCA9IG5ldyBzb2xlbm9pZF9wb3J0X3Q7CisJc29sZW5vaWRfcG9ydC0+bW9kdWxlID0gbW9kdWxlc1twb3J0LT5tb2R1bGVdOworCXNvbGVub2lkX3BvcnQtPnBpbiA9IHBvcnQtPnBpbjsKKworCXJldHVybiBzb2xlbm9pZF9wb3J0OworfQorCitib29sIGNoZWNrU29sZW5vaWRNb2R1bGUodWludDhfdCBtb2R1bGUpIHsKKwlyZXR1cm4gbW9kdWxlIDwgTlVNX01PRFVMRV9OVU1CRVJTOworfQorCitib29sIGdldFNvbGVub2lkKHZvaWQqIHNvbGVub2lkX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKSB7CisJc29sZW5vaWRfcG9ydF90KiBwb3J0ID0gKHNvbGVub2lkX3BvcnRfdCopIHNvbGVub2lkX3BvcnRfcG9pbnRlcjsKKwlib29sIHZhbHVlOworCisJKnN0YXR1cyA9IHBvcnQtPm1vZHVsZS0+R2V0U29sZW5vaWQocG9ydC0+cGluLCB2YWx1ZSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3ZvaWQgc2V0U29sZW5vaWQodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBib29sIHZhbHVlLCBpbnQzMl90ICpzdGF0dXMpIHsKKwlzb2xlbm9pZF9wb3J0X3QqIHBvcnQgPSAoc29sZW5vaWRfcG9ydF90Kikgc29sZW5vaWRfcG9ydF9wb2ludGVyOworCisJcG9ydC0+bW9kdWxlLT5TZXRTb2xlbm9pZHMoMSA8PCBwb3J0LT5waW4sIHZhbHVlID8gMHhGRiA6IDB4MDApOworfQorCit2b2lkIHNldFNvbGVub2lkcyh2b2lkKiBzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgbWFzaywgaW50MzJfdCAqc3RhdHVzKSB7CisJc29sZW5vaWRfcG9ydF90KiBwb3J0ID0gKHNvbGVub2lkX3BvcnRfdCopIHNvbGVub2lkX3BvcnRfcG9pbnRlcjsKKworCXBvcnQtPm1vZHVsZS0+U2V0U29sZW5vaWRzKHZhbHVlLCBtYXNrKTsKK30KKworaW50IGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KHZvaWQqIHNvbGVub2lkX3BvcnRfcG9pbnRlciwgaW50MzJfdCAqc3RhdHVzKXsKKwlzb2xlbm9pZF9wb3J0X3QqIHBvcnQgPSAoc29sZW5vaWRfcG9ydF90Kikgc29sZW5vaWRfcG9ydF9wb2ludGVyOworCVVJTlQ4IHZhbHVlOworCQorCSpzdGF0dXMgPSBwb3J0LT5tb2R1bGUtPkdldFNvbGVub2lkQmxhY2tMaXN0KHZhbHVlKTsKKworCXJldHVybiB2YWx1ZTsKK30KK2Jvb2wgZ2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQodm9pZCogc29sZW5vaWRfcG9ydF9wb2ludGVyLCBpbnQzMl90ICpzdGF0dXMpeworCXNvbGVub2lkX3BvcnRfdCogcG9ydCA9IChzb2xlbm9pZF9wb3J0X3QqKSBzb2xlbm9pZF9wb3J0X3BvaW50ZXI7CisJYm9vbCB2YWx1ZTsKKworCSpzdGF0dXMgPSBwb3J0LT5tb2R1bGUtPkdldFNvbGVub2lkU3RpY2t5RmF1bHQodmFsdWUpOworCisJcmV0dXJuIHZhbHVlOworfQorYm9vbCBnZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdCh2b2lkKiBzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyl7CisJc29sZW5vaWRfcG9ydF90KiBwb3J0ID0gKHNvbGVub2lkX3BvcnRfdCopIHNvbGVub2lkX3BvcnRfcG9pbnRlcjsKKwlib29sIHZhbHVlOworCisJKnN0YXR1cyA9IHBvcnQtPm1vZHVsZS0+R2V0U29sZW5vaWRGYXVsdCh2YWx1ZSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9Cit2b2lkIGNsZWFyQWxsUENNU3RpY2t5RmF1bHRzX3NvbCh2b2lkICpzb2xlbm9pZF9wb3J0X3BvaW50ZXIsIGludDMyX3QgKnN0YXR1cyl7CisJc29sZW5vaWRfcG9ydF90KiBwb3J0ID0gKHNvbGVub2lkX3BvcnRfdCopIHNvbGVub2lkX3BvcnRfcG9pbnRlcjsKKwkKKwkqc3RhdHVzID0gcG9ydC0+bW9kdWxlLT5DbGVhclN0aWNreUZhdWx0cygpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvVGFzay5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9UYXNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmU2NmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvVGFzay5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKworI2luY2x1ZGUgIkhBTC9UYXNrLmhwcCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZm5kZWYgT0sKKyNkZWZpbmUgT0sJCTAKKyNlbmRpZiAvKiBPSyAqLworI2lmbmRlZiBFUlJPUgorI2RlZmluZSBFUlJPUgkJKC0xKQorI2VuZGlmIC8qIEVSUk9SICovCisKK2NvbnN0IHVpbnQzMl90IFZYV09SS1NfRlBfVEFTSyA9IDB4MDEwMDAwMDA7Citjb25zdCBpbnQzMl90IEhBTF9vYmpMaWJfT0JKX0lEX0VSUk9SID0gLTE7IC8vIFRPRE86IHVwZGF0ZSB0byByZWxldmFudCBUYXNrSURFcnJvcgorY29uc3QgaW50MzJfdCBIQUxfb2JqTGliX09CSl9ERUxFVEVEID0gLTE7IC8vIFRPRE86IHVwZGF0ZSB0byByZWxldmFudCBUYXNrRGVsZXRlZEVycm9yCitjb25zdCBpbnQzMl90IEhBTF90YXNrTGliX0lMTEVHQUxfT1BUSU9OUyA9IC0xOyAvLyBUT0RPOiB1cGRhdGUgdG8gcmVsZXZhbnQgVGFza09wdGlvbnNFcnJvcgorY29uc3QgaW50MzJfdCBIQUxfbWVtTGliX05PVF9FTk9VR0hfTUVNT1JZID0gLTE7IC8vIFRPRE86IHVwZGF0ZSB0byByZWxldmFudCBUYXNrTWVtb3J5RXJyb3IKK2NvbnN0IGludDMyX3QgSEFMX3Rhc2tMaWJfSUxMRUdBTF9QUklPUklUWSA9IC0xOyAvLyBUT0RPOiB1cGRhdGUgdG8gcmVsZXZhbnQgVGFza1ByaW9yaXR5RXJyb3IKKworc3RydWN0IFRhc2tBcmdzIHsKKwlGVU5DUFRSIGZ1bjsKKwljaGFyKiBuYW1lOworCXB0aHJlYWRfdCoqIHRhc2s7CisJdWludDMyX3QgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwKKwkgICAgICAgICBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4LCBhcmc5OworfTsKKwordm9pZCogc3RhcnRSb3V0aW5lKHZvaWQqIGRhdGEpIHsKKwlUYXNrQXJncyogYXJncyA9IChUYXNrQXJncyopIGRhdGE7CisJcHJpbnRmKCJbSEFMXSBTdGFydGluZyB0YXNrICVzLi4uXG4iLCBhcmdzLT5uYW1lKTsKKwlpbnQgdmFsID0gYXJncy0+ZnVuKGFyZ3MtPmFyZzAsIGFyZ3MtPmFyZzEsIGFyZ3MtPmFyZzIsIGFyZ3MtPmFyZzMsIGFyZ3MtPmFyZzQsCisJCQkgICAgICAgICBhcmdzLT5hcmc1LCBhcmdzLT5hcmc2LCBhcmdzLT5hcmc3LCBhcmdzLT5hcmc4LCBhcmdzLT5hcmc5KTsKKwlwcmludGYoIltIQUxdIEV4aXRlZCB0YXNrICVzIHdpdGggY29kZSAlaVxuIiwgYXJncy0+bmFtZSwgdmFsKTsKKwkqYXJncy0+dGFzayA9IE5VTEw7CisJaW50KiByZXQgPSBuZXcgaW50KCk7ICpyZXQgPSB2YWw7CisJcmV0dXJuIHJldDsKK30KKworVEFTSyBzcGF3blRhc2soY2hhciAqIG5hbWUsIGludCBwcmlvcml0eSwgaW50IG9wdGlvbnMsIGludCBzdGFja1NpemUsIAorCQkgICAgICAgRlVOQ1BUUiBlbnRyeVB0LCB1aW50MzJfdCBhcmcwLCB1aW50MzJfdCBhcmcxLCB1aW50MzJfdCBhcmcyLAorCQkgICAgICAgdWludDMyX3QgYXJnMywgdWludDMyX3QgYXJnNCwgdWludDMyX3QgYXJnNSwgdWludDMyX3QgYXJnNiwKKwkJICAgICAgIHVpbnQzMl90IGFyZzcsIHVpbnQzMl90IGFyZzgsIHVpbnQzMl90IGFyZzkpIHsKKyAgcHJpbnRmKCJbSEFMXSBTcGF3bmluZyB0YXNrICVzLi4uXG4iLCBuYW1lKTsKKyAgcHRocmVhZF90KiB0YXNrID0gbmV3IHB0aHJlYWRfdDsKKyAgcHRocmVhZF9hdHRyX3QqIGF0dHIgPSBuZXcgcHRocmVhZF9hdHRyX3Q7CisgIHB0aHJlYWRfYXR0cl9pbml0KGF0dHIpOworICBUYXNrQXJncyogYXJncyA9IG5ldyBUYXNrQXJncygpOworICBhcmdzLT5mdW4gPSBlbnRyeVB0OworICBhcmdzLT5uYW1lID0gbmFtZTsKKyAgYXJncy0+dGFzayA9IG5ldyBwdGhyZWFkX3QqOworICAqYXJncy0+dGFzayA9IHRhc2s7CisgIGFyZ3MtPmFyZzAgPSBhcmcwOyBhcmdzLT5hcmcxID0gYXJnMTsgYXJncy0+YXJnMiA9IGFyZzI7IGFyZ3MtPmFyZzMgPSBhcmczOyBhcmdzLT5hcmc0ID0gYXJnNDsKKyAgYXJncy0+YXJnNSA9IGFyZzU7IGFyZ3MtPmFyZzYgPSBhcmc2OyBhcmdzLT5hcmc3ID0gYXJnNzsgYXJncy0+YXJnOCA9IGFyZzg7IGFyZ3MtPmFyZzkgPSBhcmc5OworICBpZiAocHRocmVhZF9jcmVhdGUodGFzaywgYXR0ciwgc3RhcnRSb3V0aW5lLCBhcmdzKSA9PSAwKSB7CisJICBwcmludGYoIltIQUxdIFN1Y2Nlc3NcbiIpOworCSAgcHRocmVhZF9kZXRhY2goKnRhc2spOworICB9IGVsc2UgeworCSAgcHJpbnRmKCJbSEFMXSBGYWlsdXJlXG4iKTsKKwkgIHRhc2sgPSBOVUxMOworICB9CisgIHB0aHJlYWRfYXR0cl9kZXN0cm95KGF0dHIpOworICByZXR1cm4gdGFzazsKK30KKworU1RBVFVTIHJlc3RhcnRUYXNrKFRBU0sgdGFzaykgeworICByZXR1cm4gRVJST1I7IC8vIFRPRE86IGltcGxlbWVudDsKK30KKworU1RBVFVTIGRlbGV0ZVRhc2soVEFTSyB0YXNrKSB7CisgIHJldHVybiBFUlJPUjsgLy8gVE9ETzogaW1wbGVtZW50Cit9CisKK1NUQVRVUyBpc1Rhc2tSZWFkeShUQVNLIHRhc2spIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KKworU1RBVFVTIGlzVGFza1N1c3BlbmRlZChUQVNLIHRhc2spIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KKworU1RBVFVTIHN1c3BlbmRUYXNrKFRBU0sgdGFzaykgeworICByZXR1cm4gRVJST1I7IC8vIFRPRE86IGltcGxlbWVudAorfQorCitTVEFUVVMgcmVzdW1lVGFzayhUQVNLIHRhc2spIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KKworU1RBVFVTIHZlcmlmeVRhc2tJRChUQVNLIHRhc2spIHsKKyAgaWYgKHRhc2sgIT0gTlVMTCAmJiBwdGhyZWFkX2tpbGwoKnRhc2ssIDApID09IDApIHsKKwlyZXR1cm4gT0s7CisgIH0gZWxzZSB7CisJcmV0dXJuIEVSUk9SOworICB9Cit9CisKK1NUQVRVUyBzZXRUYXNrUHJpb3JpdHkoVEFTSyB0YXNrLCBpbnQgcHJpb3JpdHkpIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KKworU1RBVFVTIGdldFRhc2tQcmlvcml0eShUQVNLIHRhc2ssIGludCogcHJpb3JpdHkpIHsKKyAgcmV0dXJuIEVSUk9SOyAvLyBUT0RPOiBpbXBsZW1lbnQKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL1V0aWxpdGllcy5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9VdGlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDY3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9VdGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlICJIQUwvVXRpbGl0aWVzLmhwcCIKKyNpbmNsdWRlIDx0aW1lLmg+CisKK2NvbnN0IGludDMyX3QgSEFMX05PX1dBSVQgPSAwOworY29uc3QgaW50MzJfdCBIQUxfV0FJVF9GT1JFVkVSID0gLTE7CisKK3ZvaWQgZGVsYXlUaWNrcyhpbnQzMl90IHRpY2tzKQoreworCXN0cnVjdCB0aW1lc3BlYyB0ZXN0LCByZW1haW5pbmc7CisJdGVzdC50dl9zZWMgPSAwOworCXRlc3QudHZfbnNlYyA9IHRpY2tzICogMzsKKworCS8qIFNsZWVwIHVudGlsIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRpY2tzIGhhcyBwYXNzZWQsIHdpdGggYWRkaXRpb25hbAorCQl0aW1lIGFkZGVkIGlmIG5hbm9zbGVlcCBpcyBpbnRlcnJ1cHRlZC4gKi8KKwl3aGlsZShuYW5vc2xlZXAoJnRlc3QsICZyZW1haW5pbmcpID09IC0xKSB7CisJCXRlc3QgPSByZW1haW5pbmc7CisJfQorfQorCit2b2lkIGRlbGF5TWlsbGlzKGRvdWJsZSBtcykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdGVzdCwgcmVtYWluaW5nOworCXRlc3QudHZfc2VjID0gbXMgLyAxMDAwOworCXRlc3QudHZfbnNlYyA9IDEwMDAgKiAoKCh1aW50NjRfdCltcykgJSAxMDAwMDAwKTsKKworCS8qIFNsZWVwIHVudGlsIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXMgcGFzc2VkLCB3aXRoCisJCWFkZGl0aW9uYWwgdGltZSBhZGRlZCBpZiBuYW5vc2xlZXAgaXMgaW50ZXJydXB0ZWQuICovCisJd2hpbGUobmFub3NsZWVwKCZ0ZXN0LCAmcmVtYWluaW5nKSA9PSAtMSkgeworCQl0ZXN0ID0gcmVtYWluaW5nOworCX0KK30KKwordm9pZCBkZWxheVNlY29uZHMoZG91YmxlIHMpCit7CisJc3RydWN0IHRpbWVzcGVjIHRlc3QsIHJlbWFpbmluZzsKKwl0ZXN0LnR2X3NlYyA9IChpbnQpczsKKwl0ZXN0LnR2X25zZWMgPSAocyAtIChpbnQpcykgKiAxMDAwMDAwMDAwLjA7CisKKwkvKiBTbGVlcCB1bnRpbCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBzZWNvbmRzIGhhcyBwYXNzZWQsIHdpdGggYWRkaXRpb25hbAorCQl0aW1lIGFkZGVkIGlmIG5hbm9zbGVlcCBpcyBpbnRlcnJ1cHRlZC4gKi8KKwl3aGlsZShuYW5vc2xlZXAoJnRlc3QsICZyZW1haW5pbmcpID09IC0xKSB7CisJCXRlc3QgPSByZW1haW5pbmc7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3BwL1Jlc291cmNlLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2NwcC9SZXNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2NwcC9SZXNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMjAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkhBTC9jcHAvUmVzb3VyY2UuaHBwIgorI2luY2x1ZGUgIkhBTC9FcnJvcnMuaHBwIgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK1JlZW50cmFudE11dGV4IFJlc291cmNlOjptX2NyZWF0ZUxvY2s7CisKKy8qKgorICogQWxsb2NhdGUgc3RvcmFnZSBmb3IgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzb3VyY2UuCisgKiBBbGxvY2F0ZSBhIGJvb2wgYXJyYXkgb2YgdmFsdWVzIHRoYXQgd2lsbCBnZXQgaW5pdGlhbGl6ZWQgdG8gaW5kaWNhdGUgdGhhdCBubyByZXNvdXJjZXMKKyAqIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LiBUaGUgaW5kaWNpZXMgb2YgdGhlIHJlc291cmNlcyBhcmUgWzAgLi4gZWxlbWVudHMgLSAxXS4KKyAqLworUmVzb3VyY2U6OlJlc291cmNlKHVpbnQzMl90IGVsZW1lbnRzKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2NyZWF0ZUxvY2spOworCW1fc2l6ZSA9IGVsZW1lbnRzOworCW1faXNBbGxvY2F0ZWQgPSBuZXcgYm9vbFttX3NpemVdOworCWZvciAodWludDMyX3QgaT0wOyBpIDwgbV9zaXplOyBpKyspCisJeworCQltX2lzQWxsb2NhdGVkW2ldID0gZmFsc2U7CisJfQorfQorCisvKioKKyAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIFJlc291cmNlIGFsbG9jYXRpb24tdHJhY2tlciAqaWYqIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gciAtLSBhZGRyZXNzIG9mIHRoZSBjYWxsZXIncyBSZXNvdXJjZSBwb2ludGVyLiBJZiAqciA9PSBOVUxMLCB0aGlzCisgKiAgICB3aWxsIGNvbnN0cnVjdCBhIFJlc291cmNlIGFuZCBtYWtlICpyIHBvaW50IHRvIGl0LiBJZiAqciAhPSBOVUxMLCBpLmUuCisgKiAgICB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIGEgUmVzb3VyY2UgaW5zdGFuY2UsIHRoaXMgd29uJ3QgZG8gYW55dGhpbmcuCisgKiBAcGFyYW0gZWxlbWVudHMgLS0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3IgdGhpcyBSZXNvdXJjZSBhbGxvY2F0b3IgdG8KKyAqICAgIHRyYWNrLCB0aGF0IGlzLCBpdCB3aWxsIGFsbG9jYXRlIHJlc291cmNlIG51bWJlcnMgaW4gdGhlIHJhbmdlCisgKiAgICBbMCAuLiBlbGVtZW50cyAtIDFdLgorICovCisvKnN0YXRpYyovIHZvaWQgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KFJlc291cmNlICoqciwgdWludDMyX3QgZWxlbWVudHMpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fY3JlYXRlTG9jayk7CisJaWYgKCpyID09IE5VTEwpCisJeworCQkqciA9IG5ldyBSZXNvdXJjZShlbGVtZW50cyk7CisJfQorfQorCisvKioKKyAqIERlbGV0ZSB0aGUgYWxsb2NhdGVkIGFycmF5IG9yIHJlc291cmNlcy4KKyAqIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQgKHByb3ZpZGVkIGl0IHdhcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCkuCisgKi8KK1Jlc291cmNlOjp+UmVzb3VyY2UoKQoreworCWRlbGV0ZVtdIG1faXNBbGxvY2F0ZWQ7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSByZXNvdXJjZS4KKyAqIFdoZW4gYSByZXNvdXJjZSBpcyByZXF1ZXN0ZWQsIG1hcmsgaXQgYWxsb2NhdGVkLiBJbiB0aGlzIGNhc2UsIGEgZnJlZSByZXNvdXJjZSB2YWx1ZQorICogd2l0aGluIHRoZSByYW5nZSBpcyBsb2NhdGVkIGFuZCByZXR1cm5lZCBhZnRlciBpdCBpcyBtYXJrZWQgYWxsb2NhdGVkLgorICovCit1aW50MzJfdCBSZXNvdXJjZTo6QWxsb2NhdGUoY29uc3QgY2hhciAqcmVzb3VyY2VEZXNjKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2FsbG9jYXRlTG9jayk7CisJZm9yICh1aW50MzJfdCBpPTA7IGkgPCBtX3NpemU7IGkrKykKKwl7CisJCWlmICghbV9pc0FsbG9jYXRlZFtpXSkKKwkJeworCQkJbV9pc0FsbG9jYXRlZFtpXSA9IHRydWU7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOb0F2YWlsYWJsZVJlc291cmNlcywgcmVzb3VyY2VEZXNjKTsKKwlyZXR1cm4gfjB1bDsKK30KKworLyoqCisgKiBBbGxvY2F0ZSBhIHNwZWNpZmljIHJlc291cmNlIHZhbHVlLgorICogVGhlIHVzZXIgcmVxdWVzdHMgYSBzcGVjaWZpYyByZXNvdXJjZSB2YWx1ZSwgaS5lLiBjaGFubmVsIG51bWJlciBhbmQgaXQgaXMgdmVyaWZpZWQKKyAqIHVuYWxsb2NhdGVkLCB0aGVuIHJldHVybmVkLgorICovCit1aW50MzJfdCBSZXNvdXJjZTo6QWxsb2NhdGUodWludDMyX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnJlc291cmNlRGVzYykKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9hbGxvY2F0ZUxvY2spOworCWlmIChpbmRleCA+PSBtX3NpemUpCisJeworCQkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCByZXNvdXJjZURlc2MpOworCQlyZXR1cm4gfjB1bDsKKwl9CisJaWYgKCBtX2lzQWxsb2NhdGVkW2luZGV4XSApCisJeworCQkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChSZXNvdXJjZUFscmVhZHlBbGxvY2F0ZWQsIHJlc291cmNlRGVzYyk7CisJCXJldHVybiB+MHVsOworCX0KKwltX2lzQWxsb2NhdGVkW2luZGV4XSA9IHRydWU7CisJcmV0dXJuIGluZGV4OworfQorCisKKy8qKgorICogRnJlZSBhbiBhbGxvY2F0ZWQgcmVzb3VyY2UuCisgKiBBZnRlciBhIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWQsIGZvciBleGFtcGxlIGEgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgZm9yIGEgY2hhbm5lbCBhc3NpZ25tZW50CisgKiBjbGFzcywgRnJlZSB3aWxsIHJlbGVhc2UgdGhlIHJlc291cmNlIHZhbHVlIHNvIGl0IGNhbiBiZSByZXVzZWQgc29tZXdoZXJlIGVsc2UgaW4gdGhlIHByb2dyYW0uCisgKi8KK3ZvaWQgUmVzb3VyY2U6OkZyZWUodWludDMyX3QgaW5kZXgpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fYWxsb2NhdGVMb2NrKTsKKwlpZiAoaW5kZXggPT0gfjB1bCkgcmV0dXJuOworCWlmIChpbmRleCA+PSBtX3NpemUpCisJeworCQkvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3IoTm90QWxsb2NhdGVkKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIW1faXNBbGxvY2F0ZWRbaW5kZXhdKQorCXsKKwkJLy8gVE9ETzogd3BpX3NldFdQSUVycm9yKE5vdEFsbG9jYXRlZCk7CisJCXJldHVybjsKKwl9CisJbV9pc0FsbG9jYXRlZFtpbmRleF0gPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2NwcC9TeW5jaHJvbml6ZWQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3BwL1N5bmNocm9uaXplZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjMmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2NwcC9TeW5jaHJvbml6ZWQuY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJIQUwvU2VtYXBob3JlLmhwcCIKKworLyoqCisgKiBTeW5jaHJvbml6ZWQgY2xhc3MgZGVhbHMgd2l0aCBjcml0aWNhbCByZWdpb25zLgorICogRGVjbGFyZSBhIFN5bmNocm9uaXplZCBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrLiBUaGF0IHdpbGwgdGFrZSB0aGUgc2VtYXBob3JlLgorICogV2hlbiB0aGUgY29kZSBleGl0cyBmcm9tIHRoZSBibG9jayBpdCB3aWxsIGNhbGwgdGhlIGRlc3RydWN0b3Igd2hpY2ggd2lsbCBnaXZlIHRoZSBzZW1hcGhvcmUuCisgKiBUaGlzIGVuc3VyZXMgdGhhdCBubyBtYXR0ZXIgaG93IHRoZSBibG9jayBpcyBleGl0ZWQsIHRoZSBzZW1hcGhvcmUgd2lsbCBhbHdheXMgYmUgcmVsZWFzZWQuCisgKiBAcGFyYW0gc2VtYXBob3JlIFRoZSBzZW1hcGhvcmUgY29udHJvbGxpbmcgdGhpcyBjcml0aWNhbCByZWdpb24uCisgKi8KK1N5bmNocm9uaXplZDo6U3luY2hyb25pemVkKFNFTUFQSE9SRV9JRCBzZW1hcGhvcmUpCisgICAgOiBtX3NlbWFwaG9yZShzZW1hcGhvcmUpIHsKKyAgdGFrZVNlbWFwaG9yZShtX3NlbWFwaG9yZSk7Cit9CisKKy8qKgorICogVGhpcyBkZXN0cnVjdG9yIHVubG9ja3MgdGhlIHNlbWFwaG9yZS4KKyAqLworU3luY2hyb25pemVkOjp+U3luY2hyb25pemVkKCkKK3sKKwlnaXZlU2VtYXBob3JlKG1fc2VtYXBob3JlKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ2FuVGFsb25TUlguY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9DYW5UYWxvblNSWC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxMDk5YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ2FuVGFsb25TUlguY3BwCkBAIC0wLDAgKzEsMTI0MSBAQAorLyoqDQorICogQGJyaWVmIENBTiBUQUxPTiBTUlggZHJpdmVyLg0KKyAqDQorICogVGhlIFRBTE9OIFNSWCBpcyBkZXNpZ25lZCB0byBpbnN0cnVtZW50IGFsbCBydW50aW1lIHNpZ25hbHMgcGVyaW9kaWNhbGx5LiAgVGhlIGRlZmF1bHQgcGVyaW9kcyBhcmUgY2hvc2VuIHRvIHN1cHBvcnQgMTYgVEFMT05zDQorICogd2l0aCAxMG1zIHVwZGF0ZSByYXRlIGZvciBjb250cm9sICh0aHJvdHRsZSBvciBzZXRwb2ludCkuICBIb3dldmVyIHRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggU2V0U3RhdHVzRnJhbWVSYXRlLiBAc2VlIFNldFN0YXR1c0ZyYW1lUmF0ZQ0KKyAqIFRoZSBnZXR0ZXJzIGZvciB0aGVzZSB1bnNvbGljaXRlZCBzaWduYWxzIGFyZSBhdXRvIGdlbmVyYXRlZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgbW9kdWxlLg0KKyAqDQorICogTGlrZXdpc2UgbW9zdCBjb250cm9sIHNpZ25hbHMgYXJlIHNlbnQgcGVyaW9kaWNhbGx5IHVzaW5nIHRoZSBmaXJlLWFuZC1mb3JnZXQgQ0FOIEFQSS4NCisgKiBUaGUgc2V0dGVycyBmb3IgdGhlc2UgdW5zb2xpY2l0ZWQgc2lnbmFscyBhcmUgYXV0byBnZW5lcmF0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG1vZHVsZS4NCisgKg0KKyAqIFNpZ25hbHMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbiB1bnNvbGljaXRlZCBmYXNoaW9uIGFyZSB0aGUgQ2xvc2UgTG9vcCBnYWlucy4NCisgKiBGb3IgdGVhbXMgdGhhdCBoYXZlIGEgc2luZ2xlIHByb2ZpbGUgZm9yIHRoZWlyIFRBTE9OIGNsb3NlIGxvb3AgdGhleSBjYW4gdXNlIGVpdGhlciB0aGUgd2VicGFnZSB0byBjb25maWd1cmUgdGhlaXIgVEFMT05zIG9uY2UNCisgKiAJb3Igc2V0IHRoZSBQSURGLEl6b25lLENsb3NlTG9vcFJhbXBSYXRlLGV0Yy4uLiBvbmNlIGluIHRoZSByb2JvdCBhcHBsaWNhdGlvbi4gIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHNhdmVkIHRvIGZsYXNoIHNvIG9uY2UgdGhleSBhcmUNCisgKiAJbG9hZGVkIGluIHRoZSBUQUxPTiwgdGhleSB3aWxsIHBlcnNpc3QgdGhyb3VnaCBwb3dlciBjeWNsZXMgYW5kIG1vZGUgY2hhbmdlcy4NCisgKg0KKyAqIEZvciB0ZWFtcyB0aGF0IGhhdmUgb25lIG9yIHR3byBwcm9maWxlcyB0byBzd2l0Y2ggYmV0d2VlbiwgdGhleSBjYW4gdXNlIHRoZSBzYW1lIHN0cmF0ZWd5IHNpbmNlIHRoZXJlIGFyZSB0d28gc2xvdHMgdG8gY2hvb3NlIGZyb20NCisgKiBhbmQgdGhlIFByb2ZpbGVTbG90U2VsZWN0IGlzIHBlcmlvZGljYWxseSBzZW50IGluIHRoZSAxMCBtcyBjb250cm9sIGZyYW1lLg0KKyAqDQorICogRm9yIHRlYW1zIHRoYXQgcmVxdWlyZSBjaGFuZ2luZyBnYWlucyBmcmVxdWVudGx5LCB0aGV5IGNhbiB1c2UgdGhlIHNvbGljaXRpbmcgQVBJIHRvIGdldCBhbmQgc2V0IHRob3NlIHBhcmFtZXRlcnMuICBNb3N0IGxpa2VseQ0KKyAqIHRoZXkgd2lsbCBvbmx5IG5lZWQgdG8gc2V0IHRoZW0gaW4gYSBwZXJpb2RpYyBmYXNoaW9uIGFzIGEgZnVuY3Rpb24gb2Ygd2hhdCBtb3Rpb24gdGhlIGFwcGxpY2F0aW9uIGlzIGF0dGVtcHRpbmcuDQorICogSWYgdGhpcyBBUEkgaXMgdXNlZCwgYmUgbWluZGZ1bCBvZiB0aGUgQ0FOIHV0aWxpemF0aW9uIHJlcG9ydGVkIGluIHRoZSBkcml2ZXIgc3RhdGlvbi4NCisgKg0KKyAqIEVuY29kZXIgcG9zaXRpb24gaXMgbWVhc3VyZWQgaW4gZW5jb2RlciBlZGdlcy4gIEV2ZXJ5IGVkZ2UgaXMgY291bnRlZCAoc2ltaWxhciB0byByb2JvUklPIDRYIG1vZGUpLg0KKyAqIEFuYWxvZyBwb3NpdGlvbiBpcyAxMCBiaXRzLCBtZWFuaW5nIDEwMjQgdGlja3MgcGVyIHJvdGF0aW9uICgwViA9PiAzLjNWKS4NCisgKiBVc2UgU2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QgdG8gc2VsZWN0IHdoaWNoIHNlbnNvciB0eXBlIHlvdSBuZWVkLiAgT25jZSB5b3UgZG8gdGhhdCB5b3UgY2FuIHVzZSBHZXRTZW5zb3JQb3NpdGlvbigpDQorICogYW5kIEdldFNlbnNvclZlbG9jaXR5KCkuICBUaGVzZSBzaWduYWxzIGFyZSB1cGRhdGVkIG9uIENBTkJ1cyBldmVyeSAyMG1zIChieSBkZWZhdWx0KS4NCisgKiBJZiBhIHJlbGF0aXZlIHNlbnNvciBpcyBzZWxlY3RlZCwgeW91IGNhbiB6ZXJvIChvciBjaGFuZ2UgdGhlIGN1cnJlbnQgdmFsdWUpIHVzaW5nIFNldFNlbnNvclBvc2l0aW9uLg0KKyAqDQorICogQW5hbG9nIElucHV0IGFuZCBxdWFkcmF0dXJlIHBvc2l0aW9uIChhbmQgdmVsb2NpdHkpIGFyZSBhbHNvIGV4cGxpY2l0bHkgcmVwb3J0ZWQgaW4gR2V0RW5jUG9zaXRpb24sIEdldEVuY1ZlbCwgR2V0QW5hbG9nSW5XaXRoT3YsIEdldEFuYWxvZ0luVmVsLg0KKyAqIFRoZXNlIHNpZ25hbHMgYXJlIGF2YWlsYWJsZSBhbGwgdGhlIHRpbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZW5zb3IgaXMgc2VsZWN0ZWQgYXQgYSByYXRlIG9mIDEwMG1zLiAgVGhpcyBhbGxvd3MgZWFzeSBpbnN0cnVtZW50YXRpb24NCisgKiBmb3IgImluIHRoZSBwaXRzIiBjaGVja2luZyBvZiBhbGwgc2Vuc29ycyByZWdhcmRsZXNzIG9mIG1vZGVzZWxlY3QuICBUaGUgMTAwbXMgcmF0ZSBpcyBvdmVycmlkYWJsZSBmb3IgdGVhbXMgd2hvIHdhbnQgdG8gYWNxdWlyZSBzZW5zb3INCisgKiBkYXRhIGZvciBwcm9jZXNzaW5nLCBub3QganVzdCBpbnN0cnVtZW50YXRpb24uICBPciBqdXN0IHNlbGVjdCB0aGUgc2Vuc29yIHVzaW5nIFNldEZlZWRiYWNrRGV2aWNlU2VsZWN0IHRvIGdldCBpdCBhdCAyMG1zLg0KKyAqDQorICogVmVsb2NpdHkgaXMgaW4gcG9zaXRpb24gdGlja3MgLyAxMDBtcy4NCisgKg0KKyAqIEFsbCBvdXRwdXQgdW5pdHMgYXJlIGluIHJlc3BlY3QgdG8gZHV0eSBjeWNsZSAodGhyb3R0bGUpIHdoaWNoIGlzIC0xMDIzKGZ1bGwgcmV2ZXJzZSkgdG8gKzEwMjMgKGZ1bGwgZm9yd2FyZCkuDQorICogIFRoaXMgaW5jbHVkZXMgZGVtYW5kICh3aGljaCBzcGVjaWZpZXMgZHV0eSBjeWNsZSB3aGVuIGluIGR1dHkgY3ljbGUgbW9kZSkgYW5kIHJhbXBSYW1wLCB3aGljaCBpcyBpbiB0aHJvdHRsZSB1bml0cyBwZXIgMTBtcyAoaWYgbm9uemVybykuDQorICoNCisgKiBQb3MgYW5kIHZlbG9jaXR5IGNsb3NlIGxvb3BzIGFyZSBjYWxjJ2QgYXMNCisgKiAJCWVyciA9IHRhcmdldCAtIHBvc09yVmVsLg0KKyAqIAkJaUVyciArPSBlcnI7DQorICogCQlpZiggICAoSVpvbmUhPTApICBhbmQgIGFicyhlcnIpID4gSVpvbmUpDQorICogCQkJQ2xlYXJJYWNjdW0oKQ0KKyAqIAkJb3V0cHV0ID0gUCBYIGVyciArIEkgWCBpRXJyICsgRCBYIGRFcnIgKyBGIFggdGFyZ2V0DQorICogCQlkRXJyID0gZXJyIC0gbGFzdEVycg0KKyAqCVAsIEksYW5kIEQgZ2FpbnMgYXJlIGFsd2F5cyBwb3NpdGl2ZS4gRiBjYW4gYmUgbmVnYXRpdmUuDQorICoJTW90b3IgZGlyZWN0aW9uIGNhbiBiZSByZXZlcnNlZCB1c2luZyBTZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbiBpZiBzZW5zb3IgYW5kIG1vdG9yIGFyZSBvdXQgb2YgcGhhc2UuDQorICoJU2ltaWxhcmx5IGZlZWRiYWNrIHNlbnNvciBjYW4gYWxzbyBiZSByZXZlcnNlZCAobXVsdGlwbGllZCBieSAtMSkgaWYgeW91IHByZWZlciB0aGUgc2Vuc29yIHRvIGJlIGludmVydGVkLg0KKyAqDQorICogUCBnYWluIGlzIHNwZWNpZmllZCBpbiB0aHJvdHRsZSBwZXIgZXJyb3IgdGljay4gIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwMiBpcyB+OS45JSAod2hpY2ggaXMgMTAyLzEwMjMpIHRocm90dGxlIHBlciAxDQorICogCQlBREMgdW5pdCgxMGJpdCkgb3IgMSBxdWFkcmF0dXJlIGVuY29kZXIgZWRnZSBkZXBlbmRpbmcgb24gc2VsZWN0ZWQgc2Vuc29yLg0KKyAqDQorICogSSBnYWluIGlzIHNwZWNpZmllZCBpbiB0aHJvdHRsZSBwZXIgaW50ZWdyYXRlZCBlcnJvci4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMTAgZXF1YXRlcyB0byB+MC45OSUgKHdoaWNoIGlzIDEwLzEwMjMpDQorICogIAlmb3IgZWFjaCBhY2N1bXVsYXRlZCBBREMgdW5pdCgxMGJpdCkgb3IgMSBxdWFkcmF0dXJlIGVuY29kZXIgZWRnZSBkZXBlbmRpbmcgb24gc2VsZWN0ZWQgc2Vuc29yLg0KKyAqICAJQ2xvc2UgbG9vcCBhbmQgaW50ZWdyYWwgYWNjdW11bGF0b3IgcnVucyBldmVyeSAxbXMuDQorICoNCisgKiBEIGdhaW4gaXMgc3BlY2lmaWVkIGluIHRocm90dGxlIHBlciBkZXJpdmF0aXZlIGVycm9yLiBGb3IgZXhhbXBsZSBhIHZhbHVlIG9mIDEwMiBlcXVhdGVzIHRvIH45LjklICh3aGljaCBpcyAxMDIvMTAyMykNCisgKiAJcGVyIGNoYW5nZSBvZiAxIHVuaXQgKEFEQyBvciBlbmNvZGVyKSBwZXIgbXMuDQorICoNCisgKiBJIFpvbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBzYW1lIHVuaXRzIGFzIHNlbnNvciBwb3NpdGlvbiAoQURDIHVuaXRzIG9yIHF1YWRyYXR1cmUgZWRnZXMpLiAgSWYgcG9zL3ZlbCBlcnJvciBpcyBvdXRzaWRlIG9mDQorICogCQl0aGlzIHZhbHVlLCB0aGUgaW50ZWdyYXRlZCBlcnJvciB3aWxsIGF1dG8tY2xlYXIuLi4NCisgKiAJCWlmKCAgIChJWm9uZSE9MCkgIGFuZCAgYWJzKGVycikgPiBJWm9uZSkNCisgKiAJCQlDbGVhcklhY2N1bSgpDQorICogCQkuLi50aGlzIGlzIHZlcnkgdXNlZnVsIGluIHByZXZlbnRpbmcgaW50ZWdyYWwgd2luZHVwIGFuZCBpcyBoaWdobHkgcmVjb21tZW5kZWQgaWYgdXNpbmcgZnVsbCBQSUQgdG8ga2VlcCBzdGFiaWxpdHkgbG93Lg0KKyAqDQorICogQ2xvc2VMb29wUmFtcFJhdGUgaXMgaW4gdGhyb3R0bGUgdW5pdHMgcGVyIDFtcy4gIFNldCB0byB6ZXJvIHRvIGRpc2FibGUgcmFtcGluZy4NCisgKiAJCVdvcmtzIHRoZSBzYW1lIGFzIFJhbXBUaHJvdHRsZSBidXQgb25seSBpcyBpbiBlZmZlY3Qgd2hlbiBhIGNsb3NlIGxvb3AgbW9kZSBhbmQgcHJvZmlsZSBzbG90IGlzIHNlbGVjdGVkLg0KKyAqDQorICogYXV0byBnZW5lcmF0ZWQgdXNpbmcgc3ByZWFkc2hlZXQgYW5kIFdwaUNsYXNzR2VuLmNzcHJvag0KKyAqIEBsaW5rIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFPVV9aVjdmWkxHWVVRLVVoYzhzVkFtVW1XVGxUOFhCRllLOGxmamdfdGFjL2VkaXQjZ2lkPTE3NjYwNDY5NjcNCisgKi8NCisjaW5jbHVkZSAiQ2FuVGFsb25TUlguaCINCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIgkvL0NBTiBDb21tDQorI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBtZW1zZXQNCisjaW5jbHVkZSA8dW5pc3RkLmg+IC8vIHVzbGVlcA0KKw0KKyNkZWZpbmUgU1RBVFVTXzEgIAkJMHgwMjA0MTQwMA0KKyNkZWZpbmUgU1RBVFVTXzIgIAkJMHgwMjA0MTQ0MA0KKyNkZWZpbmUgU1RBVFVTXzMgIAkJMHgwMjA0MTQ4MA0KKyNkZWZpbmUgU1RBVFVTXzQgIAkJMHgwMjA0MTRDMA0KKyNkZWZpbmUgU1RBVFVTXzUgIAkJMHgwMjA0MTUwMA0KKyNkZWZpbmUgU1RBVFVTXzYgIAkJMHgwMjA0MTU0MA0KKyNkZWZpbmUgU1RBVFVTXzcgIAkJMHgwMjA0MTU4MA0KKw0KKyNkZWZpbmUgQ09OVFJPTF8xIAkJCTB4MDIwNDAwMDANCisjZGVmaW5lIENPTlRST0xfMiAJCQkweDAyMDQwMDQwDQorI2RlZmluZSBDT05UUk9MXzMgCQkJMHgwMjA0MDA4MA0KKw0KKyNkZWZpbmUgRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUwkoMjAwKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzEoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c18xX0dlbmVyYWxfMTBtc190CQk+IHJ4ID0gR2V0Ung8VEFMT05fU3RhdHVzXzFfR2VuZXJhbF8xMG1zX3Q+KFNUQVRVU18xCSAgfCBHZXREZXZpY2VOdW1iZXIoKSwgRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisjZGVmaW5lIEdFVF9TVEFUVVMyKCkgQ3RyZUNhbk5vZGU6OnJlY01zZzxUQUxPTl9TdGF0dXNfMl9GZWVkYmFja18yMG1zX3QJPiByeCA9IEdldFJ4PFRBTE9OX1N0YXR1c18yX0ZlZWRiYWNrXzIwbXNfdD4oU1RBVFVTXzIJICB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzMoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c18zX0VuY18xMDBtc190CQk+IHJ4ID0gR2V0Ung8VEFMT05fU3RhdHVzXzNfRW5jXzEwMG1zX3Q+KFNUQVRVU18zCQkgIHwgR2V0RGV2aWNlTnVtYmVyKCksIEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMpDQorI2RlZmluZSBHRVRfU1RBVFVTNCgpIEN0cmVDYW5Ob2RlOjpyZWNNc2c8VEFMT05fU3RhdHVzXzRfQWluVGVtcFZiYXRfMTAwbXNfdD4gcnggPSBHZXRSeDxUQUxPTl9TdGF0dXNfNF9BaW5UZW1wVmJhdF8xMDBtc190PihTVEFUVVNfNCB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzUoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c181X1N0YXJ0dXBfT25lU2hvdF90CT4gcnggPSBHZXRSeDxUQUxPTl9TdGF0dXNfNV9TdGFydHVwX09uZVNob3RfdD4oU1RBVFVTXzUJICB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzYoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c182X0VvbF90CQkJCT4gcnggPSBHZXRSeDxUQUxPTl9TdGF0dXNfNl9Fb2xfdD4oU1RBVFVTXzYJCQkJICB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKyNkZWZpbmUgR0VUX1NUQVRVUzcoKSBDdHJlQ2FuTm9kZTo6cmVjTXNnPFRBTE9OX1N0YXR1c183X0RlYnVnXzIwMG1zX3QJCT4gcnggPSBHZXRSeDxUQUxPTl9TdGF0dXNfN19EZWJ1Z18yMDBtc190PihTVEFUVVNfNwkJICB8IEdldERldmljZU51bWJlcigpLCBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TKQ0KKw0KKyNkZWZpbmUgUEFSQU1fUkVRVUVTVCAJCTB4MDIwNDE4MDANCisjZGVmaW5lIFBBUkFNX1JFU1BPTlNFIAkJMHgwMjA0MTg0MA0KKyNkZWZpbmUgUEFSQU1fU0VUCQkJMHgwMjA0MTg4MA0KKw0KK2NvbnN0IGludCBrUGFyYW1BcmJJZFZhbHVlID0gCVBBUkFNX1JFU1BPTlNFOw0KK2NvbnN0IGludCBrUGFyYW1BcmJJZE1hc2sgPSAJMHhGRkZGRkZGRjsNCisNCitjb25zdCBkb3VibGUgRkxPQVRfVE9fRlhQID0gKGRvdWJsZSkweDQwMDAwMDsNCitjb25zdCBkb3VibGUgRlhQX1RPX0ZMT0FUID0gMC4wMDAwMDAyMzg0MTg1NzkxMDE1NjI1Ow0KKw0KKy8qIGVuY29kZXIvZGVjb2RlcnMgKi8NCisvKiogY29udHJvbCAqLw0KK3R5cGVkZWYgc3RydWN0IF9UQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Qgew0KKwl1bnNpZ25lZCBUb2tlbkg6ODsNCisJdW5zaWduZWQgVG9rZW5MOjg7DQorCXVuc2lnbmVkIERlbWFuZEg6ODsNCisJdW5zaWduZWQgRGVtYW5kTTo4Ow0KKwl1bnNpZ25lZCBEZW1hbmRMOjg7DQorCXVuc2lnbmVkIFByb2ZpbGVTbG90U2VsZWN0OjE7DQorCXVuc2lnbmVkIEZlZWRiYWNrRGV2aWNlU2VsZWN0OjQ7DQorCXVuc2lnbmVkIE92ZXJyaWRlTGltaXRTd2l0Y2hFbjozOw0KKwl1bnNpZ25lZCBSZXZGZWVkYmFja1NlbnNvcjoxOw0KKwl1bnNpZ25lZCBSZXZNb3REdXJpbmdDbG9zZUxvb3BFbjoxOw0KKwl1bnNpZ25lZCBPdmVycmlkZUJyYWtlVHlwZToyOw0KKwl1bnNpZ25lZCBNb2RlU2VsZWN0OjQ7DQorCXVuc2lnbmVkIFJhbXBUaHJvdHRsZTo4Ow0KK30gVEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190IDsNCit0eXBlZGVmIHN0cnVjdCBfVEFMT05fQ29udHJvbF8yX1JhdGVzX09uZVNob3RfdCB7DQorCXVuc2lnbmVkIFN0YXR1czFNczo4Ow0KKwl1bnNpZ25lZCBTdGF0dXMyTXM6ODsNCisJdW5zaWduZWQgU3RhdHVzM01zOjg7DQorCXVuc2lnbmVkIFN0YXR1czRNczo4Ow0KK30gVEFMT05fQ29udHJvbF8yX1JhdGVzX09uZVNob3RfdCA7DQordHlwZWRlZiBzdHJ1Y3QgX1RBTE9OX0NvbnRyb2xfM19DbGVhckZsYWdzX09uZVNob3RfdCB7DQorCXVuc2lnbmVkIFplcm9GZWVkYmFja1NlbnNvcjoxOw0KKwl1bnNpZ25lZCBDbGVhclN0aWNreUZhdWx0czoxOw0KK30gVEFMT05fQ29udHJvbF8zX0NsZWFyRmxhZ3NfT25lU2hvdF90IDsNCisNCisvKiogc3RhdHVzICovDQordHlwZWRlZiBzdHJ1Y3QgX1RBTE9OX1N0YXR1c18xX0dlbmVyYWxfMTBtc190IHsNCisJdW5zaWduZWQgQ2xvc2VMb29wRXJySDo4Ow0KKwl1bnNpZ25lZCBDbG9zZUxvb3BFcnJNOjg7DQorCXVuc2lnbmVkIENsb3NlTG9vcEVyckw6ODsNCisJdW5zaWduZWQgQXBwbGllZFRocm90dGxlX2gzOjM7DQorCXVuc2lnbmVkIEZhdWx0X1JldlNvZnRMaW06MTsNCisJdW5zaWduZWQgRmF1bHRfRm9yU29mdExpbToxOw0KKwl1bnNpZ25lZCBUb2tMb2NrZWQ6MTsNCisJdW5zaWduZWQgTGltaXRTd2l0Y2hDbG9zZWRSZXY6MTsNCisJdW5zaWduZWQgTGltaXRTd2l0Y2hDbG9zZWRGb3I6MTsNCisJdW5zaWduZWQgQXBwbGllZFRocm90dGxlX2w4Ojg7DQorCXVuc2lnbmVkIE1vZGVTZWxlY3RfaDE6MTsNCisJdW5zaWduZWQgRmVlZGJhY2tEZXZpY2VTZWxlY3Q6NDsNCisJdW5zaWduZWQgTGltaXRTd2l0Y2hFbjozOw0KKwl1bnNpZ25lZCBGYXVsdF9IYXJkd2FyZUZhaWx1cmU6MTsNCisJdW5zaWduZWQgRmF1bHRfUmV2TGltOjE7DQorCXVuc2lnbmVkIEZhdWx0X0ZvckxpbToxOw0KKwl1bnNpZ25lZCBGYXVsdF9VbmRlclZvbHRhZ2U6MTsNCisJdW5zaWduZWQgRmF1bHRfT3ZlclRlbXA6MTsNCisJdW5zaWduZWQgTW9kZVNlbGVjdF9iMzozOw0KKwl1bnNpZ25lZCBUb2tlblNlZWQ6ODsNCit9IFRBTE9OX1N0YXR1c18xX0dlbmVyYWxfMTBtc190IDsNCit0eXBlZGVmIHN0cnVjdCBfVEFMT05fU3RhdHVzXzJfRmVlZGJhY2tfMjBtc190IHsNCisJdW5zaWduZWQgU2Vuc29yUG9zaXRpb25IOjg7DQorCXVuc2lnbmVkIFNlbnNvclBvc2l0aW9uTTo4Ow0KKwl1bnNpZ25lZCBTZW5zb3JQb3NpdGlvbkw6ODsNCisJdW5zaWduZWQgU2Vuc29yVmVsb2NpdHlIOjg7DQorCXVuc2lnbmVkIFNlbnNvclZlbG9jaXR5TDo4Ow0KKwl1bnNpZ25lZCBDdXJyZW50X2g4Ojg7DQorCXVuc2lnbmVkIFN0Y2t5RmF1bHRfUmV2U29mdExpbToxOw0KKwl1bnNpZ25lZCBTdGNreUZhdWx0X0ZvclNvZnRMaW06MTsNCisJdW5zaWduZWQgU3Rja3lGYXVsdF9SZXZMaW06MTsNCisJdW5zaWduZWQgU3Rja3lGYXVsdF9Gb3JMaW06MTsNCisJdW5zaWduZWQgU3Rja3lGYXVsdF9VbmRlclZvbHRhZ2U6MTsNCisJdW5zaWduZWQgU3Rja3lGYXVsdF9PdmVyVGVtcDoxOw0KKwl1bnNpZ25lZCBDdXJyZW50X2wyOjI7DQorCXVuc2lnbmVkIHJlc2VydmVkOjY7DQorCXVuc2lnbmVkIFByb2ZpbGVTbG90U2VsZWN0OjE7DQorCXVuc2lnbmVkIEJyYWtlSXNFbmFibGVkOjE7DQorfSBUQUxPTl9TdGF0dXNfMl9GZWVkYmFja18yMG1zX3QgOw0KK3R5cGVkZWYgc3RydWN0IF9UQUxPTl9TdGF0dXNfM19FbmNfMTAwbXNfdCB7DQorCXVuc2lnbmVkIEVuY1Bvc2l0aW9uSDo4Ow0KKwl1bnNpZ25lZCBFbmNQb3NpdGlvbk06ODsNCisJdW5zaWduZWQgRW5jUG9zaXRpb25MOjg7DQorCXVuc2lnbmVkIEVuY1ZlbEg6ODsNCisJdW5zaWduZWQgRW5jVmVsTDo4Ow0KKwl1bnNpZ25lZCBFbmNJbmRleFJpc2VFdmVudHNIOjg7DQorCXVuc2lnbmVkIEVuY0luZGV4UmlzZUV2ZW50c0w6ODsNCisJdW5zaWduZWQgcmVzZXJ2ZWQ6NTsNCisJdW5zaWduZWQgUXVhZElkeHBpbjoxOw0KKwl1bnNpZ25lZCBRdWFkQnBpbjoxOw0KKwl1bnNpZ25lZCBRdWFkQXBpbjoxOw0KK30gVEFMT05fU3RhdHVzXzNfRW5jXzEwMG1zX3QgOw0KK3R5cGVkZWYgc3RydWN0IF9UQUxPTl9TdGF0dXNfNF9BaW5UZW1wVmJhdF8xMDBtc190IHsNCisJdW5zaWduZWQgQW5hbG9nSW5XaXRoT3ZIOjg7DQorCXVuc2lnbmVkIEFuYWxvZ0luV2l0aE92TTo4Ow0KKwl1bnNpZ25lZCBBbmFsb2dJbldpdGhPdkw6ODsNCisJdW5zaWduZWQgQW5hbG9nSW5WZWxIOjg7DQorCXVuc2lnbmVkIEFuYWxvZ0luVmVsTDo4Ow0KKwl1bnNpZ25lZCBUZW1wOjg7DQorCXVuc2lnbmVkIEJhdHRlcnlWOjg7DQorCXVuc2lnbmVkIHJlc2VydmVkOjg7DQorfSBUQUxPTl9TdGF0dXNfNF9BaW5UZW1wVmJhdF8xMDBtc190IDsNCit0eXBlZGVmIHN0cnVjdCBfVEFMT05fU3RhdHVzXzVfU3RhcnR1cF9PbmVTaG90X3Qgew0KKwl1bnNpZ25lZCBSZXNldENvdW50SDo4Ow0KKwl1bnNpZ25lZCBSZXNldENvdW50TDo4Ow0KKwl1bnNpZ25lZCBSZXNldEZsYWdzSDo4Ow0KKwl1bnNpZ25lZCBSZXNldEZsYWdzTDo4Ow0KKwl1bnNpZ25lZCBGaXJtVmVyc0g6ODsNCisJdW5zaWduZWQgRmlybVZlcnNMOjg7DQorfSBUQUxPTl9TdGF0dXNfNV9TdGFydHVwX09uZVNob3RfdCA7DQordHlwZWRlZiBzdHJ1Y3QgX1RBTE9OX1N0YXR1c182X0VvbF90IHsNCisJdW5zaWduZWQgY3VycmVudEFkY1VuY2FsX2gyOjI7DQorCXVuc2lnbmVkIHJlc2VydmVkMTo1Ow0KKwl1bnNpZ25lZCBTcGlDc1Bpbl9HYWRnZXRlZXJQaW42OjE7DQorCXVuc2lnbmVkIGN1cnJlbnRBZGNVbmNhbF9sODo4Ow0KKwl1bnNpZ25lZCB0ZW1wQWRjVW5jYWxfaDI6MjsNCisJdW5zaWduZWQgcmVzZXJ2ZWQyOjY7DQorCXVuc2lnbmVkIHRlbXBBZGNVbmNhbF9sODo4Ow0KKwl1bnNpZ25lZCB2YmF0QWRjVW5jYWxfaDI6MjsNCisJdW5zaWduZWQgcmVzZXJ2ZWQzOjY7DQorCXVuc2lnbmVkIHZiYXRBZGNVbmNhbF9sODo4Ow0KKwl1bnNpZ25lZCBhbmFsb2dBZGNVbmNhbF9oMjoyOw0KKwl1bnNpZ25lZCByZXNlcnZlZDQ6NjsNCisJdW5zaWduZWQgYW5hbG9nQWRjVW5jYWxfbDg6ODsNCit9IFRBTE9OX1N0YXR1c182X0VvbF90IDsNCit0eXBlZGVmIHN0cnVjdCBfVEFMT05fU3RhdHVzXzdfRGVidWdfMjAwbXNfdCB7DQorCXVuc2lnbmVkIFRva2VuaXphdGlvbkZhaWxzX2g4Ojg7DQorCXVuc2lnbmVkIFRva2VuaXphdGlvbkZhaWxzX2w4Ojg7DQorCXVuc2lnbmVkIExhc3RGYWlsZWRUb2tlbl9oODo4Ow0KKwl1bnNpZ25lZCBMYXN0RmFpbGVkVG9rZW5fbDg6ODsNCisJdW5zaWduZWQgVG9rZW5pemF0aW9uU3VjY2VzZXNfaDg6ODsNCisJdW5zaWduZWQgVG9rZW5pemF0aW9uU3VjY2VzZXNfbDg6ODsNCit9IFRBTE9OX1N0YXR1c183X0RlYnVnXzIwMG1zX3QgOw0KK3R5cGVkZWYgc3RydWN0IF9UQUxPTl9QYXJhbV9SZXF1ZXN0X3Qgew0KKwl1bnNpZ25lZCBQYXJhbUVudW06ODsNCit9IFRBTE9OX1BhcmFtX1JlcXVlc3RfdCA7DQordHlwZWRlZiBzdHJ1Y3QgX1RBTE9OX1BhcmFtX1Jlc3BvbnNlX3Qgew0KKwl1bnNpZ25lZCBQYXJhbUVudW06ODsNCisJdW5zaWduZWQgUGFyYW1WYWx1ZUw6ODsNCisJdW5zaWduZWQgUGFyYW1WYWx1ZU1MOjg7DQorCXVuc2lnbmVkIFBhcmFtVmFsdWVNSDo4Ow0KKwl1bnNpZ25lZCBQYXJhbVZhbHVlSDo4Ow0KK30gVEFMT05fUGFyYW1fUmVzcG9uc2VfdCA7DQorDQorDQorQ2FuVGFsb25TUlg6OkNhblRhbG9uU1JYKGludCBkZXZpY2VOdW1iZXIsaW50IGNvbnRyb2xQZXJpb2RNcyk6IEN0cmVDYW5Ob2RlKGRldmljZU51bWJlciksIF9jYW5faCgwKSwgX2Nhbl9zdGF0KDApDQorew0KKwkvKiBib3VuZCBwZXJpb2QgdG8gYmUgd2l0aGluIFsxIG1zLDk1IG1zXSAqLw0KKwlpZihjb250cm9sUGVyaW9kTXMgPCAxKQ0KKwkJY29udHJvbFBlcmlvZE1zID0gMTsNCisJZWxzZSBpZihjb250cm9sUGVyaW9kTXMgPiA5NSkNCisJCWNvbnRyb2xQZXJpb2RNcyA9IDk1Ow0KKwlSZWdpc3RlclJ4KFNUQVRVU18xIHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU18yIHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU18zIHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU180IHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU181IHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU182IHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU183IHwgKFVJTlQ4KWRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclR4KENPTlRST0xfMSB8IChVSU5UOClkZXZpY2VOdW1iZXIsIChVSU5UOCljb250cm9sUGVyaW9kTXMpOw0KKwkvKiBkZWZhdWx0IG91ciBmcmFtZSByYXRlIHRhYmxlIHRvIHdoYXQgZmlybXdhcmUgZGVmYXVsdHMgdG8uICovDQorCV9zdGF0dXNSYXRlTXNbMF0gPSAxMDsJLyogCVRBTE9OX1N0YXR1c18xX0dlbmVyYWxfMTBtc190IAkJKi8NCisJX3N0YXR1c1JhdGVNc1sxXSA9IDIwOwkvKiAJVEFMT05fU3RhdHVzXzJfRmVlZGJhY2tfMjBtc190IAkJKi8NCisJX3N0YXR1c1JhdGVNc1syXSA9IDEwMDsJLyogCVRBTE9OX1N0YXR1c18zX0VuY18xMDBtc190IAkJCSovDQorCV9zdGF0dXNSYXRlTXNbM10gPSAxMDA7CS8qIAlUQUxPTl9TdGF0dXNfNF9BaW5UZW1wVmJhdF8xMDBtc190IAkqLw0KKwkvKiB0aGUgb25seSBkZWZhdWx0IHBhcmFtIHRoYXQgaXMgbm9uemVybyBpcyBsaW1pdCBzd2l0Y2guDQorCSAqIERlZmF1bHQgdG8gdXNpbmcgdGhlIGZsYXNoIHNldHRpbmdzLiAqLw0KKwlTZXRPdmVycmlkZUxpbWl0U3dpdGNoRW4oa0xpbWl0U3dpdGNoT3ZlcnJpZGVfVXNlRGVmYXVsdHNGcm9tRmxhc2gpOw0KK30NCisvKiBDYW5UYWxvblNSWCBEJ3Rvcg0KKyAqLw0KK0NhblRhbG9uU1JYOjp+Q2FuVGFsb25TUlgoKQ0KK3sNCisJaWYoX2Nhbl9oKXsNCisJCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X2Nsb3NlU3RyZWFtU2Vzc2lvbihfY2FuX2gpOw0KKwkJX2Nhbl9oID0gMDsNCisJfQ0KK30NCit2b2lkIENhblRhbG9uU1JYOjpPcGVuU2Vzc2lvbklmTmVlZEJlKCkNCit7DQorCV9jYW5fc3RhdCA9IDA7DQorCWlmIChfY2FuX2ggPT0gMCkgew0KKwkJLyogYml0MzAgLSBiaXQ4IG11c3QgbWF0Y2ggJDAwMDAwMlhYLiAgVG9wIGJpdCBpcyBub3QgbWFza2VkIHRvIGdldCByZW1vdGUgZnJhbWVzICovDQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9vcGVuU3RyZWFtU2Vzc2lvbigmX2Nhbl9oLGtQYXJhbUFyYklkVmFsdWUgfCBHZXREZXZpY2VOdW1iZXIoKSwga1BhcmFtQXJiSWRNYXNrLCBrTXNnQ2FwYWNpdHksICZfY2FuX3N0YXQpOw0KKwkJaWYgKF9jYW5fc3RhdCA9PSAwKSB7DQorCQkJLyogc3VjY2VzcyAqLw0KKwkJfSBlbHNlIHsNCisJCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZywgdHJ5IGFnYWluIGxhdGVyICovDQorCQkJX2Nhbl9oID0gMDsNCisJCX0NCisJfQ0KK30NCit2b2lkIENhblRhbG9uU1JYOjpQcm9jZXNzU3RyZWFtTWVzc2FnZXMoKQ0KK3sNCisJaWYoMCA9PSBfY2FuX2gpDQorCQlPcGVuU2Vzc2lvbklmTmVlZEJlKCk7DQorCS8qIHByb2Nlc3MgcmVjZWl2ZSBtZXNzYWdlcyAqLw0KKwl1aW50MzJfdCBpOw0KKwl1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCA9IHNpemVvZihfbXNnQnVmZikgLyBzaXplb2YoX21zZ0J1ZmZbMF0pOw0KKwl1aW50MzJfdCBtZXNzYWdlc1JlYWQgPSAwOw0KKwkvKiByZWFkIG91dCBsYXRlc3QgYnVuY2ggb2YgbWVzc2FnZXMgKi8NCisJX2Nhbl9zdGF0ID0gMDsNCisJaWYgKF9jYW5faCl7DQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWFkU3RyZWFtU2Vzc2lvbihfY2FuX2gsX21zZ0J1ZmYsIG1lc3NhZ2VzVG9SZWFkLCAmbWVzc2FnZXNSZWFkLCAmX2Nhbl9zdGF0KTsNCisJfQ0KKwkvKiBsb29wIHRocnUgZWFjaCBtZXNzYWdlIG9mIGludGVyZXN0ICovDQorCWZvciAoaSA9IDA7IGkgPCBtZXNzYWdlc1JlYWQ7ICsraSkgew0KKwkJdENBTlN0cmVhbU1lc3NhZ2UgKiBtc2cgPSBfbXNnQnVmZiArIGk7DQorCQlpZihtc2ctPm1lc3NhZ2VJRCA9PSAoUEFSQU1fUkVTUE9OU0UgfCBHZXREZXZpY2VOdW1iZXIoKSkgKXsNCisJCQlUQUxPTl9QYXJhbV9SZXNwb25zZV90ICogcGFyYW1SZXNwID0gKFRBTE9OX1BhcmFtX1Jlc3BvbnNlX3QqKW1zZy0+ZGF0YTsNCisJCQkvKiBkZWNvZGUgdmFsdWUgKi8NCisJCQlpbnQzMl90IHZhbCA9IHBhcmFtUmVzcC0+UGFyYW1WYWx1ZUg7DQorCQkJdmFsIDw8PSA4Ow0KKwkJCXZhbCB8PSAgcGFyYW1SZXNwLT5QYXJhbVZhbHVlTUg7DQorCQkJdmFsIDw8PSA4Ow0KKwkJCXZhbCB8PSAgcGFyYW1SZXNwLT5QYXJhbVZhbHVlTUw7DQorCQkJdmFsIDw8PSA4Ow0KKwkJCXZhbCB8PSAgcGFyYW1SZXNwLT5QYXJhbVZhbHVlTDsNCisJCQkvKiBzYXZlIGxhdGVzdCBzaWduYWwgKi8NCisJCQlfc2lnc1twYXJhbVJlc3AtPlBhcmFtRW51bV0gPSB2YWw7DQorCQl9ZWxzZXsNCisJCQlpbnQgYnJrcHRoZXJlID0gNDI7DQorCQkJKyticmtwdGhlcmU7DQorCQl9DQorCX0NCit9DQordm9pZCBDYW5UYWxvblNSWDo6U2V0KGRvdWJsZSB2YWx1ZSkNCit7DQorCWlmKHZhbHVlID4gMSkNCisJCXZhbHVlID0gMTsNCisJZWxzZSBpZih2YWx1ZSA8IC0xKQ0KKwkJdmFsdWUgPSAtMTsNCisJU2V0RGVtYW5kKDEwMjMqdmFsdWUpOyAvKiBtdXN0IGJlIHdpdGhpbiBbLTEwMjMsMTAyM10gKi8NCit9DQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1zZXR0ZXJzIGFuZCBnZXR0ZXJzIHRoYXQgdXNlIHRoZSBwYXJhbSByZXF1ZXN0L3Jlc3BvbnNlLS0tLS0tLS0tLS0tLSovDQorLyoqDQorICogU2VuZCBhIG9uZSBzaG90IGZyYW1lIHRvIHNldCBhbiBhcmJpdHJhcnkgc2lnbmFsLg0KKyAqIE1vc3Qgc2lnbmFscyBhcmUgaW4gdGhlIGNvbnRyb2wgZnJhbWUgc28gYXZvaWQgdXNpbmcgdGhpcyBBUEkgdW5sZXNzIHlvdSBoYXZlIHRvLg0KKyAqIFVzZSB0aGlzIGFwaSBmb3IuLi4NCisgKiAtQSBtb3RvciBjb250cm9sbGVyIHByb2ZpbGUgc2lnbmFsIGVQcm9maWxlUGFyYW1fWFhYcy4gIFRoZXNlIGFyZSBiYWNrZWQgdXAgaW4gZmxhc2guICBJZiB5b3UgYXJlIGdhaW4tc2NoZWR1bGluZyB0aGVuIGNhbGwgdGhpcyBwZXJpb2RpY2FsbHkuDQorICogLURlZmF1bHQgYnJha2UgYW5kIGxpbWl0IHN3aXRjaCBzaWduYWxzLi4uIGVPbkJvb3RfWFhYcy4gIEF2b2lkIGRvaW5nIHRoaXMsIHVzZSB0aGUgb3ZlcnJpZGUgc2lnbmFscyBpbiB0aGUgY29udHJvbCBmcmFtZS4NCisgKiBUYWxvbiB3aWxsIGF1dG9tYXRpY2FsbHkgc2VuZCBhIFBBUkFNX1JFU1BPTlNFIGFmdGVyIHRoZSBzZXQsIHNvIEdldFBhcmFtUmVzcG9uc2Ugd2lsbCBjYXRjaCB0aGUgbGF0ZXN0IHZhbHVlIGFmdGVyIGEgY291cGxlIG1zLg0KKyAqLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRQYXJhbVJhdyh1bnNpZ25lZCBwYXJhbUVudW0sIGludCByYXdCaXRzKQ0KK3sNCisJLyogY2FsbGVyIGlzIHVzaW5nIHBhcmFtIEFQSS4gIE9wZW4gc2Vzc2lvbiBpZiBpdCBoYXNuJ1QgYmVlbiBkb25lLiAqLw0KKwlpZigwID09IF9jYW5faCkNCisJCU9wZW5TZXNzaW9uSWZOZWVkQmUoKTsNCisJVEFMT05fUGFyYW1fUmVzcG9uc2VfdCBmcmFtZTsNCisJbWVtc2V0KCZmcmFtZSwwLHNpemVvZihmcmFtZSkpOw0KKwlmcmFtZS5QYXJhbUVudW0gPSBwYXJhbUVudW07DQorCWZyYW1lLlBhcmFtVmFsdWVIID0gcmF3Qml0cyA+PiAweDE4Ow0KKwlmcmFtZS5QYXJhbVZhbHVlTUggPSByYXdCaXRzID4+IDB4MTA7DQorCWZyYW1lLlBhcmFtVmFsdWVNTCA9IHJhd0JpdHMgPj4gMHgwODsNCisJZnJhbWUuUGFyYW1WYWx1ZUwgPSByYXdCaXRzOw0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKFBBUkFNX1NFVCB8IEdldERldmljZU51bWJlcigpLCAoY29uc3QgdWludDhfdCopJmZyYW1lLCA1LCAwLCAmc3RhdHVzKTsNCisJaWYoc3RhdHVzKQ0KKwkJcmV0dXJuIENUUl9UeEZhaWxlZDsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCisvKioNCisgKiBDaGVja3MgY2FjaGVkIENBTiBmcmFtZXMgYW5kIHVwZGF0aW5nIHNvbGljaXRlZCBzaWduYWxzLg0KKyAqLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRQYXJhbVJlc3BvbnNlUmF3KHVuc2lnbmVkIHBhcmFtRW51bSwgaW50ICYgcmF3Qml0cykNCit7DQorCUNUUl9Db2RlIHJldHZhbCA9IENUUl9PS0FZOw0KKwkvKiBwcm9jZXNzIHJlY2VpdmVkIHBhcmFtIGV2ZW50cy4gV2UgZG9uJ3QgZXhwZWN0IG1hbnkgc2luY2UgdGhpcyBBUEkgaXMgbm90IHVzZWQgb2Z0ZW4uICovDQorCVByb2Nlc3NTdHJlYW1NZXNzYWdlcygpOw0KKwkvKiBncmFiIHRoZSBzb2xpY2l0ZWQgc2lnbmFsIHZhbHVlICovDQorCXNpZ3NfdDo6aXRlcmF0b3IgaSA9IF9zaWdzLmZpbmQocGFyYW1FbnVtKTsNCisJaWYoaSA9PSBfc2lncy5lbmQoKSl7DQorCQlyZXR2YWwgPSBDVFJfU2lnTm90VXBkYXRlZDsNCisJfWVsc2V7DQorCQlyYXdCaXRzID0gaS0+c2Vjb25kOw0KKwl9DQorCXJldHVybiByZXR2YWw7DQorfQ0KKy8qKg0KKyAqIEFza3MgVEFMT04gdG8gaW1tZWRpZXRlbHkgcmVzcG9uZCB3aXRoIHNpZ25hbCB2YWx1ZS4gIFRoaXMgQVBJIGlzIG9ubHkgdXNlZCBmb3Igc2lnbmFscyB0aGF0IGFyZSBub3Qgc2VudCBwZXJpb2RpY2FsbHkuDQorICogVGhpcyBjYW4gYmUgdXNlZnVsIGZvciByZWFkaW5nIHBhcmFtcyB0aGF0IHJhcmVseSBjaGFuZ2UgbGlrZSBMaW1pdCBTd2l0Y2ggc2V0dGluZ3MgYW5kIFBJREYgdmFsdWVzLg0KKyAgKiBAcGFyYW0gcGFyYW0gdG8gcmVxdWVzdC4NCisgKi8NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6UmVxdWVzdFBhcmFtKHBhcmFtX3QgcGFyYW1FbnVtKQ0KK3sNCisJLyogcHJvY2VzcyByZWNlaXZlZCBwYXJhbSBldmVudHMuIFdlIGRvbid0IGV4cGVjdCBtYW55IHNpbmNlIHRoaXMgQVBJIGlzIG5vdCB1c2VkIG9mdGVuLiAqLw0KKwlQcm9jZXNzU3RyZWFtTWVzc2FnZXMoKTsNCisJVEFMT05fUGFyYW1fUmVxdWVzdF90IGZyYW1lOw0KKwltZW1zZXQoJmZyYW1lLDAsc2l6ZW9mKGZyYW1lKSk7DQorCWZyYW1lLlBhcmFtRW51bSA9IHBhcmFtRW51bTsNCisJaW50MzJfdCBzdGF0dXMgPSAwOw0KKwlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShQQVJBTV9SRVFVRVNUIHwgR2V0RGV2aWNlTnVtYmVyKCksIChjb25zdCB1aW50OF90KikmZnJhbWUsIDEsIDAsICZzdGF0dXMpOw0KKwlpZihzdGF0dXMpDQorCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRQYXJhbShwYXJhbV90IHBhcmFtRW51bSwgZG91YmxlIHZhbHVlKQ0KK3sNCisJaW50MzJfdCByYXdiaXRzID0gMDsNCisJc3dpdGNoKHBhcmFtRW51bSl7DQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MF9QOi8qIHVuc2lnbmVkIDEwLjIyIGZpeGVkIHB0IHZhbHVlICovDQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MF9JOg0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDBfRDoNCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QxX1A6DQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MV9JOg0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDFfRDoNCisJCXsNCisJCQl1aW50MzJfdCB1cmF3Yml0czsNCisJCQl2YWx1ZSA9IHN0ZDo6bWluKHZhbHVlLDEwMjMuMCk7IC8qIGJvdW5kcyBjaGVjayBkb3VibGVzIHRoYXQgYXJlIG91dHNpZGUgdTEwLjIyICovDQorCQkJdmFsdWUgPSBzdGQ6Om1heCh2YWx1ZSwwLjApOw0KKwkJCXVyYXdiaXRzID0gdmFsdWUgKiBGTE9BVF9UT19GWFA7IC8qIHBlcmZvcm0gdW5zaWduIGFyaXRobWV0aWMgKi8NCisJCQlyYXdiaXRzID0gdXJhd2JpdHM7IC8qIGNvcHkgYml0cyBvdmVyLiAgU2V0UGFyYW1SYXcganVzdCBzdHVmZnMgaW50byBDQU4gZnJhbWUgd2l0aCBubyBzZW5zZSBvZiBzaWduZWRuZXNzICovDQorCQl9CWJyZWFrOw0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDFfRjoJLyogc2lnbmVkIDEwLjIyIGZpeGVkIHB0IHZhbHVlICovDQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MF9GOg0KKwkJCXZhbHVlID0gc3RkOjptaW4odmFsdWUsIDUxMi4wKTsgLyogYm91bmRzIGNoZWNrIGRvdWJsZXMgdGhhdCBhcmUgb3V0c2lkZSBzMTAuMjIgKi8NCisJCQl2YWx1ZSA9IHN0ZDo6bWF4KHZhbHVlLC01MTIuMCk7DQorCQkJcmF3Yml0cyA9IHZhbHVlICogRkxPQVRfVE9fRlhQOw0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDogLyogZXZlcnl0aGluZyBlbHNlIGlzIGludGVncmFsICovDQorCQkJcmF3Yml0cyA9IChpbnQzMl90KXZhbHVlOw0KKwkJCWJyZWFrOw0KKwl9DQorCXJldHVybiBTZXRQYXJhbVJhdyhwYXJhbUVudW0scmF3Yml0cyk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRQYXJhbVJlc3BvbnNlKHBhcmFtX3QgcGFyYW1FbnVtLCBkb3VibGUgJiB2YWx1ZSkNCit7DQorCWludDMyX3QgcmF3Yml0cyA9IDA7DQorCUNUUl9Db2RlIHJldHZhbCA9IEdldFBhcmFtUmVzcG9uc2VSYXcocGFyYW1FbnVtLHJhd2JpdHMpOw0KKwlzd2l0Y2gocGFyYW1FbnVtKXsNCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QwX1A6LyogMTAuMjIgZml4ZWQgcHQgdmFsdWUgKi8NCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QwX0k6DQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MF9EOg0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDBfRjoNCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QxX1A6DQorCQljYXNlIGVQcm9maWxlUGFyYW1TbG90MV9JOg0KKwkJY2FzZSBlUHJvZmlsZVBhcmFtU2xvdDFfRDoNCisJCWNhc2UgZVByb2ZpbGVQYXJhbVNsb3QxX0Y6DQorCQljYXNlIGVDdXJyZW50Og0KKwkJY2FzZSBlVGVtcDoNCisJCWNhc2UgZUJhdHRlcnlWOg0KKwkJCXZhbHVlID0gKChkb3VibGUpcmF3Yml0cykgKiBGWFBfVE9fRkxPQVQ7DQorCQkJYnJlYWs7DQorCQlkZWZhdWx0OiAvKiBldmVyeXRoaW5nIGVsc2UgaXMgaW50ZWdyYWwgKi8NCisJCQl2YWx1ZSA9IChkb3VibGUpcmF3Yml0czsNCisJCQlicmVhazsNCisJfQ0KKwlyZXR1cm4gcmV0dmFsOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UGFyYW1SZXNwb25zZUludDMyKHBhcmFtX3QgcGFyYW1FbnVtLCBpbnQgJiB2YWx1ZSkNCit7DQorCWRvdWJsZSBkdmFsdWUgPSAwOw0KKwlDVFJfQ29kZSByZXR2YWwgPSBHZXRQYXJhbVJlc3BvbnNlKHBhcmFtRW51bSwgZHZhbHVlKTsNCisJdmFsdWUgPSAoaW50MzJfdClkdmFsdWU7DQorCXJldHVybiByZXR2YWw7DQorfQ0KKy8qLS0tLS0gZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IHVzZSBwYXJhbSByZXF1ZXN0L3Jlc3BvbnNlLiBUaGVzZSBzaWduYWxzIGFyZSBiYWNrZWQgdXAgaW4gZmxhc2ggYW5kIHdpbGwgc3Vydml2ZSBhIHBvd2VyIGN5Y2xlLiAtLS0tLS0tLS0qLw0KKy8qLS0tLS0gSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMgY29uc2lkZXIgdXNpbmcgYm90aCBzbG90cyBhbmQgc3dpdGNoIGJldHdlZW4gc2xvdDAgPD0+IHNsb3QxLiAtLS0tLS0tLS0tLS0tLS0tLS0qLw0KKy8qLS0tLS0gSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBjaGFuZ2luZyB0aGVzZSBzaWduYWxzIGZyZXF1ZW50bHkgdGhlbiBpdCBtYWtlcyBzZW5zZSB0byBsZXZlcmFnZSB0aGlzIEFQSS4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKy8qLS0tLS0gR2V0dGVycyBkb24ndCBibG9jaywgc28gaXQgbWF5IHJlcXVpcmUgc2V2ZXJhbCBjYWxscyB0byBnZXQgdGhlIGxhdGVzdCB2YWx1ZS4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRQZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKQ0KK3sNCisJaWYoc2xvdElkeCA9PSAwKQ0KKwkJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MF9QLCBnYWluKTsNCisJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MV9QLCBnYWluKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldElnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlIGdhaW4pDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gU2V0UGFyYW0oZVByb2ZpbGVQYXJhbVNsb3QwX0ksIGdhaW4pOw0KKwlyZXR1cm4gU2V0UGFyYW0oZVByb2ZpbGVQYXJhbVNsb3QxX0ksIGdhaW4pOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0RGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgZ2FpbikNCit7DQorCWlmKHNsb3RJZHggPT0gMCkNCisJCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU2xvdDBfRCwgZ2Fpbik7DQorCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU2xvdDFfRCwgZ2Fpbik7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRGZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKQ0KK3sNCisJaWYoc2xvdElkeCA9PSAwKQ0KKwkJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MF9GLCBnYWluKTsNCisJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MV9GLCBnYWluKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldEl6b25lKHVuc2lnbmVkIHNsb3RJZHgsaW50IHpvbmUpDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gU2V0UGFyYW0oZVByb2ZpbGVQYXJhbVNsb3QwX0lab25lLCB6b25lKTsNCisJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MV9JWm9uZSwgem9uZSk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRDbG9zZUxvb3BSYW1wUmF0ZSh1bnNpZ25lZCBzbG90SWR4LGludCBjbG9zZUxvb3BSYW1wUmF0ZSkNCit7DQorCWlmKHNsb3RJZHggPT0gMCkNCisJCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU2xvdDBfQ2xvc2VMb29wUmFtcFJhdGUsIGNsb3NlTG9vcFJhbXBSYXRlKTsNCisJcmV0dXJuIFNldFBhcmFtKGVQcm9maWxlUGFyYW1TbG90MV9DbG9zZUxvb3BSYW1wUmF0ZSwgY2xvc2VMb29wUmFtcFJhdGUpOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgJiBnYWluKQ0KK3sNCisJaWYoc2xvdElkeCA9PSAwKQ0KKwkJcmV0dXJuIEdldFBhcmFtUmVzcG9uc2UoZVByb2ZpbGVQYXJhbVNsb3QwX1AsIGdhaW4pOw0KKwlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZShlUHJvZmlsZVBhcmFtU2xvdDFfUCwgZ2Fpbik7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRJZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZShlUHJvZmlsZVBhcmFtU2xvdDBfSSwgZ2Fpbik7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlKGVQcm9maWxlUGFyYW1TbG90MV9JLCBnYWluKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldERnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlICYgZ2FpbikNCit7DQorCWlmKHNsb3RJZHggPT0gMCkNCisJCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlKGVQcm9maWxlUGFyYW1TbG90MF9ELCBnYWluKTsNCisJcmV0dXJuIEdldFBhcmFtUmVzcG9uc2UoZVByb2ZpbGVQYXJhbVNsb3QxX0QsIGdhaW4pOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgJiBnYWluKQ0KK3sNCisJaWYoc2xvdElkeCA9PSAwKQ0KKwkJcmV0dXJuIEdldFBhcmFtUmVzcG9uc2UoZVByb2ZpbGVQYXJhbVNsb3QwX0YsIGdhaW4pOw0KKwlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZShlUHJvZmlsZVBhcmFtU2xvdDFfRiwgZ2Fpbik7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRJem9uZSh1bnNpZ25lZCBzbG90SWR4LGludCAmIHpvbmUpDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZUludDMyKGVQcm9maWxlUGFyYW1TbG90MF9JWm9uZSwgem9uZSk7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlSW50MzIoZVByb2ZpbGVQYXJhbVNsb3QxX0lab25lLCB6b25lKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldENsb3NlTG9vcFJhbXBSYXRlKHVuc2lnbmVkIHNsb3RJZHgsaW50ICYgY2xvc2VMb29wUmFtcFJhdGUpDQorew0KKwlpZihzbG90SWR4ID09IDApDQorCQlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZUludDMyKGVQcm9maWxlUGFyYW1TbG90MF9DbG9zZUxvb3BSYW1wUmF0ZSwgY2xvc2VMb29wUmFtcFJhdGUpOw0KKwlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZUludDMyKGVQcm9maWxlUGFyYW1TbG90MV9DbG9zZUxvb3BSYW1wUmF0ZSwgY2xvc2VMb29wUmFtcFJhdGUpOw0KK30NCisNCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0U2Vuc29yUG9zaXRpb24oaW50IHBvcykNCit7DQorCXJldHVybiBTZXRQYXJhbShlU2Vuc29yUG9zaXRpb24sIHBvcyk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRGb3J3YXJkU29mdExpbWl0KGludCBmb3J3YXJkTGltaXQpDQorew0KKwlyZXR1cm4gU2V0UGFyYW0oZVByb2ZpbGVQYXJhbVNvZnRMaW1pdEZvclRocmVzaG9sZCwgZm9yd2FyZExpbWl0KTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldFJldmVyc2VTb2Z0TGltaXQoaW50IHJldmVyc2VMaW1pdCkNCit7DQorCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU29mdExpbWl0UmV2VGhyZXNob2xkLCByZXZlcnNlTGltaXQpOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0Rm9yd2FyZFNvZnRFbmFibGUoaW50IGVuYWJsZSkNCit7DQorCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU29mdExpbWl0Rm9yRW5hYmxlLCBlbmFibGUpOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0UmV2ZXJzZVNvZnRFbmFibGUoaW50IGVuYWJsZSkNCit7DQorCXJldHVybiBTZXRQYXJhbShlUHJvZmlsZVBhcmFtU29mdExpbWl0UmV2RW5hYmxlLCBlbmFibGUpOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0Rm9yd2FyZFNvZnRMaW1pdChpbnQgJiBmb3J3YXJkTGltaXQpDQorew0KKwlyZXR1cm4gR2V0UGFyYW1SZXNwb25zZUludDMyKGVQcm9maWxlUGFyYW1Tb2Z0TGltaXRGb3JUaHJlc2hvbGQsIGZvcndhcmRMaW1pdCk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRSZXZlcnNlU29mdExpbWl0KGludCAmIHJldmVyc2VMaW1pdCkNCit7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlSW50MzIoZVByb2ZpbGVQYXJhbVNvZnRMaW1pdFJldlRocmVzaG9sZCwgcmV2ZXJzZUxpbWl0KTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZvcndhcmRTb2Z0RW5hYmxlKGludCAmIGVuYWJsZSkNCit7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlSW50MzIoZVByb2ZpbGVQYXJhbVNvZnRMaW1pdEZvckVuYWJsZSwgZW5hYmxlKTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldFJldmVyc2VTb2Z0RW5hYmxlKGludCAmIGVuYWJsZSkNCit7DQorCXJldHVybiBHZXRQYXJhbVJlc3BvbnNlSW50MzIoZVByb2ZpbGVQYXJhbVNvZnRMaW1pdFJldkVuYWJsZSwgZW5hYmxlKTsNCit9DQorLyoqDQorICogQ2hhbmdlIHRoZSBwZXJpb2RNcyBvZiBhIFRBTE9OJ3Mgc3RhdHVzIGZyYW1lLiAgU2VlIGtTdGF0dXNGcmFtZV8qIGVudW1zIGZvciB3aGF0J3MgYXZhaWxhYmxlLg0KKyAqLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRTdGF0dXNGcmFtZVJhdGUodW5zaWduZWQgZnJhbWVFbnVtLCB1bnNpZ25lZCBwZXJpb2RNcykNCit7DQorCWludDMyX3Qgc3RhdHVzID0gMDsNCisJLyogYm91bmRzIGNoZWNrIHRoZSBwZXJpb2QgKi8NCisJaWYocGVyaW9kTXMgPCAxKQ0KKwkJcGVyaW9kTXMgPSAxOw0KKwllbHNlIGlmIChwZXJpb2RNcyA+IDI1NSkNCisJCXBlcmlvZE1zID0gMjU1Ow0KKyAgdWludDhfdCBwZXJpb2QgPSAodWludDhfdClwZXJpb2RNczsNCisJLyogdHdlYWsganVzdCB0aGUgc3RhdHVzIG1lc3NzYWdlIHJhdGUgdGhlIGNhbGxlciBjYXJlcyBhYm91dCAqLw0KKwlzd2l0Y2goZnJhbWVFbnVtKXsNCisJCWNhc2Uga1N0YXR1c0ZyYW1lX0dlbmVyYWw6DQorCQkJX3N0YXR1c1JhdGVNc1swXSA9IHBlcmlvZDsNCisJCQlicmVhazsNCisJCWNhc2Uga1N0YXR1c0ZyYW1lX0ZlZWRiYWNrOg0KKwkJCV9zdGF0dXNSYXRlTXNbMV0gPSBwZXJpb2Q7DQorCQkJYnJlYWs7DQorCQljYXNlIGtTdGF0dXNGcmFtZV9FbmNvZGVyOg0KKwkJCV9zdGF0dXNSYXRlTXNbMl0gPSBwZXJpb2Q7DQorCQkJYnJlYWs7DQorCQljYXNlIGtTdGF0dXNGcmFtZV9BbmFsb2dUZW1wVmJhdDoNCisJCQlfc3RhdHVzUmF0ZU1zWzNdID0gcGVyaW9kOw0KKwkJCWJyZWFrOw0KKwl9DQorCS8qIGJ1aWxkIG91ciByZXF1ZXN0IGZyYW1lICovDQorCVRBTE9OX0NvbnRyb2xfMl9SYXRlc19PbmVTaG90X3QgZnJhbWU7DQorCW1lbXNldCgmZnJhbWUsMCxzaXplb2YoZnJhbWUpKTsNCisJZnJhbWUuU3RhdHVzMU1zID0gX3N0YXR1c1JhdGVNc1swXTsNCisJZnJhbWUuU3RhdHVzMk1zID0gX3N0YXR1c1JhdGVNc1sxXTsNCisJZnJhbWUuU3RhdHVzM01zID0gX3N0YXR1c1JhdGVNc1syXTsNCisJZnJhbWUuU3RhdHVzNE1zID0gX3N0YXR1c1JhdGVNc1szXTsNCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8yIHwgR2V0RGV2aWNlTnVtYmVyKCksIChjb25zdCB1aW50OF90KikmZnJhbWUsIHNpemVvZihmcmFtZSksIDAsICZzdGF0dXMpOw0KKwlpZihzdGF0dXMpDQorCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8qKg0KKyAqIENsZWFyIGFsbCBzdGlja3kgZmF1bHRzIGluIFRBTE9OLg0KKyAqLw0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpDbGVhclN0aWNreUZhdWx0cygpDQorew0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCS8qIGJ1aWxkIHJlcXVlc3QgZnJhbWUgKi8NCisJVEFMT05fQ29udHJvbF8zX0NsZWFyRmxhZ3NfT25lU2hvdF90IGZyYW1lOw0KKwltZW1zZXQoJmZyYW1lLDAsc2l6ZW9mKGZyYW1lKSk7DQorCWZyYW1lLkNsZWFyU3RpY2t5RmF1bHRzID0gMTsNCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8zIHwgR2V0RGV2aWNlTnVtYmVyKCksIChjb25zdCB1aW50OF90KikmZnJhbWUsIHNpemVvZihmcmFtZSksIDAsICZzdGF0dXMpOw0KKwlpZihzdGF0dXMpDQorCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGF1dG8gZ2VuZXJhdGVkLiAgVGhpcyBBUEkgaXMgb3B0aW1hbCBzaW5jZSBpdCB1c2VzIHRoZSBmaXJlLWFuZC1mb3JnZXQgQ0FOIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGVzZSBzaWduYWxzIHNob3VsZCBjb3ZlciB0aGUgbWFqb3JpdHkgb2YgYWxsIHVzZSBjYXNlcy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZhdWx0X092ZXJUZW1wKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMSgpOw0KKwlwYXJhbSA9IHJ4LT5GYXVsdF9PdmVyVGVtcDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZhdWx0X1VuZGVyVm9sdGFnZShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+RmF1bHRfVW5kZXJWb2x0YWdlOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmF1bHRfRm9yTGltKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMSgpOw0KKwlwYXJhbSA9IHJ4LT5GYXVsdF9Gb3JMaW07DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRGYXVsdF9SZXZMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCXBhcmFtID0gcngtPkZhdWx0X1JldkxpbTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZhdWx0X0hhcmR3YXJlRmFpbHVyZShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+RmF1bHRfSGFyZHdhcmVGYWlsdXJlOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmF1bHRfRm9yU29mdExpbShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+RmF1bHRfRm9yU29mdExpbTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEZhdWx0X1JldlNvZnRMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCXBhcmFtID0gcngtPkZhdWx0X1JldlNvZnRMaW07DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRTdGNreUZhdWx0X092ZXJUZW1wKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMigpOw0KKwlwYXJhbSA9IHJ4LT5TdGNreUZhdWx0X092ZXJUZW1wOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0U3Rja3lGYXVsdF9VbmRlclZvbHRhZ2UoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPlN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0U3Rja3lGYXVsdF9Gb3JMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPlN0Y2t5RmF1bHRfRm9yTGltOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0U3Rja3lGYXVsdF9SZXZMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPlN0Y2t5RmF1bHRfUmV2TGltOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0U3Rja3lGYXVsdF9Gb3JTb2Z0TGltKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMigpOw0KKwlwYXJhbSA9IHJ4LT5TdGNreUZhdWx0X0ZvclNvZnRMaW07DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRTdGNreUZhdWx0X1JldlNvZnRMaW0oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPlN0Y2t5RmF1bHRfUmV2U29mdExpbTsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEFwcGxpZWRUaHJvdHRsZShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJaW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPkFwcGxpZWRUaHJvdHRsZV9oMzsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPkFwcGxpZWRUaHJvdHRsZV9sODsNCisJcmF3IDw8PSAoMzItMTEpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlyYXcgPj49ICgzMi0xMSk7IC8qIHNpZ24gZXh0ZW5kICovDQorCXBhcmFtID0gKGludClyYXc7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRDbG9zZUxvb3BFcnIoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5DbG9zZUxvb3BFcnJIOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+Q2xvc2VMb29wRXJyTTsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPkNsb3NlTG9vcEVyckw7DQorCXJhdyA8PD0gKDMyLTI0KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcmF3ID4+PSAoMzItMjQpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCXBhcmFtID0gcngtPkZlZWRiYWNrRGV2aWNlU2VsZWN0Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0TW9kZVNlbGVjdChpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJdWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5Nb2RlU2VsZWN0X2gxOw0KKwlyYXcgPDw9IDM7DQorCXJhdyB8PSByeC0+TW9kZVNlbGVjdF9iMzsNCisJcGFyYW0gPSAoaW50KXJhdzsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldExpbWl0U3dpdGNoRW4oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMxKCk7DQorCXBhcmFtID0gcngtPkxpbWl0U3dpdGNoRW47DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRMaW1pdFN3aXRjaENsb3NlZEZvcihpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+TGltaXRTd2l0Y2hDbG9zZWRGb3I7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRMaW1pdFN3aXRjaENsb3NlZFJldihpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzEoKTsNCisJcGFyYW0gPSByeC0+TGltaXRTd2l0Y2hDbG9zZWRSZXY7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRTZW5zb3JQb3NpdGlvbihpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzIoKTsNCisJaW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPlNlbnNvclBvc2l0aW9uSDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlNlbnNvclBvc2l0aW9uTTsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlNlbnNvclBvc2l0aW9uTDsNCisJcmF3IDw8PSAoMzItMjQpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlyYXcgPj49ICgzMi0yNCk7IC8qIHNpZ24gZXh0ZW5kICovDQorCXBhcmFtID0gKGludClyYXc7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRTZW5zb3JWZWxvY2l0eShpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzIoKTsNCisJaW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPlNlbnNvclZlbG9jaXR5SDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlNlbnNvclZlbG9jaXR5TDsNCisJcmF3IDw8PSAoMzItMTYpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlyYXcgPj49ICgzMi0xNik7IC8qIHNpZ24gZXh0ZW5kICovDQorCXBhcmFtID0gKGludClyYXc7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpHZXRDdXJyZW50KGRvdWJsZSAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMigpOw0KKwl1aW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPkN1cnJlbnRfaDg7DQorCXJhdyA8PD0gMjsNCisJcmF3IHw9IHJ4LT5DdXJyZW50X2wyOw0KKwlwYXJhbSA9IChkb3VibGUpcmF3ICogMC4xMjUgKyAwOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0QnJha2VJc0VuYWJsZWQoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMyKCk7DQorCXBhcmFtID0gcngtPkJyYWtlSXNFbmFibGVkOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RW5jUG9zaXRpb24oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMzKCk7DQorCWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5FbmNQb3NpdGlvbkg7DQorCXJhdyA8PD0gODsNCisJcmF3IHw9IHJ4LT5FbmNQb3NpdGlvbk07DQorCXJhdyA8PD0gODsNCisJcmF3IHw9IHJ4LT5FbmNQb3NpdGlvbkw7DQorCXJhdyA8PD0gKDMyLTI0KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcmF3ID4+PSAoMzItMjQpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RW5jVmVsKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMygpOw0KKwlpbnQzMl90IHJhdyA9IDA7DQorCXJhdyB8PSByeC0+RW5jVmVsSDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPkVuY1ZlbEw7DQorCXJhdyA8PD0gKDMyLTE2KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcmF3ID4+PSAoMzItMTYpOyAvKiBzaWduIGV4dGVuZCAqLw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RW5jSW5kZXhSaXNlRXZlbnRzKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTMygpOw0KKwl1aW50MzJfdCByYXcgPSAwOw0KKwlyYXcgfD0gcngtPkVuY0luZGV4UmlzZUV2ZW50c0g7DQorCXJhdyA8PD0gODsNCisJcmF3IHw9IHJ4LT5FbmNJbmRleFJpc2VFdmVudHNMOw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UXVhZEFwaW4oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMzKCk7DQorCXBhcmFtID0gcngtPlF1YWRBcGluOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UXVhZEJwaW4oaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVMzKCk7DQorCXBhcmFtID0gcngtPlF1YWRCcGluOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UXVhZElkeHBpbihpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzMoKTsNCisJcGFyYW0gPSByeC0+UXVhZElkeHBpbjsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEFuYWxvZ0luV2l0aE92KGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTNCgpOw0KKwlpbnQzMl90IHJhdyA9IDA7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5XaXRoT3ZIOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5XaXRoT3ZNOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5XaXRoT3ZMOw0KKwlyYXcgPDw9ICgzMi0yNCk7IC8qIHNpZ24gZXh0ZW5kICovDQorCXJhdyA+Pj0gKDMyLTI0KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcGFyYW0gPSAoaW50KXJhdzsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldEFuYWxvZ0luVmVsKGludCAmcGFyYW0pDQorew0KKwlHRVRfU1RBVFVTNCgpOw0KKwlpbnQzMl90IHJhdyA9IDA7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5WZWxIOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+QW5hbG9nSW5WZWxMOw0KKwlyYXcgPDw9ICgzMi0xNik7IC8qIHNpZ24gZXh0ZW5kICovDQorCXJhdyA+Pj0gKDMyLTE2KTsgLyogc2lnbiBleHRlbmQgKi8NCisJcGFyYW0gPSAoaW50KXJhdzsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OkdldFRlbXAoZG91YmxlICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVM0KCk7DQorCXVpbnQzMl90IHJhdyA9IHJ4LT5UZW1wOw0KKwlwYXJhbSA9IChkb3VibGUpcmF3ICogMC42NDUxNjEyOTAzICsgLTUwOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0QmF0dGVyeVYoZG91YmxlICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVM0KCk7DQorCXVpbnQzMl90IHJhdyA9IHJ4LT5CYXR0ZXJ5VjsNCisJcGFyYW0gPSAoZG91YmxlKXJhdyAqIDAuMDUgKyA0Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UmVzZXRDb3VudChpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzUoKTsNCisJdWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5SZXNldENvdW50SDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlJlc2V0Q291bnRMOw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0UmVzZXRGbGFncyhpbnQgJnBhcmFtKQ0KK3sNCisJR0VUX1NUQVRVUzUoKTsNCisJdWludDMyX3QgcmF3ID0gMDsNCisJcmF3IHw9IHJ4LT5SZXNldEZsYWdzSDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gcngtPlJlc2V0RmxhZ3NMOw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6R2V0RmlybVZlcnMoaW50ICZwYXJhbSkNCit7DQorCUdFVF9TVEFUVVM1KCk7DQorCXVpbnQzMl90IHJhdyA9IDA7DQorCXJhdyB8PSByeC0+RmlybVZlcnNIOw0KKwlyYXcgPDw9IDg7DQorCXJhdyB8PSByeC0+RmlybVZlcnNMOw0KKwlwYXJhbSA9IChpbnQpcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0RGVtYW5kKGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPkRlbWFuZEggPSBwYXJhbT4+MTY7DQorCXRvRmlsbC0+RGVtYW5kTSA9IHBhcmFtPj44Ow0KKwl0b0ZpbGwtPkRlbWFuZEwgPSBwYXJhbT4+MDsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRPdmVycmlkZUxpbWl0U3dpdGNoRW4oaW50IHBhcmFtKQ0KK3sNCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+IHRvRmlsbCA9IEdldFR4PFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KKwlpZiAodG9GaWxsLklzRW1wdHkoKSkgcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCXRvRmlsbC0+T3ZlcnJpZGVMaW1pdFN3aXRjaEVuID0gcGFyYW07DQorCUZsdXNoVHgodG9GaWxsKTsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QoaW50IHBhcmFtKQ0KK3sNCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+IHRvRmlsbCA9IEdldFR4PFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KKwlpZiAodG9GaWxsLklzRW1wdHkoKSkgcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCXRvRmlsbC0+RmVlZGJhY2tEZXZpY2VTZWxlY3QgPSBwYXJhbTsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KK0NUUl9Db2RlIENhblRhbG9uU1JYOjpTZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbihpbnQgcGFyYW0pDQorew0KKwlDdHJlQ2FuTm9kZTo6dHhUYXNrPFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4gdG9GaWxsID0gR2V0VHg8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCWlmICh0b0ZpbGwuSXNFbXB0eSgpKSByZXR1cm4gQ1RSX1VuZXhwZWN0ZWRBcmJJZDsNCisJdG9GaWxsLT5SZXZNb3REdXJpbmdDbG9zZUxvb3BFbiA9IHBhcmFtOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldE92ZXJyaWRlQnJha2VUeXBlKGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPk92ZXJyaWRlQnJha2VUeXBlID0gcGFyYW07DQorCUZsdXNoVHgodG9GaWxsKTsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0TW9kZVNlbGVjdChpbnQgcGFyYW0pDQorew0KKwlDdHJlQ2FuTm9kZTo6dHhUYXNrPFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4gdG9GaWxsID0gR2V0VHg8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCWlmICh0b0ZpbGwuSXNFbXB0eSgpKSByZXR1cm4gQ1RSX1VuZXhwZWN0ZWRBcmJJZDsNCisJdG9GaWxsLT5Nb2RlU2VsZWN0ID0gcGFyYW07DQorCUZsdXNoVHgodG9GaWxsKTsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCisvKioNCisgKiBAcGFyYW0gbW9kZVNlbGVjdCBzZWxlY3RzIHdoaWNoIG1vZGUuDQorICogQHBhcmFtIGRlbWFuZCBzZXRwdCBvciB0aHJvdHRsZSBvciBtYXN0ZXJJZCB0byBmb2xsb3cuDQorICogQHJldHVybiBlcnJvciBjb2RlLCAwIGlmZiBzdWNjZXNzZnVsLg0KKyAqIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgYXRvbWljYWxseSBzZXR0aW5nIG1vZGUgYW5kIGRlbWFuZC4NCisgKi8NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0TW9kZVNlbGVjdChpbnQgbW9kZVNlbGVjdCxpbnQgZGVtYW5kKQ0KK3sNCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+IHRvRmlsbCA9IEdldFR4PFRBTE9OX0NvbnRyb2xfMV9HZW5lcmFsXzEwbXNfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KKwlpZiAodG9GaWxsLklzRW1wdHkoKSkgcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCXRvRmlsbC0+TW9kZVNlbGVjdCA9IG1vZGVTZWxlY3Q7DQorCXRvRmlsbC0+RGVtYW5kSCA9IGRlbWFuZD4+MTY7DQorCXRvRmlsbC0+RGVtYW5kTSA9IGRlbWFuZD4+ODsNCisJdG9GaWxsLT5EZW1hbmRMID0gZGVtYW5kPj4wOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldFByb2ZpbGVTbG90U2VsZWN0KGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPlByb2ZpbGVTbG90U2VsZWN0ID0gcGFyYW07DQorCUZsdXNoVHgodG9GaWxsKTsNCisJcmV0dXJuIENUUl9PS0FZOw0KK30NCitDVFJfQ29kZSBDYW5UYWxvblNSWDo6U2V0UmFtcFRocm90dGxlKGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPlJhbXBUaHJvdHRsZSA9IHBhcmFtOw0KKwlGbHVzaFR4KHRvRmlsbCk7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorQ1RSX0NvZGUgQ2FuVGFsb25TUlg6OlNldFJldkZlZWRiYWNrU2Vuc29yKGludCBwYXJhbSkNCit7DQorCUN0cmVDYW5Ob2RlOjp0eFRhc2s8VEFMT05fQ29udHJvbF8xX0dlbmVyYWxfMTBtc190PiB0b0ZpbGwgPSBHZXRUeDxUQUxPTl9Db250cm9sXzFfR2VuZXJhbF8xMG1zX3Q+KENPTlRST0xfMSB8IEdldERldmljZU51bWJlcigpKTsNCisJaWYgKHRvRmlsbC5Jc0VtcHR5KCkpIHJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPlJldkZlZWRiYWNrU2Vuc29yID0gcGFyYW0gPyAxIDogMDsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tIEMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCitleHRlcm4gIkMiIHsNCit2b2lkICpjX1RhbG9uU1JYX0NyZWF0ZShpbnQgZGV2aWNlTnVtYmVyLCBpbnQgY29udHJvbFBlcmlvZE1zKQ0KK3sNCisJcmV0dXJuIG5ldyBDYW5UYWxvblNSWChkZXZpY2VOdW1iZXIsIGNvbnRyb2xQZXJpb2RNcyk7DQorfQ0KK3ZvaWQgY19UYWxvblNSWF9EZXN0cm95KHZvaWQgKmhhbmRsZSkNCit7DQorCWRlbGV0ZSAoQ2FuVGFsb25TUlgqKWhhbmRsZTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRQYXJhbSh2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGRvdWJsZSB2YWx1ZSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRQYXJhbSgoQ2FuVGFsb25TUlg6OnBhcmFtX3QpcGFyYW1FbnVtLCB2YWx1ZSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfUmVxdWVzdFBhcmFtKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5SZXF1ZXN0UGFyYW0oKENhblRhbG9uU1JYOjpwYXJhbV90KXBhcmFtRW51bSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0UGFyYW1SZXNwb25zZSh2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGRvdWJsZSAqdmFsdWUpDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0UGFyYW1SZXNwb25zZSgoQ2FuVGFsb25TUlg6OnBhcmFtX3QpcGFyYW1FbnVtLCAqdmFsdWUpOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFBhcmFtUmVzcG9uc2VJbnQzMih2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0sIGludCAqdmFsdWUpDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0UGFyYW1SZXNwb25zZUludDMyKChDYW5UYWxvblNSWDo6cGFyYW1fdClwYXJhbUVudW0sICp2YWx1ZSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0U3RhdHVzRnJhbWVSYXRlKHZvaWQgKmhhbmRsZSwgdW5zaWduZWQgZnJhbWVFbnVtLCB1bnNpZ25lZCBwZXJpb2RNcykNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRTdGF0dXNGcmFtZVJhdGUoZnJhbWVFbnVtLCBwZXJpb2RNcyk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfQ2xlYXJTdGlja3lGYXVsdHModm9pZCAqaGFuZGxlKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkNsZWFyU3RpY2t5RmF1bHRzKCk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfT3ZlclRlbXAodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEZhdWx0X092ZXJUZW1wKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfVW5kZXJWb2x0YWdlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRGYXVsdF9VbmRlclZvbHRhZ2UoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9Gb3JMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEZhdWx0X0ZvckxpbSgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X1JldkxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0RmF1bHRfUmV2TGltKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfSGFyZHdhcmVGYWlsdXJlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRGYXVsdF9IYXJkd2FyZUZhaWx1cmUoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9Gb3JTb2Z0TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRGYXVsdF9Gb3JTb2Z0TGltKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfUmV2U29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0RmF1bHRfUmV2U29mdExpbSgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfT3ZlclRlbXAodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFN0Y2t5RmF1bHRfT3ZlclRlbXAoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X1VuZGVyVm9sdGFnZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0U3Rja3lGYXVsdF9VbmRlclZvbHRhZ2UoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X0ZvckxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0U3Rja3lGYXVsdF9Gb3JMaW0oKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X1JldkxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0U3Rja3lGYXVsdF9SZXZMaW0oKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X0ZvclNvZnRMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFN0Y2t5RmF1bHRfRm9yU29mdExpbSgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfUmV2U29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0U3Rja3lGYXVsdF9SZXZTb2Z0TGltKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0QXBwbGllZFRocm90dGxlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRBcHBsaWVkVGhyb3R0bGUoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRDbG9zZUxvb3BFcnIodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldENsb3NlTG9vcEVycigqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZlZWRiYWNrRGV2aWNlU2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRGZWVkYmFja0RldmljZVNlbGVjdCgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldE1vZGVTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldE1vZGVTZWxlY3QoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRMaW1pdFN3aXRjaEVuKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRMaW1pdFN3aXRjaEVuKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0TGltaXRTd2l0Y2hDbG9zZWRGb3Iodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldExpbWl0U3dpdGNoQ2xvc2VkRm9yKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0TGltaXRTd2l0Y2hDbG9zZWRSZXYodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldExpbWl0U3dpdGNoQ2xvc2VkUmV2KCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0U2Vuc29yUG9zaXRpb24odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFNlbnNvclBvc2l0aW9uKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0U2Vuc29yVmVsb2NpdHkodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFNlbnNvclZlbG9jaXR5KCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0Q3VycmVudCh2b2lkICpoYW5kbGUsIGRvdWJsZSAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0Q3VycmVudCgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEJyYWtlSXNFbmFibGVkKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRCcmFrZUlzRW5hYmxlZCgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEVuY1Bvc2l0aW9uKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRFbmNQb3NpdGlvbigqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEVuY1ZlbCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0RW5jVmVsKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RW5jSW5kZXhSaXNlRXZlbnRzKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRFbmNJbmRleFJpc2VFdmVudHMoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkQXBpbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0UXVhZEFwaW4oKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkQnBpbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0UXVhZEJwaW4oKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkSWR4cGluKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRRdWFkSWR4cGluKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0QW5hbG9nSW5XaXRoT3Yodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEFuYWxvZ0luV2l0aE92KCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0QW5hbG9nSW5WZWwodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEFuYWxvZ0luVmVsKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0VGVtcCh2b2lkICpoYW5kbGUsIGRvdWJsZSAqcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+R2V0VGVtcCgqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEJhdHRlcnlWKHZvaWQgKmhhbmRsZSwgZG91YmxlICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRCYXR0ZXJ5VigqcGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFJlc2V0Q291bnQodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldFJlc2V0Q291bnQoKnBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRSZXNldEZsYWdzKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5HZXRSZXNldEZsYWdzKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmlybVZlcnModm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPkdldEZpcm1WZXJzKCpwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0RGVtYW5kKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldERlbWFuZChwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldE92ZXJyaWRlTGltaXRTd2l0Y2hFbihwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0RmVlZGJhY2tEZXZpY2VTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+U2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QocGFyYW0pOw0KK30NCitDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFJldk1vdER1cmluZ0Nsb3NlTG9vcEVuKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldFJldk1vdER1cmluZ0Nsb3NlTG9vcEVuKHBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRPdmVycmlkZUJyYWtlVHlwZSh2b2lkICpoYW5kbGUsIGludCBwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRPdmVycmlkZUJyYWtlVHlwZShwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0TW9kZVNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRNb2RlU2VsZWN0KHBhcmFtKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRNb2RlU2VsZWN0Mih2b2lkICpoYW5kbGUsIGludCBtb2RlU2VsZWN0LCBpbnQgZGVtYW5kKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldE1vZGVTZWxlY3QobW9kZVNlbGVjdCwgZGVtYW5kKTsNCit9DQorQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRQcm9maWxlU2xvdFNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSkNCit7DQorCXJldHVybiAoKENhblRhbG9uU1JYKiloYW5kbGUpLT5TZXRQcm9maWxlU2xvdFNlbGVjdChwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmFtcFRocm90dGxlKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKQ0KK3sNCisJcmV0dXJuICgoQ2FuVGFsb25TUlgqKWhhbmRsZSktPlNldFJhbXBUaHJvdHRsZShwYXJhbSk7DQorfQ0KK0NUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmV2RmVlZGJhY2tTZW5zb3Iodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pDQorew0KKwlyZXR1cm4gKChDYW5UYWxvblNSWCopaGFuZGxlKS0+U2V0UmV2RmVlZGJhY2tTZW5zb3IocGFyYW0pOw0KK30NCit9DQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9DYW5UYWxvblNSWC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9DYW5UYWxvblNSWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMjIzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL0NhblRhbG9uU1JYLmgKQEAgLTAsMCArMSwzNzUgQEAKKy8qKg0KKyAqIEBicmllZiBDQU4gVEFMT04gU1JYIGRyaXZlci4NCisgKg0KKyAqIFRoZSBUQUxPTiBTUlggaXMgZGVzaWduZWQgdG8gaW5zdHJ1bWVudCBhbGwgcnVudGltZSBzaWduYWxzIHBlcmlvZGljYWxseS4gIFRoZSBkZWZhdWx0IHBlcmlvZHMgYXJlIGNob3NlbiB0byBzdXBwb3J0IDE2IFRBTE9Ocw0KKyAqIHdpdGggMTBtcyB1cGRhdGUgcmF0ZSBmb3IgY29udHJvbCAodGhyb3R0bGUgb3Igc2V0cG9pbnQpLiAgSG93ZXZlciB0aGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIFNldFN0YXR1c0ZyYW1lUmF0ZS4gQHNlZSBTZXRTdGF0dXNGcmFtZVJhdGUNCisgKiBUaGUgZ2V0dGVycyBmb3IgdGhlc2UgdW5zb2xpY2l0ZWQgc2lnbmFscyBhcmUgYXV0byBnZW5lcmF0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG1vZHVsZS4NCisgKg0KKyAqIExpa2V3aXNlIG1vc3QgY29udHJvbCBzaWduYWxzIGFyZSBzZW50IHBlcmlvZGljYWxseSB1c2luZyB0aGUgZmlyZS1hbmQtZm9yZ2V0IENBTiBBUEkuDQorICogVGhlIHNldHRlcnMgZm9yIHRoZXNlIHVuc29saWNpdGVkIHNpZ25hbHMgYXJlIGF1dG8gZ2VuZXJhdGVkIGF0IHRoZSBib3R0b20gb2YgdGhpcyBtb2R1bGUuDQorICoNCisgKiBTaWduYWxzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgaW4gYW4gdW5zb2xpY2l0ZWQgZmFzaGlvbiBhcmUgdGhlIENsb3NlIExvb3AgZ2FpbnMuDQorICogRm9yIHRlYW1zIHRoYXQgaGF2ZSBhIHNpbmdsZSBwcm9maWxlIGZvciB0aGVpciBUQUxPTiBjbG9zZSBsb29wIHRoZXkgY2FuIHVzZSBlaXRoZXIgdGhlIHdlYnBhZ2UgdG8gY29uZmlndXJlIHRoZWlyIFRBTE9OcyBvbmNlDQorICogCW9yIHNldCB0aGUgUElERixJem9uZSxDbG9zZUxvb3BSYW1wUmF0ZSxldGMuLi4gb25jZSBpbiB0aGUgcm9ib3QgYXBwbGljYXRpb24uICBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBzYXZlZCB0byBmbGFzaCBzbyBvbmNlIHRoZXkgYXJlDQorICogCWxvYWRlZCBpbiB0aGUgVEFMT04sIHRoZXkgd2lsbCBwZXJzaXN0IHRocm91Z2ggcG93ZXIgY3ljbGVzIGFuZCBtb2RlIGNoYW5nZXMuDQorICoNCisgKiBGb3IgdGVhbXMgdGhhdCBoYXZlIG9uZSBvciB0d28gcHJvZmlsZXMgdG8gc3dpdGNoIGJldHdlZW4sIHRoZXkgY2FuIHVzZSB0aGUgc2FtZSBzdHJhdGVneSBzaW5jZSB0aGVyZSBhcmUgdHdvIHNsb3RzIHRvIGNob29zZSBmcm9tDQorICogYW5kIHRoZSBQcm9maWxlU2xvdFNlbGVjdCBpcyBwZXJpb2RpY2FsbHkgc2VudCBpbiB0aGUgMTAgbXMgY29udHJvbCBmcmFtZS4NCisgKg0KKyAqIEZvciB0ZWFtcyB0aGF0IHJlcXVpcmUgY2hhbmdpbmcgZ2FpbnMgZnJlcXVlbnRseSwgdGhleSBjYW4gdXNlIHRoZSBzb2xpY2l0aW5nIEFQSSB0byBnZXQgYW5kIHNldCB0aG9zZSBwYXJhbWV0ZXJzLiAgTW9zdCBsaWtlbHkNCisgKiB0aGV5IHdpbGwgb25seSBuZWVkIHRvIHNldCB0aGVtIGluIGEgcGVyaW9kaWMgZmFzaGlvbiBhcyBhIGZ1bmN0aW9uIG9mIHdoYXQgbW90aW9uIHRoZSBhcHBsaWNhdGlvbiBpcyBhdHRlbXB0aW5nLg0KKyAqIElmIHRoaXMgQVBJIGlzIHVzZWQsIGJlIG1pbmRmdWwgb2YgdGhlIENBTiB1dGlsaXphdGlvbiByZXBvcnRlZCBpbiB0aGUgZHJpdmVyIHN0YXRpb24uDQorICoNCisgKiBFbmNvZGVyIHBvc2l0aW9uIGlzIG1lYXN1cmVkIGluIGVuY29kZXIgZWRnZXMuICBFdmVyeSBlZGdlIGlzIGNvdW50ZWQgKHNpbWlsYXIgdG8gcm9ib1JJTyA0WCBtb2RlKS4NCisgKiBBbmFsb2cgcG9zaXRpb24gaXMgMTAgYml0cywgbWVhbmluZyAxMDI0IHRpY2tzIHBlciByb3RhdGlvbiAoMFYgPT4gMy4zVikuDQorICogVXNlIFNldEZlZWRiYWNrRGV2aWNlU2VsZWN0IHRvIHNlbGVjdCB3aGljaCBzZW5zb3IgdHlwZSB5b3UgbmVlZC4gIE9uY2UgeW91IGRvIHRoYXQgeW91IGNhbiB1c2UgR2V0U2Vuc29yUG9zaXRpb24oKQ0KKyAqIGFuZCBHZXRTZW5zb3JWZWxvY2l0eSgpLiAgVGhlc2Ugc2lnbmFscyBhcmUgdXBkYXRlZCBvbiBDQU5CdXMgZXZlcnkgMjBtcyAoYnkgZGVmYXVsdCkuDQorICogSWYgYSByZWxhdGl2ZSBzZW5zb3IgaXMgc2VsZWN0ZWQsIHlvdSBjYW4gemVybyAob3IgY2hhbmdlIHRoZSBjdXJyZW50IHZhbHVlKSB1c2luZyBTZXRTZW5zb3JQb3NpdGlvbi4NCisgKg0KKyAqIEFuYWxvZyBJbnB1dCBhbmQgcXVhZHJhdHVyZSBwb3NpdGlvbiAoYW5kIHZlbG9jaXR5KSBhcmUgYWxzbyBleHBsaWNpdGx5IHJlcG9ydGVkIGluIEdldEVuY1Bvc2l0aW9uLCBHZXRFbmNWZWwsIEdldEFuYWxvZ0luV2l0aE92LCBHZXRBbmFsb2dJblZlbC4NCisgKiBUaGVzZSBzaWduYWxzIGFyZSBhdmFpbGFibGUgYWxsIHRoZSB0aW1lLCByZWdhcmRsZXNzIG9mIHdoYXQgc2Vuc29yIGlzIHNlbGVjdGVkIGF0IGEgcmF0ZSBvZiAxMDBtcy4gIFRoaXMgYWxsb3dzIGVhc3kgaW5zdHJ1bWVudGF0aW9uDQorICogZm9yICJpbiB0aGUgcGl0cyIgY2hlY2tpbmcgb2YgYWxsIHNlbnNvcnMgcmVnYXJkbGVzcyBvZiBtb2Rlc2VsZWN0LiAgVGhlIDEwMG1zIHJhdGUgaXMgb3ZlcnJpZGFibGUgZm9yIHRlYW1zIHdobyB3YW50IHRvIGFjcXVpcmUgc2Vuc29yDQorICogZGF0YSBmb3IgcHJvY2Vzc2luZywgbm90IGp1c3QgaW5zdHJ1bWVudGF0aW9uLiAgT3IganVzdCBzZWxlY3QgdGhlIHNlbnNvciB1c2luZyBTZXRGZWVkYmFja0RldmljZVNlbGVjdCB0byBnZXQgaXQgYXQgMjBtcy4NCisgKg0KKyAqIFZlbG9jaXR5IGlzIGluIHBvc2l0aW9uIHRpY2tzIC8gMTAwbXMuDQorICoNCisgKiBBbGwgb3V0cHV0IHVuaXRzIGFyZSBpbiByZXNwZWN0IHRvIGR1dHkgY3ljbGUgKHRocm90dGxlKSB3aGljaCBpcyAtMTAyMyhmdWxsIHJldmVyc2UpIHRvICsxMDIzIChmdWxsIGZvcndhcmQpLg0KKyAqICBUaGlzIGluY2x1ZGVzIGRlbWFuZCAod2hpY2ggc3BlY2lmaWVzIGR1dHkgY3ljbGUgd2hlbiBpbiBkdXR5IGN5Y2xlIG1vZGUpIGFuZCByYW1wUmFtcCwgd2hpY2ggaXMgaW4gdGhyb3R0bGUgdW5pdHMgcGVyIDEwbXMgKGlmIG5vbnplcm8pLg0KKyAqDQorICogUG9zIGFuZCB2ZWxvY2l0eSBjbG9zZSBsb29wcyBhcmUgY2FsYydkIGFzDQorICogCQllcnIgPSB0YXJnZXQgLSBwb3NPclZlbC4NCisgKiAJCWlFcnIgKz0gZXJyOw0KKyAqIAkJaWYoICAgKElab25lIT0wKSAgYW5kICBhYnMoZXJyKSA+IElab25lKQ0KKyAqIAkJCUNsZWFySWFjY3VtKCkNCisgKiAJCW91dHB1dCA9IFAgWCBlcnIgKyBJIFggaUVyciArIEQgWCBkRXJyICsgRiBYIHRhcmdldA0KKyAqIAkJZEVyciA9IGVyciAtIGxhc3RFcnINCisgKglQLCBJLGFuZCBEIGdhaW5zIGFyZSBhbHdheXMgcG9zaXRpdmUuIEYgY2FuIGJlIG5lZ2F0aXZlLg0KKyAqCU1vdG9yIGRpcmVjdGlvbiBjYW4gYmUgcmV2ZXJzZWQgdXNpbmcgU2V0UmV2TW90RHVyaW5nQ2xvc2VMb29wRW4gaWYgc2Vuc29yIGFuZCBtb3RvciBhcmUgb3V0IG9mIHBoYXNlLg0KKyAqCVNpbWlsYXJseSBmZWVkYmFjayBzZW5zb3IgY2FuIGFsc28gYmUgcmV2ZXJzZWQgKG11bHRpcGxpZWQgYnkgLTEpIGlmIHlvdSBwcmVmZXIgdGhlIHNlbnNvciB0byBiZSBpbnZlcnRlZC4NCisgKg0KKyAqIFAgZ2FpbiBpcyBzcGVjaWZpZWQgaW4gdGhyb3R0bGUgcGVyIGVycm9yIHRpY2suICBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxMDIgaXMgfjkuOSUgKHdoaWNoIGlzIDEwMi8xMDIzKSB0aHJvdHRsZSBwZXIgMQ0KKyAqIAkJQURDIHVuaXQoMTBiaXQpIG9yIDEgcXVhZHJhdHVyZSBlbmNvZGVyIGVkZ2UgZGVwZW5kaW5nIG9uIHNlbGVjdGVkIHNlbnNvci4NCisgKg0KKyAqIEkgZ2FpbiBpcyBzcGVjaWZpZWQgaW4gdGhyb3R0bGUgcGVyIGludGVncmF0ZWQgZXJyb3IuIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwIGVxdWF0ZXMgdG8gfjAuOTklICh3aGljaCBpcyAxMC8xMDIzKQ0KKyAqICAJZm9yIGVhY2ggYWNjdW11bGF0ZWQgQURDIHVuaXQoMTBiaXQpIG9yIDEgcXVhZHJhdHVyZSBlbmNvZGVyIGVkZ2UgZGVwZW5kaW5nIG9uIHNlbGVjdGVkIHNlbnNvci4NCisgKiAgCUNsb3NlIGxvb3AgYW5kIGludGVncmFsIGFjY3VtdWxhdG9yIHJ1bnMgZXZlcnkgMW1zLg0KKyAqDQorICogRCBnYWluIGlzIHNwZWNpZmllZCBpbiB0aHJvdHRsZSBwZXIgZGVyaXZhdGl2ZSBlcnJvci4gRm9yIGV4YW1wbGUgYSB2YWx1ZSBvZiAxMDIgZXF1YXRlcyB0byB+OS45JSAod2hpY2ggaXMgMTAyLzEwMjMpDQorICogCXBlciBjaGFuZ2Ugb2YgMSB1bml0IChBREMgb3IgZW5jb2RlcikgcGVyIG1zLg0KKyAqDQorICogSSBab25lIGlzIHNwZWNpZmllZCBpbiB0aGUgc2FtZSB1bml0cyBhcyBzZW5zb3IgcG9zaXRpb24gKEFEQyB1bml0cyBvciBxdWFkcmF0dXJlIGVkZ2VzKS4gIElmIHBvcy92ZWwgZXJyb3IgaXMgb3V0c2lkZSBvZg0KKyAqIAkJdGhpcyB2YWx1ZSwgdGhlIGludGVncmF0ZWQgZXJyb3Igd2lsbCBhdXRvLWNsZWFyLi4uDQorICogCQlpZiggICAoSVpvbmUhPTApICBhbmQgIGFicyhlcnIpID4gSVpvbmUpDQorICogCQkJQ2xlYXJJYWNjdW0oKQ0KKyAqIAkJLi4udGhpcyBpcyB2ZXJ5IHVzZWZ1bCBpbiBwcmV2ZW50aW5nIGludGVncmFsIHdpbmR1cCBhbmQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIGlmIHVzaW5nIGZ1bGwgUElEIHRvIGtlZXAgc3RhYmlsaXR5IGxvdy4NCisgKg0KKyAqIENsb3NlTG9vcFJhbXBSYXRlIGlzIGluIHRocm90dGxlIHVuaXRzIHBlciAxbXMuICBTZXQgdG8gemVybyB0byBkaXNhYmxlIHJhbXBpbmcuDQorICogCQlXb3JrcyB0aGUgc2FtZSBhcyBSYW1wVGhyb3R0bGUgYnV0IG9ubHkgaXMgaW4gZWZmZWN0IHdoZW4gYSBjbG9zZSBsb29wIG1vZGUgYW5kIHByb2ZpbGUgc2xvdCBpcyBzZWxlY3RlZC4NCisgKg0KKyAqIGF1dG8gZ2VuZXJhdGVkIHVzaW5nIHNwcmVhZHNoZWV0IGFuZCBXcGlDbGFzc0dlbi5jc3Byb2oNCisgKiBAbGluayBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xT1VfWlY3ZlpMR1lVUS1VaGM4c1ZBbVVtV1RsVDhYQkZZSzhsZmpnX3RhYy9lZGl0I2dpZD0xNzY2MDQ2OTY3DQorICovDQorI2lmbmRlZiBDYW5UYWxvblNSWF9IXw0KKyNkZWZpbmUgQ2FuVGFsb25TUlhfSF8NCisjaW5jbHVkZSAiY3RyZS5oIgkJCQkvL0JJVCBEZWZpbmVzICsgVHlwZWRlZnMNCisjaW5jbHVkZSAiQ3RyZUNhbk5vZGUuaCINCisjaW5jbHVkZSA8TmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oPgkvL0NBTiBDb21tDQorI2luY2x1ZGUgPG1hcD4NCitjbGFzcyBDYW5UYWxvblNSWCA6IHB1YmxpYyBDdHJlQ2FuTm9kZQ0KK3sNCitwcml2YXRlOg0KKw0KKwkvKioganVzdCBpbiBjYXNlIHVzZXIgd2FudHMgdG8gbW9kaWZ5IHBlcmlvZHMgb2YgY2VydGFpbiBzdGF0dXMgZnJhbWVzLg0KKwkgKiAJRGVmYXVsdCB0aGUgdmFycyB0byBtYXRjaCB0aGUgZmlybXdhcmUgZGVmYXVsdC4gKi8NCisJdWludDMyX3QgX3N0YXR1c1JhdGVNc1s0XTsNCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcnMgZm9yIG9wZW5pbmcgYSBDQU4gc3RyZWFtIGlmIGNhbGxlciBuZWVkcyBzaWduYWxzIHRoYXQgcmVxdWlyZSBzb2xpY2l0aW5nICovDQorCXVpbnQzMl90IF9jYW5faDsgCS8vITwgU2Vzc2lvbiBoYW5kbGUgZm9yIGNhdGNoaW5nIHJlc3BvbnNlIHBhcmFtcy4NCisJaW50MzJfdCBfY2FuX3N0YXQ7IC8vITwgU2Vzc2lvbiBoYW5kbGUgc3RhdHVzLg0KKwlzdHJ1Y3QgdENBTlN0cmVhbU1lc3NhZ2UgX21zZ0J1ZmZbMjBdOw0KKwlzdGF0aWMgaW50IGNvbnN0IGtNc2dDYXBhY2l0eQk9IDIwOw0KKwl0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gc2lnc190Ow0KKwlzaWdzX3QgX3NpZ3M7IC8vITwgQ2F0Y2hlcyBzaWduYWwgdXBkYXRlcyB0aGF0IGFyZSBzb2xpY2l0ZWQuICBFeHBlY3QgdGhpcyB0byBiZSB2ZXJ5IGZldy4NCisJdm9pZCBPcGVuU2Vzc2lvbklmTmVlZEJlKCk7DQorCXZvaWQgUHJvY2Vzc1N0cmVhbU1lc3NhZ2VzKCk7DQorCS8qKg0KKwkgKiBTZW5kIGEgb25lIHNob3QgZnJhbWUgdG8gc2V0IGFuIGFyYml0cmFyeSBzaWduYWwuDQorCSAqIE1vc3Qgc2lnbmFscyBhcmUgaW4gdGhlIGNvbnRyb2wgZnJhbWUgc28gYXZvaWQgdXNpbmcgdGhpcyBBUEkgdW5sZXNzIHlvdSBoYXZlIHRvLg0KKwkgKiBVc2UgdGhpcyBhcGkgZm9yLi4uDQorCSAqIC1BIG1vdG9yIGNvbnRyb2xsZXIgcHJvZmlsZSBzaWduYWwgZVByb2ZpbGVQYXJhbV9YWFhzLiAgVGhlc2UgYXJlIGJhY2tlZCB1cCBpbiBmbGFzaC4gIElmIHlvdSBhcmUgZ2Fpbi1zY2hlZHVsaW5nIHRoZW4gY2FsbCB0aGlzIHBlcmlvZGljYWxseS4NCisJICogLURlZmF1bHQgYnJha2UgYW5kIGxpbWl0IHN3aXRjaCBzaWduYWxzLi4uIGVPbkJvb3RfWFhYcy4gIEF2b2lkIGRvaW5nIHRoaXMsIHVzZSB0aGUgb3ZlcnJpZGUgc2lnbmFscyBpbiB0aGUgY29udHJvbCBmcmFtZS4NCisJICogVGFsb24gd2lsbCBhdXRvbWF0aWNhbGx5IHNlbmQgYSBQQVJBTV9SRVNQT05TRSBhZnRlciB0aGUgc2V0LCBzbyBHZXRQYXJhbVJlc3BvbnNlIHdpbGwgY2F0Y2ggdGhlIGxhdGVzdCB2YWx1ZSBhZnRlciBhIGNvdXBsZSBtcy4NCisJICovDQorCUNUUl9Db2RlIFNldFBhcmFtUmF3KHVpbnQzMl90IHBhcmFtRW51bSwgaW50MzJfdCByYXdCaXRzKTsNCisJLyoqDQorCSAqIENoZWNrcyBjYWNoZWQgQ0FOIGZyYW1lcyBhbmQgdXBkYXRpbmcgc29saWNpdGVkIHNpZ25hbHMuDQorCSAqLw0KKwlDVFJfQ29kZSBHZXRQYXJhbVJlc3BvbnNlUmF3KHVpbnQzMl90IHBhcmFtRW51bSwgaW50MzJfdCAmIHJhd0JpdHMpOw0KK3B1YmxpYzoNCisJc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdENvbnRyb2xQZXJpb2RNcyA9IDEwOyAvLyE8IGRlZmF1bHQgY29udHJvbCB1cGRhdGUgcmF0ZSBpcyAxMG1zLg0KKwlDYW5UYWxvblNSWChpbnQgZGV2aWNlTnVtYmVyID0gMCxpbnQgY29udHJvbFBlcmlvZE1zID0ga0RlZmF1bHRDb250cm9sUGVyaW9kTXMpOw0KKwl+Q2FuVGFsb25TUlgoKTsNCisJdm9pZCBTZXQoZG91YmxlIHZhbHVlKTsNCisJLyogbW9kZSBzZWxlY3QgZW51bWVyYXRpb25zICovDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfRHV0eUN5Y2xlID0gMDsgLy8hPCBEZW1hbmQgaXMgMTFiaXQgc2lnbmVkIGR1dHkgY3ljbGUgWy0xMDIzLDEwMjNdLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX1Bvc2l0aW9uQ2xvc2VMb29wID0gMTsgLy8hPCBQb3NpdGlvbiBQSURGLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX1ZlbG9jaXR5Q2xvc2VMb29wID0gMjsgLy8hPCBWZWxvY2l0eSBQSURGLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX0N1cnJlbnRDbG9zZUxvb3AgPSAzOyAvLyE8IEN1cnJlbnQgY2xvc2UgbG9vcCAtIG5vdCBkb25lLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX1ZvbHRDb21wZW4gPSA0OyAvLyE8IFZvbHRhZ2UgQ29tcGVuc2F0aW9uIE1vZGUgLSBub3QgZG9uZS4gIERlbWFuZCBpcyBmaXhlZCBwdCB0YXJnZXQgOC44IHZvbHRzLg0KKwlzdGF0aWMgY29uc3QgaW50IGtNb2RlX1NsYXZlRm9sbG93ZXIgPSA1OyAvLyE8IERlbWFuZCBpcyB0aGUgNiBiaXQgRGV2aWNlIElEIG9mIHRoZSAnbWFzdGVyJyBUQUxPTiBTUlguDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfTm9Ecml2ZSA9IDE1OyAvLyE8IFplcm8gdGhlIG91dHB1dCAoaG9ub3JzIGJyYWtlL2NvYXN0KSByZWdhcmRsZXNzIG9mIGRlbWFuZC4gIE1pZ2h0IGJlIHVzZWZ1bCBpZiB3ZSBuZWVkIHRvIGNoYW5nZSBtb2RlcyBidXQgY2FuJ3QgYXRvbWljYWxseSBjaGFuZ2UgYWxsIHRoZSBzaWduYWxzIHdlIHdhbnQgaW4gYmV0d2Vlbi4NCisJLyogbGltaXQgc3dpdGNoIGVudW1lcmF0aW9ucyAqLw0KKwlzdGF0aWMgY29uc3QgaW50IGtMaW1pdFN3aXRjaE92ZXJyaWRlX1VzZURlZmF1bHRzRnJvbUZsYXNoID0gMTsNCisJc3RhdGljIGNvbnN0IGludCBrTGltaXRTd2l0Y2hPdmVycmlkZV9EaXNhYmxlRndkX0Rpc2FibGVSZXYgPSA0Ow0KKwlzdGF0aWMgY29uc3QgaW50IGtMaW1pdFN3aXRjaE92ZXJyaWRlX0Rpc2FibGVGd2RfRW5hYmxlUmV2ID0gNTsNCisJc3RhdGljIGNvbnN0IGludCBrTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRGlzYWJsZVJldiA9IDY7DQorCXN0YXRpYyBjb25zdCBpbnQga0xpbWl0U3dpdGNoT3ZlcnJpZGVfRW5hYmxlRndkX0VuYWJsZVJldiA9IDc7DQorCS8qIGJyYWtlIG92ZXJyaWRlIGVudW1lcmF0aW9ucyAqLw0KKwlzdGF0aWMgY29uc3QgaW50IGtCcmFrZU92ZXJyaWRlX1VzZURlZmF1bHRzRnJvbUZsYXNoID0gMDsNCisJc3RhdGljIGNvbnN0IGludCBrQnJha2VPdmVycmlkZV9PdmVycmlkZUNvYXN0ID0gMTsNCisJc3RhdGljIGNvbnN0IGludCBrQnJha2VPdmVycmlkZV9PdmVycmlkZUJyYWtlID0gMjsNCisJLyogZmVlZGJhY2sgZGV2aWNlIGVudW1lcmF0aW9ucyAqLw0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9EaWdpdGFsUXVhZEVuYz0wOw0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9BbmFsb2dQb3Q9MjsNCisJc3RhdGljIGNvbnN0IGludCBrRmVlZGJhY2tEZXZfQW5hbG9nRW5jb2Rlcj0zOw0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9Db3VudEV2ZXJ5UmlzaW5nRWRnZT00Ow0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9Db3VudEV2ZXJ5RmFsbGluZ0VkZ2U9NTsNCisJc3RhdGljIGNvbnN0IGludCBrRmVlZGJhY2tEZXZfUG9zSXNQdWxzZVdpZHRoPTg7DQorCS8qIFByb2ZpbGVTbG90U2VsZWN0IGVudW1lcmF0aW9ucyovDQorCXN0YXRpYyBjb25zdCBpbnQga1Byb2ZpbGVTbG90U2VsZWN0X1Nsb3QwID0gMDsNCisJc3RhdGljIGNvbnN0IGludCBrUHJvZmlsZVNsb3RTZWxlY3RfU2xvdDEgPSAxOw0KKyAgICAvKiBzdGF0dXMgZnJhbWUgcmF0ZSB0eXBlcyAqLw0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTdGF0dXNGcmFtZV9HZW5lcmFsID0gMDsNCisgICAgc3RhdGljIGNvbnN0IGludCBrU3RhdHVzRnJhbWVfRmVlZGJhY2sgPSAxOw0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTdGF0dXNGcmFtZV9FbmNvZGVyID0gMjsNCisgICAgc3RhdGljIGNvbnN0IGludCBrU3RhdHVzRnJhbWVfQW5hbG9nVGVtcFZiYXQgPSAzOw0KKwkvKioNCisJICogU2lnbmFsIGVudW1lcmF0aW9uIGZvciBnZW5lcmljIHNpZ25hbCBhY2Nlc3MuDQorCSAqIEFsdGhvdWdoIGV2ZXJ5IHNpZ25hbCBpcyBlbnVtZXJhdGVkLCBvbmx5IHVzZSB0aGlzIGZvciB0cmFmZmljIHRoYXQgbXVzdCBiZSBzb2xpY2l0ZWQuDQorCSAqIFVzZSB0aGUgYXV0byBnZW5lcmF0ZWQgZ2V0dGVycy9zZXR0ZXJzIGF0IGJvdHRvbSBvZiB0aGlzIGhlYWRlciBhcyBtdWNoIGFzIHBvc3NpYmxlLg0KKwkgKi8NCisJdHlwZWRlZiBlbnVtIF9wYXJhbV90ew0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX1A9MSwNCisJCWVQcm9maWxlUGFyYW1TbG90MF9JPTIsDQorCQllUHJvZmlsZVBhcmFtU2xvdDBfRD0zLA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX0Y9NCwNCisJCWVQcm9maWxlUGFyYW1TbG90MF9JWm9uZT01LA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX0Nsb3NlTG9vcFJhbXBSYXRlPTYsDQorCQllUHJvZmlsZVBhcmFtU2xvdDFfUD0xMSwNCisJCWVQcm9maWxlUGFyYW1TbG90MV9JPTEyLA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QxX0Q9MTMsDQorCQllUHJvZmlsZVBhcmFtU2xvdDFfRj0xNCwNCisJCWVQcm9maWxlUGFyYW1TbG90MV9JWm9uZT0xNSwNCisJCWVQcm9maWxlUGFyYW1TbG90MV9DbG9zZUxvb3BSYW1wUmF0ZT0xNiwNCisJCWVQcm9maWxlUGFyYW1Tb2Z0TGltaXRGb3JUaHJlc2hvbGQ9MjEsDQorCQllUHJvZmlsZVBhcmFtU29mdExpbWl0UmV2VGhyZXNob2xkPTIyLA0KKwkJZVByb2ZpbGVQYXJhbVNvZnRMaW1pdEZvckVuYWJsZT0yMywNCisJCWVQcm9maWxlUGFyYW1Tb2Z0TGltaXRSZXZFbmFibGU9MjQsDQorCQllT25Cb290X0JyYWtlTW9kZT0zMSwNCisJCWVPbkJvb3RfTGltaXRTd2l0Y2hfRm9yd2FyZF9Ob3JtYWxseUNsb3NlZD0zMiwNCisJCWVPbkJvb3RfTGltaXRTd2l0Y2hfUmV2ZXJzZV9Ob3JtYWxseUNsb3NlZD0zMywNCisJCWVPbkJvb3RfTGltaXRTd2l0Y2hfRm9yd2FyZF9EaXNhYmxlPTM0LA0KKwkJZU9uQm9vdF9MaW1pdFN3aXRjaF9SZXZlcnNlX0Rpc2FibGU9MzUsDQorCQllRmF1bHRfT3ZlclRlbXA9NDEsDQorCQllRmF1bHRfVW5kZXJWb2x0YWdlPTQyLA0KKwkJZUZhdWx0X0ZvckxpbT00MywNCisJCWVGYXVsdF9SZXZMaW09NDQsDQorCQllRmF1bHRfSGFyZHdhcmVGYWlsdXJlPTQ1LA0KKwkJZUZhdWx0X0ZvclNvZnRMaW09NDYsDQorCQllRmF1bHRfUmV2U29mdExpbT00NywNCisJCWVTdGNreUZhdWx0X092ZXJUZW1wPTQ4LA0KKwkJZVN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlPTQ5LA0KKwkJZVN0Y2t5RmF1bHRfRm9yTGltPTUwLA0KKwkJZVN0Y2t5RmF1bHRfUmV2TGltPTUxLA0KKwkJZVN0Y2t5RmF1bHRfRm9yU29mdExpbT01MiwNCisJCWVTdGNreUZhdWx0X1JldlNvZnRMaW09NTMsDQorCQllQXBwbGllZFRocm90dGxlPTYxLA0KKwkJZUNsb3NlTG9vcEVycj02MiwNCisJCWVGZWVkYmFja0RldmljZVNlbGVjdD02MywNCisJCWVSZXZNb3REdXJpbmdDbG9zZUxvb3BFbj02NCwNCisJCWVNb2RlU2VsZWN0PTY1LA0KKwkJZVByb2ZpbGVTbG90U2VsZWN0PTY2LA0KKwkJZVJhbXBUaHJvdHRsZT02NywNCisJCWVSZXZGZWVkYmFja1NlbnNvcj02OCwNCisJCWVMaW1pdFN3aXRjaEVuPTY5LA0KKwkJZUxpbWl0U3dpdGNoQ2xvc2VkRm9yPTcwLA0KKwkJZUxpbWl0U3dpdGNoQ2xvc2VkUmV2PTcxLA0KKwkJZVNlbnNvclBvc2l0aW9uPTczLA0KKwkJZVNlbnNvclZlbG9jaXR5PTc0LA0KKwkJZUN1cnJlbnQ9NzUsDQorCQllQnJha2VJc0VuYWJsZWQ9NzYsDQorCQllRW5jUG9zaXRpb249NzcsDQorCQllRW5jVmVsPTc4LA0KKwkJZUVuY0luZGV4UmlzZUV2ZW50cz03OSwNCisJCWVRdWFkQXBpbj04MCwNCisJCWVRdWFkQnBpbj04MSwNCisJCWVRdWFkSWR4cGluPTgyLA0KKwkJZUFuYWxvZ0luV2l0aE92PTgzLA0KKwkJZUFuYWxvZ0luVmVsPTg0LA0KKwkJZVRlbXA9ODUsDQorCQllQmF0dGVyeVY9ODYsDQorCQllUmVzZXRDb3VudD04NywNCisJCWVSZXNldEZsYWdzPTg4LA0KKwkJZUZpcm1WZXJzPTg5LA0KKwkJZVNldHRpbmdzQ2hhbmdlZD05MCwNCisJCWVRdWFkRmlsdGVyRW49OTEsCQ0KKwkJZVBpZElhY2N1bT05MywNCisJfXBhcmFtX3Q7DQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tc2V0dGVycyBhbmQgZ2V0dGVycyB0aGF0IHVzZSB0aGUgc29saWNhdGVkIHBhcmFtIHJlcXVlc3QvcmVzcG9uc2UtLS0tLS0tLS0tLS0tKi8vKioNCisgICAgICogU2VuZCBhIG9uZSBzaG90IGZyYW1lIHRvIHNldCBhbiBhcmJpdHJhcnkgc2lnbmFsLg0KKyAgICAgKiBNb3N0IHNpZ25hbHMgYXJlIGluIHRoZSBjb250cm9sIGZyYW1lIHNvIGF2b2lkIHVzaW5nIHRoaXMgQVBJIHVubGVzcyB5b3UgaGF2ZSB0by4NCisgICAgICogVXNlIHRoaXMgYXBpIGZvci4uLg0KKyAgICAgKiAtQSBtb3RvciBjb250cm9sbGVyIHByb2ZpbGUgc2lnbmFsIGVQcm9maWxlUGFyYW1fWFhYcy4gIFRoZXNlIGFyZSBiYWNrZWQgdXAgaW4gZmxhc2guICBJZiB5b3UgYXJlIGdhaW4tc2NoZWR1bGluZyB0aGVuIGNhbGwgdGhpcyBwZXJpb2RpY2FsbHkuDQorICAgICAqIC1EZWZhdWx0IGJyYWtlIGFuZCBsaW1pdCBzd2l0Y2ggc2lnbmFscy4uLiBlT25Cb290X1hYWHMuICBBdm9pZCBkb2luZyB0aGlzLCB1c2UgdGhlIG92ZXJyaWRlIHNpZ25hbHMgaW4gdGhlIGNvbnRyb2wgZnJhbWUuDQorICAgICAqIFRhbG9uIHdpbGwgYXV0b21hdGljYWxseSBzZW5kIGEgUEFSQU1fUkVTUE9OU0UgYWZ0ZXIgdGhlIHNldCwgc28gR2V0UGFyYW1SZXNwb25zZSB3aWxsIGNhdGNoIHRoZSBsYXRlc3QgdmFsdWUgYWZ0ZXIgYSBjb3VwbGUgbXMuDQorICAgICAqLw0KKwlDVFJfQ29kZSBTZXRQYXJhbShwYXJhbV90IHBhcmFtRW51bSwgZG91YmxlIHZhbHVlKTsNCisJLyoqDQorCSAqIEFza3MgVEFMT04gdG8gaW1tZWRpZXRlbHkgcmVzcG9uZCB3aXRoIHNpZ25hbCB2YWx1ZS4gIFRoaXMgQVBJIGlzIG9ubHkgdXNlZCBmb3Igc2lnbmFscyB0aGF0IGFyZSBub3Qgc2VudCBwZXJpb2RpY2FsbHkuDQorCSAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgcmVhZGluZyBwYXJhbXMgdGhhdCByYXJlbHkgY2hhbmdlIGxpa2UgTGltaXQgU3dpdGNoIHNldHRpbmdzIGFuZCBQSURGIHZhbHVlcy4NCisJICAqIEBwYXJhbSBwYXJhbSB0byByZXF1ZXN0Lg0KKwkgKi8NCisJQ1RSX0NvZGUgUmVxdWVzdFBhcmFtKHBhcmFtX3QgcGFyYW1FbnVtKTsNCisJQ1RSX0NvZGUgR2V0UGFyYW1SZXNwb25zZShwYXJhbV90IHBhcmFtRW51bSwgZG91YmxlICYgdmFsdWUpOw0KKwlDVFJfQ29kZSBHZXRQYXJhbVJlc3BvbnNlSW50MzIocGFyYW1fdCBwYXJhbUVudW0sIGludCAmIHZhbHVlKTsNCisgICAgLyotLS0tLSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHRoYXQgdXNlIHBhcmFtIHJlcXVlc3QvcmVzcG9uc2UuIFRoZXNlIHNpZ25hbHMgYXJlIGJhY2tlZCB1cCBpbiBmbGFzaCBhbmQgd2lsbCBzdXJ2aXZlIGEgcG93ZXIgY3ljbGUuIC0tLS0tLS0tLSovDQorCS8qLS0tLS0gSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMgY29uc2lkZXIgdXNpbmcgYm90aCBzbG90cyBhbmQgc3dpdGNoIGJldHdlZW4gc2xvdDAgPD0+IHNsb3QxLiAtLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkvKi0tLS0tIElmIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMgY2hhbmdpbmcgdGhlc2Ugc2lnbmFscyBmcmVxdWVudGx5IHRoZW4gaXQgbWFrZXMgc2Vuc2UgdG8gbGV2ZXJhZ2UgdGhpcyBBUEkuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJLyotLS0tLSBHZXR0ZXJzIGRvbid0IGJsb2NrLCBzbyBpdCBtYXkgcmVxdWlyZSBzZXZlcmFsIGNhbGxzIHRvIGdldCB0aGUgbGF0ZXN0IHZhbHVlLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCUNUUl9Db2RlIFNldFBnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlIGdhaW4pOw0KKwlDVFJfQ29kZSBTZXRJZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKTsNCisJQ1RSX0NvZGUgU2V0RGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgZ2Fpbik7DQorCUNUUl9Db2RlIFNldEZnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlIGdhaW4pOw0KKwlDVFJfQ29kZSBTZXRJem9uZSh1bnNpZ25lZCBzbG90SWR4LGludCB6b25lKTsNCisJQ1RSX0NvZGUgU2V0Q2xvc2VMb29wUmFtcFJhdGUodW5zaWduZWQgc2xvdElkeCxpbnQgY2xvc2VMb29wUmFtcFJhdGUpOw0KKwlDVFJfQ29kZSBTZXRTZW5zb3JQb3NpdGlvbihpbnQgcG9zKTsNCisJQ1RSX0NvZGUgU2V0Rm9yd2FyZFNvZnRMaW1pdChpbnQgZm9yd2FyZExpbWl0KTsNCisJQ1RSX0NvZGUgU2V0UmV2ZXJzZVNvZnRMaW1pdChpbnQgcmV2ZXJzZUxpbWl0KTsNCisJQ1RSX0NvZGUgU2V0Rm9yd2FyZFNvZnRFbmFibGUoaW50IGVuYWJsZSk7DQorCUNUUl9Db2RlIFNldFJldmVyc2VTb2Z0RW5hYmxlKGludCBlbmFibGUpOw0KKwlDVFJfQ29kZSBHZXRQZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pOw0KKwlDVFJfQ29kZSBHZXRJZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pOw0KKwlDVFJfQ29kZSBHZXREZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pOw0KKwlDVFJfQ29kZSBHZXRGZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSAmIGdhaW4pOw0KKwlDVFJfQ29kZSBHZXRJem9uZSh1bnNpZ25lZCBzbG90SWR4LGludCAmIHpvbmUpOw0KKwlDVFJfQ29kZSBHZXRDbG9zZUxvb3BSYW1wUmF0ZSh1bnNpZ25lZCBzbG90SWR4LGludCAmIGNsb3NlTG9vcFJhbXBSYXRlKTsNCisJQ1RSX0NvZGUgR2V0Rm9yd2FyZFNvZnRMaW1pdChpbnQgJiBmb3J3YXJkTGltaXQpOw0KKwlDVFJfQ29kZSBHZXRSZXZlcnNlU29mdExpbWl0KGludCAmIHJldmVyc2VMaW1pdCk7DQorCUNUUl9Db2RlIEdldEZvcndhcmRTb2Z0RW5hYmxlKGludCAmIGVuYWJsZSk7DQorCUNUUl9Db2RlIEdldFJldmVyc2VTb2Z0RW5hYmxlKGludCAmIGVuYWJsZSk7DQorCS8qKg0KKwkgKiBDaGFuZ2UgdGhlIHBlcmlvZE1zIG9mIGEgVEFMT04ncyBzdGF0dXMgZnJhbWUuICBTZWUga1N0YXR1c0ZyYW1lXyogZW51bXMgZm9yIHdoYXQncyBhdmFpbGFibGUuDQorCSAqLw0KKwlDVFJfQ29kZSBTZXRTdGF0dXNGcmFtZVJhdGUodW5zaWduZWQgZnJhbWVFbnVtLCB1bnNpZ25lZCBwZXJpb2RNcyk7DQorCS8qKg0KKwkgKiBDbGVhciBhbGwgc3RpY2t5IGZhdWx0cyBpbiBUQUxPTi4NCisJICovDQorCUNUUl9Db2RlIENsZWFyU3RpY2t5RmF1bHRzKCk7DQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGF1dG8gZ2VuZXJhdGVkLiAgVGhpcyBBUEkgaXMgb3B0aW1hbCBzaW5jZSBpdCB1c2VzIHRoZSBmaXJlLWFuZC1mb3JnZXQgQ0FOIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhlc2Ugc2lnbmFscyBzaG91bGQgY292ZXIgdGhlIG1ham9yaXR5IG9mIGFsbCB1c2UgY2FzZXMuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9PdmVyVGVtcChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmF1bHRfVW5kZXJWb2x0YWdlKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9Gb3JMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZhdWx0X1JldkxpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmF1bHRfSGFyZHdhcmVGYWlsdXJlKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9Gb3JTb2Z0TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9SZXZTb2Z0TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X092ZXJUZW1wKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X1VuZGVyVm9sdGFnZShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U3Rja3lGYXVsdF9Gb3JMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFN0Y2t5RmF1bHRfUmV2TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X0ZvclNvZnRMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFN0Y2t5RmF1bHRfUmV2U29mdExpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0QXBwbGllZFRocm90dGxlKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRDbG9zZUxvb3BFcnIoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZlZWRiYWNrRGV2aWNlU2VsZWN0KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRNb2RlU2VsZWN0KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRMaW1pdFN3aXRjaEVuKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRMaW1pdFN3aXRjaENsb3NlZEZvcihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0TGltaXRTd2l0Y2hDbG9zZWRSZXYoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFNlbnNvclBvc2l0aW9uKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTZW5zb3JWZWxvY2l0eShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0Q3VycmVudChkb3VibGUgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0QnJha2VJc0VuYWJsZWQoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEVuY1Bvc2l0aW9uKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRFbmNWZWwoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEVuY0luZGV4UmlzZUV2ZW50cyhpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0UXVhZEFwaW4oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFF1YWRCcGluKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRRdWFkSWR4cGluKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRBbmFsb2dJbldpdGhPdihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0QW5hbG9nSW5WZWwoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFRlbXAoZG91YmxlICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEJhdHRlcnlWKGRvdWJsZSAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRSZXNldENvdW50KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRSZXNldEZsYWdzKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGaXJtVmVycyhpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0RGVtYW5kKGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldE92ZXJyaWRlTGltaXRTd2l0Y2hFbihpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRGZWVkYmFja0RldmljZVNlbGVjdChpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbihpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRPdmVycmlkZUJyYWtlVHlwZShpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRNb2RlU2VsZWN0KGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldE1vZGVTZWxlY3QoaW50IG1vZGVTZWxlY3QsaW50IGRlbWFuZCk7DQorCUNUUl9Db2RlIFNldFByb2ZpbGVTbG90U2VsZWN0KGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldFJhbXBUaHJvdHRsZShpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXRSZXZGZWVkYmFja1NlbnNvcihpbnQgcGFyYW0pOw0KK307DQorZXh0ZXJuICJDIiB7DQorCXZvaWQgKmNfVGFsb25TUlhfQ3JlYXRlKGludCBkZXZpY2VOdW1iZXIsIGludCBjb250cm9sUGVyaW9kTXMpOw0KKwl2b2lkIGNfVGFsb25TUlhfRGVzdHJveSh2b2lkICpoYW5kbGUpOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFBhcmFtKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSwgZG91YmxlIHZhbHVlKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9SZXF1ZXN0UGFyYW0odm9pZCAqaGFuZGxlLCBpbnQgcGFyYW1FbnVtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRQYXJhbVJlc3BvbnNlKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSwgZG91YmxlICp2YWx1ZSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UGFyYW1SZXNwb25zZUludDMyKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtRW51bSwgaW50ICp2YWx1ZSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0U3RhdHVzRnJhbWVSYXRlKHZvaWQgKmhhbmRsZSwgdW5zaWduZWQgZnJhbWVFbnVtLCB1bnNpZ25lZCBwZXJpb2RNcyk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfQ2xlYXJTdGlja3lGYXVsdHModm9pZCAqaGFuZGxlKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9PdmVyVGVtcCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X1VuZGVyVm9sdGFnZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X0ZvckxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X1JldkxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X0hhcmR3YXJlRmFpbHVyZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X0ZvclNvZnRMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGYXVsdF9SZXZTb2Z0TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U3Rja3lGYXVsdF9PdmVyVGVtcCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U3Rja3lGYXVsdF9Gb3JMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X1JldkxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfRm9yU29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfUmV2U29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEFwcGxpZWRUaHJvdHRsZSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldENsb3NlTG9vcEVycih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZlZWRiYWNrRGV2aWNlU2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0TW9kZVNlbGVjdCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldExpbWl0U3dpdGNoRW4odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRMaW1pdFN3aXRjaENsb3NlZEZvcih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldExpbWl0U3dpdGNoQ2xvc2VkUmV2KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U2Vuc29yUG9zaXRpb24odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTZW5zb3JWZWxvY2l0eSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEN1cnJlbnQodm9pZCAqaGFuZGxlLCBkb3VibGUgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRCcmFrZUlzRW5hYmxlZCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEVuY1Bvc2l0aW9uKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RW5jVmVsKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RW5jSW5kZXhSaXNlRXZlbnRzKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UXVhZEFwaW4odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkQnBpbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFF1YWRJZHhwaW4odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRBbmFsb2dJbldpdGhPdih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEFuYWxvZ0luVmVsKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0VGVtcCh2b2lkICpoYW5kbGUsIGRvdWJsZSAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEJhdHRlcnlWKHZvaWQgKmhhbmRsZSwgZG91YmxlICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UmVzZXRDb3VudCh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFJlc2V0RmxhZ3Modm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRGaXJtVmVycyh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldERlbWFuZCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRGZWVkYmFja0RldmljZVNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmV2TW90RHVyaW5nQ2xvc2VMb29wRW4odm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldE92ZXJyaWRlQnJha2VUeXBlKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRNb2RlU2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRNb2RlU2VsZWN0Mih2b2lkICpoYW5kbGUsIGludCBtb2RlU2VsZWN0LCBpbnQgZGVtYW5kKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRQcm9maWxlU2xvdFNlbGVjdCh2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0UmFtcFRocm90dGxlKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRSZXZGZWVkYmFja1NlbnNvcih2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorfQ0KKyNlbmRpZg0KKw0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9DdHJlQ2FuTm9kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlMzYyMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiDQorDQorI2luY2x1ZGUgIkN0cmVDYW5Ob2RlLmgiDQorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCINCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldA0KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gdXNsZWVwDQorDQorc3RhdGljIGNvbnN0IFVJTlQzMiBrRnVsbE1lc3NhZ2VJRE1hc2sgPSAweDFmZmZmZmZmOw0KKw0KK0N0cmVDYW5Ob2RlOjpDdHJlQ2FuTm9kZShVSU5UOCBkZXZpY2VOdW1iZXIpDQorew0KKwlfZGV2aWNlTnVtYmVyID0gZGV2aWNlTnVtYmVyOw0KK30NCitDdHJlQ2FuTm9kZTo6fkN0cmVDYW5Ob2RlKCkNCit7DQorfQ0KK3ZvaWQgQ3RyZUNhbk5vZGU6OlJlZ2lzdGVyUngodWludDMyX3QgYXJiSWQpDQorew0KKwkvKiBubyBuZWVkIHRvIGRvIGFueXRoaW5nLCB3ZSBqdXN0IHVzZSBuZXcgQVBJIHRvIHBvbGwgbGFzdCByZWNlaXZlZCBtZXNzYWdlICovDQorfQ0KK3ZvaWQgQ3RyZUNhbk5vZGU6OlJlZ2lzdGVyVHgodWludDMyX3QgYXJiSWQsIHVpbnQzMl90IHBlcmlvZE1zKQ0KK3sNCisJaW50MzJfdCBzdGF0dXMgPSAwOw0KKw0KKwl0eEpvYl90IGpvYiA9IHswfTsNCisJam9iLmFyYklkID0gYXJiSWQ7DQorCWpvYi5wZXJpb2RNcyA9IHBlcmlvZE1zOw0KKwlfdHhKb2JzW2FyYklkXSA9IGpvYjsNCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoCWpvYi5hcmJJZCwNCisJCQkJCQkJCQkJCQkJCWpvYi50b1NlbmQsDQorCQkJCQkJCQkJCQkJCQk4LA0KKwkJCQkJCQkJCQkJCQkJam9iLnBlcmlvZE1zLA0KKwkJCQkJCQkJCQkJCQkJJnN0YXR1cyk7DQorfQ0KK3RpbWVzcGVjIGRpZmYoY29uc3QgdGltZXNwZWMgJiBzdGFydCwgY29uc3QgdGltZXNwZWMgJiBlbmQpDQorew0KKwl0aW1lc3BlYyB0ZW1wOw0KKwlpZiAoKGVuZC50dl9uc2VjLXN0YXJ0LnR2X25zZWMpPDApIHsNCisJCXRlbXAudHZfc2VjID0gZW5kLnR2X3NlYy1zdGFydC50dl9zZWMtMTsNCisJCXRlbXAudHZfbnNlYyA9IDEwMDAwMDAwMDArZW5kLnR2X25zZWMtc3RhcnQudHZfbnNlYzsNCisJfSBlbHNlIHsNCisJCXRlbXAudHZfc2VjID0gZW5kLnR2X3NlYy1zdGFydC50dl9zZWM7DQorCQl0ZW1wLnR2X25zZWMgPSBlbmQudHZfbnNlYy1zdGFydC50dl9uc2VjOw0KKwl9DQorCXJldHVybiB0ZW1wOw0KK30NCitDVFJfQ29kZSBDdHJlQ2FuTm9kZTo6R2V0UngodWludDMyX3QgYXJiSWQsdWludDhfdCAqIGRhdGFCeXRlcywgdWludDMyX3QgdGltZW91dE1zKQ0KK3sNCisJQ1RSX0NvZGUgcmV0dmFsID0gQ1RSX09LQVk7DQorCWludDMyX3Qgc3RhdHVzID0gMDsNCisJdWludDhfdCBsZW4gPSAwOw0KKwl1aW50MzJfdCB0aW1lU3RhbXA7DQorCS8qIGNhcCB0aW1lb3V0IGF0IDk5OW1zICovDQorCWlmKHRpbWVvdXRNcyA+IDk5OSkNCisJCXRpbWVvdXRNcyA9IDk5OTsNCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVjZWl2ZU1lc3NhZ2UoJmFyYklkLGtGdWxsTWVzc2FnZUlETWFzayxkYXRhQnl0ZXMsJmxlbiwmdGltZVN0YW1wLCZzdGF0dXMpOw0KKwlpZihzdGF0dXMgPT0gMCl7DQorCQkvKiBmcmVzaCB1cGRhdGUgKi8NCisJCXJ4RXZlbnRfdCAmIHIgPSBfcnhSeEV2ZW50c1thcmJJZF07IC8qIGxvb2t1cCBlbnRyeSBvciBtYWtlIGEgZGVmYXVsdCBuZXcgb25lIHdpdGggYWxsIHplcm9lcyAqLw0KKwkJY2xvY2tfZ2V0dGltZSgyLCZyLnRpbWUpOyAJCQkvKiBmaWxsIGluIHRpbWUgKi8NCisJCW1lbWNweShyLmJ5dGVzLCAgZGF0YUJ5dGVzLCAgOCk7CS8qIGZpbGwgaW4gZGF0YWJ5dGVzICovDQorCX1lbHNlew0KKwkJLyogZGlkIG5vdCBnZXQgdGhlIG1lc3NhZ2UgKi8NCisJCXJ4UnhFdmVudHNfdDo6aXRlcmF0b3IgaSA9IF9yeFJ4RXZlbnRzLmZpbmQoYXJiSWQpOw0KKwkJaWYoaSA9PSBfcnhSeEV2ZW50cy5lbmQoKSl7DQorCQkJLyogd2UndmUgbmV2ZXIgZ290dGVuIHRoaXMgbWVzYWdlICovDQorCQkJcmV0dmFsID0gQ1RSX1J4VGltZW91dDsNCisJCQkvKiBmaWxsIGNhbGxlcidzIGJ1ZmZlciB3aXRoIHplcm9zICovDQorCQkJbWVtc2V0KGRhdGFCeXRlcywwLDgpOw0KKwkJfWVsc2V7DQorCQkJLyogd2UndmUgZ290dGVuIHRoaXMgbWVzc2FnZSBiZWZvcmUgYnV0IG5vdCByZWNlbnRseSAqLw0KKwkJCW1lbWNweShkYXRhQnl0ZXMsaS0+c2Vjb25kLmJ5dGVzLDgpOw0KKwkJCS8qIGdldCB0aGUgdGltZSBub3cgKi8NCisJCQlzdHJ1Y3QgdGltZXNwZWMgdGVtcDsNCisJCQljbG9ja19nZXR0aW1lKDIsJnRlbXApOyAvKiBnZXQgbm93ICovDQorCQkJLyogaG93IGxvbmcgaGFzIGl0IGJlZW4/ICovDQorCQkJdGVtcCA9IGRpZmYoaS0+c2Vjb25kLnRpbWUsdGVtcCk7IC8qIHRlbXAgPSBub3cgLSBsYXN0ICovDQorCQkJaWYodGVtcC50dl9zZWMgPiAwKXsNCisJCQkJcmV0dmFsID0gQ1RSX1J4VGltZW91dDsNCisJCQl9ZWxzZSBpZih0ZW1wLnR2X25zZWMgPiAoKGludDMyX3QpdGltZW91dE1zKjEwMDAqMTAwMCkpew0KKwkJCQlyZXR2YWwgPSBDVFJfUnhUaW1lb3V0Ow0KKwkJCX1lbHNlIHsNCisJCQkJLyogb3VyIGxhc3QgdXBkYXRlIHdhcyByZWNlbnQgZW5vdWdoICovDQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiByZXR2YWw7DQorfQ0KK3ZvaWQgQ3RyZUNhbk5vZGU6OkZsdXNoVHgodWludDMyX3QgYXJiSWQpDQorew0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCXR4Sm9ic190OjppdGVyYXRvciBpdGVyID0gX3R4Sm9icy5maW5kKGFyYklkKTsNCisJaWYoaXRlciAhPSBfdHhKb2JzLmVuZCgpKQ0KKwkJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoCWl0ZXItPnNlY29uZC5hcmJJZCwNCisJCQkJCQkJCQkJCQkJCQlpdGVyLT5zZWNvbmQudG9TZW5kLA0KKwkJCQkJCQkJCQkJCQkJCTgsDQorCQkJCQkJCQkJCQkJCQkJaXRlci0+c2Vjb25kLnBlcmlvZE1zLA0KKwkJCQkJCQkJCQkJCQkJCSZzdGF0dXMpOw0KK30NCisNCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL0N0cmVDYW5Ob2RlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL0N0cmVDYW5Ob2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyZDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuaApAQCAtMCwwICsxLDExNiBAQAorI2lmbmRlZiBDdHJlQ2FuTm9kZV9IXw0KKyNkZWZpbmUgQ3RyZUNhbk5vZGVfSF8NCisjaW5jbHVkZSAiY3RyZS5oIgkJCQkvL0JJVCBEZWZpbmVzICsgVHlwZWRlZnMNCisjaW5jbHVkZSA8TmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oPgkvL0NBTiBDb21tDQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCisjaW5jbHVkZSA8bWFwPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtY3B5DQorI2luY2x1ZGUgPHN5cy90aW1lLmg+DQorY2xhc3MgQ3RyZUNhbk5vZGUNCit7DQorcHVibGljOg0KKwlDdHJlQ2FuTm9kZShVSU5UOCBkZXZpY2VOdW1iZXIpOw0KKyAgICB+Q3RyZUNhbk5vZGUoKTsNCisNCisJVUlOVDggR2V0RGV2aWNlTnVtYmVyKCkNCisJew0KKwkJcmV0dXJuIF9kZXZpY2VOdW1iZXI7DQorCX0NCitwcm90ZWN0ZWQ6DQorDQorDQorCXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyB0eFRhc2t7DQorCQlwdWJsaWM6DQorCQkJdWludDMyX3QgYXJiSWQ7DQorCQkJVCAqIHRvU2VuZDsNCisJCQlUICogb3BlcmF0b3IgLT4gKCkNCisJCQl7DQorCQkJCXJldHVybiB0b1NlbmQ7DQorCQkJfQ0KKwkJCVQgJiBvcGVyYXRvciooKQ0KKwkJCXsNCisJCQkJcmV0dXJuICp0b1NlbmQ7DQorCQkJfQ0KKwkJCWJvb2wgSXNFbXB0eSgpDQorCQkJew0KKwkJCQlpZih0b1NlbmQgPT0gMCkNCisJCQkJCXJldHVybiB0cnVlOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwl9Ow0KKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgcmVjTXNnew0KKwkJcHVibGljOg0KKwkJCXVpbnQzMl90IGFyYklkOw0KKwkJCXVpbnQ4X3QgYnl0ZXNbOF07DQorCQkJQ1RSX0NvZGUgZXJyOw0KKwkJCVQgKiBvcGVyYXRvciAtPiAoKQ0KKwkJCXsNCisJCQkJcmV0dXJuIChUICopYnl0ZXM7DQorCQkJfQ0KKwkJCVQgJiBvcGVyYXRvciooKQ0KKwkJCXsNCisJCQkJcmV0dXJuICooVCAqKWJ5dGVzOw0KKwkJCX0NCisJfTsNCisJVUlOVDggX2RldmljZU51bWJlcjsNCisJdm9pZCBSZWdpc3RlclJ4KHVpbnQzMl90IGFyYklkKTsNCisJdm9pZCBSZWdpc3RlclR4KHVpbnQzMl90IGFyYklkLCB1aW50MzJfdCBwZXJpb2RNcyk7DQorDQorCUNUUl9Db2RlIEdldFJ4KHVpbnQzMl90IGFyYklkLHVpbnQ4X3QgKiBkYXRhQnl0ZXMsdWludDMyX3QgdGltZW91dE1zKTsNCisJdm9pZCBGbHVzaFR4KHVpbnQzMl90IGFyYklkKTsNCisNCisJdGVtcGxhdGU8dHlwZW5hbWUgVD4gdHhUYXNrPFQ+IEdldFR4KHVpbnQzMl90IGFyYklkKQ0KKwl7DQorCQl0eFRhc2s8VD4gcmV0dmFsID0gezAsIG51bGxwdHJ9Ow0KKwkJdHhKb2JzX3Q6Oml0ZXJhdG9yIGkgPSBfdHhKb2JzLmZpbmQoYXJiSWQpOw0KKwkJaWYoaSAhPSBfdHhKb2JzLmVuZCgpKXsNCisJCQlyZXR2YWwuYXJiSWQgPSBpLT5zZWNvbmQuYXJiSWQ7DQorCQkJcmV0dmFsLnRvU2VuZCA9IChUKilpLT5zZWNvbmQudG9TZW5kOw0KKwkJfQ0KKwkJcmV0dXJuIHJldHZhbDsNCisJfQ0KKwl0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIEZsdXNoVHgoVCAmIHBhcikNCisJew0KKwkJRmx1c2hUeChwYXIuYXJiSWQpOw0KKwl9DQorDQorCXRlbXBsYXRlPGNsYXNzIFQ+IHJlY01zZzxUPiBHZXRSeCh1aW50MzJfdCBhcmJJZCwgdWludDMyX3QgdGltZW91dE1zKQ0KKwl7DQorCQlyZWNNc2c8VD4gcmV0dmFsOw0KKwkJcmV0dmFsLmVyciA9IEdldFJ4KGFyYklkLHJldHZhbC5ieXRlcywgdGltZW91dE1zKTsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisNCitwcml2YXRlOg0KKw0KKwljbGFzcyB0eEpvYl90IHsNCisJCXB1YmxpYzoNCisJCQl1aW50MzJfdCBhcmJJZDsNCisJCQl1aW50OF90IHRvU2VuZFs4XTsNCisJCQl1aW50MzJfdCBwZXJpb2RNczsNCisJfTsNCisNCisJY2xhc3MgcnhFdmVudF90ew0KKwkJcHVibGljOg0KKwkJCXVpbnQ4X3QgYnl0ZXNbOF07DQorCQkJc3RydWN0IHRpbWVzcGVjIHRpbWU7DQorCQkJcnhFdmVudF90KCkNCisJCQl7DQorCQkJCWJ5dGVzWzBdID0gMDsNCisJCQkJYnl0ZXNbMV0gPSAwOw0KKwkJCQlieXRlc1syXSA9IDA7DQorCQkJCWJ5dGVzWzNdID0gMDsNCisJCQkJYnl0ZXNbNF0gPSAwOw0KKwkJCQlieXRlc1s1XSA9IDA7DQorCQkJCWJ5dGVzWzZdID0gMDsNCisJCQkJYnl0ZXNbN10gPSAwOw0KKwkJCX0NCisJfTsNCisNCisJdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCx0eEpvYl90PiB0eEpvYnNfdDsNCisJdHhKb2JzX3QgX3R4Sm9iczsNCisNCisJdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCxyeEV2ZW50X3Q+IHJ4UnhFdmVudHNfdDsNCisJcnhSeEV2ZW50c190IF9yeFJ4RXZlbnRzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9QQ00uY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9QQ00uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjY1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BDTS5jcHAKQEAgLTAsMCArMSw1NDEgQEAKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyINCisNCisjaW5jbHVkZSAiUENNLmgiDQorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCINCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldA0KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gdXNsZWVwDQorLyogVGhpcyBjYW4gYmUgYSBjb25zdGFudCwgYXMgbG9uZyBhcyBub2JvZHkgbmVlZHMgdG8gdXBkYXRpZSBzb2xlbm9pZHMgd2l0aGluDQorICAgIDEvNTAgb2YgYSBzZWNvbmQuICovDQorc3RhdGljIGNvbnN0IElOVDMyIGtDQU5QZXJpb2QgPSAyMDsNCisNCisjZGVmaW5lIFNUQVRVU18xICAJCQkweDkwNDE0MDANCisjZGVmaW5lIFNUQVRVU19TT0xfRkFVTFRTICAJMHg5MDQxNDQwDQorI2RlZmluZSBTVEFUVVNfREVCVUcgIAkJMHg5MDQxNDgwDQorDQorI2RlZmluZSBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TCSg1MCkNCisjZGVmaW5lIEdFVF9QQ01fU1RBVFVTKCkJCQlDdHJlQ2FuTm9kZTo6cmVjTXNnPFBjbVN0YXR1c190PiAJCXJ4ID0gR2V0Ung8UGNtU3RhdHVzX3Q+CQkJKFNUQVRVU18xLEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMpDQorI2RlZmluZSBHRVRfUENNX1NPTF9GQVVMVFMoKQkJQ3RyZUNhbk5vZGU6OnJlY01zZzxQY21TdGF0dXNGYXVsdF90PiAJcnggPSBHZXRSeDxQY21TdGF0dXNGYXVsdF90PgkoU1RBVFVTX1NPTF9GQVVMVFMsRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisjZGVmaW5lIEdFVF9QQ01fREVCVUcoKQkJCQlDdHJlQ2FuTm9kZTo6cmVjTXNnPFBjbURlYnVnX3Q+IAkJcnggPSBHZXRSeDxQY21EZWJ1Z190PgkJCShTVEFUVVNfREVCVUcsRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCisNCisjZGVmaW5lIENPTlRST0xfMSAJCQkweDA5MDQxQzAwCS8qIFBDTV9Db250cm9sICovDQorI2RlZmluZSBDT05UUk9MXzIgCQkJMHgwOTA0MUM0MAkvKiBQQ01fU3VwcGxlbUNvbnRyb2wgKi8NCisjZGVmaW5lIENPTlRST0xfMyAJCQkweDA5MDQxQzgwCS8qIFBjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3QgKi8NCisNCisvKiBlbmNvZGVyL2RlY29kZXJzICovDQordHlwZWRlZiBzdHJ1Y3QgX1BjbVN0YXR1c190ew0KKwkvKiBCeXRlIDAgKi8NCisJdW5zaWduZWQgU29sZW5vaWRCaXRzOjg7DQorCS8qIEJ5dGUgMSAqLw0KKwl1bnNpZ25lZCBjb21wcmVzc29yT246MTsNCisJdW5zaWduZWQgc3RpY2t5RmF1bHRGdXNlVHJpcHBlZDoxOw0KKwl1bnNpZ25lZCBzdGlja3lGYXVsdENvbXBDdXJyZW50VG9vSGlnaDoxOw0KKwl1bnNpZ25lZCBmYXVsdEZ1c2VUcmlwcGVkOjE7DQorCXVuc2lnbmVkIGZhdWx0Q29tcEN1cnJlbnRUb29IaWdoOjE7DQorCXVuc2lnbmVkIGZhdWx0SGFyZHdhcmVGYWlsdXJlOjE7DQorCXVuc2lnbmVkIGlzQ2xvc2Vsb29wRW5hYmxlZDoxOw0KKwl1bnNpZ25lZCBwcmVzc3VyZVN3aXRjaEVuOjE7DQorCS8qIEJ5dGUgMiovDQorCXVuc2lnbmVkIGJhdHRWb2x0YWdlOjg7DQorCS8qIEJ5dGUgMyAqLw0KKwl1bnNpZ25lZCBzb2xlbm9pZFZvbHRhZ2VUb3A4Ojg7DQorCS8qIEJ5dGUgNCAqLw0KKwl1bnNpZ25lZCBjb21wcmVzc29yQ3VycmVudFRvcDY6NjsNCisJdW5zaWduZWQgc29sZW5vaWRWb2x0YWdlQnRtMjoyOw0KKwkvKiBCeXRlIDUgKi8NCisJdW5zaWduZWQgU3RpY2t5RmF1bHRfZEl0b29IaWdoIDoxOw0KKwl1bnNpZ25lZCBGYXVsdF9kSXRvb0hpZ2ggOjE7DQorCXVuc2lnbmVkIG1vZHVsZUVuYWJsZWQ6MTsNCisJdW5zaWduZWQgY2xvc2VkTG9vcE91dHB1dDoxOw0KKwl1bnNpZ25lZCBjb21wcmVzc29yQ3VycmVudEJ0bTQ6NDsNCisJLyogQnl0ZSA2ICovDQorCXVuc2lnbmVkIHRva2VuU2VlZFRvcDg6ODsNCisJLyogQnl0ZSA3ICovDQorCXVuc2lnbmVkIHRva2VuU2VlZEJ0bTg6ODsNCit9UGNtU3RhdHVzX3Q7DQorDQordHlwZWRlZiBzdHJ1Y3QgX1BjbUNvbnRyb2xfdHsNCisJLyogQnl0ZSAwICovDQorCXVuc2lnbmVkIHRva2VuVG9wODo4Ow0KKwkvKiBCeXRlIDEgKi8NCisJdW5zaWduZWQgdG9rZW5CdG04Ojg7DQorCS8qIEJ5dGUgMiAqLw0KKwl1bnNpZ25lZCBzb2xlbm9pZEJpdHM6ODsNCisJLyogQnl0ZSAzKi8NCisJdW5zaWduZWQgcmVzZXJ2ZWQ6NDsNCisJdW5zaWduZWQgY2xvc2VMb29wT3V0cHV0OjE7DQorCXVuc2lnbmVkIGNvbXByZXNzb3JPbjoxOw0KKwl1bnNpZ25lZCBjbG9zZWRMb29wRW5hYmxlOjE7DQorCXVuc2lnbmVkIGNsZWFyU3RpY2t5RmF1bHRzOjE7DQorCS8qIEJ5dGUgNCAqLw0KKwl1bnNpZ25lZCBPbmVTaG90RmllbGRfaDg6ODsNCisJLyogQnl0ZSA1ICovDQorCXVuc2lnbmVkIE9uZVNob3RGaWVsZF9sODo4Ow0KK31QY21Db250cm9sX3Q7DQorDQordHlwZWRlZiBzdHJ1Y3QgX1BjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3R7DQorCXVpbnQ4X3Qgc29sMTBNc1BlclVuaXRbOF07DQorfVBjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3Q7DQorDQordHlwZWRlZiBzdHJ1Y3QgX1BjbVN0YXR1c0ZhdWx0X3R7DQorCS8qIEJ5dGUgMCAqLw0KKwl1bnNpZ25lZCBTb2xlbm9pZEJsYWNrbGlzdDo4Ow0KKwkvKiBCeXRlIDEgKi8NCisJdW5zaWduZWQgcmVzZXJ2ZWRfYml0MCA6MTsNCisJdW5zaWduZWQgcmVzZXJ2ZWRfYml0MSA6MTsNCisJdW5zaWduZWQgcmVzZXJ2ZWRfYml0MiA6MTsNCisJdW5zaWduZWQgcmVzZXJ2ZWRfYml0MyA6MTsNCisJdW5zaWduZWQgU3RpY2t5RmF1bHRfQ29tcE5vQ3VycmVudCA6MTsNCisJdW5zaWduZWQgRmF1bHRfQ29tcE5vQ3VycmVudCA6MTsNCisJdW5zaWduZWQgU3RpY2t5RmF1bHRfU29sZW5vaWRKdW1wZXIgOjE7DQorCXVuc2lnbmVkIEZhdWx0X1NvbGVub2lkSnVtcGVyIDoxOw0KK31QY21TdGF0dXNGYXVsdF90Ow0KKw0KK3R5cGVkZWYgc3RydWN0IF9QY21EZWJ1Z190ew0KKwl1bnNpZ25lZCB0b2tGYWlsc1RvcDg6ODsNCisJdW5zaWduZWQgdG9rRmFpbHNCdG04Ojg7DQorCXVuc2lnbmVkIGxhc3RGYWlsZWRUb2tUb3A4Ojg7DQorCXVuc2lnbmVkIGxhc3RGYWlsZWRUb2tCdG04Ojg7DQorCXVuc2lnbmVkIHRva1N1Y2Nlc3NUb3A4Ojg7DQorCXVuc2lnbmVkIHRva1N1Y2Nlc3NCdG04Ojg7DQorfVBjbURlYnVnX3Q7DQorDQorDQorLyogUENNIENvbnN0cnVjdG9yIC0gQ2xlYXJzIGFsbCB2YXJzLCBlc3RhYmxpc2hlcyBkZWZhdWx0IHNldHRpbmdzLCBzdGFydHMgUENNIGJhY2tncm91bmQgcHJvY2Vzcw0KKyAqDQorICogQFJldHVybgktCXZvaWQNCisgKg0KKyAqIEBQYXJhbSAJLQlkZXZpY2VOdW1iZXIJLSAJRGV2aWNlIElEIG9mIFBDTSB0byBiZSBjb250cm9sbGVkDQorICovDQorUENNOjpQQ00oVUlOVDggZGV2aWNlTnVtYmVyKTogQ3RyZUNhbk5vZGUoZGV2aWNlTnVtYmVyKQ0KK3sNCisJUmVnaXN0ZXJSeChTVEFUVVNfMSB8IGRldmljZU51bWJlciApOw0KKwlSZWdpc3RlclJ4KFNUQVRVU19TT0xfRkFVTFRTIHwgZGV2aWNlTnVtYmVyICk7DQorCVJlZ2lzdGVyUngoU1RBVFVTX0RFQlVHIHwgZGV2aWNlTnVtYmVyICk7DQorCVJlZ2lzdGVyVHgoQ09OVFJPTF8xIHwgZGV2aWNlTnVtYmVyLCBrQ0FOUGVyaW9kKTsNCisJLyogZW5hYmxlIGNsb3NlIGxvb3AgKi8NCisJU2V0Q2xvc2VkTG9vcENvbnRyb2woMSk7DQorfQ0KKy8qIFBDTSBEJ3Rvcg0KKyAqLw0KK1BDTTo6flBDTSgpDQorew0KKw0KK30NCisNCisvKiBTZXQgUENNIHNvbGVub2lkIHN0YXRlDQorICoNCisgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpIGZvciBzZXR0aW5nIHNvbGVub2lkDQorICoNCisgKiBAUGFyYW0gCS0JaWR4CQkJLSAJSUQgb2Ygc29sZW5vaWQgKDAtNykNCisgKiBAUGFyYW0gCS0JZW4JCQktIAlFbmFibGUgLyBEaXNhYmxlIGlkZW50aWZpZWQgc29sZW5vaWQNCisgKi8NCitDVFJfQ29kZSBQQ006OlNldFNvbGVub2lkcyh1aW50OF90IHZhbHVlLCB1aW50OF90IG1hc2spDQorew0KKwlDdHJlQ2FuTm9kZTo6dHhUYXNrPFBjbUNvbnRyb2xfdD4gdG9GaWxsID0gR2V0VHg8UGNtQ29udHJvbF90PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCWlmKHRvRmlsbC5Jc0VtcHR5KCkpcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQorCXRvRmlsbC0+c29sZW5vaWRCaXRzIHw9IG1hc2sgJiB2YWx1ZTsNCisJdG9GaWxsLT5zb2xlbm9pZEJpdHMgJj0gfihtYXNrICYgfnZhbHVlKTsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKw0KKy8qIENsZWFycyBQQ00gc3RpY2t5IGZhdWx0cyAoaW5kaWNhdG9ycyBvZiBwYXN0IGZhdWx0cw0KKyAqDQorICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KSBmb3Igc2V0dGluZyBzb2xlbm9pZA0KKyAqDQorICogQFBhcmFtIAktCWNscgkJLSAJQ2xlYXIgLyBkbyBub3QgY2xlYXIgZmF1bHRzDQorICovDQorQ1RSX0NvZGUgUENNOjpDbGVhclN0aWNreUZhdWx0cygpDQorew0KKwlpbnQzMl90IHN0YXR1cyA9IDA7DQorCXVpbnQ4X3QgcGNtU3VwcGxlbUNvbnRyb2xbXSA9IHsgMCwgMCwgMCwgMHg4MCB9OyAvKiBvbmx5IGJpdCBzZXQgaXMgQ2xlYXJTdGlja3lGYXVsdHMgKi8NCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8yICB8IEdldERldmljZU51bWJlcigpLCBwY21TdXBwbGVtQ29udHJvbCwgc2l6ZW9mKHBjbVN1cHBsZW1Db250cm9sKSwgMCwgJnN0YXR1cyk7DQorCWlmKHN0YXR1cykNCisJCXJldHVybiBDVFJfVHhGYWlsZWQ7DQorCXJldHVybiBDVFJfT0tBWTsNCit9DQorDQorLyogRW5hYmxlcyBQQ00gQ2xvc2VkIExvb3AgQ29udHJvbCBvZiBDb21wcmVzc29yIHZpYSBwcmVzc3VyZSBzd2l0Y2gNCisgKg0KKyAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkgZm9yIHNldHRpbmcgc29sZW5vaWQNCisgKg0KKyAqIEBQYXJhbSAJLQllbgkJLSAJRW5hYmxlIC8gRGlzYWJsZSBDbG9zZWQgTG9vcCBDb250cm9sDQorICovDQorQ1RSX0NvZGUgUENNOjpTZXRDbG9zZWRMb29wQ29udHJvbChib29sIGVuKQ0KK3sNCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxQY21Db250cm9sX3Q+IHRvRmlsbCA9IEdldFR4PFBjbUNvbnRyb2xfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KKwlpZih0b0ZpbGwuSXNFbXB0eSgpKXJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwl0b0ZpbGwtPmNsb3NlZExvb3BFbmFibGUgPSBlbjsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8qIEdldCBzb2xlbm9pZCBCbGFja2xpc3Qgc3RhdHVzDQorICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAqIEBQYXJhbQktCWlkeAkJCS0JSUQgb2Ygc29sZW5vaWQgWzAsN10gdG8gZmlyZSBvbmUgc2hvdCBwdWxzZS4NCisgKi8NCitDVFJfQ29kZSBQQ006OkZpcmVPbmVTaG90U29sZW5vaWQoVUlOVDggaWR4KQ0KK3sNCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxQY21Db250cm9sX3Q+IHRvRmlsbCA9IEdldFR4PFBjbUNvbnRyb2xfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KKwlpZih0b0ZpbGwuSXNFbXB0eSgpKXJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KKwkvKiBncmFiIGZpZWxkIGFzIGl0IGlzIG5vdyAqLw0KKwl1aW50MTZfdCBvbmVTaG90RmllbGQ7DQorCW9uZVNob3RGaWVsZCA9IHRvRmlsbC0+T25lU2hvdEZpZWxkX2g4Ow0KKwlvbmVTaG90RmllbGQgPDw9IDg7DQorCW9uZVNob3RGaWVsZCB8PSB0b0ZpbGwtPk9uZVNob3RGaWVsZF9sODsNCisJLyogZ2V0IHRoZSBjYWxsZXIncyBjaGFubmVsICovDQorCXVpbnQxNl90IHNoaWZ0ID0gMippZHg7DQorCXVpbnQxNl90IG1hc2sgPSAzOyAvKiB0d28gYml0cyB3aWRlICovDQorCXVpbnQ4X3QgY2hCaXRzID0gKG9uZVNob3RGaWVsZCA+PiBzaGlmdCkgJiBtYXNrOw0KKwkvKiBmbGlwIGl0ICovDQorCWNoQml0cyA9IChjaEJpdHMpJTMgKyAxOw0KKwkvKiBjbGVhciBvdXQgMmJpdHMgZm9yIHRoaXMgY2hhbm5lbCovDQorCW9uZVNob3RGaWVsZCAmPSB+KG1hc2sgPDwgc2hpZnQpOw0KKwkvKiBwdXQgbmV3IGZpZWxkIGluICovDQorCW9uZVNob3RGaWVsZCB8PSBjaEJpdHMgPDwgc2hpZnQ7DQorCS8qIGFwcGx5IGZpZWxkIGFzIGl0IGlzIG5vdyAqLw0KKwl0b0ZpbGwtPk9uZVNob3RGaWVsZF9oOCA9IG9uZVNob3RGaWVsZCA+PiA4Ow0KKwl0b0ZpbGwtPk9uZVNob3RGaWVsZF9sOCA9IG9uZVNob3RGaWVsZDsNCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8qIENvbmZpZ3VyZSB0aGUgcHVsc2Ugd2lkdGggb2YgYSBzb2xlbm9pZCBjaGFubmVsIGZvciBvbmUtc2hvdCBwdWxzZS4NCisgKiBQcmVwcm9ncmFtbWVkIHB1bHNld2lkdGggaXMgMTBtcyByZXNvbHV0ZSBhbmQgY2FuIGJlIGJldHdlZW4gMjBtcyBhbmQgNS4xcy4NCisgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBzb2xlbm9pZCBbMCw3XSB0byBjb25maWd1cmUuDQorICogQFBhcmFtCS0JZHVyTXMJCS0JcHVsc2Ugd2lkdGggaW4gbXMuDQorICovDQorQ1RSX0NvZGUgUENNOjpTZXRPbmVTaG90RHVyYXRpb25NcyhVSU5UOCBpZHgsdWludDMyX3QgZHVyTXMpDQorew0KKwkvKiBzYW5pdHkgY2hlY2sgY2FsbGVyJ3MgcGFyYW0gKi8NCisJaWYoaWR4ID4gOCkNCisJCXJldHVybiBDVFJfSW52YWxpZFBhcmFtVmFsdWU7DQorCS8qIGdldCBsYXRlc3QgdHggZnJhbWUgKi8NCisJQ3RyZUNhbk5vZGU6OnR4VGFzazxQY21Db250cm9sU2V0T25lU2hvdER1cl90PiB0b0ZpbGwgPSBHZXRUeDxQY21Db250cm9sU2V0T25lU2hvdER1cl90PihDT05UUk9MXzMgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCWlmKHRvRmlsbC5Jc0VtcHR5KCkpew0KKwkJLyogb25seSBzZW5kIHRoaXMgb3V0IGlmIGNhbGxlciB3YW50cyB0byBkbyBvbmUtc2hvdHMgKi8NCisJCVJlZ2lzdGVyVHgoQ09OVFJPTF8zIHwgX2RldmljZU51bWJlciwga0NBTlBlcmlvZCk7DQorCQkvKiBncmFiIGl0ICovDQorCQl0b0ZpbGwgPSBHZXRUeDxQY21Db250cm9sU2V0T25lU2hvdER1cl90PihDT05UUk9MXzMgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQorCX0NCisJdG9GaWxsLT5zb2wxME1zUGVyVW5pdFtpZHhdID0gc3RkOjptaW4oZHVyTXMvMTAsKHVpbnQzMl90KTB4RkYpOw0KKwkvKiBhcHBseSB0aGUgbmV3IGRhdGEgYnl0ZXMgKi8NCisJRmx1c2hUeCh0b0ZpbGwpOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKw0KKy8qIEdldCBzb2xlbm9pZCBzdGF0ZQ0KKyAqDQorICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIHNvbGVub2lkIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQ0KKyAqDQorICogQFBhcmFtIAktCWlkeAkJLSAJSUQgb2Ygc29sZW5vaWQgKDAtNykgdG8gcmV0dXJuIHN0YXR1cyBvZg0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0U29sZW5vaWQoVUlOVDggaWR4LCBib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSAocngtPlNvbGVub2lkQml0cyAmICgxdWw8PChpZHgpKSApID8gMSA6IDA7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCBwcmVzc3VyZSBzd2l0Y2ggc3RhdGUNCisgKg0KKyAqIEBSZXR1cm4JLQlUcnVlL0ZhbHNlCS0JVHJ1ZSBpZiBwcmVzc3VyZSBhZGVxdWF0ZSwgZmFsc2UgaWYgbG93DQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRQcmVzc3VyZShib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSAocngtPnByZXNzdXJlU3dpdGNoRW4gKSA/IDEgOiAwOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisNCisvKiBHZXQgY29tcHJlc3NvciBzdGF0ZQ0KKyAqDQorICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIGVuYWJsZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3Nvcihib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSAocngtPmNvbXByZXNzb3JPbik7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCBjbG9zZWQgbG9vcCBjb250cm9sIHN0YXRlDQorICoNCisgKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgY2xvc2VkIGxvb3AgZW5hYmxlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRDbG9zZWRMb29wQ29udHJvbChib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSAocngtPmlzQ2xvc2Vsb29wRW5hYmxlZCk7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCBjb21wcmVzc29yIGN1cnJlbnQgZHJhdw0KKyAqDQorICogQFJldHVybgktCUFtcGVyZXMJLQlDb21wcmVzc29yIGN1cnJlbnQNCisgKi8NCitDVFJfQ29kZSBQQ006OkdldENvbXByZXNzb3JDdXJyZW50KGZsb2F0ICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwl1aW50MzJfdCB0ZW1wID0ocngtPmNvbXByZXNzb3JDdXJyZW50VG9wNik7DQorCXRlbXAgPDw9IDQ7DQorCXRlbXAgfD0gIHJ4LT5jb21wcmVzc29yQ3VycmVudEJ0bTQ7DQorCXN0YXR1cyA9IHRlbXAgKiAwLjAzMTI1OyAvKiA1LjUgZml4ZWQgcHQgdmFsdWUgaW4gQW1wcyAqLw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisNCisvKiBHZXQgdm9sdGFnZSBhY3Jvc3Mgc29sZW5vaWQgcmFpbA0KKyAqDQorICogQFJldHVybgktCVZvbHRzCS0JVm9sdGFnZSBhY3Jvc3Mgc29sZW5vaWQgcmFpbA0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0U29sZW5vaWRWb2x0YWdlKGZsb2F0ICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwl1aW50MzJfdCByYXcgPShyeC0+c29sZW5vaWRWb2x0YWdlVG9wOCk7DQorCXJhdyA8PD0gMjsNCisJcmF3IHw9ICByeC0+c29sZW5vaWRWb2x0YWdlQnRtMjsNCisJc3RhdHVzID0gKGRvdWJsZSkgcmF3ICogMC4wMzEyNTsgLyogNS41IGZpeGVkIHB0IHZhbHVlIGluIFZvbHRzICovDQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCBoYXJkd2FyZSBmYXVsdCB2YWx1ZQ0KKyAqDQorICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIGhhcmR3YXJlIGZhaWx1cmUgZGV0ZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0SGFyZHdhcmVGYXVsdChib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSByeC0+ZmF1bHRIYXJkd2FyZUZhaWx1cmU7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKw0KKy8qIEdldCBjb21wcmVzc29yIGZhdWx0IHZhbHVlDQorICoNCisgKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgc2hvcnRlZCBjb21wcmVzc29yIGRldGVjdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgKi8NCitDVFJfQ29kZSBQQ006OkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IHJ4LT5mYXVsdENvbXBDdXJyZW50VG9vSGlnaDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorQ1RSX0NvZGUgUENNOjpHZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IHJ4LT5TdGlja3lGYXVsdF9kSXRvb0hpZ2g7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3NvclNob3J0ZWRGYXVsdChib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSByeC0+RmF1bHRfZEl0b29IaWdoOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBQQ006OkdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdChib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NPTF9GQVVMVFMoKTsNCisJc3RhdHVzID0gcngtPlN0aWNreUZhdWx0X0NvbXBOb0N1cnJlbnQ7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU09MX0ZBVUxUUygpOw0KKwlzdGF0dXMgPSByeC0+RmF1bHRfQ29tcE5vQ3VycmVudDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorDQorLyogR2V0IHNvbGVub2lkIGZhdWx0IHZhbHVlDQorICoNCisgKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgc2hvcnRlZCBzb2xlbm9pZCBkZXRlY3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRTb2xlbm9pZEZhdWx0KGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU1RBVFVTKCk7DQorCXN0YXR1cyA9IHJ4LT5mYXVsdEZ1c2VUcmlwcGVkOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisNCisvKiBHZXQgY29tcHJlc3NvciBzdGlja3kgZmF1bHQgdmFsdWUNCisgKg0KKyAqIEBSZXR1cm4JLQlUcnVlL0ZhbHNlCS0JVHJ1ZSBpZiBzb2xlbm9pZCBoYWQgcHJldmlvdXNseSBiZWVuIHNob3J0ZWQNCisgKiAJCQkJCQkJCShhbmQgc3RpY2t5IGZhdWx0IHdhcyBub3QgY2xlYXJlZCksIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoYm9vbCAmc3RhdHVzKQ0KK3sNCisJR0VUX1BDTV9TVEFUVVMoKTsNCisJc3RhdHVzID0gcngtPnN0aWNreUZhdWx0Q29tcEN1cnJlbnRUb29IaWdoOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisNCisvKiBHZXQgc29sZW5vaWQgc3RpY2t5IGZhdWx0IHZhbHVlDQorICoNCisgKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgY29tcHJlc3NvciBoYWQgcHJldmlvdXNseSBiZWVuIHNob3J0ZWQNCisgKiAJCQkJCQkJCShhbmQgc3RpY2t5IGZhdWx0IHdhcyBub3QgY2xlYXJlZCksIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0U29sZW5vaWRTdGlja3lGYXVsdChib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSByeC0+c3RpY2t5RmF1bHRGdXNlVHJpcHBlZDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorLyogR2V0IGJhdHRlcnkgdm9sdGFnZQ0KKyAqDQorICogQFJldHVybgktCVZvbHRzCS0JVm9sdGFnZSBhY3Jvc3MgUENNIHBvd2VyIHBvcnRzDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXRCYXR0ZXJ5Vm9sdGFnZShmbG9hdCAmc3RhdHVzKQ0KK3sNCisJR0VUX1BDTV9TVEFUVVMoKTsNCisJc3RhdHVzID0gKGZsb2F0KXJ4LT5iYXR0Vm9sdGFnZSAqIDAuMDUgKyA0LjA7IC8qIDUwbVYgcGVyIHVuaXQgcGx1cyA0Vi4gKi8NCisJcmV0dXJuIHJ4LmVycjsNCit9DQorLyogUmV0dXJuIHN0YXR1cyBvZiBtb2R1bGUgZW5hYmxlL2Rpc2FibGUNCisgKg0KKyAqIEBSZXR1cm4JLQlib29sCQktCVJldHVybnMgVFJVRSBpZiBQQ00gaXMgZW5hYmxlZCwgRkFMU0UgaWYgZGlzYWJsZWQNCisgKi8NCitDVFJfQ29kZSBQQ006OmlzTW9kdWxlRW5hYmxlZChib29sICZzdGF0dXMpDQorew0KKwlHRVRfUENNX1NUQVRVUygpOw0KKwlzdGF0dXMgPSByeC0+bW9kdWxlRW5hYmxlZDsNCisJcmV0dXJuIHJ4LmVycjsNCit9DQorLyogR2V0IG51bWJlciBvZiB0b3RhbCBmYWlsZWQgUENNIENvbnRyb2wgRnJhbWUNCisgKg0KKyAqIEBSZXR1cm4JLQlGYWlsZWQgQ29udHJvbCBGcmFtZXMJLQlOdW1iZXIgb2YgZmFpbGVkIGNvbnRyb2wgZnJhbWVzICh0b2tlbml6YXRpb24gZmFpbHMpDQorICoNCisgKiBAV0FSTklORwktCVJldHVybiBvbmx5IHZhbGlkIGlmIFtTZWVrRGVidWdGcmFtZXNdIGlzIGVuYWJsZWQNCisgKiAJCQkJU2VlIGZ1bmN0aW9uIFNlZWtEZWJ1Z0ZyYW1lcw0KKyAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla0RlYnVnRnJhbWVzDQorICovDQorQ1RSX0NvZGUgUENNOjpHZXROdW1iZXJPZkZhaWxlZENvbnRyb2xGcmFtZXMoVUlOVDE2ICZzdGF0dXMpDQorew0KKwlHRVRfUENNX0RFQlVHKCk7DQorCXN0YXR1cyA9IHJ4LT50b2tGYWlsc1RvcDg7DQorCXN0YXR1cyA8PD0gODsNCisJc3RhdHVzIHw9IHJ4LT50b2tGYWlsc0J0bTg7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKy8qIEdldCByYXcgU29sZW5vaWQgQmxhY2tsaXN0DQorICoNCisgKiBAUmV0dXJuCS0JQklOQVJZCS0JUmF3IGJpbmFyeSBicmVha2Rvd24gb2YgU29sZW5vaWQgQmxhY2tsaXN0DQorICogCQkJCQkJCUJJVDcgPSBTb2xlbm9pZCAxLCBCSVQ2ID0gU29sZW5vaWQgMiwgZXRjLg0KKyAqDQorICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla1N0YXR1c0ZhdWx0RnJhbWVzXSBpcyBlbmFibGVkDQorICogCQkJCVNlZSBmdW5jdGlvbiBTZWVrU3RhdHVzRmF1bHRGcmFtZXMNCisgKiAJCQkJU2VlIGZ1bmN0aW9uIEVuYWJsZVNlZWtTdGF0dXNGYXVsdEZyYW1lcw0KKyAqLw0KK0NUUl9Db2RlIFBDTTo6R2V0U29sZW5vaWRCbGFja0xpc3QoVUlOVDggJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU09MX0ZBVUxUUygpOw0KKwlzdGF0dXMgPSByeC0+U29sZW5vaWRCbGFja2xpc3Q7DQorCXJldHVybiByeC5lcnI7DQorfQ0KKy8qIEdldCBzb2xlbm9pZCBCbGFja2xpc3Qgc3RhdHVzDQorICogLSBCbGFja2xpc3RlZCBzb2xlbm9pZHMgY2Fubm90IGJlIGVuYWJsZWQgdW50aWwgUENNIGlzIHBvd2VyIGN5Y2xlZA0KKyAqDQorICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIFNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgKg0KKyAqIEBQYXJhbQktCWlkeAkJCS0JSUQgb2Ygc29sZW5vaWQgWzAsN10NCisgKg0KKyAqIEBXQVJOSU5HCS0JUmV0dXJuIG9ubHkgdmFsaWQgaWYgW1NlZWtTdGF0dXNGYXVsdEZyYW1lc10gaXMgZW5hYmxlZA0KKyAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQorICogCQkJCVNlZSBmdW5jdGlvbiBFbmFibGVTZWVrU3RhdHVzRmF1bHRGcmFtZXMNCisgKi8NCitDVFJfQ29kZSBQQ006OklzU29sZW5vaWRCbGFja2xpc3RlZChVSU5UOCBpZHgsIGJvb2wgJnN0YXR1cykNCit7DQorCUdFVF9QQ01fU09MX0ZBVUxUUygpOw0KKwlzdGF0dXMgPSAocngtPlNvbGVub2lkQmxhY2tsaXN0ICYgKDF1bDw8KGlkeCkpICk/IDEgOiAwOw0KKwlyZXR1cm4gcnguZXJyOw0KK30NCisvLy0tLS0tLS0tLS0tLS0tLS0tLSBDIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQorZXh0ZXJuICJDIiB7DQorCXZvaWQgKiBjX1BDTV9Jbml0KHZvaWQpIHsNCisJCXJldHVybiBuZXcgUENNKCk7DQorCX0NCisJQ1RSX0NvZGUgY19TZXRTb2xlbm9pZCh2b2lkICogaGFuZGxlLCB1aW50OF90IHZhbHVlLCB1aW50OF90IG1hc2spIHsNCisJCXJldHVybiAoKFBDTSopIGhhbmRsZSktPlNldFNvbGVub2lkcyh2YWx1ZSwgbWFzayk7DQorCX0NCisJQ1RSX0NvZGUgY19TZXRDbG9zZWRMb29wQ29udHJvbCh2b2lkICogaGFuZGxlLCBJTlQ4IHBhcmFtKSB7DQorCQlyZXR1cm4gKChQQ00qKSBoYW5kbGUpLT5TZXRDbG9zZWRMb29wQ29udHJvbChwYXJhbSk7DQorCX0NCisJQ1RSX0NvZGUgY19DbGVhclN0aWNreUZhdWx0cyh2b2lkICogaGFuZGxlLCBJTlQ4IHBhcmFtKSB7DQorCQlyZXR1cm4gKChQQ00qKSBoYW5kbGUpLT5DbGVhclN0aWNreUZhdWx0cygpOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0U29sZW5vaWQodm9pZCAqIGhhbmRsZSwgVUlOVDggaWR4LCBJTlQ4ICogc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldFNvbGVub2lkKGlkeCwgYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRQcmVzc3VyZSh2b2lkICogaGFuZGxlLCBJTlQ4ICogc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldFByZXNzdXJlKGJzdGF0dXMpOw0KKwkJKnN0YXR1cyA9IGJzdGF0dXM7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3Nvcih2b2lkICogaGFuZGxlLCBJTlQ4ICogc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldENvbXByZXNzb3IoYnN0YXR1cyk7DQorCQkqc3RhdHVzID0gYnN0YXR1czsNCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRDbG9zZWRMb29wQ29udHJvbCh2b2lkICogaGFuZGxlLCBJTlQ4ICogc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldENsb3NlZExvb3BDb250cm9sKGJzdGF0dXMpOw0KKwkJKnN0YXR1cyA9IGJzdGF0dXM7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3NvckN1cnJlbnQodm9pZCAqIGhhbmRsZSwgZmxvYXQgKiBzdGF0dXMpIHsNCisJCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q29tcHJlc3NvckN1cnJlbnQoKnN0YXR1cyk7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0U29sZW5vaWRWb2x0YWdlKHZvaWQgKiBoYW5kbGUsIGZsb2F0KnN0YXR1cykgew0KKwkJcmV0dXJuICgoUENNKikgaGFuZGxlKS0+R2V0U29sZW5vaWRWb2x0YWdlKCpzdGF0dXMpOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0SGFyZHdhcmVGYXVsdCh2b2lkICogaGFuZGxlLCBJTlQ4KnN0YXR1cykgew0KKwkJYm9vbCBic3RhdHVzOw0KKwkJQ1RSX0NvZGUgcmV0dmFsID0gKChQQ00qKSBoYW5kbGUpLT5HZXRIYXJkd2FyZUZhdWx0KGJzdGF0dXMpOw0KKwkJKnN0YXR1cyA9IGJzdGF0dXM7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3NvckZhdWx0KHZvaWQgKiBoYW5kbGUsIElOVDgqc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KGJzdGF0dXMpOw0KKwkJKnN0YXR1cyA9IGJzdGF0dXM7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0U29sZW5vaWRGYXVsdCh2b2lkICogaGFuZGxlLCBJTlQ4KnN0YXR1cykgew0KKwkJYm9vbCBic3RhdHVzOw0KKwkJQ1RSX0NvZGUgcmV0dmFsID0gKChQQ00qKSBoYW5kbGUpLT5HZXRTb2xlbm9pZEZhdWx0KGJzdGF0dXMpOw0KKwkJKnN0YXR1cyA9IGJzdGF0dXM7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3NvclN0aWNreUZhdWx0KHZvaWQgKiBoYW5kbGUsIElOVDgqc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KGJzdGF0dXMpOw0KKwkJKnN0YXR1cyA9IGJzdGF0dXM7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0U29sZW5vaWRTdGlja3lGYXVsdCh2b2lkICogaGFuZGxlLCBJTlQ4KnN0YXR1cykgew0KKwkJYm9vbCBic3RhdHVzOw0KKwkJQ1RSX0NvZGUgcmV0dmFsID0gKChQQ00qKSBoYW5kbGUpLT5HZXRTb2xlbm9pZFN0aWNreUZhdWx0KGJzdGF0dXMpOw0KKwkJKnN0YXR1cyA9IGJzdGF0dXM7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0QmF0dGVyeVZvbHRhZ2Uodm9pZCAqIGhhbmRsZSwgZmxvYXQqc3RhdHVzKSB7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldEJhdHRlcnlWb2x0YWdlKCpzdGF0dXMpOw0KKwkJcmV0dXJuIHJldHZhbDsNCisJfQ0KKwl2b2lkIGNfU2V0RGV2aWNlTnVtYmVyX1BDTSh2b2lkICogaGFuZGxlLCBVSU5UOCBkZXZpY2VOdW1iZXIpIHsNCisJfQ0KKwlDVFJfQ29kZSBjX0dldE51bWJlck9mRmFpbGVkQ29udHJvbEZyYW1lcyh2b2lkICogaGFuZGxlLCBVSU5UMTYqc3RhdHVzKSB7DQorCQlyZXR1cm4gKChQQ00qKSBoYW5kbGUpLT5HZXROdW1iZXJPZkZhaWxlZENvbnRyb2xGcmFtZXMoKnN0YXR1cyk7DQorCX0NCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZEJsYWNrTGlzdCh2b2lkICogaGFuZGxlLCBVSU5UOCAqc3RhdHVzKSB7DQorCQlyZXR1cm4gKChQQ00qKSBoYW5kbGUpLT5HZXRTb2xlbm9pZEJsYWNrTGlzdCgqc3RhdHVzKTsNCisJfQ0KKwlDVFJfQ29kZSBjX0lzU29sZW5vaWRCbGFja2xpc3RlZCh2b2lkICogaGFuZGxlLCBVSU5UOCBpZHgsIElOVDgqc3RhdHVzKSB7DQorCQlib29sIGJzdGF0dXM7DQorCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPklzU29sZW5vaWRCbGFja2xpc3RlZChpZHgsIGJzdGF0dXMpOw0KKwkJKnN0YXR1cyA9IGJzdGF0dXM7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvUENNLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BDTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZGZjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BDTS5oCkBAIC0wLDAgKzEsMjEyIEBACisjaWZuZGVmIFBDTV9IXw0KKyNkZWZpbmUgUENNX0hfDQorI2luY2x1ZGUgImN0cmUuaCIJCQkJLy9CSVQgRGVmaW5lcyArIFR5cGVkZWZzDQorI2luY2x1ZGUgPE5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaD4JLy9DQU4gQ29tbQ0KKyNpbmNsdWRlICJDdHJlQ2FuTm9kZS5oIg0KKyNpbmNsdWRlIDxwdGhyZWFkLmg+DQorY2xhc3MgUENNIDogcHVibGljIEN0cmVDYW5Ob2RlDQorew0KK3B1YmxpYzoNCisgICAgUENNKFVJTlQ4IGRldmljZU51bWJlcj0wKTsNCisgICAgflBDTSgpOw0KKyAgICANCisgICAgLyogU2V0IFBDTSBzb2xlbm9pZHMgc3RhdGUNCisgICAgICoNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KSBmb3Igc2V0dGluZyBzb2xlbm9pZHMNCisgICAgICogQFBhcmFtIAktCXZhbHVlCQktIAlWYWx1ZXMgZm9yIHNwZWNpZmllZCBzb2xlbm9pZHMNCisgICAgICogQFBhcmFtIAktCW1hc2sJCS0gCU1hc2sgb2Ygc29sZW5vaWRzIHRvIHNldA0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCVNldFNvbGVub2lkcyh1aW50OF90IHZhbHVlLCB1aW50OF90IG1hc2spOw0KKw0KKyAgICAvKiBFbmFibGVzIFBDTSBDbG9zZWQgTG9vcCBDb250cm9sIG9mIENvbXByZXNzb3IgdmlhIHByZXNzdXJlIHN3aXRjaA0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpIGZvciBzZXR0aW5nIHNvbGVub2lkDQorICAgICAqIEBQYXJhbSAJLQllbgkJLSAJRW5hYmxlIC8gRGlzYWJsZSBDbG9zZWQgTG9vcCBDb250cm9sDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJU2V0Q2xvc2VkTG9vcENvbnRyb2woYm9vbCBlbik7DQorDQorICAgIC8qIENsZWFycyBQQ00gc3RpY2t5IGZhdWx0cyAoaW5kaWNhdG9ycyBvZiBwYXN0IGZhdWx0cw0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpIGZvciBzZXR0aW5nIHNvbGVub2lkDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJQ2xlYXJTdGlja3lGYXVsdHMoKTsNCisgICAgDQorICAgIC8qIEdldCBzb2xlbm9pZCBzdGF0ZQ0KKyAgICAgKg0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbSAJLQlpZHgJCS0gCUlEIG9mIHNvbGVub2lkICgwLTcpIHRvIHJldHVybiBpZiBzb2xlbm9pZCBpcyBvbi4NCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCS0JT0sgaWYgc29sZW5vaWQgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0U29sZW5vaWQoVUlOVDggaWR4LCBib29sICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgcHJlc3N1cmUgc3dpdGNoIHN0YXRlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgcHJlc3N1cmUgYWRlcXVhdGUsIGZhbHNlIGlmIGxvdw0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldFByZXNzdXJlKGJvb2wgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBjb21wcmVzc29yIHN0YXRlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgY29tcHJlc3Mgb3VwdXQgaXMgb24sIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUJR2V0Q29tcHJlc3Nvcihib29sICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgY2xvc2VkIGxvb3AgY29udHJvbCBzdGF0ZQ0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwktCVRydWUgaWYgY2xvc2VkIGxvb3AgZW5hYmxlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0Q2xvc2VkTG9vcENvbnRyb2woYm9vbCAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IGNvbXByZXNzb3IgY3VycmVudCBkcmF3DQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCUNvbXByZXNzb3IgY3VycmVudCByZXR1cm5lZCBpbiBBbXBlcmVzIChBKQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JDdXJyZW50KGZsb2F0ICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgdm9sdGFnZSBhY3Jvc3Mgc29sZW5vaWQgcmFpbA0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlWb2x0YWdlIGFjcm9zcyBzb2xlbm9pZCByYWlsIGluIFZvbHRzIChWKQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldFNvbGVub2lkVm9sdGFnZShmbG9hdCAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IGhhcmR3YXJlIGZhdWx0IHZhbHVlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgaGFyZHdhcmUgZmFpbHVyZSBkZXRlY3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0SGFyZHdhcmVGYXVsdChib29sICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgY29tcHJlc3NvciBmYXVsdCB2YWx1ZQ0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIGFibm9ybWFsbHkgaGlnaCBjb21wcmVzc29yIGN1cnJlbnQgZGV0ZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KGJvb2wgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBzb2xlbm9pZCBmYXVsdCB2YWx1ZQ0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIHNob3J0ZWQgc29sZW5vaWQgZGV0ZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldFNvbGVub2lkRmF1bHQoYm9vbCAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IGNvbXByZXNzb3Igc3RpY2t5IGZhdWx0IHZhbHVlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgc29sZW5vaWQgaGFkIHByZXZpb3VzbHkgYmVlbiBzaG9ydGVkDQorICAgICAqIAkJCQkJCQkJKGFuZCBzdGlja3kgZmF1bHQgd2FzIG5vdCBjbGVhcmVkKSwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoYm9vbCAmc3RhdHVzKTsNCisgICAgLyogR2V0IGNvbXByZXNzb3Igc2hvcnRlZCBzdGlja3kgZmF1bHQgdmFsdWUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBjb21wcmVzc29yIG91dHB1dCBpcyBzaG9ydGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KGJvb2wgJnN0YXR1cyk7DQorICAgIC8qIEdldCBjb21wcmVzc29yIHNob3J0ZWQgZmF1bHQgdmFsdWUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBjb21wcmVzc29yIG91dHB1dCBpcyBzaG9ydGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KGJvb2wgJnN0YXR1cyk7DQorICAgIC8qIEdldCBjb21wcmVzc29yIGlzIG5vdCBjb25uZWN0ZWQgc3RpY2t5IGZhdWx0IHZhbHVlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgY29tcHJlc3NvciBjdXJyZW50IGlzIHRvbyBsb3csIA0KKyAgICAgKiAJCQkJCWluZGljYXRpbmcgY29tcHJlc3NvciBpcyBub3QgY29ubmVjdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCisgICAgICovDQorICAgIENUUl9Db2RlIAlHZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQoYm9vbCAmc3RhdHVzKTsNCisgICAgLyogR2V0IGNvbXByZXNzb3IgaXMgbm90IGNvbm5lY3RlZCBmYXVsdCB2YWx1ZQ0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIGNvbXByZXNzb3IgY3VycmVudCBpcyB0b28gbG93LCANCisgICAgICogCQkJCQlpbmRpY2F0aW5nIGNvbXByZXNzb3IgaXMgbm90IGNvbm5lY3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KGJvb2wgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBzb2xlbm9pZCBzdGlja3kgZmF1bHQgdmFsdWUNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBjb21wcmVzc29yIGhhZCBwcmV2aW91c2x5IGJlZW4gc2hvcnRlZA0KKyAgICAgKiAJCQkJCQkJCShhbmQgc3RpY2t5IGZhdWx0IHdhcyBub3QgY2xlYXJlZCksIGZhbHNlIGlmIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldFNvbGVub2lkU3RpY2t5RmF1bHQoYm9vbCAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IGJhdHRlcnkgdm9sdGFnZQ0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlWb2x0YWdlIGFjcm9zcyBQQ00gcG93ZXIgcG9ydHMgaW4gVm9sdHMgKFYpDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSAJR2V0QmF0dGVyeVZvbHRhZ2UoZmxvYXQgJnN0YXR1cyk7DQorICAgIA0KKyAgICAvKiBTZXQgUENNIERldmljZSBOdW1iZXIgYW5kIGFjY29yZGluZyBDQU4gZnJhbWUgSURzDQorICAgICAqIEBSZXR1cm4JLQl2b2lkDQorICAgICAqIEBQYXJhbQktCWRldmljZU51bWJlcgktCURldmljZSBudW1iZXIgb2YgUENNIHRvIGNvbnRyb2wNCisgICAgICovDQorICAgIHZvaWQJU2V0RGV2aWNlTnVtYmVyKFVJTlQ4IGRldmljZU51bWJlcik7DQorICAgIC8qIEdldCBudW1iZXIgb2YgdG90YWwgZmFpbGVkIFBDTSBDb250cm9sIEZyYW1lDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCU51bWJlciBvZiBmYWlsZWQgY29udHJvbCBmcmFtZXMgKHRva2VuaXphdGlvbiBmYWlscykNCisgICAgICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla0RlYnVnRnJhbWVzXSBpcyBlbmFibGVkDQorICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla0RlYnVnRnJhbWVzDQorICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla0RlYnVnRnJhbWVzDQorICAgICAqLw0KKwlDVFJfQ29kZSBHZXROdW1iZXJPZkZhaWxlZENvbnRyb2xGcmFtZXMoVUlOVDE2ICZzdGF0dXMpOw0KKyAgICANCisgICAgLyogR2V0IHJhdyBTb2xlbm9pZCBCbGFja2xpc3QNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JUmF3IGJpbmFyeSBicmVha2Rvd24gb2YgU29sZW5vaWQgQmxhY2tsaXN0DQorICAgICAqIAkJCQkJCQkJQklUNyA9IFNvbGVub2lkIDEsIEJJVDYgPSBTb2xlbm9pZCAyLCBldGMuDQorICAgICAqIEBXQVJOSU5HCS0JUmV0dXJuIG9ubHkgdmFsaWQgaWYgW1NlZWtTdGF0dXNGYXVsdEZyYW1lc10gaXMgZW5hYmxlZA0KKyAgICAgKiAJCQkJU2VlIGZ1bmN0aW9uIFNlZWtTdGF0dXNGYXVsdEZyYW1lcw0KKyAgICAgKiAJCQkJU2VlIGZ1bmN0aW9uIEVuYWJsZVNlZWtTdGF0dXNGYXVsdEZyYW1lcw0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUdldFNvbGVub2lkQmxhY2tMaXN0KFVJTlQ4ICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgc29sZW5vaWQgQmxhY2tsaXN0IHN0YXR1cw0KKyAgICAgKiAtIEJsYWNrbGlzdGVkIHNvbGVub2lkcyBjYW5ub3QgYmUgZW5hYmxlZCB1bnRpbCBQQ00gaXMgcG93ZXIgY3ljbGVkDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBzb2xlbm9pZCBbMCw3XQ0KKyAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBTb2xlbm9pZCBpcyBibGFja2xpc3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQorICAgICAqIEBXQVJOSU5HCS0JUmV0dXJuIG9ubHkgdmFsaWQgaWYgW1NlZWtTdGF0dXNGYXVsdEZyYW1lc10gaXMgZW5hYmxlZA0KKyAgICAgKiAJCQkJU2VlIGZ1bmN0aW9uIFNlZWtTdGF0dXNGYXVsdEZyYW1lcw0KKyAgICAgKiAJCQkJU2VlIGZ1bmN0aW9uIEVuYWJsZVNlZWtTdGF0dXNGYXVsdEZyYW1lcw0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgCUlzU29sZW5vaWRCbGFja2xpc3RlZChVSU5UOCBpZHgsIGJvb2wgJnN0YXR1cyk7DQorDQorICAgIC8qIFJldHVybiBzdGF0dXMgb2YgbW9kdWxlIGVuYWJsZS9kaXNhYmxlDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVJldHVybnMgVFJVRSBpZiBQQ00gaXMgZW5hYmxlZCwgRkFMU0UgaWYgZGlzYWJsZWQNCisgICAgICovDQorICAgIENUUl9Db2RlCWlzTW9kdWxlRW5hYmxlZChib29sICZzdGF0dXMpOw0KKw0KKyAgICAvKiBHZXQgc29sZW5vaWQgQmxhY2tsaXN0IHN0YXR1cw0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqIEBQYXJhbQktCWlkeAkJCS0JSUQgb2Ygc29sZW5vaWQgWzAsN10gdG8gZmlyZSBvbmUgc2hvdCBwdWxzZS4NCisgICAgICovDQorICAgIENUUl9Db2RlIEZpcmVPbmVTaG90U29sZW5vaWQoVUlOVDggaWR4KTsNCisNCisgICAgLyogQ29uZmlndXJlIHRoZSBwdWxzZSB3aWR0aCBvZiBhIHNvbGVub2lkIGNoYW5uZWwgZm9yIG9uZS1zaG90IHB1bHNlLg0KKwkgKiBQcmVwcm9ncmFtbWVkIHB1bHNld2lkdGggaXMgMTBtcyByZXNvbHV0ZSBhbmQgY2FuIGJlIGJldHdlZW4gMjBtcyBhbmQgNS4xcy4NCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAgICAgKiBAUGFyYW0JLQlpZHgJCQktCUlEIG9mIHNvbGVub2lkIFswLDddIHRvIGNvbmZpZ3VyZS4NCisgICAgICogQFBhcmFtCS0JZHVyTXMJCS0JcHVsc2Ugd2lkdGggaW4gbXMuDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSBTZXRPbmVTaG90RHVyYXRpb25NcyhVSU5UOCBpZHgsdWludDMyX3QgZHVyTXMpOw0KKw0KK307DQorLy8tLS0tLS0tLS0tLS0tLS0tLS0gQyBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KK2V4dGVybiAiQyIgew0KKwl2b2lkICogY19QQ01fSW5pdCh2b2lkKTsNCisJQ1RSX0NvZGUgY19TZXRTb2xlbm9pZHModm9pZCAqIGhhbmRsZSx1aW50OF90IHZhbHVlLHVpbnQ4X3QgbWFzayk7DQorCUNUUl9Db2RlIGNfU2V0Q2xvc2VkTG9vcENvbnRyb2wodm9pZCAqIGhhbmRsZSxJTlQ4IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19DbGVhclN0aWNreUZhdWx0cyh2b2lkICogaGFuZGxlLElOVDggcGFyYW0pOw0KKwlDVFJfQ29kZSBjX0dldFNvbGVub2lkKHZvaWQgKiBoYW5kbGUsVUlOVDggaWR4LElOVDggKiBzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldFByZXNzdXJlKHZvaWQgKiBoYW5kbGUsSU5UOCAqIHN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3Nvcih2b2lkICogaGFuZGxlLElOVDggKiBzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldENsb3NlZExvb3BDb250cm9sKHZvaWQgKiBoYW5kbGUsSU5UOCAqIHN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3NvckN1cnJlbnQodm9pZCAqIGhhbmRsZSxmbG9hdCAqIHN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0U29sZW5vaWRWb2x0YWdlKHZvaWQgKiBoYW5kbGUsZmxvYXQqc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRIYXJkd2FyZUZhdWx0KHZvaWQgKiBoYW5kbGUsSU5UOCpzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldENvbXByZXNzb3JGYXVsdCh2b2lkICogaGFuZGxlLElOVDgqc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZEZhdWx0KHZvaWQgKiBoYW5kbGUsSU5UOCpzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldENvbXByZXNzb3JTdGlja3lGYXVsdCh2b2lkICogaGFuZGxlLElOVDgqc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZFN0aWNreUZhdWx0KHZvaWQgKiBoYW5kbGUsSU5UOCpzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0dldEJhdHRlcnlWb2x0YWdlKHZvaWQgKiBoYW5kbGUsZmxvYXQqc3RhdHVzKTsNCisJdm9pZCBjX1NldERldmljZU51bWJlcl9QQ00odm9pZCAqIGhhbmRsZSxVSU5UOCBkZXZpY2VOdW1iZXIpOw0KKwl2b2lkIGNfRW5hYmxlU2Vla1N0YXR1c0ZyYW1lcyh2b2lkICogaGFuZGxlLElOVDggZW5hYmxlKTsNCisJdm9pZCBjX0VuYWJsZVNlZWtTdGF0dXNGYXVsdEZyYW1lcyh2b2lkICogaGFuZGxlLElOVDggZW5hYmxlKTsNCisJdm9pZCBjX0VuYWJsZVNlZWtEZWJ1Z0ZyYW1lcyh2b2lkICogaGFuZGxlLElOVDggZW5hYmxlKTsNCisJQ1RSX0NvZGUgY19HZXROdW1iZXJPZkZhaWxlZENvbnRyb2xGcmFtZXModm9pZCAqIGhhbmRsZSxVSU5UMTYqc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRTb2xlbm9pZEJsYWNrTGlzdCh2b2lkICogaGFuZGxlLFVJTlQ4ICpzdGF0dXMpOw0KKwlDVFJfQ29kZSBjX0lzU29sZW5vaWRCbGFja2xpc3RlZCh2b2lkICogaGFuZGxlLFVJTlQ4IGlkeCxJTlQ4KnN0YXR1cyk7DQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvUERQLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2N0cmUvUERQLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmI0YzhmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9QRFAuY3BwCkBAIC0wLDAgKzEsMjMwIEBACisjaW5jbHVkZSAiUERQLmgiDQorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCIJLy9DQU4gQ29tbQ0KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtc2V0DQorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyB1c2xlZXANCisNCisjZGVmaW5lIFNUQVRVU18xICAJCTB4ODA0MTQwMA0KKyNkZWZpbmUgU1RBVFVTXzIgIAkJMHg4MDQxNDQwDQorI2RlZmluZSBTVEFUVVNfMyAgCQkweDgwNDE0ODANCisjZGVmaW5lIFNUQVRVU19FTkVSR1kJMHg4MDQxNzQwDQorDQorI2RlZmluZSBDT05UUk9MXzEJCTB4MDgwNDFDMDAJLyogUERQX0NvbnRyb2xfQ2xlYXJTdGF0cyAqLw0KKw0KKyNkZWZpbmUgRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUwkoNTApDQorI2RlZmluZSBHRVRfU1RBVFVTMSgpCQlDdHJlQ2FuTm9kZTo6cmVjTXNnPFBkcFN0YXR1czFfdD4gcnggPSBHZXRSeDxQZHBTdGF0dXMxX3Q+KFNUQVRVU18xLEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMpDQorI2RlZmluZSBHRVRfU1RBVFVTMigpCQlDdHJlQ2FuTm9kZTo6cmVjTXNnPFBkcFN0YXR1czJfdD4gcnggPSBHZXRSeDxQZHBTdGF0dXMyX3Q+KFNUQVRVU18yLEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMpDQorI2RlZmluZSBHRVRfU1RBVFVTMygpCQlDdHJlQ2FuTm9kZTo6cmVjTXNnPFBkcFN0YXR1czNfdD4gcnggPSBHZXRSeDxQZHBTdGF0dXMzX3Q+KFNUQVRVU18zLEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMpDQorI2RlZmluZSBHRVRfU1RBVFVTX0VORVJHWSgpCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UERQX1N0YXR1c19FbmVyZ3lfdD4gcnggPSBHZXRSeDxQRFBfU3RhdHVzX0VuZXJneV90PihTVEFUVVNfRU5FUkdZLEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMpDQorDQorLyogZW5jb2Rlci9kZWNvZGVycyAqLw0KK3R5cGVkZWYgc3RydWN0IF9QZHBTdGF0dXMxX3R7DQorCXVuc2lnbmVkIGNoYW4xX2g4Ojg7DQorCXVuc2lnbmVkIGNoYW4yX2g2OjY7DQorCXVuc2lnbmVkIGNoYW4xX2wyOjI7DQorCXVuc2lnbmVkIGNoYW4zX2g0OjQ7DQorCXVuc2lnbmVkIGNoYW4yX2w0OjQ7DQorCXVuc2lnbmVkIGNoYW40X2gyOjI7DQorCXVuc2lnbmVkIGNoYW4zX2w2OjY7DQorCXVuc2lnbmVkIGNoYW40X2w4Ojg7DQorCXVuc2lnbmVkIGNoYW41X2g4Ojg7DQorCXVuc2lnbmVkIGNoYW42X2g2OjY7DQorCXVuc2lnbmVkIGNoYW41X2wyOjI7DQorCXVuc2lnbmVkIHJlc2VydmVkNDo0Ow0KKwl1bnNpZ25lZCBjaGFuNl9sNDo0Ow0KK31QZHBTdGF0dXMxX3Q7DQordHlwZWRlZiBzdHJ1Y3QgX1BkcFN0YXR1czJfdHsNCisJdW5zaWduZWQgY2hhbjdfaDg6ODsNCisJdW5zaWduZWQgY2hhbjhfaDY6NjsNCisJdW5zaWduZWQgY2hhbjdfbDI6MjsNCisJdW5zaWduZWQgY2hhbjlfaDQ6NDsNCisJdW5zaWduZWQgY2hhbjhfbDQ6NDsNCisJdW5zaWduZWQgY2hhbjEwX2gyOjI7DQorCXVuc2lnbmVkIGNoYW45X2w2OjY7DQorCXVuc2lnbmVkIGNoYW4xMF9sODo4Ow0KKwl1bnNpZ25lZCBjaGFuMTFfaDg6ODsNCisJdW5zaWduZWQgY2hhbjEyX2g2OjY7DQorCXVuc2lnbmVkIGNoYW4xMV9sMjoyOw0KKwl1bnNpZ25lZCByZXNlcnZlZDQ6NDsNCisJdW5zaWduZWQgY2hhbjEyX2w0OjQ7DQorfVBkcFN0YXR1czJfdDsNCit0eXBlZGVmIHN0cnVjdCBfUGRwU3RhdHVzM190ew0KKwl1bnNpZ25lZCBjaGFuMTNfaDg6ODsNCisJdW5zaWduZWQgY2hhbjE0X2g2OjY7DQorCXVuc2lnbmVkIGNoYW4xM19sMjoyOw0KKwl1bnNpZ25lZCBjaGFuMTVfaDQ6NDsNCisJdW5zaWduZWQgY2hhbjE0X2w0OjQ7DQorCXVuc2lnbmVkIGNoYW4xNl9oMjoyOw0KKwl1bnNpZ25lZCBjaGFuMTVfbDY6NjsNCisJdW5zaWduZWQgY2hhbjE2X2w4Ojg7DQorCXVuc2lnbmVkIGludGVybmFsUmVzQmF0dGVyeV9tT2htczo4Ow0KKwl1bnNpZ25lZCBidXNWb2x0YWdlOjg7DQorCXVuc2lnbmVkIHRlbXA6ODsNCit9UGRwU3RhdHVzM190Ow0KK3R5cGVkZWYgc3RydWN0IF9QRFBfU3RhdHVzX0VuZXJneV90IHsNCisJdW5zaWduZWQgVG1lYXNNc19saWtlbHl3aWxsYmUyMG1zXzo4Ow0KKwl1bnNpZ25lZCBUb3RhbEN1cnJlbnRfMTI1bUFwZXJ1bml0X2g4Ojg7DQorCXVuc2lnbmVkIFBvd2VyXzEyNW1XcGVydW5pdF9oNDo0Ow0KKwl1bnNpZ25lZCBUb3RhbEN1cnJlbnRfMTI1bUFwZXJ1bml0X2w0OjQ7DQorCXVuc2lnbmVkIFBvd2VyXzEyNW1XcGVydW5pdF9tODo4Ow0KKwl1bnNpZ25lZCBFbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX2g0OjQ7DQorCXVuc2lnbmVkIFBvd2VyXzEyNW1XcGVydW5pdF9sNDo0Ow0KKwl1bnNpZ25lZCBFbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX21oODo4Ow0KKwl1bnNpZ25lZCBFbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX21sODo4Ow0KKwl1bnNpZ25lZCBFbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX2w4Ojg7DQorfSBQRFBfU3RhdHVzX0VuZXJneV90IDsNCisNCitQRFA6OlBEUChVSU5UOCBkZXZpY2VOdW1iZXIpOiBDdHJlQ2FuTm9kZShkZXZpY2VOdW1iZXIpDQorew0KKwlSZWdpc3RlclJ4KFNUQVRVU18xIHwgZGV2aWNlTnVtYmVyICk7DQorCVJlZ2lzdGVyUngoU1RBVFVTXzIgfCBkZXZpY2VOdW1iZXIgKTsNCisJUmVnaXN0ZXJSeChTVEFUVVNfMyB8IGRldmljZU51bWJlciApOw0KK30NCisvKiBQRFAgRCd0b3INCisgKi8NCitQRFA6On5QRFAoKQ0KK3sNCit9DQorDQorQ1RSX0NvZGUgUERQOjpHZXRDaGFubmVsQ3VycmVudChVSU5UOCBpZHgsIGRvdWJsZSAmY3VycmVudCkNCit7DQorCUNUUl9Db2RlIHJldHZhbCA9IENUUl9JbnZhbGlkUGFyYW1WYWx1ZTsNCisJdWludDMyX3QgcmF3ID0gMDsNCisNCisJaWYoaWR4IDw9IDUpew0KKwkJR0VUX1NUQVRVUzEoKTsNCisJICAgIHJldHZhbCA9IHJ4LmVycjsNCisJCXN3aXRjaChpZHgpew0KKwkJCWNhc2UgMDoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjFfaDggPDwgMikgfCByeC0+Y2hhbjFfbDI7CWJyZWFrOw0KKwkJCWNhc2UgMToJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjJfaDYgPDwgNCkgfCByeC0+Y2hhbjJfbDQ7CWJyZWFrOw0KKwkJCWNhc2UgMjoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjNfaDQgPDwgNikgfCByeC0+Y2hhbjNfbDY7CWJyZWFrOw0KKwkJCWNhc2UgMzoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjRfaDIgPDwgOCkgfCByeC0+Y2hhbjRfbDg7CWJyZWFrOw0KKwkJCWNhc2UgNDoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjVfaDggPDwgMikgfCByeC0+Y2hhbjVfbDI7CWJyZWFrOw0KKwkJCWNhc2UgNToJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjZfaDYgPDwgNCkgfCByeC0+Y2hhbjZfbDQ7CWJyZWFrOw0KKwkJCWRlZmF1bHQ6CXJldHZhbCA9IENUUl9JbnZhbGlkUGFyYW1WYWx1ZTsJYnJlYWs7DQorCQl9DQorCX1lbHNlIGlmKGlkeCA8PSAxMSl7DQorCQlHRVRfU1RBVFVTMigpOw0KKwkgICAgcmV0dmFsID0gcnguZXJyOw0KKwkJc3dpdGNoKGlkeCl7DQorCQkJY2FzZSAgNjoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjdfaDggIDw8IDIpIHwgcngtPmNoYW43X2wyOwlicmVhazsNCisJCQljYXNlICA3OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuOF9oNiAgPDwgNCkgfCByeC0+Y2hhbjhfbDQ7CWJyZWFrOw0KKwkJCWNhc2UgIDg6CXJhdyA9ICgodWludDMyX3QpcngtPmNoYW45X2g0ICA8PCA2KSB8IHJ4LT5jaGFuOV9sNjsJYnJlYWs7DQorCQkJY2FzZSAgOToJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjEwX2gyIDw8IDgpIHwgcngtPmNoYW4xMF9sODsJYnJlYWs7DQorCQkJY2FzZSAxMDoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjExX2g4IDw8IDIpIHwgcngtPmNoYW4xMV9sMjsJYnJlYWs7DQorCQkJY2FzZSAxMToJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjEyX2g2IDw8IDQpIHwgcngtPmNoYW4xMl9sNDsJYnJlYWs7DQorCQkJZGVmYXVsdDoJcmV0dmFsID0gQ1RSX0ludmFsaWRQYXJhbVZhbHVlOwlicmVhazsNCisJCX0NCisJfWVsc2UgaWYoaWR4IDw9IDE1KXsNCisJCUdFVF9TVEFUVVMzKCk7DQorCSAgICByZXR2YWwgPSByeC5lcnI7DQorCQlzd2l0Y2goaWR4KXsNCisJCQljYXNlIDEyOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTNfaDggIDw8IDIpIHwgcngtPmNoYW4xM19sMjsJYnJlYWs7DQorCQkJY2FzZSAxMzoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjE0X2g2ICA8PCA0KSB8IHJ4LT5jaGFuMTRfbDQ7CWJyZWFrOw0KKwkJCWNhc2UgMTQ6CXJhdyA9ICgodWludDMyX3QpcngtPmNoYW4xNV9oNCAgPDwgNikgfCByeC0+Y2hhbjE1X2w2OwlicmVhazsNCisJCQljYXNlIDE1OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTZfaDIgIDw8IDgpIHwgcngtPmNoYW4xNl9sODsJYnJlYWs7DQorCQkJZGVmYXVsdDoJcmV0dmFsID0gQ1RSX0ludmFsaWRQYXJhbVZhbHVlOwlicmVhazsNCisJCX0NCisJfQ0KKwkvKiBjb252ZXJ0IHRvIGFtcHMgKi8NCisJY3VycmVudCA9IChkb3VibGUpcmF3ICogMC4xMjU7ICAvKiA3LjMgZml4ZWQgcHQgdmFsdWUgaW4gQW1wcyAqLw0KKwkvKiBzaWduYWwgY2FsbGVyIHdpdGggc3VjY2VzcyAqLw0KKwlyZXR1cm4gcmV0dmFsOw0KK30NCitDVFJfQ29kZSBQRFA6OkdldFZvbHRhZ2UoZG91YmxlICZ2b2x0YWdlKQ0KK3sNCisJR0VUX1NUQVRVUzMoKTsNCisJdWludDMyX3QgcmF3ID0gcngtPmJ1c1ZvbHRhZ2U7DQorCXZvbHRhZ2UgPSAoZG91YmxlKXJhdyAqIDAuMDUgKyA0LjA7IC8qIDUwbVYgcGVyIHVuaXQgcGx1cyA0Vi4gKi87DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIFBEUDo6R2V0VGVtcGVyYXR1cmUoZG91YmxlICZ0ZW1wQykNCit7DQorCUdFVF9TVEFUVVMzKCk7DQorCXVpbnQzMl90IHJhdyA9IHJ4LT50ZW1wOw0KKwl0ZW1wQyA9CShkb3VibGUpcmF3ICogMS4wMzI1MDgzNjk1NzU0MiAtIDY3Ljg1NjQ1MDA0ODQ5NjY7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIFBEUDo6R2V0VG90YWxDdXJyZW50KGRvdWJsZSAmY3VycmVudEFtcHMpDQorew0KKwlHRVRfU1RBVFVTX0VORVJHWSgpOw0KKwl1aW50MzJfdCByYXc7DQorCXJhdyA9IHJ4LT5Ub3RhbEN1cnJlbnRfMTI1bUFwZXJ1bml0X2g4Ow0KKwlyYXcgPDw9IDQ7DQorCXJhdyB8PSAgcngtPlRvdGFsQ3VycmVudF8xMjVtQXBlcnVuaXRfbDQ7DQorCWN1cnJlbnRBbXBzID0gMC4xMjUgKiByYXc7DQorCXJldHVybiByeC5lcnI7DQorfQ0KK0NUUl9Db2RlIFBEUDo6R2V0VG90YWxQb3dlcihkb3VibGUgJnBvd2VyV2F0dHMpDQorew0KKwlHRVRfU1RBVFVTX0VORVJHWSgpOw0KKwl1aW50MzJfdCByYXc7DQorCXJhdyA9IHJ4LT5Qb3dlcl8xMjVtV3BlcnVuaXRfaDQ7DQorCXJhdyA8PD0gODsNCisJcmF3IHw9ICByeC0+UG93ZXJfMTI1bVdwZXJ1bml0X204Ow0KKwlyYXcgPDw9IDQ7DQorCXJhdyB8PSAgcngtPlBvd2VyXzEyNW1XcGVydW5pdF9sNDsNCisJcG93ZXJXYXR0cyA9IDAuMTI1ICogcmF3Ow0KKwlyZXR1cm4gcnguZXJyOw0KK30NCitDVFJfQ29kZSBQRFA6OkdldFRvdGFsRW5lcmd5KGRvdWJsZSAmZW5lcmd5Sm91bGVzKQ0KK3sNCisJR0VUX1NUQVRVU19FTkVSR1koKTsNCisJdWludDMyX3QgcmF3Ow0KKwlyYXcgPSByeC0+RW5lcmd5XzEyNW1XUGVyVW5pdFhUbWVhc19oNDsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gIHJ4LT5FbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX21oODsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gIHJ4LT5FbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX21sODsNCisJcmF3IDw8PSA4Ow0KKwlyYXcgfD0gIHJ4LT5FbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX2w4Ow0KKwllbmVyZ3lKb3VsZXMgPSAwLjEyNSAqIHJhdzsgCQkJCQkJLyogbVcgaW50ZWdyYXRlZCBldmVyeSBUbWVhc01zICovDQorCWVuZXJneUpvdWxlcyAqPSByeC0+VG1lYXNNc19saWtlbHl3aWxsYmUyMG1zXzsJLyogbXVsdGlwbGllZCBieSBUbWVhc01zID0gam91bGVzICovDQorCXJldHVybiByeC5lcnI7DQorfQ0KKy8qIENsZWFyIHN0aWNreSBmYXVsdHMuDQorICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAqLw0KK0NUUl9Db2RlIFBEUDo6Q2xlYXJTdGlja3lGYXVsdHMoKQ0KK3sNCisJaW50MzJfdCBzdGF0dXMgPSAwOw0KKwl1aW50OF90IHBkcENvbnRyb2xbXSA9IHsgMHg4MCB9OyAvKiBvbmx5IGJpdCBzZXQgaXMgQ2xlYXJTdGlja3lGYXVsdHMgKi8NCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8xICB8IEdldERldmljZU51bWJlcigpLCBwZHBDb250cm9sLCBzaXplb2YocGRwQ29udHJvbCksIDAsICZzdGF0dXMpOw0KKwlpZihzdGF0dXMpDQorCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKw0KKy8qIFJlc2V0IEVuZXJneSBTaWduYWxzDQorICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KKyAqLw0KK0NUUl9Db2RlIFBEUDo6UmVzZXRFbmVyZ3koKQ0KK3sNCisJaW50MzJfdCBzdGF0dXMgPSAwOw0KKwl1aW50OF90IHBkcENvbnRyb2xbXSA9IHsgMHg0MCB9OyAvKiBvbmx5IGJpdCBzZXQgaXMgUmVzZXRFbmVyZ3kgKi8NCisJRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8xICB8IEdldERldmljZU51bWJlcigpLCBwZHBDb250cm9sLCBzaXplb2YocGRwQ29udHJvbCksIDAsICZzdGF0dXMpOw0KKwlpZihzdGF0dXMpDQorCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KKwlyZXR1cm4gQ1RSX09LQVk7DQorfQ0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tIEMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCitleHRlcm4gIkMiIHsNCisJdm9pZCAqIGNfUERQX0luaXQodm9pZCkNCisJew0KKwkJcmV0dXJuIG5ldyBQRFAoKTsNCisJfQ0KKwlDVFJfQ29kZSBjX0dldENoYW5uZWxDdXJyZW50KHZvaWQgKiBoYW5kbGUsVUlOVDggaWR4LCBkb3VibGUgKnN0YXR1cykNCisJew0KKwkJcmV0dXJuICgoUERQKiloYW5kbGUpLT4gR2V0Q2hhbm5lbEN1cnJlbnQoaWR4LCpzdGF0dXMpOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0Vm9sdGFnZSh2b2lkICogaGFuZGxlLGRvdWJsZSAqc3RhdHVzKQ0KKwl7DQorCQlyZXR1cm4gKChQRFAqKWhhbmRsZSktPiBHZXRWb2x0YWdlKCpzdGF0dXMpOw0KKwl9DQorCUNUUl9Db2RlIGNfR2V0VGVtcGVyYXR1cmUodm9pZCAqIGhhbmRsZSxkb3VibGUgKnN0YXR1cykNCisJew0KKwkJcmV0dXJuICgoUERQKiloYW5kbGUpLT4gR2V0VGVtcGVyYXR1cmUoKnN0YXR1cyk7DQorCX0NCisJdm9pZCBjX1NldERldmljZU51bWJlcl9QRFAodm9pZCAqIGhhbmRsZSxVSU5UOCBkZXZpY2VOdW1iZXIpDQorCXsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL1BEUC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9QRFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjg5ZDFhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9QRFAuaApAQCAtMCwwICsxLDY0IEBACisjaWZuZGVmIFBEUF9IXw0KKyNkZWZpbmUgUERQX0hfDQorI2luY2x1ZGUgImN0cmUuaCIJCQkJLy9CSVQgRGVmaW5lcyArIFR5cGVkZWZzDQorI2luY2x1ZGUgPE5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaD4JLy9DQU4gQ29tbQ0KKyNpbmNsdWRlICJDdHJlQ2FuTm9kZS5oIg0KKyNpbmNsdWRlIDxwdGhyZWFkLmg+DQorY2xhc3MgUERQIDogcHVibGljIEN0cmVDYW5Ob2RlDQorew0KK3B1YmxpYzoNCisgICAgLyogR2V0IFBEUCBDaGFubmVsIEN1cnJlbnQNCisgICAgICoNCisgICAgICogQFBhcmFtCS0JZGV2aWNlTnVtYmVyCS0JRGV2aWNlIElEIGZvciBQRFAuIEZhY3RvcnkgZGVmYXVsdCBpcyA2MC4gRnVuY3Rpb24gZGVmYXVsdHMgdG8gNjAuDQorICAgICAqLw0KKyAgICBQRFAoVUlOVDggZGV2aWNlTnVtYmVyPTApOw0KKyAgICB+UERQKCk7DQorICAgIC8qIEdldCBQRFAgQ2hhbm5lbCBDdXJyZW50DQorICAgICAqDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICoNCisgICAgICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBjaGFubmVsIHRvIHJldHVybiBjdXJyZW50IGZvciAoY2hhbm5lbHMgMS0xNikNCisgICAgICoNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCUN1cnJlbnQgb2YgY2hhbm5lbCAnaWR4JyBpbiBBbXBzIChBKQ0KKyAgICAgKi8NCisgICAgQ1RSX0NvZGUgR2V0Q2hhbm5lbEN1cnJlbnQoVUlOVDggaWR4LCBkb3VibGUgJnN0YXR1cyk7DQorDQorICAgIC8qIEdldCBCdXMgVm9sdGFnZSBvZiBQRFANCisgICAgICoNCisgICAgICogQFJldHVybgktCUNUUl9Db2RlCS0gCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICoNCisgICAgICogQFBhcmFtCS0Jc3RhdHVzCQktIAlWb2x0YWdlIChWKSBhY3Jvc3MgUERQDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSBHZXRWb2x0YWdlKGRvdWJsZSAmc3RhdHVzKTsNCisNCisgICAgLyogR2V0IFRlbXBlcmF0dXJlIG9mIFBEUA0KKyAgICAgKg0KKyAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQorICAgICAqDQorICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUZW1wZXJhdHVyZSBvZiBQRFAgaW4gQ2VudGlncmFkZSAvIENlbGNpdXMgKEMpDQorICAgICAqLw0KKyAgICBDVFJfQ29kZSBHZXRUZW1wZXJhdHVyZShkb3VibGUgJnN0YXR1cyk7DQorDQorCUNUUl9Db2RlIEdldFRvdGFsQ3VycmVudChkb3VibGUgJmN1cnJlbnRBbXBzKTsNCisJQ1RSX0NvZGUgR2V0VG90YWxQb3dlcihkb3VibGUgJnBvd2VyV2F0dHMpOw0KKwlDVFJfQ29kZSBHZXRUb3RhbEVuZXJneShkb3VibGUgJmVuZXJneUpvdWxlcyk7DQorICAgIC8qIENsZWFyIHN0aWNreSBmYXVsdHMuDQorICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisgICAgICovDQorCUNUUl9Db2RlIENsZWFyU3RpY2t5RmF1bHRzKCk7DQorDQorCS8qIFJlc2V0IEVuZXJneSBTaWduYWxzDQorCSAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCisJICovDQorCUNUUl9Db2RlIFJlc2V0RW5lcmd5KCk7DQorcHJpdmF0ZToNCisgICAgdWludDY0X3QgUmVhZEN1cnJlbnRzKHVpbnQ4X3QgYXBpKTsNCit9Ow0KK2V4dGVybiAiQyIgew0KKwl2b2lkICogY19QRFBfSW5pdCgpOw0KKwlDVFJfQ29kZSBjX0dldENoYW5uZWxDdXJyZW50KHZvaWQgKiBoYW5kbGUsVUlOVDggaWR4LCBkb3VibGUgKnN0YXR1cyk7DQorCUNUUl9Db2RlIGNfR2V0Vm9sdGFnZSh2b2lkICogaGFuZGxlLGRvdWJsZSAqc3RhdHVzKTsNCisJQ1RSX0NvZGUgY19HZXRUZW1wZXJhdHVyZSh2b2lkICogaGFuZGxlLGRvdWJsZSAqc3RhdHVzKTsNCisJdm9pZCBjX1NldERldmljZU51bWJlcl9QRFAodm9pZCAqIGhhbmRsZSxVSU5UOCBkZXZpY2VOdW1iZXIpOw0KK30NCisjZW5kaWYgLyogUERQX0hfICovDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9jdHJlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9jdHJlL2N0cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQzZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvY3RyZS9jdHJlLmgKQEAgLTAsMCArMSw1MCBAQAorI2lmbmRlZiBHTE9CQUxfSA0KKyNkZWZpbmUgR0xPQkFMX0gNCisNCisvL0JpdCBEZWZpbmVzDQorI2RlZmluZSBCSVQwIDB4MDENCisjZGVmaW5lIEJJVDEgMHgwMg0KKyNkZWZpbmUgQklUMiAweDA0DQorI2RlZmluZSBCSVQzIDB4MDgNCisjZGVmaW5lIEJJVDQgMHgxMA0KKyNkZWZpbmUgQklUNSAweDIwDQorI2RlZmluZSBCSVQ2IDB4NDANCisjZGVmaW5lIEJJVDcgMHg4MA0KKyNkZWZpbmUgQklUOCAgMHgwMTAwDQorI2RlZmluZSBCSVQ5ICAweDAyMDANCisjZGVmaW5lIEJJVDEwIDB4MDQwMA0KKyNkZWZpbmUgQklUMTEgMHgwODAwDQorI2RlZmluZSBCSVQxMiAweDEwMDANCisjZGVmaW5lIEJJVDEzIDB4MjAwMA0KKyNkZWZpbmUgQklUMTQgMHg0MDAwDQorI2RlZmluZSBCSVQxNSAweDgwMDANCisNCisvL1NpZ25lZA0KK3R5cGVkZWYJc2lnbmVkIGNoYXIJSU5UODsNCit0eXBlZGVmCXNpZ25lZCBzaG9ydAlJTlQxNjsNCit0eXBlZGVmCXNpZ25lZCBpbnQJSU5UMzI7DQordHlwZWRlZglzaWduZWQgbG9uZyBsb25nIElOVDY0Ow0KKw0KKy8vVW5zaWduZWQNCit0eXBlZGVmCXVuc2lnbmVkIGNoYXIJVUlOVDg7DQordHlwZWRlZgl1bnNpZ25lZCBzaG9ydAlVSU5UMTY7DQordHlwZWRlZgl1bnNpZ25lZCBpbnQJVUlOVDMyOw0KK3R5cGVkZWYJdW5zaWduZWQgbG9uZyBsb25nIFVJTlQ2NDsNCisNCisvL090aGVyDQordHlwZWRlZgl1bnNpZ25lZCBjaGFyCVVDSEFSOw0KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJVVNIT1JUOw0KK3R5cGVkZWYJdW5zaWduZWQgaW50CVVJTlQ7DQordHlwZWRlZiB1bnNpZ25lZCBsb25nCVVMT05HOw0KKw0KK3R5cGVkZWYgZW51bSB7DQorCQlDVFJfT0tBWSwJCQkJLy8hPCBObyBFcnJvciAtIEZ1bmN0aW9uIGV4ZWN1dGVkIGFzIGV4cGVjdGVkDQorCQlDVFJfUnhUaW1lb3V0LAkJCS8vITwgQ0FOIGZyYW1lIGhhcyBub3QgYmVlbiByZWNlaXZlZCB3aXRoaW4gc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lLg0KKwkJQ1RSX1R4VGltZW91dCwJCQkvLyE8IE5vdCB1c2VkLg0KKwkJQ1RSX0ludmFsaWRQYXJhbVZhbHVlLCAJLy8hPCBDYWxsZXIgcGFzc2VkIGFuIGludmFsaWQgcGFyYW0NCisJCUNUUl9VbmV4cGVjdGVkQXJiSWQsCS8vITwgU3BlY2lmaWVkIENBTiBJZCBpcyBpbnZhbGlkLg0KKwkJQ1RSX1R4RmFpbGVkLAkJCS8vITwgQ291bGQgbm90IHRyYW5zbWl0IHRoZSBDQU4gZnJhbWUuDQorCQlDVFJfU2lnTm90VXBkYXRlZCwJCS8vITwgSGF2ZSBub3QgcmVjZWl2ZWQgYW4gdmFsdWUgcmVzcG9uc2UgZm9yIHNpZ25hbC4NCit9Q1RSX0NvZGU7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvaTJjbGliL2kyYy1saWIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2kyY2xpYi9pMmMtbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0Y2IzMwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2kyY2xpYi9pMmMtbGliLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfX0kyQ19MSUJfSF9fDQorI2RlZmluZSBfX0kyQ19MSUJfSF9fDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQoraW50IGkyY2xpYl9vcGVuKGNvbnN0IGNoYXIgKmRldmljZSk7DQordm9pZCBpMmNsaWJfY2xvc2UoaW50IGhhbmRsZSk7DQoraW50IGkyY2xpYl9yZWFkKGludCBoYW5kbGUsIHVpbnQ4X3QgZGV2X2FkZHIsIGNoYXIgKnJlY3ZfYnVmLCBpbnQzMl90IHJlY3Zfc2l6ZSk7DQoraW50IGkyY2xpYl93cml0ZShpbnQgaGFuZGxlLCB1aW50OF90IGRldl9hZGRyLCBjb25zdCBjaGFyICpzZW5kX2J1ZiwgaW50MzJfdCBzZW5kX3NpemUpOw0KK2ludCBpMmNsaWJfd3JpdGVyZWFkKGludCBoYW5kbGUsIHVpbnQ4X3QgZGV2X2FkZHIsIGNvbnN0IGNoYXIgKnNlbmRfYnVmLCBpbnQzMl90IHNlbmRfc2l6ZSwgY2hhciAqcmVjdl9idWYsIGludDMyX3QgcmVjdl9zaXplKTsNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8qIF9fSTJDX0xJQl9IX18gKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9pMmNsaWIvaTJjbGliL2Vudmlyb25zLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS9pMmNsaWIvaTJjbGliL2Vudmlyb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1MDU4NQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL2kyY2xpYi9pMmNsaWIvZW52aXJvbnMuaApAQCAtMCwwICsxLDY2IEBACisvKiENCisgICBcZmlsZSBlbnZpcm9ucy5oDQorICAgXGJyaWVmIERlZmluZXMgZXhwb3J0IHN5bWJvbHMgYW5kIG5hbWVzcGFjZSBhbGlhc2VzDQorKi8NCisvKg0KKyAgIENvcHlyaWdodCAoYykgMjAxNCwNCisgICBOYXRpb25hbCBJbnN0cnVtZW50cyBDb3Jwb3JhdGlvbi4NCisgICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKw0KKyAgIEZpbGU6ICAgICAgICAkSWQ6IC8vbHZhZGRvbi9GSVJTVC9GUkMvdHJ1bmsvMjAxNS90b29scy9mcmNydGkvZXhwb3J0LzEuMC8xLjAuMGE2L2luY2x1ZGVzL3dwaWxpYi9pMmNsaWIvaTJjbGliL2Vudmlyb25zLmgjMSAkDQorICAgQXV0aG9yOiAgICAgIG5pcGcucGwNCisgICBPcmlnaW5hdGVkOiAgTW9uIEZlYiAxMCAxMDozOTo0MiAyMDE0DQorKi8NCisNCisjaWZuZGVmIF9fX2kyY2xpYl9lbnZpcm9uc19oX19fDQorI2RlZmluZSBfX19pMmNsaWJfZW52aXJvbnNfaF9fXw0KKw0KKyNpbmNsdWRlIDxuaWJ1aWxkL3BsYXRmb3JtLmg+DQorDQorLyoNCisgKiBrSTJDTElCRXhwb3J0U3ltYm9scyBkaXJlY3RzIHRoZSBidWlsZCB0byBleHBvcnQgc3ltYm9scyBtb2RpZmllZCBieQ0KKyAqIHRoZSBrSTJDTElCRXhwb3J0IGtleXdvcmQuIGtJMkNMSUJOb0V4cG9ydFN5bWJvbHMgZGlyZWN0cyB0aGUgYnVpbGQgdG8gbm90DQorICogaW1wb3J0IG9yIGV4cG9ydCBzeW1ib2xzIG1vZGlmaWVkIGJ5IHRoZSBrSTJDTElCRXhwb3J0IGtleXdvcmQuIElmDQorICogbmVpdGhlciBvZiB0aGVzZSBhcmUgZGVmaW5lZCwgdGhlIHN5bWJvbHMgbW9kaWZpZWQgYnkga0kyQ0xJQkV4cG9ydCBhcmUNCisgKiBpbXBvcnRlZC4gVGhlc2Ugc2hvdWxkIGJlIGRlZmluZWQgb25seSB3aGVuIGJ1aWxkaW5nIHRoZSBjb21wb25lbnQsDQorICogc28gY2xpZW50cyBkbyBub3QgbmVlZCB0byB0cm91YmxlIHRoZW1zZWx2ZXMgd2l0aCBpdC4NCisgKi8NCisjaWYgZGVmaW5lZChrSTJDTElCRXhwb3J0U3ltYm9scykNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnQga05JRXhwb3J0DQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0UHJlIGtOSUV4cG9ydFByZQ0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydFBvc3Qga05JRXhwb3J0UG9zdA0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydElubGluZSBrTklFeHBvcnRJbmxpbmUNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnREYXRhIGtOSUV4cG9ydERhdGENCisjZWxpZiBkZWZpbmVkKGtJMkNMSUJOb0V4cG9ydFN5bWJvbHMpDQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0DQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0UHJlDQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0UG9zdA0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydElubGluZQ0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydERhdGENCisjZWxzZQ0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydCBrTklJbXBvcnQNCisgICAjZGVmaW5lIGtJMkNMSUJFeHBvcnRQcmUga05JSW1wb3J0UHJlDQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0UG9zdCBrTklJbXBvcnRQb3N0DQorICAgI2RlZmluZSBrSTJDTElCRXhwb3J0SW5saW5lIGtOSUltcG9ydElubGluZQ0KKyAgICNkZWZpbmUga0kyQ0xJQkV4cG9ydERhdGEga05JSW1wb3J0RGF0YQ0KKyNlbmRpZg0KKw0KKy8vIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgZm9yIGFsaWFzaW5nIC4uLg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KKw0KKw0KKy8qIQ0KKyAgIFxuYW1lc3BhY2UgbkkyQ0xJQl8xXzANCisgICBcYnJpZWYgaTJjIHVzZXItbW9kZSBsaWJyYXJ5IFJlbGVhc2UgMS4wDQorKi8NCituYW1lc3BhY2UgbkkyQ0xJQl8xXzANCit7DQorICAgLy8gY3VycmVudCB2ZXJzaW9uZWQgbmFtZXNwYWNlIGFsaWFzZXMgdXNlZCBieSB0aGlzIHBhY2thZ2UNCisNCit9DQorDQorI2VuZGlmIC8vIF9fY3BsdXNwbHVzDQorDQorI2VuZGlmIC8vIF9fX2kyY2xpYl9lbnZpcm9uc19oX19fDQorDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvc3BpbGliL3NwaS1saWIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL3NwaWxpYi9zcGktbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjMmE3YQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL2hhbC9saWIvQXRoZW5hL3NwaWxpYi9zcGktbGliLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfX1NQSV9MSUJfSF9fDQorI2RlZmluZSBfX1NQSV9MSUJfSF9fDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQoraW50IHNwaWxpYl9vcGVuKGNvbnN0IGNoYXIgKmRldmljZSk7DQordm9pZCBzcGlsaWJfY2xvc2UoaW50IGhhbmRsZSk7DQoraW50IHNwaWxpYl9zZXRzcGVlZChpbnQgaGFuZGxlLCB1aW50MzJfdCBzcGVlZCk7DQoraW50IHNwaWxpYl9zZXRiaXRzcGVyd29yZChpbnQgaGFuZGxlLCB1aW50OF90IGJwdyk7DQoraW50IHNwaWxpYl9zZXRvcHRzKGludCBoYW5kbGUsIGludCBtc2JfZmlyc3QsIGludCBzYW1wbGVfb25fdHJhaWxpbmcsIGludCBjbGtfaWRsZV9oaWdoKTsNCitpbnQgc3BpbGliX3JlYWQoaW50IGhhbmRsZSwgY2hhciAqcmVjdl9idWYsIGludDMyX3Qgc2l6ZSk7DQoraW50IHNwaWxpYl93cml0ZShpbnQgaGFuZGxlLCBjb25zdCBjaGFyICpzZW5kX2J1ZiwgaW50MzJfdCBzaXplKTsNCitpbnQgc3BpbGliX3dyaXRlcmVhZChpbnQgaGFuZGxlLCBjb25zdCBjaGFyICpzZW5kX2J1ZiwgY2hhciAqcmVjdl9idWYsIGludDMyX3Qgc2l6ZSk7DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvKiBfX1NQSV9MSUJfSF9fICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvdmlzYS92aXNhLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS92aXNhL3Zpc2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzZhZDMwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvdmlzYS92aXNhLmgKQEAgLTAsMCArMSwxMDY0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBEaXN0cmlidXRlZCBieSBJVkkgRm91bmRhdGlvbiBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb250YWlucyBOYXRpb25hbCBJbnN0cnVtZW50cyBleHRlbnNpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEbyBub3QgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaXRsZSAgIDogVklTQS5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEYXRlICAgIDogMTAtMDktMjAwNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQdXJwb3NlIDogSW5jbHVkZSBmaWxlIGZvciB0aGUgVklTQSBMaWJyYXJ5IDQuMCBzcGVjaWZpY2F0aW9uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBXaGVuIHVzaW5nIE5JLVZJU0EgZXh0ZW5zaW9ucywgeW91IG11c3QgbGluayB3aXRoIHRoZSBWSVNBIGxpYnJhcnkgdGhhdCAgICovCisvKiBjb21lcyB3aXRoIE5JLVZJU0EuICBDdXJyZW50bHksIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGJ5IE5JLVZJU0EgYXJlOiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQWEkgKENvbXBhY3QgUENJIGVYdGVuc2lvbnMgZm9yIEluc3RydW1lbnRhdGlvbikgYW5kIFBDSSBzdXBwb3J0LiAgVG8gdXNlICovCisvKiB0aGlzLCB5b3UgbXVzdCBkZWZpbmUgdGhlIG1hY3JvIE5JVklTQV9QWEkgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlci4gICovCisvKiBZb3UgbXVzdCBhbHNvIGNyZWF0ZSBhbiBJTkYgZmlsZSB3aXRoIHRoZSBWSVNBIERyaXZlciBEZXZlbG9wbWVudCBXaXphcmQuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBIGZhc3Qgc2V0IG9mIG1hY3JvcyBmb3IgdmlQZWVrWFgvdmlQb2tlWFggdGhhdCBndWFyYW50ZWVzIGJpbmFyeSAgICAgICAgICovCisvKiBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgaW1wbGVtZW50YXRpb25zIG9mIFZJU0EuICBUbyB1c2UgdGhpcywgeW91IG11c3QgICovCisvKiBkZWZpbmUgdGhlIG1hY3JvIE5JVklTQV9QRUVLUE9LRSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBTdXBwb3J0IGZvciBVU0IgZGV2aWNlcyB0aGF0IGRvIG5vdCBjb25mb3JtIHRvIGEgc3BlY2lmaWMgY2xhc3MuICBUbyB1c2UgICovCisvKiB0aGlzLCB5b3UgbXVzdCBkZWZpbmUgdGhlIG1hY3JvIE5JVklTQV9VU0IgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlci4gICovCisvKiBZb3UgbXVzdCBhbHNvIGNyZWF0ZSBhbiBJTkYgZmlsZSB3aXRoIHRoZSBWSVNBIERyaXZlciBEZXZlbG9wbWVudCBXaXphcmQuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19WSVNBX0hFQURFUl9fCisjZGVmaW5lIF9fVklTQV9IRUFERVJfXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZiAhZGVmaW5lZChfX1ZJU0FUWVBFX0hFQURFUl9fKQorI2luY2x1ZGUgInZpc2F0eXBlLmgiCisjZW5kaWYKKworI2RlZmluZSBWSV9TUEVDX1ZFUlNJT04gICAgICgweDAwNDAwMDAwVUwpCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzX18pCisgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfQ1ZJXykKKyNwcmFnbWEgRW5hYmxlTGlicmFyeVJ1bnRpbWVDaGVja2luZworI2VuZGlmCisKKy8qLSBWSVNBIFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBWaU9iamVjdCAgICAgICAgICAgICBWaUV2ZW50OwordHlwZWRlZiBWaUV2ZW50ICAgICAgX1ZJX1BUUiBWaVBFdmVudDsKK3R5cGVkZWYgVmlPYmplY3QgICAgICAgICAgICAgVmlGaW5kTGlzdDsKK3R5cGVkZWYgVmlGaW5kTGlzdCAgIF9WSV9QVFIgVmlQRmluZExpc3Q7CisKKyNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkgJiYgZGVmaW5lZChfVklTQV9FTlZfSVNfNjRfQklUKQordHlwZWRlZiBWaVVJbnQ2NCAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M7Cit0eXBlZGVmIFZpVUludDY0ICAgICAgICAgICAgIFZpQnVzU2l6ZTsKK3R5cGVkZWYgVmlVSW50NjQgICAgICAgICAgICAgVmlBdHRyU3RhdGU7CisjZWxzZQordHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M7Cit0eXBlZGVmIFZpVUludDMyICAgICAgICAgICAgIFZpQnVzU2l6ZTsKK3R5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICAgVmlBdHRyU3RhdGU7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQordHlwZWRlZiBWaVVJbnQ2NCAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NDsKK3R5cGVkZWYgVmlCdXNBZGRyZXNzNjQgX1ZJX1BUUiBWaVBCdXNBZGRyZXNzNjQ7CisjZW5kaWYKKwordHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUV2ZW50VHlwZTsKK3R5cGVkZWYgVmlFdmVudFR5cGUgIF9WSV9QVFIgVmlQRXZlbnRUeXBlOwordHlwZWRlZiBWaUV2ZW50VHlwZSAgX1ZJX1BUUiBWaUFFdmVudFR5cGU7Cit0eXBlZGVmIHZvaWQgICAgICAgICBfVklfUFRSIFZpUEF0dHJTdGF0ZTsKK3R5cGVkZWYgVmlBdHRyICAgICAgIF9WSV9QVFIgVmlQQXR0cjsKK3R5cGVkZWYgVmlBdHRyICAgICAgIF9WSV9QVFIgVmlBQXR0cjsKKwordHlwZWRlZiBWaVN0cmluZyAgICAgICAgICAgICBWaUtleUlkOwordHlwZWRlZiBWaVBTdHJpbmcgICAgICAgICAgICBWaVBLZXlJZDsKK3R5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICAgVmlKb2JJZDsKK3R5cGVkZWYgVmlKb2JJZCAgICAgIF9WSV9QVFIgVmlQSm9iSWQ7Cit0eXBlZGVmIFZpVUludDMyICAgICAgICAgICAgIFZpQWNjZXNzTW9kZTsKK3R5cGVkZWYgVmlBY2Nlc3NNb2RlIF9WSV9QVFIgVmlQQWNjZXNzTW9kZTsKK3R5cGVkZWYgVmlCdXNBZGRyZXNzIF9WSV9QVFIgVmlQQnVzQWRkcmVzczsKK3R5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICAgVmlFdmVudEZpbHRlcjsKKwordHlwZWRlZiB2YV9saXN0ICAgICAgICAgICAgICBWaVZBTGlzdDsKKwordHlwZWRlZiBWaVN0YXR1cyAoX1ZJX0ZVTkNIIF9WSV9QVFIgVmlIbmRscikKKyAgIChWaVNlc3Npb24gdmksIFZpRXZlbnRUeXBlIGV2ZW50VHlwZSwgVmlFdmVudCBldmVudCwgVmlBZGRyIHVzZXJIYW5kbGUpOworCisvKi0gUmVzb3VyY2UgTWFuYWdlciBGdW5jdGlvbnMgYW5kIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU9wZW5EZWZhdWx0Uk0gKFZpUFNlc3Npb24gdmkpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpRmluZFJzcmMgICAgICAoVmlTZXNzaW9uIHNlc24sIFZpU3RyaW5nIGV4cHIsIFZpUEZpbmRMaXN0IHZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlQVUludDMyIHJldENudCwgVmlDaGFyIF9WSV9GQVIgZGVzY1tdKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUZpbmROZXh0ICAgICAgKFZpRmluZExpc3QgdmksIFZpQ2hhciBfVklfRkFSIGRlc2NbXSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlQYXJzZVJzcmMgICAgIChWaVNlc3Npb24gcm1TZXNuLCBWaVJzcmMgcnNyY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVBVSW50MTYgaW50ZlR5cGUsIFZpUFVJbnQxNiBpbnRmTnVtKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVBhcnNlUnNyY0V4ICAgKFZpU2Vzc2lvbiBybVNlc24sIFZpUnNyYyByc3JjTmFtZSwgVmlQVUludDE2IGludGZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlQVUludDE2IGludGZOdW0sIFZpQ2hhciBfVklfRkFSIHJzcmNDbGFzc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlDaGFyIF9WSV9GQVIgZXhwYW5kZWRVbmFsaWFzZWROYW1lW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUNoYXIgX1ZJX0ZBUiBhbGlhc0lmRXhpc3RzW10pOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3BlbiAgICAgICAgICAoVmlTZXNzaW9uIHNlc24sIFZpUnNyYyBuYW1lLCBWaUFjY2Vzc01vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVUludDMyIHRpbWVvdXQsIFZpUFNlc3Npb24gdmkpOworCisvKi0gUmVzb3VyY2UgVGVtcGxhdGUgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUNsb3NlICAgICAgICAgKFZpT2JqZWN0IHZpKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVNldEF0dHJpYnV0ZSAgKFZpT2JqZWN0IHZpLCBWaUF0dHIgYXR0ck5hbWUsIFZpQXR0clN0YXRlIGF0dHJWYWx1ZSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlHZXRBdHRyaWJ1dGUgIChWaU9iamVjdCB2aSwgVmlBdHRyIGF0dHJOYW1lLCB2b2lkIF9WSV9QVFIgYXR0clZhbHVlKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVN0YXR1c0Rlc2MgICAgKFZpT2JqZWN0IHZpLCBWaVN0YXR1cyBzdGF0dXMsIFZpQ2hhciBfVklfRkFSIGRlc2NbXSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlUZXJtaW5hdGUgICAgIChWaU9iamVjdCB2aSwgVmlVSW50MTYgZGVncmVlLCBWaUpvYklkIGpvYklkKTsKKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTG9jayAgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFjY2Vzc01vZGUgbG9ja1R5cGUsIFZpVUludDMyIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUtleUlkIHJlcXVlc3RlZEtleSwgVmlDaGFyIF9WSV9GQVIgYWNjZXNzS2V5W10pOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVW5sb2NrICAgICAgICAoVmlTZXNzaW9uIHZpKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUVuYWJsZUV2ZW50ICAgKFZpU2Vzc2lvbiB2aSwgVmlFdmVudFR5cGUgZXZlbnRUeXBlLCBWaVVJbnQxNiBtZWNoYW5pc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUV2ZW50RmlsdGVyIGNvbnRleHQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpRGlzYWJsZUV2ZW50ICAoVmlTZXNzaW9uIHZpLCBWaUV2ZW50VHlwZSBldmVudFR5cGUsIFZpVUludDE2IG1lY2hhbmlzbSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlEaXNjYXJkRXZlbnRzIChWaVNlc3Npb24gdmksIFZpRXZlbnRUeXBlIGV2ZW50VHlwZSwgVmlVSW50MTYgbWVjaGFuaXNtKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVdhaXRPbkV2ZW50ICAgKFZpU2Vzc2lvbiB2aSwgVmlFdmVudFR5cGUgaW5FdmVudFR5cGUsIFZpVUludDMyIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVBFdmVudFR5cGUgb3V0RXZlbnRUeXBlLCBWaVBFdmVudCBvdXRDb250ZXh0KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUluc3RhbGxIYW5kbGVyKFZpU2Vzc2lvbiB2aSwgVmlFdmVudFR5cGUgZXZlbnRUeXBlLCBWaUhuZGxyIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUFkZHIgdXNlckhhbmRsZSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlVbmluc3RhbGxIYW5kbGVyKFZpU2Vzc2lvbiB2aSwgVmlFdmVudFR5cGUgZXZlbnRUeXBlLCBWaUhuZGxyIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQWRkciB1c2VySGFuZGxlKTsKKworLyotIEJhc2ljIEkvTyBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWaVN0YXR1cyBfVklfRlVOQyAgdmlSZWFkICAgICAgICAgIChWaVNlc3Npb24gdmksIFZpUEJ1ZiBidWYsIFZpVUludDMyIGNudCwgVmlQVUludDMyIHJldENudCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlSZWFkQXN5bmMgICAgIChWaVNlc3Npb24gdmksIFZpUEJ1ZiBidWYsIFZpVUludDMyIGNudCwgVmlQSm9iSWQgIGpvYklkKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVJlYWRUb0ZpbGUgICAgKFZpU2Vzc2lvbiB2aSwgVmlDb25zdFN0cmluZyBmaWxlbmFtZSwgVmlVSW50MzIgY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlQVUludDMyIHJldENudCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlXcml0ZSAgICAgICAgIChWaVNlc3Npb24gdmksIFZpQnVmICBidWYsIFZpVUludDMyIGNudCwgVmlQVUludDMyIHJldENudCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlXcml0ZUFzeW5jICAgIChWaVNlc3Npb24gdmksIFZpQnVmICBidWYsIFZpVUludDMyIGNudCwgVmlQSm9iSWQgIGpvYklkKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVdyaXRlRnJvbUZpbGUgKFZpU2Vzc2lvbiB2aSwgVmlDb25zdFN0cmluZyBmaWxlbmFtZSwgVmlVSW50MzIgY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlQVUludDMyIHJldENudCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlBc3NlcnRUcmlnZ2VyIChWaVNlc3Npb24gdmksIFZpVUludDE2IHByb3RvY29sKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVJlYWRTVEIgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlQVUludDE2IHN0YXR1cyk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlDbGVhciAgICAgICAgIChWaVNlc3Npb24gdmkpOworCisvKi0gRm9ybWF0dGVkIGFuZCBCdWZmZXJlZCBJL08gT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVNldEJ1ZiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgbWFzaywgVmlVSW50MzIgc2l6ZSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlGbHVzaCAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IG1hc2spOworCitWaVN0YXR1cyBfVklfRlVOQyAgdmlCdWZXcml0ZSAgICAgIChWaVNlc3Npb24gdmksIFZpQnVmICBidWYsIFZpVUludDMyIGNudCwgVmlQVUludDMyIHJldENudCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlCdWZSZWFkICAgICAgIChWaVNlc3Npb24gdmksIFZpUEJ1ZiBidWYsIFZpVUludDMyIGNudCwgVmlQVUludDMyIHJldENudCk7CisKK1ZpU3RhdHVzIF9WSV9GVU5DQyB2aVByaW50ZiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlTdHJpbmcgd3JpdGVGbXQsIC4uLik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlWUHJpbnRmICAgICAgIChWaVNlc3Npb24gdmksIFZpU3RyaW5nIHdyaXRlRm10LCBWaVZBTGlzdCBwYXJhbXMpOworVmlTdGF0dXMgX1ZJX0ZVTkNDIHZpU1ByaW50ZiAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVBCdWYgYnVmLCBWaVN0cmluZyB3cml0ZUZtdCwgLi4uKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVZTUHJpbnRmICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlQQnVmIGJ1ZiwgVmlTdHJpbmcgd3JpdGVGbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVZBTGlzdCBwYXJtcyk7CisKK1ZpU3RhdHVzIF9WSV9GVU5DQyB2aVNjYW5mICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlTdHJpbmcgcmVhZEZtdCwgLi4uKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVZTY2FuZiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlTdHJpbmcgcmVhZEZtdCwgVmlWQUxpc3QgcGFyYW1zKTsKK1ZpU3RhdHVzIF9WSV9GVU5DQyB2aVNTY2FuZiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlCdWYgYnVmLCBWaVN0cmluZyByZWFkRm10LCAuLi4pOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVlNTY2FuZiAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1ZiBidWYsIFZpU3RyaW5nIHJlYWRGbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVZBTGlzdCBwYXJtcyk7CisKK1ZpU3RhdHVzIF9WSV9GVU5DQyB2aVF1ZXJ5ZiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlTdHJpbmcgd3JpdGVGbXQsIFZpU3RyaW5nIHJlYWRGbXQsIC4uLik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlWUXVlcnlmICAgICAgIChWaVNlc3Npb24gdmksIFZpU3RyaW5nIHdyaXRlRm10LCBWaVN0cmluZyByZWFkRm10LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVkFMaXN0IHBhcmFtcyk7CisKKy8qLSBNZW1vcnkgSS9PIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW44ICAgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBvZmZzZXQsIFZpUFVJbnQ4ICB2YWw4KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU91dDggICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LCBWaVVJbnQ4ICAgdmFsOCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlJbjE2ICAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIG9mZnNldCwgVmlQVUludDE2IHZhbDE2KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU91dDE2ICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LCBWaVVJbnQxNiAgdmFsMTYpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW4zMiAgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBvZmZzZXQsIFZpUFVJbnQzMiB2YWwzMik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlPdXQzMiAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIG9mZnNldCwgVmlVSW50MzIgIHZhbDMyKTsKKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQorVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW42NCAgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBvZmZzZXQsIFZpUFVJbnQ2NCB2YWw2NCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlPdXQ2NCAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIG9mZnNldCwgVmlVSW50NjQgIHZhbDY0KTsKKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW44RXggICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IG9mZnNldCwgVmlQVUludDggIHZhbDgpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3V0OEV4ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IG9mZnNldCwgVmlVSW50OCAgIHZhbDgpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW4xNkV4ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IG9mZnNldCwgVmlQVUludDE2IHZhbDE2KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU91dDE2RXggICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsIFZpVUludDE2ICB2YWwxNik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlJbjMyRXggICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LCBWaVBVSW50MzIgdmFsMzIpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3V0MzJFeCAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IG9mZnNldCwgVmlVSW50MzIgIHZhbDMyKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUluNjRFeCAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsIFZpUFVJbnQ2NCB2YWw2NCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlPdXQ2NEV4ICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LCBWaVVJbnQ2NCAgdmFsNjQpOworI2VuZGlmCisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVJbjggICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzcyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50OCAgYnVmOCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlT3V0OCAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDggIGJ1ZjgpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUluMTYgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQxNiBidWYxNik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlT3V0MTYgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDE2IGJ1ZjE2KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVJbjMyICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzcyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50MzIgYnVmMzIpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZU91dDMyICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQzMiBidWYzMik7CisKKyNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVJbjY0ICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzcyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50NjQgYnVmNjQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZU91dDY0ICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQ2NCBidWY2NCk7CisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVJbjhFeCAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzczY0IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQ4ICBidWY4KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVPdXQ4RXggICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzczY0IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQ4ICBidWY4KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVJbjE2RXggICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzczY0IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQxNiBidWYxNik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlT3V0MTZFeCAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50MTYgYnVmMTYpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUluMzJFeCAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDMyIGJ1ZjMyKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVPdXQzMkV4ICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzczY0IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQzMiBidWYzMik7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlSW42NEV4ICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50NjQgYnVmNjQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZU91dDY0RXggICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDY0IGJ1ZjY0KTsKKyNlbmRpZgorCitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlICAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNyY1NwYWNlLCBWaUJ1c0FkZHJlc3Mgc3JjT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlVSW50MTYgc3JjV2lkdGgsIFZpVUludDE2IGRlc3RTcGFjZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3MgZGVzdE9mZnNldCwgVmlVSW50MTYgZGVzdFdpZHRoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBzcmNMZW5ndGgpOyAKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVBc3luYyAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3JjU3BhY2UsIFZpQnVzQWRkcmVzcyBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVVJbnQxNiBzcmNXaWR0aCwgVmlVSW50MTYgZGVzdFNwYWNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBkZXN0T2Zmc2V0LCBWaVVJbnQxNiBkZXN0V2lkdGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIHNyY0xlbmd0aCwgVmlQSm9iSWQgam9iSWQpOworCisjaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpCitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlRXggICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNyY1NwYWNlLCBWaUJ1c0FkZHJlc3M2NCBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVVJbnQxNiBzcmNXaWR0aCwgVmlVSW50MTYgZGVzdFNwYWNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IGRlc3RPZmZzZXQsIFZpVUludDE2IGRlc3RXaWR0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgc3JjTGVuZ3RoKTsgCitWaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlQXN5bmNFeCAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNyY1NwYWNlLCBWaUJ1c0FkZHJlc3M2NCBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVVJbnQxNiBzcmNXaWR0aCwgVmlVSW50MTYgZGVzdFNwYWNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IGRlc3RPZmZzZXQsIFZpVUludDE2IGRlc3RXaWR0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgc3JjTGVuZ3RoLCBWaVBKb2JJZCBqb2JJZCk7CisjZW5kaWYKKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTWFwQWRkcmVzcyAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBtYXBTcGFjZSwgVmlCdXNBZGRyZXNzIG1hcE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBtYXBTaXplLCBWaUJvb2xlYW4gYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlBZGRyIHN1Z2dlc3RlZCwgVmlQQWRkciBhZGRyZXNzKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVVubWFwQWRkcmVzcyAgKFZpU2Vzc2lvbiB2aSk7CisKKyNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1hcEFkZHJlc3NFeCAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgbWFwU3BhY2UsIFZpQnVzQWRkcmVzczY0IG1hcE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBtYXBTaXplLCBWaUJvb2xlYW4gYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlBZGRyIHN1Z2dlc3RlZCwgVmlQQWRkciBhZGRyZXNzKTsKKyNlbmRpZgorCit2b2lkICAgICBfVklfRlVOQyAgdmlQZWVrOCAgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWRkciBhZGRyZXNzLCBWaVBVSW50OCAgdmFsOCk7Cit2b2lkICAgICBfVklfRlVOQyAgdmlQb2tlOCAgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWRkciBhZGRyZXNzLCBWaVVJbnQ4ICAgdmFsOCk7Cit2b2lkICAgICBfVklfRlVOQyAgdmlQZWVrMTYgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWRkciBhZGRyZXNzLCBWaVBVSW50MTYgdmFsMTYpOwordm9pZCAgICAgX1ZJX0ZVTkMgIHZpUG9rZTE2ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFkZHIgYWRkcmVzcywgVmlVSW50MTYgIHZhbDE2KTsKK3ZvaWQgICAgIF9WSV9GVU5DICB2aVBlZWszMiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBZGRyIGFkZHJlc3MsIFZpUFVJbnQzMiB2YWwzMik7Cit2b2lkICAgICBfVklfRlVOQyAgdmlQb2tlMzIgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWRkciBhZGRyZXNzLCBWaVVJbnQzMiAgdmFsMzIpOworCisjaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpCit2b2lkICAgICBfVklfRlVOQyAgdmlQZWVrNjQgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWRkciBhZGRyZXNzLCBWaVBVSW50NjQgdmFsNjQpOwordm9pZCAgICAgX1ZJX0ZVTkMgIHZpUG9rZTY0ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFkZHIgYWRkcmVzcywgVmlVSW50NjQgIHZhbDY0KTsKKyNlbmRpZgorCisvKi0gU2hhcmVkIE1lbW9yeSBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1lbUFsbG9jICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlCdXNTaXplIHNpemUsIFZpUEJ1c0FkZHJlc3Mgb2Zmc2V0KTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1lbUZyZWUgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlCdXNBZGRyZXNzIG9mZnNldCk7CisKKyNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aU1lbUFsbG9jRXggICAgKFZpU2Vzc2lvbiB2aSwgVmlCdXNTaXplIHNpemUsIFZpUEJ1c0FkZHJlc3M2NCBvZmZzZXQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTWVtRnJlZUV4ICAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQpOworI2VuZGlmCisKKy8qLSBJbnRlcmZhY2UgU3BlY2lmaWMgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpR3BpYkNvbnRyb2xSRU4oVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBtb2RlKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aUdwaWJDb250cm9sQVROKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgbW9kZSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlHcGliU2VuZElGQyAgIChWaVNlc3Npb24gdmkpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpR3BpYkNvbW1hbmQgICAoVmlTZXNzaW9uIHZpLCBWaUJ1ZiBjbWQsIFZpVUludDMyIGNudCwgVmlQVUludDMyIHJldENudCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlHcGliUGFzc0NvbnRyb2woVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBwcmltQWRkciwgVmlVSW50MTYgc2VjQWRkcik7CisKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVZ4aUNvbW1hbmRRdWVyeShWaVNlc3Npb24gdmksIFZpVUludDE2IG1vZGUsIFZpVUludDMyIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVBVSW50MzIgcmVzcG9uc2UpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpQXNzZXJ0VXRpbFNpZ25hbChWaVNlc3Npb24gdmksIFZpVUludDE2IGxpbmUpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpQXNzZXJ0SW50clNpZ25hbChWaVNlc3Npb24gdmksIFZpSW50MTYgbW9kZSwgVmlVSW50MzIgc3RhdHVzSUQpOworVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTWFwVHJpZ2dlciAgICAoVmlTZXNzaW9uIHZpLCBWaUludDE2IHRyaWdTcmMsIFZpSW50MTYgdHJpZ0Rlc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlVSW50MTYgbW9kZSk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlVbm1hcFRyaWdnZXIgIChWaVNlc3Npb24gdmksIFZpSW50MTYgdHJpZ1NyYywgVmlJbnQxNiB0cmlnRGVzdCk7CitWaVN0YXR1cyBfVklfRlVOQyAgdmlVc2JDb250cm9sT3V0IChWaVNlc3Npb24gdmksIFZpSW50MTYgYm1SZXF1ZXN0VHlwZSwgVmlJbnQxNiBiUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVUludDE2IHdWYWx1ZSwgVmlVSW50MTYgd0luZGV4LCBWaVVJbnQxNiB3TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdWYgYnVmKTsKK1ZpU3RhdHVzIF9WSV9GVU5DICB2aVVzYkNvbnRyb2xJbiAgKFZpU2Vzc2lvbiB2aSwgVmlJbnQxNiBibVJlcXVlc3RUeXBlLCBWaUludDE2IGJSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlVSW50MTYgd1ZhbHVlLCBWaVVJbnQxNiB3SW5kZXgsIFZpVUludDE2IHdMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVBCdWYgYnVmLCBWaVBVSW50MTYgcmV0Q250KTsKKworLyotIEF0dHJpYnV0ZXMgKHBsYXRmb3JtIGluZGVwZW5kZW50IHNpemUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZJX0FUVFJfUlNSQ19DTEFTUyAgICAgICAgICAoMHhCRkZGMDAwMVVMKQorI2RlZmluZSBWSV9BVFRSX1JTUkNfTkFNRSAgICAgICAgICAgKDB4QkZGRjAwMDJVTCkKKyNkZWZpbmUgVklfQVRUUl9SU1JDX0lNUExfVkVSU0lPTiAgICgweDNGRkYwMDAzVUwpCisjZGVmaW5lIFZJX0FUVFJfUlNSQ19MT0NLX1NUQVRFICAgICAoMHgzRkZGMDAwNFVMKQorI2RlZmluZSBWSV9BVFRSX01BWF9RVUVVRV9MRU5HVEggICAgKDB4M0ZGRjAwMDVVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0VSX0RBVEFfMzIgICAgICAgICgweDNGRkYwMDA3VUwpCisjZGVmaW5lIFZJX0FUVFJfRkRDX0NITkwgICAgICAgICAgICAoMHgzRkZGMDAwRFVMKQorI2RlZmluZSBWSV9BVFRSX0ZEQ19NT0RFICAgICAgICAgICAgKDB4M0ZGRjAwMEZVTCkKKyNkZWZpbmUgVklfQVRUUl9GRENfR0VOX1NJR05BTF9FTiAgICgweDNGRkYwMDExVUwpCisjZGVmaW5lIFZJX0FUVFJfRkRDX1VTRV9QQUlSICAgICAgICAoMHgzRkZGMDAxM1VMKQorI2RlZmluZSBWSV9BVFRSX1NFTkRfRU5EX0VOICAgICAgICAgKDB4M0ZGRjAwMTZVTCkKKyNkZWZpbmUgVklfQVRUUl9URVJNQ0hBUiAgICAgICAgICAgICgweDNGRkYwMDE4VUwpCisjZGVmaW5lIFZJX0FUVFJfVE1PX1ZBTFVFICAgICAgICAgICAoMHgzRkZGMDAxQVVMKQorI2RlZmluZSBWSV9BVFRSX0dQSUJfUkVBRERSX0VOICAgICAgKDB4M0ZGRjAwMUJVTCkKKyNkZWZpbmUgVklfQVRUUl9JT19QUk9UICAgICAgICAgICAgICgweDNGRkYwMDFDVUwpCisjZGVmaW5lIFZJX0FUVFJfRE1BX0FMTE9XX0VOICAgICAgICAoMHgzRkZGMDAxRVVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfQkFVRCAgICAgICAgICAgKDB4M0ZGRjAwMjFVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0RBVEFfQklUUyAgICAgICgweDNGRkYwMDIyVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9QQVJJVFkgICAgICAgICAoMHgzRkZGMDAyM1VMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfU1RPUF9CSVRTICAgICAgKDB4M0ZGRjAwMjRVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0ZMT1dfQ05UUkwgICAgICgweDNGRkYwMDI1VUwpCisjZGVmaW5lIFZJX0FUVFJfUkRfQlVGX09QRVJfTU9ERSAgICAoMHgzRkZGMDAyQVVMKQorI2RlZmluZSBWSV9BVFRSX1JEX0JVRl9TSVpFICAgICAgICAgKDB4M0ZGRjAwMkJVTCkKKyNkZWZpbmUgVklfQVRUUl9XUl9CVUZfT1BFUl9NT0RFICAgICgweDNGRkYwMDJEVUwpCisjZGVmaW5lIFZJX0FUVFJfV1JfQlVGX1NJWkUgICAgICAgICAoMHgzRkZGMDAyRVVMKQorI2RlZmluZSBWSV9BVFRSX1NVUFBSRVNTX0VORF9FTiAgICAgKDB4M0ZGRjAwMzZVTCkKKyNkZWZpbmUgVklfQVRUUl9URVJNQ0hBUl9FTiAgICAgICAgICgweDNGRkYwMDM4VUwpCisjZGVmaW5lIFZJX0FUVFJfREVTVF9BQ0NFU1NfUFJJViAgICAoMHgzRkZGMDAzOVVMKQorI2RlZmluZSBWSV9BVFRSX0RFU1RfQllURV9PUkRFUiAgICAgKDB4M0ZGRjAwM0FVTCkKKyNkZWZpbmUgVklfQVRUUl9TUkNfQUNDRVNTX1BSSVYgICAgICgweDNGRkYwMDNDVUwpCisjZGVmaW5lIFZJX0FUVFJfU1JDX0JZVEVfT1JERVIgICAgICAoMHgzRkZGMDAzRFVMKQorI2RlZmluZSBWSV9BVFRSX1NSQ19JTkNSRU1FTlQgICAgICAgKDB4M0ZGRjAwNDBVTCkKKyNkZWZpbmUgVklfQVRUUl9ERVNUX0lOQ1JFTUVOVCAgICAgICgweDNGRkYwMDQxVUwpCisjZGVmaW5lIFZJX0FUVFJfV0lOX0FDQ0VTU19QUklWICAgICAoMHgzRkZGMDA0NVVMKQorI2RlZmluZSBWSV9BVFRSX1dJTl9CWVRFX09SREVSICAgICAgKDB4M0ZGRjAwNDdVTCkKKyNkZWZpbmUgVklfQVRUUl9HUElCX0FUTl9TVEFURSAgICAgICgweDNGRkYwMDU3VUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9BRERSX1NUQVRFICAgICAoMHgzRkZGMDA1Q1VMKQorI2RlZmluZSBWSV9BVFRSX0dQSUJfQ0lDX1NUQVRFICAgICAgKDB4M0ZGRjAwNUVVTCkKKyNkZWZpbmUgVklfQVRUUl9HUElCX05EQUNfU1RBVEUgICAgICgweDNGRkYwMDYyVUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9TUlFfU1RBVEUgICAgICAoMHgzRkZGMDA2N1VMKQorI2RlZmluZSBWSV9BVFRSX0dQSUJfU1lTX0NOVFJMX1NUQVRFICgweDNGRkYwMDY4VUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9IUzQ4OF9DQkxfTEVOICAoMHgzRkZGMDA2OVVMKQorI2RlZmluZSBWSV9BVFRSX0NNRFJfTEEgICAgICAgICAgICAgKDB4M0ZGRjAwNkJVTCkKKyNkZWZpbmUgVklfQVRUUl9WWElfREVWX0NMQVNTICAgICAgICgweDNGRkYwMDZDVUwpCisjZGVmaW5lIFZJX0FUVFJfTUFJTkZSQU1FX0xBICAgICAgICAoMHgzRkZGMDA3MFVMKQorI2RlZmluZSBWSV9BVFRSX01BTkZfTkFNRSAgICAgICAgICAgKDB4QkZGRjAwNzJVTCkKKyNkZWZpbmUgVklfQVRUUl9NT0RFTF9OQU1FICAgICAgICAgICgweEJGRkYwMDc3VUwpCisjZGVmaW5lIFZJX0FUVFJfVlhJX1ZNRV9JTlRSX1NUQVRVUyAoMHgzRkZGMDA4QlVMKQorI2RlZmluZSBWSV9BVFRSX1ZYSV9UUklHX1NUQVRVUyAgICAgKDB4M0ZGRjAwOERVTCkKKyNkZWZpbmUgVklfQVRUUl9WWElfVk1FX1NZU0ZBSUxfU1RBVEUgKDB4M0ZGRjAwOTRVTCkKKyNkZWZpbmUgVklfQVRUUl9XSU5fQkFTRV9BRERSXzMyICAgICgweDNGRkYwMDk4VUwpCisjZGVmaW5lIFZJX0FUVFJfV0lOX1NJWkVfMzIgICAgICAgICAoMHgzRkZGMDA5QVVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfQVZBSUxfTlVNICAgICAgKDB4M0ZGRjAwQUNVTCkKKyNkZWZpbmUgVklfQVRUUl9NRU1fQkFTRV8zMiAgICAgICAgICgweDNGRkYwMEFEVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9DVFNfU1RBVEUgICAgICAoMHgzRkZGMDBBRVVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfRENEX1NUQVRFICAgICAgKDB4M0ZGRjAwQUZVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0RTUl9TVEFURSAgICAgICgweDNGRkYwMEIxVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9EVFJfU1RBVEUgICAgICAoMHgzRkZGMDBCMlVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfRU5EX0lOICAgICAgICAgKDB4M0ZGRjAwQjNVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0VORF9PVVQgICAgICAgICgweDNGRkYwMEI0VUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9SRVBMQUNFX0NIQVIgICAoMHgzRkZGMDBCRVVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfUklfU1RBVEUgICAgICAgKDB4M0ZGRjAwQkZVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX1JUU19TVEFURSAgICAgICgweDNGRkYwMEMwVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9YT05fQ0hBUiAgICAgICAoMHgzRkZGMDBDMVVMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfWE9GRl9DSEFSICAgICAgKDB4M0ZGRjAwQzJVTCkKKyNkZWZpbmUgVklfQVRUUl9XSU5fQUNDRVNTICAgICAgICAgICgweDNGRkYwMEMzVUwpCisjZGVmaW5lIFZJX0FUVFJfUk1fU0VTU0lPTiAgICAgICAgICAoMHgzRkZGMDBDNFVMKQorI2RlZmluZSBWSV9BVFRSX1ZYSV9MQSAgICAgICAgICAgICAgKDB4M0ZGRjAwRDVVTCkKKyNkZWZpbmUgVklfQVRUUl9NQU5GX0lEICAgICAgICAgICAgICgweDNGRkYwMEQ5VUwpCisjZGVmaW5lIFZJX0FUVFJfTUVNX1NJWkVfMzIgICAgICAgICAoMHgzRkZGMDBERFVMKQorI2RlZmluZSBWSV9BVFRSX01FTV9TUEFDRSAgICAgICAgICAgKDB4M0ZGRjAwREVVTCkKKyNkZWZpbmUgVklfQVRUUl9NT0RFTF9DT0RFICAgICAgICAgICgweDNGRkYwMERGVUwpCisjZGVmaW5lIFZJX0FUVFJfU0xPVCAgICAgICAgICAgICAgICAoMHgzRkZGMDBFOFVMKQorI2RlZmluZSBWSV9BVFRSX0lOVEZfSU5TVF9OQU1FICAgICAgKDB4QkZGRjAwRTlVTCkKKyNkZWZpbmUgVklfQVRUUl9JTU1FRElBVEVfU0VSViAgICAgICgweDNGRkYwMTAwVUwpCisjZGVmaW5lIFZJX0FUVFJfSU5URl9QQVJFTlRfTlVNICAgICAoMHgzRkZGMDEwMVVMKQorI2RlZmluZSBWSV9BVFRSX1JTUkNfU1BFQ19WRVJTSU9OICAgKDB4M0ZGRjAxNzBVTCkKKyNkZWZpbmUgVklfQVRUUl9JTlRGX1RZUEUgICAgICAgICAgICgweDNGRkYwMTcxVUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9QUklNQVJZX0FERFIgICAoMHgzRkZGMDE3MlVMKQorI2RlZmluZSBWSV9BVFRSX0dQSUJfU0VDT05EQVJZX0FERFIgKDB4M0ZGRjAxNzNVTCkKKyNkZWZpbmUgVklfQVRUUl9SU1JDX01BTkZfTkFNRSAgICAgICgweEJGRkYwMTc0VUwpCisjZGVmaW5lIFZJX0FUVFJfUlNSQ19NQU5GX0lEICAgICAgICAoMHgzRkZGMDE3NVVMKQorI2RlZmluZSBWSV9BVFRSX0lOVEZfTlVNICAgICAgICAgICAgKDB4M0ZGRjAxNzZVTCkKKyNkZWZpbmUgVklfQVRUUl9UUklHX0lEICAgICAgICAgICAgICgweDNGRkYwMTc3VUwpCisjZGVmaW5lIFZJX0FUVFJfR1BJQl9SRU5fU1RBVEUgICAgICAoMHgzRkZGMDE4MVVMKQorI2RlZmluZSBWSV9BVFRSX0dQSUJfVU5BRERSX0VOICAgICAgKDB4M0ZGRjAxODRVTCkKKyNkZWZpbmUgVklfQVRUUl9ERVZfU1RBVFVTX0JZVEUgICAgICgweDNGRkYwMTg5VUwpCisjZGVmaW5lIFZJX0FUVFJfRklMRV9BUFBFTkRfRU4gICAgICAoMHgzRkZGMDE5MlVMKQorI2RlZmluZSBWSV9BVFRSX1ZYSV9UUklHX1NVUFBPUlQgICAgKDB4M0ZGRjAxOTRVTCkKKyNkZWZpbmUgVklfQVRUUl9UQ1BJUF9BRERSICAgICAgICAgICgweEJGRkYwMTk1VUwpCisjZGVmaW5lIFZJX0FUVFJfVENQSVBfSE9TVE5BTUUgICAgICAoMHhCRkZGMDE5NlVMKQorI2RlZmluZSBWSV9BVFRSX1RDUElQX1BPUlQgICAgICAgICAgKDB4M0ZGRjAxOTdVTCkKKyNkZWZpbmUgVklfQVRUUl9UQ1BJUF9ERVZJQ0VfTkFNRSAgICgweEJGRkYwMTk5VUwpCisjZGVmaW5lIFZJX0FUVFJfVENQSVBfTk9ERUxBWSAgICAgICAoMHgzRkZGMDE5QVVMKQorI2RlZmluZSBWSV9BVFRSX1RDUElQX0tFRVBBTElWRSAgICAgKDB4M0ZGRjAxOUJVTCkKKyNkZWZpbmUgVklfQVRUUl80ODgyX0NPTVBMSUFOVCAgICAgICgweDNGRkYwMTlGVUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX1NFUklBTF9OVU0gICAgICAoMHhCRkZGMDFBMFVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9JTlRGQ19OVU0gICAgICAgKDB4M0ZGRjAxQTFVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfUFJPVE9DT0wgICAgICAgICgweDNGRkYwMUE3VUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX01BWF9JTlRSX1NJWkUgICAoMHgzRkZGMDFBRlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9ERVZfTlVNICAgICAgICAgKDB4M0ZGRjAyMDFVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfRlVOQ19OVU0gICAgICAgICgweDNGRkYwMjAyVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX0JVU19OVU0gICAgICAgICAoMHgzRkZGMDIwNVVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9DSEFTU0lTICAgICAgICAgKDB4M0ZGRjAyMDZVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfU0xPVFBBVEggICAgICAgICgweEJGRkYwMjA3VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX1NMT1RfTEJVU19MRUZUICAoMHgzRkZGMDIwOFVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9TTE9UX0xCVVNfUklHSFQgKDB4M0ZGRjAyMDlVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfVFJJR19CVVMgICAgICAgICgweDNGRkYwMjBBVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX1NUQVJfVFJJR19CVVMgICAoMHgzRkZGMDIwQlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9TVEFSX1RSSUdfTElORSAgKDB4M0ZGRjAyMENVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1RZUEVfQkFSMCAgICgweDNGRkYwMjExVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9UWVBFX0JBUjEgICAoMHgzRkZGMDIxMlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fVFlQRV9CQVIyICAgKDB4M0ZGRjAyMTNVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1RZUEVfQkFSMyAgICgweDNGRkYwMjE0VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9UWVBFX0JBUjQgICAoMHgzRkZGMDIxNVVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fVFlQRV9CQVI1ICAgKDB4M0ZGRjAyMTZVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX0JBU0VfQkFSMCAgICgweDNGRkYwMjIxVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9CQVNFX0JBUjEgICAoMHgzRkZGMDIyMlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fQkFTRV9CQVIyICAgKDB4M0ZGRjAyMjNVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX0JBU0VfQkFSMyAgICgweDNGRkYwMjI0VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9CQVNFX0JBUjQgICAoMHgzRkZGMDIyNVVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fQkFTRV9CQVI1ICAgKDB4M0ZGRjAyMjZVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1NJWkVfQkFSMCAgICgweDNGRkYwMjMxVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9TSVpFX0JBUjEgICAoMHgzRkZGMDIzMlVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fU0laRV9CQVIyICAgKDB4M0ZGRjAyMzNVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1NJWkVfQkFSMyAgICgweDNGRkYwMjM0VUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9TSVpFX0JBUjQgICAoMHgzRkZGMDIzNVVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fU0laRV9CQVI1ICAgKDB4M0ZGRjAyMzZVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfSVNfRVhQUkVTUyAgICAgICgweDNGRkYwMjQwVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX1NMT1RfTFdJRFRIICAgICAoMHgzRkZGMDI0MVVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9NQVhfTFdJRFRIICAgICAgKDB4M0ZGRjAyNDJVTCkKKyNkZWZpbmUgVklfQVRUUl9QWElfQUNUVUFMX0xXSURUSCAgICgweDNGRkYwMjQzVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX0RTVEFSX0JVUyAgICAgICAoMHgzRkZGMDI0NFVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9EU1RBUl9TRVQgICAgICAgKDB4M0ZGRjAyNDVVTCkKKworI2RlZmluZSBWSV9BVFRSX0pPQl9JRCAgICAgICAgICAgICAgKDB4M0ZGRjQwMDZVTCkKKyNkZWZpbmUgVklfQVRUUl9FVkVOVF9UWVBFICAgICAgICAgICgweDNGRkY0MDEwVUwpCisjZGVmaW5lIFZJX0FUVFJfU0lHUF9TVEFUVVNfSUQgICAgICAoMHgzRkZGNDAxMVVMKQorI2RlZmluZSBWSV9BVFRSX1JFQ1ZfVFJJR19JRCAgICAgICAgKDB4M0ZGRjQwMTJVTCkKKyNkZWZpbmUgVklfQVRUUl9JTlRSX1NUQVRVU19JRCAgICAgICgweDNGRkY0MDIzVUwpCisjZGVmaW5lIFZJX0FUVFJfU1RBVFVTICAgICAgICAgICAgICAoMHgzRkZGNDAyNVVMKQorI2RlZmluZSBWSV9BVFRSX1JFVF9DT1VOVF8zMiAgICAgICAgKDB4M0ZGRjQwMjZVTCkKKyNkZWZpbmUgVklfQVRUUl9CVUZGRVIgICAgICAgICAgICAgICgweDNGRkY0MDI3VUwpCisjZGVmaW5lIFZJX0FUVFJfUkVDVl9JTlRSX0xFVkVMICAgICAoMHgzRkZGNDA0MVVMKQorI2RlZmluZSBWSV9BVFRSX09QRVJfTkFNRSAgICAgICAgICAgKDB4QkZGRjQwNDJVTCkKKyNkZWZpbmUgVklfQVRUUl9HUElCX1JFQ1ZfQ0lDX1NUQVRFICgweDNGRkY0MTkzVUwpCisjZGVmaW5lIFZJX0FUVFJfUkVDVl9UQ1BJUF9BRERSICAgICAoMHhCRkZGNDE5OFVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9SRUNWX0lOVFJfU0laRSAgKDB4M0ZGRjQxQjBVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfUkVDVl9JTlRSX0RBVEEgICgweEJGRkY0MUIxVUwpCisKKy8qLSBBdHRyaWJ1dGVzIChwbGF0Zm9ybSBkZXBlbmRlbnQgc2l6ZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKSAmJiBkZWZpbmVkKF9WSVNBX0VOVl9JU182NF9CSVQpCisjZGVmaW5lIFZJX0FUVFJfVVNFUl9EQVRBXzY0ICAgICAgICAoMHgzRkZGMDAwQVVMKQorI2RlZmluZSBWSV9BVFRSX1JFVF9DT1VOVF82NCAgICAgICAgKDB4M0ZGRjQwMjhVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0VSX0RBVEEgICAgICAgICAgIChWSV9BVFRSX1VTRVJfREFUQV82NCkKKyNkZWZpbmUgVklfQVRUUl9SRVRfQ09VTlQgICAgICAgICAgIChWSV9BVFRSX1JFVF9DT1VOVF82NCkKKyNlbHNlCisjZGVmaW5lIFZJX0FUVFJfVVNFUl9EQVRBICAgICAgICAgICAoVklfQVRUUl9VU0VSX0RBVEFfMzIpCisjZGVmaW5lIFZJX0FUVFJfUkVUX0NPVU5UICAgICAgICAgICAoVklfQVRUUl9SRVRfQ09VTlRfMzIpCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQorI2RlZmluZSBWSV9BVFRSX1dJTl9CQVNFX0FERFJfNjQgICAgKDB4M0ZGRjAwOUJVTCkKKyNkZWZpbmUgVklfQVRUUl9XSU5fU0laRV82NCAgICAgICAgICgweDNGRkYwMDlDVUwpCisjZGVmaW5lIFZJX0FUVFJfTUVNX0JBU0VfNjQgICAgICAgICAoMHgzRkZGMDBEMFVMKQorI2RlZmluZSBWSV9BVFRSX01FTV9TSVpFXzY0ICAgICAgICAgKDB4M0ZGRjAwRDFVTCkKKyNlbmRpZgorI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKSAmJiBkZWZpbmVkKF9WSVNBX0VOVl9JU182NF9CSVQpCisjZGVmaW5lIFZJX0FUVFJfV0lOX0JBU0VfQUREUiAgICAgICAoVklfQVRUUl9XSU5fQkFTRV9BRERSXzY0KQorI2RlZmluZSBWSV9BVFRSX1dJTl9TSVpFICAgICAgICAgICAgKFZJX0FUVFJfV0lOX1NJWkVfNjQpCisjZGVmaW5lIFZJX0FUVFJfTUVNX0JBU0UgICAgICAgICAgICAoVklfQVRUUl9NRU1fQkFTRV82NCkKKyNkZWZpbmUgVklfQVRUUl9NRU1fU0laRSAgICAgICAgICAgIChWSV9BVFRSX01FTV9TSVpFXzY0KQorI2Vsc2UKKyNkZWZpbmUgVklfQVRUUl9XSU5fQkFTRV9BRERSICAgICAgIChWSV9BVFRSX1dJTl9CQVNFX0FERFJfMzIpCisjZGVmaW5lIFZJX0FUVFJfV0lOX1NJWkUgICAgICAgICAgICAoVklfQVRUUl9XSU5fU0laRV8zMikKKyNkZWZpbmUgVklfQVRUUl9NRU1fQkFTRSAgICAgICAgICAgIChWSV9BVFRSX01FTV9CQVNFXzMyKQorI2RlZmluZSBWSV9BVFRSX01FTV9TSVpFICAgICAgICAgICAgKFZJX0FUVFJfTUVNX1NJWkVfMzIpCisjZW5kaWYKKworLyotIEV2ZW50IFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZJX0VWRU5UX0lPX0NPTVBMRVRJT04gICAgICAoMHgzRkZGMjAwOVVMKQorI2RlZmluZSBWSV9FVkVOVF9UUklHICAgICAgICAgICAgICAgKDB4QkZGRjIwMEFVTCkKKyNkZWZpbmUgVklfRVZFTlRfU0VSVklDRV9SRVEgICAgICAgICgweDNGRkYyMDBCVUwpCisjZGVmaW5lIFZJX0VWRU5UX0NMRUFSICAgICAgICAgICAgICAoMHgzRkZGMjAwRFVMKQorI2RlZmluZSBWSV9FVkVOVF9FWENFUFRJT04gICAgICAgICAgKDB4QkZGRjIwMEVVTCkKKyNkZWZpbmUgVklfRVZFTlRfR1BJQl9DSUMgICAgICAgICAgICgweDNGRkYyMDEyVUwpCisjZGVmaW5lIFZJX0VWRU5UX0dQSUJfVEFMSyAgICAgICAgICAoMHgzRkZGMjAxM1VMKQorI2RlZmluZSBWSV9FVkVOVF9HUElCX0xJU1RFTiAgICAgICAgKDB4M0ZGRjIwMTRVTCkKKyNkZWZpbmUgVklfRVZFTlRfVlhJX1ZNRV9TWVNGQUlMICAgICgweDNGRkYyMDFEVUwpCisjZGVmaW5lIFZJX0VWRU5UX1ZYSV9WTUVfU1lTUkVTRVQgICAoMHgzRkZGMjAxRVVMKQorI2RlZmluZSBWSV9FVkVOVF9WWElfU0lHUCAgICAgICAgICAgKDB4M0ZGRjIwMjBVTCkKKyNkZWZpbmUgVklfRVZFTlRfVlhJX1ZNRV9JTlRSICAgICAgICgweEJGRkYyMDIxVUwpCisjZGVmaW5lIFZJX0VWRU5UX1BYSV9JTlRSICAgICAgICAgICAoMHgzRkZGMjAyMlVMKQorI2RlZmluZSBWSV9FVkVOVF9UQ1BJUF9DT05ORUNUICAgICAgKDB4M0ZGRjIwMzZVTCkKKyNkZWZpbmUgVklfRVZFTlRfVVNCX0lOVFIgICAgICAgICAgICgweDNGRkYyMDM3VUwpCisKKyNkZWZpbmUgVklfQUxMX0VOQUJMRURfRVZFTlRTICAgICAgICgweDNGRkY3RkZGVUwpCisKKy8qLSBDb21wbGV0aW9uIGFuZCBFcnJvciBDb2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBWSV9TVUNDRVNTX0VWRU5UX0VOICAgICAgICAgICAgICAgICAgICgweDNGRkYwMDAyTCkgLyogM0ZGRjAwMDIsICAxMDczNjc2MjkwICovCisjZGVmaW5lIFZJX1NVQ0NFU1NfRVZFTlRfRElTICAgICAgICAgICAgICAgICAgKDB4M0ZGRjAwMDNMKSAvKiAzRkZGMDAwMywgIDEwNzM2NzYyOTEgKi8KKyNkZWZpbmUgVklfU1VDQ0VTU19RVUVVRV9FTVBUWSAgICAgICAgICAgICAgICAoMHgzRkZGMDAwNEwpIC8qIDNGRkYwMDA0LCAgMTA3MzY3NjI5MiAqLworI2RlZmluZSBWSV9TVUNDRVNTX1RFUk1fQ0hBUiAgICAgICAgICAgICAgICAgICgweDNGRkYwMDA1TCkgLyogM0ZGRjAwMDUsICAxMDczNjc2MjkzICovCisjZGVmaW5lIFZJX1NVQ0NFU1NfTUFYX0NOVCAgICAgICAgICAgICAgICAgICAgKDB4M0ZGRjAwMDZMKSAvKiAzRkZGMDAwNiwgIDEwNzM2NzYyOTQgKi8KKyNkZWZpbmUgVklfU1VDQ0VTU19ERVZfTlBSRVNFTlQgICAgICAgICAgICAgICAoMHgzRkZGMDA3REwpIC8qIDNGRkYwMDdELCAgMTA3MzY3NjQxMyAqLworI2RlZmluZSBWSV9TVUNDRVNTX1RSSUdfTUFQUEVEICAgICAgICAgICAgICAgICgweDNGRkYwMDdFTCkgLyogM0ZGRjAwN0UsICAxMDczNjc2NDE0ICovCisjZGVmaW5lIFZJX1NVQ0NFU1NfUVVFVUVfTkVNUFRZICAgICAgICAgICAgICAgKDB4M0ZGRjAwODBMKSAvKiAzRkZGMDA4MCwgIDEwNzM2NzY0MTYgKi8KKyNkZWZpbmUgVklfU1VDQ0VTU19OQ0hBSU4gICAgICAgICAgICAgICAgICAgICAoMHgzRkZGMDA5OEwpIC8qIDNGRkYwMDk4LCAgMTA3MzY3NjQ0MCAqLworI2RlZmluZSBWSV9TVUNDRVNTX05FU1RFRF9TSEFSRUQgICAgICAgICAgICAgICgweDNGRkYwMDk5TCkgLyogM0ZGRjAwOTksICAxMDczNjc2NDQxICovCisjZGVmaW5lIFZJX1NVQ0NFU1NfTkVTVEVEX0VYQ0xVU0lWRSAgICAgICAgICAgKDB4M0ZGRjAwOUFMKSAvKiAzRkZGMDA5QSwgIDEwNzM2NzY0NDIgKi8KKyNkZWZpbmUgVklfU1VDQ0VTU19TWU5DICAgICAgICAgICAgICAgICAgICAgICAoMHgzRkZGMDA5QkwpIC8qIDNGRkYwMDlCLCAgMTA3MzY3NjQ0MyAqLworCisjZGVmaW5lIFZJX1dBUk5fUVVFVUVfT1ZFUkZMT1cgICAgICAgICAgICAgICAgKDB4M0ZGRjAwMENMKSAvKiAzRkZGMDAwQywgIDEwNzM2NzYzMDAgKi8KKyNkZWZpbmUgVklfV0FSTl9DT05GSUdfTkxPQURFRCAgICAgICAgICAgICAgICAoMHgzRkZGMDA3N0wpIC8qIDNGRkYwMDc3LCAgMTA3MzY3NjQwNyAqLworI2RlZmluZSBWSV9XQVJOX05VTExfT0JKRUNUICAgICAgICAgICAgICAgICAgICgweDNGRkYwMDgyTCkgLyogM0ZGRjAwODIsICAxMDczNjc2NDE4ICovCisjZGVmaW5lIFZJX1dBUk5fTlNVUF9BVFRSX1NUQVRFICAgICAgICAgICAgICAgKDB4M0ZGRjAwODRMKSAvKiAzRkZGMDA4NCwgIDEwNzM2NzY0MjAgKi8KKyNkZWZpbmUgVklfV0FSTl9VTktOT1dOX1NUQVRVUyAgICAgICAgICAgICAgICAoMHgzRkZGMDA4NUwpIC8qIDNGRkYwMDg1LCAgMTA3MzY3NjQyMSAqLworI2RlZmluZSBWSV9XQVJOX05TVVBfQlVGICAgICAgICAgICAgICAgICAgICAgICgweDNGRkYwMDg4TCkgLyogM0ZGRjAwODgsICAxMDczNjc2NDI0ICovCisjZGVmaW5lIFZJX1dBUk5fRVhUX0ZVTkNfTklNUEwgICAgICAgICAgICAgICAgKDB4M0ZGRjAwQTlMKSAvKiAzRkZGMDBBOSwgIDEwNzM2NzY0NTcgKi8KKworI2RlZmluZSBWSV9FUlJPUl9TWVNURU1fRVJST1IgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDAwTCkgLyogQkZGRjAwMDAsIC0xMDczODA3MzYwICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9PQkpFQ1QgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMEVMKSAvKiBCRkZGMDAwRSwgLTEwNzM4MDczNDYgKi8KKyNkZWZpbmUgVklfRVJST1JfUlNSQ19MT0NLRUQgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAwRkwpIC8qIEJGRkYwMDBGLCAtMTA3MzgwNzM0NSAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfRVhQUiAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDEwTCkgLyogQkZGRjAwMTAsIC0xMDczODA3MzQ0ICovCisjZGVmaW5lIFZJX0VSUk9SX1JTUkNfTkZPVU5EICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMTFMKSAvKiBCRkZGMDAxMSwgLTEwNzM4MDczNDMgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX1JTUkNfTkFNRSAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxMkwpIC8qIEJGRkYwMDEyLCAtMTA3MzgwNzM0MiAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfQUNDX01PREUgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDEzTCkgLyogQkZGRjAwMTMsIC0xMDczODA3MzQxICovCisjZGVmaW5lIFZJX0VSUk9SX1RNTyAgICAgICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMTVMKSAvKiBCRkZGMDAxNSwgLTEwNzM4MDczMzkgKi8KKyNkZWZpbmUgVklfRVJST1JfQ0xPU0lOR19GQUlMRUQgICAgIChfVklfRVJST1IrMHgzRkZGMDAxNkwpIC8qIEJGRkYwMDE2LCAtMTA3MzgwNzMzOCAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfREVHUkVFICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDFCTCkgLyogQkZGRjAwMUIsIC0xMDczODA3MzMzICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9KT0JfSUQgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMUNMKSAvKiBCRkZGMDAxQywgLTEwNzM4MDczMzIgKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9BVFRSICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxREwpIC8qIEJGRkYwMDFELCAtMTA3MzgwNzMzMSAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX0FUVFJfU1RBVEUgICAgKF9WSV9FUlJPUisweDNGRkYwMDFFTCkgLyogQkZGRjAwMUUsIC0xMDczODA3MzMwICovCisjZGVmaW5lIFZJX0VSUk9SX0FUVFJfUkVBRE9OTFkgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMUZMKSAvKiBCRkZGMDAxRiwgLTEwNzM4MDczMjkgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX0xPQ0tfVFlQRSAgICAgIChfVklfRVJST1IrMHgzRkZGMDAyMEwpIC8qIEJGRkYwMDIwLCAtMTA3MzgwNzMyOCAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfQUNDRVNTX0tFWSAgICAgKF9WSV9FUlJPUisweDNGRkYwMDIxTCkgLyogQkZGRjAwMjEsIC0xMDczODA3MzI3ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9FVkVOVCAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMjZMKSAvKiBCRkZGMDAyNiwgLTEwNzM4MDczMjIgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX01FQ0ggICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAyN0wpIC8qIEJGRkYwMDI3LCAtMTA3MzgwNzMyMSAqLworI2RlZmluZSBWSV9FUlJPUl9ITkRMUl9OSU5TVEFMTEVEICAgKF9WSV9FUlJPUisweDNGRkYwMDI4TCkgLyogQkZGRjAwMjgsIC0xMDczODA3MzIwICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9ITkRMUl9SRUYgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMjlMKSAvKiBCRkZGMDAyOSwgLTEwNzM4MDczMTkgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX0NPTlRFWFQgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAyQUwpIC8qIEJGRkYwMDJBLCAtMTA3MzgwNzMxOCAqLworI2RlZmluZSBWSV9FUlJPUl9RVUVVRV9PVkVSRkxPVyAgICAgKF9WSV9FUlJPUisweDNGRkYwMDJETCkgLyogQkZGRjAwMkQsIC0xMDczODA3MzE1ICovCisjZGVmaW5lIFZJX0VSUk9SX05FTkFCTEVEICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMkZMKSAvKiBCRkZGMDAyRiwgLTEwNzM4MDczMTMgKi8KKyNkZWZpbmUgVklfRVJST1JfQUJPUlQgICAgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzMEwpIC8qIEJGRkYwMDMwLCAtMTA3MzgwNzMxMiAqLworI2RlZmluZSBWSV9FUlJPUl9SQVdfV1JfUFJPVF9WSU9MICAgKF9WSV9FUlJPUisweDNGRkYwMDM0TCkgLyogQkZGRjAwMzQsIC0xMDczODA3MzA4ICovCisjZGVmaW5lIFZJX0VSUk9SX1JBV19SRF9QUk9UX1ZJT0wgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMzVMKSAvKiBCRkZGMDAzNSwgLTEwNzM4MDczMDcgKi8KKyNkZWZpbmUgVklfRVJST1JfT1VUUF9QUk9UX1ZJT0wgICAgIChfVklfRVJST1IrMHgzRkZGMDAzNkwpIC8qIEJGRkYwMDM2LCAtMTA3MzgwNzMwNiAqLworI2RlZmluZSBWSV9FUlJPUl9JTlBfUFJPVF9WSU9MICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDM3TCkgLyogQkZGRjAwMzcsIC0xMDczODA3MzA1ICovCisjZGVmaW5lIFZJX0VSUk9SX0JFUlIgICAgICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMzhMKSAvKiBCRkZGMDAzOCwgLTEwNzM4MDczMDQgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5fUFJPR1JFU1MgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzOUwpIC8qIEJGRkYwMDM5LCAtMTA3MzgwNzMwMyAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfU0VUVVAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDNBTCkgLyogQkZGRjAwM0EsIC0xMDczODA3MzAyICovCisjZGVmaW5lIFZJX0VSUk9SX1FVRVVFX0VSUk9SICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwM0JMKSAvKiBCRkZGMDAzQiwgLTEwNzM4MDczMDEgKi8KKyNkZWZpbmUgVklfRVJST1JfQUxMT0MgICAgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzQ0wpIC8qIEJGRkYwMDNDLCAtMTA3MzgwNzMwMCAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfTUFTSyAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDNETCkgLyogQkZGRjAwM0QsIC0xMDczODA3Mjk5ICovCisjZGVmaW5lIFZJX0VSUk9SX0lPICAgICAgICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwM0VMKSAvKiBCRkZGMDAzRSwgLTEwNzM4MDcyOTggKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX0ZNVCAgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzRkwpIC8qIEJGRkYwMDNGLCAtMTA3MzgwNzI5NyAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX0ZNVCAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDQxTCkgLyogQkZGRjAwNDEsIC0xMDczODA3Mjk1ICovCisjZGVmaW5lIFZJX0VSUk9SX0xJTkVfSU5fVVNFICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNDJMKSAvKiBCRkZGMDA0MiwgLTEwNzM4MDcyOTQgKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9NT0RFICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA0NkwpIC8qIEJGRkYwMDQ2LCAtMTA3MzgwNzI5MCAqLworI2RlZmluZSBWSV9FUlJPUl9TUlFfTk9DQ1VSUkVEICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDRBTCkgLyogQkZGRjAwNEEsIC0xMDczODA3Mjg2ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9TUEFDRSAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNEVMKSAvKiBCRkZGMDA0RSwgLTEwNzM4MDcyODIgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX09GRlNFVCAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA1MUwpIC8qIEJGRkYwMDUxLCAtMTA3MzgwNzI3OSAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfV0lEVEggICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDUyTCkgLyogQkZGRjAwNTIsIC0xMDczODA3Mjc4ICovCisjZGVmaW5lIFZJX0VSUk9SX05TVVBfT0ZGU0VUICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNTRMKSAvKiBCRkZGMDA1NCwgLTEwNzM4MDcyNzYgKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9WQVJfV0lEVEggICAgIChfVklfRVJST1IrMHgzRkZGMDA1NUwpIC8qIEJGRkYwMDU1LCAtMTA3MzgwNzI3NSAqLworI2RlZmluZSBWSV9FUlJPUl9XSU5ET1dfTk1BUFBFRCAgICAgKF9WSV9FUlJPUisweDNGRkYwMDU3TCkgLyogQkZGRjAwNTcsIC0xMDczODA3MjczICovCisjZGVmaW5lIFZJX0VSUk9SX1JFU1BfUEVORElORyAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNTlMKSAvKiBCRkZGMDA1OSwgLTEwNzM4MDcyNzEgKi8KKyNkZWZpbmUgVklfRVJST1JfTkxJU1RFTkVSUyAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA1RkwpIC8qIEJGRkYwMDVGLCAtMTA3MzgwNzI2NSAqLworI2RlZmluZSBWSV9FUlJPUl9OQ0lDICAgICAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDYwTCkgLyogQkZGRjAwNjAsIC0xMDczODA3MjY0ICovCisjZGVmaW5lIFZJX0VSUk9SX05TWVNfQ05UTFIgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNjFMKSAvKiBCRkZGMDA2MSwgLTEwNzM4MDcyNjMgKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9PUEVSICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA2N0wpIC8qIEJGRkYwMDY3LCAtMTA3MzgwNzI1NyAqLworI2RlZmluZSBWSV9FUlJPUl9JTlRSX1BFTkRJTkcgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDY4TCkgLyogQkZGRjAwNjgsIC0xMDczODA3MjU2ICovCisjZGVmaW5lIFZJX0VSUk9SX0FTUkxfUEFSSVRZICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNkFMKSAvKiBCRkZGMDA2QSwgLTEwNzM4MDcyNTQgKi8KKyNkZWZpbmUgVklfRVJST1JfQVNSTF9GUkFNSU5HICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA2QkwpIC8qIEJGRkYwMDZCLCAtMTA3MzgwNzI1MyAqLworI2RlZmluZSBWSV9FUlJPUl9BU1JMX09WRVJSVU4gICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDZDTCkgLyogQkZGRjAwNkMsIC0xMDczODA3MjUyICovCisjZGVmaW5lIFZJX0VSUk9SX1RSSUdfTk1BUFBFRCAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNkVMKSAvKiBCRkZGMDA2RSwgLTEwNzM4MDcyNTAgKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9BTElHTl9PRkZTRVQgIChfVklfRVJST1IrMHgzRkZGMDA3MEwpIC8qIEJGRkYwMDcwLCAtMTA3MzgwNzI0OCAqLworI2RlZmluZSBWSV9FUlJPUl9VU0VSX0JVRiAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDcxTCkgLyogQkZGRjAwNzEsIC0xMDczODA3MjQ3ICovCisjZGVmaW5lIFZJX0VSUk9SX1JTUkNfQlVTWSAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNzJMKSAvKiBCRkZGMDA3MiwgLTEwNzM4MDcyNDYgKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9XSURUSCAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA3NkwpIC8qIEJGRkYwMDc2LCAtMTA3MzgwNzI0MiAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfUEFSQU1FVEVSICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDc4TCkgLyogQkZGRjAwNzgsIC0xMDczODA3MjQwICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVl9QUk9UICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNzlMKSAvKiBCRkZGMDA3OSwgLTEwNzM4MDcyMzkgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX1NJWkUgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA3QkwpIC8qIEJGRkYwMDdCLCAtMTA3MzgwNzIzNyAqLworI2RlZmluZSBWSV9FUlJPUl9XSU5ET1dfTUFQUEVEICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDgwTCkgLyogQkZGRjAwODAsIC0xMDczODA3MjMyICovCisjZGVmaW5lIFZJX0VSUk9SX05JTVBMX09QRVIgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwODFMKSAvKiBCRkZGMDA4MSwgLTEwNzM4MDcyMzEgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX0xFTkdUSCAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA4M0wpIC8qIEJGRkYwMDgzLCAtMTA3MzgwNzIyOSAqLworI2RlZmluZSBWSV9FUlJPUl9JTlZfTU9ERSAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDkxTCkgLyogQkZGRjAwOTEsIC0xMDczODA3MjE1ICovCisjZGVmaW5lIFZJX0VSUk9SX1NFU05fTkxPQ0tFRCAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwOUNMKSAvKiBCRkZGMDA5QywgLTEwNzM4MDcyMDQgKi8KKyNkZWZpbmUgVklfRVJST1JfTUVNX05TSEFSRUQgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA5REwpIC8qIEJGRkYwMDlELCAtMTA3MzgwNzIwMyAqLworI2RlZmluZSBWSV9FUlJPUl9MSUJSQVJZX05GT1VORCAgICAgKF9WSV9FUlJPUisweDNGRkYwMDlFTCkgLyogQkZGRjAwOUUsIC0xMDczODA3MjAyICovCisjZGVmaW5lIFZJX0VSUk9SX05TVVBfSU5UUiAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwOUZMKSAvKiBCRkZGMDA5RiwgLTEwNzM4MDcyMDEgKi8KKyNkZWZpbmUgVklfRVJST1JfSU5WX0xJTkUgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDBBMEwpIC8qIEJGRkYwMEEwLCAtMTA3MzgwNzIwMCAqLworI2RlZmluZSBWSV9FUlJPUl9GSUxFX0FDQ0VTUyAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMEExTCkgLyogQkZGRjAwQTEsIC0xMDczODA3MTk5ICovCisjZGVmaW5lIFZJX0VSUk9SX0ZJTEVfSU8gICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQTJMKSAvKiBCRkZGMDBBMiwgLTEwNzM4MDcxOTggKi8KKyNkZWZpbmUgVklfRVJST1JfTlNVUF9MSU5FICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDBBM0wpIC8qIEJGRkYwMEEzLCAtMTA3MzgwNzE5NyAqLworI2RlZmluZSBWSV9FUlJPUl9OU1VQX01FQ0ggICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMEE0TCkgLyogQkZGRjAwQTQsIC0xMDczODA3MTk2ICovCisjZGVmaW5lIFZJX0VSUk9SX0lOVEZfTlVNX05DT05GSUcgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQTVMKSAvKiBCRkZGMDBBNSwgLTEwNzM4MDcxOTUgKi8KKyNkZWZpbmUgVklfRVJST1JfQ09OTl9MT1NUICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDBBNkwpIC8qIEJGRkYwMEE2LCAtMTA3MzgwNzE5NCAqLworI2RlZmluZSBWSV9FUlJPUl9NQUNISU5FX05BVkFJTCAgICAgKF9WSV9FUlJPUisweDNGRkYwMEE3TCkgLyogQkZGRjAwQTcsIC0xMDczODA3MTkzICovCisjZGVmaW5lIFZJX0VSUk9SX05QRVJNSVNTSU9OICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQThMKSAvKiBCRkZGMDBBOCwgLTEwNzM4MDcxOTIgKi8KKworLyotIE90aGVyIFZJU0EgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZJX1ZFUlNJT05fTUFKT1IodmVyKSAgICAgICAoKCgoVmlWZXJzaW9uKXZlcikgJiAweEZGRjAwMDAwVUwpID4+IDIwKQorI2RlZmluZSBWSV9WRVJTSU9OX01JTk9SKHZlcikgICAgICAgKCgoKFZpVmVyc2lvbil2ZXIpICYgMHgwMDBGRkYwMFVMKSA+PiAgOCkKKyNkZWZpbmUgVklfVkVSU0lPTl9TVUJNSU5PUih2ZXIpICAgICgoKChWaVZlcnNpb24pdmVyKSAmIDB4MDAwMDAwRkZVTCkgICAgICApCisKKyNkZWZpbmUgVklfRklORF9CVUZMRU4gICAgICAgICAgICAgICgyNTYpCisKKyNkZWZpbmUgVklfSU5URl9HUElCICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9JTlRGX1ZYSSAgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX0lOVEZfR1BJQl9WWEkgICAgICAgICAgICAoMykKKyNkZWZpbmUgVklfSU5URl9BU1JMICAgICAgICAgICAgICAgICg0KQorI2RlZmluZSBWSV9JTlRGX1BYSSAgICAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIFZJX0lOVEZfVENQSVAgICAgICAgICAgICAgICAoNikKKyNkZWZpbmUgVklfSU5URl9VU0IgICAgICAgICAgICAgICAgICg3KQorCisjZGVmaW5lIFZJX1BST1RfTk9STUFMICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfUFJPVF9GREMgICAgICAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9QUk9UX0hTNDg4ICAgICAgICAgICAgICAgKDMpCisjZGVmaW5lIFZJX1BST1RfNDg4Ml9TVFJTICAgICAgICAgICAoNCkKKyNkZWZpbmUgVklfUFJPVF9VU0JUTUNfVkVORE9SICAgICAgICg1KQorCisjZGVmaW5lIFZJX0ZEQ19OT1JNQUwgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfRkRDX1NUUkVBTSAgICAgICAgICAgICAgICgyKQorCisjZGVmaW5lIFZJX0xPQ0FMX1NQQUNFICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfQTE2X1NQQUNFICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9BMjRfU1BBQ0UgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX0EzMl9TUEFDRSAgICAgICAgICAgICAgICAoMykKKyNkZWZpbmUgVklfQTY0X1NQQUNFICAgICAgICAgICAgICAgICg0KQorI2RlZmluZSBWSV9QWElfQUxMT0NfU1BBQ0UgICAgICAgICAgKDkpCisjZGVmaW5lIFZJX1BYSV9DRkdfU1BBQ0UgICAgICAgICAgICAoMTApCisjZGVmaW5lIFZJX1BYSV9CQVIwX1NQQUNFICAgICAgICAgICAoMTEpCisjZGVmaW5lIFZJX1BYSV9CQVIxX1NQQUNFICAgICAgICAgICAoMTIpCisjZGVmaW5lIFZJX1BYSV9CQVIyX1NQQUNFICAgICAgICAgICAoMTMpCisjZGVmaW5lIFZJX1BYSV9CQVIzX1NQQUNFICAgICAgICAgICAoMTQpCisjZGVmaW5lIFZJX1BYSV9CQVI0X1NQQUNFICAgICAgICAgICAoMTUpCisjZGVmaW5lIFZJX1BYSV9CQVI1X1NQQUNFICAgICAgICAgICAoMTYpCisjZGVmaW5lIFZJX09QQVFVRV9TUEFDRSAgICAgICAgICAgICAoMHhGRkZGKQorCisjZGVmaW5lIFZJX1VOS05PV05fTEEgICAgICAgICAgICAgICAoLTEpCisjZGVmaW5lIFZJX1VOS05PV05fU0xPVCAgICAgICAgICAgICAoLTEpCisjZGVmaW5lIFZJX1VOS05PV05fTEVWRUwgICAgICAgICAgICAoLTEpCisjZGVmaW5lIFZJX1VOS05PV05fQ0hBU1NJUyAgICAgICAgICAoLTEpCisKKyNkZWZpbmUgVklfUVVFVUUgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9ITkRMUiAgICAgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX1NVU1BFTkRfSE5ETFIgICAgICAgICAgICAoNCkKKyNkZWZpbmUgVklfQUxMX01FQ0ggICAgICAgICAgICAgICAgICgweEZGRkYpCisKKyNkZWZpbmUgVklfQU5ZX0hORExSICAgICAgICAgICAgICAgICgwKQorCisjZGVmaW5lIFZJX1RSSUdfQUxMICAgICAgICAgICAgICAgICAoLTIpCisjZGVmaW5lIFZJX1RSSUdfU1cgICAgICAgICAgICAgICAgICAoLTEpCisjZGVmaW5lIFZJX1RSSUdfVFRMMCAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfVFJJR19UVEwxICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9UUklHX1RUTDIgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX1RSSUdfVFRMMyAgICAgICAgICAgICAgICAoMykKKyNkZWZpbmUgVklfVFJJR19UVEw0ICAgICAgICAgICAgICAgICg0KQorI2RlZmluZSBWSV9UUklHX1RUTDUgICAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIFZJX1RSSUdfVFRMNiAgICAgICAgICAgICAgICAoNikKKyNkZWZpbmUgVklfVFJJR19UVEw3ICAgICAgICAgICAgICAgICg3KQorI2RlZmluZSBWSV9UUklHX0VDTDAgICAgICAgICAgICAgICAgKDgpCisjZGVmaW5lIFZJX1RSSUdfRUNMMSAgICAgICAgICAgICAgICAoOSkKKyNkZWZpbmUgVklfVFJJR19QQU5FTF9JTiAgICAgICAgICAgICgyNykKKyNkZWZpbmUgVklfVFJJR19QQU5FTF9PVVQgICAgICAgICAgICgyOCkKKworI2RlZmluZSBWSV9UUklHX1BST1RfREVGQVVMVCAgICAgICAgKDApCisjZGVmaW5lIFZJX1RSSUdfUFJPVF9PTiAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfVFJJR19QUk9UX09GRiAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9UUklHX1BST1RfU1lOQyAgICAgICAgICAgKDUpCisjZGVmaW5lIFZJX1RSSUdfUFJPVF9SRVNFUlZFICAgICAgICAoNikKKyNkZWZpbmUgVklfVFJJR19QUk9UX1VOUkVTRVJWRSAgICAgICg3KQorCisjZGVmaW5lIFZJX1JFQURfQlVGICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfV1JJVEVfQlVGICAgICAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9SRUFEX0JVRl9ESVNDQVJEICAgICAgICAgKDQpCisjZGVmaW5lIFZJX1dSSVRFX0JVRl9ESVNDQVJEICAgICAgICAoOCkKKyNkZWZpbmUgVklfSU9fSU5fQlVGICAgICAgICAgICAgICAgICgxNikKKyNkZWZpbmUgVklfSU9fT1VUX0JVRiAgICAgICAgICAgICAgICgzMikKKyNkZWZpbmUgVklfSU9fSU5fQlVGX0RJU0NBUkQgICAgICAgICg2NCkKKyNkZWZpbmUgVklfSU9fT1VUX0JVRl9ESVNDQVJEICAgICAgICgxMjgpCisKKyNkZWZpbmUgVklfRkxVU0hfT05fQUNDRVNTICAgICAgICAgICgxKQorI2RlZmluZSBWSV9GTFVTSF9XSEVOX0ZVTEwgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX0ZMVVNIX0RJU0FCTEUgICAgICAgICAgICAoMykKKworI2RlZmluZSBWSV9OTUFQUEVEICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX1VTRV9PUEVSUyAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfREVSRUZfQUREUiAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBWSV9ERVJFRl9BRERSX0JZVEVfU1dBUCAgICAgKDQpCisKKyNkZWZpbmUgVklfVE1PX0lNTUVESUFURSAgICAgICAgICAgICgwTCkKKyNkZWZpbmUgVklfVE1PX0lORklOSVRFICAgICAgICAgICAgICgweEZGRkZGRkZGVUwpCisKKyNkZWZpbmUgVklfTk9fTE9DSyAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9FWENMVVNJVkVfTE9DSyAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX1NIQVJFRF9MT0NLICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfTE9BRF9DT05GSUcgICAgICAgICAgICAgICg0KQorCisjZGVmaW5lIFZJX05PX1NFQ19BRERSICAgICAgICAgICAgICAoMHhGRkZGKQorCisjZGVmaW5lIFZJX0FTUkxfUEFSX05PTkUgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfQVNSTF9QQVJfT0REICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9BU1JMX1BBUl9FVkVOICAgICAgICAgICAgKDIpCisjZGVmaW5lIFZJX0FTUkxfUEFSX01BUksgICAgICAgICAgICAoMykKKyNkZWZpbmUgVklfQVNSTF9QQVJfU1BBQ0UgICAgICAgICAgICg0KQorCisjZGVmaW5lIFZJX0FTUkxfU1RPUF9PTkUgICAgICAgICAgICAoMTApCisjZGVmaW5lIFZJX0FTUkxfU1RPUF9PTkU1ICAgICAgICAgICAoMTUpCisjZGVmaW5lIFZJX0FTUkxfU1RPUF9UV08gICAgICAgICAgICAoMjApCisKKyNkZWZpbmUgVklfQVNSTF9GTE9XX05PTkUgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9BU1JMX0ZMT1dfWE9OX1hPRkYgICAgICAgKDEpCisjZGVmaW5lIFZJX0FTUkxfRkxPV19SVFNfQ1RTICAgICAgICAoMikKKyNkZWZpbmUgVklfQVNSTF9GTE9XX0RUUl9EU1IgICAgICAgICg0KQorCisjZGVmaW5lIFZJX0FTUkxfRU5EX05PTkUgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfQVNSTF9FTkRfTEFTVF9CSVQgICAgICAgICgxKQorI2RlZmluZSBWSV9BU1JMX0VORF9URVJNQ0hBUiAgICAgICAgKDIpCisjZGVmaW5lIFZJX0FTUkxfRU5EX0JSRUFLICAgICAgICAgICAoMykKKworI2RlZmluZSBWSV9TVEFURV9BU1NFUlRFRCAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX1NUQVRFX1VOQVNTRVJURUQgICAgICAgICAoMCkKKyNkZWZpbmUgVklfU1RBVEVfVU5LTk9XTiAgICAgICAgICAgICgtMSkKKworI2RlZmluZSBWSV9CSUdfRU5ESUFOICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX0xJVFRMRV9FTkRJQU4gICAgICAgICAgICAoMSkKKworI2RlZmluZSBWSV9EQVRBX1BSSVYgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX0RBVEFfTlBSSVYgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfUFJPR19QUklWICAgICAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9QUk9HX05QUklWICAgICAgICAgICAgICAgKDMpCisjZGVmaW5lIFZJX0JMQ0tfUFJJViAgICAgICAgICAgICAgICAoNCkKKyNkZWZpbmUgVklfQkxDS19OUFJJViAgICAgICAgICAgICAgICg1KQorI2RlZmluZSBWSV9ENjRfUFJJViAgICAgICAgICAgICAgICAgKDYpCisjZGVmaW5lIFZJX0Q2NF9OUFJJViAgICAgICAgICAgICAgICAoNykKKworI2RlZmluZSBWSV9XSURUSF84ICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX1dJRFRIXzE2ICAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfV0lEVEhfMzIgICAgICAgICAgICAgICAgICg0KQorI2RlZmluZSBWSV9XSURUSF82NCAgICAgICAgICAgICAgICAgKDgpCisKKyNkZWZpbmUgVklfR1BJQl9SRU5fREVBU1NFUlQgICAgICAgICgwKQorI2RlZmluZSBWSV9HUElCX1JFTl9BU1NFUlQgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0dQSUJfUkVOX0RFQVNTRVJUX0dUTCAgICAoMikKKyNkZWZpbmUgVklfR1BJQl9SRU5fQVNTRVJUX0FERFJFU1MgICgzKQorI2RlZmluZSBWSV9HUElCX1JFTl9BU1NFUlRfTExPICAgICAgKDQpCisjZGVmaW5lIFZJX0dQSUJfUkVOX0FTU0VSVF9BRERSRVNTX0xMTyAoNSkKKyNkZWZpbmUgVklfR1BJQl9SRU5fQUREUkVTU19HVEwgICAgICg2KQorCisjZGVmaW5lIFZJX0dQSUJfQVROX0RFQVNTRVJUICAgICAgICAoMCkKKyNkZWZpbmUgVklfR1BJQl9BVE5fQVNTRVJUICAgICAgICAgICgxKQorI2RlZmluZSBWSV9HUElCX0FUTl9ERUFTU0VSVF9IQU5EU0hBS0UgKDIpCisjZGVmaW5lIFZJX0dQSUJfQVROX0FTU0VSVF9JTU1FRElBVEUgKDMpCisKKyNkZWZpbmUgVklfR1BJQl9IUzQ4OF9ESVNBQkxFRCAgICAgICgwKQorI2RlZmluZSBWSV9HUElCX0hTNDg4X05JTVBMICAgICAgICAgKC0xKQorCisjZGVmaW5lIFZJX0dQSUJfVU5BRERSRVNTRUQgICAgICAgICAoMCkKKyNkZWZpbmUgVklfR1BJQl9UQUxLRVIgICAgICAgICAgICAgICgxKQorI2RlZmluZSBWSV9HUElCX0xJU1RFTkVSICAgICAgICAgICAgKDIpCisKKyNkZWZpbmUgVklfVlhJX0NNRDE2ICAgICAgICAgICAgICAgICgweDAyMDApCisjZGVmaW5lIFZJX1ZYSV9DTUQxNl9SRVNQMTYgICAgICAgICAoMHgwMjAyKQorI2RlZmluZSBWSV9WWElfUkVTUDE2ICAgICAgICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgVklfVlhJX0NNRDMyICAgICAgICAgICAgICAgICgweDA0MDApCisjZGVmaW5lIFZJX1ZYSV9DTUQzMl9SRVNQMTYgICAgICAgICAoMHgwNDAyKQorI2RlZmluZSBWSV9WWElfQ01EMzJfUkVTUDMyICAgICAgICAgKDB4MDQwNCkKKyNkZWZpbmUgVklfVlhJX1JFU1AzMiAgICAgICAgICAgICAgICgweDAwMDQpCisKKyNkZWZpbmUgVklfQVNTRVJUX1NJR05BTCAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgVklfQVNTRVJUX1VTRV9BU1NJR05FRCAgICAgICgwKQorI2RlZmluZSBWSV9BU1NFUlRfSVJRMSAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFZJX0FTU0VSVF9JUlEyICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgVklfQVNTRVJUX0lSUTMgICAgICAgICAgICAgICgzKQorI2RlZmluZSBWSV9BU1NFUlRfSVJRNCAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIFZJX0FTU0VSVF9JUlE1ICAgICAgICAgICAgICAoNSkKKyNkZWZpbmUgVklfQVNTRVJUX0lSUTYgICAgICAgICAgICAgICg2KQorI2RlZmluZSBWSV9BU1NFUlRfSVJRNyAgICAgICAgICAgICAgKDcpCisKKyNkZWZpbmUgVklfVVRJTF9BU1NFUlRfU1lTUkVTRVQgICAgICgxKQorI2RlZmluZSBWSV9VVElMX0FTU0VSVF9TWVNGQUlMICAgICAgKDIpCisjZGVmaW5lIFZJX1VUSUxfREVBU1NFUlRfU1lTRkFJTCAgICAoMykKKworI2RlZmluZSBWSV9WWElfQ0xBU1NfTUVNT1JZICAgICAgICAgKDApCisjZGVmaW5lIFZJX1ZYSV9DTEFTU19FWFRFTkRFRCAgICAgICAoMSkKKyNkZWZpbmUgVklfVlhJX0NMQVNTX01FU1NBR0UgICAgICAgICgyKQorI2RlZmluZSBWSV9WWElfQ0xBU1NfUkVHSVNURVIgICAgICAgKDMpCisjZGVmaW5lIFZJX1ZYSV9DTEFTU19PVEhFUiAgICAgICAgICAoNCkKKworI2RlZmluZSBWSV9QWElfQUREUl9OT05FICAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX1BYSV9BRERSX01FTSAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfUFhJX0FERFJfSU8gICAgICAgICAgICAgICgyKQorI2RlZmluZSBWSV9QWElfQUREUl9DRkcgICAgICAgICAgICAgKDMpCisKKyNkZWZpbmUgVklfVFJJR19VTktOT1dOICAgICAgICAgICAgICgtMSkKKworI2RlZmluZSBWSV9QWElfTEJVU19VTktOT1dOICAgICAgICAgKC0xKQorI2RlZmluZSBWSV9QWElfTEJVU19OT05FICAgICAgICAgICAgKDApCisjZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfMCAoMTAwMCkKKyNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU18xICgxMDAxKQorI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzIgKDEwMDIpCisjZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfMyAoMTAwMykKKyNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU180ICgxMDA0KQorI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzUgKDEwMDUpCisjZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfNiAoMTAwNikKKyNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU183ICgxMDA3KQorI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzggKDEwMDgpCisjZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfOSAoMTAwOSkKKyNkZWZpbmUgVklfUFhJX1NUQVJfVFJJR19DT05UUk9MTEVSICgxNDEzKQorCisvKi0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgdmlHZXREZWZhdWx0Uk0odmkpICAgICAgICAgIHZpT3BlbkRlZmF1bHRSTSh2aSkKKyNkZWZpbmUgVklfRVJST1JfSU5WX1NFU1NJT04gICAgICAgIChWSV9FUlJPUl9JTlZfT0JKRUNUKQorI2RlZmluZSBWSV9JTkZJTklURSAgICAgICAgICAgICAgICAgKFZJX1RNT19JTkZJTklURSkKKyNkZWZpbmUgVklfTk9STUFMICAgICAgICAgICAgICAgICAgIChWSV9QUk9UX05PUk1BTCkKKyNkZWZpbmUgVklfRkRDICAgICAgICAgICAgICAgICAgICAgIChWSV9QUk9UX0ZEQykKKyNkZWZpbmUgVklfSFM0ODggICAgICAgICAgICAgICAgICAgIChWSV9QUk9UX0hTNDg4KQorI2RlZmluZSBWSV9BU1JMNDg4ICAgICAgICAgICAgICAgICAgKFZJX1BST1RfNDg4Ml9TVFJTKQorI2RlZmluZSBWSV9BU1JMX0lOX0JVRiAgICAgICAgICAgICAgKFZJX0lPX0lOX0JVRikKKyNkZWZpbmUgVklfQVNSTF9PVVRfQlVGICAgICAgICAgICAgIChWSV9JT19PVVRfQlVGKQorI2RlZmluZSBWSV9BU1JMX0lOX0JVRl9ESVNDQVJEICAgICAgKFZJX0lPX0lOX0JVRl9ESVNDQVJEKQorI2RlZmluZSBWSV9BU1JMX09VVF9CVUZfRElTQ0FSRCAgICAgKFZJX0lPX09VVF9CVUZfRElTQ0FSRCkKKworLyotIE5hdGlvbmFsIEluc3RydW1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZJX0lOVEZfUklPICAgICAgICAgICAgICAgICAoOCkKKyNkZWZpbmUgVklfSU5URl9GSVJFV0lSRSAgICAgICAgICAgICg5KSAKKworI2RlZmluZSBWSV9BVFRSX1NZTkNfTVhJX0FMTE9XX0VOICAgKDB4M0ZGRjAxNjFVTCkgLyogVmlCb29sZWFuLCByZWFkL3dyaXRlICovCisKKy8qIFRoaXMgaXMgZm9yIFZYSSBTRVJWQU5UIHJlc291cmNlcyAqLworCisjZGVmaW5lIFZJX0VWRU5UX1ZYSV9ERVZfQ01EICAgICAgICAoMHhCRkZGMjAwRlVMKQorI2RlZmluZSBWSV9BVFRSX1ZYSV9ERVZfQ01EX1RZUEUgICAgKDB4M0ZGRjQwMzdVTCkgLyogVmlJbnQxNiwgcmVhZC1vbmx5ICovCisjZGVmaW5lIFZJX0FUVFJfVlhJX0RFVl9DTURfVkFMVUUgICAoMHgzRkZGNDAzOFVMKSAvKiBWaVVJbnQzMiwgcmVhZC1vbmx5ICovCisKKyNkZWZpbmUgVklfVlhJX0RFVl9DTURfVFlQRV8xNiAgICAgICgxNikKKyNkZWZpbmUgVklfVlhJX0RFVl9DTURfVFlQRV8zMiAgICAgICgzMikKKworVmlTdGF0dXMgX1ZJX0ZVTkMgdmlWeGlTZXJ2YW50UmVzcG9uc2UoVmlTZXNzaW9uIHZpLCBWaUludDE2IG1vZGUsIFZpVUludDMyIHJlc3ApOworLyogbW9kZSB2YWx1ZXMgaW5jbHVkZSBWSV9WWElfUkVTUDE2LCBWSV9WWElfUkVTUDMyLCBhbmQgdGhlIG5leHQgMiB2YWx1ZXMgKi8KKyNkZWZpbmUgVklfVlhJX1JFU1BfTk9ORSAgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9WWElfUkVTUF9QUk9UX0VSUk9SICAgICAgKC0xKQorCisvKiBUaGlzIGFsbG93cyBleHRlbmRlZCBTZXJpYWwgc3VwcG9ydCBvbiBXaW4zMiBhbmQgb24gTkkgRU5FVCBTZXJpYWwgcHJvZHVjdHMgKi8KKworI2RlZmluZSBWSV9BVFRSX0FTUkxfRElTQ0FSRF9OVUxMICAgKDB4M0ZGRjAwQjBVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0NPTk5FQ1RFRCAgICAgICgweDNGRkYwMUJCVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9CUkVBS19TVEFURSAgICAoMHgzRkZGMDFCQ1VMKQorI2RlZmluZSBWSV9BVFRSX0FTUkxfQlJFQUtfTEVOICAgICAgKDB4M0ZGRjAxQkRVTCkKKyNkZWZpbmUgVklfQVRUUl9BU1JMX0FMTE9XX1RSQU5TTUlUICgweDNGRkYwMUJFVUwpCisjZGVmaW5lIFZJX0FUVFJfQVNSTF9XSVJFX01PREUgICAgICAoMHgzRkZGMDFCRlVMKQorCisjZGVmaW5lIFZJX0FTUkxfV0lSRV80ODVfNCAgICAgICAgICAoMCkKKyNkZWZpbmUgVklfQVNSTF9XSVJFXzQ4NV8yX0RUUl9FQ0hPICgxKQorI2RlZmluZSBWSV9BU1JMX1dJUkVfNDg1XzJfRFRSX0NUUkwgKDIpCisjZGVmaW5lIFZJX0FTUkxfV0lSRV80ODVfMl9BVVRPICAgICAoMykKKyNkZWZpbmUgVklfQVNSTF9XSVJFXzIzMl9EVEUgICAgICAgICgxMjgpCisjZGVmaW5lIFZJX0FTUkxfV0lSRV8yMzJfRENFICAgICAgICAoMTI5KQorI2RlZmluZSBWSV9BU1JMX1dJUkVfMjMyX0FVVE8gICAgICAgKDEzMCkKKworI2RlZmluZSBWSV9FVkVOVF9BU1JMX0JSRUFLICAgICAgICAgKDB4M0ZGRjIwMjNVTCkKKyNkZWZpbmUgVklfRVZFTlRfQVNSTF9DVFMgICAgICAgICAgICgweDNGRkYyMDI5VUwpCisjZGVmaW5lIFZJX0VWRU5UX0FTUkxfRFNSICAgICAgICAgICAoMHgzRkZGMjAyQVVMKQorI2RlZmluZSBWSV9FVkVOVF9BU1JMX0RDRCAgICAgICAgICAgKDB4M0ZGRjIwMkNVTCkKKyNkZWZpbmUgVklfRVZFTlRfQVNSTF9SSSAgICAgICAgICAgICgweDNGRkYyMDJFVUwpCisjZGVmaW5lIFZJX0VWRU5UX0FTUkxfQ0hBUiAgICAgICAgICAoMHgzRkZGMjAzNVVMKQorI2RlZmluZSBWSV9FVkVOVF9BU1JMX1RFUk1DSEFSICAgICAgKDB4M0ZGRjIwMjRVTCkKKworLyogVGhpcyBpcyBmb3IgZmFzdCB2aVBlZWsvdmlQb2tlIG1hY3JvcyAqLworCisjaWYgZGVmaW5lZChOSVZJU0FfUEVFS1BPS0UpCisKKyNpZiBkZWZpbmVkKE5JVklTQV9QRUVLUE9LRV9TVVBQKQorI3VuZGVmIE5JVklTQV9QRUVLUE9LRV9TVVBQCisjZW5kaWYKKworI2lmIChkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19OVF9fKSkgJiYgIWRlZmluZWQoX05JX21zd2luMTZfKQorLyogVGhpcyBtYWNybyBpcyBzdXBwb3J0ZWQgZm9yIGFsbCBXaW4zMiBjb21waWxlcnMsIGluY2x1ZGluZyBDVkkuICovCisjZGVmaW5lIE5JVklTQV9QRUVLUE9LRV9TVVBQCisjZWxpZiAoZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChfV2luZG93cykpICYmICFkZWZpbmVkKF9DVklfKSAmJiAhZGVmaW5lZChfTklfbXN3aW4xNl8pCisvKiBUaGlzIG1hY3JvIGlzIHN1cHBvcnRlZCBmb3IgQm9ybGFuZCBhbmQgTWljcm9zb2Z0IGNvbXBpbGVycyBvbiBXaW4xNiwgYnV0IG5vdCBDVkkuICovCisjZGVmaW5lIE5JVklTQV9QRUVLUE9LRV9TVVBQCisjZWxpZiBkZWZpbmVkKF9DVklfKSAmJiBkZWZpbmVkKF9OSV9zcGFyY18pCisvKiBUaGlzIG1hY3JvIGlzIHN1cHBvcnRlZCBmb3IgU29sYXJpcyAxIGFuZCAyLCBmcm9tIENWSSBvbmx5LiAqLworI2RlZmluZSBOSVZJU0FfUEVFS1BPS0VfU1VQUAorI2Vsc2UKKy8qIFRoaXMgbWFjcm8gaXMgbm90IHN1cHBvcnRlZCBvbiBvdGhlciBwbGF0Zm9ybXMuICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoTklWSVNBX1BFRUtQT0tFX1NVUFApCisKK2V4dGVybiBWaUJvb2xlYW4gTklfdmlJbXBsVklTQTE7CitWaVN0YXR1cyBfVklfRlVOQyBOSV92aU9wZW5EZWZhdWx0Uk0gKFZpUFNlc3Npb24gdmkpOworI2RlZmluZSB2aU9wZW5EZWZhdWx0Uk0odmkpIE5JX3ZpT3BlbkRlZmF1bHRSTSh2aSkKKworI2RlZmluZSB2aVBlZWs4KHZpLGFkZHIsdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKE5JX3ZpSW1wbFZJU0ExKSAmJiAoKigoVmlQVUludDMyKSh2aSkpKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGRvICgqKChWaVBVSW50OCkodmFsKSkgPSAqKCh2b2xhdGlsZSBWaVVJbnQ4IF9WSV9QVFIpKGFkZHIpKSk7ICAgICBcCisgICAgICAgICB3aGlsZSAoKiooKHZvbGF0aWxlIFZpVUludDggX1ZJX1BUUiBfVklfUFRSKSh2aSkpICYgMHgxMCk7ICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKHZpUGVlazgpKCh2aSksKGFkZHIpLCh2YWwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKyNkZWZpbmUgdmlQb2tlOCh2aSxhZGRyLHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChOSV92aUltcGxWSVNBMSkgJiYgKCooKFZpUFVJbnQzMikodmkpKSkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBkbyAoKigodm9sYXRpbGUgVmlVSW50OCBfVklfUFRSKShhZGRyKSkgPSAoKFZpVUludDgpKHZhbCkpKTsgICAgICAgXAorICAgICAgICAgd2hpbGUgKCoqKCh2b2xhdGlsZSBWaVVJbnQ4IF9WSV9QVFIgX1ZJX1BUUikodmkpKSAmIDB4MTApOyAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICh2aVBva2U4KSgodmkpLChhZGRyKSwodmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorCisjZGVmaW5lIHZpUGVlazE2KHZpLGFkZHIsdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoTklfdmlJbXBsVklTQTEpICYmICgqKChWaVBVSW50MzIpKHZpKSkpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZG8gKCooKFZpUFVJbnQxNikodmFsKSkgPSAqKCh2b2xhdGlsZSBWaVVJbnQxNiBfVklfUFRSKShhZGRyKSkpOyAgIFwKKyAgICAgICAgIHdoaWxlICgqKigodm9sYXRpbGUgVmlVSW50OCBfVklfUFRSIF9WSV9QVFIpKHZpKSkgJiAweDEwKTsgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAodmlQZWVrMTYpKCh2aSksKGFkZHIpLCh2YWwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2RlZmluZSB2aVBva2UxNih2aSxhZGRyLHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKE5JX3ZpSW1wbFZJU0ExKSAmJiAoKigoVmlQVUludDMyKSh2aSkpKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGRvICgqKCh2b2xhdGlsZSBWaVVJbnQxNiBfVklfUFRSKShhZGRyKSkgPSAoKFZpVUludDE2KSh2YWwpKSk7ICAgICBcCisgICAgICAgICB3aGlsZSAoKiooKHZvbGF0aWxlIFZpVUludDggX1ZJX1BUUiBfVklfUFRSKSh2aSkpICYgMHgxMCk7ICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKHZpUG9rZTE2KSgodmkpLChhZGRyKSwodmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKyNkZWZpbmUgdmlQZWVrMzIodmksYWRkcix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChOSV92aUltcGxWSVNBMSkgJiYgKCooKFZpUFVJbnQzMikodmkpKSkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBkbyAoKigoVmlQVUludDMyKSh2YWwpKSA9ICooKHZvbGF0aWxlIFZpVUludDMyIF9WSV9QVFIpKGFkZHIpKSk7ICAgXAorICAgICAgICAgd2hpbGUgKCoqKCh2b2xhdGlsZSBWaVVJbnQ4IF9WSV9QVFIgX1ZJX1BUUikodmkpKSAmIDB4MTApOyAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICh2aVBlZWszMikoKHZpKSwoYWRkciksKHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorCisjZGVmaW5lIHZpUG9rZTMyKHZpLGFkZHIsdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoTklfdmlJbXBsVklTQTEpICYmICgqKChWaVBVSW50MzIpKHZpKSkpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZG8gKCooKHZvbGF0aWxlIFZpVUludDMyIF9WSV9QVFIpKGFkZHIpKSA9ICgoVmlVSW50MzIpKHZhbCkpKTsgICAgIFwKKyAgICAgICAgIHdoaWxlICgqKigodm9sYXRpbGUgVmlVSW50OCBfVklfUFRSIF9WSV9QVFIpKHZpKSkgJiAweDEwKTsgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAodmlQb2tlMzIpKCh2aSksKGFkZHIpLCh2YWwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2VuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChOSVZJU0FfUFhJKSB8fCBkZWZpbmVkKFBYSVNBVklTQV9QWEkpCisKKyNpZiAwCisvKiBUaGUgZm9sbG93aW5nIDIgYXR0cmlidXRlcyB3ZXJlIGluY29ycmVjdGx5IGltcGxlbWVudGVkIGluIGVhcmxpZXIKKyAgIHZlcnNpb25zIG9mIE5JLVZJU0EuICBZb3Ugc2hvdWxkIG5vdyBxdWVyeSBWSV9BVFRSX01BTkZfSUQgb3IKKyAgIFZJX0FUVFJfTU9ERUxfQ09ERS4gIFRob3NlIGF0dHJpYnV0ZXMgY29udGFpbiBzdWItdmVuZG9yIGluZm9ybWF0aW9uCisgICB3aGVuIGl0IGV4aXN0cy4gIFRvIGdldCBib3RoIHRoZSBhY3R1YWwgcHJpbWFyeSBhbmQgc3VidmVuZG9yIGNvZGVzCisgICBmcm9tIHRoZSBkZXZpY2UsIHlvdSBzaG91bGQgY2FsbCB2aUluMTYgdXNpbmcgVklfUFhJX0NGR19TUEFDRS4gKi8KKyNkZWZpbmUgVklfQVRUUl9QWElfU1VCX01BTkZfSUQgICAgICgweDNGRkYwMjAzVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX1NVQl9NT0RFTF9DT0RFICAoMHgzRkZGMDIwNFVMKQorI2VuZGlmCisKKyNkZWZpbmUgVklfQVRUUl9QWElfU1JDX1RSSUdfQlVTICAgICgweDNGRkYwMjBEVUwpCisjZGVmaW5lIFZJX0FUVFJfUFhJX0RFU1RfVFJJR19CVVMgICAoMHgzRkZGMDIwRVVMKQorCisjZGVmaW5lIFZJX0FUVFJfUFhJX1JFQ1ZfSU5UUl9TRVEgICAoMHgzRkZGNDI0MFVMKQorI2RlZmluZSBWSV9BVFRSX1BYSV9SRUNWX0lOVFJfREFUQSAgKDB4M0ZGRjQyNDFVTCkKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE5JVklTQV9VU0IpCisKKyNkZWZpbmUgVklfQVRUUl9VU0JfQlVMS19PVVRfUElQRSAgICgweDNGRkYwMUEyVUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX0JVTEtfSU5fUElQRSAgICAoMHgzRkZGMDFBM1VMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9JTlRSX0lOX1BJUEUgICAgKDB4M0ZGRjAxQTRVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfQ0xBU1MgICAgICAgICAgICgweDNGRkYwMUE1VUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX1NVQkNMQVNTICAgICAgICAoMHgzRkZGMDFBNlVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9BTFRfU0VUVElORyAgICAgKDB4M0ZGRjAxQThVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfRU5EX0lOICAgICAgICAgICgweDNGRkYwMUE5VUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX05VTV9JTlRGQ1MgICAgICAoMHgzRkZGMDFBQVVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9OVU1fUElQRVMgICAgICAgKDB4M0ZGRjAxQUJVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfQlVMS19PVVRfU1RBVFVTICgweDNGRkYwMUFDVUwpCisjZGVmaW5lIFZJX0FUVFJfVVNCX0JVTEtfSU5fU1RBVFVTICAoMHgzRkZGMDFBRFVMKQorI2RlZmluZSBWSV9BVFRSX1VTQl9JTlRSX0lOX1NUQVRVUyAgKDB4M0ZGRjAxQUVVTCkKKyNkZWZpbmUgVklfQVRUUl9VU0JfQ1RSTF9QSVBFICAgICAgICgweDNGRkYwMUIwVUwpCisKKyNkZWZpbmUgVklfVVNCX1BJUEVfU1RBVEVfVU5LTk9XTiAgICgtMSkKKyNkZWZpbmUgVklfVVNCX1BJUEVfUkVBRFkgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9VU0JfUElQRV9TVEFMTEVEICAgICAgICAgKDEpCisKKyNkZWZpbmUgVklfVVNCX0VORF9OT05FICAgICAgICAgICAgICgwKQorI2RlZmluZSBWSV9VU0JfRU5EX1NIT1JUICAgICAgICAgICAgKDQpCisjZGVmaW5lIFZJX1VTQl9FTkRfU0hPUlRfT1JfQ09VTlQgICAoNSkKKworI2VuZGlmCisKKyNkZWZpbmUgVklfQVRUUl9GSVJFV0lSRV9ERVNUX1VQUEVSX09GRlNFVCAoMHgzRkZGMDFGMFVMKQorI2RlZmluZSBWSV9BVFRSX0ZJUkVXSVJFX1NSQ19VUFBFUl9PRkZTRVQgICgweDNGRkYwMUYxVUwpCisjZGVmaW5lIFZJX0FUVFJfRklSRVdJUkVfV0lOX1VQUEVSX09GRlNFVCAgKDB4M0ZGRjAxRjJVTCkKKyNkZWZpbmUgVklfQVRUUl9GSVJFV0lSRV9WRU5ET1JfSUQgICAgICAgICAoMHgzRkZGMDFGM1VMKQorI2RlZmluZSBWSV9BVFRSX0ZJUkVXSVJFX0xPV0VSX0NISVBfSUQgICAgICgweDNGRkYwMUY0VUwpCisjZGVmaW5lIFZJX0FUVFJfRklSRVdJUkVfVVBQRVJfQ0hJUF9JRCAgICAgKDB4M0ZGRjAxRjVVTCkKKworI2RlZmluZSBWSV9GSVJFV0lSRV9ERkxUX1NQQUNFICAgICAgICAgICAoNSkKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19jcGx1c3BsdXNfXykKKyAgIH0KKyNlbmRpZgorCisjZW5kaWYKKworLyotIFRoZSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvdmlzYS92aXNhdHlwZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvaGFsL2xpYi9BdGhlbmEvdmlzYS92aXNhdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDg5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9oYWwvbGliL0F0aGVuYS92aXNhL3Zpc2F0eXBlLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERpc3RyaWJ1dGVkIGJ5IElWSSBGb3VuZGF0aW9uIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERvIG5vdCBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRpdGxlICAgOiBWSVNBVFlQRS5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhdGUgICAgOiAwNC0xNC0yMDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFB1cnBvc2UgOiBGdW5kYW1lbnRhbCBWSVNBIGRhdGEgdHlwZXMgYW5kIG1hY3JvIGRlZmluaXRpb25zICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1ZJU0FUWVBFX0hFQURFUl9fCisjZGVmaW5lIF9fVklTQVRZUEVfSEVBREVSX18KKworI2lmIGRlZmluZWQoX1dJTjY0KQorI2RlZmluZSBfVklfRkFSCisjZGVmaW5lIF9WSV9GVU5DICAgICAgICAgICAgX19mYXN0Y2FsbAorI2RlZmluZSBfVklfRlVOQ0MgICAgICAgICAgIF9fZmFzdGNhbGwKKyNkZWZpbmUgX1ZJX0ZVTkNIICAgICAgICAgICBfX2Zhc3RjYWxsCisjZGVmaW5lIF9WSV9TSUdORUQgICAgICAgICAgc2lnbmVkCisjZWxpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fTlRfXykpICYmICFkZWZpbmVkKF9OSV9tc3dpbjE2XykKKyNkZWZpbmUgX1ZJX0ZBUgorI2RlZmluZSBfVklfRlVOQyAgICAgICAgICAgIF9fc3RkY2FsbAorI2RlZmluZSBfVklfRlVOQ0MgICAgICAgICAgIF9fY2RlY2wKKyNkZWZpbmUgX1ZJX0ZVTkNIICAgICAgICAgICBfX3N0ZGNhbGwKKyNkZWZpbmUgX1ZJX1NJR05FRCAgICAgICAgICBzaWduZWQKKyNlbGlmIGRlZmluZWQoX0NWSV8pICYmIGRlZmluZWQoX05JX2kzODZfKQorI2RlZmluZSBfVklfRkFSCisjZGVmaW5lIF9WSV9GVU5DICAgICAgICAgICAgX3Bhc2NhbAorI2RlZmluZSBfVklfRlVOQ0MKKyNkZWZpbmUgX1ZJX0ZVTkNIICAgICAgICAgICBfcGFzY2FsCisjZGVmaW5lIF9WSV9TSUdORUQgICAgICAgICAgc2lnbmVkCisjZWxpZiAoZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChfV2luZG93cykpICYmICFkZWZpbmVkKF9OSV9tc3dpbjE2XykKKyNkZWZpbmUgX1ZJX0ZBUiAgICAgICAgICAgICBfZmFyCisjZGVmaW5lIF9WSV9GVU5DICAgICAgICAgICAgX2ZhciBfcGFzY2FsIF9leHBvcnQKKyNkZWZpbmUgX1ZJX0ZVTkNDICAgICAgICAgICBfZmFyIF9jZGVjbCAgX2V4cG9ydAorI2RlZmluZSBfVklfRlVOQ0ggICAgICAgICAgIF9mYXIgX3Bhc2NhbAorI2RlZmluZSBfVklfU0lHTkVEICAgICAgICAgIHNpZ25lZAorI2VsaWYgKGRlZmluZWQoaHB1eCkgfHwgZGVmaW5lZChfX2hwdXgpKSAmJiAoZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX2NwbHVzcGx1c19fKSkKKyNkZWZpbmUgX1ZJX0ZBUgorI2RlZmluZSBfVklfRlVOQworI2RlZmluZSBfVklfRlVOQ0MKKyNkZWZpbmUgX1ZJX0ZVTkNICisjZGVmaW5lIF9WSV9TSUdORUQKKyNlbHNlCisjZGVmaW5lIF9WSV9GQVIKKyNkZWZpbmUgX1ZJX0ZVTkMKKyNkZWZpbmUgX1ZJX0ZVTkNDCisjZGVmaW5lIF9WSV9GVU5DSAorI2RlZmluZSBfVklfU0lHTkVEICAgICAgICAgIHNpZ25lZAorI2VuZGlmCisKKyNkZWZpbmUgX1ZJX0VSUk9SICAgICAgICAgICAoLTIxNDc0ODM2NDdMLTEpICAvKiAweDgwMDAwMDAwICovCisjZGVmaW5lIF9WSV9QVFIgICAgICAgICAgICAgX1ZJX0ZBUiAqCisKKy8qLSBWSVNBIFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfVklfSU5UNjRfVUlOVDY0X0RFRklORUQKKyNpZiBkZWZpbmVkKF9XSU42NCkgfHwgKChkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19OVF9fKSkgJiYgIWRlZmluZWQoX05JX21zd2luMTZfKSkKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApKSB8fCAoZGVmaW5lZChfQ1ZJXykgJiYgKF9DVklfID49IDcwMCkpIHx8IChkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA+PSAweDA1MjApKQordHlwZWRlZiB1bnNpZ25lZCAgIF9faW50NjQgIFZpVUludDY0OwordHlwZWRlZiBfVklfU0lHTkVEIF9faW50NjQgIFZpSW50NjQ7CisjZGVmaW5lIF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRAorI2lmIGRlZmluZWQoX1dJTjY0KQorI2RlZmluZSBfVklTQV9FTlZfSVNfNjRfQklUCisjZWxzZQorLyogVGhpcyBpcyBhIDMyLWJpdCBPUywgbm90IGEgNjQtYml0IE9TICovCisjZW5kaWYKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDMpCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cit0eXBlZGVmIHVfaW50NjRfdCAgICAgICAgICAgVmlVSW50NjQ7Cit0eXBlZGVmIGludDY0X3QgICAgICAgICAgICAgVmlJbnQ2NDsKKyNkZWZpbmUgX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVECisjaWYgZGVmaW5lZChMT05HX01BWCkgJiYgKExPTkdfTUFYID4gMHg3RkZGRkZGRkwpCisjZGVmaW5lIF9WSVNBX0VOVl9JU182NF9CSVQKKyNlbHNlCisvKiBUaGlzIGlzIGEgMzItYml0IE9TLCBub3QgYSA2NC1iaXQgT1MgKi8KKyNlbmRpZgorI2Vsc2UKKy8qIFRoaXMgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCA2NC1iaXQgdHlwZXMgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKK3R5cGVkZWYgVmlVSW50NjQgICAgX1ZJX1BUUiBWaVBVSW50NjQ7Cit0eXBlZGVmIFZpVUludDY0ICAgIF9WSV9QVFIgVmlBVUludDY0OwordHlwZWRlZiBWaUludDY0ICAgICBfVklfUFRSIFZpUEludDY0OwordHlwZWRlZiBWaUludDY0ICAgICBfVklfUFRSIFZpQUludDY0OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKExPTkdfTUFYKSAmJiAoTE9OR19NQVggPiAweDdGRkZGRkZGTCkKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICBWaVVJbnQzMjsKK3R5cGVkZWYgX1ZJX1NJR05FRCBpbnQgICAgICBWaUludDMyOworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICBWaVVJbnQzMjsKK3R5cGVkZWYgX1ZJX1NJR05FRCBsb25nICAgICBWaUludDMyOworI2VuZGlmCisKK3R5cGVkZWYgVmlVSW50MzIgICAgX1ZJX1BUUiBWaVBVSW50MzI7Cit0eXBlZGVmIFZpVUludDMyICAgIF9WSV9QVFIgVmlBVUludDMyOwordHlwZWRlZiBWaUludDMyICAgICBfVklfUFRSIFZpUEludDMyOwordHlwZWRlZiBWaUludDMyICAgICBfVklfUFRSIFZpQUludDMyOworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgVmlVSW50MTY7Cit0eXBlZGVmIFZpVUludDE2ICAgIF9WSV9QVFIgVmlQVUludDE2OwordHlwZWRlZiBWaVVJbnQxNiAgICBfVklfUFRSIFZpQVVJbnQxNjsKKwordHlwZWRlZiBfVklfU0lHTkVEIHNob3J0ICAgIFZpSW50MTY7Cit0eXBlZGVmIFZpSW50MTYgICAgIF9WSV9QVFIgVmlQSW50MTY7Cit0eXBlZGVmIFZpSW50MTYgICAgIF9WSV9QVFIgVmlBSW50MTY7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICBWaVVJbnQ4OwordHlwZWRlZiBWaVVJbnQ4ICAgICBfVklfUFRSIFZpUFVJbnQ4OwordHlwZWRlZiBWaVVJbnQ4ICAgICBfVklfUFRSIFZpQVVJbnQ4OworCit0eXBlZGVmIF9WSV9TSUdORUQgY2hhciAgICAgVmlJbnQ4OwordHlwZWRlZiBWaUludDggICAgICBfVklfUFRSIFZpUEludDg7Cit0eXBlZGVmIFZpSW50OCAgICAgIF9WSV9QVFIgVmlBSW50ODsKKwordHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgIFZpQ2hhcjsKK3R5cGVkZWYgVmlDaGFyICAgICAgX1ZJX1BUUiBWaVBDaGFyOwordHlwZWRlZiBWaUNoYXIgICAgICBfVklfUFRSIFZpQUNoYXI7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICBWaUJ5dGU7Cit0eXBlZGVmIFZpQnl0ZSAgICAgIF9WSV9QVFIgVmlQQnl0ZTsKK3R5cGVkZWYgVmlCeXRlICAgICAgX1ZJX1BUUiBWaUFCeXRlOworCit0eXBlZGVmIHZvaWQgICAgICAgIF9WSV9QVFIgVmlBZGRyOwordHlwZWRlZiBWaUFkZHIgICAgICBfVklfUFRSIFZpUEFkZHI7Cit0eXBlZGVmIFZpQWRkciAgICAgIF9WSV9QVFIgVmlBQWRkcjsKKwordHlwZWRlZiBmbG9hdCAgICAgICAgICAgICAgIFZpUmVhbDMyOwordHlwZWRlZiBWaVJlYWwzMiAgICBfVklfUFRSIFZpUFJlYWwzMjsKK3R5cGVkZWYgVmlSZWFsMzIgICAgX1ZJX1BUUiBWaUFSZWFsMzI7CisKK3R5cGVkZWYgZG91YmxlICAgICAgICAgICAgICBWaVJlYWw2NDsKK3R5cGVkZWYgVmlSZWFsNjQgICAgX1ZJX1BUUiBWaVBSZWFsNjQ7Cit0eXBlZGVmIFZpUmVhbDY0ICAgIF9WSV9QVFIgVmlBUmVhbDY0OworCit0eXBlZGVmIFZpUEJ5dGUgICAgICAgICAgICAgVmlCdWY7Cit0eXBlZGVmIFZpUEJ5dGUgICAgICAgICAgICAgVmlQQnVmOwordHlwZWRlZiBWaVBCeXRlICAgICBfVklfUFRSIFZpQUJ1ZjsKKwordHlwZWRlZiBWaVBDaGFyICAgICAgICAgICAgIFZpU3RyaW5nOwordHlwZWRlZiBWaVBDaGFyICAgICAgICAgICAgIFZpUFN0cmluZzsKK3R5cGVkZWYgVmlQQ2hhciAgICAgX1ZJX1BUUiBWaUFTdHJpbmc7CisKK3R5cGVkZWYgVmlTdHJpbmcgICAgICAgICAgICBWaVJzcmM7Cit0eXBlZGVmIFZpU3RyaW5nICAgICAgICAgICAgVmlQUnNyYzsKK3R5cGVkZWYgVmlTdHJpbmcgICAgX1ZJX1BUUiBWaUFSc3JjOworCit0eXBlZGVmIFZpVUludDE2ICAgICAgICAgICAgVmlCb29sZWFuOwordHlwZWRlZiBWaUJvb2xlYW4gICBfVklfUFRSIFZpUEJvb2xlYW47Cit0eXBlZGVmIFZpQm9vbGVhbiAgIF9WSV9QVFIgVmlBQm9vbGVhbjsKKwordHlwZWRlZiBWaUludDMyICAgICAgICAgICAgIFZpU3RhdHVzOwordHlwZWRlZiBWaVN0YXR1cyAgICBfVklfUFRSIFZpUFN0YXR1czsKK3R5cGVkZWYgVmlTdGF0dXMgICAgX1ZJX1BUUiBWaUFTdGF0dXM7CisKK3R5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICBWaVZlcnNpb247Cit0eXBlZGVmIFZpVmVyc2lvbiAgIF9WSV9QVFIgVmlQVmVyc2lvbjsKK3R5cGVkZWYgVmlWZXJzaW9uICAgX1ZJX1BUUiBWaUFWZXJzaW9uOworCit0eXBlZGVmIFZpVUludDMyICAgICAgICAgICAgVmlPYmplY3Q7Cit0eXBlZGVmIFZpT2JqZWN0ICAgIF9WSV9QVFIgVmlQT2JqZWN0OwordHlwZWRlZiBWaU9iamVjdCAgICBfVklfUFRSIFZpQU9iamVjdDsKKwordHlwZWRlZiBWaU9iamVjdCAgICAgICAgICAgIFZpU2Vzc2lvbjsKK3R5cGVkZWYgVmlTZXNzaW9uICAgX1ZJX1BUUiBWaVBTZXNzaW9uOwordHlwZWRlZiBWaVNlc3Npb24gICBfVklfUFRSIFZpQVNlc3Npb247CisKK3R5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICAgVmlBdHRyOworCisjaWZuZGVmIF9WSV9DT05TVF9TVFJJTkdfREVGSU5FRAordHlwZWRlZiBjb25zdCBWaUNoYXIgKiBWaUNvbnN0U3RyaW5nOworI2RlZmluZSBfVklfQ09OU1RfU1RSSU5HX0RFRklORUQKKyNlbmRpZiAgCisKKy8qLSBDb21wbGV0aW9uIGFuZCBFcnJvciBDb2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBWSV9TVUNDRVNTICAgICAgICAgICgwTCkKKworLyotIE90aGVyIFZJU0EgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZJX05VTEwgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgVklfVFJVRSAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgVklfRkFMU0UgICAgICAgICAgICAoMCkKKworLyotIEJhY2t3YXJkIENvbXBhdGliaWxpdHkgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZJU0FGTiAgICAgICAgICAgICAgX1ZJX0ZVTkMKKyNkZWZpbmUgVmlQdHIgICAgICAgICAgICAgICBfVklfUFRSCisKKyNlbmRpZgorCisvKi0gVGhlIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9nZW5saW5rcyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9nZW5saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTMxZGJjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2dlbmxpbmtzCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9iYXNoCisKKyMgdGhpcyBmaWxlIHNob3VsZCBnZW5lcmF0ZSBzeW1saW5rcyAoUE9TSVgsIFRPRE8pIG9yIExEIHNjcmlwdHMgKFBPU0lYIG9yIHdpbmRvd3MpIHRvIGVuYWJsZSBzdGFuZGFyZCB2ZXJzaW9uIGxpbmtpbmcKKworZm9yIGxpYiBpbiBsaWIqLnNvLio7IGRvCisJbGlib3V0PSIke2xpYiUuKn0iCisJcm0gLXJmICRsaWJvdXQKKwllY2hvICJPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkiID4gJGxpYm91dAorCWVjaG8gIkdST1VQICggJGxpYiApIiA+PiAkbGlib3V0CisJZWNobyAiR2VuZXJhdGVkIExEIGxpbmsgJGxpYm91dCAtPiAkbGliIgorZG9uZQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0MjE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvLjEgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zby4xIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZWMzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvLjEKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvLjEuNSApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvLjEuNSBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMS41Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWM3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvLjEuNQpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMS41LjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi5zby4xLjUuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMS41LjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTAzOTExYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb24uc28uMS41LjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YzI2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28uMSApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28uMSBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNTRiNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28uMQpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xLjUgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvLjEuNSBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xLjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwMjJkYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJGUkNfTmV0d29ya0NvbW11bmljYXRpb25MVi5zby4xLjUKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28uMS41LjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvLjEuNS4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbkxWLnNvLjEuNS4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1NGQ5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uTFYuc28uMS41LjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkdDQmFzZV9nY2MtNC40LWFybV92Ml8zLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkdDQmFzZV9nY2MtNC40LWFybV92Ml8zLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiY2RhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliR0NCYXNlX2djYy00LjQtYXJtX3YyXzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkdlbkFwaV9nY2MtNC40LWFybV92Ml8zLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkdlbkFwaV9nY2MtNC40LWFybV92Ml8zLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdlNmE2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliR2VuQXBpX2djYy00LjQtYXJtX3YyXzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkxvZ19nY2MtNC40LWFybV92Ml8zLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYkxvZ19nY2MtNC40LWFybV92Ml8zLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlODcxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTG9nX2djYy00LjQtYXJtX3YyXzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk1hdGhQYXJzZXJfZ2NjLTQuNC1hcm1fdjJfMy5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJNYXRoUGFyc2VyX2djYy00LjQtYXJtX3YyXzMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTRkMTI3OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJNYXRoUGFyc2VyX2djYy00LjQtYXJtX3YyXzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2Euc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwNjQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2Euc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliTmlGcGdhLnNvLjE0ICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2Euc28uMTQgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhLnNvLjE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjZlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhLnNvLjE0CkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYk5pRnBnYS5zby4xNC4wICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2Euc28uMTQuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2Euc28uMTQuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRlMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zby4xNC4wCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYk5pRnBnYS5zby4xNC4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zby4xNC4wLjAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhLnNvLjE0LjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZjNhMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYS5zby4xNC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYUx2LnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYUx2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjVhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliTmlGcGdhTHYuc28uMTQgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYUx2LnNvLjE0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYUx2LnNvLjE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGFlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28uMTQKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliTmlGcGdhTHYuc28uMTQuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28uMTQuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2FMdi5zby4xNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMGIyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlGcGdhTHYuc28uMTQuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJOaUZwZ2FMdi5zby4xNC4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pRnBnYUx2LnNvLjE0LjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2FMdi5zby4xNC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2VmZWU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaUZwZ2FMdi5zby4xNC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pUmlvU3J2LnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pUmlvU3J2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjU1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliTmlSaW9TcnYuc28uMTQgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pUmlvU3J2LnNvLjE0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pUmlvU3J2LnNvLjE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOThkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28uMTQKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliTmlSaW9TcnYuc28uMTQuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28uMTQuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaVJpb1Nydi5zby4xNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTIwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliTmlSaW9TcnYuc28uMTQuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJOaVJpb1Nydi5zby4xNC4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYk5pUmlvU3J2LnNvLjE0LjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaVJpb1Nydi5zby4xNC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDkxN2FmOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJOaVJpb1Nydi5zby4xNC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRkYzAzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvLjEgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjRmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28uMS4yICkKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvLjEuMiBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvLjEuMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdmYTBlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28uMS4yCkBAIC0wLDAgKzEsMiBAQAorT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pCitHUk9VUCAoIGxpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28uMS4yLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28uMS4yLjAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliUm9ib1JJT19GUkNfQ2hpcE9iamVjdC5zby4xLjIuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTZiZGNlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYlJvYm9SSU9fRlJDX0NoaXBPYmplY3Quc28uMS4yLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJpMmMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczY2EzNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJpMmMuc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliaTJjLnNvLjEgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zby4xIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMDc1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliaTJjLnNvLjEKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGliaTJjLnNvLjEuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliaTJjLnNvLjEuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJpMmMuc28uMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YzU4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGliaTJjLnNvLjEuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJpMmMuc28uMS4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmkyYy5zby4xLjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJpMmMuc28uMS4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzQ3NDBjYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJpMmMuc28uMS4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYmxvZzRjcHBfZ2NjLTQuNC1hcm1fdjJfMy5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJsb2c0Y3BwX2djYy00LjQtYXJtX3YyXzMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDZmNjc4MAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJsb2c0Y3BwX2djYy00LjQtYXJtX3YyXzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9lbWIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2NzhkNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9lbWIuc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibmlfZW1iLnNvLjcgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zby43IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zby43Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzAzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfZW1iLnNvLjcKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibmlfZW1iLnNvLjcuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfZW1iLnNvLjcuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9lbWIuc28uNy4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNTJjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfZW1iLnNvLjcuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaV9lbWIuc28uNy4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX2VtYi5zby43LjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9lbWIuc28uNy4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYzYjg1MgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9lbWIuc28uNy4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX3J0bG9nLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX3J0bG9nLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDU2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibmlfcnRsb2cuc28uMiApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28uMiBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9ydGxvZy5zby4yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZmMxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28uMgpAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaV9ydGxvZy5zby4yLjMgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX3J0bG9nLnNvLjIuMyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9ydGxvZy5zby4yLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3Mzg2NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaV9ydGxvZy5zby4yLjMKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibmlfcnRsb2cuc28uMi4zLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX3J0bG9nLnNvLjIuMy4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pX3J0bG9nLnNvLjIuMy4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkNmQ2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlfcnRsb2cuc28uMi4zLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5paW1hcWR4LnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5paW1hcWR4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTdjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibmlpbWFxZHguc28uMTQgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5paW1hcWR4LnNvLjE0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5paW1hcWR4LnNvLjE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGVhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28uMTQKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibmlpbWFxZHguc28uMTQuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28uMTQuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaWltYXFkeC5zby4xNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlpbWFxZHguc28uMTQuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaWltYXFkeC5zby4xNC4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5paW1hcWR4LnNvLjE0LjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaWltYXFkeC5zby4xNC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjdjZDE4OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaWltYXFkeC5zby4xNC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pcmlvX2VtYl9jYW4uc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWI4MTMzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pcmlvX2VtYl9jYW4uc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibmlyaW9fZW1iX2Nhbi5zby4xNCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zby4xNCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXJpb19lbWJfY2FuLnNvLjE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTQ4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zby4xNApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXJpb19lbWJfY2FuLnNvLjE0LjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pcmlvX2VtYl9jYW4uc28uMTQuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXJpb19lbWJfY2FuLnNvLjE0LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlODM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXJpb19lbWJfY2FuLnNvLjE0LjAKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibmlyaW9fZW1iX2Nhbi5zby4xNC4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pcmlvX2VtYl9jYW4uc28uMTQuMC4wIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pcmlvX2VtYl9jYW4uc28uMTQuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNlMDRlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibmlyaW9fZW1iX2Nhbi5zby4xNC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzaW9uLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzaW9uLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzBjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibml2aXNpb24uc28uMTQgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzaW9uLnNvLjE0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzaW9uLnNvLjE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDY5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28uMTQKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibml2aXNpb24uc28uMTQuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28uMTQuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc2lvbi5zby4xNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNGQyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNpb24uc28uMTQuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXZpc2lvbi5zby4xNC4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzaW9uLnNvLjE0LjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc2lvbi5zby4xNC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTBhNDgxMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc2lvbi5zby4xNC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzc3ZjLnNvIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzc3ZjLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYmJkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibml2aXNzdmMuc28uMTQgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzc3ZjLnNvLjE0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzc3ZjLnNvLjE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNWNjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28uMTQKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlibml2aXNzdmMuc28uMTQuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28uMTQuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc3N2Yy5zby4xNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmZkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlibml2aXNzdmMuc28uMTQuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJuaXZpc3N2Yy5zby4xNC4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYm5pdmlzc3ZjLnNvLjE0LjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc3N2Yy5zby4xNC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDgwNTc4ZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJuaXZpc3N2Yy5zby4xNC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJzcGkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3NjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJzcGkuc28KQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlic3BpLnNvLjEgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zby4xIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTA2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlic3BpLnNvLjEKQEAgLTAsMCArMSwyIEBACitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0dST1VQICggbGlic3BpLnNvLjEuMCApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlic3BpLnNvLjEuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJzcGkuc28uMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDE2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlic3BpLnNvLjEuMApAQCAtMCwwICsxLDIgQEAKK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBsaWJzcGkuc28uMS4wLjAgKQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnNwaS5zby4xLjAuMCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJzcGkuc28uMS4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWY2OWYzMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJzcGkuc28uMS4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnZpc2Euc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlidmlzYS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Y2E3MTFjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYnZpc2Euc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvbmktbGlicmFyaWVzL2xpYndwaS5zbyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJ3cGkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5ZmY4MAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJ3cGkuc28KQEAgLTAsMCArMSwzIEBACisvKiBHTlUgbGQgc2NyaXB0ICovCitPVVRQVVRfRk9STUFUKGVsZjMyLWxpdHRsZWFybSkKK0lOUFVUICggLWx3cGlfMjAxNSApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlid3BpXzIwMTUuc28gYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9uaS1saWJyYXJpZXMvbGlid3BpXzIwMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4OWFmMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL25pLWxpYnJhcmllcy9saWJ3cGlfMjAxNS5zbwpAQCAtMCwwICsxLDMgQEAKKy8qIEdOVSBsZCBzY3JpcHQgKi8KK09VVFBVVF9GT1JNQVQoZWxmMzItbGl0dGxlYXJtKQorR1JPVVAgKCBBU19ORUVERUQgKCAtbHdwaWxpYl9ub25zaGFyZWQgLWxIQUxBdGhlbmEgLWxOZXR3b3JrVGFibGVzIC1sRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uIC1saTJjIC1sbmlfZW1iIC1sTmlGcGdhTHYgLWxOaUZwZ2EgLWxuaXJpb19lbWJfY2FuIC1sTmlSaW9TcnYgLWxuaV9ydGxvZyAtbFJvYm9SSU9fRlJDX0NoaXBPYmplY3QgLWxzcGkgLWx2aXNhIC1sZGwgLWxwdGhyZWFkIC1scnQgLWxHQ0Jhc2VfZ2NjLTQuNC1hcm1fdjJfMyAtbEdlbkFwaV9nY2MtNC40LWFybV92Ml8zIC1sTG9nX2djYy00LjQtYXJtX3YyXzMgLWxNYXRoUGFyc2VyX2djYy00LjQtYXJtX3YyXzMgLWxsb2c0Y3BwX2djYy00LjQtYXJtX3YyXzMgLWxuaWltYXFkeCAtbG5pdmlzaW9uIC1sbml2aXNzdmMgKSApCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi9zeW5jLnNoIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvc3luYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZTA1MjMzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvc3luYy5zaApAQCAtMCwwICsxLDIwIEBACisjIS9iaW4vYmFzaCAtZQorCisjIFRoaXMgc2NyaXB0IGNvcGllcyB0aGUgY29ycmVjdCBkaXJlY3RvcmllcyBvdmVyIGZyb20gYW4gYWxsd3BpbGliIGdpdAorIyByZXBvc2l0b3J5ICh3aGljaCBuZWVkcyB0byBoYXZlIGEgd29ya2luZyB0cmVlKS4KKyMgVEhJUyBXSUxMIEVSQVNFIEFOWSBMT0NBTCBDSEFOR0VTIFRPIFRIRSBXUElMSUIgU09VUkNFUyEKKworIyBUYWtlcyAxIGFyZ3VtZW50OiB0aGUgZm9sZGVyIHRvIGNvcHkgZnJvbS4KKworY2QgJChkaXJuYW1lICQwKQorCitTT1VSQ0U9JDEKK0RJUlM9IndwaWxpYmMgaGFsIG5pLWxpYnJhcmllcyIKKworWyAtbiAiJHtTT1VSQ0V9IiBdIHx8ICggZWNobyAiTmVlZCBhIGRpcmVjdG9yeSB0byBzeW5jIGZyb20hIiA7IGV4aXQgMSApCitbIC1kICIke1NPVVJDRX0iIF0gfHwgKCBlY2hvICIke1NPVVJDRX0gaXMgbm90IGEgZGlyZWN0b3J5LiBBYm9ydGluZyEiIDsgZXhpdCAxICkKKworZm9yIGRpciBpbiAke0RJUlN9OyBkbworCVsgLWQgJHtkaXJ9IF0gJiYgcm0gLXIgJHtkaXJ9CisJY3AgLXIgJHtTT1VSQ0V9LyR7ZGlyfSAuLworZG9uZQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy9DTWFrZUxpc3RzLnR4dCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0YTdlZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1IEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorcHJvamVjdChXUElMaWJDKQorCithZGRfc3ViZGlyZWN0b3J5KHdwaWxpYkMrKykKK2FkZF9zdWJkaXJlY3Rvcnkod3BpbGliQysrRGV2aWNlcykKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL0NNYWtlTGlzdHMudHh0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmM2ZjOQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNSBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKK3Byb2plY3QoV1BJTGliQysrKQorCitJTlNUQUxMKERJUkVDVE9SWSBpbmNsdWRlIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IENPTVBPTkVOVCBoZWFkZXJzKQorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0Jhc2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDczZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0Jhc2UuaApAQCAtMCwwICsxLDEyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisvLyBBIG1hY3JvIHRvIGRpc2FsbG93IHRoZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0gZnVuY3Rpb25zCisvLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MKKyNkZWZpbmUgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFR5cGVOYW1lKSBcCisgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgXAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0NvbnRyb2xsZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZWJhODgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0NvbnRyb2xsZXIuaApAQCAtMCwwICsxLDM0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorCisvKioKKyAqIEludGVyZmFjZSBmb3IgQ29udHJvbGxlcnMKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGNvbnRyb2xsZXJzLiBDb250cm9sbGVycyBydW4gY29udHJvbCBsb29wcywgdGhlIG1vc3QgY29tbW9uCisgKiBhcmUgUElEIGNvbnRyb2xsZXJzIGFuZCB0aGVpciB2YXJpYW50cywgYnV0IHRoaXMgaW5jbHVkZXMgYW55dGhpbmcgdGhhdCBpcyBjb250cm9sbGluZworICogYW4gYWN0dWF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgKi8KK2NsYXNzIENvbnRyb2xsZXIKK3sKK3B1YmxpYzoKKwl2aXJ0dWFsIH5Db250cm9sbGVyKCkge307CisJCisJLyoqCisJICogQWxsb3dzIHRoZSBjb250cm9sIGxvb3AgdG8gcnVuCisJICovCisJdmlydHVhbCB2b2lkIEVuYWJsZSgpID0gMDsKKwkKKwkvKiogCisJICogU3RvcHMgdGhlIGNvbnRyb2wgbG9vcCBmcm9tIHJ1bm5pbmcgdW50aWwgZXhwbGljaXRseSByZS1lbmFibGVkIGJ5IGNhbGxpbmcgZW5hYmxlKCkKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpID0gMDsKK307CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvRXJyb3IuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJlMGYwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9FcnJvci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQmFzZS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gIEZvcndhcmQgZGVjbGFyYXRpb25zCitjbGFzcyBFcnJvckJhc2U7CisKKy8qKgorICogRXJyb3Igb2JqZWN0IHJlcHJlc2VudHMgYSBsaWJyYXJ5IGVycm9yLgorICovCitjbGFzcyBFcnJvcgoreworcHVibGljOgorCXR5cGVkZWYgaW50MzJfdCBDb2RlOworCisJRXJyb3IoKTsKKwl+RXJyb3IoKTsKKwl2b2lkIENsb25lKEVycm9yICZlcnJvcik7CisJQ29kZSBHZXRDb2RlKCkgY29uc3Q7CisJY29uc3QgY2hhciAqR2V0TWVzc2FnZSgpIGNvbnN0OworCWNvbnN0IGNoYXIgKkdldEZpbGVuYW1lKCkgY29uc3Q7CisJY29uc3QgY2hhciAqR2V0RnVuY3Rpb24oKSBjb25zdDsKKwl1aW50MzJfdCBHZXRMaW5lTnVtYmVyKCkgY29uc3Q7CisJY29uc3QgRXJyb3JCYXNlKiBHZXRPcmlnaW5hdGluZ09iamVjdCgpIGNvbnN0OworCWRvdWJsZSBHZXRUaW1lc3RhbXAoKSBjb25zdDsKKwl2b2lkIENsZWFyKCk7CisJdm9pZCBTZXQoQ29kZSBjb2RlLCBjb25zdCBjaGFyKiBjb250ZXh0TWVzc2FnZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAorCQkJdWludDMyX3QgbGluZU51bWJlciwgY29uc3QgRXJyb3JCYXNlKiBvcmlnaW5hdGluZ09iamVjdCk7CisJc3RhdGljIHZvaWQgRW5hYmxlU3VzcGVuZE9uRXJyb3IoYm9vbCBlbmFibGUpCisJeworCQltX3N1c3BlbmRPbkVycm9yRW5hYmxlZCA9IGVuYWJsZTsKKwl9CisKK3ByaXZhdGU6CisJdm9pZCBSZXBvcnQoKTsKKworCUNvZGUgbV9jb2RlOworCXN0ZDo6c3RyaW5nIG1fbWVzc2FnZTsKKwlzdGQ6OnN0cmluZyBtX2ZpbGVuYW1lOworCXN0ZDo6c3RyaW5nIG1fZnVuY3Rpb247CisJdWludDMyX3QgbV9saW5lTnVtYmVyOworCWNvbnN0IEVycm9yQmFzZSogbV9vcmlnaW5hdGluZ09iamVjdDsKKwlkb3VibGUgbV90aW1lc3RhbXA7CisKKwlzdGF0aWMgYm9vbCBtX3N1c3BlbmRPbkVycm9yRW5hYmxlZDsKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRXJyb3IpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvRXJyb3JCYXNlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0Vycm9yQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTkxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0Vycm9yQmFzZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQmFzZS5oIgorI2luY2x1ZGUgIkVycm9yLmgiCisjaW5jbHVkZSAiSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwIgorCisjZGVmaW5lIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoY29udGV4dCkgICAodGhpcy0+U2V0RXJybm9FcnJvcigoY29udGV4dCksIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKSkKKyNkZWZpbmUgd3BpX3NldEVycm5vRXJyb3IoKSAgICh3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KCIiKSkKKyNkZWZpbmUgd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KGNvZGUsIGNvbnRleHQpICAgKHRoaXMtPlNldEltYXFFcnJvcigoY29kZSksIChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pKQorI2RlZmluZSB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChjb2RlLCBjb250ZXh0KSAgICh0aGlzLT5TZXRFcnJvcigoY29kZSksIChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pKQorI2RlZmluZSB3cGlfc2V0RXJyb3IoY29kZSkgICAod3BpX3NldEVycm9yV2l0aENvbnRleHQoY29kZSwgIiIpKQorI2RlZmluZSB3cGlfc2V0U3RhdGljRXJyb3JXaXRoQ29udGV4dChvYmplY3QsIGNvZGUsIGNvbnRleHQpICAgKG9iamVjdC0+U2V0RXJyb3IoKGNvZGUpLCAoY29udGV4dCksIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKSkKKyNkZWZpbmUgd3BpX3NldFN0YXRpY0Vycm9yKG9iamVjdCwgY29kZSkgICAod3BpX3NldFN0YXRpY0Vycm9yV2l0aENvbnRleHQob2JqZWN0LCBjb2RlLCAiIikpCisjZGVmaW5lIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KGNvZGUsIGNvbnRleHQpICAgKEVycm9yQmFzZTo6U2V0R2xvYmFsRXJyb3IoKGNvZGUpLCAoY29udGV4dCksIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKSkKKyNkZWZpbmUgd3BpX3NldEdsb2JhbEVycm9yKGNvZGUpICAgKHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KGNvZGUsICIiKSkKKyNkZWZpbmUgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoZXJyb3IsIGNvbnRleHQpICAgKHRoaXMtPlNldFdQSUVycm9yKCh3cGlfZXJyb3Jfc18jI2Vycm9yKSwgKHdwaV9lcnJvcl92YWx1ZV8jI2Vycm9yKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykpCisjZGVmaW5lIHdwaV9zZXRXUElFcnJvcihlcnJvcikgICAod3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoZXJyb3IsICIiKSkKKyNkZWZpbmUgd3BpX3NldFN0YXRpY1dQSUVycm9yV2l0aENvbnRleHQob2JqZWN0LCBlcnJvciwgY29udGV4dCkgICAob2JqZWN0LT5TZXRXUElFcnJvcigod3BpX2Vycm9yX3NfIyNlcnJvciksIChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pKQorI2RlZmluZSB3cGlfc2V0U3RhdGljV1BJRXJyb3Iob2JqZWN0LCBlcnJvcikgICAod3BpX3NldFN0YXRpY1dQSUVycm9yV2l0aENvbnRleHQob2JqZWN0LCBlcnJvciwgIiIpKQorI2RlZmluZSB3cGlfc2V0R2xvYmFsV1BJRXJyb3JXaXRoQ29udGV4dChlcnJvciwgY29udGV4dCkgICAoRXJyb3JCYXNlOjpTZXRHbG9iYWxXUElFcnJvcigod3BpX2Vycm9yX3NfIyNlcnJvciksIChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pKQorI2RlZmluZSB3cGlfc2V0R2xvYmFsV1BJRXJyb3IoZXJyb3IpICAgKHdwaV9zZXRHbG9iYWxXUElFcnJvcldpdGhDb250ZXh0KGVycm9yLCAiIikpCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgbW9zdCBvYmplY3RzLgorICogRXJyb3JCYXNlIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBtb3N0IG9iamVjdHMgc2luY2UgaXQgaG9sZHMgdGhlIGdlbmVyYXRlZCBlcnJvcgorICogZm9yIHRoYXQgb2JqZWN0LiBJbiBhZGRpdGlvbiwgdGhlcmUgaXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYSBnbG9iYWwgZXJyb3Igb2JqZWN0CisgKi8KK2NsYXNzIEVycm9yQmFzZQoreworLy9UT0RPOiBDb25zaWRlciBpbml0aWFsaXppbmcgaW5zdGFuY2UgdmFyaWFibGVzIGFuZCBjbGVhbnVwIGluIGRlc3RydWN0b3IKK3B1YmxpYzoKKwl2aXJ0dWFsIH5FcnJvckJhc2UoKTsKKwl2aXJ0dWFsIEVycm9yJiBHZXRFcnJvcigpOworCXZpcnR1YWwgY29uc3QgRXJyb3ImIEdldEVycm9yKCkgY29uc3Q7CisJdmlydHVhbCB2b2lkIFNldEVycm5vRXJyb3IoY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorCQkJY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0OworCXZpcnR1YWwgdm9pZCBTZXRJbWFxRXJyb3IoaW50IHN1Y2Nlc3MsIGNvbnN0IGNoYXIgKmNvbnRleHRNZXNzYWdlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwKKwkJCWNvbnN0IGNoYXIqIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQgU2V0RXJyb3IoRXJyb3I6OkNvZGUgY29kZSwgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorCQkJY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0OworCXZpcnR1YWwgdm9pZCBTZXRXUElFcnJvcihjb25zdCBjaGFyICplcnJvck1lc3NhZ2UsIEVycm9yOjpDb2RlIGNvZGUsIGNvbnN0IGNoYXIgKmNvbnRleHRNZXNzYWdlLAorCQkJY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQgQ2xvbmVFcnJvcihFcnJvckJhc2UgKnJocykgY29uc3Q7CisJdmlydHVhbCB2b2lkIENsZWFyRXJyb3IoKSBjb25zdDsKKwl2aXJ0dWFsIGJvb2wgU3RhdHVzSXNGYXRhbCgpIGNvbnN0OworCXN0YXRpYyB2b2lkIFNldEdsb2JhbEVycm9yKEVycm9yOjpDb2RlIGNvZGUsIGNvbnN0IGNoYXIgKmNvbnRleHRNZXNzYWdlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwKKwkJCWNvbnN0IGNoYXIqIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKTsKKwlzdGF0aWMgdm9pZCBTZXRHbG9iYWxXUElFcnJvcihjb25zdCBjaGFyICplcnJvck1lc3NhZ2UsIGNvbnN0IGNoYXIgKmNvbnRleHRNZXNzYWdlLAorCQkJY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKTsKKwlzdGF0aWMgRXJyb3ImIEdldEdsb2JhbEVycm9yKCk7Citwcm90ZWN0ZWQ6CisJbXV0YWJsZSBFcnJvciBtX2Vycm9yOworCS8vIFRPRE86IFJlcGxhY2UgZ2xvYmFsRXJyb3Igd2l0aCBhIGdsb2JhbCBsaXN0IG9mIGFsbCBlcnJvcnMuCisJc3RhdGljIE11dGV4IF9nbG9iYWxFcnJvck11dGV4OworCXN0YXRpYyBFcnJvciBfZ2xvYmFsRXJyb3I7CisJRXJyb3JCYXNlKCk7Citwcml2YXRlOgorCURJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFcnJvckJhc2UpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvR2VuZXJpY0hJRC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9HZW5lcmljSElELmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4ZGZkZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvR2VuZXJpY0hJRC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKiBHZW5lcmljSElEIEludGVyZmFjZQorICovCitjbGFzcyBHZW5lcmljSElECit7CitwdWJsaWM6CisJZW51bSBKb3lzdGlja0hhbmQKKwl7CisJCWtMZWZ0SGFuZCA9IDAsCisJCWtSaWdodEhhbmQgPSAxCisJfTsKKworCXZpcnR1YWwgfkdlbmVyaWNISUQoKQorCXsKKwl9CisKKwl2aXJ0dWFsIGZsb2F0IEdldFgoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSA9IDA7CisJdmlydHVhbCBmbG9hdCBHZXRZKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgPSAwOworCXZpcnR1YWwgZmxvYXQgR2V0WigpID0gMDsKKwl2aXJ0dWFsIGZsb2F0IEdldFR3aXN0KCkgPSAwOworCXZpcnR1YWwgZmxvYXQgR2V0VGhyb3R0bGUoKSA9IDA7CisJdmlydHVhbCBmbG9hdCBHZXRSYXdBeGlzKHVpbnQzMl90IGF4aXMpID0gMDsKKworCXZpcnR1YWwgYm9vbCBHZXRUcmlnZ2VyKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgPSAwOworCXZpcnR1YWwgYm9vbCBHZXRUb3AoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSA9IDA7CisJdmlydHVhbCBib29sIEdldEJ1bXBlcihKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpID0gMDsKKwl2aXJ0dWFsIGJvb2wgR2V0UmF3QnV0dG9uKHVpbnQzMl90IGJ1dHRvbikgPSAwOworCisJdmlydHVhbCBpbnQgR2V0UE9WKHVpbnQzMl90IHBvdiA9IDApID0gMDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0hMVXNhZ2VSZXBvcnRpbmcuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvSExVc2FnZVJlcG9ydGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWIxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL0hMVXNhZ2VSZXBvcnRpbmcuaApAQCAtMCwwICsxLDI1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCitjbGFzcyBITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlCit7CitwdWJsaWM6CisJdmlydHVhbCB+SExVc2FnZVJlcG9ydGluZ0ludGVyZmFjZSgpIHt9OworCXZpcnR1YWwgdm9pZCBSZXBvcnRTY2hlZHVsZXIoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIFJlcG9ydFNtYXJ0RGFzaGJvYXJkKCkgPSAwOworfTsKKworY2xhc3MgSExVc2FnZVJlcG9ydGluZworeworcHJpdmF0ZToKKwlzdGF0aWMgSExVc2FnZVJlcG9ydGluZ0ludGVyZmFjZSogaW1wbDsKKwkKK3B1YmxpYzoKKwlzdGF0aWMgdm9pZCBTZXRJbXBsZW1lbnRhdGlvbihITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKiBpKTsKKwlzdGF0aWMgdm9pZCBSZXBvcnRTY2hlZHVsZXIoKTsKKyAgICBzdGF0aWMgdm9pZCBSZXBvcnRTbWFydERhc2hib2FyZCgpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvTm90aWZpZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvTm90aWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTc5ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9Ob3RpZmllci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAiVGFzay5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKwordHlwZWRlZiB2b2lkICgqVGltZXJFdmVudEhhbmRsZXIpKHZvaWQgKnBhcmFtKTsKKworY2xhc3MgTm90aWZpZXIgOiBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisJTm90aWZpZXIoVGltZXJFdmVudEhhbmRsZXIgaGFuZGxlciwgdm9pZCAqcGFyYW0gPSBOVUxMKTsKKwl2aXJ0dWFsIH5Ob3RpZmllcigpOworCXZvaWQgU3RhcnRTaW5nbGUoZG91YmxlIGRlbGF5KTsKKwl2b2lkIFN0YXJ0UGVyaW9kaWMoZG91YmxlIHBlcmlvZCk7CisJdm9pZCBTdG9wKCk7Citwcml2YXRlOgorCXN0YXRpYyBOb3RpZmllciAqdGltZXJRdWV1ZUhlYWQ7CisJc3RhdGljIFJlZW50cmFudE11dGV4IHF1ZXVlU2VtYXBob3JlOworCXN0YXRpYyB2b2lkKiBtX25vdGlmaWVyOworCXN0YXRpYyBpbnQgcmVmY291bnQ7CisKKwlzdGF0aWMgdm9pZCBQcm9jZXNzUXVldWUodWludDMyX3QgbWFzaywgdm9pZCAqcGFyYW1zKTsgLy8gcHJvY2VzcyB0aGUgdGltZXIgcXVldWUgb24gYSB0aW1lciBldmVudAorCXN0YXRpYyB2b2lkIFVwZGF0ZUFsYXJtKCk7CQkJLy8gdXBkYXRlIHRoZSBGUEdBIGFsYXJtIHNpbmNlIHRoZSBxdWV1ZSBoYXMgY2hhbmdlZAorCXZvaWQgSW5zZXJ0SW5RdWV1ZShib29sIHJlc2NoZWR1bGUpOwkvLyBpbnNlcnQgdGhpcyBOb3RpZmllciBpbiB0aGUgdGltZXIgcXVldWUKKwl2b2lkIERlbGV0ZUZyb21RdWV1ZSgpOwkJCQkvLyBkZWxldGUgdGhpcyBOb3RpZmllciBmcm9tIHRoZSB0aW1lciBxdWV1ZQorCVRpbWVyRXZlbnRIYW5kbGVyIG1faGFuZGxlcjsJCQkvLyBhZGRyZXNzIG9mIHRoZSBoYW5kbGVyCisJdm9pZCAqbV9wYXJhbTsJCQkJCQkJLy8gYSBwYXJhbWV0ZXIgdG8gcGFzcyB0byB0aGUgaGFuZGxlcgorCWRvdWJsZSBtX3BlcmlvZDsJCQkJCQkvLyB0aGUgcmVsYXRpdmUgdGltZSAoZWl0aGVyIHBlcmlvZGljIG9yIHNpbmdsZSkKKwlkb3VibGUgbV9leHBpcmF0aW9uVGltZTsJCQkJLy8gYWJzb2x1dGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgY3VycmVudCBldmVudAorCU5vdGlmaWVyICptX25leHRFdmVudDsJCQkJCS8vIG5leHQgTm9maWZpZXIgZXZlbnQKKwlib29sIG1fcGVyaW9kaWM7CQkJCQkJLy8gdHJ1ZSBpZiB0aGlzIGlzIGEgcGVyaW9kaWMgZXZlbnQKKwlib29sIG1fcXVldWVkOwkJCQkJCQkvLyBpbmRpY2F0ZXMgaWYgdGhpcyBlbnRyeSBpcyBxdWV1ZWQKKwlTRU1BUEhPUkVfSUQgbV9oYW5kbGVyU2VtYXBob3JlOwkJLy8gaGVsZCBieSBpbnRlcnJ1cHQgbWFuYWdlciB0YXNrIHdoaWxlIGhhbmRsZXIgY2FsbCBpcyBpbiBwcm9ncmVzcworCisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE5vdGlmaWVyKTsKKworCXN0YXRpYyBUYXNrICp0YXNrOworCXN0YXRpYyB2b2lkIFJ1bigpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvUElET3V0cHV0LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1BJRE91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTJjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1BJRE91dHB1dC5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQmFzZS5oIgorCisvKioKKyAqIFBJRE91dHB1dCBpbnRlcmZhY2UgaXMgYSBnZW5lcmljIG91dHB1dCBmb3IgdGhlIFBJRCBjbGFzcy4KKyAqIFBXTXMgdXNlIHRoaXMgY2xhc3MuCisgKiBVc2VycyBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gYWxsb3cgZm9yIGEgUElEQ29udHJvbGxlciB0byAKKyAqIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgaW5wdXRzCisgKi8KK2NsYXNzIFBJRE91dHB1dAoreworcHVibGljOgorCXZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpID0gMDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1BJRFNvdXJjZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9QSURTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODFiZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9QSURTb3VyY2UuaApAQCAtMCwwICsxLDE4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworLyoqCisgKiBQSURTb3VyY2UgaW50ZXJmYWNlIGlzIGEgZ2VuZXJpYyBzZW5zb3Igc291cmNlIGZvciB0aGUgUElEIGNsYXNzLgorICogQWxsIHNlbnNvcnMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBQSUQgY2xhc3Mgd2lsbCBpbXBsZW1lbnQgdGhlIFBJRFNvdXJjZSB0aGF0CisgKiByZXR1cm5zIGEgc3RhbmRhcmQgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIFBJRCBjb2RlLgorICovCitjbGFzcyBQSURTb3VyY2UKK3sJCitwdWJsaWM6CisJZW51bSBQSURTb3VyY2VQYXJhbWV0ZXIge2tEaXN0YW5jZSwga1JhdGUsIGtBbmdsZX07CisJdmlydHVhbCBkb3VibGUgUElER2V0KCkgPSAwOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvUmVzb3VyY2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvUmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI5NDI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9SZXNvdXJjZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAiSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwIgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIFRoZSBSZXNvdXJjZSBjbGFzcyBpcyBhIGNvbnZlbmllbnQgd2F5IHRvIHRyYWNrIGFsbG9jYXRlZCByZXNvdXJjZXMuCisgKiBJdCB0cmFja3MgdGhlbSBhcyBpbmRpY2llcyBpbiB0aGUgcmFuZ2UgWzAgLi4gZWxlbWVudHMgLSAxXS4KKyAqIEUuZy4gdGhlIGxpYnJhcnkgdXNlcyB0aGlzIHRvIHRyYWNrIGhhcmR3YXJlIGNoYW5uZWwgYWxsb2NhdGlvbi4KKyAqCisgKiBUaGUgUmVzb3VyY2UgY2xhc3MgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGhhcmR3YXJlIGNoYW5uZWxzIG9yIG90aGVyCisgKiByZXNvdXJjZXM7IGl0IGp1c3QgdHJhY2tzIHdoaWNoIGluZGljZXMgd2VyZSBtYXJrZWQgaW4gdXNlIGJ5CisgKiBBbGxvY2F0ZSBhbmQgbm90IHlldCBmcmVlZCBieSBGcmVlLgorICovCitjbGFzcyBSZXNvdXJjZSA6IHB1YmxpYyBFcnJvckJhc2UKK3sKK3B1YmxpYzoKKwl2aXJ0dWFsIH5SZXNvdXJjZSgpOworCXN0YXRpYyB2b2lkIENyZWF0ZVJlc291cmNlT2JqZWN0KFJlc291cmNlICoqciwgdWludDMyX3QgZWxlbWVudHMpOworCXVpbnQzMl90IEFsbG9jYXRlKGNvbnN0IGNoYXIgKnJlc291cmNlRGVzYyk7CisJdWludDMyX3QgQWxsb2NhdGUodWludDMyX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnJlc291cmNlRGVzYyk7CisJdm9pZCBGcmVlKHVpbnQzMl90IGluZGV4KTsKKworcHJpdmF0ZToKKwlleHBsaWNpdCBSZXNvdXJjZSh1aW50MzJfdCBzaXplKTsKKworCWJvb2wgKm1faXNBbGxvY2F0ZWQ7CisJUmVlbnRyYW50TXV0ZXggbV9hbGxvY2F0ZUxvY2s7CisJdWludDMyX3QgbV9zaXplOworCisJc3RhdGljIFJlZW50cmFudE11dGV4IG1fY3JlYXRlTG9jazsKKworCURJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihSZXNvdXJjZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9Sb2JvdFN0YXRlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1JvYm90U3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI1NDkzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9Sb2JvdFN0YXRlLmgKQEAgLTAsMCArMSwzMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworY2xhc3MgUm9ib3RTdGF0ZUludGVyZmFjZQoreworcHVibGljOgorCXZpcnR1YWwgflJvYm90U3RhdGVJbnRlcmZhY2UoKSB7fTsKKyAgICB2aXJ0dWFsIGJvb2wgSXNEaXNhYmxlZCgpID0gMDsKKwl2aXJ0dWFsIGJvb2wgSXNFbmFibGVkKCkgPSAwOworCXZpcnR1YWwgYm9vbCBJc09wZXJhdG9yQ29udHJvbCgpID0gMDsKKwl2aXJ0dWFsIGJvb2wgSXNBdXRvbm9tb3VzKCkgPSAwOworCXZpcnR1YWwgYm9vbCBJc1Rlc3QoKSA9IDA7Cit9OworCitjbGFzcyBSb2JvdFN0YXRlCit7Citwcml2YXRlOgorCXN0YXRpYyBSb2JvdFN0YXRlSW50ZXJmYWNlKiBpbXBsOworCQorcHVibGljOgorCXN0YXRpYyB2b2lkIFNldEltcGxlbWVudGF0aW9uKFJvYm90U3RhdGVJbnRlcmZhY2UqIGkpOworICAgIHN0YXRpYyBib29sIElzRGlzYWJsZWQoKTsKKwlzdGF0aWMgYm9vbCBJc0VuYWJsZWQoKTsKKwlzdGF0aWMgYm9vbCBJc09wZXJhdG9yQ29udHJvbCgpOworCXN0YXRpYyBib29sIElzQXV0b25vbW91cygpOworCXN0YXRpYyBib29sIElzVGVzdCgpOworfTsKKworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1NlbnNvckJhc2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvU2Vuc29yQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTE2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1NlbnNvckJhc2UuaApAQCAtMCwwICsxLDYzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiQmFzZS5oIgorCitjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFsbCBzZW5zb3JzLgorICogU3RvcmVzIG1vc3QgcmVjZW50IHN0YXR1cyBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIGNvbnRhaW5pbmcgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNoZWNraW5nCisgKiBjaGFubmVscyBhbmQgZXJyb3IgcHJvY2Vzc2luZy4KKyAqLworY2xhc3MgU2Vuc29yQmFzZSA6IHB1YmxpYyBFcnJvckJhc2UKK3sKK3B1YmxpYzoKKwlTZW5zb3JCYXNlKCk7CisJdmlydHVhbCB+U2Vuc29yQmFzZSgpOworCXN0YXRpYyB2b2lkIERlbGV0ZVNpbmdsZXRvbnMoKTsKKworCXN0YXRpYyB1aW50MzJfdCBHZXREZWZhdWx0U29sZW5vaWRNb2R1bGUoKQorCXsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RhdGljIGJvb2wgQ2hlY2tTb2xlbm9pZE1vZHVsZSh1aW50OF90IG1vZHVsZU51bWJlcik7CisJc3RhdGljIGJvb2wgQ2hlY2tEaWdpdGFsQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKKwlzdGF0aWMgYm9vbCBDaGVja1JlbGF5Q2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKKwlzdGF0aWMgYm9vbCBDaGVja1BXTUNoYW5uZWwodWludDMyX3QgY2hhbm5lbCk7CisJc3RhdGljIGJvb2wgQ2hlY2tBbmFsb2dJbnB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwlzdGF0aWMgYm9vbCBDaGVja0FuYWxvZ091dHB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwlzdGF0aWMgYm9vbCBDaGVja1NvbGVub2lkQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKKwlzdGF0aWMgYm9vbCBDaGVja1BEUENoYW5uZWwodWludDMyX3QgY2hhbm5lbCk7CisKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0RpZ2l0YWxDaGFubmVscyA9IDI2OworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQW5hbG9nSW5wdXRzID0gODsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0FuYWxvZ091dHB1dHMgPSAyOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrU29sZW5vaWRDaGFubmVscyA9IDg7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTb2xlbm9pZE1vZHVsZXMgPSAyOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrUHdtQ2hhbm5lbHMgPSAyMDsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga1JlbGF5Q2hhbm5lbHMgPSA4OworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrUERQQ2hhbm5lbHMgPSAxNjsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0NoYXNzaXNTbG90cyA9IDg7CisKK3Byb3RlY3RlZDoKKwl2b2lkIEFkZFRvU2luZ2xldG9uTGlzdCgpOworCisJc3RhdGljIHZvaWQqIG1fZGlnaXRhbF9wb3J0c1trRGlnaXRhbENoYW5uZWxzXTsKKwlzdGF0aWMgdm9pZCogbV9yZWxheV9wb3J0c1trUmVsYXlDaGFubmVsc107CisJc3RhdGljIHZvaWQqIG1fcHdtX3BvcnRzW2tQd21DaGFubmVsc107CisKK3ByaXZhdGU6CisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlbnNvckJhc2UpOworCXN0YXRpYyBTZW5zb3JCYXNlICptX3NpbmdsZXRvbkxpc3Q7CisJU2Vuc29yQmFzZSAqbV9uZXh0U2luZ2xldG9uOworCisgIGZyaWVuZCBjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvVGFzay5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9UYXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExNzU0YQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvVGFzay5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAiSEFML1Rhc2suaHBwIgorCisvKioKKyAqIFdQSSB0YXNrIGlzIGEgd3JhcHBlciBmb3IgdGhlIG5hdGl2ZSBUYXNrIG9iamVjdC4KKyAqIEFsbCBXUElMaWIgdGFza3MgYXJlIG1hbmFnZWQgYnkgYSBzdGF0aWMgdGFzayBtYW5hZ2VyIGZvciBzaW1wbGlmaWVkIGNsZWFudXAuCisgKiovCitjbGFzcyBUYXNrIDogcHVibGljIEVycm9yQmFzZQoreworcHVibGljOgorCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFByaW9yaXR5ID0gMTAxOworCisJVGFzayhjb25zdCBjaGFyKiBuYW1lLCBGVU5DUFRSIGZ1bmN0aW9uLCBpbnQzMl90IHByaW9yaXR5ID0ga0RlZmF1bHRQcmlvcml0eSwKKwkJCXVpbnQzMl90IHN0YWNrU2l6ZSA9IDIwMDAwKTsKKwl2aXJ0dWFsIH5UYXNrKCk7CisKKwlib29sIFN0YXJ0KHVpbnQzMl90IGFyZzAgPSAwLCB1aW50MzJfdCBhcmcxID0gMCwgdWludDMyX3QgYXJnMiA9IDAsIHVpbnQzMl90IGFyZzMgPSAwLAorCQkJdWludDMyX3QgYXJnNCA9IDAsIHVpbnQzMl90IGFyZzUgPSAwLCB1aW50MzJfdCBhcmc2ID0gMCwgdWludDMyX3QgYXJnNyA9IDAsCisJCQl1aW50MzJfdCBhcmc4ID0gMCwgdWludDMyX3QgYXJnOSA9IDApOworCWJvb2wgUmVzdGFydCgpOworCWJvb2wgU3RvcCgpOworCisJYm9vbCBJc1JlYWR5KCk7CisJYm9vbCBJc1N1c3BlbmRlZCgpOworCisJYm9vbCBTdXNwZW5kKCk7CisJYm9vbCBSZXN1bWUoKTsKKworCWJvb2wgVmVyaWZ5KCk7CisKKwlpbnQzMl90IEdldFByaW9yaXR5KCk7CisJYm9vbCBTZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KTsKKwljb25zdCBjaGFyKiBHZXROYW1lKCk7CisJVEFTSyBHZXRJRCgpOworCitwcml2YXRlOgorCUZVTkNQVFIgbV9mdW5jdGlvbjsKKwljaGFyKiBtX3Rhc2tOYW1lOworCVRBU0sgbV90YXNrSUQ7CisJdWludDMyX3QgbV9zdGFja1NpemU7CisJaW50IG1fcHJpb3JpdHk7CisJYm9vbCBIYW5kbGVFcnJvcihTVEFUVVMgcmVzdWx0cyk7CisJRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRhc2spOworfTsKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9UaW1lci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9UaW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjM2Y5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL1RpbWVyLmgKQEAgLTAsMCArMSw0OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvY3BwL1N5bmNocm9uaXplZC5ocHAiCisjaW5jbHVkZSAiQmFzZS5oIgorCit0eXBlZGVmIHZvaWQgKCpUaW1lckludGVycnVwdEhhbmRsZXIpKHZvaWQgKnBhcmFtKTsKKwordm9pZCBXYWl0KGRvdWJsZSBzZWNvbmRzKTsKK2RvdWJsZSBHZXRDbG9jaygpOworZG91YmxlIEdldFRpbWUoKTsKKworLyoqCisgKiBUaW1lciBvYmplY3RzIG1lYXN1cmUgYWNjdW11bGF0ZWQgdGltZSBpbiBzZWNvbmRzLgorICogVGhlIHRpbWVyIG9iamVjdCBmdW5jdGlvbnMgbGlrZSBhIHN0b3B3YXRjaC4gSXQgY2FuIGJlIHN0YXJ0ZWQsIHN0b3BwZWQsIGFuZCBjbGVhcmVkLiBXaGVuIHRoZQorICogdGltZXIgaXMgcnVubmluZyBpdHMgdmFsdWUgY291bnRzIHVwIGluIHNlY29uZHMuIFdoZW4gc3RvcHBlZCwgdGhlIHRpbWVyIGhvbGRzIHRoZSBjdXJyZW50CisgKiB2YWx1ZS4gVGhlIGltcGxlbWVudGF0aW9uIHNpbXBseSByZWNvcmRzIHRoZSB0aW1lIHdoZW4gc3RhcnRlZCBhbmQgc3VidHJhY3RzIHRoZSBjdXJyZW50IHRpbWUKKyAqIHdoZW5ldmVyIHRoZSB2YWx1ZSBpcyByZXF1ZXN0ZWQuCisgKi8KK2NsYXNzIFRpbWVyCit7CitwdWJsaWM6CisJVGltZXIoKTsKKwl2aXJ0dWFsIH5UaW1lcigpOworCWRvdWJsZSBHZXQoKTsKKwl2b2lkIFJlc2V0KCk7CisJdm9pZCBTdGFydCgpOworCXZvaWQgU3RvcCgpOworCWJvb2wgSGFzUGVyaW9kUGFzc2VkKGRvdWJsZSBwZXJpb2QpOworCisJc3RhdGljIGRvdWJsZSBHZXRGUEdBVGltZXN0YW1wKCk7CisJc3RhdGljIGRvdWJsZSBHZXRQUENUaW1lc3RhbXAoKTsKKyAgICBzdGF0aWMgZG91YmxlIEdldE1hdGNoVGltZSgpOworCQorCS8vIFRoZSB0aW1lLCBpbiBzZWNvbmRzLCBhdCB3aGljaCB0aGUgMzItYml0IEZQR0EgdGltZXN0YW1wIHJvbGxzIG92ZXIgdG8gMAorCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtSb2xsb3ZlclRpbWUgPSAoMWxsIDw8IDMyKSAvIDFlNjsKKworcHJpdmF0ZToKKwlkb3VibGUgbV9zdGFydFRpbWU7CisJZG91YmxlIG1fYWNjdW11bGF0ZWRUaW1lOworCWJvb2wgbV9ydW5uaW5nOworCU11dGV4IG1fbG9jazsKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oVGltZXIpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvVXRpbGl0eS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9VdGlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4MTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvVXRpbGl0eS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworLyoqIEBmaWxlCisgKiBDb250YWlucyBnbG9iYWwgdXRpbGl0eSBmdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjZGVmaW5lIHdwaV9hc3NlcnQoY29uZGl0aW9uKSB3cGlfYXNzZXJ0X2ltcGwoY29uZGl0aW9uLCAjY29uZGl0aW9uLCBOVUxMLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgd3BpX2Fzc2VydFdpdGhNZXNzYWdlKGNvbmRpdGlvbiwgbWVzc2FnZSkgd3BpX2Fzc2VydF9pbXBsKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisKKyNkZWZpbmUgd3BpX2Fzc2VydEVxdWFsKGEsIGIpIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgTlVMTCwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIHdwaV9hc3NlcnRFcXVhbFdpdGhNZXNzYWdlKGEsIGIsIG1lc3NhZ2UpIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisKKyNkZWZpbmUgd3BpX2Fzc2VydE5vdEVxdWFsKGEsIGIpIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgTlVMTCwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIHdwaV9hc3NlcnROb3RFcXVhbFdpdGhNZXNzYWdlKGEsIGIsIG1lc3NhZ2UpIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisKK2Jvb2wgd3BpX2Fzc2VydF9pbXBsKGJvb2wgY29uZGl0aW9uVmFsdWUsIGNvbnN0IGNoYXIgKmNvbmRpdGlvblRleHQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKmZpbGVOYW1lLCB1aW50MzJfdCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpmdW5jTmFtZSk7Citib29sIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLCBjb25zdCBjaGFyICptZXNzYWdlLCBjb25zdCBjaGFyICpmaWxlTmFtZSx1aW50MzJfdCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpmdW5jTmFtZSk7Citib29sIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLCBjb25zdCBjaGFyICptZXNzYWdlLCBjb25zdCBjaGFyICpmaWxlTmFtZSx1aW50MzJfdCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpmdW5jTmFtZSk7CisKK3ZvaWQgd3BpX3N1c3BlbmRPbkFzc2VydEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwordWludDE2X3QgR2V0RlBHQVZlcnNpb24oKTsKK3VpbnQzMl90IEdldEZQR0FSZXZpc2lvbigpOwordWludDMyX3QgR2V0RlBHQVRpbWUoKTsKK2Jvb2wgR2V0VXNlckJ1dHRvbigpOworc3RkOjpzdHJpbmcgR2V0U3RhY2tUcmFjZSh1aW50MzJfdCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9XUElFcnJvcnMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvV1BJRXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzNzcxNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvV1BJRXJyb3JzLmgKQEAgLTAsMCArMSw3OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBXUElfRVJST1JTX0RFRklORV9TVFJJTkdTCisjZGVmaW5lIFMobGFiZWwsIG9mZnNldCwgbWVzc2FnZSkgY29uc3QgY2hhciAqd3BpX2Vycm9yX3NfIyNsYWJlbCA9IG1lc3NhZ2UgOyBcCisJY29uc3QgaW50MzJfdCB3cGlfZXJyb3JfdmFsdWVfIyNsYWJlbCA9IG9mZnNldAorI2Vsc2UKKyNkZWZpbmUgUyhsYWJlbCwgb2Zmc2V0LCBtZXNzYWdlKSBleHRlcm4gY29uc3QgY2hhciAqd3BpX2Vycm9yX3NfIyNsYWJlbCA7IFwKKwljb25zdCBpbnQzMl90IHdwaV9lcnJvcl92YWx1ZV8jI2xhYmVsID0gb2Zmc2V0CisjZW5kaWYKKworLyoKKyAqIEZhdGFsIGVycm9ycworICovCitTKE1vZHVsZUluZGV4T3V0T2ZSYW5nZSwgLTEsICJBbGxvY2F0aW5nIG1vZHVsZSB0aGF0IGlzIG91dCBvZiByYW5nZSBvciBub3QgZm91bmQiKTsKK1MoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgLTEsICJBbGxvY2F0aW5nIGNoYW5uZWwgdGhhdCBpcyBvdXQgb2YgcmFuZ2UiKTsKK1MoTm90QWxsb2NhdGVkLCAtMiwgIkF0dGVtcHRpbmcgdG8gZnJlZSB1bmFsbG9jYXRlZCByZXNvdXJjZSIpOworUyhSZXNvdXJjZUFscmVhZHlBbGxvY2F0ZWQsIC0zLCAiQXR0ZW1wdGVkIHRvIHJldXNlIGFuIGFsbG9jYXRlZCByZXNvdXJjZSIpOworUyhOb0F2YWlsYWJsZVJlc291cmNlcywgLTQsICJObyBhdmFpbGFibGUgcmVzb3VyY2VzIHRvIGFsbG9jYXRlIik7CitTKE51bGxQYXJhbWV0ZXIsIC01LCAiQSBwb2ludGVyIHBhcmFtZXRlciB0byBhIG1ldGhvZCBpcyBOVUxMIik7CitTKFRpbWVvdXQsIC02LCAiQSB0aW1lb3V0IGhhcyBiZWVuIGV4Y2VlZGVkIik7CitTKENvbXBhc3NNYW51ZmFjdHVyZXJFcnJvciwgLTcsICJDb21wYXNzIG1hbnVmYWN0dXJlciBkb2Vzbid0IG1hdGNoIEhpVGVjaG5pYyIpOworUyhDb21wYXNzVHlwZUVycm9yLCAtOCwgIkNvbXBhc3MgdHlwZSBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIHR5cGUgZm9yIEhpVGVjaG5pYyBjb21wYXNzIik7CitTKEluY29tcGF0aWJsZU1vZGUsIC05LCAiVGhlIG9iamVjdCBpcyBpbiBhbiBpbmNvbXBhdGlibGUgbW9kZSIpOworUyhBbmFsb2dUcmlnZ2VyTGltaXRPcmRlckVycm9yLCAtMTAsICJBbmFsb2dUcmlnZ2VyIGxpbWl0cyBlcnJvci4gIExvd2VyIGxpbWl0ID4gVXBwZXIgTGltaXQiKTsKK1MoQW5hbG9nVHJpZ2dlclB1bHNlT3V0cHV0RXJyb3IsIC0xMSwgIkF0dGVtcHRlZCB0byByZWFkIEFuYWxvZ1RyaWdnZXIgcHVsc2Ugb3V0cHV0LiIpOworUyhUYXNrRXJyb3IsIC0xMiwgIlRhc2sgY2FuJ3QgYmUgc3RhcnRlZCIpOworUyhUYXNrSURFcnJvciwgLTEzLCAiVGFzayBlcnJvcjogSW52YWxpZCBJRC4iKTsKK1MoVGFza0RlbGV0ZWRFcnJvciwgLTE0LCAiVGFzayBlcnJvcjogVGFzayBhbHJlYWR5IGRlbGV0ZWQuIik7CitTKFRhc2tPcHRpb25zRXJyb3IsIC0xNSwgIlRhc2sgZXJyb3I6IEludmFsaWQgb3B0aW9ucy4iKTsKK1MoVGFza01lbW9yeUVycm9yLCAtMTYsICJUYXNrIGNhbid0IGJlIHN0YXJ0ZWQgZHVlIHRvIGluc3VmZmljaWVudCBtZW1vcnkuIik7CitTKFRhc2tQcmlvcml0eUVycm9yLCAtMTcsICJUYXNrIGVycm9yOiBJbnZhbGlkIHByaW9yaXR5IFsxLTI1NV0uIik7CitTKERyaXZlVW5pbml0aWFsaXplZCwgLTE4LCAiUm9ib3REcml2ZSBub3QgaW5pdGlhbGl6ZWQgZm9yIHRoZSBDIGludGVyZmFjZSIpOworUyhDb21wcmVzc29yTm9uTWF0Y2hpbmcsIC0xOSwgIkNvbXByZXNzb3Igc2xvdC9jaGFubmVsIGRvZXNuJ3QgbWF0Y2ggcHJldmlvdXMgaW5zdGFuY2UiKTsKK1MoQ29tcHJlc3NvckFscmVhZHlEZWZpbmVkLCAtMjAsICJDcmVhdGluZyBhIHNlY29uZCBjb21wcmVzc29yIGluc3RhbmNlIik7CitTKENvbXByZXNzb3JVbmRlZmluZWQsIC0yMSwgIlVzaW5nIGNvbXByZXNzb3IgZnVuY3Rpb25zIHdpdGhvdXQgZGVmaW5pbmcgY29tcHJlc3NvciIpOworUyhJbmNvbnNpc3RlbnRBcnJheVZhbHVlQWRkZWQsIC0yMiwgIldoZW4gcGFja2luZyBkYXRhIGludG8gYW4gYXJyYXkgdG8gdGhlIGRhc2hib2FyZCwgbm90IGFsbCB2YWx1ZXMgYWRkZWQgd2VyZSBvZiB0aGUgc2FtZSB0eXBlLiIpOworUyhNaXNtYXRjaGVkQ29tcGxleFR5cGVDbG9zZSwgLTIzLCAiV2hlbiBwYWNraW5nIGRhdGEgdG8gdGhlIGRhc2hib2FyZCwgYSBDbG9zZSBmb3IgYSBjb21wbGV4IHR5cGUgd2FzIGNhbGxlZCB3aXRob3V0IGEgbWF0Y2hpbmcgT3Blbi4iKTsKK1MoRGFzaGJvYXJkRGF0YU92ZXJmbG93LCAtMjQsICJXaGVuIHBhY2tpbmcgZGF0YSB0byB0aGUgZGFzaGJvYXJkLCB0b28gbXVjaCBkYXRhIHdhcyBwYWNrZWQgYW5kIHRoZSBidWZmZXIgb3ZlcmZsb3dlZC4iKTsKK1MoRGFzaGJvYXJkRGF0YUNvbGxpc2lvbiwgLTI1LCAiVGhlIHNhbWUgYnVmZmVyIHdhcyB1c2VkIGZvciBwYWNraW5nIGRhdGEgYW5kIGZvciBwcmludGluZy4iKTsKK1MoRW5oYW5jZWRJT01pc3NpbmcsIC0yNiwgIklPIGlzIG5vdCBhdHRhY2hlZCBvciBFbmhhbmNlZCBJTyBpcyBub3QgZW5hYmxlZC4iKTsKK1MoTGluZU5vdE91dHB1dCwgLTI3LCAiQ2Fubm90IFNldERpZ2l0YWxPdXRwdXQgZm9yIGEgbGluZSBub3QgY29uZmlndXJlZCBmb3Igb3V0cHV0LiIpOworUyhQYXJhbWV0ZXJPdXRPZlJhbmdlLCAtMjgsICJBIHBhcmFtZXRlciBpcyBvdXQgb2YgcmFuZ2UuIik7CitTKFNQSUNsb2NrUmF0ZVRvb0xvdywgLTI5LCAiU1BJIGNsb2NrIHJhdGUgd2FzIGJlbG93IHRoZSBtaW5pbXVtIHN1cHBvcnRlZCIpOworUyhKYWd1YXJWZXJzaW9uRXJyb3IsIC0zMCwgIkphZ3VhciBmaXJtd2FyZSB2ZXJzaW9uIGVycm9yIik7CitTKEphZ3Vhck1lc3NhZ2VOb3RGb3VuZCwgLTMxLCAiSmFndWFyIG1lc3NhZ2Ugbm90IGZvdW5kIik7CitTKE5ldHdvcmtUYWJsZXNSZWFkRXJyb3IsIC00MCwgIkVycm9yIHJlYWRpbmcgTmV0d29ya1RhYmxlcyBzb2NrZXQiKTsKK1MoTmV0d29ya1RhYmxlc0J1ZmZlckZ1bGwsIC00MSwgIkJ1ZmZlciBmdWxsIHdyaXRpbmcgdG8gTmV0d29ya1RhYmxlcyBzb2NrZXQiKTsKK1MoTmV0d29ya1RhYmxlc1dyb25nVHlwZSwgLTQyLCAiVGhlIHdyb25nIHR5cGUgd2FzIHJlYWQgZnJvbSB0aGUgTmV0d29ya1RhYmxlcyBlbnRyeSIpOworUyhOZXR3b3JrVGFibGVzQ29ycnVwdCwgLTQzLCAiTmV0d29ya1RhYmxlcyBkYXRhIHN0cmVhbSBpcyBjb3JydXB0Iik7CitTKFNtYXJ0RGFzaGJvYXJkTWlzc2luZ0tleSwgLTQzLCAiU21hcnREYXNoYm9hcmQgZGF0YSBkb2VzIG5vdCBleGlzdCIpOworUyhDb21tYW5kSWxsZWdhbFVzZSwgLTUwLCAiSWxsZWdhbCB1c2Ugb2YgQ29tbWFuZCIpOworUyhVbnN1cHBvcnRlZEluU2ltdWxhdGlvbiwgLTgwLCAiVW5zdXBwb3J0ZWQgaW4gc2ltdWxhdGlvbiIpOworCisvKgorICogV2FybmluZ3MKKyAqLworUyhTYW1wbGVSYXRlVG9vSGlnaCwgMSwgIkFuYWxvZyBtb2R1bGUgc2FtcGxlIHJhdGUgaXMgdG9vIGhpZ2giKTsKK1MoVm9sdGFnZU91dE9mUmFuZ2UsIDIsICJWb2x0YWdlIHRvIGNvbnZlcnQgdG8gcmF3IHZhbHVlIGlzIG91dCBvZiByYW5nZSBbLTEwOyAxMF0iKTsKK1MoQ29tcHJlc3NvclRhc2tFcnJvciwgMywgIkNvbXByZXNzb3IgdGFzayB3b24ndCBzdGFydCIpOworUyhMb29wVGltaW5nRXJyb3IsIDQsICJEaWdpdGFsIG1vZHVsZSBsb29wIHRpbWluZyBpcyBub3QgdGhlIGV4cGVjdGVkIHZhbHVlIik7CitTKE5vbkJpbmFyeURpZ2l0YWxWYWx1ZSwgNSwgIkRpZ2l0YWwgb3V0cHV0IHZhbHVlIGlzIG5vdCAwIG9yIDEiKTsKK1MoSW5jb3JyZWN0QmF0dGVyeUNoYW5uZWwsIDYsICJCYXR0ZXJ5IG1lYXN1cmVtZW50IGNoYW5uZWwgaXMgbm90IGNvcnJlY3QgdmFsdWUiKTsKK1MoQmFkSm95c3RpY2tJbmRleCwgNywgIkpveXN0aWNrIGluZGV4IGlzIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtMyIpOworUyhCYWRKb3lzdGlja0F4aXMsIDgsICJKb3lzdGljayBheGlzIG9yIFBPViBpcyBvdXQgb2YgcmFuZ2UiKTsKK1MoSW52YWxpZE1vdG9ySW5kZXgsIDksICJNb3RvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTMiKTsKK1MoRHJpdmVyU3RhdGlvblRhc2tFcnJvciwgMTAsICJEcml2ZXIgU3RhdGlvbiB0YXNrIHdvbid0IHN0YXJ0Iik7CitTKEVuaGFuY2VkSU9QV01QZXJpb2RPdXRPZlJhbmdlLCAxMSwgIkRyaXZlciBTdGF0aW9uIEVuaGFuY2VkIElPIFBXTSBPdXRwdXQgcGVyaW9kIG91dCBvZiByYW5nZS4iKTsKK1MoU1BJV3JpdGVOb01PU0ksIDEyLCAiQ2Fubm90IHdyaXRlIHRvIFNQSSBwb3J0IHdpdGggbm8gTU9TSSBvdXRwdXQiKTsKK1MoU1BJUmVhZE5vTUlTTywgMTMsICJDYW5ub3QgcmVhZCBmcm9tIFNQSSBwb3J0IHdpdGggbm8gTUlTTyBpbnB1dCIpOworUyhTUElSZWFkTm9EYXRhLCAxNCwgIk5vIGRhdGEgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSBTUEkiKTsKK1MoSW5jb21wYXRpYmxlU3RhdGUsIDE1LCAiSW5jb21wYXRpYmxlIFN0YXRlOiBUaGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQiKTsKKworI3VuZGVmIFMKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL2luY2x1ZGUvaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWU5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKy8qKgorICogSW50ZXJmYWNlIGZvciAzLWF4aXMgYWNjZWxlcm9tZXRlcnMKKyAqLworY2xhc3MgQWNjZWxlcm9tZXRlcgoreworcHVibGljOgorCXZpcnR1YWwgfkFjY2VsZXJvbWV0ZXIoKSB7fTsKKworCWVudW0gUmFuZ2UKKwl7CisJCWtSYW5nZV8yRyA9IDAsCisJCWtSYW5nZV80RyA9IDEsCisJCWtSYW5nZV84RyA9IDIsCisJCWtSYW5nZV8xNkcgPSAzCisJfTsKKworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHNldHRpbmcgdGhlIG1lYXN1cmluZyByYW5nZSBvZiBhbiBhY2NlbGVyb21ldGVyLgorCSAqCisJICogQHBhcmFtIHJhbmdlIFRoZSBtYXhpbXVtIGFjY2VsZXJhdGlvbiwgcG9zaXRpdmUgb3IgbmVnYXRpdmUsIHRoYXQgdGhlCisJICogYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUuICBOb3QgYWxsIGFjY2VsZXJvbWV0ZXJzIHN1cHBvcnQgYWxsIHJhbmdlcy4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpID0gMDsKKworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIHggYXhpcyBhY2NlbGVyYXRpb24KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeCBheGlzIGluIGctZm9yY2VzCisJICovCisJdmlydHVhbCBkb3VibGUgR2V0WCgpID0gMDsKKworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIHkgYXhpcyBhY2NlbGVyYXRpb24KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeSBheGlzIGluIGctZm9yY2VzCisJICovCisJdmlydHVhbCBkb3VibGUgR2V0WSgpID0gMDsKKworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIHogYXhpcyBhY2NlbGVyYXRpb24KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeiBheGlzIGluIGctZm9yY2VzCisJICovCisJdmlydHVhbCBkb3VibGUgR2V0WigpID0gMDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9pbmNsdWRlL2ludGVyZmFjZXMvUG90ZW50aW9tZXRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWY0NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvaW5jbHVkZS9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaApAQCAtMCwwICsxLDI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSU5URVJGQUNFU19QT1RFTlRJT01FVEVSX0gKKyNkZWZpbmUgSU5URVJGQUNFU19QT1RFTlRJT01FVEVSX0gKKworI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorCisvKioKKyAqIEludGVyZmFjZSBmb3IgcG90ZW50aW9tZXRlcnMuCisgKi8KK2NsYXNzIFBvdGVudGlvbWV0ZXIgOiBwdWJsaWMgUElEU291cmNlCit7CitwdWJsaWM6CisJdmlydHVhbCB+UG90ZW50aW9tZXRlcigpIHt9OworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBwb3RlbnRpb21ldGVyLgorCSAqIAorCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IHNwZWVkLiAgVmFsdWUgaXMgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisJICovCisJdmlydHVhbCBkb3VibGUgR2V0KCkgPSAwOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvRXJyb3IuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvc3JjL0Vycm9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRjNGZlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvc3JjL0Vycm9yLmNwcApAQCAtMCwwICsxLDExMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiRXJyb3IuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgIkhBTC9UYXNrLmhwcCIKKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKK2Jvb2wgRXJyb3I6Om1fc3VzcGVuZE9uRXJyb3JFbmFibGVkID0gZmFsc2U7CisKK0Vycm9yOjpFcnJvcigpCisJOiBtX2NvZGUoMCkKKwksIG1fbGluZU51bWJlcigwKQorCSwgbV9vcmlnaW5hdGluZ09iamVjdChOVUxMKQorCSwgbV90aW1lc3RhbXAgKDAuMCkKK3t9CisKK0Vycm9yOjp+RXJyb3IoKQore30KKwordm9pZCBFcnJvcjo6Q2xvbmUoRXJyb3IgJmVycm9yKQoreworCW1fY29kZSA9IGVycm9yLm1fY29kZTsKKwltX21lc3NhZ2UgPSBlcnJvci5tX21lc3NhZ2U7CisJbV9maWxlbmFtZSA9IGVycm9yLm1fZmlsZW5hbWU7CisJbV9mdW5jdGlvbiA9IGVycm9yLm1fZnVuY3Rpb247CisJbV9saW5lTnVtYmVyID0gZXJyb3IubV9saW5lTnVtYmVyOworCW1fb3JpZ2luYXRpbmdPYmplY3QgPSBlcnJvci5tX29yaWdpbmF0aW5nT2JqZWN0OworCW1fdGltZXN0YW1wID0gZXJyb3IubV90aW1lc3RhbXA7Cit9CisKK0Vycm9yOjpDb2RlIEVycm9yOjpHZXRDb2RlKCkgY29uc3QKK3sJcmV0dXJuIG1fY29kZTsgIH0KKworY29uc3QgY2hhciAqIEVycm9yOjpHZXRNZXNzYWdlKCkgY29uc3QKK3sJcmV0dXJuIG1fbWVzc2FnZS5jX3N0cigpOyAgfQorCitjb25zdCBjaGFyICogRXJyb3I6OkdldEZpbGVuYW1lKCkgY29uc3QKK3sJcmV0dXJuIG1fZmlsZW5hbWUuY19zdHIoKTsgIH0KKworY29uc3QgY2hhciAqIEVycm9yOjpHZXRGdW5jdGlvbigpIGNvbnN0Cit7CXJldHVybiBtX2Z1bmN0aW9uLmNfc3RyKCk7ICB9CisKK3VpbnQzMl90IEVycm9yOjpHZXRMaW5lTnVtYmVyKCkgY29uc3QKK3sJcmV0dXJuIG1fbGluZU51bWJlcjsgIH0KKworY29uc3QgRXJyb3JCYXNlKiBFcnJvcjo6R2V0T3JpZ2luYXRpbmdPYmplY3QoKSBjb25zdAorewlyZXR1cm4gbV9vcmlnaW5hdGluZ09iamVjdDsgIH0KKworZG91YmxlIEVycm9yOjpHZXRUaW1lc3RhbXAoKSBjb25zdAorewlyZXR1cm4gbV90aW1lc3RhbXA7ICB9CisKK3ZvaWQgRXJyb3I6OlNldChDb2RlIGNvZGUsIGNvbnN0IGNoYXIqIGNvbnRleHRNZXNzYWdlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIsIGNvbnN0IEVycm9yQmFzZSogb3JpZ2luYXRpbmdPYmplY3QpCit7CisJYm9vbCByZXBvcnQgPSB0cnVlOworCisJaWYoY29kZSA9PSBtX2NvZGUgJiYgR2V0VGltZSgpIC0gbV90aW1lc3RhbXAgPCAxKQorCXsKKwkJcmVwb3J0ID0gZmFsc2U7CisJfQorCisJbV9jb2RlID0gY29kZTsKKwltX21lc3NhZ2UgPSBjb250ZXh0TWVzc2FnZTsKKwltX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisJbV9mdW5jdGlvbiA9IGZ1bmN0aW9uOworCW1fbGluZU51bWJlciA9IGxpbmVOdW1iZXI7CisJbV9vcmlnaW5hdGluZ09iamVjdCA9IG9yaWdpbmF0aW5nT2JqZWN0OworCisJaWYocmVwb3J0KQorCXsKKwkJbV90aW1lc3RhbXAgPSBHZXRUaW1lKCk7CisJCVJlcG9ydCgpOworCX0KKworICAgIGlmIChtX3N1c3BlbmRPbkVycm9yRW5hYmxlZCkgc3VzcGVuZFRhc2soMCk7Cit9CisKK3ZvaWQgRXJyb3I6OlJlcG9ydCgpCit7CisJc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3JTdHJlYW07CisKKwllcnJvclN0cmVhbSA8PCAiRXJyb3Igb24gbGluZSAiIDw8IG1fbGluZU51bWJlciA8PCAiICI7CisJZXJyb3JTdHJlYW0gPDwgIm9mICI8PCBiYXNlbmFtZShtX2ZpbGVuYW1lLmNfc3RyKCkpIDw8ICI6ICI7CisJZXJyb3JTdHJlYW0gPDwgbV9tZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKwllcnJvclN0cmVhbSA8PCBHZXRTdGFja1RyYWNlKDQpOworCisJc3RkOjpzdHJpbmcgZXJyb3IgPSBlcnJvclN0cmVhbS5zdHIoKTsKKworCURyaXZlclN0YXRpb246OlJlcG9ydEVycm9yKGVycm9yKTsKK30KKwordm9pZCBFcnJvcjo6Q2xlYXIoKQoreworCW1fY29kZSA9IDA7CisJbV9tZXNzYWdlID0gIiI7CisJbV9maWxlbmFtZSA9ICIiOworCW1fZnVuY3Rpb24gPSAiIjsKKwltX2xpbmVOdW1iZXIgPSAwOworCW1fb3JpZ2luYXRpbmdPYmplY3QgPSBOVUxMOworCW1fdGltZXN0YW1wID0gMC4wOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvc3JjL0Vycm9yQmFzZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvRXJyb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRkYTRiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKysvc3JjL0Vycm9yQmFzZS5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNkZWZpbmUgV1BJX0VSUk9SU19ERUZJTkVfU1RSSU5HUworI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNzdGRpbz4KKworTXV0ZXggRXJyb3JCYXNlOjpfZ2xvYmFsRXJyb3JNdXRleDsKK0Vycm9yIEVycm9yQmFzZTo6X2dsb2JhbEVycm9yOworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgaW5zdGFuY2Ugc3RhdHVzIHRvIDAgZm9yIG5vdy4KKyAqLworRXJyb3JCYXNlOjpFcnJvckJhc2UoKQore30KKworRXJyb3JCYXNlOjp+RXJyb3JCYXNlKCkKK3t9CisKKy8qKgorICogQGJyaWVmIFJldHJpZXZlIHRoZSBjdXJyZW50IGVycm9yLgorICogR2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlbnNvci4KKyAqLworRXJyb3ImIEVycm9yQmFzZTo6R2V0RXJyb3IoKQoreworCXJldHVybiBtX2Vycm9yOworfQorCitjb25zdCBFcnJvciYgRXJyb3JCYXNlOjpHZXRFcnJvcigpIGNvbnN0Cit7CisJcmV0dXJuIG1fZXJyb3I7Cit9CisKKy8qKgorICogQGJyaWVmIENsZWFyIHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlbnNvci4KKyAqLwordm9pZCBFcnJvckJhc2U6OkNsZWFyRXJyb3IoKSBjb25zdAoreworCW1fZXJyb3IuQ2xlYXIoKTsKK30KKworLyoqCisgKiBAYnJpZWYgU2V0IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIEMgbGlicmFyeSBjYWxsIHRoYXQgc2V0IGFuIGVycm9yIHRvIHRoZSAiZXJybm8iIGdsb2JhbCB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KKyAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQorICovCit2b2lkIEVycm9yQmFzZTo6U2V0RXJybm9FcnJvcihjb25zdCBjaGFyICpjb250ZXh0TWVzc2FnZSwKKwkJY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdAoreworCWNoYXIgZXJyWzI1Nl07CisJaW50IGVyck5vID0gZXJybm87CisJaWYgKGVyck5vID09IDApCisJeworCQlzcHJpbnRmKGVyciwgIk9LOiAlcyIsIGNvbnRleHRNZXNzYWdlKTsKKwl9CisJZWxzZQorCXsKKwkJc25wcmludGYoZXJyLCAyNTYsICIlcyAoMHglMDhYKTogJXMiLCBzdHJlcnJvcihlcnJObyksIGVyck5vLCBjb250ZXh0TWVzc2FnZSk7CisJfQorCisJLy8gIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmplY3QuCisJbV9lcnJvci5TZXQoLTEsIGVyciwgZmlsZW5hbWUsIGZ1bmN0aW9uLCBsaW5lTnVtYmVyLCB0aGlzKTsKKworCS8vIFVwZGF0ZSB0aGUgZ2xvYmFsIGVycm9yIGlmIHRoZXJlIGlzIG5vdCBvbmUgYWxyZWFkeSBzZXQuCisJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7CisJaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgPT0gMCkgeworCQlfZ2xvYmFsRXJyb3IuQ2xvbmUobV9lcnJvcik7CisJfQorfQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCBmcm9tIHRoZSBuaXZpc2lvbiBJbWFxIEFQSS4KKyAqCisgKiBAcGFyYW0gc3VjY2VzcyBUaGUgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KKyAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQorICovCit2b2lkIEVycm9yQmFzZTo6U2V0SW1hcUVycm9yKGludCBzdWNjZXNzLCBjb25zdCBjaGFyICpjb250ZXh0TWVzc2FnZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdAoreworCS8vICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IKKwlpZiAoc3VjY2VzcyA8PSAwKSB7CisJCWNoYXIgZXJyWzI1Nl07CisJCXNwcmludGYoZXJyLCAiJWk6ICVzIiwgc3VjY2VzcywgY29udGV4dE1lc3NhZ2UpOworCisJCS8vICBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0LgorCQltX2Vycm9yLlNldChzdWNjZXNzLCBlcnIsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwgdGhpcyk7CisKKwkJLy8gVXBkYXRlIHRoZSBnbG9iYWwgZXJyb3IgaWYgdGhlcmUgaXMgbm90IG9uZSBhbHJlYWR5IHNldC4KKwkJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7CisJCWlmIChfZ2xvYmFsRXJyb3IuR2V0Q29kZSgpID09IDApIHsKKwkJCV9nbG9iYWxFcnJvci5DbG9uZShtX2Vycm9yKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlbnNvci4KKyAqCisgKiBAcGFyYW0gY29kZSBUaGUgZXJyb3IgY29kZQorICogQHBhcmFtIGNvbnRleHRNZXNzYWdlIEEgY3VzdG9tIG1lc3NhZ2UgZnJvbSB0aGUgY29kZSB0aGF0IHNldCB0aGUgZXJyb3IuCisgKiBAcGFyYW0gZmlsZW5hbWUgRmlsZW5hbWUgb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGZ1bmN0aW9uIEZ1bmN0aW9uIG9mIHRoZSBlcnJvciBzb3VyY2UKKyAqIEBwYXJhbSBsaW5lTnVtYmVyIExpbmUgbnVtYmVyIG9mIHRoZSBlcnJvciBzb3VyY2UKKyAqLwordm9pZCBFcnJvckJhc2U6OlNldEVycm9yKEVycm9yOjpDb2RlIGNvZGUsIGNvbnN0IGNoYXIgKmNvbnRleHRNZXNzYWdlLAorCQljb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0Cit7CisJLy8gIElmIHRoZXJlIHdhcyBhbiBlcnJvcgorCWlmIChjb2RlICE9IDApIHsKKwkJLy8gIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmplY3QuCisJCW1fZXJyb3IuU2V0KGNvZGUsIGNvbnRleHRNZXNzYWdlLCBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVOdW1iZXIsIHRoaXMpOworCisJCS8vIFVwZGF0ZSB0aGUgZ2xvYmFsIGVycm9yIGlmIHRoZXJlIGlzIG5vdCBvbmUgYWxyZWFkeSBzZXQuCisJCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworCQlpZiAoX2dsb2JhbEVycm9yLkdldENvZGUoKSA9PSAwKSB7CisJCQlfZ2xvYmFsRXJyb3IuQ2xvbmUobV9lcnJvcik7CisJCX0KKwl9Cit9CisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZW5zb3IuCisgKgorICogQHBhcmFtIGVycm9yTWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZSBmcm9tIFdQSUVycm9ycy5oCisgKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KKyAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQorICovCit2b2lkIEVycm9yQmFzZTo6U2V0V1BJRXJyb3IoY29uc3QgY2hhciAqZXJyb3JNZXNzYWdlLCBFcnJvcjo6Q29kZSBjb2RlICwgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsCisJCWNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgdWludDMyX3QgbGluZU51bWJlcikgY29uc3QKK3sKKwljaGFyIGVyclsyNTZdOworCXNwcmludGYoZXJyLCAiJXM6ICVzIiwgZXJyb3JNZXNzYWdlLCBjb250ZXh0TWVzc2FnZSk7CisKKwkvLyAgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGZvciB0aGlzIG9iamVjdC4KKwltX2Vycm9yLlNldChjb2RlLCBlcnIsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwgdGhpcyk7CisKKwkvLyBVcGRhdGUgdGhlIGdsb2JhbCBlcnJvciBpZiB0aGVyZSBpcyBub3Qgb25lIGFscmVhZHkgc2V0LgorCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworCWlmIChfZ2xvYmFsRXJyb3IuR2V0Q29kZSgpID09IDApIHsKKwkJX2dsb2JhbEVycm9yLkNsb25lKG1fZXJyb3IpOworCX0KK30KKwordm9pZCBFcnJvckJhc2U6OkNsb25lRXJyb3IoRXJyb3JCYXNlICpyaHMpIGNvbnN0Cit7CisJbV9lcnJvci5DbG9uZShyaHMtPkdldEVycm9yKCkpOworfQorCisvKioKK0BicmllZiBDaGVjayBpZiB0aGUgY3VycmVudCBlcnJvciBjb2RlIHJlcHJlc2VudHMgYSBmYXRhbCBlcnJvci4KKworQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGVycm9yIGlzIGZhdGFsLgorKi8KK2Jvb2wgRXJyb3JCYXNlOjpTdGF0dXNJc0ZhdGFsKCkgY29uc3QKK3sKKwlyZXR1cm4gbV9lcnJvci5HZXRDb2RlKCkgPCAwOworfQorCit2b2lkIEVycm9yQmFzZTo6U2V0R2xvYmFsRXJyb3IoRXJyb3I6OkNvZGUgY29kZSwgY29uc3QgY2hhciAqY29udGV4dE1lc3NhZ2UsCisJCWNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgdWludDMyX3QgbGluZU51bWJlcikKK3sKKwkvLyAgSWYgdGhlcmUgd2FzIGFuIGVycm9yCisJaWYgKGNvZGUgIT0gMCkgeworCQk6OnN0ZDo6dW5pcXVlX2xvY2s8TXV0ZXg+IG11dGV4KF9nbG9iYWxFcnJvck11dGV4KTsKKworCQkvLyAgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGZvciB0aGlzIG9iamVjdC4KKwkJX2dsb2JhbEVycm9yLlNldChjb2RlLCBjb250ZXh0TWVzc2FnZSwgZmlsZW5hbWUsIGZ1bmN0aW9uLCBsaW5lTnVtYmVyLCBOVUxMKTsKKwl9Cit9CisKK3ZvaWQgRXJyb3JCYXNlOjpTZXRHbG9iYWxXUElFcnJvcihjb25zdCBjaGFyICplcnJvck1lc3NhZ2UsIGNvbnN0IGNoYXIgKmNvbnRleHRNZXNzYWdlLAorICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIHVpbnQzMl90IGxpbmVOdW1iZXIpCit7CisJY2hhciBlcnJbMjU2XTsKKwlzcHJpbnRmKGVyciwgIiVzOiAlcyIsIGVycm9yTWVzc2FnZSwgY29udGV4dE1lc3NhZ2UpOworCisJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7CisJaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgIT0gMCkgeworCQlfZ2xvYmFsRXJyb3IuQ2xlYXIoKTsKKwl9CisJX2dsb2JhbEVycm9yLlNldCgtMSwgZXJyLCBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVOdW1iZXIsIE5VTEwpOworfQorCisvKioKKyAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBnbG9iYWwgZXJyb3IuCisqLworRXJyb3ImIEVycm9yQmFzZTo6R2V0R2xvYmFsRXJyb3IoKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworCXJldHVybiBfZ2xvYmFsRXJyb3I7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvSExVc2FnZVJlcG9ydGluZy5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvSExVc2FnZVJlcG9ydGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMzI5OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL3NyYy9ITFVzYWdlUmVwb3J0aW5nLmNwcApAQCAtMCwwICsxLDIwIEBACisKKyNpbmNsdWRlICJITFVzYWdlUmVwb3J0aW5nLmgiCisKK0hMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UqIEhMVXNhZ2VSZXBvcnRpbmc6OmltcGwgPSAwOworCit2b2lkIEhMVXNhZ2VSZXBvcnRpbmc6OlNldEltcGxlbWVudGF0aW9uKEhMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UqIGkpIHsKKyAgICBpbXBsID0gaTsKK30KKwordm9pZCBITFVzYWdlUmVwb3J0aW5nOjpSZXBvcnRTY2hlZHVsZXIoKSB7CisgICAgaWYgKGltcGwgIT0gMCkgeworICAgICAgICBpbXBsLT5SZXBvcnRTY2hlZHVsZXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgSExVc2FnZVJlcG9ydGluZzo6UmVwb3J0U21hcnREYXNoYm9hcmQoKSB7CisgICAgaWYgKGltcGwgIT0gMCkgeworICAgICAgICBpbXBsLT5SZXBvcnRTbWFydERhc2hib2FyZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL3NyYy9SZXNvdXJjZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvUmVzb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODIxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvUmVzb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorCitSZWVudHJhbnRNdXRleCBSZXNvdXJjZTo6bV9jcmVhdGVMb2NrOworCisvKioKKyAqIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIGEgbmV3IGluc3RhbmNlIG9mIFJlc291cmNlLgorICogQWxsb2NhdGUgYSBib29sIGFycmF5IG9mIHZhbHVlcyB0aGF0IHdpbGwgZ2V0IGluaXRpYWxpemVkIHRvIGluZGljYXRlIHRoYXQgbm8gcmVzb3VyY2VzCisgKiBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldC4gVGhlIGluZGljaWVzIG9mIHRoZSByZXNvdXJjZXMgYXJlIFswIC4uIGVsZW1lbnRzIC0gMV0uCisgKi8KK1Jlc291cmNlOjpSZXNvdXJjZSh1aW50MzJfdCBlbGVtZW50cykKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9jcmVhdGVMb2NrKTsKKwltX3NpemUgPSBlbGVtZW50czsKKwltX2lzQWxsb2NhdGVkID0gbmV3IGJvb2xbbV9zaXplXTsKKwlmb3IgKHVpbnQzMl90IGk9MDsgaSA8IG1fc2l6ZTsgaSsrKQorCXsKKwkJbV9pc0FsbG9jYXRlZFtpXSA9IGZhbHNlOworCX0KK30KKworLyoqCisgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBSZXNvdXJjZSBhbGxvY2F0aW9uLXRyYWNrZXIgKmlmKiBuZWVkZWQuCisgKgorICogQHBhcmFtIHIgLS0gYWRkcmVzcyBvZiB0aGUgY2FsbGVyJ3MgUmVzb3VyY2UgcG9pbnRlci4gSWYgKnIgPT0gTlVMTCwgdGhpcworICogICAgd2lsbCBjb25zdHJ1Y3QgYSBSZXNvdXJjZSBhbmQgbWFrZSAqciBwb2ludCB0byBpdC4gSWYgKnIgIT0gTlVMTCwgaS5lLgorICogICAgdGhlIGNhbGxlciBhbHJlYWR5IGhhcyBhIFJlc291cmNlIGluc3RhbmNlLCB0aGlzIHdvbid0IGRvIGFueXRoaW5nLgorICogQHBhcmFtIGVsZW1lbnRzIC0tIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm9yIHRoaXMgUmVzb3VyY2UgYWxsb2NhdG9yIHRvCisgKiAgICB0cmFjaywgdGhhdCBpcywgaXQgd2lsbCBhbGxvY2F0ZSByZXNvdXJjZSBudW1iZXJzIGluIHRoZSByYW5nZQorICogICAgWzAgLi4gZWxlbWVudHMgLSAxXS4KKyAqLworLypzdGF0aWMqLyB2b2lkIFJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdChSZXNvdXJjZSAqKnIsIHVpbnQzMl90IGVsZW1lbnRzKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2NyZWF0ZUxvY2spOworCWlmICgqciA9PSBOVUxMKQorCXsKKwkJKnIgPSBuZXcgUmVzb3VyY2UoZWxlbWVudHMpOworCX0KK30KKworLyoqCisgKiBEZWxldGUgdGhlIGFsbG9jYXRlZCBhcnJheSBvciByZXNvdXJjZXMuCisgKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgbW9kdWxlIGlzIHVubG9hZGVkIChwcm92aWRlZCBpdCB3YXMgc3RhdGljYWxseSBhbGxvY2F0ZWQpLgorICovCitSZXNvdXJjZTo6flJlc291cmNlKCkKK3sKKwlkZWxldGVbXSBtX2lzQWxsb2NhdGVkOworfQorCisvKioKKyAqIEFsbG9jYXRlIGEgcmVzb3VyY2UuCisgKiBXaGVuIGEgcmVzb3VyY2UgaXMgcmVxdWVzdGVkLCBtYXJrIGl0IGFsbG9jYXRlZC4gSW4gdGhpcyBjYXNlLCBhIGZyZWUgcmVzb3VyY2UgdmFsdWUKKyAqIHdpdGhpbiB0aGUgcmFuZ2UgaXMgbG9jYXRlZCBhbmQgcmV0dXJuZWQgYWZ0ZXIgaXQgaXMgbWFya2VkIGFsbG9jYXRlZC4KKyAqLwordWludDMyX3QgUmVzb3VyY2U6OkFsbG9jYXRlKGNvbnN0IGNoYXIgKnJlc291cmNlRGVzYykKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9hbGxvY2F0ZUxvY2spOworCWZvciAodWludDMyX3QgaT0wOyBpIDwgbV9zaXplOyBpKyspCisJeworCQlpZiAoIW1faXNBbGxvY2F0ZWRbaV0pCisJCXsKKwkJCW1faXNBbGxvY2F0ZWRbaV0gPSB0cnVlOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTm9BdmFpbGFibGVSZXNvdXJjZXMsIHJlc291cmNlRGVzYyk7CisJcmV0dXJuIH4wdWw7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBzcGVjaWZpYyByZXNvdXJjZSB2YWx1ZS4KKyAqIFRoZSB1c2VyIHJlcXVlc3RzIGEgc3BlY2lmaWMgcmVzb3VyY2UgdmFsdWUsIGkuZS4gY2hhbm5lbCBudW1iZXIgYW5kIGl0IGlzIHZlcmlmaWVkCisgKiB1bmFsbG9jYXRlZCwgdGhlbiByZXR1cm5lZC4KKyAqLwordWludDMyX3QgUmVzb3VyY2U6OkFsbG9jYXRlKHVpbnQzMl90IGluZGV4LCBjb25zdCBjaGFyICpyZXNvdXJjZURlc2MpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fYWxsb2NhdGVMb2NrKTsKKwlpZiAoaW5kZXggPj0gbV9zaXplKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgcmVzb3VyY2VEZXNjKTsKKwkJcmV0dXJuIH4wdWw7CisJfQorCWlmICggbV9pc0FsbG9jYXRlZFtpbmRleF0gKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUmVzb3VyY2VBbHJlYWR5QWxsb2NhdGVkLCByZXNvdXJjZURlc2MpOworCQlyZXR1cm4gfjB1bDsKKwl9CisJbV9pc0FsbG9jYXRlZFtpbmRleF0gPSB0cnVlOworCXJldHVybiBpbmRleDsKK30KKworCisvKioKKyAqIEZyZWUgYW4gYWxsb2NhdGVkIHJlc291cmNlLgorICogQWZ0ZXIgYSByZXNvdXJjZSBpcyBubyBsb25nZXIgbmVlZGVkLCBmb3IgZXhhbXBsZSBhIGRlc3RydWN0b3IgaXMgY2FsbGVkIGZvciBhIGNoYW5uZWwgYXNzaWdubWVudAorICogY2xhc3MsIEZyZWUgd2lsbCByZWxlYXNlIHRoZSByZXNvdXJjZSB2YWx1ZSBzbyBpdCBjYW4gYmUgcmV1c2VkIHNvbWV3aGVyZSBlbHNlIGluIHRoZSBwcm9ncmFtLgorICovCit2b2lkIFJlc291cmNlOjpGcmVlKHVpbnQzMl90IGluZGV4KQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2FsbG9jYXRlTG9jayk7CisJaWYgKGluZGV4ID09IH4wdWwpIHJldHVybjsKKwlpZiAoaW5kZXggPj0gbV9zaXplKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKE5vdEFsbG9jYXRlZCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFtX2lzQWxsb2NhdGVkW2luZGV4XSkKKwl7CisJCXdwaV9zZXRXUElFcnJvcihOb3RBbGxvY2F0ZWQpOworCQlyZXR1cm47CisJfQorCW1faXNBbGxvY2F0ZWRbaW5kZXhdID0gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvUm9ib3RTdGF0ZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrKy9zcmMvUm9ib3RTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3MDAwYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrL3NyYy9Sb2JvdFN0YXRlLmNwcApAQCAtMCwwICsxLDQyIEBACisjaW5jbHVkZSAiUm9ib3RTdGF0ZS5oIgorCitSb2JvdFN0YXRlSW50ZXJmYWNlKiBSb2JvdFN0YXRlOjppbXBsID0gMDsKKwordm9pZCBSb2JvdFN0YXRlOjpTZXRJbXBsZW1lbnRhdGlvbihSb2JvdFN0YXRlSW50ZXJmYWNlKiBpKSB7CisgICAgaW1wbCA9IGk7Cit9CisKK2Jvb2wgUm9ib3RTdGF0ZTo6SXNEaXNhYmxlZCgpIHsKKyAgICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBpbXBsLT5Jc0Rpc2FibGVkKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJvYm90U3RhdGU6OklzRW5hYmxlZCgpIHsKKyAgICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBpbXBsLT5Jc0VuYWJsZWQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJvYm90U3RhdGU6OklzT3BlcmF0b3JDb250cm9sKCkgeworICAgIGlmIChpbXBsICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGltcGwtPklzT3BlcmF0b3JDb250cm9sKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJvYm90U3RhdGU6OklzQXV0b25vbW91cygpIHsKKyAgICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBpbXBsLT5Jc0F1dG9ub21vdXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJvYm90U3RhdGU6OklzVGVzdCgpIHsKKyAgICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBpbXBsLT5Jc1Rlc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL0NNYWtlTGlzdHMudHh0IGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzUyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKK3Byb2plY3QoV1BJTGliQysrRGV2aWNlcykKKworZmlsZShHTE9CX1JFQ1VSU0UgU1JDX0ZJTEVTIHNyYy8qLmNwcCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoaW5jbHVkZS8gJHtXUElMSUJfSU5DTFVERVN9ICR7SEFMX0FQSV9JTkNMVURFU30gJHtOV1RfQVBJX0lOQ0xVREVTfSkKK2FkZF9saWJyYXJ5KHdwaWxpYl9ub25zaGFyZWQgU1RBVElDICR7U1JDX0ZJTEVTfSAke0NPTV9TUkNfRklMRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdwaWxpYl9ub25zaGFyZWQgSEFMQXRoZW5hIE5ldHdvcmtUYWJsZXMgJHtOSV9MSUJTfSkKK0lOU1RBTEwoVEFSR0VUUyB3cGlsaWJfbm9uc2hhcmVkIEFSQ0hJVkUgREVTVElOQVRJT04gbGliIENPTVBPTkVOVCBsaWIpCitJTlNUQUxMKERJUkVDVE9SWSBpbmNsdWRlIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IENPTVBPTkVOVCBoZWFkZXJzKQorIyBsaWIvIGMgbSBnY2NfcyBsZC1saW51eAorIyB1c3IvbGliIHN0ZGMrKworIyBuaV9lbWIKKyMgSEFMIE5XVApkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQURYTDM0NV9JMkMuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0FEWEwzNDVfSTJDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmZjMzNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0FEWEwzNDVfSTJDLmgKQEAgLTAsMCArMSw1MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJpbnRlcmZhY2VzL0FjY2VsZXJvbWV0ZXIuaCIKKyNpbmNsdWRlICJJMkMuaCIKKworLyoqCisgKiBBRFhMMzQ1IEFjY2VsZXJvbWV0ZXIgb24gSTJDLgorICoKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGFjY2VzcyB0byBhIEFuYWxvZyBEZXZpY2VzIEFEWEwzNDUgMy1heGlzIGFjY2VsZXJvbWV0ZXIgb24gYW4gSTJDIGJ1cy4KKyAqIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGUgZGVmYXVsdCAobm90IGFsdGVybmF0ZSkgc2Vuc29yIGFkZHJlc3Mgb2YgMHgxRCAoNy1iaXQgYWRkcmVzcykuCisgKi8KK2NsYXNzIEFEWEwzNDVfSTJDIDogcHVibGljIEFjY2VsZXJvbWV0ZXIsIHB1YmxpYyBJMkMKK3sKK3Byb3RlY3RlZDoKKwlzdGF0aWMgY29uc3QgdWludDhfdCBrQWRkcmVzcyA9IDB4MUQ7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Bvd2VyQ3RsUmVnaXN0ZXIgPSAweDJEOworCXN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhRm9ybWF0UmVnaXN0ZXIgPSAweDMxOworCXN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhUmVnaXN0ZXIgPSAweDMyOworCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtHc1BlckxTQiA9IDAuMDAzOTA2MjU7CisJZW51bSBQb3dlckN0bEZpZWxkcyB7a1Bvd2VyQ3RsX0xpbms9MHgyMCwga1Bvd2VyQ3RsX0F1dG9TbGVlcD0weDEwLCBrUG93ZXJDdGxfTWVhc3VyZT0weDA4LCBrUG93ZXJDdGxfU2xlZXA9MHgwNH07CisJZW51bSBEYXRhRm9ybWF0RmllbGRzIHtrRGF0YUZvcm1hdF9TZWxmVGVzdD0weDgwLCBrRGF0YUZvcm1hdF9TUEk9MHg0MCwga0RhdGFGb3JtYXRfSW50SW52ZXJ0PTB4MjAsCisJCWtEYXRhRm9ybWF0X0Z1bGxSZXM9MHgwOCwga0RhdGFGb3JtYXRfSnVzdGlmeT0weDA0fTsKKworcHVibGljOgorCWVudW0gQXhlcyB7a0F4aXNfWD0weDAwLCBrQXhpc19ZPTB4MDIsIGtBeGlzX1o9MHgwNH07CisJc3RydWN0IEFsbEF4ZXMKKwl7CisJCWRvdWJsZSBYQXhpczsKKwkJZG91YmxlIFlBeGlzOworCQlkb3VibGUgWkF4aXM7CisJfTsKKworcHVibGljOgorCWV4cGxpY2l0IEFEWEwzNDVfSTJDKFBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2UgPSBrUmFuZ2VfMkcpOworCXZpcnR1YWwgfkFEWEwzNDVfSTJDKCk7CisKKwkvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQorCXZpcnR1YWwgdm9pZCBTZXRSYW5nZShSYW5nZSByYW5nZSk7CisJdmlydHVhbCBkb3VibGUgR2V0WCgpOworCXZpcnR1YWwgZG91YmxlIEdldFkoKTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRaKCk7CisKKwl2aXJ0dWFsIGRvdWJsZSBHZXRBY2NlbGVyYXRpb24oQXhlcyBheGlzKTsKKwl2aXJ0dWFsIEFsbEF4ZXMgR2V0QWNjZWxlcmF0aW9ucygpOworCitwcm90ZWN0ZWQ6CisJLy9JMkMqIG1faTJjOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0FEWEwzNDVfU1BJLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BRFhMMzQ1X1NQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmM2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BRFhMMzQ1X1NQSS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlNQSS5oIgorCitjbGFzcyBEaWdpdGFsSW5wdXQ7CitjbGFzcyBEaWdpdGFsT3V0cHV0OworCisvKioKKyAqIEFEWEwzNDUgQWNjZWxlcm9tZXRlciBvbiBTUEkuCisgKgorICogVGhpcyBjbGFzcyBhbGxvd3MgYWNjZXNzIHRvIGFuIEFuYWxvZyBEZXZpY2VzIEFEWEwzNDUgMy1heGlzIGFjY2VsZXJvbWV0ZXIgdmlhIFNQSS4KKyAqIFRoaXMgY2xhc3MgYXNzdW1lcyB0aGUgc2Vuc29yIGlzIHdpcmVkIGluIDQtd2lyZSBTUEkgbW9kZS4KKyAqLworY2xhc3MgQURYTDM0NV9TUEkgOiBwdWJsaWMgQWNjZWxlcm9tZXRlciwgcHVibGljIFNlbnNvckJhc2UKK3sKK3Byb3RlY3RlZDoKKwlzdGF0aWMgY29uc3QgdWludDhfdCBrUG93ZXJDdGxSZWdpc3RlciA9IDB4MkQ7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFGb3JtYXRSZWdpc3RlciA9IDB4MzE7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFSZWdpc3RlciA9IDB4MzI7CisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0dzUGVyTFNCID0gMC4wMDM5MDYyNTsKKwllbnVtIFNQSUFkZHJlc3NGaWVsZHMge2tBZGRyZXNzX1JlYWQ9MHg4MCwga0FkZHJlc3NfTXVsdGlCeXRlPTB4NDB9OworCWVudW0gUG93ZXJDdGxGaWVsZHMge2tQb3dlckN0bF9MaW5rPTB4MjAsIGtQb3dlckN0bF9BdXRvU2xlZXA9MHgxMCwga1Bvd2VyQ3RsX01lYXN1cmU9MHgwOCwga1Bvd2VyQ3RsX1NsZWVwPTB4MDR9OworCWVudW0gRGF0YUZvcm1hdEZpZWxkcyB7a0RhdGFGb3JtYXRfU2VsZlRlc3Q9MHg4MCwga0RhdGFGb3JtYXRfU1BJPTB4NDAsIGtEYXRhRm9ybWF0X0ludEludmVydD0weDIwLAorCQlrRGF0YUZvcm1hdF9GdWxsUmVzPTB4MDgsIGtEYXRhRm9ybWF0X0p1c3RpZnk9MHgwNH07CisKK3B1YmxpYzoKKwllbnVtIEF4ZXMge2tBeGlzX1g9MHgwMCwga0F4aXNfWT0weDAyLCBrQXhpc19aPTB4MDR9OworCXN0cnVjdCBBbGxBeGVzCisJeworCQlkb3VibGUgWEF4aXM7CisJCWRvdWJsZSBZQXhpczsKKwkJZG91YmxlIFpBeGlzOworCX07CisKK3B1YmxpYzoKKwlBRFhMMzQ1X1NQSShTUEk6OlBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2U9a1JhbmdlXzJHKTsKKwl2aXJ0dWFsIH5BRFhMMzQ1X1NQSSgpOworCisJLy8gQWNjZWxlcm9tZXRlciBpbnRlcmZhY2UKKwl2aXJ0dWFsIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpOworCXZpcnR1YWwgZG91YmxlIEdldFgoKTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRZKCk7CisJdmlydHVhbCBkb3VibGUgR2V0WigpOworCisJdmlydHVhbCBkb3VibGUgR2V0QWNjZWxlcmF0aW9uKEF4ZXMgYXhpcyk7CisJdmlydHVhbCBBbGxBeGVzIEdldEFjY2VsZXJhdGlvbnMoKTsKKworcHJvdGVjdGVkOgorCXZvaWQgSW5pdChSYW5nZSByYW5nZSk7CisKKwlTUEkqIG1fc3BpOworCVNQSTo6UG9ydCBtX3BvcnQ7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nQWNjZWxlcm9tZXRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nQWNjZWxlcm9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkN2EzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dBY2NlbGVyb21ldGVyLmgKQEAgLTAsMCArMSwzNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJQSURTb3VyY2UuaCIKKworLyoqCisgKiBIYW5kbGUgb3BlcmF0aW9uIG9mIGFuIGFuYWxvZyBhY2NlbGVyb21ldGVyLgorICogVGhlIGFjY2VsZXJvbWV0ZXIgcmVhZHMgYWNjZWxlcmF0aW9uIGRpcmVjdGx5IHRocm91Z2ggdGhlIHNlbnNvci4gTWFueSBzZW5zb3JzIGhhdmUKKyAqIG11bHRpcGxlIGF4aXMgYW5kIGNhbiBiZSB0cmVhdGVkIGFzIG11bHRpcGxlIGRldmljZXMuIEVhY2ggaXMgY2FsaWJyYXRlZCBieSBmaW5kaW5nCisgKiB0aGUgY2VudGVyIHZhbHVlIG92ZXIgYSBwZXJpb2Qgb2YgdGltZS4KKyAqLworY2xhc3MgQW5hbG9nQWNjZWxlcm9tZXRlciA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUElEU291cmNlIHsKK3B1YmxpYzoKKwlleHBsaWNpdCBBbmFsb2dBY2NlbGVyb21ldGVyKGludDMyX3QgY2hhbm5lbCk7CisJZXhwbGljaXQgQW5hbG9nQWNjZWxlcm9tZXRlcihBbmFsb2dJbnB1dCAqY2hhbm5lbCk7CisJdmlydHVhbCB+QW5hbG9nQWNjZWxlcm9tZXRlcigpOworCisJZmxvYXQgR2V0QWNjZWxlcmF0aW9uKCk7CisJdm9pZCBTZXRTZW5zaXRpdml0eShmbG9hdCBzZW5zaXRpdml0eSk7CisJdm9pZCBTZXRaZXJvKGZsb2F0IHplcm8pOworCWRvdWJsZSBQSURHZXQoKTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRBY2NlbGVyb21ldGVyKCk7CisKKwlBbmFsb2dJbnB1dCAqbV9BbmFsb2dJbnB1dDsKKwlmbG9hdCBtX3ZvbHRzUGVyRzsKKwlmbG9hdCBtX3plcm9HVm9sdGFnZTsKKwlib29sIG1fYWxsb2NhdGVkQ2hhbm5lbDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dJbnB1dC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTEwODA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nSW5wdXQuaApAQCAtMCwwICsxLDY4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorCisvKioKKyAqIEFuYWxvZyBpbnB1dCBjbGFzcy4KKyAqCisgKiBDb25uZWN0ZWQgdG8gZWFjaCBhbmFsb2cgY2hhbm5lbCBpcyBhbiBhdmVyYWdpbmcgYW5kIG92ZXJzYW1wbGluZyBlbmdpbmUuICBUaGlzIGVuZ2luZSBhY2N1bXVsYXRlcworICogdGhlIHNwZWNpZmllZCAoIGJ5IFNldEF2ZXJhZ2VCaXRzKCkgYW5kIFNldE92ZXJzYW1wbGVCaXRzKCkgKSBudW1iZXIgb2Ygc2FtcGxlcyBiZWZvcmUgcmV0dXJuaW5nIGEgbmV3CisgKiB2YWx1ZS4gIFRoaXMgaXMgbm90IGEgc2xpZGluZyB3aW5kb3cgYXZlcmFnZS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgb3ZlcnNhbXBsZWQgc2FtcGxlcyBhbmQKKyAqIHRoZSBhdmVyYWdlZCBzYW1wbGVzIGlzIHRoYXQgdGhlIG92ZXJzYW1wbGVkIHNhbXBsZXMgYXJlIHNpbXBseSBhY2N1bXVsYXRlZCBlZmZlY3RpdmVseSBpbmNyZWFzaW5nIHRoZQorICogcmVzb2x1dGlvbiwgd2hpbGUgdGhlIGF2ZXJhZ2VkIHNhbXBsZXMgYXJlIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHJldGFpbiB0aGUgcmVzb2x1dGlvbiwKKyAqIGJ1dCBnZXQgbW9yZSBzdGFibGUgdmFsdWVzLgorICovCitjbGFzcyBBbmFsb2dJbnB1dCA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUElEU291cmNlCit7CitwdWJsaWM6CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0FjY3VtdWxhdG9yTW9kdWxlTnVtYmVyID0gMTsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHMgPSAyOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQWNjdW11bGF0b3JDaGFubmVsc1trQWNjdW11bGF0b3JOdW1DaGFubmVsc107CisKKwlleHBsaWNpdCBBbmFsb2dJbnB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5BbmFsb2dJbnB1dCgpOworCisJaW50MTZfdCBHZXRWYWx1ZSgpOworCWludDMyX3QgR2V0QXZlcmFnZVZhbHVlKCk7CisKKwlmbG9hdCBHZXRWb2x0YWdlKCk7CisJZmxvYXQgR2V0QXZlcmFnZVZvbHRhZ2UoKTsKKworCXVpbnQzMl90IEdldENoYW5uZWwoKTsKKworCXZvaWQgU2V0QXZlcmFnZUJpdHModWludDMyX3QgYml0cyk7CisJdWludDMyX3QgR2V0QXZlcmFnZUJpdHMoKTsKKwl2b2lkIFNldE92ZXJzYW1wbGVCaXRzKHVpbnQzMl90IGJpdHMpOworCXVpbnQzMl90IEdldE92ZXJzYW1wbGVCaXRzKCk7CisKKwl1aW50MzJfdCBHZXRMU0JXZWlnaHQoKTsKKwlpbnQzMl90IEdldE9mZnNldCgpOworCisJYm9vbCBJc0FjY3VtdWxhdG9yQ2hhbm5lbCgpOworCXZvaWQgSW5pdEFjY3VtdWxhdG9yKCk7CisJdm9pZCBTZXRBY2N1bXVsYXRvckluaXRpYWxWYWx1ZShpbnQ2NF90IHZhbHVlKTsKKwl2b2lkIFJlc2V0QWNjdW11bGF0b3IoKTsKKwl2b2lkIFNldEFjY3VtdWxhdG9yQ2VudGVyKGludDMyX3QgY2VudGVyKTsKKwl2b2lkIFNldEFjY3VtdWxhdG9yRGVhZGJhbmQoaW50MzJfdCBkZWFkYmFuZCk7CisJaW50NjRfdCBHZXRBY2N1bXVsYXRvclZhbHVlKCk7CisJdWludDMyX3QgR2V0QWNjdW11bGF0b3JDb3VudCgpOworCXZvaWQgR2V0QWNjdW11bGF0b3JPdXRwdXQoaW50NjRfdCAqdmFsdWUsIHVpbnQzMl90ICpjb3VudCk7CisKKwlzdGF0aWMgdm9pZCBTZXRTYW1wbGVSYXRlKGZsb2F0IHNhbXBsZXNQZXJTZWNvbmQpOworCXN0YXRpYyBmbG9hdCBHZXRTYW1wbGVSYXRlKCk7CisKKwlkb3VibGUgUElER2V0KCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0QW5hbG9nSW5wdXQodWludDMyX3QgY2hhbm5lbCk7CisJdWludDMyX3QgbV9jaGFubmVsOworCXZvaWQqIG1fcG9ydDsKKwlpbnQ2NF90IG1fYWNjdW11bGF0b3JPZmZzZXQ7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nT3V0cHV0LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFiY2IyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nT3V0cHV0LmgKQEAgLTAsMCArMSwyOSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KKy8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKworLyoqCisgKiBNWFAgYW5hbG9nIG91dHB1dCBjbGFzcy4KKyAqLworY2xhc3MgQW5hbG9nT3V0cHV0IDogcHVibGljIFNlbnNvckJhc2UKK3sKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBbmFsb2dPdXRwdXQodWludDMyX3QgY2hhbm5lbCk7CisgICAgdmlydHVhbCB+QW5hbG9nT3V0cHV0KCk7CisKKyAgICB2b2lkIFNldFZvbHRhZ2UoZmxvYXQgdm9sdGFnZSk7CisgICAgZmxvYXQgR2V0Vm9sdGFnZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBJbml0QW5hbG9nT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpOworICAgIHVpbnQzMl90IG1fY2hhbm5lbDsKKyAgICB2b2lkKiBtX3BvcnQ7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nUG90ZW50aW9tZXRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nUG90ZW50aW9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGNkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dQb3RlbnRpb21ldGVyLmgKQEAgLTAsMCArMSw2NCBAQAorCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaCIKKworLyoqCisgKiBDbGFzcyBmb3IgcmVhZGluZyBhbmFsb2cgcG90ZW50aW9tZXRlcnMuIEFuYWxvZyBwb3RlbnRpb21ldGVycyByZWFkCisgKiBpbiBhbiBhbmFsb2cgdm9sdGFnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcG9zaXRpb24uIFRoZSBwb3NpdGlvbiBpcworICogaW4gd2hpY2hldmVyIHVuaXRzIHlvdSBjaG9vc2UsIGJ5IHdheSBvZiB0aGUgc2NhbGluZyBhbmQgb2Zmc2V0CisgKiBjb25zdGFudHMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAYXV0aG9yIEFsZXggSGVubmluZworICogQGF1dGhvciBDb2xieSBTa2VnZ3MgKHJhaWwgdm9sdGFnZSkKKyAqLworY2xhc3MgQW5hbG9nUG90ZW50aW9tZXRlciA6IHB1YmxpYyBQb3RlbnRpb21ldGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbmFsb2dQb3RlbnRpb21ldGVyIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogVXNlIHRoZSBmdWxsUmFuZ2UgYW5kIG9mZnNldCB2YWx1ZXMgc28gdGhhdCB0aGUgb3V0cHV0IHByb2R1Y2VzCisgICAgICogbWVhbmluZ2Z1bCB2YWx1ZXMuIEkuRTogeW91IGhhdmUgYSAyNzAgZGVncmVlIHBvdGVudGlvbWV0ZXIgYW5kCisgICAgICogeW91IHdhbnQgdGhlIG91dHB1dCB0byBiZSBkZWdyZWVzIHdpdGggdGhlIGhhbGZ3YXkgcG9pbnQgYXMgMAorICAgICAqIGRlZ3JlZXMuIFRoZSBmdWxsUmFuZ2UgdmFsdWUgaXMgMjcwLjAoZGVncmVlcykgYW5kIHRoZSBvZmZzZXQgaXMKKyAgICAgKiAtMTM1LjAgc2luY2UgdGhlIGhhbGZ3YXkgcG9pbnQgYWZ0ZXIgc2NhbGluZyBpcyAxMzUgZGVncmVlcy4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCBjYWxjdWxhdGUgdGhlIHJlc3VsdCBmcm9tIHRoZSBmdWxsUmFuZ2UgdGltZXMgdGhlCisgICAgICogZnJhY3Rpb24gb2YgdGhlIHN1cHBseSB2b2x0YWdlLCBwbHVzIHRoZSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgYW5hbG9nIGNoYW5uZWwgdGhpcyBwb3RlbnRpb21ldGVyIGlzIHBsdWdnZWQgaW50by4KKyAgICAgKiBAcGFyYW0gZnVsbFJhbmdlIFRoZSBzY2FsaW5nIHRvIG11bHRpcGx5IHRoZSB2b2x0YWdlIGJ5IHRvIGdldCBhIG1lYW5pbmdmdWwgdW5pdC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgdG8gYWRkIHRvIHRoZSBzY2FsZWQgdmFsdWUgZm9yIGNvbnRyb2xsaW5nIHRoZSB6ZXJvIHZhbHVlCisgICAgICovCisgICAgZXhwbGljaXQgQW5hbG9nUG90ZW50aW9tZXRlcihpbnQgY2hhbm5lbCwgZG91YmxlIGZ1bGxSYW5nZSA9IDEuMCwgZG91YmxlIG9mZnNldCA9IDAuMCk7CisKKyAgICBleHBsaWNpdCBBbmFsb2dQb3RlbnRpb21ldGVyKEFuYWxvZ0lucHV0ICppbnB1dCwgZG91YmxlIGZ1bGxSYW5nZSA9IDEuMCwgZG91YmxlIG9mZnNldCA9IDAuMCk7CisKKyAgICBleHBsaWNpdCBBbmFsb2dQb3RlbnRpb21ldGVyKEFuYWxvZ0lucHV0ICZpbnB1dCwgZG91YmxlIGZ1bGxSYW5nZSA9IDEuMCwgZG91YmxlIG9mZnNldCA9IDAuMCk7CisKKyAgICB2aXJ0dWFsIH5BbmFsb2dQb3RlbnRpb21ldGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcmVhZGluZyBvZiB0aGUgcG90ZW50aW9tZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb3RlbnRpb21ldGVyLgorICAgICAqLworICAgIHZpcnR1YWwgZG91YmxlIEdldCgpOworCisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBJRFNvdXJjZSBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJlYWRpbmcuCisgICAgICovCisgICAgdmlydHVhbCBkb3VibGUgUElER2V0KCk7CisKK3ByaXZhdGU6CisgICAgZG91YmxlIG1fZnVsbFJhbmdlLCBtX29mZnNldDsKKyAgICBBbmFsb2dJbnB1dCogbV9hbmFsb2dfaW5wdXQ7CisgICAgYm9vbCBtX2luaXRfYW5hbG9nX2lucHV0OworCisgICAgLyoqCisgICAgICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgICAgICovCisgICAgdm9pZCBpbml0UG90KEFuYWxvZ0lucHV0ICppbnB1dCwgZG91YmxlIGZ1bGxSYW5nZSwgZG91YmxlIG9mZnNldCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nVHJpZ2dlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nVHJpZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMThhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyLmgKQEAgLTAsMCArMSwzNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCitjbGFzcyBBbmFsb2dJbnB1dDsKKworY2xhc3MgQW5hbG9nVHJpZ2dlciA6IHB1YmxpYyBTZW5zb3JCYXNlCit7CisJZnJpZW5kIGNsYXNzIEFuYWxvZ1RyaWdnZXJPdXRwdXQ7CitwdWJsaWM6CisJZXhwbGljaXQgQW5hbG9nVHJpZ2dlcihpbnQzMl90IGNoYW5uZWwpOworCWV4cGxpY2l0IEFuYWxvZ1RyaWdnZXIoQW5hbG9nSW5wdXQgKmNoYW5uZWwpOworCXZpcnR1YWwgfkFuYWxvZ1RyaWdnZXIoKTsKKworCXZvaWQgU2V0TGltaXRzVm9sdGFnZShmbG9hdCBsb3dlciwgZmxvYXQgdXBwZXIpOworCXZvaWQgU2V0TGltaXRzUmF3KGludDMyX3QgbG93ZXIsIGludDMyX3QgdXBwZXIpOworCXZvaWQgU2V0QXZlcmFnZWQoYm9vbCB1c2VBdmVyYWdlZFZhbHVlKTsKKwl2b2lkIFNldEZpbHRlcmVkKGJvb2wgdXNlRmlsdGVyZWRWYWx1ZSk7CisJdWludDMyX3QgR2V0SW5kZXgoKTsKKwlib29sIEdldEluV2luZG93KCk7CisJYm9vbCBHZXRUcmlnZ2VyU3RhdGUoKTsKKwlBbmFsb2dUcmlnZ2VyT3V0cHV0ICpDcmVhdGVPdXRwdXQoQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0VHJpZ2dlcih1aW50MzJfdCBjaGFubmVsKTsKKworCXVpbnQ4X3QgbV9pbmRleDsKKwl2b2lkKiBtX3RyaWdnZXI7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nVHJpZ2dlck91dHB1dC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQW5hbG9nVHJpZ2dlck91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjcwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyT3V0cHV0LmgKQEAgLTAsMCArMSw1NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEaWdpdGFsU291cmNlLmgiCisKK2NsYXNzIEFuYWxvZ1RyaWdnZXI7CisKKy8qKgorICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgc3BlY2lmaWMgb3V0cHV0IGZyb20gYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IG91dHB1dCB2YWx1ZSBhbmQgYWxzbyBhcyBhIERpZ2l0YWxTb3VyY2UKKyAqIHRvIHByb3ZpZGUgcm91dGluZyBvZiBhbiBvdXRwdXQgdG8gZGlnaXRhbCBzdWJzeXN0ZW1zIG9uIHRoZSBGUEdBIHN1Y2ggYXMKKyAqIENvdW50ZXIsIEVuY29kZXIsIGFuZCBJbnRlcnJ1cHQuCisgKgorICogVGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgaW5kaWNhdGVzIHRoZSBwcmltYXJ5IG91dHB1dCB2YWx1ZSBvZiB0aGUgdHJpZ2dlci4gIElmIHRoZSBhbmFsb2cKKyAqIHNpZ25hbCBpcyBsZXNzIHRoYW4gdGhlIGxvd2VyIGxpbWl0LCB0aGUgb3V0cHV0IGlzIGZhbHNlLiAgSWYgdGhlIGFuYWxvZyB2YWx1ZSBpcyBncmVhdGVyCisgKiB0aGFuIHRoZSB1cHBlciBsaW1pdCwgdGhlbiB0aGUgb3V0cHV0IGlzIHRydWUuICBJZiB0aGUgYW5hbG9nIHZhbHVlIGlzIGluIGJldHdlZW4sIHRoZW4KKyAqIHRoZSB0cmlnZ2VyIG91dHB1dCBzdGF0ZSBtYWludGFpbnMgaXRzIG1vc3QgcmVjZW50IHZhbHVlLgorICoKKyAqIFRoZSBJbldpbmRvdyBvdXRwdXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBhbmFsb2cgc2lnbmFsIGlzIGluc2lkZSB0aGUgcmFuZ2UgZGVmaW5lZAorICogYnkgdGhlIGxpbWl0cy4KKyAqCisgKiBUaGUgUmlzaW5nUHVsc2UgYW5kIEZhbGxpbmdQdWxzZSBvdXRwdXRzIGRldGVjdCBhbiBpbnN0YW50YW5lb3VzIHRyYW5zaXRpb24gZnJvbSBhYm92ZSB0aGUKKyAqIHVwcGVyIGxpbWl0IHRvIGJlbG93IHRoZSBsb3dlciBsaW1pdCwgYW5kIHZpc2UgdmVyc2EuICBUaGVzZSBwdWxzZXMgcmVwcmVzZW50IGEgcm9sbG92ZXIKKyAqIGNvbmRpdGlvbiBvZiBhIHNlbnNvciBhbmQgY2FuIGJlIHJvdXRlZCB0byBhbiB1cCAvIGRvd24gY291dGVyIG9yIHRvIGludGVycnVwdHMuICBCZWNhdXNlCisgKiB0aGUgb3V0cHV0cyBnZW5lcmF0ZSBhIHB1bHNlLCB0aGV5IGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5LiAgVG8gaGVscCBlbnN1cmUgdGhhdCBhIHJvbGxvdmVyCisgKiBjb25kaXRpb24gaXMgbm90IG1pc3NlZCwgdGhlcmUgaXMgYW4gYXZlcmFnZSByZWplY3Rpb24gZmlsdGVyIGF2YWlsYWJsZSB0aGF0IG9wZXJhdGVzIG9uIHRoZQorICogdXBwZXIgOCBiaXRzIG9mIGEgMTIgYml0IG51bWJlciBhbmQgc2VsZWN0cyB0aGUgbmVhcmVzdCBvdXRseWVyIG9mIDMgc2FtcGxlcy4gIFRoaXMgd2lsbCByZWplY3QKKyAqIGEgc2FtcGxlIHRoYXQgaXMgKGR1ZSB0byBhdmVyYWdpbmcgb3Igc2FtcGxpbmcpIGVycmFudGx5IGJldHdlZW4gdGhlIHR3byBsaW1pdHMuICBUaGlzIGZpbHRlcgorICogd2lsbCBmYWlsIGlmIG1vcmUgdGhhbiBvbmUgc2FtcGxlIGluIGEgcm93IGlzIGVycmFudGx5IGluIGJldHdlZW4gdGhlIHR3byBsaW1pdHMuICBZb3UgbWF5IHNlZQorICogdGhpcyBwcm9ibGVtIGlmIGF0dGVtcHRpbmcgdG8gdXNlIHRoaXMgZmVhdHVyZSB3aXRoIGEgbWVjaGFuaWNhbCByb2xsb3ZlciBzZW5zb3IsIHN1Y2ggYXMgYQorICogMzYwIGRlZ3JlZSBuby1zdG9wIHBvdGVudGlvbWV0ZXIgd2l0aG91dCBzaWduYWwgY29uZGl0aW9uaW5nLCBiZWNhdXNlIHRoZSByb2xsb3ZlciB0cmFuc2l0aW9uCisgKiBpcyBub3Qgc2hhcnAgLyBjbGVhbiBlbm91Z2guICBVc2luZyB0aGUgYXZlcmFnaW5nIGVuZ2luZSBtYXkgaGVscCB3aXRoIHRoaXMsIGJ1dCByb3RhdGlvbmFsIHNwZWVkcyBvZgorICogdGhlIHNlbnNvciB3aWxsIHRoZW4gYmUgbGltaXRlZC4KKyAqLworY2xhc3MgQW5hbG9nVHJpZ2dlck91dHB1dCA6IHB1YmxpYyBEaWdpdGFsU291cmNlCit7CisJZnJpZW5kIGNsYXNzIEFuYWxvZ1RyaWdnZXI7CitwdWJsaWM6CisKKwl2aXJ0dWFsIH5BbmFsb2dUcmlnZ2VyT3V0cHV0KCk7CisJdmlydHVhbCBib29sIEdldCgpOworCisJLy8gRGlnaXRhbFNvdXJjZSBpbnRlcmZhY2UKKwl2aXJ0dWFsIHVpbnQzMl90IEdldENoYW5uZWxGb3JSb3V0aW5nKCk7CisJdmlydHVhbCB1aW50MzJfdCBHZXRNb2R1bGVGb3JSb3V0aW5nKCk7CisJdmlydHVhbCBib29sIEdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCk7Citwcm90ZWN0ZWQ6CisJQW5hbG9nVHJpZ2dlck91dHB1dChBbmFsb2dUcmlnZ2VyICp0cmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSBvdXRwdXRUeXBlKTsKKworcHJpdmF0ZToKKwlBbmFsb2dUcmlnZ2VyICptX3RyaWdnZXI7CisJQW5hbG9nVHJpZ2dlclR5cGUgbV9vdXRwdXRUeXBlOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0J1aWx0SW5BY2NlbGVyb21ldGVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9CdWlsdEluQWNjZWxlcm9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2RmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9CdWlsdEluQWNjZWxlcm9tZXRlci5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJpbnRlcmZhY2VzL0FjY2VsZXJvbWV0ZXIuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKKy8qKgorICogQnVpbHQtaW4gYWNjZWxlcm9tZXRlci4KKyAqCisgKiBUaGlzIGNsYXNzIGFsbG93cyBhY2Nlc3MgdG8gdGhlIFJvYm9SSU8ncyBpbnRlcm5hbCBhY2NlbGVyb21ldGVyLgorICovCitjbGFzcyBCdWlsdEluQWNjZWxlcm9tZXRlciA6IHB1YmxpYyBBY2NlbGVyb21ldGVyLCBwdWJsaWMgU2Vuc29yQmFzZQoreworcHVibGljOgorCUJ1aWx0SW5BY2NlbGVyb21ldGVyKFJhbmdlIHJhbmdlID0ga1JhbmdlXzhHKTsKKyAgICAgICAgdmlydHVhbCB+QnVpbHRJbkFjY2VsZXJvbWV0ZXIoKTsKKworCS8vIEFjY2VsZXJvbWV0ZXIgaW50ZXJmYWNlCisJdmlydHVhbCB2b2lkIFNldFJhbmdlKFJhbmdlIHJhbmdlKTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRYKCk7CisJdmlydHVhbCBkb3VibGUgR2V0WSgpOworCXZpcnR1YWwgZG91YmxlIEdldFooKTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU4vY2FuX3Byb3RvLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU4vY2FuX3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExM2IwMgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NBTi9jYW5fcHJvdG8uaApAQCAtMCwwICsxLDQyOCBAQAorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIGNhbl9wcm90by5oIC0gRGVmaW5pdGlvbnMgZm9yIHRoZSBDQU4gcHJvdG9jb2wgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZQorLy8gICAgICAgICAgICAgICBCREMgbW90b3IgY29udHJvbGxlci4KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRJIEluZm9ybWF0aW9uIC0gU2VsZWN0aXZlIERpc2Nsb3N1cmUKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyNpZm5kZWYgX19DQU5fUFJPVE9fSF9fCisjZGVmaW5lIF9fQ0FOX1BST1RPX0hfXworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIG1hc2tzIG9mIHRoZSBmaWVsZHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgbWVzc2FnZSBpZGVudGlmaWVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ0FOX01TR0lEX0ZVTExfTSAgICAgICAgMHgxZmZmZmZmZgorI2RlZmluZSBDQU5fTVNHSURfREVWTk9fTSAgICAgICAweDAwMDAwMDNmCisjZGVmaW5lIENBTl9NU0dJRF9BUElfTSAgICAgICAgIDB4MDAwMGZmYzAKKyNkZWZpbmUgQ0FOX01TR0lEX01GUl9NICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfTSAgICAgICAweDFmMDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9ERVZOT19TICAgICAgIDAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9TICAgICAgICAgNgorI2RlZmluZSBDQU5fTVNHSURfTUZSX1MgICAgICAgICAxNgorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfUyAgICAgICAyNAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFJlc2VydmVkIGRldmljZSBudW1iZXIgdmFsdWVzIGluIHRoZSBNZXNzYWdlIElkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ0FOX01TR0lEX0RFVk5PX0JDQVNUICAgMHgwMDAwMDAwMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFJlc2VydmVkIHN5c3RlbSBjb250cm9sIEFQSSBudW1iZXJzIGluIHRoZSBNZXNzYWdlIElkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9TWVNIQUxUICAgMHgwMDAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX1NZU1JTVCAgICAweDAwMDAwMDQwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfREVWQVNTSUdOIDB4MDAwMDAwODAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9ERVZRVUVSWSAgMHgwMDAwMDBjMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX0hFQVJUQkVBVCAweDAwMDAwMTQwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfU1lOQyAgICAgIDB4MDAwMDAxODAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9VUERBVEUgICAgMHgwMDAwMDFjMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX0ZJUk1WRVIgICAweDAwMDAwMjAwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfRU5VTUVSQVRFIDB4MDAwMDAyNDAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9TWVNSRVNVTUUgMHgwMDAwMDI4MAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIDMyIGJpdCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDQU5fTVNHSURfQVBJX1NUQVRVUyByZXF1ZXN0LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ0FOX1NUQVRVU19DT0RFX00gICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBDQU5fU1RBVFVTX01GR19NICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIENBTl9TVEFUVVNfRFRZUEVfTSAgICAgIDB4MWYwMDAwMDAKKyNkZWZpbmUgQ0FOX1NUQVRVU19DT0RFX1MgICAgICAgMAorI2RlZmluZSBDQU5fU1RBVFVTX01GR19TICAgICAgICAxNgorI2RlZmluZSBDQU5fU1RBVFVTX0RUWVBFX1MgICAgICAyNAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFJlc2VydmVkIG1hbnVmYWN0dXJlciBpZGVudGlmaWVycyBpbiB0aGUgTWVzc2FnZSBJZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9NU0dJRF9NRlJfTkkgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX01GUl9MTSAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBDQU5fTVNHSURfTUZSX0RFS0EgICAgICAweDAwMDMwMDAwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgUmVzZXJ2ZWQgZGV2aWNlIHR5cGUgaWRlbnRpZmllcnMgaW4gdGhlIE1lc3NhZ2UgSWQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfQkNBU1QgICAweDAwMDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9ST0JPVCAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX01PVE9SICAgMHgwMjAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfUkVMQVkgICAweDAzMDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9HWVJPICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX0FDQ0VMICAgMHgwNTAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfVVNPTklDICAweDA2MDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9HRUFSVCAgIDB4MDcwMDAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX1VQREFURSAgMHgxZjAwMDAwMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gTE0gTW90b3IgQ29udHJvbCBBUEkgQ2xhc3NlcyBBUEkgQ2xhc3MgYW5kIElEIG1hc2tzLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9DTEFTU19NICAgMHgwMDAwZmMwMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX0lEX00gICAgICAweDAwMDAwM2MwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBMTSBNb3RvciBDb250cm9sIEFQSSBDbGFzc2VzIGluIHRoZSBNZXNzYWdlIElkIGZvciBub24tYnJvYWRjYXN0LgorLy8gVGhlc2UgYXJlIHRoZSB1cHBlciA2IGJpdHMgb2YgdGhlIEFQSSBmaWVsZCwgdGhlIGxvd2VyIDQgYml0cyBkZXRlcm1pbmUKKy8vIHRoZSBBUElJZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9BUElfTUNfVk9MVEFHRSAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19TUEQgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBDQU5fQVBJX01DX1ZDT01QICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIENBTl9BUElfTUNfUE9TICAgICAgICAgIDB4MDAwMDBjMDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19JQ1RSTCAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBDQU5fQVBJX01DX1NUQVRVUyAgICAgICAweDAwMDAxNDAwCisjZGVmaW5lIENBTl9BUElfTUNfUFNUQVQgICAgICAgIDB4MDAwMDE4MDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19DRkcgICAgICAgICAgMHgwMDAwMWMwMAorI2RlZmluZSBDQU5fQVBJX01DX0FDSyAgICAgICAgICAweDAwMDAyMDAwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIENvbnRyb2wgVm9sdGFnZSBBUEkgZGVmaW5pdGlvbnMuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfVk9MVCAgICAgICAgICAgICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0FQSV9NQ19WT0xUQUdFKQorI2RlZmluZSBMTV9BUElfVk9MVF9FTiAgICAgICAgICAoTE1fQVBJX1ZPTFQgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVk9MVF9ESVMgICAgICAgICAoTE1fQVBJX1ZPTFQgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVk9MVF9TRVQgICAgICAgICAoTE1fQVBJX1ZPTFQgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVk9MVF9TRVRfUkFNUCAgICAoTE1fQVBJX1ZPTFQgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBCRUdJTiAjIyMjIworI2RlZmluZSBMTV9BUElfVk9MVF9UX0VOICAgICAgICAoTE1fQVBJX1ZPTFQgfCAoNCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVk9MVF9UX1NFVCAgICAgICAoTE1fQVBJX1ZPTFQgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVk9MVF9UX1NFVF9OT19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTE1fQVBJX1ZPTFQgfCAoNyA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBFTkQgIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfU0VUX05PX0FDSyAgKExNX0FQSV9WT0xUIHwgKDggPDwgQ0FOX01TR0lEX0FQSV9TKSkKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgQ29udHJvbCBBUEkgZGVmaW5pdGlvbnMgZm9yIExNX0FQSV9WT0xUX1NFVF9SQU1QLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfUkFNUF9ESVMgICAgMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBDb250cm9sIEFQSSBkZWZpbml0aW9ucyBmb3IgQ0FOX01TR0lEX0FQSV9TWU5DLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1NZTkNfUEVORF9OT1cgICAgMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBTcGVlZCBDb250cm9sIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9TUEQgICAgICAgICAgICAgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX01PVE9SIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fQVBJX01DX1NQRCkKKyNkZWZpbmUgTE1fQVBJX1NQRF9FTiAgICAgICAgICAgKExNX0FQSV9TUEQgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1BEX0RJUyAgICAgICAgICAoTE1fQVBJX1NQRCB8ICgxIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfU0VUICAgICAgICAgIChMTV9BUElfU1BEIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NQRF9QQyAgICAgICAgICAgKExNX0FQSV9TUEQgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1BEX0lDICAgICAgICAgICAoTE1fQVBJX1NQRCB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfREMgICAgICAgICAgIChMTV9BUElfU1BEIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NQRF9SRUYgICAgICAgICAgKExNX0FQSV9TUEQgfCAoNiA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBCRUdJTiAjIyMjIworI2RlZmluZSBMTV9BUElfU1BEX1RfRU4gICAgICAgICAoTE1fQVBJX1NQRCB8ICg3IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfVF9TRVQgICAgICAgIChMTV9BUElfU1BEIHwgKDggPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NQRF9UX1NFVF9OT19BQ0sgKExNX0FQSV9TUEQgfCAoMTAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgRU5EICMjIyMjCisjZGVmaW5lIExNX0FQSV9TUERfU0VUX05PX0FDSyAgIChMTV9BUElfU1BEIHwgKDExIDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENvbnRyb2wgVm9sdGFnZSBDb21wZW5zYXRpb24gQ29udHJvbCBBUEkgZGVmaW5pdGlvbnMuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfVkNPTVAgICAgICAgICAgICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0FQSV9NQ19WQ09NUCkKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX0VOICAgICAgICAgKExNX0FQSV9WQ09NUCB8ICgwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WQ09NUF9ESVMgICAgICAgIChMTV9BUElfVkNPTVAgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVkNPTVBfU0VUICAgICAgICAoTE1fQVBJX1ZDT01QIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX0lOX1JBTVAgICAgKExNX0FQSV9WQ09NUCB8ICgzIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WQ09NUF9DT01QX1JBTVAgIChMTV9BUElfVkNPTVAgfCAoNCA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBCRUdJTiAjIyMjIworI2RlZmluZSBMTV9BUElfVkNPTVBfVF9FTiAgICAgICAoTE1fQVBJX1ZDT01QIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX1RfU0VUICAgICAgKExNX0FQSV9WQ09NUCB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WQ09NUF9UX1NFVF9OT19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMTV9BUElfVkNPTVAgfCAoOCA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBFTkQgIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX1NFVF9OT19BQ0sgKExNX0FQSV9WQ09NUCB8ICg5IDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIFBvc2l0aW9uIENvbnRyb2wgQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1BPUyAgICAgICAgICAgICAgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfTU9UT1IgfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9BUElfTUNfUE9TKQorI2RlZmluZSBMTV9BUElfUE9TX0VOICAgICAgICAgICAoTE1fQVBJX1BPUyB8ICgwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QT1NfRElTICAgICAgICAgIChMTV9BUElfUE9TIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BPU19TRVQgICAgICAgICAgKExNX0FQSV9QT1MgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUE9TX1BDICAgICAgICAgICAoTE1fQVBJX1BPUyB8ICgzIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QT1NfSUMgICAgICAgICAgIChMTV9BUElfUE9TIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BPU19EQyAgICAgICAgICAgKExNX0FQSV9QT1MgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUE9TX1JFRiAgICAgICAgICAoTE1fQVBJX1BPUyB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisvLyMjIyMjIEZJUlNUIEJFR0lOICMjIyMjCisjZGVmaW5lIExNX0FQSV9QT1NfVF9FTiAgICAgICAgIChMTV9BUElfUE9TIHwgKDcgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BPU19UX1NFVCAgICAgICAgKExNX0FQSV9QT1MgfCAoOCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUE9TX1RfU0VUX05PX0FDSyAoTE1fQVBJX1BPUyB8ICgxMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBFTkQgIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1BPU19TRVRfTk9fQUNLICAgKExNX0FQSV9QT1MgfCAoMTEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgQ3VycmVudCBDb250cm9sIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9JQ1RSTCAgICAgICAgICAgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX01PVE9SIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fQVBJX01DX0lDVFJMKQorI2RlZmluZSBMTV9BUElfSUNUUkxfRU4gICAgICAgICAoTE1fQVBJX0lDVFJMIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX0RJUyAgICAgICAgKExNX0FQSV9JQ1RSTCB8ICgxIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9TRVQgICAgICAgIChMTV9BUElfSUNUUkwgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfSUNUUkxfUEMgICAgICAgICAoTE1fQVBJX0lDVFJMIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX0lDICAgICAgICAgKExNX0FQSV9JQ1RSTCB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9EQyAgICAgICAgIChMTV9BUElfSUNUUkwgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBCRUdJTiAjIyMjIworI2RlZmluZSBMTV9BUElfSUNUUkxfVF9FTiAgICAgICAoTE1fQVBJX0lDVFJMIHwgKDYgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX1RfU0VUICAgICAgKExNX0FQSV9JQ1RSTCB8ICg3IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9UX1NFVF9OT19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMTV9BUElfSUNUUkwgfCAoOSA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBFTkQgIyMjIyMKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX1NFVF9OT19BQ0sgKExNX0FQSV9JQ1RSTCB8ICgxMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBGaXJtd2FyZSBVcGRhdGUgQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1VQRCAgICAgICAgICAgICAgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfVVBEQVRFKQorI2RlZmluZSBMTV9BUElfVVBEX1BJTkcgICAgICAgICAoTE1fQVBJX1VQRCB8ICgwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9VUERfRE9XTkxPQUQgICAgIChMTV9BUElfVVBEIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1VQRF9TRU5EX0RBVEEgICAgKExNX0FQSV9VUEQgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVVBEX1JFU0VUICAgICAgICAoTE1fQVBJX1VQRCB8ICgzIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9VUERfQUNLICAgICAgICAgIChMTV9BUElfVVBEIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0hXVkVSICAgICAgICAgICAgKExNX0FQSV9VUEQgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVVBEX1JFUVVFU1QgICAgICAoTE1fQVBJX1VQRCB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisvLyMjIyMjIEZJUlNUIEJFR0lOICMjIyMjCisjZGVmaW5lIExNX0FQSV9VTlRSVVNUX0VOICAgICAgIChMTV9BUElfVVBEIHwgKDExIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9UUlVTVF9FTiAgICAgICAgIChMTV9BUElfVVBEIHwgKDEyIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9UUlVTVF9IRUFSVEJFQVQgIChMTV9BUElfVVBEIHwgKDEzIDw8IENBTl9NU0dJRF9BUElfUykpCisvLyMjIyMjIEZJUlNUIEVORCAjIyMjIworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBTdGF0dXMgQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1NUQVRVUyAgICAgICAgICAgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfTU9UT1IgfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9BUElfTUNfU1RBVFVTKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1ZPTFRPVVQgICAoTE1fQVBJX1NUQVRVUyB8ICgwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfVk9MVEJVUyAgIChMTV9BUElfU1RBVFVTIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19DVVJSRU5UICAgKExNX0FQSV9TVEFUVVMgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1RFTVAgICAgICAoTE1fQVBJX1NUQVRVUyB8ICgzIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfUE9TICAgICAgIChMTV9BUElfU1RBVFVTIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19TUEQgICAgICAgKExNX0FQSV9TVEFUVVMgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX0xJTUlUICAgICAoTE1fQVBJX1NUQVRVUyB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfRkFVTFQgICAgIChMTV9BUElfU1RBVFVTIHwgKDcgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19QT1dFUiAgICAgKExNX0FQSV9TVEFUVVMgfCAoOCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX0NNT0RFICAgICAoTE1fQVBJX1NUQVRVUyB8ICg5IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfVk9VVCAgICAgIChMTV9BUElfU1RBVFVTIHwgKDEwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfU1RLWV9GTFQgIChMTV9BUElfU1RBVFVTIHwgKDExIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfRkxUX0NPVU5UIChMTV9BUElfU1RBVFVTIHwgKDEyIDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGVzZSBkZWZpbml0aW9ucyBhcmUgdXNlZCB3aXRoIHRoZSBieXRlIHRoYXQgaXMgcmV0dXJuZWQgZnJvbQorLy8gdGhlIHN0YXR1cyByZXF1ZXN0IGZvciBMTV9BUElfU1RBVFVTX0xJTUlULgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX0ZXRCAgICAgMHgwMQorI2RlZmluZSBMTV9TVEFUVVNfTElNSVRfUkVWICAgICAweDAyCisjZGVmaW5lIExNX1NUQVRVU19MSU1JVF9TRldEICAgIDB4MDQKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX1NSRVYgICAgMHgwOAorI2RlZmluZSBMTV9TVEFUVVNfTElNSVRfU1RLWV9GV0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIExNX1NUQVRVU19MSU1JVF9TVEtZX1JFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX1NUS1lfU0ZXRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBMTV9TVEFUVVNfTElNSVRfU1RLWV9TUkVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBMTSBNb3RvciBDb250cm9sIHN0YXR1cyBjb2RlcyByZXR1cm5lZCBkdWUgdG8gdGhlIENBTl9TVEFUVVNfQ09ERV9NIGZpZWxkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fU1RBVFVTX0ZBVUxUX0lMSU1JVCAgMHgwMQorI2RlZmluZSBMTV9TVEFUVVNfRkFVTFRfVExJTUlUICAweDAyCisjZGVmaW5lIExNX1NUQVRVU19GQVVMVF9WTElNSVQgIDB4MDQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgQ29uZmlndXJhdGlvbiBBUEkgZGVmaW5pdGlvbnMuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfQ0ZHICAgICAgICAgICAgICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0FQSV9NQ19DRkcpCisjZGVmaW5lIExNX0FQSV9DRkdfTlVNX0JSVVNIRVMgIChMTV9BUElfQ0ZHIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0NGR19FTkNfTElORVMgICAgKExNX0FQSV9DRkcgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfQ0ZHX1BPVF9UVVJOUyAgICAoTE1fQVBJX0NGRyB8ICgyIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9DRkdfQlJBS0VfQ09BU1QgIChMTV9BUElfQ0ZHIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0NGR19MSU1JVF9NT0RFICAgKExNX0FQSV9DRkcgfCAoNCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfQ0ZHX0xJTUlUX0ZXRCAgICAoTE1fQVBJX0NGRyB8ICg1IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9DRkdfTElNSVRfUkVWICAgIChMTV9BUElfQ0ZHIHwgKDYgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0NGR19NQVhfVk9VVCAgICAgKExNX0FQSV9DRkcgfCAoNyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfQ0ZHX0ZBVUxUX1RJTUUgICAoTE1fQVBJX0NGRyB8ICg4IDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIEFDSyBBUEkgZGVmaW5pdGlvbi4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9BQ0sgICAgICAgICAgICAgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX01PVE9SIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5fQVBJX01DX0FDSykKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSA4IGJpdCB2YWx1ZXMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgYSBjYWxsIHRvIExNX0FQSV9TVEFUVVNfSFdWRVIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9IV1ZFUl9VTktOT1dOICAgICAgICAweDAwCisjZGVmaW5lIExNX0hXVkVSX0pBR18xXzAgICAgICAgIDB4MDEKKyNkZWZpbmUgTE1fSFdWRVJfSkFHXzJfMCAgICAgICAgMHgwMgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIDggYml0IHZhbHVlcyB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSBhIGNhbGwgdG8gTE1fQVBJX1NUQVRVU19DTU9ERS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX1NUQVRVU19DTU9ERV9WT0xUICAgIDB4MDAKKyNkZWZpbmUgTE1fU1RBVFVTX0NNT0RFX0NVUlJFTlQgMHgwMQorI2RlZmluZSBMTV9TVEFUVVNfQ01PREVfU1BFRUQgICAweDAyCisjZGVmaW5lIExNX1NUQVRVU19DTU9ERV9QT1MgICAgIDB4MDMKKyNkZWZpbmUgTE1fU1RBVFVTX0NNT0RFX1ZDT01QICAgMHgwNAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIHZhbHVlcyB0aGF0IGNhbiBzcGVjaWZpZWQgYXMgdGhlIHBvc2l0aW9uIG9yIHNwZWVkIHJlZmVyZW5jZS4gIE5vdCBhbGwKKy8vIHZhbHVlcyBhcmUgdmFsaWQgZm9yIGVhY2ggcmVmZXJlbmNlOyBpZiBhbiBpbnZhbGlkIHJlZmVyZW5jZSBpcyBzZXQsIHRoZW4KKy8vIG5vbmUgd2lsbCBiZSBzZWxlY3RlZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX1JFRl9FTkNPREVSICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTE1fUkVGX1BPVCAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBMTV9SRUZfSU5WX0VOQ09ERVIgICAgICAweDAyCisjZGVmaW5lIExNX1JFRl9RVUFEX0VOQ09ERVIgICAgIDB4MDMKKyNkZWZpbmUgTE1fUkVGX05PTkUgICAgICAgICAgICAgMHhmZgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZsYWdzIHRoYXQgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnRseSBhY3RpdmUgZmF1bHQgc291cmNlcy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0ZBVUxUX0NVUlJFTlQgICAgICAgIDB4MDEKKyNkZWZpbmUgTE1fRkFVTFRfVEVNUCAgICAgICAgICAgMHgwMgorI2RlZmluZSBMTV9GQVVMVF9WQlVTICAgICAgICAgICAweDA0CisjZGVmaW5lIExNX0ZBVUxUX0dBVEVfRFJJVkUgICAgIDB4MDgKKyNkZWZpbmUgTE1fRkFVTFRfQ09NTSAgICAgICAgICAgMHgxMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBQZXJpb2RpYyBTdGF0dXMgQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1BTVEFUICAgICAgICAgICAgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfTU9UT1IgfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9BUElfTUNfUFNUQVQpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9QRVJfRU5fUzAgIChMTV9BUElfUFNUQVQgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfUEVSX0VOX1MxICAoTE1fQVBJX1BTVEFUIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX1BFUl9FTl9TMiAgKExNX0FQSV9QU1RBVCB8ICgyIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9QRVJfRU5fUzMgIChMTV9BUElfUFNUQVQgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfQ0ZHX1MwICAgICAoTE1fQVBJX1BTVEFUIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0NGR19TMSAgICAgKExNX0FQSV9QU1RBVCB8ICg1IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9DRkdfUzIgICAgIChMTV9BUElfUFNUQVQgfCAoNiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfQ0ZHX1MzICAgICAoTE1fQVBJX1BTVEFUIHwgKDcgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0RBVEFfUzAgICAgKExNX0FQSV9QU1RBVCB8ICg4IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9EQVRBX1MxICAgIChMTV9BUElfUFNUQVQgfCAoOSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfREFUQV9TMiAgICAoTE1fQVBJX1BTVEFUIHwgKDEwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9EQVRBX1MzICAgIChMTV9BUElfUFNUQVQgfCAoMTEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGRhdGEgdGhlIFBlcmlvZGljIFN0YXR1cworLy8gTWVzc2FnZSBieXRlcy4gIEJ5dGVzIG9mIGEgbXVsdGktYnl0ZSBkYXRhIHZhbHVlcyBhcmUgZW5jb2RlZCBhcworLy8gbGl0dGxlLWVuZGlhbiwgdGhlcmVmb3JlIEIwIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fUFNUQVRfRU5EICAgICAgICAgICAgMAorI2RlZmluZSBMTV9QU1RBVF9WT0xUT1VUX0IwICAgICAxCisjZGVmaW5lIExNX1BTVEFUX1ZPTFRPVVRfQjEgICAgIDIKKyNkZWZpbmUgTE1fUFNUQVRfVk9MVEJVU19CMCAgICAgMworI2RlZmluZSBMTV9QU1RBVF9WT0xUQlVTX0IxICAgICA0CisjZGVmaW5lIExNX1BTVEFUX0NVUlJFTlRfQjAgICAgIDUKKyNkZWZpbmUgTE1fUFNUQVRfQ1VSUkVOVF9CMSAgICAgNgorI2RlZmluZSBMTV9QU1RBVF9URU1QX0IwICAgICAgICA3CisjZGVmaW5lIExNX1BTVEFUX1RFTVBfQjEgICAgICAgIDgKKyNkZWZpbmUgTE1fUFNUQVRfUE9TX0IwICAgICAgICAgOQorI2RlZmluZSBMTV9QU1RBVF9QT1NfQjEgICAgICAgICAxMAorI2RlZmluZSBMTV9QU1RBVF9QT1NfQjIgICAgICAgICAxMQorI2RlZmluZSBMTV9QU1RBVF9QT1NfQjMgICAgICAgICAxMgorI2RlZmluZSBMTV9QU1RBVF9TUERfQjAgICAgICAgICAxMworI2RlZmluZSBMTV9QU1RBVF9TUERfQjEgICAgICAgICAxNAorI2RlZmluZSBMTV9QU1RBVF9TUERfQjIgICAgICAgICAxNQorI2RlZmluZSBMTV9QU1RBVF9TUERfQjMgICAgICAgICAxNgorI2RlZmluZSBMTV9QU1RBVF9MSU1JVF9OQ0xSICAgICAxNworI2RlZmluZSBMTV9QU1RBVF9MSU1JVF9DTFIgICAgICAxOAorI2RlZmluZSBMTV9QU1RBVF9GQVVMVCAgICAgICAgICAxOQorI2RlZmluZSBMTV9QU1RBVF9TVEtZX0ZMVF9OQ0xSICAyMAorI2RlZmluZSBMTV9QU1RBVF9TVEtZX0ZMVF9DTFIgICAyMQorI2RlZmluZSBMTV9QU1RBVF9WT1VUX0IwICAgICAgICAyMgorI2RlZmluZSBMTV9QU1RBVF9WT1VUX0IxICAgICAgICAyMworI2RlZmluZSBMTV9QU1RBVF9GTFRfQ09VTlRfQ1VSUkVOVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9URU1QIDI1CisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9WT0xUQlVTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgTE1fUFNUQVRfRkxUX0NPVU5UX0dBVEUgMjcKKyNkZWZpbmUgTE1fUFNUQVRfRkxUX0NPVU5UX0NPTU0gMjgKKyNkZWZpbmUgTE1fUFNUQVRfQ0FOU1RTICAgICAgICAgMjkKKyNkZWZpbmUgTE1fUFNUQVRfQ0FORVJSX0IwICAgICAgMzAKKyNkZWZpbmUgTE1fUFNUQVRfQ0FORVJSX0IxICAgICAgMzEKKworI2VuZGlmIC8vIF9fQ0FOX1BST1RPX0hfXwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ0FOSmFndWFyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU5KYWd1YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q2ZGIzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ0FOSmFndWFyLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKyNpbmNsdWRlICJDQU5TcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJIQUwvU2VtYXBob3JlLmhwcCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisvKioKKyAqIEx1bWluYXJ5IE1pY3JvIC8gVmV4IFJvYm90aWNzIEphZ3VhciBTcGVlZCBDb250cm9sCisgKi8KK2NsYXNzIENBTkphZ3VhciA6IHB1YmxpYyBNb3RvclNhZmV0eSwKKwkJCQkJcHVibGljIENBTlNwZWVkQ29udHJvbGxlciwKKwkJCQkJcHVibGljIEVycm9yQmFzZQoreworcHVibGljOgorCS8vIFRoZSBpbnRlcm5hbCBQSUQgY29udHJvbCBsb29wIGluIHRoZSBKYWd1YXIgcnVucyBhdCAxa0h6LgorCXN0YXRpYyBjb25zdCBpbnQzMl90IGtDb250cm9sbGVyUmF0ZSA9IDEwMDA7CisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0FwcHJveEJ1c1ZvbHRhZ2UgPSAxMi4wOworCisJLy8gQ29udHJvbCBtb2RlIHRhZ3MKKwkvKiogU2V0cyBhbiBlbmNvZGVyIGFzIHRoZSBzcGVlZCByZWZlcmVuY2Ugb25seS4gPGJyPiBQYXNzZWQgYXMgdGhlICJ0YWciIHdoZW4gc2V0dGluZyB0aGUgY29udHJvbCBtb2RlLiovCisJc3RhdGljIGNvbnN0IHN0cnVjdCBFbmNvZGVyU3RydWN0ICAgICAgIHt9IEVuY29kZXI7CisJLyoqIFNldHMgYSBxdWFkcmF0dXJlIGVuY29kZXIgYXMgdGhlIHBvc2l0aW9uIGFuZCBzcGVlZCByZWZlcmVuY2UuIDxicj4gUGFzc2VkIGFzIHRoZSAidGFnIiB3aGVuIHNldHRpbmcgdGhlIGNvbnRyb2wgbW9kZS4qLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgUXVhZEVuY29kZXJTdHJ1Y3QgICB7fSBRdWFkRW5jb2RlcjsKKwkvKiogU2V0cyBhIHBvdGVudGlvbWV0ZXIgYXMgdGhlIHBvc2l0aW9uIHJlZmVyZW5jZSBvbmx5LiA8YnI+IFBhc3NlZCBhcyB0aGUgInRhZyIgd2hlbiBzZXR0aW5nIHRoZSBjb250cm9sIG1vZGUuICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCBQb3RlbnRpb21ldGVyU3RydWN0IHt9IFBvdGVudGlvbWV0ZXI7CisKKwlleHBsaWNpdCBDQU5KYWd1YXIodWludDhfdCBkZXZpY2VOdW1iZXIpOworCXZpcnR1YWwgfkNBTkphZ3VhcigpOworCisJdWludDhfdCBnZXREZXZpY2VOdW1iZXIoKSBjb25zdDsKKwl1aW50OF90IEdldEhhcmR3YXJlVmVyc2lvbigpOworCisJLy8gUElET3V0cHV0IGludGVyZmFjZQorCXZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpOworCisJLy8gQ29udHJvbCBtb2RlIG1ldGhvZHMKKwl2b2lkIEVuYWJsZUNvbnRyb2woZG91YmxlIGVuY29kZXJJbml0aWFsUG9zaXRpb24gPSAwLjApOworCXZvaWQgRGlzYWJsZUNvbnRyb2woKTsKKworCXZvaWQgU2V0UGVyY2VudE1vZGUoKTsKKwl2b2lkIFNldFBlcmNlbnRNb2RlKEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KTsKKwl2b2lkIFNldFBlcmNlbnRNb2RlKFF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldik7CisJdm9pZCBTZXRQZXJjZW50TW9kZShQb3RlbnRpb21ldGVyU3RydWN0KTsKKworCXZvaWQgU2V0Q3VycmVudE1vZGUoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisJdm9pZCBTZXRDdXJyZW50TW9kZShFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisJdm9pZCBTZXRDdXJyZW50TW9kZShRdWFkRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworCXZvaWQgU2V0Q3VycmVudE1vZGUoUG90ZW50aW9tZXRlclN0cnVjdCwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisKKwl2b2lkIFNldFNwZWVkTW9kZShFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisJdm9pZCBTZXRTcGVlZE1vZGUoUXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKTsKKworCXZvaWQgU2V0UG9zaXRpb25Nb2RlKFF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisJdm9pZCBTZXRQb3NpdGlvbk1vZGUoUG90ZW50aW9tZXRlclN0cnVjdCwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisKKwl2b2lkIFNldFZvbHRhZ2VNb2RlKCk7CisJdm9pZCBTZXRWb2x0YWdlTW9kZShFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldik7CisJdm9pZCBTZXRWb2x0YWdlTW9kZShRdWFkRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYpOworCXZvaWQgU2V0Vm9sdGFnZU1vZGUoUG90ZW50aW9tZXRlclN0cnVjdCk7CisKKwkvLyBDQU5TcGVlZENvbnRyb2xsZXIgaW50ZXJmYWNlCisJdmlydHVhbCBmbG9hdCBHZXQoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cD0wKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBTZXRQKGRvdWJsZSBwKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0SShkb3VibGUgaSkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIFNldEQoZG91YmxlIGQpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgb3ZlcnJpZGU7CisJdmlydHVhbCBkb3VibGUgR2V0UCgpIG92ZXJyaWRlOworCXZpcnR1YWwgZG91YmxlIEdldEkoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXREKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9hdCBHZXRCdXNWb2x0YWdlKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRWb2x0YWdlKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRDdXJyZW50KCkgb3ZlcnJpZGU7CisJdmlydHVhbCBmbG9hdCBHZXRUZW1wZXJhdHVyZSgpIG92ZXJyaWRlOworCXZpcnR1YWwgZG91YmxlIEdldFBvc2l0aW9uKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBkb3VibGUgR2V0U3BlZWQoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGJvb2wgR2V0Rm9yd2FyZExpbWl0T0soKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGJvb2wgR2V0UmV2ZXJzZUxpbWl0T0soKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHVpbnQxNl90IEdldEZhdWx0cygpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBTZXRWb2x0YWdlUmFtcFJhdGUoZG91YmxlIHJhbXBSYXRlKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHVpbnQzMl90IEdldEZpcm13YXJlVmVyc2lvbigpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdOZXV0cmFsTW9kZShOZXV0cmFsTW9kZSBtb2RlKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KHVpbnQxNl90IGNvZGVzUGVyUmV2KSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKHVpbnQxNl90IHR1cm5zKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnU29mdFBvc2l0aW9uTGltaXRzKGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbiwgZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZVNvZnRQb3NpdGlvbkxpbWl0cygpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdMaW1pdE1vZGUoTGltaXRNb2RlIG1vZGUpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdGb3J3YXJkTGltaXQoZG91YmxlIGZvcndhcmRMaW1pdFBvc2l0aW9uKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnUmV2ZXJzZUxpbWl0KGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ01heE91dHB1dFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdGYXVsdFRpbWUoZmxvYXQgZmF1bHRUaW1lKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0Q29udHJvbE1vZGUoQ29udHJvbE1vZGUgbW9kZSk7CisJdmlydHVhbCBDb250cm9sTW9kZSBHZXRDb250cm9sTW9kZSgpOworCisgCXN0YXRpYyB2b2lkIFVwZGF0ZVN5bmNHcm91cCh1aW50OF90IHN5bmNHcm91cCk7CisKKwl2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCk7CisJZmxvYXQgR2V0RXhwaXJhdGlvbigpOworCWJvb2wgSXNBbGl2ZSgpOworCXZvaWQgU3RvcE1vdG9yKCk7CisJYm9vbCBJc1NhZmV0eUVuYWJsZWQoKTsKKwl2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwl2b2lkIEdldERlc2NyaXB0aW9uKGNoYXIgKmRlc2MpOworCXVpbnQ4X3QgR2V0RGV2aWNlSUQoKTsKKworcHJvdGVjdGVkOgorCS8vIENvbnRyb2wgbW9kZSBoZWxwZXJzCisJdm9pZCBTZXRTcGVlZFJlZmVyZW5jZSh1aW50OF90IHJlZmVyZW5jZSk7CisJdWludDhfdCBHZXRTcGVlZFJlZmVyZW5jZSgpOworCisJdm9pZCBTZXRQb3NpdGlvblJlZmVyZW5jZSh1aW50OF90IHJlZmVyZW5jZSk7CisJdWludDhfdCBHZXRQb3NpdGlvblJlZmVyZW5jZSgpOworCisJdWludDhfdCBwYWNrUGVyY2VudGFnZSh1aW50OF90ICpidWZmZXIsIGRvdWJsZSB2YWx1ZSk7CisJdWludDhfdCBwYWNrRlhQOF84KHVpbnQ4X3QgKmJ1ZmZlciwgZG91YmxlIHZhbHVlKTsKKwl1aW50OF90IHBhY2tGWFAxNl8xNih1aW50OF90ICpidWZmZXIsIGRvdWJsZSB2YWx1ZSk7CisJdWludDhfdCBwYWNraW50MTZfdCh1aW50OF90ICpidWZmZXIsIGludDE2X3QgdmFsdWUpOworCXVpbnQ4X3QgcGFja2ludDMyX3QodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IHZhbHVlKTsKKwlkb3VibGUgdW5wYWNrUGVyY2VudGFnZSh1aW50OF90ICpidWZmZXIpOworCWRvdWJsZSB1bnBhY2tGWFA4XzgodWludDhfdCAqYnVmZmVyKTsKKwlkb3VibGUgdW5wYWNrRlhQMTZfMTYodWludDhfdCAqYnVmZmVyKTsKKwlpbnQxNl90IHVucGFja2ludDE2X3QodWludDhfdCAqYnVmZmVyKTsKKwlpbnQzMl90IHVucGFja2ludDMyX3QodWludDhfdCAqYnVmZmVyKTsKKworCXZvaWQgc2VuZE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90ICpkYXRhLCB1aW50OF90IGRhdGFTaXplLCBpbnQzMl90IHBlcmlvZCA9IENBTl9TRU5EX1BFUklPRF9OT19SRVBFQVQpOworCXZvaWQgcmVxdWVzdE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCBpbnQzMl90IHBlcmlvZCA9IENBTl9TRU5EX1BFUklPRF9OT19SRVBFQVQpOworCWJvb2wgZ2V0TWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIHVpbnQzMl90IG1hc2ssIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgKmRhdGFTaXplKTsKKworCXZvaWQgc2V0dXBQZXJpb2RpY1N0YXR1cygpOworCXZvaWQgdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKworCXVpbnQ4X3QgbV9kZXZpY2VOdW1iZXI7CisJZmxvYXQgbV92YWx1ZTsKKworCS8vIFBhcmFtZXRlcnMvY29uZmlndXJhdGlvbgorCUNvbnRyb2xNb2RlIG1fY29udHJvbE1vZGU7CisJdWludDhfdCBtX3NwZWVkUmVmZXJlbmNlOworCXVpbnQ4X3QgbV9wb3NpdGlvblJlZmVyZW5jZTsKKwlkb3VibGUgbV9wOworCWRvdWJsZSBtX2k7CisJZG91YmxlIG1fZDsKKwlOZXV0cmFsTW9kZSBtX25ldXRyYWxNb2RlOworCXVpbnQxNl90IG1fZW5jb2RlckNvZGVzUGVyUmV2OworCXVpbnQxNl90IG1fcG90ZW50aW9tZXRlclR1cm5zOworCUxpbWl0TW9kZSBtX2xpbWl0TW9kZTsKKwlkb3VibGUgbV9mb3J3YXJkTGltaXQ7CisJZG91YmxlIG1fcmV2ZXJzZUxpbWl0OworCWRvdWJsZSBtX21heE91dHB1dFZvbHRhZ2U7CisJZG91YmxlIG1fdm9sdGFnZVJhbXBSYXRlOworCWZsb2F0IG1fZmF1bHRUaW1lOworCisJLy8gV2hpY2ggcGFyYW1ldGVycyBoYXZlIGJlZW4gdmVyaWZpZWQgc2luY2UgdGhleSB3ZXJlIGxhc3Qgc2V0PworCWJvb2wgbV9jb250cm9sTW9kZVZlcmlmaWVkOworCWJvb2wgbV9zcGVlZFJlZlZlcmlmaWVkOworCWJvb2wgbV9wb3NSZWZWZXJpZmllZDsKKwlib29sIG1fcFZlcmlmaWVkOworCWJvb2wgbV9pVmVyaWZpZWQ7CisJYm9vbCBtX2RWZXJpZmllZDsKKwlib29sIG1fbmV1dHJhbE1vZGVWZXJpZmllZDsKKwlib29sIG1fZW5jb2RlckNvZGVzUGVyUmV2VmVyaWZpZWQ7CisJYm9vbCBtX3BvdGVudGlvbWV0ZXJUdXJuc1ZlcmlmaWVkOworCWJvb2wgbV9mb3J3YXJkTGltaXRWZXJpZmllZDsKKwlib29sIG1fcmV2ZXJzZUxpbWl0VmVyaWZpZWQ7CisJYm9vbCBtX2xpbWl0TW9kZVZlcmlmaWVkOworCWJvb2wgbV9tYXhPdXRwdXRWb2x0YWdlVmVyaWZpZWQ7CisJYm9vbCBtX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkOworCWJvb2wgbV9mYXVsdFRpbWVWZXJpZmllZDsKKworCS8vIFN0YXR1cyBkYXRhCisJZmxvYXQgbV9idXNWb2x0YWdlOworCWZsb2F0IG1fb3V0cHV0Vm9sdGFnZTsKKwlmbG9hdCBtX291dHB1dEN1cnJlbnQ7CisJZmxvYXQgbV90ZW1wZXJhdHVyZTsKKwlkb3VibGUgbV9wb3NpdGlvbjsKKwlkb3VibGUgbV9zcGVlZDsKKwl1aW50OF90IG1fbGltaXRzOworCXVpbnQxNl90IG1fZmF1bHRzOworCXVpbnQzMl90IG1fZmlybXdhcmVWZXJzaW9uOworCXVpbnQ4X3QgbV9oYXJkd2FyZVZlcnNpb247CisKKwkvLyBXaGljaCBwZXJpb2RpYyBzdGF0dXMgbWVzc2FnZXMgaGF2ZSB3ZSByZWNlaXZlZCBhdCBsZWFzdCBvbmNlPworCWJvb2wgbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UwOworCWJvb2wgbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UxOworCWJvb2wgbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UyOworCisJYm9vbCBtX2NvbnRyb2xFbmFibGVkOworCisJdm9pZCB2ZXJpZnkoKTsKKworCU1vdG9yU2FmZXR5SGVscGVyICptX3NhZmV0eUhlbHBlcjsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRDQU5KYWd1YXIoKTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU5TcGVlZENvbnRyb2xsZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NBTlNwZWVkQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDMwODgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9DQU5TcGVlZENvbnRyb2xsZXIuaApAQCAtMCwwICsxLDk3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisKKy8qKgorICogSW50ZXJmYWNlIGZvciAic21hcnQiIENBTi1iYXNlZCBzcGVlZCBjb250cm9sbGVycy4KKyAqIEBzZWUgQ0FOSmFndWFyCisgKiBAc2VlIENBTlRhbG9uCisgKi8KK2NsYXNzIENBTlNwZWVkQ29udHJvbGxlciA6IHB1YmxpYyBTcGVlZENvbnRyb2xsZXIKK3sKK3B1YmxpYzoKKwllbnVtIENvbnRyb2xNb2RlIHsKKwkJa1BlcmNlbnRWYnVzPTAsCisJCWtDdXJyZW50PTEsCisJCWtTcGVlZD0yLAorCQlrUG9zaXRpb249MywKKwkJa1ZvbHRhZ2U9NCwKKyAgICBrRm9sbG93ZXI9NSAvLyBOb3Qgc3VwcG9ydGVkIGluIEphZ3Vhci4KKwl9OworCisJZW51bSBGYXVsdHMgeworCQlrQ3VycmVudEZhdWx0ID0gMSwKKwkJa1RlbXBlcmF0dXJlRmF1bHQgPSAyLAorCQlrQnVzVm9sdGFnZUZhdWx0ID0gNCwKKwkJa0dhdGVEcml2ZXJGYXVsdCA9IDgsCisJCS8qIFNSWCBleHRlbnNpb25zICovCisJCWtGd2RMaW1pdFN3aXRjaCA9IDB4MTAsCisJCWtSZXZMaW1pdFN3aXRjaCA9IDB4MjAsCisJCWtGd2RTb2Z0TGltaXQgPSAweDQwLAorCQlrUmV2U29mdExpbWl0ID0gMHg4MCwKKwl9OworCisJZW51bSBMaW1pdHMgeworCQlrRm9yd2FyZExpbWl0ID0gMSwKKwkJa1JldmVyc2VMaW1pdCA9IDIKKwl9OworCisJZW51bSBOZXV0cmFsTW9kZSB7CisJCS8qKiBVc2UgdGhlIE5ldXRyYWxNb2RlIHRoYXQgaXMgc2V0IGJ5IHRoZSBqdW1wZXIgd2lyZSBvbiB0aGUgQ0FOIGRldmljZSAqLworCQlrTmV1dHJhbE1vZGVfSnVtcGVyID0gMCwKKwkJLyoqIFN0b3AgdGhlIG1vdG9yJ3Mgcm90YXRpb24gYnkgYXBwbHlpbmcgYSBmb3JjZS4gKi8KKwkJa05ldXRyYWxNb2RlX0JyYWtlID0gMSwKKwkJLyoqIERvIG5vdCBhdHRlbXB0IHRvIHN0b3AgdGhlIG1vdG9yLiBJbnN0ZWFkIGFsbG93IGl0IHRvIGNvYXN0IHRvIGEgc3RvcCB3aXRob3V0IGFwcGx5aW5nIHJlc2lzdGFuY2UuICovCisJCWtOZXV0cmFsTW9kZV9Db2FzdCA9IDIKKwl9OworCisJZW51bSBMaW1pdE1vZGUgeworCQkvKiogT25seSB1c2Ugc3dpdGNoZXMgZm9yIGxpbWl0cyAqLworCQlrTGltaXRNb2RlX1N3aXRjaElucHV0c09ubHkgPSAwLAorCQkvKiogVXNlIGJvdGggc3dpdGNoZXMgYW5kIHNvZnQgbGltaXRzICovCisJCWtMaW1pdE1vZGVfU29mdFBvc2l0aW9uTGltaXRzID0gMSwKKwkJLyogU1JYIGV4dGVuc2lvbnMgKi8KKwkJLyoqIERpc2FibGUgc3dpdGNoZXMgYW5kIGRpc2FibGUgc29mdCBsaW1pdHMgKi8KKwkJa0xpbWl0TW9kZV9TcnhEaXNhYmxlU3dpdGNoSW5wdXRzID0gMiwKKwl9OworCisJdmlydHVhbCBmbG9hdCBHZXQoKSA9IDA7CisJdmlydHVhbCB2b2lkIFNldChmbG9hdCB2YWx1ZSwgdWludDhfdCBzeW5jR3JvdXA9MCkgPSAwOworCXZpcnR1YWwgdm9pZCBEaXNhYmxlKCkgPSAwOworCXZpcnR1YWwgdm9pZCBTZXRQKGRvdWJsZSBwKSA9IDA7CisJdmlydHVhbCB2b2lkIFNldEkoZG91YmxlIGkpID0gMDsKKwl2aXJ0dWFsIHZvaWQgU2V0RChkb3VibGUgZCkgPSAwOworCXZpcnR1YWwgdm9pZCBTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgPSAwOworCXZpcnR1YWwgZG91YmxlIEdldFAoKSA9IDA7CisJdmlydHVhbCBkb3VibGUgR2V0SSgpID0gMDsKKwl2aXJ0dWFsIGRvdWJsZSBHZXREKCkgPSAwOworCXZpcnR1YWwgZmxvYXQgR2V0QnVzVm9sdGFnZSgpID0gMDsKKwl2aXJ0dWFsIGZsb2F0IEdldE91dHB1dFZvbHRhZ2UoKSA9IDA7CisJdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRDdXJyZW50KCkgPSAwOworCXZpcnR1YWwgZmxvYXQgR2V0VGVtcGVyYXR1cmUoKSA9IDA7CisJdmlydHVhbCBkb3VibGUgR2V0UG9zaXRpb24oKSA9IDA7CisJdmlydHVhbCBkb3VibGUgR2V0U3BlZWQoKSA9IDA7CisJdmlydHVhbCBib29sIEdldEZvcndhcmRMaW1pdE9LKCkgPSAwOworCXZpcnR1YWwgYm9vbCBHZXRSZXZlcnNlTGltaXRPSygpID0gMDsKKwl2aXJ0dWFsIHVpbnQxNl90IEdldEZhdWx0cygpID0gMDsKKwl2aXJ0dWFsIHZvaWQgU2V0Vm9sdGFnZVJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSkgPSAwOworCXZpcnR1YWwgdWludDMyX3QgR2V0RmlybXdhcmVWZXJzaW9uKCkgPSAwOworCXZpcnR1YWwgdm9pZCBDb25maWdOZXV0cmFsTW9kZShOZXV0cmFsTW9kZSBtb2RlKSA9IDA7CisJdmlydHVhbCB2b2lkIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldih1aW50MTZfdCBjb2Rlc1BlclJldikgPSAwOworCXZpcnR1YWwgdm9pZCBDb25maWdQb3RlbnRpb21ldGVyVHVybnModWludDE2X3QgdHVybnMpID0gMDsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnU29mdFBvc2l0aW9uTGltaXRzKGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbiwgZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKSA9IDA7CisJdmlydHVhbCB2b2lkIERpc2FibGVTb2Z0UG9zaXRpb25MaW1pdHMoKSA9IDA7CisJdmlydHVhbCB2b2lkIENvbmZpZ0xpbWl0TW9kZShMaW1pdE1vZGUgbW9kZSkgPSAwOworCXZpcnR1YWwgdm9pZCBDb25maWdGb3J3YXJkTGltaXQoZG91YmxlIGZvcndhcmRMaW1pdFBvc2l0aW9uKSA9IDA7CisJdmlydHVhbCB2b2lkIENvbmZpZ1JldmVyc2VMaW1pdChkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pID0gMDsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnTWF4T3V0cHV0Vm9sdGFnZShkb3VibGUgdm9sdGFnZSkgPSAwOworCXZpcnR1YWwgdm9pZCBDb25maWdGYXVsdFRpbWUoZmxvYXQgZmF1bHRUaW1lKSA9IDA7CisgIC8vIEhvbGQgb2ZmIG9uIGludGVyZmFjZSB1bnRpbCB3ZSBmaWd1cmUgb3V0IENvbnRyb2xNb2RlIGVudW1zLgorLy8JdmlydHVhbCB2b2lkIFNldENvbnRyb2xNb2RlKENvbnRyb2xNb2RlIG1vZGUpID0gMDsKKy8vCXZpcnR1YWwgQ29udHJvbE1vZGUgR2V0Q29udHJvbE1vZGUoKSA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ0FOVGFsb24uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NBTlRhbG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyMGVhMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NBTlRhbG9uLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisjaW5jbHVkZSAiQ0FOU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKworY2xhc3MgQ2FuVGFsb25TUlg7CisKKy8qKgorICogQ1RSRSBUYWxvbiBTUlggU3BlZWQgQ29udHJvbGxlciB3aXRoIENBTiBDb250cm9sCisgKi8KK2NsYXNzIENBTlRhbG9uIDogcHVibGljIE1vdG9yU2FmZXR5LAorICAgICAgICAgICAgICAgICBwdWJsaWMgQ0FOU3BlZWRDb250cm9sbGVyLAorICAgICAgICAgICAgICAgICBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisgIGVudW0gRmVlZGJhY2tEZXZpY2UgeworICAgIFF1YWRFbmNvZGVyPTAsCisgICAgQW5hbG9nUG90PTIsCisgICAgQW5hbG9nRW5jb2Rlcj0zLAorICAgIEVuY1Jpc2luZz00LAorICAgIEVuY0ZhbGxpbmc9NQorICB9OworICBlbnVtIFN0YXR1c0ZyYW1lUmF0ZSB7CisgICAgU3RhdHVzRnJhbWVSYXRlR2VuZXJhbD0wLAorICAgIFN0YXR1c0ZyYW1lUmF0ZUZlZWRiYWNrPTEsCisgICAgU3RhdHVzRnJhbWVSYXRlUXVhZEVuY29kZXI9MiwKKyAgICBTdGF0dXNGcmFtZVJhdGVBbmFsb2dUZW1wVmJhdD0zLAorICB9OworCWV4cGxpY2l0IENBTlRhbG9uKGludCBkZXZpY2VOdW1iZXIpOworCWV4cGxpY2l0IENBTlRhbG9uKGludCBkZXZpY2VOdW1iZXIsaW50IGNvbnRyb2xQZXJpb2RNcyk7CisJdmlydHVhbCB+Q0FOVGFsb24oKTsKKworCS8vIFBJRENvbnRyb2xsZXIgaW50ZXJmYWNlCisJdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCkgb3ZlcnJpZGU7CisKKwkvLyBNb3RvclNhZmV0eSBpbnRlcmZhY2UKKwl2aXJ0dWFsIHZvaWQgU2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSBvdmVycmlkZTsKKwl2aXJ0dWFsIGZsb2F0IEdldEV4cGlyYXRpb24oKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGJvb2wgSXNBbGl2ZSgpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBTdG9wTW90b3IoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpIG92ZXJyaWRlOworCXZpcnR1YWwgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgR2V0RGVzY3JpcHRpb24oY2hhciAqZGVzYykgb3ZlcnJpZGU7CisKKwkvLyBDQU5TcGVlZENvbnRyb2xsZXIgaW50ZXJmYWNlCisJdmlydHVhbCBmbG9hdCBHZXQoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cD0wKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRW5hYmxlQ29udHJvbCgpOworCXZpcnR1YWwgdm9pZCBTZXRQKGRvdWJsZSBwKSBvdmVycmlkZTsKKwl2aXJ0dWFsIHZvaWQgU2V0SShkb3VibGUgaSkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIFNldEQoZG91YmxlIGQpIG92ZXJyaWRlOworCXZvaWQgU2V0Rihkb3VibGUgZik7CisJdm9pZCBTZXRJem9uZSh1bnNpZ25lZCBpeik7CisJdmlydHVhbCB2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSBvdmVycmlkZTsKKwl2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZik7CisJdmlydHVhbCBkb3VibGUgR2V0UCgpIG92ZXJyaWRlOworCXZpcnR1YWwgZG91YmxlIEdldEkoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXREKCkgb3ZlcnJpZGU7CisJZG91YmxlIEdldEYoKTsKKwl2aXJ0dWFsIGZsb2F0IEdldEJ1c1ZvbHRhZ2UoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGZsb2F0IEdldE91dHB1dFZvbHRhZ2UoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGZsb2F0IEdldE91dHB1dEN1cnJlbnQoKSBvdmVycmlkZTsKKwl2aXJ0dWFsIGZsb2F0IEdldFRlbXBlcmF0dXJlKCkgb3ZlcnJpZGU7CisJdm9pZCBTZXRQb3NpdGlvbihkb3VibGUgcG9zKTsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRQb3NpdGlvbigpIG92ZXJyaWRlOworCXZpcnR1YWwgZG91YmxlIEdldFNwZWVkKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgaW50IEdldENsb3NlZExvb3BFcnJvcigpOworICB2aXJ0dWFsIGludCBHZXRBbmFsb2dJbigpOworICB2aXJ0dWFsIGludCBHZXRBbmFsb2dJblJhdygpOworICB2aXJ0dWFsIGludCBHZXRBbmFsb2dJblZlbCgpOworICB2aXJ0dWFsIGludCBHZXRFbmNQb3NpdGlvbigpOworICB2aXJ0dWFsIGludCBHZXRFbmNWZWwoKTsKKwlpbnQgR2V0UGluU3RhdGVRdWFkQSgpOworCWludCBHZXRQaW5TdGF0ZVF1YWRCKCk7CisJaW50IEdldFBpblN0YXRlUXVhZElkeCgpOworCWludCBJc0Z3ZExpbWl0U3dpdGNoQ2xvc2VkKCk7CisJaW50IElzUmV2TGltaXRTd2l0Y2hDbG9zZWQoKTsKKwlpbnQgR2V0TnVtYmVyT2ZRdWFkSWR4UmlzZXMoKTsKKwl2b2lkIFNldE51bWJlck9mUXVhZElkeFJpc2VzKGludCByaXNlcyk7CisJdmlydHVhbCBib29sIEdldEZvcndhcmRMaW1pdE9LKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBib29sIEdldFJldmVyc2VMaW1pdE9LKCkgb3ZlcnJpZGU7CisJdmlydHVhbCB1aW50MTZfdCBHZXRGYXVsdHMoKSBvdmVycmlkZTsKKwl1aW50MTZfdCBHZXRTdGlja3lGYXVsdHMoKTsKKwl2b2lkIENsZWFyU3RpY2t5RmF1bHRzKCk7CisJdmlydHVhbCB2b2lkIFNldFZvbHRhZ2VSYW1wUmF0ZShkb3VibGUgcmFtcFJhdGUpIG92ZXJyaWRlOworCXZpcnR1YWwgdWludDMyX3QgR2V0RmlybXdhcmVWZXJzaW9uKCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ05ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG1vZGUpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYodWludDE2X3QgY29kZXNQZXJSZXYpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdQb3RlbnRpb21ldGVyVHVybnModWludDE2X3QgdHVybnMpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdTb2Z0UG9zaXRpb25MaW1pdHMoZG91YmxlIGZvcndhcmRMaW1pdFBvc2l0aW9uLCBkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBEaXNhYmxlU29mdFBvc2l0aW9uTGltaXRzKCkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ0xpbWl0TW9kZShMaW1pdE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ0ZvcndhcmRMaW1pdChkb3VibGUgZm9yd2FyZExpbWl0UG9zaXRpb24pIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBDb25maWdSZXZlcnNlTGltaXQoZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKSBvdmVycmlkZTsKKwkvKioKKwkgKiBDaGFuZ2UgdGhlIGZ3ZCBsaW1pdCBzd2l0Y2ggc2V0dGluZyB0byBub3JtYWxseSBvcGVuIG9yIGNsb3NlZC4KKwkgKiBUYWxvbiB3aWxsIGRpc2FibGUgbW9tZW50YXJpbGx5IGlmIHRoZSBUYWxvbidzIGN1cnJlbnQgc2V0dGluZworCSAqIGlzIGRpc3NpbWlsYXIgdG8gdGhlIGNhbGxlcidzIHJlcXVlc3RlZCBzZXR0aW5nLgorCSAqCisJICogU2luY2UgVGFsb24gc2F2ZXMgc2V0dGluZyB0byBmbGFzaCB0aGlzIHNob3VsZCBvbmx5IGFmZmVjdAorCSAqIGEgZ2l2ZW4gVGFsb24gaW5pdGlhbGx5IGR1cmluZyByb2JvdCBpbnN0YWxsLgorCSAqCisJICogQHBhcmFtIG5vcm1hbGx5T3BlbiB0cnVlIGZvciBub3JtYWxseSBvcGVuLiAgZmFsc2UgZm9yIG5vcm1hbGx5IGNsb3NlZC4KKwkgKi8KKwl2b2lkIENvbmZpZ0Z3ZExpbWl0U3dpdGNoTm9ybWFsbHlPcGVuKGJvb2wgbm9ybWFsbHlPcGVuKTsKKwkvKioKKwkgKiBDaGFuZ2UgdGhlIHJldiBsaW1pdCBzd2l0Y2ggc2V0dGluZyB0byBub3JtYWxseSBvcGVuIG9yIGNsb3NlZC4KKwkgKiBUYWxvbiB3aWxsIGRpc2FibGUgbW9tZW50YXJpbGx5IGlmIHRoZSBUYWxvbidzIGN1cnJlbnQgc2V0dGluZworCSAqIGlzIGRpc3NpbWlsYXIgdG8gdGhlIGNhbGxlcidzIHJlcXVlc3RlZCBzZXR0aW5nLgorCSAqCisJICogU2luY2UgVGFsb24gc2F2ZXMgc2V0dGluZyB0byBmbGFzaCB0aGlzIHNob3VsZCBvbmx5IGFmZmVjdAorCSAqIGEgZ2l2ZW4gVGFsb24gaW5pdGlhbGx5IGR1cmluZyByb2JvdCBpbnN0YWxsLgorCSAqCisJICogQHBhcmFtIG5vcm1hbGx5T3BlbiB0cnVlIGZvciBub3JtYWxseSBvcGVuLiAgZmFsc2UgZm9yIG5vcm1hbGx5IGNsb3NlZC4KKwkgKi8KKwl2b2lkIENvbmZpZ1JldkxpbWl0U3dpdGNoTm9ybWFsbHlPcGVuKGJvb2wgbm9ybWFsbHlPcGVuKTsKKwl2aXJ0dWFsIHZvaWQgQ29uZmlnTWF4T3V0cHV0Vm9sdGFnZShkb3VibGUgdm9sdGFnZSkgb3ZlcnJpZGU7CisJdmlydHVhbCB2b2lkIENvbmZpZ0ZhdWx0VGltZShmbG9hdCBmYXVsdFRpbWUpIG92ZXJyaWRlOworCXZpcnR1YWwgdm9pZCBTZXRDb250cm9sTW9kZShDb250cm9sTW9kZSBtb2RlKTsKKyAgdm9pZCBTZXRGZWVkYmFja0RldmljZShGZWVkYmFja0RldmljZSBkZXZpY2UpOworCXZvaWQgU2V0U3RhdHVzRnJhbWVSYXRlTXMoU3RhdHVzRnJhbWVSYXRlIHN0YXRlRnJhbWUsIGludCBwZXJpb2RNcyk7CisJdmlydHVhbCBDb250cm9sTW9kZSBHZXRDb250cm9sTW9kZSgpOworCXZvaWQgU2V0U2Vuc29yRGlyZWN0aW9uKGJvb2wgcmV2ZXJzZVNlbnNvcik7CisJdm9pZCBTZXRDbG9zZUxvb3BSYW1wUmF0ZShkb3VibGUgcmFtcFJhdGUpOworCXZvaWQgU2VsZWN0UHJvZmlsZVNsb3QoaW50IHNsb3RJZHgpOworCWludCBHZXRJem9uZSgpOworCWludCBHZXRJYWNjdW0oKTsKKwl2b2lkIENsZWFySWFjY3VtKCk7CisJaW50IEdldEJyYWtlRW5hYmxlRHVyaW5nTmV1dHJhbCgpOworCisgIGJvb2wgSXNDb250cm9sRW5hYmxlZCgpOworICBkb3VibGUgR2V0U2V0cG9pbnQoKTsKK3ByaXZhdGU6CisgIC8vIFZhbHVlcyBmb3IgdmFyaW91cyBtb2RlcyBhcyBpcyBzZW50IGluIHRoZSBDQU4gcGFja2V0cyBmb3IgdGhlIFRhbG9uLgorICBlbnVtIFRhbG9uQ29udHJvbE1vZGUgeworCQlrVGhyb3R0bGU9MCwKKyAgICBrRm9sbG93ZXJNb2RlPTUsCisJCWtWb2x0YWdlTW9kZT00LAorCQlrUG9zaXRpb25Nb2RlPTEsCisJCWtTcGVlZE1vZGU9MiwKKwkJa0N1cnJlbnRNb2RlPTMsCisgICAga0Rpc2FibGVkPTE1CisgIH07CisKKwlpbnQgbV9kZXZpY2VOdW1iZXI7CisJQ2FuVGFsb25TUlggKm1faW1wbDsKKwlNb3RvclNhZmV0eUhlbHBlciAqbV9zYWZldHlIZWxwZXI7CisgIGludCBtX3Byb2ZpbGU7IC8vIFByb2ZpbGUgZnJvbSBDQU5UYWxvbiB0byB1c2UuIFNldCB0byB6ZXJvIHVudGlsIHdlIGNhbiBhY3R1YWxseSB0ZXN0IHRoaXMuCisKKyAgYm9vbCBtX2NvbnRyb2xFbmFibGVkOworICBDb250cm9sTW9kZSBtX2NvbnRyb2xNb2RlOworICBUYWxvbkNvbnRyb2xNb2RlIG1fc2VuZE1vZGU7CisKKyAgZG91YmxlIG1fc2V0UG9pbnQ7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzID0gNDAwMDsKKyAgLyoqCisgICAqIEZpeHVwIHRoZSBzZW5kTW9kZSBzbyBTZXQoKSBzZXJpYWxpemVzIHRoZSBjb3JyZWN0IGRlbWFuZCB2YWx1ZS4KKyAgICogQWxzbyBmaWxscyB0aGUgbW9kZVNlbGVjZXQgaW4gdGhlIGNvbnRyb2wgZnJhbWUgdG8gZGlzYWJsZWQuCisgICAqIEBwYXJhbSBtb2RlIENvbnRyb2wgbW9kZSB0byB1bHRpbWF0ZWx5IGVudGVyIG9uY2UgdXNlciBjYWxscyBTZXQoKS4KKyAgICogQHNlZSBTZXQoKQorICAgKi8KKyAgdm9pZCBBcHBseUNvbnRyb2xNb2RlKENBTlNwZWVkQ29udHJvbGxlcjo6Q29udHJvbE1vZGUgbW9kZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ29tcHJlc3Nvci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ29tcHJlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTZlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Db21wcmVzc29yLmgKQEAgLTAsMCArMSw0OSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgQ29tcHJlc3Nvcl9IXworI2RlZmluZSBDb21wcmVzc29yX0hfCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKKy8qKgorICogUENNIGNvbXByZXNzb3IKKyAqLworY2xhc3MgQ29tcHJlc3NvcjogcHVibGljIFNlbnNvckJhc2UgeworcHVibGljOgorCWV4cGxpY2l0IENvbXByZXNzb3IodWludDhfdCBwY21JRCk7CisJQ29tcHJlc3NvcigpOworCXZpcnR1YWwgfkNvbXByZXNzb3IoKTsKKworCXZvaWQgU3RhcnQoKTsKKwl2b2lkIFN0b3AoKTsKKwlib29sIEVuYWJsZWQoKTsKKworCWJvb2wgR2V0UHJlc3N1cmVTd2l0Y2hWYWx1ZSgpOworCisJZmxvYXQgR2V0Q29tcHJlc3NvckN1cnJlbnQoKTsKKworCXZvaWQgU2V0Q2xvc2VkTG9vcENvbnRyb2woYm9vbCBvbik7CisJYm9vbCBHZXRDbG9zZWRMb29wQ29udHJvbCgpOworCisJYm9vbCBHZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdCgpOworCWJvb2wgR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoKTsKKwlib29sIEdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoKTsKKwlib29sIEdldENvbXByZXNzb3JTaG9ydGVkRmF1bHQoKTsKKwlib29sIEdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCgpOworCWJvb2wgR2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KCk7CisJdm9pZCBDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpOworCitwcm90ZWN0ZWQ6CisJdm9pZCAqbV9wY21fcG9pbnRlcjsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRDb21wcmVzc29yKHVpbnQ4X3QgbW9kdWxlKTsKKwl2b2lkIFNldENvbXByZXNzb3IoYm9vbCBvbik7Cit9OworCisjZW5kaWYgLyogQ29tcHJlc3Nvcl9IXyAqLwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ29udHJvbGxlclBvd2VyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Db250cm9sbGVyUG93ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTRjZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ29udHJvbGxlclBvd2VyLmgKQEAgLTAsMCArMSwzMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fQ09OVFJPTExFUl9QT1dFUl9IX18KKyNkZWZpbmUgX19DT05UUk9MTEVSX1BPV0VSX0hfXworCisKKworY2xhc3MgQ29udHJvbGxlclBvd2VyCit7CisJcHVibGljOiAKKwkJc3RhdGljIGRvdWJsZSBHZXRJbnB1dFZvbHRhZ2UoKTsKKwkJc3RhdGljIGRvdWJsZSBHZXRJbnB1dEN1cnJlbnQoKTsKKwkJc3RhdGljIGRvdWJsZSBHZXRWb2x0YWdlM1YzKCk7CisJCXN0YXRpYyBkb3VibGUgR2V0Q3VycmVudDNWMygpOworCQlzdGF0aWMgYm9vbCBHZXRFbmFibGVkM1YzKCk7CisJCXN0YXRpYyBpbnQgR2V0RmF1bHRDb3VudDNWMygpOworCQlzdGF0aWMgZG91YmxlIEdldFZvbHRhZ2U1VigpOworCQlzdGF0aWMgZG91YmxlIEdldEN1cnJlbnQ1VigpOworCQlzdGF0aWMgYm9vbCBHZXRFbmFibGVkNVYoKTsKKwkJc3RhdGljIGludCBHZXRGYXVsdENvdW50NVYoKTsKKwkJc3RhdGljIGRvdWJsZSBHZXRWb2x0YWdlNlYoKTsKKwkJc3RhdGljIGRvdWJsZSBHZXRDdXJyZW50NlYoKTsKKwkJc3RhdGljIGJvb2wgR2V0RW5hYmxlZDZWKCk7CisJCXN0YXRpYyBpbnQgR2V0RmF1bHRDb3VudDZWKCk7Cit9OworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ291bnRlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvQ291bnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYWNlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Db3VudGVyLmgKQEAgLTAsMCArMSw4OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCisjaW5jbHVkZSAiQ291bnRlckJhc2UuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKK2NsYXNzIERpZ2l0YWxHbGl0Y2hGaWx0ZXI7CisKKy8qKgorICogQ2xhc3MgZm9yIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgdGlja3Mgb24gYSBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCisgKiBUaGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGNsYXNzIGZvciBjb3VudGluZyByZXBldGl0aXZlIGV2ZW50cy4gSXQgY2FuIHJldHVybiB0aGUgbnVtYmVyCisgKiBvZiBjb3VudHMsIHRoZSBwZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IGN5Y2xlLCBhbmQgZGV0ZWN0IHdoZW4gdGhlIHNpZ25hbCBiZWluZyBjb3VudGVkCisgKiBoYXMgc3RvcHBlZCBieSBzdXBwbHlpbmcgYSBtYXhpbXVtIGN5Y2xlIHRpbWUuCisgKgorICogQWxsIGNvdW50ZXJzIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgY291bnRpbmcgLSBSZXNldCgpIHRoZW0gaWYgeW91IG5lZWQgdGhlbQorICogdG8gYmUgemVyb2VkIGJlZm9yZSB1c2UuCisgKi8KK2NsYXNzIENvdW50ZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIENvdW50ZXJCYXNlCit7CitwdWJsaWM6CisKKwlDb3VudGVyKCk7CisJZXhwbGljaXQgQ291bnRlcihpbnQzMl90IGNoYW5uZWwpOworCWV4cGxpY2l0IENvdW50ZXIoRGlnaXRhbFNvdXJjZSAqc291cmNlKTsKKwlleHBsaWNpdCBDb3VudGVyKERpZ2l0YWxTb3VyY2UgJnNvdXJjZSk7CisJZXhwbGljaXQgQ291bnRlcihBbmFsb2dUcmlnZ2VyICp0cmlnZ2VyKTsKKwlleHBsaWNpdCBDb3VudGVyKEFuYWxvZ1RyaWdnZXIgJnRyaWdnZXIpOworCUNvdW50ZXIoRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSwgRGlnaXRhbFNvdXJjZSAqdXBTb3VyY2UsIERpZ2l0YWxTb3VyY2UgKmRvd25Tb3VyY2UsCisJCQlib29sIGludmVydGVkKTsKKwl2aXJ0dWFsIH5Db3VudGVyKCk7CisKKwl2b2lkIFNldFVwU291cmNlKGludDMyX3QgY2hhbm5lbCk7CisJdm9pZCBTZXRVcFNvdXJjZShBbmFsb2dUcmlnZ2VyICphbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSk7CisJdm9pZCBTZXRVcFNvdXJjZShBbmFsb2dUcmlnZ2VyICZhbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSk7CisJdm9pZCBTZXRVcFNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UpOworCXZvaWQgU2V0VXBTb3VyY2UoRGlnaXRhbFNvdXJjZSAmc291cmNlKTsKKwl2b2lkIFNldFVwU291cmNlRWRnZShib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UpOworCXZvaWQgQ2xlYXJVcFNvdXJjZSgpOworCisJdm9pZCBTZXREb3duU291cmNlKGludDMyX3QgY2hhbm5lbCk7CisJdm9pZCBTZXREb3duU291cmNlKEFuYWxvZ1RyaWdnZXIgKmFuYWxvZ1RyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKTsKKwl2b2lkIFNldERvd25Tb3VyY2UoQW5hbG9nVHJpZ2dlciAmYW5hbG9nVHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpOworCXZvaWQgU2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UpOworCXZvaWQgU2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlICZzb3VyY2UpOworCXZvaWQgU2V0RG93blNvdXJjZUVkZ2UoYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlKTsKKwl2b2lkIENsZWFyRG93blNvdXJjZSgpOworCisJdm9pZCBTZXRVcERvd25Db3VudGVyTW9kZSgpOworCXZvaWQgU2V0RXh0ZXJuYWxEaXJlY3Rpb25Nb2RlKCk7CisJdm9pZCBTZXRTZW1pUGVyaW9kTW9kZShib29sIGhpZ2hTZW1pUGVyaW9kKTsKKwl2b2lkIFNldFB1bHNlTGVuZ3RoTW9kZShmbG9hdCB0aHJlc2hvbGQpOworCisJdm9pZCBTZXRSZXZlcnNlRGlyZWN0aW9uKGJvb2wgcmV2ZXJzZURpcmVjdGlvbik7CisKKwkvLyBDb3VudGVyQmFzZSBpbnRlcmZhY2UKKwlpbnQzMl90IEdldCgpOworCXZvaWQgUmVzZXQoKTsKKwlkb3VibGUgR2V0UGVyaW9kKCk7CisJdm9pZCBTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCk7CisJdm9pZCBTZXRVcGRhdGVXaGVuRW1wdHkoYm9vbCBlbmFibGVkKTsKKwlib29sIEdldFN0b3BwZWQoKTsKKwlib29sIEdldERpcmVjdGlvbigpOworCXZvaWQgU2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSk7CisJaW50IEdldFNhbXBsZXNUb0F2ZXJhZ2UoKTsKKwl1aW50MzJfdCBHZXRGUEdBSW5kZXgoKQorCXsKKwkJcmV0dXJuIG1faW5kZXg7CisJfQorCitwcm90ZWN0ZWQ6CisJRGlnaXRhbFNvdXJjZSAqbV91cFNvdXJjZTsJCS8vLzwgV2hhdCBtYWtlcyB0aGUgY291bnRlciBjb3VudCB1cC4KKwlEaWdpdGFsU291cmNlICptX2Rvd25Tb3VyY2U7CS8vLzwgV2hhdCBtYWtlcyB0aGUgY291bnRlciBjb3VudCBkb3duLgorCXZvaWQqIG1fY291bnRlcjsJCQkJLy8vPCBUaGUgRlBHQSBjb3VudGVyIG9iamVjdC4KK3ByaXZhdGU6CisJdm9pZCBJbml0Q291bnRlcihNb2RlIG1vZGUgPSBrVHdvUHVsc2UpOworCisJYm9vbCBtX2FsbG9jYXRlZFVwU291cmNlOwkJLy8vPCBXYXMgdGhlIHVwU291cmNlIGFsbG9jYXRlZCBsb2NhbGx5PworCWJvb2wgbV9hbGxvY2F0ZWREb3duU291cmNlOwkvLy88IFdhcyB0aGUgZG93blNvdXJjZSBhbGxvY2F0ZWQgbG9jYWxseT8KKwl1aW50MzJfdCBtX2luZGV4OwkJCQkJLy8vPCBUaGUgaW5kZXggb2YgdGhpcyBjb3VudGVyLgorCisgIGZyaWVuZCBjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0NvdW50ZXJCYXNlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Db3VudGVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NzVkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Db3VudGVyQmFzZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRpY2tzIG9uIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogRW5jb2RlcnMsIEdlYXIgdG9vdGggc2Vuc29ycywgYW5kIGNvdW50ZXJzIHNob3VsZCBhbGwgc3ViY2xhc3MgdGhpcyBzbyBpdCBjYW4KKyAqIGJlIHVzZWQgdG8gYnVpbGQgbW9yZSBhZHZhbmNlZCBjbGFzc2VzIGZvciBjb250cm9sIGFuZCBkcml2aW5nLgorICoKKyAqIEFsbCBjb3VudGVycyB3aWxsIGltbWVkaWF0ZWx5IHN0YXJ0IGNvdW50aW5nIC0gUmVzZXQoKSB0aGVtIGlmIHlvdSBuZWVkIHRoZW0KKyAqIHRvIGJlIHplcm9lZCBiZWZvcmUgdXNlLgorICovCitjbGFzcyBDb3VudGVyQmFzZQoreworcHVibGljOgorCWVudW0gRW5jb2RpbmdUeXBlCisJeworCQlrMVgsCisJCWsyWCwKKwkJazRYCisJfTsKKworCXZpcnR1YWwgfkNvdW50ZXJCYXNlKCkge30KKwl2aXJ0dWFsIGludDMyX3QgR2V0KCkgPSAwOworCXZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRQZXJpb2QoKSA9IDA7CisJdmlydHVhbCB2b2lkIFNldE1heFBlcmlvZChkb3VibGUgbWF4UGVyaW9kKSA9IDA7CisJdmlydHVhbCBib29sIEdldFN0b3BwZWQoKSA9IDA7CisJdmlydHVhbCBib29sIEdldERpcmVjdGlvbigpID0gMDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9EaWdpdGFsSW5wdXQuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RpZ2l0YWxJbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOGQ3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9EaWdpdGFsSW5wdXQuaApAQCAtMCwwICsxLDExOSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4KKworI2luY2x1ZGUgIkRpZ2l0YWxTb3VyY2UuaCIKKworY2xhc3MgRW5jb2RlcjsKK2NsYXNzIENvdW50ZXI7CitjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworCisvKioKKyAqIENsYXNzIHRvIHJlYWQgYSBkaWdpdGFsIGlucHV0LgorICogVGhpcyBjbGFzcyB3aWxsIHJlYWQgZGlnaXRhbCBpbnB1dHMgYW5kIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvbiB0aGUgY2hhbm5lbC4gT3RoZXIgZGV2aWNlcworICogc3VjaCBhcyBlbmNvZGVycywgZ2VhciB0b290aCBzZW5zb3JzLCBldGMuIHRoYXQgYXJlIGltcGxlbWVudGVkIGVsc2V3aGVyZSB3aWxsIGF1dG9tYXRpY2FsbHkKKyAqIGFsbG9jYXRlIGRpZ2l0YWwgaW5wdXRzIGFuZCBvdXRwdXRzIGFzIHJlcXVpcmVkLiBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIGRldmljZXMgbGlrZSBzd2l0Y2hlcworICogZXRjLiB0aGF0IGFyZW4ndCBpbXBsZW1lbnRlZCBhbnl3aGVyZSBlbHNlLgorICovCitjbGFzcyBEaWdpdGFsSW5wdXQgOiBwdWJsaWMgRGlnaXRhbFNvdXJjZQoreworcHVibGljOgorCWV4cGxpY2l0IERpZ2l0YWxJbnB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5EaWdpdGFsSW5wdXQoKTsKKwl2aXJ0dWFsIGJvb2wgR2V0KCk7CisJdWludDMyX3QgR2V0Q2hhbm5lbCgpOworCisJLy8gRGlnaXRhbCBTb3VyY2UgSW50ZXJmYWNlCisJdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpOworCXZpcnR1YWwgdWludDMyX3QgR2V0TW9kdWxlRm9yUm91dGluZygpOworCXZpcnR1YWwgYm9vbCBHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpOworCitwcml2YXRlOgorCXZvaWQgSW5pdERpZ2l0YWxJbnB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwl1aW50MzJfdCBtX2NoYW5uZWw7CisJYm9vbCBtX2xhc3RWYWx1ZTsKKworICBmcmllbmQgRGlnaXRhbEdsaXRjaEZpbHRlcjsKK307CisKKy8qKgorICogQ2xhc3MgdG8gZW5hYmxlIGdsaXRjaCBmaWx0ZXJpbmcgb24gYSBzZXQgb2YgZGlnaXRhbCBpbnB1dHMuCisgKiBUaGlzIGNsYXNzIHdpbGwgbWFuYWdlIGFkZGluZyBhbmQgcmVtb3ZpbmcgZGlnaXRhbCBpbnB1dHMgZnJvbSBhIEZQR0EgZ2xpdGNoCisgKiBmaWx0ZXIuIFRoZSBmaWx0ZXIgbGV0cyB0aGUgdXNlciBjb25maWd1cmUgdGhlIHRpbWUgdGhhdCBhbiBpbnB1dCBtdXN0IHJlbWFpbgorICogaGlnaCBvciBsb3cgYmVmb3JlIGl0IGlzIGNsYXNzaWZpZWQgYXMgaGlnaCBvciBsb3cuCisgKi8KK2NsYXNzIERpZ2l0YWxHbGl0Y2hGaWx0ZXIgOiBwdWJsaWMgRXJyb3JCYXNlIHsKKyBwdWJsaWM6CisgIERpZ2l0YWxHbGl0Y2hGaWx0ZXIoKTsKKyAgfkRpZ2l0YWxHbGl0Y2hGaWx0ZXIoKTsKKworICAvKioKKyAgICogQXNzaWducyB0aGUgRGlnaXRhbFNvdXJjZSB0byB0aGlzIGdsaXRjaCBmaWx0ZXIuCisgICAqCisgICAqIEBwYXJhbSBpbnB1dCBUaGUgRGlnaXRhbFNvdXJjZSB0byBhZGQuCisgICAqLworICB2b2lkIEFkZChEaWdpdGFsU291cmNlICppbnB1dCk7CisKKyAgLyoqCisgICAqIEFzc2lnbnMgdGhlIEVuY29kZXIgdG8gdGhpcyBnbGl0Y2ggZmlsdGVyLgorICAgKgorICAgKiBAcGFyYW0gaW5wdXQgVGhlIEVuY29kZXIgdG8gYWRkLgorICAgKi8KKyAgdm9pZCBBZGQoRW5jb2RlciAqaW5wdXQpOworCisgIC8qKgorICAgKiBBc3NpZ25zIHRoZSBDb3VudGVyIHRvIHRoaXMgZ2xpdGNoIGZpbHRlci4KKyAgICoKKyAgICogQHBhcmFtIGlucHV0IFRoZSBDb3VudGVyIHRvIGFkZC4KKyAgICovCisgIHZvaWQgQWRkKENvdW50ZXIgKmlucHV0KTsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIGRpZ2l0YWwgaW5wdXQgZnJvbSB0aGlzIGZpbHRlci4KKyAgICoKKyAgICogUmVtb3ZlcyB0aGUgRGlnaXRhbFNvdXJjZSBmcm9tIHRoaXMgZ2xpdGNoIGZpbHRlciBhbmQgcmUtYXNzaWducyBpdCB0byB0aGUKKyAgICogZGVmYXVsdCBmaWx0ZXIuCisgICAqCisgICAqIEBwYXJhbSBpbnB1dCBUaGUgRGlnaXRhbFNvdXJjZSB0byByZW1vdmUuCisgICAqLworICB2b2lkIFJlbW92ZShEaWdpdGFsU291cmNlICppbnB1dCk7CisgIHZvaWQgUmVtb3ZlKEVuY29kZXIgKmlucHV0KTsKKyAgdm9pZCBSZW1vdmUoQ291bnRlciAqaW5wdXQpOworCisgIC8qKgorICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgY3ljbGVzIHRoYXQgdGhlIGlucHV0IG11c3Qgbm90IGNoYW5nZSBzdGF0ZSBmb3IuCisgICAqCisgICAqIEBwYXJhbSBmcGdhX2N5Y2xlcyBUaGUgbnVtYmVyIG9mIEZQR0EgY3ljbGVzLgorICAgKi8KKyAgdm9pZCBTZXRQZXJpb2RDeWNsZXModWludDMyX3QgZnBnYV9jeWNsZXMpOworCisgIC8qKgorICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgdGhhdCB0aGUgaW5wdXQgbXVzdCBub3QgY2hhbmdlIHN0YXRlIGZvci4KKyAgICoKKyAgICogQHBhcmFtIG5hbm9zZWNvbmRzIFRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMuCisgICAqLworICB2b2lkIFNldFBlcmlvZE5hbm9TZWNvbmRzKHVpbnQ2NF90IG5hbm9zZWNvbmRzKTsKKworICAvKioKKyAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyB0aGF0IHRoZSBpbnB1dCBtdXN0IG5vdCBjaGFuZ2Ugc3RhdGUgZm9yLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY3ljbGVzLgorICAgKi8KKyAgdWludDMyX3QgR2V0UGVyaW9kQ3ljbGVzKCk7CisgIC8qKgorICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgdGhhdCB0aGUgaW5wdXQgbXVzdCBub3QgY2hhbmdlIHN0YXRlIGZvci4KKyAgICoKKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzLgorICAgKi8KKyAgdWludDY0X3QgR2V0UGVyaW9kTmFub1NlY29uZHMoKTsKKworIHByaXZhdGU6CisgIGludCBjaGFubmVsX2luZGV4XzsKKyAgc3RhdGljIE11dGV4IG11dGV4XzsKKyAgc3RhdGljIDo6c3RkOjphcnJheTxpbnQsIDM+IGZpbHRlcl9hbGxvY2F0ZWRfOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RpZ2l0YWxPdXRwdXQuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RpZ2l0YWxPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzYwMTJiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbE91dHB1dC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRGlnaXRhbFNvdXJjZS5oIgorCisvKioKKyAqIENsYXNzIHRvIHdyaXRlIHRvIGRpZ2l0YWwgb3V0cHV0cy4KKyAqIFdyaXRlIHZhbHVlcyB0byB0aGUgZGlnaXRhbCBvdXRwdXQgY2hhbm5lbHMuIE90aGVyIGRldmljZXMgaW1wbGVtZW50ZWQgZWxzZXdoZXJlIHdpbGwgYWxsb2NhdGUKKyAqIGNoYW5uZWxzIGF1dG9tYXRpY2FsbHkgc28gZm9yIHRob3NlIGRldmljZXMgaXQgc2hvdWxkbid0IGJlIGRvbmUgaGVyZS4KKyAqLworY2xhc3MgRGlnaXRhbE91dHB1dCA6IHB1YmxpYyBEaWdpdGFsU291cmNlCit7CitwdWJsaWM6CisJZXhwbGljaXQgRGlnaXRhbE91dHB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5EaWdpdGFsT3V0cHV0KCk7CisJdm9pZCBTZXQodWludDMyX3QgdmFsdWUpOworICB2aXJ0dWFsIGJvb2wgR2V0KCk7CisJdWludDMyX3QgR2V0Q2hhbm5lbCgpOworCXZvaWQgUHVsc2UoZmxvYXQgbGVuZ3RoKTsKKwlib29sIElzUHVsc2luZygpOworCXZvaWQgU2V0UFdNUmF0ZShmbG9hdCByYXRlKTsKKwl2b2lkIEVuYWJsZVBXTShmbG9hdCBpbml0aWFsRHV0eUN5Y2xlKTsKKwl2b2lkIERpc2FibGVQV00oKTsKKwl2b2lkIFVwZGF0ZUR1dHlDeWNsZShmbG9hdCBkdXR5Q3ljbGUpOworCisJLy8gRGlnaXRhbCBTb3VyY2UgSW50ZXJmYWNlCisJdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpOworCXZpcnR1YWwgdWludDMyX3QgR2V0TW9kdWxlRm9yUm91dGluZygpOworCXZpcnR1YWwgYm9vbCBHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpOworCitwcml2YXRlOgorCXZvaWQgSW5pdERpZ2l0YWxPdXRwdXQodWludDMyX3QgY2hhbm5lbCk7CisKKwl1aW50MzJfdCBtX2NoYW5uZWw7CisJdm9pZCAqbV9wd21HZW5lcmF0b3I7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbFNvdXJjZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRGlnaXRhbFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NmJjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9EaWdpdGFsU291cmNlLmgKQEAgLTAsMCArMSwyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oIgorCisvKioKKyAqIERpZ2l0YWxTb3VyY2UgSW50ZXJmYWNlLgorICogVGhlIERpZ2l0YWxTb3VyY2UgcmVwcmVzZW50cyBhbGwgdGhlIHBvc3NpYmxlIGlucHV0cyBmb3IgYSBjb3VudGVyIG9yIGEgcXVhZHJhdHVyZSBlbmNvZGVyLiBUaGUgc291cmNlIG1heSBiZQorICogZWl0aGVyIGEgZGlnaXRhbCBpbnB1dCBvciBhbiBhbmFsb2cgaW5wdXQuIElmIHRoZSBjYWxsZXIganVzdCBwcm92aWRlcyBhIGNoYW5uZWwsIHRoZW4gYSBkaWdpdGFsIGlucHV0IHdpbGwgYmUKKyAqIGNvbnN0cnVjdGVkIGFuZCBmcmVlZCB3aGVuIGZpbmlzaGVkIGZvciB0aGUgc291cmNlLiBUaGUgc291cmNlIGNhbiBlaXRoZXIgYmUgYSBkaWdpdGFsIGlucHV0IG9yIGFuYWxvZyB0cmlnZ2VyCisgKiBidXQgbm90IGJvdGguCisgKi8KK2NsYXNzIERpZ2l0YWxTb3VyY2UgOiBwdWJsaWMgSW50ZXJydXB0YWJsZVNlbnNvckJhc2UKK3sKK3B1YmxpYzoKKwl2aXJ0dWFsIH5EaWdpdGFsU291cmNlKCk7CisgIHZpcnR1YWwgYm9vbCBHZXQoKSA9IDA7CisJdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpID0gMDsKKwl2aXJ0dWFsIHVpbnQzMl90IEdldE1vZHVsZUZvclJvdXRpbmcoKSA9IDA7CisJdmlydHVhbCBib29sIEdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCkgPSAwOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RvdWJsZVNvbGVub2lkLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Eb3VibGVTb2xlbm9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNDFmODkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Eb3VibGVTb2xlbm9pZC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU29sZW5vaWRCYXNlLmgiCisKKy8qKgorICogRG91YmxlU29sZW5vaWQgY2xhc3MgZm9yIHJ1bm5pbmcgMiBjaGFubmVscyBvZiBoaWdoIHZvbHRhZ2UgRGlnaXRhbCBPdXRwdXQKKyAqIChQQ00pLgorICoKKyAqIFRoZSBEb3VibGVTb2xlbm9pZCBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcG5ldW1hdGljcyBzb2xlbm9pZHMgdGhhdAorICogaGF2ZSB0d28gcG9zaXRpb25zIGNvbnRyb2xsZWQgYnkgdHdvIHNlcGFyYXRlIGNoYW5uZWxzLgorICovCitjbGFzcyBEb3VibGVTb2xlbm9pZCA6IHB1YmxpYyBTb2xlbm9pZEJhc2UKK3sKK3B1YmxpYzoKKwllbnVtIFZhbHVlCisJeworCQlrT2ZmLAorCQlrRm9yd2FyZCwKKwkJa1JldmVyc2UKKwl9OworCisJZXhwbGljaXQgRG91YmxlU29sZW5vaWQodWludDMyX3QgZm9yd2FyZENoYW5uZWwsIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKTsKKwlEb3VibGVTb2xlbm9pZCh1aW50OF90IG1vZHVsZU51bWJlciwgdWludDMyX3QgZm9yd2FyZENoYW5uZWwsIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKTsKKwl2aXJ0dWFsIH5Eb3VibGVTb2xlbm9pZCgpOworCXZpcnR1YWwgdm9pZCBTZXQoVmFsdWUgdmFsdWUpOworCXZpcnR1YWwgVmFsdWUgR2V0KCk7CisJYm9vbCBJc0Z3ZFNvbGVub2lkQmxhY2tMaXN0ZWQoKTsKKwlib29sIElzUmV2U29sZW5vaWRCbGFja0xpc3RlZCgpOworCitwcml2YXRlOgorCXZpcnR1YWwgdm9pZCBJbml0U29sZW5vaWQoKTsKKworCXVpbnQzMl90IG1fZm9yd2FyZENoYW5uZWw7IC8vLzwgVGhlIGZvcndhcmQgY2hhbm5lbCBvbiB0aGUgbW9kdWxlIHRvIGNvbnRyb2wuCisJdWludDMyX3QgbV9yZXZlcnNlQ2hhbm5lbDsgLy8vPCBUaGUgcmV2ZXJzZSBjaGFubmVsIG9uIHRoZSBtb2R1bGUgdG8gY29udHJvbC4KKwl1aW50OF90IG1fZm9yd2FyZE1hc2s7IC8vLzwgVGhlIG1hc2sgZm9yIHRoZSBmb3J3YXJkIGNoYW5uZWwuCisJdWludDhfdCBtX3JldmVyc2VNYXNrOyAvLy88IFRoZSBtYXNrIGZvciB0aGUgcmV2ZXJzZSBjaGFubmVsLgorfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RyaXZlclN0YXRpb24uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0RyaXZlclN0YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk3Y2EzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRHJpdmVyU3RhdGlvbi5oCkBAIC0wLDAgKzEsMTE0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlJvYm90U3RhdGUuaCIKKyNpbmNsdWRlICJUYXNrLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKK3N0cnVjdCBIQUxDb250cm9sV29yZDsKK2NsYXNzIEFuYWxvZ0lucHV0OworCisvKioKKyAqIFByb3ZpZGUgYWNjZXNzIHRvIHRoZSBuZXR3b3JrIGNvbW11bmljYXRpb24gZGF0YSB0byAvIGZyb20gdGhlIERyaXZlciBTdGF0aW9uLgorICovCitjbGFzcyBEcml2ZXJTdGF0aW9uIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBSb2JvdFN0YXRlSW50ZXJmYWNlCit7CitwdWJsaWM6CisJZW51bSBBbGxpYW5jZQorCXsKKwkJa1JlZCwKKwkJa0JsdWUsCisJCWtJbnZhbGlkCisJfTsKKworCXZpcnR1YWwgfkRyaXZlclN0YXRpb24oKTsKKwlzdGF0aWMgRHJpdmVyU3RhdGlvbiAqR2V0SW5zdGFuY2UoKTsKKwlzdGF0aWMgdm9pZCBSZXBvcnRFcnJvcihzdGQ6OnN0cmluZyBlcnJvcik7CisKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0pveXN0aWNrUG9ydHMgPSA2OworCisJZmxvYXQgR2V0U3RpY2tBeGlzKHVpbnQzMl90IHN0aWNrLCB1aW50MzJfdCBheGlzKTsKKwlpbnQgR2V0U3RpY2tQT1YodWludDMyX3Qgc3RpY2ssIHVpbnQzMl90IHBvdik7CisJdWludDMyX3QgR2V0U3RpY2tCdXR0b25zKHVpbnQzMl90IHN0aWNrKTsKKwlib29sIEdldFN0aWNrQnV0dG9uKHVpbnQzMl90IHN0aWNrLCB1aW50OF90IGJ1dHRvbik7CisKKwlpbnQgR2V0U3RpY2tBeGlzQ291bnQodWludDMyX3Qgc3RpY2spOworCWludCBHZXRTdGlja1BPVkNvdW50KHVpbnQzMl90IHN0aWNrKTsKKwlpbnQgR2V0U3RpY2tCdXR0b25Db3VudCh1aW50MzJfdCBzdGljayk7CisKKwlib29sIElzRW5hYmxlZCgpOworCWJvb2wgSXNEaXNhYmxlZCgpOworCWJvb2wgSXNBdXRvbm9tb3VzKCk7CisJYm9vbCBJc09wZXJhdG9yQ29udHJvbCgpOworCWJvb2wgSXNUZXN0KCk7CisJYm9vbCBJc0RTQXR0YWNoZWQoKTsKKwlib29sIElzTmV3Q29udHJvbERhdGEoKTsKKwlib29sIElzRk1TQXR0YWNoZWQoKTsKKwlib29sIElzU3lzQWN0aXZlKCk7CisJYm9vbCBJc1N5c0Jyb3duZWRPdXQoKTsKKworCUFsbGlhbmNlIEdldEFsbGlhbmNlKCk7CisJdWludDMyX3QgR2V0TG9jYXRpb24oKTsKKwl2b2lkIFdhaXRGb3JEYXRhKCk7CisJZG91YmxlIEdldE1hdGNoVGltZSgpOworCWZsb2F0IEdldEJhdHRlcnlWb2x0YWdlKCk7CisKKwkvKiogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUgZXhlY3V0aW5nCisJICogICBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5CisJICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIGRpc2FibGVkIGNvZGU7IGlmIGZhbHNlLCBsZWF2aW5nIGRpc2FibGVkIGNvZGUgKi8KKwl2b2lkIEluRGlzYWJsZWQoYm9vbCBlbnRlcmluZykKKwl7CisJCW1fdXNlckluRGlzYWJsZWQgPSBlbnRlcmluZzsKKwl9CisJLyoqIE9ubHkgdG8gYmUgdXNlZCB0byB0ZWxsIHRoZSBEcml2ZXIgU3RhdGlvbiB3aGF0IGNvZGUgeW91IGNsYWltIHRvIGJlIGV4ZWN1dGluZworCSAqICAgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgb25seQorCSAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyBhdXRvbm9tb3VzIGNvZGU7IGlmIGZhbHNlLCBsZWF2aW5nIGF1dG9ub21vdXMgY29kZSAqLworCXZvaWQgSW5BdXRvbm9tb3VzKGJvb2wgZW50ZXJpbmcpCisJeworCQltX3VzZXJJbkF1dG9ub21vdXMgPSBlbnRlcmluZzsKKwl9CisJLyoqIE9ubHkgdG8gYmUgdXNlZCB0byB0ZWxsIHRoZSBEcml2ZXIgU3RhdGlvbiB3aGF0IGNvZGUgeW91IGNsYWltIHRvIGJlIGV4ZWN1dGluZworCSAqICAgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgb25seQorCSAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyB0ZWxlb3AgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgdGVsZW9wIGNvZGUgKi8KKwl2b2lkIEluT3BlcmF0b3JDb250cm9sKGJvb2wgZW50ZXJpbmcpCisJeworCQltX3VzZXJJblRlbGVvcCA9IGVudGVyaW5nOworCX0KKwkvKiogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUgZXhlY3V0aW5nCisJICogICBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5CisJICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIHRlc3QgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgdGVzdCBjb2RlICovCisJdm9pZCBJblRlc3QoYm9vbCBlbnRlcmluZykKKwl7CisJCW1fdXNlckluVGVzdCA9IGVudGVyaW5nOworCX0KKworcHJvdGVjdGVkOgorCURyaXZlclN0YXRpb24oKTsKKworCXZvaWQgR2V0RGF0YSgpOworcHJpdmF0ZToKKwlzdGF0aWMgdm9pZCBJbml0VGFzayhEcml2ZXJTdGF0aW9uICpkcyk7CisJc3RhdGljIERyaXZlclN0YXRpb24gKm1faW5zdGFuY2U7CisJdm9pZCBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKHN0ZDo6c3RyaW5nIG1lc3NhZ2UpOworCXZvaWQgUnVuKCk7CisKKwlIQUxKb3lzdGlja0F4ZXMgbV9qb3lzdGlja0F4ZXNba0pveXN0aWNrUG9ydHNdOworCUhBTEpveXN0aWNrUE9WcyBtX2pveXN0aWNrUE9Wc1trSm95c3RpY2tQb3J0c107CisJSEFMSm95c3RpY2tCdXR0b25zIG1fam95c3RpY2tCdXR0b25zW2tKb3lzdGlja1BvcnRzXTsKKwlUYXNrIG1fdGFzazsKKwlTRU1BUEhPUkVfSUQgbV9uZXdDb250cm9sRGF0YTsKKwlNVUxUSVdBSVRfSUQgbV9wYWNrZXREYXRhQXZhaWxhYmxlTXVsdGlXYWl0OworCU1VVEVYX0lEIG1fcGFja2V0RGF0YUF2YWlsYWJsZU11dGV4OworCU1VTFRJV0FJVF9JRCBtX3dhaXRGb3JEYXRhU2VtOworCU1VVEVYX0lEIG1fd2FpdEZvckRhdGFNdXRleDsKKwlib29sIG1fdXNlckluRGlzYWJsZWQ7CisJYm9vbCBtX3VzZXJJbkF1dG9ub21vdXM7CisJYm9vbCBtX3VzZXJJblRlbGVvcDsKKwlib29sIG1fdXNlckluVGVzdDsKKwlkb3VibGUgbV9uZXh0TWVzc2FnZVRpbWU7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRW5jb2Rlci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MGQ1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9FbmNvZGVyLmgKQEAgLTAsMCArMSw4NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJDb3VudGVyQmFzZS5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJDb3VudGVyLmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisKK2NsYXNzIERpZ2l0YWxTb3VyY2U7CitjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworCisvKioKKyAqIENsYXNzIHRvIHJlYWQgcXVhZCBlbmNvZGVycy4KKyAqIFF1YWRyYXR1cmUgZW5jb2RlcnMgYXJlIGRldmljZXMgdGhhdCBjb3VudCBzaGFmdCByb3RhdGlvbiBhbmQgY2FuIHNlbnNlIGRpcmVjdGlvbi4gVGhlIG91dHB1dCBvZgorICogdGhlIFF1YWRFbmNvZGVyIGNsYXNzIGlzIGFuIGludGVnZXIgdGhhdCBjYW4gY291bnQgZWl0aGVyIHVwIG9yIGRvd24sIGFuZCBjYW4gZ28gbmVnYXRpdmUgZm9yCisgKiByZXZlcnNlIGRpcmVjdGlvbiBjb3VudGluZy4gV2hlbiBjcmVhdGluZyBRdWFkRW5jb2RlcnMsIGEgZGlyZWN0aW9uIGlzIHN1cHBsaWVkIHRoYXQgY2hhbmdlcyB0aGUKKyAqIHNlbnNlIG9mIHRoZSBvdXRwdXQgdG8gbWFrZSBjb2RlIG1vcmUgcmVhZGFibGUgaWYgdGhlIGVuY29kZXIgaXMgbW91bnRlZCBzdWNoIHRoYXQgZm9yd2FyZCBtb3ZlbWVudAorICogZ2VuZXJhdGVzIG5lZ2F0aXZlIHZhbHVlcy4gUXVhZHJhdHVyZSBlbmNvZGVycyBoYXZlIHR3byBkaWdpdGFsIG91dHB1dHMsIGFuIEEgQ2hhbm5lbCBhbmQgYSBCIENoYW5uZWwKKyAqIHRoYXQgYXJlIG91dCBvZiBwaGFzZSB3aXRoIGVhY2ggb3RoZXIgdG8gYWxsb3cgdGhlIEZQR0EgdG8gZG8gZGlyZWN0aW9uIHNlbnNpbmcuCisgKgorICogQWxsIGVuY29kZXJzIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgY291bnRpbmcgLSBSZXNldCgpIHRoZW0gaWYgeW91IG5lZWQgdGhlbQorICogdG8gYmUgemVyb2VkIGJlZm9yZSB1c2UuCisgKi8KK2NsYXNzIEVuY29kZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIENvdW50ZXJCYXNlLCBwdWJsaWMgUElEU291cmNlCit7CitwdWJsaWM6CisJZW51bSBJbmRleGluZ1R5cGUgeyBrUmVzZXRXaGlsZUhpZ2gsIGtSZXNldFdoaWxlTG93LCBrUmVzZXRPbkZhbGxpbmdFZGdlLCBrUmVzZXRPblJpc2luZ0VkZ2UgfTsKKworCUVuY29kZXIodWludDMyX3QgYUNoYW5uZWwsIHVpbnQzMl90IGJDaGFubmVsLCBib29sIHJldmVyc2VEaXJlY3Rpb24gPSBmYWxzZSwKKwkJCUVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUgPSBrNFgpOworCUVuY29kZXIoRGlnaXRhbFNvdXJjZSAqYVNvdXJjZSwgRGlnaXRhbFNvdXJjZSAqYlNvdXJjZSwgYm9vbCByZXZlcnNlRGlyZWN0aW9uID0gZmFsc2UsCisJCQlFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlID0gazRYKTsKKwlFbmNvZGVyKERpZ2l0YWxTb3VyY2UgJmFTb3VyY2UsIERpZ2l0YWxTb3VyY2UgJmJTb3VyY2UsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiA9IGZhbHNlLAorCQkJRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSA9IGs0WCk7CisJdmlydHVhbCB+RW5jb2RlcigpOworCisJLy8gQ291bnRlckJhc2UgaW50ZXJmYWNlCisJaW50MzJfdCBHZXQoKTsKKwlpbnQzMl90IEdldFJhdygpOworCWludDMyX3QgR2V0RW5jb2RpbmdTY2FsZSgpOworCXZvaWQgUmVzZXQoKTsKKwlkb3VibGUgR2V0UGVyaW9kKCk7CisJdm9pZCBTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCk7CisJYm9vbCBHZXRTdG9wcGVkKCk7CisJYm9vbCBHZXREaXJlY3Rpb24oKTsKKwlkb3VibGUgR2V0RGlzdGFuY2UoKTsKKwlkb3VibGUgR2V0UmF0ZSgpOworCXZvaWQgU2V0TWluUmF0ZShkb3VibGUgbWluUmF0ZSk7CisJdm9pZCBTZXREaXN0YW5jZVBlclB1bHNlKGRvdWJsZSBkaXN0YW5jZVBlclB1bHNlKTsKKwl2b2lkIFNldFJldmVyc2VEaXJlY3Rpb24oYm9vbCByZXZlcnNlRGlyZWN0aW9uKTsKKwl2b2lkIFNldFNhbXBsZXNUb0F2ZXJhZ2UoaW50IHNhbXBsZXNUb0F2ZXJhZ2UpOworCWludCBHZXRTYW1wbGVzVG9BdmVyYWdlKCk7CisJdm9pZCBTZXRQSURTb3VyY2VQYXJhbWV0ZXIoUElEU291cmNlUGFyYW1ldGVyIHBpZFNvdXJjZSk7CisJZG91YmxlIFBJREdldCgpOworCisJdm9pZCBTZXRJbmRleFNvdXJjZSh1aW50MzJfdCBjaGFubmVsLCBJbmRleGluZ1R5cGUgdHlwZSA9IGtSZXNldE9uUmlzaW5nRWRnZSk7CisJdm9pZCBTZXRJbmRleFNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UsIEluZGV4aW5nVHlwZSB0eXBlID0ga1Jlc2V0T25SaXNpbmdFZGdlKTsKKwl2b2lkIFNldEluZGV4U291cmNlKERpZ2l0YWxTb3VyY2UgJnNvdXJjZSwgSW5kZXhpbmdUeXBlIHR5cGUgPSBrUmVzZXRPblJpc2luZ0VkZ2UpOworCisJaW50MzJfdCBHZXRGUEdBSW5kZXgoKQorCXsKKwkJcmV0dXJuIG1faW5kZXg7CisJfQorCitwcml2YXRlOgorCXZvaWQgSW5pdEVuY29kZXIoYm9vbCBfcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSk7CisJZG91YmxlIERlY29kaW5nU2NhbGVGYWN0b3IoKTsKKworCURpZ2l0YWxTb3VyY2UgKm1fYVNvdXJjZTsJCS8vIHRoZSBBIHBoYXNlIG9mIHRoZSBxdWFkIGVuY29kZXIKKwlEaWdpdGFsU291cmNlICptX2JTb3VyY2U7CQkvLyB0aGUgQiBwaGFzZSBvZiB0aGUgcXVhZCBlbmNvZGVyCisJYm9vbCBtX2FsbG9jYXRlZEFTb3VyY2U7CQkvLyB3YXMgdGhlIEEgc291cmNlIGFsbG9jYXRlZCBsb2NhbGx5PworCWJvb2wgbV9hbGxvY2F0ZWRCU291cmNlOwkJLy8gd2FzIHRoZSBCIHNvdXJjZSBhbGxvY2F0ZWQgbG9jYWxseT8KKwl2b2lkKiBtX2VuY29kZXI7CisJaW50MzJfdCBtX2luZGV4OwkJCQkvLyBUaGUgZW5jb2RlcidzIEZQR0EgaW5kZXguCisJZG91YmxlIG1fZGlzdGFuY2VQZXJQdWxzZTsJCS8vIGRpc3RhbmNlIG9mIHRyYXZlbCBmb3IgZWFjaCBlbmNvZGVyIHRpY2sKKwlDb3VudGVyICptX2NvdW50ZXI7CQkJCS8vIENvdW50ZXIgb2JqZWN0IGZvciAxeCBhbmQgMnggZW5jb2RpbmcKKwlFbmNvZGluZ1R5cGUgbV9lbmNvZGluZ1R5cGU7CS8vIEVuY29kaW5nIHR5cGUKKwlpbnQzMl90IG1fZW5jb2RpbmdTY2FsZTsJCS8vIDF4LCAyeCwgb3IgNHgsIHBlciB0aGUgZW5jb2RpbmdUeXBlCisJUElEU291cmNlUGFyYW1ldGVyIG1fcGlkU291cmNlOwkvLyBFbmNvZGVyIHBhcmFtZXRlciB0aGF0IHNvdXJjZXMgYSBQSUQgY29udHJvbGxlcgorCisgIGZyaWVuZCBjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0dlYXJUb290aC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvR2VhclRvb3RoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwZTUwZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0dlYXJUb290aC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ291bnRlci5oIgorCisvKioKKyAqIEFsaWFzIGZvciBjb3VudGVyIGNsYXNzLgorICogSW1wbGVtZW50IHRoZSBnZWFyIHRvb3RoIHNlbnNvciBzdXBwbGllZCBieSBGSVJTVC4gQ3VycmVudGx5IHRoZXJlIGlzIG5vIHJldmVyc2Ugc2Vuc2luZyBvbgorICogdGhlIGdlYXIgdG9vdGggc2Vuc29yLCBidXQgaW4gZnV0dXJlIHZlcnNpb25zIHdlIG1pZ2h0IGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IHRpbWluZyBpbiB0aGUKKyAqIEZQR0EgdG8gc2Vuc2UgZGlyZWN0aW9uLgorICovCitjbGFzcyBHZWFyVG9vdGggOiBwdWJsaWMgQ291bnRlcgoreworcHVibGljOgorCS8vLyA1NSB1U2VjIGZvciB0aHJlc2hvbGQKKwlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrR2VhclRvb3RoVGhyZXNob2xkID0gNTVlLTY7CisJR2VhclRvb3RoKHVpbnQzMl90IGNoYW5uZWwsIGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlID0gZmFsc2UpOworCUdlYXJUb290aChEaWdpdGFsU291cmNlICpzb3VyY2UsIGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlID0gZmFsc2UpOworCUdlYXJUb290aChEaWdpdGFsU291cmNlICZzb3VyY2UsIGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlID0gZmFsc2UpOworCXZpcnR1YWwgfkdlYXJUb290aCgpOworCXZvaWQgRW5hYmxlRGlyZWN0aW9uU2Vuc2luZyhib29sIGRpcmVjdGlvblNlbnNpdGl2ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvR3lyby5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvR3lyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGQ5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9HeXJvLmgKQEAgLTAsMCArMSw1NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisKK2NsYXNzIEFuYWxvZ0lucHV0OworCisvKioKKyAqIFVzZSBhIHJhdGUgZ3lybyB0byByZXR1cm4gdGhlIHJvYm90cyBoZWFkaW5nIHJlbGF0aXZlIHRvIGEgc3RhcnRpbmcgcG9zaXRpb24uCisgKiBUaGUgR3lybyBjbGFzcyB0cmFja3MgdGhlIHJvYm90cyBoZWFkaW5nIGJhc2VkIG9uIHRoZSBzdGFydGluZyBwb3NpdGlvbi4gQXMgdGhlIHJvYm90CisgKiByb3RhdGVzIHRoZSBuZXcgaGVhZGluZyBpcyBjb21wdXRlZCBieSBpbnRlZ3JhdGluZyB0aGUgcmF0ZSBvZiByb3RhdGlvbiByZXR1cm5lZAorICogYnkgdGhlIHNlbnNvci4gV2hlbiB0aGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkLCBpdCBkb2VzIGEgc2hvcnQgY2FsaWJyYXRpb24gcm91dGluZQorICogd2hlcmUgaXQgc2FtcGxlcyB0aGUgZ3lybyB3aGlsZSBhdCByZXN0IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBvZmZzZXQuIFRoaXMgaXMKKyAqIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIHNhbXBsZSB0byBkZXRlcm1pbmUgdGhlIGhlYWRpbmcuIFRoaXMgZ3lybyBjbGFzcyBtdXN0IGJlIHVzZWQKKyAqIHdpdGggYSBjaGFubmVsIHRoYXQgaXMgYXNzaWduZWQgb25lIG9mIHRoZSBBbmFsb2cgYWNjdW11bGF0b3JzIGZyb20gdGhlIEZQR0EuIFNlZQorICogQW5hbG9nSW5wdXQgZm9yIHRoZSBjdXJyZW50IGFjY3VtdWxhdG9yIGFzc2lnbm1lbnRzLgorICovCitjbGFzcyBHeXJvIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBQSURTb3VyY2UKK3sKK3B1YmxpYzoKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga092ZXJzYW1wbGVCaXRzID0gMTA7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBdmVyYWdlQml0cyA9IDA7CisJc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrU2FtcGxlc1BlclNlY29uZCA9IDUwLjA7CisJc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrQ2FsaWJyYXRpb25TYW1wbGVUaW1lID0gNS4wOworCXN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRWb2x0c1BlckRlZ3JlZVBlclNlY29uZCA9IDAuMDA3OworCisJZXhwbGljaXQgR3lybyhpbnQzMl90IGNoYW5uZWwpOworCWV4cGxpY2l0IEd5cm8oQW5hbG9nSW5wdXQgKmNoYW5uZWwpOworCWV4cGxpY2l0IEd5cm8oQW5hbG9nSW5wdXQgJmNoYW5uZWwpOworCXZpcnR1YWwgfkd5cm8oKTsKKwl2aXJ0dWFsIGZsb2F0IEdldEFuZ2xlKCk7CisJdmlydHVhbCBkb3VibGUgR2V0UmF0ZSgpOworCXZvaWQgU2V0U2Vuc2l0aXZpdHkoZmxvYXQgdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQpOworCXZvaWQgU2V0RGVhZGJhbmQoZmxvYXQgdm9sdHMpOworCXZvaWQgU2V0UElEU291cmNlUGFyYW1ldGVyKFBJRFNvdXJjZVBhcmFtZXRlciBwaWRTb3VyY2UpOworCXZpcnR1YWwgdm9pZCBSZXNldCgpOworCXZvaWQgSW5pdEd5cm8oKTsKKworCS8vIFBJRFNvdXJjZSBpbnRlcmZhY2UKKwlkb3VibGUgUElER2V0KCk7CisKK3Byb3RlY3RlZDoKKwlBbmFsb2dJbnB1dCAqbV9hbmFsb2c7CisKK3ByaXZhdGU6CisJZmxvYXQgbV92b2x0c1BlckRlZ3JlZVBlclNlY29uZDsKKwlmbG9hdCBtX29mZnNldDsKKwlib29sIG1fY2hhbm5lbEFsbG9jYXRlZDsKKwl1aW50MzJfdCBtX2NlbnRlcjsKKwlQSURTb3VyY2VQYXJhbWV0ZXIgbV9waWRTb3VyY2U7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSTJDLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9JMkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBlNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSTJDLmgKQEAgLTAsMCArMSwzOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKKy8qKgorICogSTJDIGJ1cyBpbnRlcmZhY2UgY2xhc3MuCisgKgorICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlbnNvciAoYW5kIG90aGVyIEkyQyBkZXZpY2UpIGRyaXZlcnMuCisgKiBJdCBwcm9iYWJseSBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuCisgKgorICovCitjbGFzcyBJMkMgOiBTZW5zb3JCYXNlCit7CitwdWJsaWM6CisJZW51bSBQb3J0IHtrT25ib2FyZCwga01YUH07CisKKwlJMkMoUG9ydCBwb3J0LCB1aW50OF90IGRldmljZUFkZHJlc3MpOworCXZpcnR1YWwgfkkyQygpOworCisJYm9vbCBUcmFuc2FjdGlvbih1aW50OF90ICpkYXRhVG9TZW5kLCB1aW50OF90IHNlbmRTaXplLCB1aW50OF90ICpkYXRhUmVjZWl2ZWQsCisJCQl1aW50OF90IHJlY2VpdmVTaXplKTsKKwlib29sIEFkZHJlc3NPbmx5KCk7CisJYm9vbCBXcml0ZSh1aW50OF90IHJlZ2lzdGVyQWRkcmVzcywgdWludDhfdCBkYXRhKTsKKwlib29sIFdyaXRlQnVsayh1aW50OF90KiBkYXRhLCB1aW50OF90IGNvdW50KTsKKwlib29sIFJlYWQodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgY291bnQsIHVpbnQ4X3QgKmRhdGEpOworCWJvb2wgUmVhZE9ubHkodWludDhfdCBjb3VudCwgdWludDhfdCAqYnVmZmVyKTsKKwl2b2lkIEJyb2FkY2FzdCh1aW50OF90IHJlZ2lzdGVyQWRkcmVzcywgdWludDhfdCBkYXRhKTsKKwlib29sIFZlcmlmeVNlbnNvcih1aW50OF90IHJlZ2lzdGVyQWRkcmVzcywgdWludDhfdCBjb3VudCwgY29uc3QgdWludDhfdCAqZXhwZWN0ZWQpOworcHJpdmF0ZToKKworCVBvcnQgbV9wb3J0OworCXVpbnQ4X3QgbV9kZXZpY2VBZGRyZXNzOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0ludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0ludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTdlYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5oCkBAIC0wLDAgKzEsOSBAQAorCisjaW5jbHVkZSAiSExVc2FnZVJlcG9ydGluZy5oIgorCitjbGFzcyBIYXJkd2FyZUhMUmVwb3J0aW5nIDogcHVibGljIEhMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgUmVwb3J0U2NoZWR1bGVyKCk7CisgICAgdmlydHVhbCB2b2lkIFJlcG9ydFNtYXJ0RGFzaGJvYXJkKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwZGI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmgKQEAgLTAsMCArMSw0MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKworY2xhc3MgSW50ZXJydXB0YWJsZVNlbnNvckJhc2UgOiBwdWJsaWMgU2Vuc29yQmFzZQoreworcHVibGljOgorCWVudW0gV2FpdFJlc3VsdCB7CisJCWtUaW1lb3V0ID0gMHgwLAorCQlrUmlzaW5nRWRnZSA9IDB4MSwKKwkJa0ZhbGxpbmdFZGdlID0gMHgxMDAsCisJCWtCb3RoID0gMHgxMDEsCisJfTsKKworCUludGVycnVwdGFibGVTZW5zb3JCYXNlKCk7CisJdmlydHVhbCB+SW50ZXJydXB0YWJsZVNlbnNvckJhc2UoKTsKKwl2aXJ0dWFsIHVpbnQzMl90IEdldENoYW5uZWxGb3JSb3V0aW5nKCkgPSAwOworCXZpcnR1YWwgdWludDMyX3QgR2V0TW9kdWxlRm9yUm91dGluZygpID0gMDsKKwl2aXJ0dWFsIGJvb2wgR2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSA9IDA7CisJdmlydHVhbCB2b2lkIFJlcXVlc3RJbnRlcnJ1cHRzKEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLCB2b2lkICpwYXJhbSk7IC8vLzwgQXN5bmNocm9udXMgaGFuZGxlciB2ZXJzaW9uLgorCXZpcnR1YWwgdm9pZCBSZXF1ZXN0SW50ZXJydXB0cygpOwkJLy8vPCBTeW5jaHJvbnVzIFdhaXQgdmVyc2lvbi4KKwl2aXJ0dWFsIHZvaWQgQ2FuY2VsSW50ZXJydXB0cygpOwkJCS8vLzwgRnJlZSB1cCB0aGUgdW5kZXJseWluZyBjaGlwb2JqZWN0IGZ1bmN0aW9ucy4KKwl2aXJ0dWFsIFdhaXRSZXN1bHQgV2FpdEZvckludGVycnVwdChmbG9hdCB0aW1lb3V0LCBib29sIGlnbm9yZVByZXZpb3VzID0gdHJ1ZSk7IC8vLzwgU3luY2hyb251cyB2ZXJzaW9uLgorCXZpcnR1YWwgdm9pZCBFbmFibGVJbnRlcnJ1cHRzKCk7CQkJLy8vPCBFbmFibGUgaW50ZXJydXB0cyAtIGFmdGVyIGZpbmlzaGluZyBzZXR1cC4KKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZUludGVycnVwdHMoKTsJCS8vLzwgRGlzYWJsZSwgYnV0IGRvbid0IGRlYWxsb2NhdGUuCisJdmlydHVhbCBkb3VibGUgUmVhZFJpc2luZ1RpbWVzdGFtcCgpOy8vLzwgUmV0dXJuIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSByaXNpbmcgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQuCisJdmlydHVhbCBkb3VibGUgUmVhZEZhbGxpbmdUaW1lc3RhbXAoKTsvLy88IFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgZmFsbGluZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZC4KKwl2aXJ0dWFsIHZvaWQgU2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSk7Citwcm90ZWN0ZWQ6CisJdm9pZCogbV9pbnRlcnJ1cHQ7CisJdWludDMyX3QgbV9pbnRlcnJ1cHRJbmRleDsKKwl2b2lkIEFsbG9jYXRlSW50ZXJydXB0cyhib29sIHdhdGNoZXIpOworCisJc3RhdGljIFJlc291cmNlICptX2ludGVycnVwdHM7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSXRlcmF0aXZlUm9ib3QuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0l0ZXJhdGl2ZVJvYm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhMWNjMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0l0ZXJhdGl2ZVJvYm90LmgKQEAgLTAsMCArMSw3MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlJvYm90QmFzZS5oIgorCisvKioKKyAqIEl0ZXJhdGl2ZVJvYm90IGltcGxlbWVudHMgYSBzcGVjaWZpYyB0eXBlIG9mIFJvYm90IFByb2dyYW0gZnJhbWV3b3JrLCBleHRlbmRpbmcgdGhlIFJvYm90QmFzZSBjbGFzcy4KKyAqIAorICogVGhlIEl0ZXJhdGl2ZVJvYm90IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgYSB1c2VyIGNyZWF0aW5nIGEgcm9ib3QgcHJvZ3JhbS4KKyAqIAorICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBpbXBsZW1lbnQgdGhlICJvbGQgc3R5bGUiIGRlZmF1bHQgY29kZSwgYnkgcHJvdmlkaW5nCisgKiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIGJ5IHRoZSBtYWluIGxvb3AsIFN0YXJ0Q29tcGV0aXRpb24oKSwgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWVzOgorICogCisgKiBSb2JvdEluaXQoKSAtLSBwcm92aWRlIGZvciBpbml0aWFsaXphdGlvbiBhdCByb2JvdCBwb3dlci1vbgorICogCisgKiBJbml0KCkgZnVuY3Rpb25zIC0tIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaXMgY2FsbGVkIG9uY2Ugd2hlbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgbW9kZSBpcyBlbnRlcmVkOgorICogIC0gRGlzYWJsZWRJbml0KCkgICAtLSBjYWxsZWQgb25seSB3aGVuIGZpcnN0IGRpc2FibGVkCisgKiAgLSBBdXRvbm9tb3VzSW5pdCgpIC0tIGNhbGxlZCBlYWNoIGFuZCBldmVyeSB0aW1lIGF1dG9ub21vdXMgaXMgZW50ZXJlZCBmcm9tIGFub3RoZXIgbW9kZQorICogIC0gVGVsZW9wSW5pdCgpICAgICAtLSBjYWxsZWQgZWFjaCBhbmQgZXZlcnkgdGltZSB0ZWxlb3AgaXMgZW50ZXJlZCBmcm9tIGFub3RoZXIgbW9kZQorICogIC0gVGVzdEluaXQoKSAgICAgICAtLSBjYWxsZWQgZWFjaCBhbmQgZXZlcnkgdGltZSB0ZXN0IGlzIGVudGVyZWQgZnJvbSBhbm90aGVyIG1vZGUKKyAqIAorICogUGVyaW9kaWMoKSBmdW5jdGlvbnMgLS0gZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgY2FsbGVkIGl0ZXJhdGl2ZWx5IGF0IHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgcGVyaW9kaWMgcmF0ZSAoYWthIHRoZSAic2xvdyBsb29wIikuICBUaGUgZGVmYXVsdCBwZXJpb2Qgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpdGVyYXRpdmUgcm9ib3QgaXMgc3luY2VkIHRvIHRoZSBkcml2ZXIgc3RhdGlvbiBjb250cm9sIHBhY2tldHMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBnaXZpbmcgYSBwZXJpb2RpYyBmcmVxdWVuY3kgb2YgYWJvdXQgNTBIeiAoNTAgdGltZXMgcGVyIHNlY29uZCkuCisgKiAgIC0gRGlzYWJsZWRQZXJpb2RpYygpCisgKiAgIC0gQXV0b25vbW91c1BlcmlvZGljKCkKKyAqICAgLSBUZWxlb3BQZXJpb2RpYygpCisgKiAgIC0gVGVzdFBlcmlvZGljKCkKKyAqIAorICovCisKK2NsYXNzIEl0ZXJhdGl2ZVJvYm90IDogcHVibGljIFJvYm90QmFzZQoreworcHVibGljOgorCS8qCisJICogVGhlIGRlZmF1bHQgcGVyaW9kIGZvciB0aGUgcGVyaW9kaWMgZnVuY3Rpb24gY2FsbHMgKHNlY29uZHMpCisJICogU2V0dGluZyB0aGUgcGVyaW9kIHRvIDAuMCB3aWxsIGNhdXNlIHRoZSBwZXJpb2RpYyBmdW5jdGlvbnMgdG8gZm9sbG93CisJICogdGhlIERyaXZlciBTdGF0aW9uIHBhY2tldCByYXRlIG9mIGFib3V0IDUwSHouCisJICovCisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHRQZXJpb2QgPSAwLjA7CisKKwl2aXJ0dWFsIHZvaWQgU3RhcnRDb21wZXRpdGlvbigpOworCisJdmlydHVhbCB2b2lkIFJvYm90SW5pdCgpOworCXZpcnR1YWwgdm9pZCBEaXNhYmxlZEluaXQoKTsKKwl2aXJ0dWFsIHZvaWQgQXV0b25vbW91c0luaXQoKTsKKwl2aXJ0dWFsIHZvaWQgVGVsZW9wSW5pdCgpOworCXZpcnR1YWwgdm9pZCBUZXN0SW5pdCgpOworCisJdmlydHVhbCB2b2lkIERpc2FibGVkUGVyaW9kaWMoKTsKKwl2aXJ0dWFsIHZvaWQgQXV0b25vbW91c1BlcmlvZGljKCk7CisJdmlydHVhbCB2b2lkIFRlbGVvcFBlcmlvZGljKCk7CisJdmlydHVhbCB2b2lkIFRlc3RQZXJpb2RpYygpOworCitwcm90ZWN0ZWQ6CisJdmlydHVhbCB2b2lkIFByZXN0YXJ0KCk7CisKKwl2aXJ0dWFsIH5JdGVyYXRpdmVSb2JvdCgpOworCUl0ZXJhdGl2ZVJvYm90KCk7CisKK3ByaXZhdGU6CisJYm9vbCBtX2Rpc2FibGVkSW5pdGlhbGl6ZWQ7CisJYm9vbCBtX2F1dG9ub21vdXNJbml0aWFsaXplZDsKKwlib29sIG1fdGVsZW9wSW5pdGlhbGl6ZWQ7CisJYm9vbCBtX3Rlc3RJbml0aWFsaXplZDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9KYWd1YXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0phZ3Vhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYjdiNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9KYWd1YXIuaApAQCAtMCwwICsxLDI4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBMdW1pbmFyeSBNaWNybyAvIFZleCBSb2JvdGljcyBKYWd1YXIgU3BlZWQgQ29udHJvbGxlciB3aXRoIFBXTSBjb250cm9sCisgKi8KK2NsYXNzIEphZ3VhciA6IHB1YmxpYyBTYWZlUFdNLCBwdWJsaWMgU3BlZWRDb250cm9sbGVyCit7CitwdWJsaWM6CisJZXhwbGljaXQgSmFndWFyKHVpbnQzMl90IGNoYW5uZWwpOworCXZpcnR1YWwgfkphZ3VhcigpOworCXZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCk7CisJdmlydHVhbCBmbG9hdCBHZXQoKTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpOworCisJdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0SmFndWFyKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvSm95c3RpY2suaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0pveXN0aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlMDZmNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL0pveXN0aWNrLmgKQEAgLTAsMCArMSw5MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEpPWVNUSUNLX0hfCisjZGVmaW5lIEpPWVNUSUNLX0hfCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgIkdlbmVyaWNISUQuaCIKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKworY2xhc3MgRHJpdmVyU3RhdGlvbjsKKworLyoqCisgKiBIYW5kbGUgaW5wdXQgZnJvbSBzdGFuZGFyZCBKb3lzdGlja3MgY29ubmVjdGVkIHRvIHRoZSBEcml2ZXIgU3RhdGlvbi4KKyAqIFRoaXMgY2xhc3MgaGFuZGxlcyBzdGFuZGFyZCBpbnB1dCB0aGF0IGNvbWVzIGZyb20gdGhlIERyaXZlciBTdGF0aW9uLiBFYWNoIHRpbWUgYSB2YWx1ZSBpcyByZXF1ZXN0ZWQKKyAqIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBpcyByZXR1cm5lZC4gVGhlcmUgaXMgYSBzaW5nbGUgY2xhc3MgaW5zdGFuY2UgZm9yIGVhY2ggam95c3RpY2sgYW5kIHRoZSBtYXBwaW5nCisgKiBvZiBwb3J0cyB0byBoYXJkd2FyZSBidXR0b25zIGRlcGVuZHMgb24gdGhlIGNvZGUgaW4gdGhlIGRyaXZlciBzdGF0aW9uLgorICovCitjbGFzcyBKb3lzdGljayA6IHB1YmxpYyBHZW5lcmljSElELCBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0WEF4aXMgPSAwOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFlBeGlzID0gMTsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0RlZmF1bHRaQXhpcyA9IDI7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0VHdpc3RBeGlzID0gMjsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0RlZmF1bHRUaHJvdHRsZUF4aXMgPSAzOworCXR5cGVkZWYgZW51bQorCXsKKwkJa1hBeGlzLCBrWUF4aXMsIGtaQXhpcywga1R3aXN0QXhpcywga1Rocm90dGxlQXhpcywga051bUF4aXNUeXBlcworCX0gQXhpc1R5cGU7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0VHJpZ2dlckJ1dHRvbiA9IDE7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0VG9wQnV0dG9uID0gMjsKKwl0eXBlZGVmIGVudW0KKwl7CisJCWtUcmlnZ2VyQnV0dG9uLCBrVG9wQnV0dG9uLCBrTnVtQnV0dG9uVHlwZXMKKwl9IEJ1dHRvblR5cGU7CisJdHlwZWRlZiBlbnVtCisJeworCQlrTGVmdFJ1bWJsZSwga1JpZ2h0UnVtYmxlCisJfSBSdW1ibGVUeXBlOworCisJZXhwbGljaXQgSm95c3RpY2sodWludDMyX3QgcG9ydCk7CisJSm95c3RpY2sodWludDMyX3QgcG9ydCwgdWludDMyX3QgbnVtQXhpc1R5cGVzLCB1aW50MzJfdCBudW1CdXR0b25UeXBlcyk7CisJdmlydHVhbCB+Sm95c3RpY2soKTsKKworCXVpbnQzMl90IEdldEF4aXNDaGFubmVsKEF4aXNUeXBlIGF4aXMpOworCXZvaWQgU2V0QXhpc0NoYW5uZWwoQXhpc1R5cGUgYXhpcywgdWludDMyX3QgY2hhbm5lbCk7CisKKwl2aXJ0dWFsIGZsb2F0IEdldFgoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKTsKKwl2aXJ0dWFsIGZsb2F0IEdldFkoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKTsKKwl2aXJ0dWFsIGZsb2F0IEdldFooKTsKKwl2aXJ0dWFsIGZsb2F0IEdldFR3aXN0KCk7CisJdmlydHVhbCBmbG9hdCBHZXRUaHJvdHRsZSgpOworCXZpcnR1YWwgZmxvYXQgR2V0QXhpcyhBeGlzVHlwZSBheGlzKTsKKwlmbG9hdCBHZXRSYXdBeGlzKHVpbnQzMl90IGF4aXMpOworCisJdmlydHVhbCBib29sIEdldFRyaWdnZXIoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKTsKKwl2aXJ0dWFsIGJvb2wgR2V0VG9wKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCk7CisJdmlydHVhbCBib29sIEdldEJ1bXBlcihKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpOworCXZpcnR1YWwgYm9vbCBHZXRSYXdCdXR0b24odWludDMyX3QgYnV0dG9uKTsKKwl2aXJ0dWFsIGludCBHZXRQT1YodWludDMyX3QgcG92ID0gMCk7CisJYm9vbCBHZXRCdXR0b24oQnV0dG9uVHlwZSBidXR0b24pOworCXN0YXRpYyBKb3lzdGljayogR2V0U3RpY2tGb3JQb3J0KHVpbnQzMl90IHBvcnQpOworCisJdmlydHVhbCBmbG9hdCBHZXRNYWduaXR1ZGUoKTsKKwl2aXJ0dWFsIGZsb2F0IEdldERpcmVjdGlvblJhZGlhbnMoKTsKKwl2aXJ0dWFsIGZsb2F0IEdldERpcmVjdGlvbkRlZ3JlZXMoKTsKKworCWludCBHZXRBeGlzQ291bnQoKTsKKwlpbnQgR2V0QnV0dG9uQ291bnQoKTsKKwlpbnQgR2V0UE9WQ291bnQoKTsKKwkKKwl2b2lkIFNldFJ1bWJsZShSdW1ibGVUeXBlIHR5cGUsIGZsb2F0IHZhbHVlKTsKKwl2b2lkIFNldE91dHB1dCh1aW50OF90IG91dHB1dE51bWJlciwgYm9vbCB2YWx1ZSk7CisJdm9pZCBTZXRPdXRwdXRzKHVpbnQzMl90IHZhbHVlKTsKKworcHJpdmF0ZToKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oSm95c3RpY2spOworCXZvaWQgSW5pdEpveXN0aWNrKHVpbnQzMl90IG51bUF4aXNUeXBlcywgdWludDMyX3QgbnVtQnV0dG9uVHlwZXMpOworCisJRHJpdmVyU3RhdGlvbiAqbV9kczsKKwl1aW50MzJfdCBtX3BvcnQ7CisJdWludDMyX3QgKm1fYXhlczsKKwl1aW50MzJfdCAqbV9idXR0b25zOworCXVpbnQzMl90IG1fb3V0cHV0czsKKwl1aW50MTZfdCBtX2xlZnRSdW1ibGU7CisJdWludDE2X3QgbV9yaWdodFJ1bWJsZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTW90b3JTYWZldHkuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL01vdG9yU2FmZXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3ZGZjNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL01vdG9yU2FmZXR5LmgKQEAgLTAsMCArMSwyMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNkZWZpbmUgREVGQVVMVF9TQUZFVFlfRVhQSVJBVElPTiAwLjEKKworY2xhc3MgTW90b3JTYWZldHkKK3sKK3B1YmxpYzoKKwl2aXJ0dWFsIHZvaWQgU2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSA9IDA7CisJdmlydHVhbCBmbG9hdCBHZXRFeHBpcmF0aW9uKCkgPSAwOworCXZpcnR1YWwgYm9vbCBJc0FsaXZlKCkgPSAwOworCXZpcnR1YWwgdm9pZCBTdG9wTW90b3IoKSA9IDA7CisJdmlydHVhbCB2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CisJdmlydHVhbCBib29sIElzU2FmZXR5RW5hYmxlZCgpID0gMDsKKwl2aXJ0dWFsIHZvaWQgR2V0RGVzY3JpcHRpb24oY2hhciAqZGVzYykgPSAwOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL01vdG9yU2FmZXR5SGVscGVyLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Nb3RvclNhZmV0eUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzQyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Nb3RvclNhZmV0eUhlbHBlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAiSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwIgorCitjbGFzcyBNb3RvclNhZmV0eTsKKworY2xhc3MgTW90b3JTYWZldHlIZWxwZXIgOiBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisJTW90b3JTYWZldHlIZWxwZXIoTW90b3JTYWZldHkgKnNhZmVPYmplY3QpOworCX5Nb3RvclNhZmV0eUhlbHBlcigpOworCXZvaWQgRmVlZCgpOworCXZvaWQgU2V0RXhwaXJhdGlvbihmbG9hdCBleHBpcmF0aW9uVGltZSk7CisJZmxvYXQgR2V0RXhwaXJhdGlvbigpOworCWJvb2wgSXNBbGl2ZSgpOworCXZvaWQgQ2hlY2soKTsKKwl2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwlib29sIElzU2FmZXR5RW5hYmxlZCgpOworCXN0YXRpYyB2b2lkIENoZWNrTW90b3JzKCk7Citwcml2YXRlOgorCWRvdWJsZSBtX2V4cGlyYXRpb247CQkJLy8gdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhpcyBvYmplY3QKKwlib29sIG1fZW5hYmxlZDsJCQkJCS8vIHRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuYWJsZWQgZm9yIHRoaXMgbW90b3IKKwlkb3VibGUgbV9zdG9wVGltZTsgCQkJCS8vIHRoZSBGUEdBIGNsb2NrIHZhbHVlIHdoZW4gdGhpcyBtb3RvciBoYXMgZXhwaXJlZAorCVJlZW50cmFudE11dGV4IG1fc3luY011dGV4OwkJCS8vIHByb3RlY3QgYWNjZXNzZXMgdG8gdGhlIHN0YXRlIGZvciB0aGlzIG9iamVjdAorCU1vdG9yU2FmZXR5ICptX3NhZmVPYmplY3Q7CQkvLyB0aGUgb2JqZWN0IHRoYXQgaXMgdXNpbmcgdGhlIGhlbHBlcgorCU1vdG9yU2FmZXR5SGVscGVyICptX25leHRIZWxwZXI7IC8vIG5leHQgb2JqZWN0IGluIHRoZSBsaXN0IG9mIE1vdG9yU2FmZXR5SGVscGVycworCXN0YXRpYyBNb3RvclNhZmV0eUhlbHBlciAqbV9oZWFkSGVscGVyOyAvLyB0aGUgaGVhZCBvZiB0aGUgbGlzdCBvZiBNb3RvclNhZmV0eUhlbHBlciBvYmplY3RzCisJc3RhdGljIFJlZW50cmFudE11dGV4IG1fbGlzdE11dGV4OwkvLyBwcm90ZWN0IGFjY2Vzc2VzIHRvIHRoZSBsaXN0IG9mIGhlbHBlcnMKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OSUlNQVFkeC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTklJTUFRZHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQwMDYzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTklJTUFRZHguaApAQCAtMCwwICsxLDY0NiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLw0KKy8vICBUaXRsZQkgIDogTklJTUFRZHguaA0KKy8vICBDcmVhdGVkCSAgOiAxNDAzNjg1ODM0IHNlY29uZHMgYWZ0ZXIgMS8xLzE5NzAgMTI6MDA6MDAgVVRDIA0KKy8vICBDb3B5cmlnaHQgOiCpIENvcHlyaWdodCAyMDA2LCBOYXRpb25hbCBJbnN0cnVtZW50cyBDb3Jwb3JhdGlvbiwgQWxsIHJpZ2h0cyByZXNlcnZlZA0KKy8vIAlQdXJwb3NlCSAgOiBJbmNsdWRlIGZpbGUgZm9yIE5JLUlNQVFkeCBsaWJyYXJ5IHN1cHBvcnQuDQorLy8NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyNpZm5kZWYgX19fbmlpbWFxZHhfaF9fXw0KKyNkZWZpbmUgX19fbmlpbWFxZHhfaF9fXw0KKw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KKw0KKyNpZiAhZGVmaW5lZChuaWltYXFkeF90eXBlcykNCisjZGVmaW5lIG5paW1hcWR4X3R5cGVzDQorDQorI2lmZGVmIF9DVklfDQorICAgICNwcmFnbWEgIEVuYWJsZUxpYnJhcnlSdW50aW1lQ2hlY2tpbmcNCisjZW5kaWYNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBUeXBlZGVmcw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorI2lmbmRlZiBfTklfdUludDhfREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfdUludDhfREVGSU5FRF8NCisgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVJbnQ4Ow0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX05JX3VJbnQxNl9ERUZJTkVEXw0KKyAgICAjZGVmaW5lIF9OSV91SW50MTZfREVGSU5FRF8NCisgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgIHVJbnQxNjsNCisjZW5kaWYNCisNCisjaWZuZGVmIF9OSV91SW50MzJfREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfdUludDMyX0RFRklORURfDQorICAgICNpZiBkZWZpbmVkKF9NU0NfVkVSKQ0KKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIHVJbnQzMjsNCisgICAgI2VsaWYgX19HTlVDX18NCisgICAgICAgICNpZiBfX3g4Nl82NF9fDQorICAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdUludDMyOw0KKyAgICAgICAgI2Vsc2UNCisgICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1SW50MzI7DQorICAgICAgICAjZW5kaWYNCisgICAgI2VuZGlmDQorI2VuZGlmDQorDQorI2lmbmRlZiBfTklfdUludDY0X0RFRklORURfDQorICAgICNkZWZpbmUgX05JX3VJbnQ2NF9ERUZJTkVEXw0KKyAgICAjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgX0NWSV8gPj0gNzAwDQorICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgdUludDY0Ow0KKyAgICAjZWxpZiBfX0dOVUNfXw0KKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVJbnQ2NDsNCisgICAgI2VuZGlmDQorI2VuZGlmDQorDQorI2lmbmRlZiBfTklfSW50OF9ERUZJTkVEXw0KKyAgICAjZGVmaW5lIF9OSV9JbnQ4X0RFRklORURfDQorICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBJbnQ4Ow0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX05JX0ludDE2X0RFRklORURfDQorICAgICNkZWZpbmUgX05JX0ludDE2X0RFRklORURfDQorICAgIHR5cGVkZWYgc2hvcnQgaW50ICAgICAgICAgICBJbnQxNjsNCisjZW5kaWYNCisNCisjaWZuZGVmIF9OSV9JbnQzMl9ERUZJTkVEXw0KKyAgICAjZGVmaW5lIF9OSV9JbnQzMl9ERUZJTkVEXw0KKyAgICAjaWYgZGVmaW5lZChfTVNDX1ZFUikNCisgICAgICAgIHR5cGVkZWYgbG9uZyAgICAgICAgICAgIEludDMyOw0KKyAgICAjZWxpZiBfX0dOVUNfXw0KKyAgICAgICAgI2lmIF9feDg2XzY0X18NCisgICAgICAgICAgICB0eXBlZGVmIGludCAgICAgICAgIEludDMyOw0KKyAgICAgICAgI2Vsc2UNCisgICAgICAgICAgICB0eXBlZGVmIGxvbmcgICAgICAgIEludDMyOw0KKyAgICAgICAgI2VuZGlmDQorICAgICNlbmRpZg0KKyNlbmRpZiAgDQorDQorI2lmbmRlZiBfTklfSW50NjRfREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfSW50NjRfREVGSU5FRF8NCisgICAgI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IF9DVklfID49IDcwMA0KKyAgICAgICAgdHlwZWRlZiBfX2ludDY0ICAgICAgICBJbnQ2NDsNCisgICAgI2VsaWYgX19HTlVDX18NCisgICAgICAgIHR5cGVkZWYgbG9uZyBsb25nIGludCAgSW50NjQ7DQorICAgICNlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX05JX2Zsb2F0MzJfREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfZmxvYXQzMl9ERUZJTkVEXw0KKyAgICB0eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAgZmxvYXQzMjsNCisjZW5kaWYNCisNCisjaWZuZGVmIF9OSV9mbG9hdDY0X0RFRklORURfDQorICAgICNkZWZpbmUgX05JX2Zsb2F0NjRfREVGSU5FRF8NCisgICAgdHlwZWRlZiBkb3VibGUgICAgICAgICAgICAgIGZsb2F0NjQ7DQorI2VuZGlmDQorDQorI2lmbmRlZiBUUlVFDQorICAgICNkZWZpbmUgVFJVRSAgICAgICAgICAgICAgICAoMUwpDQorI2VuZGlmDQorDQorI2lmbmRlZiBGQUxTRQ0KKyAgICAjZGVmaW5lIEZBTFNFICAgICAgICAgICAgICAgKDBMKQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX05JX0dVSURITkRMX0RFRklORUQNCisgICAgdHlwZWRlZiB1SW50MzIgICAgICAgICAgICAgIEdVSUhOREw7DQorI2VuZGlmDQorDQorI2lmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9DVklfKSkNCisgICAgI2lmbmRlZiBfTklfRlVOQ19ERUZJTkVEDQorICAgICAgICAjZGVmaW5lIE5JX0ZVTkMgICAgICAgICBfX3N0ZGNhbGwNCisgICAgI2VuZGlmDQorICAgIA0KKyAgICAjaWZuZGVmIF9OSV9GVU5DQ19ERUZJTkVEDQorICAgICAgICAjZGVmaW5lIE5JX0ZVTkNDICAgICAgICBfX2NkZWNsDQorICAgICNlbmRpZg0KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pDQorICAgICNpZm5kZWYgX05JX0ZVTkNfREVGSU5FRA0KKyAgICAgICAgI2RlZmluZSBOSV9GVU5DDQorICAgICNlbmRpZg0KKyAgICANCisgICAgI2lmbmRlZiBfTklfRlVOQ0NfREVGSU5FRA0KKyAgICAgICAgI2RlZmluZSBOSV9GVU5DQw0KKyAgICAjZW5kaWYNCisjZW5kaWYNCisNCisjaWZuZGVmIF9OSV9ib29sMzJfREVGSU5FRF8NCisgICAgI2RlZmluZSBfTklfYm9vbDMyX0RFRklORURfDQorICAgIHR5cGVkZWYgdUludDMyICAgICAgICAgICAgICBib29sMzI7DQorI2VuZGlmDQorDQorI2lmbmRlZiBfTklfSU1BUWR4U2Vzc2lvbl9ERUZJTkVEXw0KKyAgICAjZGVmaW5lIF9OSV9JTUFRZHhTZXNzaW9uX0RFRklORURfDQorICAgIHR5cGVkZWYgdUludDMyICAgICAgICAgICAgICBJTUFRZHhTZXNzaW9uOw0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSCA1MTINCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBGb3J3YXJkIERlY2xhcmUgRGF0YSBTdHJ1Y3R1cmVzDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIHN0cnVjdCBJbWFnZV9zdHJ1Y3QgSW1hZ2U7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgRXJyb3IgQ29kZXMgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhFcnJvcl9lbnVtIHsNCisgICAgSU1BUWR4RXJyb3JTdWNjZXNzID0gMHgwLCAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzDQorICAgIElNQVFkeEVycm9yU3lzdGVtTWVtb3J5RnVsbCA9IDB4QkZGNjkwMDAsICAgLy8gTm90IGVub3VnaCBtZW1vcnkNCisgICAgSU1BUWR4RXJyb3JJbnRlcm5hbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCBlcnJvcg0KKyAgICBJTUFRZHhFcnJvckludmFsaWRQYXJhbWV0ZXIsICAgICAgICAgICAgICAgIC8vIEludmFsaWQgcGFyYW1ldGVyDQorICAgIElNQVFkeEVycm9ySW52YWxpZFBvaW50ZXIsICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBwb2ludGVyDQorICAgIElNQVFkeEVycm9ySW52YWxpZEludGVyZmFjZSwgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBjYW1lcmEgc2Vzc2lvbg0KKyAgICBJTUFRZHhFcnJvckludmFsaWRSZWdpc3RyeUtleSwgICAgICAgICAgICAgIC8vIEludmFsaWQgcmVnaXN0cnkga2V5DQorICAgIElNQVFkeEVycm9ySW52YWxpZEFkZHJlc3MsICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhZGRyZXNzDQorICAgIElNQVFkeEVycm9ySW52YWxpZERldmljZVR5cGUsICAgICAgICAgICAgICAgLy8gSW52YWxpZCBkZXZpY2UgdHlwZQ0KKyAgICBJTUFRZHhFcnJvck5vdEltcGxlbWVudGVkLCAgICAgICAgICAgICAgICAgIC8vIE5vdCBpbXBsZW1lbnRlZA0KKyAgICBJTUFRZHhFcnJvckNhbWVyYU5vdEZvdW5kLCAgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBub3QgZm91bmQNCisgICAgSU1BUWR4RXJyb3JDYW1lcmFJblVzZSwgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgaXMgYWxyZWFkeSBpbiB1c2UuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhTm90SW5pdGlhbGl6ZWQsICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIG5vdCBpbml0aWFsaXplZC4NCisgICAgSU1BUWR4RXJyb3JDYW1lcmFSZW1vdmVkLCAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgaGFzIGJlZW4gcmVtb3ZlZC4NCisgICAgSU1BUWR4RXJyb3JDYW1lcmFSdW5uaW5nLCAgICAgICAgICAgICAgICAgICAvLyBBY3F1aXNpdGlvbiBpbiBwcm9ncmVzcy4NCisgICAgSU1BUWR4RXJyb3JDYW1lcmFOb3RSdW5uaW5nLCAgICAgICAgICAgICAgICAvLyBObyBhY3F1aXNpdGlvbiBpbiBwcm9ncmVzcy4NCisgICAgSU1BUWR4RXJyb3JBdHRyaWJ1dGVOb3RTdXBwb3J0ZWQsICAgICAgICAgICAvLyBBdHRyaWJ1dGUgbm90IHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhLg0KKyAgICBJTUFRZHhFcnJvckF0dHJpYnV0ZU5vdFNldHRhYmxlLCAgICAgICAgICAgIC8vIFVuYWJsZSB0byBzZXQgYXR0cmlidXRlLg0KKyAgICBJTUFRZHhFcnJvckF0dHJpYnV0ZU5vdFJlYWRhYmxlLCAgICAgICAgICAgIC8vIFVuYWJsZSB0byBnZXQgYXR0cmlidXRlLg0KKyAgICBJTUFRZHhFcnJvckF0dHJpYnV0ZU91dE9mUmFuZ2UsICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuDQorICAgIElNQVFkeEVycm9yQnVmZmVyTm90QXZhaWxhYmxlLCAgICAgICAgICAgICAgLy8gUmVxdWVzdGVkIGJ1ZmZlciBpcyB1bmF2YWlsYWJsZS4NCisgICAgSU1BUWR4RXJyb3JCdWZmZXJMaXN0RW1wdHksICAgICAgICAgICAgICAgICAvLyBCdWZmZXIgbGlzdCBpcyBlbXB0eS4gQWRkIG9uZSBvciBtb3JlIGJ1ZmZlcnMuDQorICAgIElNQVFkeEVycm9yQnVmZmVyTGlzdExvY2tlZCwgICAgICAgICAgICAgICAgLy8gQnVmZmVyIGxpc3QgaXMgYWxyZWFkeSBsb2NrZWQuIFJlY29uZmlndXJlIGFjcXVpc2l0aW9uIGFuZCB0cnkgYWdhaW4uDQorICAgIElNQVFkeEVycm9yQnVmZmVyTGlzdE5vdExvY2tlZCwgICAgICAgICAgICAgLy8gTm8gYnVmZmVyIGxpc3QuIFJlY29uZmlndXJlIGFjcXVpc2l0aW9uIGFuZCB0cnkgYWdhaW4uDQorICAgIElNQVFkeEVycm9yUmVzb3VyY2VzQWxsb2NhdGVkLCAgICAgICAgICAgICAgLy8gVHJhbnNmZXIgZW5naW5lIHJlc291cmNlcyBhbHJlYWR5IGFsbG9jYXRlZC4gUmVjb25maWd1cmUgYWNxdWlzaXRpb24gYW5kIHRyeSBhZ2Fpbi4NCisgICAgSU1BUWR4RXJyb3JSZXNvdXJjZXNVbmF2YWlsYWJsZSwgICAgICAgICAgICAvLyBJbnN1ZmZpY2llbnQgdHJhbnNmZXIgZW5naW5lIHJlc291cmNlcy4NCisgICAgSU1BUWR4RXJyb3JBc3luY1dyaXRlLCAgICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gcGVyZm9ybSBhc3ljaHJvbm91cyByZWdpc3RlciB3cml0ZS4NCisgICAgSU1BUWR4RXJyb3JBc3luY1JlYWQsICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gcGVyZm9ybSBhc3ljaHJvbm91cyByZWdpc3RlciByZWFkLg0KKyAgICBJTUFRZHhFcnJvclRpbWVvdXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQuDQorICAgIElNQVFkeEVycm9yQnVzUmVzZXQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVzIHJlc2V0IG9jY3VycmVkIGR1cmluZyBhIHRyYW5zYWN0aW9uLg0KKyAgICBJTUFRZHhFcnJvckludmFsaWRYTUwsICAgICAgICAgICAgICAgICAgICAgIC8vIFVuYWJsZSB0byBsb2FkIGNhbWVyYSdzIFhNTCBmaWxlLg0KKyAgICBJTUFRZHhFcnJvckZpbGVBY2Nlc3MsICAgICAgICAgICAgICAgICAgICAgIC8vIFVuYWJsZSB0byByZWFkL3dyaXRlIHRvIGZpbGUuDQorICAgIElNQVFkeEVycm9ySW52YWxpZENhbWVyYVVSTFN0cmluZywgICAgICAgICAgLy8gQ2FtZXJhIGhhcyBtYWxmb3JtZWQgVVJMIHN0cmluZy4NCisgICAgSU1BUWR4RXJyb3JJbnZhbGlkQ2FtZXJhRmlsZSwgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGNhbWVyYSBmaWxlLg0KKyAgICBJTUFRZHhFcnJvckdlbklDYW1FcnJvciwgICAgICAgICAgICAgICAgICAgIC8vIFVua25vd24gR2VuaWNhbSBlcnJvci4NCisgICAgSU1BUWR4RXJyb3JGb3JtYXQ3UGFyYW1ldGVycywgICAgICAgICAgICAgICAvLyBGb3IgZm9ybWF0IDc6IFRoZSBjb21iaW5hdGlvbiBvZiBzcGVlZCwgaW1hZ2UgcG9zaXRpb24sIGltYWdlIHNpemUsIGFuZCBjb2xvciBjb2RpbmcgaXMgaW5jb3JyZWN0Lg0KKyAgICBJTUFRZHhFcnJvckludmFsaWRBdHRyaWJ1dGVUeXBlLCAgICAgICAgICAgIC8vIFRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXNzZWQgdmFyaWFibGUgdHlwZS4NCisgICAgSU1BUWR4RXJyb3JETExOb3RGb3VuZCwgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgRExMIGNvdWxkIG5vdCBiZSBmb3VuZC4NCisgICAgSU1BUWR4RXJyb3JGdW5jdGlvbk5vdEZvdW5kLCAgICAgICAgICAgICAgICAvLyBUaGUgZnVuY3Rpb24gY291bGQgbm90IGJlIGZvdW5kLg0KKyAgICBJTUFRZHhFcnJvckxpY2Vuc2VOb3RBY3RpdmF0ZWQsICAgICAgICAgICAgIC8vIExpY2Vuc2Ugbm90IGFjdGl2YXRlZC4NCisgICAgSU1BUWR4RXJyb3JDYW1lcmFOb3RDb25maWd1cmVkRm9yTGlzdGVuZXIsICAvLyBUaGUgY2FtZXJhIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5IHRvIHN1cHBvcnQgYSBsaXN0ZW5lci4NCisgICAgSU1BUWR4RXJyb3JDYW1lcmFNdWx0aWNhc3ROb3RBdmFpbGFibGUsICAgICAvLyBVbmFibGUgdG8gY29uZmlndXJlIHRoZSBzeXN0ZW0gZm9yIG11bHRpY2FzdCBzdXBwb3J0Lg0KKyAgICBJTUFRZHhFcnJvckJ1ZmZlckhhc0xvc3RQYWNrZXRzLCAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgYnVmZmVyIGhhcyBsb3N0IHBhY2tldHMgYW5kIHRoZSB1c2VyIHJlcXVlc3RlZCBhbiBlcnJvciB0byBiZSBnZW5lcmF0ZWQuDQorICAgIElNQVFkeEVycm9yR2lHRVZpc2lvbkVycm9yLCAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBHaUdFIFZpc2lvbiBlcnJvci4NCisgICAgSU1BUWR4RXJyb3JOZXR3b3JrRXJyb3IsICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIG5ldHdvcmsgZXJyb3IuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhVW5yZWFjaGFibGUsICAgICAgICAgICAgICAgLy8gVW5hYmxlIHRvIGNvbm5lY3QgdG8gdGhlIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JIaWdoUGVyZm9ybWFuY2VOb3RTdXBwb3J0ZWQsICAgICAvLyBIaWdoIHBlcmZvcm1hbmNlIGFjcXVpc2l0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmllZCBuZXR3b3JrIGludGVyZmFjZS4gQ29ubmVjdCB0aGUgY2FtZXJhIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgcnVubmluZyB0aGUgaGlnaCBwZXJmb3JtYW5jZSBkcml2ZXIuDQorICAgIElNQVFkeEVycm9ySW50ZXJmYWNlTm90UmVuYW1lZCwgICAgICAgICAgICAgLy8gVW5hYmxlIHRvIHJlbmFtZSBpbnRlcmZhY2UuIEludmFsaWQgb3IgZHVwbGljYXRlIG5hbWUgc3BlY2lmaWVkLg0KKyAgICBJTUFRZHhFcnJvck5vU3VwcG9ydGVkVmlkZW9Nb2RlcywgICAgICAgICAgIC8vIFRoZSBjYW1lcmEgZG9lcyBub3QgaGF2ZSBhbnkgdmlkZW8gbW9kZXMgd2hpY2ggYXJlIHN1cHBvcnRlZC4NCisgICAgSU1BUWR4RXJyb3JTb2Z0d2FyZVRyaWdnZXJPdmVycnVuLCAgICAgICAgICAvLyBTb2Z0d2FyZSB0cmlnZ2VyIG92ZXJydW4uDQorICAgIElNQVFkeEVycm9yVGVzdFBhY2tldE5vdFJlY2VpdmVkLCAgICAgICAgICAgLy8gVGhlIHN5c3RlbSBkaWQgbm90IHJlY2VpdmUgYSB0ZXN0IHBhY2tldCBmcm9tIHRoZSBjYW1lcmEuIFRoZSBwYWNrZXQgc2l6ZSBtYXkgYmUgdG9vIGxhcmdlIGZvciB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uIG9yIGEgZmlyZXdhbGwgbWF5IGJlIGVuYWJsZWQuDQorICAgIElNQVFkeEVycm9yQ29ycnVwdGVkSW1hZ2VSZWNlaXZlZCwgICAgICAgICAgLy8gVGhlIGNhbWVyYSByZXR1cm5lZCBhIGNvcnJ1cHRlZCBpbWFnZS4NCisgICAgSU1BUWR4RXJyb3JDYW1lcmFDb25maWd1cmF0aW9uSGFzQ2hhbmdlZCwgICAvLyBUaGUgY2FtZXJhIGRpZCBub3QgcmV0dXJuIGFuIGltYWdlIG9mIHRoZSBjb3JyZWN0IHR5cGUgaXQgd2FzIGNvbmZpZ3VyZWQgZm9yIHByZXZpb3VzbHkuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhSW52YWxpZEF1dGhlbnRpY2F0aW9uLCAgICAgLy8gVGhlIGNhbWVyYSBpcyBjb25maWd1cmVkIHdpdGggcGFzc3dvcmQgYXV0aGVudGljYXRpb24gYW5kIGVpdGhlciB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB3ZXJlIG5vdCBjb25maWd1cmVkIG9yIHRoZXkgYXJlIGluY29ycmVjdC4NCisgICAgSU1BUWR4RXJyb3JVbmtub3duSFRUUEVycm9yLCAgICAgICAgICAgICAgICAvLyBUaGUgY2FtZXJhIHJldHVybmVkIGFuIHVua25vd24gSFRUUCBlcnJvci4NCisgICAgSU1BUWR4RXJyb3JLZXJuZWxEcml2ZXJVbmF2YWlsYWJsZSwgICAgICAgICAvLyBVbmFibGUgdG8gYXR0YWNoIHRvIHRoZSBrZXJuZWwgbW9kZSBkcml2ZXIuDQorICAgIElNQVFkeEVycm9yUGl4ZWxGb3JtYXREZWNvZGVyVW5hdmFpbGFibGUsICAgLy8gTm8gZGVjb2RlciBhdmFpbGFibGUgZm9yIHNlbGVjdGVkIHBpeGVsIGZvcm1hdC4NCisgICAgSU1BUWR4RXJyb3JGaXJtd2FyZVVwZGF0ZU5lZWRlZCwgICAgICAgICAgICAvLyBUaGUgYWNxdWlzaXRpb24gaGFyZHdhcmUgbmVlZHMgYSBmaXJtd2FyZSB1cGRhdGUgYmVmb3JlIGl0IGNhbiBiZSB1c2VkLg0KKyAgICBJTUFRZHhFcnJvckZpcm13YXJlVXBkYXRlUmVib290TmVlZGVkLCAgICAgIC8vIFRoZSBmaXJtd2FyZSBvbiB0aGUgYWNxdWlzaXRpb24gaGFyZHdhcmUgaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlIHN5c3RlbSBtdXN0IGJlIHJlYm9vdGVkIGJlZm9yZSB1c2UuDQorICAgIElNQVFkeEVycm9yTGlnaHRpbmdDdXJyZW50T3V0T2ZSYW5nZSwgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBjdXJyZW50IGxldmVsIGZyb20gdGhlIGxpZ2h0aW5nIGNvbnRyb2xsZXIgaXMgbm90IHBvc3NpYmxlLg0KKyAgICBJTUFRZHhFcnJvclVTQjNWaXNpb25FcnJvciwgICAgICAgICAgICAgICAgIC8vIFVua25vd24gVVNCMyBWaXNpb24gZXJyb3IuDQorICAgIElNQVFkeEVycm9ySW52YWxpZFUzVlVTQkRlc2NyaXB0b3IsICAgICAgICAgLy8gVGhlIGNhbWVyYSBoYXMgYSBVU0IgZGVzY3JpcHRvciB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBVU0IzIFZpc2lvbiBzcGVjaWZpY2F0aW9uLg0KKyAgICBJTUFRZHhFcnJvclUzVkludmFsaWRDb250cm9sSW50ZXJmYWNlLCAgICAgIC8vIFRoZSBVU0IzIFZpc2lvbiBjb250cm9sIGludGVyZmFjZSBpcyBub3QgaW1wbGVtZW50ZWQgb3IgaXMgaW52YWxpZCBvbiB0aGlzIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JVM1ZDb250cm9sSW50ZXJmYWNlRXJyb3IsICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZnJvbSB0aGUgY29udHJvbCBpbnRlcmZhY2Ugb2YgdGhlIFVTQjMgVmlzaW9uIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JVM1ZJbnZhbGlkRXZlbnRJbnRlcmZhY2UsICAgICAgICAvLyBUaGUgVVNCMyBWaXNpb24gZXZlbnQgaW50ZXJmYWNlIGlzIG5vdCBpbXBsZW1lbnRlZCBvciBpcyBpbnZhbGlkIG9uIHRoaXMgY2FtZXJhLg0KKyAgICBJTUFRZHhFcnJvclUzVkV2ZW50SW50ZXJmYWNlRXJyb3IsICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBmcm9tIHRoZSBldmVudCBpbnRlcmZhY2Ugb2YgdGhlIFVTQjMgVmlzaW9uIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JVM1ZJbnZhbGlkU3RyZWFtSW50ZXJmYWNlLCAgICAgICAvLyBUaGUgVVNCMyBWaXNpb24gc3RyZWFtIGludGVyZmFjZSBpcyBub3QgaW1wbGVtZW50ZWQgb3IgaXMgaW52YWxpZCBvbiB0aGlzIGNhbWVyYS4NCisgICAgSU1BUWR4RXJyb3JVM1ZTdHJlYW1JbnRlcmZhY2VFcnJvciwgICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZnJvbSB0aGUgc3RyZWFtIGludGVyZmFjZSBvZiB0aGUgVVNCMyBWaXNpb24gY2FtZXJhLg0KKyAgICBJTUFRZHhFcnJvclUzVlVuc3VwcG9ydGVkQ29ubmVjdGlvblNwZWVkLCAgIC8vIFRoZSBVU0IgY29ubmVjdGlvbiBzcGVlZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEuICBDaGVjayB3aGV0aGVyIHRoZSBjYW1lcmEgaXMgcGx1Z2dlZCBpbnRvIGEgVVNCIDIuMCBwb3J0IGluc3RlYWQgb2YgYSBVU0IgMy4wIHBvcnQuICBJZiBzbywgdmVyaWZ5IHRoYXQgdGhlIGNhbWVyYSBzdXBwb3J0cyB0aGlzIHVzZSBjYXNlLiAgICAgICANCisgICAgSU1BUWR4RXJyb3JVM1ZJbnN1ZmZpY2llbnRQb3dlciwgICAgICAgICAgICAvLyBUaGUgVVNCMyBWaXNpb24gY2FtZXJhIHJlcXVpcmVzIG1vcmUgY3VycmVudCB0aGFuIGNhbiBiZSBzdXBwbGllZCBieSB0aGUgVVNCIHBvcnQgaW4gdXNlLg0KKyAgICBJTUFRZHhFcnJvclUzVkludmFsaWRNYXhDdXJyZW50LCAgICAgICAgICAgIC8vIFRoZSBVM1ZfTWF4aW11bUN1cnJlbnRVU0IyMF9tQSByZWdpc3RyeSB2YWx1ZSBpcyBub3QgdmFsaWQgZm9yIHRoZSBjb25uZWN0ZWQgVVNCMyBWaXNpb24gY2FtZXJhLg0KKyAgICBJTUFRZHhFcnJvckJ1ZmZlckluY29tcGxldGVEYXRhLCAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgYnVmZmVyIGhhcyBpbmNvbXBsZXRlIGRhdGEgYW5kIHRoZSB1c2VyIHJlcXVlc3RlZCBhbiBlcnJvciB0byBiZSBnZW5lcmF0ZWQuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhQWNxdWlzaXRpb25Db25maWdGYWlsZWQsICAgLy8gVGhlIGNhbWVyYSByZXR1cm5lZCBhbiBlcnJvciBzdGFydGluZyB0aGUgYWNxdWlzaXRpb24uDQorICAgIElNQVFkeEVycm9yQ2FtZXJhQ2xvc2VQZW5kaW5nLCAgICAgICAgICAgICAgLy8gVGhlIGNhbWVyYSBzdGlsbCBoYXMgb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyBhbmQgd2lsbCBiZSBjbG9zZWQgd2hlbiB0aGVzZSBvcGVyYXRpb25zIGNvbXBsZXRlLg0KKyAgICBJTUFRZHhFcnJvclNvZnR3YXJlRmF1bHQsICAgICAgICAgICAgICAgICAgIC8vIEFuIHVuZXhwZWN0ZWQgc29mdHdhcmUgZXJyb3Igb2NjdXJyZWQuDQorICAgIElNQVFkeEVycm9yQ2FtZXJhUHJvcGVydHlJbnZhbGlkLCAgICAgICAgICAgLy8gVGhlIHZhbHVlIGZvciBhbiBpbnZhbGlkIGNhbWVyYSBwcm9wZXJ0eSB3YXMgcmVxdWVzdGVkLg0KKyAgICBJTUFRZHhFcnJvckp1bWJvRnJhbWVzTm90RW5hYmxlZCwgICAgICAgICAgIC8vIEp1bWJvIGZyYW1lcyBhcmUgbm90IGVuYWJsZWQgb24gdGhlIGhvc3QuICBNYXhpbXVtIHBhY2tldCBzaXplIGlzIDE1MDAgYnl0ZXMuDQorICAgIElNQVFkeEVycm9yQmF5ZXJQaXhlbEZvcm1hdE5vdFNlbGVjdGVkLCAgICAgLy8gVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgY2FtZXJhIGhhcyBhIEJheWVyIHBpeGVsIGZvcm1hdCBzZWxlY3RlZC4NCisgICAgSU1BUWR4RXJyb3JHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhFcnJvcjsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBCdXMgVHlwZSBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeEJ1c1R5cGVfZW51bSB7DQorICAgIElNQVFkeEJ1c1R5cGVGaXJlV2lyZSA9IDB4MzEzMzM5MzQsDQorICAgIElNQVFkeEJ1c1R5cGVFdGhlcm5ldCA9IDB4Njk3MDc2MzQsDQorICAgIElNQVFkeEJ1c1R5cGVTaW11bGF0b3IgPSAweDIwNzM2OTZELA0KKyAgICBJTUFRZHhCdXNUeXBlRGlyZWN0U2hvdyA9IDB4NjQ3MzY4NzcsDQorICAgIElNQVFkeEJ1c1R5cGVJUCA9IDB4NDk1MDYzNkQsDQorICAgIElNQVFkeEJ1c1R5cGVTbWFydENhbTIgPSAweDUzNDM2MTMyLA0KKyAgICBJTUFRZHhCdXNUeXBlVVNCM1Zpc2lvbiA9IDB4NTU1MzQyMzMsDQorICAgIElNQVFkeEJ1c1R5cGVVVkMgPSAweDU1NTY0MzIwLA0KKyAgICBJTUFRZHhCdXNUeXBlR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4QnVzVHlwZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBDYW1lcmEgQ29udHJvbCBNb2RlIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4Q2FtZXJhQ29udHJvbE1vZGVfZW51bSB7DQorICAgIElNQVFkeENhbWVyYUNvbnRyb2xNb2RlQ29udHJvbGxlciwNCisgICAgSU1BUWR4Q2FtZXJhQ29udHJvbE1vZGVMaXN0ZW5lciwNCisgICAgSU1BUWR4Q2FtZXJhQ29udHJvbE1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhDYW1lcmFDb250cm9sTW9kZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBCdWZmZXIgTnVtYmVyIE1vZGUgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlX2VudW0gew0KKyAgICBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlTmV4dCwNCisgICAgSU1BUWR4QnVmZmVyTnVtYmVyTW9kZUxhc3QsDQorICAgIElNQVFkeEJ1ZmZlck51bWJlck1vZGVCdWZmZXJOdW1iZXIsDQorICAgIElNQVFkeEJ1ZmZlck51bWJlck1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIFBsdWcgbiBQbGF5IEV2ZW50IEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4UG5wRXZlbnRfZW51bSB7DQorICAgIElNQVFkeFBucEV2ZW50Q2FtZXJhQXR0YWNoZWQsDQorICAgIElNQVFkeFBucEV2ZW50Q2FtZXJhRGV0YWNoZWQsDQorICAgIElNQVFkeFBucEV2ZW50QnVzUmVzZXQsDQorICAgIElNQVFkeFBucEV2ZW50R3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4UG5wRXZlbnQ7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQmF5ZXIgUGF0dGVybiBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeEJheWVyUGF0dGVybl9lbnVtIHsNCisgICAgSU1BUWR4QmF5ZXJQYXR0ZXJuTm9uZSwNCisgICAgSU1BUWR4QmF5ZXJQYXR0ZXJuR0IsDQorICAgIElNQVFkeEJheWVyUGF0dGVybkdSLA0KKyAgICBJTUFRZHhCYXllclBhdHRlcm5CRywNCisgICAgSU1BUWR4QmF5ZXJQYXR0ZXJuUkcsDQorICAgIElNQVFkeEJheWVyUGF0dGVybkhhcmR3YXJlLA0KKyAgICBJTUFRZHhCYXllclBhdHRlcm5HdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhCYXllclBhdHRlcm47DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQmF5ZXIgRGVjb2RlIEFsZ29yaXRobSBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeEJheWVyQWxnb3JpdGhtX2VudW0gew0KKyAgICBJTUFRZHhCYXllckFsZ29yaXRobUJpbGluZWFyLA0KKyAgICBJTUFRZHhCYXllckFsZ29yaXRobVZORywNCisgICAgSU1BUWR4QmF5ZXJBbGdvcml0aG1HdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhCYXllckFsZ29yaXRobTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBPdXRwdXQgSW1hZ2UgVHlwZXMgLS0gVmFsdWVzIG1hdGNoIFZpc2lvbiBEZXZlbG9wbWVudCBNb2R1bGUgaW1hZ2UgdHlwZXMNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhPdXRwdXRJbWFnZVR5cGVfZW51bSB7DQorICAgIElNQVFkeE91dHB1dEltYWdlVHlwZVU4ICAgID0gMCwNCisgICAgSU1BUWR4T3V0cHV0SW1hZ2VUeXBlSTE2ICAgPSAxLA0KKyAgICBJTUFRZHhPdXRwdXRJbWFnZVR5cGVVMTYgICA9IDcsDQorICAgIElNQVFkeE91dHB1dEltYWdlVHlwZVJHQjMyID0gNCwNCisgICAgSU1BUWR4T3V0cHV0SW1hZ2VUeXBlUkdCNjQgPSA2LA0KKyAgICBJTUFRZHhPdXRwdXRJbWFnZVR5cGVBdXRvICA9IDB4N0ZGRkZGRkYsDQorICAgIElNQVFkeE91dHB1dEltYWdlVHlwZUd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeE91dHB1dEltYWdlVHlwZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBDb250cm9sbGVyIERlc3RpbmF0aW9uIE1vZGUgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhEZXN0aW5hdGlvbk1vZGVfZW51bSB7DQorICAgIElNQVFkeERlc3RpbmF0aW9uTW9kZVVuaWNhc3QsDQorICAgIElNQVFkeERlc3RpbmF0aW9uTW9kZUJyb2FkY2FzdCwNCisgICAgSU1BUWR4RGVzdGluYXRpb25Nb2RlTXVsdGljYXN0LA0KKyAgICBJTUFRZHhEZXN0aW5hdGlvbk1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhEZXN0aW5hdGlvbk1vZGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgIEF0dHJpYnV0ZSBUeXBlIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4QXR0cmlidXRlVHlwZV9lbnVtIHsgICAgDQorICAgIElNQVFkeEF0dHJpYnV0ZVR5cGVVMzIsDQorICAgIElNQVFkeEF0dHJpYnV0ZVR5cGVJNjQsDQorICAgIElNQVFkeEF0dHJpYnV0ZVR5cGVGNjQsDQorICAgIElNQVFkeEF0dHJpYnV0ZVR5cGVTdHJpbmcsDQorICAgIElNQVFkeEF0dHJpYnV0ZVR5cGVFbnVtLA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlQm9vbCwNCisgICAgSU1BUWR4QXR0cmlidXRlVHlwZUNvbW1hbmQsDQorICAgIElNQVFkeEF0dHJpYnV0ZVR5cGVCbG9iLA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4QXR0cmlidXRlVHlwZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBWYWx1ZSBUeXBlIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4VmFsdWVUeXBlX2VudW0geyAgICANCisgICAgSU1BUWR4VmFsdWVUeXBlVTMyLA0KKyAgICBJTUFRZHhWYWx1ZVR5cGVJNjQsDQorICAgIElNQVFkeFZhbHVlVHlwZUY2NCwNCisgICAgSU1BUWR4VmFsdWVUeXBlU3RyaW5nLA0KKyAgICBJTUFRZHhWYWx1ZVR5cGVFbnVtSXRlbSwNCisgICAgSU1BUWR4VmFsdWVUeXBlQm9vbCwNCisgICAgSU1BUWR4VmFsdWVUeXBlRGlzcG9zYWJsZVN0cmluZywNCisgICAgSU1BUWR4VmFsdWVUeXBlR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4VmFsdWVUeXBlOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIEludGVyZmFjZSBGaWxlIEZsYWdzIEVudW1lcmF0aW9uDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIGVudW0gSU1BUWR4SW50ZXJmYWNlRmlsZUZsYWdzX2VudW0gew0KKyAgICBJTUFRZHhJbnRlcmZhY2VGaWxlRmxhZ3NDb25uZWN0ZWQgPSAweDEsDQorICAgIElNQVFkeEludGVyZmFjZUZpbGVGbGFnc0RpcnR5ID0gMHgyLA0KKyAgICBJTUFRZHhJbnRlcmZhY2VGaWxlRmxhZ3NHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhJbnRlcmZhY2VGaWxlRmxhZ3M7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgT3ZlcndyaXRlIE1vZGUgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhPdmVyd3JpdGVNb2RlX2VudW0gew0KKyAgICBJTUFRZHhPdmVyd3JpdGVNb2RlR2V0T2xkZXN0ID0gMHgwLA0KKyAgICBJTUFRZHhPdmVyd3JpdGVNb2RlRmFpbCA9IDB4MiwNCisgICAgSU1BUWR4T3ZlcndyaXRlTW9kZUdldE5ld2VzdCA9IDB4MywNCisgICAgSU1BUWR4T3ZlcndyaXRlTW9kZUd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeE92ZXJ3cml0ZU1vZGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgSW5jb21wbGV0ZSBCdWZmZXIgTW9kZSBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeEluY29tcGxldGVCdWZmZXJNb2RlX2VudW0gew0KKyAgICBJTUFRZHhJbmNvbXBsZXRlQnVmZmVyTW9kZUlnbm9yZSwNCisgICAgSU1BUWR4SW5jb21wbGV0ZUJ1ZmZlck1vZGVGYWlsLA0KKyAgICBJTUFRZHhJbmNvbXBsZXRlQnVmZmVyTW9kZUd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeEluY29tcGxldGVCdWZmZXJNb2RlOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIExvc3QgUGFja2V0IE1vZGUgRW51bWVyYXRpb24NCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgZW51bSBJTUFRZHhMb3N0UGFja2V0TW9kZV9lbnVtIHsNCisgICAgSU1BUWR4TG9zdFBhY2tldE1vZGVJZ25vcmUsDQorICAgIElNQVFkeExvc3RQYWNrZXRNb2RlRmFpbCwNCisgICAgSU1BUWR4TG9zdFBhY2tldE1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsDQorfSBJTUFRZHhMb3N0UGFja2V0TW9kZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBBdHRyaWJ1dGUgVmlzaWJpbGl0eSBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHlfZW51bSB7DQorICAgIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHlTaW1wbGUgPSAweDAwMDAxMDAwLA0KKyAgICBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5SW50ZXJtZWRpYXRlID0gMHgwMDAwMjAwMCwNCisgICAgSU1BUWR4QXR0cmlidXRlVmlzaWJpbGl0eUFkdmFuY2VkID0gMHgwMDAwNDAwMCwNCisgICAgSU1BUWR4QXR0cmlidXRlVmlzaWJpbGl0eUd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHk7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgU3RyZWFtIENoYW5uZWwgTW9kZSBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeFN0cmVhbUNoYW5uZWxNb2RlX2VudW0gew0KKyAgICBJTUFRZHhTdHJlYW1DaGFubmVsTW9kZUF1dG9tYXRpYywNCisgICAgSU1BUWR4U3RyZWFtQ2hhbm5lbE1vZGVNYW51YWwsDQorICAgIElNQVFkeFN0cmVhbUNoYW5uZWxNb2RlR3VhcmQgPSAweEZGRkZGRkZGLA0KK30gSU1BUWR4U3RyZWFtQ2hhbm5lbE1vZGU7DQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgUGl4ZWwgU2lnbmVkbmVzcyBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeFBpeGVsU2lnbmVkbmVzc19lbnVtIHsNCisgICAgSU1BUWR4UGl4ZWxTaWduZWRuZXNzVW5zaWduZWQsDQorICAgIElNQVFkeFBpeGVsU2lnbmVkbmVzc1NpZ25lZCwNCisgICAgSU1BUWR4UGl4ZWxTaWduZWRuZXNzSGFyZHdhcmUsDQorICAgIElNQVFkeFBpeGVsU2lnbmVkbmVzc0d1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeFBpeGVsU2lnbmVkbmVzczsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBVU0IgQ29ubmVjdGlvbiBTcGVlZCBFbnVtZXJhdGlvbg0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBlbnVtIElNQVFkeFVTQkNvbm5lY3Rpb25TcGVlZF9lbnVtIHsNCisgICAgSU1BUWR4VVNCQ29ubmVjdGlvblNwZWVkTG93ID0gMSwNCisgICAgSU1BUWR4VVNCQ29ubmVjdGlvblNwZWVkRnVsbCA9IDIsDQorICAgIElNQVFkeFVTQkNvbm5lY3Rpb25TcGVlZEhpZ2ggPSA0LA0KKyAgICBJTUFRZHhVU0JDb25uZWN0aW9uU3BlZWRTdXBlciA9IDgsDQorICAgIElNQVFkeFVTQkNvbm5lY3Rpb25TcGVlZEd1YXJkID0gMHhGRkZGRkZGRiwNCit9IElNQVFkeFVTQkNvbm5lY3Rpb25TcGVlZDsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBDVkkgU3RydWN0dXJlcw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorI3ByYWdtYSBwYWNrKHB1c2gsIDQpDQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQ2FtZXJhIEluZm9ybWF0aW9uIFN0cnVjdHVyZQ0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBzdHJ1Y3QgSU1BUWR4Q2FtZXJhSW5mb3JtYXRpb25fc3RydWN0IHsNCisgICAgdUludDMyIFR5cGU7DQorICAgIHVJbnQzMiBWZXJzaW9uOw0KKyAgICB1SW50MzIgRmxhZ3M7DQorICAgIHVJbnQzMiBTZXJpYWxOdW1iZXJIaTsNCisgICAgdUludDMyIFNlcmlhbE51bWJlckxvOw0KKyAgICBJTUFRZHhCdXNUeXBlIEJ1c1R5cGU7DQorICAgIGNoYXIgSW50ZXJmYWNlTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsNCisgICAgY2hhciBWZW5kb3JOYW1lW0lNQVFEWF9NQVhfQVBJX1NUUklOR19MRU5HVEhdOw0KKyAgICBjaGFyIE1vZGVsTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsNCisgICAgY2hhciBDYW1lcmFGaWxlTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsNCisgICAgY2hhciBDYW1lcmFBdHRyaWJ1dGVVUkxbSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSF07DQorfSBJTUFRZHhDYW1lcmFJbmZvcm1hdGlvbjsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBDYW1lcmEgRmlsZSBTdHJ1Y3R1cmUNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgc3RydWN0IElNQVFkeENhbWVyYUZpbGVfc3RydWN0IHsNCisgICAgdUludDMyIFR5cGU7DQorICAgIHVJbnQzMiBWZXJzaW9uOw0KKyAgICBjaGFyIEZpbGVOYW1lW0lNQVFEWF9NQVhfQVBJX1NUUklOR19MRU5HVEhdOw0KK30gSU1BUWR4Q2FtZXJhRmlsZTsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBBdHRyaWJ1dGUgSW5mb3JtYXRpb24gU3RydWN0dXJlDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmIHN0cnVjdCBJTUFRZHhBdHRyaWJ1dGVJbmZvcm1hdGlvbl9zdHJ1Y3Qgew0KKyAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlIFR5cGU7DQorICAgIGJvb2wzMiBSZWFkYWJsZTsNCisgICAgYm9vbDMyIFdyaXRhYmxlOw0KKyAgICBjaGFyIE5hbWVbSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSF07DQorfSBJTUFRZHhBdHRyaWJ1dGVJbmZvcm1hdGlvbjsNCisNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKy8vICBFbnVtZXJhdGlvbiBJdGVtIFN0cnVjdHVyZQ0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQordHlwZWRlZiBzdHJ1Y3QgSU1BUWR4RW51bUl0ZW1fc3RydWN0IHsNCisgICAgdUludDMyIFZhbHVlOw0KKyAgICB1SW50MzIgUmVzZXJ2ZWQ7DQorICAgIGNoYXIgTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsNCit9IElNQVFkeEVudW1JdGVtOw0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIENhbWVyYSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3R5cGVkZWYgSU1BUWR4RW51bUl0ZW0gSU1BUWR4VmlkZW9Nb2RlOw0KKw0KKw0KKyNwcmFnbWEgcGFjayhwb3ApDQorDQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisvLyAgQ2FsbGJhY2tzDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCit0eXBlZGVmICAgICB1SW50MzIgKE5JX0ZVTkMgKkZyYW1lRG9uZUV2ZW50Q2FsbGJhY2tQdHIpKElNQVFkeFNlc3Npb24gaWQsIHVJbnQzMiBidWZmZXJOdW1iZXIsIHZvaWQqIGNhbGxiYWNrRGF0YSk7DQordHlwZWRlZiAgICAgdUludDMyIChOSV9GVU5DICpQbnBFdmVudENhbGxiYWNrUHRyKShJTUFRZHhTZXNzaW9uIGlkLCBJTUFRZHhQbnBFdmVudCBwbnBFdmVudCwgdm9pZCogY2FsbGJhY2tEYXRhKTsNCit0eXBlZGVmICAgICB2b2lkIChOSV9GVU5DICpBdHRyaWJ1dGVVcGRhdGVkRXZlbnRDYWxsYmFja1B0cikoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogY2FsbGJhY2tEYXRhKTsNCisNCisjZW5kaWYgLy9uaWltYXFkeF90eXBlcw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIEF0dHJpYnV0ZXMNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQmFzZUFkZHJlc3MgICAgICAgICAgICAgICAiQ2FtZXJhSW5mb3JtYXRpb246OkJhc2VBZGRyZXNzIiAgICAgICAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjYW1lcmEgcmVnaXN0ZXJzLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQnVzVHlwZSAgICAgICAgICAgICAgICAgICAiQ2FtZXJhSW5mb3JtYXRpb246OkJ1c1R5cGUiICAgICAgICAgICAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgYnVzIHR5cGUgb2YgdGhlIGNhbWVyYS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU1vZGVsTmFtZSAgICAgICAgICAgICAgICAgIkNhbWVyYUluZm9ybWF0aW9uOjpNb2RlbE5hbWUiICAgICAgICAgICAvLyBSZWFkIG9ubHkuIFJldHVybnMgdGhlIG1vZGVsIG5hbWUuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVTZXJpYWxOdW1iZXJIaWdoICAgICAgICAgICJDYW1lcmFJbmZvcm1hdGlvbjo6U2VyaWFsTnVtYmVySGlnaCIgICAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSB1cHBlciAzMi1iaXRzIG9mIHRoZSBjYW1lcmEgNjQtYml0IHNlcmlhbCBudW1iZXIuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVTZXJpYWxOdW1iZXJMb3cgICAgICAgICAgICJDYW1lcmFJbmZvcm1hdGlvbjo6U2VyaWFsTnVtYmVyTG93IiAgICAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBsb3dlciAzMi1iaXRzIG9mIHRoZSBjYW1lcmEgNjQtYml0IHNlcmlhbCBudW1iZXIuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVWZW5kb3JOYW1lICAgICAgICAgICAgICAgICJDYW1lcmFJbmZvcm1hdGlvbjo6VmVuZG9yTmFtZSIgICAgICAgICAgLy8gUmVhZCBvbmx5LiBSZXR1cm5zIHRoZSB2ZW5kb3IgbmFtZS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUhvc3RJUEFkZHJlc3MgICAgICAgICAgICAgIkNhbWVyYUluZm9ybWF0aW9uOjpIb3N0SVBBZGRyZXNzIiAgICAgICAvLyBSZWFkIG9ubHkuIFJldHVybnMgdGhlIGhvc3QgYWRhcHRlciBJUCBhZGRyZXNzLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlSVBBZGRyZXNzICAgICAgICAgICAgICAgICAiQ2FtZXJhSW5mb3JtYXRpb246OklQQWRkcmVzcyIgICAgICAgICAgIC8vIFJlYWQgb25seS4gUmV0dXJucyB0aGUgSVAgYWRkcmVzcy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVByaW1hcnlVUkxTdHJpbmcgICAgICAgICAgIkNhbWVyYUluZm9ybWF0aW9uOjpQcmltYXJ5VVJMU3RyaW5nIiAgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGNhbWVyYSdzIHByaW1hcnkgVVJMIHN0cmluZy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVNlY29uZGFyeVVSTFN0cmluZyAgICAgICAgIkNhbWVyYUluZm9ybWF0aW9uOjpTZWNvbmRhcnlVUkxTdHJpbmciICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGNhbWVyYSdzIHNlY29uZGFyeSBVUkwgc3RyaW5nLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQWNxSW5Qcm9ncmVzcyAgICAgICAgICAgICAiU3RhdHVzSW5mb3JtYXRpb246OkFjcUluUHJvZ3Jlc3MiICAgICAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYWNxdWlzaXRpb24uIFRSVUUgaWYgYWNxdWlyaW5nOyBvdGhlcndpc2UgRkFMU0UuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVMYXN0QnVmZmVyQ291bnQgICAgICAgICAgICJTdGF0dXNJbmZvcm1hdGlvbjo6TGFzdEJ1ZmZlckNvdW50IiAgICAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnVmZmVycy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUxhc3RCdWZmZXJOdW1iZXIgICAgICAgICAgIlN0YXR1c0luZm9ybWF0aW9uOjpMYXN0QnVmZmVyTnVtYmVyIiAgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGxhc3QgY3VtdWxhdGl2ZSBidWZmZXIgbnVtYmVyIHRyYW5zZmVycmVkLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTG9zdEJ1ZmZlckNvdW50ICAgICAgICAgICAiU3RhdHVzSW5mb3JtYXRpb246Okxvc3RCdWZmZXJDb3VudCIgICAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbnVtYmVyIG9mIGxvc3QgYnVmZmVycyBkdXJpbmcgYW4gYWNxdWlzaXRpb24gc2Vzc2lvbi4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUxvc3RQYWNrZXRDb3VudCAgICAgICAgICAgIlN0YXR1c0luZm9ybWF0aW9uOjpMb3N0UGFja2V0Q291bnQiICAgICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIG51bWJlciBvZiBsb3N0IHBhY2tldHMgZHVyaW5nIGFuIGFjcXVpc2l0aW9uIHNlc3Npb24uDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZXF1ZXN0ZWRSZXNlbmRQYWNrZXRzICAgICJTdGF0dXNJbmZvcm1hdGlvbjo6UmVxdWVzdGVkUmVzZW5kUGFja2V0Q291bnQiIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcmVxdWVzdGVkIHRvIGJlIHJlc2VudCBkdXJpbmcgYW4gYWNxdWlzaXRpb24gc2Vzc2lvbi4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlY2VpdmVkUmVzZW5kUGFja2V0cyAgICAgIlN0YXR1c0luZm9ybWF0aW9uOjpSZWNlaXZlZFJlc2VuZFBhY2tldHMiIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlIHJlcXVlc3RlZCB0byBiZSByZXNlbnQgZHVyaW5nIGFuIGFjcXVpc2l0aW9uIHNlc3Npb24gYW5kIHdlcmUgY29tcGxldGVkLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlSGFuZGxlZEV2ZW50Q291bnQgICAgICAgICAiU3RhdHVzSW5mb3JtYXRpb246OkhhbmRsZWRFdmVudENvdW50IiAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbnVtYmVyIG9mIGhhbmRsZWQgZXZlbnRzIGR1cmluZyBhbiBhY3F1aXNpdGlvbiBzZXNzaW9uLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTG9zdEV2ZW50Q291bnQgICAgICAgICAgICAiU3RhdHVzSW5mb3JtYXRpb246Okxvc3RFdmVudENvdW50IiAgICAgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbnVtYmVyIG9mIGxvc3QgZXZlbnRzIGR1cmluZyBhbiBhY3F1aXNpdGlvbiBzZXNzaW9uLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQmF5ZXJHYWluQiAgICAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpCYXllcjo6R2FpbkIiICAgIC8vIFNldHMvZ2V0cyB0aGUgd2hpdGUgYmFsYW5jZSBnYWluIGZvciB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIEJheWVyIGNvbnZlcnNpb24uDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVCYXllckdhaW5HICAgICAgICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkJheWVyOjpHYWluRyIgICAgLy8gU2V0cy9nZXRzIHRoZSB3aGl0ZSBiYWxhbmNlIGdhaW4gZm9yIHRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIEJheWVyIGNvbnZlcnNpb24uDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVCYXllckdhaW5SICAgICAgICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkJheWVyOjpHYWluUiIgICAgLy8gU2V0cy9nZXRzIHRoZSB3aGl0ZSBiYWxhbmNlIGdhaW4gZm9yIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBCYXllciBjb252ZXJzaW9uLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQmF5ZXJQYXR0ZXJuICAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpCYXllcjo6UGF0dGVybiIgIC8vIFNldHMvZ2V0cyB0aGUgQmF5ZXIgcGF0dGVybiB0byB1c2UuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVTdHJlYW1DaGFubmVsTW9kZSAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkNvbnRyb2xsZXI6OlN0cmVhbUNoYW5uZWxNb2RlIiAvLyBHZXRzL3NldHMgdGhlIG1vZGUgZm9yIGFsbG9jYXRpbmcgYSBGaXJlV2lyZSBzdHJlYW0gY2hhbm5lbC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZURlc2lyZWRTdHJlYW1DaGFubmVsICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6Q29udHJvbGxlcjo6RGVzaXJlZFN0cmVhbUNoYW5uZWwiIC8vIEdldHMvc2V0cyB0aGUgc3RyZWFtIGNoYW5uZWwgdG8gbWFudWFsbHkgYWxsb2NhdGUuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVGcmFtZUludGVydmFsICAgICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkZyYW1lSW50ZXJ2YWwiICAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIGZyYW1lcy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUlnbm9yZUZpcnN0RnJhbWUgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6SWdub3JlRmlyc3RGcmFtZSIgLy8gR2V0cy9zZXRzIHRoZSB2aWRlbyBkZWxheSBvZiBvbmUgZnJhbWUgYmV0d2VlbiBzdGFydGluZyB0aGUgY2FtZXJhIGFuZCByZWNlaXZpbmcgdGhlIHZpZGVvIGZlZWQuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVPZmZzZXRYICAgICAgICAgICAgICAgICAgICJPZmZzZXRYIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSBsZWZ0IG9mZnNldCBvZiB0aGUgaW1hZ2UuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVPZmZzZXRZICAgICAgICAgICAgICAgICAgICJPZmZzZXRZIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSB0b3Agb2Zmc2V0IG9mIHRoZSBpbWFnZS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVdpZHRoICAgICAgICAgICAgICAgICAgICAgIldpZHRoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXRzL3NldHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUhlaWdodCAgICAgICAgICAgICAgICAgICAgIkhlaWdodCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXRzL3NldHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVQaXhlbEZvcm1hdCAgICAgICAgICAgICAgICJQaXhlbEZvcm1hdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIHNvdXJjZSBzZW5zb3IuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVQYWNrZXRTaXplICAgICAgICAgICAgICAgICJQYWNrZXRTaXplIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSBwYWNrZXQgc2l6ZSBpbiBieXRlcy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVBheWxvYWRTaXplICAgICAgICAgICAgICAgIlBheWxvYWRTaXplIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXRzL3NldHMgdGhlIGZyYW1lIHNpemUgaW4gYnl0ZXMuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVTcGVlZCAgICAgICAgICAgICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OlNwZWVkIiAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSB0cmFuc2ZlciBzcGVlZCBpbiBNYnBzIGZvciBhIEZpcmVXaXJlIHBhY2tldC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVNoaWZ0UGl4ZWxCaXRzICAgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6U2hpZnRQaXhlbEJpdHMiICAvLyBHZXRzL3NldHMgdGhlIGFsaWdubWVudCBvZiAxNi1iaXQgY2FtZXJhcy4gRG93bnNoaWZ0IHRoZSBwaXhlbCBiaXRzIGlmIHRoZSBjYW1lcmEgcmV0dXJucyBtb3N0IHNpZ25pZmljYW50IGJpdC1hbGlnbmVkIGRhdGEuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVTd2FwUGl4ZWxCeXRlcyAgICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OlN3YXBQaXhlbEJ5dGVzIiAgLy8gR2V0cy9zZXRzIHRoZSBlbmRpYW5uZXNzIG9mIDE2LWJpdCBjYW1lcmFzLiBTd2FwIHRoZSBwaXhlbCBieXRlcyBpZiB0aGUgY2FtZXJhIHJldHVybnMgbGl0dGxlIGVuZGlhbiBkYXRhLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlT3ZlcndyaXRlTW9kZSAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpPdmVyd3JpdGVNb2RlIiAgIC8vIEdldHMvc2V0cyB0aGUgb3ZlcndyaXRlIG1vZGUsIHVzZWQgdG8gZGV0ZXJtaW5lIGFjcXVpc2l0aW9uIHdoZW4gYW4gaW1hZ2UgdHJhbnNmZXIgY2Fubm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYW4gb3ZlcndyaXR0ZW4gaW50ZXJuYWwgYnVmZmVyLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlVGltZW91dCAgICAgICAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpUaW1lb3V0IiAgICAgICAgIC8vIEdldHMvc2V0cyB0aGUgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMsIHVzZWQgdG8gYWJvcnQgYW4gYWNxdWlzaXRpb24gd2hlbiB0aGUgaW1hZ2UgdHJhbnNmZXIgY2Fubm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIGRlbGF5Lg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlVmlkZW9Nb2RlICAgICAgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpWaWRlb01vZGUiICAgICAgIC8vIEdldHMvc2V0cyB0aGUgdmlkZW8gbW9kZSBmb3IgYSBjYW1lcmEuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVCaXRzUGVyUGl4ZWwgICAgICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkJpdHNQZXJQaXhlbCIgICAgLy8gR2V0cy9zZXRzIHRoZSBhY3R1YWwgYml0cyBwZXIgcGl4ZWwuIEZvciAxNi1iaXQgY29tcG9uZW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBhY3R1YWwgYml0IGRlcHRoICgxMC0sIDEyLSwgMTQtLCBvciAxNi1iaXQpLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUGl4ZWxTaWduZWRuZXNzICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpQaXhlbFNpZ25lZG5lc3MiIC8vIEdldHMvc2V0cyB0aGUgc2lnbmVkbmVzcyBvZiB0aGUgcGl4ZWwuIEZvciAxNi1iaXQgY29tcG9uZW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBhY3R1YWwgcGl4ZWwgc2lnbmVkbmVzcyAoU2lnbmVkLCBvciBVbnNpZ25lZCkuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZXNlcnZlRHVhbFBhY2tldHMgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OlJlc2VydmVEdWFsUGFja2V0cyIgLy8gR2V0cy9zZXRzIGlmIGR1YWwgcGFja2V0cyB3aWxsIGJlIHJlc2VydmVkIGZvciBhIHZlcnkgbGFyZ2UgRmlyZVdpcmUgcGFja2V0Lg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUmVjZWl2ZVRpbWVzdGFtcE1vZGUgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpSZWNlaXZlVGltZXN0YW1wTW9kZSIgLy8gR2V0cy9zZXRzIHRoZSBtb2RlIGZvciB0aW1lc3RhbXBpbmcgaW1hZ2VzIHJlY2VpdmVkIGJ5IHRoZSBkcml2ZXIuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVBY3R1YWxQZWFrQmFuZHdpZHRoICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OkJhbmR3aWR0aENvbnRyb2w6OkFjdHVhbFBlYWtCYW5kd2lkdGgiIC8vIFJlYWQgb25seS4gUmV0dXJucyB0aGUgYWN0dWFsIG1heGltdW0gcGVhayBiYW5kd2lkdGggdGhlIGNhbWVyYSB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gdXNlLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlRGVzaXJlZFBlYWtCYW5kd2lkdGggICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpCYW5kd2lkdGhDb250cm9sOjpEZXNpcmVkUGVha0JhbmR3aWR0aCIgLy8gR2V0cy9zZXRzIHRoZSBkZXNpcmVkIG1heGltdW0gcGVhayBiYW5kd2lkdGggdGhlIGNhbWVyYSBzaG91bGQgdXNlLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlRGVzdGluYXRpb25Nb2RlICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpDb250cm9sbGVyOjpEZXN0aW5hdGlvbk1vZGUiIC8vIEdldHMvU2V0cyB3aGVyZSB0aGUgY2FtZXJhIGlzIGluc3RydWN0ZWQgdG8gc2VuZCB0aGUgaW1hZ2Ugc3RyZWFtLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlRGVzdGluYXRpb25NdWx0aWNhc3RBZGRyZXNzICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OkNvbnRyb2xsZXI6OkRlc3RpbmF0aW9uTXVsdGljYXN0QWRkcmVzcyIgLy8gR2V0cy9TZXRzIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0aGUgY2FtZXJhIHNob3VsZCBzZW5kIGRhdGEgaW4gbXVsdGljYXN0IG1vZGUuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVFdmVudHNFbmFibGVkICAgICAgICAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OkV2ZW50UGFyYW1ldGVyczo6RXZlbnRzRW5hYmxlZCIgLy8gR2V0cy9TZXRzIGlmIGV2ZW50cyB3aWxsIGJlIGhhbmRsZWQuDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVNYXhPdXRzdGFuZGluZ0V2ZW50cyAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OkV2ZW50UGFyYW1ldGVyczo6TWF4T3V0c3RhbmRpbmdFdmVudHMiIC8vIEdldHMvU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgZXZlbnRzIHRvIHF1ZXVlLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlVGVzdFBhY2tldEVuYWJsZWQgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpUZXN0UGFja2V0UGFyYW1ldGVyczo6VGVzdFBhY2tldEVuYWJsZWQiIC8vIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBkcml2ZXIgd2lsbCB2YWxpZGF0ZSB0aGUgaW1hZ2Ugc3RyZWFtaW5nIHNldHRpbmdzIHVzaW5nIHRlc3QgcGFja2V0cyBwcmlvciB0byBhbiBhY3F1aXNpdGlvbg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlVGVzdFBhY2tldFRpbWVvdXQgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpUZXN0UGFja2V0UGFyYW1ldGVyczo6VGVzdFBhY2tldFRpbWVvdXQiIC8vIEdldHMvU2V0cyB0aGUgdGltZW91dCBmb3IgdmFsaWRhdGluZyB0ZXN0IHBhY2tldCByZWNlcHRpb24gKGlmIGVuYWJsZWQpDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVNYXhUZXN0UGFja2V0UmV0cmllcyAgICAgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlRlc3RQYWNrZXRQYXJhbWV0ZXJzOjpNYXhUZXN0UGFja2V0UmV0cmllcyIgLy8gR2V0cy9TZXRzIHRoZSBudW1iZXIgb2YgcmV0cmllcyBmb3IgdmFsaWRhdGluZyB0ZXN0IHBhY2tldCByZWNlcHRpb24gKGlmIGVuYWJsZWQpDQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVDaHVua0RhdGFEZWNvZGluZ0VuYWJsZWQgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkNodW5rRGF0YURlY29kaW5nOjpDaHVua0RhdGFEZWNvZGluZ0VuYWJsZWQiIC8vIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBkcml2ZXIgd2lsbCBkZWNvZGUgYW55IGNodW5rIGRhdGEgaW4gdGhlIGltYWdlIHN0cmVhbQ0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQ2h1bmtEYXRhRGVjb2RpbmdNYXhFbGVtZW50U2l6ZSAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpDaHVua0RhdGFEZWNvZGluZzo6TWF4aW11bUNodW5rQ29weVNpemUiIC8vIEdldHMvU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIGFueSBzaW5nbGUgY2h1bmsgZGF0YSBlbGVtZW50IHRoYXQgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZQ0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTG9zdFBhY2tldE1vZGUgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpMb3N0UGFja2V0TW9kZSIgLy8gR2V0cy9zZXRzIHRoZSBiZWhhdmlvciB3aGVuIHRoZSB1c2VyIGV4dHJhY3RzIGEgYnVmZmVyIHRoYXQgaGFzIG1pc3NpbmcgcGFja2V0cy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU1lbW9yeVdpbmRvd1NpemUgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6TWVtb3J5V2luZG93U2l6ZSIgLy8gR2V0cy9zZXRzIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgd2luZG93IG9mIHRoZSBjYW1lcmEgaW4ga2lsb2J5dGVzLiBTaG91bGQgbWF0Y2ggdGhlIGNhbWVyYSdzIGludGVybmFsIGJ1ZmZlciBzaXplLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUmVzZW5kc0VuYWJsZWQgICAgICAgICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpSZXNlbmRQYXJhbWV0ZXJzOjpSZXNlbmRzRW5hYmxlZCIgLy8gR2V0cy9zZXRzIGlmIHJlc2VuZHMgd2lsbCBiZSBpc3N1ZWQgZm9yIG1pc3NpbmcgcGFja2V0cy4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlc2VuZFRocmVzaG9sZFBlcmNlbnRhZ2UgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6UmVzZW5kVGhyZXNob2xkUGVyY2VudGFnZSIgLy8gR2V0cy9zZXRzIHRoZSB0aHJlc2hvbGQgb2YgdGhlIHBhY2tldCBwcm9jZXNzaW5nIHdpbmRvdyB0aGF0IHdpbGwgdHJpZ2dlciBwYWNrZXRzIHRvIGJlIHJlc2VudC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlc2VuZEJhdGNoaW5nUGVyY2VudGFnZSAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6UmVzZW5kQmF0Y2hpbmdQZXJjZW50YWdlIiAvLyBHZXRzL3NldHMgdGhlIHBlcmNlbnQgb2YgdGhlIHBhY2tldCByZXNlbmQgdGhyZXNob2xkIHRoYXQgd2lsbCBiZSBpc3N1ZWQgYXMgb25lIGdyb3VwIHBhc3QgdGhlIGluaXRpYWwgdGhyZXNob2xkIHNlbnQgaW4gYSBzaW5nbGUgcmVxdWVzdC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU1heFJlc2VuZHNQZXJQYWNrZXQgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6TWF4UmVzZW5kc1BlclBhY2tldCIgLy8gR2V0cy9zZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNlbmQgcmVxdWVzdHMgdGhhdCB3aWxsIGJlIGlzc3VlZCBmb3IgYSBtaXNzaW5nIHBhY2tldC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlc2VuZFJlc3BvbnNlVGltZW91dCAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6UmVzZW5kUmVzcG9uc2VUaW1lb3V0IiAvLyBHZXRzL3NldHMgdGhlIHRpbWUgdG8gd2FpdCBmb3IgYSByZXNlbmQgcmVxdWVzdCB0byBiZSBzYXRpc2ZpZWQgYmVmb3JlIHNlbmRpbmcgYW5vdGhlci4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU5ld1BhY2tldFRpbWVvdXQgICAgICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6TmV3UGFja2V0VGltZW91dCIgLy8gR2V0cy9zZXRzIHRoZSB0aW1lIHRvIHdhaXQgZm9yIG5ldyBwYWNrZXRzIHRvIGFycml2ZSBpbiBhIHBhcnRpYWxseSBjb21wbGV0ZWQgaW1hZ2UgYmVmb3JlIGFzc3VtaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSB3YXMgbG9zdC4NCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU1pc3NpbmdQYWNrZXRUaW1lb3V0ICAgICAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6TWlzc2luZ1BhY2tldFRpbWVvdXQiIC8vIEdldHMvc2V0cyB0aGUgdGltZSB0byB3YWl0IGZvciBhIG1pc3NpbmcgcGFja2V0IGJlZm9yZSBpc3N1aW5nIGEgcmVzZW5kLg0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUmVzZW5kVGltZXJSZXNvbHV0aW9uICAgICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpSZXNlbmRQYXJhbWV0ZXJzOjpSZXNlbmRUaW1lclJlc29sdXRpb24iIC8vIEdldHMvc2V0cyB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcGFja2V0IHByb2Nlc3Npbmcgc3lzdGVtIHRoYXQgaXMgdXNlZCBmb3IgYWxsIHBhY2tldC1yZWxhdGVkIHRpbWVvdXRzLg0KKw0KKw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gIEZ1bmN0aW9ucw0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhTbmFwKElNQVFkeFNlc3Npb24gaWQsIEltYWdlKiBpbWFnZSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhDb25maWd1cmVHcmFiKElNQVFkeFNlc3Npb24gaWQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R3JhYihJTUFRZHhTZXNzaW9uIGlkLCBJbWFnZSogaW1hZ2UsIGJvb2wzMiB3YWl0Rm9yTmV4dEJ1ZmZlciwgdUludDMyKiBhY3R1YWxCdWZmZXJOdW1iZXIpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4U2VxdWVuY2UoSU1BUWR4U2Vzc2lvbiBpZCwgSW1hZ2UqIGltYWdlc1tdLCB1SW50MzIgY291bnQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4RGlzY292ZXJFdGhlcm5ldENhbWVyYXMoY29uc3QgY2hhciogYWRkcmVzcywgdUludDMyIHRpbWVvdXQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4RW51bWVyYXRlQ2FtZXJhcyhJTUFRZHhDYW1lcmFJbmZvcm1hdGlvbiBjYW1lcmFJbmZvcm1hdGlvbkFycmF5W10sIHVJbnQzMiogY291bnQsIGJvb2wzMiBjb25uZWN0ZWRPbmx5KTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFJlc2V0Q2FtZXJhKGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wzMiByZXNldEFsbCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhPcGVuQ2FtZXJhKGNvbnN0IGNoYXIqIG5hbWUsIElNQVFkeENhbWVyYUNvbnRyb2xNb2RlIG1vZGUsIElNQVFkeFNlc3Npb24qIGlkKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeENsb3NlQ2FtZXJhKElNQVFkeFNlc3Npb24gaWQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4Q29uZmlndXJlQWNxdWlzaXRpb24oSU1BUWR4U2Vzc2lvbiBpZCwgYm9vbDMyIGNvbnRpbnVvdXMsIHVJbnQzMiBidWZmZXJDb3VudCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhTdGFydEFjcXVpc2l0aW9uKElNQVFkeFNlc3Npb24gaWQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0SW1hZ2UoSU1BUWR4U2Vzc2lvbiBpZCwgSW1hZ2UqIGltYWdlLCBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlIG1vZGUsIHVJbnQzMiBkZXNpcmVkQnVmZmVyTnVtYmVyLCB1SW50MzIqIGFjdHVhbEJ1ZmZlck51bWJlcik7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhHZXRJbWFnZURhdGEoSU1BUWR4U2Vzc2lvbiBpZCwgdm9pZCogYnVmZmVyLCB1SW50MzIgYnVmZmVyU2l6ZSwgSU1BUWR4QnVmZmVyTnVtYmVyTW9kZSBtb2RlLCB1SW50MzIgZGVzaXJlZEJ1ZmZlck51bWJlciwgdUludDMyKiBhY3R1YWxCdWZmZXJOdW1iZXIpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4U3RvcEFjcXVpc2l0aW9uKElNQVFkeFNlc3Npb24gaWQpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4VW5jb25maWd1cmVBY3F1aXNpdGlvbihJTUFRZHhTZXNzaW9uIGlkKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEVudW1lcmF0ZVZpZGVvTW9kZXMoSU1BUWR4U2Vzc2lvbiBpZCwgSU1BUWR4VmlkZW9Nb2RlIHZpZGVvTW9kZUFycmF5W10sIHVJbnQzMiogY291bnQsIHVJbnQzMiogY3VycmVudE1vZGUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4RW51bWVyYXRlQXR0cmlidXRlcyhJTUFRZHhTZXNzaW9uIGlkLCBJTUFRZHhBdHRyaWJ1dGVJbmZvcm1hdGlvbiBhdHRyaWJ1dGVJbmZvcm1hdGlvbkFycmF5W10sIHVJbnQzMiogY291bnQsIGNvbnN0IGNoYXIqIHJvb3QpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIElNQVFkeFZhbHVlVHlwZSB0eXBlLCB2b2lkKiB2YWx1ZSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQ0MgSU1BUWR4U2V0QXR0cmlidXRlKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIElNQVFkeFZhbHVlVHlwZSB0eXBlLCAuLi4pOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlTWluaW11bShJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBJTUFRZHhWYWx1ZVR5cGUgdHlwZSwgdm9pZCogdmFsdWUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlTWF4aW11bShJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBJTUFRZHhWYWx1ZVR5cGUgdHlwZSwgdm9pZCogdmFsdWUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlSW5jcmVtZW50KElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIElNQVFkeFZhbHVlVHlwZSB0eXBlLCB2b2lkKiB2YWx1ZSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhHZXRBdHRyaWJ1dGVUeXBlKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIElNQVFkeEF0dHJpYnV0ZVR5cGUqIHR5cGUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4SXNBdHRyaWJ1dGVSZWFkYWJsZShJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBib29sMzIqIHJlYWRhYmxlKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeElzQXR0cmlidXRlV3JpdGFibGUoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgYm9vbDMyKiB3cml0YWJsZSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhFbnVtZXJhdGVBdHRyaWJ1dGVWYWx1ZXMoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgSU1BUWR4RW51bUl0ZW0gbGlzdFtdLCB1SW50MzIqIHNpemUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlVG9vbHRpcChJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjaGFyKiB0b29sdGlwLCB1SW50MzIgbGVuZ3RoKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZVVuaXRzKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIGNoYXIqIHVuaXRzLCB1SW50MzIgbGVuZ3RoKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFJlZ2lzdGVyRnJhbWVEb25lRXZlbnQoSU1BUWR4U2Vzc2lvbiBpZCwgdUludDMyIGJ1ZmZlckludGVydmFsLCBGcmFtZURvbmVFdmVudENhbGxiYWNrUHRyIGNhbGxiYWNrRnVuY3Rpb24sIHZvaWQqIGNhbGxiYWNrRGF0YSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhSZWdpc3RlclBucEV2ZW50KElNQVFkeFNlc3Npb24gaWQsIElNQVFkeFBucEV2ZW50IGV2ZW50LCBQbnBFdmVudENhbGxiYWNrUHRyIGNhbGxiYWNrRnVuY3Rpb24sIHZvaWQqIGNhbGxiYWNrRGF0YSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhXcml0ZVJlZ2lzdGVyKElNQVFkeFNlc3Npb24gaWQsIHVJbnQzMiBvZmZzZXQsIHVJbnQzMiB2YWx1ZSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhSZWFkUmVnaXN0ZXIoSU1BUWR4U2Vzc2lvbiBpZCwgdUludDMyIG9mZnNldCwgdUludDMyKiB2YWx1ZSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhXcml0ZU1lbW9yeShJTUFRZHhTZXNzaW9uIGlkLCB1SW50MzIgb2Zmc2V0LCBjb25zdCBjaGFyKiB2YWx1ZXMsIHVJbnQzMiBjb3VudCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhSZWFkTWVtb3J5KElNQVFkeFNlc3Npb24gaWQsIHVJbnQzMiBvZmZzZXQsIGNoYXIqIHZhbHVlcywgdUludDMyIGNvdW50KTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEVycm9yU3RyaW5nKElNQVFkeEVycm9yIGVycm9yLCBjaGFyKiBtZXNzYWdlLCB1SW50MzIgbWVzc2FnZUxlbmd0aCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhXcml0ZUF0dHJpYnV0ZXMoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogZmlsZW5hbWUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVhZEF0dHJpYnV0ZXMoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogZmlsZW5hbWUpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVzZXRFdGhlcm5ldENhbWVyYUFkZHJlc3MoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogYWRkcmVzcywgY29uc3QgY2hhciogc3VibmV0LCBjb25zdCBjaGFyKiBnYXRld2F5LCB1SW50MzIgdGltZW91dCk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhFbnVtZXJhdGVBdHRyaWJ1dGVzMihJTUFRZHhTZXNzaW9uIGlkLCBJTUFRZHhBdHRyaWJ1dGVJbmZvcm1hdGlvbiBhdHRyaWJ1dGVJbmZvcm1hdGlvbkFycmF5W10sIHVJbnQzMiogY291bnQsIGNvbnN0IGNoYXIqIHJvb3QsIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHkgdmlzaWJpbGl0eSk7DQorSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhHZXRBdHRyaWJ1dGVWaXNpYmlsaXR5KElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHkqIHZpc2liaWxpdHkpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlRGVzY3JpcHRpb24oSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgY2hhciogZGVzY3JpcHRpb24sIHVJbnQzMiBsZW5ndGgpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlRGlzcGxheU5hbWUoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgY2hhciogZGlzcGxheU5hbWUsIHVJbnQzMiBsZW5ndGgpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4RGlzcG9zZSh2b2lkKiBidWZmZXIpOw0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVnaXN0ZXJBdHRyaWJ1dGVVcGRhdGVkRXZlbnQoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgQXR0cmlidXRlVXBkYXRlZEV2ZW50Q2FsbGJhY2tQdHIgY2FsbGJhY2tGdW5jdGlvbiwgdm9pZCogY2FsbGJhY2tEYXRhKTsNCitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEVudW1lcmF0ZUF0dHJpYnV0ZXMzKElNQVFkeFNlc3Npb24gaWQsIElNQVFkeEF0dHJpYnV0ZUluZm9ybWF0aW9uIGF0dHJpYnV0ZUluZm9ybWF0aW9uQXJyYXlbXSwgdUludDMyKiBjb3VudCwgY29uc3QgY2hhciogcm9vdCwgSU1BUWR4QXR0cmlidXRlVmlzaWJpbGl0eSB2aXNpYmlsaXR5KTsNCisNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorDQorI2VuZGlmIC8vIF9fX25paW1hcWR4X2hfX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmMzY2YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0FJQ2FsaWJyYXRpb24uaApAQCAtMCwwICsxLDE5IEBACisNCisjaWZuZGVmIF9fQUlDYWxpYnJhdGlvbl9oX18NCisjZGVmaW5lIF9fQUlDYWxpYnJhdGlvbl9oX18NCisNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIg0KK3sNCisjZW5kaWYNCisNCisJdWludDMyX3QgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25BSUNhbGlicmF0aW9uX2dldExTQldlaWdodChjb25zdCB1aW50MzJfdCBhaVN5c3RlbUluZGV4LCBjb25zdCB1aW50MzJfdCBjaGFubmVsLCBpbnQzMl90ICpzdGF0dXMpOw0KKwlpbnQzMl90IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRPZmZzZXQoY29uc3QgdWludDMyX3QgYWlTeXN0ZW1JbmRleCwgY29uc3QgdWludDMyX3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8vIF9fQUlDYWxpYnJhdGlvbl9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTkludGVyZmFjZVBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzQwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaApAQCAtMCwwICsxLDgwIEBACisvLyBDQU5JbnRlcmZhY2VQbHVnaW4uaA0KKy8vDQorLy8gIERlZmluZXMgdGhlIEFQSSBmb3IgYnVpbGRpbmcgYSBDQU4gSW50ZXJmYWNlIFBsdWdpbiB0byBzdXBwb3J0DQorLy8gICAgUFdNLWNhYmxlLWZyZWUgQ0FOIG1vdG9yIGNvbnRyb2wgb24gRlJDIHJvYm90cy4gIFRoaXMgYWxsb3dzIHlvdQ0KKy8vICAgIHRvIGNvbm5lY3QgYW55IENBTiBpbnRlcmZhY2UgdG8gdGhlIHNlY3VyZSBKYWd1YXIgQ0FOIGRyaXZlci4NCisvLw0KKw0KKyNpZm5kZWYgX19DQU5JbnRlcmZhY2VQbHVnaW5faF9fDQorI2RlZmluZSBfX0NBTkludGVyZmFjZVBsdWdpbl9oX18NCisNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQorI2RlZmluZSBDQU5fSVNfRlJBTUVfUkVNT1RFIDB4ODAwMDAwMDANCisjZGVmaW5lIENBTl9JU19GUkFNRV8xMUJJVCAgMHg0MDAwMDAwMA0KKyNkZWZpbmUgQ0FOXzI5QklUX01FU1NBR0VfSURfTUFTSyAweDFGRkZGRkZGDQorI2RlZmluZSBDQU5fMTFCSVRfTUVTU0FHRV9JRF9NQVNLIDB4MDAwMDA3RkYNCisNCitjbGFzcyBDQU5JbnRlcmZhY2VQbHVnaW4NCit7DQorcHVibGljOg0KKwlDQU5JbnRlcmZhY2VQbHVnaW4oKSB7fQ0KKwl2aXJ0dWFsIH5DQU5JbnRlcmZhY2VQbHVnaW4oKSB7fQ0KKw0KKwkvKioNCisJICogVGhpcyBlbnRyeS1wb2ludCBvZiB0aGUgQ0FOSW50ZXJmYWNlUGx1Z2luIGlzIHBhc3NlZCBhIG1lc3NhZ2UgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIHRvIHNlbmQgdG8NCisJICogYSBkZXZpY2Ugb24gdGhlIENBTiBidXMuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSBjb250ZXh0cyBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgcmVlbnRyYW50Lg0KKwkgKiANCisJICogQHBhcmFtIG1lc3NhZ2VJRCBUaGUgMjktYml0IENBTiBtZXNzYWdlIElEIGluIHRoZSBsc2JzLiAgVGhlIG1zYiBjYW4gaW5kaWNhdGUgYSByZW1vdGUgZnJhbWUuDQorCSAqIEBwYXJhbSBkYXRhIEEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGJldHdlZW4gMCBhbmQgOCBieXRlcyB0byBzZW5kIHdpdGggdGhlIG1lc3NhZ2UuICBNYXkgYmUgTlVMTCBpZiBkYXRhU2l6ZSBpcyAwLg0KKwkgKiBAcGFyYW0gZGF0YVNpemUgVGhlIG51bWJlciBvZiBieXRlcyB0byBzZW5kIHdpdGggdGhlIG1lc3NhZ2UuDQorCSAqIEByZXR1cm4gUmV0dXJuIGFueSBlcnJvciBjb2RlLiAgT24gc3VjY2VzcyByZXR1cm4gMC4NCisJICovDQorCXZpcnR1YWwgaW50MzJfdCBzZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUpID0gMDsNCisNCisJLyoqDQorCSAqIFRoaXMgZW50cnktcG9pbnQgb2YgdGhlIENBTkludGVyZmFjZVBsdWdpbiBpcyBwYXNzZWQgYnVmZmVycyB3aGljaCBzaG91bGQgYmUgcG9wdWxhdGVkIHdpdGgNCisJICogYW55IHJlY2VpdmVkIG1lc3NhZ2VzIGZyb20gZGV2aWNlcyBvbiB0aGUgQ0FOIGJ1cy4NCisJICogDQorCSAqIFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBieSBhIHNpbmdsZSB0YXNrIGluIHRoZSBKYWd1YXIgZHJpdmVyLCBzbyBpdCBuZWVkIG5vdCBiZSByZWVudHJhbnQuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJsb2NrIGZvciBzb21lIHBlcmlvZCBvZiB0aW1lIHdhaXRpbmcgZm9yIGEgbWVzc2FnZSBmcm9tIHRoZSBDQU4gYnVzLg0KKwkgKiBJdCBtYXkgdGltZW91dCBwZXJpb2RpY2FsbHkgKHJldHVybmluZyBub24temVybyB0byBpbmRpY2F0ZSBubyBtZXNzYWdlIHdhcyBwb3B1bGF0ZWQpIHRvIGFsbG93IGZvcg0KKwkgKiBzaHV0ZG93biBhbmQgdW5sb2FkaW5nIG9mIHRoZSBwbHVnaW4uDQorCSAqIA0KKwkgKiBAcGFyYW0gbWVzc2FnZUlEIEEgcmVmZXJlbmNlIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGEgcmVjZWl2ZWQgMjktYml0IENBTiBtZXNzYWdlIElEIGluIHRoZSBsc2JzLg0KKwkgKiBAcGFyYW0gZGF0YSBBIHBvaW50ZXIgdG8gYSBidWZmZXIgb2YgOCBieXRlcyB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkYXRhIHJlY2VpdmVkIHdpdGggdGhlIG1lc3NhZ2UuDQorCSAqIEBwYXJhbSBkYXRhU2l6ZSBBIHJlZmVyZW5jZSB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSByZWNlaXZlZCAoMCAtIDggYnl0ZXMpLg0KKwkgKiBAcmV0dXJuIFRoaXMgc2hvdWxkIHJldHVybiAwIGlmIGEgbWVzc2FnZSB3YXMgcG9wdWxhdGVkLCBub24tMCBpZiBubyBtZXNzYWdlIHdhcyBub3QgcG9wdWxhdGVkLg0KKwkgKi8NCisJdmlydHVhbCBpbnQzMl90IHJlY2VpdmVNZXNzYWdlKHVpbnQzMl90ICZtZXNzYWdlSUQsIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgJmRhdGFTaXplKSA9IDA7DQorDQorCS8qKg0KKwkgKiBUaGlzIGVudHJ5LXBvaW50IG9mIHRoZSBDQU5JbnRlcmZhY2VQbHVnaW4gcmV0dXJucyBzdGF0dXMgb2YgdGhlIENBTiBidXMuDQorCSAqIA0KKwkgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSBjb250ZXh0cyBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgcmVlbnRyYW50Lg0KKwkgKiANCisJICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBkZXRhaWxlZCBoYXJkd2FyZSBzdGF0dXMgaWYgYXZhaWxhYmxlIGZvciBkaWFnbm9zdGljcyBvZiB0aGUgQ0FOIGludGVyZmFjZS4NCisJICogDQorCSAqIEBwYXJhbSBidXNPZmZDb3VudCBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgc2VuZE1lc3NhZ2UgZmFpbGVkIHdpdGggYSBidXNPZmYgZXJyb3IgaW5kaWNhdGluZyB0aGF0IG1lc3NhZ2VzDQorCSAqICBhcmUgbm90IHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCBvbiB0aGUgYnVzLg0KKwkgKiBAcGFyYW0gdHhGdWxsQ291bnQgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHNlbmRNZXNzYWdlIGZhaWxlZCB3aXRoIGEgdHhGaWZvRnVsbCBlcnJvciBpbmRpY2F0aW5nIHRoYXQgbWVzc2FnZXMNCisJICogIGFyZSBub3Qgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGJ5IGFueSBDQU4gZGV2aWNlLg0KKwkgKiBAcGFyYW0gcmVjZWl2ZUVycm9yQ291bnQgVGhlIGNvdW50IG9mIHJlY2VpdmUgZXJyb3JzIGFzIHJlcG9ydGVkIGJ5IHRoZSBDQU4gZHJpdmVyLg0KKwkgKiBAcGFyYW0gdHJhbnNtaXRFcnJvckNvdW50IFRoZSBjb3VudCBvZiB0cmFuc21pdCBlcnJvcnMgYXMgcmVwb3J0ZWQgYnkgdGhlIENBTiBkcml2ZXIuDQorCSAqIEByZXR1cm4gVGhpcyBzaG91bGQgcmV0dXJuIDAgaWYgYWxsIHN0YXR1cyB3YXMgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBjb2RlIGlmIG5vdC4NCisJICovDQorCXZpcnR1YWwgaW50MzJfdCBnZXRTdGF0dXModWludDMyX3QgJmJ1c09mZkNvdW50LCB1aW50MzJfdCAmdHhGdWxsQ291bnQsIHVpbnQzMl90ICZyZWNlaXZlRXJyb3JDb3VudCwgdWludDMyX3QgJnRyYW5zbWl0RXJyb3JDb3VudCkge3JldHVybiAwO30NCit9Ow0KKw0KKy8qKg0KKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byByZWdpc3RlciBhIENBTkludGVyZmFjZVBsdWdpbiB0byBwcm92aWRlIGFjY2VzcyBhIENBTiBidXMuDQorICogDQorICogQHBhcmFtIGludGVyZmFjZSBBIHBvaW50ZXIgdG8gYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSBDQU5JbnRlcmZhY2VQbHVnaW4gYW5kIGltcGxlbWVudHMNCisgKiB0aGUgcHVyZSB2aXJ0dWFsIGludGVyZmFjZS4gIElmIE5VTEwsIHVucmVnaXN0ZXIgdGhlIGN1cnJlbnQgcGx1Z2luLg0KKyAqLw0KK3ZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVnaXN0ZXJJbnRlcmZhY2UoQ0FOSW50ZXJmYWNlUGx1Z2luKiBpbnRlcmZhY2UpOw0KKw0KKyNlbmRpZiAvLyBfX0NBTkludGVyZmFjZVBsdWdpbl9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmNjNjNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaApAQCAtMCwwICsxLDYzIEBACisvLyBDQU5TZXNzaW9uTXV4LmgNCisvLw0KKy8vICBEZWZpbmVzIHRoZSBBUEkgZm9yIGJ1aWxkaW5nIGEgQ0FOIEludGVyZmFjZSBQbHVnaW4gdG8gc3VwcG9ydA0KKy8vICAgIFBXTS1jYWJsZS1mcmVlIENBTiBtb3RvciBjb250cm9sIG9uIEZSQyByb2JvdHMuICBUaGlzIGFsbG93cyB5b3UNCisvLyAgICB0byBjb25uZWN0IGFueSBDQU4gaW50ZXJmYWNlIHRvIHRoZSBzZWN1cmUgSmFndWFyIENBTiBkcml2ZXIuDQorLy8NCisNCisjaWZuZGVmIF9fQ0FOU2Vzc2lvbk11eF9oX18NCisjZGVmaW5lIF9fQ0FOU2Vzc2lvbk11eF9oX18NCisNCisjaWYgZGVmaW5lZChfX3Z4d29ya3MpDQorI2luY2x1ZGUgPHZ4V29ya3MuaD4NCisjZWxzZQ0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjZW5kaWYNCisNCisjZGVmaW5lIENBTl9TRU5EX1BFUklPRF9OT19SRVBFQVQgMA0KKyNkZWZpbmUgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HIC0xDQorDQorLyogRmxhZ3MgaW4gdGhlIHVwcGVyIGJpdHMgb2YgdGhlIG1lc3NhZ2VJRCAqLw0KKyNkZWZpbmUgQ0FOX0lTX0ZSQU1FX1JFTU9URSAweDgwMDAwMDAwDQorI2RlZmluZSBDQU5fSVNfRlJBTUVfMTFCSVQgIDB4NDAwMDAwMDANCisNCisjZGVmaW5lIEVSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXIgICAtNDQwODYNCisjZGVmaW5lIEVSUl9DQU5TZXNzaW9uTXV4X01lc3NhZ2VOb3RGb3VuZCAtNDQwODcNCisjZGVmaW5lIFdBUk5fQ0FOU2Vzc2lvbk11eF9Ob1Rva2VuICAgICAgICAgNDQwODcNCisjZGVmaW5lIEVSUl9DQU5TZXNzaW9uTXV4X05vdEFsbG93ZWQgICAgICAtNDQwODgNCisjZGVmaW5lIEVSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkICAtNDQwODkNCisNCitzdHJ1Y3QgdENBTlN0cmVhbU1lc3NhZ2V7DQorCXVpbnQzMl90IG1lc3NhZ2VJRDsNCisJdWludDMyX3QgdGltZVN0YW1wOw0KKwl1aW50OF90IGRhdGFbOF07DQorCXVpbnQ4X3QgZGF0YVNpemU7DQorfTsNCisNCituYW1lc3BhY2UgbkNBTlNlc3Npb25NdXgNCit7DQorCXZvaWQgc2VuZE1lc3NhZ2Vfd3JhcHBlcih1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kTXMsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgcmVjZWl2ZU1lc3NhZ2Vfd3JhcHBlcih1aW50MzJfdCAqbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50OF90ICpkYXRhLCB1aW50OF90ICpkYXRhU2l6ZSwgdWludDMyX3QgKnRpbWVTdGFtcCwgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCBvcGVuU3RyZWFtU2Vzc2lvbih1aW50MzJfdCAqc2Vzc2lvbkhhbmRsZSwgdWludDMyX3QgbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50MzJfdCBtYXhNZXNzYWdlcywgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCBjbG9zZVN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSk7DQorCXZvaWQgcmVhZFN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSwgc3RydWN0IHRDQU5TdHJlYW1NZXNzYWdlICptZXNzYWdlcywgdWludDMyX3QgbWVzc2FnZXNUb1JlYWQsIHVpbnQzMl90ICptZXNzYWdlc1JlYWQsIGludDMyX3QgKnN0YXR1cyk7DQorCXZvaWQgZ2V0Q0FOU3RhdHVzKGZsb2F0ICpwZXJjZW50QnVzVXRpbGl6YXRpb24sIHVpbnQzMl90ICpidXNPZmZDb3VudCwgdWludDMyX3QgKnR4RnVsbENvdW50LCB1aW50MzJfdCAqcmVjZWl2ZUVycm9yQ291bnQsIHVpbnQzMl90ICp0cmFuc21pdEVycm9yQ291bnQsIGludDMyX3QgKnN0YXR1cyk7DQorfQ0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyINCit7DQorI2VuZGlmDQorDQorCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90ICpkYXRhLCB1aW50OF90IGRhdGFTaXplLCBpbnQzMl90IHBlcmlvZE1zLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3JlY2VpdmVNZXNzYWdlKHVpbnQzMl90ICptZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgKmRhdGFTaXplLCB1aW50MzJfdCAqdGltZVN0YW1wLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X29wZW5TdHJlYW1TZXNzaW9uKHVpbnQzMl90ICpzZXNzaW9uSGFuZGxlLCB1aW50MzJfdCBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQzMl90IG1heE1lc3NhZ2VzLCBpbnQzMl90ICpzdGF0dXMpOw0KKwl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X2Nsb3NlU3RyZWFtU2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uSGFuZGxlKTsNCisJdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWFkU3RyZWFtU2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uSGFuZGxlLCBzdHJ1Y3QgdENBTlN0cmVhbU1lc3NhZ2UgKm1lc3NhZ2VzLCB1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCwgdWludDMyX3QgKm1lc3NhZ2VzUmVhZCwgaW50MzJfdCAqc3RhdHVzKTsNCisJdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9nZXRDQU5TdGF0dXMoZmxvYXQgKnBlcmNlbnRCdXNVdGlsaXphdGlvbiwgdWludDMyX3QgKmJ1c09mZkNvdW50LCB1aW50MzJfdCAqdHhGdWxsQ291bnQsIHVpbnQzMl90ICpyZWNlaXZlRXJyb3JDb3VudCwgdWludDMyX3QgKnRyYW5zbWl0RXJyb3JDb3VudCwgaW50MzJfdCAqc3RhdHVzKTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8vIF9fQ0FOU2Vzc2lvbk11eF9oX18NCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0MmVjYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaApAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAJCQkJCU5PVElDRQ0KKyAqIA0KKyAqIAlUaGVzZSBhcmUgdGhlIG9ubHkgZXh0ZXJuYWxseSBleHBvc2VkIGZ1bmN0aW9ucyB0byB0aGUNCisgKiAgIE5ldHdvcmtDb21tdW5pY2F0aW9uIGxpYnJhcnkNCisgKiANCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEZSQyBTcGVjIGZvciBDb21tIFByb3RvY29sDQorICogUmV2aXNpb24gNC41LCBKdW5lIDMwLCAyMDA4DQorICoNCisgKiBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKyAqIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgX19GUkNfQ09NTV9IX18NCisjZGVmaW5lIF9fRlJDX0NPTU1fSF9fDQorDQorI2lmZGVmIFNJTVVMQVRJT04NCisjaW5jbHVkZSA8dnhXb3Jrc19jb21wYXQuaD4NCisjaWZkZWYgVVNFX1RIUklGVA0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMNCisjZWxzZQ0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fY2RlY2wNCisjZW5kaWYNCisjZWxzZQ0KKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykNCisjaW5jbHVkZSA8dnhXb3Jrcy5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMNCisjZWxzZQ0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjaW5jbHVkZSA8cHRocmVhZC5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMNCisjZW5kaWYNCisjZW5kaWYNCisNCisjZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTmV0Q29tbU5vdFJlc3BvbmRpbmcgLTQ0MDQ5DQorDQorZW51bSBBbGxpYW5jZVN0YXRpb25JRF90IHsNCisJa0FsbGlhbmNlU3RhdGlvbklEX3JlZDEsDQorCWtBbGxpYW5jZVN0YXRpb25JRF9yZWQyLA0KKwlrQWxsaWFuY2VTdGF0aW9uSURfcmVkMywNCisJa0FsbGlhbmNlU3RhdGlvbklEX2JsdWUxLA0KKwlrQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTIsDQorCWtBbGxpYW5jZVN0YXRpb25JRF9ibHVlMywNCit9Ow0KKw0KK3N0cnVjdCBDb250cm9sV29yZF90IHsNCisjaWZuZGVmIF9fdnh3b3Jrcw0KKwl1aW50MzJfdCBlbmFibGVkIDogMTsNCisJdWludDMyX3QgYXV0b25vbW91cyA6IDE7DQorCXVpbnQzMl90IHRlc3QgOjE7DQorCXVpbnQzMl90IGVTdG9wIDogMTsNCisJdWludDMyX3QgZm1zQXR0YWNoZWQ6MTsNCisJdWludDMyX3QgZHNBdHRhY2hlZDoxOw0KKwl1aW50MzJfdCBjb250cm9sX3Jlc2VydmVkIDogMjY7DQorI2Vsc2UNCisJdWludDMyX3QgY29udHJvbF9yZXNlcnZlZCA6IDI2Ow0KKwl1aW50MzJfdCBkc0F0dGFjaGVkOjE7DQorCXVpbnQzMl90IGZtc0F0dGFjaGVkOjE7DQorCXVpbnQzMl90IGVTdG9wIDogMTsNCisJdWludDMyX3QgdGVzdCA6MTsNCisJdWludDMyX3QgYXV0b25vbW91cyA6IDE7DQorCXVpbnQzMl90IGVuYWJsZWQgOiAxOw0KKyNlbmRpZg0KK307DQorDQorc3RydWN0IEpveXN0aWNrQXhlc190IHsNCisJdWludDE2X3QgY291bnQ7DQorCWludDE2X3QgYXhlc1sxXTsNCit9Ow0KKw0KK3N0cnVjdCBKb3lzdGlja1BPVl90IHsNCisJdWludDE2X3QgY291bnQ7DQorCWludDE2X3QgcG92c1sxXTsNCit9Ow0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX1Jlc2VydmUodm9pZCAqaW5zdGFuY2UpOw0KKyNpZm5kZWYgU0lNVUxBVElPTg0KKwl2b2lkIEVYUE9SVF9GVU5DIGdldEZQR0FIYXJkd2FyZVZlcnNpb24odWludDE2X3QgKmZwZ2FWZXJzaW9uLCB1aW50MzJfdCAqZnBnYVJldmlzaW9uKTsNCisjZW5kaWYNCisJaW50IEVYUE9SVF9GVU5DIHNldFN0YXR1c0RhdGEoZmxvYXQgYmF0dGVyeSwgdWludDhfdCBkc0RpZ2l0YWxPdXQsIHVpbnQ4X3QgdXBkYXRlTnVtYmVyLA0KKwkJCWNvbnN0IGNoYXIgKnVzZXJEYXRhSGlnaCwgaW50IHVzZXJEYXRhSGlnaExlbmd0aCwNCisJCQljb25zdCBjaGFyICp1c2VyRGF0YUxvdywgaW50IHVzZXJEYXRhTG93TGVuZ3RoLCBpbnQgd2FpdF9tcyk7DQorCWludCBFWFBPUlRfRlVOQyBzZXRFcnJvckRhdGEoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgZXJyb3JzTGVuZ3RoLCBpbnQgd2FpdF9tcyk7DQorCQ0KKyNpZmRlZiBTSU1VTEFUSU9ODQorCXZvaWQgRVhQT1JUX0ZVTkMgc2V0TmV3RGF0YVNlbShIQU5ETEUpOw0KKyNlbHNlDQorIyBpZiBkZWZpbmVkIChfX3Z4d29ya3MpDQorCXZvaWQgRVhQT1JUX0ZVTkMgc2V0TmV3RGF0YVNlbShTRU1fSUQpOw0KKyMgZWxzZQ0KKwl2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0ocHRocmVhZF9tdXRleF90ICopOw0KKyMgZW5kaWYNCisjZW5kaWYNCisNCisJLy8gdGhpcyB1aW50MzJfdCBpcyByZWFsbHkgYSBMVlJlZk51bQ0KKwlpbnQgRVhQT1JUX0ZVTkMgc2V0TmV3RGF0YU9jY3VyUmVmKHVpbnQzMl90IHJlZm51bSk7DQorDQorCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Q29udHJvbFdvcmQoc3RydWN0IENvbnRyb2xXb3JkX3QgKmNvbnRyb2xXb3JkKTsNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRBbGxpYW5jZVN0YXRpb24oZW51bSBBbGxpYW5jZVN0YXRpb25JRF90ICphbGxpYW5jZVN0YXRpb24pOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldE1hdGNoVGltZShmbG9hdCAqbWF0Y2hUaW1lKTsNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRKb3lzdGlja0F4ZXModWludDhfdCBqb3lzdGlja051bSwgc3RydWN0IEpveXN0aWNrQXhlc190ICpheGVzLCB1aW50OF90IG1heEF4ZXMpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrQnV0dG9ucyh1aW50OF90IGpveXN0aWNrTnVtLCB1aW50MzJfdCAqYnV0dG9ucywgdWludDhfdCAqY291bnQpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrUE9Wcyh1aW50OF90IGpveXN0aWNrTnVtLCBzdHJ1Y3QgSm95c3RpY2tQT1ZfdCAqcG92cywgdWludDhfdCBtYXhQT1ZzKTsNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9zZXRKb3lzdGlja091dHB1dHModWludDhfdCBqb3lzdGlja051bSwgdWludDMyX3QgaGlkT3V0cHV0cywgdWludDE2X3QgbGVmdFJ1bWJsZSwgdWludDE2X3QgcmlnaHRSdW1ibGUpOw0KKwlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrRGVzYyh1aW50OF90IGpveXN0aWNrTnVtLCB1aW50OF90ICppc1hCb3gsIHVpbnQ4X3QgKnR5cGUsIGNoYXIgKm5hbWUsDQorCQl1aW50OF90ICpheGlzQ291bnQsIHVpbnQ4X3QgKmF4aXNUeXBlcywgdWludDhfdCAqYnV0dG9uQ291bnQsIHVpbnQ4X3QgKnBvdkNvdW50KTsNCisNCisJdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0VmVyc2lvblN0cmluZyhjaGFyICp2ZXJzaW9uKTsNCisJaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1TdGFydGluZyh2b2lkKTsNCisJdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQodm9pZCk7DQorCXZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXModm9pZCk7DQorCXZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCh2b2lkKTsNCisJdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCh2b2lkKTsNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTg4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgKQEAgLTAsMCArMSw1OCBAQAorDQorI2lmbmRlZiBfX0xvYWRPdXRfaF9fDQorI2RlZmluZSBfX0xvYWRPdXRfaF9fDQorDQorI2lmZGVmIFNJTVVMQVRJT04NCisjaW5jbHVkZSA8dnhXb3Jrc19jb21wYXQuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX2NkZWNsDQorI2VsaWYgZGVmaW5lZCAoX192eHdvcmtzKQ0KKyNpbmNsdWRlIDx2eFdvcmtzLmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbHNlDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKyNkZWZpbmUgRVhQT1JUX0ZVTkMNCisjZW5kaWYNCisNCisjZGVmaW5lIGtNYXhNb2R1bGVOdW1iZXIgMg0KK25hbWVzcGFjZSBuTG9hZE91dA0KK3sNCisjaWYgZGVmaW5lZChfX3Z4d29ya3MpIHx8IGRlZmluZWQoU0lNVUxBVElPTikNCisgICAgdHlwZWRlZiBlbnVtIHsNCisgICAgICAgIGtNb2R1bGVUeXBlX1Vua25vd24gPSAweDAwLA0KKyAgICAgICAga01vZHVsZVR5cGVfQW5hbG9nID0gMHgwMSwNCisgICAgICAgIGtNb2R1bGVUeXBlX0RpZ2l0YWwgPSAweDAyLA0KKyAgICAgICAga01vZHVsZVR5cGVfU29sZW5vaWQgPSAweDAzLA0KKyAgICB9IHRNb2R1bGVUeXBlOw0KKyAgICBib29sIEVYUE9SVF9GVU5DIGdldE1vZHVsZVByZXNlbmNlKHRNb2R1bGVUeXBlIG1vZHVsZVR5cGUsIHVpbnQ4X3QgbW9kdWxlTnVtYmVyKTsNCisjZW5kaWYNCisgICAgdHlwZWRlZiBlbnVtIHsNCisgICAgICAgIGtUYXJnZXRDbGFzc19Vbmtub3duID0gMHgwMCwNCisgICAgICAgIGtUYXJnZXRDbGFzc19GUkMxID0gMHgxMCwNCisgICAgICAgIGtUYXJnZXRDbGFzc19GUkMyID0gMHgyMCwNCisgICAgICAgIGtUYXJnZXRDbGFzc19GUkMzID0gMHgzMCwNCisgICAgICAgIGtUYXJnZXRDbGFzc19Sb2JvUklPID0gMHg0MCwNCisjaWYgZGVmaW5lZChfX3Z4d29ya3MpIHx8IGRlZmluZWQoU0lNVUxBVElPTikNCisgICAgICAgIGtUYXJnZXRDbGFzc19GUkMyX0FuYWxvZyA9IGtUYXJnZXRDbGFzc19GUkMyIHwga01vZHVsZVR5cGVfQW5hbG9nLA0KKyAgICAgICAga1RhcmdldENsYXNzX0ZSQzJfRGlnaXRhbCA9IGtUYXJnZXRDbGFzc19GUkMyIHwga01vZHVsZVR5cGVfRGlnaXRhbCwNCisgICAgICAgIGtUYXJnZXRDbGFzc19GUkMyX1NvbGVub2lkID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9Tb2xlbm9pZCwNCisjZW5kaWYNCisgICAgICAgIGtUYXJnZXRDbGFzc19GYW1pbHlNYXNrID0gMHhGMCwNCisgICAgICAgIGtUYXJnZXRDbGFzc19Nb2R1bGVNYXNrID0gMHgwRiwNCisgICAgfSB0VGFyZ2V0Q2xhc3M7DQorICAgIHRUYXJnZXRDbGFzcyBFWFBPUlRfRlVOQyBnZXRUYXJnZXRDbGFzcygpOw0KK30NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChfX3Z4d29ya3MpIHx8IGRlZmluZWQoU0lNVUxBVElPTikNCisgICAgdWludDMyX3QgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25Mb2FkT3V0X2dldE1vZHVsZVByZXNlbmNlKHVpbnQzMl90IG1vZHVsZVR5cGUsIHVpbnQ4X3QgbW9kdWxlTnVtYmVyKTsNCisjZW5kaWYNCisgICAgdWludDMyX3QgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25Mb2FkT3V0X2dldFRhcmdldENsYXNzKCk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvLyBfX0xvYWRPdXRfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4YWM1YQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgKQEAgLTAsMCArMSwxMzkgQEAKKw0KKyNpZm5kZWYgX19Vc2FnZVJlcG9ydGluZ19oX18NCisjZGVmaW5lIF9fVXNhZ2VSZXBvcnRpbmdfaF9fDQorDQorI2lmZGVmIFNJTVVMQVRJT04NCisjaW5jbHVkZSA8dnhXb3Jrc19jb21wYXQuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX2NkZWNsDQorI2VsaWYgZGVmaW5lZCAoX192eHdvcmtzKQ0KKyNpbmNsdWRlIDx2eFdvcmtzLmg+DQorI2RlZmluZSBFWFBPUlRfRlVOQw0KKyNlbHNlDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjZGVmaW5lIEVYUE9SVF9GVU5DDQorI2VuZGlmDQorDQorI2RlZmluZSBrVXNhZ2VSZXBvcnRpbmdfdmVyc2lvbiAxDQorDQorbmFtZXNwYWNlIG5Vc2FnZVJlcG9ydGluZw0KK3sNCisgICAgdHlwZWRlZiBlbnVtDQorICAgIHsNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQ29udHJvbGxlciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfTW9kdWxlLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9MYW5ndWFnZSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQ0FOUGx1Z2luLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9BY2NlbGVyb21ldGVyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9BRFhMMzQ1LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9BbmFsb2dDaGFubmVsLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9BbmFsb2dUcmlnZ2VyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9BbmFsb2dUcmlnZ2VyT3V0cHV0LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9DQU5KYWd1YXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NvbXByZXNzb3IsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0NvdW50ZXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0Rhc2hib2FyZCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRGlnaXRhbElucHV0LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9EaWdpdGFsT3V0cHV0LA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Ecml2ZXJTdGF0aW9uQ0lPLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Ecml2ZXJTdGF0aW9uRUlPLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Ecml2ZXJTdGF0aW9uTENELA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9FbmNvZGVyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9HZWFyVG9vdGgsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0d5cm8sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0kyQywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfRnJhbWV3b3JrLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9KYWd1YXIsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0pveXN0aWNrLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9LaW5lY3QsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0tpbmVjdFN0aWNrLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9QSURDb250cm9sbGVyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9QcmVmZXJlbmNlcywNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfUFdNLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9SZWxheSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfU2VyaWFsUG9ydCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfU2Vydm8sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1NvbGVub2lkLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9TUEksDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1Rhc2ssDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1VsdHJhc29uaWMsDQorICAgICAgICBrUmVzb3VyY2VUeXBlX1ZpY3RvciwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfQnV0dG9uLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9Db21tYW5kLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9BeGlzQ2FtZXJhLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9QQ1ZpZGVvU2VydmVyLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9TbWFydERhc2hib2FyZCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfVGFsb24sDQorICAgICAgICBrUmVzb3VyY2VUeXBlX0hpVGVjaG5pY0NvbG9yU2Vuc29yLA0KKyAgICAgICAga1Jlc291cmNlVHlwZV9IaVRlY2huaWNBY2NlbCwNCisgICAgICAgIGtSZXNvdXJjZVR5cGVfSGlUZWNobmljQ29tcGFzcywNCisJCWtSZXNvdXJjZVR5cGVfU1JGMDgsDQorICAgIH0gdFJlc291cmNlVHlwZTsNCisNCisgICAgdHlwZWRlZiBlbnVtDQorICAgIHsNCisgICAgICAgIGtMYW5ndWFnZV9MYWJWSUVXID0gMSwNCisgICAgICAgIGtMYW5ndWFnZV9DUGx1c1BsdXMgPSAyLA0KKyAgICAgICAga0xhbmd1YWdlX0phdmEgPSAzLA0KKyAgICAgICAga0xhbmd1YWdlX1B5dGhvbiA9IDQsDQorDQorICAgICAgICBrQ0FOUGx1Z2luX0JsYWNrSmFnQnJpZGdlID0gMSwNCisgICAgICAgIGtDQU5QbHVnaW5fMkNBTiA9IDIsDQorDQorICAgICAgICBrRnJhbWV3b3JrX0l0ZXJhdGl2ZSA9IDEsDQorICAgICAgICBrRnJhbWV3b3JrX1NpbXBsZSA9IDIsDQorDQorICAgICAgICBrUm9ib3REcml2ZV9BcmNhZGVTdGFuZGFyZCA9IDEsDQorICAgICAgICBrUm9ib3REcml2ZV9BcmNhZGVCdXR0b25TcGluID0gMiwNCisgICAgICAgIGtSb2JvdERyaXZlX0FyY2FkZVJhdGlvQ3VydmUgPSAzLA0KKyAgICAgICAga1JvYm90RHJpdmVfVGFuayA9IDQsDQorICAgICAgICBrUm9ib3REcml2ZV9NZWNhbnVtUG9sYXIgPSA1LA0KKyAgICAgICAga1JvYm90RHJpdmVfTWVjYW51bUNhcnRlc2lhbiA9IDYsDQorDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkNJT19BbmFsb2cgPSAxLA0KKyAgICAgICAga0RyaXZlclN0YXRpb25DSU9fRGlnaXRhbEluID0gMiwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxPdXQgPSAzLA0KKw0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fQWNjZWxlcmF0aW9uID0gMSwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0FuYWxvZ0luID0gMiwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0FuYWxvZ091dCA9IDMsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19CdXR0b24gPSA0LA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fTEVEID0gNSwNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0RpZ2l0YWxJbiA9IDYsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19EaWdpdGFsT3V0ID0gNywNCisgICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0ZpeGVkRGlnaXRhbE91dCA9IDgsDQorICAgICAgICBrRHJpdmVyU3RhdGlvbkVJT19QV00gPSA5LA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fRW5jb2RlciA9IDEwLA0KKyAgICAgICAga0RyaXZlclN0YXRpb25FSU9fVG91Y2hTbGlkZXIgPSAxMSwNCisNCisgICAgICAgIGtBRFhMMzQ1X1NQSSA9IDEsDQorICAgICAgICBrQURYTDM0NV9JMkMgPSAyLA0KKw0KKyAgICAgICAga0NvbW1hbmRfU2NoZWR1bGVyID0gMSwNCisNCisgICAgICAgIGtTbWFydERhc2hib2FyZF9JbnN0YW5jZSA9IDEsDQorICAgIH0gdEluc3RhbmNlczsNCisNCisgICAgLyoqDQorICAgICAqIFJlcG9ydCB0aGUgdXNhZ2Ugb2YgYSByZXNvdXJjZSBvZiBpbnRlcmVzdC4NCisgICAgICogDQorICAgICAqIEBwYXJhbSByZXNvdXJjZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgdFJlc291cmNlVHlwZSBhYm92ZSAobWF4IHZhbHVlIDUxKS4NCisgICAgICogQHBhcmFtIGluc3RhbmNlTnVtYmVyIGFuIGluZGV4IHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UgaW5zdGFuY2UuDQorICAgICAqIEBwYXJhbSBjb250ZXh0IGFuIG9wdGlvbmFsIGFkZGl0aW9uYWwgY29udGV4dCBudW1iZXIgZm9yIHNvbWUgY2FzZXMgKHN1Y2ggYXMgbW9kdWxlIG51bWJlcikuICBTZXQgdG8gMCB0byBvbWl0Lg0KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSBhIHN0cmluZyB0byBiZSBpbmNsdWRlZCBkZXNjcmliaW5nIGZlYXR1cmVzIGluIHVzZSBvbiBhIHNwZWNpZmljIHJlc291cmNlLiAgU2V0dGluZyB0aGUgc2FtZSByZXNvdXJjZSBtb3JlIHRoYW4gb25jZSBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgZmVhdHVyZSBzdHJpbmcuDQorICAgICAqLw0KKyAgICB1aW50MzJfdCBFWFBPUlRfRlVOQyByZXBvcnQodFJlc291cmNlVHlwZSByZXNvdXJjZSwgdWludDhfdCBpbnN0YW5jZU51bWJlciwgdWludDhfdCBjb250ZXh0ID0gMCwgY29uc3QgY2hhciAqZmVhdHVyZSA9IE5VTEwpOw0KK30NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCisgICAgdWludDMyX3QgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25Vc2FnZVJlcG9ydGluZ19yZXBvcnQodWludDhfdCByZXNvdXJjZSwgdWludDhfdCBpbnN0YW5jZU51bWJlciwgdWludDhfdCBjb250ZXh0LCBjb25zdCBjaGFyICpmZWF0dXJlKTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8vIF9fVXNhZ2VSZXBvcnRpbmdfaF9fDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vc3ltTW9kdWxlTGluay5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vc3ltTW9kdWxlTGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODY3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9zeW1Nb2R1bGVMaW5rLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfX1NZTV9NT0RVTEVfTElOS19IX18KKyNkZWZpbmUgX19TWU1fTU9EVUxFX0xJTktfSF9fCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gU1RBVFVTICAgIG1vZHVsZU5hbWVGaW5kQnlTeW1ib2xOYW1lCisgICAgKAorICAgICAgICBjb25zdCBjaGFyICogICAgc3ltYm9sLCAgICAgICAgLyogc3ltYm9sIG5hbWUgdG8gbG9vayBmb3IgKi8KKyAgICAgICAgY2hhciAqIG1vZHVsZSAgICAgICAgLyogd2hlcmUgdG8gcmV0dXJuIG1vZHVsZSBuYW1lICovCisgICAgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1BXTS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvUFdNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3ODViYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1BXTS5oCkBAIC0wLDAgKzEsMTI2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKworLyoqCisgKiBDbGFzcyBpbXBsZW1lbnRzIHRoZSBQV00gZ2VuZXJhdGlvbiBpbiB0aGUgRlBHQS4KKyAqCisgKiBUaGUgdmFsdWVzIHN1cHBsaWVkIGFzIGFyZ3VtZW50cyBmb3IgUFdNIG91dHB1dHMgcmFuZ2UgZnJvbSAtMS4wIHRvIDEuMC4gVGhleSBhcmUgbWFwcGVkCisgKiB0byB0aGUgaGFyZHdhcmUgZGVwZW5kZW50IHZhbHVlcywgaW4gdGhpcyBjYXNlIDAtMjAwMCBmb3IgdGhlIEZQR0EuCisgKiBDaGFuZ2VzIGFyZSBpbW1lZGlhdGVseSBzZW50IHRvIHRoZSBGUEdBLCBhbmQgdGhlIHVwZGF0ZSBvY2N1cnMgYXQgdGhlIG5leHQKKyAqIEZQR0EgY3ljbGUuIFRoZXJlIGlzIG5vIGRlbGF5LgorICoKKyAqIEFzIG9mIHJldmlzaW9uIDAuMS4xMCBvZiB0aGUgRlBHQSwgdGhlIEZQR0EgaW50ZXJwcmV0cyB0aGUgMC0yMDAwIHZhbHVlcyBhcyBmb2xsb3dzOgorICogICAtIDIwMDAgPSBtYXhpbXVtIHB1bHNlIHdpZHRoCisgKiAgIC0gMTk5OSB0byAxMDAxID0gbGluZWFyIHNjYWxpbmcgZnJvbSAiZnVsbCBmb3J3YXJkIiB0byAiY2VudGVyIgorICogICAtIDEwMDAgPSBjZW50ZXIgdmFsdWUKKyAqICAgLSA5OTkgdG8gMiA9IGxpbmVhciBzY2FsaW5nIGZyb20gImNlbnRlciIgdG8gImZ1bGwgcmV2ZXJzZSIKKyAqICAgLSAxID0gbWluaW11bSBwdWxzZSB3aWR0aCAoY3VycmVudGx5IC41bXMpCisgKiAgIC0gMCA9IGRpc2FibGVkIChpLmUuIFBXTSBvdXRwdXQgaXMgaGVsZCBsb3cpCisgKi8KK2NsYXNzIFBXTSA6IHB1YmxpYyBTZW5zb3JCYXNlCit7CitwdWJsaWM6CisJZW51bSBQZXJpb2RNdWx0aXBsaWVyCisJeworCQlrUGVyaW9kTXVsdGlwbGllcl8xWCA9IDEsCisJCWtQZXJpb2RNdWx0aXBsaWVyXzJYID0gMiwKKwkJa1BlcmlvZE11bHRpcGxpZXJfNFggPSA0CisJfTsKKworCWV4cGxpY2l0IFBXTSh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5QV00oKTsKKwl2aXJ0dWFsIHZvaWQgU2V0UmF3KHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKKwl2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IEdldFJhdygpOworCXZvaWQgU2V0UGVyaW9kTXVsdGlwbGllcihQZXJpb2RNdWx0aXBsaWVyIG11bHQpOworCXZvaWQgU2V0WmVyb0xhdGNoKCk7CisJdm9pZCBFbmFibGVEZWFkYmFuZEVsaW1pbmF0aW9uKGJvb2wgZWxpbWluYXRlRGVhZGJhbmQpOworCXZvaWQgU2V0Qm91bmRzKGludDMyX3QgbWF4LCBpbnQzMl90IGRlYWRiYW5kTWF4LCBpbnQzMl90IGNlbnRlciwgaW50MzJfdCBkZWFkYmFuZE1pbiwKKwkJCWludDMyX3QgbWluKTsKKwl2b2lkIFNldEJvdW5kcyhkb3VibGUgbWF4LCBkb3VibGUgZGVhZGJhbmRNYXgsIGRvdWJsZSBjZW50ZXIsIGRvdWJsZSBkZWFkYmFuZE1pbiwgZG91YmxlIG1pbik7CisJdWludDMyX3QgR2V0Q2hhbm5lbCgpCisJeworCQlyZXR1cm4gbV9jaGFubmVsOworCX0KKworcHJvdGVjdGVkOgorCS8qKgorCSAqIGtEZWZhdWx0UHdtUGVyaW9kIGlzIGluIG1zCisJICoKKwkgKiAtIDIwbXMgcGVyaW9kcyAoNTAgSHopIGFyZSB0aGUgInNhZmVzdCIgc2V0dGluZyBpbiB0aGF0IHRoaXMgd29ya3MgZm9yIGFsbCBkZXZpY2VzCisJICogLSAyMG1zIHBlcmlvZHMgc2VlbSB0byBiZSBkZXNpcmFibGUgZm9yIFZleCBNb3RvcnMKKwkgKiAtIDIwbXMgcGVyaW9kcyBhcmUgdGhlIHNwZWNpZmllZCBwZXJpb2QgZm9yIEhTLTMyMkhEIHNlcnZvcywgYnV0IHdvcmsgcmVsaWFibHkgZG93bgorCSAqICAgICAgdG8gMTAuMCBtczsgc3RhcnRpbmcgYXQgYWJvdXQgOC41bXMsIHRoZSBzZXJ2byBzb21ldGltZXMgaHVtcyBhbmQgZ2V0IGhvdDsKKwkgKiAgICAgIGJ5IDUuMG1zIHRoZSBodW0gaXMgbmVhcmx5IGNvbnRpbnVvdXMKKwkgKiAtIDEwbXMgcGVyaW9kcyB3b3JrIHdlbGwgZm9yIFZpY3RvciA4ODQKKwkgKiAtIDVtcyBwZXJpb2RzIGFsbG93cyBoaWdoZXIgdXBkYXRlIHJhdGVzIGZvciBMdW1pbmFyeSBNaWNybyBKYWd1YXIgc3BlZWQgY29udHJvbGxlcnMuCisJICogICAgICBEdWUgdG8gdGhlIHNoaXBwaW5nIGZpcm13YXJlIG9uIHRoZSBKYWd1YXIsIHdlIGNhbid0IHJ1biB0aGUgdXBkYXRlIHBlcmlvZCBsZXNzCisJICogICAgICB0aGFuIDUuMDUgbXMuCisJICoKKwkgKiBrRGVmYXVsdFB3bVBlcmlvZCBpcyB0aGUgMXggcGVyaW9kICg1LjA1IG1zKS4gIEluIGhhcmR3YXJlLCB0aGUgcGVyaW9kIHNjYWxpbmcgaXMgaW1wbGVtZW50ZWQgYXMgYW4KKwkgKiBvdXRwdXQgc3F1ZWxjaCB0byBnZXQgbG9uZ2VyIHBlcmlvZHMgZm9yIG9sZCBkZXZpY2VzLgorCSAqLworCXN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRQd21QZXJpb2QgPSA1LjA1OworCS8qKgorCSAqIGtEZWZhdWx0UHdtQ2VudGVyIGlzIHRoZSBQV00gcmFuZ2UgY2VudGVyIGluIG1zCisJICovCisJc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdFB3bUNlbnRlciA9IDEuNTsKKwkvKioKKwkgKiBrRGVmYXVsdFBXTVN0ZXBzRG93biBpcyB0aGUgbnVtYmVyIG9mIFBXTSBzdGVwcyBiZWxvdyB0aGUgY2VudGVycG9pbnQKKwkgKi8KKwlzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVmYXVsdFB3bVN0ZXBzRG93biA9IDEwMDA7CisJc3RhdGljIGNvbnN0IGludDMyX3Qga1B3bURpc2FibGVkID0gMDsKKworCXZpcnR1YWwgdm9pZCBTZXRQb3NpdGlvbihmbG9hdCBwb3MpOworCXZpcnR1YWwgZmxvYXQgR2V0UG9zaXRpb24oKTsKKwl2aXJ0dWFsIHZvaWQgU2V0U3BlZWQoZmxvYXQgc3BlZWQpOworCXZpcnR1YWwgZmxvYXQgR2V0U3BlZWQoKTsKKworCWJvb2wgbV9lbGltaW5hdGVEZWFkYmFuZDsKKwlpbnQzMl90IG1fbWF4UHdtOworCWludDMyX3QgbV9kZWFkYmFuZE1heFB3bTsKKwlpbnQzMl90IG1fY2VudGVyUHdtOworCWludDMyX3QgbV9kZWFkYmFuZE1pblB3bTsKKwlpbnQzMl90IG1fbWluUHdtOworCitwcml2YXRlOgorCXZvaWQgSW5pdFBXTSh1aW50MzJfdCBjaGFubmVsKTsKKwl1aW50MzJfdCBtX2NoYW5uZWw7CisJaW50MzJfdCBHZXRNYXhQb3NpdGl2ZVB3bSgpCisJeworCQlyZXR1cm4gbV9tYXhQd207CisJfQorCWludDMyX3QgR2V0TWluUG9zaXRpdmVQd20oKQorCXsKKwkJcmV0dXJuIG1fZWxpbWluYXRlRGVhZGJhbmQgPyBtX2RlYWRiYW5kTWF4UHdtIDogbV9jZW50ZXJQd20gKyAxOworCX0KKwlpbnQzMl90IEdldENlbnRlclB3bSgpCisJeworCQlyZXR1cm4gbV9jZW50ZXJQd207CisJfQorCWludDMyX3QgR2V0TWF4TmVnYXRpdmVQd20oKQorCXsKKwkJcmV0dXJuIG1fZWxpbWluYXRlRGVhZGJhbmQgPyBtX2RlYWRiYW5kTWluUHdtIDogbV9jZW50ZXJQd20gLSAxOworCX0KKwlpbnQzMl90IEdldE1pbk5lZ2F0aXZlUHdtKCkKKwl7CisJCXJldHVybiBtX21pblB3bTsKKwl9CisJaW50MzJfdCBHZXRQb3NpdGl2ZVNjYWxlRmFjdG9yKCkKKwl7CisJCXJldHVybiBHZXRNYXhQb3NpdGl2ZVB3bSgpIC0gR2V0TWluUG9zaXRpdmVQd20oKTsKKwl9IC8vLzwgVGhlIHNjYWxlIGZvciBwb3NpdGl2ZSBzcGVlZHMuCisJaW50MzJfdCBHZXROZWdhdGl2ZVNjYWxlRmFjdG9yKCkKKwl7CisJCXJldHVybiBHZXRNYXhOZWdhdGl2ZVB3bSgpIC0gR2V0TWluTmVnYXRpdmVQd20oKTsKKwl9IC8vLzwgVGhlIHNjYWxlIGZvciBuZWdhdGl2ZSBzcGVlZHMuCisJaW50MzJfdCBHZXRGdWxsUmFuZ2VTY2FsZUZhY3RvcigpCisJeworCQlyZXR1cm4gR2V0TWF4UG9zaXRpdmVQd20oKSAtIEdldE1pbk5lZ2F0aXZlUHdtKCk7CisJfSAvLy88IFRoZSBzY2FsZSBmb3IgcG9zaXRpb25zLgorfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk0ZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvUG93ZXJEaXN0cmlidXRpb25QYW5lbC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisjaWZuZGVmIF9fV1BJTElCX1BPV0VSX0RJU1RSSUJVVElPTl9QQU5FTF9IX18KKyNkZWZpbmUgX19XUElMSUJfUE9XRVJfRElTVFJJQlVUSU9OX1BBTkVMX0hfXworCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCisvKioKKyAqIENsYXNzIGZvciBnZXR0aW5nIHZvbHRhZ2UsIGN1cnJlbnQsIHRlbXBlcmF0dXJlLCBwb3dlciBhbmQgZW5lcmd5IGZyb20gdGhlIENBTiBQRFAuCisgKiBUaGUgUERQIG11c3QgYmUgYXQgQ0FOIEFkZHJlc3MgMC4KKyAqIEBhdXRob3IgVGhvbWFzIENsYXJrCisgKi8KK2NsYXNzIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwgOiBwdWJsaWMgU2Vuc29yQmFzZSB7CisJcHVibGljOgorCQlQb3dlckRpc3RyaWJ1dGlvblBhbmVsKCk7CisJCQorCQlkb3VibGUgR2V0Vm9sdGFnZSgpOworCQlkb3VibGUgR2V0VGVtcGVyYXR1cmUoKTsKKwkJZG91YmxlIEdldEN1cnJlbnQodWludDhfdCBjaGFubmVsKTsKKwkJZG91YmxlIEdldFRvdGFsQ3VycmVudCgpOworCQlkb3VibGUgR2V0VG90YWxQb3dlcigpOworCQlkb3VibGUgR2V0VG90YWxFbmVyZ3koKTsKKwkJdm9pZCBSZXNldFRvdGFsRW5lcmd5KCk7CisJCXZvaWQgQ2xlYXJTdGlja3lGYXVsdHMoKTsKK307CisKKyNlbmRpZiAvKiBfX1dQSUxJQl9QT1dFUl9ESVNUUklCVVRJT05fUEFORUxfSF9fICovCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1JlbGF5LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9SZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzljYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9SZWxheS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCisvKioKKyAqIENsYXNzIGZvciBTcGlrZSBzdHlsZSByZWxheSBvdXRwdXRzLgorICogUmVsYXlzIGFyZSBpbnRlbmRlZCB0byBiZSBjb25uZWN0ZWQgdG8gc3Bpa2VzIG9yIHNpbWlsYXIgcmVsYXlzLiBUaGUgcmVsYXkgY2hhbm5lbHMgY29udHJvbHMKKyAqIGEgcGFpciBvZiBwaW5zIHRoYXQgYXJlIGVpdGhlciBib3RoIG9mZiwgb25lIG9uLCB0aGUgb3RoZXIgb24sIG9yIGJvdGggb24uIFRoaXMgdHJhbnNsYXRlcyBpbnRvCisgKiB0d28gc3Bpa2Ugb3V0cHV0cyBhdCAwdiwgb25lIGF0IDEydiBhbmQgb25lIGF0IDB2LCBvbmUgYXQgMHYgYW5kIHRoZSBvdGhlciBhdCAxMnYsIG9yIHR3bworICogc3Bpa2Ugb3V0cHV0cyBhdCAxMlYuIFRoaXMgYWxsb3dzIG9mZiwgZnVsbCBmb3J3YXJkLCBvciBmdWxsIHJldmVyc2UgY29udHJvbCBvZiBtb3RvcnMgd2l0aG91dAorICogdmFyaWFibGUgc3BlZWQuICBJdCBhbHNvIGFsbG93cyB0aGUgdHdvIGNoYW5uZWxzIChmb3J3YXJkIGFuZCByZXZlcnNlKSB0byBiZSB1c2VkIGluZGVwZW5kZW50bHkKKyAqIGZvciBzb21ldGhpbmcgdGhhdCBkb2VzIG5vdCBjYXJlIGFib3V0IHZvbHRhZ2UgcG9sYXRpcnkgKGxpa2UgYSBzb2xlbm9pZCkuCisgKi8KK2NsYXNzIFJlbGF5IDogcHVibGljIFNlbnNvckJhc2UKK3sKK3B1YmxpYzoKKwllbnVtIFZhbHVlCisJeworCQlrT2ZmLAorCQlrT24sCisJCWtGb3J3YXJkLAorCQlrUmV2ZXJzZQorCX07CisJZW51bSBEaXJlY3Rpb24KKwl7CisJCWtCb3RoRGlyZWN0aW9ucywKKwkJa0ZvcndhcmRPbmx5LAorCQlrUmV2ZXJzZU9ubHkKKwl9OworCisJUmVsYXkodWludDMyX3QgY2hhbm5lbCwgRGlyZWN0aW9uIGRpcmVjdGlvbiA9IGtCb3RoRGlyZWN0aW9ucyk7CisJdmlydHVhbCB+UmVsYXkoKTsKKworCXZvaWQgU2V0KFZhbHVlIHZhbHVlKTsKKwlWYWx1ZSBHZXQoKTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRSZWxheSgpOworCisJdWludDMyX3QgbV9jaGFubmVsOworCURpcmVjdGlvbiBtX2RpcmVjdGlvbjsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Sb2JvdEJhc2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1JvYm90QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNTMwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Sb2JvdEJhc2UuaApAQCAtMCwwICsxLDYzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkJhc2UuaCIKKyNpbmNsdWRlICJUYXNrLmgiCisKK2NsYXNzIERyaXZlclN0YXRpb247CisKKyNkZWZpbmUgU1RBUlRfUk9CT1RfQ0xBU1MoX0NsYXNzTmFtZV8pIFwKKwlpbnQgbWFpbigpIFwKKwl7IFwKKwkJaWYgKCFIQUxJbml0aWFsaXplKCkpe3N0ZDo6Y2Vycjw8IkZBVEFMIEVSUk9SOiBIQUwgY291bGQgbm90IGJlIGluaXRpYWxpemVkIjw8c3RkOjplbmRsO3JldHVybiAtMTt9CVwKKwkJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0xhbmd1YWdlLCBIQUxVc2FnZVJlcG9ydGluZzo6a0xhbmd1YWdlX0NQbHVzUGx1cyk7IFwKKwkJX0NsYXNzTmFtZV8gKnJvYm90ID0gbmV3IF9DbGFzc05hbWVfKCk7IFwKKwkJUm9ib3RCYXNlOjpyb2JvdFNldHVwKHJvYm90KTsgXAorCQlyZXR1cm4gMDsgXAorCX0KKworLyoqCisgKiBJbXBsZW1lbnQgYSBSb2JvdCBQcm9ncmFtIGZyYW1ld29yay4KKyAqIFRoZSBSb2JvdEJhc2UgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBhIHVzZXIgY3JlYXRpbmcgYSByb2JvdCBwcm9ncmFtLgorICogT3ZlcnJpZGRlbiBBdXRvbm9tb3VzKCkgYW5kIE9wZXJhdG9yQ29udHJvbCgpIG1ldGhvZHMgYXJlIGNhbGxlZCBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZQorICogYXMgdGhlIG1hdGNoIHByb2NlZWRzLiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIEF1dG9ub21vdXMgY29kZSB3aWxsIHJ1biB0bworICogY29tcGxldGlvbiBiZWZvcmUgdGhlIE9wZXJhdG9yQ29udHJvbCBjb2RlIGNvdWxkIHN0YXJ0LiBJbiB0aGUgZnV0dXJlIHRoZSBBdXRvbm9tb3VzIGNvZGUKKyAqIG1pZ2h0IGJlIHNwYXduZWQgYXMgYSB0YXNrLCB0aGVuIGtpbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBBdXRvbm9tb3VzIHBlcmlvZC4KKyAqLworY2xhc3MgUm9ib3RCYXNlCit7CisJZnJpZW5kIGNsYXNzIFJvYm90RGVsZXRlcjsKK3B1YmxpYzoKKwlzdGF0aWMgUm9ib3RCYXNlICZnZXRJbnN0YW5jZSgpOworCXN0YXRpYyB2b2lkIHNldEluc3RhbmNlKFJvYm90QmFzZSogcm9ib3QpOworCisJYm9vbCBJc0VuYWJsZWQoKTsKKwlib29sIElzRGlzYWJsZWQoKTsKKwlib29sIElzQXV0b25vbW91cygpOworCWJvb2wgSXNPcGVyYXRvckNvbnRyb2woKTsKKwlib29sIElzVGVzdCgpOworCWJvb2wgSXNOZXdEYXRhQXZhaWxhYmxlKCk7CisJc3RhdGljIHZvaWQgc3RhcnRSb2JvdFRhc2soRlVOQ1BUUiBmYWN0b3J5KTsKKwlzdGF0aWMgdm9pZCByb2JvdFRhc2soRlVOQ1BUUiBmYWN0b3J5LCBUYXNrICp0YXNrKTsKKwl2aXJ0dWFsIHZvaWQgU3RhcnRDb21wZXRpdGlvbigpID0gMDsKKwkKKwlzdGF0aWMgdm9pZCByb2JvdFNldHVwKFJvYm90QmFzZSAqcm9ib3QpOworCitwcm90ZWN0ZWQ6CisJdmlydHVhbCB+Um9ib3RCYXNlKCk7CisJUm9ib3RCYXNlKCk7CisKKwl2aXJ0dWFsIHZvaWQgUHJlc3RhcnQoKTsKKworCVRhc2sgKm1fdGFzazsKKwlEcml2ZXJTdGF0aW9uICptX2RzOworCitwcml2YXRlOgorCXN0YXRpYyBSb2JvdEJhc2UgKm1faW5zdGFuY2U7CisKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oUm9ib3RCYXNlKTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Sb2JvdERyaXZlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Sb2JvdERyaXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4NjMzMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1JvYm90RHJpdmUuaApAQCAtMCwwICsxLDExNCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisKK2NsYXNzIFNwZWVkQ29udHJvbGxlcjsKK2NsYXNzIEdlbmVyaWNISUQ7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgaGFuZGxpbmcgUm9ib3QgZHJpdmUgYmFzZWQgb24gYSBkZWZpbml0aW9uIG9mIHRoZSBtb3RvciBjb25maWd1cmF0aW9uLgorICogVGhlIHJvYm90IGRyaXZlIGNsYXNzIGhhbmRsZXMgYmFzaWMgZHJpdmluZyBmb3IgYSByb2JvdC4gQ3VycmVudGx5LCAyIGFuZCA0IG1vdG9yIHRhbmsgYW5kCisgKiBtZWNhbnVtIGRyaXZlIHRyYWlucyBhcmUgc3VwcG9ydGVkLiBJbiB0aGUgZnV0dXJlIG90aGVyIGRyaXZlIHR5cGVzIGxpa2Ugc3dlcnZlIG1pZ2h0IGJlCisgKiBpbXBsZW1lbnRlZC4gTW90b3IgY2hhbm5lbCBudW1iZXJzIGFyZSBwYXNzZWQgc3VwcGxpZWQgb24gY3JlYXRpb24gb2YgdGhlIGNsYXNzLiBUaG9zZQorICogYXJlIHVzZWQgZm9yIGVpdGhlciB0aGUgRHJpdmUgZnVuY3Rpb24gKGludGVuZGVkIGZvciBoYW5kIGNyZWF0ZWQgZHJpdmUgY29kZSwgc3VjaCBhcworICogYXV0b25vbW91cykgb3Igd2l0aCB0aGUgVGFuay9BcmNhZGUgZnVuY3Rpb25zIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIE9wZXJhdG9yIENvbnRyb2wKKyAqIGRyaXZpbmcuCisgKi8KK2NsYXNzIFJvYm90RHJpdmUgOiBwdWJsaWMgTW90b3JTYWZldHksIHB1YmxpYyBFcnJvckJhc2UKK3sKK3B1YmxpYzoKKwllbnVtIE1vdG9yVHlwZQorCXsKKwkJa0Zyb250TGVmdE1vdG9yID0gMCwKKwkJa0Zyb250UmlnaHRNb3RvciA9IDEsCisJCWtSZWFyTGVmdE1vdG9yID0gMiwKKwkJa1JlYXJSaWdodE1vdG9yID0gMworCX07CisKKwlSb2JvdERyaXZlKHVpbnQzMl90IGxlZnRNb3RvckNoYW5uZWwsIHVpbnQzMl90IHJpZ2h0TW90b3JDaGFubmVsKTsKKwlSb2JvdERyaXZlKHVpbnQzMl90IGZyb250TGVmdE1vdG9yQ2hhbm5lbCwgdWludDMyX3QgcmVhckxlZnRNb3RvckNoYW5uZWwsCisJCQl1aW50MzJfdCBmcm9udFJpZ2h0TW90b3JDaGFubmVsLCB1aW50MzJfdCByZWFyUmlnaHRNb3RvckNoYW5uZWwpOworCVJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICpsZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAqcmlnaHRNb3Rvcik7CisJUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgJmxlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyICZyaWdodE1vdG9yKTsKKwlSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAqZnJvbnRMZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAqcmVhckxlZnRNb3RvciwKKwkJCVNwZWVkQ29udHJvbGxlciAqZnJvbnRSaWdodE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJlYXJSaWdodE1vdG9yKTsKKwlSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAmZnJvbnRMZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAmcmVhckxlZnRNb3RvciwKKwkJCVNwZWVkQ29udHJvbGxlciAmZnJvbnRSaWdodE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgJnJlYXJSaWdodE1vdG9yKTsKKwl2aXJ0dWFsIH5Sb2JvdERyaXZlKCk7CisKKwl2b2lkIERyaXZlKGZsb2F0IG91dHB1dE1hZ25pdHVkZSwgZmxvYXQgY3VydmUpOworCXZvaWQgVGFua0RyaXZlKEdlbmVyaWNISUQgKmxlZnRTdGljaywgR2VuZXJpY0hJRCAqcmlnaHRTdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBUYW5rRHJpdmUoR2VuZXJpY0hJRCAmbGVmdFN0aWNrLCBHZW5lcmljSElEICZyaWdodFN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIFRhbmtEcml2ZShHZW5lcmljSElEICpsZWZ0U3RpY2ssIHVpbnQzMl90IGxlZnRBeGlzLCBHZW5lcmljSElEICpyaWdodFN0aWNrLAorCQkJdWludDMyX3QgcmlnaHRBeGlzLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIFRhbmtEcml2ZShHZW5lcmljSElEICZsZWZ0U3RpY2ssIHVpbnQzMl90IGxlZnRBeGlzLCBHZW5lcmljSElEICZyaWdodFN0aWNrLAorCQkJdWludDMyX3QgcmlnaHRBeGlzLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIFRhbmtEcml2ZShmbG9hdCBsZWZ0VmFsdWUsIGZsb2F0IHJpZ2h0VmFsdWUsIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgQXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAqc3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgQXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAmc3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgQXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAqbW92ZVN0aWNrLCB1aW50MzJfdCBtb3ZlQ2hhbm5lbCwgR2VuZXJpY0hJRCAqcm90YXRlU3RpY2ssCisJCQl1aW50MzJfdCByb3RhdGVDaGFubmVsLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIEFyY2FkZURyaXZlKEdlbmVyaWNISUQgJm1vdmVTdGljaywgdWludDMyX3QgbW92ZUNoYW5uZWwsIEdlbmVyaWNISUQgJnJvdGF0ZVN0aWNrLAorCQkJdWludDMyX3Qgcm90YXRlQ2hhbm5lbCwgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBBcmNhZGVEcml2ZShmbG9hdCBtb3ZlVmFsdWUsIGZsb2F0IHJvdGF0ZVZhbHVlLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIE1lY2FudW1Ecml2ZV9DYXJ0ZXNpYW4oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcm90YXRpb24sIGZsb2F0IGd5cm9BbmdsZSA9IDAuMCk7CisJdm9pZCBNZWNhbnVtRHJpdmVfUG9sYXIoZmxvYXQgbWFnbml0dWRlLCBmbG9hdCBkaXJlY3Rpb24sIGZsb2F0IHJvdGF0aW9uKTsKKwl2b2lkIEhvbG9ub21pY0RyaXZlKGZsb2F0IG1hZ25pdHVkZSwgZmxvYXQgZGlyZWN0aW9uLCBmbG9hdCByb3RhdGlvbik7CisJdmlydHVhbCB2b2lkIFNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhmbG9hdCBsZWZ0T3V0cHV0LCBmbG9hdCByaWdodE91dHB1dCk7CisJdm9pZCBTZXRJbnZlcnRlZE1vdG9yKE1vdG9yVHlwZSBtb3RvciwgYm9vbCBpc0ludmVydGVkKTsKKwl2b2lkIFNldFNlbnNpdGl2aXR5KGZsb2F0IHNlbnNpdGl2aXR5KTsKKwl2b2lkIFNldE1heE91dHB1dChkb3VibGUgbWF4T3V0cHV0KTsKKwl2b2lkIFNldENBTkphZ3VhclN5bmNHcm91cCh1aW50OF90IHN5bmNHcm91cCk7CisKKwl2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCk7CisJZmxvYXQgR2V0RXhwaXJhdGlvbigpOworCWJvb2wgSXNBbGl2ZSgpOworCXZvaWQgU3RvcE1vdG9yKCk7CisJYm9vbCBJc1NhZmV0eUVuYWJsZWQoKTsKKwl2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwl2b2lkIEdldERlc2NyaXB0aW9uKGNoYXIgKmRlc2MpOworCitwcm90ZWN0ZWQ6CisJdm9pZCBJbml0Um9ib3REcml2ZSgpOworCWZsb2F0IExpbWl0KGZsb2F0IG51bSk7CisJdm9pZCBOb3JtYWxpemUoZG91YmxlICp3aGVlbFNwZWVkcyk7CisJdm9pZCBSb3RhdGVWZWN0b3IoZG91YmxlICZ4LCBkb3VibGUgJnksIGRvdWJsZSBhbmdsZSk7CisKKwlzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4TnVtYmVyT2ZNb3RvcnMgPSA0OworCisJaW50MzJfdCBtX2ludmVydGVkTW90b3JzW2tNYXhOdW1iZXJPZk1vdG9yc107CisJZmxvYXQgbV9zZW5zaXRpdml0eTsKKwlkb3VibGUgbV9tYXhPdXRwdXQ7CisJYm9vbCBtX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnM7CisJU3BlZWRDb250cm9sbGVyICptX2Zyb250TGVmdE1vdG9yOworCVNwZWVkQ29udHJvbGxlciAqbV9mcm9udFJpZ2h0TW90b3I7CisJU3BlZWRDb250cm9sbGVyICptX3JlYXJMZWZ0TW90b3I7CisJU3BlZWRDb250cm9sbGVyICptX3JlYXJSaWdodE1vdG9yOworCU1vdG9yU2FmZXR5SGVscGVyICptX3NhZmV0eUhlbHBlcjsKKwl1aW50OF90IG1fc3luY0dyb3VwOworCitwcml2YXRlOgorCWludDMyX3QgR2V0TnVtTW90b3JzKCkKKwl7CisJCWludCBtb3RvcnMgPSAwOworCQlpZiAobV9mcm9udExlZnRNb3RvcikKKwkJCW1vdG9ycysrOworCQlpZiAobV9mcm9udFJpZ2h0TW90b3IpCisJCQltb3RvcnMrKzsKKwkJaWYgKG1fcmVhckxlZnRNb3RvcikKKwkJCW1vdG9ycysrOworCQlpZiAobV9yZWFyUmlnaHRNb3RvcikKKwkJCW1vdG9ycysrOworCQlyZXR1cm4gbW90b3JzOworCX0KKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oUm9ib3REcml2ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU1BJLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TUEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzZkNjFmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU1BJLmgKQEAgLTAsMCArMSw1OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKK2NsYXNzIERpZ2l0YWxPdXRwdXQ7CitjbGFzcyBEaWdpdGFsSW5wdXQ7CisKKy8qKgorICogU1BJIGJ1cyBpbnRlcmZhY2UgY2xhc3MuCisgKgorICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlbnNvciAoYW5kIG90aGVyIFNQSSBkZXZpY2UpIGRyaXZlcnMuCisgKiBJdCBwcm9iYWJseSBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuCisgKgorICovCitjbGFzcyBTUEkgOiBwdWJsaWMgU2Vuc29yQmFzZQoreworcHVibGljOgorCWVudW0gUG9ydCB7a09uYm9hcmRDUzAsIGtPbmJvYXJkQ1MxLCBrT25ib2FyZENTMiwga09uYm9hcmRDUzMsIGtNWFB9OworCVNQSShQb3J0IFNQSXBvcnQpOworCXZpcnR1YWwgflNQSSgpOworCisJdm9pZCBTZXRDbG9ja1JhdGUoZG91YmxlIGh6KTsKKworCXZvaWQgU2V0TVNCRmlyc3QoKTsKKwl2b2lkIFNldExTQkZpcnN0KCk7CisKKwl2b2lkIFNldFNhbXBsZURhdGFPbkZhbGxpbmcoKTsKKwl2b2lkIFNldFNhbXBsZURhdGFPblJpc2luZygpOworCisKKwl2b2lkIFNldENsb2NrQWN0aXZlTG93KCk7CisJdm9pZCBTZXRDbG9ja0FjdGl2ZUhpZ2goKTsKKworCXZvaWQgU2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKTsKKwl2b2lkIFNldENoaXBTZWxlY3RBY3RpdmVMb3coKTsKKworCXZpcnR1YWwgaW50MzJfdCBXcml0ZSh1aW50OF90KiBkYXRhLCB1aW50OF90IHNpemUpOworCXZpcnR1YWwgaW50MzJfdCBSZWFkKGJvb2wgaW5pdGlhdGUsIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwgdWludDhfdCBzaXplKTsKKwl2aXJ0dWFsIGludDMyX3QgVHJhbnNhY3Rpb24odWludDhfdCogZGF0YVRvU2VuZCwgdWludDhfdCogZGF0YVJlY2VpdmVkLCB1aW50OF90IHNpemUpOworCisKK3Byb3RlY3RlZDoKKwl1aW50OF90IG1fcG9ydDsKKwlib29sIG1fbXNiRmlyc3Q7CisJYm9vbCBtX3NhbXBsZU9uVHJhaWxpbmc7CisJYm9vbCBtX2Nsa19pZGxlX2hpZ2g7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0KCk7CisKKwlESVNBTExPV19DT1BZX0FORF9BU1NJR04oU1BJKTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TYWZlUFdNLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TYWZlUFdNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkNWMyMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NhZmVQV00uaApAQCAtMCwwICsxLDM4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIk1vdG9yU2FmZXR5LmgiCisjaW5jbHVkZSAiUFdNLmgiCisKK2NsYXNzIE1vdG9yU2FmZXR5SGVscGVyOworCisvKioKKyAqIEEgc2FmZSB2ZXJzaW9uIG9mIHRoZSBQV00gY2xhc3MuCisgKiBJdCBpcyBzYWZlIGJlY2F1c2UgaXQgaW1wbGVtZW50cyB0aGUgTW90b3JTYWZldHkgaW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMgdGltZW91dHMKKyAqIGluIHRoZSBldmVudCB0aGF0IHRoZSBtb3RvciB2YWx1ZSBpcyBub3QgdXBkYXRlZCBiZWZvcmUgdGhlIGV4cGlyYXRpb24gdGltZS4KKyAqIFRoaXMgZGVsZWdhdGVzIHRoZSBhY3R1YWwgd29yayB0byBhIE1vdG9yU2FmZXR5SGVscGVyIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIGFsbAorICogb2JqZWN0cyB0aGF0IGltcGxlbWVudCBNb3RvclNhZmV0eS4KKyAqLworY2xhc3MgU2FmZVBXTSA6IHB1YmxpYyBQV00sIHB1YmxpYyBNb3RvclNhZmV0eQoreworcHVibGljOgorCWV4cGxpY2l0IFNhZmVQV00odWludDMyX3QgY2hhbm5lbCk7CisJflNhZmVQV00oKTsKKworCXZvaWQgU2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KTsKKwlmbG9hdCBHZXRFeHBpcmF0aW9uKCk7CisJYm9vbCBJc0FsaXZlKCk7CisJdm9pZCBTdG9wTW90b3IoKTsKKwlib29sIElzU2FmZXR5RW5hYmxlZCgpOworCXZvaWQgU2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpOworCXZvaWQgR2V0RGVzY3JpcHRpb24oY2hhciAqZGVzYyk7CisKKwl2aXJ0dWFsIHZvaWQgU2V0U3BlZWQoZmxvYXQgc3BlZWQpOworcHJpdmF0ZToKKwl2b2lkIEluaXRTYWZlUFdNKCk7CisJTW90b3JTYWZldHlIZWxwZXIgKm1fc2FmZXR5SGVscGVyOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NhbXBsZVJvYm90LmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TYW1wbGVSb2JvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODQyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TYW1wbGVSb2JvdC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiUm9ib3RCYXNlLmgiCisKK2NsYXNzIFNhbXBsZVJvYm90IDogcHVibGljIFJvYm90QmFzZQoreworcHVibGljOgorCVNhbXBsZVJvYm90KCk7CisJdmlydHVhbCB+U2FtcGxlUm9ib3QoKSB7fQorCXZpcnR1YWwgdm9pZCBSb2JvdEluaXQoKTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZWQoKTsKKwl2aXJ0dWFsIHZvaWQgQXV0b25vbW91cygpOworCXZpcnR1YWwgdm9pZCBPcGVyYXRvckNvbnRyb2woKTsKKwl2aXJ0dWFsIHZvaWQgVGVzdCgpOworCXZpcnR1YWwgdm9pZCBSb2JvdE1haW4oKTsKKwl2b2lkIFN0YXJ0Q29tcGV0aXRpb24oKTsKKworcHJpdmF0ZToKKwlib29sIG1fcm9ib3RNYWluT3ZlcnJpZGRlbjsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TZXJ2by5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU2Vydm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWNmZTFmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU2Vydm8uaApAQCAtMCwwICsxLDQ4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKworLyoqCisgKiBTdGFuZGFyZCBob2JieSBzdHlsZSBzZXJ2by4KKyAqCisgKiBUaGUgcmFuZ2UgcGFyYW1ldGVycyBkZWZhdWx0IHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHRoZSBIaXRlYyBIUy0zMjJIRCBzZXJ2byBwcm92aWRlZAorICogaW4gdGhlIEZJUlNUIEtpdCBvZiBQYXJ0cyBpbiAyMDA4LgorICovCitjbGFzcyBTZXJ2byA6IHB1YmxpYyBTYWZlUFdNCit7CitwdWJsaWM6CisJZXhwbGljaXQgU2Vydm8odWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+U2Vydm8oKTsKKwl2b2lkIFNldChmbG9hdCB2YWx1ZSk7CisJdm9pZCBTZXRPZmZsaW5lKCk7CisJZmxvYXQgR2V0KCk7CisJdm9pZCBTZXRBbmdsZShmbG9hdCBhbmdsZSk7CisJZmxvYXQgR2V0QW5nbGUoKTsKKwlzdGF0aWMgZmxvYXQgR2V0TWF4QW5nbGUoKQorCXsKKwkJcmV0dXJuIGtNYXhTZXJ2b0FuZ2xlOworCX0KKwlzdGF0aWMgZmxvYXQgR2V0TWluQW5nbGUoKQorCXsKKwkJcmV0dXJuIGtNaW5TZXJ2b0FuZ2xlOworCX0KKworcHJpdmF0ZToKKwl2b2lkIEluaXRTZXJ2bygpOworCWZsb2F0IEdldFNlcnZvQW5nbGVSYW5nZSgpCisJeworCQlyZXR1cm4ga01heFNlcnZvQW5nbGUgLSBrTWluU2Vydm9BbmdsZTsKKwl9CisKKwlzdGF0aWMgY29uc3RleHByIGZsb2F0IGtNYXhTZXJ2b0FuZ2xlID0gMTgwLjA7CisJc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrTWluU2Vydm9BbmdsZSA9IDAuMDsKKworCXN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNYXhTZXJ2b1BXTSA9IDIuNDsKKwlzdGF0aWMgY29uc3RleHByIGZsb2F0IGtEZWZhdWx0TWluU2Vydm9QV00gPSAuNjsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9Tb2xlbm9pZC5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU29sZW5vaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTU0ZWEyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU29sZW5vaWQuaApAQCAtMCwwICsxLDMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNvbGVub2lkQmFzZS5oIgorCisvKioKKyAqIFNvbGVub2lkIGNsYXNzIGZvciBydW5uaW5nIGhpZ2ggdm9sdGFnZSBEaWdpdGFsIE91dHB1dCAoUENNKS4KKyAqIAorICogVGhlIFNvbGVub2lkIGNsYXNzIGlzIHR5cGljYWxseSB1c2VkIGZvciBwbmV1bWF0aWNzIHNvbGVub2lkcywgYnV0IGNvdWxkIGJlIHVzZWQKKyAqIGZvciBhbnkgZGV2aWNlIHdpdGhpbiB0aGUgY3VycmVudCBzcGVjIG9mIHRoZSBQQ00uCisgKi8KK2NsYXNzIFNvbGVub2lkIDogcHVibGljIFNvbGVub2lkQmFzZQoreworcHVibGljOgorCWV4cGxpY2l0IFNvbGVub2lkKHVpbnQzMl90IGNoYW5uZWwpOworCVNvbGVub2lkKHVpbnQ4X3QgbW9kdWxlTnVtYmVyLCB1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5Tb2xlbm9pZCgpOworCXZpcnR1YWwgdm9pZCBTZXQoYm9vbCBvbik7CisJdmlydHVhbCBib29sIEdldCgpOworCWJvb2wgSXNCbGFja0xpc3RlZCgpOworCitwcml2YXRlOgorCXZvaWQgSW5pdFNvbGVub2lkKCk7CisKKwl1aW50MzJfdCBtX2NoYW5uZWw7IC8vLzwgVGhlIGNoYW5uZWwgb24gdGhlIG1vZHVsZSB0byBjb250cm9sLgorfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NvbGVub2lkQmFzZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvU29sZW5vaWRCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwODIzZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NvbGVub2lkQmFzZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiSEFML2NwcC9TeW5jaHJvbml6ZWQuaHBwIgorCisvKioKKyAqIFNvbGVub2lkQmFzZSBjbGFzcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIHRoZSBTb2xlbm9pZCBhbmQKKyAqIERvdWJsZVNvbGVub2lkIGNsYXNzZXMuCisgKi8KK2NsYXNzIFNvbGVub2lkQmFzZSA6IHB1YmxpYyBTZW5zb3JCYXNlCit7CitwdWJsaWM6CisJdmlydHVhbCB+U29sZW5vaWRCYXNlKCk7CisJdWludDhfdCBHZXRBbGwoKTsKKworCXVpbnQ4X3QgR2V0UENNU29sZW5vaWRCbGFja0xpc3QoKTsKKwlib29sIEdldFBDTVNvbGVub2lkVm9sdGFnZVN0aWNreUZhdWx0KCk7CisJYm9vbCBHZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdCgpOworCXZvaWQgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKTsKK3Byb3RlY3RlZDoKKwlleHBsaWNpdCBTb2xlbm9pZEJhc2UodWludDhfdCBwY21JRCk7CisJdm9pZCBTZXQodWludDhfdCB2YWx1ZSwgdWludDhfdCBtYXNrKTsKKwl2aXJ0dWFsIHZvaWQgSW5pdFNvbGVub2lkKCkgPSAwOworCisJdWludDMyX3QgbV9tb2R1bGVOdW1iZXI7IC8vLzwgU2xvdCBudW1iZXIgd2hlcmUgdGhlIG1vZHVsZSBpcyBwbHVnZ2VkIGludG8gdGhlIGNoYXNzaXMuCisJc3RhdGljIFJlc291cmNlICptX2FsbG9jYXRlZDsKKworcHJpdmF0ZToKKwl2b2lkKiBtX3BvcnRzW2tTb2xlbm9pZENoYW5uZWxzXTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TcGVlZENvbnRyb2xsZXIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1NwZWVkQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDkyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9TcGVlZENvbnRyb2xsZXIuaApAQCAtMCwwICsxLDM1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorCisvKioKKyAqIEludGVyZmFjZSBmb3Igc3BlZWQgY29udHJvbGxpbmcgZGV2aWNlcy4KKyAqLworY2xhc3MgU3BlZWRDb250cm9sbGVyIDogcHVibGljIFBJRE91dHB1dAoreworcHVibGljOgorCXZpcnR1YWwgflNwZWVkQ29udHJvbGxlcigpIHt9CisJLyoqCisJICogQ29tbW9uIGludGVyZmFjZSBmb3Igc2V0dGluZyB0aGUgc3BlZWQgb2YgYSBzcGVlZCBjb250cm9sbGVyLgorCSAqIAorCSAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdG8gc2V0LiAgVmFsdWUgc2hvdWxkIGJlIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorCSAqIEBwYXJhbSBzeW5jR3JvdXAgVGhlIHVwZGF0ZSBncm91cCB0byBhZGQgdGhpcyBTZXQoKSB0bywgcGVuZGluZyBVcGRhdGVTeW5jR3JvdXAoKS4gIElmIDAsIHVwZGF0ZSBpbW1lZGlhdGVseS4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCA9IDApID0gMDsKKwkvKioKKwkgKiBDb21tb24gaW50ZXJmYWNlIGZvciBnZXR0aW5nIHRoZSBjdXJyZW50IHNldCBzcGVlZCBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisJICogCisJICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgc3BlZWQuICBWYWx1ZSBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKwkgKi8KKwl2aXJ0dWFsIGZsb2F0IEdldCgpID0gMDsKKwkvKioKKwkgKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpID0gMDsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9UYWxvbi5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVGFsb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTExY2NkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVGFsb24uaApAQCAtMCwwICsxLDI4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBDcm9zcyB0aGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgVGFsb24gYW5kIFRhbG9uIFNSIFNwZWVkIENvbnRyb2xsZXIKKyAqLworY2xhc3MgVGFsb24gOiBwdWJsaWMgU2FmZVBXTSwgcHVibGljIFNwZWVkQ29udHJvbGxlcgoreworcHVibGljOgorCWV4cGxpY2l0IFRhbG9uKHVpbnQzMl90IGNoYW5uZWwpOworCXZpcnR1YWwgflRhbG9uKCk7CisJdmlydHVhbCB2b2lkIFNldChmbG9hdCB2YWx1ZSwgdWludDhfdCBzeW5jR3JvdXAgPSAwKTsKKwl2aXJ0dWFsIGZsb2F0IEdldCgpOworCXZpcnR1YWwgdm9pZCBEaXNhYmxlKCk7CisKKwl2aXJ0dWFsIHZvaWQgUElEV3JpdGUoZmxvYXQgb3V0cHV0KTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRUYWxvbigpOworfTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1RhbG9uU1JYLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9UYWxvblNSWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzZiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9UYWxvblNSWC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2FmZVBXTS5oIgorI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorCisvKioKKyAqIENyb3NzIHRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBUYWxvbiBTUlggU3BlZWQgQ29udHJvbGxlciB3aXRoIFBXTSBjb250cm9sCisgKiBAc2VlIENBTlRhbG9uIGZvciBDQU4gY29udHJvbAorICovCitjbGFzcyBUYWxvblNSWCA6IHB1YmxpYyBTYWZlUFdNLCBwdWJsaWMgU3BlZWRDb250cm9sbGVyCit7CitwdWJsaWM6CisJZXhwbGljaXQgVGFsb25TUlgodWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+VGFsb25TUlgoKTsKKwl2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cCA9IDApOworCXZpcnR1YWwgZmxvYXQgR2V0KCk7CisJdmlydHVhbCB2b2lkIERpc2FibGUoKTsKKworCXZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpOworCitwcml2YXRlOgorCXZvaWQgSW5pdFRhbG9uU1JYKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVVNCQ2FtZXJhLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9VU0JDYW1lcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhiZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVVNCQ2FtZXJhLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCisvKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAibml2aXNpb24uaCIKKyNpbmNsdWRlICJOSUlNQVFkeC5oIgorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorCit0eXBlZGVmIGVudW0gd2hpdGVCYWxhbmNlX2VudW0geworICBrRml4ZWRJbmRvb3IgPSAzMDAwLAorICBrRml4ZWRPdXRkb29yMSA9IDQwMDAsCisgIGtGaXhlZE91dGRvb3IyID0gNTAwMCwKKyAga0ZpeGVkRmx1b3Jlc2NlbnQxID0gNTEwMCwKKyAga0ZpeGVkRmxvdXJlc2NlbnQyID0gNTIwMAorfSB3aGl0ZUJhbGFuY2U7CisKK2NsYXNzIFVTQkNhbWVyYSA6IHB1YmxpYyBFcnJvckJhc2UgeworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCAqQVRUUl9XQl9NT0RFID0gIkNhbWVyYUF0dHJpYnV0ZXM6OldoaXRlQmFsYW5jZTo6TW9kZSI7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCAqQVRUUl9XQl9WQUxVRSA9ICJDYW1lcmFBdHRyaWJ1dGVzOjpXaGl0ZUJhbGFuY2U6OlZhbHVlIjsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0ICpBVFRSX0VYX01PREUgPSAiQ2FtZXJhQXR0cmlidXRlczo6RXhwb3N1cmU6Ok1vZGUiOworICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QgKkFUVFJfRVhfVkFMVUUgPSAiQ2FtZXJhQXR0cmlidXRlczo6RXhwb3N1cmU6OlZhbHVlIjsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0ICpBVFRSX0JSX01PREUgPSAiQ2FtZXJhQXR0cmlidXRlczo6QnJpZ2h0bmVzczo6TW9kZSI7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCAqQVRUUl9CUl9WQUxVRSA9ICJDYW1lcmFBdHRyaWJ1dGVzOjpCcmlnaHRuZXNzOjpWYWx1ZSI7CisKKyBwcm90ZWN0ZWQ6CisgIElNQVFkeFNlc3Npb24gbV9pZDsKKyAgc3RkOjpzdHJpbmcgbV9uYW1lOworICBib29sIG1fdXNlSnBlZzsKKyAgYm9vbCBtX2FjdGl2ZTsKKyAgYm9vbCBtX29wZW47CisKKyAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbV9tdXRleDsKKworICB1bnNpZ25lZCBpbnQgbV93aWR0aDsKKyAgdW5zaWduZWQgaW50IG1faGVpZ2h0OworICBkb3VibGUgbV9mcHM7CisgIHN0ZDo6c3RyaW5nIG1fd2hpdGVCYWxhbmNlOworICB1bnNpZ25lZCBpbnQgbV93aGl0ZUJhbGFuY2VWYWx1ZTsKKyAgYm9vbCBtX3doaXRlQmFsYW5jZVZhbHVlUHJlc2VudDsKKyAgc3RkOjpzdHJpbmcgbV9leHBvc3VyZTsKKyAgdW5zaWduZWQgaW50IG1fZXhwb3N1cmVWYWx1ZTsKKyAgYm9vbCBtX2V4cG9zdXJlVmFsdWVQcmVzZW50OworICB1bnNpZ25lZCBpbnQgbV9icmlnaHRuZXNzOworICBib29sIG1fbmVlZFNldHRpbmdzVXBkYXRlOworCisgIHVuc2lnbmVkIGludCBHZXRKcGVnU2l6ZSh2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGludCBidWZmU2l6ZSk7CisKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCAqa0RlZmF1bHRDYW1lcmFOYW1lID0gImNhbTAiOworCisgIFVTQkNhbWVyYShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVzZUpwZWcpOworICAKKyAgdm9pZCBPcGVuQ2FtZXJhKCk7CisgIHZvaWQgQ2xvc2VDYW1lcmEoKTsKKyAgdm9pZCBTdGFydENhcHR1cmUoKTsKKyAgdm9pZCBTdG9wQ2FwdHVyZSgpOworICB2b2lkIFNldEZQUyhkb3VibGUgZnBzKTsKKyAgdm9pZCBTZXRTaXplKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCk7CisKKyAgdm9pZCBVcGRhdGVTZXR0aW5ncygpOworICAvKioKKyAgICogU2V0IHRoZSBicmlnaHRuZXNzLCBhcyBhIHBlcmNlbnRhZ2UgKDAtMTAwKS4KKyAgICovCisgIHZvaWQgU2V0QnJpZ2h0bmVzcyh1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzcyk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgYnJpZ2h0bmVzcywgYXMgYSBwZXJjZW50YWdlICgwLTEwMCkuCisgICAqLworICB1bnNpZ25lZCBpbnQgR2V0QnJpZ2h0bmVzcygpOworCisgIC8qKgorICAgKiBTZXQgdGhlIHdoaXRlIGJhbGFuY2UgdG8gYXV0bworICAgKi8KKyAgdm9pZCBTZXRXaGl0ZUJhbGFuY2VBdXRvKCk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgd2hpdGUgYmFsYW5jZSB0byBob2xkIGN1cnJlbnQKKyAgICovCisgIHZvaWQgU2V0V2hpdGVCYWxhbmNlSG9sZEN1cnJlbnQoKTsKKworICAvKioKKyAgICogU2V0IHRoZSB3aGl0ZSBiYWxhbmNlIHRvIG1hbnVhbCwgd2l0aCBzcGVjaWZpZWQgY29sb3IgdGVtcGVyYXR1cmUKKyAgICovCisgIHZvaWQgU2V0V2hpdGVCYWxhbmNlTWFudWFsKHVuc2lnbmVkIGludCB3YlZhbHVlKTsKKworICAvKioKKyAgICogU2V0IHRoZSBleHBvc3VyZSB0byBhdXRvIGV4cG9zdXJlCisgICAqLworICB2b2lkIFNldEV4cG9zdXJlQXV0bygpOworCisgIC8qKgorICAgKiBTZXQgdGhlIGV4cG9zdXJlIHRvIGhvbGQgY3VycmVudAorICAgKi8KKyAgdm9pZCBTZXRFeHBvc3VyZUhvbGRDdXJyZW50KCk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgZXhwb3N1cmUgdG8gbWFudWFsLCB3aXRoIGEgZ2l2ZW4gcGVyY2VudGFnZSAoMC0xMDApCisgICAqLworICB2b2lkIFNldEV4cG9zdXJlTWFudWFsKHVuc2lnbmVkIGludCBleHBWYWx1ZSk7CisgIAorICB2b2lkIEdldEltYWdlKEltYWdlKiBpbWFnZSk7CisgIHVuc2lnbmVkIGludCBHZXRJbWFnZURhdGEodm9pZCogYnVmZmVyLCB1bnNpZ25lZCBpbnQgYnVmZmVyU2l6ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVWx0cmFzb25pYy5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVWx0cmFzb25pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGU0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9VbHRyYXNvbmljLmgKQEAgLTAsMCArMSw4MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiVGFzay5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorCitjbGFzcyBDb3VudGVyOworY2xhc3MgRGlnaXRhbElucHV0OworY2xhc3MgRGlnaXRhbE91dHB1dDsKKworLyoqCisgKiBVbHRyYXNvbmljIHJhbmdlZmluZGVyIGNsYXNzLgorICogVGhlIFVsdHJhc29uaWMgcmFuZ2VmaW5kZXIgbWVhc3VyZXMgYWJzb2x1dGUgZGlzdGFuY2UgYmFzZWQgb24gdGhlIHJvdW5kLXRyaXAgdGltZQorICogb2YgYSBwaW5nIGdlbmVyYXRlZCBieSB0aGUgY29udHJvbGxlci4gVGhlc2Ugc2Vuc29ycyB1c2UgdHdvIHRyYW5zZHVjZXJzLCBhIHNwZWFrZXIgYW5kCisgKiBhIG1pY3JvcGhvbmUgYm90aCB0dW5lZCB0byB0aGUgdWx0cmFzb25pYyByYW5nZS4gQSBjb21tb24gdWx0cmFzb25pYyBzZW5zb3IsIHRoZSBEYXZlbnRlY2ggU1JGMDQKKyAqIHJlcXVpcmVzIGEgc2hvcnQgcHVsc2UgdG8gYmUgZ2VuZXJhdGVkIG9uIGEgZGlnaXRhbCBjaGFubmVsLiBUaGlzIGNhdXNlcyB0aGUgY2hpcnAgdG8gYmUKKyAqIGVtbWl0dGVkLiBBIHNlY29uZCBsaW5lIGJlY29tZXMgaGlnaCBhcyB0aGUgcGluZyBpcyB0cmFuc21pdHRlZCBhbmQgZ29lcyBsb3cgd2hlbgorICogdGhlIGVjaG8gaXMgcmVjZWl2ZWQuIFRoZSB0aW1lIHRoYXQgdGhlIGxpbmUgaXMgaGlnaCBkZXRlcm1pbmVzIHRoZSByb3VuZCB0cmlwIGRpc3RhbmNlCisgKiAodGltZSBvZiBmbGlnaHQpLgorICovCitjbGFzcyBVbHRyYXNvbmljIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBQSURTb3VyY2UKK3sKK3B1YmxpYzoKKwllbnVtIERpc3RhbmNlVW5pdAorCXsKKwkJa0luY2hlcyA9IDAsCisJCWtNaWxsaU1ldGVycyA9IDEKKwl9OworCisJVWx0cmFzb25pYyhEaWdpdGFsT3V0cHV0ICpwaW5nQ2hhbm5lbCwgRGlnaXRhbElucHV0ICplY2hvQ2hhbm5lbCwgRGlzdGFuY2VVbml0IHVuaXRzID0ga0luY2hlcyk7CisJVWx0cmFzb25pYyhEaWdpdGFsT3V0cHV0ICZwaW5nQ2hhbm5lbCwgRGlnaXRhbElucHV0ICZlY2hvQ2hhbm5lbCwgRGlzdGFuY2VVbml0IHVuaXRzID0ga0luY2hlcyk7CisJVWx0cmFzb25pYyh1aW50MzJfdCBwaW5nQ2hhbm5lbCwgdWludDMyX3QgZWNob0NoYW5uZWwsIERpc3RhbmNlVW5pdCB1bml0cyA9IGtJbmNoZXMpOworCXZpcnR1YWwgflVsdHJhc29uaWMoKTsKKworCXZvaWQgUGluZygpOworCWJvb2wgSXNSYW5nZVZhbGlkKCk7CisJc3RhdGljIHZvaWQgU2V0QXV0b21hdGljTW9kZShib29sIGVuYWJsaW5nKTsKKwlkb3VibGUgR2V0UmFuZ2VJbmNoZXMoKTsKKwlkb3VibGUgR2V0UmFuZ2VNTSgpOworCWJvb2wgSXNFbmFibGVkKCkKKwl7CisJCXJldHVybiBtX2VuYWJsZWQ7CisJfQorCXZvaWQgU2V0RW5hYmxlZChib29sIGVuYWJsZSkKKwl7CisJCW1fZW5hYmxlZCA9IGVuYWJsZTsKKwl9CisKKwlkb3VibGUgUElER2V0KCk7CisJdm9pZCBTZXREaXN0YW5jZVVuaXRzKERpc3RhbmNlVW5pdCB1bml0cyk7CisJRGlzdGFuY2VVbml0IEdldERpc3RhbmNlVW5pdHMoKTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRpYWxpemUoKTsKKworCXN0YXRpYyB2b2lkIFVsdHJhc29uaWNDaGVja2VyKCk7CisKKwlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUGluZ1RpbWUgPSAxMCAqIDFlLTY7CS8vLzwgVGltZSAoc2VjKSBmb3IgdGhlIHBpbmcgdHJpZ2dlciBwdWxzZS4KKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga1ByaW9yaXR5ID0gOTA7CS8vLzwgUHJpb3JpdHkgdGhhdCB0aGUgdWx0cmFzb25pYyByb3VuZCByb2JpbiB0YXNrIHJ1bnMuCisJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga01heFVsdHJhc29uaWNUaW1lID0gMC4xOwkvLy88IE1heCB0aW1lIChtcykgYmV0d2VlbiByZWFkaW5ncy4KKwlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU3BlZWRPZlNvdW5kSW5jaGVzUGVyU2VjID0gMTEzMC4wICogMTIuMDsKKworCXN0YXRpYyBUYXNrIG1fdGFzazsgLy8gdGFzayBkb2luZyB0aGUgcm91bmQtcm9iaW4gYXV0b21hdGljIHNlbnNpbmcKKwlzdGF0aWMgVWx0cmFzb25pYyAqbV9maXJzdFNlbnNvcjsgLy8gaGVhZCBvZiB0aGUgdWx0cmFzb25pYyBzZW5zb3IgbGlzdAorCXN0YXRpYyBib29sIG1fYXV0b21hdGljRW5hYmxlZDsgLy8gYXV0b21hdGljIHJvdW5kIHJvYmluIG1vZGUKKwlzdGF0aWMgU0VNQVBIT1JFX0lEIG1fc2VtYXBob3JlOyAvLyBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIGxpc3Qgb2Ygc2Vuc29ycworCisJRGlnaXRhbElucHV0ICptX2VjaG9DaGFubmVsOworCURpZ2l0YWxPdXRwdXQgKm1fcGluZ0NoYW5uZWw7CisJYm9vbCBtX2FsbG9jYXRlZENoYW5uZWxzOworCWJvb2wgbV9lbmFibGVkOworCUNvdW50ZXIgKm1fY291bnRlcjsKKwlVbHRyYXNvbmljICptX25leHRTZW5zb3I7CisJRGlzdGFuY2VVbml0IG1fdW5pdHM7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmljdG9yLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTgzNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmljdG9yLmgKQEAgLTAsMCArMSwzMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisKKy8qKgorICogVmV4IFJvYm90aWNzIFZpY3RvciA4ODggU3BlZWQgQ29udHJvbGxlcgorICoKKyAqIFRoZSBWZXggUm9ib3RpY3MgVmljdG9yIDg4NCBTcGVlZCBDb250cm9sbGVyIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGlzCisgKiBjbGFzcyBidXQgbWF5IG5lZWQgdG8gYmUgY2FsaWJyYXRlZCBwZXIgdGhlIFZpY3RvciA4ODQgdXNlciBtYW51YWwuCisgKi8KK2NsYXNzIFZpY3RvciA6IHB1YmxpYyBTYWZlUFdNLCBwdWJsaWMgU3BlZWRDb250cm9sbGVyCit7CitwdWJsaWM6CisJZXhwbGljaXQgVmljdG9yKHVpbnQzMl90IGNoYW5uZWwpOworCXZpcnR1YWwgflZpY3RvcigpOworCXZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCk7CisJdmlydHVhbCBmbG9hdCBHZXQoKTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpOworCisJdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0VmljdG9yKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmljdG9yU1AuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1ZpY3RvclNQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiYTRkYwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1ZpY3RvclNQLmgKQEAgLTAsMCArMSwyOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisKKy8qKgorICogVmV4IFJvYm90aWNzIFZpY3RvciBTUCBTcGVlZCBDb250cm9sbGVyCisgKi8KK2NsYXNzIFZpY3RvclNQIDogcHVibGljIFNhZmVQV00sIHB1YmxpYyBTcGVlZENvbnRyb2xsZXIKK3sKK3B1YmxpYzoKKwlleHBsaWNpdCBWaWN0b3JTUCh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5WaWN0b3JTUCgpOworCXZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCk7CisJdmlydHVhbCBmbG9hdCBHZXQoKTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpOworCisJdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0VmljdG9yU1AoKTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vQXhpc0NhbWVyYS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0F4aXNDYW1lcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzkyMDkzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0F4aXNDYW1lcmEuaApAQCAtMCwwICsxLDEyNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9Db2xvckltYWdlLmgiCisjaW5jbHVkZSAiVmlzaW9uL0hTTEltYWdlLmgiCisjaW5jbHVkZSAibml2aXNpb24uaCIKKworLyoqCisgKiBBeGlzIE0xMDExIG5ldHdvcmsgY2FtZXJhCisgKi8KK2NsYXNzIEF4aXNDYW1lcmE6IHB1YmxpYyBFcnJvckJhc2UKK3sKK3B1YmxpYzoKKwllbnVtIFdoaXRlQmFsYW5jZQorCXsKKwkJa1doaXRlQmFsYW5jZV9BdXRvbWF0aWMsCisJCWtXaGl0ZUJhbGFuY2VfSG9sZCwKKwkJa1doaXRlQmFsYW5jZV9GaXhlZE91dGRvb3IxLAorCQlrV2hpdGVCYWxhbmNlX0ZpeGVkT3V0ZG9vcjIsCisJCWtXaGl0ZUJhbGFuY2VfRml4ZWRJbmRvb3IsCisJCWtXaGl0ZUJhbGFuY2VfRml4ZWRGbHVvcmVzY2VudDEsCisJCWtXaGl0ZUJhbGFuY2VfRml4ZWRGbHVvcmVzY2VudDIKKwl9OworCisJZW51bSBFeHBvc3VyZUNvbnRyb2wKKwl7CisJCWtFeHBvc3VyZUNvbnRyb2xfQXV0b21hdGljLAorCQlrRXhwb3N1cmVDb250cm9sX0hvbGQsCisJCWtFeHBvc3VyZUNvbnRyb2xfRmxpY2tlckZyZWU1MEh6LAorCQlrRXhwb3N1cmVDb250cm9sX0ZsaWNrZXJGcmVlNjBIegorCX07CisKKwllbnVtIFJlc29sdXRpb24KKwl7CisJCWtSZXNvbHV0aW9uXzY0MHg0ODAsCisJCWtSZXNvbHV0aW9uXzQ4MHgzNjAsCisJCWtSZXNvbHV0aW9uXzMyMHgyNDAsCisJCWtSZXNvbHV0aW9uXzI0MHgxODAsCisJCWtSZXNvbHV0aW9uXzE3NngxNDQsCisJCWtSZXNvbHV0aW9uXzE2MHgxMjAsCisJfTsKKworCWVudW0gUm90YXRpb24KKwl7CisJCWtSb3RhdGlvbl8wLCBrUm90YXRpb25fMTgwCisJfTsKKworCWV4cGxpY2l0IEF4aXNDYW1lcmEoc3RkOjpzdHJpbmcgY29uc3QmIGNhbWVyYUhvc3QpOworCXZpcnR1YWwgfkF4aXNDYW1lcmEoKTsKKworCWJvb2wgSXNGcmVzaEltYWdlKCkgY29uc3Q7CisKKwlpbnQgR2V0SW1hZ2UoSW1hZ2UgKmltYWdlKTsKKwlpbnQgR2V0SW1hZ2UoQ29sb3JJbWFnZSAqaW1hZ2UpOworCUhTTEltYWdlICpHZXRJbWFnZSgpOworCWludCBDb3B5SlBFRyhjaGFyICoqZGVzdEltYWdlLCB1bnNpZ25lZCBpbnQgJmRlc3RJbWFnZVNpemUsIHVuc2lnbmVkIGludCAmZGVzdEltYWdlQnVmZmVyU2l6ZSk7CisKKwl2b2lkIFdyaXRlQnJpZ2h0bmVzcyhpbnQgYnJpZ2h0bmVzcyk7CisJaW50IEdldEJyaWdodG5lc3MoKTsKKworCXZvaWQgV3JpdGVXaGl0ZUJhbGFuY2UoV2hpdGVCYWxhbmNlIHdoaXRlQmFsYW5jZSk7CisJV2hpdGVCYWxhbmNlIEdldFdoaXRlQmFsYW5jZSgpOworCisJdm9pZCBXcml0ZUNvbG9yTGV2ZWwoaW50IGNvbG9yTGV2ZWwpOworCWludCBHZXRDb2xvckxldmVsKCk7CisKKwl2b2lkIFdyaXRlRXhwb3N1cmVDb250cm9sKEV4cG9zdXJlQ29udHJvbCBleHBvc3VyZUNvbnRyb2wpOworCUV4cG9zdXJlQ29udHJvbCBHZXRFeHBvc3VyZUNvbnRyb2woKTsKKworCXZvaWQgV3JpdGVFeHBvc3VyZVByaW9yaXR5KGludCBleHBvc3VyZVByaW9yaXR5KTsKKwlpbnQgR2V0RXhwb3N1cmVQcmlvcml0eSgpOworCisJdm9pZCBXcml0ZU1heEZQUyhpbnQgbWF4RlBTKTsKKwlpbnQgR2V0TWF4RlBTKCk7CisKKwl2b2lkIFdyaXRlUmVzb2x1dGlvbihSZXNvbHV0aW9uIHJlc29sdXRpb24pOworCVJlc29sdXRpb24gR2V0UmVzb2x1dGlvbigpOworCisJdm9pZCBXcml0ZUNvbXByZXNzaW9uKGludCBjb21wcmVzc2lvbik7CisJaW50IEdldENvbXByZXNzaW9uKCk7CisKKwl2b2lkIFdyaXRlUm90YXRpb24oUm90YXRpb24gcm90YXRpb24pOworCVJvdGF0aW9uIEdldFJvdGF0aW9uKCk7CisKK3ByaXZhdGU6CisJc3RkOjp0aHJlYWQgbV9jYXB0dXJlVGhyZWFkOworCXN0ZDo6c3RyaW5nIG1fY2FtZXJhSG9zdDsKKwlpbnQgbV9jYW1lcmFTb2NrZXQ7CisJc3RkOjptdXRleCBtX2NhcHR1cmVNdXRleDsKKworCXN0ZDo6bXV0ZXggbV9pbWFnZURhdGFNdXRleDsKKwlzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX2ltYWdlRGF0YTsKKwlib29sIG1fZnJlc2hJbWFnZTsKKworCWludCBtX2JyaWdodG5lc3M7CisJV2hpdGVCYWxhbmNlIG1fd2hpdGVCYWxhbmNlOworCWludCBtX2NvbG9yTGV2ZWw7CisJRXhwb3N1cmVDb250cm9sIG1fZXhwb3N1cmVDb250cm9sOworCWludCBtX2V4cG9zdXJlUHJpb3JpdHk7CisJaW50IG1fbWF4RlBTOworCVJlc29sdXRpb24gbV9yZXNvbHV0aW9uOworCWludCBtX2NvbXByZXNzaW9uOworCVJvdGF0aW9uIG1fcm90YXRpb247CisJYm9vbCBtX3BhcmFtZXRlcnNEaXJ0eTsKKwlib29sIG1fc3RyZWFtRGlydHk7CisJc3RkOjptdXRleCBtX3BhcmFtZXRlcnNNdXRleDsKKworCWJvb2wgbV9kb25lOworCisJdm9pZCBDYXB0dXJlKCk7CisJdm9pZCBSZWFkSW1hZ2VzRnJvbUNhbWVyYSgpOworCWJvb2wgV3JpdGVQYXJhbWV0ZXJzKCk7CisKKwlpbnQgQ3JlYXRlQ2FtZXJhU29ja2V0KHN0ZDo6c3RyaW5nIGNvbnN0JiByZXF1ZXN0U3RyaW5nLCBib29sIHNldEVycm9yKTsKKworCURJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBeGlzQ2FtZXJhKTsKK307CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vQmFlVXRpbGl0aWVzLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vQmFlVXRpbGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4NGIwNwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9CYWVVdGlsaXRpZXMuaApAQCAtMCwwICsxLDU3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisKKy8qICBDb25zdGFudHMgKi8KKyNkZWZpbmUgTE9HX0RFQlVHICAgIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxERUJVR19UWVBFCisjZGVmaW5lIExPR19JTkZPICAgICBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sSU5GT19UWVBFCisjZGVmaW5lIExPR19FUlJPUiAgICBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sRVJST1JfVFlQRQorI2RlZmluZSBMT0dfQ1JJVElDQUwgX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLENSSVRJQ0FMX1RZUEUKKyNkZWZpbmUgTE9HX0ZBVEFMICAgIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxGQVRBTF9UWVBFCisjZGVmaW5lIExPR19ERUJVRyAgICBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sREVCVUdfVFlQRQorCisvKiAgIEVudW1lcmF0ZWQgVHlwZXMgKi8KKworLyoqIGRlYnVnIGxldmVscyAqLworZW51bSBkcHJpbnRfdHlwZSB7REVCVUdfVFlQRSwgSU5GT19UWVBFLCBFUlJPUl9UWVBFLCBDUklUSUNBTF9UWVBFLCBGQVRBTF9UWVBFfTsKKworLyoqIGRlYnVnIG91dHB1dCBzZXR0aW5nICovCit0eXBlZGVmIGVudW0gRGVidWdPdXRwdXRUeXBlX2VudW0geyAKKwlERUJVR19PRkYsIERFQlVHX01PU1RMWV9PRkYsIERFQlVHX1NDUkVFTl9PTkxZLCBERUJVR19GSUxFX09OTFksIERFQlVHX1NDUkVFTl9BTkRfRklMRQorfURlYnVnT3V0cHV0VHlwZTsKKworLyogIEVudW1lcmF0ZWQgVHlwZXMgKi8KKworLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyogZGVidWcgKi8KK3ZvaWQgU2V0RGVidWdGbGFnICggRGVidWdPdXRwdXRUeXBlIGZsYWcgICk7IAordm9pZCBkcHJpbnRmICggY29uc3QgY2hhciAqIHRlbXBTdHJpbmcsIC4uLiAgKTsgIC8qIFZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgKi8KKworLyogc2V0IEZSQyByYW5nZXMgZm9yIGRyaXZlICovCitkb3VibGUgUmFuZ2VUb05vcm1hbGl6ZWQoZG91YmxlIHBpeGVsLCBpbnQgcmFuZ2UpOworLyogY2hhbmdlIG5vcm1hbGl6ZWQgdmFsdWUgdG8gYW55IHJhbmdlIC0gdXNlZCBmb3Igc2Vydm8gKi8KK2Zsb2F0IE5vcm1hbGl6ZVRvUmFuZ2UoZmxvYXQgbm9ybWFsaXplZFZhbHVlLCBmbG9hdCBtaW5SYW5nZSwgZmxvYXQgbWF4UmFuZ2UpOworZmxvYXQgTm9ybWFsaXplVG9SYW5nZShmbG9hdCBub3JtYWxpemVkVmFsdWUpOworCisvKiBzeXN0ZW0gdXRpbGl0aWVzICovCit2b2lkIFNob3dBY3Rpdml0eSAoY2hhciAqZm10LCAuLi4pOworZG91YmxlIEVsYXBzZWRUaW1lIChkb3VibGUgc3RhcnRUaW1lKTsKKworLyogc2Vydm8gcGFubmluZyB1dGlsaXRpZXMgKi8KK2NsYXNzIFNlcnZvOworZG91YmxlIFNpblBvc2l0aW9uIChkb3VibGUgKnBlcmlvZCwgZG91YmxlIHNpblN0YXJ0KTsKK3ZvaWQgcGFuSW5pdCgpOwordm9pZCBwYW5Jbml0KGRvdWJsZSBwZXJpb2QpOwordm9pZCBwYW5Gb3JUYXJnZXQoU2Vydm8gKnBhblNlcnZvKTsKK3ZvaWQgcGFuRm9yVGFyZ2V0KFNlcnZvICpwYW5TZXJ2bywgZG91YmxlIHNpblN0YXJ0KTsKKworLyogY29uZmlnIGZpbGUgcmVhZCB1dGlsaXRpZXMgKi8KK2ludCBwcm9jZXNzRmlsZShjaGFyICppbnB1dEZpbGUsIGNoYXIgKm91dHB1dFN0cmluZywgaW50IGxpbmVOdW1iZXIpOworaW50IGVtcHR5U3RyaW5nKGNoYXIgKnN0cmluZyk7Cit2b2lkIHN0cmlwU3RyaW5nKGNoYXIgKnN0cmluZyk7CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9CaW5hcnlJbWFnZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0JpbmFyeUltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzM2Y1NAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9CaW5hcnlJbWFnZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIk1vbm9JbWFnZS5oIgorLyoqCisgKiBJbmNsdWRlZCBmb3IgUGFydGljbGVBbmFseXNpc1JlcG9ydCBkZWZpbml0aW9uCisgKiBUT0RPOiBFbGltaW5hdGUgdGhpcyBkZXBlbmRlbmN5ISAKKyAqLworI2luY2x1ZGUgIlZpc2lvbi9WaXNpb25BUEkuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK2NsYXNzIEJpbmFyeUltYWdlIDogcHVibGljIE1vbm9JbWFnZQoreworcHVibGljOgorCUJpbmFyeUltYWdlKCk7CisJdmlydHVhbCB+QmluYXJ5SW1hZ2UoKTsKKwlpbnQgR2V0TnVtYmVyUGFydGljbGVzKCk7CisJUGFydGljbGVBbmFseXNpc1JlcG9ydCBHZXRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0KGludCBwYXJ0aWNsZU51bWJlcik7CisJdm9pZCBHZXRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0KGludCBwYXJ0aWNsZU51bWJlciwgUGFydGljbGVBbmFseXNpc1JlcG9ydCAqcGFyKTsKKwlzdGQ6OnZlY3RvcjxQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0PiogR2V0T3JkZXJlZFBhcnRpY2xlQW5hbHlzaXNSZXBvcnRzKCk7CisJQmluYXJ5SW1hZ2UgKlJlbW92ZVNtYWxsT2JqZWN0cyhib29sIGNvbm5lY3Rpdml0eTgsIGludCBlcm9zaW9ucyk7CisJQmluYXJ5SW1hZ2UgKlJlbW92ZUxhcmdlT2JqZWN0cyhib29sIGNvbm5lY3Rpdml0eTgsIGludCBlcm9zaW9ucyk7CisJQmluYXJ5SW1hZ2UgKkNvbnZleEh1bGwoYm9vbCBjb25uZWN0aXZpdHk4KTsKKwlCaW5hcnlJbWFnZSAqUGFydGljbGVGaWx0ZXIoUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIgKmNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCk7CisJdmlydHVhbCB2b2lkIFdyaXRlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKTsKK3ByaXZhdGU6CisJYm9vbCBQYXJ0aWNsZU1lYXN1cmVtZW50KGludCBwYXJ0aWNsZU51bWJlciwgTWVhc3VyZW1lbnRUeXBlIHdoYXRUb01lYXN1cmUsIGludCAqcmVzdWx0KTsKKwlib29sIFBhcnRpY2xlTWVhc3VyZW1lbnQoaW50IHBhcnRpY2xlTnVtYmVyLCBNZWFzdXJlbWVudFR5cGUgd2hhdFRvTWVhc3VyZSwgZG91YmxlICpyZXN1bHQpOworCXN0YXRpYyBkb3VibGUgTm9ybWFsaXplRnJvbVJhbmdlKGRvdWJsZSBwb3NpdGlvbiwgaW50IHJhbmdlKTsKKwlzdGF0aWMgYm9vbCBDb21wYXJlUGFydGljbGVTaXplcyhQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IHBhcnRpY2xlMSwgUGFydGljbGVBbmFseXNpc1JlcG9ydCBwYXJ0aWNsZTIpOworfTsKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0NvbG9ySW1hZ2UuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9Db2xvckltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1ZWQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9Db2xvckltYWdlLmgKQEAgLTAsMCArMSw2NSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSW1hZ2VCYXNlLmgiCisjaW5jbHVkZSAiQmluYXJ5SW1hZ2UuaCIKKyNpbmNsdWRlICJUaHJlc2hvbGQuaCIKKworY2xhc3MgQ29sb3JJbWFnZSA6IHB1YmxpYyBJbWFnZUJhc2UKK3sKK3B1YmxpYzoKKwlDb2xvckltYWdlKEltYWdlVHlwZSB0eXBlKTsKKwl2aXJ0dWFsIH5Db2xvckltYWdlKCk7CisJQmluYXJ5SW1hZ2UgKlRocmVzaG9sZFJHQihpbnQgcmVkTG93LCBpbnQgcmVkSGlnaCwgaW50IGdyZWVuTG93LCBpbnQgZ3JlZW5IaWdoLCBpbnQgYmx1ZUxvdywgaW50IGJsdWVIaWdoKTsKKwlCaW5hcnlJbWFnZSAqVGhyZXNob2xkSFNMKGludCBodWVMb3csIGludCBodWVIaWdoLCBpbnQgc2F0dXJhdGlvbkxvdywgaW50IHNhdHVyYXRpb25IaWdoLCBpbnQgbHVtaW5lbmNlTG93LCBpbnQgbHVtaW5lbmNlSGlnaCk7CisJQmluYXJ5SW1hZ2UgKlRocmVzaG9sZEhTVihpbnQgaHVlTG93LCBpbnQgaHVlSGlnaCwgaW50IHNhdHVyYXRpb25Mb3csIGludCBzYXR1cmF0aW9uSGlnaCwgaW50IHZhbHVlSGlnaCwgaW50IHZhbHVlTG93KTsKKwlCaW5hcnlJbWFnZSAqVGhyZXNob2xkSFNJKGludCBodWVMb3csIGludCBodWVIaWdoLCBpbnQgc2F0dXJhdGlvbkxvdywgaW50IHNhdHVyYXRpb25IaWdoLCBpbnQgaW50ZW5zaXR5TG93LCBpbnQgaW50ZW5zaXR5SGlnaCk7CisJQmluYXJ5SW1hZ2UgKlRocmVzaG9sZFJHQihUaHJlc2hvbGQgJnRocmVzaG9sZCk7CisJQmluYXJ5SW1hZ2UgKlRocmVzaG9sZEhTTChUaHJlc2hvbGQgJnRocmVzaG9sZCk7CisJQmluYXJ5SW1hZ2UgKlRocmVzaG9sZEhTVihUaHJlc2hvbGQgJnRocmVzaG9sZCk7CisJQmluYXJ5SW1hZ2UgKlRocmVzaG9sZEhTSShUaHJlc2hvbGQgJnRocmVzaG9sZCk7CisJTW9ub0ltYWdlICpHZXRSZWRQbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0R3JlZW5QbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0Qmx1ZVBsYW5lKCk7CisJTW9ub0ltYWdlICpHZXRIU0xIdWVQbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0SFNWSHVlUGxhbmUoKTsKKwlNb25vSW1hZ2UgKkdldEhTSUh1ZVBsYW5lKCk7CisJTW9ub0ltYWdlICpHZXRIU0xTYXR1cmF0aW9uUGxhbmUoKTsKKwlNb25vSW1hZ2UgKkdldEhTVlNhdHVyYXRpb25QbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0SFNJU2F0dXJhdGlvblBsYW5lKCk7CisJTW9ub0ltYWdlICpHZXRMdW1pbmFuY2VQbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0VmFsdWVQbGFuZSgpOworCU1vbm9JbWFnZSAqR2V0SW50ZW5zaXR5UGxhbmUoKTsKKwl2b2lkIFJlcGxhY2VSZWRQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VHcmVlblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpOworCXZvaWQgUmVwbGFjZUJsdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VIU0xIdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VIU1ZIdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VIU0lIdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VIU0xTYXR1cmF0aW9uUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlSFNWU2F0dXJhdGlvblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpOworCXZvaWQgUmVwbGFjZUhTSVNhdHVyYXRpb25QbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VMdW1pbmFuY2VQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKwl2b2lkIFJlcGxhY2VWYWx1ZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpOworCXZvaWQgUmVwbGFjZUludGVuc2l0eVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpOworCXZvaWQgQ29sb3JFcXVhbGl6ZSgpOworCXZvaWQgTHVtaW5hbmNlRXF1YWxpemUoKTsKKwkKK3ByaXZhdGU6CisJQmluYXJ5SW1hZ2UgKkNvbXB1dGVUaHJlc2hvbGQoQ29sb3JNb2RlIGNvbG9yTW9kZSwgaW50IGxvdzEsIGludCBoaWdoMSwgaW50IGxvdzIsIGludCBoaWdoMiwgaW50IGxvdzMsIGludCBoaWdoMyk7CisJdm9pZCBFcXVhbGl6ZShib29sIGFsbFBsYW5lcyk7CisJTW9ub0ltYWdlICogRXh0cmFjdENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUsIGludCBwbGFuZU51bWJlcik7CisJTW9ub0ltYWdlICogRXh0cmFjdEZpcnN0Q29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSk7CisJTW9ub0ltYWdlICogRXh0cmFjdFNlY29uZENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUpOworCU1vbm9JbWFnZSAqIEV4dHJhY3RUaGlyZENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUpOworCXZvaWQgUmVwbGFjZVBsYW5lKENvbG9yTW9kZSBtb2RlLCBNb25vSW1hZ2UgKnBsYW5lLCBpbnQgcGxhbmVOdW1iZXIpOworCXZvaWQgUmVwbGFjZUZpcnN0Q29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlU2Vjb25kQ29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSk7CisJdm9pZCBSZXBsYWNlVGhpcmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlLCBNb25vSW1hZ2UgKnBsYW5lKTsKK307CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9GcmNFcnJvci5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0ZyY0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkNDdmNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9GcmNFcnJvci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgRVJSX1ZJU0lPTl9HRU5FUkFMX0VSUk9SCQkJMTY2MDAwCS8vIAorI2RlZmluZSBFUlJfQ09MT1JfTk9UX0ZPVU5ECQkJCQkxNjYxMDAJLy8gVHJhY2tBUEkuY3BwCisjZGVmaW5lIEVSUl9QQVJUSUNMRV9UT09fU01BTEwJCQkJMTY2MTAxCS8vIFRyYWNrQVBJLmNwcAorCisjZGVmaW5lIEVSUl9DQU1FUkFfRkFJTFVSRQkJCQkJMTY2MjAwCS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfU09DS0VUX0NSRUFURV9GQUlMRUQJCTE2NjIwMQkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX0NPTk5FQ1RfRkFJTEVECQkJMTY2MjAyCS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfU1RBTEVfSU1BR0UJCQkJMTY2MjAzCS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfTk9UX0lOSVRJQUxJWkVECQkJMTY2MjA0CS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfTk9fQlVGRkVSX0FWQUlMQUJMRQkJMTY2MjA1CS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfSEVBREVSX0VSUk9SCQkJCTE2NjIwNgkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX0JMT0NLSU5HX1RJTUVPVVQJCQkxNjYyMDcJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9BVVRIT1JJWkFUSU9OX0ZBSUxFRAkJMTY2MjA4CS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfVEFTS19TUEFXTl9GQUlMRUQJCTE2NjIwOQkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX1RBU0tfSU5QVVRfT1VUX09GX1JBTkdFCTE2NjIxMAkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX0NPTU1BTkRfRkFJTFVSRQkJCTE2NjIxMQkvLyBBeGlzQ2FtZXJhLmNwcAorCisvKiBlcnJvciBoYW5kbGluZyBmdW5jdGlvbnMgKi8KK2ludCBHZXRMYXN0VmlzaW9uRXJyb3IoKTsKK2NvbnN0IGNoYXIqIEdldFZpc2lvbkVycm9yVGV4dChpbnQgZXJyb3JDb2RlKTsKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0hTTEltYWdlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vSFNMSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQyOGFhCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0hTTEltYWdlLmgKQEAgLTAsMCArMSwyMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ29sb3JJbWFnZS5oIgorCisvKioKKyAqIEEgY29sb3IgaW1hZ2UgcmVwcmVzZW50ZWQgaW4gSFNMIGNvbG9yIHNwYWNlIGF0IDMgYnl0ZXMgcGVyIHBpeGVsLgorICovCitjbGFzcyBIU0xJbWFnZSA6IHB1YmxpYyBDb2xvckltYWdlCit7CitwdWJsaWM6CisgICAgSFNMSW1hZ2UoKTsKKyAgICBIU0xJbWFnZShjb25zdCBjaGFyICpmaWxlTmFtZSk7CisgICAgdmlydHVhbCB+SFNMSW1hZ2UoKTsKK307CisKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0ltYWdlQmFzZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL0ltYWdlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWU4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vSW1hZ2VCYXNlLmgKQEAgLTAsMCArMSwyNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJuaXZpc2lvbi5oIgorI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorCisjZGVmaW5lIERFRkFVTFRfQk9SREVSX1NJWkUgMworCitjbGFzcyBJbWFnZUJhc2UgOiBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisJSW1hZ2VCYXNlKEltYWdlVHlwZSB0eXBlKTsKKwl2aXJ0dWFsIH5JbWFnZUJhc2UoKTsKKwl2aXJ0dWFsIHZvaWQgV3JpdGUoY29uc3QgY2hhciAqZmlsZU5hbWUpOworCWludCBHZXRIZWlnaHQoKTsKKwlpbnQgR2V0V2lkdGgoKTsKKwlJbWFnZSAqR2V0SW1hcUltYWdlKCk7Citwcm90ZWN0ZWQ6CisJSW1hZ2UgKm1faW1hcUltYWdlOworfTsKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL01vbm9JbWFnZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL01vbm9JbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZTM1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vTW9ub0ltYWdlLmgKQEAgLTAsMCArMSwyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovDQorLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8NCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNwcmFnbWEgb25jZQ0KKw0KKyNpbmNsdWRlICJJbWFnZUJhc2UuaCINCisNCisjaW5jbHVkZSA8dmVjdG9yPg0KKw0KK2NsYXNzIE1vbm9JbWFnZSA6IHB1YmxpYyBJbWFnZUJhc2UNCit7DQorcHVibGljOg0KKwlNb25vSW1hZ2UoKTsNCisJdmlydHVhbCB+TW9ub0ltYWdlKCk7DQorDQorCXN0ZDo6dmVjdG9yPEVsbGlwc2VNYXRjaD4gKkRldGVjdEVsbGlwc2VzKEVsbGlwc2VEZXNjcmlwdG9yICplbGxpcHNlRGVzY3JpcHRvciwNCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VydmVPcHRpb25zICpjdXJ2ZU9wdGlvbnMsDQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXBlRGV0ZWN0aW9uT3B0aW9ucyAqc2hhcGVEZXRlY3Rpb25PcHRpb25zLA0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0kgKnJvaSk7DQorCXN0ZDo6dmVjdG9yPEVsbGlwc2VNYXRjaD4gKiBEZXRlY3RFbGxpcHNlcyhFbGxpcHNlRGVzY3JpcHRvciAqZWxsaXBzZURlc2NyaXB0b3IpOw0KK307DQorDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL1JHQkltYWdlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vUkdCSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWYyZDcyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL1JHQkltYWdlLmgKQEAgLTAsMCArMSwyMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ29sb3JJbWFnZS5oIgorCisvKioKKyAqIEEgY29sb3IgaW1hZ2UgcmVwcmVzZW50ZWQgaW4gUkdCIGNvbG9yIHNwYWNlIGF0IDMgYnl0ZXMgcGVyIHBpeGVsLgorICovCitjbGFzcyBSR0JJbWFnZSA6IHB1YmxpYyBDb2xvckltYWdlCit7CitwdWJsaWM6CisgICAgUkdCSW1hZ2UoKTsKKyAgICBSR0JJbWFnZShjb25zdCBjaGFyICpmaWxlTmFtZSk7CisgICAgdmlydHVhbCB+UkdCSW1hZ2UoKTsKK307CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9UaHJlc2hvbGQuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1Zpc2lvbi9UaHJlc2hvbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDcwY2JmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL1RocmVzaG9sZC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLw0KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjcHJhZ21hIG9uY2UNCisNCisvKioNCisgKiBDb2xvciB0aHJlc2hvbGQgdmFsdWVzLg0KKyAqIFRoaXMgb2JqZWN0IHJlcHJlc250cyB0aGUgdGhyZXNob2xkIHZhbHVlcyBmb3IgYW55IHR5cGUgb2YgY29sb3Igb2JqZWN0DQorICogdGhhdCBpcyB1c2VkIGluIGEgdGhyZXNoaG9sZCBvcGVyYXRpb24uIEl0IHNpbXBsaWZpZXMgcGFzc2luZyB2YWx1ZXMNCisgKiBhcm91bmQgaW4gYSBwcm9ncmFtIGZvciBjb2xvciBkZXRlY3Rpb24uDQorICovDQorY2xhc3MgVGhyZXNob2xkIA0KK3sNCitwdWJsaWM6DQorCWludCBwbGFuZTFMb3c7DQorCWludCBwbGFuZTFIaWdoOw0KKwlpbnQgcGxhbmUyTG93Ow0KKwlpbnQgcGxhbmUySGlnaDsNCisJaW50IHBsYW5lM0xvdzsNCisJaW50IHBsYW5lM0hpZ2g7DQorCVRocmVzaG9sZChpbnQgcGxhbmUxTG93LCBpbnQgcGxhbmUxSGlnaCwNCisJICAgICAgICAgIGludCBwbGFuZTJMb3csIGludCBwbGFuZTJIaWdoLA0KKwkgICAgICAgICAgaW50IHBsYW5lM0xvdywgaW50IHBsYW5lM0hpZ2gpOw0KK307DQorDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL1Zpc2lvbkFQSS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvVmlzaW9uL1Zpc2lvbkFQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjkxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9WaXNpb24vVmlzaW9uQVBJLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIm5pdmlzaW9uLmgiIAorCisvKiAgIENvbnN0YW50cyAqLworCisjZGVmaW5lIERFRkFVTFRfQk9SREVSX1NJWkUJCQkJMwkJLy9WaXNpb25BUEkuZnJjQ3JlYXRlSW1hZ2UKKyNkZWZpbmUgREVGQVVMVF9TQVRVUkFUSU9OX1RIUkVTSE9MRAk0MAkJLy9UcmFja0FQSS5GaW5kQ29sb3IKKworLyogICBGb3J3YXJkIERlY2xhcmUgRGF0YSBTdHJ1Y3R1cmVzICovCit0eXBlZGVmIHN0cnVjdCBGaW5kRWRnZU9wdGlvbnNfc3RydWN0IEZpbmRFZGdlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENpcmN1bGFyRWRnZVJlcG9ydF9zdHJ1Y3QgQ2lyY3VsYXJFZGdlUmVwb3J0OworCisvKiAgIERhdGEgU3RydWN0dXJlcyAqLworCisvKiogIGZyY1BhcnRpY2xlQW5hbHlzaXMgcmV0dXJucyB0aGlzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVBbmFseXNpc1JlcG9ydF9zdHJ1Y3QgeworCWludCAJaW1hZ2VIZWlnaHQ7CisJaW50IAlpbWFnZVdpZHRoOworCWRvdWJsZSAJaW1hZ2VUaW1lc3RhbXA7CQkJCQorCWludAkJcGFydGljbGVJbmRleDsJCQkJLy8gdGhlIHBhcnRpY2xlIGluZGV4IGFuYWx5emVkCisJLyogWC1jb29yZGluYXRlIG9mIHRoZSBwb2ludCByZXByZXNlbnRpbmcgdGhlIGF2ZXJhZ2UgcG9zaXRpb24gb2YgdGhlIAorCSAqIHRvdGFsIHBhcnRpY2xlIG1hc3MsIGFzc3VtaW5nIGV2ZXJ5IHBvaW50IGluIHRoZSBwYXJ0aWNsZSBoYXMgYSBjb25zdGFudCBkZW5zaXR5ICovCisJaW50IAljZW50ZXJfbWFzc194OyAgCQkJLy8gTWVhc3VyZW1lbnRUeXBlOiBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1ggCisJLyogWS1jb29yZGluYXRlIG9mIHRoZSBwb2ludCByZXByZXNlbnRpbmcgdGhlIGF2ZXJhZ2UgcG9zaXRpb24gb2YgdGhlIAorCSAqIHRvdGFsIHBhcnRpY2xlIG1hc3MsIGFzc3VtaW5nIGV2ZXJ5IHBvaW50IGluIHRoZSBwYXJ0aWNsZSBoYXMgYSBjb25zdGFudCBkZW5zaXR5ICovCisJaW50IAljZW50ZXJfbWFzc195OyAgCQkJLy8gTWVhc3VyZW1lbnRUeXBlOiBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1kgCisJZG91YmxlIAljZW50ZXJfbWFzc194X25vcm1hbGl6ZWQ7ICAJLy9DZW50ZXIgb2YgbWFzcyB4IHZhbHVlIG5vcm1hbGl6ZWQgdG8gLTEuMCB0byArMS4wIHJhbmdlCisJZG91YmxlIAljZW50ZXJfbWFzc195X25vcm1hbGl6ZWQ7ICAJLy9DZW50ZXIgb2YgbWFzcyB5IHZhbHVlIG5vcm1hbGl6ZWQgdG8gLTEuMCB0byArMS4wIHJhbmdlCisJLyogQXJlYSBvZiB0aGUgcGFydGljbGUgKi8KKwlkb3VibGUgCXBhcnRpY2xlQXJlYTsJCQkJLy8gTWVhc3VyZW1lbnRUeXBlOiBJTUFRX01UX0FSRUEKKwkvKiBCb3VuZGluZyBSZWN0YW5nbGUgKi8KKwlSZWN0IAlib3VuZGluZ1JlY3Q7CQkJCS8vIGxlZnQvdG9wL3dpZHRoL2hlaWdodAorCS8qIFBlcmNlbnRhZ2Ugb2YgdGhlIHBhcnRpY2xlIEFyZWEgY292ZXJpbmcgdGhlIEltYWdlIEFyZWEuICovCisJZG91YmxlIAlwYXJ0aWNsZVRvSW1hZ2VQZXJjZW50OwkJLy8gTWVhc3VyZW1lbnRUeXBlOiBJTUFRX01UX0FSRUFfQllfSU1BR0VfQVJFQQorCS8qIFBlcmNlbnRhZ2Ugb2YgdGhlIHBhcnRpY2xlIEFyZWEgaW4gcmVsYXRpb24gdG8gaXRzIFBhcnRpY2xlIGFuZCBIb2xlcyBBcmVhICovCisJZG91YmxlIAlwYXJ0aWNsZVF1YWxpdHk7CQkJLy8gTWVhc3VyZW1lbnRUeXBlOiBJTUFRX01UX0FSRUFfQllfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEKK30gUGFydGljbGVBbmFseXNpc1JlcG9ydDsKKworLyoqIFRyYWNraW5nIGZ1bmN0aW9ucyByZXR1cm4gdGhpcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IENvbG9yUmVwb3J0X3N0cnVjdCB7CisJaW50CQludW1iZXJQYXJ0aWNsZXNGb3VuZDsJCQkJLy8gTnVtYmVyIG9mIHBhcnRpY2xlcyBmb3VuZCBmb3IgdGhpcyBjb2xvcgorCWludCAJbGFyZ2VzdFBhcnRpY2xlTnVtYmVyOwkJCQkvLyBUaGUgcGFydGljbGUgaW5kZXggb2YgdGhlIGxhcmdlc3QgcGFydGljbGUKKwkvKiBDb2xvciBpbmZvcm1hdGlvbiAqLworCWZsb2F0IAlwYXJ0aWNsZUh1ZU1heDsJCQkJLy8gSGlzdG9ncmFtUmVwb3J0OiBodWUgbWF4CisJZmxvYXQgCXBhcnRpY2xlSHVlTWluOwkJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IGh1ZSBtYXgKKwlmbG9hdCAJcGFydGljbGVIdWVNZWFuOwkJCS8vIEhpc3RvZ3JhbVJlcG9ydDogaHVlIG1lYW4KKwlmbG9hdCAJcGFydGljbGVTYXRNYXg7CQkJCS8vIEhpc3RvZ3JhbVJlcG9ydDogc2F0dXJhdGlvbiBtYXgKKwlmbG9hdCAJcGFydGljbGVTYXRNaW47CQkJCS8vIEhpc3RvZ3JhbVJlcG9ydDogc2F0dXJhdGlvbiBtYXgKKwlmbG9hdCAJcGFydGljbGVTYXRNZWFuOwkJCS8vIEhpc3RvZ3JhbVJlcG9ydDogc2F0dXJhdGlvbiBtZWFuCisJZmxvYXQgCXBhcnRpY2xlTHVtTWF4OwkJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IGx1bWluYW5jZSBtYXgKKwlmbG9hdCAJcGFydGljbGVMdW1NaW47CQkJCS8vIEhpc3RvZ3JhbVJlcG9ydDogbHVtaW5hbmNlICBtYXgKKwlmbG9hdCAJcGFydGljbGVMdW1NZWFuOwkJCS8vIEhpc3RvZ3JhbVJlcG9ydDogbHVtaW5hbmNlIG1lYW4KK30gQ29sb3JSZXBvcnQ7CisKKworLyogICBJbWFnZSBNYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGU6IGNhbGxzIGltYXFDcmVhdGVJbWFnZS4gQm9yZGVyIHNpemUgaXMgc2V0IHRvIHNvbWUgZGVmYXVsdCB2YWx1ZSAqLworSW1hZ2UqIGZyY0NyZWF0ZUltYWdlKCBJbWFnZVR5cGUgdHlwZSApOworCisvKiBEaXNwb3NlOiBjYWxscyBpbWFxRGlzcG9zZSAqLworaW50IGZyY0Rpc3Bvc2UoIHZvaWQqIG9iamVjdCApOworaW50IGZyY0Rpc3Bvc2UoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCAuLi4gKSA7CisKKy8qIENvcHk6IGNhbGxzIGltYXFEdXBsaWNhdGVJbWFnZSAqLworaW50IGZyY0NvcHlJbWFnZSggSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UgKTsKKworLyogSW1hZ2UgRXh0cmFjdGlvbjogQ3JvcDogY2FsbHMgaW1hcVNjYWxlICovCitpbnQgZnJjQ3JvcCggSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFJlY3QgcmVjdCApOworCisvKiBJbWFnZSBFeHRyYWN0aW9uOiBTY2FsZTogY2FsbHMgaW1hcVNjYWxlLiAgU2NhbGVzIGVudGlyZSBpbWFnZSAqLworaW50IGZyY1NjYWxlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgeFNjYWxlLCBpbnQgeVNjYWxlLCBTY2FsaW5nTW9kZSBzY2FsZU1vZGUgKTsKKworLyogUmVhZCBJbWFnZSA6IGNhbGxzIGltYXFSZWFkRmlsZSAqLworaW50IGZyY1JlYWRJbWFnZSggSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSApOworLyogV3JpdGUgSW1hZ2UgOiBjYWxscyBpbWFxV3JpdGVGaWxlICovCitpbnQgZnJjV3JpdGVJbWFnZSggY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSk7CisKKy8qICAgTWVhc3VyZSBJbnRlbnNpdHkgZnVuY3Rpb25zICovCisKKy8qIEhpc3RvZ3JhbTogY2FsbHMgaW1hcUhpc3RvZ3JhbSAqLworSGlzdG9ncmFtUmVwb3J0KiBmcmNIaXN0b2dyYW0oIGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBSZWN0IHJlY3QgKTsKKy8qIENvbG9yIEhpc3RvZ3JhbTogY2FsbHMgaW1hcUNvbG9ySGlzdG9ncmFtMiAqLworQ29sb3JIaXN0b2dyYW1SZXBvcnQqIGZyY0NvbG9ySGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIENvbG9yTW9kZSBtb2RlLCBJbWFnZSogbWFzayk7CisKKy8qIEdldCBQaXhlbCBWYWx1ZTogY2FsbHMgaW1hcUdldFBpeGVsICovCitpbnQgZnJjR2V0UGl4ZWxWYWx1ZSggY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBwaXhlbCwgUGl4ZWxWYWx1ZSogdmFsdWUgKTsKKworLyogICBQYXJ0aWNsZSBBbmFseXNpcyBmdW5jdGlvbnMgKi8KKworLyogUGFydGljbGUgRmlsdGVyOiBjYWxscyBpbWFxUGFydGljbGVGaWx0ZXIzICovCitpbnQgZnJjUGFydGljbGVGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyKiBjcml0ZXJpYSwgCisJCWludCBjcml0ZXJpYUNvdW50LCBjb25zdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnMqIG9wdGlvbnMsIFJlY3QgcmVjdCwgaW50KiBudW1QYXJ0aWNsZXMpOworaW50IGZyY1BhcnRpY2xlRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiogY3JpdGVyaWEsIAorCQlpbnQgY3JpdGVyaWFDb3VudCwgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bVBhcnRpY2xlcyk7CisvKiBNb3JwaG9sb2d5OiBjYWxscyBpbWFxTW9ycGhvbG9neSAqLworaW50IGZyY01vcnBob2xvZ3koSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE1vcnBob2xvZ3lNZXRob2QgbWV0aG9kKTsKK2ludCBmcmNNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCwgY29uc3QgU3RydWN0dXJpbmdFbGVtZW50KiBzdHJ1Y3R1cmluZ0VsZW1lbnQpOworLyogUmVqZWN0IEJvcmRlcjogY2FsbHMgaW1hcVJlamVjdEJvcmRlciAqLworaW50IGZyY1JlamVjdEJvcmRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSk7CitpbnQgZnJjUmVqZWN0Qm9yZGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgY29ubmVjdGl2aXR5OCk7CisvKiBDb3VudCBQYXJ0aWNsZXM6IGNhbGxzIGltYXFDb3VudFBhcnRpY2xlcyAqLworaW50IGZyY0NvdW50UGFydGljbGVzKEltYWdlKiBpbWFnZSwgaW50KiBudW1QYXJ0aWNsZXMpOworLyogUGFydGljbGUgQW5hbHlzaXMgUmVwb3J0OiBjYWxscyBpbWFxTWVhc3VyZVBhcnRpY2xlICovCitpbnQgZnJjUGFydGljbGVBbmFseXNpcyhJbWFnZSogaW1hZ2UsIGludCBwYXJ0aWNsZU51bWJlciwgUGFydGljbGVBbmFseXNpc1JlcG9ydCogcGFyKTsKKworLyogICBJbWFnZSBFbmhhbmNlbWVudCBmdW5jdGlvbnMgKi8KKworLyogRXF1YWxpemU6IGNhbGxzIGltYXFFcXVhbGl6ZSAqLworaW50IGZyY0VxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCBtaW4sIGZsb2F0IG1heCk7CitpbnQgZnJjRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBjb25zdCBJbWFnZSogbWFzayk7CisKKy8qIENvbG9yIEVxdWFsaXplOiBjYWxscyBpbWFxQ29sb3JFcXVhbGl6ZSAqLworaW50IGZyY0NvbG9yRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworaW50IGZyY0NvbG9yRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCBjb2xvckVxdWFsaXphdGlvbik7CisKKy8qICAgSW1hZ2UgVGhyZXNob2xkaW5nICYgQ29udmVyc2lvbiBmdW5jdGlvbnMgKi8KKworLyogU21hcnQgVGhyZXNob2xkOiBjYWxscyBpbWFxTG9jYWxUaHJlc2hvbGQgKi8KK2ludCBmcmNTbWFydFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgdW5zaWduZWQgaW50IHdpbmRvd1dpZHRoLCB1bnNpZ25lZCBpbnQgd2luZG93SGVpZ2h0LCAKKwkJTG9jYWxUaHJlc2hvbGRNZXRob2QgbWV0aG9kLCBkb3VibGUgZGV2aWF0aW9uV2VpZ2h0LCBPYmplY3RUeXBlIHR5cGUpOworaW50IGZyY1NtYXJ0VGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCB1bnNpZ25lZCBpbnQgd2luZG93V2lkdGgsIHVuc2lnbmVkIGludCB3aW5kb3dIZWlnaHQsIAorCQlMb2NhbFRocmVzaG9sZE1ldGhvZCBtZXRob2QsIGRvdWJsZSBkZXZpYXRpb25XZWlnaHQsIE9iamVjdFR5cGUgdHlwZSwgZmxvYXQgcmVwbGFjZVZhbHVlKTsKKworLyogU2ltcGxlIFRocmVzaG9sZDogY2FsbHMgaW1hcVRocmVzaG9sZCAqLworaW50IGZyY1NpbXBsZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgcmFuZ2VNaW4sIGZsb2F0IHJhbmdlTWF4LCBmbG9hdCBuZXdWYWx1ZSk7CitpbnQgZnJjU2ltcGxlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCByYW5nZU1pbiwgZmxvYXQgcmFuZ2VNYXgpOworCisvKiBDb2xvci9IdWUgVGhyZXNob2xkOiBjYWxscyBpbWFxQ29sb3JUaHJlc2hvbGQgKi8KK2ludCBmcmNDb2xvclRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgQ29sb3JNb2RlIG1vZGUsIAorCQljb25zdCBSYW5nZSogcGxhbmUxUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTJSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlKTsKK2ludCBmcmNDb2xvclRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHJlcGxhY2VWYWx1ZSwgQ29sb3JNb2RlIG1vZGUsIAorCQljb25zdCBSYW5nZSogcGxhbmUxUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTJSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlKTsKK2ludCBmcmNIdWVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IFJhbmdlKiBodWVSYW5nZSk7CitpbnQgZnJjSHVlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBSYW5nZSogaHVlUmFuZ2UsIGludCBtaW5TYXR1cmF0aW9uKTsKKworLyogRXh0cmFjdCBDb2xvckh1ZSBQbGFuZTogY2FsbHMgaW1hcUV4dHJhY3RDb2xvclBsYW5lcyAqLworaW50IGZyY0V4dHJhY3RDb2xvclBsYW5lcyhjb25zdCBJbWFnZSogaW1hZ2UsIENvbG9yTW9kZSBtb2RlLCBJbWFnZSogcGxhbmUxLCBJbWFnZSogcGxhbmUyLCBJbWFnZSogcGxhbmUzKTsKK2ludCBmcmNFeHRyYWN0SHVlUGxhbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZSogaHVlUGxhbmUpOworaW50IGZyY0V4dHJhY3RIdWVQbGFuZShjb25zdCBJbWFnZSogaW1hZ2UsIEltYWdlKiBodWVQbGFuZSwgaW50IG1pblNhdHVyYXRpb24pOworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9XUElMaWIuaCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL1dQSUxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjE4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9XUElMaWIuaApAQCAtMCwwICsxLDc3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2RlZmluZSBSRUFMCisKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgIkFEWEwzNDVfSTJDLmgiCisjaW5jbHVkZSAiQURYTDM0NV9TUEkuaCIKKyNpbmNsdWRlICJBbmFsb2dBY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJBbmFsb2dPdXRwdXQuaCIKKyNpbmNsdWRlICJBbmFsb2dQb3RlbnRpb21ldGVyLmgiCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlci5oIgorI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXJPdXRwdXQuaCIKKyNpbmNsdWRlICJCdWlsdEluQWNjZWxlcm9tZXRlci5oIgorI2luY2x1ZGUgIkNBTkphZ3Vhci5oIgorI2luY2x1ZGUgIkNBTlRhbG9uLmgiCisjaW5jbHVkZSAiQ29tcHJlc3Nvci5oIgorI2luY2x1ZGUgIkNvbnRyb2xsZXJQb3dlci5oIgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKKyNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCisjaW5jbHVkZSAiRGlnaXRhbFNvdXJjZS5oIgorI2luY2x1ZGUgIkRvdWJsZVNvbGVub2lkLmgiCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorI2luY2x1ZGUgIkVuY29kZXIuaCIKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJHZWFyVG9vdGguaCIKKyNpbmNsdWRlICJHZW5lcmljSElELmgiCisjaW5jbHVkZSAiR3lyby5oIgorI2luY2x1ZGUgImludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oIgorI2luY2x1ZGUgImludGVyZmFjZXMvUG90ZW50aW9tZXRlci5oIgorI2luY2x1ZGUgIkkyQy5oIgorI2luY2x1ZGUgIkl0ZXJhdGl2ZVJvYm90LmgiCisjaW5jbHVkZSAiSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJKYWd1YXIuaCIKKyNpbmNsdWRlICJKb3lzdGljay5oIgorI2luY2x1ZGUgIk5vdGlmaWVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisjaW5jbHVkZSAiUG93ZXJEaXN0cmlidXRpb25QYW5lbC5oIgorI2luY2x1ZGUgIlBXTS5oIgorI2luY2x1ZGUgIlJlbGF5LmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJSb2JvdEJhc2UuaCIKKyNpbmNsdWRlICJSb2JvdERyaXZlLmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlNlcnZvLmgiCisjaW5jbHVkZSAiU2FtcGxlUm9ib3QuaCIKKyNpbmNsdWRlICJTb2xlbm9pZC5oIgorI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlNQSS5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJUYWxvbi5oIgorI2luY2x1ZGUgIlRhbG9uU1JYLmgiCisjaW5jbHVkZSAiVGFzay5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiVWx0cmFzb25pYy5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJWaWN0b3IuaCIKKyNpbmNsdWRlICJWaWN0b3JTUC5oIgorI2luY2x1ZGUgIlZpc2lvbi9BeGlzQ2FtZXJhLmgiCisjaW5jbHVkZSAiVmlzaW9uL0JpbmFyeUltYWdlLmgiCisjaW5jbHVkZSAiVmlzaW9uL0NvbG9ySW1hZ2UuaCIKKyNpbmNsdWRlICJWaXNpb24vSFNMSW1hZ2UuaCIKKyNpbmNsdWRlICJWaXNpb24vSW1hZ2VCYXNlLmgiCisjaW5jbHVkZSAiVmlzaW9uL01vbm9JbWFnZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9SR0JJbWFnZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9UaHJlc2hvbGQuaCIKKy8vIFhYWDogI2luY2x1ZGUgIlZpc2lvbi9BeGlzQ2FtZXJhLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9jdHJlL0NhblRhbG9uU1JYLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9jdHJlL0NhblRhbG9uU1JYLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiZDVlNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL2N0cmUvQ2FuVGFsb25TUlguaApAQCAtMCwwICsxLDM3NCBAQAorLyoqDQorICogQGJyaWVmIENBTiBUQUxPTiBTUlggZHJpdmVyLg0KKyAqDQorICogVGhlIFRBTE9OIFNSWCBpcyBkZXNpZ25lZCB0byBpbnN0cnVtZW50IGFsbCBydW50aW1lIHNpZ25hbHMgcGVyaW9kaWNhbGx5LiAgVGhlIGRlZmF1bHQgcGVyaW9kcyBhcmUgY2hvc2VuIHRvIHN1cHBvcnQgMTYgVEFMT05zDQorICogd2l0aCAxMG1zIHVwZGF0ZSByYXRlIGZvciBjb250cm9sICh0aHJvdHRsZSBvciBzZXRwb2ludCkuICBIb3dldmVyIHRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggU2V0U3RhdHVzRnJhbWVSYXRlLiBAc2VlIFNldFN0YXR1c0ZyYW1lUmF0ZQ0KKyAqIFRoZSBnZXR0ZXJzIGZvciB0aGVzZSB1bnNvbGljaXRlZCBzaWduYWxzIGFyZSBhdXRvIGdlbmVyYXRlZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgbW9kdWxlLg0KKyAqDQorICogTGlrZXdpc2UgbW9zdCBjb250cm9sIHNpZ25hbHMgYXJlIHNlbnQgcGVyaW9kaWNhbGx5IHVzaW5nIHRoZSBmaXJlLWFuZC1mb3JnZXQgQ0FOIEFQSS4NCisgKiBUaGUgc2V0dGVycyBmb3IgdGhlc2UgdW5zb2xpY2l0ZWQgc2lnbmFscyBhcmUgYXV0byBnZW5lcmF0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG1vZHVsZS4NCisgKg0KKyAqIFNpZ25hbHMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbiB1bnNvbGljaXRlZCBmYXNoaW9uIGFyZSB0aGUgQ2xvc2UgTG9vcCBnYWlucy4NCisgKiBGb3IgdGVhbXMgdGhhdCBoYXZlIGEgc2luZ2xlIHByb2ZpbGUgZm9yIHRoZWlyIFRBTE9OIGNsb3NlIGxvb3AgdGhleSBjYW4gdXNlIGVpdGhlciB0aGUgd2VicGFnZSB0byBjb25maWd1cmUgdGhlaXIgVEFMT05zIG9uY2UNCisgKiAJb3Igc2V0IHRoZSBQSURGLEl6b25lLENsb3NlTG9vcFJhbXBSYXRlLGV0Yy4uLiBvbmNlIGluIHRoZSByb2JvdCBhcHBsaWNhdGlvbi4gIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHNhdmVkIHRvIGZsYXNoIHNvIG9uY2UgdGhleSBhcmUNCisgKiAJbG9hZGVkIGluIHRoZSBUQUxPTiwgdGhleSB3aWxsIHBlcnNpc3QgdGhyb3VnaCBwb3dlciBjeWNsZXMgYW5kIG1vZGUgY2hhbmdlcy4NCisgKg0KKyAqIEZvciB0ZWFtcyB0aGF0IGhhdmUgb25lIG9yIHR3byBwcm9maWxlcyB0byBzd2l0Y2ggYmV0d2VlbiwgdGhleSBjYW4gdXNlIHRoZSBzYW1lIHN0cmF0ZWd5IHNpbmNlIHRoZXJlIGFyZSB0d28gc2xvdHMgdG8gY2hvb3NlIGZyb20NCisgKiBhbmQgdGhlIFByb2ZpbGVTbG90U2VsZWN0IGlzIHBlcmlvZGljYWxseSBzZW50IGluIHRoZSAxMCBtcyBjb250cm9sIGZyYW1lLg0KKyAqDQorICogRm9yIHRlYW1zIHRoYXQgcmVxdWlyZSBjaGFuZ2luZyBnYWlucyBmcmVxdWVudGx5LCB0aGV5IGNhbiB1c2UgdGhlIHNvbGljaXRpbmcgQVBJIHRvIGdldCBhbmQgc2V0IHRob3NlIHBhcmFtZXRlcnMuICBNb3N0IGxpa2VseQ0KKyAqIHRoZXkgd2lsbCBvbmx5IG5lZWQgdG8gc2V0IHRoZW0gaW4gYSBwZXJpb2RpYyBmYXNoaW9uIGFzIGEgZnVuY3Rpb24gb2Ygd2hhdCBtb3Rpb24gdGhlIGFwcGxpY2F0aW9uIGlzIGF0dGVtcHRpbmcuDQorICogSWYgdGhpcyBBUEkgaXMgdXNlZCwgYmUgbWluZGZ1bCBvZiB0aGUgQ0FOIHV0aWxpemF0aW9uIHJlcG9ydGVkIGluIHRoZSBkcml2ZXIgc3RhdGlvbi4NCisgKg0KKyAqIEVuY29kZXIgcG9zaXRpb24gaXMgbWVhc3VyZWQgaW4gZW5jb2RlciBlZGdlcy4gIEV2ZXJ5IGVkZ2UgaXMgY291bnRlZCAoc2ltaWxhciB0byByb2JvUklPIDRYIG1vZGUpLg0KKyAqIEFuYWxvZyBwb3NpdGlvbiBpcyAxMCBiaXRzLCBtZWFuaW5nIDEwMjQgdGlja3MgcGVyIHJvdGF0aW9uICgwViA9PiAzLjNWKS4NCisgKiBVc2UgU2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QgdG8gc2VsZWN0IHdoaWNoIHNlbnNvciB0eXBlIHlvdSBuZWVkLiAgT25jZSB5b3UgZG8gdGhhdCB5b3UgY2FuIHVzZSBHZXRTZW5zb3JQb3NpdGlvbigpDQorICogYW5kIEdldFNlbnNvclZlbG9jaXR5KCkuICBUaGVzZSBzaWduYWxzIGFyZSB1cGRhdGVkIG9uIENBTkJ1cyBldmVyeSAyMG1zIChieSBkZWZhdWx0KS4NCisgKiBJZiBhIHJlbGF0aXZlIHNlbnNvciBpcyBzZWxlY3RlZCwgeW91IGNhbiB6ZXJvIChvciBjaGFuZ2UgdGhlIGN1cnJlbnQgdmFsdWUpIHVzaW5nIFNldFNlbnNvclBvc2l0aW9uLg0KKyAqDQorICogQW5hbG9nIElucHV0IGFuZCBxdWFkcmF0dXJlIHBvc2l0aW9uIChhbmQgdmVsb2NpdHkpIGFyZSBhbHNvIGV4cGxpY2l0bHkgcmVwb3J0ZWQgaW4gR2V0RW5jUG9zaXRpb24sIEdldEVuY1ZlbCwgR2V0QW5hbG9nSW5XaXRoT3YsIEdldEFuYWxvZ0luVmVsLg0KKyAqIFRoZXNlIHNpZ25hbHMgYXJlIGF2YWlsYWJsZSBhbGwgdGhlIHRpbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZW5zb3IgaXMgc2VsZWN0ZWQgYXQgYSByYXRlIG9mIDEwMG1zLiAgVGhpcyBhbGxvd3MgZWFzeSBpbnN0cnVtZW50YXRpb24NCisgKiBmb3IgImluIHRoZSBwaXRzIiBjaGVja2luZyBvZiBhbGwgc2Vuc29ycyByZWdhcmRsZXNzIG9mIG1vZGVzZWxlY3QuICBUaGUgMTAwbXMgcmF0ZSBpcyBvdmVycmlkYWJsZSBmb3IgdGVhbXMgd2hvIHdhbnQgdG8gYWNxdWlyZSBzZW5zb3INCisgKiBkYXRhIGZvciBwcm9jZXNzaW5nLCBub3QganVzdCBpbnN0cnVtZW50YXRpb24uICBPciBqdXN0IHNlbGVjdCB0aGUgc2Vuc29yIHVzaW5nIFNldEZlZWRiYWNrRGV2aWNlU2VsZWN0IHRvIGdldCBpdCBhdCAyMG1zLg0KKyAqDQorICogVmVsb2NpdHkgaXMgaW4gcG9zaXRpb24gdGlja3MgLyAxMDBtcy4NCisgKg0KKyAqIEFsbCBvdXRwdXQgdW5pdHMgYXJlIGluIHJlc3BlY3QgdG8gZHV0eSBjeWNsZSAodGhyb3R0bGUpIHdoaWNoIGlzIC0xMDIzKGZ1bGwgcmV2ZXJzZSkgdG8gKzEwMjMgKGZ1bGwgZm9yd2FyZCkuDQorICogIFRoaXMgaW5jbHVkZXMgZGVtYW5kICh3aGljaCBzcGVjaWZpZXMgZHV0eSBjeWNsZSB3aGVuIGluIGR1dHkgY3ljbGUgbW9kZSkgYW5kIHJhbXBSYW1wLCB3aGljaCBpcyBpbiB0aHJvdHRsZSB1bml0cyBwZXIgMTBtcyAoaWYgbm9uemVybykuDQorICoNCisgKiBQb3MgYW5kIHZlbG9jaXR5IGNsb3NlIGxvb3BzIGFyZSBjYWxjJ2QgYXMNCisgKiAJCWVyciA9IHRhcmdldCAtIHBvc09yVmVsLg0KKyAqIAkJaUVyciArPSBlcnI7DQorICogCQlpZiggICAoSVpvbmUhPTApICBhbmQgIGFicyhlcnIpID4gSVpvbmUpDQorICogCQkJQ2xlYXJJYWNjdW0oKQ0KKyAqIAkJb3V0cHV0ID0gUCBYIGVyciArIEkgWCBpRXJyICsgRCBYIGRFcnIgKyBGIFggdGFyZ2V0DQorICogCQlkRXJyID0gZXJyIC0gbGFzdEVycg0KKyAqCVAsIEksYW5kIEQgZ2FpbnMgYXJlIGFsd2F5cyBwb3NpdGl2ZS4gRiBjYW4gYmUgbmVnYXRpdmUuDQorICoJTW90b3IgZGlyZWN0aW9uIGNhbiBiZSByZXZlcnNlZCB1c2luZyBTZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbiBpZiBzZW5zb3IgYW5kIG1vdG9yIGFyZSBvdXQgb2YgcGhhc2UuDQorICoJU2ltaWxhcmx5IGZlZWRiYWNrIHNlbnNvciBjYW4gYWxzbyBiZSByZXZlcnNlZCAobXVsdGlwbGllZCBieSAtMSkgaWYgeW91IHByZWZlciB0aGUgc2Vuc29yIHRvIGJlIGludmVydGVkLg0KKyAqDQorICogUCBnYWluIGlzIHNwZWNpZmllZCBpbiB0aHJvdHRsZSBwZXIgZXJyb3IgdGljay4gIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwMiBpcyB+OS45JSAod2hpY2ggaXMgMTAyLzEwMjMpIHRocm90dGxlIHBlciAxDQorICogCQlBREMgdW5pdCgxMGJpdCkgb3IgMSBxdWFkcmF0dXJlIGVuY29kZXIgZWRnZSBkZXBlbmRpbmcgb24gc2VsZWN0ZWQgc2Vuc29yLg0KKyAqDQorICogSSBnYWluIGlzIHNwZWNpZmllZCBpbiB0aHJvdHRsZSBwZXIgaW50ZWdyYXRlZCBlcnJvci4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMTAgZXF1YXRlcyB0byB+MC45OSUgKHdoaWNoIGlzIDEwLzEwMjMpDQorICogIAlmb3IgZWFjaCBhY2N1bXVsYXRlZCBBREMgdW5pdCgxMGJpdCkgb3IgMSBxdWFkcmF0dXJlIGVuY29kZXIgZWRnZSBkZXBlbmRpbmcgb24gc2VsZWN0ZWQgc2Vuc29yLg0KKyAqICAJQ2xvc2UgbG9vcCBhbmQgaW50ZWdyYWwgYWNjdW11bGF0b3IgcnVucyBldmVyeSAxbXMuDQorICoNCisgKiBEIGdhaW4gaXMgc3BlY2lmaWVkIGluIHRocm90dGxlIHBlciBkZXJpdmF0aXZlIGVycm9yLiBGb3IgZXhhbXBsZSBhIHZhbHVlIG9mIDEwMiBlcXVhdGVzIHRvIH45LjklICh3aGljaCBpcyAxMDIvMTAyMykNCisgKiAJcGVyIGNoYW5nZSBvZiAxIHVuaXQgKEFEQyBvciBlbmNvZGVyKSBwZXIgbXMuDQorICoNCisgKiBJIFpvbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBzYW1lIHVuaXRzIGFzIHNlbnNvciBwb3NpdGlvbiAoQURDIHVuaXRzIG9yIHF1YWRyYXR1cmUgZWRnZXMpLiAgSWYgcG9zL3ZlbCBlcnJvciBpcyBvdXRzaWRlIG9mDQorICogCQl0aGlzIHZhbHVlLCB0aGUgaW50ZWdyYXRlZCBlcnJvciB3aWxsIGF1dG8tY2xlYXIuLi4NCisgKiAJCWlmKCAgIChJWm9uZSE9MCkgIGFuZCAgYWJzKGVycikgPiBJWm9uZSkNCisgKiAJCQlDbGVhcklhY2N1bSgpDQorICogCQkuLi50aGlzIGlzIHZlcnkgdXNlZnVsIGluIHByZXZlbnRpbmcgaW50ZWdyYWwgd2luZHVwIGFuZCBpcyBoaWdobHkgcmVjb21tZW5kZWQgaWYgdXNpbmcgZnVsbCBQSUQgdG8ga2VlcCBzdGFiaWxpdHkgbG93Lg0KKyAqDQorICogQ2xvc2VMb29wUmFtcFJhdGUgaXMgaW4gdGhyb3R0bGUgdW5pdHMgcGVyIDFtcy4gIFNldCB0byB6ZXJvIHRvIGRpc2FibGUgcmFtcGluZy4NCisgKiAJCVdvcmtzIHRoZSBzYW1lIGFzIFJhbXBUaHJvdHRsZSBidXQgb25seSBpcyBpbiBlZmZlY3Qgd2hlbiBhIGNsb3NlIGxvb3AgbW9kZSBhbmQgcHJvZmlsZSBzbG90IGlzIHNlbGVjdGVkLg0KKyAqDQorICogYXV0byBnZW5lcmF0ZWQgdXNpbmcgc3ByZWFkc2hlZXQgYW5kIFdwaUNsYXNzR2VuLmNzcHJvag0KKyAqIEBsaW5rIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFPVV9aVjdmWkxHWVVRLVVoYzhzVkFtVW1XVGxUOFhCRllLOGxmamdfdGFjL2VkaXQjZ2lkPTE3NjYwNDY5NjcNCisgKi8NCisjaWZuZGVmIENhblRhbG9uU1JYX0hfDQorI2RlZmluZSBDYW5UYWxvblNSWF9IXw0KKyNpbmNsdWRlICJjdHJlLmgiCQkJCS8vQklUIERlZmluZXMgKyBUeXBlZGVmcw0KKyNpbmNsdWRlICJDdHJlQ2FuTm9kZS5oIg0KKyNpbmNsdWRlIDxOZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4Lmg+CS8vQ0FOIENvbW0NCisjaW5jbHVkZSA8bWFwPg0KK2NsYXNzIENhblRhbG9uU1JYIDogcHVibGljIEN0cmVDYW5Ob2RlDQorew0KK3ByaXZhdGU6DQorDQorCS8qKiBqdXN0IGluIGNhc2UgdXNlciB3YW50cyB0byBtb2RpZnkgcGVyaW9kcyBvZiBjZXJ0YWluIHN0YXR1cyBmcmFtZXMuDQorCSAqIAlEZWZhdWx0IHRoZSB2YXJzIHRvIG1hdGNoIHRoZSBmaXJtd2FyZSBkZWZhdWx0LiAqLw0KKwl1aW50MzJfdCBfc3RhdHVzUmF0ZU1zWzRdOw0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVmFycyBmb3Igb3BlbmluZyBhIENBTiBzdHJlYW0gaWYgY2FsbGVyIG5lZWRzIHNpZ25hbHMgdGhhdCByZXF1aXJlIHNvbGljaXRpbmcgKi8NCisJdWludDMyX3QgX2Nhbl9oOyAJLy8hPCBTZXNzaW9uIGhhbmRsZSBmb3IgY2F0Y2hpbmcgcmVzcG9uc2UgcGFyYW1zLg0KKwlpbnQzMl90IF9jYW5fc3RhdDsgLy8hPCBTZXNzaW9uIGhhbmRsZSBzdGF0dXMuDQorCXN0cnVjdCB0Q0FOU3RyZWFtTWVzc2FnZSBfbXNnQnVmZlsyMF07DQorCXN0YXRpYyBpbnQgY29uc3Qga01zZ0NhcGFjaXR5CT0gMjA7DQorCXR5cGVkZWYgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBzaWdzX3Q7DQorCXNpZ3NfdCBfc2lnczsgLy8hPCBDYXRjaGVzIHNpZ25hbCB1cGRhdGVzIHRoYXQgYXJlIHNvbGljaXRlZC4gIEV4cGVjdCB0aGlzIHRvIGJlIHZlcnkgZmV3Lg0KKwl2b2lkIE9wZW5TZXNzaW9uSWZOZWVkQmUoKTsNCisJdm9pZCBQcm9jZXNzU3RyZWFtTWVzc2FnZXMoKTsNCisJLyoqDQorCSAqIFNlbmQgYSBvbmUgc2hvdCBmcmFtZSB0byBzZXQgYW4gYXJiaXRyYXJ5IHNpZ25hbC4NCisJICogTW9zdCBzaWduYWxzIGFyZSBpbiB0aGUgY29udHJvbCBmcmFtZSBzbyBhdm9pZCB1c2luZyB0aGlzIEFQSSB1bmxlc3MgeW91IGhhdmUgdG8uDQorCSAqIFVzZSB0aGlzIGFwaSBmb3IuLi4NCisJICogLUEgbW90b3IgY29udHJvbGxlciBwcm9maWxlIHNpZ25hbCBlUHJvZmlsZVBhcmFtX1hYWHMuICBUaGVzZSBhcmUgYmFja2VkIHVwIGluIGZsYXNoLiAgSWYgeW91IGFyZSBnYWluLXNjaGVkdWxpbmcgdGhlbiBjYWxsIHRoaXMgcGVyaW9kaWNhbGx5Lg0KKwkgKiAtRGVmYXVsdCBicmFrZSBhbmQgbGltaXQgc3dpdGNoIHNpZ25hbHMuLi4gZU9uQm9vdF9YWFhzLiAgQXZvaWQgZG9pbmcgdGhpcywgdXNlIHRoZSBvdmVycmlkZSBzaWduYWxzIGluIHRoZSBjb250cm9sIGZyYW1lLg0KKwkgKiBUYWxvbiB3aWxsIGF1dG9tYXRpY2FsbHkgc2VuZCBhIFBBUkFNX1JFU1BPTlNFIGFmdGVyIHRoZSBzZXQsIHNvIEdldFBhcmFtUmVzcG9uc2Ugd2lsbCBjYXRjaCB0aGUgbGF0ZXN0IHZhbHVlIGFmdGVyIGEgY291cGxlIG1zLg0KKwkgKi8NCisJQ1RSX0NvZGUgU2V0UGFyYW1SYXcodWludDMyX3QgcGFyYW1FbnVtLCBpbnQzMl90IHJhd0JpdHMpOw0KKwkvKioNCisJICogQ2hlY2tzIGNhY2hlZCBDQU4gZnJhbWVzIGFuZCB1cGRhdGluZyBzb2xpY2l0ZWQgc2lnbmFscy4NCisJICovDQorCUNUUl9Db2RlIEdldFBhcmFtUmVzcG9uc2VSYXcodWludDMyX3QgcGFyYW1FbnVtLCBpbnQzMl90ICYgcmF3Qml0cyk7DQorcHVibGljOg0KKwlzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0Q29udHJvbFBlcmlvZE1zID0gMTA7IC8vITwgZGVmYXVsdCBjb250cm9sIHVwZGF0ZSByYXRlIGlzIDEwbXMuDQorCUNhblRhbG9uU1JYKGludCBkZXZpY2VOdW1iZXIgPSAwLGludCBjb250cm9sUGVyaW9kTXMgPSBrRGVmYXVsdENvbnRyb2xQZXJpb2RNcyk7DQorCX5DYW5UYWxvblNSWCgpOw0KKwl2b2lkIFNldChkb3VibGUgdmFsdWUpOw0KKwkvKiBtb2RlIHNlbGVjdCBlbnVtZXJhdGlvbnMgKi8NCisJc3RhdGljIGNvbnN0IGludCBrTW9kZV9EdXR5Q3ljbGUgPSAwOyAvLyE8IERlbWFuZCBpcyAxMWJpdCBzaWduZWQgZHV0eSBjeWNsZSBbLTEwMjMsMTAyM10uDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfUG9zaXRpb25DbG9zZUxvb3AgPSAxOyAvLyE8IFBvc2l0aW9uIFBJREYuDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfVmVsb2NpdHlDbG9zZUxvb3AgPSAyOyAvLyE8IFZlbG9jaXR5IFBJREYuDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfQ3VycmVudENsb3NlTG9vcCA9IDM7IC8vITwgQ3VycmVudCBjbG9zZSBsb29wIC0gbm90IGRvbmUuDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfVm9sdENvbXBlbiA9IDQ7IC8vITwgVm9sdGFnZSBDb21wZW5zYXRpb24gTW9kZSAtIG5vdCBkb25lLiAgRGVtYW5kIGlzIGZpeGVkIHB0IHRhcmdldCA4Ljggdm9sdHMuDQorCXN0YXRpYyBjb25zdCBpbnQga01vZGVfU2xhdmVGb2xsb3dlciA9IDU7IC8vITwgRGVtYW5kIGlzIHRoZSA2IGJpdCBEZXZpY2UgSUQgb2YgdGhlICdtYXN0ZXInIFRBTE9OIFNSWC4NCisJc3RhdGljIGNvbnN0IGludCBrTW9kZV9Ob0RyaXZlID0gMTU7IC8vITwgWmVybyB0aGUgb3V0cHV0IChob25vcnMgYnJha2UvY29hc3QpIHJlZ2FyZGxlc3Mgb2YgZGVtYW5kLiAgTWlnaHQgYmUgdXNlZnVsIGlmIHdlIG5lZWQgdG8gY2hhbmdlIG1vZGVzIGJ1dCBjYW4ndCBhdG9taWNhbGx5IGNoYW5nZSBhbGwgdGhlIHNpZ25hbHMgd2Ugd2FudCBpbiBiZXR3ZWVuLg0KKwkvKiBsaW1pdCBzd2l0Y2ggZW51bWVyYXRpb25zICovDQorCXN0YXRpYyBjb25zdCBpbnQga0xpbWl0U3dpdGNoT3ZlcnJpZGVfVXNlRGVmYXVsdHNGcm9tRmxhc2ggPSAxOw0KKwlzdGF0aWMgY29uc3QgaW50IGtMaW1pdFN3aXRjaE92ZXJyaWRlX0Rpc2FibGVGd2RfRGlzYWJsZVJldiA9IDQ7DQorCXN0YXRpYyBjb25zdCBpbnQga0xpbWl0U3dpdGNoT3ZlcnJpZGVfRGlzYWJsZUZ3ZF9FbmFibGVSZXYgPSA1Ow0KKwlzdGF0aWMgY29uc3QgaW50IGtMaW1pdFN3aXRjaE92ZXJyaWRlX0VuYWJsZUZ3ZF9EaXNhYmxlUmV2ID0gNjsNCisJc3RhdGljIGNvbnN0IGludCBrTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRW5hYmxlUmV2ID0gNzsNCisJLyogYnJha2Ugb3ZlcnJpZGUgZW51bWVyYXRpb25zICovDQorCXN0YXRpYyBjb25zdCBpbnQga0JyYWtlT3ZlcnJpZGVfVXNlRGVmYXVsdHNGcm9tRmxhc2ggPSAwOw0KKwlzdGF0aWMgY29uc3QgaW50IGtCcmFrZU92ZXJyaWRlX092ZXJyaWRlQ29hc3QgPSAxOw0KKwlzdGF0aWMgY29uc3QgaW50IGtCcmFrZU92ZXJyaWRlX092ZXJyaWRlQnJha2UgPSAyOw0KKwkvKiBmZWVkYmFjayBkZXZpY2UgZW51bWVyYXRpb25zICovDQorCXN0YXRpYyBjb25zdCBpbnQga0ZlZWRiYWNrRGV2X0RpZ2l0YWxRdWFkRW5jPTA7DQorCXN0YXRpYyBjb25zdCBpbnQga0ZlZWRiYWNrRGV2X0FuYWxvZ1BvdD0yOw0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9BbmFsb2dFbmNvZGVyPTM7DQorCXN0YXRpYyBjb25zdCBpbnQga0ZlZWRiYWNrRGV2X0NvdW50RXZlcnlSaXNpbmdFZGdlPTQ7DQorCXN0YXRpYyBjb25zdCBpbnQga0ZlZWRiYWNrRGV2X0NvdW50RXZlcnlGYWxsaW5nRWRnZT01Ow0KKwlzdGF0aWMgY29uc3QgaW50IGtGZWVkYmFja0Rldl9Qb3NJc1B1bHNlV2lkdGg9ODsNCisJLyogUHJvZmlsZVNsb3RTZWxlY3QgZW51bWVyYXRpb25zKi8NCisJc3RhdGljIGNvbnN0IGludCBrUHJvZmlsZVNsb3RTZWxlY3RfU2xvdDAgPSAwOw0KKwlzdGF0aWMgY29uc3QgaW50IGtQcm9maWxlU2xvdFNlbGVjdF9TbG90MSA9IDE7DQorICAgIC8qIHN0YXR1cyBmcmFtZSByYXRlIHR5cGVzICovDQorICAgIHN0YXRpYyBjb25zdCBpbnQga1N0YXR1c0ZyYW1lX0dlbmVyYWwgPSAwOw0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTdGF0dXNGcmFtZV9GZWVkYmFjayA9IDE7DQorICAgIHN0YXRpYyBjb25zdCBpbnQga1N0YXR1c0ZyYW1lX0VuY29kZXIgPSAyOw0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTdGF0dXNGcmFtZV9BbmFsb2dUZW1wVmJhdCA9IDM7DQorCS8qKg0KKwkgKiBTaWduYWwgZW51bWVyYXRpb24gZm9yIGdlbmVyaWMgc2lnbmFsIGFjY2Vzcy4NCisJICogQWx0aG91Z2ggZXZlcnkgc2lnbmFsIGlzIGVudW1lcmF0ZWQsIG9ubHkgdXNlIHRoaXMgZm9yIHRyYWZmaWMgdGhhdCBtdXN0IGJlIHNvbGljaXRlZC4NCisJICogVXNlIHRoZSBhdXRvIGdlbmVyYXRlZCBnZXR0ZXJzL3NldHRlcnMgYXQgYm90dG9tIG9mIHRoaXMgaGVhZGVyIGFzIG11Y2ggYXMgcG9zc2libGUuDQorCSAqLw0KKwl0eXBlZGVmIGVudW0gX3BhcmFtX3R7DQorCQllUHJvZmlsZVBhcmFtU2xvdDBfUD0xLA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX0k9MiwNCisJCWVQcm9maWxlUGFyYW1TbG90MF9EPTMsDQorCQllUHJvZmlsZVBhcmFtU2xvdDBfRj00LA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QwX0lab25lPTUsDQorCQllUHJvZmlsZVBhcmFtU2xvdDBfQ2xvc2VMb29wUmFtcFJhdGU9NiwNCisJCWVQcm9maWxlUGFyYW1TbG90MV9QPTExLA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QxX0k9MTIsDQorCQllUHJvZmlsZVBhcmFtU2xvdDFfRD0xMywNCisJCWVQcm9maWxlUGFyYW1TbG90MV9GPTE0LA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QxX0lab25lPTE1LA0KKwkJZVByb2ZpbGVQYXJhbVNsb3QxX0Nsb3NlTG9vcFJhbXBSYXRlPTE2LA0KKwkJZVByb2ZpbGVQYXJhbVNvZnRMaW1pdEZvclRocmVzaG9sZD0yMSwNCisJCWVQcm9maWxlUGFyYW1Tb2Z0TGltaXRSZXZUaHJlc2hvbGQ9MjIsDQorCQllUHJvZmlsZVBhcmFtU29mdExpbWl0Rm9yRW5hYmxlPTIzLA0KKwkJZVByb2ZpbGVQYXJhbVNvZnRMaW1pdFJldkVuYWJsZT0yNCwNCisJCWVPbkJvb3RfQnJha2VNb2RlPTMxLA0KKwkJZU9uQm9vdF9MaW1pdFN3aXRjaF9Gb3J3YXJkX05vcm1hbGx5Q2xvc2VkPTMyLA0KKwkJZU9uQm9vdF9MaW1pdFN3aXRjaF9SZXZlcnNlX05vcm1hbGx5Q2xvc2VkPTMzLA0KKwkJZU9uQm9vdF9MaW1pdFN3aXRjaF9Gb3J3YXJkX0Rpc2FibGU9MzQsDQorCQllT25Cb290X0xpbWl0U3dpdGNoX1JldmVyc2VfRGlzYWJsZT0zNSwNCisJCWVGYXVsdF9PdmVyVGVtcD00MSwNCisJCWVGYXVsdF9VbmRlclZvbHRhZ2U9NDIsDQorCQllRmF1bHRfRm9yTGltPTQzLA0KKwkJZUZhdWx0X1JldkxpbT00NCwNCisJCWVGYXVsdF9IYXJkd2FyZUZhaWx1cmU9NDUsDQorCQllRmF1bHRfRm9yU29mdExpbT00NiwNCisJCWVGYXVsdF9SZXZTb2Z0TGltPTQ3LA0KKwkJZVN0Y2t5RmF1bHRfT3ZlclRlbXA9NDgsDQorCQllU3Rja3lGYXVsdF9VbmRlclZvbHRhZ2U9NDksDQorCQllU3Rja3lGYXVsdF9Gb3JMaW09NTAsDQorCQllU3Rja3lGYXVsdF9SZXZMaW09NTEsDQorCQllU3Rja3lGYXVsdF9Gb3JTb2Z0TGltPTUyLA0KKwkJZVN0Y2t5RmF1bHRfUmV2U29mdExpbT01MywNCisJCWVBcHBsaWVkVGhyb3R0bGU9NjEsDQorCQllQ2xvc2VMb29wRXJyPTYyLA0KKwkJZUZlZWRiYWNrRGV2aWNlU2VsZWN0PTYzLA0KKwkJZVJldk1vdER1cmluZ0Nsb3NlTG9vcEVuPTY0LA0KKwkJZU1vZGVTZWxlY3Q9NjUsDQorCQllUHJvZmlsZVNsb3RTZWxlY3Q9NjYsDQorCQllUmFtcFRocm90dGxlPTY3LA0KKwkJZVJldkZlZWRiYWNrU2Vuc29yPTY4LA0KKwkJZUxpbWl0U3dpdGNoRW49NjksDQorCQllTGltaXRTd2l0Y2hDbG9zZWRGb3I9NzAsDQorCQllTGltaXRTd2l0Y2hDbG9zZWRSZXY9NzEsDQorCQllU2Vuc29yUG9zaXRpb249NzMsDQorCQllU2Vuc29yVmVsb2NpdHk9NzQsDQorCQllQ3VycmVudD03NSwNCisJCWVCcmFrZUlzRW5hYmxlZD03NiwNCisJCWVFbmNQb3NpdGlvbj03NywNCisJCWVFbmNWZWw9NzgsDQorCQllRW5jSW5kZXhSaXNlRXZlbnRzPTc5LA0KKwkJZVF1YWRBcGluPTgwLA0KKwkJZVF1YWRCcGluPTgxLA0KKwkJZVF1YWRJZHhwaW49ODIsDQorCQllQW5hbG9nSW5XaXRoT3Y9ODMsDQorCQllQW5hbG9nSW5WZWw9ODQsDQorCQllVGVtcD04NSwNCisJCWVCYXR0ZXJ5Vj04NiwNCisJCWVSZXNldENvdW50PTg3LA0KKwkJZVJlc2V0RmxhZ3M9ODgsDQorCQllRmlybVZlcnM9ODksDQorCQllU2V0dGluZ3NDaGFuZ2VkPTkwLA0KKwkJZVF1YWRGaWx0ZXJFbj05MSwJDQorCQllUGlkSWFjY3VtPTkzLA0KKwl9cGFyYW1fdDsNCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1zZXR0ZXJzIGFuZCBnZXR0ZXJzIHRoYXQgdXNlIHRoZSBzb2xpY2F0ZWQgcGFyYW0gcmVxdWVzdC9yZXNwb25zZS0tLS0tLS0tLS0tLS0qLy8qKg0KKyAgICAgKiBTZW5kIGEgb25lIHNob3QgZnJhbWUgdG8gc2V0IGFuIGFyYml0cmFyeSBzaWduYWwuDQorICAgICAqIE1vc3Qgc2lnbmFscyBhcmUgaW4gdGhlIGNvbnRyb2wgZnJhbWUgc28gYXZvaWQgdXNpbmcgdGhpcyBBUEkgdW5sZXNzIHlvdSBoYXZlIHRvLg0KKyAgICAgKiBVc2UgdGhpcyBhcGkgZm9yLi4uDQorICAgICAqIC1BIG1vdG9yIGNvbnRyb2xsZXIgcHJvZmlsZSBzaWduYWwgZVByb2ZpbGVQYXJhbV9YWFhzLiAgVGhlc2UgYXJlIGJhY2tlZCB1cCBpbiBmbGFzaC4gIElmIHlvdSBhcmUgZ2Fpbi1zY2hlZHVsaW5nIHRoZW4gY2FsbCB0aGlzIHBlcmlvZGljYWxseS4NCisgICAgICogLURlZmF1bHQgYnJha2UgYW5kIGxpbWl0IHN3aXRjaCBzaWduYWxzLi4uIGVPbkJvb3RfWFhYcy4gIEF2b2lkIGRvaW5nIHRoaXMsIHVzZSB0aGUgb3ZlcnJpZGUgc2lnbmFscyBpbiB0aGUgY29udHJvbCBmcmFtZS4NCisgICAgICogVGFsb24gd2lsbCBhdXRvbWF0aWNhbGx5IHNlbmQgYSBQQVJBTV9SRVNQT05TRSBhZnRlciB0aGUgc2V0LCBzbyBHZXRQYXJhbVJlc3BvbnNlIHdpbGwgY2F0Y2ggdGhlIGxhdGVzdCB2YWx1ZSBhZnRlciBhIGNvdXBsZSBtcy4NCisgICAgICovDQorCUNUUl9Db2RlIFNldFBhcmFtKHBhcmFtX3QgcGFyYW1FbnVtLCBkb3VibGUgdmFsdWUpOw0KKwkvKioNCisJICogQXNrcyBUQUxPTiB0byBpbW1lZGlldGVseSByZXNwb25kIHdpdGggc2lnbmFsIHZhbHVlLiAgVGhpcyBBUEkgaXMgb25seSB1c2VkIGZvciBzaWduYWxzIHRoYXQgYXJlIG5vdCBzZW50IHBlcmlvZGljYWxseS4NCisJICogVGhpcyBjYW4gYmUgdXNlZnVsIGZvciByZWFkaW5nIHBhcmFtcyB0aGF0IHJhcmVseSBjaGFuZ2UgbGlrZSBMaW1pdCBTd2l0Y2ggc2V0dGluZ3MgYW5kIFBJREYgdmFsdWVzLg0KKwkgICogQHBhcmFtIHBhcmFtIHRvIHJlcXVlc3QuDQorCSAqLw0KKwlDVFJfQ29kZSBSZXF1ZXN0UGFyYW0ocGFyYW1fdCBwYXJhbUVudW0pOw0KKwlDVFJfQ29kZSBHZXRQYXJhbVJlc3BvbnNlKHBhcmFtX3QgcGFyYW1FbnVtLCBkb3VibGUgJiB2YWx1ZSk7DQorCUNUUl9Db2RlIEdldFBhcmFtUmVzcG9uc2VJbnQzMihwYXJhbV90IHBhcmFtRW51bSwgaW50ICYgdmFsdWUpOw0KKyAgICAvKi0tLS0tIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCB1c2UgcGFyYW0gcmVxdWVzdC9yZXNwb25zZS4gVGhlc2Ugc2lnbmFscyBhcmUgYmFja2VkIHVwIGluIGZsYXNoIGFuZCB3aWxsIHN1cnZpdmUgYSBwb3dlciBjeWNsZS4gLS0tLS0tLS0tKi8NCisJLyotLS0tLSBJZiB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIGNoYW5naW5nIHRoZXNlIHZhbHVlcyBjb25zaWRlciB1c2luZyBib3RoIHNsb3RzIGFuZCBzd2l0Y2ggYmV0d2VlbiBzbG90MCA8PT4gc2xvdDEuIC0tLS0tLS0tLS0tLS0tLS0tLSovDQorCS8qLS0tLS0gSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBjaGFuZ2luZyB0aGVzZSBzaWduYWxzIGZyZXF1ZW50bHkgdGhlbiBpdCBtYWtlcyBzZW5zZSB0byBsZXZlcmFnZSB0aGlzIEFQSS4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkvKi0tLS0tIEdldHRlcnMgZG9uJ3QgYmxvY2ssIHNvIGl0IG1heSByZXF1aXJlIHNldmVyYWwgY2FsbHMgdG8gZ2V0IHRoZSBsYXRlc3QgdmFsdWUuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJQ1RSX0NvZGUgU2V0UGdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgZ2Fpbik7DQorCUNUUl9Db2RlIFNldElnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlIGdhaW4pOw0KKwlDVFJfQ29kZSBTZXREZ2Fpbih1bnNpZ25lZCBzbG90SWR4LGRvdWJsZSBnYWluKTsNCisJQ1RSX0NvZGUgU2V0RmdhaW4odW5zaWduZWQgc2xvdElkeCxkb3VibGUgZ2Fpbik7DQorCUNUUl9Db2RlIFNldEl6b25lKHVuc2lnbmVkIHNsb3RJZHgsaW50IHpvbmUpOw0KKwlDVFJfQ29kZSBTZXRDbG9zZUxvb3BSYW1wUmF0ZSh1bnNpZ25lZCBzbG90SWR4LGludCBjbG9zZUxvb3BSYW1wUmF0ZSk7DQorCUNUUl9Db2RlIFNldFNlbnNvclBvc2l0aW9uKGludCBwb3MpOw0KKwlDVFJfQ29kZSBTZXRGb3J3YXJkU29mdExpbWl0KGludCBmb3J3YXJkTGltaXQpOw0KKwlDVFJfQ29kZSBTZXRSZXZlcnNlU29mdExpbWl0KGludCByZXZlcnNlTGltaXQpOw0KKwlDVFJfQ29kZSBTZXRGb3J3YXJkU29mdEVuYWJsZShpbnQgZW5hYmxlKTsNCisJQ1RSX0NvZGUgU2V0UmV2ZXJzZVNvZnRFbmFibGUoaW50IGVuYWJsZSk7DQorCUNUUl9Db2RlIEdldFBnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlICYgZ2Fpbik7DQorCUNUUl9Db2RlIEdldElnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlICYgZ2Fpbik7DQorCUNUUl9Db2RlIEdldERnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlICYgZ2Fpbik7DQorCUNUUl9Db2RlIEdldEZnYWluKHVuc2lnbmVkIHNsb3RJZHgsZG91YmxlICYgZ2Fpbik7DQorCUNUUl9Db2RlIEdldEl6b25lKHVuc2lnbmVkIHNsb3RJZHgsaW50ICYgem9uZSk7DQorCUNUUl9Db2RlIEdldENsb3NlTG9vcFJhbXBSYXRlKHVuc2lnbmVkIHNsb3RJZHgsaW50ICYgY2xvc2VMb29wUmFtcFJhdGUpOw0KKwlDVFJfQ29kZSBHZXRGb3J3YXJkU29mdExpbWl0KGludCAmIGZvcndhcmRMaW1pdCk7DQorCUNUUl9Db2RlIEdldFJldmVyc2VTb2Z0TGltaXQoaW50ICYgcmV2ZXJzZUxpbWl0KTsNCisJQ1RSX0NvZGUgR2V0Rm9yd2FyZFNvZnRFbmFibGUoaW50ICYgZW5hYmxlKTsNCisJQ1RSX0NvZGUgR2V0UmV2ZXJzZVNvZnRFbmFibGUoaW50ICYgZW5hYmxlKTsNCisJLyoqDQorCSAqIENoYW5nZSB0aGUgcGVyaW9kTXMgb2YgYSBUQUxPTidzIHN0YXR1cyBmcmFtZS4gIFNlZSBrU3RhdHVzRnJhbWVfKiBlbnVtcyBmb3Igd2hhdCdzIGF2YWlsYWJsZS4NCisJICovDQorCUNUUl9Db2RlIFNldFN0YXR1c0ZyYW1lUmF0ZSh1bnNpZ25lZCBmcmFtZUVudW0sIHVuc2lnbmVkIHBlcmlvZE1zKTsNCisJLyoqDQorCSAqIENsZWFyIGFsbCBzdGlja3kgZmF1bHRzIGluIFRBTE9OLg0KKwkgKi8NCisJQ1RSX0NvZGUgQ2xlYXJTdGlja3lGYXVsdHMoKTsNCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXV0byBnZW5lcmF0ZWQuICBUaGlzIEFQSSBpcyBvcHRpbWFsIHNpbmNlIGl0IHVzZXMgdGhlIGZpcmUtYW5kLWZvcmdldCBDQU4gaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGVzZSBzaWduYWxzIHNob3VsZCBjb3ZlciB0aGUgbWFqb3JpdHkgb2YgYWxsIHVzZSBjYXNlcy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCUNUUl9Db2RlIEdldEZhdWx0X092ZXJUZW1wKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9VbmRlclZvbHRhZ2UoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZhdWx0X0ZvckxpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmF1bHRfUmV2TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRGYXVsdF9IYXJkd2FyZUZhaWx1cmUoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZhdWx0X0ZvclNvZnRMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZhdWx0X1JldlNvZnRMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFN0Y2t5RmF1bHRfT3ZlclRlbXAoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRTdGNreUZhdWx0X0ZvckxpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U3Rja3lGYXVsdF9SZXZMaW0oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFN0Y2t5RmF1bHRfRm9yU29mdExpbShpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U3Rja3lGYXVsdF9SZXZTb2Z0TGltKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRBcHBsaWVkVGhyb3R0bGUoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldENsb3NlTG9vcEVycihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RmVlZGJhY2tEZXZpY2VTZWxlY3QoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldE1vZGVTZWxlY3QoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldExpbWl0U3dpdGNoRW4oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldExpbWl0U3dpdGNoQ2xvc2VkRm9yKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRMaW1pdFN3aXRjaENsb3NlZFJldihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0U2Vuc29yUG9zaXRpb24oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFNlbnNvclZlbG9jaXR5KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRDdXJyZW50KGRvdWJsZSAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRCcmFrZUlzRW5hYmxlZChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RW5jUG9zaXRpb24oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEVuY1ZlbChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0RW5jSW5kZXhSaXNlRXZlbnRzKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRRdWFkQXBpbihpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0UXVhZEJwaW4oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFF1YWRJZHhwaW4oaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEFuYWxvZ0luV2l0aE92KGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBHZXRBbmFsb2dJblZlbChpbnQgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0VGVtcChkb3VibGUgJnBhcmFtKTsNCisJQ1RSX0NvZGUgR2V0QmF0dGVyeVYoZG91YmxlICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFJlc2V0Q291bnQoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldFJlc2V0RmxhZ3MoaW50ICZwYXJhbSk7DQorCUNUUl9Db2RlIEdldEZpcm1WZXJzKGludCAmcGFyYW0pOw0KKwlDVFJfQ29kZSBTZXREZW1hbmQoaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldEZlZWRiYWNrRGV2aWNlU2VsZWN0KGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldFJldk1vdER1cmluZ0Nsb3NlTG9vcEVuKGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldE92ZXJyaWRlQnJha2VUeXBlKGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldE1vZGVTZWxlY3QoaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0TW9kZVNlbGVjdChpbnQgbW9kZVNlbGVjdCxpbnQgZGVtYW5kKTsNCisJQ1RSX0NvZGUgU2V0UHJvZmlsZVNsb3RTZWxlY3QoaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgU2V0UmFtcFRocm90dGxlKGludCBwYXJhbSk7DQorCUNUUl9Db2RlIFNldFJldkZlZWRiYWNrU2Vuc29yKGludCBwYXJhbSk7DQorfTsNCitleHRlcm4gIkMiIHsNCisJdm9pZCAqY19UYWxvblNSWF9DcmVhdGUoaW50IGRldmljZU51bWJlciwgaW50IGNvbnRyb2xQZXJpb2RNcyk7DQorCXZvaWQgY19UYWxvblNSWF9EZXN0cm95KHZvaWQgKmhhbmRsZSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0UGFyYW0odm9pZCAqaGFuZGxlLCBpbnQgcGFyYW1FbnVtLCBkb3VibGUgdmFsdWUpOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1JlcXVlc3RQYXJhbSh2b2lkICpoYW5kbGUsIGludCBwYXJhbUVudW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFBhcmFtUmVzcG9uc2Uodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW1FbnVtLCBkb3VibGUgKnZhbHVlKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRQYXJhbVJlc3BvbnNlSW50MzIodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW1FbnVtLCBpbnQgKnZhbHVlKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRTdGF0dXNGcmFtZVJhdGUodm9pZCAqaGFuZGxlLCB1bnNpZ25lZCBmcmFtZUVudW0sIHVuc2lnbmVkIHBlcmlvZE1zKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9DbGVhclN0aWNreUZhdWx0cyh2b2lkICpoYW5kbGUpOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X092ZXJUZW1wKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfVW5kZXJWb2x0YWdlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfRm9yTGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfUmV2TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfSGFyZHdhcmVGYWlsdXJlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmF1bHRfRm9yU29mdExpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZhdWx0X1JldlNvZnRMaW0odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X092ZXJUZW1wKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U3Rja3lGYXVsdF9VbmRlclZvbHRhZ2Uodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTdGNreUZhdWx0X0ZvckxpbSh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFN0Y2t5RmF1bHRfUmV2TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U3Rja3lGYXVsdF9Gb3JTb2Z0TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0U3Rja3lGYXVsdF9SZXZTb2Z0TGltKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0QXBwbGllZFRocm90dGxlKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0Q2xvc2VMb29wRXJyKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RmVlZGJhY2tEZXZpY2VTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRNb2RlU2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0TGltaXRTd2l0Y2hFbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldExpbWl0U3dpdGNoQ2xvc2VkRm9yKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0TGltaXRTd2l0Y2hDbG9zZWRSZXYodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRTZW5zb3JQb3NpdGlvbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFNlbnNvclZlbG9jaXR5KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0Q3VycmVudCh2b2lkICpoYW5kbGUsIGRvdWJsZSAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEJyYWtlSXNFbmFibGVkKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0RW5jUG9zaXRpb24odm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRFbmNWZWwodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRFbmNJbmRleFJpc2VFdmVudHModm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRRdWFkQXBpbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldFF1YWRCcGluKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UXVhZElkeHBpbih2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEFuYWxvZ0luV2l0aE92KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0QW5hbG9nSW5WZWwodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRUZW1wKHZvaWQgKmhhbmRsZSwgZG91YmxlICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0QmF0dGVyeVYodm9pZCAqaGFuZGxlLCBkb3VibGUgKnBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9HZXRSZXNldENvdW50KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfR2V0UmVzZXRGbGFncyh2b2lkICpoYW5kbGUsIGludCAqcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX0dldEZpcm1WZXJzKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0RGVtYW5kKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRPdmVycmlkZUxpbWl0U3dpdGNoRW4odm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldEZlZWRiYWNrRGV2aWNlU2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbih2b2lkICpoYW5kbGUsIGludCBwYXJhbSk7DQorCUNUUl9Db2RlIGNfVGFsb25TUlhfU2V0T3ZlcnJpZGVCcmFrZVR5cGUodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldE1vZGVTZWxlY3Qodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFByb2ZpbGVTbG90U2VsZWN0KHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCisJQ1RSX0NvZGUgY19UYWxvblNSWF9TZXRSYW1wVGhyb3R0bGUodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0pOw0KKwlDVFJfQ29kZSBjX1RhbG9uU1JYX1NldFJldkZlZWRiYWNrU2Vuc29yKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtKTsNCit9DQorI2VuZGlmDQorDQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvY3RyZS9DdHJlQ2FuTm9kZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvY3RyZS9DdHJlQ2FuTm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTA5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9jdHJlL0N0cmVDYW5Ob2RlLmgKQEAgLTAsMCArMSwxMTYgQEAKKyNpZm5kZWYgQ3RyZUNhbk5vZGVfSF8NCisjZGVmaW5lIEN0cmVDYW5Ob2RlX0hfDQorI2luY2x1ZGUgImN0cmUuaCIJCQkJLy9CSVQgRGVmaW5lcyArIFR5cGVkZWZzDQorI2luY2x1ZGUgPE5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaD4JLy9DQU4gQ29tbQ0KKyNpbmNsdWRlIDxwdGhyZWFkLmg+DQorI2luY2x1ZGUgPG1hcD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbWNweQ0KKyNpbmNsdWRlIDxzeXMvdGltZS5oPg0KK2NsYXNzIEN0cmVDYW5Ob2RlDQorew0KK3B1YmxpYzoNCisJQ3RyZUNhbk5vZGUoVUlOVDggZGV2aWNlTnVtYmVyKTsNCisgICAgfkN0cmVDYW5Ob2RlKCk7DQorDQorCVVJTlQ4IEdldERldmljZU51bWJlcigpDQorCXsNCisJCXJldHVybiBfZGV2aWNlTnVtYmVyOw0KKwl9DQorcHJvdGVjdGVkOg0KKw0KKw0KKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgdHhUYXNrew0KKwkJcHVibGljOg0KKwkJCXVpbnQzMl90IGFyYklkOw0KKwkJCVQgKiB0b1NlbmQ7DQorCQkJVCAqIG9wZXJhdG9yIC0+ICgpDQorCQkJew0KKwkJCQlyZXR1cm4gdG9TZW5kOw0KKwkJCX0NCisJCQlUICYgb3BlcmF0b3IqKCkNCisJCQl7DQorCQkJCXJldHVybiAqdG9TZW5kOw0KKwkJCX0NCisJCQlib29sIElzRW1wdHkoKQ0KKwkJCXsNCisJCQkJaWYodG9TZW5kID09IDApDQorCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJfTsNCisJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIHJlY01zZ3sNCisJCXB1YmxpYzoNCisJCQl1aW50MzJfdCBhcmJJZDsNCisJCQl1aW50OF90IGJ5dGVzWzhdOw0KKwkJCUNUUl9Db2RlIGVycjsNCisJCQlUICogb3BlcmF0b3IgLT4gKCkNCisJCQl7DQorCQkJCXJldHVybiAoVCAqKWJ5dGVzOw0KKwkJCX0NCisJCQlUICYgb3BlcmF0b3IqKCkNCisJCQl7DQorCQkJCXJldHVybiAqKFQgKilieXRlczsNCisJCQl9DQorCX07DQorCVVJTlQ4IF9kZXZpY2VOdW1iZXI7DQorCXZvaWQgUmVnaXN0ZXJSeCh1aW50MzJfdCBhcmJJZCk7DQorCXZvaWQgUmVnaXN0ZXJUeCh1aW50MzJfdCBhcmJJZCwgdWludDMyX3QgcGVyaW9kTXMpOw0KKw0KKwlDVFJfQ29kZSBHZXRSeCh1aW50MzJfdCBhcmJJZCx1aW50OF90ICogZGF0YUJ5dGVzLHVpbnQzMl90IHRpbWVvdXRNcyk7DQorCXZvaWQgRmx1c2hUeCh1aW50MzJfdCBhcmJJZCk7DQorDQorCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHR4VGFzazxUPiBHZXRUeCh1aW50MzJfdCBhcmJJZCkNCisJew0KKwkJdHhUYXNrPFQ+IHJldHZhbCA9IHswfTsNCisJCXR4Sm9ic190OjppdGVyYXRvciBpID0gX3R4Sm9icy5maW5kKGFyYklkKTsNCisJCWlmKGkgIT0gX3R4Sm9icy5lbmQoKSl7DQorCQkJcmV0dmFsLmFyYklkID0gaS0+c2Vjb25kLmFyYklkOw0KKwkJCXJldHZhbC50b1NlbmQgPSAoVCopaS0+c2Vjb25kLnRvU2VuZDsNCisJCX0NCisJCXJldHVybiByZXR2YWw7DQorCX0NCisJdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBGbHVzaFR4KFQgJiBwYXIpDQorCXsNCisJCUZsdXNoVHgocGFyLmFyYklkKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBUPiByZWNNc2c8VD4gR2V0UngodWludDMyX3QgYXJiSWQsIHVpbnQzMl90IHRpbWVvdXRNcykNCisJew0KKwkJcmVjTXNnPFQ+IHJldHZhbDsNCisJCXJldHZhbC5lcnIgPSBHZXRSeChhcmJJZCxyZXR2YWwuYnl0ZXMsIHRpbWVvdXRNcyk7DQorCQlyZXR1cm4gcmV0dmFsOw0KKwl9DQorDQorcHJpdmF0ZToNCisNCisJY2xhc3MgdHhKb2JfdCB7DQorCQlwdWJsaWM6DQorCQkJdWludDMyX3QgYXJiSWQ7DQorCQkJdWludDhfdCB0b1NlbmRbOF07DQorCQkJdWludDMyX3QgcGVyaW9kTXM7DQorCX07DQorDQorCWNsYXNzIHJ4RXZlbnRfdHsNCisJCXB1YmxpYzoNCisJCQl1aW50OF90IGJ5dGVzWzhdOw0KKwkJCXN0cnVjdCB0aW1lc3BlYyB0aW1lOw0KKwkJCXJ4RXZlbnRfdCgpDQorCQkJew0KKwkJCQlieXRlc1swXSA9IDA7DQorCQkJCWJ5dGVzWzFdID0gMDsNCisJCQkJYnl0ZXNbMl0gPSAwOw0KKwkJCQlieXRlc1szXSA9IDA7DQorCQkJCWJ5dGVzWzRdID0gMDsNCisJCQkJYnl0ZXNbNV0gPSAwOw0KKwkJCQlieXRlc1s2XSA9IDA7DQorCQkJCWJ5dGVzWzddID0gMDsNCisJCQl9DQorCX07DQorDQorCXR5cGVkZWYgc3RkOjptYXA8dWludDMyX3QsdHhKb2JfdD4gdHhKb2JzX3Q7DQorCXR4Sm9ic190IF90eEpvYnM7DQorDQorCXR5cGVkZWYgc3RkOjptYXA8dWludDMyX3QscnhFdmVudF90PiByeFJ4RXZlbnRzX3Q7DQorCXJ4UnhFdmVudHNfdCBfcnhSeEV2ZW50czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL2N0cmUvY3RyZS5oIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL2luY2x1ZGUvY3RyZS9jdHJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkM2Y2OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL2N0cmUvY3RyZS5oCkBAIC0wLDAgKzEsNTAgQEAKKyNpZm5kZWYgR0xPQkFMX0gNCisjZGVmaW5lIEdMT0JBTF9IDQorDQorLy9CaXQgRGVmaW5lcw0KKyNkZWZpbmUgQklUMCAweDAxDQorI2RlZmluZSBCSVQxIDB4MDINCisjZGVmaW5lIEJJVDIgMHgwNA0KKyNkZWZpbmUgQklUMyAweDA4DQorI2RlZmluZSBCSVQ0IDB4MTANCisjZGVmaW5lIEJJVDUgMHgyMA0KKyNkZWZpbmUgQklUNiAweDQwDQorI2RlZmluZSBCSVQ3IDB4ODANCisjZGVmaW5lIEJJVDggIDB4MDEwMA0KKyNkZWZpbmUgQklUOSAgMHgwMjAwDQorI2RlZmluZSBCSVQxMCAweDA0MDANCisjZGVmaW5lIEJJVDExIDB4MDgwMA0KKyNkZWZpbmUgQklUMTIgMHgxMDAwDQorI2RlZmluZSBCSVQxMyAweDIwMDANCisjZGVmaW5lIEJJVDE0IDB4NDAwMA0KKyNkZWZpbmUgQklUMTUgMHg4MDAwDQorDQorLy9TaWduZWQNCit0eXBlZGVmCXNpZ25lZCBjaGFyCUlOVDg7DQordHlwZWRlZglzaWduZWQgc2hvcnQJSU5UMTY7DQordHlwZWRlZglzaWduZWQgaW50CUlOVDMyOw0KK3R5cGVkZWYJc2lnbmVkIGxvbmcgbG9uZyBJTlQ2NDsNCisNCisvL1Vuc2lnbmVkDQordHlwZWRlZgl1bnNpZ25lZCBjaGFyCVVJTlQ4Ow0KK3R5cGVkZWYJdW5zaWduZWQgc2hvcnQJVUlOVDE2Ow0KK3R5cGVkZWYJdW5zaWduZWQgaW50CVVJTlQzMjsNCit0eXBlZGVmCXVuc2lnbmVkIGxvbmcgbG9uZyBVSU5UNjQ7DQorDQorLy9PdGhlcg0KK3R5cGVkZWYJdW5zaWduZWQgY2hhcglVQ0hBUjsNCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CVVTSE9SVDsNCit0eXBlZGVmCXVuc2lnbmVkIGludAlVSU5UOw0KK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlVTE9ORzsNCisNCit0eXBlZGVmIGVudW0gew0KKwkJQ1RSX09LQVksCQkJCS8vITwgTm8gRXJyb3IgLSBGdW5jdGlvbiBleGVjdXRlZCBhcyBleHBlY3RlZA0KKwkJQ1RSX1J4VGltZW91dCwJCQkvLyE8IENBTiBmcmFtZSBoYXMgbm90IGJlZW4gcmVjZWl2ZWQgd2l0aGluIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZS4NCisJCUNUUl9UeFRpbWVvdXQsCQkJLy8hPCBOb3QgdXNlZC4NCisJCUNUUl9JbnZhbGlkUGFyYW1WYWx1ZSwgCS8vITwgQ2FsbGVyIHBhc3NlZCBhbiBpbnZhbGlkIHBhcmFtDQorCQlDVFJfVW5leHBlY3RlZEFyYklkLAkvLyE8IFNwZWNpZmllZCBDQU4gSWQgaXMgaW52YWxpZC4NCisJCUNUUl9UeEZhaWxlZCwJCQkvLyE8IENvdWxkIG5vdCB0cmFuc21pdCB0aGUgQ0FOIGZyYW1lLg0KKwkJQ1RSX1NpZ05vdFVwZGF0ZWQsCQkvLyE8IEhhdmUgbm90IHJlY2VpdmVkIGFuIHZhbHVlIHJlc3BvbnNlIGZvciBzaWduYWwuDQorfUNUUl9Db2RlOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL25pdmlzaW9uLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9uaXZpc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmI5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9uaXZpc2lvbi5oCkBAIC0wLDAgKzEsNTM0NSBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgSU1BUSBWaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDAxLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGl0bGU6ICAgICAgIE5JVmlzaW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmICFkZWZpbmVkKE5pVmlzaW9uX2gpCisjZGVmaW5lIE5pVmlzaW9uX2gKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgSW5jbHVkZXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENvbnRyb2wgRGVmaW5lcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgIWRlZmluZWQoSU1BUV9JTVBPUlQpCisJI2lmbmRlZiBfX0dOVUNfXworCQkjZGVmaW5lIElNQVFfSU1QT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorCSNlbHNlCisJCSNkZWZpbmUgSU1BUV9JTVBPUlQKKwkjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSU1BUV9GVU5DKQorICAgICNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgICAgICAgI2RlZmluZSBJTUFRX0ZVTkMgSU1BUV9JTVBPUlQKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIElNQVFfRlVOQyBleHRlcm4gIkMiIElNQVFfSU1QT1JUCisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKElNQVFfU1REQ0FMTCkKKwkjaWZuZGVmIF9fR05VQ19fCisJCSNkZWZpbmUgSU1BUV9TVERDQUxMIF9fc3RkY2FsbAorCSNlbHNlCisJCSNkZWZpbmUgSU1BUV9TVERDQUxMIAorCSNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfQ1ZJXworI3ByYWdtYSBFbmFibGVMaWJyYXJ5UnVudGltZUNoZWNraW5nCisjaW5jbHVkZSA8YW5zaV9jLmg+CisjZW5kaWYKKworI2RlZmluZSBJTUFRX0NBTExCQUNLIF9fY2RlY2wKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgTWFuaWZlc3QgQ29uc3RhbnRzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZm5kZWYgTlVMTAorICAgICNpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICAjZGVmaW5lIE5VTEwgICAgMAorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgTlVMTCAgICAoKHZvaWQgKikwKQorICAgICNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkFMU0UKKyAgICAjZGVmaW5lIEZBTFNFICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorICAgICNkZWZpbmUgVFJVRSAgICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2RlZmluZSBJTUFRX0RFRkFVTFRfU0hPV19DT09SRElOQVRFUyBUUlVFCisjZGVmaW5lIElNQVFfREVGQVVMVF9NQVhfSUNPTlNfUEVSX0xJTkUgNAorI2RlZmluZSBJTUFRX0RFRkFVTFRfTEVBUk5JTkdfTU9ERSBJTUFRX0xFQVJOX1NISUZUX0lORk9STUFUSU9OCisjZGVmaW5lIElNQVFfREVGQVVMVF9CTVBfQ09NUFJFU1MgRkFMU0UKKyNkZWZpbmUgSU1BUV9ERUZBVUxUX1BOR19RVUFMSVRZIDc1MAorI2RlZmluZSBJTUFRX0RFRkFVTFRfSlBFR19RVUFMSVRZIDc1MAorI2RlZmluZSBJTUFRX0FMTF9DT05UT1VSUyAtMQorI2RlZmluZSBJTUFRX0FMTF9XSU5ET1dTIC0xCisjZGVmaW5lIElNQVFfU0hJRlQgICAgICAxCisjZGVmaW5lIElNQVFfQUxUICAgICAgICAyCisjZGVmaW5lIElNQVFfQ1RSTCAgICAgICA0CisjZGVmaW5lIElNQVFfQ0FQU19MT0NLICA4CisjZGVmaW5lIElNQVFfTU9EQUxfRElBTE9HIC0xCisjZGVmaW5lIElNQVFfSU5JVF9SR0JfVFJBTlNQQVJFTlQgeyAgIDAsICAgMCwgICAwLCAxIH0KKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9SRUQgICAgICAgICB7ICAgMCwgICAwLCAyNTUsIDAgfQorI2RlZmluZSBJTUFRX0lOSVRfUkdCX0JMVUUgICAgICAgIHsgMjU1LCAgIDAsICAgMCwgMCB9CisjZGVmaW5lIElNQVFfSU5JVF9SR0JfR1JFRU4gICAgICAgeyAgIDAsIDI1NSwgICAwLCAwIH0KKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9ZRUxMT1cgICAgICB7ICAgMCwgMjU1LCAyNTUsIDAgfQorI2RlZmluZSBJTUFRX0lOSVRfUkdCX1dISVRFICAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMCB9CisjZGVmaW5lIElNQVFfSU5JVF9SR0JfQkxBQ0sgICAgICAgeyAgIDAsICAgMCwgICAwLCAwIH0KKyNkZWZpbmUgSU1BUV9VU0VfREVGQVVMVF9RVUFMSVRZICAtMQorI2RlZmluZSBJTUFRX0FMTF9TQU1QTEVTICAgICAgICAgIC0xCisjZGVmaW5lIElNQVFfQUxMX09CSkVDVFMgICAgICAgICAgLTEKKyNkZWZpbmUgSU1BUV9BTExfQ0hBUkFDVEVSUyAgICAgICAtMQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBQcmVkZWZpbmVkIFZhbGlkIENoYXJhY3RlcnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBJTUFRX0FOWV9DSEFSQUNURVIgICAgICAgICAgIiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FueSBDaGFyYWN0ZXIKKyNkZWZpbmUgSU1BUV9BTFBIQUJFVElDICAgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiAgICAgICAgICAgICAgLy9BbHBoYWJldGljCisjZGVmaW5lIElNQVFfQUxQSEFOVU1FUklDICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiICAgIC8vQWxwaGFudW1lcmljCisjZGVmaW5lIElNQVFfVVBQRVJDQVNFX0xFVFRFUlMgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVXBwZXJjYXNlIExldHRlcnMKKyNkZWZpbmUgSU1BUV9MT1dFUkNBU0VfTEVUVEVSUyAgICAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Mb3dlcmNhc2UgTGV0dGVycworI2RlZmluZSBJTUFRX0RFQ0lNQUxfRElHSVRTICAgICAgICAgIjAxMjM0NTY3ODkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0RlY2ltYWwgRGlnaXRzCisjZGVmaW5lIElNQVFfSEVYQURFQ0lNQUxfRElHSVRTICAgICAiMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSGV4YWRlY2ltYWwgRGlnaXRzCisjZGVmaW5lIElNQVFfUEFUVEVSTiAgICAgICAgICAgICAgICAiXHhGRiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGF0dGVybiAoQSBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZyB3aXRoIHRoZSBjaGFyYWN0ZXIgdmFsdWUgc2V0IHRvIDI1NSkKKyNkZWZpbmUgSU1BUV9GT1JDRV9TUEFDRSAgICAgICAgICAgICIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Gb3JjZSBTcGFjZQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNYWNyb3MKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBJTUFRX05PX1JFQ1QgaW1hcU1ha2VSZWN0KCAwLCAwLCAweDdGRkZGRkZGLCAweDdGRkZGRkZGKQorI2RlZmluZSBJTUFRX05PX1JPVEFURURfUkVDVCBpbWFxTWFrZVJvdGF0ZWRSZWN0KCAwLCAwLCAweDdGRkZGRkZGLCAweDdGRkZGRkZGLCAwKQorI2RlZmluZSBJTUFRX05PX1BPSU5UIGltYXFNYWtlUG9pbnQoIC0xLCAtMSkKKyNkZWZpbmUgSU1BUV9OT19QT0lOVF9GTE9BVCBpbWFxTWFrZVBvaW50RmxvYXQoIC0xLjAsIC0xLjAgKQorI2RlZmluZSBJTUFRX05PX09GRlNFVCBpbWFxTWFrZVBvaW50RmxvYXQoIDAuMCwgMC4wICkKKworCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFdoZW4gaW4gQm9ybGFuZCwgc29tZSBmdW5jdGlvbnMgbXVzdCBiZSBtYXBwZWQgdG8gZGlmZmVyZW50IG5hbWVzLgorLy8gIFRoaXMgYWNjb21wbGlzaGVzIHNhaWQgdGFzay4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoZGVmaW5lZChfQ1ZJXykgJiYgZGVmaW5lZChfTklfQkNfKSkKKyAgICAjZGVmaW5lIGltYXFNYWtlUG9pbnQgaW1hcU1ha2VQb2ludF9CQworICAgICNkZWZpbmUgaW1hcU1ha2VQb2ludEZsb2F0IGltYXFNYWtlUG9pbnRGbG9hdF9CQworI2VuZGlmCisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgV2hlbiBpbiBXYXRjb20sIHNvbWUgZnVuY3Rpb25zIG11c3QgYmUgbWFwcGVkIHRvIGRpZmZlcmVudCBuYW1lcy4KKy8vICBUaGlzIGFjY29tcGxpc2hlcyBzYWlkIHRhc2suCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKSB8fCAoZGVmaW5lZChfQ1ZJXykgJiYgZGVmaW5lZChfTklfV0NfKSkKKyAgICAjZGVmaW5lIGltYXFNYWtlUG9pbnQgaW1hcU1ha2VQb2ludF9CQworICAgICNkZWZpbmUgaW1hcU1ha2VQb2ludEZsb2F0IGltYXFNYWtlUG9pbnRGbG9hdF9CQworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIElmIHVzaW5nIFZpc3VhbCBDKyssIGZvcmNlIHN0YXJ0dXAgJiBzaHV0ZG93biBjb2RlIHRvIHJ1bi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9DVklfKSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisgICAgI3ByYWdtYSBjb21tZW50KGxpbmtlciwgIi9JTkNMVURFOl9uaXZpc2lvbl9zdGFydHVwX3NodXRkb3duIikKKyAgICAjcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL0RFRkFVTFRMSUI6bml2aXNpb24ubGliIikKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBFcnJvciBDb2RlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEVSUl9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8vIE5vIGVycm9yLgorI2RlZmluZSBFUlJfU1lTVEVNX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNjAgLy8gU3lzdGVtIGVycm9yLgorI2RlZmluZSBFUlJfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNTkgLy8gTm90IGVub3VnaCBtZW1vcnkgZm9yIHJlcXVlc3RlZCBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9NRU1PUllfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE1OCAvLyBNZW1vcnkgZXJyb3IuCisjZGVmaW5lIEVSUl9VTlJFR0lTVEVSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE1NyAvLyBVbmxpY2Vuc2VkIGNvcHkgb2YgTkkgVmlzaW9uLgorI2RlZmluZSBFUlJfTkVFRF9GVUxMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNTYgLy8gVGhlIGZ1bmN0aW9uIHJlcXVpcmVzIGFuIE5JIFZpc2lvbiA1LjAgQWR2YW5jZWQgbGljZW5zZS4KKyNkZWZpbmUgRVJSX1VOSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTU1IC8vIE5JIFZpc2lvbiBkaWQgbm90IGluaXRpYWxpemUgcHJvcGVybHkuCisjZGVmaW5lIEVSUl9JTUFHRV9UT09fU01BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE1NCAvLyBUaGUgaW1hZ2UgaXMgbm90IGxhcmdlIGVub3VnaCBmb3IgdGhlIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX0JBUkNPREVfQ09EQUJBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTUzIC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIENvZGFiYXIgYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfQ09ERTM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTUyIC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIENvZGUgMyBvZiA5IGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0NPREU5MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE1MSAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBDb2RlOTMgYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfQ09ERTEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTUwIC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIENvZGUxMjggYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfRUFOOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTQ5IC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIEVBTjggYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfRUFOMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTQ4IC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIEVBTjEzIGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0kyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE0NyAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBJbnRlcmxlYXZlZCAyIG9mIDUgYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfTVNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTQ2IC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIE1TSSBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9VUENBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNDUgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgVVBDQSBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DT0RFOTNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNDQgLy8gVGhlIENvZGU5MyBiYXJjb2RlIGNvbnRhaW5zIGludmFsaWQgc2hpZnQgZW5jb2RpbmcuCisjZGVmaW5lIEVSUl9CQVJDT0RFX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE0MyAvLyBUaGUgYmFyY29kZSB0eXBlIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE0MiAvLyBUaGUgaW1hZ2UgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgbGluZWFyIGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0NPREUxMjhfRk5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjE0MSAvLyBUaGUgRk5DIHZhbHVlIGluIHRoZSBDb2RlMTI4IGJhcmNvZGUgaXMgbm90IGxvY2F0ZWQgYmVmb3JlIHRoZSBmaXJzdCBkYXRhIHZhbHVlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DT0RFMTI4X1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxNDAgLy8gVGhlIHN0YXJ0aW5nIGNvZGUgc2V0IGluIHRoZSBDb2RlMTI4IGJhcmNvZGUgaXMgbm90IHZhbGlkLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMzkgLy8gTm90IGVub3VnaCByZXNlcnZlZCBtZW1vcnkgaW4gdGhlIHRpbWVkIGVudmlyb25tZW50IGZvciB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTM4IC8vIFRoZSBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYSB0aW1lIGxpbWl0IGlzIGFjdGl2ZS4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfRExMX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTM3IC8vIFF1YXJ0ei5kbGwgbm90IGZvdW5kLiAgSW5zdGFsbCBEaXJlY3RYIDguMSBvciBsYXRlci4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfSU5WQUxJRF9GSUxURVJfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTM2IC8vIFRoZSBmaWx0ZXIgcXVhbGl0eSB5b3UgcHJvdmlkZWQgaXMgaW52YWxpZC4gVmFsaWQgcXVhbGl0eSB2YWx1ZXMgcmFuZ2UgZnJvbSAtMSB0byAxMDAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CVVRUT05fTEFCRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMzUgLy8gSW52YWxpZCBidXR0b24gbGFiZWwuCisjZGVmaW5lIEVSUl9USFJFQURfSU5JVElBTElaSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEzNCAvLyBDb3VsZCBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW4gdGhlIHNlcGFyYXRlIHRocmVhZCBiZWNhdXNlIHRoZSB0aHJlYWQgaGFzIG5vdCBjb21wbGV0ZWQgaW5pdGlhbGl6YXRpb24uCisjZGVmaW5lIEVSUl9USFJFQURfQ09VTERfTk9UX0lOSVRJQUxJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEzMyAvLyBDb3VsZCBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW4gdGhlIHNlcGFyYXRlIHRocmVhZCBiZWNhdXNlIHRoZSB0aHJlYWQgY291bGQgbm90IGluaXRpYWxpemUuCisjZGVmaW5lIEVSUl9NQVNLX05PVF9URU1QTEFURV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEzMiAvLyBUaGUgbWFzayBtdXN0IGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIHRlbXBsYXRlLgorI2RlZmluZSBFUlJfTk9UX1JFQ1RfT1JfUk9UQVRFRF9SRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMzAgLy8gVGhlIFJPSSBtdXN0IG9ubHkgaGF2ZSBlaXRoZXIgYSBzaW5nbGUgUmVjdGFuZ2xlIGNvbnRvdXIgb3IgYSBzaW5nbGUgUm90YXRlZCBSZWN0YW5nbGUgY29udG91ci4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1VOQk9VTkRFRF9JTlRFUkZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTI5IC8vIER1cmluZyB0aW1lZCBleGVjdXRpb24sIHlvdSBtdXN0IHVzZSB0aGUgcHJlYWxsb2NhdGVkIHZlcnNpb24gb2YgdGhpcyBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9DT05GTElDVF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEyOCAvLyBBbiBpbWFnZSBiZWluZyBtb2RpZmllZCBieSBvbmUgcHJvY2VzcyBjYW5ub3QgYmUgcmVxdWVzdGVkIGJ5IGFub3RoZXIgcHJvY2VzcyB3aGlsZSBhIHRpbWUgbGltaXQgaXMgYWN0aXZlLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfQ09ORkxJQ1RfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMjcgLy8gQW4gaW1hZ2Ugd2l0aCBwYXR0ZXJuIG1hdGNoaW5nLCBjYWxpYnJhdGlvbiwgb3Igb3ZlcmxheSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbWFuaXB1bGF0ZWQgd2hpbGUgYSB0aW1lIGxpbWl0IGlzIGFjdGl2ZS4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX0NPTkZMSUNUXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTI2IC8vIEFuIGltYWdlIGNyZWF0ZWQgYmVmb3JlIGEgdGltZSBsaW1pdCBpcyBzdGFydGVkIGNhbm5vdCBiZSByZXNpemVkIHdoaWxlIGEgdGltZSBsaW1pdCBpcyBhY3RpdmUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTlRSQVNUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEyNSAvLyBJbnZhbGlkIGNvbnRyYXN0IHRocmVzaG9sZC4gVGhlIHRocmVzaG9sZCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLiAKKyNkZWZpbmUgRVJSX0lOVkFMSURfQ0FMSUJSQVRJT05fUk9JX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTI0IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjYWxpYnJhdGlvbiBST0kgbW9kZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NBTElCUkFUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEyMyAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2FsaWJyYXRpb24gbW9kZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9EUkFXVEVYVF9DT0xPUl9NVVNUX0JFX0dSQVlTQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEyMiAvLyBTZXQgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgdGV4dCBjb2xvcnMgdG8gZ3JheXNjYWxlIHRvIGRyYXcgb24gYSBVOCBpbWFnZS4KKyNkZWZpbmUgRVJSX1NBVFVSQVRJT05fVEhSRVNIT0xEX09VVF9PRl9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTIxIC8vIFRoZSB2YWx1ZSBvZiB0aGUgc2F0dXJhdGlvbiB0aHJlc2hvbGQgbXVzdCBiZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfTk9UX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMjAgLy8gTm90IGFuIGltYWdlLgorI2RlZmluZSBFUlJfQ1VTVE9NREFUQV9JTlZBTElEX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMTkgLy8gVGhleSBjdXN0b20gZGF0YSBrZXkgeW91IHN1cHBsaWVkIGlzIGludmFsaWQuIFRoZSBvbmx5IHZhbGlkIGNoYXJhY3RlciB2YWx1ZXMgYXJlIGRlY2ltYWwgMzItMTI2IGFuZCAxNjEtMjU1LiBUaGVyZSBtdXN0IGFsc28gYmUgbm8gcmVwZWF0ZWQsIGxlYWRpbmcsIG9yIHRyYWlsaW5nIHNwYWNlcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTE4IC8vIFN0ZXAgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gSW1hZ2Ugc2l6ZQorI2RlZmluZSBFUlJfTUFUUklYX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMTcgLy8gSW52YWxpZCBtYXRyaXggc2l6ZSBpbiB0aGUgc3RydWN0dXJpbmcgZWxlbWVudC4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lOU0ZfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTE2IC8vIEluc3VmZmljaWVudCBudW1iZXIgb2YgY2FsaWJyYXRpb24gZmVhdHVyZSBwb2ludHMuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTUFHRV9DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjExNSAvLyBUaGUgb3BlcmF0aW9uIGlzIGludmFsaWQgaW4gYSBjb3JyZWN0ZWQgaW1hZ2UuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTlZBTElEX1JPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjExNCAvLyBUaGUgUk9JIGNvbnRhaW5zIGFuIGludmFsaWQgY29udG91ciB0eXBlIG9yIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIFJPSSBsZWFybmVkIGZvciBjYWxpYnJhdGlvbi4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lNQUdFX1VOQ0FMSUJSQVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTEzIC8vIFRoZSBzb3VyY2UvaW5wdXQgaW1hZ2UgaGFzIG5vdCBiZWVuIGNhbGlicmF0ZWQuCisjZGVmaW5lIEVSUl9JTkNPTVBfTUFUUklYX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjExMiAvLyBUaGUgbnVtYmVyIG9mIHBpeGVsIGFuZCByZWFsLXdvcmxkIGNvb3JkaW5hdGVzIG11c3QgYmUgZXF1YWwuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9GQUlMRURfVE9fRklORF9HUklEICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjExMSAvLyBVbmFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgZ3JpZCBiZWNhdXNlIHRoZSBpbWFnZSBpcyB0b28gZGlzdG9ydGVkLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT19WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMTAgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiB2ZXJzaW9uLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5WQUxJRF9TQ0FMSU5HX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMDkgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiBzY2FsaW5nIGZhY3Rvci4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0VSUk9STUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTA4IC8vIFRoZSBjYWxpYnJhdGlvbiBlcnJvciBtYXAgY2Fubm90IGJlIGNvbXB1dGVkLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMDcgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTA2IC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEwNSAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMDQgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTAzIC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjEwMiAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT19NSUNST19QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYxMDEgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fUEVSU1BFQ1RJVkVfUFJPSkVDVElPTiAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MTAwIC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPX1NJTVBMRV9UUkFOU0ZPUk0gICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5OSAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfUkVTRVJWRURfTVVTVF9CRV9OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwOTggLy8gWW91IG11c3QgcGFzcyBOVUxMIGZvciB0aGUgcmVzZXJ2ZWQgcGFyYW1ldGVyLgorI2RlZmluZSBFUlJfSU5WQUxJRF9QQVJUSUNMRV9QQVJBTUVURVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwOTcgLy8gWW91IGVudGVyZWQgYW4gaW52YWxpZCBzZWxlY3Rpb24gaW4gdGhlIHBhcnRpY2xlIHBhcmFtZXRlci4KKyNkZWZpbmUgRVJSX05PVF9BTl9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDk2IC8vIE5vdCBhbiBvYmplY3QuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9EVVBMSUNBVEVfUkVGRVJFTkNFX1BPSU5UICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5NSAvLyBUaGUgcmVmZXJlbmNlIHBvaW50cyBwYXNzZWQgYXJlIGluY29uc2lzdGVudC4gIEF0IGxlYXN0IHR3byBzaW1pbGFyIHBpeGVsIGNvb3JkaW5hdGVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50IHJlYWwtd29ybGQgY29vcmRpbmF0ZXMuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9DQU5OT1RfVU5MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5NCAvLyBBIHJlc291cmNlIGNvbmZsaWN0IG9jY3VycmVkIGluIHRoZSB0aW1lZCBlbnZpcm9ubWVudC4gVHdvIHByb2Nlc3NlcyBjYW5ub3QgbWFuYWdlIHRoZSBzYW1lIHJlc291cmNlIGFuZCBiZSB0aW1lIGJvdW5kZWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9MT0NLRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5MyAvLyBBIHJlc291cmNlIGNvbmZsaWN0IG9jY3VycmVkIGluIHRoZSB0aW1lZCBlbnZpcm9ubWVudC4gVHdvIHByb2Nlc3NlcyBjYW5ub3QgYWNjZXNzIHRoZSBzYW1lIHJlc291cmNlIGFuZCBiZSB0aW1lIGJvdW5kZWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9OT05fRU1QVFlfSU5JVElBTElaRSAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5MiAvLyBNdWx0aXBsZSB0aW1lZCBlbnZpcm9ubWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9VTklOSVRJQUxJWkVEX0VOQUJMRSAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA5MSAvLyBBIHRpbWUgbGltaXQgY2Fubm90IGJlIHN0YXJ0ZWQgdW50aWwgdGhlIHRpbWVkIGVudmlyb25tZW50IGlzIGluaXRpYWxpemVkLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwOTAgLy8gTXVsdGlwbGUgdGltZWQgZW52aXJvbm1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfUkVJTklUSUFMSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODkgLy8gVGhlIHRpbWVkIGVudmlyb25tZW50IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA4OCAvLyBUaGUgcmVzdWx0cyBvZiB0aGUgb3BlcmF0aW9uIGV4Y2VlZGVkIHRoZSBzaXplIGxpbWl0cyBvbiB0aGUgb3V0cHV0IGRhdGEgYXJyYXlzLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfU1RPUF9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODcgLy8gTm8gdGltZSBsaW1pdCBpcyBhdmFpbGFibGUgdG8gc3RvcC4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1NUQVJUX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDg2IC8vIEEgdGltZSBsaW1pdCBjb3VsZCBub3QgYmUgc2V0LgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfSU5JVF9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODUgLy8gVGhlIHRpbWVkIGVudmlyb25tZW50IGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX0RFTEVURV9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDg0IC8vIE5vIGluaXRpYWxpemVkIHRpbWVkIGVudmlyb25tZW50IGlzIGF2YWlsYWJsZSB0byBjbG9zZS4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDgzIC8vIFRoZSB0aW1lIGxpbWl0IGhhcyBleHBpcmVkLgorI2RlZmluZSBFUlJfUEFMRVRURV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwODIgLy8gT25seSA4LWJpdCBpbWFnZXMgc3VwcG9ydCB0aGUgdXNlIG9mIHBhbGV0dGVzLiAgRWl0aGVyIGRvIG5vdCB1c2UgYSBwYWxldHRlLCBvciBjb252ZXJ0IHlvdXIgaW1hZ2UgdG8gYW4gOC1iaXQgaW1hZ2UgYmVmb3JlIHVzaW5nIGEgcGFsZXR0ZS4KKyNkZWZpbmUgRVJSX0JBRF9QQVNTV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDgxIC8vIEluY29ycmVjdCBwYXNzd29yZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU1BR0VfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDgwIC8vIEludmFsaWQgaW1hZ2UgdHlwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUVUQUZJTEVfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDc5IC8vIEludmFsaWQgbWV0YWZpbGUgaGFuZGxlLgorI2RlZmluZSBFUlJfSU5DT01QX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNzcgLy8gSW5jb21wYXRpYmxlIGltYWdlIHR5cGUuCisjZGVmaW5lIEVSUl9DT09SRF9TWVNfRklSU1RfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA3NiAvLyBVbmFibGUgdG8gZml0IGEgbGluZSBmb3IgdGhlIHByaW1hcnkgYXhpcy4KKyNkZWZpbmUgRVJSX0NPT1JEX1NZU19TRUNPTkRfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDc1IC8vIFVuYWJsZSB0byBmaXQgYSBsaW5lIGZvciB0aGUgc2Vjb25kYXJ5IGF4aXMuCisjZGVmaW5lIEVSUl9JTkNPTVBfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA3NCAvLyBJbmNvbXBhdGlibGUgaW1hZ2Ugc2l6ZS4KKyNkZWZpbmUgRVJSX01BU0tfT1VUU0lERV9JTUFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDczIC8vIFdoZW4gdGhlIG1hc2sncyBvZmZzZXQgd2FzIGFwcGxpZWQsIHRoZSBtYXNrIHdhcyBlbnRpcmVseSBvdXRzaWRlIG9mIHRoZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQk9SREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDcyIC8vIEludmFsaWQgaW1hZ2UgYm9yZGVyLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TQ0FOX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNzEgLy8gSW52YWxpZCBzY2FuIGRpcmVjdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRlVOQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDcwIC8vIFVuc3VwcG9ydGVkIGZ1bmN0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT0xPUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNjkgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvbG9yIG1vZGUgeW91IHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDY4IC8vIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgYWN0aW9uLgorI2RlZmluZSBFUlJfSU1BR0VTX05PVF9ESUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNjcgLy8gVGhlIHNvdXJjZSBpbWFnZSBhbmQgZGVzdGluYXRpb24gaW1hZ2UgbXVzdCBiZSBkaWZmZXJlbnQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BPSU5UU1lNQk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA2NiAvLyBJbnZhbGlkIHBvaW50IHN5bWJvbC4KKyNkZWZpbmUgRVJSX0NBTlRfUkVTSVpFX0VYVEVSTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDY1IC8vIENhbm5vdCByZXNpemUgYW4gaW1hZ2UgaW4gYW4gYWNxdWlzaXRpb24gYnVmZmVyLgorI2RlZmluZSBFUlJfRVhURVJOQUxfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNjQgLy8gVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgaW1hZ2VzIGluIGFuIGFjcXVpc2l0aW9uIGJ1ZmZlci4KKyNkZWZpbmUgRVJSX0VYVEVSTkFMX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDYzIC8vIFRoZSBleHRlcm5hbCBidWZmZXIgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBUaGUgbGluZSB3aWR0aCBhbmQgYm9yZGVyIHBpeGVscyBtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLCBhcyB3ZWxsLgorI2RlZmluZSBFUlJfSU5WQUxJRF9UT0xFUkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNjIgLy8gVGhlIHRvbGVyYW5jZSBwYXJhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfV0lORE9XX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDYxIC8vIFRoZSBzaXplIG9mIGVhY2ggZGltZW5zaW9uIG9mIHRoZSB3aW5kb3cgbXVzdCBiZSBncmVhdGVyIHRoYW4gMiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBpbiB0aGUgY29ycmVzcG9uZGluZyBkaW1lbnNpb24uCisjZGVmaW5lIEVSUl9KUEVHMjAwMF9MT1NTTEVTU19XSVRIX0ZMT0FUSU5HX1BPSU5UICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA2MCAvLyBMb3NzbGVzcyBjb21wcmVzc2lvbiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBmbG9hdGluZyBwb2ludCB3YXZlbGV0IHRyYW5zZm9ybSBtb2RlLiBFaXRoZXIgc2V0IHRoZSB3YXZlbGV0IHRyYW5zZm9ybSBtb2RlIHRvIGludGVnZXIsIG9yIHVzZSBsb3NzeSBjb21wcmVzc2lvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFYX0lURVJBVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDU5IC8vIEludmFsaWQgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucy4gTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9ST1RBVElPTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNTggLy8gSW52YWxpZCByb3RhdGlvbiBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TRUFSQ0hfVkVDVE9SX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNTcgLy8gSW52YWxpZCBzZWFyY2ggdmVjdG9yIHdpZHRoLiBUaGUgd2lkdGggbXVzdCBiZSBhbiBvZGQgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRSSVhfTUlSUk9SX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNTYgLy8gSW52YWxpZCBtYXRyaXggbWlycm9yIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0FTUEVDVF9SQVRJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA1NSAvLyBJbnZhbGlkIGFzcGVjdCByYXRpby4gVmFsaWQgYXNwZWN0IHJhdGlvcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DRUxMX0ZJTExfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNTQgLy8gSW52YWxpZCBjZWxsIGZpbGwgdHlwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQk9SREVSX0lOVEVHUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDUzIC8vIEludmFsaWQgYm9yZGVyIGludGVncml0eS4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAxMDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX0RFTU9EVUxBVElPTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA1MiAvLyBJbnZhbGlkIGRlbW9kdWxhdGlvbiBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DRUxMX0ZJTFRFUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNTEgLy8gSW52YWxpZCBjZWxsIGZpbHRlciBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9FQ0NfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNTAgLy8gSW52YWxpZCBFQ0MgdHlwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFUUklYX1BPTEFSSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDQ5IC8vIEludmFsaWQgbWF0cml4IHBvbGFyaXR5LgorI2RlZmluZSBFUlJfSU5WQUxJRF9DRUxMX1NBTVBMRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNDggLy8gSW52YWxpZCBjZWxsIHNhbXBsZSBzaXplLgorI2RlZmluZSBFUlJfSU5WQUxJRF9MSU5FQVJfQVZFUkFHRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNDcgLy8gSW52YWxpZCBsaW5lYXIgYXZlcmFnZSBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NPTlRSQVNUX0ZPUl9ST0kgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNDYgLy8gV2hlbiB1c2luZyBhIHJlZ2lvbiBvZiBpbnRlcmVzdCB0aGF0IGlzIG5vdCBhIHJlY3RhbmdsZSwgeW91IG11c3Qgc3BlY2lmeSB0aGUgY29udHJhc3QgbW9kZSBvZiB0aGUgYmFyY29kZSBhcyBlaXRoZXIgYmxhY2sgb24gd2hpdGUgb3Igd2hpdGUgb24gYmxhY2suCisjZGVmaW5lIEVSUl9JTlZBTElEXzJEX0JBUkNPREVfU1VCVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA0NSAvLyBJbnZhbGlkIDItRCBiYXJjb2RlIERhdGEgTWF0cml4IHN1YnR5cGUuCisjZGVmaW5lIEVSUl9JTlZBTElEXzJEX0JBUkNPREVfU0hBUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjA0NCAvLyBJbnZhbGlkIDItRCBiYXJjb2RlIHNoYXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NFTExfU0hBUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNDMgLy8gSW52YWxpZCAyLUQgYmFyY29kZSBjZWxsIHNoYXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NPTlRSQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwNDIgLy8gSW52YWxpZCAyLUQgYmFyY29kZSBjb250cmFzdC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDQxIC8vIEludmFsaWQgMi1EIGJhcmNvZGUgdHlwZS4KKyNkZWZpbmUgRVJSX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDQwIC8vIENhbm5vdCBhY2Nlc3MgTkktSU1BUSBkcml2ZXIuCisjZGVmaW5lIEVSUl9JT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAzOSAvLyBJL08gZXJyb3IuCisjZGVmaW5lIEVSUl9GSU5EX0NPT1JEU1lTX01PUkVfVEhBTl9PTkVfRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAzOCAvLyBXaGVuIHNlYXJjaGluZyBmb3IgYSBjb29yZGluYXRlIHN5c3RlbSwgdGhlIG51bWJlciBvZiBsaW5lcyB0byBmaXQgbXVzdCBiZSAxLgorI2RlZmluZSBFUlJfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMzcgLy8gVHJpZ2dlciB0aW1lb3V0LgorI2RlZmluZSBFUlJfSU5WQUxJRF9TS0VMRVRPTk1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMzYgLy8gVGhlIFNrZWxldG9uIG1vZGUgeW91IHNwZWNpZmllZCBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfVEVNUExBVEVJTUFHRV9OT0NJUkNMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMzUgLy8gVGhlIHRlbXBsYXRlIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGluZm9ybWF0aW9uIGZvciBsZWFybmluZyB0aGUgYWdncmVzc2l2ZSBzZWFyY2ggc3RyYXRlZ3kuCisjZGVmaW5lIEVSUl9URU1QTEFURUlNQUdFX0VER0VJTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAzNCAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggZWRnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNhbXBsZSBzaXplKHMpIHJlcXVlc3RlZC4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFREVTQ1JJUFRPUl9MRUFSTlNFVFVQREFUQSAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDMzIC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFREVTQ1JJUFRPUl9ST1RBVElPTl9TRUFSQ0hTVFJBVEVHWSAgICAgICAgICAgICAgIC0xMDc0Mzk2MDMyIC8vIFRoZSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3IgdGhlIHJlcXVlc3RlZCBzZWFyY2ggc3RyYXRlZ3kgaW4gcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorI2RlZmluZSBFUlJfSU5WQUxJRF9URVRSQUdPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMzEgLy8gVGhlIGlucHV0IHRldHJhZ29uIG11c3QgaGF2ZSBmb3VyIHBvaW50cy4gVGhlIHBvaW50cyBhcmUgc3BlY2lmaWVkIGNsb2Nrd2lzZSBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGVmdCBwb2ludC4gCisjZGVmaW5lIEVSUl9UT09fTUFOWV9DTEFTU0lGSUNBVElPTl9TRVNTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAzMCAvLyBUaGVyZSBhcmUgdG9vIG1hbnkgY2xhc3NpZmljYXRpb24gc2Vzc2lvbnMgb3Blbi4gIFlvdSBtdXN0IGNsb3NlIGEgc2Vzc2lvbiBiZWZvcmUgeW91IGNhbiBvcGVuIGFub3RoZXIgb25lLgorI2RlZmluZSBFUlJfVElNRV9CT1VOREVEX0VYRUNVVElPTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMjggLy8gTkkgVmlzaW9uIG5vIGxvbmdlciBzdXBwb3J0cyB0aW1lLWJvdW5kZWQgZXhlY3V0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT0xPUl9SRVNPTFVUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMjcgLy8gSW52YWxpZCBDb2xvciBSZXNvbHV0aW9uIGZvciB0aGUgQ29sb3IgQ2xhc3NpZmllcgorI2RlZmluZSBFUlJfSU5WQUxJRF9QUk9DRVNTX1RZUEVfRk9SX0VER0VfREVURUNUSU9OICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMjYgLy8gSW52YWxpZCBwcm9jZXNzIHR5cGUgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9BTkdMRV9SQU5HRV9GT1JfU1RSQUlHSFRfRURHRSAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMjUgLy8gQW5nbGUgcmFuZ2UgdmFsdWUgc2hvdWxkIGJlIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5fQ09WRVJBR0VfRk9SX1NUUkFJR0hUX0VER0UgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMjQgLy8gTWluaW11bSBjb3ZlcmFnZSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX0FOR0xFX1RPTF9GT1JfU1RSQUlHSFRfRURHRSAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAyMyAvLyBUaGUgYW5nbGUgdG9sZXJhbmNlIHNob3VsZCBiZSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gMC4wMDEuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NFQVJDSF9NT0RFX0ZPUl9TVFJBSUdIVF9FREdFICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAyMiAvLyBJbnZhbGlkIHNlYXJjaCBtb2RlIGZvciBkZXRlY3Rpbmcgc3RyYWlnaHQgZWRnZXMKKyNkZWZpbmUgRVJSX0lOVkFMSURfS0VSTkVMX1NJWkVfRk9SX0VER0VfREVURUNUSU9OICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDIxIC8vIEludmFsaWQga2VybmVsIHNpemUgZm9yIGVkZ2UgZGV0ZWN0aW9uLiBUaGUgbWluaW11bSBrZXJuZWwgc2l6ZSBpcyAzLCB0aGUgbWF4aW11bSBrZXJuZWwgc2l6ZSBpcyAxMDczNzQxODIzIGFuZCB0aGUga2VybmVsIHNpemUgbXVzdCBiZSBvZGQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0dSQURJTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAyMCAvLyBJbnZhbGlkIGdyYWRpbmcgbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVEhSRVNIT0xEX1BFUkNFTlRBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDE5IC8vIEludmFsaWQgdGhyZXNob2xkIHBlcmNlbnRhZ2UuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMTAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9FREdFX1BPTEFSSVRZX1NFQVJDSF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTggLy8gSW52YWxpZCBlZGdlIHBvbGFyaXR5IHNlYXJjaCBtb2RlLgorI2RlZmluZSBFUlJfT1BFTklOR19ORVdFUl9BSU1fR1JBRElOR19EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTcgLy8gVGhlIEFJTSBncmFkaW5nIGRhdGEgYXR0YWNoZWQgdG8gdGhlIGltYWdlIHlvdSB0cmllZCB0byBvcGVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBmaWxlLgorI2RlZmluZSBFUlJfTk9fVklERU9fRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTYgLy8gTm8gdmlkZW8gZHJpdmVyIGlzIGluc3RhbGxlZC4KKyNkZWZpbmUgRVJSX1JQQ19FWEVDVVRFX0lWQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDE1IC8vIFVuYWJsZSB0byBlc3RhYmxpc2ggbmV0d29yayBjb25uZWN0aW9uIHdpdGggcmVtb3RlIHN5c3RlbS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVklERU9fQkxJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDE0IC8vIFJUIFZpZGVvIE91dCBkb2VzIG5vdCBzdXBwb3J0IGRpc3BsYXlpbmcgdGhlIHN1cHBsaWVkIGltYWdlIHR5cGUgYXQgdGhlIHNlbGVjdGVkIGNvbG9yIGRlcHRoLgorI2RlZmluZSBFUlJfSU5WQUxJRF9WSURFT19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTMgLy8gSW52YWxpZCB2aWRlbyBtb2RlLgorI2RlZmluZSBFUlJfUlBDX0VYRUNVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTIgLy8gVW5hYmxlIHRvIGRpc3BsYXkgcmVtb3RlIGltYWdlIG9uIG5ldHdvcmsgY29ubmVjdGlvbi4KKyNkZWZpbmUgRVJSX1JQQ19CSU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDExIC8vIFVuYWJsZSB0byBlc3RhYmxpc2ggbmV0d29yayBjb25uZWN0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9GUkFNRV9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMTAgLy8gSW52YWxpZCBmcmFtZSBudW1iZXIuCisjZGVmaW5lIEVSUl9ESVJFQ1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAwOSAvLyBBbiBpbnRlcm5hbCBEaXJlY3RYIGVycm9yIGhhcyBvY2N1cnJlZC4gIFRyeSB1cGdyYWRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIERpcmVjdFguCisjZGVmaW5lIEVSUl9ESVJFQ1RYX05PX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAwOCAvLyBBbiBhcHByb3ByaWF0ZSBEaXJlY3RYIGZpbHRlciB0byBwcm9jZXNzIHRoaXMgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQuICBJbnN0YWxsIHRoZSBmaWx0ZXIgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBBVkkuIFVwZ3JhZGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgRGlyZWN0WCBtYXkgY29ycmVjdCB0aGlzIGVycm9yLiAgTkkgVmlzaW9uIHJlcXVpcmVzIERpcmVjdFggOC4xIG9yIGhpZ2hlci4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfSU5DT01QQVRJQkxFX0NPTVBSRVNTSU9OX0ZJTFRFUiAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDA3IC8vIEluY29tcGF0aWJsZSBjb21wcmVzc2lvbiBmaWx0ZXIuCisjZGVmaW5lIEVSUl9ESVJFQ1RYX1VOS05PV05fQ09NUFJFU1NJT05fRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAwNiAvLyBVbmtub3duIGNvbXByZXNzaW9uIGZpbHRlci4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQVZJX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk2MDA1IC8vIEludmFsaWQgQVZJIHNlc3Npb24uCisjZGVmaW5lIEVSUl9ESVJFQ1RYX0NFUlRJRklDQVRJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAwNCAvLyBBIHNvZnR3YXJlIGtleSBpcyByZXN0cmljdGluZyB0aGUgdXNlIG9mIHRoaXMgY29tcHJlc3Npb24gZmlsdGVyLgorI2RlZmluZSBFUlJfQVZJX0RBVEFfRVhDRUVEU19CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMDMgLy8gVGhlIGRhdGEgZm9yIHRoaXMgZnJhbWUgZXhjZWVkcyB0aGUgZGF0YSBidWZmZXIgc2l6ZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgQVZJIGZpbGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0xJTkVHQVVHRU1FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAwMiAvLyBJbnZhbGlkIGxpbmUgZ2F1Z2UgbWV0aG9kLgorI2RlZmluZSBFUlJfVE9PX01BTllfQVZJX1NFU1NJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTYwMDEgLy8gVGhlcmUgYXJlIHRvbyBtYW55IEFWSSBzZXNzaW9ucyBvcGVuLiAgWW91IG11c3QgY2xvc2UgYSBzZXNzaW9uIGJlZm9yZSB5b3UgY2FuIG9wZW4gYW5vdGhlciBvbmUuCisjZGVmaW5lIEVSUl9GSUxFX0ZJTEVfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NjAwMCAvLyBJbnZhbGlkIGZpbGUgaGVhZGVyLgorI2RlZmluZSBFUlJfRklMRV9GSUxFX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5OTkgLy8gSW52YWxpZCBmaWxlIHR5cGUuCisjZGVmaW5lIEVSUl9GSUxFX0NPTE9SX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk5OCAvLyBJbnZhbGlkIGNvbG9yIHRhYmxlLgorI2RlZmluZSBFUlJfRklMRV9BUkdFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5OTcgLy8gSW52YWxpZCBwYXJhbWV0ZXIuCisjZGVmaW5lIEVSUl9GSUxFX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk5NiAvLyBGaWxlIGlzIGFscmVhZHkgb3BlbiBmb3Igd3JpdGluZy4KKyNkZWZpbmUgRVJSX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTk1IC8vIEZpbGUgbm90IGZvdW5kLgorI2RlZmluZSBFUlJfRklMRV9UT09fTUFOWV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5OTQgLy8gVG9vIG1hbnkgZmlsZXMgb3Blbi4KKyNkZWZpbmUgRVJSX0ZJTEVfSU9fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTkzIC8vIEZpbGUgSS9PIGVycm9yLgorI2RlZmluZSBFUlJfRklMRV9QRVJNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5OTIgLy8gRmlsZSBhY2Nlc3MgZGVuaWVkLgorI2RlZmluZSBFUlJfRklMRV9JTlZBTElEX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5OTEgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpbGUgdHlwZSB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfRklMRV9HRVRfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5OTAgLy8gQ291bGQgbm90IHJlYWQgVmlzaW9uIGluZm8gZnJvbSBmaWxlLgorI2RlZmluZSBFUlJfRklMRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODkgLy8gVW5hYmxlIHRvIHJlYWQgZGF0YS4KKyNkZWZpbmUgRVJSX0ZJTEVfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTg4IC8vIFVuYWJsZSB0byB3cml0ZSBkYXRhLgorI2RlZmluZSBFUlJfRklMRV9FT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODcgLy8gUHJlbWF0dXJlIGVuZCBvZiBmaWxlLgorI2RlZmluZSBFUlJfRklMRV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODYgLy8gSW52YWxpZCBmaWxlIGZvcm1hdC4KKyNkZWZpbmUgRVJSX0ZJTEVfT1BFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTg1IC8vIEludmFsaWQgZmlsZSBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9GSUxFX0lOVkFMSURfREFUQV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk4NCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgZmlsZSBkYXRhIHR5cGUgeW91IHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0ZJTEVfTk9fU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTgzIC8vIERpc2sgZnVsbC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRlJBTUVTX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTgyIC8vIFRoZSBmcmFtZXMgcGVyIHNlY29uZCBpbiBhbiBBVkkgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4KKyNkZWZpbmUgRVJSX0lOU1VGRklDSUVOVF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTgxIC8vIFRoZSBidWZmZXIgdGhhdCB3YXMgcGFzc2VkIGluIGlzIG5vdCBiaWcgZW5vdWdoIHRvIGhvbGQgYWxsIG9mIHRoZSBkYXRhLgorI2RlZmluZSBFUlJfQ09NX0lOSVRJQUxJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5ODAgLy8gRXJyb3IgaW5pdGlhbGl6aW5nIENPTS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUEFSVElDTEVfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTc5IC8vIFRoZSBpbWFnZSBoYXMgaW52YWxpZCBwYXJ0aWNsZSBpbmZvcm1hdGlvbi4gIENhbGwgaW1hcUNvdW50UGFydGljbGVzIG9uIHRoZSBpbWFnZSB0byBjcmVhdGUgcGFydGljbGUgaW5mb3JtYXRpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk3OCAvLyBJbnZhbGlkIHBhcnRpY2xlIG51bWJlci4KKyNkZWZpbmUgRVJSX0FWSV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTc3IC8vIFRoZSBBVkkgZmlsZSB3YXMgY3JlYXRlZCBpbiBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIEFWSSBmaWxlLgorI2RlZmluZSBFUlJfTlVNQkVSX09GX1BBTEVUVEVfQ09MT1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NzYgLy8gVGhlIGNvbG9yIHBhbGV0dGUgbXVzdCBoYXZlIGV4YWN0bHkgMCBvciAyNTYgZW50cmllcy4KKyNkZWZpbmUgRVJSX0FWSV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTc1IC8vIERpcmVjdFggaGFzIHRpbWVkIG91dCByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIEFWSSBmaWxlLiAgV2hlbiBjbG9zaW5nIGFuIEFWSSBmaWxlLCB0cnkgYWRkaW5nIGFuIGFkZGl0aW9uYWwgZGVsYXkuICBXaGVuIHJlYWRpbmcgYW4gQVZJIGZpbGUsIHRyeSByZWR1Y2luZyBDUFUgYW5kIGRpc2sgbG9hZC4KKyNkZWZpbmUgRVJSX1VOU1VQUE9SVEVEX0pQRUcyMDAwX0NPTE9SU1BBQ0VfTUVUSE9EICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTc0IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgSlBFRzIwMDAgZmlsZXMgd2l0aCB0aGlzIGNvbG9yc3BhY2UgbWV0aG9kLgorI2RlZmluZSBFUlJfSlBFRzIwMDBfVU5TVVBQT1JURURfTVVMVElQTEVfTEFZRVJTICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NzMgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBKUEVHMjAwMCBmaWxlcyB3aXRoIG1vcmUgdGhhbiBvbmUgbGF5ZXIuCisjZGVmaW5lIEVSUl9ESVJFQ1RYX0VOVU1FUkFURV9GSUxURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk3MiAvLyBEaXJlY3RYIGlzIHVuYWJsZSB0byBlbnVtZXJhdGUgdGhlIGNvbXByZXNzaW9uIGZpbHRlcnMuIFRoaXMgaXMgY2F1c2VkIGJ5IGEgdGhpcmQtcGFydHkgY29tcHJlc3Npb24gZmlsdGVyIHRoYXQgaXMgZWl0aGVyIGltcHJvcGVybHkgaW5zdGFsbGVkIG9yIGlzIHByZXZlbnRpbmcgaXRzZWxmIGZyb20gYmVpbmcgZW51bWVyYXRlZC4gUmVtb3ZlIGFueSByZWNlbnRseSBpbnN0YWxsZWQgY29tcHJlc3Npb24gZmlsdGVycyBhbmQgdHJ5IGFnYWluLgorI2RlZmluZSBFUlJfSU5WQUxJRF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NzEgLy8gVGhlIG9mZnNldCB5b3Ugc3BlY2lmaWVkIG11c3QgYmUgc2l6ZSAyLgorI2RlZmluZSBFUlJfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NjAgLy8gSW5pdGlhbGl6YXRpb24gZXJyb3IuCisjZGVmaW5lIEVSUl9DUkVBVEVfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk1OSAvLyBVbmFibGUgdG8gY3JlYXRlIHdpbmRvdy4KKyNkZWZpbmUgRVJSX1dJTkRPV19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTU4IC8vIEludmFsaWQgd2luZG93IElELgorI2RlZmluZSBFUlJfQVJSQVlfU0laRV9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NTcgLy8gVGhlIGFycmF5IHNpemVzIGFyZSBub3QgY29tcGF0aWJsZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTU2IC8vIFRoZSBxdWFsaXR5IHlvdSBwcm92aWRlZCBpcyBpbnZhbGlkLiBWYWxpZCBxdWFsaXR5IHZhbHVlcyByYW5nZSBmcm9tIC0xIHRvIDEwMDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX01BWF9XQVZFTEVUX1RSQU5TRk9STV9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk1NSAvLyBJbnZhbGlkIG1heGltdW0gd2F2ZWxldCB0cmFuc2Zvcm0gbGV2ZWwuICBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUVVBTlRJWkFUSU9OX1NURVBfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTU0IC8vIFRoZSBxdWFudGl6YXRpb24gc3RlcCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX1dBVkVMRVRfVFJBTlNGT1JNX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk1MyAvLyBJbnZhbGlkIHdhdmVsZXQgdHJhbnNmb3JtIG1vZGUuCisjZGVmaW5lIEVSUl9ST0lfTk9UX1BPSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk1MiAvLyBUaGUgUk9JIG11c3Qgb25seSBoYXZlIGEgc2luZ2xlIFBvaW50IGNvbnRvdXIuCisjZGVmaW5lIEVSUl9ST0lfTk9UX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk1MSAvLyBUaGUgUk9JIG11c3Qgb25seSBoYXZlIFBvaW50IGNvbnRvdXJzLgorI2RlZmluZSBFUlJfUk9JX05PVF9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5NTAgLy8gVGhlIFJPSSBtdXN0IG9ubHkgaGF2ZSBhIHNpbmdsZSBMaW5lIGNvbnRvdXIuCisjZGVmaW5lIEVSUl9ST0lfTk9UX0FOTlVMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk0OSAvLyBUaGUgUk9JIG11c3Qgb25seSBoYXZlIGEgc2luZ2xlIEFubnVsdXMgY29udG91ci4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUVBU1VSRV9QQVJUSUNMRVNfQ0FMSUJSQVRJT05fTU9ERSAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQ4IC8vIEludmFsaWQgbWVhc3VyZSBwYXJ0aWNsZXMgY2FsaWJyYXRpb24gbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUEFSVElDTEVfQ0xBU1NJRklFUl9USFJFU0hPTERfVFlQRSAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQ3IC8vIEludmFsaWQgcGFydGljbGUgY2xhc3NpZmllciB0aHJlc2hvbGQgdHlwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRElTVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQ2IC8vIEludmFsaWQgQ29sb3IgU2VnbWVudGF0aW9uIERpc3RhbmNlCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFX0FSRUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk0NSAvLyBJbnZhbGlkIENvbG9yIFNlZ21lbmF0aW9uIFBhcnRpY2xlIEFyZWEKKyNkZWZpbmUgRVJSX0NMQVNTX05BTUVfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQ0IC8vIFJlcXVpcmVkIENsYXNzIG5hbWUgaXMgbm90IGZvdW5kIGluIHRyYWluZWQgbGFiZWxzL0NsYXNzIG5hbWVzCisjZGVmaW5lIEVSUl9OVU1CRVJfTEFCRUxfTElNSVRfRVhDRUVERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk0MyAvLyBOdW1iZXIgb2YgTGFiZWxzIGV4Y2VlZGVkIGxpbWl0IG9mIGxhYmVsIEltYWdlIHR5cGUKKyNkZWZpbmUgRVJSX0lOVkFMSURfRElTVEFOQ0VfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTQyIC8vIEludmFsaWQgQ29sb3IgU2VnbWVudGF0aW9uIGRpc3RhbmNlIGxldmVsCisjZGVmaW5lIEVSUl9JTlZBTElEX1NWTV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk0MSAvLyBJbnZhbGlkIFNWTSBtb2RlbCB0eXBlCisjZGVmaW5lIEVSUl9JTlZBTElEX1NWTV9LRVJORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTk0MCAvLyBJbnZhbGlkIFNWTSBrZXJuZWwgdHlwZQorI2RlZmluZSBFUlJfTk9fU1VQUE9SVF9WRUNUT1JfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MzkgLy8gTm8gU3VwcG9ydCBWZWN0b3IgaXMgZm91bmQgYXQgU1ZNIHRyYWluaW5nCisjZGVmaW5lIEVSUl9DT1NUX0xBQkVMX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkzOCAvLyBMYWJlbCBuYW1lIGlzIG5vdCBmb3VuZCBpbiBhZGRlZCBzYW1wbGVzCisjZGVmaW5lIEVSUl9FWENFRURFRF9TVk1fTUFYX0lURVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkzNyAvLyBTVk0gdHJhaW5pbmcgZXhjZWVkZWQgbWF4aW1pbSBJdGVyYXRpb24gbGltaXQKKyNkZWZpbmUgRVJSX0lOVkFMSURfU1ZNX1BBUkFNRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTM2IC8vIEludmFsaWQgU1ZNIFBhcmFtZXRlcgorI2RlZmluZSBFUlJfSU5WQUxJRF9JREVOVElGSUNBVElPTl9TQ09SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MzUgLy8gSW52YWxpZCBJZGVudGlmaWNhdGlvbiBzY29yZS4gTXVzdCBiZSBiZXR3ZWVuIDAtMTAwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVEVYVFVSRV9GRUFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTM0IC8vIFJlcXVlc3RlZCBmb3IgaW52YWxpZCB0ZXh0dXJlIGZlYXR1cmUKKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09PQ0NVUlJFTkNFX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTMzIC8vIFRoZSBjb09jY3VycmVuY2UgTGV2ZWwgbXVzdCBsaWUgYmV0d2VlbiAxIGFuZCB0aGUgbWF4aW11bSBwaXhlbCB2YWx1ZSBvZiBhbiBpbWFnZSAoMjU1IGZvciBVOCBpbWFnZSkKKyNkZWZpbmUgRVJSX0lOVkFMSURfV0FWRUxFVF9TVUJCQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1OTMyIC8vIFJlcXVlc3QgZm9yIGludmFsaWQgd2F2ZWxldCBzdWJCYW5kCisjZGVmaW5lIEVSUl9JTlZBTElEX0ZJTkFMX1NURVBfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkzMSAvLyBUaGUgZmluYWwgc3RlcCBzaXplIG11c3QgYmUgbGVzc2VyIHRoYW4gdGhlIGluaXRpYWwgc3RlcCBzaXplCisjZGVmaW5lIEVSUl9JTlZBTElEX0VORVJHWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkzMCAvLyBNaW5pbXVtIEVuZXJneSBzaG91bGQgbGllIGJldHdlZW4gMCBhbmQgMTAwCisjZGVmaW5lIEVSUl9JTlZBTElEX1RFWFRVUkVfTEFCRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkyOSAvLyBUaGUgY2xhc3NpZmljYXRpb24gbGFiZWwgbXVzdCBiZSB0ZXh0dXJlIG9yIGRlZmVjdCBmb3IgdGV4dHVyZSBkZWZlY3QgY2xhc3NpZmllcgorI2RlZmluZSBFUlJfSU5WQUxJRF9XQVZFTEVUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MjggLy8gVGhlIHdhdmVsZXQgdHlwZSBpcyBpbnZhbGlkCisjZGVmaW5lIEVSUl9TQU1FX1dBVkVMRVRfQkFORFNfU0VMRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTkyNyAvLyBTYW1lIFdhdmVsZXQgYmFuZCBpcyBzZWxlY3RlZCBtdWx0aXBsZSB0aW1lcworI2RlZmluZSBFUlJfSU1BR0VfU0laRV9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MjYgLy8gVGhlIHR3byBpbnB1dCBpbWFnZSBzaXplcyBhcmUgZGlmZmVyZW50IAorI2RlZmluZSBFUlJfTlVNQkVSX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU5MjAgLy8gSW52YWxpZCBudW1iZXIgb2YgY2xhc3Nlcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTFVDQVNfS0FOQURFX1dJTkRPV19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODg4IC8vIEJvdGggZGltZW5zaW9ucyBvZiB0aGUgd2luZG93IHNpemUgc2hvdWxkIGJlIG9kZCwgZ3JlYXRlciB0aGFuIDIgYW5kIGxlc3MgdGhhbiAxNi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFUUklYX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODg3IC8vIFRoZSB0eXBlIG9mIG1hdHJpeCBzdXBwbGllZCB0byB0aGUgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfT1BUSUNBTF9GTE9XX1RFUk1JTkFUSU9OX0NSSVRFUklBX1RZUEUgICAgICAgICAgIC0xMDc0Mzk1ODg2IC8vIEFuIGludmFsaWQgdGVybWluYXRpb24gY3JpdGVyaWEgd2FzIHNwZWNpZmllZCBmb3IgdGhlIG9wdGljYWwgZmxvdyBjb21wdXRhdGlvbi4KKyNkZWZpbmUgRVJSX0xLUF9OVUxMX1BZUkFNSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODg1IC8vIFRoZSBweXJhbWlkIGxldmVscyB3aGVyZSBub3QgcHJvcGVybHkgYWxsb2NhdGVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9QWVJBTUlEX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4ODQgLy8gVGhlIHB5cmFtaWQgbGV2ZWwgc3BlY2lmaWVkIGNhbm5vdCBiZSBuZWdhdGl2ZQorI2RlZmluZSBFUlJfSU5WQUxJRF9MS1BfS0VSTkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4ODMgLy8gVGhlIGtlcm5lbCBtdXN0IGJlIHN5bW1ldHJpYyAgd2l0aCBub24temVybyBjb2VmZmljaWVudHMgYW5kIG9mIG9kZCBzaXplCisjZGVmaW5lIEVSUl9JTlZBTElEX0hPUk5fU0NIVU5DS19MQU1CREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTg4MiAvLyBJbnZhbGlkIHNtb290aGluZyBwYXJhbWV0ZXIgaW4gSG9ybiBTY2h1bmNrIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSE9STl9TQ0hVTkNLX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODgxIC8vIEludmFsaWQgc3RvcHBpbmcgY3JpdGVyaWEgdHlwZSBmb3IgSG9ybiBTY2h1bmNrIG9wdGljYWwgZmxvdy4KKyNkZWZpbmUgRVJSX1BBUlRJQ0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODgwIC8vIEludmFsaWQgcGFydGljbGUuCisjZGVmaW5lIEVSUl9CQURfTUVBU1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTg3OSAvLyBJbnZhbGlkIG1lYXN1cmUgbnVtYmVyLgorI2RlZmluZSBFUlJfUFJPUF9OT0RFX1dSSVRFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4NzggLy8gVGhlIEltYWdlIERpc3BsYXkgY29udHJvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgdGhpcyBwcm9wZXJ0eSBub2RlLgorI2RlZmluZSBFUlJfQ09MT1JNT0RFX1JFUVVJUkVTX0NIQU5HRUNPTE9SU1BBQ0UyICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4NzcgLy8gVGhlIHNwZWNpZmllZCBjb2xvciBtb2RlIHJlcXVpcmVzIHRoZSB1c2Ugb2YgaW1hcUNoYW5nZUNvbG9yU3BhY2UyLgorI2RlZmluZSBFUlJfVU5TVVBQT1JURURfQ09MT1JfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4NzYgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgY29sb3IgbW9kZSB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfQkFSQ09ERV9QSEFSTUFDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4NzUgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgUGhhcm1hY29kZSBzeW1ib2wKKyNkZWZpbmUgRVJSX0JBRF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1ODQwIC8vIEludmFsaWQgaGFuZGxlIHRhYmxlIGluZGV4LgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT01QUkVTU0lPTl9SQVRJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4MzcgLy8gVGhlIGNvbXByZXNzaW9uIHJhdGlvIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9DT05UT1VSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTgwMSAvLyBUaGUgUk9JIGNvbnRhaW5zIHRvbyBtYW55IGNvbnRvdXJzLgorI2RlZmluZSBFUlJfUFJPVEVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU4MDAgLy8gUHJvdGVjdGlvbiBlcnJvci4KKyNkZWZpbmUgRVJSX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzk5IC8vIEludGVybmFsIGVycm9yLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DVVNUT01fU0FNUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3OTggLy8gVGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgdmVjdG9yIGluIHRoZSBjdXN0b20gc2FtcGxlIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgdGhvc2UgeW91IGhhdmUgYWxyZWFkeSBhZGRlZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ0xBU1NJRklFUl9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzk3IC8vIE5vdCBhIHZhbGlkIGNsYXNzaWZpZXIgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfS05OX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzk2IC8vIFlvdSByZXF1ZXN0ZWQgYW4gaW52YWxpZCBOZWFyZXN0IE5laWdoYm9yIGNsYXNzaWZpZXIgbWV0aG9kLgorI2RlZmluZSBFUlJfS19UT09fTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3OTUgLy8gVGhlIGsgcGFyYW1ldGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHR3by4KKyNkZWZpbmUgRVJSX0tfVE9PX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzk0IC8vIFRoZSBrIHBhcmFtZXRlciBtdXN0IGJlIDw9IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiBlYWNoIGNsYXNzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9PUEVSQVRJT05fT05fQ09NUEFDVF9TRVNTSU9OX0FUVEVNUFRFRCAgICAgICAgICAgLTEwNzQzOTU3OTMgLy8gVGhpcyBjbGFzc2lmaWVyIHNlc3Npb24gaXMgY29tcGFjdC4gT25seSB0aGUgQ2xhc3NpZnkgYW5kIERpc3Bvc2UgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgb24gYSBjb21wYWN0IGNsYXNzaWZpZXIgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0NMQVNTSUZJRVJfU0VTU0lPTl9OT1RfVFJBSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzkyIC8vIFRoaXMgY2xhc3NpZmllciBzZXNzaW9uIGlzIG5vdCB0cmFpbmVkLiBZb3UgbWF5IG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uIGEgdHJhaW5lZCBjbGFzc2lmaWVyIHNlc3Npb24uCisjZGVmaW5lIEVSUl9DTEFTU0lGSUVSX0lOVkFMSURfU0VTU0lPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc5MSAvLyBUaGlzIGNsYXNzaWZpZXIgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBvbiB0aGlzIHR5cGUgb2YgY2xhc3NpZmllciBzZXNzaW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9ESVNUQU5DRV9NRVRSSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3OTAgLy8gWW91IHJlcXVlc3RlZCBhbiBpbnZhbGlkIGRpc3RhbmNlIG1ldHJpYy4KKyNkZWZpbmUgRVJSX09QRU5JTkdfTkVXRVJfQ0xBU1NJRklFUl9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzg5IC8vIFRoZSBjbGFzc2lmaWVyIHNlc3Npb24geW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9OT19TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc4OCAvLyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgeW91IGhhdmUgbm90IGFkZGVkIGFueSBzYW1wbGVzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DTEFTU0lGSUVSX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3ODcgLy8gWW91IHJlcXVlc3RlZCBhbiBpbnZhbGlkIGNsYXNzaWZpZXIgdHlwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUEFSVElDTEVfT1BUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzg2IC8vIFRoZSBzdW0gb2YgU2NhbGUgRGVwZW5kZW5jZSBhbmQgU3ltbWV0cnkgRGVwZW5kZW5jZSBtdXN0IGJlIGxlc3MgdGhhbiAxMDAwLgorI2RlZmluZSBFUlJfTk9fUEFSVElDTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3ODUgLy8gVGhlIGltYWdlIHlpZWxkZWQgbm8gcGFydGljbGVzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9MSU1JVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3ODQgLy8gVGhlIGxpbWl0cyB5b3Ugc3VwcGxpZWQgYXJlIG5vdCB2YWxpZC4KKyNkZWZpbmUgRVJSX0JBRF9TQU1QTEVfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzgzIC8vIFRoZSBTYW1wbGUgSW5kZXggZmVsbCBvdXRzaWRlIHRoZSByYW5nZSBvZiBTYW1wbGVzLgorI2RlZmluZSBFUlJfREVTQ1JJUFRJT05fVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3ODIgLy8gVGhlIGRlc2NyaXB0aW9uIG11c3QgYmUgPD0gMjU1IGNoYXJhY3RlcnMuCisjZGVmaW5lIEVSUl9DTEFTU0lGSUVSX0lOVkFMSURfRU5HSU5FX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc4MSAvLyBUaGUgZW5naW5lIGZvciB0aGlzIGNsYXNzaWZpZXIgc2Vzc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9QQVJUSUNMRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3ODAgLy8gWW91IHJlcXVlc3RlZCBhbiBpbnZhbGlkIHBhcnRpY2xlIHR5cGUuCisjZGVmaW5lIEVSUl9DQU5OT1RfQ09NUEFDVF9VTlRSQUlORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc3OSAvLyBZb3UgbWF5IG9ubHkgc2F2ZSBhIHNlc3Npb24gaW4gY29tcGFjdCBmb3JtIGlmIGl0IGlzIHRyYWluZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0tFUk5FTF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc3OCAvLyBUaGUgS2VybmVsIHNpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGhlIGltYWdlIHNpemUuCisjZGVmaW5lIEVSUl9JTkNPTVBBVElCTEVfQ0xBU1NJRklFUl9UWVBFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc3NyAvLyBUaGUgc2Vzc2lvbiB5b3UgcmVhZCBmcm9tIGZpbGUgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBzZXNzaW9uIHlvdSBwYXNzZWQgaW4uCisjZGVmaW5lIEVSUl9JTlZBTElEX1VTRV9PRl9DT01QQUNUX1NFU1NJT05fRklMRSAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc3NiAvLyBZb3UgY2FuIG5vdCB1c2UgYSBjb21wYWN0IGNsYXNzaWZpY2F0aW9uIGZpbGUgd2l0aCByZWFkIG9wdGlvbnMgb3RoZXIgdGhhbiBSZWFkIEFsbC4KKyNkZWZpbmUgRVJSX1JPSV9IQVNfT1BFTl9DT05UT1VSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzc1IC8vIFRoZSBST0kgeW91IHBhc3NlZCBpbiBtYXkgb25seSBjb250YWluIGNsb3NlZCBjb250b3Vycy4KKyNkZWZpbmUgRVJSX05PX0xBQkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Nzc0IC8vIFlvdSBtdXN0IHBhc3MgaW4gYSBsYWJlbC4KKyNkZWZpbmUgRVJSX05PX0RFU1RfSU1BR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzczIC8vIFlvdSBtdXN0IHByb3ZpZGUgYSBkZXN0aW5hdGlvbiBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUkVHSVNUUkFUSU9OX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzcyIC8vIFlvdSBwcm92aWRlZCBhbiBpbnZhbGlkIHJlZ2lzdHJhdGlvbiBtZXRob2QuCisjZGVmaW5lIEVSUl9PUEVOSU5HX05FV0VSX0lOU1BFQ1RJT05fVEVNUExBVEUgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc3MSAvLyBUaGUgZ29sZGVuIHRlbXBsYXRlIHlvdSB0cmllZCB0byBvcGVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBmaWxlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9JTlNQRUNUSU9OX1RFTVBMQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NzAgLy8gSW52YWxpZCBnb2xkZW4gdGVtcGxhdGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0VER0VfVEhJQ0tORVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc2OSAvLyBFZGdlIFRoaWNrbmVzcyB0byBJZ25vcmUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzY4IC8vIFNjYWxlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc2NyAvLyBUaGUgc3VwcGxpZWQgc2NhbGUgaXMgaW52YWxpZCBmb3IgeW91ciB0ZW1wbGF0ZS4KKyNkZWZpbmUgRVJSX0RFUFJFQ0FURURfRlVOQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzY2IC8vIFRoaXMgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZnVuY3Rpb24gY2FuIG5vdCBiZSB1c2VkIHdpdGggdGhpcyBzZXNzaW9uLiBVc2UgbmV3ZXIsIHN1cHBvcnRlZCBmdW5jdGlvbnMgaW5zdGVhZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTk9STUFMSVpBVElPTl9NRVRIT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzYzIC8vIFlvdSBtdXN0IHByb3ZpZGUgYSB2YWxpZCBub3JtYWxpemF0aW9uIG1ldGhvZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTklCTEFDS19ERVZJQVRJT05fRkFDVE9SICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzYyIC8vIFRoZSBkZXZpYXRpb24gZmFjdG9yIGZvciBOaWJsYWNrIGxvY2FsIHRocmVzaG9sZCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMS4KKyNkZWZpbmUgRVJSX0JPQVJEX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzYwIC8vIEJvYXJkIG5vdCBmb3VuZC4KKyNkZWZpbmUgRVJSX0JPQVJEX05PVF9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzU4IC8vIEJvYXJkIG5vdCBvcGVuZWQuCisjZGVmaW5lIEVSUl9ETExfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc1NyAvLyBETEwgbm90IGZvdW5kLgorI2RlZmluZSBFUlJfRExMX0ZVTkNUSU9OX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NTYgLy8gRExMIGZ1bmN0aW9uIG5vdCBmb3VuZC4KKyNkZWZpbmUgRVJSX1RSSUdfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzU0IC8vIFRyaWdnZXIgdGltZW91dC4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfSU5WQUxJRF9SRUZJTkVNRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzQ2IC8vIEludmFsaWQgbnVtYmVyIHNwZWNpZmllZCBmb3IgbWF4aW11bSBjb250b3VyIHJlZmluZW1lbnRzLgorI2RlZmluZSBFUlJfVE9PX01BTllfQ1VSVkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3NDUgLy8gVG9vIG1hbnkgY3VydmVzIGV4dHJhY3RlZCBmcm9tIGltYWdlLiBSYWlzZSB0aGUgZWRnZSB0aHJlc2hvbGQgb3IgcmVkdWNlIHRoZSBST0kuCisjZGVmaW5lIEVSUl9DT05UT1VSX0lOVkFMSURfS0VSTkVMX0ZPUl9TTU9PVEhJTkcgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc0NCAvLyBJbnZhbGlkIGtlcm5lbCBmb3IgY29udG91ciBzbW9vdGhpbmcuIFplcm8gaW5kaWNhdGVzIG5vIHNtb290aGluZywgb3RoZXJ3aXNlIHZhbHVlIG11c3QgYmUgb2RkLiAKKyNkZWZpbmUgRVJSX0NPTlRPVVJfTElORV9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzQzIC8vIFRoZSBjb250b3VyIGxpbmUgZml0IGlzIGludmFsaWQuIExpbmUgc2VnbWVudCBzdGFydCBhbmQgc3RvcCBtdXN0IGRpZmZlci4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfVEVNUExBVEVfSU1BR0VfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzQyIC8vIFRoZSB0ZW1wbGF0ZSBpbWFnZSBtdXN0IGJlIHRyYWluZWQgd2l0aCBJTUFRIExlYXJuIENvbnRvdXIgUGF0dGVybiBvciBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSB0YXJnZXQgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT05UT1VSX0dQTV9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc0MSAvLyBNYXRjaGluZyBmYWlsZWQgdG8gYWxpZ24gdGhlIHRlbXBsYXRlIGFuZCB0YXJnZXQgY29udG91cnMuCisjZGVmaW5lIEVSUl9DT05UT1VSX09QRU5JTkdfTkVXRVJfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTc0MCAvLyBUaGUgY29udG91ciB5b3UgdHJpZWQgdG8gb3BlbiB3YXMgY3JlYXRlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoaXMgZmlsZS4gCisjZGVmaW5lIEVSUl9DT05UT1VSX0NPTk5FQ1RfRFVQTElDQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczOSAvLyBPbmx5IG9uZSByYW5nZSBpcyBhbGxvd2VkIHBlciBjdXJ2ZSBjb25uZWN0aW9uIGNvbnN0cmFpbnQgdHlwZS4gCisjZGVmaW5lIEVSUl9DT05UT1VSX0NPTk5FQ1RfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczOCAvLyBJbnZhbGlkIGNvbnRvdXIgY29ubmVjdGlvbiBjb25zdHJhaW50IHR5cGUuIAorI2RlZmluZSBFUlJfQ09OVE9VUl9NQVRDSF9TVFJfTk9UX0FQUExJQ0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MzcgLy8gSW4gb3JkZXIgdG8gdXNlIGNvbnRvdXIgbWF0Y2hpbmcsIHlvdSBtdXN0IHByb3ZpZGUgYSB0ZW1wbGF0ZSBpbWFnZSB0aGF0IGhhcyBiZWVuIHRyYWluZWQgd2l0aCBJTUFRIExlYXJuIENvbnRvdXIgUGF0dGVybgorI2RlZmluZSBFUlJfQ09OVE9VUl9DVVJWQVRVUkVfS0VSTkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MzYgLy8gSW52YWxpZCBrZXJuZWwgd2lkdGggZm9yIGN1cnZhdHVyZSBjYWxjdWxhdGlvbi4gTXVzdCBiZSBhbiBvZGQgdmFsdWUgZ3JlYXRlciB0aGFuIDEuIAorI2RlZmluZSBFUlJfQ09OVE9VUl9FWFRSQUNUX1NFTEVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MzUgLy8gSW52YWxpZCBDb250b3VyIFNlbGVjdGlvbiBtZXRob2QgZm9yIGNvbnRvdXIgZXh0cmFjdGlvbi4gCisjZGVmaW5lIEVSUl9DT05UT1VSX0VYVFJBQ1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczNCAvLyBJbnZhbGlkIFNlYXJjaCBEaXJlY3Rpb24gZm9yIGNvbnRvdXIgZXh0cmFjdGlvbi4gCisjZGVmaW5lIEVSUl9DT05UT1VSX0VYVFJBQ1RfUk9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczMyAvLyBJbnZhbGlkIFJPSSBmb3IgY29udG91ciBleHRyYWN0aW9uLiBUaGUgUk9JIG11c3QgY29udGFpbiBhbiBhbm51bHVzLCByZWN0YW5nbGUgb3Igcm90YXRlZCByZWN0YW5nbGUuIAorI2RlZmluZSBFUlJfQ09OVE9VUl9OT19DVVJWRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MzIgLy8gTm8gY3VydmVzIHdlcmUgZm91bmQgaW4gdGhlIGltYWdlLgorI2RlZmluZSBFUlJfQ09OVE9VUl9DT01QQVJFX0tFUk5FTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MzEgLy8gSW52YWxpZCBTbW9vdGhpbmcgS2VybmVsIHdpZHRoIGZvciBjb250b3VyIGNvbXBhcmlzb24uIE11c3QgYmUgemVybyBvciBhbiBvZGQgcG9zaXRpdmUgaW50ZWdlci4gCisjZGVmaW5lIEVSUl9DT05UT1VSX0NPTVBBUkVfU0lOR0xFX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTczMCAvLyBJZiBubyB0ZW1wbGF0ZSBpbWFnZSBpcyBwcm92aWRlZCwgdGhlIHRhcmdldCBpbWFnZSBtdXN0IGNvbnRhaW4gYm90aCBhIGNvbnRvdXIgd2l0aCBleHRyYWN0ZWQgcG9pbnRzIGFuZCBhIGZpdHRlZCBlcXVhdGlvbi4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzI5IC8vIEludmFsaWQgY29udG91ciBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TRUFSQ0hfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzI4IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWFyY2ggbW9kZSB5b3UgcHJvdmlkZWQuCisjZGVmaW5lIEVSUl9VTlNVUFBPUlRFRF8yRF9CQVJDT0RFX1NFQVJDSF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcyNyAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2VhcmNoIG1vZGUgeW91IHByb3ZpZGVkIGZvciB0aGUgdHlwZSBvZiAyRCBiYXJjb2RlIGZvciB3aGljaCB5b3UgYXJlIHNlYXJjaGluZy4KKyNkZWZpbmUgRVJSX01BVENIRkFDVE9SX09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzI2IC8vIG1hdGNoRmFjdG9yIGhhcyBiZWVuIG9ic29sZXRlZC4gSW5zdGVhZCwgc2V0IHRoZSBpbml0aWFsTWF0Y2hMaXN0TGVuZ3RoIGFuZCBtYXRjaExpc3RSZWR1Y3Rpb25GYWN0b3IgaW4gdGhlIE1hdGNoUGF0dGVybkFkdmFuY2VkT3B0aW9ucyBzdHJ1Y3R1cmUuCisjZGVmaW5lIEVSUl9EQVRBX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcyNSAvLyBUaGUgZGF0YSB3YXMgc3RvcmVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBkYXRhLgorI2RlZmluZSBFUlJfQ1VTVE9NREFUQV9JTlZBTElEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MjQgLy8gVGhlIHNpemUgeW91IHNwZWNpZmllZCBpcyBvdXQgb2YgdGhlIHZhbGlkIHJhbmdlLgorI2RlZmluZSBFUlJfQ1VTVE9NREFUQV9LRVlfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MjMgLy8gVGhlIGtleSB5b3Ugc3BlY2lmaWVkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DTEFTU0lGSUVSX0NMQVNTSUZZX0lNQUdFX1dJVEhfQ1VTVE9NX1NFU1NJT04gICAgICAgICAgICAtMTA3NDM5NTcyMiAvLyBDdXN0b20gY2xhc3NpZmllciBzZXNzaW9ucyBvbmx5IGNsYXNzaWZ5IGZlYXR1cmUgdmVjdG9ycy4gVGhleSBkbyBub3Qgc3VwcG9ydCBjbGFzc2lmeWluZyBpbWFnZXMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0JJVF9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcyMSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYml0IGRlcHRoIHlvdSBzdXBwbGllZCBmb3IgdGhlIGltYWdlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0JBRF9ST0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzIwIC8vIEludmFsaWQgUk9JLgorI2RlZmluZSBFUlJfQkFEX1JPSV9CT1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MTkgLy8gSW52YWxpZCBST0kgZ2xvYmFsIHJlY3RhbmdsZS4KKyNkZWZpbmUgRVJSX0xBQl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzE4IC8vIFRoZSB2ZXJzaW9uIG9mIExhYlZJRVcgb3IgQnJpZGdlVklFVyB5b3UgYXJlIHJ1bm5pbmcgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzE3IC8vIFRoZSByYW5nZSB5b3Ugc3VwcGxpZWQgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0NBTElOR19NRVRIT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzE2IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzY2FsaW5nIG1ldGhvZCB5b3UgcHJvdmlkZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NBTElCUkFUSU9OX1VOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcxNSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2FsaWJyYXRpb24gdW5pdCB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0FYSVNfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcxNCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYXhpcyBvcmllbnRhdGlvbiB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9WQUxVRV9OT1RfSU5fRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcxMyAvLyBWYWx1ZSBub3QgaW4gZW51bWVyYXRpb24uCisjZGVmaW5lIEVSUl9XUk9OR19SRUdJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcxMiAvLyBZb3Ugc2VsZWN0ZWQgYSByZWdpb24gdGhhdCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGUuCisjZGVmaW5lIEVSUl9OT1RfRU5PVUdIX1JFR0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcxMSAvLyBZb3Ugc3BlY2lmaWVkIGEgdmlld2VyIHRoYXQgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggcmVnaW9ucy4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZX1BBUlRJQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzEwIC8vIFRoZSBpbWFnZSBoYXMgdG9vIG1hbnkgcGFydGljbGVzIGZvciB0aGlzIHByb2Nlc3MuCisjZGVmaW5lIEVSUl9BVklfVU5PUEVORURfU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTcwOSAvLyBUaGUgQVZJIHNlc3Npb24gaGFzIG5vdCBiZWVuIG9wZW5lZC4KKyNkZWZpbmUgRVJSX0FWSV9SRUFEX1NFU1NJT05fUkVRVUlSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzA4IC8vIFRoZSBBVkkgc2Vzc2lvbiBpcyBhIHdyaXRlIHNlc3Npb24sIGJ1dCB0aGlzIG9wZXJhdGlvbiByZXF1aXJlcyBhIHJlYWQgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0FWSV9XUklURV9TRVNTSU9OX1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzA3IC8vIFRoZSBBVkkgc2Vzc2lvbiBpcyBhIHJlYWQgc2Vzc2lvbiwgYnV0IHRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIGEgd3JpdGUgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0FWSV9TRVNTSU9OX0FMUkVBRFlfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzA2IC8vIFRoaXMgQVZJIHNlc3Npb24gaXMgYWxyZWFkeSBvcGVuLiBZb3UgbXVzdCBjbG9zZSBpdCBiZWZvcmUgY2FsbGluZyB0aGUgQ3JlYXRlIG9yIE9wZW4gZnVuY3Rpb25zLgorI2RlZmluZSBFUlJfREFUQV9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDUgLy8gVGhlIGRhdGEgaXMgY29ycnVwdGVkIGFuZCBjYW5ub3QgYmUgcmVhZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09NUFJFU1NJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzA0IC8vIEludmFsaWQgY29tcHJlc3Npb24gdHlwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVFlQRV9PRl9GTEFUVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzAzIC8vIEludmFsaWQgdHlwZSBvZiBmbGF0dGVuLgorI2RlZmluZSBFUlJfSU5WQUxJRF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDIgLy8gVGhlIGxlbmd0aCBvZiB0aGUgZWRnZSBkZXRlY3Rpb24gbGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRSSVhfU0laRV9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU3MDEgLy8gVGhlIG1heGltdW0gRGF0YSBNYXRyaXggYmFyY29kZSBzaXplIG11c3QgYmUgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIERhdGEgTWF0cml4IGJhcmNvZGUgc2l6ZS4KKyNkZWZpbmUgRVJSX1JFUVVJUkVTX1dJTjIwMDBfT1JfTkVXRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NzAwIC8vIFRoZSBmdW5jdGlvbiByZXF1aXJlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBiZSBNaWNyb3NvZnQgV2luZG93cyAyMDAwIG9yIG5ld2VyLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DQUxJQlJBVElPTl9NRVRIT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NjIgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiBtZXRob2QgcmVxdWVzdGVkCisjZGVmaW5lIEVSUl9JTlZBTElEX09QRVJBVElPTl9PTl9DT01QQUNUX0NBTElCUkFUSU9OX0FUVEVNUFRFRCAgICAgICAtMTA3NDM5NTY2MSAvLyBUaGlzIGNhbGlicmF0aW9uIGlzIGNvbXBhY3QuIFJlLUxlYXJuaW5nIGNhbGlicmF0aW9uIGFuZCByZXRyaWV2aW5nIHRodW1ibmFpbHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRoIHRoaXMgY2FsaWJyYXRpb24KKyNkZWZpbmUgRVJSX0lOVkFMSURfUE9MWU5PTUlBTF9NT0RFTF9LX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjYwIC8vIEludmFsaWQgbnVtYmVyIG9mIEsgdmFsdWVzIAorI2RlZmluZSBFUlJfSU5WQUxJRF9ESVNUT1JUSU9OX01PREVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NTkgLy8gSW52YWxpZCBkaXN0b3J0aW9uIG1vZGVsIHR5cGUKKyNkZWZpbmUgRVJSX0NBTUVSQV9NT0RFTF9OT1RfQVZBSUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjU4IC8vIENhbWVyYSBNb2RlbCBpcyBub3QgbGVhcm5lZAorI2RlZmluZSBFUlJfSU5WQUxJRF9USFVNQk5BSUxfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NTcgLy8gU3VwcGxpZWQgdGh1bWJuYWlsIGluZGV4IGlzIGludmFsaWQKKyNkZWZpbmUgRVJSX1NNT09USF9DT05UT1VSU19NVVNUX0JFX1NBTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjU2IC8vIFlvdSBtdXN0IHNwZWNpZnkgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBzbW9vdGggY29udG91cnMgYWR2YW5jZWQgbWF0Y2ggb3B0aW9uIGZvciBhbGwgdGVtcGxhdGVzIHlvdSB3YW50IHRvIG1hdGNoLgorI2RlZmluZSBFUlJfRU5BQkxFX0NBTElCUkFUSU9OX1NVUFBPUlRfTVVTVF9CRV9TQU1FICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NTUgLy8gWW91IG11c3Qgc3BlY2lmeSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIGVuYWJsZSBjYWxpYnJhdGlvbiBzdXBwb3J0IGFkdmFuY2VkIG1hdGNoIG9wdGlvbiBmb3IgYWxsIHRlbXBsYXRlcyB5b3Ugd2FudCB0byBtYXRjaC4KKyNkZWZpbmUgRVJSX0dSQURJTkdfSU5GT1JNQVRJT05fTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjU0IC8vIFRoZSBzb3VyY2UgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBncmFkaW5nIGluZm9ybWF0aW9uLiBZb3UgbXVzdCBwcmVwYXJlIHRoZSBzb3VyY2UgaW1hZ2UgZm9yIGdyYWRpbmcgd2hlbiByZWFkaW5nIHRoZSBEYXRhIE1hdHJpeCwgYW5kIHlvdSBjYW5ub3QgY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGltYWdlIGJldHdlZW4gcmVhZGluZyBhbmQgZ3JhZGluZyB0aGUgRGF0YSBNYXRyaXguCisjZGVmaW5lIEVSUl9PUEVOSU5HX05FV0VSX01VTFRJUExFX0dFT01FVFJJQ19URU1QTEFURSAgICAgICAgICAgICAgICAtMTA3NDM5NTY1MyAvLyBUaGUgbXVsdGlwbGUgZ2VvbWV0cmljIG1hdGNoaW5nIHRlbXBsYXRlIHlvdSB0cmllZCB0byBvcGVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBmaWxlLgorI2RlZmluZSBFUlJfT1BFTklOR19ORVdFUl9HRU9NRVRSSUNfTUFUQ0hJTkdfVEVNUExBVEUgICAgICAgICAgICAgICAgLTEwNzQzOTU2NTIgLy8gVGhlIGdlb21ldHJpYyBtYXRjaGluZyB0ZW1wbGF0ZSB5b3UgdHJpZWQgdG8gb3BlbiB3YXMgY3JlYXRlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoaXMgZmlsZS4KKyNkZWZpbmUgRVJSX0VER0VfRklMVEVSX1NJWkVfTVVTVF9CRV9TQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjUxIC8vIFlvdSBtdXN0IHNwZWNpZnkgdGhlIHNhbWUgZWRnZSBmaWx0ZXIgc2l6ZSBmb3IgYWxsIHRoZSB0ZW1wbGF0ZXMgeW91IHdhbnQgdG8gbWF0Y2guCisjZGVmaW5lIEVSUl9DVVJWRV9FWFRSQUNUSU9OX01PREVfTVVTVF9CRV9TQU1FICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY1MCAvLyBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBzYW1lIGN1cnZlIGV4dHJhY3Rpb24gbW9kZSBmb3IgYWxsIHRoZSB0ZW1wbGF0ZXMgeW91IHdhbnQgdG8gbWF0Y2guCisjZGVmaW5lIEVSUl9JTlZBTElEX0dFT01FVFJJQ19GRUFUVVJFX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY0OSAvLyBUaGUgZ2VvbWV0cmljIGZlYXR1cmUgdHlwZSBzcGVjaWZpZWQgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX05PVF9MRUFSTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjQ4IC8vIFlvdSBzdXBwbGllZCBhIHRlbXBsYXRlIHRoYXQgd2FzIG5vdCBsZWFybmVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NVUxUSVBMRV9HRU9NRVRSSUNfVEVNUExBVEUgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NDcgLy8gSW52YWxpZCBtdWx0aXBsZSBnZW9tZXRyaWMgdGVtcGxhdGUuCisjZGVmaW5lIEVSUl9OT19URU1QTEFURV9UT19MRUFSTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY0NiAvLyBOZWVkIGF0IGxlYXN0IG9uZSB0ZW1wbGF0ZSB0byBsZWFybi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTlVNQkVSX09GX0xBQkVMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjQ1IC8vIFlvdSBzdXBwbGllZCBhbiBpbnZhbGlkIG51bWJlciBvZiBsYWJlbHMuCisjZGVmaW5lIEVSUl9MQUJFTF9UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY0NCAvLyBMYWJlbHMgbXVzdCBiZSA8PSAyNTUgY2hhcmFjdGVycy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTlVNQkVSX09GX01BVENIX09QVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjQzIC8vIFlvdSBzdXBwbGllZCBhbiBpbnZhbGlkIG51bWJlciBvZiBtYXRjaCBvcHRpb25zLgorI2RlZmluZSBFUlJfTEFCRUxfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NDIgLy8gQ2Fubm90IGZpbmQgYSBsYWJlbCB0aGF0IG1hdGNoZXMgdGhlIG9uZSB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfRFVQTElDQVRFX0xBQkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2NDEgLy8gRHVwbGljYXRlIGxhYmVscyBhcmUgbm90IGFsbG93ZWQuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9aT05FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTY0MCAvLyBUaGUgbnVtYmVyIG9mIHpvbmVzIGZvdW5kIGV4Y2VlZGVkIHRoZSBjYXBhY2l0eSBvZiB0aGUgYWxnb3JpdGhtLgorI2RlZmluZSBFUlJfSU5WQUxJRF9IQVRDSF9TVFlMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzkgLy8gVGhlIGhhdGNoIHN0eWxlIGZvciB0aGUgd2luZG93IGJhY2tncm91bmQgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRklMTF9TVFlMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjM4IC8vIFRoZSBmaWxsIHN0eWxlIGZvciB0aGUgd2luZG93IGJhY2tncm91bmQgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0hBUkRXQVJFX0RPRVNOVF9TVVBQT1JUX05PTlRFQVJJTkcgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjM3IC8vIFlvdXIgaGFyZHdhcmUgaXMgbm90IHN1cHBvcnRlZCBieSBEaXJlY3RYIGFuZCBjYW5ub3QgYmUgcHV0IGludG8gTm9uVGVhcmluZyBtb2RlLgorI2RlZmluZSBFUlJfRElSRUNUWF9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzYgLy8gRGlyZWN0WCBpcyByZXF1aXJlZCBmb3IgdGhpcyBmZWF0dXJlLiAgUGxlYXNlIGluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uLi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0hBUEVfREVTQ1JJUFRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjM1IC8vIFRoZSBwYXNzZWQgc2hhcGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhfTUFUQ0hfT1ZFUkxBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzQgLy8gSW52YWxpZCBtYXggbWF0Y2ggb3ZlcmxhcC4gIFZhbHVlcyBtdXN0IGJlIGJldHdlZW4gLTEgYW5kIDEwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOX01BVENIX1NFUEFSQVRJT05fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjMzIC8vIEludmFsaWQgbWluaW11bSBtYXRjaCBzZXBhcmF0aW9uIHNjYWxlLiAgVmFsdWVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIC0xLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0VQQVJBVElPTl9BTkdMRSAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MzIgLy8gSW52YWxpZCBtaW5pbXVtIG1hdGNoIHNlcGFyYXRpb24gYW5nbGUuICBWYWx1ZXMgbXVzdCBiZSBiZXR3ZWVuIC0xIGFuZCAzNjAuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTl9NQVRDSF9TRVBBUkFUSU9OX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYzMSAvLyBJbnZhbGlkIG1pbmltdW0gbWF0Y2ggc2VwYXJhdGlvbiBkaXN0YW5jZS4gIFZhbHVlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAtMS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFYSU1VTV9GRUFUVVJFU19MRUFSTkVEICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjMwIC8vIEludmFsaWQgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgbGVhcm4uIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhJTVVNX1BJWEVMX0RJU1RBTkNFX0ZST01fTElORSAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MjkgLy8gSW52YWxpZCBtYXhpbXVtIHBpeGVsIGRpc3RhbmNlIGZyb20gbGluZS4gVmFsdWVzIG11c3QgYmUgcG9zaXRpdmUgcmVhbCBudW1iZXJzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9HRU9NRVRSSUNfTUFUQ0hJTkdfVEVNUExBVEUgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MjggLy8gSW52YWxpZCBnZW9tZXRyaWMgbWF0Y2hpbmcgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9OT1RfRU5PVUdIX1RFTVBMQVRFX0ZFQVRVUkVTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYyNyAvLyBUaGUgdGVtcGxhdGUgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggZmVhdHVyZXMgZm9yIGdlb21ldHJpYyBtYXRjaGluZy4KKyNkZWZpbmUgRVJSX05PVF9FTk9VR0hfVEVNUExBVEVfRkVBVFVSRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjI2IC8vIFRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBjb250YWluIGVub3VnaCBmZWF0dXJlcyBmb3IgZ2VvbWV0cmljIG1hdGNoaW5nLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRDSF9DT05TVFJBSU5UX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MjUgLy8gWW91IHNwZWNpZmllZCBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgbWF0Y2ggY29uc3RyYWludCB2YWx1ZSBvZiB0aGUgIHJhbmdlIHNldHRpbmdzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9PQ0NMVVNJT05fUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MjQgLy8gSW52YWxpZCBvY2NsdXNpb24gcmFuZ2UuIFZhbGlkIHZhbHVlcyBmb3IgdGhlIGJvdW5kcyByYW5nZSBmcm9tIDAgdG8gMTAwIGFuZCB0aGUgdXBwZXIgYm91bmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxvd2VyIGJvdW5kLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TQ0FMRV9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MjMgLy8gSW52YWxpZCBzY2FsZSByYW5nZS4gVmFsdWVzIGZvciB0aGUgbG93ZXIgYm91bmQgbXVzdCBiZSBhIHBvc2l0aXZlIHJlYWwgbnVtYmVycyBhbmQgdGhlIHVwcGVyIGJvdW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsb3dlciBib3VuZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFUQ0hfR0VPTUVUUklDX1BBVFRFUk5fU0VUVVBfREFUQSAgICAgICAgICAgICAgIC0xMDc0Mzk1NjIyIC8vIEludmFsaWQgbWF0Y2ggZ2VvbWV0cmljIHBhdHRlcm4gc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTEVBUk5fR0VPTUVUUklDX1BBVFRFUk5fU0VUVVBfREFUQSAgICAgICAgICAgICAgIC0xMDc0Mzk1NjIxIC8vIEludmFsaWQgbGVhcm4gZ2VvbWV0cmljIHBhdHRlcm4gc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ1VSVkVfRVhUUkFDVElPTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjIwIC8vIEludmFsaWQgY3VydmUgZXh0cmFjdGlvbiBtb2RlLgorI2RlZmluZSBFUlJfVE9PX01BTllfT0NDTFVTSU9OX1JBTkdFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MTkgLy8gWW91IGNhbiBzcGVjaWZ5IG9ubHkgb25lIG9jY2x1c2lvbiByYW5nZS4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZX1NDQUxFX1JBTkdFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjE4IC8vIFlvdSBjYW4gc3BlY2lmeSBvbmx5IG9uZSBzY2FsZSByYW5nZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTlVNQkVSX09GX0ZFQVRVUkVTX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjE3IC8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiBmZWF0dXJlcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0VER0VfRklMVEVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYxNiAvLyBJbnZhbGlkIGVkZ2UgZmlsdGVyIHNpemUuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRV9TVFJFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYxNSAvLyBJbnZhbGlkIG1pbmltdW0gc3RyZW5ndGggZm9yIGZlYXR1cmVzLiBWYWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZSByZWFsIG51bWJlcnMuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRV9BU1BFQ1RfUkFUSU8gICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYxNCAvLyBJbnZhbGlkIGFzcGVjdCByYXRpbyBmb3IgcmVjdGFuZ3VsYXIgZmVhdHVyZXMuIFZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlIHJlYWwgbnVtYmVycyBpbiB0aGUgcmFuZ2UgMC4wMSB0byAxLjAuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYxMyAvLyBJbnZhbGlkIG1pbmltdW0gbGVuZ3RoIGZvciBsaW5lYXIgZmVhdHVyZXMuIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgdGhhbiAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfUkFESVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MTIgLy8gSW52YWxpZCBtaW5pbXVtIHJhZGl1cyBmb3IgY2lyY3VsYXIgZmVhdHVyZXMuIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgdGhhbiAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5JTVVNX1JFQ1RBTkdMRV9ESU1FTlNJT04gICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MTEgLy8gSW52YWxpZCBtaW5pbXVtIHJlY3RhbmdsZSBkaW1lbnNpb24uIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgdGhhbiAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9JTklUSUFMX01BVENIX0xJU1RfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MTAgLy8gSW52YWxpZCBpbml0aWFsIG1hdGNoIGxpc3QgbGVuZ3RoLiBWYWx1ZXMgbXVzdCBiZSBpbnRlZ2VycyBncmVhdGVyIHRoYW4gNS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1VCUElYRUxfVE9MRVJBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjA5IC8vIEludmFsaWQgc3VicGl4ZWwgdG9sZXJhbmNlLiBWYWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZSByZWFsIG51bWJlcnMuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NVQlBJWEVMX0lURVJBVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYwOCAvLyBJbnZhbGlkIG51bWJlciBvZiBzdWJwaXhlbCBpdGVyYXRpb25zLiBWYWx1ZXMgbXVzdCBiZSBpbnRlZ2VycyBncmVhdGVyIDEwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhJTVVNX0ZFQVRVUkVTX1BFUl9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MDcgLy8gSW52YWxpZCBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyB1c2VkIHBlciBtYXRjaC4gVmFsdWVzIG11c3QgYmUgaW50ZWdlcnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRVNfVE9fTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYwNiAvLyBJbnZhbGlkIG1pbmltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHVzZWQgZm9yIG1hdGNoaW5nLiBWYWx1ZXMgbXVzdCBiZSBpbnRlZ2VycyBncmVhdGVyIHRoYW4gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFYSU1VTV9FTkRfUE9JTlRfR0FQICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjA1IC8vIEludmFsaWQgbWF4aW11bSBlbmQgcG9pbnQgZ2FwLiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDMyNzY3LgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT0xVTU5fU1RFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MDQgLy8gSW52YWxpZCBjb2x1bW4gc3RlcC4gVmFsaWQgcmFuZ2UgaXMgMSB0byAyNTUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1JPV19TVEVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYwMyAvLyBJbnZhbGlkIHJvdyBzdGVwLiBWYWxpZCByYW5nZSBpcyAxIHRvIDI1NS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOSU1VTV9DVVJWRV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NjAyIC8vIEludmFsaWQgbWluaW11bSBsZW5ndGguIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9FREdFX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU2MDEgLy8gSW52YWxpZCBlZGdlIHRocmVzaG9sZC4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMSB0byAzNjAuCisjZGVmaW5lIEVSUl9JTkZPX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTYwMCAvLyBZb3UgbXVzdCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdWJpbWFnZSB3aXRoaW4gdGhlIGJyb3dzZXIuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0FDQ0VQVEFOQ0VfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU5OCAvLyBUaGUgYWNjZXB0YW5jZSBsZXZlbCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBvZiAgMCB0byAxMDAwLgorI2RlZmluZSBFUlJfTklPQ1JfTk9UX0FfVkFMSURfU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1OTcgLy8gTm90IGEgdmFsaWQgT0NSIHNlc3Npb24uCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU5NiAvLyBJbnZhbGlkIGNoYXJhY3RlciBzaXplLiBDaGFyYWN0ZXIgc2l6ZSBtdXN0IGJlID49IDEuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU5NSAvLyBJbnZhbGlkIHRocmVzaG9sZCBtb2RlIHZhbHVlLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9TVUJTVElUVVRJT05fQ0hBUkFDVEVSICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1OTQgLy8gSW52YWxpZCBzdWJzdGl0dXRpb24gY2hhcmFjdGVyLiBWYWxpZCBzdWJzdGl0dXRpb24gY2hhcmFjdGVycyBhcmUgQVNDSUkgdmFsdWVzIHRoYXQgcmFuZ2UgZnJvbSAxIHRvIDI1NC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTkzIC8vIEludmFsaWQgbnVtYmVyIG9mIGJsb2Nrcy4gTnVtYmVyIG9mIGJsb2NrcyBtdXN0IGJlID49IDQgYW5kIDw9IDUwLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9SRUFEX1NUUkFURUdZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1OTIgLy8gSW52YWxpZCByZWFkIHN0cmF0ZWd5LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1OTEgLy8gSW52YWxpZCBjaGFyYWN0ZXIgaW5kZXguCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9WQUxJRF9DSEFSQUNURVJfUE9TSVRJT05TICAgICAgICAtMTA3NDM5NTU5MCAvLyBJbnZhbGlkIG51bWJlciBvZiBjaGFyYWN0ZXIgcG9zaXRpb25zLiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTE9XX1RIUkVTSE9MRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTg5IC8vIEludmFsaWQgbG93IHRocmVzaG9sZCB2YWx1ZS4gVmFsaWQgdGhyZXNob2xkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9ISUdIX1RIUkVTSE9MRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1ODggLy8gSW52YWxpZCBoaWdoIHRocmVzaG9sZCB2YWx1ZS4gVmFsaWQgdGhyZXNob2xkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9USFJFU0hPTERfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1ODcgLy8gVGhlIGxvdyB0aHJlc2hvbGQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGhpZ2ggdGhyZXNob2xkLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9MT1dFUl9USFJFU0hPTERfTElNSVQgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1ODYgLy8gSW52YWxpZCBsb3dlciB0aHJlc2hvbGQgbGltaXQuIFZhbGlkIGxvd2VyIHRocmVzaG9sZCBsaW1pdHMgcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfVVBQRVJfVEhSRVNIT0xEX0xJTUlUICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTg1IC8vIEludmFsaWQgdXBwZXIgdGhyZXNob2xkIGxpbWl0LiBWYWxpZCB1cHBlciB0aHJlc2hvbGQgbGltaXRzIHJhbmdlIGZyb20gMCB0byAyNTUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9MSU1JVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU4NCAvLyBUaGUgbG93ZXIgdGhyZXNob2xkIGxpbWl0IG11c3QgYmUgbGVzcyB0aGFuIHRoZSB1cHBlciB0aHJlc2hvbGQgbGltaXQuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX01JTl9DSEFSX1NQQUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU4MyAvLyBJbnZhbGlkIG1pbmltdW0gY2hhcmFjdGVyIHNwYWNpbmcgdmFsdWUuIENoYXJhY3RlciBzcGFjaW5nIG11c3QgYmUgPj0gMSBwaXhlbC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTUFYX0hPUklaX0VMRU1FTlRfU1BBQ0lORyAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTgyIC8vIEludmFsaWQgbWF4aW11bSBob3Jpem9udGFsIGVsZW1lbnQgc3BhY2luZyB2YWx1ZS4gTWF4aW11bSBob3Jpem9udGFsIGVsZW1lbnQgc3BhY2luZyBtdXN0IGJlID49IDAuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX01BWF9WRVJUX0VMRU1FTlRfU1BBQ0lORyAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU4MSAvLyBJbnZhbGlkIG1heGltdW0gdmVydGljYWwgZWxlbWVudCBzcGFjaW5nIHZhbHVlLiBNYXhpbXVtIHZlcnRpY2FsIGVsZW1lbnQgc3BhY2luZyBtdXN0IGJlID49IDAuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX01JTl9CT1VORElOR19SRUNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU4MCAvLyBJbnZhbGlkIG1pbmltdW0gYm91bmRpbmcgcmVjdGFuZ2xlIHdpZHRoLiBNaW5pbXVtIGJvdW5kaW5nIHJlY3RhbmdsZSB3aWR0aCBtdXN0IGJlID49IDEuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0FTUEVDVF9SQVRJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU3OSAvLyBJbnZhbGlkIGFzcGVjdCByYXRpbyB2YWx1ZS4gVGhlIGFzcGVjdCByYXRpbyBtdXN0IGJlIHplcm8gb3IgPj0gMTAwLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0VUX0ZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NzggLy8gSW52YWxpZCBvciBjb3JydXB0IGNoYXJhY3RlciBzZXQgZmlsZS4KKyNkZWZpbmUgRVJSX05JT0NSX0NIQVJBQ1RFUl9WQUxVRV9DQU5OT1RfQkVfRU1QVFlTVFJJTkcgICAgICAgICAgICAgIC0xMDc0Mzk1NTc3IC8vIFRoZSBjaGFyYWN0ZXIgdmFsdWUgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nLgorI2RlZmluZSBFUlJfTklPQ1JfQ0hBUkFDVEVSX1ZBTFVFX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NzYgLy8gQ2hhcmFjdGVyIHZhbHVlcyBtdXN0IGJlIDw9MjU1IGNoYXJhY3RlcnMuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9FUk9TSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU3NSAvLyBJbnZhbGlkIG51bWJlciBvZiBlcm9zaW9ucy4gVGhlIG51bWJlciBvZiBlcm9zaW9ucyBtdXN0IGJlID49IDAuCisjZGVmaW5lIEVSUl9OSU9DUl9DSEFSQUNURVJfU0VUX0RFU0NSSVBUSU9OX1RPT19MT05HICAgICAgICAgICAgICAgICAtMTA3NDM5NTU3NCAvLyBUaGUgY2hhcmFjdGVyIHNldCBkZXNjcmlwdGlvbiBtdXN0IGJlIDw9MjU1IGNoYXJhY3RlcnMuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9TRVRfRklMRV9WRVJTSU9OICAgICAgICAgICAgICAgICAtMTA3NDM5NTU3MyAvLyBUaGUgY2hhcmFjdGVyIHNldCBmaWxlIHdhcyBjcmVhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoZSBjaGFyYWN0ZXIgc2V0IGZpbGUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlRFR0VSX1ZBTFVFX0ZPUl9TVFJJTkdfQVRUUklCVVRFICAgICAgICAgICAgICAgICAtMTA3NDM5NTU3MiAvLyBZb3UgbXVzdCBzcGVjaWZ5IGNoYXJhY3RlcnMgZm9yIGEgc3RyaW5nLiBBIHN0cmluZyBjYW5ub3QgY29udGFpbiBpbnRlZ2Vycy4KKyNkZWZpbmUgRVJSX05JT0NSX0dFVF9PTkxZX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTcxIC8vIFRoaXMgYXR0cmlidXRlIGlzIHJlYWQtb25seS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVEVHRVJfVkFMVUVfRk9SX0JPT0xFQU5fQVRUUklCVVRFICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTcwIC8vIFRoaXMgYXR0cmlidXRlIHJlcXVpcmVzIGEgQm9vbGVhbiB2YWx1ZS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTY5IC8vIEludmFsaWQgYXR0cmlidXRlLgorI2RlZmluZSBFUlJfTklPQ1JfU1RSSU5HX1ZBTFVFX0ZPUl9JTlRFR0VSX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NjggLy8gVGhpcyBhdHRyaWJ1dGUgcmVxdWlyZXMgaW50ZWdlciB2YWx1ZXMuCisjZGVmaW5lIEVSUl9OSU9DUl9TVFJJTkdfVkFMVUVfRk9SX0JPT0xFQU5fQVRUUklCVVRFICAgICAgICAgICAgICAgICAtMTA3NDM5NTU2NyAvLyBTdHJpbmcgdmFsdWVzIGFyZSBpbnZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZS4gRW50ZXIgYSBib29sZWFuIHZhbHVlLgorI2RlZmluZSBFUlJfTklPQ1JfQk9PTEVBTl9WQUxVRV9GT1JfSU5URUdFUl9BVFRSSUJVVEUgICAgICAgICAgICAgICAgLTEwNzQzOTU1NjYgLy8gQm9vbGVhbiB2YWx1ZXMgYXJlIG5vdCB2YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGUuIEVudGVyIGFuIGludGVnZXIgdmFsdWUuCisjZGVmaW5lIEVSUl9OSU9DUl9NVVNUX0JFX1NJTkdMRV9DSEFSQUNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU2NSAvLyBSZXF1aXJlcyBhIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9QUkVERUZJTkVEX0NIQVJBQ1RFUiAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NjQgLy8gSW52YWxpZCBwcmVkZWZpbmVkIGNoYXJhY3RlciB2YWx1ZS4KKyNkZWZpbmUgRVJSX05JT0NSX1VOTElDRU5TRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTYzIC8vIFRoaXMgY29weSBvZiBOSSBPQ1IgaXMgdW5saWNlbnNlZC4KKyNkZWZpbmUgRVJSX05JT0NSX0JPT0xFQU5fVkFMVUVfRk9SX1NUUklOR19BVFRSSUJVVEUgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTYyIC8vIFN0cmluZyB2YWx1ZXMgYXJlIG5vdCB2YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGUuIEVudGVyIGEgQm9vbGVhbiB2YWx1ZS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX0NIQVJBQ1RFUlMgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTYxIC8vIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgY2hhcmFjdGVyIHZhbHVlIG11c3QgbWF0Y2ggdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBpbWFnZS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfT0JKRUNUX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTYwIC8vIEludmFsaWQgb2JqZWN0IGluZGV4LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9SRUFEX09QVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NTkgLy8gSW52YWxpZCByZWFkIG9wdGlvbi4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NJWkVfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTU4IC8vIFRoZSBtaW5pbXVtIGNoYXJhY3RlciBzaXplIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIGNoYXJhY3RlciBzaXplLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9CT1VORElOR19SRUNUX1dJRFRIX1JBTkdFICAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NTcgLy8gVGhlIG1pbmltdW0gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZSB3aWR0aCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWF4aW11bSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlIHdpZHRoLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9CT1VORElOR19SRUNUX0hFSUdIVF9SQU5HRSAgICAgICAgICAgICAgICAgLTEwNzQzOTU1NTYgLy8gVGhlIG1pbmltdW0gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZSBoZWlnaHQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG1heGltdW0gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZSBoZWlnaHQuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1NQQUNJTkdfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU1NSAvLyBUaGUgbWF4aW11bSBob3Jpem9udGFsIGVsZW1lbnQgc3BhY2luZyB2YWx1ZSBtdXN0IG5vdCBleGNlZWQgdGhlIG1pbmltdW0gY2hhcmFjdGVyIHNwYWNpbmcgdmFsdWUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1JFQURfUkVTT0xVVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU1NCAvLyBJbnZhbGlkIHJlYWQgcmVzb2x1dGlvbi4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTUlOX0JPVU5ESU5HX1JFQ1RfSEVJR0hUICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTUzIC8vIEludmFsaWQgbWluaW11bSBib3VuZGluZyByZWN0YW5nbGUgaGVpZ2h0LiBUaGUgbWluaW11bSBib3VuZGluZyByZWN0YW5nbGUgaGVpZ2h0IG11c3QgYmUgPj0gMS4KKyNkZWZpbmUgRVJSX05JT0NSX05PVF9BX1ZBTElEX0NIQVJBQ1RFUl9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NTUyIC8vIE5vdCBhIHZhbGlkIGNoYXJhY3RlciBzZXQuCisjZGVmaW5lIEVSUl9OSU9DUl9SRU5BTUVfUkVGQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU1MSAvLyBBIHRyYWluZWQgT0NSIGNoYXJhY3RlciBjYW5ub3QgYmUgcmVuYW1lZCB3aGlsZSBpdCBpcyBhIHJlZmVyZW5jZSBjaGFyYWN0ZXIuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTU1MCAvLyBBIGNoYXJhY3RlciBjYW5ub3QgaGF2ZSBhbiBBU0NJSSB2YWx1ZSBvZiAyNTUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9PQkpFQ1RTX1RPX1ZFUklGWSAgICAgICAgICAgICAgICAtMTA3NDM5NTU0OSAvLyBUaGUgbnVtYmVyIG9mIG9iamVjdHMgZm91bmQgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBleHBlY3RlZCBjaGFyYWN0ZXJzIG9yIHBhdHRlcm5zIHRvIHZlcmlmeS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfUFJFRklMVEVSX0NBUCAgICAgICAgICAgICAgIC0xMDc0Mzk1NDIxIC8vIFRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIHRoZSBmaWx0ZXIgY2FwIGZvciBibG9jayBtYXRjaGluZyBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVEVSRU9fQkxPQ0tNQVRDSElOR19QUkVGSUxURVJfU0laRSAgICAgICAgICAgICAgLTEwNzQzOTU0MjAgLy8gVGhlIHNwZWNpZmllZCBwcmVmaWx0ZXIgc2l6ZSBmb3IgYmxvY2sgbWF0Y2hpbmcgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfUFJFRklMVEVSX1RZUEUgICAgICAgICAgICAgIC0xMDc0Mzk1NDE5IC8vIFRoZSBzcGVjaWZpZWQgcHJlZmlsdGVyIHR5cGUgZm9yIGJsb2NrIG1hdGNoaW5nIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NURVJFT19CTE9DS01BVENISU5HX05VTURJU1BBUklUSUVTICAgICAgICAgICAgICAtMTA3NDM5NTQxOCAvLyBUaGUgc3BlY2lmZWQgdmFsdWUgZm9yIG51bWJlciBvZiBkaXNwYXJpdGllcyBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVEVSRU9fQkxPQ0tNQVRDSElOR19XSU5ET1dfU0laRSAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MTcgLy8gVGhlIHNwZWNpZmllZCB3aW5kb3cgc2l6ZSBmb3IgYmxvY2sgbWF0Y2hpbmcgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSXzNEVklTSU9OX0lOVkFMSURfU0VTU0lPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDE2IC8vIFRoaXMgM0QgdmlzaW9uIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgb24gdGhpcyB0eXBlIG9mIDNkIHZpc2lvbiBzZXNzaW9uLgorI2RlZmluZSBFUlJfVE9PX01BTllfM0RWSVNJT05fU0VTU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MTUgLy8gVGhlcmUgYXJlIHRvbyBtYW55IDNEIHZpc2lvbiBzZXNzaW9ucyBvcGVuLiAgWW91IG11c3QgY2xvc2UgYSBzZXNzaW9uIGJlZm9yZSB5b3UgY2FuIG9wZW4gYW5vdGhlciBvbmUuCisjZGVmaW5lIEVSUl9PUEVOSU5HX05FV0VSXzNEVklTSU9OX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQxNCAvLyBUaGUgM0QgdmlzaW9uIHNlc3Npb24geW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NURVJFT19CTE9DS01BVENISU5HX0ZJTFRFUlRZUEUgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQxMyAvLyBZb3UgaGF2ZSBzcGVjaWZpZWQgYW4gaW52YWxpZCBmaWx0ZXIgdHlwZSBmb3IgYmxvY2sgbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NURVJFT19DQU1FUkFfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQxMiAvLyBZb3UgaGF2ZSByZXF1ZXN0ZWQgcmVzdWx0cyBhdCBhbiBpbnZhbGlkIGNhbWVyYSBwb3NpdGlvbiBpbiB0aGUgc3RlcmVvIHNldHVwLgorI2RlZmluZSBFUlJfSU5WQUxJRF8zRFZJU0lPTl9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MTEgLy8gTm90IGEgdmFsaWQgM0QgVmlzaW9uIHNlc3Npb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0lDT05TX1BFUl9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQxMCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCBsZXNzIHRoYW4gb25lIGljb24gcGVyIGxpbmUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NVQlBJWEVMX0RJVklTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQwOSAvLyBJbnZhbGlkIHN1YnBpeGVsIGRpdmlzaW9ucy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfREVURUNUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDA4IC8vIEludmFsaWQgZGV0ZWN0aW9uIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTlRSQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTQwNyAvLyBJbnZhbGlkIGNvbnRyYXN0IHZhbHVlLiBWYWxpZCBjb250cmFzdCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyNkZWZpbmUgRVJSX0NPT1JEU1lTX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDA2IC8vIFRoZSBjb29yZGluYXRlIHN5c3RlbSBjb3VsZCBub3QgYmUgZm91bmQgb24gdGhpcyBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVEVYVE9SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDA1IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSB0ZXh0IG9yaWVudGF0aW9uIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRF9GT1JfVU5XUkFQICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDA0IC8vIFVud3JhcEltYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGludGVycG9sYXRpb24gbWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4gIFZhbGlkIGludGVycG9sYXRpb24gbWV0aG9kcyBhcmUgemVybyBvcmRlciBhbmQgYmlsaW5lYXIuIAorI2RlZmluZSBFUlJfRVhUUkFJTkZPX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MDMgLy8gVGhlIGltYWdlIHdhcyBjcmVhdGVkIGluIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byB1c2UgdGhpcyBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFYUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDAyIC8vIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgdGhhdCB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRDSEZBQ1RPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTU0MDEgLy8gVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1hdGNoRmFjdG9yIHRoYXQgeW91IHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX01VTFRJQ09SRV9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1NDAwIC8vIFRoZSBvcGVyYXRpb24geW91IGhhdmUgZ2l2ZW4gTXVsdGljb3JlIE9wdGlvbnMgaXMgaW52YWxpZC4gUGxlYXNlIHNlZSB0aGUgYXZhaWxhYmxlIGVudW1lcmF0aW9uIHZhbHVlcyBmb3IgTXVsdGljb3JlIE9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX01VTFRJQ09SRV9JTlZBTElEX0FSR1VNRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzk5IC8vIFlvdSBoYXZlIGdpdmVuIE11bHRpY29yZSBPcHRpb25zIGFuIGludmFsaWQgYXJndW1lbnQuCisjZGVmaW5lIEVSUl9DT01QTEVYX0lNQUdFX1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM5NyAvLyBBIGNvbXBsZXggaW1hZ2UgaXMgcmVxdWlyZWQuCisjZGVmaW5lIEVSUl9DT0xPUl9JTUFHRV9SRVFVSVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM5NSAvLyBUaGUgaW5wdXQgaW1hZ2UgbXVzdCBiZSBhIGNvbG9yIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfU1BFQ1RSVU1fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzOTQgLy8gVGhlIGNvbG9yIG1hc2sgcmVtb3ZlcyB0b28gbXVjaCBjb2xvciBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0lNQUdFX1RPT19TTUFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzkzIC8vIFRoZSBjb2xvciB0ZW1wbGF0ZSBpbWFnZSBpcyB0b28gc21hbGwuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9UT09fTEFSR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM5MiAvLyBUaGUgY29sb3IgdGVtcGxhdGUgaW1hZ2UgaXMgdG9vIGxhcmdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfSFVFX0NPTlRSQVNUX1RPT19MT1cgICAgICAgICAgICAgICAgLTEwNzQzOTUzOTEgLy8gVGhlIGNvbnRyYXN0IGluIHRoZSBodWUgcGxhbmUgb2YgdGhlIGltYWdlIGlzIHRvbyBsb3cgZm9yIGxlYXJuaW5nIHNoYXBlIGZlYXR1cmVzLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfTFVNSU5BTkNFX0NPTlRSQVNUX1RPT19MT1cgICAgICAgICAgLTEwNzQzOTUzOTAgLy8gVGhlIGNvbnRyYXN0IGluIHRoZSBsdW1pbmFuY2UgcGxhbmUgb2YgdGhlIGltYWdlIGlzIHRvbyBsb3cgdG8gbGVhcm4gc2hhcGUgZmVhdHVyZXMuCisjZGVmaW5lIEVSUl9DT0xPUl9MRUFSTl9TRVRVUF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4OSAvLyBJbnZhbGlkIGNvbG9yIGxlYXJuIHNldHVwIGRhdGEuCisjZGVmaW5lIEVSUl9DT0xPUl9MRUFSTl9TRVRVUF9EQVRBX1NIQVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4OCAvLyBJbnZhbGlkIGNvbG9yIGxlYXJuIHNldHVwIGRhdGEuCisjZGVmaW5lIEVSUl9DT0xPUl9NQVRDSF9TRVRVUF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4NyAvLyBJbnZhbGlkIGNvbG9yIG1hdGNoIHNldHVwIGRhdGEuCisjZGVmaW5lIEVSUl9DT0xPUl9NQVRDSF9TRVRVUF9EQVRBX1NIQVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4NiAvLyBJbnZhbGlkIGNvbG9yIG1hdGNoIHNldHVwIGRhdGEuCisjZGVmaW5lIEVSUl9DT0xPUl9ST1RBVElPTl9SRVFVSVJFU19TSEFQRV9GRUFUVVJFICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4NSAvLyBSb3RhdGlvbi1pbnZhcmlhbnQgY29sb3IgcGF0dGVybiBtYXRjaGluZyByZXF1aXJlcyBhIGZlYXR1cmUgbW9kZSBpbmNsdWRpbmcgc2hhcGUuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4NCAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzODMgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzgyIC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM4MSAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzODAgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzc5IC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM3OCAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNzcgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfTk9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzc2IC8vIFRoZSBjb2xvciB0ZW1wbGF0ZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGRhdGEgcmVxdWlyZWQgZm9yIHNoaWZ0LWludmFyaWFudCBjb2xvciBtYXRjaGluZy4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMSAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mzc1IC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1NISUZUXzIgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM3NCAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTiAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNzMgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfTk9ST1RBVElPTiAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzcyIC8vIFRoZSBjb2xvciB0ZW1wbGF0ZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGRhdGEgcmVxdWlyZWQgZm9yIHJvdGF0aW9uLWludmFyaWFudCBjb2xvciBtYXRjaGluZy4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fMSAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzcxIC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzIgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM3MCAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl8zICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNjkgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fNCAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzY4IC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzUgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM2NyAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NIQVBFICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNjYgLy8gVGhlIGNvbG9yIHRlbXBsYXRlIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3IgY29sb3IgbWF0Y2hpbmcgaW4gc2hhcGUgZmVhdHVyZSBtb2RlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NQRUNUUlVNICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNjUgLy8gVGhlIGNvbG9yIHRlbXBsYXRlIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3IgY29sb3IgbWF0Y2hpbmcgaW4gY29sb3IgZmVhdHVyZSBtb2RlLgorI2RlZmluZSBFUlJfSUdOT1JFX0NPTE9SX1NQRUNUUlVNX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNjQgLy8gVGhlIGlnbm9yZSBjb2xvciBzcGVjdHJhIGFycmF5IGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NVQlNBTVBMSU5HX1JBVElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM2MyAvLyBJbnZhbGlkIHN1YnNhbXBsaW5nIHJhdGlvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNjIgLy8gSW52YWxpZCBwaXhlbCB3aWR0aC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFRVBORVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzYxIC8vIEludmFsaWQgc3RlZXBuZXNzLgorI2RlZmluZSBFUlJfQ09NUExFWF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNjAgLy8gSW52YWxpZCBjb21wbGV4IHBsYW5lLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT0xPUl9JR05PUkVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNTcgLy8gSW52YWxpZCBjb2xvciBpZ25vcmUgbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOX01BVENIX1NDT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzU2IC8vIEludmFsaWQgbWluaW11bSBtYXRjaCBzY29yZS4gQWNjZXB0YWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDEwMDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX05VTV9NQVRDSEVTX1JFUVVFU1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM1NSAvLyBJbnZhbGlkIG51bWJlciBvZiBtYXRjaGVzIHJlcXVlc3RlZC4gWW91IG11c3QgcmVxdWVzdCBhIG1pbmltdW0gb2Ygb25lIG1hdGNoLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT0xPUl9XRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNTQgLy8gSW52YWxpZCBjb2xvciB3ZWlnaHQuIEFjY2VwdGFibGUgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAxMDAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TRUFSQ0hfU1RSQVRFR1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNTMgLy8gSW52YWxpZCBzZWFyY2ggc3RyYXRlZ3kuCisjZGVmaW5lIEVSUl9JTlZBTElEX0ZFQVRVUkVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM1MiAvLyBJbnZhbGlkIGZlYXR1cmUgbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzUxIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHJlY3RhbmdsZXMgd2l0aCBuZWdhdGl2ZSB3aWR0aHMgb3IgbmVnYXRpdmUgaGVpZ2h0cy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVklTSU9OX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzUwIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2aXNpb24gaW5mb3JtYXRpb24gdHlwZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NLRUxFVE9OTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM0OSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgU2tlbGV0b25NZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF8zRFBMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNDggLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIDNEUGxhbmUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF8zRERJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNDcgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIDNERGlyZWN0aW9uIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRF9GT1JfUk9UQVRFICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzQ2IC8vIGltYXFSb3RhdGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSW50ZXJwb2xhdGlvbk1ldGhvZCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0ZMSVBBWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM0NSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYXhpcyBvZiBzeW1tZXRyeSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9GSUxFX0ZJTEVOQU1FX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTM0MyAvLyBZb3UgbXVzdCBwYXNzIGEgdmFsaWQgZmlsZSBuYW1lLiBEbyBub3QgcGFzcyBpbiBOVUxMLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TSVpFVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzNDAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNpemVUeXBlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX1VOS05PV05fQUxHT1JJVEhNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzM2IC8vIFlvdSBzcGVjaWZpZWQgdGhlIGRpc3BhdGNoIHN0YXR1cyBvZiBhbiB1bmtub3duIGFsZ29yaXRobS4KKyNkZWZpbmUgRVJSX0RJU1BBVENIX1NUQVRVU19DT05GTElDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzM1IC8vIFlvdSBhcmUgYXR0ZW1wdGluZyB0byBzZXQgdGhlIHNhbWUgYWxnb3JpdGhtIHRvIGRpc3BhdGNoIGFuZCB0byBub3QgZGlzcGF0Y2guIFJlbW92ZSBvbmUgb2YgdGhlIGNvbmZsaWN0aW5nIHNldHRpbmdzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT05WRVJTSU9OU1RZTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMzQgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvbnZlcnNpb24gTWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVkVSVElDQUxfVEVYVF9BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzMzIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBWZXJ0aWNhbFRleHRBbGlnbm1lbnQgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT01QQVJFRlVOQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMzIgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvbXBhcmVGdW5jdGlvbiB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0JPUkRFUk1FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMzMSAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQm9yZGVyTWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQk9SREVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzMwIC8vIEludmFsaWQgYm9yZGVyIHNpemUuIEFjY2VwdGFibGUgdmFsdWVzIHJhbmdlIGZyb20gMCB0byA1MC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfT1VUTElORU1FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzI5IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBPdXRsaW5lTWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzI4IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJbnRlcnBvbGF0aW9uTWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0NBTElOR01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzI3IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTY2FsaW5nTW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0RSQVdNT0RFX0ZPUl9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMyNiAvLyBpbWFxRHJhd0xpbmVPbkltYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlIERyYXdNb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRFJBV01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzI1IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBEcmF3TW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NIQVBFTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMyNCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgU2hhcGVNb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRk9OVENPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzIzIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBGb250Q29sb3IgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9URVhUQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMjIgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFRleHRBbGlnbm1lbnQgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NT1JQSE9MT0dZTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMjEgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIE1vcnBob2xvZ3lNZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfVEVNUExBVEVfRU1QVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMjAgLy8gVGhlIHRlbXBsYXRlIGltYWdlIGlzIGVtcHR5LgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVUJQSVhfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMTkgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGludGVycG9sYXRpb24gdHlwZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlNGX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMxOCAvLyBZb3Ugc3VwcGxpZWQgYW4gaW5zdWZmaWNpZW50IG51bWJlciBvZiBwb2ludHMgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX1VOREVGX1BPSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzE3IC8vIFlvdSBzcGVjaWZpZWQgYSBwb2ludCB0aGF0IGxpZXMgb3V0c2lkZSB0aGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9JTlZBTElEX0tFUk5FTF9DT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMxNiAvLyBJbnZhbGlkIGtlcm5lbCBjb2RlLgorI2RlZmluZSBFUlJfSU5FRkZJQ0lFTlRfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMTUgLy8gWW91IHN1cHBsaWVkIGFuIGluZWZmaWNpZW50IHNldCBvZiBwb2ludHMgdG8gbWF0Y2ggdGhlIG1pbmltdW0gc2NvcmUuCisjZGVmaW5lIEVSUl9XUklURV9GSUxFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMxMyAvLyBXcml0aW5nIGZpbGVzIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuCisjZGVmaW5lIEVSUl9MQ0RfQ0FMSUJSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMxMiAvLyBUaGUgaW5wdXQgaW1hZ2UgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIExDRCBvciBMRUQgY2FsaWJyYXRpb24gaW1hZ2UuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SX1NQRUNUUlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMxMSAvLyBUaGUgY29sb3Igc3BlY3RydW0gYXJyYXkgeW91IHByb3ZpZGVkIGhhcyBhbiBpbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBvciBjb250YWlucyBhbiBlbGVtZW50IHNldCB0byBub3QtYS1udW1iZXIgKE5hTikuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBTEVUVEVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMxMCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgUGFsZXR0ZVR5cGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9XSU5ET1dfVEhSRUFEX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMDkgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFdpbmRvd1RocmVhZFBvbGljeSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SU0VOU0lUSVZJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwOCAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ29sb3JTZW5zaXRpdml0eSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9QUkVDSVNJT05fTk9UX0dUUl9USEFOXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwNyAvLyBUaGUgcHJlY2lzaW9uIHBhcmFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9UT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMDYgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFRvb2wgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9SRUZFUkVOQ0VNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMDUgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFJlZmVyZW5jZU1vZGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRIVFJBTlNGT1JNTUVUSE9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMDQgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIE1hdGhUcmFuc2Zvcm1NZXRob2QgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OVU1fT0ZfQ0xBU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUzMDMgLy8gSW52YWxpZCBudW1iZXIgb2YgY2xhc3NlcyBmb3IgYXV0byB0aHJlc2hvbGQuIEFjY2VwdGFibGUgdmFsdWVzIHJhbmdlIGZyb20gMiB0byAyNTYuCisjZGVmaW5lIEVSUl9JTlZBTElEX1RIUkVTSE9MRE1FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwMiAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgdGhyZXNob2xkIG1ldGhvZCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9ST0lfTk9UXzJfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTMwMSAvLyBUaGUgUk9JIHlvdSBwYXNzZWQgaW50byBpbWFxR2V0TWV0ZXJBcmMgbXVzdCBjb25zaXN0IG9mIHR3byBsaW5lcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUVURVJBUkNNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MzAwIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBNZXRlckFyY01vZGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT01QTEVYUExBTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyOTkgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvbXBsZXhQbGFuZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9DT01QTEVYUExBTkVfTk9UX1JFQUxfT1JfSU1BR0lOQVJZICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI5OCAvLyBZb3UgY2FuIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gb24gYSByZWFsIG9yIGFuIGltYWdpbmFyeSBDb21wbGV4UGxhbmUgb25seS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUEFSVElDTEVJTkZPTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjk3IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBQYXJ0aWNsZUluZm9Nb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQkFSQ09ERVRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjk2IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBCYXJjb2RlVHlwZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfSU5URVJQT0xBVEVQT0lOVFMgICAgICAgICAgICAtMTA3NDM5NTI5NSAvLyBpbWFxSW50ZXJwb2xhdGVQb2ludHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSW50ZXJwb2xhdGlvbk1ldGhvZCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9DT05UT1VSX0lOREVYX09VVF9PRl9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI5NCAvLyBUaGUgY29udG91ciBpbmRleCB5b3Ugc3VwcGxpZWQgaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBjb250b3VycyBpbiB0aGUgUk9JLgorI2RlZmluZSBFUlJfQ09OVE9VUklEX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyOTMgLy8gVGhlIHN1cHBsaWVkIENvbnRvdXJJRCBkaWQgbm90IGNvcnJlbGF0ZSB0byBhIGNvbnRvdXIgaW5zaWRlIHRoZSBST0kuCisjZGVmaW5lIEVSUl9QT0lOVFNfQVJFX0NPTExJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI5MiAvLyBEbyBub3Qgc3VwcGx5IGNvbGxpbmVhciBwb2ludHMgZm9yIHRoaXMgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfU0hBUEVNQVRDSF9CQURJTUFHRURBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyOTEgLy8gU2hhcGUgTWF0Y2ggcmVxdWlyZXMgdGhlIGltYWdlIHRvIGNvbnRhaW4gb25seSBwaXhlbCB2YWx1ZXMgb2YgMCBvciAxLgorI2RlZmluZSBFUlJfU0hBUEVNQVRDSF9CQURURU1QTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyOTAgLy8gVGhlIHRlbXBsYXRlIHlvdSBzdXBwbGllZCBmb3IgU2hhcGVNYXRjaCBjb250YWlucyBubyBzaGFwZSBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgRVJSX0NPTlRBSU5FUl9DQVBBQ0lUWV9FWENFRURFRF9VSU5UX01BWCAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjg5IC8vIFRoZSBvcGVyYXRpb24gd291bGQgaGF2ZSBleGNlZWRlZCB0aGUgY2FwYWNpdHkgb2YgYW4gaW50ZXJuYWwgY29udGFpbmVyLCB3aGljaCBpcyBsaW1pdGVkIHRvIDQyOTQ5NjcyOTYgdW5pcXVlIGVsZW1lbnRzLgorI2RlZmluZSBFUlJfQ09OVEFJTkVSX0NBUEFDSVRZX0VYQ0VFREVEX0lOVF9NQVggICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyODggLy8gVGhlIG9wZXJhdGlvbiB3b3VsZCBoYXZlIGV4Y2VlZGVkIHRoZSBjYXBhY2l0eSBvZiBhbiBpbnRlcm5hbCBjb250YWluZXIsIHdoaWNoIGlzIGxpbWl0ZWQgdG8gMjE0NzQ4MzY0OCB1bmlxdWUgZWxlbWVudHMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI4NyAvLyBUaGUgbGluZSB5b3UgcHJvdmlkZWQgY29udGFpbnMgdHdvIGlkZW50aWNhbCBwb2ludHMsIG9yIG9uZSBvZiB0aGUgY29vcmRpbmF0ZSBsb2NhdGlvbnMgZm9yIHRoZSBsaW5lIGlzIG5vdCBhIG51bWJlciAoTmFOKS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09OQ0VOVFJJQ19SQUtFX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjg2IC8vIEludmFsaWQgY29uY2VudHJpYyByYWtlIGRpcmVjdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1BPS0VfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjg1IC8vIEludmFsaWQgc3Bva2UgZGlyZWN0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9FREdFX1BST0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyODQgLy8gSW52YWxpZCBlZGdlIHByb2Nlc3MuCisjZGVmaW5lIEVSUl9JTlZBTElEX1JBS0VfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI4MyAvLyBJbnZhbGlkIHJha2UgZGlyZWN0aW9uLgorI2RlZmluZSBFUlJfQ0FOVF9EUkFXX0lOVE9fVklFV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyODIgLy8gVW5hYmxlIHRvIGRyYXcgdG8gdmlld2VyLiBZb3UgbXVzdCBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgY29udHJvbC4KKyNkZWZpbmUgRVJSX0lNQUdFX1NNQUxMRVJfVEhBTl9CT1JERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjgxIC8vIFlvdXIgaW1hZ2UgbXVzdCBiZSBsYXJnZXIgdGhhbiBpdHMgYm9yZGVyIHNpemUgZm9yIHRoaXMgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfUk9JX05PVF9SRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyODAgLy8gVGhlIFJPSSBtdXN0IG9ubHkgaGF2ZSBhIHNpbmdsZSBSZWN0YW5nbGUgY29udG91ci4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfUE9MWUdPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjc5IC8vIFJPSSBpcyBub3QgYSBwb2x5Z29uLgorI2RlZmluZSBFUlJfTENEX05PVF9OVU1FUklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNzggLy8gTENEIGltYWdlIGlzIG5vdCBhIG51bWJlci4KKyNkZWZpbmUgRVJSX0JBUkNPREVfQ0hFQ0tTVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjc3IC8vIFRoZSBkZWNvZGVkIGJhcmNvZGUgaW5mb3JtYXRpb24gZGlkIG5vdCBwYXNzIHRoZSBjaGVja3N1bSB0ZXN0LgorI2RlZmluZSBFUlJfTElORVNfUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNzYgLy8gWW91IHNwZWNpZmllZCBwYXJhbGxlbCBsaW5lcyBmb3IgdGhlIG1ldGVyIFJPSS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQlJPV1NFUl9JTUFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1Mjc1IC8vIEludmFsaWQgYnJvd3NlciBpbWFnZS4KKyNkZWZpbmUgRVJSX0RJVl9CWV9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjcwIC8vIENhbm5vdCBkaXZpZGUgYnkgemVyby4KKyNkZWZpbmUgRVJSX05VTExfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjY5IC8vIE51bGwgcG9pbnRlci4KKyNkZWZpbmUgRVJSX0xJTkVBUl9DT0VGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjY4IC8vIFRoZSBsaW5lYXIgZXF1YXRpb25zIGFyZSBub3QgaW5kZXBlbmRlbnQuCisjZGVmaW5lIEVSUl9DT01QTEVYX1JPT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI2NyAvLyBUaGUgcm9vdHMgb2YgdGhlIGVxdWF0aW9uIGFyZSBjb21wbGV4LgorI2RlZmluZSBFUlJfQkFSQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNjUgLy8gVGhlIGJhcmNvZGUgZG9lcyBub3QgbWF0Y2ggdGhlIHR5cGUgeW91IHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0xDRF9OT19TRUdNRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjYzIC8vIE5vIGxpdCBzZWdtZW50LgorI2RlZmluZSBFUlJfTENEX0JBRF9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNjIgLy8gVGhlIExDRCBkb2VzIG5vdCBmb3JtIGEga25vd24gZGlnaXQuCisjZGVmaW5lIEVSUl9HSVBfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI2MSAvLyBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGFjY2VzcyBhbiBpbnZhbGlkIGNvb3JkaW5hdGUgb24gYW4gaW1hZ2UuCisjZGVmaW5lIEVSUl9IRUFQX1RSQVNIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI2MCAvLyBBbiBpbnRlcm5hbCBtZW1vcnkgZXJyb3Igb2NjdXJyZWQuCisjZGVmaW5lIEVSUl9CQURfRklMVEVSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI1OCAvLyBUaGUgZmlsdGVyIHdpZHRoIG11c3QgYmUgb2RkIGZvciB0aGUgQ2Fubnkgb3BlcmF0b3IuCisjZGVmaW5lIEVSUl9JTlZBTElEX0VER0VfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI1NyAvLyBZb3Ugc3VwcGxpZWQgYW4gaW52YWxpZCBlZGdlIGRpcmVjdGlvbiBpbiB0aGUgQ2Fubnkgb3BlcmF0b3IuCisjZGVmaW5lIEVSUl9FVkVOX1dJTkRPV19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI1NiAvLyBUaGUgd2luZG93IHNpemUgbXVzdCBiZSBvZGQgZm9yIHRoZSBDYW5ueSBvcGVyYXRvci4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTEVBUk5fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjUzIC8vIEludmFsaWQgbGVhcm4gbW9kZS4KKyNkZWZpbmUgRVJSX0xFQVJOX1NFVFVQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjUyIC8vIEludmFsaWQgbGVhcm4gc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFUQ0hfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjUxIC8vIEludmFsaWQgbWF0Y2ggbW9kZS4KKyNkZWZpbmUgRVJSX01BVENIX1NFVFVQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjUwIC8vIEludmFsaWQgbWF0Y2ggc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX1JPVEFUSU9OX0FOR0xFX1JBTkdFX1RPT19MQVJHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjQ5IC8vIEF0IGxlYXN0IG9uZSByYW5nZSBpbiB0aGUgYXJyYXkgb2Ygcm90YXRpb24gYW5nbGUgcmFuZ2VzIGV4Y2VlZHMgMzYwIGRlZ3JlZXMuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9ST1RBVElPTl9BTkdMRV9SQU5HRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI0OCAvLyBUaGUgYXJyYXkgb2Ygcm90YXRpb24gYW5nbGUgcmFuZ2VzIGNvbnRhaW5zIHRvbyBtYW55IHJhbmdlcy4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjQ3IC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjQ2IC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjQ1IC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjQ0IC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjQzIC8vIFRoZSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHVzZSB0aGlzIHRlbXBsYXRlLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNDIgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1JPVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyNDEgLy8gVGhlIHRlbXBsYXRlIGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBkYXRhIHJlcXVpcmVkIGZvciByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTI0MCAvLyBJbnZhbGlkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIzOSAvLyBJbnZhbGlkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SX05PU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIzOCAvLyBUaGUgdGVtcGxhdGUgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIGRhdGEgcmVxdWlyZWQgZm9yIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjM3IC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfTk9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjM2IC8vIFRoZSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3Igc2NhbGUtaW52YXJpYW50IG1hdGNoaW5nLgorI2RlZmluZSBFUlJfVEVNUExBVEVfSU1BR0VfQ09OVFJBU1RfVE9PX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMzUgLy8gVGhlIHRlbXBsYXRlIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGNvbnRyYXN0LgorI2RlZmluZSBFUlJfVEVNUExBVEVfSU1BR0VfVE9PX1NNQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMzQgLy8gVGhlIHRlbXBsYXRlIGltYWdlIGlzIHRvbyBzbWFsbC4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0lNQUdFX1RPT19MQVJHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjMzIC8vIFRoZSB0ZW1wbGF0ZSBpbWFnZSBpcyB0b28gbGFyZ2UuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9PQ1JfU0VTU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIxNCAvLyBUaGVyZSBhcmUgdG9vIG1hbnkgT0NSIHNlc3Npb25zIG9wZW4uICBZb3UgbXVzdCBjbG9zZSBhIHNlc3Npb24gYmVmb3JlIHlvdSBjYW4gb3BlbiBhbm90aGVyIG9uZS4KKyNkZWZpbmUgRVJSX09DUl9URU1QTEFURV9XUk9OR19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjEyIC8vIFRoZSBzaXplIG9mIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgbXVzdCBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHlvdSBhcmUgdHJ5aW5nIHRvIGNvcnJlY3QuCisjZGVmaW5lIEVSUl9PQ1JfQkFEX1RFWFRfVEVNUExBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIxMSAvLyBUaGUgc3VwcGxpZWQgdGV4dCB0ZW1wbGF0ZSBjb250YWlucyBub25zdGFuZGFyZCBjaGFyYWN0ZXJzIHRoYXQgY2Fubm90IGJlIGdlbmVyYXRlZCBieSBPQ1IuCisjZGVmaW5lIEVSUl9PQ1JfQ0FOTk9UX01BVENIX1RFWFRfVEVNUExBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTIxMCAvLyBBdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSB0ZXh0IHRlbXBsYXRlIHdhcyBvZiBhIGxleGljYWwgY2xhc3MgdGhhdCBkaWQgbm90IG1hdGNoIHRoZSBzdXBwbGllZCBjaGFyYWN0ZXIgcmVwb3J0cy4KKyNkZWZpbmUgRVJSX09DUl9MSUJfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MjAzIC8vIFRoZSBPQ1IgbGlicmFyeSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LgorI2RlZmluZSBFUlJfT0NSX0xPQURfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMDEgLy8gVGhlcmUgd2FzIGEgZmFpbHVyZSB3aGVuIGxvYWRpbmcgb25lIG9mIHRoZSBpbnRlcm5hbCBPQ1IgZW5naW5lIG9yIExhYlZpZXcgbGlicmFyaWVzLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUyMDAgLy8gT25lIG9mIHRoZSBwYXJhbWV0ZXJzIHN1cHBsaWVkIHRvIHRoZSBPQ1IgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZWQgdGhpcyBlcnJvciBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfTUFSS0VSX0lORk9STUFUSU9OX05PVF9TVVBQTElFRCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxOTkgLy8gTWFya2VyIGltYWdlIGFuZCBwb2ludHMgYXJlIG5vdCBzdXBwbGllZAorI2RlZmluZSBFUlJfSU5DT01QQVRJQkxFX01BUktFUl9JTUFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxOTggLy8gU291cmNlIEltYWdlIGFuZCBNYXJrZXIgSW1hZ2Ugc2hvdWxkIGJlIG9mIHNhbWUgc2l6ZS4KKyNkZWZpbmUgRVJSX0JPVEhfTUFSS0VSX0lOUFVUU19TVVBQTElFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTk3IC8vIEJvdGggTWFya2VyIEltYWdlIGFuZCBQb2ludHMgYXJlIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NT1JQSE9MT0dJQ0FMX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxOTYgLy8gSW52YWxpZCBNb3JwaG9sb2dpY2FsIE9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX0lNQUdFX0NPTlRBSU5TX05BTl9WQUxVRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTk1IC8vIEZsb2F0IGltYWdlIGNvbnRhaW5zIE5hTiB2YWx1ZXMKKyNkZWZpbmUgRVJSX09WRVJMQVlfRVhUUkFJTkZPX09QRU5JTkdfTkVXX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTk0IC8vIFRoZSBvdmVybGF5IGluZm9ybWF0aW9uIHlvdSB0cmllZCB0byBvcGVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBmaWxlLgorI2RlZmluZSBFUlJfTk9fQ0xBTVBfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxOTMgLy8gTm8gdmFsaWQgY2xhbXAgd2FzIGZvdW5kIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgorI2RlZmluZSBFUlJfTk9fQ0xBTVBfV0lUSElOX0FOR0xFX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxOTIgLy8gU3VwcGxpZWQgYW5nbGUgcmFuZ2UgZm9yIGNsYW1wIGlzIGluc3VmZmljaWVudAorI2RlZmluZSBFUlJfR0hUX0lOVkFMSURfVVNFX0FMTF9DVVJWRVNfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODggLy8gVGhlIHVzZSBhbGwgY3VydmVzIGFkdmFuY2VkIG9wdGlvbiBzcGVjaWZpZWQgZHVyaW5nIGxlYXJuIGlzIG5vdCBzdXBwb3J0ZWQKKyNkZWZpbmUgRVJSX0lOVkFMSURfR0FVU1NfU0lHTUFfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTg3IC8vIFRoZSBzaWdtYSB2YWx1ZSBzcGVjaWZpZWQgZm9yIHRoZSBHYXVzc2lhbiBmaWx0ZXIgaXMgdG9vIHNtYWxsLgorI2RlZmluZSBFUlJfSU5WQUxJRF9HQVVTU19GSUxURVJfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODYgLy8gVGhlIHNwZWNpZmllZCBHYXVzc2lhbiBmaWx0ZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT05UUkFTVF9SRVZFUlNBTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODUgLy8gVGhlIGNvbnRyYXN0IHJldmVyc2FsIG1vZGUgc3BlY2lmaWVkIGR1cmluZyBtYXRjaGluZyBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9ST1RBVElPTl9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODQgLy8gSW52YWxpZCByb2F0aW9uIGFuZ2xlIHJhbmdlLiBUaGUgdXBwZXIgYm91bmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxvd2VyIGJvdW5kLgorI2RlZmluZSBFUlJfR0hUX0lOVkFMSURfTUlOSU1VTV9MRUFSTl9BTkdMRV9WQUxVRSAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODMgLy8gVGhlIG1pbmltdW0gcm90YXRpb24gYW5nbGUgdmFsdWUgc3BlY2lmZWQgZHVyaW5nIGxlYXJuaW5nIG9mIHRoZSB0ZW1wbGF0ZSBpcyBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfR0hUX0lOVkFMSURfTUFYSU1VTV9MRUFSTl9BTkdMRV9WQUxVRSAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODIgLy8gVGhlIG1heGltdW0gcm90YXRpb24gYW5nbGUgdmFsdWUgc3BlY2lmZWQgZHVyaW5nIGxlYXJuaW5nIG9mIHRoZSB0ZW1wbGF0ZSBpcyBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfR0hUX0lOVkFMSURfTUFYSU1VTV9MRUFSTl9TQ0FMRV9GQUNUT1IgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxODEgLy8gVGhlIG1heGltdW0gc2NhbGUgZmFjdG9yIHNwZWNpZmVkIGR1cmluZyBsZWFybmluZyBvZiB0aGUgdGVtcGxhdGUgaXMgbm90IHN1cHBvcnRlZC4KKyNkZWZpbmUgRVJSX0dIVF9JTlZBTElEX01JTklNVU1fTEVBUk5fU0NBTEVfRkFDVE9SICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTgwIC8vIFRoZSBtaW5pbXVtIHNjYWxlIGZhY3RvciBzcGVjaWZlZCBkdXJpbmcgbGVhcm5pbmcgb2YgdGhlIHRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9PQ1JfUFJFUFJPQ0VTU0lOR19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE3OSAvLyBUaGUgT0NSIGVuZ2luZSBmYWlsZWQgZHVyaW5nIHRoZSBwcmVwcm9jZXNzaW5nIHN0YWdlLgorI2RlZmluZSBFUlJfT0NSX1JFQ09HTklUSU9OX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNzggLy8gVGhlIE9DUiBlbmdpbmUgZmFpbGVkIGR1cmluZyB0aGUgcmVjb2duaXRpb24gc3RhZ2UuCisjZGVmaW5lIEVSUl9PQ1JfQkFEX1VTRVJfRElDVElPTkFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE3NSAvLyBUaGUgcHJvdmlkZWQgZmlsZW5hbWUgaXMgbm90IHZhbGlkIHVzZXIgZGljdGlvbmFyeSBmaWxlbmFtZS4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX0FVVE9PUklFTlRNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTc0IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBBdXRvT3JpZW50TW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9MQU5HVUFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE3MyAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgTGFuZ3VhZ2UgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQ0hBUkFDVEVSU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNzIgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENoYXJhY3RlclNldCB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5JX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE3MSAvLyBUaGUgc3lzdGVtIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgcmVxdWlyZWQgZm9yIE9DUiBpbml0aWFsaXphdGlvbi4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX0NIQVJBQ1RFUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTcwIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDaGFyYWN0ZXJUeXBlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX1JFQ09HTklUSU9OTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTY5IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBSZWNvZ25pdGlvbk1vZGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQVVUT0NPUlJFQ1RJT05NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNjggLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIEF1dG9Db3JyZWN0aW9uTW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9PVVRQVVRERUxJTUlURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE2NyAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgT3V0cHV0RGVsaW1pdGVyIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9CSU5fRElSX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTY2IC8vIFRoZSBzeXN0ZW0gY291bGQgbm90IGxvY2F0ZSB0aGUgT0NSIGJpbmFyeSBkaXJlY3RvcnkgcmVxdWlyZWQgZm9yIE9DUiBpbml0aWFsaXphdGlvbi4KKyNkZWZpbmUgRVJSX09DUl9XVFNfRElSX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTY1IC8vIFRoZSBzeXN0ZW0gY291bGQgbm90IGxvY2F0ZSB0aGUgT0NSIHdlaWdodHMgZGlyZWN0b3J5IHJlcXVpcmVkIGZvciBPQ1IgaW5pdGlhbGl6YXRpb24uCisjZGVmaW5lIEVSUl9PQ1JfQUREX1dPUkRfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE2NCAvLyBUaGUgc3VwcGxpZWQgd29yZCBjb3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIHVzZXIgZGljdGlvbmFyeS4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX0NIQVJBQ1RFUlBSRUZFUkVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTYzIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDaGFyYWN0ZXJQcmVmZXJlbmNlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX0NPUlJFQ1RJT05NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTYyIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDb3JyZWN0aW9uTWV0aG9kIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX0NPUlJFQ1RJT05MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTYxIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDb3JyZWN0aW9uTGV2ZWwgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfTUFYUE9JTlRTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNjAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1heGltdW0gcG9pbnQgc2l6ZSB5b3Ugc3VwcGxpZWQuICBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSA0IHRvIDcyLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfVE9MRVJBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNTkgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHRvbGVyYW5jZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuICBWYWxpZCB2YWx1ZXMgYXJlIG5vbi1uZWdhdGl2ZS4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX0NPTlRSQVNUTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTU4IC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDb250cmFzdE1vZGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX1NLRVdfREVURUNUX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNTYgLy8gVGhlIE9DUiBhdHRlbXB0ZWQgdG8gZGV0ZWN0ZWQgdGhlIHRleHQgc2tldyBhbmQgZmFpbGVkLgorI2RlZmluZSBFUlJfT0NSX09SSUVOVF9ERVRFQ1RfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNTUgLy8gVGhlIE9DUiBhdHRlbXB0ZWQgdG8gZGV0ZWN0ZWQgdGhlIHRleHQgb3JpZW50YXRpb24gYW5kIGZhaWxlZC4KKyNkZWZpbmUgRVJSX0ZPTlRfRklMRV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTUzIC8vIEludmFsaWQgZm9udCBmaWxlIGZvcm1hdC4KKyNkZWZpbmUgRVJSX0ZPTlRfRklMRV9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTUyIC8vIEZvbnQgZmlsZSBub3QgZm91bmQuCisjZGVmaW5lIEVSUl9PQ1JfQ09SUkVDVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE1MSAvLyBUaGUgT0NSIGVuZ2luZSBmYWlsZWQgZHVyaW5nIHRoZSBjb3JyZWN0aW9uIHN0YWdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9ST1VORElOR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNTAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFJvdW5kaW5nTW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9EVVBMSUNBVEVfVFJBTlNGT1JNX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE0OSAvLyBGb3VuZCBhIGR1cGxpY2F0ZSB0cmFuc2Zvcm0gdHlwZSBpbiB0aGUgcHJvcGVydGllcyBhcnJheS4gRWFjaCBwcm9wZXJ0aWVzIGFycmF5IG1heSBvbmx5IGNvbnRhaW4gb25lIGJlaGF2aW9yIGZvciBlYWNoIHRyYW5zZm9ybSB0eXBlLgorI2RlZmluZSBFUlJfT1ZFUkxBWV9HUk9VUF9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNDggLy8gT3ZlcmxheSBHcm91cCBOb3QgRm91bmQuCisjZGVmaW5lIEVSUl9CQVJDT0RFX1JTU0xJTUlURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE0NyAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBSU1MgTGltaXRlZCBzeW1ib2wKKyNkZWZpbmUgRVJSX1FSX0RFVEVDVElPTl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTQ2IC8vIENvdWxkbid0IGRldGVybWluZSB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZSBRUiBjb2RlLgorI2RlZmluZSBFUlJfUVJfSU5WQUxJRF9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNDUgLy8gSW52YWxpZCByZWFkIG9mIHRoZSBRUiBjb2RlLgorI2RlZmluZSBFUlJfUVJfSU5WQUxJRF9CQVJDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNDQgLy8gVGhlIGJhcmNvZGUgdGhhdCB3YXMgcmVhZCBjb250YWlucyBpbnZhbGlkIHBhcmFtZXRlcnMuCisjZGVmaW5lIEVSUl9RUl9ERVRFQ1RJT05fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3NDM5NTE0MyAvLyBUaGUgZGF0YSBzdHJlYW0gdGhhdCB3YXMgZGVtb2R1bGF0ZWQgY291bGQgbm90IGJlIHJlYWQgYmVjYXVzZSB0aGUgbW9kZSB3YXMgbm90IGRldGVjdGVkLgorI2RlZmluZSBFUlJfUVJfREVURUNUSU9OX01PREVMVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNDIgLy8gQ291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IG1vZGVsIG9mIHRoZSBRUiBjb2RlLgorI2RlZmluZSBFUlJfT0NSX05PX1RFWFRfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxNDEgLy8gVGhlIE9DUiBlbmdpbmUgY291bGQgbm90IGZpbmQgYW55IHRleHQgaW4gdGhlIHN1cHBsaWVkIHJlZ2lvbi4KKyNkZWZpbmUgRVJSX09DUl9DSEFSX1JFUE9SVF9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDc0Mzk1MTQwIC8vIE9uZSBvZiB0aGUgY2hhcmFjdGVyIHJlcG9ydHMgaXMgbm8gbG9uZ2VyIHVzYWJsZSBieSB0aGUgc3lzdGVtLgorI2RlZmluZSBFUlJfSU1BUV9RUl9ESU1FTlNJT05fSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxMzkgLy8gSW52YWxpZCBEaW1lbnNpb25zLgorI2RlZmluZSBFUlJfT0NSX1JFR0lPTl9UT09fU01BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzQzOTUxMzggLy8gVGhlIE9DUiByZWdpb24gcHJvdmlkZWQgd2FzIHRvbyBzbWFsbCB0byBoYXZlIGNvbnRhaW5lZCBhbnkgY2hhcmFjdGVycy4KKyNkZWZpbmUgX0ZJUlNUX0VSUiAgRVJSX1NZU1RFTV9FUlJPUgorI2RlZmluZSBfTEFTVF9FUlIgICBFUlJfT0NSX1JFR0lPTl9UT09fU01BTEwKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRW51bWVyYXRlZCBUeXBlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gUG9pbnRTeW1ib2xfZW51bSB7CisgICAgSU1BUV9QT0lOVF9BU19QSVhFTCAgICAgICAgICA9IDAsICAgICAgICAgICAvL0Egc2luZ2xlIHBpeGVsIHJlcHJlc2VudHMgYSBwb2ludCBpbiB0aGUgb3ZlcmxheS4KKyAgICBJTUFRX1BPSU5UX0FTX0NST1NTICAgICAgICAgID0gMSwgICAgICAgICAgIC8vQSBjcm9zcyByZXByZXNlbnRzIGEgcG9pbnQgaW4gdGhlIG92ZXJsYXkuCisgICAgSU1BUV9QT0lOVF9VU0VSX0RFRklORUQgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBwYXR0ZXJuIHN1cHBsaWVkIGJ5IHRoZSB1c2VyIHJlcHJlc2VudHMgYSBwb2ludCBpbiB0aGUgb3ZlcmxheS4KKyAgICBJTUFRX1BPSU5UX1NZTUJPTF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBQb2ludFN5bWJvbDsKKwordHlwZWRlZiBlbnVtIE1lYXN1cmVtZW50VmFsdWVfZW51bSB7CisgICAgSU1BUV9BUkVBICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU3VyZmFjZSBhcmVhIG9mIHRoZSBwYXJ0aWNsZSBpbiBwaXhlbHMuCisgICAgSU1BUV9BUkVBX0NBTElCUkFURUQgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU3VyZmFjZSBhcmVhIG9mIHRoZSBwYXJ0aWNsZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICAgIElNQVFfTlVNX0hPTEVTICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL051bWJlciBvZiBob2xlcyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9BUkVBX09GX0hPTEVTICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vU3VyZmFjZSBhcmVhIG9mIHRoZSBob2xlcyBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICAgIElNQVFfVE9UQUxfQVJFQSAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RvdGFsIHN1cmZhY2UgYXJlYSAoaG9sZXMgYW5kIHBhcnRpY2xlKSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICAgIElNQVFfSU1BR0VfQVJFQSAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAvL1N1cmZhY2UgYXJlYSBvZiB0aGUgZW50aXJlIGltYWdlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgSU1BUV9QQVJUSUNMRV9UT19JTUFHRSAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vUmF0aW8sIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIG9mIHRoZSBzdXJmYWNlIGFyZWEgb2YgYSBwYXJ0aWNsZSBpbiByZWxhdGlvbiB0byB0aGUgdG90YWwgYXJlYSBvZiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9QQVJUSUNMRV9UT19UT1RBTCAgICAgICAgICAgID0gNywgICAgICAgICAgIC8vUmF0aW8sIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIG9mIHRoZSBzdXJmYWNlIGFyZWEgb2YgYSBwYXJ0aWNsZSBpbiByZWxhdGlvbiB0byB0aGUgdG90YWwgYXJlYSBvZiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9DRU5URVJfTUFTU19YICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgIC8vWC1jb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgbWFzcy4KKyAgICBJTUFRX0NFTlRFUl9NQVNTX1kgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgLy9ZLWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiBtYXNzLgorICAgIElNQVFfTEVGVF9DT0xVTU4gICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAvL0xlZnQgZWRnZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgIElNQVFfVE9QX1JPVyAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAvL1RvcCBlZGdlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCisgICAgSU1BUV9SSUdIVF9DT0xVTU4gICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgIC8vUmlnaHQgZWRnZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgIElNQVFfQk9UVE9NX1JPVyAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAvL0JvdHRvbSBlZGdlIG9mIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICBJTUFRX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgLy9XaWR0aCBvZiBib3VuZGluZyByZWN0YW5nbGUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICBJTUFRX0hFSUdIVCAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgLy9IZWlnaHQgb2YgYm91bmRpbmcgcmVjdGFuZ2xlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgSU1BUV9NQVhfU0VHTUVOVF9MRU5HVEggICAgICAgICAgID0gMTYsICAgICAgICAgIC8vTGVuZ3RoIG9mIGxvbmdlc3QgaG9yaXpvbnRhbCBsaW5lIHNlZ21lbnQuCisgICAgSU1BUV9NQVhfU0VHTUVOVF9MRUZUX0NPTFVNTiAgICAgID0gMTcsICAgICAgICAgIC8vTGVmdG1vc3QgeC1jb29yZGluYXRlIG9mIGxvbmdlc3QgaG9yaXpvbnRhbCBsaW5lIHNlZ21lbnQuCisgICAgSU1BUV9NQVhfU0VHTUVOVF9UT1BfUk9XICAgICAgICAgID0gMTgsICAgICAgICAgIC8vWS1jb29yZGluYXRlIG9mIGxvbmdlc3QgaG9yaXpvbnRhbCBsaW5lIHNlZ21lbnQuCisgICAgSU1BUV9QRVJJTUVURVIgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgIC8vT3V0ZXIgcGVyaW1ldGVyIG9mIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX1BFUklNRVRFUl9PRl9IT0xFUyAgICAgICAgICAgPSAyMCwgICAgICAgICAgLy9QZXJpbWV0ZXIgb2YgYWxsIGhvbGVzIHdpdGhpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9TSUdNQV9YICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgIC8vU3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcy4KKyAgICBJTUFRX1NJR01BX1kgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgLy9TdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeS1heGlzLgorICAgIElNQVFfU0lHTUFfWFggICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAvL1N1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB4LWF4aXMgc3F1YXJlZC4KKyAgICBJTUFRX1NJR01BX1lZICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgLy9TdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeS1heGlzIHNxdWFyZWQuCisgICAgSU1BUV9TSUdNQV9YWSAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgIC8vU3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcyBhbmQgeS1heGlzLgorICAgIElNQVFfUFJPSl9YICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAvL1Byb2plY3Rpb24gY29ycmVjdGVkIGluIFguCisgICAgSU1BUV9QUk9KX1kgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgIC8vUHJvamVjdGlvbiBjb3JyZWN0ZWQgaW4gWS4KKyAgICBJTUFRX0lORVJUSUFfWFggICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgLy9JbmVydGlhIG1hdHJpeCBjb2VmZmljaWVudCBpbiBYWC4KKyAgICBJTUFRX0lORVJUSUFfWVkgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgLy9JbmVydGlhIG1hdHJpeCBjb2VmZmljaWVudCBpbiBZWS4KKyAgICBJTUFRX0lORVJUSUFfWFkgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgLy9JbmVydGlhIG1hdHJpeCBjb2VmZmljaWVudCBpbiBYWS4KKyAgICBJTUFRX01FQU5fSCAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgICAgLy9NZWFuIGxlbmd0aCBvZiBob3Jpem9udGFsIHNlZ21lbnRzLgorICAgIElNQVFfTUVBTl9WICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAvL01lYW4gbGVuZ3RoIG9mIHZlcnRpY2FsIHNlZ21lbnRzLgorICAgIElNQVFfTUFYX0lOVEVSQ0VQVCAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAvL0xlbmd0aCBvZiBsb25nZXN0IHNlZ21lbnQgb2YgdGhlIGNvbnZleCBodWxsLgorICAgIElNQVFfTUVBTl9JTlRFUkNFUFQgICAgICAgICAgICAgICA9IDM0LCAgICAgICAgICAvL01lYW4gbGVuZ3RoIG9mIHRoZSBjaG9yZHMgaW4gYW4gb2JqZWN0IHBlcnBlbmRpY3VsYXIgdG8gaXRzIG1heCBpbnRlcmNlcHQuCisgICAgSU1BUV9PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgIC8vVGhlIG9yaWVudGF0aW9uIGJhc2VkIG9uIHRoZSBpbmVydGlhIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfRVFVSVZfRUxMSVBTRV9NSU5PUiAgICAgICAgICA9IDM2LCAgICAgICAgICAvL1RvdGFsIGxlbmd0aCBvZiB0aGUgYXhpcyBvZiB0aGUgZWxsaXBzZSBoYXZpbmcgdGhlIHNhbWUgYXJlYSBhcyB0aGUgcGFydGljbGUgYW5kIGEgbWFqb3IgYXhpcyBlcXVhbCB0byBoYWxmIHRoZSBtYXggaW50ZXJjZXB0LgorICAgIElNQVFfRUxMSVBTRV9NQUpPUiAgICAgICAgICAgICAgICA9IDM3LCAgICAgICAgICAvL1RvdGFsIGxlbmd0aCBvZiBtYWpvciBheGlzIGhhdmluZyB0aGUgc2FtZSBhcmVhIGFuZCBwZXJpbWV0ZXIgYXMgdGhlIHBhcnRpY2xlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgSU1BUV9FTExJUFNFX01JTk9SICAgICAgICAgICAgICAgID0gMzgsICAgICAgICAgIC8vVG90YWwgbGVuZ3RoIG9mIG1pbm9yIGF4aXMgaGF2aW5nIHRoZSBzYW1lIGFyZWEgYW5kIHBlcmltZXRlciBhcyB0aGUgcGFydGljbGUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICBJTUFRX0VMTElQU0VfUkFUSU8gICAgICAgICAgICAgICAgPSAzOSwgICAgICAgICAgLy9GcmFjdGlvbiBvZiBtYWpvciBheGlzIHRvIG1pbm9yIGF4aXMuCisgICAgSU1BUV9SRUNUX0xPTkdfU0lERSAgICAgICAgICAgICAgID0gNDAsICAgICAgICAgIC8vTGVuZ3RoIG9mIHRoZSBsb25nIHNpZGUgb2YgYSByZWN0YW5nbGUgaGF2aW5nIHRoZSBzYW1lIGFyZWEgYW5kIHBlcmltZXRlciBhcyB0aGUgcGFydGljbGUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICBJTUFRX1JFQ1RfU0hPUlRfU0lERSAgICAgICAgICAgICAgPSA0MSwgICAgICAgICAgLy9MZW5ndGggb2YgdGhlIHNob3J0IHNpZGUgb2YgYSByZWN0YW5nbGUgaGF2aW5nIHRoZSBzYW1lIGFyZWEgYW5kIHBlcmltZXRlciBhcyB0aGUgcGFydGljbGUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgICBJTUFRX1JFQ1RfUkFUSU8gICAgICAgICAgICAgICAgICAgPSA0MiwgICAgICAgICAgLy9SYXRpbyBvZiByZWN0YW5nbGUgbG9uZyBzaWRlIHRvIHJlY3RhbmdsZSBzaG9ydCBzaWRlLgorICAgIElNQVFfRUxPTkdBVElPTiAgICAgICAgICAgICAgICAgICA9IDQzLCAgICAgICAgICAvL01heCBpbnRlcmNlcHQvbWVhbiBwZXJwZW5kaWN1bGFyIGludGVyY2VwdC4KKyAgICBJTUFRX0NPTVBBQ1RORVNTICAgICAgICAgICAgICAgICAgPSA0NCwgICAgICAgICAgLy9QYXJ0aWNsZSBhcmVhLyhoZWlnaHQgeCB3aWR0aCkuCisgICAgSU1BUV9IRVlXT09EICAgICAgICAgICAgICAgICAgICAgID0gNDUsICAgICAgICAgIC8vUGFydGljbGUgcGVyaW1ldGVyL3BlcmltZXRlciBvZiB0aGUgY2lyY2xlIGhhdmluZyB0aGUgc2FtZSBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX1RZUEVfRkFDVE9SICAgICAgICAgICAgICAgICAgPSA0NiwgICAgICAgICAgLy9BIGNvbXBsZXggZmFjdG9yIHJlbGF0aW5nIHRoZSBzdXJmYWNlIGFyZWEgdG8gdGhlIG1vbWVudCBvZiBpbmVydGlhLgorICAgIElNQVFfSFlEUkFVTElDICAgICAgICAgICAgICAgICAgICA9IDQ3LCAgICAgICAgICAvL1BhcnRpY2xlIGFyZWEvcGFydGljbGUgcGVyaW1ldGVyLgorICAgIElNQVFfV0FERExFX0RJU0sgICAgICAgICAgICAgICAgICA9IDQ4LCAgICAgICAgICAvL0RpYW1ldGVyIG9mIHRoZSBkaXNrIGhhdmluZyB0aGUgc2FtZSBhcmVhIGFzIHRoZSBwYXJ0aWNsZSBpbiB1c2VyIHVuaXRzLgorICAgIElNQVFfRElBR09OQUwgICAgICAgICAgICAgICAgICAgICA9IDQ5LCAgICAgICAgICAvL0RpYWdvbmFsIG9mIGFuIGVxdWl2YWxlbnQgcmVjdGFuZ2xlIGluIHVzZXIgdW5pdHMuCisgICAgSU1BUV9NRUFTVVJFTUVOVF9WQUxVRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBNZWFzdXJlbWVudFZhbHVlOworCit0eXBlZGVmIGVudW0gU2NhbGluZ01vZGVfZW51bSB7CisgICAgSU1BUV9TQ0FMRV9MQVJHRVIgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBkdXBsaWNhdGVzIHBpeGVscyB0byBtYWtlIHRoZSBpbWFnZSBsYXJnZXIuCisgICAgSU1BUV9TQ0FMRV9TTUFMTEVSICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzdWJzYW1wbGVzIHBpeGVscyB0byBtYWtlIHRoZSBpbWFnZSBzbWFsbGVyLgorICAgIElNQVFfU0NBTElOR19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFNjYWxpbmdNb2RlOworCit0eXBlZGVmIGVudW0gU2NhbGluZ01ldGhvZF9lbnVtIHsKKyAgICBJTUFRX1NDQUxFX1RPX1BSRVNFUlZFX0FSRUEgICAgPSAwLCAgICAgICAgICAgLy9Db3JyZWN0aW9uIGZ1bmN0aW9ucyBzY2FsZSB0aGUgaW1hZ2Ugc3VjaCB0aGF0IHRoZSBmZWF0dXJlcyBpbiB0aGUgY29ycmVjdGVkIGltYWdlIGhhdmUgdGhlIHNhbWUgYXJlYSBhcyB0aGUgZmVhdHVyZXMgaW4gdGhlIGlucHV0IGltYWdlLgorICAgIElNQVFfU0NBTEVfVE9fRklUICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0NvcnJlY3Rpb24gZnVuY3Rpb25zIHNjYWxlIHRoZSBpbWFnZSBzdWNoIHRoYXQgdGhlIGNvcnJlY3RlZCBpbWFnZSBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBpbnB1dCBpbWFnZS4KKyAgICBJTUFRX1NDQUxJTkdfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFNjYWxpbmdNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBSZWZlcmVuY2VNb2RlX2VudW0geworICAgIElNQVFfQ09PUkRfWF9ZICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoaXMgbWV0aG9kIHJlcXVpcmVzIHRocmVlIGVsZW1lbnRzIGluIHRoZSBwb2ludHMgYXJyYXkuCisgICAgSU1BUV9DT09SRF9PUklHSU5fWCAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhpcyBtZXRob2QgcmVxdWlyZXMgdHdvIGVsZW1lbnRzIGluIHRoZSBwb2ludHMgYXJyYXkuCisgICAgSU1BUV9SRUZFUkVOQ0VfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBSZWZlcmVuY2VNb2RlOworCit0eXBlZGVmIGVudW0gUmVjdE9yaWVudGF0aW9uX2VudW0geworICAgIElNQVFfQkFTRV9JTlNJREUgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGJhc2Ugb2YgdGhlIHJlY3Rhbmd1bGFyIGltYWdlIGxpZXMgYWxvbmcgdGhlIGluc2lkZSBlZGdlIG9mIHRoZSBhbm51bHVzLgorICAgIElNQVFfQkFTRV9PVVRTSURFICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGJhc2Ugb2YgdGhlIHJlY3Rhbmd1bGFyIGltYWdlIGxpZXMgYWxvbmcgdGhlIG91dHNpZGUgZWRnZSBvZiB0aGUgYW5udWx1cy4KKyAgICBJTUFRX1RFWFRfT1JJRU5UQVRJT05fU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUmVjdE9yaWVudGF0aW9uOworCit0eXBlZGVmIGVudW0gU2hhcGVNb2RlX2VudW0geworICAgIElNQVFfU0hBUEVfUkVDVCAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGRyYXdzIGEgcmVjdGFuZ2xlLgorICAgIElNQVFfU0hBUEVfT1ZBTCAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGRyYXdzIGFuIG92YWwuCisgICAgSU1BUV9TSEFQRV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFNoYXBlTW9kZTsKKwordHlwZWRlZiBlbnVtIFBvbGFyaXR5VHlwZV9lbnVtIHsKKyAgICBJTUFRX0VER0VfUklTSU5HICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBlZGdlIGlzIGEgcmlzaW5nIGVkZ2UuCisgICAgSU1BUV9FREdFX0ZBTExJTkcgICAgICAgICAgICAgPSAtMSwgICAgICAgICAgLy9UaGUgZWRnZSBpcyBhIGZhbGxpbmcgZWRnZS4KKyAgICBJTUFRX1BPTEFSSVRZX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUG9sYXJpdHlUeXBlOworCit0eXBlZGVmIGVudW0gU2l6ZVR5cGVfZW51bSB7CisgICAgSU1BUV9LRUVQX0xBUkdFICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBrZWVwcyBsYXJnZSBwYXJ0aWNsZXMgcmVtYWluaW5nIGFmdGVyIHRoZSBlcm9zaW9uLgorICAgIElNQVFfS0VFUF9TTUFMTCAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24ga2VlcHMgc21hbGwgcGFydGljbGVzIGVsaW1pbmF0ZWQgYnkgdGhlIGVyb3Npb24uCisgICAgSU1BUV9TSVpFX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gU2l6ZVR5cGU7CisKK3R5cGVkZWYgZW51bSBQbGFuZTNEX2VudW0geworICAgIElNQVFfM0RfUkVBTCAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaG93cyB0aGUgcmVhbCBwYXJ0IG9mIGNvbXBsZXggaW1hZ2VzLgorICAgIElNQVFfM0RfSU1BR0lOQVJZICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaG93cyB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgY29tcGxleCBpbWFnZXMuCisgICAgSU1BUV8zRF9NQUdOSVRVREUgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNob3dzIHRoZSBtYWduaXR1ZGUgcGFydCBvZiBjb21wbGV4IGltYWdlcy4KKyAgICBJTUFRXzNEX1BIQVNFICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hvd3MgdGhlIHBoYXNlIHBhcnQgb2YgY29tcGxleCBpbWFnZXMuCisgICAgSU1BUV9QTEFORV8zRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBQbGFuZTNEOworCit0eXBlZGVmIGVudW0gUGhvdG9tZXRyaWNNb2RlX2VudW0geworICAgIElNQVFfV0hJVEVfSVNfWkVSTyAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGludGVycHJldHMgemVyby12YWx1ZSBwaXhlbHMgYXMgd2hpdGUuCisgICAgSU1BUV9CTEFDS19JU19aRVJPICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gaW50ZXJwcmV0cyB6ZXJvLXZhbHVlIHBpeGVscyBhcyBibGFjay4KKyAgICBJTUFRX1BIT1RPTUVUUklDX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUGhvdG9tZXRyaWNNb2RlOworCit0eXBlZGVmIGVudW0gUGFydGljbGVJbmZvTW9kZV9lbnVtIHsKKyAgICBJTUFRX0JBU0lDX0lORk8gICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHJldHVybnMgb25seSB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIG9mIGVhY2ggcmVwb3J0OiBhcmVhLCBjYWxpYnJhdGVkQXJlYSwgYm91bmRpbmdSZWN0LgorICAgIElNQVFfQUxMX0lORk8gICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gcmV0dXJucyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcGFydGljbGUuCisgICAgSU1BUV9QQVJUSUNMRV9JTkZPX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUGFydGljbGVJbmZvTW9kZTsKKwordHlwZWRlZiBlbnVtIE91dGxpbmVNZXRob2RfZW51bSB7CisgICAgSU1BUV9FREdFX0RJRkZFUkVOQ0UgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBwcm9kdWNlcyBjb250aW51b3VzIGNvbnRvdXJzIGJ5IGhpZ2hsaWdodGluZyBlYWNoIHBpeGVsIHdoZXJlIGFuIGludGVuc2l0eSB2YXJpYXRpb24gb2NjdXJzIGJldHdlZW4gaXRzZWxmIGFuZCBpdHMgdGhyZWUgdXBwZXItbGVmdCBuZWlnaGJvcnMuCisgICAgSU1BUV9FREdFX0dSQURJRU5UICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBvdXRsaW5lcyBjb250b3VycyB3aGVyZSBhbiBpbnRlbnNpdHkgdmFyaWF0aW9uIG9jY3VycyBhbG9uZyB0aGUgdmVydGljYWwgYXhpcy4KKyAgICBJTUFRX0VER0VfUFJFV0lUVCAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IGV4dHJhY3RzIHRoZSBvdXRlciBjb250b3VycyBvZiBvYmplY3RzLgorICAgIElNQVFfRURHRV9ST0JFUlRTICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgb3V0bGluZXMgdGhlIGNvbnRvdXJzIHRoYXQgaGlnaGxpZ2h0IHBpeGVscyB3aGVyZSBhbiBpbnRlbnNpdHkgdmFyaWF0aW9uIG9jY3VycyBhbG9uZyB0aGUgZGlhZ29uYWwgYXhlcy4KKyAgICBJTUFRX0VER0VfU0lHTUEgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IG91dGxpbmVzIGNvbnRvdXJzIGFuZCBkZXRhaWxzIGJ5IHNldHRpbmcgcGl4ZWxzIHRvIHRoZSBtZWFuIHZhbHVlIGZvdW5kIGluIHRoZWlyIG5laWdoYm9yaG9vZCwgaWYgdGhlaXIgZGV2aWF0aW9uIGZyb20gdGhpcyB2YWx1ZSBpcyBub3Qgc2lnbmlmaWNhbnQuCisgICAgSU1BUV9FREdFX1NPQkVMICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBleHRyYWN0cyB0aGUgb3V0ZXIgY29udG91cnMgb2Ygb2JqZWN0cy4KKyAgICBJTUFRX09VVExJTkVfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IE91dGxpbmVNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBNb3JwaG9sb2d5TWV0aG9kX2VudW0geworICAgIElNQVFfQVVUT00gICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBnZW5lcmF0ZXMgc2ltcGxlciBwYXJ0aWNsZXMgdGhhdCBjb250YWluIGZld2VyIGRldGFpbHMuCisgICAgSU1BUV9DTE9TRSAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGZpbGxzIHRpbnkgaG9sZXMgYW5kIHNtb290aHMgYm91bmRhcmllcy4KKyAgICBJTUFRX0RJTEFURSAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgZWxpbWluYXRlcyB0aW55IGhvbGVzIGlzb2xhdGVkIGluIHBhcnRpY2xlcyBhbmQgZXhwYW5kcyB0aGUgY29udG91ciBvZiB0aGUgcGFydGljbGVzIGFjY29yZGluZyB0byB0aGUgdGVtcGxhdGUgZGVmaW5lZCBieSB0aGUgc3RydWN0dXJpbmcgZWxlbWVudC4KKyAgICBJTUFRX0VST0RFICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgZWxpbWluYXRlcyBwaXhlbHMgaXNvbGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgYW5kIGVyb2RlcyB0aGUgY29udG91ciBvZiBwYXJ0aWNsZXMgYWNjb3JkaW5nIHRvIHRoZSB0ZW1wbGF0ZSBkZWZpbmVkIGJ5IHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LgorICAgIElNQVFfR1JBRElFTlQgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBsZWF2ZXMgb25seSB0aGUgcGl4ZWxzIHRoYXQgd291bGQgYmUgYWRkZWQgYnkgdGhlIGRpbGF0aW9uIHByb2Nlc3Mgb3IgZWxpbWluYXRlZCBieSB0aGUgZXJvc2lvbiBwcm9jZXNzLgorICAgIElNQVFfR1JBRElFTlRPVVQgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBsZWF2ZXMgb25seSB0aGUgcGl4ZWxzIHRoYXQgd291bGQgYmUgYWRkZWQgYnkgdGhlIGRpbGF0aW9uIHByb2Nlc3MuCisgICAgSU1BUV9HUkFESUVOVElOICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGxlYXZlcyBvbmx5IHRoZSBwaXhlbHMgdGhhdCB3b3VsZCBiZSBlbGltaW5hdGVkIGJ5IHRoZSBlcm9zaW9uIHByb2Nlc3MuCisgICAgSU1BUV9ISVRNSVNTICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGV4dHJhY3RzIGVhY2ggcGl4ZWwgbG9jYXRlZCBpbiBhIG5laWdoYm9yaG9vZCBleGFjdGx5IG1hdGNoaW5nIHRoZSB0ZW1wbGF0ZSBkZWZpbmVkIGJ5IHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LgorICAgIElNQVFfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCByZW1vdmVzIHNtYWxsIHBhcnRpY2xlcyBhbmQgc21vb3RocyBib3VuZGFyaWVzLgorICAgIElNQVFfUENMT1NFICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBmaWxscyB0aW55IGhvbGVzIGFuZCBzbW9vdGhzIHRoZSBpbm5lciBjb250b3VyIG9mIHBhcnRpY2xlcyBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlIGRlZmluZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgICAgSU1BUV9QT1BFTiAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IHJlbW92ZXMgc21hbGwgcGFydGljbGVzIGFuZCBzbW9vdGhzIHRoZSBjb250b3VyIG9mIHBhcnRpY2xlcyBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlIGRlZmluZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgICAgSU1BUV9USElDSyAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGFkZHMgdG8gYW4gaW1hZ2UgdGhvc2UgcGl4ZWxzIGxvY2F0ZWQgaW4gYSBuZWlnaGJvcmhvb2QgdGhhdCBtYXRjaGVzIGEgdGVtcGxhdGUgc3BlY2lmaWVkIGJ5IHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LgorICAgIElNQVFfVEhJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBlbGltaW5hdGVzIHBpeGVscyB0aGF0IGFyZSBsb2NhdGVkIGluIGEgbmVpZ2hib3Job29kIG1hdGNoaW5nIGEgdGVtcGxhdGUgc3BlY2lmaWVkIGJ5IHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LgorICAgIElNQVFfTU9SUEhPTE9HWV9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTW9ycGhvbG9neU1ldGhvZDsKKwordHlwZWRlZiBlbnVtIE1ldGVyQXJjTW9kZV9lbnVtIHsKKyAgICBJTUFRX01FVEVSX0FSQ19ST0kgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyB0aGUgcm9pIHBhcmFtZXRlciBhbmQgaWdub3JlcyB0aGUgYmFzZSwgc3RhcnQsIGFuZCBlbmQgcGFyYW1ldGVycy4KKyAgICBJTUFRX01FVEVSX0FSQ19QT0lOVFMgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyB0aGUgYmFzZSxzdGFydCwgYW5kIGVuZCBwYXJhbWV0ZXJzIGFuZCBpZ25vcmVzIHRoZSByb2kgcGFyYW1ldGVyLgorICAgIElNQVFfTUVURVJfQVJDX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTWV0ZXJBcmNNb2RlOworCit0eXBlZGVmIGVudW0gUmFrZURpcmVjdGlvbl9lbnVtIHsKKyAgICBJTUFRX0xFRlRfVE9fUklHSFQgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgSU1BUV9SSUdIVF9UT19MRUZUICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhLgorICAgIElNQVFfVE9QX1RPX0JPVFRPTSAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmcm9tIHRoZSB0b3Agc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIGJvdHRvbSBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgICBJTUFRX0JPVFRPTV9UT19UT1AgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZnJvbSB0aGUgYm90dG9tIHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSB0b3Agc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgSU1BUV9SQUtFX0RJUkVDVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBSYWtlRGlyZWN0aW9uOworCit0eXBlZGVmIGVudW0gVHJ1bmNhdGVNb2RlX2VudW0geworICAgIElNQVFfVFJVTkNBVEVfTE9XICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHRydW5jYXRlcyBsb3cgZnJlcXVlbmNpZXMuCisgICAgSU1BUV9UUlVOQ0FURV9ISUdIICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdHJ1bmNhdGVzIGhpZ2ggZnJlcXVlbmNpZXMuCisgICAgSU1BUV9UUlVOQ0FURV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFRydW5jYXRlTW9kZTsKKwordHlwZWRlZiBlbnVtIEF0dGVudWF0ZU1vZGVfZW51bSB7CisgICAgSU1BUV9BVFRFTlVBVEVfTE9XICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGF0dGVudWF0ZXMgbG93IGZyZXF1ZW5jaWVzLgorICAgIElNQVFfQVRURU5VQVRFX0hJR0ggICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBhdHRlbnVhdGVzIGhpZ2ggZnJlcXVlbmNpZXMuCisgICAgSU1BUV9BVFRFTlVBVEVfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBBdHRlbnVhdGVNb2RlOworCit0eXBlZGVmIGVudW0gV2luZG93VGhyZWFkUG9saWN5X2VudW0geworICAgIElNQVFfQ0FMTElOR19USFJFQUQgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1VzaW5nIHRoaXMgcG9saWN5LCBOSSBWaXNpb24gY3JlYXRlcyB3aW5kb3dzIGluIHRoZSB0aHJlYWQgdGhhdCBtYWtlcyB0aGUgZmlyc3QgZGlzcGxheSBmdW5jdGlvbiBjYWxsIGZvciBhIGdpdmVuIHdpbmRvdyBudW1iZXIuCisgICAgSU1BUV9TRVBBUkFURV9USFJFQUQgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVXNpbmcgdGhpcyBwb2xpY3ksIE5JIFZpc2lvbiBjcmVhdGVzIHdpbmRvd3MgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgYW5kIHByb2Nlc3NlcyBtZXNzYWdlcyBmb3IgdGhlIHdpbmRvd3MgYXV0b21hdGljYWxseS4KKyAgICBJTUFRX1dJTkRPV19USFJFQURfUE9MSUNZX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFdpbmRvd1RocmVhZFBvbGljeTsKKwordHlwZWRlZiBlbnVtIFdpbmRvd09wdGlvbnNfZW51bSB7CisgICAgSU1BUV9XSU5EX1JFU0laQUJMRSAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vV2hlbiBwcmVzZW50LCB0aGUgdXNlciBtYXkgcmVzaXplIHRoZSB3aW5kb3cgaW50ZXJhY3RpdmVseS4KKyAgICBJTUFRX1dJTkRfVElUTEVCQVIgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9XaGVuIHByZXNlbnQsIHRoZSB0aXRsZSBiYXIgb24gdGhlIHdpbmRvdyBpcyB2aXNpYmxlLgorICAgIElNQVFfV0lORF9DTE9TRUFCTEUgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1doZW4gcHJlc2VudCwgdGhlIGNsb3NlIGJveCBpcyBhdmFpbGFibGUuCisgICAgSU1BUV9XSU5EX1RPUE1PU1QgICAgICAgICAgICAgID0gOCwgICAgICAgICAgIC8vV2hlbiBwcmVzZW50LCB0aGUgd2luZG93IGlzIGFsd2F5cyBvbiB0b3AuCisgICAgSU1BUV9XSU5ET1dfT1BUSU9OU19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBXaW5kb3dPcHRpb25zOworCit0eXBlZGVmIGVudW0gV2luZG93RXZlbnRUeXBlX2VudW0geworICAgIElNQVFfTk9fRVZFTlQgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL05vIGV2ZW50IG9jY3VycmVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gaW1hcUdldExhc3RFdmVudCgpLgorICAgIElNQVFfQ0xJQ0tfRVZFTlQgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSB1c2VyIGNsaWNrZWQgb24gYSB3aW5kb3cuCisgICAgSU1BUV9EUkFXX0VWRU5UICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIHVzZXIgZHJldyBhbiBST0kgaW4gYSB3aW5kb3cuCisgICAgSU1BUV9NT1ZFX0VWRU5UICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIHVzZXIgbW92ZWQgYSB3aW5kb3cuCisgICAgSU1BUV9TSVpFX0VWRU5UICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIHVzZXIgc2l6ZWQgYSB3aW5kb3cuCisgICAgSU1BUV9TQ1JPTExfRVZFTlQgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIHVzZXIgc2Nyb2xsZWQgYSB3aW5kb3cuCisgICAgSU1BUV9BQ1RJVkFURV9FVkVOVCAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vVGhlIHVzZXIgYWN0aXZhdGVkIGEgd2luZG93LgorICAgIElNQVFfQ0xPU0VfRVZFTlQgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAvL1RoZSB1c2VyIGNsb3NlZCBhIHdpbmRvdy4KKyAgICBJTUFRX0RPVUJMRV9DTElDS19FVkVOVCAgICAgICAgICAgPSA4LCAgICAgICAgICAgLy9UaGUgdXNlciBkb3VibGUtY2xpY2tlZCBpbiBhIHdpbmRvdy4KKyAgICBJTUFRX1dJTkRPV19FVkVOVF9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFdpbmRvd0V2ZW50VHlwZTsKKwordHlwZWRlZiBlbnVtIFZpc2lvbkluZm9UeXBlX2VudW0geworICAgIElNQVFfQU5ZX1ZJU0lPTl9JTkZPICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbnkgZXh0cmEgdmlzaW9uIGluZm9ybWF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuCisgICAgSU1BUV9QQVRURVJOX01BVENISU5HX0lORk8gICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gY2hlY2tzIGlmIGFueSBwYXR0ZXJuIG1hdGNoaW5nIHRlbXBsYXRlIGluZm9ybWF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuCisgICAgSU1BUV9DQUxJQlJBVElPTl9JTkZPICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gY2hlY2tzIGlmIGFueSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlLgorICAgIElNQVFfT1ZFUkxBWV9JTkZPICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbnkgb3ZlcmxheSBpbmZvcm1hdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlLgorICAgIElNQVFfVklTSU9OX0lORk9fVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBWaXNpb25JbmZvVHlwZTsKKwordHlwZWRlZiBlbnVtIFNlYXJjaFN0cmF0ZWd5X2VudW0geworICAgIElNQVFfQ09OU0VSVkFUSVZFICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIHVzZSB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UgYXQgdGhlIGV4cGVuc2Ugb2Ygc2xvd2luZyBkb3duIHRoZSBzcGVlZCBvZiB0aGUgYWxnb3JpdGhtLgorICAgIElNQVFfQkFMQU5DRUQgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIGJhbGFuY2UgdGhlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSBpdCB1c2VzIHdpdGggdGhlIHNwZWVkIG9mIHRoZSBhbGdvcml0aG0uCisgICAgSU1BUV9BR0dSRVNTSVZFICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL0luc3RydWN0cyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gdG8gdXNlIGEgbG93ZXIgYW1vdW50IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIGltYWdlLCB3aGljaCBhbGxvd3MgdGhlIGFsZ29yaXRobSB0byBydW4gcXVpY2tseSBidXQgYXQgdGhlIGV4cGVuc2Ugb2YgYWNjdXJhY3kuCisgICAgSU1BUV9WRVJZX0FHR1JFU1NJVkUgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL0luc3RydWN0cyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gdG8gdXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UsIHdoaWNoIGFsbG93cyB0aGUgYWxnb3JpdGhtIHRvIHJ1biBhdCB0aGUgaGlnaGVzdCBzcGVlZCBwb3NzaWJsZSBidXQgYXQgdGhlIGV4cGVuc2Ugb2YgYWNjdXJhY3kuCisgICAgSU1BUV9TRUFSQ0hfU1RSQVRFR1lfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gU2VhcmNoU3RyYXRlZ3k7CisKK3R5cGVkZWYgZW51bSBUd29FZGdlUG9sYXJpdHlUeXBlX2VudW0geworICAgIElNQVFfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGlnbm9yZXMgdGhlIHBvbGFyaXR5IG9mIHRoZSBlZGdlcy4KKyAgICBJTUFRX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBwb2xhcml0eSBvZiB0aGUgZmlyc3QgZWRnZSBpcyByaXNpbmcgKGRhcmsgdG8gbGlnaHQpIGFuZCB0aGUgcG9sYXJpdHkgb2YgdGhlIHNlY29uZCBlZGdlIGlzIGZhbGxpbmcgKGxpZ2h0IHRvIGRhcmspLgorICAgIElNQVFfRkFMTElOR19SSVNJTkcgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIHBvbGFyaXR5IG9mIHRoZSBmaXJzdCBlZGdlIGlzIGZhbGxpbmcgKGxpZ2h0IHRvIGRhcmspIGFuZCB0aGUgcG9sYXJpdHkgb2YgdGhlIHNlY29uZCBlZGdlIGlzIHJpc2luZyAoZGFyayB0byBsaWdodCkuCisgICAgSU1BUV9SSVNJTkdfUklTSU5HICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgcG9sYXJpdHkgb2YgdGhlIGZpcnN0IGVkZ2UgaXMgcmlzaW5nIChkYXJrIHRvIGxpZ2h0KSBhbmQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzZWNvbmQgZWRnZSBpcyByaXNpbmcgKGRhcmsgdG8gbGlnaHQpLgorICAgIElNQVFfRkFMTElOR19GQUxMSU5HICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIHBvbGFyaXR5IG9mIHRoZSBmaXJzdCBlZGdlIGlzIGZhbGxpbmcgKGxpZ2h0IHRvIGRhcmspIGFuZCB0aGUgcG9sYXJpdHkgb2YgdGhlIHNlY29uZCBlZGdlIGlzIGZhbGxpbmcgKGxpZ2h0IHRvIGRhcmspLgorICAgIElNQVFfVFdPX0VER0VfUE9MQVJJVFlfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBUd29FZGdlUG9sYXJpdHlUeXBlOworCit0eXBlZGVmIGVudW0gT2JqZWN0VHlwZV9lbnVtIHsKKyAgICBJTUFRX0JSSUdIVF9PQkpFQ1RTICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZGV0ZWN0cyBicmlnaHQgb2JqZWN0cy4KKyAgICBJTUFRX0RBUktfT0JKRUNUUyAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZGV0ZWN0cyBkYXJrIG9iamVjdHMuCisgICAgSU1BUV9PQkpFQ1RfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBPYmplY3RUeXBlOworCit0eXBlZGVmIGVudW0gVG9vbF9lbnVtIHsKKyAgICBJTUFRX05PX1RPT0wgICAgICAgICAgICAgID0gLTEsICAgICAgICAgIC8vTm8gdG9vbCBpcyBpbiB0aGUgc2VsZWN0ZWQgc3RhdGUuCisgICAgSU1BUV9TRUxFQ1RJT05fVE9PTCAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBzZWxlY3Rpb24gdG9vbCBzZWxlY3RzIGFuIGV4aXN0aW5nIFJPSSBpbiBhbiBpbWFnZS4KKyAgICBJTUFRX1BPSU5UX1RPT0wgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIHBvaW50IHRvb2wgZHJhd3MgYSBwb2ludCBvbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9MSU5FX1RPT0wgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBsaW5lIHRvb2wgZHJhd3MgYSBsaW5lIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX1JFQ1RBTkdMRV9UT09MICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIHJlY3RhbmdsZSB0b29sIGRyYXdzIGEgcmVjdGFuZ2xlIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX09WQUxfVE9PTCAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIG92YWwgdG9vbCBkcmF3cyBhbiBvdmFsIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX1BPTFlHT05fVE9PTCAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIHBvbHlnb24gdG9vbCBkcmF3cyBhIHBvbHlnb24gb24gdGhlIGltYWdlLgorICAgIElNQVFfQ0xPU0VEX0ZSRUVIQU5EX1RPT0wgPSA2LCAgICAgICAgICAgLy9UaGUgY2xvc2VkIGZyZWVoYW5kIHRvb2wgZHJhd3MgY2xvc2VkIGZyZWVoYW5kIHNoYXBlcyBvbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9BTk5VTFVTX1RPT0wgICAgICAgICA9IDcsICAgICAgICAgICAvL1RoZSBhbm51bHVzIHRvb2wgZHJhd3MgYW5udWx1c2VzIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX1pPT01fVE9PTCAgICAgICAgICAgID0gOCwgICAgICAgICAgIC8vVGhlIHpvb20gdG9vbCBjb250cm9scyB0aGUgem9vbSBvZiBhbiBpbWFnZS4KKyAgICBJTUFRX1BBTl9UT09MICAgICAgICAgICAgID0gOSwgICAgICAgICAgIC8vVGhlIHBhbiB0b29sIHNoaWZ0cyB0aGUgdmlldyBvZiB0aGUgaW1hZ2UuCisgICAgSU1BUV9QT0xZTElORV9UT09MICAgICAgICA9IDEwLCAgICAgICAgICAvL1RoZSBwb2x5bGluZSB0b29sIGRyYXdzIGEgc2VyaWVzIG9mIGNvbm5lY3RlZCBzdHJhaWdodCBsaW5lcyBvbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9GUkVFSEFORF9UT09MICAgICAgICA9IDExLCAgICAgICAgICAvL1RoZSBmcmVlaGFuZCB0b29sIGRyYXdzIGZyZWVoYW5kIGxpbmVzIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX1JPVEFURURfUkVDVF9UT09MICAgID0gMTIsICAgICAgICAgIC8vVGhlIHJvdGF0ZWQgcmVjdGFuZ2xlIHRvb2wgZHJhd3Mgcm90YXRlZCByZWN0YW5nbGVzIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX1pPT01fT1VUX1RPT0wgICAgICAgID0gMTMsICAgICAgICAgIC8vVGhlIHpvb20gb3V0IHRvb2wgY29udHJvbHMgdGhlIHpvb20gb2YgYW4gaW1hZ2UuCisgICAgSU1BUV9UT09MX1NJWkVfR1VBUkQgICAgICA9IDB4RkZGRkZGRkYgICAKK30gVG9vbDsKKwordHlwZWRlZiBlbnVtIFRJRkZDb21wcmVzc2lvblR5cGVfZW51bSB7CisgICAgSU1BUV9OT19DT01QUkVTU0lPTiAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb21wcmVzcyB0aGUgVElGRiBmaWxlLgorICAgIElNQVFfSlBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyB0aGUgSlBFRyBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gY29tcHJlc3MgdGhlIFRJRkYgZmlsZS4KKyAgICBJTUFRX1JVTl9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBydW4gbGVuZ3RoIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0byBjb21wcmVzcyB0aGUgVElGRiBmaWxlLgorICAgIElNQVFfWklQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyB0aGUgWklQIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0byBjb21wcmVzcyB0aGUgVElGRiBmaWxlLgorICAgIElNQVFfVElGRl9DT01QUkVTU0lPTl9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFRJRkZDb21wcmVzc2lvblR5cGU7CisKK3R5cGVkZWYgZW51bSBUaHJlc2hvbGRNZXRob2RfZW51bSB7CisgICAgSU1BUV9USFJFU0hfQ0xVU1RFUklORyAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IHNvcnRzIHRoZSBoaXN0b2dyYW0gb2YgdGhlIGltYWdlIHdpdGhpbiBhIGRpc2NyZXRlIG51bWJlciBvZiBjbGFzc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG51bWJlciBvZiBwaGFzZXMgcGVyY2VpdmVkIGluIGFuIGltYWdlLgorICAgIElNQVFfVEhSRVNIX0VOVFJPUFkgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBpcyBiZXN0IGZvciBkZXRlY3RpbmcgcGFydGljbGVzIHRoYXQgYXJlIHByZXNlbnQgaW4gbWludXNjdWxlIHByb3BvcnRpb25zIG9uIHRoZSBpbWFnZS4KKyAgICBJTUFRX1RIUkVTSF9NRVRSSUMgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgaXMgd2VsbC1zdWl0ZWQgZm9yIGltYWdlcyBpbiB3aGljaCBjbGFzc2VzIGFyZSBub3QgdG9vIGRpc3Byb3BvcnRpb25hdGUuCisgICAgSU1BUV9USFJFU0hfTU9NRU5UUyAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IGlzIHN1aXRlZCBmb3IgaW1hZ2VzIHRoYXQgaGF2ZSBwb29yIGNvbnRyYXN0LgorICAgIElNQVFfVEhSRVNIX0lOVEVSQ0xBU1MgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBpcyB3ZWxsLXN1aXRlZCBmb3IgaW1hZ2VzIGluIHdoaWNoIGNsYXNzZXMgaGF2ZSB3ZWxsIHNlcGFyYXRlZCBwaXhlbCB2YWx1ZSBkaXN0cmlidXRpb25zLgorICAgIElNQVFfVEhSRVNIT0xEX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBUaHJlc2hvbGRNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBUZXh0QWxpZ25tZW50X2VudW0geworICAgIElNQVFfTEVGVCAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0xlZnQgYWxpZ25zIHRoZSB0ZXh0IGF0IHRoZSByZWZlcmVuY2UgcG9pbnQuCisgICAgSU1BUV9DRU5URVIgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vQ2VudGVycyB0aGUgdGV4dCBhcm91bmQgdGhlIHJlZmVyZW5jZSBwb2ludC4KKyAgICBJTUFRX1JJR0hUICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9SaWdodCBhbGlnbnMgdGhlIHRleHQgYXQgdGhlIHJlZmVyZW5jZSBwb2ludC4KKyAgICBJTUFRX1RFWFRfQUxJR05NRU5UX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFRleHRBbGlnbm1lbnQ7CisKK3R5cGVkZWYgZW51bSBTcG9rZURpcmVjdGlvbl9lbnVtIHsKKyAgICBJTUFRX09VVFNJREVfVE9fSU5TSURFICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZyb20gdGhlIG91dHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSBpbnNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhLgorICAgIElNQVFfSU5TSURFX1RPX09VVFNJREUgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZnJvbSB0aGUgaW5zaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgb3V0c2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgSU1BUV9TUE9LRV9ESVJFQ1RJT05fU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gU3Bva2VEaXJlY3Rpb247CisKK3R5cGVkZWYgZW51bSBTa2VsZXRvbk1ldGhvZF9lbnVtIHsKKyAgICBJTUFRX1NLRUxFVE9OX0wgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVXNlcyBhbiBMLXNoYXBlZCBzdHJ1Y3R1cmluZyBlbGVtZW50IGluIHRoZSBza2VsZXRvbiBmdW5jdGlvbi4KKyAgICBJTUFRX1NLRUxFVE9OX00gICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVXNlcyBhbiBNLXNoYXBlZCBzdHJ1Y3R1cmluZyBlbGVtZW50IGluIHRoZSBza2VsZXRvbiBmdW5jdGlvbi4KKyAgICBJTUFRX1NLRUxFVE9OX0lOVkVSU0UgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVXNlcyBhbiBMLXNoYXBlZCBzdHJ1Y3R1cmluZyBlbGVtZW50IG9uIGFuIGludmVyc2Ugb2YgdGhlIGltYWdlIGluIHRoZSBza2VsZXRvbiBmdW5jdGlvbi4KKyAgICBJTUFRX1NLRUxFVE9OX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBTa2VsZXRvbk1ldGhvZDsKKwordHlwZWRlZiBlbnVtIFZlcnRpY2FsVGV4dEFsaWdubWVudF9lbnVtIHsKKyAgICBJTUFRX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9BbGlnbnMgdGhlIGJvdHRvbSBvZiB0aGUgdGV4dCBhdCB0aGUgcmVmZXJlbmNlIHBvaW50LgorICAgIElNQVFfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0FsaWducyB0aGUgdG9wIG9mIHRoZSB0ZXh0IGF0IHRoZSByZWZlcmVuY2UgcG9pbnQuCisgICAgSU1BUV9CQVNFTElORSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vQWxpZ25zIHRoZSBiYXNlbGluZSBvZiB0aGUgdGV4dCBhdCB0aGUgcmVmZXJlbmNlIHBvaW50LgorICAgIElNQVFfVkVSVElDQUxfVEVYVF9BTElHTk1FTlRfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gVmVydGljYWxUZXh0QWxpZ25tZW50OworCit0eXBlZGVmIGVudW0gQ2FsaWJyYXRpb25ST0lfZW51bSB7CisgICAgSU1BUV9GVUxMX0lNQUdFICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBjb3JyZWN0aW9uIGZ1bmN0aW9uIGNvcnJlY3RzIHRoZSB3aG9sZSBpbWFnZSwgcmVnYXJkbGVzcyBvZiB0aGUgdXNlci1kZWZpbmVkIG9yIGNhbGlicmF0aW9uLWRlZmluZWQgUk9Jcy4KKyAgICBJTUFRX0NBTElCUkFUSU9OX1JPSSAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGNvcnJlY3Rpb24gZnVuY3Rpb24gY29ycmVjdHMgdGhlIGFyZWEgZGVmaW5lZCBieSB0aGUgY2FsaWJyYXRpb24gUk9JLgorICAgIElNQVFfVVNFUl9ST0kgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgY29ycmVjdGlvbiBmdW5jdGlvbiBjb3JyZWN0cyB0aGUgYXJlYSBkZWZpbmVkIGJ5IHRoZSB1c2VyLWRlZmluZWQgUk9JLgorICAgIElNQVFfQ0FMSUJSQVRJT05fQU5EX1VTRVJfUk9JICAgPSAzLCAgICAgICAgICAgLy9UaGUgY29ycmVjdGlvbiBmdW5jdGlvbiBjb3JyZWN0cyB0aGUgYXJlYSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHVzZXItZGVmaW5lZCBST0kgYW5kIHRoZSBjYWxpYnJhdGlvbiBST0kuCisgICAgSU1BUV9DQUxJQlJBVElPTl9PUl9VU0VSX1JPSSAgICA9IDQsICAgICAgICAgICAvL1RoZSBjb3JyZWN0aW9uIGZ1bmN0aW9uIGNvcnJlY3RzIHRoZSBhcmVhIGRlZmluZWQgYnkgdGhlIHVuaW9uIG9mIHRoZSB1c2VyLWRlZmluZWQgUk9JIGFuZCB0aGUgY2FsaWJyYXRpb24gUk9JLgorICAgIElNQVFfQ0FMSUJSQVRJT05fUk9JX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENhbGlicmF0aW9uUk9JOworCit0eXBlZGVmIGVudW0gQ29udG91clR5cGVfZW51bSB7CisgICAgSU1BUV9FTVBUWV9DT05UT1VSICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBjb250b3VyIGlzIGVtcHR5LgorICAgIElNQVFfUE9JTlQgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgY29udG91ciByZXByZXNlbnRzIGEgcG9pbnQuCisgICAgSU1BUV9MSU5FICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBjb250b3VyIHJlcHJlc2VudHMgYSBsaW5lLgorICAgIElNQVFfUkVDVCAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgY29udG91ciByZXByZXNlbnRzIGEgcmVjdGFuZ2xlLgorICAgIElNQVFfT1ZBTCAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgY29udG91ciByZXByZXNlbnRzIGFuIG92YWwuCisgICAgSU1BUV9DTE9TRURfQ09OVE9VUiAgICAgICAgICA9IDUsICAgICAgICAgICAvL1RoZSBjb250b3VyIHJlcHJlc2VudHMgYSBzZXJpZXMgb2YgY29ubmVjdGVkIHBvaW50cyB3aGVyZSB0aGUgbGFzdCBwb2ludCBjb25uZWN0cyB0byB0aGUgZmlyc3QuCisgICAgSU1BUV9PUEVOX0NPTlRPVVIgICAgICAgICAgICA9IDYsICAgICAgICAgICAvL1RoZSBjb250b3VyIHJlcHJlc2VudHMgYSBzZXJpZXMgb2YgY29ubmVjdGVkIHBvaW50cyB3aGVyZSB0aGUgbGFzdCBwb2ludCBkb2VzIG5vdCBjb25uZWN0IHRvIHRoZSBmaXJzdC4KKyAgICBJTUFRX0FOTlVMVVMgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgIC8vVGhlIGNvbnRvdXIgcmVwcmVzZW50cyBhbiBhbm51bHVzLgorICAgIElNQVFfUk9UQVRFRF9SRUNUICAgICAgICAgICAgPSA4LCAgICAgICAgICAgLy9UaGUgY29udG91ciByZXByZXNlbnRzIGEgcm90YXRlZCByZWN0YW5nbGUuCisgICAgSU1BUV9DT05UT1VSX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ29udG91clR5cGU7CisKK3R5cGVkZWYgZW51bSBNYXRoVHJhbnNmb3JtTWV0aG9kX2VudW0geworICAgIElNQVFfVFJBTlNGT1JNX0xJTkVBUiAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBsaW5lYXIgcmVtYXBwaW5nLgorICAgIElNQVFfVFJBTlNGT1JNX0xPRyAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBsb2dhcml0aG1pYyByZW1hcHBpbmcuCisgICAgSU1BUV9UUkFOU0ZPUk1fRVhQICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGV4cG9uZW50aWFsIHJlbWFwcGluZy4KKyAgICBJTUFRX1RSQU5TRk9STV9TUVIgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgc3F1YXJlIHJlbWFwcGluZy4KKyAgICBJTUFRX1RSQU5TRk9STV9TUVJUICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgc3F1YXJlIHJvb3QgcmVtYXBwaW5nLgorICAgIElNQVFfVFJBTlNGT1JNX1BPV1ggICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBwb3dlciBYIHJlbWFwcGluZy4KKyAgICBJTUFRX1RSQU5TRk9STV9QT1cxWCAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgcG93ZXIgMS9YIHJlbWFwcGluZy4KKyAgICBJTUFRX01BVEhfVFJBTlNGT1JNX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBNYXRoVHJhbnNmb3JtTWV0aG9kOworCit0eXBlZGVmIGVudW0gQ29tcGxleFBsYW5lX2VudW0geworICAgIElNQVFfUkVBTCAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIHRoZSByZWFsIHBsYW5lIG9mIHRoZSBjb21wbGV4IGltYWdlLgorICAgIElNQVFfSU1BR0lOQVJZICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIHRoZSBpbWFnaW5hcnkgcGxhbmUgb2YgdGhlIGNvbXBsZXggaW1hZ2UuCisgICAgSU1BUV9NQUdOSVRVREUgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24gdGhlIG1hZ25pdHVkZSBwbGFuZSBvZiB0aGUgY29tcGxleCBpbWFnZS4KKyAgICBJTUFRX1BIQVNFICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbiB0aGUgcGhhc2UgcGxhbmUgb2YgdGhlIGNvbXBsZXggaW1hZ2UuCisgICAgSU1BUV9DT01QTEVYX1BMQU5FX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENvbXBsZXhQbGFuZTsKKwordHlwZWRlZiBlbnVtIFBhbGV0dGVUeXBlX2VudW0geworICAgIElNQVFfUEFMRVRURV9HUkFZICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHBhbGV0dGUgdGhhdCBoYXMgYSBncmFkdWFsIGdyYXktbGV2ZWwgdmFyaWF0aW9uIGZyb20gYmxhY2sgdG8gd2hpdGUuCisgICAgSU1BUV9QQUxFVFRFX0JJTkFSWSAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgcGFsZXR0ZSBvZiAxNiBjeWNsZXMgb2YgMTYgZGlmZmVyZW50IGNvbG9ycyB0aGF0IGlzIHVzZWZ1bCB3aXRoIGJpbmFyeSBpbWFnZXMuCisgICAgSU1BUV9QQUxFVFRFX0dSQURJRU5UICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgcGFsZXR0ZSB0aGF0IGhhcyBhIGdyYWRhdGlvbiBmcm9tIHJlZCB0byB3aGl0ZSB3aXRoIGEgcHJvbWluZW50IHJhbmdlIG9mIGxpZ2h0IGJsdWUgaW4gdGhlIHVwcGVyIHZhbHVlIHJhbmdlLgorICAgIElNQVFfUEFMRVRURV9SQUlOQk9XICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHBhbGV0dGUgdGhhdCBoYXMgYSBncmFkYXRpb24gZnJvbSBibHVlIHRvIHJlZCB3aXRoIGEgcHJvbWluZW50IHJhbmdlIG9mIGdyZWVucyBpbiB0aGUgbWlkZGxlIHZhbHVlIHJhbmdlLgorICAgIElNQVFfUEFMRVRURV9URU1QRVJBVFVSRSAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHBhbGV0dGUgdGhhdCBoYXMgYSBncmFkYXRpb24gZnJvbSBsaWdodCBicm93biB0byBkYXJrIGJyb3duLgorICAgIElNQVFfUEFMRVRURV9VU0VSICAgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIHBhbGV0dGUgZGVmaW5lZCBieSB0aGUgdXNlci4KKyAgICBJTUFRX1BBTEVUVEVfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBQYWxldHRlVHlwZTsKKwordHlwZWRlZiBlbnVtIENvbG9yU2Vuc2l0aXZpdHlfZW51bSB7CisgICAgSU1BUV9TRU5TSVRJVklUWV9MT1cgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vSW5zdHJ1Y3RzIHRoZSBhbGdvcml0aG0gdG8gZGl2aWRlIHRoZSBodWUgcGxhbmUgaW50byBhIGxvdyBudW1iZXIgb2Ygc2VjdG9ycywgYWxsb3dpbmcgZm9yIHNpbXBsZSBjb2xvciBhbmFseXNpcy4KKyAgICBJTUFRX1NFTlNJVElWSVRZX01FRCAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIGFsZ29yaXRobSB0byBkaXZpZGUgdGhlIGh1ZSBwbGFuZSBpbnRvIGEgbWVkaXVtIG51bWJlciBvZiBzZWN0b3JzLCBhbGxvd2luZyBmb3IgY29sb3IgYW5hbHlzaXMgdGhhdCBiYWxhbmNlcyBzZW5zaXRpdml0eSBhbmQgY29tcGxleGl0eS4KKyAgICBJTUFRX1NFTlNJVElWSVRZX0hJR0ggICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIGFsZ29yaXRobSB0byBkaXZpZGUgdGhlIGh1ZSBwbGFuZSBpbnRvIGEgaGlnaCBudW1iZXIgb2Ygc2VjdG9ycywgYWxsb3dpbmcgZm9yIGNvbXBsZXgsIHNlbnNpdGl2ZSBjb2xvciBhbmFseXNpcy4KKyAgICBJTUFRX0NPTE9SX1NFTlNJVElWSVRZX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENvbG9yU2Vuc2l0aXZpdHk7CisKK3R5cGVkZWYgZW51bSBDb2xvck1vZGVfZW51bSB7CisgICAgSU1BUV9SR0IgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gdGhlIFJHQiAoUmVkLCBCbHVlLCBHcmVlbikgY29sb3Igc3BhY2UuCisgICAgSU1BUV9IU0wgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gdGhlIEhTTCAoSHVlLCBTYXR1cmF0aW9uLCBMdW1pbmFuY2UpIGNvbG9yIHNwYWNlLgorICAgIElNQVFfSFNWICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGluIHRoZSBIU1YgKEh1ZSwgU2F0dXJhdGlvbiwgVmFsdWUpIGNvbG9yIHNwYWNlLgorICAgIElNQVFfSFNJICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGluIHRoZSBIU0kgKEh1ZSwgU2F0dXJhdGlvbiwgSW50ZW5zaXR5KSBjb2xvciBzcGFjZS4KKyAgICBJTUFRX0NJRSAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBvcGVyYXRlcyBpbiB0aGUgQ0lFIEwqYSpiKiBjb2xvciBzcGFjZS4KKyAgICBJTUFRX0NJRVhZWiAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBvcGVyYXRlcyBpbiB0aGUgQ0lFIFhZWiBjb2xvciBzcGFjZS4KKyAgICBJTUFRX0NPTE9SX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ29sb3JNb2RlOworCit0eXBlZGVmIGVudW0gRGV0ZWN0aW9uTW9kZV9lbnVtIHsKKyAgICBJTUFRX0RFVEVDVF9QRUFLUyAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZGV0ZWN0cyBwZWFrcy4KKyAgICBJTUFRX0RFVEVDVF9WQUxMRVlTICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZGV0ZWN0cyB2YWxsZXlzLgorICAgIElNQVFfREVURUNUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRGV0ZWN0aW9uTW9kZTsKKwordHlwZWRlZiBlbnVtIENhbGlicmF0aW9uVW5pdF9lbnVtIHsKKyAgICBJTUFRX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBpbWFnZSBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCB1bml0IG9mIG1lYXN1cmVtZW50LgorICAgIElNQVFfQU5HU1RST00gICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIGFuZ3N0cm9tcy4KKyAgICBJTUFRX01JQ1JPTUVURVIgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBtaWNyb21ldGVycy4KKyAgICBJTUFRX01JTExJTUVURVIgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBtaWxsaW1ldGVycy4KKyAgICBJTUFRX0NFTlRJTUVURVIgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBjZW50aW1ldGVycy4KKyAgICBJTUFRX01FVEVSICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBtZXRlcnMuCisgICAgSU1BUV9LSUxPTUVURVIgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgLy9UaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UgaXMga2lsb21ldGVycy4KKyAgICBJTUFRX01JQ1JPSU5DSCAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBtaWNyb2luY2hlcy4KKyAgICBJTUFRX0lOQ0ggICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBpbmNoZXMuCisgICAgSU1BUV9GT09UICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgLy9UaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UgaXMgZmVldC4KKyAgICBJTUFRX05BVVRJQ01JTEUgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBuYXV0aWNhbCBtaWxlcy4KKyAgICBJTUFRX0dST1VORE1JTEUgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAvL1RoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBncm91bmQgbWlsZXMuCisgICAgSU1BUV9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgLy9UaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UgaXMgc3RlcHMuCisgICAgSU1BUV9DQUxJQlJBVElPTl9VTklUX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENhbGlicmF0aW9uVW5pdDsKKwordHlwZWRlZiBlbnVtIENvbmNlbnRyaWNSYWtlRGlyZWN0aW9uX2VudW0geworICAgIElNQVFfQ09VTlRFUl9DTE9DS1dJU0UgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBzZWFyY2ggYXJlYSBpbiBhIGNvdW50ZXItY2xvY2t3aXNlIGRpcmVjdGlvbi4KKyAgICBJTUFRX0NMT0NLV0lTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgc2VhcmNoIGFyZWEgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLgorICAgIElNQVFfQ09OQ0VOVFJJQ19SQUtFX0RJUkVDVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb25jZW50cmljUmFrZURpcmVjdGlvbjsKKwordHlwZWRlZiBlbnVtIENhbGlicmF0aW9uTW9kZV9lbnVtIHsKKyAgICBJTUFRX1BFUlNQRUNUSVZFICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0Z1bmN0aW9ucyBjb3JyZWN0IGZvciBkaXN0b3J0aW9uIGNhdXNlZCBieSB0aGUgY2FtZXJhJ3MgcGVyc3BlY3RpdmUuCisgICAgSU1BUV9OT05MSU5FQVIgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9GdW5jdGlvbnMgY29ycmVjdCBmb3IgZGlzdG9ydGlvbiBjYXVzZWQgYnkgdGhlIGNhbWVyYSdzIGxlbnMuCisgICAgSU1BUV9TSU1QTEVfQ0FMSUJSQVRJT04gICAgICAgICAgPSAyLCAgICAgICAgICAgLy9GdW5jdGlvbnMgZG8gbm90IGNvcnJlY3QgZm9yIGRpc3RvcnRpb24uCisgICAgSU1BUV9DT1JSRUNURURfSU1BR0UgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgaW1hZ2UgaXMgYWxyZWFkeSBjb3JyZWN0ZWQuCisgICAgSU1BUV9DQUxJQlJBVElPTl9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENhbGlicmF0aW9uTW9kZTsKKwordHlwZWRlZiBlbnVtIEJyb3dzZXJMb2NhdGlvbl9lbnVtIHsKKyAgICBJTUFRX0lOU0VSVF9GSVJTVF9GUkVFICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0luc2VydHMgdGhlIHRodW1ibmFpbCBpbiB0aGUgZmlyc3QgYXZhaWxhYmxlIGNlbGwuCisgICAgSU1BUV9JTlNFUlRfRU5EICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9JbnNlcnRzIHRoZSB0aHVtYm5haWwgYWZ0ZXIgdGhlIGxhc3Qgb2NjdXBpZWQgY2VsbC4KKyAgICBJTUFRX0JST1dTRVJfTE9DQVRJT05fU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQnJvd3NlckxvY2F0aW9uOworCit0eXBlZGVmIGVudW0gQnJvd3NlckZyYW1lU3R5bGVfZW51bSB7CisgICAgSU1BUV9SQUlTRURfRlJBTUUgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9FYWNoIHRodW1ibmFpbCBoYXMgYSByYWlzZWQgZnJhbWUuCisgICAgSU1BUV9CRVZFTExFRF9GUkFNRSAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9FYWNoIHRodW1ibmFpbCBoYXMgYSBiZXZlbGVkIGZyYW1lLgorICAgIElNQVFfT1VUTElORV9GUkFNRSAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vRWFjaCB0aHVtYm5haWwgaGFzIGFuIG91dGxpbmVkIGZyYW1lLgorICAgIElNQVFfSElEREVOX0ZSQU1FICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vRWFjaCB0aHVtYm5haWwgaGFzIGEgaGlkZGVuIGZyYW1lLgorICAgIElNQVFfU1RFUF9GUkFNRSAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vRWFjaCB0aHVtYm5haWwgaGFzIGEgc3RlcHBlZCBmcmFtZS4KKyAgICBJTUFRX1JBSVNFRF9PVVRMSU5FX0ZSQU1FICAgICAgICAgICA9IDUsICAgICAgICAgICAvL0VhY2ggdGh1bWJuYWlsIGhhcyBhIHJhaXNlZCwgb3V0bGluZWQgZnJhbWUuCisgICAgSU1BUV9CUk9XU0VSX0ZSQU1FX1NUWUxFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEJyb3dzZXJGcmFtZVN0eWxlOworCit0eXBlZGVmIGVudW0gQm9yZGVyTWV0aG9kX2VudW0geworICAgIElNQVFfQk9SREVSX01JUlJPUiAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU3ltbWV0cmljYWxseSBjb3BpZXMgcGl4ZWwgdmFsdWVzIGZyb20gdGhlIGltYWdlIGludG8gdGhlIGJvcmRlci4KKyAgICBJTUFRX0JPUkRFUl9DT1BZICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0NvcGllcyB0aGUgdmFsdWUgb2YgdGhlIHBpeGVsIGNsb3Nlc3QgdG8gdGhlIGVkZ2Ugb2YgdGhlIGltYWdlIGludG8gdGhlIGJvcmRlci4KKyAgICBJTUFRX0JPUkRFUl9DTEVBUiAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NldHMgYWxsIHBpeGVscyBpbiB0aGUgYm9yZGVyIHRvIDAuCisgICAgSU1BUV9CT1JERVJfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEJvcmRlck1ldGhvZDsKKwordHlwZWRlZiBlbnVtIEJhcmNvZGVUeXBlX2VudW0geworICAgIElNQVFfSU5WQUxJRCAgICAgICAgICAgICAgICAgPSAtMSwgICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBub3Qgb2YgYSB0eXBlIGtub3duIGJ5IE5JIFZpc2lvbi4KKyAgICBJTUFRX0NPREFCQVIgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBDb2RhYmFyLgorICAgIElNQVFfQ09ERTM5ICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIENvZGUgMzkuCisgICAgSU1BUV9DT0RFOTMgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBiYXJjb2RlIGlzIG9mIHR5cGUgQ29kZSA5My4KKyAgICBJTUFRX0NPREUxMjggICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBDb2RlIDEyOC4KKyAgICBJTUFRX0VBTjggICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBFQU4gOC4KKyAgICBJTUFRX0VBTjEzICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBFQU4gMTMuCisgICAgSU1BUV9JMl9PRl81ICAgICAgICAgICAgICAgICA9IDY0LCAgICAgICAgICAvL1RoZSBiYXJjb2RlIGlzIG9mIHR5cGUgQ29kZSAyNS4KKyAgICBJTUFRX01TSSAgICAgICAgICAgICAgICAgICAgID0gMTI4LCAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBNU0kgY29kZS4KKyAgICBJTUFRX1VQQ0EgICAgICAgICAgICAgICAgICAgID0gMjU2LCAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBVUEMgQS4KKyAgICBJTUFRX1BIQVJNQUNPREUgICAgICAgICAgICAgID0gNTEyLCAgICAgICAgIC8vVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBQaGFybWFjb2RlLgorICAgIElNQVFfUlNTX0xJTUlURUQgICAgICAgICAgICAgPSAxMDI0LCAgICAgICAgLy9UaGUgYmFyY29kZSBpcyBvZiB0eXBlIFJTUyBMaW1pdGVkLgorICAgIElNQVFfQkFSQ09ERV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEJhcmNvZGVUeXBlOworCit0eXBlZGVmIGVudW0gQXhpc09yaWVudGF0aW9uX2VudW0geworICAgIElNQVFfRElSRUNUICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIHktYXhpcyBkaXJlY3Rpb24gY29ycmVzcG9uZHMgdG8gdGhlIHktYXhpcyBkaXJlY3Rpb24gb2YgdGhlIENhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBJTUFRX0lORElSRUNUICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSB5LWF4aXMgZGlyZWN0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSB5LWF4aXMgZGlyZWN0aW9uIG9mIGFuIGltYWdlLgorICAgIElNQVFfQVhJU19PUklFTlRBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBBeGlzT3JpZW50YXRpb247CisKK3R5cGVkZWYgZW51bSBDb2xvcklnbm9yZU1vZGVfZW51bSB7CisgICAgSU1BUV9JR05PUkVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGlnbm9yZSBhbnkgcGl4ZWxzLgorICAgIElNQVFfSUdOT1JFX0JMQUNLICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBpZ25vcmVzIGJsYWNrIHBpeGVscy4KKyAgICBJTUFRX0lHTk9SRV9XSElURSAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gaWdub3JlcyB3aGl0ZSBwaXhlbHMuCisgICAgSU1BUV9JR05PUkVfQkxBQ0tfQU5EX1dISVRFICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlnbm9yZXMgYmxhY2sgcGl4ZWxzIGFuZCB3aGl0ZSBwaXhlbHMuCisgICAgSU1BUV9CTEFDS19XSElURV9JR05PUkVfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb2xvcklnbm9yZU1vZGU7CisKK3R5cGVkZWYgZW51bSBMZXZlbFR5cGVfZW51bSB7CisgICAgSU1BUV9BQlNPTFVURSAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZXZhbHVhdGVzIHRoZSB0aHJlc2hvbGQgYW5kIGh5c3RlcmVzaXMgdmFsdWVzIGFzIGFic29sdXRlIHZhbHVlcy4KKyAgICBJTUFRX1JFTEFUSVZFICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBldmFsdWF0ZXMgdGhlIHRocmVzaG9sZCBhbmQgaHlzdGVyZXNpcyB2YWx1ZXMgcmVsYXRpdmUgdG8gdGhlIGR5bmFtaWMgcmFuZ2Ugb2YgdGhlIGdpdmVuIHBhdGguCisgICAgSU1BUV9MRVZFTF9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IExldmVsVHlwZTsKKwordHlwZWRlZiBlbnVtIE1hdGNoaW5nTW9kZV9lbnVtIHsKKyAgICBJTUFRX01BVENIX1NISUZUX0lOVkFSSUFOVCAgICA9IDEsICAgICAgICAgICAvL1NlYXJjaGVzIGZvciBvY2N1cnJlbmNlcyBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UgYW55d2hlcmUgaW4gdGhlIHNlYXJjaFJlY3QsIGFzc3VtaW5nIHRoYXQgdGhlIHBhdHRlcm4gaXMgbm90IHJvdGF0ZWQgbW9yZSB0aGFuIHBsdXMgb3IgbWludXMgNCBkZWdyZWVzLgorICAgIElNQVFfTUFUQ0hfUk9UQVRJT05fSU5WQVJJQU5UID0gMiwgICAgICAgICAgIC8vU2VhcmNoZXMgZm9yIG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuIGluIHRoZSBpbWFnZSB3aXRoIG5vIHJlc3RyaWN0aW9uIG9uIHRoZSByb3RhdGlvbiBvZiB0aGUgcGF0dGVybi4KKyAgICBJTUFRX01BVENISU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTWF0Y2hpbmdNb2RlOworCit0eXBlZGVmIGVudW0gTWFwcGluZ01ldGhvZF9lbnVtIHsKKyAgICBJTUFRX0ZVTExfRFlOQU1JQyAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy8oT2Jzb2xldGUpIFdoZW4gdGhlIGltYWdlIGJpdCBkZXB0aCBpcyAwLCB0aGUgZnVuY3Rpb24gbWFwcyB0aGUgZnVsbCBkeW5hbWljIHJhbmdlIG9mIHRoZSAxNi1iaXQgaW1hZ2UgdG8gYW4gOC1iaXQgc2NhbGUuCisgICAgSU1BUV9ET1dOU0hJRlQgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vKE9ic29sZXRlKSBXaGVuIHRoZSBpbWFnZSBiaXQgZGVwdGggaXMgMCwgdGhlIGZ1bmN0aW9uIHNoaWZ0cyB0aGUgMTYtYml0IGltYWdlIHBpeGVscyB0byB0aGUgcmlnaHQgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgYnkgdGhlIHNoaWZ0Q291bnQgZWxlbWVudCBvZiB0aGUgRGlzcGxheU1hcHBpbmcgc3RydWN0dXJlLgorICAgIElNQVFfUkFOR0UgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvLyhPYnNvbGV0ZSkgV2hlbiB0aGUgaW1hZ2UgYml0IGRlcHRoIGlzIDAsIHRoZSBmdW5jdGlvbiBtYXBzIHRoZSBwaXhlbCB2YWx1ZXMgaW4gdGhlIHJhbmdlIHNwZWNpZmllZCBieSB0aGUgbWluaW11bVZhbHVlIGFuZCBtYXhpbXVtVmFsdWUgZWxlbWVudHMgb2YgdGhlIERpc3BsYXlNYXBwaW5nIHN0cnVjdHVyZSB0byBhbiA4LWJpdCBzY2FsZS4KKyAgICBJTUFRXzkwX1BDVF9EWU5BTUlDICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy8oT2Jzb2xldGUpIFdoZW4gdGhlIGltYWdlIGJpdCBkZXB0aCB0byAwLCB0aGUgZnVuY3Rpb24gbWFwcyB0aGUgZHluYW1pYyByYW5nZSBjb250YWluaW5nIHRoZSBtaWRkbGUgOTAgcGVyY2VudCBvZiB0aGUgY3VtdWxhdGVkIGhpc3RvZ3JhbSBvZiB0aGUgaW1hZ2UgdG8gYW4gOC1iaXQgKDI1NiBncmF5c2NhbGUgdmFsdWVzKSBzY2FsZS4KKyAgICBJTUFRX1BFUkNFTlRfUkFOR0UgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy8oT2Jzb2xldGUpIFdoZW4gdGhlIGltYWdlIGJpdCBkZXB0aCBpcyAwLCB0aGUgZnVuY3Rpb24gbWFwcyB0aGUgcGl4ZWwgdmFsdWVzIGluIHRoZSByZWxhdGl2ZSBwZXJjZW50YWdlIHJhbmdlICgwIHRvIDEwMCkgb2YgdGhlIGN1bXVsYXRlZCBoaXN0b2dyYW0gc3BlY2lmaWVkIGJ5IG1pbmltdW1WYWx1ZSBhbmQgbWF4aW11bVZhbHVlIHRvIGFuIDgtYml0IHNjYWxlLgorICAgIElNQVFfREVGQVVMVF9NQVBQSU5HICAgICAgICAgICA9IDEwLCAgICAgICAgICAvL0lmIHRoZSBiaXQgZGVwdGggaXMgMCwgdGhlIGZ1bmN0aW9uIG1hcHMgdGhlIDE2LWJpdCBpbWFnZSB0byA4IGJpdHMgYnkgZm9sbG93aW5nIHRoZSBJTUFRX0ZVTExfRFlOQU1JQ19BTFdBWVMgYmVoYXZpb3I7IG90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHNoaWZ0cyB0aGUgaW1hZ2UgZGF0YSB0byB0aGUgcmlnaHQgYWNjb3JkaW5nIHRvIHRoZSBJTUFRX01PU1RfU0lHTklGSUNBTlQgYmVoYXZpb3IuCisgICAgSU1BUV9NT1NUX1NJR05JRklDQU5UICAgICAgICAgID0gMTEsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNoaWZ0cyB0aGUgMTYtYml0IGltYWdlIHBpeGVscyB0byB0aGUgcmlnaHQgdW50aWwgdGhlIDggbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBpbWFnZSBkYXRhIGFyZSByZW1haW5pbmcuCisgICAgSU1BUV9GVUxMX0RZTkFNSUNfQUxXQVlTICAgICAgID0gMTIsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG1hcHMgdGhlIGZ1bGwgZHluYW1pYyByYW5nZSBvZiB0aGUgMTYtYml0IGltYWdlIHRvIGFuIDgtYml0IHNjYWxlLgorICAgIElNQVFfRE9XTlNISUZUX0FMV0FZUyAgICAgICAgICA9IDEzLCAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzaGlmdHMgdGhlIDE2LWJpdCBpbWFnZSBwaXhlbHMgdG8gdGhlIHJpZ2h0IHRoZSBudW1iZXIgb2YgdGltZXMgc3BlY2lmaWVkIGJ5IHRoZSBzaGlmdENvdW50IGVsZW1lbnQgb2YgdGhlIERpc3BsYXlNYXBwaW5nIHN0cnVjdHVyZS4KKyAgICBJTUFRX1JBTkdFX0FMV0FZUyAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gbWFwcyB0aGUgcGl4ZWwgdmFsdWVzIGluIHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIG1pbmltdW1WYWx1ZSBhbmQgbWF4aW11bVZhbHVlIGVsZW1lbnRzIG9mIHRoZSBEaXNwbGF5TWFwcGluZyBzdHJ1Y3R1cmUgdG8gYW4gOC1iaXQgc2NhbGUuCisgICAgSU1BUV85MF9QQ1RfRFlOQU1JQ19BTFdBWVMgICAgID0gMTUsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG1hcHMgdGhlIGR5bmFtaWMgcmFuZ2UgY29udGFpbmluZyB0aGUgbWlkZGxlIDkwIHBlcmNlbnQgb2YgdGhlIGN1bXVsYXRlZCBoaXN0b2dyYW0gb2YgdGhlIGltYWdlIHRvIGFuIDgtYml0ICgyNTYgZ3JheXNjYWxlIHZhbHVlcykgc2NhbGUuCisgICAgSU1BUV9QRVJDRU5UX1JBTkdFX0FMV0FZUyAgICAgID0gMTYsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIG1hcHMgdGhlIHBpeGVsIHZhbHVlcyBpbiB0aGUgcmVsYXRpdmUgcGVyY2VudGFnZSByYW5nZSAoMCB0byAxMDApIG9mIHRoZSBjdW11bGF0ZWQgaGlzdG9ncmFtIHNwZWNpZmllZCBieSBtaW5pbXVtVmFsdWUgYW5kIG1heGltdW1WYWx1ZSB0byBhbiA4LWJpdCBzY2FsZS4KKyAgICBJTUFRX01BUFBJTkdfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IE1hcHBpbmdNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBDb21wYXJpc29uRnVuY3Rpb25fZW51bSB7CisgICAgSU1BUV9DTEVBUl9MRVNTICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgY29tcGFyaXNvbiBpcyB0cnVlIGlmIHRoZSBzb3VyY2UgcGl4ZWwgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBjb21wYXJpc29uIGltYWdlIHBpeGVsIHZhbHVlLgorICAgIElNQVFfQ0xFQVJfTEVTU19PUl9FUVVBTCAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGNvbXBhcmlzb24gaXMgdHJ1ZSBpZiB0aGUgc291cmNlIHBpeGVsIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY29tcGFyaXNvbiBpbWFnZSBwaXhlbCB2YWx1ZS4KKyAgICBJTUFRX0NMRUFSX0VRVUFMICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBjb21wYXJpc29uIGlzIHRydWUgaWYgdGhlIHNvdXJjZSBwaXhlbCB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgY29tcGFyaXNvbiBpbWFnZSBwaXhlbCB2YWx1ZS4KKyAgICBJTUFRX0NMRUFSX0dSRUFURVJfT1JfRVFVQUwgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBjb21wYXJpc29uIGlzIHRydWUgaWYgdGhlIHNvdXJjZSBwaXhlbCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNvbXBhcmlzb24gaW1hZ2UgcGl4ZWwgdmFsdWUuCisgICAgSU1BUV9DTEVBUl9HUkVBVEVSICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgY29tcGFyaXNvbiBpcyB0cnVlIGlmIHRoZSBzb3VyY2UgcGl4ZWwgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBjb21wYXJpc29uIGltYWdlIHBpeGVsIHZhbHVlLgorICAgIElNQVFfQ09NUEFSRV9GVU5DVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb21wYXJpc29uRnVuY3Rpb247CisKK3R5cGVkZWYgZW51bSBMaW5lR2F1Z2VNZXRob2RfZW51bSB7CisgICAgSU1BUV9FREdFX1RPX0VER0UgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vTWVhc3VyZXMgZnJvbSB0aGUgZmlyc3QgZWRnZSBvbiB0aGUgbGluZSB0byB0aGUgbGFzdCBlZGdlIG9uIHRoZSBsaW5lLgorICAgIElNQVFfRURHRV9UT19QT0lOVCAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL01lYXN1cmVzIGZyb20gdGhlIGZpcnN0IGVkZ2Ugb24gdGhlIGxpbmUgdG8gdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZS4KKyAgICBJTUFRX1BPSU5UX1RPX0VER0UgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9NZWFzdXJlcyBmcm9tIHRoZSBzdGFydCBwb2ludCBvZiB0aGUgbGluZSB0byB0aGUgZmlyc3QgZWRnZSBvbiB0aGUgbGluZS4KKyAgICBJTUFRX1BPSU5UX1RPX1BPSU5UICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9NZWFzdXJlcyBmcm9tIHRoZSBzdGFydCBwb2ludCBvZiB0aGUgbGluZSB0byB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lLgorICAgIElNQVFfTElORV9HQVVHRV9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTGluZUdhdWdlTWV0aG9kOworCit0eXBlZGVmIGVudW0gRGlyZWN0aW9uM0RfZW51bSB7CisgICAgSU1BUV8zRF9OVyAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSB2aWV3aW5nIGFuZ2xlIGZvciB0aGUgM0QgaW1hZ2UgaXMgZnJvbSB0aGUgbm9ydGh3ZXN0LgorICAgIElNQVFfM0RfU1cgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgdmlld2luZyBhbmdsZSBmb3IgdGhlIDNEIGltYWdlIGlzIGZyb20gdGhlIHNvdXRod2VzdC4KKyAgICBJTUFRXzNEX1NFICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIHZpZXdpbmcgYW5nbGUgZm9yIHRoZSAzRCBpbWFnZSBpcyBmcm9tIHRoZSBzb3V0aGVhc3QuCisgICAgSU1BUV8zRF9ORSAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSB2aWV3aW5nIGFuZ2xlIGZvciB0aGUgM0QgaW1hZ2UgaXMgZnJvbSB0aGUgbm9ydGhlYXN0LgorICAgIElNQVFfRElSRUNUSU9OXzNEX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IERpcmVjdGlvbjNEOworCit0eXBlZGVmIGVudW0gTGVhcm5pbmdNb2RlX2VudW0geworICAgIElNQVFfTEVBUk5fQUxMICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZXh0cmFjdHMgaW5mb3JtYXRpb24gZm9yIHNoaWZ0LSBhbmQgcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorICAgIElNQVFfTEVBUk5fU0hJRlRfSU5GT1JNQVRJT04gICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZXh0cmFjdHMgaW5mb3JtYXRpb24gZm9yIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyAgICBJTUFRX0xFQVJOX1JPVEFUSU9OX0lORk9STUFUSU9OID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGV4dHJhY3RzIGluZm9ybWF0aW9uIGZvciByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgSU1BUV9MRUFSTklOR19NT0RFX1NJWkVfR1VBUkQgICA9IDB4RkZGRkZGRkYgICAKK30gTGVhcm5pbmdNb2RlOworCit0eXBlZGVmIGVudW0gS2VybmVsRmFtaWx5X2VudW0geworICAgIElNQVFfR1JBRElFTlRfRkFNSUxZICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGtlcm5lbCBpcyBpbiB0aGUgZ3JhZGllbnQgZmFtaWx5LgorICAgIElNQVFfTEFQTEFDSUFOX0ZBTUlMWSAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGtlcm5lbCBpcyBpbiB0aGUgTGFwbGFjaWFuIGZhbWlseS4KKyAgICBJTUFRX1NNT09USElOR19GQU1JTFkgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBrZXJuZWwgaXMgaW4gdGhlIHNtb290aGluZyBmYW1pbHkuCisgICAgSU1BUV9HQVVTU0lBTl9GQU1JTFkgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUga2VybmVsIGlzIGluIHRoZSBHYXVzc2lhbiBmYW1pbHkuCisgICAgSU1BUV9LRVJORUxfRkFNSUxZX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEtlcm5lbEZhbWlseTsKKwordHlwZWRlZiBlbnVtIEludGVycG9sYXRpb25NZXRob2RfZW51bSB7CisgICAgSU1BUV9aRVJPX09SREVSICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYW4gaW50ZXJwb2xhdGlvbiBtZXRob2QgdGhhdCBpbnRlcnBvbGF0ZXMgbmV3IHBpeGVsIHZhbHVlcyB1c2luZyB0aGUgbmVhcmVzdCB2YWxpZCBuZWlnaGJvcmluZyBwaXhlbC4KKyAgICBJTUFRX0JJTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcnBvbGF0aW9uIG1ldGhvZCB0aGF0IGludGVycG9sYXRlcyBuZXcgcGl4ZWwgdmFsdWVzIHVzaW5nIGEgYmlkaXJlY3Rpb25hbCBhdmVyYWdlIG9mIHRoZSBuZWlnaGJvcmluZyBwaXhlbHMuCisgICAgSU1BUV9RVUFEUkFUSUMgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYW4gaW50ZXJwb2xhdGlvbiBtZXRob2QgdGhhdCBpbnRlcnBvbGF0ZXMgbmV3IHBpeGVsIHZhbHVlcyB1c2luZyBhIHF1YWRyYXRpYyBhcHByb3hpbWF0aW5nIHBvbHlub21pYWwuCisgICAgSU1BUV9DVUJJQ19TUExJTkUgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYW4gaW50ZXJwb2xhdGlvbiBtZXRob2QgdGhhdCBpbnRlcnBvbGF0ZXMgbmV3IHBpeGVsIHZhbHVlcyBieSBmaXR0aW5nIHRoZW0gdG8gYSBjdWJpYyBzcGxpbmUgY3VydmUsIHdoZXJlIHRoZSBjdXJ2ZSBpcyBiYXNlZCBvbiBrbm93biBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUgaW1hZ2UuCisgICAgSU1BUV9CSUxJTkVBUl9GSVhFRCAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHVzZXMgYW4gaW50ZXJwb2xhdGlvbiBtZXRob2QgdGhhdCBpbnRlcnBvbGF0ZXMgbmV3IHBpeGVsIHZhbHVlcyB1c2luZyBhIGJpZGlyZWN0aW9uYWwgYXZlcmFnZSBvZiB0aGUgbmVpZ2hib3JpbmcgcGl4ZWxzLgorICAgIElNQVFfSU5URVJQT0xBVElPTl9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gSW50ZXJwb2xhdGlvbk1ldGhvZDsKKwordHlwZWRlZiBlbnVtIEltYWdlVHlwZV9lbnVtIHsKKyAgICBJTUFRX0lNQUdFX1U4ICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBpbWFnZSB0eXBlIGlzIDgtYml0IHVuc2lnbmVkIGludGVnZXIgZ3JheXNjYWxlLgorICAgIElNQVFfSU1BR0VfVTE2ICAgICAgICAgICAgID0gNywgICAgICAgICAgIC8vVGhlIGltYWdlIHR5cGUgaXMgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgZ3JheXNjYWxlLgorICAgIElNQVFfSU1BR0VfSTE2ICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGltYWdlIHR5cGUgaXMgMTYtYml0IHNpZ25lZCBpbnRlZ2VyIGdyYXlzY2FsZS4KKyAgICBJTUFRX0lNQUdFX1NHTCAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBpbWFnZSB0eXBlIGlzIDMyLWJpdCBmbG9hdGluZy1wb2ludCBncmF5c2NhbGUuCisgICAgSU1BUV9JTUFHRV9DT01QTEVYICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgaW1hZ2UgdHlwZSBpcyBjb21wbGV4LgorICAgIElNQVFfSU1BR0VfUkdCICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGltYWdlIHR5cGUgaXMgUkdCIGNvbG9yLgorICAgIElNQVFfSU1BR0VfSFNMICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGltYWdlIHR5cGUgaXMgSFNMIGNvbG9yLgorICAgIElNQVFfSU1BR0VfUkdCX1U2NCAgICAgICAgID0gNiwgICAgICAgICAgIC8vVGhlIGltYWdlIHR5cGUgaXMgNjQtYml0IHVuc2lnbmVkIFJHQiBjb2xvci4KKyAgICBJTUFRX0lNQUdFX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gSW1hZ2VUeXBlOworCit0eXBlZGVmIGVudW0gSW1hZ2VGZWF0dXJlTW9kZV9lbnVtIHsKKyAgICBJTUFRX0NPTE9SX0FORF9TSEFQRV9GRUFUVVJFUyA9IDAsICAgICAgICAgICAvL0luc3RydWN0cyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRoZSBjb2xvciBhbmQgdGhlIHNoYXBlIGZlYXR1cmVzIG9mIHRoZSBjb2xvciBwYXR0ZXJuLgorICAgIElNQVFfQ09MT1JfRkVBVFVSRVMgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vSW5zdHJ1Y3RzIHRoZSBmdW5jdGlvbiB0byB1c2UgdGhlIGNvbG9yIGZlYXR1cmVzIG9mIHRoZSBjb2xvciBwYXR0ZXJuLgorICAgIElNQVFfU0hBUEVfRkVBVFVSRVMgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vSW5zdHJ1Y3RzIHRoZSBmdW5jdGlvbiB0byB1c2UgdGhlIHNoYXBlIGZlYXR1cmVzIG9mIHRoZSBjb2xvciBwYXR0ZXJuLgorICAgIElNQVFfRkVBVFVSRV9NT0RFX1NJWkVfR1VBUkQgID0gMHhGRkZGRkZGRiAgIAorfSBJbWFnZUZlYXR1cmVNb2RlOworCit0eXBlZGVmIGVudW0gRm9udENvbG9yX2VudW0geworICAgIElNQVFfV0hJVEUgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vRHJhd3MgdGV4dCBpbiB3aGl0ZS4KKyAgICBJTUFRX0JMQUNLICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0RyYXdzIHRleHQgaW4gYmxhY2suCisgICAgSU1BUV9JTlZFUlQgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9JbnZlcnRzIHRoZSB0ZXh0IHBpeGVscy4KKyAgICBJTUFRX0JMQUNLX09OX1dISVRFICAgICAgICA9IDMsICAgICAgICAgICAvL0RyYXdzIHRleHQgaW4gYmxhY2sgd2l0aCBhIHdoaXRlIGJhY2tncm91bmQuCisgICAgSU1BUV9XSElURV9PTl9CTEFDSyAgICAgICAgPSA0LCAgICAgICAgICAgLy9EcmF3cyB0ZXh0IGluIHdoaXRlIHdpdGggYSBibGFjayBiYWNrZ3JvdW5kLgorICAgIElNQVFfRk9OVF9DT0xPUl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBGb250Q29sb3I7CisKK3R5cGVkZWYgZW51bSBGbGlwQXhpc19lbnVtIHsKKyAgICBJTUFRX0hPUklaT05UQUxfQVhJUyAgICAgID0gMCwgICAgICAgICAgIC8vRmxpcHMgdGhlIGltYWdlIG92ZXIgdGhlIGNlbnRyYWwgaG9yaXpvbnRhbCBheGlzLgorICAgIElNQVFfVkVSVElDQUxfQVhJUyAgICAgICAgPSAxLCAgICAgICAgICAgLy9GbGlwcyB0aGUgaW1hZ2Ugb3ZlciB0aGUgY2VudHJhbCB2ZXJ0aWNhbCBheGlzLgorICAgIElNQVFfQ0VOVEVSX0FYSVMgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9GbGlwcyB0aGUgaW1hZ2Ugb3ZlciBib3RoIHRoZSBjZW50cmFsIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGF4ZXMuCisgICAgSU1BUV9ESUFHX0xfVE9fUl9BWElTICAgICA9IDMsICAgICAgICAgICAvL0ZsaXBzIHRoZSBpbWFnZSBvdmVyIGFuIGF4aXMgZnJvbSB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgdG8gbG93ZXIgcmlnaHQgY29ybmVyLgorICAgIElNQVFfRElBR19SX1RPX0xfQVhJUyAgICAgPSA0LCAgICAgICAgICAgLy9GbGlwcyB0aGUgaW1hZ2Ugb3ZlciBhbiBheGlzIGZyb20gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciB0byBsb3dlciBsZWZ0IGNvcm5lci4KKyAgICBJTUFRX0ZMSVBfQVhJU19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBGbGlwQXhpczsKKwordHlwZWRlZiBlbnVtIEVkZ2VQcm9jZXNzX2VudW0geworICAgIElNQVFfRklSU1QgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gbG9va3MgZm9yIHRoZSBmaXJzdCBlZGdlLgorICAgIElNQVFfRklSU1RfQU5EX0xBU1QgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gbG9va3MgZm9yIHRoZSBmaXJzdCBhbmQgbGFzdCBlZGdlLgorICAgIElNQVFfQUxMICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gbG9va3MgZm9yIGFsbCBlZGdlcy4KKyAgICBJTUFRX0JFU1QgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGxvb2tzIGZvciB0aGUgYmVzdCBlZGdlLgorICAgIElNQVFfRURHRV9QUk9DRVNTX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEVkZ2VQcm9jZXNzOworCit0eXBlZGVmIGVudW0gRHJhd01vZGVfZW51bSB7CisgICAgSU1BUV9EUkFXX1ZBTFVFICAgICAgICAgICA9IDAsICAgICAgICAgICAvL0RyYXdzIHRoZSBib3VuZGFyeSBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwaXhlbCB2YWx1ZS4KKyAgICBJTUFRX0RSQVdfSU5WRVJUICAgICAgICAgID0gMiwgICAgICAgICAgIC8vSW52ZXJ0cyB0aGUgcGl4ZWwgdmFsdWVzIG9mIHRoZSBib3VuZGFyeSBvZiB0aGUgb2JqZWN0LgorICAgIElNQVFfUEFJTlRfVkFMVUUgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9GaWxscyB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHBpeGVsIHZhbHVlLgorICAgIElNQVFfUEFJTlRfSU5WRVJUICAgICAgICAgPSAzLCAgICAgICAgICAgLy9JbnZlcnRzIHRoZSBwaXhlbCB2YWx1ZXMgb2YgdGhlIG9iamVjdC4KKyAgICBJTUFRX0hJR0hMSUdIVF9WQUxVRSAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGZpbGxzIHRoZSBvYmplY3QgYnkgaGlnaGxpZ2h0aW5nIHRoZSBlbmNsb3NlZCBwaXhlbHMgd2l0aCB0aGUgY29sb3Igb2YgdGhlIG9iamVjdC4KKyAgICBJTUFRX0RSQVdfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBEcmF3TW9kZTsKKwordHlwZWRlZiBlbnVtIE5lYXJlc3ROZWlnaGJvck1ldHJpY19lbnVtIHsKKyAgICBJTUFRX01FVFJJQ19NQVhJTVVNICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgbWF4aW11bSBtZXRyaWMuCisgICAgSU1BUV9NRVRSSUNfU1VNICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIHN1bSBtZXRyaWMuCisgICAgSU1BUV9NRVRSSUNfRVVDTElERUFOICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIEV1Y2xpZGVhbiBtZXRyaWMuCisgICAgSU1BUV9ORUFSRVNUX05FSUdIQk9SX01FVFJJQ19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBOZWFyZXN0TmVpZ2hib3JNZXRyaWM7CisKK3R5cGVkZWYgZW51bSBSZWFkUmVzb2x1dGlvbl9lbnVtIHsKKyAgICBJTUFRX0xPV19SRVNPTFVUSU9OICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vQ29uZmlndXJlcyBOSSBWaXNpb24gdG8gdXNlIGxvdyByZXNvbHV0aW9uIGR1cmluZyB0aGUgcmVhZCBwcm9jZXNzLgorICAgIElNQVFfTUVESVVNX1JFU09MVVRJT04gICAgICAgICAgPSAxLCAgICAgICAgICAgLy9Db25maWd1cmVzIE5JIFZpc2lvbiB0byB1c2UgbWVkaXVtIHJlc29sdXRpb24gZHVyaW5nIHRoZSByZWFkIHByb2Nlc3MuCisgICAgSU1BUV9ISUdIX1JFU09MVVRJT04gICAgICAgICAgICA9IDIsICAgICAgICAgICAvL0NvbmZpZ3VyZXMgTkkgVmlzaW9uIHRvIHVzZSBoaWdoIHJlc29sdXRpb24gZHVyaW5nIHRoZSByZWFkIHByb2Nlc3MuCisgICAgSU1BUV9SRUFEX1JFU09MVVRJT05fU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUmVhZFJlc29sdXRpb247CisKK3R5cGVkZWYgZW51bSBUaHJlc2hvbGRNb2RlX2VudW0geworICAgIElNQVFfRklYRURfUkFOR0UgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1BlcmZvcm1zIHRocmVzaG9sZGluZyB1c2luZyB0aGUgdmFsdWVzIHlvdSBwcm92aWRlIGluIHRoZSBsb3dUaHJlc2hvbGQgYW5kIGhpZ2hUaHJlc2hvbGQgZWxlbWVudHMgb2YgT0NSUHJvY2Vzc2luZ09wdGlvbnMuCisgICAgSU1BUV9DT01QVVRFRF9VTklGT1JNICAgICAgICAgID0gMSwgICAgICAgICAgIC8vQ2FsY3VsYXRlcyBhIHNpbmdsZSB0aHJlc2hvbGQgdmFsdWUgZm9yIHRoZSBlbnRpcmUgUk9JLgorICAgIElNQVFfQ09NUFVURURfTElORUFSICAgICAgICAgICA9IDIsICAgICAgICAgICAvL0NhbGN1bGF0ZXMgYSB2YWx1ZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBST0ksIGNhbGN1bGF0ZXMgYSB2YWx1ZSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgUk9JLCBhbmQgbGluZWFybHkgZmlsbHMgdGhlIG1pZGRsZSB2YWx1ZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0LgorICAgIElNQVFfQ09NUFVURURfTk9OTElORUFSICAgICAgICA9IDMsICAgICAgICAgICAvL0RpdmlkZXMgdGhlIFJPSSBpbnRvIHRoZSBudW1iZXIgb2YgYmxvY2tzIHNwZWNpZmllZCBieSB0aGUgYmxvY2tDb3VudCBlbGVtZW50IG9mIE9DUlByb2Nlc3NpbmdPcHRpb25zIGFuZCBjYWxjdWxhdGVzIGEgdGhyZXNob2xkIHZhbHVlIGZvciBlYWNoIGJsb2NrLgorICAgIElNQVFfVEhSRVNIT0xEX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gVGhyZXNob2xkTW9kZTsKKwordHlwZWRlZiBlbnVtIFJlYWRTdHJhdGVneV9lbnVtIHsKKyAgICBJTUFRX1JFQURfQUdHUkVTU0lWRSAgICAgICAgICA9IDAsICAgICAgICAgICAvL0NvbmZpZ3VyZXMgTkkgVmlzaW9uIHRvIHBlcmZvcm0gZmV3ZXIgY2hlY2tzIHdoZW4gYW5hbHl6aW5nIG9iamVjdHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgbWF0Y2ggdHJhaW5lZCBjaGFyYWN0ZXJzLgorICAgIElNQVFfUkVBRF9DT05TRVJWQVRJVkUgICAgICAgID0gMSwgICAgICAgICAgIC8vQ29uZmlndXJlcyBOSSBWaXNpb24gdG8gcGVyZm9ybSBtb3JlIGNoZWNrcyB0byBkZXRlcm1pbmUgaWYgYW4gb2JqZWN0IG1hdGNoZXMgYSB0cmFpbmVkIGNoYXJhY3Rlci4KKyAgICBJTUFRX1JFQURfU1RSQVRFR1lfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUmVhZFN0cmF0ZWd5OworCit0eXBlZGVmIGVudW0gTWVhc3VyZW1lbnRUeXBlX2VudW0geworICAgIElNQVFfTVRfQ0VOVEVSX09GX01BU1NfWCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9YLWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHJlcHJlc2VudGluZyB0aGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgdG90YWwgcGFydGljbGUgbWFzcywgYXNzdW1pbmcgZXZlcnkgcG9pbnQgaW4gdGhlIHBhcnRpY2xlIGhhcyBhIGNvbnN0YW50IGRlbnNpdHkuCisgICAgSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19ZICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1ktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3RhbCBwYXJ0aWNsZSBtYXNzLCBhc3N1bWluZyBldmVyeSBwb2ludCBpbiB0aGUgcGFydGljbGUgaGFzIGEgY29uc3RhbnQgZGVuc2l0eS4KKyAgICBJTUFRX01UX0ZJUlNUX1BJWEVMX1ggICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vWC1jb29yZGluYXRlIG9mIHRoZSBoaWdoZXN0LCBsZWZ0bW9zdCBwYXJ0aWNsZSBwaXhlbC4KKyAgICBJTUFRX01UX0ZJUlNUX1BJWEVMX1kgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vWS1jb29yZGluYXRlIG9mIHRoZSBoaWdoZXN0LCBsZWZ0bW9zdCBwYXJ0aWNsZSBwaXhlbC4KKyAgICBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfTEVGVCAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vWC1jb29yZGluYXRlIG9mIHRoZSBsZWZ0bW9zdCBwYXJ0aWNsZSBwb2ludC4KKyAgICBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfVE9QICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vWS1jb29yZGluYXRlIG9mIGhpZ2hlc3QgcGFydGljbGUgcG9pbnQuCisgICAgSU1BUV9NVF9CT1VORElOR19SRUNUX1JJR0hUICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAvL1gtY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHRtb3N0IHBhcnRpY2xlIHBvaW50LgorICAgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9CT1RUT00gICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgLy9ZLWNvb3JkaW5hdGUgb2YgdGhlIGxvd2VzdCBwYXJ0aWNsZSBwb2ludC4KKyAgICBJTUFRX01UX01BWF9GRVJFVF9ESUFNRVRFUl9TVEFSVF9YICAgICAgICAgID0gOCwgICAgICAgICAgIC8vWC1jb29yZGluYXRlIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3byBwZXJpbWV0ZXIgcG9pbnRzIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgICBJTUFRX01UX01BWF9GRVJFVF9ESUFNRVRFUl9TVEFSVF9ZICAgICAgICAgID0gOSwgICAgICAgICAgIC8vWS1jb29yZGluYXRlIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3byBwZXJpbWV0ZXIgcG9pbnRzIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgICBJTUFRX01UX01BWF9GRVJFVF9ESUFNRVRFUl9FTkRfWCAgICAgICAgICAgID0gMTAsICAgICAgICAgIC8vWC1jb29yZGluYXRlIG9mIHRoZSBlbmQgb2YgdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcGVyaW1ldGVyIHBvaW50cyB0aGF0IGFyZSB0aGUgZnVydGhlc3QgYXBhcnQuCisgICAgSU1BUV9NVF9NQVhfRkVSRVRfRElBTUVURVJfRU5EX1kgICAgICAgICAgICA9IDExLCAgICAgICAgICAvL1ktY29vcmRpbmF0ZSBvZiB0aGUgZW5kIG9mIHRoZSBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgdHdvIHBlcmltZXRlciBwb2ludHMgdGhhdCBhcmUgdGhlIGZ1cnRoZXN0IGFwYXJ0LgorICAgIElNQVFfTVRfTUFYX0hPUklaX1NFR01FTlRfTEVOR1RIX0xFRlQgICAgICAgPSAxMiwgICAgICAgICAgLy9YLWNvb3JkaW5hdGUgb2YgdGhlIGxlZnRtb3N0IHBpeGVsIGluIHRoZSBsb25nZXN0IHJvdyBvZiBjb250aWd1b3VzIHBpeGVscyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9NQVhfSE9SSVpfU0VHTUVOVF9MRU5HVEhfUklHSFQgICAgICA9IDEzLCAgICAgICAgICAvL1gtY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHRtb3N0IHBpeGVsIGluIHRoZSBsb25nZXN0IHJvdyBvZiBjb250aWd1b3VzIHBpeGVscyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9NQVhfSE9SSVpfU0VHTUVOVF9MRU5HVEhfUk9XICAgICAgICA9IDE0LCAgICAgICAgICAvL1ktY29vcmRpbmF0ZSBvZiBhbGwgb2YgdGhlIHBpeGVscyBpbiB0aGUgbG9uZ2VzdCByb3cgb2YgY29udGlndW91cyBwaXhlbHMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9XSURUSCAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgLy9EaXN0YW5jZSBiZXR3ZWVuIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGxlZnRtb3N0IHBhcnRpY2xlIHBvaW50IGFuZCB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSByaWdodG1vc3QgcGFydGljbGUgcG9pbnQuCisgICAgSU1BUV9NVF9CT1VORElOR19SRUNUX0hFSUdIVCAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAvL0Rpc3RhbmNlIGJldHdlZW4gdGhlIHktY29vcmRpbmF0ZSBvZiBoaWdoZXN0IHBhcnRpY2xlIHBvaW50IGFuZCB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBsb3dlc3QgcGFydGljbGUgcG9pbnQuCisgICAgSU1BUV9NVF9CT1VORElOR19SRUNUX0RJQUdPTkFMICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAvL0Rpc3RhbmNlIGJldHdlZW4gb3Bwb3NpdGUgY29ybmVycyBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgIElNQVFfTVRfUEVSSU1FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgLy9MZW5ndGggb2YgdGhlIG91dGVyIGJvdW5kYXJ5IG9mIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0NPTlZFWF9IVUxMX1BFUklNRVRFUiAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgIC8vUGVyaW1ldGVyIG9mIHRoZSBzbWFsbGVzdCBjb252ZXggcG9seWdvbiBjb250YWluaW5nIGFsbCBwb2ludHMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfSE9MRVNfUEVSSU1FVEVSICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgICAgLy9TdW0gb2YgdGhlIHBlcmltZXRlcnMgb2YgZWFjaCBob2xlIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX01BWF9GRVJFVF9ESUFNRVRFUiAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgICAgIC8vRGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3byBwZXJpbWV0ZXIgcG9pbnRzIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgICBJTUFRX01UX0VRVUlWQUxFTlRfRUxMSVBTRV9NQUpPUl9BWElTICAgICAgID0gMjMsICAgICAgICAgIC8vTGVuZ3RoIG9mIHRoZSBtYWpvciBheGlzIG9mIHRoZSBlbGxpcHNlIHdpdGggdGhlIHNhbWUgcGVyaW1ldGVyIGFuZCBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0VRVUlWQUxFTlRfRUxMSVBTRV9NSU5PUl9BWElTICAgICAgID0gMjQsICAgICAgICAgIC8vTGVuZ3RoIG9mIHRoZSBtaW5vciBheGlzIG9mIHRoZSBlbGxpcHNlIHdpdGggdGhlIHNhbWUgcGVyaW1ldGVyIGFuZCBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0VRVUlWQUxFTlRfRUxMSVBTRV9NSU5PUl9BWElTX0ZFUkVUID0gMjUsICAgICAgICAgIC8vTGVuZ3RoIG9mIHRoZSBtaW5vciBheGlzIG9mIHRoZSBlbGxpcHNlIHdpdGggdGhlIHNhbWUgYXJlYSBhcyB0aGUgcGFydGljbGUsIGFuZCBNYWpvciBBeGlzIGVxdWFsIGluIGxlbmd0aCB0byB0aGUgTWF4IEZlcmV0IERpYW1ldGVyLgorICAgIElNQVFfTVRfRVFVSVZBTEVOVF9SRUNUX0xPTkdfU0lERSAgICAgICAgICAgPSAyNiwgICAgICAgICAgLy9Mb25nZXN0IHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzYW1lIHBlcmltZXRlciBhbmQgYXJlYSBhcyB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9FUVVJVkFMRU5UX1JFQ1RfU0hPUlRfU0lERSAgICAgICAgICA9IDI3LCAgICAgICAgICAvL1Nob3J0ZXN0IHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzYW1lIHBlcmltZXRlciBhbmQgYXJlYSBhcyB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9FUVVJVkFMRU5UX1JFQ1RfRElBR09OQUwgICAgICAgICAgICA9IDI4LCAgICAgICAgICAvL0Rpc3RhbmNlIGJldHdlZW4gb3Bwb3NpdGUgY29ybmVycyBvZiB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIHNhbWUgcGVyaW1ldGVyIGFuZCBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0VRVUlWQUxFTlRfUkVDVF9TSE9SVF9TSURFX0ZFUkVUICAgID0gMjksICAgICAgICAgIC8vU2hvcnRlc3Qgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIHNhbWUgYXJlYSBhcyB0aGUgcGFydGljbGUsIGFuZCBsb25nZXN0IHNpZGUgZXF1YWwgaW4gbGVuZ3RoIHRvIHRoZSBNYXggRmVyZXQgRGlhbWV0ZXIuCisgICAgSU1BUV9NVF9BVkVSQUdFX0hPUklaX1NFR01FTlRfTEVOR1RIICAgICAgICA9IDMwLCAgICAgICAgICAvL0F2ZXJhZ2UgbGVuZ3RoIG9mIGEgaG9yaXpvbnRhbCBzZWdtZW50IGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0FWRVJBR0VfVkVSVF9TRUdNRU5UX0xFTkdUSCAgICAgICAgID0gMzEsICAgICAgICAgIC8vQXZlcmFnZSBsZW5ndGggb2YgYSB2ZXJ0aWNhbCBzZWdtZW50IGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0hZRFJBVUxJQ19SQURJVVMgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgIC8vVGhlIHBhcnRpY2xlIGFyZWEgZGl2aWRlZCBieSB0aGUgcGFydGljbGUgcGVyaW1ldGVyLgorICAgIElNQVFfTVRfV0FEREVMX0RJU0tfRElBTUVURVIgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgLy9EaWFtZXRlciBvZiBhIGRpc2sgd2l0aCB0aGUgc2FtZSBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX0FSRUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgIC8vQXJlYSBvZiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9IT0xFU19BUkVBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAvL1N1bSBvZiB0aGUgYXJlYXMgb2YgZWFjaCBob2xlIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX1BBUlRJQ0xFX0FORF9IT0xFU19BUkVBICAgICAgICAgICAgID0gMzcsICAgICAgICAgIC8vQXJlYSBvZiBhIHBhcnRpY2xlIHRoYXQgY29tcGxldGVseSBjb3ZlcnMgdGhlIGltYWdlLgorICAgIElNQVFfTVRfQ09OVkVYX0hVTExfQVJFQSAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAgICAgICAgLy9BcmVhIG9mIHRoZSBzbWFsbGVzdCBjb252ZXggcG9seWdvbiBjb250YWluaW5nIGFsbCBwb2ludHMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfSU1BR0VfQVJFQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOSwgICAgICAgICAgLy9BcmVhIG9mIHRoZSBpbWFnZS4KKyAgICBJTUFRX01UX05VTUJFUl9PRl9IT0xFUyAgICAgICAgICAgICAgICAgICAgID0gNDEsICAgICAgICAgIC8vTnVtYmVyIG9mIGhvbGVzIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX05VTUJFUl9PRl9IT1JJWl9TRUdNRU5UUyAgICAgICAgICAgID0gNDIsICAgICAgICAgIC8vTnVtYmVyIG9mIGhvcml6b250YWwgc2VnbWVudHMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfTlVNQkVSX09GX1ZFUlRfU0VHTUVOVFMgICAgICAgICAgICAgPSA0MywgICAgICAgICAgLy9OdW1iZXIgb2YgdmVydGljYWwgc2VnbWVudHMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgPSA0NSwgICAgICAgICAgLy9UaGUgYW5nbGUgb2YgdGhlIGxpbmUgdGhhdCBwYXNzZXMgdGhyb3VnaCB0aGUgcGFydGljbGUgQ2VudGVyIG9mIE1hc3MgYWJvdXQgd2hpY2ggdGhlIHBhcnRpY2xlIGhhcyB0aGUgbG93ZXN0IG1vbWVudCBvZiBpbmVydGlhLgorICAgIElNQVFfTVRfTUFYX0ZFUkVUX0RJQU1FVEVSX09SSUVOVEFUSU9OICAgICAgPSA0NiwgICAgICAgICAgLy9UaGUgYW5nbGUgb2YgdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcGVyaW1ldGVyIHBvaW50cyB0aGF0IGFyZSB0aGUgZnVydGhlc3QgYXBhcnQuCisgICAgSU1BUV9NVF9BUkVBX0JZX0lNQUdFX0FSRUEgICAgICAgICAgICAgICAgICA9IDQ4LCAgICAgICAgICAvL1BlcmNlbnRhZ2Ugb2YgdGhlIHBhcnRpY2xlIEFyZWEgY292ZXJpbmcgdGhlIEltYWdlIEFyZWEuCisgICAgSU1BUV9NVF9BUkVBX0JZX1BBUlRJQ0xFX0FORF9IT0xFU19BUkVBICAgICA9IDQ5LCAgICAgICAgICAvL1BlcmNlbnRhZ2Ugb2YgdGhlIHBhcnRpY2xlIEFyZWEgaW4gcmVsYXRpb24gdG8gaXRzIFBhcnRpY2xlIGFuZCBIb2xlcyBBcmVhLgorICAgIElNQVFfTVRfUkFUSU9fT0ZfRVFVSVZBTEVOVF9FTExJUFNFX0FYRVMgICAgPSA1MCwgICAgICAgICAgLy9FcXVpdmFsZW50IEVsbGlwc2UgTWFqb3IgQXhpcyBkaXZpZGVkIGJ5IEVxdWl2YWxlbnQgRWxsaXBzZSBNaW5vciBBeGlzLgorICAgIElNQVFfTVRfUkFUSU9fT0ZfRVFVSVZBTEVOVF9SRUNUX1NJREVTICAgICAgPSA1MSwgICAgICAgICAgLy9FcXVpdmFsZW50IFJlY3QgTG9uZyBTaWRlIGRpdmlkZWQgYnkgRXF1aXZhbGVudCBSZWN0IFNob3J0IFNpZGUuCisgICAgSU1BUV9NVF9FTE9OR0FUSU9OX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICA9IDUzLCAgICAgICAgICAvL01heCBGZXJldCBEaWFtZXRlciBkaXZpZGVkIGJ5IEVxdWl2YWxlbnQgUmVjdCBTaG9ydCBTaWRlIChGZXJldCkuCisgICAgSU1BUV9NVF9DT01QQUNUTkVTU19GQUNUT1IgICAgICAgICAgICAgICAgICA9IDU0LCAgICAgICAgICAvL0FyZWEgZGl2aWRlZCBieSB0aGUgcHJvZHVjdCBvZiBCb3VuZGluZyBSZWN0IFdpZHRoIGFuZCBCb3VuZGluZyBSZWN0IEhlaWdodC4KKyAgICBJTUFRX01UX0hFWVdPT0RfQ0lSQ1VMQVJJVFlfRkFDVE9SICAgICAgICAgID0gNTUsICAgICAgICAgIC8vUGVyaW1ldGVyIGRpdmlkZWQgYnkgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgYSBjaXJjbGUgd2l0aCB0aGUgc2FtZSBhcmVhLgorICAgIElNQVFfTVRfVFlQRV9GQUNUT1IgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NiwgICAgICAgICAgLy9GYWN0b3IgcmVsYXRpbmcgYXJlYSB0byBtb21lbnQgb2YgaW5lcnRpYS4KKyAgICBJTUFRX01UX1NVTV9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgsICAgICAgICAgIC8vVGhlIHN1bSBvZiBhbGwgeC1jb29yZGluYXRlcyBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9TVU1fWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5LCAgICAgICAgICAvL1RoZSBzdW0gb2YgYWxsIHktY29vcmRpbmF0ZXMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfU1VNX1hYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MCwgICAgICAgICAgLy9UaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIHNxdWFyZWQgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfU1VNX1hZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAgICAgICAgLy9UaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIHRpbWVzIHktY29vcmRpbmF0ZXMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfU1VNX1lZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MiwgICAgICAgICAgLy9UaGUgc3VtIG9mIGFsbCB5LWNvb3JkaW5hdGVzIHNxdWFyZWQgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfU1VNX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MywgICAgICAgICAgLy9UaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIGN1YmVkIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBJTUFRX01UX1NVTV9YWFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQsICAgICAgICAgIC8vVGhlIHN1bSBvZiBhbGwgeC1jb29yZGluYXRlcyBzcXVhcmVkIHRpbWVzIHktY29vcmRpbmF0ZXMgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfU1VNX1hZWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAgICAgICAgLy9UaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIHRpbWVzIHktY29vcmRpbmF0ZXMgc3F1YXJlZCBpbiB0aGUgcGFydGljbGUuCisgICAgSU1BUV9NVF9TVU1fWVlZICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2LCAgICAgICAgICAvL1RoZSBzdW0gb2YgYWxsIHktY29vcmRpbmF0ZXMgY3ViZWQgaW4gdGhlIHBhcnRpY2xlLgorICAgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWFggICAgICAgICAgICAgICAgPSA2OCwgICAgICAgICAgLy9UaGUgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHgtZGlyZWN0aW9uIHR3aWNlLgorICAgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWFkgICAgICAgICAgICAgICAgPSA2OSwgICAgICAgICAgLy9UaGUgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHggYW5kIHkgZGlyZWN0aW9ucy4KKyAgICBJTUFRX01UX01PTUVOVF9PRl9JTkVSVElBX1lZICAgICAgICAgICAgICAgID0gNzAsICAgICAgICAgIC8vVGhlIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB5LWRpcmVjdGlvbiB0d2ljZS4KKyAgICBJTUFRX01UX01PTUVOVF9PRl9JTkVSVElBX1hYWCAgICAgICAgICAgICAgID0gNzEsICAgICAgICAgIC8vVGhlIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LWRpcmVjdGlvbiB0aHJlZSB0aW1lcy4KKyAgICBJTUFRX01UX01PTUVOVF9PRl9JTkVSVElBX1hYWSAgICAgICAgICAgICAgID0gNzIsICAgICAgICAgIC8vVGhlIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LWRpcmVjdGlvbiB0d2ljZSBhbmQgdGhlIHktZGlyZWN0aW9uIG9uY2UuCisgICAgSU1BUV9NVF9NT01FTlRfT0ZfSU5FUlRJQV9YWVkgICAgICAgICAgICAgICA9IDczLCAgICAgICAgICAvL1RoZSBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeC1kaXJlY3Rpb24gb25jZSBhbmQgdGhlIHktZGlyZWN0aW9uIHR3aWNlLgorICAgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWVlZICAgICAgICAgICAgICAgPSA3NCwgICAgICAgICAgLy9UaGUgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHktZGlyZWN0aW9uIHRocmVlIHRpbWVzLgorICAgIElNQVFfTVRfTk9STV9NT01FTlRfT0ZfSU5FUlRJQV9YWCAgICAgICAgICAgPSA3NSwgICAgICAgICAgLy9UaGUgbm9ybWFsaXplZCBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeC1kaXJlY3Rpb24gdHdpY2UuCisgICAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1hZICAgICAgICAgICA9IDc2LCAgICAgICAgICAvL1RoZSBub3JtYWxpemVkIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LSBhbmQgeS1kaXJlY3Rpb25zLgorICAgIElNQVFfTVRfTk9STV9NT01FTlRfT0ZfSU5FUlRJQV9ZWSAgICAgICAgICAgPSA3NywgICAgICAgICAgLy9UaGUgbm9ybWFsaXplZCBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeS1kaXJlY3Rpb24gdHdpY2UuCisgICAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1hYWCAgICAgICAgICA9IDc4LCAgICAgICAgICAvL1RoZSBub3JtYWxpemVkIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LWRpcmVjdGlvbiB0aHJlZSB0aW1lcy4KKyAgICBJTUFRX01UX05PUk1fTU9NRU5UX09GX0lORVJUSUFfWFhZICAgICAgICAgID0gNzksICAgICAgICAgIC8vVGhlIG5vcm1hbGl6ZWQgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHgtZGlyZWN0aW9uIHR3aWNlIGFuZCB0aGUgeS1kaXJlY3Rpb24gb25jZS4KKyAgICBJTUFRX01UX05PUk1fTU9NRU5UX09GX0lORVJUSUFfWFlZICAgICAgICAgID0gODAsICAgICAgICAgIC8vVGhlIG5vcm1hbGl6ZWQgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHgtZGlyZWN0aW9uIG9uY2UgYW5kIHRoZSB5LWRpcmVjdGlvbiB0d2ljZS4KKyAgICBJTUFRX01UX05PUk1fTU9NRU5UX09GX0lORVJUSUFfWVlZICAgICAgICAgID0gODEsICAgICAgICAgIC8vVGhlIG5vcm1hbGl6ZWQgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHktZGlyZWN0aW9uIHRocmVlIHRpbWVzLgorICAgIElNQVFfTVRfSFVfTU9NRU5UXzEgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAgICAgICAgLy9UaGUgZmlyc3QgSHUgbW9tZW50LgorICAgIElNQVFfTVRfSFVfTU9NRU5UXzIgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MywgICAgICAgICAgLy9UaGUgc2Vjb25kIEh1IG1vbWVudC4KKyAgICBJTUFRX01UX0hVX01PTUVOVF8zICAgICAgICAgICAgICAgICAgICAgICAgID0gODQsICAgICAgICAgIC8vVGhlIHRoaXJkIEh1IG1vbWVudC4KKyAgICBJTUFRX01UX0hVX01PTUVOVF80ICAgICAgICAgICAgICAgICAgICAgICAgID0gODUsICAgICAgICAgIC8vVGhlIGZvdXJ0aCBIdSBtb21lbnQuCisgICAgSU1BUV9NVF9IVV9NT01FTlRfNSAgICAgICAgICAgICAgICAgICAgICAgICA9IDg2LCAgICAgICAgICAvL1RoZSBmaWZ0aCBIdSBtb21lbnQuCisgICAgSU1BUV9NVF9IVV9NT01FTlRfNiAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3LCAgICAgICAgICAvL1RoZSBzaXh0aCBIdSBtb21lbnQuCisgICAgSU1BUV9NVF9IVV9NT01FTlRfNyAgICAgICAgICAgICAgICAgICAgICAgICA9IDg4LCAgICAgICAgICAvL1RoZSBzZXZlbnRoIEh1IG1vbWVudC4KKyAgICBJTUFRX01FQVNVUkVNRU5UX1RZUEVfU0laRV9HVUFSRCAgICAgICAgICAgID0gMHhGRkZGRkZGRiAgIAorfSBNZWFzdXJlbWVudFR5cGU7CisKK3R5cGVkZWYgZW51bSBHZW9tZXRyaWNNYXRjaGluZ01vZGVfZW51bSB7CisgICAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hfU0hJRlRfSU5WQVJJQU5UICAgICA9IDAsICAgICAgICAgICAvL1NlYXJjaGVzIGZvciBvY2N1cnJlbmNlcyBvZiB0aGUgcGF0dGVybiBpbiB0aGUgaW1hZ2UsIGFzc3VtaW5nIHRoYXQgdGhlIHBhdHRlcm4gaXMgbm90IHJvdGF0ZWQgbW9yZSB0aGFuIHBsdXMgb3IgbWludXMgNSBkZWdyZWVzLgorICAgIElNQVFfR0VPTUVUUklDX01BVENIX1JPVEFUSU9OX0lOVkFSSUFOVCAgPSAxLCAgICAgICAgICAgLy9TZWFyY2hlcyBmb3Igb2NjdXJyZW5jZXMgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIGltYWdlIHdpdGggcmVkdWNlZCByZXN0cmljdGlvbiBvbiB0aGUgcm90YXRpb24gb2YgdGhlIHBhdHRlcm4uCisgICAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hfU0NBTEVfSU5WQVJJQU5UICAgICA9IDIsICAgICAgICAgICAvL1NlYXJjaGVzIGZvciBvY2N1cnJlbmNlcyBvZiB0aGUgcGF0dGVybiBpbiB0aGUgaW1hZ2Ugd2l0aCByZWR1Y2VkIHJlc3RyaWN0aW9uIG9uIHRoZSBzaXplIG9mIHRoZSBwYXR0ZXJuLgorICAgIElNQVFfR0VPTUVUUklDX01BVENIX09DQ0xVU0lPTl9JTlZBUklBTlQgPSA0LCAgICAgICAgICAgLy9TZWFyY2hlcyBmb3Igb2NjdXJyZW5jZXMgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIGltYWdlLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgcGVyY2VudGFnZSBvZiB0aGUgcGF0dGVybiB0byBiZSBvY2NsdWRlZC4KKyAgICBJTUFRX0dFT01FVFJJQ19NQVRDSElOR19NT0RFX1NJWkVfR1VBUkQgID0gMHhGRkZGRkZGRiAgIAorfSBHZW9tZXRyaWNNYXRjaGluZ01vZGU7CisKK3R5cGVkZWYgZW51bSBCdXR0b25MYWJlbF9lbnVtIHsKKyAgICBJTUFRX0JVVFRPTl9PSyAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGxhYmVsICJPSyIuCisgICAgSU1BUV9CVVRUT05fU0FWRSAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBsYWJlbCAiU2F2ZSIuCisgICAgSU1BUV9CVVRUT05fU0VMRUNUICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBsYWJlbCAiU2VsZWN0Ii4KKyAgICBJTUFRX0JVVFRPTl9MT0FEICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGxhYmVsICJMb2FkIi4KKyAgICBJTUFRX0JVVFRPTl9MQUJFTF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBCdXR0b25MYWJlbDsKKwordHlwZWRlZiBlbnVtIE5lYXJlc3ROZWlnaGJvck1ldGhvZF9lbnVtIHsKKyAgICBJTUFRX01JTklNVU1fTUVBTl9ESVNUQU5DRSAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgbWluaW11bSBtZWFuIGRpc3RhbmNlIG1ldGhvZC4KKyAgICBJTUFRX0tfTkVBUkVTVF9ORUlHSEJPUiAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgay1uZWFyZXN0IG5laWdoYm9yIG1ldGhvZC4KKyAgICBJTUFRX05FQVJFU1RfUFJPVE9UWVBFICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgbmVhcmVzdCBwcm90b3R5cGUgbWV0aG9kLgorICAgIElNQVFfTkVBUkVTVF9ORUlHSEJPUl9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTmVhcmVzdE5laWdoYm9yTWV0aG9kOworCit0eXBlZGVmIGVudW0gUVJNaXJyb3JNb2RlX2VudW0geworICAgIElNQVFfUVJfTUlSUk9SX01PREVfQVVUT19ERVRFQ1QgPSAtMiwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hvdWxkIGRldGVybWluZSBpZiB0aGUgUVIgY29kZSBpcyBtaXJyb3JlZC4KKyAgICBJTUFRX1FSX01JUlJPUl9NT0RFX01JUlJPUkVEICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNob3VsZCBleHBlY3QgdGhlIFFSIGNvZGUgdG8gYXBwZWFyIG1pcnJvcmVkLgorICAgIElNQVFfUVJfTUlSUk9SX01PREVfTk9STUFMICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hvdWxkIGV4cGVjdCB0aGUgUVIgY29kZSB0byBhcHBlYXIgbm9ybWFsLgorICAgIElNQVFfUVJfTUlSUk9SX01PREVfU0laRV9HVUFSRCAgPSAweEZGRkZGRkZGICAgCit9IFFSTWlycm9yTW9kZTsKKwordHlwZWRlZiBlbnVtIENvbHVtblByb2Nlc3NpbmdNb2RlX2VudW0geworICAgIElNQVFfQVZFUkFHRV9DT0xVTU5TICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vQXZlcmFnZXMgdGhlIGRhdGEgZXh0cmFjdGVkIGZvciBlZGdlIGRldGVjdGlvbi4KKyAgICBJTUFRX01FRElBTl9DT0xVTU5TICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1Rha2VzIHRoZSBtZWRpYW4gb2YgdGhlIGRhdGEgZXh0cmFjdGVkIGZvciBlZGdlIGRldGVjdGlvbi4KKyAgICBJTUFRX0NPTFVNTl9QUk9DRVNTSU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ29sdW1uUHJvY2Vzc2luZ01vZGU7CisKK3R5cGVkZWYgZW51bSBGaW5kUmVmZXJlbmNlRGlyZWN0aW9uX2VudW0geworICAgIElNQVFfTEVGVF9UT19SSUdIVF9ESVJFQ1QgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TZWFyY2hlcyBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSBmb3IgYSBkaXJlY3QgYXhpcy4KKyAgICBJTUFRX0xFRlRfVE9fUklHSFRfSU5ESVJFQ1QgICAgICAgID0gMSwgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEgZm9yIGFuIGluZGlyZWN0IGF4aXMuCisgICAgSU1BUV9UT1BfVE9fQk9UVE9NX0RJUkVDVCAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NlYXJjaGVzIGZyb20gdGhlIHRvcCBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIGJvdHRvbSBvZiB0aGUgc2VhcmNoIGFyZWEgZm9yIGEgZGlyZWN0IGF4aXMuCisgICAgSU1BUV9UT1BfVE9fQk9UVE9NX0lORElSRUNUICAgICAgICA9IDMsICAgICAgICAgICAvL1NlYXJjaGVzIGZyb20gdGhlIHRvcCBvZiB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIGJvdHRvbSBvZiB0aGUgc2VhcmNoIGFyZWEgZm9yIGFuIGluZGlyZWN0IGF4aXMuCisgICAgSU1BUV9SSUdIVF9UT19MRUZUX0RJUkVDVCAgICAgICAgICA9IDQsICAgICAgICAgICAvL1NlYXJjaGVzIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIGZvciBhIGRpcmVjdCBheGlzLgorICAgIElNQVFfUklHSFRfVE9fTEVGVF9JTkRJUkVDVCAgICAgICAgPSA1LCAgICAgICAgICAgLy9TZWFyY2hlcyBmcm9tIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSBmb3IgYW4gaW5kaXJlY3QgYXhpcy4KKyAgICBJTUFRX0JPVFRPTV9UT19UT1BfRElSRUNUICAgICAgICAgID0gNiwgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgdG9wIG9mIHRoZSBzZWFyY2ggYXJlYSBmb3IgYSBkaXJlY3QgYXhpcy4KKyAgICBJTUFRX0JPVFRPTV9UT19UT1BfSU5ESVJFQ1QgICAgICAgID0gNywgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgdG9wIG9mIHRoZSBzZWFyY2ggYXJlYSBmb3IgYW4gaW5kaXJlY3QgYXhpcy4KKyAgICBJTUFRX0ZJTkRfQ09PUkRfU1lTX0RJUl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBGaW5kUmVmZXJlbmNlRGlyZWN0aW9uOworCit0eXBlZGVmIGVudW0gTXVsdGljb3JlT3BlcmF0aW9uX2VudW0geworICAgIElNQVFfR0VUX0NPUkVTICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBwcm9jZXNzb3IgY29yZXMgTkkgVmlzaW9uIGlzIGN1cnJlbnRseSB1c2luZy4KKyAgICBJTUFRX1NFVF9DT1JFUyAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGNvcmVzIGZvciBOSSBWaXNpb24gdG8gdXNlLgorICAgIElNQVFfVVNFX01BWF9BVkFJTEFCTEUgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVXNlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29yIGNvcmVzLgorICAgIElNQVFfTVVMVElDT1JFX09QRVJBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBNdWx0aWNvcmVPcGVyYXRpb247CisKK3R5cGVkZWYgZW51bSBHcm91cEJlaGF2aW9yX2VudW0geworICAgIElNQVFfR1JPVVBfQ0xFQVIgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1NldHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdmVybGF5IGdyb3VwIHRvIGNsZWFyIHRoZSBjdXJyZW50IHNldHRpbmdzIHdoZW4gYW4gaW1hZ2UgaXMgdHJhbnNmb3JtZWQuCisgICAgSU1BUV9HUk9VUF9LRUVQICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU2V0cyB0aGUgYmVoYXZpb3Igb2YgdGhlIG92ZXJsYXkgZ3JvdXAgdG8ga2VlcCB0aGUgY3VycmVudCBzZXR0aW5ncyB3aGVuIGFuIGltYWdlIGlzIHRyYW5zZm9ybWVkLgorICAgIElNQVFfR1JPVVBfVFJBTlNGT1JNICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NldHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdmVybGF5IGdyb3VwIHRvIHRyYW5zZm9ybSB3aXRoIHRoZSBpbWFnZS4KKyAgICBJTUFRX0dST1VQX0JFSEFWSU9SX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEdyb3VwQmVoYXZpb3I7CisKK3R5cGVkZWYgZW51bSBRUkRpbWVuc2lvbnNfZW51bSB7CisgICAgSU1BUV9RUl9ESU1FTlNJT05TX0FVVE9fREVURUNUID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzExeDExICAgICAgID0gMTEsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDExIHggMTEuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzEzeDEzICAgICAgID0gMTMsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDEzIHggMTMuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE1eDE1ICAgICAgID0gMTUsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE1IHggMTUuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE3eDE3ICAgICAgID0gMTcsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE3IHggMTcuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzIxeDIxICAgICAgID0gMjEsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDIxIHggMjEuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzI1eDI1ICAgICAgID0gMjUsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDI1IHggMjUuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzI5eDI5ICAgICAgID0gMjksICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDI5IHggMjkuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzMzeDMzICAgICAgID0gMzMsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDMzIHggMzMuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzM3eDM3ICAgICAgID0gMzcsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDM3IHggMzcuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzQxeDQxICAgICAgID0gNDEsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDQxIHggNDEuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzQ1eDQ1ICAgICAgID0gNDUsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDQ1IHggNDUuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzQ5eDQ5ICAgICAgID0gNDksICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDQ5IHggNDkuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzUzeDUzICAgICAgID0gNTMsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDUzIHggNTMuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzU3eDU3ICAgICAgID0gNTcsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDU3IHggNTcuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzYxeDYxICAgICAgID0gNjEsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDYxIHggNjEuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzY1eDY1ICAgICAgID0gNjUsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDY1IHggNjUuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzY5eDY5ICAgICAgID0gNjksICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDY5IHggNjkuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzczeDczICAgICAgID0gNzMsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDczIHggNzMuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzc3eDc3ICAgICAgID0gNzcsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDc3IHggNzcuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzgxeDgxICAgICAgID0gODEsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDgxIHggODEuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzg1eDg1ICAgICAgID0gODUsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDg1IHggODUuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzg5eDg5ICAgICAgID0gODksICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDg5IHggODkuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzkzeDkzICAgICAgID0gOTMsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDkzIHggOTMuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzk3eDk3ICAgICAgID0gOTcsICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDk3IHggOTcuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzEwMXgxMDEgICAgID0gMTAxLCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDEwMSB4IDEwMS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTA1eDEwNSAgICAgPSAxMDUsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTA1IHggMTA1LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xMDl4MTA5ICAgICA9IDEwOSwgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMDkgeCAxMDkuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzExM3gxMTMgICAgID0gMTEzLCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDExMyB4IDExMy4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTE3eDExNyAgICAgPSAxMTcsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTE3IHggMTE3LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xMjF4MTIxICAgICA9IDEyMSwgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMjEgeCAxMjEuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzEyNXgxMjUgICAgID0gMTI1LCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDEyNSB4IDEyNS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTI5eDEyOSAgICAgPSAxMjksICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTI5IHggMTI5LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xMzN4MTMzICAgICA9IDEzMywgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMzMgeCAxMzMuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzEzN3gxMzcgICAgID0gMTM3LCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDEzNyB4IDEzNy4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTQxeDE0MSAgICAgPSAxNDEsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTQxIHggMTQxLgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xNDV4MTQ1ICAgICA9IDE0NSwgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNDUgeCAxNDUuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE0OXgxNDkgICAgID0gMTQ5LCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE0OSB4IDE0OS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTUzeDE1MyAgICAgPSAxNTMsICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTUzIHggMTUzLgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xNTd4MTU3ICAgICA9IDE1NywgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNTcgeCAxNTM3LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xNjF4MTYxICAgICA9IDE2MSwgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNjEgeCAxNjEuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE2NXgxNjUgICAgID0gMTY1LCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE2NSB4IDE2NS4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfMTY5eDE2OSAgICAgPSAxNjksICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTY5IHggMTY5LgorICAgIElNQVFfUVJfRElNRU5TSU9OU18xNzN4MTczICAgICA9IDE3MywgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNzMgeCAxNzMuCisgICAgSU1BUV9RUl9ESU1FTlNJT05TXzE3N3gxNzcgICAgID0gMTc3LCAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE3NyB4IDE3Ny4KKyAgICBJTUFRX1FSX0RJTUVOU0lPTlNfU0laRV9HVUFSRCAgPSAweEZGRkZGRkZGICAgCit9IFFSRGltZW5zaW9uczsKKwordHlwZWRlZiBlbnVtIFFSQ2VsbEZpbHRlck1vZGVfZW51bSB7CisgICAgSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX0FVVE9fREVURUNUICAgICAgID0gLTIsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGFsbCBmaWx0ZXIgbW9kZXMgYW5kIHVzZXMgdGhlIG9uZSB0aGF0IGRlY29kZXMgdGhlIFFSIGNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQgdXRpbGl6aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfQVZFUkFHRSAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBhdmVyYWdlIG9mIHRoZSBzYW1wbGVkIHBpeGVscy4KKyAgICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfTUVESUFOICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBtZWRpYW4gb2YgdGhlIHNhbXBsZWQgcGl4ZWxzLgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9DRU5UUkFMX0FWRVJBR0UgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2Ugb2YgdGhlIHBpeGVscyBpbiB0aGUgY2VudGVyIG9mIHRoZSBjZWxsIHNhbXBsZS4KKyAgICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfSElHSF9BVkVSQUdFICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBoYWxmIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBoaWdoZXN0IHBpeGVsIHZhbHVlcy4KKyAgICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfTE9XX0FWRVJBR0UgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBoYWxmIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBsb3dlc3QgcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9WRVJZX0hJR0hfQVZFUkFHRSA9IDUsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIG5pbnRoIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBoaWdoZXN0IHBpeGVsIHZhbHVlcy4KKyAgICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfVkVSWV9MT1dfQVZFUkFHRSAgPSA2LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBuaW50aCBvZiB0aGUgc2FtcGxlZCBwaXhlbHMgd2l0aCB0aGUgbG93ZXN0IHBpeGVsIHZhbHVlcy4KKyAgICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfQUxMICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdHJpZXMgZWFjaCBmaWx0ZXIgbW9kZSwgc3RhcnRpbmcgd2l0aCBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfQVZFUkFHRSBhbmQgZW5kaW5nIHdpdGggSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX1ZFUllfTE9XX0FWRVJBR0UsIHN0b3BwaW5nIG9uY2UgYSBmaWx0ZXIgbW9kZSBkZWNvZGVzIGNvcnJlY3RseS4KKyAgICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfU0laRV9HVUFSRCAgICAgICAgPSAweEZGRkZGRkZGICAgCit9IFFSQ2VsbEZpbHRlck1vZGU7CisKK3R5cGVkZWYgZW51bSBSb3VuZGluZ01vZGVfZW51bSB7CisgICAgSU1BUV9ST1VORElOR19NT0RFX09QVElNSVpFICAgPSAwLCAgICAgICAgICAgLy9Sb3VuZHMgdGhlIHJlc3VsdCBvZiBhIGRpdmlzaW9uIHVzaW5nIHRoZSBiZXN0IGF2YWlsYWJsZSBtZXRob2QuCisgICAgSU1BUV9ST1VORElOR19NT0RFX1RSVU5DQVRFICAgPSAxLCAgICAgICAgICAgLy9UcnVuY2F0ZXMgdGhlIHJlc3VsdCBvZiBhIGRpdmlzaW9uLgorICAgIElNQVFfUk9VTkRJTkdfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBSb3VuZGluZ01vZGU7CisKK3R5cGVkZWYgZW51bSBRUkRlbW9kdWxhdGlvbk1vZGVfZW51bSB7CisgICAgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9BVVRPX0RFVEVDVCAgICA9IC0yLCAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHRyeSBlYWNoIGRlbW9kdWxhdGlvbiBtb2RlIGFuZCB1c2UgdGhlIG9uZSB3aGljaCBkZWNvZGVzIHRoZSBRUiBjb2RlIHdpdGhpbiB0aGUgZmV3ZXN0IGl0ZXJhdGlvbnMgYW5kIHV0aWxpemluZyB0aGUgbGVhc3QgYW1vdW50IG9mIGVycm9yIGNvcnJlY3Rpb24uCisgICAgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9ISVNUT0dSQU0gICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGEgaGlzdG9ncmFtIG9mIGFsbCBvZiB0aGUgUVIgY2VsbHMgdG8gY2FsY3VsYXRlIGEgdGhyZXNob2xkLgorICAgIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfTE9DQUxfQ09OVFJBU1QgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZXhhbWluZXMgZWFjaCBvZiB0aGUgY2VsbCdzIG5laWdoYm9ycyB0byBkZXRlcm1pbmUgaWYgdGhlIGNlbGwgaXMgb24gb3Igb2ZmLgorICAgIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfQ09NQklORUQgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyB0aGUgaGlzdG9ncmFtIG9mIHRoZSBRUiBjb2RlIHRvIGNhbGN1bGF0ZSBhIHRocmVzaG9sZC4KKyAgICBJTUFRX1FSX0RFTU9EVUxBVElPTl9NT0RFX0FMTCAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHRyaWVzIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfSElTVE9HUkFNLCB0aGVuIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfTE9DQUxfQ09OVFJBU1QgYW5kIHRoZW4gSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9DT01CSU5FRCwgc3RvcHBpbmcgb25jZSBvbmUgbW9kZSBpcyBzdWNjZXNzZnVsLgorICAgIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfU0laRV9HVUFSRCAgICAgPSAweEZGRkZGRkZGICAgCit9IFFSRGVtb2R1bGF0aW9uTW9kZTsKKwordHlwZWRlZiBlbnVtIENvbnRyYXN0TW9kZV9lbnVtIHsKKyAgICBJTUFRX09SSUdJTkFMX0NPTlRSQVNUID0gMCwgIC8vSW5zdHJ1Y3RzIHRoZSBnZW9tZXRyaWMgbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIGZpbmQgbWF0Y2hlcyB3aXRoIHRoZSBzYW1lIGNvbnRyYXN0IGFzIHRoZSB0ZW1wbGF0ZS4KKyAgICBJTUFRX1JFVkVSU0VEX0NPTlRSQVNUID0gMSwgIC8vSW5zdHJ1Y3RzIHRoZSBnZW9tZXRyaWMgbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIGZpbmQgbWF0Y2hlcyB3aXRoIHRoZSBpbnZlcnRlZCBjb250cmFzdCBvZiB0aGUgdGVtcGxhdGUuCisgICAgSU1BUV9CT1RIX0NPTlRSQVNUUyAgICA9IDIsICAvL0luc3RydWN0cyB0aGUgZ2VvbWV0cmljIG1hdGNoaW5nIGFsZ29yaXRobSB0byBmaW5kIG1hdGNoZXMgd2l0aCB0aGUgc2FtZSBhbmQgaW52ZXJ0ZWQgY29udHJhc3Qgb2YgdGhlIHRlbXBsYXRlLgorfSBDb250cmFzdE1vZGU7CisKK3R5cGVkZWYgZW51bSBRUlBvbGFyaXRpZXNfZW51bSB7CisgICAgSU1BUV9RUl9QT0xBUklUWV9BVVRPX0RFVEVDVCAgICAgPSAtMiwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hvdWxkIGRldGVybWluZSB0aGUgcG9sYXJpdHkgb2YgdGhlIFFSIGNvZGUuCisgICAgSU1BUV9RUl9QT0xBUklUWV9CTEFDS19PTl9XSElURSAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hvdWxkIHNlYXJjaCBmb3IgYSBRUiBjb2RlIHdpdGggZGFyayBkYXRhIG9uIGEgYnJpZ2h0IGJhY2tncm91bmQuCisgICAgSU1BUV9RUl9QT0xBUklUWV9XSElURV9PTl9CTEFDSyAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2hvdWxkIHNlYXJjaCBmb3IgYSBRUiBjb2RlIHdpdGggYnJpZ2h0IGRhdGEgb24gYSBkYXJrIGJhY2tncm91bmQuCisgICAgSU1BUV9RUl9QT0xBUklUWV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFFSUG9sYXJpdGllczsKKwordHlwZWRlZiBlbnVtIFFSUm90YXRpb25Nb2RlX2VudW0geworICAgIElNQVFfUVJfUk9UQVRJT05fTU9ERV9VTkxJTUlURUQgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBhbGxvd3MgZm9yIHVubGltaXRlZCByb3RhdGlvbi4KKyAgICBJTUFRX1FSX1JPVEFUSU9OX01PREVfMF9ERUdSRUVTICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gYWxsb3dzIGZvciA/Pz8gNSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgIElNQVFfUVJfUk9UQVRJT05fTU9ERV85MF9ERUdSRUVTICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBhbGxvd3MgZm9yIGJldHdlZW4gODUgYW5kIDk1IGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgSU1BUV9RUl9ST1RBVElPTl9NT0RFXzE4MF9ERUdSRUVTID0gMywgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiAxNzUgYW5kIDE4NSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgIElNQVFfUVJfUk9UQVRJT05fTU9ERV8yNzBfREVHUkVFUyA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBhbGxvd3MgZm9yIGJldHdlZW4gMjY1IGFuZCAyNzUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgICBJTUFRX1FSX1JPVEFUSU9OX01PREVfU0laRV9HVUFSRCAgPSAweEZGRkZGRkZGICAgCit9IFFSUm90YXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gUVJHcmFkaW5nTW9kZV9lbnVtIHsKKyAgICBJTUFRX1FSX05PX0dSQURJTkcgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGRvZXMgbm90IG1ha2UgYW55IHByZXBhcmF0b3J5IGNhbGN1bGF0aW9ucy4KKyAgICBJTUFRX1FSX0dSQURJTkdfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBRUkdyYWRpbmdNb2RlOworCit0eXBlZGVmIGVudW0gU3RyYWlnaHRFZGdlU2VhcmNoTW9kZV9lbnVtIHsKKyAgICBJTUFRX1VTRV9GSVJTVF9SQUtFX0VER0VTICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9GaXRzIGEgc3RyYWlnaHQgZWRnZSBvbiB0aGUgZmlyc3QgcG9pbnRzIGRldGVjdGVkIHVzaW5nIGEgcmFrZS4KKyAgICBJTUFRX1VTRV9CRVNUX1JBS0VfRURHRVMgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9GaXRzIGEgc3RyYWlnaHQgZWRnZSBvbiB0aGUgYmVzdCBwb2ludHMgZGV0ZWN0ZWQgdXNpbmcgYSByYWtlLgorICAgIElNQVFfVVNFX0JFU1RfSE9VR0hfTElORSAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL0ZpbmRzIHRoZSBzdHJvbmdlc3Qgc3RyYWlnaHQgZWRnZSB1c2luZyBhbGwgcG9pbnRzIGRldGVjdGVkIG9uIGEgcmFrZS4KKyAgICBJTUFRX1VTRV9GSVJTVF9QUk9KRUNUSU9OX0VER0UgICAgICAgPSAzLCAgICAgICAgICAgLy9Vc2VzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgcHJvamVjdGVkIGVkZ2UgYXMgdGhlIHN0cmFpZ2h0IGVkZ2UuCisgICAgSU1BUV9VU0VfQkVTVF9QUk9KRUNUSU9OX0VER0UgICAgICAgID0gNCwgICAgICAgICAgIC8vRmluZHMgdGhlIHN0cm9uZ2VzdCBwcm9qZWN0ZWQgZWRnZSBsb2NhdGlvbiB0byBkZXRlcm1pbmUgdGhlIHN0cmFpZ2h0IGVkZ2UuCisgICAgSU1BUV9TVFJBSUdIVF9FREdFX1NFQVJDSF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBTdHJhaWdodEVkZ2VTZWFyY2hNb2RlOworCit0eXBlZGVmIGVudW0gU2VhcmNoRGlyZWN0aW9uX2VudW0geworICAgIElNQVFfU0VBUkNIX0RJUkVDVElPTl9MRUZUX1RPX1JJR0hUID0gMCwgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgSU1BUV9TRUFSQ0hfRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQgPSAxLCAgICAgICAgICAgLy9TZWFyY2hlcyBmcm9tIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgICBJTUFRX1NFQVJDSF9ESVJFQ1RJT05fVE9QX1RPX0JPVFRPTSA9IDIsICAgICAgICAgICAvL1NlYXJjaGVzIGZyb20gdGhlIHRvcCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgYm90dG9tIHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhLgorICAgIElNQVFfU0VBUkNIX0RJUkVDVElPTl9CT1RUT01fVE9fVE9QID0gMywgICAgICAgICAgIC8vU2VhcmNoZXMgZnJvbSB0aGUgYm90dG9tIHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhIHRvIHRoZSB0b3Agc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgICAgSU1BUV9TRUFSQ0hfRElSRUNUSU9OX1NJWkVfR1VBUkQgICAgPSAweEZGRkZGRkZGICAgCit9IFNlYXJjaERpcmVjdGlvbjsKKwordHlwZWRlZiBlbnVtIFFSU3RyZWFtTW9kZV9lbnVtIHsKKyAgICBJTUFRX1FSX01PREVfTlVNRVJJQyAgICAgID0gMCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGRhdGEgd2FzIGVuY29kZWQgdXNpbmcgbnVtZXJpYyBtb2RlLgorICAgIElNQVFfUVJfTU9ERV9BTFBIQU5VTUVSSUMgPSAxLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSB3YXMgZW5jb2RlZCB1c2luZyBhbHBoYS1udW1lcmljIG1vZGUuCisgICAgSU1BUV9RUl9NT0RFX1JBV19CWVRFICAgICA9IDIsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBkYXRhIHdhcyBub3QgZW5jb2RlZCBidXQgaXMgb25seSByYXcgYmluYXJ5IGJ5dGVzLCBvciBlbmNvZGVkIGluIEpJUy04LgorICAgIElNQVFfUVJfTU9ERV9FQU4xMjhfVE9LRU4gPSAzLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgcmVwcmVzZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIElELgorICAgIElNQVFfUVJfTU9ERV9FQU4xMjhfREFUQSAgPSA0LCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgcmVwcmVzZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIElELgorICAgIElNQVFfUVJfTU9ERV9FQ0kgICAgICAgICAgPSA1LCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSB3YXMgbWVhbnQgdG8gYmUgcmVhZCB1c2luZyB0aGUgbGFuZ3VhZ2UgcmVwcmVzZW50ZWQgaW4gdGhlIGxhbmd1YWdlIElELgorICAgIElNQVFfUVJfTU9ERV9LQU5KSSAgICAgICAgPSA2LCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSB3YXMgZW5jb2RlZCBpbiBTaGlmdC1KSVMxNiBKYXBhbmVzZS4KKyAgICBJTUFRX1FSX01PREVfU0laRV9HVUFSRCAgID0gMHhGRkZGRkZGRiAgIAorfSBRUlN0cmVhbU1vZGU7CisKK3R5cGVkZWYgZW51bSBQYXJ0aWNsZUNsYXNzaWZpZXJUeXBlX2VudW0geworICAgIElNQVFfUEFSVElDTEVfTEFSR0VTVCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9Vc2Ugb25seSB0aGUgbGFyZ2VzdCBwYXJ0aWNsZSBpbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9QQVJUSUNMRV9BTEwgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1VzZSBhbGwgcGFydGljbGVzIGluIHRoZSBpbWFnZS4KKyAgICBJTUFRX1BBUlRJQ0xFX0NMQVNTSUZJRVJfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBQYXJ0aWNsZUNsYXNzaWZpZXJUeXBlOworCit0eXBlZGVmIGVudW0gUVJDZWxsU2FtcGxlU2l6ZV9lbnVtIHsKKyAgICBJTUFRX1FSX0NFTExfU0FNUExFX1NJWkVfQVVUT19ERVRFQ1QgPSAtMiwgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB0cnkgZWFjaCBzYW1wbGUgc2l6ZSBhbmQgdXNlIHRoZSBvbmUgd2hpY2ggZGVjb2RlcyB0aGUgUVIgY29kZSB3aXRoaW4gdGhlIGZld2VzdCBpdGVyYXRpb25zIGFuZCB1dGlsaXppbmcgdGhlIGxlYXN0IGFtb3VudCBvZiBlcnJvciBjb3JyZWN0aW9uLgorICAgIElNQVFfUVJfQ0VMTF9TQU1QTEVfU0laRTFYMSAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDF4MSBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFMlgyICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgMngyIHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRX1FSX0NFTExfU0FNUExFX1NJWkUzWDMgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSAzeDMgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfUVJfQ0VMTF9TQU1QTEVfU0laRTRYNCAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDR4NCBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFNVg1ICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgNXg1IHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRX1FSX0NFTExfU0FNUExFX1NJWkU2WDYgICAgICAgICAgPSA2LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA2eDYgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfUVJfQ0VMTF9TQU1QTEVfU0laRTdYNyAgICAgICAgICA9IDcsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDd4NyBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV9RUl9DRUxMX1NBTVBMRV9UWVBFX1NJWkVfR1VBUkQgID0gMHhGRkZGRkZGRiAgIAorfSBRUkNlbGxTYW1wbGVTaXplOworCit0eXBlZGVmIGVudW0gUmFrZVByb2Nlc3NUeXBlX2VudW0geworICAgIElNQVFfR0VUX0ZJUlNUX0VER0VTICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAKKyAgICBJTUFRX0dFVF9GSVJTVF9BTkRfTEFTVF9FREdFUyAgICAgPSAxLCAgICAgICAgICAgCisgICAgSU1BUV9HRVRfQUxMX0VER0VTICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIAorICAgIElNQVFfR0VUX0JFU1RfRURHRVMgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAKKyAgICBJTUFRX1JBS0VfUFJPQ0VTU19UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFJha2VQcm9jZXNzVHlwZTsKKwordHlwZWRlZiBlbnVtIEdlb21ldHJpY1NldHVwRGF0YUl0ZW1fZW51bSB7CisgICAgSU1BUV9DVVJWRV9FWFRSQUNUSU9OX01PREUgICAgICAgICAgICAgPSAwLCAgIC8vU3BlY2lmaWVzIGhvdyB0aGUgZnVuY3Rpb24gaWRlbnRpZmllcyBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICAgIElNQVFfQ1VSVkVfRURHRV9USFJTSE9MRCAgICAgICAgICAgICAgID0gMSwgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBjb250cmFzdCBhbiBlZGdlIHBpeGVsIG11c3QgaGF2ZSBmb3IgaXQgdG8gYmUgY29uc2lkZXJlZCBwYXJ0IG9mIGEgY3VydmUuCisgICAgSU1BUV9DVVJWRV9FREdFX0ZJTFRFUiAgICAgICAgICAgICAgICAgPSAyLCAgIC8vU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgZWRnZSBmaWx0ZXIgdGhhdCB0aGUgZnVuY3Rpb24gdXNlcyB0byBpZGVudGlmeSBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICAgIElNQVFfTUlOSU1VTV9DVVJWRV9MRU5HVEggICAgICAgICAgICAgID0gMywgICAvL1NwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZSBzbWFsbGVzdCBjdXJ2ZSB0aGF0IHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0byBpZGVudGlmeS4KKyAgICBJTUFRX0NVUlZFX1JPV19TRUFSQ0hfU1RFUF9TSVpFICAgICAgICA9IDQsICAgLy9TcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiB0aGUgeSBkaXJlY3Rpb24sIGJldHdlZW4gdGhlIGltYWdlIHJvd3MgdGhhdCB0aGUgYWxnb3JpdGhtIGluc3BlY3RzIGZvciBjdXJ2ZSBzZWVkIHBvaW50cy4KKyAgICBJTUFRX0NVUlZFX0NPTF9TRUFSQ0hfU1RFUF9TSVpFICAgICAgICA9IDUsICAgLy9TcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiB0aGUgeCBkaXJlY3Rpb24sIGJldHdlZW4gdGhlIGltYWdlIGNvbHVtbnMgdGhhdCB0aGUgYWxnb3JpdGhtIGluc3BlY3RzIGZvciBjdXJ2ZSBzZWVkIHBvaW50cy4KKyAgICBJTUFRX0NVUlZFX01BWF9FTkRfUE9JTlRfR0FQICAgICAgICAgICA9IDYsICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gZ2FwLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIGVuZHBvaW50cyBvZiBhIGN1cnZlIHRoYXQgdGhlIGZ1bmN0aW9uIGlkZW50aWZpZXMgYXMgYSBjbG9zZWQgY3VydmUuCisgICAgSU1BUV9FWFRSQUNUX0NMT1NFRF9DVVJWRVMgICAgICAgICAgICAgPSA3LCAgIC8vU3BlY2lmaWVzIHdoZXRoZXIgdG8gaWRlbnRpZnkgb25seSBjbG9zZWQgY3VydmVzIGluIHRoZSBpbWFnZS4KKyAgICBJTUFRX0VOQUJMRV9TVUJQSVhFTF9DVVJWRV9FWFRSQUNUSU9OICA9IDgsICAgLy9UaGUgZnVuY3Rpb24gaWdub3JlcyB0aGlzIG9wdGlvbi4KKyAgICBJTUFRX0VOQUJMRV9DT1JSRUxBVElPTl9TQ09SRSAgICAgICAgICA9IDksICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSB0aGUgQ29ycmVsYXRpb24gU2NvcmUgYW5kIHJldHVybiBpdCBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgICAgSU1BUV9FTkFCTEVfU1VCUElYRUxfQUNDVVJBQ1kgICAgICAgICAgPSAxMCwgIC8vRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHJldHVybiB0aGUgbWF0Y2ggcmVzdWx0cyB3aXRoIHN1YnBpeGVsIGFjY3VyYWN5LgorICAgIElNQVFfU1VCUElYRUxfSVRFUkFUSU9OUyAgICAgICAgICAgICAgID0gMTEsICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIHVzZWQgdG8gcmVmaW5lIG1hdGNoZXMgdXNpbmcgc3VicGl4ZWwgaW5mb3JtYXRpb24uCisgICAgSU1BUV9TVUJQSVhFTF9UT0xFUkFOQ0UgICAgICAgICAgICAgICAgPSAxMiwgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjaGFuZ2UsIGluIHBpeGVscywgYmV0d2VlbiBjb25zZWN1dGl2ZSBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgaW4gdGhlIG1hdGNoIHBvc2l0aW9uIGJlZm9yZSB0aGUgZnVuY3Rpb24gc3RvcHMgcmVmaW5pbmcgdGhlIG1hdGNoIHBvc2l0aW9uLgorICAgIElNQVFfSU5JVElBTF9NQVRDSF9MSVNUX0xFTkdUSCAgICAgICAgID0gMTMsICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRjaCBsaXN0LgorICAgIElNQVFfRU5BQkxFX1RBUkdFVF9URU1QTEFURV9DVVJWRVNDT1JFID0gMTQsICAvL1NwZWNpZmllcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBtYXRjaCBjdXJ2ZSB0byB0ZW1wbGF0ZSBjdXJ2ZSBzY29yZSBhbmQgcmV0dXJuIGl0IGZvciBlYWNoIG1hdGNoIHJlc3VsdC4KKyAgICBJTUFRX01JTklNVU1fTUFUQ0hfU0VQQVJBVElPTl9ESVNUQU5DRSA9IDE1LCAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gc2VwYXJhdGlvbiBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSBvcmlnaW5zIG9mIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgcG9zaXRpb25zLgorICAgIElNQVFfTUlOSU1VTV9NQVRDSF9TRVBBUkFUSU9OX0FOR0xFICAgID0gMTYsICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBhbmd1bGFyIGRpZmZlcmVuY2UsIGluIGRlZ3JlZXMsIGJldHdlZW4gdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBhbmdsZXMuCisgICAgSU1BUV9NSU5JTVVNX01BVENIX1NFUEFSQVRJT05fU0NBTEUgICAgPSAxNywgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGRpZmZlcmVuY2UgaW4gc2NhbGUsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIGJldHdlZW4gdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBzY2FsZXMuCisgICAgSU1BUV9NQVhJTVVNX01BVENIX09WRVJMQVAgICAgICAgICAgICAgPSAxOCwgIC8vU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdGhlIGFsZ29yaXRobSB0byBzcGVuZCBsZXNzIHRpbWUgYWNjdXJhdGVseSBlc3RpbWF0aW5nIHRoZSBsb2NhdGlvbiBvZiBhIG1hdGNoLgorICAgIElNQVFfRU5BQkxFX0NPQVJTRV9SRVNVTFQgICAgICAgICAgICAgID0gMTksICAvL1NwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBhbGdvcml0aG0gdG8gc3BlbmQgbGVzcyB0aW1lIGFjY3VyYXRlbHkgZXN0aW1hdGluZyB0aGUgbG9jYXRpb24gb2YgYSBtYXRjaC4KKyAgICBJTUFRX0VOQUJMRV9DQUxJQlJBVElPTl9TVVBQT1JUICAgICAgICA9IDIwLCAgLy9TcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGFsZ29yaXRobSB0cmVhdCB0aGUgaW5zcGVjdGlvbiBpbWFnZSBhcyBhIGNhbGlicmF0ZWQgaW1hZ2UuCisgICAgSU1BUV9FTkFCTEVfQ09OVFJBU1RfUkVWRVJTQUwgICAgICAgICAgPSAyMSwgIC8vU3BlY2lmaWVzIHRoZSBjb250cmFzdCBvZiB0aGUgbWF0Y2hlcyB0byBzZWFyY2ggZm9yLgorICAgIElNQVFfU0VBUkNIX1NUUkFURUdZICAgICAgICAgICAgICAgICAgID0gMjIsICAvL1NwZWNpZmllcyB0aGUgYWdncmVzc2l2ZW5lc3Mgb2YgdGhlIHN0cmF0ZWd5IHVzZWQgdG8gZmluZCBtYXRjaGVzIGluIHRoZSBpbWFnZS4KKyAgICBJTUFRX1JFRklORU1FTlRfTUFUQ0hfRkFDVE9SICAgICAgICAgICA9IDIzLCAgLy9TcGVjaWZpZXMgdGhlIGZhY3RvciBhcHBsaWVkIHRvIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyByZXF1ZXN0ZWQgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IG1hdGNoZXMgYXJlIHJlZmluZWQgaW4gdGhlIHB5cmFtaWQgc3RhZ2UuCisgICAgSU1BUV9TVUJQSVhFTF9NQVRDSF9GQUNUT1IgICAgICAgICAgICAgPSAyNCwgIC8vU3BlY2lmaWVzIHRoZSBmYWN0b3IgYXBwbGllZCB0byB0aGUgbnVtYmVyIGZvciBtYXRjaGVzIHJlcXVlc3RlZCB0byBkZXRlcm1pbmUgaG93IG1hbnkgbWF0Y2hlcyBhcmUgdXNlZCBmb3IgdGhlIGZpbmFsIChzdWJwaXhlbCkgc3RhZ2UuCisgICAgSU1BUV9NQVhfUkVGSU5FTUVOVF9JVEVSQVRJT05TICAgICAgICAgPSAyNSwgIC8vU3BlY2lmaWVzIG1heGltdW0gcmVmaW5lbWVudCBpdGVyYXRpb24uCit9IEdlb21ldHJpY1NldHVwRGF0YUl0ZW07CisKK3R5cGVkZWYgZW51bSBEaXN0b3J0aW9uTW9kZWxfZW51bSB7CisgICAgSU1BUV9QT0xZTk9NSUFMX01PREVMICAgID0gMCwgICAvL1BvbHlub21pYWwgbW9kZWwuCisgICAgSU1BUV9ESVZJU0lPTl9NT0RFTCAgICAgID0gMSwgICAvL0RpdmlzaW9uIE1vZGVsLgorICAgIElNQVFfTk9fRElTVE9SVElPTl9NT0RFTCA9IC0xLCAgLy9Ob3QgYSBkaXN0b3J0aW9uIG1vZGVsLgorfSBEaXN0b3J0aW9uTW9kZWw7CisKK3R5cGVkZWYgZW51bSBDYWxpYnJhdGlvblRodW1ibmFpbFR5cGVfZW51bSB7CisgICAgSU1BUV9DQU1BUkFfTU9ERUxfVFlQRSAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vQ2FtYXJhIG1vZGVsIHRodW1ibmFpbCB0eXBlLgorICAgIElNQVFfUEVSU1BFQ1RJVkVfVFlQRSAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1BlcnNwZWN0aXZlIHRodW1ibmFpbCB0eXBlLgorICAgIElNQVFfTUlDUk9fUExBTkVfVFlQRSAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL01pY3JvIFBsYW5lIHRodW1ibmFpbCB0eXBlLgorICAgIElNQVFfQ0FMSUJSQVRJT05fVEhVTUJOQUlMX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ2FsaWJyYXRpb25UaHVtYm5haWxUeXBlOworCit0eXBlZGVmIGVudW0gU2V0dGluZ1R5cGVfZW51bSB7CisgICAgSU1BUV9ST1RBVElPTl9BTkdMRV9SQU5HRSAgICA9IDAsICAgICAgICAgICAvL1NldCBhIHJhbmdlIGZvciB0aGlzIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbmdsZXMgYXQgd2hpY2ggeW91IGV4cGVjdCB0aGUgRnVuY3Rpb24gdG8gZmluZCB0ZW1wbGF0ZSBtYXRjaGVzIGluIHRoZSBpbnNwZWN0aW9uIGltYWdlLgorICAgIElNQVFfU0NBTEVfUkFOR0UgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TZXQgYSByYW5nZSBmb3IgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgc2l6ZXMgYXQgd2hpY2ggeW91IGV4cGVjdCB0aGUgRnVuY3Rpb24gdG8gZmluZCB0ZW1wbGF0ZSBtYXRjaGVzIGluIHRoZSBpbnNwZWN0aW9uIGltYWdlLgorICAgIElNQVFfT0NDTFVTSU9OX1JBTkdFICAgICAgICAgPSAyLCAgICAgICAgICAgLy9TZXQgYSByYW5nZSBmb3IgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYW1vdW50IG9mIG9jY2x1c2lvbiB5b3UgZXhwZWN0IGZvciBhIG1hdGNoIGluIHRoZSBpbnNwZWN0aW9uIGltYWdlLgorICAgIElNQVFfU0VUVElOR19UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFNldHRpbmdUeXBlOworCit0eXBlZGVmIGVudW0gU2VnbWVudGF0aW9uRGlzdGFuY2VMZXZlbF9lbnVtIHsKKyAgICBJTUFRX1NFR01FTlRBVElPTl9MRVZFTF9DT05TRVJWQVRJVkUgPSAwLCAgICAgICAgICAgLy9Vc2VzIGV4dGVuc2l2ZSBjcml0ZXJpYSB0byBkZXRlcm1pbmUgdGhlIE1heGltdW0gRGlzdGFuY2UuCisgICAgSU1BUV9TRUdNRU5UQVRJT05fTEVWRUxfQUdHUkVTU0lWRSAgID0gMSwgICAgICAgICAgIC8vVXNlcyBmZXcgY3JpdGVyaWEgdG8gZGV0ZXJtaW5lIHRoZSBNYXhpbXVtIERpc3RhbmNlLgorICAgIElNQVFfU0VHTUVOVEFUSU9OX0xFVkVMX1NJWkVfR1VBUkQgICA9IDB4RkZGRkZGRkYgICAKK30gU2VnbWVudGF0aW9uRGlzdGFuY2VMZXZlbDsKKwordHlwZWRlZiBlbnVtIEV4dHJhY3RDb250b3VyU2VsZWN0aW9uX2VudW0geworICAgIElNQVFfQ0xPU0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU2VsZWN0cyB0aGUgY3VydmUgY2xvc2VzdCB0byB0aGUgUk9JLgorICAgIElNQVFfTE9OR0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU2VsZWN0cyB0aGUgbG9uZ2VzdCBjdXJ2ZS4KKyAgICBJTUFRX1NUUk9OR0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NlbGVjdHMgdGhlIGN1cnZlIHdpdGggdGhlIGhpZ2hlc3QgZWRnZSBzdHJlbmd0aCBhdmVyYWdlZCBmcm9tIGVhY2ggcG9pbnQgb24gdGhlIGN1cnZlLgorICAgIElNQVFfRVhUUkFDVF9DT05UT1VSX1NFTEVDVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBFeHRyYWN0Q29udG91clNlbGVjdGlvbjsKKwordHlwZWRlZiBlbnVtIEZpbmRUcmFuc2Zvcm1Nb2RlX2VudW0geworICAgIElNQVFfRklORF9SRUZFUkVOQ0UgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVXBkYXRlIGJvdGggcGFydHMgb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgIElNQVFfVVBEQVRFX1RSQU5TRk9STSAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVXBkYXRlIG9ubHkgdGhlIG5ldyByZWZlcmVuY2Ugc3lzdGVtLgorICAgIElNQVFfRklORF9UUkFOU0ZPUk1fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBGaW5kVHJhbnNmb3JtTW9kZTsKKwordHlwZWRlZiBlbnVtIEV4dHJhY3RDb250b3VyRGlyZWN0aW9uX2VudW0geworICAgIElNQVFfUkVDVF9MRUZUX1JJR0hUICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU2VhcmNoZXMgdGhlIFJPSSBmcm9tIGxlZnQgdG8gcmlnaHQuCisgICAgSU1BUV9SRUNUX1JJR0hUX0xFRlQgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TZWFyY2hlcyB0aGUgUk9JIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAgICBJTUFRX1JFQ1RfVE9QX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NlYXJjaGVzIHRoZSBST0kgZnJvbSB0b3AgdG8gYm90dG9tLgorICAgIElNQVFfUkVDVF9CT1RUT01fVE9QICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vU2VhcmNoZXMgdGhlIFJPSSBmcm9tIGJvdHRvbSB0byB0b3AuCisgICAgSU1BUV9BTk5VTFVTX0lOTkVSX09VVEVSICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9TZWFyY2hlcyB0aGUgUk9JIGZyb20gdGhlIGlubmVyIHJhZGl1cyB0byB0aGUgb3V0ZXIgcmFkaXVzLgorICAgIElNQVFfQU5OVUxVU19PVVRFUl9JTk5FUiAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vU2VhcmNoZXMgdGhlIFJPSSBmcm9tIHRoZSBvdXRlciByYWRpdXMgdG8gdGhlIGlubmVyIHJhZGl1cy4KKyAgICBJTUFRX0FOTlVMVVNfU1RBUlRfU1RPUCAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAvL1NlYXJjaGVzIHRoZSBST0kgZnJvbSBzdGFydCBhbmdsZSB0byBlbmQgYW5nbGUuCisgICAgSU1BUV9BTk5VTFVTX1NUT1BfU1RBUlQgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgLy9TZWFyY2hlcyB0aGUgUk9JIGZyb20gZW5kIGFuZ2xlIHRvIHN0YXJ0IGFuZ2xlLgorICAgIElNQVFfRVhUUkFDVF9DT05UT1VSX0RJUkVDVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBFeHRyYWN0Q29udG91ckRpcmVjdGlvbjsKKwordHlwZWRlZiBlbnVtIEVkZ2VQb2xhcml0eVNlYXJjaE1vZGVfZW51bSB7CisgICAgSU1BUV9TRUFSQ0hfRk9SX0FMTF9FREdFUyAgICAgICAgICA9IDAsICAgICAgICAgICAvL1NlYXJjaGVzIGZvciBhbGwgZWRnZXMuCisgICAgSU1BUV9TRUFSQ0hfRk9SX1JJU0lOR19FREdFUyAgICAgICA9IDEsICAgICAgICAgICAvL1NlYXJjaGVzIGZvciByaXNpbmcgZWRnZXMgb25seS4KKyAgICBJTUFRX1NFQVJDSF9GT1JfRkFMTElOR19FREdFUyAgICAgID0gMiwgICAgICAgICAgIC8vU2VhcmNoZXMgZm9yIGZhbGxpbmcgZWRnZXMgb25seS4KKyAgICBJTUFRX0VER0VfUE9MQVJJVFlfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBFZGdlUG9sYXJpdHlTZWFyY2hNb2RlOworCit0eXBlZGVmIGVudW0gQ29ubmVjdGl2aXR5X2VudW0geworICAgIElNQVFfRk9VUl9DT05ORUNURUQgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9Nb3JwaG9sb2dpY2FsIHJlY29uc3RydWN0aW9uIGlzIHBlcmZvcm1lZCBpbiBjb25uZWN0aXZpdHkgbW9kZSA0LgorICAgIElNQVFfRUlHSFRfQ09OTkVDVEVEICAgICAgICAgPSAxLCAgICAgICAgICAgLy9Nb3JwaG9sb2dpY2FsIHJlY29uc3RydWN0aW9uIGlzIHBlcmZvcm1lZCBpbiBjb25uZWN0aXZpdHkgbW9kZSA4LgorICAgIElNQVFfQ09OTkVDVElWSVRZX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IENvbm5lY3Rpdml0eTsKKwordHlwZWRlZiBlbnVtIE1vcnBob2xvZ3lSZWNvbnN0cnVjdE9wZXJhdGlvbl9lbnVtIHsKKyAgICBJTUFRX0RJTEFURV9SRUNPTlNUUlVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9QZXJmb3JtcyBSZWNvbnN0cnVjdGlvbiBieSBkaWxhdGlvbi4KKyAgICBJTUFRX0VST0RFX1JFQ09OU1RSVUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9QZXJmb3JtcyBSZWNvbnN0cnVjdGlvbiBieSBlcm9zaW9uLgorICAgIElNQVFfTU9SUEhPTE9HWV9SRUNPTlNUUlVDVF9PUEVSQVRJT05fU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTW9ycGhvbG9neVJlY29uc3RydWN0T3BlcmF0aW9uOworCit0eXBlZGVmIGVudW0gV2F2ZWxldFR5cGVfZW51bSB7CisgICAgSU1BUV9EQjAyICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAKKyAgICBJTUFRX0RCMDMgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIAorICAgIElNQVFfREIwNCAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFdhdmVsZXQgVHlwZSBhcyBEQjAyLgorICAgIElNQVFfREIwNSAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgCisgICAgSU1BUV9EQjA2ICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAKKyAgICBJTUFRX0RCMDcgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIAorICAgIElNQVFfREIwOCAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgCisgICAgSU1BUV9EQjA5ICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAKKyAgICBJTUFRX0RCMTAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgIAorICAgIElNQVFfREIxMSAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgCisgICAgSU1BUV9EQjEyICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAKKyAgICBJTUFRX0RCMTMgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgIAorICAgIElNQVFfREIxNCAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgCisgICAgSU1BUV9IQUFSICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAKKyAgICBJTUFRX0JJT1IxXzMgICAgICAgICAgICAgID0gMTQsICAgICAgICAgIAorICAgIElNQVFfQklPUjFfNSAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgCisgICAgSU1BUV9CSU9SMl8yICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAKKyAgICBJTUFRX0JJT1IyXzQgICAgICAgICAgICAgID0gMTcsICAgICAgICAgIAorICAgIElNQVFfQklPUjJfNiAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgCisgICAgSU1BUV9CSU9SMl84ICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAKKyAgICBJTUFRX0JJT1IzXzEgICAgICAgICAgICAgID0gMjAsICAgICAgICAgIAorICAgIElNQVFfQklPUjNfMyAgICAgICAgICAgICAgPSAyMSwgICAgICAgICAgCisgICAgSU1BUV9CSU9SM181ICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAKKyAgICBJTUFRX0JJT1IzXzcgICAgICAgICAgICAgID0gMjMsICAgICAgICAgIAorICAgIElNQVFfQklPUjNfOSAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgCisgICAgSU1BUV9CSU9SNF80ICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAKKyAgICBJTUFRX0NPSUYxICAgICAgICAgICAgICAgID0gMjYsICAgICAgICAgIAorICAgIElNQVFfQ09JRjIgICAgICAgICAgICAgICAgPSAyNywgICAgICAgICAgCisgICAgSU1BUV9DT0lGMyAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAgICAKKyAgICBJTUFRX0NPSUY0ICAgICAgICAgICAgICAgID0gMjksICAgICAgICAgIAorICAgIElNQVFfQ09JRjUgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgCisgICAgSU1BUV9TWU0yICAgICAgICAgICAgICAgICA9IDMxLCAgICAgICAgICAKKyAgICBJTUFRX1NZTTMgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgIAorICAgIElNQVFfU1lNNCAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgCisgICAgSU1BUV9TWU01ICAgICAgICAgICAgICAgICA9IDM0LCAgICAgICAgICAKKyAgICBJTUFRX1NZTTYgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgIAorICAgIElNQVFfU1lNNyAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgCisgICAgSU1BUV9TWU04ICAgICAgICAgICAgICAgICA9IDM3LCAgICAgICAgICAKKyAgICBJTUFRX0JJT1I1XzUgICAgICAgICAgICAgID0gMzgsICAgICAgICAgIAorICAgIElNQVFfQklPUjZfOCAgICAgICAgICAgICAgPSAzOSwgICAgICAgICAgCisgICAgSU1BUV9XQVZFX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gV2F2ZWxldFR5cGU7CisKK3R5cGVkZWYgZW51bSBQYXJ0aWNsZUNsYXNzaWZpZXJUaHJlc2hvbGRUeXBlX2VudW0geworICAgIElNQVFfVEhSRVNIT0xEX01BTlVBTCA9IDAsICAvL1RoZSBjbGFzc2lmaWVyIHBlcmZvcm1zIGEgbWFudWFsIHRocmVzaG9sZCBvbiB0aGUgaW1hZ2UgZHVyaW5nIHByZXByb2Nlc3NpbmcuCisgICAgSU1BUV9USFJFU0hPTERfQVVUTyAgID0gMSwgIC8vVGhlIGNsYXNzaWZpZXIgcGVyZm9ybXMgYW4gYXV0byB0aHJlc2hvbGQgb24gdGhlIGltYWdlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorICAgIElNQVFfVEhSRVNIT0xEX0xPQ0FMICA9IDIsICAvL1RoZSBjbGFzc2lmaWVyIHBlcmZvcm1zIGEgbG9jYWwgdGhyZXNob2xkIG9uIHRoZSBpbWFnZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KK30gUGFydGljbGVDbGFzc2lmaWVyVGhyZXNob2xkVHlwZTsKKwordHlwZWRlZiBlbnVtIE1lYXN1cmVQYXJ0aWNsZXNDYWxpYnJhdGlvbk1vZGVfZW51bSB7CisgICAgSU1BUV9DQUxJQlJBVElPTl9NT0RFX1BJWEVMICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdGFrZXMgb25seSBwaXhlbCBtZWFzdXJlbWVudHMgb24gdGhlIHBhcnRpY2xlcyBpbiB0aGUgaW1hZ2UuCisgICAgSU1BUV9DQUxJQlJBVElPTl9NT0RFX0NBTElCUkFURUQgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdGFrZXMgb25seSBjYWxpYnJhdGVkIG1lYXN1cmVtZW50cyBvbiB0aGUgcGFydGljbGVzIGluIHRoZSBpbWFnZS4KKyAgICBJTUFRX0NBTElCUkFUSU9OX01PREVfQk9USCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB0YWtlcyBib3RoIHBpeGVsIGFuZCBjYWxpYnJhdGVkIG1lYXN1cmVtZW50cyBvbiB0aGUgcGFydGljbGVzIGluIHRoZSBpbWFnZS4KKyAgICBJTUFRX01FQVNVUkVfUEFSVElDTEVTX0NBTElCUkFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gTWVhc3VyZVBhcnRpY2xlc0NhbGlicmF0aW9uTW9kZTsKKwordHlwZWRlZiBlbnVtIEdlb21ldHJpY01hdGNoaW5nU2VhcmNoU3RyYXRlZ3lfZW51bSB7CisgICAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hJTkdfQ09OU0VSVkFUSVZFICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9JbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIHVzZSB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UgYXQgdGhlIGV4cGVuc2Ugb2Ygc2xvd2luZyBkb3duIHRoZSBzcGVlZCBvZiB0aGUgYWxnb3JpdGhtLgorICAgIElNQVFfR0VPTUVUUklDX01BVENISU5HX0JBTEFOQ0VEICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vSW5zdHJ1Y3RzIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFsZ29yaXRobSB0byBiYWxhbmNlIHRoZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UgaXQgdXNlcyB3aXRoIHRoZSBzcGVlZCBvZiB0aGUgYWxnb3JpdGhtLgorICAgIElNQVFfR0VPTUVUUklDX01BVENISU5HX0FHR1JFU1NJVkUgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vSW5zdHJ1Y3RzIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFsZ29yaXRobSB0byB1c2UgYSBsb3dlciBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UsIHdoaWNoIGFsbG93cyB0aGUgYWxnb3JpdGhtIHRvIHJ1biBxdWlja2x5IGJ1dCBhdCB0aGUgZXhwZW5zZSBvZiBhY2N1cmFjeS4KKyAgICBJTUFRX0dFT01FVFJJQ19NQVRDSElOR19TRUFSQ0hfU1RSQVRFR1lfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gR2VvbWV0cmljTWF0Y2hpbmdTZWFyY2hTdHJhdGVneTsKKwordHlwZWRlZiBlbnVtIENvbG9yQ2xhc3NpZmljYXRpb25SZXNvbHV0aW9uX2VudW0geworICAgIElNQVFfQ0xBU1NJRklFUl9MT1dfUkVTT0xVVElPTiAgICAgICAgPSAwLCAgICAgICAgICAgLy9Mb3cgcmVzb2x1dGlvbiB2ZXJzaW9uIG9mIHRoZSBjb2xvciBjbGFzc2lmaWVyLgorICAgIElNQVFfQ0xBU1NJRklFUl9NRURJVU1fUkVTT0xVVElPTiAgICAgPSAxLCAgICAgICAgICAgLy9NZWRpdW0gcmVzb2x1dGlvbiB2ZXJzaW9uIG9mIHRoZSBjb2xvciBjbGFzc2lmaWVyLgorICAgIElNQVFfQ0xBU1NJRklFUl9ISUdIX1JFU09MVVRJT04gICAgICAgPSAyLCAgICAgICAgICAgLy9IaWdoIHJlc29sdXRpb24gdmVyc2lvbiBvZiB0aGUgY29sb3IgY2xhc3NpZmllci4KKyAgICBJTUFRX0NMQVNTSUZJRVJfUkVTT0xVVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb2xvckNsYXNzaWZpY2F0aW9uUmVzb2x1dGlvbjsKKwordHlwZWRlZiBlbnVtIENvbm5lY3Rpb25Db25zdHJhaW50VHlwZV9lbnVtIHsKKyAgICBJTUFRX0RJU1RBTkNFX0NPTlNUUkFJTlQgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCB3aXRoaW4gd2hpY2ggdGhlIGVuZCBwb2ludHMgb2YgdHdvIGN1cnZlcyBtdXN0IGxpZSBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBjb250b3VyLgorICAgIElNQVFfQU5HTEVfQ09OU1RSQUlOVCAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHJhbmdlLCBpbiBkZWdyZWVzLCB3aXRoaW4gd2hpY2ggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYW5nbGUgb2YgdHdvIGN1cnZlcywgbWVhc3VyZWQgYXQgdGhlIGVuZCBwb2ludHMsIG11c3QgbGllIGluIG9yZGVyIGZvciB0aGUgdHdvIGN1cnZlcyB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBjb250b3VyLgorICAgIElNQVFfQ09OTkVDVElWSVRZX0NPTlNUUkFJTlQgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHdpdGhpbiB3aGljaCBhIGxpbmUgZXh0ZW5kZWQgZnJvbSB0aGUgZW5kIHBvaW50IG9mIGEgY3VydmUgbXVzdCBwYXNzIHRoZSBlbmQgcG9pbnQgb2YgYW5vdGhlciBjdXJ2ZSBpbiBvcmRlciBmb3IgdGhlIHR3byBjdXJ2ZXMgdG8gYmUgY29uc2lkZXJlZCBwYXJ0IG9mIGEgY29udG91ci4KKyAgICBJTUFRX0dSQURJRU5UX0NPTlNUUkFJTlQgICAgICAgICAgICAgID0gMywgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSByYW5nZSwgaW4gZGVncmVlcywgd2l0aGluIHdoaWNoIHRoZSBncmFkaWVudCBhbmdsZXMgb2YgdHdvIGN1cnZlcywgbWVhc3VyZWQgYXQgdGhlIGVuZCBwb2ludHMsIG11c3QgbGllIGluIG9yZGVyIGZvciB0aGUgdHdvIGN1cnZlcyB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBjb250b3VyLgorICAgIElNQVFfTlVNX0NPTk5FQ1RJT05fQ09OU1RSQUlOVF9UWVBFUyAgPSA0LCAgICAgICAgICAgLy8uCisgICAgSU1BUV9DT05ORUNUSU9OX0NPTlNUUkFJTlRfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQ29ubmVjdGlvbkNvbnN0cmFpbnRUeXBlOworCit0eXBlZGVmIGVudW0gQmFyY29kZTJEQ29udHJhc3RfZW51bSB7CisgICAgSU1BUV9BTExfQkFSQ09ERV8yRF9DT05UUkFTVFMgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGJhcmNvZGVzIG9mIGVhY2ggY29udHJhc3QgdHlwZS4KKyAgICBJTUFRX0JMQUNLX09OX1dISVRFX0JBUkNPREVfMkQgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgMkQgYmFyY29kZXMgY29udGFpbmluZyBibGFjayBkYXRhIG9uIGEgd2hpdGUgYmFja2dyb3VuZC4KKyAgICBJTUFRX1dISVRFX09OX0JMQUNLX0JBUkNPREVfMkQgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgMkQgYmFyY29kZXMgY29udGFpbmluZyB3aGl0ZSBkYXRhIG9uIGEgYmxhY2sgYmFja2dyb3VuZC4KKyAgICBJTUFRX0JBUkNPREVfMkRfQ09OVFJBU1RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQmFyY29kZTJEQ29udHJhc3Q7CisKK3R5cGVkZWYgZW51bSBRUk1vZGVsVHlwZV9lbnVtIHsKKyAgICBJTUFRX1FSX01PREVMVFlQRV9BVVRPX0RFVEVDVCA9IDAsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGF1dG8tZGV0ZWN0IHRoZSB0eXBlIG9mIFFSIGNvZGUuCisgICAgSU1BUV9RUl9NT0RFTFRZUEVfTUlDUk8gICAgICAgPSAxLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFFSIGNvZGUgaXMgb2YgYSBtaWNybyB0eXBlLgorICAgIElNQVFfUVJfTU9ERUxUWVBFX01PREVMMSAgICAgID0gMiwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBRUiBjb2RlIGlzIG9mIGEgbW9kZWwxIHR5cGUuCisgICAgSU1BUV9RUl9NT0RFTFRZUEVfTU9ERUwyICAgICAgPSAzLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFFSIGNvZGUgaXMgb2YgYSBtb2RlbDIgdHlwZS4KKyAgICBJTUFRX1FSX01PREVMX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUVJNb2RlbFR5cGU7CisKK3R5cGVkZWYgZW51bSBXaW5kb3dCYWNrZ3JvdW5kRmlsbFN0eWxlX2VudW0geworICAgIElNQVFfRklMTF9TVFlMRV9TT0xJRCAgICAgID0gMCwgICAgICAgICAgIC8vRmlsbCB0aGUgZGlzcGxheSB3aW5kb3cgd2l0aCBhIHNvbGlkIGNvbG9yLgorICAgIElNQVFfRklMTF9TVFlMRV9IQVRDSCAgICAgID0gMiwgICAgICAgICAgIC8vRmlsbCB0aGUgZGlzcGxheSB3aW5kb3cgd2l0aCBhIHBhdHRlcm4gZGVmaW5lZCBieSBXaW5kb3dCYWNrZ3JvdW5kSGF0Y2hTdHlsZS4KKyAgICBJTUFRX0ZJTExfU1RZTEVfREVGQVVMVCAgICA9IDMsICAgICAgICAgICAvL0ZpbGwgdGhlIGRpc3BsYXkgd2luZG93IHdpdGggdGhlIE5JIFZpc2lvbiBkZWZhdWx0IHBhdHRlcm4uCisgICAgSU1BUV9GSUxMX1NUWUxFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IFdpbmRvd0JhY2tncm91bmRGaWxsU3R5bGU7CisKK3R5cGVkZWYgZW51bSBFeHRyYWN0aW9uTW9kZV9lbnVtIHsKKyAgICBJTUFRX05PUk1BTF9JTUFHRSAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIG1ha2VzIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSB1bmlmb3JtaXR5IG9mIG9iamVjdHMgaW4gdGhlIGltYWdlIG9yIHRoZSBpbWFnZSBiYWNrZ3JvdW5kLgorICAgIElNQVFfVU5JRk9STV9SRUdJT05TICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGVpdGhlciB0aGUgb2JqZWN0cyBpbiB0aGUgaW1hZ2Ugb3IgdGhlIGltYWdlIGJhY2tncm91bmQgY29uc2lzdHMgb2YgdW5pZm9ybSBwaXhlbCB2YWx1ZXMuCisgICAgSU1BUV9FWFRSQUNUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRXh0cmFjdGlvbk1vZGU7CisKK3R5cGVkZWYgZW51bSBFZGdlRmlsdGVyU2l6ZV9lbnVtIHsKKyAgICBJTUFRX0ZJTkUgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzIGEgZmluZSAobmFycm93KSBlZGdlIGZpbHRlci4KKyAgICBJTUFRX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzIGEgbm9ybWFsIGVkZ2UgZmlsdGVyLgorICAgIElNQVFfQ09OVE9VUl9UUkFDSU5HICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vU2V0cyB0aGUgRWRnZSBGaWx0ZXIgU2l6ZSB0byBjb250b3VyIHRyYWNpbmcsIHdoaWNoIHByb3ZpZGVzIHRoZSBiZXN0IHJlc3VsdHMgZm9yIGNvbnRvdXIgZXh0cmFjdGlvbiBidXQgaW5jcmVhc2VzIHRoZSB0aW1lIHJlcXVpcmVkIHRvIHByb2Nlc3MgdGhlIGltYWdlLgorICAgIElNQVFfRURHRV9GSUxURVJfU0laRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBFZGdlRmlsdGVyU2l6ZTsKKwordHlwZWRlZiBlbnVtIEJhcmNvZGUyRFNlYXJjaE1vZGVfZW51bSB7CisgICAgSU1BUV9TRUFSQ0hfTVVMVElQTEUgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIG11bHRpcGxlIDJEIGJhcmNvZGVzLgorICAgIElNQVFfU0VBUkNIX1NJTkdMRV9DT05TRVJWQVRJVkUgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciAyRCBiYXJjb2RlcyB1c2luZyB0aGUgc2FtZSBzZWFyY2hpbmcgYWxnb3JpdGhtIGFzIElNQVFfU0VBUkNIX01VTFRJUExFIGJ1dCBzdG9wcyBzZWFyY2hpbmcgYWZ0ZXIgbG9jYXRpbmcgb25lIHZhbGlkIGJhcmNvZGUuCisgICAgSU1BUV9TRUFSQ0hfU0lOR0xFX0FHR1JFU1NJVkUgICAgICAgICAgPSAyLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGEgc2luZ2xlIDJEIGJhcmNvZGUgdXNpbmcgYSBtZXRob2QgdGhhdCBhc3N1bWVzIHRoZSBiYXJjb2RlIG9jY3VwaWVzIGEgbWFqb3JpdHkgb2YgdGhlIHNlYXJjaCByZWdpb24uCisgICAgSU1BUV9CQVJDT0RFXzJEX1NFQVJDSF9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEJhcmNvZGUyRFNlYXJjaE1vZGU7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4U3VidHlwZV9lbnVtIHsKKyAgICBJTUFRX0FMTF9EQVRBX01BVFJJWF9TVUJUWVBFUyAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgRGF0YSBNYXRyaXggYmFyY29kZXMgb2YgYWxsIHN1YnR5cGVzLgorICAgIElNQVFfREFUQV9NQVRSSVhfU1VCVFlQRVNfRUNDXzAwMF9FQ0NfMTQwID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBzdWJ0eXBlcyBFQ0MgMDAwLCBFQ0MgMDUwLCBFQ0MgMDgwLCBFQ0MgMTAwIGFuZCBFQ0MgMTQwLgorICAgIElNQVFfREFUQV9NQVRSSVhfU1VCVFlQRV9FQ0NfMjAwICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBEYXRhIE1hdHJpeCBFQ0MgMjAwIGJhcmNvZGVzLgorICAgIElNQVFfREFUQV9NQVRSSVhfU1VCVFlQRV9TSVpFX0dVQVJEICAgICAgID0gMHhGRkZGRkZGRiAgIAorfSBEYXRhTWF0cml4U3VidHlwZTsKKwordHlwZWRlZiBlbnVtIEZlYXR1cmVUeXBlX2VudW0geworICAgIElNQVFfTk9UX0ZPVU5EX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgbm90IGZvdW5kLgorICAgIElNQVFfQ0lSQ0xFX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBjaXJjbGUuCisgICAgSU1BUV9FTExJUFNFX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhbiBlbGxpcHNlLgorICAgIElNQVFfQ09OU1RfQ1VSVkVfRkVBVFVSRSAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmVzIGlzIGEgY29uc3RhbnQgY3VydmUuCisgICAgSU1BUV9SRUNUQU5HTEVfRkVBVFVSRSAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhIHJlY3RhbmdsZS4KKyAgICBJTUFRX0xFR19GRUFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIGEgbGVnLgorICAgIElNQVFfQ09STkVSX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBjb3JuZXIuCisgICAgSU1BUV9QQVJBTExFTF9MSU5FX1BBSVJfRkVBVFVSRSAgICAgICAgICA9IDcsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhIHBhcmFsbGVsIGxpbmUgcGFpci4KKyAgICBJTUFRX1BBSVJfT0ZfUEFSQUxMRUxfTElORV9QQUlSU19GRUFUVVJFID0gOCwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIGEgcGFpciBvZiBwYXJhbGxlbCBsaW5lIHBhaXJzLgorICAgIElNQVFfTElORV9GRUFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBsaW5lLgorICAgIElNQVFfQ0xPU0VEX0NVUlZFX0ZFQVRVUkUgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBjbG9zZWQgY3VydmUuCisgICAgSU1BUV9GRUFUVVJFX1RZUEVfU0laRV9HVUFSRCAgICAgICAgICAgICA9IDB4RkZGRkZGRkYgICAKK30gRmVhdHVyZVR5cGU7CisKK3R5cGVkZWYgZW51bSBCYXJjb2RlMkRDZWxsU2hhcGVfZW51bSB7CisgICAgSU1BUV9TUVVBUkVfQ0VMTFMgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIGFuIGFsZ29yaXRobSBmb3IgZGVjb2RpbmcgdGhlIDJEIGJhcmNvZGUgdGhhdCB3b3JrcyB3aXRoIHNxdWFyZSBkYXRhIGNlbGxzLgorICAgIElNQVFfUk9VTkRfQ0VMTFMgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhbiBhbGdvcml0aG0gZm9yIGRlY29kaW5nIHRoZSAyRCBiYXJjb2RlIHRoYXQgd29ya3Mgd2l0aCByb3VuZCBkYXRhIGNlbGxzLgorICAgIElNQVFfQkFSQ09ERV8yRF9DRUxMX1NIQVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IEJhcmNvZGUyRENlbGxTaGFwZTsKKwordHlwZWRlZiBlbnVtIExvY2FsVGhyZXNob2xkTWV0aG9kX2VudW0geworICAgIElNQVFfTklCTEFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGNvbXB1dGVzIHRocmVzaG9sZHMgZm9yIGVhY2ggcGl4ZWwgYmFzZWQgb24gaXRzIGxvY2FsIHN0YXRpc3RpY3MgdXNpbmcgdGhlIE5pYmxhY2sgbG9jYWwgdGhyZXNob2xkaW5nIGFsZ29yaXRobS4KKyAgICBJTUFRX0JBQ0tHUk9VTkRfQ09SUkVDVElPTiAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBwZXJmb3JtcyBiYWNrZ3JvdW5kIGNvcnJlY3Rpb24gZmlyc3QgdG8gZWxpbWluYXRlIG5vbi11bmlmb3JtIGxpZ2h0aW5nIGVmZmVjdHMsIHRoZW4gcGVyZm9ybXMgdGhyZXNob2xkaW5nIHVzaW5nIHRoZSBPdHN1IHRocmVzaG9sZGluZyBhbGdvcml0aG0uCisgICAgSU1BUV9MT0NBTF9USFJFU0hPTERfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IExvY2FsVGhyZXNob2xkTWV0aG9kOworCit0eXBlZGVmIGVudW0gQmFyY29kZTJEVHlwZV9lbnVtIHsKKyAgICBJTUFRX1BERjQxNyAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIDJEIGJhcmNvZGUgaXMgb2YgdHlwZSBQREY0MTcuCisgICAgSU1BUV9EQVRBX01BVFJJWF9FQ0NfMDAwICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSAyRCBiYXJjb2RlIGlzIG9mIHR5cGUgRGF0YSBNYXRyaXggRUNDIDAwMC4KKyAgICBJTUFRX0RBVEFfTUFUUklYX0VDQ18wNTAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIDJEIGJhcmNvZGUgaXMgb2YgdHlwZSBEYXRhIE1hdHJpeCBFQ0MgMDUwLgorICAgIElNQVFfREFUQV9NQVRSSVhfRUNDXzA4MCAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgMkQgYmFyY29kZSBpcyBvZiB0eXBlIERhdGEgTWF0cml4IEVDQyAwODAuCisgICAgSU1BUV9EQVRBX01BVFJJWF9FQ0NfMTAwICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSAyRCBiYXJjb2RlIGlzIG9mIHR5cGUgRGF0YSBNYXRyaXggRUNDIDEwMC4KKyAgICBJTUFRX0RBVEFfTUFUUklYX0VDQ18xNDAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIDJEIGJhcmNvZGUgaXMgb2YgdHlwZSBEYXRhIE1hdHJpeCBFQ0MgMTQwLgorICAgIElNQVFfREFUQV9NQVRSSVhfRUNDXzIwMCAgICAgICAgPSA2LCAgICAgICAgICAgLy9UaGUgMkQgYmFyY29kZSBpcyBvZiB0eXBlIERhdGEgTWF0cml4IEVDQyAyMDAuCisgICAgSU1BUV9CQVJDT0RFXzJEX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQmFyY29kZTJEVHlwZTsKKwordHlwZWRlZiBlbnVtIENsYXNzaWZpZXJFbmdpbmVUeXBlX2VudW0geworICAgIElNQVFfRU5HSU5FX05PTkUgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vTm8gZW5naW5lIGhhcyBiZWVuIHNldCBvbiB0aGlzIGNsYXNzaWZpZXIgc2Vzc2lvbi4KKyAgICBJTUFRX0VOR0lORV9ORUFSRVNUX05FSUdIQk9SICAgICAgICAgICA9IDEsICAgICAgICAgICAvL05lYXJlc3QgbmVpZ2hib3IgZW5naW5lLgorICAgIElNQVFfRU5HSU5FX1NVUFBPUlRfVkVDVE9SX01BQ0hJTkUgICAgID0gMiwgICAgICAgICAgIAorICAgIElNQVFfQ0xBU1NJRklFUl9FTkdJTkVfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDbGFzc2lmaWVyRW5naW5lVHlwZTsKKwordHlwZWRlZiBlbnVtIENsYXNzaWZpZXJUeXBlX2VudW0geworICAgIElNQVFfQ0xBU1NJRklFUl9DVVNUT00gICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgY2xhc3NpZmllciBzZXNzaW9uIGNsYXNzaWZpZXMgdmVjdG9ycyBvZiBkb3VibGVzLgorICAgIElNQVFfQ0xBU1NJRklFUl9QQVJUSUNMRSAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgY2xhc3NpZmllciBzZXNzaW9uIGNsYXNzaWZpZXMgcGFydGljbGVzIGluIGJpbmFyeSBpbWFnZXMuCisgICAgSU1BUV9DTEFTU0lGSUVSX0NPTE9SICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBjbGFzc2lmaWVyIHNlc3Npb24gY2xhc3NpZmllcyBhbiBpbWFnZSBiYXNlZCBvbiBpdHMgY29sb3IuCisgICAgSU1BUV9DTEFTU0lGSUVSX1RFWFRVUkUgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBjbGFzc2lmaWVyIHNlc3Npb24gY2xhc3NpZmllcyBhbiBpbWFnZSBiYXNlZCBvbiBpdHMgdGV4dHVyZS4KKyAgICBJTUFRX0NMQVNTSUZJRVJfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDbGFzc2lmaWVyVHlwZTsKKwordHlwZWRlZiBlbnVtIFBhcnRpY2xlVHlwZV9lbnVtIHsKKyAgICBJTUFRX1BBUlRJQ0xFX0JSSUdIVCAgICAgICAgICA9IDAsICAgICAgICAgICAvL0JyaWdodCBwYXJ0aWNsZXMuCisgICAgSU1BUV9QQVJUSUNMRV9EQVJLICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9EYXJrIHBhcnRpY2xlcy4KKyAgICBJTUFRX1BBUlRJQ0xFX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gUGFydGljbGVUeXBlOworCit0eXBlZGVmIGVudW0gVmlzaW9uSW5mb1R5cGUyX2VudW0geworICAgIElNQVFfVklTSU9OSU5GT19DQUxJQlJBVElPTiAgICAgICAgPSAweDAxLCAgICAgICAgLy9Vc2VkIHRvIGluZGljYXRlIGludGVyYWN0aW9uIHdpdGggdGhlIENhbGlicmF0aW9uIGluZm9ybWF0aW9uIGluIGFuIGltYWdlLgorICAgIElNQVFfVklTSU9OSU5GT19PVkVSTEFZICAgICAgICAgICAgPSAweDAyLCAgICAgICAgLy9Vc2VkIHRvIGluZGljYXRlIGludGVyYWN0aW9uIHdpdGggdGhlIE92ZXJsYXkgaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCisgICAgSU1BUV9WSVNJT05JTkZPX0dSQVlURU1QTEFURSAgICAgICA9IDB4MDQsICAgICAgICAvL1VzZWQgdG8gaW5kaWNhdGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZ3JheXNjYWxlIHRlbXBsYXRlIGluZm9ybWF0aW9uIGluIGFuIGltYWdlLgorICAgIElNQVFfVklTSU9OSU5GT19DT0xPUlRFTVBMQVRFICAgICAgPSAweDA4LCAgICAgICAgLy9Vc2VkIHRvIGluZGljYXRlIGludGVyYWN0aW9uIHdpdGggdGhlIGNvbG9yIHRlbXBsYXRlIGluZm9ybWF0aW9uIGluIGFuIGltYWdlLgorICAgIElNQVFfVklTSU9OSU5GT19HRU9NRVRSSUNURU1QTEFURSAgPSAweDEwLCAgICAgICAgLy9Vc2VkIHRvIGluZGljYXRlIGludGVyYWN0aW9uIHdpdGggdGhlIGdlb21ldHJpYyB0ZW1wbGF0ZSBpbmZvcm1hdGlvbiBpbiBhbiBpbWFnZS4KKyAgICBJTUFRX1ZJU0lPTklORk9fQ1VTVE9NREFUQSAgICAgICAgID0gMHgyMCwgICAgICAgIC8vVXNlZCB0byBpbmRpY2F0ZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBiaW5hcnkgb3IgdGV4dCBDdXN0b20gRGF0YSBpbiBhbiBpbWFnZS4KKyAgICBJTUFRX1ZJU0lPTklORk9fR09MREVOVEVNUExBVEUgICAgID0gMHg0MCwgICAgICAgIC8vVXNlZCB0byBpbmRpY2F0ZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBnb2xkZW4gdGVtcGxhdGUgaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCisgICAgSU1BUV9WSVNJT05JTkZPX0dFT01FVFJJQ1RFTVBMQVRFMiA9IDB4ODAsICAgICAgICAvL1VzZWQgdG8gaW5kaWNhdGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZ2VvbWV0cmljIHRlbXBsYXRlIDIgaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCisgICAgSU1BUV9WSVNJT05JTkZPX0FMTCAgICAgICAgICAgICAgICA9IDB4RkZGRkZGRkYsICAvL1JlbW92ZXMsIGNoZWNrcyBmb3IsIG9yIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgYWxsIHR5cGVzIG9mIGV4dHJhIGluZm9ybWF0aW9uIGluIGFuIGltYWdlLgorfSBWaXNpb25JbmZvVHlwZTI7CisKK3R5cGVkZWYgZW51bSBSZWFkQ2xhc3NpZmllckZpbGVNb2RlX2VudW0geworICAgIElNQVFfQ0xBU1NJRklFUl9SRUFEX0FMTCAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1JlYWQgYWxsIGluZm9ybWF0aW9uIGZyb20gdGhlIGNsYXNzaWZpZXIgZmlsZS4KKyAgICBJTUFRX0NMQVNTSUZJRVJfUkVBRF9TQU1QTEVTICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9SZWFkIG9ubHkgdGhlIHNhbXBsZXMgZnJvbSB0aGUgY2xhc3NpZmllciBmaWxlLgorICAgIElNQVFfQ0xBU1NJRklFUl9SRUFEX1BST1BFUlRJRVMgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1JlYWQgb25seSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBjbGFzc2lmaWVyIGZpbGUuCisgICAgSU1BUV9SRUFEX0NMQVNTSUZJRVJfRklMRV9NT0RFU19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBSZWFkQ2xhc3NpZmllckZpbGVNb2RlOworCit0eXBlZGVmIGVudW0gV3JpdGVDbGFzc2lmaWVyRmlsZU1vZGVfZW51bSB7CisgICAgSU1BUV9DTEFTU0lGSUVSX1dSSVRFX0FMTCAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1dyaXRlcyBhbGwgaW5mb3JtYXRpb24gdG8gdGhlIGNsYXNzaWZpZXIgZmlsZS4KKyAgICBJTUFRX0NMQVNTSUZJRVJfV1JJVEVfQ0xBU1NJRllfT05MWSAgICAgICAgID0gMSwgICAgICAgICAgIC8vV3JpdGUgb25seSB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNsYXNzaWZ5IHRvIHRoZSBjbGFzc2lmaWVyIGZpbGUuCisgICAgSU1BUV9XUklURV9DTEFTU0lGSUVSX0ZJTEVfTU9ERVNfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gV3JpdGVDbGFzc2lmaWVyRmlsZU1vZGU7CisKK3R5cGVkZWYgZW51bSBCYXJjb2RlMkRTaGFwZV9lbnVtIHsKKyAgICBJTUFRX1NRVUFSRV9CQVJDT0RFXzJEICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3Igc3F1YXJlIDJEIGJhcmNvZGVzLgorICAgIElNQVFfUkVDVEFOR1VMQVJfQkFSQ09ERV8yRCAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciByZWN0YW5ndWxhciAyRCBiYXJjb2Rlcy4KKyAgICBJTUFRX0JBUkNPREVfMkRfU0hBUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gQmFyY29kZTJEU2hhcGU7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4Um90YXRpb25Nb2RlX2VudW0geworICAgIElNQVFfVU5MSU1JVEVEX1JPVEFUSU9OICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgdW5saW1pdGVkIHJvdGF0aW9uLgorICAgIElNQVFfMF9ERUdSRUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiAtNSBhbmQgNSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgIElNQVFfOTBfREVHUkVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiA4NSBhbmQgOTUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgICBJTUFRXzE4MF9ERUdSRUVTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBhbGxvd3MgZm9yIGJldHdlZW4gMTc1IGFuZCAxODUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgICBJTUFRXzI3MF9ERUdSRUVTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBhbGxvd3MgZm9yIGJldHdlZW4gMjY1IGFuZCAyNzUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgICBJTUFRX0RBVEFfTUFUUklYX1JPVEFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRGF0YU1hdHJpeFJvdGF0aW9uTW9kZTsKKwordHlwZWRlZiBlbnVtIEFJTUdyYWRlX2VudW0geworICAgIElNQVFfQUlNX0dSQURFX0YgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgRGF0YSBNYXRyaXggYmFyY29kZSByZWNlaXZlZCBhIGdyYWRlIG9mIEYuCisgICAgSU1BUV9BSU1fR1JBREVfRCAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1RoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHJlY2VpdmVkIGEgZ3JhZGUgb2YgRC4KKyAgICBJTUFRX0FJTV9HUkFERV9DICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIERhdGEgTWF0cml4IGJhcmNvZGUgcmVjZWl2ZWQgYSBncmFkZSBvZiBDLgorICAgIElNQVFfQUlNX0dSQURFX0IgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgLy9UaGUgRGF0YSBNYXRyaXggYmFyY29kZSByZWNlaXZlZCBhIGdyYWRlIG9mIEIuCisgICAgSU1BUV9BSU1fR1JBREVfQSAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAvL1RoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHJlY2VpdmVkIGEgZ3JhZGUgb2YgQS4KKyAgICBJTUFRX0RBVEFfTUFUUklYX0FJTV9HUkFERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBBSU1HcmFkZTsKKwordHlwZWRlZiBlbnVtIERhdGFNYXRyaXhDZWxsRmlsbE1vZGVfZW51bSB7CisgICAgSU1BUV9BVVRPX0RFVEVDVF9DRUxMX0ZJTExfTU9ERSAgICAgICAgICAgID0gLTIsICAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGNlbGwgZmlsbCBwZXJjZW50YWdlIGF1dG9tYXRpY2FsbHkuCisgICAgSU1BUV9MT1dfRklMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyB3aXRoIGEgY2VsbCBmaWxsIHBlcmNlbnRhZ2Ugb2YgbGVzcyB0aGFuIDMwIHBlcmNlbnQuCisgICAgSU1BUV9OT1JNQUxfRklMTCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyB3aXRoIGEgY2VsbCBmaWxsIHBlcmNlbnRhZ2UgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMwIHBlcmNlbnQuCisgICAgSU1BUV9EQVRBX01BVFJJWF9DRUxMX0ZJTExfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBEYXRhTWF0cml4Q2VsbEZpbGxNb2RlOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeERlbW9kdWxhdGlvbk1vZGVfZW51bSB7CisgICAgSU1BUV9BVVRPX0RFVEVDVF9ERU1PRFVMQVRJT05fTU9ERSAgICAgICAgICAgID0gLTIsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGVhY2ggZGVtb2R1bGF0aW9uIG1vZGUgYW5kIHVzZSB0aGUgb25lIHdoaWNoIGRlY29kZXMgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQgdXRpbGl6aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgICBJTUFRX0hJU1RPR1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gdXNlcyBhIGhpc3RvZ3JhbSBvZiBhbGwgb2YgdGhlIERhdGEgTWF0cml4IGNlbGxzIHRvIGNhbGN1bGF0ZSBhIHRocmVzaG9sZC4KKyAgICBJTUFRX0xPQ0FMX0NPTlRSQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZXhhbWluZXMgZWFjaCBvZiB0aGUgY2VsbCdzIG5laWdoYm9ycyB0byBkZXRlcm1pbmUgaWYgdGhlIGNlbGwgaXMgb24gb3Igb2ZmLgorICAgIElNQVFfQ09NQklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB1c2VzIHRoZSBoaXN0b2dyYW0gb2YgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgdG8gY2FsY3VsYXRlIGEgdGhyZXNob2xkLgorICAgIElNQVFfQUxMX0RFTU9EVUxBVElPTl9NT0RFUyAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB0cmllcyBJTUFRX0hJU1RPR1JBTSwgdGhlbiBJTUFRX0xPQ0FMX0NPTlRSQVNUIGFuZCB0aGVuIElNQVFfQ09NQklOQVRJT04sIHN0b3BwaW5nIG9uY2Ugb25lIG1vZGUgaXMgc3VjY2Vzc2Z1bC4KKyAgICBJTUFRX0RBVEFfTUFUUklYX0RFTU9EVUxBVElPTl9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IERhdGFNYXRyaXhEZW1vZHVsYXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeEVDQ19lbnVtIHsKKyAgICBJTUFRX0FVVE9fREVURUNUX0VDQyAgICAgICAgICAgID0gLTIsICAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIEVDQyBhdXRvbWF0aWNhbGx5LgorICAgIElNQVFfRUNDXzAwMCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIEVDQyAwMDAgb25seS4KKyAgICBJTUFRX0VDQ18wNTAgICAgICAgICAgICAgICAgICAgID0gNTAsICAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBFQ0MgMDUwIG9ubHkuCisgICAgSU1BUV9FQ0NfMDgwICAgICAgICAgICAgICAgICAgICA9IDgwLCAgICAgICAgICAvL1NldHMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgRGF0YSBNYXRyaXggYmFyY29kZXMgb2YgRUNDIDA4MCBvbmx5LgorICAgIElNQVFfRUNDXzEwMCAgICAgICAgICAgICAgICAgICAgPSAxMDAsICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIEVDQyAxMDAgb25seS4KKyAgICBJTUFRX0VDQ18xNDAgICAgICAgICAgICAgICAgICAgID0gMTQwLCAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBFQ0MgMTQwIG9ubHkuCisgICAgSU1BUV9FQ0NfMDAwXzE0MCAgICAgICAgICAgICAgICA9IDE5MCwgICAgICAgICAvL1NldHMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgRGF0YSBNYXRyaXggYmFyY29kZXMgb2YgRUNDIDAwMCwgRUNDIDA1MCwgRUNDIDA4MCwgRUNDIDEwMCwgYW5kIEVDQyAxNDAgb25seS4KKyAgICBJTUFRX0VDQ18yMDAgICAgICAgICAgICAgICAgICAgID0gMjAwLCAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBFQ0MgMjAwIG9ubHkuCisgICAgSU1BUV9EQVRBX01BVFJJWF9FQ0NfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRGF0YU1hdHJpeEVDQzsKKwordHlwZWRlZiBlbnVtIERhdGFNYXRyaXhQb2xhcml0eV9lbnVtIHsKKyAgICBJTUFRX0FVVE9fREVURUNUX1BPTEFSSVRZICAgICAgICAgICAgPSAtMiwgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgcG9sYXJpdHkgYXV0b21hdGljYWxseS4KKyAgICBJTUFRX0JMQUNLX0RBVEFfT05fV0hJVEVfQkFDS0dST1VORCAgPSAwLCAgICAgICAgICAgLy9TZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIHdpdGggZGFyayBkYXRhIG9uIGEgYnJpZ2h0IGJhY2tncm91bmQuCisgICAgSU1BUV9XSElURV9EQVRBX09OX0JMQUNLX0JBQ0tHUk9VTkQgID0gMSwgICAgICAgICAgIC8vU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyB3aXRoIGJyaWdodCBkYXRhIG9uIGEgZGFyayBiYWNrZ3JvdW5kLgorICAgIElNQVFfREFUQV9NQVRSSVhfUE9MQVJJVFlfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gRGF0YU1hdHJpeFBvbGFyaXR5OworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeENlbGxGaWx0ZXJNb2RlX2VudW0geworICAgIElNQVFfQVVUT19ERVRFQ1RfQ0VMTF9GSUxURVJfTU9ERSAgICAgICAgICAgID0gLTIsICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGFsbCBmaWx0ZXIgbW9kZXMgYW5kIHVzZXMgdGhlIG9uZSB0aGF0IGRlY29kZXMgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQgdXRpbGl6aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgICBJTUFRX0FWRVJBR0VfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2Ugb2YgdGhlIHNhbXBsZWQgcGl4ZWxzLgorICAgIElNQVFfTUVESUFOX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgbWVkaWFuIG9mIHRoZSBzYW1wbGVkIHBpeGVscy4KKyAgICBJTUFRX0NFTlRSQUxfQVZFUkFHRV9GSUxURVIgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2Ugb2YgdGhlIHBpeGVscyBpbiB0aGUgY2VudGVyIG9mIHRoZSBjZWxsIHNhbXBsZS4KKyAgICBJTUFRX0hJR0hfQVZFUkFHRV9GSUxURVIgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGhhbGYgb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGhpZ2hlc3QgcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfTE9XX0FWRVJBR0VfRklMVEVSICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgaGFsZiBvZiB0aGUgc2FtcGxlZCBwaXhlbHMgd2l0aCB0aGUgbG93ZXN0IHBpeGVsIHZhbHVlcy4KKyAgICBJTUFRX1ZFUllfSElHSF9BVkVSQUdFX0ZJTFRFUiAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIG5pbnRoIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBoaWdoZXN0IHBpeGVsIHZhbHVlcy4KKyAgICBJTUFRX1ZFUllfTE9XX0FWRVJBR0VfRklMVEVSICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIG5pbnRoIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBsb3dlc3QgcGl4ZWwgdmFsdWVzLgorICAgIElNQVFfQUxMX0NFTExfRklMVEVSUyAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHRyaWVzIGVhY2ggZmlsdGVyIG1vZGUsIHN0YXJ0aW5nIHdpdGggSU1BUV9BVkVSQUdFX0ZJTFRFUiBhbmQgZW5kaW5nIHdpdGggSU1BUV9WRVJZX0xPV19BVkVSQUdFX0ZJTFRFUiwgc3RvcHBpbmcgb25jZSBhIGZpbHRlciBtb2RlIGRlY29kZXMgY29ycmVjdGx5LgorICAgIElNQVFfREFUQV9NQVRSSVhfQ0VMTF9GSUxURVJfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBEYXRhTWF0cml4Q2VsbEZpbHRlck1vZGU7CisKK3R5cGVkZWYgZW51bSBXaW5kb3dCYWNrZ3JvdW5kSGF0Y2hTdHlsZV9lbnVtIHsKKyAgICBJTUFRX0hBVENIX1NUWUxFX0hPUklaT05UQUwgICAgICAgID0gMCwgICAgICAgICAgIC8vVGhlIGJhY2tncm91bmQgb2YgdGhlIGRpc3BsYXkgd2luZG93IHdpbGwgYmUgaG9yaXpvbnRhbCBiYXJzLgorICAgIElNQVFfSEFUQ0hfU1RZTEVfVkVSVElDQUwgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgYmFja2dyb3VuZCBvZiB0aGUgZGlzcGxheSB3aW5kb3cgd2lsbCBiZSB2ZXJ0aWNhbCBiYXJzLgorICAgIElNQVFfSEFUQ0hfU1RZTEVfRk9SV0FSRF9ESUFHT05BTCAgPSAyLCAgICAgICAgICAgLy9UaGUgYmFja2dyb3VuZCBvZiB0aGUgZGlzcGxheSB3aW5kb3cgd2lsbCBiZSBkaWFnb25hbCBiYXJzLgorICAgIElNQVFfSEFUQ0hfU1RZTEVfQkFDS1dBUkRfRElBR09OQUwgPSAzLCAgICAgICAgICAgLy9UaGUgYmFja2dyb3VuZCBvZiB0aGUgZGlzcGxheSB3aW5kb3cgd2lsbCBiZSBkaWFnb25hbCBiYXJzLgorICAgIElNQVFfSEFUQ0hfU1RZTEVfQ1JPU1MgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgYmFja2dyb3VuZCBvZiB0aGUgZGlzcGxheSB3aW5kb3cgd2lsbCBiZSBpbnRlcnNlY3RpbmcgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYmFycy4KKyAgICBJTUFRX0hBVENIX1NUWUxFX0NST1NTX0hBVENIICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGJhY2tncm91bmQgb2YgdGhlIGRpc3BsYXkgd2luZG93IHdpbGwgYmUgaW50ZXJzZWN0aW5nIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpYWdvbmFsIGJhcnMuCisgICAgSU1BUV9IQVRDSF9TVFlMRV9TSVpFX0dVQVJEICAgICAgICA9IDB4RkZGRkZGRkYgICAKK30gV2luZG93QmFja2dyb3VuZEhhdGNoU3R5bGU7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4TWlycm9yTW9kZV9lbnVtIHsKKyAgICBJTUFRX0FVVE9fREVURUNUX01JUlJPUiAgICAgICAgICAgICAgICAgPSAtMiwgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGRldGVybWluZSBpZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBpcyBtaXJyb3JlZC4KKyAgICBJTUFRX0FQUEVBUlNfTk9STUFMICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGV4cGVjdCB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSB0byBhcHBlYXIgbm9ybWFsLgorICAgIElNQVFfQVBQRUFSU19NSVJST1JFRCAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgZXhwZWN0IHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHRvIGFwcGVhciBtaXJyb3JlZC4KKyAgICBJTUFRX0RBVEFfTUFUUklYX01JUlJPUl9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IERhdGFNYXRyaXhNaXJyb3JNb2RlOworCit0eXBlZGVmIGVudW0gQ2FsaWJyYXRpb25Nb2RlMl9lbnVtIHsKKyAgICBJTUFRX1BFUlNQRUNUSVZFX01PREUgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9GdW5jdGlvbnMgY29ycmVjdCBmb3IgZGlzdG9ydGlvbiBjYXVzZWQgYnkgdGhlIGNhbWVyYSdzIHBlcnNwZWN0aXZlLgorICAgIElNQVFfTUlDUk9QTEFORV9NT0RFICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL0Z1bmN0aW9ucyBjb3JyZWN0IGZvciBkaXN0b3J0aW9uIGNhdXNlZCBieSB0aGUgY2FtZXJhJ3MgbGVucy4KKyAgICBJTUFRX1NJTVBMRV9DQUxJQlJBVElPTl9NT0RFICAgICAgPSAyLCAgICAgICAgICAgLy9GdW5jdGlvbnMgZG8gbm90IGNvcnJlY3QgZm9yIGRpc3RvcnRpb24uCisgICAgSU1BUV9DT1JSRUNURURfSU1BR0VfTU9ERSAgICAgICAgID0gMywgICAgICAgICAgIC8vVGhlIGltYWdlIGlzIGFscmVhZHkgY29ycmVjdGVkLgorICAgIElNQVFfTk9fQ0FMSUJSQVRJT05fTU9ERSAgICAgICAgICA9IDQsICAgICAgICAgICAvL0ltYWdlIHdpdGggTm8gY2FsaWJyYXRpb24uCisgICAgSU1BUV9DQUxJQlJBVElPTl9NT0RFMl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDYWxpYnJhdGlvbk1vZGUyOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeEdyYWRpbmdNb2RlX2VudW0geworICAgIElNQVFfTk9fR1JBRElORyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gZG9lcyBub3QgbWFrZSBhbnkgcHJlcGFyYXRvcnkgY2FsY3VsYXRpb25zLgorICAgIElNQVFfUFJFUEFSRV9GT1JfQUlNICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIGltYWdlIGZvciBncmFkaW5nIHVzaW5nIHRoZSBBSU0gUHJpbnQgUXVhbGl0eSBtZXRyaWNzLgorICAgIElNQVFfREFUQV9NQVRSSVhfR1JBRElOR19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IERhdGFNYXRyaXhHcmFkaW5nTW9kZTsKKwordHlwZWRlZiBlbnVtIFdhdmVsZXRUcmFuc2Zvcm1Nb2RlX2VudW0geworICAgIElNQVFfV0FWRUxFVF9UUkFOU0ZPUk1fSU5URUdFUiAgICAgICAgID0gMCwgICAgICAgICAgIC8vVXNlcyBhIDUtMyByZXZlcnNpYmxlIGludGVnZXIgdHJhbnNmb3JtLgorICAgIElNQVFfV0FWRUxFVF9UUkFOU0ZPUk1fRkxPQVRJTkdfUE9JTlQgID0gMSwgICAgICAgICAgIC8vUGVyZm9ybXMgYSA5LTcgaXJyZXZlcnNpYmxlIGZsb2F0aW5nLXBvaW50IHRyYW5zZm9ybS4KKyAgICBJTUFRX1dBVkVMRVRfVFJBTlNGT1JNX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYgICAKK30gV2F2ZWxldFRyYW5zZm9ybU1vZGU7CisKK3R5cGVkZWYgZW51bSBOb3JtYWxpemF0aW9uTWV0aG9kX2VudW0geworICAgIElNQVFfTk9STUFMSVpBVElPTl9OT05FICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgLy9ObyBub3JtYWxpemF0aW9uLgorICAgIElNQVFfTk9STUFMSVpBVElPTl9ISVNUT0dSQU1fTUFUQ0hJTkcgPSAxLCAgICAgICAgICAgLy9BZGp1c3QgaW1hZ2Ugc28gaXRzIGhpc3RvZ3JhbSBpcyBzaW1pbGFyIHRvIHRoZSBnb2xkZW4gdGVtcGxhdGUncyBoaXN0b2dyYW0uCisgICAgSU1BUV9OT1JNQUxJWkFUSU9OX0FWRVJBR0VfTUFUQ0hJTkcgICA9IDIsICAgICAgICAgICAvL0FkanVzdCBpbWFnZSBzbyBpdHMgbWVhbiBwaXhlbCB2YWx1ZSBlcXVhbHMgdGhlIGdvbGRlbiB0ZW1wbGF0ZSdzIG1lYW4gcGl4ZWwgdmFsdWUuCisgICAgSU1BUV9OT1JNQUxJWkFUSU9OX1NJWkVfR1VBUkQgICAgICAgICA9IDB4RkZGRkZGRkYgICAKK30gTm9ybWFsaXphdGlvbk1ldGhvZDsKKwordHlwZWRlZiBlbnVtIFJlZ2lzdHJhdGlvbk1ldGhvZF9lbnVtIHsKKyAgICBJTUFRX1JFR0lTVFJBVElPTl9OT05FICAgICAgICA9IDAsICAgICAgICAgICAvL05vIHJlZ2lzdHJhdGlvbi4KKyAgICBJTUFRX1JFR0lTVFJBVElPTl9QRVJTUEVDVElWRSA9IDEsICAgICAgICAgICAvL0FkanVzdCBpbWFnZSB0byBjb3JyZWN0IGZvciBtaW5vciB2YXJpYXRpb25zIGluIGFsaWdubWVudCBvciBwZXJzcGVjdGl2ZS4KKyAgICBJTUFRX1JFR0lTVFJBVElPTl9TSVpFX0dVQVJEICA9IDB4RkZGRkZGRkYgICAKK30gUmVnaXN0cmF0aW9uTWV0aG9kOworCit0eXBlZGVmIGVudW0gTGluZWFyQXZlcmFnZXNNb2RlX2VudW0geworICAgIElNQVFfQ09MVU1OX0FWRVJBR0VTICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2ggY29sdW1uLgorICAgIElNQVFfUk9XX0FWRVJBR0VTICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2ggcm93LgorICAgIElNQVFfUklTSU5HX0RJQUdPTkFMX0FWRVJBR0VTICAgICAgICA9IDQsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2ggZGlhZ29uYWwgcnVubmluZyBmcm9tIHRoZSBsb3dlciBsZWZ0IHRvIHRoZSB1cHBlciByaWdodCBvZiB0aGUgaW5zcGVjdGVkIGFyZWEgb2YgdGhlIGltYWdlLgorICAgIElNQVFfRkFMTElOR19ESUFHT05BTF9BVkVSQUdFUyAgICAgICA9IDgsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2ggZGlhZ29uYWwgcnVubmluZyBmcm9tIHRoZSB1cHBlciBsZWZ0IHRvIHRoZSBsb3dlciByaWdodCBvZiB0aGUgaW5zcGVjdGVkIGFyZWEgb2YgdGhlIGltYWdlLgorICAgIElNQVFfQUxMX0xJTkVBUl9BVkVSQUdFUyAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGFsbCBmb3VyIGxpbmVhciBtZWFuIHBpeGVsIHZhbHVlcy4KKyAgICBJTUFRX0xJTkVBUl9BVkVSQUdFU19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGICAgCit9IExpbmVhckF2ZXJhZ2VzTW9kZTsKKwordHlwZWRlZiBlbnVtIENvbXByZXNzaW9uVHlwZV9lbnVtIHsKKyAgICBJTUFRX0NPTVBSRVNTSU9OX05PTkUgICAgICAgICAgICA9IDAsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgbm90IGNvbXByZXNzIHRoZSBpbWFnZS4KKyAgICBJTUFRX0NPTVBSRVNTSU9OX0pQRUcgICAgICAgICAgICA9IDEsICAgICAgICAgICAvL1NwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgdXNlIGxvc3N5IEpQRUcgY29tcHJlc3Npb24gb24gdGhlIGltYWdlLgorICAgIElNQVFfQ09NUFJFU1NJT05fUEFDS0VEX0JJTkFSWSAgID0gMiwgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCB1c2UgbG9zc2xlc3MgYmluYXJ5IHBhY2tpbmcgb24gdGhlIGltYWdlLgorICAgIElNQVFfQ09NUFJFU1NJT05fVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBDb21wcmVzc2lvblR5cGU7CisKK3R5cGVkZWYgZW51bSBGbGF0dGVuVHlwZV9lbnVtIHsKKyAgICBJTUFRX0ZMQVRURU5fSU1BR0UgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgIC8vRmxhdHRlbnMganVzdCB0aGUgaW1hZ2UgZGF0YS4KKyAgICBJTUFRX0ZMQVRURU5fSU1BR0VfQU5EX1ZJU0lPTl9JTkZPID0gMSwgICAgICAgICAgIC8vRmxhdHRlbnMgdGhlIGltYWdlIGRhdGEgYW5kIGFueSBWaXNpb24gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZS4KKyAgICBJTUFRX0ZMQVRURU5fVFlQRV9TSVpFX0dVQVJEICAgICAgID0gMHhGRkZGRkZGRiAgIAorfSBGbGF0dGVuVHlwZTsKKwordHlwZWRlZiBlbnVtIERhdGFNYXRyaXhDZWxsU2FtcGxlU2l6ZV9lbnVtIHsKKyAgICBJTUFRX0FVVE9fREVURUNUX0NFTExfU0FNUExFX1NJWkUgICAgICAgICAgICA9IC0yLCAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHRyeSBlYWNoIHNhbXBsZSBzaXplIGFuZCB1c2UgdGhlIG9uZSB3aGljaCBkZWNvZGVzIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHdpdGhpbiB0aGUgZmV3ZXN0IGl0ZXJhdGlvbnMgYW5kIHV0aWxpemluZyB0aGUgbGVhc3QgYW1vdW50IG9mIGVycm9yIGNvcnJlY3Rpb24uCisgICAgSU1BUV8xeDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSAxeDEgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfMngyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgMngyIHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRXzN4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDN4MyBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA0eDQgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfNXg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgIC8vVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgNXg1IHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgICBJTUFRXzZ4NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAvL1RoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDZ4NiBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgICAgSU1BUV83eDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgLy9UaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA3eDcgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICAgIElNQVFfREFUQV9NQVRSSVhfQ0VMTF9TQU1QTEVfU0laRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRiAgIAorfSBEYXRhTWF0cml4Q2VsbFNhbXBsZVNpemU7CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRm9yd2FyZCBEZWNsYXJlIERhdGEgU3RydWN0dXJlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIHN0cnVjdCBJbWFnZV9zdHJ1Y3QgSW1hZ2U7Cit0eXBlZGVmIHN0cnVjdCBST0lfc3RydWN0IFJPSTsKK3R5cGVkZWYgc3RydWN0IE92ZXJsYXlfc3RydWN0IE92ZXJsYXk7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVyU2Vzc2lvbl9zdHJ1Y3QgQ2xhc3NpZmllclNlc3Npb247Cit0eXBlZGVmIHN0cnVjdCBNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5fc3RydWN0IE11bHRpcGxlR2VvbWV0cmljUGF0dGVybjsKK3R5cGVkZWYgaW50IENvbnRvdXJJRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBTRVNTSU9OX0lEOwordHlwZWRlZiBpbnQJQVZJU2Vzc2lvbjsKK3R5cGVkZWYgY2hhciogRmlsdGVyTmFtZTsKK3R5cGVkZWYgY2hhciBTdHJpbmcyNTVbMjU2XTsKK3R5cGVkZWYgc3RydWN0IENoYXJTZXRfc3RydWN0IENoYXJTZXQ7Cit0eXBlZGVmIHN0cnVjdCBPQ1JTcGFjaW5nT3B0aW9uc19zdHJ1Y3QgT0NSU3BhY2luZ09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBPQ1JQcm9jZXNzaW5nT3B0aW9uc19zdHJ1Y3QgT0NSUHJvY2Vzc2luZ09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBSZWFkVGV4dE9wdGlvbnNfc3RydWN0IFJlYWRUZXh0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENoYXJJbmZvX3N0cnVjdCBDaGFySW5mbzsKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnRfc3RydWN0IENoYXJSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBSZWFkVGV4dFJlcG9ydF9zdHJ1Y3QgUmVhZFRleHRSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBEaXZpc2lvbk1vZGVsX3N0cnVjdCBEaXZpc2lvbk1vZGVsOwordHlwZWRlZiBzdHJ1Y3QgRm9jYWxMZW5ndGhfc3RydWN0IEZvY2FsTGVuZ3RoOwordHlwZWRlZiBzdHJ1Y3QgUG9seU1vZGVsX3N0cnVjdCBQb2x5TW9kZWw7Cit0eXBlZGVmIHN0cnVjdCBEaXN0b3J0aW9uTW9kZWxQYXJhbXNfc3RydWN0IERpc3RvcnRpb25Nb2RlbFBhcmFtczsKK3R5cGVkZWYgc3RydWN0IFBvaW50RmxvYXRfc3RydWN0IFBvaW50RmxvYXQ7Cit0eXBlZGVmIHN0cnVjdCBJbnRlcm5hbFBhcmFtZXRlcnNfc3RydWN0IEludGVybmFsUGFyYW1ldGVyczsKK3R5cGVkZWYgc3RydWN0IE1heEdyaWRTaXplX3N0cnVjdCBNYXhHcmlkU2l6ZTsKK3R5cGVkZWYgc3RydWN0IEltYWdlU2l6ZV9zdHJ1Y3QgSW1hZ2VTaXplOwordHlwZWRlZiBzdHJ1Y3QgQ2FsaWJyYXRpb25SZWZlcmVuY2VQb2ludHNfc3RydWN0IENhbGlicmF0aW9uUmVmZXJlbmNlUG9pbnRzOwordHlwZWRlZiBzdHJ1Y3QgR2V0Q2FtZXJhUGFyYW1ldGVyc1JlcG9ydF9zdHJ1Y3QgR2V0Q2FtZXJhUGFyYW1ldGVyc1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uQXhpc0luZm9fc3RydWN0IENhbGlicmF0aW9uQXhpc0luZm87Cit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvbkxlYXJuU2V0dXBJbmZvX3N0cnVjdCBDYWxpYnJhdGlvbkxlYXJuU2V0dXBJbmZvOwordHlwZWRlZiBzdHJ1Y3QgR3JpZERlc2NyaXB0b3Jfc3RydWN0IEdyaWREZXNjcmlwdG9yOwordHlwZWRlZiBzdHJ1Y3QgRXJyb3JTdGF0aXN0aWNzX3N0cnVjdCBFcnJvclN0YXRpc3RpY3M7Cit0eXBlZGVmIHN0cnVjdCBHZXRDYWxpYnJhdGlvbkluZm9SZXBvcnRfc3RydWN0IEdldENhbGlicmF0aW9uSW5mb1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEVkZ2VQb2xhcml0eV9zdHJ1Y3QgRWRnZVBvbGFyaXR5OwordHlwZWRlZiBzdHJ1Y3QgQ2xhbXBTZXR0aW5nc19zdHJ1Y3QgQ2xhbXBTZXR0aW5nczsKK3R5cGVkZWYgc3RydWN0IFBvaW50RG91YmxlX3N0cnVjdCBQb2ludERvdWJsZTsKK3R5cGVkZWYgc3RydWN0IFBvaW50RG91YmxlUGFpcl9zdHJ1Y3QgUG9pbnREb3VibGVQYWlyOwordHlwZWRlZiBzdHJ1Y3QgQ2xhbXBSZXN1bHRzX3N0cnVjdCBDbGFtcFJlc3VsdHM7Cit0eXBlZGVmIHN0cnVjdCBDbGFtcFBvaW50c19zdHJ1Y3QgQ2xhbXBQb2ludHM7Cit0eXBlZGVmIHN0cnVjdCBSR0JWYWx1ZV9zdHJ1Y3QgUkdCVmFsdWU7Cit0eXBlZGVmIHN0cnVjdCBDbGFtcE92ZXJsYXlTZXR0aW5nc19zdHJ1Y3QgQ2xhbXBPdmVybGF5U2V0dGluZ3M7Cit0eXBlZGVmIHN0cnVjdCBDbGFtcE1heDJSZXBvcnRfc3RydWN0IENsYW1wTWF4MlJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJGaXRTcGxpbmVSZXBvcnRfc3RydWN0IENvbnRvdXJGaXRTcGxpbmVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBMaW5lRmxvYXRfc3RydWN0IExpbmVGbG9hdDsKK3R5cGVkZWYgc3RydWN0IExpbmVFcXVhdGlvbl9zdHJ1Y3QgTGluZUVxdWF0aW9uOwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckZpdExpbmVSZXBvcnRfc3RydWN0IENvbnRvdXJGaXRMaW5lUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckZpdFBvbHlub21pYWxSZXBvcnRfc3RydWN0IENvbnRvdXJGaXRQb2x5bm9taWFsUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgUGFydGlhbENpcmNsZV9zdHJ1Y3QgUGFydGlhbENpcmNsZTsKK3R5cGVkZWYgc3RydWN0IFBhcnRpYWxFbGxpcHNlX3N0cnVjdCBQYXJ0aWFsRWxsaXBzZTsKK3R5cGVkZWYgc3RydWN0IFNldHVwTWF0Y2hQYXR0ZXJuRGF0YV9zdHJ1Y3QgU2V0dXBNYXRjaFBhdHRlcm5EYXRhOwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VTZXR0aW5nRG91YmxlX3N0cnVjdCBSYW5nZVNldHRpbmdEb3VibGU7Cit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNBZHZhbmNlZFNldHVwRGF0YU9wdGlvbl9zdHJ1Y3QgR2VvbWV0cmljQWR2YW5jZWRTZXR1cERhdGFPcHRpb247Cit0eXBlZGVmIHN0cnVjdCBDb250b3VySW5mb1JlcG9ydF9zdHJ1Y3QgQ29udG91ckluZm9SZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBST0lMYWJlbF9zdHJ1Y3QgUk9JTGFiZWw7Cit0eXBlZGVmIHN0cnVjdCBTdXBlcnZpc2VkQ29sb3JTZWdtZW50YXRpb25SZXBvcnRfc3RydWN0IFN1cGVydmlzZWRDb2xvclNlZ21lbnRhdGlvblJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IExhYmVsVG9ST0lSZXBvcnRfc3RydWN0IExhYmVsVG9ST0lSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb2xvclNlZ21lbmF0aW9uT3B0aW9uc19zdHJ1Y3QgQ29sb3JTZWdtZW5hdGlvbk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVkQ3VydmVfc3RydWN0IENsYXNzaWZpZWRDdXJ2ZTsKK3R5cGVkZWYgc3RydWN0IFJhbmdlRG91YmxlX3N0cnVjdCBSYW5nZURvdWJsZTsKK3R5cGVkZWYgc3RydWN0IFJhbmdlTGFiZWxfc3RydWN0IFJhbmdlTGFiZWw7Cit0eXBlZGVmIHN0cnVjdCBDdXJ2YXR1cmVBbmFseXNpc1JlcG9ydF9zdHJ1Y3QgQ3VydmF0dXJlQW5hbHlzaXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBEaXNwYXJpdHlfc3RydWN0IERpc3Bhcml0eTsKK3R5cGVkZWYgc3RydWN0IENvbXB1dGVEaXN0YW5jZXNSZXBvcnRfc3RydWN0IENvbXB1dGVEaXN0YW5jZXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaE1vZGVfc3RydWN0IE1hdGNoTW9kZTsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZWREaXNwYXJpdHlfc3RydWN0IENsYXNzaWZpZWREaXNwYXJpdHk7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmeURpc3RhbmNlc1JlcG9ydF9zdHJ1Y3QgQ2xhc3NpZnlEaXN0YW5jZXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb250b3VyQ29tcHV0ZUN1cnZhdHVyZVJlcG9ydF9zdHJ1Y3QgQ29udG91ckNvbXB1dGVDdXJ2YXR1cmVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb250b3VyT3ZlcmxheVNldHRpbmdzX3N0cnVjdCBDb250b3VyT3ZlcmxheVNldHRpbmdzOwordHlwZWRlZiBzdHJ1Y3QgQ3VydmVQYXJhbWV0ZXJzX3N0cnVjdCBDdXJ2ZVBhcmFtZXRlcnM7Cit0eXBlZGVmIHN0cnVjdCBFeHRyYWN0Q29udG91clJlcG9ydF9zdHJ1Y3QgRXh0cmFjdENvbnRvdXJSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb25uZWN0aW9uQ29uc3RyYWludF9zdHJ1Y3QgQ29ubmVjdGlvbkNvbnN0cmFpbnQ7Cit0eXBlZGVmIHN0cnVjdCBFeHRyYWN0VGV4dHVyZUZlYXR1cmVzUmVwb3J0X3N0cnVjdCBFeHRyYWN0VGV4dHVyZUZlYXR1cmVzUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgV2F2ZWxldEJhbmRzUmVwb3J0X3N0cnVjdCBXYXZlbGV0QmFuZHNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDaXJjbGVGaXRPcHRpb25zX3N0cnVjdCBDaXJjbGVGaXRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgRWRnZU9wdGlvbnMyX3N0cnVjdCBFZGdlT3B0aW9uczI7Cit0eXBlZGVmIHN0cnVjdCBGaW5kQ2lyY3VsYXJFZGdlT3B0aW9uc19zdHJ1Y3QgRmluZENpcmN1bGFyRWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBGaW5kQ29uY2VudHJpY0VkZ2VPcHRpb25zX3N0cnVjdCBGaW5kQ29uY2VudHJpY0VkZ2VPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ29uY2VudHJpY0VkZ2VGaXRPcHRpb25zX3N0cnVjdCBDb25jZW50cmljRWRnZUZpdE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBGaW5kQ29uY2VudHJpY0VkZ2VSZXBvcnRfc3RydWN0IEZpbmRDb25jZW50cmljRWRnZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEZpbmRDaXJjdWxhckVkZ2VSZXBvcnRfc3RydWN0IEZpbmRDaXJjdWxhckVkZ2VSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBXaW5kb3dTaXplX3N0cnVjdCBXaW5kb3dTaXplOwordHlwZWRlZiBzdHJ1Y3QgRGlzcGxhY2VtZW50VmVjdG9yX3N0cnVjdCBEaXNwbGFjZW1lbnRWZWN0b3I7Cit0eXBlZGVmIHN0cnVjdCBXYXZlbGV0T3B0aW9uc19zdHJ1Y3QgV2F2ZWxldE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDb29jY3VycmVuY2VPcHRpb25zX3N0cnVjdCBDb29jY3VycmVuY2VPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyTG9jYWxUaHJlc2hvbGRPcHRpb25zX3N0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJMb2NhbFRocmVzaG9sZE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBSYW5nZUZsb2F0X3N0cnVjdCBSYW5nZUZsb2F0OwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyQXV0b1RocmVzaG9sZE9wdGlvbnNfc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllckF1dG9UaHJlc2hvbGRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnMyX3N0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9uczI7Cit0eXBlZGVmIHN0cnVjdCBNZWFzdXJlUGFydGljbGVzUmVwb3J0X3N0cnVjdCBNZWFzdXJlUGFydGljbGVzUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoM19zdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoMzsKK3R5cGVkZWYgc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczNfc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczM7Cit0eXBlZGVmIHN0cnVjdCBDb2xvck9wdGlvbnNfc3RydWN0IENvbG9yT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFNhbXBsZVNjb3JlX3N0cnVjdCBTYW1wbGVTY29yZTsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJSZXBvcnRBZHZhbmNlZF9zdHJ1Y3QgQ2xhc3NpZmllclJlcG9ydEFkdmFuY2VkOwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5HZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMl9zdHJ1Y3QgTGVhcm5HZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uczJfc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uczI7Cit0eXBlZGVmIHN0cnVjdCBGaW5kRWRnZU9wdGlvbnMyX3N0cnVjdCBGaW5kRWRnZU9wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgRmluZEVkZ2VSZXBvcnRfc3RydWN0IEZpbmRFZGdlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRmluZFRyYW5zZm9ybVJlY3RPcHRpb25zMl9zdHJ1Y3QgRmluZFRyYW5zZm9ybVJlY3RPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IEZpbmRUcmFuc2Zvcm1SZWN0c09wdGlvbnMyX3N0cnVjdCBGaW5kVHJhbnNmb3JtUmVjdHNPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0M19zdHJ1Y3QgUmVhZFRleHRSZXBvcnQzOwordHlwZWRlZiBzdHJ1Y3QgQ2hhcmFjdGVyU3RhdGlzdGljc19zdHJ1Y3QgQ2hhcmFjdGVyU3RhdGlzdGljczsKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnQzX3N0cnVjdCBDaGFyUmVwb3J0MzsKK3R5cGVkZWYgc3RydWN0IEFyY0luZm8yX3N0cnVjdCBBcmNJbmZvMjsKK3R5cGVkZWYgc3RydWN0IEVkZ2VSZXBvcnQyX3N0cnVjdCBFZGdlUmVwb3J0MjsKK3R5cGVkZWYgc3RydWN0IFNlYXJjaEFyY0luZm9fc3RydWN0IFNlYXJjaEFyY0luZm87Cit0eXBlZGVmIHN0cnVjdCBDb25jZW50cmljUmFrZVJlcG9ydDJfc3RydWN0IENvbmNlbnRyaWNSYWtlUmVwb3J0MjsKK3R5cGVkZWYgc3RydWN0IFNwb2tlUmVwb3J0Ml9zdHJ1Y3QgU3Bva2VSZXBvcnQyOwordHlwZWRlZiBzdHJ1Y3QgRWRnZUluZm9fc3RydWN0IEVkZ2VJbmZvOwordHlwZWRlZiBzdHJ1Y3QgU2VhcmNoTGluZUluZm9fc3RydWN0IFNlYXJjaExpbmVJbmZvOwordHlwZWRlZiBzdHJ1Y3QgUmFrZVJlcG9ydDJfc3RydWN0IFJha2VSZXBvcnQyOwordHlwZWRlZiBzdHJ1Y3QgVHJhbnNmb3JtQmVoYXZpb3JzX3N0cnVjdCBUcmFuc2Zvcm1CZWhhdmlvcnM7Cit0eXBlZGVmIHN0cnVjdCBRUkNvZGVEYXRhVG9rZW5fc3RydWN0IFFSQ29kZURhdGFUb2tlbjsKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uc19zdHJ1Y3QgUGFydGljbGVGaWx0ZXJPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgU3RyYWlnaHRFZGdlUmVwb3J0Ml9zdHJ1Y3QgU3RyYWlnaHRFZGdlUmVwb3J0MjsKK3R5cGVkZWYgc3RydWN0IFN0cmFpZ2h0RWRnZU9wdGlvbnNfc3RydWN0IFN0cmFpZ2h0RWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBTdHJhaWdodEVkZ2Vfc3RydWN0IFN0cmFpZ2h0RWRnZTsKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVNlYXJjaE9wdGlvbnNfc3RydWN0IFFSQ29kZVNlYXJjaE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBRUkNvZGVTaXplT3B0aW9uc19zdHJ1Y3QgUVJDb2RlU2l6ZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBRUkNvZGVEZXNjcmlwdGlvbk9wdGlvbnNfc3RydWN0IFFSQ29kZURlc2NyaXB0aW9uT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVJlcG9ydF9zdHJ1Y3QgUVJDb2RlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQUlNR3JhZGVSZXBvcnRfc3RydWN0IEFJTUdyYWRlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeFNpemVPcHRpb25zX3N0cnVjdCBEYXRhTWF0cml4U2l6ZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4RGVzY3JpcHRpb25PcHRpb25zX3N0cnVjdCBEYXRhTWF0cml4RGVzY3JpcHRpb25PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeFNlYXJjaE9wdGlvbnNfc3RydWN0IERhdGFNYXRyaXhTZWFyY2hPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeFJlcG9ydF9zdHJ1Y3QgRGF0YU1hdHJpeFJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEpQRUcyMDAwRmlsZUFkdmFuY2VkT3B0aW9uc19zdHJ1Y3QgSlBFRzIwMDBGaWxlQWR2YW5jZWRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMl9zdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IEluc3BlY3Rpb25BbGlnbm1lbnRfc3RydWN0IEluc3BlY3Rpb25BbGlnbm1lbnQ7Cit0eXBlZGVmIHN0cnVjdCBJbnNwZWN0aW9uT3B0aW9uc19zdHJ1Y3QgSW5zcGVjdGlvbk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDaGFyUmVwb3J0Ml9zdHJ1Y3QgQ2hhclJlcG9ydDI7Cit0eXBlZGVmIHN0cnVjdCBDaGFySW5mbzJfc3RydWN0IENoYXJJbmZvMjsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0Ml9zdHJ1Y3QgUmVhZFRleHRSZXBvcnQyOwordHlwZWRlZiBzdHJ1Y3QgRWxsaXBzZUZlYXR1cmVfc3RydWN0IEVsbGlwc2VGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgQ2lyY2xlRmVhdHVyZV9zdHJ1Y3QgQ2lyY2xlRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IENvbnN0Q3VydmVGZWF0dXJlX3N0cnVjdCBDb25zdEN1cnZlRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IFJlY3RhbmdsZUZlYXR1cmVfc3RydWN0IFJlY3RhbmdsZUZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBMZWdGZWF0dXJlX3N0cnVjdCBMZWdGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgQ29ybmVyRmVhdHVyZV9zdHJ1Y3QgQ29ybmVyRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IExpbmVGZWF0dXJlX3N0cnVjdCBMaW5lRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlX3N0cnVjdCBQYXJhbGxlbExpbmVQYWlyRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IFBhaXJPZlBhcmFsbGVsTGluZVBhaXJzRmVhdHVyZV9zdHJ1Y3QgUGFpck9mUGFyYWxsZWxMaW5lUGFpcnNGZWF0dXJlOwordHlwZWRlZiB1bmlvbiBHZW9tZXRyaWNGZWF0dXJlX3VuaW9uIEdlb21ldHJpY0ZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBGZWF0dXJlRGF0YV9zdHJ1Y3QgRmVhdHVyZURhdGE7Cit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gyX3N0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gyOwordHlwZWRlZiBzdHJ1Y3QgQ2xvc2VkQ3VydmVGZWF0dXJlX3N0cnVjdCBDbG9zZWRDdXJ2ZUZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBMaW5lTWF0Y2hfc3RydWN0IExpbmVNYXRjaDsKK3R5cGVkZWYgc3RydWN0IExpbmVEZXNjcmlwdG9yX3N0cnVjdCBMaW5lRGVzY3JpcHRvcjsKK3R5cGVkZWYgc3RydWN0IFJlY3RhbmdsZURlc2NyaXB0b3Jfc3RydWN0IFJlY3RhbmdsZURlc2NyaXB0b3I7Cit0eXBlZGVmIHN0cnVjdCBSZWN0YW5nbGVNYXRjaF9zdHJ1Y3QgUmVjdGFuZ2xlTWF0Y2g7Cit0eXBlZGVmIHN0cnVjdCBFbGxpcHNlRGVzY3JpcHRvcl9zdHJ1Y3QgRWxsaXBzZURlc2NyaXB0b3I7Cit0eXBlZGVmIHN0cnVjdCBFbGxpcHNlTWF0Y2hfc3RydWN0IEVsbGlwc2VNYXRjaDsKK3R5cGVkZWYgc3RydWN0IENpcmNsZU1hdGNoX3N0cnVjdCBDaXJjbGVNYXRjaDsKK3R5cGVkZWYgc3RydWN0IENpcmNsZURlc2NyaXB0b3Jfc3RydWN0IENpcmNsZURlc2NyaXB0b3I7Cit0eXBlZGVmIHN0cnVjdCBTaGFwZURldGVjdGlvbk9wdGlvbnNfc3RydWN0IFNoYXBlRGV0ZWN0aW9uT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEN1cnZlX3N0cnVjdCBDdXJ2ZTsKK3R5cGVkZWYgc3RydWN0IEN1cnZlT3B0aW9uc19zdHJ1Y3QgQ3VydmVPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQmFyY29kZTJESW5mb19zdHJ1Y3QgQmFyY29kZTJESW5mbzsKK3R5cGVkZWYgc3RydWN0IERhdGFNYXRyaXhPcHRpb25zX3N0cnVjdCBEYXRhTWF0cml4T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJBY2N1cmFjeVJlcG9ydF9zdHJ1Y3QgQ2xhc3NpZmllckFjY3VyYWN5UmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgTmVhcmVzdE5laWdoYm9yQ2xhc3NSZXN1bHRfc3RydWN0IE5lYXJlc3ROZWlnaGJvckNsYXNzUmVzdWx0OwordHlwZWRlZiBzdHJ1Y3QgTmVhcmVzdE5laWdoYm9yVHJhaW5pbmdSZXBvcnRfc3RydWN0IE5lYXJlc3ROZWlnaGJvclRyYWluaW5nUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnNfc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllclNhbXBsZUluZm9fc3RydWN0IENsYXNzaWZpZXJTYW1wbGVJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NTY29yZV9zdHJ1Y3QgQ2xhc3NTY29yZTsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJSZXBvcnRfc3RydWN0IENsYXNzaWZpZXJSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBOZWFyZXN0TmVpZ2hib3JPcHRpb25zX3N0cnVjdCBOZWFyZXN0TmVpZ2hib3JPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9uc19zdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFJHQlU2NFZhbHVlX3N0cnVjdCBSR0JVNjRWYWx1ZTsKK3R5cGVkZWYgc3RydWN0IEdlb21ldHJpY1BhdHRlcm5NYXRjaF9zdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zX3N0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zX3N0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5HZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zX3N0cnVjdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBGaXRFbGxpcHNlT3B0aW9uc19zdHJ1Y3QgRml0RWxsaXBzZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBGaXRDaXJjbGVPcHRpb25zX3N0cnVjdCBGaXRDaXJjbGVPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RydWN0Uk9JT3B0aW9uczJfc3RydWN0IENvbnN0cnVjdFJPSU9wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgSFNMVmFsdWVfc3RydWN0IEhTTFZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgSFNWVmFsdWVfc3RydWN0IEhTVlZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgSFNJVmFsdWVfc3RydWN0IEhTSVZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgQ0lFTGFiVmFsdWVfc3RydWN0IENJRUxhYlZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgQ0lFWFlaVmFsdWVfc3RydWN0IENJRVhZWlZhbHVlOwordHlwZWRlZiB1bmlvbiBDb2xvcjJfdW5pb24gQ29sb3IyOwordHlwZWRlZiBzdHJ1Y3QgQmVzdEVsbGlwc2UyX3N0cnVjdCBCZXN0RWxsaXBzZTI7Cit0eXBlZGVmIHN0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEFWSUluZm9fc3RydWN0IEFWSUluZm87Cit0eXBlZGVmIHN0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZFNoaWZ0T3B0aW9uc19zdHJ1Y3QgTGVhcm5QYXR0ZXJuQWR2YW5jZWRTaGlmdE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZFJvdGF0aW9uT3B0aW9uc19zdHJ1Y3QgTGVhcm5QYXR0ZXJuQWR2YW5jZWRSb3RhdGlvbk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaFBhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IE1hdGNoUGF0dGVybkFkdmFuY2VkT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyX3N0cnVjdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMjsKK3R5cGVkZWYgc3RydWN0IEJlc3RDaXJjbGUyX3N0cnVjdCBCZXN0Q2lyY2xlMjsKK3R5cGVkZWYgc3RydWN0IE9DUlNwYWNpbmdPcHRpb25zX3N0cnVjdCBPQ1JTcGFjaW5nT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IE9DUlByb2Nlc3NpbmdPcHRpb25zX3N0cnVjdCBPQ1JQcm9jZXNzaW5nT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0T3B0aW9uc19zdHJ1Y3QgUmVhZFRleHRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ2hhckluZm9fc3RydWN0IENoYXJJbmZvOworI2lmICFkZWZpbmVkKFVTRVJJTlRfSEVBREVSKSAmJiAhZGVmaW5lZChfQ1ZJX1JFQ1RfREVGSU5FRCkKK3R5cGVkZWYgc3RydWN0IFJlY3Rfc3RydWN0IFJlY3Q7CisjZW5kaWYKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnRfc3RydWN0IENoYXJSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBSZWFkVGV4dFJlcG9ydF9zdHJ1Y3QgUmVhZFRleHRSZXBvcnQ7CisjaWYgIWRlZmluZWQoVVNFUklOVF9IRUFERVIpICYmICFkZWZpbmVkKF9DVklfUE9JTlRfREVGSU5FRCkKK3R5cGVkZWYgc3RydWN0IFBvaW50X3N0cnVjdCBQb2ludDsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgQW5udWx1c19zdHJ1Y3QgQW5udWx1czsKK3R5cGVkZWYgc3RydWN0IEVkZ2VMb2NhdGlvblJlcG9ydF9zdHJ1Y3QgRWRnZUxvY2F0aW9uUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRWRnZU9wdGlvbnNfc3RydWN0IEVkZ2VPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgRWRnZVJlcG9ydF9zdHJ1Y3QgRWRnZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEV4dHJlbWVSZXBvcnRfc3RydWN0IEV4dHJlbWVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBGaXRMaW5lT3B0aW9uc19zdHJ1Y3QgRml0TGluZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBEaXNwbGF5TWFwcGluZ19zdHJ1Y3QgRGlzcGxheU1hcHBpbmc7Cit0eXBlZGVmIHN0cnVjdCBEZXRlY3RFeHRyZW1lc09wdGlvbnNfc3RydWN0IERldGVjdEV4dHJlbWVzT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEltYWdlSW5mb19zdHJ1Y3QgSW1hZ2VJbmZvOwordHlwZWRlZiBzdHJ1Y3QgTENET3B0aW9uc19zdHJ1Y3QgTENET3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IExDRFJlcG9ydF9zdHJ1Y3QgTENEUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgTENEU2VnbWVudHNfc3RydWN0IExDRFNlZ21lbnRzOwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5DYWxpYnJhdGlvbk9wdGlvbnNfc3RydWN0IExlYXJuQ2FsaWJyYXRpb25PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5Db2xvclBhdHRlcm5PcHRpb25zX3N0cnVjdCBMZWFybkNvbG9yUGF0dGVybk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBMaW5lX3N0cnVjdCBMaW5lOwordHlwZWRlZiBzdHJ1Y3QgTGluZWFyQXZlcmFnZXNfc3RydWN0IExpbmVhckF2ZXJhZ2VzOwordHlwZWRlZiBzdHJ1Y3QgTGluZVByb2ZpbGVfc3RydWN0IExpbmVQcm9maWxlOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hDb2xvclBhdHRlcm5PcHRpb25zX3N0cnVjdCBNYXRjaENvbG9yUGF0dGVybk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBIaXN0b2dyYW1SZXBvcnRfc3RydWN0IEhpc3RvZ3JhbVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEFyY0luZm9fc3RydWN0IEFyY0luZm87Cit0eXBlZGVmIHN0cnVjdCBBeGlzUmVwb3J0X3N0cnVjdCBBeGlzUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQmFyY29kZUluZm9fc3RydWN0IEJhcmNvZGVJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQkNHT3B0aW9uc19zdHJ1Y3QgQkNHT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEJlc3RDaXJjbGVfc3RydWN0IEJlc3RDaXJjbGU7Cit0eXBlZGVmIHN0cnVjdCBCZXN0RWxsaXBzZV9zdHJ1Y3QgQmVzdEVsbGlwc2U7Cit0eXBlZGVmIHN0cnVjdCBCZXN0TGluZV9zdHJ1Y3QgQmVzdExpbmU7Cit0eXBlZGVmIHN0cnVjdCBCcm93c2VyT3B0aW9uc19zdHJ1Y3QgQnJvd3Nlck9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDb29yZGluYXRlU3lzdGVtX3N0cnVjdCBDb29yZGluYXRlU3lzdGVtOwordHlwZWRlZiBzdHJ1Y3QgQ2FsaWJyYXRpb25JbmZvX3N0cnVjdCBDYWxpYnJhdGlvbkluZm87Cit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvblBvaW50c19zdHJ1Y3QgQ2FsaWJyYXRpb25Qb2ludHM7Cit0eXBlZGVmIHN0cnVjdCBDYWxpcGVyT3B0aW9uc19zdHJ1Y3QgQ2FsaXBlck9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDYWxpcGVyUmVwb3J0X3N0cnVjdCBDYWxpcGVyUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRHJhd1RleHRPcHRpb25zX3N0cnVjdCBEcmF3VGV4dE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDaXJjbGVSZXBvcnRfc3RydWN0IENpcmNsZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENsb3NlZENvbnRvdXJfc3RydWN0IENsb3NlZENvbnRvdXI7Cit0eXBlZGVmIHN0cnVjdCBDb2xvckhpc3RvZ3JhbVJlcG9ydF9zdHJ1Y3QgQ29sb3JIaXN0b2dyYW1SZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb2xvckluZm9ybWF0aW9uX3N0cnVjdCBDb2xvckluZm9ybWF0aW9uOwordHlwZWRlZiBzdHJ1Y3QgQ29tcGxleF9zdHJ1Y3QgQ29tcGxleDsKK3R5cGVkZWYgc3RydWN0IENvbmNlbnRyaWNSYWtlUmVwb3J0X3N0cnVjdCBDb25jZW50cmljUmFrZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbnN0cnVjdFJPSU9wdGlvbnNfc3RydWN0IENvbnN0cnVjdFJPSU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDb250b3VySW5mb19zdHJ1Y3QgQ29udG91ckluZm87Cit0eXBlZGVmIHVuaW9uIENvbnRvdXJVbmlvbl91bmlvbiBDb250b3VyVW5pb247Cit0eXBlZGVmIHN0cnVjdCBDb250b3VySW5mbzJfc3RydWN0IENvbnRvdXJJbmZvMjsKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJQb2ludF9zdHJ1Y3QgQ29udG91clBvaW50OwordHlwZWRlZiBzdHJ1Y3QgQ29vcmRpbmF0ZVRyYW5zZm9ybV9zdHJ1Y3QgQ29vcmRpbmF0ZVRyYW5zZm9ybTsKK3R5cGVkZWYgc3RydWN0IENvb3JkaW5hdGVUcmFuc2Zvcm0yX3N0cnVjdCBDb29yZGluYXRlVHJhbnNmb3JtMjsKK3R5cGVkZWYgc3RydWN0IENhbm55T3B0aW9uc19zdHJ1Y3QgQ2FubnlPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2Vfc3RydWN0IFJhbmdlOwordHlwZWRlZiBzdHJ1Y3QgVXNlclBvaW50U3ltYm9sX3N0cnVjdCBVc2VyUG9pbnRTeW1ib2w7Cit0eXBlZGVmIHN0cnVjdCBWaWV3M0RPcHRpb25zX3N0cnVjdCBWaWV3M0RPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hQYXR0ZXJuT3B0aW9uc19zdHJ1Y3QgTWF0Y2hQYXR0ZXJuT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFRJRkZGaWxlT3B0aW9uc19zdHJ1Y3QgVElGRkZpbGVPcHRpb25zOwordHlwZWRlZiB1bmlvbiBDb2xvcl91bmlvbiBDb2xvcjsKK3R5cGVkZWYgdW5pb24gUGl4ZWxWYWx1ZV91bmlvbiBQaXhlbFZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgT3BlbkNvbnRvdXJfc3RydWN0IE9wZW5Db250b3VyOwordHlwZWRlZiBzdHJ1Y3QgT3ZlcmxheVRleHRPcHRpb25zX3N0cnVjdCBPdmVybGF5VGV4dE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhX3N0cnVjdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVSZXBvcnRfc3RydWN0IFBhcnRpY2xlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgUGF0dGVybk1hdGNoX3N0cnVjdCBQYXR0ZXJuTWF0Y2g7Cit0eXBlZGVmIHN0cnVjdCBRdWFudGlmeURhdGFfc3RydWN0IFF1YW50aWZ5RGF0YTsKK3R5cGVkZWYgc3RydWN0IFF1YW50aWZ5UmVwb3J0X3N0cnVjdCBRdWFudGlmeVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFJha2VPcHRpb25zX3N0cnVjdCBSYWtlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFJha2VSZXBvcnRfc3RydWN0IFJha2VSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBUcmFuc2Zvcm1SZXBvcnRfc3RydWN0IFRyYW5zZm9ybVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFNoYXBlUmVwb3J0X3N0cnVjdCBTaGFwZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IE1ldGVyQXJjX3N0cnVjdCBNZXRlckFyYzsKK3R5cGVkZWYgc3RydWN0IFRocmVzaG9sZERhdGFfc3RydWN0IFRocmVzaG9sZERhdGE7Cit0eXBlZGVmIHN0cnVjdCBTdHJ1Y3R1cmluZ0VsZW1lbnRfc3RydWN0IFN0cnVjdHVyaW5nRWxlbWVudDsKK3R5cGVkZWYgc3RydWN0IFNwb2tlUmVwb3J0X3N0cnVjdCBTcG9rZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFNpbXBsZUVkZ2VPcHRpb25zX3N0cnVjdCBTaW1wbGVFZGdlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFNlbGVjdFBhcnRpY2xlQ3JpdGVyaWFfc3RydWN0IFNlbGVjdFBhcnRpY2xlQ3JpdGVyaWE7Cit0eXBlZGVmIHN0cnVjdCBTZWdtZW50SW5mb19zdHJ1Y3QgU2VnbWVudEluZm87Cit0eXBlZGVmIHN0cnVjdCBSb3RhdGlvbkFuZ2xlUmFuZ2Vfc3RydWN0IFJvdGF0aW9uQW5nbGVSYW5nZTsKK3R5cGVkZWYgc3RydWN0IFJvdGF0ZWRSZWN0X3N0cnVjdCBSb3RhdGVkUmVjdDsKK3R5cGVkZWYgc3RydWN0IFJPSVByb2ZpbGVfc3RydWN0IFJPSVByb2ZpbGU7Cit0eXBlZGVmIHN0cnVjdCBUb29sV2luZG93T3B0aW9uc19zdHJ1Y3QgVG9vbFdpbmRvd09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBTcG9rZU9wdGlvbnNfc3RydWN0IFNwb2tlT3B0aW9uczsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEYXRhIFN0cnVjdHVyZXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmICFkZWZpbmVkIF9fR05VQ19fICYmICFkZWZpbmVkIF9NX1g2NAorI3ByYWdtYSBwYWNrKHB1c2gsMSkKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgRGl2aXNpb25Nb2RlbF9zdHJ1Y3QgeworICAgIGZsb2F0IGthcHBhOyAvL1RoZSBsZWFybmVkIGthcHBhIGNvZWZmaWNpZW50IG9mIGRpdmlzaW9uIG1vZGVsLgorfSBEaXZpc2lvbk1vZGVsOworCit0eXBlZGVmIHN0cnVjdCBGb2NhbExlbmd0aF9zdHJ1Y3QgeworICAgIGZsb2F0IGZ4OyAvL0ZvY2FsIGxlbmd0aCBpbiBYIGRpcmVjdGlvbi4KKyAgICBmbG9hdCBmeTsgLy9Gb2NhbCBsZW5ndGggaW4gWSBkaXJlY3Rpb24uCit9IEZvY2FsTGVuZ3RoOworCit0eXBlZGVmIHN0cnVjdCBQb2x5TW9kZWxfc3RydWN0IHsKKyAgICBmbG9hdCogICAgICAga0NvZWZmczsgICAgLy9UaGUgbGVhcm5lZCByYWRpYWwgY29lZmZpY2llbnRzIG9mIHBvbHlub21pYWwgbW9kZWwuCisgICAgdW5zaWduZWQgaW50IG51bUtDb2VmZnM7IC8vTnVtYmVyIG9mIEsgY29lZmZpY2llbnRzLgorICAgIGZsb2F0ICAgICAgICBwMTsgICAgICAgICAvL1RoZSBQMShsZWFybmVkIHRhbmdlbnRpYWwgY29lZmZpY2llbnRzIG9mIHBvbHlub21pYWwgbW9kZWwpLgorICAgIGZsb2F0ICAgICAgICBwMjsgICAgICAgICAvL1RoZSBQMihsZWFybmVkIHRhbmdlbnRpYWwgY29lZmZpY2llbnRzIG9mIHBvbHlub21pYWwgbW9kZWwpLgorfSBQb2x5TW9kZWw7CisKK3R5cGVkZWYgc3RydWN0IERpc3RvcnRpb25Nb2RlbFBhcmFtc19zdHJ1Y3QgeworICAgIERpc3RvcnRpb25Nb2RlbCBkaXN0b3J0aW9uTW9kZWw7IC8vVHlwZSBvZiBsZWFybmVkIGRpc3RvcnRpb24gbW9kZWwuCisgICAgUG9seU1vZGVsICAgICAgIHBvbHlNb2RlbDsgICAgICAgLy9UaGUgbGVhcm5lZCBjb2VmZmljaWVudHMgb2YgcG9seW5vbWlhbCBtb2RlbC4KKyAgICBEaXZpc2lvbk1vZGVsICAgZGl2aXNpb25Nb2RlbDsgICAvL1RoZSBsZWFybmVkIGNvZWZmaWNpZW50IG9mIGRpdmlzaW9uIG1vZGVsLgorfSBEaXN0b3J0aW9uTW9kZWxQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IFBvaW50RmxvYXRfc3RydWN0IHsKKyAgICBmbG9hdCB4OyAvL1RoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICAgIGZsb2F0IHk7IC8vVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCit9IFBvaW50RmxvYXQ7CisKK3R5cGVkZWYgc3RydWN0IEludGVybmFsUGFyYW1ldGVyc19zdHJ1Y3QgeworICAgIGNoYXIgICAgICAgIGlzSW5zdWZmaWNpZW50RGF0YTsgCisgICAgRm9jYWxMZW5ndGggZm9jYWxMZW5ndGg7ICAgICAgICAKKyAgICBQb2ludEZsb2F0ICBvcHRpY2FsQ2VudGVyOyAgICAgIAorfSBJbnRlcm5hbFBhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0IE1heEdyaWRTaXplX3N0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IHhNYXg7IC8vTWF4aW11bSB4IGxpbWl0IGZvciB0aGUgZ3JpZCBzaXplLgorICAgIHVuc2lnbmVkIGludCB5TWF4OyAvL01heGltdW0geSBsaW1pdCBmb3IgdGhlIGdyaWQgc2l6ZS4KK30gTWF4R3JpZFNpemU7CisKK3R5cGVkZWYgc3RydWN0IEltYWdlU2l6ZV9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCB4UmVzOyAvL1ggcmVzb2x1dGlvbiBvZiB0aGUgaW1hZ2UuCisgICAgdW5zaWduZWQgaW50IHlSZXM7IC8vWSByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZS4KK30gSW1hZ2VTaXplOworCit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvblJlZmVyZW5jZVBvaW50c19zdHJ1Y3QgeworICAgIFBvaW50RG91YmxlKiAgICBwaXhlbENvb3JkczsgICAgLy9TcGVjaWZpZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwaXhlbCByZWZlcmVuY2UgcG9pbnRzLgorICAgIHVuc2lnbmVkIGludCAgICBudW1QaXhlbENvb3JkczsgLy9OdW1iZXIgb2YgcGl4ZWwgY29vcmRpbmF0ZXMuCisgICAgUG9pbnREb3VibGUqICAgIHJlYWxDb29yZHM7ICAgICAvL1NwZWNpZmllcyB0aGUgbWVhc3VyaW5nIHVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgbnVtUmVhbENvb3JkczsgIC8vTnVtYmVyIG9mIHJlYWwgY29vcmRpbmF0ZXMuCisgICAgQ2FsaWJyYXRpb25Vbml0IHVuaXRzOyAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgdW5pdHMgb2YgWCBTdGVwIGFuZCBZIFN0ZXAuCisgICAgSW1hZ2VTaXplICAgICAgIGltYWdlU2l6ZTsgICAgICAvL1NwZWNpZmllcyB0aGUgc2l6ZSBvZiBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KK30gQ2FsaWJyYXRpb25SZWZlcmVuY2VQb2ludHM7CisKK3R5cGVkZWYgc3RydWN0IEdldENhbWVyYVBhcmFtZXRlcnNSZXBvcnRfc3RydWN0IHsKKyAgICBkb3VibGUqICAgICAgICAgICAgICAgcHJvamVjdGlvbk1hdHJpeDsgICAgIC8vVGhlIHByb2plY3Rpb24oaG9tb2dyYXBoeSkgbWF0cml4IG9mIHdvcmtpbmcgcGxhbmUuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgIHByb2plY3Rpb25NYXRyaXhSb3dzOyAvL051bWJlciBvZiByb3dzIGluIHByb2plY3Rpb24gbWF0cml4LgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICBwcm9qZWN0aW9uTWF0cml4Q29sczsgLy9OdW1iZXIgb2YgY29sdW1ucyBpbiBwcm9qZWN0aW9uIG1hdHJpeC4KKyAgICBEaXN0b3J0aW9uTW9kZWxQYXJhbXMgZGlzdG9ydGlvbjsgICAgICAgICAgIC8vRGlzdG9ydGlvbiBtb2RlbCBDb2VmZmljaWVudHMuCisgICAgSW50ZXJuYWxQYXJhbWV0ZXJzICAgIGludGVybmFsUGFyYW1zOyAgICAgICAvL1RoZSBsZWFybmVkIGludGVybmFsIHBhcmFtdGVycyBvZiBjYW1lcmEgbW9kZWwgc3VjaCBhcyBmb2NhbCBsZW5ndGggYW5kIG9wdGljYWwgY2VudGVyLgorfSBHZXRDYW1lcmFQYXJhbWV0ZXJzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvbkF4aXNJbmZvX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCAgICAgIGNlbnRlcjsgICAgICAgIC8vVGhlIG9yaWdpbiBvZiB0aGUgcmVmZXJlbmNlIGNvb3JkaW5hdGUgc3lzdGVtLCBleHByZXNzZWQgaW4gcGl4ZWwgdW5pdHMuCisgICAgZmxvYXQgICAgICAgICAgIHJvdGF0aW9uQW5nbGU7IC8vVGhlIGFuZ2xlIG9mIHRoZSB4LWF4aXMgb2YgdGhlIHJlYWwtd29ybGQgY29vcmRpbmF0ZSBzeXN0ZW0sIGluIHJlbGF0aW9uIHRvIHRoZSBob3Jpem9udGFsLgorICAgIEF4aXNPcmllbnRhdGlvbiBheGlzRGlyZWN0aW9uOyAvL1NwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBjYWxpYnJhaXRvbiBheGlzIHdoaWNoIGlzIGVpdGhlciBEaXJlY3Qgb3IgSW5kaXJlY3QuCit9IENhbGlicmF0aW9uQXhpc0luZm87CisKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uTGVhcm5TZXR1cEluZm9fc3RydWN0IHsKKyAgICBDYWxpYnJhdGlvbk1vZGUyIGNhbGlicmF0aW9uTWV0aG9kOyAgICAvL1R5cGUgb2YgY2FsaWJyYXRpb24gbWV0aG9kIHVzZWQuCisgICAgRGlzdG9ydGlvbk1vZGVsICBkaXN0b3J0aW9uTW9kZWw7ICAgICAgLy9UeXBlIG9mIGxlYXJuZWQgZGlzdG9ydGlvbiBtb2RlbC4KKyAgICBTY2FsaW5nTWV0aG9kICAgIHNjYWxlTW9kZTsgICAgICAgICAgICAvL1RoZSBhc3BlY3Qgc2NhbGluZyB0byB1c2Ugd2hlbiBjb3JyZWN0aW5nIGFuIGltYWdlLgorICAgIENhbGlicmF0aW9uUk9JICAgcm9pTW9kZTsgICAgICAgICAgICAgIC8vVGhlIFJPSSB0byB1c2Ugd2hlbiBjb3JyZWN0aW5nIGFuIGltYWdlLgorICAgIGNoYXIgICAgICAgICAgICAgbGVhcm5Db3JyZWN0aW9uVGFibGU7IC8vU2V0IHRoaXMgaW5wdXQgdG8gdHJ1ZSB2YWx1ZSBpZiB5b3Ugd2FudCB0aGUgY29ycmVjdGlvbiB0YWJsZSB0byBiZSBkZXRlcm1pbmVkIGFuZCBzdG9yZWQuCit9IENhbGlicmF0aW9uTGVhcm5TZXR1cEluZm87CisKK3R5cGVkZWYgc3RydWN0IEdyaWREZXNjcmlwdG9yX3N0cnVjdCB7CisgICAgZmxvYXQgICAgICAgICAgIHhTdGVwOyAvL1RoZSBkaXN0YW5jZSBpbiB0aGUgeCBkaXJlY3Rpb24gYmV0d2VlbiB0d28gYWRqYWNlbnQgcGl4ZWxzIGluIHVuaXRzIHNwZWNpZmllZCBieSB1bml0LgorICAgIGZsb2F0ICAgICAgICAgICB5U3RlcDsgLy9UaGUgZGlzdGFuY2UgaW4gdGhlIHkgZGlyZWN0aW9uIGJldHdlZW4gdHdvIGFkamFjZW50IHBpeGVscyBpbiB1bml0cyBzcGVjaWZpZWQgYnkgdW5pdC4KKyAgICBDYWxpYnJhdGlvblVuaXQgdW5pdDsgIC8vVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlLgorfSBHcmlkRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgRXJyb3JTdGF0aXN0aWNzX3N0cnVjdCB7CisgICAgZG91YmxlIG1lYW47ICAgICAgICAgICAgICAvL01lYW4gZXJyb3Igc3RhdGlzdGljcyB2YWx1ZS4KKyAgICBkb3VibGUgbWF4aW11bTsgICAgICAgICAgIC8vTWF4aW11bSB2YWx1ZSBvZiBlcnJvci4KKyAgICBkb3VibGUgc3RhbmRhcmREZXZpYXRpb247IC8vVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBlcnJvciBzdGF0aXN0aXNjcyB2YWx1ZS4KKyAgICBkb3VibGUgZGlzdG9ydGlvbjsgICAgICAgIC8vVGhlIGRpc3RvcnRpb24gZXJyb3Igc3RhdGlzdGljcyB2YWx1ZS4KK30gRXJyb3JTdGF0aXN0aWNzOworCit0eXBlZGVmIHN0cnVjdCBHZXRDYWxpYnJhdGlvbkluZm9SZXBvcnRfc3RydWN0IHsKKyAgICBST0kqICAgICAgICAgICAgICAgICAgICAgIHVzZXJSb2k7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFJPSSB0aGUgdXNlciBwcm92aWRlZCB3aGVuIGxlYXJuaW5nIHRoZSBjYWxpYnJhdGlvbi4KKyAgICBST0kqICAgICAgICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uUm9pOyAgLy9TcGVjaWZpZXMgdGhlIFJPSSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByZWdpb24gb2YgdGhlIGltYWdlIHdoZXJlIHRoZSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBpcyBhY2N1cmF0ZS4KKyAgICBDYWxpYnJhdGlvbkF4aXNJbmZvICAgICAgIGF4aXNJbmZvOyAgICAgICAgLy9SZWZlcmVuY2UgQ29vcmRpbmF0ZSBTeXN0ZW0gZm9yIHRoZSByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICAgIENhbGlicmF0aW9uTGVhcm5TZXR1cEluZm8gbGVhcm5TZXR1cEluZm87ICAvL0NhbGlicmF0aW9uIGxlYXJuIHNldHVwIGluZm9ybWF0aW9uLgorICAgIEdyaWREZXNjcmlwdG9yICAgICAgICAgICAgZ3JpZERlc2NyaXB0b3I7ICAvL1NwZWNpZmllcyBzY2FsaW5nIGNvbnN0YW50cyB1c2VkIHRvIGNhbGlicmF0ZSB0aGUgaW1hZ2UuCisgICAgZmxvYXQqICAgICAgICAgICAgICAgICAgICBlcnJvck1hcDsgICAgICAgIC8vVGhlIHRoZSBlcnJvciBtYXAgb2YgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBlcnJvck1hcFJvd3M7ICAgIC8vTnVtYmVyIG9mIHJvd3MgaW4gZXJyb3IgbWFwLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgZXJyb3JNYXBDb2xzOyAgICAvL051bWJlciBvZiBDb2x1bW5zIGluIGVycm9yIG1hcC4KKyAgICBFcnJvclN0YXRpc3RpY3MgICAgICAgICAgIGVycm9yU3RhdGlzdGljczsgLy9FcnJvciBzdGF0aXN0aWNzIG9mIHRoZSBjYWxpYnJhdGlvbi4KK30gR2V0Q2FsaWJyYXRpb25JbmZvUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBFZGdlUG9sYXJpdHlfc3RydWN0IHsKKyAgICBFZGdlUG9sYXJpdHlTZWFyY2hNb2RlIHN0YXJ0OyAKKyAgICBFZGdlUG9sYXJpdHlTZWFyY2hNb2RlIGVuZDsgICAKK30gRWRnZVBvbGFyaXR5OworCit0eXBlZGVmIHN0cnVjdCBDbGFtcFNldHRpbmdzX3N0cnVjdCB7CisgICAgZG91YmxlICAgICAgIGFuZ2xlUmFuZ2U7ICAgLy9TcGVjaWZpZXMgdGhlIGFuZ2xlIHJhbmdlLgorICAgIEVkZ2VQb2xhcml0eSBlZGdlUG9sYXJpdHk7IC8vU3BlY2lmaWVzIHRoZSBlZGdlIHBvbGFyaXR5LgorfSBDbGFtcFNldHRpbmdzOworCit0eXBlZGVmIHN0cnVjdCBQb2ludERvdWJsZV9zdHJ1Y3QgeworICAgIGRvdWJsZSB4OyAvL1RoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICAgIGRvdWJsZSB5OyAvL1RoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorfSBQb2ludERvdWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgUG9pbnREb3VibGVQYWlyX3N0cnVjdCB7CisgICAgUG9pbnREb3VibGUgc3RhcnQ7IC8vVGhlIFN0YXJ0IGNvLW9yZGluYXRlIG9mIHRoZSBwYWlyLgorICAgIFBvaW50RG91YmxlIGVuZDsgICAvL1RoZSBFbmQgY28tb3JkaW5hdGUgb2YgdGhlIHBhaXIuCit9IFBvaW50RG91YmxlUGFpcjsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhbXBSZXN1bHRzX3N0cnVjdCB7CisgICAgZG91YmxlIGRpc3RhbmNlUGl4OyAgICAgICAvL0RlZmluZXMgdGhlIFBpeGVsIHdvcmxkIGRpc3RhbmNlLgorICAgIGRvdWJsZSBkaXN0YW5jZVJlYWxXb3JsZDsgLy9EZWZpbmVzIHRoZSByZWFsIHdvcmxkIGRpc3RhbmNlLgorICAgIGRvdWJsZSBhbmdsZUFiczsgICAgICAgICAgLy9EZWZpbmVzIHRoZSBhYnNvbHV0ZSBhbmdsZS4KKyAgICBkb3VibGUgYW5nbGVSZWxhdGl2ZTsgICAgIC8vRGVmaW5lcyB0aGUgcmVsYXRpdmUgYW5nbGUuCit9IENsYW1wUmVzdWx0czsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhbXBQb2ludHNfc3RydWN0IHsKKyAgICBQb2ludERvdWJsZVBhaXIgcGl4ZWw7ICAgICAvL1NwZWNpZmllcyB0aGUgcGl4ZWwgd29ybGQgcG9pbnQgcGFpciBmb3IgY2xhbXAuCisgICAgUG9pbnREb3VibGVQYWlyIHJlYWxXb3JsZDsgLy9TcGVjaWZpZXMgdGhlIHJlYWwgd29ybGQgcG9pbnQgcGFpciBmb3IgY2xhbXAuCit9IENsYW1wUG9pbnRzOworCit0eXBlZGVmIHN0cnVjdCBSR0JWYWx1ZV9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgQjsgICAgIC8vVGhlIGJsdWUgdmFsdWUgb2YgdGhlIGNvbG9yLgorICAgIHVuc2lnbmVkIGNoYXIgRzsgICAgIC8vVGhlIGdyZWVuIHZhbHVlIG9mIHRoZSBjb2xvci4KKyAgICB1bnNpZ25lZCBjaGFyIFI7ICAgICAvL1RoZSByZWQgdmFsdWUgb2YgdGhlIGNvbG9yLgorICAgIHVuc2lnbmVkIGNoYXIgYWxwaGE7IC8vVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb2xvciwgd2hpY2ggcmVwcmVzZW50cyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hIGNvcnJlY3Rpb24uCit9IFJHQlZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBDbGFtcE92ZXJsYXlTZXR0aW5nc19zdHJ1Y3QgeworICAgIGludCAgICAgIHNob3dTZWFyY2hBcmVhOyAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggYXJlYSBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgc2hvd0N1cnZlczsgICAgICAgICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGN1cnZlcyBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgc2hvd0NsYW1wTG9jYXRpb247ICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGNsYW1wIGxvY2F0aW9uIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICBzaG93UmVzdWx0OyAgICAgICAgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgaGl0IGxpbmVzIHRvIHRoZSBvYmplY3QgYW5kIHRoZSBlZGdlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpdCBsaW5lIG9uIHRoZSByZXN1bHQgaW1hZ2UuCisgICAgUkdCVmFsdWUgc2VhcmNoQXJlYUNvbG9yOyAgICAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGFyZWEuCisgICAgUkdCVmFsdWUgY3VydmVzQ29sb3I7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgY3VydmVzLgorICAgIFJHQlZhbHVlIGNsYW1wTG9jYXRpb25zQ29sb3I7IC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIGNsYW1wIGxvY2F0aW9ucy4KKyAgICBSR0JWYWx1ZSByZXN1bHRDb2xvcjsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSByZXN1bHRzLgorICAgIGNoYXIqICAgIG92ZXJsYXlHcm91cE5hbWU7ICAgIC8vU3BlY2lmaWVzIHRoZSBncm91cCBvdmVybGF5IG5hbWUgZm9yIHRoZSBzdGVwIG92ZXJsYXlzLgorfSBDbGFtcE92ZXJsYXlTZXR0aW5nczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhbXBNYXgyUmVwb3J0X3N0cnVjdCB7CisgICAgQ2xhbXBSZXN1bHRzIGNsYW1wUmVzdWx0czsgICAgIC8vU3BlY2lmaWVzIHRoZSBDbGFtcCByZXN1bHRzIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgICBDbGFtcFBvaW50cyAgY2xhbXBQb2ludHM7ICAgICAgLy9TcGVjaWZpZXMgdGhlIGNsYW1wIHBvaW50cyBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24uCisgICAgdW5zaWduZWQgaW50IGNhbGlicmF0aW9uVmFsaWQ7IC8vU3BlY2lmaWVzIGlmIHRoZSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBpcyB2YWxpZCBvciBub3QuCit9IENsYW1wTWF4MlJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckZpdFNwbGluZVJlcG9ydF9zdHJ1Y3QgeworICAgIFBvaW50RG91YmxlKiBwb2ludHM7ICAgICAgICAgLy9JdCByZXR1cm5zIHRoZSBwb2ludHMgb2YgdGhlIGJlc3QtZml0IEItc3BsaW5lIGN1cnZlLgorICAgIGludCAgICAgICAgICBudW1iZXJPZlBvaW50czsgLy9OdW1iZXIgb2YgQmVzdCBmaXQgcG9pbnRzIHJldHVybmVkLgorfSBDb250b3VyRml0U3BsaW5lUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBMaW5lRmxvYXRfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHN0YXJ0OyAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZS4KKyAgICBQb2ludEZsb2F0IGVuZDsgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGxpbmUuCit9IExpbmVGbG9hdDsKKwordHlwZWRlZiBzdHJ1Y3QgTGluZUVxdWF0aW9uX3N0cnVjdCB7CisgICAgZG91YmxlIGE7IC8vVGhlIGEgY29lZmZpY2llbnQgb2YgdGhlIGxpbmUgZXF1YXRpb24uCisgICAgZG91YmxlIGI7IC8vVGhlIGIgY29lZmZpY2llbnQgb2YgdGhlIGxpbmUgZXF1YXRpb24uCisgICAgZG91YmxlIGM7IC8vVGhlIGMgY29lZmZpY2llbnQgb2YgdGhlIGxpbmUgZXF1YXRpb24uCit9IExpbmVFcXVhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckZpdExpbmVSZXBvcnRfc3RydWN0IHsKKyAgICBMaW5lRmxvYXQgICAgbGluZVNlZ21lbnQ7ICAvL0xpbmUgU2VnbWVudCByZXByZXNlbnRzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGxpbmUgZXF1YXRpb24gYW5kIHRoZSBjb250b3VyLgorICAgIExpbmVFcXVhdGlvbiBsaW5lRXF1YXRpb247IC8vTGluZSBFcXVhdGlvbiBpcyBhIHN0cnVjdHVyZSBvZiB0aHJlZSBjb2VmZmljaWVudHMgQSwgQiwgYW5kIEMgb2YgdGhlIGVxdWF0aW9uIGluIHRoZSBub3JtYWwgZm9ybSAoQXggKyBCeSArIEM9MCkgb2YgdGhlIGJlc3QgZml0IGxpbmUuCit9IENvbnRvdXJGaXRMaW5lUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDb250b3VyRml0UG9seW5vbWlhbFJlcG9ydF9zdHJ1Y3QgeworICAgIFBvaW50RG91YmxlKiBiZXN0Rml0OyAgICAgICAgICAgICAgICAvL0l0IHJldHVybnMgdGhlIHBvaW50cyBvZiB0aGUgYmVzdC1maXQgcG9seW5vbWlhbC4KKyAgICBpbnQgICAgICAgICAgbnVtYmVyT2ZQb2ludHM7ICAgICAgICAgLy9OdW1iZXIgb2YgQmVzdCBmaXQgcG9pbnRzIHJldHVybmVkLgorICAgIGRvdWJsZSogICAgICBwb2x5bm9taWFsQ29lZmZpY2llbnRzOyAvL1BvbHlub21pYWwgQ29lZmZpY2llbnRzIHJldHVybnMgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgcG9seW5vbWlhbCBlcXVhdGlvbi4KKyAgICBpbnQgICAgICAgICAgbnVtYmVyT2ZDb2VmZmljaWVudHM7ICAgLy9OdW1iZXIgb2YgQ29lZmZpY2llbnRzIHJldHVybmVkIGluIHRoZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyBhcnJheS4KK30gQ29udG91ckZpdFBvbHlub21pYWxSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpYWxDaXJjbGVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IGNlbnRlcjsgICAgIC8vQ2VudGVyIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICByYWRpdXM7ICAgICAvL1JhZGl1cyBvZiB0aGUgY2lyY2xlLgorICAgIGRvdWJsZSAgICAgc3RhcnRBbmdsZTsgLy9TdGFydCBhbmdsZSBvZiB0aGUgZml0dGVkIHN0cnVjdHVyZS4KKyAgICBkb3VibGUgICAgIGVuZEFuZ2xlOyAgIC8vRW5kIGFuZ2xlIG9mIHRoZSBmaXR0ZWQgc3RydWN0dXJlLgorfSBQYXJ0aWFsQ2lyY2xlOworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWFsRWxsaXBzZV9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgY2VudGVyOyAgICAgIC8vQ2VudGVyIG9mIHRoZSBFbGxpcHNlLgorICAgIGRvdWJsZSAgICAgYW5nbGU7ICAgICAgIC8vQW5nbGUgb2YgdGhlIGVsbGlwc2UuCisgICAgZG91YmxlICAgICBtYWpvclJhZGl1czsgLy9UaGUgbGVuZ3RoIG9mIHRoZSBzZW1pLW1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgICAgZG91YmxlICAgICBtaW5vclJhZGl1czsgLy9UaGUgbGVuZ3RoIG9mIHRoZSBzZW1pLW1pbm9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgICAgZG91YmxlICAgICBzdGFydEFuZ2xlOyAgLy9TdGFydCBhbmdsZSBvZiB0aGUgZml0dGVkIHN0cnVjdHVyZS4KKyAgICBkb3VibGUgICAgIGVuZEFuZ2xlOyAgICAvL0VuZCBhbmdsZSBvZiB0aGUgZml0dGVkIHN0cnVjdHVyZS4KK30gUGFydGlhbEVsbGlwc2U7CisKK3R5cGVkZWYgc3RydWN0IFNldHVwTWF0Y2hQYXR0ZXJuRGF0YV9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIqIG1hdGNoU2V0dXBEYXRhOyAgICAvL1N0cmluZyBjb250YWluaW5nIHRoZSBtYXRjaCBzZXR1cCBkYXRhLgorICAgIGludCAgICAgICAgICAgIG51bU1hdGNoU2V0dXBEYXRhOyAvL051bWJlciBvZiBtYXRjaCBzZXR1cCBkYXRhLgorfSBTZXR1cE1hdGNoUGF0dGVybkRhdGE7CisKK3R5cGVkZWYgc3RydWN0IFJhbmdlU2V0dGluZ0RvdWJsZV9zdHJ1Y3QgeworICAgIFNldHRpbmdUeXBlIHNldHRpbmdUeXBlOyAvL01hdGNoIENvbnN0cmFpbnRzIHNwZWNpZmllcyB0aGUgbWF0Y2ggb3B0aW9uIHdob3NlIHZhbHVlcyB5b3Ugd2FudCB0byBjb25zdHJhaW4gYnkgdGhlIGdpdmVuIHJhbmdlLgorICAgIGRvdWJsZSAgICAgIG1pbjsgICAgICAgICAvL01pbiBpcyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UgZm9yIGEgZ2l2ZW4gTWF0Y2ggQ29uc3RyYWludC4KKyAgICBkb3VibGUgICAgICBtYXg7ICAgICAgICAgLy9NYXggaXMgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlIGZvciBhIGdpdmVuIE1hdGNoIENvbnN0cmFpbnQuCit9IFJhbmdlU2V0dGluZ0RvdWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgR2VvbWV0cmljQWR2YW5jZWRTZXR1cERhdGFPcHRpb25fc3RydWN0IHsKKyAgICBHZW9tZXRyaWNTZXR1cERhdGFJdGVtIHR5cGU7ICAvL0l0IGRldGVybWluZXMgdGhlIG9wdGlvbiB5b3Ugd2FudCB0byB1c2UgZHVyaW5nIHRoZSBtYXRjaGluZyBwaGFzZS4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgIHZhbHVlOyAvL1ZhbHVlIGlzIHRoZSB2YWx1ZSBmb3IgdGhlIG9wdGlvbiB5b3Ugd2FudCB0byB1c2UgZHVyaW5nIHRoZSBtYXRjaGluZyBwaGFzZS4KK30gR2VvbWV0cmljQWR2YW5jZWRTZXR1cERhdGFPcHRpb247CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJJbmZvUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnREb3VibGUqIHBvaW50c1BpeGVsOyAgICAgICAvL1BvaW50cyAocGl4ZWwpIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgZXZlcnkgcG9pbnQgZGV0ZWN0ZWQgb24gdGhlIGN1cnZlLCBpbiBwaXhlbHMuCisgICAgdW5zaWduZWQgaW50IG51bVBvaW50c1BpeGVsOyAgICAvL051bWJlciBvZiBwb2ludHMgcGl4ZWwgZWxlbWVudHMuCisgICAgUG9pbnREb3VibGUqIHBvaW50c1JlYWw7ICAgICAgICAvL1BvaW50cyAocmVhbCkgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBldmVyeSBwb2ludCBkZXRlY3RlZCBvbiB0aGUgY3VydmUsIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgdW5zaWduZWQgaW50IG51bVBvaW50c1JlYWw7ICAgICAvL051bWJlciBvZiBwb2ludHMgcmVhbCBlbGVtZW50cy4KKyAgICBkb3VibGUqICAgICAgY3VydmF0dXJlUGl4ZWw7ICAgIC8vQ3VydmF0dXJlIFBpeGVsIGRpc3BsYXlzIHRoZSBjdXJ2YXR1cmUgcHJvZmlsZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRvdXIsIGluIHBpeGVscy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtQ3VydmF0dXJlUGl4ZWw7IC8vTnVtYmVyIG9mIGN1cnZhdHVyZSBwaXhlbHMuCisgICAgZG91YmxlKiAgICAgIGN1cnZhdHVyZVJlYWw7ICAgICAvL0N1cnZhdHVyZSBSZWFsIGRpc3BsYXlzIHRoZSBjdXJ2YXR1cmUgcHJvZmlsZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRvdXIsIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgdW5zaWduZWQgaW50IG51bUN1cnZhdHVyZVJlYWw7ICAvL051bWJlciBvZiBjdXJ2YXR1cmUgUmVhbCBlbGVtZW50cy4KKyAgICBkb3VibGUgICAgICAgbGVuZ3RoOyAgICAgICAgICAgIC8vTGVuZ3RoIChwaXhlbCkgc3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIHBpeGVscywgb2YgdGhlIGN1cnZlcyBpbiB0aGUgaW1hZ2UuCisgICAgZG91YmxlICAgICAgIGxlbmd0aFJlYWw7ICAgICAgICAvL0xlbmd0aCAocmVhbCkgc3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIGNhbGlicmF0ZWQgdW5pdHMsIG9mIHRoZSBjdXJ2ZXMgd2l0aGluIHRoZSBjdXJ2YXR1cmUgcmFuZ2UuCisgICAgdW5zaWduZWQgaW50IGhhc0VxdWF0aW9uOyAgICAgICAvL0hhcyBFcXVhdGlvbiBzcGVjaWZpZXMgd2hldGhlciB0aGUgY29udG91ciBoYXMgYSBmaXR0ZWQgZXF1YXRpb24uCit9IENvbnRvdXJJbmZvUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBST0lMYWJlbF9zdHJ1Y3QgeworICAgIGNoYXIqICAgICAgICBjbGFzc05hbWU7IC8vU3BlY2lmaWVzIHRoZSBjbGFzc25hbWUgeW91IHdhbnQgdG8gc2VnbWVudC4KKyAgICB1bnNpZ25lZCBpbnQgbGFiZWw7ICAgICAvL0xhYmVsIGlzIHRoZSBsYWJlbCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBDbGFzcyBOYW1lLgorfSBST0lMYWJlbDsKKwordHlwZWRlZiBzdHJ1Y3QgU3VwZXJ2aXNlZENvbG9yU2VnbWVudGF0aW9uUmVwb3J0X3N0cnVjdCB7CisgICAgUk9JTGFiZWwqICAgIGxhYmVsT3V0OyAgICAvL1RoZSBSb2kgbGFiZWxzIGFycmF5LgorICAgIHVuc2lnbmVkIGludCBudW1MYWJlbE91dDsgLy9UaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGxhYmVsT3V0IGFycmF5LgorfSBTdXBlcnZpc2VkQ29sb3JTZWdtZW50YXRpb25SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IExhYmVsVG9ST0lSZXBvcnRfc3RydWN0IHsKKyAgICBST0kqKiAgICAgICAgIHJvaUFycmF5OyAgICAgICAgICAgICAgICAgIC8vQXJyYXkgb2YgUk9Jcy4KKyAgICB1bnNpZ25lZCBpbnQgIG51bU9mUk9JczsgICAgICAgICAgICAgICAgIC8vTnVtYmVyIG9mIFJPSXMgaW4gdGhlIHJvaUFycmF5LgorICAgIHVuc2lnbmVkIGludCogbGFiZWxzT3V0QXJyYXk7ICAgICAgICAgICAgLy9BcnJheSBvZiBsYWJlbHMuCisgICAgdW5zaWduZWQgaW50ICBudW1PZkxhYmVsczsgICAgICAgICAgICAgICAvL051bWJlciBvZiBsYWJlbHMuCisgICAgaW50KiAgICAgICAgICBpc1Rvb01hbnlWZWN0b3JzQXJyYXk7ICAgICAvL2lzVG9vTWFueVZlY3RvcnNBcnJheSBhcnJheS4KKyAgICB1bnNpZ25lZCBpbnQgIGlzVG9vTWFueVZlY3RvcnNBcnJheVNpemU7IC8vTnVtYmVyIG9mIGVsZW1lbnRzIGluIGlzVG9vTWFueVZlY3RvcnNBcnJheS4KK30gTGFiZWxUb1JPSVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29sb3JTZWdtZW5hdGlvbk9wdGlvbnNfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgd2luZG93WDsgICAgICAgICAvL1ggaXMgdGhlIHdpbmRvdyBzaXplIGluIHggZGlyZWN0aW9uLgorICAgIHVuc2lnbmVkIGludCB3aW5kb3dZOyAgICAgICAgIC8vWSBpcyB0aGUgd2luZG93IHNpemUgaW4geSBkaXJlY3Rpb24uCisgICAgdW5zaWduZWQgaW50IHN0ZXBTaXplOyAgICAgICAgLy9TdGVwIFNpemUgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHdpbmRvd3MuCisgICAgdW5zaWduZWQgaW50IG1pblBhcnRpY2xlQXJlYTsgLy9NaW4gUGFydGljbGUgQXJlYSBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgYWxsb3dlZCBwaXhlbHMuCisgICAgdW5zaWduZWQgaW50IG1heFBhcnRpY2xlQXJlYTsgLy9NYXggUGFydGljbGUgQXJlYSBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBwaXhlbHMuCisgICAgc2hvcnQgICAgICAgIGlzRmluZVNlZ21lbnQ7ICAgLy9XaGVuIGVuYWJsZWQsIHRoZSBzdGVwIHByb2Nlc3NlcyB0aGUgYm91bmRhcnkgcGl4ZWxzIG9mIGVhY2ggc2VnbWVudGF0aW9uIGNsdXN0ZXIgdXNpbmcgYSBzdGVwIHNpemUgb2YgMS4KK30gQ29sb3JTZWdtZW5hdGlvbk9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZWRDdXJ2ZV9zdHJ1Y3QgeworICAgIGRvdWJsZSAgICAgICBsZW5ndGg7ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZSBjdXJ2ZXMgd2l0aGluIHRoZSBjdXJ2YXR1cmUgcmFuZ2UuCisgICAgZG91YmxlICAgICAgIGxlbmd0aFJlYWw7ICAgICAgIC8vc3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIGNhbGlicmF0ZWQgdW5pdHMsIG9mIHRoZSBjdXJ2ZXMgd2l0aGluIHRoZSBjdXJ2YXR1cmUgcmFuZ2UuCisgICAgZG91YmxlICAgICAgIG1heEN1cnZhdHVyZTsgICAgIC8vc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGN1cnZhdHVyZSwgaW4gcGl4ZWxzLCBmb3IgdGhlIHNlbGVjdGVkIGN1cnZhdHVyZSByYW5nZS4KKyAgICBkb3VibGUgICAgICAgbWF4Q3VydmF0dXJlUmVhbDsgLy9zcGVjaWZpZXMgdGhlIG1heGltdW0gY3VydmF0dXJlLCBpbiBjYWxpYnJhdGVkIHVuaXRzLCBmb3IgdGhlIHNlbGVjdGVkIGN1cnZhdHVyZSByYW5nZS4KKyAgICB1bnNpZ25lZCBpbnQgbGFiZWw7ICAgICAgICAgICAgLy9zcGVjaWZpZXMgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZSB0aGUgc2FtcGxlIGJlbG9uZ3MuCisgICAgUG9pbnREb3VibGUqIGN1cnZlUG9pbnRzOyAgICAgIC8vQ3VydmUgUG9pbnRzIGlzIGEgcG9pbnQtY29vcmRpbmF0ZSBjbHVzdGVyIHRoYXQgZGVmaW5lcyB0aGUgcG9pbnRzIG9mIHRoZSBjdXJ2ZS4KKyAgICB1bnNpZ25lZCBpbnQgbnVtQ3VydmVQb2ludHM7ICAgLy9OdW1iZXIgb2YgY3VydmUgcG9pbnRzLgorfSBDbGFzc2lmaWVkQ3VydmU7CisKK3R5cGVkZWYgc3RydWN0IFJhbmdlRG91YmxlX3N0cnVjdCB7CisgICAgZG91YmxlIG1pblZhbHVlOyAvL1RoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZS4KKyAgICBkb3VibGUgbWF4VmFsdWU7IC8vVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLgorfSBSYW5nZURvdWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VMYWJlbF9zdHJ1Y3QgeworICAgIFJhbmdlRG91YmxlICByYW5nZTsgLy9TcGVjaWZpZXMgdGhlIHJhbmdlIG9mIGN1cnZhdHVyZSB2YWx1ZXMuCisgICAgdW5zaWduZWQgaW50IGxhYmVsOyAvL0NsYXNzIExhYmVsIHNwZWNpZmllcyB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIHRoZSBzYW1wbGUgYmVsb25ncy4KK30gUmFuZ2VMYWJlbDsKKwordHlwZWRlZiBzdHJ1Y3QgQ3VydmF0dXJlQW5hbHlzaXNSZXBvcnRfc3RydWN0IHsKKyAgICBDbGFzc2lmaWVkQ3VydmUqIGN1cnZlczsgICAgCisgICAgdW5zaWduZWQgaW50ICAgICBudW1DdXJ2ZXM7IAorfSBDdXJ2YXR1cmVBbmFseXNpc1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRGlzcGFyaXR5X3N0cnVjdCB7CisgICAgUG9pbnREb3VibGUgY3VycmVudDsgICAvL0N1cnJlbnQgaXMgYSBhcnJheSBvZiBwb2ludHMgdGhhdCBkZWZpbmVzIHRoZSB0YXJnZXQgY29udG91ci4KKyAgICBQb2ludERvdWJsZSByZWZlcmVuY2U7IC8vcmVmZXJlbmNlIGlzIGEgYXJyYXkgb2YgcG9pbnRzIHRoYXQgZGVmaW5lcyB0aGUgdGVtcGxhdGUgY29udG91ci4KKyAgICBkb3VibGUgICAgICBkaXN0YW5jZTsgIC8vU3BlY2lmaWVzIHRoZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSB0ZW1wbGF0ZSBjb250b3VyIHBvaW50IGFuZCB0aGUgdGFyZ2V0IGNvbnRvdXIgcG9pbnQuCit9IERpc3Bhcml0eTsKKwordHlwZWRlZiBzdHJ1Y3QgQ29tcHV0ZURpc3RhbmNlc1JlcG9ydF9zdHJ1Y3QgeworICAgIERpc3Bhcml0eSogICBkaXN0YW5jZXM7ICAgICAgICAvL0Rpc3RhbmNlcyBpcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb21wdXRlZCBkaXN0YW5jZXMuCisgICAgdW5zaWduZWQgaW50IG51bURpc3RhbmNlczsgICAgIC8vTnVtYmVyIGVsZW1lbnRzIGluIHRoZSBkaXN0YW5jZXMgYXJyYXkuCisgICAgRGlzcGFyaXR5KiAgIGRpc3RhbmNlc1JlYWw7ICAgIC8vRGlzdGFuY2VzIFJlYWwgaXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29tcHV0ZWQgZGlzdGFuY2VzIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgdW5zaWduZWQgaW50IG51bURpc3RhbmNlc1JlYWw7IC8vTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJlYWwgZGlzdGFuY2VzIGFycmF5LgorfSBDb21wdXRlRGlzdGFuY2VzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBNYXRjaE1vZGVfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgcm90YXRpb247ICAvL1JvdGF0aW9uIFdoZW4gZW5hYmxlZCwgdGhlIEZ1bmN0aW9uIHNlYXJjaGVzIGZvciBvY2N1cnJlbmNlcyBvZiB0aGUgdGVtcGxhdGUgaW4gdGhlIGluc3BlY3Rpb24gaW1hZ2UsIGFsbG93aW5nIGZvciB0ZW1wbGF0ZSBtYXRjaGVzIHRvIGJlIHJvdGF0ZWQuCisgICAgdW5zaWduZWQgaW50IHNjYWxlOyAgICAgLy9Sb3RhdGlvbiBXaGVuIGVuYWJsZWQsIHRoZSBGdW5jdGlvbiBzZWFyY2hlcyBmb3Igb2NjdXJyZW5jZXMgb2YgdGhlIHRlbXBsYXRlIGluIHRoZSBpbnNwZWN0aW9uIGltYWdlLCBhbGxvd2luZyBmb3IgdGVtcGxhdGUgbWF0Y2hlcyB0byBiZSByb3RhdGVkLgorICAgIHVuc2lnbmVkIGludCBvY2NsdXNpb247IC8vT2NjbHVzaW9uIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZWFyY2ggZm9yIG9jY2x1ZGVkIHZlcnNpb25zIG9mIHRoZSBzaGFwZS4KK30gTWF0Y2hNb2RlOworCit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVkRGlzcGFyaXR5X3N0cnVjdCB7CisgICAgZG91YmxlICAgICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgLy9MZW5ndGggKHBpeGVsKSBzcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gcGl4ZWxzLCBvZiB0aGUgY3VydmVzIHdpdGhpbiB0aGUgY3VydmF0dXJlIHJhbmdlLgorICAgIGRvdWJsZSAgICAgICBsZW5ndGhSZWFsOyAgICAgICAgICAgIC8vTGVuZ3RoIChyZWFsKSBzcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gY2FsaWJyYXRlZCB1bml0cywgb2YgdGhlIGN1cnZlcyB3aXRoaW4gdGhlIGN1cnZhdHVyZSByYW5nZS4KKyAgICBkb3VibGUgICAgICAgbWF4RGlzdGFuY2U7ICAgICAgICAgICAvL01heGltdW0gRGlzdGFuY2UgKHBpeGVsKSBzcGVjaWZpZXMgdGhlIG1heGltdW0gZGlzdGFuY2UsIGluIHBpeGVscywgYmV0d2VlbiBwb2ludHMgYWxvbmcgdGhlIHNlbGVjdGVkIGNvbnRvdXIgYW5kIHRoZSB0ZW1wbGF0ZSBjb250b3VyLgorICAgIGRvdWJsZSAgICAgICBtYXhEaXN0YW5jZVJlYWw7ICAgICAgIC8vTWF4aW11bSBEaXN0YW5jZSAocmVhbCkgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGRpc3RhbmNlLCBpbiBjYWxpYnJhdGVkIHVuaXRzLCBiZXR3ZWVuIHBvaW50cyBhbG9uZyB0aGUgc2VsZWN0ZWQgY29udG91ciBhbmQgdGhlIHRlbXBsYXRlIGNvbnRvdXIuCisgICAgdW5zaWduZWQgaW50IGxhYmVsOyAgICAgICAgICAgICAgICAgLy9DbGFzcyBMYWJlbCBzcGVjaWZpZXMgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZSB0aGUgc2FtcGxlIGJlbG9uZ3MuCisgICAgUG9pbnREb3VibGUqIHRlbXBsYXRlU3Vic2VjdGlvbjsgICAgLy9UZW1wbGF0ZSBzdWJzZWN0aW9uIHBvaW50cyBpcyBhbiBhcnJheSBvZiBwb2ludHMgdGhhdCBkZWZpbmVzIHRoZSBib3VuZGFyeSBvZiB0aGUgdGVtcGxhdGUuCisgICAgdW5zaWduZWQgaW50IG51bVRlbXBsYXRlU3Vic2VjdGlvbjsgLy9OdW1iZXIgb2YgcmVmZXJlbmNlIHBvaW50cy4KKyAgICBQb2ludERvdWJsZSogdGFyZ2V0U3Vic2VjdGlvbjsgICAgICAvL0N1cnJlbnQgUG9pbnRzKFRhcmdldCBzdWJzZWN0aW9uIHBvaW50cykgaXMgYW4gYXJyYXkgb2YgcG9pbnRzIHRoYXQgZGVmaW5lcyB0aGUgYm91bmRhcnkgb2YgdGhlIHRhcmdldC4KKyAgICB1bnNpZ25lZCBpbnQgbnVtVGFyZ2V0U3Vic2VjdGlvbjsgICAvL051bWJlciBvZiBjdXJyZW50IHBvaW50cy4KK30gQ2xhc3NpZmllZERpc3Bhcml0eTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZnlEaXN0YW5jZXNSZXBvcnRfc3RydWN0IHsKKyAgICBDbGFzc2lmaWVkRGlzcGFyaXR5KiBjbGFzc2lmaWVkRGlzdGFuY2VzOyAgICAvL0Rpc3Bhcml0eSBhcnJheSBjb250YWluaW5nIHRoZSBjbGFzc2lmaWVkIGRpc3RhbmNlcy4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICBudW1DbGFzc2lmaWVkRGlzdGFuY2VzOyAvL051bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZGlzcGFyaXR5IGFycmF5LgorfSBDbGFzc2lmeURpc3RhbmNlc1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckNvbXB1dGVDdXJ2YXR1cmVSZXBvcnRfc3RydWN0IHsKKyAgICBkb3VibGUqICAgICAgY3VydmF0dXJlUGl4ZWw7ICAgIC8vQ3VydmF0dXJlIFBpeGVsIGRpc3BsYXlzIHRoZSBjdXJ2YXR1cmUgcHJvZmlsZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRvdXIsIGluIHBpeGVscy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtQ3VydmF0dXJlUGl4ZWw7IC8vTnVtYmVyIG9mIGN1cnZhdHVyZSBwaXhlbHMuCisgICAgZG91YmxlKiAgICAgIGN1cnZhdHVyZVJlYWw7ICAgICAvL0N1cnZhdHVyZSBSZWFsIGRpc3BsYXlzIHRoZSBjdXJ2YXR1cmUgcHJvZmlsZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRvdXIsIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgICAgdW5zaWduZWQgaW50IG51bUN1cnZhdHVyZVJlYWw7ICAvL051bWJlciBvZiBjdXJ2YXR1cmUgUmVhbCBlbGVtZW50cy4KK30gQ29udG91ckNvbXB1dGVDdXJ2YXR1cmVSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJPdmVybGF5U2V0dGluZ3Nfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgb3ZlcmxheTsgICAgICAgLy9PdmVybGF5IHNwZWNpZmllcyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIG92ZXJsYXkgb24gdGhlIGltYWdlLgorICAgIFJHQlZhbHVlICAgICBjb2xvcjsgICAgICAgICAvL0NvbG9yIGlzIHRoZSBjb2xvciBvZiB0aGUgb3ZlcmxheS4KKyAgICB1bnNpZ25lZCBpbnQgd2lkdGg7ICAgICAgICAgLy9XaWR0aCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBvdmVybGF5IGluIHBpeGVscy4KKyAgICB1bnNpZ25lZCBpbnQgbWFpbnRhaW5XaWR0aDsgLy9NYWludGFpbiBXaWR0aD8gc3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdGhlIG92ZXJsYXkgbWVhc3VyZWQgaW4gc2NyZWVuIHBpeGVscyBvciBpbWFnZSBwaXhlbHMuCit9IENvbnRvdXJPdmVybGF5U2V0dGluZ3M7CisKK3R5cGVkZWYgc3RydWN0IEN1cnZlUGFyYW1ldGVyc19zdHJ1Y3QgeworICAgIEV4dHJhY3Rpb25Nb2RlIGV4dHJhY3Rpb25Nb2RlOyAvL1NwZWNpZmllcyB0aGUgbWV0aG9kIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGlkZW50aWZ5IGN1cnZlcyBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgdGhyZXNob2xkOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGEgc2VlZCBwb2ludCBtdXN0IGhhdmUgaW4gb3JkZXIgdG8gYmVnaW4gYSBjdXJ2ZS4KKyAgICBFZGdlRmlsdGVyU2l6ZSBmaWx0ZXJTaXplOyAgICAgLy9TcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBlZGdlIGZpbHRlciB0aGUgZnVuY3Rpb24gdXNlcyB0byBpZGVudGlmeSBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgIG1pbkxlbmd0aDsgICAgICAvL1NwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZSBzbWFsbGVzdCBjdXJ2ZSB0aGUgZnVuY3Rpb24gd2lsbCBleHRyYWN0LgorICAgIGludCAgICAgICAgICAgIHNlYXJjaFN0ZXA7ICAgICAvL1NlYXJjaCBTdGVwIFNpemUgc3BlY2lmaWVzIHRoZSBkaXN0YW5jZSwgaW4gdGhlIHkgZGlyZWN0aW9uLCBiZXR3ZWVuIHRoZSBpbWFnZSByb3dzIHRoYXQgdGhlIGFsZ29yaXRobSBpbnNwZWN0cyBmb3IgY3VydmUgc2VlZCBwb2ludHMuCisgICAgaW50ICAgICAgICAgICAgbWF4RW5kUG9pbnRHYXA7IC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGdhcCwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSBlbmRwb2ludHMgb2YgYSBjdXJ2ZSB0aGF0IHRoZSBmdW5jdGlvbiBpZGVudGlmaWVzIGFzIGEgY2xvc2VkIGN1cnZlLgorICAgIGludCAgICAgICAgICAgIHN1YnBpeGVsOyAgICAgICAvL1N1YnBpeGVsIHNwZWNpZmllcyB3aGV0aGVyIHRvIGRldGVjdCBjdXJ2ZSBwb2ludHMgd2l0aCBzdWJwaXhlbCBhY2N1cmFjeS4KK30gQ3VydmVQYXJhbWV0ZXJzOworCit0eXBlZGVmIHN0cnVjdCBFeHRyYWN0Q29udG91clJlcG9ydF9zdHJ1Y3QgeworICAgIFBvaW50RG91YmxlKiBjb250b3VyUG9pbnRzOyAgICAvL0NvbnRvdXIgUG9pbnRzIHNwZWNpZmllcyBldmVyeSBwb2ludCBmb3VuZCBvbiB0aGUgY29udG91ci4KKyAgICBpbnQgICAgICAgICAgbnVtQ29udG91clBvaW50czsgLy9OdW1iZXIgb2YgY29udG91ciBwb2ludHMuCisgICAgUG9pbnREb3VibGUqIHNvdXJjZVBvaW50czsgICAgIC8vU291cmNlIEltYWdlIFBvaW50cyBzcGVjaWZpZXMgZXZlcnkgcG9pbnQgZm91bmQgb24gdGhlIGNvbnRvdXIgaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgbnVtU291cmNlUG9pbnRzOyAgLy9OdW1iZXIgb2Ygc291cmNlIHBvaW50cy4KK30gRXh0cmFjdENvbnRvdXJSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbm5lY3Rpb25Db25zdHJhaW50X3N0cnVjdCB7CisgICAgQ29ubmVjdGlvbkNvbnN0cmFpbnRUeXBlIGNvbnN0cmFpbnRUeXBlOyAvL0NvbnN0cmFpbnQgVHlwZSBzcGVjaWZpZXMgd2hhdCBjcml0ZXJpYSB0byB1c2UgdG8gY29uc2lkZXIgdHdvIGN1cnZlcyBwYXJ0IG9mIGEgY29udG91ci4KKyAgICBSYW5nZURvdWJsZSAgICAgICAgICAgICAgcmFuZ2U7ICAgICAgICAgIC8vU3BlY2lmaWVzIHJhbmdlIGZvciBhIGdpdmVuIE1hdGNoIENvbnN0cmFpbnQuCit9IENvbm5lY3Rpb25Db25zdHJhaW50OworCit0eXBlZGVmIHN0cnVjdCBFeHRyYWN0VGV4dHVyZUZlYXR1cmVzUmVwb3J0X3N0cnVjdCB7CisgICAgaW50KiAgICAgd2F2ZWxldEJhbmRzOyAgICAgICAgLy9UaGUgYXJyYXkgaGF2aW5nIGFsbCB0aGUgV2F2ZWxldCBCYW5rcyB1c2VkIGZvciBleHRyYWN0aW9uLgorICAgIGludCAgICAgIG51bVdhdmVsZXRCYW5kczsgICAgIC8vTnVtYmVyIG9mIHdhdmVsZXQgYmFua3MgaW4gdGhlIEFycmF5LgorICAgIGRvdWJsZSoqIHRleHR1cmVGZWF0dXJlczsgICAgIC8vMi1EIGFycmF5IHRvIHN0b3JlIGFsbCB0aGUgVGV4dHVyZSBmZWF0dXJlcyBleHRyYWN0ZWQuCisgICAgaW50ICAgICAgdGV4dHVyZUZlYXR1cmVzUm93czsgLy9OdW1iZXIgb2YgUm93cyBpbiB0aGUgVGV4dHVyZSBGZWF0dXJlcyBhcnJheS4KKyAgICBpbnQgICAgICB0ZXh0dXJlRmVhdHVyZXNDb2xzOyAvL051bWJlciBvZiBDb2xzIGluIFRleHR1cmUgRmVhdHVyZXMgYXJyYXkuCit9IEV4dHJhY3RUZXh0dXJlRmVhdHVyZXNSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFdhdmVsZXRCYW5kc1JlcG9ydF9zdHJ1Y3QgeworICAgIGZsb2F0KiogTExCYW5kOyAgLy8yLUQgYXJyYXkgZm9yIExMIEJhbmQuCisgICAgZmxvYXQqKiBMSEJhbmQ7ICAvLzItRCBhcnJheSBmb3IgTEggQmFuZC4KKyAgICBmbG9hdCoqIEhMQmFuZDsgIC8vMi1EIGFycmF5IGZvciBITCBCYW5kLgorICAgIGZsb2F0KiogSEhCYW5kOyAgLy8yLUQgYXJyYXkgZm9yIEhIIEJhbmQuCisgICAgZmxvYXQqKiBMTExCYW5kOyAvLzItRCBhcnJheSBmb3IgTExMIEJhbmQuCisgICAgZmxvYXQqKiBMTEhCYW5kOyAvLzItRCBhcnJheSBmb3IgTExIIEJhbmQuCisgICAgZmxvYXQgICBMSExCYW5kOyAvLzItRCBhcnJheSBmb3IgTEhMIEJhbmQuCisgICAgZmxvYXQqKiBMSEhCYW5kOyAvLzItRCBhcnJheSBmb3IgTEhIIEJhbmQuCisgICAgaW50ICAgICByb3dzOyAgICAvL051bWJlciBvZiBSb3dzIGZvciBlYWNoIG9mIHRoZSAyLUQgYXJyYXlzLgorICAgIGludCAgICAgY29sczsgICAgLy9OdW1iZXIgb2YgQ29sdW1ucyBmb3IgZWFjaCBvZiB0aGUgMi1EIGFycmF5cy4KK30gV2F2ZWxldEJhbmRzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDaXJjbGVGaXRPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgIG1heFJhZGl1czsgICAvL1NwZWNpZmllcyB0aGUgYWNjZXB0YWJsZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCB0aGF0IGEgcG9pbnQgZGV0ZXJtaW5lZCB0byBiZWxvbmcgdG8gdGhlIGNpcmNsZSBjYW4gYmUgZnJvbSB0aGUgcGVyaW1ldGVyIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICAgICAgIHN0ZXBTaXplOyAgICAvL1N0ZXAgU2l6ZSBpcyB0aGUgYW5nbGUsIGluIGRlZ3JlZXMsIGJldHdlZW4gZWFjaCByYWRpYWwgbGluZSBpbiB0aGUgYW5udWxhciByZWdpb24uCisgICAgUmFrZVByb2Nlc3NUeXBlIHByb2Nlc3NUeXBlOyAvL01ldGhvZCB1c2VkIHRvIHByb2Nlc3MgdGhlIGRhdGEgZXh0cmFjdGVkIGZvciBlZGdlIGRldGVjdGlvbi4KK30gQ2lyY2xlRml0T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRWRnZU9wdGlvbnMyX3N0cnVjdCB7CisgICAgRWRnZVBvbGFyaXR5U2VhcmNoTW9kZSBwb2xhcml0eTsgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHBvbGFyaXR5IG9mIHRoZSBlZGdlcyB0byBiZSBmb3VuZC4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGtlcm5lbFNpemU7ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgZWRnZSBkZXRlY3Rpb24ga2VybmVsLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGF2ZXJhZ2VkIHBlcnBlbmRpY3VsYXIgdG8gdGhlIHNlYXJjaCBkaXJlY3Rpb24gdG8gY29tcHV0ZSB0aGUgZWRnZSBwcm9maWxlIHN0cmVuZ3RoIGF0IGVhY2ggcG9pbnQgYWxvbmcgdGhlIHNlYXJjaCBST0kuCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICBtaW5UaHJlc2hvbGQ7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gZWRnZSBzdHJlbmd0aCAoZ3JhZGllbnQgbWFnbml0dWRlKSByZXF1aXJlZCBmb3IgYSBkZXRlY3RlZCBlZGdlLgorICAgIEludGVycG9sYXRpb25NZXRob2QgICAgaW50ZXJwb2xhdGlvblR5cGU7ICAgIC8vU3BlY2lmaWVzIHRoZSBpbnRlcnBvbGF0aW9uIG1ldGhvZCB1c2VkIHRvIGxvY2F0ZSB0aGUgZWRnZSBwb3NpdGlvbi4KKyAgICBDb2x1bW5Qcm9jZXNzaW5nTW9kZSAgIGNvbHVtblByb2Nlc3NpbmdNb2RlOyAvL1NwZWNpZmllcyB0aGUgbWV0aG9kIHVzZWQgdG8gZmluZCB0aGUgc3RyYWlnaHQgZWRnZS4KK30gRWRnZU9wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBGaW5kQ2lyY3VsYXJFZGdlT3B0aW9uc19zdHJ1Y3QgeworICAgIFNwb2tlRGlyZWN0aW9uIGRpcmVjdGlvbjsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBTcG9rZSBkaXJlY3Rpb24gdG8gc2VhcmNoIGluIHRoZSBST0kuCisgICAgaW50ICAgICAgICAgICAgc2hvd1NlYXJjaEFyZWE7ICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBhcmVhIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICBzaG93U2VhcmNoTGluZXM7ICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGxpbmVzIHVzZWQgdG8gbG9jYXRlIHRoZSBlZGdlcyBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgc2hvd0VkZ2VzRm91bmQ7ICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZWRnZXMgZm91bmQgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgIHNob3dSZXN1bHQ7ICAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBoaXQgbGluZXMgdG8gdGhlIG9iamVjdCBhbmQgdGhlIGVkZ2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGl0IGxpbmUgb24gdGhlIHJlc3VsdCBpbWFnZS4KKyAgICBSR0JWYWx1ZSAgICAgICBzZWFyY2hBcmVhQ29sb3I7ICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggYXJlYS4KKyAgICBSR0JWYWx1ZSAgICAgICBzZWFyY2hMaW5lc0NvbG9yOyAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggbGluZXMuCisgICAgUkdCVmFsdWUgICAgICAgc2VhcmNoRWRnZXNDb2xvcjsgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGVkZ2VzLgorICAgIFJHQlZhbHVlICAgICAgIHJlc3VsdENvbG9yOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHJlc3VsdHMuCisgICAgY2hhciogICAgICAgICAgb3ZlcmxheUdyb3VwTmFtZTsgLy9TcGVjaWZpZXMgdGhlIG92ZXJsYXkgZ3JvdXAgbmFtZSB0byBhc3NpZ24gdG8gdGhlIG92ZXJsYXlzLgorICAgIEVkZ2VPcHRpb25zMiAgIGVkZ2VPcHRpb25zOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBlZGdlIGRldGVjdGlvbiBvcHRpb25zIGFsb25nIGEgc2luZ2xlIHNlYXJjaCBsaW5lLgorfSBGaW5kQ2lyY3VsYXJFZGdlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZENvbmNlbnRyaWNFZGdlT3B0aW9uc19zdHJ1Y3QgeworICAgIENvbmNlbnRyaWNSYWtlRGlyZWN0aW9uIGRpcmVjdGlvbjsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBDb25jZW50cmljIFJha2UgZGlyZWN0aW9uLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNob3dTZWFyY2hBcmVhOyAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggYXJlYSBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2hvd1NlYXJjaExpbmVzOyAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBsaW5lcyB1c2VkIHRvIGxvY2F0ZSB0aGUgZWRnZXMgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNob3dFZGdlc0ZvdW5kOyAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGVkZ2VzIGZvdW5kIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzaG93UmVzdWx0OyAgICAgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgaGl0IGxpbmVzIHRvIHRoZSBvYmplY3QgYW5kIHRoZSBlZGdlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpdCBsaW5lIG9uIHRoZSByZXN1bHQgaW1hZ2UuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICAgc2VhcmNoQXJlYUNvbG9yOyAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGFyZWEuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICAgc2VhcmNoTGluZXNDb2xvcjsgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGxpbmVzLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgIHNlYXJjaEVkZ2VzQ29sb3I7IC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBlZGdlcy4KKyAgICBSR0JWYWx1ZSAgICAgICAgICAgICAgICByZXN1bHRDb2xvcjsgICAgICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSByZXN1bHRzLgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cE5hbWU7IC8vU3BlY2lmaWVzIHRoZSBvdmVybGF5IGdyb3VwIG5hbWUgdG8gYXNzaWduIHRvIHRoZSBvdmVybGF5cy4KKyAgICBFZGdlT3B0aW9uczIgICAgICAgICAgICBlZGdlT3B0aW9uczsgICAgICAvL1NwZWNpZmllcyB0aGUgZWRnZSBkZXRlY3Rpb24gb3B0aW9ucyBhbG9uZyBhIHNpbmdsZSBzZWFyY2ggbGluZS4KK30gRmluZENvbmNlbnRyaWNFZGdlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ29uY2VudHJpY0VkZ2VGaXRPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgIG1heFJhZGl1czsgICAvL1NwZWNpZmllcyB0aGUgYWNjZXB0YWJsZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCB0aGF0IGEgcG9pbnQgZGV0ZXJtaW5lZCB0byBiZWxvbmcgdG8gdGhlIGNpcmNsZSBjYW4gYmUgZnJvbSB0aGUgcGVyaW1ldGVyIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICAgICAgIHN0ZXBTaXplOyAgICAvL1RoZSBzYW1wbGluZyBmYWN0b3IgdGhhdCBkZXRlcm1pbmVzIHRoZSBnYXAgYmV0d2VlbiB0aGUgcmFrZSBsaW5lcy4KKyAgICBSYWtlUHJvY2Vzc1R5cGUgcHJvY2Vzc1R5cGU7IC8vTWV0aG9kIHVzZWQgdG8gcHJvY2VzcyB0aGUgZGF0YSBleHRyYWN0ZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorfSBDb25jZW50cmljRWRnZUZpdE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEZpbmRDb25jZW50cmljRWRnZVJlcG9ydF9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgc3RhcnRQdDsgICAgICAgICAgIC8vUGl4ZWwgQ29vcmRpbmF0ZXMgZm9yIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBlZGdlLgorICAgIFBvaW50RmxvYXQgZW5kUHQ7ICAgICAgICAgICAgIC8vUGl4ZWwgQ29vcmRpbmF0ZXMgZm9yIGVuZCBwb2ludCBvZiB0aGUgZWRnZS4KKyAgICBQb2ludEZsb2F0IHN0YXJ0UHRDYWxpYnJhdGVkOyAvL1JlYWwgd29ybGQgQ29vcmRpbmF0ZXMgZm9yIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBlZGdlLgorICAgIFBvaW50RmxvYXQgZW5kUHRDYWxpYnJhdGVkOyAgIC8vUmVhbCB3b3JsZCBDb29yZGluYXRlcyBmb3IgZW5kIHBvaW50IG9mIHRoZSBlZGdlLgorICAgIGRvdWJsZSAgICAgYW5nbGU7ICAgICAgICAgICAgIC8vQW5nbGUgb2YgdGhlIGVkZ2UgZm91bmQuCisgICAgZG91YmxlICAgICBhbmdsZUNhbGlicmF0ZWQ7ICAgLy9DYWxpYnJhdGVkIGFuZ2xlIG9mIHRoZSBlZGdlIGZvdW5kLgorICAgIGRvdWJsZSAgICAgc3RyYWlnaHRuZXNzOyAgICAgIC8vVGhlIHN0cmFpZ2h0bmVzcyB2YWx1ZSBvZiB0aGUgZGV0ZWN0ZWQgc3RyYWlnaHQgZWRnZS4KKyAgICBkb3VibGUgICAgIGF2Z1N0cmVuZ3RoOyAgICAgICAvL0F2ZXJhZ2Ugc3RyZW5ndGggb2YgdGhlIGVnZGUgZm91bmQuCisgICAgZG91YmxlICAgICBhdmdTTlI7ICAgICAgICAgICAgLy9BdmVyYWdlIFNOUihTaWduYWwgdG8gTm9pc2UgUmF0aW8pIGZvciB0aGUgZWRnZSBmb3VuZC4KKyAgICBpbnQgICAgICAgIGxpbmVGb3VuZDsgICAgICAgICAvL0lmIHRoZSBlZGdlIGlzIGZvdW5kIG9yIG5vdC4KK30gRmluZENvbmNlbnRyaWNFZGdlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBGaW5kQ2lyY3VsYXJFZGdlUmVwb3J0X3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBjZW50ZXJDYWxpYnJhdGVkOyAvL1JlYWwgd29ybGQgQ29vcmRpbmF0ZXMgb2YgdGhlIENlbnRlci4KKyAgICBkb3VibGUgICAgIHJhZGl1c0NhbGlicmF0ZWQ7IC8vUmVhbCB3b3JsZCByYWRpdXMgb2YgdGhlIENpcmN1bGFyIEVkZ2UgZm91bmQuCisgICAgUG9pbnRGbG9hdCBjZW50ZXI7ICAgICAgICAgICAvL1BpeGVsIENvb3JkaW5hdGVzIG9mIHRoZSBDZW50ZXIuCisgICAgZG91YmxlICAgICByYWRpdXM7ICAgICAgICAgICAvL1JhZGl1cyBpbiBwaXhlbHMgb2YgdGhlIENpcmN1bGFyIEVkZ2UgZm91bmQuCisgICAgZG91YmxlICAgICByb3VuZG5lc3M7ICAgICAgICAvL1RoZSByb3VuZG5lc3Mgb2YgdGhlIGNhbGN1bGF0ZWQgY2lyY3VsYXIgZWRnZS4KKyAgICBkb3VibGUgICAgIGF2Z1N0cmVuZ3RoOyAgICAgIC8vQXZlcmFnZSBzdHJlbmd0aCBvZiB0aGUgZWdkZSBmb3VuZC4KKyAgICBkb3VibGUgICAgIGF2Z1NOUjsgICAgICAgICAgIC8vQXZlcmFnZSBTTlIoU2lnbmFsIHRvIE5vaXNlIFJhdGlvKSBmb3IgdGhlIGVkZ2UgZm91bmQuCisgICAgaW50ICAgICAgICBjaXJjbGVGb3VuZDsgICAgICAvL0lmIHRoZSBjaXJjbHVsYXIgZWRnZSBpcyBmb3VuZCBvciBub3QuCit9IEZpbmRDaXJjdWxhckVkZ2VSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFdpbmRvd1NpemVfc3RydWN0IHsKKyAgICBpbnQgeDsgICAgICAgIC8vV2luZG93IGxlbmdodCBvbiBYIGRpcmVjdGlvbi4KKyAgICBpbnQgeTsgICAgICAgIC8vV2luZG93IGxlbmdodCBvbiBZIGRpcmVjdGlvbi4KKyAgICBpbnQgc3RlcFNpemU7IC8vRGlzdGFuY2UgYmV0d2VlbiB3aW5kb3dzLgorfSBXaW5kb3dTaXplOworCit0eXBlZGVmIHN0cnVjdCBEaXNwbGFjZW1lbnRWZWN0b3Jfc3RydWN0IHsKKyAgICBpbnQgeDsgLy9sZW5ndGggb24gWCBkaXJlY3Rpb24uCisgICAgaW50IHk7IC8vbGVuZ3RoIG9uIFkgZGlyZWN0aW9uLgorfSBEaXNwbGFjZW1lbnRWZWN0b3I7CisKK3R5cGVkZWYgc3RydWN0IFdhdmVsZXRPcHRpb25zX3N0cnVjdCB7CisgICAgV2F2ZWxldFR5cGUgdHlwZU9mV2F2ZWxldDsgLy9UeXBlIG9mIHdhdmVsZXQoZGIsIGJpb3IuCisgICAgZmxvYXQgICAgICAgbWluRW5lcmd5OyAgICAgLy9NaW5pbXVtIEVuZXJneSBpbiB0aGUgYmFuZHMgdG8gY29uc2lkZXIgZm9yIHRleHR1cmUgZGVmZWN0IGRldGVjdGlvbi4KK30gV2F2ZWxldE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENvb2NjdXJyZW5jZU9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgICAgbGV2ZWw7ICAgICAgICAvL0xldmVsL3NpemUgb2YgbWF0cml4LgorICAgIERpc3BsYWNlbWVudFZlY3RvciBkaXNwbGFjZW1lbnQ7IC8vRGlzcGxhY2VtbmV0IGJldHdlZW4gcGl4ZWxzIHRvIGFjY3VtdWxhdGUgdGhlIG1hdHJpeC4KK30gQ29vY2N1cnJlbmNlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyTG9jYWxUaHJlc2hvbGRPcHRpb25zX3N0cnVjdCB7CisgICAgTG9jYWxUaHJlc2hvbGRNZXRob2QgbWV0aG9kOyAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbG9jYWwgdGhyZXNob2xkaW5nIG1ldGhvZCB0aGUgZnVuY3Rpb24gdXNlcy4KKyAgICBQYXJ0aWNsZVR5cGUgICAgICAgICBwYXJ0aWNsZVR5cGU7ICAgIC8vU3BlY2lmaWVzIHdoYXQga2luZCBvZiBwYXJ0aWNsZXMgdG8gbG9vayBmb3IuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgd2luZG93V2lkdGg7ICAgICAvL1RoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwgb24gd2hpY2ggdGhlIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBsb2NhbCB0aHJlc2hvbGQuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgd2luZG93SGVpZ2h0OyAgICAvL1RoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIHdpbmRvdyBhcm91bmQgdGhlIHBpeGVsIG9uIHdoaWNoIHRoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgbG9jYWwgdGhyZXNob2xkLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgIGRldmlhdGlvbldlaWdodDsgLy9TcGVjaWZpZXMgdGhlIGsgY29uc3RhbnQgdXNlZCBpbiB0aGUgTmlibGFjayBsb2NhbCB0aHJlc2hvbGRpbmcgYWxnb3JpdGhtLCB3aGljaCBkZXRlcm1pbmVzIHRoZSB3ZWlnaHQgYXBwbGllZCB0byB0aGUgdmFyaWFuY2UgY2FsY3VsYXRpb24uCit9IFBhcnRpY2xlQ2xhc3NpZmllckxvY2FsVGhyZXNob2xkT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VGbG9hdF9zdHJ1Y3QgeworICAgIGZsb2F0IG1pblZhbHVlOyAvL1RoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZS4KKyAgICBmbG9hdCBtYXhWYWx1ZTsgLy9UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UuCit9IFJhbmdlRmxvYXQ7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllckF1dG9UaHJlc2hvbGRPcHRpb25zX3N0cnVjdCB7CisgICAgVGhyZXNob2xkTWV0aG9kIG1ldGhvZDsgICAgICAgLy9UaGUgbWV0aG9kIGZvciBiaW5hcnkgdGhyZXNob2xkaW5nLCB3aGljaCBzcGVjaWZpZXMgaG93IHRvIGNhbGN1bGF0ZSB0aGUgY2xhc3Nlcy4KKyAgICBQYXJ0aWNsZVR5cGUgICAgcGFydGljbGVUeXBlOyAvL1NwZWNpZmllcyB3aGF0IGtpbmQgb2YgcGFydGljbGVzIHRvIGxvb2sgZm9yLgorICAgIFJhbmdlRmxvYXQgICAgICBsaW1pdHM7ICAgICAgIC8vVGhlIGxpbWl0cyBvbiB0aGUgYXV0b21hdGljIHRocmVzaG9sZCByYW5nZS4KK30gUGFydGljbGVDbGFzc2lmaWVyQXV0b1RocmVzaG9sZE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zMl9zdHJ1Y3QgeworICAgIFBhcnRpY2xlQ2xhc3NpZmllclRocmVzaG9sZFR5cGUgICAgICAgICB0aHJlc2hvbGRUeXBlOyAgICAgICAgIC8vVGhlIHR5cGUgb2YgdGhyZXNob2xkIHRvIHBlcmZvcm0gb24gdGhlIGltYWdlLgorICAgIFJhbmdlRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51YWxUaHJlc2hvbGRSYW5nZTsgIC8vVGhlIHJhbmdlIG9mIHBpeGVscyB0byBrZWVwIGlmIG1hbnVhbGx5IHRocmVzaG9sZGluZyB0aGUgaW1hZ2UuCisgICAgUGFydGljbGVDbGFzc2lmaWVyQXV0b1RocmVzaG9sZE9wdGlvbnMgIGF1dG9UaHJlc2hvbGRPcHRpb25zOyAgLy9UaGUgb3B0aW9ucyB1c2VkIHRvIGF1dG8gdGhyZXNob2xkIHRoZSBpbWFnZS4KKyAgICBQYXJ0aWNsZUNsYXNzaWZpZXJMb2NhbFRocmVzaG9sZE9wdGlvbnMgbG9jYWxUaHJlc2hvbGRPcHRpb25zOyAvL1RoZSBvcHRpb25zIHVzZWQgdG8gbG9jYWwgdGhyZXNob2xkIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0Qm9yZGVyOyAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byByZWplY3QgYm9yZGVyIHBhcnRpY2xlcy4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRXJvc2lvbnM7ICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgZXJvc2lvbnMgdG8gcGVyZm9ybS4KK30gUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBNZWFzdXJlUGFydGljbGVzUmVwb3J0X3N0cnVjdCB7CisgICAgZG91YmxlKiogcGl4ZWxNZWFzdXJlbWVudHM7ICAgICAgLy9UaGUgbWVhc3VyZW1lbnRzIG9uIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIGltYWdlLCBpbiBwaXhlbCBjb29yZGluYXRlcy4KKyAgICBkb3VibGUqKiBjYWxpYnJhdGVkTWVhc3VyZW1lbnRzOyAvL1RoZSBtZWFzdXJlbWVudHMgb24gdGhlIHBhcnRpY2xlcyBpbiB0aGUgaW1hZ2UsIGluIHJlYWwtd29ybGQgY29vcmRpbmF0ZXMuCisgICAgc2l6ZV90ICAgbnVtUGFydGljbGVzOyAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBvbiB3aGljaCBtZWFzdXJlbWVudHMgd2VyZSB0YWtlbi4KKyAgICBzaXplX3QgICBudW1NZWFzdXJlbWVudHM7ICAgICAgICAvL1RoZSBudW1iZXIgb2YgbWVhc3VyZW1lbnRzIHRha2VuLgorfSBNZWFzdXJlUGFydGljbGVzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gzX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgICAgICAgICAgICAgICAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGVtcGxhdGUgaW4gdGhlIG1hdGNoLgorICAgIGZsb2F0ICAgICAgcm90YXRpb247ICAgICAgICAgICAgICAgIC8vVGhlIHJvdGF0aW9uIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgdGVtcGxhdGUgaW1hZ2UsIGluIGRlZ3JlZXMuCisgICAgZmxvYXQgICAgICBzY2FsZTsgICAgICAgICAgICAgICAgICAgLy9UaGUgc2l6ZSBvZiB0aGUgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHRlbXBsYXRlIGltYWdlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLgorICAgIGZsb2F0ICAgICAgc2NvcmU7ICAgICAgICAgICAgICAgICAgIC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaC4KKyAgICBQb2ludEZsb2F0IGNvcm5lcls0XTsgICAgICAgICAgICAgICAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZSBzdXJyb3VuZGluZyB0aGUgdGVtcGxhdGUgaW1hZ2UuCisgICAgaW50ICAgICAgICBpbnZlcnNlOyAgICAgICAgICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgbWF0Y2ggaXMgYW4gaW52ZXJzZSBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UuCisgICAgZmxvYXQgICAgICBvY2NsdXNpb247ICAgICAgICAgICAgICAgLy9UaGUgcGVyY2VudGFnZSBvZiB0aGUgbWF0Y2ggdGhhdCBpcyBvY2NsdWRlZC4KKyAgICBmbG9hdCAgICAgIHRlbXBsYXRlTWF0Y2hDdXJ2ZVNjb3JlOyAvL1RoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkgY29tcGFyaW5nIHRoZSB0ZW1wbGF0ZSBjdXJ2ZXMgdG8gdGhlIGN1cnZlcyBpbiB0aGUgbWF0Y2ggcmVnaW9uLgorICAgIGZsb2F0ICAgICAgbWF0Y2hUZW1wbGF0ZUN1cnZlU2NvcmU7IC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieSBjb21wYXJpbmcgdGhlIGN1cnZlcyBpbiB0aGUgbWF0Y2ggcmVnaW9uIHRvIHRoZSB0ZW1wbGF0ZSBjdXJ2ZXMuCisgICAgZmxvYXQgICAgICBjb3JyZWxhdGlvblNjb3JlOyAgICAgICAgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5IGNvbXBhcmluZyB0aGUgdGVtcGxhdGUgaW1hZ2UgdG8gdGhlIG1hdGNoIHJlZ2lvbiB1c2luZyBhIGNvcnJlbGF0aW9uIG1ldHJpYyB0aGF0IGNvbXBhcmVzIHRoZSB0d28gcmVnaW9ucyBhcyBhIGZ1bmN0aW9uIG9mIHRoZWlyIHBpeGVsIHZhbHVlcy4KKyAgICBQb2ludEZsb2F0IGNhbGlicmF0ZWRQb3NpdGlvbjsgICAgICAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgbWF0Y2guCisgICAgZmxvYXQgICAgICBjYWxpYnJhdGVkUm90YXRpb247ICAgICAgLy9UaGUgcm90YXRpb24gb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSB0ZW1wbGF0ZSBpbWFnZSwgaW4gZGVncmVlcy4KKyAgICBQb2ludEZsb2F0IGNhbGlicmF0ZWRDb3JuZXJbNF07ICAgICAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZSBzdXJyb3VuZGluZyB0aGUgdGVtcGxhdGUgaW1hZ2UuCit9IEdlb21ldHJpY1BhdHRlcm5NYXRjaDM7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczNfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHN1YnBpeGVsSXRlcmF0aW9uczsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIHVzZWQgdG8gcmVmaW5lIG1hdGNoZXMgd2l0aCBzdWJwaXhlbCBpbmZvcm1hdGlvbi4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBpeGVsVG9sZXJhbmNlOyAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2hhbmdlLCBpbiBwaXhlbHMsIGJldHdlZW4gY29uc2VjdXRpdmUgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIGluIHRoZSBtYXRjaCBwb3NpdGlvbiBiZWZvcmUgdGhlIGZ1bmN0aW9uIHN0b3BzIHJlZmluaW5nIHRoZSBtYXRjaCBwb3NpdGlvbi4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIGluaXRpYWxNYXRjaExpc3RMZW5ndGg7ICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRjaCBsaXN0LgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VGVtcGxhdGVDdXJ2ZVNjb3JlOyAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSB0aGUgbWF0Y2ggY3VydmUgdG8gdGVtcGxhdGUgY3VydmUgc2NvcmUgYW5kIHJldHVybiBpdCBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvblNjb3JlOyAgICAgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBjb3JyZWxhdGlvbiBzY29yZSBhbmQgcmV0dXJuIGl0IGZvciBlYWNoIG1hdGNoIHJlc3VsdC4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk1hdGNoU2VwYXJhdGlvbkRpc3RhbmNlOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBzZXBhcmF0aW9uIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIG9yaWdpbnMgb2YgdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBwb3NpdGlvbnMuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5NYXRjaFNlcGFyYXRpb25BbmdsZTsgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gYW5ndWxhciBkaWZmZXJlbmNlLCBpbiBkZWdyZWVzLCBiZXR3ZWVuIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgYW5nbGVzLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgbWluTWF0Y2hTZXBhcmF0aW9uU2NhbGU7ICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGRpZmZlcmVuY2UgaW4gc2NhbGUsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIGJldHdlZW4gdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBzY2FsZXMuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhNYXRjaE92ZXJsYXA7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIG92ZXJsYXAsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIGFsbG93ZWQgYmV0d2VlbiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlcyBvZiB0d28gdW5pcXVlIG1hdGNoZXMuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Fyc2VSZXN1bHQ7ICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgZnVuY3Rpb24gdG8gc3BlbmQgbGVzcyB0aW1lIGFjY3VyYXRlbHkgZXN0aW1hdGluZyB0aGUgbG9jYXRpb24gb2YgYSBtYXRjaC4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUNhbGlicmF0aW9uU3VwcG9ydDsgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoZSBhbGdvcml0aG0gdHJlYXQgdGhlIGluc3BlY3Rpb24gaW1hZ2UgYXMgYSBjYWxpYnJhdGVkIGltYWdlLgorICAgIENvbnRyYXN0TW9kZSAgICAgICAgICAgICAgICAgICAgZW5hYmxlQ29udHJhc3RSZXZlcnNhbDsgICAgIC8vVXNlIHRoaXMgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBjb250cmFzdCBvZiB0aGUgbWF0Y2hlcyB0byBzZWFyY2ggZm9yIGluIHRoZSBpbWFnZS4KKyAgICBHZW9tZXRyaWNNYXRjaGluZ1NlYXJjaFN0cmF0ZWd5IG1hdGNoU3RyYXRlZ3k7ICAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgYWdncmVzc2l2ZW5lc3Mgb2YgdGhlIHNlYXJjaCBzdHJhdGVneS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHJlZmluZU1hdGNoRmFjdG9yOyAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmFjdG9yIHRoYXQgaXMgYXBwbGllZCB0byB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgdGhhdCBhcmUgcmVmaW5lZCBhdCB0aGUgaW5pdGlhbCBtYXRjaGluZyBzdGFnZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHN1YnBpeGVsTWF0Y2hGYWN0b3I7ICAgICAgICAvL1NwZWNpZmllcyB0aGUgZmFjdG9yIHRoYXQgaXMgYXBwbGllZCB0byB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgdGhhdCBhcmUgZXZhbHVhdGVkIGF0IHRoZSBmaW5hbCBzdWJwaXhlbCBtYXRjaGluZyBzdGFnZS4KK30gTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMzsKKwordHlwZWRlZiBzdHJ1Y3QgQ29sb3JPcHRpb25zX3N0cnVjdCB7CisgICAgQ29sb3JDbGFzc2lmaWNhdGlvblJlc29sdXRpb24gY29sb3JDbGFzc2lmaWNhdGlvblJlc29sdXRpb247IC8vU3BlY2lmaWVzIHRoZSBjb2xvciByZXNvbHV0aW9uIG9mIHRoZSBjbGFzc2lmaWVyLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgIHVzZUx1bWluYW5jZTsgICAgICAgICAgICAgICAgICAvL1NwZWNpZmllcyBpZiB0aGUgbHVtaW5hbmNlIGJhbmQgaXMgZ29pbmcgdG8gYmUgdXNlZCBpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCisgICAgQ29sb3JNb2RlICAgICAgICAgICAgICAgICAgICAgY29sb3JNb2RlOyAgICAgICAgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBjb2xvciBtb2RlIG9mIHRoZSBjbGFzc2lmaWVyLgorfSBDb2xvck9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFNhbXBsZVNjb3JlX3N0cnVjdCB7CisgICAgY2hhciogICAgICAgIGNsYXNzTmFtZTsgLy9UaGUgbmFtZSBvZiB0aGUgY2xhc3MuCisgICAgZmxvYXQgICAgICAgIGRpc3RhbmNlOyAgLy9UaGUgZGlzdGFuY2UgZnJvbSB0aGUgaXRlbSB0byB0aGlzIGNsYXNzLgorICAgIHVuc2lnbmVkIGludCBpbmRleDsgICAgIC8vaW5kZXggb2YgdGhpcyBzYW1wbGUuCit9IFNhbXBsZVNjb3JlOworCit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVyUmVwb3J0QWR2YW5jZWRfc3RydWN0IHsKKyAgICBjaGFyKiAgICAgICAgYmVzdENsYXNzTmFtZTsgICAgICAgLy9UaGUgbmFtZSBvZiB0aGUgYmVzdCBjbGFzcyBmb3IgdGhlIHNhbXBsZS4KKyAgICBmbG9hdCAgICAgICAgY2xhc3NpZmljYXRpb25TY29yZTsgLy9UaGUgc2ltaWxhcml0eSBvZiB0aGUgc2FtcGxlIGFuZCB0aGUgdHdvIGNsb3Nlc3QgY2xhc3NlcyBpbiB0aGUgY2xhc3NpZmllci4KKyAgICBmbG9hdCAgICAgICAgaWRlbnRpZmljYXRpb25TY29yZTsgLy9UaGUgc2ltaWxhcml0eSBvZiB0aGUgc2FtcGxlIGFuZCB0aGUgYXNzaWduZWQgY2xhc3MuCisgICAgQ2xhc3NTY29yZSogIGFsbFNjb3JlczsgICAgICAgICAgIC8vQWxsIGNsYXNzZXMgYW5kIHRoZWlyIHNjb3Jlcy4KKyAgICBpbnQgICAgICAgICAgYWxsU2NvcmVzU2l6ZTsgICAgICAgLy9UaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYWxsU2NvcmVzLgorICAgIFNhbXBsZVNjb3JlKiBzYW1wbGVTY29yZXM7ICAgICAgICAvL0FsbCBzYW1wbGVzIGFuZCB0aGVpciBzY29yZXMuCisgICAgaW50ICAgICAgICAgIHNhbXBsZVNjb3Jlc1NpemU7ICAgIC8vVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHNhbXBsZVNjb3Jlcy4KK30gQ2xhc3NpZmllclJlcG9ydEFkdmFuY2VkOworCit0eXBlZGVmIHN0cnVjdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyX3N0cnVjdCB7CisgICAgZG91YmxlICAgICAgIG1pblNjYWxlRmFjdG9yOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gc2NhbGUgZmFjdG9yIHRoYXQgdGhlIHRlbXBsYXRlIGlzIGxlYXJuZWQgZm9yLgorICAgIGRvdWJsZSAgICAgICBtYXhTY2FsZUZhY3RvcjsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNjYWxlIGZhY3RvciB0aGUgdGVtcGxhdGUgaXMgbGVhcm5lZCBmb3IuCisgICAgZG91YmxlICAgICAgIG1pblJvdGF0aW9uQW5nbGVWYWx1ZTsgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gcm90YXRpb24gYW5nbGUgdGhlIHRlbXBsYXRlIGlzIGxlYXJuZWQgZm9yLgorICAgIGRvdWJsZSAgICAgICBtYXhSb3RhdGlvbkFuZ2xlVmFsdWU7IC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHJvdGF0aW9uIGFuZ2xlIHRoZSB0ZW1wbGF0ZSBpcyBsZWFybmVkIGZvci4KKyAgICB1bnNpZ25lZCBpbnQgaW1hZ2VTYW1wbGluZ0ZhY3RvcjsgICAvL1NwZWNpZmllcyB0aGUgZmFjdG9yIHRoYXQgaXMgdXNlZCB0byBzdWJzYW1wbGUgdGhlIHRlbXBsYXRlIGFuZCB0aGUgaW1hZ2UgZm9yIHRoZSBpbml0aWFsIG1hdGNoaW5nIHBoYXNlLgorfSBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnMyX3N0cnVjdCB7CisgICAgaW50IHJlamVjdE1hdGNoZXM7IC8vU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gdHJhbnNmZXIgb25seSB0aG9zZSBwYXJ0aWNsZXMgdGhhdCBkbyBub3QgbWVldCBhbGwgdGhlIGNyaXRlcmlhLgorICAgIGludCByZWplY3RCb3JkZXI7ICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byByZWplY3QgYm9yZGVyIHBhcnRpY2xlcy4KKyAgICBpbnQgZmlsbEhvbGVzOyAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gZmlsbCBob2xlcyBpbiBwYXJ0aWNsZXMuCisgICAgaW50IGNvbm5lY3Rpdml0eTg7IC8vU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gdXNlIGNvbm5lY3Rpdml0eS04IHRvIGRldGVybWluZSB3aGV0aGVyIHBhcnRpY2xlcyBhcmUgdG91Y2hpbmcuCit9IFBhcnRpY2xlRmlsdGVyT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IEZpbmRFZGdlT3B0aW9uczJfc3RydWN0IHsKKyAgICBSYWtlRGlyZWN0aW9uIGRpcmVjdGlvbjsgICAgICAgIC8vVGhlIGRpcmVjdGlvbiB0byBzZWFyY2ggaW4gdGhlIFJPSS4KKyAgICBpbnQgICAgICAgICAgIHNob3dTZWFyY2hBcmVhOyAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggYXJlYSBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICBzaG93U2VhcmNoTGluZXM7ICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGxpbmVzIHVzZWQgdG8gbG9jYXRlIHRoZSBlZGdlcyBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICBzaG93RWRnZXNGb3VuZDsgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgbG9jYXRpb25zIG9mIHRoZSBlZGdlcyBmb3VuZCBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICBzaG93UmVzdWx0OyAgICAgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgaGl0IGxpbmVzIHRvIHRoZSBvYmplY3QgYW5kIHRoZSBlZGdlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpdCBsaW5lIG9uIHRoZSByZXN1bHQgaW1hZ2UuCisgICAgUkdCVmFsdWUgICAgICBzZWFyY2hBcmVhQ29sb3I7ICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggYXJlYS4KKyAgICBSR0JWYWx1ZSAgICAgIHNlYXJjaExpbmVzQ29sb3I7IC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBsaW5lcy4KKyAgICBSR0JWYWx1ZSAgICAgIHNlYXJjaEVkZ2VzQ29sb3I7IC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBlZGdlcy4KKyAgICBSR0JWYWx1ZSAgICAgIHJlc3VsdENvbG9yOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHJlc3VsdHMuCisgICAgY2hhciogICAgICAgICBvdmVybGF5R3JvdXBOYW1lOyAvL1NwZWNpZmllcyB0aGUgb3ZlcmxheSBncm91cCBuYW1lIHRvIGFzc2lnbiB0byB0aGUgb3ZlcmxheXMuCisgICAgRWRnZU9wdGlvbnMyICBlZGdlT3B0aW9uczsgICAgICAvL1NwZWNpZmllcyB0aGUgZWRnZSBkZXRlY3Rpb24gb3B0aW9ucyBhbG9uZyBhIHNpbmdsZSBzZWFyY2ggbGluZS4KK30gRmluZEVkZ2VPcHRpb25zMjsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZEVkZ2VSZXBvcnRfc3RydWN0IHsKKyAgICBTdHJhaWdodEVkZ2UqIHN0cmFpZ2h0RWRnZXM7ICAgIC8vQW4gYXJyYXkgb2Ygc3RyYWlnaHQgZWRnZXMgZGV0ZWN0ZWQuCisgICAgdW5zaWduZWQgaW50ICBudW1TdHJhaWdodEVkZ2VzOyAvL0luZGljYXRlcyB0aGUgbnVtYmVyIG9mIHN0cmFpZ2h0IGVkZ2VzIGZvdW5kLgorfSBGaW5kRWRnZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZFRyYW5zZm9ybVJlY3RPcHRpb25zMl9zdHJ1Y3QgeworICAgIEZpbmRSZWZlcmVuY2VEaXJlY3Rpb24gZGlyZWN0aW9uOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpcmVjdGlvbiBhbmQgb3JpZW50YXRpb24gaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgcHJpbWFyeSBheGlzLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgc2hvd1NlYXJjaEFyZWE7ICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBhcmVhIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNob3dTZWFyY2hMaW5lczsgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggbGluZXMgdXNlZCB0byBsb2NhdGUgdGhlIGVkZ2VzIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNob3dFZGdlc0ZvdW5kOyAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGVkZ2VzIGZvdW5kIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNob3dSZXN1bHQ7ICAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBoaXQgbGluZXMgdG8gdGhlIG9iamVjdCBhbmQgdGhlIGVkZ2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGl0IGxpbmUgb24gdGhlIHJlc3VsdCBpbWFnZS4KKyAgICBSR0JWYWx1ZSAgICAgICAgICAgICAgIHNlYXJjaEFyZWFDb2xvcjsgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBhcmVhLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgc2VhcmNoTGluZXNDb2xvcjsgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGxpbmVzLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgc2VhcmNoRWRnZXNDb2xvcjsgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgc2VhcmNoIGVkZ2VzLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgcmVzdWx0Q29sb3I7ICAgICAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgcmVzdWx0cy4KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cE5hbWU7IC8vU3BlY2lmaWVzIHRoZSBvdmVybGF5IGdyb3VwIG5hbWUgdG8gYXNzaWduIHRvIHRoZSBvdmVybGF5cy4KKyAgICBFZGdlT3B0aW9uczIgICAgICAgICAgIGVkZ2VPcHRpb25zOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBlZGdlIGRldGVjdGlvbiBvcHRpb25zIGFsb25nIGEgc2luZ2xlIHNlYXJjaCBsaW5lLgorfSBGaW5kVHJhbnNmb3JtUmVjdE9wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBGaW5kVHJhbnNmb3JtUmVjdHNPcHRpb25zMl9zdHJ1Y3QgeworICAgIEZpbmRSZWZlcmVuY2VEaXJlY3Rpb24gZGlyZWN0aW9uOyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBkaXJlY3Rpb24gYW5kIG9yaWVudGF0aW9uIGluIHdoaWNoIHRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdGhlIHByaW1hcnkgYXhpcy4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNob3dTZWFyY2hBcmVhOyAgICAgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGFyZWEgb24gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgc2hvd1NlYXJjaExpbmVzOyAgICAgIC8vSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggbGluZXMgdXNlZCB0byBsb2NhdGUgdGhlIGVkZ2VzIG9uIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNob3dFZGdlc0ZvdW5kOyAgICAgICAvL0lmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgbG9jYXRpb25zIG9mIHRoZSBlZGdlcyBmb3VuZCBvbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICBzaG93UmVzdWx0OyAgICAgICAgICAgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGhpdCBsaW5lcyB0byB0aGUgb2JqZWN0IGFuZCB0aGUgZWRnZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaXQgbGluZSBvbiB0aGUgcmVzdWx0IGltYWdlLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgc2VhcmNoQXJlYUNvbG9yOyAgICAgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBhcmVhLgorICAgIFJHQlZhbHVlICAgICAgICAgICAgICAgc2VhcmNoTGluZXNDb2xvcjsgICAgIC8vU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlIHNlYXJjaCBsaW5lcy4KKyAgICBSR0JWYWx1ZSAgICAgICAgICAgICAgIHNlYXJjaEVkZ2VzQ29sb3I7ICAgICAvL1NwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZSBzZWFyY2ggZWRnZXMuCisgICAgUkdCVmFsdWUgICAgICAgICAgICAgICByZXN1bHRDb2xvcjsgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUgcmVzdWx0cy4KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cE5hbWU7ICAgICAvL1NwZWNpZmllcyB0aGUgb3ZlcmxheSBncm91cCBuYW1lIHRvIGFzc2lnbiB0byB0aGUgb3ZlcmxheXMuCisgICAgRWRnZU9wdGlvbnMyICAgICAgICAgICBwcmltYXJ5RWRnZU9wdGlvbnM7ICAgLy9TcGVjaWZpZXMgdGhlIHBhcmFtZXRlcnMgdXNlZCB0byBjb21wdXRlIHRoZSBlZGdlIGdyYWRpZW50IGluZm9ybWF0aW9uIGFuZCBkZXRlY3QgdGhlIGVkZ2VzIGZvciB0aGUgcHJpbWFyeSBST0kuCisgICAgRWRnZU9wdGlvbnMyICAgICAgICAgICBzZWNvbmRhcnlFZGdlT3B0aW9uczsgLy9TcGVjaWZpZXMgdGhlIHBhcmFtZXRlcnMgdXNlZCB0byBjb21wdXRlIHRoZSBlZGdlIGdyYWRpZW50IGluZm9ybWF0aW9uIGFuZCBkZXRlY3QgdGhlIGVkZ2VzIGZvciB0aGUgc2Vjb25kYXJ5IFJPSS4KK30gRmluZFRyYW5zZm9ybVJlY3RzT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0M19zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICByZWFkU3RyaW5nOyAgICAgICAgICAgIC8vVGhlIHJlYWQgc3RyaW5nLgorICAgIENoYXJSZXBvcnQzKiBjaGFyYWN0ZXJSZXBvcnQ7ICAgICAgIC8vQW4gYXJyYXkgb2YgcmVwb3J0cyBkZXNjcmliaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggaWRlbnRpZmllZCBjaGFyYWN0ZXIuCisgICAgaW50ICAgICAgICAgIG51bUNoYXJhY3RlclJlcG9ydHM7ICAgLy9UaGUgbnVtYmVyIG9mIGlkZW50aWZpZWQgY2hhcmFjdGVycy4KKyAgICBST0kqICAgICAgICAgcm9pQm91bmRpbmdDaGFyYWN0ZXJzOyAvL0FuIGFycmF5IHNwZWNpZnlpbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjaGFyYWN0ZXIgYm91bmRpbmcgUk9JLgorfSBSZWFkVGV4dFJlcG9ydDM7CisKK3R5cGVkZWYgc3RydWN0IENoYXJhY3RlclN0YXRpc3RpY3Nfc3RydWN0IHsKKyAgICBpbnQgbGVmdDsgICAgICAgICAgLy9UaGUgbGVmdCBvZmZzZXQgb2YgdGhlIGNoYXJhY3RlciBib3VuZGluZyByZWN0YW5nbGVzIGluIHRoZSBjdXJyZW50IFJPSS4KKyAgICBpbnQgdG9wOyAgICAgICAgICAgLy9UaGUgdG9wIG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZXMgaW4gdGhlIGN1cnJlbnQgUk9JLgorICAgIGludCB3aWR0aDsgICAgICAgICAvL1RoZSB3aWR0aCBvZiBlYWNoIG9mIHRoZSBjaGFyYWN0ZXJzIHlvdSB0cmFpbmVkIGluIHRoZSBjdXJyZW50IFJPSS4KKyAgICBpbnQgaGVpZ2h0OyAgICAgICAgLy9UaGUgaGVpZ2h0IG9mIGVhY2ggdHJhaW5lZCBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQgUk9JLgorICAgIGludCBjaGFyYWN0ZXJTaXplOyAvL1RoZSBzaXplIG9mIHRoZSBjaGFyYWN0ZXIgaW4gcGl4ZWxzLgorfSBDaGFyYWN0ZXJTdGF0aXN0aWNzOworCit0eXBlZGVmIHN0cnVjdCBDaGFyUmVwb3J0M19zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICAgICAgICAgY2hhcmFjdGVyOyAgICAgICAgICAgLy9UaGUgY2hhcmFjdGVyIHZhbHVlLgorICAgIGludCAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb25TY29yZTsgLy9UaGUgZGVncmVlIHRvIHdoaWNoIHRoZSBhc3NpZ25lZCBjaGFyYWN0ZXIgY2xhc3MgcmVwcmVzZW50cyB0aGUgb2JqZWN0IGJldHRlciB0aGFuIHRoZSBvdGhlciBjaGFyYWN0ZXIgY2xhc3NlcyBpbiB0aGUgY2hhcmFjdGVyIHNldC4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvblNjb3JlOyAgIC8vVGhlIHNpbWlsYXJpdHkgb2YgdGhlIGNoYXJhY3RlciBhbmQgdGhlIHJlZmVyZW5jZSBjaGFyYWN0ZXIgZm9yIHRoZSBjaGFyYWN0ZXIgY2xhc3MuCisgICAgaW50ICAgICAgICAgICAgICAgICB2ZXJpZmllZDsgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIGEgcmVmZXJlbmNlIGNoYXJhY3RlciB3YXMgZm91bmQgZm9yIHRoZSBjaGFyYWN0ZXIgY2xhc3MgYW5kIEZBTFNFIGlmIGEgcmVmZXJlbmNlIGNoYXJhY3RlciB3YXMgbm90IGZvdW5kLgorICAgIGludCAgICAgICAgICAgICAgICAgbG93VGhyZXNob2xkOyAgICAgICAgLy9UaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkIHJhbmdlIHVzZWQgZm9yIHRoaXMgY2hhcmFjdGVyLgorICAgIGludCAgICAgICAgICAgICAgICAgaGlnaFRocmVzaG9sZDsgICAgICAgLy9UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkIHJhbmdlIHVzZWQgZm9yIHRoaXMgY2hhcmFjdGVyLgorICAgIENoYXJhY3RlclN0YXRpc3RpY3MgY2hhcmFjdGVyU3RhdHM7ICAgICAgLy9EZXNjcmliZXMgdGhlIGNoYXJhY3RlcnMgc2VnbWVudGVkIGluIHRoZSBST0kuCit9IENoYXJSZXBvcnQzOworCit0eXBlZGVmIHN0cnVjdCBBcmNJbmZvMl9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgY2VudGVyOyAgICAgLy9UaGUgY2VudGVyIHBvaW50IG9mIHRoZSBhcmMuCisgICAgZG91YmxlICAgICByYWRpdXM7ICAgICAvL1RoZSByYWRpdXMgb2YgdGhlIGFyYy4KKyAgICBkb3VibGUgICAgIHN0YXJ0QW5nbGU7IC8vVGhlIHN0YXJ0aW5nIGFuZ2xlIG9mIHRoZSBhcmMsIHNwZWNpZmllZCBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIHRoZSB4LWF4aXMuCisgICAgZG91YmxlICAgICBlbmRBbmdsZTsgICAvL1RoZSBlbmRpbmcgYW5nbGUgb2YgdGhlIGFyYywgc3BlY2lmaWVkIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIHgtYXhpcy4KK30gQXJjSW5mbzI7CisKK3R5cGVkZWYgc3RydWN0IEVkZ2VSZXBvcnQyX3N0cnVjdCB7CisgICAgRWRnZUluZm8qICAgIGVkZ2VzOyAgICAgICAgICAgIC8vQW4gYXJyYXkgb2YgZWRnZXMgZGV0ZWN0ZWQuCisgICAgdW5zaWduZWQgaW50IG51bUVkZ2VzOyAgICAgICAgIC8vSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZWRnZXMgZGV0ZWN0ZWQuCisgICAgZG91YmxlKiAgICAgIGdyYWRpZW50SW5mbzsgICAgIC8vQW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgY2FsY3VsYXRlZCBlZGdlIHN0cmVuZ3RocyBhbG9uZyB0aGUgdXNlci1kZWZpbmVkIHNlYXJjaCBhcmVhLgorICAgIHVuc2lnbmVkIGludCBudW1HcmFkaWVudEluZm87ICAvL0luZGljYXRlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiBncmFkaWVudEluZm8uCisgICAgaW50ICAgICAgICAgIGNhbGlicmF0aW9uVmFsaWQ7IC8vSW5kaWNhdGVzIGlmIHRoZSBjYWxpYnJhdGlvbiBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBlZGdlcyBpcyBjb3JyZWN0LgorfSBFZGdlUmVwb3J0MjsKKwordHlwZWRlZiBzdHJ1Y3QgU2VhcmNoQXJjSW5mb19zdHJ1Y3QgeworICAgIEFyY0luZm8yICAgIGFyY0Nvb3JkaW5hdGVzOyAvL0Rlc2NyaWJlcyB0aGUgYXJjIHVzZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorICAgIEVkZ2VSZXBvcnQyIGVkZ2VSZXBvcnQ7ICAgICAvL0Rlc2NyaWJlcyB0aGUgZWRnZXMgZm91bmQgaW4gdGhpcyBzZWFyY2ggbGluZS4KK30gU2VhcmNoQXJjSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQ29uY2VudHJpY1Jha2VSZXBvcnQyX3N0cnVjdCB7CisgICAgRWRnZUluZm8qICAgICAgZmlyc3RFZGdlczsgICAgLy9UaGUgZmlyc3QgZWRnZSBwb2ludCBkZXRlY3RlZCBhbG9uZyBlYWNoIHNlYXJjaCBsaW5lIGluIHRoZSBST0kuCisgICAgdW5zaWduZWQgaW50ICAgbnVtRmlyc3RFZGdlczsgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZmlyc3RFZGdlcyBhcnJheS4KKyAgICBFZGdlSW5mbyogICAgICBsYXN0RWRnZXM7ICAgICAvL1RoZSBsYXN0IGVkZ2UgcG9pbnQgZGV0ZWN0ZWQgYWxvbmcgZWFjaCBzZWFyY2ggbGluZSBpbiB0aGUgUk9JLgorICAgIHVuc2lnbmVkIGludCAgIG51bUxhc3RFZGdlczsgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGxhc3RFZGdlcyBhcnJheS4KKyAgICBTZWFyY2hBcmNJbmZvKiBzZWFyY2hBcmNzOyAgICAvL0NvbnRhaW5zIHRoZSBhcmNzIHVzZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uIGFuZCB0aGUgZWRnZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhcmMuCisgICAgdW5zaWduZWQgaW50ICAgbnVtU2VhcmNoQXJjczsgLy9UaGUgbnVtYmVyIG9mIGFyY3MgaW4gdGhlIHNlYXJjaEFyY3MgYXJyYXkuCit9IENvbmNlbnRyaWNSYWtlUmVwb3J0MjsKKwordHlwZWRlZiBzdHJ1Y3QgU3Bva2VSZXBvcnQyX3N0cnVjdCB7CisgICAgRWRnZUluZm8qICAgICAgIGZpcnN0RWRnZXM7ICAgICAvL1RoZSBmaXJzdCBlZGdlIHBvaW50IGRldGVjdGVkIGFsb25nIGVhY2ggc2VhcmNoIGxpbmUgaW4gdGhlIFJPSS4KKyAgICB1bnNpZ25lZCBpbnQgICAgbnVtRmlyc3RFZGdlczsgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGZpcnN0RWRnZXMgYXJyYXkuCisgICAgRWRnZUluZm8qICAgICAgIGxhc3RFZGdlczsgICAgICAvL1RoZSBsYXN0IGVkZ2UgcG9pbnQgZGV0ZWN0ZWQgYWxvbmcgZWFjaCBzZWFyY2ggbGluZSBpbiB0aGUgUk9JLgorICAgIHVuc2lnbmVkIGludCAgICBudW1MYXN0RWRnZXM7ICAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbGFzdEVkZ2VzIGFycmF5LgorICAgIFNlYXJjaExpbmVJbmZvKiBzZWFyY2hMaW5lczsgICAgLy9UaGUgc2VhcmNoIGxpbmVzIHVzZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorICAgIHVuc2lnbmVkIGludCAgICBudW1TZWFyY2hMaW5lczsgLy9UaGUgbnVtYmVyIG9mIHNlYXJjaCBsaW5lcyB1c2VkIGluIHRoZSBlZGdlIGRldGVjdGlvbi4KK30gU3Bva2VSZXBvcnQyOworCit0eXBlZGVmIHN0cnVjdCBFZGdlSW5mb19zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgcG9zaXRpb247ICAgICAgICAgICAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgZWRnZSBpbiB0aGUgaW1hZ2UuCisgICAgUG9pbnRGbG9hdCBjYWxpYnJhdGVkUG9zaXRpb247IC8vVGhlIHBvc2l0aW9uIG9mIHRoZSBlZGdlIGluIHRoZSBpbWFnZSBpbiByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICAgIGRvdWJsZSAgICAgZGlzdGFuY2U7ICAgICAgICAgICAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgZWRnZSBmcm9tIHRoZSBmaXJzdCBwb2ludCBhbG9uZyB0aGUgYm91bmRhcnkgb2YgdGhlIGlucHV0IFJPSS4KKyAgICBkb3VibGUgICAgIGNhbGlicmF0ZWREaXN0YW5jZTsgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGVkZ2UgZnJvbSB0aGUgZmlyc3QgcG9pbnQgYWxvbmcgdGhlIGJvdW5kYXJ5IG9mIHRoZSBpbnB1dCBST0kgaW4gcmVhbC13b3JsZCBjb29yZGluYXRlcy4KKyAgICBkb3VibGUgICAgIG1hZ25pdHVkZTsgICAgICAgICAgLy9UaGUgaW50ZW5zaXR5IGNvbnRyYXN0IGF0IHRoZSBlZGdlLgorICAgIGRvdWJsZSAgICAgbm9pc2VQZWFrOyAgICAgICAgICAvL1RoZSBzdHJlbmd0aCBvZiB0aGUgbm9pc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGVkZ2UuCisgICAgaW50ICAgICAgICByaXNpbmc7ICAgICAgICAgICAgIC8vSW5kaWNhdGVzIHRoZSBwb2xhcml0eSBvZiB0aGUgZWRnZS4KK30gRWRnZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFNlYXJjaExpbmVJbmZvX3N0cnVjdCB7CisgICAgTGluZUZsb2F0ICAgbGluZUNvb3JkaW5hdGVzOyAvL1RoZSBlbmRwb2ludHMgb2YgdGhlIHNlYXJjaCBsaW5lLgorICAgIEVkZ2VSZXBvcnQyIGVkZ2VSZXBvcnQ7ICAgICAgLy9EZXNjcmliZXMgdGhlIGVkZ2VzIGZvdW5kIGluIHRoaXMgc2VhcmNoIGxpbmUuCit9IFNlYXJjaExpbmVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBSYWtlUmVwb3J0Ml9zdHJ1Y3QgeworICAgIEVkZ2VJbmZvKiAgICAgICBmaXJzdEVkZ2VzOyAgICAgLy9UaGUgZmlyc3QgZWRnZSBwb2ludCBkZXRlY3RlZCBhbG9uZyBlYWNoIHNlYXJjaCBsaW5lIGluIHRoZSBST0kuCisgICAgdW5zaWduZWQgaW50ICAgIG51bUZpcnN0RWRnZXM7ICAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBmaXJzdEVkZ2VzIGFycmF5LgorICAgIEVkZ2VJbmZvKiAgICAgICBsYXN0RWRnZXM7ICAgICAgLy9UaGUgbGFzdCBlZGdlIHBvaW50IGRldGVjdGVkIGFsb25nIGVhY2ggc2VhcmNoIGxpbmUgaW4gdGhlIFJPSS4KKyAgICB1bnNpZ25lZCBpbnQgICAgbnVtTGFzdEVkZ2VzOyAgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGxhc3RFZGdlcyBhcnJheS4KKyAgICBTZWFyY2hMaW5lSW5mbyogc2VhcmNoTGluZXM7ICAgIC8vVGhlIHNlYXJjaCBsaW5lcyB1c2VkIGZvciBlZGdlIGRldGVjdGlvbi4KKyAgICB1bnNpZ25lZCBpbnQgICAgbnVtU2VhcmNoTGluZXM7IC8vVGhlIG51bWJlciBvZiBzZWFyY2ggbGluZXMgdXNlZCBpbiB0aGUgZWRnZSBkZXRlY3Rpb24uCit9IFJha2VSZXBvcnQyOworCit0eXBlZGVmIHN0cnVjdCBUcmFuc2Zvcm1CZWhhdmlvcnNfc3RydWN0IHsKKyAgICBHcm91cEJlaGF2aW9yIFNoaWZ0QmVoYXZpb3I7ICAgIC8vU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiBhbiBvdmVybGF5IGdyb3VwIHdoZW4gYSBzaGlmdCBvcGVyYXRpb24gaXMgYXBwbGllZCB0byBhbiBpbWFnZS4KKyAgICBHcm91cEJlaGF2aW9yIFNjYWxlQmVoYXZpb3I7ICAgIC8vU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiBhbiBvdmVybGF5IGdyb3VwIHdoZW4gYSBzY2FsZSBvcGVyYXRpb24gaXMgYXBwbGllZCB0byBhbiBpbWFnZS4KKyAgICBHcm91cEJlaGF2aW9yIFJvdGF0ZUJlaGF2aW9yOyAgIC8vU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiBhbiBvdmVybGF5IGdyb3VwIHdoZW4gYSByb3RhdGUgb3BlcmF0aW9uIGlzIGFwcGxpZWQgdG8gYW4gaW1hZ2UuCisgICAgR3JvdXBCZWhhdmlvciBTeW1tZXRyeUJlaGF2aW9yOyAvL1NwZWNpZmllcyB0aGUgYmVoYXZpb3Igb2YgYW4gb3ZlcmxheSBncm91cCB3aGVuIGEgc3ltbWV0cnkgb3BlcmF0aW9uIGlzIGFwcGxpZWQgdG8gYW4gaW1hZ2UuCit9IFRyYW5zZm9ybUJlaGF2aW9yczsKKwordHlwZWRlZiBzdHJ1Y3QgUVJDb2RlRGF0YVRva2VuX3N0cnVjdCB7CisgICAgUVJTdHJlYW1Nb2RlICAgbW9kZTsgICAgICAgLy9TcGVjaWZpZXMgdGhlIHN0cmVhbSBtb2RlIG9yIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgdGhhdCBpcyBlbmNvZGVkIGluIHRoZSBRUiBjb2RlLgorICAgIHVuc2lnbmVkIGludCAgIG1vZGVEYXRhOyAgIC8vSW5kaWNhdGVzIHNwZWNpZmllcnMgdXNlZCBieSB0aGUgdXNlciB0byBwb3N0cHJvY2VzcyB0aGUgZGF0YSBpZiBpdCByZXF1aXJlcyBpdC4KKyAgICB1bnNpZ25lZCBjaGFyKiBkYXRhOyAgICAgICAvL1Nob3dzIHRoZSBlbmNvZGVkIGRhdGEgaW4gdGhlIFFSIGNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgZGF0YUxlbmd0aDsgLy9TcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBmb3VuZCBpbiB0aGUgUVIgY29kZS4KK30gUVJDb2RlRGF0YVRva2VuOworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgcmVqZWN0TWF0Y2hlczsgLy9TZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byB0cmFuc2ZlciBvbmx5IHRob3NlIHBhcnRpY2xlcyB0aGF0IGRvIG5vdCBtZWV0IGFsbCB0aGUgY3JpdGVyaWEuCisgICAgaW50IHJlamVjdEJvcmRlcjsgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHJlamVjdCBib3JkZXIgcGFydGljbGVzLgorICAgIGludCBjb25uZWN0aXZpdHk4OyAvL1NldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIHVzZSBjb25uZWN0aXZpdHktOCB0byBkZXRlcm1pbmUgd2hldGhlciBwYXJ0aWNsZXMgYXJlIHRvdWNoaW5nLgorfSBQYXJ0aWNsZUZpbHRlck9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFN0cmFpZ2h0RWRnZVJlcG9ydDJfc3RydWN0IHsKKyAgICBTdHJhaWdodEVkZ2UqICAgc3RyYWlnaHRFZGdlczsgICAgLy9Db250YWlucyBhbiBhcnJheSBvZiBmb3VuZCBzdHJhaWdodCBlZGdlcy4KKyAgICB1bnNpZ25lZCBpbnQgICAgbnVtU3RyYWlnaHRFZGdlczsgLy9JbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBzdHJhaWdodCBlZGdlcyBmb3VuZC4KKyAgICBTZWFyY2hMaW5lSW5mbyogc2VhcmNoTGluZXM7ICAgICAgLy9Db250YWlucyBhbiBhcnJheSBvZiBhbGwgc2VhcmNoIGxpbmVzIHVzZWQgaW4gdGhlIGRldGVjdGlvbi4KKyAgICB1bnNpZ25lZCBpbnQgICAgbnVtU2VhcmNoTGluZXM7ICAgLy9UaGUgbnVtYmVyIG9mIHNlYXJjaCBsaW5lcyB1c2VkIGluIHRoZSBlZGdlIGRldGVjdGlvbi4KK30gU3RyYWlnaHRFZGdlUmVwb3J0MjsKKwordHlwZWRlZiBzdHJ1Y3QgU3RyYWlnaHRFZGdlT3B0aW9uc19zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgbnVtTGluZXM7ICAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0cmFpZ2h0IGVkZ2VzIHRvIGZpbmQuCisgICAgU3RyYWlnaHRFZGdlU2VhcmNoTW9kZSBzZWFyY2hNb2RlOyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtZXRob2QgdXNlZCB0byBmaW5kIHRoZSBzdHJhaWdodCBlZGdlLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgbWluU2NvcmU7ICAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBzY29yZSBvZiBhIGRldGVjdGVkIHN0cmFpZ2h0IGVkZ2UuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICBtYXhTY29yZTsgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNjb3JlIG9mIGEgZGV0ZWN0ZWQgZWRnZS4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOyAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGFuZ2xlIGF0IHdoaWNoIHRoZSBzdHJhaWdodCBlZGdlIGlzIGV4cGVjdGVkIHRvIGJlIGZvdW5kLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgYW5nbGVSYW5nZTsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgKy8tIHJhbmdlIGFyb3VuZCB0aGUgb3JpZW50YXRpb24gd2l0aGluIHdoaWNoIHRoZSBzdHJhaWdodCBlZGdlIGlzIGV4cGVjdGVkIHRvIGJlIGZvdW5kLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgYW5nbGVUb2xlcmFuY2U7ICAgICAgICAvL1NwZWNpZmllcyB0aGUgZXhwZWN0ZWQgYW5ndWxhciBhY2N1cmFjeSBvZiB0aGUgc3RyYWlnaHQgZWRnZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHN0ZXBTaXplOyAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGdhcCBpbiBwaXhlbHMgYmV0d2VlbiB0aGUgc2VhcmNoIGxpbmVzIHVzZWQgd2l0aCB0aGUgcmFrZS1iYXNlZCBtZXRob2RzLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgbWluU2lnbmFsVG9Ob2lzZVJhdGlvOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBzaWduYWwgdG8gbm9pc2UgcmF0aW8gKFNOUikgb2YgdGhlIGVkZ2UgcG9pbnRzIHVzZWQgdG8gZml0IHRoZSBzdHJhaWdodCBlZGdlLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgbWluQ292ZXJhZ2U7ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBudW1iZXIgb2YgcG9pbnRzIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgbnVtYmVyIG9mIHNlYXJjaCBsaW5lcyB0aGF0IG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRldGVjdGVkIHN0cmFpZ2h0IGVkZ2UuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICBob3VnaEl0ZXJhdGlvbnM7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB1c2VkIGluIHRoZSBIb3VnaC1iYXNlZCBtZXRob2QuCit9IFN0cmFpZ2h0RWRnZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFN0cmFpZ2h0RWRnZV9zdHJ1Y3QgeworICAgIExpbmVGbG9hdCAgICBzdHJhaWdodEVkZ2VDb29yZGluYXRlczsgICAgICAgICAgIC8vRW5kIHBvaW50cyBvZiB0aGUgZGV0ZWN0ZWQgc3RyYWlnaHQgZWRnZSBpbiBwaXhlbCBjb29yZGluYXRlcy4KKyAgICBMaW5lRmxvYXQgICAgY2FsaWJyYXRlZFN0cmFpZ2h0RWRnZUNvb3JkaW5hdGVzOyAvL0VuZCBwb2ludHMgb2YgdGhlIGRldGVjdGVkIHN0cmFpZ2h0IGVkZ2UgaW4gcmVhbC13b3JsZCBjb29yZGluYXRlcy4KKyAgICBkb3VibGUgICAgICAgYW5nbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FuZ2xlIG9mIHRoZSBmb3VuZCBlZGdlIHVzaW5nIHRoZSBwaXhlbCBjb29yZGluYXRlcy4KKyAgICBkb3VibGUgICAgICAgY2FsaWJyYXRlZEFuZ2xlOyAgICAgICAgICAgICAgICAgICAvL0FuZ2xlIG9mIHRoZSBmb3VuZCBlZGdlIHVzaW5nIHRoZSByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICAgIGRvdWJsZSAgICAgICBzY29yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVzY3JpYmVzIHRoZSBzY29yZSBvZiB0aGUgZGV0ZWN0ZWQgZWRnZS4KKyAgICBkb3VibGUgICAgICAgc3RyYWlnaHRuZXNzOyAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBzdHJhaWdodG5lc3MgdmFsdWUgb2YgdGhlIGRldGVjdGVkIHN0cmFpZ2h0IGVkZ2UuCisgICAgZG91YmxlICAgICAgIGF2ZXJhZ2VTaWduYWxUb05vaXNlUmF0aW87ICAgICAgICAgLy9EZXNjcmliZXMgdGhlIGF2ZXJhZ2Ugc2lnbmFsIHRvIG5vaXNlIHJhdGlvIChTTlIpIG9mIHRoZSBkZXRlY3RlZCBlZGdlLgorICAgIGludCAgICAgICAgICBjYWxpYnJhdGlvblZhbGlkOyAgICAgICAgICAgICAgICAgIC8vSW5kaWNhdGVzIGlmIHRoZSBjYWxpYnJhdGlvbiBkYXRhIGZvciB0aGUgc3RyYWlnaHQgZWRnZSBpcyB2YWxpZC4KKyAgICBFZGdlSW5mbyogICAgdXNlZEVkZ2VzOyAgICAgICAgICAgICAgICAgICAgICAgICAvL0FuIGFycmF5IG9mIGVkZ2VzIHRoYXQgd2VyZSB1c2VkIHRvIGRldGVybWluZSB0aGlzIHN0cmFpZ2h0IGxpbmUuCisgICAgdW5zaWduZWQgaW50IG51bVVzZWRFZGdlczsgICAgICAgICAgICAgICAgICAgICAgLy9JbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBlZGdlcyBpbiB0aGUgdXNlZEVkZ2VzIGFycmF5LgorfSBTdHJhaWdodEVkZ2U7CisKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVNlYXJjaE9wdGlvbnNfc3RydWN0IHsKKyAgICBRUlJvdGF0aW9uTW9kZSAgICAgcm90YXRpb25Nb2RlOyAgICAgICAvL1NwZWNpZmllcyB0aGUgYW1vdW50IG9mIFFSIGNvZGUgcm90YXRpb24gdGhlIGZ1bmN0aW9uIHNob3VsZCBhbGxvdyBmb3IuCisgICAgdW5zaWduZWQgaW50ICAgICAgIHNraXBMb2NhdGlvbjsgICAgICAgLy9JZiBzZXQgdG8gVFJVRSwgc3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgUVIgY29kZSBvY2N1cGllcyB0aGUgZW50aXJlIGltYWdlIChvciB0aGUgZW50aXJlIHNlYXJjaCByZWdpb24pLgorICAgIHVuc2lnbmVkIGludCAgICAgICBlZGdlVGhyZXNob2xkOyAgICAgIC8vVGhlIHN0cmVuZ3RoIG9mIHRoZSB3ZWFrZXN0IGVkZ2UgdGhlIGZ1bmN0aW9uIHVzZXMgdG8gZmluZCB0aGUgY29hcnNlIGxvY2F0aW9uIG9mIHRoZSBRUiBjb2RlIGluIHRoZSBpbWFnZS4KKyAgICBRUkRlbW9kdWxhdGlvbk1vZGUgZGVtb2R1bGF0aW9uTW9kZTsgICAvL1RoZSBkZW1vZHVsYXRpb24gbW9kZSB0aGUgZnVuY3Rpb24gdXNlcyB0byBsb2NhdGUgdGhlIFFSIGNvZGUuCisgICAgUVJDZWxsU2FtcGxlU2l6ZSAgIGNlbGxTYW1wbGVTaXplOyAgICAgLy9UaGUgY2VsbCBzYW1wbGUgc2l6ZSB0aGUgZnVuY3Rpb24gdXNlcyB0byBsb2NhdGUgdGhlIFFSIGNvZGUuCisgICAgUVJDZWxsRmlsdGVyTW9kZSAgIGNlbGxGaWx0ZXJNb2RlOyAgICAgLy9UaGUgY2VsbCBmaWx0ZXIgbW9kZSB0aGUgZnVuY3Rpb24gdXNlcyB0byBsb2NhdGUgdGhlIFFSIGNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgIHNrZXdEZWdyZWVzQWxsb3dlZDsgLy9TcGVjaWZpZXMgdGhlIGFtb3VudCBvZiBza2V3IGluIHRoZSBRUiBjb2RlIHRoZSBmdW5jdGlvbiBzaG91bGQgYWxsb3cgZm9yLgorfSBRUkNvZGVTZWFyY2hPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBRUkNvZGVTaXplT3B0aW9uc19zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBtaW5TaXplOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBzaXplIChpbiBwaXhlbHMpIG9mIHRoZSBRUiBjb2RlIGluIHRoZSBpbWFnZS4KKyAgICB1bnNpZ25lZCBpbnQgbWF4U2l6ZTsgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSAoaW4gcGl4ZWxzKSBvZiB0aGUgUVIgY29kZSBpbiB0aGUgaW1hZ2UuCit9IFFSQ29kZVNpemVPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBRUkNvZGVEZXNjcmlwdGlvbk9wdGlvbnNfc3RydWN0IHsKKyAgICBRUkRpbWVuc2lvbnMgZGltZW5zaW9uczsgLy9UaGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgdGhhdCBhcmUgcG9wdWxhdGVkIGZvciB0aGUgUVIgY29kZSwgbWVhc3VyZWQgaW4gY2VsbHMuCisgICAgUVJQb2xhcml0aWVzIHBvbGFyaXR5OyAgIC8vVGhlIHBvbGFyaXR5IG9mIHRoZSBRUiBjb2RlLgorICAgIFFSTWlycm9yTW9kZSBtaXJyb3I7ICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBRUiBjb2RlIGFwcGVhcnMgbWlycm9yZWQgaW4gdGhlIGltYWdlIGFuZCBGQUxTRSBpZiB0aGUgUVIgY29kZSBhcHBlYXJzIG5vcm1hbGx5IGluIHRoZSBpbWFnZS4KKyAgICBRUk1vZGVsVHlwZSAgbW9kZWxUeXBlOyAgLy9UaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgUVIgY29kZS4KK30gUVJDb2RlRGVzY3JpcHRpb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBRUkNvZGVSZXBvcnRfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgZm91bmQ7ICAgICAgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBmdW5jdGlvbiBsb2NhdGVkIGFuZCBkZWNvZGVkIGEgUVIgY29kZSBhbmQgRkFMU0UgaWYgdGhlIGZ1bmN0aW9uIGZhaWxlZCB0byBsb2NhdGUgYW5kIGRlY29kZSBhIFFSIGNvZGUuCisgICAgdW5zaWduZWQgY2hhciogICAgIGRhdGE7ICAgICAgICAgICAgICAgICAgICAgLy9UaGUgZGF0YSBlbmNvZGVkIGluIHRoZSBRUiBjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICBkYXRhTGVuZ3RoOyAgICAgICAgICAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBhcnJheS4KKyAgICBQb2ludEZsb2F0ICAgICAgICAgYm91bmRpbmdCb3hbNF07ICAgICAgICAgICAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZSBzdXJyb3VuZGluZyB0aGUgUVIgY29kZS4KKyAgICBRUkNvZGVEYXRhVG9rZW4qICAgdG9rZW5pemVkRGF0YTsgICAgICAgICAgICAvL0NvbnRhaW5zIHRoZSBkYXRhIHRva2VuaXplZCBpbiBleGFjdGx5IHRoZSB3YXkgaXQgd2FzIGVuY29kZWQgaW4gdGhlIGNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgIHNpemVPZlRva2VuaXplZERhdGE7ICAgICAgLy9TaXplIG9mIHRoZSB0b2tlbml6ZWQgZGF0YS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgbnVtRXJyb3JzQ29ycmVjdGVkOyAgICAgICAvL1RoZSBudW1iZXIgb2YgZXJyb3JzIHRoZSBmdW5jdGlvbiBjb3JyZWN0ZWQgd2hlbiBkZWNvZGluZyB0aGUgUVIgY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgZGltZW5zaW9uczsgICAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB0aGF0IGFyZSBwb3B1bGF0ZWQgZm9yIHRoZSBRUiBjb2RlLCBtZWFzdXJlZCBpbiBjZWxscy4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgdmVyc2lvbjsgICAgICAgICAgICAgICAgICAvL1RoZSB2ZXJzaW9uIG9mIHRoZSBRUiBjb2RlLgorICAgIFFSTW9kZWxUeXBlICAgICAgICBtb2RlbFR5cGU7ICAgICAgICAgICAgICAgIC8vVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoYXQgdHlwZSBvZiBRUiBjb2RlIHRoaXMgaXMuCisgICAgUVJTdHJlYW1Nb2RlICAgICAgIHN0cmVhbU1vZGU7ICAgICAgICAgICAgICAgLy9UaGUgZm9ybWF0IG9mIHRoZSBkYXRhIGVuY29kZWQgaW4gdGhlIHN0cmVhbS4KKyAgICBRUlBvbGFyaXRpZXMgICAgICAgbWF0cml4UG9sYXJpdHk7ICAgICAgICAgICAvL1RoZSBwb2xhcml0eSBvZiB0aGUgUVIgY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgbWlycm9yZWQ7ICAgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBRUiBjb2RlIGFwcGVhcnMgbWlycm9yZWQgaW4gdGhlIGltYWdlIGFuZCBGQUxTRSBpZiB0aGUgUVIgY29kZSBhcHBlYXJzIG5vcm1hbGx5IGluIHRoZSBpbWFnZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgcG9zaXRpb25JbkFwcGVuZFN0cmVhbTsgICAvL0luZGljYXRlcyB3aGF0IHBvc2l0aW9uIHRoZSBRUiBjb2RlIGlzIGluIHdpdGggcmVzcGVjdCB0byB0aGUgc3RyZWFtIG9mIGRhdGEgaW4gYWxsIGNvZGVzLgorICAgIHVuc2lnbmVkIGludCAgICAgICBzaXplT2ZBcHBlbmRTdHJlYW07ICAgICAgIC8vU3BlY2lmaWVzIGhvdyBtYW55IFFSIGNvZGVzIGFyZSBwYXJ0IG9mIGEgbGFyZ2VyIGFycmF5IG9mIGNvZGVzLgorICAgIGludCAgICAgICAgICAgICAgICBmaXJzdEVBTjEyOEFwcGxpY2F0aW9uSUQ7IC8vVGhlIGZpcnN0IEVBTi0xMjggQXBwbGljYXRpb24gSUQgZW5jb3VudGVyZWQgaW4gdGhlIHN0cmVhbS4KKyAgICBpbnQgICAgICAgICAgICAgICAgZmlyc3RFQ0lEZXNpZ25hdG9yOyAgICAgICAvL1RoZSBmaXJzdCBSZWdpb25hbCBMYW5ndWFnZSBEZXNpZ25hdG9yIGVuY291bnRlcmVkIGluIHRoZSBzdHJlYW0uCisgICAgdW5zaWduZWQgaW50ICAgICAgIGFwcGVuZFN0cmVhbUlkZW50aWZpZXI7ICAgLy9TcGVjaWZpZXMgd2hhdCBzdHJlYW0gdGhlIFFSIGNvZGUgaXMgaW4gcmVsYXRpb24gdG8gd2hlbiB0aGUgY29kZSBpcyBwYXJ0IG9mIGEgbGFyZ2VyIGFycmF5IG9mIGNvZGVzLgorICAgIHVuc2lnbmVkIGludCAgICAgICBtaW5pbXVtRWRnZVN0cmVuZ3RoOyAgICAgIC8vVGhlIHN0cmVuZ3RoIG9mIHRoZSB3ZWFrZXN0IGVkZ2UgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZmluZCB0aGUgY29hcnNlIGxvY2F0aW9uIG9mIHRoZSBRUiBjb2RlIGluIHRoZSBpbWFnZS4KKyAgICBRUkRlbW9kdWxhdGlvbk1vZGUgZGVtb2R1bGF0aW9uTW9kZTsgICAgICAgICAvL1RoZSBkZW1vZHVsYXRpb24gbW9kZSB0aGUgZnVuY3Rpb24gdXNlZCB0byBsb2NhdGUgdGhlIFFSIGNvZGUuCisgICAgUVJDZWxsU2FtcGxlU2l6ZSAgIGNlbGxTYW1wbGVTaXplOyAgICAgICAgICAgLy9UaGUgY2VsbCBzYW1wbGUgc2l6ZSB0aGUgZnVuY3Rpb24gdXNlZCB0byBsb2NhdGUgdGhlIFFSIGNvZGUuCisgICAgUVJDZWxsRmlsdGVyTW9kZSAgIGNlbGxGaWx0ZXJNb2RlOyAgICAgICAgICAgLy9UaGUgY2VsbCBmaWx0ZXIgbW9kZSB0aGUgZnVuY3Rpb24gdXNlZCB0byBsb2NhdGUgdGhlIFFSIGNvZGUuCit9IFFSQ29kZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQUlNR3JhZGVSZXBvcnRfc3RydWN0IHsKKyAgICBBSU1HcmFkZSBvdmVyYWxsR3JhZGU7ICAgICAgICAgICAgICAgLy9UaGUgb3ZlcmFsbCBsZXR0ZXIgZ3JhZGUsIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBsb3dlc3Qgb2YgdGhlIG90aGVyIGZpdmUgbGV0dGVyIGdyYWRlcy4KKyAgICBBSU1HcmFkZSBkZWNvZGluZ0dyYWRlOyAgICAgICAgICAgICAgLy9UaGUgbGV0dGVyIGdyYWRlIGFzc2lnbmVkIHRvIGEgRGF0YSBNYXRyaXggYmFyY29kZSBiYXNlZCBvbiB0aGUgc3VjY2VzcyBvZiB0aGUgZnVuY3Rpb24gaW4gZGVjb2RpbmcgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgQUlNR3JhZGUgc3ltYm9sQ29udHJhc3RHcmFkZTsgICAgICAgIC8vVGhlIGxldHRlciBncmFkZSBhc3NpZ25lZCB0byBhIERhdGEgTWF0cml4IGJhcmNvZGUgYmFzZWQgb24gdGhlIHN5bWJvbCBjb250cmFzdCByYXcgc2NvcmUuCisgICAgZmxvYXQgICAgc3ltYm9sQ29udHJhc3Q7ICAgICAgICAgICAgIC8vVGhlIHN5bWJvbCBjb250cmFzdCByYXcgc2NvcmUgcmVwcmVzZW50aW5nIHRoZSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWVhbiBvZiB0aGUgcmVmbGVjdGFuY2Ugb2YgdGhlIGRhcmtlc3QgMTAgcGVyY2VudCBhbmQgbGlnaHRlc3QgMTAgcGVyY2VudCBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBBSU1HcmFkZSBwcmludEdyb3d0aEdyYWRlOyAgICAgICAgICAgLy9UaGUgcHJpbnQgZ3Jvd3RoIGxldHRlciBncmFkZSBmb3IgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgZmxvYXQgICAgcHJpbnRHcm93dGg7ICAgICAgICAgICAgICAgIC8vVGhlIHByaW50IGdyb3d0aCByYXcgc2NvcmUgZm9yIHRoZSBiYXJjb2RlLCB3aGljaCBpcyBiYXNlZCBvbiB0aGUgZXh0ZW50IHRvIHdoaWNoIGRhcmsgb3IgbGlnaHQgbWFya2luZ3MgYXBwcm9wcmlhdGVseSBmaWxsIHRoZWlyIG1vZHVsZSBib3VuZGFyaWVzLgorICAgIEFJTUdyYWRlIGF4aWFsTm9udW5pZm9ybWl0eUdyYWRlOyAgICAvL1RoZSBheGlhbCBub251bmlmb3JtaXR5IGdyYWRlIGZvciB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBmbG9hdCAgICBheGlhbE5vbnVuaWZvcm1pdHk7ICAgICAgICAgLy9UaGUgYXhpYWwgbm9udW5pZm9ybWl0eSByYXcgc2NvcmUgZm9yIHRoZSBiYXJjb2RlLCB3aGljaCBpcyBiYXNlZCBvbiBob3cgbXVjaCB0aGUgc2FtcGxpbmcgcG9pbnQgc3BhY2luZyBkaWZmZXJzIGZyb20gb25lIGF4aXMgdG8gYW5vdGhlci4KKyAgICBBSU1HcmFkZSB1bnVzZWRFcnJvckNvcnJlY3Rpb25HcmFkZTsgLy9UaGUgdW51c2VkIGVycm9yIGNvcnJlY3Rpb24gbGV0dGVyIGdyYWRlIGZvciB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBmbG9hdCAgICB1bnVzZWRFcnJvckNvcnJlY3Rpb247ICAgICAgLy9UaGUgdW51c2VkIGVycm9yIGNvcnJlY3Rpb24gcmF3IHNjb3JlIGZvciB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSwgd2hpY2ggaXMgYmFzZWQgb24gdGhlIGV4dGVudCB0byB3aGljaCByZWdpb25hbCBvciBzcG90IGRhbWFnZSBpbiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBoYXMgZXJvZGVkIHRoZSByZWFkaW5nIHNhZmV0eSBtYXJnaW4gcHJvdmlkZWQgYnkgdGhlIGVycm9yIGNvcnJlY3Rpb24uCit9IEFJTUdyYWRlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4U2l6ZU9wdGlvbnNfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgbWluU2l6ZTsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHNpemUgKGluIHBpeGVscykgb2YgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgaW4gdGhlIGltYWdlLgorICAgIHVuc2lnbmVkIGludCBtYXhTaXplOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSAoaW4gcGl4ZWxzKSBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBpbiB0aGUgaW1hZ2UuCisgICAgdW5zaWduZWQgaW50IHF1aWV0Wm9uZVdpZHRoOyAvL1NwZWNpZmllcyB0aGUgZXhwZWN0ZWQgbWluaW11bSBzaXplIG9mIHRoZSBxdWlldCB6b25lLCBpbiBwaXhlbHMuCit9IERhdGFNYXRyaXhTaXplT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeERlc2NyaXB0aW9uT3B0aW9uc19zdHJ1Y3QgeworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgYXNwZWN0UmF0aW87ICAgICAgICAvL1NwZWNpZmllcyB0aGUgcmF0aW8gb2YgdGhlIHdpZHRoIG9mIGVhY2ggRGF0YSBNYXRyaXggYmFyY29kZSBjZWxsIChpbiBwaXhlbHMpIHRvIHRoZSBoZWlnaHQgb2YgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgKGluIHBpeGVscykuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICByb3dzOyAgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGNvbHVtbnM7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlOyAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgaXMgcmVjdGFuZ3VsYXIuCisgICAgRGF0YU1hdHJpeEVDQyAgICAgICAgICBlY2M7ICAgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBFQ0MgdXNlZCBmb3IgdGhpcyBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIERhdGFNYXRyaXhQb2xhcml0eSAgICAgcG9sYXJpdHk7ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZGF0YS10by1iYWNrZ3JvdW5kIGNvbnRyYXN0IGZvciB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBEYXRhTWF0cml4Q2VsbEZpbGxNb2RlIGNlbGxGaWxsOyAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZpbGwgcGVyY2VudGFnZSBmb3IgYSBjZWxsIG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHRoYXQgaXMgaW4gdGhlICJPTiIgc3RhdGUuCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICBtaW5Cb3JkZXJJbnRlZ3JpdHk7IC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHBlcmNlbnRhZ2Ugb2YgdGhlIGJvcmRlciAobG9jYXRvciBwYXR0ZXJuIGFuZCB0aW1pbmcgcGF0dGVybikgdGhlIGZ1bmN0aW9uIHNob3VsZCBleHBlY3QgaW4gdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgRGF0YU1hdHJpeE1pcnJvck1vZGUgICBtaXJyb3JNb2RlOyAgICAgICAgIC8vU3BlY2lmaWVzIGlmIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGFwcGVhcnMgbm9ybWFsbHkgaW4gdGhlIGltYWdlIG9yIGlmIHRoZSBiYXJjb2RlIGFwcGVhcnMgbWlycm9yZWQgaW4gdGhlIGltYWdlLgorfSBEYXRhTWF0cml4RGVzY3JpcHRpb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4U2VhcmNoT3B0aW9uc19zdHJ1Y3QgeworICAgIERhdGFNYXRyaXhSb3RhdGlvbk1vZGUgICAgIHJvdGF0aW9uTW9kZTsgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGFtb3VudCBvZiBEYXRhIE1hdHJpeCBiYXJjb2RlIHJvdGF0aW9uIHRoZSBmdW5jdGlvbiBzaG91bGQgYWxsb3cgZm9yLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIHNraXBMb2NhdGlvbjsgICAgICAgICAgICAgLy9JZiBzZXQgdG8gVFJVRSwgc3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBvY2N1cGllcyB0aGUgZW50aXJlIGltYWdlIChvciB0aGUgZW50aXJlIHNlYXJjaCByZWdpb24pLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGVkZ2VUaHJlc2hvbGQ7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gY29udHJhc3QgYSBwaXhlbCBtdXN0IGhhdmUgaW4gb3JkZXIgdG8gYmUgY29uc2lkZXJlZCBwYXJ0IG9mIGEgbWF0cml4IGNlbGwgZWRnZS4KKyAgICBEYXRhTWF0cml4RGVtb2R1bGF0aW9uTW9kZSBkZW1vZHVsYXRpb25Nb2RlOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtb2RlIHRoZSBmdW5jdGlvbiBzaG91bGQgdXNlIHRvIGRlbW9kdWxhdGUgKGRldGVybWluZSB3aGljaCBjZWxscyBhcmUgb24gYW5kIHdoaWNoIGNlbGxzIGFyZSBvZmYpIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIERhdGFNYXRyaXhDZWxsU2FtcGxlU2l6ZSAgIGNlbGxTYW1wbGVTaXplOyAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHNhbXBsZSBzaXplLCBpbiBwaXhlbHMsIHRoZSBmdW5jdGlvbiBzaG91bGQgdGFrZSB0byBkZXRlcm1pbmUgaWYgZWFjaCBjZWxsIGlzIG9uIG9yIG9mZi4KKyAgICBEYXRhTWF0cml4Q2VsbEZpbHRlck1vZGUgICBjZWxsRmlsdGVyTW9kZTsgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtb2RlIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGRldGVybWluZSB0aGUgcGl4ZWwgdmFsdWUgZm9yIGVhY2ggY2VsbC4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBza2V3RGVncmVlc0FsbG93ZWQ7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBhbW91bnQgb2Ygc2tldyBpbiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSB0aGUgZnVuY3Rpb24gc2hvdWxkIGFsbG93IGZvci4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBtYXhJdGVyYXRpb25zOyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGJlZm9yZSB0aGUgZnVuY3Rpb24gc3RvcHMgbG9va2luZyBmb3IgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaW5pdGlhbFNlYXJjaFZlY3RvcldpZHRoOyAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGUgZnVuY3Rpb24gc2hvdWxkIGF2ZXJhZ2UgdG9nZXRoZXIgdG8gZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiBhbiBlZGdlLgorfSBEYXRhTWF0cml4U2VhcmNoT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeFJlcG9ydF9zdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kOyAgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBmdW5jdGlvbiBsb2NhdGVkIGFuZCBkZWNvZGVkIGEgRGF0YSBNYXRyaXggYmFyY29kZSBhbmQgRkFMU0UgaWYgdGhlIGZ1bmN0aW9uIGZhaWxlZCB0byBsb2NhdGUgYW5kIGRlY29kZSBhIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5OyAgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgY29udGFpbnMgYmluYXJ5IGRhdGEgYW5kIEZBTFNFIGlmIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGNvbnRhaW5zIHRleHQgZGF0YS4KKyAgICB1bnNpZ25lZCBjaGFyKiAgICAgICAgICAgICBkYXRhOyAgICAgICAgICAgICAgICAgLy9UaGUgZGF0YSBlbmNvZGVkIGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGRhdGFMZW5ndGg7ICAgICAgICAgICAvL1RoZSBsZW5ndGggb2YgdGhlIGRhdGEgYXJyYXkuCisgICAgUG9pbnRGbG9hdCAgICAgICAgICAgICAgICAgYm91bmRpbmdCb3hbNF07ICAgICAgIC8vQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUgcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIG51bUVycm9yc0NvcnJlY3RlZDsgICAvL1RoZSBudW1iZXIgb2YgZXJyb3JzIHRoZSBmdW5jdGlvbiBjb3JyZWN0ZWQgd2hlbiBkZWNvZGluZyB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBudW1FcmFzdXJlc0NvcnJlY3RlZDsgLy9UaGUgbnVtYmVyIG9mIGVyYXN1cmVzIHRoZSBmdW5jdGlvbiBjb3JyZWN0ZWQgd2hlbiBkZWNvZGluZyB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzsgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBpbiB0aGUgaW1hZ2UsIHdoaWNoIGVxdWFscyB0aGUgcmF0aW8gb2YgdGhlIHdpZHRoIG9mIGEgRGF0YSBNYXRyaXggYmFyY29kZSBjZWxsIChpbiBwaXhlbHMpIHRvIHRoZSBoZWlnaHQgb2YgYSBEYXRhIE1hdHJpeCBiYXJjb2RlIGNlbGwgKGluIHBpeGVscykuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgcm93czsgICAgICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGNvbHVtbnM7ICAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBEYXRhTWF0cml4RUNDICAgICAgICAgICAgICBlY2M7ICAgICAgICAgICAgICAgICAgLy9UaGUgRXJyb3IgQ29ycmVjdGlvbiBDb2RlIChFQ0MpIHVzZWQgYnkgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgRGF0YU1hdHJpeFBvbGFyaXR5ICAgICAgICAgcG9sYXJpdHk7ICAgICAgICAgICAgIC8vVGhlIHBvbGFyaXR5IG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIERhdGFNYXRyaXhDZWxsRmlsbE1vZGUgICAgIGNlbGxGaWxsOyAgICAgICAgICAgICAvL1RoZSBjZWxsIGZpbGwgcGVyY2VudGFnZSBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICBib3JkZXJJbnRlZ3JpdHk7ICAgICAgLy9UaGUgcGVyY2VudGFnZSBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBib3JkZXIgdGhhdCBhcHBlYXJzIGNvcnJlY3RseSBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbWlycm9yZWQ7ICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgYXBwZWFycyBtaXJyb3JlZCBpbiB0aGUgaW1hZ2UgYW5kIEZBTFNFIGlmIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGFwcGVhcnMgbm9ybWFsbHkgaW4gdGhlIGltYWdlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIG1pbmltdW1FZGdlU3RyZW5ndGg7ICAvL1RoZSBzdHJlbmd0aCBvZiB0aGUgd2Vha2VzdCBlZGdlIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGZpbmQgdGhlIGNvYXJzZSBsb2NhdGlvbiBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBpbiB0aGUgaW1hZ2UuCisgICAgRGF0YU1hdHJpeERlbW9kdWxhdGlvbk1vZGUgZGVtb2R1bGF0aW9uTW9kZTsgICAgIC8vVGhlIGRlbW9kdWxhdGlvbiBtb2RlIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGxvY2F0ZSB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgICBEYXRhTWF0cml4Q2VsbFNhbXBsZVNpemUgICBjZWxsU2FtcGxlU2l6ZTsgICAgICAgLy9UaGUgY2VsbCBzYW1wbGUgc2l6ZSB0aGUgZnVuY3Rpb24gdXNlZCB0byBsb2NhdGUgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgICAgRGF0YU1hdHJpeENlbGxGaWx0ZXJNb2RlICAgY2VsbEZpbHRlck1vZGU7ICAgICAgIC8vVGhlIGNlbGwgZmlsdGVyIG1vZGUgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gbG9jYXRlIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGl0ZXJhdGlvbnM7ICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aGUgZnVuY3Rpb24gdG9vayBpbiBhdHRlbXB0aW5nIHRvIGxvY2F0ZSB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KK30gRGF0YU1hdHJpeFJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgSlBFRzIwMDBGaWxlQWR2YW5jZWRPcHRpb25zX3N0cnVjdCB7CisgICAgV2F2ZWxldFRyYW5zZm9ybU1vZGUgd2F2ZWxldE1vZGU7ICAgICAgICAgICAgICAgIC8vRGV0ZXJtaW5lcyB3aGljaCB3YXZlbGV0IHRyYW5zZm9ybSB0byB1c2Ugd2hlbiB3cml0aW5nIHRoZSBmaWxlLgorICAgIGludCAgICAgICAgICAgICAgICAgIHVzZU11bHRpQ29tcG9uZW50VHJhbnNmb3JtOyAvL1NldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIHVzZSBhbiBhZGRpdGlvbmFsIHRyYW5zZm9ybSBvbiBSR0IgaW1hZ2VzLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgIG1heFdhdmVsZXRUcmFuc2Zvcm1MZXZlbDsgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBhbGxvd2VkIGxldmVsIG9mIHdhdmVsZXQgdHJhbnNmb3JtLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgIHF1YW50aXphdGlvblN0ZXBTaXplOyAgICAgICAvL1NwZWNpZmllcyB0aGUgYWJzb2x1dGUgYmFzZSBxdWFudGl6YXRpb24gc3RlcCBzaXplIGZvciBkZXJpdmVkIHF1YW50aXphdGlvbiBtb2RlLgorfSBKUEVHMjAwMEZpbGVBZHZhbmNlZE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczJfc3RydWN0IHsKKyAgICBpbnQgICAgbWluRmVhdHVyZXNVc2VkOyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmZWF0dXJlcyB0aGUgZnVuY3Rpb24gdXNlcyB3aGVuIG1hdGNoaW5nLgorICAgIGludCAgICBtYXhGZWF0dXJlc1VzZWQ7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHRoZSBmdW5jdGlvbiB1c2VzIHdoZW4gbWF0Y2hpbmcuCisgICAgaW50ICAgIHN1YnBpeGVsSXRlcmF0aW9uczsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIHVzZWQgdG8gcmVmaW5lIG1hdGNoZXMgd2l0aCBzdWJwaXhlbCBpbmZvcm1hdGlvbi4KKyAgICBkb3VibGUgc3VicGl4ZWxUb2xlcmFuY2U7ICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjaGFuZ2UsIGluIHBpeGVscywgYmV0d2VlbiBjb25zZWN1dGl2ZSBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgaW4gdGhlIG1hdGNoIHBvc2l0aW9uIGJlZm9yZSB0aGUgZnVuY3Rpb24gc3RvcHMgcmVmaW5pbmcgdGhlIG1hdGNoIHBvc2l0aW9uLgorICAgIGludCAgICBpbml0aWFsTWF0Y2hMaXN0TGVuZ3RoOyAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggbGlzdC4KKyAgICBmbG9hdCAgbWF0Y2hUZW1wbGF0ZUN1cnZlU2NvcmU7ICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSB0aGUgbWF0Y2ggY3VydmUgdG8gdGVtcGxhdGUgY3VydmUgc2NvcmUgYW5kIHJldHVybiBpdCBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgICAgaW50ICAgIGNvcnJlbGF0aW9uU2NvcmU7ICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBjYWxjdWxhdGUgdGhlIGNvcnJlbGF0aW9uIHNjb3JlIGFuZCByZXR1cm4gaXQgZm9yIGVhY2ggbWF0Y2ggcmVzdWx0LgorICAgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25EaXN0YW5jZTsgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gc2VwYXJhdGlvbiBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSBvcmlnaW5zIG9mIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgcG9zaXRpb25zLgorICAgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25BbmdsZTsgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gYW5ndWxhciBkaWZmZXJlbmNlLCBpbiBkZWdyZWVzLCBiZXR3ZWVuIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgYW5nbGVzLgorICAgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25TY2FsZTsgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gZGlmZmVyZW5jZSBpbiBzY2FsZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgYmV0d2VlbiB0d28gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIHNjYWxlcy4KKyAgICBkb3VibGUgbWF4TWF0Y2hPdmVybGFwOyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBvdmVybGFwLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLCBhbGxvd2VkIGJldHdlZW4gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZXMgb2YgdHdvIHVuaXF1ZSBtYXRjaGVzLgorICAgIGludCAgICBjb2Fyc2VSZXN1bHQ7ICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgZnVuY3Rpb24gdG8gc3BlbmQgbGVzcyB0aW1lIGFjY3VyYXRlbHkgZXN0aW1hdGluZyB0aGUgbG9jYXRpb24gb2YgYSBtYXRjaC4KKyAgICBpbnQgICAgc21vb3RoQ29udG91cnM7ICAgICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgc21vb3RoaW5nIGJlIGRvbmUgb24gdGhlIGNvbnRvdXJzIG9mIHRoZSBpbnNwZWN0aW9uIGltYWdlIGJlZm9yZSBmZWF0dXJlIGV4dHJhY3Rpb24uCisgICAgaW50ICAgIGVuYWJsZUNhbGlicmF0aW9uU3VwcG9ydDsgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoZSBhbGdvcml0aG0gdHJlYXQgdGhlIGluc3BlY3Rpb24gaW1hZ2UgYXMgYSBjYWxpYnJhdGVkIGltYWdlLgorfSBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBJbnNwZWN0aW9uQWxpZ25tZW50X3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgZ29sZGVuIHRlbXBsYXRlIGluIHRoZSBpbWFnZSB1bmRlciBpbnNwZWN0aW9uLgorICAgIGZsb2F0ICAgICAgcm90YXRpb247IC8vVGhlIHJvdGF0aW9uIG9mIHRoZSBnb2xkZW4gdGVtcGxhdGUgaW4gdGhlIGltYWdlIHVuZGVyIGluc3BlY3Rpb24sIGluIGRlZ3JlZXMuCisgICAgZmxvYXQgICAgICBzY2FsZTsgICAgLy9UaGUgcGVyY2VudGFnZSBvZiB0aGUgc2l6ZSBvZiB0aGUgYXJlYSB1bmRlciBpbnNwZWN0aW9uIGNvbXBhcmVkIHRvIHRoZSBzaXplIG9mIHRoZSBnb2xkZW4gdGVtcGxhdGUuCit9IEluc3BlY3Rpb25BbGlnbm1lbnQ7CisKK3R5cGVkZWYgc3RydWN0IEluc3BlY3Rpb25PcHRpb25zX3N0cnVjdCB7CisgICAgUmVnaXN0cmF0aW9uTWV0aG9kICByZWdpc3RyYXRpb25NZXRob2Q7ICAgIC8vU3BlY2lmaWVzIGhvdyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSBnb2xkZW4gdGVtcGxhdGUgYW5kIHRoZSB0YXJnZXQgaW1hZ2UuCisgICAgTm9ybWFsaXphdGlvbk1ldGhvZCBub3JtYWxpemF0aW9uTWV0aG9kOyAgIC8vU3BlY2lmaWVzIGhvdyB0aGUgZnVuY3Rpb24gbm9ybWFsaXplcyB0aGUgZ29sZGVuIHRlbXBsYXRlIHRvIHRoZSB0YXJnZXQgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBlZGdlVGhpY2tuZXNzVG9JZ25vcmU7IC8vU3BlY2lmaWVzIGRlc2lyZWQgdGhpY2tuZXNzIG9mIGVkZ2VzIHRvIGJlIGlnbm9yZWQuCisgICAgZmxvYXQgICAgICAgICAgICAgICBicmlnaHRUaHJlc2hvbGQ7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgZm9yIGFyZWFzIHdoZXJlIHRoZSB0YXJnZXQgaW1hZ2UgaXMgYnJpZ2h0ZXIgdGhhbiB0aGUgZ29sZGVuIHRlbXBsYXRlLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgZGFya1RocmVzaG9sZDsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgdGhyZXNob2xkIGZvciBhcmVhcyB3aGVyZSB0aGUgdGFyZ2V0IGltYWdlIGlzIGRhcmtlciB0aGFuIHRoZSBnb2xkZW4gdGVtcGxhdGUuCisgICAgaW50ICAgICAgICAgICAgICAgICBiaW5hcnk7ICAgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBiaW5hcnkgaW1hZ2UgZ2l2aW5nIHRoZSBsb2NhdGlvbiBvZiBkZWZlY3RzLCBvciBhIGdyYXlzY2FsZSBpbWFnZSBnaXZpbmcgdGhlIGludGVuc2l0eSBvZiBkZWZlY3RzLgorfSBJbnNwZWN0aW9uT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhclJlcG9ydDJfc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBjaGFyYWN0ZXI7ICAgICAgICAgICAvL1RoZSBjaGFyYWN0ZXIgdmFsdWUuCisgICAgUG9pbnRGbG9hdCAgY29ybmVyWzRdOyAgICAgICAgICAgLy9BbiBhcnJheSBvZiBmb3VyIHBvaW50cyB0aGF0IGRlc2NyaWJlcyB0aGUgcmVjdGFuZ2xlIHRoYXQgc3Vycm91bmRzIHRoZSBjaGFyYWN0ZXIuCisgICAgaW50ICAgICAgICAgbG93VGhyZXNob2xkOyAgICAgICAgLy9UaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkIHJhbmdlIHVzZWQgZm9yIHRoaXMgY2hhcmFjdGVyLgorICAgIGludCAgICAgICAgIGhpZ2hUaHJlc2hvbGQ7ICAgICAgIC8vVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHRocmVzaG9sZCByYW5nZSB1c2VkIGZvciB0aGlzIGNoYXJhY3Rlci4KKyAgICBpbnQgICAgICAgICBjbGFzc2lmaWNhdGlvblNjb3JlOyAvL1RoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIGFzc2lnbmVkIGNoYXJhY3RlciBjbGFzcyByZXByZXNlbnRzIHRoZSBvYmplY3QgYmV0dGVyIHRoYW4gdGhlIG90aGVyIGNoYXJhY3RlciBjbGFzc2VzIGluIHRoZSBjaGFyYWN0ZXIgc2V0LgorICAgIGludCAgICAgICAgIHZlcmlmaWNhdGlvblNjb3JlOyAgIC8vVGhlIHNpbWlsYXJpdHkgb2YgdGhlIGNoYXJhY3RlciBhbmQgdGhlIHJlZmVyZW5jZSBjaGFyYWN0ZXIgZm9yIHRoZSBjaGFyYWN0ZXIgY2xhc3MuCisgICAgaW50ICAgICAgICAgdmVyaWZpZWQ7ICAgICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiBhIHJlZmVyZW5jZSBjaGFyYWN0ZXIgd2FzIGZvdW5kIGZvciB0aGUgY2hhcmFjdGVyIGNsYXNzIGFuZCBGQUxTRSBpZiBhIHJlZmVyZW5jZSBjaGFyYWN0ZXIgd2FzIG5vdCBmb3VuZC4KK30gQ2hhclJlcG9ydDI7CisKK3R5cGVkZWYgc3RydWN0IENoYXJJbmZvMl9zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICBjaGFyVmFsdWU7ICAgICAgIC8vUmV0cmlldmVzIHRoZSBjaGFyYWN0ZXIgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIGluIHRoZSBjaGFyYWN0ZXIgc2V0LgorICAgIGNvbnN0IEltYWdlKiBjaGFySW1hZ2U7ICAgICAgIC8vVGhlIGltYWdlIHlvdSB1c2VkIHRvIHRyYWluIHRoaXMgY2hhcmFjdGVyLgorICAgIGNvbnN0IEltYWdlKiBpbnRlcm5hbEltYWdlOyAgIC8vVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHRoYXQgTkkgVmlzaW9uIHVzZXMgdG8gbWF0Y2ggb2JqZWN0cyB0byB0aGlzIGNoYXJhY3Rlci4KKyAgICBpbnQgICAgICAgICAgaXNSZWZlcmVuY2VDaGFyOyAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgaXMgdGhlIHJlZmVyZW5jZSBjaGFyYWN0ZXIgZm9yIHRoZSBjaGFyYWN0ZXIgY2xhc3MuCit9IENoYXJJbmZvMjsKKwordHlwZWRlZiBzdHJ1Y3QgUmVhZFRleHRSZXBvcnQyX3N0cnVjdCB7CisgICAgY29uc3QgY2hhciogIHJlYWRTdHJpbmc7ICAgICAgICAgIC8vVGhlIHJlYWQgc3RyaW5nLgorICAgIENoYXJSZXBvcnQyKiBjaGFyYWN0ZXJSZXBvcnQ7ICAgICAvL0FuIGFycmF5IG9mIHJlcG9ydHMgZGVzY3JpYmluZyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIGlkZW50aWZpZWQgY2hhcmFjdGVyLgorICAgIGludCAgICAgICAgICBudW1DaGFyYWN0ZXJSZXBvcnRzOyAvL1RoZSBudW1iZXIgb2YgaWRlbnRpZmllZCBjaGFyYWN0ZXJzLgorfSBSZWFkVGV4dFJlcG9ydDI7CisKK3R5cGVkZWYgc3RydWN0IEVsbGlwc2VGZWF0dXJlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgICAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgICAvL1RoZSBvcmllbnRhdGlvbiBvZiB0aGUgc2VtaS1tYWpvciBheGlzIG9mIHRoZSBlbGxpcHNlIHdpdGggcmVzcGVjdCB0byB0aGUgaG9yaXpvbnRhbC4KKyAgICBkb3VibGUgICAgIG1pbm9yUmFkaXVzOyAvL1RoZSBsZW5ndGggb2YgdGhlIHNlbWktbWlub3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIG1ham9yUmFkaXVzOyAvL1RoZSBsZW5ndGggb2YgdGhlIHNlbWktbWFqb3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KK30gRWxsaXBzZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZUZlYXR1cmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHBvc2l0aW9uOyAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICByYWRpdXM7ICAgLy9UaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuCit9IENpcmNsZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IENvbnN0Q3VydmVGZWF0dXJlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgICAvL1RoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSB0aGF0IHRoaXMgY29uc3RhbnQgY3VydmUgbGllcyB1cG9uLgorICAgIGRvdWJsZSAgICAgcmFkaXVzOyAgICAgLy9UaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUgdGhhdCB0aGlzIGNvbnN0YW50IGN1cnZlIGxpZXMgdXBvbi4KKyAgICBkb3VibGUgICAgIHN0YXJ0QW5nbGU7IC8vV2hlbiB0cmF2ZWxpbmcgYWxvbmcgdGhlIGNvbnN0YW50IGN1cnZlIGZyb20gb25lIGVuZHBvaW50IHRvIHRoZSBuZXh0IGluIGEgY291bnRlcmNsb2Nrd2lzZSBtYW5uZXIsIHRoaXMgaXMgdGhlIGFuZ3VsYXIgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3Igb3JpZ2luYXRpbmcgYXQgdGhlIGNlbnRlciBvZiB0aGUgY29uc3RhbnQgY3VydmUgYW5kIHBvaW50aW5nIHRvd2FyZHMgdGhlIGZpcnN0IGVuZHBvaW50IG9mIHRoZSBjb25zdGFudCBjdXJ2ZS4KKyAgICBkb3VibGUgICAgIGVuZEFuZ2xlOyAgIC8vV2hlbiB0cmF2ZWxpbmcgYWxvbmcgdGhlIGNvbnN0YW50IGN1cnZlIGZyb20gb25lIGVuZHBvaW50IHRvIHRoZSBuZXh0IGluIGEgY291bnRlcmNsb2Nrd2lzZSBtYW5uZXIsIHRoaXMgaXMgdGhlIGFuZ3VsYXIgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3Igb3JpZ2luYXRpbmcgYXQgdGhlIGNlbnRlciBvZiB0aGUgY29uc3RhbnQgY3VydmUgYW5kIHBvaW50aW5nIHRvd2FyZHMgdGhlIHNlY29uZCBlbmRwb2ludCBvZiB0aGUgY29uc3RhbnQgY3VydmUuCit9IENvbnN0Q3VydmVGZWF0dXJlOworCit0eXBlZGVmIHN0cnVjdCBSZWN0YW5nbGVGZWF0dXJlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vVGhlIGNlbnRlciBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAvL1RoZSBmb3VyIGNvcm5lcnMgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgLy9UaGUgb3JpZW50YXRpb24gb2YgdGhlIHJlY3RhbmdsZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGhvcml6b250YWwuCisgICAgZG91YmxlICAgICB3aWR0aDsgICAgIC8vVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgZG91YmxlICAgICBoZWlnaHQ7ICAgIC8vVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorfSBSZWN0YW5nbGVGZWF0dXJlOworCit0eXBlZGVmIHN0cnVjdCBMZWdGZWF0dXJlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBsZWcgZmVhdHVyZS4KKyAgICBQb2ludEZsb2F0IGNvcm5lcls0XTsgLy9UaGUgZm91ciBjb3JuZXJzIG9mIHRoZSBsZWcgZmVhdHVyZS4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgLy9UaGUgb3JpZW50YXRpb24gb2YgdGhlIGxlZyB3aXRoIHJlc3BlY3QgdG8gdGhlIGhvcml6b250YWwuCisgICAgZG91YmxlICAgICB3aWR0aDsgICAgIC8vVGhlIHdpZHRoIG9mIHRoZSBsZWcuCisgICAgZG91YmxlICAgICBoZWlnaHQ7ICAgIC8vVGhlIGhlaWdodCBvZiB0aGUgbGVnLgorfSBMZWdGZWF0dXJlOworCit0eXBlZGVmIHN0cnVjdCBDb3JuZXJGZWF0dXJlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgICAgICAvL1RoZSBsb2NhdGlvbiBvZiB0aGUgY29ybmVyIGZlYXR1cmUuCisgICAgZG91YmxlICAgICByb3RhdGlvbjsgICAgICAvL1RoZSBhbmd1bGFyIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGJpc2VjdGluZyB0aGUgY29ybmVyIGZyb20gcG9zaXRpb24uCisgICAgZG91YmxlICAgICBlbmNsb3NlZEFuZ2xlOyAvL1RoZSBtZWFzdXJlIG9mIHRoZSBlbmNsb3NlZCBhbmdsZSBvZiB0aGUgY29ybmVyLgorICAgIGludCAgICAgICAgaXNWaXJ0dWFsOyAgICAgCit9IENvcm5lckZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IExpbmVGZWF0dXJlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBzdGFydFBvaW50OyAvL1RoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZS4KKyAgICBQb2ludEZsb2F0IGVuZFBvaW50OyAgIC8vVGhlIGVuZGluZyBwb2ludCBvZiB0aGUgbGluZS4KKyAgICBkb3VibGUgICAgIGxlbmd0aDsgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgbGluZSBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbSB0aGUgc3RhcnQgcG9pbnQgdG8gdGhlIGVuZCBwb2ludC4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgIC8vVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsaW5lIHdpdGggcmVzcGVjdCB0byB0aGUgaG9yaXpvbnRhbC4KK30gTGluZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBmaXJzdFN0YXJ0UG9pbnQ7ICAvL1RoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgcGFpci4KKyAgICBQb2ludEZsb2F0IGZpcnN0RW5kUG9pbnQ7ICAgIC8vVGhlIGVuZGluZyBwb2ludCBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgcGFpci4KKyAgICBQb2ludEZsb2F0IHNlY29uZFN0YXJ0UG9pbnQ7IC8vVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBzZWNvbmQgbGluZSBvZiB0aGUgcGFpci4KKyAgICBQb2ludEZsb2F0IHNlY29uZEVuZFBvaW50OyAgIC8vVGhlIGVuZGluZyBwb2ludCBvZiB0aGUgc2Vjb25kIGxpbmUgb2YgdGhlIHBhaXIuCisgICAgZG91YmxlICAgICByb3RhdGlvbjsgICAgICAgICAvL1RoZSBvcmllbnRhdGlvbiBvZiB0aGUgZmVhdHVyZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGhvcml6b250YWwuCisgICAgZG91YmxlICAgICBkaXN0YW5jZTsgICAgICAgICAvL1RoZSBkaXN0YW5jZSBmcm9tIHRoZSBmaXJzdCBsaW5lIHRvIHRoZSBzZWNvbmQgbGluZS4KK30gUGFyYWxsZWxMaW5lUGFpckZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IFBhaXJPZlBhcmFsbGVsTGluZVBhaXJzRmVhdHVyZV9zdHJ1Y3QgeworICAgIFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlIGZpcnN0UGFyYWxsZWxMaW5lUGFpcjsgIC8vVGhlIGZpcnN0IHBhcmFsbGVsIGxpbmUgcGFpci4KKyAgICBQYXJhbGxlbExpbmVQYWlyRmVhdHVyZSBzZWNvbmRQYXJhbGxlbExpbmVQYWlyOyAvL1RoZSBzZWNvbmQgcGFyYWxsZWwgbGluZSBwYWlyLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOyAgICAgICAgICAgICAgIC8vVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBmZWF0dXJlIHdpdGggcmVzcGVjdCB0byB0aGUgaG9yaXpvbnRhbC4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICBkaXN0YW5jZTsgICAgICAgICAgICAgICAvL1RoZSBkaXN0YW5jZSBmcm9tIHRoZSBtaWRsaW5lIG9mIHRoZSBmaXJzdCBwYXJhbGxlbCBsaW5lIHBhaXIgdG8gdGhlIG1pZGxpbmUgb2YgdGhlIHNlY29uZCBwYXJhbGxlbCBsaW5lIHBhaXIuCit9IFBhaXJPZlBhcmFsbGVsTGluZVBhaXJzRmVhdHVyZTsKKwordHlwZWRlZiB1bmlvbiBHZW9tZXRyaWNGZWF0dXJlX3VuaW9uIHsKKyAgICBDaXJjbGVGZWF0dXJlKiAgICAgICAgICAgICAgICAgIGNpcmNsZTsgICAgICAgICAgICAgICAgICAvL0EgcG9pbnRlciB0byBhIENpcmNsZUZlYXR1cmUuCisgICAgRWxsaXBzZUZlYXR1cmUqICAgICAgICAgICAgICAgICBlbGxpcHNlOyAgICAgICAgICAgICAgICAgLy9BIHBvaW50ZXIgdG8gYW4gRWxsaXBzZUZlYXR1cmUuCisgICAgQ29uc3RDdXJ2ZUZlYXR1cmUqICAgICAgICAgICAgICBjb25zdEN1cnZlOyAgICAgICAgICAgICAgLy9BIHBvaW50ZXIgdG8gYSBDb25zdEN1cnZlRmVhdHVyZS4KKyAgICBSZWN0YW5nbGVGZWF0dXJlKiAgICAgICAgICAgICAgIHJlY3RhbmdsZTsgICAgICAgICAgICAgICAvL0EgcG9pbnRlciB0byBhIFJlY3RhbmdsZUZlYXR1cmUuCisgICAgTGVnRmVhdHVyZSogICAgICAgICAgICAgICAgICAgICBsZWc7ICAgICAgICAgICAgICAgICAgICAgLy9BIHBvaW50ZXIgdG8gYSBMZWdGZWF0dXJlLgorICAgIENvcm5lckZlYXR1cmUqICAgICAgICAgICAgICAgICAgY29ybmVyOyAgICAgICAgICAgICAgICAgIC8vQSBwb2ludGVyIHRvIGEgQ29ybmVyRmVhdHVyZS4KKyAgICBQYXJhbGxlbExpbmVQYWlyRmVhdHVyZSogICAgICAgIHBhcmFsbGVsTGluZVBhaXI7ICAgICAgICAvL0EgcG9pbnRlciB0byBhIFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlLgorICAgIFBhaXJPZlBhcmFsbGVsTGluZVBhaXJzRmVhdHVyZSogcGFpck9mUGFyYWxsZWxMaW5lUGFpcnM7IC8vQSBwb2ludGVyIHRvIGEgUGFpck9mUGFyYWxsZWxMaW5lUGFpcnNGZWF0dXJlLgorICAgIExpbmVGZWF0dXJlKiAgICAgICAgICAgICAgICAgICAgbGluZTsgICAgICAgICAgICAgICAgICAgIC8vQSBwb2ludGVyIHRvIGEgTGluZUZlYXR1cmUuCisgICAgQ2xvc2VkQ3VydmVGZWF0dXJlKiAgICAgICAgICAgICBjbG9zZWRDdXJ2ZTsgICAgICAgICAgICAgLy9BIHBvaW50ZXIgdG8gYSBDbG9zZWRDdXJ2ZUZlYXR1cmUuCit9IEdlb21ldHJpY0ZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IEZlYXR1cmVEYXRhX3N0cnVjdCB7CisgICAgRmVhdHVyZVR5cGUgICAgICB0eXBlOyAgICAgICAgICAgICAvL0FuIGVudW1lcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUgZmVhdHVyZS4KKyAgICBQb2ludEZsb2F0KiAgICAgIGNvbnRvdXJQb2ludHM7ICAgIC8vQSBzZXQgb2YgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIGNvbnRvdXIgb2YgdGhlIGZlYXR1cmUuCisgICAgaW50ICAgICAgICAgICAgICBudW1Db250b3VyUG9pbnRzOyAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBjb250b3VyUG9pbnRzIGFycmF5LgorICAgIEdlb21ldHJpY0ZlYXR1cmUgZmVhdHVyZTsgICAgICAgICAgLy9UaGUgZmVhdHVyZSBkYXRhIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBmZWF0dXJlLgorfSBGZWF0dXJlRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoMl9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgICBwb3NpdGlvbjsgICAgICAgICAgICAgICAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGVtcGxhdGUgaW4gdGhlIG1hdGNoLgorICAgIGZsb2F0ICAgICAgICByb3RhdGlvbjsgICAgICAgICAgICAgICAgLy9UaGUgcm90YXRpb24gb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSB0ZW1wbGF0ZSBpbWFnZSwgaW4gZGVncmVlcy4KKyAgICBmbG9hdCAgICAgICAgc2NhbGU7ICAgICAgICAgICAgICAgICAgIC8vVGhlIHNpemUgb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSB0ZW1wbGF0ZSBpbWFnZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZS4KKyAgICBmbG9hdCAgICAgICAgc2NvcmU7ICAgICAgICAgICAgICAgICAgIC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaC4KKyAgICBQb2ludEZsb2F0ICAgY29ybmVyWzRdOyAgICAgICAgICAgICAgIC8vQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUgcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgaW52ZXJzZTsgICAgICAgICAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIG1hdGNoIGlzIGFuIGludmVyc2Ugb2YgdGhlIHRlbXBsYXRlIGltYWdlLgorICAgIGZsb2F0ICAgICAgICBvY2NsdXNpb247ICAgICAgICAgICAgICAgLy9UaGUgcGVyY2VudGFnZSBvZiB0aGUgbWF0Y2ggdGhhdCBpcyBvY2NsdWRlZC4KKyAgICBmbG9hdCAgICAgICAgdGVtcGxhdGVNYXRjaEN1cnZlU2NvcmU7IC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieSBjb21wYXJpbmcgdGhlIHRlbXBsYXRlIGN1cnZlcyB0byB0aGUgY3VydmVzIGluIHRoZSBtYXRjaCByZWdpb24uCisgICAgZmxvYXQgICAgICAgIG1hdGNoVGVtcGxhdGVDdXJ2ZVNjb3JlOyAvL1RoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkgY29tcGFyaW5nIHRoZSBjdXJ2ZXMgaW4gdGhlIG1hdGNoIHJlZ2lvbiB0byB0aGUgdGVtcGxhdGUgY3VydmVzLgorICAgIGZsb2F0ICAgICAgICBjb3JyZWxhdGlvblNjb3JlOyAgICAgICAgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5IGNvbXBhcmluZyB0aGUgdGVtcGxhdGUgaW1hZ2UgdG8gdGhlIG1hdGNoIHJlZ2lvbiB1c2luZyBhIGNvcnJlbGF0aW9uIG1ldHJpYyB0aGF0IGNvbXBhcmVzIHRoZSB0d28gcmVnaW9ucyBhcyBhIGZ1bmN0aW9uIG9mIHRoZWlyIHBpeGVsIHZhbHVlcy4KKyAgICBTdHJpbmcyNTUgICAgbGFiZWw7ICAgICAgICAgICAgICAgICAgIC8vVGhlIGxhYmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtYXRjaCB3aGVuIHRoZSBtYXRjaCBpcyByZXR1cm5lZCBieSBpbWFxTWF0Y2hNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5zKCkuCisgICAgRmVhdHVyZURhdGEqIGZlYXR1cmVEYXRhOyAgICAgICAgICAgICAvL1RoZSBmZWF0dXJlcyB1c2VkIGluIHRoaXMgbWF0Y2guCisgICAgaW50ICAgICAgICAgIG51bUZlYXR1cmVEYXRhOyAgICAgICAgICAvL1RoZSBzaXplIG9mIHRoZSBmZWF0dXJlRGF0YSBhcnJheS4KKyAgICBQb2ludEZsb2F0ICAgY2FsaWJyYXRlZFBvc2l0aW9uOyAgICAgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW4gb2YgdGhlIHRlbXBsYXRlIGluIHRoZSBtYXRjaC4KKyAgICBmbG9hdCAgICAgICAgY2FsaWJyYXRlZFJvdGF0aW9uOyAgICAgIC8vVGhlIHJvdGF0aW9uIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgdGVtcGxhdGUgaW1hZ2UsIGluIGRlZ3JlZXMuCisgICAgUG9pbnRGbG9hdCAgIGNhbGlicmF0ZWRDb3JuZXJbNF07ICAgICAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZSBzdXJyb3VuZGluZyB0aGUgdGVtcGxhdGUgaW1hZ2UuCit9IEdlb21ldHJpY1BhdHRlcm5NYXRjaDI7CisKK3R5cGVkZWYgc3RydWN0IENsb3NlZEN1cnZlRmVhdHVyZV9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgcG9zaXRpb247ICAvL1RoZSBjZW50ZXIgb2YgdGhlIGNsb3NlZCBjdXJ2ZSBmZWF0dXJlLgorICAgIGRvdWJsZSAgICAgYXJjTGVuZ3RoOyAvL1RoZSBhcmMgbGVuZ3RoIG9mIHRoZSBjbG9zZWQgY3VydmUgZmVhdHVyZS4KK30gQ2xvc2VkQ3VydmVGZWF0dXJlOworCit0eXBlZGVmIHN0cnVjdCBMaW5lTWF0Y2hfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IHN0YXJ0UG9pbnQ7IC8vVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBtYXRjaGVkIGxpbmUuCisgICAgUG9pbnRGbG9hdCBlbmRQb2ludDsgICAvL1RoZSBlbmRpbmcgcG9pbnQgb2YgdGhlIG1hdGNoZWQgbGluZS4KKyAgICBkb3VibGUgICAgIGxlbmd0aDsgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgbGluZSBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbSB0aGUgc3RhcnQgcG9pbnQgdG8gdGhlIGVuZCBwb2ludC4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgIC8vVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBtYXRjaGVkIGxpbmUuCisgICAgZG91YmxlICAgICBzY29yZTsgICAgICAvL1RoZSBzY29yZSBvZiB0aGUgbWF0Y2hlZCBsaW5lLgorfSBMaW5lTWF0Y2g7CisKK3R5cGVkZWYgc3RydWN0IExpbmVEZXNjcmlwdG9yX3N0cnVjdCB7CisgICAgZG91YmxlIG1pbkxlbmd0aDsgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gbGVuZ3RoIG9mIGEgbGluZSB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4uCisgICAgZG91YmxlIG1heExlbmd0aDsgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgbGluZSB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4uCit9IExpbmVEZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBSZWN0YW5nbGVEZXNjcmlwdG9yX3N0cnVjdCB7CisgICAgZG91YmxlIG1pbldpZHRoOyAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gd2lkdGggb2YgYSByZWN0YW5nbGUgdGhlIGFsZ29yaXRobSB3aWxsIHJldHVybi4KKyAgICBkb3VibGUgbWF4V2lkdGg7ICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSB3aWR0aCBvZiBhIHJlY3RhbmdsZSB0aGUgYWxnb3JpdGhtIHdpbGwgcmV0dXJuLgorICAgIGRvdWJsZSBtaW5IZWlnaHQ7IC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGhlaWdodCBvZiBhIHJlY3RhbmdsZSB0aGUgYWxnb3JpdGhtIHdpbGwgcmV0dXJuLgorICAgIGRvdWJsZSBtYXhIZWlnaHQ7IC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGhlaWdodCBvZiBhIHJlY3RhbmdsZSB0aGUgYWxnb3JpdGhtIHdpbGwgcmV0dXJuLgorfSBSZWN0YW5nbGVEZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBSZWN0YW5nbGVNYXRjaF9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAvL1RoZSBjb3JuZXJzIG9mIHRoZSBtYXRjaGVkIHJlY3RhbmdsZS4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgLy9UaGUgb3JpZW50YXRpb24gb2YgdGhlIG1hdGNoZWQgcmVjdGFuZ2xlLgorICAgIGRvdWJsZSAgICAgd2lkdGg7ICAgICAvL1RoZSB3aWR0aCBvZiB0aGUgbWF0Y2hlZCByZWN0YW5nbGUuCisgICAgZG91YmxlICAgICBoZWlnaHQ7ICAgIC8vVGhlIGhlaWdodCBvZiB0aGUgbWF0Y2hlZCByZWN0YW5nbGUuCisgICAgZG91YmxlICAgICBzY29yZTsgICAgIC8vVGhlIHNjb3JlIG9mIHRoZSBtYXRjaGVkIHJlY3RhbmdsZS4KK30gUmVjdGFuZ2xlTWF0Y2g7CisKK3R5cGVkZWYgc3RydWN0IEVsbGlwc2VEZXNjcmlwdG9yX3N0cnVjdCB7CisgICAgZG91YmxlIG1pbk1ham9yUmFkaXVzOyAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBsZW5ndGggb2YgdGhlIHNlbWktbWFqb3IgYXhpcyBvZiBhbiBlbGxpcHNlIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybi4KKyAgICBkb3VibGUgbWF4TWFqb3JSYWRpdXM7IC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2VtaS1tYWpvciBheGlzIG9mIGFuIGVsbGlwc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuLgorICAgIGRvdWJsZSBtaW5NaW5vclJhZGl1czsgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBzZW1pLW1pbm9yIGF4aXMgb2YgYW4gZWxsaXBzZSB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4uCisgICAgZG91YmxlIG1heE1pbm9yUmFkaXVzOyAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHNlbWktbWlub3IgYXhpcyBvZiBhbiBlbGxpcHNlIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybi4KK30gRWxsaXBzZURlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IEVsbGlwc2VNYXRjaF9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgcG9zaXRpb247ICAgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIG1hdGNoZWQgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIHJvdGF0aW9uOyAgICAvL1RoZSBvcmllbnRhdGlvbiBvZiB0aGUgbWF0Y2hlZCBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgbWFqb3JSYWRpdXM7IC8vVGhlIGxlbmd0aCBvZiB0aGUgc2VtaS1tYWpvciBheGlzIG9mIHRoZSBtYXRjaGVkIGVsbGlwc2UuCisgICAgZG91YmxlICAgICBtaW5vclJhZGl1czsgLy9UaGUgbGVuZ3RoIG9mIHRoZSBzZW1pLW1pbm9yIGF4aXMgb2YgdGhlIG1hdGNoZWQgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIHNjb3JlOyAgICAgICAvL1RoZSBzY29yZSBvZiB0aGUgbWF0Y2hlZCBlbGxpcHNlLgorfSBFbGxpcHNlTWF0Y2g7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZU1hdGNoX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgLy9UaGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbWF0Y2hlZCBjaXJjbGUuCisgICAgZG91YmxlICAgICByYWRpdXM7ICAgLy9UaGUgcmFkaXVzIG9mIHRoZSBtYXRjaGVkIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIHNjb3JlOyAgICAvL1RoZSBzY29yZSBvZiB0aGUgbWF0Y2hlZCBjaXJjbGUuCit9IENpcmNsZU1hdGNoOworCit0eXBlZGVmIHN0cnVjdCBDaXJjbGVEZXNjcmlwdG9yX3N0cnVjdCB7CisgICAgZG91YmxlIG1pblJhZGl1czsgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gcmFkaXVzIG9mIGEgY2lyY2xlIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybi4KKyAgICBkb3VibGUgbWF4UmFkaXVzOyAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSByYWRpdXMgb2YgYSBjaXJjbGUgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuLgorfSBDaXJjbGVEZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBTaGFwZURldGVjdGlvbk9wdGlvbnNfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZTsgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtZXRob2QgdXNlZCB3aGVuIGxvb2tpbmcgZm9yIHRoZSBzaGFwZSBpbiB0aGUgaW1hZ2UuCisgICAgUmFuZ2VGbG9hdCogIGFuZ2xlUmFuZ2VzOyAgICAvL0FuIGFycmF5IG9mIGFuZ2xlIHJhbmdlcywgaW4gZGVncmVlcywgd2hlcmUgZWFjaCByYW5nZSBzcGVjaWZpZXMgaG93IG11Y2ggeW91IGV4cGVjdCB0aGUgc2hhcGUgdG8gYmUgcm90YXRlZCBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgIG51bUFuZ2xlUmFuZ2VzOyAvL1RoZSBzaXplIG9mIHRoZSBvcmllbnRhdGlvblJhbmdlcyBhcnJheS4KKyAgICBSYW5nZUZsb2F0ICAgc2NhbGVSYW5nZTsgICAgIC8vQSByYW5nZSB0aGF0IHNwZWNpZmllcyB0aGUgc2l6ZXMgb2YgdGhlIHNoYXBlcyB5b3UgZXhwZWN0IHRvIGJlIGluIHRoZSBpbWFnZSwgZXhwcmVzc2VkIGFzIGEgcmF0aW8gcGVyY2VudGFnZSByZXByZXNlbnRpbmcgdGhlIHNpemUgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIGltYWdlIGRpdmlkZWQgYnkgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgcGF0dGVybiBtdWx0aXBsaWVkIGJ5IDEwMC4KKyAgICBkb3VibGUgICAgICAgbWluTWF0Y2hTY29yZTsgIAorfSBTaGFwZURldGVjdGlvbk9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEN1cnZlX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCogIHBvaW50czsgICAgICAgICAgICAgIC8vVGhlIHBvaW50cyBvbiB0aGUgY3VydmUuCisgICAgdW5zaWduZWQgaW50IG51bVBvaW50czsgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGN1cnZlLgorICAgIGludCAgICAgICAgICBjbG9zZWQ7ICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQgYW5kIEZBTFNFIGlmIHRoZSBjdXJ2ZSBpcyBvcGVuLgorICAgIGRvdWJsZSAgICAgICBjdXJ2ZUxlbmd0aDsgICAgICAgICAvL1RoZSBsZW5ndGggb2YgdGhlIGN1cnZlLgorICAgIGRvdWJsZSAgICAgICBtaW5FZGdlU3RyZW5ndGg7ICAgICAvL1RoZSBsb3dlc3QgZWRnZSBzdHJlbmd0aCBkZXRlY3RlZCBvbiB0aGUgY3VydmUuCisgICAgZG91YmxlICAgICAgIG1heEVkZ2VTdHJlbmd0aDsgICAgIC8vVGhlIGhpZ2hlc3QgZWRnZSBzdHJlbmd0aCBkZXRlY3RlZCBvbiB0aGUgY3VydmUuCisgICAgZG91YmxlICAgICAgIGF2ZXJhZ2VFZGdlU3RyZW5ndGg7IC8vVGhlIGF2ZXJhZ2Ugb2YgYWxsIGVkZ2Ugc3RyZW5ndGhzIGRldGVjdGVkIG9uIHRoZSBjdXJ2ZS4KK30gQ3VydmU7CisKK3R5cGVkZWYgc3RydWN0IEN1cnZlT3B0aW9uc19zdHJ1Y3QgeworICAgIEV4dHJhY3Rpb25Nb2RlIGV4dHJhY3Rpb25Nb2RlOyAgIC8vU3BlY2lmaWVzIHRoZSBtZXRob2QgdGhlIGZ1bmN0aW9uIHVzZXMgdG8gaWRlbnRpZnkgY3VydmVzIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICB0aHJlc2hvbGQ7ICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBjb250cmFzdCBhIHNlZWQgcG9pbnQgbXVzdCBoYXZlIGluIG9yZGVyIHRvIGJlZ2luIGEgY3VydmUuCisgICAgRWRnZUZpbHRlclNpemUgZmlsdGVyU2l6ZTsgICAgICAgLy9TcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBlZGdlIGZpbHRlciB0aGUgZnVuY3Rpb24gdXNlcyB0byBpZGVudGlmeSBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgIG1pbkxlbmd0aDsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIHBpeGVscywgb2YgdGhlIHNtYWxsZXN0IGN1cnZlIHRoZSBmdW5jdGlvbiB3aWxsIGV4dHJhY3QuCisgICAgaW50ICAgICAgICAgICAgcm93U3RlcFNpemU7ICAgICAgLy9TcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiB0aGUgeSBkaXJlY3Rpb24sIGJldHdlZW4gbGluZXMgdGhlIGZ1bmN0aW9uIGluc3BlY3RzIGZvciBjdXJ2ZSBzZWVkIHBvaW50cy4KKyAgICBpbnQgICAgICAgICAgICBjb2x1bW5TdGVwU2l6ZTsgICAvL1NwZWNpZmllcyB0aGUgZGlzdGFuY2UsIGluIHRoZSB4IGRpcmVjdGlvbiwgYmV0d2VlbiBjb2x1bW5zIHRoZSBmdW5jdGlvbiBpbnNwZWN0cyBmb3IgY3VydmUgc2VlZCBwb2ludHMuCisgICAgaW50ICAgICAgICAgICAgbWF4RW5kUG9pbnRHYXA7ICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gZ2FwLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIGVuZHBvaW50cyBvZiBhIGN1cnZlIHRoYXQgdGhlIGZ1bmN0aW9uIGlkZW50aWZpZXMgYXMgYSBjbG9zZWQgY3VydmUuCisgICAgaW50ICAgICAgICAgICAgb25seUNsb3NlZDsgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgb25seSBpZGVudGlmeSBjbG9zZWQgY3VydmVzIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICBzdWJwaXhlbEFjY3VyYWN5OyAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIGlkZW50aWZpZXMgdGhlIGxvY2F0aW9uIG9mIGN1cnZlcyB3aXRoIHN1YnBpeGVsIGFjY3VyYWN5IGJ5IGludGVycG9sYXRpbmcgYmV0d2VlbiBwb2ludHMgdG8gZmluZCB0aGUgY3Jvc3Npbmcgb2YgdGhyZXNob2xkLgorfSBDdXJ2ZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEJhcmNvZGUyREluZm9fc3RydWN0IHsKKyAgICBCYXJjb2RlMkRUeXBlICB0eXBlOyAgICAgICAgICAgICAgICAgLy9UaGUgdHlwZSBvZiB0aGUgMkQgYmFyY29kZS4KKyAgICBpbnQgICAgICAgICAgICBiaW5hcnk7ICAgICAgICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgMkQgYmFyY29kZSBjb250YWlucyBiaW5hcnkgZGF0YSBhbmQgRkFMU0UgaWYgdGhlIDJEIGJhcmNvZGUgY29udGFpbnMgdGV4dCBkYXRhLgorICAgIHVuc2lnbmVkIGNoYXIqIGRhdGE7ICAgICAgICAgICAgICAgICAvL1RoZSBkYXRhIGVuY29kZWQgaW4gdGhlIDJEIGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgZGF0YUxlbmd0aDsgICAgICAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBhcnJheS4KKyAgICBQb2ludEZsb2F0ICAgICBib3VuZGluZ0JveFs0XTsgICAgICAgLy9BbiBhcnJheSBvZiBmb3VyIHBvaW50cyBkZXNjcmliaW5nIHRoZSByZWN0YW5nbGUgc3Vycm91bmRpbmcgdGhlIDJEIGJhcmNvZGUuCisgICAgdW5zaWduZWQgaW50ICAgbnVtRXJyb3JzQ29ycmVjdGVkOyAgIC8vVGhlIG51bWJlciBvZiBlcnJvcnMgdGhlIGZ1bmN0aW9uIGNvcnJlY3RlZCB3aGVuIGRlY29kaW5nIHRoZSAyRCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgIG51bUVyYXN1cmVzQ29ycmVjdGVkOyAvL1RoZSBudW1iZXIgb2YgZXJhc3VyZXMgdGhlIGZ1bmN0aW9uIGNvcnJlY3RlZCB3aGVuIGRlY29kaW5nIHRoZSAyRCBiYXJjb2RlLgorICAgIHVuc2lnbmVkIGludCAgIHJvd3M7ICAgICAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgMkQgYmFyY29kZS4KKyAgICB1bnNpZ25lZCBpbnQgICBjb2x1bW5zOyAgICAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIDJEIGJhcmNvZGUuCit9IEJhcmNvZGUyREluZm87CisKK3R5cGVkZWYgc3RydWN0IERhdGFNYXRyaXhPcHRpb25zX3N0cnVjdCB7CisgICAgQmFyY29kZTJEU2VhcmNoTW9kZSBzZWFyY2hNb2RlOyAgIC8vU3BlY2lmaWVzIHRoZSBtb2RlIHRoZSBmdW5jdGlvbiB1c2VzIHRvIHNlYXJjaCBmb3IgYmFyY29kZXMuCisgICAgQmFyY29kZTJEQ29udHJhc3QgICBjb250cmFzdDsgICAgIC8vU3BlY2lmaWVzIHRoZSBjb250cmFzdCBvZiB0aGUgYmFyY29kZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yLgorICAgIEJhcmNvZGUyRENlbGxTaGFwZSAgY2VsbFNoYXBlOyAgICAvL1NwZWNpZmllcyB0aGUgc2hhcGUgb2YgdGhlIGJhcmNvZGUgZGF0YSBjZWxscywgd2hpY2ggYWZmZWN0cyBob3cgdGhlIGZ1bmN0aW9uIGRlY29kZXMgdGhlIGJhcmNvZGUuCisgICAgQmFyY29kZTJEU2hhcGUgICAgICBiYXJjb2RlU2hhcGU7IC8vU3BlY2lmaWVzIHRoZSBzaGFwZSBvZiB0aGUgYmFyY29kZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yLgorICAgIERhdGFNYXRyaXhTdWJ0eXBlICAgc3VidHlwZTsgICAgICAvL1NwZWNpZmllcyB0aGUgRGF0YSBNYXRyaXggc3VidHlwZXMgb2YgdGhlIGJhcmNvZGVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvci4KK30gRGF0YU1hdHJpeE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJBY2N1cmFjeVJlcG9ydF9zdHJ1Y3QgeworICAgIGludCAgICAgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIHNpemUgb2YgdGhlIGFycmF5cyBpbiB0aGlzIHN0cnVjdHVyZS4KKyAgICBmbG9hdCAgIGFjY3VyYWN5OyAgICAgICAgICAgICAgICAgICAvL1RoZSBvdmVyYWxsIGFjY3VyYWN5IG9mIHRoZSBjbGFzc2lmaWVyLCBmcm9tIDAgdG8gMTAwMC4KKyAgICBjaGFyKiogIGNsYXNzTmFtZXM7ICAgICAgICAgICAgICAgICAvL1RoZSBuYW1lcyBvZiB0aGUgY2xhc3NlcyBvZiB0aGlzIGNsYXNzaWZpZXIuCisgICAgZG91YmxlKiBjbGFzc0FjY3VyYWN5OyAgICAgICAgICAgICAgLy9BbiBhcnJheSBvZiBzaXplIGVsZW1lbnRzIHRoYXQgY29udGFpbnMgYWNjdXJhY3kgaW5mb3JtYXRpb24gZm9yIGVhY2ggY2xhc3MuCisgICAgZG91YmxlKiBjbGFzc1ByZWRpY3RpdmVWYWx1ZTsgICAgICAgLy9BbiBhcnJheSBjb250YWluaW5nIHNpemUgZWxlbWVudHMgdGhhdCBjb250YWlucyB0aGUgcHJlZGljdGl2ZSB2YWx1ZXMgb2YgZWFjaCBjbGFzcy4KKyAgICBpbnQqKiAgIGNsYXNzaWZpY2F0aW9uRGlzdHJpYnV0aW9uOyAvL0EgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSBjbGFzc2lmaWVyIGNsYXNzaWZpZXMgaXRzIHNhbXBsZXMuCit9IENsYXNzaWZpZXJBY2N1cmFjeVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTmVhcmVzdE5laWdoYm9yQ2xhc3NSZXN1bHRfc3RydWN0IHsKKyAgICBjaGFyKiBjbGFzc05hbWU7ICAgICAgICAgLy9UaGUgbmFtZSBvZiB0aGUgY2xhc3MuCisgICAgZmxvYXQgc3RhbmRhcmREZXZpYXRpb247IC8vVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVtYmVycyBvZiB0aGlzIGNsYXNzLgorICAgIGludCAgIGNvdW50OyAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGlzIGNsYXNzLgorfSBOZWFyZXN0TmVpZ2hib3JDbGFzc1Jlc3VsdDsKKwordHlwZWRlZiBzdHJ1Y3QgTmVhcmVzdE5laWdoYm9yVHJhaW5pbmdSZXBvcnRfc3RydWN0IHsKKyAgICBmbG9hdCoqICAgICAgICAgICAgICAgICAgICAgY2xhc3NEaXN0YW5jZXNUYWJsZTsgLy9UaGUgY29uZmlkZW5jZSBpbiB0aGUgdHJhaW5pbmcuCisgICAgTmVhcmVzdE5laWdoYm9yQ2xhc3NSZXN1bHQqIGFsbFNjb3JlczsgICAgICAgICAgIC8vQWxsIGNsYXNzZXMgYW5kIHRoZWlyIHNjb3Jlcy4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYWxsU2NvcmVzU2l6ZTsgICAgICAgLy9UaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYWxsU2NvcmVzLgorfSBOZWFyZXN0TmVpZ2hib3JUcmFpbmluZ1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgbWFudWFsVGhyZXNob2xkOyAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhlIHRocmVzaG9sZCByYW5nZSBtYW51YWxseS4KKyAgICBSYW5nZUZsb2F0ICAgICAgbWFudWFsVGhyZXNob2xkUmFuZ2U7IC8vSWYgYSBtYW51YWwgdGhyZXNob2xkIGlzIGJlaW5nIGRvbmUsIHRoZSByYW5nZSBvZiBwaXhlbHMgdG8ga2VlcC4KKyAgICBUaHJlc2hvbGRNZXRob2QgYXV0b1RocmVzaG9sZE1ldGhvZDsgIC8vSWYgYW4gYXV0b21hdGljIHRocmVzaG9sZCBpcyBiZWluZyBkb25lLCB0aGUgbWV0aG9kIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0aHJlc2hvbGQgcmFuZ2UuCisgICAgUmFuZ2VGbG9hdCAgICAgIGxpbWl0czsgICAgICAgICAgICAgICAvL1RoZSBsaW1pdHMgb24gdGhlIGF1dG9tYXRpYyB0aHJlc2hvbGQgcmFuZ2UuCisgICAgUGFydGljbGVUeXBlICAgIHBhcnRpY2xlVHlwZTsgICAgICAgICAvL1NwZWNpZmllcyB3aGF0IGtpbmQgb2YgcGFydGljbGVzIHRvIGxvb2sgZm9yLgorICAgIGludCAgICAgICAgICAgICByZWplY3RCb3JkZXI7ICAgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gcmVqZWN0IGJvcmRlciBwYXJ0aWNsZXMuCisgICAgaW50ICAgICAgICAgICAgIG51bUVyb3Npb25zOyAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgZXJvc2lvbnMgdG8gcGVyZm9ybS4KK30gUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJTYW1wbGVJbmZvX3N0cnVjdCB7CisgICAgY2hhciogICBjbGFzc05hbWU7ICAgICAgICAgLy9UaGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhpcyBzYW1wbGUgaXMgaW4uCisgICAgZG91YmxlKiBmZWF0dXJlVmVjdG9yOyAgICAgLy9UaGUgZmVhdHVyZSB2ZWN0b3Igb2YgdGhpcyBzYW1wbGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSBjdXN0b20gY2xhc3NpZmllciBzZXNzaW9uLgorICAgIGludCAgICAgZmVhdHVyZVZlY3RvclNpemU7IC8vVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCisgICAgSW1hZ2UqICB0aHVtYm5haWw7ICAgICAgICAgLy9BIHRodW1ibmFpbCBpbWFnZSBvZiB0aGlzIHNhbXBsZSwgb3IgTlVMTCBpZiBubyBpbWFnZSB3YXMgc3BlY2lmaWVkLgorfSBDbGFzc2lmaWVyU2FtcGxlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NTY29yZV9zdHJ1Y3QgeworICAgIGNoYXIqIGNsYXNzTmFtZTsgLy9UaGUgbmFtZSBvZiB0aGUgY2xhc3MuCisgICAgZmxvYXQgZGlzdGFuY2U7ICAvL1RoZSBkaXN0YW5jZSBmcm9tIHRoZSBpdGVtIHRvIHRoaXMgY2xhc3MuCit9IENsYXNzU2NvcmU7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJSZXBvcnRfc3RydWN0IHsKKyAgICBjaGFyKiAgICAgICBiZXN0Q2xhc3NOYW1lOyAgICAgICAvL1RoZSBuYW1lIG9mIHRoZSBiZXN0IGNsYXNzIGZvciB0aGUgc2FtcGxlLgorICAgIGZsb2F0ICAgICAgIGNsYXNzaWZpY2F0aW9uU2NvcmU7IC8vVGhlIHNpbWlsYXJpdHkgb2YgdGhlIHNhbXBsZSBhbmQgdGhlIHR3byBjbG9zZXN0IGNsYXNzZXMgaW4gdGhlIGNsYXNzaWZpZXIuCisgICAgZmxvYXQgICAgICAgaWRlbnRpZmljYXRpb25TY29yZTsgLy9UaGUgc2ltaWxhcml0eSBvZiB0aGUgc2FtcGxlIGFuZCB0aGUgYXNzaWduZWQgY2xhc3MuCisgICAgQ2xhc3NTY29yZSogYWxsU2NvcmVzOyAgICAgICAgICAgLy9BbGwgY2xhc3NlcyBhbmQgdGhlaXIgc2NvcmVzLgorICAgIGludCAgICAgICAgIGFsbFNjb3Jlc1NpemU7ICAgICAgIC8vVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGFsbFNjb3Jlcy4KK30gQ2xhc3NpZmllclJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTmVhcmVzdE5laWdoYm9yT3B0aW9uc19zdHJ1Y3QgeworICAgIE5lYXJlc3ROZWlnaGJvck1ldGhvZCBtZXRob2Q7IC8vVGhlIG1ldGhvZCB0byB1c2UuCisgICAgTmVhcmVzdE5laWdoYm9yTWV0cmljIG1ldHJpYzsgLy9UaGUgbWV0cmljIHRvIHVzZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgazsgICAgICAvL1RoZSB2YWx1ZSBvZiBrLCBpZiB0aGUgSU1BUV9LX05FQVJFU1RfTkVJR0hCT1IgbWV0aG9kIGlzIHVzZWQuCit9IE5lYXJlc3ROZWlnaGJvck9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnNfc3RydWN0IHsKKyAgICBmbG9hdCBzY2FsZURlcGVuZGVuY2U7ICAvL1RoZSByZWxhdGl2ZSBpbXBvcnRhbmNlIG9mIHNjYWxlIHdoZW4gY2xhc3NpZnlpbmcgcGFydGljbGVzLgorICAgIGZsb2F0IG1pcnJvckRlcGVuZGVuY2U7IC8vVGhlIHJlbGF0aXZlIGltcG9ydGFuY2Ugb2YgbWlycm9yIHN5bW1ldHJ5IHdoZW4gY2xhc3NpZnlpbmcgcGFydGljbGVzLgorfSBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBSR0JVNjRWYWx1ZV9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIHNob3J0IEI7ICAgICAvL1RoZSBibHVlIHZhbHVlIG9mIHRoZSBjb2xvci4KKyAgICB1bnNpZ25lZCBzaG9ydCBHOyAgICAgLy9UaGUgZ3JlZW4gdmFsdWUgb2YgdGhlIGNvbG9yLgorICAgIHVuc2lnbmVkIHNob3J0IFI7ICAgICAvL1RoZSByZWQgdmFsdWUgb2YgdGhlIGNvbG9yLgorICAgIHVuc2lnbmVkIHNob3J0IGFscGhhOyAvL1RoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3IsIHdoaWNoIHJlcHJlc2VudHMgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2xvciBpbWFnZSwgc3VjaCBhcyBnYW1tYSBjb3JyZWN0aW9uLgorfSBSR0JVNjRWYWx1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgICAgICAgICAgICAgICAgLy9UaGUgbG9jYXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGVtcGxhdGUgaW4gdGhlIG1hdGNoLgorICAgIGZsb2F0ICAgICAgcm90YXRpb247ICAgICAgICAgICAgICAgIC8vVGhlIHJvdGF0aW9uIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgdGVtcGxhdGUgaW1hZ2UsIGluIGRlZ3JlZXMuCisgICAgZmxvYXQgICAgICBzY2FsZTsgICAgICAgICAgICAgICAgICAgLy9UaGUgc2l6ZSBvZiB0aGUgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHRlbXBsYXRlIGltYWdlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLgorICAgIGZsb2F0ICAgICAgc2NvcmU7ICAgICAgICAgICAgICAgICAgIC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaC4KKyAgICBQb2ludEZsb2F0IGNvcm5lcls0XTsgICAgICAgICAgICAgICAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZSBzdXJyb3VuZGluZyB0aGUgdGVtcGxhdGUgaW1hZ2UuCisgICAgaW50ICAgICAgICBpbnZlcnNlOyAgICAgICAgICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgbWF0Y2ggaXMgYW4gaW52ZXJzZSBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UuCisgICAgZmxvYXQgICAgICBvY2NsdXNpb247ICAgICAgICAgICAgICAgLy9UaGUgcGVyY2VudGFnZSBvZiB0aGUgbWF0Y2ggdGhhdCBpcyBvY2NsdWRlZC4KKyAgICBmbG9hdCAgICAgIHRlbXBsYXRlTWF0Y2hDdXJ2ZVNjb3JlOyAvL1RoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkgY29tcGFyaW5nIHRoZSB0ZW1wbGF0ZSBjdXJ2ZXMgdG8gdGhlIGN1cnZlcyBpbiB0aGUgbWF0Y2ggcmVnaW9uLgorICAgIGZsb2F0ICAgICAgbWF0Y2hUZW1wbGF0ZUN1cnZlU2NvcmU7IC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieSBjb21wYXJpbmcgdGhlIGN1cnZlcyBpbiB0aGUgbWF0Y2ggcmVnaW9uIHRvIHRoZSB0ZW1wbGF0ZSBjdXJ2ZXMuCisgICAgZmxvYXQgICAgICBjb3JyZWxhdGlvblNjb3JlOyAgICAgICAgLy9UaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5IGNvbXBhcmluZyB0aGUgdGVtcGxhdGUgaW1hZ2UgdG8gdGhlIG1hdGNoIHJlZ2lvbiB1c2luZyBhIGNvcnJlbGF0aW9uIG1ldHJpYyB0aGF0IGNvbXBhcmVzIHRoZSB0d28gcmVnaW9ucyBhcyBhIGZ1bmN0aW9uIG9mIHRoZWlyIHBpeGVsIHZhbHVlcy4KK30gR2VvbWV0cmljUGF0dGVybk1hdGNoOworCit0eXBlZGVmIHN0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgbWluRmVhdHVyZXNVc2VkOyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmZWF0dXJlcyB0aGUgZnVuY3Rpb24gdXNlcyB3aGVuIG1hdGNoaW5nLgorICAgIGludCAgICBtYXhGZWF0dXJlc1VzZWQ7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHRoZSBmdW5jdGlvbiB1c2VzIHdoZW4gbWF0Y2hpbmcuCisgICAgaW50ICAgIHN1YnBpeGVsSXRlcmF0aW9uczsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIHVzZWQgdG8gcmVmaW5lIG1hdGNoZXMgd2l0aCBzdWJwaXhlbCBpbmZvcm1hdGlvbi4KKyAgICBkb3VibGUgc3VicGl4ZWxUb2xlcmFuY2U7ICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjaGFuZ2UsIGluIHBpeGVscywgYmV0d2VlbiBjb25zZWN1dGl2ZSBpbmNyZW1lbnRhbCBpbXByb3ZlbWVudHMgaW4gdGhlIG1hdGNoIHBvc2l0aW9uIGJlZm9yZSB0aGUgZnVuY3Rpb24gc3RvcHMgcmVmaW5pbmcgdGhlIG1hdGNoIHBvc2l0aW9uLgorICAgIGludCAgICBpbml0aWFsTWF0Y2hMaXN0TGVuZ3RoOyAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggbGlzdC4KKyAgICBpbnQgICAgbWF0Y2hUZW1wbGF0ZUN1cnZlU2NvcmU7ICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSB0aGUgbWF0Y2ggY3VydmUgdG8gdGVtcGxhdGUgY3VydmUgc2NvcmUgYW5kIHJldHVybiBpdCBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgICAgaW50ICAgIGNvcnJlbGF0aW9uU2NvcmU7ICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBjYWxjdWxhdGUgdGhlIGNvcnJlbGF0aW9uIHNjb3JlIGFuZCByZXR1cm4gaXQgZm9yIGVhY2ggbWF0Y2ggcmVzdWx0LgorICAgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25EaXN0YW5jZTsgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gc2VwYXJhdGlvbiBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSBvcmlnaW5zIG9mIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgcG9zaXRpb25zLgorICAgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25BbmdsZTsgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gYW5ndWxhciBkaWZmZXJlbmNlLCBpbiBkZWdyZWVzLCBiZXR3ZWVuIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgYW5nbGVzLgorICAgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25TY2FsZTsgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gZGlmZmVyZW5jZSBpbiBzY2FsZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgYmV0d2VlbiB0d28gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIHNjYWxlcy4KKyAgICBkb3VibGUgbWF4TWF0Y2hPdmVybGFwOyAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBvdmVybGFwLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLCBhbGxvd2VkIGJldHdlZW4gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZXMgb2YgdHdvIHVuaXF1ZSBtYXRjaGVzLgorICAgIGludCAgICBjb2Fyc2VSZXN1bHQ7ICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgZnVuY3Rpb24gdG8gc3BlbmQgbGVzcyB0aW1lIGFjY3VyYXRlbHkgZXN0aW1hdGluZyB0aGUgbG9jYXRpb24gb2YgYSBtYXRjaC4KK30gTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zX3N0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IG1vZGU7ICAgICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtZXRob2QgaW1hcU1hdGNoR2VvbWV0cmljUGF0dGVybigpIHVzZXMgd2hlbiBsb29raW5nIGZvciB0aGUgcGF0dGVybiBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgIHN1YnBpeGVsQWNjdXJhY3k7ICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSBtYXRjaCBsb2NhdGlvbnMgd2l0aCBzdWJwaXhlbCBhY2N1cmFjeS4KKyAgICBSYW5nZUZsb2F0KiAgYW5nbGVSYW5nZXM7ICAgICAgICAgLy9BbiBhcnJheSBvZiBhbmdsZSByYW5nZXMsIGluIGRlZ3JlZXMsIHdoZXJlIGVhY2ggcmFuZ2Ugc3BlY2lmaWVzIGhvdyBtdWNoIHlvdSBleHBlY3QgdGhlIHRlbXBsYXRlIHRvIGJlIHJvdGF0ZWQgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICBudW1BbmdsZVJhbmdlczsgICAgICAvL051bWJlciBvZiBhbmdsZSByYW5nZXMgaW4gdGhlIGFuZ2xlUmFuZ2VzIGFycmF5LgorICAgIFJhbmdlRmxvYXQgICBzY2FsZVJhbmdlOyAgICAgICAgICAvL0EgcmFuZ2UgdGhhdCBzcGVjaWZpZXMgdGhlIHNpemVzIG9mIHRoZSBwYXR0ZXJuIHlvdSBleHBlY3QgdG8gYmUgaW4gdGhlIGltYWdlLCBleHByZXNzZWQgYXMgYSByYXRpbyBwZXJjZW50YWdlIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBvZiB0aGUgcGF0dGVybiBpbiB0aGUgaW1hZ2UgZGl2aWRlZCBieSBzaXplIG9mIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIG11bHRpcGxpZWQgYnkgMTAwLgorICAgIFJhbmdlRmxvYXQgICBvY2NsdXNpb25SYW5nZTsgICAgICAvL0EgcmFuZ2UgdGhhdCBzcGVjaWZpZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBhdHRlcm4geW91IGV4cGVjdCB0byBiZSBvY2NsdWRlZCBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgIG51bU1hdGNoZXNSZXF1ZXN0ZWQ7IC8vTnVtYmVyIG9mIHZhbGlkIG1hdGNoZXMgZXhwZWN0ZWQuCisgICAgZmxvYXQgICAgICAgIG1pbk1hdGNoU2NvcmU7ICAgICAgIC8vVGhlIG1pbmltdW0gc2NvcmUgYSBtYXRjaCBjYW4gaGF2ZSBmb3IgdGhlIGZ1bmN0aW9uIHRvIGNvbnNpZGVyIHRoZSBtYXRjaCB2YWxpZC4KK30gTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5HZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgIG1pblJlY3RMZW5ndGg7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gbGVuZ3RoIGZvciBlYWNoIHNpZGUgb2YgYSByZWN0YW5ndWxhciBmZWF0dXJlLgorICAgIGRvdWJsZSBtaW5SZWN0QXNwZWN0UmF0aW87ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGFzcGVjdCByYXRpbyBvZiBhIHJlY3Rhbmd1bGFyIGZlYXR1cmUuCisgICAgaW50ICAgIG1pblJhZGl1czsgICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gcmFkaXVzIGZvciBhIGNpcmN1bGFyIGZlYXR1cmUuCisgICAgaW50ICAgIG1pbkxpbmVMZW5ndGg7ICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1pbmltdW0gbGVuZ3RoIGZvciBhIGxpbmVhciBmZWF0dXJlLgorICAgIGRvdWJsZSBtaW5GZWF0dXJlU3RyZW5ndGg7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHN0cmVuZ3RoIGZvciBhIGZlYXR1cmUuCisgICAgaW50ICAgIG1heEZlYXR1cmVzVXNlZDsgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHRoZSBmdW5jdGlvbiB1c2VzIHdoZW4gbGVhcm5pbmcuCisgICAgaW50ICAgIG1heFBpeGVsRGlzdGFuY2VGcm9tTGluZTsgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBpeGVscyBiZXR3ZWVuIGFuIGVkZ2UgcGl4ZWwgYW5kIGEgbGluZWFyIGZlYXR1cmUgZm9yIHRoZSBmdW5jdGlvbiB0byBjb25zaWRlciB0aGF0IGVkZ2UgcGl4ZWwgYXMgcGFydCBvZiB0aGUgbGluZWFyIGZlYXR1cmUuCit9IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRml0RWxsaXBzZU9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgcmVqZWN0T3V0bGllcnM7IC8vV2hldGhlciB0byB1c2UgZXZlcnkgZ2l2ZW4gcG9pbnQgb3Igb25seSBhIHN1YnNldCBvZiB0aGUgcG9pbnRzIHRvIGZpdCB0aGUgZWxsaXBzZS4KKyAgICBkb3VibGUgbWluU2NvcmU7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSByZXF1aXJlZCBxdWFsaXR5IG9mIHRoZSBmaXR0ZWQgZWxsaXBzZS4KKyAgICBkb3VibGUgcGl4ZWxSYWRpdXM7ICAgIC8vVGhlIGFjY2VwdGFibGUgZGlzdGFuY2UsIGluIHBpeGVscywgdGhhdCBhIHBvaW50IGRldGVybWluZWQgdG8gYmVsb25nIHRvIHRoZSBlbGxpcHNlIGNhbiBiZSBmcm9tIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBlbGxpcHNlLgorICAgIGludCAgICBtYXhJdGVyYXRpb25zOyAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiByZWZpbmVtZW50IGl0ZXJhdGlvbnMgeW91IGFsbG93IHRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBpbml0aWFsIHN1YnNldCBvZiBwb2ludHMuCit9IEZpdEVsbGlwc2VPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBGaXRDaXJjbGVPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgIHJlamVjdE91dGxpZXJzOyAvL1doZXRoZXIgdG8gdXNlIGV2ZXJ5IGdpdmVuIHBvaW50IG9yIG9ubHkgYSBzdWJzZXQgb2YgdGhlIHBvaW50cyB0byBmaXQgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgbWluU2NvcmU7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSByZXF1aXJlZCBxdWFsaXR5IG9mIHRoZSBmaXR0ZWQgY2lyY2xlLgorICAgIGRvdWJsZSBwaXhlbFJhZGl1czsgICAgLy9UaGUgYWNjZXB0YWJsZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCB0aGF0IGEgcG9pbnQgZGV0ZXJtaW5lZCB0byBiZWxvbmcgdG8gdGhlIGNpcmNsZSBjYW4gYmUgZnJvbSB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2lyY2xlLgorICAgIGludCAgICBtYXhJdGVyYXRpb25zOyAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiByZWZpbmVtZW50IGl0ZXJhdGlvbnMgeW91IGFsbG93IHRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBpbml0aWFsIHN1YnNldCBvZiBwb2ludHMuCit9IEZpdENpcmNsZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENvbnN0cnVjdFJPSU9wdGlvbnMyX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgIHdpbmRvd051bWJlcjsgLy9UaGUgd2luZG93IG51bWJlciBvZiB0aGUgaW1hZ2Ugd2luZG93LgorICAgIGNvbnN0IGNoYXIqICB3aW5kb3dUaXRsZTsgIC8vU3BlY2lmaWVzIHRoZSBtZXNzYWdlIHN0cmluZyB0aGF0IHRoZSBmdW5jdGlvbiBkaXNwbGF5cyBpbiB0aGUgdGl0bGUgYmFyIG9mIHRoZSB3aW5kb3cuCisgICAgUGFsZXR0ZVR5cGUgIHR5cGU7ICAgICAgICAgLy9UaGUgcGFsZXR0ZSB0eXBlIHRvIHVzZS4KKyAgICBSR0JWYWx1ZSogICAgcGFsZXR0ZTsgICAgICAvL0lmIHR5cGUgaXMgSU1BUV9QQUxFVFRFX1VTRVIsIHRoaXMgYXJyYXkgaXMgdGhlIHBhbGV0dGUgb2YgY29sb3JzIHRvIHVzZSB3aXRoIHRoZSB3aW5kb3cuCisgICAgaW50ICAgICAgICAgIG51bUNvbG9yczsgICAgLy9JZiB0eXBlIGlzIElNQVFfUEFMRVRURV9VU0VSLCB0aGlzIGVsZW1lbnQgaXMgdGhlIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIHBhbGV0dGUgYXJyYXkuCisgICAgdW5zaWduZWQgaW50IG1heENvbnRvdXJzOyAgLy9UaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgdGhlIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbGVjdC4KK30gQ29uc3RydWN0Uk9JT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IEhTTFZhbHVlX3N0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBMOyAgICAgLy9UaGUgY29sb3IgbHVtaW5hbmNlLgorICAgIHVuc2lnbmVkIGNoYXIgUzsgICAgIC8vVGhlIGNvbG9yIHNhdHVyYXRpb24uCisgICAgdW5zaWduZWQgY2hhciBIOyAgICAgLy9UaGUgY29sb3IgaHVlLgorICAgIHVuc2lnbmVkIGNoYXIgYWxwaGE7IC8vVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb2xvciwgd2hpY2ggcmVwcmVzZW50cyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hIGNvcnJlY3Rpb24uCit9IEhTTFZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBIU1ZWYWx1ZV9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgVjsgICAgIC8vVGhlIGNvbG9yIHZhbHVlLgorICAgIHVuc2lnbmVkIGNoYXIgUzsgICAgIC8vVGhlIGNvbG9yIHNhdHVyYXRpb24uCisgICAgdW5zaWduZWQgY2hhciBIOyAgICAgLy9UaGUgY29sb3IgaHVlLgorICAgIHVuc2lnbmVkIGNoYXIgYWxwaGE7IC8vVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb2xvciwgd2hpY2ggcmVwcmVzZW50cyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hIGNvcnJlY3Rpb24uCit9IEhTVlZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBIU0lWYWx1ZV9zdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgSTsgICAgIC8vVGhlIGNvbG9yIGludGVuc2l0eS4KKyAgICB1bnNpZ25lZCBjaGFyIFM7ICAgICAvL1RoZSBjb2xvciBzYXR1cmF0aW9uLgorICAgIHVuc2lnbmVkIGNoYXIgSDsgICAgIC8vVGhlIGNvbG9yIGh1ZS4KKyAgICB1bnNpZ25lZCBjaGFyIGFscGhhOyAvL1RoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3IsIHdoaWNoIHJlcHJlc2VudHMgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2xvciBpbWFnZSwgc3VjaCBhcyBnYW1tYSBjb3JyZWN0aW9uLgorfSBIU0lWYWx1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ0lFTGFiVmFsdWVfc3RydWN0IHsKKyAgICBkb3VibGUgICAgICAgIGI7ICAgICAvL1RoZSB5ZWxsb3cvYmx1ZSBpbmZvcm1hdGlvbiBvZiB0aGUgY29sb3IuCisgICAgZG91YmxlICAgICAgICBhOyAgICAgLy9UaGUgcmVkL2dyZWVuIGluZm9ybWF0aW9uIG9mIHRoZSBjb2xvci4KKyAgICBkb3VibGUgICAgICAgIEw7ICAgICAvL1RoZSBjb2xvciBsaWdodG5lc3MuCisgICAgdW5zaWduZWQgY2hhciBhbHBoYTsgLy9UaGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbG9yLCB3aGljaCByZXByZXNlbnRzIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IGEgY29sb3IgaW1hZ2UsIHN1Y2ggYXMgZ2FtbWEgY29ycmVjdGlvbi4KK30gQ0lFTGFiVmFsdWU7CisKK3R5cGVkZWYgc3RydWN0IENJRVhZWlZhbHVlX3N0cnVjdCB7CisgICAgZG91YmxlICAgICAgICBaOyAgICAgLy9UaGUgWiBjb2xvciBpbmZvcm1hdGlvbi4KKyAgICBkb3VibGUgICAgICAgIFk7ICAgICAvL1RoZSBjb2xvciBsdW1pbmFuY2UuCisgICAgZG91YmxlICAgICAgICBYOyAgICAgLy9UaGUgWCBjb2xvciBpbmZvcm1hdGlvbi4KKyAgICB1bnNpZ25lZCBjaGFyIGFscGhhOyAvL1RoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3IsIHdoaWNoIHJlcHJlc2VudHMgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2xvciBpbWFnZSwgc3VjaCBhcyBnYW1tYSBjb3JyZWN0aW9uLgorfSBDSUVYWVpWYWx1ZTsKKwordHlwZWRlZiB1bmlvbiBDb2xvcjJfdW5pb24geworICAgIFJHQlZhbHVlICAgIHJnYjsgICAgICAvL1RoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgUkdCIChSZWQsIEdyZWVuLCBhbmQgQmx1ZSkgY29sb3Igc3BhY2UuCisgICAgSFNMVmFsdWUgICAgaHNsOyAgICAgIC8vVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBIU0wgKEh1ZSwgU2F0dXJhdGlvbiwgYW5kIEx1bWluYW5jZSkgY29sb3Igc3BhY2UuCisgICAgSFNWVmFsdWUgICAgaHN2OyAgICAgIC8vVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBIU0kgKEh1ZSwgU2F0dXJhdGlvbiwgYW5kIFZhbHVlKSBjb2xvciBzcGFjZS4KKyAgICBIU0lWYWx1ZSAgICBoc2k7ICAgICAgLy9UaGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlc2NyaWJlIGEgY29sb3IgaW4gdGhlIEhTSSAoSHVlLCBTYXR1cmF0aW9uLCBhbmQgSW50ZW5zaXR5KSBjb2xvciBzcGFjZS4KKyAgICBDSUVMYWJWYWx1ZSBjaWVMYWI7ICAgLy9UaGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlc2NyaWJlIGEgY29sb3IgaW4gdGhlIENJRSBMKmEqYiogKEwsIGEsIGIpIGNvbG9yIHNwYWNlLgorICAgIENJRVhZWlZhbHVlIGNpZVhZWjsgICAvL1RoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgQ0lFIFhZWiAoWCwgWSwgWikgY29sb3Igc3BhY2UuCisgICAgaW50ICAgICAgICAgcmF3VmFsdWU7IC8vVGhlIGludGVnZXIgdmFsdWUgZm9yIHRoZSBkYXRhIGluIHRoZSBjb2xvciB1bmlvbi4KK30gQ29sb3IyOworCit0eXBlZGVmIHN0cnVjdCBCZXN0RWxsaXBzZTJfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IGNlbnRlcjsgICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuCisgICAgUG9pbnRGbG9hdCBtYWpvckF4aXNTdGFydDsgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIG1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgICAgUG9pbnRGbG9hdCBtYWpvckF4aXNFbmQ7ICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBtYWpvciBheGlzIG9mIHRoZSBlbGxpcHNlLgorICAgIFBvaW50RmxvYXQgbWlub3JBeGlzU3RhcnQ7IC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBtaW5vciBheGlzIG9mIHRoZSBlbGxpcHNlLgorICAgIFBvaW50RmxvYXQgbWlub3JBeGlzRW5kOyAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbWlub3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIGFyZWE7ICAgICAgICAgICAvL1RoZSBhcmVhIG9mIHRoZSBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgcGVyaW1ldGVyOyAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgcGVyaW1ldGVyIG9mIHRoZSBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgZXJyb3I7ICAgICAgICAgIC8vUmVwcmVzZW50cyB0aGUgbGVhc3Qgc3F1YXJlIGVycm9yIG9mIHRoZSBmaXR0ZWQgZWxsaXBzZSB0byB0aGUgZW50aXJlIHNldCBvZiBwb2ludHMuCisgICAgaW50ICAgICAgICB2YWxpZDsgICAgICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgZnVuY3Rpb24gYWNoaWV2ZWQgdGhlIG1pbmltdW0gc2NvcmUgd2l0aGluIHRoZSBudW1iZXIgb2YgYWxsb3dlZCByZWZpbmVtZW50IGl0ZXJhdGlvbnMgYW5kIEZBTFNFIGlmIHRoZSBmdW5jdGlvbiBkaWQgbm90IGFjaGlldmUgdGhlIG1pbmltdW0gc2NvcmUuCisgICAgaW50KiAgICAgICBwb2ludHNVc2VkOyAgICAgLy9BbiBhcnJheSBvZiB0aGUgaW5kZXhlcyBmb3IgdGhlIHBvaW50cyBhcnJheSBpbmRpY2F0aW5nIHdoaWNoIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaXQgdGhlIGVsbGlwc2UuCisgICAgaW50ICAgICAgICBudW1Qb2ludHNVc2VkOyAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaXQgdGhlIGVsbGlwc2UuCit9IEJlc3RFbGxpcHNlMjsKKwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5QYXR0ZXJuQWR2YW5jZWRPcHRpb25zX3N0cnVjdCB7CisgICAgTGVhcm5QYXR0ZXJuQWR2YW5jZWRTaGlmdE9wdGlvbnMqICAgIHNoaWZ0T3B0aW9uczsgICAgLy9Vc2UgdGhpcyBlbGVtZW50IHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIGltYXFMZWFyblBhdHRlcm4yKCkgZHVyaW5nIHRoZSBzaGlmdC1pbnZhcmlhbnQgbGVhcm5pbmcgcGhhc2UuCisgICAgTGVhcm5QYXR0ZXJuQWR2YW5jZWRSb3RhdGlvbk9wdGlvbnMqIHJvdGF0aW9uT3B0aW9uczsgLy9Vc2UgdGhpcyBlbGVtZW50IHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIGltYXFMZWFyblBhdHRlcm4yKClkdXJpbmcgdGhlIHJvdGF0aW9uLWludmFyaWFudCBsZWFybmluZyBwaGFzZS4KK30gTGVhcm5QYXR0ZXJuQWR2YW5jZWRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBBVklJbmZvX3N0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IHdpZHRoOyAgICAgICAgICAgLy9UaGUgd2lkdGggb2YgZWFjaCBmcmFtZS4KKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0OyAgICAgICAgICAvL1RoZSBoZWlnaHQgb2YgZWFjaCBmcmFtZS4KKyAgICBJbWFnZVR5cGUgICAgaW1hZ2VUeXBlOyAgICAgICAvL1RoZSB0eXBlIG9mIGltYWdlcyB0aGlzIEFWSSBjb250YWlucy4KKyAgICB1bnNpZ25lZCBpbnQgbnVtRnJhbWVzOyAgICAgICAvL1RoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBBVkkuCisgICAgdW5zaWduZWQgaW50IGZyYW1lc1BlclNlY29uZDsgLy9UaGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgc2Vjb25kIHRoaXMgQVZJIHNob3VsZCBiZSBzaG93biBhdC4KKyAgICBjaGFyKiAgICAgICAgZmlsdGVyTmFtZTsgICAgICAvL1RoZSBuYW1lIG9mIHRoZSBjb21wcmVzc2lvbiBmaWx0ZXIgdXNlZCB0byBjcmVhdGUgdGhpcyBBVkkuCisgICAgaW50ICAgICAgICAgIGhhc0RhdGE7ICAgICAgICAgLy9TcGVjaWZpZXMgd2hldGhlciB0aGlzIEFWSSBoYXMgZGF0YSBhdHRhY2hlZCB0byBlYWNoIGZyYW1lIG9yIG5vdC4KKyAgICB1bnNpZ25lZCBpbnQgbWF4RGF0YVNpemU7ICAgICAvL0lmIHRoaXMgQVZJIGhhcyBkYXRhLCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBkYXRhIGluIGVhY2ggZnJhbWUuCit9IEFWSUluZm87CisKK3R5cGVkZWYgc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkU2hpZnRPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgIGluaXRpYWxTdGVwU2l6ZTsgICAgICAgICAgLy9UaGUgbGFyZ2VzdCBudW1iZXIgb2YgaW1hZ2UgcGl4ZWxzIHRvIHNoaWZ0IHRoZSBzYW1wbGUgYWNyb3NzIHRoZSBpbnNwZWN0aW9uIGltYWdlIGR1cmluZyB0aGUgaW5pdGlhbCBwaGFzZSBvZiBzaGlmdC1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgaW50ICAgIGluaXRpYWxTYW1wbGVTaXplOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBwaXhlbHMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIGluIGEgc2FtcGxlIGZvciB0aGUgaW5pdGlhbCBwaGFzZSBvZiBzaGlmdC1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgZG91YmxlIGluaXRpYWxTYW1wbGVTaXplRmFjdG9yOyAgLy9TcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHNhbXBsZSBmb3IgdGhlIGluaXRpYWwgcGhhc2Ugb2Ygc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nIGFzIGEgcGVyY2VudCBvZiB0aGUgdGVtcGxhdGUgc2l6ZSwgaW4gcGl4ZWxzLgorICAgIGludCAgICBmaW5hbFNhbXBsZVNpemU7ICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgcGl4ZWxzIHlvdSB3YW50IHRvIGFkZCB0byBpbml0aWFsU2FtcGxlU2l6ZSBmb3IgdGhlIGZpbmFsIHBoYXNlIG9mIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyAgICBkb3VibGUgZmluYWxTYW1wbGVTaXplRmFjdG9yOyAgICAvL1NwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGZvciB0aGUgZmluYWwgcGhhc2Ugb2Ygc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nIGFzIGEgcGVyY2VudCBvZiB0aGUgZWRnZSBwb2ludHMgaW4gdGhlIHRlbXBsYXRlLCBpbiBwaXhlbHMuCisgICAgaW50ICAgIHN1YnBpeGVsU2FtcGxlU2l6ZTsgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBwaXhlbHMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIGluIGEgc2FtcGxlIGZvciB0aGUgc3VicGl4ZWwgcGhhc2Ugb2Ygc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nLgorICAgIGRvdWJsZSBzdWJwaXhlbFNhbXBsZVNpemVGYWN0b3I7IC8vU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZm9yIHRoZSBzdWJwaXhlbCBwaGFzZSBvZiBzaGlmdC1pbnZhcmlhbnQgbWF0Y2hpbmcgYXMgYSBwZXJjZW50IG9mIHRoZSB0ZW1wbGF0ZSBzaXplLCBpbiBwaXhlbHMuCit9IExlYXJuUGF0dGVybkFkdmFuY2VkU2hpZnRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZFJvdGF0aW9uT3B0aW9uc19zdHJ1Y3QgeworICAgIFNlYXJjaFN0cmF0ZWd5IHNlYXJjaFN0cmF0ZWd5U3VwcG9ydDsgICAgLy9TcGVjaWZpZXMgdGhlIGFnZ3Jlc3NpdmVuZXNzIG9mIHRoZSByb3RhdGlvbiBzZWFyY2ggc3RyYXRlZ3kgYXZhaWxhYmxlIGR1cmluZyB0aGUgbWF0Y2hpbmcgcGhhc2UuCisgICAgaW50ICAgICAgICAgICAgaW5pdGlhbFN0ZXBTaXplOyAgICAgICAgICAvL1RoZSBsYXJnZXN0IG51bWJlciBvZiBpbWFnZSBwaXhlbHMgdG8gc2hpZnQgdGhlIHNhbXBsZSBhY3Jvc3MgdGhlIGluc3BlY3Rpb24gaW1hZ2UgZHVyaW5nIHRoZSBpbml0aWFsIHBoYXNlIG9mIG1hdGNoaW5nLgorICAgIGludCAgICAgICAgICAgIGluaXRpYWxTYW1wbGVTaXplOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBwaXhlbHMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIGluIGEgc2FtcGxlIGZvciB0aGUgaW5pdGlhbCBwaGFzZSBvZiByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgZG91YmxlICAgICAgICAgaW5pdGlhbFNhbXBsZVNpemVGYWN0b3I7ICAvL1NwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGZvciB0aGUgaW5pdGlhbCBwaGFzZSBvZiByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcgYXMgYSBwZXJjZW50IG9mIHRoZSB0ZW1wbGF0ZSBzaXplLCBpbiBwaXhlbHMuCisgICAgaW50ICAgICAgICAgICAgaW5pdGlhbEFuZ3VsYXJBY2N1cmFjeTsgICAvL1NldHMgdGhlIGFuZ2xlIGFjY3VyYWN5LCBpbiBkZWdyZWVzLCB0byB1c2UgZHVyaW5nIHRoZSBpbml0aWFsIHBoYXNlIG9mIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyAgICBpbnQgICAgICAgICAgICBmaW5hbFNhbXBsZVNpemU7ICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgcGl4ZWxzIHlvdSB3YW50IHRvIGFkZCB0byBpbml0aWFsU2FtcGxlU2l6ZSBmb3IgdGhlIGZpbmFsIHBoYXNlIG9mIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyAgICBkb3VibGUgICAgICAgICBmaW5hbFNhbXBsZVNpemVGYWN0b3I7ICAgIC8vU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZm9yIHRoZSBmaW5hbCBwaGFzZSBvZiByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcgYXMgYSBwZXJjZW50IG9mIHRoZSBlZGdlIHBvaW50cyBpbiB0aGUgdGVtcGxhdGUsIGluIHBpeGVscy4KKyAgICBpbnQgICAgICAgICAgICBmaW5hbEFuZ3VsYXJBY2N1cmFjeTsgICAgIC8vU2V0cyB0aGUgYW5nbGUgYWNjdXJhY3ksIGluIGRlZ3JlZXMsIHRvIHVzZSBkdXJpbmcgdGhlIGZpbmFsIHBoYXNlIG9mIHRoZSByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgaW50ICAgICAgICAgICAgc3VicGl4ZWxTYW1wbGVTaXplOyAgICAgICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHBpeGVscyB0aGF0IHlvdSB3YW50IHRvIGluY2x1ZGUgaW4gYSBzYW1wbGUgZm9yIHRoZSBzdWJwaXhlbCBwaGFzZSBvZiByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgZG91YmxlICAgICAgICAgc3VicGl4ZWxTYW1wbGVTaXplRmFjdG9yOyAvL1NwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGZvciB0aGUgc3VicGl4ZWwgcGhhc2Ugb2Ygcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nIGFzIGEgcGVyY2VudCBvZiB0aGUgdGVtcGxhdGUgc2l6ZSwgaW4gcGl4ZWxzLgorfSBMZWFyblBhdHRlcm5BZHZhbmNlZFJvdGF0aW9uT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgc3VicGl4ZWxJdGVyYXRpb25zOyAgICAgICAgICAvL0RlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluY3JlbWVudGFsIGltcHJvdmVtZW50cyB1c2VkIHRvIHJlZmluZSBtYXRjaGluZyB1c2luZyBzdWJwaXhlbCBpbmZvcm1hdGlvbi4KKyAgICBkb3VibGUgICAgICAgICBzdWJwaXhlbFRvbGVyYW5jZTsgICAgICAgICAgIC8vRGVmaW5lcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2hhbmdlLCBpbiBwaXhlbHMsIGJldHdlZW4gY29uc2VjdXRpdmUgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIGluIHRoZSBtYXRjaCBwb3NpdGlvbiB0aGF0IHlvdSB3YW50IHRvIHRyaWdnZXIgdGhlIGVuZCBvZiB0aGUgcmVmaW5lbWVudCBwcm9jZXNzLgorICAgIGludCAgICAgICAgICAgIGluaXRpYWxNYXRjaExpc3RMZW5ndGg7ICAgICAgLy9TcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggbGlzdC4KKyAgICBpbnQgICAgICAgICAgICBtYXRjaExpc3RSZWR1Y3Rpb25GYWN0b3I7ICAgIC8vU3BlY2lmaWVzIHRoZSByZWR1Y3Rpb24gb2YgdGhlIG1hdGNoIGxpc3QgYXMgbWF0Y2hlcyBhcmUgcmVmaW5lZC4KKyAgICBpbnQgICAgICAgICAgICBpbml0aWFsU3RlcFNpemU7ICAgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRvIHNoaWZ0IHRoZSBzYW1wbGUgYWNyb3NzIHRoZSBpbnNwZWN0aW9uIGltYWdlIGR1cmluZyB0aGUgaW5pdGlhbCBwaGFzZSBvZiBzaGlmdC1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgICAgU2VhcmNoU3RyYXRlZ3kgc2VhcmNoU3RyYXRlZ3k7ICAgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgYWdncmVzc2l2ZW5lc3Mgb2YgdGhlIHJvdGF0aW9uIHNlYXJjaCBzdHJhdGVneS4KKyAgICBpbnQgICAgICAgICAgICBpbnRlcm1lZGlhdGVBbmd1bGFyQWNjdXJhY3k7IC8vU3BlY2lmaWVzIHRoZSBhY2N1cmFjeSB0byB1c2UgZHVyaW5nIHRoZSBpbnRlcm1lZGlhdGUgcGhhc2Ugb2Ygcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorfSBNYXRjaFBhdHRlcm5BZHZhbmNlZE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyX3N0cnVjdCB7CisgICAgTWVhc3VyZW1lbnRUeXBlIHBhcmFtZXRlcjsgIC8vVGhlIG1vcnBob2xvZ2ljYWwgbWVhc3VyZW1lbnQgdGhhdCB0aGUgZnVuY3Rpb24gdXNlcyBmb3IgZmlsdGVyaW5nLgorICAgIGZsb2F0ICAgICAgICAgICBsb3dlcjsgICAgICAvL1RoZSBsb3dlciBib3VuZCBvZiB0aGUgY3JpdGVyaWEgcmFuZ2UuCisgICAgZmxvYXQgICAgICAgICAgIHVwcGVyOyAgICAgIC8vVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBjcml0ZXJpYSByYW5nZS4KKyAgICBpbnQgICAgICAgICAgICAgY2FsaWJyYXRlZDsgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gdGFrZSBjYWxpYnJhdGVkIG1lYXN1cmVtZW50cy4KKyAgICBpbnQgICAgICAgICAgICAgZXhjbHVkZTsgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gaW5kaWNhdGUgdGhhdCBhIG1hdGNoIG9jY3VycyB3aGVuIHRoZSBtZWFzdXJlbWVudCBpcyBvdXRzaWRlIHRoZSBjcml0ZXJpYSByYW5nZS4KK30gUGFydGljbGVGaWx0ZXJDcml0ZXJpYTI7CisKK3R5cGVkZWYgc3RydWN0IEJlc3RDaXJjbGUyX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBjZW50ZXI7ICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIHJhZGl1czsgICAgICAgIC8vVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLgorICAgIGRvdWJsZSAgICAgYXJlYTsgICAgICAgICAgLy9UaGUgYXJlYSBvZiB0aGUgY2lyY2xlLgorICAgIGRvdWJsZSAgICAgcGVyaW1ldGVyOyAgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICBkb3VibGUgICAgIGVycm9yOyAgICAgICAgIC8vUmVwcmVzZW50cyB0aGUgbGVhc3Qgc3F1YXJlIGVycm9yIG9mIHRoZSBmaXR0ZWQgY2lyY2xlIHRvIHRoZSBlbnRpcmUgc2V0IG9mIHBvaW50cy4KKyAgICBpbnQgICAgICAgIHZhbGlkOyAgICAgICAgIC8vVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGZ1bmN0aW9uIGFjaGlldmVkIHRoZSBtaW5pbXVtIHNjb3JlIHdpdGhpbiB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmVmaW5lbWVudCBpdGVyYXRpb25zIGFuZCBGQUxTRSBpZiB0aGUgZnVuY3Rpb24gZGlkIG5vdCBhY2hpZXZlIHRoZSBtaW5pbXVtIHNjb3JlLgorICAgIGludCogICAgICAgcG9pbnRzVXNlZDsgICAgLy9BbiBhcnJheSBvZiB0aGUgaW5kZXhlcyBmb3IgdGhlIHBvaW50cyBhcnJheSBpbmRpY2F0aW5nIHdoaWNoIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaXQgdGhlIGNpcmNsZS4KKyAgICBpbnQgICAgICAgIG51bVBvaW50c1VzZWQ7IC8vVGhlIG51bWJlciBvZiBwb2ludHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZml0IHRoZSBjaXJjbGUuCit9IEJlc3RDaXJjbGUyOworCit0eXBlZGVmIHN0cnVjdCBPQ1JTcGFjaW5nT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCBtaW5DaGFyU3BhY2luZzsgICAgICAgICAgICAgIC8vVGhlIG1pbmltdW0gbnVtYmVyIG9mIHBpeGVscyB0aGF0IG11c3QgYmUgYmV0d2VlbiB0d28gY2hhcmFjdGVycyBmb3IgTkkgVmlzaW9uIHRvIHRyYWluIG9yIHJlYWQgdGhlIGNoYXJhY3RlcnMgc2VwYXJhdGVseS4KKyAgICBpbnQgbWluQ2hhclNpemU7ICAgICAgICAgICAgICAgICAvL1RoZSBtaW5pbXVtIG51bWJlciBvZiBwaXhlbHMgcmVxdWlyZWQgZm9yIGFuIG9iamVjdCB0byBiZSBhIHBvdGVudGlhbGx5IGlkZW50aWZpYWJsZSBjaGFyYWN0ZXIuCisgICAgaW50IG1heENoYXJTaXplOyAgICAgICAgICAgICAgICAgLy9UaGUgbWF4aW11bSBudW1iZXIgb2YgcGl4ZWxzIHJlcXVpcmVkIGZvciBhbiBvYmplY3QgdG8gYmUgYSBwb3RlbnRpYWxseSBpZGVudGlmaWFibGUgY2hhcmFjdGVyLgorICAgIGludCBtYXhIb3Jpem9udGFsRWxlbWVudFNwYWNpbmc7IC8vVGhlIG1heGltdW0gaG9yaXpvbnRhbCBzcGFjaW5nLCBpbiBwaXhlbHMsIGFsbG93ZWQgYmV0d2VlbiBjaGFyYWN0ZXIgZWxlbWVudHMgdG8gdHJhaW4gb3IgcmVhZCB0aGUgY2hhcmFjdGVyIGVsZW1lbnRzIGFzIGEgc2luZ2xlIGNoYXJhY3Rlci4KKyAgICBpbnQgbWF4VmVydGljYWxFbGVtZW50U3BhY2luZzsgICAvL1RoZSBtYXhpbXVtIHZlcnRpY2FsIGVsZW1lbnQgc3BhY2luZyBpbiBwaXhlbHMuCisgICAgaW50IG1pbkJvdW5kaW5nUmVjdFdpZHRoOyAgICAgICAgLy9UaGUgbWluaW11bSBwb3NzaWJsZSB3aWR0aCwgaW4gcGl4ZWxzLCBmb3IgYSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgIGludCBtYXhCb3VuZGluZ1JlY3RXaWR0aDsgICAgICAgIC8vVGhlIG1heGltdW0gcG9zc2libGUgd2lkdGgsIGluIHBpeGVscywgZm9yIGEgY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICBpbnQgbWluQm91bmRpbmdSZWN0SGVpZ2h0OyAgICAgICAvL1RoZSBtaW5pbXVtIHBvc3NpYmxlIGhlaWdodCwgaW4gcGl4ZWxzLCBmb3IgYSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgIGludCBtYXhCb3VuZGluZ1JlY3RIZWlnaHQ7ICAgICAgIC8vVGhlIG1heGltdW0gcG9zc2libGUgaGVpZ2h0LCBpbiBwaXhlbHMsIGZvciBhIGNoYXJhY3RlciBib3VuZGluZyByZWN0YW5nbGUuCisgICAgaW50IGF1dG9TcGxpdDsgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gYXV0b21hdGljYWxseSBhZGp1c3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlIHdoZW4gY2hhcmFjdGVycyBvdmVybGFwIHZlcnRpY2FsbHkuCit9IE9DUlNwYWNpbmdPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBPQ1JQcm9jZXNzaW5nT3B0aW9uc19zdHJ1Y3QgeworICAgIFRocmVzaG9sZE1vZGUgbW9kZTsgICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIHRocmVzaG9sZGluZyBtb2RlLgorICAgIGludCAgICAgICAgICAgbG93VGhyZXNob2xkOyAgICAgICAgICAgICAgIC8vVGhlIGxvdyB0aHJlc2hvbGQgdmFsdWUgd2hlbiB5b3Ugc2V0IG1vZGUgdG8gSU1BUV9GSVhFRF9SQU5HRS4KKyAgICBpbnQgICAgICAgICAgIGhpZ2hUaHJlc2hvbGQ7ICAgICAgICAgICAgICAvL1RoZSBoaWdoIHRocmVzaG9sZCB2YWx1ZSB3aGVuIHlvdSBzZXQgbW9kZSB0byBJTUFRX0ZJWEVEX1JBTkdFLgorICAgIGludCAgICAgICAgICAgYmxvY2tDb3VudDsgICAgICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBibG9ja3MgZm9yIHRocmVzaG9sZCBjYWxjdWxhdGlvbiBhbGdvcml0aG1zIHRoYXQgcmVxdWlyZSBibG9ja3MuCisgICAgaW50ICAgICAgICAgICBmYXN0VGhyZXNob2xkOyAgICAgICAgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gdXNlIGEgZmFzdGVyLCBsZXNzIGFjY3VyYXRlIHRocmVzaG9sZCBjYWxjdWxhdGlvbiBhbGdvcml0aG0uCisgICAgaW50ICAgICAgICAgICBiaU1vZGFsQ2FsY3VsYXRpb247ICAgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gY2FsY3VsYXRlIGJvdGggdGhlIGxvdyBhbmQgaGlnaCB0aHJlc2hvbGQgdmFsdWVzIHdoZW4gdXNpbmcgdGhlIGZhc3QgdGhyZXNob2xkaW5nIG1ldGhvZC4KKyAgICBpbnQgICAgICAgICAgIGRhcmtDaGFyYWN0ZXJzOyAgICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byByZWFkIG9yIHRyYWluIGRhcmsgY2hhcmFjdGVycyBvbiBhIGxpZ2h0IGJhY2tncm91bmQuCisgICAgaW50ICAgICAgICAgICByZW1vdmVQYXJ0aWNsZXNUb3VjaGluZ1JPSTsgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gcmVtb3ZlIHRoZSBwYXJ0aWNsZXMgdG91Y2hpbmcgdGhlIFJPSS4KKyAgICBpbnQgICAgICAgICAgIGVyb3Npb25Db3VudDsgICAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgZXJvc2lvbnMgdG8gcGVyZm9ybS4KK30gT0NSUHJvY2Vzc2luZ09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0T3B0aW9uc19zdHJ1Y3QgeworICAgIFN0cmluZzI1NSAgICAgIHZhbGlkQ2hhcnNbMjU1XTsgIC8vQW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IHNwZWNpZmllcyB0aGUgdmFsaWQgY2hhcmFjdGVycy4KKyAgICBpbnQgICAgICAgICAgICBudW1WYWxpZENoYXJzOyAgICAvL1RoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgdmFsaWRDaGFycyBhcnJheSB0aGF0IHlvdSBoYXZlIGluaXRpYWxpemVkLgorICAgIGNoYXIgICAgICAgICAgIHN1YnN0aXR1dGlvbkNoYXI7IC8vVGhlIGNoYXJhY3RlciB0byBzdWJzdGl0dXRlIGZvciBvYmplY3RzIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbm5vdCBtYXRjaCB3aXRoIGFueSBvZiB0aGUgdHJhaW5lZCBjaGFyYWN0ZXJzLgorICAgIFJlYWRTdHJhdGVneSAgIHJlYWRTdHJhdGVneTsgICAgIC8vVGhlIHJlYWQgc3RyYXRlZ3ksIHdoaWNoIGRldGVybWluZXMgaG93IGNsb3NlbHkgdGhlIGZ1bmN0aW9uIGFuYWx5emVzIGltYWdlcyBpbiB0aGUgcmVhZGluZyBwcm9jZXNzIHRvIG1hdGNoIG9iamVjdHMgd2l0aCB0cmFpbmVkIGNoYXJhY3RlcnMuCisgICAgaW50ICAgICAgICAgICAgYWNjZXB0YW5jZUxldmVsOyAgLy9UaGUgbWluaW11bSBhY2NlcHRhbmNlIGxldmVsIGF0IHdoaWNoIGFuIG9iamVjdCBpcyBjb25zaWRlcmVkIGEgdHJhaW5lZCBjaGFyYWN0ZXIuCisgICAgaW50ICAgICAgICAgICAgYXNwZWN0UmF0aW87ICAgICAgLy9UaGUgbWF4aW11bSBhc3BlY3QgcmF0aW8gdmFyaWFuY2UgcGVyY2VudGFnZSBmb3IgdmFsaWQgY2hhcmFjdGVycy4KKyAgICBSZWFkUmVzb2x1dGlvbiByZWFkUmVzb2x1dGlvbjsgICAvL1RoZSByZWFkIHJlc29sdXRpb24sIHdoaWNoIGRldGVybWluZXMgaG93IG11Y2ggb2YgdGhlIHRyYWluZWQgY2hhcmFjdGVyIGRhdGEgdGhlIGZ1bmN0aW9uIHVzZXMgdG8gbWF0Y2ggb2JqZWN0cyB0byB0cmFpbmVkIGNoYXJhY3RlcnMuCit9IFJlYWRUZXh0T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhckluZm9fc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgY2hhclZhbHVlOyAgICAgLy9SZXRyaWV2ZXMgdGhlIGNoYXJhY3RlciB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgaW4gdGhlIGNoYXJhY3RlciBzZXQuCisgICAgY29uc3QgSW1hZ2UqIGNoYXJJbWFnZTsgICAgIC8vVGhlIGltYWdlIHlvdSB1c2VkIHRvIHRyYWluIHRoaXMgY2hhcmFjdGVyLgorICAgIGNvbnN0IEltYWdlKiBpbnRlcm5hbEltYWdlOyAvL1RoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0IE5JIFZpc2lvbiB1c2VzIHRvIG1hdGNoIG9iamVjdHMgdG8gdGhpcyBjaGFyYWN0ZXIuCit9IENoYXJJbmZvOworCisjaWYgIWRlZmluZWQoVVNFUklOVF9IRUFERVIpICYmICFkZWZpbmVkKF9DVklfUkVDVF9ERUZJTkVEKQordHlwZWRlZiBzdHJ1Y3QgUmVjdF9zdHJ1Y3QgeworICAgIGludCB0b3A7ICAgIC8vTG9jYXRpb24gb2YgdGhlIHRvcCBlZGdlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgaW50IGxlZnQ7ICAgLy9Mb2NhdGlvbiBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgaW50IGhlaWdodDsgLy9IZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICBpbnQgd2lkdGg7ICAvL1dpZHRoIG9mIHRoZSByZWN0YW5nbGUuCit9IFJlY3Q7CisjZGVmaW5lIF9DVklfUkVDVF9ERUZJTkVECisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhclJlcG9ydF9zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIGNoYXJhY3RlcjsgICAgIC8vVGhlIGNoYXJhY3RlciB2YWx1ZS4KKyAgICBQb2ludEZsb2F0ICBjb3JuZXJbNF07ICAgICAvL0FuIGFycmF5IG9mIGZvdXIgcG9pbnRzIHRoYXQgZGVzY3JpYmVzIHRoZSByZWN0YW5nbGUgdGhhdCBzdXJyb3VuZHMgdGhlIGNoYXJhY3Rlci4KKyAgICBpbnQgICAgICAgICByZXNlcnZlZDsgICAgICAvL1RoaXMgZWxlbWVudCBpcyByZXNlcnZlZC4KKyAgICBpbnQgICAgICAgICBsb3dUaHJlc2hvbGQ7ICAvL1RoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQgcmFuZ2UgdXNlZCBmb3IgdGhpcyBjaGFyYWN0ZXIuCisgICAgaW50ICAgICAgICAgaGlnaFRocmVzaG9sZDsgLy9UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkIHJhbmdlIHVzZWQgZm9yIHRoaXMgY2hhcmFjdGVyLgorfSBDaGFyUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBSZWFkVGV4dFJlcG9ydF9zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICAgICAgIHJlYWRTdHJpbmc7ICAgICAgICAgIC8vVGhlIHJlYWQgc3RyaW5nLgorICAgIGNvbnN0IENoYXJSZXBvcnQqIGNoYXJhY3RlclJlcG9ydDsgICAgIC8vQW4gYXJyYXkgb2YgcmVwb3J0cyBkZXNjcmliaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggaWRlbnRpZmllZCBjaGFyYWN0ZXIuCisgICAgaW50ICAgICAgICAgICAgICAgbnVtQ2hhcmFjdGVyUmVwb3J0czsgLy9UaGUgbnVtYmVyIG9mIGlkZW50aWZpZWQgY2hhcmFjdGVycy4KK30gUmVhZFRleHRSZXBvcnQ7CisKKyNpZiAhZGVmaW5lZChVU0VSSU5UX0hFQURFUikgJiYgIWRlZmluZWQoX0NWSV9QT0lOVF9ERUZJTkVEKQordHlwZWRlZiBzdHJ1Y3QgUG9pbnRfc3RydWN0IHsKKyAgICBpbnQgeDsgLy9UaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKyAgICBpbnQgeTsgLy9UaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KK30gUG9pbnQ7CisjZGVmaW5lIF9DVklfUE9JTlRfREVGSU5FRAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEFubnVsdXNfc3RydWN0IHsKKyAgICBQb2ludCAgY2VudGVyOyAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgYW5udWx1cy4KKyAgICBpbnQgICAgaW5uZXJSYWRpdXM7IC8vVGhlIGludGVybmFsIHJhZGl1cyBvZiB0aGUgYW5udWx1cy4KKyAgICBpbnQgICAgb3V0ZXJSYWRpdXM7IC8vVGhlIGV4dGVybmFsIHJhZGl1cyBvZiB0aGUgYW5udWx1cy4KKyAgICBkb3VibGUgc3RhcnRBbmdsZTsgIC8vVGhlIHN0YXJ0IGFuZ2xlLCBpbiBkZWdyZWVzLCBvZiB0aGUgYW5udWx1cy4KKyAgICBkb3VibGUgZW5kQW5nbGU7ICAgIC8vVGhlIGVuZCBhbmdsZSwgaW4gZGVncmVlcywgb2YgdGhlIGFubnVsdXMuCit9IEFubnVsdXM7CisKK3R5cGVkZWYgc3RydWN0IEVkZ2VMb2NhdGlvblJlcG9ydF9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQqIGVkZ2VzOyAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGFsbCBlZGdlcyBkZXRlY3RlZCBieSB0aGUgc2VhcmNoIGxpbmUuCisgICAgaW50ICAgICAgICAgbnVtRWRnZXM7IC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGVkZ2VzIGFycmF5LgorfSBFZGdlTG9jYXRpb25SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IEVkZ2VPcHRpb25zX3N0cnVjdCB7CisgICAgdW5zaWduZWQgICAgICAgICAgICB0aHJlc2hvbGQ7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSBmb3IgdGhlIGNvbnRyYXN0IG9mIHRoZSBlZGdlLgorICAgIHVuc2lnbmVkICAgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gYXZlcmFnZXMgdG8gZmluZCB0aGUgY29udHJhc3QgYXQgZWl0aGVyIHNpZGUgb2YgdGhlIGVkZ2UuCisgICAgdW5zaWduZWQgICAgICAgICAgICBzdGVlcG5lc3M7ICAgICAgICAgLy9UaGUgc3BhbiwgaW4gcGl4ZWxzLCBvZiB0aGUgc2xvcGUgb2YgdGhlIGVkZ2UgcHJvamVjdGVkIGFsb25nIHRoZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgaW5wdXQgcG9pbnRzLgorICAgIEludGVycG9sYXRpb25NZXRob2Qgc3VicGl4ZWxUeXBlOyAgICAgIC8vVGhlIG1ldGhvZCBmb3IgaW50ZXJwb2xhdGluZy4KKyAgICB1bnNpZ25lZCAgICAgICAgICAgIHN1YnBpeGVsRGl2aXNpb25zOyAvL1RoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGUgZnVuY3Rpb24gb2J0YWlucyBmcm9tIGEgcGl4ZWwuCit9IEVkZ2VPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBFZGdlUmVwb3J0X3N0cnVjdCB7CisgICAgZmxvYXQgICAgICAgIGxvY2F0aW9uOyAgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBlZGdlIGZyb20gdGhlIGZpcnN0IHBvaW50IGluIHRoZSBwb2ludHMgYXJyYXkuCisgICAgZmxvYXQgICAgICAgIGNvbnRyYXN0OyAgIC8vVGhlIGNvbnRyYXN0IGF0IHRoZSBlZGdlLgorICAgIFBvbGFyaXR5VHlwZSBwb2xhcml0eTsgICAvL1RoZSBwb2xhcml0eSBvZiB0aGUgZWRnZS4KKyAgICBmbG9hdCAgICAgICAgcmVzZXJ2ZWQ7ICAgLy9UaGlzIGVsZW1lbnQgaXMgcmVzZXJ2ZWQuCisgICAgUG9pbnRGbG9hdCAgIGNvb3JkaW5hdGU7IC8vVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBlZGdlLgorfSBFZGdlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBFeHRyZW1lUmVwb3J0X3N0cnVjdCB7CisgICAgZG91YmxlIGxvY2F0aW9uOyAgICAgICAgIC8vVGhlIGxvY2F0aW9ucyBvZiB0aGUgZXh0cmVtZS4KKyAgICBkb3VibGUgYW1wbGl0dWRlOyAgICAgICAgLy9UaGUgYW1wbGl0dWRlIG9mIHRoZSBleHRyZW1lLgorICAgIGRvdWJsZSBzZWNvbmREZXJpdmF0aXZlOyAvL1RoZSBzZWNvbmQgZGVyaXZhdGl2ZSBvZiB0aGUgZXh0cmVtZS4KK30gRXh0cmVtZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRml0TGluZU9wdGlvbnNfc3RydWN0IHsKKyAgICBmbG9hdCBtaW5TY29yZTsgICAgICAgLy9TcGVjaWZpZXMgdGhlIHJlcXVpcmVkIHF1YWxpdHkgb2YgdGhlIGZpdHRlZCBsaW5lLgorICAgIGZsb2F0IHBpeGVsUmFkaXVzOyAgICAvL1NwZWNpZmllcyB0aGUgbmVpZ2hib3Job29kIHBpeGVsIHJlbGF0aW9uc2hpcCBmb3IgdGhlIGluaXRpYWwgc3Vic2V0IG9mIHBvaW50cyBiZWluZyB1c2VkLgorICAgIGludCAgIG51bVJlZmluZW1lbnRzOyAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJlZmluZW1lbnQgaXRlcmF0aW9ucyB5b3UgYWxsb3cgdGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIGluaXRpYWwgc3Vic2V0IG9mIHBvaW50cy4KK30gRml0TGluZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IERpc3BsYXlNYXBwaW5nX3N0cnVjdCB7CisgICAgTWFwcGluZ01ldGhvZCBtZXRob2Q7ICAgICAgIC8vRGVzY3JpYmVzIHRoZSBtZXRob2QgZm9yIGNvbnZlcnRpbmcgMTYtYml0IHBpeGVscyB0byA4LWJpdCBwaXhlbHMuCisgICAgaW50ICAgICAgICAgICBtaW5pbXVtVmFsdWU7IC8vV2hlbiBtZXRob2QgaXMgSU1BUV9SQU5HRSwgbWluaW11bVZhbHVlIHJlcHJlc2VudHMgdGhlIHZhbHVlIHRoYXQgaXMgbWFwcGVkIHRvIDAuCisgICAgaW50ICAgICAgICAgICBtYXhpbXVtVmFsdWU7IC8vV2hlbiBtZXRob2QgaXMgSU1BUV9SQU5HRSwgbWF4aW11bVZhbHVlIHJlcHJlc2VudHMgdGhlIHZhbHVlIHRoYXQgaXMgbWFwcGVkIHRvIDI1NS4KKyAgICBpbnQgICAgICAgICAgIHNoaWZ0Q291bnQ7ICAgLy9XaGVuIG1ldGhvZCBpcyBJTUFRX0RPV05TSElGVCwgc2hpZnRDb3VudCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYml0cyB0aGUgZnVuY3Rpb24gcmlnaHQtc2hpZnRzIHRoZSAxNi1iaXQgcGl4ZWwgdmFsdWVzLgorfSBEaXNwbGF5TWFwcGluZzsKKwordHlwZWRlZiBzdHJ1Y3QgRGV0ZWN0RXh0cmVtZXNPcHRpb25zX3N0cnVjdCB7CisgICAgZG91YmxlIHRocmVzaG9sZDsgLy9EZWZpbmVzIHdoaWNoIGV4dHJlbWVzIGFyZSB0b28gc21hbGwuCisgICAgaW50ICAgIHdpZHRoOyAgICAgLy9TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXRhIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlcyBpbiB0aGUgcXVhZHJhdGljIGxlYXN0LXNxdWFyZXMgZml0LgorfSBEZXRlY3RFeHRyZW1lc09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEltYWdlSW5mb19zdHJ1Y3QgeworICAgIENhbGlicmF0aW9uVW5pdCBpbWFnZVVuaXQ7ICAgICAvL0lmIHlvdSBzZXQgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gd2l0aCBpbWFxU2V0U2ltcGxlQ2FsaWJyYXRpb25JbmZvKCksIGltYWdlVW5pdCBpcyB0aGUgY2FsaWJyYXRpb24gdW5pdC4KKyAgICBmbG9hdCAgICAgICAgICAgc3RlcFg7ICAgICAgICAgLy9JZiB5b3Ugc2V0IGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIHdpdGggaW1hcVNldENhbGlicmF0aW9uSW5mbygpLCBzdGVwWCBpcyB0aGUgZGlzdGFuY2UgaW4gdGhlIGNhbGlicmF0aW9uIHVuaXQgYmV0d2VlbiB0d28gcGl4ZWxzIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICBmbG9hdCAgICAgICAgICAgc3RlcFk7ICAgICAgICAgLy9JZiB5b3Ugc2V0IGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIHdpdGggaW1hcVNldENhbGlicmF0aW9uSW5mbygpLCBzdGVwWSBpcyB0aGUgZGlzdGFuY2UgaW4gdGhlIGNhbGlicmF0aW9uIHVuaXQgYmV0d2VlbiB0d28gcGl4ZWxzIGluIHRoZSB5IGRpcmVjdGlvbi4KKyAgICBJbWFnZVR5cGUgICAgICAgaW1hZ2VUeXBlOyAgICAgLy9UaGUgdHlwZSBvZiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgIHhSZXM7ICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgeVJlczsgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICB4T2Zmc2V0OyAgICAgICAvL0lmIHlvdSBzZXQgbWFzayBvZmZzZXQgaW5mb3JtYXRpb24gd2l0aCBpbWFxU2V0TWFza09mZnNldCgpLCB4T2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIG1hc2sgb3JpZ2luIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICBpbnQgICAgICAgICAgICAgeU9mZnNldDsgICAgICAgLy9JZiB5b3Ugc2V0IG1hc2sgb2Zmc2V0IGluZm9ybWF0aW9uIHdpdGggaW1hcVNldE1hc2tPZmZzZXQoKSwgeU9mZnNldCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBtYXNrIG9yaWdpbiBpbiB0aGUgeSBkaXJlY3Rpb24uCisgICAgaW50ICAgICAgICAgICAgIGJvcmRlcjsgICAgICAgIC8vVGhlIG51bWJlciBvZiBib3JkZXIgcGl4ZWxzIGFyb3VuZCB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgIHBpeGVsc1BlckxpbmU7IC8vVGhlIG51bWJlciBvZiBwaXhlbHMgc3RvcmVkIGZvciBlYWNoIGxpbmUgb2YgdGhlIGltYWdlLgorICAgIHZvaWQqICAgICAgICAgICByZXNlcnZlZDA7ICAgICAvL1RoaXMgZWxlbWVudCBpcyByZXNlcnZlZC4KKyAgICB2b2lkKiAgICAgICAgICAgcmVzZXJ2ZWQxOyAgICAgLy9UaGlzIGVsZW1lbnQgaXMgcmVzZXJ2ZWQuCisgICAgdm9pZCogICAgICAgICAgIGltYWdlU3RhcnQ7ICAgIC8vQSBwb2ludGVyIHRvIHBpeGVsICgwLDApLgorfSBJbWFnZUluZm87CisKK3R5cGVkZWYgc3RydWN0IExDRE9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICBsaXRTZWdtZW50czsgIC8vU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgaWYgdGhlIHNlZ21lbnRzIGFyZSBicmlnaHRlciB0aGFuIHRoZSBiYWNrZ3JvdW5kLgorICAgIGZsb2F0IHRocmVzaG9sZDsgICAgLy9EZXRlcm1pbmVzIHdoZXRoZXIgYSBzZWdtZW50IGlzIE9OIG9yIE9GRi4KKyAgICBpbnQgICBzaWduOyAgICAgICAgIC8vSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIG11c3QgcmVhZCB0aGUgc2lnbiBvZiB0aGUgaW5kaWNhdG9yLgorICAgIGludCAgIGRlY2ltYWxQb2ludDsgLy9EZXRlcm1pbmVzIHdoZXRoZXIgdG8gbG9vayBmb3IgYSBkZWNpbWFsIHNlcGFyYXRvciBhZnRlciBlYWNoIGRpZ2l0LgorfSBMQ0RPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBMQ0RSZXBvcnRfc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgdGV4dDsgICAgICAgICAgLy9BIHN0cmluZyBvZiB0aGUgY2hhcmFjdGVycyBvZiB0aGUgTENELgorICAgIExDRFNlZ21lbnRzKiBzZWdtZW50SW5mbzsgICAvL0FuIGFycmF5IG9mIExDRFNlZ21lbnQgc3RydWN0dXJlcyBkZXNjcmliaW5nIHdoaWNoIHNlZ21lbnRzIG9mIGVhY2ggZGlnaXQgYXJlIG9uLgorICAgIGludCAgICAgICAgICBudW1DaGFyYWN0ZXJzOyAvL1RoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSBmdW5jdGlvbiByZWFkcy4KKyAgICBpbnQgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgLy9UaGlzIGVsZW1lbnQgaXMgcmVzZXJ2ZWQuCit9IExDRFJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTENEU2VnbWVudHNfc3RydWN0IHsKKyAgICB1bnNpZ25lZCBhOjE7ICAgICAgICAgLy9UcnVlIGlmIHRoZSBhIHNlZ21lbnQgaXMgb24uCisgICAgdW5zaWduZWQgYjoxOyAgICAgICAgIC8vVHJ1ZSBpZiB0aGUgYiBzZWdtZW50IGlzIG9uLgorICAgIHVuc2lnbmVkIGM6MTsgICAgICAgICAvL1RydWUgaWYgdGhlIGMgc2VnbWVudCBpcyBvbi4KKyAgICB1bnNpZ25lZCBkOjE7ICAgICAgICAgLy9UcnVlIGlmIHRoZSBkIHNlZ21lbnQgaXMgb24uCisgICAgdW5zaWduZWQgZToxOyAgICAgICAgIC8vVHJ1ZSBpZiB0aGUgZSBzZWdtZW50IGlzIG9uLgorICAgIHVuc2lnbmVkIGY6MTsgICAgICAgICAvL1RydWUgaWYgdGhlIGYgc2VnbWVudCBpcyBvbi4KKyAgICB1bnNpZ25lZCBnOjE7ICAgICAgICAgLy9UcnVlIGlmIHRoZSBnIHNlZ21lbnQgaXMgb24uCisgICAgdW5zaWduZWQgcmVzZXJ2ZWQ6MjU7IC8vVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkLgorfSBMQ0RTZWdtZW50czsKKwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5DYWxpYnJhdGlvbk9wdGlvbnNfc3RydWN0IHsKKyAgICBDYWxpYnJhdGlvbk1vZGUgbW9kZTsgICAgICAgLy9TcGVjaWZpZXMgdGhlIHR5cGUgb2YgYWxnb3JpdGhtIHlvdSB3YW50IHRvIHVzZSB0byByZWR1Y2UgZGlzdG9ydGlvbiBpbiB5b3VyIGltYWdlLgorICAgIFNjYWxpbmdNZXRob2QgICBtZXRob2Q7ICAgICAvL0RlZmluZXMgdGhlIHNjYWxpbmcgbWV0aG9kIGNvcnJlY3Rpb24gZnVuY3Rpb25zIHVzZSB0byBjb3JyZWN0IHRoZSBpbWFnZS4KKyAgICBDYWxpYnJhdGlvblJPSSAgcm9pOyAgICAgICAgLy9TcGVjaWZpZXMgdGhlIFJPSSBjb3JyZWN0aW9uIGZ1bmN0aW9ucyB1c2Ugd2hlbiBjb3JyZWN0aW5nIGFuIGltYWdlLgorICAgIGludCAgICAgICAgICAgICBsZWFybk1hcDsgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSBpZiB5b3Ugd2FudCB0aGUgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSBhbiBlcnJvciBtYXAgZHVyaW5nIHRoZSBsZWFybmluZyBwcm9jZXNzLgorICAgIGludCAgICAgICAgICAgICBsZWFyblRhYmxlOyAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSBpZiB5b3Ugd2FudCB0aGUgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgY29ycmVjdGlvbiB0YWJsZS4KK30gTGVhcm5DYWxpYnJhdGlvbk9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IExlYXJuQ29sb3JQYXR0ZXJuT3B0aW9uc19zdHJ1Y3QgeworICAgIExlYXJuaW5nTW9kZSAgICAgIGxlYXJuTW9kZTsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgaW52YXJpYW5jZSBtb2RlIHRoZSBmdW5jdGlvbiB1c2VzIHdoZW4gbGVhcm5pbmcgdGhlIHBhdHRlcm4uCisgICAgSW1hZ2VGZWF0dXJlTW9kZSAgZmVhdHVyZU1vZGU7ICAgICAgIC8vU3BlY2lmaWVzIHRoZSBmZWF0dXJlcyB0aGUgZnVuY3Rpb24gdXNlcyB3aGVuIGxlYXJuaW5nIHRoZSBjb2xvciBwYXR0ZXJuLgorICAgIGludCAgICAgICAgICAgICAgIHRocmVzaG9sZDsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgc2F0dXJhdGlvbiB0aHJlc2hvbGQgdGhlIGZ1bmN0aW9uIHVzZXMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0d28gY29sb3JzIHRoYXQgaGF2ZSB0aGUgc2FtZSBodWUgdmFsdWVzLgorICAgIENvbG9ySWdub3JlTW9kZSAgIGlnbm9yZU1vZGU7ICAgICAgICAvL1NwZWNpZmllcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBleGNsdWRlcyBjZXJ0YWluIGNvbG9ycyBmcm9tIHRoZSBjb2xvciBmZWF0dXJlcyBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UuCisgICAgQ29sb3JJbmZvcm1hdGlvbiogY29sb3JzVG9JZ25vcmU7ICAgIC8vQW4gYXJyYXkgb2YgQ29sb3JJbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIHByb3ZpZGluZyBhIHNldCBvZiBjb2xvcnMgdG8gZXhjbHVkZSBmcm9tIHRoZSBjb2xvciBmZWF0dXJlcyBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgbnVtQ29sb3JzVG9JZ25vcmU7IC8vVGhlIG51bWJlciBvZiBDb2xvckluZm9ybWF0aW9uIHN0cnVjdHVyZXMgaW4gdGhlIGNvbG9yc1RvSWdub3JlIGFycmF5LgorfSBMZWFybkNvbG9yUGF0dGVybk9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IExpbmVfc3RydWN0IHsKKyAgICBQb2ludCBzdGFydDsgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCisgICAgUG9pbnQgZW5kOyAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbGluZS4KK30gTGluZTsKKwordHlwZWRlZiBzdHJ1Y3QgTGluZWFyQXZlcmFnZXNfc3RydWN0IHsKKyAgICBmbG9hdCogY29sdW1uQXZlcmFnZXM7ICAgICAgLy9BbiBhcnJheSBjb250YWluaW5nIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2ggY29sdW1uLgorICAgIGludCAgICBjb2x1bW5Db3VudDsgICAgICAgICAvL1RoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbHVtbkF2ZXJhZ2VzIGFycmF5LgorICAgIGZsb2F0KiByb3dBdmVyYWdlczsgICAgICAgICAvL0FuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG1lYW4gcGl4ZWwgdmFsdWUgb2YgZWFjaCByb3cuCisgICAgaW50ICAgIHJvd0NvdW50OyAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcm93QXZlcmFnZXMgYXJyYXkuCisgICAgZmxvYXQqIHJpc2luZ0RpYWdBdmVyYWdlczsgIC8vQW4gYXJyYXkgY29udGFpbmluZyB0aGUgbWVhbiBwaXhlbCB2YWx1ZSBvZiBlYWNoIGRpYWdvbmFsIHJ1bm5pbmcgZnJvbSB0aGUgbG93ZXIgbGVmdCB0byB0aGUgdXBwZXIgcmlnaHQgb2YgdGhlIGluc3BlY3RlZCBhcmVhIG9mIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgcmlzaW5nRGlhZ0NvdW50OyAgICAgLy9UaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSByaXNpbmdEaWFnQXZlcmFnZXMgYXJyYXkuCisgICAgZmxvYXQqIGZhbGxpbmdEaWFnQXZlcmFnZXM7IC8vQW4gYXJyYXkgY29udGFpbmluZyB0aGUgbWVhbiBwaXhlbCB2YWx1ZSBvZiBlYWNoIGRpYWdvbmFsIHJ1bm5pbmcgZnJvbSB0aGUgdXBwZXIgbGVmdCB0byB0aGUgbG93ZXIgcmlnaHQgb2YgdGhlIGluc3BlY3RlZCBhcmVhIG9mIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgZmFsbGluZ0RpYWdDb3VudDsgICAgLy9UaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmYWxsaW5nRGlhZ0F2ZXJhZ2VzIGFycmF5LgorfSBMaW5lYXJBdmVyYWdlczsKKwordHlwZWRlZiBzdHJ1Y3QgTGluZVByb2ZpbGVfc3RydWN0IHsKKyAgICBmbG9hdCogcHJvZmlsZURhdGE7IC8vQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgZWFjaCBwaXhlbCBpbiB0aGUgbGluZS4KKyAgICBSZWN0ICAgYm91bmRpbmdCb3g7IC8vVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgbGluZS4KKyAgICBmbG9hdCAgbWluOyAgICAgICAgIC8vVGhlIHNtYWxsZXN0IHBpeGVsIHZhbHVlIGluIHRoZSBsaW5lIHByb2ZpbGUuCisgICAgZmxvYXQgIG1heDsgICAgICAgICAvL1RoZSBsYXJnZXN0IHBpeGVsIHZhbHVlIGluIHRoZSBsaW5lIHByb2ZpbGUuCisgICAgZmxvYXQgIG1lYW47ICAgICAgICAvL1RoZSBtZWFuIHZhbHVlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIGxpbmUgcHJvZmlsZS4KKyAgICBmbG9hdCAgc3RkRGV2OyAgICAgIC8vVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbGluZSBwcm9maWxlLgorICAgIGludCAgICBkYXRhQ291bnQ7ICAgLy9UaGUgc2l6ZSBvZiB0aGUgcHJvZmlsZURhdGEgYXJyYXkuCit9IExpbmVQcm9maWxlOworCit0eXBlZGVmIHN0cnVjdCBNYXRjaENvbG9yUGF0dGVybk9wdGlvbnNfc3RydWN0IHsKKyAgICBNYXRjaGluZ01vZGUgICAgICAgIG1hdGNoTW9kZTsgICAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgdGhlIGNvbG9yIHBhdHRlcm4gaW4gdGhlIGltYWdlLgorICAgIEltYWdlRmVhdHVyZU1vZGUgICAgZmVhdHVyZU1vZGU7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGZlYXR1cmVzIHRvIHVzZSB3aGVuIGxvb2tpbmcgZm9yIHRoZSBjb2xvciBwYXR0ZXJuIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG1pbkNvbnRyYXN0OyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGV4cGVjdGVkIGluIHRoZSBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHN1YnBpeGVsQWNjdXJhY3k7ICAgIC8vU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gcmV0dXJuIGFyZWFzIGluIHRoZSBpbWFnZSB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIGFyZWEgd2l0aCBzdWJwaXhlbCBhY2N1cmFjeS4KKyAgICBSb3RhdGlvbkFuZ2xlUmFuZ2UqIGFuZ2xlUmFuZ2VzOyAgICAgICAgIC8vQW4gYXJyYXkgb2YgYW5nbGUgcmFuZ2VzLCBpbiBkZWdyZWVzLCB3aGVyZSBlYWNoIHJhbmdlIHNwZWNpZmllcyBob3cgbXVjaCB5b3UgZXhwZWN0IHRoZSBwYXR0ZXJuIHRvIGJlIHJvdGF0ZWQgaW4gdGhlIGltYWdlLgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtUmFuZ2VzOyAgICAgICAgICAgLy9OdW1iZXIgb2YgYW5nbGUgcmFuZ2VzIGluIHRoZSBhbmdsZVJhbmdlcyBhcnJheS4KKyAgICBkb3VibGUgICAgICAgICAgICAgIGNvbG9yV2VpZ2h0OyAgICAgICAgIC8vRGV0ZXJtaW5lcyB0aGUgcGVyY2VudCBjb250cmlidXRpb24gb2YgdGhlIGNvbG9yIHNjb3JlIHRvIHRoZSBmaW5hbCBjb2xvciBwYXR0ZXJuIG1hdGNoaW5nIHNjb3JlLgorICAgIENvbG9yU2Vuc2l0aXZpdHkgICAgc2Vuc2l0aXZpdHk7ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHNlbnNpdGl2aXR5IG9mIHRoZSBjb2xvciBpbmZvcm1hdGlvbiBpbiB0aGUgaW1hZ2UuCisgICAgU2VhcmNoU3RyYXRlZ3kgICAgICBzdHJhdGVneTsgICAgICAgICAgICAvL1NwZWNpZmllcyBob3cgdGhlIGNvbG9yIGZlYXR1cmVzIG9mIHRoZSBpbWFnZSBhcmUgdXNlZCBkdXJpbmcgdGhlIHNlYXJjaCBwaGFzZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bU1hdGNoZXNSZXF1ZXN0ZWQ7IC8vTnVtYmVyIG9mIHZhbGlkIG1hdGNoZXMgZXhwZWN0ZWQuCisgICAgZmxvYXQgICAgICAgICAgICAgICBtaW5NYXRjaFNjb3JlOyAgICAgICAvL1RoZSBtaW5pbXVtIHNjb3JlIGEgbWF0Y2ggY2FuIGhhdmUgZm9yIHRoZSBmdW5jdGlvbiB0byBjb25zaWRlciB0aGUgbWF0Y2ggdmFsaWQuCit9IE1hdGNoQ29sb3JQYXR0ZXJuT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgSGlzdG9ncmFtUmVwb3J0X3N0cnVjdCB7CisgICAgaW50KiAgaGlzdG9ncmFtOyAgICAgIC8vQW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IGZlbGwgaW50byBlYWNoIGNsYXNzLgorICAgIGludCAgIGhpc3RvZ3JhbUNvdW50OyAvL1RoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhpc3RvZ3JhbSBhcnJheS4KKyAgICBmbG9hdCBtaW47ICAgICAgICAgICAgLy9UaGUgc21hbGxlc3QgcGl4ZWwgdmFsdWUgdGhhdCB0aGUgZnVuY3Rpb24gY2xhc3NpZmllZC4KKyAgICBmbG9hdCBtYXg7ICAgICAgICAgICAgLy9UaGUgbGFyZ2VzdCBwaXhlbCB2YWx1ZSB0aGF0IHRoZSBmdW5jdGlvbiBjbGFzc2lmaWVkLgorICAgIGZsb2F0IHN0YXJ0OyAgICAgICAgICAvL1RoZSBzbWFsbGVzdCBwaXhlbCB2YWx1ZSB0aGF0IGZlbGwgaW50byB0aGUgZmlyc3QgY2xhc3MuCisgICAgZmxvYXQgd2lkdGg7ICAgICAgICAgIC8vVGhlIHNpemUgb2YgZWFjaCBjbGFzcy4KKyAgICBmbG9hdCBtZWFuOyAgICAgICAgICAgLy9UaGUgbWVhbiB2YWx1ZSBvZiB0aGUgcGl4ZWxzIHRoYXQgdGhlIGZ1bmN0aW9uIGNsYXNzaWZpZWQuCisgICAgZmxvYXQgc3RkRGV2OyAgICAgICAgIC8vVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcGl4ZWxzIHRoYXQgdGhlIGZ1bmN0aW9uIGNsYXNzaWZpZWQuCisgICAgaW50ICAgbnVtUGl4ZWxzOyAgICAgIC8vVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gY2xhc3NpZmllZC4KK30gSGlzdG9ncmFtUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBBcmNJbmZvX3N0cnVjdCB7CisgICAgUmVjdCAgIGJvdW5kaW5nQm94OyAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGFyYy4KKyAgICBkb3VibGUgc3RhcnRBbmdsZTsgIC8vVGhlIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgZnJvbSB0aGUgeC1heGlzIGluIGRlZ3JlZXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBhcmMuCisgICAgZG91YmxlIGVuZEFuZ2xlOyAgICAvL1RoZSBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGZyb20gdGhlIHgtYXhpcyBpbiBkZWdyZWVzIHRvIHRoZSBlbmQgb2YgdGhlIGFyYy4KK30gQXJjSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQXhpc1JlcG9ydF9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQgb3JpZ2luOyAgICAgICAgICAgLy9UaGUgb3JpZ2luIG9mIHRoZSBjb29yZGluYXRlIHN5c3RlbSwgd2hpY2ggaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGF4ZXMgb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgIFBvaW50RmxvYXQgbWFpbkF4aXNFbmQ7ICAgICAgLy9UaGUgZW5kIG9mIHRoZSBtYWluIGF4aXMsIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG1haW4gYXhpcyB3aXRoIHRoZSByZWN0YW5ndWxhciBzZWFyY2ggYXJlYS4KKyAgICBQb2ludEZsb2F0IHNlY29uZGFyeUF4aXNFbmQ7IC8vVGhlIGVuZCBvZiB0aGUgc2Vjb25kYXJ5IGF4aXMsIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHNlY29uZGFyeSBheGlzIHdpdGggdGhlIHJlY3Rhbmd1bGFyIHNlYXJjaCBhcmVhLgorfSBBeGlzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBCYXJjb2RlSW5mb19zdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIG91dHB1dFN0cmluZzsgICAgLy9BIHN0cmluZyBjb250YWluaW5nIHRoZSBkZWNvZGVkIGJhcmNvZGUgZGF0YS4KKyAgICBpbnQgICAgICAgICBzaXplOyAgICAgICAgICAgIC8vVGhlIHNpemUgb2YgdGhlIG91dHB1dCBzdHJpbmcuCisgICAgY2hhciAgICAgICAgb3V0cHV0Q2hhcjE7ICAgICAvL1RoZSBjb250ZW50cyBvZiB0aGlzIGNoYXJhY3RlciBkZXBlbmQgb24gdGhlIGJhcmNvZGUgdHlwZS4KKyAgICBjaGFyICAgICAgICBvdXRwdXRDaGFyMjsgICAgIC8vVGhlIGNvbnRlbnRzIG9mIHRoaXMgY2hhcmFjdGVyIGRlcGVuZCBvbiB0aGUgYmFyY29kZSB0eXBlLgorICAgIGRvdWJsZSAgICAgIGNvbmZpZGVuY2VMZXZlbDsgLy9BIHF1YWxpdHkgbWVhc3VyZSBvZiB0aGUgZGVjb2RlZCBiYXJjb2RlIHJhbmdpbmcgZnJvbSAwIHRvIDEwMCwgd2l0aCAxMDAgYmVpbmcgdGhlIGJlc3QuCisgICAgQmFyY29kZVR5cGUgdHlwZTsgICAgICAgICAgICAvL1RoZSB0eXBlIG9mIGJhcmNvZGUuCit9IEJhcmNvZGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBCQ0dPcHRpb25zX3N0cnVjdCB7CisgICAgZmxvYXQgYnJpZ2h0bmVzczsgLy9BZGp1c3RzIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBpbWFnZS4KKyAgICBmbG9hdCBjb250cmFzdDsgICAvL0FkanVzdHMgdGhlIGNvbnRyYXN0IG9mIHRoZSBpbWFnZS4KKyAgICBmbG9hdCBnYW1tYTsgICAgICAvL1BlcmZvcm1zIGdhbW1hIGNvcnJlY3Rpb24uCit9IEJDR09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEJlc3RDaXJjbGVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IGNlbnRlcjsgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICByYWRpdXM7ICAgIC8vVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLgorICAgIGRvdWJsZSAgICAgYXJlYTsgICAgICAvL1RoZSBhcmVhIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICBwZXJpbWV0ZXI7IC8vVGhlIGxlbmd0aCBvZiB0aGUgcGVyaW1ldGVyIG9mIHRoZSBjaXJjbGUuCisgICAgZG91YmxlICAgICBlcnJvcjsgICAgIC8vUmVwcmVzZW50cyB0aGUgbGVhc3Qgc3F1YXJlIGVycm9yIG9mIHRoZSBmaXR0ZWQgY2lyY2xlIHRvIHRoZSBlbnRpcmUgc2V0IG9mIHBvaW50cy4KK30gQmVzdENpcmNsZTsKKwordHlwZWRlZiBzdHJ1Y3QgQmVzdEVsbGlwc2Vfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0IGNlbnRlcjsgICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuCisgICAgUG9pbnRGbG9hdCBtYWpvckF4aXNTdGFydDsgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIG1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgICAgUG9pbnRGbG9hdCBtYWpvckF4aXNFbmQ7ICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBtYWpvciBheGlzIG9mIHRoZSBlbGxpcHNlLgorICAgIFBvaW50RmxvYXQgbWlub3JBeGlzU3RhcnQ7IC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBtaW5vciBheGlzIG9mIHRoZSBlbGxpcHNlLgorICAgIFBvaW50RmxvYXQgbWlub3JBeGlzRW5kOyAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbWlub3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgICBkb3VibGUgICAgIGFyZWE7ICAgICAgICAgICAvL1RoZSBhcmVhIG9mIHRoZSBlbGxpcHNlLgorICAgIGRvdWJsZSAgICAgcGVyaW1ldGVyOyAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgcGVyaW1ldGVyIG9mIHRoZSBlbGxpcHNlLgorfSBCZXN0RWxsaXBzZTsKKwordHlwZWRlZiBzdHJ1Y3QgQmVzdExpbmVfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0ICAgc3RhcnQ7ICAgICAgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCisgICAgUG9pbnRGbG9hdCAgIGVuZDsgICAgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbGluZS4KKyAgICBMaW5lRXF1YXRpb24gZXF1YXRpb247ICAgICAgLy9EZWZpbmVzIHRoZSB0aHJlZSBjb2VmZmljaWVudHMgb2YgdGhlIGVxdWF0aW9uIG9mIHRoZSBiZXN0IGZpdCBsaW5lLgorICAgIGludCAgICAgICAgICB2YWxpZDsgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBmdW5jdGlvbiBhY2hpZXZlZCB0aGUgbWluaW11bSBzY29yZSB3aXRoaW4gdGhlIG51bWJlciBvZiBhbGxvd2VkIHJlZmluZW1lbnQgaXRlcmF0aW9ucyBhbmQgRkFMU0UgaWYgdGhlIGZ1bmN0aW9uIGRpZCBub3QgYWNoaWV2ZSB0aGUgbWluaW11bSBzY29yZS4KKyAgICBkb3VibGUgICAgICAgZXJyb3I7ICAgICAgICAgLy9SZXByZXNlbnRzIHRoZSBsZWFzdCBzcXVhcmUgZXJyb3Igb2YgdGhlIGZpdHRlZCBsaW5lIHRvIHRoZSBlbnRpcmUgc2V0IG9mIHBvaW50cy4KKyAgICBpbnQqICAgICAgICAgcG9pbnRzVXNlZDsgICAgLy9BbiBhcnJheSBvZiB0aGUgaW5kZXhlcyBmb3IgdGhlIHBvaW50cyBhcnJheSBpbmRpY2F0aW5nIHdoaWNoIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaXQgdGhlIGxpbmUuCisgICAgaW50ICAgICAgICAgIG51bVBvaW50c1VzZWQ7IC8vVGhlIG51bWJlciBvZiBwb2ludHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZml0IHRoZSBsaW5lLgorfSBCZXN0TGluZTsKKwordHlwZWRlZiBzdHJ1Y3QgQnJvd3Nlck9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgIC8vVGhlIHdpZHRoIHRvIG1ha2UgdGhlIGJyb3dzZXIuCisgICAgaW50ICAgICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgICAvL1RoZSBoZWlnaHQgdG8gbWFrZSB0aGUgYnJvd3NlciBpbWFnZS4KKyAgICBpbnQgICAgICAgICAgICAgICBpbWFnZXNQZXJMaW5lOyAgIC8vVGhlIG51bWJlciBvZiBpbWFnZXMgdG8gcGxhY2Ugb24gYSBzaW5nbGUgbGluZS4KKyAgICBSR0JWYWx1ZSAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I7IC8vVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGJyb3dzZXIuCisgICAgaW50ICAgICAgICAgICAgICAgZnJhbWVTaXplOyAgICAgICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBpeGVscyB3aXRoIHdoaWNoIHRvIGJvcmRlciBlYWNoIHRodW1ibmFpbC4KKyAgICBCcm93c2VyRnJhbWVTdHlsZSBzdHlsZTsgICAgICAgICAgIC8vVGhlIHN0eWxlIGZvciB0aGUgZnJhbWUgYXJvdW5kIGVhY2ggdGh1bWJuYWlsLgorICAgIGZsb2F0ICAgICAgICAgICAgIHJhdGlvOyAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIHdpZHRoIHRvIGhlaWdodCByYXRpbyBvZiBlYWNoIHRodW1ibmFpbC4KKyAgICBSR0JWYWx1ZSAgICAgICAgICBmb2N1c0NvbG9yOyAgICAgIC8vVGhlIGNvbG9yIHRvIHVzZSB0byBkaXNwbGF5IGZvY3VzZWQgY2VsbHMuCit9IEJyb3dzZXJPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDb29yZGluYXRlU3lzdGVtX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCAgICAgIG9yaWdpbjsgICAgICAgICAgLy9UaGUgb3JpZ2luIG9mIHRoZSBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBmbG9hdCAgICAgICAgICAgYW5nbGU7ICAgICAgICAgICAvL1RoZSBhbmdsZSwgaW4gZGVncmVlcywgb2YgdGhlIHgtYXhpcyBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gcmVsYXRpdmUgdG8gdGhlIGltYWdlIHgtYXhpcy4KKyAgICBBeGlzT3JpZW50YXRpb24gYXhpc09yaWVudGF0aW9uOyAvL1RoZSBkaXJlY3Rpb24gb2YgdGhlIHktYXhpcyBvZiB0aGUgY29vcmRpbmF0ZSByZWZlcmVuY2Ugc3lzdGVtLgorfSBDb29yZGluYXRlU3lzdGVtOworCit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvbkluZm9fc3RydWN0IHsKKyAgICBmbG9hdCogICAgICAgICAgICAgICAgICBlcnJvck1hcDsgICAgICAgLy9UaGUgZXJyb3IgbWFwIGZvciB0aGUgY2FsaWJyYXRpb24uCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbWFwQ29sdW1uczsgICAgIC8vVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBlcnJvciBtYXAuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbWFwUm93czsgICAgICAgIC8vVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBlcnJvciBtYXAuCisgICAgUk9JKiAgICAgICAgICAgICAgICAgICAgdXNlclJvaTsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBST0kgdGhlIHVzZXIgcHJvdmlkZWQgd2hlbiBsZWFybmluZyB0aGUgY2FsaWJyYXRpb24uCisgICAgUk9JKiAgICAgICAgICAgICAgICAgICAgY2FsaWJyYXRpb25Sb2k7IC8vU3BlY2lmaWVzIHRoZSBST0kgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcmVnaW9uIG9mIHRoZSBpbWFnZSB3aGVyZSB0aGUgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gaXMgYWNjdXJhdGUuCisgICAgTGVhcm5DYWxpYnJhdGlvbk9wdGlvbnMgb3B0aW9uczsgICAgICAgIC8vU3BlY2lmaWVzIHRoZSBjYWxpYnJhdGlvbiBvcHRpb25zIHRoZSB1c2VyIHByb3ZpZGVkIHdoZW4gbGVhcm5pbmcgdGhlIGNhbGlicmF0aW9uLgorICAgIEdyaWREZXNjcmlwdG9yICAgICAgICAgIGdyaWQ7ICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgc2NhbGluZyBjb25zdGFudHMgZm9yIHRoZSBpbWFnZS4KKyAgICBDb29yZGluYXRlU3lzdGVtICAgICAgICBzeXN0ZW07ICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGZvciB0aGUgcmVhbCB3b3JsZCBjb29yZGluYXRlcy4KKyAgICBSYW5nZUZsb2F0ICAgICAgICAgICAgICByYW5nZTsgICAgICAgICAgLy9UaGUgcmFuZ2Ugb2YgdGhlIGdyYXlzY2FsZSB0aGUgZnVuY3Rpb24gdXNlZCB0byByZXByZXNlbnQgdGhlIGNpcmNsZXMgaW4gdGhlIGdyaWQgaW1hZ2UuCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgcXVhbGl0eTsgICAgICAgIC8vVGhlIHF1YWxpdHkgc2NvcmUgb2YgdGhlIGxlYXJuaW5nIHByb2Nlc3MsIHdoaWNoIGlzIGEgdmFsdWUgYmV0d2VlbiAwLTEwMDAuCit9IENhbGlicmF0aW9uSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsaWJyYXRpb25Qb2ludHNfc3RydWN0IHsKKyAgICBQb2ludEZsb2F0KiBwaXhlbENvb3JkaW5hdGVzOyAgICAgLy9UaGUgYXJyYXkgb2YgcGl4ZWwgY29vcmRpbmF0ZXMuCisgICAgUG9pbnRGbG9hdCogcmVhbFdvcmxkQ29vcmRpbmF0ZXM7IC8vVGhlIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgcmVhbC13b3JsZCBjb29yZGluYXRlcy4KKyAgICBpbnQgICAgICAgICBudW1Db29yZGluYXRlczsgICAgICAgLy9UaGUgbnVtYmVyIG9mIGNvb3JkaW5hdGVzIGluIGJvdGggb2YgdGhlIGFycmF5cy4KK30gQ2FsaWJyYXRpb25Qb2ludHM7CisKK3R5cGVkZWYgc3RydWN0IENhbGlwZXJPcHRpb25zX3N0cnVjdCB7CisgICAgVHdvRWRnZVBvbGFyaXR5VHlwZSBwb2xhcml0eTsgICAgICAgICAgICAvL1NwZWNpZmllcyB0aGUgZWRnZSBwb2xhcml0eSBvZiB0aGUgZWRnZSBwYWlycy4KKyAgICBmbG9hdCAgICAgICAgICAgICAgIHNlcGFyYXRpb247ICAgICAgICAgIC8vVGhlIGRpc3RhbmNlIGJldHdlZW4gZWRnZSBwYWlycy4KKyAgICBmbG9hdCAgICAgICAgICAgICAgIHNlcGFyYXRpb25EZXZpYXRpb247IC8vU2V0cyB0aGUgcmFuZ2UgYXJvdW5kIHRoZSBzZXBhcmF0aW9uIHZhbHVlLgorfSBDYWxpcGVyT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsaXBlclJlcG9ydF9zdHJ1Y3QgeworICAgIGZsb2F0ICAgICAgZWRnZTFDb250cmFzdDsgLy9UaGUgY29udHJhc3Qgb2YgdGhlIGZpcnN0IGVkZ2UuCisgICAgUG9pbnRGbG9hdCBlZGdlMUNvb3JkOyAgICAvL1RoZSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgZWRnZS4KKyAgICBmbG9hdCAgICAgIGVkZ2UyQ29udHJhc3Q7IC8vVGhlIGNvbnRyYXN0IG9mIHRoZSBzZWNvbmQgZWRnZS4KKyAgICBQb2ludEZsb2F0IGVkZ2UyQ29vcmQ7ICAgIC8vVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBzZWNvbmQgZWRnZS4KKyAgICBmbG9hdCAgICAgIHNlcGFyYXRpb247ICAgIC8vVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBlZGdlcy4KKyAgICBmbG9hdCAgICAgIHJlc2VydmVkOyAgICAgIC8vVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkLgorfSBDYWxpcGVyUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBEcmF3VGV4dE9wdGlvbnNfc3RydWN0IHsKKyAgICBjaGFyICAgICAgICAgIGZvbnROYW1lWzMyXTsgIC8vVGhlIGZvbnQgbmFtZSB0byB1c2UuCisgICAgaW50ICAgICAgICAgICBmb250U2l6ZTsgICAgICAvL1RoZSBzaXplIG9mIHRoZSBmb250LgorICAgIGludCAgICAgICAgICAgYm9sZDsgICAgICAgICAgLy9TZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byBib2xkIHRleHQuCisgICAgaW50ICAgICAgICAgICBpdGFsaWM7ICAgICAgICAvL1NldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIGl0YWxpY2l6ZSB0ZXh0LgorICAgIGludCAgICAgICAgICAgdW5kZXJsaW5lOyAgICAgLy9TZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byB1bmRlcmxpbmUgdGV4dC4KKyAgICBpbnQgICAgICAgICAgIHN0cmlrZW91dDsgICAgIC8vU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gc3RyaWtlb3V0IHRleHQuCisgICAgVGV4dEFsaWdubWVudCB0ZXh0QWxpZ25tZW50OyAvL1NldHMgdGhlIGFsaWdubWVudCBvZiB0ZXh0LgorICAgIEZvbnRDb2xvciAgICAgZm9udENvbG9yOyAgICAgLy9TZXRzIHRoZSBmb250IGNvbG9yLgorfSBEcmF3VGV4dE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZVJlcG9ydF9zdHJ1Y3QgeworICAgIFBvaW50IGNlbnRlcjsgLy9UaGUgY29vcmRpbmF0ZSBwb2ludCBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuCisgICAgaW50ICAgcmFkaXVzOyAvL1RoZSByYWRpdXMgb2YgdGhlIGNpcmNsZSwgaW4gcGl4ZWxzLgorICAgIGludCAgIGFyZWE7ICAgLy9UaGUgYXJlYSBvZiB0aGUgY2lyY2xlLCBpbiBwaXhlbHMuCit9IENpcmNsZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xvc2VkQ29udG91cl9zdHJ1Y3QgeworICAgIFBvaW50KiBwb2ludHM7ICAgIC8vVGhlIHBvaW50cyB0aGF0IG1ha2UgdXAgdGhlIGNsb3NlZCBjb250b3VyLgorICAgIGludCAgICBudW1Qb2ludHM7IC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGFycmF5LgorfSBDbG9zZWRDb250b3VyOworCit0eXBlZGVmIHN0cnVjdCBDb2xvckhpc3RvZ3JhbVJlcG9ydF9zdHJ1Y3QgeworICAgIEhpc3RvZ3JhbVJlcG9ydCBwbGFuZTE7IC8vVGhlIGhpc3RvZ3JhbSByZXBvcnQgb2YgdGhlIGZpcnN0IGNvbG9yIHBsYW5lLgorICAgIEhpc3RvZ3JhbVJlcG9ydCBwbGFuZTI7IC8vVGhlIGhpc3RvZ3JhbSByZXBvcnQgb2YgdGhlIHNlY29uZCBwbGFuZS4KKyAgICBIaXN0b2dyYW1SZXBvcnQgcGxhbmUzOyAvL1RoZSBoaXN0b2dyYW0gcmVwb3J0IG9mIHRoZSB0aGlyZCBwbGFuZS4KK30gQ29sb3JIaXN0b2dyYW1SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbG9ySW5mb3JtYXRpb25fc3RydWN0IHsKKyAgICBpbnQgICAgIGluZm9Db3VudDsgIC8vVGhlIHNpemUgb2YgdGhlIGluZm8gYXJyYXkuCisgICAgaW50ICAgICBzYXR1cmF0aW9uOyAvL1RoZSBzYXR1cmF0aW9uIGxldmVsIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGxlYXJuIHRoZSBjb2xvciBpbmZvcm1hdGlvbi4KKyAgICBkb3VibGUqIGluZm87ICAgICAgIC8vQW4gYXJyYXkgb2YgY29sb3IgaW5mb3JtYXRpb24gdGhhdCByZXByZXNlbnRzIHRoZSBjb2xvciBzcGVjdHJ1bSBhbmFseXNpcyBvZiBhIHJlZ2lvbiBvZiBhbiBpbWFnZSBpbiBhIGNvbXBhY3QgZm9ybS4KK30gQ29sb3JJbmZvcm1hdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29tcGxleF9zdHJ1Y3QgeworICAgIGZsb2F0IHI7IC8vVGhlIHJlYWwgcGFydCBvZiB0aGUgdmFsdWUuCisgICAgZmxvYXQgaTsgLy9UaGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIHZhbHVlLgorfSBDb21wbGV4OworCit0eXBlZGVmIHN0cnVjdCBDb25jZW50cmljUmFrZVJlcG9ydF9zdHJ1Y3QgeworICAgIEFyY0luZm8qICAgICAgICAgICAgcmFrZUFyY3M7ICAgICAgICAgIC8vQW4gYXJyYXkgY29udGFpbmluZyB0aGUgbG9jYXRpb24gb2YgZWFjaCBjb25jZW50cmljIGFyYyBsaW5lIHVzZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtQXJjczsgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBhcmMgbGluZXMgaW4gdGhlIHJha2VBcmNzIGFycmF5LgorICAgIFBvaW50RmxvYXQqICAgICAgICAgZmlyc3RFZGdlczsgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgYWxsIGVkZ2VzIGRldGVjdGVkIGFzIGZpcnN0IGVkZ2VzLgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtRmlyc3RFZGdlczsgICAgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGZpcnN0IGVkZ2VzIGFycmF5LgorICAgIFBvaW50RmxvYXQqICAgICAgICAgbGFzdEVkZ2VzOyAgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgYWxsIGVkZ2VzIGRldGVjdGVkIGFzIGxhc3QgZWRnZXMuCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1MYXN0RWRnZXM7ICAgICAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbGFzdCBlZGdlcyBhcnJheS4KKyAgICBFZGdlTG9jYXRpb25SZXBvcnQqIGFsbEVkZ2VzOyAgICAgICAgICAvL0FuIGFycmF5IG9mIHJlcG9ydHMgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVkZ2VzIGxvY2F0ZWQgYnkgZWFjaCBjb25jZW50cmljIHJha2UgYXJjIGxpbmUuCisgICAgaW50KiAgICAgICAgICAgICAgICBsaW5lc1dpdGhFZGdlczsgICAgLy9BbiBhcnJheSBvZiBpbmRpY2VzIGludG8gdGhlIHJha2VBcmNzIGFycmF5IGluZGljYXRpbmcgdGhlIGNvbmNlbnRyaWMgcmFrZSBhcmMgbGluZXMgb24gd2hpY2ggdGhlIGZ1bmN0aW9uIGRldGVjdGVkIGF0IGxlYXN0IG9uZSBlZGdlLgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtTGluZXNXaXRoRWRnZXM7IC8vVGhlIG51bWJlciBvZiBjb25jZW50cmljIHJha2UgYXJjIGxpbmVzIGFsb25nIHdoaWNoIHRoZSBmdW5jdGlvbiBkZXRlY3RlZCBlZGdlcy4KK30gQ29uY2VudHJpY1Jha2VSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbnN0cnVjdFJPSU9wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICB3aW5kb3dOdW1iZXI7IC8vVGhlIHdpbmRvdyBudW1iZXIgb2YgdGhlIGltYWdlIHdpbmRvdy4KKyAgICBjb25zdCBjaGFyKiB3aW5kb3dUaXRsZTsgIC8vU3BlY2lmaWVzIHRoZSBtZXNzYWdlIHN0cmluZyB0aGF0IHRoZSBmdW5jdGlvbiBkaXNwbGF5cyBpbiB0aGUgdGl0bGUgYmFyIG9mIHRoZSB3aW5kb3cuCisgICAgUGFsZXR0ZVR5cGUgdHlwZTsgICAgICAgICAvL1RoZSBwYWxldHRlIHR5cGUgdG8gdXNlLgorICAgIFJHQlZhbHVlKiAgIHBhbGV0dGU7ICAgICAgLy9JZiB0eXBlIGlzIElNQVFfUEFMRVRURV9VU0VSLCB0aGlzIGFycmF5IGlzIHRoZSBwYWxldHRlIG9mIGNvbG9ycyB0byB1c2Ugd2l0aCB0aGUgd2luZG93LgorICAgIGludCAgICAgICAgIG51bUNvbG9yczsgICAgLy9JZiB0eXBlIGlzIElNQVFfUEFMRVRURV9VU0VSLCB0aGlzIGVsZW1lbnQgaXMgdGhlIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIHBhbGV0dGUgYXJyYXkuCit9IENvbnN0cnVjdFJPSU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJJbmZvX3N0cnVjdCB7CisgICAgQ29udG91clR5cGUgdHlwZTsgICAgICAgICAvL1RoZSBjb250b3VyIHR5cGUuCisgICAgdW5zaWduZWQgICAgbnVtUG9pbnRzOyAgICAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgbWFrZSB1cCB0aGUgY29udG91ci4KKyAgICBQb2ludCogICAgICBwb2ludHM7ICAgICAgIC8vVGhlIHBvaW50cyBkZXNjcmliaW5nIHRoZSBjb250b3VyLgorICAgIFJHQlZhbHVlICAgIGNvbnRvdXJDb2xvcjsgLy9UaGUgY29udG91ciBjb2xvci4KK30gQ29udG91ckluZm87CisKK3R5cGVkZWYgdW5pb24gQ29udG91clVuaW9uX3VuaW9uIHsKKyAgICBQb2ludCogICAgICAgICBwb2ludDsgICAgICAgICAgIC8vVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZSBJTUFRX1BPSU5ULgorICAgIExpbmUqICAgICAgICAgIGxpbmU7ICAgICAgICAgICAgLy9Vc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlIElNQVFfTElORS4KKyAgICBSZWN0KiAgICAgICAgICByZWN0OyAgICAgICAgICAgIC8vVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZSBJTUFRX1JFQ1QuCisgICAgUmVjdCogICAgICAgICAgb3ZhbEJvdW5kaW5nQm94OyAvL1VzZSB0aGlzIG1lbWJlciB3aGVuIHRoZSBjb250b3VyIGlzIG9mIHR5cGUgSU1BUV9PVkFMLgorICAgIENsb3NlZENvbnRvdXIqIGNsb3NlZENvbnRvdXI7ICAgLy9Vc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlIElNQVFfQ0xPU0VEX0NPTlRPVVIuCisgICAgT3BlbkNvbnRvdXIqICAgb3BlbkNvbnRvdXI7ICAgICAvL1VzZSB0aGlzIG1lbWJlciB3aGVuIHRoZSBjb250b3VyIGlzIG9mIHR5cGUgSU1BUV9PUEVOX0NPTlRPVVIuCisgICAgQW5udWx1cyogICAgICAgYW5udWx1czsgICAgICAgICAvL1VzZSB0aGlzIG1lbWJlciB3aGVuIHRoZSBjb250b3VyIGlzIG9mIHR5cGUgSU1BUV9BTk5VTFVTLgorICAgIFJvdGF0ZWRSZWN0KiAgIHJvdGF0ZWRSZWN0OyAgICAgLy9Vc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlIElNQVFfUk9UQVRFRF9SRUNULgorfSBDb250b3VyVW5pb247CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJJbmZvMl9zdHJ1Y3QgeworICAgIENvbnRvdXJUeXBlICB0eXBlOyAgICAgIC8vVGhlIGNvbnRvdXIgdHlwZS4KKyAgICBSR0JWYWx1ZSAgICAgY29sb3I7ICAgICAvL1RoZSBjb250b3VyIGNvbG9yLgorICAgIENvbnRvdXJVbmlvbiBzdHJ1Y3R1cmU7IC8vVGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBkZXNjcmliZSB0aGUgY29udG91ciBpbiBjb29yZGluYXRlIHNwYWNlLgorfSBDb250b3VySW5mbzI7CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJQb2ludF9zdHJ1Y3QgeworICAgIGRvdWJsZSB4OyAgICAgICAgICAgICAvL1RoZSB4LWNvb3JkaW5hdGUgdmFsdWUgaW4gdGhlIGltYWdlLgorICAgIGRvdWJsZSB5OyAgICAgICAgICAgICAvL1RoZSB5LWNvb3JkaW5hdGUgdmFsdWUgaW4gdGhlIGltYWdlLgorICAgIGRvdWJsZSBjdXJ2YXR1cmU7ICAgICAvL1RoZSBjaGFuZ2UgaW4gc2xvcGUgYXQgdGhpcyBlZGdlIHBvaW50IG9mIHRoZSBzZWdtZW50LgorICAgIGRvdWJsZSB4RGlzcGxhY2VtZW50OyAvL1RoZSB4IGRpc3BsYWNlbWVudCBvZiB0aGUgY3VycmVudCBlZGdlIHBpeGVsIGZyb20gYSBjdWJpYyBzcGxpbmUgZml0IG9mIHRoZSBjdXJyZW50IGVkZ2Ugc2VnbWVudC4KKyAgICBkb3VibGUgeURpc3BsYWNlbWVudDsgLy9UaGUgeSBkaXNwbGFjZW1lbnQgb2YgdGhlIGN1cnJlbnQgZWRnZSBwaXhlbCBmcm9tIGEgY3ViaWMgc3BsaW5lIGZpdCBvZiB0aGUgY3VycmVudCBlZGdlIHNlZ21lbnQuCit9IENvbnRvdXJQb2ludDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29vcmRpbmF0ZVRyYW5zZm9ybV9zdHJ1Y3QgeworICAgIFBvaW50IGluaXRpYWxPcmlnaW47IC8vVGhlIG9yaWdpbiBvZiB0aGUgaW5pdGlhbCBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBmbG9hdCBpbml0aWFsQW5nbGU7ICAvL1RoZSBhbmdsZSwgaW4gZGVncmVlcywgb2YgdGhlIHgtYXhpcyBvZiB0aGUgaW5pdGlhbCBjb29yZGluYXRlIHN5c3RlbSByZWxhdGl2ZSB0byB0aGUgaW1hZ2UgeC1heGlzLgorICAgIFBvaW50IGZpbmFsT3JpZ2luOyAgIC8vVGhlIG9yaWdpbiBvZiB0aGUgZmluYWwgY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgZmxvYXQgZmluYWxBbmdsZTsgICAgLy9UaGUgYW5nbGUsIGluIGRlZ3JlZXMsIG9mIHRoZSB4LWF4aXMgb2YgdGhlIGZpbmFsIGNvb3JkaW5hdGUgc3lzdGVtIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSB4LWF4aXMuCit9IENvb3JkaW5hdGVUcmFuc2Zvcm07CisKK3R5cGVkZWYgc3RydWN0IENvb3JkaW5hdGVUcmFuc2Zvcm0yX3N0cnVjdCB7CisgICAgQ29vcmRpbmF0ZVN5c3RlbSByZWZlcmVuY2VTeXN0ZW07ICAgLy9EZWZpbmVzIHRoZSBjb29yZGluYXRlIHN5c3RlbSBmb3IgaW5wdXQgY29vcmRpbmF0ZXMuCisgICAgQ29vcmRpbmF0ZVN5c3RlbSBtZWFzdXJlbWVudFN5c3RlbTsgLy9EZWZpbmVzIHRoZSBjb29yZGluYXRlIHN5c3RlbSBpbiB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0gbWVhc3VyZW1lbnRzLgorfSBDb29yZGluYXRlVHJhbnNmb3JtMjsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FubnlPcHRpb25zX3N0cnVjdCB7CisgICAgZmxvYXQgc2lnbWE7ICAgICAgICAgIC8vVGhlIHNpZ21hIG9mIHRoZSBHYXVzc2lhbiBzbW9vdGhpbmcgZmlsdGVyIHRoYXQgdGhlIGZ1bmN0aW9uIGFwcGxpZXMgdG8gdGhlIGltYWdlIGJlZm9yZSBlZGdlIGRldGVjdGlvbi4KKyAgICBmbG9hdCB1cHBlclRocmVzaG9sZDsgLy9UaGUgdXBwZXIgZnJhY3Rpb24gb2YgcGl4ZWwgdmFsdWVzIGluIHRoZSBpbWFnZSBmcm9tIHdoaWNoIHRoZSBmdW5jdGlvbiBjaG9vc2VzIGEgc2VlZCBvciBzdGFydGluZyBwb2ludCBvZiBhbiBlZGdlIHNlZ21lbnQuCisgICAgZmxvYXQgbG93ZXJUaHJlc2hvbGQ7IC8vVGhlIGZ1bmN0aW9uIG11bHRpcGxpZXMgdGhpcyB2YWx1ZSBieSB1cHBlclRocmVzaG9sZCB0byBkZXRlcm1pbmUgdGhlIGxvd2VyIHRocmVzaG9sZCBmb3IgYWxsIHRoZSBwaXhlbHMgaW4gYW4gZWRnZSBzZWdtZW50LgorICAgIGludCAgIHdpbmRvd1NpemU7ICAgICAvL1RoZSB3aW5kb3cgc2l6ZSBvZiB0aGUgR2F1c3NpYW4gZmlsdGVyIHRoYXQgdGhlIGZ1bmN0aW9uIGFwcGxpZXMgdG8gdGhlIGltYWdlLgorfSBDYW5ueU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFJhbmdlX3N0cnVjdCB7CisgICAgaW50IG1pblZhbHVlOyAvL1RoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZS4KKyAgICBpbnQgbWF4VmFsdWU7IC8vVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLgorfSBSYW5nZTsKKwordHlwZWRlZiBzdHJ1Y3QgVXNlclBvaW50U3ltYm9sX3N0cnVjdCB7CisgICAgaW50ICBjb2xzOyAgIC8vTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHN5bWJvbC4KKyAgICBpbnQgIHJvd3M7ICAgLy9OdW1iZXIgb2Ygcm93cyBpbiB0aGUgc3ltYm9sLgorICAgIGludCogcGl4ZWxzOyAvL1RoZSBwaXhlbHMgb2YgdGhlIHN5bWJvbC4KK30gVXNlclBvaW50U3ltYm9sOworCit0eXBlZGVmIHN0cnVjdCBWaWV3M0RPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgc2l6ZVJlZHVjdGlvbjsgLy9BIGRpdmlzb3IgdGhlIGZ1bmN0aW9uIHVzZXMgd2hlbiBkZXRlcm1pbmluZyB0aGUgZmluYWwgaGVpZ2h0IGFuZCB3aWR0aCBvZiB0aGUgM0QgaW1hZ2UuCisgICAgaW50ICAgICAgICAgbWF4SGVpZ2h0OyAgICAgLy9EZWZpbmVzIHRoZSBtYXhpbXVtIGhlaWdodCBvZiBhIHBpeGVsIGZyb20gdGhlIGltYWdlIHNvdXJjZSBkcmF3biBpbiAzRC4KKyAgICBEaXJlY3Rpb24zRCBkaXJlY3Rpb247ICAgICAvL0RlZmluZXMgdGhlIDNEIG9yaWVudGF0aW9uLgorICAgIGZsb2F0ICAgICAgIGFscGhhOyAgICAgICAgIC8vRGV0ZXJtaW5lcyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgaG9yaXpvbnRhbCBhbmQgdGhlIGJhc2VsaW5lLgorICAgIGZsb2F0ICAgICAgIGJldGE7ICAgICAgICAgIC8vRGV0ZXJtaW5lcyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgaG9yaXpvbnRhbCBhbmQgdGhlIHNlY29uZCBiYXNlbGluZS4KKyAgICBpbnQgICAgICAgICBib3JkZXI7ICAgICAgICAvL0RlZmluZXMgdGhlIGJvcmRlciBzaXplLgorICAgIGludCAgICAgICAgIGJhY2tncm91bmQ7ICAgIC8vRGVmaW5lcyB0aGUgYmFja2dyb3VuZCBjb2xvci4KKyAgICBQbGFuZTNEICAgICBwbGFuZTsgICAgICAgICAvL0luZGljYXRlcyB0aGUgdmlldyBhIGZ1bmN0aW9uIHVzZXMgdG8gc2hvdyBjb21wbGV4IGltYWdlcy4KK30gVmlldzNET3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hQYXR0ZXJuT3B0aW9uc19zdHJ1Y3QgeworICAgIE1hdGNoaW5nTW9kZSAgICAgICAgbW9kZTsgICAgICAgICAgICAgICAgLy9TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBsb29raW5nIGZvciB0aGUgcGF0dGVybiBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBtaW5Db250cmFzdDsgICAgICAgICAvL1NwZWNpZmllcyB0aGUgbWluaW11bSBjb250cmFzdCBleHBlY3RlZCBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBzdWJwaXhlbEFjY3VyYWN5OyAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byByZXR1cm4gYXJlYXMgaW4gdGhlIGltYWdlIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4gYXJlYSB3aXRoIHN1YnBpeGVsIGFjY3VyYWN5LgorICAgIFJvdGF0aW9uQW5nbGVSYW5nZSogYW5nbGVSYW5nZXM7ICAgICAgICAgLy9BbiBhcnJheSBvZiBhbmdsZSByYW5nZXMsIGluIGRlZ3JlZXMsIHdoZXJlIGVhY2ggcmFuZ2Ugc3BlY2lmaWVzIGhvdyBtdWNoIHlvdSBleHBlY3QgdGhlIHBhdHRlcm4gdG8gYmUgcm90YXRlZCBpbiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1SYW5nZXM7ICAgICAgICAgICAvL051bWJlciBvZiBhbmdsZSByYW5nZXMgaW4gdGhlIGFuZ2xlUmFuZ2VzIGFycmF5LgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtTWF0Y2hlc1JlcXVlc3RlZDsgLy9OdW1iZXIgb2YgdmFsaWQgbWF0Y2hlcyBleHBlY3RlZC4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG1hdGNoRmFjdG9yOyAgICAgICAgIC8vQ29udHJvbHMgdGhlIG51bWJlciBvZiBwb3RlbnRpYWwgbWF0Y2hlcyB0aGF0IHRoZSBmdW5jdGlvbiBleGFtaW5lcy4KKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1pbk1hdGNoU2NvcmU7ICAgICAgIC8vVGhlIG1pbmltdW0gc2NvcmUgYSBtYXRjaCBjYW4gaGF2ZSBmb3IgdGhlIGZ1bmN0aW9uIHRvIGNvbnNpZGVyIHRoZSBtYXRjaCB2YWxpZC4KK30gTWF0Y2hQYXR0ZXJuT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgVElGRkZpbGVPcHRpb25zX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICByb3dzUGVyU3RyaXA7ICAgIC8vSW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IHRoZSBmdW5jdGlvbiB3cml0ZXMgcGVyIHN0cmlwLgorICAgIFBob3RvbWV0cmljTW9kZSAgICAgcGhvdG9JbnRlcnA7ICAgICAvL0Rlc2lnbmF0ZXMgd2hpY2ggcGhvdG9tZXRyaWMgaW50ZXJwcmV0YXRpb24gdG8gdXNlLgorICAgIFRJRkZDb21wcmVzc2lvblR5cGUgY29tcHJlc3Npb25UeXBlOyAvL0luZGljYXRlcyB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiB0byB1c2Ugb24gdGhlIFRJRkYgZmlsZS4KK30gVElGRkZpbGVPcHRpb25zOworCit0eXBlZGVmIHVuaW9uIENvbG9yX3VuaW9uIHsKKyAgICBSR0JWYWx1ZSByZ2I7ICAgICAgLy9UaGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlc2NyaWJlIGEgY29sb3IgaW4gdGhlIFJHQiAoUmVkLCBHcmVlbiwgYW5kIEJsdWUpIGNvbG9yIHNwYWNlLgorICAgIEhTTFZhbHVlIGhzbDsgICAgICAvL1RoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgSFNMIChIdWUsIFNhdHVyYXRpb24sIGFuZCBMdW1pbmFuY2UpIGNvbG9yIHNwYWNlLgorICAgIEhTVlZhbHVlIGhzdjsgICAgICAvL1RoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgSFNJIChIdWUsIFNhdHVyYXRpb24sIGFuZCBWYWx1ZSkgY29sb3Igc3BhY2UuCisgICAgSFNJVmFsdWUgaHNpOyAgICAgIC8vVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBIU0kgKEh1ZSwgU2F0dXJhdGlvbiwgYW5kIEludGVuc2l0eSkgY29sb3Igc3BhY2UuCisgICAgaW50ICAgICAgcmF3VmFsdWU7IC8vVGhlIGludGVnZXIgdmFsdWUgZm9yIHRoZSBkYXRhIGluIHRoZSBjb2xvciB1bmlvbi4KK30gQ29sb3I7CisKK3R5cGVkZWYgdW5pb24gUGl4ZWxWYWx1ZV91bmlvbiB7CisgICAgZmxvYXQgICAgICAgZ3JheXNjYWxlOyAvL0EgZ3JheXNjYWxlIHBpeGVsIHZhbHVlLgorICAgIFJHQlZhbHVlICAgIHJnYjsgICAgICAgLy9BIFJHQiBwaXhlbCB2YWx1ZS4KKyAgICBIU0xWYWx1ZSAgICBoc2w7ICAgICAgIC8vQSBIU0wgcGl4ZWwgdmFsdWUuCisgICAgQ29tcGxleCAgICAgY29tcGxleDsgICAvL0EgY29tcGxleCBwaXhlbCB2YWx1ZS4KKyAgICBSR0JVNjRWYWx1ZSByZ2J1NjQ7ICAgIC8vQW4gdW5zaWduZWQgNjQtYml0IFJHQiBwaXhlbCB2YWx1ZS4KK30gUGl4ZWxWYWx1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkNvbnRvdXJfc3RydWN0IHsKKyAgICBQb2ludCogcG9pbnRzOyAgICAvL1RoZSBwb2ludHMgdGhhdCBtYWtlIHVwIHRoZSBvcGVuIGNvbnRvdXIuCisgICAgaW50ICAgIG51bVBvaW50czsgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgYXJyYXkuCit9IE9wZW5Db250b3VyOworCit0eXBlZGVmIHN0cnVjdCBPdmVybGF5VGV4dE9wdGlvbnNfc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgZm9udE5hbWU7ICAgICAgICAgICAgICAgIC8vVGhlIG5hbWUgb2YgdGhlIGZvbnQgdG8gdXNlLgorICAgIGludCAgICAgICAgICAgICAgICAgICBmb250U2l6ZTsgICAgICAgICAgICAgICAgLy9UaGUgc2l6ZSBvZiB0aGUgZm9udC4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgYm9sZDsgICAgICAgICAgICAgICAgICAgIC8vU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIGJvbGQgdGhlIHRleHQuCisgICAgaW50ICAgICAgICAgICAgICAgICAgIGl0YWxpYzsgICAgICAgICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBpdGFsaWNpemUgdGhlIHRleHQuCisgICAgaW50ICAgICAgICAgICAgICAgICAgIHVuZGVybGluZTsgICAgICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byB1bmRlcmxpbmUgdGhlIHRleHQuCisgICAgaW50ICAgICAgICAgICAgICAgICAgIHN0cmlrZW91dDsgICAgICAgICAgICAgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzdHJpa2VvdXQgdGhlIHRleHQuCisgICAgVGV4dEFsaWdubWVudCAgICAgICAgIGhvcml6b250YWxUZXh0QWxpZ25tZW50OyAvL1NldHMgdGhlIGFsaWdubWVudCBvZiB0aGUgdGV4dC4KKyAgICBWZXJ0aWNhbFRleHRBbGlnbm1lbnQgdmVydGljYWxUZXh0QWxpZ25tZW50OyAgIC8vU2V0cyB0aGUgdmVydGljYWwgYWxpZ25tZW50IGZvciB0aGUgdGV4dC4KKyAgICBSR0JWYWx1ZSAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOyAgICAgICAgIC8vU2V0cyB0aGUgY29sb3IgZm9yIHRoZSB0ZXh0IGJhY2tncm91bmQgcGl4ZWxzLgorICAgIGRvdWJsZSAgICAgICAgICAgICAgICBhbmdsZTsgICAgICAgICAgICAgICAgICAgLy9UaGUgY291bnRlcmNsb2Nrd2lzZSBhbmdsZSwgaW4gZGVncmVlcywgb2YgdGhlIHRleHQgcmVsYXRpdmUgdG8gdGhlIHgtYXhpcy4KK30gT3ZlcmxheVRleHRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhX3N0cnVjdCB7CisgICAgTWVhc3VyZW1lbnRWYWx1ZSBwYXJhbWV0ZXI7IC8vVGhlIG1vcnBob2xvZ2ljYWwgbWVhc3VyZW1lbnQgdGhhdCB0aGUgZnVuY3Rpb24gdXNlcyBmb3IgZmlsdGVyaW5nLgorICAgIGZsb2F0ICAgICAgICAgICAgbG93ZXI7ICAgICAvL1RoZSBsb3dlciBib3VuZCBvZiB0aGUgY3JpdGVyaWEgcmFuZ2UuCisgICAgZmxvYXQgICAgICAgICAgICB1cHBlcjsgICAgIC8vVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBjcml0ZXJpYSByYW5nZS4KKyAgICBpbnQgICAgICAgICAgICAgIGV4Y2x1ZGU7ICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gaW5kaWNhdGUgdGhhdCBhIG1hdGNoIG9jY3VycyB3aGVuIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIHRoZSBjcml0ZXJpYSByYW5nZS4KK30gUGFydGljbGVGaWx0ZXJDcml0ZXJpYTsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVSZXBvcnRfc3RydWN0IHsKKyAgICBpbnQgICBhcmVhOyAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgcGl4ZWxzIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBmbG9hdCBjYWxpYnJhdGVkQXJlYTsgICAvL1RoZSBzaXplIG9mIHRoZSBwYXJ0aWNsZSwgY2FsaWJyYXRlZCB0byB0aGUgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gb2YgdGhlIGltYWdlLgorICAgIGZsb2F0IHBlcmltZXRlcjsgICAgICAgIC8vVGhlIGxlbmd0aCBvZiB0aGUgcGVyaW1ldGVyLCBjYWxpYnJhdGVkIHRvIHRoZSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUgaW1hZ2UuCisgICAgaW50ICAgbnVtSG9sZXM7ICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGhvbGVzIGluIHRoZSBwYXJ0aWNsZS4KKyAgICBpbnQgICBhcmVhT2ZIb2xlczsgICAgICAvL1RoZSB0b3RhbCBzdXJmYWNlIGFyZWEsIGluIHBpeGVscywgb2YgYWxsIHRoZSBob2xlcyBpbiBhIHBhcnRpY2xlLgorICAgIGZsb2F0IHBlcmltZXRlck9mSG9sZXM7IC8vVGhlIGxlbmd0aCBvZiB0aGUgcGVyaW1ldGVyIG9mIGFsbCB0aGUgaG9sZXMgaW4gdGhlIHBhcnRpY2xlIGNhbGlicmF0ZWQgdG8gdGhlIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIG9mIHRoZSBpbWFnZS4KKyAgICBSZWN0ICBib3VuZGluZ0JveDsgICAgICAvL1RoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCBlbmNsb3NlcyB0aGUgcGFydGljbGUuCisgICAgZmxvYXQgc2lnbWFYOyAgICAgICAgICAgLy9UaGUgc3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcy4KKyAgICBmbG9hdCBzaWdtYVk7ICAgICAgICAgICAvL1RoZSBzdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeS1heGlzLgorICAgIGZsb2F0IHNpZ21hWFg7ICAgICAgICAgIC8vVGhlIHN1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB4LWF4aXMsIHNxdWFyZWQuCisgICAgZmxvYXQgc2lnbWFZWTsgICAgICAgICAgLy9UaGUgc3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHktYXhpcywgc3F1YXJlZC4KKyAgICBmbG9hdCBzaWdtYVhZOyAgICAgICAgICAvL1RoZSBzdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeC1heGlzIGFuZCB5LWF4aXMuCisgICAgaW50ICAgbG9uZ2VzdExlbmd0aDsgICAgLy9UaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGhvcml6b250YWwgbGluZSBzZWdtZW50LgorICAgIFBvaW50IGxvbmdlc3RQb2ludDsgICAgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBsZWZ0bW9zdCBwaXhlbCBvZiB0aGUgbG9uZ2VzdCBzZWdtZW50IGluIHRoZSBwYXJ0aWNsZS4KKyAgICBpbnQgICBwcm9qZWN0aW9uWDsgICAgICAvL1RoZSBsZW5ndGggb2YgdGhlIHBhcnRpY2xlIHdoZW4gcHJvamVjdGVkIG9udG8gdGhlIHgtYXhpcy4KKyAgICBpbnQgICBwcm9qZWN0aW9uWTsgICAgICAvL1RoZSBsZW5ndGggb2YgdGhlIHBhcnRpY2xlIHdoZW4gcHJvamVjdGVkIG9udG8gdGhlIHktYXhpcy4KKyAgICBpbnQgICBjb25uZWN0ODsgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBmdW5jdGlvbiB1c2VkIGNvbm5lY3Rpdml0eS04IHRvIGRldGVybWluZSBpZiBwYXJ0aWNsZXMgYXJlIHRvdWNoaW5nLgorfSBQYXJ0aWNsZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgUGF0dGVybk1hdGNoX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vVGhlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIG1hdGNoLgorICAgIGZsb2F0ICAgICAgcm90YXRpb247ICAvL1RoZSByb3RhdGlvbiBvZiB0aGUgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIHRlbXBsYXRlIGltYWdlLCBpbiBkZWdyZWVzLgorICAgIGZsb2F0ICAgICAgc2NhbGU7ICAgICAvL1RoZSBzaXplIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdGVtcGxhdGUgaW1hZ2UsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UuCisgICAgZmxvYXQgICAgICBzY29yZTsgICAgIC8vVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaC4KKyAgICBQb2ludEZsb2F0IGNvcm5lcls0XTsgLy9BbiBhcnJheSBvZiBmb3VyIHBvaW50cyBkZXNjcmliaW5nIHRoZSByZWN0YW5nbGUgc3Vycm91bmRpbmcgdGhlIHRlbXBsYXRlIGltYWdlLgorfSBQYXR0ZXJuTWF0Y2g7CisKK3R5cGVkZWYgc3RydWN0IFF1YW50aWZ5RGF0YV9zdHJ1Y3QgeworICAgIGZsb2F0IG1lYW47ICAgICAgICAgICAvL1RoZSBtZWFuIHZhbHVlIG9mIHRoZSBwaXhlbCB2YWx1ZXMuCisgICAgZmxvYXQgc3RkRGV2OyAgICAgICAgIC8vVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcGl4ZWwgdmFsdWVzLgorICAgIGZsb2F0IG1pbjsgICAgICAgICAgICAvL1RoZSBzbWFsbGVzdCBwaXhlbCB2YWx1ZS4KKyAgICBmbG9hdCBtYXg7ICAgICAgICAgICAgLy9UaGUgbGFyZ2VzdCBwaXhlbCB2YWx1ZS4KKyAgICBmbG9hdCBjYWxpYnJhdGVkQXJlYTsgLy9UaGUgYXJlYSwgY2FsaWJyYXRlZCB0byB0aGUgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gb2YgdGhlIGltYWdlLgorICAgIGludCAgIHBpeGVsQXJlYTsgICAgICAvL1RoZSBhcmVhLCBpbiBudW1iZXIgb2YgcGl4ZWxzLgorICAgIGZsb2F0IHJlbGF0aXZlU2l6ZTsgICAvL1RoZSBwcm9wb3J0aW9uLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLCBvZiB0aGUgYXNzb2NpYXRlZCByZWdpb24gcmVsYXRpdmUgdG8gdGhlIHdob2xlIGltYWdlLgorfSBRdWFudGlmeURhdGE7CisKK3R5cGVkZWYgc3RydWN0IFF1YW50aWZ5UmVwb3J0X3N0cnVjdCB7CisgICAgUXVhbnRpZnlEYXRhICBnbG9iYWw7ICAgICAgLy9TdGF0aXN0aWNhbCBkYXRhIG9mIHRoZSB3aG9sZSBpbWFnZS4KKyAgICBRdWFudGlmeURhdGEqIHJlZ2lvbnM7ICAgICAvL0FuIGFycmF5IG9mIFF1YW50aWZ5RGF0YSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgc3RhdGlzdGljYWwgZGF0YSBvZiBlYWNoIHJlZ2lvbiBvZiB0aGUgaW1hZ2UuCisgICAgaW50ICAgICAgICAgICByZWdpb25Db3VudDsgLy9UaGUgbnVtYmVyIG9mIHJlZ2lvbnMuCit9IFF1YW50aWZ5UmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBSYWtlT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICAgdGhyZXNob2xkOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZm9yIHRoZSBjb250cmFzdCBvZiB0aGUgZWRnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgdGhlIGZ1bmN0aW9uIGF2ZXJhZ2VzIHRvIGZpbmQgdGhlIGNvbnRyYXN0IGF0IGVpdGhlciBzaWRlIG9mIHRoZSBlZGdlLgorICAgIGludCAgICAgICAgICAgICAgICAgc3RlZXBuZXNzOyAgICAgICAgIC8vVGhlIHNwYW4sIGluIHBpeGVscywgb2YgdGhlIHNsb3BlIG9mIHRoZSBlZGdlIHByb2plY3RlZCBhbG9uZyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IHBvaW50cy4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHN1YnNhbXBsaW5nUmF0aW87ICAvL1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHNlcGFyYXRlIHR3byBjb25zZWN1dGl2ZSBzZWFyY2ggbGluZXMuCisgICAgSW50ZXJwb2xhdGlvbk1ldGhvZCBzdWJwaXhlbFR5cGU7ICAgICAgLy9UaGUgbWV0aG9kIGZvciBpbnRlcnBvbGF0aW5nLgorICAgIGludCAgICAgICAgICAgICAgICAgc3VicGl4ZWxEaXZpc2lvbnM7IC8vVGhlIG51bWJlciBvZiBzYW1wbGVzIHRoZSBmdW5jdGlvbiBvYnRhaW5zIGZyb20gYSBwaXhlbC4KK30gUmFrZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFJha2VSZXBvcnRfc3RydWN0IHsKKyAgICBMaW5lRmxvYXQqICAgICAgICAgIHJha2VMaW5lczsgICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGVhY2ggb2YgdGhlIHJha2UgbGluZXMgdXNlZCBieSB0aGUgZnVuY3Rpb24uCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1SYWtlTGluZXM7ICAgICAgLy9UaGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSByYWtlTGluZXMgYXJyYXkuCisgICAgUG9pbnRGbG9hdCogICAgICAgICBmaXJzdEVkZ2VzOyAgICAgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiBhbGwgZWRnZXMgZGV0ZWN0ZWQgYXMgZmlyc3QgZWRnZXMuCisgICAgdW5zaWduZWQgaW50ICAgICAgICBudW1GaXJzdEVkZ2VzOyAgICAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZmlyc3RFZGdlcyBhcnJheS4KKyAgICBQb2ludEZsb2F0KiAgICAgICAgIGxhc3RFZGdlczsgICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGFsbCBlZGdlcyBkZXRlY3RlZCBhcyBsYXN0IGVkZ2VzLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgbnVtTGFzdEVkZ2VzOyAgICAgIC8vVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGxhc3RFZGdlcyBhcnJheS4KKyAgICBFZGdlTG9jYXRpb25SZXBvcnQqIGFsbEVkZ2VzOyAgICAgICAgICAvL0FuIGFycmF5IG9mIHJlcG9ydHMgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVkZ2VzIGxvY2F0ZWQgYnkgZWFjaCByYWtlIGxpbmUuCisgICAgaW50KiAgICAgICAgICAgICAgICBsaW5lc1dpdGhFZGdlczsgICAgLy9BbiBhcnJheSBvZiBpbmRpY2VzIGludG8gdGhlIHJha2VMaW5lcyBhcnJheSBpbmRpY2F0aW5nIHRoZSByYWtlIGxpbmVzIG9uIHdoaWNoIHRoZSBmdW5jdGlvbiBkZXRlY3RlZCBhdCBsZWFzdCBvbmUgZWRnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bUxpbmVzV2l0aEVkZ2VzOyAvL1RoZSBudW1iZXIgb2YgcmFrZSBsaW5lcyBhbG9uZyB3aGljaCB0aGUgZnVuY3Rpb24gZGV0ZWN0ZWQgZWRnZXMuCit9IFJha2VSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFRyYW5zZm9ybVJlcG9ydF9zdHJ1Y3QgeworICAgIFBvaW50RmxvYXQqIHBvaW50czsgICAgICAvL0FuIGFycmF5IG9mIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgorICAgIGludCogICAgICAgIHZhbGlkUG9pbnRzOyAvL0FuIGFycmF5IG9mIHZhbHVlcyB0aGF0IGRlc2NyaWJlIHRoZSB2YWxpZGl0eSBvZiBlYWNoIG9mIHRoZSBjb29yZGluYXRlcyBhY2NvcmRpbmcgdG8gdGhlIHJlZ2lvbiBvZiBpbnRlcmVzdCB5b3UgY2FsaWJyYXRlZCB1c2luZyBlaXRoZXIgaW1hcUxlYXJuQ2FsaWJyYXRpb25HcmlkKCkgb3IgaW1hcUxlYXJuQ2FsaWJyYXRpb25Qb2ludHMoKS4KKyAgICBpbnQgICAgICAgICBudW1Qb2ludHM7ICAgLy9UaGUgbGVuZ3RoIG9mIGJvdGggdGhlIHBvaW50cyBhcnJheSBhbmQgdGhlIHZhbGlkUG9pbnRzIGFycmF5LgorfSBUcmFuc2Zvcm1SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFNoYXBlUmVwb3J0X3N0cnVjdCB7CisgICAgUmVjdCAgIGNvb3JkaW5hdGVzOyAvL1RoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIG9iamVjdC4KKyAgICBQb2ludCAgY2VudHJvaWQ7ICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGNlbnRyb2lkIG9mIHRoZSBvYmplY3QuCisgICAgaW50ICAgIHNpemU7ICAgICAgICAvL1RoZSBzaXplLCBpbiBwaXhlbHMsIG9mIHRoZSBvYmplY3QuCisgICAgZG91YmxlIHNjb3JlOyAgICAgICAvL0EgdmFsdWUgcmFuZ2luZyBiZXR3ZWVuIDEgYW5kIDEsMDAwIHRoYXQgc3BlY2lmaWVzIGhvdyBzaW1pbGFyIHRoZSBvYmplY3QgaW4gdGhlIGltYWdlIGlzIHRvIHRoZSB0ZW1wbGF0ZS4KK30gU2hhcGVSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IE1ldGVyQXJjX3N0cnVjdCB7CisgICAgUG9pbnRGbG9hdCAgbmVlZGxlQmFzZTsgICAgICAgICAgLy9UaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgYmFzZSBvZiB0aGUgbWV0ZXIgbmVlZGxlLgorICAgIFBvaW50RmxvYXQqIGFyY0Nvb3JkUG9pbnRzOyAgICAgIC8vQW4gYXJyYXkgb2YgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIG1ldGVyIGFyYy4KKyAgICBpbnQgICAgICAgICBudW1PZkFyY0Nvb3JkUG9pbnRzOyAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBhcmNDb29yZFBvaW50cyBhcnJheS4KKyAgICBpbnQgICAgICAgICBuZWVkbGVDb2xvcjsgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyBUUlVFIHdoZW4gdGhlIG1ldGVyIGhhcyBhIGxpZ2h0LWNvbG9yZWQgbmVlZGxlIG9uIGEgZGFyayBiYWNrZ3JvdW5kLgorfSBNZXRlckFyYzsKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZXNob2xkRGF0YV9zdHJ1Y3QgeworICAgIGZsb2F0IHJhbmdlTWluOyAgICAvL1RoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UgdG8ga2VlcC4KKyAgICBmbG9hdCByYW5nZU1heDsgICAgLy9UaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIHRvIGtlZXAuCisgICAgZmxvYXQgbmV3VmFsdWU7ICAgIC8vSWYgdXNlTmV3VmFsdWUgaXMgVFJVRSwgbmV3VmFsdWUgaXMgdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciBwaXhlbHMgd2l0aGluIHRoZSByYW5nZS4KKyAgICBpbnQgICB1c2VOZXdWYWx1ZTsgLy9JZiBUUlVFLCB0aGUgZnVuY3Rpb24gc2V0cyBwaXhlbCB2YWx1ZXMgd2l0aGluIFtyYW5nZU1pbiwgcmFuZ2VNYXhdIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gbmV3VmFsdWUuCit9IFRocmVzaG9sZERhdGE7CisKK3R5cGVkZWYgc3RydWN0IFN0cnVjdHVyaW5nRWxlbWVudF9zdHJ1Y3QgeworICAgIGludCAgbWF0cml4Q29sczsgLy9OdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbWF0cml4LgorICAgIGludCAgbWF0cml4Um93czsgLy9OdW1iZXIgb2Ygcm93cyBpbiB0aGUgbWF0cml4LgorICAgIGludCAgaGV4YTsgICAgICAgLy9TZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgaWYgeW91IHNwZWNpZnkgYSBoZXhhZ29uYWwgc3RydWN0dXJpbmcgZWxlbWVudCBpbiBrZXJuZWwuCisgICAgaW50KiBrZXJuZWw7ICAgICAvL1RoZSB2YWx1ZXMgb2YgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCit9IFN0cnVjdHVyaW5nRWxlbWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgU3Bva2VSZXBvcnRfc3RydWN0IHsKKyAgICBMaW5lRmxvYXQqICAgICAgICAgIHNwb2tlTGluZXM7ICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGVhY2ggb2YgdGhlIHNwb2tlIGxpbmVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uLgorICAgIGludCAgICAgICAgICAgICAgICAgbnVtU3Bva2VMaW5lczsgICAgIC8vVGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgc3Bva2VMaW5lcyBhcnJheS4KKyAgICBQb2ludEZsb2F0KiAgICAgICAgIGZpcnN0RWRnZXM7ICAgICAgICAvL1RoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGFsbCBlZGdlcyBkZXRlY3RlZCBhcyBmaXJzdCBlZGdlcy4KKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bUZpcnN0RWRnZXM7ICAgICAvL1RoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBmaXJzdEVkZ2VzIGFycmF5LgorICAgIFBvaW50RmxvYXQqICAgICAgICAgbGFzdEVkZ2VzOyAgICAgICAgIC8vVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgYWxsIGVkZ2VzIGRldGVjdGVkIGFzIGxhc3QgZWRnZXMuCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1MYXN0RWRnZXM7ICAgICAgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbGFzdEVkZ2VzIGFycmF5LgorICAgIEVkZ2VMb2NhdGlvblJlcG9ydCogYWxsRWRnZXM7ICAgICAgICAgIC8vQW4gYXJyYXkgb2YgcmVwb3J0cyBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWRnZXMgbG9jYXRlZCBieSBlYWNoIHNwb2tlIGxpbmUuCisgICAgaW50KiAgICAgICAgICAgICAgICBsaW5lc1dpdGhFZGdlczsgICAgLy9BbiBhcnJheSBvZiBpbmRpY2VzIGludG8gdGhlIHNwb2tlTGluZXMgYXJyYXkgaW5kaWNhdGluZyB0aGUgcmFrZSBsaW5lcyBvbiB3aGljaCB0aGUgZnVuY3Rpb24gZGV0ZWN0ZWQgYXQgbGVhc3Qgb25lIGVkZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1MaW5lc1dpdGhFZGdlczsgLy9UaGUgbnVtYmVyIG9mIHNwb2tlIGxpbmVzIGFsb25nIHdoaWNoIHRoZSBmdW5jdGlvbiBkZXRlY3RzIGVkZ2VzLgorfSBTcG9rZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgU2ltcGxlRWRnZU9wdGlvbnNfc3RydWN0IHsKKyAgICBMZXZlbFR5cGUgICB0eXBlOyAgICAgICAvL0RldGVybWluZXMgaG93IHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgdGhlIHRocmVzaG9sZCBhbmQgaHlzdGVyZXNpcyB2YWx1ZXMuCisgICAgaW50ICAgICAgICAgdGhyZXNob2xkOyAgLy9UaGUgcGl4ZWwgdmFsdWUgYXQgd2hpY2ggYW4gZWRnZSBvY2N1cnMuCisgICAgaW50ICAgICAgICAgaHlzdGVyZXNpczsgLy9BIHZhbHVlIHRoYXQgaGVscHMgZGV0ZXJtaW5lIGVkZ2VzIGluIG5vaXN5IGltYWdlcy4KKyAgICBFZGdlUHJvY2VzcyBwcm9jZXNzOyAgICAvL0RldGVybWluZXMgd2hpY2ggZWRnZXMgdGhlIGZ1bmN0aW9uIGxvb2tzIGZvci4KKyAgICBpbnQgICAgICAgICBzdWJwaXhlbDsgICAvL1NldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBmaW5kIGVkZ2VzIHdpdGggc3VicGl4ZWwgYWNjdXJhY3kgYnkgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHBvaW50cyB0byBmaW5kIHRoZSBjcm9zc2luZyBvZiB0aGUgZ2l2ZW4gdGhyZXNob2xkLgorfSBTaW1wbGVFZGdlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgU2VsZWN0UGFydGljbGVDcml0ZXJpYV9zdHJ1Y3QgeworICAgIE1lYXN1cmVtZW50VmFsdWUgcGFyYW1ldGVyOyAvL1RoZSBtb3JwaG9sb2dpY2FsIG1lYXN1cmVtZW50IHRoYXQgdGhlIGZ1bmN0aW9uIHVzZXMgZm9yIGZpbHRlcmluZy4KKyAgICBmbG9hdCAgICAgICAgICAgIGxvd2VyOyAgICAgLy9UaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIGNyaXRlcmlhIHJhbmdlLgorICAgIGZsb2F0ICAgICAgICAgICAgdXBwZXI7ICAgICAvL1RoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgY3JpdGVyaWEgcmFuZ2UuCit9IFNlbGVjdFBhcnRpY2xlQ3JpdGVyaWE7CisKK3R5cGVkZWYgc3RydWN0IFNlZ21lbnRJbmZvX3N0cnVjdCB7CisgICAgaW50ICAgICAgICAgICBudW1iZXJPZlBvaW50czsgLy9UaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgc2VnbWVudC4KKyAgICBpbnQgICAgICAgICAgIGlzT3BlbjsgICAgICAgICAvL0lmIFRSVUUsIHRoZSBjb250b3VyIGlzIG9wZW4uCisgICAgZG91YmxlICAgICAgICB3ZWlnaHQ7ICAgICAgICAgLy9UaGUgc2lnbmlmaWNhbmNlIG9mIHRoZSBlZGdlIGluIHRlcm1zIG9mIHRoZSBncmF5IHZhbHVlcyB0aGF0IGNvbnN0aXR1dGUgdGhlIGVkZ2UuCisgICAgQ29udG91clBvaW50KiBwb2ludHM7ICAgICAgICAgLy9UaGUgcG9pbnRzIG9mIHRoZSBzZWdtZW50LgorfSBTZWdtZW50SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgUm90YXRpb25BbmdsZVJhbmdlX3N0cnVjdCB7CisgICAgZmxvYXQgbG93ZXI7IC8vVGhlIGxvd2VzdCBhbW91bnQgb2Ygcm90YXRpb24sIGluIGRlZ3JlZXMsIGEgdmFsaWQgcGF0dGVybiBjYW4gaGF2ZS4KKyAgICBmbG9hdCB1cHBlcjsgLy9UaGUgaGlnaGVzdCBhbW91bnQgb2Ygcm90YXRpb24sIGluIGRlZ3JlZXMsIGEgdmFsaWQgcGF0dGVybiBjYW4gaGF2ZS4KK30gUm90YXRpb25BbmdsZVJhbmdlOworCit0eXBlZGVmIHN0cnVjdCBSb3RhdGVkUmVjdF9zdHJ1Y3QgeworICAgIGludCAgICB0b3A7ICAgIC8vTG9jYXRpb24gb2YgdGhlIHRvcCBlZGdlIG9mIHRoZSByZWN0YW5nbGUgYmVmb3JlIHJvdGF0aW9uLgorICAgIGludCAgICBsZWZ0OyAgIC8vTG9jYXRpb24gb2YgdGhlIGxlZnQgZWRnZSBvZiB0aGUgcmVjdGFuZ2xlIGJlZm9yZSByb3RhdGlvbi4KKyAgICBpbnQgICAgaGVpZ2h0OyAvL0hlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIGludCAgICB3aWR0aDsgIC8vV2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICBkb3VibGUgYW5nbGU7ICAvL1RoZSByb3RhdGlvbiwgaW4gZGVncmVlcywgb2YgdGhlIHJlY3RhbmdsZS4KK30gUm90YXRlZFJlY3Q7CisKK3R5cGVkZWYgc3RydWN0IFJPSVByb2ZpbGVfc3RydWN0IHsKKyAgICBMaW5lUHJvZmlsZSByZXBvcnQ7IC8vUXVhbnRpZnlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBvaW50cyBhbG9uZyB0aGUgZWRnZSBvZiBlYWNoIGNvbnRvdXIgaW4gdGhlIFJPSS4KKyAgICBQb2ludCogICAgICBwaXhlbHM7IC8vQW4gYXJyYXkgb2YgdGhlIHBvaW50cyBhbG9uZyB0aGUgZWRnZSBvZiBlYWNoIGNvbnRvdXIgaW4gdGhlIFJPSS4KK30gUk9JUHJvZmlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgVG9vbFdpbmRvd09wdGlvbnNfc3RydWN0IHsKKyAgICBpbnQgc2hvd1NlbGVjdGlvblRvb2w7ICAgICAgICAvL0lmIFRSVUUsIHRoZSBzZWxlY3Rpb24gdG9vbCBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dab29tVG9vbDsgICAgICAgICAgICAgLy9JZiBUUlVFLCB0aGUgem9vbSB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgICBpbnQgc2hvd1BvaW50VG9vbDsgICAgICAgICAgICAvL0lmIFRSVUUsIHRoZSBwb2ludCB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgICBpbnQgc2hvd0xpbmVUb29sOyAgICAgICAgICAgICAvL0lmIFRSVUUsIHRoZSBsaW5lIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93UmVjdGFuZ2xlVG9vbDsgICAgICAgIC8vSWYgVFJVRSwgdGhlIHJlY3RhbmdsZSB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgICBpbnQgc2hvd092YWxUb29sOyAgICAgICAgICAgICAvL0lmIFRSVUUsIHRoZSBvdmFsIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93UG9seWdvblRvb2w7ICAgICAgICAgIC8vSWYgVFJVRSwgdGhlIHBvbHlnb24gdG9vbCBiZWNvbWVzIHZpc2libGUuCisgICAgaW50IHNob3dDbG9zZWRGcmVlaGFuZFRvb2w7ICAgLy9JZiBUUlVFLCB0aGUgY2xvc2VkIGZyZWVoYW5kIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93UG9seUxpbmVUb29sOyAgICAgICAgIC8vSWYgVFJVRSwgdGhlIHBvbHlsaW5lIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93RnJlZWhhbmRUb29sOyAgICAgICAgIC8vSWYgVFJVRSwgdGhlIGZyZWVoYW5kIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93QW5udWx1c1Rvb2w7ICAgICAgICAgIC8vSWYgVFJVRSwgdGhlIGFubnVsdXMgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93Um90YXRlZFJlY3RhbmdsZVRvb2w7IC8vSWYgVFJVRSwgdGhlIHJvdGF0ZWQgcmVjdGFuZ2xlIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICAgIGludCBzaG93UGFuVG9vbDsgICAgICAgICAgICAgIC8vSWYgVFJVRSwgdGhlIHBhbiB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgICBpbnQgc2hvd1pvb21PdXRUb29sOyAgICAgICAgICAvL0lmIFRSVUUsIHRoZSB6b29tIG91dCB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgICBpbnQgcmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHNldCB0byBGQUxTRS4KKyAgICBpbnQgcmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHNldCB0byBGQUxTRS4KKyAgICBpbnQgcmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgICAvL1RoaXMgZWxlbWVudCBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHNldCB0byBGQUxTRS4KK30gVG9vbFdpbmRvd09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFNwb2tlT3B0aW9uc19zdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICAgdGhyZXNob2xkOyAgICAgICAgIC8vU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZm9yIHRoZSBjb250cmFzdCBvZiB0aGUgZWRnZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgdGhlIGZ1bmN0aW9uIGF2ZXJhZ2VzIHRvIGZpbmQgdGhlIGNvbnRyYXN0IGF0IGVpdGhlciBzaWRlIG9mIHRoZSBlZGdlLgorICAgIGludCAgICAgICAgICAgICAgICAgc3RlZXBuZXNzOyAgICAgICAgIC8vVGhlIHNwYW4sIGluIHBpeGVscywgb2YgdGhlIHNsb3BlIG9mIHRoZSBlZGdlIHByb2plY3RlZCBhbG9uZyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IHBvaW50cy4KKyAgICBkb3VibGUgICAgICAgICAgICAgIHN1YnNhbXBsaW5nUmF0aW87ICAvL1RoZSBhbmdsZSwgaW4gZGVncmVlcywgYmV0d2VlbiBlYWNoIHJhZGlhbCBzZWFyY2ggbGluZSBpbiB0aGUgc3Bva2UuCisgICAgSW50ZXJwb2xhdGlvbk1ldGhvZCBzdWJwaXhlbFR5cGU7ICAgICAgLy9UaGUgbWV0aG9kIGZvciBpbnRlcnBvbGF0aW5nLgorICAgIGludCAgICAgICAgICAgICAgICAgc3VicGl4ZWxEaXZpc2lvbnM7IC8vVGhlIG51bWJlciBvZiBzYW1wbGVzIHRoZSBmdW5jdGlvbiBvYnRhaW5zIGZyb20gYSBwaXhlbC4KK30gU3Bva2VPcHRpb25zOworCisjaWYgIWRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX01fWDY0CisjcHJhZ21hIHBhY2socG9wKQorI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ2FsbGJhY2sgRnVuY3Rpb24gVHlwZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWZuZGVmIF9fR05VQ19fCit0eXBlZGVmIHZvaWQgKElNQVFfQ0FMTEJBQ0sqIEV2ZW50Q2FsbGJhY2spKFdpbmRvd0V2ZW50VHlwZSBldmVudCwgaW50IHdpbmRvd051bWJlciwgVG9vbCB0b29sLCBSZWN0IHJlY3QpOworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEdsb2JhbHMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBjb25zdF9zZWcoIklNQVFWaXNpb25Db2xvckNvbnN0YW50cyIpCisjZW5kaWYKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9UUkFOU1BBUkVOVCA9IHsgICAwLCAgIDAsICAgMCwgMSB9Oworc3RhdGljIGNvbnN0IFJHQlZhbHVlIElNQVFfUkdCX1JFRCAgICAgICAgID0geyAgIDAsICAgMCwgMjU1LCAwIH07CitzdGF0aWMgY29uc3QgUkdCVmFsdWUgSU1BUV9SR0JfQkxVRSAgICAgICAgPSB7IDI1NSwgICAwLCAgIDAsIDAgfTsKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9HUkVFTiAgICAgICA9IHsgICAwLCAyNTUsICAgMCwgMCB9Oworc3RhdGljIGNvbnN0IFJHQlZhbHVlIElNQVFfUkdCX1lFTExPVyAgICAgID0geyAgIDAsIDI1NSwgMjU1LCAwIH07CitzdGF0aWMgY29uc3QgUkdCVmFsdWUgSU1BUV9SR0JfV0hJVEUgICAgICAgPSB7IDI1NSwgMjU1LCAyNTUsIDAgfTsKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9CTEFDSyAgICAgICA9IHsgICAwLCAgIDAsICAgMCwgMCB9OworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBjb25zdF9zZWcoKQorI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJhY2t3YXJkcyBDb21wYXRpYmlsaXR5CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgQ29sb3JTZW5zaXRpdml0eSAJCUNvbG9yQ29tcGxleGl0eTsKKyNkZWZpbmUgSU1BUV9DT01QTEVYSVRZX0xPVyAJCUlNQVFfU0VOU0lUSVZJVFlfTE9XCisjZGVmaW5lIElNQVFfQ09NUExFWElUWV9NRUQgCQlJTUFRX1NFTlNJVElWSVRZX01FRCAgICAgCisjZGVmaW5lIElNQVFfQ09NUExFWElUWV9ISUdIIAkJSU1BUV9TRU5TSVRJVklUWV9ISUdICisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SQ09NUExFWElUWSAJRVJSX0lOVkFMSURfQ09MT1JTRU5TSVRJVklUWQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBMb2dpY2FsIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQW5kKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUFuZENvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDb21wYXJlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBJbWFnZSogY29tcGFyZUltYWdlLCBDb21wYXJpc29uRnVuY3Rpb24gY29tcGFyZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ29tcGFyZUNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlLCBDb21wYXJpc29uRnVuY3Rpb24gY29tcGFyZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTG9naWNhbERpZmZlcmVuY2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTG9naWNhbERpZmZlcmVuY2VDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTmFuZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFOYW5kQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU5vcihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFOb3JDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxT3IoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxT3JDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxWG5vcihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFYbm9yQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVhvcihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFYb3JDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFBhcnRpY2xlIEFuYWx5c2lzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb3VudFBhcnRpY2xlcyhJbWFnZSogaW1hZ2UsIGludCBjb25uZWN0aXZpdHk4LCBpbnQqIG51bVBhcnRpY2xlcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNZWFzdXJlUGFydGljbGUoSW1hZ2UqIGltYWdlLCBpbnQgcGFydGljbGVOdW1iZXIsIGludCBjYWxpYnJhdGVkLCBNZWFzdXJlbWVudFR5cGUgbWVhc3VyZW1lbnQsIGRvdWJsZSogdmFsdWUpOworSU1BUV9GVU5DIE1lYXN1cmVQYXJ0aWNsZXNSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxTWVhc3VyZVBhcnRpY2xlcyhJbWFnZSogaW1hZ2UsIE1lYXN1cmVQYXJ0aWNsZXNDYWxpYnJhdGlvbk1vZGUgY2FsaWJyYXRpb25Nb2RlLCBjb25zdCBNZWFzdXJlbWVudFR5cGUqIG1lYXN1cmVtZW50cywgc2l6ZV90IG51bU1lYXN1cmVtZW50cyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFQYXJ0aWNsZUZpbHRlcjQoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyKiBjcml0ZXJpYSwgaW50IGNyaXRlcmlhQ291bnQsIGNvbnN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uczIqIG9wdGlvbnMsIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bVBhcnRpY2xlcyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE1vcnBob2xvZ3kgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udmV4SHVsbChJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFEYW5pZWxzc29uRGlzdGFuY2UoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFGaWxsSG9sZXMoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4KTsKK0lNQVFfRlVOQyBDaXJjbGVSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxRmluZENpcmNsZXMoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pblJhZGl1cywgZmxvYXQgbWF4UmFkaXVzLCBpbnQqIG51bUNpcmNsZXMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMYWJlbDIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4LCBpbnQqIHBhcnRpY2xlQ291bnQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCwgY29uc3QgU3RydWN0dXJpbmdFbGVtZW50KiBzdHJ1Y3R1cmluZ0VsZW1lbnQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWplY3RCb3JkZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2VnbWVudGF0aW9uKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2VwYXJhdGlvbihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGVyb3Npb25zLCBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNpbXBsZURpc3RhbmNlKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNpemVGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4LCBpbnQgZXJvc2lvbnMsIFNpemVUeXBlIGtlZXBTaXplLCBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNrZWxldG9uKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBTa2VsZXRvbk1ldGhvZCBtZXRob2QpOworCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEFjcXVpc2l0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgSW1hZ2UqIElNQVFfU1REQ0FMTCBpbWFxQ29weUZyb21SaW5nKFNFU1NJT05fSUQgc2Vzc2lvbklELCBJbWFnZSogaW1hZ2UsIGludCBpbWFnZVRvQ29weSwgaW50KiBpbWFnZU51bWJlciwgUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBJbWFnZSogSU1BUV9TVERDQUxMIGltYXFFYXN5QWNxdWlyZShjb25zdCBjaGFyKiBpbnRlcmZhY2VOYW1lKTsKK0lNQVFfRlVOQyBJbWFnZSogSU1BUV9TVERDQUxMIGltYXFFeHRyYWN0RnJvbVJpbmcoU0VTU0lPTl9JRCBzZXNzaW9uSUQsIGludCBpbWFnZVRvRXh0cmFjdCwgaW50KiBpbWFnZU51bWJlcik7CitJTUFRX0ZVTkMgSW1hZ2UqIElNQVFfU1REQ0FMTCBpbWFxR3JhYihTRVNTSU9OX0lEIHNlc3Npb25JRCwgSW1hZ2UqIGltYWdlLCBpbnQgaW1tZWRpYXRlKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFSZWxlYXNlSW1hZ2UoU0VTU0lPTl9JRCBzZXNzaW9uSUQpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVNldHVwR3JhYihTRVNTSU9OX0lEIHNlc3Npb25JRCwgUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFTZXR1cFJpbmcoU0VTU0lPTl9JRCBzZXNzaW9uSUQsIEltYWdlKiogaW1hZ2VzLCBpbnQgbnVtSW1hZ2VzLCBpbnQgc2tpcENvdW50LCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVNldHVwU2VxdWVuY2UoU0VTU0lPTl9JRCBzZXNzaW9uSUQsIEltYWdlKiogaW1hZ2VzLCBpbnQgbnVtSW1hZ2VzLCBpbnQgc2tpcENvdW50LCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIEltYWdlKiBJTUFRX1NURENBTEwgaW1hcVNuYXAoU0VTU0lPTl9JRCBzZXNzaW9uSUQsIEltYWdlKiBpbWFnZSwgUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFTdGFydEFjcXVpc2l0aW9uKFNFU1NJT05fSUQgc2Vzc2lvbklEKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFTdG9wQWNxdWlzaXRpb24oU0VTU0lPTl9JRCBzZXNzaW9uSUQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBBcml0aG1ldGljIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQWJzb2x1dGVEaWZmZXJlbmNlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUFic29sdXRlRGlmZmVyZW5jZUNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFBZGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQWRkQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUF2ZXJhZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQXZlcmFnZUNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFEaXZpZGUyKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIsIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURpdmlkZUNvbnN0YW50MihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSwgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTWF4KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1heENvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNaW4oSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTWluQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1vZHVsbyhJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNb2R1bG9Db25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTXVsRGl2KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIsIGZsb2F0IHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNdWx0aXBseShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNdWx0aXBseUNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFTdWJ0cmFjdChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFTdWJ0cmFjdENvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ2FsaXBlciBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIENhbGlwZXJSZXBvcnQqICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDYWxpcGVyVG9vbChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsIGNvbnN0IEVkZ2VPcHRpb25zKiBlZGdlT3B0aW9ucywgY29uc3QgQ2FsaXBlck9wdGlvbnMqIGNhbGlwZXJPcHRpb25zLCBpbnQqIG51bUVkZ2VQYWlycyk7CitJTUFRX0ZVTkMgQ29uY2VudHJpY1Jha2VSZXBvcnQyKiBJTUFRX1NURENBTEwgaW1hcUNvbmNlbnRyaWNSYWtlMihJbWFnZSogaW1hZ2UsIFJPSSogcm9pLCBDb25jZW50cmljUmFrZURpcmVjdGlvbiBkaXJlY3Rpb24sIEVkZ2VQcm9jZXNzIHByb2Nlc3MsIGludCBzdGVwU2l6ZSwgRWRnZU9wdGlvbnMyKiBlZGdlT3B0aW9ucyk7CitJTUFRX0ZVTkMgRXh0cmVtZVJlcG9ydCogICAgICAgICBJTUFRX1NURENBTEwgaW1hcURldGVjdEV4dHJlbWVzKGNvbnN0IGRvdWJsZSogcGl4ZWxzLCBpbnQgbnVtUGl4ZWxzLCBEZXRlY3Rpb25Nb2RlIG1vZGUsIGNvbnN0IERldGVjdEV4dHJlbWVzT3B0aW9ucyogb3B0aW9ucywgaW50KiBudW1FeHRyZW1lcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcURldGVjdFJvdGF0aW9uKGNvbnN0IEltYWdlKiByZWZlcmVuY2VJbWFnZSwgY29uc3QgSW1hZ2UqIHRlc3RJbWFnZSwgUG9pbnRGbG9hdCByZWZlcmVuY2VDZW50ZXIsIFBvaW50RmxvYXQgdGVzdENlbnRlciwgaW50IHJhZGl1cywgZmxvYXQgcHJlY2lzaW9uLCBkb3VibGUqIGFuZ2xlKTsKK0lNQVFfRlVOQyBFZGdlUmVwb3J0MiogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRWRnZVRvb2w0KEltYWdlKiBpbWFnZSwgUk9JKiByb2ksIEVkZ2VQcm9jZXNzIHByb2Nlc3NUeXBlLCBFZGdlT3B0aW9uczIqIGVkZ2VPcHRpb25zLCBjb25zdCB1bnNpZ25lZCBpbnQgcmV2ZXJzZURpcmVjdGlvbik7CitJTUFRX0ZVTkMgRmluZEVkZ2VSZXBvcnQqICAgICAgICBJTUFRX1NURENBTEwgaW1hcUZpbmRFZGdlMihJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBiYXNlU3lzdGVtLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBuZXdTeXN0ZW0sIGNvbnN0IEZpbmRFZGdlT3B0aW9uczIqIGZpbmRFZGdlT3B0aW9ucywgY29uc3QgU3RyYWlnaHRFZGdlT3B0aW9ucyogc3RyYWlnaHRFZGdlT3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUZpbmRUcmFuc2Zvcm1SZWN0MihJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBGaW5kVHJhbnNmb3JtTW9kZSBtb2RlLCBDb29yZGluYXRlU3lzdGVtKiBiYXNlU3lzdGVtLCBDb29yZGluYXRlU3lzdGVtKiBuZXdTeXN0ZW0sIGNvbnN0IEZpbmRUcmFuc2Zvcm1SZWN0T3B0aW9uczIqIGZpbmRUcmFuc2Zvcm1PcHRpb25zLCBjb25zdCBTdHJhaWdodEVkZ2VPcHRpb25zKiBzdHJhaWdodEVkZ2VPcHRpb25zLCBBeGlzUmVwb3J0KiBheGlzUmVwb3J0KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRmluZFRyYW5zZm9ybVJlY3RzMihJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcHJpbWFyeVJPSSwgY29uc3QgUk9JKiBzZWNvbmRhcnlST0ksIEZpbmRUcmFuc2Zvcm1Nb2RlIG1vZGUsIENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sIENvb3JkaW5hdGVTeXN0ZW0qIG5ld1N5c3RlbSwgY29uc3QgRmluZFRyYW5zZm9ybVJlY3RzT3B0aW9uczIqIGZpbmRUcmFuc2Zvcm1PcHRpb25zLCBjb25zdCBTdHJhaWdodEVkZ2VPcHRpb25zKiBwcmltYXJ5U3RyYWlnaHRFZGdlT3B0aW9ucywgY29uc3QgU3RyYWlnaHRFZGdlT3B0aW9ucyogc2Vjb25kYXJ5U3RyYWlnaHRFZGdlT3B0aW9ucywgQXhpc1JlcG9ydCogYXhpc1JlcG9ydCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxpbmVHYXVnZVRvb2wyKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCwgTGluZUdhdWdlTWV0aG9kIG1ldGhvZCwgY29uc3QgRWRnZU9wdGlvbnMqIGVkZ2VPcHRpb25zLCBjb25zdCBDb29yZGluYXRlVHJhbnNmb3JtMiogdHJhbnNmb3JtLCBmbG9hdCogZGlzdGFuY2UpOworSU1BUV9GVU5DIFJha2VSZXBvcnQyKiAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSYWtlMihJbWFnZSogaW1hZ2UsIFJPSSogcm9pLCBSYWtlRGlyZWN0aW9uIGRpcmVjdGlvbiwgRWRnZVByb2Nlc3MgcHJvY2VzcywgaW50IHN0ZXBTaXplLCBFZGdlT3B0aW9uczIqIGVkZ2VPcHRpb25zKTsKK0lNQVFfRlVOQyBQb2ludEZsb2F0KiAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2ltcGxlRWRnZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsIGNvbnN0IFNpbXBsZUVkZ2VPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bUVkZ2VzKTsKK0lNQVFfRlVOQyBTcG9rZVJlcG9ydDIqICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU3Bva2UyKEltYWdlKiBpbWFnZSwgUk9JKiByb2ksIFNwb2tlRGlyZWN0aW9uIGRpcmVjdGlvbiwgRWRnZVByb2Nlc3MgcHJvY2VzcywgaW50IHN0ZXBTaXplLCBFZGdlT3B0aW9uczIqIGVkZ2VPcHRpb25zKTsKK0lNQVFfRlVOQyBTdHJhaWdodEVkZ2VSZXBvcnQyKiAgIElNQVFfU1REQ0FMTCBpbWFxU3RyYWlnaHRFZGdlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIFNlYXJjaERpcmVjdGlvbiBzZWFyY2hEaXJlY3Rpb24sIGNvbnN0IEVkZ2VPcHRpb25zMiogZWRnZU9wdGlvbnMsIGNvbnN0IFN0cmFpZ2h0RWRnZU9wdGlvbnMqIHN0cmFpZ2h0RWRnZU9wdGlvbnMpOworSU1BUV9GVU5DIFN0cmFpZ2h0RWRnZVJlcG9ydDIqICAgSU1BUV9TVERDQUxMIGltYXFTdHJhaWdodEVkZ2UyKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIFNlYXJjaERpcmVjdGlvbiBzZWFyY2hEaXJlY3Rpb24sIGNvbnN0IEVkZ2VPcHRpb25zMiogZWRnZU9wdGlvbnMsIGNvbnN0IFN0cmFpZ2h0RWRnZU9wdGlvbnMqIHN0cmFpZ2h0RWRnZU9wdGlvbnMsIHVuc2lnbmVkIGludCBvcHRpbWl6ZWRNb2RlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgU3BhdGlhbCBGaWx0ZXJzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ2FubnlFZGdlRmlsdGVyKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBDYW5ueU9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNvbnZvbHZlMihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgZmxvYXQqIGtlcm5lbCwgaW50IG1hdHJpeFJvd3MsIGludCBtYXRyaXhDb2xzLCBmbG9hdCBub3JtYWxpemUsIEltYWdlKiBtYXNrLCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDb3JyZWxhdGUoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IEltYWdlKiB0ZW1wbGF0ZUltYWdlLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUVkZ2VGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE91dGxpbmVNZXRob2QgbWV0aG9kLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTG93UGFzcyhJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCB0b2xlcmFuY2UsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNZWRpYW5GaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU50aE9yZGVyRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuLCBjb25zdCBJbWFnZSogbWFzayk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIERyYXdpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFEcmF3TGluZU9uSW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIERyYXdNb2RlIG1vZGUsIFBvaW50IHN0YXJ0LCBQb2ludCBlbmQsIGZsb2F0IG5ld1BpeGVsVmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURyYXdTaGFwZU9uSW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFJlY3QgcmVjdCwgRHJhd01vZGUgbW9kZSwgU2hhcGVNb2RlIHNoYXBlLCBmbG9hdCBuZXdQaXhlbFZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFEcmF3VGV4dE9uSW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBvaW50IGNvb3JkLCBjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBEcmF3VGV4dE9wdGlvbnMqIG9wdGlvbnMsIGludCogZm9udE5hbWVVc2VkKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgSW50ZXJsYWNpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFJbnRlcmxhY2VDb21iaW5lKEltYWdlKiBmcmFtZSwgY29uc3QgSW1hZ2UqIG9kZCwgY29uc3QgSW1hZ2UqIGV2ZW4pOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUludGVybGFjZVNlcGFyYXRlKGNvbnN0IEltYWdlKiBmcmFtZSwgSW1hZ2UqIG9kZCwgSW1hZ2UqIGV2ZW4pOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbWFnZSBJbmZvcm1hdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGNoYXIqKiBJTUFRX1NURENBTEwgaW1hcUVudW1lcmF0ZUN1c3RvbUtleXMoY29uc3QgSW1hZ2UqIGltYWdlLCB1bnNpZ25lZCBpbnQqIHNpemUpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUdldEJpdERlcHRoKGNvbnN0IEltYWdlKiBpbWFnZSwgdW5zaWduZWQgaW50KiBiaXREZXB0aCk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Qnl0ZXNQZXJQaXhlbChjb25zdCBJbWFnZSogaW1hZ2UsIGludCogYnl0ZUNvdW50KTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFHZXRJbWFnZUluZm8oY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZUluZm8qIGluZm8pOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUdldEltYWdlU2l6ZShjb25zdCBJbWFnZSogaW1hZ2UsIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFHZXRJbWFnZVR5cGUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZVR5cGUqIHR5cGUpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUdldE1hc2tPZmZzZXQoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCogb2Zmc2V0KTsKK0lNQVFfRlVOQyB2b2lkKiAgSU1BUV9TVERDQUxMIGltYXFHZXRQaXhlbEFkZHJlc3MoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBwaXhlbCk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0VmlzaW9uSW5mb1R5cGVzKGNvbnN0IEltYWdlKiBpbWFnZSwgdW5zaWduZWQgaW50KiBwcmVzZW50KTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFJc0ltYWdlRW1wdHkoY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQqIGVtcHR5KTsKK0lNQVFfRlVOQyB2b2lkKiAgSU1BUV9TVERDQUxMIGltYXFSZWFkQ3VzdG9tRGF0YShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGtleSwgdW5zaWduZWQgaW50KiBzaXplKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFSZW1vdmVDdXN0b21EYXRhKEltYWdlKiBpbWFnZSwgY29uc3QgY2hhcioga2V5KTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFSZW1vdmVWaXNpb25JbmZvMihjb25zdCBJbWFnZSogaW1hZ2UsIHVuc2lnbmVkIGludCBpbmZvKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFTZXRCaXREZXB0aChJbWFnZSogaW1hZ2UsIHVuc2lnbmVkIGludCBiaXREZXB0aCk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0SW1hZ2VTaXplKEltYWdlKiBpbWFnZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFTZXRNYXNrT2Zmc2V0KEltYWdlKiBpbWFnZSwgUG9pbnQgb2Zmc2V0KTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFXcml0ZUN1c3RvbURhdGEoSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRGlzcGxheSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxQXJlVG9vbHNDb250ZXh0U2Vuc2l0aXZlKGludCogc2Vuc2l0aXZlKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUNsb3NlV2luZG93KGludCB3aW5kb3dOdW1iZXIpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxRGlzcGxheUltYWdlKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IHdpbmRvd051bWJlciwgaW50IHJlc2l6ZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRMYXN0S2V5KGNoYXIqIGtleVByZXNzZWQsIGludCogd2luZG93TnVtYmVyLCBpbnQqIG1vZGlmaWVycyk7CitJTUFRX0ZVTkMgdm9pZCogSU1BUV9TVERDQUxMIGltYXFHZXRTeXN0ZW1XaW5kb3dIYW5kbGUoaW50IHdpbmRvd051bWJlcik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dDZW50ZXJQb3MoaW50IHdpbmRvd051bWJlciwgUG9pbnQqIGNlbnRlclBvc2l0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFRvb2xDb250ZXh0U2Vuc2l0aXZpdHkoaW50IHNlbnNpdGl2ZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTaG93V2luZG93KGludCB3aW5kb3dOdW1iZXIsIGludCB2aXNpYmxlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgSW1hZ2UgTWFuaXB1bGF0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFDYXN0KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBJbWFnZVR5cGUgdHlwZSwgY29uc3QgZmxvYXQqIGxvb2t1cCwgaW50IHNoaWZ0KTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUNvcHlSZWN0KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBSZWN0IHJlY3QsIFBvaW50IGRlc3RMb2MpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxRHVwbGljYXRlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyB2b2lkKiBJTUFRX1NURENBTEwgaW1hcUZsYXR0ZW4oY29uc3QgSW1hZ2UqIGltYWdlLCBGbGF0dGVuVHlwZSB0eXBlLCBDb21wcmVzc2lvblR5cGUgY29tcHJlc3Npb24sIGludCBxdWFsaXR5LCB1bnNpZ25lZCBpbnQqIHNpemUpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxRmxpcChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgRmxpcEF4aXMgYXhpcyk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFNYXNrKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFSZXNhbXBsZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IG5ld1dpZHRoLCBpbnQgbmV3SGVpZ2h0LCBJbnRlcnBvbGF0aW9uTWV0aG9kIG1ldGhvZCwgUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVJvdGF0ZTIoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IGFuZ2xlLCBQaXhlbFZhbHVlIGZpbGwsIEludGVycG9sYXRpb25NZXRob2QgbWV0aG9kLCBpbnQgbWFpbnRhaW5TaXplKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNjYWxlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgeFNjYWxlLCBpbnQgeVNjYWxlLCBTY2FsaW5nTW9kZSBzY2FsZU1vZGUsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTaGlmdChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHNoaWZ0WCwgaW50IHNoaWZ0WSwgUGl4ZWxWYWx1ZSBmaWxsKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVRyYW5zcG9zZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFVbmZsYXR0ZW4oSW1hZ2UqIGltYWdlLCBjb25zdCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFVbndyYXBJbWFnZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgQW5udWx1cyBhbm51bHVzLCBSZWN0T3JpZW50YXRpb24gb3JpZW50YXRpb24sIEludGVycG9sYXRpb25NZXRob2QgbWV0aG9kKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVZpZXczRChJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgVmlldzNET3B0aW9ucyogb3B0aW9ucyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEZpbGUgSS9PIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDbG9zZUFWSShBVklTZXNzaW9uIHNlc3Npb24pOworSU1BUV9GVU5DIEFWSVNlc3Npb24gIElNQVFfU1REQ0FMTCBpbWFxQ3JlYXRlQVZJKGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBjb25zdCBjaGFyKiBjb21wcmVzc2lvbkZpbHRlciwgaW50IHF1YWxpdHksIHVuc2lnbmVkIGludCBmcmFtZXNQZXJTZWNvbmQsIHVuc2lnbmVkIGludCBtYXhEYXRhU2l6ZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRBVklJbmZvKEFWSVNlc3Npb24gc2Vzc2lvbiwgQVZJSW5mbyogaW5mbyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRGaWxlSW5mbyhjb25zdCBjaGFyKiBmaWxlTmFtZSwgQ2FsaWJyYXRpb25Vbml0KiBjYWxpYnJhdGlvblVuaXQsIGZsb2F0KiBjYWxpYnJhdGlvblgsIGZsb2F0KiBjYWxpYnJhdGlvblksIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBJbWFnZVR5cGUqIGltYWdlVHlwZSk7CitJTUFRX0ZVTkMgRmlsdGVyTmFtZSogSU1BUV9TVERDQUxMIGltYXFHZXRGaWx0ZXJOYW1lcyhpbnQqIG51bUZpbHRlcnMpOworSU1BUV9GVU5DIGNoYXIqKiAgICAgIElNQVFfU1REQ0FMTCBpbWFxTG9hZEltYWdlUG9wdXAoY29uc3QgY2hhciogZGVmYXVsdERpcmVjdG9yeSwgY29uc3QgY2hhciogZGVmYXVsdEZpbGVTcGVjLCBjb25zdCBjaGFyKiBmaWxlVHlwZUxpc3QsIGNvbnN0IGNoYXIqIHRpdGxlLCBpbnQgYWxsb3dNdWx0aXBsZVBhdGhzLCBCdXR0b25MYWJlbCBidXR0b25MYWJlbCwgaW50IHJlc3RyaWN0RGlyZWN0b3J5LCBpbnQgcmVzdHJpY3RFeHRlbnNpb24sIGludCBhbGxvd0NhbmNlbCwgaW50IGFsbG93TWFrZURpcmVjdG9yeSwgaW50KiBjYW5jZWxsZWQsIGludCogbnVtUGF0aHMpOworSU1BUV9GVU5DIEFWSVNlc3Npb24gIElNQVFfU1REQ0FMTCBpbWFxT3BlbkFWSShjb25zdCBjaGFyKiBmaWxlTmFtZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkQVZJRnJhbWUoSW1hZ2UqIGltYWdlLCBBVklTZXNzaW9uIHNlc3Npb24sIHVuc2lnbmVkIGludCBmcmFtZU51bSwgdm9pZCogZGF0YSwgdW5zaWduZWQgaW50KiBkYXRhU2l6ZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkRmlsZShJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBSR0JWYWx1ZSogY29sb3JUYWJsZSwgaW50KiBudW1Db2xvcnMpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVhZFZpc2lvbkZpbGUoSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgUkdCVmFsdWUqIGNvbG9yVGFibGUsIGludCogbnVtQ29sb3JzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlQVZJRnJhbWUoSW1hZ2UqIGltYWdlLCBBVklTZXNzaW9uIHNlc3Npb24sIGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGludCBkYXRhTGVuZ3RoKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlQk1QRmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBpbnQgY29tcHJlc3MsIGNvbnN0IFJHQlZhbHVlKiBjb2xvclRhYmxlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlRmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBjb25zdCBSR0JWYWx1ZSogY29sb3JUYWJsZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFXcml0ZUpQRUdGaWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIHVuc2lnbmVkIGludCBxdWFsaXR5LCB2b2lkKiBjb2xvclRhYmxlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlSlBFRzIwMDBGaWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBsb3NzbGVzcywgZmxvYXQgY29tcHJlc3Npb25SYXRpbywgY29uc3QgSlBFRzIwMDBGaWxlQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE9wdGlvbnMsIGNvbnN0IFJHQlZhbHVlKiBjb2xvclRhYmxlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlUE5HRmlsZTIoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgdW5zaWduZWQgaW50IGNvbXByZXNzaW9uU3BlZWQsIGNvbnN0IFJHQlZhbHVlKiBjb2xvclRhYmxlLCBpbnQgdXNlQml0RGVwdGgpOworSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVUSUZGRmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBjb25zdCBUSUZGRmlsZU9wdGlvbnMqIG9wdGlvbnMsIGNvbnN0IFJHQlZhbHVlKiBjb2xvclRhYmxlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlVmlzaW9uRmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBjb25zdCBSR0JWYWx1ZSogY29sb3JUYWJsZSk7CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQW5hbHl0aWMgR2VvbWV0cnkgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQnVpbGRDb29yZGluYXRlU3lzdGVtKGNvbnN0IFBvaW50KiBwb2ludHMsIFJlZmVyZW5jZU1vZGUgbW9kZSwgQXhpc09yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBDb29yZGluYXRlU3lzdGVtKiBzeXN0ZW0pOworSU1BUV9GVU5DIEJlc3RDaXJjbGUyKiAgSU1BUV9TVERDQUxMIGltYXFGaXRDaXJjbGUyKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bVBvaW50cywgY29uc3QgRml0Q2lyY2xlT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgQmVzdEVsbGlwc2UyKiBJTUFRX1NURENBTEwgaW1hcUZpdEVsbGlwc2UyKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bVBvaW50cywgY29uc3QgRml0RWxsaXBzZU9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIEJlc3RMaW5lKiAgICAgSU1BUV9TVERDQUxMIGltYXFGaXRMaW5lKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bVBvaW50cywgY29uc3QgRml0TGluZU9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRBbmdsZShQb2ludEZsb2F0IHN0YXJ0MSwgUG9pbnRGbG9hdCBlbmQxLCBQb2ludEZsb2F0IHN0YXJ0MiwgUG9pbnRGbG9hdCBlbmQyLCBmbG9hdCogYW5nbGUpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRCaXNlY3RpbmdMaW5lKFBvaW50RmxvYXQgc3RhcnQxLCBQb2ludEZsb2F0IGVuZDEsIFBvaW50RmxvYXQgc3RhcnQyLCBQb2ludEZsb2F0IGVuZDIsIFBvaW50RmxvYXQqIGJpc2VjdFN0YXJ0LCBQb2ludEZsb2F0KiBiaXNlY3RFbmQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXREaXN0YW5jZShQb2ludEZsb2F0IHBvaW50MSwgUG9pbnRGbG9hdCBwb2ludDIsIGZsb2F0KiBkaXN0YW5jZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldEludGVyc2VjdGlvbihQb2ludEZsb2F0IHN0YXJ0MSwgUG9pbnRGbG9hdCBlbmQxLCBQb2ludEZsb2F0IHN0YXJ0MiwgUG9pbnRGbG9hdCBlbmQyLCBQb2ludEZsb2F0KiBpbnRlcnNlY3Rpb24pOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRNaWRMaW5lKFBvaW50RmxvYXQgcmVmTGluZVN0YXJ0LCBQb2ludEZsb2F0IHJlZkxpbmVFbmQsIFBvaW50RmxvYXQgcG9pbnQsIFBvaW50RmxvYXQqIG1pZExpbmVTdGFydCwgUG9pbnRGbG9hdCogbWlkTGluZUVuZCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldFBlcnBlbmRpY3VsYXJMaW5lKFBvaW50RmxvYXQgcmVmTGluZVN0YXJ0LCBQb2ludEZsb2F0IHJlZkxpbmVFbmQsIFBvaW50RmxvYXQgcG9pbnQsIFBvaW50RmxvYXQqIHBlcnBMaW5lU3RhcnQsIFBvaW50RmxvYXQqIHBlcnBMaW5lRW5kLCBkb3VibGUqIGRpc3RhbmNlKTsKK0lNQVFfRlVOQyBTZWdtZW50SW5mbyogIElNQVFfU1REQ0FMTCBpbWFxR2V0UG9pbnRzT25Db250b3VyKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50KiBudW1TZWdtZW50cyk7CitJTUFRX0ZVTkMgUG9pbnQqICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldFBvaW50c09uTGluZShQb2ludCBzdGFydCwgUG9pbnQgZW5kLCBpbnQqIG51bVBvaW50cyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldFBvbHlnb25BcmVhKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bVBvaW50cywgZmxvYXQqIGFyZWEpOworSU1BUV9GVU5DIGZsb2F0KiAgICAgICAgSU1BUV9TVERDQUxMIGltYXFJbnRlcnBvbGF0ZVBvaW50cyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsIEludGVycG9sYXRpb25NZXRob2QgbWV0aG9kLCBpbnQgc3VicGl4ZWwsIGludCogaW50ZXJwQ291bnQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDbGlwYm9hcmQgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDbGlwYm9hcmRUb0ltYWdlKEltYWdlKiBkZXN0LCBSR0JWYWx1ZSogcGFsZXR0ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxSW1hZ2VUb0NsaXBib2FyZChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJHQlZhbHVlKiBwYWxldHRlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQm9yZGVyIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRmlsbEJvcmRlcihJbWFnZSogaW1hZ2UsIEJvcmRlck1ldGhvZCBtZXRob2QpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldEJvcmRlclNpemUoY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQqIGJvcmRlclNpemUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldEJvcmRlclNpemUoSW1hZ2UqIGltYWdlLCBpbnQgc2l6ZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEltYWdlIE1hbmFnZW1lbnQgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFBcnJheVRvSW1hZ2UoSW1hZ2UqIGltYWdlLCBjb25zdCB2b2lkKiBhcnJheSwgaW50IG51bUNvbHMsIGludCBudW1Sb3dzKTsKK0lNQVFfRlVOQyBJbWFnZSogSU1BUV9TVERDQUxMIGltYXFDcmVhdGVJbWFnZShJbWFnZVR5cGUgdHlwZSwgaW50IGJvcmRlclNpemUpOworSU1BUV9GVU5DIHZvaWQqICBJTUFRX1NURENBTEwgaW1hcUltYWdlVG9BcnJheShjb25zdCBJbWFnZSogaW1hZ2UsIFJlY3QgcmVjdCwgaW50KiBjb2x1bW5zLCBpbnQqIHJvd3MpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDb2xvciBQcm9jZXNzaW5nIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgQ29sb3IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNoYW5nZUNvbG9yU3BhY2UyKGNvbnN0IENvbG9yMiogc291cmNlQ29sb3IsIENvbG9yTW9kZSBzb3VyY2VTcGFjZSwgQ29sb3JNb2RlIGRlc3RTcGFjZSwgZG91YmxlIG9mZnNldCwgY29uc3QgQ0lFWFlaVmFsdWUqIHdoaXRlUmVmZXJlbmNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29sb3JCQ0dUcmFuc2Zvcm0oSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IEJDR09wdGlvbnMqIHJlZE9wdGlvbnMsIGNvbnN0IEJDR09wdGlvbnMqIGdyZWVuT3B0aW9ucywgY29uc3QgQkNHT3B0aW9ucyogYmx1ZU9wdGlvbnMsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbG9yRXF1YWxpemF0aW9uKTsKK0lNQVFfRlVOQyBDb2xvckhpc3RvZ3JhbVJlcG9ydCogICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29sb3JIaXN0b2dyYW0yKEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIENvbG9yTW9kZSBtb2RlLCBjb25zdCBDSUVYWVpWYWx1ZSogd2hpdGVSZWZlcmVuY2UsIEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29sb3JMb29rdXAoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbG9yTW9kZSBtb2RlLCBjb25zdCBJbWFnZSogbWFzaywgY29uc3Qgc2hvcnQqIHBsYW5lMSwgY29uc3Qgc2hvcnQqIHBsYW5lMiwgY29uc3Qgc2hvcnQqIHBsYW5lMyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbG9yVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgcmVwbGFjZVZhbHVlLCBDb2xvck1vZGUgbW9kZSwgY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSk7CitJTUFRX0ZVTkMgU3VwZXJ2aXNlZENvbG9yU2VnbWVudGF0aW9uUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcVN1cGVydmlzZWRDb2xvclNlZ21lbnRhdGlvbihDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgSW1hZ2UqIGxhYmVsSW1hZ2UsIGNvbnN0IEltYWdlKiBzcmNJbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IFJPSUxhYmVsKiBsYWJlbEluLCB1bnNpZ25lZCBpbnQgbnVtTGFiZWxJbiwgaW50IG1heERpc3RhbmNlLCBpbnQgbWluSWRlbnRpZmljYXRpb25TY29yZSwgY29uc3QgQ29sb3JTZWdtZW5hdGlvbk9wdGlvbnMqIHNlZ21lbnRPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q29sb3JTZWdtZW50YXRpb25NYXhEaXN0YW5jZShDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgQ29sb3JTZWdtZW5hdGlvbk9wdGlvbnMqIHNlZ21lbnRPcHRpb25zLCBTZWdtZW50YXRpb25EaXN0YW5jZUxldmVsIGRpc3RMZXZlbCwgaW50KiBtYXhEaXN0YW5jZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFRyYW5zZm9ybSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUJDR1RyYW5zZm9ybShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgQkNHT3B0aW9ucyogb3B0aW9ucywgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUVxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUludmVyc2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNYXRoVHJhbnNmb3JtKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBNYXRoVHJhbnNmb3JtTWV0aG9kIG1ldGhvZCwgZmxvYXQgcmFuZ2VNaW4sIGZsb2F0IHJhbmdlTWF4LCBmbG9hdCBwb3dlciwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVdhdGVyc2hlZFRyYW5zZm9ybShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgsIGludCogem9uZUNvdW50KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFMb29rdXAyKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBpbnQqIHRhYmxlLCBjb25zdCBJbWFnZSogbWFzayk7CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgV2luZG93IE1hbmFnZW1lbnQgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUFyZVNjcm9sbGJhcnNWaXNpYmxlKGludCB3aW5kb3dOdW1iZXIsIGludCogdmlzaWJsZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFCcmluZ1dpbmRvd1RvVG9wKGludCB3aW5kb3dOdW1iZXIpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxR2V0TW91c2VQb3MoUG9pbnQqIHBvc2l0aW9uLCBpbnQqIHdpbmRvd051bWJlcik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dCYWNrZ3JvdW5kKGludCB3aW5kb3dOdW1iZXIsIFdpbmRvd0JhY2tncm91bmRGaWxsU3R5bGUqIGZpbGxTdHlsZSwgV2luZG93QmFja2dyb3VuZEhhdGNoU3R5bGUqIGhhdGNoU3R5bGUsIFJHQlZhbHVlKiBmaWxsQ29sb3IsIFJHQlZhbHVlKiBiYWNrZ3JvdW5kQ29sb3IpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxR2V0V2luZG93RGlzcGxheU1hcHBpbmcoaW50IHdpbmRvd051bSwgRGlzcGxheU1hcHBpbmcqIG1hcHBpbmcpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxR2V0V2luZG93R3JpZChpbnQgd2luZG93TnVtYmVyLCBpbnQqIHhSZXNvbHV0aW9uLCBpbnQqIHlSZXNvbHV0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd0hhbmRsZShpbnQqIGhhbmRsZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dQb3MoaW50IHdpbmRvd051bWJlciwgUG9pbnQqIHBvc2l0aW9uKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd1NpemUoaW50IHdpbmRvd051bWJlciwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworSU1BUV9GVU5DIGNoYXIqIElNQVFfU1REQ0FMTCBpbWFxR2V0V2luZG93VGl0bGUoaW50IHdpbmRvd051bWJlcik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dab29tMihpbnQgd2luZG93TnVtYmVyLCBmbG9hdCogeFpvb20sIGZsb2F0KiB5Wm9vbSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFJc1dpbmRvd05vblRlYXJpbmcoaW50IHdpbmRvd051bWJlciwgaW50KiBub25UZWFyaW5nKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUlzV2luZG93VmlzaWJsZShpbnQgd2luZG93TnVtYmVyLCBpbnQqIHZpc2libGUpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxTW92ZVdpbmRvdyhpbnQgd2luZG93TnVtYmVyLCBQb2ludCBwb3NpdGlvbik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTZXR1cFdpbmRvdyhpbnQgd2luZG93TnVtYmVyLCBpbnQgY29uZmlndXJhdGlvbik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTZXRXaW5kb3dCYWNrZ3JvdW5kKGludCB3aW5kb3dOdW1iZXIsIFdpbmRvd0JhY2tncm91bmRGaWxsU3R5bGUgZmlsbFN0eWxlLCBXaW5kb3dCYWNrZ3JvdW5kSGF0Y2hTdHlsZSBoYXRjaFN0eWxlLCBjb25zdCBSR0JWYWx1ZSogZmlsbENvbG9yLCBjb25zdCBSR0JWYWx1ZSogYmFja2dyb3VuZENvbG9yKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd0Rpc3BsYXlNYXBwaW5nKGludCB3aW5kb3dOdW1iZXIsIGNvbnN0IERpc3BsYXlNYXBwaW5nKiBtYXBwaW5nKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd0dyaWQoaW50IHdpbmRvd051bWJlciwgaW50IHhSZXNvbHV0aW9uLCBpbnQgeVJlc29sdXRpb24pOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93TWF4Q29udG91ckNvdW50KGludCB3aW5kb3dOdW1iZXIsIHVuc2lnbmVkIGludCBtYXhDb250b3VyQ291bnQpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0V2luZG93Tm9uVGVhcmluZyhpbnQgd2luZG93TnVtYmVyLCBpbnQgbm9uVGVhcmluZyk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTZXRXaW5kb3dQYWxldHRlKGludCB3aW5kb3dOdW1iZXIsIFBhbGV0dGVUeXBlIHR5cGUsIGNvbnN0IFJHQlZhbHVlKiBwYWxldHRlLCBpbnQgbnVtQ29sb3JzKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd1NpemUoaW50IHdpbmRvd051bWJlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd1RocmVhZFBvbGljeShXaW5kb3dUaHJlYWRQb2xpY3kgcG9saWN5KTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd1RpdGxlKGludCB3aW5kb3dOdW1iZXIsIGNvbnN0IGNoYXIqIHRpdGxlKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd1pvb21Ub0ZpdChpbnQgd2luZG93TnVtYmVyLCBpbnQgem9vbVRvRml0KTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNob3dTY3JvbGxiYXJzKGludCB3aW5kb3dOdW1iZXIsIGludCB2aXNpYmxlKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVpvb21XaW5kb3cyKGludCB3aW5kb3dOdW1iZXIsIGZsb2F0IHhab29tLCBmbG9hdCB5Wm9vbSwgUG9pbnQgY2VudGVyKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgVXRpbGl0aWVzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgY29uc3QgZmxvYXQqIElNQVFfU1REQ0FMTCBpbWFxR2V0S2VybmVsKEtlcm5lbEZhbWlseSBmYW1pbHksIGludCBzaXplLCBpbnQgbnVtYmVyKTsKK0lNQVFfRlVOQyBBbm51bHVzICAgICAgSU1BUV9TVERDQUxMIGltYXFNYWtlQW5udWx1cyhQb2ludCBjZW50ZXIsIGludCBpbm5lclJhZGl1cywgaW50IG91dGVyUmFkaXVzLCBkb3VibGUgc3RhcnRBbmdsZSwgZG91YmxlIGVuZEFuZ2xlKTsKK0lNQVFfRlVOQyBQb2ludCAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNYWtlUG9pbnQoaW50IHhDb29yZGluYXRlLCBpbnQgeUNvb3JkaW5hdGUpOworSU1BUV9GVU5DIFBvaW50RmxvYXQgICBJTUFRX1NURENBTEwgaW1hcU1ha2VQb2ludEZsb2F0KGZsb2F0IHhDb29yZGluYXRlLCBmbG9hdCB5Q29vcmRpbmF0ZSk7CitJTUFRX0ZVTkMgUmVjdCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTWFrZVJlY3QoaW50IHRvcCwgaW50IGxlZnQsIGludCBoZWlnaHQsIGludCB3aWR0aCk7CitJTUFRX0ZVTkMgUmVjdCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTWFrZVJlY3RGcm9tUm90YXRlZFJlY3QoUm90YXRlZFJlY3Qgcm90YXRlZFJlY3QpOworSU1BUV9GVU5DIFJvdGF0ZWRSZWN0ICBJTUFRX1NURENBTEwgaW1hcU1ha2VSb3RhdGVkUmVjdChpbnQgdG9wLCBpbnQgbGVmdCwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBkb3VibGUgYW5nbGUpOworSU1BUV9GVU5DIFJvdGF0ZWRSZWN0ICBJTUFRX1NURENBTEwgaW1hcU1ha2VSb3RhdGVkUmVjdEZyb21SZWN0KFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTXVsdGljb3JlT3B0aW9ucyhNdWx0aWNvcmVPcGVyYXRpb24gb3BlcmF0aW9uLCB1bnNpZ25lZCBpbnQqIGN1c3RvbU51bUNvcmVzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgVG9vbCBXaW5kb3cgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUNsb3NlVG9vbFdpbmRvdyh2b2lkKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldEN1cnJlbnRUb29sKFRvb2wqIGN1cnJlbnRUb29sKTsKK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcUdldExhc3RFdmVudChXaW5kb3dFdmVudFR5cGUqIHR5cGUsIGludCogd2luZG93TnVtYmVyLCBUb29sKiB0b29sLCBSZWN0KiByZWN0KTsKK0lNQVFfRlVOQyB2b2lkKiBJTUFRX1NURENBTEwgaW1hcUdldFRvb2xXaW5kb3dIYW5kbGUodm9pZCk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFHZXRUb29sV2luZG93UG9zKFBvaW50KiBwb3NpdGlvbik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFJc1Rvb2xXaW5kb3dWaXNpYmxlKGludCogdmlzaWJsZSk7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFNb3ZlVG9vbFdpbmRvdyhQb2ludCBwb3NpdGlvbik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTZXRDdXJyZW50VG9vbChUb29sIGN1cnJlbnRUb29sKTsKKyNpZm5kZWYgX19HTlVDX18KK0lNQVFfRlVOQyBpbnQgICBJTUFRX1NURENBTEwgaW1hcVNldEV2ZW50Q2FsbGJhY2soRXZlbnRDYWxsYmFjayBjYWxsYmFjaywgaW50IHN5bmNocm9ub3VzKTsKKyNlbmRpZgorSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2V0VG9vbENvbG9yKGNvbnN0IFJHQlZhbHVlKiBjb2xvcik7CitJTUFRX0ZVTkMgaW50ICAgSU1BUV9TVERDQUxMIGltYXFTZXR1cFRvb2xXaW5kb3coaW50IHNob3dDb29yZGluYXRlcywgaW50IG1heEljb25zUGVyTGluZSwgY29uc3QgVG9vbFdpbmRvd09wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCAgIElNQVFfU1REQ0FMTCBpbWFxU2hvd1Rvb2xXaW5kb3coaW50IHZpc2libGUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNZXRlciBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIE1ldGVyQXJjKiBJTUFRX1NURENBTEwgaW1hcUdldE1ldGVyQXJjKGludCBsaWdodE5lZWRsZSwgTWV0ZXJBcmNNb2RlIG1vZGUsIGNvbnN0IFJPSSogcm9pLCBQb2ludEZsb2F0IGJhc2UsIFBvaW50RmxvYXQgc3RhcnQsIFBvaW50RmxvYXQgZW5kKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkTWV0ZXIoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBNZXRlckFyYyogYXJjSW5mbywgZG91YmxlKiBwZXJjZW50YWdlLCBQb2ludEZsb2F0KiBlbmRPZk5lZWRsZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENhbGlicmF0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb3B5Q2FsaWJyYXRpb25JbmZvMihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgUG9pbnQgb2Zmc2V0KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvcnJlY3RDYWxpYnJhdGVkSW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgZmlsbCwgSW50ZXJwb2xhdGlvbk1ldGhvZCBtZXRob2QsIGNvbnN0IFJPSSogcm9pKTsKK0lNQVFfRlVOQyBDYWxpYnJhdGlvbkluZm8qICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldENhbGlicmF0aW9uSW5mbzIoY29uc3QgSW1hZ2UqIGltYWdlKTsKK0lNQVFfRlVOQyBDYWxpYnJhdGlvbkluZm8qICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldENhbGlicmF0aW9uSW5mbzMoSW1hZ2UqIGltYWdlLCB1bnNpZ25lZCBpbnQgaXNHZXRFcnJvck1hcCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMZWFybkNhbGlicmF0aW9uR3JpZChJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBMZWFybkNhbGlicmF0aW9uT3B0aW9ucyogb3B0aW9ucywgY29uc3QgR3JpZERlc2NyaXB0b3IqIGdyaWQsIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIHN5c3RlbSwgY29uc3QgUmFuZ2VGbG9hdCogcmFuZ2UsIGZsb2F0KiBxdWFsaXR5KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxlYXJuQ2FsaWJyYXRpb25Qb2ludHMoSW1hZ2UqIGltYWdlLCBjb25zdCBDYWxpYnJhdGlvblBvaW50cyogcG9pbnRzLCBjb25zdCBST0kqIHJvaSwgY29uc3QgTGVhcm5DYWxpYnJhdGlvbk9wdGlvbnMqIG9wdGlvbnMsIGNvbnN0IEdyaWREZXNjcmlwdG9yKiBncmlkLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBzeXN0ZW0sIGZsb2F0KiBxdWFsaXR5KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldENvb3JkaW5hdGVTeXN0ZW0oSW1hZ2UqIGltYWdlLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBzeXN0ZW0pOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0U2ltcGxlQ2FsaWJyYXRpb24oSW1hZ2UqIGltYWdlLCBTY2FsaW5nTWV0aG9kIG1ldGhvZCwgaW50IGxlYXJuVGFibGUsIGNvbnN0IEdyaWREZXNjcmlwdG9yKiBncmlkLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBzeXN0ZW0pOworSU1BUV9GVU5DIFRyYW5zZm9ybVJlcG9ydCogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxVHJhbnNmb3JtUGl4ZWxUb1JlYWxXb3JsZChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50RmxvYXQqIHBpeGVsQ29vcmRpbmF0ZXMsIGludCBudW1Db29yZGluYXRlcyk7CitJTUFRX0ZVTkMgVHJhbnNmb3JtUmVwb3J0KiAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFUcmFuc2Zvcm1SZWFsV29ybGRUb1BpeGVsKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnRGbG9hdCogcmVhbFdvcmxkQ29vcmRpbmF0ZXMsIGludCBudW1Db29yZGluYXRlcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZXRTaW1wbGVDYWxpYnJhdGlvbjIoSW1hZ2UqIGltYWdlLCBjb25zdCBHcmlkRGVzY3JpcHRvciogZ3JpZERlc2NyaXB0b3IpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ2FsaWJyYXRpb25TZXRBeGlzSW5mbyhJbWFnZSogaW1hZ2UsIENvb3JkaW5hdGVTeXN0ZW0qIGF4aXNJbmZvKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNhbGlicmF0aW9uR2V0VGh1bWJuYWlsSW1hZ2UoSW1hZ2UqIHRlbXBsYXRlSW1hZ2UsIEltYWdlKiBpbWFnZSwgQ2FsaWJyYXRpb25UaHVtYm5haWxUeXBlIHR5cGUsIHVuc2lnbmVkIGludCBpbmRleCk7CitJTUFRX0ZVTkMgR2V0Q2FsaWJyYXRpb25JbmZvUmVwb3J0KiAgSU1BUV9TVERDQUxMIGltYXFDYWxpYnJhdGlvbkdldENhbGlicmF0aW9uSW5mbyhJbWFnZSogaW1hZ2UsIHVuc2lnbmVkIGludCBpc0dldEVycm9yTWFwKTsKK0lNQVFfRlVOQyBHZXRDYW1lcmFQYXJhbWV0ZXJzUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcUNhbGlicmF0aW9uR2V0Q2FtZXJhUGFyYW1ldGVycyhJbWFnZSogdGVtcGxhdGVJbWFnZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDYWxpYnJhdGlvbkNvbXBhY3RJbmZvcm1hdGlvbihJbWFnZSogaW1hZ2UpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBQaXhlbCBNYW5pcHVsYXRpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFBcnJheVRvQ29tcGxleFBsYW5lKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBmbG9hdCogbmV3UGl4ZWxzLCBDb21wbGV4UGxhbmUgcGxhbmUpOworSU1BUV9GVU5DIGZsb2F0KiBJTUFRX1NURENBTEwgaW1hcUNvbXBsZXhQbGFuZVRvQXJyYXkoY29uc3QgSW1hZ2UqIGltYWdlLCBDb21wbGV4UGxhbmUgcGxhbmUsIFJlY3QgcmVjdCwgaW50KiByb3dzLCBpbnQqIGNvbHVtbnMpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUV4dHJhY3RDb2xvclBsYW5lcyhjb25zdCBJbWFnZSogaW1hZ2UsIENvbG9yTW9kZSBtb2RlLCBJbWFnZSogcGxhbmUxLCBJbWFnZSogcGxhbmUyLCBJbWFnZSogcGxhbmUzKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFFeHRyYWN0Q29tcGxleFBsYW5lKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBDb21wbGV4UGxhbmUgcGxhbmUpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUZpbGxJbWFnZShJbWFnZSogaW1hZ2UsIFBpeGVsVmFsdWUgdmFsdWUsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyB2b2lkKiAgSU1BUV9TVERDQUxMIGltYXFHZXRMaW5lKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCwgaW50KiBudW1Qb2ludHMpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcUdldFBpeGVsKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgcGl4ZWwsIFBpeGVsVmFsdWUqIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFSZXBsYWNlQ29sb3JQbGFuZXMoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbG9yTW9kZSBtb2RlLCBjb25zdCBJbWFnZSogcGxhbmUxLCBjb25zdCBJbWFnZSogcGxhbmUyLCBjb25zdCBJbWFnZSogcGxhbmUzKTsKK0lNQVFfRlVOQyBpbnQgICAgSU1BUV9TVERDQUxMIGltYXFSZXBsYWNlQ29tcGxleFBsYW5lKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBJbWFnZSogbmV3VmFsdWVzLCBDb21wbGV4UGxhbmUgcGxhbmUpOworSU1BUV9GVU5DIGludCAgICBJTUFRX1NURENBTEwgaW1hcVNldExpbmUoSW1hZ2UqIGltYWdlLCBjb25zdCB2b2lkKiBhcnJheSwgaW50IGFycmF5U2l6ZSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCk7CitJTUFRX0ZVTkMgaW50ICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0UGl4ZWwoSW1hZ2UqIGltYWdlLCBQb2ludCBjb29yZCwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENvbG9yIE1hdGNoaW5nIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgQ29sb3JJbmZvcm1hdGlvbiogSU1BUV9TVERDQUxMIGltYXFMZWFybkNvbG9yKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIENvbG9yU2Vuc2l0aXZpdHkgc2Vuc2l0aXZpdHksIGludCBzYXR1cmF0aW9uKTsKK0lNQVFfRlVOQyBpbnQqICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1hdGNoQ29sb3IoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBDb2xvckluZm9ybWF0aW9uKiBpbmZvLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1TY29yZXMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBGcmVxdWVuY3kgRG9tYWluIEFuYWx5c2lzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQXR0ZW51YXRlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBBdHRlbnVhdGVNb2RlIGhpZ2hsb3cpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNvbmp1Z2F0ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRkZUKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFGbGlwRnJlcXVlbmNpZXMoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUludmVyc2VGRlQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVRydW5jYXRlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBUcnVuY2F0ZU1vZGUgaGlnaGxvdywgZmxvYXQgcmF0aW9Ub0tlZXApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBCYXJjb2RlIEkvTyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR3JhZGVEYXRhTWF0cml4QmFyY29kZUFJTShjb25zdCBJbWFnZSogaW1hZ2UsIEFJTUdyYWRlUmVwb3J0KiByZXBvcnQpOworSU1BUV9GVU5DIEJhcmNvZGVJbmZvKiAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVhZEJhcmNvZGUoY29uc3QgSW1hZ2UqIGltYWdlLCBCYXJjb2RlVHlwZSB0eXBlLCBjb25zdCBST0kqIHJvaSwgaW50IHZhbGlkYXRlKTsKK0lNQVFfRlVOQyBEYXRhTWF0cml4UmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcVJlYWREYXRhTWF0cml4QmFyY29kZTIoSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgRGF0YU1hdHJpeEdyYWRpbmdNb2RlIHByZXBhcmVGb3JHcmFkaW5nLCBjb25zdCBEYXRhTWF0cml4RGVzY3JpcHRpb25PcHRpb25zKiBkZXNjcmlwdGlvbk9wdGlvbnMsIGNvbnN0IERhdGFNYXRyaXhTaXplT3B0aW9ucyogc2l6ZU9wdGlvbnMsIGNvbnN0IERhdGFNYXRyaXhTZWFyY2hPcHRpb25zKiBzZWFyY2hPcHRpb25zKTsKK0lNQVFfRlVOQyBCYXJjb2RlMkRJbmZvKiAgICBJTUFRX1NURENBTEwgaW1hcVJlYWRQREY0MTdCYXJjb2RlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIEJhcmNvZGUyRFNlYXJjaE1vZGUgc2VhcmNoTW9kZSwgdW5zaWduZWQgaW50KiBudW1CYXJjb2Rlcyk7CitJTUFRX0ZVTkMgUVJDb2RlUmVwb3J0KiAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkUVJDb2RlKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIFFSR3JhZGluZ01vZGUgcmVzZXJ2ZWQsIGNvbnN0IFFSQ29kZURlc2NyaXB0aW9uT3B0aW9ucyogZGVzY3JpcHRpb25PcHRpb25zLCBjb25zdCBRUkNvZGVTaXplT3B0aW9ucyogc2l6ZU9wdGlvbnMsIGNvbnN0IFFSQ29kZVNlYXJjaE9wdGlvbnMqIHNlYXJjaE9wdGlvbnMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBMQ0QgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRmluZExDRFNlZ21lbnRzKFJPSSogcm9pLCBjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IExDRE9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIExDRFJlcG9ydCogSU1BUV9TVERDQUxMIGltYXFSZWFkTENEKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IExDRE9wdGlvbnMqIG9wdGlvbnMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBTaGFwZSBNYXRjaGluZyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIFNoYXBlUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcU1hdGNoU2hhcGUoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IEltYWdlKiB0ZW1wbGF0ZUltYWdlLCBpbnQgc2NhbGVJbnZhcmlhbnQsIGludCBjb25uZWN0aXZpdHk4LCBkb3VibGUgdG9sZXJhbmNlLCBpbnQqIG51bU1hdGNoZXMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDb250b3VycyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIENvbnRvdXJJRCAgICAgSU1BUV9TVERDQUxMIGltYXFBZGRBbm51bHVzQ29udG91cihST0kqIHJvaSwgQW5udWx1cyBhbm51bHVzKTsKK0lNQVFfRlVOQyBDb250b3VySUQgICAgIElNQVFfU1REQ0FMTCBpbWFxQWRkQ2xvc2VkQ29udG91cihST0kqIHJvaSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cyk7CitJTUFRX0ZVTkMgQ29udG91cklEICAgICBJTUFRX1NURENBTEwgaW1hcUFkZExpbmVDb250b3VyKFJPSSogcm9pLCBQb2ludCBzdGFydCwgUG9pbnQgZW5kKTsKK0lNQVFfRlVOQyBDb250b3VySUQgICAgIElNQVFfU1REQ0FMTCBpbWFxQWRkT3BlbkNvbnRvdXIoUk9JKiByb2ksIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMpOworSU1BUV9GVU5DIENvbnRvdXJJRCAgICAgSU1BUV9TVERDQUxMIGltYXFBZGRPdmFsQ29udG91cihST0kqIHJvaSwgUmVjdCBib3VuZGluZ0JveCk7CitJTUFRX0ZVTkMgQ29udG91cklEICAgICBJTUFRX1NURENBTEwgaW1hcUFkZFBvaW50Q29udG91cihST0kqIHJvaSwgUG9pbnQgcG9pbnQpOworSU1BUV9GVU5DIENvbnRvdXJJRCAgICAgSU1BUV9TVERDQUxMIGltYXFBZGRSZWN0Q29udG91cihST0kqIHJvaSwgUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBDb250b3VySUQgICAgIElNQVFfU1REQ0FMTCBpbWFxQWRkUm90YXRlZFJlY3RDb250b3VyMihST0kqIHJvaSwgUm90YXRlZFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgQ29udG91cklEICAgICBJTUFRX1NURENBTEwgaW1hcUNvcHlDb250b3VyKFJPSSogZGVzdFJvaSwgY29uc3QgUk9JKiBzb3VyY2VSb2ksIENvbnRvdXJJRCBpZCk7CitJTUFRX0ZVTkMgQ29udG91cklEICAgICBJTUFRX1NURENBTEwgaW1hcUdldENvbnRvdXIoY29uc3QgUk9JKiByb2ksIHVuc2lnbmVkIGludCBpbmRleCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldENvbnRvdXJDb2xvcihjb25zdCBST0kqIHJvaSwgQ29udG91cklEIGlkLCBSR0JWYWx1ZSogY29udG91ckNvbG9yKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q29udG91ckNvdW50KGNvbnN0IFJPSSogcm9pKTsKK0lNQVFfRlVOQyBDb250b3VySW5mbzIqIElNQVFfU1REQ0FMTCBpbWFxR2V0Q29udG91ckluZm8yKGNvbnN0IFJPSSogcm9pLCBDb250b3VySUQgaWQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNb3ZlQ29udG91cihST0kqIHJvaSwgQ29udG91cklEIGlkLCBpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVtb3ZlQ29udG91cihST0kqIHJvaSwgQ29udG91cklEIGlkKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0Q29udG91ckNvbG9yKFJPSSogcm9pLCBDb250b3VySUQgaWQsIGNvbnN0IFJHQlZhbHVlKiBjb2xvcik7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFJlZ2lvbnMgb2YgSW50ZXJlc3QgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgIElNQVFfU1REQ0FMTCBpbWFxQ29uc3RydWN0Uk9JMihjb25zdCBJbWFnZSogaW1hZ2UsIFJPSSogcm9pLCBUb29sIGluaXRpYWxUb29sLCBjb25zdCBUb29sV2luZG93T3B0aW9ucyogdG9vbHMsIGNvbnN0IENvbnN0cnVjdFJPSU9wdGlvbnMyKiBvcHRpb25zLCBpbnQqIG9rYXkpOworSU1BUV9GVU5DIFJPSSogSU1BUV9TVERDQUxMIGltYXFDcmVhdGVST0kodm9pZCk7CitJTUFRX0ZVTkMgaW50ICBJTUFRX1NURENBTEwgaW1hcUdldFJPSUJvdW5kaW5nQm94KGNvbnN0IFJPSSogcm9pLCBSZWN0KiBib3VuZGluZ0JveCk7CitJTUFRX0ZVTkMgaW50ICBJTUFRX1NURENBTEwgaW1hcUdldFJPSUNvbG9yKGNvbnN0IFJPSSogcm9pLCBSR0JWYWx1ZSogcm9pQ29sb3IpOworSU1BUV9GVU5DIFJPSSogSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dST0koaW50IHdpbmRvd051bWJlcik7CitJTUFRX0ZVTkMgaW50ICBJTUFRX1NURENBTEwgaW1hcVNldFJPSUNvbG9yKFJPSSogcm9pLCBjb25zdCBSR0JWYWx1ZSogY29sb3IpOworSU1BUV9GVU5DIGludCAgSU1BUV9TVERDQUxMIGltYXFTZXRXaW5kb3dST0koaW50IHdpbmRvd051bWJlciwgY29uc3QgUk9JKiByb2kpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbWFnZSBBbmFseXNpcyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDZW50cm9pZChjb25zdCBJbWFnZSogaW1hZ2UsIFBvaW50RmxvYXQqIGNlbnRyb2lkLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgQ3VydmUqICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUV4dHJhY3RDdXJ2ZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIHVuc2lnbmVkIGludCogbnVtQ3VydmVzKTsKK0lNQVFfRlVOQyBIaXN0b2dyYW1SZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxSGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgTGluZWFyQXZlcmFnZXMqICBJTUFRX1NURENBTEwgaW1hcUxpbmVhckF2ZXJhZ2VzMihJbWFnZSogaW1hZ2UsIExpbmVhckF2ZXJhZ2VzTW9kZSBtb2RlLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIExpbmVQcm9maWxlKiAgICAgSU1BUV9TVERDQUxMIGltYXFMaW5lUHJvZmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIFBvaW50IHN0YXJ0LCBQb2ludCBlbmQpOworSU1BUV9GVU5DIFF1YW50aWZ5UmVwb3J0KiAgSU1BUV9TVERDQUxMIGltYXFRdWFudGlmeShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBtYXNrKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRXJyb3IgTWFuYWdlbWVudCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ2xlYXJFcnJvcih2b2lkKTsKK0lNQVFfRlVOQyBjaGFyKiAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldEVycm9yVGV4dChpbnQgZXJyb3JDb2RlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldExhc3RFcnJvcih2b2lkKTsKK0lNQVFfRlVOQyBjb25zdCBjaGFyKiBJTUFRX1NURENBTEwgaW1hcUdldExhc3RFcnJvckZ1bmModm9pZCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZXRFcnJvcihpbnQgZXJyb3JDb2RlLCBjb25zdCBjaGFyKiBmdW5jdGlvbik7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFRocmVzaG9sZCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIFRocmVzaG9sZERhdGEqIElNQVFfU1REQ0FMTCBpbWFxQXV0b1RocmVzaG9sZDIoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCBudW1DbGFzc2VzLCBUaHJlc2hvbGRNZXRob2QgbWV0aG9kLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMb2NhbFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgdW5zaWduZWQgaW50IHdpbmRvd1dpZHRoLCB1bnNpZ25lZCBpbnQgd2luZG93SGVpZ2h0LCBMb2NhbFRocmVzaG9sZE1ldGhvZCBtZXRob2QsIGRvdWJsZSBkZXZpYXRpb25XZWlnaHQsIE9iamVjdFR5cGUgdHlwZSwgZmxvYXQgcmVwbGFjZVZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1hZ2ljV2FuZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUG9pbnQgY29vcmQsIGZsb2F0IHRvbGVyYW5jZSwgaW50IGNvbm5lY3Rpdml0eTgsIGZsb2F0IHJlcGxhY2VWYWx1ZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNdWx0aXRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgVGhyZXNob2xkRGF0YSogcmFuZ2VzLCBpbnQgbnVtUmFuZ2VzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgcmFuZ2VNaW4sIGZsb2F0IHJhbmdlTWF4LCBpbnQgdXNlTmV3VmFsdWUsIGZsb2F0IG5ld1ZhbHVlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgTWVtb3J5IE1hbmFnZW1lbnQgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFEaXNwb3NlKHZvaWQqIG9iamVjdCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFBhdHRlcm4gTWF0Y2hpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDaXJjbGVNYXRjaCogICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRGV0ZWN0Q2lyY2xlcyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IENpcmNsZURlc2NyaXB0b3IqIGNpcmNsZURlc2NyaXB0b3IsIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLCBjb25zdCBTaGFwZURldGVjdGlvbk9wdGlvbnMqIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucywgY29uc3QgUk9JKiByb2ksIGludCogbnVtTWF0Y2hlc1JldHVybmVkKTsKK0lNQVFfRlVOQyBFbGxpcHNlTWF0Y2gqICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRGV0ZWN0RWxsaXBzZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBFbGxpcHNlRGVzY3JpcHRvciogZWxsaXBzZURlc2NyaXB0b3IsIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLCBjb25zdCBTaGFwZURldGVjdGlvbk9wdGlvbnMqIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucywgY29uc3QgUk9JKiByb2ksIGludCogbnVtTWF0Y2hlc1JldHVybmVkKTsKK0lNQVFfRlVOQyBMaW5lTWF0Y2gqICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRGV0ZWN0TGluZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBMaW5lRGVzY3JpcHRvciogbGluZURlc2NyaXB0b3IsIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLCBjb25zdCBTaGFwZURldGVjdGlvbk9wdGlvbnMqIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucywgY29uc3QgUk9JKiByb2ksIGludCogbnVtTWF0Y2hlc1JldHVybmVkKTsKK0lNQVFfRlVOQyBSZWN0YW5nbGVNYXRjaCogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRGV0ZWN0UmVjdGFuZ2xlcyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJlY3RhbmdsZURlc2NyaXB0b3IqIHJlY3RhbmdsZURlc2NyaXB0b3IsIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLCBjb25zdCBTaGFwZURldGVjdGlvbk9wdGlvbnMqIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucywgY29uc3QgUk9JKiByb2ksIGludCogbnVtTWF0Y2hlc1JldHVybmVkKTsKK0lNQVFfRlVOQyBGZWF0dXJlRGF0YSogICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0R2VvbWV0cmljRmVhdHVyZXNGcm9tQ3VydmVzKGNvbnN0IEN1cnZlKiBjdXJ2ZXMsIHVuc2lnbmVkIGludCBudW1DdXJ2ZXMsIGNvbnN0IEZlYXR1cmVUeXBlKiBmZWF0dXJlVHlwZXMsIHVuc2lnbmVkIGludCBudW1GZWF0dXJlVHlwZXMsIHVuc2lnbmVkIGludCogbnVtRmVhdHVyZXMpOworSU1BUV9GVU5DIEZlYXR1cmVEYXRhKiAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRHZW9tZXRyaWNUZW1wbGF0ZUZlYXR1cmVJbmZvKGNvbnN0IEltYWdlKiBwYXR0ZXJuLCB1bnNpZ25lZCBpbnQqIG51bUZlYXR1cmVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGVhcm5Db2xvclBhdHRlcm4oSW1hZ2UqIGltYWdlLCBjb25zdCBMZWFybkNvbG9yUGF0dGVybk9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMZWFybkdlb21ldHJpY1BhdHRlcm4oSW1hZ2UqIGltYWdlLCBQb2ludEZsb2F0IG9yaWdpbk9mZnNldCwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9ucyogYWR2YW5jZWRMZWFybk9wdGlvbnMsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm4qIElNQVFfU1REQ0FMTCBpbWFxTGVhcm5NdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5zKGNvbnN0IEltYWdlKiogcGF0dGVybnMsIHVuc2lnbmVkIGludCBudW1iZXJPZlBhdHRlcm5zLCBjb25zdCBTdHJpbmcyNTUqIGxhYmVscyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxlYXJuUGF0dGVybjMoSW1hZ2UqIGltYWdlLCBMZWFybmluZ01vZGUgbGVhcm5pbmdNb2RlLCBMZWFyblBhdHRlcm5BZHZhbmNlZE9wdGlvbnMqIGFkdmFuY2VkT3B0aW9ucywgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIFBhdHRlcm5NYXRjaCogICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNYXRjaENvbG9yUGF0dGVybihjb25zdCBJbWFnZSogaW1hZ2UsIEltYWdlKiBwYXR0ZXJuLCBjb25zdCBNYXRjaENvbG9yUGF0dGVybk9wdGlvbnMqIG9wdGlvbnMsIFJlY3Qgc2VhcmNoUmVjdCwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gyKiAgIElNQVFfU1REQ0FMTCBpbWFxTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuMihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBwYXR0ZXJuLCBjb25zdCBDdXJ2ZU9wdGlvbnMqIGN1cnZlT3B0aW9ucywgY29uc3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuT3B0aW9ucyogbWF0Y2hPcHRpb25zLCBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyKiBhZHZhbmNlZE1hdGNoT3B0aW9ucywgY29uc3QgUk9JKiByb2ksIGludCogbnVtTWF0Y2hlcyk7CitJTUFRX0ZVTkMgR2VvbWV0cmljUGF0dGVybk1hdGNoMiogICBJTUFRX1NURENBTEwgaW1hcU1hdGNoTXVsdGlwbGVHZW9tZXRyaWNQYXR0ZXJucyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IE11bHRpcGxlR2VvbWV0cmljUGF0dGVybiogbXVsdGlwbGVQYXR0ZXJuLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm4qIElNQVFfU1REQ0FMTCBpbWFxUmVhZE11bHRpcGxlR2VvbWV0cmljUGF0dGVybkZpbGUoY29uc3QgY2hhciogZmlsZU5hbWUsIFN0cmluZzI1NSBkZXNjcmlwdGlvbik7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlZmluZU1hdGNoZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBJbWFnZSogcGF0dGVybiwgY29uc3QgUGF0dGVybk1hdGNoKiBjYW5kaWRhdGVzSW4sIGludCBudW1DYW5kaWRhdGVzSW4sIE1hdGNoUGF0dGVybk9wdGlvbnMqIG9wdGlvbnMsIE1hdGNoUGF0dGVybkFkdmFuY2VkT3B0aW9ucyogYWR2YW5jZWRPcHRpb25zLCBpbnQqIG51bUNhbmRpZGF0ZXNPdXQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZXRNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5zT3B0aW9ucyhNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm4qIG11bHRpcGxlUGF0dGVybiwgY29uc3QgY2hhciogbGFiZWwsIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLCBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zKiBtYXRjaE9wdGlvbnMsIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczIqIGFkdmFuY2VkTWF0Y2hPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5GaWxlKGNvbnN0IE11bHRpcGxlR2VvbWV0cmljUGF0dGVybiogbXVsdGlwbGVQYXR0ZXJuLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOworSU1BUV9GVU5DIEdlb21ldHJpY1BhdHRlcm5NYXRjaDMqICAgSU1BUV9TVERDQUxMIGltYXFNYXRjaEdlb21ldHJpY1BhdHRlcm4zKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLCBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zKiBtYXRjaE9wdGlvbnMsIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczMqIGFkdmFuY2VkTWF0Y2hPcHRpb25zLCBjb25zdCBST0kqIHJvaSwgc2l6ZV90KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGVhcm5HZW9tZXRyaWNQYXR0ZXJuMihJbWFnZSogaW1hZ2UsIFBvaW50RmxvYXQgb3JpZ2luT2Zmc2V0LCBkb3VibGUgYW5nbGVPZmZzZXQsIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLCBjb25zdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyKiBhZHZhbmNlZExlYXJuT3B0aW9ucywgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIFBhdHRlcm5NYXRjaCogICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNYXRjaFBhdHRlcm4zKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IE1hdGNoUGF0dGVybk9wdGlvbnMqIG9wdGlvbnMsIGNvbnN0IE1hdGNoUGF0dGVybkFkdmFuY2VkT3B0aW9ucyogYWR2YW5jZWRPcHRpb25zLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgT3ZlcmxheSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNsZWFyT3ZlcmxheShJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDb3B5T3ZlcmxheShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldE92ZXJsYXlQcm9wZXJ0aWVzKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZ3JvdXAsIFRyYW5zZm9ybUJlaGF2aW9ycyogdHJhbnNmb3JtQmVoYXZpb3JzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNZXJnZU92ZXJsYXkoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IFJHQlZhbHVlKiBwYWxldHRlLCB1bnNpZ25lZCBpbnQgbnVtQ29sb3JzLCBjb25zdCBjaGFyKiBncm91cCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxT3ZlcmxheUFyYyhJbWFnZSogaW1hZ2UsIGNvbnN0IEFyY0luZm8qIGFyYywgY29uc3QgUkdCVmFsdWUqIGNvbG9yLCBEcmF3TW9kZSBkcmF3TW9kZSwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlCaXRtYXAoSW1hZ2UqIGltYWdlLCBQb2ludCBkZXN0TG9jLCBjb25zdCBSR0JWYWx1ZSogYml0bWFwLCB1bnNpZ25lZCBpbnQgbnVtQ29scywgdW5zaWduZWQgaW50IG51bVJvd3MsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5Q2xvc2VkQ29udG91cihJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsIGNvbnN0IFJHQlZhbHVlKiBjb2xvciwgRHJhd01vZGUgZHJhd01vZGUsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5TGluZShJbWFnZSogaW1hZ2UsIFBvaW50IHN0YXJ0LCBQb2ludCBlbmQsIGNvbnN0IFJHQlZhbHVlKiBjb2xvciwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlNZXRhZmlsZShJbWFnZSogaW1hZ2UsIGNvbnN0IHZvaWQqIG1ldGFmaWxlLCBSZWN0IHJlY3QsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5T3BlbkNvbnRvdXIoSW1hZ2UqIGltYWdlLCBjb25zdCBQb2ludCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBjb25zdCBSR0JWYWx1ZSogY29sb3IsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5T3ZhbChJbWFnZSogaW1hZ2UsIFJlY3QgYm91bmRpbmdCb3gsIGNvbnN0IFJHQlZhbHVlKiBjb2xvciwgRHJhd01vZGUgZHJhd01vZGUsIGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5UG9pbnRzKEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cywgY29uc3QgUkdCVmFsdWUqIGNvbG9ycywgaW50IG51bUNvbG9ycywgUG9pbnRTeW1ib2wgc3ltYm9sLCBjb25zdCBVc2VyUG9pbnRTeW1ib2wqIHVzZXJTeW1ib2wsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5UmVjdChJbWFnZSogaW1hZ2UsIFJlY3QgcmVjdCwgY29uc3QgUkdCVmFsdWUqIGNvbG9yLCBEcmF3TW9kZSBkcmF3TW9kZSwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlST0koSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgUG9pbnRTeW1ib2wgc3ltYm9sLCBjb25zdCBVc2VyUG9pbnRTeW1ib2wqIHVzZXJTeW1ib2wsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5VGV4dChJbWFnZSogaW1hZ2UsIFBvaW50IG9yaWdpbiwgY29uc3QgY2hhciogdGV4dCwgY29uc3QgUkdCVmFsdWUqIGNvbG9yLCBjb25zdCBPdmVybGF5VGV4dE9wdGlvbnMqIG9wdGlvbnMsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFTZXRPdmVybGF5UHJvcGVydGllcyhJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGdyb3VwLCBUcmFuc2Zvcm1CZWhhdmlvcnMqIHRyYW5zZm9ybUJlaGF2aW9ycyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE9DUiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIENoYXJTZXQqICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDcmVhdGVDaGFyU2V0KHZvaWQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFEZWxldGVDaGFyKENoYXJTZXQqIHNldCwgaW50IGluZGV4KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q2hhckNvdW50KGNvbnN0IENoYXJTZXQqIHNldCk7CitJTUFRX0ZVTkMgQ2hhckluZm8yKiAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldENoYXJJbmZvMihjb25zdCBDaGFyU2V0KiBzZXQsIGludCBpbmRleCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlYWRPQ1JGaWxlKGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBDaGFyU2V0KiBzZXQsIFN0cmluZzI1NSBzZXREZXNjcmlwdGlvbiwgUmVhZFRleHRPcHRpb25zKiByZWFkT3B0aW9ucywgT0NSUHJvY2Vzc2luZ09wdGlvbnMqIHByb2Nlc3NpbmdPcHRpb25zLCBPQ1JTcGFjaW5nT3B0aW9ucyogc3BhY2luZ09wdGlvbnMpOworSU1BUV9GVU5DIFJlYWRUZXh0UmVwb3J0MyogSU1BUV9TVERDQUxMIGltYXFSZWFkVGV4dDMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBDaGFyU2V0KiBzZXQsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBSZWFkVGV4dE9wdGlvbnMqIHJlYWRPcHRpb25zLCBjb25zdCBPQ1JQcm9jZXNzaW5nT3B0aW9ucyogcHJvY2Vzc2luZ09wdGlvbnMsIGNvbnN0IE9DUlNwYWNpbmdPcHRpb25zKiBzcGFjaW5nT3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlbmFtZUNoYXIoQ2hhclNldCogc2V0LCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIG5ld0NoYXJWYWx1ZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldFJlZmVyZW5jZUNoYXIoY29uc3QgQ2hhclNldCogc2V0LCBpbnQgaW5kZXgsIGludCBpc1JlZmVyZW5jZUNoYXIpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFUcmFpbkNoYXJzKGNvbnN0IEltYWdlKiBpbWFnZSwgQ2hhclNldCogc2V0LCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIGNoYXJWYWx1ZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IE9DUlByb2Nlc3NpbmdPcHRpb25zKiBwcm9jZXNzaW5nT3B0aW9ucywgY29uc3QgT0NSU3BhY2luZ09wdGlvbnMqIHNwYWNpbmdPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQqICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxVmVyaWZ5UGF0dGVybnMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBDaGFyU2V0KiBzZXQsIGNvbnN0IFN0cmluZzI1NSogZXhwZWN0ZWRQYXR0ZXJucywgaW50IHBhdHRlcm5Db3VudCwgY29uc3QgUk9JKiByb2ksIGludCogbnVtU2NvcmVzKTsKK0lNQVFfRlVOQyBpbnQqICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxVmVyaWZ5VGV4dChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IENoYXJTZXQqIHNldCwgY29uc3QgY2hhciogZXhwZWN0ZWRTdHJpbmcsIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bVNjb3Jlcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVdyaXRlT0NSRmlsZShjb25zdCBjaGFyKiBmaWxlTmFtZSwgY29uc3QgQ2hhclNldCogc2V0LCBjb25zdCBjaGFyKiBzZXREZXNjcmlwdGlvbiwgY29uc3QgUmVhZFRleHRPcHRpb25zKiByZWFkT3B0aW9ucywgY29uc3QgT0NSUHJvY2Vzc2luZ09wdGlvbnMqIHByb2Nlc3NpbmdPcHRpb25zLCBjb25zdCBPQ1JTcGFjaW5nT3B0aW9ucyogc3BhY2luZ09wdGlvbnMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBHZW9tZXRyaWMgTWF0Y2hpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBFeHRyYWN0Q29udG91clJlcG9ydCogICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFFeHRyYWN0Q29udG91cihJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBFeHRyYWN0Q29udG91ckRpcmVjdGlvbiBkaXJlY3Rpb24sIEN1cnZlUGFyYW1ldGVycyogY3VydmVQYXJhbXMsIGNvbnN0IENvbm5lY3Rpb25Db25zdHJhaW50KiBjb25uZWN0aW9uQ29uc3RyYWludFBhcmFtcywgdW5zaWduZWQgaW50IG51bU9mQ29uc3RyYWludHMsIEV4dHJhY3RDb250b3VyU2VsZWN0aW9uIHNlbGVjdGlvbiwgSW1hZ2UqIGNvbnRvdXJJbWFnZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udG91ck92ZXJsYXkoSW1hZ2UqIGltYWdlLCBjb25zdCBJbWFnZSogY29udG91ckltYWdlLCBjb25zdCBDb250b3VyT3ZlcmxheVNldHRpbmdzKiBwb2ludHNTZXR0aW5ncywgY29uc3QgQ29udG91ck92ZXJsYXlTZXR0aW5ncyogZXFuU2V0dGluZ3MsIGNvbnN0IGNoYXIqIGdyb3VwTmFtZSk7CitJTUFRX0ZVTkMgQ29udG91ckNvbXB1dGVDdXJ2YXR1cmVSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxQ29udG91ckNvbXB1dGVDdXJ2YXR1cmUoY29uc3QgSW1hZ2UqIGNvbnRvdXJJbWFnZSwgdW5zaWduZWQgaW50IGtlcm5lbCk7CitJTUFRX0ZVTkMgQ3VydmF0dXJlQW5hbHlzaXNSZXBvcnQqICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udG91ckNsYXNzaWZ5Q3VydmF0dXJlKGNvbnN0IEltYWdlKiBjb250b3VySW1hZ2UsIHVuc2lnbmVkIGludCBrZXJuZWwsIFJhbmdlTGFiZWwqIGN1cnZhdHVyZUNsYXNzZXMsIHVuc2lnbmVkIGludCBudW1DdXJ2YXR1cmVDbGFzc2VzKTsKK0lNQVFfRlVOQyBDb21wdXRlRGlzdGFuY2VzUmVwb3J0KiAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VyQ29tcHV0ZURpc3RhbmNlcyhjb25zdCBJbWFnZSogdGFyZ2V0SW1hZ2UsIGNvbnN0IEltYWdlKiB0ZW1wbGF0ZUltYWdlLCBjb25zdCBTZXR1cE1hdGNoUGF0dGVybkRhdGEqIG1hdGNoU2V0dXBEYXRhLCB1bnNpZ25lZCBpbnQgc21vb3RoaW5nS2VybmVsKTsKK0lNQVFfRlVOQyBDbGFzc2lmeURpc3RhbmNlc1JlcG9ydCogICAgICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VyQ2xhc3NpZnlEaXN0YW5jZXMoY29uc3QgSW1hZ2UqIHRhcmdldEltYWdlLCBjb25zdCBJbWFnZSogdGVtcGxhdGVJbWFnZSwgY29uc3QgU2V0dXBNYXRjaFBhdHRlcm5EYXRhKiBtYXRjaFNldHVwRGF0YSwgdW5zaWduZWQgaW50IHNtb290aGluZ0tlcm5lbCwgY29uc3QgUmFuZ2VMYWJlbCogZGlzdGFuY2VSYW5nZXMsIHVuc2lnbmVkIGludCBudW1EaXN0YW5jZVJhbmdlcyk7CitJTUFRX0ZVTkMgQ29udG91ckluZm9SZXBvcnQqICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udG91ckluZm8oY29uc3QgSW1hZ2UqIGNvbnRvdXJJbWFnZSk7CitJTUFRX0ZVTkMgU2V0dXBNYXRjaFBhdHRlcm5EYXRhKiAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29udG91clNldHVwTWF0Y2hQYXR0ZXJuKE1hdGNoTW9kZSogbWF0Y2hNb2RlLCB1bnNpZ25lZCBpbnQgZW5hYmxlU3ViUGl4ZWxBY2N1cmFjeSwgQ3VydmVQYXJhbWV0ZXJzKiBjdXJ2ZVBhcmFtcywgdW5zaWduZWQgaW50IHVzZUxlYXJuQ3VydmVQYXJhbWV0ZXJzLCBjb25zdCBSYW5nZVNldHRpbmdEb3VibGUqIHJhbmdlU2V0dGluZ3MsIHVuc2lnbmVkIGludCBudW1SYW5nZVNldHRpbmdzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VyQWR2YW5jZWRTZXR1cE1hdGNoUGF0dGVybihTZXR1cE1hdGNoUGF0dGVybkRhdGEqIG1hdGNoU2V0dXBEYXRhLCBHZW9tZXRyaWNBZHZhbmNlZFNldHVwRGF0YU9wdGlvbiogZ2VvbWV0cmljT3B0aW9ucywgdW5zaWduZWQgaW50IG51bUdlb21ldHJpY09wdGlvbnMpOworSU1BUV9GVU5DIENvbnRvdXJGaXRMaW5lUmVwb3J0KiAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJGaXRMaW5lKEltYWdlKiBpbWFnZSwgZG91YmxlIHBpeGVsUmFkaXVzKTsKK0lNQVFfRlVOQyBQYXJ0aWFsQ2lyY2xlKiAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VyRml0Q2lyY2xlKEltYWdlKiBpbWFnZSwgZG91YmxlIHBpeGVsUmFkaXVzLCBpbnQgcmVqZWN0T3V0bGllcnMpOworSU1BUV9GVU5DIFBhcnRpYWxFbGxpcHNlKiAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJGaXRFbGxpcHNlKEltYWdlKiBpbWFnZSwgZG91YmxlIHBpeGVsUmFkaXVzLCBpbnQgcmVqZWN0T3V0bGllcnMpOworSU1BUV9GVU5DIENvbnRvdXJGaXRTcGxpbmVSZXBvcnQqICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJGaXRTcGxpbmUoSW1hZ2UqIGltYWdlLCBpbnQgZGVncmVlLCBpbnQgbnVtYmVyT2ZDb250cm9sUG9pbnRzKTsKK0lNQVFfRlVOQyBDb250b3VyRml0UG9seW5vbWlhbFJlcG9ydCogICAgSU1BUV9TVERDQUxMIGltYXFDb250b3VyRml0UG9seW5vbWlhbChJbWFnZSogaW1hZ2UsIGludCBvcmRlcik7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEVkZ2UgRGV0ZWN0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgRmluZENpcmN1bGFyRWRnZVJlcG9ydCogICBJTUFRX1NURENBTEwgaW1hcUZpbmRDaXJjdWxhckVkZ2UyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIG5ld1N5c3RlbSwgY29uc3QgRmluZENpcmN1bGFyRWRnZU9wdGlvbnMqIGVkZ2VPcHRpb25zLCBjb25zdCBDaXJjbGVGaXRPcHRpb25zKiBjaXJjbGVGaXRPcHRpb25zKTsKK0lNQVFfRlVOQyBGaW5kQ29uY2VudHJpY0VkZ2VSZXBvcnQqIElNQVFfU1REQ0FMTCBpbWFxRmluZENvbmNlbnRyaWNFZGdlMihJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBiYXNlU3lzdGVtLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBuZXdTeXN0ZW0sIGNvbnN0IEZpbmRDb25jZW50cmljRWRnZU9wdGlvbnMqIGVkZ2VPcHRpb25zLCBjb25zdCBDb25jZW50cmljRWRnZUZpdE9wdGlvbnMqIGNvbmNlbnRyaWNFZGdlRml0T3B0aW9ucyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE1vcnBob2xvZ3kgUmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFHcmF5TW9ycGhvbG9neVJlY29uc3RydWN0KEltYWdlKiBkc3RJbWFnZSwgSW1hZ2UqIHNyY0ltYWdlLCBjb25zdCBJbWFnZSogbWFya2VySW1hZ2UsIFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bU9mUG9pbnRzLCBNb3JwaG9sb2d5UmVjb25zdHJ1Y3RPcGVyYXRpb24gb3BlcmF0aW9uLCBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCwgY29uc3QgUk9JKiByb2kpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1vcnBob2xvZ3lSZWNvbnN0cnVjdChJbWFnZSogZHN0SW1hZ2UsIEltYWdlKiBzcmNJbWFnZSwgY29uc3QgSW1hZ2UqIG1hcmtlckltYWdlLCBQb2ludEZsb2F0KiBwb2ludHMsIGludCBudW1PZlBvaW50cywgTW9ycGhvbG9neVJlY29uc3RydWN0T3BlcmF0aW9uIG9wZXJhdGlvbiwgQ29ubmVjdGl2aXR5IGNvbm5lY3Rpdml0eSwgY29uc3QgUk9JKiByb2kpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBUZXh0dXJlIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFEZXRlY3RUZXh0dXJlRGVmZWN0KENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBJbWFnZSogZGVzdEltYWdlLCBjb25zdCBJbWFnZSogc3JjSW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBpbnQgaW5pdGlhbFN0ZXBTaXplLCBpbnQgZmluYWxTdGVwU2l6ZSwgdW5zaWduZWQgY2hhciBkZWZlY3RQaXhlbFZhbHVlLCBkb3VibGUgbWluQ2xhc3NpZmljYXRpb25TY29yZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDbGFzc2lmaWNhdGlvblRleHR1cmVEZWZlY3RPcHRpb25zKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBXaW5kb3dTaXplKiB3aW5kb3dPcHRpb25zLCBXYXZlbGV0T3B0aW9ucyogd2F2ZWxldE9wdGlvbnMsIHZvaWQqKiBiYW5kc1VzZWQsIGludCogbnVtQmFuZHNVc2VkLCBDb29jY3VycmVuY2VPcHRpb25zKiBjb29jY3VycmVuY2VPcHRpb25zLCB1bnNpZ25lZCBjaGFyIHNldE9wZXJhdGlvbik7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb29jY3VycmVuY2VNYXRyaXgoY29uc3QgSW1hZ2UqIHNyY0ltYWdlLCBjb25zdCBST0kqIHJvaSwgaW50IGxldmVsUGl4ZWwsIGNvbnN0IERpc3BsYWNlbWVudFZlY3RvciogZGlzcGxhY2VtZW50VmVjLCB2b2lkKiBmZWF0dXJlT3B0aW9uQXJyYXksIHVuc2lnbmVkIGludCBmZWF0dXJlT3B0aW9uQXJyYXlTaXplLCB2b2lkKiogY29vY2N1cnJlbmNlTWF0cml4QXJyYXksIGludCogY29vY3VycmVuY2VNYXRyaXhSb3dzLCBpbnQqIGNvb2N1cnJlbmNlTWF0cml4Q29scywgdm9pZCoqIGZlYXR1cmVWZWN0b3JBcnJheSwgaW50KiBmZWF0dXJlVmVjdG9yQXJyYXlTaXplKTsKK0lNQVFfRlVOQyBFeHRyYWN0VGV4dHVyZUZlYXR1cmVzUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcUV4dHJhY3RUZXh0dXJlRmVhdHVyZXMoY29uc3QgSW1hZ2UqIHNyY0ltYWdlLCBjb25zdCBST0kqIHJvaSwgY29uc3QgV2luZG93U2l6ZSogd2luZG93T3B0aW9ucywgY29uc3QgV2F2ZWxldE9wdGlvbnMqIHdhdmVsZXRPcHRpb25zLCB2b2lkKiB3YXZlbGV0QmFuZHMsIHVuc2lnbmVkIGludCBudW1XYXZlbGV0QmFuZHMsIGNvbnN0IENvb2NjdXJyZW5jZU9wdGlvbnMqIGNvb2NjdXJyZW5jZU9wdGlvbnMsIHVuc2lnbmVkIGNoYXIgdXNlV2luZG93KTsKK0lNQVFfRlVOQyBXYXZlbGV0QmFuZHNSZXBvcnQqICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUV4dHJhY3RXYXZlbGV0QmFuZHMoY29uc3QgSW1hZ2UqIHNyY0ltYWdlLCBjb25zdCBXYXZlbGV0T3B0aW9ucyogd2F2ZWxldE9wdGlvbnMsIHZvaWQqIHdhdmVsZXRCYW5kcywgdW5zaWduZWQgaW50IG51bVdhdmVsZXRCYW5kcyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFJlZ2lvbnMgb2YgSW50ZXJlc3QgTWFuaXB1bGF0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgUk9JKiAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFNYXNrVG9ST0koY29uc3QgSW1hZ2UqIG1hc2ssIGludCogd2l0aGluTGltaXQpOworSU1BUV9GVU5DIFJPSVByb2ZpbGUqICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUk9JUHJvZmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJPSVRvTWFzayhJbWFnZSogbWFzaywgY29uc3QgUk9JKiByb2ksIGludCBmaWxsVmFsdWUsIGNvbnN0IEltYWdlKiBpbWFnZU1vZGVsLCBpbnQqIGluU3BhY2UpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxVHJhbnNmb3JtUk9JMihST0kqIHJvaSwgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogYmFzZVN5c3RlbSwgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogbmV3U3lzdGVtKTsKK0lNQVFfRlVOQyBMYWJlbFRvUk9JUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcUxhYmVsVG9ST0koY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCB1bnNpZ25lZCBpbnQqIGxhYmVsc0luLCB1bnNpZ25lZCBpbnQgbnVtTGFiZWxzSW4sIGludCBtYXhOdW1WZWN0b3JzLCBpbnQgaXNFeHRlcm5lbEVkZ2VzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgTW9ycGhvbG9neSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdyYXlNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCwgY29uc3QgU3RydWN0dXJpbmdFbGVtZW50KiBzdHJ1Y3R1cmluZ0VsZW1lbnQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDbGFzc2lmaWNhdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUFkZENsYXNzaWZpZXJTYW1wbGUoSW1hZ2UqIGltYWdlLCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgUk9JKiByb2ksIGNvbnN0IGNoYXIqIHNhbXBsZUNsYXNzLCBkb3VibGUqIGZlYXR1cmVWZWN0b3IsIHVuc2lnbmVkIGludCB2ZWN0b3JTaXplKTsKK0lNQVFfRlVOQyBDbGFzc2lmaWVyUmVwb3J0QWR2YW5jZWQqICAgICAgSU1BUV9TVERDQUxMIGltYXFBZHZhbmNlQ2xhc3NpZnkoSW1hZ2UqIGltYWdlLCBjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgUk9JKiByb2ksIGRvdWJsZSogZmVhdHVyZVZlY3RvciwgdW5zaWduZWQgaW50IHZlY3RvclNpemUpOworSU1BUV9GVU5DIENsYXNzaWZpZXJSZXBvcnQqICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNsYXNzaWZ5KEltYWdlKiBpbWFnZSwgY29uc3QgQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIGNvbnN0IFJPSSogcm9pLCBkb3VibGUqIGZlYXR1cmVWZWN0b3IsIHVuc2lnbmVkIGludCB2ZWN0b3JTaXplKTsKK0lNQVFfRlVOQyBDbGFzc2lmaWVyU2Vzc2lvbiogICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDcmVhdGVDbGFzc2lmaWVyKENsYXNzaWZpZXJUeXBlIHR5cGUpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcURlbGV0ZUNsYXNzaWZpZXJTYW1wbGUoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIGludCBpbmRleCk7CitJTUFRX0ZVTkMgQ2xhc3NpZmllckFjY3VyYWN5UmVwb3J0KiAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q2xhc3NpZmllckFjY3VyYWN5KGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uKTsKK0lNQVFfRlVOQyBDbGFzc2lmaWVyU2FtcGxlSW5mbyogICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFHZXRDbGFzc2lmaWVyU2FtcGxlSW5mbyhjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgaW50IGluZGV4LCBpbnQqIG51bVNhbXBsZXMpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldENvbG9yQ2xhc3NpZmllck9wdGlvbnMoY29uc3QgQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIENvbG9yT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0TmVhcmVzdE5laWdoYm9yT3B0aW9ucyhjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgTmVhcmVzdE5laWdoYm9yT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0UGFydGljbGVDbGFzc2lmaWVyT3B0aW9uczIoY29uc3QgQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zMiogcHJlcHJvY2Vzc2luZ09wdGlvbnMsIFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIENsYXNzaWZpZXJTZXNzaW9uKiAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVJlYWRDbGFzc2lmaWVyRmlsZShDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgY2hhciogZmlsZU5hbWUsIFJlYWRDbGFzc2lmaWVyRmlsZU1vZGUgbW9kZSwgQ2xhc3NpZmllclR5cGUqIHR5cGUsIENsYXNzaWZpZXJFbmdpbmVUeXBlKiBlbmdpbmUsIFN0cmluZzI1NSBkZXNjcmlwdGlvbik7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVsYWJlbENsYXNzaWZpZXJTYW1wbGUoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIGludCBpbmRleCwgY29uc3QgY2hhciogbmV3Q2xhc3MpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnMyKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9uczIqIHByZXByb2Nlc3NpbmdPcHRpb25zLCBjb25zdCBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFTZXRDb2xvckNsYXNzaWZpZXJPcHRpb25zKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBDb2xvck9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIE5lYXJlc3ROZWlnaGJvclRyYWluaW5nUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcVRyYWluTmVhcmVzdE5laWdoYm9yQ2xhc3NpZmllcihDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgTmVhcmVzdE5laWdoYm9yT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVDbGFzc2lmaWVyRmlsZShjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgY2hhciogZmlsZU5hbWUsIFdyaXRlQ2xhc3NpZmllckZpbGVNb2RlIG1vZGUsIGNvbnN0IFN0cmluZzI1NSBkZXNjcmlwdGlvbik7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE1lYXN1cmUgRGlzdGFuY2VzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgQ2xhbXBNYXgyUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcUNsYW1wTWF4MihJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBiYXNlU3lzdGVtLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBuZXdTeXN0ZW0sIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVTZXR0aW5ncywgY29uc3QgQ2xhbXBTZXR0aW5ncyogY2xhbXBTZXR0aW5ncywgY29uc3QgQ2xhbXBPdmVybGF5U2V0dGluZ3MqIGNsYW1wT3ZlcmxheVNldHRpbmdzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgSW5zcGVjdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNvbXBhcmVHb2xkZW5UZW1wbGF0ZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBnb2xkZW5UZW1wbGF0ZSwgSW1hZ2UqIGJyaWdodERlZmVjdHMsIEltYWdlKiBkYXJrRGVmZWN0cywgY29uc3QgSW5zcGVjdGlvbkFsaWdubWVudCogYWxpZ25tZW50LCBjb25zdCBJbnNwZWN0aW9uT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTGVhcm5Hb2xkZW5UZW1wbGF0ZShJbWFnZSogZ29sZGVuVGVtcGxhdGUsIFBvaW50RmxvYXQgb3JpZ2luT2Zmc2V0LCBjb25zdCBJbWFnZSogbWFzayk7CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBPYnNvbGV0ZSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFSb3RhdGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IGFuZ2xlLCBQaXhlbFZhbHVlIGZpbGwsIEludGVycG9sYXRpb25NZXRob2QgbWV0aG9kKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxV3JpdGVQTkdGaWxlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIHVuc2lnbmVkIGludCBjb21wcmVzc2lvblNwZWVkLCBjb25zdCBSR0JWYWx1ZSogY29sb3JUYWJsZSk7CitJTUFRX0ZVTkMgUGFydGljbGVSZXBvcnQqICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNlbGVjdFBhcnRpY2xlcyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBhcnRpY2xlUmVwb3J0KiByZXBvcnRzLCBpbnQgcmVwb3J0Q291bnQsIGludCByZWplY3RCb3JkZXIsIGNvbnN0IFNlbGVjdFBhcnRpY2xlQ3JpdGVyaWEqIGNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCwgaW50KiBzZWxlY3RlZENvdW50KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUGFydGljbGVGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEqIGNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCwgaW50IHJlamVjdE1hdGNoZXMsIGludCBjb25uZWN0aXZpdHk4KTsKK0lNQVFfRlVOQyBQYXJ0aWNsZVJlcG9ydCogICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0UGFydGljbGVJbmZvKEltYWdlKiBpbWFnZSwgaW50IGNvbm5lY3Rpdml0eTgsIFBhcnRpY2xlSW5mb01vZGUgbW9kZSwgaW50KiByZXBvcnRDb3VudCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNhbGNDb2VmZihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBhcnRpY2xlUmVwb3J0KiByZXBvcnQsIE1lYXN1cmVtZW50VmFsdWUgcGFyYW1ldGVyLCBmbG9hdCogY29lZmZpY2llbnQpOworSU1BUV9GVU5DIEVkZ2VSZXBvcnQqICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFFZGdlVG9vbChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsIGNvbnN0IEVkZ2VPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bUVkZ2VzKTsKK0lNQVFfRlVOQyBDaXJjbGVSZXBvcnQqICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ2lyY2xlcyhJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgbWluUmFkaXVzLCBmbG9hdCBtYXhSYWRpdXMsIGludCogbnVtQ2lyY2xlcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxhYmVsKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgY29ubmVjdGl2aXR5OCwgaW50KiBwYXJ0aWNsZUNvdW50KTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRml0RWxsaXBzZShjb25zdCBQb2ludEZsb2F0KiBwb2ludHMsIGludCBudW1Qb2ludHMsIEJlc3RFbGxpcHNlKiBlbGxpcHNlKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRml0Q2lyY2xlKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bVBvaW50cywgQmVzdENpcmNsZSogY2lyY2xlKTsKK0lNQVFfRlVOQyBDb2xvciAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ2hhbmdlQ29sb3JTcGFjZShjb25zdCBDb2xvciogc291cmNlQ29sb3IsIENvbG9yTW9kZSBzb3VyY2VTcGFjZSwgQ29sb3JNb2RlIGRlc3RTcGFjZSk7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1hdGNoUGF0dGVybihjb25zdCBJbWFnZSogaW1hZ2UsIEltYWdlKiBwYXR0ZXJuLCBjb25zdCBNYXRjaFBhdHRlcm5PcHRpb25zKiBvcHRpb25zLCBSZWN0IHNlYXJjaFJlY3QsIGludCogbnVtTWF0Y2hlcyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnZleChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUlzVmlzaW9uSW5mb1ByZXNlbnQoY29uc3QgSW1hZ2UqIGltYWdlLCBWaXNpb25JbmZvVHlwZSB0eXBlLCBpbnQqIHByZXNlbnQpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFMaW5lR2F1Z2VUb29sKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCwgTGluZUdhdWdlTWV0aG9kIG1ldGhvZCwgY29uc3QgRWRnZU9wdGlvbnMqIGVkZ2VPcHRpb25zLCBjb25zdCBDb29yZGluYXRlVHJhbnNmb3JtKiByZWZlcmVuY2UsIGZsb2F0KiBkaXN0YW5jZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUJlc3RDaXJjbGUoY29uc3QgUG9pbnRGbG9hdCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBQb2ludEZsb2F0KiBjZW50ZXIsIGRvdWJsZSogcmFkaXVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2F2ZVBhdHRlcm4oY29uc3QgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IGNoYXIqIGZpbGVOYW1lKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTG9hZFBhdHRlcm4oSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IGNoYXIqIGZpbGVOYW1lKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxVHJhbnNmb3JtUk9JKFJPSSogcm9pLCBQb2ludCBvcmlnaW5TdGFydCwgZmxvYXQgYW5nbGVTdGFydCwgUG9pbnQgb3JpZ2luRmluYWwsIGZsb2F0IGFuZ2xlRmluYWwpOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFDb29yZGluYXRlUmVmZXJlbmNlKGNvbnN0IFBvaW50KiBwb2ludHMsIFJlZmVyZW5jZU1vZGUgbW9kZSwgUG9pbnQqIG9yaWdpbiwgZmxvYXQqIGFuZ2xlKTsKK0lNQVFfRlVOQyBDb250b3VySW5mbyogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxR2V0Q29udG91ckluZm8oY29uc3QgUk9JKiByb2ksIENvbnRvdXJJRCBpZCk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd092ZXJsYXkoaW50IHdpbmRvd051bWJlciwgY29uc3QgT3ZlcmxheSogb3ZlcmxheSk7CitJTUFRX0ZVTkMgT3ZlcmxheSogICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNyZWF0ZU92ZXJsYXlGcm9tUk9JKGNvbnN0IFJPSSogcm9pKTsKK0lNQVFfRlVOQyBPdmVybGF5KiAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ3JlYXRlT3ZlcmxheUZyb21NZXRhZmlsZShjb25zdCB2b2lkKiBtZXRhZmlsZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNldENhbGlicmF0aW9uSW5mbyhJbWFnZSogaW1hZ2UsIENhbGlicmF0aW9uVW5pdCB1bml0LCBmbG9hdCB4RGlzdGFuY2UsIGZsb2F0IHlEaXN0YW5jZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldENhbGlicmF0aW9uSW5mbyhjb25zdCBJbWFnZSogaW1hZ2UsIENhbGlicmF0aW9uVW5pdCogdW5pdCwgZmxvYXQqIHhEaXN0YW5jZSwgZmxvYXQqIHlEaXN0YW5jZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnN0cnVjdFJPSShjb25zdCBJbWFnZSogaW1hZ2UsIFJPSSogcm9pLCBUb29sIGluaXRpYWxUb29sLCBjb25zdCBUb29sV2luZG93T3B0aW9ucyogdG9vbHMsIGNvbnN0IENvbnN0cnVjdFJPSU9wdGlvbnMqIG9wdGlvbnMsIGludCogb2theSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnMoY29uc3QgQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zKiBwcmVwcm9jZXNzaW5nT3B0aW9ucywgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVpvb21XaW5kb3coaW50IHdpbmRvd051bWJlciwgaW50IHhab29tLCBpbnQgeVpvb20sIFBvaW50IGNlbnRlcik7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd1pvb20oaW50IHdpbmRvd051bWJlciwgaW50KiB4Wm9vbSwgaW50KiB5Wm9vbSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVBhcnRpY2xlRmlsdGVyMyhJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCwgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zKiBvcHRpb25zLCBjb25zdCBST0kqIHJvaSwgaW50KiBudW1QYXJ0aWNsZXMpOworSU1BUV9GVU5DIFJlYWRUZXh0UmVwb3J0MiogICAgICAgSU1BUV9TVERDQUxMIGltYXFSZWFkVGV4dDIoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBDaGFyU2V0KiBzZXQsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBSZWFkVGV4dE9wdGlvbnMqIHJlYWRPcHRpb25zLCBjb25zdCBPQ1JQcm9jZXNzaW5nT3B0aW9ucyogcHJvY2Vzc2luZ09wdGlvbnMsIGNvbnN0IE9DUlNwYWNpbmdPcHRpb25zKiBzcGFjaW5nT3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxlYXJuUGF0dGVybjIoSW1hZ2UqIGltYWdlLCBMZWFybmluZ01vZGUgbGVhcm5pbmdNb2RlLCBMZWFyblBhdHRlcm5BZHZhbmNlZE9wdGlvbnMqIGFkdmFuY2VkT3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUNvbnZvbHZlKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBmbG9hdCoga2VybmVsLCBpbnQgbWF0cml4Um93cywgaW50IG1hdHJpeENvbHMsIGZsb2F0IG5vcm1hbGl6ZSwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCAgICAgICAgICAgICAgICAgICAgSU1BUV9TVERDQUxMIGltYXFEaXZpZGVDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcURpdmlkZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBFZGdlUmVwb3J0MiogICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxRWRnZVRvb2wzKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIEVkZ2VQcm9jZXNzIHByb2Nlc3NUeXBlLCBjb25zdCBFZGdlT3B0aW9uczIqIGVkZ2VPcHRpb25zKTsKK0lNQVFfRlVOQyBDb25jZW50cmljUmFrZVJlcG9ydCogIElNQVFfU1REQ0FMTCBpbWFxQ29uY2VudHJpY1Jha2UoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgQ29uY2VudHJpY1Jha2VEaXJlY3Rpb24gZGlyZWN0aW9uLCBFZGdlUHJvY2VzcyBwcm9jZXNzLCBjb25zdCBSYWtlT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgU3Bva2VSZXBvcnQqICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVNwb2tlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIFNwb2tlRGlyZWN0aW9uIGRpcmVjdGlvbiwgRWRnZVByb2Nlc3MgcHJvY2VzcywgY29uc3QgU3Bva2VPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGVhcm5QYXR0ZXJuKEltYWdlKiBpbWFnZSwgTGVhcm5pbmdNb2RlIGxlYXJuaW5nTW9kZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUxvb2t1cChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3Qgc2hvcnQqIHRhYmxlLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcU1hdGNoUGF0dGVybjIoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBJbWFnZSogcGF0dGVybiwgY29uc3QgTWF0Y2hQYXR0ZXJuT3B0aW9ucyogb3B0aW9ucywgY29uc3QgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE9wdGlvbnMsIFJlY3Qgc2VhcmNoUmVjdCwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxU2V0UGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucyhDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnMqIHByZXByb2Nlc3NpbmdPcHRpb25zLCBjb25zdCBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgICAgICAgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQ29weUNhbGlicmF0aW9uSW5mbyhJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcVBhcnRpY2xlRmlsdGVyMihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCwgaW50IHJlamVjdE1hdGNoZXMsIGludCBjb25uZWN0aXZpdHk4LCBpbnQqIG51bVBhcnRpY2xlcyk7CitJTUFRX0ZVTkMgRWRnZVJlcG9ydCogICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUVkZ2VUb29sMihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsIEVkZ2VQcm9jZXNzIHByb2Nlc3MsIGNvbnN0IEVkZ2VPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bUVkZ2VzKTsKK0lNQVFfRlVOQyBDb250b3VySUQgICAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxQWRkUm90YXRlZFJlY3RDb250b3VyKFJPSSogcm9pLCBSb3RhdGVkUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBCYXJjb2RlMkRJbmZvKiAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVhZERhdGFNYXRyaXhCYXJjb2RlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IERhdGFNYXRyaXhPcHRpb25zKiBvcHRpb25zLCB1bnNpZ25lZCBpbnQqIG51bUJhcmNvZGVzKTsKK0lNQVFfRlVOQyBMaW5lYXJBdmVyYWdlcyogICAgICAgIElNQVFfU1REQ0FMTCBpbWFxTGluZWFyQXZlcmFnZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIEdlb21ldHJpY1BhdHRlcm5NYXRjaCogSU1BUV9TVERDQUxMIGltYXFNYXRjaEdlb21ldHJpY1BhdHRlcm4oY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBJbWFnZSogcGF0dGVybiwgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnMqIG1hdGNoT3B0aW9ucywgY29uc3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE1hdGNoT3B0aW9ucywgY29uc3QgUk9JKiByb2ksIGludCogbnVtTWF0Y2hlcyk7CitJTUFRX0ZVTkMgQ2hhckluZm8qICAgICAgICAgICAgICBJTUFRX1NURENBTEwgaW1hcUdldENoYXJJbmZvKGNvbnN0IENoYXJTZXQqIHNldCwgaW50IGluZGV4KTsKK0lNQVFfRlVOQyBSZWFkVGV4dFJlcG9ydCogICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmVhZFRleHQoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBDaGFyU2V0KiBzZXQsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBSZWFkVGV4dE9wdGlvbnMqIHJlYWRPcHRpb25zLCBjb25zdCBPQ1JQcm9jZXNzaW5nT3B0aW9ucyogcHJvY2Vzc2luZ09wdGlvbnMsIGNvbnN0IE9DUlNwYWNpbmdPcHRpb25zKiBzcGFjaW5nT3B0aW9ucyk7CitJTUFRX0ZVTkMgVGhyZXNob2xkRGF0YSogICAgICAgICBJTUFRX1NURENBTEwgaW1hcUF1dG9UaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBudW1DbGFzc2VzLCBUaHJlc2hvbGRNZXRob2QgbWV0aG9kKTsKK0lNQVFfRlVOQyBDb2xvckhpc3RvZ3JhbVJlcG9ydCogIElNQVFfU1REQ0FMTCBpbWFxQ29sb3JIaXN0b2dyYW0oSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywgQ29sb3JNb2RlIG1vZGUsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBSYWtlUmVwb3J0KiAgICAgICAgICAgIElNQVFfU1REQ0FMTCBpbWFxUmFrZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBSYWtlRGlyZWN0aW9uIGRpcmVjdGlvbiwgRWRnZVByb2Nlc3MgcHJvY2VzcywgY29uc3QgUmFrZU9wdGlvbnMqIG9wdGlvbnMpOworCitJTUFRX0ZVTkMgaW50ICAgICAgICAgICAgICAgICAgICBJTUFRX1NURENBTEwgUHJpdl9SZWFkSlBFR1N0cmluZ19DKEltYWdlKiBpbWFnZSwgY29uc3QgdW5zaWduZWQgY2hhciogc3RyaW5nLCB1bnNpZ25lZCBpbnQgc3RyaW5nTGVuZ3RoKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9wY3JlLmggYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvaW5jbHVkZS9wY3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZGNiZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9pbmNsdWRlL3BjcmUuaApAQCAtMCwwICsxLDMzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgUGVybC1Db21wYXRpYmxlIFJlZ3VsYXIgRXhwcmVzc2lvbnMgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIGlzIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUgZm9yIHRoZSBQQ1JFIGxpYnJhcnksIHRvIGJlICNpbmNsdWRlZCBieQorYXBwbGljYXRpb25zIHRoYXQgY2FsbCB0aGUgUENSRSBmdW5jdGlvbnMuCisKKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDggVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAgICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKK0FSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKK1NVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0NPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCitBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfUENSRV9ICisjZGVmaW5lIF9QQ1JFX0gKKworLyogVGhlIGN1cnJlbnQgUENSRSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAqLworCisjZGVmaW5lIFBDUkVfTUFKT1IgICAgICAgICAgNworI2RlZmluZSBQQ1JFX01JTk9SICAgICAgICAgIDgKKyNkZWZpbmUgUENSRV9QUkVSRUxFQVNFICAgICAKKyNkZWZpbmUgUENSRV9EQVRFICAgICAgICAgICAyMDA4LTA5LTA1CisKKy8qIFdoZW4gYW4gYXBwbGljYXRpb24gbGlua3MgdG8gYSBQQ1JFIERMTCBpbiBXaW5kb3dzLCB0aGUgc3ltYm9scyB0aGF0IGFyZQoraW1wb3J0ZWQgaGF2ZSB0byBiZSBpZGVudGlmaWVkIGFzIHN1Y2guIFdoZW4gYnVpbGRpbmcgUENSRSwgdGhlIGFwcHJvcHJpYXRlCitleHBvcnQgc2V0dGluZyBpcyBkZWZpbmVkIGluIHBjcmVfaW50ZXJuYWwuaCwgd2hpY2ggaW5jbHVkZXMgdGhpcyBmaWxlLiBTbyB3ZQorZG9uJ3QgY2hhbmdlIGV4aXN0aW5nIGRlZmluaXRpb25zIG9mIFBDUkVfRVhQX0RFQ0wgYW5kIFBDUkVDUFBfRVhQX0RFQ0wuICovCisKKy8qKgorICogTkkgQ0hBTkdFCisgKgorICogV2UgZG9uJ3QgYnVpbGQgdGhlIERMTCB2ZXJzaW9uLiBXZSBvbmx5IGJ1aWxkIHRoZSBzdGF0aWMgbGliIHZlcnNpb24uCisgKiBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIGhhdmUgdG8gI2RlZmluZSBQQ1JFX1NUQVRJQyBpbiBldmVyeSBjb21wb25lbnQgdGhhdAorICogaW5jbHVkZXMgcGNyZS5oLCB3ZSdyZSBqdXN0IGdvaW5nIHRvIGdvIGFoZWFkIGFuZCBkZWZpbmUgaXQgaGVyZS4KKyAqCisgKiBBZGFtIEtlbXAsIDEyLzE1LzIwMDgKKyovCisjZGVmaW5lIFBDUkVfU1RBVElDCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoUENSRV9TVEFUSUMpCisjICBpZm5kZWYgUENSRV9FWFBfREVDTAorIyAgICBkZWZpbmUgUENSRV9FWFBfREVDTCAgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgZW5kaWYKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgIGlmbmRlZiBQQ1JFQ1BQX0VYUF9ERUNMCisjICAgICAgZGVmaW5lIFBDUkVDUFBfRVhQX0RFQ0wgIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIFBDUkVDUFBfRVhQX0RFRk4KKyMgICAgICBkZWZpbmUgUENSRUNQUF9FWFBfREVGTiAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qIEJ5IGRlZmF1bHQsIHdlIHVzZSB0aGUgc3RhbmRhcmQgImV4dGVybiIgZGVjbGFyYXRpb25zLiAqLworCisjaWZuZGVmIFBDUkVfRVhQX0RFQ0wKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgIGRlZmluZSBQQ1JFX0VYUF9ERUNMICBleHRlcm4gIkMiCisjICBlbHNlCisjICAgIGRlZmluZSBQQ1JFX0VYUF9ERUNMICBleHRlcm4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjICBpZm5kZWYgUENSRUNQUF9FWFBfREVDTAorIyAgICBkZWZpbmUgUENSRUNQUF9FWFBfREVDTCAgZXh0ZXJuCisjICBlbmRpZgorIyAgaWZuZGVmIFBDUkVDUFBfRVhQX0RFRk4KKyMgICAgZGVmaW5lIFBDUkVDUFBfRVhQX0RFRk4KKyMgIGVuZGlmCisjZW5kaWYKKworLyoqCisgKiBOSSBDSEFOR0UKKyAqCisgKiBXZSB1c2UgX19jZGVjbCBvbiB3aW4zMiBhbmQgdGhlIGRlZmF1bHQgY2FsbGluZyBjb252ZW50aW9uIGVsc2V3aGVyZS4KKyAqCisgKiBPcmlnaW5hbGwgdGhpcyBtYWNybyBkaWQgbm90IGFwcGVhciBpbiB0aGlzIGZpbGUsIGJ1dCBpdCB3YXMgdXNlZCBpbgorICogaW50ZXJuYWwgaGVhZGVycy4gSSBjb25zaWRlciBpdCBhbiBvdmVyc2lnaHQgb24gdGhlIHBhcnQgb2YgdGhlIHBjcmUKKyAqIGRldmVsb3BlcnMgdGhhdCAqIGl0IHdhcyBub3QgdXNlZCBpbiB0aGlzIGZpbGUuIElmIHRoZXNlIGZ1bmN0aW9ucyB1c2UKKyAqIHNwZWNpZmljIGNhbGxpbmcgY29udmVudGlvbnMgdGhlbiB0aGVpciBwcm90b3R5cGVzIHNob3VsZCBpbmNsdWRlIHRoYXQKKyAqIGNhbGxpbmcgY29udmVudGlvbiBpbiBjYXNlIHNvbWUgb3RoZXIgcHJvamVjdCB1c2VzIGEgZGlmZmVyZW50IGRlZmF1bHQuCisgKgorICogQWRhbSBLZW1wIDEyLzE1LzIwMDgKKyovCisjaWZuZGVmIFBDUkVfQ0FMTF9DT05WRU5USU9OCisjICBpZiBkZWZpbmVkKF9XSU4zMikgLyogMzItYml0IGFuZCA2NC1iaXQgKi8KKyMgICAgZGVmaW5lIFBDUkVfQ0FMTF9DT05WRU5USU9OIF9fY2RlY2wKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFBDUkVfQ0FMTF9DT05WRU5USU9OCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBQQ1JFX0NBTExfQ09OVkVOVElPTgorI2VuZGlmCisKKy8qIEhhdmUgdG8gaW5jbHVkZSBzdGRsaWIuaCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBzaXplX3QgaXMgZGVmaW5lZDsKK2l0IGlzIG5lZWRlZCBoZXJlIGZvciBtYWxsb2MuICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogQWxsb3cgZm9yIEMrKyB1c2VycyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIE9wdGlvbnMgKi8KKworI2RlZmluZSBQQ1JFX0NBU0VMRVNTICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFBDUkVfTVVMVElMSU5FICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUENSRV9ET1RBTEwgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBQQ1JFX0VYVEVOREVEICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBDUkVfQU5DSE9SRUQgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgUENSRV9ET0xMQVJfRU5ET05MWSAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBQQ1JFX0VYVFJBICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFBDUkVfTk9UQk9MICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUENSRV9OT1RFT0wgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBQQ1JFX1VOR1JFRURZICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBDUkVfTk9URU1QVFkgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUENSRV9VVEY4ICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBQQ1JFX05PX0FVVE9fQ0FQVFVSRSAgICAweDAwMDAxMDAwCisjZGVmaW5lIFBDUkVfTk9fVVRGOF9DSEVDSyAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUENSRV9BVVRPX0NBTExPVVQgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBQQ1JFX1BBUlRJQUwgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFBDUkVfREZBX1NIT1JURVNUICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgUENSRV9ERkFfUkVTVEFSVCAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBQQ1JFX0ZJUlNUTElORSAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFBDUkVfRFVQTkFNRVMgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgUENSRV9ORVdMSU5FX0NSICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBQQ1JFX05FV0xJTkVfTEYgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFBDUkVfTkVXTElORV9DUkxGICAgICAgIDB4MDAzMDAwMDAKKyNkZWZpbmUgUENSRV9ORVdMSU5FX0FOWSAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBQQ1JFX05FV0xJTkVfQU5ZQ1JMRiAgICAweDAwNTAwMDAwCisjZGVmaW5lIFBDUkVfQlNSX0FOWUNSTEYgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgUENSRV9CU1JfVU5JQ09ERSAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBQQ1JFX0pBVkFTQ1JJUFRfQ09NUEFUICAweDAyMDAwMDAwCisKKy8qIEV4ZWMtdGltZSBhbmQgZ2V0L3NldC10aW1lIGVycm9yIGNvZGVzICovCisKKyNkZWZpbmUgUENSRV9FUlJPUl9OT01BVENIICAgICAgICAgKC0xKQorI2RlZmluZSBQQ1JFX0VSUk9SX05VTEwgICAgICAgICAgICAoLTIpCisjZGVmaW5lIFBDUkVfRVJST1JfQkFET1BUSU9OICAgICAgICgtMykKKyNkZWZpbmUgUENSRV9FUlJPUl9CQURNQUdJQyAgICAgICAgKC00KQorI2RlZmluZSBQQ1JFX0VSUk9SX1VOS05PV05fT1BDT0RFICAoLTUpCisjZGVmaW5lIFBDUkVfRVJST1JfVU5LTk9XTl9OT0RFICAgICgtNSkgIC8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFBDUkVfRVJST1JfTk9NRU1PUlkgICAgICAgICgtNikKKyNkZWZpbmUgUENSRV9FUlJPUl9OT1NVQlNUUklORyAgICAgKC03KQorI2RlZmluZSBQQ1JFX0VSUk9SX01BVENITElNSVQgICAgICAoLTgpCisjZGVmaW5lIFBDUkVfRVJST1JfQ0FMTE9VVCAgICAgICAgICgtOSkgIC8qIE5ldmVyIHVzZWQgYnkgUENSRSBpdHNlbGYgKi8KKyNkZWZpbmUgUENSRV9FUlJPUl9CQURVVEY4ICAgICAgICAoLTEwKQorI2RlZmluZSBQQ1JFX0VSUk9SX0JBRFVURjhfT0ZGU0VUICgtMTEpCisjZGVmaW5lIFBDUkVfRVJST1JfUEFSVElBTCAgICAgICAgKC0xMikKKyNkZWZpbmUgUENSRV9FUlJPUl9CQURQQVJUSUFMICAgICAoLTEzKQorI2RlZmluZSBQQ1JFX0VSUk9SX0lOVEVSTkFMICAgICAgICgtMTQpCisjZGVmaW5lIFBDUkVfRVJST1JfQkFEQ09VTlQgICAgICAgKC0xNSkKKyNkZWZpbmUgUENSRV9FUlJPUl9ERkFfVUlURU0gICAgICAoLTE2KQorI2RlZmluZSBQQ1JFX0VSUk9SX0RGQV9VQ09ORCAgICAgICgtMTcpCisjZGVmaW5lIFBDUkVfRVJST1JfREZBX1VNTElNSVQgICAgKC0xOCkKKyNkZWZpbmUgUENSRV9FUlJPUl9ERkFfV1NTSVpFICAgICAoLTE5KQorI2RlZmluZSBQQ1JFX0VSUk9SX0RGQV9SRUNVUlNFICAgICgtMjApCisjZGVmaW5lIFBDUkVfRVJST1JfUkVDVVJTSU9OTElNSVQgKC0yMSkKKyNkZWZpbmUgUENSRV9FUlJPUl9OVUxMV1NMSU1JVCAgICAoLTIyKSAgLyogTm8gbG9uZ2VyIGFjdHVhbGx5IHVzZWQgKi8KKyNkZWZpbmUgUENSRV9FUlJPUl9CQURORVdMSU5FICAgICAoLTIzKQorCisvKiBSZXF1ZXN0IHR5cGVzIGZvciBwY3JlX2Z1bGxpbmZvKCkgKi8KKworI2RlZmluZSBQQ1JFX0lORk9fT1BUSU9OUyAgICAgICAgICAgIDAKKyNkZWZpbmUgUENSRV9JTkZPX1NJWkUgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBDUkVfSU5GT19DQVBUVVJFQ09VTlQgICAgICAgMgorI2RlZmluZSBQQ1JFX0lORk9fQkFDS1JFRk1BWCAgICAgICAgIDMKKyNkZWZpbmUgUENSRV9JTkZPX0ZJUlNUQllURSAgICAgICAgICA0CisjZGVmaW5lIFBDUkVfSU5GT19GSVJTVENIQVIgICAgICAgICAgNCAgLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFBDUkVfSU5GT19GSVJTVFRBQkxFICAgICAgICAgNQorI2RlZmluZSBQQ1JFX0lORk9fTEFTVExJVEVSQUwgICAgICAgIDYKKyNkZWZpbmUgUENSRV9JTkZPX05BTUVFTlRSWVNJWkUgICAgICA3CisjZGVmaW5lIFBDUkVfSU5GT19OQU1FQ09VTlQgICAgICAgICAgOAorI2RlZmluZSBQQ1JFX0lORk9fTkFNRVRBQkxFICAgICAgICAgIDkKKyNkZWZpbmUgUENSRV9JTkZPX1NUVURZU0laRSAgICAgICAgIDEwCisjZGVmaW5lIFBDUkVfSU5GT19ERUZBVUxUX1RBQkxFUyAgICAxMQorI2RlZmluZSBQQ1JFX0lORk9fT0tQQVJUSUFMICAgICAgICAgMTIKKyNkZWZpbmUgUENSRV9JTkZPX0pDSEFOR0VEICAgICAgICAgIDEzCisjZGVmaW5lIFBDUkVfSU5GT19IQVNDUk9STEYgICAgICAgICAxNAorCisvKiBSZXF1ZXN0IHR5cGVzIGZvciBwY3JlX2NvbmZpZygpLiBEbyBub3QgcmUtYXJyYW5nZSwgaW4gb3JkZXIgdG8gcmVtYWluCitjb21wYXRpYmxlLiAqLworCisjZGVmaW5lIFBDUkVfQ09ORklHX1VURjggICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUENSRV9DT05GSUdfTkVXTElORSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQ1JFX0NPTkZJR19MSU5LX1NJWkUgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBDUkVfQ09ORklHX1BPU0lYX01BTExPQ19USFJFU0hPTEQgIDMKKyNkZWZpbmUgUENSRV9DT05GSUdfTUFUQ0hfTElNSVQgICAgICAgICAgICAgNAorI2RlZmluZSBQQ1JFX0NPTkZJR19TVEFDS1JFQ1VSU0UgICAgICAgICAgICA1CisjZGVmaW5lIFBDUkVfQ09ORklHX1VOSUNPREVfUFJPUEVSVElFUyAgICAgIDYKKyNkZWZpbmUgUENSRV9DT05GSUdfTUFUQ0hfTElNSVRfUkVDVVJTSU9OICAgNworI2RlZmluZSBQQ1JFX0NPTkZJR19CU1IgICAgICAgICAgICAgICAgICAgICA4CisKKy8qIEJpdCBmbGFncyBmb3IgdGhlIHBjcmVfZXh0cmEgc3RydWN0dXJlLiBEbyBub3QgcmUtYXJyYW5nZSBvciByZWRlZmluZQordGhlc2UgYml0cywganVzdCBhZGQgbmV3IG9uZXMgb24gdGhlIGVuZCwgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUuICovCisKKyNkZWZpbmUgUENSRV9FWFRSQV9TVFVEWV9EQVRBICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQQ1JFX0VYVFJBX01BVENIX0xJTUlUICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBDUkVfRVhUUkFfQ0FMTE9VVF9EQVRBICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUENSRV9FWFRSQV9UQUJMRVMgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBQQ1JFX0VYVFJBX01BVENIX0xJTUlUX1JFQ1VSU0lPTiAgMHgwMDEwCisKKy8qIFR5cGVzICovCisKK3N0cnVjdCByZWFsX3BjcmU7ICAgICAgICAgICAgICAgICAvKiBkZWNsYXJhdGlvbjsgdGhlIGRlZmluaXRpb24gaXMgcHJpdmF0ZSAgKi8KK3R5cGVkZWYgc3RydWN0IHJlYWxfcGNyZSBwY3JlOworCisvKiBXaGVuIFBDUkUgaXMgY29tcGlsZWQgYXMgYSBDKysgbGlicmFyeSwgdGhlIHN1YmplY3QgcG9pbnRlciB0eXBlIGNhbiBiZQorcmVwbGFjZWQgd2l0aCBhIGN1c3RvbSB0eXBlLiBGb3IgY29udmVudGlvbmFsIHVzZSwgdGhlIHB1YmxpYyBpbnRlcmZhY2UgaXMgYQorY29uc3QgY2hhciAqLiAqLworCisjaWZuZGVmIFBDUkVfU1BUUgorI2RlZmluZSBQQ1JFX1NQVFIgY29uc3QgY2hhciAqCisjZW5kaWYKKworLyogVGhlIHN0cnVjdHVyZSBmb3IgcGFzc2luZyBhZGRpdGlvbmFsIGRhdGEgdG8gcGNyZV9leGVjKCkuIFRoaXMgaXMgZGVmaW5lZCBpbgorc3VjaCBhcyB3YXkgYXMgdG8gYmUgZXh0ZW5zaWJsZS4gQWx3YXlzIGFkZCBuZXcgZmllbGRzIGF0IHRoZSBlbmQsIGluIG9yZGVyIHRvCityZW1haW4gY29tcGF0aWJsZS4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgcGNyZV9leHRyYSB7CisgIHVuc2lnbmVkIGxvbmcgaW50IGZsYWdzOyAgICAgICAgLyogQml0cyBmb3Igd2hpY2ggZmllbGRzIGFyZSBzZXQgKi8KKyAgdm9pZCAqc3R1ZHlfZGF0YTsgICAgICAgICAgICAgICAvKiBPcGFxdWUgZGF0YSBmcm9tIHBjcmVfc3R1ZHkoKSAqLworICB1bnNpZ25lZCBsb25nIGludCBtYXRjaF9saW1pdDsgIC8qIE1heGltdW0gbnVtYmVyIG9mIGNhbGxzIHRvIG1hdGNoKCkgKi8KKyAgdm9pZCAqY2FsbG91dF9kYXRhOyAgICAgICAgICAgICAvKiBEYXRhIHBhc3NlZCBiYWNrIGluIGNhbGxvdXRzICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhYmxlczsgICAgLyogUG9pbnRlciB0byBjaGFyYWN0ZXIgdGFibGVzICovCisgIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoX2xpbWl0X3JlY3Vyc2lvbjsgLyogTWF4IHJlY3Vyc2l2ZSBjYWxscyB0byBtYXRjaCgpICovCit9IHBjcmVfZXh0cmE7CisKKy8qIFRoZSBzdHJ1Y3R1cmUgZm9yIHBhc3Npbmcgb3V0IGRhdGEgdmlhIHRoZSBwY3JlX2NhbGxvdXRfZnVuY3Rpb24uIFdlIHVzZSBhCitzdHJ1Y3R1cmUgc28gdGhhdCBuZXcgZmllbGRzIGNhbiBiZSBhZGRlZCBvbiB0aGUgZW5kIGluIGZ1dHVyZSB2ZXJzaW9ucywKK3dpdGhvdXQgY2hhbmdpbmcgdGhlIEFQSSBvZiB0aGUgZnVuY3Rpb24sIHRoZXJlYnkgYWxsb3dpbmcgb2xkIGNsaWVudHMgdG8gd29yaword2l0aG91dCBtb2RpZmljYXRpb24uICovCisKK3R5cGVkZWYgc3RydWN0IHBjcmVfY2FsbG91dF9ibG9jayB7CisgIGludCAgICAgICAgICB2ZXJzaW9uOyAgICAgICAgICAgLyogSWRlbnRpZmllcyB2ZXJzaW9uIG9mIGJsb2NrICovCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWZXJzaW9uIDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBpbnQgICAgICAgICAgY2FsbG91dF9udW1iZXI7ICAgIC8qIE51bWJlciBjb21waWxlZCBpbnRvIHBhdHRlcm4gKi8KKyAgaW50ICAgICAgICAgKm9mZnNldF92ZWN0b3I7ICAgICAvKiBUaGUgb2Zmc2V0IHZlY3RvciAqLworICBQQ1JFX1NQVFIgICAgc3ViamVjdDsgICAgICAgICAgIC8qIFRoZSBzdWJqZWN0IGJlaW5nIG1hdGNoZWQgKi8KKyAgaW50ICAgICAgICAgIHN1YmplY3RfbGVuZ3RoOyAgICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBzdWJqZWN0ICovCisgIGludCAgICAgICAgICBzdGFydF9tYXRjaDsgICAgICAgLyogT2Zmc2V0IHRvIHN0YXJ0IG9mIHRoaXMgbWF0Y2ggYXR0ZW1wdCAqLworICBpbnQgICAgICAgICAgY3VycmVudF9wb3NpdGlvbjsgIC8qIFdoZXJlIHdlIGN1cnJlbnRseSBhcmUgaW4gdGhlIHN1YmplY3QgKi8KKyAgaW50ICAgICAgICAgIGNhcHR1cmVfdG9wOyAgICAgICAvKiBNYXggY3VycmVudCBjYXB0dXJlICovCisgIGludCAgICAgICAgICBjYXB0dXJlX2xhc3Q7ICAgICAgLyogTW9zdCByZWNlbnRseSBjbG9zZWQgY2FwdHVyZSAqLworICB2b2lkICAgICAgICAqY2FsbG91dF9kYXRhOyAgICAgIC8qIERhdGEgcGFzc2VkIGluIHdpdGggdGhlIGNhbGwgKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBBZGRlZCBmb3IgVmVyc2lvbiAxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIGludCAgICAgICAgICBwYXR0ZXJuX3Bvc2l0aW9uOyAgLyogT2Zmc2V0IHRvIG5leHQgaXRlbSBpbiB0aGUgcGF0dGVybiAqLworICBpbnQgICAgICAgICAgbmV4dF9pdGVtX2xlbmd0aDsgIC8qIExlbmd0aCBvZiBuZXh0IGl0ZW0gaW4gdGhlIHBhdHRlcm4gKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit9IHBjcmVfY2FsbG91dF9ibG9jazsKKworLyogSW5kaXJlY3Rpb24gZm9yIHN0b3JlIGdldCBhbmQgZnJlZSBmdW5jdGlvbnMuIFRoZXNlIGNhbiBiZSBzZXQgdG8KK2FsdGVybmF0aXZlIG1hbGxvYy9mcmVlIGZ1bmN0aW9ucyBpZiByZXF1aXJlZC4gU3BlY2lhbCBvbmVzIGFyZSB1c2VkIGluIHRoZQorbm9uLXJlY3Vyc2l2ZSBjYXNlIGZvciAiZnJhbWVzIi4gVGhlcmUgaXMgYWxzbyBhbiBvcHRpb25hbCBjYWxsb3V0IGZ1bmN0aW9uCit0aGF0IGlzIHRyaWdnZXJlZCBieSB0aGUgKD8pIHJlZ2V4IGl0ZW0uIEZvciBWaXJ0dWFsIFBhc2NhbCwgdGhlc2UgZGVmaW5pdGlvbnMKK2hhdmUgdG8gdGFrZSBhbm90aGVyIGZvcm0uICovCisKKyNpZm5kZWYgVlBDT01QQVQKK1BDUkVfRVhQX0RFQ0wgdm9pZCogKFBDUkVfQ0FMTF9DT05WRU5USU9OICpwY3JlX21hbGxvYykoc2l6ZV90KTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCAgKFBDUkVfQ0FMTF9DT05WRU5USU9OICpwY3JlX2ZyZWUpKHZvaWQgKik7CitQQ1JFX0VYUF9ERUNMIHZvaWQqIChQQ1JFX0NBTExfQ09OVkVOVElPTiAqcGNyZV9zdGFja19tYWxsb2MpKHNpemVfdCk7CitQQ1JFX0VYUF9ERUNMIHZvaWQgIChQQ1JFX0NBTExfQ09OVkVOVElPTiAqcGNyZV9zdGFja19mcmVlKSh2b2lkICopOworUENSRV9FWFBfREVDTCBpbnQgICAoUENSRV9DQUxMX0NPTlZFTlRJT04gKnBjcmVfY2FsbG91dCkocGNyZV9jYWxsb3V0X2Jsb2NrICopOworI2Vsc2UgICAvKiBWUENPTVBBVCAqLworUENSRV9FWFBfREVDTCB2b2lkKiBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX21hbGxvYyhzaXplX3QpOworUENSRV9FWFBfREVDTCB2b2lkICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2ZyZWUodm9pZCAqKTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCogUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9zdGFja19tYWxsb2Moc2l6ZV90KTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9zdGFja19mcmVlKHZvaWQgKik7CitQQ1JFX0VYUF9ERUNMIGludCAgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfY2FsbG91dChwY3JlX2NhbGxvdXRfYmxvY2sgKik7CisjZW5kaWYgIC8qIFZQQ09NUEFUICovCisKKy8qIEV4cG9ydGVkIFBDUkUgZnVuY3Rpb25zICovCisKK1BDUkVfRVhQX0RFQ0wgcGNyZSogUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9jb21waWxlKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICoqLCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7CitQQ1JFX0VYUF9ERUNMIHBjcmUqIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfY29tcGlsZTIoY29uc3QgY2hhciAqLCBpbnQsIGludCAqLCBjb25zdCBjaGFyICoqLAorICAgICAgICAgICAgICAgICAgaW50ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7CitQQ1JFX0VYUF9ERUNMIGludCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9jb25maWcoaW50LCB2b2lkICopOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfY29weV9uYW1lZF9zdWJzdHJpbmcoY29uc3QgcGNyZSAqLCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICBpbnQgKiwgaW50LCBjb25zdCBjaGFyICosIGNoYXIgKiwgaW50KTsKK1BDUkVfRVhQX0RFQ0wgaW50ICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2NvcHlfc3Vic3RyaW5nKGNvbnN0IGNoYXIgKiwgaW50ICosIGludCwgaW50LCBjaGFyICosCisgICAgICAgICAgICAgICAgICBpbnQpOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZGZhX2V4ZWMoY29uc3QgcGNyZSAqLCBjb25zdCBwY3JlX2V4dHJhICosCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGludCAqLCBpbnQgLCBpbnQgKiwgaW50KTsKK1BDUkVfRVhQX0RFQ0wgaW50ICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2V4ZWMoY29uc3QgcGNyZSAqLCBjb25zdCBwY3JlX2V4dHJhICosIFBDUkVfU1BUUiwKKyAgICAgICAgICAgICAgICAgICBpbnQsIGludCwgaW50LCBpbnQgKiwgaW50KTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2ZyZWVfc3Vic3RyaW5nKGNvbnN0IGNoYXIgKik7CitQQ1JFX0VYUF9ERUNMIHZvaWQgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9mcmVlX3N1YnN0cmluZ19saXN0KGNvbnN0IGNoYXIgKiopOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZnVsbGluZm8oY29uc3QgcGNyZSAqLCBjb25zdCBwY3JlX2V4dHJhICosIGludCwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKik7CitQQ1JFX0VYUF9ERUNMIGludCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9nZXRfbmFtZWRfc3Vic3RyaW5nKGNvbnN0IHBjcmUgKiwgY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgaW50ICosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqKTsKK1BDUkVfRVhQX0RFQ0wgaW50ICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2dldF9zdHJpbmdudW1iZXIoY29uc3QgcGNyZSAqLCBjb25zdCBjaGFyICopOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZ2V0X3N0cmluZ3RhYmxlX2VudHJpZXMoY29uc3QgcGNyZSAqLCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICBjaGFyICoqLCBjaGFyICoqKTsKK1BDUkVfRVhQX0RFQ0wgaW50ICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2dldF9zdWJzdHJpbmcoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqKTsKK1BDUkVfRVhQX0RFQ0wgaW50ICBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2dldF9zdWJzdHJpbmdfbGlzdChjb25zdCBjaGFyICosIGludCAqLCBpbnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqKik7CitQQ1JFX0VYUF9ERUNMIGludCAgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9pbmZvKGNvbnN0IHBjcmUgKiwgaW50ICosIGludCAqKTsKK1BDUkVfRVhQX0RFQ0wgY29uc3QgdW5zaWduZWQgY2hhciogUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9tYWtldGFibGVzKHZvaWQpOworUENSRV9FWFBfREVDTCBpbnQgIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfcmVmY291bnQocGNyZSAqLCBpbnQpOworUENSRV9FWFBfREVDTCBwY3JlX2V4dHJhKiBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX3N0dWR5KGNvbnN0IHBjcmUgKiwgaW50LCBjb25zdCBjaGFyICoqKTsKK1BDUkVfRVhQX0RFQ0wgY29uc3QgY2hhciogUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV92ZXJzaW9uKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogRW5kIG9mIHBjcmUuaCAqLwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BRFhMMzQ1X0kyQy5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FEWEwzNDVfSTJDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdjZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BRFhMMzQ1X0kyQy5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkFEWEwzNDVfSTJDLmgiCisjaW5jbHVkZSAiSTJDLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKK2NvbnN0IHVpbnQ4X3QgQURYTDM0NV9JMkM6OmtBZGRyZXNzOworY29uc3QgdWludDhfdCBBRFhMMzQ1X0kyQzo6a1Bvd2VyQ3RsUmVnaXN0ZXI7Citjb25zdCB1aW50OF90IEFEWEwzNDVfSTJDOjprRGF0YUZvcm1hdFJlZ2lzdGVyOworY29uc3QgdWludDhfdCBBRFhMMzQ1X0kyQzo6a0RhdGFSZWdpc3RlcjsKK2NvbnN0ZXhwciBkb3VibGUgQURYTDM0NV9JMkM6OmtHc1BlckxTQjsKKworLyoqCisgKiBDb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgSTJDIHBvcnQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMgYXR0YWNoZWQgdG8KKyAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgKCsgb3IgLSkgdGhhdCB0aGUgYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUuCisgKi8KK0FEWEwzNDVfSTJDOjpBRFhMMzQ1X0kyQyhQb3J0IHBvcnQsIFJhbmdlIHJhbmdlKToKKwkJSTJDKHBvcnQsIGtBZGRyZXNzKQoreworCQkvL21faTJjID0gbmV3IEkyQygoSTJDOjpQb3J0KXBvcnQsIGtBZGRyZXNzKTsKKworCQkvLyBUdXJuIG9uIHRoZSBtZWFzdXJlbWVudHMKKwkJV3JpdGUoa1Bvd2VyQ3RsUmVnaXN0ZXIsIGtQb3dlckN0bF9NZWFzdXJlKTsKKwkJLy8gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgdG8gcmVhZAorCQlTZXRSYW5nZShyYW5nZSk7CisKKwkJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FEWEwzNDUsIEhBTFVzYWdlUmVwb3J0aW5nOjprQURYTDM0NV9JMkMsIDApOworfQorCisvKioKKyAqIERlc3RydWN0b3IuCisgKi8KK0FEWEwzNDVfSTJDOjp+QURYTDM0NV9JMkMoKQoreworCS8vZGVsZXRlIG1faTJjOworCS8vbV9pMmMgPSBOVUxMOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLwordm9pZCBBRFhMMzQ1X0kyQzo6U2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpCit7CisJV3JpdGUoa0RhdGFGb3JtYXRSZWdpc3Rlciwga0RhdGFGb3JtYXRfRnVsbFJlcyB8ICh1aW50OF90KXJhbmdlKTsKK30KKworLyoqIHtAaW5oZXJpdGRvY30gKi8KK2RvdWJsZSBBRFhMMzQ1X0kyQzo6R2V0WCgpCit7CisJcmV0dXJuIEdldEFjY2VsZXJhdGlvbihrQXhpc19YKTsKK30KKworLyoqIHtAaW5oZXJpdGRvY30gKi8KK2RvdWJsZSBBRFhMMzQ1X0kyQzo6R2V0WSgpCit7CisJcmV0dXJuIEdldEFjY2VsZXJhdGlvbihrQXhpc19ZKTsKK30KKworLyoqIHtAaW5oZXJpdGRvY30gKi8KK2RvdWJsZSBBRFhMMzQ1X0kyQzo6R2V0WigpCit7CisJcmV0dXJuIEdldEFjY2VsZXJhdGlvbihrQXhpc19aKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBvbmUgYXhpcyBpbiBHcy4KKyAqCisgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byByZWFkIGZyb20uCisgKiBAcmV0dXJuIEFjY2VsZXJhdGlvbiBvZiB0aGUgQURYTDM0NSBpbiBHcy4KKyAqLworZG91YmxlIEFEWEwzNDVfSTJDOjpHZXRBY2NlbGVyYXRpb24oQURYTDM0NV9JMkM6OkF4ZXMgYXhpcykKK3sKKwlpbnQxNl90IHJhd0FjY2VsID0gMDsKKwkvL2lmKG1faTJjKQorCS8veworCQlSZWFkKGtEYXRhUmVnaXN0ZXIgKyAodWludDhfdClheGlzLCBzaXplb2YocmF3QWNjZWwpLCAodWludDhfdCAqKSZyYXdBY2NlbCk7CisJLy99CisJcmV0dXJuIHJhd0FjY2VsICoga0dzUGVyTFNCOworfQorCisvKioKKyAqIEdldCB0aGUgYWNjZWxlcmF0aW9uIG9mIGFsbCBheGVzIGluIEdzLgorICoKKyAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFjY2VsZXJhdGlvbiBtZWFzdXJlZCBvbiBlYWNoIGF4aXMgb2YgdGhlIEFEWEwzNDUgaW4gR3MuCisgKi8KK0FEWEwzNDVfSTJDOjpBbGxBeGVzIEFEWEwzNDVfSTJDOjpHZXRBY2NlbGVyYXRpb25zKCkKK3sKKwlBbGxBeGVzIGRhdGEgPSBBbGxBeGVzKCk7CisJaW50MTZfdCByYXdEYXRhWzNdOworCS8vaWYgKG1faTJjKQorCS8veworCQlSZWFkKGtEYXRhUmVnaXN0ZXIsIHNpemVvZihyYXdEYXRhKSwgKHVpbnQ4X3QqKXJhd0RhdGEpOworCisJCWRhdGEuWEF4aXMgPSByYXdEYXRhWzBdICoga0dzUGVyTFNCOworCQlkYXRhLllBeGlzID0gcmF3RGF0YVsxXSAqIGtHc1BlckxTQjsKKwkJZGF0YS5aQXhpcyA9IHJhd0RhdGFbMl0gKiBrR3NQZXJMU0I7CisJLy99CisJcmV0dXJuIGRhdGE7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FEWEwzNDVfU1BJLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQURYTDM0NV9TUEkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Yzc5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FEWEwzNDVfU1BJLmNwcApAQCAtMCwwICsxLDE0MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQURYTDM0NV9TUEkuaCIKKyNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKKyNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCisjaW5jbHVkZSAiU1BJLmgiCisKK2NvbnN0IHVpbnQ4X3QgQURYTDM0NV9TUEk6OmtQb3dlckN0bFJlZ2lzdGVyOworY29uc3QgdWludDhfdCBBRFhMMzQ1X1NQSTo6a0RhdGFGb3JtYXRSZWdpc3RlcjsKK2NvbnN0IHVpbnQ4X3QgQURYTDM0NV9TUEk6OmtEYXRhUmVnaXN0ZXI7Citjb25zdGV4cHIgZG91YmxlIEFEWEwzNDVfU1BJOjprR3NQZXJMU0I7CisKKworLyoqCisgKiBDb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgU1BJIHBvcnQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMgYXR0YWNoZWQgdG8KKyAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgKCsgb3IgLSkgdGhhdCB0aGUgYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUuCisgKi8KK0FEWEwzNDVfU1BJOjpBRFhMMzQ1X1NQSShTUEk6OlBvcnQgcG9ydCwgQURYTDM0NV9TUEk6OlJhbmdlIHJhbmdlKQoreworCW1fcG9ydCA9IHBvcnQ7CisJSW5pdChyYW5nZSk7Cit9CisKKy8qKgorICogSW50ZXJuYWwgY29tbW9uIGluaXQgZnVuY3Rpb24uCisgKi8KK3ZvaWQgQURYTDM0NV9TUEk6OkluaXQoUmFuZ2UgcmFuZ2UpCit7CisJCW1fc3BpID0gbmV3IFNQSShtX3BvcnQpOworCQltX3NwaS0+U2V0Q2xvY2tSYXRlKDUwMDAwMCk7CisJCW1fc3BpLT5TZXRNU0JGaXJzdCgpOworCQltX3NwaS0+U2V0U2FtcGxlRGF0YU9uRmFsbGluZygpOworCQltX3NwaS0+U2V0Q2xvY2tBY3RpdmVMb3coKTsKKwkJbV9zcGktPlNldENoaXBTZWxlY3RBY3RpdmVIaWdoKCk7CisKKwkJdWludDhfdCBjb21tYW5kc1syXTsKKwkJLy8gVHVybiBvbiB0aGUgbWVhc3VyZW1lbnRzCisJCWNvbW1hbmRzWzBdID0ga1Bvd2VyQ3RsUmVnaXN0ZXI7CisJCWNvbW1hbmRzWzFdID0ga1Bvd2VyQ3RsX01lYXN1cmU7CisJCW1fc3BpLT5UcmFuc2FjdGlvbihjb21tYW5kcywgY29tbWFuZHMsIDIpOworCisJCVNldFJhbmdlKHJhbmdlKTsKKworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQURYTDM0NSwgSEFMVXNhZ2VSZXBvcnRpbmc6OmtBRFhMMzQ1X1NQSSk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworQURYTDM0NV9TUEk6On5BRFhMMzQ1X1NQSSgpCit7CisJZGVsZXRlIG1fc3BpOworCW1fc3BpID0gTlVMTDsKK30KKworLyoqIHtAaW5oZXJpdGRvY30gKi8KK3ZvaWQgQURYTDM0NV9TUEk6OlNldFJhbmdlKFJhbmdlIHJhbmdlKQoreworCXVpbnQ4X3QgY29tbWFuZHNbMl07CisJCisJLy8gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgdG8gcmVhZAorCWNvbW1hbmRzWzBdID0ga0RhdGFGb3JtYXRSZWdpc3RlcjsKKwljb21tYW5kc1sxXSA9IGtEYXRhRm9ybWF0X0Z1bGxSZXN8ICh1aW50OF90KShyYW5nZSAmIDB4MDMpOworCW1fc3BpLT5UcmFuc2FjdGlvbihjb21tYW5kcywgY29tbWFuZHMsIDIpOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNDVfU1BJOjpHZXRYKCkKK3sKKwlyZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1gpOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNDVfU1BJOjpHZXRZKCkKK3sKKwlyZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1kpOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNDVfU1BJOjpHZXRaKCkKK3sKKwlyZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1opOworfQorCisvKioKKyAqIEdldCB0aGUgYWNjZWxlcmF0aW9uIG9mIG9uZSBheGlzIGluIEdzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQgZnJvbS4KKyAqIEByZXR1cm4gQWNjZWxlcmF0aW9uIG9mIHRoZSBBRFhMMzQ1IGluIEdzLgorICovCitkb3VibGUgQURYTDM0NV9TUEk6OkdldEFjY2VsZXJhdGlvbihBRFhMMzQ1X1NQSTo6QXhlcyBheGlzKQoreworCWludDE2X3QgcmF3QWNjZWwgPSAwOworCWlmKG1fc3BpKQorCXsKKwkJdWludDhfdCBidWZmZXJbM107CisJCXVpbnQ4X3QgY29tbWFuZFszXSA9IHswLDAsMH07CisJCWNvbW1hbmRbMF0gPSAoa0FkZHJlc3NfUmVhZCB8IGtBZGRyZXNzX011bHRpQnl0ZSB8IGtEYXRhUmVnaXN0ZXIpICsgKHVpbnQ4X3QpYXhpczsKKwkJbV9zcGktPlRyYW5zYWN0aW9uKGNvbW1hbmQsIGJ1ZmZlciwgMyk7CisKKwkJLy8gU2Vuc29yIGlzIGxpdHRsZSBlbmRpYW4uLi4gc3dhcCBieXRlcworCQlyYXdBY2NlbCA9IGJ1ZmZlclsyXTw8OCB8IGJ1ZmZlclsxXTsKKwl9CisJcmV0dXJuIHJhd0FjY2VsICoga0dzUGVyTFNCOworfQorCisvKioKKyAqIEdldCB0aGUgYWNjZWxlcmF0aW9uIG9mIGFsbCBheGVzIGluIEdzLgorICoKKyAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFjY2VsZXJhdGlvbiBtZWFzdXJlZCBvbiBlYWNoIGF4aXMgb2YgdGhlIEFEWEwzNDUgaW4gR3MuCisgKi8KK0FEWEwzNDVfU1BJOjpBbGxBeGVzIEFEWEwzNDVfU1BJOjpHZXRBY2NlbGVyYXRpb25zKCkKK3sKKwlBbGxBeGVzIGRhdGEgPSBBbGxBeGVzKCk7CisJdWludDhfdCBkYXRhQnVmZmVyWzddID0gezAsMCwwLDAsMCwwLDB9OworCWludDE2X3QgcmF3RGF0YVszXTsKKwlpZiAobV9zcGkpCisJeworCQkvLyBTZWxlY3QgdGhlIGRhdGEgYWRkcmVzcy4KKwkJZGF0YUJ1ZmZlclswXSA9IChrQWRkcmVzc19SZWFkIHwga0FkZHJlc3NfTXVsdGlCeXRlIHwga0RhdGFSZWdpc3Rlcik7CisJCW1fc3BpLT5UcmFuc2FjdGlvbihkYXRhQnVmZmVyLCBkYXRhQnVmZmVyLCA3KTsKKworCQlmb3IgKGludDMyX3QgaT0wOyBpPDM7IGkrKykKKwkJeworCQkJLy8gU2Vuc29yIGlzIGxpdHRsZSBlbmRpYW4uLi4gc3dhcCBieXRlcworCQkJcmF3RGF0YVtpXSA9IGRhdGFCdWZmZXJbaSoyKzJdIDw8IDggfCBkYXRhQnVmZmVyW2kqMisxXTsKKwkJfQorCisJCWRhdGEuWEF4aXMgPSByYXdEYXRhWzBdICoga0dzUGVyTFNCOworCQlkYXRhLllBeGlzID0gcmF3RGF0YVsxXSAqIGtHc1BlckxTQjsKKwkJZGF0YS5aQXhpcyA9IHJhd0RhdGFbMl0gKiBrR3NQZXJMU0I7CisJfQorCXJldHVybiBkYXRhOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dBY2NlbGVyb21ldGVyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nQWNjZWxlcm9tZXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlZGY0YgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nQWNjZWxlcm9tZXRlci5jcHAKQEAgLTAsMCArMSwxMTAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkFuYWxvZ0FjY2VsZXJvbWV0ZXIuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ29tbW9uIGZ1bmN0aW9uIGZvciBpbml0aWFsaXppbmcgdGhlIGFjY2VsZXJvbWV0ZXIuCisgKi8KK3ZvaWQgQW5hbG9nQWNjZWxlcm9tZXRlcjo6SW5pdEFjY2VsZXJvbWV0ZXIoKQoreworCW1fdm9sdHNQZXJHID0gMS4wOworCW1femVyb0dWb2x0YWdlID0gMi41OworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BY2NlbGVyb21ldGVyLCBtX0FuYWxvZ0lucHV0LT5HZXRDaGFubmVsKCkpOworfQorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhY2NlbGVyb21ldGVyLgorICogVGhlIGNvbnN0cnVjdG9yIGFsbG9jYXRlcyBkZXNpcmVkIGFuYWxvZyBpbnB1dC4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciBmb3IgdGhlIGFuYWxvZyBpbnB1dCB0aGUgYWNjZWxlcm9tZXRlciBpcyBjb25uZWN0ZWQgdG8KKyAqLworQW5hbG9nQWNjZWxlcm9tZXRlcjo6QW5hbG9nQWNjZWxlcm9tZXRlcihpbnQzMl90IGNoYW5uZWwpCit7CisJbV9BbmFsb2dJbnB1dCA9IG5ldyBBbmFsb2dJbnB1dChjaGFubmVsKTsKKwltX2FsbG9jYXRlZENoYW5uZWwgPSB0cnVlOworCUluaXRBY2NlbGVyb21ldGVyKCk7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEFjY2VsZXJvbWV0ZXIgZnJvbSBhbiBleGlzdGluZyBBbmFsb2dJbnB1dC4KKyAqIE1ha2UgYSBuZXcgaW5zdGFuY2Ugb2YgYWNjZWxlcm9tZXRlciBnaXZlbiBhbiBBbmFsb2dJbnB1dC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkKKyAqIHVzZWZ1bCBpZiB0aGUgcG9ydCBpcyBnb2luZyB0byBiZSByZWFkIGFzIGFuIGFuYWxvZyBjaGFubmVsIGFzIHdlbGwgYXMgdGhyb3VnaAorICogdGhlIEFjY2VsZXJvbWV0ZXIgY2xhc3MuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgZXhpc3RpbmcgQW5hbG9nSW5wdXQgb2JqZWN0IGZvciB0aGUgYW5hbG9nIGlucHV0IHRoZSBhY2NlbGVyb21ldGVyIGlzIGNvbm5lY3RlZCB0bworICovCitBbmFsb2dBY2NlbGVyb21ldGVyOjpBbmFsb2dBY2NlbGVyb21ldGVyKEFuYWxvZ0lucHV0ICpjaGFubmVsKQoreworCWlmIChjaGFubmVsID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisJfQorCWVsc2UKKwl7CisJCW1fQW5hbG9nSW5wdXQgPSBjaGFubmVsOworCQlJbml0QWNjZWxlcm9tZXRlcigpOworCX0KKwltX2FsbG9jYXRlZENoYW5uZWwgPSBmYWxzZTsKK30KKworLyoqCisgKiBEZWxldGUgdGhlIGFuYWxvZyBjb21wb25lbnRzIHVzZWQgZm9yIHRoZSBhY2NlbGVyb21ldGVyLgorICovCitBbmFsb2dBY2NlbGVyb21ldGVyOjp+QW5hbG9nQWNjZWxlcm9tZXRlcigpCit7CisJaWYgKG1fYWxsb2NhdGVkQ2hhbm5lbCkKKwl7CisJCWRlbGV0ZSBtX0FuYWxvZ0lucHV0OworCX0KK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFjY2VsZXJhdGlvbiBpbiBHcy4KKyAqCisgKiBUaGUgYWNjZWxlcmF0aW9uIGlzIHJldHVybmVkIHVuaXRzIG9mIEdzLgorICoKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgYWNjZWxlcmF0aW9uIG9mIHRoZSBzZW5zb3IgaW4gR3MuCisgKi8KK2Zsb2F0IEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OkdldEFjY2VsZXJhdGlvbigpCit7CisJcmV0dXJuIChtX0FuYWxvZ0lucHV0LT5HZXRBdmVyYWdlVm9sdGFnZSgpIC0gbV96ZXJvR1ZvbHRhZ2UpIC8gbV92b2x0c1Blckc7Cit9CisKKy8qKgorICogU2V0IHRoZSBhY2NlbGVyb21ldGVyIHNlbnNpdGl2aXR5LgorICoKKyAqIFRoaXMgc2V0cyB0aGUgc2Vuc2l0aXZpdHkgb2YgdGhlIGFjY2VsZXJvbWV0ZXIgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIGFjY2VsZXJhdGlvbi4KKyAqIFRoZSBzZW5zaXRpdml0eSB2YXJpZXMgYnkgYWNjZWxlcm9tZXRlciBtb2RlbC4gVGhlcmUgYXJlIGNvbnN0YW50cyBkZWZpbmVkIGZvciB2YXJpb3VzIG1vZGVscy4KKyAqCisgKiBAcGFyYW0gc2Vuc2l0aXZpdHkgVGhlIHNlbnNpdGl2aXR5IG9mIGFjY2VsZXJvbWV0ZXIgaW4gVm9sdHMgcGVyIEcuCisgKi8KK3ZvaWQgQW5hbG9nQWNjZWxlcm9tZXRlcjo6U2V0U2Vuc2l0aXZpdHkoZmxvYXQgc2Vuc2l0aXZpdHkpCit7CisJbV92b2x0c1BlckcgPSBzZW5zaXRpdml0eTsKK30KKworLyoqCisgKiBTZXQgdGhlIHZvbHRhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byAwIEcuCisgKgorICogVGhlIHplcm8gRyB2b2x0YWdlIHZhcmllcyBieSBhY2NlbGVyb21ldGVyIG1vZGVsLiBUaGVyZSBhcmUgY29uc3RhbnRzIGRlZmluZWQgZm9yIHZhcmlvdXMgbW9kZWxzLgorICoKKyAqIEBwYXJhbSB6ZXJvIFRoZSB6ZXJvIEcgdm9sdGFnZS4KKyAqLwordm9pZCBBbmFsb2dBY2NlbGVyb21ldGVyOjpTZXRaZXJvKGZsb2F0IHplcm8pCit7CisJbV96ZXJvR1ZvbHRhZ2UgPSB6ZXJvOworfQorCisvKioKKyAqIEdldCB0aGUgQWNjZWxlcmF0aW9uIGZvciB0aGUgUElEIFNvdXJjZSBwYXJlbnQuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCBhY2NlbGVyYXRpb24gaW4gR3MuCisgKi8KK2RvdWJsZSBBbmFsb2dBY2NlbGVyb21ldGVyOjpQSURHZXQoKQoreworCXJldHVybiBHZXRBY2NlbGVyYXRpb24oKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nSW5wdXQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dJbnB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxOWE5YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nSW5wdXQuY3BwCkBAIC0wLDAgKzEsNDE0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworc3RhdGljIFJlc291cmNlICppbnB1dHMgPSBOVUxMOworCitjb25zdCB1aW50OF90IEFuYWxvZ0lucHV0OjprQWNjdW11bGF0b3JNb2R1bGVOdW1iZXI7Citjb25zdCB1aW50MzJfdCBBbmFsb2dJbnB1dDo6a0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBBbmFsb2dJbnB1dDo6a0FjY3VtdWxhdG9yQ2hhbm5lbHNbXSA9IHswLCAxfTsKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24uCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OkluaXRBbmFsb2dJbnB1dCh1aW50MzJfdCBjaGFubmVsKQoreworCWNoYXIgYnVmWzY0XTsKKwlSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QoJmlucHV0cywga0FuYWxvZ0lucHV0cyk7CisKKwlpZiAoIWNoZWNrQW5hbG9nSW5wdXRDaGFubmVsKGNoYW5uZWwpKQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgImFuYWxvZyBpbnB1dCAlZCIsIGNoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCisJc25wcmludGYoYnVmLCA2NCwgIkFuYWxvZyBJbnB1dCAlZCIsIGNoYW5uZWwpOworCWlmIChpbnB1dHMtPkFsbG9jYXRlKGNoYW5uZWwsIGJ1ZikgPT0gfjB1bCkKKwl7CisJCUNsb25lRXJyb3IoaW5wdXRzKTsKKwkJcmV0dXJuOworCX0KKworCW1fY2hhbm5lbCA9IGNoYW5uZWw7CisKKwl2b2lkKiBwb3J0ID0gZ2V0UG9ydChjaGFubmVsKTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJbV9wb3J0ID0gaW5pdGlhbGl6ZUFuYWxvZ0lucHV0UG9ydChwb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BbmFsb2dDaGFubmVsLCBjaGFubmVsKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIGlucHV0LgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciBvbiB0aGUgcm9ib1JJTyB0byByZXByZXNlbnQuIDAtMyBhcmUgb24tYm9hcmQgNC03IGFyZSBvbiB0aGUgTVhQIHBvcnQuCisgKi8KK0FuYWxvZ0lucHV0OjpBbmFsb2dJbnB1dCh1aW50MzJfdCBjaGFubmVsKQoreworCUluaXRBbmFsb2dJbnB1dChjaGFubmVsKTsKK30KKworLyoqCisgKiBDaGFubmVsIGRlc3RydWN0b3IuCisgKi8KK0FuYWxvZ0lucHV0Ojp+QW5hbG9nSW5wdXQoKQoreworCWlucHV0cy0+RnJlZShtX2NoYW5uZWwpOworfQorCisvKioKKyAqIEdldCBhIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoaXMgY2hhbm5lbC4KKyAqIFRoZSBzYW1wbGUgaXMgYSAxMi1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSAwViB0byA1ViByYW5nZSBvZiB0aGUgQS9EIGNvbnZlcnRlciBpbiB0aGUgbW9kdWxlLgorICogVGhlIHVuaXRzIGFyZSBpbiBBL0QgY29udmVydGVyIGNvZGVzLiAgVXNlIEdldFZvbHRhZ2UoKSB0byBnZXQgdGhlIGFuYWxvZyB2YWx1ZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICogQHJldHVybiBBIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoaXMgY2hhbm5lbC4KKyAqLworaW50MTZfdCBBbmFsb2dJbnB1dDo6R2V0VmFsdWUoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQxNl90IHZhbHVlID0gZ2V0QW5hbG9nVmFsdWUobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogR2V0IGEgc2FtcGxlIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUgZm9yIHRoaXMgY2hhbm5lbC4KKyAqIFRoZSBzYW1wbGUgaXMgMTItYml0ICsgdGhlIGJpdHMgY29uZmlndXJlZCBpbiBTZXRPdmVyc2FtcGxlQml0cygpLgorICogVGhlIHZhbHVlIGNvbmZpZ3VyZWQgaW4gU2V0QXZlcmFnZUJpdHMoKSB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgYXZlcmFnZWQgMioqYml0cyBudW1iZXIgb2Ygc2FtcGxlcy4KKyAqIFRoaXMgaXMgbm90IGEgc2xpZGluZyB3aW5kb3cuICBUaGUgc2FtcGxlIHdpbGwgbm90IGNoYW5nZSB1bnRpbCAyKiooT3ZlcnNhbXBsZUJpdHMgKyBBdmVyYWdlQml0cykgc2FtcGxlcworICogaGF2ZSBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIG1vZHVsZSBvbiB0aGlzIGNoYW5uZWwuCisgKiBVc2UgR2V0QXZlcmFnZVZvbHRhZ2UoKSB0byBnZXQgdGhlIGFuYWxvZyB2YWx1ZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICogQHJldHVybiBBIHNhbXBsZSBmcm9tIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcyBjaGFubmVsLgorICovCitpbnQzMl90IEFuYWxvZ0lucHV0OjpHZXRBdmVyYWdlVmFsdWUoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQzMl90IHZhbHVlID0gZ2V0QW5hbG9nQXZlcmFnZVZhbHVlKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEdldCBhIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCisgKiBUaGUgdmFsdWUgaXMgc2NhbGVkIHRvIHVuaXRzIG9mIFZvbHRzIHVzaW5nIHRoZSBjYWxpYnJhdGVkIHNjYWxpbmcgZGF0YSBmcm9tIEdldExTQldlaWdodCgpIGFuZCBHZXRPZmZzZXQoKS4KKyAqIEByZXR1cm4gQSBzY2FsZWQgc2FtcGxlIHN0cmFpZ2h0IGZyb20gdGhpcyBjaGFubmVsLgorICovCitmbG9hdCBBbmFsb2dJbnB1dDo6R2V0Vm9sdGFnZSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMGY7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWZsb2F0IHZvbHRhZ2UgPSBnZXRBbmFsb2dWb2x0YWdlKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZvbHRhZ2U7Cit9CisKKy8qKgorICogR2V0IGEgc2NhbGVkIHNhbXBsZSBmcm9tIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGlzIGNoYW5uZWwuCisgKiBUaGUgdmFsdWUgaXMgc2NhbGVkIHRvIHVuaXRzIG9mIFZvbHRzIHVzaW5nIHRoZSBjYWxpYnJhdGVkIHNjYWxpbmcgZGF0YSBmcm9tIEdldExTQldlaWdodCgpIGFuZCBHZXRPZmZzZXQoKS4KKyAqIFVzaW5nIG92ZXJzYW1wbGluZyB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgaGlnaGVyIHJlc29sdXRpb24sIGJ1dCBpdCB3aWxsIHVwZGF0ZSBtb3JlIHNsb3dseS4KKyAqIFVzaW5nIGF2ZXJhZ2luZyB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgbW9yZSBzdGFibGUsIGJ1dCBpdCB3aWxsIHVwZGF0ZSBtb3JlIHNsb3dseS4KKyAqIEByZXR1cm4gQSBzY2FsZWQgc2FtcGxlIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUgZm9yIHRoaXMgY2hhbm5lbC4KKyAqLworZmxvYXQgQW5hbG9nSW5wdXQ6OkdldEF2ZXJhZ2VWb2x0YWdlKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wZjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZmxvYXQgdm9sdGFnZSA9IGdldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZvbHRhZ2U7Cit9CisKKy8qKgorICogR2V0IHRoZSBmYWN0b3J5IHNjYWxpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdlaWdodCBjb25zdGFudC4KKyAqCisgKiBWb2x0cyA9ICgoTFNCX1dlaWdodCAqIDFlLTkpICogcmF3KSAtIChPZmZzZXQgKiAxZS05KQorICoKKyAqIEByZXR1cm4gTGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdlaWdodC4KKyAqLwordWludDMyX3QgQW5hbG9nSW5wdXQ6OkdldExTQldlaWdodCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludDMyX3QgbHNiV2VpZ2h0ID0gZ2V0QW5hbG9nTFNCV2VpZ2h0KG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIGxzYldlaWdodDsKK30KKworLyoqCisgKiBHZXQgdGhlIGZhY3Rvcnkgc2NhbGluZyBvZmZzZXQgY29uc3RhbnQuCisgKgorICogVm9sdHMgPSAoKExTQl9XZWlnaHQgKiAxZS05KSAqIHJhdykgLSAoT2Zmc2V0ICogMWUtOSkKKyAqCisgKiBAcmV0dXJuIE9mZnNldCBjb25zdGFudC4KKyAqLworaW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0T2Zmc2V0KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJaW50MzJfdCBvZmZzZXQgPSBnZXRBbmFsb2dPZmZzZXQobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKioKKyAqIEdldCB0aGUgY2hhbm5lbCBudW1iZXIuCisgKiBAcmV0dXJuIFRoZSBjaGFubmVsIG51bWJlci4KKyAqLwordWludDMyX3QgQW5hbG9nSW5wdXQ6OkdldENoYW5uZWwoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCXJldHVybiBtX2NoYW5uZWw7Cit9CisKKy8qKgorICogU2V0IHRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMuCisgKiBUaGlzIHNldHMgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cy4gVGhlIGFjdHVhbCBudW1iZXIgb2YgYXZlcmFnZWQgc2FtcGxlcyBpcyAyXmJpdHMuCisgKiBVc2UgYXZlcmFnaW5nIHRvIGltcHJvdmUgdGhlIHN0YWJpbGl0eSBvZiB5b3VyIG1lYXN1cmVtZW50IGF0IHRoZSBleHBlbnNlIG9mIHNhbXBsaW5nIHJhdGUuCisgKiBUaGUgYXZlcmFnaW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gYml0cyBOdW1iZXIgb2YgYml0cyBvZiBhdmVyYWdpbmcuCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OlNldEF2ZXJhZ2VCaXRzKHVpbnQzMl90IGJpdHMpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRBbmFsb2dBdmVyYWdlQml0cyhtX3BvcnQsIGJpdHMsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzIHByZXZpb3VzbHkgY29uZmlndXJlZC4KKyAqIFRoaXMgZ2V0cyB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzIGZyb20gdGhlIEZQR0EuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGF2ZXJhZ2VkIHNhbXBsZXMgaXMgMl5iaXRzLgorICogVGhlIGF2ZXJhZ2luZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYml0cyBvZiBhdmVyYWdpbmcgcHJldmlvdXNseSBjb25maWd1cmVkLgorICovCit1aW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0QXZlcmFnZUJpdHMoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQzMl90IGF2ZXJhZ2VCaXRzID0gZ2V0QW5hbG9nQXZlcmFnZUJpdHMobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gYXZlcmFnZUJpdHM7Cit9CisKKy8qKgorICogU2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLgorICogVGhpcyBzZXRzIHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLiBUaGUgYWN0dWFsIG51bWJlciBvZiBvdmVyc2FtcGxlZCB2YWx1ZXMgaXMgMl5iaXRzLgorICogVXNlIG92ZXJzYW1wbGluZyB0byBpbXByb3ZlIHRoZSByZXNvbHV0aW9uIG9mIHlvdXIgbWVhc3VyZW1lbnRzIGF0IHRoZSBleHBlbnNlIG9mIHNhbXBsaW5nIHJhdGUuCisgKiBUaGUgb3ZlcnNhbXBsaW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gYml0cyBOdW1iZXIgb2YgYml0cyBvZiBvdmVyc2FtcGxpbmcuCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OlNldE92ZXJzYW1wbGVCaXRzKHVpbnQzMl90IGJpdHMpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhtX3BvcnQsIGJpdHMsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cyBwcmV2aW91c2x5IGNvbmZpZ3VyZWQuCisgKiBUaGlzIGdldHMgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMgZnJvbSB0aGUgRlBHQS4gVGhlIGFjdHVhbCBudW1iZXIgb2Ygb3ZlcnNhbXBsZWQgdmFsdWVzIGlzCisgKiAyXmJpdHMuIFRoZSBvdmVyc2FtcGxpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgorICoKKyAqIEByZXR1cm4gTnVtYmVyIG9mIGJpdHMgb2Ygb3ZlcnNhbXBsaW5nIHByZXZpb3VzbHkgY29uZmlndXJlZC4KKyAqLwordWludDMyX3QgQW5hbG9nSW5wdXQ6OkdldE92ZXJzYW1wbGVCaXRzKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJaW50MzJfdCBvdmVyc2FtcGxlQml0cyA9IGdldEFuYWxvZ092ZXJzYW1wbGVCaXRzKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIG92ZXJzYW1wbGVCaXRzOworfQorCisvKioKKyAqIElzIHRoZSBjaGFubmVsIGF0dGFjaGVkIHRvIGFuIGFjY3VtdWxhdG9yLgorICoKKyAqIEByZXR1cm4gVGhlIGFuYWxvZyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhbiBhY2N1bXVsYXRvci4KKyAqLworYm9vbCBBbmFsb2dJbnB1dDo6SXNBY2N1bXVsYXRvckNoYW5uZWwoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCBpc0FjY3VtID0gaXNBY2N1bXVsYXRvckNoYW5uZWwobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gaXNBY2N1bTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBhY2N1bXVsYXRvci4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6SW5pdEFjY3VtdWxhdG9yKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJbV9hY2N1bXVsYXRvck9mZnNldCA9IDA7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWluaXRBY2N1bXVsYXRvcihtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisKKy8qKgorICogU2V0IGFuIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBhY2N1bXVsYXRvci4KKyAqCisgKiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gYWxsIHZhbHVlcyByZXR1cm5lZCB0byB0aGUgdXNlci4KKyAqIEBwYXJhbSBpbml0aWFsVmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIGFjY3VtdWxhdG9yIHNob3VsZCBzdGFydCBmcm9tIHdoZW4gcmVzZXQuCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OlNldEFjY3VtdWxhdG9ySW5pdGlhbFZhbHVlKGludDY0X3QgaW5pdGlhbFZhbHVlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwltX2FjY3VtdWxhdG9yT2Zmc2V0ID0gaW5pdGlhbFZhbHVlOworfQorCisvKioKKyAqIFJlc2V0cyB0aGUgYWNjdW11bGF0b3IgdG8gdGhlIGluaXRpYWwgdmFsdWUuCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OlJlc2V0QWNjdW11bGF0b3IoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJcmVzZXRBY2N1bXVsYXRvcihtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJaWYoIVN0YXR1c0lzRmF0YWwoKSkKKwl7CisJCS8vIFdhaXQgdW50aWwgdGhlIG5leHQgc2FtcGxlLCBzbyB0aGUgbmV4dCBjYWxsIHRvIEdldEFjY3VtdWxhdG9yKigpCisJCS8vIHdvbid0IGhhdmUgb2xkIHZhbHVlcy4KKwkJY29uc3QgZmxvYXQgc2FtcGxlVGltZSA9IDEuMGYgLyBHZXRTYW1wbGVSYXRlKCk7CisJCWNvbnN0IGZsb2F0IG92ZXJTYW1wbGVzID0gMSA8PCBHZXRPdmVyc2FtcGxlQml0cygpOworCQljb25zdCBmbG9hdCBhdmVyYWdlU2FtcGxlcyA9IDEgPDwgR2V0QXZlcmFnZUJpdHMoKTsKKwkJV2FpdChzYW1wbGVUaW1lICogb3ZlclNhbXBsZXMgKiBhdmVyYWdlU2FtcGxlcyk7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgY2VudGVyIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci4KKyAqCisgKiBUaGUgY2VudGVyIHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIEEvRCB2YWx1ZSBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIGFjY3VtdWxhdG9yLiBUaGlzCisgKiBpcyB1c2VkIGZvciB0aGUgY2VudGVyIHZhbHVlIG9mIGRldmljZXMgbGlrZSBneXJvcyBhbmQgYWNjZWxlcm9tZXRlcnMgdG8gCisgKiB0YWtlIHRoZSBkZXZpY2Ugb2Zmc2V0IGludG8gYWNjb3VudCB3aGVuIGludGVncmF0aW5nLgorICoKKyAqIFRoaXMgY2VudGVyIHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGVkIGFuZCBhdmVyYWdlZCBzb3VyY2UgZnJvbSB0aGUgYWNjdW11bGF0b3IKKyAqIGNoYW5uZWwuIEJlY2F1c2Ugb2YgdGhpcywgYW55IG5vbi16ZXJvIG92ZXJzYW1wbGUgYml0cyB3aWxsIGFmZmVjdCB0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgZm9yIHRoaXMgZmllbGQuCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OlNldEFjY3VtdWxhdG9yQ2VudGVyKGludDMyX3QgY2VudGVyKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0QWNjdW11bGF0b3JDZW50ZXIobV9wb3J0LCBjZW50ZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCB0aGUgYWNjdW11bGF0b3IncyBkZWFkYmFuZC4KKyAqIEBwYXJhbSAKKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6U2V0QWNjdW11bGF0b3JEZWFkYmFuZChpbnQzMl90IGRlYWRiYW5kKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0QWNjdW11bGF0b3JEZWFkYmFuZChtX3BvcnQsIGRlYWRiYW5kLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBSZWFkIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KKyAqCisgKiBSZWFkIHRoZSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGFjY3VtdWxhdGluZy4KKyAqIFRoZSBhY2N1bXVsYXRvciBpcyBhdHRhY2hlZCBhZnRlciB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUuCisgKgorICogQHJldHVybiBUaGUgNjQtYml0IHZhbHVlIGFjY3VtdWxhdGVkIHNpbmNlIHRoZSBsYXN0IFJlc2V0KCkuCisgKi8KK2ludDY0X3QgQW5hbG9nSW5wdXQ6OkdldEFjY3VtdWxhdG9yVmFsdWUoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpbnQ2NF90IHZhbHVlID0gZ2V0QWNjdW11bGF0b3JWYWx1ZShtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB2YWx1ZSArIG1fYWNjdW11bGF0b3JPZmZzZXQ7Cit9CisKKy8qKgorICogUmVhZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcy4KKyAqCisgKiBSZWFkIHRoZSBjb3VudCBvZiB0aGUgYWNjdW11bGF0ZWQgdmFsdWVzIHNpbmNlIHRoZSBhY2N1bXVsYXRvciB3YXMgbGFzdCBSZXNldCgpLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBzYW1wbGVzIGZyb20gdGhlIGNoYW5uZWwgd2VyZSBhY2N1bXVsYXRlZC4KKyAqLwordWludDMyX3QgQW5hbG9nSW5wdXQ6OkdldEFjY3VtdWxhdG9yQ291bnQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MzJfdCBjb3VudCA9IGdldEFjY3VtdWxhdG9yQ291bnQobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworLyoqCisgKiBSZWFkIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBhbmQgdGhlIG51bWJlciBvZiBhY2N1bXVsYXRlZCB2YWx1ZXMgYXRvbWljYWxseS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSB2YWx1ZSBhbmQgY291bnQgZnJvbSB0aGUgRlBHQSBhdG9taWNhbGx5LgorICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYXZlcmFnaW5nLgorICoKKyAqIEBwYXJhbSB2YWx1ZSBQb2ludGVyIHRvIHRoZSA2NC1iaXQgYWNjdW11bGF0ZWQgb3V0cHV0LgorICogQHBhcmFtIGNvdW50IFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBhY2N1bXVsYXRpb24gY3ljbGVzLgorICovCit2b2lkIEFuYWxvZ0lucHV0OjpHZXRBY2N1bXVsYXRvck91dHB1dChpbnQ2NF90ICp2YWx1ZSwgdWludDMyX3QgKmNvdW50KQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZ2V0QWNjdW11bGF0b3JPdXRwdXQobV9wb3J0LCB2YWx1ZSwgY291bnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCSp2YWx1ZSArPSBtX2FjY3VtdWxhdG9yT2Zmc2V0OworfQorCisvKioKKyAqIFNldCB0aGUgc2FtcGxlIHJhdGUgcGVyIGNoYW5uZWwgZm9yIGFsbCBhbmFsb2cgY2hhbm5lbHMuCisgKiBUaGUgbWF4aW11bSByYXRlIGlzIDUwMGtTL3MgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHVzZS4KKyAqIFRoaXMgaXMgNjI1MDAgc2FtcGxlcy9zIHBlciBjaGFubmVsLgorICogQHBhcmFtIHNhbXBsZXNQZXJTZWNvbmQgVGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OlNldFNhbXBsZVJhdGUoZmxvYXQgc2FtcGxlc1BlclNlY29uZCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0QW5hbG9nU2FtcGxlUmF0ZShzYW1wbGVzUGVyU2Vjb25kLCAmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgc2FtcGxlIHJhdGUgZm9yIGFsbCBjaGFubmVscworICoKKyAqIEByZXR1cm4gU2FtcGxlIHJhdGUuCisgKi8KK2Zsb2F0IEFuYWxvZ0lucHV0OjpHZXRTYW1wbGVSYXRlKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZmxvYXQgc2FtcGxlUmF0ZSA9IGdldEFuYWxvZ1NhbXBsZVJhdGUoJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHNhbXBsZVJhdGU7Cit9CisKKy8qKgorICogR2V0IHRoZSBBdmVyYWdlIHZhbHVlIGZvciB0aGUgUElEIFNvdXJjZSBiYXNlIG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIFRoZSBhdmVyYWdlIHZvbHRhZ2UuCisgKi8KK2RvdWJsZSBBbmFsb2dJbnB1dDo6UElER2V0KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworCXJldHVybiBHZXRBdmVyYWdlVm9sdGFnZSgpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dPdXRwdXQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dPdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZGZhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ091dHB1dC5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KKy8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQW5hbG9nT3V0cHV0LmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworc3RhdGljIFJlc291cmNlICpvdXRwdXRzID0gTlVMTDsKKwordm9pZCBBbmFsb2dPdXRwdXQ6OkluaXRBbmFsb2dPdXRwdXQodWludDMyX3QgY2hhbm5lbCkgeworICAgIFJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmb3V0cHV0cywga0FuYWxvZ091dHB1dHMpOworCisgICAgY2hhciBidWZbNjRdOworCisgICAgaWYoIWNoZWNrQW5hbG9nT3V0cHV0Q2hhbm5lbChjaGFubmVsKSkKKyAgICB7CisgICAgICAgIHNucHJpbnRmKGJ1ZiwgNjQsICJhbmFsb2cgaW5wdXQgJWQiLCBjaGFubmVsKTsKKyAgICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKG91dHB1dHMtPkFsbG9jYXRlKGNoYW5uZWwsIGJ1ZikgPT0gfjB1bCkKKyAgICB7CisgICAgICAgIENsb25lRXJyb3Iob3V0cHV0cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2NoYW5uZWwgPSBjaGFubmVsOworCisgICAgdm9pZCogcG9ydCA9IGdldFBvcnQobV9jaGFubmVsKTsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgbV9wb3J0ID0gaW5pdGlhbGl6ZUFuYWxvZ091dHB1dFBvcnQocG9ydCwgJnN0YXR1cyk7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQW5hbG9nQ2hhbm5lbCwgbV9jaGFubmVsLCAwKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIG91dHB1dCBvbiB0aGUgZ2l2ZW4gY2hhbm5lbC4KKyAqIEFsbCBhbmFsb2cgb3V0cHV0cyBhcmUgbG9jYXRlZCBvbiB0aGUgTVhQIHBvcnQuCisgKiBAcGFyYW0gVGhlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSByb2JvUklPIHRvIHJlcHJlc2VudC4KKyAqLworQW5hbG9nT3V0cHV0OjpBbmFsb2dPdXRwdXQodWludDMyX3QgY2hhbm5lbCkgeworICAgIEluaXRBbmFsb2dPdXRwdXQoY2hhbm5lbCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4gRnJlZXMgYW5hbG9nIG91dHB1dCByZXNvdXJjZQorICovCitBbmFsb2dPdXRwdXQ6On5BbmFsb2dPdXRwdXQoKSB7CisgICAgb3V0cHV0cy0+RnJlZShtX2NoYW5uZWwpOworfQorCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGFuYWxvZyBvdXRwdXQKKyAqCisgKiBAcGFyYW0gdm9sdGFnZSBUaGUgb3V0cHV0IHZhbHVlIGluIFZvbHRzLCBmcm9tIDAuMCB0byArNS4wCisgKi8KK3ZvaWQgQW5hbG9nT3V0cHV0OjpTZXRWb2x0YWdlKGZsb2F0IHZvbHRhZ2UpIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgc2V0QW5hbG9nT3V0cHV0KG1fcG9ydCwgdm9sdGFnZSwgJnN0YXR1cyk7CisKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHZvbHRhZ2Ugb2YgdGhlIGFuYWxvZyBvdXRwdXQKKyAqCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSBpbiBWb2x0cywgZnJvbSAwLjAgdG8gKzUuMAorICovCitmbG9hdCBBbmFsb2dPdXRwdXQ6OkdldFZvbHRhZ2UoKSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIGZsb2F0IHZvbHRhZ2UgPSBnZXRBbmFsb2dPdXRwdXQobV9wb3J0LCAmc3RhdHVzKTsKKworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgICAgcmV0dXJuIHZvbHRhZ2U7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ1BvdGVudGlvbWV0ZXIuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dQb3RlbnRpb21ldGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmE3ZGJkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dQb3RlbnRpb21ldGVyLmNwcApAQCAtMCwwICsxLDczIEBACisKKyNpbmNsdWRlICJBbmFsb2dQb3RlbnRpb21ldGVyLmgiCisjaW5jbHVkZSAiQ29udHJvbGxlclBvd2VyLmgiCisKKy8qKgorICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgKi8KK3ZvaWQgQW5hbG9nUG90ZW50aW9tZXRlcjo6aW5pdFBvdChBbmFsb2dJbnB1dCAqaW5wdXQsIGRvdWJsZSBmdWxsUmFuZ2UsIGRvdWJsZSBvZmZzZXQpIHsKKyAgICBtX2Z1bGxSYW5nZSA9IGZ1bGxSYW5nZTsKKyAgICBtX29mZnNldCA9IG9mZnNldDsKKyAgICBtX2FuYWxvZ19pbnB1dCA9IGlucHV0OworfQorCisvKioKKyAqIENvbnN0cnVjdCBhbiBBbmFsb2cgUG90ZW50aW9tZXRlciBvYmplY3QgZnJvbSBhIGNoYW5uZWwgbnVtYmVyLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSByb2JvUklPIHRvIHJlcHJlc2VudC4gMC0zIGFyZSBvbi1ib2FyZCA0LTcgYXJlIG9uIHRoZSBNWFAgcG9ydC4KKyAqIEBwYXJhbSBmdWxsUmFuZ2UgVGhlIGFuZ3VsYXIgdmFsdWUgKGluIGRlc2lyZWQgdW5pdHMpIHJlcHJlc2VudGluZyB0aGUgZnVsbCAwLTVWIHJhbmdlIG9mIHRoZSBpbnB1dC4KKyAqIEBwYXJhbSBvZmZzZXQgVGhlIGFuZ3VsYXIgdmFsdWUgKGluIGRlc2lyZWQgdW5pdHMpIHJlcHJlc2VudGluZyB0aGUgYW5ndWxhciBvdXRwdXQgYXQgMFYuCisgKi8KK0FuYWxvZ1BvdGVudGlvbWV0ZXI6OkFuYWxvZ1BvdGVudGlvbWV0ZXIoaW50IGNoYW5uZWwsIGRvdWJsZSBmdWxsUmFuZ2UsIGRvdWJsZSBvZmZzZXQpIHsKKyAgICBtX2luaXRfYW5hbG9nX2lucHV0ID0gdHJ1ZTsKKyAgICBpbml0UG90KG5ldyBBbmFsb2dJbnB1dChjaGFubmVsKSwgZnVsbFJhbmdlLCBvZmZzZXQpOworfQorCisvKioKKyAqIENvbnN0cnVjdCBhbiBBbmFsb2cgUG90ZW50aW9tZXRlciBvYmplY3QgZnJvbSBhbiBleGlzdGluZyBBbmFsb2cgSW5wdXQgcG9pbnRlci4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBleGlzdGluZyBBbmFsb2cgSW5wdXQgcG9pbnRlciAKKyAqIEBwYXJhbSBmdWxsUmFuZ2UgVGhlIGFuZ3VsYXIgdmFsdWUgKGluIGRlc2lyZWQgdW5pdHMpIHJlcHJlc2VudGluZyB0aGUgZnVsbCAwLTVWIHJhbmdlIG9mIHRoZSBpbnB1dC4KKyAqIEBwYXJhbSBvZmZzZXQgVGhlIGFuZ3VsYXIgdmFsdWUgKGluIGRlc2lyZWQgdW5pdHMpIHJlcHJlc2VudGluZyB0aGUgYW5ndWxhciBvdXRwdXQgYXQgMFYuCisgKi8KK0FuYWxvZ1BvdGVudGlvbWV0ZXI6OkFuYWxvZ1BvdGVudGlvbWV0ZXIoQW5hbG9nSW5wdXQgKmlucHV0LCBkb3VibGUgZnVsbFJhbmdlLCBkb3VibGUgb2Zmc2V0KSB7CisgICAgbV9pbml0X2FuYWxvZ19pbnB1dCA9IGZhbHNlOworICAgIGluaXRQb3QoaW5wdXQsIGZ1bGxSYW5nZSwgb2Zmc2V0KTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gQW5hbG9nIFBvdGVudGlvbWV0ZXIgb2JqZWN0IGZyb20gYW4gZXhpc3RpbmcgQW5hbG9nIElucHV0IHJlZmVyZW5jZS4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBleGlzdGluZyBBbmFsb2cgSW5wdXQgcmVmZXJlbmNlIAorICogQHBhcmFtIGZ1bGxSYW5nZSBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBmdWxsIDAtNVYgcmFuZ2Ugb2YgdGhlIGlucHV0LgorICogQHBhcmFtIG9mZnNldCBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBhbmd1bGFyIG91dHB1dCBhdCAwVi4KKyAqLworQW5hbG9nUG90ZW50aW9tZXRlcjo6QW5hbG9nUG90ZW50aW9tZXRlcihBbmFsb2dJbnB1dCAmaW5wdXQsIGRvdWJsZSBmdWxsUmFuZ2UsIGRvdWJsZSBvZmZzZXQpIHsKKyAgICBtX2luaXRfYW5hbG9nX2lucHV0ID0gZmFsc2U7CisgICAgaW5pdFBvdCgmaW5wdXQsIGZ1bGxSYW5nZSwgb2Zmc2V0KTsKK30KKworLyoqCisgKiBEZXN0cnVjdG9yLiBSZWxlYXNlcyB0aGUgQW5hbG9nIElucHV0IHJlc291cmNlIGlmIGl0IHdhcyBhbGxvY2F0ZWQgYnkgdGhpcyBvYmplY3QKKyAqLworQW5hbG9nUG90ZW50aW9tZXRlcjo6fkFuYWxvZ1BvdGVudGlvbWV0ZXIoKSB7CisgIGlmKG1faW5pdF9hbmFsb2dfaW5wdXQpeworICAgIGRlbGV0ZSBtX2FuYWxvZ19pbnB1dDsKKyAgICBtX2luaXRfYW5hbG9nX2lucHV0ID0gZmFsc2U7CisgIH0KK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgcmVhZGluZyBvZiB0aGUgcG90ZW50aW9tZXRlci4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb3RlbnRpb21ldGVyIChpbiB0aGUgdW5pdHMgdXNlZCBmb3IgZnVsbFJhbmVnIGFuZCBvZmZzZXQpLgorICovCitkb3VibGUgQW5hbG9nUG90ZW50aW9tZXRlcjo6R2V0KCkgeworICAgIHJldHVybiAobV9hbmFsb2dfaW5wdXQtPkdldFZvbHRhZ2UoKSAvIENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTVWKCkpICogbV9mdWxsUmFuZ2UgKyBtX29mZnNldDsKK30KKworLyoqCisgKiBJbXBsZW1lbnQgdGhlIFBJRFNvdXJjZSBpbnRlcmZhY2UuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCByZWFkaW5nLgorICovCitkb3VibGUgQW5hbG9nUG90ZW50aW9tZXRlcjo6UElER2V0KCkgeworICAgIHJldHVybiBHZXQoKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nVHJpZ2dlci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ1RyaWdnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxY2QwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0FuYWxvZ1RyaWdnZXIuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyLmgiCisKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisvKioKKyAqIEluaXRpYWxpemUgYW4gYW5hbG9nIHRyaWdnZXIgZnJvbSBhIGNoYW5uZWwuCisgKi8KK3ZvaWQgQW5hbG9nVHJpZ2dlcjo6SW5pdFRyaWdnZXIodWludDMyX3QgY2hhbm5lbCkKK3sKKwl2b2lkKiBwb3J0ID0gZ2V0UG9ydChjaGFubmVsKTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJdWludDMyX3QgaW5kZXggPSAwOworCW1fdHJpZ2dlciA9IGluaXRpYWxpemVBbmFsb2dUcmlnZ2VyKHBvcnQsICZpbmRleCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJbV9pbmRleCA9IGluZGV4OworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXIsIGNoYW5uZWwpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBhbiBhbmFsb2cgdHJpZ2dlciBnaXZlbiBhIGNoYW5uZWwgbnVtYmVyLgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciBvbiB0aGUgcm9ib1JJTyB0byByZXByZXNlbnQuIDAtMyBhcmUgb24tYm9hcmQgNC03IGFyZSBvbiB0aGUgTVhQIHBvcnQuCisgKi8KK0FuYWxvZ1RyaWdnZXI6OkFuYWxvZ1RyaWdnZXIoaW50MzJfdCBjaGFubmVsKQoreworCUluaXRUcmlnZ2VyKGNoYW5uZWwpOworfQorCisvKioKKyAqIENvbnN0cnVjdCBhbiBhbmFsb2cgdHJpZ2dlciBnaXZlbiBhbiBhbmFsb2cgaW5wdXQuCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIHNoYXJpbmcgYW4gYW5hbG9nIGNoYW5uZWwgYmV0d2VlbiB0aGUKKyAqIHRyaWdnZXIgYW5kIGFuIGFuYWxvZyBpbnB1dCBvYmplY3QuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgQW5hbG9nSW5wdXQgb2JqZWN0CisgKi8KK0FuYWxvZ1RyaWdnZXI6OkFuYWxvZ1RyaWdnZXIoQW5hbG9nSW5wdXQgKmlucHV0KQoreworCUluaXRUcmlnZ2VyKGlucHV0LT5HZXRDaGFubmVsKCkpOworfQorCitBbmFsb2dUcmlnZ2VyOjp+QW5hbG9nVHJpZ2dlcigpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWNsZWFuQW5hbG9nVHJpZ2dlcihtX3RyaWdnZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cyBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKiBUaGUgbGltaXRzIGFyZSBnaXZlbiBpbiBBREMgY29kZXMuICBJZiBvdmVyc2FtcGxpbmcgaXMgdXNlZCwgdGhlIHVuaXRzIG11c3QgYmUgc2NhbGVkCisgKiBhcHByb3ByaWF0ZWx5LgorICogQHBhcmFtIGxvd2VyIFRoZSBsb3dlciBsaW1pdCBvZiB0aGUgdHJpZ2dlciBpbiBBREMgY29kZXMgKDEyLWJpdCB2YWx1ZXMpLgorICogQHBhcmFtIHVwcGVyIFRoZSB1cHBlciBsaW1pdCBvZiB0aGUgdHJpZ2dlciBpbiBBREMgY29kZXMgKDEyLWJpdCB2YWx1ZXMpLgorICovCit2b2lkIEFuYWxvZ1RyaWdnZXI6OlNldExpbWl0c1JhdyhpbnQzMl90IGxvd2VyLCBpbnQzMl90IHVwcGVyKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1JhdyhtX3RyaWdnZXIsIGxvd2VyLCB1cHBlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzIG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqIFRoZSBsaW1pdHMgYXJlIGdpdmVuIGFzIGZsb2F0aW5nIHBvaW50IHZvbHRhZ2UgdmFsdWVzLgorICogQHBhcmFtIGxvd2VyIFRoZSBsb3dlciBsaW1pdCBvZiB0aGUgdHJpZ2dlciBpbiBWb2x0cy4KKyAqIEBwYXJhbSB1cHBlciBUaGUgdXBwZXIgbGltaXQgb2YgdGhlIHRyaWdnZXIgaW4gVm9sdHMuCisgKi8KK3ZvaWQgQW5hbG9nVHJpZ2dlcjo6U2V0TGltaXRzVm9sdGFnZShmbG9hdCBsb3dlciwgZmxvYXQgdXBwZXIpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRBbmFsb2dUcmlnZ2VyTGltaXRzVm9sdGFnZShtX3RyaWdnZXIsIGxvd2VyLCB1cHBlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBhbmFsb2cgdHJpZ2dlciB0byB1c2UgdGhlIGF2ZXJhZ2VkIHZzLiByYXcgdmFsdWVzLgorICogSWYgdGhlIHZhbHVlIGlzIHRydWUsIHRoZW4gdGhlIGF2ZXJhZ2VkIHZhbHVlIGlzIHNlbGVjdGVkIGZvciB0aGUgYW5hbG9nIHRyaWdnZXIsIG90aGVyd2lzZQorICogdGhlIGltbWVkaWF0ZSB2YWx1ZSBpcyB1c2VkLgorICogQHBhcmFtIHVzZUF2ZXJhZ2VkVmFsdWUgSWYgdHJ1ZSwgdXNlIHRoZSBBdmVyYWdlZCB2YWx1ZSwgb3RoZXJ3aXNlIHVzZSB0aGUgaW5zdGFudGFuZW91cyByZWFkaW5nCisgKi8KK3ZvaWQgQW5hbG9nVHJpZ2dlcjo6U2V0QXZlcmFnZWQoYm9vbCB1c2VBdmVyYWdlZFZhbHVlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0QW5hbG9nVHJpZ2dlckF2ZXJhZ2VkKG1fdHJpZ2dlciwgdXNlQXZlcmFnZWRWYWx1ZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBhbmFsb2cgdHJpZ2dlciB0byB1c2UgYSBmaWx0ZXJlZCB2YWx1ZS4KKyAqIFRoZSBhbmFsb2cgdHJpZ2dlciB3aWxsIG9wZXJhdGUgd2l0aCBhIDMgcG9pbnQgYXZlcmFnZSByZWplY3Rpb24gZmlsdGVyLiBUaGlzIGlzIGRlc2lnbmVkIHRvCisgKiBoZWxwIHdpdGggMzYwIGRlZ3JlZSBwb3QgYXBwbGljYXRpb25zIGZvciB0aGUgcGVyaW9kIHdoZXJlIHRoZSBwb3QgY3Jvc3NlcyB0aHJvdWdoIHplcm8uCisgKiBAcGFyYW0gdXNlRmlsdGVyZWRWYWx1ZSBJZiB0cnVlLCB1c2UgdGhlIDMgcG9pbnQgcmVqZWN0aW9uIGZpbHRlciwgb3RoZXJ3aXNlIHVzZSB0aGUgdW5maWx0ZXJlZCB2YWx1ZQorICovCit2b2lkIEFuYWxvZ1RyaWdnZXI6OlNldEZpbHRlcmVkKGJvb2wgdXNlRmlsdGVyZWRWYWx1ZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZChtX3RyaWdnZXIsIHVzZUZpbHRlcmVkVmFsdWUsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICogVGhpcyBpcyB0aGUgRlBHQSBpbmRleCBvZiB0aGlzIGFuYWxvZyB0cmlnZ2VyIGluc3RhbmNlLgorICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICovCit1aW50MzJfdCBBbmFsb2dUcmlnZ2VyOjpHZXRJbmRleCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIH4wdWw7CisJcmV0dXJuIG1faW5kZXg7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBJbldpbmRvdyBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICogVHJ1ZSBpZiB0aGUgYW5hbG9nIGlucHV0IGlzIGJldHdlZW4gdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuYWxvZyBpbnB1dCBpcyBiZXR3ZWVuIHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzLgorICovCitib29sIEFuYWxvZ1RyaWdnZXI6OkdldEluV2luZG93KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgcmVzdWx0ID0gZ2V0QW5hbG9nVHJpZ2dlckluV2luZG93KG1fdHJpZ2dlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICogVHJ1ZSBpZiBhYm92ZSB1cHBlciBsaW1pdC4KKyAqIEZhbHNlIGlmIGJlbG93IGxvd2VyIGxpbWl0LgorICogSWYgaW4gSHlzdGVyZXNpcywgbWFpbnRhaW4gcHJldmlvdXMgc3RhdGUuCisgKiBAcmV0dXJuIFRydWUgaWYgYWJvdmUgdXBwZXIgbGltaXQuIEZhbHNlIGlmIGJlbG93IGxvd2VyIGxpbWl0LiBJZiBpbiBIeXN0ZXJlc2lzLCBtYWludGFpbiBwcmV2aW91cyBzdGF0ZS4KKyAqLworYm9vbCBBbmFsb2dUcmlnZ2VyOjpHZXRUcmlnZ2VyU3RhdGUoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCByZXN1bHQgPSBnZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlclN0YXRlKG1fdHJpZ2dlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDcmVhdGVzIGFuIEFuYWxvZ1RyaWdnZXJPdXRwdXQgb2JqZWN0LgorICogR2V0cyBhbiBvdXRwdXQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJvdXRpbmcuCisgKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBBbmFsb2dUcmlnZ2VyT3V0cHV0IG9iamVjdC4KKyAqIEBwYXJhbSB0eXBlIEFuIGVudW0gb2YgdGhlIHR5cGUgb2Ygb3V0cHV0IG9iamVjdCB0byBjcmVhdGUuCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIG5ldyBBbmFsb2dUcmlnZ2VyT3V0cHV0IG9iamVjdC4KKyAqLworQW5hbG9nVHJpZ2dlck91dHB1dCAqQW5hbG9nVHJpZ2dlcjo6Q3JlYXRlT3V0cHV0KEFuYWxvZ1RyaWdnZXJUeXBlIHR5cGUpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIG5ldyBBbmFsb2dUcmlnZ2VyT3V0cHV0KHRoaXMsIHR5cGUpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9BbmFsb2dUcmlnZ2VyT3V0cHV0LmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nVHJpZ2dlck91dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmZWJmYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQW5hbG9nVHJpZ2dlck91dHB1dC5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlck91dHB1dC5oIgorI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXIuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ3JlYXRlIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgb25lIG9mIHRoZSBmb3VyIG91dHB1dHMgZnJvbSBhbiBhbmFsb2cgdHJpZ2dlci4KKyAqCisgKiBCZWNhdXNlIHRoaXMgY2xhc3MgZGVyaXZlcyBmcm9tIERpZ2l0YWxTb3VyY2UsIGl0IGNhbiBiZSBwYXNzZWQgaW50byByb3V0aW5nIGZ1bmN0aW9ucworICogZm9yIENvdW50ZXIsIEVuY29kZXIsIGV0Yy4KKyAqCisgKiBAcGFyYW0gdHJpZ2dlciBBIHBvaW50ZXIgdG8gdGhlIHRyaWdnZXIgZm9yIHdoaWNoIHRoaXMgaXMgYW4gb3V0cHV0LgorICogQHBhcmFtIG91dHB1dFR5cGUgQW4gZW51bSB0aGF0IHNwZWNpZmllcyB0aGUgb3V0cHV0IG9uIHRoZSB0cmlnZ2VyIHRvIHJlcHJlc2VudC4KKyAqLworQW5hbG9nVHJpZ2dlck91dHB1dDo6QW5hbG9nVHJpZ2dlck91dHB1dChBbmFsb2dUcmlnZ2VyICp0cmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSBvdXRwdXRUeXBlKQorCTogbV90cmlnZ2VyICh0cmlnZ2VyKQorCSwgbV9vdXRwdXRUeXBlIChvdXRwdXRUeXBlKQoreworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BbmFsb2dUcmlnZ2VyT3V0cHV0LCB0cmlnZ2VyLT5HZXRJbmRleCgpLCBvdXRwdXRUeXBlKTsKK30KKworQW5hbG9nVHJpZ2dlck91dHB1dDo6fkFuYWxvZ1RyaWdnZXJPdXRwdXQoKQoreworCWlmIChtX2ludGVycnVwdCAhPSBOVUxMKQorCXsKKwkJaW50MzJfdCBzdGF0dXMgPSAwOworCQljbGVhbkludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJbV9pbnRlcnJ1cHQgPSBOVUxMOworCQltX2ludGVycnVwdHMtPkZyZWUobV9pbnRlcnJ1cHRJbmRleCk7CisJfQorfQorCisvKioKKyAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dC4KKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQuCisgKi8KK2Jvb2wgQW5hbG9nVHJpZ2dlck91dHB1dDo6R2V0KCkKK3sKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBib29sIHJlc3VsdCA9IGdldEFuYWxvZ1RyaWdnZXJPdXRwdXQobV90cmlnZ2VyLT5tX3RyaWdnZXIsIG1fb3V0cHV0VHlwZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNoYW5uZWwgZmllbGQgb2YgYSByb3V0aW5nIG11eC4KKyAqLwordWludDMyX3QgQW5hbG9nVHJpZ2dlck91dHB1dDo6R2V0Q2hhbm5lbEZvclJvdXRpbmcoKQoreworCXJldHVybiAobV90cmlnZ2VyLT5tX2luZGV4IDw8IDIpICsgbV9vdXRwdXRUeXBlOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG1vZHVsZSBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCit1aW50MzJfdCBBbmFsb2dUcmlnZ2VyT3V0cHV0OjpHZXRNb2R1bGVGb3JSb3V0aW5nKCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBtb2R1bGUgZmllbGQgb2YgYSByb3V0aW5nIG11eC4KKyAqLworYm9vbCBBbmFsb2dUcmlnZ2VyT3V0cHV0OjpHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpCit7CisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0J1aWx0SW5BY2NlbGVyb21ldGVyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjdiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0J1aWx0SW5BY2NlbGVyb21ldGVyLmNwcApAQCAtMCwwICsxLDYxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkJ1aWx0SW5BY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ29uc3RydWN0b3IuCisgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZQorICovCitCdWlsdEluQWNjZWxlcm9tZXRlcjo6QnVpbHRJbkFjY2VsZXJvbWV0ZXIoUmFuZ2UgcmFuZ2UpCit7CisJU2V0UmFuZ2UocmFuZ2UpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FjY2VsZXJvbWV0ZXIsIDAsIDAsICJCdWlsdC1pbiBhY2NlbGVyb21ldGVyIik7Cit9CisKK0J1aWx0SW5BY2NlbGVyb21ldGVyOjp+QnVpbHRJbkFjY2VsZXJvbWV0ZXIoKQoreworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLwordm9pZCBCdWlsdEluQWNjZWxlcm9tZXRlcjo6U2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpCit7CisJaWYocmFuZ2UgPT0ga1JhbmdlXzE2RykKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICIxNkcgcmFuZ2Ugbm90IHN1cHBvcnRlZCAodXNlIGsyRywgazRHLCBvciBrOEcpIik7CisJfQorCisJc2V0QWNjZWxlcm9tZXRlckFjdGl2ZShmYWxzZSk7CisJc2V0QWNjZWxlcm9tZXRlclJhbmdlKChBY2NlbGVyb21ldGVyUmFuZ2UpcmFuZ2UpOworCXNldEFjY2VsZXJvbWV0ZXJBY3RpdmUodHJ1ZSk7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgYWNjZWxlcmF0aW9uIG9mIHRoZSBSb2JvUklPIGFsb25nIHRoZSBYIGF4aXMgaW4gZy1mb3JjZXMKKyAqLworZG91YmxlIEJ1aWx0SW5BY2NlbGVyb21ldGVyOjpHZXRYKCkKK3sKKwlyZXR1cm4gZ2V0QWNjZWxlcm9tZXRlclgoKTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gb2YgdGhlIFJvYm9SSU8gYWxvbmcgdGhlIFkgYXhpcyBpbiBnLWZvcmNlcworICovCitkb3VibGUgQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OkdldFkoKQoreworCXJldHVybiBnZXRBY2NlbGVyb21ldGVyWSgpOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBvZiB0aGUgUm9ib1JJTyBhbG9uZyB0aGUgWiBheGlzIGluIGctZm9yY2VzCisgKi8KK2RvdWJsZSBCdWlsdEluQWNjZWxlcm9tZXRlcjo6R2V0WigpCit7CisJcmV0dXJuIGdldEFjY2VsZXJvbWV0ZXJaKCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NBTkphZ3Vhci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NBTkphZ3Vhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5ZmVjNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ0FOSmFndWFyLmNwcApAQCAtMCwwICsxLDIwNjEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ0FOSmFndWFyLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNkZWZpbmUgdE5JUklPX2kzMiBpbnQKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgiCisjaW5jbHVkZSAiQ0FOL2Nhbl9wcm90by5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworLyogd2UgYXJlIG9uIEFSTS1MRSBub3csIG5vdCBGcmVlc2NhbGUgc28gbm8gbmVlZCB0byBzd2FwICovCisjZGVmaW5lIHN3YXAxNih4KQkoeCkKKyNkZWZpbmUgc3dhcDMyKHgpCSh4KQorCisvKiBDb21wYXJlIGZsb2F0cyBmb3IgZXF1YWxpdHkgYXMgZml4ZWQgcG9pbnQgbnVtYmVycyAqLworI2RlZmluZSBGWFA4X0VRKGEsYikgKChpbnQxNl90KSgoYSkqMjU2LjApPT0oaW50MTZfdCkoKGIpKjI1Ni4wKSkKKyNkZWZpbmUgRlhQMTZfRVEoYSxiKSAoKGludDMyX3QpKChhKSo2NTUzNi4wKT09KGludDMyX3QpKChiKSo2NTUzNi4wKSkKKworY29uc3QgaW50MzJfdCBDQU5KYWd1YXI6OmtDb250cm9sbGVyUmF0ZTsKK2NvbnN0ZXhwciBkb3VibGUgQ0FOSmFndWFyOjprQXBwcm94QnVzVm9sdGFnZTsKKworc3RhdGljIGNvbnN0IGludDMyX3Qga1NlbmRNZXNzYWdlUGVyaW9kID0gMjA7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga0Z1bGxNZXNzYWdlSURNYXNrID0gKENBTl9NU0dJRF9BUElfTSB8IENBTl9NU0dJRF9NRlJfTSB8IENBTl9NU0dJRF9EVFlQRV9NKTsKKworc3RhdGljIGNvbnN0IGludDMyX3Qga1JlY2VpdmVTdGF0dXNBdHRlbXB0cyA9IDUwOworCitzdGF0aWMgUmVzb3VyY2UgKmFsbG9jYXRlZCA9IE5VTEw7CisKK3N0YXRpYyBpbnQzMl90IHNlbmRNZXNzYWdlSGVscGVyKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwgdWludDhfdCBkYXRhU2l6ZSwgaW50MzJfdCBwZXJpb2QpCit7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUcnVzdGVkTWVzc2FnZXNbXSA9IHsKKwkJCUxNX0FQSV9WT0xUX1RfRU4sIExNX0FQSV9WT0xUX1RfU0VULCBMTV9BUElfU1BEX1RfRU4sIExNX0FQSV9TUERfVF9TRVQsCisJCQlMTV9BUElfVkNPTVBfVF9FTiwgTE1fQVBJX1ZDT01QX1RfU0VULCBMTV9BUElfUE9TX1RfRU4sIExNX0FQSV9QT1NfVF9TRVQsCisJCQlMTV9BUElfSUNUUkxfVF9FTiwgTE1fQVBJX0lDVFJMX1RfU0VUfTsKKworCWludDMyX3Qgc3RhdHVzPTA7CisKKwlmb3IgKHVpbnQ4X3QgaT0wOyBpPChzaXplb2Yoa1RydXN0ZWRNZXNzYWdlcykvc2l6ZW9mKGtUcnVzdGVkTWVzc2FnZXNbMF0pKTsgaSsrKQorCXsKKwkJaWYgKChrRnVsbE1lc3NhZ2VJRE1hc2sgJiBtZXNzYWdlSUQpID09IGtUcnVzdGVkTWVzc2FnZXNbaV0pCisJCXsKKwkJCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwkJCWRhdGFCdWZmZXJbMF0gPSAwOworCQkJZGF0YUJ1ZmZlclsxXSA9IDA7CisKKwkJCS8vIE1ha2Ugc3VyZSB0aGUgZGF0YSB3aWxsIHN0aWxsIGZpdCBhZnRlciBhZGp1c3RpbmcgZm9yIHRoZSB0b2tlbi4KKwkJCWFzc2VydChkYXRhU2l6ZSA8PSA2KTsKKworCQkJZm9yICh1aW50OF90IGo9MDsgaiA8IGRhdGFTaXplOyBqKyspCisJCQl7CisJCQkJZGF0YUJ1ZmZlcltqICsgMl0gPSBkYXRhW2pdOworCQkJfQorCisJCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShtZXNzYWdlSUQsIGRhdGFCdWZmZXIsIGRhdGFTaXplICsgMiwgcGVyaW9kLCAmc3RhdHVzKTsKKworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKG1lc3NhZ2VJRCwgZGF0YSwgZGF0YVNpemUsIHBlcmlvZCwgJnN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIENvbW1vbiBpbml0aWFsaXphdGlvbiBjb2RlIGNhbGxlZCBieSBhbGwgY29uc3RydWN0b3JzLgorICovCit2b2lkIENBTkphZ3Vhcjo6SW5pdENBTkphZ3VhcigpCit7CisJbV9zYWZldHlIZWxwZXIgPSBuZXcgTW90b3JTYWZldHlIZWxwZXIodGhpcyk7CisKKwltX3ZhbHVlID0gMC4wZjsKKwltX3NwZWVkUmVmZXJlbmNlID0gTE1fUkVGX05PTkU7CisJbV9wb3NpdGlvblJlZmVyZW5jZSA9IExNX1JFRl9OT05FOworCW1fcCA9IDAuMDsKKwltX2kgPSAwLjA7CisJbV9kID0gMC4wOworCW1fYnVzVm9sdGFnZSA9IDAuMGY7CisJbV9vdXRwdXRWb2x0YWdlID0gMC4wZjsKKwltX291dHB1dEN1cnJlbnQgPSAwLjBmOworCW1fdGVtcGVyYXR1cmUgPSAwLjBmOworCW1fcG9zaXRpb24gPSAwLjA7CisJbV9zcGVlZCA9IDAuMDsKKwltX2xpbWl0cyA9IDB4MDA7CisJbV9mYXVsdHMgPSAweDAwMDA7CisJbV9maXJtd2FyZVZlcnNpb24gPSAwOworCW1faGFyZHdhcmVWZXJzaW9uID0gMDsKKwltX25ldXRyYWxNb2RlID0ga05ldXRyYWxNb2RlX0p1bXBlcjsKKwltX2VuY29kZXJDb2Rlc1BlclJldiA9IDA7CisJbV9wb3RlbnRpb21ldGVyVHVybnMgPSAwOworCW1fbGltaXRNb2RlID0ga0xpbWl0TW9kZV9Td2l0Y2hJbnB1dHNPbmx5OworCW1fZm9yd2FyZExpbWl0ID0gMC4wOworCW1fcmV2ZXJzZUxpbWl0ID0gMC4wOworCW1fbWF4T3V0cHV0Vm9sdGFnZSA9IDMwLjA7CisJbV92b2x0YWdlUmFtcFJhdGUgPSAwLjA7CisJbV9mYXVsdFRpbWUgPSAwLjBmOworCisJLy8gUGFyYW1ldGVycyBvbmx5IG5lZWQgdG8gYmUgdmVyaWZpZWQgaWYgdGhleSBhcmUgc2V0CisJbV9jb250cm9sTW9kZVZlcmlmaWVkID0gZmFsc2U7IC8vIE5lZWRzIHRvIGJlIHZlcmlmaWVkIGJlY2F1c2UgaXQncyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yCisJbV9zcGVlZFJlZlZlcmlmaWVkID0gdHJ1ZTsKKwltX3Bvc1JlZlZlcmlmaWVkID0gdHJ1ZTsKKwltX3BWZXJpZmllZCA9IHRydWU7CisJbV9pVmVyaWZpZWQgPSB0cnVlOworCW1fZFZlcmlmaWVkID0gdHJ1ZTsKKwltX25ldXRyYWxNb2RlVmVyaWZpZWQgPSB0cnVlOworCW1fZW5jb2RlckNvZGVzUGVyUmV2VmVyaWZpZWQgPSB0cnVlOworCW1fcG90ZW50aW9tZXRlclR1cm5zVmVyaWZpZWQgPSB0cnVlOworCW1fbGltaXRNb2RlVmVyaWZpZWQgPSB0cnVlOworCW1fZm9yd2FyZExpbWl0VmVyaWZpZWQgPSB0cnVlOworCW1fcmV2ZXJzZUxpbWl0VmVyaWZpZWQgPSB0cnVlOworCW1fbWF4T3V0cHV0Vm9sdGFnZVZlcmlmaWVkID0gdHJ1ZTsKKwltX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkID0gdHJ1ZTsKKwltX2ZhdWx0VGltZVZlcmlmaWVkID0gdHJ1ZTsKKworCW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMCA9IGZhbHNlOworCW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMSA9IGZhbHNlOworCW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMiA9IGZhbHNlOworCisJYm9vbCByZWNlaXZlZEZpcm13YXJlVmVyc2lvbiA9IGZhbHNlOworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplOworCisJLy8gUmVxdWVzdCBmaXJtd2FyZSBhbmQgaGFyZHdhcmUgdmVyc2lvbiBvbmx5IG9uY2UKKwlyZXF1ZXN0TWVzc2FnZShDQU5fSVNfRlJBTUVfUkVNT1RFIHwgQ0FOX01TR0lEX0FQSV9GSVJNVkVSKTsKKwlyZXF1ZXN0TWVzc2FnZShMTV9BUElfSFdWRVIpOworCisJLy8gV2FpdCB1bnRpbCB3ZSd2ZSBnb3R0ZW4gYWxsIG9mIHRoZSBzdGF0dXMgZGF0YSBhdCBsZWFzdCBvbmNlLgorCWZvcihpbnQgaSA9IDA7IGkgPCBrUmVjZWl2ZVN0YXR1c0F0dGVtcHRzOyBpKyspCisJeworCQlXYWl0KDAuMDAxKTsKKworCQlzZXR1cFBlcmlvZGljU3RhdHVzKCk7CisJCXVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKwkJaWYoIXJlY2VpdmVkRmlybXdhcmVWZXJzaW9uICYmCisJCSAgIGdldE1lc3NhZ2UoQ0FOX01TR0lEX0FQSV9GSVJNVkVSLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpKQorCQl7CisJCQltX2Zpcm13YXJlVmVyc2lvbiA9IHVucGFja2ludDMyX3QoZGF0YUJ1ZmZlcik7CisJCQlyZWNlaXZlZEZpcm13YXJlVmVyc2lvbiA9IHRydWU7CisJCX0KKworCQlpZihtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTAgJiYKKwkJICAgbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UxICYmCisJCSAgIG1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMiAmJgorCQkgICByZWNlaXZlZEZpcm13YXJlVmVyc2lvbikKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZighbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UwIHx8CisJICAgIW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMSB8fAorCSAgICFtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIgfHwKKwkgICAhcmVjZWl2ZWRGaXJtd2FyZVZlcnNpb24pCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChKYWd1YXJNZXNzYWdlTm90Rm91bmQsICJTdGF0dXMgZGF0YSBub3QgZm91bmQiKTsKKwl9CisKKwlpZihnZXRNZXNzYWdlKExNX0FQSV9IV1ZFUiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJbV9oYXJkd2FyZVZlcnNpb24gPSBkYXRhQnVmZmVyWzBdOworCisJaWYgKG1fZGV2aWNlTnVtYmVyIDwgMSB8fCBtX2RldmljZU51bWJlciA+IDYzKQorCXsKKwkJY2hhciBidWZbMjU2XTsKKwkJc25wcmludGYoYnVmLCAyNTYsICJkZXZpY2UgbnVtYmVyIFwiJWRcIiBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNjMiLCBtX2RldmljZU51bWJlcik7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsIGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKQorCQlyZXR1cm47CisKKwkvLyAzMzMwIHdhcyB0aGUgZmlyc3Qgc2hpcHBpbmcgUkRLIGZpcm13YXJlIHZlcnNpb24gZm9yIHRoZSBKYWd1YXIKKwlpZiAobV9maXJtd2FyZVZlcnNpb24gPj0gMzMzMCB8fCBtX2Zpcm13YXJlVmVyc2lvbiA8IDEwOCkKKwl7CisJCWNoYXIgYnVmWzI1Nl07CisJCWlmIChtX2Zpcm13YXJlVmVyc2lvbiA8IDMzMzApCisJCXsKKwkJCXNucHJpbnRmKGJ1ZiwgMjU2LCAiSmFnICMlZCBmaXJtd2FyZSAoJWQpIGlzIHRvbyBvbGQgKG11c3QgYmUgYXQgbGVhc3QgdmVyc2lvbiAxMDggb2YgdGhlIEZJUlNUIGFwcHJvdmVkIGZpcm13YXJlKSIsIG1fZGV2aWNlTnVtYmVyLCBtX2Zpcm13YXJlVmVyc2lvbik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzbnByaW50ZihidWYsIDI1NiwgIkphZyAjJWQgZmlybXdhcmUgKCVkKSBpcyBub3QgRklSU1QgYXBwcm92ZWQgKG11c3QgYmUgYXQgbGVhc3QgdmVyc2lvbiAxMDggb2YgdGhlIEZJUlNUIGFwcHJvdmVkIGZpcm13YXJlKSIsIG1fZGV2aWNlTnVtYmVyLCBtX2Zpcm13YXJlVmVyc2lvbik7CisJCX0KKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSmFndWFyVmVyc2lvbkVycm9yLCBidWYpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChtX2NvbnRyb2xNb2RlKQorCXsKKwljYXNlIGtQZXJjZW50VmJ1czoKKwljYXNlIGtWb2x0YWdlOgorCQkvLyBObyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQuLi4gc3RhcnQgZW5hYmxlZC4KKwkJRW5hYmxlQ29udHJvbCgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQ0FOSmFndWFyLCBtX2RldmljZU51bWJlciwgbV9jb250cm9sTW9kZSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIHRoZSBDQU5KYWd1YXIgZGV2aWNlLjxicj4KKyAqIEJ5IGRlZmF1bHQgdGhlIGRldmljZSBpcyBjb25maWd1cmVkIGluIFBlcmNlbnQgbW9kZS4KKyAqIFRoZSBjb250cm9sIG1vZGUgY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZyBvbmUgb2YgdGhlIGNvbnRyb2wgbW9kZXMgbGlzdGVkIGJlbG93LgorICoKKyAqIEBwYXJhbSBkZXZpY2VOdW1iZXIgVGhlIGFkZHJlc3Mgb2YgdGhlIEphZ3VhciBvbiB0aGUgQ0FOIGJ1cy4KKyAqIEBzZWUgQ0FOSmFndWFyI1NldEN1cnJlbnRNb2RlKGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRDdXJyZW50TW9kZShQb3RlbnRpb21ldGVyVGFnLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQorICogQHNlZSBDQU5KYWd1YXIjU2V0Q3VycmVudE1vZGUoRW5jb2RlclRhZywgaW50LCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQorICogQHNlZSBDQU5KYWd1YXIjU2V0Q3VycmVudE1vZGUoUXVhZEVuY29kZXJUYWcsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFBlcmNlbnRNb2RlKCkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFBlcmNlbnRNb2RlKFBvdGVudGlvbWV0ZXJUYWcpCisgKiBAc2VlIENBTkphZ3VhciNTZXRQZXJjZW50TW9kZShFbmNvZGVyVGFnLCBpbnQpCisgKiBAc2VlIENBTkphZ3VhciNTZXRQZXJjZW50TW9kZShRdWFkRW5jb2RlclRhZywgaW50KQorICogQHNlZSBDQU5KYWd1YXIjU2V0UG9zaXRpb25Nb2RlKFBvdGVudGlvbWV0ZXJUYWcsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRQb3NpdGlvbk1vZGUoUXVhZEVuY29kZXJUYWcsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFNwZWVkTW9kZShFbmNvZGVyVGFnLCBpbnQsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRTcGVlZE1vZGUoUXVhZEVuY29kZXJUYWcsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFZvbHRhZ2VNb2RlKCkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFZvbHRhZ2VNb2RlKFBvdGVudGlvbWV0ZXJUYWcpCisgKiBAc2VlIENBTkphZ3VhciNTZXRWb2x0YWdlTW9kZShFbmNvZGVyVGFnLCBpbnQpCisgKiBAc2VlIENBTkphZ3VhciNTZXRWb2x0YWdlTW9kZShRdWFkRW5jb2RlclRhZywgaW50KQorICovCitDQU5KYWd1YXI6OkNBTkphZ3Vhcih1aW50OF90IGRldmljZU51bWJlcikKKwk6IG1fZGV2aWNlTnVtYmVyIChkZXZpY2VOdW1iZXIpCisJLCBtX21heE91dHB1dFZvbHRhZ2UgKGtBcHByb3hCdXNWb2x0YWdlKQorCSwgbV9zYWZldHlIZWxwZXIgKE5VTEwpCit7CisJY2hhciBidWZbNjRdOworCXNucHJpbnRmKGJ1ZiwgNjQsICJDQU5KYWd1YXIgZGV2aWNlIG51bWJlciAlZCIsIG1fZGV2aWNlTnVtYmVyKTsKKwlSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QoJmFsbG9jYXRlZCwgNjMpOworCisJaWYgKGFsbG9jYXRlZC0+QWxsb2NhdGUobV9kZXZpY2VOdW1iZXItMSwgYnVmKSA9PSB+MHVsKQorCXsKKwkJQ2xvbmVFcnJvcihhbGxvY2F0ZWQpOworCQlyZXR1cm47CisJfQorCisJU2V0UGVyY2VudE1vZGUoKTsKKwlJbml0Q0FOSmFndWFyKCk7CisJQ29uZmlnTWF4T3V0cHV0Vm9sdGFnZShrQXBwcm94QnVzVm9sdGFnZSk7Cit9CisKK0NBTkphZ3Vhcjo6fkNBTkphZ3VhcigpCit7CisJYWxsb2NhdGVkLT5GcmVlKG1fZGV2aWNlTnVtYmVyLTEpOworCisJaW50MzJfdCBzdGF0dXM7CisKKwkvLyBEaXNhYmxlIHBlcmlvZGljIHNldHBvaW50cworCWlmKG1fY29udHJvbE1vZGUgPT0ga1BlcmNlbnRWYnVzKQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShtX2RldmljZU51bWJlciB8IExNX0FQSV9WT0xUX1RfU0VULCBOVUxMLCAwLCBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcsICZzdGF0dXMpOworCWVsc2UgaWYobV9jb250cm9sTW9kZSA9PSBrU3BlZWQpCisJCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKG1fZGV2aWNlTnVtYmVyIHwgTE1fQVBJX1NQRF9UX1NFVCwgTlVMTCwgMCwgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HLCAmc3RhdHVzKTsKKwllbHNlIGlmKG1fY29udHJvbE1vZGUgPT0ga1Bvc2l0aW9uKQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShtX2RldmljZU51bWJlciB8IExNX0FQSV9QT1NfVF9TRVQsIE5VTEwsIDAsIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORywgJnN0YXR1cyk7CisJZWxzZSBpZihtX2NvbnRyb2xNb2RlID09IGtDdXJyZW50KQorCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShtX2RldmljZU51bWJlciB8IExNX0FQSV9JQ1RSTF9UX1NFVCwgTlVMTCwgMCwgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HLCAmc3RhdHVzKTsKKwllbHNlIGlmKG1fY29udHJvbE1vZGUgPT0ga1ZvbHRhZ2UpCisJCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKG1fZGV2aWNlTnVtYmVyIHwgTE1fQVBJX1ZDT01QX1RfU0VULCBOVUxMLCAwLCBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcsICZzdGF0dXMpOworCisJZGVsZXRlIG1fc2FmZXR5SGVscGVyOworCW1fc2FmZXR5SGVscGVyID0gTlVMTDsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBDQU4gSUQgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvcgorICovCit1aW50OF90IENBTkphZ3Vhcjo6Z2V0RGV2aWNlTnVtYmVyKCkgY29uc3QKK3sKKwlyZXR1cm4gbV9kZXZpY2VOdW1iZXI7Cit9CisKKy8qKgorICogU2V0cyB0aGUgb3V0cHV0IHNldC1wb2ludCB2YWx1ZS4KKyAqCisgKiBUaGUgc2NhbGUgYW5kIHRoZSB1bml0cyBkZXBlbmQgb24gdGhlIG1vZGUgdGhlIEphZ3VhciBpcyBpbi48YnI+CisgKiBJbiBwZXJjZW50VmJ1cyBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgZnJvbSAtMS4wIHRvIDEuMCAoc2FtZSBhcyBQV00gSmFndWFyKS48YnI+CisgKiBJbiB2b2x0YWdlIE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiB2b2x0cy4gPGJyPgorICogSW4gY3VycmVudCBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gYW1wcy4gPGJyPgorICogSW4gc3BlZWQgTW9kZSwgdGhlIG91dHB1dFZhbHVlIGlzIGluIHJvdGF0aW9ucy9taW51dGUuPGJyPgorICogSW4gcG9zaXRpb24gTW9kZSwgdGhlIG91dHB1dFZhbHVlIGlzIGluIHJvdGF0aW9ucy4KKyAqCisgKiBAcGFyYW0gb3V0cHV0VmFsdWUgVGhlIHNldC1wb2ludCB0byBzZW50IHRvIHRoZSBtb3RvciBjb250cm9sbGVyLgorICogQHBhcmFtIHN5bmNHcm91cCBUaGUgdXBkYXRlIGdyb3VwIHRvIGFkZCB0aGlzIFNldCgpIHRvLCBwZW5kaW5nIFVwZGF0ZVN5bmNHcm91cCgpLiAgSWYgMCwgdXBkYXRlIGltbWVkaWF0ZWx5LgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0KGZsb2F0IG91dHB1dFZhbHVlLCB1aW50OF90IHN5bmNHcm91cCkKK3sKKwl1aW50MzJfdCBtZXNzYWdlSUQ7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwlpZihtX3NhZmV0eUhlbHBlciAmJiAhbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKSAmJiBtX2NvbnRyb2xFbmFibGVkKQorCXsKKwkJRW5hYmxlQ29udHJvbCgpOworCX0KKworCWlmKG1fY29udHJvbEVuYWJsZWQpCisJeworCQlzd2l0Y2gobV9jb250cm9sTW9kZSkKKwkJeworCQljYXNlIGtQZXJjZW50VmJ1czoKKwkJCXsKKwkJCQltZXNzYWdlSUQgPSBMTV9BUElfVk9MVF9UX1NFVDsKKwkJCQlpZiAob3V0cHV0VmFsdWUgPiAxLjApIG91dHB1dFZhbHVlID0gMS4wOworCQkJCWlmIChvdXRwdXRWYWx1ZSA8IC0xLjApIG91dHB1dFZhbHVlID0gLTEuMDsKKwkJCQlkYXRhU2l6ZSA9IHBhY2tQZXJjZW50YWdlKGRhdGFCdWZmZXIsIG91dHB1dFZhbHVlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIGtTcGVlZDoKKwkJCXsKKwkJCQltZXNzYWdlSUQgPSBMTV9BUElfU1BEX1RfU0VUOworCQkJCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIG91dHB1dFZhbHVlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIGtQb3NpdGlvbjoKKwkJCXsKKwkJCQltZXNzYWdlSUQgPSBMTV9BUElfUE9TX1RfU0VUOworCQkJCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIG91dHB1dFZhbHVlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIGtDdXJyZW50OgorCQkJeworCQkJCW1lc3NhZ2VJRCA9IExNX0FQSV9JQ1RSTF9UX1NFVDsKKwkJCQlkYXRhU2l6ZSA9IHBhY2tGWFA4XzgoZGF0YUJ1ZmZlciwgb3V0cHV0VmFsdWUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Uga1ZvbHRhZ2U6CisJCQl7CisJCQkJbWVzc2FnZUlEID0gTE1fQVBJX1ZDT01QX1RfU0VUOworCQkJCWRhdGFTaXplID0gcGFja0ZYUDhfOChkYXRhQnVmZmVyLCBvdXRwdXRWYWx1ZSk7CisJCQl9CisJCQlicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIlRoZSBKYWd1YXIgb25seSBzdXBwb3J0cyBDdXJyZW50LCBWb2x0YWdlLCBQb3NpdGlvbiwgU3BlZWQsIGFuZCBQZXJjZW50IChUaHJvdHRsZSkgbW9kZXMuIik7CisgICAgICByZXR1cm47CisJCX0KKwkJaWYgKHN5bmNHcm91cCAhPSAwKQorCQl7CisJCQlkYXRhQnVmZmVyW2RhdGFTaXplXSA9IHN5bmNHcm91cDsKKwkJCWRhdGFTaXplKys7CisJCX0KKworCQlzZW5kTWVzc2FnZShtZXNzYWdlSUQsIGRhdGFCdWZmZXIsIGRhdGFTaXplLCBrU2VuZE1lc3NhZ2VQZXJpb2QpOworCisJCWlmIChtX3NhZmV0eUhlbHBlcikgbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKKwl9CisKKwltX3ZhbHVlID0gb3V0cHV0VmFsdWU7CisKKwl2ZXJpZnkoKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlY2VudGx5IHNldCBvdXRwdXRWYWx1ZSBzZXRwb2ludC4KKyAqCisgKiBUaGUgc2NhbGUgYW5kIHRoZSB1bml0cyBkZXBlbmQgb24gdGhlIG1vZGUgdGhlIEphZ3VhciBpcyBpbi48YnI+CisgKiBJbiBwZXJjZW50VmJ1cyBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgZnJvbSAtMS4wIHRvIDEuMCAoc2FtZSBhcyBQV00gSmFndWFyKS48YnI+CisgKiBJbiB2b2x0YWdlIE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiB2b2x0cy48YnI+CisgKiBJbiBjdXJyZW50IE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiBhbXBzLjxicj4KKyAqIEluIHNwZWVkIE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiByb3RhdGlvbnMvbWludXRlLjxicj4KKyAqIEluIHBvc2l0aW9uIE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiByb3RhdGlvbnMuPGJyPgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IG91dHB1dFZhbHVlIHNldHBvaW50LgorICovCitmbG9hdCBDQU5KYWd1YXI6OkdldCgpCit7CisJcmV0dXJuIG1fdmFsdWU7Cit9CisKKy8qKgorKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyoKKyogQGRlcHJlY2F0ZWQgQ2FsbCB7QGxpbmsgI0Rpc2FibGVDb250cm9sKCl9IGluc3RlYWQuCisqLwordm9pZCBDQU5KYWd1YXI6OkRpc2FibGUoKQoreworCURpc2FibGVDb250cm9sKCk7Cit9CisKKy8qKgorICogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorICoKKyAqIEBkZXByZWNhdGVkIENhbGwgU2V0IGluc3RlYWQuCisgKgorICogQHBhcmFtIG91dHB1dCBXcml0ZSBvdXQgdGhlIFBlcmNlbnRWYnVzIHZhbHVlIGFzIHdhcyBjb21wdXRlZCBieSB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIENBTkphZ3Vhcjo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KQoreworCWlmIChtX2NvbnRyb2xNb2RlID09IGtQZXJjZW50VmJ1cykKKwl7CisJCVNldChvdXRwdXQpOworCX0KKwllbHNlCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiUElEIG9ubHkgc3VwcG9ydGVkIGluIFBlcmNlbnRWYnVzIG1vZGUiKTsKKwl9Cit9CisKK3VpbnQ4X3QgQ0FOSmFndWFyOjpwYWNrUGVyY2VudGFnZSh1aW50OF90ICpidWZmZXIsIGRvdWJsZSB2YWx1ZSkKK3sKKwlpbnQxNl90IGludFZhbHVlID0gKGludDE2X3QpKHZhbHVlICogMzI3NjcuMCk7CisJKigoaW50MTZfdCopYnVmZmVyKSA9IHN3YXAxNihpbnRWYWx1ZSk7CisJcmV0dXJuIHNpemVvZihpbnQxNl90KTsKK30KKwordWludDhfdCBDQU5KYWd1YXI6OnBhY2tGWFA4XzgodWludDhfdCAqYnVmZmVyLCBkb3VibGUgdmFsdWUpCit7CisJaW50MTZfdCBpbnRWYWx1ZSA9IChpbnQxNl90KSh2YWx1ZSAqIDI1Ni4wKTsKKwkqKChpbnQxNl90KilidWZmZXIpID0gc3dhcDE2KGludFZhbHVlKTsKKwlyZXR1cm4gc2l6ZW9mKGludDE2X3QpOworfQorCit1aW50OF90IENBTkphZ3Vhcjo6cGFja0ZYUDE2XzE2KHVpbnQ4X3QgKmJ1ZmZlciwgZG91YmxlIHZhbHVlKQoreworCWludDMyX3QgaW50VmFsdWUgPSAoaW50MzJfdCkodmFsdWUgKiA2NTUzNi4wKTsKKwkqKChpbnQzMl90KilidWZmZXIpID0gc3dhcDMyKGludFZhbHVlKTsKKwlyZXR1cm4gc2l6ZW9mKGludDMyX3QpOworfQorCit1aW50OF90IENBTkphZ3Vhcjo6cGFja2ludDE2X3QodWludDhfdCAqYnVmZmVyLCBpbnQxNl90IHZhbHVlKQoreworCSooKGludDE2X3QqKWJ1ZmZlcikgPSBzd2FwMTYodmFsdWUpOworCXJldHVybiBzaXplb2YoaW50MTZfdCk7Cit9CisKK3VpbnQ4X3QgQ0FOSmFndWFyOjpwYWNraW50MzJfdCh1aW50OF90ICpidWZmZXIsIGludDMyX3QgdmFsdWUpCit7CisJKigoaW50MzJfdCopYnVmZmVyKSA9IHN3YXAzMih2YWx1ZSk7CisJcmV0dXJuIHNpemVvZihpbnQzMl90KTsKK30KKworZG91YmxlIENBTkphZ3Vhcjo6dW5wYWNrUGVyY2VudGFnZSh1aW50OF90ICpidWZmZXIpCit7CisJaW50MTZfdCB2YWx1ZSA9ICooKGludDE2X3QqKWJ1ZmZlcik7CisJdmFsdWUgPSBzd2FwMTYodmFsdWUpOworCXJldHVybiB2YWx1ZSAvIDMyNzY3LjA7Cit9CisKK2RvdWJsZSBDQU5KYWd1YXI6OnVucGFja0ZYUDhfOCh1aW50OF90ICpidWZmZXIpCit7CisJaW50MTZfdCB2YWx1ZSA9ICooKGludDE2X3QqKWJ1ZmZlcik7CisJdmFsdWUgPSBzd2FwMTYodmFsdWUpOworCXJldHVybiB2YWx1ZSAvIDI1Ni4wOworfQorCitkb3VibGUgQ0FOSmFndWFyOjp1bnBhY2tGWFAxNl8xNih1aW50OF90ICpidWZmZXIpCit7CisJaW50MzJfdCB2YWx1ZSA9ICooKGludDMyX3QqKWJ1ZmZlcik7CisJdmFsdWUgPSBzd2FwMzIodmFsdWUpOworCXJldHVybiB2YWx1ZSAvIDY1NTM2LjA7Cit9CisKK2ludDE2X3QgQ0FOSmFndWFyOjp1bnBhY2tpbnQxNl90KHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKwlpbnQxNl90IHZhbHVlID0gKigoaW50MTZfdCopYnVmZmVyKTsKKwlyZXR1cm4gc3dhcDE2KHZhbHVlKTsKK30KKworaW50MzJfdCBDQU5KYWd1YXI6OnVucGFja2ludDMyX3QodWludDhfdCAqYnVmZmVyKQoreworCWludDMyX3QgdmFsdWUgPSAqKChpbnQzMl90KilidWZmZXIpOworCXJldHVybiBzd2FwMzIodmFsdWUpOworfQorCisvKioKKyAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBKYWd1YXIuCisgKgorICogQHBhcmFtIG1lc3NhZ2VJRCBUaGUgbWVzc2FnZUlEIHRvIGJlIHVzZWQgb24gdGhlIENBTiBidXMgKGRldmljZSBudW1iZXIgaXMgYWRkZWQgaW50ZXJuYWxseSkKKyAqIEBwYXJhbSBkYXRhIFRoZSB1cCB0byA4IGJ5dGVzIG9mIGRhdGEgdG8gYmUgc2VudCB3aXRoIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZGF0YVNpemUgU3BlY2lmeSBob3cgbXVjaCBvZiB0aGUgZGF0YSBpbiAiZGF0YSIgdG8gc2VuZAorICogQHBhcmFtIHBlcmlvZGljIElmIHBvc2l0aXZlLCB0ZWxsIE5ldHdvcmsgQ29tbXVuaWNhdGlvbnMgdG8gc2VuZCB0aGUgbWVzc2FnZQorICogCWV2ZXJ5ICJwZXJpb2QiIG1pbGxpc2Vjb25kcy4KKyAqLwordm9pZCBDQU5KYWd1YXI6OnNlbmRNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwgdWludDhfdCBkYXRhU2l6ZSwgaW50MzJfdCBwZXJpb2QpCit7CisJaW50MzJfdCBsb2NhbFN0YXR1cyA9IHNlbmRNZXNzYWdlSGVscGVyKG1lc3NhZ2VJRCB8IG1fZGV2aWNlTnVtYmVyLCBkYXRhLCBkYXRhU2l6ZSwgcGVyaW9kKTsKKworCWlmKGxvY2FsU3RhdHVzIDwgMCkKKwl7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KGxvY2FsU3RhdHVzLCAic2VuZE1lc3NhZ2UiKTsKKwl9Cit9CisKKy8qKgorICogUmVxdWVzdCBhIG1lc3NhZ2UgZnJvbSB0aGUgSmFndWFyLCBidXQgZG9uJ3Qgd2FpdCBmb3IgaXQgdG8gYXJyaXZlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlSUQgVGhlIG1lc3NhZ2UgdG8gcmVxdWVzdAorICogQHBhcmFtIHBlcmlvZGljIElmIHBvc2l0aXZlLCB0ZWxsIE5ldHdvcmsgQ29tbXVuaWNhdGlvbnMgdG8gc2VuZCB0aGUgbWVzc2FnZQorICogCWV2ZXJ5ICJwZXJpb2QiIG1pbGxpc2Vjb25kcy4KKyAqLwordm9pZCBDQU5KYWd1YXI6OnJlcXVlc3RNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgaW50MzJfdCBwZXJpb2QpCit7CisJc2VuZE1lc3NhZ2VIZWxwZXIobWVzc2FnZUlEIHwgbV9kZXZpY2VOdW1iZXIsIE5VTEwsIDAsIHBlcmlvZCk7Cit9CisKKy8qKgorICogR2V0IGEgcHJldmlvdXNseSByZXF1ZXN0ZWQgbWVzc2FnZS4KKyAqCisgKiBKYWd1YXIgYWx3YXlzIGdlbmVyYXRlcyBhIG1lc3NhZ2Ugd2l0aCB0aGUgc2FtZSBtZXNzYWdlIElEIHdoZW4gcmVwbHlpbmcuCisgKgorICogQHBhcmFtIG1lc3NhZ2VJRCBUaGUgbWVzc2FnZUlEIHRvIHJlYWQgZnJvbSB0aGUgQ0FOIGJ1cyAoZGV2aWNlIG51bWJlciBpcyBhZGRlZCBpbnRlcm5hbGx5KQorICogQHBhcmFtIGRhdGEgVGhlIHVwIHRvIDggYnl0ZXMgb2YgZGF0YSB0aGF0IHdhcyByZWNlaXZlZCB3aXRoIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZGF0YVNpemUgSW5kaWNhdGVzIGhvdyBtdWNoIGRhdGEgd2FzIHJlY2VpdmVkCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcyBmb3VuZC4gIE90aGVyd2lzZSwgbm8gbmV3IG1lc3NhZ2UgaXMgYXZhaWxhYmxlLgorICovCitib29sIENBTkphZ3Vhcjo6Z2V0TWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VNYXNrLCB1aW50OF90ICpkYXRhLCB1aW50OF90ICpkYXRhU2l6ZSkKK3sKKwl1aW50MzJfdCB0YXJnZXRlZE1lc3NhZ2VJRCA9IG1lc3NhZ2VJRCB8IG1fZGV2aWNlTnVtYmVyOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MzJfdCB0aW1lU3RhbXA7CisKKwkvLyBDYWxsZXIgbWF5IGhhdmUgc2V0IGJpdDMxIGZvciByZW1vdGUgZnJhbWUgdHJhbnNtaXNzaW9uIHNvIGNsZWFyIGludmFsaWQgYml0c1szMS0yOV0KKwl0YXJnZXRlZE1lc3NhZ2VJRCAmPSBDQU5fTVNHSURfRlVMTF9NOworCisJLy8gR2V0IHRoZSBkYXRhLgorCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3JlY2VpdmVNZXNzYWdlKCZ0YXJnZXRlZE1lc3NhZ2VJRCwgbWVzc2FnZU1hc2ssIGRhdGEsIGRhdGFTaXplLCAmdGltZVN0YW1wLCAmc3RhdHVzKTsKKworCS8vIERvIHdlIGFscmVhZHkgaGF2ZSB0aGUgbW9zdCByZWNlbnQgdmFsdWU/CisJaWYoc3RhdHVzID09IEVSUl9DQU5TZXNzaW9uTXV4X01lc3NhZ2VOb3RGb3VuZCkKKwkJcmV0dXJuIGZhbHNlOworCWVsc2UKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCAicmVjZWl2ZU1lc3NhZ2UiKTsKKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIEVuYWJsZXMgcGVyaW9kaWMgc3RhdHVzIHVwZGF0ZXMgZnJvbSB0aGUgSmFndWFyLgorICovCit2b2lkIENBTkphZ3Vhcjo6c2V0dXBQZXJpb2RpY1N0YXR1cygpIHsKKwl1aW50OF90IGRhdGFbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCS8vIE1lc3NhZ2UgMCByZXR1cm5zIGJ1cyB2b2x0YWdlLCBvdXRwdXQgdm9sdGFnZSwgb3V0cHV0IGN1cnJlbnQsIGFuZAorCS8vIHRlbXBlcmF0dXJlLgorCXN0YXRpYyBjb25zdCB1aW50OF90IGtNZXNzYWdlMERhdGFbXSA9IHsKKwkJTE1fUFNUQVRfVk9MVEJVU19CMCwgTE1fUFNUQVRfVk9MVEJVU19CMSwKKwkJTE1fUFNUQVRfVk9MVE9VVF9CMCwgTE1fUFNUQVRfVk9MVE9VVF9CMSwKKwkJTE1fUFNUQVRfQ1VSUkVOVF9CMCwgTE1fUFNUQVRfQ1VSUkVOVF9CMSwKKwkJTE1fUFNUQVRfVEVNUF9CMCwgTE1fUFNUQVRfVEVNUF9CMQorCX07CisKKwkvLyBNZXNzYWdlIDEgcmV0dXJucyBwb3NpdGlvbiBhbmQgc3BlZWQKKwlzdGF0aWMgY29uc3QgdWludDhfdCBrTWVzc2FnZTFEYXRhW10gPSB7CisJCUxNX1BTVEFUX1BPU19CMCwgTE1fUFNUQVRfUE9TX0IxLCBMTV9QU1RBVF9QT1NfQjIsIExNX1BTVEFUX1BPU19CMywKKwkJTE1fUFNUQVRfU1BEX0IwLCBMTV9QU1RBVF9TUERfQjEsIExNX1BTVEFUX1NQRF9CMiwgTE1fUFNUQVRfU1BEX0IzCisJfTsKKworCS8vIE1lc3NhZ2UgMiByZXR1cm5zIGxpbWl0cyBhbmQgZmF1bHRzCisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01lc3NhZ2UyRGF0YVtdID0geworCQlMTV9QU1RBVF9MSU1JVF9DTFIsCisJCUxNX1BTVEFUX0ZBVUxULAorCQlMTV9QU1RBVF9FTkQKKwl9OworCisJZGF0YVNpemUgPSBwYWNraW50MTZfdChkYXRhLCBrU2VuZE1lc3NhZ2VQZXJpb2QpOworCXNlbmRNZXNzYWdlKExNX0FQSV9QU1RBVF9QRVJfRU5fUzAsIGRhdGEsIGRhdGFTaXplKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfUFNUQVRfUEVSX0VOX1MxLCBkYXRhLCBkYXRhU2l6ZSk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1BTVEFUX1BFUl9FTl9TMiwgZGF0YSwgZGF0YVNpemUpOworCisJZGF0YVNpemUgPSA4OworCXNlbmRNZXNzYWdlKExNX0FQSV9QU1RBVF9DRkdfUzAsIGtNZXNzYWdlMERhdGEsIGRhdGFTaXplKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfUFNUQVRfQ0ZHX1MxLCBrTWVzc2FnZTFEYXRhLCBkYXRhU2l6ZSk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1BTVEFUX0NGR19TMiwga01lc3NhZ2UyRGF0YSwgZGF0YVNpemUpOworfQorCisvKioKKyAqIENoZWNrIGZvciBuZXcgcGVyaW9kaWMgc3RhdHVzIHVwZGF0ZXMgYW5kIHVucGFjayB0aGVtIGludG8gbG9jYWwgdmFyaWFibGVzCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjp1cGRhdGVQZXJpb2RpY1N0YXR1cygpIHsKKwl1aW50OF90IGRhdGFbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCS8vIENoZWNrIGlmIGEgbmV3IGJ1cyB2b2x0YWdlL291dHB1dCB2b2x0YWdlL2N1cnJlbnQvdGVtcGVyYXR1cmUgbWVzc2FnZQorCS8vIGhhcyBhcnJpdmVkIGFuZCB1bnBhY2sgdGhlIHZhbHVlcyBpbnRvIHRoZSBjYWNoZWQgbWVtYmVyIHZhcmlhYmxlcworCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1BTVEFUX0RBVEFfUzAsIENBTl9NU0dJRF9GVUxMX00sIGRhdGEsICZkYXRhU2l6ZSkpIHsKKwkJbV9idXNWb2x0YWdlICAgID0gdW5wYWNrRlhQOF84KGRhdGEpOworCQltX291dHB1dFZvbHRhZ2UgPSB1bnBhY2tQZXJjZW50YWdlKGRhdGEgKyAyKSAqIG1fYnVzVm9sdGFnZTsKKwkJbV9vdXRwdXRDdXJyZW50ID0gdW5wYWNrRlhQOF84KGRhdGEgKyA0KTsKKwkJbV90ZW1wZXJhdHVyZSAgID0gdW5wYWNrRlhQOF84KGRhdGEgKyA2KTsKKworCQltX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTAgPSB0cnVlOworCX0KKworCS8vIENoZWNrIGlmIGEgbmV3IHBvc2l0aW9uL3NwZWVkIG1lc3NhZ2UgaGFzIGFycml2ZWQgYW5kIGRvIHRoZSBzYW1lCisJaWYoZ2V0TWVzc2FnZShMTV9BUElfUFNUQVRfREFUQV9TMSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YSwgJmRhdGFTaXplKSkgeworCQltX3Bvc2l0aW9uID0gdW5wYWNrRlhQMTZfMTYoZGF0YSk7CisJCW1fc3BlZWQgICAgPSB1bnBhY2tGWFAxNl8xNihkYXRhICsgNCk7CisKKwkJbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UxID0gdHJ1ZTsKKwl9CisKKwkvLyBDaGVjayBpZiBhIG5ldyBsaW1pdHMvZmF1bHRzIG1lc3NhZ2UgaGFzIGFycml2ZWQgYW5kIGRvIHRoZSBzYW1lCisJaWYoZ2V0TWVzc2FnZShMTV9BUElfUFNUQVRfREFUQV9TMiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YSwgJmRhdGFTaXplKSkgeworCQltX2xpbWl0cyA9IGRhdGFbMF07CisJCW1fZmF1bHRzID0gZGF0YVsxXTsKKworCQltX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIgPSB0cnVlOworCX0KK30KKworLyoqCisgKiBDaGVjayBhbGwgdW52ZXJpZmllZCBwYXJhbXMgYW5kIG1ha2Ugc3VyZSB0aGV5J3JlIGVxdWFsIHRvIHRoZWlyIGxvY2FsCisgKiBjYWNoZWQgdmVyc2lvbnMuIElmIGEgdmFsdWUgaXNuJ3QgYXZhaWxhYmxlLCBpdCBnZXRzIHJlcXVlc3RlZC4gIElmIGEgdmFsdWUKKyAqIGRvZXNuJ3QgbWF0Y2ggdXAsIGl0IGdldHMgc2V0IGFnYWluLgorICovCit2b2lkIENBTkphZ3Vhcjo6dmVyaWZ5KCkKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCS8vIElmIHRoZSBKYWd1YXIgbG9zdCBwb3dlciwgZXZlcnl0aGluZyBzaG91bGQgYmUgY29uc2lkZXJlZCB1bnZlcmlmaWVkLgorCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1NUQVRVU19QT1dFUiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwl7CisJCWJvb2wgcG93ZXJDeWNsZWQgPSAoYm9vbClkYXRhQnVmZmVyWzBdOworCisJCWlmKHBvd2VyQ3ljbGVkKQorCQl7CisJCQkvLyBDbGVhciB0aGUgcG93ZXIgY3ljbGVkIGJpdAorCQkJZGF0YUJ1ZmZlclswXSA9IDE7CisJCQlzZW5kTWVzc2FnZShMTV9BUElfU1RBVFVTX1BPV0VSLCBkYXRhQnVmZmVyLCBzaXplb2YodWludDhfdCkpOworCisJCQkvLyBNYXJrIGV2ZXJ5dGhpbmcgYXMgdW52ZXJpZmllZAorCQkJbV9jb250cm9sTW9kZVZlcmlmaWVkID0gZmFsc2U7CisJCQltX3NwZWVkUmVmVmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fcG9zUmVmVmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fbmV1dHJhbE1vZGVWZXJpZmllZCA9IGZhbHNlOworCQkJbV9lbmNvZGVyQ29kZXNQZXJSZXZWZXJpZmllZCA9IGZhbHNlOworCQkJbV9wb3RlbnRpb21ldGVyVHVybnNWZXJpZmllZCA9IGZhbHNlOworCQkJbV9mb3J3YXJkTGltaXRWZXJpZmllZCA9IGZhbHNlOworCQkJbV9yZXZlcnNlTGltaXRWZXJpZmllZCA9IGZhbHNlOworCQkJbV9saW1pdE1vZGVWZXJpZmllZCA9IGZhbHNlOworCQkJbV9tYXhPdXRwdXRWb2x0YWdlVmVyaWZpZWQgPSBmYWxzZTsKKwkJCW1fZmF1bHRUaW1lVmVyaWZpZWQgPSBmYWxzZTsKKworCQkJaWYobV9jb250cm9sTW9kZSA9PSBrUGVyY2VudFZidXMgfHwgbV9jb250cm9sTW9kZSA9PSBrVm9sdGFnZSkKKwkJCXsKKwkJCQltX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkID0gZmFsc2U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbV9wVmVyaWZpZWQgPSBmYWxzZTsKKwkJCQltX2lWZXJpZmllZCA9IGZhbHNlOworCQkJCW1fZFZlcmlmaWVkID0gZmFsc2U7CisJCQl9CisKKwkJCS8vIFZlcmlmeSBwZXJpb2RpYyBzdGF0dXMgbWVzc2FnZXMgYWdhaW4KKwkJCW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMCA9IGZhbHNlOworCQkJbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UxID0gZmFsc2U7CisJCQltX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIgPSBmYWxzZTsKKworCQkJLy8gUmVtb3ZlIGFueSBvbGQgdmFsdWVzIGZyb20gbmV0Y29tbXMuIE90aGVyd2lzZSwgcGFyYW1ldGVycyBhcmUKKwkJCS8vIGluY29ycmVjdGx5IG1hcmtlZCBhcyB2ZXJpZmllZCBiYXNlZCBvbiBzdGFsZSBtZXNzYWdlcy4KKwkJCWdldE1lc3NhZ2UoTE1fQVBJX1NQRF9SRUYsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9QT1NfUkVGLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfU1BEX1BDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfUE9TX1BDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfSUNUUkxfUEMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9TUERfSUMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9QT1NfSUMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9JQ1RSTF9JQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX1NQRF9EQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX1BPU19EQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX0lDVFJMX0RDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0JSQUtFX0NPQVNULCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0VOQ19MSU5FUywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX0NGR19QT1RfVFVSTlMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfTU9ERSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9GV0QsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisJCQlnZXRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfUkVWLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX01BWF9WT1VULCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQkJZ2V0TWVzc2FnZShMTV9BUElfVk9MVF9TRVRfUkFNUCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX1ZDT01QX0NPTVBfUkFNUCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKwkJCWdldE1lc3NhZ2UoTE1fQVBJX0NGR19GQVVMVF9USU1FLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworCQl9CisJfQorCWVsc2UKKwl7CisJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9TVEFUVVNfUE9XRVIpOworCX0KKworCS8vIFZlcmlmeSB0aGF0IGFueSByZWNlbnRseSBzZXQgcGFyYW1ldGVycyBhcmUgY29ycmVjdAorCWlmKCFtX2NvbnRyb2xNb2RlVmVyaWZpZWQgJiYgbV9jb250cm9sRW5hYmxlZCkKKwl7CisJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1NUQVRVU19DTU9ERSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJQ29udHJvbE1vZGUgbW9kZSA9IChDb250cm9sTW9kZSlkYXRhQnVmZmVyWzBdOworCisJCQlpZihtX2NvbnRyb2xNb2RlID09IG1vZGUpCisJCQkJbV9jb250cm9sTW9kZVZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQkvLyBFbmFibGUgY29udHJvbCBhZ2FpbiB0byByZXNlbmQgdGhlIGNvbnRyb2wgbW9kZQorCQkJCUVuYWJsZUNvbnRyb2woKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX1NUQVRVU19DTU9ERSk7CisJCX0KKwl9CisKKwlpZighbV9zcGVlZFJlZlZlcmlmaWVkKQorCXsKKwkJaWYoZ2V0TWVzc2FnZShMTV9BUElfU1BEX1JFRiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJdWludDhfdCBzcGVlZFJlZiA9IGRhdGFCdWZmZXJbMF07CisKKwkJCWlmKG1fc3BlZWRSZWZlcmVuY2UgPT0gc3BlZWRSZWYpCisJCQkJbV9zcGVlZFJlZlZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJU2V0U3BlZWRSZWZlcmVuY2UobV9zcGVlZFJlZmVyZW5jZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9TUERfUkVGKTsKKwkJfQorCX0KKworCWlmKCFtX3Bvc1JlZlZlcmlmaWVkKQorCXsKKwkJaWYoZ2V0TWVzc2FnZShMTV9BUElfUE9TX1JFRiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJdWludDhfdCBwb3NSZWYgPSBkYXRhQnVmZmVyWzBdOworCisJCQlpZihtX3Bvc2l0aW9uUmVmZXJlbmNlID09IHBvc1JlZikKKwkJCQltX3Bvc1JlZlZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJU2V0UG9zaXRpb25SZWZlcmVuY2UobV9wb3NpdGlvblJlZmVyZW5jZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9QT1NfUkVGKTsKKwkJfQorCX0KKworCWlmKCFtX3BWZXJpZmllZCkKKwl7CisJCXVpbnQzMl90IG1lc3NhZ2U7CisKKwkJaWYobV9jb250cm9sTW9kZSA9PSBrU3BlZWQpCisJCQltZXNzYWdlID0gTE1fQVBJX1NQRF9QQzsKKwkJZWxzZSBpZihtX2NvbnRyb2xNb2RlID09IGtQb3NpdGlvbikKKwkJCW1lc3NhZ2UgPSBMTV9BUElfUE9TX1BDOworCQllbHNlIGlmKG1fY29udHJvbE1vZGUgPT0ga0N1cnJlbnQpCisJCQltZXNzYWdlID0gTE1fQVBJX0lDVFJMX1BDOworCisJCWlmKGdldE1lc3NhZ2UobWVzc2FnZSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJZG91YmxlIHAgPSB1bnBhY2tGWFAxNl8xNihkYXRhQnVmZmVyKTsKKworCQkJaWYoRlhQMTZfRVEobV9wLCBwKSkKKwkJCQltX3BWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCVNldFAobV9wKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSk7CisJCX0KKwl9CisKKwlpZighbV9pVmVyaWZpZWQpCisJeworCQl1aW50MzJfdCBtZXNzYWdlOworCisJCWlmKG1fY29udHJvbE1vZGUgPT0ga1NwZWVkKQorCQkJbWVzc2FnZSA9IExNX0FQSV9TUERfSUM7CisJCWVsc2UgaWYobV9jb250cm9sTW9kZSA9PSBrUG9zaXRpb24pCisJCQltZXNzYWdlID0gTE1fQVBJX1BPU19JQzsKKwkJZWxzZSBpZihtX2NvbnRyb2xNb2RlID09IGtDdXJyZW50KQorCQkJbWVzc2FnZSA9IExNX0FQSV9JQ1RSTF9JQzsKKworCQlpZihnZXRNZXNzYWdlKG1lc3NhZ2UsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCWRvdWJsZSBpID0gdW5wYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlcik7CisKKwkJCWlmKEZYUDE2X0VRKG1faSwgaSkpCisJCQkJbV9pVmVyaWZpZWQgPSB0cnVlOworCQkJZWxzZQorCQkJCS8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKwkJCQlTZXRJKG1faSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpOworCQl9CisJfQorCisJaWYoIW1fZFZlcmlmaWVkKQorCXsKKwkJdWludDMyX3QgbWVzc2FnZTsKKworCQlpZihtX2NvbnRyb2xNb2RlID09IGtTcGVlZCkKKwkJCW1lc3NhZ2UgPSBMTV9BUElfU1BEX0RDOworCQllbHNlIGlmKG1fY29udHJvbE1vZGUgPT0ga1Bvc2l0aW9uKQorCQkJbWVzc2FnZSA9IExNX0FQSV9QT1NfREM7CisJCWVsc2UgaWYobV9jb250cm9sTW9kZSA9PSBrQ3VycmVudCkKKwkJCW1lc3NhZ2UgPSBMTV9BUElfSUNUUkxfREM7CisKKwkJaWYoZ2V0TWVzc2FnZShtZXNzYWdlLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpKQorCQl7CisJCQlkb3VibGUgZCA9IHVucGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIpOworCisJCQlpZihGWFAxNl9FUShtX2QsIGQpKQorCQkJCW1fZFZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJU2V0RChtX2QpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShtZXNzYWdlKTsKKwkJfQorCX0KKworCWlmKCFtX25ldXRyYWxNb2RlVmVyaWZpZWQpCisJeworCQlpZihnZXRNZXNzYWdlKExNX0FQSV9DRkdfQlJBS0VfQ09BU1QsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCXsKKwkJCU5ldXRyYWxNb2RlIG1vZGUgPSAoTmV1dHJhbE1vZGUpZGF0YUJ1ZmZlclswXTsKKworCQkJaWYobW9kZSA9PSBtX25ldXRyYWxNb2RlKQorCQkJCW1fbmV1dHJhbE1vZGVWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCUNvbmZpZ05ldXRyYWxNb2RlKG1fbmV1dHJhbE1vZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfQ0ZHX0JSQUtFX0NPQVNUKTsKKwkJfQorCX0KKworCWlmKCFtX2VuY29kZXJDb2Rlc1BlclJldlZlcmlmaWVkKQorCXsKKwkJaWYoZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0VOQ19MSU5FUywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJdWludDE2X3QgY29kZXMgPSB1bnBhY2tpbnQxNl90KGRhdGFCdWZmZXIpOworCisJCQlpZihjb2RlcyA9PSBtX2VuY29kZXJDb2Rlc1BlclJldikKKwkJCQltX2VuY29kZXJDb2Rlc1BlclJldlZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KG1fZW5jb2RlckNvZGVzUGVyUmV2KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19FTkNfTElORVMpOworCQl9CisJfQorCisJaWYoIW1fcG90ZW50aW9tZXRlclR1cm5zVmVyaWZpZWQpCisJeworCQlpZihnZXRNZXNzYWdlKExNX0FQSV9DRkdfUE9UX1RVUk5TLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpKQorCQl7CisJCQl1aW50MTZfdCB0dXJucyA9IHVucGFja2ludDE2X3QoZGF0YUJ1ZmZlcik7CisKKwkJCWlmKHR1cm5zID09IG1fcG90ZW50aW9tZXRlclR1cm5zKQorCQkJCW1fcG90ZW50aW9tZXRlclR1cm5zVmVyaWZpZWQgPSB0cnVlOworCQkJZWxzZQorCQkJCS8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKwkJCQlDb25maWdQb3RlbnRpb21ldGVyVHVybnMobV9wb3RlbnRpb21ldGVyVHVybnMpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfQ0ZHX1BPVF9UVVJOUyk7CisJCX0KKwl9CisKKwlpZighbV9saW1pdE1vZGVWZXJpZmllZCkKKwl7CisJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9NT0RFLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpKQorCQl7CisJCQlMaW1pdE1vZGUgbW9kZSA9IChMaW1pdE1vZGUpZGF0YUJ1ZmZlclswXTsKKworCQkJaWYobW9kZSA9PSBtX2xpbWl0TW9kZSkKKwkJCQltX2xpbWl0TW9kZVZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJQ29uZmlnTGltaXRNb2RlKG1fbGltaXRNb2RlKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9NT0RFKTsKKwkJfQorCX0KKworCWlmKCFtX2ZvcndhcmRMaW1pdFZlcmlmaWVkKQorCXsKKwkJaWYoZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX0ZXRCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJZG91YmxlIGxpbWl0ID0gdW5wYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlcik7CisKKwkJCWlmKEZYUDE2X0VRKGxpbWl0LCBtX2ZvcndhcmRMaW1pdCkpCisJCQkJbV9mb3J3YXJkTGltaXRWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQl7CisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCUNvbmZpZ0ZvcndhcmRMaW1pdChtX2ZvcndhcmRMaW1pdCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfRldEKTsKKwkJfQorCX0KKworCWlmKCFtX3JldmVyc2VMaW1pdFZlcmlmaWVkKQorCXsKKwkJaWYoZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX1JFViwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJZG91YmxlIGxpbWl0ID0gdW5wYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlcik7CisKKwkJCWlmKEZYUDE2X0VRKGxpbWl0LCBtX3JldmVyc2VMaW1pdCkpCisJCQkJbV9yZXZlcnNlTGltaXRWZXJpZmllZCA9IHRydWU7CisJCQllbHNlCisJCQl7CisJCQkJLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorCQkJCUNvbmZpZ1JldmVyc2VMaW1pdChtX3JldmVyc2VMaW1pdCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKwkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfUkVWKTsKKwkJfQorCX0KKworCWlmKCFtX21heE91dHB1dFZvbHRhZ2VWZXJpZmllZCkKKwl7CisJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX0NGR19NQVhfVk9VVCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJZG91YmxlIHZvbHRhZ2UgPSB1bnBhY2tGWFA4XzgoZGF0YUJ1ZmZlcik7CisKKwkJCS8vIFRoZSByZXR1cm5lZCBtYXggb3V0cHV0IHZvbHRhZ2UgaXMgc29tZXRpbWVzIHNsaWdodGx5IGhpZ2hlciBvcgorCQkJLy8gbG93ZXIgdGhhbiB3aGF0IHdhcyBzZW50LiAgVGhpcyBzaG91bGQgbm90IHRyaWdnZXIgcmVzZW5kaW5nCisJCQkvLyB0aGUgbWVzc2FnZS4KKwkJCWlmKHN0ZDo6YWJzKHZvbHRhZ2UgLSBtX21heE91dHB1dFZvbHRhZ2UpIDwgMC4xKQorCQkJCW1fbWF4T3V0cHV0Vm9sdGFnZVZlcmlmaWVkID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJQ29uZmlnTWF4T3V0cHV0Vm9sdGFnZShtX21heE91dHB1dFZvbHRhZ2UpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfQ0ZHX01BWF9WT1VUKTsKKwkJfQorCX0KKworCWlmKCFtX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkKQorCXsKKwkJaWYobV9jb250cm9sTW9kZSA9PSBrUGVyY2VudFZidXMpCisJCXsKKwkJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1ZPTFRfU0VUX1JBTVAsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisJCQl7CisJCQkJZG91YmxlIHJhdGUgPSB1bnBhY2tQZXJjZW50YWdlKGRhdGFCdWZmZXIpOworCisJCQkJaWYoRlhQMTZfRVEocmF0ZSwgbV92b2x0YWdlUmFtcFJhdGUpKQorCQkJCQltX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJCVNldFZvbHRhZ2VSYW1wUmF0ZShtX3ZvbHRhZ2VSYW1wUmF0ZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9WT0xUX1NFVF9SQU1QKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKG1fY29udHJvbE1vZGUgPT0ga1ZvbHRhZ2UpCisJCXsKKwkJCWlmKGdldE1lc3NhZ2UoTE1fQVBJX1ZDT01QX0NPTVBfUkFNUCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJCXsKKwkJCQlkb3VibGUgcmF0ZSA9IHVucGFja0ZYUDhfOChkYXRhQnVmZmVyKTsKKworCQkJCWlmKEZYUDhfRVEocmF0ZSwgbV92b2x0YWdlUmFtcFJhdGUpKQorCQkJCQltX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisJCQkJCVNldFZvbHRhZ2VSYW1wUmF0ZShtX3ZvbHRhZ2VSYW1wUmF0ZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorCQkJCXJlcXVlc3RNZXNzYWdlKExNX0FQSV9WQ09NUF9DT01QX1JBTVApOworCQkJfQorCQl9CisJfQorCisJaWYoIW1fZmF1bHRUaW1lVmVyaWZpZWQpCisJeworCQlpZihnZXRNZXNzYWdlKExNX0FQSV9DRkdfRkFVTFRfVElNRSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkKKwkJeworCQkJdWludDE2X3QgZmF1bHRUaW1lID0gdW5wYWNraW50MTZfdChkYXRhQnVmZmVyKTsKKworCQkJaWYoKHVpbnQxNl90KShtX2ZhdWx0VGltZSAqIDEwMDAuMCkgPT0gZmF1bHRUaW1lKQorCQkJCW1fZmF1bHRUaW1lVmVyaWZpZWQgPSB0cnVlOworCQkJZWxzZQorCQkJeworCQkJCS8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKwkJCQlDb25maWdGYXVsdFRpbWUobV9mYXVsdFRpbWUpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisJCQlyZXF1ZXN0TWVzc2FnZShMTV9BUElfQ0ZHX0ZBVUxUX1RJTUUpOworCQl9CisJfQorCisJaWYoIW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMCB8fAorCQkJIW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMSB8fAorCQkJIW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMikKKwl7CisJCS8vIElmIHRoZSBwZXJpb2RpYyBzdGF0dXMgbWVzc2FnZXMgaGF2ZW4ndCBiZWVuIHZlcmlmaWVkIGFzIHJlY2VpdmVkLAorCQkvLyByZXF1ZXN0IHBlcmlvZGljIHN0YXR1cyBtZXNzYWdlcyBhZ2FpbiBhbmQgYXR0ZW1wdCB0byB1bnBhY2sgYW55CisJCS8vIGF2YWlsYWJsZSBvbmVzLgorCQlzZXR1cFBlcmlvZGljU3RhdHVzKCk7CisJCUdldFRlbXBlcmF0dXJlKCk7CisJCUdldFBvc2l0aW9uKCk7CisJCUdldEZhdWx0cygpOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIHJlZmVyZW5jZSBzb3VyY2UgZGV2aWNlIGZvciBzcGVlZCBjb250cm9sbGVyIG1vZGUuCisgKgorICogQ2hvb3NlIGVuY29kZXIgYXMgdGhlIHNvdXJjZSBvZiBzcGVlZCBmZWVkYmFjayB3aGVuIGluIHNwZWVkIGNvbnRyb2wgbW9kZS4KKyAqCisgKiBAcGFyYW0gcmVmZXJlbmNlIFNwZWNpZnkgYSBzcGVlZCByZWZlcmVuY2UuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRTcGVlZFJlZmVyZW5jZSh1aW50OF90IHJlZmVyZW5jZSkKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisKKwkvLyBTZW5kIHRoZSBzcGVlZCByZWZlcmVuY2UgcGFyYW1ldGVyCisJZGF0YUJ1ZmZlclswXSA9IHJlZmVyZW5jZTsKKwlzZW5kTWVzc2FnZShMTV9BUElfU1BEX1JFRiwgZGF0YUJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpKTsKKworCW1fc3BlZWRSZWZlcmVuY2UgPSByZWZlcmVuY2U7CisJbV9zcGVlZFJlZlZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWZlcmVuY2Ugc291cmNlIGRldmljZSBmb3Igc3BlZWQgY29udHJvbGxlciBtb2RlLgorICoKKyAqIEByZXR1cm4gQSBzcGVlZCByZWZlcmVuY2UgaW5kaWNhdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlZmVyZW5jZSBkZXZpY2UKKyAqIGZvciBzcGVlZCBjb250cm9sbGVyIG1vZGUuCisgKi8KK3VpbnQ4X3QgQ0FOSmFndWFyOjpHZXRTcGVlZFJlZmVyZW5jZSgpCit7CisJcmV0dXJuIG1fc3BlZWRSZWZlcmVuY2U7Cit9CisKKy8qKgorICogU2V0IHRoZSByZWZlcmVuY2Ugc291cmNlIGRldmljZSBmb3IgcG9zaXRpb24gY29udHJvbGxlciBtb2RlLgorICoKKyAqIENob29zZSBiZXR3ZWVuIHVzaW5nIGFuZCBlbmNvZGVyIGFuZCB1c2luZyBhIHBvdGVudGlvbWV0ZXIKKyAqIGFzIHRoZSBzb3VyY2Ugb2YgcG9zaXRpb24gZmVlZGJhY2sgd2hlbiBpbiBwb3NpdGlvbiBjb250cm9sIG1vZGUuCisgKgorICogQHBhcmFtIHJlZmVyZW5jZSBTcGVjaWZ5IGEgUG9zaXRpb25SZWZlcmVuY2UuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQb3NpdGlvblJlZmVyZW5jZSh1aW50OF90IHJlZmVyZW5jZSkKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisKKwkvLyBTZW5kIHRoZSBwb3NpdGlvbiByZWZlcmVuY2UgcGFyYW1ldGVyCisJZGF0YUJ1ZmZlclswXSA9IHJlZmVyZW5jZTsKKwlzZW5kTWVzc2FnZShMTV9BUElfUE9TX1JFRiwgZGF0YUJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpKTsKKworCW1fcG9zaXRpb25SZWZlcmVuY2UgPSByZWZlcmVuY2U7CisJbV9wb3NSZWZWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIEdldCB0aGUgcmVmZXJlbmNlIHNvdXJjZSBkZXZpY2UgZm9yIHBvc2l0aW9uIGNvbnRyb2xsZXIgbW9kZS4KKyAqCisgKiBAcmV0dXJuIEEgUG9zaXRpb25SZWZlcmVuY2UgaW5kaWNhdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlZmVyZW5jZSBkZXZpY2UgZm9yIHBvc2l0aW9uIGNvbnRyb2xsZXIgbW9kZS4KKyAqLwordWludDhfdCBDQU5KYWd1YXI6OkdldFBvc2l0aW9uUmVmZXJlbmNlKCkKK3sKKwlyZXR1cm4gbV9wb3NpdGlvblJlZmVyZW5jZTsKK30KKworLyoqCisgKiBTZXQgdGhlIFAsIEksIGFuZCBEIGNvbnN0YW50cyBmb3IgdGhlIGNsb3NlZCBsb29wIG1vZGVzLgorICoKKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpCit7CisJU2V0UChwKTsKKwlTZXRJKGkpOworCVNldEQoZCk7Cit9CisKKy8qKgorICogU2V0IHRoZSBQIGNvbnN0YW50IGZvciB0aGUgY2xvc2VkIGxvb3AgbW9kZXMuCisgKgorICogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFAoZG91YmxlIHApCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwlzd2l0Y2gobV9jb250cm9sTW9kZSkKKwl7CisJY2FzZSBrUGVyY2VudFZidXM6CisJY2FzZSBrVm9sdGFnZToKKyAgY2FzZSBrRm9sbG93ZXI6CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJQSUQgY29uc3RhbnRzIG9ubHkgYXBwbHkgaW4gU3BlZWQsIFBvc2l0aW9uLCBhbmQgQ3VycmVudCBtb2RlIik7CisJCWJyZWFrOworCWNhc2Uga1NwZWVkOgorCQlkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBwKTsKKwkJc2VuZE1lc3NhZ2UoTE1fQVBJX1NQRF9QQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwljYXNlIGtQb3NpdGlvbjoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgcCk7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9QT1NfUEMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrQ3VycmVudDoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgcCk7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9JQ1RSTF9QQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwl9CisKKwltX3AgPSBwOworCW1fcFZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogU2V0IHRoZSBJIGNvbnN0YW50IGZvciB0aGUgY2xvc2VkIGxvb3AgbW9kZXMuCisgKgorICogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0SShkb3VibGUgaSkKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCXN3aXRjaChtX2NvbnRyb2xNb2RlKQorCXsKKwljYXNlIGtQZXJjZW50VmJ1czoKKwljYXNlIGtWb2x0YWdlOgorICBjYXNlIGtGb2xsb3dlcjoKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwgIlBJRCBjb25zdGFudHMgb25seSBhcHBseSBpbiBTcGVlZCwgUG9zaXRpb24sIGFuZCBDdXJyZW50IG1vZGUiKTsKKwkJYnJlYWs7CisJY2FzZSBrU3BlZWQ6CisJCWRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIGkpOworCQlzZW5kTWVzc2FnZShMTV9BUElfU1BEX0lDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisJCWJyZWFrOworCWNhc2Uga1Bvc2l0aW9uOgorCQlkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBpKTsKKwkJc2VuZE1lc3NhZ2UoTE1fQVBJX1BPU19JQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwljYXNlIGtDdXJyZW50OgorCQlkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBpKTsKKwkJc2VuZE1lc3NhZ2UoTE1fQVBJX0lDVFJMX0lDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisJCWJyZWFrOworCX0KKworCW1faSA9IGk7CisJbV9pVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBTZXQgdGhlIEQgY29uc3RhbnQgZm9yIHRoZSBjbG9zZWQgbG9vcCBtb2Rlcy4KKyAqCisgKiBAcGFyYW0gZCBUaGUgZGVyaXZhdGl2ZSBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldEQoZG91YmxlIGQpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwlzd2l0Y2gobV9jb250cm9sTW9kZSkKKwl7CisJY2FzZSBrUGVyY2VudFZidXM6CisJY2FzZSBrVm9sdGFnZToKKyAgY2FzZSBrRm9sbG93ZXI6CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJQSUQgY29uc3RhbnRzIG9ubHkgYXBwbHkgaW4gU3BlZWQsIFBvc2l0aW9uLCBhbmQgQ3VycmVudCBtb2RlIik7CisJCWJyZWFrOworCWNhc2Uga1NwZWVkOgorCQlkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBkKTsKKwkJc2VuZE1lc3NhZ2UoTE1fQVBJX1NQRF9EQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwljYXNlIGtQb3NpdGlvbjoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgZCk7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9QT1NfREMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrQ3VycmVudDoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgZCk7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9JQ1RSTF9EQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwl9CisKKwltX2QgPSBkOworCW1fZFZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogR2V0IHRoZSBQcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgY29udHJvbGxlci4KKyAqCisgKiBAcmV0dXJuIFRoZSBwcm9wb3J0aW9uYWwgZ2Fpbi4KKyAqLworZG91YmxlIENBTkphZ3Vhcjo6R2V0UCgpCit7CisJaWYobV9jb250cm9sTW9kZSA9PSBrUGVyY2VudFZidXMgfHwgbV9jb250cm9sTW9kZSA9PSBrVm9sdGFnZSkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJQSUQgY29uc3RhbnRzIG9ubHkgYXBwbHkgaW4gU3BlZWQsIFBvc2l0aW9uLCBhbmQgQ3VycmVudCBtb2RlIik7CisJCXJldHVybiAwLjA7CisJfQorCisJcmV0dXJuIG1fcDsKK30KKworLyoqCisgKiBHZXQgdGhlIEludHJlZ3JhbCBnYWluIG9mIHRoZSBjb250cm9sbGVyLgorICoKKyAqIEByZXR1cm4gVGhlIGludGVncmFsIGdhaW4uCisgKi8KK2RvdWJsZSBDQU5KYWd1YXI6OkdldEkoKQoreworCWlmKG1fY29udHJvbE1vZGUgPT0ga1BlcmNlbnRWYnVzIHx8IG1fY29udHJvbE1vZGUgPT0ga1ZvbHRhZ2UpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworCQlyZXR1cm4gMC4wOworCX0KKworCXJldHVybiBtX2k7Cit9CisKKy8qKgorICogR2V0IHRoZSBEaWZmZXJlbnRpYWwgZ2FpbiBvZiB0aGUgY29udHJvbGxlci4KKyAqCisgKiBAcmV0dXJuIFRoZSBkaWZmZXJlbnRpYWwgZ2Fpbi4KKyAqLworZG91YmxlIENBTkphZ3Vhcjo6R2V0RCgpCit7CisJaWYobV9jb250cm9sTW9kZSA9PSBrUGVyY2VudFZidXMgfHwgbV9jb250cm9sTW9kZSA9PSBrVm9sdGFnZSkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJQSUQgY29uc3RhbnRzIG9ubHkgYXBwbHkgaW4gU3BlZWQsIFBvc2l0aW9uLCBhbmQgQ3VycmVudCBtb2RlIik7CisJCXJldHVybiAwLjA7CisJfQorCisJcmV0dXJuIG1fZDsKK30KKworLyoqCisgKiBFbmFibGUgdGhlIGNsb3NlZCBsb29wIGNvbnRyb2xsZXIuCisgKgorICogU3RhcnQgYWN0dWFsbHkgY29udHJvbGxpbmcgdGhlIG91dHB1dCBiYXNlZCBvbiB0aGUgZmVlZGJhY2suCisgKiBJZiBzdGFydGluZyBhIHBvc2l0aW9uIGNvbnRyb2xsZXIgd2l0aCBhbiBlbmNvZGVyIHJlZmVyZW5jZSwKKyAqIHVzZSB0aGUgZW5jb2RlckluaXRpYWxQb3NpdGlvbiBwYXJhbWV0ZXIgdG8gaW5pdGlhbGl6ZSB0aGUKKyAqIGVuY29kZXIgc3RhdGUuCisgKgorICogQHBhcmFtIGVuY29kZXJJbml0aWFsUG9zaXRpb24gRW5jb2RlciBwb3NpdGlvbiB0byBzZXQgaWYgcG9zaXRpb24gd2l0aCBlbmNvZGVyIHJlZmVyZW5jZS4gIElnbm9yZWQgb3RoZXJ3aXNlLgorICovCit2b2lkIENBTkphZ3Vhcjo6RW5hYmxlQ29udHJvbChkb3VibGUgZW5jb2RlckluaXRpYWxQb3NpdGlvbikKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZSA9IDA7CisKKwlzd2l0Y2gobV9jb250cm9sTW9kZSkKKwl7CisJY2FzZSBrUGVyY2VudFZidXM6CisJCXNlbmRNZXNzYWdlKExNX0FQSV9WT0xUX1RfRU4sIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwkJYnJlYWs7CisJY2FzZSBrU3BlZWQ6CisJCXNlbmRNZXNzYWdlKExNX0FQSV9TUERfVF9FTiwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwljYXNlIGtQb3NpdGlvbjoKKwkJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgZW5jb2RlckluaXRpYWxQb3NpdGlvbik7CisJCXNlbmRNZXNzYWdlKExNX0FQSV9QT1NfVF9FTiwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwljYXNlIGtDdXJyZW50OgorCQlzZW5kTWVzc2FnZShMTV9BUElfSUNUUkxfVF9FTiwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKwljYXNlIGtWb2x0YWdlOgorCQlzZW5kTWVzc2FnZShMTV9BUElfVkNPTVBfVF9FTiwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCQlicmVhazsKKyAgZGVmYXVsdDoKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiVGhlIEphZ3VhciBvbmx5IHN1cHBvcnRzIEN1cnJlbnQsIFZvbHRhZ2UsIFBvc2l0aW9uLCBTcGVlZCwgYW5kIFBlcmNlbnQgKFRocm90dGxlKSBtb2Rlcy4iKTsKKyAgICByZXR1cm47CisJfQorCisJbV9jb250cm9sRW5hYmxlZCA9IHRydWU7CisJbV9jb250cm9sTW9kZVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogRGlzYWJsZSB0aGUgY2xvc2VkIGxvb3AgY29udHJvbGxlci4KKyAqCisgKiBTdG9wIGRyaXZpbmcgdGhlIG91dHB1dCBiYXNlZCBvbiB0aGUgZmVlZGJhY2suCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpEaXNhYmxlQ29udHJvbCgpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemUgPSAwOworCisJLy8gRGlzYWJsZSBhbGwgY29udHJvbAorCXNlbmRNZXNzYWdlKExNX0FQSV9WT0xUX0RJUywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCXNlbmRNZXNzYWdlKExNX0FQSV9TUERfRElTLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1BPU19ESVMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfSUNUUkxfRElTLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1ZDT01QX0RJUywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCisJLy8gU3RvcCBhbGwgcGVyaW9kaWMgc2V0cG9pbnRzCisJc2VuZE1lc3NhZ2UoTE1fQVBJX1ZPTFRfVF9TRVQsIGRhdGFCdWZmZXIsIGRhdGFTaXplLCBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcpOworCXNlbmRNZXNzYWdlKExNX0FQSV9TUERfVF9TRVQsIGRhdGFCdWZmZXIsIGRhdGFTaXplLCBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcpOworCXNlbmRNZXNzYWdlKExNX0FQSV9QT1NfVF9TRVQsIGRhdGFCdWZmZXIsIGRhdGFTaXplLCBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcpOworCXNlbmRNZXNzYWdlKExNX0FQSV9JQ1RSTF9UX1NFVCwgZGF0YUJ1ZmZlciwgZGF0YVNpemUsIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORyk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX1ZDT01QX1RfU0VULCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSwgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HKTsKKworCW1fY29udHJvbEVuYWJsZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIHZvbHRhZ2UgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBidXMgdm9sdGFnZQorICogd2l0aG91dCBhbnkgcG9zaXRpb24gb3Igc3BlZWQgZmVlZGJhY2suPGJyPgorICogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFBlcmNlbnRNb2RlKCkKK3sKKwlTZXRDb250cm9sTW9kZShrUGVyY2VudFZidXMpOworCVNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKwlTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfTk9ORSk7Cit9CisKKy8qKgorICogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciB2b2x0YWdlIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgYnVzIHZvbHRhZ2UsCisgKiBhbmQgZW5hYmxlIHNwZWVkIHNlbnNpbmcgZnJvbSBhIG5vbi1xdWFkcmF0dXJlIGVuY29kZXIuPGJyPgorICogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyAqCisgKiBAcGFyYW0gdGFnIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OkVuY29kZXIKKyAqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQZXJjZW50TW9kZShDQU5KYWd1YXI6OkVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KQoreworCVNldENvbnRyb2xNb2RlKGtQZXJjZW50VmJ1cyk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9FTkNPREVSKTsKKwlDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworfQorCisvKioKKyAqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3Igdm9sdGFnZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGJ1cyB2b2x0YWdlLAorICogYW5kIGVuYWJsZSBzcGVlZCBzZW5zaW5nIGZyb20gYSBub24tcXVhZHJhdHVyZSBlbmNvZGVyLjxicj4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisgKgorICogQHBhcmFtIHRhZyBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpRdWFkRW5jb2RlcgorICogQHBhcmFtIGNvZGVzUGVyUmV2IFRoZSBjb3VudHMgcGVyIHJldm9sdXRpb24gb24gdGhlIGVuY29kZXIKKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFBlcmNlbnRNb2RlKENBTkphZ3Vhcjo6UXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KQoreworCVNldENvbnRyb2xNb2RlKGtQZXJjZW50VmJ1cyk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX0VOQ09ERVIpOworCVNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9RVUFEX0VOQ09ERVIpOworCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIHZvbHRhZ2UgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBidXMgdm9sdGFnZSwKKyogYW5kIGVuYWJsZSBwb3NpdGlvbiBzZW5zaW5nIGZyb20gYSBwb3RlbnRpb21ldGVyIGFuZCBubyBzcGVlZCBmZWVkYmFjay48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBwb3RlbnRpb21ldGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OlBvdGVudGlvbWV0ZXIKKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0UGVyY2VudE1vZGUoQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyU3RydWN0KQoreworCVNldENvbnRyb2xNb2RlKGtQZXJjZW50VmJ1cyk7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX1BPVCk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCUNvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucygxKTsKK30KKworLyoqCisgKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIGN1cnJlbnQgd2l0aCBhIFBJRCBsb29wLjxicj4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisgKgorICogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqIEBwYXJhbSBkIFRoZSBkaWZmZXJlbnRpYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRDdXJyZW50TW9kZShkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQoreworCVNldENvbnRyb2xNb2RlKGtDdXJyZW50KTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCVNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3IgY3VycmVudCB3aXRoIGEgUElEIGxvb3AsIGFuZCBlbmFibGUgc3BlZWQKKyogc2Vuc2luZyBmcm9tIGEgbm9uLXF1YWRyYXR1cmUgZW5jb2Rlci48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBlbmNvZGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OkVuY29kZXIKKyogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRDdXJyZW50TW9kZShDQU5KYWd1YXI6OkVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQoreworCVNldENvbnRyb2xNb2RlKGtDdXJyZW50KTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7CisJU2V0UElEKHAsIGksIGQpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciBjdXJyZW50IHdpdGggYSBQSUQgbG9vcCwgYW5kIGVuYWJsZSBzcGVlZCBhbmQKKyogcG9zaXRpb24gc2Vuc2luZyBmcm9tIGEgcXVhZHJhdHVyZSBlbmNvZGVyLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyoKKyogQHBhcmFtIGVuZG9lciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpRdWFkRW5jb2RlcgorKiBAcGFyYW0gcCBUaGUgcHJvcG9ydGlvbmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBkIFRoZSBkaWZmZXJlbnRpYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqLwordm9pZCBDQU5KYWd1YXI6OlNldEN1cnJlbnRNb2RlKENBTkphZ3Vhcjo6UXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQoreworCVNldENvbnRyb2xNb2RlKGtDdXJyZW50KTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX1FVQURfRU5DT0RFUik7CisJQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KGNvZGVzUGVyUmV2KTsKKwlTZXRQSUQocCwgaSwgZCk7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIGN1cnJlbnQgd2l0aCBhIFBJRCBsb29wLCBhbmQgZW5hYmxlIHBvc2l0aW9uCisqIHNlbnNpbmcgZnJvbSBhIHBvdGVudGlvbWV0ZXIuPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKgorKiBAcGFyYW0gcG90ZW50aW9tZXRlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyCisqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGQgVGhlIGRpZmZlcmVudGlhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0Q3VycmVudE1vZGUoQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyU3RydWN0LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQoreworCVNldENvbnRyb2xNb2RlKGtDdXJyZW50KTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfUE9UKTsKKwlTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisJQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKDEpOworCVNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisgKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIHNwZWVkIHdpdGggYSBmZWVkYmFjayBsb29wIGZyb20gYSBub24tcXVhZHJhdHVyZQorICogZW5jb2Rlci48YnI+CisgKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBlbmNvZGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OkVuY29kZXIKKyAqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyLgorICogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqIEBwYXJhbSBkIFRoZSBkaWZmZXJlbnRpYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRTcGVlZE1vZGUoQ0FOSmFndWFyOjpFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKK3sKKwlTZXRDb250cm9sTW9kZShrU3BlZWQpOworCVNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKwlTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisJQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KGNvZGVzUGVyUmV2KTsKKwlTZXRQSUQocCwgaSwgZCk7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIHNwZWVkIHdpdGggYSBmZWVkYmFjayBsb29wIGZyb20gYSBxdWFkcmF0dXJlIGVuY29kZXIuPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKgorKiBAcGFyYW0gZW5jb2RlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpRdWFkRW5jb2RlcgorKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2Rlci4KKyogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRTcGVlZE1vZGUoQ0FOSmFndWFyOjpRdWFkRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpCit7CisJU2V0Q29udHJvbE1vZGUoa1NwZWVkKTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX1FVQURfRU5DT0RFUik7CisJQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KGNvZGVzUGVyUmV2KTsKKwlTZXRQSUQocCwgaSwgZCk7Cit9CisKKy8qKgorICogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBwb3NpdGlvbiB3aXRoIGEgZmVlZGJhY2sgbG9vcCB1c2luZyBhbiBlbmNvZGVyLjxicj4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisgKgorICogQHBhcmFtIGVuY29kZXIgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6UXVhZEVuY29kZXIKKyAqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyLgorICogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyAqIEBwYXJhbSBkIFRoZSBkaWZmZXJlbnRpYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0UG9zaXRpb25Nb2RlKENBTkphZ3Vhcjo6UXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQoreworCVNldENvbnRyb2xNb2RlKGtQb3NpdGlvbik7CisJU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX0VOQ09ERVIpOworCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7CisJU2V0UElEKHAsIGksIGQpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBwb3NpdGlvbiB3aXRoIGEgZmVlZGJhY2sgbG9vcCB1c2luZyBhIHBvdGVudGlvbWV0ZXIuPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKiBAcGFyYW0gcCBUaGUgcHJvcG9ydGlvbmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBkIFRoZSBkaWZmZXJlbnRpYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqLwordm9pZCBDQU5KYWd1YXI6OlNldFBvc2l0aW9uTW9kZShDQU5KYWd1YXI6OlBvdGVudGlvbWV0ZXJTdHJ1Y3QsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpCit7CisJU2V0Q29udHJvbE1vZGUoa1Bvc2l0aW9uKTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfUE9UKTsKKwlDb25maWdQb3RlbnRpb21ldGVyVHVybnMoMSk7CisJU2V0UElEKHAsIGksIGQpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciB2b2x0YWdlIHdpdGhvdXQgYW55IHBvc2l0aW9uIG9yIHNwZWVkIGZlZWRiYWNrLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0Vm9sdGFnZU1vZGUoKQoreworCVNldENvbnRyb2xNb2RlKGtWb2x0YWdlKTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciB2b2x0YWdlIHdpdGggc3BlZWQgZmVlZGJhY2sgZnJvbSBhCisqIG5vbi1xdWFkcmF0dXJlIGVuY29kZXIgYW5kIG5vIHBvc2l0aW9uIGZlZWRiYWNrLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyoKKyogQHBhcmFtIGVuY29kZXIgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6RW5jb2RlcgorKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2RlcgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRWb2x0YWdlTW9kZShDQU5KYWd1YXI6OkVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KQoreworCVNldENvbnRyb2xNb2RlKGtWb2x0YWdlKTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX0VOQ09ERVIpOworCUNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIHZvbHRhZ2Ugd2l0aCBwb3NpdGlvbiBhbmQgc3BlZWQgZmVlZGJhY2sgZnJvbSBhCisqIHF1YWRyYXR1cmUgZW5jb2Rlci48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBlbmNvZGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OlF1YWRFbmNvZGVyCisqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyCisqLwordm9pZCBDQU5KYWd1YXI6OlNldFZvbHRhZ2VNb2RlKENBTkphZ3Vhcjo6UXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KQoreworCVNldENvbnRyb2xNb2RlKGtWb2x0YWdlKTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisJU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX1FVQURfRU5DT0RFUik7CisJQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KGNvZGVzUGVyUmV2KTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3Igdm9sdGFnZSB3aXRoIHBvc2l0aW9uIGZlZWRiYWNrIGZyb20gYQorKiBwb3RlbnRpb21ldGVyIGFuZCBubyBzcGVlZCBmZWVkYmFjay48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBwb3RlbnRpb21ldGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OlBvdGVudGlvbWV0ZXIKKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0Vm9sdGFnZU1vZGUoQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyU3RydWN0KQoreworCVNldENvbnRyb2xNb2RlKGtWb2x0YWdlKTsKKwlTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfUE9UKTsKKwlTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisJQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKDEpOworfQorCisvKioKKyAqIFVzZWQgaW50ZXJuYWxseS4gSW4gb3JkZXIgdG8gc2V0IHRoZSBjb250cm9sIG1vZGUgc2VlIHRoZSBtZXRob2RzIGxpc3RlZCBiZWxvdy4KKyAqIENoYW5nZSB0aGUgY29udHJvbCBtb2RlIG9mIHRoaXMgSmFndWFyIG9iamVjdC4KKyAqCisgKiBBZnRlciBjaGFuZ2luZyBtb2RlcywgY29uZmlndXJlIGFueSBQSUQgY29uc3RhbnRzIG9yIG90aGVyIHNldHRpbmdzIG5lZWRlZAorICogYW5kIHRoZW4gRW5hYmxlQ29udHJvbCgpIHRvIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kZSBvbiB0aGUgSmFndWFyLgorICoKKyAqIEBwYXJhbSBjb250cm9sTW9kZSBUaGUgbmV3IG1vZGUuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRDb250cm9sTW9kZShDb250cm9sTW9kZSBjb250cm9sTW9kZSkKK3sKKwkvLyBEaXNhYmxlIHRoZSBwcmV2aW91cyBtb2RlCisJRGlzYWJsZUNvbnRyb2woKTsKKworICBpZiAoY29udHJvbE1vZGUgPT0ga0ZvbGxvd2VyKQorICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJUaGUgSmFndWFyIG9ubHkgc3VwcG9ydHMgQ3VycmVudCwgVm9sdGFnZSwgUG9zaXRpb24sIFNwZWVkLCBhbmQgUGVyY2VudCAoVGhyb3R0bGUpIG1vZGVzLiIpOworCisJLy8gVXBkYXRlIHRoZSBsb2NhbCBtb2RlCisJbV9jb250cm9sTW9kZSA9IGNvbnRyb2xNb2RlOworCW1fY29udHJvbE1vZGVWZXJpZmllZCA9IGZhbHNlOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NBTkphZ3VhciwgbV9kZXZpY2VOdW1iZXIsIG1fY29udHJvbE1vZGUpOworfQorCisvKioKKyAqIEdldCB0aGUgYWN0aXZlIGNvbnRyb2wgbW9kZSBmcm9tIHRoZSBKYWd1YXIuCisgKgorICogQXNrIHRoZSBKYWcgd2hhdCBtb2RlIGl0IGlzIGluLgorICoKKyAqIEByZXR1cm4gQ29udHJvbE1vZGUgdGhhdCB0aGUgSmFnIGlzIGluLgorICovCitDQU5KYWd1YXI6OkNvbnRyb2xNb2RlIENBTkphZ3Vhcjo6R2V0Q29udHJvbE1vZGUoKQoreworCXJldHVybiBtX2NvbnRyb2xNb2RlOworfQorCisvKioKKyAqIEdldCB0aGUgdm9sdGFnZSBhdCB0aGUgYmF0dGVyeSBpbnB1dCB0ZXJtaW5hbHMgb2YgdGhlIEphZ3Vhci4KKyAqCisgKiBAcmV0dXJuIFRoZSBidXMgdm9sdGFnZSBpbiB2b2x0cy4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXRCdXNWb2x0YWdlKCkKK3sKKwl1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworCisJcmV0dXJuIG1fYnVzVm9sdGFnZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHZvbHRhZ2UgYmVpbmcgb3V0cHV0IGZyb20gdGhlIG1vdG9yIHRlcm1pbmFscyBvZiB0aGUgSmFndWFyLgorICoKKyAqIEByZXR1cm4gVGhlIG91dHB1dCB2b2x0YWdlIGluIHZvbHRzLgorICovCitmbG9hdCBDQU5KYWd1YXI6OkdldE91dHB1dFZvbHRhZ2UoKQoreworCXVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKwlyZXR1cm4gbV9vdXRwdXRWb2x0YWdlOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCB0aHJvdWdoIHRoZSBtb3RvciB0ZXJtaW5hbHMgb2YgdGhlIEphZ3Vhci4KKyAqCisgKiBAcmV0dXJuIFRoZSBvdXRwdXQgY3VycmVudCBpbiBhbXBzLgorICovCitmbG9hdCBDQU5KYWd1YXI6OkdldE91dHB1dEN1cnJlbnQoKQoreworCXVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKwlyZXR1cm4gbV9vdXRwdXRDdXJyZW50OworfQorCisvKioKKyAqIEdldCB0aGUgaW50ZXJuYWwgdGVtcGVyYXR1cmUgb2YgdGhlIEphZ3Vhci4KKyAqCisgKiBAcmV0dXJuIFRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgSmFndWFyIGluIGRlZ3JlZXMgQ2Vsc2l1cy4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXRUZW1wZXJhdHVyZSgpCit7CisJdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKworCXJldHVybiBtX3RlbXBlcmF0dXJlOworfQorCisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGVuY29kZXIgb3IgcG90ZW50aW9tZXRlci4KKyAqCisgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbW90b3IgaW4gcm90YXRpb25zIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGZlZWRiYWNrLgorICogQHNlZSBDQU5KYWd1YXIjQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKGludCkKKyAqIEBzZWUgQ0FOSmFndWFyI0NvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihpbnQpCisgKi8KK2RvdWJsZSBDQU5KYWd1YXI6OkdldFBvc2l0aW9uKCkKK3sKKwl1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworCisJcmV0dXJuIG1fcG9zaXRpb247Cit9CisKKy8qKgorICogR2V0IHRoZSBzcGVlZCBvZiB0aGUgZW5jb2Rlci4KKyAqCisgKiBAcmV0dXJuIFRoZSBzcGVlZCBvZiB0aGUgbW90b3IgaW4gUlBNIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGZlZWRiYWNrLgorICovCitkb3VibGUgQ0FOSmFndWFyOjpHZXRTcGVlZCgpCit7CisJdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKworCXJldHVybiBtX3NwZWVkOworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBmb3J3YXJkIGxpbWl0IHN3aXRjaC4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3RvciBpcyBhbGxvd2VkIHRvIHR1cm4gaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uIHdoZW4gdHJ1ZS4KKyAqLworYm9vbCBDQU5KYWd1YXI6OkdldEZvcndhcmRMaW1pdE9LKCkKK3sKKwl1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworCisJcmV0dXJuIG1fbGltaXRzICYga0ZvcndhcmRMaW1pdDsKK30KKworLyoqCisgKiBHZXQgdGhlIHN0YXR1cyBvZiB0aGUgcmV2ZXJzZSBsaW1pdCBzd2l0Y2guCisgKgorICogQHJldHVybiBUaGUgbW90b3IgaXMgYWxsb3dlZCB0byB0dXJuIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbiB3aGVuIHRydWUuCisgKi8KK2Jvb2wgQ0FOSmFndWFyOjpHZXRSZXZlcnNlTGltaXRPSygpCit7CisJdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKworCXJldHVybiBtX2xpbWl0cyAmIGtSZXZlcnNlTGltaXQ7Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0dXMgb2YgYW55IGZhdWx0cyB0aGUgSmFndWFyIGhhcyBkZXRlY3RlZC4KKyAqCisgKiBAcmV0dXJuIEEgYml0LW1hc2sgb2YgZmF1bHRzIGRlZmluZWQgYnkgdGhlICJGYXVsdHMiIGVudW0uCisgKiBAc2VlICNrQ3VycmVudEZhdWx0CisgKiBAc2VlICNrQnVzVm9sdGFnZUZhdWx0CisgKiBAc2VlICNrVGVtcGVyYXR1cmVGYXVsdAorICogQHNlZSAja0dhdGVEcml2ZXJGYXVsdAorICovCit1aW50MTZfdCBDQU5KYWd1YXI6OkdldEZhdWx0cygpCit7CisJdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKworCXJldHVybiBtX2ZhdWx0czsKK30KKworLyoqCisgKiBTZXQgdGhlIG1heGltdW0gdm9sdGFnZSBjaGFuZ2UgcmF0ZS4KKyAqCisgKiBXaGVuIGluIFBlcmNlbnRWYnVzIG9yIFZvbHRhZ2Ugb3V0cHV0IG1vZGUsIHRoZSByYXRlIGF0IHdoaWNoIHRoZSB2b2x0YWdlIGNoYW5nZXMgY2FuCisgKiBiZSBsaW1pdGVkIHRvIHJlZHVjZSBjdXJyZW50IHNwaWtlcy4gIFNldCB0aGlzIHRvIDAuMCB0byBkaXNhYmxlIHJhdGUgbGltaXRpbmcuCisgKgorICogQHBhcmFtIHJhbXBSYXRlIFRoZSBtYXhpbXVtIHJhdGUgb2Ygdm9sdGFnZSBjaGFuZ2UgaW4gUGVyY2VudCBWb2x0YWdlIG1vZGUgaW4gVi9zLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0Vm9sdGFnZVJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSkKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKwl1aW50MzJfdCBtZXNzYWdlOworCisJc3dpdGNoKG1fY29udHJvbE1vZGUpCisJeworCWNhc2Uga1BlcmNlbnRWYnVzOgorCQlkYXRhU2l6ZSA9IHBhY2tQZXJjZW50YWdlKGRhdGFCdWZmZXIsIHJhbXBSYXRlIC8gKG1fbWF4T3V0cHV0Vm9sdGFnZSAqIGtDb250cm9sbGVyUmF0ZSkpOworCQltZXNzYWdlID0gTE1fQVBJX1ZPTFRfU0VUX1JBTVA7CisJCWJyZWFrOworCWNhc2Uga1ZvbHRhZ2U6CisJCWRhdGFTaXplID0gcGFja0ZYUDhfOChkYXRhQnVmZmVyLCByYW1wUmF0ZSAvIGtDb250cm9sbGVyUmF0ZSk7CisJCW1lc3NhZ2UgPSBMTV9BUElfVkNPTVBfQ09NUF9SQU1QOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiU2V0Vm9sdGFnZVJhbXBSYXRlIG9ubHkgYXBwbGllcyBpbiBWb2x0YWdlIGFuZCBQZXJjZW50IG1vZGUiKTsKKwkJcmV0dXJuOworCX0KKworCXNlbmRNZXNzYWdlKG1lc3NhZ2UsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKworCW1fdm9sdGFnZVJhbXBSYXRlID0gcmFtcFJhdGU7CisJbV92b2x0YWdlUmFtcFJhdGVWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgZmlybXdhcmUgcnVubmluZyBvbiB0aGUgSmFndWFyLgorICoKKyAqIEByZXR1cm4gVGhlIGZpcm13YXJlIHZlcnNpb24uICAwIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCByZXNwb25kLgorICovCit1aW50MzJfdCBDQU5KYWd1YXI6OkdldEZpcm13YXJlVmVyc2lvbigpCit7CisJcmV0dXJuIG1fZmlybXdhcmVWZXJzaW9uOworfQorCisvKioKKyAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgSmFndWFyIGhhcmR3YXJlLgorICoKKyAqIEByZXR1cm4gVGhlIGhhcmR3YXJlIHZlcnNpb24uIDE6IEphZ3VhciwgIDI6IEJsYWNrIEphZ3VhcgorICovCit1aW50OF90IENBTkphZ3Vhcjo6R2V0SGFyZHdhcmVWZXJzaW9uKCkKK3sKKwlyZXR1cm4gbV9oYXJkd2FyZVZlcnNpb247Cit9CisKKy8qKgorICogQ29uZmlndXJlIHdoYXQgdGhlIGNvbnRyb2xsZXIgZG9lcyB0byB0aGUgSC1CcmlkZ2Ugd2hlbiBuZXV0cmFsIChub3QgZHJpdmluZyB0aGUgb3V0cHV0KS4KKyAqCisgKiBUaGlzIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGp1bXBlciBjb25maWd1cmF0aW9uIGZvciBicmFrZSBvciBjb2FzdC4KKyAqCisgKiBAcGFyYW0gbW9kZSBTZWxlY3QgdG8gdXNlIHRoZSBqdW1wZXIgc2V0dGluZyBvciB0byBvdmVycmlkZSBpdCB0byBjb2FzdCBvciBicmFrZS4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ05ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG1vZGUpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCisJLy8gU2V0IHRoZSBuZXV0cmFsIG1vZGUKKwlzZW5kTWVzc2FnZShMTV9BUElfQ0ZHX0JSQUtFX0NPQVNULCBkYXRhQnVmZmVyLCBzaXplb2YodWludDhfdCkpOworCisJbV9uZXV0cmFsTW9kZSA9IG1vZGU7CisJbV9uZXV0cmFsTW9kZVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogQ29uZmlndXJlIGhvdyBtYW55IGNvZGVzIHBlciByZXZvbHV0aW9uIGFyZSBnZW5lcmF0ZWQgYnkgeW91ciBlbmNvZGVyLgorICoKKyAqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgbnVtYmVyIG9mIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBpbiAxWCBtb2RlLgorICovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KHVpbnQxNl90IGNvZGVzUGVyUmV2KQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplOworCisJLy8gU2V0IHRoZSBjb2RlcyBwZXIgcmV2b2x1dGlvbiBtb2RlCisJZGF0YVNpemUgPSBwYWNraW50MTZfdChkYXRhQnVmZmVyLCBjb2Rlc1BlclJldik7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX0NGR19FTkNfTElORVMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKworCW1fZW5jb2RlckNvZGVzUGVyUmV2ID0gY29kZXNQZXJSZXY7CisJbV9lbmNvZGVyQ29kZXNQZXJSZXZWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIHR1cm5zIG9uIHRoZSBwb3RlbnRpb21ldGVyLgorICoKKyAqIFRoZXJlIGlzIG5vIHNwZWNpYWwgc3VwcG9ydCBmb3IgY29udGludW91cyB0dXJuIHBvdGVudGlvbWV0ZXJzLgorICogT25seSBpbnRlZ2VyIG51bWJlcnMgb2YgdHVybnMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBAcGFyYW0gdHVybnMgVGhlIG51bWJlciBvZiB0dXJucyBvZiB0aGUgcG90ZW50aW9tZXRlci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucyh1aW50MTZfdCB0dXJucykKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCS8vIFNldCB0aGUgcG90IHR1cm5zCisJZGF0YVNpemUgPSBwYWNraW50MTZfdChkYXRhQnVmZmVyLCB0dXJucyk7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX0NGR19QT1RfVFVSTlMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKworCW1fcG90ZW50aW9tZXRlclR1cm5zID0gdHVybnM7CisJbV9wb3RlbnRpb21ldGVyVHVybnNWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBTb2Z0IFBvc2l0aW9uIExpbWl0cyB3aGVuIGluIFBvc2l0aW9uIENvbnRyb2xsZXIgbW9kZS4KKyAqCisgKiBXaGVuIGNvbnRyb2xsaW5nIHBvc2l0aW9uLCB5b3UgY2FuIGFkZCBhZGRpdGlvbmFsIGxpbWl0cyBvbiB0b3Agb2YgdGhlIGxpbWl0IHN3aXRjaCBpbnB1dHMKKyAqIHRoYXQgYXJlIGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBmZWVkYmFjay4gIElmIHRoZSBwb3NpdGlvbiBsaW1pdCBpcyByZWFjaGVkIG9yIHRoZQorICogc3dpdGNoIGlzIG9wZW5lZCwgdGhhdCBkaXJlY3Rpb24gd2lsbCBiZSBkaXNhYmxlZC4KKyAqCisKKyAqIEBwYXJhbSBmb3J3YXJkTGltaXRQb3NpdGlvbiBUaGUgcG9zaXRpb24gdGhhdCBpZiBleGNlZWRlZCB3aWxsIGRpc2FibGUgdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICogQHBhcmFtIHJldmVyc2VMaW1pdFBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0aGF0IGlmIGV4Y2VlZGVkIHdpbGwgZGlzYWJsZSB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpDb25maWdTb2Z0UG9zaXRpb25MaW1pdHMoZG91YmxlIGZvcndhcmRMaW1pdFBvc2l0aW9uLCBkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pCit7CisJQ29uZmlnTGltaXRNb2RlKGtMaW1pdE1vZGVfU29mdFBvc2l0aW9uTGltaXRzKTsKKwlDb25maWdGb3J3YXJkTGltaXQoZm9yd2FyZExpbWl0UG9zaXRpb24pOworCUNvbmZpZ1JldmVyc2VMaW1pdChyZXZlcnNlTGltaXRQb3NpdGlvbik7Cit9CisKKy8qKgorICogRGlzYWJsZSBTb2Z0IFBvc2l0aW9uIExpbWl0cyBpZiBwcmV2aW91c2x5IGVuYWJsZWQuCisgKgorICogU29mdCBQb3NpdGlvbiBMaW1pdHMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpEaXNhYmxlU29mdFBvc2l0aW9uTGltaXRzKCkKK3sKKwlDb25maWdMaW1pdE1vZGUoa0xpbWl0TW9kZV9Td2l0Y2hJbnB1dHNPbmx5KTsKK30KKworLyoqCisgKiBTZXQgdGhlIGxpbWl0IG1vZGUgZm9yIHBvc2l0aW9uIGNvbnRyb2wgbW9kZS4KKyAqCisgKiBVc2UgQ29uZmlnU29mdFBvc2l0aW9uTGltaXRzIG9yIERpc2FibGVTb2Z0UG9zaXRpb25MaW1pdHMgdG8gc2V0IHRoaXMKKyAqIGF1dG9tYXRpY2FsbHkuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpDb25maWdMaW1pdE1vZGUoTGltaXRNb2RlIG1vZGUpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCisJZGF0YUJ1ZmZlclswXSA9IG1vZGU7CisJc2VuZE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9NT0RFLCBkYXRhQnVmZmVyLCBzaXplb2YodWludDhfdCkpOworCisJbV9saW1pdE1vZGUgPSBtb2RlOworCW1fbGltaXRNb2RlVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisqIFNldCB0aGUgcG9zaXRpb24gdGhhdCBpZiBleGNlZWRlZCB3aWxsIGRpc2FibGUgdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorKgorKiBVc2UgQ29uZmlnU29mdFBvc2l0aW9uTGltaXRzIHRvIHNldCB0aGlzIGFuZCB0aGUgbGltaXQgbW9kZSBhdXRvbWF0aWNhbGx5LgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpDb25maWdGb3J3YXJkTGltaXQoZG91YmxlIGZvcndhcmRMaW1pdFBvc2l0aW9uKQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplOworCisJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgZm9yd2FyZExpbWl0UG9zaXRpb24pOworCWRhdGFCdWZmZXJbZGF0YVNpemUrK10gPSAxOworCXNlbmRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfRldELCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKwltX2ZvcndhcmRMaW1pdCA9IGZvcndhcmRMaW1pdFBvc2l0aW9uOworCW1fZm9yd2FyZExpbWl0VmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisqIFNldCB0aGUgcG9zaXRpb24gdGhhdCBpZiBleGNlZWRlZCB3aWxsIGRpc2FibGUgdGhlIHJldmVyc2UgZGlyZWN0aW9uLgorKgorKiBVc2UgQ29uZmlnU29mdFBvc2l0aW9uTGltaXRzIHRvIHNldCB0aGlzIGFuZCB0aGUgbGltaXQgbW9kZSBhdXRvbWF0aWNhbGx5LgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpDb25maWdSZXZlcnNlTGltaXQoZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKQoreworCXVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKwl1aW50OF90IGRhdGFTaXplOworCisJZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgcmV2ZXJzZUxpbWl0UG9zaXRpb24pOworCWRhdGFCdWZmZXJbZGF0YVNpemUrK10gPSAwOworCXNlbmRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfUkVWLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKwltX3JldmVyc2VMaW1pdCA9IHJldmVyc2VMaW1pdFBvc2l0aW9uOworCW1fcmV2ZXJzZUxpbWl0VmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIG1heGltdW0gdm9sdGFnZSB0aGF0IHRoZSBKYWd1YXIgd2lsbCBldmVyIG91dHB1dC4KKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxpbWl0IHRoZSBtYXhpbXVtIG91dHB1dCB2b2x0YWdlIGluIGFsbCBtb2RlcyBzbyB0aGF0CisgKiBtb3RvcnMgd2hpY2ggY2Fubm90IHdpdGhzdGFuZCBmdWxsIGJ1cyB2b2x0YWdlIGNhbiBiZSB1c2VkIHNhZmVseS4KKyAqCisgKiBAcGFyYW0gdm9sdGFnZSBUaGUgbWF4aW11bSB2b2x0YWdlIG91dHB1dCBieSB0aGUgSmFndWFyLgorICovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnTWF4T3V0cHV0Vm9sdGFnZShkb3VibGUgdm9sdGFnZSkKK3sKKwl1aW50OF90IGRhdGFCdWZmZXJbOF07CisJdWludDhfdCBkYXRhU2l6ZTsKKworCWRhdGFTaXplID0gcGFja0ZYUDhfOChkYXRhQnVmZmVyLCB2b2x0YWdlKTsKKwlzZW5kTWVzc2FnZShMTV9BUElfQ0ZHX01BWF9WT1VULCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKwltX21heE91dHB1dFZvbHRhZ2UgPSB2b2x0YWdlOworCW1fbWF4T3V0cHV0Vm9sdGFnZVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogQ29uZmlndXJlIGhvdyBsb25nIHRoZSBKYWd1YXIgd2FpdHMgaW4gdGhlIGNhc2Ugb2YgYSBmYXVsdCBiZWZvcmUgcmVzdW1pbmcgb3BlcmF0aW9uLgorICoKKyAqIEZhdWx0cyBpbmNsdWRlIG92ZXIgdGVtZXJhdHVyZSwgb3ZlciBjdXJyZW50LCBhbmQgYnVzIHVuZGVyIHZvbHRhZ2UuCisgKiBUaGUgZGVmYXVsdCBpcyAzLjAgc2Vjb25kcywgYnV0IGNhbiBiZSByZWR1Y2VkIHRvIGFzIGxvdyBhcyAwLjUgc2Vjb25kcy4KKyAqCisgKiBAcGFyYW0gZmF1bHRUaW1lIFRoZSB0aW1lIHRvIHdhaXQgYmVmb3JlIHJlc3VtaW5nIG9wZXJhdGlvbiwgaW4gc2Vjb25kcy4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ0ZhdWx0VGltZShmbG9hdCBmYXVsdFRpbWUpCit7CisJdWludDhfdCBkYXRhQnVmZmVyWzhdOworCXVpbnQ4X3QgZGF0YVNpemU7CisKKwlpZihmYXVsdFRpbWUgPCAwLjUpIGZhdWx0VGltZSA9IDAuNTsKKwllbHNlIGlmKGZhdWx0VGltZSA+IDMuMCkgZmF1bHRUaW1lID0gMy4wOworCisJLy8gTWVzc2FnZSB0YWtlcyBtcworCWRhdGFTaXplID0gcGFja2ludDE2X3QoZGF0YUJ1ZmZlciwgKGludDE2X3QpKGZhdWx0VGltZSAqIDEwMDAuMCkpOworCXNlbmRNZXNzYWdlKExNX0FQSV9DRkdfRkFVTFRfVElNRSwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworCisJbV9mYXVsdFRpbWUgPSBmYXVsdFRpbWU7CisJbV9mYXVsdFRpbWVWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIFVwZGF0ZSBhbGwgdGhlIG1vdG9ycyB0aGF0IGhhdmUgcGVuZGluZyBzZXRzIGluIHRoZSBzeW5jR3JvdXAuCisgKgorICogQHBhcmFtIHN5bmNHcm91cCBBIGJpdG1hc2sgb2YgZ3JvdXBzIHRvIGdlbmVyYXRlIHN5bmNocm9ub3VzIG91dHB1dC4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlVwZGF0ZVN5bmNHcm91cCh1aW50OF90IHN5bmNHcm91cCkKK3sKKwlzZW5kTWVzc2FnZUhlbHBlcihDQU5fTVNHSURfQVBJX1NZTkMsICZzeW5jR3JvdXAsIHNpemVvZihzeW5jR3JvdXApLCBDQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUKTsKK30KKworCit2b2lkIENBTkphZ3Vhcjo6U2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KQoreworCWlmIChtX3NhZmV0eUhlbHBlcikgbV9zYWZldHlIZWxwZXItPlNldEV4cGlyYXRpb24odGltZW91dCk7Cit9CisKK2Zsb2F0IENBTkphZ3Vhcjo6R2V0RXhwaXJhdGlvbigpCit7CisJaWYgKCFtX3NhZmV0eUhlbHBlcikgcmV0dXJuIDAuMDsKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPkdldEV4cGlyYXRpb24oKTsKK30KKworYm9vbCBDQU5KYWd1YXI6OklzQWxpdmUoKQoreworCWlmICghbV9zYWZldHlIZWxwZXIpIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsKK30KKworYm9vbCBDQU5KYWd1YXI6OklzU2FmZXR5RW5hYmxlZCgpCit7CisJaWYgKCFtX3NhZmV0eUhlbHBlcikgcmV0dXJuIGZhbHNlOworCXJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNTYWZldHlFbmFibGVkKCk7Cit9CisKK3ZvaWQgQ0FOSmFndWFyOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKwlpZiAobV9zYWZldHlIZWxwZXIpIG1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOworfQorCit2b2lkIENBTkphZ3Vhcjo6R2V0RGVzY3JpcHRpb24oY2hhciAqZGVzYykKK3sKKwlzcHJpbnRmKGRlc2MsICJDQU5KYWd1YXIgSUQgJWQiLCBtX2RldmljZU51bWJlcik7Cit9CisKK3VpbnQ4X3QgQ0FOSmFndWFyOjpHZXREZXZpY2VJRCgpCit7CisJcmV0dXJuIG1fZGV2aWNlTnVtYmVyOworfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHN0b3BwaW5nIHRoZSBtb3RvcgorICogUGFydCBvZiB0aGUgTW90b3JTYWZldHkgaW50ZXJmYWNlCisgKgorICogQGRlcHJlY2F0ZWQgQ2FsbCBEaXNhYmxlQ29udHJvbCBpbnN0ZWFkLgorICovCit2b2lkIENBTkphZ3Vhcjo6U3RvcE1vdG9yKCkKK3sKKwlEaXNhYmxlQ29udHJvbCgpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9DQU5UYWxvbi5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NBTlRhbG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGQ3YjdlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9DQU5UYWxvbi5jcHAKQEAgLTAsMCArMSwxMjU5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkNBTlRhbG9uLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiY3RyZS9DYW5UYWxvblNSWC5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyB1c2xlZXAKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIHRoZSBDQU5UYWxvbiBkZXZpY2UuCisgKiBAcGFyYW0gZGV2aWNlTnVtYmVyIFRoZSBDQU4gSUQgb2YgdGhlIFRhbG9uIFNSWAorICovCitDQU5UYWxvbjo6Q0FOVGFsb24oaW50IGRldmljZU51bWJlcikKKwk6IG1fZGV2aWNlTnVtYmVyKGRldmljZU51bWJlcikKKwksIG1faW1wbChuZXcgQ2FuVGFsb25TUlgoZGV2aWNlTnVtYmVyKSkKKwksIG1fc2FmZXR5SGVscGVyKG5ldyBNb3RvclNhZmV0eUhlbHBlcih0aGlzKSkKKyAgLCBtX3Byb2ZpbGUoMCkKKyAgLCBtX2NvbnRyb2xFbmFibGVkKHRydWUpCisgICwgbV9jb250cm9sTW9kZShrUGVyY2VudFZidXMpCisgICwgbV9zZXRQb2ludCgwKQoreworICBBcHBseUNvbnRyb2xNb2RlKG1fY29udHJvbE1vZGUpOworICBtX2ltcGwtPlNldFByb2ZpbGVTbG90U2VsZWN0KG1fcHJvZmlsZSk7Cit9CisvKioKKyAqIENvbnN0cnVjdG9yIGZvciB0aGUgQ0FOVGFsb24gZGV2aWNlLgorICogQHBhcmFtIGRldmljZU51bWJlciBUaGUgQ0FOIElEIG9mIHRoZSBUYWxvbiBTUlgKKyAqIEBwYXJhbSBjb250cm9sUGVyaW9kTXMgVGhlIHBlcmlvZCBpbiBtcyB0byBzZW5kIHRoZSBDQU4gY29udHJvbCBmcmFtZS4KKyAqCQkJCQkJCVBlcmlvZCBpcyBib3VuZGVkIHRvIFsxbXMsIDk1bXNdLgorICovCitDQU5UYWxvbjo6Q0FOVGFsb24oaW50IGRldmljZU51bWJlcixpbnQgY29udHJvbFBlcmlvZE1zKQorCTogbV9kZXZpY2VOdW1iZXIoZGV2aWNlTnVtYmVyKQorCSwgbV9pbXBsKG5ldyBDYW5UYWxvblNSWChkZXZpY2VOdW1iZXIsY29udHJvbFBlcmlvZE1zKSkgLyogYm91bmRlZCB1bmRlcm5lYXRoIHRvIGJlIHdpdGhpbiBbMSBtcyw5NSBtc10gKi8KKwksIG1fc2FmZXR5SGVscGVyKG5ldyBNb3RvclNhZmV0eUhlbHBlcih0aGlzKSkKKyAgLCBtX3Byb2ZpbGUoMCkKKyAgLCBtX2NvbnRyb2xFbmFibGVkKHRydWUpCisgICwgbV9jb250cm9sTW9kZShrUGVyY2VudFZidXMpCisgICwgbV9zZXRQb2ludCgwKQoreworICBBcHBseUNvbnRyb2xNb2RlKG1fY29udHJvbE1vZGUpOworICBtX2ltcGwtPlNldFByb2ZpbGVTbG90U2VsZWN0KG1fcHJvZmlsZSk7Cit9CitDQU5UYWxvbjo6fkNBTlRhbG9uKCkgeworCWRlbGV0ZSBtX2ltcGw7CisJZGVsZXRlIG1fc2FmZXR5SGVscGVyOworfQorCisvKioKKyogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorKgorKiBAZGVwcmVjYXRlZCBDYWxsIFNldCBpbnN0ZWFkLgorKgorKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUGVyY2VudFZidXMgdmFsdWUgYXMgd2FzIGNvbXB1dGVkIGJ5IHRoZSBQSURDb250cm9sbGVyCisqLwordm9pZCBDQU5UYWxvbjo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KQoreworCWlmIChHZXRDb250cm9sTW9kZSgpID09IGtQZXJjZW50VmJ1cykKKwl7CisJCVNldChvdXRwdXQpOworCX0KKwllbHNlCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiUElEIG9ubHkgc3VwcG9ydGVkIGluIFBlcmNlbnRWYnVzIG1vZGUiKTsKKwl9Cit9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBUYWxvbiAodXN1YWxseSBhIHNlbnNvciB2YWx1ZSkuCisgICAqCisgICAqIEluIEN1cnJlbnQgbW9kZTogcmV0dXJucyBvdXRwdXQgY3VycmVudC4KKyAgICogSW4gU3BlZWQgbW9kZTogcmV0dXJucyBjdXJyZW50IHNwZWVkLgorICAgKiBJbiBQb3NpdGlvbiBtb2RlOiByZXR1cm5zIGN1cnJlbnQgc2Vuc29yIHBvc2l0aW9uLgorICAgKiBJbiBQZXJjZW50VmJ1cyBhbmQgRm9sbG93ZXIgbW9kZXM6IHJldHVybnMgY3VycmVudCBhcHBsaWVkIHRocm90dGxlLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlbnNvciB2YWx1ZSBvZiB0aGUgVGFsb24uCisgICAqLworZmxvYXQgQ0FOVGFsb246OkdldCgpCit7CisgIGludCB2YWx1ZTsKKyAgc3dpdGNoKG1fY29udHJvbE1vZGUpIHsKKyAgICBjYXNlIGtWb2x0YWdlOgorICAgICAgcmV0dXJuIEdldE91dHB1dFZvbHRhZ2UoKTsKKyAgICBjYXNlIGtDdXJyZW50OgorICAgICAgcmV0dXJuIEdldE91dHB1dEN1cnJlbnQoKTsKKyAgICBjYXNlIGtTcGVlZDoKKyAgICAgIG1faW1wbC0+R2V0U2Vuc29yVmVsb2NpdHkodmFsdWUpOworICAgICAgcmV0dXJuIHZhbHVlOworICAgIGNhc2Uga1Bvc2l0aW9uOgorICAgICAgbV9pbXBsLT5HZXRTZW5zb3JQb3NpdGlvbih2YWx1ZSk7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgY2FzZSBrUGVyY2VudFZidXM6CisgICAgZGVmYXVsdDoKKyAgICAgIG1faW1wbC0+R2V0QXBwbGllZFRocm90dGxlKHZhbHVlKTsKKyAgICAgIHJldHVybiAoZmxvYXQpdmFsdWUgLyAxMDIzLjA7CisgIH0KK30KKworLyoqCisgKiBTZXRzIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgb24gdGhlIHRhbG9uLCBkZXBlbmRpbmcgb24gdGhlIG1vZGUuCisgKgorICogSW4gUGVyY2VudFZidXMsIHRoZSBvdXRwdXQgaXMgYmV0d2VlbiAtMS4wIGFuZCAxLjAsIHdpdGggMC4wIGFzIHN0b3BwZWQuCisgKiBJbiBWb2x0YWdlIG1vZGUsIG91dHB1dCB2YWx1ZSBpcyBpbiB2b2x0cy4KKyAqIEluIEN1cnJlbnQgbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIGFtcGVyZXMuCisgKiBJbiBTcGVlZCBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gcG9zaXRpb24gY2hhbmdlIC8gMTBtcy4KKyAqIEluIFBvc2l0aW9uIG1vZGUsIG91dHB1dCB2YWx1ZSBpcyBpbiBlbmNvZGVyIHRpY2tzIG9yIGFuIGFuYWxvZyB2YWx1ZSwKKyAqICAgZGVwZW5kaW5nIG9uIHRoZSBzZW5zb3IuCisgKiBJbiBGb2xsb3dlciBtb2RlLCB0aGUgb3V0cHV0IHZhbHVlIGlzIHRoZSBpbnRlZ2VyIGRldmljZSBJRCBvZiB0aGUgdGFsb24gdG8gZHVwbGljYXRlLgorICoKKyAqIEBwYXJhbSBvdXRwdXRWYWx1ZSBUaGUgc2V0cG9pbnQgdmFsdWUsIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwKQoreworICAvKiBmZWVkIHNhZmV0eSBoZWxwZXIgc2luY2UgY2FsbGVyIGp1c3QgdXBkYXRlZCBvdXIgb3V0cHV0ICovCisgIG1fc2FmZXR5SGVscGVyLT5GZWVkKCk7CisgIGlmKG1fY29udHJvbEVuYWJsZWQpIHsKKyAgICBtX3NldFBvaW50ID0gdmFsdWU7CisgICAgQ1RSX0NvZGUgc3RhdHVzOworICAgIHN3aXRjaChtX2NvbnRyb2xNb2RlKSB7CisgICAgICBjYXNlIENBTlNwZWVkQ29udHJvbGxlcjo6a1BlcmNlbnRWYnVzOgorICAgICAgICB7CisgICAgICAgICAgbV9pbXBsLT5TZXQodmFsdWUpOworICAgICAgICAgIHN0YXR1cyA9IENUUl9PS0FZOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQU5TcGVlZENvbnRyb2xsZXI6OmtGb2xsb3dlcjoKKyAgICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0RGVtYW5kKChpbnQpdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQU5TcGVlZENvbnRyb2xsZXI6OmtWb2x0YWdlOgorICAgICAgICB7CisgICAgICAgICAgLy8gVm9sdGFnZSBpcyBhbiA4LjggZml4ZWQgcG9pbnQgbnVtYmVyLgorICAgICAgICAgIGludCB2b2x0cyA9IGludCh2YWx1ZSAqIDI1Nik7CisgICAgICAgICAgc3RhdHVzID0gbV9pbXBsLT5TZXREZW1hbmQodm9sdHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQU5TcGVlZENvbnRyb2xsZXI6OmtTcGVlZDoKKyAgICAgICAgc3RhdHVzID0gbV9pbXBsLT5TZXREZW1hbmQodmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FOU3BlZWRDb250cm9sbGVyOjprUG9zaXRpb246CisgICAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0RGVtYW5kKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgfQorCisgICAgc3RhdHVzID0gbV9pbXBsLT5TZXRNb2RlU2VsZWN0KG1fc2VuZE1vZGUpOworCisgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgfQorCisgIH0KK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCit2b2lkIENBTlRhbG9uOjpEaXNhYmxlKCkKK3sKKyAgLy8gVW50aWwgTW9kZXMgb3RoZXIgdGhhbiB0aHJvdHRsZSB3b3JrLCBqdXN0IGRpc2FibGUgYnkgc2V0dGluZyB0aHJvdHRsZSB0byAwLjAuCisgIG1faW1wbC0+U2V0TW9kZVNlbGVjdCgoaW50KUNBTlRhbG9uOjprRGlzYWJsZWQpOworICBtX2NvbnRyb2xFbmFibGVkID0gZmFsc2U7Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6RW5hYmxlQ29udHJvbCgpIHsKKyAgU2V0Q29udHJvbE1vZGUobV9jb250cm9sTW9kZSk7CisgIG1fY29udHJvbEVuYWJsZWQgPSB0cnVlOworfQorCisvKioKKyAqIEByZXR1cm4gV2hldGhlciB0aGUgVGFsb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgKi8KK2Jvb2wgQ0FOVGFsb246OklzQ29udHJvbEVuYWJsZWQoKSB7CisgIHJldHVybiBtX2NvbnRyb2xFbmFibGVkOworfQorCisvKioKKyAqIEBwYXJhbSBwIFByb3BvcnRpb25hbCBjb25zdGFudCB0byB1c2UgaW4gUElEIGxvb3AuCisgKiBAc2VlIFNlbGVjdFByb2ZpbGVTbG90IHRvIGNob29zZSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBnYWlucy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0UChkb3VibGUgcCkKK3sKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRQZ2FpbihtX3Byb2ZpbGUsIHApOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKyAvKioKKyAgKiBTZXQgdGhlIGludGVncmF0aW9uIGNvbnN0YW50IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvZmlsZS4KKyAgKgorICAqIEBwYXJhbSBpIEludGVncmF0aW9uIGNvbnN0YW50IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIFBJRCBwcm9maWxlLgorICAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICAqLwordm9pZCBDQU5UYWxvbjo6U2V0SShkb3VibGUgaSkKK3sKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRJZ2FpbihtX3Byb2ZpbGUsIGkpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBkZXJpdmF0aXZlIGNvbnN0YW50IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvZmlsZS4KKyAqCisgKiBAcGFyYW0gZCBEZXJpdmF0aXZlIGNvbnN0YW50IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIFBJRCBwcm9maWxlLgorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldEQoZG91YmxlIGQpCit7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0RGdhaW4obV9wcm9maWxlLCBkKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBTZXQgdGhlIGZlZWRmb3J3YXJkIHZhbHVlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvZmlsZS4KKyAqCisgKiBAcGFyYW0gZiBGZWVkZm9yd2FyZCBjb25zdGFudCBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBQSUQgcHJvZmlsZS4KKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRGKGRvdWJsZSBmKQoreworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldEZnYWluKG1fcHJvZmlsZSwgZik7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogU2V0IHRoZSBJem9uZSB0byBhIG5vbnplcm8gdmFsdWUgdG8gYXV0byBjbGVhciB0aGUgaW50ZWdyYWwgYWNjdW11bGF0b3IKKyAqCQl3aGVuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBDbG9zZUxvb3BFcnJvciBleGNlZWRzIEl6b25lLgorICoKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRJem9uZSh1bnNpZ25lZCBpeikKK3sKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRJem9uZShtX3Byb2ZpbGUsIGl6KTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBTUlggaGFzIHR3byBhdmFpbGFibGUgc2xvdHMgZm9yIFBJRC4KKyAqIEBwYXJhbSBzbG90SWR4IG9uZSBvciB6ZXJvIGRlcGVuZGluZyBvbiB3aGljaCBzbG90IGNhbGxlciB3YW50cy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2VsZWN0UHJvZmlsZVNsb3QoaW50IHNsb3RJZHgpCit7CisJbV9wcm9maWxlID0gKHNsb3RJZHggPT0gMCkgPyAwIDogMTsgLyogb25seSBnZXQgdHdvIHNsb3RzIGZvciBub3cgKi8KKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFByb2ZpbGVTbG90U2VsZWN0KG1fcHJvZmlsZSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogU2V0cyBjb250cm9sIHZhbHVlcyBmb3IgY2xvc2VkIGxvb3AgY29udHJvbC4KKyAqCisgKiBAcGFyYW0gcCBQcm9wb3J0aW9uYWwgY29uc3RhbnQuCisgKiBAcGFyYW0gaSBJbnRlZ3JhdGlvbiBjb25zdGFudC4KKyAqIEBwYXJhbSBkIERpZmZlcmVudGlhbCBjb25zdGFudC4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IEYtZ2Fpbi4gIENvbnNpZGVyYWJsZSBwYXNzaW5nIGEgemVybyBmb3IgZiB1c2luZworICogdGhlIGZvdXItcGFyYW1ldGVyIGZ1bmN0aW9uLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKK3sKKwlTZXRQKHApOworCVNldEkoaSk7CisJU2V0RChkKTsKK30KKy8qKgorICogU2V0cyBjb250cm9sIHZhbHVlcyBmb3IgY2xvc2VkIGxvb3AgY29udHJvbC4KKyAqCisgKiBAcGFyYW0gcCBQcm9wb3J0aW9uYWwgY29uc3RhbnQuCisgKiBAcGFyYW0gaSBJbnRlZ3JhdGlvbiBjb25zdGFudC4KKyAqIEBwYXJhbSBkIERpZmZlcmVudGlhbCBjb25zdGFudC4KKyAqIEBwYXJhbSBmIEZlZWRmb3J3YXJkIGNvbnN0YW50LgorICovCit2b2lkIENBTlRhbG9uOjpTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYpCit7CisJU2V0UChwKTsKKwlTZXRJKGkpOworCVNldEQoZCk7CisJU2V0RihmKTsKK30KKy8qKgorICogU2VsZWN0IHRoZSBmZWVkYmFjayBkZXZpY2UgdG8gdXNlIGluIGNsb3NlZC1sb29wCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldEZlZWRiYWNrRGV2aWNlKEZlZWRiYWNrRGV2aWNlIGRldmljZSkKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldEZlZWRiYWNrRGV2aWNlU2VsZWN0KChpbnQpZGV2aWNlKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBTZWxlY3QgdGhlIGZlZWRiYWNrIGRldmljZSB0byB1c2UgaW4gY2xvc2VkLWxvb3AKKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0U3RhdHVzRnJhbWVSYXRlTXMoU3RhdHVzRnJhbWVSYXRlIHN0YXRlRnJhbWUsIGludCBwZXJpb2RNcykKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFN0YXR1c0ZyYW1lUmF0ZSgoaW50KXN0YXRlRnJhbWUscGVyaW9kTXMpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHByb3BvcnRpb25hbCBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIGRvdWJsZSBwcm9wb3J0aW9uYWwgY29uc3RhbnQgZm9yIGN1cnJlbnQgcHJvZmlsZS4KKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldFAoKQoreworICBDYW5UYWxvblNSWDo6cGFyYW1fdCBwYXJhbSA9IG1fcHJvZmlsZSA/IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDFfUCA6IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDBfUDsKKyAgLy8gVXBkYXRlIHRoZSBpbmZvIGluIG1faW1wbC4KKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0ocGFyYW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICB1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsgLyogc21hbGwgeWllbGQgZm9yIGdldHRpbmcgcmVzcG9uc2UgKi8KKyAgZG91YmxlIHA7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0UGdhaW4obV9wcm9maWxlLCBwKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiBwOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKiBAc2VlIFNlbGVjdFByb2ZpbGVTbG90IHRvIGNob29zZSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBnYWlucy4KKyAqLworZG91YmxlIENBTlRhbG9uOjpHZXRJKCkKK3sKKyAgQ2FuVGFsb25TUlg6OnBhcmFtX3QgcGFyYW0gPSBtX3Byb2ZpbGUgPyBDYW5UYWxvblNSWDo6ZVByb2ZpbGVQYXJhbVNsb3QxX0kgOiBDYW5UYWxvblNSWDo6ZVByb2ZpbGVQYXJhbVNsb3QwX0k7CisgIC8vIFVwZGF0ZSB0aGUgaW5mbyBpbiBtX2ltcGwuCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+UmVxdWVzdFBhcmFtKHBhcmFtKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKwl1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsgLyogc21hbGwgeWllbGQgZm9yIGdldHRpbmcgcmVzcG9uc2UgKi8KKworICBkb3VibGUgaTsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXRJZ2FpbihtX3Byb2ZpbGUsIGkpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldEQoKQoreworICBDYW5UYWxvblNSWDo6cGFyYW1fdCBwYXJhbSA9IG1fcHJvZmlsZSA/IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDFfRCA6IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDBfRDsKKyAgLy8gVXBkYXRlIHRoZSBpbmZvIGluIG1faW1wbC4KKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0ocGFyYW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorCXVzbGVlcChrRGVsYXlGb3JTb2xpY2l0ZWRTaWduYWxzVXMpOyAvKiBzbWFsbCB5aWVsZCBmb3IgZ2V0dGluZyByZXNwb25zZSAqLworCisgIGRvdWJsZSBkOworICBzdGF0dXMgPSBtX2ltcGwtPkdldERnYWluKG1fcHJvZmlsZSwgZCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gZDsKK30KKy8qKgorICoKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldEYoKQoreworICBDYW5UYWxvblNSWDo6cGFyYW1fdCBwYXJhbSA9IG1fcHJvZmlsZSA/IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDFfRiA6IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDBfRjsKKyAgLy8gVXBkYXRlIHRoZSBpbmZvIGluIG1faW1wbC4KKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0ocGFyYW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorCisJdXNsZWVwKGtEZWxheUZvclNvbGljaXRlZFNpZ25hbHNVcyk7ICAvKiBzbWFsbCB5aWVsZCBmb3IgZ2V0dGluZyByZXNwb25zZSAqLworICBkb3VibGUgZjsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXRGZ2FpbihtX3Byb2ZpbGUsIGYpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIGY7Cit9CisvKioKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCitpbnQgQ0FOVGFsb246OkdldEl6b25lKCkKK3sKKyAgQ2FuVGFsb25TUlg6OnBhcmFtX3QgcGFyYW0gPSBtX3Byb2ZpbGUgPyBDYW5UYWxvblNSWDo6ZVByb2ZpbGVQYXJhbVNsb3QxX0lab25lOiBDYW5UYWxvblNSWDo6ZVByb2ZpbGVQYXJhbVNsb3QwX0lab25lOworIC8vIFVwZGF0ZSB0aGUgaW5mbyBpbiBtX2ltcGwuCisgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0ocGFyYW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyB9CisJdXNsZWVwKGtEZWxheUZvclNvbGljaXRlZFNpZ25hbHNVcyk7CisKKyBpbnQgaXo7Cisgc3RhdHVzID0gbV9pbXBsLT5HZXRJem9uZShtX3Byb2ZpbGUsIGl6KTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiBpejsKK30KKworLyoqCisgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHNldHBvaW50OyBpZSwgd2hhdGV2ZXIgd2FzIGxhc3QgcGFzc2VkIHRvIFNldCgpLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldFNldHBvaW50KCkgeworICByZXR1cm4gbV9zZXRQb2ludDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSB2b2x0YWdlIGNvbWluZyBpbiBmcm9tIHRoZSBiYXR0ZXJ5LgorICoKKyAqIEByZXR1cm4gVGhlIGlucHV0IHZvbHRhZ2UgaW4gdm9sdHMuCisgKi8KK2Zsb2F0IENBTlRhbG9uOjpHZXRCdXNWb2x0YWdlKCkKK3sKKyAgZG91YmxlIHZvbHRhZ2U7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0QmF0dGVyeVYodm9sdGFnZSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKyAgcmV0dXJuIHZvbHRhZ2U7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgdm9sdGFnZSBiZWluZyBvdXRwdXQgYnkgdGhlIFRhbG9uLCBpbiBWb2x0cy4KKyAqLworZmxvYXQgQ0FOVGFsb246OkdldE91dHB1dFZvbHRhZ2UoKQoreworICBpbnQgdGhyb3R0bGUxMTsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRBcHBsaWVkVGhyb3R0bGUodGhyb3R0bGUxMSk7CisgIGZsb2F0IHZvbHRhZ2UgPSBHZXRCdXNWb2x0YWdlKCkgKiAoZmxvYXQodGhyb3R0bGUxMSkgLyAxMDIzLjApOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIHZvbHRhZ2U7Cit9CisKKworLyoqCisgKiAgUmV0dXJucyB0aGUgY3VycmVudCBnb2luZyB0aHJvdWdoIHRoZSBUYWxvbiwgaW4gQW1wZXJlcy4KKyAqLworZmxvYXQgQ0FOVGFsb246OkdldE91dHB1dEN1cnJlbnQoKQoreworICBkb3VibGUgY3VycmVudDsKKworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEN1cnJlbnQoY3VycmVudCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKworCXJldHVybiBjdXJyZW50OworfQorCisgIC8qKgorICAgKiAgUmV0dXJucyB0ZW1wZXJhdHVyZSBvZiBUYWxvbiwgaW4gZGVncmVlcyBDZWxzaXVzLgorICAgKi8KK2Zsb2F0IENBTlRhbG9uOjpHZXRUZW1wZXJhdHVyZSgpCit7CisgIGRvdWJsZSB0ZW1wOworCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0VGVtcCh0ZW1wKTsKKwlpZih0ZW1wICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gdGVtcDsKK30KKy8qKgorICogU2V0IHRoZSBwb3NpdGlvbiB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgc2Vuc29yLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHplcm8taW5nIHF1YWRyYXR1cmUgZW5jb2RlcnMuCisgKiBDb250aW51b3VzIHNlbnNvcnMgKGxpa2UgYW5hbG9nIGVuY29kZXJlcykgY2FuIGFsc28gcGFydGlhbGx5IGJlIHNldCAodGhlIHBvcnRpb24gb2YgdGhlIHBvc3Rpb24gYmFzZWQgb24gb3ZlcmZsb3dzKS4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0UG9zaXRpb24oZG91YmxlIHBvcykKK3sKKwltX2ltcGwtPlNldFNlbnNvclBvc2l0aW9uKHBvcyk7Cit9CisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKgorICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIHNlbnNvciBjdXJyZW50bHkgcHJvdmlkaW5nIGZlZWRiYWNrLgorICogCQkJV2hlbiB1c2luZyBhbmFsb2cgc2Vuc29ycywgMCB1bml0cyBjb3JyZXNwb25kcyB0byAwViwgMTAyMyB1bml0cyBjb3JyZXNwb25kcyB0byAzLjNWCisgKiAJCQlXaGVuIHVzaW5nIGFuIGFuYWxvZyBlbmNvZGVyICh3cmFwcGluZyBhcm91bmQgMTAyMyA9PiAwIGlzIHBvc3NpYmxlKSB0aGUgdW5pdHMgYXJlIHN0aWxsIDMuM1YgcGVyIDEwMjMgdW5pdHMuCisgKiAJCQlXaGVuIHVzaW5nIHF1YWRyYXR1cmUsIGVhY2ggdW5pdCBpcyBhIHF1YWRyYXR1cmUgZWRnZSAoNFgpIG1vZGUuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0UG9zaXRpb24oKQoreworICBpbnQgcG9zdGl0aW9uOworCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0U2Vuc29yUG9zaXRpb24ocG9zdGl0aW9uKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiAoZG91YmxlKXBvc3RpdGlvbjsKK30KKy8qKgorICogSWYgc2Vuc29yIGFuZCBtb3RvciBhcmUgb3V0IG9mIHBoYXNlLCBzZW5zb3IgY2FuIGJlIGludmVydGVkIAorICogKHBvc2l0aW9uIGFuZCB2ZWxvY2l0eSBtdWx0aXBsaWVkIGJ5IC0xKS4KKyAqIEBzZWUgR2V0UG9zaXRpb24gYW5kIEBzZWUgR2V0U3BlZWQuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldFNlbnNvckRpcmVjdGlvbihib29sIHJldmVyc2VTZW5zb3IpCit7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UmV2RmVlZGJhY2tTZW5zb3IocmV2ZXJzZVNlbnNvciA/IDEgOiAwKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgZXJyb3IgaW4gdGhlIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzZXRwb2ludCBhbmQgdGhlIHNlbnNvciB2YWx1ZS4KKyAqLworaW50IENBTlRhbG9uOjpHZXRDbG9zZWRMb29wRXJyb3IoKSB7CisgIGludCBlcnJvcjsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRDbG9zZUxvb3BFcnIoZXJyb3IpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisgIHJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICoKKyAqIEByZXR1cm5zIFRoZSBzcGVlZCBvZiB0aGUgc2Vuc29yIGN1cnJlbnRseSBwcm92aWRpbmcgZmVlZGJhY2suCisgKgorICogVGhlIHNwZWVkIHVuaXRzIHdpbGwgYmUgaW4gdGhlIHNlbnNvcidzIG5hdGl2ZSB0aWNrcyBwZXIgMTAwbXMuCisgKgorICogRm9yIGFuYWxvZyBzZW5zb3JzLCAzLjNWIGNvcnJlc3BvbmRzIHRvIDEwMjMgdW5pdHMuCisgKiAJCVNvIGEgc3BlZWQgb2YgMjAwIGVxdWF0ZXMgdG8gfjAuNjQ1IGRWIHBlciAxMDBtcyBvciA2LjQ1MSBkViBwZXIgc2Vjb25kLgorICogCQlJZiB0aGlzIGlzIGFuIGFuYWxvZyBlbmNvZGVyLCB0aGF0IGxpa2VseSBtZWFucyAxLjk1NDggcm90YXRpb25zIHBlciBzZWMuCisgKiBGb3IgcXVhZHJhdHVyZSBlbmNvZGVycywgZWFjaCB1bml0IGNvcnJlc3BvbmRzIGEgcXVhZHJhdHVyZSBlZGdlICg0WCkuCisgKiAJCVNvIGEgMjUwIGNvdW50IGVuY29kZXIgd2lsbCBwcm9kdWNlIDEwMDAgZWRnZSBldmVudHMgcGVyIHJvdGF0aW9uLgorICogCQlBbiBleGFtcGxlIHNwZWVkIG9mIDIwMCB3b3VsZCB0aGVuIGVxdWF0ZSB0byAyMCUgb2YgYSByb3RhdGlvbiBwZXIgMTAwbXMsCisgKiAJCW9yIDEwIHJvdGF0aW9ucyBwZXIgc2Vjb25kLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldFNwZWVkKCkKK3sKKyAgaW50IHNwZWVkOworICAvLyBUT0RPIGNvbnZlcnQgZnJvbSBpbnQgdG8gYXBwcm9wcmlhdGUgdW5pdHMgKG9yIGF0IGxlYXN0IGRvY3VtZW50IGl0KS4KKworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFNlbnNvclZlbG9jaXR5KHNwZWVkKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiAoZG91YmxlKXNwZWVkOworfQorCisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSAyNGJpdCBhbmFsb2cgdmFsdWUuICBUaGUgYm90dG9tIHRlbiBiaXRzIGlzIHRoZSBBREMgKDAgLSAxMDIzKSBvbiAKKyAqCQkJCQkJCQl0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24uIFRoZSB1cHBlciAxNCBiaXRzCisgKgkJCQkJCQkJdHJhY2tzIHRoZSBvdmVyZmxvd3MgYW5kIHVuZGVyZmxvd3MgKGNvbnRpbnVvdXMgc2Vuc29yKS4KKyAqLworaW50IENBTlRhbG9uOjpHZXRBbmFsb2dJbigpCit7CisgIGludCBwb3NpdGlvbjsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRBbmFsb2dJbldpdGhPdihwb3NpdGlvbik7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKyAgcmV0dXJuIHBvc2l0aW9uOworfQorLyoqCisgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHdoYXRldmVyIGlzIGluIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbiwgcmVnYXJkbGVzcyBvZgorICogd2hldGhlciBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KKyAqCisgKiBAcmV0dXJucyBUaGUgQURDICgwIC0gMTAyMykgb24gYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24uCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0QW5hbG9nSW5SYXcoKQoreworICAgIHJldHVybiBHZXRBbmFsb2dJbigpICYgMHgzRkY7Cit9CisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSB2YWx1ZSAoMCAtIDEwMjMpIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRBbmFsb2dJblZlbCgpCit7CisgIGludCB2ZWw7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0QW5hbG9nSW5WZWwodmVsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorICByZXR1cm4gdmVsOworfQorCisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSB2YWx1ZSAoMCAtIDEwMjMpIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRFbmNQb3NpdGlvbigpCit7CisgIGludCBwb3NpdGlvbjsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRFbmNQb3NpdGlvbihwb3NpdGlvbik7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKyAgcmV0dXJuIHBvc2l0aW9uOworfQorCisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSB2YWx1ZSAoMCAtIDEwMjMpIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRFbmNWZWwoKQoreworICBpbnQgdmVsOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEVuY1ZlbCh2ZWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisgIHJldHVybiB2ZWw7Cit9CisvKioKKyAqIEByZXR1cm4gSU8gbGV2ZWwgb2YgUVVBREEgcGluLgorICovCitpbnQgQ0FOVGFsb246OkdldFBpblN0YXRlUXVhZEEoKQoreworCWludCByZXR2YWw7CisJQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRRdWFkQXBpbihyZXR2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogQHJldHVybiBJTyBsZXZlbCBvZiBRVUFEQiBwaW4uCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0UGluU3RhdGVRdWFkQigpCit7CisJaW50IHJldHZhbDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFF1YWRCcGluKHJldHZhbCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBAcmV0dXJuIElPIGxldmVsIG9mIFFVQUQgSW5kZXggcGluLgorICovCitpbnQgQ0FOVGFsb246OkdldFBpblN0YXRlUXVhZElkeCgpCit7CisJaW50IHJldHZhbDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFF1YWRJZHhwaW4ocmV0dmFsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisvKioKKyAqIEByZXR1cm4gJzEnIGlmZiBmb3J3YXJkIGxpbWl0IHN3aXRjaCBpcyBjbG9zZWQsIDAgaWZmIHN3aXRjaCBpcyBvcGVuLgorICogVGhpcyBmdW5jdGlvbiB3b3JrcyByZWdhcmRsZXNzIGlmIGxpbWl0IHN3aXRjaCBmZWF0dXJlIGlzIGVuYWJsZWQuCisgKi8KK2ludCBDQU5UYWxvbjo6SXNGd2RMaW1pdFN3aXRjaENsb3NlZCgpCit7CisJaW50IHJldHZhbDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldExpbWl0U3dpdGNoQ2xvc2VkRm9yKHJldHZhbCk7IC8qIHJlbmFtZSB0aGlzIGZ1bmMsICcxJyA9PiBvcGVuLCAnMCcgPT4gY2xvc2VkICovCisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gcmV0dmFsID8gMCA6IDE7Cit9CisvKioKKyAqIEByZXR1cm4gJzEnIGlmZiByZXZlcnNlIGxpbWl0IHN3aXRjaCBpcyBjbG9zZWQsIDAgaWZmIHN3aXRjaCBpcyBvcGVuLgorICogVGhpcyBmdW5jdGlvbiB3b3JrcyByZWdhcmRsZXNzIGlmIGxpbWl0IHN3aXRjaCBmZWF0dXJlIGlzIGVuYWJsZWQuCisgKi8KK2ludCBDQU5UYWxvbjo6SXNSZXZMaW1pdFN3aXRjaENsb3NlZCgpCit7CisJaW50IHJldHZhbDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldExpbWl0U3dpdGNoQ2xvc2VkUmV2KHJldHZhbCk7IC8qIHJlbmFtZSB0aGlzIGZ1bmMsICcxJyA9PiBvcGVuLCAnMCcgPT4gY2xvc2VkICovCisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gcmV0dmFsID8gMCA6IDE7Cit9CisvKgorICogU2ltcGxlIGFjY2Vzc29yIGZvciB0cmFja2VkIHJpc2UgZXZlbnRzbyBpbmRleCBwaW4uCisgKiBAcmV0dXJuIG51bWJlciBvZiByaXNpbmcgZWRnZXMgb24gaWR4IHBpbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXROdW1iZXJPZlF1YWRJZHhSaXNlcygpCit7CisJaW50IHJpc2VzOworCUNUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0RW5jSW5kZXhSaXNlRXZlbnRzKHJpc2VzKTsgLyogcmVuYW1lIHRoaXMgZnVuYywgJzEnID0+IG9wZW4sICcwJyA9PiBjbG9zZWQgKi8KKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXJldHVybiByaXNlczsKK30KKy8qCisgKiBAcGFyYW0gcmlzZXMgaW50ZWdyYWwgdmFsdWUgdG8gc2V0IGludG8gaW5kZXgtcmlzZXMgcmVnaXN0ZXIuICBHcmVhdCB3YXkgdG8gemVybyB0aGUgaW5kZXggY291bnQuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldE51bWJlck9mUXVhZElkeFJpc2VzKGludCByaXNlcykKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFBhcmFtKENhblRhbG9uU1JYOjplRW5jSW5kZXhSaXNlRXZlbnRzLCByaXNlcyk7IC8qIHJlbmFtZSB0aGlzIGZ1bmMsICcxJyA9PiBvcGVuLCAnMCcgPT4gY2xvc2VkICovCisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLworYm9vbCBDQU5UYWxvbjo6R2V0Rm9yd2FyZExpbWl0T0soKQoreworCWludCBsaW1Td2l0PTA7CisJaW50IHNvZnRMaW09MDsKKwlDVFJfQ29kZSBzdGF0dXM7CisJc3RhdHVzID0gbV9pbXBsLT5HZXRGYXVsdF9Gb3JTb2Z0TGltKHNvZnRMaW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJc3RhdHVzID0gbV9pbXBsLT5HZXRGYXVsdF9Gb3JMaW0obGltU3dpdCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwkvKiBJZiBlaXRoZXIgZmF1bHQgaXMgYXNzZXJ0ZWQsIHNpZ25hbCBjYWxsZXIgd2UgYXJlIGRpc2FibGVkICh3aXRoIGZhbHNlPykgKi8KKwlyZXR1cm4gKHNvZnRMaW0gfCBsaW1Td2l0KSA/IGZhbHNlIDogdHJ1ZTsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCitib29sIENBTlRhbG9uOjpHZXRSZXZlcnNlTGltaXRPSygpCit7CisJaW50IGxpbVN3aXQ9MDsKKwlpbnQgc29mdExpbT0wOworCUNUUl9Db2RlIHN0YXR1czsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1JldlNvZnRMaW0oc29mdExpbSk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1JldkxpbShsaW1Td2l0KTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCS8qIElmIGVpdGhlciBmYXVsdCBpcyBhc3NlcnRlZCwgc2lnbmFsIGNhbGxlciB3ZSBhcmUgZGlzYWJsZWQgKHdpdGggZmFsc2U/KSAqLworCXJldHVybiAoc29mdExpbSB8IGxpbVN3aXQpID8gZmFsc2UgOiB0cnVlOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3VpbnQxNl90IENBTlRhbG9uOjpHZXRGYXVsdHMoKQoreworCXVpbnQxNl90IHJldHZhbCA9IDA7CisJaW50IHZhbDsKKwlDVFJfQ29kZSBzdGF0dXM7CisKKwkvKiB0ZW1wZXJhdHVyZSAqLworCXZhbCA9IDA7CisJc3RhdHVzID0gbV9pbXBsLT5HZXRGYXVsdF9PdmVyVGVtcCh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprVGVtcGVyYXR1cmVGYXVsdCA6IDA7CisKKwkvKiB2b2x0YWdlICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1VuZGVyVm9sdGFnZSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprQnVzVm9sdGFnZUZhdWx0IDogMDsKKworCS8qIGZ3ZC1saW1pdC1zd2l0Y2ggKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfRm9yTGltKHZhbCk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKQorCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR2YWwgfD0gKHZhbCkgPyBDQU5TcGVlZENvbnRyb2xsZXI6OmtGd2RMaW1pdFN3aXRjaCA6IDA7CisKKwkvKiByZXYtbGltaXQtc3dpdGNoICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1JldkxpbSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprUmV2TGltaXRTd2l0Y2ggOiAwOworCisJLyogZndkLXNvZnQtbGltaXQgKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfRm9yU29mdExpbSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprRndkU29mdExpbWl0IDogMDsKKworCS8qIHJldi1zb2Z0LWxpbWl0ICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1JldlNvZnRMaW0odmFsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpCisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHZhbCB8PSAodmFsKSA/IENBTlNwZWVkQ29udHJvbGxlcjo6a1JldlNvZnRMaW1pdCA6IDA7CisKKwlyZXR1cm4gcmV0dmFsOworfQordWludDE2X3QgQ0FOVGFsb246OkdldFN0aWNreUZhdWx0cygpCit7CisJdWludDE2X3QgcmV0dmFsID0gMDsKKwlpbnQgdmFsOworCUNUUl9Db2RlIHN0YXR1czsKKworCS8qIHRlbXBlcmF0dXJlICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldFN0Y2t5RmF1bHRfT3ZlclRlbXAodmFsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpCisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHZhbCB8PSAodmFsKSA/IENBTlNwZWVkQ29udHJvbGxlcjo6a1RlbXBlcmF0dXJlRmF1bHQgOiAwOworCisJLyogdm9sdGFnZSAqLworCXZhbCA9IDA7CisJc3RhdHVzID0gbV9pbXBsLT5HZXRTdGNreUZhdWx0X1VuZGVyVm9sdGFnZSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprQnVzVm9sdGFnZUZhdWx0IDogMDsKKworCS8qIGZ3ZC1saW1pdC1zd2l0Y2ggKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0U3Rja3lGYXVsdF9Gb3JMaW0odmFsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpCisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHZhbCB8PSAodmFsKSA/IENBTlNwZWVkQ29udHJvbGxlcjo6a0Z3ZExpbWl0U3dpdGNoIDogMDsKKworCS8qIHJldi1saW1pdC1zd2l0Y2ggKi8KKwl2YWwgPSAwOworCXN0YXR1cyA9IG1faW1wbC0+R2V0U3Rja3lGYXVsdF9SZXZMaW0odmFsKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpCisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHZhbCB8PSAodmFsKSA/IENBTlNwZWVkQ29udHJvbGxlcjo6a1JldkxpbWl0U3dpdGNoIDogMDsKKworCS8qIGZ3ZC1zb2Z0LWxpbWl0ICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldFN0Y2t5RmF1bHRfRm9yU29mdExpbSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprRndkU29mdExpbWl0IDogMDsKKworCS8qIHJldi1zb2Z0LWxpbWl0ICovCisJdmFsID0gMDsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldFN0Y2t5RmF1bHRfUmV2U29mdExpbSh2YWwpOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprUmV2U29mdExpbWl0IDogMDsKKworCXJldHVybiByZXR2YWw7Cit9Cit2b2lkIENBTlRhbG9uOjpDbGVhclN0aWNreUZhdWx0cygpCit7CisJQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5DbGVhclN0aWNreUZhdWx0cygpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCB0aGUgbWF4aW11bSB2b2x0YWdlIGNoYW5nZSByYXRlLiAgVGhpcyByYW1wIHJhdGUgaXMgaW4gYWZmZWN0IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY29udHJvbCBtb2RlCisgKiB0aGUgVEFMT04gaXMgaW4uCisgKgorICogV2hlbiBpbiBQZXJjZW50VmJ1cyBvciBWb2x0YWdlIG91dHB1dCBtb2RlLCB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgdm9sdGFnZSBjaGFuZ2VzIGNhbgorICogYmUgbGltaXRlZCB0byByZWR1Y2UgY3VycmVudCBzcGlrZXMuICBTZXQgdGhpcyB0byAwLjAgdG8gZGlzYWJsZSByYXRlIGxpbWl0aW5nLgorICoKKyAqIEBwYXJhbSByYW1wUmF0ZSBUaGUgbWF4aW11bSByYXRlIG9mIHZvbHRhZ2UgY2hhbmdlIGluIFBlcmNlbnQgVm9sdGFnZSBtb2RlIGluIFYvcy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0Vm9sdGFnZVJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSkKK3sKKwkvKiBDYWxsZXIgaXMgZXhwcmVzc2luZyByYW1wIGFzIFZvbHRhZ2UgcGVyIHNlYywgYXNzdW1pbmcgMTJWIGlzIGZ1bGwuCisJCVRhbG9uJ3MgdGhyb3R0bGUgcmFtcCBpcyBpbiBkVGhyb3QvZDEwbXMuICAxMDIzIGlzIGZ1bGwgZndkLCAtMTAyMyBpcyBmdWxsIHJldi4gKi8KKwlkb3VibGUgcmFtcFJhdGVkVGhyb3RQZXIxMG1zID0gKHJhbXBSYXRlKjEwMjMuMC8xMi4wKSAvIDEwMDsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFJhbXBUaHJvdHRsZSgoaW50KXJhbXBSYXRlZFRocm90UGVyMTBtcyk7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKy8qKgorICogU2V0cyBhIHZvbHRhZ2UgY2hhbmdlIHJhdGUgdGhhdCBhcHBsaWVzIG9ubHkgd2hlbiBhIGNsb3NlIGxvb3AgY29udG9ybCBtb2RlIGlzIGVuYWJsZWQuCisgKiBUaGlzIGFsbG93cyBjbG9zZSBsb29wIHNwZWNpZmljIHJhbXAgYmVoYXZpb3IuCisgKgorICogQHBhcmFtIHJhbXBSYXRlIFRoZSBtYXhpbXVtIHJhdGUgb2Ygdm9sdGFnZSBjaGFuZ2UgaW4gUGVyY2VudCBWb2x0YWdlIG1vZGUgaW4gVi9zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRDbG9zZUxvb3BSYW1wUmF0ZShkb3VibGUgcmFtcFJhdGUpCit7CisJICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldENsb3NlTG9vcFJhbXBSYXRlKG1fcHJvZmlsZSxyYW1wUmF0ZSAqIDEwMjMuMCAvIDEyLjAgLyAxMDAwLjApOworCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQl9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgdmVyc2lvbiBvZiB0aGUgZmlybXdhcmUgcnVubmluZyBvbiB0aGUgVGFsb24KKyAqLwordWludDMyX3QgQ0FOVGFsb246OkdldEZpcm13YXJlVmVyc2lvbigpCit7CisJaW50IGZpcm13YXJlVmVyc2lvbjsKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbShDYW5UYWxvblNSWDo6ZUZpcm1WZXJzKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCXVzbGVlcChrRGVsYXlGb3JTb2xpY2l0ZWRTaWduYWxzVXMpOworCXN0YXR1cyA9IG1faW1wbC0+R2V0UGFyYW1SZXNwb25zZUludDMyKENhblRhbG9uU1JYOjplRmlybVZlcnMsZmlybXdhcmVWZXJzaW9uKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorCisJLyogb25seSBzZW50IG9uY2Ugb24gYm9vdCAqLworCS8vQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRGaXJtVmVycyhmaXJtd2FyZVZlcnNpb24pOworCS8vaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJLy8Jd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJLy99CisKKwlyZXR1cm4gZmlybXdhcmVWZXJzaW9uOworfQorLyoqCisgKiBAcmV0dXJuIFRoZSBhY2N1bXVsYXRvciBmb3IgSSBnYWluLgorICovCitpbnQgQ0FOVGFsb246OkdldElhY2N1bSgpCit7CisJQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0oQ2FuVGFsb25TUlg6OmVQaWRJYWNjdW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJdXNsZWVwKGtEZWxheUZvclNvbGljaXRlZFNpZ25hbHNVcyk7IC8qIHNtYWxsIHlpZWxkIGZvciBnZXR0aW5nIHJlc3BvbnNlICovCisJaW50IGlhY2N1bTsKKwlzdGF0dXMgPSBtX2ltcGwtPkdldFBhcmFtUmVzcG9uc2VJbnQzMihDYW5UYWxvblNSWDo6ZVBpZElhY2N1bSxpYWNjdW0pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9CisJcmV0dXJuIGlhY2N1bTsKK30KKy8qKgorICogQ2xlYXIgdGhlIGFjY3VtdWxhdG9yIGZvciBJIGdhaW4uCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNsZWFySWFjY3VtKCkKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFBhcmFtKENhblRhbG9uU1JYOjplUGlkSWFjY3VtLCAwKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ05ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG1vZGUpCit7CisJQ1RSX0NvZGUgc3RhdHVzOworCXN3aXRjaChtb2RlKXsKKwkJZGVmYXVsdDoKKwkJY2FzZSBrTmV1dHJhbE1vZGVfSnVtcGVyOiAvKiB1c2UgZGVmYXVsdCBzZXR0aW5nIGluIGZsYXNoIGJhc2VkIG9uIHdlYmRhc2gvQnJha2VDYWwgYnV0dG9uIHNlbGVjdGlvbiAqLworCQkJc3RhdHVzID0gbV9pbXBsLT5TZXRPdmVycmlkZUJyYWtlVHlwZShDYW5UYWxvblNSWDo6a0JyYWtlT3ZlcnJpZGVfVXNlRGVmYXVsdHNGcm9tRmxhc2gpOworCQkJYnJlYWs7CisJCWNhc2Uga05ldXRyYWxNb2RlX0JyYWtlOgorCQkJc3RhdHVzID0gbV9pbXBsLT5TZXRPdmVycmlkZUJyYWtlVHlwZShDYW5UYWxvblNSWDo6a0JyYWtlT3ZlcnJpZGVfT3ZlcnJpZGVCcmFrZSk7CisJCQlicmVhazsKKwkJY2FzZSBrTmV1dHJhbE1vZGVfQ29hc3Q6CisJCQlzdGF0dXMgPSBtX2ltcGwtPlNldE92ZXJyaWRlQnJha2VUeXBlKENhblRhbG9uU1JYOjprQnJha2VPdmVycmlkZV9PdmVycmlkZUNvYXN0KTsKKwkJCWJyZWFrOworCX0KKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBAcmV0dXJuIG5vbnplcm8gaWYgYnJha2UgaXMgZW5hYmxlZCBkdXJpbmcgbmV1dHJhbC4gIFplcm8gaWYgY29hc3QgaXMgZW5hYmxlZCBkdXJpbmcgbmV1dHJhbC4KKyAqLworaW50IENBTlRhbG9uOjpHZXRCcmFrZUVuYWJsZUR1cmluZ05ldXRyYWwoKQoreworICBpbnQgYnJha2VFbiA9IDA7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0QnJha2VJc0VuYWJsZWQoYnJha2VFbik7CisJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gYnJha2VFbjsKK30KKy8qKgorICogQGRlcHJlY2F0ZWQgbm90IGltcGxlbWVudGVkCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ0VuY29kZXJDb2Rlc1BlclJldih1aW50MTZfdCBjb2Rlc1BlclJldikKK3sKKwkvKiBUQUxPTiBTUlggZG9lcyBub3Qgc2NhbGUgdW5pdHMsIHRoZXkgYXJlIHJhdyBmcm9tIHRoZSBzZW5zb3IuICBVbml0IHNjYWxpbmcgY2FuIGJlIGRvbmUgaW4gQVBJIG9yIGJ5IGNhbGxlciAqLworfQorCisvKioKKyAqIEBkZXByZWNhdGVkIG5vdCBpbXBsZW1lbnRlZAorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdQb3RlbnRpb21ldGVyVHVybnModWludDE2X3QgdHVybnMpCit7CisJLyogVEFMT04gU1JYIGRvZXMgbm90IHNjYWxlIHVuaXRzLCB0aGV5IGFyZSByYXcgZnJvbSB0aGUgc2Vuc29yLiAgVW5pdCBzY2FsaW5nIGNhbiBiZSBkb25lIGluIEFQSSBvciBieSBjYWxsZXIgKi8KK30KKworLyoqCisgKiBAZGVwcmVjYXRlZCBub3QgaW1wbGVtZW50ZWQKKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnU29mdFBvc2l0aW9uTGltaXRzKGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbiwgZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKQoreworCUNvbmZpZ0xpbWl0TW9kZShrTGltaXRNb2RlX1NvZnRQb3NpdGlvbkxpbWl0cyk7CisJQ29uZmlnRm9yd2FyZExpbWl0KGZvcndhcmRMaW1pdFBvc2l0aW9uKTsKKwlDb25maWdSZXZlcnNlTGltaXQocmV2ZXJzZUxpbWl0UG9zaXRpb24pOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkRpc2FibGVTb2Z0UG9zaXRpb25MaW1pdHMoKQoreworCUNvbmZpZ0xpbWl0TW9kZShrTGltaXRNb2RlX1N3aXRjaElucHV0c09ubHkpOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKiBDb25maWd1cmVzIHRoZSBzb2Z0IGxpbWl0IGVuYWJsZSAod2VhciBsZXZlbGVkIHBlcnNpc3RlbnQgbWVtb3J5KS4KKyAqIEFsc28gc2V0cyB0aGUgbGltaXQgc3dpdGNoIG92ZXJyaWRlcy4KKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnTGltaXRNb2RlKExpbWl0TW9kZSBtb2RlKQoreworCUNUUl9Db2RlIHN0YXR1czsKKwlzd2l0Y2gobW9kZSl7CisJCWNhc2Uga0xpbWl0TW9kZV9Td2l0Y2hJbnB1dHNPbmx5OiAJLyoqIE9ubHkgdXNlIHN3aXRjaGVzIGZvciBsaW1pdHMgKi8KKwkJCS8qIHR1cm4gT0ZGIGJvdGggbGltaXRzLiBTUlggaGFzIGluZGl2aWR1YWwgZW5hYmxlcyBhbmQgcG9sYXJpdHkgZm9yIGVhY2ggbGltaXQgc3dpdGNoLiovCisJCQlzdGF0dXMgPSBtX2ltcGwtPlNldEZvcndhcmRTb2Z0RW5hYmxlKGZhbHNlKTsKKwkJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJfQorCQkJc3RhdHVzID0gbV9pbXBsLT5TZXRSZXZlcnNlU29mdEVuYWJsZShmYWxzZSk7CisJCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCX0KKwkJCS8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRW5hYmxlUmV2KTsKKwkJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Uga0xpbWl0TW9kZV9Tb2Z0UG9zaXRpb25MaW1pdHM6IC8qKiBVc2UgYm90aCBzd2l0Y2hlcyBhbmQgc29mdCBsaW1pdHMgKi8KKwkJCS8qIHR1cm4gb24gYm90aCBsaW1pdHMuIFNSWCBoYXMgaW5kaXZpZHVhbCBlbmFibGVzIGFuZCBwb2xhcml0eSBmb3IgZWFjaCBsaW1pdCBzd2l0Y2guKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0Rm9yd2FyZFNvZnRFbmFibGUodHJ1ZSk7CisJCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCX0KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0UmV2ZXJzZVNvZnRFbmFibGUodHJ1ZSk7CisJCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCX0KKwkJCS8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRW5hYmxlUmV2KTsKKwkJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBrTGltaXRNb2RlX1NyeERpc2FibGVTd2l0Y2hJbnB1dHM6IC8qKiBkaXNhYmxlIGJvdGggbGltaXQgc3dpdGNoZXMgYW5kIHNvZnQgbGltaXRzICovCisJCQkvKiB0dXJuIG9uIGJvdGggbGltaXRzLiBTUlggaGFzIGluZGl2aWR1YWwgZW5hYmxlcyBhbmQgcG9sYXJpdHkgZm9yIGVhY2ggbGltaXQgc3dpdGNoLiovCisJCQlzdGF0dXMgPSBtX2ltcGwtPlNldEZvcndhcmRTb2Z0RW5hYmxlKGZhbHNlKTsKKwkJCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQkJfQorCQkJc3RhdHVzID0gbV9pbXBsLT5TZXRSZXZlcnNlU29mdEVuYWJsZShmYWxzZSk7CisJCQlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCX0KKwkJCS8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKwkJCXN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9EaXNhYmxlRndkX0Rpc2FibGVSZXYpOworCQkJaWYoc3RhdHVzICE9IENUUl9PS0FZKSB7CisJCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnRm9yd2FyZExpbWl0KGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbikKK3sKKwlDVFJfQ29kZSBzdGF0dXM7CisJc3RhdHVzID0gbV9pbXBsLT5TZXRGb3J3YXJkU29mdExpbWl0KGZvcndhcmRMaW1pdFBvc2l0aW9uKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBDaGFuZ2UgdGhlIGZ3ZCBsaW1pdCBzd2l0Y2ggc2V0dGluZyB0byBub3JtYWxseSBvcGVuIG9yIGNsb3NlZC4KKyAqIFRhbG9uIHdpbGwgZGlzYWJsZSBtb21lbnRhcmlsbHkgaWYgdGhlIFRhbG9uJ3MgY3VycmVudCBzZXR0aW5nCisgKiBpcyBkaXNzaW1pbGFyIHRvIHRoZSBjYWxsZXIncyByZXF1ZXN0ZWQgc2V0dGluZy4KKyAqCisgKiBTaW5jZSBUYWxvbiBzYXZlcyBzZXR0aW5nIHRvIGZsYXNoIHRoaXMgc2hvdWxkIG9ubHkgYWZmZWN0CisgKiBhIGdpdmVuIFRhbG9uIGluaXRpYWxseSBkdXJpbmcgcm9ib3QgaW5zdGFsbC4KKyAqCisgKiBAcGFyYW0gbm9ybWFsbHlPcGVuIHRydWUgZm9yIG5vcm1hbGx5IG9wZW4uICBmYWxzZSBmb3Igbm9ybWFsbHkgY2xvc2VkLgorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdGd2RMaW1pdFN3aXRjaE5vcm1hbGx5T3Blbihib29sIG5vcm1hbGx5T3BlbikKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFBhcmFtKENhblRhbG9uU1JYOjplT25Cb290X0xpbWl0U3dpdGNoX0ZvcndhcmRfTm9ybWFsbHlDbG9zZWQsIG5vcm1hbGx5T3BlbiA/IDAgOiAxKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBDaGFuZ2UgdGhlIHJldiBsaW1pdCBzd2l0Y2ggc2V0dGluZyB0byBub3JtYWxseSBvcGVuIG9yIGNsb3NlZC4KKyAqIFRhbG9uIHdpbGwgZGlzYWJsZSBtb21lbnRhcmlsbHkgaWYgdGhlIFRhbG9uJ3MgY3VycmVudCBzZXR0aW5nCisgKiBpcyBkaXNzaW1pbGFyIHRvIHRoZSBjYWxsZXIncyByZXF1ZXN0ZWQgc2V0dGluZy4KKyAqCisgKiBTaW5jZSBUYWxvbiBzYXZlcyBzZXR0aW5nIHRvIGZsYXNoIHRoaXMgc2hvdWxkIG9ubHkgYWZmZWN0CisgKiBhIGdpdmVuIFRhbG9uIGluaXRpYWxseSBkdXJpbmcgcm9ib3QgaW5zdGFsbC4KKyAqCisgKiBAcGFyYW0gbm9ybWFsbHlPcGVuIHRydWUgZm9yIG5vcm1hbGx5IG9wZW4uICBmYWxzZSBmb3Igbm9ybWFsbHkgY2xvc2VkLgorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdSZXZMaW1pdFN3aXRjaE5vcm1hbGx5T3Blbihib29sIG5vcm1hbGx5T3BlbikKK3sKKwlDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFBhcmFtKENhblRhbG9uU1JYOjplT25Cb290X0xpbWl0U3dpdGNoX1JldmVyc2VfTm9ybWFsbHlDbG9zZWQsIG5vcm1hbGx5T3BlbiA/IDAgOiAxKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdSZXZlcnNlTGltaXQoZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKQoreworCUNUUl9Db2RlIHN0YXR1czsKKwlzdGF0dXMgPSBtX2ltcGwtPlNldFJldmVyc2VTb2Z0TGltaXQocmV2ZXJzZUxpbWl0UG9zaXRpb24pOworCWlmKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnTWF4T3V0cHV0Vm9sdGFnZShkb3VibGUgdm9sdGFnZSkKK3sKKwkvKiBTUlggZG9lcyBub3Qgc3VwcG9ydCBtYXggb3V0cHV0ICAqLworCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJNYXhPdXRwdXRWb2x0YWdlIG5vdCBzdXBwb3J0ZWQuIik7Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnRmF1bHRUaW1lKGZsb2F0IGZhdWx0VGltZSkKK3sKKwkvKiBTUlggZG9lcyBub3QgaGF2ZSBmYXVsdCB0aW1lLiAgU1JYIG1vdG9yIGRyaXZlIGlzIG9ubHkgZGlzYWJsZWQgZm9yIHNvZnQgbGltaXRzIGFuZCBsaW1pdC1zd2l0Y2ggZmF1bHRzLiAqLworCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJGYXVsdCBUaW1lIG5vdCBzdXBwb3J0ZWQuIik7Cit9CisKKy8qKgorICogRml4dXAgdGhlIHNlbmRNb2RlIHNvIFNldCgpIHNlcmlhbGl6ZXMgdGhlIGNvcnJlY3QgZGVtYW5kIHZhbHVlLgorICogQWxzbyBmaWxscyB0aGUgbW9kZVNlbGVjZXQgaW4gdGhlIGNvbnRyb2wgZnJhbWUgdG8gZGlzYWJsZWQuCisgKiBAcGFyYW0gbW9kZSBDb250cm9sIG1vZGUgdG8gdWx0aW1hdGVseSBlbnRlciBvbmNlIHVzZXIgY2FsbHMgU2V0KCkuCisgKiBAc2VlIFNldCgpCisgKi8KK3ZvaWQgQ0FOVGFsb246OkFwcGx5Q29udHJvbE1vZGUoQ0FOU3BlZWRDb250cm9sbGVyOjpDb250cm9sTW9kZSBtb2RlKQoreworICBtX2NvbnRyb2xNb2RlID0gbW9kZTsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBrUGVyY2VudFZidXM6CisgICAgICBtX3NlbmRNb2RlID0ga1Rocm90dGxlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ3VycmVudDoKKyAgICAgIG1fc2VuZE1vZGUgPSBrQ3VycmVudE1vZGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtTcGVlZDoKKyAgICAgIG1fc2VuZE1vZGUgPSBrU3BlZWRNb2RlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrUG9zaXRpb246CisgICAgICBtX3NlbmRNb2RlID0ga1Bvc2l0aW9uTW9kZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1ZvbHRhZ2U6CisgICAgICBtX3NlbmRNb2RlID0ga1ZvbHRhZ2VNb2RlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrRm9sbG93ZXI6CisgICAgICBtX3NlbmRNb2RlID0ga0ZvbGxvd2VyTW9kZTsKKyAgICAgIGJyZWFrOworICB9CisgIC8vIEtlZXAgdGhlIHRhbG9uIGRpc2FibGVkIHVudGlsIFNldCgpIGlzIGNhbGxlZC4KKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRNb2RlU2VsZWN0KChpbnQpa0Rpc2FibGVkKTsKKwlpZihzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCit2b2lkIENBTlRhbG9uOjpTZXRDb250cm9sTW9kZShDQU5TcGVlZENvbnRyb2xsZXI6OkNvbnRyb2xNb2RlIG1vZGUpCit7CisgIGlmKG1fY29udHJvbE1vZGUgPT0gbW9kZSl7CisgICAgLyogd2UgYWxyZWFkeSBhcmUgaW4gdGhpcyBtb2RlLCBkb24ndCBwZXJmb3JtIGRpc2FibGUgd29ya2Fyb3VuZCAqLworICB9ZWxzZXsKKyAgICBBcHBseUNvbnRyb2xNb2RlKG1vZGUpOworICB9Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLworQ0FOU3BlZWRDb250cm9sbGVyOjpDb250cm9sTW9kZSBDQU5UYWxvbjo6R2V0Q29udHJvbE1vZGUoKQoreworICByZXR1cm4gbV9jb250cm9sTW9kZTsKK30KKwordm9pZCBDQU5UYWxvbjo6U2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KQoreworCW1fc2FmZXR5SGVscGVyLT5TZXRFeHBpcmF0aW9uKHRpbWVvdXQpOworfQorCitmbG9hdCBDQU5UYWxvbjo6R2V0RXhwaXJhdGlvbigpCit7CisJcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7Cit9CisKK2Jvb2wgQ0FOVGFsb246OklzQWxpdmUoKQoreworCXJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNBbGl2ZSgpOworfQorCitib29sIENBTlRhbG9uOjpJc1NhZmV0eUVuYWJsZWQoKQoreworCXJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNTYWZldHlFbmFibGVkKCk7Cit9CisKK3ZvaWQgQ0FOVGFsb246OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworCW1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOworfQorCit2b2lkIENBTlRhbG9uOjpHZXREZXNjcmlwdGlvbihjaGFyICpkZXNjKQoreworCXNwcmludGYoZGVzYywgIkNBTlRhbG9uIElEICVkIiwgbV9kZXZpY2VOdW1iZXIpOworfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHN0b3BwaW5nIHRoZSBtb3RvcgorICogUGFydCBvZiB0aGUgTW90b3JTYWZldHkgaW50ZXJmYWNlCisgKgorICogQGRlcHJlY2F0ZWQgQ2FsbCBEaXNhYmxlIGluc3RlYWQuCisqLwordm9pZCBDQU5UYWxvbjo6U3RvcE1vdG9yKCkKK3sKKyAgRGlzYWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Db21wcmVzc29yLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ29tcHJlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwZWFiMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ29tcHJlc3Nvci5jcHAKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb21wcmVzc29yLmNwcAorICovCisKKyNpbmNsdWRlICJDb21wcmVzc29yLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKK3ZvaWQgQ29tcHJlc3Nvcjo6SW5pdENvbXByZXNzb3IodWludDhfdCBwY21JRCkgeworCW1fcGNtX3BvaW50ZXIgPSBpbml0aWFsaXplQ29tcHJlc3NvcihwY21JRCk7CisKKwlTZXRDbG9zZWRMb29wQ29udHJvbCh0cnVlKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvcgorICoKKyAqIFVzZXMgdGhlIGRlZmF1bHQgUENNIElEICgwKQorICovCitDb21wcmVzc29yOjpDb21wcmVzc29yKCkgeworCUluaXRDb21wcmVzc29yKEdldERlZmF1bHRTb2xlbm9pZE1vZHVsZSgpKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvcgorICoKKyAqIEBwYXJhbSBtb2R1bGUgVGhlIFBDTSBJRCB0byB1c2UgKDAtNjIpCisgKi8KK0NvbXByZXNzb3I6OkNvbXByZXNzb3IodWludDhfdCBwY21JRCkgeworCUluaXRDb21wcmVzc29yKHBjbUlEKTsKK30KKworQ29tcHJlc3Nvcjo6fkNvbXByZXNzb3IoKSB7CisKK30KKworLyoqCisgKiAgU3RhcnRzIGNsb3NlZC1sb29wIGNvbnRyb2wuIE5vdGUgdGhhdCBjbG9zZWQgbG9vcCBjb250cm9sIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAqLwordm9pZCBDb21wcmVzc29yOjpTdGFydCgpIHsKKwlTZXRDbG9zZWRMb29wQ29udHJvbCh0cnVlKTsKK30KKworLyoqCisgKiAgU3RvcHMgY2xvc2VkLWxvb3AgY29udHJvbC4gTm90ZSB0aGF0IGNsb3NlZCBsb29wIGNvbnRyb2wgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorICovCit2b2lkIENvbXByZXNzb3I6OlN0b3AoKSB7CisJU2V0Q2xvc2VkTG9vcENvbnRyb2woZmFsc2UpOworfQorCisvKioKKyAqIENoZWNrIGlmIGNvbXByZXNzb3Igb3V0cHV0IGlzIGFjdGl2ZQorICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wcmVzc29yIGlzIG9uCisgKi8KK2Jvb2wgQ29tcHJlc3Nvcjo6RW5hYmxlZCgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZTsKKworCXZhbHVlID0gZ2V0Q29tcHJlc3NvcihtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBwcmVzc3VyZSBzd2l0Y2ggaXMgdHJpZ2dlcmVkCisgKiBAcmV0dXJuIHRydWUgaWYgcHJlc3N1cmUgaXMgbG93CisgKi8KK2Jvb2wgQ29tcHJlc3Nvcjo6R2V0UHJlc3N1cmVTd2l0Y2hWYWx1ZSgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZTsKKworCXZhbHVlID0gZ2V0UHJlc3N1cmVTd2l0Y2gobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKworCisvKioKKyAqIFF1ZXJ5IGhvdyBtdWNoIGN1cnJlbnQgdGhlIGNvbXByZXNzb3IgaXMgZHJhd2luZworICogQHJldHVybiBUaGUgY3VycmVudCB0aHJvdWdoIHRoZSBjb21wcmVzc29yLCBpbiBhbXBzCisgKi8KK2Zsb2F0IENvbXByZXNzb3I6OkdldENvbXByZXNzb3JDdXJyZW50KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlmbG9hdCB2YWx1ZTsKKworCXZhbHVlID0gZ2V0Q29tcHJlc3NvckN1cnJlbnQobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKworCisvKioKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljYWxseSB0dXJuaW5nIHRoZSBjb21wcmVzc29yIG9uIHdoZW4gdGhlCisgKiBwcmVzc3VyZSBpcyBsb3cuCisgKiBAcGFyYW0gb24gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGNsb3NlZCBsb29wIGNvbnRyb2wgb2YgdGhlIGNvbXByZXNzb3IuIEZhbHNlIHRvIGRpc2FibGUuCisgKi8KK3ZvaWQgQ29tcHJlc3Nvcjo6U2V0Q2xvc2VkTG9vcENvbnRyb2woYm9vbCBvbikgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKworCXNldENsb3NlZExvb3BDb250cm9sKG1fcGNtX3BvaW50ZXIsIG9uLCAmc3RhdHVzKTsKKworCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisJfQorfQorCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcHJlc3NvciB3aWxsIGF1dG9tYXRpY2FsbHkgdHVybiBvbiB3aGVuIHRoZQorICogcHJlc3N1cmUgaXMgbG93LgorICogQHJldHVybiBUcnVlIGlmIGNsb3NlZCBsb29wIGNvbnRyb2wgb2YgdGhlIGNvbXByZXNzb3IgaXMgZW5hYmxlZC4gRmFsc2UgaWYgZGlzYWJsZWQuCisgKi8KK2Jvb2wgQ29tcHJlc3Nvcjo6R2V0Q2xvc2VkTG9vcENvbnRyb2woKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgdmFsdWU7CisKKwl2YWx1ZSA9IGdldENsb3NlZExvb3BDb250cm9sKG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBoaWdoIGN1cnJlbnQgZHJhdy4KKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBDb21wcmVzc29yIERyaXZlIGlzIAorICoJCQlkaXNhYmxlZCBkdWUgdG8gY29tcHJlc3NvciBjdXJyZW50IGJlaW5nIHRvbyBoaWdoLgorICovCitib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlOworCisJdmFsdWUgPSBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdChtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBRdWVyeSBpZiB0aGUgY29tcHJlc3NvciBvdXRwdXQgaGFzIGJlZW4gZGlzYWJsZWQgZHVlIHRvIGhpZ2ggY3VycmVudCBkcmF3IChzdGlja3kpLgorICogQSBzdGlja3kgZmF1bHQgd2lsbCBub3QgY2xlYXIgb24gZGV2aWNlIHJlYm9vdCwgaXQgbXVzdCBiZSBjbGVhcmVkIHRocm91Z2ggY29kZSBvciB0aGUgd2ViZGFzaC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldCA6IENvbXByZXNzb3IgRHJpdmUgaXMgCisgKgkJCWRpc2FibGVkIGR1ZSB0byBjb21wcmVzc29yIGN1cnJlbnQgYmVpbmcgdG9vIGhpZ2guCisgKi8KK2Jvb2wgQ29tcHJlc3Nvcjo6R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgdmFsdWU7CisKKwl2YWx1ZSA9IGdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisvKioKKyAqIFF1ZXJ5IGlmIHRoZSBjb21wcmVzc29yIG91dHB1dCBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gYSBzaG9ydCBjaXJjdWl0IChzdGlja3kpLgorICogQSBzdGlja3kgZmF1bHQgd2lsbCBub3QgY2xlYXIgb24gZGV2aWNlIHJlYm9vdCwgaXQgbXVzdCBiZSBjbGVhcmVkIHRocm91Z2ggY29kZSBvciB0aGUgd2ViZGFzaC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldCA6IENvbXByZXNzb3Igb3V0cHV0IAorICoJCQlhcHBlYXJzIHRvIGJlIHNob3J0ZWQuCisgKi8KK2Jvb2wgQ29tcHJlc3Nvcjo6R2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdCgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZTsKKworCXZhbHVlID0gZ2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdChtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBRdWVyeSBpZiB0aGUgY29tcHJlc3NvciBvdXRwdXQgaGFzIGJlZW4gZGlzYWJsZWQgZHVlIHRvIGEgc2hvcnQgY2lyY3VpdC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBDb21wcmVzc29yIG91dHB1dCAKKyAqCQkJYXBwZWFycyB0byBiZSBzaG9ydGVkLgorICovCitib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JTaG9ydGVkRmF1bHQoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgdmFsdWU7CisKKwl2YWx1ZSA9IGdldENvbXByZXNzb3JTaG9ydGVkRmF1bHQobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKy8qKgorICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGRvZXMgbm90IGFwcGVhciB0byBiZSB3aXJlZCAoc3RpY2t5KS4KKyAqIEEgc3RpY2t5IGZhdWx0IHdpbGwgbm90IGNsZWFyIG9uIGRldmljZSByZWJvb3QsIGl0IG11c3QgYmUgY2xlYXJlZCB0aHJvdWdoIGNvZGUgb3IgdGhlIHdlYmRhc2guCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQgOiBDb21wcmVzc29yIGRvZXMgbm90IAorICoJCQlhcHBlYXIgdG8gYmUgd2lyZWQsIGkuZS4gY29tcHJlc3NvciBpcworICogCQkJbm90IGRyYXdpbmcgZW5vdWdoIGN1cnJlbnQuCisgKi8KK2Jvb2wgQ29tcHJlc3Nvcjo6R2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZFN0aWNreUZhdWx0KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlOworCisJdmFsdWUgPSBnZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKy8qKgorICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGRvZXMgbm90IGFwcGVhciB0byBiZSB3aXJlZC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBDb21wcmVzc29yIGRvZXMgbm90IAorICoJCQlhcHBlYXIgdG8gYmUgd2lyZWQsIGkuZS4gY29tcHJlc3NvciBpcworICogCQkJbm90IGRyYXdpbmcgZW5vdWdoIGN1cnJlbnQuCisgKi8KK2Jvb2wgQ29tcHJlc3Nvcjo6R2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlOworCisJdmFsdWUgPSBnZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKy8qKgorICogQ2xlYXIgQUxMIHN0aWNreSBmYXVsdHMgaW5zaWRlIFBDTSB0aGF0IENvbXByZXNzb3IgaXMgd2lyZWQgdG8uCisgKgorICogSWYgYSBzdGlja3kgZmF1bHQgaXMgc2V0LCB0aGVuIGl0IHdpbGwgYmUgcGVyc2lzdGVudGx5IGNsZWFyZWQuICBDb21wcmVzc29yIGRyaXZlCisgKgkJbWF5YmUgbW9tZW50YXJpbHkgZGlzYWJsZSB3aGlsZSBmbGFncyBhcmUgYmVpbmcgY2xlYXJlZC4gQ2FyZSBzaG91bGQgYmUgCisgKgkJdGFrZW4gdG8gbm90IGNhbGwgdGhpcyB0b28gZnJlcXVlbnRseSwgb3RoZXJ3aXNlIG5vcm1hbCBjb21wcmVzc29yIAorICoJCWZ1bmN0aW9uYWxpdHkgbWF5IGJlIHByZXZlbnRlZC4KKyAqCisgKiBJZiBubyBzdGlja3kgZmF1bHRzIGFyZSBzZXQgdGhlbiB0aGlzIGNhbGwgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAqLwordm9pZCBDb21wcmVzc29yOjpDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisKKwljbGVhckFsbFBDTVN0aWNreUZhdWx0cyhtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Db250cm9sbGVyUG93ZXIuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Db250cm9sbGVyUG93ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzkyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NvbnRyb2xsZXJQb3dlci5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkNvbnRyb2xsZXJQb3dlci5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8SEFML1Bvd2VyLmhwcD4KKyNpbmNsdWRlIDxIQUwvSEFMLmhwcD4KKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKworLyoqCisgKiBHZXQgdGhlIGlucHV0IHZvbHRhZ2UgdG8gdGhlIHJvYm90IGNvbnRyb2xsZXIKKyAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgaW5wdXQgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRJbnB1dFZvbHRhZ2UoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWRvdWJsZSByZXRWYWwgPSBnZXRWaW5Wb2x0YWdlKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBpbnB1dCBjdXJyZW50IHRvIHRoZSByb2JvdCBjb250cm9sbGVyCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIGlucHV0IGN1cnJlbnQgdmFsdWUgaW4gQW1wcworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRJbnB1dEN1cnJlbnQoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWRvdWJsZSByZXRWYWwgPSBnZXRWaW5DdXJyZW50KCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSA2ViByYWlsCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDZWIHJhaWwgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRWb2x0YWdlNlYoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWRvdWJsZSByZXRWYWwgPSBnZXRVc2VyVm9sdGFnZTZWKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBvZiB0aGUgNlYgcmFpbAorICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Q3VycmVudDZWKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgcmV0VmFsID0gZ2V0VXNlckN1cnJlbnQ2Vigmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNlYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhIGNvbnRyb2xsZXIKKyAqIGJyb3dub3V0LCBhIHNob3J0IGNpcmN1aXQgb24gdGhlIHJhaWwsIG9yIGNvbnRyb2xsZXIgb3Zlci12b2x0YWdlCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDZWIHJhaWwgZW5hYmxlZCB2YWx1ZS4gVHJ1ZSBmb3IgZW5hYmxlZC4KKyAqLworYm9vbCBDb250cm9sbGVyUG93ZXI6OkdldEVuYWJsZWQ2VigpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCByZXRWYWwgPSBnZXRVc2VyQWN0aXZlNlYoJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBHZXQgdGhlIGNvdW50IG9mIHRoZSB0b3RhbCBjdXJyZW50IGZhdWx0cyBvbiB0aGUgNlYgcmFpbCBzaW5jZSB0aGUgY29udHJvbGxlciBoYXMgYm9vdGVkCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzLgorICovCitpbnQgQ29udHJvbGxlclBvd2VyOjpHZXRGYXVsdENvdW50NlYoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludCByZXRWYWwgPSBnZXRVc2VyQ3VycmVudEZhdWx0czZWKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSA1ViByYWlsCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDVWIHJhaWwgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRWb2x0YWdlNVYoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWRvdWJsZSByZXRWYWwgPSBnZXRVc2VyVm9sdGFnZTVWKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBvZiB0aGUgNVYgcmFpbAorICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Q3VycmVudDVWKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgcmV0VmFsID0gZ2V0VXNlckN1cnJlbnQ1Vigmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNVYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhIGNvbnRyb2xsZXIKKyAqIGJyb3dub3V0LCBhIHNob3J0IGNpcmN1aXQgb24gdGhlIHJhaWwsIG9yIGNvbnRyb2xsZXIgb3Zlci12b2x0YWdlCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDVWIHJhaWwgZW5hYmxlZCB2YWx1ZS4gVHJ1ZSBmb3IgZW5hYmxlZC4KKyAqLworYm9vbCBDb250cm9sbGVyUG93ZXI6OkdldEVuYWJsZWQ1VigpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCByZXRWYWwgPSBnZXRVc2VyQWN0aXZlNVYoJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBHZXQgdGhlIGNvdW50IG9mIHRoZSB0b3RhbCBjdXJyZW50IGZhdWx0cyBvbiB0aGUgNVYgcmFpbCBzaW5jZSB0aGUgY29udHJvbGxlciBoYXMgYm9vdGVkCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCisgKi8KK2ludCBDb250cm9sbGVyUG93ZXI6OkdldEZhdWx0Q291bnQ1VigpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJaW50IHJldFZhbCA9IGdldFVzZXJDdXJyZW50RmF1bHRzNVYoJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBHZXQgdGhlIHZvbHRhZ2Ugb2YgdGhlIDMuM1YgcmFpbAorICogQHJldHVybiBUaGUgY29udHJvbGxlciAzLjNWIHJhaWwgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRWb2x0YWdlM1YzKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgcmV0VmFsID0gZ2V0VXNlclZvbHRhZ2UzVjMoJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoZSAzLjNWIHJhaWwKKyAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Q3VycmVudDNWMygpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZG91YmxlIHJldFZhbCA9IGdldFVzZXJDdXJyZW50M1YzKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKworLyoqCisgKiBHZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIDMuM1YgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhIGNvbnRyb2xsZXIKKyAqIGJyb3dub3V0LCBhIHNob3J0IGNpcmN1aXQgb24gdGhlIHJhaWwsIG9yIGNvbnRyb2xsZXIgb3Zlci12b2x0YWdlCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDMuM1YgcmFpbCBlbmFibGVkIHZhbHVlLiBUcnVlIGZvciBlbmFibGVkLgorICovCitib29sIENvbnRyb2xsZXJQb3dlcjo6R2V0RW5hYmxlZDNWMygpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCByZXRWYWwgPSBnZXRVc2VyQWN0aXZlM1YzKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDMuM1YgcmFpbCBzaW5jZSB0aGUgY29udHJvbGxlciBoYXMgYm9vdGVkCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCisgKi8KK2ludCBDb250cm9sbGVyUG93ZXI6OkdldEZhdWx0Q291bnQzVjMoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludCByZXRWYWwgPSBnZXRVc2VyQ3VycmVudEZhdWx0czNWMygmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV0VmFsOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvQ291bnRlci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NvdW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NGI3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0NvdW50ZXIuY3BwCkBAIC0wLDAgKzEsNjE5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJDb3VudGVyLmgiCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlci5oIgorI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNvdW50ZXIgb2JqZWN0LgorICogVGhpcyBjcmVhdGVzIGEgQ2hpcE9iamVjdCBjb3VudGVyIGFuZCBpbml0aWFsaXplcyBzdGF0dXMgdmFyaWFibGVzIGFwcHJvcHJpYXRlbHkKKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIG1vZGUgVGhlIGNvdW50ZXIgbW9kZQorICovCit2b2lkIENvdW50ZXI6OkluaXRDb3VudGVyKE1vZGUgbW9kZSkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJbV9pbmRleCA9IDA7CisJbV9jb3VudGVyID0gaW5pdGlhbGl6ZUNvdW50ZXIobW9kZSwgJm1faW5kZXgsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJbV91cFNvdXJjZSA9IE5VTEw7CisJbV9kb3duU291cmNlID0gTlVMTDsKKwltX2FsbG9jYXRlZFVwU291cmNlID0gZmFsc2U7CisJbV9hbGxvY2F0ZWREb3duU291cmNlID0gZmFsc2U7CisKKwlTZXRNYXhQZXJpb2QoLjUpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NvdW50ZXIsIG1faW5kZXgsIG1vZGUpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNvdW50ZXIgd2hlcmUgbm8gc291cmNlcyBhcmUgc2VsZWN0ZWQuCisgKiBUaGV5IGFsbCBtdXN0IGJlIHNlbGVjdGVkIGJ5IGNhbGxpbmcgZnVuY3Rpb25zIHRvIHNwZWNpZnkgdGhlIHVwc291cmNlIGFuZCB0aGUgZG93bnNvdXJjZQorICogaW5kZXBlbmRlbnRseS4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICovCitDb3VudGVyOjpDb3VudGVyKCkgOgorCW1fdXBTb3VyY2UoTlVMTCksCisJbV9kb3duU291cmNlKE5VTEwpLAorCW1fY291bnRlcihOVUxMKQoreworCUluaXRDb3VudGVyKCk7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY291bnRlciBmcm9tIGEgRGlnaXRhbCBTb3VyY2UgKHN1Y2ggYXMgYSBEaWdpdGFsIElucHV0KS4KKyAqIFRoaXMgaXMgdXNlZCBpZiBhbiBleGlzdGluZyBkaWdpdGFsIGlucHV0IGlzIHRvIGJlIHNoYXJlZCBieSBtdWx0aXBsZSBvdGhlciBvYmplY3RzIHN1Y2gKKyAqIGFzIGVuY29kZXJzIG9yIGlmIHRoZSBEaWdpdGFsIFNvdXJjZSBpcyBub3QgYSBEaWdpdGFsIElucHV0IGNoYW5uZWwgKHN1Y2ggYXMgYW4gQW5hbG9nIFRyaWdnZXIpLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKiBAcGFyYW0gc291cmNlIEEgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgRGlnaXRhbFNvdXJjZSBvYmplY3QuIEl0IHdpbGwgYmUgc2V0IGFzIHRoZSBVcCBTb3VyY2UuCisgKi8KK0NvdW50ZXI6OkNvdW50ZXIoRGlnaXRhbFNvdXJjZSAqc291cmNlKSA6CisJbV91cFNvdXJjZShOVUxMKSwKKwltX2Rvd25Tb3VyY2UoTlVMTCksCisJbV9jb3VudGVyKE5VTEwpCit7CisJSW5pdENvdW50ZXIoKTsKKwlTZXRVcFNvdXJjZShzb3VyY2UpOworCUNsZWFyRG93blNvdXJjZSgpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNvdW50ZXIgZnJvbSBhIERpZ2l0YWwgU291cmNlIChzdWNoIGFzIGEgRGlnaXRhbCBJbnB1dCkuCisgKiBUaGlzIGlzIHVzZWQgaWYgYW4gZXhpc3RpbmcgZGlnaXRhbCBpbnB1dCBpcyB0byBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgb3RoZXIgb2JqZWN0cyBzdWNoCisgKiBhcyBlbmNvZGVycyBvciBpZiB0aGUgRGlnaXRhbCBTb3VyY2UgaXMgbm90IGEgRGlnaXRhbCBJbnB1dCBjaGFubmVsIChzdWNoIGFzIGFuIEFuYWxvZyBUcmlnZ2VyKS4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIHNvdXJjZSBBIHJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgRGlnaXRhbFNvdXJjZSBvYmplY3QuIEl0IHdpbGwgYmUgc2V0IGFzIHRoZSBVcCBTb3VyY2UuCisgKi8KK0NvdW50ZXI6OkNvdW50ZXIoRGlnaXRhbFNvdXJjZSAmc291cmNlKSA6CisJbV91cFNvdXJjZShOVUxMKSwKKwltX2Rvd25Tb3VyY2UoTlVMTCksCisJbV9jb3VudGVyKE5VTEwpCit7CisJSW5pdENvdW50ZXIoKTsKKwlTZXRVcFNvdXJjZSgmc291cmNlKTsKKwlDbGVhckRvd25Tb3VyY2UoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4KKyAqIENyZWF0ZSBhbiB1cC1Db3VudGVyIGluc3RhbmNlIGdpdmVuIGEgY2hhbm5lbC4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERJTyBjaGFubmVsIHRvIHVzZSBhcyB0aGUgdXAgc291cmNlLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUCAKKyAqLworQ291bnRlcjo6Q291bnRlcihpbnQzMl90IGNoYW5uZWwpIDoKKwltX3VwU291cmNlKE5VTEwpLAorCW1fZG93blNvdXJjZShOVUxMKSwKKwltX2NvdW50ZXIoTlVMTCkKK3sKKwlJbml0Q291bnRlcigpOworCVNldFVwU291cmNlKGNoYW5uZWwpOworCUNsZWFyRG93blNvdXJjZSgpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIENvdW50ZXIgb2JqZWN0LgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgc2ltcGxlIHVwLUNvdW50ZXIgZ2l2ZW4gYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBVc2UgdGhlIHRyaWdnZXIgc3RhdGUgb3V0cHV0IGZyb20gdGhlIGFuYWxvZyB0cmlnZ2VyLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKiBAcGFyYW0gdHJpZ2dlciBUaGUgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgQW5hbG9nVHJpZ2dlciBvYmplY3QuCisgKi8KK0NvdW50ZXI6OkNvdW50ZXIoQW5hbG9nVHJpZ2dlciAqdHJpZ2dlcikgOgorCW1fdXBTb3VyY2UoTlVMTCksCisJbV9kb3duU291cmNlKE5VTEwpLAorCW1fY291bnRlcihOVUxMKQoreworCUluaXRDb3VudGVyKCk7CisJU2V0VXBTb3VyY2UodHJpZ2dlci0+Q3JlYXRlT3V0cHV0KGtTdGF0ZSkpOworCUNsZWFyRG93blNvdXJjZSgpOworCW1fYWxsb2NhdGVkVXBTb3VyY2UgPSB0cnVlOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIENvdW50ZXIgb2JqZWN0LgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgc2ltcGxlIHVwLUNvdW50ZXIgZ2l2ZW4gYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBVc2UgdGhlIHRyaWdnZXIgc3RhdGUgb3V0cHV0IGZyb20gdGhlIGFuYWxvZyB0cmlnZ2VyLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKiBAcGFyYW0gdHJpZ2dlciBUaGUgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBBbmFsb2dUcmlnZ2VyIG9iamVjdC4KKyAqLworQ291bnRlcjo6Q291bnRlcihBbmFsb2dUcmlnZ2VyICZ0cmlnZ2VyKSA6CisJbV91cFNvdXJjZShOVUxMKSwKKwltX2Rvd25Tb3VyY2UoTlVMTCksCisJbV9jb3VudGVyKE5VTEwpCit7CisJSW5pdENvdW50ZXIoKTsKKwlTZXRVcFNvdXJjZSh0cmlnZ2VyLkNyZWF0ZU91dHB1dChrU3RhdGUpKTsKKwlDbGVhckRvd25Tb3VyY2UoKTsKKwltX2FsbG9jYXRlZFVwU291cmNlID0gdHJ1ZTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4KKyAqIENyZWF0ZXMgYSBmdWxsIHVwLWRvd24gY291bnRlciBnaXZlbiB0d28gRGlnaXRhbCBTb3VyY2VzCisgKiBAcGFyYW0gZW5jb2RpbmdUeXBlIFRoZSBxdWFkcmF0dXJlIGRlY29kaW5nIG1vZGUgKDF4IG9yIDJ4KQorICogQHBhcmFtIHVwU291cmNlIFRoZSBwb2ludGVyIHRvIHRoZSBEaWdpdGFsU291cmNlIHRvIHNldCBhcyB0aGUgdXAgc291cmNlCisgKiBAcGFyYW0gZG93blNvdXJjZSBUaGUgcG9pbnRlciB0byB0aGUgRGlnaXRhbFNvdXJjZSB0byBzZXQgYXMgdGhlIGRvd24gc291cmNlCisgKiBAcGFyYW0gaW52ZXJ0ZWQgVHJ1ZSB0byBpbnZlcnQgdGhlIG91dHB1dCAocmV2ZXJzZSB0aGUgZGlyZWN0aW9uKQorICovCisJCitDb3VudGVyOjpDb3VudGVyKEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUsIERpZ2l0YWxTb3VyY2UgKnVwU291cmNlLCBEaWdpdGFsU291cmNlICpkb3duU291cmNlLCBib29sIGludmVydGVkKSA6CisJbV91cFNvdXJjZShOVUxMKSwKKwltX2Rvd25Tb3VyY2UoTlVMTCksCisJbV9jb3VudGVyKE5VTEwpCit7CisJaWYgKGVuY29kaW5nVHlwZSAhPSBrMVggJiYgZW5jb2RpbmdUeXBlICE9IGsyWCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJDb3VudGVyIG9ubHkgc3VwcG9ydHMgMVggYW5kIDJYIHF1YWRyYXR1cmUgZGVjb2RpbmcuIik7CisJCXJldHVybjsKKwl9CisJSW5pdENvdW50ZXIoa0V4dGVybmFsRGlyZWN0aW9uKTsKKwlTZXRVcFNvdXJjZSh1cFNvdXJjZSk7CisJU2V0RG93blNvdXJjZShkb3duU291cmNlKTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisKKwlpZiAoZW5jb2RpbmdUeXBlID09IGsxWCkKKwl7CisJCVNldFVwU291cmNlRWRnZSh0cnVlLCBmYWxzZSk7CisJCXNldENvdW50ZXJBdmVyYWdlU2l6ZShtX2NvdW50ZXIsIDEsICZzdGF0dXMpOworCX0KKwllbHNlCisJeworCQlTZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgdHJ1ZSk7CisJCXNldENvdW50ZXJBdmVyYWdlU2l6ZShtX2NvdW50ZXIsIDIsICZzdGF0dXMpOworCX0KKworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCVNldERvd25Tb3VyY2VFZGdlKGludmVydGVkLCB0cnVlKTsKK30KKworLyoqCisgKiBEZWxldGUgdGhlIENvdW50ZXIgb2JqZWN0LgorICovCitDb3VudGVyOjp+Q291bnRlcigpCit7CisJU2V0VXBkYXRlV2hlbkVtcHR5KHRydWUpOworCWlmIChtX2FsbG9jYXRlZFVwU291cmNlKQorCXsKKwkJZGVsZXRlIG1fdXBTb3VyY2U7CisJCW1fdXBTb3VyY2UgPSBOVUxMOworCX0KKwlpZiAobV9hbGxvY2F0ZWREb3duU291cmNlKQorCXsKKwkJZGVsZXRlIG1fZG93blNvdXJjZTsKKwkJbV9kb3duU291cmNlID0gTlVMTDsKKwl9CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZnJlZUNvdW50ZXIobV9jb3VudGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwltX2NvdW50ZXIgPSBOVUxMOworfQorCisvKioKKyAqIFNldCB0aGUgdXBzb3VyY2UgZm9yIHRoZSBjb3VudGVyIGFzIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERJTyBjaGFubmVsIHRvIHVzZSBhcyB0aGUgdXAgc291cmNlLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUCAKKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcFNvdXJjZShpbnQzMl90IGNoYW5uZWwpCit7CisgICAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICAgIFNldFVwU291cmNlKG5ldyBEaWdpdGFsSW5wdXQoY2hhbm5lbCkpOworICAgIG1fYWxsb2NhdGVkVXBTb3VyY2UgPSB0cnVlOworfQorCisvKioKKyAqIFNldCB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIGJlIGFuIGFuYWxvZyB0cmlnZ2VyLgorICogQHBhcmFtIGFuYWxvZ1RyaWdnZXIgVGhlIGFuYWxvZyB0cmlnZ2VyIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBVcCBTb3VyY2UKKyAqIEBwYXJhbSB0cmlnZ2VyVHlwZSBUaGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0IHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBjb3VudGVyLgorICovCit2b2lkIENvdW50ZXI6OlNldFVwU291cmNlKEFuYWxvZ1RyaWdnZXIgKmFuYWxvZ1RyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlTZXRVcFNvdXJjZShhbmFsb2dUcmlnZ2VyLT5DcmVhdGVPdXRwdXQodHJpZ2dlclR5cGUpKTsKKwltX2FsbG9jYXRlZFVwU291cmNlID0gdHJ1ZTsKK30KKworLyoqCisgKiBTZXQgdGhlIHVwIGNvdW50aW5nIHNvdXJjZSB0byBiZSBhbiBhbmFsb2cgdHJpZ2dlci4KKyAqIEBwYXJhbSBhbmFsb2dUcmlnZ2VyIFRoZSBhbmFsb2cgdHJpZ2dlciBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgVXAgU291cmNlCisgKiBAcGFyYW0gdHJpZ2dlclR5cGUgVGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgY291bnRlci4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcFNvdXJjZShBbmFsb2dUcmlnZ2VyICZhbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSkKK3sKKwlTZXRVcFNvdXJjZSgmYW5hbG9nVHJpZ2dlciwgdHJpZ2dlclR5cGUpOworfQorCisvKioKKyAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCB1cC4KKyAqIFNldCB0aGUgdXAgY291bnRpbmcgRGlnaXRhbFNvdXJjZS4KKyAqIEBwYXJhbSBzb3VyY2UgUG9pbnRlciB0byB0aGUgRGlnaXRhbFNvdXJjZSBvYmplY3QgdG8gc2V0IGFzIHRoZSB1cCBzb3VyY2UKKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcFNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX2FsbG9jYXRlZFVwU291cmNlKQorCXsKKwkJZGVsZXRlIG1fdXBTb3VyY2U7CisJCW1fdXBTb3VyY2UgPSBOVUxMOworCQltX2FsbG9jYXRlZFVwU291cmNlID0gZmFsc2U7CisJfQorCW1fdXBTb3VyY2UgPSBzb3VyY2U7CisJaWYgKG1fdXBTb3VyY2UtPlN0YXR1c0lzRmF0YWwoKSkKKwl7CisJCUNsb25lRXJyb3IobV91cFNvdXJjZSk7CisJfQorCWVsc2UKKwl7CisJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJc2V0Q291bnRlclVwU291cmNlKG1fY291bnRlciwgc291cmNlLT5HZXRDaGFubmVsRm9yUm91dGluZygpLAorCQkgICAgICAgICAgICAgICAgICAgc291cmNlLT5HZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCB1cC4KKyAqIFNldCB0aGUgdXAgY291bnRpbmcgRGlnaXRhbFNvdXJjZS4KKyAqIEBwYXJhbSBzb3VyY2UgUmVmZXJlbmNlIHRvIHRoZSBEaWdpdGFsU291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIHVwIHNvdXJjZQorICovCit2b2lkIENvdW50ZXI6OlNldFVwU291cmNlKERpZ2l0YWxTb3VyY2UgJnNvdXJjZSkKK3sKKwlTZXRVcFNvdXJjZSgmc291cmNlKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGVkZ2Ugc2Vuc2l0aXZpdHkgb24gYW4gdXAgY291bnRpbmcgc291cmNlLgorICogU2V0IHRoZSB1cCBzb3VyY2UgdG8gZWl0aGVyIGRldGVjdCByaXNpbmcgZWRnZXMgb3IgZmFsbGluZyBlZGdlcyBvciBib3RoLgorICogQHBhcmFtIHJpc2luZ0VkZ2UgVHJ1ZSB0byB0cmlnZ2VyIG9uIHJpc2luZyBlZGdlcworICogQHBhcmFtIGZhbGxpbmdFZGdlIFRydWUgdG8gdHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2VzCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKG1fdXBTb3VyY2UgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJNdXN0IHNldCBub24tTlVMTCBVcFNvdXJjZSBiZWZvcmUgc2V0dGluZyBVcFNvdXJjZUVkZ2UiKTsKKwl9CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldENvdW50ZXJVcFNvdXJjZUVkZ2UobV9jb3VudGVyLCByaXNpbmdFZGdlLCBmYWxsaW5nRWRnZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRGlzYWJsZSB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIHRoZSBjb3VudGVyLgorICovCit2b2lkIENvdW50ZXI6OkNsZWFyVXBTb3VyY2UoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpZiAobV9hbGxvY2F0ZWRVcFNvdXJjZSkKKwl7CisJCWRlbGV0ZSBtX3VwU291cmNlOworCQltX3VwU291cmNlID0gTlVMTDsKKwkJbV9hbGxvY2F0ZWRVcFNvdXJjZSA9IGZhbHNlOworCX0KKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJY2xlYXJDb3VudGVyVXBTb3VyY2UobV9jb3VudGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGRvd24gY291bnRpbmcgc291cmNlIHRvIGJlIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERJTyBjaGFubmVsIHRvIHVzZSBhcyB0aGUgdXAgc291cmNlLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUCAKKyAqLwordm9pZCBDb3VudGVyOjpTZXREb3duU291cmNlKGludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJU2V0RG93blNvdXJjZShuZXcgRGlnaXRhbElucHV0KGNoYW5uZWwpKTsKKwltX2FsbG9jYXRlZERvd25Tb3VyY2UgPSB0cnVlOworfQorCisvKioKKyAqIFNldCB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gYmUgYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBAcGFyYW0gYW5hbG9nVHJpZ2dlciBUaGUgYW5hbG9nIHRyaWdnZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIERvd24gU291cmNlCisgKiBAcGFyYW0gdHJpZ2dlclR5cGUgVGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgY291bnRlci4KKyAqLwordm9pZCBDb3VudGVyOjpTZXREb3duU291cmNlKEFuYWxvZ1RyaWdnZXIgKmFuYWxvZ1RyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlTZXREb3duU291cmNlKGFuYWxvZ1RyaWdnZXItPkNyZWF0ZU91dHB1dCh0cmlnZ2VyVHlwZSkpOworCW1fYWxsb2NhdGVkRG93blNvdXJjZSA9IHRydWU7Cit9CisKKy8qKgorICogU2V0IHRoZSBkb3duIGNvdW50aW5nIHNvdXJjZSB0byBiZSBhbiBhbmFsb2cgdHJpZ2dlci4KKyAqIEBwYXJhbSBhbmFsb2dUcmlnZ2VyIFRoZSBhbmFsb2cgdHJpZ2dlciBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgRG93biBTb3VyY2UKKyAqIEBwYXJhbSB0cmlnZ2VyVHlwZSBUaGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0IHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBjb3VudGVyLgorICovCit2b2lkIENvdW50ZXI6OlNldERvd25Tb3VyY2UoQW5hbG9nVHJpZ2dlciAmYW5hbG9nVHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpCit7CisJU2V0RG93blNvdXJjZSgmYW5hbG9nVHJpZ2dlciwgdHJpZ2dlclR5cGUpOworfQorCisvKioKKyAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCBkb3duLgorICogU2V0IHRoZSBkb3duIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCisgKiBAcGFyYW0gc291cmNlIFBvaW50ZXIgdG8gdGhlIERpZ2l0YWxTb3VyY2Ugb2JqZWN0IHRvIHNldCBhcyB0aGUgZG93biBzb3VyY2UKKyAqLwordm9pZCBDb3VudGVyOjpTZXREb3duU291cmNlKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKG1fYWxsb2NhdGVkRG93blNvdXJjZSkKKwl7CisJCWRlbGV0ZSBtX2Rvd25Tb3VyY2U7CisJCW1fZG93blNvdXJjZSA9IE5VTEw7CisJCW1fYWxsb2NhdGVkRG93blNvdXJjZSA9IGZhbHNlOworCX0KKwltX2Rvd25Tb3VyY2UgPSBzb3VyY2U7CisJaWYgKG1fZG93blNvdXJjZS0+U3RhdHVzSXNGYXRhbCgpKQorCXsKKwkJQ2xvbmVFcnJvcihtX2Rvd25Tb3VyY2UpOworCX0KKwllbHNlCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCXNldENvdW50ZXJEb3duU291cmNlKG1fY291bnRlciwgc291cmNlLT5HZXRDaGFubmVsRm9yUm91dGluZygpLAorCQkgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCksICZzdGF0dXMpOworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IHRoYXQgY2F1c2VzIHRoZSBjb3VudGVyIHRvIGNvdW50IGRvd24uCisgKiBTZXQgdGhlIGRvd24gY291bnRpbmcgRGlnaXRhbFNvdXJjZS4KKyAqIEBwYXJhbSBzb3VyY2UgUmVmZXJlbmNlIHRvIHRoZSBEaWdpdGFsU291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIGRvd24gc291cmNlCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlICZzb3VyY2UpCit7CisJU2V0RG93blNvdXJjZSgmc291cmNlKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGVkZ2Ugc2Vuc2l0aXZpdHkgb24gYSBkb3duIGNvdW50aW5nIHNvdXJjZS4KKyAqIFNldCB0aGUgZG93biBzb3VyY2UgdG8gZWl0aGVyIGRldGVjdCByaXNpbmcgZWRnZXMgb3IgZmFsbGluZyBlZGdlcy4KKyAqIEBwYXJhbSByaXNpbmdFZGdlIFRydWUgdG8gdHJpZ2dlciBvbiByaXNpbmcgZWRnZXMKKyAqIEBwYXJhbSBmYWxsaW5nRWRnZSBUcnVlIHRvIHRyaWdnZXIgb24gZmFsbGluZyBlZGdlcworICovCit2b2lkIENvdW50ZXI6OlNldERvd25Tb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKG1fZG93blNvdXJjZSA9PSBOVUxMKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgIk11c3Qgc2V0IG5vbi1OVUxMIERvd25Tb3VyY2UgYmVmb3JlIHNldHRpbmcgRG93blNvdXJjZUVkZ2UiKTsKKwl9CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldENvdW50ZXJEb3duU291cmNlRWRnZShtX2NvdW50ZXIsIHJpc2luZ0VkZ2UsIGZhbGxpbmdFZGdlLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBEaXNhYmxlIHRoZSBkb3duIGNvdW50aW5nIHNvdXJjZSB0byB0aGUgY291bnRlci4KKyAqLwordm9pZCBDb3VudGVyOjpDbGVhckRvd25Tb3VyY2UoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpZiAobV9hbGxvY2F0ZWREb3duU291cmNlKQorCXsKKwkJZGVsZXRlIG1fZG93blNvdXJjZTsKKwkJbV9kb3duU291cmNlID0gTlVMTDsKKwkJbV9hbGxvY2F0ZWREb3duU291cmNlID0gZmFsc2U7CisJfQorCWludDMyX3Qgc3RhdHVzID0gMDsKKwljbGVhckNvdW50ZXJEb3duU291cmNlKG1fY291bnRlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHN0YW5kYXJkIHVwIC8gZG93biBjb3VudGluZyBtb2RlIG9uIHRoaXMgY291bnRlci4KKyAqIFVwIGFuZCBkb3duIGNvdW50cyBhcmUgc291cmNlZCBpbmRlcGVuZGVudGx5IGZyb20gdHdvIGlucHV0cy4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcERvd25Db3VudGVyTW9kZSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRDb3VudGVyVXBEb3duTW9kZShtX2NvdW50ZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCBleHRlcm5hbCBkaXJlY3Rpb24gbW9kZSBvbiB0aGlzIGNvdW50ZXIuCisgKiBDb3VudHMgYXJlIHNvdXJjZWQgb24gdGhlIFVwIGNvdW50ZXIgaW5wdXQuCisgKiBUaGUgRG93biBjb3VudGVyIGlucHV0IHJlcHJlc2VudHMgdGhlIGRpcmVjdGlvbiB0byBjb3VudC4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRFeHRlcm5hbERpcmVjdGlvbk1vZGUoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0Q291bnRlckV4dGVybmFsRGlyZWN0aW9uTW9kZShtX2NvdW50ZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCBTZW1pLXBlcmlvZCBtb2RlIG9uIHRoaXMgY291bnRlci4KKyAqIENvdW50cyB1cCBvbiBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcy4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRTZW1pUGVyaW9kTW9kZShib29sIGhpZ2hTZW1pUGVyaW9kKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0Q291bnRlclNlbWlQZXJpb2RNb2RlKG1fY291bnRlciwgaGlnaFNlbWlQZXJpb2QsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgY291bnRlciB0byBjb3VudCBpbiB1cCBvciBkb3duIGJhc2VkIG9uIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHB1bHNlLgorICogVGhpcyBtb2RlIGlzIG1vc3QgdXNlZnVsIGZvciBkaXJlY3Rpb24gc2Vuc2l0aXZlIGdlYXIgdG9vdGggc2Vuc29ycy4KKyAqIEBwYXJhbSB0aHJlc2hvbGQgVGhlIHB1bHNlIGxlbmd0aCBiZXlvbmQgd2hpY2ggdGhlIGNvdW50ZXIgY291bnRzIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uICBVbml0cyBhcmUgc2Vjb25kcy4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRQdWxzZUxlbmd0aE1vZGUoZmxvYXQgdGhyZXNob2xkKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0Q291bnRlclB1bHNlTGVuZ3RoTW9kZShtX2NvdW50ZXIsIHRocmVzaG9sZCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKworLyoqCisgKiBHZXQgdGhlIFNhbXBsZXMgdG8gQXZlcmFnZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9mIHRoZSB0aW1lciB0bworICogYXZlcmFnZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBwZXJpb2QuIFBlcmZvcm0gYXZlcmFnaW5nIHRvIGFjY291bnQgZm9yCisgKiBtZWNoYW5pY2FsIGltcGVyZmVjdGlvbnMgb3IgYXMgb3ZlcnNhbXBsaW5nIHRvIGluY3JlYXNlIHJlc29sdXRpb24uCisgKiBAcmV0dXJuIFNhbXBsZXNUb0F2ZXJhZ2UgVGhlIG51bWJlciBvZiBzYW1wbGVzIGJlaW5nIGF2ZXJhZ2VkIChmcm9tIDEgdG8gMTI3KQorICovCitpbnQgQ291bnRlcjo6R2V0U2FtcGxlc1RvQXZlcmFnZSgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludDMyX3Qgc2FtcGxlcyA9IGdldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKG1fY291bnRlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHNhbXBsZXM7Cit9CisKKy8qKgorICogU2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHBhcmFtIHNhbXBsZXNUb0F2ZXJhZ2UgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGF2ZXJhZ2UgZnJvbSAxIHRvIDEyNy4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRTYW1wbGVzVG9BdmVyYWdlIChpbnQgc2FtcGxlc1RvQXZlcmFnZSkgeworCWlmIChzYW1wbGVzVG9BdmVyYWdlIDwgMSB8fCBzYW1wbGVzVG9BdmVyYWdlID4gMTI3KQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgIkF2ZXJhZ2UgY291bnRlciB2YWx1ZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyNyIpOworCX0KKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UobV9jb3VudGVyLCBzYW1wbGVzVG9BdmVyYWdlLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBSZWFkIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUuCisgKiBSZWFkIHRoZSB2YWx1ZSBhdCB0aGlzIGluc3RhbnQuIEl0IG1heSBzdGlsbCBiZSBydW5uaW5nLCBzbyBpdCByZWZsZWN0cyB0aGUgY3VycmVudCB2YWx1ZS4gTmV4dAorICogdGltZSBpdCBpcyByZWFkLCBpdCBtaWdodCBoYXZlIGEgZGlmZmVyZW50IHZhbHVlLgorICovCitpbnQzMl90IENvdW50ZXI6OkdldCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWludDMyX3QgdmFsdWUgPSBnZXRDb3VudGVyKG1fY291bnRlciwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFJlc2V0IHRoZSBDb3VudGVyIHRvIHplcm8uCisgKiBTZXQgdGhlIGNvdW50ZXIgdmFsdWUgdG8gemVyby4gVGhpcyBkb2Vzbid0IGVmZmVjdCB0aGUgcnVubmluZyBzdGF0ZSBvZiB0aGUgY291bnRlciwganVzdCBzZXRzCisgKiB0aGUgY3VycmVudCB2YWx1ZSB0byB6ZXJvLgorICovCit2b2lkIENvdW50ZXI6OlJlc2V0KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXJlc2V0Q291bnRlcihtX2NvdW50ZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgUGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBjb3VudC4KKyAqIFJldHVybnMgdGhlIHRpbWUgaW50ZXJ2YWwgb2YgdGhlIG1vc3QgcmVjZW50IGNvdW50LiBUaGlzIGNhbiBiZSB1c2VkIGZvciB2ZWxvY2l0eSBjYWxjdWxhdGlvbnMKKyAqIHRvIGRldGVybWluZSBzaGFmdCBzcGVlZC4KKyAqIEByZXR1cm5zIFRoZSBwZXJpb2QgYmV0d2VlbiB0aGUgbGFzdCB0d28gcHVsc2VzIGluIHVuaXRzIG9mIHNlY29uZHMuCisgKi8KK2RvdWJsZSBDb3VudGVyOjpHZXRQZXJpb2QoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWRvdWJsZSB2YWx1ZSA9IGdldENvdW50ZXJQZXJpb2QobV9jb3VudGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogU2V0IHRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgZGV2aWNlIGlzIHN0aWxsIGNvbnNpZGVyZWQgIm1vdmluZyIuCisgKiBTZXRzIHRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgZGV2aWNlIGlzIGNvbnNpZGVyZWQgbW92aW5nLiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisgKiB0aGUgInN0b3BwZWQiIHN0YXRlIG9mIHRoZSBjb3VudGVyIHVzaW5nIHRoZSBHZXRTdG9wcGVkIG1ldGhvZC4KKyAqIEBwYXJhbSBtYXhQZXJpb2QgVGhlIG1heGltdW0gcGVyaW9kIHdoZXJlIHRoZSBjb3VudGVkIGRldmljZSBpcyBjb25zaWRlcmVkIG1vdmluZyBpbgorICogc2Vjb25kcy4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldENvdW50ZXJNYXhQZXJpb2QobV9jb3VudGVyLCBtYXhQZXJpb2QsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNlbGVjdCB3aGV0aGVyIHlvdSB3YW50IHRvIGNvbnRpbnVlIHVwZGF0aW5nIHRoZSBldmVudCB0aW1lciBvdXRwdXQgd2hlbiB0aGVyZSBhcmUgbm8gc2FtcGxlcyBjYXB0dXJlZC4KKyAqIFRoZSBvdXRwdXQgb2YgdGhlIGV2ZW50IHRpbWVyIGhhcyBhIGJ1ZmZlciBvZiBwZXJpb2RzIHRoYXQgYXJlIGF2ZXJhZ2VkIGFuZCBwb3N0ZWQgdG8KKyAqIGEgcmVnaXN0ZXIgb24gdGhlIEZQR0EuICBXaGVuIHRoZSB0aW1lciBkZXRlY3RzIHRoYXQgdGhlIGV2ZW50IHNvdXJjZSBoYXMgc3RvcHBlZAorICogKGJhc2VkIG9uIHRoZSBNYXhQZXJpb2QpIHRoZSBidWZmZXIgb2Ygc2FtcGxlcyB0byBiZSBhdmVyYWdlZCBpcyBlbXB0aWVkLiAgSWYgeW91CisgKiBlbmFibGUgdGhlIHVwZGF0ZSB3aGVuIGVtcHR5LCB5b3Ugd2lsbCBiZSBub3RpZmllZCBvZiB0aGUgc3RvcHBlZCBzb3VyY2UgYW5kIHRoZSBldmVudAorICogdGltZSB3aWxsIHJlcG9ydCAwIHNhbXBsZXMuICBJZiB5b3UgZGlzYWJsZSB1cGRhdGUgd2hlbiBlbXB0eSwgdGhlIG1vc3QgcmVjZW50IGF2ZXJhZ2UKKyAqIHdpbGwgcmVtYWluIG9uIHRoZSBvdXRwdXQgdW50aWwgYSBuZXcgc2FtcGxlIGlzIGFjcXVpcmVkLiAgWW91IHdpbGwgbmV2ZXIgc2VlIDAgc2FtcGxlcworICogb3V0cHV0IChleGNlcHQgd2hlbiB0aGVyZSBoYXZlIGJlZW4gbm8gZXZlbnRzIHNpbmNlIGFuIEZQR0EgcmVzZXQpIGFuZCB5b3Ugd2lsbCBsaWtlbHkgbm90CisgKiBzZWUgdGhlIHN0b3BwZWQgYml0IGJlY29tZSB0cnVlIChzaW5jZSBpdCBpcyB1cGRhdGVkIGF0IHRoZSBlbmQgb2YgYW4gYXZlcmFnZSBhbmQgdGhlcmUgYXJlCisgKiBubyBzYW1wbGVzIHRvIGF2ZXJhZ2UpLgorICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSB0byBlbmFibGUgdXBkYXRlIHdoZW4gZW1wdHkKKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcGRhdGVXaGVuRW1wdHkoYm9vbCBlbmFibGVkKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0Q291bnRlclVwZGF0ZVdoZW5FbXB0eShtX2NvdW50ZXIsIGVuYWJsZWQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgY2xvY2sgaXMgc3RvcHBlZC4KKyAqIERldGVybWluZSBpZiB0aGUgY2xvY2tlZCBpbnB1dCBpcyBzdG9wcGVkIGJhc2VkIG9uIHRoZSBNYXhQZXJpb2QgdmFsdWUgc2V0IHVzaW5nIHRoZQorICogU2V0TWF4UGVyaW9kIG1ldGhvZC4gSWYgdGhlIGNsb2NrIGV4Y2VlZHMgdGhlIE1heFBlcmlvZCwgdGhlbiB0aGUgZGV2aWNlIChhbmQgY291bnRlcikgYXJlCisgKiBhc3N1bWVkIHRvIGJlIHN0b3BwZWQgYW5kIGl0IHJldHVybnMgdHJ1ZS4KKyAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBtb3N0IHJlY2VudCBjb3VudGVyIHBlcmlvZCBleGNlZWRzIHRoZSBNYXhQZXJpb2QgdmFsdWUgc2V0IGJ5CisgKiBTZXRNYXhQZXJpb2QuCisgKi8KK2Jvb2wgQ291bnRlcjo6R2V0U3RvcHBlZCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlID0gZ2V0Q291bnRlclN0b3BwZWQobV9jb3VudGVyLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBjb3VudGVyIHZhbHVlIGNoYW5nZWQuCisgKiBAcmV0dXJuIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgY291bnRlciB2YWx1ZSBjaGFuZ2VkLgorICovCitib29sIENvdW50ZXI6OkdldERpcmVjdGlvbigpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlID0gZ2V0Q291bnRlckRpcmVjdGlvbihtX2NvdW50ZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBTZXQgdGhlIENvdW50ZXIgdG8gcmV0dXJuIHJldmVyc2VkIHNlbnNpbmcgb24gdGhlIGRpcmVjdGlvbi4KKyAqIFRoaXMgYWxsb3dzIGNvdW50ZXJzIHRvIGNoYW5nZSB0aGUgZGlyZWN0aW9uIHRoZXkgYXJlIGNvdW50aW5nIGluIHRoZSBjYXNlIG9mIDFYIGFuZCAyWAorICogcXVhZHJhdHVyZSBlbmNvZGluZyBvbmx5LiBBbnkgb3RoZXIgY291bnRlciBtb2RlIGlzbid0IHN1cHBvcnRlZC4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHRydWUgaWYgdGhlIHZhbHVlIGNvdW50ZWQgc2hvdWxkIGJlIG5lZ2F0ZWQuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzZXRDb3VudGVyUmV2ZXJzZURpcmVjdGlvbihtX2NvdW50ZXIsIHJldmVyc2VEaXJlY3Rpb24sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9EaWdpdGFsSW5wdXQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9EaWdpdGFsSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZThlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0RpZ2l0YWxJbnB1dC5jcHAKQEAgLTAsMCArMSwyMjcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnJheT4KKworI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkVuY29kZXIuaCIKKyNpbmNsdWRlICJDb3VudGVyLmgiCisKKzo6c3RkOjphcnJheTxpbnQsIDM+IERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OmZpbHRlcl9hbGxvY2F0ZWRfID0geworICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlfX07CitNdXRleCBEaWdpdGFsR2xpdGNoRmlsdGVyOjptdXRleF87CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgRGlnaXRhbElucHV0LgorICogQ3JlYXRlcyBhIGRpZ2l0YWwgaW5wdXQgZ2l2ZW4gYSBjaGFubmVsLiBDb21tb24gY3JlYXRpb24gcm91dGluZSBmb3IgYWxsCisgKiBjb25zdHJ1Y3RvcnMuCisgKi8KK3ZvaWQgRGlnaXRhbElucHV0OjpJbml0RGlnaXRhbElucHV0KHVpbnQzMl90IGNoYW5uZWwpCit7CisJY2hhciBidWZbNjRdOworCisJaWYgKCFDaGVja0RpZ2l0YWxDaGFubmVsKGNoYW5uZWwpKQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIkRpZ2l0YWwgQ2hhbm5lbCAlZCIsIGNoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCW1fY2hhbm5lbCA9IGNoYW5uZWw7CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYWxsb2NhdGVESU8obV9kaWdpdGFsX3BvcnRzW2NoYW5uZWxdLCB0cnVlLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsSW5wdXQsIGNoYW5uZWwpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIERpZ2l0YWwgSW5wdXQgY2xhc3MuCisgKiBDcmVhdGVzIGEgZGlnaXRhbCBpbnB1dCBnaXZlbiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERJTyBjaGFubmVsIDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworRGlnaXRhbElucHV0OjpEaWdpdGFsSW5wdXQodWludDMyX3QgY2hhbm5lbCkKK3sKKwlJbml0RGlnaXRhbElucHV0KGNoYW5uZWwpOworfQorCisvKioKKyAqIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRGlnaXRhbCBJbnB1dCBjbGFzcy4KKyAqLworRGlnaXRhbElucHV0Ojp+RGlnaXRhbElucHV0KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJaWYgKG1faW50ZXJydXB0ICE9IE5VTEwpCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCWNsZWFuSW50ZXJydXB0cyhtX2ludGVycnVwdCwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQltX2ludGVycnVwdCA9IE5VTEw7CisJCW1faW50ZXJydXB0cy0+RnJlZShtX2ludGVycnVwdEluZGV4KTsKKwl9CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZnJlZURJTyhtX2RpZ2l0YWxfcG9ydHNbbV9jaGFubmVsXSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSB2YWx1ZSBmcm9tIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogUmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbCBmcm9tIHRoZSBGUEdBLgorICovCitib29sIERpZ2l0YWxJbnB1dDo6R2V0KCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCB2YWx1ZSA9IGdldERJTyhtX2RpZ2l0YWxfcG9ydHNbbV9jaGFubmVsXSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIEdQSU8gY2hhbm5lbCBudW1iZXIgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgorICovCit1aW50MzJfdCBEaWdpdGFsSW5wdXQ6OkdldENoYW5uZWwoKQoreworCXJldHVybiBtX2NoYW5uZWw7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgY2hhbm5lbCBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCit1aW50MzJfdCBEaWdpdGFsSW5wdXQ6OkdldENoYW5uZWxGb3JSb3V0aW5nKCkKK3sKKwlyZXR1cm4gR2V0Q2hhbm5lbCgpOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG1vZHVsZSBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCit1aW50MzJfdCBEaWdpdGFsSW5wdXQ6OkdldE1vZHVsZUZvclJvdXRpbmcoKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGFuYWxvZyB0cmlnZ2VyIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK2Jvb2wgRGlnaXRhbElucHV0OjpHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitEaWdpdGFsR2xpdGNoRmlsdGVyOjpEaWdpdGFsR2xpdGNoRmlsdGVyKCkgOiBjaGFubmVsX2luZGV4XygtMSkgeworICA6OnN0ZDo6dW5pcXVlX2xvY2s8TXV0ZXg+IHN5bmMoRGlnaXRhbEdsaXRjaEZpbHRlcjo6bXV0ZXhfKTsKKyAgYXV0byBpbmRleCA9CisgICAgICA6OnN0ZDo6ZmluZChmaWx0ZXJfYWxsb2NhdGVkXy5iZWdpbigpLCBmaWx0ZXJfYWxsb2NhdGVkXy5lbmQoKSwgZmFsc2UpOworICBpZiAoaW5kZXggIT0gZmlsdGVyX2FsbG9jYXRlZF8uZW5kKCkpIHsKKyAgICBjaGFubmVsX2luZGV4XyA9IGluZGV4IC0gZmlsdGVyX2FsbG9jYXRlZF8uYmVnaW4oKTsKKyAgICAqaW5kZXggPSB0cnVlOworICB9Cit9CisKK0RpZ2l0YWxHbGl0Y2hGaWx0ZXI6On5EaWdpdGFsR2xpdGNoRmlsdGVyKCkgeworICA6OnN0ZDo6dW5pcXVlX2xvY2s8TXV0ZXg+IHN5bmMoRGlnaXRhbEdsaXRjaEZpbHRlcjo6bXV0ZXhfKTsKKyAgZmlsdGVyX2FsbG9jYXRlZF9bY2hhbm5lbF9pbmRleF9dID0gZmFsc2U7Cit9CisKK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6QWRkKERpZ2l0YWxTb3VyY2UgKmlucHV0KSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0RmlsdGVyU2VsZWN0KGlucHV0LT5tX2RpZ2l0YWxfcG9ydHNbaW5wdXQtPkdldENoYW5uZWxGb3JSb3V0aW5nKCldLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbF9pbmRleF8gKyAxLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxJbnB1dCwKKyAgICAgICAgICAgIGlucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpKTsKK30KKwordm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpSZW1vdmUoRGlnaXRhbFNvdXJjZSAqaW5wdXQpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0RmlsdGVyU2VsZWN0KGlucHV0LT5tX2RpZ2l0YWxfcG9ydHNbaW5wdXQtPkdldENoYW5uZWxGb3JSb3V0aW5nKCldLCAwLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsSW5wdXQsIGlucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpKTsKK30KKwordm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpTZXRQZXJpb2RDeWNsZXModWludDMyX3QgZnBnYV9jeWNsZXMpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXRGaWx0ZXJQZXJpb2QoY2hhbm5lbF9pbmRleF8sIGZwZ2FfY3ljbGVzLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxHbGl0Y2hGaWx0ZXIsCisgICAgICAgICAgICBjaGFubmVsX2luZGV4Xyk7Cit9CisKK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6U2V0UGVyaW9kTmFub1NlY29uZHModWludDY0X3QgbmFub3NlY29uZHMpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICB1aW50MzJfdCBmcGdhX2N5Y2xlcyA9CisgICAgICBuYW5vc2Vjb25kcyAqIGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQgLyA0IC8gMTAwMDsKKyAgc2V0RmlsdGVyUGVyaW9kKGNoYW5uZWxfaW5kZXhfLCBmcGdhX2N5Y2xlcywgJnN0YXR1cyk7CisKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxHbGl0Y2hGaWx0ZXIsCisgICAgICAgICAgICBjaGFubmVsX2luZGV4Xyk7Cit9CisKK3VpbnQzMl90IERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkdldFBlcmlvZEN5Y2xlcygpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICB1aW50MzJfdCBmcGdhX2N5Y2xlcyA9IGdldEZpbHRlclBlcmlvZChjaGFubmVsX2luZGV4XywgJnN0YXR1cyk7CisKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxHbGl0Y2hGaWx0ZXIsCisgICAgICAgICAgICBjaGFubmVsX2luZGV4Xyk7CisgIHJldHVybiBmcGdhX2N5Y2xlczsKK30KKwordWludDY0X3QgRGlnaXRhbEdsaXRjaEZpbHRlcjo6R2V0UGVyaW9kTmFub1NlY29uZHMoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgdWludDMyX3QgZnBnYV9jeWNsZXMgPSBnZXRGaWx0ZXJQZXJpb2QoY2hhbm5lbF9pbmRleF8sICZzdGF0dXMpOworCisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsR2xpdGNoRmlsdGVyLAorICAgICAgICAgICAgY2hhbm5lbF9pbmRleF8pOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGZwZ2FfY3ljbGVzKSAqIDEwMDBsIC8KKyAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kIC8gNCk7Cit9CisKK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6QWRkKEVuY29kZXIgKmlucHV0KSB7CisgIEFkZChpbnB1dC0+bV9hU291cmNlKTsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGQoaW5wdXQtPm1fYlNvdXJjZSk7Cit9CisKK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6QWRkKENvdW50ZXIgKmlucHV0KSB7CisgIEFkZChpbnB1dC0+bV91cFNvdXJjZSk7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkKGlucHV0LT5tX2Rvd25Tb3VyY2UpOworfQorCit2b2lkIERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OlJlbW92ZShFbmNvZGVyICppbnB1dCkgeworICBSZW1vdmUoaW5wdXQtPm1fYVNvdXJjZSk7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgUmVtb3ZlKGlucHV0LT5tX2JTb3VyY2UpOworfQorCit2b2lkIERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OlJlbW92ZShDb3VudGVyICppbnB1dCkgeworICBSZW1vdmUoaW5wdXQtPm1fdXBTb3VyY2UpOworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIFJlbW92ZShpbnB1dC0+bV9kb3duU291cmNlKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRGlnaXRhbE91dHB1dC5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0RpZ2l0YWxPdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWFiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0RpZ2l0YWxPdXRwdXQuY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRpZ2l0YWxPdXRwdXQuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBEaWdpdGFsT3V0cHV0LgorICogQ3JlYXRlcyBhIGRpZ2l0YWwgb3V0cHV0IGdpdmVuIGEgY2hhbm5lbC4gQ29tbW9uIGNyZWF0aW9uIHJvdXRpbmUgZm9yIGFsbAorICogY29uc3RydWN0b3JzLgorICovCit2b2lkIERpZ2l0YWxPdXRwdXQ6OkluaXREaWdpdGFsT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpCit7CisJY2hhciBidWZbNjRdOworCisJaWYgKCFDaGVja0RpZ2l0YWxDaGFubmVsKGNoYW5uZWwpKQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIkRpZ2l0YWwgQ2hhbm5lbCAlZCIsIGNoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCW1fY2hhbm5lbCA9IGNoYW5uZWw7CisJbV9wd21HZW5lcmF0b3IgPSAodm9pZCAqKX4wdWw7CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYWxsb2NhdGVESU8obV9kaWdpdGFsX3BvcnRzW2NoYW5uZWxdLCBmYWxzZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRGlnaXRhbE91dHB1dCwgY2hhbm5lbCk7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgZGlnaXRhbCBvdXRwdXQuCisgKiBDcmVhdGUgYSBkaWdpdGFsIG91dHB1dCBnaXZlbiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGRpZ2l0YWwgY2hhbm5lbCAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK0RpZ2l0YWxPdXRwdXQ6OkRpZ2l0YWxPdXRwdXQodWludDMyX3QgY2hhbm5lbCkKK3sKKwlJbml0RGlnaXRhbE91dHB1dChjaGFubmVsKTsKK30KKworLyoqCisgKiBGcmVlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgZGlnaXRhbCBvdXRwdXQuCisgKi8KK0RpZ2l0YWxPdXRwdXQ6On5EaWdpdGFsT3V0cHV0KCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJLy8gRGlzYWJsZSB0aGUgUFdNIGluIGNhc2UgaXQgd2FzIHJ1bm5pbmcuCisJRGlzYWJsZVBXTSgpOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCWZyZWVESU8obV9kaWdpdGFsX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBkaWdpdGFsIG91dHB1dC4KKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBkaWdpdGFsIG91dHB1dCB0byBlaXRoZXIgb25lICh0cnVlKSBvciB6ZXJvIChmYWxzZSkuCisgKiBAcGFyYW0gdmFsdWUgMSAodHJ1ZSkgZm9yIGhpZ2gsIDAgKGZhbHNlKSBmb3IgZGlzYWJsZWQKKyAqLwordm9pZCBEaWdpdGFsT3V0cHV0OjpTZXQodWludDMyX3QgdmFsdWUpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldERJTyhtX2RpZ2l0YWxfcG9ydHNbbV9jaGFubmVsXSwgdmFsdWUsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgdmFsdWUgZnJvbSBhIGRpZ2l0YWwgb3V0cHV0IGNoYW5uZWwuCisgKiBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgZGlnaXRhbCBvdXRwdXQgY2hhbm5lbCBmcm9tIHRoZSBGUEdBLgorICovCitib29sIERpZ2l0YWxPdXRwdXQ6OkdldCgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWJvb2wgdmFsdWUgPSBnZXRESU8obV9kaWdpdGFsX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBHUElPIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KKyAqLwordWludDMyX3QgRGlnaXRhbE91dHB1dDo6R2V0Q2hhbm5lbCgpCit7CisJcmV0dXJuIG1fY2hhbm5lbDsKK30KKworLyoqCisgKiBPdXRwdXQgYSBzaW5nbGUgcHVsc2Ugb24gdGhlIGRpZ2l0YWwgb3V0cHV0IGxpbmUuCisgKiBTZW5kIGEgc2luZ2xlIHB1bHNlIG9uIHRoZSBkaWdpdGFsIG91dHB1dCBsaW5lIHdoZXJlIHRoZSBwdWxzZSBkdXJhdGlvbiBpcyBzcGVjaWZpZWQgaW4gc2Vjb25kcy4KKyAqIE1heGltdW0gcHVsc2UgbGVuZ3RoIGlzIDAuMDAxNiBzZWNvbmRzLgorICogQHBhcmFtIGxlbmd0aCBUaGUgcHVsc2VsZW5ndGggaW4gc2Vjb25kcworICovCit2b2lkIERpZ2l0YWxPdXRwdXQ6OlB1bHNlKGZsb2F0IGxlbmd0aCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJcHVsc2UobV9kaWdpdGFsX3BvcnRzW21fY2hhbm5lbF0sIGxlbmd0aCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBwdWxzZSBpcyBzdGlsbCBnb2luZy4KKyAqIERldGVybWluZSBpZiBhIHByZXZpb3VzbHkgc3RhcnRlZCBwdWxzZSBpcyBzdGlsbCBnb2luZy4KKyAqLworYm9vbCBEaWdpdGFsT3V0cHV0OjpJc1B1bHNpbmcoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHZhbHVlID0gaXNQdWxzaW5nKG1fZGlnaXRhbF9wb3J0c1ttX2NoYW5uZWxdLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBQV00gZnJlcXVlbmN5IG9mIHRoZSBQV00gb3V0cHV0IG9uIGEgRGlnaXRhbCBPdXRwdXQgbGluZS4KKyAqCisgKiBUaGUgdmFsaWQgcmFuZ2UgaXMgZnJvbSAwLjYgSHogdG8gMTkga0h6LiAgVGhlIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGlzIGxvZ2FyaXRobWljLgorICoKKyAqIFRoZXJlIGlzIG9ubHkgb25lIFBXTSBmcmVxdWVuY3kgZm9yIGFsbCBkaWdpdGFsIGNoYW5uZWxzLgorICoKKyAqIEBwYXJhbSByYXRlIFRoZSBmcmVxdWVuY3kgdG8gb3V0cHV0IGFsbCBkaWdpdGFsIG91dHB1dCBQV00gc2lnbmFscy4KKyAqLwordm9pZCBEaWdpdGFsT3V0cHV0OjpTZXRQV01SYXRlKGZsb2F0IHJhdGUpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldFBXTVJhdGUocmF0ZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRW5hYmxlIGEgUFdNIE91dHB1dCBvbiB0aGlzIGxpbmUuCisgKgorICogQWxsb2NhdGUgb25lIG9mIHRoZSA2IERPIFBXTSBnZW5lcmF0b3IgcmVzb3VyY2VzIGZyb20gdGhpcyBtb2R1bGUuCisgKgorICogU3VwcGx5IHRoZSBpbml0aWFsIGR1dHktY3ljbGUgdG8gb3V0cHV0IHNvIGFzIHRvIGF2b2lkIGEgZ2xpdGNoIHdoZW4gZmlyc3Qgc3RhcnRpbmcuCisgKgorICogVGhlIHJlc29sdXRpb24gb2YgdGhlIGR1dHkgY3ljbGUgaXMgOC1iaXQgZm9yIGxvdyBmcmVxdWVuY2llcyAoMWtIeiBvciBsZXNzKQorICogYnV0IGlzIHJlZHVjZWQgdGhlIGhpZ2hlciB0aGUgZnJlcXVlbmN5IG9mIHRoZSBQV00gc2lnbmFsIGlzLgorICoKKyAqIEBwYXJhbSBpbml0aWFsRHV0eUN5Y2xlIFRoZSBkdXR5LWN5Y2xlIHRvIHN0YXJ0IGdlbmVyYXRpbmcuIFswLi4xXQorICovCit2b2lkIERpZ2l0YWxPdXRwdXQ6OkVuYWJsZVBXTShmbG9hdCBpbml0aWFsRHV0eUN5Y2xlKQoreworCWlmKG1fcHdtR2VuZXJhdG9yICE9ICh2b2lkICopfjB1bCkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJaWYoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJbV9wd21HZW5lcmF0b3IgPSBhbGxvY2F0ZVBXTSgmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCWlmKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCXNldFBXTUR1dHlDeWNsZShtX3B3bUdlbmVyYXRvciwgaW5pdGlhbER1dHlDeWNsZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlpZihTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlzZXRQV01PdXRwdXRDaGFubmVsKG1fcHdtR2VuZXJhdG9yLCBtX2NoYW5uZWwsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENoYW5nZSB0aGlzIGxpbmUgZnJvbSBhIFBXTSBvdXRwdXQgYmFjayB0byBhIHN0YXRpYyBEaWdpdGFsIE91dHB1dCBsaW5lLgorICoKKyAqIEZyZWUgdXAgb25lIG9mIHRoZSA2IERPIFBXTSBnZW5lcmF0b3IgcmVzb3VyY2VzIHRoYXQgd2VyZSBpbiB1c2UuCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6RGlzYWJsZVBXTSgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmKG1fcHdtR2VuZXJhdG9yID09ICh2b2lkICopfjB1bCkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJLy8gRGlzYWJsZSB0aGUgb3V0cHV0IGJ5IHJvdXRpbmcgdG8gYSBkZWFkIGJpdC4KKwlzZXRQV01PdXRwdXRDaGFubmVsKG1fcHdtR2VuZXJhdG9yLCBrRGlnaXRhbENoYW5uZWxzLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCWZyZWVQV00obV9wd21HZW5lcmF0b3IsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJbV9wd21HZW5lcmF0b3IgPSAodm9pZCAqKX4wdWw7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBkdXR5LWN5Y2xlIHRoYXQgaXMgYmVpbmcgZ2VuZXJhdGVkIG9uIHRoZSBsaW5lLgorICoKKyAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBkdXR5IGN5Y2xlIGlzIDgtYml0IGZvciBsb3cgZnJlcXVlbmNpZXMgKDFrSHogb3IgbGVzcykKKyAqIGJ1dCBpcyByZWR1Y2VkIHRoZSBoaWdoZXIgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgUFdNIHNpZ25hbCBpcy4KKyAqCisgKiBAcGFyYW0gZHV0eUN5Y2xlIFRoZSBkdXR5LWN5Y2xlIHRvIGNoYW5nZSB0by4gWzAuLjFdCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6VXBkYXRlRHV0eUN5Y2xlKGZsb2F0IGR1dHlDeWNsZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0UFdNRHV0eUN5Y2xlKG1fcHdtR2VuZXJhdG9yLCBkdXR5Q3ljbGUsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNoYW5uZWwgZmllbGQgb2YgYSByb3V0aW5nIG11eC4KKyAqLwordWludDMyX3QgRGlnaXRhbE91dHB1dDo6R2V0Q2hhbm5lbEZvclJvdXRpbmcoKQoreworCXJldHVybiBHZXRDaGFubmVsKCk7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgbW9kdWxlIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK3VpbnQzMl90IERpZ2l0YWxPdXRwdXQ6OkdldE1vZHVsZUZvclJvdXRpbmcoKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGFuYWxvZyB0cmlnZ2VyIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK2Jvb2wgRGlnaXRhbE91dHB1dDo6R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKQoreworCXJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRGlnaXRhbFNvdXJjZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0RpZ2l0YWxTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2M3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0RpZ2l0YWxTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRpZ2l0YWxTb3VyY2UuaCIKKworLyoqCisgKiBEaWdpdGFsU291cmNlIGRlc3RydWN0b3IuCisgKi8KK0RpZ2l0YWxTb3VyY2U6On5EaWdpdGFsU291cmNlKCkKK3sKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRG91YmxlU29sZW5vaWQuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Eb3VibGVTb2xlbm9pZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxYmFlNAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRG91YmxlU29sZW5vaWQuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRvdWJsZVNvbGVub2lkLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisvKioKKyAqIENvbW1vbiBmdW5jdGlvbiB0byBpbXBsZW1lbnQgY29uc3RydWN0b3IgYmVoYXZpb3VyLgorICovCit2b2lkIERvdWJsZVNvbGVub2lkOjpJbml0U29sZW5vaWQoKQoreworCWNoYXIgYnVmWzY0XTsKKwlpZiAoIUNoZWNrU29sZW5vaWRNb2R1bGUobV9tb2R1bGVOdW1iZXIpKQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIlNvbGVub2lkIE1vZHVsZSAlZCIsIG1fbW9kdWxlTnVtYmVyKTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTW9kdWxlSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCWlmICghQ2hlY2tTb2xlbm9pZENoYW5uZWwobV9mb3J3YXJkQ2hhbm5lbCkpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiU29sZW5vaWQgQ2hhbm5lbCAlZCIsIG1fZm9yd2FyZENoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCWlmICghQ2hlY2tTb2xlbm9pZENoYW5uZWwobV9yZXZlcnNlQ2hhbm5lbCkpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiU29sZW5vaWQgQ2hhbm5lbCAlZCIsIG1fcmV2ZXJzZUNoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCVJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdCgmbV9hbGxvY2F0ZWQsIHNvbGVub2lkX2tOdW1ETzdfMEVsZW1lbnRzICoga1NvbGVub2lkQ2hhbm5lbHMpOworCisJc25wcmludGYoYnVmLCA2NCwgIlNvbGVub2lkICVkIChNb2R1bGU6ICVkKSIsIG1fZm9yd2FyZENoYW5uZWwsIG1fbW9kdWxlTnVtYmVyKTsKKwlpZiAobV9hbGxvY2F0ZWQtPkFsbG9jYXRlKG1fbW9kdWxlTnVtYmVyICoga1NvbGVub2lkQ2hhbm5lbHMgKyBtX2ZvcndhcmRDaGFubmVsLCBidWYpID09IH4wdWwpCisJeworCQlDbG9uZUVycm9yKG1fYWxsb2NhdGVkKTsKKwkJcmV0dXJuOworCX0KKworCXNucHJpbnRmKGJ1ZiwgNjQsICJTb2xlbm9pZCAlZCAoTW9kdWxlOiAlZCkiLCBtX3JldmVyc2VDaGFubmVsLCBtX21vZHVsZU51bWJlcik7CisJaWYgKG1fYWxsb2NhdGVkLT5BbGxvY2F0ZShtX21vZHVsZU51bWJlciAqIGtTb2xlbm9pZENoYW5uZWxzICsgbV9yZXZlcnNlQ2hhbm5lbCwgYnVmKSA9PSB+MHVsKQorCXsKKwkJQ2xvbmVFcnJvcihtX2FsbG9jYXRlZCk7CisJCXJldHVybjsKKwl9CisgICAgCisJbV9mb3J3YXJkTWFzayA9IDEgPDwgbV9mb3J3YXJkQ2hhbm5lbDsKKwltX3JldmVyc2VNYXNrID0gMSA8PCBtX3JldmVyc2VDaGFubmVsOworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgbV9mb3J3YXJkQ2hhbm5lbCwgbV9tb2R1bGVOdW1iZXIpOworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgbV9yZXZlcnNlQ2hhbm5lbCwgbV9tb2R1bGVOdW1iZXIpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICogVXNlcyB0aGUgZGVmYXVsdCBQQ00gSUQgb2YgMAorICogQHBhcmFtIGZvcndhcmRDaGFubmVsIFRoZSBmb3J3YXJkIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSBQQ00gKDAuLjcpLgorICogQHBhcmFtIHJldmVyc2VDaGFubmVsIFRoZSByZXZlcnNlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSBQQ00gKDAuLjcpLgorICovCitEb3VibGVTb2xlbm9pZDo6RG91YmxlU29sZW5vaWQodWludDMyX3QgZm9yd2FyZENoYW5uZWwsIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKQorCTogU29sZW5vaWRCYXNlIChHZXREZWZhdWx0U29sZW5vaWRNb2R1bGUoKSkKKwksIG1fZm9yd2FyZENoYW5uZWwgKGZvcndhcmRDaGFubmVsKQorCSwgbV9yZXZlcnNlQ2hhbm5lbCAocmV2ZXJzZUNoYW5uZWwpCit7CisJSW5pdFNvbGVub2lkKCk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIG1vZHVsZU51bWJlciBUaGUgQ0FOIElEIG9mIHRoZSBQQ00uCisgKiBAcGFyYW0gZm9yd2FyZENoYW5uZWwgVGhlIGZvcndhcmQgY2hhbm5lbCBvbiB0aGUgUENNIHRvIGNvbnRyb2wgKDAuLjcpLgorICogQHBhcmFtIHJldmVyc2VDaGFubmVsIFRoZSByZXZlcnNlIGNoYW5uZWwgb24gdGhlIFBDTSB0byBjb250cm9sICgwLi43KS4KKyAqLworRG91YmxlU29sZW5vaWQ6OkRvdWJsZVNvbGVub2lkKHVpbnQ4X3QgbW9kdWxlTnVtYmVyLCB1aW50MzJfdCBmb3J3YXJkQ2hhbm5lbCwgdWludDMyX3QgcmV2ZXJzZUNoYW5uZWwpCisJOiBTb2xlbm9pZEJhc2UgKG1vZHVsZU51bWJlcikKKwksIG1fZm9yd2FyZENoYW5uZWwgKGZvcndhcmRDaGFubmVsKQorCSwgbV9yZXZlcnNlQ2hhbm5lbCAocmV2ZXJzZUNoYW5uZWwpCit7CisJSW5pdFNvbGVub2lkKCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworRG91YmxlU29sZW5vaWQ6On5Eb3VibGVTb2xlbm9pZCgpCit7CisJaWYgKENoZWNrU29sZW5vaWRNb2R1bGUobV9tb2R1bGVOdW1iZXIpKQorCXsKKwkJbV9hbGxvY2F0ZWQtPkZyZWUobV9tb2R1bGVOdW1iZXIgKiBrU29sZW5vaWRDaGFubmVscyArIG1fZm9yd2FyZENoYW5uZWwpOworCQltX2FsbG9jYXRlZC0+RnJlZShtX21vZHVsZU51bWJlciAqIGtTb2xlbm9pZENoYW5uZWxzICsgbV9yZXZlcnNlQ2hhbm5lbCk7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBzb2xlbm9pZC4KKyAqCisgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCAoT2ZmLCBGb3J3YXJkIG9yIFJldmVyc2UpCisgKi8KK3ZvaWQgRG91YmxlU29sZW5vaWQ6OlNldChWYWx1ZSB2YWx1ZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJdWludDhfdCByYXdWYWx1ZSA9IDB4MDA7CisKKwlzd2l0Y2godmFsdWUpCisJeworCWNhc2Uga09mZjoKKwkJcmF3VmFsdWUgPSAweDAwOworCQlicmVhazsKKwljYXNlIGtGb3J3YXJkOgorCQlyYXdWYWx1ZSA9IG1fZm9yd2FyZE1hc2s7CisJCWJyZWFrOworCWNhc2Uga1JldmVyc2U6CisJCXJhd1ZhbHVlID0gbV9yZXZlcnNlTWFzazsKKwkJYnJlYWs7CisJfQorCisJU29sZW5vaWRCYXNlOjpTZXQocmF3VmFsdWUsIG1fZm9yd2FyZE1hc2sgfCBtX3JldmVyc2VNYXNrKTsKK30KKworLyoqCisgKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzb2xlbm9pZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzb2xlbm9pZC4KKyAqLworRG91YmxlU29sZW5vaWQ6OlZhbHVlIERvdWJsZVNvbGVub2lkOjpHZXQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBrT2ZmOworCXVpbnQ4X3QgdmFsdWUgPSBHZXRBbGwoKTsKKworCWlmICh2YWx1ZSAmIG1fZm9yd2FyZE1hc2spIHJldHVybiBrRm9yd2FyZDsKKwlpZiAodmFsdWUgJiBtX3JldmVyc2VNYXNrKSByZXR1cm4ga1JldmVyc2U7CisJcmV0dXJuIGtPZmY7Cit9CisvKioKKyAqIENoZWNrIGlmIHRoZSBmb3J3YXJkIHNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLgorICoJCUlmIGEgc29sZW5vaWQgaXMgc2hvcnRlZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGJsYWNrbGlzdCBhbmQKKyAqCQlkaXNhYmxlZCB1bnRpbCBwb3dlciBjeWNsZSwgb3IgdW50aWwgZmF1bHRzIGFyZSBjbGVhcmVkLgorICoJCUBzZWUgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKQorICoKKyAqIEByZXR1cm4gSWYgc29sZW5vaWQgaXMgZGlzYWJsZWQgZHVlIHRvIHNob3J0LgorICovCitib29sIERvdWJsZVNvbGVub2lkOjpJc0Z3ZFNvbGVub2lkQmxhY2tMaXN0ZWQoKQoreworCWludCBibGFja0xpc3QgPSBHZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdCgpOworCXJldHVybiAoYmxhY2tMaXN0ICYgbV9mb3J3YXJkTWFzaykgPyAxIDogMDsKK30KKy8qKgorICogQ2hlY2sgaWYgdGhlIHJldmVyc2Ugc29sZW5vaWQgaXMgYmxhY2tsaXN0ZWQuCisgKgkJSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAorICoJCWRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCisgKgkJQHNlZSBDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCisgKgorICogQHJldHVybiBJZiBzb2xlbm9pZCBpcyBkaXNhYmxlZCBkdWUgdG8gc2hvcnQuCisgKi8KK2Jvb2wgRG91YmxlU29sZW5vaWQ6OklzUmV2U29sZW5vaWRCbGFja0xpc3RlZCgpCit7CisJaW50IGJsYWNrTGlzdCA9IEdldFBDTVNvbGVub2lkQmxhY2tMaXN0KCk7CisJcmV0dXJuIChibGFja0xpc3QgJiBtX3JldmVyc2VNYXNrKSA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Ecml2ZXJTdGF0aW9uLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRHJpdmVyU3RhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkMzA2MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRHJpdmVyU3RhdGlvbi5jcHAKQEAgLTAsMCArMSw1MzQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIkxvZy5ocHAiCisKKy8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAorVExvZ0xldmVsIGRzTG9nTGV2ZWwgPSBsb2dERUJVRzsKK2NvbnN0IGRvdWJsZSBKT1lTVElDS19VTlBMVUdHRURfTUVTU0FHRV9JTlRFUlZBTCA9IDEuMDsKKworI2RlZmluZSBEU19MT0cobGV2ZWwpIFwKKwlpZiAobGV2ZWwgPiBkc0xvZ0xldmVsKSA7IFwKKwllbHNlIExvZygpLkdldChsZXZlbCkKKworY29uc3QgdWludDMyX3QgRHJpdmVyU3RhdGlvbjo6a0pveXN0aWNrUG9ydHM7CitEcml2ZXJTdGF0aW9uKiBEcml2ZXJTdGF0aW9uOjptX2luc3RhbmNlID0gTlVMTDsKKworLyoqCisgKiBEcml2ZXJTdGF0aW9uIGNvbnN0cnVjdG9yLgorICoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgb25jZSB0aGUgZmlyc3QgdGltZSBHZXRJbnN0YW5jZSgpIGlzIGNhbGxlZAorICovCitEcml2ZXJTdGF0aW9uOjpEcml2ZXJTdGF0aW9uKCkKKwk6IG1fdGFzayAoIkRyaXZlclN0YXRpb24iLCAoRlVOQ1BUUilEcml2ZXJTdGF0aW9uOjpJbml0VGFzaykKKwksIG1fbmV3Q29udHJvbERhdGEoMCkKKwksIG1fcGFja2V0RGF0YUF2YWlsYWJsZU11bHRpV2FpdCgwKQorCSwgbV93YWl0Rm9yRGF0YVNlbSgwKQorCSwgbV91c2VySW5EaXNhYmxlZChmYWxzZSkKKwksIG1fdXNlckluQXV0b25vbW91cyhmYWxzZSkKKwksIG1fdXNlckluVGVsZW9wKGZhbHNlKQorCSwgbV91c2VySW5UZXN0KGZhbHNlKQorCSwgbV9uZXh0TWVzc2FnZVRpbWUoMCkKK3sKKwkvLyBBbGwgam95c3RpY2tzIHNob3VsZCBkZWZhdWx0IHRvIGhhdmluZyB6ZXJvIGF4ZXMsIHBvdnMgYW5kIGJ1dHRvbnMsIHNvCisJLy8gdW5pbml0aWFsaXplZCBtZW1vcnkgZG9lc24ndCBnZXQgc2VudCB0byBzcGVlZCBjb250cm9sbGVycy4KKwlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwga0pveXN0aWNrUG9ydHM7IGkrKykgeworCQltX2pveXN0aWNrQXhlc1tpXS5jb3VudCA9IDA7CisJCW1fam95c3RpY2tQT1ZzW2ldLmNvdW50ID0gMDsKKwkJbV9qb3lzdGlja0J1dHRvbnNbaV0uY291bnQgPSAwOworCX0KKwkvLyBDcmVhdGUgYSBuZXcgc2VtYXBob3JlCisJbV9wYWNrZXREYXRhQXZhaWxhYmxlTXVsdGlXYWl0ID0gaW5pdGlhbGl6ZU11bHRpV2FpdCgpOworCW1fbmV3Q29udHJvbERhdGEgPSBpbml0aWFsaXplU2VtYXBob3JlKFNFTUFQSE9SRV9FTVBUWSk7CisKKwltX3dhaXRGb3JEYXRhU2VtID0gaW5pdGlhbGl6ZU11bHRpV2FpdCgpOworCW1fd2FpdEZvckRhdGFNdXRleCA9IGluaXRpYWxpemVNdXRleE5vcm1hbCgpOworCisJbV9wYWNrZXREYXRhQXZhaWxhYmxlTXVsdGlXYWl0ID0gaW5pdGlhbGl6ZU11bHRpV2FpdCgpOworCW1fcGFja2V0RGF0YUF2YWlsYWJsZU11dGV4ID0gaW5pdGlhbGl6ZU11dGV4Tm9ybWFsKCk7CisKKwkvLyBSZWdpc3RlciB0aGF0IHNlbWFwaG9yZSB3aXRoIHRoZSBuZXR3b3JrIGNvbW11bmljYXRpb25zIHRhc2suCisJLy8gSXQgd2lsbCBzaWduYWwgd2hlbiBuZXcgcGFja2V0IGRhdGEgaXMgYXZhaWxhYmxlLgorCUhBTFNldE5ld0RhdGFTZW0obV9wYWNrZXREYXRhQXZhaWxhYmxlTXVsdGlXYWl0KTsKKworCUFkZFRvU2luZ2xldG9uTGlzdCgpOworCisJaWYgKCFtX3Rhc2suU3RhcnQoKGludDMyX3QpdGhpcykpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoRHJpdmVyU3RhdGlvblRhc2tFcnJvcik7CisJfQorfQorCitEcml2ZXJTdGF0aW9uOjp+RHJpdmVyU3RhdGlvbigpCit7CisJbV90YXNrLlN0b3AoKTsKKwltX2luc3RhbmNlID0gTlVMTDsKKwlkZWxldGVNdWx0aVdhaXQobV93YWl0Rm9yRGF0YVNlbSk7CisJLy8gVW5yZWdpc3RlciBvdXIgc2VtYXBob3JlLgorCUhBTFNldE5ld0RhdGFTZW0oTlVMTCk7CisJZGVsZXRlTXVsdGlXYWl0KG1fcGFja2V0RGF0YUF2YWlsYWJsZU11bHRpV2FpdCk7CisJZGVsZXRlTXV0ZXgobV9wYWNrZXREYXRhQXZhaWxhYmxlTXV0ZXgpOworCWRlbGV0ZU11dGV4KG1fd2FpdEZvckRhdGFNdXRleCk7Cit9CisKK3ZvaWQgRHJpdmVyU3RhdGlvbjo6SW5pdFRhc2soRHJpdmVyU3RhdGlvbiAqZHMpCit7CisJZHMtPlJ1bigpOworfQorCit2b2lkIERyaXZlclN0YXRpb246OlJ1bigpCit7CisJaW50IHBlcmlvZCA9IDA7CisJd2hpbGUgKHRydWUpCisJeworCQl0YWtlTXVsdGlXYWl0KG1fcGFja2V0RGF0YUF2YWlsYWJsZU11bHRpV2FpdCwgbV9wYWNrZXREYXRhQXZhaWxhYmxlTXV0ZXgsIDApOworCQlHZXREYXRhKCk7CisJCWdpdmVNdWx0aVdhaXQobV93YWl0Rm9yRGF0YVNlbSk7CisKKwkJaWYgKCsrcGVyaW9kID49IDQpCisJCXsKKwkJCU1vdG9yU2FmZXR5SGVscGVyOjpDaGVja01vdG9ycygpOworCQkJcGVyaW9kID0gMDsKKwkJfQorCQlpZiAobV91c2VySW5EaXNhYmxlZCkKKwkJCUhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoKTsKKwkJaWYgKG1fdXNlckluQXV0b25vbW91cykKKwkJCUhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cygpOworCQlpZiAobV91c2VySW5UZWxlb3ApCisJCQlIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCgpOworCQlpZiAobV91c2VySW5UZXN0KQorCQkJSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1UZXN0KCk7CisJfQorfQorCisvKioKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHNpbmdsZXRvbiBEcml2ZXJTdGF0aW9uLgorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBEUyBpbnN0YW5jZQorICovCitEcml2ZXJTdGF0aW9uKiBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpCit7CisJaWYgKG1faW5zdGFuY2UgPT0gTlVMTCkKKwl7CisJCW1faW5zdGFuY2UgPSBuZXcgRHJpdmVyU3RhdGlvbigpOworCX0KKwlyZXR1cm4gbV9pbnN0YW5jZTsKK30KKworLyoqCisgKiBDb3B5IGRhdGEgZnJvbSB0aGUgRFMgdGFzayBmb3IgdGhlIHVzZXIuCisgKiBJZiBubyBuZXcgZGF0YSBleGlzdHMsIGl0IHdpbGwganVzdCBiZSByZXR1cm5lZCwgb3RoZXJ3aXNlCisgKiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSBEUyBwb2xsaW5nIGxvb3AuCisgKi8KK3ZvaWQgRHJpdmVyU3RhdGlvbjo6R2V0RGF0YSgpCit7CisKKwkvLyBHZXQgdGhlIHN0YXR1cyBvZiBhbGwgb2YgdGhlIGpveXN0aWNrcworCWZvcih1aW50OF90IHN0aWNrID0gMDsgc3RpY2sgPCA0OyBzdGljaysrKSB7CisJCUhBTEdldEpveXN0aWNrQXhlcyhzdGljaywgJm1fam95c3RpY2tBeGVzW3N0aWNrXSk7CisJCUhBTEdldEpveXN0aWNrQnV0dG9ucyhzdGljaywgJm1fam95c3RpY2tCdXR0b25zW3N0aWNrXSk7CisJICBIQUxHZXRKb3lzdGlja1BPVnMoc3RpY2ssICZtX2pveXN0aWNrUE9Wc1tzdGlja10pOworCX0KKwlnaXZlU2VtYXBob3JlKG1fbmV3Q29udHJvbERhdGEpOworfQorCisvKioKKyAqIFJlYWQgdGhlIGJhdHRlcnkgdm9sdGFnZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBiYXR0ZXJ5IHZvbHRhZ2UgaW4gVm9sdHMuCisgKi8KK2Zsb2F0IERyaXZlclN0YXRpb246OkdldEJhdHRlcnlWb2x0YWdlKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZmxvYXQgdm9sdGFnZSA9IGdldFZpblZvbHRhZ2UoJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCAiZ2V0VmluVm9sdGFnZSIpOworCisJcmV0dXJuIHZvbHRhZ2U7Cit9CisKKy8qKgorICogUmVwb3J0cyBlcnJvcnMgcmVsYXRlZCB0byB1bnBsdWdnZWQgam95c3RpY2tzCisgKiBUaHJvdHRsZXMgdGhlIGVycm9ycyBzbyB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcndoZWxtIHRoZSBEUworICovCit2b2lkIERyaXZlclN0YXRpb246OlJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3Ioc3RkOjpzdHJpbmcgbWVzc2FnZSkgeworCWRvdWJsZSBjdXJyZW50VGltZSA9IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7CisJaWYgKGN1cnJlbnRUaW1lID4gbV9uZXh0TWVzc2FnZVRpbWUpIHsKKwkJUmVwb3J0RXJyb3IobWVzc2FnZSk7CisJCW1fbmV4dE1lc3NhZ2VUaW1lID0gY3VycmVudFRpbWUgKyBKT1lTVElDS19VTlBMVUdHRURfTUVTU0FHRV9JTlRFUlZBTDsKKwl9Cit9CisKKy8qKgkKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBheGVzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBheGVzIG9uIHRoZSBpbmRpY2F0ZWQgam95c3RpY2sKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldFN0aWNrQXhpc0NvdW50KHVpbnQzMl90IHN0aWNrKQoreworICAgIGlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykKKyAgICB7CisgICAgICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgCUhBTEpveXN0aWNrQXhlcyBqb3lzdGlja0F4ZXM7CisgICAJSEFMR2V0Sm95c3RpY2tBeGVzKHN0aWNrLCAmam95c3RpY2tBeGVzKTsKKyAgIAlyZXR1cm4gam95c3RpY2tBeGVzLmNvdW50OworfQorCisvKioJCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgUE9WcyBvbiBhIGdpdmVuIGpveXN0aWNrIHBvcnQKKyAqCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHBvcnQgbnVtYmVyCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgUE9WcyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCisgKi8KK2ludCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja1BPVkNvdW50KHVpbnQzMl90IHN0aWNrKQoreworICAgIGlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykKKyAgICB7CisgICAgICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCUhBTEpveXN0aWNrUE9WcyBqb3lzdGlja1BPVnM7CisJSEFMR2V0Sm95c3RpY2tQT1ZzKHN0aWNrLCAmam95c3RpY2tQT1ZzKTsKKyAgIAlyZXR1cm4gam95c3RpY2tQT1ZzLmNvdW50OworfQorCisvKioJCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnV0dG9ucyBvbiBhIGdpdmVuIGpveXN0aWNrIHBvcnQKKyAqCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHBvcnQgbnVtYmVyCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnV0dG9ucyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCisgKi8KK2ludCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0J1dHRvbkNvdW50KHVpbnQzMl90IHN0aWNrKQoreworICAgIGlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykKKyAgICB7CisgICAgICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCUhBTEpveXN0aWNrQnV0dG9ucyBqb3lzdGlja0J1dHRvbnM7CisJSEFMR2V0Sm95c3RpY2tCdXR0b25zKHN0aWNrLCAmam95c3RpY2tCdXR0b25zKTsKKyAgIAlyZXR1cm4gam95c3RpY2tCdXR0b25zLmNvdW50OworfQorCisvKioKKyAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGF4aXMgb24gYSBqb3lzdGljay4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KKyAqCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHRvIHJlYWQuCisgKiBAcGFyYW0gYXhpcyBUaGUgYW5hbG9nIGF4aXMgdmFsdWUgdG8gcmVhZCBmcm9tIHRoZSBqb3lzdGljay4KKyAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBheGlzIG9uIHRoZSBqb3lzdGljay4KKyAqLworZmxvYXQgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tBeGlzKHVpbnQzMl90IHN0aWNrLCB1aW50MzJfdCBheGlzKQoreworCWlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykKKwl7CisJCXdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGF4aXMgPj0gbV9qb3lzdGlja0F4ZXNbc3RpY2tdLmNvdW50KQorCXsKKwkJaWYgKGF4aXMgPj0ga01heEpveXN0aWNrQXhlcykKKwkJCXdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0F4aXMpOworCQkvL2Vsc2UKKwkJCS8vUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcigiV0FSTklORzogSm95c3RpY2sgQXhpcyBtaXNzaW5nLCBjaGVjayBpZiBhbGwgY29udHJvbGxlcnMgYXJlIHBsdWdnZWQgaW5cbiIpOworCQlyZXR1cm4gMC4wZjsKKwl9CisKKwlpbnQ4X3QgdmFsdWUgPSBtX2pveXN0aWNrQXhlc1tzdGlja10uYXhlc1theGlzXTsKKworCWlmKHZhbHVlIDwgMCkKKwl7CisJCXJldHVybiB2YWx1ZSAvIDEyOC4wZjsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIHZhbHVlIC8gMTI3LjBmOworCX0KK30KKworLyoqCisgKiBHZXQgdGhlIHN0YXRlIG9mIGEgUE9WIG9uIHRoZSBqb3lzdGljay4KKyAqCisgKiBAcmV0dXJuIHRoZSBhbmdsZSBvZiB0aGUgUE9WIGluIGRlZ3JlZXMsIG9yIC0xIGlmIHRoZSBQT1YgaXMgbm90IHByZXNzZWQuCisgKi8KK2ludCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja1BPVih1aW50MzJfdCBzdGljaywgdWludDMyX3QgcG92KSB7CisJaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocG92ID49IG1fam95c3RpY2tQT1ZzW3N0aWNrXS5jb3VudCkKKwl7CisJCWlmIChwb3YgPj0ga01heEpveXN0aWNrUE9WcykKKwkJCXdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0F4aXMpOworCQkvL2Vsc2UKKwkJCS8vUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcigiV0FSTklORzogSm95c3RpY2sgUE9WIG1pc3NpbmcsIGNoZWNrIGlmIGFsbCBjb250cm9sbGVycyBhcmUgcGx1Z2dlZCBpblxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBtX2pveXN0aWNrUE9Wc1tzdGlja10ucG92c1twb3ZdOworfQorCisvKioKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9ucyBvbiB0aGUgam95c3RpY2suCisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbnMgb24gdGhlIGpveXN0aWNrLgorICovCit1aW50MzJfdCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0J1dHRvbnModWludDMyX3Qgc3RpY2spCit7CisJaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gbV9qb3lzdGlja0J1dHRvbnNbc3RpY2tdLmJ1dHRvbnM7Cit9CisKKy8qKgorICogVGhlIHN0YXRlIG9mIG9uZSBqb3lzdGljayBidXR0b24uIEJ1dHRvbiBpbmRleGVzIGJlZ2luIGF0IDEuCisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgorICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGluZGV4LCBiZWdpbm5pbmcgYXQgMS4KKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBqb3lzdGljayBidXR0b24uCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tCdXR0b24odWludDMyX3Qgc3RpY2ssIHVpbnQ4X3QgYnV0dG9uKQoreworCWlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykKKwl7CisJCXdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlpZihidXR0b24gPiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10uY291bnQpCisJeworCQkvL1JlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3IoIldBUk5JTkc6IEpveXN0aWNrIEJ1dHRvbiBtaXNzaW5nLCBjaGVjayBpZiBhbGwgY29udHJvbGxlcnMgYXJlIHBsdWdnZWQgaW5cbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmKGJ1dHRvbiA9PSAwKQorCXsKKwkJLy9SZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKCJFUlJPUjogQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMSBpbiBXUElMaWIgZm9yIEMrKyBhbmQgSmF2YSIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiAoKDB4MSA8PCAoYnV0dG9uLTEpKSAmIG1fam95c3RpY2tCdXR0b25zW3N0aWNrXS5idXR0b25zKSAhPTA7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIERTIGhhcyBlbmFibGVkIHRoZSByb2JvdAorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBlbmFibGVkIGFuZCB0aGUgRFMgaXMgY29ubmVjdGVkCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNFbmFibGVkKCkKK3sKKwlIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKyAgICBtZW1zZXQoJmNvbnRyb2xXb3JkLCAwLCBzaXplb2YoY29udHJvbFdvcmQpKTsKKwlIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworCXJldHVybiBjb250cm9sV29yZC5lbmFibGVkICYmIGNvbnRyb2xXb3JkLmRzQXR0YWNoZWQ7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHJvYm90IGlzIGRpc2FibGVkCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQgb3IgdGhlIERTIGlzIG5vdCBjb25uZWN0ZWQKKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc0Rpc2FibGVkKCkKK3sKKwlIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKyAgICBtZW1zZXQoJmNvbnRyb2xXb3JkLCAwLCBzaXplb2YoY29udHJvbFdvcmQpKTsKKwlIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworCXJldHVybiAhKGNvbnRyb2xXb3JkLmVuYWJsZWQgJiYgY29udHJvbFdvcmQuZHNBdHRhY2hlZCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIERTIGlzIGNvbW1hbmRpbmcgYXV0b25vbW91cyBtb2RlCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGJlaW5nIGNvbW1hbmRlZCB0byBiZSBpbiBhdXRvbm9tb3VzIG1vZGUKKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc0F1dG9ub21vdXMoKQoreworCUhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworICAgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworCUhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisJcmV0dXJuIGNvbnRyb2xXb3JkLmF1dG9ub21vdXM7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIERTIGlzIGNvbW1hbmRpbmcgdGVsZW9wIG1vZGUKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgYmVpbmcgY29tbWFuZGVkIHRvIGJlIGluIHRlbGVvcCBtb2RlCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNPcGVyYXRvckNvbnRyb2woKQoreworCUhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworICAgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworCUhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisJcmV0dXJuICEoY29udHJvbFdvcmQuYXV0b25vbW91cyB8fCBjb250cm9sV29yZC50ZXN0KTsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRFMgaXMgY29tbWFuZGluZyB0ZXN0IG1vZGUKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgYmVpbmcgY29tbWFuZGVkIHRvIGJlIGluIHRlc3QgbW9kZQorICovCitib29sIERyaXZlclN0YXRpb246OklzVGVzdCgpCit7CisJSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisJSEFMR2V0Q29udHJvbFdvcmQoJmNvbnRyb2xXb3JkKTsKKwlyZXR1cm4gY29udHJvbFdvcmQudGVzdDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRFMgaXMgYXR0YWNoZWQKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgRFMgaXMgY29ubmVjdGVkIHRvIHRoZSByb2JvdAorICovCitib29sIERyaXZlclN0YXRpb246OklzRFNBdHRhY2hlZCgpCit7CisJSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgICAgbWVtc2V0KCZjb250cm9sV29yZCwgMCwgc2l6ZW9mKGNvbnRyb2xXb3JkKSk7CisJSEFMR2V0Q29udHJvbFdvcmQoJmNvbnRyb2xXb3JkKTsKKwlyZXR1cm4gY29udHJvbFdvcmQuZHNBdHRhY2hlZDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRlBHQSBvdXRwdXRzIGFyZSBlbmFibGVkLiBUaGUgb3V0cHV0cyBtYXkgYmUgZGlzYWJsZWQgaWYgdGhlIHJvYm90IGlzIGRpc2FibGVkCisgKiBvciBlLXN0b3BwZWQsIHRoZSB3YXRjaGRvZyBoYXMgZXhwaXJlZCwgb3IgaWYgdGhlIHJvYm9SSU8gYnJvd25zIG91dC4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgRlBHQSBvdXRwdXRzIGFyZSBlbmFibGVkLgorICovCitib29sIERyaXZlclN0YXRpb246OklzU3lzQWN0aXZlKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCByZXRWYWwgPSBIQUxHZXRTeXN0ZW1BY3RpdmUoJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgc3lzdGVtIGlzIGJyb3duZWQgb3V0LgorICogQHJldHVybiBUcnVlIGlmIHRoZSBzeXN0ZW0gaXMgYnJvd25lZCBvdXQKKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc1N5c0Jyb3duZWRPdXQoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIHJldFZhbCA9IEhBTEdldEJyb3duZWRPdXQoJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBIYXMgYSBuZXcgY29udHJvbCBwYWNrZXQgZnJvbSB0aGUgZHJpdmVyIHN0YXRpb24gYXJyaXZlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZD8KKyAqIFdhcm5pbmc6IElmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBtb3JlIHRoYW4gb25lIHBsYWNlIGF0IHRoZSBzYW1lIHRpbWUsCisgKiB5b3Ugd2lsbCBub3QgZ2V0IHRoZSBnZXQgdGhlIGludGVuZGVkIGJlaGF2aW91ci4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udHJvbCBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgc2luY2UgdGhlIGxhc3QgY2FsbC4KKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc05ld0NvbnRyb2xEYXRhKCkKK3sKKwlyZXR1cm4gdHJ5VGFrZVNlbWFwaG9yZShtX25ld0NvbnRyb2xEYXRhKSA9PSAwOworfQorCisvKioKKyAqIElzIHRoZSBkcml2ZXIgc3RhdGlvbiBhdHRhY2hlZCB0byBhIEZpZWxkIE1hbmFnZW1lbnQgU3lzdGVtPworICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBjb21wZXRpbmcgb24gYSBmaWVsZCBiZWluZyBjb250cm9sbGVkIGJ5IGEgRmllbGQgTWFuYWdlbWVudCBTeXN0ZW0KKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc0ZNU0F0dGFjaGVkKCkKK3sKKwlIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKwlIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworCXJldHVybiBjb250cm9sV29yZC5mbXNBdHRhY2hlZDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFsbGlhbmNlIHRoYXQgdGhlIGRyaXZlciBzdGF0aW9uIHNheXMgaXQgaXMgb24uCisgKiBUaGlzIGNvdWxkIHJldHVybiBrUmVkIG9yIGtCbHVlCisgKiBAcmV0dXJuIFRoZSBBbGxpYW5jZSBlbnVtIChrUmVkLCBrQmx1ZSBvciBrSW52YWxpZCkKKyAqLworRHJpdmVyU3RhdGlvbjo6QWxsaWFuY2UgRHJpdmVyU3RhdGlvbjo6R2V0QWxsaWFuY2UoKQoreworCUhBTEFsbGlhbmNlU3RhdGlvbklEIGFsbGlhbmNlU3RhdGlvbklEOworCUhBTEdldEFsbGlhbmNlU3RhdGlvbigmYWxsaWFuY2VTdGF0aW9uSUQpOworCXN3aXRjaChhbGxpYW5jZVN0YXRpb25JRCkKKwl7CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMToKKwljYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQyOgorCWNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDM6CisJCXJldHVybiBrUmVkOworCWNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUxOgorCWNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUyOgorCWNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUzOgorCQlyZXR1cm4ga0JsdWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGtJbnZhbGlkOworCX0KK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGRyaXZlciBzdGF0aW9uIGxvY2F0aW9uIG9uIHRoZSBmaWVsZAorICogVGhpcyBjb3VsZCByZXR1cm4gMSwgMiwgb3IgMworICogQHJldHVybiBUaGUgbG9jYXRpb24gb2YgdGhlIGRyaXZlciBzdGF0aW9uICgxLTMsIDAgZm9yIGludmFsaWQpCisgKi8KK3VpbnQzMl90IERyaXZlclN0YXRpb246OkdldExvY2F0aW9uKCkKK3sKKwlIQUxBbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZVN0YXRpb25JRDsKKwlIQUxHZXRBbGxpYW5jZVN0YXRpb24oJmFsbGlhbmNlU3RhdGlvbklEKTsKKwlzd2l0Y2goYWxsaWFuY2VTdGF0aW9uSUQpCisJeworCWNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDE6CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTE6CisJCXJldHVybiAxOworCWNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDI6CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTI6CisJCXJldHVybiAyOworCWNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDM6CisJY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTM6CisJCXJldHVybiAzOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworLyoqCisgKiBXYWl0IHVudGlsIGEgbmV3IHBhY2tldCBjb21lcyBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbgorICogVGhpcyBibG9ja3Mgb24gYSBzZW1hcGhvcmUsIHNvIHRoZSB3YWl0aW5nIGlzIGVmZmljaWVudC4KKyAqIFRoaXMgaXMgYSBnb29kIHdheSB0byBkZWxheSBwcm9jZXNzaW5nIHVudGlsIHRoZXJlIGlzIG5ldyBkcml2ZXIgc3RhdGlvbiBkYXRhIHRvIGFjdCBvbgorICovCit2b2lkIERyaXZlclN0YXRpb246OldhaXRGb3JEYXRhKCkKK3sKKwl0YWtlTXVsdGlXYWl0KG1fd2FpdEZvckRhdGFTZW0sIG1fd2FpdEZvckRhdGFNdXRleCwgU0VNQVBIT1JFX1dBSVRfRk9SRVZFUik7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBtYXRjaCB0aW1lCisgKiBUaGUgRk1TIGRvZXMgbm90IHNlbmQgYW4gb2ZmaWNpYWwgbWF0Y2ggdGltZSB0byB0aGUgcm9ib3RzLCBidXQgZG9lcyBzZW5kIGFuIGFwcHJveGltYXRlIG1hdGNoIHRpbWUuCisgKiBUaGUgdmFsdWUgd2lsbCBjb3VudCBkb3duIHRoZSB0aW1lIHJlbWFpbmluZyBpbiB0aGUgY3VycmVudCBwZXJpb2QgKGF1dG8gb3IgdGVsZW9wKS4KKyAqIFdhcm5pbmc6IFRoaXMgaXMgbm90IGFuIG9mZmljaWFsIHRpbWUgKHNvIGl0IGNhbm5vdCBiZSB1c2VkIHRvIGRpc3B1dGUgcmVmIGNhbGxzIG9yIGd1YXJhbnRlZSB0aGF0IGEgZnVuY3Rpb24KKyAqIHdpbGwgdHJpZ2dlciBiZWZvcmUgdGhlIG1hdGNoIGVuZHMpCisgKiBUaGUgUHJhY3RpY2UgTWF0Y2ggZnVuY3Rpb24gb2YgdGhlIERTIGFwcHJveGltYXRlcyB0aGUgYmVoYXZpb3VyIHNlZW4gb24gdGhlIGZpZWxkLgorICogQHJldHVybiBUaW1lIHJlbWFpbmluZyBpbiBjdXJyZW50IG1hdGNoIHBlcmlvZCAoYXV0byBvciB0ZWxlb3ApCisgKi8KK2RvdWJsZSBEcml2ZXJTdGF0aW9uOjpHZXRNYXRjaFRpbWUoKQoreworCWZsb2F0IG1hdGNoVGltZTsKKwlIQUxHZXRNYXRjaFRpbWUoJm1hdGNoVGltZSk7CisJcmV0dXJuIChkb3VibGUpbWF0Y2hUaW1lOworfQorCisvKioKKyAqIFJlcG9ydCBhbiBlcnJvciB0byB0aGUgRHJpdmVyU3RhdGlvbiBtZXNzYWdlcyB3aW5kb3cuCisgKiBUaGUgZXJyb3IgaXMgYWxzbyBwcmludGVkIHRvIHRoZSBwcm9ncmFtIGNvbnNvbGUuCisgKi8KK3ZvaWQgRHJpdmVyU3RhdGlvbjo6UmVwb3J0RXJyb3Ioc3RkOjpzdHJpbmcgZXJyb3IpCit7CisJc3RkOjpjb3V0IDw8IGVycm9yIDw8IHN0ZDo6ZW5kbDsKKyAgICBIQUxTZXRFcnJvckRhdGEoZXJyb3IuY19zdHIoKSwgZXJyb3Iuc2l6ZSgpLCAwKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvRW5jb2Rlci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0VuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmFmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0VuY29kZXIuY3BwCkBAIC0wLDAgKzEsNTQ2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisjaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIEVuY29kZXJzLgorICogVGhpcyBjb2RlIGFsbG9jYXRlcyByZXNvdXJjZXMgZm9yIEVuY29kZXJzIGFuZCBpcyBjb21tb24gdG8gYWxsIGNvbnN0cnVjdG9ycy4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIElmIHRydWUsIGNvdW50cyBkb3duIGluc3RlYWQgb2YgdXAgKHRoaXMgaXMgYWxsIHJlbGF0aXZlKQorICogQHBhcmFtIGVuY29kaW5nVHlwZSBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFggZGVjb2RpbmcuIElmIDRYIGlzCisgKiBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0Egb2JqZWN0IGlzIHVzZWQgYW5kIHRoZSByZXR1cm5lZCBjb3VudHMgd2lsbCBiZSA0eCB0aGUgZW5jb2RlcgorICogc3BlYydkIHZhbHVlIHNpbmNlIGFsbCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZSBzZWxlY3RlZCB0aGVuCisgKiBhIGNvdW50ZXIgb2JqZWN0IHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudAorICogb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KKyAqLwordm9pZCBFbmNvZGVyOjpJbml0RW5jb2Rlcihib29sIHJldmVyc2VEaXJlY3Rpb24sIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUpCit7CisJbV9lbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGU7CisJbV9pbmRleCA9IDA7CisJc3dpdGNoIChlbmNvZGluZ1R5cGUpCisJeworCQljYXNlIGs0WDoKKwkJeworCQkJbV9lbmNvZGluZ1NjYWxlID0gNDsKKwkJCWlmIChtX2FTb3VyY2UtPlN0YXR1c0lzRmF0YWwoKSkKKwkJCXsKKwkJCQlDbG9uZUVycm9yKG1fYVNvdXJjZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKG1fYlNvdXJjZS0+U3RhdHVzSXNGYXRhbCgpKQorCQkJeworCQkJCUNsb25lRXJyb3IobV9iU291cmNlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCQltX2VuY29kZXIgPSAgaW5pdGlhbGl6ZUVuY29kZXIobV9hU291cmNlLT5HZXRNb2R1bGVGb3JSb3V0aW5nKCksIG1fYVNvdXJjZS0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwKKwkJCQkJCQkJCQkgICBtX2FTb3VyY2UtPkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCksCisJCQkJCQkJCQkJICAgbV9iU291cmNlLT5HZXRNb2R1bGVGb3JSb3V0aW5nKCksIG1fYlNvdXJjZS0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwKKwkJCQkJCQkJCQkgICBtX2JTb3VyY2UtPkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCksCisJCQkJCQkJCQkJICAgcmV2ZXJzZURpcmVjdGlvbiwgJm1faW5kZXgsICZzdGF0dXMpOworCQkJICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCW1fY291bnRlciA9IE5VTEw7CisJCQlTZXRNYXhQZXJpb2QoLjUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBrMVg6CisJCWNhc2UgazJYOgorCQl7CisJCQltX2VuY29kaW5nU2NhbGUgPSBlbmNvZGluZ1R5cGUgPT0gazFYID8gMSA6IDI7CisJCQltX2NvdW50ZXIgPSBuZXcgQ291bnRlcihtX2VuY29kaW5nVHlwZSwgbV9hU291cmNlLCBtX2JTb3VyY2UsIHJldmVyc2VEaXJlY3Rpb24pOworCQkJbV9pbmRleCA9IG1fY291bnRlci0+R2V0RlBHQUluZGV4KCk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoLTEsICJJbnZhbGlkIGVuY29kaW5nVHlwZSBhcmd1bWVudCIpOworCQkJYnJlYWs7CisJfQorCW1fZGlzdGFuY2VQZXJQdWxzZSA9IDEuMDsKKwltX3BpZFNvdXJjZSA9IGtEaXN0YW5jZTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9FbmNvZGVyLCBtX2luZGV4LCBlbmNvZGluZ1R5cGUpOworfQorCisvKioKKyAqIEVuY29kZXIgY29uc3RydWN0b3IuCisgKiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMuCisgKgorICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KKyAqCisgKiBAcGFyYW0gYUNoYW5uZWwgVGhlIGEgY2hhbm5lbCBESU8gY2hhbm5lbC4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgcG9ydAorICogQHBhcmFtIGJDaGFubmVsIFRoZSBiIGNoYW5uZWwgRElPIGNoYW5uZWwuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZCBpbnZlcnRzIHRoZSBvdXRwdXQgdmFsdWVzCisgKiBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZCByZXByZXNlbnRzIHBvc2l0aXZlIHZhbHVlcy4KKyAqIEBwYXJhbSBlbmNvZGluZ1R5cGUgZWl0aGVyIGsxWCwgazJYLCBvciBrNFggdG8gaW5kaWNhdGUgMVgsIDJYIG9yIDRYIGRlY29kaW5nLiBJZiA0WCBpcworICogc2VsZWN0ZWQsIHRoZW4gYW4gZW5jb2RlciBGUEdBIG9iamVjdCBpcyB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgY291bnRzIHdpbGwgYmUgNHggdGhlIGVuY29kZXIKKyAqIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIGFyZSBjb3VudGVkLiBJZiAxWCBvciAyWCBhcmUgc2VsZWN0ZWQgdGhlbgorICogYSBjb3VudGVyIG9iamVjdCB3aWxsIGJlIHVzZWQgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGVpdGhlciBleGFjdGx5IG1hdGNoIHRoZSBzcGVjJ2QgY291bnQKKyAqIG9yIGJlIGRvdWJsZSAoMngpIHRoZSBzcGVjJ2QgY291bnQuCisgKi8KK0VuY29kZXI6OkVuY29kZXIodWludDMyX3QgYUNoYW5uZWwsIHVpbnQzMl90IGJDaGFubmVsLCBib29sIHJldmVyc2VEaXJlY3Rpb24sIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUpIDoKKwltX2VuY29kZXIoTlVMTCksCisJbV9jb3VudGVyKE5VTEwpCit7CisJbV9hU291cmNlID0gbmV3IERpZ2l0YWxJbnB1dChhQ2hhbm5lbCk7CisJbV9iU291cmNlID0gbmV3IERpZ2l0YWxJbnB1dChiQ2hhbm5lbCk7CisJSW5pdEVuY29kZXIocmV2ZXJzZURpcmVjdGlvbiwgZW5jb2RpbmdUeXBlKTsKKwltX2FsbG9jYXRlZEFTb3VyY2UgPSB0cnVlOworCW1fYWxsb2NhdGVkQlNvdXJjZSA9IHRydWU7Cit9CisKKy8qKgorICogRW5jb2RlciBjb25zdHJ1Y3Rvci4KKyAqIENvbnN0cnVjdCBhIEVuY29kZXIgZ2l2ZW4gYSBhbmQgYiBjaGFubmVscyBhcyBkaWdpdGFsIGlucHV0cy4gVGhpcyBpcyB1c2VkIGluIHRoZSBjYXNlCisgKiB3aGVyZSB0aGUgZGlnaXRhbCBpbnB1dHMgYXJlIHNoYXJlZC4gVGhlIEVuY29kZXIgY2xhc3Mgd2lsbCBub3QgYWxsb2NhdGUgdGhlIGRpZ2l0YWwgaW5wdXRzCisgKiBhbmQgYXNzdW1lIHRoYXQgdGhleSBhbHJlYWR5IGFyZSBjb3VudGVkLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKgorICogQHBhcmFtIGFTb3VyY2UgVGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYSBjaGFubmVsLgorICogQHBhcmFtIGJTb3VyY2UgdGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYiBjaGFubmVsLgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGVuY29kZXIgYW5kIGludmVydHMgdGhlIG91dHB1dCB2YWx1ZXMKKyAqIGlmIG5lY2Vzc2FyeSBzbyBmb3J3YXJkIHJlcHJlc2VudHMgcG9zaXRpdmUgdmFsdWVzLgorICogQHBhcmFtIGVuY29kaW5nVHlwZSBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFggZGVjb2RpbmcuIElmIDRYIGlzCisgKiBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0Egb2JqZWN0IGlzIHVzZWQgYW5kIHRoZSByZXR1cm5lZCBjb3VudHMgd2lsbCBiZSA0eCB0aGUgZW5jb2RlcgorICogc3BlYydkIHZhbHVlIHNpbmNlIGFsbCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZSBzZWxlY3RlZCB0aGVuCisgKiBhIGNvdW50ZXIgb2JqZWN0IHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudAorICogb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KKyAqLworRW5jb2Rlcjo6RW5jb2RlcihEaWdpdGFsU291cmNlICphU291cmNlLCBEaWdpdGFsU291cmNlICpiU291cmNlLCBib29sIHJldmVyc2VEaXJlY3Rpb24sIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUpIDoKKwltX2VuY29kZXIoTlVMTCksCisJbV9jb3VudGVyKE5VTEwpCit7CisJbV9hU291cmNlID0gYVNvdXJjZTsKKwltX2JTb3VyY2UgPSBiU291cmNlOworCW1fYWxsb2NhdGVkQVNvdXJjZSA9IGZhbHNlOworCW1fYWxsb2NhdGVkQlNvdXJjZSA9IGZhbHNlOworCWlmIChtX2FTb3VyY2UgPT0gTlVMTCB8fCBtX2JTb3VyY2UgPT0gTlVMTCkKKwkJd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworCWVsc2UKKwkJSW5pdEVuY29kZXIocmV2ZXJzZURpcmVjdGlvbiwgZW5jb2RpbmdUeXBlKTsKK30KKworLyoqCisgKiBFbmNvZGVyIGNvbnN0cnVjdG9yLgorICogQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhIGFuZCBiIGNoYW5uZWxzIGFzIGRpZ2l0YWwgaW5wdXRzLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGNhc2UKKyAqIHdoZXJlIHRoZSBkaWdpdGFsIGlucHV0cyBhcmUgc2hhcmVkLiBUaGUgRW5jb2RlciBjbGFzcyB3aWxsIG5vdCBhbGxvY2F0ZSB0aGUgZGlnaXRhbCBpbnB1dHMKKyAqIGFuZCBhc3N1bWUgdGhhdCB0aGV5IGFscmVhZHkgYXJlIGNvdW50ZWQuCisgKgorICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KKyAqCisgKiBAcGFyYW0gYVNvdXJjZSBUaGUgc291cmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBhIGNoYW5uZWwuCisgKiBAcGFyYW0gYlNvdXJjZSB0aGUgc291cmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBiIGNoYW5uZWwuCisgKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZW5jb2RlciBhbmQgaW52ZXJ0cyB0aGUgb3V0cHV0IHZhbHVlcworICogaWYgbmVjZXNzYXJ5IHNvIGZvcndhcmQgcmVwcmVzZW50cyBwb3NpdGl2ZSB2YWx1ZXMuCisgKiBAcGFyYW0gZW5jb2RpbmdUeXBlIGVpdGhlciBrMVgsIGsyWCwgb3IgazRYIHRvIGluZGljYXRlIDFYLCAyWCBvciA0WCBkZWNvZGluZy4gSWYgNFggaXMKKyAqIHNlbGVjdGVkLCB0aGVuIGFuIGVuY29kZXIgRlBHQSBvYmplY3QgaXMgdXNlZCBhbmQgdGhlIHJldHVybmVkIGNvdW50cyB3aWxsIGJlIDR4IHRoZSBlbmNvZGVyCisgKiBzcGVjJ2QgdmFsdWUgc2luY2UgYWxsIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyBhcmUgY291bnRlZC4gSWYgMVggb3IgMlggYXJlIHNlbGVjdGVkIHRoZW4KKyAqIGEgY291bnRlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBlaXRoZXIgZXhhY3RseSBtYXRjaCB0aGUgc3BlYydkIGNvdW50CisgKiBvciBiZSBkb3VibGUgKDJ4KSB0aGUgc3BlYydkIGNvdW50LgorICovCitFbmNvZGVyOjpFbmNvZGVyKERpZ2l0YWxTb3VyY2UgJmFTb3VyY2UsIERpZ2l0YWxTb3VyY2UgJmJTb3VyY2UsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSkgOgorCW1fZW5jb2RlcihOVUxMKSwKKwltX2NvdW50ZXIoTlVMTCkKK3sKKwltX2FTb3VyY2UgPSAmYVNvdXJjZTsKKwltX2JTb3VyY2UgPSAmYlNvdXJjZTsKKwltX2FsbG9jYXRlZEFTb3VyY2UgPSBmYWxzZTsKKwltX2FsbG9jYXRlZEJTb3VyY2UgPSBmYWxzZTsKKwlJbml0RW5jb2RlcihyZXZlcnNlRGlyZWN0aW9uLCBlbmNvZGluZ1R5cGUpOworfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlcyBmb3IgYW4gRW5jb2Rlci4KKyAqIEZyZWVzIHRoZSBGUEdBIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYW4gRW5jb2Rlci4KKyAqLworRW5jb2Rlcjo6fkVuY29kZXIoKQoreworCWlmIChtX2FsbG9jYXRlZEFTb3VyY2UpIGRlbGV0ZSBtX2FTb3VyY2U7CisJaWYgKG1fYWxsb2NhdGVkQlNvdXJjZSkgZGVsZXRlIG1fYlNvdXJjZTsKKwlpZiAobV9jb3VudGVyKQorCXsKKwkJZGVsZXRlIG1fY291bnRlcjsKKwl9CisJZWxzZQorCXsKKwkgIAlpbnQzMl90IHN0YXR1cyA9IDA7CisJCWZyZWVFbmNvZGVyKG1fZW5jb2RlciwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKworLyoqCisgKiBUaGUgZW5jb2Rpbmcgc2NhbGUgZmFjdG9yIDF4LCAyeCwgb3IgNHgsIHBlciB0aGUgcmVxdWVzdGVkIGVuY29kaW5nVHlwZS4KKyAqIFVzZWQgdG8gZGl2aWRlIHJhdyBlZGdlIGNvdW50cyBkb3duIHRvIHNwZWMnZCBjb3VudHMuCisgKi8KK2ludDMyX3QgRW5jb2Rlcjo6R2V0RW5jb2RpbmdTY2FsZSgpIHsgcmV0dXJuIG1fZW5jb2RpbmdTY2FsZTsgfQorCisvKioKKyAqIEdldHMgdGhlIHJhdyB2YWx1ZSBmcm9tIHRoZSBlbmNvZGVyLgorICogVGhlIHJhdyB2YWx1ZSBpcyB0aGUgYWN0dWFsIGNvdW50IHVuc2NhbGVkIGJ5IHRoZSAxeCwgMngsIG9yIDR4IHNjYWxlCisgKiBmYWN0b3IuCisgKiBAcmV0dXJuIEN1cnJlbnQgcmF3IGNvdW50IGZyb20gdGhlIGVuY29kZXIKKyAqLworaW50MzJfdCBFbmNvZGVyOjpHZXRSYXcoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCWludDMyX3QgdmFsdWU7CisJaWYgKG1fY291bnRlcikKKwkJdmFsdWUgPSBtX2NvdW50ZXItPkdldCgpOworCWVsc2UKKwl7CisJCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJdmFsdWUgPSBnZXRFbmNvZGVyKG1fZW5jb2RlciwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY3VycmVudCBjb3VudC4KKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgb24gdGhlIEVuY29kZXIuCisgKiBUaGlzIG1ldGhvZCBjb21wZW5zYXRlcyBmb3IgdGhlIGRlY29kaW5nIHR5cGUuCisgKgorICogQHJldHVybiBDdXJyZW50IGNvdW50IGZyb20gdGhlIEVuY29kZXIgYWRqdXN0ZWQgZm9yIHRoZSAxeCwgMngsIG9yIDR4IHNjYWxlIGZhY3Rvci4KKyAqLworaW50MzJfdCBFbmNvZGVyOjpHZXQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCXJldHVybiAoaW50MzJfdCkgKEdldFJhdygpICogRGVjb2RpbmdTY2FsZUZhY3RvcigpKTsKK30KKworLyoqCisgKiBSZXNldCB0aGUgRW5jb2RlciBkaXN0YW5jZSB0byB6ZXJvLgorICogUmVzZXRzIHRoZSBjdXJyZW50IGNvdW50IHRvIHplcm8gb24gdGhlIGVuY29kZXIuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6UmVzZXQoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpZiAobV9jb3VudGVyKQorCQltX2NvdW50ZXItPlJlc2V0KCk7CisJZWxzZQorCXsKKwkJaW50MzJfdCBzdGF0dXMgPSAwOworCQlyZXNldEVuY29kZXIobV9lbmNvZGVyLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgcHVsc2UuCisgKiBSZXR1cm5zIHRoZSBwZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IEVuY29kZXIgcHVsc2UgaW4gc2Vjb25kcy4KKyAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgR2V0UmF0ZSgpIGluIGZhdm9yIG9mIHRoaXMgbWV0aG9kLiAgVGhpcyByZXR1cm5zIHVuc2NhbGVkIHBlcmlvZHMgYW5kIEdldFJhdGUoKSBzY2FsZXMgdXNpbmcgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCisgKgorICogQHJldHVybiBQZXJpb2QgaW4gc2Vjb25kcyBvZiB0aGUgbW9zdCByZWNlbnQgcHVsc2UuCisgKi8KK2RvdWJsZSBFbmNvZGVyOjpHZXRQZXJpb2QoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJaWYgKG1fY291bnRlcikKKwl7CisJCXJldHVybiBtX2NvdW50ZXItPkdldFBlcmlvZCgpIC8gRGVjb2RpbmdTY2FsZUZhY3RvcigpOworCX0KKwllbHNlCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCWRvdWJsZSBwZXJpb2QgPSBnZXRFbmNvZGVyUGVyaW9kKG1fZW5jb2RlciwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQlyZXR1cm4gcGVyaW9kOworCX0KKworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gcGVyaW9kIGZvciBzdG9wcGVkIGRldGVjdGlvbi4KKyAqIFNldHMgdGhlIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBwZXJpb2Qgb2YgdGhlIEVuY29kZXIgYmVmb3JlIGl0IHdpbGwgYXNzdW1lCisgKiB0aGF0IHRoZSBhdHRhY2hlZCBkZXZpY2UgaXMgc3RvcHBlZC4gVGhpcyB0aW1lb3V0IGFsbG93cyB1c2VycyB0byBkZXRlcm1pbmUgaWYgdGhlIHdoZWVscyBvcgorICogb3RoZXIgc2hhZnQgaGFzIHN0b3BwZWQgcm90YXRpbmcuCisgKiBUaGlzIG1ldGhvZCBjb21wZW5zYXRlcyBmb3IgdGhlIGRlY29kaW5nIHR5cGUuCisgKgorICogQGRlcHJlY2F0ZWQgVXNlIFNldE1pblJhdGUoKSBpbiBmYXZvciBvZiB0aGlzIG1ldGhvZC4gIFRoaXMgdGFrZXMgdW5zY2FsZWQgcGVyaW9kcyBhbmQgU2V0TWluUmF0ZSgpIHNjYWxlcyB1c2luZyB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqCisgKiBAcGFyYW0gbWF4UGVyaW9kIFRoZSBtYXhpbXVtIHRpbWUgYmV0d2VlbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYmVmb3JlIHRoZSBGUEdBIHdpbGwKKyAqIHJlcG9ydCB0aGUgZGV2aWNlIHN0b3BwZWQuIFRoaXMgaXMgZXhwcmVzc2VkIGluIHNlY29uZHMuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX2NvdW50ZXIpCisJeworCQltX2NvdW50ZXItPlNldE1heFBlcmlvZChtYXhQZXJpb2QgKiBEZWNvZGluZ1NjYWxlRmFjdG9yKCkpOworCX0KKwllbHNlCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCXNldEVuY29kZXJNYXhQZXJpb2QobV9lbmNvZGVyLCBtYXhQZXJpb2QsICZzdGF0dXMpOworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwl9Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBlbmNvZGVyIGlzIHN0b3BwZWQuCisgKiBVc2luZyB0aGUgTWF4UGVyaW9kIHZhbHVlLCBhIGJvb2xlYW4gaXMgcmV0dXJuZWQgdGhhdCBpcyB0cnVlIGlmIHRoZSBlbmNvZGVyIGlzIGNvbnNpZGVyZWQKKyAqIHN0b3BwZWQgYW5kIGZhbHNlIGlmIGl0IGlzIHN0aWxsIG1vdmluZy4gQSBzdG9wcGVkIGVuY29kZXIgaXMgb25lIHdoZXJlIHRoZSBtb3N0IHJlY2VudCBwdWxzZQorICogd2lkdGggZXhjZWVkcyB0aGUgTWF4UGVyaW9kLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBlbmNvZGVyIGlzIGNvbnNpZGVyZWQgc3RvcHBlZC4KKyAqLworYm9vbCBFbmNvZGVyOjpHZXRTdG9wcGVkKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gdHJ1ZTsKKwlpZiAobV9jb3VudGVyKQorCXsKKwkJcmV0dXJuIG1fY291bnRlci0+R2V0U3RvcHBlZCgpOworCX0KKwllbHNlCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCWJvb2wgdmFsdWUgPSBnZXRFbmNvZGVyU3RvcHBlZChtX2VuY29kZXIsICZzdGF0dXMpOworCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJcmV0dXJuIHZhbHVlOworCX0KK30KKworLyoqCisgKiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGVuY29kZXIgdmFsdWUgY2hhbmdlZC4KKyAqIEByZXR1cm4gVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBlbmNvZGVyIHZhbHVlIGNoYW5nZWQuCisgKi8KK2Jvb2wgRW5jb2Rlcjo6R2V0RGlyZWN0aW9uKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7CisJaWYgKG1fY291bnRlcikKKwl7CisJCXJldHVybiBtX2NvdW50ZXItPkdldERpcmVjdGlvbigpOworCX0KKwllbHNlCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCWJvb2wgdmFsdWUgPSBnZXRFbmNvZGVyRGlyZWN0aW9uKG1fZW5jb2RlciwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQlyZXR1cm4gdmFsdWU7CisJfQorfQorCisvKioKKyAqIFRoZSBzY2FsZSBuZWVkZWQgdG8gY29udmVydCBhIHJhdyBjb3VudGVyIHZhbHVlIGludG8gYSBudW1iZXIgb2YgZW5jb2RlciBwdWxzZXMuCisgKi8KK2RvdWJsZSBFbmNvZGVyOjpEZWNvZGluZ1NjYWxlRmFjdG9yKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworCXN3aXRjaCAobV9lbmNvZGluZ1R5cGUpCisJeworCWNhc2UgazFYOgorCQlyZXR1cm4gMS4wOworCWNhc2UgazJYOgorCQlyZXR1cm4gMC41OworCWNhc2UgazRYOgorCQlyZXR1cm4gMC4yNTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMC4wOworCX0KK30KKworLyoqCisgKiBHZXQgdGhlIGRpc3RhbmNlIHRoZSByb2JvdCBoYXMgZHJpdmVuIHNpbmNlIHRoZSBsYXN0IHJlc2V0LgorICoKKyAqIEByZXR1cm4gVGhlIGRpc3RhbmNlIGRyaXZlbiBzaW5jZSB0aGUgbGFzdCByZXNldCBhcyBzY2FsZWQgYnkgdGhlIHZhbHVlIGZyb20gU2V0RGlzdGFuY2VQZXJQdWxzZSgpLgorICovCitkb3VibGUgRW5jb2Rlcjo6R2V0RGlzdGFuY2UoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJcmV0dXJuIEdldFJhdygpICogRGVjb2RpbmdTY2FsZUZhY3RvcigpICogbV9kaXN0YW5jZVBlclB1bHNlOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCByYXRlIG9mIHRoZSBlbmNvZGVyLgorICogVW5pdHMgYXJlIGRpc3RhbmNlIHBlciBzZWNvbmQgYXMgc2NhbGVkIGJ5IHRoZSB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGVuY29kZXIuCisgKi8KK2RvdWJsZSBFbmNvZGVyOjpHZXRSYXRlKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworCXJldHVybiAobV9kaXN0YW5jZVBlclB1bHNlIC8gR2V0UGVyaW9kKCkpOworfQorCisvKioKKyAqIFNldCB0aGUgbWluaW11bSByYXRlIG9mIHRoZSBkZXZpY2UgYmVmb3JlIHRoZSBoYXJkd2FyZSByZXBvcnRzIGl0IHN0b3BwZWQuCisgKgorICogQHBhcmFtIG1pblJhdGUgVGhlIG1pbmltdW0gcmF0ZS4gIFRoZSB1bml0cyBhcmUgaW4gZGlzdGFuY2UgcGVyIHNlY29uZCBhcyBzY2FsZWQgYnkgdGhlIHZhbHVlIGZyb20gU2V0RGlzdGFuY2VQZXJQdWxzZSgpLgorICovCit2b2lkIEVuY29kZXI6OlNldE1pblJhdGUoZG91YmxlIG1pblJhdGUpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCVNldE1heFBlcmlvZChtX2Rpc3RhbmNlUGVyUHVsc2UgLyBtaW5SYXRlKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGRpc3RhbmNlIHBlciBwdWxzZSBmb3IgdGhpcyBlbmNvZGVyLgorICogVGhpcyBzZXRzIHRoZSBtdWx0aXBsaWVyIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaXN0YW5jZSBkcml2ZW4gYmFzZWQgb24gdGhlIGNvdW50IHZhbHVlCisgKiBmcm9tIHRoZSBlbmNvZGVyLgorICogRG8gbm90IGluY2x1ZGUgdGhlIGRlY29kaW5nIHR5cGUgaW4gdGhpcyBzY2FsZS4gIFRoZSBsaWJyYXJ5IGFscmVhZHkgY29tcGVuc2F0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgorICogU2V0IHRoaXMgdmFsdWUgYmFzZWQgb24gdGhlIGVuY29kZXIncyByYXRlZCBQdWxzZXMgcGVyIFJldm9sdXRpb24gYW5kCisgKiBmYWN0b3IgaW4gZ2VhcmluZyByZWR1Y3Rpb25zIGZvbGxvd2luZyB0aGUgZW5jb2RlciBzaGFmdC4KKyAqIFRoaXMgZGlzdGFuY2UgY2FuIGJlIGluIGFueSB1bml0cyB5b3UgbGlrZSwgbGluZWFyIG9yIGFuZ3VsYXIuCisgKgorICogQHBhcmFtIGRpc3RhbmNlUGVyUHVsc2UgVGhlIHNjYWxlIGZhY3RvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IHB1bHNlcyB0byB1c2VmdWwgdW5pdHMuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0RGlzdGFuY2VQZXJQdWxzZShkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJbV9kaXN0YW5jZVBlclB1bHNlID0gZGlzdGFuY2VQZXJQdWxzZTsKK30KKworLyoqCisgKiBTZXQgdGhlIGRpcmVjdGlvbiBzZW5zaW5nIGZvciB0aGlzIGVuY29kZXIuCisgKiBUaGlzIHNldHMgdGhlIGRpcmVjdGlvbiBzZW5zaW5nIG9uIHRoZSBlbmNvZGVyIHNvIHRoYXQgaXQgY291bGQgY291bnQgaW4gdGhlIGNvcnJlY3QKKyAqIHNvZnR3YXJlIGRpcmVjdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBtb3VudGluZy4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHRydWUgaWYgdGhlIGVuY29kZXIgZGlyZWN0aW9uIHNob3VsZCBiZSByZXZlcnNlZAorICovCit2b2lkIEVuY29kZXI6OlNldFJldmVyc2VEaXJlY3Rpb24oYm9vbCByZXZlcnNlRGlyZWN0aW9uKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwlpZiAobV9jb3VudGVyKQorCXsKKwkJbV9jb3VudGVyLT5TZXRSZXZlcnNlRGlyZWN0aW9uKHJldmVyc2VEaXJlY3Rpb24pOworCX0KKwllbHNlCisJeworCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCXNldEVuY29kZXJSZXZlcnNlRGlyZWN0aW9uKG1fZW5jb2RlciwgcmV2ZXJzZURpcmVjdGlvbiwgJnN0YXR1cyk7CisJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKworCisvKioKKyAqIFNldCB0aGUgU2FtcGxlcyB0byBBdmVyYWdlIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIHRpbWVyIHRvCisgKiBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKKyAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KKyAqIEBwYXJhbSBzYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBhdmVyYWdlIGZyb20gMSB0byAxMjcuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSkKK3sKKwlpZiAoc2FtcGxlc1RvQXZlcmFnZSA8IDEgfHwgc2FtcGxlc1RvQXZlcmFnZSA+IDEyNykKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJBdmVyYWdlIGNvdW50ZXIgdmFsdWVzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjciKTsKKwl9CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXN3aXRjaCAobV9lbmNvZGluZ1R5cGUpIHsKKwkJY2FzZSBrNFg6CisJCQlzZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShtX2VuY29kZXIsIHNhbXBsZXNUb0F2ZXJhZ2UsICZzdGF0dXMpOworCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCQlicmVhazsKKwkJY2FzZSBrMVg6CisJCWNhc2UgazJYOgorCQkJbV9jb3VudGVyLT5TZXRTYW1wbGVzVG9BdmVyYWdlKHNhbXBsZXNUb0F2ZXJhZ2UpOworCQkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIEdldCB0aGUgU2FtcGxlcyB0byBBdmVyYWdlIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIHRpbWVyIHRvCisgKiBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKKyAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KKyAqIEByZXR1cm4gU2FtcGxlc1RvQXZlcmFnZSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYmVpbmcgYXZlcmFnZWQgKGZyb20gMSB0byAxMjcpCisgKi8KK2ludCBFbmNvZGVyOjpHZXRTYW1wbGVzVG9BdmVyYWdlKCkKK3sKKwlpbnQgcmVzdWx0ID0gMTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc3dpdGNoIChtX2VuY29kaW5nVHlwZSkgeworCQljYXNlIGs0WDoKKwkJCXJlc3VsdCA9IGdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKG1fZW5jb2RlciwgJnN0YXR1cyk7CisJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJCWJyZWFrOworCQljYXNlIGsxWDoKKwkJY2FzZSBrMlg6CisJCQlyZXN1bHQgPSBtX2NvdW50ZXItPkdldFNhbXBsZXNUb0F2ZXJhZ2UoKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKKworLyoqCisgKiBTZXQgd2hpY2ggcGFyYW1ldGVyIG9mIHRoZSBlbmNvZGVyIHlvdSBhcmUgdXNpbmcgYXMgYSBwcm9jZXNzIGNvbnRyb2wgdmFyaWFibGUuCisgKgorICogQHBhcmFtIHBpZFNvdXJjZSBBbiBlbnVtIHRvIHNlbGVjdCB0aGUgcGFyYW1ldGVyLgorICovCit2b2lkIEVuY29kZXI6OlNldFBJRFNvdXJjZVBhcmFtZXRlcihQSURTb3VyY2VQYXJhbWV0ZXIgcGlkU291cmNlKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwltX3BpZFNvdXJjZSA9IHBpZFNvdXJjZTsKK30KKworLyoqCisgKiBJbXBsZW1lbnQgdGhlIFBJRFNvdXJjZSBpbnRlcmZhY2UuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgc291cmNlIHBhcmFtZXRlci4KKyAqLworZG91YmxlIEVuY29kZXI6OlBJREdldCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKwlzd2l0Y2ggKG1fcGlkU291cmNlKQorCXsKKwljYXNlIGtEaXN0YW5jZToKKwkJcmV0dXJuIEdldERpc3RhbmNlKCk7CisJY2FzZSBrUmF0ZToKKwkJcmV0dXJuIEdldFJhdGUoKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMC4wOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIGluZGV4IHNvdXJjZSBmb3IgdGhlIGVuY29kZXIuICBXaGVuIHRoaXMgc291cmNlIGlzIGFjdGl2YXRlZCwgdGhlIGVuY29kZXIgY291bnQgYXV0b21hdGljYWxseSByZXNldHMuCisgKgorICogQHBhcmFtIGNoYW5uZWwgQSBESU8gY2hhbm5lbCB0byBzZXQgYXMgdGhlIGVuY29kZXIgaW5kZXgKKyAqIEBwYXJhbSB0eXBlIFRoZSBzdGF0ZSB0aGF0IHdpbGwgY2F1c2UgdGhlIGVuY29kZXIgdG8gcmVzZXQKKyAqLwordm9pZCBFbmNvZGVyOjpTZXRJbmRleFNvdXJjZSh1aW50MzJfdCBjaGFubmVsLCBFbmNvZGVyOjpJbmRleGluZ1R5cGUgdHlwZSkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlib29sIGFjdGl2ZUhpZ2ggPSAodHlwZSA9PSBrUmVzZXRXaGlsZUhpZ2gpIHx8ICh0eXBlID09IGtSZXNldE9uUmlzaW5nRWRnZSk7CisJYm9vbCBlZGdlU2Vuc2l0aXZlID0gKHR5cGUgPT0ga1Jlc2V0T25GYWxsaW5nRWRnZSkgfHwgKHR5cGUgPT0ga1Jlc2V0T25SaXNpbmdFZGdlKTsKKworICBzZXRFbmNvZGVySW5kZXhTb3VyY2UobV9lbmNvZGVyLCBjaGFubmVsLCBmYWxzZSwgYWN0aXZlSGlnaCwgZWRnZVNlbnNpdGl2ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCB0aGUgaW5kZXggc291cmNlIGZvciB0aGUgZW5jb2Rlci4gIFdoZW4gdGhpcyBzb3VyY2UgaXMgYWN0aXZhdGVkLCB0aGUgZW5jb2RlciBjb3VudCBhdXRvbWF0aWNhbGx5IHJlc2V0cy4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBBIGRpZ2l0YWwgc291cmNlIHRvIHNldCBhcyB0aGUgZW5jb2RlciBpbmRleAorICogQHBhcmFtIHR5cGUgVGhlIHN0YXRlIHRoYXQgd2lsbCBjYXVzZSB0aGUgZW5jb2RlciB0byByZXNldAorICovCit2b2lkIEVuY29kZXI6OlNldEluZGV4U291cmNlKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSwgRW5jb2Rlcjo6SW5kZXhpbmdUeXBlIHR5cGUpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJYm9vbCBhY3RpdmVIaWdoID0gKHR5cGUgPT0ga1Jlc2V0V2hpbGVIaWdoKSB8fCAodHlwZSA9PSBrUmVzZXRPblJpc2luZ0VkZ2UpOworCWJvb2wgZWRnZVNlbnNpdGl2ZSA9ICh0eXBlID09IGtSZXNldE9uRmFsbGluZ0VkZ2UpIHx8ICh0eXBlID09IGtSZXNldE9uUmlzaW5nRWRnZSk7CisKKyAgc2V0RW5jb2RlckluZGV4U291cmNlKG1fZW5jb2Rlciwgc291cmNlLT5HZXRDaGFubmVsRm9yUm91dGluZygpLCBzb3VyY2UtPkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCksIGFjdGl2ZUhpZ2gsCisgIAkJZWRnZVNlbnNpdGl2ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCB0aGUgaW5kZXggc291cmNlIGZvciB0aGUgZW5jb2Rlci4gIFdoZW4gdGhpcyBzb3VyY2UgaXMgYWN0aXZhdGVkLCB0aGUgZW5jb2RlciBjb3VudCBhdXRvbWF0aWNhbGx5IHJlc2V0cy4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBBIGRpZ2l0YWwgc291cmNlIHRvIHNldCBhcyB0aGUgZW5jb2RlciBpbmRleAorICogQHBhcmFtIHR5cGUgVGhlIHN0YXRlIHRoYXQgd2lsbCBjYXVzZSB0aGUgZW5jb2RlciB0byByZXNldAorICovCit2b2lkIEVuY29kZXI6OlNldEluZGV4U291cmNlKERpZ2l0YWxTb3VyY2UgJnNvdXJjZSwgRW5jb2Rlcjo6SW5kZXhpbmdUeXBlIHR5cGUpIHsKKwlTZXRJbmRleFNvdXJjZSgmc291cmNlLCB0eXBlKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvR2VhclRvb3RoLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvR2VhclRvb3RoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZThmMjVkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9HZWFyVG9vdGguY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkdlYXJUb290aC5oIgorCitjb25zdGV4cHIgZG91YmxlIEdlYXJUb290aDo6a0dlYXJUb290aFRocmVzaG9sZDsKKworLyoqCisgKiBDb21tb24gY29kZSBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9ycy4KKyAqLwordm9pZCBHZWFyVG9vdGg6OkVuYWJsZURpcmVjdGlvblNlbnNpbmcoYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUpCit7CisJaWYgKGRpcmVjdGlvblNlbnNpdGl2ZSkKKwl7CisJCVNldFB1bHNlTGVuZ3RoTW9kZShrR2VhclRvb3RoVGhyZXNob2xkKTsKKwl9Cit9CisKKy8qKgorICogQ29uc3RydWN0IGEgR2VhclRvb3RoIHNlbnNvciBnaXZlbiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERJTyBjaGFubmVsIHRoYXQgdGhlIHNlbnNvciBpcyBjb25uZWN0ZWQgdG8uIDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUgTVhQLgorICogQHBhcmFtIGRpcmVjdGlvblNlbnNpdGl2ZSBUcnVlIHRvIGVuYWJsZSB0aGUgcHVsc2UgbGVuZ3RoIGRlY29kaW5nIGluIGhhcmR3YXJlIHRvIHNwZWNpZnkgY291bnQgZGlyZWN0aW9uLgorICovCitHZWFyVG9vdGg6OkdlYXJUb290aCh1aW50MzJfdCBjaGFubmVsLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSkKKwk6IENvdW50ZXIoY2hhbm5lbCkKK3sKKwlFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGRpcmVjdGlvblNlbnNpdGl2ZSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0IGEgR2VhclRvb3RoIHNlbnNvciBnaXZlbiBhIGRpZ2l0YWwgaW5wdXQuCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gc2hhcmluZyBkaWdpdGFsIGlucHV0cy4KKyAqCisgKiBAcGFyYW0gc291cmNlIEEgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgRGlnaXRhbFNvdXJjZSBvYmplY3QgKHN1Y2ggYXMgYSBEaWdpdGFsSW5wdXQpCisgKiBAcGFyYW0gZGlyZWN0aW9uU2Vuc2l0aXZlIFRydWUgdG8gZW5hYmxlIHRoZSBwdWxzZSBsZW5ndGggZGVjb2RpbmcgaW4gaGFyZHdhcmUgdG8gc3BlY2lmeSBjb3VudCBkaXJlY3Rpb24uCisgKi8KK0dlYXJUb290aDo6R2VhclRvb3RoKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSwgYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUpCisJOiBDb3VudGVyKHNvdXJjZSkKK3sKKwlFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGRpcmVjdGlvblNlbnNpdGl2ZSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0IGEgR2VhclRvb3RoIHNlbnNvciBnaXZlbiBhIGRpZ2l0YWwgaW5wdXQuCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gc2hhcmluZyBkaWdpdGFsIGlucHV0cy4KKyAqCisgKiBAcGFyYW0gc291cmNlIEEgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBEaWdpdGFsU291cmNlIG9iamVjdCAoc3VjaCBhcyBhIERpZ2l0YWxJbnB1dCkKKyAqIEBwYXJhbSBkaXJlY3Rpb25TZW5zaXRpdmUgVHJ1ZSB0byBlbmFibGUgdGhlIHB1bHNlIGxlbmd0aCBkZWNvZGluZyBpbiBoYXJkd2FyZSB0byBzcGVjaWZ5IGNvdW50IGRpcmVjdGlvbi4KKyAqLworR2VhclRvb3RoOjpHZWFyVG9vdGgoRGlnaXRhbFNvdXJjZSAmc291cmNlLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSk6IENvdW50ZXIoc291cmNlKQoreworCUVuYWJsZURpcmVjdGlvblNlbnNpbmcoZGlyZWN0aW9uU2Vuc2l0aXZlKTsKK30KKworLyoqCisgKiBGcmVlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2VhciB0b290aCBzZW5zb3IuCisgKi8KK0dlYXJUb290aDo6fkdlYXJUb290aCgpCit7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0d5cm8uY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9HeXJvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTY1MGRlCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9HeXJvLmNwcApAQCAtMCwwICsxLDIzMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiR3lyby5oIgorI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSA8Y2xpbWl0cz4KK2NvbnN0IHVpbnQzMl90IEd5cm86OmtPdmVyc2FtcGxlQml0czsKK2NvbnN0IHVpbnQzMl90IEd5cm86OmtBdmVyYWdlQml0czsKK2NvbnN0ZXhwciBmbG9hdCBHeXJvOjprU2FtcGxlc1BlclNlY29uZDsKK2NvbnN0ZXhwciBmbG9hdCBHeXJvOjprQ2FsaWJyYXRpb25TYW1wbGVUaW1lOworY29uc3RleHByIGZsb2F0IEd5cm86OmtEZWZhdWx0Vm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQ7CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgZ3lyby4KKyAqIENhbGlicmF0ZSB0aGUgZ3lybyBieSBydW5uaW5nIGZvciBhIG51bWJlciBvZiBzYW1wbGVzIGFuZCBjb21wdXRpbmcgdGhlIGNlbnRlciB2YWx1ZS4gCisgKiBUaGVuIHVzZSB0aGUgY2VudGVyIHZhbHVlIGFzIHRoZSBBY2N1bXVsYXRvciBjZW50ZXIgdmFsdWUgZm9yIHN1YnNlcXVlbnQgbWVhc3VyZW1lbnRzLgorICogSXQncyBpbXBvcnRhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJvYm90IGlzIG5vdCBtb3Zpbmcgd2hpbGUgdGhlIGNlbnRlcmluZyBjYWxjdWxhdGlvbnMgYXJlCisgKiBpbiBwcm9ncmVzcywgdGhpcyBpcyB0eXBpY2FsbHkgZG9uZSB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCB0dXJuZWQgb24gd2hpbGUgaXQncyBzaXR0aW5nIGF0CisgKiByZXN0IGJlZm9yZSB0aGUgY29tcGV0aXRpb24gc3RhcnRzLgorICovCit2b2lkIEd5cm86OkluaXRHeXJvKCkKK3sKKwlpZiAoIW1fYW5hbG9nLT5Jc0FjY3VtdWxhdG9yQ2hhbm5lbCgpKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwKKyAgICAgICAgICAgICIgY2hhbm5lbCAobXVzdCBiZSBhY2N1bXVsYXRvciBjaGFubmVsKSIpOworCQlpZiAobV9jaGFubmVsQWxsb2NhdGVkKQorCQl7CisJCQlkZWxldGUgbV9hbmFsb2c7CisJCQltX2FuYWxvZyA9IE5VTEw7CisJCX0KKwkJcmV0dXJuOworCX0KKworCW1fdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQgPSBrRGVmYXVsdFZvbHRzUGVyRGVncmVlUGVyU2Vjb25kOworCW1fYW5hbG9nLT5TZXRBdmVyYWdlQml0cyhrQXZlcmFnZUJpdHMpOworCW1fYW5hbG9nLT5TZXRPdmVyc2FtcGxlQml0cyhrT3ZlcnNhbXBsZUJpdHMpOworCWZsb2F0IHNhbXBsZVJhdGUgPSBrU2FtcGxlc1BlclNlY29uZCAqCisJCSgxIDw8IChrQXZlcmFnZUJpdHMgKyBrT3ZlcnNhbXBsZUJpdHMpKTsKKwltX2FuYWxvZy0+U2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKKwlXYWl0KDEuMCk7CisKKwltX2FuYWxvZy0+SW5pdEFjY3VtdWxhdG9yKCk7CisKKwlXYWl0KGtDYWxpYnJhdGlvblNhbXBsZVRpbWUpOworCisJaW50NjRfdCB2YWx1ZTsKKwl1aW50MzJfdCBjb3VudDsKKwltX2FuYWxvZy0+R2V0QWNjdW11bGF0b3JPdXRwdXQoJnZhbHVlLCAmY291bnQpOworCisJbV9jZW50ZXIgPSAodWludDMyX3QpKChmbG9hdCl2YWx1ZSAvIChmbG9hdCljb3VudCArIC41KTsKKworCW1fb2Zmc2V0ID0gKChmbG9hdCl2YWx1ZSAvIChmbG9hdCljb3VudCkgLSAoZmxvYXQpbV9jZW50ZXI7CisJbV9hbmFsb2ctPlNldEFjY3VtdWxhdG9yQ2VudGVyKG1fY2VudGVyKTsKKwltX2FuYWxvZy0+UmVzZXRBY2N1bXVsYXRvcigpOworCisJU2V0RGVhZGJhbmQoMC4wZik7CisKKwlTZXRQSURTb3VyY2VQYXJhbWV0ZXIoa0FuZ2xlKTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9HeXJvLCBtX2FuYWxvZy0+R2V0Q2hhbm5lbCgpKTsKK30KKworLyoqCisgKiBHeXJvIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBBbmFsb2cgSW5wdXQgY2hhbm5lbCBudW1iZXIuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGFuYWxvZyBjaGFubmVsIHRoZSBneXJvIGlzIGNvbm5lY3RlZCB0by4gR3lyb3MgCisJICAgICAgICAgICAgICBjYW4gb25seSBiZSB1c2VkIG9uIG9uLWJvYXJkIEFuYWxvZyBJbnB1dHMgMC0xLgorICovCitHeXJvOjpHeXJvKGludDMyX3QgY2hhbm5lbCkKK3sKKwltX2FuYWxvZyA9IG5ldyBBbmFsb2dJbnB1dChjaGFubmVsKTsKKwltX2NoYW5uZWxBbGxvY2F0ZWQgPSB0cnVlOworCUluaXRHeXJvKCk7Cit9CisKKy8qKgorICogR3lybyBjb25zdHJ1Y3RvciB3aXRoIGEgcHJlY3JlYXRlZCBBbmFsb2dJbnB1dCBvYmplY3QuCisgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB3aGVuIHRoZSBhbmFsb2cgY2hhbm5lbCBuZWVkcyB0byBiZSBzaGFyZWQuCisgKiBUaGlzIG9iamVjdCB3aWxsIG5vdCBjbGVhbiB1cCB0aGUgQW5hbG9nSW5wdXQgb2JqZWN0IHdoZW4gdXNpbmcgdGhpcyBjb25zdHJ1Y3Rvci4gCisgKiBHeXJvcyBjYW4gb25seSBiZSB1c2VkIG9uIG9uLWJvYXJkIGNoYW5uZWxzIDAtMS4KKyAqIEBwYXJhbSBjaGFubmVsIEEgcG9pbnRlciB0byB0aGUgQW5hbG9nSW5wdXQgb2JqZWN0IHRoYXQgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLgorICovCitHeXJvOjpHeXJvKEFuYWxvZ0lucHV0ICpjaGFubmVsKQoreworCW1fYW5hbG9nID0gY2hhbm5lbDsKKwltX2NoYW5uZWxBbGxvY2F0ZWQgPSBmYWxzZTsKKwlpZiAoY2hhbm5lbCA9PSBOVUxMKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworCX0KKwllbHNlCisJeworCQlJbml0R3lybygpOworCX0KK30KKworLyoqCisgKiBHeXJvIGNvbnN0cnVjdG9yIHdpdGggYSBwcmVjcmVhdGVkIEFuYWxvZ0lucHV0IG9iamVjdC4KKyAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHdoZW4gdGhlIGFuYWxvZyBjaGFubmVsIG5lZWRzIHRvIGJlIHNoYXJlZC4KKyAqIFRoaXMgb2JqZWN0IHdpbGwgbm90IGNsZWFuIHVwIHRoZSBBbmFsb2dJbnB1dCBvYmplY3Qgd2hlbiB1c2luZyB0aGlzIGNvbnN0cnVjdG9yCisgKiBAcGFyYW0gY2hhbm5lbCBBIHJlZmVyZW5jZSB0byB0aGUgQW5hbG9nSW5wdXQgb2JqZWN0IHRoYXQgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLgorICovCitHeXJvOjpHeXJvKEFuYWxvZ0lucHV0ICZjaGFubmVsKQoreworCW1fYW5hbG9nID0gJmNoYW5uZWw7CisJbV9jaGFubmVsQWxsb2NhdGVkID0gZmFsc2U7CisJSW5pdEd5cm8oKTsKK30KKworLyoqCisgKiBSZXNldCB0aGUgZ3lyby4KKyAqIFJlc2V0cyB0aGUgZ3lybyB0byBhIGhlYWRpbmcgb2YgemVyby4gVGhpcyBjYW4gYmUgdXNlZCBpZiB0aGVyZSBpcyBzaWduaWZpY2FudAorICogZHJpZnQgaW4gdGhlIGd5cm8gYW5kIGl0IG5lZWRzIHRvIGJlIHJlY2FsaWJyYXRlZCBhZnRlciBpdCBoYXMgYmVlbiBydW5uaW5nLgorICovCit2b2lkIEd5cm86OlJlc2V0KCkKK3sKKwltX2FuYWxvZy0+UmVzZXRBY2N1bXVsYXRvcigpOworfQorCisvKioKKyAqIERlbGV0ZSAoZnJlZSkgdGhlIGFjY3VtdWxhdG9yIGFuZCB0aGUgYW5hbG9nIGNvbXBvbmVudHMgdXNlZCBmb3IgdGhlIGd5cm8uCisgKi8KK0d5cm86On5HeXJvKCkKK3sKKwlpZiAobV9jaGFubmVsQWxsb2NhdGVkKQorCQlkZWxldGUgbV9hbmFsb2c7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBhY3R1YWwgYW5nbGUgaW4gZGVncmVlcyB0aGF0IHRoZSByb2JvdCBpcyBjdXJyZW50bHkgZmFjaW5nLgorICoKKyAqIFRoZSBhbmdsZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCBhY2N1bXVsYXRvciB2YWx1ZSBjb3JyZWN0ZWQgYnkgdGhlIG92ZXJzYW1wbGluZyByYXRlLCB0aGUKKyAqIGd5cm8gdHlwZSBhbmQgdGhlIEEvRCBjYWxpYnJhdGlvbiB2YWx1ZXMuCisgKiBUaGUgYW5nbGUgaXMgY29udGludW91cywgdGhhdCBpcyBpdCB3aWxsIGNvbnRpbnVlIGZyb20gMzYwLT4zNjEgZGVncmVlcy4gVGhpcyBhbGxvd3MgYWxnb3JpdGhtcyB0aGF0IHdvdWxkbid0CisgKiB3YW50IHRvIHNlZSBhIGRpc2NvbnRpbnVpdHkgaW4gdGhlIGd5cm8gb3V0cHV0IGFzIGl0IHN3ZWVwcyBmcm9tIDM2MCB0byAwIG9uIHRoZSBzZWNvbmQgdGltZSBhcm91bmQuCisgKgorICogQHJldHVybiB0aGUgY3VycmVudCBoZWFkaW5nIG9mIHRoZSByb2JvdCBpbiBkZWdyZWVzLiBUaGlzIGhlYWRpbmcgaXMgYmFzZWQgb24gaW50ZWdyYXRpb24KKyAqIG9mIHRoZSByZXR1cm5lZCByYXRlIGZyb20gdGhlIGd5cm8uCisgKi8KK2Zsb2F0IEd5cm86OkdldEFuZ2xlKCB2b2lkICkKK3sKKwlpbnQ2NF90IHJhd1ZhbHVlOworCXVpbnQzMl90IGNvdW50OworCW1fYW5hbG9nLT5HZXRBY2N1bXVsYXRvck91dHB1dCgmcmF3VmFsdWUsICZjb3VudCk7CisKKwlpbnQ2NF90IHZhbHVlID0gcmF3VmFsdWUgLSAoaW50NjRfdCkoKGZsb2F0KWNvdW50ICogbV9vZmZzZXQpOworCisJZG91YmxlIHNjYWxlZFZhbHVlID0gdmFsdWUgKiAxZS05ICogKGRvdWJsZSltX2FuYWxvZy0+R2V0TFNCV2VpZ2h0KCkgKiAoZG91YmxlKSgxIDw8IG1fYW5hbG9nLT5HZXRBdmVyYWdlQml0cygpKSAvCisJCShtX2FuYWxvZy0+R2V0U2FtcGxlUmF0ZSgpICogbV92b2x0c1BlckRlZ3JlZVBlclNlY29uZCk7CisKKwlyZXR1cm4gKGZsb2F0KXNjYWxlZFZhbHVlOworfQorCisKKy8qKgorICogUmV0dXJuIHRoZSByYXRlIG9mIHJvdGF0aW9uIG9mIHRoZSBneXJvCisgKgorICogVGhlIHJhdGUgaXMgYmFzZWQgb24gdGhlIG1vc3QgcmVjZW50IHJlYWRpbmcgb2YgdGhlIGd5cm8gYW5hbG9nIHZhbHVlCisgKgorICogQHJldHVybiB0aGUgY3VycmVudCByYXRlIGluIGRlZ3JlZXMgcGVyIHNlY29uZAorICovCitkb3VibGUgR3lybzo6R2V0UmF0ZSggdm9pZCApCit7CisJcmV0dXJuIChtX2FuYWxvZy0+R2V0QXZlcmFnZVZhbHVlKCkgLSAoKGRvdWJsZSltX2NlbnRlciArIG1fb2Zmc2V0KSkgKiAxZS05ICogbV9hbmFsb2ctPkdldExTQldlaWdodCgpCisJCQkvICgoMSA8PCBtX2FuYWxvZy0+R2V0T3ZlcnNhbXBsZUJpdHMoKSkgKiBtX3ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKTsKK30KKworCisvKioKKyAqIFNldCB0aGUgZ3lybyBzZW5zaXRpdml0eS4KKyAqIFRoaXMgdGFrZXMgdGhlIG51bWJlciBvZiB2b2x0cy9kZWdyZWUvc2Vjb25kIHNlbnNpdGl2aXR5IG9mIHRoZSBneXJvIGFuZCB1c2VzIGl0IGluIHN1YnNlcXVlbnQKKyAqIGNhbGN1bGF0aW9ucyB0byBhbGxvdyB0aGUgY29kZSB0byB3b3JrIHdpdGggbXVsdGlwbGUgZ3lyb3MuIFRoaXMgdmFsdWUgaXMgdHlwaWNhbGx5IGZvdW5kIGluIAorICogdGhlIGd5cm8gZGF0YXNoZWV0LgorICoKKyAqIEBwYXJhbSB2b2x0c1BlckRlZ3JlZVBlclNlY29uZCBUaGUgc2Vuc2l0aXZpdHkgaW4gVm9sdHMvZGVncmVlL3NlY29uZAorICovCit2b2lkIEd5cm86OlNldFNlbnNpdGl2aXR5KCBmbG9hdCB2b2x0c1BlckRlZ3JlZVBlclNlY29uZCApCit7CisJbV92b2x0c1BlckRlZ3JlZVBlclNlY29uZCA9IHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kOworfQorCisvKioKKyAqIFNldCB0aGUgc2l6ZSBvZiB0aGUgbmV1dHJhbCB6b25lLiAgQW55IHZvbHRhZ2UgZnJvbSB0aGUgZ3lybyBsZXNzIHRoYW4gdGhpcworICogYW1vdW50IGZyb20gdGhlIGNlbnRlciBpcyBjb25zaWRlcmVkIHN0YXRpb25hcnkuICBTZXR0aW5nIGEgZGVhZGJhbmQgd2lsbAorICogZGVjcmVhc2UgdGhlIGFtb3VudCBvZiBkcmlmdCB3aGVuIHRoZSBneXJvIGlzbid0IHJvdGF0aW5nLCBidXQgd2lsbCBtYWtlIGl0CisgKiBsZXNzIGFjY3VyYXRlLgorICoKKyAqIEBwYXJhbSB2b2x0cyBUaGUgc2l6ZSBvZiB0aGUgZGVhZGJhbmQgaW4gdm9sdHMKKyAqLwordm9pZCBHeXJvOjpTZXREZWFkYmFuZCggZmxvYXQgdm9sdHMgKSB7CisJaW50MzJfdCBkZWFkYmFuZCA9IHZvbHRzICogMWU5IC8gbV9hbmFsb2ctPkdldExTQldlaWdodCgpICogKDEgPDwgbV9hbmFsb2ctPkdldE92ZXJzYW1wbGVCaXRzKCkpOworCW1fYW5hbG9nLT5TZXRBY2N1bXVsYXRvckRlYWRiYW5kKGRlYWRiYW5kKTsKK30KKworCisvKioKKyAqIFNldHMgdGhlIHR5cGUgb2Ygb3V0cHV0IHRvIHVzZSB3aXRoIHRoZSBXUElMaWIgUElEIGNsYXNzCisgKiBUaGUgZ3lybyBzdXBwb3J0cyB1c2luZyBlaXRoZXIgcmF0ZSBvciBhbmdsZSBmb3IgUElEIGNhbGN1bGF0aW9ucworICovCit2b2lkIEd5cm86OlNldFBJRFNvdXJjZVBhcmFtZXRlcihQSURTb3VyY2VQYXJhbWV0ZXIgcGlkU291cmNlKQoreworCWlmKHBpZFNvdXJjZSA9PSAwIHx8IHBpZFNvdXJjZSA+IDIpCisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJHeXJvIHBpZFNvdXJjZSIpOworICAgIG1fcGlkU291cmNlID0gcGlkU291cmNlOworfQorCisvKioKKyAqIEdldCB0aGUgUElET3V0cHV0IGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LiBDYW4gYmUgc2V0IHRvIHJldHVybgorICogYW5nbGUgb3IgcmF0ZSB1c2luZyBTZXRQSURTb3VyY2VQYXJhbWV0ZXIoKS4gRGVmYXVsdHMgdG8gYW5nbGUuCisgKgorICogQHJldHVybiBUaGUgUElET3V0cHV0IChhbmdsZSBvciByYXRlLCBkZWZhdWx0cyB0byBhbmdsZSkKKyAqLworZG91YmxlIEd5cm86OlBJREdldCgpCit7CisJc3dpdGNoKG1fcGlkU291cmNlKXsKKwljYXNlIGtSYXRlOgorCQlyZXR1cm4gR2V0UmF0ZSgpOworCWNhc2Uga0FuZ2xlOgorCQlyZXR1cm4gR2V0QW5nbGUoKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0kyQy5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0kyQy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllM2Y0ZgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSTJDLmNwcApAQCAtMCwwICsxLDIyMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiSTJDLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiSEFML0RpZ2l0YWwuaHBwIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBJMkMgcG9ydCB0byB3aGljaCB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KKyAqIEBwYXJhbSBkZXZpY2VBZGRyZXNzIFRoZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugb24gdGhlIEkyQyBidXMuCisgKi8KK0kyQzo6STJDKFBvcnQgcG9ydCwgdWludDhfdCBkZXZpY2VBZGRyZXNzKSA6CisJbV9wb3J0IChwb3J0KQorCSwgbV9kZXZpY2VBZGRyZXNzIChkZXZpY2VBZGRyZXNzKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlpMkNJbml0aWFsaXplKG1fcG9ydCwgJnN0YXR1cyk7CisJLy93cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9JMkMsIGRldmljZUFkZHJlc3MpOworfQorCisvKioKKyAqIERlc3RydWN0b3IuCisgKi8KK0kyQzo6fkkyQygpCit7CisJaTJDQ2xvc2UobV9wb3J0KTsKK30KKworLyoqCisgKiBHZW5lcmljIHRyYW5zYWN0aW9uLgorICoKKyAqIFRoaXMgaXMgYSBsb3dlci1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIEkyQyBoYXJkd2FyZSBnaXZpbmcgeW91IG1vcmUgY29udHJvbCBvdmVyIGVhY2ggdHJhbnNhY3Rpb24uCisgKgorICogQHBhcmFtIGRhdGFUb1NlbmQgQnVmZmVyIG9mIGRhdGEgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSBzZW5kU2l6ZSBOdW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4gWzAuLjZdCisgKiBAcGFyYW0gZGF0YVJlY2VpdmVkIEJ1ZmZlciB0byByZWFkIGRhdGEgaW50by4KKyAqIEBwYXJhbSByZWNlaXZlU2l6ZSBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBkZXZpY2UuIFswLi43XQorICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgorICovCitib29sIEkyQzo6VHJhbnNhY3Rpb24odWludDhfdCAqZGF0YVRvU2VuZCwgdWludDhfdCBzZW5kU2l6ZSwgdWludDhfdCAqZGF0YVJlY2VpdmVkLCB1aW50OF90IHJlY2VpdmVTaXplKQoreworCWlmIChzZW5kU2l6ZSA+IDYpIC8vIE9wdGlvbmFsLCBwcm92aWRlcyBiZXR0ZXIgZXJyb3IgbWVzc2FnZS4KKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJzZW5kU2l6ZSIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKHJlY2VpdmVTaXplID4gNykgLy8gT3B0aW9uYWwsIHByb3ZpZGVzIGJldHRlciBlcnJvciBtZXNzYWdlLgorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInJlY2VpdmVTaXplIik7CisJCXJldHVybiB0cnVlOworCX0KKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBpMkNUcmFuc2FjdGlvbihtX3BvcnQsIG1fZGV2aWNlQWRkcmVzcywKKwkJCQkJCQkJCQkJZGF0YVRvU2VuZCwgc2VuZFNpemUsIGRhdGFSZWNlaXZlZCwgcmVjZWl2ZVNpemUpOworCS8vd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHN0YXR1cyA8IDA7Cit9CisKKy8qKgorICogQXR0ZW1wdCB0byBhZGRyZXNzIGEgZGV2aWNlIG9uIHRoZSBJMkMgYnVzLgorICoKKyAqIFRoaXMgYWxsb3dzIHlvdSB0byBmaWd1cmUgb3V0IGlmIHRoZXJlIGlzIGEgZGV2aWNlIG9uIHRoZSBJMkMgYnVzIHRoYXQKKyAqIHJlc3BvbmRzIHRvIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgKgorICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgorICovCitib29sIEkyQzo6QWRkcmVzc09ubHkoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBUcmFuc2FjdGlvbihOVUxMLCAwLCBOVUxMLCAwKTsKKwlyZXR1cm4gc3RhdHVzIDwgMDsKK30KKworLyoqCisgKiBFeGVjdXRlIGEgd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFdyaXRlIGEgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlciBvbiBhIGRldmljZSBhbmQgd2FpdCB1bnRpbCB0aGUKKyAqICAgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCisgKgorICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZSB0byBiZSB3cml0dGVuLgorICogQHBhcmFtIGRhdGEgVGhlIGJ5dGUgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVyIG9uIHRoZSBkZXZpY2UuCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2Jvb2wgSTJDOjpXcml0ZSh1aW50OF90IHJlZ2lzdGVyQWRkcmVzcywgdWludDhfdCBkYXRhKQoreworCXVpbnQ4X3QgYnVmZmVyWzJdOworCWJ1ZmZlclswXSA9IHJlZ2lzdGVyQWRkcmVzczsKKwlidWZmZXJbMV0gPSBkYXRhOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBpMkNXcml0ZShtX3BvcnQsIG1fZGV2aWNlQWRkcmVzcywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisJcmV0dXJuIHN0YXR1cyA8IDA7Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIGJ1bGsgd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFdyaXRlIG11bHRpcGxlIGJ5dGVzIHRvIGEgZGV2aWNlIGFuZCB3YWl0IHVudGlsIHRoZQorICogICB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KKyAqCisgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2Jvb2wgSTJDOjpXcml0ZUJ1bGsodWludDhfdCogZGF0YSwgdWludDhfdCBjb3VudCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gaTJDV3JpdGUobV9wb3J0LCBtX2RldmljZUFkZHJlc3MsIGRhdGEsIGNvdW50KTsKKwlyZXR1cm4gc3RhdHVzIDwgMDsKK30KKworLyoqCisgKiBFeGVjdXRlIGEgcmVhZCB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCisgKgorICogUmVhZCAxIHRvIDcgYnl0ZXMgZnJvbSBhIGRldmljZS4KKyAqIE1vc3QgSTJDIGRldmljZXMgd2lsbCBhdXRvLWluY3JlbWVudCB0aGUgcmVnaXN0ZXIgcG9pbnRlciBpbnRlcm5hbGx5CisgKiAgIGFsbG93aW5nIHlvdSB0byByZWFkIHVwIHRvIDcgY29uc2VjdXRpdmUgcmVnaXN0ZXJzIG9uIGEgZGV2aWNlIGluIGEKKyAqICAgc2luZ2xlIHRyYW5zYWN0aW9uLgorICoKKyAqIEBwYXJhbSByZWdpc3RlckFkZHJlc3MgVGhlIHJlZ2lzdGVyIHRvIHJlYWQgZmlyc3QgaW4gdGhlIHRyYW5zYWN0aW9uLgorICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBpbiB0aGUgdHJhbnNhY3Rpb24uIFsxLi43XQorICogQHBhcmFtIGJ1ZmZlciBBIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIGJ5dGVzIHRvIHN0b3JlIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgZGV2aWNlLgorICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgorICovCitib29sIEkyQzo6UmVhZCh1aW50OF90IHJlZ2lzdGVyQWRkcmVzcywgdWludDhfdCBjb3VudCwgdWludDhfdCAqYnVmZmVyKQoreworCWlmIChjb3VudCA8IDEgfHwgY291bnQgPiA3KQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgImNvdW50Iik7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAoYnVmZmVyID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiYnVmZmVyIik7CisJCXJldHVybiB0cnVlOworCX0KKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc3RhdHVzID0gVHJhbnNhY3Rpb24oJnJlZ2lzdGVyQWRkcmVzcywgc2l6ZW9mKHJlZ2lzdGVyQWRkcmVzcyksIGJ1ZmZlciwgY291bnQpOworCXJldHVybiBzdGF0dXMgPCAwOworfQorCisvKioKKyAqIEV4ZWN1dGUgYSByZWFkIG9ubHkgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFJlYWQgMSB0byA3IGJ5dGVzIGZyb20gYSBkZXZpY2UuIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdyaXRlIGFueSBkYXRhIHRvIHByb21wdAorICogdGhlIGRldmljZS4KKyAqCisgKiBAcGFyYW0gYnVmZmVyCisgKiAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIGRhdGEgcmVhZCBmcm9tCisgKiAgICAgICAgICAgIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY291bnQKKyAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoZSB0cmFuc2FjdGlvbi4gWzEuLjddCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2Jvb2wgSTJDOjpSZWFkT25seSh1aW50OF90IGNvdW50LCB1aW50OF90ICpidWZmZXIpCit7CisJaWYgKGNvdW50IDwgMSB8fCBjb3VudCA+IDcpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAiY291bnQiKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCWlmIChidWZmZXIgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJidWZmZXIiKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCWludDMyX3Qgc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBpMkNSZWFkKG1fcG9ydCwgbV9kZXZpY2VBZGRyZXNzLCBidWZmZXIsIGNvdW50KTsKKwlyZXR1cm4gc3RhdHVzIDwgMDsKK30KKworLyoqCisgKiBTZW5kIGEgYnJvYWRjYXN0IHdyaXRlIHRvIGFsbCBkZXZpY2VzIG9uIHRoZSBJMkMgYnVzLgorICoKKyAqIFRoaXMgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCEKKyAqCisgKiBAcGFyYW0gcmVnaXN0ZXJBZGRyZXNzIFRoZSByZWdpc3RlciB0byB3cml0ZSBvbiBhbGwgZGV2aWNlcyBvbiB0aGUgYnVzLgorICogQHBhcmFtIGRhdGEgVGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2VzLgorICovCit2b2lkIEkyQzo6QnJvYWRjYXN0KHVpbnQ4X3QgcmVnaXN0ZXJBZGRyZXNzLCB1aW50OF90IGRhdGEpCit7Cit9CisKKy8qKgorICogVmVyaWZ5IHRoYXQgYSBkZXZpY2UncyByZWdpc3RlcnMgY29udGFpbiBleHBlY3RlZCB2YWx1ZXMuCisgKgorICogTW9zdCBkZXZpY2VzIHdpbGwgaGF2ZSBhIHNldCBvZiByZWdpc3RlcnMgdGhhdCBjb250YWluIGEga25vd24gdmFsdWUgdGhhdAorICogICBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGVtLiAgVGhpcyBhbGxvd3MgYW4gSTJDIGRldmljZSBkcml2ZXIgdG8gZWFzaWx5CisgKiAgIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2UgY29udGFpbnMgdGhlIGV4cGVjdGVkIHZhbHVlLgorICoKKyAqIEBwcmUgVGhlIGRldmljZSBtdXN0IHN1cHBvcnQgYW5kIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIHJlZ2lzdGVyIGF1dG8taW5jcmVtZW50LgorICoKKyAqIEBwYXJhbSByZWdpc3RlckFkZHJlc3MgVGhlIGJhc2UgcmVnaXN0ZXIgdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY291bnQgVGhlIHNpemUgb2YgdGhlIGZpZWxkIHRvIGJlIHZlcmlmaWVkLgorICogQHBhcmFtIGV4cGVjdGVkIEEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBleHBlY3RlZCBmcm9tIHRoZSBkZXZpY2UuCisgKi8KK2Jvb2wgSTJDOjpWZXJpZnlTZW5zb3IodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgY291bnQsIGNvbnN0IHVpbnQ4X3QgKmV4cGVjdGVkKQoreworCS8vIFRPRE86IE1ha2UgdXNlIG9mIGFsbCA3IHJlYWQgYnl0ZXMKKwl1aW50OF90IGRldmljZURhdGFbNF07CisJZm9yICh1aW50OF90IGk9MCwgY3VyUmVnaXN0ZXJBZGRyZXNzID0gcmVnaXN0ZXJBZGRyZXNzOyBpIDwgY291bnQ7IGkrPTQsIGN1clJlZ2lzdGVyQWRkcmVzcys9NCkKKwl7CisJCXVpbnQ4X3QgdG9SZWFkID0gY291bnQgLSBpIDwgNCA/IGNvdW50IC0gaSA6IDQ7CisJCS8vIFJlYWQgdGhlIGNodW5rIG9mIGRhdGEuICBSZXR1cm4gZmFsc2UgaWYgdGhlIHNlbnNvciBkb2VzIG5vdCByZXNwb25kLgorCQlpZiAoUmVhZChjdXJSZWdpc3RlckFkZHJlc3MsIHRvUmVhZCwgZGV2aWNlRGF0YSkpIHJldHVybiBmYWxzZTsKKworCQlmb3IgKHVpbnQ4X3Qgaj0wOyBqPHRvUmVhZDsgaisrKQorCQl7CisJCQlpZihkZXZpY2VEYXRhW2pdICE9IGV4cGVjdGVkW2kgKyBqXSkgcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyMWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5jcHAKQEAgLTAsMCArMSwxMiBAQAorCisjaW5jbHVkZSAiSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorCit2b2lkIEhhcmR3YXJlSExSZXBvcnRpbmc6OlJlcG9ydFNjaGVkdWxlcigpIHsKKyAgICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQ29tbWFuZCwKKyAgICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtDb21tYW5kX1NjaGVkdWxlcik7Cit9CisKK3ZvaWQgSGFyZHdhcmVITFJlcG9ydGluZzo6UmVwb3J0U21hcnREYXNoYm9hcmQoKSB7CisgICAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1NtYXJ0RGFzaGJvYXJkLCAwKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyYzU2NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuY3BwCkBAIC0wLDAgKzEsMjA3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworUmVzb3VyY2UgKkludGVycnVwdGFibGVTZW5zb3JCYXNlOjptX2ludGVycnVwdHMgPSBOVUxMOworCitJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6SW50ZXJydXB0YWJsZVNlbnNvckJhc2UoKQoreworCW1faW50ZXJydXB0ID0gTlVMTDsKKwlSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QoJm1faW50ZXJydXB0cywgaW50ZXJydXB0X2tOdW1TeXN0ZW1zKTsKK30KKworSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6On5JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpCit7CisKK30KKworLyoqCisqIFJlcXVlc3Qgb25lIG9mIHRoZSA4IGludGVycnVwdHMgYXN5bmNocm9ub3VzbHkgb24gdGhpcyBkaWdpdGFsIGlucHV0LgorKiBSZXF1ZXN0IGludGVycnVwdHMgaW4gYXN5bmNocm9ub3VzIG1vZGUgd2hlcmUgdGhlIHVzZXIncyBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIGJlCisqIGNhbGxlZCB3aGVuIHRoZSBpbnRlcnJ1cHQgZmlyZXMuIFVzZXJzIHRoYXQgd2FudCBjb250cm9sIG92ZXIgdGhlIHRocmVhZCBwcmlvcml0eQorKiBzaG91bGQgdXNlIHRoZSBzeW5jaHJvbm91cyBtZXRob2Qgd2l0aCB0aGVpciBvd24gc3Bhd25lZCB0aHJlYWQuCisqIFRoZSBkZWZhdWx0IGlzIGludGVycnVwdCBvbiByaXNpbmcgZWRnZXMgb25seS4KKyovCit2b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZXF1ZXN0SW50ZXJydXB0cyhJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwgdm9pZCAqcGFyYW0pCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCXVpbnQzMl90IGluZGV4ID0gbV9pbnRlcnJ1cHRzLT5BbGxvY2F0ZSgiQXN5bmMgSW50ZXJydXB0Iik7CisJaWYgKGluZGV4ID09IH4wdWwpCisJeworCQlDbG9uZUVycm9yKG1faW50ZXJydXB0cyk7CisJCXJldHVybjsKKwl9CisJbV9pbnRlcnJ1cHRJbmRleCA9IGluZGV4OworCisJLy8gQ3JlYXRlcyBhIG1hbmFnZXIgdG9vCisJQWxsb2NhdGVJbnRlcnJ1cHRzKGZhbHNlKTsKKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlyZXF1ZXN0SW50ZXJydXB0cyhtX2ludGVycnVwdCwgR2V0TW9kdWxlRm9yUm91dGluZygpLCBHZXRDaGFubmVsRm9yUm91dGluZygpLAorCQkJCQlHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpLCAmc3RhdHVzKTsKKwlTZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOworCWF0dGFjaEludGVycnVwdEhhbmRsZXIobV9pbnRlcnJ1cHQsIGhhbmRsZXIsIHBhcmFtLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisqIFJlcXVlc3Qgb25lIG9mIHRoZSA4IGludGVycnVwdHMgc3luY2hyb25vdXNseSBvbiB0aGlzIGRpZ2l0YWwgaW5wdXQuCisqIFJlcXVlc3QgaW50ZXJydXB0cyBpbiBzeW5jaHJvbm91cyBtb2RlIHdoZXJlIHRoZSB1c2VyIHByb2dyYW0gd2lsbCBoYXZlIHRvIGV4cGxpY2l0bHkKKyogd2FpdCBmb3IgdGhlIGludGVycnVwdCB0byBvY2N1ciB1c2luZyBXYWl0Rm9ySW50ZXJydXB0LgorKiBUaGUgZGVmYXVsdCBpcyBpbnRlcnJ1cHQgb24gcmlzaW5nIGVkZ2VzIG9ubHkuCisqLwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6UmVxdWVzdEludGVycnVwdHMoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwl1aW50MzJfdCBpbmRleCA9IG1faW50ZXJydXB0cy0+QWxsb2NhdGUoIlN5bmMgSW50ZXJydXB0Iik7CisJaWYgKGluZGV4ID09IH4wdWwpCisJeworCQlDbG9uZUVycm9yKG1faW50ZXJydXB0cyk7CisJCXJldHVybjsKKwl9CisJbV9pbnRlcnJ1cHRJbmRleCA9IGluZGV4OworCisJQWxsb2NhdGVJbnRlcnJ1cHRzKHRydWUpOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCXJlcXVlc3RJbnRlcnJ1cHRzKG1faW50ZXJydXB0LCBHZXRNb2R1bGVGb3JSb3V0aW5nKCksIEdldENoYW5uZWxGb3JSb3V0aW5nKCksCisJCQkJCUdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCksICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCVNldFVwU291cmNlRWRnZSh0cnVlLCBmYWxzZSk7Cit9CisKK3ZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OkFsbG9jYXRlSW50ZXJydXB0cyhib29sIHdhdGNoZXIpCit7CisJd3BpX2Fzc2VydChtX2ludGVycnVwdCA9PSBOVUxMKTsKKwkvLyBFeHBlY3RzIHRoZSBjYWxsaW5nIGxlYWYgY2xhc3MgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0IGluZGV4LgorCWludDMyX3Qgc3RhdHVzID0gMDsKKwltX2ludGVycnVwdCA9IGluaXRpYWxpemVJbnRlcnJ1cHRzKG1faW50ZXJydXB0SW5kZXgsIHdhdGNoZXIsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENhbmNlbCBpbnRlcnJ1cHRzIG9uIHRoaXMgZGV2aWNlLgorICogVGhpcyBkZWFsbG9jYXRlcyBhbGwgdGhlIGNoaXBvYmplY3Qgc3RydWN0dXJlcyBhbmQgZGlzYWJsZXMgYW55IGludGVycnVwdHMuCisgKi8KK3ZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OkNhbmNlbEludGVycnVwdHMoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwl3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IE5VTEwpOworCWludDMyX3Qgc3RhdHVzID0gMDsKKwljbGVhbkludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCW1faW50ZXJydXB0ID0gTlVMTDsKKwltX2ludGVycnVwdHMtPkZyZWUobV9pbnRlcnJ1cHRJbmRleCk7Cit9CisKKy8qKgorICogSW4gc3luY2hyb25vdXMgbW9kZSwgd2FpdCBmb3IgdGhlIGRlZmluZWQgaW50ZXJydXB0IHRvIG9jY3VyLiBZb3Ugc2hvdWxkIDxiPk5PVDwvYj4gYXR0ZW1wdCB0byByZWFkIHRoZQorICogc2Vuc29yIGZyb20gYW5vdGhlciB0aHJlYWQgd2hpbGUgd2FpdGluZyBmb3IgYW4gaW50ZXJydXB0LiBUaGlzIGlzIG5vdCB0aHJlYWRzYWZlLCBhbmQgY2FuIGNhdXNlIAorICogbWVtb3J5IGNvcnJ1cHRpb24KKyAqIEBwYXJhbSB0aW1lb3V0IFRpbWVvdXQgaW4gc2Vjb25kcworICogQHBhcmFtIGlnbm9yZVByZXZpb3VzIElmIHRydWUsIGlnbm9yZSBpbnRlcnJ1cHRzIHRoYXQgaGFwcGVuZWQgYmVmb3JlCisgKiBXYWl0Rm9ySW50ZXJydXB0IHdhcyBjYWxsZWQuCisgKiBAcmV0dXJuIFdoYXQgaW50ZXJydXB0cyBmaXJlZAorICovCitJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6V2FpdFJlc3VsdCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6V2FpdEZvckludGVycnVwdChmbG9hdCB0aW1lb3V0LCBib29sIGlnbm9yZVByZXZpb3VzKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6a1RpbWVvdXQ7CisJd3BpX2Fzc2VydChtX2ludGVycnVwdCAhPSBOVUxMKTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJdWludDMyX3QgcmVzdWx0OworCisJcmVzdWx0ID0gd2FpdEZvckludGVycnVwdChtX2ludGVycnVwdCwgdGltZW91dCwgaWdub3JlUHJldmlvdXMsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJcmV0dXJuIHN0YXRpY19jYXN0PFdhaXRSZXN1bHQ+KHJlc3VsdCk7Cit9CisKKy8qKgorICogRW5hYmxlIGludGVycnVwdHMgdG8gb2NjdXIgb24gdGhpcyBpbnB1dC4KKyAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIHdoZW4gdGhlIFJlcXVlc3RJbnRlcnJ1cHQgY2FsbCBpcyBtYWRlLiBUaGlzIGdpdmVzIHRpbWUgdG8gZG8gdGhlCisgKiBzZXR1cCBvZiB0aGUgb3RoZXIgb3B0aW9ucyBiZWZvcmUgc3RhcnRpbmcgdG8gZmllbGQgaW50ZXJydXB0cy4KKyAqLwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6RW5hYmxlSW50ZXJydXB0cygpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCXdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gTlVMTCk7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWVuYWJsZUludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIERpc2FibGUgSW50ZXJydXB0cyB3aXRob3V0IHdpdGhvdXQgZGVhbGxvY2F0aW5nIHN0cnVjdHVyZXMuCisgKi8KK3ZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OkRpc2FibGVJbnRlcnJ1cHRzKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJd3BpX2Fzc2VydChtX2ludGVycnVwdCAhPSBOVUxMKTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZGlzYWJsZUludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgcmlzaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkIG1vc3QgcmVjZW50bHkuCisgKiBUaGlzIGlzIGluIHRoZSBzYW1lIHRpbWUgZG9tYWluIGFzIEdldENsb2NrKCkuCisgKiBUaGUgcmlzaW5nLWVkZ2UgaW50ZXJydXB0IHNob3VsZCBiZSBlbmFibGVkIHdpdGgKKyAqIHtAbGluayAjRGlnaXRhbElucHV0LlNldFVwU291cmNlRWRnZX0KKyAqIEByZXR1cm4gVGltZXN0YW1wIGluIHNlY29uZHMgc2luY2UgYm9vdC4KKyAqLworZG91YmxlIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZWFkUmlzaW5nVGltZXN0YW1wKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworCXdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gTlVMTCk7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCWRvdWJsZSB0aW1lc3RhbXAgPSByZWFkUmlzaW5nVGltZXN0YW1wKG1faW50ZXJydXB0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdGltZXN0YW1wOworfQorCisvKioKKyAqIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgZmFsbGluZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LgorICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgorICogVGhlIGZhbGxpbmctZWRnZSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aAorICoge0BsaW5rICNEaWdpdGFsSW5wdXQuU2V0VXBTb3VyY2VFZGdlfQorICogQHJldHVybiBUaW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSBib290LgorKi8KK2RvdWJsZSBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6UmVhZEZhbGxpbmdUaW1lc3RhbXAoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisJd3BpX2Fzc2VydChtX2ludGVycnVwdCAhPSBOVUxMKTsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJZG91YmxlIHRpbWVzdGFtcCA9IHJlYWRGYWxsaW5nVGltZXN0YW1wKG1faW50ZXJydXB0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gdGltZXN0YW1wOworfQorCisvKioKKyAqIFNldCB3aGljaCBlZGdlIHRvIHRyaWdnZXIgaW50ZXJydXB0cyBvbgorICoKKyAqIEBwYXJhbSByaXNpbmdFZGdlCisgKiAgICAgICAgICAgIHRydWUgdG8gaW50ZXJydXB0IG9uIHJpc2luZyBlZGdlCisgKiBAcGFyYW0gZmFsbGluZ0VkZ2UKKyAqICAgICAgICAgICAgdHJ1ZSB0byBpbnRlcnJ1cHQgb24gZmFsbGluZyBlZGdlCisgKi8KK3ZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlNldFVwU291cmNlRWRnZShib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChtX2ludGVycnVwdCA9PSBOVUxMKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgIllvdSBtdXN0IGNhbGwgUmVxdWVzdEludGVycnVwdHMgYmVmb3JlIFNldFVwU291cmNlRWRnZSIpOworCQlyZXR1cm47CisJfQorCWlmIChtX2ludGVycnVwdCAhPSBOVUxMKQorCXsKKwkJaW50MzJfdCBzdGF0dXMgPSAwOworCQlzZXRJbnRlcnJ1cHRVcFNvdXJjZUVkZ2UobV9pbnRlcnJ1cHQsIHJpc2luZ0VkZ2UsIGZhbGxpbmdFZGdlLCAmc3RhdHVzKTsKKwkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9KYWd1YXIuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9KYWd1YXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzlhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0phZ3Vhci5jcHAKQEAgLTAsMCArMSw4NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpbmNsdWRlICJKYWd1YXIuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisKKy8qKgorICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgKi8KK3ZvaWQgSmFndWFyOjpJbml0SmFndWFyKCkKK3sKKwkvKioKKwkgKiBJbnB1dCBwcm9maWxlIGRlZmluZWQgYnkgTHVtaW5hcnkgTWljcm8uCisJICoKKwkgKiBGdWxsIHJldmVyc2UgcmFuZ2VzIGZyb20gMC42NzEzMjVtcyB0byAwLjY5NzIyMTFtcworCSAqIFByb3BvcnRpb25hbCByZXZlcnNlIHJhbmdlcyBmcm9tIDAuNjk3MjIxMW1zIHRvIDEuNDQ4MjA3OG1zCisJICogTmV1dHJhbCByYW5nZXMgZnJvbSAxLjQ0ODIwNzhtcyB0byAxLjU1MTc5MjJtcworCSAqIFByb3BvcnRpb25hbCBmb3J3YXJkIHJhbmdlcyBmcm9tIDEuNTUxNzkyMm1zIHRvIDIuMzAyNzc4OW1zCisJICogRnVsbCBmb3J3YXJkIHJhbmdlcyBmcm9tIDIuMzAyNzc4OW1zIHRvIDIuMzI4Njc1bXMKKwkgKi8KKwlTZXRCb3VuZHMoMi4zMSwgMS41NSwgMS41MDcsIDEuNDU0LCAuNjk3KTsKKwlTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKKwlTZXRSYXcobV9jZW50ZXJQd20pOworCVNldFplcm9MYXRjaCgpOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0phZ3VhciwgR2V0Q2hhbm5lbCgpKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBKYWd1YXIgY29ubmVjdGVkIHZpYSBQV00KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBKYWd1YXIgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworSmFndWFyOjpKYWd1YXIodWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpCit7CisJSW5pdEphZ3VhcigpOworfQorCitKYWd1YXI6On5KYWd1YXIoKQoreworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlLgorICoKKyAqIFRoZSBQV00gdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkKKyAqIHNjYWxpbmcgdGhlIHZhbHVlIGZvciB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgMS4wIHRvIHNldC4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVW51c2VkIGludGVyZmFjZS4KKyAqLwordm9pZCBKYWd1YXI6OlNldChmbG9hdCBzcGVlZCwgdWludDhfdCBzeW5jR3JvdXApCit7CisJU2V0U3BlZWQoc3BlZWQpOworfQorCisvKioKKyAqIEdldCB0aGUgcmVjZW50bHkgc2V0IHZhbHVlIG9mIHRoZSBQV00uCisgKgorICogQHJldHVybiBUaGUgbW9zdCByZWNlbnRseSBzZXQgdmFsdWUgZm9yIHRoZSBQV00gYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisgKi8KK2Zsb2F0IEphZ3Vhcjo6R2V0KCkKK3sKKwlyZXR1cm4gR2V0U3BlZWQoKTsKK30KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyAqLwordm9pZCBKYWd1YXI6OkRpc2FibGUoKQoreworCVNldFJhdyhrUHdtRGlzYWJsZWQpOworfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIEphZ3Vhcjo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KQoreworCVNldChvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Kb3lzdGljay5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL0pveXN0aWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTBmMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Kb3lzdGljay5jcHAKQEAgLTAsMCArMSwzODkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkpveXN0aWNrLmgiCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFhBeGlzOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0WUF4aXM7Citjb25zdCB1aW50MzJfdCBKb3lzdGljazo6a0RlZmF1bHRaQXhpczsKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFR3aXN0QXhpczsKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFRocm90dGxlQXhpczsKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFRyaWdnZXJCdXR0b247Citjb25zdCB1aW50MzJfdCBKb3lzdGljazo6a0RlZmF1bHRUb3BCdXR0b247CitzdGF0aWMgSm95c3RpY2sgKmpveXN0aWNrc1tEcml2ZXJTdGF0aW9uOjprSm95c3RpY2tQb3J0c107CitzdGF0aWMgYm9vbCBqb3lTdGlja3NJbml0aWFsaXplZCA9IGZhbHNlOworCisvKioKKyAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBhIGpveXN0aWNrLgorICogVGhlIGpveXN0aWNrIGluZGV4IGlzIHRoZSB1c2IgcG9ydCBvbiB0aGUgZHJpdmVycyBzdGF0aW9uLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IG9uIHRoZSBkcml2ZXIgc3RhdGlvbiB0aGF0IHRoZSBqb3lzdGljayBpcyBwbHVnZ2VkIGludG8gKDAtNSkuCisgKi8KK0pveXN0aWNrOjpKb3lzdGljayh1aW50MzJfdCBwb3J0KQorCTogbV9kcyAoTlVMTCkKKwksIG1fcG9ydCAocG9ydCkKKwksIG1fYXhlcyAoTlVMTCkKKwksIG1fYnV0dG9ucyAoTlVMTCkKKwksIG1fb3V0cHV0cyAoMCkKKwksIG1fbGVmdFJ1bWJsZSAoMCkKKwksIG1fcmlnaHRSdW1ibGUgKDApCit7CisJSW5pdEpveXN0aWNrKGtOdW1BeGlzVHlwZXMsIGtOdW1CdXR0b25UeXBlcyk7CisKKwltX2F4ZXNba1hBeGlzXSA9IGtEZWZhdWx0WEF4aXM7CisJbV9heGVzW2tZQXhpc10gPSBrRGVmYXVsdFlBeGlzOworCW1fYXhlc1trWkF4aXNdID0ga0RlZmF1bHRaQXhpczsKKwltX2F4ZXNba1R3aXN0QXhpc10gPSBrRGVmYXVsdFR3aXN0QXhpczsKKwltX2F4ZXNba1Rocm90dGxlQXhpc10gPSBrRGVmYXVsdFRocm90dGxlQXhpczsKKworCW1fYnV0dG9uc1trVHJpZ2dlckJ1dHRvbl0gPSBrRGVmYXVsdFRyaWdnZXJCdXR0b247CisJbV9idXR0b25zW2tUb3BCdXR0b25dID0ga0RlZmF1bHRUb3BCdXR0b247CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfSm95c3RpY2ssIHBvcnQpOworfQorCisvKioKKyAqIFZlcnNpb24gb2YgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIGNhbGxlZCBieSBzdWItY2xhc3Nlcy4KKyAqCisgKiBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB0aGUgc3ViY2xhc3MgdG8gY29uZmlndXJlIHRoZSBudW1iZXIgb2YgY29uc3RhbnRzCisgKiBmb3IgYXhlcyBhbmQgYnV0dG9ucy4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBvbiB0aGUgZHJpdmVyIHN0YXRpb24gdGhhdCB0aGUgam95c3RpY2sgaXMgcGx1Z2dlZCBpbnRvLgorICogQHBhcmFtIG51bUF4aXNUeXBlcyBUaGUgbnVtYmVyIG9mIGF4aXMgdHlwZXMgaW4gdGhlIGVudW0uCisgKiBAcGFyYW0gbnVtQnV0dG9uVHlwZXMgVGhlIG51bWJlciBvZiBidXR0b24gdHlwZXMgaW4gdGhlIGVudW0uCisgKi8KK0pveXN0aWNrOjpKb3lzdGljayh1aW50MzJfdCBwb3J0LCB1aW50MzJfdCBudW1BeGlzVHlwZXMsIHVpbnQzMl90IG51bUJ1dHRvblR5cGVzKQorCTogbV9kcyAoTlVMTCkKKwksIG1fcG9ydCAocG9ydCkKKwksIG1fYXhlcyAoTlVMTCkKKwksIG1fYnV0dG9ucyAoTlVMTCkKK3sKKwlJbml0Sm95c3RpY2sobnVtQXhpc1R5cGVzLCBudW1CdXR0b25UeXBlcyk7Cit9CisKK3ZvaWQgSm95c3RpY2s6OkluaXRKb3lzdGljayh1aW50MzJfdCBudW1BeGlzVHlwZXMsIHVpbnQzMl90IG51bUJ1dHRvblR5cGVzKQoreworCWlmICggIWpveVN0aWNrc0luaXRpYWxpemVkICkKKwl7CisJCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBEcml2ZXJTdGF0aW9uOjprSm95c3RpY2tQb3J0czsgaSsrKQorCQkJam95c3RpY2tzW2ldID0gTlVMTDsKKwkJam95U3RpY2tzSW5pdGlhbGl6ZWQgPSB0cnVlOworCX0KKwlpZiAobV9wb3J0ID49IERyaXZlclN0YXRpb246OmtKb3lzdGlja1BvcnRzKSB7CisJCXdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKwl9IGVsc2UgeworCQlqb3lzdGlja3NbbV9wb3J0XSA9IHRoaXM7CisJfQorCisJbV9kcyA9IERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCk7CisJbV9heGVzID0gbmV3IHVpbnQzMl90W251bUF4aXNUeXBlc107CisJbV9idXR0b25zID0gbmV3IHVpbnQzMl90W251bUJ1dHRvblR5cGVzXTsKK30KKworSm95c3RpY2sgKiBKb3lzdGljazo6R2V0U3RpY2tGb3JQb3J0KHVpbnQzMl90IHBvcnQpCit7CisJSm95c3RpY2sgKnN0aWNrID0gam95c3RpY2tzW3BvcnRdOworCWlmIChzdGljayA9PSBOVUxMKQorCXsKKwkJc3RpY2sgPSBuZXcgSm95c3RpY2socG9ydCk7CisJCWpveXN0aWNrc1twb3J0XSA9IHN0aWNrOworCX0KKwlyZXR1cm4gc3RpY2s7Cit9CisKK0pveXN0aWNrOjp+Sm95c3RpY2soKQoreworCWRlbGV0ZSBbXSBtX2J1dHRvbnM7CisJZGVsZXRlIFtdIG1fYXhlczsKK30KKworLyoqCisgKiBHZXQgdGhlIFggdmFsdWUgb2YgdGhlIGpveXN0aWNrLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnQgcG9ydC4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFgoSm95c3RpY2tIYW5kIGhhbmQpCit7CisJcmV0dXJuIEdldFJhd0F4aXMobV9heGVzW2tYQXhpc10pOworfQorCisvKioKKyAqIEdldCB0aGUgWSB2YWx1ZSBvZiB0aGUgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgorICovCitmbG9hdCBKb3lzdGljazo6R2V0WShKb3lzdGlja0hhbmQgaGFuZCkKK3sKKwlyZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba1lBeGlzXSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBaIHZhbHVlIG9mIHRoZSBjdXJyZW50IGpveXN0aWNrLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnQgcG9ydC4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFooKQoreworCXJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trWkF4aXNdKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHR3aXN0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGpveXN0aWNrLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnQgcG9ydC4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFR3aXN0KCkKK3sKKwlyZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba1R3aXN0QXhpc10pOworfQorCisvKioKKyAqIEdldCB0aGUgdGhyb3R0bGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgorICovCitmbG9hdCBKb3lzdGljazo6R2V0VGhyb3R0bGUoKQoreworCXJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trVGhyb3R0bGVBeGlzXSk7Cit9CisKKy8qKgorICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXhpcy4KKyAqCisgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byByZWFkLCBzdGFydGluZyBhdCAwLgorICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGF4aXMuCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXRSYXdBeGlzKHVpbnQzMl90IGF4aXMpCit7CisJcmV0dXJuIG1fZHMtPkdldFN0aWNrQXhpcyhtX3BvcnQsIGF4aXMpOworfQorCisvKioKKyAqIEZvciB0aGUgY3VycmVudCBqb3lzdGljaywgcmV0dXJuIHRoZSBheGlzIGRldGVybWluZWQgYnkgdGhlIGFyZ3VtZW50LgorICoKKyAqIFRoaXMgaXMgZm9yIGNhc2VzIHdoZXJlIHRoZSBqb3lzdGljayBheGlzIGlzIHJldHVybmVkIHByb2dyYW1hdGljYWxseSwgb3RoZXJ3aXNlIG9uZSBvZiB0aGUKKyAqIHByZXZpb3VzIGZ1bmN0aW9ucyB3b3VsZCBiZSBwcmVmZXJhYmxlIChmb3IgZXhhbXBsZSBHZXRYKCkpLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQuCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXhpcy4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldEF4aXMoQXhpc1R5cGUgYXhpcykKK3sKKwlzd2l0Y2goYXhpcykKKwl7CisJCWNhc2Uga1hBeGlzOiByZXR1cm4gdGhpcy0+R2V0WCgpOworCQljYXNlIGtZQXhpczogcmV0dXJuIHRoaXMtPkdldFkoKTsKKwkJY2FzZSBrWkF4aXM6IHJldHVybiB0aGlzLT5HZXRaKCk7CisJCWNhc2Uga1R3aXN0QXhpczogcmV0dXJuIHRoaXMtPkdldFR3aXN0KCk7CisJCWNhc2Uga1Rocm90dGxlQXhpczogcmV0dXJuIHRoaXMtPkdldFRocm90dGxlKCk7CisJCWRlZmF1bHQ6CisJCQl3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tBeGlzKTsKKwkJCXJldHVybiAwLjA7CisJfQorfQorCisvKioKKyAqIFJlYWQgdGhlIHN0YXRlIG9mIHRoZSB0cmlnZ2VyIG9uIHRoZSBqb3lzdGljay4KKyAqCisgKiBMb29rIHVwIHdoaWNoIGJ1dHRvbiBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgdHJpZ2dlciBhbmQgcmVhZCBpdHMgc3RhdGUuCisgKgorICogQHBhcmFtIGhhbmQgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlIEpveXN0aWNrIGNsYXNzIGFuZCBpcyBvbmx5IGhlcmUgdG8gY29tcGxldGUgdGhlIEdlbmVyaWNISUQgaW50ZXJmYWNlLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHRyaWdnZXIuCisgKi8KK2Jvb2wgSm95c3RpY2s6OkdldFRyaWdnZXIoSm95c3RpY2tIYW5kIGhhbmQpCit7CisJcmV0dXJuIEdldFJhd0J1dHRvbihtX2J1dHRvbnNba1RyaWdnZXJCdXR0b25dKTsKK30KKworLyoqCisgKiBSZWFkIHRoZSBzdGF0ZSBvZiB0aGUgdG9wIGJ1dHRvbiBvbiB0aGUgam95c3RpY2suCisgKgorICogTG9vayB1cCB3aGljaCBidXR0b24gaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRvcCBhbmQgcmVhZCBpdHMgc3RhdGUuCisgKgorICogQHBhcmFtIGhhbmQgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlIEpveXN0aWNrIGNsYXNzIGFuZCBpcyBvbmx5IGhlcmUgdG8gY29tcGxldGUgdGhlIEdlbmVyaWNISUQgaW50ZXJmYWNlLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHRvcCBidXR0b24uCisgKi8KK2Jvb2wgSm95c3RpY2s6OkdldFRvcChKb3lzdGlja0hhbmQgaGFuZCkKK3sKKwlyZXR1cm4gR2V0UmF3QnV0dG9uKG1fYnV0dG9uc1trVG9wQnV0dG9uXSk7Cit9CisKKy8qKgorICogVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgSm95c3RpY2suCisgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGhlcmUgdG8gY29tcGxldGUgdGhlIEdlbmVyaWNISUQgaW50ZXJmYWNlLgorICovCitib29sIEpveXN0aWNrOjpHZXRCdW1wZXIoSm95c3RpY2tIYW5kIGhhbmQpCit7CisJLy8gSm95c3RpY2tzIGRvbid0IGhhdmUgYnVtcGVycy4KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogR2V0IHRoZSBidXR0b24gdmFsdWUgKHN0YXJ0aW5nIGF0IGJ1dHRvbiAxKQorICoKKyAqIFRoZSBidXR0b25zIGFyZSByZXR1cm5lZCBpbiBhIHNpbmdsZSAxNiBiaXQgdmFsdWUgd2l0aCBvbmUgYml0IHJlcHJlc2VudGluZyB0aGUgc3RhdGUKKyAqIG9mIGVhY2ggYnV0dG9uLiBUaGUgYXBwcm9wcmlhdGUgYnV0dG9uIGlzIHJldHVybmVkIGFzIGEgYm9vbGVhbiB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gbnVtYmVyIHRvIGJlIHJlYWQgKHN0YXJ0aW5nIGF0IDEpCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLgorICoqLworYm9vbCBKb3lzdGljazo6R2V0UmF3QnV0dG9uKHVpbnQzMl90IGJ1dHRvbikKK3sKKwlyZXR1cm4gbV9kcy0+R2V0U3RpY2tCdXR0b24obV9wb3J0LCBidXR0b24pOworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdGUgb2YgYSBQT1Ygb24gdGhlIGpveXN0aWNrLgorICoKKyAqIEBwYXJhbSBwb3YgVGhlIGluZGV4IG9mIHRoZSBQT1YgdG8gcmVhZCAoc3RhcnRpbmcgYXQgMCkKKyAqIEByZXR1cm4gdGhlIGFuZ2xlIG9mIHRoZSBQT1YgaW4gZGVncmVlcywgb3IgLTEgaWYgdGhlIFBPViBpcyBub3QgcHJlc3NlZC4KKyAqLworaW50IEpveXN0aWNrOjpHZXRQT1YodWludDMyX3QgcG92KSB7CisJcmV0dXJuIG1fZHMtPkdldFN0aWNrUE9WKG1fcG9ydCwgcG92KTsKK30KKworLyoqCisgKiBHZXQgYnV0dG9ucyBiYXNlZCBvbiBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKgorICogVGhlIGJ1dHRvbiB0eXBlIHdpbGwgYmUgbG9va2VkIHVwIGluIHRoZSBsaXN0IG9mIGJ1dHRvbnMgYW5kIHRoZW4gcmVhZC4KKyAqCisgKiBAcGFyYW0gYnV0dG9uIFRoZSB0eXBlIG9mIGJ1dHRvbiB0byByZWFkLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KKyAqLworYm9vbCBKb3lzdGljazo6R2V0QnV0dG9uKEJ1dHRvblR5cGUgYnV0dG9uKQoreworCXN3aXRjaCAoYnV0dG9uKQorCXsKKwljYXNlIGtUcmlnZ2VyQnV0dG9uOiByZXR1cm4gR2V0VHJpZ2dlcigpOworCWNhc2Uga1RvcEJ1dHRvbjogcmV0dXJuIEdldFRvcCgpOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgYXhpcyBmb3IgYSBqb3lzdGljaworICoKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBheGlzIGZvciB0aGUgY3VycmVudCBqb3lzdGljaworICovCitpbnQgSm95c3RpY2s6OkdldEF4aXNDb3VudCgpCit7CisgICAgcmV0dXJuIG1fZHMtPkdldFN0aWNrQXhpc0NvdW50KG1fcG9ydCk7Cit9CisKKy8qKgorICAqIEdldCB0aGUgbnVtYmVyIG9mIGF4aXMgZm9yIGEgam95c3RpY2sKKyAgKgorKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnV0dG9ucyBvbiB0aGUgY3VycmVudCBqb3lzdGljaworICovCitpbnQgSm95c3RpY2s6OkdldEJ1dHRvbkNvdW50KCkKK3sKKyAgICByZXR1cm4gbV9kcy0+R2V0U3RpY2tCdXR0b25Db3VudChtX3BvcnQpOworfQorCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGF4aXMgZm9yIGEgam95c3RpY2sKKyAqCisgKiBAcmV0dXJuIHRoZW4gdW1iZXIgb2YgUE9WcyBmb3IgdGhlIGN1cnJlbnQgam95c3RpY2sKKyAqLworaW50IEpveXN0aWNrOjpHZXRQT1ZDb3VudCgpCit7CisgICAgcmV0dXJuIG1fZHMtPkdldFN0aWNrUE9WQ291bnQobV9wb3J0KTsKK30KKworCisvKioKKyAqIEdldCB0aGUgY2hhbm5lbCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYXhpcy4KKyAqCisgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBsb29rIHVwIHRoZSBjaGFubmVsIGZvci4KKyAqIEByZXR1cm4gVGhlIGNoYW5uZWwgZnIgdGhlIGF4aXMuCisgKi8KK3VpbnQzMl90IEpveXN0aWNrOjpHZXRBeGlzQ2hhbm5lbChBeGlzVHlwZSBheGlzKQoreworCXJldHVybiBtX2F4ZXNbYXhpc107Cit9CisKKy8qKgorICogU2V0IHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmllZCBheGlzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHNldCB0aGUgY2hhbm5lbCBmb3IuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byBzZXQgdGhlIGF4aXMgdG8uCisgKi8KK3ZvaWQgSm95c3RpY2s6OlNldEF4aXNDaGFubmVsKEF4aXNUeXBlIGF4aXMsIHVpbnQzMl90IGNoYW5uZWwpCit7CisJbV9heGVzW2F4aXNdID0gY2hhbm5lbDsKK30KKworLyoqCisgKiBHZXQgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlyZWN0aW9uIHZlY3RvciBmb3JtZWQgYnkgdGhlIGpveXN0aWNrJ3MKKyAqIGN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gaXRzIG9yaWdpbgorICoKKyAqIEByZXR1cm4gVGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlyZWN0aW9uIHZlY3RvcgorICovCitmbG9hdCBKb3lzdGljazo6R2V0TWFnbml0dWRlKCl7CisJcmV0dXJuIHNxcnQocG93KEdldFgoKSwyKSArIHBvdyhHZXRZKCksMikgKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGZvcm1lZCBieSB0aGUgam95c3RpY2sgYW5kIGl0cyBvcmlnaW4KKyAqIGluIHJhZGlhbnMKKyAqCisgKiBAcmV0dXJuIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHZlY3RvciBpbiByYWRpYW5zCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXREaXJlY3Rpb25SYWRpYW5zKCl7CisJcmV0dXJuIGF0YW4yKEdldFgoKSwgLUdldFkoKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHZlY3RvciBmb3JtZWQgYnkgdGhlIGpveXN0aWNrIGFuZCBpdHMgb3JpZ2luCisgKiBpbiBkZWdyZWVzCisgKgorICogdXNlcyBhY29zKC0xKSB0byByZXByZXNlbnQgUGkgZHVlIHRvIGFic2VuY2Ugb2YgcmVhZGlseSBhY2Nlc3NpYmxlIFBpCisgKiBjb25zdGFudCBpbiBDKysKKyAqCisgKiBAcmV0dXJuIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHZlY3RvciBpbiBkZWdyZWVzCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXREaXJlY3Rpb25EZWdyZWVzKCl7CisJcmV0dXJuICgxODAvYWNvcygtMSkpKkdldERpcmVjdGlvblJhZGlhbnMoKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHJ1bWJsZSBvdXRwdXQgZm9yIHRoZSBqb3lzdGljay4gVGhlIERTIGN1cnJlbnRseSBzdXBwb3J0cyAyIHJ1bWJsZSB2YWx1ZXMsCisgKiBsZWZ0IHJ1bWJsZSBhbmQgcmlnaHQgcnVtYmxlCisgKiBAcGFyYW0gdHlwZSBXaGljaCBydW1ibGUgdmFsdWUgdG8gc2V0CisgKiBAcGFyYW0gdmFsdWUgVGhlIG5vcm1hbGl6ZWQgdmFsdWUgKDAgdG8gMSkgdG8gc2V0IHRoZSBydW1ibGUgdG8KKyAqLwordm9pZCBKb3lzdGljazo6U2V0UnVtYmxlKFJ1bWJsZVR5cGUgdHlwZSwgZmxvYXQgdmFsdWUpIHsKKwlpZiAodmFsdWUgPCAwKQorCQl2YWx1ZSA9IDA7CisJZWxzZSBpZiAodmFsdWUgPiAxKQorCQl2YWx1ZSA9IDE7CisJaWYgKHR5cGUgPT0ga0xlZnRSdW1ibGUpCisJCW1fbGVmdFJ1bWJsZSA9IHZhbHVlKjY1NTM1OworCWVsc2UKKwkJbV9yaWdodFJ1bWJsZSA9IHZhbHVlKjY1NTM1OworCUhBTFNldEpveXN0aWNrT3V0cHV0cyhtX3BvcnQsIG1fb3V0cHV0cywgbV9sZWZ0UnVtYmxlLCBtX3JpZ2h0UnVtYmxlKTsKK30KKworLyoqCisgKiBTZXQgYSBzaW5nbGUgSElEIG91dHB1dCB2YWx1ZSBmb3IgdGhlIGpveXN0aWNrLgorICogQHBhcmFtIG91dHB1dE51bWJlciBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCB0byBzZXQgKDEtMzIpCisgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgb3V0cHV0IHRvCisgKi8KKwkKK3ZvaWQgSm95c3RpY2s6OlNldE91dHB1dCh1aW50OF90IG91dHB1dE51bWJlciwgYm9vbCB2YWx1ZSkgeworCW1fb3V0cHV0cyA9IChtX291dHB1dHMgJiB+KDEgPDwgKG91dHB1dE51bWJlci0xKSkpIHwgKHZhbHVlIDw8IChvdXRwdXROdW1iZXItMSkpOworCisJSEFMU2V0Sm95c3RpY2tPdXRwdXRzKG1fcG9ydCwgbV9vdXRwdXRzLCBtX2xlZnRSdW1ibGUsIG1fcmlnaHRSdW1ibGUpOworfQorCisvKioKKyAqIFNldCBhbGwgSElEIG91dHB1dCB2YWx1ZXMgZm9yIHRoZSBqb3lzdGljay4KKyAqIEBwYXJhbSB2YWx1ZSBUaGUgMzIgYml0IG91dHB1dCB2YWx1ZSAoMSBiaXQgZm9yIGVhY2ggb3V0cHV0KQorICovCit2b2lkIEpveXN0aWNrOjpTZXRPdXRwdXRzKHVpbnQzMl90IHZhbHVlKSB7CisJbV9vdXRwdXRzID0gdmFsdWU7CisJSEFMU2V0Sm95c3RpY2tPdXRwdXRzKG1fcG9ydCwgbV9vdXRwdXRzLCBtX2xlZnRSdW1ibGUsIG1fcmlnaHRSdW1ibGUpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Nb3RvclNhZmV0eUhlbHBlci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL01vdG9yU2FmZXR5SGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmI3ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Nb3RvclNhZmV0eUhlbHBlci5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworTW90b3JTYWZldHlIZWxwZXIgKk1vdG9yU2FmZXR5SGVscGVyOjptX2hlYWRIZWxwZXIgPSBOVUxMOworUmVlbnRyYW50TXV0ZXggTW90b3JTYWZldHlIZWxwZXI6Om1fbGlzdE11dGV4OworCisvKioKKyAqIFRoZSBjb25zdHJ1Y3RvciBmb3IgYSBNb3RvclNhZmV0eUhlbHBlciBvYmplY3QuCisgKiBUaGUgaGVscGVyIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBmb3IgZXZlcnkgb2JqZWN0IHRoYXQgd2FudHMgdG8gaW1wbGVtZW50IHRoZSBNb3RvcgorICogU2FmZXR5IHByb3RvY29sLiBUaGUgaGVscGVyIG9iamVjdCBoYXMgdGhlIGNvZGUgdG8gYWN0dWFsbHkgZG8gdGhlIHRpbWluZyBhbmQgY2FsbCB0aGUKKyAqIG1vdG9ycyBTdG9wKCkgbWV0aG9kIHdoZW4gdGhlIHRpbWVvdXQgZXhwaXJlcy4gVGhlIG1vdG9yIG9iamVjdCBpcyBleHBlY3RlZCB0byBjYWxsIHRoZQorICogRmVlZCgpIG1ldGhvZCB3aGVuZXZlciB0aGUgbW90b3JzIHZhbHVlIGlzIHVwZGF0ZWQuCisgKiBAcGFyYW0gc2FmZU9iamVjdCBhIHBvaW50ZXIgdG8gdGhlIG1vdG9yIG9iamVjdCBpbXBsZW1lbnRpbmcgTW90b3JTYWZldHkuIFRoaXMgaXMgdXNlZAorICogdG8gY2FsbCB0aGUgU3RvcCgpIG1ldGhvZCBvbiB0aGUgbW90b3IuCisgKi8KK01vdG9yU2FmZXR5SGVscGVyOjpNb3RvclNhZmV0eUhlbHBlcihNb3RvclNhZmV0eSAqc2FmZU9iamVjdCkKK3sKKwltX3NhZmVPYmplY3QgPSBzYWZlT2JqZWN0OworCW1fZW5hYmxlZCA9IGZhbHNlOworCW1fZXhwaXJhdGlvbiA9IERFRkFVTFRfU0FGRVRZX0VYUElSQVRJT047CisJbV9zdG9wVGltZSA9IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7CisKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9saXN0TXV0ZXgpOworCW1fbmV4dEhlbHBlciA9IG1faGVhZEhlbHBlcjsKKwltX2hlYWRIZWxwZXIgPSB0aGlzOworfQorCisKK01vdG9yU2FmZXR5SGVscGVyOjp+TW90b3JTYWZldHlIZWxwZXIoKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX2xpc3RNdXRleCk7CisJaWYgKG1faGVhZEhlbHBlciA9PSB0aGlzKQorCXsKKwkJbV9oZWFkSGVscGVyID0gbV9uZXh0SGVscGVyOworCX0KKwllbHNlCisJeworCQlNb3RvclNhZmV0eUhlbHBlciAqcHJldiA9IE5VTEw7CisJCU1vdG9yU2FmZXR5SGVscGVyICpjdXIgPSBtX2hlYWRIZWxwZXI7CisJCXdoaWxlIChjdXIgIT0gdGhpcyAmJiBjdXIgIT0gTlVMTCkKKwkJCXByZXYgPSBjdXIsIGN1ciA9IGN1ci0+bV9uZXh0SGVscGVyOworCQlpZiAoY3VyID09IHRoaXMpCisJCQlwcmV2LT5tX25leHRIZWxwZXIgPSBjdXItPm1fbmV4dEhlbHBlcjsKKwl9Cit9CisKKy8qKgorICogRmVlZCB0aGUgbW90b3Igc2FmZXR5IG9iamVjdC4KKyAqIFJlc2V0cyB0aGUgdGltZXIgb24gdGhpcyBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGRvIHRoZSB0aW1lb3V0cy4KKyAqLwordm9pZCBNb3RvclNhZmV0eUhlbHBlcjo6RmVlZCgpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fc3luY011dGV4KTsKKwltX3N0b3BUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKSArIG1fZXhwaXJhdGlvbjsKK30KKworLyoqCisgKiBTZXQgdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbW90b3Igc2FmZXR5IG9iamVjdC4KKyAqIEBwYXJhbSBleHBpcmF0aW9uVGltZSBUaGUgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgorICovCit2b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpTZXRFeHBpcmF0aW9uKGZsb2F0IGV4cGlyYXRpb25UaW1lKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisJbV9leHBpcmF0aW9uID0gZXhwaXJhdGlvblRpbWU7Cit9CisKKy8qKgorICogUmV0cmlldmUgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG1vdG9yIHNhZmV0eSBvYmplY3QuCisgKiBAcmV0dXJuIHRoZSB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuCisgKi8KK2Zsb2F0IE1vdG9yU2FmZXR5SGVscGVyOjpHZXRFeHBpcmF0aW9uKCkKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworCXJldHVybiBtX2V4cGlyYXRpb247Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBtb3RvciBpcyBzdGlsbCBvcGVyYXRpbmcgb3IgaGFzIHRpbWVkIG91dC4KKyAqIEByZXR1cm4gYSB0cnVlIHZhbHVlIGlmIHRoZSBtb3RvciBpcyBzdGlsbCBvcGVyYXRpbmcgbm9ybWFsbHkgYW5kIGhhc24ndCB0aW1lZCBvdXQuCisgKi8KK2Jvb2wgTW90b3JTYWZldHlIZWxwZXI6OklzQWxpdmUoKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisJcmV0dXJuICFtX2VuYWJsZWQgfHwgbV9zdG9wVGltZSA+IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhpcyBtb3RvciBoYXMgZXhjZWVkZWQgaXRzIHRpbWVvdXQuCisgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGRldGVybWluZSBpZiB0aGlzIG1vdG9yIGhhcyBleGNlZWRlZCBpdHMgdGltZW91dAorICogdmFsdWUuIElmIGl0IGhhcywgdGhlIHN0b3AgbWV0aG9kIGlzIGNhbGxlZCwgYW5kIHRoZSBtb3RvciBpcyBzaHV0IGRvd24gdW50aWwgaXRzIHZhbHVlIGlzCisgKiB1cGRhdGVkIGFnYWluLgorICovCit2b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpDaGVjaygpCit7CisJRHJpdmVyU3RhdGlvbiAqZHMgPSBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpOworCWlmICghbV9lbmFibGVkIHx8IGRzLT5Jc0Rpc2FibGVkKCkgfHwgZHMtPklzVGVzdCgpKSByZXR1cm47CisKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworCWlmIChtX3N0b3BUaW1lIDwgVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKSkKKwl7CisJCWNoYXIgYnVmWzEyOF07CisJCWNoYXIgZGVzY1s2NF07CisJCW1fc2FmZU9iamVjdC0+R2V0RGVzY3JpcHRpb24oZGVzYyk7CisJCXNucHJpbnRmKGJ1ZiwgMTI4LCAiJXMuLi4gT3V0cHV0IG5vdCB1cGRhdGVkIG9mdGVuIGVub3VnaC4iLCBkZXNjKTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgYnVmKTsKKwkJbV9zYWZlT2JqZWN0LT5TdG9wTW90b3IoKTsKKwl9Cit9CisKKy8qKgorICogRW5hYmxlL2Rpc2FibGUgbW90b3Igc2FmZXR5IGZvciB0aGlzIGRldmljZQorICogVHVybiBvbiBhbmQgb2ZmIHRoZSBtb3RvciBzYWZldHkgb3B0aW9uIGZvciB0aGlzIFBXTSBvYmplY3QuCisgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKKyAqLwordm9pZCBNb3RvclNhZmV0eUhlbHBlcjo6U2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKG1fc3luY011dGV4KTsKKwltX2VuYWJsZWQgPSBlbmFibGVkOworfQorCisvKioKKyAqIFJldHVybiB0aGUgc3RhdGUgb2YgdGhlIG1vdG9yIHNhZmV0eSBlbmFibGVkIGZsYWcKKyAqIFJldHVybiBpZiB0aGUgbW90b3Igc2FmZXR5IGlzIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGlzIGRldmljY2UuCisgKiBAcmV0dXJuIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIGRldmljZQorICovCitib29sIE1vdG9yU2FmZXR5SGVscGVyOjpJc1NhZmV0eUVuYWJsZWQoKQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisJcmV0dXJuIG1fZW5hYmxlZDsKK30KKworLyoqCisgKiBDaGVjayB0aGUgbW90b3JzIHRvIHNlZSBpZiBhbnkgaGF2ZSB0aW1lZCBvdXQuCisgKiBUaGlzIHN0YXRpYyAgbWV0aG9kIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gcG9sbCBhbGwgdGhlIG1vdG9ycyBhbmQgc3RvcCBhbnkgdGhhdCBoYXZlCisgKiB0aW1lZCBvdXQuCisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OkNoZWNrTW90b3JzKCkKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMobV9saXN0TXV0ZXgpOworCWZvciAoTW90b3JTYWZldHlIZWxwZXIgKm1zaCA9IG1faGVhZEhlbHBlcjsgbXNoICE9IE5VTEw7IG1zaCA9IG1zaC0+bV9uZXh0SGVscGVyKQorCXsKKwkJbXNoLT5DaGVjaygpOworCX0KK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvTm90aWZpZXIuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Ob3RpZmllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkNmJmNQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvTm90aWZpZXIuY3BwCkBAIC0wLDAgKzEsMjY1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJOb3RpZmllci5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorCitOb3RpZmllciAqTm90aWZpZXI6OnRpbWVyUXVldWVIZWFkID0gTlVMTDsKK1JlZW50cmFudE11dGV4IE5vdGlmaWVyOjpxdWV1ZVNlbWFwaG9yZTsKK3ZvaWQqIE5vdGlmaWVyOjptX25vdGlmaWVyID0gTlVMTDsKK2ludCBOb3RpZmllcjo6cmVmY291bnQgPSAwOworCisvKioKKyAqIENyZWF0ZSBhIE5vdGlmaWVyIGZvciB0aW1lciBldmVudCBub3RpZmljYXRpb24uCisgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBpcyBjYWxsZWQgYXQgdGhlIG5vdGlmaWNhdGlvbiB0aW1lIHdoaWNoIGlzIHNldAorICogdXNpbmcgU3RhcnRTaW5nbGUgb3IgU3RhcnRQZXJpb2RpYy4KKyAqLworTm90aWZpZXI6Ok5vdGlmaWVyKFRpbWVyRXZlbnRIYW5kbGVyIGhhbmRsZXIsIHZvaWQgKnBhcmFtKQoreworCWlmIChoYW5kbGVyID09IE5VTEwpCisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJoYW5kbGVyIG11c3Qgbm90IGJlIE5VTEwiKTsKKwltX2hhbmRsZXIgPSBoYW5kbGVyOworCW1fcGFyYW0gPSBwYXJhbTsKKwltX3BlcmlvZGljID0gZmFsc2U7CisJbV9leHBpcmF0aW9uVGltZSA9IDA7CisJbV9wZXJpb2QgPSAwOworCW1fbmV4dEV2ZW50ID0gTlVMTDsKKwltX3F1ZXVlZCA9IGZhbHNlOworCW1faGFuZGxlclNlbWFwaG9yZSA9IGluaXRpYWxpemVTZW1hcGhvcmUoU0VNQVBIT1JFX0ZVTEwpOworCXsKKwkJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHF1ZXVlU2VtYXBob3JlKTsKKwkJLy8gZG8gdGhlIGZpcnN0IHRpbWUgaW50aWFsaXphdGlvbiBvZiBzdGF0aWMgdmFyaWFibGVzCisJCWlmIChyZWZjb3VudCA9PSAwKQorCQl7CisJCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCQltX25vdGlmaWVyID0gaW5pdGlhbGl6ZU5vdGlmaWVyKFByb2Nlc3NRdWV1ZSwgJnN0YXR1cyk7CisJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJfQorCQlyZWZjb3VudCsrOworCX0KK30KKworLyoqCisgKiBGcmVlIHRoZSByZXNvdXJjZXMgZm9yIGEgdGltZXIgZXZlbnQuCisgKiBBbGwgcmVzb3VyY2VzIHdpbGwgYmUgZnJlZWQgYW5kIHRoZSB0aW1lciBldmVudCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAqIHF1ZXVlIGlmIG5lY2Vzc2FyeS4KKyAqLworTm90aWZpZXI6On5Ob3RpZmllcigpCit7CisJeworCQk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMocXVldWVTZW1hcGhvcmUpOworCQlEZWxldGVGcm9tUXVldWUoKTsKKworCQkvLyBEZWxldGUgdGhlIHN0YXRpYyB2YXJpYWJsZXMgd2hlbiB0aGUgbGFzdCBvbmUgaXMgZ29pbmcgYXdheQorCQlpZiAoISgtLXJlZmNvdW50KSkKKwkJeworCQkJaW50MzJfdCBzdGF0dXMgPSAwOworCQkJY2xlYW5Ob3RpZmllcihtX25vdGlmaWVyLCAmc3RhdHVzKTsKKwkJCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCQl9CisJfQorCisJLy8gQWNxdWlyZSB0aGUgc2VtYXBob3JlOyB0aGlzIG1ha2VzIGNlcnRhaW4gdGhhdCB0aGUgaGFuZGxlciBpcyAKKwkvLyBub3QgYmVpbmcgZXhlY3V0ZWQgYnkgdGhlIGludGVycnVwdCBtYW5hZ2VyLgorCXRha2VTZW1hcGhvcmUobV9oYW5kbGVyU2VtYXBob3JlKTsKKwkvLyBEZWxldGUgd2hpbGUgaG9sZGluZyB0aGUgc2VtYXBob3JlIHNvIHRoZXJlIGNhbiBiZSBubyByYWNlLgorCWRlbGV0ZVNlbWFwaG9yZShtX2hhbmRsZXJTZW1hcGhvcmUpOworfQorCisvKioKKyAqIFVwZGF0ZSB0aGUgYWxhcm0gaGFyZHdhcmUgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBmaXJzdCBlbGVtZW50IGluIHRoZSBxdWV1ZS4KKyAqIENvbXB1dGUgdGhlIHRpbWUgdGhlIG5leHQgYWxhcm0gc2hvdWxkIG9jY3VyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUgYW5kIHRoZQorICogcGVyaW9kIGZvciB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgdGltZXIgcXVldWUuCisgKiBXQVJOSU5HOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkbyBzeW5jaHJvbml6YXRpb24hIEl0IG11c3QgYmUgY2FsbGVkIGZyb20gc29tZXdoZXJlCisgKiB0aGF0IGlzIHRha2luZyBjYXJlIG9mIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIHRoZSBxdWV1ZS4KKyAqLwordm9pZCBOb3RpZmllcjo6VXBkYXRlQWxhcm0oKQoreworCWlmICh0aW1lclF1ZXVlSGVhZCAhPSBOVUxMKQorCXsKKwkJaW50MzJfdCBzdGF0dXMgPSAwOworCQl1cGRhdGVOb3RpZmllckFsYXJtKG1fbm90aWZpZXIsICh1aW50MzJfdCkodGltZXJRdWV1ZUhlYWQtPm1fZXhwaXJhdGlvblRpbWUgKiAxZTYpLCAmc3RhdHVzKTsKKwkJd3BpX3NldFN0YXRpY0Vycm9yV2l0aENvbnRleHQodGltZXJRdWV1ZUhlYWQsIHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCX0KK30KKworLyoqCisgKiBQcm9jZXNzUXVldWUgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgdGltZXIgaW50ZXJydXB0LgorICogV2UgbmVlZCB0byB3YWtlIHVwIGFuZCBwcm9jZXNzIHRoZSBjdXJyZW50IHRvcCBpdGVtIGluIHRoZSB0aW1lciBxdWV1ZSBhcyBsb25nCisgKiBhcyBpdHMgc2NoZWR1bGVkIHRpbWUgaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgdGltZS4gVGhlbiB0aGUgaXRlbSBpcyByZW1vdmVkIG9yIAorICogcmVzY2hlZHVsZWQgKHJlcGV0aXRpdmUgZXZlbnRzKSBpbiB0aGUgcXVldWUuCisgKi8KK3ZvaWQgTm90aWZpZXI6OlByb2Nlc3NRdWV1ZSh1aW50MzJfdCBtYXNrLCB2b2lkICpwYXJhbXMpCit7CisJTm90aWZpZXIgKmN1cnJlbnQ7CisJd2hpbGUgKHRydWUpCQkJCS8vIGtlZXAgcHJvY2Vzc2luZyBwYXN0IGV2ZW50cyB1bnRpbCBubyBtb3JlCisJeworCQl7CisJCQk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMocXVldWVTZW1hcGhvcmUpOworCQkJZG91YmxlIGN1cnJlbnRUaW1lID0gR2V0Q2xvY2soKTsKKwkJCWN1cnJlbnQgPSB0aW1lclF1ZXVlSGVhZDsKKwkJCWlmIChjdXJyZW50ID09IE5VTEwgfHwgY3VycmVudC0+bV9leHBpcmF0aW9uVGltZSA+IGN1cnJlbnRUaW1lKQorCQkJeworCQkJCWJyZWFrOwkJLy8gbm8gbW9yZSB0aW1lciBldmVudHMgdG8gcHJvY2VzcworCQkJfQorCQkJLy8gbmVlZCB0byBwcm9jZXNzIHRoaXMgZW50cnkKKwkJCXRpbWVyUXVldWVIZWFkID0gY3VycmVudC0+bV9uZXh0RXZlbnQ7CisJCQlpZiAoY3VycmVudC0+bV9wZXJpb2RpYykKKwkJCXsKKwkJCQkvLyBpZiBwZXJpb2RpYywgcmVxdWV1ZSB0aGUgZXZlbnQKKwkJCQkvLyBjb21wdXRlIHdoZW4gdG8gcHV0IGludG8gcXVldWUKKwkJCQljdXJyZW50LT5JbnNlcnRJblF1ZXVlKHRydWUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIG5vdCBwZXJpb2RpYzsgcmVtb3ZlZCBmcm9tIHF1ZXVlCisJCQkJY3VycmVudC0+bV9xdWV1ZWQgPSBmYWxzZTsKKwkJCX0KKwkJCS8vIFRha2UgaGFuZGxlciBzZW1hcGhvcmUgd2hpbGUgaG9sZGluZyBxdWV1ZSBzZW1hcGhvcmUgdG8gbWFrZSBzdXJlCisJCQkvLyAgdGhlIGhhbmRsZXIgd2lsbCBleGVjdXRlIHRvIGNvbXBsZXRpb24gaW4gY2FzZSB3ZSBhcmUgYmVpbmcgZGVsZXRlZC4KKwkJCXRha2VTZW1hcGhvcmUoY3VycmVudC0+bV9oYW5kbGVyU2VtYXBob3JlKTsKKwkJfQorCisJCWN1cnJlbnQtPm1faGFuZGxlcihjdXJyZW50LT5tX3BhcmFtKTsJLy8gY2FsbCB0aGUgZXZlbnQgaGFuZGxlcgorCQlnaXZlU2VtYXBob3JlKGN1cnJlbnQtPm1faGFuZGxlclNlbWFwaG9yZSk7CisJfQorCS8vIHJlc2NoZWR1bGUgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHF1ZXVlCisJOjpzdGQ6OnVuaXF1ZV9sb2NrPFJlZW50cmFudE11dGV4PiBzeW5jKHF1ZXVlU2VtYXBob3JlKTsKKwlVcGRhdGVBbGFybSgpOworfQorCisvKioKKyAqIEluc2VydCB0aGlzIE5vdGlmaWVyIGludG8gdGhlIHRpbWVyIHF1ZXVlIGluIHJpZ2h0IHBsYWNlLgorICogV0FSTklORzogdGhpcyBtZXRob2QgZG9lcyBub3QgZG8gc3luY2hyb25pemF0aW9uISBJdCBtdXN0IGJlIGNhbGxlZCBmcm9tIHNvbWV3aGVyZQorICogdGhhdCBpcyB0YWtpbmcgY2FyZSBvZiBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byB0aGUgcXVldWUuCisgKiBAcGFyYW0gcmVzY2hlZHVsZSBJZiBmYWxzZSwgdGhlIHNjaGVkdWxlZCBhbGFybSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lIGFuZCBVcGRhdGVBbGFybQorICogbWV0aG9kIGlzIGNhbGxlZCB3aGljaCB3aWxsIGVuYWJsZSB0aGUgYWxhcm0gaWYgbmVjZXNzYXJ5LgorICogSWYgdHJ1ZSwgdXBkYXRlIHRoZSB0aW1lIGJ5IGFkZGluZyB0aGUgcGVyaW9kIChubyBkcmlmdCkgd2hlbiByZXNjaGVkdWxlZCBwZXJpb2RpYyBmcm9tIFByb2Nlc3NRdWV1ZS4KKyAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBwdWJsaWMgbWV0aG9kcyBvbmx5IHVwZGF0ZSB0aGUgcXVldWUgYWZ0ZXIgZmluaXNoaW5nIGluc2VydGluZy4KKyAqLwordm9pZCBOb3RpZmllcjo6SW5zZXJ0SW5RdWV1ZShib29sIHJlc2NoZWR1bGUpCit7CisJaWYgKHJlc2NoZWR1bGUpCisJeworCQltX2V4cGlyYXRpb25UaW1lICs9IG1fcGVyaW9kOworCX0KKwllbHNlCisJeworCQltX2V4cGlyYXRpb25UaW1lID0gR2V0Q2xvY2soKSArIG1fcGVyaW9kOworCX0KKwlpZiAobV9leHBpcmF0aW9uVGltZSA+IFRpbWVyOjprUm9sbG92ZXJUaW1lKQorCXsKKwkJbV9leHBpcmF0aW9uVGltZSAtPSBUaW1lcjo6a1JvbGxvdmVyVGltZTsKKwl9CisJaWYgKHRpbWVyUXVldWVIZWFkID09IE5VTEwgfHwgdGltZXJRdWV1ZUhlYWQtPm1fZXhwaXJhdGlvblRpbWUgPj0gdGhpcy0+bV9leHBpcmF0aW9uVGltZSkKKwl7CisJCS8vIHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBncmVhdGVyIHRoYW4gdGhlIG5ldyBlbnRyeQorCQkvLyB0aGUgbmV3IGVudHJ5IGJlY29tZXMgdGhlIGZpcnN0IGVsZW1lbnQKKwkJdGhpcy0+bV9uZXh0RXZlbnQgPSB0aW1lclF1ZXVlSGVhZDsKKwkJdGltZXJRdWV1ZUhlYWQgPSB0aGlzOworCQlpZiAoIXJlc2NoZWR1bGUpCisJCXsKKwkJCS8vIHNpbmNlIHRoZSBmaXJzdCBlbGVtZW50IGNoYW5nZWQsIHVwZGF0ZSBhbGFybSwgdW5sZXNzIHdlIGFscmVhZHkgcGxhbiB0bworCQkJVXBkYXRlQWxhcm0oKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlmb3IgKE5vdGlmaWVyICoqbnBwID0gJih0aW1lclF1ZXVlSGVhZC0+bV9uZXh0RXZlbnQpOyA7IG5wcCA9ICYoKm5wcCktPm1fbmV4dEV2ZW50KQorCQl7CisJCQlOb3RpZmllciAqbiA9ICpucHA7CisJCQlpZiAobiA9PSBOVUxMIHx8IG4tPm1fZXhwaXJhdGlvblRpbWUgPiB0aGlzLT5tX2V4cGlyYXRpb25UaW1lKQorCQkJeworCQkJCSpucHAgPSB0aGlzOworCQkJCXRoaXMtPm1fbmV4dEV2ZW50ID0gbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwltX3F1ZXVlZCA9IHRydWU7Cit9CisKKy8qKgorICogRGVsZXRlIHRoaXMgTm90aWZpZXIgZnJvbSB0aGUgdGltZXIgcXVldWUuCisgKiBXQVJOSU5HOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkbyBzeW5jaHJvbml6YXRpb24hIEl0IG11c3QgYmUgY2FsbGVkIGZyb20gc29tZXdoZXJlCisgKiB0aGF0IGlzIHRha2luZyBjYXJlIG9mIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIHRoZSBxdWV1ZS4KKyAqIFJlbW92ZSB0aGlzIE5vdGlmaWVyIGZyb20gdGhlIHRpbWVyIHF1ZXVlIGFuZCBhZGp1c3QgdGhlIG5leHQgaW50ZXJydXB0IHRpbWUgdG8gcmVmbGVjdAorICogdGhlIGN1cnJlbnQgdG9wIG9mIHRoZSBxdWV1ZS4KKyAqLwordm9pZCBOb3RpZmllcjo6RGVsZXRlRnJvbVF1ZXVlKCkKK3sKKwlpZiAobV9xdWV1ZWQpCisJeworCQltX3F1ZXVlZCA9IGZhbHNlOworCQl3cGlfYXNzZXJ0KHRpbWVyUXVldWVIZWFkICE9IE5VTEwpOworCQlpZiAodGltZXJRdWV1ZUhlYWQgPT0gdGhpcykKKwkJeworCQkJLy8gcmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IC0gdXBkYXRlIHRoZSBhbGFybQorCQkJdGltZXJRdWV1ZUhlYWQgPSB0aGlzLT5tX25leHRFdmVudDsKKwkJCVVwZGF0ZUFsYXJtKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IgKE5vdGlmaWVyICpuID0gdGltZXJRdWV1ZUhlYWQ7IG4gIT0gTlVMTDsgbiA9IG4tPm1fbmV4dEV2ZW50KQorCQkJeworCQkJCWlmIChuLT5tX25leHRFdmVudCA9PSB0aGlzKQorCQkJCXsKKwkJCQkJLy8gdGhpcyBlbGVtZW50IGlzIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSAqbiBmcm9tIHRoZSBxdWV1ZQorCQkJCQluLT5tX25leHRFdmVudCA9IHRoaXMtPm1fbmV4dEV2ZW50OwkvLyBwb2ludCBhcm91bmQgdGhpcyBvbmUKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogUmVnaXN0ZXIgZm9yIHNpbmdsZSBldmVudCBub3RpZmljYXRpb24uCisgKiBBIHRpbWVyIGV2ZW50IGlzIHF1ZXVlZCBmb3IgYSBzaW5nbGUgZXZlbnQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS4KKyAqIEBwYXJhbSBkZWxheSBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KKyAqLwordm9pZCBOb3RpZmllcjo6U3RhcnRTaW5nbGUoZG91YmxlIGRlbGF5KQoreworCTo6c3RkOjp1bmlxdWVfbG9jazxSZWVudHJhbnRNdXRleD4gc3luYyhxdWV1ZVNlbWFwaG9yZSk7CisJbV9wZXJpb2RpYyA9IGZhbHNlOworCW1fcGVyaW9kID0gZGVsYXk7CisJRGVsZXRlRnJvbVF1ZXVlKCk7CisJSW5zZXJ0SW5RdWV1ZShmYWxzZSk7Cit9CisKKy8qKgorICogUmVnaXN0ZXIgZm9yIHBlcmlvZGljIGV2ZW50IG5vdGlmaWNhdGlvbi4KKyAqIEEgdGltZXIgZXZlbnQgaXMgcXVldWVkIGZvciBwZXJpb2RpYyBldmVudCBub3RpZmljYXRpb24uIEVhY2ggdGltZSB0aGUgaW50ZXJydXB0CisgKiBvY2N1cnMsIHRoZSBldmVudCB3aWxsIGJlIGltbWVkaWF0ZWx5IHJlcXVldWVkIGZvciB0aGUgc2FtZSB0aW1lIGludGVydmFsLgorICogQHBhcmFtIHBlcmlvZCBQZXJpb2QgaW4gc2Vjb25kcyB0byBjYWxsIHRoZSBoYW5kbGVyIHN0YXJ0aW5nIG9uZSBwZXJpb2QgYWZ0ZXIgdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QuCisgKi8KK3ZvaWQgTm90aWZpZXI6OlN0YXJ0UGVyaW9kaWMoZG91YmxlIHBlcmlvZCkKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMocXVldWVTZW1hcGhvcmUpOworCW1fcGVyaW9kaWMgPSB0cnVlOworCW1fcGVyaW9kID0gcGVyaW9kOworCURlbGV0ZUZyb21RdWV1ZSgpOworCUluc2VydEluUXVldWUoZmFsc2UpOworfQorCisvKioKKyAqIFN0b3AgdGltZXIgZXZlbnRzIGZyb20gb2NjdXJpbmcuCisgKiBTdG9wIGFueSByZXBlYXRpbmcgdGltZXIgZXZlbnRzIGZyb20gb2NjdXJpbmcuIFRoaXMgd2lsbCBhbHNvIHJlbW92ZSBhbnkgc2luZ2xlCisgKiBub3RpZmljYXRpb24gZXZlbnRzIGZyb20gdGhlIHF1ZXVlLgorICogSWYgYSB0aW1lci1iYXNlZCBjYWxsIHRvIHRoZSByZWdpc3RlcmVkIGhhbmRsZXIgaXMgaW4gcHJvZ3Jlc3MsIHRoaXMgZnVuY3Rpb24gd2lsbAorICogYmxvY2sgdW50aWwgdGhlIGhhbmRsZXIgY2FsbCBpcyBjb21wbGV0ZS4KKyAqLwordm9pZCBOb3RpZmllcjo6U3RvcCgpCit7CisJeworCQk6OnN0ZDo6dW5pcXVlX2xvY2s8UmVlbnRyYW50TXV0ZXg+IHN5bmMocXVldWVTZW1hcGhvcmUpOworCQlEZWxldGVGcm9tUXVldWUoKTsKKwl9CisJLy8gV2FpdCBmb3IgYSBjdXJyZW50bHkgZXhlY3V0aW5nIGhhbmRsZXIgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZyBmcm9tIFN0b3AoKQorCVN5bmNocm9uaXplZCBzeW5jKG1faGFuZGxlclNlbWFwaG9yZSk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1BXTS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1BXTS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiMGY0NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUFdNLmNwcApAQCAtMCwwICsxLDM2MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiUFdNLmgiCisKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKK2NvbnN0ZXhwciBmbG9hdCBQV006OmtEZWZhdWx0UHdtUGVyaW9kOworY29uc3RleHByIGZsb2F0IFBXTTo6a0RlZmF1bHRQd21DZW50ZXI7Citjb25zdCBpbnQzMl90IFBXTTo6a0RlZmF1bHRQd21TdGVwc0Rvd247Citjb25zdCBpbnQzMl90IFBXTTo6a1B3bURpc2FibGVkOworCisvKioKKyAqIEluaXRpYWxpemUgUFdNcyBnaXZlbiBhIGNoYW5uZWwuCisgKgorICogVGhpcyBtZXRob2QgaXMgcHJpdmF0ZSBhbmQgaXMgdGhlIGNvbW1vbiBwYXRoIGZvciBhbGwgdGhlIGNvbnN0cnVjdG9ycyBmb3IgY3JlYXRpbmcgUFdNCisgKiBpbnN0YW5jZXMuIENoZWNrcyBjaGFubmVsIHZhbHVlIHJhbmdlIGFuZCBhbGxvY2F0ZXMgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwuCisgKiBUaGUgYWxsb2NhdGlvbiBpcyBvbmx5IGRvbmUgdG8gaGVscCB1c2VycyBlbnN1cmUgdGhhdCB0aGV5IGRvbid0IGRvdWJsZSBhc3NpZ24gY2hhbm5lbHMuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK3ZvaWQgUFdNOjpJbml0UFdNKHVpbnQzMl90IGNoYW5uZWwpCit7CisJY2hhciBidWZbNjRdOworCisJaWYgKCFDaGVja1BXTUNoYW5uZWwoY2hhbm5lbCkpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiUFdNIENoYW5uZWwgJWQiLCBjaGFubmVsKTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmKTsKKwkJcmV0dXJuOworCX0KKworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlhbGxvY2F0ZVBXTUNoYW5uZWwobV9wd21fcG9ydHNbY2hhbm5lbF0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJbV9jaGFubmVsID0gY2hhbm5lbDsKKworCXNldFBXTShtX3B3bV9wb3J0c1ttX2NoYW5uZWxdLCBrUHdtRGlzYWJsZWQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJbV9lbGltaW5hdGVEZWFkYmFuZCA9IGZhbHNlOworCisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1BXTSwgY2hhbm5lbCk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBQV00gZ2l2ZW4gYSBjaGFubmVsIG51bWJlci4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwuCisgKi8KK1BXTTo6UFdNKHVpbnQzMl90IGNoYW5uZWwpCit7CisJSW5pdFBXTShjaGFubmVsKTsKK30KKworLyoqCisgKiBGcmVlIHRoZSBQV00gY2hhbm5lbC4KKyAqCisgKiBGcmVlIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIFBXTSBjaGFubmVsIGFuZCBzZXQgdGhlIHZhbHVlIHRvIDAuCisgKi8KK1BXTTo6flBXTSgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJc2V0UFdNKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sIGtQd21EaXNhYmxlZCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlmcmVlUFdNQ2hhbm5lbChtX3B3bV9wb3J0c1ttX2NoYW5uZWxdLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBPcHRpb25hbGx5IGVsaW1pbmF0ZSB0aGUgZGVhZGJhbmQgZnJvbSBhIHNwZWVkIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZWxpbWluYXRlRGVhZGJhbmQgSWYgdHJ1ZSwgc2V0IHRoZSBtb3RvciBjdXJ2ZSBvbiB0aGUgSmFndWFyIHRvIGVsaW1pbmF0ZQorICogdGhlIGRlYWRiYW5kIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJhbmdlLiBPdGhlcndpc2UsIGtlZXAgdGhlIGZ1bGwgcmFuZ2Ugd2l0aG91dAorICogbW9kaWZ5aW5nIGFueSB2YWx1ZXMuCisgKi8KK3ZvaWQgUFdNOjpFbmFibGVEZWFkYmFuZEVsaW1pbmF0aW9uKGJvb2wgZWxpbWluYXRlRGVhZGJhbmQpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCW1fZWxpbWluYXRlRGVhZGJhbmQgPSBlbGltaW5hdGVEZWFkYmFuZDsKK30KKworLyoqCisgKiBTZXQgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHZhbHVlcy4KKyAqIFRoaXMgc2V0cyB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgZWFjaCB0eXBlIG9mIGNvbnRyb2xsZXIuIFRoZSB2YWx1ZXMKKyAqIGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIHNwZWVkcyBhcyB3ZWxsIGFzIHRoZSBkZWFkYmFuZCBicmFja2V0LgorICogQHBhcmFtIG1heCBUaGUgTWluaW11bSBwd20gdmFsdWUKKyAqIEBwYXJhbSBkZWFkYmFuZE1heCBUaGUgaGlnaCBlbmQgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgKiBAcGFyYW0gY2VudGVyIFRoZSBjZW50ZXIgc3BlZWQgKG9mZikKKyAqIEBwYXJhbSBkZWFkYmFuZE1pbiBUaGUgbG93IGVuZCBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqIEBwYXJhbSBtaW4gVGhlIG1pbmltdW0gcHdtIHZhbHVlCisgKi8KK3ZvaWQgUFdNOjpTZXRCb3VuZHMoaW50MzJfdCBtYXgsIGludDMyX3QgZGVhZGJhbmRNYXgsIGludDMyX3QgY2VudGVyLCBpbnQzMl90IGRlYWRiYW5kTWluLCBpbnQzMl90IG1pbikKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJbV9tYXhQd20gPSBtYXg7CisJbV9kZWFkYmFuZE1heFB3bSA9IGRlYWRiYW5kTWF4OworCW1fY2VudGVyUHdtID0gY2VudGVyOworCW1fZGVhZGJhbmRNaW5Qd20gPSBkZWFkYmFuZE1pbjsKKwltX21pblB3bSA9IG1pbjsKK30KKworCisvKioKKyAqIFNldCB0aGUgYm91bmRzIG9uIHRoZSBQV00gcHVsc2Ugd2lkdGhzLgorICogVGhpcyBzZXRzIHRoZSBib3VuZHMgb24gdGhlIFBXTSB2YWx1ZXMgZm9yIGEgcGFydGljdWxhciB0eXBlIG9mIGNvbnRyb2xsZXIuIFRoZSB2YWx1ZXMKKyAqIGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIHNwZWVkcyBhcyB3ZWxsIGFzIHRoZSBkZWFkYmFuZCBicmFja2V0LgorICogQHBhcmFtIG1heCBUaGUgbWF4IFBXTSBwdWxzZSB3aWR0aCBpbiBtcworICogQHBhcmFtIGRlYWRiYW5kTWF4IFRoZSBoaWdoIGVuZCBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgcHVsc2Ugd2lkdGggaW4gbXMKKyAqIEBwYXJhbSBjZW50ZXIgVGhlIGNlbnRlciAob2ZmKSBwdWxzZSB3aWR0aCBpbiBtcworICogQHBhcmFtIGRlYWRiYW5kTWluIFRoZSBsb3cgZW5kIG9mIHRoZSBkZWFkYmFuZCBwdWxzZSB3aWR0aCBpbiBtcworICogQHBhcmFtIG1pbiBUaGUgbWluaW11bSBwdWxzZSB3aWR0aCBpbiBtcworICovCit2b2lkIFBXTTo6U2V0Qm91bmRzKGRvdWJsZSBtYXgsIGRvdWJsZSBkZWFkYmFuZE1heCwgZG91YmxlIGNlbnRlciwgZG91YmxlIGRlYWRiYW5kTWluLCBkb3VibGUgbWluKQoreworCS8vIGNhbGN1bGF0ZSB0aGUgbG9vcCB0aW1lIGluIG1pbGxpc2Vjb25kcworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlkb3VibGUgbG9vcFRpbWUgPSBnZXRMb29wVGltaW5nKCZzdGF0dXMpLyhrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kKjFlMyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKwltX21heFB3bSA9IChpbnQzMl90KSgobWF4LWtEZWZhdWx0UHdtQ2VudGVyKS9sb29wVGltZStrRGVmYXVsdFB3bVN0ZXBzRG93bi0xKTsKKwltX2RlYWRiYW5kTWF4UHdtID0gKGludDMyX3QpKChkZWFkYmFuZE1heC1rRGVmYXVsdFB3bUNlbnRlcikvbG9vcFRpbWUra0RlZmF1bHRQd21TdGVwc0Rvd24tMSk7CisJbV9jZW50ZXJQd20gPSAoaW50MzJfdCkoKGNlbnRlci1rRGVmYXVsdFB3bUNlbnRlcikvbG9vcFRpbWUra0RlZmF1bHRQd21TdGVwc0Rvd24tMSk7CisJbV9kZWFkYmFuZE1pblB3bSA9IChpbnQzMl90KSgoZGVhZGJhbmRNaW4ta0RlZmF1bHRQd21DZW50ZXIpL2xvb3BUaW1lK2tEZWZhdWx0UHdtU3RlcHNEb3duLTEpOworCW1fbWluUHdtID0gKGludDMyX3QpKChtaW4ta0RlZmF1bHRQd21DZW50ZXIpL2xvb3BUaW1lK2tEZWZhdWx0UHdtU3RlcHNEb3duLTEpOworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlIGJhc2VkIG9uIGEgcG9zaXRpb24uCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlcnZvcy4KKyAqCisgKiBAcHJlIFNldE1heFBvc2l0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNaW5OZWdhdGl2ZVB3bSgpIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gcG9zIFRoZSBwb3NpdGlvbiB0byBzZXQgdGhlIHNlcnZvIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgKi8KK3ZvaWQgUFdNOjpTZXRQb3NpdGlvbihmbG9hdCBwb3MpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCWlmIChwb3MgPCAwLjApCisJeworCQlwb3MgPSAwLjA7CisJfQorCWVsc2UgaWYgKHBvcyA+IDEuMCkKKwl7CisJCXBvcyA9IDEuMDsKKwl9CisKKwkvLyBub3RlLCBuZWVkIHRvIHBlcmZvcm0gdGhlIG11bHRpcGxpY2F0aW9uIGJlbG93IGFzIGZsb2F0aW5nIHBvaW50IGJlZm9yZSBjb252ZXJ0aW5nIHRvIGludAorCXVuc2lnbmVkIHNob3J0IHJhd1ZhbHVlID0gKGludDMyX3QpKCAocG9zICogKGZsb2F0KSBHZXRGdWxsUmFuZ2VTY2FsZUZhY3RvcigpKSArIEdldE1pbk5lZ2F0aXZlUHdtKCkpOworLy8JcHJpbnRmKCJNaW5OZWdQV006ICVkIEZ1bGxSYW5nZVNjYWxlRmFjdG9yOiAlZCBSYXcgdmFsdWU6ICU1ZCAgIElucHV0IHZhbHVlOiAlNC40ZlxuIiwgR2V0TWluTmVnYXRpdmVQd20oKSwgR2V0RnVsbFJhbmdlU2NhbGVGYWN0b3IoKSwgcmF3VmFsdWUsIHBvcyk7CisKKy8vCXdwaV9hc3NlcnQoKHJhd1ZhbHVlID49IEdldE1pbk5lZ2F0aXZlUHdtKCkpICYmIChyYXdWYWx1ZSA8PSBHZXRNYXhQb3NpdGl2ZVB3bSgpKSk7CisJd3BpX2Fzc2VydChyYXdWYWx1ZSAhPSBrUHdtRGlzYWJsZWQpOworCisJLy8gc2VuZCB0aGUgY29tcHV0ZWQgcHdtIHZhbHVlIHRvIHRoZSBGUEdBCisJU2V0UmF3KCh1bnNpZ25lZCBzaG9ydClyYXdWYWx1ZSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBQV00gdmFsdWUgaW4gdGVybXMgb2YgYSBwb3NpdGlvbi4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vydm9zLgorICoKKyAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIHRoZSBzZXJ2byBpcyBzZXQgdG8gYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgUFdNOjpHZXRQb3NpdGlvbigpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKwlpbnQzMl90IHZhbHVlID0gR2V0UmF3KCk7CisJaWYgKHZhbHVlIDwgR2V0TWluTmVnYXRpdmVQd20oKSkKKwl7CisJCXJldHVybiAwLjA7CisJfQorCWVsc2UgaWYgKHZhbHVlID4gR2V0TWF4UG9zaXRpdmVQd20oKSkKKwl7CisJCXJldHVybiAxLjA7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiAoZmxvYXQpKHZhbHVlIC0gR2V0TWluTmVnYXRpdmVQd20oKSkgLyAoZmxvYXQpR2V0RnVsbFJhbmdlU2NhbGVGYWN0b3IoKTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUgYmFzZWQgb24gYSBzcGVlZC4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc3BlZWQgY29udHJvbGxlcnMuCisgKgorICogQHByZSBTZXRNYXhQb3NpdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWluUG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldENlbnRlclB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWF4TmVnYXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdG8gc2V0IHRoZSBzcGVlZCBjb250cm9sbGVyIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCit2b2lkIFBXTTo6U2V0U3BlZWQoZmxvYXQgc3BlZWQpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCS8vIGNsYW1wIHNwZWVkIHRvIGJlIGluIHRoZSByYW5nZSAxLjAgPj0gc3BlZWQgPj0gLTEuMAorCWlmIChzcGVlZCA8IC0xLjApCisJeworCQlzcGVlZCA9IC0xLjA7CisJfQorCWVsc2UgaWYgKHNwZWVkID4gMS4wKQorCXsKKwkJc3BlZWQgPSAxLjA7CisJfQorCisJLy8gY2FsY3VsYXRlIHRoZSBkZXNpcmVkIG91dHB1dCBwd20gdmFsdWUgYnkgc2NhbGluZyB0aGUgc3BlZWQgYXBwcm9wcmlhdGVseQorCWludDMyX3QgcmF3VmFsdWU7CisJaWYgKHNwZWVkID09IDAuMCkKKwl7CisJCXJhd1ZhbHVlID0gR2V0Q2VudGVyUHdtKCk7CisJfQorCWVsc2UgaWYgKHNwZWVkID4gMC4wKQorCXsKKwkJcmF3VmFsdWUgPSAoaW50MzJfdCkoc3BlZWQgKiAoKGZsb2F0KUdldFBvc2l0aXZlU2NhbGVGYWN0b3IoKSkgKworCQkJCQkJCQkJKChmbG9hdCkgR2V0TWluUG9zaXRpdmVQd20oKSkgKyAwLjUpOworCX0KKwllbHNlCisJeworCQlyYXdWYWx1ZSA9IChpbnQzMl90KShzcGVlZCAqICgoZmxvYXQpR2V0TmVnYXRpdmVTY2FsZUZhY3RvcigpKSArCisJCQkJCQkJCQkoKGZsb2F0KSBHZXRNYXhOZWdhdGl2ZVB3bSgpKSArIDAuNSk7CisJfQorCisJLy8gdGhlIGFib3ZlIHNob3VsZCByZXN1bHQgaW4gYSBwd21fdmFsdWUgaW4gdGhlIHZhbGlkIHJhbmdlCisJd3BpX2Fzc2VydCgocmF3VmFsdWUgPj0gR2V0TWluTmVnYXRpdmVQd20oKSkgJiYgKHJhd1ZhbHVlIDw9IEdldE1heFBvc2l0aXZlUHdtKCkpKTsKKwl3cGlfYXNzZXJ0KHJhd1ZhbHVlICE9IGtQd21EaXNhYmxlZCk7CisKKwkvLyBzZW5kIHRoZSBjb21wdXRlZCBwd20gdmFsdWUgdG8gdGhlIEZQR0EKKwlTZXRSYXcocmF3VmFsdWUpOworfQorCisvKioKKyAqIEdldCB0aGUgUFdNIHZhbHVlIGluIHRlcm1zIG9mIHNwZWVkLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBzcGVlZCBjb250cm9sbGVycy4KKyAqCisgKiBAcHJlIFNldE1heFBvc2l0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNaW5Qb3NpdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWF4TmVnYXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHNwZWVkIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBQV006OkdldFNwZWVkKCkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworCWludDMyX3QgdmFsdWUgPSBHZXRSYXcoKTsKKwlpZiAodmFsdWUgPT0gUFdNOjprUHdtRGlzYWJsZWQpCisJeworCQlyZXR1cm4gMC4wOworCX0KKwllbHNlIGlmICh2YWx1ZSA+IEdldE1heFBvc2l0aXZlUHdtKCkpCisJeworCQlyZXR1cm4gMS4wOworCX0KKwllbHNlIGlmICh2YWx1ZSA8IEdldE1pbk5lZ2F0aXZlUHdtKCkpCisJeworCQlyZXR1cm4gLTEuMDsKKwl9CisJZWxzZSBpZiAodmFsdWUgPiBHZXRNaW5Qb3NpdGl2ZVB3bSgpKQorCXsKKwkJcmV0dXJuIChmbG9hdCkodmFsdWUgLSBHZXRNaW5Qb3NpdGl2ZVB3bSgpKSAvIChmbG9hdClHZXRQb3NpdGl2ZVNjYWxlRmFjdG9yKCk7CisJfQorCWVsc2UgaWYgKHZhbHVlIDwgR2V0TWF4TmVnYXRpdmVQd20oKSkKKwl7CisJCXJldHVybiAoZmxvYXQpKHZhbHVlIC0gR2V0TWF4TmVnYXRpdmVQd20oKSkgLyAoZmxvYXQpR2V0TmVnYXRpdmVTY2FsZUZhY3RvcigpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gMC4wOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIFBXTSB2YWx1ZSBkaXJlY3RseSB0byB0aGUgaGFyZHdhcmUuCisgKgorICogV3JpdGUgYSByYXcgdmFsdWUgdG8gYSBQV00gY2hhbm5lbC4KKyAqCisgKiBAcGFyYW0gdmFsdWUgUmF3IFBXTSB2YWx1ZS4KKyAqLwordm9pZCBQV006OlNldFJhdyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0UFdNKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sIHZhbHVlLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIFBXTSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBSZWFkIGEgcmF3IHZhbHVlIGZyb20gYSBQV00gY2hhbm5lbC4KKyAqCisgKiBAcmV0dXJuIFJhdyBQV00gY29udHJvbCB2YWx1ZS4KKyAqLwordW5zaWduZWQgc2hvcnQgUFdNOjpHZXRSYXcoKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIHNob3J0IHZhbHVlID0gZ2V0UFdNKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFNsb3cgZG93biB0aGUgUFdNIHNpZ25hbCBmb3Igb2xkIGRldmljZXMuCisgKgorICogQHBhcmFtIG11bHQgVGhlIHBlcmlvZCBtdWx0aXBsaWVyIHRvIGFwcGx5IHRvIHRoaXMgY2hhbm5lbAorICovCit2b2lkIFBXTTo6U2V0UGVyaW9kTXVsdGlwbGllcihQZXJpb2RNdWx0aXBsaWVyIG11bHQpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJc3dpdGNoKG11bHQpCisJeworCWNhc2Uga1BlcmlvZE11bHRpcGxpZXJfNFg6CisJCXNldFBXTVBlcmlvZFNjYWxlKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sIDMsICZzdGF0dXMpOyAvLyBTcXVlbGNoIDMgb3V0IG9mIDQgb3V0cHV0cworCQlicmVhazsKKwljYXNlIGtQZXJpb2RNdWx0aXBsaWVyXzJYOgorCQlzZXRQV01QZXJpb2RTY2FsZShtX3B3bV9wb3J0c1ttX2NoYW5uZWxdLCAxLCAmc3RhdHVzKTsgLy8gU3F1ZWxjaCAxIG91dCBvZiAyIG91dHB1dHMKKwkJYnJlYWs7CisJY2FzZSBrUGVyaW9kTXVsdGlwbGllcl8xWDoKKwkJc2V0UFdNUGVyaW9kU2NhbGUobV9wd21fcG9ydHNbbV9jaGFubmVsXSwgMCwgJnN0YXR1cyk7IC8vIERvbid0IHNxdWVsY2ggYW55IG91dHB1dHMKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJd3BpX2Fzc2VydChmYWxzZSk7CisJfQorCisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKK3ZvaWQgUFdNOjpTZXRaZXJvTGF0Y2goKQoreworCWlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKwkKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJCisJbGF0Y2hQV01aZXJvKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUG93ZXJEaXN0cmlidXRpb25QYW5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjNDBiMwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUG93ZXJEaXN0cmlidXRpb25QYW5lbC5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlBvd2VyRGlzdHJpYnV0aW9uUGFuZWwuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJIQUwvUERQLmhwcCIKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBQRFAuCisgKi8KK1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OlBvd2VyRGlzdHJpYnV0aW9uUGFuZWwoKSB7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIGlucHV0IHZvbHRhZ2Ugb2YgdGhlIFBEUAorICogQHJldHVybiBUaGUgdm9sdGFnZSBvZiB0aGUgUERQIGluIHZvbHRzCisgKi8KK2RvdWJsZQorUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6R2V0Vm9sdGFnZSgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJCisJZG91YmxlIHZvbHRhZ2UgPSBnZXRQRFBWb2x0YWdlKCZzdGF0dXMpOworCQorCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisJfQorCQorCXJldHVybiB2b2x0YWdlOworfQorCisvKioKKyAqIFF1ZXJ5IHRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgUERQCisgKiBAcmV0dXJuIFRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgUERQIGluIGRlZ3JlZXMgQ2Vsc2l1cworICovCitkb3VibGUKK1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFRlbXBlcmF0dXJlKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwkKKwlkb3VibGUgdGVtcGVyYXR1cmUgPSBnZXRQRFBUZW1wZXJhdHVyZSgmc3RhdHVzKTsKKwkKKwlpZihzdGF0dXMpIHsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgIiIpOworCX0KKwkKKwlyZXR1cm4gdGVtcGVyYXR1cmU7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIGN1cnJlbnQgb2YgYSBzaW5nbGUgY2hhbm5lbCBvZiB0aGUgUERQCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IG9mIG9uZSBvZiB0aGUgUERQIGNoYW5uZWxzIChjaGFubmVscyAwLTE1KSBpbiBBbXBlcmVzCisgKi8KK2RvdWJsZQorUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6R2V0Q3VycmVudCh1aW50OF90IGNoYW5uZWwpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJCisJaWYoIUNoZWNrUERQQ2hhbm5lbChjaGFubmVsKSkKKwl7CisJCWNoYXIgYnVmWzY0XTsKKwkJc25wcmludGYoYnVmLCA2NCwgIlBEUCBDaGFubmVsICVkIiwgY2hhbm5lbCk7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENoYW5uZWxJbmRleE91dE9mUmFuZ2UsIGJ1Zik7CisJfQorCQorCWRvdWJsZSBjdXJyZW50ID0gZ2V0UERQQ2hhbm5lbEN1cnJlbnQoY2hhbm5lbCwgJnN0YXR1cyk7CisJCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKwl9CisJCisJcmV0dXJuIGN1cnJlbnQ7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIHRvdGFsIGN1cnJlbnQgb2YgYWxsIG1vbml0b3JlZCBQRFAgY2hhbm5lbHMgKDAtMTUpCisgKiBAcmV0dXJuIFRoZSB0aGUgdG90YWwgY3VycmVudCBkcmF3biBmcm9tIHRoZSBQRFAgY2hhbm5lbHMgaW4gQW1wZXJlcworICovCitkb3VibGUKK1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFRvdGFsQ3VycmVudCgpIHsKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJCisJZG91YmxlIGN1cnJlbnQgPSBnZXRQRFBUb3RhbEN1cnJlbnQoJnN0YXR1cyk7CisJCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKwl9CisJCisJcmV0dXJuIGN1cnJlbnQ7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIHRvdGFsIHBvd2VyIGRyYXduIGZyb20gdGhlIG1vbml0b3JlZCBQRFAgY2hhbm5lbHMKKyAqIEByZXR1cm4gVGhlIHRoZSB0b3RhbCBwb3dlciBkcmF3biBmcm9tIHRoZSBQRFAgY2hhbm5lbHMgaW4gV2F0dHMKKyAqLworZG91YmxlCitQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRUb3RhbFBvd2VyKCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwkKKwlkb3VibGUgcG93ZXIgPSBnZXRQRFBUb3RhbFBvd2VyKCZzdGF0dXMpOworCQorCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisJfQorCQorCXJldHVybiBwb3dlcjsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgdG90YWwgZW5lcmd5IGRyYXduIGZyb20gdGhlIG1vbml0b3JlZCBQRFAgY2hhbm5lbHMKKyAqIEByZXR1cm4gVGhlIHRoZSB0b3RhbCBlbmVyZ3kgZHJhd24gZnJvbSB0aGUgUERQIGNoYW5uZWxzIGluIEpvdWxlcworICovCitkb3VibGUKK1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFRvdGFsRW5lcmd5KCkgeworCWludDMyX3Qgc3RhdHVzID0gMDsKKwkKKwlkb3VibGUgZW5lcmd5ID0gZ2V0UERQVG90YWxFbmVyZ3koJnN0YXR1cyk7CisJCisJaWYoc3RhdHVzKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKwl9CisJCisJcmV0dXJuIGVuZXJneTsKK30KKworLyoqCisgKiBSZXNldCB0aGUgdG90YWwgZW5lcmd5IGRyYXduIGZyb20gdGhlIFBEUAorICogQHNlZSBQb3dlckRpc3RyaWJ1dGlvblBhbmVsI0dldFRvdGFsRW5lcmd5CisgKi8KK3ZvaWQKK1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OlJlc2V0VG90YWxFbmVyZ3koKSB7IAorCWludDMyX3Qgc3RhdHVzID0gMDsKKwkKKwlyZXNldFBEUFRvdGFsRW5lcmd5KCZzdGF0dXMpOworCQorCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisJfQorfQorCisvKioKKyAqIFJlbW92ZSBhbGwgb2YgdGhlIGZhdWx0IGZsYWdzIG9uIHRoZSBQRFAKKyAqLwordm9pZAorUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6Q2xlYXJTdGlja3lGYXVsdHMoKSB7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCQorCWNsZWFyUERQU3RpY2t5RmF1bHRzKCZzdGF0dXMpOworCQorCWlmKHN0YXR1cykgeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9SZWxheS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1JlbGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNiNTBjCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9SZWxheS5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZQkqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSZWxheS5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKKy8vIEFsbG9jYXRlIGVhY2ggZGlyZWN0aW9uIHNlcGFyYXRlbHkuCitzdGF0aWMgUmVzb3VyY2UgKnJlbGF5Q2hhbm5lbHMgPSBOVUxMOworCisvKioKKyAqIENvbW1vbiByZWxheSBpbml0aWFsaXphdGlvbiBtZXRob2QuCisgKiBUaGlzIGNvZGUgaXMgY29tbW9uIHRvIGFsbCBSZWxheSBjb25zdHJ1Y3RvcnMgYW5kIGluaXRpYWxpemVzIHRoZSByZWxheSBhbmQgcmVzZXJ2ZXMKKyAqIGFsbCByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIGxvY2tlZC4gSW5pdGlhbGx5IHRoZSByZWxheSBpcyBzZXQgdG8gYm90aCBsaW5lcyBhdCAwdi4KKyAqLwordm9pZCBSZWxheTo6SW5pdFJlbGF5KCkKK3sKKwljaGFyIGJ1Zls2NF07CisJUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZyZWxheUNoYW5uZWxzLCBkaW9fa051bVN5c3RlbXMgKiBrUmVsYXlDaGFubmVscyAqIDIpOworCWlmICghU2Vuc29yQmFzZTo6Q2hlY2tSZWxheUNoYW5uZWwobV9jaGFubmVsKSkKKwl7CisJCXNucHJpbnRmKGJ1ZiwgNjQsICJSZWxheSBDaGFubmVsICVkIiwgbV9jaGFubmVsKTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIkZvcndhcmQgUmVsYXkgJWQiLCBtX2NoYW5uZWwpOworCQlpZiAocmVsYXlDaGFubmVscy0+QWxsb2NhdGUobV9jaGFubmVsICogMiwgYnVmKSA9PSB+MHVsKQorCQl7CisJCQlDbG9uZUVycm9yKHJlbGF5Q2hhbm5lbHMpOworCQkJcmV0dXJuOworCQl9CisKKwkJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JlbGF5LCBtX2NoYW5uZWwpOworCX0KKwlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkKKwl7CisJCXNucHJpbnRmKGJ1ZiwgNjQsICJSZXZlcnNlIFJlbGF5ICVkIiwgbV9jaGFubmVsKTsKKwkJaWYgKHJlbGF5Q2hhbm5lbHMtPkFsbG9jYXRlKG1fY2hhbm5lbCAqIDIgKyAxLCBidWYpID09IH4wdWwpCisJCXsKKwkJCUNsb25lRXJyb3IocmVsYXlDaGFubmVscyk7CisJCQlyZXR1cm47CisJCX0KKworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUmVsYXksIG1fY2hhbm5lbCArIDEyOCk7CisJfQorCisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNldFJlbGF5Rm9yd2FyZChtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKwlzZXRSZWxheVJldmVyc2UobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCBmYWxzZSwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKK30KKworLyoqCisgKiBSZWxheSBjb25zdHJ1Y3RvciBnaXZlbiBhIGNoYW5uZWwuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBudW1iZXIgKDAtMykuCisgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhhdCB0aGUgUmVsYXkgb2JqZWN0IHdpbGwgY29udHJvbC4KKyAqLworUmVsYXk6OlJlbGF5KHVpbnQzMl90IGNoYW5uZWwsIFJlbGF5OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQorCTogbV9jaGFubmVsIChjaGFubmVsKQorCSwgbV9kaXJlY3Rpb24gKGRpcmVjdGlvbikKK3sKKwlJbml0UmVsYXkoKTsKK30KKworLyoqCisgKiBGcmVlIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSByZWxheS4KKyAqIFRoZSByZWxheSBjaGFubmVscyBhcmUgc2V0IHRvIGZyZWUgYW5kIHRoZSByZWxheSBvdXRwdXQgaXMgdHVybmVkIG9mZi4KKyAqLworUmVsYXk6On5SZWxheSgpCit7CisKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc2V0UmVsYXlGb3J3YXJkKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworCXNldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KQorCXsKKwkJcmVsYXlDaGFubmVscy0+RnJlZShtX2NoYW5uZWwgKiAyKTsKKwl9CisJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpCisJeworCQlyZWxheUNoYW5uZWxzLT5GcmVlKG1fY2hhbm5lbCAqIDIgKyAxKTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSByZWxheSBzdGF0ZS4KKyAqCisgKiBWYWxpZCB2YWx1ZXMgZGVwZW5kIG9uIHdoaWNoIGRpcmVjdGlvbnMgb2YgdGhlIHJlbGF5IGFyZSBjb250cm9sbGVkIGJ5IHRoZSBvYmplY3QuCisgKgorICogV2hlbiBzZXQgdG8ga0JvdGhEaXJlY3Rpb25zLCB0aGUgcmVsYXkgY2FuIGJlIGFueSBvZiB0aGUgZm91ciBzdGF0ZXM6CisgKgkgMHYtMHYsIDB2LTEydiwgMTJ2LTB2LCAxMnYtMTJ2CisgKgorICogV2hlbiBzZXQgdG8ga0ZvcndhcmRPbmx5IG9yIGtSZXZlcnNlT25seSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBjb25zdGFudCBmb3IgdGhlCisgKgkgZGlyZWN0aW9uIG9yIHlvdSBjYW4gc2ltcGx5IHNwZWNpZnkga09mZiBhbmQga09uLiAgVXNpbmcgb25seSBrT2ZmIGFuZCBrT24gaXMKKyAqCSByZWNvbW1lbmRlZC4KKyAqCisgKiBAcGFyYW0gdmFsdWUgVGhlIHN0YXRlIHRvIHNldCB0aGUgcmVsYXkuCisgKi8KK3ZvaWQgUmVsYXk6OlNldChSZWxheTo6VmFsdWUgdmFsdWUpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisJaW50MzJfdCBzdGF0dXMgPSAwOworCisJc3dpdGNoICh2YWx1ZSkKKwl7CisJY2FzZSBrT2ZmOgorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkKKwkJeworCQkJc2V0UmVsYXlGb3J3YXJkKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworCQl9CisJCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KQorCQl7CisJCQlzZXRSZWxheVJldmVyc2UobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCBmYWxzZSwgJnN0YXR1cyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBrT246CisJCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KQorCQl7CisJCQlzZXRSZWxheUZvcndhcmQobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCB0cnVlLCAmc3RhdHVzKTsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkKKwkJeworCQkJc2V0UmVsYXlSZXZlcnNlKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgdHJ1ZSwgJnN0YXR1cyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBrRm9yd2FyZDoKKwkJaWYgKG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkKKwkJeworCQkJd3BpX3NldFdQSUVycm9yKEluY29tcGF0aWJsZU1vZGUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpCisJCXsKKwkJCXNldFJlbGF5Rm9yd2FyZChtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIHRydWUsICZzdGF0dXMpOworCQl9CisJCWlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMpCisJCXsKKwkJCXNldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGtSZXZlcnNlOgorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KQorCQl7CisJCQl3cGlfc2V0V1BJRXJyb3IoSW5jb21wYXRpYmxlTW9kZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zKQorCQl7CisJCQlzZXRSZWxheUZvcndhcmQobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCBmYWxzZSwgJnN0YXR1cyk7CisJCX0KKwkJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpCisJCXsKKwkJCXNldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIHRydWUsICZzdGF0dXMpOworCQl9CisJCWJyZWFrOworCX0KKworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgUmVsYXkgU3RhdGUKKyAqCisgKiBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZWxheS4KKyAqCisgKiBXaGVuIHNldCB0byBrRm9yd2FyZE9ubHkgb3Iga1JldmVyc2VPbmx5LCB2YWx1ZSBpcyByZXR1cm5lZCBhcyBrT24va09mZiBub3QKKyAqIGtGb3J3YXJkL2tSZXZlcnNlIChwZXIgdGhlIHJlY29tbWVuZGF0aW9uIGluIFNldCkKKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZWxheSBhcyBhIFJlbGF5OjpWYWx1ZQorICovCitSZWxheTo6VmFsdWUgUmVsYXk6OkdldCgpIHsKKwlpbnQzMl90IHN0YXR1czsKKworCWlmKGdldFJlbGF5Rm9yd2FyZChtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpKSB7CisJCWlmKGdldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpKSB7CisJCQlyZXR1cm4ga09uOworCQl9IGVsc2UgeworCQkJaWYobV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KSB7CisJCQkJcmV0dXJuIGtPbjsKKwkJCX0gZWxzZSB7CisJCQlyZXR1cm4ga0ZvcndhcmQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZihnZXRSZWxheVJldmVyc2UobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCAmc3RhdHVzKSkgeworCQkJaWYobV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KSB7CisJCQkJcmV0dXJuIGtPbjsKKwkJCX0gZWxzZSB7CisJCQlyZXR1cm4ga1JldmVyc2U7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4ga09mZjsKKwkJfQorCX0KKworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Sb2JvdEJhc2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Sb2JvdEJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMmM0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1JvYm90QmFzZS5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlJvYm90QmFzZS5oIgorCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vc3ltTW9kdWxlTGluay5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJSb2JvdFN0YXRlLmgiCisjaW5jbHVkZSAiSExVc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIkludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpZmRlZiBfX3Z4d29ya3MKKy8vIFZYV29ya3MgbmVlZHMgc29tIHNwZWNpYWwgdW5sb2FkaW5nIGNvZGUKKyNpbmNsdWRlIDxtb2R1bGVMaWIuaD4KKyNpbmNsdWRlIDx1bmxkTGliLmg+CisjaW5jbHVkZSA8dGFza0xpYi5oPgorI2VuZGlmCisKK1JvYm90QmFzZSogUm9ib3RCYXNlOjptX2luc3RhbmNlID0gTlVMTDsKKwordm9pZCBSb2JvdEJhc2U6OnNldEluc3RhbmNlKFJvYm90QmFzZSogcm9ib3QpCit7CisJd3BpX2Fzc2VydChtX2luc3RhbmNlID09IE5VTEwpOworCW1faW5zdGFuY2UgPSByb2JvdDsKK30KKworUm9ib3RCYXNlICZSb2JvdEJhc2U6OmdldEluc3RhbmNlKCkKK3sKKwlyZXR1cm4gKm1faW5zdGFuY2U7Cit9CisKK3ZvaWQgUm9ib3RCYXNlOjpyb2JvdFNldHVwKFJvYm90QmFzZSAqcm9ib3QpCit7CisJcm9ib3QtPlByZXN0YXJ0KCk7CisJcm9ib3QtPlN0YXJ0Q29tcGV0aXRpb24oKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBnZW5lcmljIHJvYm90IHByb2dyYW0uCisgKiBVc2VyIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgY29uc3RydWN0b3IgdGhhdCBydW5zIGJlZm9yZSB0aGUgQXV0b25vbW91cyBvciBPcGVyYXRvcgorICogQ29udHJvbCBwZXJpb2Qgc3RhcnRzLiBUaGUgY29uc3RydWN0b3Igd2lsbCBydW4gdG8gY29tcGxldGlvbiBiZWZvcmUgQXV0b25vbW91cyBpcyBlbnRlcmVkLgorICoKKyAqIFRoaXMgbXVzdCBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb21tdW5pY2F0aW9ucyBjb2RlIHN0YXJ0cy4gSW4gdGhlIGZ1dHVyZSBpdCB3b3VsZCBiZQorICogbmljZSB0byBwdXQgdGhpcyBjb2RlIGludG8gaXQncyBvd24gdGFzayB0aGF0IGxvYWRzIG9uIGJvb3Qgc28gZW5zdXJlIHRoYXQgaXQgcnVucy4KKyAqLworUm9ib3RCYXNlOjpSb2JvdEJhc2UoKQorCTogbV90YXNrIChOVUxMKQorCSwgbV9kcyAoTlVMTCkKK3sKKwltX2RzID0gRHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKTsKKwlSb2JvdFN0YXRlOjpTZXRJbXBsZW1lbnRhdGlvbihEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpKTsgXAorCUhMVXNhZ2VSZXBvcnRpbmc6OlNldEltcGxlbWVudGF0aW9uKG5ldyBIYXJkd2FyZUhMUmVwb3J0aW5nKCkpOyBcCisKKwlSb2JvdEJhc2U6OnNldEluc3RhbmNlKHRoaXMpOworCQorCUZJTEUgKmZpbGUgPSBOVUxMOworCWZpbGUgPSBmb3BlbigiL3RtcC9mcmNfdmVyc2lvbnMvRlJDX0xpYl9WZXJzaW9uLmluaSIsICJ3Iik7CisKKwlmcHV0cygiMjAxNSBDKysgMS4wLjAgLSBtb2RpZmllZCBieSBGUkMgVGVhbSA5NzEgU3BhcnRhbiBSb2JvdGljcyIsIGZpbGUpOworCWlmIChmaWxlICE9IE5VTEwpCisJZmNsb3NlKGZpbGUpOworfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlcyBmb3IgYSBSb2JvdEJhc2UgY2xhc3MuCisgKiBUaGlzIGluY2x1ZGVzIGRlbGV0aW5nIGFsbCBjbGFzc2VzIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhcyBTaW5nbGV0b25zIHRvIHRoZXkKKyAqIHdvdWxkIG5ldmVyIGJlIGRlbGV0ZWQgZXhjZXB0IGhlcmUuCisgKi8KK1JvYm90QmFzZTo6flJvYm90QmFzZSgpCit7CisJU2Vuc29yQmFzZTo6RGVsZXRlU2luZ2xldG9ucygpOworCWRlbGV0ZSBtX3Rhc2s7CisJbV90YXNrID0gTlVMTDsKKwltX2luc3RhbmNlID0gTlVMTDsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBlbmFibGVkLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBSb2JvdCBpcyBjdXJyZW50bHkgZW5hYmxlZCBieSB0aGUgZmllbGQgY29udHJvbHMuCisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc0VuYWJsZWQoKQoreworCXJldHVybiBtX2RzLT5Jc0VuYWJsZWQoKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBkaXNhYmxlZC4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgUm9ib3QgaXMgY3VycmVudGx5IGRpc2FibGVkIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzRGlzYWJsZWQoKQoreworCXJldHVybiBtX2RzLT5Jc0Rpc2FibGVkKCk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgaW4gQXV0b25vbW91cyBtb2RlLgorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgb3BlcmF0aW5nIEF1dG9ub21vdXNseSBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzQXV0b25vbW91cygpCit7CisJcmV0dXJuIG1fZHMtPklzQXV0b25vbW91cygpOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IGluIE9wZXJhdG9yIENvbnRyb2wgbW9kZS4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IG9wZXJhdGluZyBpbiBUZWxlLU9wIG1vZGUgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmllbGQgY29udHJvbHMuCisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc09wZXJhdG9yQ29udHJvbCgpCit7CisJcmV0dXJuIG1fZHMtPklzT3BlcmF0b3JDb250cm9sKCk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgaW4gVGVzdCBtb2RlLgorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgcnVubmluZyB0ZXN0cyBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzVGVzdCgpCit7CisgICAgcmV0dXJuIG1fZHMtPklzVGVzdCgpOworfQorCisvKioKKyAqIFRoaXMgaG9vayBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIHN0YXJ0Q29tcGV0aXRpb24oKS4gQnkgZGVmYXVsdCwgdGVsbCB0aGUgRFMgdGhhdCB0aGUgcm9ib3QgaXMgbm93IHJlYWR5IHRvCisgKiBiZSBlbmFibGVkLiBJZiB5b3UgZG9uJ3Qgd2FudCBmb3IgdGhlIHJvYm90IHRvIGJlIGVuYWJsZWQgeWV0LCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRvIG5vdGhpbmcuCisgKiBJZiB5b3UgZG8gc28sIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCkgZnJvbSB5b3VyIGNvZGUgd2hlbgorICogeW91IGFyZSByZWFkeSBmb3IgdGhlIHJvYm90IHRvIGJlIGVuYWJsZWQuCisgKi8KK3ZvaWQgUm9ib3RCYXNlOjpQcmVzdGFydCgpCit7CisJSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1TdGFydGluZygpOworfQorCisvKioKKyAqIEluZGljYXRlcyBpZiBuZXcgZGF0YSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgZHJpdmVyIHN0YXRpb24uCisgKiBAcmV0dXJuIEhhcyBuZXcgZGF0YSBhcnJpdmVkIG92ZXIgdGhlIG5ldHdvcmsgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQ/CisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc05ld0RhdGFBdmFpbGFibGUoKQoreworCXJldHVybiBtX2RzLT5Jc05ld0NvbnRyb2xEYXRhKCk7Cit9CisKKy8qKgorICogVGhpcyBjbGFzcyBleGlzdHMgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgZ2V0dGluZyBpdHMgZGVzdHJ1Y3RvciBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIHVubG9hZHMuCisgKiBCZWZvcmUgdGhlIG1vZHVsZSBpcyBkb25lIHVubG9hZGluZywgd2UgbmVlZCB0byBkZWxldGUgdGhlIFJvYm90QmFzZSBkZXJpdmVkIHNpbmdsZXRvbi4gIFRoaXMgc2hvdWxkIGRlbGV0ZQorICogdGhlIG90aGVyIHJlbWFpbmluZyBzaW5nbGV0b25zIHRoYXQgd2VyZSByZWdpc3RlcmVkLiAgVGhpcyBzaG91bGQgYWxzbyBzdG9wIGFsbCB0YXNrcyB0aGF0IGFyZSB1c2luZworICogdGhlIFRhc2sgY2xhc3MuCisgKi8KK2NsYXNzIFJvYm90RGVsZXRlcgoreworcHVibGljOgorCVJvYm90RGVsZXRlcigpIHt9CisJflJvYm90RGVsZXRlcigpCisJeworCQlkZWxldGUgJlJvYm90QmFzZTo6Z2V0SW5zdGFuY2UoKTsKKwl9Cit9Oworc3RhdGljIFJvYm90RGVsZXRlciBnX3JvYm90RGVsZXRlcjsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvUm9ib3REcml2ZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1JvYm90RHJpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjkwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1JvYm90RHJpdmUuY3BwCkBAIC0wLDAgKzEsNzUyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSb2JvdERyaXZlLmgiCisKKyNpbmNsdWRlICJDQU5KYWd1YXIuaCIKKyNpbmNsdWRlICJHZW5lcmljSElELmgiCisjaW5jbHVkZSAiSm95c3RpY2suaCIKKyNpbmNsdWRlICJUYWxvbi5oIgorLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorCisjdW5kZWYgbWF4CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCitjb25zdCBpbnQzMl90IFJvYm90RHJpdmU6OmtNYXhOdW1iZXJPZk1vdG9yczsKKworLyoKKyAqIERyaXZpbmcgZnVuY3Rpb25zCisgKiBUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBhbiBpbnRlcmZhY2UgdG8gbXVsdGlwbGUgbW90b3JzIHRoYXQgaXMgdXNlZCBmb3IgQyBwcm9ncmFtbWluZworICogVGhlIERyaXZlKHNwZWVkLCBkaXJlY3Rpb24pIGZ1bmN0aW9uIGlzIHRoZSBtYWluIHBhcnQgb2YgdGhlIHNldCB0aGF0IG1ha2VzIGl0IGVhc3kKKyAqIHRvIHNldCBzcGVlZHMgYW5kIGRpcmVjdGlvbiBpbmRlcGVuZGVudGx5IGluIG9uZSBjYWxsLgorICovCisKKy8qKgorICogQ29tbW9uIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYWxsIHRoZSByb2JvdCBkcml2ZSBjb25zdHJ1Y3RvcnMuCisgKiBDcmVhdGUgYSBtb3RvciBzYWZldHkgb2JqZWN0ICh0aGUgcmVhbCByZWFzb24gZm9yIHRoZSBjb21tb24gY29kZSkgYW5kCisgKiBpbml0aWFsaXplIGFsbCB0aGUgbW90b3IgYXNzaWdubWVudHMuIFRoZSBkZWZhdWx0IHRpbWVvdXQgaXMgc2V0IGZvciB0aGUgcm9ib3QgZHJpdmUuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6SW5pdFJvYm90RHJpdmUoKSB7CisJbV9mcm9udExlZnRNb3RvciA9IE5VTEw7CisJbV9mcm9udFJpZ2h0TW90b3IgPSBOVUxMOworCW1fcmVhclJpZ2h0TW90b3IgPSBOVUxMOworCW1fcmVhckxlZnRNb3RvciA9IE5VTEw7CisJbV9zZW5zaXRpdml0eSA9IDAuNTsKKwltX21heE91dHB1dCA9IDEuMDsKKwltX3NhZmV0eUhlbHBlciA9IG5ldyBNb3RvclNhZmV0eUhlbHBlcih0aGlzKTsKKwltX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZCh0cnVlKTsKKwltX3N5bmNHcm91cCA9IDA7Cit9CisKKy8qKiAKKyAqIENvbnN0cnVjdG9yIGZvciBSb2JvdERyaXZlIHdpdGggMiBtb3RvcnMgc3BlY2lmaWVkIHdpdGggY2hhbm5lbCBudW1iZXJzLgorICogU2V0IHVwIHBhcmFtZXRlcnMgZm9yIGEgdHdvIHdoZWVsIGRyaXZlIHN5c3RlbSB3aGVyZSB0aGUKKyAqIGxlZnQgYW5kIHJpZ2h0IG1vdG9yIHB3bSBjaGFubmVscyBhcmUgc3BlY2lmaWVkIGluIHRoZSBjYWxsLgorICogVGhpcyBjYWxsIGFzc3VtZXMgVGFsb25zIGZvciBjb250cm9sbGluZyB0aGUgbW90b3JzLgorICogQHBhcmFtIGxlZnRNb3RvckNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlciB0aGF0IGRyaXZlcyB0aGUgbGVmdCBtb3Rvci4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICogQHBhcmFtIHJpZ2h0TW90b3JDaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIgdGhhdCBkcml2ZXMgdGhlIHJpZ2h0IG1vdG9yLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK1JvYm90RHJpdmU6OlJvYm90RHJpdmUodWludDMyX3QgbGVmdE1vdG9yQ2hhbm5lbCwgdWludDMyX3QgcmlnaHRNb3RvckNoYW5uZWwpCit7CisJSW5pdFJvYm90RHJpdmUoKTsKKwltX3JlYXJMZWZ0TW90b3IgPSBuZXcgVGFsb24obGVmdE1vdG9yQ2hhbm5lbCk7CisJbV9yZWFyUmlnaHRNb3RvciA9IG5ldyBUYWxvbihyaWdodE1vdG9yQ2hhbm5lbCk7CisJZm9yIChpbnQzMl90IGk9MDsgaSA8IGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKQorCXsKKwkJbV9pbnZlcnRlZE1vdG9yc1tpXSA9IDE7CisJfQorCVNldExlZnRSaWdodE1vdG9yT3V0cHV0cygwLjAsIDAuMCk7CisJbV9kZWxldGVTcGVlZENvbnRyb2xsZXJzID0gdHJ1ZTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgUm9ib3REcml2ZSB3aXRoIDQgbW90b3JzIHNwZWNpZmllZCB3aXRoIGNoYW5uZWwgbnVtYmVycy4KKyAqIFNldCB1cCBwYXJhbWV0ZXJzIGZvciBhIGZvdXIgd2hlZWwgZHJpdmUgc3lzdGVtIHdoZXJlIGFsbCBmb3VyIG1vdG9yCisgKiBwd20gY2hhbm5lbHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2FsbC4KKyAqIFRoaXMgY2FsbCBhc3N1bWVzIFRhbG9ucyBmb3IgY29udHJvbGxpbmcgdGhlIG1vdG9ycy4KKyAqIEBwYXJhbSBmcm9udExlZnRNb3RvciBGcm9udCBsZWZ0IG1vdG9yIGNoYW5uZWwgbnVtYmVyLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKiBAcGFyYW0gcmVhckxlZnRNb3RvciBSZWFyIExlZnQgbW90b3IgY2hhbm5lbCBudW1iZXIuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqIEBwYXJhbSBmcm9udFJpZ2h0TW90b3IgRnJvbnQgcmlnaHQgbW90b3IgY2hhbm5lbCBudW1iZXIuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqIEBwYXJhbSByZWFyUmlnaHRNb3RvciBSZWFyIFJpZ2h0IG1vdG9yIGNoYW5uZWwgbnVtYmVyLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK1JvYm90RHJpdmU6OlJvYm90RHJpdmUodWludDMyX3QgZnJvbnRMZWZ0TW90b3IsIHVpbnQzMl90IHJlYXJMZWZ0TW90b3IsCisJCXVpbnQzMl90IGZyb250UmlnaHRNb3RvciwgdWludDMyX3QgcmVhclJpZ2h0TW90b3IpCit7CisJSW5pdFJvYm90RHJpdmUoKTsKKwltX3JlYXJMZWZ0TW90b3IgPSBuZXcgVGFsb24ocmVhckxlZnRNb3Rvcik7CisJbV9yZWFyUmlnaHRNb3RvciA9IG5ldyBUYWxvbihyZWFyUmlnaHRNb3Rvcik7CisJbV9mcm9udExlZnRNb3RvciA9IG5ldyBUYWxvbihmcm9udExlZnRNb3Rvcik7CisJbV9mcm9udFJpZ2h0TW90b3IgPSBuZXcgVGFsb24oZnJvbnRSaWdodE1vdG9yKTsKKwlmb3IgKGludDMyX3QgaT0wOyBpIDwga01heE51bWJlck9mTW90b3JzOyBpKyspCisJeworCQltX2ludmVydGVkTW90b3JzW2ldID0gMTsKKwl9CisJU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKDAuMCwgMC4wKTsKKwltX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnMgPSB0cnVlOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBSb2JvdERyaXZlIHdpdGggMiBtb3RvcnMgc3BlY2lmaWVkIGFzIFNwZWVkQ29udHJvbGxlciBvYmplY3RzLgorICogVGhlIFNwZWVkQ29udHJvbGxlciB2ZXJzaW9uIG9mIHRoZSBjb25zdHJ1Y3RvciBlbmFibGVzIHByb2dyYW1zIHRvIHVzZSB0aGUgUm9ib3REcml2ZSBjbGFzc2VzIHdpdGgKKyAqIHN1YmNsYXNzZXMgb2YgdGhlIFNwZWVkQ29udHJvbGxlciBvYmplY3RzLCBmb3IgZXhhbXBsZSwgdmVyc2lvbnMgd2l0aCByYW1waW5nIG9yIHJlc2hhcGluZyBvZgorICogdGhlIGN1cnZlIHRvIHN1aXQgbW90b3IgYmlhcyBvciBkZWFkYmFuZCBlbGltaW5hdGlvbi4KKyAqIEBwYXJhbSBsZWZ0TW90b3IgVGhlIGxlZnQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4gCisgKiBAcGFyYW0gcmlnaHRNb3RvciB0aGUgcmlnaHQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KKyAqLworUm9ib3REcml2ZTo6Um9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgKmxlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyICpyaWdodE1vdG9yKQoreworCUluaXRSb2JvdERyaXZlKCk7CisJaWYgKGxlZnRNb3RvciA9PSBOVUxMIHx8IHJpZ2h0TW90b3IgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKwkJbV9yZWFyTGVmdE1vdG9yID0gbV9yZWFyUmlnaHRNb3RvciA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJbV9yZWFyTGVmdE1vdG9yID0gbGVmdE1vdG9yOworCW1fcmVhclJpZ2h0TW90b3IgPSByaWdodE1vdG9yOworCWZvciAoaW50MzJfdCBpPTA7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykKKwl7CisJCW1faW52ZXJ0ZWRNb3RvcnNbaV0gPSAxOworCX0KKwltX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnMgPSBmYWxzZTsKK30KKworUm9ib3REcml2ZTo6Um9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgJmxlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyICZyaWdodE1vdG9yKQoreworCUluaXRSb2JvdERyaXZlKCk7CisJbV9yZWFyTGVmdE1vdG9yID0gJmxlZnRNb3RvcjsKKwltX3JlYXJSaWdodE1vdG9yID0gJnJpZ2h0TW90b3I7CisJZm9yIChpbnQzMl90IGk9MDsgaSA8IGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKQorCXsKKwkJbV9pbnZlcnRlZE1vdG9yc1tpXSA9IDE7CisJfQorCW1fZGVsZXRlU3BlZWRDb250cm9sbGVycyA9IGZhbHNlOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBSb2JvdERyaXZlIHdpdGggNCBtb3RvcnMgc3BlY2lmaWVkIGFzIFNwZWVkQ29udHJvbGxlciBvYmplY3RzLgorICogU3BlZWQgY29udHJvbGxlciBpbnB1dCB2ZXJzaW9uIG9mIFJvYm90RHJpdmUgKHNlZSBwcmV2aW91cyBjb21tZW50cykuCisgKiBAcGFyYW0gcmVhckxlZnRNb3RvciBUaGUgYmFjayBsZWZ0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuCisgKiBAcGFyYW0gZnJvbnRMZWZ0TW90b3IgVGhlIGZyb250IGxlZnQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdAorICogQHBhcmFtIHJlYXJSaWdodE1vdG9yIFRoZSBiYWNrIHJpZ2h0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuCisgKiBAcGFyYW0gZnJvbnRSaWdodE1vdG9yIFRoZSBmcm9udCByaWdodCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUgdGhlIHJvYm90LgorICovCitSb2JvdERyaXZlOjpSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAqZnJvbnRMZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAqcmVhckxlZnRNb3RvciwKKwkJCQkJCVNwZWVkQ29udHJvbGxlciAqZnJvbnRSaWdodE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJlYXJSaWdodE1vdG9yKQoreworCUluaXRSb2JvdERyaXZlKCk7CisJaWYgKGZyb250TGVmdE1vdG9yID09IE5VTEwgfHwgcmVhckxlZnRNb3RvciA9PSBOVUxMIHx8IGZyb250UmlnaHRNb3RvciA9PSBOVUxMIHx8IHJlYXJSaWdodE1vdG9yID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisJCXJldHVybjsKKwl9CisJbV9mcm9udExlZnRNb3RvciA9IGZyb250TGVmdE1vdG9yOworCW1fcmVhckxlZnRNb3RvciA9IHJlYXJMZWZ0TW90b3I7CisJbV9mcm9udFJpZ2h0TW90b3IgPSBmcm9udFJpZ2h0TW90b3I7CisJbV9yZWFyUmlnaHRNb3RvciA9IHJlYXJSaWdodE1vdG9yOworCWZvciAoaW50MzJfdCBpPTA7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykKKwl7CisJCW1faW52ZXJ0ZWRNb3RvcnNbaV0gPSAxOworCX0KKwltX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnMgPSBmYWxzZTsKK30KKworUm9ib3REcml2ZTo6Um9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgJmZyb250TGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgJnJlYXJMZWZ0TW90b3IsCisJCQkJCQlTcGVlZENvbnRyb2xsZXIgJmZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyICZyZWFyUmlnaHRNb3RvcikKK3sKKwlJbml0Um9ib3REcml2ZSgpOworCW1fZnJvbnRMZWZ0TW90b3IgPSAmZnJvbnRMZWZ0TW90b3I7CisJbV9yZWFyTGVmdE1vdG9yID0gJnJlYXJMZWZ0TW90b3I7CisJbV9mcm9udFJpZ2h0TW90b3IgPSAmZnJvbnRSaWdodE1vdG9yOworCW1fcmVhclJpZ2h0TW90b3IgPSAmcmVhclJpZ2h0TW90b3I7CisJZm9yIChpbnQzMl90IGk9MDsgaSA8IGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKQorCXsKKwkJbV9pbnZlcnRlZE1vdG9yc1tpXSA9IDE7CisJfQorCW1fZGVsZXRlU3BlZWRDb250cm9sbGVycyA9IGZhbHNlOworfQorCisvKioKKyAqIFJvYm90RHJpdmUgZGVzdHJ1Y3Rvci4KKyAqIERlbGV0ZXMgbW90b3Igb2JqZWN0cyB0aGF0IHdlcmUgbm90IHBhc3NlZCBpbiBhbmQgY3JlYXRlZCBpbnRlcm5hbGx5IG9ubHkuCisgKiovCitSb2JvdERyaXZlOjp+Um9ib3REcml2ZSgpCit7CisJaWYgKG1fZGVsZXRlU3BlZWRDb250cm9sbGVycykKKwl7CisJCWRlbGV0ZSBtX2Zyb250TGVmdE1vdG9yOworCQlkZWxldGUgbV9yZWFyTGVmdE1vdG9yOworCQlkZWxldGUgbV9mcm9udFJpZ2h0TW90b3I7CisJCWRlbGV0ZSBtX3JlYXJSaWdodE1vdG9yOworCX0KKwlkZWxldGUgbV9zYWZldHlIZWxwZXI7Cit9CisKKy8qKgorICogRHJpdmUgdGhlIG1vdG9ycyBhdCAic3BlZWQiIGFuZCAiY3VydmUiLgorICoKKyAqIFRoZSBzcGVlZCBhbmQgY3VydmUgYXJlIC0xLjAgdG8gKzEuMCB2YWx1ZXMgd2hlcmUgMC4wIHJlcHJlc2VudHMgc3RvcHBlZCBhbmQKKyAqIG5vdCB0dXJuaW5nLiBUaGUgYWxnb3JpdGhtIGZvciBhZGRpbmcgaW4gdGhlIGRpcmVjdGlvbiBhdHRlbXB0cyB0byBwcm92aWRlIGEgY29uc3RhbnQKKyAqIHR1cm4gcmFkaXVzIGZvciBkaWZmZXJpbmcgc3BlZWRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBtb3N0IGxpa2VseSBiZSB1c2VkIGluIGFuIGF1dG9ub21vdXMgcm91dGluZS4KKyAqCisgKiBAcGFyYW0gb3V0cHV0TWFnbml0dWRlIFRoZSBmb3J3YXJkIGNvbXBvbmVudCBvZiB0aGUgb3V0cHV0IG1hZ25pdHVkZSB0byBzZW5kIHRvIHRoZSBtb3RvcnMuCisgKiBAcGFyYW0gY3VydmUgVGhlIHJhdGUgb2YgdHVybiwgY29uc3RhbnQgZm9yIGRpZmZlcmVudCBmb3J3YXJkIHNwZWVkcy4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpEcml2ZShmbG9hdCBvdXRwdXRNYWduaXR1ZGUsIGZsb2F0IGN1cnZlKQoreworCWZsb2F0IGxlZnRPdXRwdXQsIHJpZ2h0T3V0cHV0OworCXN0YXRpYyBib29sIHJlcG9ydGVkID0gZmFsc2U7CisJaWYgKCFyZXBvcnRlZCkKKwl7CisJCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCBHZXROdW1Nb3RvcnMoKSwgSEFMVXNhZ2VSZXBvcnRpbmc6OmtSb2JvdERyaXZlX0FyY2FkZVJhdGlvQ3VydmUpOworCQlyZXBvcnRlZCA9IHRydWU7CisJfQorCisJaWYgKGN1cnZlIDwgMCkKKwl7CisJCWZsb2F0IHZhbHVlID0gbG9nKC1jdXJ2ZSk7CisJCWZsb2F0IHJhdGlvID0gKHZhbHVlIC0gbV9zZW5zaXRpdml0eSkvKHZhbHVlICsgbV9zZW5zaXRpdml0eSk7CisJCWlmIChyYXRpbyA9PSAwKSByYXRpbyA9LjAwMDAwMDAwMDE7CisJCWxlZnRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGUgLyByYXRpbzsKKwkJcmlnaHRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7CisJfQorCWVsc2UgaWYgKGN1cnZlID4gMCkKKwl7CisJCWZsb2F0IHZhbHVlID0gbG9nKGN1cnZlKTsKKwkJZmxvYXQgcmF0aW8gPSAodmFsdWUgLSBtX3NlbnNpdGl2aXR5KS8odmFsdWUgKyBtX3NlbnNpdGl2aXR5KTsKKwkJaWYgKHJhdGlvID09IDApIHJhdGlvID0uMDAwMDAwMDAwMTsKKwkJbGVmdE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZTsKKwkJcmlnaHRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGUgLyByYXRpbzsKKwl9CisJZWxzZQorCXsKKwkJbGVmdE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZTsKKwkJcmlnaHRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7CisJfQorCVNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhsZWZ0T3V0cHV0LCByaWdodE91dHB1dCk7Cit9CisKKy8qKgorICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4KKyAqIERyaXZlIHRoZSByb2JvdCB1c2luZyB0d28gam95c3RpY2sgaW5wdXRzLiBUaGUgWS1heGlzIHdpbGwgYmUgc2VsZWN0ZWQgZnJvbQorICogZWFjaCBKb3lzdGljayBvYmplY3QuCisgKiBAcGFyYW0gbGVmdFN0aWNrIFRoZSBqb3lzdGljayB0byBjb250cm9sIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJvYm90LgorICogQHBhcmFtIHJpZ2h0U3RpY2sgVGhlIGpveXN0aWNrIHRvIGNvbnRyb2wgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJvYm90LgorICovCit2b2lkIFJvYm90RHJpdmU6OlRhbmtEcml2ZShHZW5lcmljSElEICpsZWZ0U3RpY2ssIEdlbmVyaWNISUQgKnJpZ2h0U3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwlpZiAobGVmdFN0aWNrID09IE5VTEwgfHwgcmlnaHRTdGljayA9PSBOVUxMKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworCQlyZXR1cm47CisJfQorCVRhbmtEcml2ZShsZWZ0U3RpY2stPkdldFkoKSwgcmlnaHRTdGljay0+R2V0WSgpLCBzcXVhcmVkSW5wdXRzKTsKK30KKwordm9pZCBSb2JvdERyaXZlOjpUYW5rRHJpdmUoR2VuZXJpY0hJRCAmbGVmdFN0aWNrLCBHZW5lcmljSElEICZyaWdodFN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJVGFua0RyaXZlKGxlZnRTdGljay5HZXRZKCksIHJpZ2h0U3RpY2suR2V0WSgpLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBQcm92aWRlIHRhbmsgc3RlZXJpbmcgdXNpbmcgdGhlIHN0b3JlZCByb2JvdCBjb25maWd1cmF0aW9uLgorICogVGhpcyBmdW5jdGlvbiBsZXRzIHlvdSBwaWNrIHRoZSBheGlzIHRvIGJlIHVzZWQgb24gZWFjaCBKb3lzdGljayBvYmplY3QgZm9yIHRoZSBsZWZ0CisgKiBhbmQgcmlnaHQgc2lkZXMgb2YgdGhlIHJvYm90LgorICogQHBhcmFtIGxlZnRTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIGxlZnQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKiBAcGFyYW0gbGVmdEF4aXMgVGhlIGF4aXMgdG8gc2VsZWN0IG9uIHRoZSBsZWZ0IHNpZGUgSm95c3RpY2sgb2JqZWN0LgorICogQHBhcmFtIHJpZ2h0U3RpY2sgVGhlIEpveXN0aWNrIG9iamVjdCB0byB1c2UgZm9yIHRoZSByaWdodCBzaWRlIG9mIHRoZSByb2JvdC4KKyAqIEBwYXJhbSByaWdodEF4aXMgVGhlIGF4aXMgdG8gc2VsZWN0IG9uIHRoZSByaWdodCBzaWRlIEpveXN0aWNrIG9iamVjdC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpUYW5rRHJpdmUoR2VuZXJpY0hJRCAqbGVmdFN0aWNrLCB1aW50MzJfdCBsZWZ0QXhpcywKKwkJR2VuZXJpY0hJRCAqcmlnaHRTdGljaywgdWludDMyX3QgcmlnaHRBeGlzLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJaWYgKGxlZnRTdGljayA9PSBOVUxMIHx8IHJpZ2h0U3RpY2sgPT0gTlVMTCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKwkJcmV0dXJuOworCX0KKwlUYW5rRHJpdmUobGVmdFN0aWNrLT5HZXRSYXdBeGlzKGxlZnRBeGlzKSwgcmlnaHRTdGljay0+R2V0UmF3QXhpcyhyaWdodEF4aXMpLCBzcXVhcmVkSW5wdXRzKTsKK30KKwordm9pZCBSb2JvdERyaXZlOjpUYW5rRHJpdmUoR2VuZXJpY0hJRCAmbGVmdFN0aWNrLCB1aW50MzJfdCBsZWZ0QXhpcywKKwkJR2VuZXJpY0hJRCAmcmlnaHRTdGljaywgdWludDMyX3QgcmlnaHRBeGlzLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJVGFua0RyaXZlKGxlZnRTdGljay5HZXRSYXdBeGlzKGxlZnRBeGlzKSwgcmlnaHRTdGljay5HZXRSYXdBeGlzKHJpZ2h0QXhpcyksIHNxdWFyZWRJbnB1dHMpOworfQorCisKKy8qKgorICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkgcHJvdmlkZSBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLgorICogQHBhcmFtIGxlZnRWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGxlZnQgc3RpY2suCisgKiBAcGFyYW0gcmlnaHRWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHJpZ2h0IHN0aWNrLgorICovCit2b2lkIFJvYm90RHJpdmU6OlRhbmtEcml2ZShmbG9hdCBsZWZ0VmFsdWUsIGZsb2F0IHJpZ2h0VmFsdWUsIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwlzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOworCWlmICghcmVwb3J0ZWQpCisJeworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9UYW5rKTsKKwkJcmVwb3J0ZWQgPSB0cnVlOworCX0KKworCS8vIHNxdWFyZSB0aGUgaW5wdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBzaWduKSB0byBpbmNyZWFzZSBmaW5lIGNvbnRyb2wgd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyCisJbGVmdFZhbHVlID0gTGltaXQobGVmdFZhbHVlKTsKKwlyaWdodFZhbHVlID0gTGltaXQocmlnaHRWYWx1ZSk7CisJaWYoc3F1YXJlZElucHV0cykKKwl7CisJCWlmIChsZWZ0VmFsdWUgPj0gMC4wKQorCQl7CisJCQlsZWZ0VmFsdWUgPSAobGVmdFZhbHVlICogbGVmdFZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxlZnRWYWx1ZSA9IC0obGVmdFZhbHVlICogbGVmdFZhbHVlKTsKKwkJfQorCQlpZiAocmlnaHRWYWx1ZSA+PSAwLjApCisJCXsKKwkJCXJpZ2h0VmFsdWUgPSAocmlnaHRWYWx1ZSAqIHJpZ2h0VmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJcmlnaHRWYWx1ZSA9IC0ocmlnaHRWYWx1ZSAqIHJpZ2h0VmFsdWUpOworCQl9CisJfQorCisJU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7Cit9CisKKy8qKgorICogQXJjYWRlIGRyaXZlIGltcGxlbWVudHMgc2luZ2xlIHN0aWNrIGRyaXZpbmcuCisgKiBHaXZlbiBhIHNpbmdsZSBKb3lzdGljaywgdGhlIGNsYXNzIGFzc3VtZXMgdGhlIFkgYXhpcyBmb3IgdGhlIG1vdmUgdmFsdWUgYW5kIHRoZSBYIGF4aXMKKyAqIGZvciB0aGUgcm90YXRlIHZhbHVlLgorICogKFNob3VsZCBhZGQgbW9yZSBpbmZvcm1hdGlvbiBoZXJlIHJlZ2FyZGluZyB0aGUgd2F5IHRoYXQgYXJjYWRlIGRyaXZlIHdvcmtzLikKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgdG8gdXNlIGZvciBBcmNhZGUgc2luZ2xlLXN0aWNrIGRyaXZpbmcuIFRoZSBZLWF4aXMgd2lsbCBiZSBzZWxlY3RlZAorICogZm9yIGZvcndhcmRzL2JhY2t3YXJkcyBhbmQgdGhlIFgtYXhpcyB3aWxsIGJlIHNlbGVjdGVkIGZvciByb3RhdGlvbiByYXRlLgorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgSWYgdHJ1ZSwgdGhlIHNlbnNpdGl2aXR5IHdpbGwgYmUgaW5jcmVhc2VkIGZvciBzbWFsbCB2YWx1ZXMKKyAqLwordm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShHZW5lcmljSElEICpzdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzKQoreworCS8vIHNpbXBseSBjYWxsIHRoZSBmdWxsLWZlYXR1cmVkIEFyY2FkZURyaXZlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcworCUFyY2FkZURyaXZlKHN0aWNrLT5HZXRZKCksIHN0aWNrLT5HZXRYKCksIHNxdWFyZWRJbnB1dHMpOworfQorCisvKioKKyAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLgorICogR2l2ZW4gYSBzaW5nbGUgSm95c3RpY2ssIHRoZSBjbGFzcyBhc3N1bWVzIHRoZSBZIGF4aXMgZm9yIHRoZSBtb3ZlIHZhbHVlIGFuZCB0aGUgWCBheGlzCisgKiBmb3IgdGhlIHJvdGF0ZSB2YWx1ZS4KKyAqIChTaG91bGQgYWRkIG1vcmUgaW5mb3JtYXRpb24gaGVyZSByZWdhcmRpbmcgdGhlIHdheSB0aGF0IGFyY2FkZSBkcml2ZSB3b3Jrcy4pCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHRvIHVzZSBmb3IgQXJjYWRlIHNpbmdsZS1zdGljayBkcml2aW5nLiBUaGUgWS1heGlzIHdpbGwgYmUgc2VsZWN0ZWQKKyAqIGZvciBmb3J3YXJkcy9iYWNrd2FyZHMgYW5kIHRoZSBYLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmb3Igcm90YXRpb24gcmF0ZS4KKyAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIElmIHRydWUsIHRoZSBzZW5zaXRpdml0eSB3aWxsIGJlIGluY3JlYXNlZCBmb3Igc21hbGwgdmFsdWVzCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6QXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAmc3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwkvLyBzaW1wbHkgY2FsbCB0aGUgZnVsbC1mZWF0dXJlZCBBcmNhZGVEcml2ZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMKKwlBcmNhZGVEcml2ZShzdGljay5HZXRZKCksIHN0aWNrLkdldFgoKSwgc3F1YXJlZElucHV0cyk7Cit9CisKKy8qKgorICogQXJjYWRlIGRyaXZlIGltcGxlbWVudHMgc2luZ2xlIHN0aWNrIGRyaXZpbmcuCisgKiBHaXZlbiB0d28gam95c3RpY2sgaW5zdGFuY2VzIGFuZCB0d28gYXhpcywgY29tcHV0ZSB0aGUgdmFsdWVzIHRvIHNlbmQgdG8gZWl0aGVyIHR3bworICogb3IgZm91ciBtb3RvcnMuCisgKiBAcGFyYW0gbW92ZVN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBmb3J3YXJkL2JhY2t3YXJkIGRpcmVjdGlvbgorICogQHBhcmFtIG1vdmVBeGlzIFRoZSBheGlzIG9uIHRoZSBtb3ZlU3RpY2sgb2JqZWN0IHRvIHVzZSBmb3IgZm93YXJkcy9iYWNrd2FyZHMgKHR5cGljYWxseSBZX0FYSVMpCisgKiBAcGFyYW0gcm90YXRlU3RpY2sgVGhlIEpveXN0aWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIHZhbHVlCisgKiBAcGFyYW0gcm90YXRlQXhpcyBUaGUgYXhpcyBvbiB0aGUgcm90YXRpb24gb2JqZWN0IHRvIHVzZSBmb3IgdGhlIHJvdGF0ZSByaWdodC9sZWZ0ICh0eXBpY2FsbHkgWF9BWElTKQorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGluY3JlYXNlcyB0aGUgc2Vuc2l0aXZpdHkgYXQgbG93ZXIgc3BlZWRzCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6QXJjYWRlRHJpdmUoR2VuZXJpY0hJRCogbW92ZVN0aWNrLCB1aW50MzJfdCBtb3ZlQXhpcywKKwkJCQkJCQkJR2VuZXJpY0hJRCogcm90YXRlU3RpY2ssIHVpbnQzMl90IHJvdGF0ZUF4aXMsCisJCQkJCQkJCWJvb2wgc3F1YXJlZElucHV0cykKK3sKKwlmbG9hdCBtb3ZlVmFsdWUgPSBtb3ZlU3RpY2stPkdldFJhd0F4aXMobW92ZUF4aXMpOworCWZsb2F0IHJvdGF0ZVZhbHVlID0gcm90YXRlU3RpY2stPkdldFJhd0F4aXMocm90YXRlQXhpcyk7CisKKwlBcmNhZGVEcml2ZShtb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIEdpdmVuIHR3byBqb3lzdGljayBpbnN0YW5jZXMgYW5kIHR3byBheGlzLCBjb21wdXRlIHRoZSB2YWx1ZXMgdG8gc2VuZCB0byBlaXRoZXIgdHdvCisgKiBvciBmb3VyIG1vdG9ycy4KKyAqIEBwYXJhbSBtb3ZlU3RpY2sgVGhlIEpveXN0aWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGZvcndhcmQvYmFja3dhcmQgZGlyZWN0aW9uCisgKiBAcGFyYW0gbW92ZUF4aXMgVGhlIGF4aXMgb24gdGhlIG1vdmVTdGljayBvYmplY3QgdG8gdXNlIGZvciBmb3dhcmRzL2JhY2t3YXJkcyAodHlwaWNhbGx5IFlfQVhJUykKKyAqIEBwYXJhbSByb3RhdGVTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcm90YXRpb24gdmFsdWUKKyAqIEBwYXJhbSByb3RhdGVBeGlzIFRoZSBheGlzIG9uIHRoZSByb3RhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgcm90YXRlIHJpZ2h0L2xlZnQgKHR5cGljYWxseSBYX0FYSVMpCisgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgaW5jcmVhc2VzIHRoZSBzZW5zaXRpdml0eSBhdCBsb3dlciBzcGVlZHMKKyAqLworCit2b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQgJm1vdmVTdGljaywgdWludDMyX3QgbW92ZUF4aXMsCisJCQkJCQkJCUdlbmVyaWNISUQgJnJvdGF0ZVN0aWNrLCB1aW50MzJfdCByb3RhdGVBeGlzLAorCQkJCQkJCQlib29sIHNxdWFyZWRJbnB1dHMpCit7CisJZmxvYXQgbW92ZVZhbHVlID0gbW92ZVN0aWNrLkdldFJhd0F4aXMobW92ZUF4aXMpOworCWZsb2F0IHJvdGF0ZVZhbHVlID0gcm90YXRlU3RpY2suR2V0UmF3QXhpcyhyb3RhdGVBeGlzKTsKKworCUFyY2FkZURyaXZlKG1vdmVWYWx1ZSwgcm90YXRlVmFsdWUsIHNxdWFyZWRJbnB1dHMpOworfQorCisvKioKKyAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLgorICogVGhpcyBmdW5jdGlvbiBsZXRzIHlvdSBkaXJlY3RseSBwcm92aWRlIGpveXN0aWNrIHZhbHVlcyBmcm9tIGFueSBzb3VyY2UuCisgKiBAcGFyYW0gbW92ZVZhbHVlIFRoZSB2YWx1ZSB0byB1c2UgZm9yIGZvd2FyZHMvYmFja3dhcmRzCisgKiBAcGFyYW0gcm90YXRlVmFsdWUgVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIHJvdGF0ZSByaWdodC9sZWZ0CisgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiBzZXQsIGluY3JlYXNlcyB0aGUgc2Vuc2l0aXZpdHkgYXQgbG93IHNwZWVkcworICovCit2b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKGZsb2F0IG1vdmVWYWx1ZSwgZmxvYXQgcm90YXRlVmFsdWUsIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwlzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOworCWlmICghcmVwb3J0ZWQpCisJeworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9BcmNhZGVTdGFuZGFyZCk7CisJCXJlcG9ydGVkID0gdHJ1ZTsKKwl9CisKKwkvLyBsb2NhbCB2YXJpYWJsZXMgdG8gaG9sZCB0aGUgY29tcHV0ZWQgUFdNIHZhbHVlcyBmb3IgdGhlIG1vdG9ycworCWZsb2F0IGxlZnRNb3Rvck91dHB1dDsKKwlmbG9hdCByaWdodE1vdG9yT3V0cHV0OworCisJbW92ZVZhbHVlID0gTGltaXQobW92ZVZhbHVlKTsKKwlyb3RhdGVWYWx1ZSA9IExpbWl0KHJvdGF0ZVZhbHVlKTsKKworCWlmIChzcXVhcmVkSW5wdXRzKQorCXsKKwkJLy8gc3F1YXJlIHRoZSBpbnB1dHMgKHdoaWxlIHByZXNlcnZpbmcgdGhlIHNpZ24pIHRvIGluY3JlYXNlIGZpbmUgY29udHJvbCB3aGlsZSBwZXJtaXR0aW5nIGZ1bGwgcG93ZXIKKwkJaWYgKG1vdmVWYWx1ZSA+PSAwLjApCisJCXsKKwkJCW1vdmVWYWx1ZSA9IChtb3ZlVmFsdWUgKiBtb3ZlVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJbW92ZVZhbHVlID0gLShtb3ZlVmFsdWUgKiBtb3ZlVmFsdWUpOworCQl9CisJCWlmIChyb3RhdGVWYWx1ZSA+PSAwLjApCisJCXsKKwkJCXJvdGF0ZVZhbHVlID0gKHJvdGF0ZVZhbHVlICogcm90YXRlVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJcm90YXRlVmFsdWUgPSAtKHJvdGF0ZVZhbHVlICogcm90YXRlVmFsdWUpOworCQl9CisJfQorCisJaWYgKG1vdmVWYWx1ZSA+IDAuMCkKKwl7CisJCWlmIChyb3RhdGVWYWx1ZSA+IDAuMCkKKwkJeworCQkJbGVmdE1vdG9yT3V0cHV0ID0gbW92ZVZhbHVlIC0gcm90YXRlVmFsdWU7CisJCQlyaWdodE1vdG9yT3V0cHV0ID0gc3RkOjptYXgobW92ZVZhbHVlLCByb3RhdGVWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsZWZ0TW90b3JPdXRwdXQgPSBzdGQ6Om1heChtb3ZlVmFsdWUsIC1yb3RhdGVWYWx1ZSk7CisJCQlyaWdodE1vdG9yT3V0cHV0ID0gbW92ZVZhbHVlICsgcm90YXRlVmFsdWU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHJvdGF0ZVZhbHVlID4gMC4wKQorCQl7CisJCQlsZWZ0TW90b3JPdXRwdXQgPSAtIHN0ZDo6bWF4KC1tb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlKTsKKwkJCXJpZ2h0TW90b3JPdXRwdXQgPSBtb3ZlVmFsdWUgKyByb3RhdGVWYWx1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxlZnRNb3Rvck91dHB1dCA9IG1vdmVWYWx1ZSAtIHJvdGF0ZVZhbHVlOworCQkJcmlnaHRNb3Rvck91dHB1dCA9IC0gc3RkOjptYXgoLW1vdmVWYWx1ZSwgLXJvdGF0ZVZhbHVlKTsKKwkJfQorCX0KKwlTZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMobGVmdE1vdG9yT3V0cHV0LCByaWdodE1vdG9yT3V0cHV0KTsKK30KKworLyoqCisgKiBEcml2ZSBtZXRob2QgZm9yIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuCisgKgorICogQSBtZXRob2QgZm9yIGRyaXZpbmcgd2l0aCBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLiBUaGVyZSBhcmUgNCB3aGVlbHMKKyAqIG9uIHRoZSByb2JvdCwgYXJyYW5nZWQgc28gdGhhdCB0aGUgZnJvbnQgYW5kIGJhY2sgd2hlZWxzIGFyZSB0b2VkIGluIDQ1IGRlZ3JlZXMuCisgKiBXaGVuIGxvb2tpbmcgYXQgdGhlIHdoZWVscyBmcm9tIHRoZSB0b3AsIHRoZSByb2xsZXIgYXhsZXMgc2hvdWxkIGZvcm0gYW4gWCBhY3Jvc3MgdGhlIHJvYm90LgorICoKKyAqIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgZGlyZWN0bHkgZHJpdmVuIGJ5IGpveXN0aWNrIGF4ZXMuCisgKgorICogQHBhcmFtIHggVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiB0aGUgWCBkaXJlY3Rpb24uIFstMS4wLi4xLjBdCisgKiBAcGFyYW0geSBUaGUgc3BlZWQgdGhhdCB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlIGluIHRoZSBZIGRpcmVjdGlvbi4KKyAqIFRoaXMgaW5wdXQgaXMgaW52ZXJ0ZWQgdG8gbWF0Y2ggdGhlIGZvcndhcmQgPT0gLTEuMCB0aGF0IGpveXN0aWNrcyBwcm9kdWNlLiBbLTEuMC4uMS4wXQorICogQHBhcmFtIHJvdGF0aW9uIFRoZSByYXRlIG9mIHJvdGF0aW9uIGZvciB0aGUgcm9ib3QgdGhhdCBpcyBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mCisgKiB0aGUgdHJhbnNsYXRpb24uIFstMS4wLi4xLjBdCisgKiBAcGFyYW0gZ3lyb0FuZ2xlIFRoZSBjdXJyZW50IGFuZ2xlIHJlYWRpbmcgZnJvbSB0aGUgZ3lyby4gIFVzZSB0aGlzIHRvIGltcGxlbWVudCBmaWVsZC1vcmllbnRlZCBjb250cm9scy4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpNZWNhbnVtRHJpdmVfQ2FydGVzaWFuKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJvdGF0aW9uLCBmbG9hdCBneXJvQW5nbGUpCit7CisJc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKKwlpZiAoIXJlcG9ydGVkKQorCXsKKwkJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIEdldE51bU1vdG9ycygpLCBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfTWVjYW51bUNhcnRlc2lhbik7CisJCXJlcG9ydGVkID0gdHJ1ZTsKKwl9CisKKwlkb3VibGUgeEluID0geDsKKwlkb3VibGUgeUluID0geTsKKwkvLyBOZWdhdGUgeSBmb3IgdGhlIGpveXN0aWNrLgorCXlJbiA9IC15SW47CisJLy8gQ29tcGVuc3RhdGUgZm9yIGd5cm8gYW5nbGUuCisJUm90YXRlVmVjdG9yKHhJbiwgeUluLCBneXJvQW5nbGUpOworCisJZG91YmxlIHdoZWVsU3BlZWRzW2tNYXhOdW1iZXJPZk1vdG9yc107CisJd2hlZWxTcGVlZHNba0Zyb250TGVmdE1vdG9yXSA9IHhJbiArIHlJbiArIHJvdGF0aW9uOworCXdoZWVsU3BlZWRzW2tGcm9udFJpZ2h0TW90b3JdID0gLXhJbiArIHlJbiAtIHJvdGF0aW9uOworCXdoZWVsU3BlZWRzW2tSZWFyTGVmdE1vdG9yXSA9IC14SW4gKyB5SW4gKyByb3RhdGlvbjsKKwl3aGVlbFNwZWVkc1trUmVhclJpZ2h0TW90b3JdID0geEluICsgeUluIC0gcm90YXRpb247CisKKwlOb3JtYWxpemUod2hlZWxTcGVlZHMpOworCisJbV9mcm9udExlZnRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tGcm9udExlZnRNb3Rvcl0gKiBtX21heE91dHB1dCwgbV9zeW5jR3JvdXApOworCW1fZnJvbnRSaWdodE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba0Zyb250UmlnaHRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tGcm9udFJpZ2h0TW90b3JdICogbV9tYXhPdXRwdXQsIG1fc3luY0dyb3VwKTsKKwltX3JlYXJMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tSZWFyTGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBtX3N5bmNHcm91cCk7CisJbV9yZWFyUmlnaHRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tSZWFyUmlnaHRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tSZWFyUmlnaHRNb3Rvcl0gKiBtX21heE91dHB1dCwgbV9zeW5jR3JvdXApOworCisJaWYgKG1fc3luY0dyb3VwICE9IDApCisJeworCQlDQU5KYWd1YXI6OlVwZGF0ZVN5bmNHcm91cChtX3N5bmNHcm91cCk7CisJfQorCisJbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KKworLyoqCisgKiBEcml2ZSBtZXRob2QgZm9yIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuCisgKgorICogQSBtZXRob2QgZm9yIGRyaXZpbmcgd2l0aCBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLiBUaGVyZSBhcmUgNCB3aGVlbHMKKyAqIG9uIHRoZSByb2JvdCwgYXJyYW5nZWQgc28gdGhhdCB0aGUgZnJvbnQgYW5kIGJhY2sgd2hlZWxzIGFyZSB0b2VkIGluIDQ1IGRlZ3JlZXMuCisgKiBXaGVuIGxvb2tpbmcgYXQgdGhlIHdoZWVscyBmcm9tIHRoZSB0b3AsIHRoZSByb2xsZXIgYXhsZXMgc2hvdWxkIGZvcm0gYW4gWCBhY3Jvc3MgdGhlIHJvYm90LgorICoKKyAqIEBwYXJhbSBtYWduaXR1ZGUgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gWy0xLjAuLjEuMF0KKyAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlIGluIGRlZ3JlZXMuIFRoZSBkaXJlY3Rpb24gYW5kIG1hZ2luaXR1dGUgYXJlCisgKiBpbmRlcGVuZGVudCBvZiB0aGUgcm90YXRpb24gcmF0ZS4KKyAqIEBwYXJhbSByb3RhdGlvbiBUaGUgcmF0ZSBvZiByb3RhdGlvbiBmb3IgdGhlIHJvYm90IHRoYXQgaXMgY29tcGxldGVseSBpbmRlcGVuZGVudCBvZgorICogdGhlIG1hZ25pdHV0ZSBvciBkaXJlY3Rpb24uIFstMS4wLi4xLjBdCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6TWVjYW51bURyaXZlX1BvbGFyKGZsb2F0IG1hZ25pdHVkZSwgZmxvYXQgZGlyZWN0aW9uLCBmbG9hdCByb3RhdGlvbikKK3sKKwlzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOworCWlmICghcmVwb3J0ZWQpCisJeworCQlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9NZWNhbnVtUG9sYXIpOworCQlyZXBvcnRlZCA9IHRydWU7CisJfQorCisJLy8gTm9ybWFsaXplZCBmb3IgZnVsbCBwb3dlciBhbG9uZyB0aGUgQ2FydGVzaWFuIGF4ZXMuCisJbWFnbml0dWRlID0gTGltaXQobWFnbml0dWRlKSAqIHNxcnQoMi4wKTsKKwkvLyBUaGUgcm9sbGVycyBhcmUgYXQgNDUgZGVncmVlIGFuZ2xlcy4KKwlkb3VibGUgZGlySW5SYWQgPSAoZGlyZWN0aW9uICsgNDUuMCkgKiAzLjE0MTU5IC8gMTgwLjA7CisJZG91YmxlIGNvc0QgPSBjb3MoZGlySW5SYWQpOworCWRvdWJsZSBzaW5EID0gc2luKGRpckluUmFkKTsKKworCWRvdWJsZSB3aGVlbFNwZWVkc1trTWF4TnVtYmVyT2ZNb3RvcnNdOworCXdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gPSBzaW5EICogbWFnbml0dWRlICsgcm90YXRpb247CisJd2hlZWxTcGVlZHNba0Zyb250UmlnaHRNb3Rvcl0gPSBjb3NEICogbWFnbml0dWRlIC0gcm90YXRpb247CisJd2hlZWxTcGVlZHNba1JlYXJMZWZ0TW90b3JdID0gY29zRCAqIG1hZ25pdHVkZSArIHJvdGF0aW9uOworCXdoZWVsU3BlZWRzW2tSZWFyUmlnaHRNb3Rvcl0gPSBzaW5EICogbWFnbml0dWRlIC0gcm90YXRpb247CisKKwlOb3JtYWxpemUod2hlZWxTcGVlZHMpOworCisJbV9mcm9udExlZnRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tGcm9udExlZnRNb3Rvcl0gKiBtX21heE91dHB1dCwgbV9zeW5jR3JvdXApOworCW1fZnJvbnRSaWdodE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba0Zyb250UmlnaHRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tGcm9udFJpZ2h0TW90b3JdICogbV9tYXhPdXRwdXQsIG1fc3luY0dyb3VwKTsKKwltX3JlYXJMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tSZWFyTGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBtX3N5bmNHcm91cCk7CisJbV9yZWFyUmlnaHRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tSZWFyUmlnaHRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tSZWFyUmlnaHRNb3Rvcl0gKiBtX21heE91dHB1dCwgbV9zeW5jR3JvdXApOworCisJaWYgKG1fc3luY0dyb3VwICE9IDApCisJeworCQlDQU5KYWd1YXI6OlVwZGF0ZVN5bmNHcm91cChtX3N5bmNHcm91cCk7CisJfQorCisJbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KKworLyoqCisgKiBIb2xvbm9taWMgRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLgorICoKKyAqIFRoaXMgaXMgYW4gYWxpYXMgdG8gTWVjYW51bURyaXZlX1BvbGFyKCkgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkKKyAqCisgKiBAcGFyYW0gbWFnbml0dWRlIFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gYSBnaXZlbiBkaXJlY3Rpb24uICBbLTEuMC4uMS4wXQorICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRoZSByb2JvdCBzaG91bGQgZHJpdmUuIFRoZSBkaXJlY3Rpb24gYW5kIG1hZ2luaXR1dGUgYXJlCisgKiBpbmRlcGVuZGVudCBvZiB0aGUgcm90YXRpb24gcmF0ZS4KKyAqIEBwYXJhbSByb3RhdGlvbiBUaGUgcmF0ZSBvZiByb3RhdGlvbiBmb3IgdGhlIHJvYm90IHRoYXQgaXMgY29tcGxldGVseSBpbmRlcGVuZGVudCBvZgorICogdGhlIG1hZ25pdHV0ZSBvciBkaXJlY3Rpb24uICBbLTEuMC4uMS4wXQorICovCit2b2lkIFJvYm90RHJpdmU6OkhvbG9ub21pY0RyaXZlKGZsb2F0IG1hZ25pdHVkZSwgZmxvYXQgZGlyZWN0aW9uLCBmbG9hdCByb3RhdGlvbikKK3sKKwlNZWNhbnVtRHJpdmVfUG9sYXIobWFnbml0dWRlLCBkaXJlY3Rpb24sIHJvdGF0aW9uKTsKK30KKworLyoqIFNldCB0aGUgc3BlZWQgb2YgdGhlIHJpZ2h0IGFuZCBsZWZ0IG1vdG9ycy4KKyAqIFRoaXMgaXMgdXNlZCBvbmNlIGFuIGFwcHJvcHJpYXRlIGRyaXZlIHNldHVwIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNoIGFzCisgKiBUd29XaGVlbERyaXZlKCkuIFRoZSBtb3RvcnMgYXJlIHNldCB0byAibGVmdE91dHB1dCIgYW5kICJyaWdodE91dHB1dCIKKyAqIGFuZCBpbmNsdWRlcyBmbGlwcGluZyB0aGUgZGlyZWN0aW9uIG9mIG9uZSBzaWRlIGZvciBvcHBvc2luZyBtb3RvcnMuCisgKiBAcGFyYW0gbGVmdE91dHB1dCBUaGUgc3BlZWQgdG8gc2VuZCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KKyAqIEBwYXJhbSByaWdodE91dHB1dCBUaGUgc3BlZWQgdG8gc2VuZCB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6U2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGZsb2F0IGxlZnRPdXRwdXQsIGZsb2F0IHJpZ2h0T3V0cHV0KQoreworCXdwaV9hc3NlcnQobV9yZWFyTGVmdE1vdG9yICE9IE5VTEwgJiYgbV9yZWFyUmlnaHRNb3RvciAhPSBOVUxMKTsKKworCWlmIChtX2Zyb250TGVmdE1vdG9yICE9IE5VTEwpCisJCW1fZnJvbnRMZWZ0TW90b3ItPlNldChMaW1pdChsZWZ0T3V0cHV0KSAqIG1faW52ZXJ0ZWRNb3RvcnNba0Zyb250TGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBtX3N5bmNHcm91cCk7CisJbV9yZWFyTGVmdE1vdG9yLT5TZXQoTGltaXQobGVmdE91dHB1dCkgKiBtX2ludmVydGVkTW90b3JzW2tSZWFyTGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBtX3N5bmNHcm91cCk7CisKKwlpZiAobV9mcm9udFJpZ2h0TW90b3IgIT0gTlVMTCkKKwkJbV9mcm9udFJpZ2h0TW90b3ItPlNldCgtTGltaXQocmlnaHRPdXRwdXQpICogbV9pbnZlcnRlZE1vdG9yc1trRnJvbnRSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBtX3N5bmNHcm91cCk7CisJbV9yZWFyUmlnaHRNb3Rvci0+U2V0KC1MaW1pdChyaWdodE91dHB1dCkgKiBtX2ludmVydGVkTW90b3JzW2tSZWFyUmlnaHRNb3Rvcl0gKiBtX21heE91dHB1dCwgbV9zeW5jR3JvdXApOworCisJaWYgKG1fc3luY0dyb3VwICE9IDApCisJeworCQlDQU5KYWd1YXI6OlVwZGF0ZVN5bmNHcm91cChtX3N5bmNHcm91cCk7CisJfQorCisJbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KKworLyoqCisgKiBMaW1pdCBtb3RvciB2YWx1ZXMgdG8gdGhlIC0xLjAgdG8gKzEuMCByYW5nZS4KKyAqLworZmxvYXQgUm9ib3REcml2ZTo6TGltaXQoZmxvYXQgbnVtKQoreworCWlmIChudW0gPiAxLjApCisJeworCQlyZXR1cm4gMS4wOworCX0KKwlpZiAobnVtIDwgLTEuMCkKKwl7CisJCXJldHVybiAtMS4wOworCX0KKwlyZXR1cm4gbnVtOworfQorCisvKioKKyAqIE5vcm1hbGl6ZSBhbGwgd2hlZWwgc3BlZWRzIGlmIHRoZSBtYWduaXR1ZGUgb2YgYW55IHdoZWVsIGlzIGdyZWF0ZXIgdGhhbiAxLjAuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6Tm9ybWFsaXplKGRvdWJsZSAqd2hlZWxTcGVlZHMpCit7CisJZG91YmxlIG1heE1hZ25pdHVkZSA9IGZhYnMod2hlZWxTcGVlZHNbMF0pOworCWludDMyX3QgaTsKKwlmb3IgKGk9MTsgaTxrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykKKwl7CisJCWRvdWJsZSB0ZW1wID0gZmFicyh3aGVlbFNwZWVkc1tpXSk7CisJCWlmIChtYXhNYWduaXR1ZGUgPCB0ZW1wKSBtYXhNYWduaXR1ZGUgPSB0ZW1wOworCX0KKwlpZiAobWF4TWFnbml0dWRlID4gMS4wKQorCXsKKwkJZm9yIChpPTA7IGk8a01heE51bWJlck9mTW90b3JzOyBpKyspCisJCXsKKwkJCXdoZWVsU3BlZWRzW2ldID0gd2hlZWxTcGVlZHNbaV0gLyBtYXhNYWduaXR1ZGU7CisJCX0KKwl9Cit9CisKKy8qKgorICogUm90YXRlIGEgdmVjdG9yIGluIENhcnRlc2lhbiBzcGFjZS4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpSb3RhdGVWZWN0b3IoZG91YmxlICZ4LCBkb3VibGUgJnksIGRvdWJsZSBhbmdsZSkKK3sKKwlkb3VibGUgY29zQSA9IGNvcyhhbmdsZSAqICgzLjE0MTU5IC8gMTgwLjApKTsKKwlkb3VibGUgc2luQSA9IHNpbihhbmdsZSAqICgzLjE0MTU5IC8gMTgwLjApKTsKKwlkb3VibGUgeE91dCA9IHggKiBjb3NBIC0geSAqIHNpbkE7CisJZG91YmxlIHlPdXQgPSB4ICogc2luQSArIHkgKiBjb3NBOworCXggPSB4T3V0OworCXkgPSB5T3V0OworfQorCisvKgorICogSW52ZXJ0IGEgbW90b3IgZGlyZWN0aW9uLgorICogVGhpcyBpcyB1c2VkIHdoZW4gYSBtb3RvciBzaG91bGQgcnVuIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gYXMgdGhlIGRyaXZlCisgKiBjb2RlIHdvdWxkIG5vcm1hbGx5IHJ1biBpdC4gTW90b3JzIHRoYXQgYXJlIGRpcmVjdCBkcml2ZSB3b3VsZCBiZSBpbnZlcnRlZCwgdGhlCisgKiBEcml2ZSBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgbW90b3JzIGFyZSBnZWFyZWQgd2l0aCBvbmUgcmV2ZXJzYWwuCisgKiBAcGFyYW0gbW90b3IgVGhlIG1vdG9yIGluZGV4IHRvIGludmVydC4KKyAqIEBwYXJhbSBpc0ludmVydGVkIFRydWUgaWYgdGhlIG1vdG9yIHNob3VsZCBiZSBpbnZlcnRlZCB3aGVuIG9wZXJhdGVkLgorICovCit2b2lkIFJvYm90RHJpdmU6OlNldEludmVydGVkTW90b3IoTW90b3JUeXBlIG1vdG9yLCBib29sIGlzSW52ZXJ0ZWQpCit7CisJaWYgKG1vdG9yIDwgMCB8fCBtb3RvciA+IDMpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoSW52YWxpZE1vdG9ySW5kZXgpOworCQlyZXR1cm47CisJfQorCW1faW52ZXJ0ZWRNb3RvcnNbbW90b3JdID0gaXNJbnZlcnRlZCA/IC0xIDogMTsKK30KKworLyoqCisgKiBTZXQgdGhlIHR1cm5pbmcgc2Vuc2l0aXZpdHkuCisgKgorICogVGhpcyBvbmx5IGltcGFjdHMgdGhlIERyaXZlKCkgZW50cnktcG9pbnQuCisgKiBAcGFyYW0gc2Vuc2l0aXZpdHkgRWZmZWN0aXZlbHkgc2V0cyB0aGUgdHVybmluZyBzZW5zaXRpdml0eSAob3IgdHVybiByYWRpdXMgZm9yIGEgZ2l2ZW4gdmFsdWUpCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6U2V0U2Vuc2l0aXZpdHkoZmxvYXQgc2Vuc2l0aXZpdHkpCit7CisJbV9zZW5zaXRpdml0eSA9IHNlbnNpdGl2aXR5OworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIHVzaW5nIFJvYm90RHJpdmUgd2l0aCBtb3RvciBjb250cm9sbGVycyBpbiBhIG1vZGUgb3RoZXIgdGhhbiBQZXJjZW50VmJ1cy4KKyAqIEBwYXJhbSBtYXhPdXRwdXQgTXVsdGlwbGllZCB3aXRoIHRoZSBvdXRwdXQgcGVyY2VudGFnZSBjb21wdXRlZCBieSB0aGUgZHJpdmUgZnVuY3Rpb25zLgorICovCit2b2lkIFJvYm90RHJpdmU6OlNldE1heE91dHB1dChkb3VibGUgbWF4T3V0cHV0KQoreworCW1fbWF4T3V0cHV0ID0gbWF4T3V0cHV0OworfQorCisvKioKKyAqIFNldCB0aGUgbnVtYmVyIG9mIHRoZSBzeW5jIGdyb3VwIGZvciB0aGUgbW90b3IgY29udHJvbGxlcnMuICBJZiB0aGUgbW90b3IgY29udHJvbGxlcnMgYXJlIHtAbGluayBDQU5KYWd1YXJ9cywKKyAqIHRoZW4gdGhleSB3aWxsIGFsbCBiZSBhZGRlZCB0byB0aGlzIHN5bmMgZ3JvdXAsIGNhdXNpbmcgdGhlbSB0byB1cGRhdGUgdGhlaXIgdmFsdWVzIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogQHBhcmFtIHN5bmNHcm91cCB0aGUgdXBkYXRlIGdyb3VwIHRvIGFkZCB0aGUgbW90b3IgY29udHJvbGxlcnMgdG8KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRDQU5KYWd1YXJTeW5jR3JvdXAodWludDhfdCBzeW5jR3JvdXApIHsKKwltX3N5bmNHcm91cCA9IHN5bmNHcm91cDsKK30KKwordm9pZCBSb2JvdERyaXZlOjpTZXRFeHBpcmF0aW9uKGZsb2F0IHRpbWVvdXQpCit7CisJbV9zYWZldHlIZWxwZXItPlNldEV4cGlyYXRpb24odGltZW91dCk7Cit9CisKK2Zsb2F0IFJvYm90RHJpdmU6OkdldEV4cGlyYXRpb24oKQoreworCXJldHVybiBtX3NhZmV0eUhlbHBlci0+R2V0RXhwaXJhdGlvbigpOworfQorCitib29sIFJvYm90RHJpdmU6OklzQWxpdmUoKQoreworCXJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNBbGl2ZSgpOworfQorCitib29sIFJvYm90RHJpdmU6OklzU2FmZXR5RW5hYmxlZCgpCit7CisJcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc1NhZmV0eUVuYWJsZWQoKTsKK30KKwordm9pZCBSb2JvdERyaXZlOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKwltX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBSb2JvdERyaXZlOjpHZXREZXNjcmlwdGlvbihjaGFyICpkZXNjKQoreworCXNwcmludGYoZGVzYywgIlJvYm90RHJpdmUiKTsKK30KKwordm9pZCBSb2JvdERyaXZlOjpTdG9wTW90b3IoKQoreworCWlmIChtX2Zyb250TGVmdE1vdG9yICE9IE5VTEwpIG1fZnJvbnRMZWZ0TW90b3ItPkRpc2FibGUoKTsKKwlpZiAobV9mcm9udFJpZ2h0TW90b3IgIT0gTlVMTCkgbV9mcm9udFJpZ2h0TW90b3ItPkRpc2FibGUoKTsKKwlpZiAobV9yZWFyTGVmdE1vdG9yICE9IE5VTEwpIG1fcmVhckxlZnRNb3Rvci0+RGlzYWJsZSgpOworCWlmIChtX3JlYXJSaWdodE1vdG9yICE9IE5VTEwpIG1fcmVhclJpZ2h0TW90b3ItPkRpc2FibGUoKTsKKwltX3NhZmV0eUhlbHBlci0+RmVlZCgpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TUEkuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9TUEkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzhkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NQSS5jcHAKQEAgLTAsMCArMSwxODUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlNQSS5oIgorCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiSEFML0RpZ2l0YWwuaHBwIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworLyoqCisgKiBDb25zdHJ1Y3RvcgorICoKKyAqIEBwYXJhbSBTUElwb3J0IHRoZSBwaHlzaWNhbCBTUEkgcG9ydAorICovCitTUEk6OlNQSShQb3J0IFNQSXBvcnQpCit7CisJbV9wb3J0ID0gU1BJcG9ydDsKKyAgCWludDMyX3Qgc3RhdHVzID0gMDsKKyAgCXNwaUluaXRpYWxpemUobV9wb3J0LCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworCXN0YXRpYyBpbnQzMl90IGluc3RhbmNlcyA9IDA7CisJaW5zdGFuY2VzKys7CisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1NQSSwgaW5zdGFuY2VzKTsKK30KKworLyoqCisgKiBEZXN0cnVjdG9yLgorICovCitTUEk6On5TUEkoKQoreworCXNwaUNsb3NlKG1fcG9ydCk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSByYXRlIG9mIHRoZSBnZW5lcmF0ZWQgY2xvY2sgc2lnbmFsLgorICogCisgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1MDAsMDAwSHouCisgKiBUaGUgbWF4aW11bSB2YWx1ZSBpcyA0LDAwMCwwMDBIei4KKyAqCisgKiBAcGFyYW0gaHoJVGhlIGNsb2NrIHJhdGUgaW4gSGVydHouCisgKi8KK3ZvaWQgU1BJOjpTZXRDbG9ja1JhdGUoZG91YmxlIGh6KQoreworCXNwaVNldFNwZWVkKG1fcG9ydCwgaHopOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgb3JkZXIgdGhhdCBiaXRzIGFyZSBzZW50IGFuZCByZWNlaXZlZCBvbiB0aGUgd2lyZQorICogdG8gYmUgbW9zdCBzaWduaWZpY2FudCBiaXQgZmlyc3QuCisgKi8KK3ZvaWQgU1BJOjpTZXRNU0JGaXJzdCgpCit7CisJbV9tc2JGaXJzdCA9IHRydWU7CisJc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpIG1fbXNiRmlyc3QsIChpbnQpIG1fc2FtcGxlT25UcmFpbGluZywgKGludCkgbV9jbGtfaWRsZV9oaWdoKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIG9yZGVyIHRoYXQgYml0cyBhcmUgc2VudCBhbmQgcmVjZWl2ZWQgb24gdGhlIHdpcmUKKyAqIHRvIGJlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdC4KKyAqLwordm9pZCBTUEk6OlNldExTQkZpcnN0KCkKK3sKKwltX21zYkZpcnN0ID0gZmFsc2U7CisJc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpIG1fbXNiRmlyc3QsIChpbnQpIG1fc2FtcGxlT25UcmFpbGluZywgKGludCkgbV9jbGtfaWRsZV9oaWdoKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhhdCB0aGUgZGF0YSBpcyBzdGFibGUgb24gdGhlIGZhbGxpbmcgZWRnZSBhbmQgdGhlIGRhdGEKKyAqIGNoYW5nZXMgb24gdGhlIHJpc2luZyBlZGdlLgorICovCit2b2lkIFNQSTo6U2V0U2FtcGxlRGF0YU9uRmFsbGluZygpCit7CisJbV9zYW1wbGVPblRyYWlsaW5nID0gdHJ1ZTsKKwlzcGlTZXRPcHRzKG1fcG9ydCwgKGludCkgbV9tc2JGaXJzdCwgKGludCkgbV9zYW1wbGVPblRyYWlsaW5nLCAoaW50KSBtX2Nsa19pZGxlX2hpZ2gpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGF0IHRoZSBkYXRhIGlzIHN0YWJsZSBvbiB0aGUgcmlzaW5nIGVkZ2UgYW5kIHRoZSBkYXRhCisgKiBjaGFuZ2VzIG9uIHRoZSBmYWxsaW5nIGVkZ2UuCisgKi8KK3ZvaWQgU1BJOjpTZXRTYW1wbGVEYXRhT25SaXNpbmcoKQoreworCW1fc2FtcGxlT25UcmFpbGluZyA9IGZhbHNlOworCXNwaVNldE9wdHMobV9wb3J0LCAoaW50KSBtX21zYkZpcnN0LCAoaW50KSBtX3NhbXBsZU9uVHJhaWxpbmcsIChpbnQpIG1fY2xrX2lkbGVfaGlnaCk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBjbG9jayBvdXRwdXQgbGluZSB0byBiZSBhY3RpdmUgbG93LgorICogVGhpcyBpcyBzb21ldGltZXMgY2FsbGVkIGNsb2NrIHBvbGFyaXR5IGhpZ2ggb3IgY2xvY2sgaWRsZSBoaWdoLgorICovCit2b2lkIFNQSTo6U2V0Q2xvY2tBY3RpdmVMb3coKQoreworCW1fY2xrX2lkbGVfaGlnaCA9IHRydWU7CisJc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpIG1fbXNiRmlyc3QsIChpbnQpIG1fc2FtcGxlT25UcmFpbGluZywgKGludCkgbV9jbGtfaWRsZV9oaWdoKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNsb2NrIG91dHB1dCBsaW5lIHRvIGJlIGFjdGl2ZSBoaWdoLgorICogVGhpcyBpcyBzb21ldGltZXMgY2FsbGVkIGNsb2NrIHBvbGFyaXR5IGxvdyBvciBjbG9jayBpZGxlIGxvdy4KKyAqLwordm9pZCBTUEk6OlNldENsb2NrQWN0aXZlSGlnaCgpCit7CisJbV9jbGtfaWRsZV9oaWdoID0gZmFsc2U7CisJc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpIG1fbXNiRmlyc3QsIChpbnQpIG1fc2FtcGxlT25UcmFpbGluZywgKGludCkgbV9jbGtfaWRsZV9oaWdoKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNoaXAgc2VsZWN0IGxpbmUgdG8gYmUgYWN0aXZlIGhpZ2guCisgKi8KK3ZvaWQgU1BJOjpTZXRDaGlwU2VsZWN0QWN0aXZlSGlnaCgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXNwaVNldENoaXBTZWxlY3RBY3RpdmVIaWdoKG1fcG9ydCwgJnN0YXR1cyk7CisJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBjaGlwIHNlbGVjdCBsaW5lIHRvIGJlIGFjdGl2ZSBsb3cuCisgKi8KK3ZvaWQgU1BJOjpTZXRDaGlwU2VsZWN0QWN0aXZlTG93KCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJc3BpU2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdyhtX3BvcnQsICZzdGF0dXMpOworCXdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisKKy8qKgorICogV3JpdGUgZGF0YSB0byB0aGUgc2xhdmUgZGV2aWNlLiAgQmxvY2tzIHVudGlsIHRoZXJlIGlzIHNwYWNlIGluIHRoZQorICogb3V0cHV0IEZJRk8uCisgKgorICogSWYgbm90IHJ1bm5pbmcgaW4gb3V0cHV0IG9ubHkgbW9kZSwgYWxzbyBzYXZlcyB0aGUgZGF0YSByZWNlaXZlZAorICogb24gdGhlIE1JU08gaW5wdXQgZHVyaW5nIHRoZSB0cmFuc2ZlciBpbnRvIHRoZSByZWNlaXZlIEZJRk8uCisgKi8KK2ludDMyX3QgU1BJOjpXcml0ZSh1aW50OF90KiBkYXRhLCB1aW50OF90IHNpemUpCit7CisJaW50MzJfdCByZXRWYWwgPSAwOworCXJldFZhbCA9IHNwaVdyaXRlKG1fcG9ydCwgZGF0YSwgc2l6ZSk7CisJcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBSZWFkIGEgd29yZCBmcm9tIHRoZSByZWNlaXZlIEZJRk8uCisgKgorICogV2FpdHMgZm9yIHRoZSBjdXJyZW50IHRyYW5zZmVyIHRvIGNvbXBsZXRlIGlmIHRoZSByZWNlaXZlIEZJRk8gaXMgZW1wdHkuCisgKgorICogSWYgdGhlIHJlY2VpdmUgRklGTyBpcyBlbXB0eSwgdGhlcmUgaXMgbm8gYWN0aXZlIHRyYW5zZmVyLCBhbmQgaW5pdGlhdGUKKyAqIGlzIGZhbHNlLCBlcnJvcnMuCisgKgorICogQHBhcmFtIGluaXRpYXRlCUlmIHRydWUsIHRoaXMgZnVuY3Rpb24gcHVzaGVzICIwIiBpbnRvIHRoZQorICoJCQkJICAgIHRyYW5zbWl0IGJ1ZmZlciBhbmQgaW5pdGlhdGVzIGEgdHJhbnNmZXIuCisgKgkJCQkgICAgSWYgZmFsc2UsIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGRhdGEgaXMKKyAqCQkJCSAgICBhbHJlYWR5IGluIHRoZSByZWNlaXZlIEZJRk8gZnJvbSBhIHByZXZpb3VzIHdyaXRlLgorICovCitpbnQzMl90IFNQSTo6UmVhZChib29sIGluaXRpYXRlLCB1aW50OF90KiBkYXRhUmVjZWl2ZWQsIHVpbnQ4X3Qgc2l6ZSkKK3sKKwlpbnQzMl90IHJldFZhbCA9IDA7CisJaWYoaW5pdGlhdGUpeworCQl1aW50OF90KiBkYXRhVG9TZW5kID0gbmV3IHVpbnQ4X3Rbc2l6ZV07CisJCW1lbXNldChkYXRhVG9TZW5kLCAwLCBzaXplKTsKKwkJcmV0VmFsID0gc3BpVHJhbnNhY3Rpb24obV9wb3J0LCBkYXRhVG9TZW5kLCBkYXRhUmVjZWl2ZWQsIHNpemUpOworCX0KKwllbHNlCisJCXJldFZhbCA9IHNwaVJlYWQobV9wb3J0LCBkYXRhUmVjZWl2ZWQsIHNpemUpOworCXJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHNpbXVsdGFuZW91cyByZWFkL3dyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZQorICoKKyAqIEBwYXJhbSBkYXRhVG9TZW5kIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBkZXZpY2UKKyAqIEBwYXJhbSBkYXRhUmVjZWl2ZWQgQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBkZXZpY2UKKyAqIEBwYXJhbSBzaXplIFRoZSBsZW5ndGggb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBieXRlcworICovCitpbnQzMl90IFNQSTo6VHJhbnNhY3Rpb24odWludDhfdCogZGF0YVRvU2VuZCwgdWludDhfdCogZGF0YVJlY2VpdmVkLCB1aW50OF90IHNpemUpeworCWludDMyX3QgcmV0VmFsID0gMDsKKwlyZXRWYWwgPSBzcGlUcmFuc2FjdGlvbihtX3BvcnQsIGRhdGFUb1NlbmQsIGRhdGFSZWNlaXZlZCwgc2l6ZSk7CisJcmV0dXJuIHJldFZhbDsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvU2FmZVBXTS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NhZmVQV00uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OWQ1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NhZmVQV00uY3BwCkBAIC0wLDAgKzEsMTA2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisKKyNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgorCisvKioKKyAqIEluaXRpYWxpemUgYSBTYWZlUFdNIG9iamVjdCBieSBzZXR0aW5nIGRlZmF1bHRzCisgKi8KK3ZvaWQgU2FmZVBXTTo6SW5pdFNhZmVQV00oKQoreworCW1fc2FmZXR5SGVscGVyID0gbmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpOworCW1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBTYWZlUFdNIG9iamVjdCB0YWtpbmcgYSBjaGFubmVsIG51bWJlci4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIgMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitTYWZlUFdNOjpTYWZlUFdNKHVpbnQzMl90IGNoYW5uZWwpOiBQV00oY2hhbm5lbCkKK3sKKwlJbml0U2FmZVBXTSgpOworfQorCitTYWZlUFdNOjp+U2FmZVBXTSgpCit7CisJZGVsZXRlIG1fc2FmZXR5SGVscGVyOworfQorCisvKioKKyAqIFNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgUFdNIG9iamVjdAorICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIGZvciB0aGlzIG1vdG9yIG9iamVjdAorICovCit2b2lkIFNhZmVQV006OlNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCkKK3sKKwltX3NhZmV0eUhlbHBlci0+U2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIFBXTSBvYmplY3QuCisgKiBAcmV0dXJucyBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgorICovCitmbG9hdCBTYWZlUFdNOjpHZXRFeHBpcmF0aW9uKCkKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPkdldEV4cGlyYXRpb24oKTsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgUFdNIG9iamVjdCBpcyBjdXJyZW50bHkgYWxpdmUgb3Igc3RvcHBlZCBkdWUgdG8gYSB0aW1lb3V0LgorICogQHJldHVybnMgYSBib29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbW90b3IgaGFzIE5PVCB0aW1lZCBvdXQgYW5kIHNob3VsZCBzdGlsbAorICogYmUgcnVubmluZy4KKyAqLworYm9vbCBTYWZlUFdNOjpJc0FsaXZlKCkKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsKK30KKworLyoqCisgKiBTdG9wIHRoZSBtb3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBQV00gb2JqZWN0LgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIE1vdG9yU2FmZXR5SGVscGVyIG9iamVjdCB3aGVuIGl0IGhhcyBhIHRpbWVvdXQgZm9yIHRoaXMgUFdNIGFuZCBuZWVkcyB0bworICogc3RvcCBpdCBmcm9tIHJ1bm5pbmcuCisgKi8KK3ZvaWQgU2FmZVBXTTo6U3RvcE1vdG9yKCkKK3sKKwlTZXRSYXcoa1B3bURpc2FibGVkKTsKK30KKworLyoqCisgKiBFbmFibGUvZGlzYWJsZSBtb3RvciBzYWZldHkgZm9yIHRoaXMgZGV2aWNlCisgKiBUdXJuIG9uIGFuZCBvZmYgdGhlIG1vdG9yIHNhZmV0eSBvcHRpb24gZm9yIHRoaXMgUFdNIG9iamVjdC4KKyAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIG9iamVjdAorICovCit2b2lkIFNhZmVQV006OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworCW1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOworfQorCisvKioKKyAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkIGZvciB0aGlzIG9iamVjdAorICogQHJldHVybnMgVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0CisgKi8KK2Jvb2wgU2FmZVBXTTo6SXNTYWZldHlFbmFibGVkKCkKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzU2FmZXR5RW5hYmxlZCgpOworfQorCit2b2lkIFNhZmVQV006OkdldERlc2NyaXB0aW9uKGNoYXIgKmRlc2MpCit7CisJc3ByaW50ZihkZXNjLCAiUFdNICVkIiwgR2V0Q2hhbm5lbCgpKTsKK30KKworLyoqCisgKiBGZWVkIHRoZSBNb3RvclNhZmV0eSB0aW1lciB3aGVuIHNldHRpbmcgdGhlIHNwZWVkLgorICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzdWJjbGFzcyBtb3RvciB3aGVuZXZlciBpdCB1cGRhdGVzIGl0cyBzcGVlZCwgdGhlcmVieSByZXNldGluZworICogdGhlIHRpbWVvdXQgdmFsdWUuCisgKiBAcGFyYW0gc3BlZWQgVmFsdWUgdG8gcGFzcyB0byB0aGUgUFdNIGNsYXNzCisgKi8KK3ZvaWQgU2FmZVBXTTo6U2V0U3BlZWQoZmxvYXQgc3BlZWQpCit7CisJUFdNOjpTZXRTcGVlZChzcGVlZCk7CisJbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvU2Vuc29yQmFzZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NlbnNvckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MDNiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NlbnNvckJhc2UuY3BwCkBAIC0wLDAgKzEsMjAyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtEaWdpdGFsQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprQW5hbG9nSW5wdXRzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a1NvbGVub2lkQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprU29sZW5vaWRNb2R1bGVzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a1B3bUNoYW5uZWxzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a1JlbGF5Q2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprUERQQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprQ2hhc3Npc1Nsb3RzOworU2Vuc29yQmFzZSAqU2Vuc29yQmFzZTo6bV9zaW5nbGV0b25MaXN0ID0gTlVMTDsKKworc3RhdGljIGJvb2wgcG9ydHNJbml0aWFsaXplZCA9IGZhbHNlOwordm9pZCogU2Vuc29yQmFzZTo6bV9kaWdpdGFsX3BvcnRzW2tEaWdpdGFsQ2hhbm5lbHNdOwordm9pZCogU2Vuc29yQmFzZTo6bV9yZWxheV9wb3J0c1trUmVsYXlDaGFubmVsc107Cit2b2lkKiBTZW5zb3JCYXNlOjptX3B3bV9wb3J0c1trUHdtQ2hhbm5lbHNdOworCisvKioKKyAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlbnNvciBiYXNlIGFuZCBnZXRzIGFuIEZQR0EgaGFuZGxlCisgKi8KK1NlbnNvckJhc2U6OlNlbnNvckJhc2UoKQoreworCWlmKCFwb3J0c0luaXRpYWxpemVkKSB7CisJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrRGlnaXRhbENoYW5uZWxzOyBpKyspCisJCXsKKwkJCXZvaWQqIHBvcnQgPSBnZXRQb3J0KGkpOworCQkJaW50MzJfdCBzdGF0dXMgPSAwOworCQkJbV9kaWdpdGFsX3BvcnRzW2ldID0gaW5pdGlhbGl6ZURpZ2l0YWxQb3J0KHBvcnQsICZzdGF0dXMpOworCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCX0KKworCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga1JlbGF5Q2hhbm5lbHM7IGkrKykKKwkJeworCQkJdm9pZCogcG9ydCA9IGdldFBvcnQoaSk7CisJCQlpbnQzMl90IHN0YXR1cyA9IDA7CisJCQltX3JlbGF5X3BvcnRzW2ldID0gaW5pdGlhbGl6ZURpZ2l0YWxQb3J0KHBvcnQsICZzdGF0dXMpOworCQkJd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJCX0KKworCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga1B3bUNoYW5uZWxzOyBpKyspCisJCXsKKwkJCXZvaWQqIHBvcnQgPSBnZXRQb3J0KGkpOworCQkJaW50MzJfdCBzdGF0dXMgPSAwOworCQkJbV9wd21fcG9ydHNbaV0gPSBpbml0aWFsaXplRGlnaXRhbFBvcnQocG9ydCwgJnN0YXR1cyk7CisJCQl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBGcmVlcyB0aGUgcmVzb3VyY2VzIGZvciBhIFNlbnNvckJhc2UuCisgKi8KK1NlbnNvckJhc2U6On5TZW5zb3JCYXNlKCkKK3sKK30KKworLyoqCisgKiBBZGQgc2Vuc29yIHRvIHRoZSBzaW5nbGV0b24gbGlzdC4KKyAqIEFkZCB0aGlzIHNlbnNvciB0byB0aGUgbGlzdCBvZiBzaW5nbGV0b25zIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkIHdoZW4KKyAqIHRoZSByb2JvdCBwcm9ncmFtIGV4aXRzLiBFYWNoIG9mIHRoZSBzZW5zb3JzIG9uIHRoaXMgbGlzdCBhcmUgc2luZ2xldG9ucywKKyAqIHRoYXQgaXMgdGhleSBhcmVuJ3QgYWxsb2NhdGVkIGRpcmVjdGx5IHdpdGggbmV3LCBidXQgaW5zdGVhZCBhcmUgYWxsb2NhdGVkCisgKiBieSB0aGUgc3RhdGljIEdldEluc3RhbmNlIG1ldGhvZC4gQXMgYSByZXN1bHQsIHRoZXkgYXJlIG5ldmVyIGRlbGV0ZWQgd2hlbgorICogdGhlIHByb2dyYW0gZXhpdHMuIENvbnNlcXVlbnRseSB0aGVzZSBzZW5zb3JzIG1heSBzdGlsbCBiZSBob2xkaW5nIG9udG8KKyAqIHJlc291cmNlcyBhbmQgbmVlZCB0byBoYXZlIHRoZWlyIGRlc3RydWN0b3JzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtLgorICovCit2b2lkIFNlbnNvckJhc2U6OkFkZFRvU2luZ2xldG9uTGlzdCgpCit7CisJbV9uZXh0U2luZ2xldG9uID0gbV9zaW5nbGV0b25MaXN0OworCW1fc2luZ2xldG9uTGlzdCA9IHRoaXM7Cit9CisKKy8qKgorICogRGVsZXRlIGFsbCB0aGUgc2luZ2xldG9uIGNsYXNzZXMgb24gdGhlIGxpc3QuCisgKiBBbGwgdGhlIGNsYXNzZXMgdGhhdCB3ZXJlIGFsbG9jYXRlZCBhcyBzaW5nbGV0b25zIG5lZWQgdG8gYmUgZGVsZXRlZCBzbworICogdGhlaXIgcmVzb3VyY2VzIGNhbiBiZSBmcmVlZC4KKyAqLwordm9pZCBTZW5zb3JCYXNlOjpEZWxldGVTaW5nbGV0b25zKCkKK3sKKwlmb3IgKFNlbnNvckJhc2UgKm5leHQgPSBtX3NpbmdsZXRvbkxpc3Q7IG5leHQgIT0gTlVMTDspCisJeworCQlTZW5zb3JCYXNlICp0bXAgPSBuZXh0OworCQluZXh0ID0gbmV4dC0+bV9uZXh0U2luZ2xldG9uOworCQlkZWxldGUgdG1wOworCX0KKwltX3NpbmdsZXRvbkxpc3QgPSBOVUxMOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIHNvbGVub2lkIG1vZHVsZSBudW1iZXIgaXMgdmFsaWQuCisgKgorICogQHJldHVybiBTb2xlbm9pZCBtb2R1bGUgaXMgdmFsaWQgYW5kIHByZXNlbnQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1NvbGVub2lkTW9kdWxlKHVpbnQ4X3QgbW9kdWxlTnVtYmVyKQoreworCWlmIChtb2R1bGVOdW1iZXIgPCA2NCkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGRpZ2l0YWwgY2hhbm5lbCBudW1iZXIgaXMgdmFsaWQuCisgKiBWZXJpZnkgdGhhdCB0aGUgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycyBhcmUKKyAqIDEtYmFzZWQuCisgKgorICogQHJldHVybiBEaWdpdGFsIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja0RpZ2l0YWxDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPCBrRGlnaXRhbENoYW5uZWxzKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGUgZGlnaXRhbCBjaGFubmVsIG51bWJlciBpcyB2YWxpZC4KKyAqIFZlcmlmeSB0aGF0IHRoZSBjaGFubmVsIG51bWJlciBpcyBvbmUgb2YgdGhlIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4gQ2hhbm5lbCBudW1iZXJzIGFyZQorICogMS1iYXNlZC4KKyAqCisgKiBAcmV0dXJuIFJlbGF5IGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1JlbGF5Q2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKQoreworCWlmIChjaGFubmVsIDwga1JlbGF5Q2hhbm5lbHMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBkaWdpdGFsIGNoYW5uZWwgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMgYXJlCisgKiAxLWJhc2VkLgorICoKKyAqIEByZXR1cm4gUFdNIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1BXTUNoYW5uZWwodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA8IGtQd21DaGFubmVscykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGFuYWxvZyBpbnB1dCBudW1iZXIgaXMgdmFsdWUuCisgKiBWZXJpZnkgdGhhdCB0aGUgYW5hbG9nIGlucHV0IG51bWJlciBpcyBvbmUgb2YgdGhlIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4gQ2hhbm5lbCBudW1iZXJzCisgKiBhcmUgMC1iYXNlZC4KKyAqCisgKiBAcmV0dXJuIEFuYWxvZyBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tBbmFsb2dJbnB1dCh1aW50MzJfdCBjaGFubmVsKQoreworCWlmIChjaGFubmVsIDwga0FuYWxvZ0lucHV0cykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGFuYWxvZyBvdXRwdXQgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGFuYWxvZyBvdXRwdXQgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMKKyAqIGFyZSAwLWJhc2VkLgorICoKKyAqIEByZXR1cm4gQW5hbG9nIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja0FuYWxvZ091dHB1dCh1aW50MzJfdCBjaGFubmVsKQoreworCWlmIChjaGFubmVsIDwga0FuYWxvZ091dHB1dHMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBWZXJpZnkgdGhhdCB0aGUgc29sZW5vaWQgY2hhbm5lbCBudW1iZXIgaXMgd2l0aGluIGxpbWl0cy4KKyAqCisgKiBAcmV0dXJuIFNvbGVub2lkIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1NvbGVub2lkQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKQoreworCWlmIChjaGFubmVsIDwga1NvbGVub2lkQ2hhbm5lbHMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBWZXJpZnkgdGhhdCB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGNoYW5uZWwgbnVtYmVyIGlzIHdpdGhpbiBsaW1pdHMuCisgKgorICogQHJldHVybiBQRFAgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIFNlbnNvckJhc2U6OkNoZWNrUERQQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKQoreworCWlmIChjaGFubmVsIDwga1BEUENoYW5uZWxzKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NlcnZvLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvU2Vydm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTNkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NlcnZvLmNwcApAQCAtMCwwICsxLDExMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU2Vydm8uaCIKKworLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKworY29uc3RleHByIGZsb2F0IFNlcnZvOjprTWF4U2Vydm9BbmdsZTsKK2NvbnN0ZXhwciBmbG9hdCBTZXJ2bzo6a01pblNlcnZvQW5nbGU7CisKK2NvbnN0ZXhwciBmbG9hdCBTZXJ2bzo6a0RlZmF1bHRNYXhTZXJ2b1BXTTsKK2NvbnN0ZXhwciBmbG9hdCBTZXJ2bzo6a0RlZmF1bHRNaW5TZXJ2b1BXTTsKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAqCisgKiBJbml0U2Vydm8oKSBhc3NpZ25zIGRlZmF1bHRzIGZvciB0aGUgcGVyaW9kIG11bHRpcGxpZXIgZm9yIHRoZSBzZXJ2byBQV00gY29udHJvbCBzaWduYWwsIGFzCisgKiB3ZWxsIGFzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIFBXTSB2YWx1ZXMgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2by4KKyAqLwordm9pZCBTZXJ2bzo6SW5pdFNlcnZvKCkKK3sKKwlTZXRCb3VuZHMoa0RlZmF1bHRNYXhTZXJ2b1BXTSwgMC4wLCAwLjAsIDAuMCwga0RlZmF1bHRNaW5TZXJ2b1BXTSk7CisJU2V0UGVyaW9kTXVsdGlwbGllcihrUGVyaW9kTXVsdGlwbGllcl80WCk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU2Vydm8sIEdldENoYW5uZWwoKSk7Cit9CisKKy8qKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHdoaWNoIHRoZSBzZXJ2byBpcyBhdHRhY2hlZC4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitTZXJ2bzo6U2Vydm8odWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpCit7CisJSW5pdFNlcnZvKCk7CisvLwlwcmludGYoIkRvbmUgaW5pdGlhbGl6aW5nIHNlcnZvICVkXG4iLCBjaGFubmVsKTsKK30KKworU2Vydm86On5TZXJ2bygpCit7Cit9CisKKy8qKgorICogU2V0IHRoZSBzZXJ2byBwb3NpdGlvbi4KKyAqCisgKiBTZXJ2byB2YWx1ZXMgcmFuZ2UgZnJvbSAwLjAgdG8gMS4wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJhbmdlIG9mIGZ1bGwgbGVmdCB0byBmdWxsIHJpZ2h0LgorICoKKyAqIEBwYXJhbSB2YWx1ZSBQb3NpdGlvbiBmcm9tIDAuMCB0byAxLjAuCisgKi8KK3ZvaWQgU2Vydm86OlNldChmbG9hdCB2YWx1ZSkKK3sKKwlTZXRQb3NpdGlvbih2YWx1ZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBzZXJ2byB0byBvZmZsaW5lLgorICoKKyAqIFNldCB0aGUgc2Vydm8gcmF3IHZhbHVlIHRvIDAgKHVuZHJpdmVuKQorICovCit2b2lkIFNlcnZvOjpTZXRPZmZsaW5lKCkgeworCVNldFJhdygwKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHNlcnZvIHBvc2l0aW9uLgorICoKKyAqIFNlcnZvIHZhbHVlcyByYW5nZSBmcm9tIDAuMCB0byAxLjAgY29ycmVzcG9uZGluZyB0byB0aGUgcmFuZ2Ugb2YgZnVsbCBsZWZ0IHRvIGZ1bGwgcmlnaHQuCisgKgorICogQHJldHVybiBQb3NpdGlvbiBmcm9tIDAuMCB0byAxLjAuCisgKi8KK2Zsb2F0IFNlcnZvOjpHZXQoKQoreworCXJldHVybiBHZXRQb3NpdGlvbigpOworfQorCisvKioKKyAqIFNldCB0aGUgc2Vydm8gYW5nbGUuCisgKgorICogQXNzdW1lIHRoYXQgdGhlIHNlcnZvIGFuZ2xlIGlzIGxpbmVhciB3aXRoIHJlc3BlY3QgdG8gdGhlIFBXTSB2YWx1ZSAoYmlnIGFzc3VtcHRpb24sIG5lZWQgdG8gdGVzdCkuCisgKgorICogU2Vydm8gYW5nbGVzIHRoYXQgYXJlIG91dCBvZiB0aGUgc3VwcG9ydGVkIHJhbmdlIG9mIHRoZSBzZXJ2byBzaW1wbHkgInNhdHVyYXRlIiBpbiB0aGF0IGRpcmVjdGlvbgorICogSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBzZXJ2byBoYXMgYSByYW5nZSBvZiAoWCBkZWdyZWVzIHRvIFkgZGVncmVlcykgdGhhbiBhbmdsZXMgb2YgbGVzcyB0aGFuIFgKKyAqIHJlc3VsdCBpbiBhbiBhbmdsZSBvZiBYIGJlaW5nIHNldCBhbmQgYW5nbGVzIG9mIG1vcmUgdGhhbiBZIGRlZ3JlZXMgcmVzdWx0IGluIGFuIGFuZ2xlIG9mIFkgYmVpbmcgc2V0LgorICoKKyAqIEBwYXJhbSBkZWdyZWVzIFRoZSBhbmdsZSBpbiBkZWdyZWVzIHRvIHNldCB0aGUgc2Vydm8uCisgKi8KK3ZvaWQgU2Vydm86OlNldEFuZ2xlKGZsb2F0IGRlZ3JlZXMpCit7CisJaWYgKGRlZ3JlZXMgPCBrTWluU2Vydm9BbmdsZSkKKwl7CisJCWRlZ3JlZXMgPSBrTWluU2Vydm9BbmdsZTsKKwl9CisJZWxzZSBpZiAoZGVncmVlcyA+IGtNYXhTZXJ2b0FuZ2xlKQorCXsKKwkJZGVncmVlcyA9IGtNYXhTZXJ2b0FuZ2xlOworCX0KKworCVNldFBvc2l0aW9uKCgoZmxvYXQpIChkZWdyZWVzIC0ga01pblNlcnZvQW5nbGUpKSAvIEdldFNlcnZvQW5nbGVSYW5nZSgpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHNlcnZvIGFuZ2xlLgorICoKKyAqIEFzc3VtZSB0aGF0IHRoZSBzZXJ2byBhbmdsZSBpcyBsaW5lYXIgd2l0aCByZXNwZWN0IHRvIHRoZSBQV00gdmFsdWUgKGJpZyBhc3N1bXB0aW9uLCBuZWVkIHRvIHRlc3QpLgorICogQHJldHVybiBUaGUgYW5nbGUgaW4gZGVncmVlcyB0byB3aGljaCB0aGUgc2Vydm8gaXMgc2V0LgorICovCitmbG9hdCBTZXJ2bzo6R2V0QW5nbGUoKQoreworCXJldHVybiAoZmxvYXQpR2V0UG9zaXRpb24oKSAqIEdldFNlcnZvQW5nbGVSYW5nZSgpICsga01pblNlcnZvQW5nbGU7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NvbGVub2lkLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvU29sZW5vaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZjNkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NvbGVub2lkLmNwcApAQCAtMCwwICsxLDExNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU29sZW5vaWQuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ29tbW9uIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBjb25zdHJ1Y3RvciBiZWhhdmlvci4KKyAqLwordm9pZCBTb2xlbm9pZDo6SW5pdFNvbGVub2lkKCkKK3sKKwljaGFyIGJ1Zls2NF07CisJaWYgKCFDaGVja1NvbGVub2lkTW9kdWxlKG1fbW9kdWxlTnVtYmVyKSkKKwl7CisJCXNucHJpbnRmKGJ1ZiwgNjQsICJTb2xlbm9pZCBNb2R1bGUgJWQiLCBtX21vZHVsZU51bWJlcik7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE1vZHVsZUluZGV4T3V0T2ZSYW5nZSwgYnVmKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIUNoZWNrU29sZW5vaWRDaGFubmVsKG1fY2hhbm5lbCkpCisJeworCQlzbnByaW50ZihidWYsIDY0LCAiU29sZW5vaWQgQ2hhbm5lbCAlZCIsIG1fY2hhbm5lbCk7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENoYW5uZWxJbmRleE91dE9mUmFuZ2UsIGJ1Zik7CisJCXJldHVybjsKKwl9CisJUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KCZtX2FsbG9jYXRlZCwga1NvbGVub2lkQ2hhbm5lbHMgKiA2Myk7CisKKwlzbnByaW50ZihidWYsIDY0LCAiU29sZW5vaWQgJWQgKE1vZHVsZTogJWQpIiwgbV9jaGFubmVsLCBtX21vZHVsZU51bWJlcik7CisJaWYgKG1fYWxsb2NhdGVkLT5BbGxvY2F0ZShtX21vZHVsZU51bWJlciAqIGtTb2xlbm9pZENoYW5uZWxzICsgbV9jaGFubmVsLCBidWYpID09IH4wdWwpCisJeworCQlDbG9uZUVycm9yKG1fYWxsb2NhdGVkKTsKKwkJcmV0dXJuOworCX0KKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgbV9jaGFubmVsLCBtX21vZHVsZU51bWJlcik7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgdXNpbmcgdGhlIGRlZmF1bHQgUENNIElEICgwKS4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBvbiB0aGUgUENNIHRvIGNvbnRyb2wgKDAuLjcpLgorICovCitTb2xlbm9pZDo6U29sZW5vaWQodWludDMyX3QgY2hhbm5lbCkKKwk6IFNvbGVub2lkQmFzZSAoR2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKCkpCisJLCBtX2NoYW5uZWwgKGNoYW5uZWwpCit7CisJSW5pdFNvbGVub2lkKCk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIG1vZHVsZU51bWJlciBUaGUgQ0FOIElEIG9mIHRoZSBQQ00gdGhlIHNvbGVub2lkIGlzIGF0dGFjaGVkIHRvCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBvbiB0aGUgUENNIHRvIGNvbnRyb2wgKDAuLjcpLgorICovCitTb2xlbm9pZDo6U29sZW5vaWQodWludDhfdCBtb2R1bGVOdW1iZXIsIHVpbnQzMl90IGNoYW5uZWwpCisJOiBTb2xlbm9pZEJhc2UgKG1vZHVsZU51bWJlcikKKwksIG1fY2hhbm5lbCAoY2hhbm5lbCkKK3sKKwlJbml0U29sZW5vaWQoKTsKK30KKworLyoqCisgKiBEZXN0cnVjdG9yLgorICovCitTb2xlbm9pZDo6flNvbGVub2lkKCkKK3sKKwlpZiAoQ2hlY2tTb2xlbm9pZE1vZHVsZShtX21vZHVsZU51bWJlcikpCisJeworCQltX2FsbG9jYXRlZC0+RnJlZShtX21vZHVsZU51bWJlciAqIGtTb2xlbm9pZENoYW5uZWxzICsgbV9jaGFubmVsKTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNvbGVub2lkLgorICoKKyAqIEBwYXJhbSBvbiBUdXJuIHRoZSBzb2xlbm9pZCBvdXRwdXQgb2ZmIG9yIG9uLgorICovCit2b2lkIFNvbGVub2lkOjpTZXQoYm9vbCBvbikKK3sKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisJdWludDhfdCB2YWx1ZSA9IG9uID8gMHhGRiA6IDB4MDA7CisJdWludDhfdCBtYXNrID0gMSA8PCBtX2NoYW5uZWw7CisKKwlTb2xlbm9pZEJhc2U6OlNldCh2YWx1ZSwgbWFzayk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCisgKi8KK2Jvb2wgU29sZW5vaWQ6OkdldCgpCit7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOworCXVpbnQ4X3QgdmFsdWUgPSBHZXRBbGwoKSAmICggMSA8PCBtX2NoYW5uZWwpOworCXJldHVybiAodmFsdWUgIT0gMCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgc29sZW5vaWQgaXMgYmxhY2tsaXN0ZWQuCisgKgkJSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAorICoJCWRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCisgKgkJQHNlZSBDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCisgKgorICogQHJldHVybiBJZiBzb2xlbm9pZCBpcyBkaXNhYmxlZCBkdWUgdG8gc2hvcnQuCisgKi8KK2Jvb2wgU29sZW5vaWQ6OklzQmxhY2tMaXN0ZWQoKQoreworCWludCB2YWx1ZSA9IEdldFBDTVNvbGVub2lkQmxhY2tMaXN0KCkgJiAoIDEgPDwgbV9jaGFubmVsKTsKKwlyZXR1cm4gKHZhbHVlICE9IDApOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Tb2xlbm9pZEJhc2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9Tb2xlbm9pZEJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjQ2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1NvbGVub2lkQmFzZS5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlNvbGVub2lkQmFzZS5oIgorCisvLyBOZWVkcyB0byBiZSBnbG9iYWwgc2luY2UgdGhlIHByb3RlY3RlZCByZXNvdXJjZSBzcGFucyBhbGwgU29sZW5vaWQgb2JqZWN0cy4KK1Jlc291cmNlICpTb2xlbm9pZEJhc2U6Om1fYWxsb2NhdGVkID0gTlVMTDsKKworLyoqCisgKiBDb25zdHJ1Y3RvcgorICogCisgKiBAcGFyYW0gbW9kdWxlTnVtYmVyIFRoZSBDQU4gUENNIElELgorICovCitTb2xlbm9pZEJhc2U6OlNvbGVub2lkQmFzZSh1aW50OF90IG1vZHVsZU51bWJlcikKKwk6IG1fbW9kdWxlTnVtYmVyIChtb2R1bGVOdW1iZXIpCit7CisgIAlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga1NvbGVub2lkQ2hhbm5lbHM7IGkrKykKKwl7CisJICB2b2lkKiBwb3J0ID0gZ2V0UG9ydFdpdGhNb2R1bGUobW9kdWxlTnVtYmVyLCBpKTsKKwkgIGludDMyX3Qgc3RhdHVzID0gMDsKKwkgIG1fcG9ydHNbaV0gPSBpbml0aWFsaXplU29sZW5vaWRQb3J0KHBvcnQsICZzdGF0dXMpOworCSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIERlc3RydWN0b3IuCisgKi8KK1NvbGVub2lkQmFzZTo6flNvbGVub2lkQmFzZSgpCit7Cit9CisKKy8qKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNvbGVub2lkLgorICogCisgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHlvdSB3YW50IHRvIHNldCBvbiB0aGUgbW9kdWxlLgorICogQHBhcmFtIG1hc2sgVGhlIGNoYW5uZWxzIHlvdSB3YW50IHRvIGJlIGFmZmVjdGVkLgorICovCit2b2lkIFNvbGVub2lkQmFzZTo6U2V0KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgbWFzaykKK3sKKyAgCWludDMyX3Qgc3RhdHVzID0gMDsKKwkJc2V0U29sZW5vaWRzKG1fcG9ydHNbMF0sIHZhbHVlLCBtYXNrLCAmc3RhdHVzKTsKKwl3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBSZWFkIGFsbCA4IHNvbGVub2lkcyBhcyBhIHNpbmdsZSBieXRlCisgKiAKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgYWxsIDggc29sZW5vaWRzIG9uIHRoZSBtb2R1bGUuCisgKi8KK3VpbnQ4X3QgU29sZW5vaWRCYXNlOjpHZXRBbGwoKQoreworICAJdWludDhfdCB2YWx1ZSA9IDA7CisgIAlpbnQzMl90IHN0YXR1cyA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsgLy8gWFhYOiBVbmhhcmRjb2RlCisJICB2YWx1ZSB8PSBnZXRTb2xlbm9pZChtX3BvcnRzW2ldLCAmc3RhdHVzKSA8PCBpOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisvKioKKyAqIFJlYWRzIGNvbXBsZXRlIHNvbGVub2lkIGJsYWNrbGlzdCBmb3IgYWxsIDggc29sZW5vaWRzIGFzIGEgc2luZ2xlIGJ5dGUuCisgKiAKKyAqCQlJZiBhIHNvbGVub2lkIGlzIHNob3J0ZWQsIGl0IGlzIGFkZGVkIHRvIHRoZSBibGFja2xpc3QgYW5kCisgKgkJZGlzYWJsZWQgdW50aWwgcG93ZXIgY3ljbGUsIG9yIHVudGlsIGZhdWx0cyBhcmUgY2xlYXJlZC4KKyAqCQlAc2VlIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKKyAqIAorICogQHJldHVybiBUaGUgc29sZW5vaWQgYmxhY2tsaXN0IG9mIGFsbCA4IHNvbGVub2lkcyBvbiB0aGUgbW9kdWxlLgorICovCit1aW50OF90IFNvbGVub2lkQmFzZTo6R2V0UENNU29sZW5vaWRCbGFja0xpc3QoKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwlyZXR1cm4gZ2V0UENNU29sZW5vaWRCbGFja0xpc3QobV9wb3J0c1swXSwgJnN0YXR1cyk7Cit9CisvKioKKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldCA6IFRoZSBjb21tb24gCisgKgkJCWhpZ2hzaWRlIHNvbGVub2lkIHZvbHRhZ2UgcmFpbCBpcyB0b28gbG93LAorICoJIAkJbW9zdCBsaWtlbHkgYSBzb2xlbm9pZCBjaGFubmVsIGlzIHNob3J0ZWQuCisgKi8KK2Jvb2wgU29sZW5vaWRCYXNlOjpHZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdCgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXJldHVybiBnZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdChtX3BvcnRzWzBdLCAmc3RhdHVzKTsKK30KKy8qKgorICogQHJldHVybiB0cnVlIGlmIFBDTSBpcyBpbiBmYXVsdCBzdGF0ZSA6IFRoZSBjb21tb24gCisgKgkJCWhpZ2hzaWRlIHNvbGVub2lkIHZvbHRhZ2UgcmFpbCBpcyB0b28gbG93LAorICoJIAkJbW9zdCBsaWtlbHkgYSBzb2xlbm9pZCBjaGFubmVsIGlzIHNob3J0ZWQuCisgKi8KK2Jvb2wgU29sZW5vaWRCYXNlOjpHZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdCgpCit7CisJaW50MzJfdCBzdGF0dXMgPSAwOworCXJldHVybiBnZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdChtX3BvcnRzWzBdLCAmc3RhdHVzKTsKK30KKy8qKgorICogQ2xlYXIgQUxMIHN0aWNreSBmYXVsdHMgaW5zaWRlIFBDTSB0aGF0IENvbXByZXNzb3IgaXMgd2lyZWQgdG8uCisgKgorICogSWYgYSBzdGlja3kgZmF1bHQgaXMgc2V0LCB0aGVuIGl0IHdpbGwgYmUgcGVyc2lzdGVudGx5IGNsZWFyZWQuICBDb21wcmVzc29yIGRyaXZlCisgKgkJbWF5YmUgbW9tZW50YXJpbHkgZGlzYWJsZSB3aGlsZSBmbGFncyBhcmUgYmVpbmcgY2xlYXJlZC4gQ2FyZSBzaG91bGQgYmUgCisgKgkJdGFrZW4gdG8gbm90IGNhbGwgdGhpcyB0b28gZnJlcXVlbnRseSwgb3RoZXJ3aXNlIG5vcm1hbCBjb21wcmVzc29yIAorICoJCWZ1bmN0aW9uYWxpdHkgbWF5IGJlIHByZXZlbnRlZC4KKyAqCisgKiBJZiBubyBzdGlja3kgZmF1bHRzIGFyZSBzZXQgdGhlbiB0aGlzIGNhbGwgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAqLwordm9pZCBTb2xlbm9pZEJhc2U6OkNsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJcmV0dXJuIGNsZWFyQWxsUENNU3RpY2t5RmF1bHRzX3NvbChtX3BvcnRzWzBdLCAmc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGFsb24uY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9UYWxvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlYjM5NgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGFsb24uY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlRhbG9uLmgiCisKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisKKy8qKgorICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgKgorICogTm90ZSB0aGF0IHRoZSBUYWxvbiB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvcgorICogbW9zdCBjb250cm9sbGVycywgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYyBiZWhhdmlvciBhcm91bmQKKyAqIHRoZSBkZWFkYmFuZCBvciBpbmFiaWxpdHkgdG8gc2F0dXJhdGUgdGhlIGNvbnRyb2xsZXIgaW4gZWl0aGVyIGRpcmVjdGlvbiwgY2FsaWJyYXRpb24gaXMgcmVjb21tZW5kZWQuCisgKiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVGFsb24gVXNlciBNYW51YWwgYXZhaWxhYmxlIGZyb20gQ1RSRS4KKyAqCisgKiAgIDIuMDM3bXMgPSBmdWxsICJmb3J3YXJkIgorICogICAxLjUzOW1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgKiAgIDEuNTEzbXMgPSBjZW50ZXIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIChvZmYpCisgKiAgIDEuNDg3bXMgPSB0aGUgImxvdyBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogICAwLjk4OW1zID0gZnVsbCAicmV2ZXJzZSIKKyAqLwordm9pZCBUYWxvbjo6SW5pdFRhbG9uKCkgeworCVNldEJvdW5kcygyLjAzNywgMS41MzksIDEuNTEzLCAxLjQ4NywgLjk4OSk7CisJU2V0UGVyaW9kTXVsdGlwbGllcihrUGVyaW9kTXVsdGlwbGllcl8xWCk7CisJU2V0UmF3KG1fY2VudGVyUHdtKTsKKwlTZXRaZXJvTGF0Y2goKTsKKworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9UYWxvbiwgR2V0Q2hhbm5lbCgpKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBUYWxvbiAob3JpZ2luYWwgb3IgVGFsb24gU1IpCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhlIFRhbG9uIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK1RhbG9uOjpUYWxvbih1aW50MzJfdCBjaGFubmVsKSA6IFNhZmVQV00oY2hhbm5lbCkKK3sKKwlJbml0VGFsb24oKTsKK30KKworVGFsb246On5UYWxvbigpCit7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUuCisgKgorICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQorICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorICogQHBhcmFtIHN5bmNHcm91cCBVbnVzZWQgaW50ZXJmYWNlLgorICovCit2b2lkIFRhbG9uOjpTZXQoZmxvYXQgc3BlZWQsIHVpbnQ4X3Qgc3luY0dyb3VwKQoreworCVNldFNwZWVkKHNwZWVkKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlY2VudGx5IHNldCB2YWx1ZSBvZiB0aGUgUFdNLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlIGZvciB0aGUgUFdNIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBUYWxvbjo6R2V0KCkKK3sKKwlyZXR1cm4gR2V0U3BlZWQoKTsKK30KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyAqLwordm9pZCBUYWxvbjo6RGlzYWJsZSgpCit7CisJU2V0UmF3KGtQd21EaXNhYmxlZCk7Cit9CisKKy8qKgorICogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQV00gdmFsdWUgYXMgd2FzIGZvdW5kIGluIHRoZSBQSURDb250cm9sbGVyCisgKi8KK3ZvaWQgVGFsb246OlBJRFdyaXRlKGZsb2F0IG91dHB1dCkKK3sKKwlTZXQob3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGFsb25TUlguY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9UYWxvblNSWC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmOWNlNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGFsb25TUlguY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlRhbG9uU1JYLmgiCisKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisKKy8qKgorICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgKgorICogTm90ZSB0aGF0IHRoZSBUYWxvblNSWCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvcgorICogbW9zdCBjb250cm9sbGVycywgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYyBiZWhhdmlvdXIgYXJvdW5kCisgKiB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLgorICogVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFRhbG9uU1JYIFVzZXIgTWFudWFsIGF2YWlsYWJsZSBmcm9tIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzLgorICogICAyLjAwNG1zID0gZnVsbCAiZm9yd2FyZCIKKyAqICAgMS41Mm1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgKiAgIDEuNTBtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKKyAqICAgMS40OG1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqICAgMC45OTdtcyA9IGZ1bGwgInJldmVyc2UiCisgKi8KK3ZvaWQgVGFsb25TUlg6OkluaXRUYWxvblNSWCgpIHsKKwlTZXRCb3VuZHMoMi4wMDQsIDEuNTIsIDEuNTAsIDEuNDgsIC45OTcpOworCVNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMVgpOworCVNldFJhdyhtX2NlbnRlclB3bSk7CisJU2V0WmVyb0xhdGNoKCk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfVGFsb24sIEdldENoYW5uZWwoKSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0IGEgVGFsb25TUlggY29ubmVjdGVkIHZpYSBQV00KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBUYWxvblNSWCBpcyBhdHRhY2hlZCB0by4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitUYWxvblNSWDo6VGFsb25TUlgodWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpCit7CisJSW5pdFRhbG9uU1JYKCk7Cit9CisKK1RhbG9uU1JYOjp+VGFsb25TUlgoKQoreworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlLgorICoKKyAqIFRoZSBQV00gdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkKKyAqIHNjYWxpbmcgdGhlIHZhbHVlIGZvciB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgMS4wIHRvIHNldC4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVW51c2VkIGludGVyZmFjZS4KKyAqLwordm9pZCBUYWxvblNSWDo6U2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCkKK3sKKwlTZXRTcGVlZChzcGVlZCk7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWNlbnRseSBzZXQgdmFsdWUgb2YgdGhlIFBXTS4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgdGhlIFBXTSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgVGFsb25TUlg6OkdldCgpCit7CisJcmV0dXJuIEdldFNwZWVkKCk7Cit9CisKKy8qKgorICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCisgKi8KK3ZvaWQgVGFsb25TUlg6OkRpc2FibGUoKQoreworCVNldFJhdyhrUHdtRGlzYWJsZWQpOworfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIFRhbG9uU1JYOjpQSURXcml0ZShmbG9hdCBvdXRwdXQpCit7CisJU2V0KG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Rhc2suY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9UYXNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjgwMTQyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9UYXNrLmNwcApAQCAtMCwwICsxLDIxMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVGFzay5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworI2lmbmRlZiBPSworI2RlZmluZSBPSwkJMAorI2VuZGlmIC8qIE9LICovCisjaWZuZGVmIEVSUk9SCisjZGVmaW5lIEVSUk9SCQkoLTEpCisjZW5kaWYgLyogRVJST1IgKi8KKworY29uc3QgdWludDMyX3QgVGFzazo6a0RlZmF1bHRQcmlvcml0eTsKKworLyoqCisgKiBDcmVhdGUgYnV0IGRvbid0IGxhdW5jaCBhIHRhc2suCisgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFzay4gICJGUkNfIiB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgdGFzayBuYW1lLgorICogQHBhcmFtIGZ1bmN0aW9uIFRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiB0byBydW4gYXMgdGhlIG5ldyB0YXNrLgorICogQHBhcmFtIHByaW9yaXR5IFRoZSBWeFdvcmtzIHByaW9yaXR5IGZvciB0aGUgdGFzay4KKyAqIEBwYXJhbSBzdGFja1NpemUgVGhlIHNpemUgb2YgdGhlIHN0YWNrIGZvciB0aGUgdGFzaworICovCitUYXNrOjpUYXNrKGNvbnN0IGNoYXIqIG5hbWUsIEZVTkNQVFIgZnVuY3Rpb24sIGludDMyX3QgcHJpb3JpdHksIHVpbnQzMl90IHN0YWNrU2l6ZSkKK3sKKwltX3Rhc2tJRCA9IE5VTExfVEFTSzsKKwltX2Z1bmN0aW9uID0gZnVuY3Rpb247CisJbV9wcmlvcml0eSA9IHByaW9yaXR5OworCW1fc3RhY2tTaXplID0gc3RhY2tTaXplOworCW1fdGFza05hbWUgPSBuZXcgY2hhcltzdHJsZW4obmFtZSkgKyA1XTsKKwlzdHJjcHkobV90YXNrTmFtZSwgIkZSQ18iKTsKKwlzdHJjcHkobV90YXNrTmFtZSs0LCBuYW1lKTsKKworCXN0YXRpYyBpbnQzMl90IGluc3RhbmNlcyA9IDA7CisJaW5zdGFuY2VzKys7CisJSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1Rhc2ssIGluc3RhbmNlcywgMCwgbV90YXNrTmFtZSk7Cit9CisKK1Rhc2s6On5UYXNrKCkKK3sKKwlpZiAobV90YXNrSUQgIT0gTlVMTF9UQVNLKSBTdG9wKCk7CisJZGVsZXRlIFtdIG1fdGFza05hbWU7CisJbV90YXNrTmFtZSA9IE5VTEw7Cit9CisKKy8qKgorICogU3RhcnRzIHRoaXMgdGFzay4KKyAqIElmIGl0IGlzIGFscmVhZHkgcnVubmluZyBvciB1bmFibGUgdG8gc3RhcnQsIGl0IGZhaWxzIGFuZCByZXR1cm5zIGZhbHNlLgorICovCitib29sIFRhc2s6OlN0YXJ0KHVpbnQzMl90IGFyZzAsIHVpbnQzMl90IGFyZzEsIHVpbnQzMl90IGFyZzIsIHVpbnQzMl90IGFyZzMsIHVpbnQzMl90IGFyZzQsIAorCQl1aW50MzJfdCBhcmc1LCB1aW50MzJfdCBhcmc2LCB1aW50MzJfdCBhcmc3LCB1aW50MzJfdCBhcmc4LCB1aW50MzJfdCBhcmc5KQoreworCW1fdGFza0lEID0gc3Bhd25UYXNrKG1fdGFza05hbWUsCisJCQkJCQltX3ByaW9yaXR5LAorCQkJCQkJVlhXT1JLU19GUF9UQVNLLAkJCQkJCQkvLyBvcHRpb25zCisJCQkJCQltX3N0YWNrU2l6ZSwJCQkJCQkvLyBzdGFjayBzaXplCisJCQkJCQltX2Z1bmN0aW9uLAkJCQkJCQkvLyBmdW5jdGlvbiB0byBzdGFydAorCQkJCQkJYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwJLy8gcGFyYW1ldGVyIDEgLSBwb2ludGVyIHRvIHRoaXMgY2xhc3MKKwkJCQkJCWFyZzUsIGFyZzYsIGFyZzcsIGFyZzgsIGFyZzkpOy8vIGFkZGl0aW9uYWwgdW51c2VkIHBhcmFtZXRlcnMKKwlpZiAobV90YXNrSUQgPT0gTlVMTF9UQVNLKSB7CisJCUhhbmRsZUVycm9yKEVSUk9SKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBSZXN0YXJ0cyBhIHJ1bm5pbmcgdGFzay4KKyAqIElmIHRoZSB0YXNrIGlzbid0IHN0YXJ0ZWQsIGl0IHN0YXJ0cyBpdC4KKyAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIHRhc2sgaXMgcnVubmluZyBhbmQgd2UgYXJlIHVuYWJsZSB0byBraWxsIHRoZSBwcmV2aW91cyBpbnN0YW5jZQorICovCitib29sIFRhc2s6OlJlc3RhcnQoKQoreworCXJldHVybiBIYW5kbGVFcnJvcihyZXN0YXJ0VGFzayhtX3Rhc2tJRCkpOworfQorCisvKioKKyAqIEtpbGxzIHRoZSBydW5uaW5nIHRhc2suCisgKiBAcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgZmFsc2UgaWYgdGhlIHRhc2sgZG9lc24ndCBleGlzdCBvciB3ZSBhcmUgdW5hYmxlIHRvIGtpbGwgaXQuCisgKi8KK2Jvb2wgVGFzazo6U3RvcCgpCit7CisJYm9vbCBvayA9IHRydWU7CisJaWYgKFZlcmlmeSgpKQorCXsKKwkJb2sgPSBIYW5kbGVFcnJvcihkZWxldGVUYXNrKG1fdGFza0lEKSk7CisJfQorCW1fdGFza0lEID0gTlVMTF9UQVNLOworCXJldHVybiBvazsKK30KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaXMgcmVhZHkgdG8gZXhlY3V0ZSAoaS5lLiBub3Qgc3VzcGVuZGVkLCBkZWxheWVkLCBvciBibG9ja2VkKS4KKyAqIEByZXR1cm4gdHJ1ZSBpZiByZWFkeSwgZmFsc2UgaWYgbm90IHJlYWR5LgorICovCitib29sIFRhc2s6OklzUmVhZHkoKQoreworCXJldHVybiBpc1Rhc2tSZWFkeShtX3Rhc2tJRCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIHdhcyBleHBsaWNpdGx5IHN1c3BlbmRlZCBieSBjYWxsaW5nIFN1c3BlbmQoKQorICogQHJldHVybiB0cnVlIGlmIHN1c3BlbmRlZCwgZmFsc2UgaWYgbm90IHN1c3BlbmRlZC4KKyAqLworYm9vbCBUYXNrOjpJc1N1c3BlbmRlZCgpCit7CisJcmV0dXJuIGlzVGFza1N1c3BlbmRlZChtX3Rhc2tJRCk7Cit9CisKKy8qKgorICogUGF1c2VzIGEgcnVubmluZyB0YXNrLgorICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIHVuYWJsZSB0byBwYXVzZSBvciB0aGUgdGFzayBpc24ndCBydW5uaW5nLgorICovCitib29sIFRhc2s6OlN1c3BlbmQoKQoreworCXJldHVybiBIYW5kbGVFcnJvcihzdXNwZW5kVGFzayhtX3Rhc2tJRCkpOworfQorCisvKioKKyAqIFJlc3VtZXMgYSBwYXVzZWQgdGFzay4KKyAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiB1bmFibGUgdG8gcmVzdW1lIG9yIGlmIHRoZSB0YXNrIGlzbid0IHJ1bm5pbmcvcGF1c2VkLgorICovCitib29sIFRhc2s6OlJlc3VtZSgpCit7CisJcmV0dXJuIEhhbmRsZUVycm9yKHJlc3VtZVRhc2sobV90YXNrSUQpKTsKK30KKworLyoqCisgKiBWZXJpZmllcyBhIHRhc2sgc3RpbGwgZXhpc3RzLgorICogQHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICovCitib29sIFRhc2s6OlZlcmlmeSgpCit7CisJcmV0dXJuIHZlcmlmeVRhc2tJRChtX3Rhc2tJRCkgPT0gT0s7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcHJpb3JpdHkgb2YgYSB0YXNrLgorICogQHJldHVybnMgdGFzayBwcmlvcml0eSBvciAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50MzJfdCBUYXNrOjpHZXRQcmlvcml0eSgpCit7CisJaWYgKEhhbmRsZUVycm9yKGdldFRhc2tQcmlvcml0eShtX3Rhc2tJRCwgJm1fcHJpb3JpdHkpKSkKKwkJcmV0dXJuIG1fcHJpb3JpdHk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIHJvdXRpbmUgY2hhbmdlcyBhIHRhc2sncyBwcmlvcml0eSB0byBhIHNwZWNpZmllZCBwcmlvcml0eS4KKyAqIFByaW9yaXRpZXMgcmFuZ2UgZnJvbSAwLCB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdG8gMjU1LCB0aGUgbG93ZXN0IHByaW9yaXR5LgorICogRGVmYXVsdCB0YXNrIHByaW9yaXR5IGlzIDEwMC4KKyAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgdGhlIHRhc2sgc2hvdWxkIHJ1biBhdC4KKyAqIEByZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKyAqLworYm9vbCBUYXNrOjpTZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KQoreworCW1fcHJpb3JpdHkgPSBwcmlvcml0eTsKKwlyZXR1cm4gSGFuZGxlRXJyb3Ioc2V0VGFza1ByaW9yaXR5KG1fdGFza0lELCBtX3ByaW9yaXR5KSk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGFzay4KKyAqIEByZXR1cm5zIFBvaW50ZXIgdG8gdGhlIG5hbWUgb2YgdGhlIHRhc2sgb3IgTlVMTCBpZiBub3QgYWxsb2NhdGVkCisgKi8KK2NvbnN0IGNoYXIqIFRhc2s6OkdldE5hbWUoKQoreworCXJldHVybiBtX3Rhc2tOYW1lOworfQorCisvKioKKyAqIEdldCB0aGUgSUQgb2YgYSB0YXNrCisgKiBAcmV0dXJucyBUYXNrIElEIG9mIHRoaXMgdGFzay4gIFRhc2s6OmtJbnZhbGlkVGFza0lEICgtMSkgaWYgdGhlIHRhc2sgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgb3IgaGFzIGFscmVhZHkgZXhpdGVkLgorICovCitUQVNLIFRhc2s6OkdldElEKCkKK3sKKwlpZiAoVmVyaWZ5KCkpCisJCXJldHVybiBtX3Rhc2tJRDsKKwlyZXR1cm4gTlVMTF9UQVNLOworfQorCisvKioKKyAqIEhhbmRsZXMgZXJyb3JzIGdlbmVyYXRlZCBieSB0YXNrIHJlbGF0ZWQgY29kZS4KKyAqLworYm9vbCBUYXNrOjpIYW5kbGVFcnJvcihTVEFUVVMgcmVzdWx0cykKK3sKKwlpZiAocmVzdWx0cyAhPSBFUlJPUikgcmV0dXJuIHRydWU7CisJaW50IGVycnN2ID0gZXJybm87CisJaWYgKGVycnN2ID09IEhBTF9vYmpMaWJfT0JKX0lEX0VSUk9SKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRhc2tJREVycm9yLCBtX3Rhc2tOYW1lKTsKKwl9IGVsc2UgaWYgKGVycnN2ID09IEhBTF9vYmpMaWJfT0JKX0RFTEVURUQpIHsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGFza0RlbGV0ZWRFcnJvciwgbV90YXNrTmFtZSk7CisJfSBlbHNlIGlmIChlcnJzdiA9PSBIQUxfdGFza0xpYl9JTExFR0FMX09QVElPTlMpIHsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGFza09wdGlvbnNFcnJvciwgbV90YXNrTmFtZSk7CisJfSBlbHNlIGlmIChlcnJzdiA9PSBIQUxfbWVtTGliX05PVF9FTk9VR0hfTUVNT1JZKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRhc2tNZW1vcnlFcnJvciwgbV90YXNrTmFtZSk7CisJfSBlbHNlIGlmIChlcnJzdiA9PSBIQUxfdGFza0xpYl9JTExFR0FMX1BSSU9SSVRZKSB7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRhc2tQcmlvcml0eUVycm9yLCBtX3Rhc2tOYW1lKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkVSUk9SOiBlcnJubz0laSIsIGVycnN2KTsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGFza0Vycm9yLCBtX3Rhc2tOYW1lKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1RpbWVyLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVGltZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzczN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1RpbWVyLmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVGltZXIuaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIkhBTC9jcHAvU3luY2hyb25pemVkLmhwcCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8qKgorICogUGF1c2UgdGhlIHRhc2sgZm9yIGEgc3BlY2lmaWVkIHRpbWUuCisgKgorICogUGF1c2UgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBmb3IgYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUgZ2l2ZW4gaW4gc2Vjb25kcy4KKyAqIE1vdG9ycyB3aWxsIGNvbnRpbnVlIHRvIHJ1biBhdCB0aGVpciBsYXN0IGFzc2lnbmVkIHZhbHVlcywgYW5kIHNlbnNvcnMgd2lsbCBjb250aW51ZSB0bworICogdXBkYXRlLiBPbmx5IHRoZSB0YXNrIGNvbnRhaW5pbmcgdGhlIHdhaXQgd2lsbCBwYXVzZSB1bnRpbCB0aGUgd2FpdCB0aW1lIGlzIGV4cGlyZWQuCisgKgorICogQHBhcmFtIHNlY29uZHMgTGVuZ3RoIG9mIHRpbWUgdG8gcGF1c2UsIGluIHNlY29uZHMuCisgKi8KK3ZvaWQgV2FpdChkb3VibGUgc2Vjb25kcykKK3sKKwlpZiAoc2Vjb25kcyA8IDAuMCkgcmV0dXJuOworCWRlbGF5U2Vjb25kcyhzZWNvbmRzKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEZQR0Egc3lzdGVtIGNsb2NrIHRpbWUgaW4gc2Vjb25kcy4KKyAqIFRoaXMgaXMgZGVwcmVjYXRlZCBhbmQganVzdCBmb3J3YXJkcyB0byBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpLgorICogQHJldHVybiBSb2JvdCBydW5uaW5nIHRpbWUgaW4gc2Vjb25kcy4KKyAqLworZG91YmxlIEdldENsb2NrKCkKK3sKKwlyZXR1cm4gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKK30KKworLyoqCisgKiBAYnJpZWYgR2l2ZXMgcmVhbC10aW1lIGNsb2NrIHN5c3RlbSB0aW1lIHdpdGggbmFub3NlY29uZCByZXNvbHV0aW9uCisgKiBAcmV0dXJuIFRoZSB0aW1lLCBqdXN0IGluIGNhc2UgeW91IHdhbnQgdGhlIHJvYm90IHRvIHN0YXJ0IGF1dG9ub21vdXMgYXQgOHBtIG9uIFNhdHVyZGF5LgorKi8KK2RvdWJsZSBHZXRUaW1lKCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHA7CisKKwljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCZ0cCk7CisJZG91YmxlIHJlYWxUaW1lID0gKGRvdWJsZSl0cC50dl9zZWMgKyAoZG91YmxlKSgoZG91YmxlKXRwLnR2X25zZWMqMWUtOSk7CisKKwlyZXR1cm4gKHJlYWxUaW1lKTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBuZXcgdGltZXIgb2JqZWN0LgorICoKKyAqIENyZWF0ZSBhIG5ldyB0aW1lciBvYmplY3QgYW5kIHJlc2V0IHRoZSB0aW1lIHRvIHplcm8uIFRoZSB0aW1lciBpcyBpbml0aWFsbHkgbm90IHJ1bm5pbmcgYW5kCisgKiBtdXN0IGJlIHN0YXJ0ZWQuCisgKi8KK1RpbWVyOjpUaW1lcigpCisJOiBtX3N0YXJ0VGltZSAoMC4wKQorCSwgbV9hY2N1bXVsYXRlZFRpbWUgKDAuMCkKKwksIG1fcnVubmluZyAoZmFsc2UpCit7CisJLy9DcmVhdGVzIGEgc2VtYXBob3JlIHRvIGNvbnRyb2wgYWNjZXNzIHRvIGNyaXRpY2FsIHJlZ2lvbnMuCisJLy9Jbml0aWFsbHkgJ29wZW4nCisJUmVzZXQoKTsKK30KKworVGltZXI6On5UaW1lcigpIHt9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGUgdGltZXIuIElmIHRoZSBjbG9jayBpcyBydW5uaW5nIGl0IGlzIGRlcml2ZWQgZnJvbQorICogdGhlIGN1cnJlbnQgc3lzdGVtIGNsb2NrIHRoZSBzdGFydCB0aW1lIHN0b3JlZCBpbiB0aGUgdGltZXIgY2xhc3MuIElmIHRoZSBjbG9jaworICogaXMgbm90IHJ1bm5pbmcsIHRoZW4gcmV0dXJuIHRoZSB0aW1lIHdoZW4gaXQgd2FzIGxhc3Qgc3RvcHBlZC4KKyAqCisgKiBAcmV0dXJuIEN1cnJlbnQgdGltZSB2YWx1ZSBmb3IgdGhpcyB0aW1lciBpbiBzZWNvbmRzCisgKi8KK2RvdWJsZSBUaW1lcjo6R2V0KCkKK3sKKwlkb3VibGUgcmVzdWx0OworCWRvdWJsZSBjdXJyZW50VGltZSA9IEdldEZQR0FUaW1lc3RhbXAoKTsKKworCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gc3luYyhtX2xvY2spOworCWlmKG1fcnVubmluZykKKwl7CisJCS8vIElmIHRoZSBjdXJyZW50IHRpbWUgaXMgYmVmb3JlIHRoZSBzdGFydCB0aW1lLCB0aGVuIHRoZSBGUEdBIGNsb2NrCisJCS8vIHJvbGxlZCBvdmVyLiAgQ29tcGVuc2F0ZSBieSBhZGRpbmcgdGhlIH43MSBtaW51dGVzIHRoYXQgaXQgdGFrZXMKKwkJLy8gdG8gcm9sbCBvdmVyIHRvIHRoZSBjdXJyZW50IHRpbWUuCisJCWlmKGN1cnJlbnRUaW1lIDwgbV9zdGFydFRpbWUpIHsKKwkJCWN1cnJlbnRUaW1lICs9IGtSb2xsb3ZlclRpbWU7CisJCX0KKworCQlyZXN1bHQgPSAoY3VycmVudFRpbWUgLSBtX3N0YXJ0VGltZSkgKyBtX2FjY3VtdWxhdGVkVGltZTsKKwl9CisJZWxzZQorCXsKKwkJcmVzdWx0ID0gbV9hY2N1bXVsYXRlZFRpbWU7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXNldCB0aGUgdGltZXIgYnkgc2V0dGluZyB0aGUgdGltZSB0byAwLgorICoKKyAqIE1ha2UgdGhlIHRpbWVyIHN0YXJ0VGltZSB0aGUgY3VycmVudCB0aW1lIHNvIG5ldyByZXF1ZXN0cyB3aWxsIGJlIHJlbGF0aXZlIHRvIG5vdworICovCit2b2lkIFRpbWVyOjpSZXNldCgpCit7CisJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBzeW5jKG1fbG9jayk7CisJbV9hY2N1bXVsYXRlZFRpbWUgPSAwOworCW1fc3RhcnRUaW1lID0gR2V0RlBHQVRpbWVzdGFtcCgpOworfQorCisvKioKKyAqIFN0YXJ0IHRoZSB0aW1lciBydW5uaW5nLgorICogSnVzdCBzZXQgdGhlIHJ1bm5pbmcgZmxhZyB0byB0cnVlIGluZGljYXRpbmcgdGhhdCBhbGwgdGltZSByZXF1ZXN0cyBzaG91bGQgYmUKKyAqIHJlbGF0aXZlIHRvIHRoZSBzeXN0ZW0gY2xvY2suCisgKi8KK3ZvaWQgVGltZXI6OlN0YXJ0KCkKK3sKKwk6OnN0ZDo6dW5pcXVlX2xvY2s8TXV0ZXg+IHN5bmMobV9sb2NrKTsKKwlpZiAoIW1fcnVubmluZykKKwl7CisJCW1fc3RhcnRUaW1lID0gR2V0RlBHQVRpbWVzdGFtcCgpOworCQltX3J1bm5pbmcgPSB0cnVlOworCX0KK30KKworLyoqCisgKiBTdG9wIHRoZSB0aW1lci4KKyAqIFRoaXMgY29tcHV0ZXMgdGhlIHRpbWUgYXMgb2Ygbm93IGFuZCBjbGVhcnMgdGhlIHJ1bm5pbmcgZmxhZywgY2F1c2luZyBhbGwKKyAqIHN1YnNlcXVlbnQgdGltZSByZXF1ZXN0cyB0byBiZSByZWFkIGZyb20gdGhlIGFjY3VtdWxhdGVkIHRpbWUgcmF0aGVyIHRoYW4KKyAqIGxvb2tpbmcgYXQgdGhlIHN5c3RlbSBjbG9jay4KKyAqLwordm9pZCBUaW1lcjo6U3RvcCgpCit7CisJZG91YmxlIHRlbXAgPSBHZXQoKTsKKworCTo6c3RkOjp1bmlxdWVfbG9jazxNdXRleD4gc3luYyhtX2xvY2spOworCWlmIChtX3J1bm5pbmcpCisJeworCQltX2FjY3VtdWxhdGVkVGltZSA9IHRlbXA7CisJCW1fcnVubmluZyA9IGZhbHNlOworCX0KK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgcGVyaW9kIHNwZWNpZmllZCBoYXMgcGFzc2VkIGFuZCBpZiBpdCBoYXMsIGFkdmFuY2UgdGhlIHN0YXJ0CisgKiB0aW1lIGJ5IHRoYXQgcGVyaW9kLiBUaGlzIGlzIHVzZWZ1bCB0byBkZWNpZGUgaWYgaXQncyB0aW1lIHRvIGRvIHBlcmlvZGljCisgKiB3b3JrIHdpdGhvdXQgZHJpZnRpbmcgbGF0ZXIgYnkgdGhlIHRpbWUgaXQgdG9vayB0byBnZXQgYXJvdW5kIHRvIGNoZWNraW5nLgorICoKKyAqIEBwYXJhbSBwZXJpb2QgVGhlIHBlcmlvZCB0byBjaGVjayBmb3IgKGluIHNlY29uZHMpLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBwZXJpb2QgaGFzIHBhc3NlZC4KKyAqLworYm9vbCBUaW1lcjo6SGFzUGVyaW9kUGFzc2VkKGRvdWJsZSBwZXJpb2QpCit7CisJaWYgKEdldCgpID4gcGVyaW9kKQorCXsKKwkJOjpzdGQ6OnVuaXF1ZV9sb2NrPE11dGV4PiBzeW5jKG1fbG9jayk7CisJCS8vIEFkdmFuY2UgdGhlIHN0YXJ0IHRpbWUgYnkgdGhlIHBlcmlvZC4KKwkJbV9zdGFydFRpbWUgKz0gcGVyaW9kOworCQkvLyBEb24ndCBzZXQgaXQgdG8gdGhlIGN1cnJlbnQgdGltZS4uLiB3ZSB3YW50IHRvIGF2b2lkIGRyaWZ0LgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFJldHVybiB0aGUgRlBHQSBzeXN0ZW0gY2xvY2sgdGltZSBpbiBzZWNvbmRzLgorICoKKyAqIFJldHVybiB0aGUgdGltZSBmcm9tIHRoZSBGUEdBIGhhcmR3YXJlIGNsb2NrIGluIHNlY29uZHMgc2luY2UgdGhlIEZQR0EKKyAqIHN0YXJ0ZWQuCisgKiBSb2xscyBvdmVyIGFmdGVyIDcxIG1pbnV0ZXMuCisgKiBAcmV0dXJucyBSb2JvdCBydW5uaW5nIHRpbWUgaW4gc2Vjb25kcy4KKyAqLworZG91YmxlIFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCkKK3sKKwkvLyBGUEdBIHJldHVybnMgdGhlIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMKKwkvLyBDYWxsIHRoZSBoZWxwZXIgR2V0RlBHQVRpbWUoKSBpbiBVdGlsaXR5LmNwcAorCXJldHVybiBHZXRGUEdBVGltZSgpICogMS4wZS02OworfQorCisvLyBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IHJlYWRzIHRoZSBQUEMgdGltZXN0YW1wIGNvdW50ZXIuCitleHRlcm4gIkMiCit7CisJdWludDMyX3QgbmlUaW1lc3RhbXAzMih2b2lkKTsKKwl1aW50NjRfdCBuaVRpbWVzdGFtcDY0KHZvaWQpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9VU0JDYW1lcmEuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9VU0JDYW1lcmEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzZiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1VTQkNhbWVyYS5jcHAKQEAgLTAsMCArMSwzMjggQEAKKyNpbmNsdWRlICJVU0JDYW1lcmEuaCIKKworI2luY2x1ZGUgIlV0aWxpdHkuaCIKKworI2luY2x1ZGUgPHJlZ2V4PgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworLy8gVGhpcyBtYWNybyBleHBhbmRzIHRoZSBnaXZlbiBpbWFxIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IGl0IGlzIGNhbGxlZCBhbmQKKy8vIHByb3Blcmx5IGNoZWNrZWQgZm9yIGFuIGVycm9yLCBjYWxsaW5nIHRoZSB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQKKy8vIG1hY3JvCisvLyBUbyBjYWxsIGl0LCBqdXN0IGdpdmUgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGUgYXJndW1lbnRzCisjZGVmaW5lIFNBRkVfSU1BUV9DQUxMKGZ1bk5hbWUsIC4uLikgeyBcCisgICAgdW5zaWduZWQgaW50IGVycm9yID0gZnVuTmFtZShfX1ZBX0FSR1NfXyk7IFwKKyAgICBpZiAoZXJyb3IgIT0gSU1BUWR4RXJyb3JTdWNjZXNzKSBcCisgICAgICB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoZXJyb3IsICNmdW5OYW1lKTsgXAorICB9CisKKy8vIENvbnN0YW50cyBmb3IgdGhlIG1hbnVhbCBhbmQgYXV0byB0eXBlcworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIEFVVE8gPSAiQXV0byI7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgTUFOVUFMID0gIk1hbnVhbCI7CisKKy8qKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiBhIGpwZWcuIFRoZSBnZW5lcmFsIHN0cnVjdHVyZSBvZgorICogaG93IHRvIHBhcnNlIGEganBlZyBmb3IgbGVuZ3RoIGNhbiBiZSBmb3VuZCBpbiB0aGlzIHN0YWNrb3ZlcmZsb3cgYXJ0aWNsZToKKyAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2MDI0MjguIEJlIHN1cmUgdG8gYWxzbyByZWFkIHRoZSBjb21tZW50cyBmb3IKKyAqIHRoZSBTT1MgZmxhZyBleHBsYW5hdGlvbi4KKyAqLwordW5zaWduZWQgaW50IFVTQkNhbWVyYTo6R2V0SnBlZ1NpemUodm9pZCogYnVmZmVyLCB1bnNpZ25lZCBpbnQgYnVmZlNpemUpIHsKKyAgdWludDhfdCogZGF0YSA9ICh1aW50OF90KikgYnVmZmVyOworICBpZiAoIXdwaV9hc3NlcnQoZGF0YVswXSA9PSAweGZmICYmIGRhdGFbMV0gPT0gMHhkOCkpIHJldHVybiAwOworICB1bnNpZ25lZCBpbnQgcG9zID0gMjsKKyAgd2hpbGUgKHBvcyA8IGJ1ZmZTaXplKSB7CisgICAgLy8gQWxsIGNvbnRyb2wgbWFya2VycyBzdGFydCB3aXRoIDB4ZmYsIHNvIGlmIHRoaXMgaXNuJ3QgcHJlc2VudCwKKyAgICAvLyB0aGUgSlBFRyBpcyBub3QgdmFsaWQKKyAgICBpZiAoIXdwaV9hc3NlcnQoZGF0YVtwb3NdID09IDB4ZmYpKSByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHQgPSBkYXRhW3BvcysxXTsKKyAgICAvLyBUaGVzZSBhcmUgUlNUIG1hcmtlcnMuIFdlIGp1c3Qgc2tpcCB0aGVtIGFuZCBtb3ZlIG9udG8gdGhlIG5leHQgbWFya2VyCisgICAgaWYgKHQgPT0gMHgwMSB8fCAodCA+PSAweGQwICYmIHQgPD0gMHhkNykpIHsKKyAgICAgIHBvcyArPSAyOworICAgIH0gZWxzZSBpZiAodCA9PSAweGQ5KSB7CisgICAgICAvLyBFbmQgb2YgSW1hZ2UsIGFkZCAyIGZvciB0aGlzIGFuZCAwLWluZGV4ZWQKKyAgICAgIHJldHVybiBwb3MgKyAyOworICAgIH0gZWxzZSBpZiAoIXdwaV9hc3NlcnQodCAhPSAweGQ4KSkgIHsKKyAgICAgIC8vIEFub3RoZXIgc3RhcnQgb2YgaW1hZ2UsIGludmFsaWQgaW1hZ2UKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAodCA9PSAweGRhKSB7CisgICAgICAvLyBTT1MgbWFya2VyLiBUaGUgbmV4dCB0d28gYnl0ZXMgYXJlIGEgMTYtYml0IGJpZy1lbmRpYW4gaW50IHRoYXQgaXMKKyAgICAgIC8vIHRoZSBsZW5ndGggb2YgdGhlIFNPUyBoZWFkZXIsIHNraXAgdGhhdAorICAgICAgdW5zaWduZWQgaW50IGxlbiA9ICgoKHVuc2lnbmVkIGludCkgKGRhdGFbcG9zKzJdICYgMHhmZikpIDw8IDggfCAoKHVuc2lnbmVkIGludCkgZGF0YVtwb3MrM10gJiAweGZmKSk7CisgICAgICBwb3MgKz0gbGVuICsgMjsKKyAgICAgIC8vIFRoZSBuZXh0IG1hcmtlciBpcyB0aGUgZmlyc3QgbWFya2VyIHRoYXQgaXMgMHhmZiBmb2xsb3dlZCBieSBhIG5vbi1SU1QKKyAgICAgIC8vIGVsZW1lbnQuIDB4ZmYgZm9sbG93ZWQgYnkgMHgwMCBpcyBhbiBlc2NhcGVkIDB4ZmYuIDB4ZDAtMHhkNyBhcmUgUlNUCisgICAgICAvLyBtYXJrZXJzCisgICAgICB3aGlsZSAoZGF0YVtwb3NdICE9IDB4ZmYgfHwgZGF0YVtwb3MrMV0gPT0gMHgwMCB8fCAoZGF0YVtwb3MrMV0gPj0gMHhkMCAmJiBkYXRhW3BvcysxXSA8PSAweGQ3KSkgeworICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgaWYgKHBvcyA+PSBidWZmU2l6ZSkgcmV0dXJuIDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoaXMgaXMgb25lIG9mIHNldmVyYWwgcG9zc2libGUgbWFya2Vycy4gVGhlIG5leHQgdHdvIGJ5dGVzIGFyZSBhIDE2LWJpdAorICAgICAgLy8gYmlnLWVuZGlhbiBpbnQgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZSBtYXJrZXIgaGVhZGVyLCBza2lwIHRoYXQgdGhlbgorICAgICAgLy8gY29udGludWUgc2VhcmNoaW5nCisgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gKCgodW5zaWduZWQgaW50KSAoZGF0YVtwb3MrMl0gJiAweGZmKSkgPDwgOCB8ICgodW5zaWduZWQgaW50KSBkYXRhW3BvcyszXSAmIDB4ZmYpKTsKKyAgICAgIHBvcyArPSBsZW4gKyAyOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitVU0JDYW1lcmE6OlVTQkNhbWVyYShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVzZUpwZWcpIDoKKyAgbV9pZCgwKSwKKyAgbV9uYW1lKG5hbWUpLAorICBtX3VzZUpwZWcodXNlSnBlZyksCisgIG1fYWN0aXZlKGZhbHNlKSwKKyAgbV9vcGVuKGZhbHNlKSwKKyAgbV9tdXRleCgpLAorICBtX3dpZHRoKDMyMCksCisgIG1faGVpZ2h0KDI0MCksCisgIG1fZnBzKDMwKSwKKyAgbV93aGl0ZUJhbGFuY2UoQVVUTyksCisgIG1fd2hpdGVCYWxhbmNlVmFsdWUoMCksCisgIG1fd2hpdGVCYWxhbmNlVmFsdWVQcmVzZW50KGZhbHNlKSwKKyAgbV9leHBvc3VyZShNQU5VQUwpLAorICBtX2V4cG9zdXJlVmFsdWUoNTApLAorICBtX2V4cG9zdXJlVmFsdWVQcmVzZW50KGZhbHNlKSwKKyAgbV9icmlnaHRuZXNzKDgwKSwKKyAgbV9uZWVkU2V0dGluZ3NVcGRhdGUodHJ1ZSkgeworfQorCit2b2lkIFVTQkNhbWVyYTo6T3BlbkNhbWVyYSgpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICB1SW50MzIgaWQgPSAwOworICAgIC8vIENhbid0IHVzZSBTQUZFX0lNQVFfQ0FMTCBoZXJlIGJlY2F1c2Ugd2Ugb25seSBlcnJvciBvbiB0aGUgdGhpcmQgdGltZQorICAgIElNQVFkeEVycm9yIGVycm9yID0gSU1BUWR4T3BlbkNhbWVyYShtX25hbWUuY19zdHIoKSwgSU1BUWR4Q2FtZXJhQ29udHJvbE1vZGVDb250cm9sbGVyLCAmaWQpOworICAgIGlmIChlcnJvciAhPSBJTUFRZHhFcnJvclN1Y2Nlc3MpIHsKKyAgICAgIC8vIE9ubHkgZXJyb3Igb24gdGhlIDNyZCB0cnkKKyAgICAgIGlmIChpID49IDIpCisgICAgICAgIHdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChlcnJvciwgIklNQVFkeE9wZW5DYW1lcmEiKTsKKyAgICAgIC8vIFNsZWVwIGZvciBhIGZldyBzZWNvbmRzIHRvIGVuc3VyZSB0aGUgZXJyb3IgaGFzIGJlZW4gZGVhbHQgd2l0aAorICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwMCkpOworICAgIH0gZWxzZSB7CisgICAgICBtX2lkID0gaWQ7CisgICAgICBtX29wZW4gPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCit2b2lkIFVTQkNhbWVyYTo6Q2xvc2VDYW1lcmEoKSB7CisgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIGlmICghbV9vcGVuKSByZXR1cm47CisgIFNBRkVfSU1BUV9DQUxMKElNQVFkeENsb3NlQ2FtZXJhLCBtX2lkKTsKKyAgbV9pZCA9IDA7CisgIG1fb3BlbiA9IGZhbHNlOworfQorCit2b2lkIFVTQkNhbWVyYTo6U3RhcnRDYXB0dXJlKCkgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBpZiAoIW1fb3BlbiB8fCBtX2FjdGl2ZSkgcmV0dXJuOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhDb25maWd1cmVHcmFiLCBtX2lkKTsKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U3RhcnRBY3F1aXNpdGlvbiwgbV9pZCk7CisgIG1fYWN0aXZlID0gdHJ1ZTsKK30KKwordm9pZCBVU0JDYW1lcmE6OlN0b3BDYXB0dXJlKCkgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBpZiAoIW1fb3BlbiB8fCAhbV9hY3RpdmUpIHJldHVybjsKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U3RvcEFjcXVpc2l0aW9uLCBtX2lkKTsKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4VW5jb25maWd1cmVBY3F1aXNpdGlvbiwgbV9pZCk7CisgIG1fYWN0aXZlID0gZmFsc2U7Cit9CisKK3ZvaWQgVVNCQ2FtZXJhOjpVcGRhdGVTZXR0aW5ncygpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgYm9vbCB3YXNBY3RpdmUgPSBtX2FjdGl2ZTsKKworICBpZiAod2FzQWN0aXZlKQorICAgIFN0b3BDYXB0dXJlKCk7CisgIGlmIChtX29wZW4pCisgICAgQ2xvc2VDYW1lcmEoKTsKKyAgT3BlbkNhbWVyYSgpOworCisgIHVJbnQzMiBjb3VudCA9IDA7CisgIHVJbnQzMiBjdXJyZW50TW9kZSA9IDA7CisgIFNBRkVfSU1BUV9DQUxMKElNQVFkeEVudW1lcmF0ZVZpZGVvTW9kZXMsIG1faWQsIE5VTEwsICZjb3VudCwgJmN1cnJlbnRNb2RlKTsKKyAgSU1BUWR4VmlkZW9Nb2RlIG1vZGVzW2NvdW50XTsKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4RW51bWVyYXRlVmlkZW9Nb2RlcywgbV9pZCwgbW9kZXMsICZjb3VudCwgJmN1cnJlbnRNb2RlKTsKKworICAvLyBHcm91cHMgYXJlOgorICAvLyAgIDAgLSB3aWR0aAorICAvLyAgIDEgLSBoZWlnaHQKKyAgLy8gICAyIC0gZm9ybWF0CisgIC8vICAgMyAtIGZwcworICBzdGQ6OnJlZ2V4IHJlTW9kZSgiKFswLTldKylcXHMqeFxccyooWzAtOV0rKVxccysoLio/KVxccysoWzAtOS5dKylcXHMqZnBzIik7CisgIElNQVFkeFZpZGVvTW9kZSogZm91bmRNb2RlID0gbnVsbHB0cjsKKyAgSU1BUWR4VmlkZW9Nb2RlKiBjdXJyZW50TW9kZVB0ciA9ICZtb2Rlc1tjdXJyZW50TW9kZV07CisgIGRvdWJsZSBmb3VuZEZwcyA9IDEwMDAuMDsKKworICAvLyBMb29wIHRocm91Z2ggdGhlIG1vZGVzLCBhbmQgZmluZCB0aGUgbWF0Y2ggd2l0aCB0aGUgbG93ZXN0IGZwcworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBzdGQ6OmNtYXRjaCBtOworICAgIGlmICghc3RkOjpyZWdleF9tYXRjaChtb2Rlc1tpXS5OYW1lLCBtLCByZU1vZGUpKQorICAgICAgY29udGludWU7CisgICAgdW5zaWduZWQgaW50IHdpZHRoID0gKHVuc2lnbmVkIGludCkgc3RkOjpzdG91bChtWzFdLnN0cigpKTsKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gKHVuc2lnbmVkIGludCkgc3RkOjpzdG91bChtWzJdLnN0cigpKTsKKyAgICBpZiAod2lkdGggIT0gbV93aWR0aCkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChoZWlnaHQgIT0gbV9oZWlnaHQpCisgICAgICBjb250aW51ZTsKKyAgICBkb3VibGUgZnBzID0gYXRvZihtWzRdLnN0cigpLmNfc3RyKCkpOworICAgIGlmIChmcHMgPCBtX2ZwcykKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChmcHMgPiBmb3VuZEZwcykKKyAgICAgIGNvbnRpbnVlOworICAgIGJvb2wgaXNKcGVnID0gbVszXS5zdHIoKS5jb21wYXJlKCJqcGVnIikgPT0gMCB8fCBtWzNdLnN0cigpLmNvbXBhcmUoIkpQRUciKSA9PSAwOworICAgIGlmICgobV91c2VKcGVnICYmICFpc0pwZWcpIHx8ICghbV91c2VKcGVnICYmIGlzSnBlZykpCisgICAgICBjb250aW51ZTsKKyAgICBmb3VuZE1vZGUgPSAmbW9kZXNbaV07CisgICAgZm91bmRGcHMgPSBmcHM7CisgIH0KKyAgaWYgKGZvdW5kTW9kZSAhPSBudWxscHRyKSB7CisgICAgaWYgKGZvdW5kTW9kZS0+VmFsdWUgIT0gY3VycmVudE1vZGVQdHItPlZhbHVlKSB7CisgICAgICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhTZXRBdHRyaWJ1dGUsIG1faWQsIElNQVFkeEF0dHJpYnV0ZVZpZGVvTW9kZSwgSU1BUWR4VmFsdWVUeXBlVTMyLCBmb3VuZE1vZGUtPlZhbHVlKTsKKyAgICB9CisgIH0gCisKKyAgaWYgKG1fd2hpdGVCYWxhbmNlLmNvbXBhcmUoQVVUTykgPT0gMCkgeworICAgIFNBRkVfSU1BUV9DQUxMKElNQVFkeFNldEF0dHJpYnV0ZSwgbV9pZCwgQVRUUl9XQl9NT0RFLCBJTUFRZHhWYWx1ZVR5cGVTdHJpbmcsIEFVVE8uY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U2V0QXR0cmlidXRlLCBtX2lkLCBBVFRSX1dCX01PREUsIElNQVFkeFZhbHVlVHlwZVN0cmluZywgTUFOVUFMLmNfc3RyKCkpOworICAgIGlmIChtX3doaXRlQmFsYW5jZVZhbHVlUHJlc2VudCkKKyAgICAgIFNBRkVfSU1BUV9DQUxMKElNQVFkeFNldEF0dHJpYnV0ZSwgbV9pZCwgQVRUUl9XQl9WQUxVRSwgSU1BUWR4VmFsdWVUeXBlVTMyLCBtX3doaXRlQmFsYW5jZVZhbHVlKTsKKyAgfQorCisgIGlmIChtX2V4cG9zdXJlLmNvbXBhcmUoQVVUTykgPT0gMCkgeworICAgIFNBRkVfSU1BUV9DQUxMKElNQVFkeFNldEF0dHJpYnV0ZSwgbV9pZCwgQVRUUl9FWF9NT0RFLCBJTUFRZHhWYWx1ZVR5cGVTdHJpbmcsIHN0ZDo6c3RyaW5nKCJBdXRvQXBlcmF0dXJlUHJpb3JpdHkiKS5jX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhTZXRBdHRyaWJ1dGUsIG1faWQsIEFUVFJfRVhfTU9ERSwgSU1BUWR4VmFsdWVUeXBlU3RyaW5nLCBNQU5VQUwuY19zdHIoKSk7CisgICAgaWYgKG1fZXhwb3N1cmVWYWx1ZVByZXNlbnQpIHsKKyAgICAgIGRvdWJsZSBtaW52ID0gMC4wOworICAgICAgZG91YmxlIG1heHYgPSAwLjA7CisgICAgICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhHZXRBdHRyaWJ1dGVNaW5pbXVtLCBtX2lkLCBBVFRSX0VYX1ZBTFVFLCBJTUFRZHhWYWx1ZVR5cGVGNjQsICZtaW52KTsKKyAgICAgIFNBRkVfSU1BUV9DQUxMKElNQVFkeEdldEF0dHJpYnV0ZU1heGltdW0sIG1faWQsIEFUVFJfRVhfVkFMVUUsIElNQVFkeFZhbHVlVHlwZUY2NCwgJm1heHYpOworICAgICAgZG91YmxlIHZhbCA9IG1pbnYgKyAoKG1heHYgLSBtaW52KSAqICgoZG91YmxlKSBtX2V4cG9zdXJlVmFsdWUgLyAxMDAuMCkpOworICAgICAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U2V0QXR0cmlidXRlLCBtX2lkLCBBVFRSX0VYX1ZBTFVFLCBJTUFRZHhWYWx1ZVR5cGVGNjQsIHZhbCk7CisgICAgfQorICB9CisKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U2V0QXR0cmlidXRlLCBtX2lkLCBBVFRSX0JSX01PREUsIElNQVFkeFZhbHVlVHlwZVN0cmluZywgTUFOVUFMLmNfc3RyKCkpOworICBkb3VibGUgbWludiA9IDAuMDsKKyAgZG91YmxlIG1heHYgPSAwLjA7CisgIFNBRkVfSU1BUV9DQUxMKElNQVFkeEdldEF0dHJpYnV0ZU1pbmltdW0sIG1faWQsIEFUVFJfQlJfVkFMVUUsIElNQVFkeFZhbHVlVHlwZUY2NCwgJm1pbnYpOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhHZXRBdHRyaWJ1dGVNYXhpbXVtLCBtX2lkLCBBVFRSX0JSX1ZBTFVFLCBJTUFRZHhWYWx1ZVR5cGVGNjQsICZtYXh2KTsKKyAgZG91YmxlIHZhbCA9IG1pbnYgKyAoKG1heHYgLSBtaW52KSAqICgoZG91YmxlKSBtX2JyaWdodG5lc3MgLyAxMDAuMCkpOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhTZXRBdHRyaWJ1dGUsIG1faWQsIEFUVFJfQlJfVkFMVUUsIElNQVFkeFZhbHVlVHlwZUY2NCwgdmFsKTsKKworICBpZiAod2FzQWN0aXZlKQorICAgIFN0YXJ0Q2FwdHVyZSgpOworfQorCit2b2lkIFVTQkNhbWVyYTo6U2V0RlBTKGRvdWJsZSBmcHMpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgaWYgKG1fZnBzICE9IGZwcykgeworICAgIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gdHJ1ZTsKKyAgICBtX2ZwcyA9IGZwczsKKyAgfQorfQorCit2b2lkIFVTQkNhbWVyYTo6U2V0U2l6ZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgaWYgKG1fd2lkdGggIT0gd2lkdGggfHwgbV9oZWlnaHQgIT0gaGVpZ2h0KSB7CisgICAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSB0cnVlOworICAgIG1fd2lkdGggPSB3aWR0aDsKKyAgICBtX2hlaWdodCA9IGhlaWdodDsKKyAgfQorfQorCit2b2lkIFVTQkNhbWVyYTo6U2V0QnJpZ2h0bmVzcyh1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzcykgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBpZiAobV9icmlnaHRuZXNzICE9IGJyaWdodG5lc3MpIHsKKyAgICBtX25lZWRTZXR0aW5nc1VwZGF0ZSA9IHRydWU7CisgICAgbV9icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKyAgfQorfQorCit1bnNpZ25lZCBpbnQgVVNCQ2FtZXJhOjpHZXRCcmlnaHRuZXNzKCkgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICByZXR1cm4gbV9icmlnaHRuZXNzOworfQorCit2b2lkIFVTQkNhbWVyYTo6U2V0V2hpdGVCYWxhbmNlQXV0bygpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgbV93aGl0ZUJhbGFuY2UgPSBBVVRPOworICBtX3doaXRlQmFsYW5jZVZhbHVlID0gMDsKKyAgbV93aGl0ZUJhbGFuY2VWYWx1ZVByZXNlbnQgPSBmYWxzZTsKKyAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSB0cnVlOworfQorCit2b2lkIFVTQkNhbWVyYTo6U2V0V2hpdGVCYWxhbmNlSG9sZEN1cnJlbnQoKSB7CisgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIG1fd2hpdGVCYWxhbmNlID0gTUFOVUFMOworICBtX3doaXRlQmFsYW5jZVZhbHVlID0gMDsKKyAgbV93aGl0ZUJhbGFuY2VWYWx1ZVByZXNlbnQgPSBmYWxzZTsKKyAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSB0cnVlOworfQorCit2b2lkIFVTQkNhbWVyYTo6U2V0V2hpdGVCYWxhbmNlTWFudWFsKHVuc2lnbmVkIGludCB3aGl0ZUJhbGFuY2UpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgbV93aGl0ZUJhbGFuY2UgPSBNQU5VQUw7CisgIG1fd2hpdGVCYWxhbmNlVmFsdWUgPSB3aGl0ZUJhbGFuY2U7CisgIG1fd2hpdGVCYWxhbmNlVmFsdWVQcmVzZW50ID0gdHJ1ZTsKKyAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSB0cnVlOworfQorCit2b2lkIFVTQkNhbWVyYTo6U2V0RXhwb3N1cmVBdXRvKCkgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBtX2V4cG9zdXJlID0gQVVUTzsKKyAgbV9leHBvc3VyZVZhbHVlID0gMDsKKyAgbV9leHBvc3VyZVZhbHVlUHJlc2VudCA9IGZhbHNlOworICBtX25lZWRTZXR0aW5nc1VwZGF0ZSA9IHRydWU7Cit9CisKK3ZvaWQgVVNCQ2FtZXJhOjpTZXRFeHBvc3VyZUhvbGRDdXJyZW50KCkgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBtX2V4cG9zdXJlID0gTUFOVUFMOworICBtX2V4cG9zdXJlVmFsdWUgPSAwOworICBtX2V4cG9zdXJlVmFsdWVQcmVzZW50ID0gZmFsc2U7CisgIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZCBVU0JDYW1lcmE6OlNldEV4cG9zdXJlTWFudWFsKHVuc2lnbmVkIGludCBsZXZlbCkgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBtX2V4cG9zdXJlID0gTUFOVUFMOworICBpZiAobGV2ZWwgPiAxMDApIG1fZXhwb3N1cmVWYWx1ZSA9IDEwMDsKKyAgZWxzZSBtX2V4cG9zdXJlVmFsdWUgPSBsZXZlbDsKKyAgbV9leHBvc3VyZVZhbHVlUHJlc2VudCA9IHRydWU7CisgIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZCBVU0JDYW1lcmE6OkdldEltYWdlKEltYWdlKiBpbWFnZSkgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBpZiAobV9uZWVkU2V0dGluZ3NVcGRhdGUgfHwgbV91c2VKcGVnKSB7CisgICAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSBmYWxzZTsKKyAgICBtX3VzZUpwZWcgPSBmYWxzZTsKKyAgICBVcGRhdGVTZXR0aW5ncygpOworICB9CisgIC8vIEJ1Zk51bSBpcyBub3QgYWN0dWFsbHkgdXNlZCBmb3IgYW55dGhpbmcgYXQgb3VyIGxldmVsLCBzaW5jZSB3ZSBhcmUKKyAgLy8gd2FpdGluZyB1bnRpbCB0aGUgbmV4dCBpbWFnZSBpcyByZWFkeSBhbnl3YXkKKyAgdUludDMyIGJ1Zk51bTsKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4R3JhYiwgbV9pZCwgaW1hZ2UsIDEsICZidWZOdW0pOworfQorCit1bnNpZ25lZCBpbnQgVVNCQ2FtZXJhOjpHZXRJbWFnZURhdGEodm9pZCogYnVmZmVyLCB1bnNpZ25lZCBpbnQgYnVmZmVyU2l6ZSkgeworICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBpZiAobV9uZWVkU2V0dGluZ3NVcGRhdGUgfHwgIW1fdXNlSnBlZykgeworICAgIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gZmFsc2U7CisgICAgbV91c2VKcGVnID0gdHJ1ZTsKKyAgICBVcGRhdGVTZXR0aW5ncygpOworICB9CisgIC8vIEJ1Zk51bSBpcyBub3QgYWN0dWFsbHkgdXNlZCBmb3IgYW55dGhpbmcgYXQgb3VyIGxldmVsCisgIHVJbnQzMiBidWZOdW07CisgIFNBRkVfSU1BUV9DQUxMKElNQVFkeEdldEltYWdlRGF0YSwgbV9pZCwgYnVmZmVyLCBidWZmZXJTaXplLCBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlTGFzdCwgMCwgJmJ1Zk51bSk7CisgIHJldHVybiBHZXRKcGVnU2l6ZShidWZmZXIsIGJ1ZmZlclNpemUpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9VbHRyYXNvbmljLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVWx0cmFzb25pYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5ZmY3YwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVWx0cmFzb25pYy5jcHAKQEAgLTAsMCArMSwzMDQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlVsdHJhc29uaWMuaCIKKworI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKKyNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCitjb25zdGV4cHIgZG91YmxlIFVsdHJhc29uaWM6OmtQaW5nVGltZTsJLy8vPCBUaW1lIChzZWMpIGZvciB0aGUgcGluZyB0cmlnZ2VyIHB1bHNlLgorY29uc3QgdWludDMyX3QgVWx0cmFzb25pYzo6a1ByaW9yaXR5OwkvLy88IFByaW9yaXR5IHRoYXQgdGhlIHVsdHJhc29uaWMgcm91bmQgcm9iaW4gdGFzayBydW5zLgorY29uc3RleHByIGRvdWJsZSBVbHRyYXNvbmljOjprTWF4VWx0cmFzb25pY1RpbWU7CS8vLzwgTWF4IHRpbWUgKG1zKSBiZXR3ZWVuIHJlYWRpbmdzLgorY29uc3RleHByIGRvdWJsZSBVbHRyYXNvbmljOjprU3BlZWRPZlNvdW5kSW5jaGVzUGVyU2VjOworVGFzayBVbHRyYXNvbmljOjptX3Rhc2soIlVsdHJhc29uaWNDaGVja2VyIiwgKEZVTkNQVFIpVWx0cmFzb25pY0NoZWNrZXIpOyAvLyB0YXNrIGRvaW5nIHRoZSByb3VuZC1yb2JpbiBhdXRvbWF0aWMgc2Vuc2luZworVWx0cmFzb25pYyAqVWx0cmFzb25pYzo6bV9maXJzdFNlbnNvciA9IE5VTEw7IC8vIGhlYWQgb2YgdGhlIHVsdHJhc29uaWMgc2Vuc29yIGxpc3QKK2Jvb2wgVWx0cmFzb25pYzo6bV9hdXRvbWF0aWNFbmFibGVkID0gZmFsc2U7IC8vIGF1dG9tYXRpYyByb3VuZCByb2JpbiBtb2RlCitTRU1BUEhPUkVfSUQgVWx0cmFzb25pYzo6bV9zZW1hcGhvcmUgPSAwOworCisvKioKKyAqIEJhY2tncm91bmQgdGFzayB0aGF0IGdvZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bHRyYXNvbmljIHNlbnNvcnMgYW5kIHBpbmdzIGVhY2ggb25lIGluIHR1cm4uIFRoZSBjb3VudGVyCisgKiBpcyBjb25maWd1cmVkIHRvIHJlYWQgdGhlIHRpbWluZyBvZiB0aGUgcmV0dXJuZWQgZWNobyBwdWxzZS4KKyAqCisgKiBEQU5HRVIgV0lMTCBST0JJTlNPTiwgREFOR0VSIFdJTEwgUk9CSU5TT046CisgKiBUaGlzIGNvZGUgcnVucyBhcyBhIHRhc2sgYW5kIGFzc3VtZXMgdGhhdCBub25lIG9mIHRoZSB1bHRyYXNvbmljIHNlbnNvcnMgd2lsbCBjaGFuZ2Ugd2hpbGUgaXQncworICogcnVubmluZy4gSWYgb25lIGRvZXMsIHRoZW4gdGhpcyB3aWxsIGNlcnRhaW5seSBicmVhay4gTWFrZSBzdXJlIHRvIGRpc2FibGUgYXV0b21hdGljIG1vZGUgYmVmb3JlIGNoYW5naW5nCisgKiBhbnl0aGluZyB3aXRoIHRoZSBzZW5zb3JzISEKKyAqLwordm9pZCBVbHRyYXNvbmljOjpVbHRyYXNvbmljQ2hlY2tlcigpCit7CisJVWx0cmFzb25pYyAqdSA9IE5VTEw7CisJd2hpbGUgKG1fYXV0b21hdGljRW5hYmxlZCkKKwl7CisJCWlmICh1ID09IE5VTEwpIHUgPSBtX2ZpcnN0U2Vuc29yOworCQlpZiAodSA9PSBOVUxMKSByZXR1cm47CisJCWlmICh1LT5Jc0VuYWJsZWQoKSkKKwkJCXUtPm1fcGluZ0NoYW5uZWwtPlB1bHNlKGtQaW5nVGltZSk7CS8vIGRvIHRoZSBwaW5nCisJCXUgPSB1LT5tX25leHRTZW5zb3I7CisJCVdhaXQoMC4xKTsJCQkJCQkJLy8gd2FpdCBmb3IgcGluZyB0byByZXR1cm4KKwl9Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgVWx0cmFzb25pYyBTZW5zb3IuCisgKiBUaGlzIGlzIHRoZSBjb21tb24gY29kZSB0aGF0IGluaXRpYWxpemVzIHRoZSB1bHRyYXNvbmljIHNlbnNvciBnaXZlbiB0aGF0IHRoZXJlCisgKiBhcmUgdHdvIGRpZ2l0YWwgSS9PIGNoYW5uZWxzIGFsbG9jYXRlZC4gSWYgdGhlIHN5c3RlbSB3YXMgcnVubmluZyBpbiBhdXRvbWF0aWMgbW9kZSAocm91bmQgcm9iaW4pCisgKiB3aGVuIHRoZSBuZXcgc2Vuc29yIGlzIGFkZGVkLCBpdCBpcyBzdG9wcGVkLCB0aGUgc2Vuc29yIGlzIGFkZGVkLCB0aGVuIGF1dG9tYXRpYyBtb2RlIGlzCisgKiByZXN0b3JlZC4KKyAqLwordm9pZCBVbHRyYXNvbmljOjpJbml0aWFsaXplKCkKK3sKKwlib29sIG9yaWdpbmFsTW9kZSA9IG1fYXV0b21hdGljRW5hYmxlZDsKKwlpZiAobV9zZW1hcGhvcmUgPT0gMCkgbV9zZW1hcGhvcmUgPSBpbml0aWFsaXplU2VtYXBob3JlKFNFTUFQSE9SRV9GVUxMKTsKKwlTZXRBdXRvbWF0aWNNb2RlKGZhbHNlKTsgLy8ga2lsbCB0YXNrIHdoZW4gYWRkaW5nIGEgbmV3IHNlbnNvcgorCXRha2VTZW1hcGhvcmUobV9zZW1hcGhvcmUpOyAvLyBsaW5rIHRoaXMgaW5zdGFuY2Ugb24gdGhlIGxpc3QKKwl7CisJCW1fbmV4dFNlbnNvciA9IG1fZmlyc3RTZW5zb3I7CisJCW1fZmlyc3RTZW5zb3IgPSB0aGlzOworCX0KKwlnaXZlU2VtYXBob3JlKG1fc2VtYXBob3JlKTsKKworCW1fY291bnRlciA9IG5ldyBDb3VudGVyKG1fZWNob0NoYW5uZWwpOyAvLyBzZXQgdXAgY291bnRlciBmb3IgdGhpcyBzZW5zb3IKKwltX2NvdW50ZXItPlNldE1heFBlcmlvZCgxLjApOworCW1fY291bnRlci0+U2V0U2VtaVBlcmlvZE1vZGUodHJ1ZSk7CisJbV9jb3VudGVyLT5SZXNldCgpOworCW1fZW5hYmxlZCA9IHRydWU7IC8vIG1ha2UgaXQgYXZhaWxhYmxlIGZvciByb3VuZCByb2JpbiBzY2hlZHVsaW5nCisJU2V0QXV0b21hdGljTW9kZShvcmlnaW5hbE1vZGUpOworCisJc3RhdGljIGludCBpbnN0YW5jZXMgPSAwOworCWluc3RhbmNlcysrOworCUhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9VbHRyYXNvbmljLCBpbnN0YW5jZXMpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgVWx0cmFzb25pYyBTZW5zb3IKKyAqIFRoaXMgaXMgZGVzaWduZWQgdG8gc3VwY2hhbm5lbCB0aGUgRGF2ZW50ZWNoIFNSRjA0IGFuZCBWZXggdWx0cmFzb25pYyBzZW5zb3JzLgorICogQHBhcmFtIHBpbmdDaGFubmVsIFRoZSBkaWdpdGFsIG91dHB1dCBjaGFubmVsIHRoYXQgc2VuZHMgdGhlIHB1bHNlIHRvIGluaXRpYXRlIHRoZSBzZW5zb3Igc2VuZGluZworICogdGhlIHBpbmcuCisgKiBAcGFyYW0gZWNob0NoYW5uZWwgVGhlIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbCB0aGF0IHJlY2VpdmVzIHRoZSBlY2hvLiBUaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUKKyAqIGVjaG8gaXMgaGlnaCByZXByZXNlbnRzIHRoZSByb3VuZCB0cmlwIHRpbWUgb2YgdGhlIHBpbmcsIGFuZCB0aGUgZGlzdGFuY2UuCisgKiBAcGFyYW0gdW5pdHMgVGhlIHVuaXRzIHJldHVybmVkIGluIGVpdGhlciBrSW5jaGVzIG9yIGtNaWxsaU1ldGVycworICovCitVbHRyYXNvbmljOjpVbHRyYXNvbmljKHVpbnQzMl90IHBpbmdDaGFubmVsLCB1aW50MzJfdCBlY2hvQ2hhbm5lbCwgRGlzdGFuY2VVbml0IHVuaXRzKQoreworCW1fcGluZ0NoYW5uZWwgPSBuZXcgRGlnaXRhbE91dHB1dChwaW5nQ2hhbm5lbCk7CisJbV9lY2hvQ2hhbm5lbCA9IG5ldyBEaWdpdGFsSW5wdXQoZWNob0NoYW5uZWwpOworCW1fYWxsb2NhdGVkQ2hhbm5lbHMgPSB0cnVlOworCW1fdW5pdHMgPSB1bml0czsKKwlJbml0aWFsaXplKCk7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIFVsdHJhc29uaWMgU2Vuc29yIGZyb20gYSBEaWdpdGFsSW5wdXQgZm9yIHRoZSBlY2hvIGNoYW5uZWwgYW5kIGEgRGlnaXRhbE91dHB1dAorICogZm9yIHRoZSBwaW5nIGNoYW5uZWwuCisgKiBAcGFyYW0gcGluZ0NoYW5uZWwgVGhlIGRpZ2l0YWwgb3V0cHV0IG9iamVjdCB0aGF0IHN0YXJ0cyB0aGUgc2Vuc29yIGRvaW5nIGEgcGluZy4gUmVxdWlyZXMgYSAxMHVTIHB1bHNlIHRvIHN0YXJ0LgorICogQHBhcmFtIGVjaG9DaGFubmVsIFRoZSBkaWdpdGFsIGlucHV0IG9iamVjdCB0aGF0IHRpbWVzIHRoZSByZXR1cm4gcHVsc2UgdG8gZGV0ZXJtaW5lIHRoZSByYW5nZS4KKyAqIEBwYXJhbSB1bml0cyBUaGUgdW5pdHMgcmV0dXJuZWQgaW4gZWl0aGVyIGtJbmNoZXMgb3Iga01pbGxpTWV0ZXJzCisgKi8KK1VsdHJhc29uaWM6OlVsdHJhc29uaWMoRGlnaXRhbE91dHB1dCAqcGluZ0NoYW5uZWwsIERpZ2l0YWxJbnB1dCAqZWNob0NoYW5uZWwsIERpc3RhbmNlVW5pdCB1bml0cykKK3sKKwlpZiAocGluZ0NoYW5uZWwgPT0gTlVMTCB8fCBlY2hvQ2hhbm5lbCA9PSBOVUxMKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworCQlyZXR1cm47CisJfQorCW1fYWxsb2NhdGVkQ2hhbm5lbHMgPSBmYWxzZTsKKwltX3BpbmdDaGFubmVsID0gcGluZ0NoYW5uZWw7CisJbV9lY2hvQ2hhbm5lbCA9IGVjaG9DaGFubmVsOworCW1fdW5pdHMgPSB1bml0czsKKwlJbml0aWFsaXplKCk7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIFVsdHJhc29uaWMgU2Vuc29yIGZyb20gYSBEaWdpdGFsSW5wdXQgZm9yIHRoZSBlY2hvIGNoYW5uZWwgYW5kIGEgRGlnaXRhbE91dHB1dAorICogZm9yIHRoZSBwaW5nIGNoYW5uZWwuCisgKiBAcGFyYW0gcGluZ0NoYW5uZWwgVGhlIGRpZ2l0YWwgb3V0cHV0IG9iamVjdCB0aGF0IHN0YXJ0cyB0aGUgc2Vuc29yIGRvaW5nIGEgcGluZy4gUmVxdWlyZXMgYSAxMHVTIHB1bHNlIHRvIHN0YXJ0LgorICogQHBhcmFtIGVjaG9DaGFubmVsIFRoZSBkaWdpdGFsIGlucHV0IG9iamVjdCB0aGF0IHRpbWVzIHRoZSByZXR1cm4gcHVsc2UgdG8gZGV0ZXJtaW5lIHRoZSByYW5nZS4KKyAqIEBwYXJhbSB1bml0cyBUaGUgdW5pdHMgcmV0dXJuZWQgaW4gZWl0aGVyIGtJbmNoZXMgb3Iga01pbGxpTWV0ZXJzCisgKi8KK1VsdHJhc29uaWM6OlVsdHJhc29uaWMoRGlnaXRhbE91dHB1dCAmcGluZ0NoYW5uZWwsIERpZ2l0YWxJbnB1dCAmZWNob0NoYW5uZWwsIERpc3RhbmNlVW5pdCB1bml0cykKK3sKKwltX2FsbG9jYXRlZENoYW5uZWxzID0gZmFsc2U7CisJbV9waW5nQ2hhbm5lbCA9ICZwaW5nQ2hhbm5lbDsKKwltX2VjaG9DaGFubmVsID0gJmVjaG9DaGFubmVsOworCW1fdW5pdHMgPSB1bml0czsKKwlJbml0aWFsaXplKCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3RvciBmb3IgdGhlIHVsdHJhc29uaWMgc2Vuc29yLgorICogRGVsZXRlIHRoZSBpbnN0YW5jZSBvZiB0aGUgdWx0cmFzb25pYyBzZW5zb3IgYnkgZnJlZWluZyB0aGUgYWxsb2NhdGVkIGRpZ2l0YWwgY2hhbm5lbHMuCisgKiBJZiB0aGUgc3lzdGVtIHdhcyBpbiBhdXRvbWF0aWMgbW9kZSAocm91bmQgcm9iaW4pLCB0aGVuIGl0IGlzIHN0b3BwZWQsIHRoZW4gc3RhcnRlZCBhZ2FpbgorICogYWZ0ZXIgdGhpcyBzZW5zb3IgaXMgcmVtb3ZlZCAocHJvdmlkZWQgdGhpcyB3YXNuJ3QgdGhlIGxhc3Qgc2Vuc29yKS4KKyAqLworVWx0cmFzb25pYzo6flVsdHJhc29uaWMoKQoreworCWJvb2wgd2FzQXV0b21hdGljTW9kZSA9IG1fYXV0b21hdGljRW5hYmxlZDsKKwlTZXRBdXRvbWF0aWNNb2RlKGZhbHNlKTsKKwlpZiAobV9hbGxvY2F0ZWRDaGFubmVscykKKwl7CisJCWRlbGV0ZSBtX3BpbmdDaGFubmVsOworCQlkZWxldGUgbV9lY2hvQ2hhbm5lbDsKKwl9CisJd3BpX2Fzc2VydChtX2ZpcnN0U2Vuc29yICE9IE5VTEwpOworCisJdGFrZVNlbWFwaG9yZShtX3NlbWFwaG9yZSk7CisJeworCQlpZiAodGhpcyA9PSBtX2ZpcnN0U2Vuc29yKQorCQl7CisJCQltX2ZpcnN0U2Vuc29yID0gbV9uZXh0U2Vuc29yOworCQkJaWYgKG1fZmlyc3RTZW5zb3IgPT0gTlVMTCkKKwkJCXsKKwkJCQlTZXRBdXRvbWF0aWNNb2RlKGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXdwaV9hc3NlcnQobV9maXJzdFNlbnNvci0+bV9uZXh0U2Vuc29yICE9IE5VTEwpOworCQkJZm9yIChVbHRyYXNvbmljICpzID0gbV9maXJzdFNlbnNvcjsgcyAhPSBOVUxMOyBzID0gcy0+bV9uZXh0U2Vuc29yKQorCQkJeworCQkJCWlmICh0aGlzID09IHMtPm1fbmV4dFNlbnNvcikKKwkJCQl7CisJCQkJCXMtPm1fbmV4dFNlbnNvciA9IHMtPm1fbmV4dFNlbnNvci0+bV9uZXh0U2Vuc29yOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZ2l2ZVNlbWFwaG9yZShtX3NlbWFwaG9yZSk7CisJaWYgKG1fZmlyc3RTZW5zb3IgIT0gTlVMTCAmJiB3YXNBdXRvbWF0aWNNb2RlKQorCQlTZXRBdXRvbWF0aWNNb2RlKHRydWUpOworfQorCisvKioKKyAqIFR1cm4gQXV0b21hdGljIG1vZGUgb24vb2ZmLgorICogV2hlbiBpbiBBdXRvbWF0aWMgbW9kZSwgYWxsIHNlbnNvcnMgd2lsbCBmaXJlIGluIHJvdW5kIHJvYmluLCB3YWl0aW5nIGEgc2V0CisgKiB0aW1lIGJldHdlZW4gZWFjaCBzZW5zb3IuCisgKiBAcGFyYW0gZW5hYmxpbmcgU2V0IHRvIHRydWUgaWYgcm91bmQgcm9iaW4gc2NoZWR1bGluZyBzaG91bGQgc3RhcnQgZm9yIGFsbCB0aGUgdWx0cmFzb25pYyBzZW5zb3JzLiBUaGlzCisgKiBzY2hlZHVsaW5nIG1ldGhvZCBhc3N1cmVzIHRoYXQgdGhlIHNlbnNvcnMgYXJlIG5vbi1pbnRlcmZlcmluZyBiZWNhdXNlIG5vIHR3byBzZW5zb3JzIGZpcmUgYXQgdGhlIHNhbWUgdGltZS4KKyAqIElmIGFub3RoZXIgc2NoZWR1bGluZyBhbGdvcml0aG0gaXMgcHJlZmZlcmVkLCBpdCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgcGluZ2luZyB0aGUgc2Vuc29ycyBtYW51YWxseSBhbmQgd2FpdGluZworICogZm9yIHRoZSByZXN1bHRzIHRvIGNvbWUgYmFjay4KKyAqLwordm9pZCBVbHRyYXNvbmljOjpTZXRBdXRvbWF0aWNNb2RlKGJvb2wgZW5hYmxpbmcpCit7CisJaWYgKGVuYWJsaW5nID09IG1fYXV0b21hdGljRW5hYmxlZCkKKwkJcmV0dXJuOyAvLyBpZ25vcmUgdGhlIGNhc2Ugb2Ygbm8gY2hhbmdlCisKKwltX2F1dG9tYXRpY0VuYWJsZWQgPSBlbmFibGluZzsKKwlpZiAoZW5hYmxpbmcpCisJeworCQkvLyBlbmFibGluZyBhdXRvbWF0aWMgbW9kZS4KKwkJLy8gQ2xlYXIgYWxsIHRoZSBjb3VudGVycyBzbyBubyBkYXRhIGlzIHZhbGlkCisJCWZvciAoVWx0cmFzb25pYyAqdSA9IG1fZmlyc3RTZW5zb3I7IHUgIT0gTlVMTDsgdSA9IHUtPm1fbmV4dFNlbnNvcikKKwkJeworCQkJdS0+bV9jb3VudGVyLT5SZXNldCgpOworCQl9CisJCS8vIFN0YXJ0IHJvdW5kIHJvYmluIHRhc2sKKwkJd3BpX2Fzc2VydChtX3Rhc2suVmVyaWZ5KCkgPT0gZmFsc2UpOwkvLyBzaG91bGQgYmUgZmFsc2Ugc2luY2Ugd2FzIHByZXZpb3VzbHkgZGlzYWJsZWQKKwkJbV90YXNrLlN0YXJ0KCk7CisJfQorCWVsc2UKKwl7CisJCS8vIGRpc2FibGluZyBhdXRvbWF0aWMgbW9kZS4gV2FpdCBmb3IgYmFja2dyb3VuZCB0YXNrIHRvIHN0b3AgcnVubmluZy4KKwkJd2hpbGUgKG1fdGFzay5WZXJpZnkoKSkKKwkJCVdhaXQoMC4xNSk7CS8vIGp1c3QgYSBsaXR0bGUgbG9uZ2VyIHRoYW4gdGhlIHBpbmcgdGltZSBmb3Igcm91bmQtcm9iaW4gdG8gc3RvcAorCisJCS8vIGNsZWFyIGFsbCB0aGUgY291bnRlcnMgKGRhdGEgbm93IGludmFsaWQpIHNpbmNlIGF1dG9tYXRpYyBtb2RlIGlzIHN0b3BwZWQKKwkJZm9yIChVbHRyYXNvbmljICp1ID0gbV9maXJzdFNlbnNvcjsgdSAhPSBOVUxMOyB1ID0gdS0+bV9uZXh0U2Vuc29yKQorCQl7CisJCQl1LT5tX2NvdW50ZXItPlJlc2V0KCk7CisJCX0KKwkJbV90YXNrLlN0b3AoKTsKKwl9Cit9CisKKy8qKgorICogU2luZ2xlIHBpbmcgdG8gdWx0cmFzb25pYyBzZW5zb3IuCisgKiBTZW5kIG91dCBhIHNpbmdsZSBwaW5nIHRvIHRoZSB1bHRyYXNvbmljIHNlbnNvci4gVGhpcyBvbmx5IHdvcmtzIGlmIGF1dG9tYXRpYyAocm91bmQgcm9iaW4pCisgKiBtb2RlIGlzIGRpc2FibGVkLiBBIHNpbmdsZSBwaW5nIGlzIHNlbnQgb3V0LCBhbmQgdGhlIGNvdW50ZXIgc2hvdWxkIGNvdW50IHRoZSBzZW1pLXBlcmlvZAorICogd2hlbiBpdCBjb21lcyBpbi4gVGhlIGNvdW50ZXIgaXMgcmVzZXQgdG8gbWFrZSB0aGUgY3VycmVudCB2YWx1ZSBpbnZhbGlkLgorICovCit2b2lkIFVsdHJhc29uaWM6OlBpbmcoKQoreworCXdwaV9hc3NlcnQoIW1fYXV0b21hdGljRW5hYmxlZCk7CisJbV9jb3VudGVyLT5SZXNldCgpOyAvLyByZXNldCB0aGUgY291bnRlciB0byB6ZXJvIChpbnZhbGlkIGRhdGEgbm93KQorCW1fcGluZ0NoYW5uZWwtPlB1bHNlKGtQaW5nVGltZSk7IC8vIGRvIHRoZSBwaW5nIHRvIHN0YXJ0IGdldHRpbmcgYSBzaW5nbGUgcmFuZ2UKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIHJhbmdlIG1lYXN1cmVtZW50LgorICogVGhlIHJhbmdlcyBhcmUgYWNjdW11bGF0ZWQgaW4gYSBjb3VudGVyIHRoYXQgd2lsbCBpbmNyZW1lbnQgb24gZWFjaCBlZGdlIG9mIHRoZSBlY2hvIChyZXR1cm4pCisgKiBzaWduYWwuIElmIHRoZSBjb3VudCBpcyBub3QgYXQgbGVhc3QgMiwgdGhlbiB0aGUgcmFuZ2UgaGFzIG5vdCB5ZXQgYmVlbiBtZWFzdXJlZCwgYW5kIGlzIGludmFsaWQuCisgKi8KK2Jvb2wgVWx0cmFzb25pYzo6SXNSYW5nZVZhbGlkKCkKK3sKKwlyZXR1cm4gbV9jb3VudGVyLT5HZXQoKSA+IDE7Cit9CisKKy8qKgorICogR2V0IHRoZSByYW5nZSBpbiBpbmNoZXMgZnJvbSB0aGUgdWx0cmFzb25pYyBzZW5zb3IuCisgKiBAcmV0dXJuIGRvdWJsZSBSYW5nZSBpbiBpbmNoZXMgb2YgdGhlIHRhcmdldCByZXR1cm5lZCBmcm9tIHRoZSB1bHRyYXNvbmljIHNlbnNvci4gSWYgdGhlcmUgaXMKKyAqIG5vIHZhbGlkIHZhbHVlIHlldCwgaS5lLiBhdCBsZWFzdCBvbmUgbWVhc3VyZW1lbnQgaGFzbid0IGNvbXBsZXRlZCwgdGhlbiByZXR1cm4gMC4KKyAqLworZG91YmxlIFVsdHJhc29uaWM6OkdldFJhbmdlSW5jaGVzKCkKK3sKKwlpZiAoSXNSYW5nZVZhbGlkKCkpCisJCXJldHVybiBtX2NvdW50ZXItPkdldFBlcmlvZCgpICoga1NwZWVkT2ZTb3VuZEluY2hlc1BlclNlYyAvIDIuMDsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCB0aGUgcmFuZ2UgaW4gbWlsbGltZXRlcnMgZnJvbSB0aGUgdWx0cmFzb25pYyBzZW5zb3IuCisgKiBAcmV0dXJuIGRvdWJsZSBSYW5nZSBpbiBtaWxsaW1ldGVycyBvZiB0aGUgdGFyZ2V0IHJldHVybmVkIGJ5IHRoZSB1bHRyYXNvbmljIHNlbnNvci4KKyAqIElmIHRoZXJlIGlzIG5vIHZhbGlkIHZhbHVlIHlldCwgaS5lLiBhdCBsZWFzdCBvbmUgbWVhc3VyZW1lbnQgaGFzbid0IGNvbXBsdGVkLCB0aGVuIHJldHVybiAwLgorICovCitkb3VibGUgVWx0cmFzb25pYzo6R2V0UmFuZ2VNTSgpCit7CisJcmV0dXJuIEdldFJhbmdlSW5jaGVzKCkgKiAyNS40OworfQorCisvKioKKyAqIEdldCB0aGUgcmFuZ2UgaW4gdGhlIGN1cnJlbnQgRGlzdGFuY2VVbml0IGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LgorICoKKyAqIEByZXR1cm4gVGhlIHJhbmdlIGluIERpc3RhbmNlVW5pdAorICovCitkb3VibGUgVWx0cmFzb25pYzo6UElER2V0KCkKK3sKKwlzd2l0Y2gobV91bml0cykKKwl7CisJY2FzZSBVbHRyYXNvbmljOjprSW5jaGVzOgorCQlyZXR1cm4gR2V0UmFuZ2VJbmNoZXMoKTsKKwljYXNlIFVsdHJhc29uaWM6OmtNaWxsaU1ldGVyczoKKwkJcmV0dXJuIEdldFJhbmdlTU0oKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMC4wOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIGN1cnJlbnQgRGlzdGFuY2VVbml0IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBQSURTb3VyY2UgYmFzZSBvYmplY3QuCisgKgorICogQHBhcmFtIHVuaXRzIFRoZSBEaXN0YW5jZVVuaXQgdGhhdCBzaG91bGQgYmUgdXNlZC4KKyAqLwordm9pZCBVbHRyYXNvbmljOjpTZXREaXN0YW5jZVVuaXRzKERpc3RhbmNlVW5pdCB1bml0cykKK3sKKwltX3VuaXRzID0gdW5pdHM7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IERpc3RhbmNlVW5pdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBQSURTb3VyY2UgYmFzZSBvYmplY3QuCisgKgorICogQHJldHVybiBUaGUgdHlwZSBvZiBEaXN0YW5jZVVuaXQgdGhhdCBpcyBiZWluZyB1c2VkLgorICovCitVbHRyYXNvbmljOjpEaXN0YW5jZVVuaXQgVWx0cmFzb25pYzo6R2V0RGlzdGFuY2VVbml0cygpCit7CisJcmV0dXJuIG1fdW5pdHM7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1V0aWxpdHkuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9VdGlsaXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQ0NzJiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9VdGlsaXR5LmNwcApAQCAtMCwwICsxLDI3MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiVGFzay5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxleGVjaW5mby5oPgorI2luY2x1ZGUgPGN4eGFiaS5oPgorI2luY2x1ZGUgIm5pdmlzaW9uLmgiCisKK3N0YXRpYyBib29sIHN1c3BlbmRPbkFzc2VydEVuYWJsZWQgPSBmYWxzZTsKKworLyoqCisgKiBFbmFibGUgc3VzcGVuZCBvbiBhc3NlcnQuCisgKiBJZiBlbmFibGVkLCB0aGUgdXNlciB0YXNrIHdpbGwgYmUgc3VzcGVuZGVkIHdoZW5ldmVyIGFuIGFzc2VydCBmYWlscy4gVGhpcworICogd2lsbCBhbGxvdyB0aGUgdXNlciB0byBhdHRhY2ggdG8gdGhlIHRhc2sgd2l0aCB0aGUgZGVidWdnZXIgYW5kIGV4YW1pbmUgdmFyaWFibGVzCisgKiBhcm91bmQgdGhlIGZhaWx1cmUuCisgKi8KK3ZvaWQgd3BpX3N1c3BlbmRPbkFzc2VydEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworCXN1c3BlbmRPbkFzc2VydEVuYWJsZWQgPSBlbmFibGVkOworfQorCisvKioKKyAqIEFzc2VydCBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoaXMgYWxsb3dzIGJyZWFrcG9pbnRzIHRvIGJlIHNldCBvbiBhbiBhc3NlcnQuCisgKiBUaGUgdXNlcnMgZG9uJ3QgY2FsbCB0aGlzLCBidXQgaW5zdGVhZCB1c2UgdGhlIHdwaV9hc3NlcnQgbWFjcm9zIGluIFV0aWxpdHkuaC4KKyAqLworYm9vbCB3cGlfYXNzZXJ0X2ltcGwoYm9vbCBjb25kaXRpb25WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbmRpdGlvblRleHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY05hbWUpCit7CisJaWYoIWNvbmRpdGlvblZhbHVlKQorCXsKKwkJc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3JTdHJlYW07CisKKwkJZXJyb3JTdHJlYW0gPDwgIkFzc2VydGlvbiBcIiIgPDwgY29uZGl0aW9uVGV4dCA8PCAiXCIgIjsKKwkJZXJyb3JTdHJlYW0gPDwgIm9uIGxpbmUgIiA8PCBsaW5lTnVtYmVyIDw8ICIgIjsKKwkJZXJyb3JTdHJlYW0gPDwgIm9mICI8PCBiYXNlbmFtZShmaWxlTmFtZSkgPDwgIiAiOworCisJCWlmKG1lc3NhZ2UpCisJCXsKKwkJCWVycm9yU3RyZWFtIDw8ICJmYWlsZWQ6ICIgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZQorCQl7CisJCQllcnJvclN0cmVhbSA8PCAiZmFpbGVkLiIgPDwgc3RkOjplbmRsOworCQl9CisKKwkJZXJyb3JTdHJlYW0gPDwgR2V0U3RhY2tUcmFjZSgyKTsKKworCQlzdGQ6OnN0cmluZyBlcnJvciA9IGVycm9yU3RyZWFtLnN0cigpOworCisJCS8vIFByaW50IHRoZSBlcnJvciBhbmQgc2VuZCBpdCB0byB0aGUgRHJpdmVyU3RhdGlvbgorCQlzdGQ6OmNvdXQgPDwgZXJyb3IgPDwgc3RkOjplbmRsOworCQlIQUxTZXRFcnJvckRhdGEoZXJyb3IuY19zdHIoKSwgZXJyb3Iuc2l6ZSgpLCAxMDApOworCisJCWlmIChzdXNwZW5kT25Bc3NlcnRFbmFibGVkKSBzdXNwZW5kVGFzaygwKTsKKwl9CisKKwlyZXR1cm4gY29uZGl0aW9uVmFsdWU7Cit9CisKKy8qKgorICogQ29tbW9uIGVycm9yIHJvdXRpbmVzIGZvciB3cGlfYXNzZXJ0RXF1YWxfaW1wbCBhbmQgd3BpX2Fzc2VydE5vdEVxdWFsX2ltcGwKKyAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHk7IGl0IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgd3BpX2Fzc2VydEVxdWFsX2ltcGwKKyAqIGFuZCB3cGlfYXNzZXJ0Tm90RXF1YWxfaW1wbC4KKyAqLwordm9pZCB3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwoY29uc3QgY2hhciAqdmFsdWVBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXF1YWxpdHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKQoreworCXN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yU3RyZWFtOworCisJZXJyb3JTdHJlYW0gPDwgIkFzc2VydGlvbiBcIiIgPDwgdmFsdWVBIDw8ICIgIiA8PCBlcXVhbGl0eVR5cGUgPDwgIiAiIDw8IHZhbHVlQiA8PCAiXCIgIjsKKwllcnJvclN0cmVhbSA8PCAib24gbGluZSAiIDw8IGxpbmVOdW1iZXIgPDwgIiAiOworCWVycm9yU3RyZWFtIDw8ICJvZiAiPDwgYmFzZW5hbWUoZmlsZU5hbWUpIDw8ICIgIjsKKworCWlmKG1lc3NhZ2UpCisJeworCQllcnJvclN0cmVhbSA8PCAiZmFpbGVkOiAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOworCX0KKwllbHNlCisJeworCQllcnJvclN0cmVhbSA8PCAiZmFpbGVkLiIgPDwgc3RkOjplbmRsOworCX0KKworCWVycm9yU3RyZWFtIDw8IEdldFN0YWNrVHJhY2UoMyk7CisKKwlzdGQ6OnN0cmluZyBlcnJvciA9IGVycm9yU3RyZWFtLnN0cigpOworCisJLy8gUHJpbnQgdGhlIGVycm9yIGFuZCBzZW5kIGl0IHRvIHRoZSBEcml2ZXJTdGF0aW9uCisJc3RkOjpjb3V0IDw8IGVycm9yIDw8IHN0ZDo6ZW5kbDsKKwlIQUxTZXRFcnJvckRhdGEoZXJyb3IuY19zdHIoKSwgZXJyb3Iuc2l6ZSgpLCAxMDApOworCisJaWYgKHN1c3BlbmRPbkFzc2VydEVuYWJsZWQpIHN1c3BlbmRUYXNrKDApOworfQorCisvKioKKyAqIEFzc2VydCBlcXVhbCBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0d28gZ2l2ZW4gaW50ZWdlcnMgYXJlIGVxdWFsLiBJZiBub3QsCisgKiB0aGUgdmFsdWUgb2YgZWFjaCBpcyBwcmludGVkIGFsb25nIHdpdGggYW4gb3B0aW9uYWwgbWVzc2FnZSBzdHJpbmcuCisgKiBUaGUgdXNlcnMgZG9uJ3QgY2FsbCB0aGlzLCBidXQgaW5zdGVhZCB1c2UgdGhlIHdwaV9hc3NlcnRFcXVhbCBtYWNyb3MgaW4gVXRpbGl0eS5oLgorICovCitib29sIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGludCB2YWx1ZUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY05hbWUpCit7CisJaWYoISh2YWx1ZUEgPT0gdmFsdWVCKSkKKwl7CisJCXdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbCh2YWx1ZUFTdHJpbmcsIHZhbHVlQlN0cmluZywKKwkJCSI9PSIsIG1lc3NhZ2UsIGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBmdW5jTmFtZSk7CisJfQorCXJldHVybiB2YWx1ZUEgPT0gdmFsdWVCOworfQorCisvKioKKyAqIEFzc2VydCBub3QgZXF1YWwgaW1wbGVtZW50YXRpb24uCisgKiBUaGlzIGRldGVybWluZXMgd2hldGhlciB0aGUgdHdvIGdpdmVuIGludGVnZXJzIGFyZSBlcXVhbC4gSWYgc28sCisgKiB0aGUgdmFsdWUgb2YgZWFjaCBpcyBwcmludGVkIGFsb25nIHdpdGggYW4gb3B0aW9uYWwgbWVzc2FnZSBzdHJpbmcuCisgKiBUaGUgdXNlcnMgZG9uJ3QgY2FsbCB0aGlzLCBidXQgaW5zdGVhZCB1c2UgdGhlIHdwaV9hc3NlcnROb3RFcXVhbCBtYWNyb3MgaW4gVXRpbGl0eS5oLgorICovCitib29sIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGludCB2YWx1ZUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY05hbWUpCit7CisJaWYoISh2YWx1ZUEgIT0gdmFsdWVCKSkKKwl7CisJCXdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbCh2YWx1ZUFTdHJpbmcsIHZhbHVlQlN0cmluZywKKwkJCSIhPSIsIG1lc3NhZ2UsIGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBmdW5jTmFtZSk7CisJfQorCXJldHVybiB2YWx1ZUEgIT0gdmFsdWVCOworfQorCisKKy8qKgorICogUmV0dXJuIHRoZSBGUEdBIFZlcnNpb24gbnVtYmVyLgorICogRm9yIG5vdywgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGV0aXRpb24geWVhci4KKyAqIEByZXR1cm4gRlBHQSBWZXJzaW9uIG51bWJlci4KKyAqLwordWludDE2X3QgR2V0RlBHQVZlcnNpb24oKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MTZfdCB2ZXJzaW9uID0gZ2V0RlBHQVZlcnNpb24oJnN0YXR1cyk7CisJd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisJcmV0dXJuIHZlcnNpb247Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBGUEdBIFJldmlzaW9uIG51bWJlci4KKyAqIFRoZSBmb3JtYXQgb2YgdGhlIHJldmlzaW9uIGlzIDMgbnVtYmVycy4KKyAqIFRoZSAxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBNYWpvciBSZXZpc2lvbi4KKyAqIHRoZSBuZXh0IDggYml0cyBhcmUgdGhlIE1pbm9yIFJldmlzaW9uLgorICogVGhlIDEyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBCdWlsZCBOdW1iZXIuCisgKiBAcmV0dXJuIEZQR0EgUmV2aXNpb24gbnVtYmVyLgorICovCit1aW50MzJfdCBHZXRGUEdBUmV2aXNpb24oKQoreworCWludDMyX3Qgc3RhdHVzID0gMDsKKwl1aW50MzJfdCByZXZpc2lvbiA9IGdldEZQR0FSZXZpc2lvbigmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKwlyZXR1cm4gcmV2aXNpb247Cit9CisKKy8qKgorICogUmVhZCB0aGUgbWljcm9zZWNvbmQtcmVzb2x1dGlvbiB0aW1lciBvbiB0aGUgRlBHQS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRpbWUgaW4gbWljcm9zZWNvbmRzIGFjY29yZGluZyB0byB0aGUgRlBHQSAoc2luY2UgRlBHQSByZXNldCkuCisgKi8KK3VpbnQzMl90IEdldEZQR0FUaW1lKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisJdWludDMyX3QgdGltZSA9IGdldEZQR0FUaW1lKCZzdGF0dXMpOworCXdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCXJldHVybiB0aW1lOworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdGUgb2YgdGhlICJVU0VSIiBidXR0b24gb24gdGhlIFJvYm9SSU8KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYnV0dG9uIGlzIGN1cnJlbnRseSBwcmVzc2VkIGRvd24KKyAqLworYm9vbCBHZXRVc2VyQnV0dG9uKCkKK3sKKwlpbnQzMl90IHN0YXR1cyA9IDA7CisKKwlib29sIHZhbHVlID0gZ2V0RlBHQUJ1dHRvbigmc3RhdHVzKTsKKwl3cGlfc2V0R2xvYmFsRXJyb3Ioc3RhdHVzKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBEZW1hbmdsZSBhIEMrKyBzeW1ib2wsIHVzZWQgZm9yIHByaW50aW5nIHN0YWNrIHRyYWNlcy4KKyAqLworc3RhdGljIHN0ZDo6c3RyaW5nIGRlbWFuZ2xlKGNoYXIgY29uc3QgKm1hbmdsZWRTeW1ib2wpCit7CisJY2hhciBidWZmZXJbMjU2XTsKKwlzaXplX3QgbGVuZ3RoOworCWludCBzdGF0dXM7CisKKworCWlmKHNzY2FuZihtYW5nbGVkU3ltYm9sLCAiJSpbXihdJSpbKF0lMjU1W14pK10iLCBidWZmZXIpKQorCXsKKwkJY2hhciAqc3ltYm9sID0gYWJpOjpfX2N4YV9kZW1hbmdsZShidWZmZXIsIE5VTEwsICZsZW5ndGgsICZzdGF0dXMpOworCQlpZihzdGF0dXMgPT0gMCkKKwkJeworCQkJcmV0dXJuIHN5bWJvbDsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIElmIHRoZSBzeW1ib2wgY291bGRuJ3QgYmUgZGVtYW5nbGVkLCBpdCdzIHByb2JhYmx5IGEgQyBmdW5jdGlvbiwKKwkJCS8vIHNvIGp1c3QgcmV0dXJuIGl0IGFzLWlzLgorCQkJcmV0dXJuIGJ1ZmZlcjsKKwkJfQorCX0KKworCS8vIElmIGV2ZXJ5dGhpbmcgZWxzZSBmYWlsZWQsIGp1c3QgcmV0dXJuIHRoZSBtYW5nbGVkIHN5bWJvbAorCXJldHVybiBtYW5nbGVkU3ltYm9sOworfQorCisvKioKKyAqIEdldCBhIHN0YWNrIHRyYWNlLCBpZ25vcmluZyB0aGUgZmlyc3QgIm9mZnNldCIgc3ltYm9scy4KKyAqIEBwYXJhbSBvZmZzZXQgVGhlIG51bWJlciBvZiBzeW1ib2xzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHRvIGlnbm9yZQorICovCitzdGQ6OnN0cmluZyBHZXRTdGFja1RyYWNlKHVpbnQzMl90IG9mZnNldCkKK3sKKwl2b2lkICpzdGFja1RyYWNlWzEyOF07CisJaW50IHN0YWNrU2l6ZSA9IGJhY2t0cmFjZShzdGFja1RyYWNlLCAxMjgpOworCWNoYXIgKiptYW5nbGVkU3ltYm9scyA9IGJhY2t0cmFjZV9zeW1ib2xzKHN0YWNrVHJhY2UsIHN0YWNrU2l6ZSk7CisJc3RkOjpzdHJpbmdzdHJlYW0gdHJhY2U7CisKKwlmb3IoaW50IGkgPSBvZmZzZXQ7IGkgPCBzdGFja1NpemU7IGkrKykKKwl7CisJCS8vIE9ubHkgcHJpbnQgcmVjdXJzaXZlIGZ1bmN0aW9ucyBvbmNlIGluIGEgcm93LgorCQlpZihpID09IDAgfHxzdGFja1RyYWNlW2ldICE9IHN0YWNrVHJhY2VbaSAtIDFdKQorCQl7CisJCQl0cmFjZSA8PCAiXHRhdCAiIDw8IGRlbWFuZ2xlKG1hbmdsZWRTeW1ib2xzW2ldKSA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisKKwlmcmVlKG1hbmdsZWRTeW1ib2xzKTsKKworCXJldHVybiB0cmFjZS5zdHIoKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmljdG9yLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmljdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWNmYjcxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaWN0b3IuY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpY3Rvci5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorCisvKioKKyAqIENvbW1vbiBpbml0aWFsaXphdGlvbiBjb2RlIGNhbGxlZCBieSBhbGwgY29uc3RydWN0b3JzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgVmljdG9yIHVzZXMgdGhlIGZvbGxvd2luZyBib3VuZHMgZm9yIFBXTSB2YWx1ZXMuICBUaGVzZSB2YWx1ZXMgd2VyZSBkZXRlcm1pbmVkCisgKiBlbXBpcmljYWxseSBhbmQgb3B0aW1pemVkIGZvciB0aGUgVmljdG9yIDg4OC4gVGhlc2UgdmFsdWVzIHNob3VsZCB3b3JrIHJlYXNvbmFibHkgd2VsbCBmb3IKKyAqIFZpY3RvciA4ODQgY29udHJvbGxlcnMgYXMgd2VsbCBidXQgaWYgdXNlcnMgZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW91ciBhcm91bmQKKyAqIHRoZSBkZWFkYmFuZCBvciBpbmFiaWxpdHkgdG8gc2F0dXJhdGUgdGhlIGNvbnRyb2xsZXIgaW4gZWl0aGVyIGRpcmVjdGlvbiwgY2FsaWJyYXRpb24gaXMgcmVjb21tZW5kZWQuCisgKiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVmljdG9yIDg4NCBVc2VyIE1hbnVhbCBhdmFpbGFibGUgZnJvbSBJRkkuCisgKgorICogICAyLjAyN21zID0gZnVsbCAiZm9yd2FyZCIKKyAqICAgMS41MjVtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogICAxLjUwN21zID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQorICogICAxLjQ5bXMgPSB0aGUgImxvdyBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogICAxLjAyNm1zID0gZnVsbCAicmV2ZXJzZSIKKyAqLwordm9pZCBWaWN0b3I6OkluaXRWaWN0b3IoKSB7CisJU2V0Qm91bmRzKDIuMDI3LCAxLjUyNSwgMS41MDcsIDEuNDksIDEuMDI2KTsKKworCVNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMlgpOworCVNldFJhdyhtX2NlbnRlclB3bSk7CisJU2V0WmVyb0xhdGNoKCk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfVmljdG9yLCBHZXRDaGFubmVsKCkpOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBhIFZpY3RvcgorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlciB0aGF0IHRoZSBWaWN0b3IgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworVmljdG9yOjpWaWN0b3IodWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpCit7CisJSW5pdFZpY3RvcigpOworfQorCitWaWN0b3I6On5WaWN0b3IoKQoreworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlLgorICoKKyAqIFRoZSBQV00gdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkKKyAqIHNjYWxpbmcgdGhlIHZhbHVlIGZvciB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgMS4wIHRvIHNldC4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVW51c2VkIGludGVyZmFjZS4KKyAqLwordm9pZCBWaWN0b3I6OlNldChmbG9hdCBzcGVlZCwgdWludDhfdCBzeW5jR3JvdXApCit7CisJU2V0U3BlZWQoc3BlZWQpOworfQorCisvKioKKyAqIEdldCB0aGUgcmVjZW50bHkgc2V0IHZhbHVlIG9mIHRoZSBQV00uCisgKgorICogQHJldHVybiBUaGUgbW9zdCByZWNlbnRseSBzZXQgdmFsdWUgZm9yIHRoZSBQV00gYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisgKi8KK2Zsb2F0IFZpY3Rvcjo6R2V0KCkKK3sKKwlyZXR1cm4gR2V0U3BlZWQoKTsKK30KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyAqLwordm9pZCBWaWN0b3I6OkRpc2FibGUoKQoreworCVNldFJhdyhrUHdtRGlzYWJsZWQpOworfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIFZpY3Rvcjo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KQoreworCVNldChvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaWN0b3JTUC5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1ZpY3RvclNQLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWNkZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaWN0b3JTUC5jcHAKQEAgLTAsMCArMSw4NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVmljdG9yU1AuaCIKKworLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIFZpY3RvclNQIHVzZXMgdGhlIGZvbGxvd2luZyBib3VuZHMgZm9yIFBXTSB2YWx1ZXMuIFRoZXNlIHZhbHVlcyBzaG91bGQgd29yayByZWFzb25hYmx5IHdlbGwgZm9yCisgKiBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMgZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW9yIGFyb3VuZAorICogdGhlIGRlYWRiYW5kIG9yIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLCBjYWxpYnJhdGlvbiBpcyByZWNvbW1lbmRlZC4KKyAqIFRoZSBjYWxpYnJhdGlvbiBwcm9jZWR1cmUgY2FuIGJlIGZvdW5kIGluIHRoZSBWaWN0b3JTUCBVc2VyIE1hbnVhbCBhdmFpbGFibGUgZnJvbSBWZXguCisgKgorICogICAyLjAwNG1zID0gZnVsbCAiZm9yd2FyZCIKKyAqICAgMS41Mm1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgKiAgIDEuNTBtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKKyAqICAgMS40OG1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqICAgMC45OTdtcyA9IGZ1bGwgInJldmVyc2UiCisgKi8KK3ZvaWQgVmljdG9yU1A6OkluaXRWaWN0b3JTUCgpIHsKKwlTZXRCb3VuZHMoMi4wMDQsIDEuNTIsIDEuNTAsIDEuNDgsIC45OTcpOworCVNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMVgpOworCVNldFJhdyhtX2NlbnRlclB3bSk7CisJU2V0WmVyb0xhdGNoKCk7CisKKwlIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfVGFsb24sIEdldENoYW5uZWwoKSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIGEgVmljdG9yU1AgCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgVmljdG9yU1AgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworVmljdG9yU1A6OlZpY3RvclNQKHVpbnQzMl90IGNoYW5uZWwpIDogU2FmZVBXTShjaGFubmVsKQoreworCUluaXRWaWN0b3JTUCgpOworfQorCitWaWN0b3JTUDo6flZpY3RvclNQKCkKK3sKK30KKworLyoqCisgKiBTZXQgdGhlIFBXTSB2YWx1ZS4KKyAqCisgKiBUaGUgUFdNIHZhbHVlIGlzIHNldCB1c2luZyBhIHJhbmdlIG9mIC0xLjAgdG8gMS4wLCBhcHByb3ByaWF0ZWx5CisgKiBzY2FsaW5nIHRoZSB2YWx1ZSBmb3IgdGhlIEZQR0EuCisgKgorICogQHBhcmFtIHNwZWVkIFRoZSBzcGVlZCB2YWx1ZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMCB0byBzZXQuCisgKiBAcGFyYW0gc3luY0dyb3VwIFVudXNlZCBpbnRlcmZhY2UuCisgKi8KK3ZvaWQgVmljdG9yU1A6OlNldChmbG9hdCBzcGVlZCwgdWludDhfdCBzeW5jR3JvdXApCit7CisJU2V0U3BlZWQoc3BlZWQpOworfQorCisvKioKKyAqIEdldCB0aGUgcmVjZW50bHkgc2V0IHZhbHVlIG9mIHRoZSBQV00uCisgKgorICogQHJldHVybiBUaGUgbW9zdCByZWNlbnRseSBzZXQgdmFsdWUgZm9yIHRoZSBQV00gYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisgKi8KK2Zsb2F0IFZpY3RvclNQOjpHZXQoKQoreworCXJldHVybiBHZXRTcGVlZCgpOworfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorICovCit2b2lkIFZpY3RvclNQOjpEaXNhYmxlKCkKK3sKKwlTZXRSYXcoa1B3bURpc2FibGVkKTsKK30KKworLyoqCisgKiBXcml0ZSBvdXQgdGhlIFBJRCB2YWx1ZSBhcyBzZWVuIGluIHRoZSBQSURPdXRwdXQgYmFzZSBvYmplY3QuCisgKgorICogQHBhcmFtIG91dHB1dCBXcml0ZSBvdXQgdGhlIFBXTSB2YWx1ZSBhcyB3YXMgZm91bmQgaW4gdGhlIFBJRENvbnRyb2xsZXIKKyAqLwordm9pZCBWaWN0b3JTUDo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KQoreworCVNldChvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQXhpc0NhbWVyYS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9BeGlzQ2FtZXJhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzY1OGQwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQXhpc0NhbWVyYS5jcHAKQEAgLTAsMCArMSw2NDUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVmlzaW9uL0F4aXNDYW1lcmEuaCIKKworI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8VGltZXIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYXhQYWNrZXRTaXplID0gMTUzNjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga0ltYWdlQnVmZmVyQWxsb2NhdGlvbkluY3JlbWVudCA9IDEwMDA7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrV2hpdGVCYWxhbmNlU3RyaW5nc1tdID0KK3sgImF1dG8iLCAiaG9sZCIsICJmaXhlZF9vdXRkb29yMSIsICJmaXhlZF9vdXRkb29yMiIsICJmaXhlZF9pbmRvb3IiLAorCQkiZml4ZWRfZmx1b3IxIiwgImZpeGVkX2ZsdW9yMiIsIH07CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRXhwb3N1cmVDb250cm9sU3RyaW5nc1tdID0KK3sgImF1dG8iLCAiaG9sZCIsICJmbGlja2VyZnJlZTUwIiwgImZsaWNrZXJmcmVlNjAiLCB9OworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1Jlc29sdXRpb25TdHJpbmdzW10gPQoreyAiNjQweDQ4MCIsICI0ODB4MzYwIiwgIjMyMHgyNDAiLCAiMjQweDE4MCIsICIxNzZ4MTQ0IiwgIjE2MHgxMjAiLCB9OworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1JvdGF0aW9uU3RyaW5nc1tdID0KK3sgIjAiLCAiMTgwIiwgfTsKKworLyoqCisgKiBBeGlzQ2FtZXJhIGNvbnN0cnVjdG9yCisgKiBAcGFyYW0gY2FtZXJhSG9zdCBUaGUgaG9zdCB0byBmaW5kIHRoZSBjYW1lcmEgYXQsIHR5cGljYWxseSBhbiBJUCBhZGRyZXNzCisgKi8KK0F4aXNDYW1lcmE6OkF4aXNDYW1lcmEoc3RkOjpzdHJpbmcgY29uc3QmIGNhbWVyYUhvc3QpCisJCTogbV9jYW1lcmFIb3N0KGNhbWVyYUhvc3QpCisJCSwgbV9jYW1lcmFTb2NrZXQoLTEpCisJCSwgbV9mcmVzaEltYWdlKGZhbHNlKQorCQksIG1fYnJpZ2h0bmVzcyg1MCkKKwkJLCBtX3doaXRlQmFsYW5jZShrV2hpdGVCYWxhbmNlX0F1dG9tYXRpYykKKwkJLCBtX2NvbG9yTGV2ZWwoNTApCisJCSwgbV9leHBvc3VyZUNvbnRyb2woa0V4cG9zdXJlQ29udHJvbF9BdXRvbWF0aWMpCisJCSwgbV9leHBvc3VyZVByaW9yaXR5KDUwKQorCQksIG1fbWF4RlBTKDApCisJCSwgbV9yZXNvbHV0aW9uKGtSZXNvbHV0aW9uXzY0MHg0ODApCisJCSwgbV9jb21wcmVzc2lvbig1MCkKKwkJLCBtX3JvdGF0aW9uKGtSb3RhdGlvbl8wKQorCQksIG1fcGFyYW1ldGVyc0RpcnR5KHRydWUpCisJCSwgbV9zdHJlYW1EaXJ0eSh0cnVlKQorCQksIG1fZG9uZShmYWxzZSkKK3sKKwltX2NhcHR1cmVUaHJlYWQgPSBzdGQ6OnRocmVhZCgmQXhpc0NhbWVyYTo6Q2FwdHVyZSwgdGhpcyk7Cit9CisKK0F4aXNDYW1lcmE6On5BeGlzQ2FtZXJhKCkKK3sKKwltX2RvbmUgPSB0cnVlOworCW1fY2FwdHVyZVRocmVhZC5qb2luKCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGF0ZXN0IGltYWdlIGZyb20gdGhlIGNhbWVyYSBoYXMgbm90IGJlZW4gcmV0cmlldmVkIGJ5IGNhbGxpbmcgR2V0SW1hZ2UoKSB5ZXQuCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGltYWdlIGhhcyBub3QgYmVlbiByZXRyaWV2ZWQgeWV0LgorICovCitib29sIEF4aXNDYW1lcmE6OklzRnJlc2hJbWFnZSgpIGNvbnN0Cit7CisJcmV0dXJuIG1fZnJlc2hJbWFnZTsKK30KKworLyoqCisgKiBHZXQgYW4gaW1hZ2UgZnJvbSB0aGUgY2FtZXJhIGFuZCBzdG9yZSBpdCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2UuCisgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYXEgaW1hZ2UgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gVGhpcyBtdXN0IGJlIGFuIEhTTCBvciBSR0IgaW1hZ2UuCisgKiBAcmV0dXJuIDEgdXBvbiBzdWNjZXNzLCB6ZXJvIG9uIGEgZmFpbHVyZQorICovCitpbnQgQXhpc0NhbWVyYTo6R2V0SW1hZ2UoSW1hZ2UgKmltYWdlKQoreworCWlmIChtX2ltYWdlRGF0YS5zaXplKCkgPT0gMCkKKwl7CisJCXJldHVybiAwOworCX0KKworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1faW1hZ2VEYXRhTXV0ZXgpOworCisJUHJpdl9SZWFkSlBFR1N0cmluZ19DKGltYWdlLCBtX2ltYWdlRGF0YS5kYXRhKCksIG1faW1hZ2VEYXRhLnNpemUoKSk7CisKKwltX2ZyZXNoSW1hZ2UgPSBmYWxzZTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIEdldCBhbiBpbWFnZSBmcm9tIHRoZSBjYW1lcmEgYW5kIHN0b3JlIGl0IGluIHRoZSBwcm92aWRlZCBpbWFnZS4KKyAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gVGhpcyBtdXN0IGJlIGFuIEhTTCBvciBSR0IgaW1hZ2UKKyAqIEByZXR1cm4gMSB1cG9uIHN1Y2Nlc3MsIHplcm8gb24gYSBmYWlsdXJlCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpHZXRJbWFnZShDb2xvckltYWdlICppbWFnZSkKK3sKKwlyZXR1cm4gR2V0SW1hZ2UoaW1hZ2UtPkdldEltYXFJbWFnZSgpKTsKK30KKworLyoqCisgKiBJbnN0YW50aWF0ZSBhIG5ldyBpbWFnZSBvYmplY3QgYW5kIGZpbGwgaXQgd2l0aCB0aGUgbGF0ZXN0IGltYWdlIGZyb20gdGhlIGNhbWVyYS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBpcyB0aGVpciByZXNwb25zaWJpbGl0eSB0byBkZWxldGUuCisgKiBAcmV0dXJuIGEgcG9pbnRlciB0byBhbiBIU0xJbWFnZSBvYmplY3QKKyAqLworSFNMSW1hZ2UgKkF4aXNDYW1lcmE6OkdldEltYWdlKCkKK3sKKwlIU0xJbWFnZSAqaW1hZ2UgPSBuZXcgSFNMSW1hZ2UoKTsKKwlHZXRJbWFnZShpbWFnZSk7CisJcmV0dXJuIGltYWdlOworfQorCisvKioKKyAqIENvcHkgYW4gaW1hZ2UgaW50byBhbiBleGlzdGluZyBidWZmZXIuCisgKiBUaGlzIGNvcGllcyBhbiBpbWFnZSBpbnRvIGFuIGV4aXN0aW5nIGJ1ZmZlciByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBpbWFnZQorICogaW4gbWVtb3J5LiBUaGF0IHdheSBhIG5ldyBpbWFnZSBpcyBvbmx5IGFsbG9jYXRlZCB3aGVuIHRoZSBpbWFnZSBiZWluZyBjb3BpZWQgaXMKKyAqIGxhcmdlciB0aGFuIHRoZSBkZXN0aW5hdGlvbi4KKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgUENWaWRlb1NlcnZlciBjbGFzcy4KKyAqIEBwYXJhbSBpbWFnZURhdGEgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorICogQHBhcmFtIG51bUJ5dGVzIFRoZSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyAqIEByZXR1cm4gMCBpZiBmYWlsZWQgKG5vIHNvdXJjZSBpbWFnZSBvciBubyBtZW1vcnkpLCAxIGlmIHN1Y2Nlc3MuCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpDb3B5SlBFRyhjaGFyICoqZGVzdEltYWdlLCB1bnNpZ25lZCBpbnQgJmRlc3RJbWFnZVNpemUsIHVuc2lnbmVkIGludCAmZGVzdEltYWdlQnVmZmVyU2l6ZSkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX2ltYWdlRGF0YU11dGV4KTsKKwlpZiAoZGVzdEltYWdlID09IE5VTEwpCisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJkZXN0SW1hZ2UgbXVzdCBub3QgYmUgTlVMTCIpOworCisJaWYgKG1faW1hZ2VEYXRhLnNpemUoKSA9PSAwKQorCQlyZXR1cm4gMDsgLy8gaWYgbm8gc291cmNlIGltYWdlCisKKwlpZiAoZGVzdEltYWdlQnVmZmVyU2l6ZSA8IG1faW1hZ2VEYXRhLnNpemUoKSkgLy8gaWYgY3VycmVudCBkZXN0aW5hdGlvbiBidWZmZXIgdG9vIHNtYWxsCisJeworCQlpZiAoKmRlc3RJbWFnZSAhPSBOVUxMKSBkZWxldGUgW10gKmRlc3RJbWFnZTsKKwkJZGVzdEltYWdlQnVmZmVyU2l6ZSA9IG1faW1hZ2VEYXRhLnNpemUoKSArIGtJbWFnZUJ1ZmZlckFsbG9jYXRpb25JbmNyZW1lbnQ7CisJCSpkZXN0SW1hZ2UgPSBuZXcgY2hhcltkZXN0SW1hZ2VCdWZmZXJTaXplXTsKKwkJaWYgKCpkZXN0SW1hZ2UgPT0gTlVMTCkgcmV0dXJuIDA7CisJfQorCS8vIGNvcHkgdGhpcyBpbWFnZSBpbnRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorCWlmICgqZGVzdEltYWdlID09IE5VTEwpCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiKmRlc3RJbWFnZSBtdXN0IG5vdCBiZSBOVUxMIik7CisJfQorCQorCXN0ZDo6Y29weShtX2ltYWdlRGF0YS5iZWdpbigpLCBtX2ltYWdlRGF0YS5lbmQoKSwgKmRlc3RJbWFnZSk7CisJZGVzdEltYWdlU2l6ZSA9IG1faW1hZ2VEYXRhLnNpemUoKTs7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogUmVxdWVzdCBhIGNoYW5nZSBpbiB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgY2FtZXJhIGltYWdlcy4KKyAqIEBwYXJhbSBicmlnaHRuZXNzIHZhbGlkIHZhbHVlcyAwIC4uIDEwMAorICovCit2b2lkIEF4aXNDYW1lcmE6OldyaXRlQnJpZ2h0bmVzcyhpbnQgYnJpZ2h0bmVzcykKK3sKKwlpZiAoYnJpZ2h0bmVzcyA8IDAgfHwgYnJpZ2h0bmVzcyA+IDEwMCkKKwl7CisJCXdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsCisJCQkJIkJyaWdodG5lc3MgbXVzdCBiZSBmcm9tIDAgdG8gMTAwIik7CisJCXJldHVybjsKKwl9CisKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKwlpZiAobV9icmlnaHRuZXNzICE9IGJyaWdodG5lc3MpCisJeworCQltX2JyaWdodG5lc3MgPSBicmlnaHRuZXNzOworCQltX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisJfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgYnJpZ2h0bmVzcyBvZiB0aGUgY2FtZXJhIGltYWdlcworICovCitpbnQgQXhpc0NhbWVyYTo6R2V0QnJpZ2h0bmVzcygpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX2JyaWdodG5lc3M7Cit9CisKKy8qKgorICogUmVxdWVzdCBhIGNoYW5nZSBpbiB0aGUgd2hpdGUgYmFsYW5jZSBvbiB0aGUgY2FtZXJhLgorICogQHBhcmFtIHdoaXRlQmFsYW5jZSBWYWxpZCB2YWx1ZXMgZnJvbSB0aGUgPGNvZGU+V2hpdGVCYWxhbmNlPC9jb2RlPiBlbnVtLgorICovCit2b2lkIEF4aXNDYW1lcmE6OldyaXRlV2hpdGVCYWxhbmNlKEF4aXNDYW1lcmE6OldoaXRlQmFsYW5jZSB3aGl0ZUJhbGFuY2UpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisJaWYgKG1fd2hpdGVCYWxhbmNlICE9IHdoaXRlQmFsYW5jZSkKKwl7CisJCW1fd2hpdGVCYWxhbmNlID0gd2hpdGVCYWxhbmNlOworCQltX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisJfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgd2hpdGUgYmFsYW5jZXMgb2YgdGhlIGNhbWVyYSBpbWFnZXMKKyAqLworQXhpc0NhbWVyYTo6V2hpdGVCYWxhbmNlIEF4aXNDYW1lcmE6OkdldFdoaXRlQmFsYW5jZSgpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX3doaXRlQmFsYW5jZTsKK30KKworLyoqCisgKiBSZXF1ZXN0IGEgY2hhbmdlIGluIHRoZSBjb2xvciBsZXZlbCBvZiB0aGUgY2FtZXJhIGltYWdlcy4KKyAqIEBwYXJhbSBjb2xvckxldmVsIHZhbGlkIHZhbHVlcyBhcmUgMCAuLiAxMDAKKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZUNvbG9yTGV2ZWwoaW50IGNvbG9yTGV2ZWwpCit7CisJaWYgKGNvbG9yTGV2ZWwgPCAwIHx8IGNvbG9yTGV2ZWwgPiAxMDApCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLAorCQkJCSJDb2xvciBsZXZlbCBtdXN0IGJlIGZyb20gMCB0byAxMDAiKTsKKwkJcmV0dXJuOworCX0KKworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKworCWlmIChtX2NvbG9yTGV2ZWwgIT0gY29sb3JMZXZlbCkKKwl7CisJCW1fY29sb3JMZXZlbCA9IGNvbG9yTGV2ZWw7CisJCW1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgY29uZmlndXJlZCBjb2xvciBsZXZlbCBvZiB0aGUgY2FtZXJhIGltYWdlcworICovCitpbnQgQXhpc0NhbWVyYTo6R2V0Q29sb3JMZXZlbCgpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX2NvbG9yTGV2ZWw7Cit9CisKKy8qKgorICogUmVxdWVzdCBhIGNoYW5nZSBpbiB0aGUgY2FtZXJhJ3MgZXhwb3N1cmUgbW9kZS4KKyAqIEBwYXJhbSBleHBvc3VyZUNvbnRyb2wgQSBtb2RlIHRvIHdyaXRlIGluIHRoZSA8Y29kZT5FeHBvc3VyZTwvY29kZT4gZW51bS4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZUV4cG9zdXJlQ29udHJvbCgKKwkJQXhpc0NhbWVyYTo6RXhwb3N1cmVDb250cm9sIGV4cG9zdXJlQ29udHJvbCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKwlpZiAobV9leHBvc3VyZUNvbnRyb2wgIT0gZXhwb3N1cmVDb250cm9sKQorCXsKKwkJbV9leHBvc3VyZUNvbnRyb2wgPSBleHBvc3VyZUNvbnRyb2w7CisJCW1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgY29uZmlndXJlZCBleHBvc3VyZSBjb250cm9sIG1vZGUgb2YgdGhlIGNhbWVyYQorICovCitBeGlzQ2FtZXJhOjpFeHBvc3VyZUNvbnRyb2wgQXhpc0NhbWVyYTo6R2V0RXhwb3N1cmVDb250cm9sKCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisJcmV0dXJuIG1fZXhwb3N1cmVDb250cm9sOworfQorCisvKioKKyAqIFJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlIGV4cG9zdXJlIHByaW9yaXR5IG9mIHRoZSBjYW1lcmEuCisgKiBAcGFyYW0gZXhwb3N1cmVQcmlvcml0eSBWYWxpZCB2YWx1ZXMgYXJlIDAsIDUwLCAxMDAuCisgKiAwID0gUHJpb3JpdGl6ZSBpbWFnZSBxdWFsaXR5CisgKiA1MCA9IE5vbmUKKyAqIDEwMCA9IFByaW9yaXRpemUgZnJhbWUgcmF0ZQorICovCit2b2lkIEF4aXNDYW1lcmE6OldyaXRlRXhwb3N1cmVQcmlvcml0eShpbnQgZXhwb3N1cmVQcmlvcml0eSkKK3sKKwlpZiAoZXhwb3N1cmVQcmlvcml0eSAhPSAwICYmIGV4cG9zdXJlUHJpb3JpdHkgIT0gNTAKKwkJCSYmIGV4cG9zdXJlUHJpb3JpdHkgIT0gMTAwKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwKKwkJCQkiRXhwb3N1cmUgcHJpb3JpdHkgbXVzdCBiZSBmcm9tIDAsIDUwLCBvciAxMDAiKTsKKwkJcmV0dXJuOworCX0KKworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKworCWlmIChtX2V4cG9zdXJlUHJpb3JpdHkgIT0gZXhwb3N1cmVQcmlvcml0eSkKKwl7CisJCW1fZXhwb3N1cmVQcmlvcml0eSA9IGV4cG9zdXJlUHJpb3JpdHk7CisJCW1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgY29uZmlndXJlZCBleHBvc3VyZSBwcmlvcml0eSBvZiB0aGUgY2FtZXJhCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpHZXRFeHBvc3VyZVByaW9yaXR5KCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisJcmV0dXJuIG1fZXhwb3N1cmVQcmlvcml0eTsKK30KKworLyoqCisgKiBXcml0ZSB0aGUgbWF4aW11bSBmcmFtZXMgcGVyIHNlY29uZCB0aGF0IHRoZSBjYW1lcmEgc2hvdWxkIHNlbmQKKyAqIFdyaXRlIDAgdG8gc2VuZCBhcyBtYW55IGFzIHBvc3NpYmxlLgorICogQHBhcmFtIG1heEZQUyBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0aGUgY2FtZXJhIHNob3VsZCBzZW5kIGluIGEgc2Vjb25kLCBleHBvc3VyZSBwZXJtaXR0aW5nLgorICovCit2b2lkIEF4aXNDYW1lcmE6OldyaXRlTWF4RlBTKGludCBtYXhGUFMpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisJaWYgKG1fbWF4RlBTICE9IG1heEZQUykKKwl7CisJCW1fbWF4RlBTID0gbWF4RlBTOworCQltX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisJCW1fc3RyZWFtRGlydHkgPSB0cnVlOworCX0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIG1heGltdW0gRlBTIG9mIHRoZSBjYW1lcmEKKyAqLworaW50IEF4aXNDYW1lcmE6OkdldE1heEZQUygpCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCXJldHVybiBtX21heEZQUzsKK30KKworLyoqCisgKiBXcml0ZSByZXNvbHV0aW9uIHZhbHVlIHRvIGNhbWVyYS4KKyAqIEBwYXJhbSByZXNvbHV0aW9uIFRoZSBjYW1lcmEgcmVzb2x1dGlvbiB2YWx1ZSB0byB3cml0ZSB0byB0aGUgY2FtZXJhLgorICovCit2b2lkIEF4aXNDYW1lcmE6OldyaXRlUmVzb2x1dGlvbihBeGlzQ2FtZXJhOjpSZXNvbHV0aW9uIHJlc29sdXRpb24pCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisJaWYgKG1fcmVzb2x1dGlvbiAhPSByZXNvbHV0aW9uKQorCXsKKwkJbV9yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKwkJbV9wYXJhbWV0ZXJzRGlydHkgPSB0cnVlOworCQltX3N0cmVhbURpcnR5ID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgY29uZmlndXJlZCByZXNvbHV0aW9uIG9mIHRoZSBjYW1lcmEgKG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZQorICogcmVzb2x1dGlvbiBhcyB0aGUgbW9zdCByZWNlbnQgaW1hZ2UsIGlmIGl0IHdhcyBjaGFuZ2VkIHJlY2VudGx5LikKKyAqLworQXhpc0NhbWVyYTo6UmVzb2x1dGlvbiBBeGlzQ2FtZXJhOjpHZXRSZXNvbHV0aW9uKCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisJcmV0dXJuIG1fcmVzb2x1dGlvbjsKK30KKworLyoqCisgKiBXcml0ZSB0aGUgcm90YXRpb24gdmFsdWUgdG8gdGhlIGNhbWVyYS4KKyAqIElmIHlvdSBtb3VudCB5b3VyIGNhbWVyYSB1cHNpZGUgZG93biwgdXNlIHRoaXMgdG8gYWRqdXN0IHRoZSBpbWFnZSBmb3IgeW91LgorICogQHBhcmFtIHJvdGF0aW9uIFRoZSBhbmdsZSB0byByb3RhdGUgdGhlIGNhbWVyYSAoPGNvZGU+QXhpc0NhbWVyYTo6Um90YXRpb246OmswPC9jb2RlPgorICogb3IgPGNvZGU+QXhpc0NhbWVyYTo6Um90YXRpb246OmsxODA8L2NvZGU+KQorICovCit2b2lkIEF4aXNDYW1lcmE6OldyaXRlUm90YXRpb24oQXhpc0NhbWVyYTo6Um90YXRpb24gcm90YXRpb24pCit7CisJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisJaWYgKG1fcm90YXRpb24gIT0gcm90YXRpb24pCisJeworCQltX3JvdGF0aW9uID0gcm90YXRpb247CisJCW1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKwkJbV9zdHJlYW1EaXJ0eSA9IHRydWU7CisJfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgcm90YXRpb24gbW9kZSBvZiB0aGUgY2FtZXJhCisgKi8KK0F4aXNDYW1lcmE6OlJvdGF0aW9uIEF4aXNDYW1lcmE6OkdldFJvdGF0aW9uKCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisJcmV0dXJuIG1fcm90YXRpb247Cit9CisKKy8qKgorICogV3JpdGUgdGhlIGNvbXByZXNzaW9uIHZhbHVlIHRvIHRoZSBjYW1lcmEuCisgKiBAcGFyYW0gY29tcHJlc3Npb24gVmFsdWVzIGJldHdlZW4gMCBhbmQgMTAwLgorICovCit2b2lkIEF4aXNDYW1lcmE6OldyaXRlQ29tcHJlc3Npb24oaW50IGNvbXByZXNzaW9uKQoreworCWlmIChjb21wcmVzc2lvbiA8IDAgfHwgY29tcHJlc3Npb24gPiAxMDApCisJeworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLAorCQkJCSJDb21wcmVzc2lvbiBtdXN0IGJlIGZyb20gMCB0byAxMDAiKTsKKwkJcmV0dXJuOworCX0KKworCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKworCWlmIChtX2NvbXByZXNzaW9uICE9IGNvbXByZXNzaW9uKQorCXsKKwkJbV9jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uOworCQltX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisJCW1fc3RyZWFtRGlydHkgPSB0cnVlOworCX0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIGNvbXByZXNzaW9uIGxldmVsIG9mIHRoZSBjYW1lcmEKKyAqLworaW50IEF4aXNDYW1lcmE6OkdldENvbXByZXNzaW9uKCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisJcmV0dXJuIG1fY29tcHJlc3Npb247Cit9CisKKy8qKgorICogTWV0aG9kIGNhbGxlZCBpbiB0aGUgY2FwdHVyZSB0aHJlYWQgdG8gcmVjZWl2ZSBpbWFnZXMgZnJvbSB0aGUgY2FtZXJhCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6Q2FwdHVyZSgpCit7CisJaW50IGNvbnNlY3V0aXZlRXJyb3JzID0gMDsKKworCS8vIExvb3Agb24gdHJ5aW5nIHRvIHNldHVwIHRoZSBjYW1lcmEgY29ubmVjdGlvbi4gVGhpcyBoYXBwZW5zIGluIGEgYmFja2dyb3VuZAorCS8vIHRocmVhZCBzbyBpdCBzaG91bGRuJ3QgZWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdXNlciBwcm9ncmFtcy4KKwl3aGlsZSAoIW1fZG9uZSkKKwl7CisJCXN0ZDo6c3RyaW5nIHJlcXVlc3RTdHJpbmcgPSAiR0VUIC9tanBnL3ZpZGVvLm1qcGcgSFRUUC8xLjFcbiIKKwkJCQkiVXNlci1BZ2VudDogSFRUUFN0cmVhbUNsaWVudFxuIgorCQkJCSJDb25uZWN0aW9uOiBLZWVwLUFsaXZlXG4iCisJCQkJIkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlXG4iCisJCQkJIkF1dGhvcml6YXRpb246IEJhc2ljIFJsSkRPa1pTUXc9PVxuXG4iOworCQltX2NhcHR1cmVNdXRleC5sb2NrKCk7CisJCW1fY2FtZXJhU29ja2V0ID0gQ3JlYXRlQ2FtZXJhU29ja2V0KHJlcXVlc3RTdHJpbmcsIGNvbnNlY3V0aXZlRXJyb3JzID4gNSk7CisJCWlmIChtX2NhbWVyYVNvY2tldCAhPSAtMSkKKwkJeworCQkJUmVhZEltYWdlc0Zyb21DYW1lcmEoKTsKKwkJCWNvbnNlY3V0aXZlRXJyb3JzID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWNvbnNlY3V0aXZlRXJyb3JzKys7CisJCX0KKwkJbV9jYXB0dXJlTXV0ZXgudW5sb2NrKCk7CisJCVdhaXQoMC41KTsKKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBhY3R1YWxseSByZWFkcyB0aGUgaW1hZ2VzIGZyb20gdGhlIGNhbWVyYS4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpSZWFkSW1hZ2VzRnJvbUNhbWVyYSgpCit7CisJY2hhciAqaW1nQnVmZmVyID0gTlVMTDsKKwlpbnQgaW1nQnVmZmVyTGVuZ3RoID0gMDsKKworCS8vIFRPRE86IHRoZXNlIHJlY3YgY2FsbHMgbXVzdCBiZSBub24tYmxvY2tpbmcuIE90aGVyd2lzZSBpZiB0aGUgY2FtZXJhCisJLy8gZmFpbHMgZHVyaW5nIGEgcmVhZCwgdGhlIGNvZGUgaGFuZ3MgYW5kIG5ldmVyIHJldHJpZXMgd2hlbiB0aGUgY2FtZXJhIGNvbWVzCisJLy8gYmFjayB1cC4KKworCWludCBjb3VudGVyID0gMjsKKwl3aGlsZSAoIW1fZG9uZSkKKwl7CisJCWNoYXIgaW5pdGlhbFJlYWRCdWZmZXJba01heFBhY2tldFNpemVdID0gIiI7CisJCWNoYXIgaW50ZXJtZWRpYXRlQnVmZmVyWzFdOworCQljaGFyICp0cmFpbGluZ1B0ciA9IGluaXRpYWxSZWFkQnVmZmVyOworCQlpbnQgdHJhaWxpbmdDb3VudGVyID0gMDsKKwkJd2hpbGUgKGNvdW50ZXIpCisJCXsKKwkJCS8vIFRPRE86IGZpeCBtZS4uLiB0aGlzIGNhbm5vdCBiZSB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGFwcHJvYWNoIHRoaXMsIHJlYWRpbmcgb25lIGJ5dGUgYXQgYSB0aW1lLgorCQkJaWYgKHJlY3YobV9jYW1lcmFTb2NrZXQsIGludGVybWVkaWF0ZUJ1ZmZlciwgMSwgMCkgPT0gLTEpCisJCQl7CisJCQkJd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgiRmFpbGVkIHRvIHJlYWQgaW1hZ2UgaGVhZGVyIik7CisJCQkJY2xvc2UobV9jYW1lcmFTb2NrZXQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXN0cm5jYXQoaW5pdGlhbFJlYWRCdWZmZXIsIGludGVybWVkaWF0ZUJ1ZmZlciwgMSk7CisJCQkvLyB0cmFpbGluZ0NvdW50ZXIgZW5zdXJlcyB0aGF0IHdlIHN0YXJ0IGxvb2tpbmcgZm9yIHRoZSA0IGJ5dGUgc3RyaW5nIGFmdGVyCisJCQkvLyB0aGVyZSBpcyBhdCBsZWFzdCA0IGJ5dGVzIHRvdGFsLiBLaW5kIG9mIG9ic2N1cmUuCisJCQkvLyBsb29rIGZvciAyIGJsYW5rIGxpbmVzIChcclxuKQorCQkJaWYgKE5VTEwgIT0gc3Ryc3RyKHRyYWlsaW5nUHRyLCAiXHJcblxyXG4iKSkKKwkJCXsKKwkJCQktLWNvdW50ZXI7CisJCQl9CisJCQlpZiAoKyt0cmFpbGluZ0NvdW50ZXIgPj0gNCkKKwkJCXsKKwkJCQl0cmFpbGluZ1B0cisrOworCQkJfQorCQl9CisJCWNvdW50ZXIgPSAxOworCQljaGFyICpjb250ZW50TGVuZ3RoID0gc3Ryc3RyKGluaXRpYWxSZWFkQnVmZmVyLCAiQ29udGVudC1MZW5ndGg6ICIpOworCQlpZiAoY29udGVudExlbmd0aCA9PSBOVUxMKQorCQl7CisJCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLAorCQkJCQkiTm8gY29udGVudC1sZW5ndGggdG9rZW4gZm91bmQgaW4gcGFja2V0Iik7CisJCQljbG9zZShtX2NhbWVyYVNvY2tldCk7CisJCQlyZXR1cm47CisJCX0KKwkJY29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGggKyAxNjsgLy8gc2tpcCBwYXN0ICJjb250ZW50IGxlbmd0aCIKKwkJaW50IHJlYWRMZW5ndGggPSBhdG9sKGNvbnRlbnRMZW5ndGgpOyAvLyBnZXQgdGhlIGltYWdlIGJ5dGUgY291bnQKKworCQkvLyBNYWtlIHN1cmUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaAorCQlpZiAoaW1nQnVmZmVyTGVuZ3RoIDwgcmVhZExlbmd0aCkKKwkJeworCQkJaWYgKGltZ0J1ZmZlcikKKwkJCQlkZWxldGVbXSBpbWdCdWZmZXI7CisJCQlpbWdCdWZmZXJMZW5ndGggPSByZWFkTGVuZ3RoICsga0ltYWdlQnVmZmVyQWxsb2NhdGlvbkluY3JlbWVudDsKKwkJCWltZ0J1ZmZlciA9IG5ldyBjaGFyW2ltZ0J1ZmZlckxlbmd0aF07CisJCQlpZiAoaW1nQnVmZmVyID09IE5VTEwpCisJCQl7CisJCQkJaW1nQnVmZmVyTGVuZ3RoID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8vIFJlYWQgdGhlIGltYWdlIGRhdGEgZm9yICJDb250ZW50LUxlbmd0aCIgYnl0ZXMKKwkJaW50IGJ5dGVzUmVhZCA9IDA7CisJCWludCByZW1haW5pbmcgPSByZWFkTGVuZ3RoOworCQl3aGlsZSAoYnl0ZXNSZWFkIDwgcmVhZExlbmd0aCkKKwkJeworCQkJaW50IGJ5dGVzVGhpc1JlY3YgPSByZWN2KG1fY2FtZXJhU29ja2V0LCAmaW1nQnVmZmVyW2J5dGVzUmVhZF0sCisJCQkJCXJlbWFpbmluZywgMCk7CisJCQlieXRlc1JlYWQgKz0gYnl0ZXNUaGlzUmVjdjsKKwkJCXJlbWFpbmluZyAtPSBieXRlc1RoaXNSZWN2OworCQl9CisKKwkJLy8gVXBkYXRlIGltYWdlCisJCXsKKwkJCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1faW1hZ2VEYXRhTXV0ZXgpOworCisJCQltX2ltYWdlRGF0YS5hc3NpZ24oaW1nQnVmZmVyLCBpbWdCdWZmZXIgKyBpbWdCdWZmZXJMZW5ndGgpOworCQkJbV9mcmVzaEltYWdlID0gdHJ1ZTsKKwkJfQorCisJCWlmIChXcml0ZVBhcmFtZXRlcnMoKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljbG9zZShtX2NhbWVyYVNvY2tldCk7Cit9CisKKy8qKgorICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGNhbWVyYSB0byBzZXQgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzLiAgVGhpcyBpcyBjYWxsZWQKKyAqIGluIHRoZSBjYXB0dXJlIHRocmVhZCBiZXR3ZWVuIGVhY2ggZnJhbWUuIFRoaXMgc3RyYXRlZ3kgYXZvaWRzIG1ha2luZyBsb3RzCisgKiBvZiByZWR1bmRhbnQgSFRUUCByZXF1ZXN0cywgYWNjb3VudHMgZm9yIGZhaWxlZCBpbml0aWFsIHJlcXVlc3RzLCBhbmQKKyAqIGF2b2lkcyBibG9ja2luZyBjYWxscyBpbiB0aGUgbWFpbiB0aHJlYWQgdW5sZXNzIG5lY2Vzc2FyeS4KKyAqCisgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgaWYgbm8gcGFyYW1ldGVycyBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXQgbGFzdAorICogY29tcGxldGVseSBzdWNjZXNzZnVsbHkuCisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RyZWFtIHNob3VsZCBiZSByZXN0YXJ0ZWQgZHVlIHRvIGEKKyAqIHBhcmFtZXRlciBjaGFuZ2luZy4KKyAqLworYm9vbCBBeGlzQ2FtZXJhOjpXcml0ZVBhcmFtZXRlcnMoKQoreworCWlmIChtX3BhcmFtZXRlcnNEaXJ0eSkKKwl7CisJCXN0ZDo6c3RyaW5nc3RyZWFtIHJlcXVlc3Q7CisJCXJlcXVlc3QgPDwgIkdFVCAvYXhpcy1jZ2kvYWRtaW4vcGFyYW0uY2dpP2FjdGlvbj11cGRhdGUiOworCisJCW1fcGFyYW1ldGVyc011dGV4LmxvY2soKTsKKwkJcmVxdWVzdCA8PCAiJkltYWdlU291cmNlLkkwLlNlbnNvci5CcmlnaHRuZXNzPSIgPDwgbV9icmlnaHRuZXNzOworCQlyZXF1ZXN0IDw8ICImSW1hZ2VTb3VyY2UuSTAuU2Vuc29yLldoaXRlQmFsYW5jZT0iIDw8IGtXaGl0ZUJhbGFuY2VTdHJpbmdzW21fd2hpdGVCYWxhbmNlXTsKKwkJcmVxdWVzdCA8PCAiJkltYWdlU291cmNlLkkwLlNlbnNvci5Db2xvckxldmVsPSIgPDwgbV9jb2xvckxldmVsOworCQlyZXF1ZXN0IDw8ICImSW1hZ2VTb3VyY2UuSTAuU2Vuc29yLkV4cG9zdXJlPSIgPDwga0V4cG9zdXJlQ29udHJvbFN0cmluZ3NbbV9leHBvc3VyZUNvbnRyb2xdOworCQlyZXF1ZXN0IDw8ICImSW1hZ2VTb3VyY2UuSTAuU2Vuc29yLkV4cG9zdXJlUHJpb3JpdHk9IiA8PCBtX2V4cG9zdXJlUHJpb3JpdHk7CisJCXJlcXVlc3QgPDwgIiZJbWFnZS5JMC5TdHJlYW0uRlBTPSIgPDwgbV9tYXhGUFM7CisJCXJlcXVlc3QgPDwgIiZJbWFnZS5JMC5BcHBlYXJhbmNlLlJlc29sdXRpb249IiA8PCBrUmVzb2x1dGlvblN0cmluZ3NbbV9yZXNvbHV0aW9uXTsKKwkJcmVxdWVzdCA8PCAiJkltYWdlLkkwLkFwcGVhcmFuY2UuQ29tcHJlc3Npb249IiA8PCBtX2NvbXByZXNzaW9uOworCQlyZXF1ZXN0IDw8ICImSW1hZ2UuSTAuQXBwZWFyYW5jZS5Sb3RhdGlvbj0iIDw8IGtSb3RhdGlvblN0cmluZ3NbbV9yb3RhdGlvbl07CisJCW1fcGFyYW1ldGVyc011dGV4LnVubG9jaygpOworCisJCXJlcXVlc3QgPDwgIiBIVFRQLzEuMSIgPDwgc3RkOjplbmRsOworCQlyZXF1ZXN0IDw8ICJVc2VyLUFnZW50OiBIVFRQU3RyZWFtQ2xpZW50IiA8PCBzdGQ6OmVuZGw7CisJCXJlcXVlc3QgPDwgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIDw8IHN0ZDo6ZW5kbDsKKwkJcmVxdWVzdCA8PCAiQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUiIDw8IHN0ZDo6ZW5kbDsKKwkJcmVxdWVzdCA8PCAiQXV0aG9yaXphdGlvbjogQmFzaWMgUmxKRE9rWlNRdz09IiA8PCBzdGQ6OmVuZGw7CisJCXJlcXVlc3QgPDwgc3RkOjplbmRsOworCisJCWludCBzb2NrZXQgPSBDcmVhdGVDYW1lcmFTb2NrZXQocmVxdWVzdC5zdHIoKSwgZmFsc2UpOworCQlpZiAoc29ja2V0ID09IC0xKQorCQl7CisJCQl3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KCJFcnJvciBzZXR0aW5nIGNhbWVyYSBwYXJhbWV0ZXJzIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQljbG9zZShzb2NrZXQpOworCQkJbV9wYXJhbWV0ZXJzRGlydHkgPSBmYWxzZTsKKworCQkJaWYgKG1fc3RyZWFtRGlydHkpCisJCQl7CisJCQkJbV9zdHJlYW1EaXJ0eSA9IGZhbHNlOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENyZWF0ZSBhIHNvY2tldCBjb25uZWN0ZWQgdG8gY2FtZXJhCisgKiBVc2VkIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGNhbWVyYSBmb3IgYm90aCBjYXB0dXJpbmcgaW1hZ2VzIGFuZCBzZXR0aW5nIHBhcmFtZXRlcnMuCisgKiBAcGFyYW0gcmVxdWVzdFN0cmluZyBUaGUgaW5pdGlhbCByZXF1ZXN0IHN0cmluZyB0byBzZW5kIHVwb24gc3VjY2Vzc2Z1bCBjb25uZWN0aW9uLgorICogQHBhcmFtIHNldEVycm9yIElmIHRydWUsIHJhaXMgYW4gZXJyb3IgaWYgdGhlcmUncyBhIHByb2JsZW0gY3JlYXRpbmcgdGhlIGNvbm5lY3Rpb24uCisgKiBUaGlzIGlzIG9ubHkgZW5hYmxlZCBhZnRlciBzZXZlcmFsIHVuc3VjZXNzZnVsIGNvbm5lY3Rpb25zLCBzbyBhIHNpbmdsZSBvbmUgZG9lc24ndAorICogY2F1c2UgYW4gZXJyb3IgbWVzc2FnZSB0byBiZSBwcmludGVkIGlmIGl0IGltbWVkaWF0ZWx5IHJlY292ZXJzLgorICogQHJldHVybiAtMSBpZiBmYWlsZWQsIHNvY2tldCBoYW5kbGUgaWYgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEF4aXNDYW1lcmE6OkNyZWF0ZUNhbWVyYVNvY2tldChzdGQ6OnN0cmluZyBjb25zdCYgcmVxdWVzdFN0cmluZywgYm9vbCBzZXRFcnJvcikKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gKmFkZHJlc3MgPSAwOworCWludCBjYW1Tb2NrZXQ7CisKKwkvKiBjcmVhdGUgc29ja2V0ICovCisJaWYgKChjYW1Tb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKKwl7CisJCWlmIChzZXRFcnJvcikgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgY2FtZXJhIHNvY2tldCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGdldGFkZHJpbmZvKG1fY2FtZXJhSG9zdC5jX3N0cigpLCAiODAiLCAwLCAmYWRkcmVzcykgPT0gLTEpCisJeworCQlpZiAoc2V0RXJyb3IpIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIkZhaWxlZCB0byBjcmVhdGUgdGhlIGNhbWVyYSBzb2NrZXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNvbm5lY3QgdG8gc2VydmVyICovCisJaWYgKGNvbm5lY3QoY2FtU29ja2V0LCBhZGRyZXNzLT5haV9hZGRyLCBhZGRyZXNzLT5haV9hZGRybGVuKSA9PSAtMSkKKwl7CisJCWlmIChzZXRFcnJvcikgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIGNhbWVyYSIpOworCQljbG9zZShjYW1Tb2NrZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaW50IHNlbnQgPSBzZW5kKGNhbVNvY2tldCwgcmVxdWVzdFN0cmluZy5jX3N0cigpLCByZXF1ZXN0U3RyaW5nLnNpemUoKSwgMCk7CisJaWYgKHNlbnQgPT0gLTEpCisJeworCQlpZiAoc2V0RXJyb3IpIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIkZhaWxlZCB0byBzZW5kIGEgcmVxdWVzdCB0byB0aGUgY2FtZXJhIik7CisJCWNsb3NlKGNhbVNvY2tldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gY2FtU29ja2V0OworfQorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9CYWVVdGlsaXRpZXMuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQmFlVXRpbGl0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzhmYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQmFlVXRpbGl0aWVzLmNwcApAQCAtMCwwICsxLDM4NSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+IAorI2luY2x1ZGUgPHN0ZGFyZy5oPiAKKyAKKyNpbmNsdWRlICJWaXNpb24vQmFlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU2Vydm8uaCIKKyNpbmNsdWRlICJUaW1lci5oIgorCisvKiogQGZpbGUKKyAqICAgVXRpbGl0eSBmdW5jdGlvbnMgCisgKi8KKworLyoqCisgKiBkZWJ1ZyBvdXRwdXQgZmxhZyBvcHRpb25zOgorICogREVCVUdfT0ZGLCBERUJVR19NT1NUTFlfT0ZGLCBERUJVR19TQ1JFRU5fT05MWSwgREVCVUdfRklMRV9PTkxZLCBERUJVR19TQ1JFRU5fQU5EX0ZJTEUKKyAqLworc3RhdGljIERlYnVnT3V0cHV0VHlwZQlkcHJpbnRmRmxhZyA9IERFQlVHX09GRjsgIAorCisvKioKKyAqIFNldCB0aGUgZGVidWcgZmxhZyB0byBwcmludCB0byBzY3JlZW4sIGZpbGUgb24gY1JJTywgYm90aCBvciBuZWl0aGVyCisgKiBAcGFyYW0gdGVtcFN0cmluZyBUaGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZCBTZXREZWJ1Z0ZsYWcgKCBEZWJ1Z091dHB1dFR5cGUgZmxhZyAgKSAgCit7IGRwcmludGZGbGFnID0gZmxhZzsgfQorCisvKioKKyAqIERlYnVnIHByaW50IHRvIGEgZmlsZSBhbmQvb3IgYSB0ZXJtaW5hbCB3aW5kb3cuCisgKiBDYWxsIGxpa2UgeW91IHdvdWxkIGNhbGwgcHJpbnRmLgorICogU2V0IGZ1bmN0aW9uTmFtZSBpbiB0aGUgZnVuY3Rpb24gaWYgeW91IHdhbnQgdGhlIGNvcnJlY3QgZnVuY3Rpb24gbmFtZSB0byBwcmludCBvdXQuCisgKiBUaGUgZmlsZSBsaW5lIG51bWJlciB3aWxsIGFsc28gYmUgcHJpbnRlZC4KKyAqIEBwYXJhbSB0ZW1wU3RyaW5nIFRoZSBmb3JtYXQgc3RyaW5nLgorICovCit2b2lkIGRwcmludGYgKCBjb25zdCBjaGFyICogdGVtcFN0cmluZywgLi4uICApICAvKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0ICovCit7CisgIHZhX2xpc3QJCWFyZ3M7CQkJICAvKiBJbnB1dCBhcmd1bWVudCBsaXN0ICovCisgIGludAkJCWxpbmVfbnVtYmVyOyAgICAgIC8qIExpbmUgbnVtYmVyIHBhc3NlZCBpbiBhcmd1bWVudCAqLworICBpbnQJCQl0eXBlOworICBjb25zdCBjaGFyCSpmdW5jdGlvbk5hbWU7ICAgIC8qIEZvcm1hdCBwYXNzZWQgaW4gYXJndW1lbnQgKi8KKyAgY29uc3QgY2hhcgkqZm10OyAgICAgICAgICAgICAvKiBGb3JtYXQgcGFzc2VkIGluIGFyZ3VtZW50ICovCisgIGNoYXIJCQl0ZXh0WzUxMl07ICAgCSAgLyogVGV4dCBzdHJpbmcgKi8KKyAgY2hhcgkJCW91dHRleHRbNTEyXTsgICAgIC8qIFRleHQgc3RyaW5nICovCisgIEZJTEUJCQkqb3V0ZmlsZV9mZDsgICAgICAvKiBPdXRwdXQgZmlsZSBwb2ludGVyICovCisgIGNoYXIJCQlmaWxlcGF0aFsxMjhdOyAgICAvKiBUZXh0IHN0cmluZyAqLworICBpbnQJCQlmYXRhbEZsYWc9MDsKKyAgY29uc3QgY2hhcgkqZmlsZW5hbWU7CisgIGludAkJCWluZGV4OworICBpbnQJCQl0ZW1wU3RyaW5nTGVuOworCisgIGlmIChkcHJpbnRmRmxhZyA9PSBERUJVR19PRkYpIHsgcmV0dXJuOyB9CisgIAorICB2YV9zdGFydCAoYXJncywgdGVtcFN0cmluZyk7CisgIAorICB0ZW1wU3RyaW5nTGVuID0gc3RybGVuKHRlbXBTdHJpbmcpOworICBmaWxlbmFtZSA9IHRlbXBTdHJpbmc7CisgIGZvciAoaW5kZXg9MDtpbmRleDx0ZW1wU3RyaW5nTGVuO2luZGV4KyspeworCSAgaWYgKHRlbXBTdHJpbmdbaW5kZXhdID09ICcgJykgeworCQkgIHByaW50ZiggIkVSUk9SIGluIGRwcmludGY6IG1hbGZvcm1lZCBjYWxsaW5nIHNlcXVlbmNlICglcylcbiIsdGVtcFN0cmluZyk7cmV0dXJuOworCSAgCX0KKwkgIGlmICh0ZW1wU3RyaW5nW2luZGV4XSA9PSAnXFwnIHx8IHRlbXBTdHJpbmdbaW5kZXhdID09ICcvJykKKwkJICBmaWxlbmFtZSA9IHRlbXBTdHJpbmcgKyBpbmRleCArIDE7CisgIH0KKyAgCisgIC8qIEV4dHJhY3QgZnVuY3Rpb24gbmFtZSAqLworICBmdW5jdGlvbk5hbWUgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7CisgCisgLyogRXh0cmFjdCBsaW5lIG51bWJlciBmcm9tIGFyZ3VtZW50IGxpc3QgKi8KKyAgbGluZV9udW1iZXIgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisKKyAvKiBFeHRyYWN0IGluZm9ybWF0aW9uIHR5cGUgZnJvbSBhcmd1bWVudCBsaXN0ICovCisgIHR5cGUgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisKKyAvKiBFeHRyYWN0IGZvcm1hdCBmcm9tIGFyZ3VtZW50IGxpc3QgKi8KKyAgZm10ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOworCisgIHZzcHJpbnRmICh0ZXh0LCBmbXQsIGFyZ3MpOworCisgIHZhX2VuZCAoYXJncyk7CisKKyAgLyogRm9ybWF0IG91dHB1dCBzdGF0ZW1lbnQgKi8KKyAgc3dpdGNoICh0eXBlKQorICAgeworICAgY2FzZSBERUJVR19UWVBFOgorICAgICBzcHJpbnRmIChvdXR0ZXh0LCAiWyVzOiVzQCUwNGRdIERFQlVHICVzXG4iLAorICAgICAgICAgICAgICBmaWxlbmFtZSwgZnVuY3Rpb25OYW1lLCBsaW5lX251bWJlciwgdGV4dCk7CisgICAgIGJyZWFrOworICAgY2FzZSBJTkZPX1RZUEU6CisgICAgIHNwcmludGYgKG91dHRleHQsICJbJXM6JXNAJTA0ZF0gSU5GTyAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGNhc2UgRVJST1JfVFlQRToKKyAgICAgc3ByaW50ZiAob3V0dGV4dCwgIlslczolc0AlMDRkXSBFUlJPUiAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGNhc2UgQ1JJVElDQUxfVFlQRToKKyAgICAgc3ByaW50ZiAob3V0dGV4dCwgIlslczolc0AlMDRkXSBDUklUSUNBTCAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGNhc2UgRkFUQUxfVFlQRToKKyAgICAgZmF0YWxGbGFnID0gMTsKKyAgICAgc3ByaW50ZiAob3V0dGV4dCwgIlslczolc0AlMDRkXSBGQVRBTCAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgIHByaW50ZiggIkVSUk9SIGluIGRwcmludGY6IG1hbGZvcm1lZCBjYWxsaW5nIHNlcXVlbmNlXG4iKTsKKyAgICAgcmV0dXJuOworICAgICBicmVhazsKKyAgIH0KKworICBzcHJpbnRmIChmaWxlcGF0aCwgIiVzLmRlYnVnIiwgZmlsZW5hbWUpOworCisgIC8qIFdyaXRlIG91dHB1dCBzdGF0ZW1lbnQgKi8KKyAgc3dpdGNoIChkcHJpbnRmRmxhZykKKyAgeworICBkZWZhdWx0OgorICBjYXNlIERFQlVHX09GRjogCisgIAlicmVhazsKKyAgY2FzZSBERUJVR19NT1NUTFlfT0ZGOiAKKyAgCWlmIChmYXRhbEZsYWcpCXsKKwkgIGlmICgob3V0ZmlsZV9mZCA9IGZvcGVuIChmaWxlcGF0aCwgImErIikpICE9IE5VTEwpCSAgeworCSAgICBmd3JpdGUgKG91dHRleHQsIHNpemVvZiAoY2hhciksIHN0cmxlbiAob3V0dGV4dCksIG91dGZpbGVfZmQpOworCSAgICBmY2xvc2UgKG91dGZpbGVfZmQpOworCSAgfQorCX0KKyAgCWJyZWFrOworICBjYXNlIERFQlVHX1NDUkVFTl9PTkxZOiAKKyAgCXByaW50ZiAoIiVzIiwgb3V0dGV4dCk7CisgIAlicmVhazsKKyAgY2FzZSBERUJVR19GSUxFX09OTFk6IAorCWlmICgob3V0ZmlsZV9mZCA9IGZvcGVuIChmaWxlcGF0aCwgImErIikpICE9IE5VTEwpCXsKKwkgIGZ3cml0ZSAob3V0dGV4dCwgc2l6ZW9mIChjaGFyKSwgc3RybGVuIChvdXR0ZXh0KSwgb3V0ZmlsZV9mZCk7CisJICBmY2xvc2UgKG91dGZpbGVfZmQpOworCX0KKyAgCWJyZWFrOworICBjYXNlIERFQlVHX1NDUkVFTl9BTkRfRklMRTogLy8gQk9USAorICAJcHJpbnRmICgiJXMiLCBvdXR0ZXh0KTsKKwlpZiAoKG91dGZpbGVfZmQgPSBmb3BlbiAoZmlsZXBhdGgsICJhKyIpKSAhPSBOVUxMKQl7CisJICBmd3JpdGUgKG91dHRleHQsIHNpemVvZiAoY2hhciksIHN0cmxlbiAob3V0dGV4dCksIG91dGZpbGVfZmQpOworCSAgZmNsb3NlIChvdXRmaWxlX2ZkKTsKKwl9CisgIAlicmVhazsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBOb3JtYWxpemVzIGEgdmFsdWUgaW4gYSByYW5nZSwgdXNlZCBmb3IgZHJpdmUgaW5wdXQKKyAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gaW4gdGhlIHJhbmdlLCBzdGFydGluZyBhdCAwCisgKiBAcGFyYW0gcmFuZ2UgVGhlIHNpemUgb2YgdGhlIHJhbmdlIHRoYXQgcG9zaXRpb24gaXMgaW4KKyAqIEByZXR1cm4gVGhlIG5vcm1hbGl6ZWQgcG9zaXRpb24gZnJvbSAtMSB0byArMQorICovCitkb3VibGUgUmFuZ2VUb05vcm1hbGl6ZWQoZG91YmxlIHBvc2l0aW9uLCBpbnQgcmFuZ2UpeworCXJldHVybigoKHBvc2l0aW9uKjIuMCkvKGRvdWJsZSlyYW5nZSktMS4wKTsKK30KKworLyoqCisgKiBAYnJpZWYgQ29udmVydCBhIG5vcm1hbGl6ZWQgdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gYSByYW5nZS4KKyAqIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IG5vcm1hbGl6ZWQgdmFsdWVzIHRvIHRoZSBzZXJ2byBjb21tYW5kIHJhbmdlLgorICogQHBhcmFtIG5vcm1hbGl6ZWRWYWx1ZSBUaGUgbm9ybWFsaXplZCB2YWx1ZSAoaW4gdGhlIC0xIHRvICsxIHJhbmdlKQorICogQHBhcmFtIG1pblJhbmdlIFRoZSBtaW5pbXVtIG9mIHRoZSByYW5nZSAoMCBpcyBkZWZhdWx0KQorICogQHBhcmFtIG1heFJhbmdlIFRoZSBtYXhpbXVtIG9mIHRoZSByYW5nZSAoMSBpcyBkZWZhdWx0KQorICogQHJldHVybiBUaGUgdmFsdWUgaW4gdGhlIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IG5vcm1hbGl6ZWQgdmFsdWUKKyAqLworZmxvYXQgTm9ybWFsaXplVG9SYW5nZShmbG9hdCBub3JtYWxpemVkVmFsdWUsIGZsb2F0IG1pblJhbmdlLCBmbG9hdCBtYXhSYW5nZSkgeworCWZsb2F0IHJhbmdlID0gbWF4UmFuZ2UtbWluUmFuZ2U7CisJZmxvYXQgdGVtcCA9IChmbG9hdCkoKG5vcm1hbGl6ZWRWYWx1ZSAvIDIuMCkrIDAuNSkqcmFuZ2U7CisJcmV0dXJuICh0ZW1wICsgbWluUmFuZ2UpOworfQkKK2Zsb2F0IE5vcm1hbGl6ZVRvUmFuZ2UoZmxvYXQgbm9ybWFsaXplZFZhbHVlKSB7CisJcmV0dXJuIChmbG9hdCkoKG5vcm1hbGl6ZWRWYWx1ZSAvIDIuMCkgKyAwLjUpOworfQkKKworLyoqCisgKiBAYnJpZWYgRGlzcGxheXMgYW4gYWN0aXZpdHkgaW5kaWNhdG9yIHRvIGNvbnNvbGUuIAorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGxpa2UgeW91IHdvdWxkIGNhbGwgcHJpbnRmLgorICogQHBhcmFtIGZtdCBUaGUgZm9ybWF0IHN0cmluZworKi8KK3ZvaWQgU2hvd0FjdGl2aXR5IChjaGFyICpmbXQsIC4uLikKK3sKKyAgc3RhdGljIGNoYXIgICBhY3Rpdml0eV9pbmRpY2F0aW9uX3N0cmluZ1tdID0gInwvLVxcIjsKKyAgc3RhdGljIGludCAgICBhaSA9IDM7CisgIHZhX2xpc3QgICAgICAgYXJnczsKKyAgY2hhciAgICAgICAgICB0ZXh0WzEwMjRdOworCisgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworCisgIHZzcHJpbnRmICh0ZXh0LCBmbXQsIGFyZ3MpOworCisgIGFpID0gYWkgPT0gMyA/IDAgOiBhaSArIDE7CisKKyAgcHJpbnRmICgiJWMgJXMgXHIiLCBhY3Rpdml0eV9pbmRpY2F0aW9uX3N0cmluZ1thaV0sIHRleHQpOworICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgdmFfZW5kIChhcmdzKTsKK30KKworI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5CisvKioKKyAqIEBicmllZiBDYWxjdWxhdGUgc2luZSB3YXZlIGluY3JlbWVudHMgKC0xLjAgdG8gMS4wKS4gCisgKiBUaGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCwgaXQgc2V0cyB1cCB0aGUgdGltZSBpbmNyZW1lbnQuIFN1YnNlcXVlbnQgY2FsbHMKKyAqIHdpbGwgZ2l2ZSB2YWx1ZXMgYWxvbmcgdGhlIHNpbmUgd2F2ZSBkZXBlbmRpbmcgb24gY3VycmVudCB0aW1lLiBJZiB0aGUgd2F2ZSBpcworICogc3RvcHBlZCBhbmQgcmVzdGFydGVkLCBpdCBtdXN0IGJlIHJlaW5pdGlhbGl6ZWQgd2l0aCBhIG5ldyAiZmlyc3QgY2FsbCIuCisgKiAKKyAqIEBwYXJhbSBwZXJpb2QgbGVuZ3RoIG9mIHRpbWUgdG8gY29tcGxldGUgYSBjb21wbGV0ZSB3YXZlCisgKiBAcGFyYW0gc2luU3RhcnQgV2hlcmUgdG8gc3RhcnQgdGhlIHNpbmUgd2F2ZSAoMC4wID0gMiBwaSwgcGkvMiA9IDEuMCwgZXRjLikKKyAqLworZG91YmxlIFNpblBvc2l0aW9uIChkb3VibGUgKnBlcmlvZCwgZG91YmxlIHNpblN0YXJ0KQoreworICBkb3VibGUgcnRuVmFsOworICBzdGF0aWMgZG91YmxlIHNpbmVQZXJpb2Q9MC4wOworICBzdGF0aWMgZG91YmxlIHRpbWVzdGFtcDsKKyAgZG91YmxlIHNpbkFyZzsKKworICAvLzFzdCBjYWxsCisgIGlmIChwZXJpb2QgIT0gTlVMTCkgeworICAgIHNpbmVQZXJpb2QgPSAqcGVyaW9kOworCXRpbWVzdGFtcCA9IEdldFRpbWUoKTsKKwlyZXR1cm4gMC4wOworICB9CisKKyAgLy9NdWx0aXBseWluZyBieSAyKnBpIHRvIHRoZSB0aW1lIGRpZmZlcmVuY2UgbWFrZXMgc2luZVBlcmlvZCB3b3JrIGlmIGl0J3MgbWVhc3VyZWQgaW4gc2Vjb25kcy4KKyAgLy9BZGRpbmcgc2luU3RhcnQgdG8gdGhlIHBhcnQgbXVsdGlwbGllZCBieSBQSSwgYnV0IG5vdCBieSAyLCBhbGxvd3MgaXQgdG8gd29yayBhcyBkZXNjcmliZWQgaW4gdGhlIGNvbW1lbnRzLgorICBzaW5BcmcgPSBQSSAqKCgyLjAgKiAoR2V0VGltZSgpIC0gdGltZXN0YW1wKSkgKyBzaW5TdGFydCkgLyBzaW5lUGVyaW9kOworICBydG5WYWwgPSBzaW4gKHNpbkFyZyk7ICAKKyAgcmV0dXJuIChydG5WYWwpOworfQorCisKKy8qKgorICogQGJyaWVmIEZpbmQgdGhlIGVsYXBzZWQgdGltZSBzaW5jZSBhIHNwZWNpZmllZCB0aW1lLgorICogQHBhcmFtIHN0YXJ0VGltZSBUaGUgc3RhcnRpbmcgdGltZQorICogQHJldHVybiBIb3cgbG9uZyBpdCBoYXMgYmVlbiBzaW5jZSB0aGUgc3RhcnRpbmcgdGltZQorICovCitkb3VibGUgRWxhcHNlZFRpbWUgKCBkb3VibGUgc3RhcnRUaW1lICkgIAoreworCWRvdWJsZSByZWFsVGltZSA9IEdldFRpbWUoKTsJCisJcmV0dXJuIChyZWFsVGltZS1zdGFydFRpbWUpOworfQorCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplIHBhbiBwYXJhbWV0ZXJzCisgKiBAcGFyYW0gcGVyaW9kIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBjb21wbGV0ZSBvbmUgcGFuCisgKi8KK3ZvaWQgcGFuSW5pdCgpCXsKKwlkb3VibGUgcGVyaW9kID0gMy4wOyAgCS8vIG51bWJlciBvZiBzZWNvbmRzIGZvciBvbmUgY29tcGxldGUgcGFuCisJU2luUG9zaXRpb24oJnBlcmlvZCwgMC4wKTsJLy8gaW5pdGlhbCBjYWxsIHRvIHNldCB1cCB0aW1lCit9CisKK3ZvaWQgcGFuSW5pdChkb3VibGUgcGVyaW9kKQl7CisJaWYgKHBlcmlvZCA8IDAuMCkgcGVyaW9kPTMuMDsKKwlTaW5Qb3NpdGlvbigmcGVyaW9kLCAwLjApOwkvLyBpbml0aWFsIGNhbGwgdG8gc2V0IHVwIHRpbWUKK30KKworLyoqCisgKiBAYnJpZWYgTW92ZSB0aGUgaG9yaXpvbnRhbCBzZXJ2byBiYWNrIGFuZCBmb3J0aC4KKyAqIEBwYXJhbSBwYW5TZXJ2byBUaGUgc2Vydm8gb2JqZWN0IHRvIG1vdmUKKyAqIEBwYXJhbSBzaW5TdGFydCBUaGUgcG9zaXRpb24gb24gdGhlIHNpbmUgd2F2ZSB0byBiZWdpbiB0aGUgcGFuCisgKi8KK3ZvaWQgcGFuRm9yVGFyZ2V0KFNlcnZvICpwYW5TZXJ2bykJeyBwYW5Gb3JUYXJnZXQocGFuU2Vydm8sIDAuMCk7IH0KKwordm9pZCBwYW5Gb3JUYXJnZXQoU2Vydm8gKnBhblNlcnZvLCBkb3VibGUgc2luU3RhcnQpCXsKKwlmbG9hdCBub3JtYWxpemVkU2luUG9zaXRpb24gPSAoZmxvYXQpU2luUG9zaXRpb24oTlVMTCwgc2luU3RhcnQpOworCWZsb2F0IG5ld1NlcnZvUG9zaXRpb24gPSBOb3JtYWxpemVUb1JhbmdlKG5vcm1hbGl6ZWRTaW5Qb3NpdGlvbik7CisJcGFuU2Vydm8tPlNldCggbmV3U2Vydm9Qb3NpdGlvbiApOworCS8vU2hvd0FjdGl2aXR5ICgicGFuIHg6IG5vcm1hbGl6ZWQgJWYgbmV3U2Vydm9Qb3NpdGlvbiA9ICVmIiAsIAorCS8vCQlub3JtYWxpemVkU2luUG9zaXRpb24sIG5ld1NlcnZvUG9zaXRpb24gKTsKK30KKworCisvKiogQGJyaWVmIFJlYWQgYSBmaWxlIGFuZCByZXR1cm4gbm9uLWNvbW1lbnQgb3V0cHV0IHN0cmluZyAKKworQ2FsbCB0aGUgZmlyc3QgdGltZSB3aXRoIDAgbGluZU51bWJlciB0byBnZXQgdGhlIG51bWJlciBvZiBsaW5lcyB0byByZWFkCitUaGVuIGNhbGwgd2l0aCBlYWNoIGxpbmVOdW1iZXIgdG8gZ2V0IG9uZSBjYW1lcmEgcGFyYW1ldGVyLiBUaGVyZSBzaG91bGQKK2JlIG9uZSBwcm9wZXJ0eT12YWx1ZSBlbnRyeSBvbiBlYWNoIGxpbmUsIGkuZS4gImV4cG9zdXJlPWF1dG8iCisKKyAqIEBwYXJhbSBpbnB1dEZpbGUgZmlsZW5hbWUgdG8gcmVhZAorICogQHBhcmFtIG91dHB1dFN0cmluZyBvbmUgc3RyaW5nCisgKiBAcGFyYW0gbGluZU51bWJlciBpZiAwLCByZXR1cm4gbnVtYmVyIG9mIGxpbmVzOyBlbHNlIHJldHVybiB0aGF0IGxpbmUgbnVtYmVyCisgKiBAcmV0dXJuIGludCBudW1iZXIgb2YgbGluZXMgb3IgLTEgaWYgZXJyb3IKKyAqKi8KK2ludCBwcm9jZXNzRmlsZShjaGFyICppbnB1dEZpbGUsIGNoYXIgKm91dHB1dFN0cmluZywgaW50IGxpbmVOdW1iZXIpCit7CisJRklMRSAqaW5maWxlOworCWludCBzdHJpbmdTaXplID0gODA7CQkvLyBtYXggc2l6ZSBvZiBvbmUgbGluZSBpbiBmaWxlIAorCWNoYXIgaW5wdXRTdHJbc3RyaW5nU2l6ZV07CisJaW50IGxpbmVDb3VudD0wOworCSAgCisJaWYgKGxpbmVOdW1iZXIgPCAwKQorCQkgIHJldHVybiAoLTEpOworCisJaWYgKChpbmZpbGUgPSBmb3BlbiAoaW5wdXRGaWxlLCAiciIpKSA9PSBOVUxMKSB7CisJICAgIHByaW50ZiAoIkZhdGFsIGVycm9yIG9wZW5pbmcgZmlsZSAlc1xuIixpbnB1dEZpbGUpOworCSAgICByZXR1cm4gKDApOworCX0KKworICB3aGlsZSAoIWZlb2YoaW5maWxlKSkgeworICAgIGlmIChmZ2V0cyAoaW5wdXRTdHIsIHN0cmluZ1NpemUsIGluZmlsZSkgIT0gTlVMTCkgeworICAgICAgLy8gU2tpcCBlbXB0eSBsaW5lcworICAgICAgaWYgKGVtcHR5U3RyaW5nKGlucHV0U3RyKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBTa2lwIGNvbW1lbnQgbGluZXMKKyAgICAgIGlmIChpbnB1dFN0clswXSA9PSAnIycgfHwgaW5wdXRTdHJbMF0gPT0gJyEnKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgbGluZUNvdW50Kys7CisgICAgICBpZiAobGluZU51bWJlciA9PSAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAJICBpZiAobGluZUNvdW50ID09IGxpbmVOdW1iZXIpCisgICAgCQkgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNsb3NlIGZpbGUgCisgIGZjbG9zZSAoaW5maWxlKTsKKyAgLy8gaWYgbnVtYmVyIGxpbmVzIHJlcXVlc3RlZCByZXR1cm4gdGhlIGNvdW50CisgIGlmIChsaW5lTnVtYmVyID09IDApCisJICByZXR1cm4gKGxpbmVDb3VudCk7CisgIC8vIGNoZWNrIGZvciBpbnB1dCBvdXQgb2YgcmFuZ2UKKyAgaWYgKGxpbmVOdW1iZXIgPiBsaW5lQ291bnQpCisJICByZXR1cm4gKC0xKTsKKyAgLy8gcmV0dXJuIHRoZSBsaW5lIHNlbGVjdGVkCisgIGlmIChsaW5lQ291bnQpIHsKKyAgICBzdHJpcFN0cmluZyhpbnB1dFN0cik7CisgICAgc3RyY3B5KG91dHB1dFN0cmluZywgaW5wdXRTdHIpOworICAgIHJldHVybihsaW5lQ291bnQpOworICB9IAorICBlbHNlIHsKKyAgICByZXR1cm4oLTEpOworICB9Cit9CisKKy8qKiBJZ25vcmUgZW1wdHkgc3RyaW5nIAorICogQHBhcmFtIHN0cmluZyB0byBjaGVjayBpZiBlbXB0eQorICoqLworaW50IGVtcHR5U3RyaW5nKGNoYXIgKnN0cmluZykKK3sKKyAgaW50IGksbGVuOworCisgIGlmKHN0cmluZyA9PSBOVUxMKQorICAgIHJldHVybigxKTsKKworICBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKyAgZm9yKGk9MDsgaTxsZW47IGkrKykgeworICAgIC8vIElnbm9yZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMKKyAgICBpZiAoc3RyaW5nW2ldID09ICdcbicgfHwgc3RyaW5nW2ldID09ICdccicgfHwKKyAgICAgICAgc3RyaW5nW2ldID09ICdcdCcgfHwgc3RyaW5nW2ldID09ICcgJykKKyAgICAgIGNvbnRpbnVlOworICAgIHJldHVybigwKTsKKyAgfQorICByZXR1cm4oMSk7Cit9CisKKy8qKiBSZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGZyb20gc3RyaW5nIAorICogQHBhcmFtIHN0cmluZyB0byBwcm9jZXNzCisgKiovCit2b2lkIHN0cmlwU3RyaW5nKGNoYXIgKnN0cmluZykKK3sKKyAgaW50IGksaixsZW47CisKKyAgaWYoc3RyaW5nID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGxlbiA9IHN0cmxlbihzdHJpbmcpOworICBmb3IoaT0wLGo9MDsgaTxsZW47IGkrKykgeworICAgIC8vIFJlbW92ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nCisgICAgaWYgKHN0cmluZ1tpXSA9PSAnXG4nIHx8IHN0cmluZ1tpXSA9PSAnXHInIHx8IHN0cmluZ1tpXSA9PSAnXCInKQorICAgICAgY29udGludWU7CisgICAgLy8gQ29weSBhbnl0aGluZyBlbHNlCisgICAgc3RyaW5nW2orK10gPSBzdHJpbmdbaV07CisgIH0KKyAgc3RyaW5nW2pdID0gJ1wwJzsgCit9CisKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQmluYXJ5SW1hZ2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQmluYXJ5SW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjBjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9CaW5hcnlJbWFnZS5jcHAKQEAgLTAsMCArMSwyMjIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpc2lvbi9CaW5hcnlJbWFnZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworQmluYXJ5SW1hZ2U6OkJpbmFyeUltYWdlKCkgOiBNb25vSW1hZ2UoKQoreworfQorCitCaW5hcnlJbWFnZTo6fkJpbmFyeUltYWdlKCkKK3sKK30KKworLyoqCisgKiBHZXQgdGhlbiBudW1iZXIgb2YgcGFydGljbGVzIGZvciB0aGUgaW1hZ2UuCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBmb3VuZCBmb3IgdGhlIGltYWdlLgorICovCitpbnQgQmluYXJ5SW1hZ2U6OkdldE51bWJlclBhcnRpY2xlcygpCit7CisJaW50IG51bVBhcnRpY2xlcyA9IDA7CisJaW50IHN1Y2Nlc3MgPSBpbWFxQ291bnRQYXJ0aWNsZXMobV9pbWFxSW1hZ2UsIDEsICZudW1QYXJ0aWNsZXMpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiRXJyb3IgY291bnRpbmcgcGFydGljbGVzIik7CisJcmV0dXJuIG51bVBhcnRpY2xlczsKK30KKworLyoqCisgKiBHZXQgYSBzaW5nbGUgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0LgorICogR2V0IG9uZSAob2YgcG9zc2libHkgbWFueSkgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0cyBmb3IgYW4gaW1hZ2UuCisgKiBAcGFyYW0gcGFydGljbGVOdW1iZXIgV2hpY2ggcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0IHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHRoZSBzZWxlY3RlZCBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnQKKyAqLworUGFydGljbGVBbmFseXNpc1JlcG9ydCBCaW5hcnlJbWFnZTo6R2V0UGFydGljbGVBbmFseXNpc1JlcG9ydChpbnQgcGFydGljbGVOdW1iZXIpCit7CisJUGFydGljbGVBbmFseXNpc1JlcG9ydCBwYXI7CisJR2V0UGFydGljbGVBbmFseXNpc1JlcG9ydChwYXJ0aWNsZU51bWJlciwgJnBhcik7CisJcmV0dXJuIHBhcjsKK30KKworLyoqCisgKiBHZXQgYSBzaW5nbGUgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0LgorICogR2V0IG9uZSAob2YgcG9zc2libHkgbWFueSkgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0cyBmb3IgYW4gaW1hZ2UuCisgKiBUaGlzIHZlcnNpb24gY291bGQgYmUgbW9yZSBlZmZpY2llbnQgd2hlbiBjb3B5aW5nIG1hbnkgcmVwb3J0cy4KKyAqIEBwYXJhbSBwYXJ0aWNsZU51bWJlciBXaGljaCBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnQgdG8gcmV0dXJuLgorICogQHBhcmFtIHBhciB0aGUgc2VsZWN0ZWQgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0CisgKi8KK3ZvaWQgQmluYXJ5SW1hZ2U6OkdldFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQoaW50IHBhcnRpY2xlTnVtYmVyLCBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0ICpwYXIpCit7CisJaW50IHN1Y2Nlc3M7CisJaW50IG51bVBhcnRpY2xlcyA9IDA7CisKKwlzdWNjZXNzID0gaW1hcUdldEltYWdlU2l6ZShtX2ltYXFJbWFnZSwgJnBhci0+aW1hZ2VXaWR0aCwgJnBhci0+aW1hZ2VIZWlnaHQpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiRXJyb3IgZ2V0dGluZyBpbWFnZSBzaXplIik7CisJaWYgKFN0YXR1c0lzRmF0YWwoKSkKKwkJcmV0dXJuOworCisJc3VjY2VzcyA9IGltYXFDb3VudFBhcnRpY2xlcyhtX2ltYXFJbWFnZSwgMSwgJm51bVBhcnRpY2xlcyk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJFcnJvciBjb3VudGluZyBwYXJ0aWNsZXMiKTsKKwlpZiAoU3RhdHVzSXNGYXRhbCgpKQorCQlyZXR1cm47CisKKwlpZiAocGFydGljbGVOdW1iZXIgPj0gbnVtUGFydGljbGVzKQorCXsKKwkJd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInBhcnRpY2xlTnVtYmVyIik7CisJCXJldHVybjsKKwl9CisKKwlwYXItPnBhcnRpY2xlSW5kZXggPSBwYXJ0aWNsZU51bWJlcjsKKwkvLyBEb24ndCBib3RoZXIgbWVhc3VyaW5nIHRoZSByZXN0IG9mIHRoZSBwYXJ0aWNsZSBpZiBvbmUgZmFpbHMKKwlib29sIGdvb2QgPSBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1gsICZwYXItPmNlbnRlcl9tYXNzX3gpOworCWdvb2QgPSBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQ0VOVEVSX09GX01BU1NfWSwgJnBhci0+Y2VudGVyX21hc3NfeSk7CisJZ29vZCA9IGdvb2QgJiYgUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgSU1BUV9NVF9BUkVBLCAmcGFyLT5wYXJ0aWNsZUFyZWEpOworCWdvb2QgPSBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9UT1AsICZwYXItPmJvdW5kaW5nUmVjdC50b3ApOworCWdvb2QgPSBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9MRUZULCAmcGFyLT5ib3VuZGluZ1JlY3QubGVmdCk7CisJZ29vZCA9IGdvb2QgJiYgUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgSU1BUV9NVF9CT1VORElOR19SRUNUX0hFSUdIVCwgJnBhci0+Ym91bmRpbmdSZWN0LmhlaWdodCk7CisJZ29vZCA9IGdvb2QgJiYgUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgSU1BUV9NVF9CT1VORElOR19SRUNUX1dJRFRILCAmcGFyLT5ib3VuZGluZ1JlY3Qud2lkdGgpOworCWdvb2QgPSBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQVJFQV9CWV9JTUFHRV9BUkVBLCAmcGFyLT5wYXJ0aWNsZVRvSW1hZ2VQZXJjZW50KTsKKwlnb29kID0gZ29vZCAmJiBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCBJTUFRX01UX0FSRUFfQllfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEsICZwYXItPnBhcnRpY2xlUXVhbGl0eSk7CisKKwlpZiAoZ29vZCkKKwl7CisJCS8qIG5vcm1hbGl6ZWQgcG9zaXRpb24gKC0xIHRvIDEpICovCisJCXBhci0+Y2VudGVyX21hc3NfeF9ub3JtYWxpemVkID0gTm9ybWFsaXplRnJvbVJhbmdlKHBhci0+Y2VudGVyX21hc3NfeCwgcGFyLT5pbWFnZVdpZHRoKTsKKwkJcGFyLT5jZW50ZXJfbWFzc195X25vcm1hbGl6ZWQgPSBOb3JtYWxpemVGcm9tUmFuZ2UocGFyLT5jZW50ZXJfbWFzc195LCBwYXItPmltYWdlSGVpZ2h0KTsKKwl9Cit9CisKKworLyoqCisgKiBHZXQgYW4gb3JkZXJlZCB2ZWN0b3Igb2YgcGFydGljbGVzIGZvciB0aGUgaW1hZ2UuCisgKiBDcmVhdGUgYSB2ZWN0b3Igb2YgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0cyBzb3J0ZWQgYnkgc2l6ZSBmb3IgYW4gaW1hZ2UuCisgKiBUaGUgdmVjdG9yIGNvbnRhaW5zIHRoZSBhY3R1YWwgcmVwb3J0IHN0cnVjdHVyZXMuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZlY3RvciBvZiBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnRzLiBUaGUgY2FsbGVyIG11c3QgZGVsZXRlIHRoZQorICogdmVjdG9yIHdoZW4gZmluaXNoZWQgdXNpbmcgaXQuCisgKi8KK3ZlY3RvcjxQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0PiogQmluYXJ5SW1hZ2U6OkdldE9yZGVyZWRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0cygpCit7CisJdmVjdG9yPFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQ+KiBwYXJ0aWNsZXMgPSBuZXcgdmVjdG9yPFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQ+OworCWludCBwYXJ0aWNsZUNvdW50ID0gR2V0TnVtYmVyUGFydGljbGVzKCk7CisJZm9yKGludCBwYXJ0aWNsZUluZGV4ID0gMDsgcGFydGljbGVJbmRleCA8IHBhcnRpY2xlQ291bnQ7IHBhcnRpY2xlSW5kZXgrKykKKwl7CisJCXBhcnRpY2xlcy0+cHVzaF9iYWNrKEdldFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQocGFydGljbGVJbmRleCkpOworCX0KKwkvLyBUT0RPOiBUaGlzIGlzIHByZXR0eSBpbmVmZmljaWVudCBzaW5jZSBlYWNoIGNvbXBhcmUgaW4gdGhlIHNvcnQgY29waWVzCisJLy8gICBib3RoIHJlcG9ydHMgYmVpbmcgY29tcGFyZWQuLi4gZG8gaXQgbWFudWFsbHkgaW5zdGVhZC4uLiB3aGlsZSB3ZSdyZQorCS8vICAgYXQgaXQsIHdlIHNob3VsZCBwcm92aWRlIGEgdmVyc2lvbiB0aGF0IGFsbG93cyBhIHByZWFsbG9jYXRlZCBidWZmZXIgb2YKKwkvLyAgIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgc3RydWN0dXJlcworCXNvcnQocGFydGljbGVzLT5iZWdpbigpLCBwYXJ0aWNsZXMtPmVuZCgpLCBDb21wYXJlUGFydGljbGVTaXplcyk7CisJcmV0dXJuIHBhcnRpY2xlczsKK30KKworLyoqCisgKiBXcml0ZSBhIGJpbmFyeSBpbWFnZSB0byBmbGFzaC4KKyAqIFdyaXRlcyB0aGUgYmluYXJ5IGltYWdlIHRvIGZsYXNoIG9uIHRoZSBjUklPIGZvciBsYXRlciBpbnNwZWN0aW9uLgorICogQHBhcmFtIGZpbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBpbWFnZSBmaWxlIHdyaXR0ZW4gdG8gdGhlIGZsYXNoLgorICovCit2b2lkIEJpbmFyeUltYWdlOjpXcml0ZShjb25zdCBjaGFyICpmaWxlTmFtZSkKK3sKKwlSR0JWYWx1ZSBjb2xvclRhYmxlWzI1Nl07CisJbWVtc2V0KGNvbG9yVGFibGUsIDAsIHNpemVvZihjb2xvclRhYmxlKSk7CisJY29sb3JUYWJsZVswXS5SID0gMDsKKwljb2xvclRhYmxlWzFdLlIgPSAyNTU7CisJY29sb3JUYWJsZVswXS5HID0gY29sb3JUYWJsZVsxXS5HID0gMDsKKwljb2xvclRhYmxlWzBdLkIgPSBjb2xvclRhYmxlWzFdLkIgPSAwOworCWNvbG9yVGFibGVbMF0uYWxwaGEgPSBjb2xvclRhYmxlWzFdLmFscGhhID0gMDsKKwlpbWFxV3JpdGVGaWxlKG1faW1hcUltYWdlLCBmaWxlTmFtZSwgY29sb3JUYWJsZSk7Cit9CisKKy8qKgorICogTWVhc3VyZSBhIHNpbmdsZSBwYXJhbWV0ZXIgZm9yIGFuIGltYWdlLgorICogR2V0IHRoZSBtZWFzdXJlbWVudCBmb3IgYSBzaW5nbGUgcGFyYW1ldGVyIGFib3V0IGFuIGltYWdlIGJ5IGNhbGxpbmcgdGhlIGltYXFNZWFzdXJlUGFydGljbGUKKyAqIGZ1bmN0aW9uIGZvciB0aGUgc2VsZWN0ZWQgcGFyYW1ldGVyLgorICogQHBhcmFtIHBhcnRpY2xlTnVtYmVyIHdoaWNoIHBhcnRpY2xlIGluIHRoZSBzZXQgb2YgcGFydGljbGVzCisgKiBAcGFyYW0gd2hhdFRvTWVhc3VyZSB0aGUgaW1hcSBNZWFzdXJlbWVudFR5cGUgKHdoYXQgdG8gbWVhc3VyZSkKKyAqIEBwYXJhbSByZXN1bHQgdGhlIHZhbHVlIG9mIHRoZSBtZWFzdXJlbWVudAorICogQHJldHVybnMgZmFsc2Ugb24gZmFpbHVyZSwgdHJ1ZSBvbiBzdWNjZXNzCisgKi8KK2Jvb2wgQmluYXJ5SW1hZ2U6OlBhcnRpY2xlTWVhc3VyZW1lbnQoaW50IHBhcnRpY2xlTnVtYmVyLCBNZWFzdXJlbWVudFR5cGUgd2hhdFRvTWVhc3VyZSwgaW50ICpyZXN1bHQpCit7CisJZG91YmxlIHJlc3VsdERvdWJsZTsKKwlib29sIHN1Y2Nlc3MgPSBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCB3aGF0VG9NZWFzdXJlLCAmcmVzdWx0RG91YmxlKTsKKwkqcmVzdWx0ID0gKGludClyZXN1bHREb3VibGU7CisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qKgorICogTWVhc3VyZSBhIHNpbmdsZSBwYXJhbWV0ZXIgZm9yIGFuIGltYWdlLgorICogR2V0IHRoZSBtZWFzdXJlbWVudCBmb3IgYSBzaW5nbGUgcGFyYW1ldGVyIGFib3V0IGFuIGltYWdlIGJ5IGNhbGxpbmcgdGhlIGltYXFNZWFzdXJlUGFydGljbGUKKyAqIGZ1bmN0aW9uIGZvciB0aGUgc2VsZWN0ZWQgcGFyYW1ldGVyLgorICogQHBhcmFtIHBhcnRpY2xlTnVtYmVyIHdoaWNoIHBhcnRpY2xlIGluIHRoZSBzZXQgb2YgcGFydGljbGVzCisgKiBAcGFyYW0gd2hhdFRvTWVhc3VyZSB0aGUgaW1hcSBNZWFzdXJlbWVudFR5cGUgKHdoYXQgdG8gbWVhc3VyZSkKKyAqIEBwYXJhbSByZXN1bHQgdGhlIHZhbHVlIG9mIHRoZSBtZWFzdXJlbWVudAorICogQHJldHVybnMgdHJ1ZSBvbiBmYWlsdXJlLCBmYWxzZSBvbiBzdWNjZXNzCisgKi8KK2Jvb2wgQmluYXJ5SW1hZ2U6OlBhcnRpY2xlTWVhc3VyZW1lbnQoaW50IHBhcnRpY2xlTnVtYmVyLCBNZWFzdXJlbWVudFR5cGUgd2hhdFRvTWVhc3VyZSwgZG91YmxlICpyZXN1bHQpCit7CisJaW50IHN1Y2Nlc3M7CisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUobV9pbWFxSW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCB3aGF0VG9NZWFzdXJlLCByZXN1bHQpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiRXJyb3IgbWVhc3VyaW5nIHBhcnRpY2xlIik7CisJcmV0dXJuICFTdGF0dXNJc0ZhdGFsKCk7Cit9CisKKy8vTm9ybWFsaXplcyB0byBbLTEsMV0KK2RvdWJsZSBCaW5hcnlJbWFnZTo6Tm9ybWFsaXplRnJvbVJhbmdlKGRvdWJsZSBwb3NpdGlvbiwgaW50IHJhbmdlKQoreworCXJldHVybiAocG9zaXRpb24gKiAyLjAgLyAoZG91YmxlKXJhbmdlKSAtIDEuMDsKK30KKworLyoqCisgKiBUaGUgY29tcGFyZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHNvcnQuCisgKiBUaGlzIGZ1bmN0aW9uIGNvbXBhcmVzIHR3byBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnRzIGFzIGEgaGVscGVyIGZvciB0aGUgc29ydCBmdW5jdGlvbi4KKyAqIEBwYXJhbSBwYXJ0aWNsZTEgVGhlIGZpcnN0IHBhcnRpY2xlIHRvIGNvbXBhcmUKKyAqIEBwYXJhbSBwYXJ0aWNsZTIgdGhlIHNlY29uZCBwYXJ0aWNsZSB0byBjb21wYXJlCisgKiBAcmV0dXJucyB0cnVlIGlmIHBhcnRpY2xlMSBpcyBncmVhdGVyIHRoYW4gcGFydGljbGUyCisgKi8KK2Jvb2wgQmluYXJ5SW1hZ2U6OkNvbXBhcmVQYXJ0aWNsZVNpemVzKFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgcGFydGljbGUxLCBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IHBhcnRpY2xlMikKK3sKKwkvL3dlIHdhbnQgZGVzY2VuZGluZyBzb3J0IG9yZGVyCisJcmV0dXJuIHBhcnRpY2xlMS5wYXJ0aWNsZVRvSW1hZ2VQZXJjZW50ID4gcGFydGljbGUyLnBhcnRpY2xlVG9JbWFnZVBlcmNlbnQ7Cit9CisKK0JpbmFyeUltYWdlICpCaW5hcnlJbWFnZTo6UmVtb3ZlU21hbGxPYmplY3RzKGJvb2wgY29ubmVjdGl2aXR5OCwgaW50IGVyb3Npb25zKQoreworCUJpbmFyeUltYWdlICpyZXN1bHQgPSBuZXcgQmluYXJ5SW1hZ2UoKTsKKwlpbnQgc3VjY2VzcyA9IGltYXFTaXplRmlsdGVyKHJlc3VsdC0+R2V0SW1hcUltYWdlKCksIG1faW1hcUltYWdlLCBjb25uZWN0aXZpdHk4LCBlcm9zaW9ucywgSU1BUV9LRUVQX0xBUkdFLCBOVUxMKTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGluIFJlbW92ZVNtYWxsT2JqZWN0cyIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0JpbmFyeUltYWdlICpCaW5hcnlJbWFnZTo6UmVtb3ZlTGFyZ2VPYmplY3RzKGJvb2wgY29ubmVjdGl2aXR5OCwgaW50IGVyb3Npb25zKQoreworCUJpbmFyeUltYWdlICpyZXN1bHQgPSBuZXcgQmluYXJ5SW1hZ2UoKTsKKwlpbnQgc3VjY2VzcyA9IGltYXFTaXplRmlsdGVyKHJlc3VsdC0+R2V0SW1hcUltYWdlKCksIG1faW1hcUltYWdlLCBjb25uZWN0aXZpdHk4LCBlcm9zaW9ucywgSU1BUV9LRUVQX1NNQUxMLCBOVUxMKTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGluIFJlbW92ZUxhcmdlT2JqZWN0cyIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0JpbmFyeUltYWdlICpCaW5hcnlJbWFnZTo6Q29udmV4SHVsbChib29sIGNvbm5lY3Rpdml0eTgpCit7CisJQmluYXJ5SW1hZ2UgKnJlc3VsdCA9IG5ldyBCaW5hcnlJbWFnZSgpOworCWludCBzdWNjZXNzID0gaW1hcUNvbnZleEh1bGwocmVzdWx0LT5HZXRJbWFxSW1hZ2UoKSwgbV9pbWFxSW1hZ2UsIGNvbm5lY3Rpdml0eTgpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiRXJyb3IgaW4gY29udmV4IGh1bGwgb3BlcmF0aW9uIik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworQmluYXJ5SW1hZ2UgKkJpbmFyeUltYWdlOjpQYXJ0aWNsZUZpbHRlcihQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiAqY3JpdGVyaWEsIGludCBjcml0ZXJpYUNvdW50KQoreworCUJpbmFyeUltYWdlICpyZXN1bHQgPSBuZXcgQmluYXJ5SW1hZ2UoKTsKKwlpbnQgbnVtUGFydGljbGVzOworCVBhcnRpY2xlRmlsdGVyT3B0aW9uczIgZmlsdGVyT3B0aW9ucyA9IHswLCAwLCAwLCAxfTsKKwlpbnQgc3VjY2VzcyA9IGltYXFQYXJ0aWNsZUZpbHRlcjQocmVzdWx0LT5HZXRJbWFxSW1hZ2UoKSwgbV9pbWFxSW1hZ2UsIGNyaXRlcmlhLCBjcml0ZXJpYUNvdW50LCAmZmlsdGVyT3B0aW9ucywgTlVMTCwgJm51bVBhcnRpY2xlcyk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJFcnJvciBpbiBwYXJ0aWNsZSBmaWx0ZXIgb3BlcmF0aW9uIik7CisJcmV0dXJuIHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQ29sb3JJbWFnZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9Db2xvckltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcyZGEzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vQ29sb3JJbWFnZS5jcHAKQEAgLTAsMCArMSw0NjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVmlzaW9uL0NvbG9ySW1hZ2UuaCIKKworI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCitDb2xvckltYWdlOjpDb2xvckltYWdlKEltYWdlVHlwZSB0eXBlKSA6IEltYWdlQmFzZSh0eXBlKQoreworfQorCitDb2xvckltYWdlOjp+Q29sb3JJbWFnZSgpCit7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBvcGVyYXRpb24gb24gYSBDb2xvckltYWdlLgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBvcGVyYXRpb24gb24gYSBDb2xvckltYWdlIHVzaW5nIHRoZSBDb2xvck1vZGUgc3VwcGxpZWQKKyAqIGFzIGEgcGFyYW1ldGVyLgorICogQHBhcmFtIGNvbG9yTW9kZSBUaGUgdHlwZSBvZiBjb2xvcnNwYWNlIHRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgaW4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIGJpbmFyeSBpbWFnZQorICovCitCaW5hcnlJbWFnZSAqQ29sb3JJbWFnZTo6Q29tcHV0ZVRocmVzaG9sZChDb2xvck1vZGUgY29sb3JNb2RlLAorCQlpbnQgbG93MSwgaW50IGhpZ2gxLAorCQlpbnQgbG93MiwgaW50IGhpZ2gyLAorCQlpbnQgbG93MywgaW50IGhpZ2gzKQoreworCUJpbmFyeUltYWdlICpyZXN1bHQgPSBuZXcgQmluYXJ5SW1hZ2UoKTsKKwlSYW5nZSByYW5nZTEgPSB7bG93MSwgaGlnaDF9LAorCQlyYW5nZTIgPSB7bG93MiwgaGlnaDJ9LAorCQlyYW5nZTMgPSB7bG93MywgaGlnaDN9OworCQorCWludCBzdWNjZXNzID0gaW1hcUNvbG9yVGhyZXNob2xkKHJlc3VsdC0+R2V0SW1hcUltYWdlKCksIG1faW1hcUltYWdlLCAxLCBjb2xvck1vZGUsICZyYW5nZTEsICZyYW5nZTIsICZyYW5nZTMpOworCXdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiSW1hcVRocmVzaG9sZCBlcnJvciIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBSR0Igc3BhY2UuCisgKiBAcGFyYW0gcmVkTG93IFJlZCBsb3cgdmFsdWUKKyAqIEBwYXJhbSByZWRIaWdoIFJlZCBoaWdoIHZhbHVlCisgKiBAcGFyYW0gZ3JlZW5Mb3cgR3JlZW4gbG93IHZhbHVlCisgKiBAcGFyYW0gZ3JlZW5IaWdoIEdyZWVuIGhpZ2ggdmFsdWUKKyAqIEBwYXJhbSBibHVlTG93IEJsdWUgbG93IHZhbHVlCisgKiBAcGFyYW0gYmx1ZUhpZ2ggQmx1ZSBoaWdoIHZhbHVlCisgKiBAcmV0dXJucyBBIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUgdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZFJHQihpbnQgcmVkTG93LCBpbnQgcmVkSGlnaCwgaW50IGdyZWVuTG93LCBpbnQgZ3JlZW5IaWdoLCBpbnQgYmx1ZUxvdywgaW50IGJsdWVIaWdoKQoreworCXJldHVybiBDb21wdXRlVGhyZXNob2xkKElNQVFfUkdCLCByZWRMb3csIHJlZEhpZ2gsIGdyZWVuTG93LCBncmVlbkhpZ2gsIGJsdWVMb3csIGJsdWVIaWdoKTsKK30KKworLyoqCisgKiBQZXJmb3JtIGEgdGhyZXNob2xkIGluIFJHQiBzcGFjZS4KKyAqIEBwYXJhbSB0aHJlc2hvbGQgYSByZWZlcmVuY2UgdG8gdGhlIFRocmVzaG9sZCBvYmplY3QgdG8gdXNlLgorICogQHJldHVybnMgQSBwb2ludGVyIHRvIGEgQmluYXJ5SW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgdGhlIHRocmVzaG9sZCBvcGVyYXRpb24uCisgKi8KK0JpbmFyeUltYWdlICpDb2xvckltYWdlOjpUaHJlc2hvbGRSR0IoVGhyZXNob2xkICZ0KQoreworCXJldHVybiBDb21wdXRlVGhyZXNob2xkKElNQVFfUkdCLCB0LnBsYW5lMUxvdywgdC5wbGFuZTFIaWdoLAorCQkJCQkJCQl0LnBsYW5lMkxvdywgdC5wbGFuZTJIaWdoLAorCQkJCQkJCQl0LnBsYW5lM0xvdywgdC5wbGFuZTNIaWdoKTsKK30KKworLyoqCisgKiBQZXJmb3JtIGEgdGhyZXNob2xkIGluIEhTTCBzcGFjZS4KKyAqIEBwYXJhbSBodWVMb3cgTG93IHZhbHVlIGZvciBodWUKKyAqIEBwYXJhbSBodWVIaWdoIEhpZ2ggdmFsdWUgZm9yIGh1ZQorICogQHBhcmFtIHNhdHVyYXRpb25Mb3cgTG93IHZhbHVlIGZvciBzYXR1cmF0aW9uCisgKiBAcGFyYW0gc2F0dXJhdGlvbkhpZ2ggSGlnaCB2YWx1ZSBmb3Igc2F0dXJhdGlvbgorICogQHBhcmFtIGx1bWluZW5jZUxvdyBMb3cgdmFsdWUgZm9yIGx1bWluZW5jZQorICogQHBhcmFtIGx1bWluZW5jZUhpZ2ggSGlnaCB2YWx1ZSBmb3IgbHVtaW5lbmNlCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUgdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZEhTTChpbnQgaHVlTG93LCBpbnQgaHVlSGlnaCwgaW50IHNhdHVyYXRpb25Mb3csIGludCBzYXR1cmF0aW9uSGlnaCwgaW50IGx1bWluZW5jZUxvdywgaW50IGx1bWluZW5jZUhpZ2gpCit7CisJcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9IU0wsIGh1ZUxvdywgaHVlSGlnaCwgc2F0dXJhdGlvbkxvdywgc2F0dXJhdGlvbkhpZ2gsIGx1bWluZW5jZUxvdywgbHVtaW5lbmNlSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBIU0wgc3BhY2UuCisgKiBAcGFyYW0gdGhyZXNob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBUaHJlc2hvbGQgb2JqZWN0IHRvIHVzZS4KKyAqIEByZXR1cm5zIEEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZSB0aHJlc2hvbGQgb3BlcmF0aW9uLgorICovCitCaW5hcnlJbWFnZSAqQ29sb3JJbWFnZTo6VGhyZXNob2xkSFNMKFRocmVzaG9sZCAmdCkKK3sKKwlyZXR1cm4gQ29tcHV0ZVRocmVzaG9sZChJTUFRX0hTTCwgdC5wbGFuZTFMb3csIHQucGxhbmUxSGlnaCwKKwkJCQkJCQkJdC5wbGFuZTJMb3csIHQucGxhbmUySGlnaCwKKwkJCQkJCQkJdC5wbGFuZTNMb3csIHQucGxhbmUzSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBIU1Ygc3BhY2UuCisgKiBAcGFyYW0gaHVlTG93IExvdyB2YWx1ZSBmb3IgaHVlCisgKiBAcGFyYW0gaHVlSGlnaCBIaWdoIHZhbHVlIGZvciBodWUKKyAqIEBwYXJhbSBzYXR1cmF0aW9uTG93IExvdyB2YWx1ZSBmb3Igc2F0dXJhdGlvbgorICogQHBhcmFtIHNhdHVyYXRpb25IaWdoIEhpZ2ggdmFsdWUgZm9yIHNhdHVyYXRpb24KKyAqIEBwYXJhbSB2YWx1ZUxvdyBMb3cgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZUhpZ2ggSGlnaCB2YWx1ZQorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgQmluYXJ5SW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgdGhlIHRocmVzaG9sZCBvcGVyYXRpb24uCisgKi8KK0JpbmFyeUltYWdlICpDb2xvckltYWdlOjpUaHJlc2hvbGRIU1YoaW50IGh1ZUxvdywgaW50IGh1ZUhpZ2gsIGludCBzYXR1cmF0aW9uTG93LCBpbnQgc2F0dXJhdGlvbkhpZ2gsIGludCB2YWx1ZUxvdywgaW50IHZhbHVlSGlnaCkKK3sKKwlyZXR1cm4gQ29tcHV0ZVRocmVzaG9sZChJTUFRX0hTViwgaHVlTG93LCBodWVIaWdoLCBzYXR1cmF0aW9uTG93LCBzYXR1cmF0aW9uSGlnaCwgdmFsdWVMb3csIHZhbHVlSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBIU1Ygc3BhY2UuCisgKiBAcGFyYW0gdGhyZXNob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBUaHJlc2hvbGQgb2JqZWN0IHRvIHVzZS4KKyAqIEByZXR1cm5zIEEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZSB0aHJlc2hvbGQgb3BlcmF0aW9uLgorICovCitCaW5hcnlJbWFnZSAqQ29sb3JJbWFnZTo6VGhyZXNob2xkSFNWKFRocmVzaG9sZCAmdCkKK3sKKwlyZXR1cm4gQ29tcHV0ZVRocmVzaG9sZChJTUFRX0hTViwgdC5wbGFuZTFMb3csIHQucGxhbmUxSGlnaCwKKwkJCQkJCQkJdC5wbGFuZTJMb3csIHQucGxhbmUySGlnaCwKKwkJCQkJCQkJdC5wbGFuZTNMb3csIHQucGxhbmUzSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBIU0kgc3BhY2UuCisgKiBAcGFyYW0gaHVlTG93IExvdyB2YWx1ZSBmb3IgaHVlCisgKiBAcGFyYW0gaHVlSGlnaCBIaWdoIHZhbHVlIGZvciBodWUKKyAqIEBwYXJhbSBzYXR1cmF0aW9uTG93IExvdyB2YWx1ZSBmb3Igc2F0dXJhdGlvbgorICogQHBhcmFtIHNhdHVyYXRpb25IaWdoIEhpZ2ggdmFsdWUgZm9yIHNhdHVyYXRpb24KKyAqIEBwYXJhbSB2YWx1ZUxvdyBMb3cgaW50ZW5zaXR5CisgKiBAcGFyYW0gdmFsdWVIaWdoIEhpZ2ggaW50ZW5zaXR5CisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUgdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZEhTSShpbnQgaHVlTG93LCBpbnQgaHVlSGlnaCwgaW50IHNhdHVyYXRpb25Mb3csIGludCBzYXR1cmF0aW9uSGlnaCwgaW50IGludGVuc2l0eUxvdywgaW50IGludGVuc2l0eUhpZ2gpCit7CisJcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9IU0ksIGh1ZUxvdywgaHVlSGlnaCwgc2F0dXJhdGlvbkxvdywgc2F0dXJhdGlvbkhpZ2gsIGludGVuc2l0eUxvdywgaW50ZW5zaXR5SGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBIU0kgc3BhY2UuCisgKiBAcGFyYW0gdGhyZXNob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBUaHJlc2hvbGQgb2JqZWN0IHRvIHVzZS4KKyAqIEByZXR1cm5zIEEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZSB0aHJlc2hvbGQgb3BlcmF0aW9uLgorICovCitCaW5hcnlJbWFnZSAqQ29sb3JJbWFnZTo6VGhyZXNob2xkSFNJKFRocmVzaG9sZCAmdCkKK3sKKwlyZXR1cm4gQ29tcHV0ZVRocmVzaG9sZChJTUFRX0hTSSwgdC5wbGFuZTFMb3csIHQucGxhbmUxSGlnaCwKKwkJCQkJCQkJdC5wbGFuZTJMb3csIHQucGxhbmUySGlnaCwKKwkJCQkJCQkJdC5wbGFuZTNMb3csIHQucGxhbmUzSGlnaCk7Cit9CisKKy8qKgorICogRXh0cmFjdCBhIGNvbG9yIHBsYW5lIGZyb20gdGhlIGltYWdlCisgKiBAcGFyYW0gbW9kZSBUaGUgQ29sb3JNb2RlIHRvIHVzZSBmb3IgdGhlIHBsYW5lIGV4dHJhY3Rpb24KKyAqIEBwYXJhbSBwbGFuZU51bWJlciBXaGljaCBwbGFuZSBpcyB0byBiZSBleHRyYWN0ZWQKKyAqIEByZXR1cm5zIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIGV4dHJhY3RlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpFeHRyYWN0Q29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgaW50IHBsYW5lTnVtYmVyKQoreworCU1vbm9JbWFnZSAqcmVzdWx0ID0gbmV3IE1vbm9JbWFnZSgpOworCWlmIChtX2ltYXFJbWFnZSA9PSBOVUxMKQorCQl3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisJaW50IHN1Y2Nlc3MgPSBpbWFxRXh0cmFjdENvbG9yUGxhbmVzKG1faW1hcUltYWdlLCAKKwkJCQkJCQkJCQkgbW9kZSwgCisJCQkJCQkJCQkJIChwbGFuZU51bWJlciA9PSAxKSA/IHJlc3VsdC0+R2V0SW1hcUltYWdlKCkgOiBOVUxMLCAKKwkJCQkJCQkJCQkgKHBsYW5lTnVtYmVyID09IDIpID8gcmVzdWx0LT5HZXRJbWFxSW1hZ2UoKSA6IE5VTEwsIAorCQkJCQkJCQkJCSAocGxhbmVOdW1iZXIgPT0gMykgPyByZXN1bHQtPkdldEltYXFJbWFnZSgpIDogTlVMTCk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxIEV4dHJhY3RDb2xvclBsYW5lcyBmYWlsZWQiKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogRXh0cmFjdCB0aGUgZmlyc3QgY29sb3IgcGxhbmUgZm9yIGFuIGltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZQorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY3RlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpFeHRyYWN0Rmlyc3RDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlKQoreworCXJldHVybiBFeHRyYWN0Q29sb3JQbGFuZShtb2RlLCAxKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIHNlY29uZCBjb2xvciBwbGFuZSBmb3IgYW4gaW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjdGVkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkV4dHJhY3RTZWNvbmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlKQoreworCXJldHVybiBFeHRyYWN0Q29sb3JQbGFuZShtb2RlLCAyKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIHRoaXJkIGNvbG9yIHBsYW5lIGZvciBhbiBpbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUKKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWN0ZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6RXh0cmFjdFRoaXJkQ29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSkKK3sKKwlyZXR1cm4gRXh0cmFjdENvbG9yUGxhbmUobW9kZSwgMyk7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSByZWQgcGxhbmUgZnJvbSBhbiBSR0IgaW1hZ2UuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6R2V0UmVkUGxhbmUoKQoreworCXJldHVybiBFeHRyYWN0Rmlyc3RDb2xvclBsYW5lKElNQVFfUkdCKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIGdyZWVuIHBsYW5lIGZyb20gYW4gUkdCIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEdyZWVuUGxhbmUoKQoreworICAgIHJldHVybiBFeHRyYWN0U2Vjb25kQ29sb3JQbGFuZShJTUFRX1JHQik7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBibHVlIHBsYW5lIGZyb20gYW4gUkdCIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEJsdWVQbGFuZSgpCit7CisgICAgcmV0dXJuIEV4dHJhY3RUaGlyZENvbG9yUGxhbmUoSU1BUV9SR0IpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgSHVlIHBsYW5lIGZyb20gYW4gSFNMIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEhTTEh1ZVBsYW5lKCkKK3sKKwlyZXR1cm4gRXh0cmFjdEZpcnN0Q29sb3JQbGFuZShJTUFRX0hTTCk7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBIdWUgcGxhbmUgZnJvbSBhbiBIU1YgaW1hZ2UuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6R2V0SFNWSHVlUGxhbmUoKQoreworCXJldHVybiBFeHRyYWN0Rmlyc3RDb2xvclBsYW5lKElNQVFfSFNWKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIEh1ZSBwbGFuZSBmcm9tIGFuIEhTSSBpbWFnZS4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWNlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpHZXRIU0lIdWVQbGFuZSgpCit7CisJcmV0dXJuIEV4dHJhY3RGaXJzdENvbG9yUGxhbmUoSU1BUV9IU0kpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgTHVtaW5hbmNlIHBsYW5lIGZyb20gYW4gSFNMIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEx1bWluYW5jZVBsYW5lKCkKK3sKKwlyZXR1cm4gRXh0cmFjdFRoaXJkQ29sb3JQbGFuZShJTUFRX0hTTCk7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBWYWx1ZSBwbGFuZSBmcm9tIGFuIEhTViBpbWFnZS4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWNlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpHZXRWYWx1ZVBsYW5lKCkKK3sKKwlyZXR1cm4gRXh0cmFjdFRoaXJkQ29sb3JQbGFuZShJTUFRX0hTVik7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBJbnRlbnNpdHkgcGxhbmUgZnJvbSBhbiBIU0kgaW1hZ2UuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6R2V0SW50ZW5zaXR5UGxhbmUoKQoreworCXJldHVybiBFeHRyYWN0VGhpcmRDb2xvclBsYW5lKElNQVFfSFNJKTsKK30KKworLyoqCisgKiBSZXBsYWNlIGEgcGxhbmUgaW4gdGhlIENvbG9ySW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZQorICogUmVwbGFjZXMgYSBzaW5nbGUgcGxhbmUgaW4gdGhlIGltYWdlIHdpdGggYSBNb25vSW1hZ2UKKyAqIEBwYXJhbSBtb2RlIFRoZSBDb2xvck1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZQorICogQHBhcmFtIHBsYW5lIFRoZSBwb2ludGVyIHRvIHRoZSByZXBsYWNlbWVudCBwbGFuZSBhcyBhIE1vbm9JbWFnZQorICogQHBhcmFtIHBsYW5lTnVtYmVyIFRoZSBwbGFuZSBudW1iZXIgKDEsIDIsIDMpIHRvIHJlcGxhY2UKKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlUGxhbmUoQ29sb3JNb2RlIG1vZGUsIE1vbm9JbWFnZSAqcGxhbmUsIGludCBwbGFuZU51bWJlcikgeworCWludCBzdWNjZXNzID0gaW1hcVJlcGxhY2VDb2xvclBsYW5lcyhtX2ltYXFJbWFnZSwgCisJCQkJCQkJCQkJIChjb25zdCBJbWFnZSopIG1faW1hcUltYWdlLCAKKwkJCQkJCQkJCSAgICAgbW9kZSwgCisJCQkJCQkJCQkgICAgIChwbGFuZU51bWJlciA9PSAxKSA/IHBsYW5lLT5HZXRJbWFxSW1hZ2UoKSA6IE5VTEwsIAorCQkJCQkJCQkJICAgICAocGxhbmVOdW1iZXIgPT0gMikgPyBwbGFuZS0+R2V0SW1hcUltYWdlKCkgOiBOVUxMLCAKKwkJCQkJCQkJCSAgICAgKHBsYW5lTnVtYmVyID09IDMpID8gcGxhbmUtPkdldEltYXFJbWFnZSgpIDogTlVMTCk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxIFJlcGxhY2VDb2xvclBsYW5lcyBmYWlsZWQiKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBmaXJzdCBjb2xvciBwbGFuZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlRmlyc3RDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlLCBNb25vSW1hZ2UgKnBsYW5lKQoreworCVJlcGxhY2VQbGFuZShtb2RlLCBwbGFuZSwgMSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgc2Vjb25kIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VTZWNvbmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlLCBNb25vSW1hZ2UgKnBsYW5lKQoreworCVJlcGxhY2VQbGFuZShtb2RlLCBwbGFuZSwgMik7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgdGhpcmQgY29sb3IgcGxhbmUgd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZVRoaXJkQ29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSkKK3sgCisJUmVwbGFjZVBsYW5lKG1vZGUsIHBsYW5lLCAzKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSByZWQgY29sb3IgcGxhbmUgd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZVJlZFBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJUmVwbGFjZUZpcnN0Q29sb3JQbGFuZShJTUFRX1JHQiwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIGdyZWVuIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VHcmVlblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJUmVwbGFjZVNlY29uZENvbG9yUGxhbmUoSU1BUV9SR0IsIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBibHVlIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VCbHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSkKK3sKKwlSZXBsYWNlVGhpcmRDb2xvclBsYW5lKElNQVFfUkdCLCBwbGFuZSk7Cit9CisKKworLyoqCisgKiBSZXBsYWNlIHRoZSBIdWUgY29sb3IgcGxhbmUgaW4gYSBIU0wgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUhTTEh1ZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJcmV0dXJuIFJlcGxhY2VGaXJzdENvbG9yUGxhbmUoSU1BUV9IU0wsIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBIdWUgY29sb3IgcGxhbmUgaW4gYSBIU1YgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUhTVkh1ZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJcmV0dXJuIFJlcGxhY2VGaXJzdENvbG9yUGxhbmUoSU1BUV9IU1YsIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBmaXJzdCBIdWUgcGxhbmUgaW4gYSBIU0kgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IgcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUhTSUh1ZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJcmV0dXJuIFJlcGxhY2VGaXJzdENvbG9yUGxhbmUoSU1BUV9IU0ksIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBTYXR1cmF0aW9uIGNvbG9yIHBsYW5lIGluIGFuIEhTTCBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlSFNMU2F0dXJhdGlvblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJcmV0dXJuIFJlcGxhY2VTZWNvbmRDb2xvclBsYW5lKElNQVFfSFNMLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgU2F0dXJhdGlvbiBjb2xvciBwbGFuZSBpbiBhIEhTViBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlSFNWU2F0dXJhdGlvblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJcmV0dXJuIFJlcGxhY2VTZWNvbmRDb2xvclBsYW5lKElNQVFfSFNWLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgU2F0dXJhdGlvbiBjb2xvciBwbGFuZSBpbiBhIEhTSSBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlSFNJU2F0dXJhdGlvblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpCit7CisJcmV0dXJuIFJlcGxhY2VTZWNvbmRDb2xvclBsYW5lKElNQVFfSFNJLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgTHVtaW5hbmNlIGNvbG9yIHBsYW5lIGluIGFuIEhTTCBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlTHVtaW5hbmNlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSkKK3sKKwlyZXR1cm4gUmVwbGFjZVRoaXJkQ29sb3JQbGFuZShJTUFRX0hTTCwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIFZhbHVlIGNvbG9yIHBsYW5lIGluIGFuIEhTViB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvciBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlVmFsdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCXJldHVybiBSZXBsYWNlVGhpcmRDb2xvclBsYW5lKElNQVFfSFNWLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgSW50ZW5zaXR5IGNvbG9yIHBsYW5lIGluIGEgSFNJIGltYWdlIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VJbnRlbnNpdHlQbGFuZShNb25vSW1hZ2UgKnBsYW5lKQoreworCXJldHVybiBSZXBsYWNlVGhpcmRDb2xvclBsYW5lKElNQVFfSFNJLCBwbGFuZSk7Cit9CisKKy8vVE9ETzogZnJjQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbG9yRXF1YWxpemF0aW9uKSBuZWVkcyB0byBiZSBtb2RpZmllZAorLy9UaGUgY29sb3JFcXVhbGl6YXRpb24gcGFyYW1ldGVyIGlzIGRpc2NhcmRlZCBhbmQgaXMgc2V0IHRvIFRSVUUgaW4gdGhlIGNhbGwgdG8gaW1hcUNvbG9yRXF1YWxpemUuCit2b2lkIENvbG9ySW1hZ2U6OkVxdWFsaXplKGJvb2wgYWxsUGxhbmVzKQoreworCS8vIE5vdGUgdGhhdCB0aGlzIGNhbGwgdXNlcyBOSS1kZWZpbmVkIFRSVUUgYW5kIEZBTFNFCisJaW50IHN1Y2Nlc3MgPSBpbWFxQ29sb3JFcXVhbGl6ZShtX2ltYXFJbWFnZSwgKGNvbnN0IEltYWdlKikgbV9pbWFxSW1hZ2UsIChhbGxQbGFuZXMpID8gVFJVRSA6IEZBTFNFKTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkltYXEgQ29sb3JFcXVhbGl6ZSBlcnJvciIpOworfQorCit2b2lkIENvbG9ySW1hZ2U6OkNvbG9yRXF1YWxpemUoKQoreworCUVxdWFsaXplKHRydWUpOworfQorCit2b2lkIENvbG9ySW1hZ2U6Okx1bWluYW5jZUVxdWFsaXplKCkKK3sKKwlFcXVhbGl6ZShmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9GcmNFcnJvci5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9GcmNFcnJvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5ZGVhNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0ZyY0Vycm9yLmNwcApAQCAtMCwwICsxLDEyMjcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIAorI2luY2x1ZGUgIm5pdmlzaW9uLmgiIAorI2luY2x1ZGUgIlZpc2lvbi9GcmNFcnJvci5oIiAKKworLyoqCisgKiBHZXQgdGhlIGVycm9yIGNvZGUgcmV0dXJuZWQgZnJvbSB0aGUgTkkgVmlzaW9uIGxpYnJhcnkKKyAqIEByZXR1cm4gVGhlIGxhc3QgZXJyb3IgY29kZS4KKyAqLworaW50IEdldExhc3RWaXNpb25FcnJvcigpCit7CisJLy9pbnQgZXJyb3JDb2RlID0gaW1hcUdldExhc3RWaXNpb25FcnJvcigpOyAgICAgLy8gZXJyb3IgY29kZTogMCA9IG5vIGVycm9yCQorCS8vY2hhciogZXJyb3JUZXh0ID0gR2V0VmlzaW9uRXJyb3JUZXh0KGVycm9yQ29kZSk7CisJLy9kcHJpbnRmIChMT0dfREVCVUcsICJFcnJvciA9ICVpICAlcyAiLCBlcnJvckNvZGUsIGVycm9yVGV4dCk7CisJcmV0dXJuIGltYXFHZXRMYXN0RXJyb3IoKTsKK30KKwkKKy8qKgorKiBHZXQgdGhlIGVycm9yIHRleHQgZm9yIGFuIE5JIFZpc2lvbiBlcnJvciBjb2RlLgorKiBOb3RlOiBpbWFxR2V0RXJyb3JUZXh0KCkgaXMgbm90IHN1cHBvcnRlZCBvbiByZWFsIHRpbWUgc3lzdGVtLCBzbworKiBzbyByZWxldmFudCBzdHJpbmdzIGFyZSBoYXJkY29kZWQgaGVyZSAtIHRoZSBtYWludGFpbmVkIHZlcnNpb24gaXMKKyogaW4gdGhlIExhYldpbmRvd3MvQ1ZJIGhlbHAgZmlsZS4KKyogQHBhcmFtIGVycm9yQ29kZSBUaGUgZXJyb3IgY29kZSB0byBmaW5kIHRoZSB0ZXh0IGZvci4KKyogQHJldHVybiBUaGUgZXJyb3IgdGV4dAorKi8KK2NvbnN0IGNoYXIqIEdldFZpc2lvbkVycm9yVGV4dChpbnQgZXJyb3JDb2RlKQoreworCWNvbnN0IGNoYXIqIGVycm9yVGV4dDsKKworCXN3aXRjaCAoZXJyb3JDb2RlKQorCXsKKwkJZGVmYXVsdDoKKwkJCXsgZXJyb3JUZXh0ID0gIlVOS05PV05fRVJST1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTEzODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfUkVHSU9OX1RPT19TTUFMTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTM5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lNQVFfUVJfRElNRU5TSU9OX0lOVkFMSUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQ0hBUl9SRVBPUlRfQ09SUlVQVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX05PX1RFWFRfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9RUl9ERVRFQ1RJT05fTU9ERUxUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUVJfREVURUNUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9RUl9JTlZBTElEX0JBUkNPREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9RUl9JTlZBTElEX1JFQUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9RUl9ERVRFQ1RJT05fVkVSU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTQ3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfUlNTTElNSVRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTQ4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09WRVJMQVlfR1JPVVBfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRFVQTElDQVRFX1RSQU5TRk9STV9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0NPUlJFQ1RJT05fRkFJTEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX09SSUVOVF9ERVRFQ1RfRkFJTEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX1NLRVdfREVURUNUX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTU4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NPTlRSQVNUTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTU5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX1RPTEVSQU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX01BWFBPSU5UU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTYxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NPUlJFQ1RJT05MRVZFTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTYyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NPUlJFQ1RJT05NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQ0hBUkFDVEVSUFJFRkVSRU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTY0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9BRERfV09SRF9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfV1RTX0RJUl9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQklOX0RJUl9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9PVVRQVVRERUxJTUlURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9BVVRPQ09SUkVDVElPTk1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9SRUNPR05JVElPTk1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9DSEFSQUNURVJUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOSV9GSUxFX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTcyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NIQVJBQ1RFUlNFVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTczOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0xBTkdVQUdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQVVUT09SSUVOVE1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQkFEX1VTRVJfRElDVElPTkFSWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9SRUNPR05JVElPTl9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfUFJFUFJPQ0VTU0lOR19GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9QQVJBTUVURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIwMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfTE9BRF9MSUJSQVJZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0xJQl9JTklUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0NBTk5PVF9NQVRDSF9URVhUX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0JBRF9URVhUX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX1RFTVBMQVRFX1dST05HX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIzMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9JTUFHRV9UT09fTEFSR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIzNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9JTUFHRV9UT09fU01BTEwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIzNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9JTUFHRV9DT05UUkFTVF9UT09fTE9XIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NISUZUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjQwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjQxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfTk9ST1RBVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjQyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfUk9UQVRJT05fQU5HTEVfUkFOR0VTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9UQVRJT05fQU5HTEVfUkFOR0VfVE9PX0xBUkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUFUQ0hfU0VUVVBfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjUxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjUyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xFQVJOX1NFVFVQX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI1MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xFQVJOX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI1NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9FVkVOX1dJTkRPV19TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FREdFX0RJUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjU4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9GSUxURVJfV0lEVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9IRUFQX1RSQVNIRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9HSVBfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9MQ0RfQkFEX01BVENIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTENEX05PX1NFR01FTlRTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjY3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTVBMRVhfUk9PVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjY4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xJTkVBUl9DT0VGRiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjY5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05VTExfUE9JTlRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjcwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJVl9CWV9aRVJPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CUk9XU0VSX0lNQUdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTElORVNfUEFSQUxMRUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI3NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NIRUNLU1VNIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTENEX05PVF9OVU1FUklDIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9JX05PVF9QT0xZR09OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9JX05PVF9SRUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU1BR0VfU01BTExFUl9USEFOX0JPUkRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTlRfRFJBV19JTlRPX1ZJRVdFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUkFLRV9ESVJFQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI4NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfUFJPQ0VTUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjg1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU1BPS0VfRElSRUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT05DRU5UUklDX1JBS0VfRElSRUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MSU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfU0hBUEVNQVRDSF9CQURURU1QTEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NIQVBFTUFUQ0hfQkFESU1BR0VEQVRBIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUE9JTlRTX0FSRV9DT0xMSU5FQVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT05UT1VSSURfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09OVE9VUl9JTkRFWF9PVVRfT0ZfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI5NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfSU5URVJQT0xBVEVQT0lOVFMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI5NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JBUkNPREVUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRUlORk9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09NUExFWFBMQU5FX05PVF9SRUFMX09SX0lNQUdJTkFSWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjk5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09NUExFWFBMQU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NRVRFUkFSQ01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0lfTk9UXzJfTElORVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1RIUkVTSE9MRE1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzAzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTlVNX09GX0NMQVNTRVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVEhUUkFOU0ZPUk1NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1JFRkVSRU5DRU1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1RPT0wiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9QUkVDSVNJT05fTk9UX0dUUl9USEFOXzAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTE9SU0VOU0lUSVZJVFkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dJTkRPV19USFJFQURfUE9MSUNZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQUxFVFRFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMxMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTE9SX1NQRUNUUlVNIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTENEX0NBTElCUkFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzEzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1dSSVRFX0ZJTEVfTk9UX1NVUFBPUlRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzE2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfS0VSTkVMX0NPREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMxNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9VTkRFRl9QT0lOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzE4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOU0ZfUE9JTlRTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVUJQSVhfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzIwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0VNUFRZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NT1JQSE9MT0dZTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9URVhUQUxJR05NRU5UIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9GT05UQ09MT1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMyNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NIQVBFTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzI1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRFJBV01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMyNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RSQVdNT0RFX0ZPUl9MSU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TQ0FMSU5HTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzI4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzI5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfT1VUTElORU1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzMwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQk9SREVSX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMzMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JPUkRFUk1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzMyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09NUEFSRUZVTkNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9WRVJUSUNBTF9URVhUX0FMSUdOTUVOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzM0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09OVkVSU0lPTlNUWUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElTUEFUQ0hfU1RBVFVTX0NPTkZMSUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5LTk9XTl9BTEdPUklUSE0iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM0MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NJWkVUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9GSUxFTkFNRV9OVUxMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9GTElQQVhJUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQ2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRF9GT1JfUk9UQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8zRERJUkVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQ4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfM0RQTEFORSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQ5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0tFTEVUT05NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM1MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1ZJU0lPTl9JTkZPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SRUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9GRUFUVVJFX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM1MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NFQVJDSF9TVFJBVEVHWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzU0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfV0VJR0hUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OVU1fTUFUQ0hFU19SRVFVRVNURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM1NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTl9NQVRDSF9TQ09SRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzU3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfSUdOT1JFX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT01QTEVYX1BMQU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVEVFUE5FU1MiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dJRFRIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVUJTQU1QTElOR19SQVRJTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzY0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lHTk9SRV9DT0xPUl9TUEVDVFJVTV9TRVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU1BFQ1RSVU0iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU0hBUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PUk9UQVRJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8yIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NISUZUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzc5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzgwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzgxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzg0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9ST1RBVElPTl9SRVFVSVJFU19TSEFQRV9GRUFUVVJFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfTUFUQ0hfU0VUVVBfREFUQV9TSEFQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzg3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX01BVENIX1NFVFVQX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9MRUFSTl9TRVRVUF9EQVRBX1NIQVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzODk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfTEVBUk5fU0VUVVBfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzkwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0lNQUdFX0xVTUlOQU5DRV9DT05UUkFTVF9UT09fTE9XIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfSFVFX0NPTlRSQVNUX1RPT19MT1ciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9UT09fTEFSR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9UT09fU01BTEwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9TUEVDVFJVTV9NQVNLIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfSU1BR0VfUkVRVUlSRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT01QTEVYX0lNQUdFX1JFUVVJUkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTVVMVElDT1JFX0lOVkFMSURfQVJHVU1FTlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9NVUxUSUNPUkVfT1BFUkFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRDSEZBQ1RPUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDAyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYUE9JTlRTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRVhUUkFJTkZPX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfRk9SX1VOV1JBUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDA1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVEVYVE9SSUVOVEFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09PUkRTWVNfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT05UUkFTVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDA4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfREVURUNUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NVQlBJWEVMX0RJVklTSU9OUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSUNPTlNfUEVSX0xJTkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU0OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9PQkpFQ1RTX1RPX1ZFUklGWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTUwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1ZBTFVFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfUkVOQU1FX1JFRkNIQVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9OT1RfQV9WQUxJRF9DSEFSQUNURVJfU0VUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9NSU5fQk9VTkRJTkdfUkVDVF9IRUlHSFQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1JFQURfUkVTT0xVVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfU1BBQ0lOR19SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQk9VTkRJTkdfUkVDVF9IRUlHSFRfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0JPVU5ESU5HX1JFQ1RfV0lEVEhfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9TSVpFX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9SRUFEX09QVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfT0JKRUNUX0lOREVYIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfQ0hBUkFDVEVSUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTYyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0JPT0xFQU5fVkFMVUVfRk9SX1NUUklOR19BVFRSSUJVVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9VTkxJQ0VOU0VEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NjQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9QUkVERUZJTkVEX0NIQVJBQ1RFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTY1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX01VU1RfQkVfU0lOR0xFX0NIQVJBQ1RFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTY2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0JPT0xFQU5fVkFMVUVfRk9SX0lOVEVHRVJfQVRUUklCVVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1Njc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfU1RSSU5HX1ZBTFVFX0ZPUl9CT09MRUFOX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTY4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX1NUUklOR19WQUxVRV9GT1JfSU5URUdFUl9BVFRSSUJVVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTcwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVEVHRVJfVkFMVUVfRk9SX0JPT0xFQU5fQVRUUklCVVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfR0VUX09OTFlfQVRUUklCVVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5URUdFUl9WQUxVRV9GT1JfU1RSSU5HX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTczOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NFVF9GSUxFX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9DSEFSQUNURVJfU0VUX0RFU0NSSVBUSU9OX1RPT19MT05HIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfRVJPU0lPTlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9DSEFSQUNURVJfVkFMVUVfVE9PX0xPTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9DSEFSQUNURVJfVkFMVUVfQ0FOTk9UX0JFX0VNUFRZU1RSSU5HIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1Nzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0VUX0ZJTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0FTUEVDVF9SQVRJTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTgwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUlOX0JPVU5ESU5HX1JFQ1RfV0lEVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX01BWF9WRVJUX0VMRU1FTlRfU1BBQ0lORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUFYX0hPUklaX0VMRU1FTlRfU1BBQ0lORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUlOX0NIQVJfU1BBQ0lORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTg0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfVEhSRVNIT0xEX0xJTUlUUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTg1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfVVBQRVJfVEhSRVNIT0xEX0xJTUlUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1ODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9MT1dFUl9USFJFU0hPTERfTElNSVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTg4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfSElHSF9USFJFU0hPTERfVkFMVUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0xPV19USFJFU0hPTERfVkFMVUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9WQUxJRF9DSEFSQUNURVJfUE9TSVRJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfSU5ERVgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1JFQURfU1RSQVRFR1kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9CTE9DS1MiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1NVQlNUSVRVVElPTl9DSEFSQUNURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTk3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX05PVF9BX1ZBTElEX1NFU1NJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0FDQ0VQVEFOQ0VfTEVWRUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTkZPX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjAxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRURHRV9USFJFU0hPTEQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTklNVU1fQ1VSVkVfTEVOR1RIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ST1dfU1RFUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjA0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MVU1OX1NURVAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWElNVU1fRU5EX1BPSU5UX0dBUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjA2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFU19UT19NQVRDSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjA3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYSU1VTV9GRUFUVVJFU19QRVJfTUFUQ0giO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NVQlBJWEVMX0lURVJBVElPTlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NVQlBJWEVMX1RPTEVSQU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU5JVElBTF9NQVRDSF9MSVNUX0xFTkdUSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjExOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9SRUNUQU5HTEVfRElNRU5TSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfUkFESVVTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfTEVOR1RIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfQVNQRUNUX1JBVElPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfU1RSRU5HVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYxNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfRklMVEVSX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYxNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX05VTUJFUl9PRl9GRUFUVVJFU19SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjE4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX1NDQUxFX1JBTkdFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjE5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX09DQ0xVU0lPTl9SQU5HRVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NVUlZFX0VYVFJBQ1RJT05fTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjIxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTEVBUk5fR0VPTUVUUklDX1BBVFRFUk5fU0VUVVBfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjIyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hfR0VPTUVUUklDX1BBVFRFUk5fU0VUVVBfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjIzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTEVfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX09DQ0xVU0lPTl9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjI1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hfQ09OU1RSQUlOVF9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9UX0VOT1VHSF9URU1QTEFURV9GRUFUVVJFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjI3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PVF9FTk9VR0hfVEVNUExBVEVfRkVBVFVSRVNfMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjI4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfR0VPTUVUUklDX01BVENISU5HX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2Mjk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhJTVVNX1BJWEVMX0RJU1RBTkNFX0ZST01fTElORSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjMwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYSU1VTV9GRUFUVVJFU19MRUFSTkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0VQQVJBVElPTl9ESVNUQU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjMyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOX01BVENIX1NFUEFSQVRJT05fQU5HTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYzMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTl9NQVRDSF9TRVBBUkFUSU9OX1NDQUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhfTUFUQ0hfT1ZFUkxBUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0hBUEVfREVTQ1JJUFRPUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2Mzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSEFSRFdBUkVfRE9FU05UX1NVUFBPUlRfTk9OVEVBUklORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRklMTF9TVFlMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSEFUQ0hfU1RZTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9UT09fTUFOWV9aT05FUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RVUExJQ0FURV9MQUJFTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xBQkVMX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTlVNQkVSX09GX01BVENIX09QVElPTlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9MQUJFTF9UT09fTE9ORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQ1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTlVNQkVSX09GX0xBQkVMUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQ2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX1RFTVBMQVRFX1RPX0xFQVJOIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NVUxUSVBMRV9HRU9NRVRSSUNfVEVNUExBVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9OT1RfTEVBUk5FRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQ5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfR0VPTUVUUklDX0ZFQVRVUkVfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjUwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NVUlZFX0VYVFJBQ1RJT05fTU9ERV9NVVNUX0JFX1NBTUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY1MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9FREdFX0ZJTFRFUl9TSVpFX01VU1RfQkVfU0FNRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjUyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09QRU5JTkdfTkVXRVJfR0VPTUVUUklDX01BVENISU5HX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9NVUxUSVBMRV9HRU9NRVRSSUNfVEVNUExBVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY1NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9HUkFESU5HX0lORk9STUFUSU9OX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0VOQUJMRV9DQUxJQlJBVElPTl9TVVBQT1JUX01VU1RfQkVfU0FNRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NNT09USF9DT05UT1VSU19NVVNUX0JFX1NBTUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9SRVFVSVJFU19XSU4yMDAwX09SX05FV0VSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRSSVhfU0laRV9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzAyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTEVOR1RIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9UWVBFX09GX0ZMQVRURU4iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTVBSRVNTSU9OX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9EQVRBX0NPUlJVUFRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzA2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9TRVNTSU9OX0FMUkVBRFlfT1BFTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzA3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9XUklURV9TRVNTSU9OX1JFUVVJUkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQVZJX1JFQURfU0VTU0lPTl9SRVFVSVJFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzA5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9VTk9QRU5FRF9TRVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfUEFSVElDTEVTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9UX0VOT1VHSF9SRUdJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfV1JPTkdfUkVHSU9OX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9WQUxVRV9OT1RfSU5fRU5VTSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzE0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQVhJU19PUklFTlRBVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzE1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ0FMSUJSQVRJT05fVU5JVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzE2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTElOR19NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTEFCX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQURfUk9JX0JPWCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzIwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9ST0kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcyMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JJVF9ERVBUSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzIyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NMQVNTSUZJRVJfQ0xBU1NJRllfSU1BR0VfV0lUSF9DVVNUT01fU0VTU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzIzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NVU1RPTURBVEFfS0VZX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzI0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NVU1RPTURBVEFfSU5WQUxJRF9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfREFUQV9WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUFUQ0hGQUNUT1JfT0JTT0xFVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcyNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9VTlNVUFBPUlRFRF8yRF9CQVJDT0RFX1NFQVJDSF9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3Mjg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX1NFQVJDSF9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVFJJR19USU1FT1VUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRExMX0ZVTkNUSU9OX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzU3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RMTF9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CT0FSRF9OT1RfT1BFTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JPQVJEX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzYyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTklCTEFDS19ERVZJQVRJT05fRkFDVE9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OT1JNQUxJWkFUSU9OX01FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzY2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RFUFJFQ0FURURfRlVOQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FMSUdOTUVOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzY4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfVEhJQ0tORVNTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9JTlNQRUNUSU9OX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9JTlNQRUNUSU9OX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SRUdJU1RSQVRJT05fTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9fREVTVF9JTUFHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzc0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX0xBQkVMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9JX0hBU19PUEVOX0NPTlRPVVJTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9VU0VfT0ZfQ09NUEFDVF9TRVNTSU9OX0ZJTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc3NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTkNPTVBBVElCTEVfQ0xBU1NJRklFUl9UWVBFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfS0VSTkVMX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU5OT1RfQ09NUEFDVF9VTlRSQUlORUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DTEFTU0lGSUVSX0lOVkFMSURfRU5HSU5FX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ERVNDUklQVElPTl9UT09fTE9ORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9TQU1QTEVfSU5ERVgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xJTUlUUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzg1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX1BBUlRJQ0xFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRV9PUFRJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DTEFTU0lGSUVSX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OT19TQU1QTEVTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9DTEFTU0lGSUVSX1NFU1NJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RJU1RBTkNFX01FVFJJQyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NMQVNTSUZJRVJfSU5WQUxJRF9TRVNTSU9OX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DTEFTU0lGSUVSX1NFU1NJT05fTk9UX1RSQUlORUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX09QRVJBVElPTl9PTl9DT01QQUNUX1NFU1NJT05fQVRURU1QVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfS19UT09fSElHSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0tfVE9PX0xPVyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfS05OX01FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ0xBU1NJRklFUl9TRVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DVVNUT01fU0FNUExFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5URVJOQUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTgwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9QUk9URUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4MDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfQ09OVE9VUlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTgzNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTVBSRVNTSU9OX1JBVElPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4NDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFEX0lOREVYIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4NzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9QSEFSTUFDT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4NzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5TVVBQT1JURURfQ09MT1JfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODc3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9STU9ERV9SRVFVSVJFU19DSEFOR0VDT0xPUlNQQUNFMiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1BST1BfTk9ERV9XUklURV9OT1RfU1VQUE9SVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4Nzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFEX01FQVNVUkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTg4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9QQVJUSUNMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTIwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05VTUJFUl9DTEFTUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTUzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfV0FWRUxFVF9UUkFOU0ZPUk1fTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUVVBTlRJWkFUSU9OX1NURVBfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYX1dBVkVMRVRfVFJBTlNGT1JNX0xFVkVMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9RVUFMSVRZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQVJSQVlfU0laRV9NSVNNQVRDSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1dJTkRPV19JRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NSRUFURV9XSU5ET1ciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTklUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9PRkZTRVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk3MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX0VOVU1FUkFURV9GSUxURVJTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSlBFRzIwMDBfVU5TVVBQT1JURURfTVVMVElQTEVfTEFZRVJTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5TVVBQT1JURURfSlBFRzIwMDBfQ09MT1JTUEFDRV9NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk3NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9BVklfVElNRU9VVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTc2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05VTUJFUl9PRl9QQUxFVFRFX0NPTE9SUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTc3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5Nzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRV9OVU1CRVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFX0lORk8iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT01fSU5JVElBTElaRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTgxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOU1VGRklDSUVOVF9CVUZGRVJfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRlJBTUVTX1BFUl9TRUNPTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX05PX1NQQUNFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5ODQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9JTlZBTElEX0RBVEFfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTg1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfT1BFUkFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5ODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9GT1JNQVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0VPRiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTg4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfV1JJVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX1JFQUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0dFVF9JTkZPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9JTlZBTElEX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX1BFUk1JU1NJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0lPX0VSUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTk0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfVE9PX01BTllfT1BFTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTk1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9PUEVOIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9BUkdFUlIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0NPTE9SX1RBQkxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9GSUxFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0ZJTEVfSEVBREVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfQVZJX1NFU1NJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MSU5FR0FVR0VNRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAwMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9BVklfREFUQV9FWENFRURTX0JVRkZFUl9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWF9DRVJUSUZJQ0FUSU9OX0ZBSUxVUkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FWSV9TRVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWF9VTktOT1dOX0NPTVBSRVNTSU9OX0ZJTFRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDA3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfSU5DT01QQVRJQkxFX0NPTVBSRVNTSU9OX0ZJTFRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDA4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfTk9fRklMVEVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRlJBTUVfTlVNQkVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUlBDX0JJTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9SUENfRVhFQ1VURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDEzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVklERU9fTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVklERU9fQkxJVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JQQ19FWEVDVVRFX0lWQiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX1ZJREVPX0RSSVZFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09QRU5JTkdfTkVXRVJfQUlNX0dSQURJTkdfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRURHRV9QT0xBUklUWV9TRUFSQ0hfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVEhSRVNIT0xEX1BFUkNFTlRBR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAyMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0dSQURJTkdfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDIxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfS0VSTkVMX1NJWkVfRk9SX0VER0VfREVURUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TRUFSQ0hfTU9ERV9GT1JfU1RSQUlHSFRfRURHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDIzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQU5HTEVfVE9MX0ZPUl9TVFJBSUdIVF9FREdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMjQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5fQ09WRVJBR0VfRk9SX1NUUkFJR0hUX0VER0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAyNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FOR0xFX1JBTkdFX0ZPUl9TVFJBSUdIVF9FREdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QUk9DRVNTX1RZUEVfRk9SX0VER0VfREVURUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVERVNDUklQVE9SX1JPVEFUSU9OX1NFQVJDSFNUUkFURUdZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVERVNDUklQVE9SX0xFQVJOU0VUVVBEQVRBIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVJTUFHRV9FREdFSU5GTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDM1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFSU1BR0VfTk9DSVJDTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAzNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NLRUxFVE9OTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDM3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RJTUVPVVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAzODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSU5EX0NPT1JEU1lTX01PUkVfVEhBTl9PTkVfRURHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDM5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lPX0VSUk9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRFJJVkVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfQ09OVFJBU1QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfQ0VMTF9TSEFQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDQ0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TSEFQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDQ1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TVUJUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NPTlRSQVNUX0ZPUl9ST0kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xJTkVBUl9BVkVSQUdFX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NFTExfU0FNUExFX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVFJJWF9QT0xBUklUWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDUwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRUNDX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NFTExfRklMVEVSX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RFTU9EVUxBVElPTl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CT1JERVJfSU5URUdSSVRZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DRUxMX0ZJTExfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQVNQRUNUX1JBVElPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRSSVhfTUlSUk9SX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NFQVJDSF9WRUNUT1JfV0lEVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1JPVEFUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWF9JVEVSQVRJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSlBFRzIwMDBfTE9TU0xFU1NfV0lUSF9GTE9BVElOR19QT0lOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDYxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfV0lORE9XX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1RPTEVSQU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDYzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0VYVEVSTkFMX0FMSUdOTUVOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDY0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0VYVEVSTkFMX05PVF9TVVBQT1JURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU5UX1JFU0laRV9FWFRFUk5BTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDY2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUE9JTlRTWU1CT0wiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTUFHRVNfTk9UX0RJRkYiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDY5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDcwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRlVOQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NDQU5fRElSRUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CT1JERVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9NQVNLX09VVFNJREVfSU1BR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTkNPTVBfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDc1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPT1JEX1NZU19TRUNPTkRfQVhJUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDc2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPT1JEX1NZU19GSVJTVF9BWElTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5DT01QX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01FVEFGSUxFX0hBTkRMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDgwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU1BR0VfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDgxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9QQVNTV09SRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1BBTEVUVEVfTk9UX1NVUFBPUlRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1RJTUVPVVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19ERUxFVEVfVElNRVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19JTklUX1RJTUVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfU1RBUlRfVElNRVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19TVE9QX1RJTUVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfUkVJTklUSUFMSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfRU5BQkxFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX1VOSU5JVElBTElaRURfRU5BQkxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfTk9OX0VNUFRZX0lOSVRJQUxJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9MT0NLRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9DQU5OT1RfVU5MT0NLIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fRFVQTElDQVRFX1JFRkVSRU5DRV9QT0lOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDk2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PVF9BTl9PQkpFQ1QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFX1BBUkFNRVRFUl9WQUxVRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDk4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JFU0VSVkVEX01VU1RfQkVfTlVMTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDk5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fU0lNUExFX1RSQU5TRk9STSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTAwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fUEVSU1BFQ1RJVkVfUFJPSkVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTAxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fTUlDUk9fUExBTkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzYiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9FUlJPUk1BUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTA5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lOVkFMSURfU0NBTElOR19GQUNUT1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9GQUlMRURfVE9fRklORF9HUklEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5DT01QX01BVFJJWF9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU1BR0VfVU5DQUxJQlJBVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5WQUxJRF9ST0kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTUFHRV9DT1JSRUNURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTlNGX1BPSU5UUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTE3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX01BVFJJWF9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVEVQX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DVVNUT01EQVRBX0lOVkFMSURfS0VZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9UX0lNQUdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfU0FUVVJBVElPTl9USFJFU0hPTERfT1VUX09GX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRFJBV1RFWFRfQ09MT1JfTVVTVF9CRV9HUkFZU0NBTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NBTElCUkFUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NBTElCUkFUSU9OX1JPSV9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT05UUkFTVF9USFJFU0hPTEQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9DT05GTElDVF8xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfQ09ORkxJQ1RfMiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTI4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX0NPTkZMSUNUXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19VTkJPVU5ERURfSU5URVJGQUNFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMzA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9UX1JFQ1RfT1JfUk9UQVRFRF9SRUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUFTS19OT1RfVEVNUExBVEVfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTMzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RIUkVBRF9DT1VMRF9OT1RfSU5JVElBTElaRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTM0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RIUkVBRF9JTklUSUFMSVpJTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JVVFRPTl9MQUJFTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTM2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfSU5WQUxJRF9GSUxURVJfUVVBTElUWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTM3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfRExMX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTM4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX05PVF9TVVBQT1JURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9PVVRfT0ZfTUVNT1JZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFMTI4X1NFVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ09ERTEyOF9GTkMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0lOVkFMSUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREU5M19TSElGVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQ1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfVVBDQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQ2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfTVNJIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9JMjUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0VBTjEzIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9FQU44IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFMTI4IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFOTMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE1MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREUzOSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTUzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ09EQUJBUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lNQUdFX1RPT19TTUFMTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1VOSU5JVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05FRURfRlVMTF9WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5SRUdJU1RFUkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUVNT1JZX0VSUk9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT1VUX09GX01FTU9SWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NZU1RFTV9FUlJPUiI7YnJlYWs7fQorCQljYXNlIDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfU1VDQ0VTUyI7YnJlYWs7fQorCQkvLyBlbmQgTmF0aW9uYWwgSW5zdHJ1bWVudHMgZGVmaW5lZCBlcnJvcnMKKwkJCQorCQkvLyBiZWdpbiBCQUUgZGVmaW5lZCBlcnJvcnMKKwkJY2FzZSBFUlJfVklTSU9OX0dFTkVSQUxfRVJST1I6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVklTSU9OX0dFTkVSQUxfRVJST1IiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ09MT1JfTk9UX0ZPVU5EOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIEVSUl9QQVJUSUNMRV9UT09fU01BTEw6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUEFSVElDTEVfVE9PX1NNQUxMIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9GQUlMVVJFOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9GQUlMVVJFIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9TT0NLRVRfQ1JFQVRFX0ZBSUxFRDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfU09DS0VUX0NSRUFURV9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0NPTk5FQ1RfRkFJTEVEOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9DT05ORUNUX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfU1RBTEVfSU1BR0U6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX1NUQUxFX0lNQUdFIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9OT1RfSU5JVElBTElaRUQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX05PVF9JTklUSUFMSVpFRCI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfTk9fQlVGRkVSX0FWQUlMQUJMRToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfTk9fQlVGRkVSX0FWQUlMQUJMRSI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfSEVBREVSX0VSUk9SOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9IRUFERVJfRVJST1IiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0JMT0NLSU5HX1RJTUVPVVQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX0JMT0NLSU5HX1RJTUVPVVQiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0FVVEhPUklaQVRJT05fRkFJTEVEOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9BVVRIT1JJWkFUSU9OX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfVEFTS19TUEFXTl9GQUlMRUQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX1RBU0tfU1BBV05fRkFJTEVEIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9UQVNLX0lOUFVUX09VVF9PRl9SQU5HRToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfVEFTS19JTlBVVF9PVVRfT0ZfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0NPTU1BTkRfRkFJTFVSRToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfQ09NTUFORF9GQUlMVVJFIjticmVhazt9CisJfQorCQorCXJldHVybiBlcnJvclRleHQ7Cit9CisKKworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9IU0xJbWFnZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9IU0xJbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2Njk0OQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL0hTTEltYWdlLmNwcApAQCAtMCwwICsxLDI4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpc2lvbi9IU0xJbWFnZS5oIgorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBpbWFnZSB0aGF0IHVzZXMgdGhlIEh1ZSwgU2F0dXJhdGlvbiwgYW5kIEx1bWluYW5jZSBwbGFuZXMuCisgKi8KK0hTTEltYWdlOjpIU0xJbWFnZSgpIDogQ29sb3JJbWFnZShJTUFRX0lNQUdFX0hTTCkKK3sKK30KKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW1hZ2UgYnkgbG9hZGluZyBhIGZpbGUuCisgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gbG9hZC4KKyAqLworSFNMSW1hZ2U6OkhTTEltYWdlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSA6IENvbG9ySW1hZ2UoSU1BUV9JTUFHRV9IU0wpCit7CisJaW50IHN1Y2Nlc3MgPSBpbWFxUmVhZEZpbGUobV9pbWFxSW1hZ2UsIGZpbGVOYW1lLCBOVUxMLCBOVUxMKTsKKwl3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkltYXEgUmVhZEZpbGUgZXJyb3IiKTsKK30KKworSFNMSW1hZ2U6On5IU0xJbWFnZSgpCit7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9JbWFnZUJhc2UuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vSW1hZ2VCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU0OWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vSW1hZ2VCYXNlLmNwcApAQCAtMCwwICsxLDczIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpc2lvbi9JbWFnZUJhc2UuaCIKKyNpbmNsdWRlICJuaXZpc2lvbi5oIgorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhbiBJbWFnZUJhc2UuCisgKiBJbWFnZWJhc2UgaXMgdGhlIGJhc2Ugb2YgYWxsIHRoZSBvdGhlciBpbWFnZSBjbGFzc2VzLiBUaGUgY29uc3RydWN0b3IKKyAqIGNyZWF0ZXMgYW55IHR5cGUgb2YgaW1hZ2UgYW5kIHN0b3JlcyB0aGUgcG9pbnRlciB0byBpdCBpbiB0aGUgY2xhc3MuCisgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBpbWFnZSB0byBjcmVhdGUKKyAqLworSW1hZ2VCYXNlOjpJbWFnZUJhc2UoSW1hZ2VUeXBlIHR5cGUpCit7CisJbV9pbWFxSW1hZ2UgPSBpbWFxQ3JlYXRlSW1hZ2UodHlwZSwgREVGQVVMVF9CT1JERVJfU0laRSk7Cit9CisKKy8qKgorICogRnJlZXMgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhbiBJbWFnZUJhc2UuCisgKiBEZXN0cnVjdG9yIGZyZWVzIHRoZSBpbWFxIGltYWdlIGFsbG9jYXRlZCB3aXRoIHRoZSBjbGFzcy4KKyAqLworSW1hZ2VCYXNlOjp+SW1hZ2VCYXNlKCkKK3sKKwlpZihtX2ltYXFJbWFnZSkKKwkJaW1hcURpc3Bvc2UobV9pbWFxSW1hZ2UpOworfQorCisvKioKKyAqIFdyaXRlcyBhbiBpbWFnZSB0byBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gZmlsZW5hbWUuCisgKiBXcml0ZSB0aGUgaW1hZ2UgdG8gYSBmaWxlIGluIHRoZSBmbGFzaCBvbiB0aGUgY1JJTy4KKyAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byB3cml0ZQorICovCit2b2lkIEltYWdlQmFzZTo6V3JpdGUoY29uc3QgY2hhciAqZmlsZU5hbWUpCit7CisJaW50IHN1Y2Nlc3MgPSBpbWFxV3JpdGVGaWxlKG1faW1hcUltYWdlLCBmaWxlTmFtZSwgTlVMTCk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxIEltYWdlIHdyaXRlRmlsZSBlcnJvciIpOworfQorCisvKioKKyAqIEdldHMgdGhlIGhlaWdodCBvZiBhbiBpbWFnZS4KKyAqIEByZXR1cm4gVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzLgorICovCitpbnQgSW1hZ2VCYXNlOjpHZXRIZWlnaHQoKQoreworCWludCBoZWlnaHQ7CisJaW1hcUdldEltYWdlU2l6ZShtX2ltYXFJbWFnZSwgTlVMTCwgJmhlaWdodCk7CisJcmV0dXJuIGhlaWdodDsKK30KKworLyoqCisgKiBHZXRzIHRoZSB3aWR0aCBvZiBhbiBpbWFnZS4KKyAqIEByZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuCisgKi8KK2ludCBJbWFnZUJhc2U6OkdldFdpZHRoKCkKK3sKKwlpbnQgd2lkdGg7CisJaW1hcUdldEltYWdlU2l6ZShtX2ltYXFJbWFnZSwgJndpZHRoLCBOVUxMKTsKKwlyZXR1cm4gd2lkdGg7Cit9CisKKy8qKgorICogQWNjZXNzIHRoZSBpbnRlcm5hbCBJTUFRIEltYWdlIGRhdGEgc3RydWN0dXJlLgorICogCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgSU1BUSBJbWFnZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworSW1hZ2UgKkltYWdlQmFzZTo6R2V0SW1hcUltYWdlKCkKK3sKKwlyZXR1cm4gbV9pbWFxSW1hZ2U7Cit9CisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL01vbm9JbWFnZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9Nb25vSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWZlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9Nb25vSW1hZ2UuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVmlzaW9uL01vbm9JbWFnZS5oIgorI2luY2x1ZGUgIm5pdmlzaW9uLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK01vbm9JbWFnZTo6TW9ub0ltYWdlKCkgOiBJbWFnZUJhc2UoSU1BUV9JTUFHRV9VOCkKK3sKK30KKworTW9ub0ltYWdlOjp+TW9ub0ltYWdlKCkKK3sKK30KKworLyoqCisgKiBMb29rIGZvciBlbGxpcHNlcyBpbiBhbiBpbWFnZS4KKyAqIEdpdmVuIHNvbWUgaW5wdXQgcGFyYW1ldGVycywgbG9vayBmb3IgYW55IG51bWJlciBvZiBlbGxpcHNlcyBpbiBhbiBpbWFnZS4KKyAqIEBwYXJhbSBlbGxpcHNlRGVzY3JpcHRvciBFbGxpcHNlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBjdXJ2ZU9wdGlvbnMgQ3VydmUgb3B0aW9ucworICogQHBhcmFtIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucyBTaGFwZSBkZXRlY3Rpb24gb3B0aW9ucworICogQHBhcmFtIHJvaSBSZWdpb24gb2YgSW50ZXJlc3QKKyAqIEByZXR1cm5zIGEgdmVjdG9yIG9mIEVsbGlwc2VNYXRjaCBzdHJ1Y3R1cmVzICgwIGxlbmd0aCB2ZWN0b3Igb24gbm8gbWF0Y2gpCisgKi8KK3ZlY3RvcjxFbGxpcHNlTWF0Y2g+ICogTW9ub0ltYWdlOjpEZXRlY3RFbGxpcHNlcygKKwkJRWxsaXBzZURlc2NyaXB0b3IgKmVsbGlwc2VEZXNjcmlwdG9yLCBDdXJ2ZU9wdGlvbnMgKmN1cnZlT3B0aW9ucywKKwkJU2hhcGVEZXRlY3Rpb25PcHRpb25zICpzaGFwZURldGVjdGlvbk9wdGlvbnMsIFJPSSAqcm9pKQoreworCWludCBudW1iZXJPZk1hdGNoZXM7CisJRWxsaXBzZU1hdGNoICplID0gaW1hcURldGVjdEVsbGlwc2VzKG1faW1hcUltYWdlLCBlbGxpcHNlRGVzY3JpcHRvciwKKwkJCQkJCQkJCQljdXJ2ZU9wdGlvbnMsIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucywgcm9pLCAmbnVtYmVyT2ZNYXRjaGVzKTsKKwl2ZWN0b3I8RWxsaXBzZU1hdGNoPiAqZWxsaXBzZXMgPSBuZXcgdmVjdG9yPEVsbGlwc2VNYXRjaD47CisJaWYgKGUgPT0gTlVMTCkKKwl7CisJCXJldHVybiBlbGxpcHNlczsKKwl9CisJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZk1hdGNoZXM7IGkrKykKKwl7CisJCWVsbGlwc2VzLT5wdXNoX2JhY2soZVtpXSk7CisJfQorCWltYXFEaXNwb3NlKGUpOworCXJldHVybiBlbGxpcHNlczsKK30KKwordmVjdG9yPEVsbGlwc2VNYXRjaD4gKiBNb25vSW1hZ2U6OkRldGVjdEVsbGlwc2VzKAorCQlFbGxpcHNlRGVzY3JpcHRvciAqZWxsaXBzZURlc2NyaXB0b3IpCit7CisJdmVjdG9yPEVsbGlwc2VNYXRjaD4gKmVsbGlwc2VzID0gRGV0ZWN0RWxsaXBzZXMoZWxsaXBzZURlc2NyaXB0b3IsIE5VTEwsCisJCQlOVUxMLCBOVUxMKTsKKwlyZXR1cm4gZWxsaXBzZXM7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9SR0JJbWFnZS5jcHAgYi9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9SR0JJbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0MjEyZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL1JHQkltYWdlLmNwcApAQCAtMCwwICsxLDI4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpc2lvbi9SR0JJbWFnZS5oIgorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBpbWFnZSB0aGF0IHVzZXMgUmVkLCBHcmVlbiwgYW5kIEJsdWUgcGxhbmVzLgorICovCitSR0JJbWFnZTo6UkdCSW1hZ2UoKSA6IENvbG9ySW1hZ2UoSU1BUV9JTUFHRV9SR0IpCit7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGltYWdlIGJ5IGxvYWRpbmcgYSBmaWxlLgorICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGxvYWQuCisgKi8KK1JHQkltYWdlOjpSR0JJbWFnZShjb25zdCBjaGFyICpmaWxlTmFtZSkgOiBDb2xvckltYWdlKElNQVFfSU1BR0VfUkdCKQoreworCWludCBzdWNjZXNzID0gaW1hcVJlYWRGaWxlKG1faW1hcUltYWdlLCBmaWxlTmFtZSwgTlVMTCwgTlVMTCk7CisJd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxIFJlYWRGaWxlIGVycm9yIik7Cit9CisKK1JHQkltYWdlOjp+UkdCSW1hZ2UoKQoreworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vVGhyZXNob2xkLmNwcCBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL1RocmVzaG9sZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4MWIzOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvYWxsd3BpbGliL3dwaWxpYmMvd3BpbGliQysrRGV2aWNlcy9zcmMvVmlzaW9uL1RocmVzaG9sZC5jcHAKQEAgLTAsMCArMSwxOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vVGhyZXNob2xkLmgiCisKK1RocmVzaG9sZDo6VGhyZXNob2xkKGludCBuZXdfcGxhbmUxTG93LCBpbnQgbmV3X3BsYW5lMUhpZ2gsIGludCBuZXdfcGxhbmUyTG93LAorCQlpbnQgbmV3X3BsYW5lMkhpZ2gsIGludCBuZXdfcGxhbmUzTG93LCBpbnQgbmV3X3BsYW5lM0hpZ2gpCit7CisJcGxhbmUxTG93ID0gbmV3X3BsYW5lMUxvdzsKKwlwbGFuZTFIaWdoID0gbmV3X3BsYW5lMUhpZ2g7CisJcGxhbmUyTG93ID0gbmV3X3BsYW5lMkxvdzsKKwlwbGFuZTJIaWdoID0gbmV3X3BsYW5lMkhpZ2g7CisJcGxhbmUzTG93ID0gbmV3X3BsYW5lM0xvdzsKKwlwbGFuZTNIaWdoID0gbmV3X3BsYW5lM0hpZ2g7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2FsbHdwaWxpYi93cGlsaWJjL3dwaWxpYkMrK0RldmljZXMvc3JjL1Zpc2lvbi9WaXNpb25BUEkuY3BwIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vVmlzaW9uQVBJLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzJiMzIxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9hbGx3cGlsaWIvd3BpbGliYy93cGlsaWJDKytEZXZpY2VzL3NyYy9WaXNpb24vVmlzaW9uQVBJLmNwcApAQCAtMCwwICsxLDY2NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4gCisjaW5jbHVkZSA8c3RkYXJnLmg+IAorCisjaW5jbHVkZSAiVmlzaW9uL0JhZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlZpc2lvbi9GcmNFcnJvci5oIgorI2luY2x1ZGUgIlZpc2lvbi9WaXNpb25BUEkuaCIgCisKK2ludCBWaXNpb25BUElfZGVidWdGbGFnID0gMTsKKyNkZWZpbmUgRFBSSU5URiBpZihWaXNpb25BUElfZGVidWdGbGFnKWRwcmludGYKKworLyoqIEBmaWxlCisgKiAgICBJbWFnZSBNYW5hZ2VtZW50IGZ1bmN0aW9ucworICovCisKKy8qKgorKiBAYnJpZWYgQ3JlYXRlIGFuIGltYWdlIG9iamVjdAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfQ09NUExFWCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLCBJTUFRX0lNQUdFX1JHQl9VNjQgICAgICAgICAgCisqIFRoZSBib3JkZXIgc2l6ZSBpcyBkZWZhdWx0ZWQgdG8gMyBzbyB0aGF0IGNvbnZvbHV0aW9uYWwgYWxnb3JpdGhtcyB3b3JrIGF0IHRoZSBlZGdlcy4gCisqIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBjcmVhdGVkIGltYWdlLCBkaXNwb3NlIG9mIGl0IGJ5IGNhbGxpbmcgZnJjRGlzcG9zZSgpLiAKKyogVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLiAgIAorKiAgICAgICAgICAgCisqIEBwYXJhbSB0eXBlIFR5cGUgb2YgaW1hZ2UgdG8gY3JlYXRlCisqIEByZXR1cm4gSW1hZ2UqIE9uIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3JlYXRlZCBpbWFnZS4gT24gZmFpbHVyZSwgaXQgcmV0dXJucyBOVUxMLgorKi8KK0ltYWdlKiBmcmNDcmVhdGVJbWFnZShJbWFnZVR5cGUgdHlwZSkgeyByZXR1cm4gaW1hcUNyZWF0ZUltYWdlKHR5cGUsIERFRkFVTFRfQk9SREVSX1NJWkUpOyB9CisKKy8qKgorKiBAYnJpZWYgRGlzcG9zZSBvZiBvbmUgb2JqZWN0LiBTdXBwb3J0cyBhbnkgb2JqZWN0IGNyZWF0ZWQgb24gdGhlIGhlYXAuCisqIAorKiBAcGFyYW0gb2JqZWN0IG9iamVjdCB0byBkaXNwb3NlIG9mCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNEaXNwb3NlKHZvaWQqIG9iamVjdCkgIHsgcmV0dXJuIGltYXFEaXNwb3NlKG9iamVjdCk7CX0KKy8qKgorKiBAYnJpZWYgRGlzcG9zZSBvZiBhIGxpc3Qgb2Ygb2JqZWN0cy4gU3VwcG9ydHMgYW55IG9iamVjdCBjcmVhdGVkIG9uIHRoZSBoZWFwLgorKiAKKyogQHBhcmFtIGZ1bmN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyogQHBhcmFtIC4uLiBBIGxpc3Qgb2YgcG9pbnRlcnMgdG8gc3RydWN0dXJlcyB0aGF0IG5lZWQgdG8gYmUgZGlzcG9zZWQgb2YuIAorKiBUaGUgbGFzdCBwb2ludGVyIGluIHRoZSBsaXN0IHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIE5VTEwuCisqIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjRGlzcG9zZSggY29uc3QgY2hhciogZnVuY3Rpb25OYW1lLCAuLi4gKSAvKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0ICovCit7CisgICAgdmFfbGlzdCBkaXNwb3NhbFB0ckxpc3Q7ICAgLyogSW5wdXQgYXJndW1lbnQgbGlzdCAqLworICAgIHZvaWQqIGRpc3Bvc2FsUHRyOyAgICAgICAgIC8qIEZvciBpdGVyYXRpb24gKi8KKyAgICBpbnQgc3VjY2VzcywgcmV0dXJuVmFsdWUgPSAxOworICAgIAorICAgIHZhX3N0YXJ0KCBkaXNwb3NhbFB0ckxpc3QsIGZ1bmN0aW9uTmFtZSApOyAgLyogc3RhcnQgb2YgdmFyaWFibGUgbGlzdCAqLworICAgIGRpc3Bvc2FsUHRyID0gdmFfYXJnKCBkaXNwb3NhbFB0ckxpc3QsIHZvaWQqICk7CisgICAgd2hpbGUoIGRpc3Bvc2FsUHRyICE9IE5VTEwgKSAgICAgeworICAgIAlzdWNjZXNzID0gaW1hcURpc3Bvc2UoZGlzcG9zYWxQdHIpOworICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtyZXR1cm5WYWx1ZSA9IDA7fQorICAgICAgICBkaXNwb3NhbFB0ciA9IHZhX2FyZyggZGlzcG9zYWxQdHJMaXN0LCB2b2lkKiApOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CisKKy8qKgorKiBAYnJpZWYgQ29weSBhbiBpbWFnZSBvYmplY3QuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTC4gICAgICAgICAgCisqIAorKiBAcGFyYW0gZGVzdCBDb3B5IG9mIGltYWdlLiBPbiBmYWlsdXJlLCBkZXN0IGlzIE5VTEwuIE11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZCB1c2luZyBmcmNDcmVhdGVJbWFnZSgpLgorKiBXaGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgY3JlYXRlZCBpbWFnZSwgZGlzcG9zZSBvZiBpdCBieSBjYWxsaW5nIGZyY0Rpc3Bvc2UoKS4KKyogQHBhcmFtIHNvdXJjZSBJbWFnZSB0byBjb3B5ICAgICAgCisqIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjQ29weUltYWdlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKSB7IHJldHVybiBpbWFxRHVwbGljYXRlKGRlc3QsIHNvdXJjZSk7ICB9CisKKy8qKgorKiBAYnJpZWYgQ3JvcCBpbWFnZSB3aXRob3V0IGNoYW5naW5nIHRoZSBzY2FsZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiAKKyogQHBhcmFtIGRlc3QgTW9kaWZpZWQgaW1hZ2UKKyogQHBhcmFtIHNvdXJjZSBJbWFnZSB0byBjcm9wCisqIEBwYXJhbSByZWN0IHJlZ2lvbiB0byBwcm9jZXNzLCBvciBJTUFRX05PX1JFQ1QKKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNDcm9wKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBSZWN0IHJlY3QpCit7CQorCXJldHVybiBpbWFxU2NhbGUoZGVzdCwgc291cmNlLCAxLCAxLCBJTUFRX1NDQUxFX0xBUkdFUiwgcmVjdCk7Cit9CisKKworLyoqCisqIEBicmllZiBTY2FsZXMgdGhlIGVudGlyZSBpbWFnZSBsYXJnZXIgb3Igc21hbGxlci4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiAgICAgCisqIEBwYXJhbSBkZXN0IE1vZGlmaWVkIGltYWdlCisqIEBwYXJhbSBzb3VyY2UgSW1hZ2UgdG8gc2NhbGUKKyogQHBhcmFtIHhTY2FsZSB0aGUgaG9yaXpvbnRhbCByZWR1Y3Rpb24gcmF0aW8KKyogQHBhcmFtIHlTY2FsZSB0aGUgdmVydGljYWwgcmVkdWN0aW9uIHJhdGlvIAorKiBAcGFyYW0gc2NhbGVNb2RlIElNQVFfU0NBTEVfTEFSR0VSIG9yIElNQVFfU0NBTEVfU01BTExFUiAgCisqIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjU2NhbGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCB4U2NhbGUsIGludCB5U2NhbGUsIFNjYWxpbmdNb2RlIHNjYWxlTW9kZSkKK3sJCisJUmVjdCByZWN0ID0gSU1BUV9OT19SRUNUOworCXJldHVybiBpbWFxU2NhbGUoZGVzdCwgc291cmNlLCB4U2NhbGUsIHlTY2FsZSwgc2NhbGVNb2RlLCByZWN0KTsJCit9CisgIAorLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBpbWFnZSBvYmplY3QgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWxlLiBUaGUgZmlsZSBjYW4gYmUgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czogCisgKiBQTkcsIEpQRUcsIEpQRUcyMDAwLCBUSUZGLCBBSVBELCBvciBCTVAuIAorICogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLCBJTUFRX0lNQUdFX0NPTVBMRVgsIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTCwgSU1BUV9JTUFHRV9SR0JfVTY0LgorICogCisgKiBAcGFyYW0gaW1hZ2UgSW1hZ2UgcmVhZCBpbgorICogQHBhcmFtIGZpbGVOYW1lIEZpbGUgdG8gcmVhZC4gQ2Fubm90IGJlIE5VTEwKKyAqIAorICogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisgKi8KKyBpbnQgZnJjUmVhZEltYWdlKEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUpCisgeworCSByZXR1cm4gaW1hcVJlYWRGaWxlKGltYWdlLCBmaWxlTmFtZSwgTlVMTCwgTlVMTCk7CisgfQorCisKKyAvKioKKyAqIEBicmllZiBXcml0ZSBpbWFnZSB0byBhIGZpbGUuIAorICogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLCBJTUFRX0lNQUdFX0NPTVBMRVgsIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTCwgSU1BUV9JTUFHRV9SR0JfVTY0LgorICogCisgKiBUaGUgZmlsZSB0eXBlIGlzIGRldGVybWluZWQgYnkgdGhlIGV4dGVuc2lvbiwgYXMgZm9sbG93czoKKyAqCisgKgkJRXh0ZW5zaW9uIAkJCQkJRmlsZSBUeXBlIAorICoJCWFpcGQgb3IgLmFwZCAJCQkJQUlQRCAKKyAqCQkuYm1wIAkJCQkJCUJNUCAKKyAqCQkuanBnIG9yIC5qcGVnIAkJCQlKUEVHIAorICoJCS5qcDIgCQkJCQkJSlBFRzIwMDAgCisgKgkJLnBuZyAJCQkJCQlQTkcgCisgKgkJLnRpZiBvciAudGlmZiAJCQkJVElGRiAKKyAqIAorICogCisgKlRoZSBmb2xsb3dpbmcgYXJlIHRoZSBzdXBwb3J0ZWQgaW1hZ2UgdHlwZXMgZm9yIGVhY2ggZmlsZSB0eXBlOgorICoKKyAqCQlGaWxlIFR5cGVzIAkJCQkJSW1hZ2UgVHlwZXMgCisgKgkJQUlQRCAJCQkJCQlhbGwgaW1hZ2UgdHlwZXMgCisgKgkJQk1QLCBKUEVHIAkJCQkJOC1iaXQsIFJHQiAKKyAqCQlQTkcsIFRJRkYsIEpQRUcyMDAwIAkJOC1iaXQsIDE2LWJpdCwgUkdCLCBSR0JVNjQgCQkKKyAqIAkJCSAgICAKKyAqIEBwYXJhbSBpbWFnZSBJbWFnZSB0byB3cml0ZQorICogQHBhcmFtIGZpbGVOYW1lIEZpbGUgdG8gcmVhZC4gQ2Fubm90IGJlIE5VTEwuIFRoZSBleHRlbnNpb24gZGV0ZXJtaW5lcyB0aGUgZmlsZSBmb3JtYXQgdGhhdCBpcyB3cml0dGVuLgorICogCisgKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyAqLworaW50IGZyY1dyaXRlSW1hZ2UoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSkKK3sJCisJUkdCVmFsdWUqIGNvbG9yVGFibGUgPSBOVUxMOworCXJldHVybiBpbWFxV3JpdGVGaWxlKGltYWdlLCBmaWxlTmFtZSwgY29sb3JUYWJsZSk7Cit9CisKKworLyogIE1lYXN1cmUgSW50ZW5zaXR5IGZ1bmN0aW9ucyAqLworCisvKioKKyogQGJyaWVmIE1lYXN1cmVzIHRoZSBwaXhlbCBpbnRlbnNpdGllcyBpbiBhIHJlY3RhbmdsZSBvZiBhbiBpbWFnZS4gCisqIE91dHB1dHMgaW50ZW5zaXR5IGJhc2VkIHN0YXRpc3RpY3MgYWJvdXQgYW4gaW1hZ2Ugc3VjaCBhcyBNYXgsIE1pbiwgTWVhbiBhbmQgU3RkIERldiBvZiBwaXhlbCB2YWx1ZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTC4KKyoKKyogIFBhcmFtZXRlciBEaXNjdXNzaW9uCTogCisqCQlSZWxldmFudCBwYXJhbWV0ZXJzIG9mIHRoZSBIaXN0b2dyYW1SZXBvcnQgaW5jbHVkZToKKyogCQkJbWluLCBtYXgsIG1lYW4gYW5kIHN0ZERldiAgICAgIAorKgkJbWluL21heCCXU2V0dGluZyBib3RoIG1pbiBhbmQgbWF4IHRvIDAgY2F1c2VzIHRoZSBmdW5jdGlvbiB0byBzZXQgbWluIHRvIDAgCisqIAkJCWFuZCB0aGUgbWF4IHRvIDI1NSBmb3IgOC1iaXQgaW1hZ2VzIGFuZCB0byB0aGUgYWN0dWFsIG1pbmltdW0gdmFsdWUgYW5kCisqIAkJCW1heGltdW0gdmFsdWUgb2YgdGhlIGltYWdlIGZvciBhbGwgb3RoZXIgaW1hZ2UgdHlwZXMuCisqCQltYXiXU2V0dGluZyBib3RoIG1pbiBhbmQgbWF4IHRvIDAgY2F1c2VzIHRoZSBmdW5jdGlvbiB0byBzZXQgbWF4IHRvIDI1NSAKKyogCQkJZm9yIDgtYml0IGltYWdlcyBhbmQgdG8gdGhlIGFjdHVhbCBtYXhpbXVtIHZhbHVlIG9mIHRoZSBpbWFnZSBmb3IgCisqIAkJCWFsbCBvdGhlciBpbWFnZSB0eXBlcy4KKyoKKyogQHBhcmFtIGltYWdlIEltYWdlIHdob3NlIGhpc3RvZ3JhbSB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcy4KKyogQHBhcmFtIG51bUNsYXNzZXMgVGhlIG51bWJlciBvZiBjbGFzc2VzIGludG8gd2hpY2ggdGhlIGZ1bmN0aW9uIHNlcGFyYXRlcyB0aGUgcGl4ZWxzLiAKKyogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoaXN0b2dyYW0gYXJyYXkgcmV0dXJuZWQKKyogQHBhcmFtIG1pbiBUaGUgbWluaW11bSBwaXhlbCB2YWx1ZSB0byBjb25zaWRlciBmb3IgdGhlIGhpc3RvZ3JhbS4gCisqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb3VudCBwaXhlbHMgd2l0aCB2YWx1ZXMgbGVzcyB0aGFuIG1pbi4KKyogQHBhcmFtIG1heCBUaGUgbWF4aW11bSBwaXhlbCB2YWx1ZSB0byBjb25zaWRlciBmb3IgdGhlIGhpc3RvZ3JhbS4gCisqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb3VudCBwaXhlbHMgd2l0aCB2YWx1ZXMgZ3JlYXRlciB0aGFuIG1heC4KKyogQHBhcmFtIHJlY3QgUmVnaW9uIG9mIGludGVyZXN0IGluIHRoZSBpbWFnZS4gSWYgbm90IGluY2x1ZGVkLCB0aGUgZW50aXJlIGltYWdlIGlzIHVzZWQuIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlcG9ydCBkZXNjcmliaW5nIHRoZSBwaXhlbCB2YWx1ZSBjbGFzc2lmaWNhdGlvbi4gICAgCisqIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoZSByZXBvcnQsIGRpc3Bvc2Ugb2YgaXQgYnkgY2FsbGluZyBmcmNEaXNwb3NlKCkuIAorKiBPbiBmYWlsdXJlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLiAgICAgICAgICAgIAorKiAKKyovCitIaXN0b2dyYW1SZXBvcnQqIGZyY0hpc3RvZ3JhbShjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBmbG9hdCBtaW4sIGZsb2F0IG1heCkKK3sKKwlSZWN0IHJlY3QgPSBJTUFRX05PX1JFQ1Q7CisJcmV0dXJuIGZyY0hpc3RvZ3JhbShpbWFnZSwgbnVtQ2xhc3NlcywgbWluLCBtYXgsIHJlY3QpOwkJCit9CitIaXN0b2dyYW1SZXBvcnQqIGZyY0hpc3RvZ3JhbShjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwgUmVjdCByZWN0KQoreworCWludCBzdWNjZXNzOyAKKwlpbnQgZmlsbFZhbHVlID0gMTsKKwkKKwkvKiBjcmVhdGUgdGhlIHJlZ2lvbiBvZiBpbnRlcmVzdCAqLworCVJPSSogcFJvaSA9IGltYXFDcmVhdGVST0koKTsKKwlzdWNjZXNzID0gaW1hcUFkZFJlY3RDb250b3VyKHBSb2ksIHJlY3QpOyAKKwlpZiAoICFzdWNjZXNzICkJeyBHZXRMYXN0VmlzaW9uRXJyb3IoKTsgcmV0dXJuIE5VTEw7IH0JCisKKwkvKiBtYWtlIGEgbWFzayBmcm9tIHRoZSBST0kgKi8KKwlJbWFnZSogcE1hc2sgPSBmcmNDcmVhdGVJbWFnZShJTUFRX0lNQUdFX1U4KTsKKwlzdWNjZXNzID0gaW1hcVJPSVRvTWFzayhwTWFzaywgcFJvaSwgZmlsbFZhbHVlLCBOVUxMLCBOVUxMKTsKKwlpZiAoICFzdWNjZXNzICkJeyAKKwkJR2V0TGFzdFZpc2lvbkVycm9yKCk7IAorCQlmcmNEaXNwb3NlKF9fRlVOQ1RJT05fXywgcFJvaSwgTlVMTCk7IAorCQlyZXR1cm4gTlVMTDsgCisJfQkKKwkKKwkvKiBnZXQgYSBoaXN0b2dyYW0gcmVwb3J0ICovCisJSGlzdG9ncmFtUmVwb3J0KiBwSHIgPSBOVUxMOworCXBIciA9IGltYXFIaXN0b2dyYW0oaW1hZ2UsIG51bUNsYXNzZXMsIG1pbiwgbWF4LCBwTWFzayk7IAorCQorCS8qIGNsZWFuIHVwICovCisJZnJjRGlzcG9zZShfX0ZVTkNUSU9OX18sIHBSb2ksIHBNYXNrLCBOVUxMKTsgCisJCisJcmV0dXJuIHBIcjsKK30KKworLyoqCisqIEBicmllZiBDYWxjdWxhdGVzIHRoZSBoaXN0b2dyYW0sIG9yIHBpeGVsIGRpc3RyaWJ1dGlvbiwgb2YgYSBjb2xvciBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTC4KKyogICAgICAgICAgICAKKyogQHBhcmFtIGltYWdlIEltYWdlIHdob3NlIGhpc3RvZ3JhbSB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcy4KKyogQHBhcmFtIG51bUNsYXNzZXMgVGhlIG51bWJlciBvZiBjbGFzc2VzIGludG8gd2hpY2ggdGhlIGZ1bmN0aW9uIHNlcGFyYXRlcyB0aGUgcGl4ZWxzLiAKKyogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoaXN0b2dyYW0gYXJyYXkgcmV0dXJuZWQKKyogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIHNwYWNlIGluIHdoaWNoIHRvIHBlcmZvcm0gdGhlIGhpc3RvZ3JhbS4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGUgSU1BUV9SR0IgYW5kIElNQVFfSFNMLiAKKyogQHBhcmFtIG1hc2sgQW4gb3B0aW9uYWwgbWFzayBpbWFnZS4gVGhpcyBpbWFnZSBtdXN0IGJlIGFuIElNQVFfSU1BR0VfVTggaW1hZ2UuIAorKiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgaGlzdG9ncmFtIHVzaW5nIG9ubHkgdGhvc2UgcGl4ZWxzIGluIHRoZSBpbWFnZSB3aG9zZSAKKyogY29ycmVzcG9uZGluZyBwaXhlbHMgaW4gdGhlIG1hc2sgYXJlIG5vbi16ZXJvLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCB0byBjYWxjdWxhdGUgCisqIHRoZSBoaXN0b2dyYW0gb2YgdGhlIGVudGlyZSBpbWFnZSwgb3IgdXNlIHRoZSBzaW1wbGlmaWVkIGNhbGwuCisqIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlcG9ydCBkZXNjcmliaW5nIHRoZSBjbGFzc2lmaWNhdGlvbiAgCisqIG9mIGVhY2ggcGxhbmUgaW4gYSBIaXN0b2dyYW1SZXBvcnQuIAorKiBXaGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgcmVwb3J0LCBkaXNwb3NlIG9mIGl0IGJ5IGNhbGxpbmcgZnJjRGlzcG9zZSgpLiAKKyogT24gZmFpbHVyZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIE5VTEwuICAKKyogVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIGltYXFHZXRMYXN0RXJyb3IoKS4gCisqLworQ29sb3JIaXN0b2dyYW1SZXBvcnQqIGZyY0NvbG9ySGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIENvbG9yTW9kZSBtb2RlKQorewkKKwlyZXR1cm4gZnJjQ29sb3JIaXN0b2dyYW0oaW1hZ2UsIG51bUNsYXNzZXMsIG1vZGUsIE5VTEwpOworfQorCitDb2xvckhpc3RvZ3JhbVJlcG9ydCogZnJjQ29sb3JIaXN0b2dyYW0oY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywgQ29sb3JNb2RlIG1vZGUsIEltYWdlKiBtYXNrKQoreworCXJldHVybiBpbWFxQ29sb3JIaXN0b2dyYW0yKChJbWFnZSopaW1hZ2UsIG51bUNsYXNzZXMsIG1vZGUsIE5VTEwsIG1hc2spOworfQorCisKKy8qKgorKiBAYnJpZWYgTWVhc3VyZXMgdGhlIHBpeGVsIGludGVuc2l0aWVzIGluIGEgcmVjdGFuZ2xlIG9mIGFuIGltYWdlLiAKKyogT3V0cHV0cyBpbnRlbnNpdHkgYmFzZWQgc3RhdGlzdGljcyBhYm91dCBhbiBpbWFnZSBzdWNoIGFzIE1heCwgTWluLCBNZWFuIGFuZCBTdGQgRGV2IG9mIHBpeGVsIHZhbHVlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCAoZ3JheXNjYWxlKSBJTUFRX0lNQUdFX1JHQiAoY29sb3IpIElNQVFfSU1BR0VfSFNMIChjb2xvci1IU0wpLgorKiAKKyogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB3aG9zZSBwaXhlbCB2YWx1ZSB0aGUgZnVuY3Rpb24gcXVlcmllcworKiBAcGFyYW0gcGl4ZWwgVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwaXhlbCB0aGF0IHRoZSBmdW5jdGlvbiBxdWVyaWVzCisqIEBwYXJhbSB2YWx1ZSBPbiByZXR1cm4sIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIHBpeGVsLiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgTlVMTC4KKyogVGhpcyBkYXRhIHN0cnVjdHVyZSBjb250YWlucyBlaXRoZXIgZ3JheXNjYWxlLCBSR0IsIEhTTCwgQ29tcGxleCBvciBSR0JVNjRWYWx1ZSBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgaW1hZ2UuCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNHZXRQaXhlbFZhbHVlKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgcGl4ZWwsIFBpeGVsVmFsdWUqIHZhbHVlKQorewkKKwlyZXR1cm4gaW1hcUdldFBpeGVsKGltYWdlLCBwaXhlbCwgdmFsdWUpOworfQorCisKKy8qICAgUGFydGljbGUgQW5hbHlzaXMgZnVuY3Rpb25zICovCisKKy8qKgorKiBAYnJpZWYgRmlsdGVycyBwYXJ0aWNsZXMgb3V0IG9mIGFuIGltYWdlIGJhc2VkIG9uIHRoZWlyIG1lYXN1cmVtZW50cy4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTC4KKyogCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4gSWYgZGVzdCBpcyB1c2VkLCBpdCBtdXN0IGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIFNvdXJjZSBpbWFnZS4gSXQgd2lsbCBjb250YWluIG9ubHkgdGhlIGZpbHRlcmVkIHBhcnRpY2xlcy4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgY29udGFpbmluZyB0aGUgcGFydGljbGVzIHRvIGZpbHRlci4gCisqIEBwYXJhbSBjcml0ZXJpYSBBbiBhcnJheSBvZiBjcml0ZXJpYSB0byBhcHBseSB0byB0aGUgcGFydGljbGVzIGluIHRoZSBzb3VyY2UgaW1hZ2UuIFRoaXMgYXJyYXkgY2Fubm90IGJlIE5VTEwuCisqIFNlZSB0aGUgTklWaXNpb25DVkkuY2htIGhlbHAgZmlsZSBmb3IgZGVmaW5pdGlvbnMgb2YgY3JpdGVyaWEuIAorKiBAcGFyYW0gY3JpdGVyaWFDb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjcml0ZXJpYSBhcnJheS4KKyogQHBhcmFtIG9wdGlvbnMgQmluYXJ5IGZpbHRlciBvcHRpb25zLCBpbmNsdWRpbmcgcmVqZWN0TWF0Y2hlcywgcmVqZWN0Qm9yZGVyLCBhbmQgY29ubmVjdGl2aXR5OC4KKyogQHBhcmFtIHJlY3QgQXJlYSBvZiBpbWFnZSB0byBmaWx0ZXIuIElmIG9taXR0ZWQsIHRoZSBkZWZhdWx0IGlzIGVudGlyZSBpbWFnZS4KKyogQHBhcmFtIG51bVBhcnRpY2xlcyBPbiByZXR1cm4sIHRoZSBudW1iZXIgb2YgcGFydGljbGVzIGxlZnQgaW4gdGhlIGltYWdlCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNQYXJ0aWNsZUZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCAKKwkJaW50IGNyaXRlcmlhQ291bnQsIGNvbnN0IFBhcnRpY2xlRmlsdGVyT3B0aW9ucyogb3B0aW9ucywgaW50KiBudW1QYXJ0aWNsZXMpCit7CisJUmVjdCByZWN0ID0gSU1BUV9OT19SRUNUOworCXJldHVybiBmcmNQYXJ0aWNsZUZpbHRlcihkZXN0LCBzb3VyY2UsIGNyaXRlcmlhLCBjcml0ZXJpYUNvdW50LCBvcHRpb25zLCByZWN0LCBudW1QYXJ0aWNsZXMpOworfQorCitpbnQgZnJjUGFydGljbGVGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyKiBjcml0ZXJpYSwgCisJCWludCBjcml0ZXJpYUNvdW50LCBjb25zdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnMqIG9wdGlvbnMsIFJlY3QgcmVjdCwgaW50KiBudW1QYXJ0aWNsZXMpCit7CisJUk9JKiByb2kgPSBpbWFxQ3JlYXRlUk9JKCk7CisJaW1hcUFkZFJlY3RDb250b3VyKHJvaSwgcmVjdCk7CisJcmV0dXJuIGltYXFQYXJ0aWNsZUZpbHRlcjMoZGVzdCwgc291cmNlLCBjcml0ZXJpYSwgY3JpdGVyaWFDb3VudCwgb3B0aW9ucywgcm9pLCBudW1QYXJ0aWNsZXMpOworfQorCisKKy8qKgorKiBAYnJpZWYgUGVyZm9ybXMgbW9ycGhvbG9naWNhbCB0cmFuc2Zvcm1hdGlvbnMgb24gYmluYXJ5IGltYWdlcy4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTguIAorKgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuIFRoZSBib3JkZXIgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UgaXMgbm90IGltcG9ydGFudC4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2Ugb24gd2hpY2ggdGhlIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBtb3JwaG9sb2dpY2FsIG9wZXJhdGlvbnMuIFRoZSBjYWxjdWxhdGlvbiAKKyogbW9kaWZpZXMgdGhlIGJvcmRlciBvZiB0aGUgc291cmNlIGltYWdlLiBUaGUgYm9yZGVyIG11c3QgYmUgYXQgbGVhc3QgaGFsZiBhcyBsYXJnZSBhcyB0aGUgbGFyZ2VyIAorKiBkaW1lbnNpb24gIG9mIHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LiAgVGhlIGNvbm5lY3RlZCBzb3VyY2UgaW1hZ2UgZm9yIGEgbW9ycGhvbG9naWNhbCB0cmFuc2Zvcm1hdGlvbiAKKyogbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgYm9yZGVyIGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJpbmcgZWxlbWVudC4gCisqIEEgMyBieSAzIHN0cnVjdHVyaW5nIGVsZW1lbnQgcmVxdWlyZXMgYSBtaW5pbWFsIGJvcmRlciBvZiAxLCBhIDUgYnkgNSBzdHJ1Y3R1cmluZyBlbGVtZW50IHJlcXVpcmVzIGEgbWluaW1hbCBib3JkZXIgb2YgMiwgYW5kIHNvIG9uLgorKiBAcGFyYW0gbWV0aG9kIFRoZSBtb3JwaG9sb2dpY2FsIHRyYW5zZm9ybSB0byBhcHBseS4gCisqIEBwYXJhbSBzdHJ1Y3R1cmluZ0VsZW1lbnQgVGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQgdXNlZCBpbiB0aGUgb3BlcmF0aW9uLiBPbWl0IHRoaXMgcGFyYW1ldGVyIGlmIHlvdSBkbyBub3Qgd2FudCBhIGN1c3RvbSBzdHJ1Y3R1cmluZyBlbGVtZW50LiAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuIAorKi8KK2ludCBmcmNNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCkKK3sJCisJcmV0dXJuIGltYXFNb3JwaG9sb2d5KGRlc3QsIHNvdXJjZSwgbWV0aG9kLCBOVUxMKTsKK30KKworaW50IGZyY01vcnBob2xvZ3koSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE1vcnBob2xvZ3lNZXRob2QgbWV0aG9kLCBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCkKK3sJCisJcmV0dXJuIGltYXFNb3JwaG9sb2d5KGRlc3QsIHNvdXJjZSwgbWV0aG9kLCBzdHJ1Y3R1cmluZ0VsZW1lbnQpOyAKK30KKworLyoqCisqIEBicmllZiBFbGltaW5hdGVzIHBhcnRpY2xlcyB0aGF0IHRvdWNoIHRoZSBib3JkZXIgb2YgdGhlIGltYWdlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOC4KKyoKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgaW1hZ2UuIElmIHRoZSBpbWFnZSBoYXMgYSBib3JkZXIsIHRoZSBmdW5jdGlvbiBzZXRzIGFsbCBib3JkZXIgcGl4ZWwgdmFsdWVzIHRvIDAuCisqIEBwYXJhbSBjb25uZWN0aXZpdHk4IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBjb25uZWN0aXZpdHkgdXNlZCBieSB0aGUgYWxnb3JpdGhtIGZvciBwYXJ0aWNsZSBkZXRlY3Rpb24uIAorKiBUaGUgY29ubmVjdGl2aXR5IG1vZGUgZGlyZWN0bHkgZGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGFkamFjZW50IHBpeGVsIGJlbG9uZ3MgdG8gdGhlIHNhbWUgcGFydGljbGUgb3IgYSAKKyogZGlmZmVyZW50IHBhcnRpY2xlLiBTZXQgdG8gVFJVRSB0byB1c2UgY29ubmVjdGl2aXR5LTggdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcGFydGljbGVzIGFyZSB0b3VjaGluZyAKKyogU2V0IHRvIEZBTFNFIHRvIHVzZSBjb25uZWN0aXZpdHktNCB0byBkZXRlcm1pbmUgd2hldGhlciBwYXJ0aWNsZXMgYXJlIHRvdWNoaW5nLiAKKyogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHNpbXBsaWZpZWQgY2FsbCBpcyBUUlVFCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNSZWplY3RCb3JkZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UpCit7CXJldHVybiBpbWFxUmVqZWN0Qm9yZGVyKGRlc3QsIHNvdXJjZSwgVFJVRSk7IH0KKworaW50IGZyY1JlamVjdEJvcmRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgpCit7CQorCXJldHVybiBpbWFxUmVqZWN0Qm9yZGVyKGRlc3QsIHNvdXJjZSwgY29ubmVjdGl2aXR5OCk7Cit9CisKKworLyoqCisqIEBicmllZiBDb3VudHMgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgaW4gYSBiaW5hcnkgaW1hZ2UuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wuCisqIEBwYXJhbSBpbWFnZSBiaW5hcnkgKHRocmVzaG9sZGVkKSBpbWFnZSAJCisqIEBwYXJhbSBudW1QYXJ0aWNsZXMgT24gcmV0dXJuLCB0aGUgbnVtYmVyIG9mIHBhcnRpY2xlcy4KKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuICAgIAorKi8KK2ludCBmcmNDb3VudFBhcnRpY2xlcyhJbWFnZSogaW1hZ2UsIGludCogbnVtUGFydGljbGVzKQkJCQkKK3sJCisJcmV0dXJuIGltYXFDb3VudFBhcnRpY2xlcyhpbWFnZSwgMSwgbnVtUGFydGljbGVzKTsKK30KKworCisvKioKKyogQGJyaWVmIENvbmR1Y3QgbWVhc3VyZW1lbnRzIGZvciBhIHNpbmdsZSBwYXJ0aWNsZSBpbiBhbiBpbWFnZXMuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wuCisqIAorKiBAcGFyYW0gaW1hZ2UgaW1hZ2Ugd2l0aCB0aGUgcGFydGljbGUgdG8gYW5hbHl6ZS4gVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUgc291cmNlIGltYWdlLiAKKyogSWYgeW91IG5lZWQgdGhlIG9yaWdpbmFsIGltYWdlLCBjcmVhdGUgYSBjb3B5IG9mIHRoZSBpbWFnZSB1c2luZyBmcmNDb3B5KCkgYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisqIEBwYXJhbSBwYXJ0aWNsZU51bWJlciBUaGUgbnVtYmVyIG9mIHRoZSBwYXJ0aWNsZSB0byBnZXQgaW5mb3JtYXRpb24gb24KKyogQHBhcmFtIHBhciBvbiByZXR1cm4sIGEgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnRpY2xlLiBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIGNhbGxlci4KKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1BhcnRpY2xlQW5hbHlzaXMoSW1hZ2UqIGltYWdlLCBpbnQgcGFydGljbGVOdW1iZXIsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQqIHBhcikJCQkJCit7CisJaW50IHN1Y2Nlc3MgPSAwOworCisJLyogaW1hZ2UgaW5mb3JtYXRpb24gKi8KKwlpbnQgaGVpZ2h0LCB3aWR0aDsKKwlpZiAoICEgaW1hcUdldEltYWdlU2l6ZShpbWFnZSwgJndpZHRoLCAmaGVpZ2h0KSApIAl7IHJldHVybiBzdWNjZXNzOyB9CQorCXBhci0+aW1hZ2VXaWR0aCA9IHdpZHRoOwkKKwlwYXItPmltYWdlSGVpZ2h0ID0gaGVpZ2h0OwkKKwlwYXItPnBhcnRpY2xlSW5kZXggPSBwYXJ0aWNsZU51bWJlcjsJCQorCisJLyogY2VudGVyIG9mIG1hc3MgcG9pbnQgb2YgdGhlIGxhcmdlc3QgcGFydGljbGUJKi8KKwlkb3VibGUgcmV0dXJuRG91YmxlOworCXN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwgSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19YLCAmcmV0dXJuRG91YmxlKTsKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+Y2VudGVyX21hc3NfeCA9IChpbnQpcmV0dXJuRG91YmxlOwkJCQkJCS8vIHBpeGVsCQorCisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1ksICZyZXR1cm5Eb3VibGUpOwkKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+Y2VudGVyX21hc3NfeSA9IChpbnQpcmV0dXJuRG91YmxlOwkJCQkJCS8vIHBpeGVsCQkKKwkKKwkvKiBwYXJ0aWNsZSBzaXplIHN0YXRpc3RpY3MgKi8gCisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0FSRUEsICZyZXR1cm5Eb3VibGUpOwkKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+cGFydGljbGVBcmVhID0gcmV0dXJuRG91YmxlOwkKKwkKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9UT1AsICZyZXR1cm5Eb3VibGUpOwkKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+Ym91bmRpbmdSZWN0LnRvcCA9IChpbnQpcmV0dXJuRG91YmxlOworCQorCXN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwgSU1BUV9NVF9CT1VORElOR19SRUNUX0xFRlQsICZyZXR1cm5Eb3VibGUpOwkKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+Ym91bmRpbmdSZWN0LmxlZnQgPSAoaW50KXJldHVybkRvdWJsZTsKKwkKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9IRUlHSFQsICZyZXR1cm5Eb3VibGUpOwkKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+Ym91bmRpbmdSZWN0LmhlaWdodCA9IChpbnQpcmV0dXJuRG91YmxlOwkKKworCXN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwgSU1BUV9NVF9CT1VORElOR19SRUNUX1dJRFRILCAmcmV0dXJuRG91YmxlKTsJCisJaWYgKCAhc3VjY2VzcyApCXsgcmV0dXJuIHN1Y2Nlc3M7IH0KKwlwYXItPmJvdW5kaW5nUmVjdC53aWR0aCA9IChpbnQpcmV0dXJuRG91YmxlOwkKKwkKKwkvKiBwYXJ0aWNsZSBxdWFsaXR5IHN0YXRpc3RpY3MgKi8gCisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0FSRUFfQllfSU1BR0VfQVJFQSwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5wYXJ0aWNsZVRvSW1hZ2VQZXJjZW50ID0gcmV0dXJuRG91YmxlOworCisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0FSRUFfQllfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEsICZyZXR1cm5Eb3VibGUpOwkKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+cGFydGljbGVRdWFsaXR5ID0gcmV0dXJuRG91YmxlOworCQkKKwkvKiBub3JtYWxpemVkIHBvc2l0aW9uICgtMSB0byAxKSAqLworCXBhci0+Y2VudGVyX21hc3NfeF9ub3JtYWxpemVkID0gUmFuZ2VUb05vcm1hbGl6ZWQocGFyLT5jZW50ZXJfbWFzc194LCB3aWR0aCk7CisJcGFyLT5jZW50ZXJfbWFzc195X25vcm1hbGl6ZWQgPSBSYW5nZVRvTm9ybWFsaXplZChwYXItPmNlbnRlcl9tYXNzX3ksIGhlaWdodCk7CQorCQorCXJldHVybiBzdWNjZXNzOworfQorCisKKy8qICAgSW1hZ2UgRW5oYW5jZW1lbnQgZnVuY3Rpb25zICovCisKKy8qKgorKiBAYnJpZWYgSW1wcm92ZXMgY29udHJhc3Qgb24gYSBncmF5c2NhbGUgaW1hZ2UuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNi4KKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byBlcXVhbGl6ZSAKKyogQHBhcmFtIG1pbiB0aGUgc21hbGxlc3QgdmFsdWUgdXNlZCBmb3IgcHJvY2Vzc2luZy4gQWZ0ZXIgcHJvY2Vzc2luZywgYWxsIHBpeGVsIHZhbHVlcyB0aGF0IGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIE1pbmltdW0gaW4gdGhlIG9yaWdpbmFsIGltYWdlIGFyZSBzZXQgdG8gMCBmb3IgYW4gOC1iaXQgaW1hZ2UuIEluIDE2LWJpdCBhbmQgZmxvYXRpbmctcG9pbnQgaW1hZ2VzLCB0aGVzZSBwaXhlbCB2YWx1ZXMgYXJlIHNldCB0byB0aGUgc21hbGxlc3QgcGl4ZWwgdmFsdWUgZm91bmQgaW4gdGhlIG9yaWdpbmFsIGltYWdlLiAKKyogQHBhcmFtIG1heCB0aGUgbGFyZ2VzdCB2YWx1ZSB1c2VkIGZvciBwcm9jZXNzaW5nLiBBZnRlciBwcm9jZXNzaW5nLCBhbGwgcGl4ZWwgdmFsdWVzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgTWF4aW11bSBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UgYXJlIHNldCB0byAyNTUgZm9yIGFuIDgtYml0IGltYWdlLiBJbiAxNi1iaXQgYW5kIGZsb2F0aW5nLXBvaW50IGltYWdlcywgdGhlc2UgcGl4ZWwgdmFsdWVzIGFyZSBzZXQgdG8gdGhlIGxhcmdlc3QgcGl4ZWwgdmFsdWUgZm91bmQgaW4gdGhlIG9yaWdpbmFsIGltYWdlLiAKKyogQHBhcmFtIG1hc2sgYW4gOC1iaXQgaW1hZ2UgdGhhdCBzcGVjaWZpZXMgdGhlIHJlZ2lvbiBvZiB0aGUgc21hbGwgaW1hZ2UgdGhhdCB3aWxsIGJlIGNvcGllZC4gT25seSB0aG9zZSBwaXhlbHMgaW4gdGhlIEltYWdlIFNyYyAoU21hbGwpIGltYWdlIHRoYXQgY29ycmVzcG9uZCB0byBhbiBlcXVpdmFsZW50IG5vbi16ZXJvIHBpeGVsIGluIHRoZSBtYXNrIGltYWdlIGFyZSBjb3BpZWQuIEFsbCBvdGhlciBwaXhlbHMga2VlcCB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuIFRoZSBlbnRpcmUgaW1hZ2UgaXMgcHJvY2Vzc2VkIGlmIEltYWdlIE1hc2sgaXMgTlVMTCBvciB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyoKKyogIG9wdGlvbiBkZWZhdWx0czoKKyogICAgICAgc2VhcmNoUmVjdCA9IElNQVFfTk9fUkVDVAorKiAJCW1pbk1hdGNoU2NvcmUgPSBERUZBVUxUX01JTk1BWF9TQ09SRSAoODAwKSAgCisqLworaW50IGZyY0VxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCBtaW4sIGZsb2F0IG1heCkKK3sJcmV0dXJuIGZyY0VxdWFsaXplKGRlc3QsIHNvdXJjZSwgbWluLCBtYXgsIE5VTEwpOyAgfQorCitpbnQgZnJjRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBjb25zdCBJbWFnZSogbWFzaykKK3sKKwlyZXR1cm4gaW1hcUVxdWFsaXplKGRlc3QsIHNvdXJjZSwgbWluLCBtYXgsIG1hc2spOworfQorCisvKioKKyogQGJyaWVmIEltcHJvdmVzIGNvbnRyYXN0IG9uIGEgY29sb3IgaW1hZ2UuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wKKyogCisqIG9wdGlvbiBkZWZhdWx0czogY29sb3JFcXVhbGl6YXRpb24gPSBUUlVFIHRvIGVxdWFsaXplIGFsbCB0aHJlZSBwbGFuZXMgb2YgdGhlIGltYWdlICAgICAgICAgCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLiAgICAKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byBlcXVhbGl6ZSAKKyogQHBhcmFtIGNvbG9yRXF1YWxpemF0aW9uIFNldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIGVxdWFsaXplIGFsbCB0aHJlZSBwbGFuZXMgb2YgdGhlIGltYWdlICh0aGUgZGVmYXVsdCkuIFNldCB0aGlzIHBhcmFtZXRlciB0byBGQUxTRSB0byBlcXVhbGl6ZSBvbmx5IHRoZSBsdW1pbmFuY2UgcGxhbmUuCisqLworaW50IGZyY0NvbG9yRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpCit7CisJcmV0dXJuIGltYXFDb2xvckVxdWFsaXplKGRlc3QsIHNvdXJjZSwgVFJVRSk7Cit9CisKK2ludCBmcmNDb2xvckVxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgY29sb3JFcXVhbGl6YXRpb24pCit7CisJcmV0dXJuIGltYXFDb2xvckVxdWFsaXplKGRlc3QsIHNvdXJjZSwgVFJVRSk7Cit9CisKKy8qICAgSW1hZ2UgQ29udmVyc2lvbiBmdW5jdGlvbnMgKi8KKworLyoqCisqIEBicmllZiBBdXRvbWF0aWNhbGx5IHRocmVzaG9sZHMgYSBncmF5c2NhbGUgaW1hZ2UgaW50byBhIGJpbmFyeSBpbWFnZSBmb3IgUGFydGljbGUgQW5hbHlzaXMgYmFzZWQgb24gYSBzbWFydCB0aHJlc2hvbGQuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9JMTYKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQgCisqIEBwYXJhbSB3aW5kb3dXaWR0aCBUaGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIHdpbmRvdyBhcm91bmQgdGhlIHBpeGVsIG9uIHdoaWNoIHRoZSBmdW5jdGlvbgorKiAgcGVyZm9ybXMgdGhlIGxvY2FsIHRocmVzaG9sZC4gVGhpcyBudW1iZXIgbXVzdCBiZSBhdCBsZWFzdCAzIGFuZCBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIHdpZHRoIG9mIHNvdXJjZQorKiBAcGFyYW0gd2luZG93SGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIHdpbmRvdyBhcm91bmQgdGhlIHBpeGVsIG9uIHdoaWNoIHRoZSBmdW5jdGlvbiAKKyogcGVyZm9ybXMgdGhlIGxvY2FsIHRocmVzaG9sZC4gVGhpcyBudW1iZXIgbXVzdCBiZSBhdCBsZWFzdCAzIGFuZCBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIGhlaWdodCBvZiBzb3VyY2UKKyogQHBhcmFtIG1ldGhvZCBTcGVjaWZpZXMgdGhlIGxvY2FsIHRocmVzaG9sZGluZyBtZXRob2QgdGhlIGZ1bmN0aW9uIHVzZXMuIFZhbHVlIGNhbiBiZSBJTUFRX05JQkxBQ0sgCisqICh3aGljaCBjb21wdXRlcyB0aHJlc2hvbGRzIGZvciBlYWNoIHBpeGVsIGJhc2VkIG9uIGl0cyBsb2NhbCBzdGF0aXN0aWNzIHVzaW5nIHRoZSBOaWJsYWNrIGxvY2FsIHRocmVzaG9sZGluZworKiBhbGdvcml0aG0uKSwgb3IgSU1BUV9CQUNLR1JPVU5EX0NPUlJFQ1RJT04gKHdoaWNoIGRvZXMgYmFja2dyb3VuZCBjb3JyZWN0aW9uIGZpcnN0IHRvIGVsaW1pbmF0ZSBub24tdW5pZm9ybSAKKyogbGlnaHRpbmcgZWZmZWN0cywgdGhlbiBwZXJmb3JtcyB0aHJlc2hvbGRpbmcgdXNpbmcgdGhlIE90c3UgdGhyZXNob2xkaW5nIGFsZ29yaXRobSkKKyogQHBhcmFtIGRldmlhdGlvbldlaWdodCBTcGVjaWZpZXMgdGhlIGsgY29uc3RhbnQgdXNlZCBpbiB0aGUgTmlibGFjayBsb2NhbCB0aHJlc2hvbGRpbmcgYWxnb3JpdGhtLCB3aGljaCAKKyogZGV0ZXJtaW5lcyB0aGUgd2VpZ2h0IGFwcGxpZWQgdG8gdGhlIHZhcmlhbmNlIGNhbGN1bGF0aW9uLiBWYWxpZCBrIGNvbnN0YW50cyByYW5nZSBmcm9tIDAgdG8gMS4gU2V0dGluZyAKKyogdGhpcyB2YWx1ZSB0byAwIHdpbGwgaW5jcmVhc2UgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBmdW5jdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiB3aWxsIG5vdCBjYWxjdWxhdGUgdGhlIAorKiB2YXJpYW5jZSBmb3IgYW55IG9mIHRoZSBwaXhlbHMuIFRoZSBmdW5jdGlvbiBpZ25vcmVzIHRoaXMgdmFsdWUgaWYgbWV0aG9kIGlzIG5vdCBzZXQgdG8gSU1BUV9OSUJMQUNLCisqIEBwYXJhbSB0eXBlIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBvYmplY3RzIGZvciB3aGljaCB5b3Ugd2FudCB0byBsb29rLiBWYWx1ZXMgY2FuIGJlIElNQVFfQlJJR0hUX09CSkVDVFMgCisqIG9yIElNQVFfREFSS19PQkpFQ1RTLgorKiBAcGFyYW0gcmVwbGFjZVZhbHVlIFNwZWNpZmllcyB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgdGhlIGZ1bmN0aW9uIHVzZXMgZm9yIHRoZSBwaXhlbHMgb2YgdGhlIGtlcHQgb2JqZWN0cyAKKyogaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjU21hcnRUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIAorCQl1bnNpZ25lZCBpbnQgd2luZG93V2lkdGgsIHVuc2lnbmVkIGludCB3aW5kb3dIZWlnaHQsIExvY2FsVGhyZXNob2xkTWV0aG9kIG1ldGhvZCwgCisJCWRvdWJsZSBkZXZpYXRpb25XZWlnaHQsIE9iamVjdFR5cGUgdHlwZSkKK3sKKwlmbG9hdCByZXBsYWNlVmFsdWUgPSAxLjA7CisJcmV0dXJuIGltYXFMb2NhbFRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQsIG1ldGhvZCwgCisJCQlkZXZpYXRpb25XZWlnaHQsIHR5cGUsIHJlcGxhY2VWYWx1ZSk7Cit9CisKK2ludCBmcmNTbWFydFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgCisJCXVuc2lnbmVkIGludCB3aW5kb3dXaWR0aCwgdW5zaWduZWQgaW50IHdpbmRvd0hlaWdodCwgTG9jYWxUaHJlc2hvbGRNZXRob2QgbWV0aG9kLCAKKwkJZG91YmxlIGRldmlhdGlvbldlaWdodCwgT2JqZWN0VHlwZSB0eXBlLCBmbG9hdCByZXBsYWNlVmFsdWUpCit7CisJcmV0dXJuIGltYXFMb2NhbFRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQsIG1ldGhvZCwgCisJCQlkZXZpYXRpb25XZWlnaHQsIHR5cGUsIHJlcGxhY2VWYWx1ZSk7Cit9CisKKy8qKgorKiBAYnJpZWYgQ29udmVydHMgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYSBiaW5hcnkgaW1hZ2UgZm9yIFBhcnRpY2xlIEFuYWx5c2lzIGJhc2VkIG9uIGEgZml4ZWQgdGhyZXNob2xkLiAKKyogVGhlIGZ1bmN0aW9uIHNldHMgcGl4ZWxzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSBnaXZlbiByYW5nZSB0byAwLiBUaGUgZnVuY3Rpb24gc2V0cyBwaXhlbCB2YWx1ZXMgCisqIHdpdGhpbiB0aGUgcmFuZ2UgdG8gYSBnaXZlbiB2YWx1ZSBvciBsZWF2ZXMgdGhlIHZhbHVlcyB1bmNoYW5nZWQuIAorKiBVc2UgdGhlIHNpbXBsaWZpZWQgY2FsbCB0byBsZWF2ZSBwaXhlbCB2YWx1ZXMgdW5jaGFuZ2VkLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9JMTYuCisqIAorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIHRocmVzaG9sZCAKKyogQHBhcmFtIHJhbmdlTWluIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2Ugb2YgcGl4ZWwgdmFsdWVzIHRvIGtlZXAKKyogQHBhcmFtIHJhbmdlTWF4IFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2Ugb2YgcGl4ZWwgdmFsdWVzIHRvIGtlZXAuCisqIAorKiBAcmV0dXJuIGludCAtIGVycm9yIGNvZGU6IDAgPSBlcnJvci4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNTaW1wbGVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IHJhbmdlTWluLCBmbG9hdCByYW5nZU1heCkKK3sKKwlpbnQgbmV3VmFsdWUgPSAyNTU7CisJcmV0dXJuIGZyY1NpbXBsZVRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHJhbmdlTWluLCByYW5nZU1heCwgbmV3VmFsdWUpOworfQorCisvKioKKyogQGJyaWVmIENvbnZlcnRzIGEgZ3JheXNjYWxlIGltYWdlIHRvIGEgYmluYXJ5IGltYWdlIGZvciBQYXJ0aWNsZSBBbmFseXNpcyBiYXNlZCBvbiBhIGZpeGVkIHRocmVzaG9sZC4gCisqIFRoZSBmdW5jdGlvbiBzZXRzIHBpeGVscyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgZ2l2ZW4gcmFuZ2UgdG8gMC4gVGhlIGZ1bmN0aW9uIHNldHMgCisqIHBpeGVsIHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIHRvIHRoZSBnaXZlbiB2YWx1ZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0kxNi4KKyogCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkIAorKiBAcGFyYW0gcmFuZ2VNaW4gVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSBvZiBwaXhlbCB2YWx1ZXMgdG8ga2VlcAorKiBAcGFyYW0gcmFuZ2VNYXggVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSBvZiBwaXhlbCB2YWx1ZXMgdG8ga2VlcC4KKyogQHBhcmFtIG5ld1ZhbHVlIFRoZSByZXBsYWNlbWVudCB2YWx1ZSBmb3IgcGl4ZWxzIHdpdGhpbiB0aGUgcmFuZ2UuIFVzZSB0aGUgc2ltcGxpZmllZCBjYWxsIHRvIGxlYXZlIHRoZSBwaXhlbCB2YWx1ZXMgdW5jaGFuZ2VkIAorKiAKKyogQHJldHVybiBpbnQgLSBlcnJvciBjb2RlOiAwID0gZXJyb3IuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjU2ltcGxlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCByYW5nZU1pbiwgZmxvYXQgcmFuZ2VNYXgsIGZsb2F0IG5ld1ZhbHVlKQoreworCWludCB1c2VOZXdWYWx1ZSA9IFRSVUU7CisJcmV0dXJuIGltYXFUaHJlc2hvbGQoZGVzdCwgc291cmNlLCByYW5nZU1pbiwgcmFuZ2VNYXgsIHVzZU5ld1ZhbHVlLCBuZXdWYWx1ZSk7Cit9CisKKy8qKgorKiBAYnJpZWYgQXBwbGllcyBhIHRocmVzaG9sZCB0byB0aGUgUmVkLCBHcmVlbiwgYW5kIEJsdWUgdmFsdWVzIG9mIGEgUkdCIGltYWdlIG9yIHRoZSBIdWUsIAorKiBTYXR1cmF0aW9uLCBMdW1pbmFuY2UgdmFsdWVzIGZvciBhIEhTTCBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTC4KKyogVGhpcyBzaW1wbGVyIHZlcnNpb24gZmlsdGVycyBiYXNlZCBvbiBhIGh1ZSByYW5nZSBpbiB0aGUgSFNMIG1vZGUuCisqIAorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuIFRoaXMgbXVzdCBiZSBhIElNQVFfSU1BR0VfVTggaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIHRocmVzaG9sZCAKKyogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIHNwYWNlIHRvIHBlcmZvcm0gdGhlIHRocmVzaG9sZCBpbi4gdmFsaWQgdmFsdWVzIGFyZTogSU1BUV9SR0IsIElNQVFfSFNMLgorKiBAcGFyYW0gcGxhbmUxUmFuZ2UgVGhlIHNlbGVjdGlvbiByYW5nZSBmb3IgdGhlIGZpcnN0IHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIEBwYXJhbSBwbGFuZTJSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgc2Vjb25kIHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIEBwYXJhbSBwbGFuZTNSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgdGhpcmQgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKiAqLworaW50IGZyY0NvbG9yVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBDb2xvck1vZGUgbW9kZSwgCisJCWNvbnN0IFJhbmdlKiBwbGFuZTFSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lMlJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUzUmFuZ2UpCit7CisJaW50IHJlcGxhY2VWYWx1ZSA9IDE7CisJcmV0dXJuIGltYXFDb2xvclRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHJlcGxhY2VWYWx1ZSwgbW9kZSwgcGxhbmUxUmFuZ2UsIHBsYW5lMlJhbmdlLCBwbGFuZTNSYW5nZSk7Cit9CisKKy8qKgorKiBAYnJpZWYgQXBwbGllcyBhIHRocmVzaG9sZCB0byB0aGUgUmVkLCBHcmVlbiwgYW5kIEJsdWUgdmFsdWVzIG9mIGEgUkdCIGltYWdlIG9yIHRoZSBIdWUsIAorKiBTYXR1cmF0aW9uLCBMdW1pbmFuY2UgdmFsdWVzIGZvciBhIEhTTCBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTC4KKyogVGhlIHNpbXBsZXIgdmVyc2lvbiBmaWx0ZXJzIGJhc2VkIG9uIGEgaHVlIHJhbmdlIGluIHRoZSBIU0wgbW9kZS4KKyogCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4gVGhpcyBtdXN0IGJlIGEgSU1BUV9JTUFHRV9VOCBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkIAorKiBAcGFyYW0gcmVwbGFjZVZhbHVlIFZhbHVlIHRvIGFzc2lnbiB0byBzZWxlY3RlZCBwaXhlbHMuIERlZmF1bHRzIHRvIDEgaWYgc2ltcGxpZmllZCBjYWxsIGlzIHVzZWQuCisqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBzcGFjZSB0byBwZXJmb3JtIHRoZSB0aHJlc2hvbGQgaW4uIHZhbGlkIHZhbHVlcyBhcmU6IElNQVFfUkdCLCBJTUFRX0hTTC4KKyogQHBhcmFtIHBsYW5lMVJhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSBmaXJzdCBwbGFuZSBvZiB0aGUgaW1hZ2UuIFNldCB0aGlzIHBhcmFtZXRlciB0byBOVUxMIHRvIHVzZSBhIHNlbGVjdGlvbiByYW5nZSBmcm9tIDAgdG8gMjU1LgorKiBAcGFyYW0gcGxhbmUyUmFuZ2UgVGhlIHNlbGVjdGlvbiByYW5nZSBmb3IgdGhlIHNlY29uZCBwbGFuZSBvZiB0aGUgaW1hZ2UuIFNldCB0aGlzIHBhcmFtZXRlciB0byBOVUxMIHRvIHVzZSBhIHNlbGVjdGlvbiByYW5nZSBmcm9tIDAgdG8gMjU1LgorKiBAcGFyYW0gcGxhbmUzUmFuZ2UgVGhlIHNlbGVjdGlvbiByYW5nZSBmb3IgdGhlIHRoaXJkIHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCByZXBsYWNlVmFsdWUsIENvbG9yTW9kZSBtb2RlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSkKK3sJcmV0dXJuIGltYXFDb2xvclRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHJlcGxhY2VWYWx1ZSwgbW9kZSwgcGxhbmUxUmFuZ2UsIHBsYW5lMlJhbmdlLCBwbGFuZTNSYW5nZSk7fQorCisKKy8qKgorKiBAYnJpZWYgQSBzaW1wbGVyIHZlcnNpb24gb2YgQ29sb3JUaHJlc2hvbGQgdGhhdCB0aHJlc2hvbGRzIGh1ZSByYW5nZSBpbiB0aGUgSFNMIG1vZGUuIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTC4KKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQgCisqIEBwYXJhbSBodWVSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgaHVlIChjb2xvcikuIAorKiBAcGFyYW0gbWluU2F0dXJhdGlvbiBUaGUgbWluaW11bSBzYXR1cmF0aW9uIHZhbHVlICgxLTI1NSkuICBJZiBub3QgdXNlZCwgREVGQVVMVF9TQVRVUkFUSU9OX1RIUkVTSE9MRCBpcyB0aGUgZGVmYXVsdC4KKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNIdWVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IFJhbmdlKiBodWVSYW5nZSkKK3sgcmV0dXJuIGZyY0h1ZVRocmVzaG9sZChkZXN0LCBzb3VyY2UsIGh1ZVJhbmdlLCBERUZBVUxUX1NBVFVSQVRJT05fVEhSRVNIT0xEKTsgfQorCitpbnQgZnJjSHVlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBSYW5nZSogaHVlUmFuZ2UsIGludCBtaW5TYXR1cmF0aW9uKQoreworCS8vIGFzc3VtZSBIU0wgbW9kZQorCUNvbG9yTW9kZSBtb2RlID0gSU1BUV9IU0w7ICAKKwkvLyBTZXQgc2F0dXJhdGlvbiAxMDAgLSAyNTUKKwlSYW5nZSBzYXRSYW5nZTsgIHNhdFJhbmdlLm1pblZhbHVlID0gbWluU2F0dXJhdGlvbjsgc2F0UmFuZ2UubWF4VmFsdWUgPSAyNTU7CisJLy8gU2V0IGx1bWluYW5jZSAxMDAgLSAyNTUKKwlSYW5nZSBsdW1SYW5nZTsgIGx1bVJhbmdlLm1pblZhbHVlID0gMTAwOyBsdW1SYW5nZS5tYXhWYWx1ZSA9IDI1NTsKKwkvLyBSZXBsYWNlIHBpeGVscyB3aXRoIDEgaWYgcGFzcyB0aHJlc2hvbGQgZmlsdGVyCisJaW50IHJlcGxhY2VWYWx1ZSA9IDE7CisJcmV0dXJuIGltYXFDb2xvclRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHJlcGxhY2VWYWx1ZSwgbW9kZSwgaHVlUmFuZ2UsICZzYXRSYW5nZSwgJmx1bVJhbmdlKTsKK30KKworLyoqCisqIEBicmllZiBFeHRyYWN0cyB0aGUgUmVkLCBHcmVlbiwgQmx1ZSwgb3IgSHVlLCBTYXR1cmF0aW9uIG9yIEx1bWluYW5jZSBpbmZvcm1hdGlvbiBmcm9tIGEgY29sb3IgaW1hZ2UuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wsIElNQVFfSU1BR0VfUkdCX1U2NC4KKyogCisqIEBwYXJhbSBpbWFnZSBUaGUgc291cmNlIGltYWdlIHRoYXQgdGhlIGZ1bmN0aW9uIGV4dHJhY3RzIHRoZSBwbGFuZXMgZnJvbS4KKyogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIHNwYWNlIHRoYXQgdGhlIGZ1bmN0aW9uIGV4dHJhY3RzIHRoZSBwbGFuZXMgZnJvbS4gVmFsaWQgdmFsdWVzIGFyZSBJTUFRX1JHQiwgSU1BUV9IU0wsIElNQVFfSFNWLCBJTUFRX0hTSS4KKyogQHBhcmFtIHBsYW5lMSBPbiByZXR1cm4sIHRoZSBmaXJzdCBleHRyYWN0ZWQgcGxhbmUuIFNldCB0aGlzIHBhcmFtZXRlciB0byBOVUxMIGlmIHlvdSBkbyBub3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uLiBSR0ItUmVkLCBIU0wvSFNWL0hTSS1IdWUuCisqIEBwYXJhbSBwbGFuZTIgT24gcmV0dXJuLCB0aGUgc2Vjb25kIGV4dHJhY3RlZCBwbGFuZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgaWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFJHQi1HcmVlbiwgSFNML0hTVi9IU0ktU2F0dXJhdGlvbi4KKyogQHBhcmFtIHBsYW5lMyBPbiByZXR1cm4sIHRoZSB0aGlyZCBleHRyYWN0ZWQgcGxhbmUuIFNldCB0aGlzIHBhcmFtZXRlciB0byBOVUxMIGlmIHlvdSBkbyBub3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uLiBSR0ItQmx1ZSwgSFNMLUx1bWluYW5jZSwgSFNWLVZhbHVlLCBIU0ktSW50ZW5zaXR5LgorKgorKiBAcmV0dXJuIGVycm9yIGNvZGU6IDAgPSBlcnJvci4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNFeHRyYWN0Q29sb3JQbGFuZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBDb2xvck1vZGUgbW9kZSwgCisJCUltYWdlKiBwbGFuZTEsIEltYWdlKiBwbGFuZTIsIEltYWdlKiBwbGFuZTMpCit7CXJldHVybiBpbWFxRXh0cmFjdENvbG9yUGxhbmVzKGltYWdlLCBtb2RlLCBwbGFuZTEsIHBsYW5lMiwgcGxhbmUzKTsgfQorCisvKioKKyogQGJyaWVmIEV4dHJhY3RzIHRoZSBIdWUgaW5mb3JtYXRpb24gZnJvbSBhIGNvbG9yIGltYWdlLiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wsIElNQVFfSU1BR0VfUkdCX1U2NCAKKyogCisqIEBwYXJhbSBpbWFnZSBUaGUgc291cmNlIGltYWdlIHRoYXQgdGhlIGZ1bmN0aW9uIGV4dHJhY3RzIHRoZSBwbGFuZSBmcm9tLgorKiBAcGFyYW0gaHVlUGxhbmUgT24gcmV0dXJuLCB0aGUgZXh0cmFjdGVkIGh1ZSBwbGFuZS4gCisqIEBwYXJhbSBtaW5TYXR1cmF0aW9uIHRoZSBtaW5pbXVtIHNhdHVyYXRpb24gbGV2ZWwgcmVxdWlyZWQgMC0yNTUgKHRyeSA1MCkgIAorKiAgICAgICAgICAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuICAgICAKKyovCitpbnQgZnJjRXh0cmFjdEh1ZVBsYW5lKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2UqIGh1ZVBsYW5lKQoreworCXJldHVybiBmcmNFeHRyYWN0SHVlUGxhbmUoaW1hZ2UsIGh1ZVBsYW5lLCBERUZBVUxUX1NBVFVSQVRJT05fVEhSRVNIT0xEKTsKK30KKworaW50IGZyY0V4dHJhY3RIdWVQbGFuZShjb25zdCBJbWFnZSogaW1hZ2UsIEltYWdlKiBodWVQbGFuZSwgaW50IG1pblNhdHVyYXRpb24pCit7CisJcmV0dXJuIGZyY0V4dHJhY3RDb2xvclBsYW5lcyhpbWFnZSwgSU1BUV9IU0wsIGh1ZVBsYW5lLCBOVUxMLCBOVUxMKTsKK30KKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2ZvcndwaWxpYi9SRUFETUUgYi9hb3MvZXh0ZXJuYWxzL2ZvcndwaWxpYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhMWE3OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvZm9yd3BpbGliL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGZpbGVzIHRoYXQgd2UgcGxhbiB0byBldmVudHVhbGx5IHB1c2ggdG8gdXBzdHJlYW0KK1dQSUxpYiBidXQgaGF2ZW4ndCB5ZXQuCisKK1RoZSBjYW5vbmljYWwgbG9jYXRpb24gZm9yIGRtYS4qIGlzIHJvYm90aWNzLm12bGEubmV0Oi93d3cvaHR0cHMvZ2l0L2ZyYzk3MS9qZXJyeS9kbWEuZ2l0LgpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9mb3J3cGlsaWIvZG1hLmNjIGIvYW9zL2V4dGVybmFscy9mb3J3cGlsaWIvZG1hLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OGZmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2ZvcndwaWxpYi9kbWEuY2MKQEAgLTAsMCArMSw0NTggQEAKKyNpbmNsdWRlICJkbWEuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSAiRGlnaXRhbFNvdXJjZS5oIgorI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisjaW5jbHVkZSAiRW5jb2Rlci5oIgorCisKKy8vIEludGVyZmFjZSB0byB0aGUgcm9ib1JJTyBGUEdBJ3MgRE1BIGZlYXR1cmVzLgorCisvLyBMaWtlIHRFbmNvZGVyOjp0T3V0cHV0IHdpdGggdGhlIGJpdGZpZWxkcyByZXZlcnNlZC4KK3R5cGVkZWYgdW5pb24geworICBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIERpcmVjdGlvbjogMTsKKyAgICBzaWduZWQgVmFsdWU6IDMxOworICB9OworICBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIHZhbHVlOiAzMjsKKyAgfTsKK30gdDFPdXRwdXQ7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTnVtSGVhZGVycyA9IDEwOworCitzdGF0aWMgY29uc3RleHByIHNzaXplX3Qga0NoYW5uZWxTaXplWzE4XSA9IHsyLCAyLCA0LCA0LCAyLCAyLCA0LCA0LCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMiwgMSwgNCwgNCwgNCwgNCwgNCwgNH07CisKK2VudW0gRE1BT2Zmc2V0Q29uc3RhbnRzIHsKKyAga0VuYWJsZV9BSTBfTG93ID0gMCwKKyAga0VuYWJsZV9BSTBfSGlnaCA9IDEsCisgIGtFbmFibGVfQUlBdmVyYWdlZDBfTG93ID0gMiwKKyAga0VuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoID0gMywKKyAga0VuYWJsZV9BSTFfTG93ID0gNCwKKyAga0VuYWJsZV9BSTFfSGlnaCA9IDUsCisgIGtFbmFibGVfQUlBdmVyYWdlZDFfTG93ID0gNiwKKyAga0VuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoID0gNywKKyAga0VuYWJsZV9BY2N1bXVsYXRvcjAgPSA4LAorICBrRW5hYmxlX0FjY3VtdWxhdG9yMSA9IDksCisgIGtFbmFibGVfREkgPSAxMCwKKyAga0VuYWJsZV9BbmFsb2dUcmlnZ2VycyA9IDExLAorICBrRW5hYmxlX0NvdW50ZXJzX0xvdyA9IDEyLAorICBrRW5hYmxlX0NvdW50ZXJzX0hpZ2ggPSAxMywKKyAga0VuYWJsZV9Db3VudGVyVGltZXJzX0xvdyA9IDE0LAorICBrRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaCA9IDE1LAorICBrRW5hYmxlX0VuY29kZXJzID0gMTYsCisgIGtFbmFibGVfRW5jb2RlclRpbWVycyA9IDE3LAorfTsKKworRE1BOjpETUEoKSB7CisgIHRSaW9TdGF0dXNDb2RlIHN0YXR1cyA9IDA7CisgIHRkbWFfY29uZmlnXyA9IHRETUE6OmNyZWF0ZSgmc3RhdHVzKTsKKyAgdGRtYV9jb25maWdfLT53cml0ZUNvbmZpZ19FeHRlcm5hbENsb2NrKGZhbHNlLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIE5pRnBnYV9Xcml0ZVUzMigweDEwMDAwLCAweDE4MzJjLCAweDApOworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgU2V0UmF0ZSgxKTsKKyAgU2V0UGF1c2UoZmFsc2UpOworfQorCitETUE6On5ETUEoKSB7CisgIHRSaW9TdGF0dXNDb2RlIHN0YXR1cyA9IDA7CisKKyAgbWFuYWdlcl8tPnN0b3AoJnN0YXR1cyk7CisgIGRlbGV0ZSB0ZG1hX2NvbmZpZ187Cit9CisKK3ZvaWQgRE1BOjpTZXRQYXVzZShib29sIHBhdXNlKSB7CisgIHRSaW9TdGF0dXNDb2RlIHN0YXR1cyA9IDA7CisgIHRkbWFfY29uZmlnXy0+d3JpdGVDb25maWdfUGF1c2UocGF1c2UsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKwordm9pZCBETUE6OlNldFJhdGUodWludDMyX3QgY3ljbGVzKSB7CisgIGlmIChjeWNsZXMgPCAxKSB7CisgICAgY3ljbGVzID0gMTsKKyAgfQorICB0UmlvU3RhdHVzQ29kZSBzdGF0dXMgPSAwOworICB0ZG1hX2NvbmZpZ18tPndyaXRlUmF0ZShjeWNsZXMsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKwordm9pZCBETUE6OkFkZChFbmNvZGVyICplbmNvZGVyKSB7CisgIHRSaW9TdGF0dXNDb2RlIHN0YXR1cyA9IDA7CisKKyAgaWYgKG1hbmFnZXJfKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyLAorICAgICAgICAiRE1BOjpBZGQoKSBvbmx5IHdvcmtzIGJlZm9yZSBETUE6OlN0YXJ0KCkiKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGVuY29kZXItPkdldEZQR0FJbmRleCgpID49IDQpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dCgKKyAgICAgICAgTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyLAorICAgICAgICAiRlBHQSBlbmNvZGVyIGluZGV4IGlzIG5vdCBpbiB0aGUgNCB0aGF0IGdldCBsb2dnZWQuIik7CisgIH0KKworICAvLyBUT0RPKGF1c3Rpbik6IEVuY29kZXIgdXNlcyBhIENvdW50ZXIgZm9yIDF4IG9yIDJ4OyBxdWFkIGZvciA0eC4uLgorICB0ZG1hX2NvbmZpZ18tPndyaXRlQ29uZmlnX0VuYWJsZV9FbmNvZGVycyh0cnVlLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKK3ZvaWQgRE1BOjpBZGQoRGlnaXRhbFNvdXJjZSAqIC8qaW5wdXQqLykgeworICB0UmlvU3RhdHVzQ29kZSBzdGF0dXMgPSAwOworCisgIGlmIChtYW5hZ2VyXykgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlciwKKyAgICAgICAgIkRNQTo6QWRkKCkgb25seSB3b3JrcyBiZWZvcmUgRE1BOjpTdGFydCgpIik7CisgICAgcmV0dXJuOworICB9CisKKyAgdGRtYV9jb25maWdfLT53cml0ZUNvbmZpZ19FbmFibGVfREkodHJ1ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCit2b2lkIERNQTo6QWRkKEFuYWxvZ0lucHV0ICppbnB1dCkgeworICB0UmlvU3RhdHVzQ29kZSBzdGF0dXMgPSAwOworCisgIGlmIChtYW5hZ2VyXykgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlciwKKyAgICAgICAgIkRNQTo6QWRkKCkgb25seSB3b3JrcyBiZWZvcmUgRE1BOjpTdGFydCgpIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGlucHV0LT5HZXRDaGFubmVsKCkgPD0gMykgeworICAgIHRkbWFfY29uZmlnXy0+d3JpdGVDb25maWdfRW5hYmxlX0FJMF9Mb3codHJ1ZSwgJnN0YXR1cyk7CisgIH0gZWxzZSB7CisgICAgdGRtYV9jb25maWdfLT53cml0ZUNvbmZpZ19FbmFibGVfQUkwX0hpZ2godHJ1ZSwgJnN0YXR1cyk7CisgIH0KKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKK3ZvaWQgRE1BOjpTZXRFeHRlcm5hbFRyaWdnZXIoRGlnaXRhbFNvdXJjZSAqaW5wdXQsIGJvb2wgcmlzaW5nLCBib29sIGZhbGxpbmcpIHsKKyAgdFJpb1N0YXR1c0NvZGUgc3RhdHVzID0gMDsKKworICBpZiAobWFuYWdlcl8pIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChOaUZwZ2FfU3RhdHVzX0ludmFsaWRQYXJhbWV0ZXIsCisgICAgICAgICJETUE6OlNldEV4dGVybmFsVHJpZ2dlcigpIG9ubHkgd29ya3MgYmVmb3JlIERNQTo6U3RhcnQoKSIpOworICAgIHJldHVybjsKKyAgfQorCisgIGF1dG8gaW5kZXggPQorICAgICAgOjpzdGQ6OmZpbmQodHJpZ2dlcl9jaGFubmVsc18uYmVnaW4oKSwgdHJpZ2dlcl9jaGFubmVsc18uZW5kKCksIGZhbHNlKTsKKyAgaWYgKGluZGV4ID09IHRyaWdnZXJfY2hhbm5lbHNfLmVuZCgpKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJETUE6IE5vIGNoYW5uZWxzIGxlZnQiKTsKKyAgICByZXR1cm47CisgIH0KKyAgKmluZGV4ID0gdHJ1ZTsKKworICBjb25zdCBpbnQgY2hhbm5lbF9pbmRleCA9IGluZGV4IC0gdHJpZ2dlcl9jaGFubmVsc18uYmVnaW4oKTsKKyAgLyoKKyAgcHJpbnRmKAorICAgICAgIkFsbG9jYXRpbmcgdHJpZ2dlciBvbiBpbmRleCAlZCwgcm91dGluZyBtb2R1bGUgJWQsIHJvdXRpbmcgY2hhbm5lbCAlZCwgIgorICAgICAgImlzIGFuYWxvZyAlZFxuIiwKKyAgICAgIGNoYW5uZWxfaW5kZXgsIGlucHV0LT5HZXRNb2R1bGVGb3JSb3V0aW5nKCksCisgICAgICBpbnB1dC0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwgaW5wdXQtPkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCkpOworICAqLworCisgIGNvbnN0IGJvb2wgaXNfZXh0ZXJuYWxfY2xvY2sgPQorICAgICAgdGRtYV9jb25maWdfLT5yZWFkQ29uZmlnX0V4dGVybmFsQ2xvY2soJnN0YXR1cyk7CisgIGlmIChzdGF0dXMgPT0gMCkgeworICAgIGlmICghaXNfZXh0ZXJuYWxfY2xvY2spIHsKKyAgICAgIHRkbWFfY29uZmlnXy0+d3JpdGVDb25maWdfRXh0ZXJuYWxDbG9jayh0cnVlLCAmc3RhdHVzKTsKKyAgICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgbkZQR0E6Om5GUkNfMjAxNV8xXzBfQTo6dERNQTo6dEV4dGVybmFsVHJpZ2dlcnMgbmV3X3RyaWdnZXI7CisKKyAgbmV3X3RyaWdnZXIuRmFsbGluZ0VkZ2UgPSBmYWxsaW5nOworICBuZXdfdHJpZ2dlci5SaXNpbmdFZGdlID0gcmlzaW5nOworICBuZXdfdHJpZ2dlci5FeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIgPQorICAgICAgaW5wdXQtPkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCk7CisgIG5ld190cmlnZ2VyLkV4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlciA9IGZhbHNlOworICBuZXdfdHJpZ2dlci5FeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSA9IGlucHV0LT5HZXRNb2R1bGVGb3JSb3V0aW5nKCk7CisgIG5ld190cmlnZ2VyLkV4dGVybmFsQ2xvY2tTb3VyY2VfQ2hhbm5lbCA9IGlucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpOworCisgIC8vIENvbmZpZ3VyZXMgdGhlIHRyaWdnZXIgdG8gYmUgZXh0ZXJuYWwsIG5vdCBvZmYgdGhlIEZQR0EgY2xvY2suCisgIC8qCisgIHRkbWFfY29uZmlnXy0+d3JpdGVFeHRlcm5hbFRyaWdnZXJzKGNoYW5uZWxfaW5kZXgsIG5ld190cmlnZ2VyLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICovCisKKyAgdWludDMyX3QgY3VycmVudF90cmlnZ2VyczsKKyAgdFJpb1N0YXR1c0NvZGUgcmVnaXN0ZXJfc3RhdHVzID0gTmlGcGdhX1JlYWRVMzIoMHgxMDAwMCwgMHgxODMyYywgJmN1cnJlbnRfdHJpZ2dlcnMpOworICBpZiAocmVnaXN0ZXJfc3RhdHVzICE9IDApIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChyZWdpc3Rlcl9zdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICByZXR1cm47CisgIH0KKyAgY3VycmVudF90cmlnZ2VycyA9IChjdXJyZW50X3RyaWdnZXJzICYgfigweGZmIDw8IChjaGFubmVsX2luZGV4ICogOCkpKSB8CisgICAgICAgICAgICAgICAgICAgICAobmV3X3RyaWdnZXIudmFsdWUgPDwgKGNoYW5uZWxfaW5kZXggKiA4KSk7CisgIHJlZ2lzdGVyX3N0YXR1cyA9IE5pRnBnYV9Xcml0ZVUzMigweDEwMDAwLCAweDE4MzJjLCBjdXJyZW50X3RyaWdnZXJzKTsKKyAgaWYgKHJlZ2lzdGVyX3N0YXR1cyAhPSAwKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQocmVnaXN0ZXJfc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgcmV0dXJuOworICB9Cit9CisKK0RNQTo6UmVhZFN0YXR1cyBETUE6OlJlYWQoRE1BU2FtcGxlICpzYW1wbGUsIHVpbnQzMl90IHRpbWVvdXRfbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcmVtYWluaW5nX291dCkgeworICB0UmlvU3RhdHVzQ29kZSBzdGF0dXMgPSAwOworICBzaXplX3QgcmVtYWluaW5nQnl0ZXMgPSAwOworICAqcmVtYWluaW5nX291dCA9IDA7CisKKyAgaWYgKCFtYW5hZ2VyXy5nZXQoKSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlciwKKyAgICAgICAgIkRNQTo6UmVhZCgpIG9ubHkgd29ya3MgYWZ0ZXIgRE1BOjpTdGFydCgpIik7CisgICAgcmV0dXJuIFNUQVRVU19FUlJPUjsKKyAgfQorCisgIHNhbXBsZS0+ZG1hXyA9IHRoaXM7CisgIC8vIG1lbXNldCgmc2FtcGxlLT5yZWFkX2J1ZmZlcl8sIDAsIHNpemVvZihzYW1wbGUtPnJlYWRfYnVmZmVyXykpOworICBtYW5hZ2VyXy0+cmVhZChzYW1wbGUtPnJlYWRfYnVmZmVyXywgY2FwdHVyZV9zaXplXywgdGltZW91dF9tcywKKyAgICAgICAgICAgICAgICAgJnJlbWFpbmluZ0J5dGVzLCAmc3RhdHVzKTsKKworICBpZiAoMCkgeyAvLyBERUJVRworICAgIHByaW50ZigiYnVmW10gPSAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgIGkgPCBzaXplb2Yoc2FtcGxlLT5yZWFkX2J1ZmZlcl8pIC8gc2l6ZW9mKHNhbXBsZS0+cmVhZF9idWZmZXJfWzBdKTsKKyAgICAgICAgICsraSkgeworICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICBwcmludGYoIiAiKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiMHglLjh4Iiwgc2FtcGxlLT5yZWFkX2J1ZmZlcl9baV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgIH0KKworICAvLyBUT0RPKGplcnJ5KTogRG8gdGhpcyBvbmx5IGlmIHN0YXR1cyA9PSAwPworICAqcmVtYWluaW5nX291dCA9IHJlbWFpbmluZ0J5dGVzIC8gY2FwdHVyZV9zaXplXzsKKworICBpZiAoMCkgeyAvLyBERUJVRworICAgIHByaW50ZigiUmVtYWluaW5nIHNhbXBsZXMgPSAlZFxuIiwgKnJlbWFpbmluZ19vdXQpOworICB9CisKKyAgLy8gVE9ETyhhdXN0aW4pOiBDaGVjayB0aGF0ICpyZW1haW5pbmdCeXRlcyAlIGNhcHR1cmVfc2l6ZV8gPT0gMCBhbmQgZGVhbAorICAvLyB3aXRoIGl0IGlmIGl0IGlzbid0LiAgUHJvYmFibHkgbWVhbnQgdGhhdCB3ZSBvdmVyZmxvd2VkPworICBpZiAoc3RhdHVzID09IDApIHsKKyAgICByZXR1cm4gU1RBVFVTX09LOworICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBOaUZwZ2FfU3RhdHVzX0ZpZm9UaW1lb3V0KSB7CisgICAgcmV0dXJuIFNUQVRVU19USU1FT1VUOworICB9IGVsc2UgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAgIHJldHVybiBTVEFUVVNfRVJST1I7CisgIH0KK30KKworY29uc3QgY2hhciAqRE1BOjpOYW1lT2ZSZWFkU3RhdHVzKFJlYWRTdGF0dXMgcykgeworICBzd2l0Y2ggKHMpIHsKKyAgICBjYXNlIFNUQVRVU19PSzogICAgICByZXR1cm4gIk9LIjsKKyAgICBjYXNlIFNUQVRVU19USU1FT1VUOiByZXR1cm4gIlRJTUVPVVQiOworICAgIGNhc2UgU1RBVFVTX0VSUk9SOiAgIHJldHVybiAiRVJST1IiOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIHJldHVybiAiKGJhZCBSZWFkU3RhdHVzIGNvZGUpIjsKKyAgfQorfQorCit2b2lkIERNQTo6U3RhcnQoc2l6ZV90IHF1ZXVlX2RlcHRoKSB7CisgIHRSaW9TdGF0dXNDb2RlIHN0YXR1cyA9IDA7CisgIHRjb25maWdfID0gdGRtYV9jb25maWdfLT5yZWFkQ29uZmlnKCZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgeworICAgIHNpemVfdCBhY2N1bV9zaXplID0gMDsKKyNkZWZpbmUgU0VUX1NJWkUoYml0KSAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICh0Y29uZmlnXy5iaXQpIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYW5uZWxfb2Zmc2V0c19bayMjYml0XSA9IGFjY3VtX3NpemU7IFwKKyAgICBhY2N1bV9zaXplICs9IGtDaGFubmVsU2l6ZVtrIyNiaXRdOyAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYW5uZWxfb2Zmc2V0c19bayMjYml0XSA9IC0xOyAgICAgICAgIFwKKyAgfQorCisgICAgU0VUX1NJWkUoRW5hYmxlX0FJMF9Mb3cpOworICAgIFNFVF9TSVpFKEVuYWJsZV9BSTBfSGlnaCk7CisgICAgU0VUX1NJWkUoRW5hYmxlX0FJQXZlcmFnZWQwX0xvdyk7CisgICAgU0VUX1NJWkUoRW5hYmxlX0FJQXZlcmFnZWQwX0hpZ2gpOworICAgIFNFVF9TSVpFKEVuYWJsZV9BSTFfTG93KTsKKyAgICBTRVRfU0laRShFbmFibGVfQUkxX0hpZ2gpOworICAgIFNFVF9TSVpFKEVuYWJsZV9BSUF2ZXJhZ2VkMV9Mb3cpOworICAgIFNFVF9TSVpFKEVuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoKTsKKyAgICBTRVRfU0laRShFbmFibGVfQWNjdW11bGF0b3IwKTsKKyAgICBTRVRfU0laRShFbmFibGVfQWNjdW11bGF0b3IxKTsKKyAgICBTRVRfU0laRShFbmFibGVfREkpOworICAgIFNFVF9TSVpFKEVuYWJsZV9BbmFsb2dUcmlnZ2Vycyk7CisgICAgU0VUX1NJWkUoRW5hYmxlX0NvdW50ZXJzX0xvdyk7CisgICAgU0VUX1NJWkUoRW5hYmxlX0NvdW50ZXJzX0hpZ2gpOworICAgIFNFVF9TSVpFKEVuYWJsZV9Db3VudGVyVGltZXJzX0xvdyk7CisgICAgU0VUX1NJWkUoRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaCk7CisgICAgU0VUX1NJWkUoRW5hYmxlX0VuY29kZXJzKTsKKyAgICBTRVRfU0laRShFbmFibGVfRW5jb2RlclRpbWVycyk7CisjdW5kZWYgU0VUX1NJWkUKKyAgICBjYXB0dXJlX3NpemVfID0gYWNjdW1fc2l6ZSArIDE7CisgIH0KKworICBtYW5hZ2VyXy5yZXNldCgKKyAgICAgIG5ldyBuRlBHQTo6dERNQU1hbmFnZXIoMCwgcXVldWVfZGVwdGggKiBjYXB0dXJlX3NpemVfLCAmc3RhdHVzKSk7CisKKyAgaWYgKDApIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgdFJpb1N0YXR1c0NvZGUgc3RhdHVzID0gMDsKKyAgICAgIGF1dG8geCA9IHRkbWFfY29uZmlnXy0+cmVhZEV4dGVybmFsVHJpZ2dlcnMoaSwgJnN0YXR1cyk7CisgICAgICBwcmludGYoCisgICAgICAgICAgImluZGV4ICVkLCBGYWxsaW5nRWRnZTogJWQsIFJpc2luZ0VkZ2U6ICVkLCAiCisgICAgICAgICAgIkV4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlcjogJWQsIEV4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlOiAiCisgICAgICAgICAgIiVkLCBFeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWw6ICVkXG4iLAorICAgICAgICAgIGksIHguRmFsbGluZ0VkZ2UsIHguUmlzaW5nRWRnZSwgeC5FeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIsCisgICAgICAgICAgeC5FeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSwgeC5FeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWwpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gU3RhcnQsIHN0b3AsIHN0YXJ0IHRvIGNsZWFyIHRoZSBidWZmZXIuCisgIG1hbmFnZXJfLT5zdGFydCgmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBtYW5hZ2VyXy0+c3RvcCgmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBtYW5hZ2VyXy0+c3RhcnQoJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICByZXR1cm47CisgIH0KKworfQorCitzdGF0aWNfYXNzZXJ0KDo6c3RkOjppc19wb2Q8RE1BU2FtcGxlPjo6dmFsdWUsICJETUFTYW1wbGUgbmVlZHMgdG8gYmUgUE9EIik7CisKK3NzaXplX3QgRE1BU2FtcGxlOjpvZmZzZXQoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBkbWFfLT5jaGFubmVsX29mZnNldHNfW2luZGV4XTsgfQorCitkb3VibGUgRE1BU2FtcGxlOjpHZXRUaW1lc3RhbXAoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KHJlYWRfYnVmZmVyX1tkbWFfLT5jYXB0dXJlX3NpemVfIC0gMV0pICogMC4wMDAwMDE7Cit9CisKK2Jvb2wgRE1BU2FtcGxlOjpHZXQoRGlnaXRhbFNvdXJjZSAqaW5wdXQpIGNvbnN0IHsKKyAgaWYgKG9mZnNldChrRW5hYmxlX0RJKSA9PSAtMSkgeworICAgIHdwaV9zZXRTdGF0aWNFcnJvcldpdGhDb250ZXh0KGRtYV8sCisgICAgICAgIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RGb3VuZCwKKyAgICAgICAgZ2V0SEFMRXJyb3JNZXNzYWdlKE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RGb3VuZCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaW5wdXQtPkdldENoYW5uZWxGb3JSb3V0aW5nKCkgPCBrTnVtSGVhZGVycykgeworICAgIHJldHVybiAocmVhZF9idWZmZXJfW29mZnNldChrRW5hYmxlX0RJKV0gPj4KKyAgICAgICAgICAgIGlucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpKSAmCisgICAgICAgICAgIDB4MTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKHJlYWRfYnVmZmVyX1tvZmZzZXQoa0VuYWJsZV9ESSldID4+CisgICAgICAgICAgICAoaW5wdXQtPkdldENoYW5uZWxGb3JSb3V0aW5nKCkgKyA2KSkgJgorICAgICAgICAgICAweDE7CisgIH0KK30KKworaW50MzJfdCBETUFTYW1wbGU6OkdldFJhdyhFbmNvZGVyICppbnB1dCkgY29uc3QgeworICBpZiAob2Zmc2V0KGtFbmFibGVfRW5jb2RlcnMpID09IC0xKSB7CisgICAgd3BpX3NldFN0YXRpY0Vycm9yV2l0aENvbnRleHQoZG1hXywKKyAgICAgICAgTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kLAorICAgICAgICBnZXRIQUxFcnJvck1lc3NhZ2UoTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kKSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGlucHV0LT5HZXRGUEdBSW5kZXgoKSA+PSA0KSB7CisgICAgd3BpX3NldFN0YXRpY0Vycm9yV2l0aENvbnRleHQoZG1hXywKKyAgICAgICAgTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kLAorICAgICAgICBnZXRIQUxFcnJvck1lc3NhZ2UoTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kKSk7CisgIH0KKworICB1aW50MzJfdCBkbWFXb3JkID0KKyAgICAgIHJlYWRfYnVmZmVyX1tvZmZzZXQoa0VuYWJsZV9FbmNvZGVycykgKyBpbnB1dC0+R2V0RlBHQUluZGV4KCldOworICBpbnQzMl90IHJlc3VsdCA9IDA7CisKKyAgaWYgKDEpIHsKKyAgICAvLyBFeHRyYWN0IHRoZSAzMS1iaXQgc2lnbmVkIHRFbmNvZGVyOjp0T3V0cHV0IFZhbHVlIHVzaW5nIGEgc3RydWN0IHdpdGggdGhlCisgICAgLy8gcmV2ZXJzZSBwYWNrZWQgZmllbGQgb3JkZXIgb2YgdE91dHB1dC4gVGhpcyBnZXRzIFZhbHVlIGZyb20gdGhlIGhpZ2gKKyAgICAvLyBvcmRlciAzMSBiaXRzIG9mIG91dHB1dCBvbiBsaXR0bGUtZW5kaWFuIEFSTSB1c2luZyBnY2MuIFRoaXMgd29ya3MKKyAgICAvLyBldmVuIHRob3VnaCBDL0MrKyBkb2Vzbid0IGd1YXJhbnRlZSBiaXRmaWVsZCBvcmRlci4KKyAgICB0MU91dHB1dCBvdXRwdXQ7CisKKyAgICBvdXRwdXQudmFsdWUgPSBkbWFXb3JkOworICAgIHJlc3VsdCA9IG91dHB1dC5WYWx1ZTsKKyAgfSBlbHNlIGlmICgxKSB7CisgICAgLy8gRXh0cmFjdCB0aGUgMzEtYml0IHNpZ25lZCB0RW5jb2Rlcjo6dE91dHB1dCBWYWx1ZSB1c2luZyByaWdodC1zaGlmdC4KKyAgICAvLyBUaGlzIHdvcmtzIGV2ZW4gdGhvdWdoIEMvQysrIGRvZXNuJ3QgZ3VhcmFudGVlIHdoZXRoZXIgc2lnbmVkID4+IGRvZXMKKyAgICAvLyBhcml0aG1ldGljIG9yIGxvZ2ljYWwgc2hpZnQuIChkbWFXb3JkIC8gMikgd291bGQgZml4IHRoYXQgYnV0IGl0IHJvdW5kcy4KKyAgICByZXN1bHQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkbWFXb3JkKSA+PiAxOworICB9CisjaWYgMCAgLy8gVGhpcyBhcHByb2FjaCB3YXMgcmVjb21tZW5kZWQgYnV0IGl0IGRvZXNuJ3QgcmV0dXJuIHRoZSByaWdodCB2YWx1ZS4KKyAgZWxzZSB7CisgICAgLy8gQnl0ZS1yZXZlcnNlIHRoZSBETUEgd29yZCAoYmlnLWVuZGlhbiB2YWx1ZSBmcm9tIHRoZSBGUEdBKSB0aGVuIGV4dHJhY3QKKyAgICAvLyB0aGUgMzEtYml0IHRFbmNvZGVyOjp0T3V0cHV0LiBUaGlzIGRvZXMgbm90IHJldHVybiB0aGUgcmlnaHQgVmFsdWUuCisgICAgdEVuY29kZXI6OnRPdXRwdXQgZW5jb2RlckRhdGE7CisKKyAgICBlbmNvZGVyRGF0YS52YWx1ZSA9IF9fYnVpbHRpbl9ic3dhcDMyKGRtYVdvcmQpOworICAgIHJlc3VsdCA9IGVuY29kZXJEYXRhLlZhbHVlOworICB9CisjZW5kaWYKKworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQzMl90IERNQVNhbXBsZTo6R2V0KEVuY29kZXIgKmlucHV0KSBjb25zdCB7CisgIGludDMyX3QgcmF3ID0gR2V0UmF3KGlucHV0KTsKKworICByZXR1cm4gcmF3IC8gaW5wdXQtPkdldEVuY29kaW5nU2NhbGUoKTsKK30KKwordWludDE2X3QgRE1BU2FtcGxlOjpHZXRWYWx1ZShBbmFsb2dJbnB1dCAqaW5wdXQpIGNvbnN0IHsKKyAgaWYgKG9mZnNldChrRW5hYmxlX0VuY29kZXJzKSA9PSAtMSkgeworICAgIHdwaV9zZXRTdGF0aWNFcnJvcldpdGhDb250ZXh0KGRtYV8sCisgICAgICAgIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RGb3VuZCwKKyAgICAgICAgZ2V0SEFMRXJyb3JNZXNzYWdlKE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RGb3VuZCkpOworICAgIHJldHVybiAweGZmZmY7CisgIH0KKworICB1aW50MzJfdCBkbWFXb3JkOworICB1aW50MzJfdCBjaGFubmVsID0gaW5wdXQtPkdldENoYW5uZWwoKTsKKyAgaWYgKGNoYW5uZWwgPD0gMykgeworICAgIGRtYVdvcmQgPSByZWFkX2J1ZmZlcl9bb2Zmc2V0KGtFbmFibGVfQUkwX0xvdykgKyBjaGFubmVsIC8gMl07CisgIH0gZWxzZSB7CisgICAgZG1hV29yZCA9IHJlYWRfYnVmZmVyX1tvZmZzZXQoa0VuYWJsZV9BSTBfSGlnaCkgKyAoY2hhbm5lbCAtIDQpIC8gMl07CisgIH0KKyAgaWYgKGNoYW5uZWwgJSAyKSB7CisgICAgcmV0dXJuIChkbWFXb3JkID4+IDE2KSAmIDB4ZmZmZjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKGRtYVdvcmQpICYgMHhmZmZmOworICB9CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQxNl90PihkbWFXb3JkKTsKK30KKworZmxvYXQgRE1BU2FtcGxlOjpHZXRWb2x0YWdlKEFuYWxvZ0lucHV0ICppbnB1dCkgY29uc3QgeworICB1aW50MTZfdCB2YWx1ZSA9IEdldFZhbHVlKGlucHV0KTsKKyAgaWYgKHZhbHVlID09IDB4ZmZmZikgcmV0dXJuIDAuMDsKKyAgdWludDMyX3QgbHNiX3dlaWdodCA9IGlucHV0LT5HZXRMU0JXZWlnaHQoKTsKKyAgaW50MzJfdCBvZmZzZXQgPSBpbnB1dC0+R2V0T2Zmc2V0KCk7CisgIGZsb2F0IHZvbHRhZ2UgPSBsc2Jfd2VpZ2h0ICogMS4wZS05ICogdmFsdWUgLSBvZmZzZXQgKiAxLjBlLTk7CisgIHJldHVybiB2b2x0YWdlOworfQpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9mb3J3cGlsaWIvZG1hLmggYi9hb3MvZXh0ZXJuYWxzL2ZvcndwaWxpYi9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTRiMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9mb3J3cGlsaWIvZG1hLmgKQEAgLTAsMCArMSwxMjEgQEAKKyNpZm5kZWYgX0RNQV9IXworI2RlZmluZSBfRE1BX0hfCisKKy8vIEludGVyZmFjZSB0byB0aGUgcm9ib1JJTyBGUEdBJ3MgRE1BIGZlYXR1cmVzLgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJDaGlwT2JqZWN0LmgiCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisKK2NsYXNzIERNQTsKK2NsYXNzIERpZ2l0YWxTb3VyY2U7CitjbGFzcyBBbmFsb2dJbnB1dDsKK2NsYXNzIEVuY29kZXI7CisKKy8vIEEgUE9EIGNsYXNzIHdoaWNoIHN0b3JlcyB0aGUgZGF0YSBmcm9tIGEgRE1BIHNhbXBsZSBhbmQgcHJvdmlkZXMgc2FmZSB3YXlzIHRvCisvLyBhY2Nlc3MgaXQuCitjbGFzcyBETUFTYW1wbGUgeworIHB1YmxpYzoKKyAgRE1BU2FtcGxlKCkgPSBkZWZhdWx0OworCisgIC8vIFJldHVybnMgdGhlIEZQR0EgdGltZXN0YW1wIG9mIHRoZSBzYW1wbGUuCisgIGRvdWJsZSBHZXRUaW1lc3RhbXAoKSBjb25zdDsKKworICAvLyBBbGwgR2V0IG1ldGhvZHMgZWl0aGVyIHJldHVybiB0aGUgcmVxdWVzdGVkIHZhbHVlLCBvciBzZXQgdGhlIEVycm9yLgorCisgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkaWdpdGFsIGlucHV0IGluIHRoZSBzYW1wbGUuCisgIGJvb2wgR2V0KERpZ2l0YWxTb3VyY2UgKmlucHV0KSBjb25zdDsKKyAgLy8gUmV0dXJucyB0aGUgcmF3IHZhbHVlIG9mIHRoZSBlbmNvZGVyIGluIHRoZSBzYW1wbGUuCisgIGludDMyX3QgR2V0UmF3KEVuY29kZXIgKmlucHV0KSBjb25zdDsKKyAgLy8gUmV0dXJucyB0aGUgezEsIDIsIG9yIDR9IFggc2NhbGVkIHZhbHVlIG9mIHRoZSBlbmNvZGVyIGluIHRoZSBzYW1wbGUuCisgIGludDMyX3QgR2V0KEVuY29kZXIgKmlucHV0KSBjb25zdDsKKyAgLy8gUmV0dXJucyB0aGUgcmF3IDEyLWJpdCB2YWx1ZSBmcm9tIHRoZSBBREMuCisgIHVpbnQxNl90IEdldFZhbHVlKEFuYWxvZ0lucHV0ICppbnB1dCkgY29uc3Q7CisgIC8vIFJldHVybnMgdGhlIHNjYWxlZCB2YWx1ZSBvZiBhbiBhbmFsb2cgaW5wdXQuCisgIGZsb2F0IEdldFZvbHRhZ2UoQW5hbG9nSW5wdXQgKmlucHV0KSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBETUE7CisKKyAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBzYW1wbGUgdHlwZSBpbiB0aGUgYnVmZmVyLCBvciAtMSBpZiBpdCBpc24ndCBpbgorICAvLyB0aGUgc2FtcGxlLgorICBzc2l6ZV90IG9mZnNldChpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIFRPRE8oYXVzdGluKTogVGhpcyBzaG91bGQgYmUgcmUtdXNlZCBmcm9tIFdQSUxpYi4uLiAgT25jZSBJIG1lcmdlIHRoaXMgYmFjaworICAvLyBpbnRvIFdQSUxpYi4KKworICBETUEgKmRtYV87CisgIHVpbnQzMl90IHJlYWRfYnVmZmVyX1s2NF07Cit9OworCisvLyBUT0RPKGF1c3Rpbik6IEVycm9yQmFzZS4uLgorY2xhc3MgRE1BIDogcHVibGljIEVycm9yQmFzZSB7CisgcHVibGljOgorICBETUEoKTsKKyAgdmlydHVhbCB+RE1BKCk7CisKKyAgLy8gU2V0cyB3aGV0aGVyIG9yIG5vdCBETUEgaXMgcGF1c2VkLgorICB2b2lkIFNldFBhdXNlKGJvb2wgcGF1c2UpOworCisgIC8vIFNldHMgdGhlIG51bWJlciBvZiB0cmlnZ2VycyB0aGF0IG5lZWQgdG8gb2NjdXIgYmVmb3JlIGEgc2FtcGxlIGlzIHNhdmVkLgorICB2b2lkIFNldFJhdGUodWludDMyX3QgY3ljbGVzKTsKKworICAvLyBBZGRzIHRoZSBpbnB1dCBzaWduYWwgdG8gdGhlIHN0YXRlIHRvIHNuYXBzaG90IG9uIHRoZSB0cmlnZ2VyIGV2ZW50LgorICAvLyBJdCBpcyBzYWZlIHRvIGFkZCB0aGUgc2FtZSBpbnB1dCBtdWx0aXBsZSB0aW1lcywgYnV0IHRoZXJlIGlzIGN1cnJlbnRseQorICAvLyBubyB3YXkgdG8gcmVtb3ZlIG9uZSBvbmNlIGl0IGhhcyBiZWVuIGFkZGVkLgorICAvLyBDYWxsIEFkZCgpIGFuZCBTZXRFeHRlcm5hbFRyaWdnZXIoKSBiZWZvcmUgU3RhcnQoKS4KKyAgdm9pZCBBZGQoRW5jb2RlciAqZW5jb2Rlcik7CisgIHZvaWQgQWRkKERpZ2l0YWxTb3VyY2UgKmlucHV0KTsKKyAgdm9pZCBBZGQoQW5hbG9nSW5wdXQgKmlucHV0KTsKKworICAvLyBDb25maWd1cmVzIERNQSB0byB0cmlnZ2VyIG9uIGFuIGV4dGVybmFsIHRyaWdnZXIuICBUaGVyZSBjYW4gb25seSBiZSA0CisgIC8vIGV4dGVybmFsIHRyaWdnZXJzLgorICAvLyBDYWxsIEFkZCgpIGFuZCBTZXRFeHRlcm5hbFRyaWdnZXIoKSBiZWZvcmUgU3RhcnQoKS4KKyAgdm9pZCBTZXRFeHRlcm5hbFRyaWdnZXIoRGlnaXRhbFNvdXJjZSAqaW5wdXQsIGJvb2wgcmlzaW5nLCBib29sIGZhbGxpbmcpOworCisgIC8vIFN0YXJ0cyByZWFkaW5nIHNhbXBsZXMgaW50byB0aGUgYnVmZmVyLiAgQ2xlYXJzIGFsbCBwcmV2aW91cyBzYW1wbGVzIGJlZm9yZQorICAvLyBzdGFydGluZy4KKyAgLy8gQ2FsbCBTdGFydCgpIGJlZm9yZSBSZWFkKCkuCisgIHZvaWQgU3RhcnQoc2l6ZV90IHF1ZXVlX2RlcHRoKTsKKworICBlbnVtIFJlYWRTdGF0dXMgeworICAgIFNUQVRVU19PSyA9IDAsCisgICAgU1RBVFVTX1RJTUVPVVQgPSAxLAorICAgIFNUQVRVU19FUlJPUiA9IDIsCisgIH07CisKKyAgLy8gUmVhZHMgYSBzYW1wbGUgZnJvbSB0aGUgRE1BIGJ1ZmZlciwgd2FpdGluZyB1cCB0byB0aW1lb3V0X21zIGZvciBpdC4KKyAgLy8gUmV0dXJucyBhIHN0YXR1cyBjb2RlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVhZCB3b3JrZWQsIHRpbWVkIG91dCwgb3IKKyAgLy8gZmFpbGVkLgorICAvLyBSZXR1cm5zIGluICpyZW1haW5pbmdfb3V0IHRoZSBudW1iZXIgb2YgRE1BIHNhbXBsZXMgc3RpbGwgcXVldWVkIGFmdGVyIHRoaXMKKyAgLy8gUmVhZCgpLgorICAvLyBDYWxsIEFkZCgpIGFuZCBTZXRFeHRlcm5hbFRyaWdnZXIoKSB0aGVuIFN0YXJ0KCkgYmVmb3JlIFJlYWQoKS4KKyAgLy8gVGhlIHNhbXBsZSBpcyBvbmx5IHVzYWJsZSB3aGlsZSB0aGlzIERNQSBvYmplY3QgaXMgbGVmdCBzdGFydGVkLgorICBSZWFkU3RhdHVzIFJlYWQoRE1BU2FtcGxlICpzYW1wbGUsIHVpbnQzMl90IHRpbWVvdXRfbXMsCisgICAgICAgICAgICAgICAgICBzaXplX3QgKnJlbWFpbmluZ19vdXQpOworCisgIC8vIFRyYW5zbGF0ZXMgYSBSZWFkU3RhdHVzIGNvZGUgdG8gYSBzdHJpbmcgbmFtZS4KKyAgc3RhdGljIGNvbnN0IGNoYXIgKk5hbWVPZlJlYWRTdGF0dXMoUmVhZFN0YXR1cyBzKTsKKworIHByaXZhdGU6CisgIDo6c3RkOjp1bmlxdWVfcHRyPG5GUEdBOjp0RE1BTWFuYWdlcj4gbWFuYWdlcl87ICAvLyBzZXQgYnkgU3RhcnQoKQorICB0eXBlZGVmIG5GUEdBOjpuUm9ib1JJT19GUEdBTmFtZXNwYWNlOjp0RE1BIHRETUE7CisgIGZyaWVuZCBETUFTYW1wbGU7CisKKyAgLy8gVGhlIG9mZnNldHMgaW50byB0aGUgc2FtcGxlIHN0cnVjdHVyZSBmb3IgZWFjaCBETUEgdHlwZSwgb3IgLTEgaWYgaXQgaXNuJ3QKKyAgLy8gaW4gdGhlIHNldCBvZiB2YWx1ZXMuCisgIHNzaXplX3QgY2hhbm5lbF9vZmZzZXRzX1sxOF07CisKKyAgLy8gVGhlIHNpemUgb2YgdGhlIGRhdGEgdG8gcmVhZCB0byBnZXQgYSBzYW1wbGUuCisgIHNpemVfdCBjYXB0dXJlX3NpemVfID0gMDsKKyAgdERNQTo6dENvbmZpZyB0Y29uZmlnXzsKKyAgdERNQSAqdGRtYV9jb25maWdfOworCisgIDo6c3RkOjphcnJheTxib29sLCA0PiB0cmlnZ2VyX2NoYW5uZWxzXyA9IHt7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9fTsKK307CisKKyNlbmRpZiAgLy8gX0RNQV9IXwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9ndGVzdC5wYXRjaCBiL2Fvcy9leHRlcm5hbHMvZ3Rlc3QucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlZTIwMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvZ3Rlc3QucGF0Y2gKQEAgLTAsMCArMSw1OSBAQAorZGlmZiAtLWdpdCBzcmMvZ3Rlc3QtcG9ydC5jYyBiL3NyYy9ndGVzdC1wb3J0LmNjCitpbmRleCBiODYwZDQ4Li5hY2I0NTliIDEwMDY0NAorLS0tIGEvc3JjL2d0ZXN0LXBvcnQuY2MKKysrKyBiL3NyYy9ndGVzdC1wb3J0LmNjCitAQCAtMzUsNiArMzUsOCBAQAorICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyAjaW5jbHVkZSA8c3RyaW5nLmg+CisrI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyAKKyAjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIEZvciBUZXJtaW5hdGVQcm9jZXNzKCkKK0BAIC05OCw2ICs5OCwyMSBAQCBzaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7CisgICB9CisgfQorIAorKyNlbGlmIEdURVNUX09TX0xJTlVYCisrCisrc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworKyAgc2l6ZV90IHRocmVhZF9jb3VudCA9IDA7CisrICBpZiAoRElSICpkaXIgPSBvcGVuZGlyKCIvcHJvYy9zZWxmL3Rhc2siKSkgeworKyAgICB3aGlsZSAoZGlyZW50ICplbnRyeSA9IHJlYWRkaXIoZGlyKSkgeworKyAgICAgIGlmIChzdHJjbXAoZW50cnktPmRfbmFtZSwgIi4iKSAhPSAwICYmIHN0cmNtcChlbnRyeS0+ZF9uYW1lLCAiLi4iKSAhPSAwKSB7CisrICAgICAgICArK3RocmVhZF9jb3VudDsKKysgICAgICB9CisrICAgIH0KKysgICAgY2xvc2VkaXIoZGlyKTsKKysgIH0KKysgIHJldHVybiB0aHJlYWRfY291bnQ7CisrfQorKworICNlbHNlCisgCisgc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworZGlmZiAtLWdpdCBhL3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIGIvc3JjL2d0ZXN0LWRlYXRoLXRlc3QuY2MKK2luZGV4IDhiMmU0MTMuLmZhYWQzYTQgMTAwNjQ0CistLS0gYS9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYworKysrIGIvc3JjL2d0ZXN0LWRlYXRoLXRlc3QuY2MKK0BAIC00NCw2ICs0NCw4IEBACisgIyBpbmNsdWRlIDxmY250bC5oPgorICMgaW5jbHVkZSA8bGltaXRzLmg+CisgIyBpbmNsdWRlIDxzdGRhcmcuaD4KKysjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisrIyBpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyAKKyAjIGlmIEdURVNUX09TX1dJTkRPV1MKKyAjICBpbmNsdWRlIDx3aW5kb3dzLmg+CitAQCAtODk4LDYgKzkwMCwxMSBAQCBpbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7IHJldHVybiBlbnZpcm9uOyB9CisgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSBjbG9uZSgpLWVkIHByb2Nlc3MgYW5kIHRodXMgbXVzdCBhdm9pZAorIC8vIGFueSBwb3RlbnRpYWxseSB1bnNhZmUgb3BlcmF0aW9ucyBsaWtlIG1hbGxvYyBvciBsaWJjIGZ1bmN0aW9ucy4KKyBzdGF0aWMgaW50IEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4odm9pZCogY2hpbGRfYXJnKSB7CisrICBybGltaXQgY29yZV9ybGltaXQ7CisrICBjb3JlX3JsaW1pdC5ybGltX2N1ciA9IDA7CisrICBjb3JlX3JsaW1pdC5ybGltX21heCA9IDA7CisrICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHNldHJsaW1pdChSTElNSVRfQ09SRSwgJmNvcmVfcmxpbWl0KSk7CisrCisgICBFeGVjRGVhdGhUZXN0QXJncyogY29uc3QgYXJncyA9IHN0YXRpY19jYXN0PEV4ZWNEZWF0aFRlc3RBcmdzKj4oY2hpbGRfYXJnKTsKKyAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UoYXJncy0+Y2xvc2VfZmQpKTsKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYyBiL2Fvcy9leHRlcm5hbHMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQwM2JiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9ndGVzdC9ndGVzdF9tYWluLmNjCkBAIC0wLDAgKzEsNjcgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbW1vbiB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEFjdHVhbGx5IGRlY2xhcmVkL2RlZmluZWQgaW4gYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuCit2b2lkIFNldExvZ0ZpbGVOYW1lKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Cit2b2lkIEZvcmNlUHJpbnRMb2dzRHVyaW5nVGVzdHMoKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgY29tbW9uCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKK0dURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworICAgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCisgICAgICB7InByaW50LWxvZ3MiLCBub19hcmd1bWVudCwgMCwgJ3AnfSwKKyAgICAgIHsibG9nLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ28nfSwKKyAgICAgIHswLCAwLCAwLCAwfSwKKyAgfTsKKworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgLy8gVGhlIGd0ZXN0IGxpYnJhcnkgbW9kaWZpZXMgYXJnYyBhbmQgYXJndiB0byByZW1vdmUgYWxsIG9mIGl0cyBvd24gY29tbWFuZAorICAvLyBsaW5lIHN3aXRjaGVzIGV0Yy4gU28gYWZ0ZXIgY2FsbGluZyBJbml0R29vZ2xlVGVzdCgpIHdlIGNhbiBwYXJzZSBvdXIgb3duCisgIC8vIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICB3aGlsZSAodHJ1ZSkgeworICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgInBobzoiLCBsb25nX29wdGlvbnMsIG51bGxwdHIpOworCisgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnaCc6CisgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICJcbkZSQzk3MSBvcHRpb25zOlxuIgorICAgICAgICAgICAgIiAgLXAsIC0tcHJpbnQtbG9nc1xuIgorICAgICAgICAgICAgIiAgICAgIFByaW50IHRoZSBsb2cgbWVzc2FnZXMgYXMgdGhleSBhcmUgYmVpbmcgZ2VuZXJhdGVkLlxuIgorICAgICAgICAgICAgIiAgLW8sIC0tbG9nLWZpbGU9RklMRVxuIgorICAgICAgICAgICAgIiAgICAgIFByaW50IGFsbCBsb2cgbWVzc2FnZXMgdG8gRklMRSBpbnN0ZWFkIG9mIHN0YW5kYXJkIG91dHB1dFxuIgorICAgICAgICAgICAgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ3AnOgorICAgICAgICBpZiAoOjphb3M6OmNvbW1vbjo6dGVzdGluZzo6Rm9yY2VQcmludExvZ3NEdXJpbmdUZXN0cykgeworICAgICAgICAgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6OkZvcmNlUHJpbnRMb2dzRHVyaW5nVGVzdHMoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnbyc6CisgICAgICAgIGlmICg6OmFvczo6Y29tbW9uOjp0ZXN0aW5nOjpTZXRMb2dGaWxlTmFtZSkgeworICAgICAgICAgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6OlNldExvZ0ZpbGVOYW1lKG9wdGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJz8nOgorICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorCisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL2d5cC5wYXRjaCBiL2Fvcy9leHRlcm5hbHMvZ3lwLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWI2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL2d5cC5wYXRjaApAQCAtMCwwICsxLDIxIEBACitkaWZmIC1ydXBOIGJlZm9yZS9weWxpYi9neXAvaW5wdXQucHkgYWZ0ZXIvcHlsaWIvZ3lwL2lucHV0LnB5CistLS0gYmVmb3JlL3B5bGliL2d5cC9pbnB1dC5weQkyMDEyLTExLTIwIDE2OjM4OjA5LjM5NDc4NDkxOCAtMDgwMAorKysrIGFmdGVyL3B5bGliL2d5cC9pbnB1dC5weQkyMDEyLTExLTIwIDE2OjM5OjEwLjUyNzEwNTk2NCAtMDgwMAorQEAgLTI0MTIsMTcgKzI0MTIsNiBAQCBkZWYgVmFsaWRhdGVTb3VyY2VzSW5UYXJnZXQodGFyZ2V0LCB0YXJnCisgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShuYW1lKSAgIyBEb24ndCBpbmNsdWRlIGV4dGVuc2lvbi4KKyAgICAgYmFzZW5hbWVzLnNldGRlZmF1bHQoYmFzZW5hbWUsIFtdKS5hcHBlbmQoc291cmNlKQorIAorLSAgZXJyb3IgPSAnJworLSAgZm9yIGJhc2VuYW1lLCBmaWxlcyBpbiBiYXNlbmFtZXMuaXRlcml0ZW1zKCk6CistICAgIGlmIGxlbihmaWxlcykgPiAxOgorLSAgICAgIGVycm9yICs9ICcgICVzOiAlc1xuJyAlIChiYXNlbmFtZSwgJyAnLmpvaW4oZmlsZXMpKQorLQorLSAgaWYgZXJyb3I6CistICAgIHByaW50KCdzdGF0aWMgbGlicmFyeSAlcyBoYXMgc2V2ZXJhbCBmaWxlcyB3aXRoIHRoZSBzYW1lIGJhc2VuYW1lOlxuJyAlCistICAgICAgICAgIHRhcmdldCArIGVycm9yICsgJ1NvbWUgYnVpbGQgc3lzdGVtcywgZS5nLiBNU1ZDMDgsICcKKy0gICAgICAgICAgJ2Nhbm5vdCBoYW5kbGUgdGhhdC4nKQorLSAgICByYWlzZSBHeXBFcnJvcignRHVwbGljYXRlIGJhc2VuYW1lcyBpbiBzb3VyY2VzIHNlY3Rpb24sIHNlZSBsaXN0IGFib3ZlJykKKy0KKyAKKyBkZWYgVmFsaWRhdGVSdWxlc0luVGFyZ2V0KHRhcmdldCwgdGFyZ2V0X2RpY3QsIGV4dHJhX3NvdXJjZXNfZm9yX3J1bGVzKToKKyAgICIiIkVuc3VyZXMgdGhhdCB0aGUgcnVsZXMgc2VjdGlvbnMgaW4gdGFyZ2V0X2RpY3QgYXJlIHZhbGlkIGFuZCBjb25zaXN0ZW50LApkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9zZWFzb2Nrcy5wYXRjaCBiL2Fvcy9leHRlcm5hbHMvc2Vhc29ja3MucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4YzY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvc2Vhc29ja3MucGF0Y2gKQEAgLTAsMCArMSw0MCBAQAorZGlmZiAtLWdpdCBhL3NyYy9tYWluL2MvSHliaVBhY2tldERlY29kZXIuY3BwIGIvc3JjL21haW4vYy9IeWJpUGFja2V0RGVjb2Rlci5jcHAKK2luZGV4IGYwZmRlZmUuLmMyOTcxYjIgMTAwNjQ0CistLS0gYS9zcmMvbWFpbi9jL0h5YmlQYWNrZXREZWNvZGVyLmNwcAorKysrIGIvc3JjL21haW4vYy9IeWJpUGFja2V0RGVjb2Rlci5jcHAKK0BAIC0yNyw2ICsyNyw3IEBACisgI2luY2x1ZGUgImludGVybmFsL0xvZ1N0cmVhbS5oIgorIAorICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKysjaW5jbHVkZSA8c3RyaW5nLmg+CisgCisgbmFtZXNwYWNlIHNlYXNvY2tzIHsKKyAKK0BAIC01NiwxOCArNTcsMjQgQEAgSHliaVBhY2tldERlY29kZXI6Ok1lc3NhZ2VTdGF0ZSBIeWJpUGFja2V0RGVjb2Rlcjo6ZGVjb2RlTmV4dE1lc3NhZ2Uoc3RkOjp2ZWN0b3IKKyAgICAgYXV0byBwdHIgPSBfbWVzc2FnZVN0YXJ0ICsgMjsKKyAgICAgaWYgKHBheWxvYWRMZW5ndGggPT0gMTI2KSB7CisgICAgICAgICBpZiAoX2J1ZmZlci5zaXplKCkgPCA0KSB7IHJldHVybiBOb01lc3NhZ2U7IH0KKy0gICAgICAgIHBheWxvYWRMZW5ndGggPSBodG9ucygqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCo+KCZfYnVmZmVyW3B0cl0pKTsKKysgICAgICAgIHVpbnQxNl90IHJhd19sZW5ndGg7CisrICAgICAgICBtZW1jcHkoJnJhd19sZW5ndGgsICZfYnVmZmVyW3B0cl0sIHNpemVvZihyYXdfbGVuZ3RoKSk7CisrICAgICAgICBwYXlsb2FkTGVuZ3RoID0gaHRvbnMocmF3X2xlbmd0aCk7CisgICAgICAgICBwdHIgKz0gMjsKKyAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09IDEyNykgeworICAgICAgICAgaWYgKF9idWZmZXIuc2l6ZSgpIDwgMTApIHsgcmV0dXJuIE5vTWVzc2FnZTsgfQorLSAgICAgICAgcGF5bG9hZExlbmd0aCA9IF9fYnN3YXBfNjQoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QqPigmX2J1ZmZlcltwdHJdKSk7CisrICAgICAgICB1aW50NjRfdCByYXdfbGVuZ3RoOworKyAgICAgICAgbWVtY3B5KCZyYXdfbGVuZ3RoLCAmX2J1ZmZlcltwdHJdLCBzaXplb2YocmF3X2xlbmd0aCkpOworKyAgICAgICAgcGF5bG9hZExlbmd0aCA9IF9fYnN3YXBfNjQocmF3X2xlbmd0aCk7CisgICAgICAgICBwdHIgKz0gODsKKyAgICAgfQorICAgICB1aW50MzJfdCBtYXNrID0gMDsKKyAgICAgaWYgKG1hc2tCaXQpIHsKKyAgICAgICAgIC8vIE1BU0sgaXMgc2V0LgorICAgICAgICAgaWYgKF9idWZmZXIuc2l6ZSgpIDwgcHRyICsgNCkgeyByZXR1cm4gTm9NZXNzYWdlOyB9CistICAgICAgICBtYXNrID0gaHRvbmwoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmX2J1ZmZlcltwdHJdKSk7CisrICAgICAgICB1aW50MzJfdCByYXdfbGVuZ3RoOworKyAgICAgICAgbWVtY3B5KCZyYXdfbGVuZ3RoLCAmX2J1ZmZlcltwdHJdLCBzaXplb2YocmF3X2xlbmd0aCkpOworKyAgICAgICAgbWFzayA9IGh0b25sKHJhd19sZW5ndGgpOworICAgICAgICAgcHRyICs9IDQ7CisgICAgIH0KKyAgICAgYXV0byBieXRlc0xlZnRJbkJ1ZmZlciA9IF9idWZmZXIuc2l6ZSgpIC0gcHRyOwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9zZWFzb2Nrcy9nZW5fZW1iZWRkZWQucHkgYi9hb3MvZXh0ZXJuYWxzL3NlYXNvY2tzL2dlbl9lbWJlZGRlZC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGZkNjAzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9zZWFzb2Nrcy9nZW5fZW1iZWRkZWQucHkKQEAgLTAsMCArMSw2MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworCisjIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGdlbl9lbWJlZGRlZCBzY3JpcHQgaW5jbHVkZWQgaW4gdGhlCisjIHNjcmlwdHMgZGlyZWN0b3J5IG9mIHNlYXNvY2tzICh2ZXJzaW9uIDEuMS4yKS4gSXQgaGFzIGJlZW4gbW9kaWZpZWQgdG8KKyMgcmVjdXJzaXZlbHkgZmluZCB0aGUgd2ViIGZpbGVzIGl0c2VsZiwgd2hpY2ggd2FzIG9yaWdpbmFsbHkgZG9uZSBieSBwaXBpbmcKKyMgaW4gdGhlIHJlc3VsdHMgZnJvbSBhICJmaW5kIiBzaGVsbCBjb21tYW5kLgorCisjIFRoZSBlbWJlZGRlZCBmaWxlcyBpbmNsdWRlcyBvbmx5IHRob3NlIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgc2VydmVyIHRvIHJ1bgorIyAoaW5jbHVkaW5nIDQwNCBmaWxlcywgYSBkZWZhdWx0IGluZGV4IHBhZ2UsIGZhdmljb24sIGV0Yy4pCisKK2ltcG9ydCBvcywgb3MucGF0aCwgc3lzCisKK291dHB1dCA9IHN5cy5hcmd2WzFdCithc3NlcnQgb3V0cHV0WzBdID09ICciJworYXNzZXJ0IG91dHB1dFstMV0gPT0gJyInCitvdXRwdXQgPSBvdXRwdXRbMTotMV0KKworaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguZGlybmFtZShvdXRwdXQpKToKKyAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKG91dHB1dCkpCitvID0gb3BlbihvdXRwdXQsICd3JykKKword2ViID0gW10KK2ZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKCIuL3d3d19kZWZhdWx0cyIsIHRvcGRvd249RmFsc2UpOgorICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICB3ZWIuYXBwZW5kKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKKyAgZm9yIG5hbWUgaW4gZGlyczoKKyAgICB3ZWIuYXBwZW5kKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKKworby53cml0ZSgiIiIKKyNpbmNsdWRlICJpbnRlcm5hbC9FbWJlZGRlZC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgRW1iZWRkZWRDb250ZW50PiBlbWJlZGRlZCA9IHsKKyIiIikKKworZm9yIGYgaW4gd2ViOgorICBieXRlcyA9IG9wZW4oZiwgJ3JiJykucmVhZCgpCisgIG8ud3JpdGUoJ3siLyVzIiwgeycgJSBvcy5wYXRoLmJhc2VuYW1lKGYpKQorICBvLndyaXRlKCciJyArICIiLmpvaW4oWydcXHglMDJ4JyAlIG9yZCh4KSBmb3IgeCBpbiBieXRlc10pICsgJyInKQorICBvLndyaXRlKCcsJWQgfX0sJyAlIGxlbihieXRlcykpCisKK28ud3JpdGUoIiIiCit9OworCit9IC8vIG5hbWVzcGFjZQorCitjb25zdCBFbWJlZGRlZENvbnRlbnQqIGZpbmRFbWJlZGRlZENvbnRlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgYXV0byBmb3VuZCA9IGVtYmVkZGVkLmZpbmQobmFtZSk7CisgIGlmIChmb3VuZCA9PSBlbWJlZGRlZC5lbmQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAmZm91bmQtPnNlY29uZDsKK30KKyIiIikKKworby5jbG9zZSgpCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL3NlYXNvY2tzL2ludGVybmFsL0NvbmZpZy5oIGIvYW9zL2V4dGVybmFscy9zZWFzb2Nrcy9pbnRlcm5hbC9Db25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTlkMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9zZWFzb2Nrcy9pbnRlcm5hbC9Db25maWcuaApAQCAtMCwwICsxLDIyMSBAQAorLy8gR2VuZXJhdGVkIGJ5IENvbXJhbiBmcm9tIHZlcnNpb24gMS4xLjIgd2l0aCB0aGUgYXV0b2NvbmYgc2NyaXB0cyBmcm9tIHVwc3RyZWFtCisvKiBzcmMvbWFpbi9jL2ludGVybmFsL0NvbmZpZy5oLiAgR2VuZXJhdGVkIGZyb20gQ29uZmlnLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qIHNyYy9tYWluL2MvaW50ZXJuYWwvQ29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9pbmV0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0FSUEFfSU5FVF9IIDEKKworLyogZGVmaW5lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBiYXNpYyBDKysxMSBzeW50YXggKi8KKy8qICN1bmRlZiBIQVZFX0NYWDExICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgc3RyZXJyb3JfcicsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjZGVmaW5lIEhBVkVfREVDTF9TVFJFUlJPUl9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkdXAyJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9EVVAyIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBldmVudGZkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9FVkVOVEZEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmb3JrJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9GT1JLIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0bmFtZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUSE9TVE5BTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG9wdCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUT1BUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnZXRvcHQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfR0VUT1BUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MSU1JVFNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgc3lzdGVtIGhhcyBhIEdOVSBsaWJjIGNvbXBhdGlibGUgYG1hbGxvYycgZnVuY3Rpb24sIGFuZAorICAgdG8gMCBvdGhlcndpc2UuICovCisvKiAjdW5kZWYgSEFWRV9NQUxMT0MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbXNldCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTUVNU0VUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBwdHJkaWZmX3QnLiAqLworI2RlZmluZSBIQVZFX1BUUkRJRkZfVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcm1kaXInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1JNRElSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NPQ0tFVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3FydCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1FSVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHN0ZGJvb2wuaCBjb25mb3JtcyB0byBDOTkuICovCisjZGVmaW5lIEhBVkVfU1REQk9PTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1REREVGX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURExJQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjYXNlY21wJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjaHInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUkNIUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJEVVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSRVJST1JfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3lzY2FsbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1lTQ0FMTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY3RsLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19JT0NUTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBkZWZpbmUgaWYgdW5vcmRlcmVkX21hcCBzdXBwb3J0cyBlbXBsYWNlICovCisjZGVmaW5lIEhBVkVfVU5PUkRFUkVEX01BUF9FTVBMQUNFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2Zm9yaycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVkZPUksgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHZmb3JrLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfVkZPUktfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiBgZm9yaycgd29ya3MuICovCisjZGVmaW5lIEhBVkVfV09SS0lOR19GT1JLIDEKKworLyogRGVmaW5lIHRvIDEgaWYgYHZmb3JrJyB3b3Jrcy4gKi8KKyNkZWZpbmUgSEFWRV9XT1JLSU5HX1ZGT1JLIDEKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYF9Cb29sJy4gKi8KKy8qICN1bmRlZiBIQVZFX19CT09MICovCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAibWF0dEBnb2Rib2x0Lm9yZyIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgIlNlYVNvY2tzIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJTZWFTb2NrcyAwLjEiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJzZWFzb2NrcyIKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9VUkwgImh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0Z29kYm9sdC9zZWFzb2NrcyIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjEiCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLiAqLworI2RlZmluZSBTVFJFUlJPUl9SX0NIQVJfUCAxCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDMyX3QgdHlwZWRlZiBmcm9tIDxzeXMvc3luY2guaD4sCisgICA8cHRocmVhZC5oPiwgb3IgPHNlbWFwaG9yZS5oPiBpcyBub3QgdXNlZC4gSWYgdGhlIHR5cGVkZWYgd2VyZSBhbGxvd2VkLCB0aGUKKyAgICNkZWZpbmUgYmVsb3cgd291bGQgY2F1c2UgYSBzeW50YXggZXJyb3IuICovCisvKiAjdW5kZWYgX1VJTlQzMl9UICovCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDY0X3QgdHlwZWRlZiBmcm9tIDxzeXMvc3luY2guaD4sCisgICA8cHRocmVhZC5oPiwgb3IgPHNlbWFwaG9yZS5oPiBpcyBub3QgdXNlZC4gSWYgdGhlIHR5cGVkZWYgd2VyZSBhbGxvd2VkLCB0aGUKKyAgICNkZWZpbmUgYmVsb3cgd291bGQgY2F1c2UgYSBzeW50YXggZXJyb3IuICovCisvKiAjdW5kZWYgX1VJTlQ2NF9UICovCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDhfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKy8qICN1bmRlZiBfVUlOVDhfVCAqLworCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworLyogI3VuZGVmIGlubGluZSAqLworI2VuZGlmCisKKy8qIERlZmluZSB0byBycGxfbWFsbG9jIGlmIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4gKi8KKy8qICN1bmRlZiBtYWxsb2MgKi8KKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworLyogI3VuZGVmIHBpZF90ICovCisKKy8qIERlZmluZSB0byB0aGUgZXF1aXZhbGVudCBvZiB0aGUgQzk5ICdyZXN0cmljdCcga2V5d29yZCwgb3IgdG8KKyAgIG5vdGhpbmcgaWYgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAgRG8gbm90IGRlZmluZSBpZiByZXN0cmljdCBpcworICAgc3VwcG9ydGVkIGRpcmVjdGx5LiAgKi8KKyNkZWZpbmUgcmVzdHJpY3QgX19yZXN0cmljdAorLyogV29yayBhcm91bmQgYSBidWcgaW4gU3VuIEMrKzogaXQgZG9lcyBub3Qgc3VwcG9ydCBfUmVzdHJpY3Qgb3IKKyAgIF9fcmVzdHJpY3RfXywgZXZlbiB0aG91Z2ggdGhlIGNvcnJlc3BvbmRpbmcgU3VuIEMgY29tcGlsZXIgZW5kcyB1cCB3aXRoCisgICAiI2RlZmluZSByZXN0cmljdCBfUmVzdHJpY3QiIG9yICIjZGVmaW5lIHJlc3RyaWN0IF9fcmVzdHJpY3RfXyIgaW4gdGhlCisgICBwcmV2aW91cyBsaW5lLiAgUGVyaGFwcyBzb21lIGZ1dHVyZSB2ZXJzaW9uIG9mIFN1biBDKysgd2lsbCB3b3JrIHdpdGgKKyAgIHJlc3RyaWN0OyBpZiBzbywgaG9wZWZ1bGx5IGl0IGRlZmluZXMgX19SRVNUUklDVCBsaWtlIFN1biBDIGRvZXMuICAqLworI2lmIGRlZmluZWQgX19TVU5QUk9fQ0MgJiYgIWRlZmluZWQgX19SRVNUUklDVAorIyBkZWZpbmUgX1Jlc3RyaWN0CisjIGRlZmluZSBfX3Jlc3RyaWN0X18KKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisvKiAjdW5kZWYgc2l6ZV90ICovCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAxNiBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworLyogI3VuZGVmIHVpbnQxNl90ICovCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAzMiBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworLyogI3VuZGVmIHVpbnQzMl90ICovCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA2NCBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworLyogI3VuZGVmIHVpbnQ2NF90ICovCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA4IGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisvKiAjdW5kZWYgdWludDhfdCAqLworCisvKiBEZWZpbmUgYXMgYGZvcmsnIGlmIGB2Zm9yaycgZG9lcyBub3Qgd29yay4gKi8KKy8qICN1bmRlZiB2Zm9yayAqLwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvUkVBRE1FLnR4dCBiL2Fvcy9saW51eF9jb2RlL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmZWIyMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMCBAQAorc2VlIC4uL1JFQURNRS50eHQgZm9yIHN0dWZmIGFmZmVjdGluZyBhbGwgY29kZQorCitUaGUgZm9sZGVyIGlzIGNhbGxlZCBsaW51eF9jb2RlIGJlY2F1c2UgaXQgbWFpbmx5IGRlYWxzIHdpdGggY29kZSB0aGF0IHVzZXMgdGhlIHF1ZXVlIHN5c3RlbSwgd2hpY2ggb25seSB3b3JrcyB1bmRlciBHTlUvTGludXggZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zLCBzb21lIGZ1bmRhbWVudGFsIChmdXRleGVzKSBhbmQgc29tZSBiZWNhdXNlIG5vYm9keSBib3RoZXJzIHRvIGZpeCB0aGVtLgorVGhlIGxheW91dCBpcyBkZXNpZ25lZCB3aXRoIG11bHRpcGxlIGxpbnV4IGJveGVzIGluIG1pbmQuCisKK1RoZSBjb2RlIGZvciB0aGUgbGludXggYm94IHRoYXQgc2VuZHMgbW90b3Igb3V0cHV0cyBldGMgaXMgaW4gLi4vcHJpbWUvLgorCitbTk9URVNdCitBbnkgY29kZSBzaG91bGQgY2FsbCBhb3M6OkluaXQoKSAob3IgYW9zOjpJbml0TlJUKCkgZm9yIHByb2Nlc3NlcyB0aGF0IGRvbid0IG5lZWQgdG8gYmUgcmVhbHRpbWUpIGJlZm9yZSBtYWtpbmcgYW55IGNhbGxzIHRvIGFueSBvZiB0aGUgYW9zIGZ1bmN0aW9ucy4KK01ha2luZyBjYWxscyB0byBhbnkgb2YgdGhlIGFvcyBmdW5jdGlvbnMgKGluY2x1ZGluZyBhb3M6OkluaXQoKSkgZnJvbSBtb3JlIHRoYW4gMSB0aHJlYWQgcGVyIHByb2Nlc3MgaXMgbm90IHN1cHBvcnRlZCwgYnV0IHVzaW5nIGZvcmsoMikgYWZ0ZXIgc29tZSBhb3MgZnVuY3Rpb25zIGhhdmUgYmVlbiBjYWxsZWQgYW5kIHRoZW4gY29udGludWluZyB0byBtYWtlIGFvcyBmdW5jdGlvbiBjYWxscyAod2l0aG91dCBjYWxsaW5nIG9uZSBvZiB0aGUgZXhlYygzKSBmdW5jdGlvbnMpIGluIGJvdGggcHJvY2Vzc2VzIGlzIHN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2NvbXBsZXhfdGhyZWFkX2xvY2FsLmNjIGIvYW9zL2xpbnV4X2NvZGUvY29tcGxleF90aHJlYWRfbG9jYWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3MzIzZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2NvbXBsZXhfdGhyZWFkX2xvY2FsLmNjCkBAIC0wLDAgKzEsNjkgQEAKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9jb21wbGV4X3RocmVhZF9sb2NhbC5oIgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9vbmNlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9kaWUuaCIKKworI2RlZmluZSBTSU1QTEVfQ0hFQ0soY2FsbCkgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHZhbHVlID0gY2FsbDsgICAgICAgICAgICAgXAorICAgIGlmICh2YWx1ZSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBSRGllKHZhbHVlLCAiJXMgZmFpbGVkIiwgI2NhbGwpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgeworCit2b2lkIEV4ZWN1dGVEZXN0cnVjdG9yTGlzdCh2b2lkICp2KSB7CisgIGZvciAoY29uc3QgQ29tcGxleFRocmVhZExvY2FsRGVzdHJ1Y3RvciAqYyA9CisgICAgICAgICAgIHN0YXRpY19jYXN0PENvbXBsZXhUaHJlYWRMb2NhbERlc3RydWN0b3IgKj4odik7CisgICAgICAgYyAhPSBudWxscHRyOyBjID0gYy0+bmV4dCkgeworICAgIGMtPmZ1bmN0aW9uKGMtPnBhcmFtKTsKKyAgfQorfQorCitwdGhyZWFkX2tleV90ICpDcmVhdGVLZXkoKSB7CisgIHN0YXRpYyBwdGhyZWFkX2tleV90IHI7CisgIFNJTVBMRV9DSEVDSyhwdGhyZWFkX2tleV9jcmVhdGUoJnIsIEV4ZWN1dGVEZXN0cnVjdG9yTGlzdCkpOworICByZXR1cm4gJnI7Cit9CisKKzo6YW9zOjpPbmNlPHB0aHJlYWRfa2V5X3Q+IGtleV9vbmNlKENyZWF0ZUtleSk7CisKK30gLy8gbmFtZXNwYWNlCisKK3ZvaWQgQ29tcGxleFRocmVhZExvY2FsRGVzdHJ1Y3Rvcjo6QWRkKCkgeworICBzdGF0aWNfYXNzZXJ0KAorICAgICAgOjpzdGQ6OmlzX3BvZDxDb21wbGV4VGhyZWFkTG9jYWxEZXN0cnVjdG9yPjo6dmFsdWUsCisgICAgICAiQ29tcGxleFRocmVhZExvY2FsRGVzdHJ1Y3RvciBtaWdodCBub3QgYmUgc2FmZSB0byBwYXNzIHRocm91Z2ggdm9pZCoiKTsKKyAgcHRocmVhZF9rZXlfdCAqY29uc3Qga2V5ID0ga2V5X29uY2UuR2V0KCk7CisKKyAgbmV4dCA9IHN0YXRpY19jYXN0PENvbXBsZXhUaHJlYWRMb2NhbERlc3RydWN0b3IgKj4ocHRocmVhZF9nZXRzcGVjaWZpYygqa2V5KSk7CisgIFNJTVBMRV9DSEVDSyhwdGhyZWFkX3NldHNwZWNpZmljKCprZXksIHRoaXMpKTsKK30KKwordm9pZCBDb21wbGV4VGhyZWFkTG9jYWxEZXN0cnVjdG9yOjpSZW1vdmUoKSB7CisgIHB0aHJlYWRfa2V5X3QgKmNvbnN0IGtleSA9IGtleV9vbmNlLkdldCgpOworCisgIENvbXBsZXhUaHJlYWRMb2NhbERlc3RydWN0b3IgKnByZXZpb3VzID0gbnVsbHB0cjsKKyAgZm9yIChDb21wbGV4VGhyZWFkTG9jYWxEZXN0cnVjdG9yICpjID0KKyAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29tcGxleFRocmVhZExvY2FsRGVzdHJ1Y3RvciAqPigKKyAgICAgICAgICAgICAgIHB0aHJlYWRfZ2V0c3BlY2lmaWMoKmtleSkpOworICAgICAgIGMgIT0gbnVsbHB0cjsgYyA9IGMtPm5leHQpIHsKKyAgICBpZiAoYyA9PSB0aGlzKSB7CisgICAgICAvLyBJZiBpdCdzIHRoZSBmaXJzdCBvbmUuCisgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbHB0cikgeworICAgICAgICBTSU1QTEVfQ0hFQ0socHRocmVhZF9zZXRzcGVjaWZpYygqa2V5LCBuZXh0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmV2aW91cy0+bmV4dCA9IG5leHQ7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIHByZXZpb3VzID0gYzsKKyAgfQorICA6OmFvczo6RGllKCIlcCBpcyBub3QgaW4gdGhlIGRlc3RydWN0b3IgbGlzdFxuIiwgdGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2NvbXBsZXhfdGhyZWFkX2xvY2FsLmggYi9hb3MvbGludXhfY29kZS9jb21wbGV4X3RocmVhZF9sb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGE4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9jb21wbGV4X3RocmVhZF9sb2NhbC5oCkBAIC0wLDAgKzEsMTMxIEBACisjaWZuZGVmIEFPU19MSU5VWF9DT0RFX0NPTVBMRVhfVEhSRUFEX0xPQ0FMX0hfCisjZGVmaW5lIEFPU19MSU5VWF9DT0RFX0NPTVBMRVhfVEhSRUFEX0xPQ0FMX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhb3MgeworCisvLyBJbnN0YW5jZXMgZm9ybSBhIChwZXItdGhyZWFkKSBsaXN0IG9mIGRlc3RydWN0b3IgZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiB0aGUKKy8vIHRocmVhZCBleGl0cy4KKy8vIE9ubHkgQ29tcGxleFRocmVhZExvY2FsIHNob3VsZCB1c2UgdGhpcy4KK3N0cnVjdCBDb21wbGV4VGhyZWFkTG9jYWxEZXN0cnVjdG9yIHsKKyAgLy8gQWRkcyB0aGlzIHRvIHRoZSBsaXN0IG9mIGRlc3RydWN0b3JzIGluIHRoaXMgdGhyZWFkLgorICB2b2lkIEFkZCgpOworICAvLyBSZW1vdmVzIHRoaXMgZnJvbSB0aGUgbGlzdCBvZiBkZXN0cnVjdG9ycyBpbiB0aGlzIHRocmVhZC4gOjphb3M6OkRpZXMgaWYgaXQKKyAgLy8gaXMgbm90IHRoZXJlLgorICB2b2lkIFJlbW92ZSgpOworCisgIHZvaWQgKCpmdW5jdGlvbikodm9pZCAqKTsKKyAgdm9pZCAqcGFyYW07CisKKyAgQ29tcGxleFRocmVhZExvY2FsRGVzdHJ1Y3RvciAqbmV4dDsKK307CisKKy8vIEhhbmRsZXMgY3JlYXRpbmcgYSB0aHJlYWQtbG9jYWwgKHBlciB0eXBlKSBvYmplY3Qgd2l0aCBub24tdHJpdmlhbAorLy8gY29uc3RydWN0b3IgYW5kL29yIGRlc3RydWN0b3IuIEl0IHdpbGwgYmUgY29ycmVjdGx5IGRlc3Ryb3llZCBvbiB0aHJlYWQgZXhpdC4KKy8vCisvLyBFYWNoIHRocmVhZCB1c2luZyBhbiBpbnN0YW50aWF0aW9uIG9mIHRoaXMgY2xhc3MgaGFzIGl0cyBvd24gaW5kZXBlbmRlbnQgc2xvdAorLy8gZm9yIHN0b3JpbmcgYSBULiBBbiBpbnN0YW5jZSBvZiBUIGlzIG5vdCBhY3R1YWxseSBjb25zdHJ1Y3RlZCB1bnRpbCBhIHRocmVhZAorLy8gY2FsbHMgQ3JlYXRlLCBhZnRlciB3aGljaCBhIHBvaW50ZXIgdG8gaXQgd2lsbCBiZSByZXR1cm5lZCBmcm9tIGdldCgpIGV0YworLy8gdW50aWwgYWZ0ZXIgQ2xlYXIgaXMgY2FsbGVkLgorLy8KKy8vIEV4YW1wbGUgdXNhZ2U6CisvLyBjbGFzcyBTb21ldGhpbmcgeworLy8gIHByaXZhdGU6CisvLyAgIGNsYXNzIERhdGEgeworLy8gICAgcHVibGljOgorLy8gICAgIERhdGEoY29uc3QgOjpzdGQ6OnN0cmluZyAmdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQorLy8KKy8vICAgICBpbnQgRG9Tb21ldGhpbmcoKSB7CisvLyAgICAgICBpZiAoY2FjaGVkX3Jlc3VsdF8gPT0gMCkgeworLy8gICAgICAgICAvLyBEbyBzb21ldGhpbmcgZXhwZW5zaXZlIHdpdGggdmFsdWVfIGFuZCBzdG9yZSBpdCBpbgorLy8gICAgICAgICAvLyBjYWNoZWRfcmVzdWx0Xy4KKy8vICAgICAgIH0KKy8vICAgICAgIHJldHVybiBjYWNoZWRfcmVzdWx0XzsKKy8vICAgICB9CisvLworLy8gICAgcHJpdmF0ZToKKy8vICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nIHZhbHVlXzsKKy8vICAgICBpbnQgY2FjaGVkX3Jlc3VsdF8gPSAwOworLy8gICB9OworLy8gICBDb21wbGV4VGhyZWFkTG9jYWw8RGF0YT4gdGhyZWFkX2xvY2FsXzsKKy8vICAgOjpzdGQ6OnN0cmluZyBhX3N0cmluZ187CisvLworLy8gICBpbnQgRG9Tb21ldGhpbmcoKSB7CisvLyAgICAgdGhyZWFkX2xvY2FsXy5DcmVhdGUoYV9zdHJpbmdfKTsKKy8vICAgICByZXR1cm4gdGhyZWFkX2xvY2FsXy0+RG9Tb21ldGhpbmcoKTsKKy8vICAgfQorLy8gfTsKKy8vCisvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbgorLy8gPGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTIwNDk2ODQvZ2NjLTQtNy1vbi1saW51eC1wdGhyZWFkcy1ub250cml2aWFsLXRocmVhZC1sb2NhbC13b3JrYXJvdW5kLXVzaW5nLXRocmVhZC1uPi4KKy8vIFRPRE8oYnJpYW5zKTogQ2hhbmdlIHRoaXMgdG8ganVzdCBzaW1wbGUgc3RhbmRhcmQgQysrIHRocmVhZF9sb2NhbCBvbmNlIGFsbAorLy8gb2Ygb3VyIGNvbXBpbGVycyBoYXZlIHN1cHBvcnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIENvbXBsZXhUaHJlYWRMb2NhbCB7CisgcHVibGljOgorICAvLyBBY3R1YWxseSBjcmVhdGVzIHRoZSBvYmplY3QgaW4gdGhpcyB0aHJlYWQgaWYgdGhlcmUgaXMgbm90IG9uZSB0aGVyZQorICAvLyBhbHJlYWR5LgorICAvLyBhcmdzIGFyZSBhbGwgcGVyZmVjdGx5IGZvcndhcmRlZCB0byB0aGUgY29uc3RydWN0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgorICB2b2lkIENyZWF0ZShBcmdzICYmLi4uIGFyZ3MpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVybjsKKyAgICBuZXcgKCZzdG9yYWdlKSBUKDo6c3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICBkZXN0cnVjdG9yLmZ1bmN0aW9uID0gUGxhY2VtZW50RGVsZXRlOworICAgIGRlc3RydWN0b3IucGFyYW0gPSAmc3RvcmFnZTsKKyAgICBkZXN0cnVjdG9yLkFkZCgpOworICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorCisgIC8vIFJlbW92ZXMgdGhlIG9iamVjdCBpbiB0aGlzIHRocmVhZCAoaWYgYW55KSwgaW5jbHVkaW5nIGNhbGxpbmcgaXRzCisgIC8vIGRlc3RydWN0b3IuCisgIHZvaWQgQ2xlYXIoKSB7CisgICAgaWYgKCFpbml0aWFsaXplZCkgcmV0dXJuOworICAgIGRlc3RydWN0b3IuUmVtb3ZlKCk7CisgICAgUGxhY2VtZW50RGVsZXRlKCZzdG9yYWdlKTsKKyAgICBpbml0aWFsaXplZCA9IGZhbHNlOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb2JqZWN0IGluIHRoaXMgdGhyZWFkLgorICBib29sIGNyZWF0ZWQoKSBjb25zdCB7IHJldHVybiBpbml0aWFsaXplZDsgfQorCisgIC8vIFJldHVybnMgdGhlIG9iamVjdCBjdXJyZW50bHkgY3JlYXRlZCBpbiB0aGlzIHRocmVhZCBvciBudWxscHRyLgorICBUICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBnZXQoKTsKKyAgfQorICBUICpnZXQoKSBjb25zdCB7CisgICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPihzdGF0aWNfY2FzdDx2b2lkICo+KCZzdG9yYWdlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6YWxpZ25lZF9zdG9yYWdlPAorICAgICAgc2l6ZW9mKFQpLCA6OnN0ZDo6YWxpZ25tZW50X29mPFQ+Ojp2YWx1ZT46OnR5cGUgU3RvcmFnZTsKKworICAvLyBDb252ZW5pZW50IGhlbHBlciBmb3IgY2FsbGluZyBhIGRlc3RydWN0b3IuCisgIHN0YXRpYyB2b2lkIFBsYWNlbWVudERlbGV0ZSh2b2lkICp0KSB7IHN0YXRpY19jYXN0PFQgKj4odCktPn5UKCk7IH0KKworICAvLyBUcnVlIGlmZiB0aGlzIHN0b3JhZ2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgIHN0YXRpYyBfX3RocmVhZCBib29sIGluaXRpYWxpemVkOworICAvLyBXaGVyZSB3ZSBhY3R1YWxseSBzdG9yZSB0aGUgb2JqZWN0IGZvciB0aGlzIHRocmVhZCAoaWYgYW55KS4KKyAgc3RhdGljIF9fdGhyZWFkIFN0b3JhZ2Ugc3RvcmFnZTsKKyAgLy8gVGhlIGxpbmtlZCBsaXN0IGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoaXMgc3RvcmFnZS4KKyAgc3RhdGljIF9fdGhyZWFkIENvbXBsZXhUaHJlYWRMb2NhbERlc3RydWN0b3IgZGVzdHJ1Y3RvcjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorX190aHJlYWQgYm9vbCBDb21wbGV4VGhyZWFkTG9jYWw8VD46OmluaXRpYWxpemVkOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitfX3RocmVhZCB0eXBlbmFtZSBDb21wbGV4VGhyZWFkTG9jYWw8VD46OlN0b3JhZ2UgQ29tcGxleFRocmVhZExvY2FsPFQ+OjpzdG9yYWdlOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitfX3RocmVhZCBDb21wbGV4VGhyZWFkTG9jYWxEZXN0cnVjdG9yIENvbXBsZXhUaHJlYWRMb2NhbDxUPjo6ZGVzdHJ1Y3RvcjsKKworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19MSU5VWF9DT0RFX0NPTVBMRVhfVEhSRUFEX0xPQ0FMX0hfCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9jb21wbGV4X3RocmVhZF9sb2NhbF90ZXN0LmNjIGIvYW9zL2xpbnV4X2NvZGUvY29tcGxleF90aHJlYWRfbG9jYWxfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YwNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvY29tcGxleF90aHJlYWRfbG9jYWxfdGVzdC5jYwpAQCAtMCwwICsxLDEwMSBAQAorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2NvbXBsZXhfdGhyZWFkX2xvY2FsLmgiCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3RocmVhZC5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgQ29tcGxleFRocmVhZExvY2FsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RydWN0IFRyYWNlYWJsZU9iamVjdCB7CisgICAgVHJhY2VhYmxlT2JqZWN0KGludCBkYXRhID0gMCkgOiBkYXRhKGRhdGEpIHsgKytjb25zdHJ1Y3Rpb25zOyB9CisgICAgflRyYWNlYWJsZU9iamVjdCgpIHsgKytkZXN0cnVjdGlvbnM7IH0KKworICAgIHN0YXRpYyA6OnN0ZDo6YXRvbWljPGludD4gY29uc3RydWN0aW9ucywgZGVzdHJ1Y3Rpb25zOworCisgICAgaW50IGRhdGE7CisgIH07CisgIENvbXBsZXhUaHJlYWRMb2NhbDxUcmFjZWFibGVPYmplY3Q+IGxvY2FsOworCisgcHJpdmF0ZToKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBsb2NhbC5DbGVhcigpOworICAgIEVYUEVDVF9FUShUcmFjZWFibGVPYmplY3Q6OmNvbnN0cnVjdGlvbnMsIFRyYWNlYWJsZU9iamVjdDo6ZGVzdHJ1Y3Rpb25zKQorICAgICAgICA8PCAiVGhlcmUgc2hvdWxkIGJlIG5vIHdheSB0byBjcmVhdGUgYW5kIGRlc3Ryb3kgZGlmZmVyZW50IG51bWJlcnMuIjsKKyAgICBUcmFjZWFibGVPYmplY3Q6OmNvbnN0cnVjdGlvbnMgPSBUcmFjZWFibGVPYmplY3Q6OmRlc3RydWN0aW9ucyA9IDA7CisgIH0KK307Cis6OnN0ZDo6YXRvbWljPGludD4gQ29tcGxleFRocmVhZExvY2FsVGVzdDo6VHJhY2VhYmxlT2JqZWN0Ojpjb25zdHJ1Y3Rpb25zOworOjpzdGQ6OmF0b21pYzxpbnQ+IENvbXBsZXhUaHJlYWRMb2NhbFRlc3Q6OlRyYWNlYWJsZU9iamVjdDo6ZGVzdHJ1Y3Rpb25zOworCitURVNUX0YoQ29tcGxleFRocmVhZExvY2FsVGVzdCwgQmFzaWMpIHsKKyAgRVhQRUNUX0VRKDAsIFRyYWNlYWJsZU9iamVjdDo6Y29uc3RydWN0aW9ucyk7CisgIEVYUEVDVF9FUSgwLCBUcmFjZWFibGVPYmplY3Q6OmRlc3RydWN0aW9ucyk7CisgIEVYUEVDVF9GQUxTRShsb2NhbC5jcmVhdGVkKCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgbG9jYWwuZ2V0KCkpOworCisgIGxvY2FsLkNyZWF0ZSg5NzEpOworICBFWFBFQ1RfRVEoMSwgVHJhY2VhYmxlT2JqZWN0Ojpjb25zdHJ1Y3Rpb25zKTsKKyAgRVhQRUNUX0VRKDAsIFRyYWNlYWJsZU9iamVjdDo6ZGVzdHJ1Y3Rpb25zKTsKKyAgRVhQRUNUX1RSVUUobG9jYWwuY3JlYXRlZCgpKTsKKyAgRVhQRUNUX0VRKDk3MSwgbG9jYWwtPmRhdGEpOworCisgIGxvY2FsLkNyZWF0ZSgyNTQpOworICBFWFBFQ1RfRVEoMSwgVHJhY2VhYmxlT2JqZWN0Ojpjb25zdHJ1Y3Rpb25zKTsKKyAgRVhQRUNUX0VRKDAsIFRyYWNlYWJsZU9iamVjdDo6ZGVzdHJ1Y3Rpb25zKTsKKyAgRVhQRUNUX1RSVUUobG9jYWwuY3JlYXRlZCgpKTsKKyAgRVhQRUNUX0VRKDk3MSwgbG9jYWwtPmRhdGEpOworCisgIGxvY2FsLkNsZWFyKCk7CisgIEVYUEVDVF9FUSgxLCBUcmFjZWFibGVPYmplY3Q6OmNvbnN0cnVjdGlvbnMpOworICBFWFBFQ1RfRVEoMSwgVHJhY2VhYmxlT2JqZWN0OjpkZXN0cnVjdGlvbnMpOworICBFWFBFQ1RfRkFMU0UobG9jYWwuY3JlYXRlZCgpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGxvY2FsLmdldCgpKTsKKworICBsb2NhbC5DcmVhdGUoOTczKTsKKyAgRVhQRUNUX0VRKDIsIFRyYWNlYWJsZU9iamVjdDo6Y29uc3RydWN0aW9ucyk7CisgIEVYUEVDVF9FUSgxLCBUcmFjZWFibGVPYmplY3Q6OmRlc3RydWN0aW9ucyk7CisgIEVYUEVDVF9UUlVFKGxvY2FsLmNyZWF0ZWQoKSk7CisgIEVYUEVDVF9FUSg5NzMsIGxvY2FsLT5kYXRhKTsKK30KKworVEVTVF9GKENvbXBsZXhUaHJlYWRMb2NhbFRlc3QsIEFub3RoZXJUaHJlYWQpIHsKKyAgRVhQRUNUX0ZBTFNFKGxvY2FsLmNyZWF0ZWQoKSk7CisgIHV0aWw6OkZ1bmN0aW9uVGhyZWFkOjpSdW5Jbk90aGVyVGhyZWFkKFt0aGlzXSgpIHsKKyAgICBFWFBFQ1RfRkFMU0UobG9jYWwuY3JlYXRlZCgpKTsKKyAgICBsb2NhbC5DcmVhdGUoOTcxKTsKKyAgICBFWFBFQ1RfVFJVRShsb2NhbC5jcmVhdGVkKCkpOworICAgIEVYUEVDVF9FUSg5NzEsIGxvY2FsLT5kYXRhKTsKKyAgICBFWFBFQ1RfRVEoMSwgVHJhY2VhYmxlT2JqZWN0Ojpjb25zdHJ1Y3Rpb25zKTsKKyAgICBFWFBFQ1RfRVEoMCwgVHJhY2VhYmxlT2JqZWN0OjpkZXN0cnVjdGlvbnMpOworICB9KTsKKyAgRVhQRUNUX0VRKDEsIFRyYWNlYWJsZU9iamVjdDo6Y29uc3RydWN0aW9ucyk7CisgIEVYUEVDVF9FUSgxLCBUcmFjZWFibGVPYmplY3Q6OmRlc3RydWN0aW9ucyk7CisgIEVYUEVDVF9GQUxTRShsb2NhbC5jcmVhdGVkKCkpOworfQorCitURVNUX0YoQ29tcGxleFRocmVhZExvY2FsVGVzdCwgVHdvVGhyZWFkcykgeworICB1dGlsOjpGdW5jdGlvblRocmVhZCB0aHJlYWQoW3RoaXNdKHV0aWw6OkZ1bmN0aW9uVGhyZWFkICopIHsKKyAgICBsb2NhbC5DcmVhdGUoOTcxKTsKKyAgICBFWFBFQ1RfRVEoOTcxLCBsb2NhbC0+ZGF0YSk7CisgICAgRVhQRUNUX0VRKDAsIFRyYWNlYWJsZU9iamVjdDo6ZGVzdHJ1Y3Rpb25zKTsKKyAgfSk7CisgIHRocmVhZC5TdGFydCgpOworICBsb2NhbC5DcmVhdGUoOTczKTsKKyAgRVhQRUNUX0VRKDk3MywgbG9jYWwtPmRhdGEpOworICB0aHJlYWQuSm9pbigpOworICBFWFBFQ1RfVFJVRShsb2NhbC5jcmVhdGVkKCkpOworICBFWFBFQ1RfRVEoMiwgVHJhY2VhYmxlT2JqZWN0Ojpjb25zdHJ1Y3Rpb25zKTsKKyAgRVhQRUNUX0VRKDEsIFRyYWNlYWJsZU9iamVjdDo6ZGVzdHJ1Y3Rpb25zKTsKKyAgbG9jYWwuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKDIsIFRyYWNlYWJsZU9iamVjdDo6Y29uc3RydWN0aW9ucyk7CisgIEVYUEVDVF9FUSgyLCBUcmFjZWFibGVPYmplY3Q6OmRlc3RydWN0aW9ucyk7CisgIEVYUEVDVF9GQUxTRShsb2NhbC5jcmVhdGVkKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvY29uZmlndXJhdGlvbi5jYyBiL2Fvcy9saW51eF9jb2RlL2NvbmZpZ3VyYXRpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkNWQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2NvbmZpZ3VyYXRpb24uY2MKQEAgLTAsMCArMSwxMTYgQEAKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9jb25maWd1cmF0aW9uLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8aWZhZGRycy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3VuaXF1ZV9tYWxsb2NfcHRyLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9vbmNlLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGNvbmZpZ3VyYXRpb24geworbmFtZXNwYWNlIHsKKworLy8gVE9ETyhicmlhbnMpOiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc2FyeSBmb3IgcnVubmluZyB0ZXN0cy4gIFByb3ZpZGUgYSB3YXkgdG8KKy8vIHNldCB0aGUgSVAgYWRkcmVzcyB3aGVuIHJ1bm5pbmcgdGVzdHMgZnJvbSB0aGUgdGVzdC4KK2NvbnN0IGNoYXIgKmNvbnN0IGtMaW51eE5ldEludGVyZmFjZSA9ICJldGgwIjsKK2NvbnN0IGluX2FkZHIgKkRvR2V0T3duSVBBZGRyZXNzKCkgeworICBzdGF0aWMgY29uc3QgY2hhciAqa092ZXJyaWRlVmFyaWFibGUgPSAiRlJDOTcxX0lQX09WRVJSSURFIjsKKyAgY29uc3QgY2hhciAqb3ZlcnJpZGVfaXAgPSBnZXRlbnYoa092ZXJyaWRlVmFyaWFibGUpOworICBpZiAob3ZlcnJpZGVfaXAgIT0gTlVMTCkgeworICAgIExPRyhJTkZPLCAiT3ZlcnJpZGUgSVAgaXMgJXNcbiIsIG92ZXJyaWRlX2lwKTsKKyAgICBzdGF0aWMgaW5fYWRkciByOworICAgIGlmIChpbmV0X2F0b24ob3ZlcnJpZGVfaXAsICZyKSAhPSAwKSB7CisgICAgICByZXR1cm4gJnI7CisgICAgfSBlbHNlIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiZXJyb3IgcGFyc2luZyAlcyB2YWx1ZSAnJXMnXG4iLAorICAgICAgICAgIGtPdmVycmlkZVZhcmlhYmxlLCBvdmVycmlkZV9pcCk7CisgICAgfQorICB9IGVsc2UgeworICAgIExPRyhJTkZPLCAiQ291bGRuJ3QgZ2V0IGVudmlyb25tZW50YWwgdmFyaWFibGUuXG4iKTsKKyAgfQorCisgIGlmYWRkcnMgKmFkZHJzOworICBpZiAoZ2V0aWZhZGRycygmYWRkcnMpICE9IDApIHsKKyAgICBQTE9HKEZBVEFMLCAiZ2V0aWZhZGRycyglcCkgZmFpbGVkIiwgJmFkZHJzKTsKKyAgfQorICAvLyBTbWFydCBwb2ludGVycyBkb24ndCB3b3JrIHZlcnkgd2VsbCBmb3IgaXRlcmF0aW5nIHRocm91Z2ggYSBsaW5rZWQgbGlzdCwKKyAgLy8gYnV0IGl0IGRvZXMgZG8gYSB2ZXJ5IG5pY2Ugam9iIG9mIG1ha2luZyBzdXJlIHRoYXQgYWRkcnMgZ2V0cyBmcmVlZC4KKyAgdW5pcXVlX2NfcHRyPGlmYWRkcnMsIGZyZWVpZmFkZHJzPiBhZGRyc19kZWxldGVyKGFkZHJzKTsKKworICBmb3IgKDsgYWRkcnMgIT0gbnVsbHB0cjsgYWRkcnMgPSBhZGRycy0+aWZhX25leHQpIHsKKyAgICAvLyBpZmFfYWRkciB0ZW5kcyB0byBiZSBudWxscHRyIG9uIENBTiBpbnRlcmZhY2VzLgorICAgIGlmIChhZGRycy0+aWZhX2FkZHIgIT0gbnVsbHB0ciAmJiBhZGRycy0+aWZhX2FkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICBpZiAoc3RyY21wKGtMaW51eE5ldEludGVyZmFjZSwgYWRkcnMtPmlmYV9uYW1lKSA9PSAwKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbl9hZGRyIHIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcl9pbiAqPihfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoCisgICAgICAgICAgICAgICAgYWRkcnMtPmlmYV9hZGRyLCBhbGlnbm9mKHNvY2thZGRyX2luKSkpLT5zaW5fYWRkcjsKKyAgICAgICAgcmV0dXJuICZyOworICAgICAgfQorICAgIH0KKyAgfQorICBMT0coRkFUQUwsICJjb3VsZG4ndCBmaW5kIGFuIEFGX0lORVQgaW50ZXJmYWNlIG5hbWVkIFwiJXNcIlxuIiwKKyAgICAgIGtMaW51eE5ldEludGVyZmFjZSk7Cit9CisKK2NvbnN0IGNoYXIgKkRvR2V0Um9vdERpcmVjdG9yeSgpIHsKKyAgc3NpemVfdCBzaXplID0gMDsKKyAgY2hhciAqciA9IE5VTEw7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKHIgIT0gTlVMTCkgZGVsZXRlIHI7CisgICAgc2l6ZSArPSAyNTY7CisgICAgciA9IG5ldyBjaGFyW3NpemVdOworCisgICAgc3NpemVfdCByZXQgPSByZWFkbGluaygiL3Byb2Mvc2VsZi9leGUiLCByLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgaWYgKHJldCAhPSAtMSkgeworICAgICAgICBMT0coV0FSTklORywgIml0IHJldHVybmVkICV6ZCwgbm90IC0xXG4iLCByZXQpOworICAgICAgfQorICAgICAgUExPRyhGQVRBTCwgInJlYWRsaW5rKFwiL3Byb2Mvc2VsZi9leGVcIiwgJXAsICV6dSkgZmFpbGVkIiwgciwgc2l6ZSk7CisgICAgfQorICAgIGlmIChyZXQgPCBzaXplKSB7CisgICAgICB2b2lkICpsYXN0X3NsYXNoID0gbWVtcmNocihyLCAnLycsIHJldCk7CisgICAgICBpZiAobGFzdF9zbGFzaCA9PSBOVUxMKSB7CisgICAgICAgIHJbcmV0XSA9ICdcMCc7CisgICAgICAgIExPRyhGQVRBTCwgImNvdWxkbid0IGZpbmQgYSAnLycgaW4gXCIlc1wiXG4iLCByKTsKKyAgICAgIH0KKyAgICAgICpzdGF0aWNfY2FzdDxjaGFyICo+KGxhc3Rfc2xhc2gpID0gJ1wwJzsKKyAgICAgIExPRyhJTkZPLCAiZ290IGEgcm9vdCBkaXIgb2YgXCIlc1wiXG4iLCByKTsKKyAgICAgIHJldHVybiByOworICAgIH0KKyAgfQorfQorCitjb25zdCBjaGFyICpEb0dldExvZ2dpbmdEaXJlY3RvcnkoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGtTdWZmaXhbXSA9ICIvLi4vLi4vdG1wL3JvYm90X2xvZ3MiOworICBjb25zdCBjaGFyICpyb290ID0gR2V0Um9vdERpcmVjdG9yeSgpOworICBjaGFyICpyID0gbmV3IGNoYXJbc3RybGVuKHJvb3QpICsgc2l6ZW9mKGtTdWZmaXgpXTsKKyAgc3RyY3B5KHIsIHJvb3QpOworICBzdHJjYXQociwga1N1ZmZpeCk7CisgIHJldHVybiByOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgY2hhciAqR2V0Um9vdERpcmVjdG9yeSgpIHsKKyAgc3RhdGljIGFvczo6T25jZTxjb25zdCBjaGFyPiBvbmNlKERvR2V0Um9vdERpcmVjdG9yeSk7CisgIHJldHVybiBvbmNlLkdldCgpOworfQorCitjb25zdCBjaGFyICpHZXRMb2dnaW5nRGlyZWN0b3J5KCkgeworICBzdGF0aWMgYW9zOjpPbmNlPGNvbnN0IGNoYXI+IG9uY2UoRG9HZXRMb2dnaW5nRGlyZWN0b3J5KTsKKyAgcmV0dXJuIG9uY2UuR2V0KCk7Cit9CisKK2NvbnN0IGluX2FkZHIgJkdldE93bklQQWRkcmVzcygpIHsKKyAgc3RhdGljIGFvczo6T25jZTxjb25zdCBpbl9hZGRyPiBvbmNlKERvR2V0T3duSVBBZGRyZXNzKTsKKyAgcmV0dXJuICpvbmNlLkdldCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29uZmlndXJhdGlvbgorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvY29uZmlndXJhdGlvbi5oIGIvYW9zL2xpbnV4X2NvZGUvY29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjhmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9jb25maWd1cmF0aW9uLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBBT1NfTElOVVhfQ09ERV9DT05GSUdVUkFUSU9OX0hfCisjZGVmaW5lIEFPU19MSU5VWF9DT0RFX0NPTkZJR1VSQVRJT05fSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKK25hbWVzcGFjZSBhb3MgeworCisvLyBIb2xkcyBnbG9iYWwgY29uZmlndXJhdGlvbiBkYXRhLiBBbGwgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgc2FmZSB0byBjYWxsCisvLyBmcm9tIHdoZXJldmVyLgorbmFtZXNwYWNlIGNvbmZpZ3VyYXRpb24geworCisvLyBSZXR1cm5zICJvdXIiIElQIGFkZHJlc3MuCitjb25zdCBpbl9hZGRyICZHZXRPd25JUEFkZHJlc3MoKTsKKworLy8gUmV0dXJucyB0aGUgInJvb3QgZGlyZWN0b3J5IiBmb3IgdGhpcyBydW4uIFVuZGVyIGxpbnV4LCB0aGlzIGlzIHRoZQorLy8gZGlyZWN0b3J5IHdoZXJlIHRoZSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQgKGZyb20gL3Byb2Mvc2VsZi9leGUpCisvLyBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYWx3YXlzIGJlIHRvIGEgc3RhdGljIHN0cmluZywgc28gbm8gZnJlZWluZyBpcworLy8gbmVjZXNzYXJ5LgorY29uc3QgY2hhciAqR2V0Um9vdERpcmVjdG9yeSgpOworLy8gUmV0dXJucyB0aGUgZGlyZWN0b3J5IHdoZXJlIGxvZ3MgZ2V0IHdyaXR0ZW4uIFJlbGF0aXZlIHRvIEdldFJvb3REaXJlY3RvcnkoKS4KKy8vIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHdheXMgYmUgdG8gYSBzdGF0aWMgc3RyaW5nLCBzbyBubyBmcmVlaW5nIGlzCisvLyBuZWNlc3NhcnkuCitjb25zdCBjaGFyICpHZXRMb2dnaW5nRGlyZWN0b3J5KCk7CisKK30gIC8vIG5hbWVzcGFjZSBjb25maWd1cmF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0xJTlVYX0NPREVfQ09ORklHVVJBVElPTl9IXwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvY29yZS5jYyBiL2Fvcy9saW51eF9jb2RlL2NvcmUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5ZGYxZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2NvcmUuY2MKQEAgLTAsMCArMSwzMiBAQAorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3J1bl9jb21tYW5kLmgiCisKKy8vIEluaXRpYWxpemVzIHNoYXJlZCBtZW1vcnkuIFRoaXMgaXMgdGhlIG9ubHkgZmlsZSB0aGF0IHdpbGwgY3JlYXRlIHRoZSBzaGFyZWQKKy8vIG1lbW9yeSBmaWxlIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCAoYW5kIHNldCBldmVyeXRoaW5nIHVwKS4KKy8vCisvLyBXaWxsIGFsc28gdG91Y2ggdGhlIGZpbGUgZ2l2ZW4gYXMgYSBmaXJzdCBhcmd1bWVudC4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGFvczo6SW5pdENyZWF0ZSgpOworCisgIGlmIChhcmdjID4gMSkgeworICAgIGNvbnN0IGludCByZXN1bHQgPSA6OmFvczo6dXRpbDo6UnVuQ29tbWFuZCgKKyAgICAgICAgKHN0ZDo6c3RyaW5nKCJ0b3VjaCAnIikgKyBhcmd2WzFdICsgIiciKS5jX3N0cigpKTsKKyAgICBpZiAocmVzdWx0ID09IC0xIHx8ICFXSUZFWElURUQocmVzdWx0KSB8fCBXRVhJVFNUQVRVUyhyZXN1bHQpICE9IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiYHRvdWNoICclcydgIGZhaWxlZDsgcmVzdWx0ID0gJXhcbiIsIGFyZ3ZbMV0sIHJlc3VsdCk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICB9CisKKyAgc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOyAgLy8gd2FpdCBmb3JldmVyCisgIGFvczo6Q2xlYW51cCgpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvZHVtcF9ydHByaW8uY2MgYi9hb3MvbGludXhfY29kZS9kdW1wX3J0cHJpby5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWU2OWYxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvZHVtcF9ydHByaW8uY2MKQEAgLTAsMCArMSwyODIgQEAKKy8vIFRoaXMgaXMgYSB1dGlsaXR5IHByb2dyYW0gdGhhdCBwcmludHMgb3V0IHJlYWx0aW1lIHByaW9yaXRpZXMgZm9yIHByb2Nlc3NlcworLy8gb24gYSBzeXN0ZW0uIEl0IGlzIHVzZWZ1bCBib3RoIGJlY2F1c2UgdGhlIHN0YW5kYXJkIHRvb2xzIGRvbid0IGZvcm1hdCB0aGF0CisvLyBpbmZvcm1hdGlvbiB2ZXJ5IHdlbGwgYW5kIHRoZSByb2JvUklPJ3MgYnVzeWJveCBvbmVzIGRvbid0IHNlZW0gdG8gZG8gaXQgYXQKKy8vIGFsbC4KKy8vCisvLyBUaGUgb3V0cHV0IGZvcm1hdCBpcyB0aGUgZm9sbG93aW5nIGNvbW1hLXNlcGFyYXRlZCBjb2x1bW5zOgorLy8gZXhlLG5hbWUsY3B1bWFzayxwb2xpY3ksbmljZSxwcmlvcml0eSx0aWQscGlkLHBwaWQsc2lkLGNwdQorCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nX2ltcGwuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgY2hhciAqcG9saWN5X3N0cmluZyh1aW50MzJfdCBwb2xpY3kpIHsKKyAgc3dpdGNoIChwb2xpY3kpIHsKKyAgICBjYXNlIFNDSEVEX09USEVSOgorICAgICAgcmV0dXJuICJPVEhFUiI7CisgICAgY2FzZSBTQ0hFRF9CQVRDSDoKKyAgICAgIHJldHVybiAiQkFUQ0giOworICAgIGNhc2UgU0NIRURfSURMRToKKyAgICAgIHJldHVybiAiSURMRSI7CisgICAgY2FzZSBTQ0hFRF9GSUZPOgorICAgICAgcmV0dXJuICJGSUZPIjsKKyAgICBjYXNlIFNDSEVEX1JSOgorICAgICAgcmV0dXJuICJSUiI7CisjaWZkZWYgU0NIRURfREVBRExJTkUKKyAgICBjYXNlIFNDSEVEX0RFQURMSU5FOgorICAgICAgcmV0dXJuICJERUFETElORSI7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICI/Pz8iOworICB9Cit9CisKKzo6c3RkOjpzdHJpbmcgc3RyaXBfc3RyaW5nX3ByZWZpeChzaXplX3QgbGVuZ3RoLCA6OnN0ZDo6c3RyaW5nIHN0cikgeworICBzdHIgPSBzdHIuc3Vic3RyKGxlbmd0aCk7CisgIHdoaWxlIChzdHJbMF0gPT0gJyAnIHx8IHN0clswXSA9PSAnXHQnKSB7CisgICAgc3RyID0gc3RyLnN1YnN0cigxKTsKKyAgfQorICByZXR1cm4gc3RyLnN1YnN0cigwLCBzdHIuc2l6ZSgpIC0gMSk7Cit9CisKK2ludCBmaW5kX3BpZF9tYXgoKSB7CisgIGludCByOworICBGSUxFICpwaWRfbWF4X2ZpbGUgPSBmb3BlbigiL3Byb2Mvc3lzL2tlcm5lbC9waWRfbWF4IiwgInIiKTsKKyAgaWYgKHBpZF9tYXhfZmlsZSA9PSBudWxscHRyKSB7CisgICAgUExPRyhGQVRBTCwgImZvcGVuKFwiL3Byb2Mvc3lzL2tlcm5lbC9waWRfbWF4XCIpIik7CisgIH0KKyAgQ0hFQ0tfRVEoMSwgZnNjYW5mKHBpZF9tYXhfZmlsZSwgIiVkIiwgJnIpKTsKKyAgUENIRUNLKGZjbG9zZShwaWRfbWF4X2ZpbGUpKTsKKyAgcmV0dXJuIHI7Cit9CisKK2NwdV9zZXRfdCBmaW5kX2FsbF9jcHVzKCkgeworICBsb25nIG5wcm9jID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7CisgIGlmIChucHJvYyA9PSAtMSkgeworICAgIFBMT0coRkFUQUwsICJzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19DT05GKSIpOworICB9CisgIGNwdV9zZXRfdCByOworICBDUFVfWkVSTygmcik7CisgIGZvciAobG9uZyBpID0gMDsgaSA8IG5wcm9jOyArK2kpIHsKKyAgICBDUFVfU0VUKGksICZyKTsKKyAgfQorICByZXR1cm4gcjsKK30KKworY3B1X3NldF90IGZpbmRfY3B1X21hc2soaW50IHByb2Nlc3MsIGJvb2wgKm5vdF90aGVyZSkgeworICBjcHVfc2V0X3QgcjsKKyAgY29uc3QgaW50IHJlc3VsdCA9IHNjaGVkX2dldGFmZmluaXR5KHByb2Nlc3MsIHNpemVvZihyKSwgJnIpOworICBpZiAocmVzdWx0ID09IC0xICYmIGVycm5vID09IEVTUkNIKSB7CisgICAgKm5vdF90aGVyZSA9IHRydWU7CisgICAgcmV0dXJuIGNwdV9zZXRfdCgpOworICB9CisgIGlmIChyZXN1bHQgIT0gMCkgeworICAgIFBMT0coRkFUQUwsICJzY2hlZF9nZXRhZmZpbml0eSglZCwgJXp1LCAlcCkiLCBwcm9jZXNzLCBzaXplb2YociksICZyKTsKKyAgfQorICByZXR1cm4gcjsKK30KKworc2NoZWRfcGFyYW0gZmluZF9zY2hlZF9wYXJhbShpbnQgcHJvY2VzcywgYm9vbCAqbm90X3RoZXJlKSB7CisgIHNjaGVkX3BhcmFtIHI7CisgIGNvbnN0IGludCByZXN1bHQgPSBzY2hlZF9nZXRwYXJhbShwcm9jZXNzLCAmcik7CisgIGlmIChyZXN1bHQgPT0gLTEgJiYgZXJybm8gPT0gRVNSQ0gpIHsKKyAgICAqbm90X3RoZXJlID0gdHJ1ZTsKKyAgICByZXR1cm4gc2NoZWRfcGFyYW0oKTsKKyAgfQorICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICBQTE9HKEZBVEFMLCAic2NoZWRfZ2V0cGFyYW0oJWQpIiwgcHJvY2Vzcyk7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK2ludCBmaW5kX3NjaGVkdWxlcihpbnQgcHJvY2VzcywgYm9vbCAqbm90X3RoZXJlKSB7CisgIGludCBzY2hlZHVsZXIgPSBzY2hlZF9nZXRzY2hlZHVsZXIocHJvY2Vzcyk7CisgIGlmIChzY2hlZHVsZXIgPT0gLTEgJiYgZXJybm8gPT0gRVNSQ0gpIHsKKyAgICAqbm90X3RoZXJlID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoc2NoZWR1bGVyID09IC0xKSB7CisgICAgUExPRyhGQVRBTCwgInNjaGVkX2dldHNjaGVkdWxlciglZCkiLCBwcm9jZXNzKTsKKyAgfQorICByZXR1cm4gc2NoZWR1bGVyOworfQorCis6OnN0ZDo6c3RyaW5nIGZpbmRfZXhlKGludCBwcm9jZXNzLCBib29sICpub3RfdGhlcmUpIHsKKyAgOjpzdGQ6OnN0cmluZyBleGVfZmlsZW5hbWUgPSAiL3Byb2MvIiArIDo6c3RkOjp0b19zdHJpbmcocHJvY2VzcykgKyAiL2V4ZSI7CisgIGNoYXIgZXhlX2J1ZmZlclsxMDI0XTsKKyAgc3NpemVfdCBleGVfc2l6ZSA9CisgICAgICByZWFkbGluayhleGVfZmlsZW5hbWUuY19zdHIoKSwgZXhlX2J1ZmZlciwgc2l6ZW9mKGV4ZV9idWZmZXIpKTsKKyAgaWYgKGV4ZV9zaXplID09IC0xICYmIGVycm5vID09IEVOT0VOVCkgeworICAgIHJldHVybiAiRU5PRU5UIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZXhlX3NpemUgPT0gLTEgJiYgZXJybm8gPT0gRVNSQ0gpIHsKKyAgICAgICpub3RfdGhlcmUgPSB0cnVlOworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBpZiAoZXhlX3NpemUgPT0gLTEpIHsKKyAgICAgIFBMT0coRkFUQUwsICJyZWFkbGluayglcywgJXAsICV6dSkiLCBleGVfZmlsZW5hbWUuY19zdHIoKSwgZXhlX2J1ZmZlciwKKyAgICAgICAgICAgc2l6ZW9mKGV4ZV9idWZmZXIpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoZXhlX2J1ZmZlciwgZXhlX3NpemUpOworICB9Cit9CisKK2ludCBmaW5kX25pY2VfdmFsdWUoaW50IHByb2Nlc3MsIGJvb2wgKm5vdF90aGVyZSkgeworICBlcnJubyA9IDA7CisgIGludCBuaWNlX3ZhbHVlID0gZ2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBwcm9jZXNzKTsKKyAgaWYgKGVycm5vID09IEVTUkNIKSB7CisgICAgKm5vdF90aGVyZSA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGVycm5vICE9IDApIHsKKyAgICBQTE9HKEZBVEFMLCAiZ2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAlZCkiLCBwcm9jZXNzKTsKKyAgfQorICByZXR1cm4gbmljZV92YWx1ZTsKK30KKwordm9pZCByZWFkX3N0YXQoaW50IHByb2Nlc3MsIGludCAqcHBpZCwgaW50ICpzaWQsIGJvb2wgKm5vdF90aGVyZSkgeworICA6OnN0ZDo6c3RyaW5nIHN0YXRfZmlsZW5hbWUgPSAiL3Byb2MvIiArIDo6c3RkOjp0b19zdHJpbmcocHJvY2VzcykgKyAiL3N0YXQiOworICBGSUxFICpzdGF0ID0gZm9wZW4oc3RhdF9maWxlbmFtZS5jX3N0cigpLCAiciIpOworICBpZiAoc3RhdCA9PSBudWxscHRyICYmIGVycm5vID09IEVOT0VOVCkgeworICAgICpub3RfdGhlcmUgPSB0cnVlOworICAgIHJldHVybjsKKyAgfQorICBpZiAoc3RhdCA9PSBudWxscHRyKSB7CisgICAgUExPRyhGQVRBTCwgImZvcGVuKCVzLCBcInJcIikiLCBzdGF0X2ZpbGVuYW1lLmNfc3RyKCkpOworICB9CisKKyAgY2hhciBidWZmZXJbMjA0OF07CisgIGlmIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGF0KSA9PSBudWxscHRyKSB7CisgICAgaWYgKGZlcnJvcihzdGF0KSkgeworICAgICAgaWYgKGVycm5vID09IEVTUkNIKSB7CisgICAgICAgICpub3RfdGhlcmUgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBQTE9HKEZBVEFMLCAiZmdldHMoJXAsICV6dSwgJXApIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgc3RhdCk7CisgICAgfQorICB9CisKKyAgaW50IHBpZCA9IDA7CisKKyAgaW50IGZpZWxkID0gMDsKKyAgc2l6ZV90IGZpZWxkX3N0YXJ0ID0gMDsKKyAgaW50IHBhcmVucyA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGJ1ZmZlcik7ICsraSkgeworICAgIGlmIChidWZmZXJbaV0gPT0gJ1wwJykgYnJlYWs7CisgICAgaWYgKGJ1ZmZlcltpXSA9PSAnKCcpICsrcGFyZW5zOworICAgIGlmIChwYXJlbnMgPiAwKSB7CisgICAgICBpZiAoYnVmZmVyW2ldID09ICcpJykgLS1wYXJlbnM7CisgICAgfSBlbHNlIGlmIChidWZmZXJbaV0gPT0gJyAnKSB7CisgICAgICA6OnN0ZDo6c3RyaW5nIGZpZWxkX3N0cmluZyhidWZmZXIsIGZpZWxkX3N0YXJ0LCBpIC0gZmllbGRfc3RhcnQpOworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgcGlkID0gOjpzdGQ6OnN0b2koZmllbGRfc3RyaW5nKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICpwcGlkID0gOjpzdGQ6OnN0b2koZmllbGRfc3RyaW5nKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICpzaWQgPSA6OnN0ZDo6c3RvaShmaWVsZF9zdHJpbmcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytmaWVsZDsKKyAgICAgIGZpZWxkX3N0YXJ0ID0gaSArIDE7CisgICAgfQorICB9CisgIFBDSEVDSyhmY2xvc2Uoc3RhdCkpOworCisgIGlmIChmaWVsZCA8IDQpIHsKKyAgICBMT0coRkFUQUwsICJjb3VsZG4ndCBnZXQgZmllbGRzIGZyb20gL3Byb2MvJWQvc3RhdFxuIiwgcHJvY2Vzcyk7CisgIH0KKyAgQ0hFQ0tfRVEocGlkLCBwcm9jZXNzKTsKK30KKwordm9pZCByZWFkX3N0YXR1cyhpbnQgcHJvY2VzcywgaW50IHBwaWQsIGludCAqcGdycCwgOjpzdGQ6OnN0cmluZyAqbmFtZSwKKyAgICAgICAgICAgICAgICAgYm9vbCAqbm90X3RoZXJlKSB7CisgIDo6c3RkOjpzdHJpbmcgc3RhdHVzX2ZpbGVuYW1lID0KKyAgICAgICIvcHJvYy8iICsgOjpzdGQ6OnRvX3N0cmluZyhwcm9jZXNzKSArICIvc3RhdHVzIjsKKyAgRklMRSAqc3RhdHVzID0gZm9wZW4oc3RhdHVzX2ZpbGVuYW1lLmNfc3RyKCksICJyIik7CisgIGlmIChzdGF0dXMgPT0gbnVsbHB0ciAmJiBlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAqbm90X3RoZXJlID0gdHJ1ZTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHN0YXR1cyA9PSBudWxscHRyKSB7CisgICAgUExPRyhGQVRBTCwgImZvcGVuKCVzLCBcInJcIikiLCBzdGF0dXNfZmlsZW5hbWUuY19zdHIoKSk7CisgIH0KKworICBpbnQgcGlkID0gMCwgc3RhdHVzX3BwaWQgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgIGlmIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGF0dXMpID09IG51bGxwdHIpIHsKKyAgICAgIGlmIChmZXJyb3Ioc3RhdHVzKSkgeworICAgICAgICBQTE9HKEZBVEFMLCAiZmdldHMoJXAsICV6dSwgJXApIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgc3RhdHVzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICA6OnN0ZDo6c3RyaW5nIGxpbmUoYnVmZmVyKTsKKyAgICBpZiAobGluZS5zdWJzdHIoMCwgNSkgPT0gIk5hbWU6IikgeworICAgICAgKm5hbWUgPSBzdHJpcF9zdHJpbmdfcHJlZml4KDUsIGxpbmUpOworICAgIH0gZWxzZSBpZiAobGluZS5zdWJzdHIoMCwgNCkgPT0gIlBpZDoiKSB7CisgICAgICBwaWQgPSA6OnN0ZDo6c3RvaShzdHJpcF9zdHJpbmdfcHJlZml4KDQsIGxpbmUpKTsKKyAgICB9IGVsc2UgaWYgKGxpbmUuc3Vic3RyKDAsIDUpID09ICJQUGlkOiIpIHsKKyAgICAgIHN0YXR1c19wcGlkID0gOjpzdGQ6OnN0b2koc3RyaXBfc3RyaW5nX3ByZWZpeCg1LCBsaW5lKSk7CisgICAgfSBlbHNlIGlmIChsaW5lLnN1YnN0cigwLCA1KSA9PSAiVGdpZDoiKSB7CisgICAgICAqcGdycCA9IDo6c3RkOjpzdG9pKHN0cmlwX3N0cmluZ19wcmVmaXgoNSwgbGluZSkpOworICAgIH0KKyAgfQorICBQQ0hFQ0soZmNsb3NlKHN0YXR1cykpOworICBDSEVDS19FUShwaWQsIHByb2Nlc3MpOworICBDSEVDS19FUShzdGF0dXNfcHBpZCwgcHBpZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbigpIHsKKyAgOjphb3M6OmxvZ2dpbmc6OkluaXQoKTsKKyAgOjphb3M6OmxvZ2dpbmc6OkFkZEltcGxlbWVudGF0aW9uKAorICAgICAgbmV3IDo6YW9zOjpsb2dnaW5nOjpTdHJlYW1Mb2dJbXBsZW1lbnRhdGlvbihzdGRvdXQpKTsKKworICBjb25zdCBpbnQgcGlkX21heCA9IGZpbmRfcGlkX21heCgpOworICBjb25zdCBjcHVfc2V0X3QgYWxsX2NwdXMgPSBmaW5kX2FsbF9jcHVzKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWRfbWF4OyArK2kpIHsKKyAgICBib29sIG5vdF90aGVyZSA9IGZhbHNlOworCisgICAgY29uc3QgY3B1X3NldF90IGNwdV9tYXNrID0gZmluZF9jcHVfbWFzayhpLCAmbm90X3RoZXJlKTsKKyAgICBjb25zdCBzY2hlZF9wYXJhbSBwYXJhbSA9IGZpbmRfc2NoZWRfcGFyYW0oaSwgJm5vdF90aGVyZSk7CisgICAgY29uc3QgaW50IHNjaGVkdWxlciA9IGZpbmRfc2NoZWR1bGVyKGksICZub3RfdGhlcmUpOworICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcgZXhlID0gZmluZF9leGUoaSwgJm5vdF90aGVyZSk7CisgICAgY29uc3QgaW50IG5pY2VfdmFsdWUgPSBmaW5kX25pY2VfdmFsdWUoaSwgJm5vdF90aGVyZSk7CisKKyAgICBpbnQgcHBpZCA9IDAsIHNpZCA9IDA7CisgICAgcmVhZF9zdGF0KGksICZwcGlkLCAmc2lkLCAmbm90X3RoZXJlKTsKKworICAgIGludCBwZ3JwID0gMDsKKyAgICA6OnN0ZDo6c3RyaW5nIG5hbWU7CisgICAgcmVhZF9zdGF0dXMoaSwgcHBpZCwgJnBncnAsICZuYW1lLCAmbm90X3RoZXJlKTsKKworICAgIGlmIChub3RfdGhlcmUpIGNvbnRpbnVlOworCisgICAgY29uc3QgY2hhciAqY3B1X21hc2tfc3RyaW5nID0KKyAgICAgICAgQ1BVX0VRVUFMKCZjcHVfbWFzaywgJmFsbF9jcHVzKSA/ICJhbGwiIDogIj8/PyI7CisKKyAgICBwcmludGYoIiVzLCVzLCVzLCVzLCVkLCVkLCVkLCVkLCVkLCVkXG4iLCBleGUuY19zdHIoKSwgbmFtZS5jX3N0cigpLAorICAgICAgICAgICBjcHVfbWFza19zdHJpbmcsIHBvbGljeV9zdHJpbmcoc2NoZWR1bGVyKSwgbmljZV92YWx1ZSwKKyAgICAgICAgICAgcGFyYW0uc2NoZWRfcHJpb3JpdHksIGksIHBncnAsIHBwaWQsIHNpZCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2luaXQuY2MgYi9hb3MvbGludXhfY29kZS9pbml0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGI5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9pbml0LmNjCkBAIC0wLDAgKzEsMTY3IEBACisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9saW51eF9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9zaGFyZWRfbWVtLmgiCisKKyNpZmRlZiBUQ01BTExPQworbmFtZXNwYWNlIEZMQUdfX25hbWVzcGFjZV9kb19ub3RfdXNlX2RpcmVjdGx5X3VzZV9ERUNMQVJFX2RvdWJsZV9pbnN0ZWFkIHsKK2V4dGVybiBkb3VibGUgRkxBR1NfdGNtYWxsb2NfcmVsZWFzZV9yYXRlOworfQordXNpbmcgRkxBR19fbmFtZXNwYWNlX2RvX25vdF91c2VfZGlyZWN0bHlfdXNlX0RFQ0xBUkVfZG91YmxlX2luc3RlYWQ6OgorICAgIEZMQUdTX3RjbWFsbG9jX3JlbGVhc2VfcmF0ZTsKKyNlbmRpZgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBsb2dnaW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEltcGxlbWVudGVkIGluIGFvcy9saW51eF9jb2RlL2xvZ2dpbmcvbGludXhfaW50ZXJmYWNlLmNjLgordm9pZCBSZWxvYWRUaHJlYWROYW1lKCk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGxvZ2dpbmcKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2V0U29mdFJMaW1pdChpbnQgcmVzb3VyY2UsIHJsaW02NF90IHNvZnQsIGJvb2wgc2V0X2Zvcl9yb290KSB7CisgIGJvb2wgYW1fcm9vdCA9IGdldHVpZCgpID09IDA7CisgIGlmIChzZXRfZm9yX3Jvb3QgfHwgIWFtX3Jvb3QpIHsKKyAgICBzdHJ1Y3QgcmxpbWl0NjQgcmxpbTsKKyAgICBpZiAoZ2V0cmxpbWl0NjQocmVzb3VyY2UsICZybGltKSA9PSAtMSkgeworICAgICAgUERpZSgiJXMtaW5pdDogZ2V0cmxpbWl0NjQoJWQpIGZhaWxlZCIsCisgICAgICAgICAgIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lLCByZXNvdXJjZSk7CisgICAgfQorICAgIHJsaW0ucmxpbV9jdXIgPSBzb2Z0OworICAgIHJsaW0ucmxpbV9tYXggPSA6OnN0ZDo6bWF4KHJsaW0ucmxpbV9tYXgsIHNvZnQpOworCisgICAgaWYgKHNldHJsaW1pdDY0KHJlc291cmNlLCAmcmxpbSkgPT0gLTEpIHsKKyAgICAgIFBEaWUoIiVzLWluaXQ6IHNldHJsaW1pdDY0KCVkLCB7Y3VyPSVqdSxtYXg9JWp1fSkgZmFpbGVkIiwKKyAgICAgICAgICAgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUsIHJlc291cmNlLCAodWludG1heF90KXJsaW0ucmxpbV9jdXIsCisgICAgICAgICAgICh1aW50bWF4X3QpcmxpbS5ybGltX21heCk7CisgICAgfQorICB9Cit9CisKKy8vIENvbW1vbiBzdHVmZiB0aGF0IG5lZWRzIHRvIGhhcHBlbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGJvdGggdGhlIHJlYWx0aW1lIGFuZAorLy8gbm9uLXJlYWx0aW1lIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlcy4gTWF5IGJlIGNhbGxlZCB0d2ljZS4KK3ZvaWQgSW5pdFN0YXJ0KCkgeworICA6OmFvczo6bG9nZ2luZzo6SW5pdCgpOworICBXcml0ZUNvcmVEdW1wcygpOworfQorCit2b2lkIExvY2tBbGxNZW1vcnkoKSB7CisgIC8vIEFsbG93IGxvY2tpbmcgYXMgbXVjaCBhcyB3ZSB3YW50IGludG8gUkFNLgorICBTZXRTb2Z0UkxpbWl0KFJMSU1JVF9NRU1MT0NLLCBSTElNX0lORklOSVRZLCBmYWxzZSk7CisKKyAgSW5pdFN0YXJ0KCk7CisgIGlmIChtbG9ja2FsbChNQ0xfQ1VSUkVOVCB8IE1DTF9GVVRVUkUpID09IC0xKSB7CisgICAgUERpZSgiJXMtaW5pdDogbWxvY2thbGwgZmFpbGVkIiwgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOworICB9CisKKyAgLy8gRG9uJ3QgZ2l2ZSBmcmVlZCBtZW1vcnkgYmFjayB0byB0aGUgT1MuCisgIENIRUNLX0VRKDEsIG1hbGxvcHQoTV9UUklNX1RIUkVTSE9MRCwgLTEpKTsKKyAgLy8gRG9uJ3QgdXNlIG1tYXAgZm9yIGxhcmdlIG1hbGxvYyBjaHVua3MuCisgIENIRUNLX0VRKDEsIG1hbGxvcHQoTV9NTUFQX01BWCwgMCkpOworCisjaWZkZWYgVENNQUxMT0MKKyAgLy8gVGVsbCB0Y21hbGxvYyBub3QgdG8gcmV0dXJuIG1lbW9yeS4KKyAgRkxBR1NfdGNtYWxsb2NfcmVsZWFzZV9yYXRlID0gMC4wOworI2VuZGlmCisKKyAgLy8gRm9yY2VzIHRoZSBtZW1vcnkgcGFnZXMgZm9yIGFsbCB0aGUgc3RhY2sgc3BhY2UgdGhhdCB3ZSdyZSBldmVyIGdvaW5nIHRvCisgIC8vIHVzZSB0byBiZSBsb2FkZWQgaW50byBtZW1vcnkgKHNvIGl0IGNhbiBiZSBsb2NrZWQgdGhlcmUpLgorICB1aW50OF90IGRhdGFbNDA5NiAqIDhdOworICAvLyBOb3QgMCBiZWNhdXNlIGxpbnV4IG1pZ2h0IG9wdGltaXplIHRoYXQgdG8gYSAwLWZpbGxlZCBwYWdlLgorICBtZW1zZXQoZGF0YSwgMSwgc2l6ZW9mKGRhdGEpKTsKKworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIZWFwUHJlYWxsb2NTaXplID0gNTEyICogMTAyNDsKKyAgY2hhciAqY29uc3QgaGVhcF9kYXRhID0gc3RhdGljX2Nhc3Q8Y2hhciAqPihtYWxsb2Moa0hlYXBQcmVhbGxvY1NpemUpKTsKKyAgbWVtc2V0KGhlYXBfZGF0YSwgMSwga0hlYXBQcmVhbGxvY1NpemUpOworICBmcmVlKGhlYXBfZGF0YSk7Cit9CisKK2NvbnN0IGNoYXIgKmNvbnN0IGtOb1JlYWx0aW1lRW52aXJvbm1lbnRWYXJpYWJsZSA9ICJBT1NfTk9fUkVBTFRJTUUiOworCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBJbml0TlJUKCkgeworICBJbml0U3RhcnQoKTsKKyAgYW9zX2NvcmVfY3JlYXRlX3NoYXJlZF9tZW0oZmFsc2UsIGZhbHNlKTsKKyAgbG9nZ2luZzo6bGludXhfY29kZTo6UmVnaXN0ZXIoKTsKK30KKwordm9pZCBJbml0Q3JlYXRlKCkgeworICBJbml0U3RhcnQoKTsKKyAgYW9zX2NvcmVfY3JlYXRlX3NoYXJlZF9tZW0odHJ1ZSwgZmFsc2UpOworICBsb2dnaW5nOjpsaW51eF9jb2RlOjpSZWdpc3RlcigpOworfQorCit2b2lkIEluaXQoaW50IHJlbGF0aXZlX3ByaW9yaXR5KSB7CisgIGJvb2wgcmVhbHRpbWUgPSBnZXRlbnYoa05vUmVhbHRpbWVFbnZpcm9ubWVudFZhcmlhYmxlKSA9PSBudWxscHRyOworICBpZiAocmVhbHRpbWUpIHsKKyAgICBMb2NrQWxsTWVtb3J5KCk7CisKKyAgICAvLyBPbmx5IGxldCBydCBwcm9jZXNzZXMgcnVuIGZvciAzIHNlY29uZHMgc3RyYWlnaHQuCisgICAgU2V0U29mdFJMaW1pdChSTElNSVRfUlRUSU1FLCAzMDAwMDAwLCB0cnVlKTsKKworICAgIC8vIEFsbG93IHJ0IHByb2Nlc3NlcyB1cCB0byBwcmlvcml0eSA0MC4KKyAgICBTZXRTb2Z0UkxpbWl0KFJMSU1JVF9SVFBSSU8sIDQwLCBmYWxzZSk7CisKKyAgICAvLyBTZXQgb3VyIHByb2Nlc3MgdG8gdGhlIGFwcHJvcHJpYXRlIHByaW9yaXR5LgorICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICBwYXJhbS5zY2hlZF9wcmlvcml0eSA9IDMwICsgcmVsYXRpdmVfcHJpb3JpdHk7CisgICAgaWYgKHNjaGVkX3NldHNjaGVkdWxlcigwLCBTQ0hFRF9GSUZPLCAmcGFyYW0pICE9IDApIHsKKyAgICAgIFBEaWUoIiVzLWluaXQ6IHNldHRpbmcgU0NIRURfRklGTyBmYWlsZWQiLCBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMgbm90IGRvaW5nIHJlYWx0aW1lIGluaXRpYWxpemF0aW9uIGJlY2F1c2UgZW52aXJvbm1lbnQiCisgICAgICAgICAgICAiIHZhcmlhYmxlICVzIGlzIHNldFxuIiwgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUsCisgICAgICAgICAgICBrTm9SZWFsdGltZUVudmlyb25tZW50VmFyaWFibGUpOworICAgIHByaW50Zigibm8gcmVhbHRpbWUgZm9yICVzLiBzZWUgc3RkZXJyXG4iLCBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgIH0KKworICBJbml0U3RhcnQoKTsKKyAgYW9zX2NvcmVfY3JlYXRlX3NoYXJlZF9tZW0oZmFsc2UsIHJlYWx0aW1lKTsKKyAgbG9nZ2luZzo6bGludXhfY29kZTo6UmVnaXN0ZXIoKTsKK30KKwordm9pZCBDbGVhbnVwKCkgeworICBhb3NfY29yZV9mcmVlX3NoYXJlZF9tZW0oKTsKK30KKwordm9pZCBXcml0ZUNvcmVEdW1wcygpIHsKKyAgLy8gRG8gY3JlYXRlIGNvcmUgZmlsZXMgb2YgdW5saW1pdGVkIHNpemUuCisgIFNldFNvZnRSTGltaXQoUkxJTUlUX0NPUkUsIFJMSU1fSU5GSU5JVFksIHRydWUpOworfQorCit2b2lkIFNldEN1cnJlbnRUaHJlYWRSZWFsdGltZVByaW9yaXR5KGludCBwcmlvcml0eSkgeworICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07CisgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisgIGlmIChzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfRklGTywgJnBhcmFtKSA9PSAtMSkgeworICAgIFBMT0coRkFUQUwsICJzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfRklGTywgJWQpIGZhaWxlZCIsIHByaW9yaXR5KTsKKyAgfQorfQorCit2b2lkIFNldEN1cnJlbnRUaHJlYWROYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcgJm5hbWUpIHsKKyAgaWYgKG5hbWUuc2l6ZSgpID4gMTYpIHsKKyAgICBMT0coRkFUQUwsICJ0aHJlYWQgbmFtZSAnJXMnIHRvbyBsb25nXG4iLCBuYW1lLmNfc3RyKCkpOworICB9CisgIExPRyhJTkZPLCAidGhpcyB0aHJlYWQgaXMgY2hhbmdpbmcgdG8gJyVzJ1xuIiwgbmFtZS5jX3N0cigpKTsKKyAgUENIRUNLKHByY3RsKFBSX1NFVF9OQU1FLCBuYW1lLmNfc3RyKCkpKTsKKyAgbG9nZ2luZzo6aW50ZXJuYWw6OlJlbG9hZFRocmVhZE5hbWUoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvaW5pdC5oIGIvYW9zL2xpbnV4X2NvZGUvaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTcxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9pbml0LmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBBT1NfTElOVVhfQ09ERV9JTklUX0hfCisjZGVmaW5lIEFPU19MSU5VWF9DT0RFX0lOSVRfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFvcyB7CisKKy8vIEluIG9yZGVyIHRvIHVzZSBzaGFyZWQgbWVtb3J5LCBvbmUgb2YgdGhlIEluaXQqIGZ1bmN0aW9ucyBtdXN0IGJlIGNhbGxlZCBpbgorLy8gZXhhY3RseSAxIHRocmVhZCBwZXIgcHJvY2Vzcy4gSXQgaXMgT0sgdG8ga2VlcCBnb2luZyB3aXRob3V0IGNhbGxpbmcgb25lIG9mCisvLyB0aGVtIGFnYWluIGFmdGVyIGZvcmsoMilpbmcuCisKKy8vIERvZXMgdGhlIG5vbi1yZWFsdGltZSBwYXJ0cyBvZiB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4KK3ZvaWQgSW5pdE5SVCgpOworLy8gSW5pdGlhbGl6ZXMgZXZlcnl0aGluZywgaW5jbHVkaW5nIHRoZSByZWFsdGltZSBzdHVmZi4KKy8vIHJlbGF0aXZlX3ByaW9yaXR5IGFkanVzdHMgdGhlIHByaW9yaXR5IG9mIHRoaXMgcHJvY2VzcyByZWxhdGl2ZSB0byBhbGwgb2YgdGhlCisvLyBvdGhlciBvbmVzIChwb3NpdGl2ZSBmb3IgaGlnaGVyIHByaW9yaXR5KS4KK3ZvaWQgSW5pdChpbnQgcmVsYXRpdmVfcHJpb3JpdHkgPSAwKTsKKy8vIFNhbWUgYXMgSW5pdE5SVCwgZXhjZXB0IHdpbGwgcmVtb3ZlIGFuIGV4aXN0aW5nIHNoYXJlZCBtZW1vcnkgZmlsZSBhbmQgY3JlYXRlCisvLyBhIG5ldyBvbmUuCit2b2lkIEluaXRDcmVhdGUoKTsKKy8vIENsZWFucyB1cCAocHJvYmFibHkgbm90IGdvaW5nIHRvIGdldCBjYWxsZWQgdmVyeSBvZnRlbiBiZWNhdXNlIGZldyB0aGluZ3MgY2FuCisvLyBleGl0IGdyYWNlZnVsbHkpLgordm9pZCBDbGVhbnVwKCk7CisKKy8vIFNldHMgdXAgdGhpcyBwcm9jZXNzIHRvIHdyaXRlIGNvcmUgZHVtcCBmaWxlcy4KKy8vIFRoaXMgaXMgY2FsbGVkIGJ5IEluaXQqLCBidXQgaXQncyBoZXJlIGZvciBvdGhlciBmaWxlcyB0aGF0IHdhbnQgdGhpcworLy8gYmVoYXZpb3Igd2l0aG91dCBjYWxsaW5nIEluaXQqLgordm9pZCBXcml0ZUNvcmVEdW1wcygpOworCisvLyBTZXRzIHRoZSBjdXJyZW50IHRocmVhZCdzIHJlYWx0aW1lIHByaW9yaXR5Lgordm9pZCBTZXRDdXJyZW50VGhyZWFkUmVhbHRpbWVQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisvLyBTZXRzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRocmVhZC4KKy8vIFRoaXMgd2lsbCBkaXNwbGF5ZWQgYnkgYHRvcCAtSGAsIGR1bXBfcnRwcmlvLCBhbmQgc2hvdyB1cCBpbiBsb2dzLgorLy8gbmFtZSBjYW4gaGF2ZSBhIG1heGltdW0gb2YgMTYgY2hhcmFjdGVycy4KK3ZvaWQgU2V0Q3VycmVudFRocmVhZE5hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyAmbmFtZSk7CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfTElOVVhfQ09ERV9JTklUX0hfCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9pcGNfbGliL2Fvc19zeW5jLmNjIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9hb3Nfc3luYy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc1YmJmCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9hb3Nfc3luYy5jYwpAQCAtMCwwICsxLDQ0MCBAQAorI2lmICFBT1NfREVCVUcKKyNkZWZpbmUgTkRFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvYW9zX3N5bmMuaCIKKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vb25jZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisKKy8vIFRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSBiYXNlZCBvbiA8aHR0cDovL3d3dy5ha2thZGlhLm9yZy9kcmVwcGVyL2Z1dGV4LnBkZj4sCisvLyBidXQgaXMgaGFzIHNpbmNlIGV2b2x2ZWQgYSBsb3QuIEhvd2V2ZXIsIHRoYXQgc3RpbGwgaGFzIHVzZWZ1bCBpbmZvcm1hdGlvbi4KKy8vCisvLyBGaW5kaW5nIGluZm9ybWF0aW9uIGFib3V0IGFjdHVhbGx5IHVzaW5nIGZ1dGV4ZXMgaXMgcmVhbGx5IFJFQUxMWSBoYXJkLCBzbworLy8gICBoZXJlJ3MgYSBsaXN0IG9mIHRoZSBzdHVmZiB0aGF0IEkndmUgdXNlZDoKKy8vIGZ1dGV4KDcpIGhhcyBhIHJlYWxseSBoaWdoLWxldmVsIG92ZXJ2aWV3LgorLy8gPGh0dHA6Ly9sb2NrbGVzc2luYy5jb20vYXJ0aWNsZXMvZnV0ZXhfY2hlYXRfc2hlZXQvPiBkZXNjcmliZXMgc29tZSBvZiB0aGUKKy8vICAgb3BlcmF0aW9ucyBpbiBhIGJpdCBtb3JlIGRldGFpbCB0aGFuIG1vc3QgcGxhY2VzLgorLy8gPGh0dHA6Ly9sb2NrbGVzc2luYy5jb20vYXJ0aWNsZXMvbXV0ZXhfY3ZfZnV0ZXgvPiBpcyB0aGUgYmFzaXMgb2Ygb3VyCisvLyAgIGltcGxlbWVudGF0aW9ucyAoYmVmb3JlIFBJKS4KKy8vIDxodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8zNjA2OTkvPiBoYXMgYSBuaWNlIG92ZXJ2aWV3IG9mIGZ1dGV4ZXMgaW4gbGF0ZSAyMDA5CisvLyAgIChmYWlybHkgcmVjZW50IGNvbXBhcmVkIHRvIGV2ZXJ5dGhpbmcgZWxzZS4uLikuCisvLyA8aHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9waS1mdXRleC50eHQ+LAorLy8gICA8aHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9mdXRleC1yZXF1ZXVlLXBpLnR4dD4sCisvLyAgIDxodHRwczovL3d3dy5rZXJuZWwub3JnL2RvYy9Eb2N1bWVudGF0aW9uL3JvYnVzdC1mdXRleGVzLnR4dD4sCisvLyAgIGFuZCA8aHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9yb2J1c3QtZnV0ZXgtQUJJLnR4dD4gYXJlIGFsbAorLy8gICB1c2VmdWwgcmVmZXJlbmNlcy4KKy8vIFRoZSBrZXJuZWwgc291cmNlIChrZXJuZWwvZnV0ZXguYykgaGFzIHNvbWUgdXNlZnVsIGNvbW1lbnRzIGFib3V0IHdoYXQgdGhlCisvLyAgIHZhcmlvdXMgb3BlcmF0aW9ucyBkbyAoZXhjZXB0IGZpZ3VyaW5nIG91dCB3aGljaCBhcmd1bWVudCBnb2VzIHdoZXJlIGluIHRoZQorLy8gICBzeXNjYWxsIGlzIHN0aWxsIGNvbmZ1c2luZykuCisvLyBmdXRleCgyKSBpcyBiYXNpY2FsbHkgdXNlbGVzcyBleGNlcHQgZm9yIGRlc2NyaWJpbmcgdGhlIG9yZGVyIG9mIHRoZQorLy8gICBhcmd1bWVudHMgKGl0IG9ubHkgaGFzIGhpZ2gtbGV2ZWwgZGVzY3JpcHRpb25zIG9mIHdoYXQgc29tZSBvZiB0aGUKKy8vICAgb3BlcmF0aW9ucyBkbywgYW5kIHNvbWUgb2YgdGhlbSBhcmUgd3JvbmcgaW4gV2hlZXp5KS4KKy8vIGdsaWJjJ3MgbnB0bCBwdGhyZWFkcyBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgaW50ZW5kZWQgdXNlciBvZiBtb3N0IG9mIHRoZXNlCisvLyAgIHRoaW5ncywgc28gaXQgaXMgYWxzbyBhIGdvb2QgcGxhY2UgdG8gbG9vayBmb3IgZXhhbXBsZXMuIEhvd2V2ZXIsIGl0IGlzIGFsbAorLy8gICB2ZXJ5IGhhcmQgdG8gcmVhZCBiZWNhdXNlIGl0IHN1cHBvcnRzIH4yMCBkaWZmZXJlbnQga2luZHMgb2YgbXV0ZXhlcyBhbmQKKy8vICAgc2V2ZXJhbCB2YXJpYXRpb25zIG9mIGNvbmRpdGlvbiB2YXJpYWJsZXMsIGFuZCBzb21lIG9mIHRoZSBwaWVjZXMgb2YgY29kZQorLy8gICBhcmUgb25seSB3cml0dGVuIGluIGFzc2VtYmx5LgorLy8gc2V0X3JvYnVzdF9saXN0KDIpIGlzIHdyb25nIGluIFdoZWV6eSAoaXQgZG9lc24ndCBhY3R1YWxseSB0YWtlIGEgVElECisvLyAgIGFyZ3VtZW50KS4KKy8vCisvLyBDYW4ndCB1c2UgUFJJVkFURSBmdXRleCBvcGVyYXRpb25zIGJlY2F1c2UgdGhleSB1c2UgdGhlIHBpZCAob3Igc29tZXRoaW5nKSBhcworLy8gICBwYXJ0IG9mIHRoZSBoYXNoLgorLy8KKy8vIFRocmVhZFNhbml0aXplciB1bmRlcnN0YW5kcyBob3cgdGhlc2UgbXV0ZXhlcyBldGMgd29yay4gSXQgYXBwZWFycyB0byBiZSBhYmxlCisvLyB0byBmaWd1cmUgb3V0IHRoZSBoYXBwZW5zLWJlZm9yZSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgX19BVE9NSUNfU0VRX0NTVAorLy8gYXRvbWljIHByaW1pdGl2ZXMuCisvLworLy8gUmVtZW1iZXIgdGhhdCBFQUdBSU4gYW5kIEVXT1VEQkxPQ0sgYXJlIHRoZSBzYW1lISAoaWUgaWYgeW91IGdldCBFQUdBSU4gZnJvbQorLy8gRlVURVhfV0FJVCwgdGhlIGRvY3MgY2FsbCBpdCBFV09VTERCTE9DSy4uLikKKworLy8gVmFsdWVzIGZvciBhbiBhb3NfbXV0ZXguZnV0ZXggKGtlcm5lbC1tYW5kYXRlZCk6CisvLyAwID0gdW5sb2NrZWQKKy8vIFRJRCA9IGxvY2tlZCwgbm90IGNvbnRlbmRlZAorLy8gfEZVVEVYX1dBSVRFUlMgPSB0aGVyZSBhcmUgd2FpdGVycyAoYWthIGNvbnRlbmRlZCkKKy8vCisvLyBWYWx1ZXMgZm9yIGFuIGFvc19mdXRleCBiZWluZyB1c2VkIGRpcmVjdGx5OgorLy8gMCA9IHVuc2V0CisvLyAxID0gc2V0CisvLworLy8gVGhlIHZhbHVlIG9mIGFuIGFvc19jb25kaXRpb24gaXMganVzdCBhIGdlbmVyYXRpb24gY291bnRlci4KKworbmFtZXNwYWNlIHsKKworLy8gVGhlc2Ugc3lzX2Z1dGV4XyogZnVuY3Rpb25zIGFyZSB3cmFwcGVycyBhcm91bmQgc3lzY2FsbChTWVNfZnV0ZXgpLiBUaGV5IGVhY2gKKy8vIHRha2UgYSBzcGVjaWZpYyBzZXQgb2YgYXJndW1lbnRzIGZvciBhIGdpdmVuIGZ1dGV4IG9wZXJhdGlvbi4gVGhleSByZXR1cm4gdGhlCisvLyByZXN1bHQgb3IgYSBuZWdhdGVkIGVycm5vIHZhbHVlLiAtMS4uLTQwOTUgbWVhbiBlcnJvcnMgYW5kIG5vdCBzdWNjZXNzZnVsCisvLyByZXN1bHRzLCB3aGljaCBpcyBndWFyYW50ZWVkIGJ5IHRoZSBrZXJuZWwuCisvLworLy8gVGhleSBlYWNoIGhhdmUgb3B0aW1pemVkIHZlcnNpb25zIGZvciBBUk0gRUFCSSAodGhlIHN5c2NhbGwgaW50ZXJmYWNlIGlzCisvLyBkaWZmZXJlbnQgZm9yIG5vbi1FQUJJIEFSTSwgc28gdGhhdCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gdGVzdCBmb3IpIHRoYXQKKy8vIGRvbid0IGdvIHRocm91Z2ggc3lzY2FsbCgyKSBvciBlcnJuby4KKy8vIFRoZXNlIHVzZSByZWdpc3RlciB2YXJpYWJsZXMgdG8gZ2V0IHRoZSB2YWx1ZXMgaW4gdGhlIHJpZ2h0IHJlZ2lzdGVycyB0bworLy8gYWN0dWFsbHkgbWFrZSB0aGUgc3lzY2FsbC4KKworLy8gVGhlIGFjdHVhbCBtYWNybyB0aGF0IHdlIGtleSBvZmYgb2YgdG8gdXNlIHRoZSBpbmxpbmUgdmVyc2lvbnMgb3Igbm90LgorI2RlZmluZSBBUk1fRUFCSV9JTkxJTkVfU1lTQ0FMTCBkZWZpbmVkKF9fQVJNX0VBQklfXykKKworLy8gVXNlZCBmb3IgRlVURVhfV0FJVCwgRlVURVhfTE9DS19QSSwgYW5kIEZVVEVYX1RSWUxPQ0tfUEkuCitpbmxpbmUgaW50IHN5c19mdXRleF93YWl0KGludCBvcCwgYW9zX2Z1dGV4ICphZGRyMSwgaW50IHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCkgeworI2lmIEFSTV9FQUJJX0lOTElORV9TWVNDQUxMCisgIHJlZ2lzdGVyIGFvc19mdXRleCAqYWRkcjFfcmVnIF9fYXNtX18oInIwIikgPSBhZGRyMTsKKyAgcmVnaXN0ZXIgaW50IG9wX3JlZyBfX2FzbV9fKCJyMSIpID0gb3A7CisgIHJlZ2lzdGVyIGludCB2YWwxX3JlZyBfX2FzbV9fKCJyMiIpID0gdmFsMTsKKyAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0X3JlZyBfX2FzbV9fKCJyMyIpID0gdGltZW91dDsKKyAgcmVnaXN0ZXIgaW50IHN5c2NhbGxfbnVtYmVyIF9fYXNtX18oInI3IikgPSBTWVNfZnV0ZXg7CisgIHJlZ2lzdGVyIGludCByZXN1bHQgX19hc21fXygicjAiKTsKKyAgX19hc21fXyB2b2xhdGlsZSgic3dpICMwIgorICAgICAgICAgICAgICAgICAgIDogIj1yIihyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgOiAiciIoYWRkcjFfcmVnKSwgInIiKG9wX3JlZyksICJyIih2YWwxX3JlZyksCisgICAgICAgICAgICAgICAgICAgICAiciIodGltZW91dF9yZWcpLCAiciIoc3lzY2FsbF9udW1iZXIpCisgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICBjb25zdCBpbnQgciA9IHN5c2NhbGwoU1lTX2Z1dGV4LCBhZGRyMSwgb3AsIHZhbDEsIHRpbWVvdXQpOworICBpZiAociA9PSAtMSkgcmV0dXJuIC1lcnJubzsKKyAgcmV0dXJuIHI7CisjZW5kaWYKK30KKworaW5saW5lIGludCBzeXNfZnV0ZXhfd2FrZShhb3NfZnV0ZXggKmFkZHIxLCBpbnQgdmFsMSkgeworI2lmIEFSTV9FQUJJX0lOTElORV9TWVNDQUxMCisgIHJlZ2lzdGVyIGFvc19mdXRleCAqYWRkcjFfcmVnIF9fYXNtX18oInIwIikgPSBhZGRyMTsKKyAgcmVnaXN0ZXIgaW50IG9wX3JlZyBfX2FzbV9fKCJyMSIpID0gRlVURVhfV0FLRTsKKyAgcmVnaXN0ZXIgaW50IHZhbDFfcmVnIF9fYXNtX18oInIyIikgPSB2YWwxOworICByZWdpc3RlciBpbnQgc3lzY2FsbF9udW1iZXIgX19hc21fXygicjciKSA9IFNZU19mdXRleDsKKyAgcmVnaXN0ZXIgaW50IHJlc3VsdCBfX2FzbV9fKCJyMCIpOworICBfX2FzbV9fIHZvbGF0aWxlKCJzd2kgIzAiCisgICAgICAgICAgICAgICAgICAgOiAiPXIiKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICA6ICJyIihhZGRyMV9yZWcpLCAiciIob3BfcmVnKSwgInIiKHZhbDFfcmVnKSwKKyAgICAgICAgICAgICAgICAgICAgICJyIihzeXNjYWxsX251bWJlcikKKyAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisgIGNvbnN0IGludCByID0gc3lzY2FsbChTWVNfZnV0ZXgsIGFkZHIxLCBGVVRFWF9XQUtFLCB2YWwxKTsKKyAgaWYgKHIgPT0gLTEpIHJldHVybiAtZXJybm87CisgIHJldHVybiByOworI2VuZGlmCit9CisKK2lubGluZSBpbnQgc3lzX2Z1dGV4X3VubG9ja19waShhb3NfZnV0ZXggKmFkZHIxKSB7CisjaWYgQVJNX0VBQklfSU5MSU5FX1NZU0NBTEwKKyAgcmVnaXN0ZXIgYW9zX2Z1dGV4ICphZGRyMV9yZWcgX19hc21fXygicjAiKSA9IGFkZHIxOworICByZWdpc3RlciBpbnQgb3BfcmVnIF9fYXNtX18oInIxIikgPSBGVVRFWF9VTkxPQ0tfUEk7CisgIHJlZ2lzdGVyIGludCBzeXNjYWxsX251bWJlciBfX2FzbV9fKCJyNyIpID0gU1lTX2Z1dGV4OworICByZWdpc3RlciBpbnQgcmVzdWx0IF9fYXNtX18oInIwIik7CisgIF9fYXNtX18gdm9sYXRpbGUoInN3aSAjMCIKKyAgICAgICAgICAgICAgICAgICA6ICI9ciIocmVzdWx0KQorICAgICAgICAgICAgICAgICAgIDogInIiKGFkZHIxX3JlZyksICJyIihvcF9yZWcpLCAiciIoc3lzY2FsbF9udW1iZXIpCisgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICBjb25zdCBpbnQgciA9IHN5c2NhbGwoU1lTX2Z1dGV4LCBhZGRyMSwgRlVURVhfVU5MT0NLX1BJKTsKKyAgaWYgKHIgPT0gLTEpIHJldHVybiAtZXJybm87CisgIHJldHVybiByOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcyBhbmQgZmFsc2UgaWYgaXQgZmFpbHMuCisvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAsIGV4Y2VwdCBpdCBwcm92aWRlcyBhbiBlYXN5CisvLyBwbGFjZSB0byBzd2l0Y2ggaW1wbGVtZW50YXRpb25zIGFuZC9vciB3b3JrIGFyb3VuZCBidWdzLgoraW5saW5lIGJvb2wgY29tcGFyZV9hbmRfc3dhcChhb3NfZnV0ZXggKmYsIHVpbnQzMl90IGJlZm9yZSwgdWludDMyX3QgYWZ0ZXIpIHsKKyAgcmV0dXJuIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoZiwgYmVmb3JlLCBhZnRlcik7Cit9CisKK3BpZF90IGRvX2dldF90aWQoKSB7CisgIHBpZF90IHIgPSBzeXNjYWxsKFNZU19nZXR0aWQpOworICBhc3NlcnQociA+IDApOworICByZXR1cm4gcjsKK30KKworLy8gVGhpcyBnZXRzIGNhbGxlZCBieSBmdW5jdGlvbnMgYmVmb3JlIExPRyhGQVRBTClpbmcgd2l0aCBlcnJvciBtZXNzYWdlcyB0aGF0CisvLyB3b3VsZCBiZSBpbmNvcnJlY3QgaWYgdGhlIGVycm9yIHdhcyBjYXVzZWQgYnkgYSBwcm9jZXNzIGZvcmtpbmcgd2l0aG91dAorLy8gaW5pdGlhbGl6ZV9pbl9uZXdfdGhyZWFkIGdldHRpbmcgY2FsbGVkIGluIHRoZSBmb3JrLgordm9pZCBjaGVja19jYWNoZWRfdGlkKHBpZF90IHRpZCkgeworICBwaWRfdCBhY3R1YWwgPSBkb19nZXRfdGlkKCk7CisgIGlmICh0aWQgIT0gYWN0dWFsKSB7CisgICAgTE9HKEZBVEFMLAorICAgICAgICAidGFzayAlamQgZm9ya2VkIGludG8gJWpkIHdpdGhvdXQgbGV0dGluZyBhb3Nfc3luYyBrbm93IgorICAgICAgICAiIHNvIHdlJ3JlIG5vdCByZWFsbHkgc3VyZSB3aGF0J3MgZ29pbmcgb25cbiIsCisgICAgICAgIHN0YXRpY19jYXN0PGludG1heF90Pih0aWQpLCBzdGF0aWNfY2FzdDxpbnRtYXhfdD4oYWN0dWFsKSk7CisgIH0KK30KKworLy8gU3RhcnRzIG9mZiBhdCAwIGluIGVhY2ggbmV3IHRocmVhZCAoYmVjYXVzZSB0aGF0J3Mgd2hhdCBpdCBnZXRzIGluaXRpYWxpemVkCisvLyB0byBpbiBtb3N0IG9mIHRoZW0gb3IgaXQgZ2V0cyB0byByZXNldCB0byAwIGFmdGVyIGEgZm9yayBieSBhdGZvcmtfY2hpbGQoKSkuCit0aHJlYWRfbG9jYWwgcGlkX3QgbXlfdGlkID0gMDsKKworLy8gR2V0cyBjYWxsZWQgYmVmb3JlIHRoZSBmb3JrKDIpIHdyYXBwZXIgZnVuY3Rpb24gcmV0dXJucyBpbiB0aGUgY2hpbGQuCit2b2lkIGF0Zm9ya19jaGlsZCgpIHsKKyAgLy8gVGhlIG5leHQgdGltZSBnZXRfdGlkKCkgaXMgY2FsbGVkLCBpdCB3aWxsIHNldCBldmVyeXRoaW5nIHVwIGFnYWluLgorICBteV90aWQgPSAwOworfQorCit2b2lkICpJbnN0YWxsQXRmb3JrSG9vaygpIHsKKyAgaWYgKHB0aHJlYWRfYXRmb3JrKE5VTEwsIE5VTEwsIGF0Zm9ya19jaGlsZCkgIT0gMCkgeworICAgIFBMT0coRkFUQUwsICJwdGhyZWFkX2F0Zm9yayhOVUxMLCBOVUxMLCAlcCkgZmFpbGVkIiwgYXRmb3JrX2NoaWxkKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gVGhpcyBnZXRzIGNhbGxlZCB0byBzZXQgZXZlcnl0aGluZyB1cCBpbiBhIG5ldyB0aHJlYWQgYnkgZ2V0X3RpZCgpLgordm9pZCBpbml0aWFsaXplX2luX25ld190aHJlYWQoKTsKKworLy8gR2V0cyB0aGUgY3VycmVudCB0aHJlYWQncyBUSUQgYW5kIGRvZXMgYWxsIG9mIHRoZSAxLXRpbWUgaW5pdGlhbGl6YXRpb24gdGhlCisvLyBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkIGluIGEgZ2l2ZW4gdGhyZWFkLgoraW5saW5lIHVpbnQzMl90IGdldF90aWQoKSB7CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0KG15X3RpZCA9PSAwLCAwKSkgeworICAgIGluaXRpYWxpemVfaW5fbmV3X3RocmVhZCgpOworICB9CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKG15X3RpZCkgPD0gc2l6ZW9mKHVpbnQzMl90KSwgInBpZF90IGlzIHRvbyBiaWciKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihteV90aWQpOworfQorCit2b2lkIGluaXRpYWxpemVfaW5fbmV3X3RocmVhZCgpIHsKKyAgLy8gTm8gc3luY2hyb25pemF0aW9uIG5lY2Vzc2FyeSBpbiBtb3N0IG9mIHRoaXMgYmVjYXVzZSBpdCdzIGFsbCB0aHJlYWQtbG9jYWwhCisKKyAgbXlfdGlkID0gZG9fZ2V0X3RpZCgpOworCisgIHN0YXRpYyA6OmFvczo6T25jZTx2b2lkPiBhdGZvcmtfaG9va19pbnN0YWxsZWQoSW5zdGFsbEF0Zm9ya0hvb2spOworICBhdGZvcmtfaG9va19pbnN0YWxsZWQuR2V0KCk7Cit9CisKKy8vIFNwbGl0IG91dCBzZXBhcmF0ZWx5IGZyb20gbXV0ZXhfZ2V0IHNvIGNvbmRpdGlvbl93YWl0IGNhbiBjYWxsIGl0IHRvby4KK2lubGluZSBpbnQgbXV0ZXhfZG9fZ2V0KGFvc19tdXRleCAqbSwgYm9vbCBzaWduYWxzX2ZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQpIHsKKyAgY29uc3QgdWludDMyX3QgdGlkID0gZ2V0X3RpZCgpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gSWYgdGhlIGF0b21pYyAwLT5USUQgdHJhbnNpdGlvbiBmYWlscy4KKyAgICBpZiAoIWNvbXBhcmVfYW5kX3N3YXAoJm0tPmZ1dGV4LCAwLCB0aWQpKSB7CisgICAgICAvLyBXYWl0IGluIHRoZSBrZXJuZWwsIHdoaWNoIGhhbmRsZXMgYXRvbWljYWxseSBPUmluZyBpbiBGVVRFWF9XQUlURVJTCisgICAgICAvLyBiZWZvcmUgYWN0dWFsbHkgc2xlZXBpbmcuCisgICAgICBjb25zdCBpbnQgcmV0ID0gc3lzX2Z1dGV4X3dhaXQoRlVURVhfTE9DS19QSSwgJm0tPmZ1dGV4LCAxLCB0aW1lb3V0KTsKKyAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBpZiAodGltZW91dCAhPSBOVUxMICYmIHJldCA9PSAtRVRJTUVET1VUKSB7CisgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QocmV0ID09IC1FSU5UUiwgMSkpIHsKKyAgICAgICAgICBpZiAoc2lnbmFsc19mYWlsKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gLUVERUFETEspIHsKKyAgICAgICAgICBMT0coRkFUQUwsICJtdWx0aXBsZSBsb2NrIG9mICVwIGJ5ICUiIFBSSWQzMiAiXG4iLCBtLCB0aWQpOworICAgICAgICB9CisgICAgICAgIFBFTE9HKEZBVEFMLCAtcmV0LCAiRlVURVhfTE9DS19QSSglcCg9JSIgUFJJdTMyICIpLCAxLCAlcCkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgJm0tPmZ1dGV4LCBfX2F0b21pY19sb2FkX24oJm0tPmZ1dGV4LCBfX0FUT01JQ19TRVFfQ1NUKSwgdGltZW91dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGUga2VybmVsIGFscmVhZHkgaGFuZGxlZCBzZXR0aW5nIHRoZSB2YWx1ZSB0byBvdXIgVElEIChpc2gpLgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gRmFzdHBhdGggc3VjY2VlZGVkLCBzbyBubyBuZWVkIHRvIGNhbGwgaW50byB0aGUga2VybmVsLgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyNpZmRlZiBBT1NfU0FOSVRJWkVSX3RocmVhZAorICAvLyBIZWxwIHRzYW4gZmlndXJlIG91dCB0aGF0IHdlJ3JlIHN5bmNocm9uaXppbmcgb24gdGhpcy4KKyAgX19zeW5jX2ZldGNoX2FuZF9hZGQoJm0tPmZ1dGV4LCAwKTsKKyNlbmRpZgorCisgIHJldHVybiAwOworfQorCisvLyBUaGUgY29tbW9uIGltcGxlbWVudGF0aW9uIGZvciBldmVyeXRoaW5nIHRoYXQgd2FudHMgdG8gbG9jayBhIG11dGV4LgorLy8gSWYgc2lnbmFsc19mYWlsIGlzIGZhbHNlLCB0aGUgZnVuY3Rpb24gd2lsbCB0cnkgYWdhaW4gaWYgdGhlIHdhaXQgc3lzY2FsbCBpcworLy8gaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisvLyB0aW1lb3V0IGNhbiBiZSBOVUxMIGZvciBubyB0aW1lb3V0LgoraW5saW5lIGludCBtdXRleF9nZXQoYW9zX211dGV4ICptLCBib29sIHNpZ25hbHNfZmFpbCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCkgeworICBnZXRfdGlkKCk7CisgIGNvbnN0IGludCByID0gbXV0ZXhfZG9fZ2V0KG0sIHNpZ25hbHNfZmFpbCwgdGltZW91dCk7CisgIHJldHVybiByOworfQorCisvLyBUaGUgY29tbW9uIGltcGxlbWVudGF0aW9uIGZvciBicm9hZGNhc3QgYW5kIHNpZ25hbC4KKy8vIG51bWJlcl9yZXF1ZXVlIGlzIHRoZSBudW1iZXIgb2Ygd2FpdGVycyB0byByZXF1ZXVlIChwcm9iYWJseSBJTlRfTUFYIG9yIDApLiAxCisvLyB3aWxsIGFsd2F5cyBiZSB3b2tlbi4KK3ZvaWQgY29uZGl0aW9uX3dha2UoYW9zX2NvbmRpdGlvbiAqYywgYW9zX211dGV4ICogLyptKi8sIGludCBudW1iZXJfcmVxdWV1ZSkgeworICAvLyBNYWtlIGl0IHNvIHRoYXQgYW55Ym9keSBqdXN0IGdvaW5nIHRvIHNsZWVwIHdvbid0LgorICAvLyBUaGlzIGlzIHdoZXJlIHdlIG1pZ2h0IGFjY2lkZW50YWxseSB3YWtlIG1vcmUgdGhhbiBqdXN0IDEgd2FpdGVyIHdpdGggMQorICAvLyBzaWduYWwoKToKKyAgLy8gICAxIGFscmVhZHkgc2xlZXBpbmcgd2lsbCBiZSB3b2tlbiBidXQgbiBtaWdodCBuZXZlciBhY3R1YWxseSBtYWtlIGl0IHRvCisgIC8vICAgICBzbGVlcCBpbiB0aGUga2VybmVsIGJlY2F1c2Ugb2YgdGhpcy4KKyAgX19hdG9taWNfYWRkX2ZldGNoKGMsIDEsIF9fQVRPTUlDX1NFUV9DU1QpOworCisgIGNvbnN0IGludCByZXQgPSBzeXNfZnV0ZXhfd2FrZSgKKyAgICAgIGMsIDo6c3RkOjptaW4oOjpzdGQ6Om1heChudW1iZXJfcmVxdWV1ZSwgMSksIElOVF9NQVggLSA0MDk2KSk7CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0KAorICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocmV0KSA+IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oLTQwOTYpLAorICAgICAgICAgIDApKSB7CisgICAgUEVMT0coRkFUQUwsIC1yZXQsICJGVVRFWF9XQUtFKCVwLCAlZCkgZmFpbGVkIiwgYywgSU5UX01BWCAtIDQwOTYpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbXV0ZXhfbG9jayhhb3NfbXV0ZXggKm0pIHsKKyAgcmV0dXJuIG11dGV4X2dldChtLCB0cnVlLCBOVUxMKTsKK30KK2ludCBtdXRleF9sb2NrX3RpbWVvdXQoYW9zX211dGV4ICptLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQpIHsKKyAgcmV0dXJuIG11dGV4X2dldChtLCB0cnVlLCB0aW1lb3V0KTsKK30KK2ludCBtdXRleF9ncmFiKGFvc19tdXRleCAqbSkgeworICByZXR1cm4gbXV0ZXhfZ2V0KG0sIGZhbHNlLCBOVUxMKTsKK30KKwordm9pZCBtdXRleF91bmxvY2soYW9zX211dGV4ICptKSB7CisgIGNvbnN0IHVpbnQzMl90IHRpZCA9IGdldF90aWQoKTsKKworICBjb25zdCB1aW50MzJfdCB2YWx1ZSA9IF9fYXRvbWljX2xvYWRfbigmbS0+ZnV0ZXgsIF9fQVRPTUlDX1NFUV9DU1QpOworICBpZiAoX19idWlsdGluX2V4cGVjdCgodmFsdWUgJiBGVVRFWF9USURfTUFTSykgIT0gdGlkLCAwKSkgeworICAgIGNoZWNrX2NhY2hlZF90aWQodGlkKTsKKyAgICBpZiAoKHZhbHVlICYgRlVURVhfVElEX01BU0spID09IDApIHsKKyAgICAgIExPRyhGQVRBTCwgIm11bHRpcGxlIHVubG9jayBvZiBhb3NfbXV0ZXggJXAgYnkgJSIgUFJJZDMyICJcbiIsIG0sIHRpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIExPRyhGQVRBTCwgImFvc19tdXRleCAlcCBpcyBsb2NrZWQgYnkgJSIgUFJJZDMyICIsIG5vdCAlIiBQUklkMzIgIlxuIiwKKyAgICAgICAgICBtLCB2YWx1ZSAmIEZVVEVYX1RJRF9NQVNLLCB0aWQpOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBhdG9taWMgVElELT4wIHRyYW5zaXRpb24gZmFpbHMgKGllIEZVVEVYX1dBSVRFUlMgaXMgc2V0KSwKKyAgaWYgKCFjb21wYXJlX2FuZF9zd2FwKCZtLT5mdXRleCwgdGlkLCAwKSkgeworICAgIC8vIFRoZSBrZXJuZWwgaGFuZGxlcyBldmVyeXRoaW5nIGVsc2UuCisgICAgY29uc3QgaW50IHJldCA9IHN5c19mdXRleF91bmxvY2tfcGkoJm0tPmZ1dGV4KTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIFBFTE9HKEZBVEFMLCAtcmV0LCAiRlVURVhfVU5MT0NLX1BJKCVwKSBmYWlsZWQiLCAmbS0+ZnV0ZXgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBUaGVyZSBhcmVuJ3QgYW55IHdhaXRlcnMsIHNvIG5vIG5lZWQgdG8gY2FsbCBpbnRvIHRoZSBrZXJuZWwuCisgIH0KK30KKworaW50IG11dGV4X3RyeWxvY2soYW9zX211dGV4ICptKSB7CisgIC8vIFRyeSBhbiBhdG9taWMgMC0+VElEIHRyYW5zaXRpb24uCisgIHVpbnQzMl90IGMgPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJm0tPmZ1dGV4LCAwLCBnZXRfdGlkKCkpOworCisgIGlmIChjICE9IDApIHsKKyAgICAvLyBTb21lYm9keSBlbHNlIGhhZCBpdCBsb2NrZWQ7IHdlIGZhaWxlZC4KKyAgICByZXR1cm4gNDsKKyAgfQorICByZXR1cm4gMDsKK30KKworYm9vbCBtdXRleF9pc2xvY2tlZChjb25zdCBhb3NfbXV0ZXggKm0pIHsKKyAgY29uc3QgdWludDMyX3QgdGlkID0gZ2V0X3RpZCgpOworCisgIGNvbnN0IHVpbnQzMl90IHZhbHVlID0gX19hdG9taWNfbG9hZF9uKCZtLT5mdXRleCwgX19BVE9NSUNfUkVMQVhFRCk7CisgIHJldHVybiAodmFsdWUgJiBGVVRFWF9USURfTUFTSykgPT0gdGlkOworfQorCitpbnQgY29uZGl0aW9uX3dhaXQoYW9zX2NvbmRpdGlvbiAqYywgYW9zX211dGV4ICptKSB7CisgIGNvbnN0IHVpbnQzMl90IHdhaXRfc3RhcnQgPSBfX2F0b21pY19sb2FkX24oYywgX19BVE9NSUNfU0VRX0NTVCk7CisKKyAgbXV0ZXhfdW5sb2NrKG0pOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gV2FpdCBpbiB0aGUga2VybmVsIGlmZiB0aGUgdmFsdWUgb2YgaXQgZG9lc24ndCBjaGFuZ2UgKGllIHNvbWVib2R5IGVsc2UKKyAgICAvLyBkb2VzIGEgd2FrZSkgZnJvbSBiZWZvcmUgd2UgdW5sb2NrZWQgdGhlIG11dGV4LgorICAgIGludCByZXQ7CisgICAgcmV0ID0gc3lzX2Z1dGV4X3dhaXQoRlVURVhfV0FJVCwgYywgd2FpdF9zdGFydCwgbnVsbHB0cik7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAvLyBJZiBpdCBmYWlsZWQgYmVjYXVzZSBzb21lYm9keSBlbHNlIGRpZCBhIHdha2UgYW5kIGNoYW5nZWQgdGhlIHZhbHVlCisgICAgICAvLyBiZWZvcmUgd2UgYWN0dWFsbHkgbWFkZSBpdCB0byBzbGVlcC4KKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KHJldCA9PSAtRUFHQUlOLCAxKSkgeworICAgICAgICAvLyBFdmVyeXRoaW5nIGlzIGp1c3Qgbm9ybWFsIGxvY2tzCisgICAgICAgIC8vIGV0Yywgc28gdGhlcmUncyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgaGVyZS4KKworICAgICAgICAvLyBXZSBoYXZlIHRvIHJlbG9jayBpdCBvdXJzZWxmIGJlY2F1c2UgdGhlIGtlcm5lbCBkaWRuJ3QgZG8gaXQuCisgICAgICAgIGNvbnN0IGludCByID0gbXV0ZXhfZG9fZ2V0KG0sIGZhbHNlLCBudWxscHRyKTsKKyAgICAgICAgYXNzZXJ0KF9fYnVpbHRpbl9leHBlY3QociA9PSAwIHx8IHIgPT0gMSwgMSkpOworICAgICAgICByZXR1cm4gcjsKKyAgICAgIH0KKyAgICAgIC8vIFRyeSBhZ2FpbiBpZiBpdCB3YXMgYmVjYXVzZSBvZiBhIHNpZ25hbC4KKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KHJldCA9PSAtRUlOVFIsIDEpKSBjb250aW51ZTsKKyAgICAgIFBFTE9HKEZBVEFMLCAtcmV0LCAiRlVURVhfV0FJVCglcCwgJSIgUFJJdTMyICIsIG51bGxwdHIpIGZhaWxlZCIsCisgICAgICAgICAgICBjLCB3YWl0X3N0YXJ0KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgaGF2ZSB0byB0YWtlIHRoZSBsb2NrIG91cnNlbGYgYmVjYXVzZSB0aGUga2VybmVsIHdvbid0LCBidXQKKyAgICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgaXQgdG8gYmUgYW55dGhpbmcgc3BlY2lhbCBiZWNhdXNlIGFsbCB3YWl0ZXJzCisgICAgICAvLyBqdXN0IHJlbG9jayBpdCBsaWtlIHVzdWFsLgorICAgICAgY29uc3QgaW50IHIgPSBtdXRleF9kb19nZXQobSwgZmFsc2UsIG51bGxwdHIpOworICAgICAgYXNzZXJ0KF9fYnVpbHRpbl9leHBlY3QociA9PSAwIHx8IHIgPT0gMSwgMSkpOworICAgICAgcmV0dXJuIHI7CisgICAgfQorICB9Cit9CisKK3ZvaWQgY29uZGl0aW9uX3NpZ25hbChhb3NfY29uZGl0aW9uICpjLCBhb3NfbXV0ZXggKm0pIHsKKyAgY29uZGl0aW9uX3dha2UoYywgbSwgMCk7Cit9CisKK3ZvaWQgY29uZGl0aW9uX2Jyb2FkY2FzdChhb3NfY29uZGl0aW9uICpjLCBhb3NfbXV0ZXggKm0pIHsKKyAgY29uZGl0aW9uX3dha2UoYywgbSwgSU5UX01BWCk7Cit9CisKK2ludCBmdXRleF93YWl0X3RpbWVvdXQoYW9zX2Z1dGV4ICptLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQpIHsKKyAgaWYgKF9fYXRvbWljX2xvYWRfbihtLCBfX0FUT01JQ19TRVFfQ1NUKSAhPSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY29uc3QgaW50IHJldCA9IHN5c19mdXRleF93YWl0KEZVVEVYX1dBSVQsIG0sIDAsIHRpbWVvdXQpOworICBpZiAocmV0ICE9IDApIHsKKyAgICBpZiAocmV0ID09IC1FSU5UUikgeworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChyZXQgPT0gLUVUSU1FRE9VVCkgeworICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlIGlmIChyZXQgIT0gLUVXT1VMREJMT0NLKSB7CisgICAgICBlcnJubyA9IC1yZXQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisjaWZkZWYgQU9TX1NBTklUSVpFUl90aHJlYWQKKyAgLy8gSGVscCB0c2FuIGZpZ3VyZSBvdXQgdGhhdCB3ZSdyZSBzeW5jaHJvbml6aW5nIG9uIHRoaXMuCisgIF9fc3luY19hZGRfYW5kX2ZldGNoKG0sIDApOworI2VuZGlmCisgIHJldHVybiAwOworfQorCitpbnQgZnV0ZXhfd2FpdChhb3NfZnV0ZXggKm0pIHsgcmV0dXJuIGZ1dGV4X3dhaXRfdGltZW91dChtLCBOVUxMKTsgfQorCitpbnQgZnV0ZXhfc2V0X3ZhbHVlKGFvc19mdXRleCAqbSwgdWludDMyX3QgdmFsdWUpIHsKKyAgX19hdG9taWNfc3RvcmVfbihtLCB2YWx1ZSwgX19BVE9NSUNfU0VRX0NTVCk7CisgIGNvbnN0IGludCByID0gc3lzX2Z1dGV4X3dha2UobSwgSU5UX01BWCAtIDQwOTYpOworICBpZiAoX19idWlsdGluX2V4cGVjdCgKKyAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHIpID4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigtNDA5NiksIDApKSB7CisgICAgZXJybm8gPSAtcjsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHI7CisgIH0KK30KKworaW50IGZ1dGV4X3NldChhb3NfZnV0ZXggKm0pIHsKKyAgcmV0dXJuIGZ1dGV4X3NldF92YWx1ZShtLCAxKTsKK30KKworaW50IGZ1dGV4X3Vuc2V0KGFvc19mdXRleCAqbSkgeworICByZXR1cm4gIV9fYXRvbWljX2V4Y2hhbmdlX24obSwgMCwgX19BVE9NSUNfU0VRX0NTVCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9pcGNfbGliL2Fvc19zeW5jLmggYi9hb3MvbGludXhfY29kZS9pcGNfbGliL2Fvc19zeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyODU1OAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2lwY19saWIvYW9zX3N5bmMuaApAQCAtMCwwICsxLDEzMSBAQAorI2lmbmRlZiBBT1NfTElOVVhfQ09ERV9JUENfTElCX1NZTkNfSF8KKyNkZWZpbmUgQU9TX0xJTlVYX0NPREVfSVBDX0xJQl9TWU5DX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKKworLy8gVE9ETyhicmlhbnMpIGFkZCBjbGllbnQgcmVxdWVzdHMgdG8gbWFrZSBoZWxncmluZCB1c2VmdWwgd2l0aCB0aGlzIGNvZGUKKy8vIDxodHRwOi8vd3d3LnZhbGdyaW5kLm9yZy9kb2NzL21hbnVhbC9oZy1tYW51YWwuaHRtbCNoZy1tYW51YWwuY2xpZW50LXJlcXVlc3RzPgorLy8gYW5kIDxodHRwOi8vd3d3LnZhbGdyaW5kLm9yZy9kb2NzL21hbnVhbC9kcmQtbWFudWFsLmh0bWwjZHJkLW1hbnVhbC5jbGllbnRyZXFzPgorLy8gbGlzdCB0aGUgaW50ZXJlc3Rpbmcgb25lcworCisvLyBIYXZlIHRvIHJlbWVtYmVyIHRvIGFsaWduIHN0cnVjdHMgY29udGFpbmluZyBpdCAocmVjdXJzaXZlbHkpIHRvIHNpemVvZihpbnQpLgorLy8gVmFsaWQgaW5pdGlhbCB2YWx1ZXMgZm9yIHVzZSB3aXRoIGZ1dGV4XyBmdW5jdGlvbnMgYXJlIDAgKHVuc2V0KSBhbmQgMSAoc2V0KS4KKy8vIFRoZSB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQgYWZ0ZXIgbXVsdGlwbGUgcHJvY2Vzc2VzIGhhdmUgc3RhcnRlZAorLy8gYWNjZXNzaW5nIGFuIGluc3RhbmNlIGV4Y2VwdCB0aHJvdWdoIHRoZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLgordHlwZWRlZiB1aW50MzJfdCBhb3NfZnV0ZXggX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YoaW50KSkpKTsKKworLy8gRm9yIHVzZSB3aXRoIHRoZSBjb25kaXRpb25fIGZ1bmN0aW9ucy4KKy8vIE5vIGluaXRpYWxpemF0aW9uIGlzIG5lY2Vzc2FyeS4KK3R5cGVkZWYgYW9zX2Z1dGV4IGFvc19jb25kaXRpb247CisKKy8vIEZvciB1c2Ugd2l0aCB0aGUgbXV0ZXhfIGZ1bmN0aW9ucy4KKy8vIGZ1dGV4IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gMC4KKy8vIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gaW5pdGlhbGl6ZSBvbmUgb2YgdGhlc2UgaXMgYnkgbWVtc2V0KDMpaW5nIHRoZSB3aG9sZQorLy8gdGhpbmcgdG8gMCBvciB1c2luZyBDKysgKCkgaW5pdGlhbGl6YXRpb24gdG8gYXZvaWQgZGVwZW5kaW5nIG9uIHRoZQorLy8gaW1wbGVtZW50YXRpb24uCitzdHJ1Y3QgYW9zX211dGV4IHsKKyAgYW9zX2Z1dGV4IGZ1dGV4OworfTsKKworLy8gVGhlIG11dGV4XyBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgbXV0ZXhlcy4gQSBtdXRleCBjYW4gb25seSBiZQorLy8gdW5sb2NrZWQgZnJvbSB0aGUgc2FtZSB0YXNrIHdoaWNoIG9yaWdpbmFsbHkgbG9ja2VkIGl0LgorCisvLyBBbGwgb2YgdGhlc2UgcmV0dXJuIDIgaWYKKy8vIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLCAzIGlmIHRpbWVkIG91dCwgb3IgNCBpZiBhbiBvcHRpb25hbCBsb2NrIGZhaWxzLiBTb21lCisvLyBvZiB0aGVtIChvYnZpb3VzbHkpIGNhbiBuZXZlciByZXR1cm4gc29tZSBvZiB0aG9zZSB2YWx1ZXMuCisvLworLy8gT25lIG9mIHRoZSBoaWdoZXN0IHByaW9yaXR5IHByb2Nlc3NlcyBibG9ja2VkIG9uIGEgZ2l2ZW4gbXV0ZXggd2lsbCBiZSB0aGUKKy8vIG9uZSB0byBsb2NrIGl0IHdoZW4gaXQgaXMgdW5sb2NrZWQuCitpbnQgbXV0ZXhfbG9jayhzdHJ1Y3QgYW9zX211dGV4ICptKSBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKKy8vIFJldHVybnMgMiBpZiBpdCB0aW1lZCBvdXQgb3IgMSBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KK2ludCBtdXRleF9sb2NrX3RpbWVvdXQoc3RydWN0IGFvc19tdXRleCAqbSwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0KQorICAgIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworLy8gSWdub3JlcyBzaWduYWxzIChyZXRyaWVzIHVudGlsIHNvbWV0aGluZyBvdGhlciB0aGFuIGdldHRpbmcgYSBzaWduYWwKKy8vIGhhcHBlbnMpLgoraW50IG11dGV4X2dyYWIoc3RydWN0IGFvc19tdXRleCAqbSkgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSk7CisvLyBMT0coRkFUQUwpcyBmb3IgbXVsdGlwbGUgdW5sb2NraW5nLgordm9pZCBtdXRleF91bmxvY2soc3RydWN0IGFvc19tdXRleCAqbSk7CisvLyBEb2VzIG5vdCBibG9jayB3YWl0aW5nIGZvciB0aGUgbXV0ZXguCitpbnQgbXV0ZXhfdHJ5bG9jayhzdHJ1Y3QgYW9zX211dGV4ICptKSBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbXV0ZXggaXMgbG9ja2VkIGJ5IHRoaXMgdGhyZWFkLgorLy8gVGhlcmUgYXJlbid0IHZlcnkgbWFueSB2YWxpZCB1c2VzIGZvciB0aGlzIGZ1bmN0aW9uOyB0aGUgbWFpbiBvbmVzIGFyZQorLy8gY2hlY2tpbmcgbXV0ZXhlcyBhcyB0aGV5IGFyZSBkZXN0cm95ZWQgdG8gY2F0Y2ggcHJvYmxlbXMgd2l0aCB0aGF0IGVhcmx5IGFuZAorLy8gc3RhY2stYmFzZWQgcmVjdXJzaXZlIG11dGV4IGxvY2tpbmcuCitib29sIG11dGV4X2lzbG9ja2VkKGNvbnN0IGFvc19tdXRleCAqbSk7CisjZW5kaWYKKworLy8gVGhlIGZ1dGV4XyBmdW5jdGlvbnMgYXJlIHNpbWlsYXIgdG8gdGhlIG11dGV4XyBvbmVzIGJ1dCBkaWZmZXJlbnQuCisvLyBUaGV5IGFyZSBkZXNpZ25lZCBmb3Igc2lnbmFsbGluZyB3aGVuIHNvbWV0aGluZyBoYXBwZW5zIChwb3NzaWJseSB0bworLy8gbXVsdGlwbGUgbGlzdGVuZXJzKS4gQSBhb3NfZnV0ZXggbWFuaXB1bGF0ZWQgd2l0aCB0aGVtIGNhbiBvbmx5IGJlIHNldCBvcgorLy8gdW5zZXQuIEFsc28sIHRoZXkgY2FuIGJlIHNldC91bnNldC93YWl0ZWQgb24gZnJvbSBhbnkgdGFzayBpbmRlcGVuZGVudGx5IG9mCisvLyB3aG8gZGlkIHNvbWV0aGluZyBmaXJzdCBhbmQgaGF2ZSBubyBwcmlvcml0eSBpbnZlcnNpb24gcHJvdGVjdGlvbi4KKy8vIFRoZXkgcmV0dXJuIC0xIGZvciBvdGhlciBlcnJvciAod2hpY2ggd2lsbCBiZSBpbiBlcnJubyBmcm9tIGZ1dGV4KDIpKS4KKy8vIFRoZXkgaGF2ZSBubyBzcHVyaW91cyB3YWtldXBzIChiZWNhdXNlIGV2ZXJ5Ym9keSBhbHdheXMgZ2V0cyB3b2tlbiB1cCkuCisvLworLy8gQW5vdGhlciBuYW1lIGZvciB0aGlzIGtpbmQgb2Ygc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbSBpcyBhICJub3RpZmljYXRpb24iLgorLy8gUHl0aG9uIGNhbGxzIGl0IGFuICJldmVudCIuCisvLworLy8gVGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGNvbmRpdGlvbl8gZnVuY3Rpb25zIGluIHRoYXQgdGhleSBkbyBOT1Qgd29yaworLy8gY29ycmVjdGx5IGFzIHN0YW5kYXJkIGNvbmRpdGlvbiB2YXJpYWJsZXMuIFdoaWxlIGl0IGlzIHBvc3NpYmxlIHRvIGtlZXAKKy8vIHRyYWNrIG9mIHRoZSAiY29uZGl0aW9uIiB1c2luZyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgZnV0ZXhfKiBmdW5jdGlvbnMsIHRoZQorLy8gb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBoYXMgYmFzaWNhbGx5IHRoZSBzYW1lIHJhY2UgY29uZGl0aW9uIHRoYXQgY29uZGl0aW9uCisvLyB2YXJpYWJsZXMgYXJlIGRlc2lnbmVkIHRvIHByZXZlbnQgYmV0d2VlbiBzb21lYm9keSBlbHNlIGdyYWJiaW5nIHRoZSBtdXRleAorLy8gYW5kIGNoYW5naW5nIHdoZXRoZXIgaXQncyBzZXQgb3Igbm90IGFuZCB0aGUgZnV0ZXhfIGZ1bmN0aW9uIGNoYW5naW5nIHRoZQorLy8gZnV0ZXgncyB2YWx1ZS4gQSBmdXRleCBpcyBlZmZlY3RpdmVseSBhIHJlc2V0dGFibGUgY29uZGl0aW9uIHZhcmlhYmxlIHdpdGgKKy8vIHRoZSBjb25kaXRpb24gYmVpbmcgImhhcyBpdCBiZWVuIHNldCI7IGlmIHlvdSBoYXZlIHNvbWUgb3RoZXIgY29uZGl0aW9uIChmb3IKKy8vIGV4YW1wbGUgbWVzc2FnZXMgYXJlIGF2YWlsYWJsZSB0byByZWFkIG9uIGEgcXVldWUpLCB1c2UgdGhlIGNvbmRpdGlvbl8KKy8vIGZ1bmN0aW9ucyBvciB0aGVyZSB3aWxsIGJlIHJhY2UgY29uZGl0aW9ucy4KKworLy8gV2FpdCBmb3IgdGhlIGZ1dGV4IHRvIGJlIHNldC4gV2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgaXQncyBhbHJlYWR5IHNldC4KKy8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsIG9yIGl0IHdhcyBhbHJlYWR5IHNldCwgMSBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCwKKy8vIG9yIC0xIHdpdGggYW4gZXJyb3IgaW4gZXJybm8uCitpbnQgZnV0ZXhfd2FpdChhb3NfZnV0ZXggKm0pIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworLy8gVGhlIHNhbWUgYXMgZnV0ZXhfd2FpdCBleGNlcHQgcmV0dXJucyAyIGlmIGl0IHRpbWVzIG91dC4KK2ludCBmdXRleF93YWl0X3RpbWVvdXQoYW9zX2Z1dGV4ICptLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQpCisgIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOworCisvLyBTZXQgdGhlIGZ1dGV4IGFuZCB3YWtlIHVwIGFueWJvZHkgd2FpdGluZyBvbiBpdC4KKy8vIFJldHVybnMgdGhlIG51bWJlciB0aGF0IHdlcmUgd29rZW4gb3IgLTEgd2l0aCBhbiBlcnJvciBpbiBlcnJuby4KKy8vCisvLyBUaGlzIHdpbGwgYWx3YXlzIHdha2UgdXAgYWxsIHdhaXRlcnMgYXQgdGhlIHNhbWUgdGltZSBhbmQgc2V0IHRoZSB2YWx1ZSB0byAxLgoraW50IGZ1dGV4X3NldChhb3NfZnV0ZXggKm0pOworLy8gU2FtZSBhcyBhYm92ZSBleGNlcHQgbGV0cyBzb21ldGhpbmcgb3RoZXIgdGhhbiAxIGJlIHVzZWQgYXMgdGhlIGZpbmFsIHZhbHVlLgoraW50IGZ1dGV4X3NldF92YWx1ZShhb3NfZnV0ZXggKm0sIGFvc19mdXRleCB2YWx1ZSk7CisvLyBVbnNldHMgdGhlIGZ1dGV4IChzZXRzIHRoZSB2YWx1ZSB0byAwKS4KKy8vIFJldHVybnMgMCBpZiBpdCB3YXMgc2V0IGJlZm9yZSBhbmQgMSBpZiBpdCB3YXNuJ3QuCisvLyBDYW4gbm90IGZhaWwuCitpbnQgZnV0ZXhfdW5zZXQoYW9zX2Z1dGV4ICptKTsKKworLy8gVGhlIGNvbmRpdGlvbl8gZnVuY3Rpb25zIGltcGxlbWVudCBjb25kaXRpb24gdmFyaWFibGUgc3VwcG9ydC4gVGhlIEFQSSBpcworLy8gc2ltaWxhciB0byB0aGUgcHRocmVhZHMgYXBpIGFuZCB3b3JrcyB0aGUgc2FtZSB3YXkuIFRoZSBzYW1lIG0gYXJndW1lbnQgbXVzdAorLy8gYmUgcGFzc2VkIGluIGZvciBhbGwgY2FsbHMgdG8gYWxsIG9mIHRoZSBjb25kaXRpb25fIGZ1bmN0aW9ucyB3aXRoIGEgZ2l2ZW4gYy4KKy8vIFRoZXkgZG8gaGF2ZSB0aGUgcG90ZW50aWFsIGZvciBzcHVyaW91cyB3YWtldXBzLgorCisvLyBXYWl0IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHRvIGJlIHNpZ25hbGxlZC4gbSB3aWxsIGJlIHVubG9ja2VkCisvLyBhdG9taWNhbGx5IHdpdGggYWN0dWFsbHkgc3RhcnRpbmcgdG8gd2FpdC4gbSBpcyBndWFyYW50ZWVkIHRvIGJlIGxvY2tlZCB3aGVuCisvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisvLyBOT1RFOiBUaGUgcmVsb2NraW5nIG9mIG0gaXMgbm90IGF0b21pYyB3aXRoIHN0b3BwaW5nIHRoZSBhY3R1YWwgd2FpdCBhbmQKKy8vIG90aGVyIHByb2Nlc3MoZXMpIG1heSBsb2NrICgrdW5sb2NrKSB0aGUgbXV0ZXggZmlyc3QuCisvLyBSZXR1cm5zIDAuCitpbnQgY29uZGl0aW9uX3dhaXQoYW9zX2NvbmRpdGlvbiAqYywgc3RydWN0IGFvc19tdXRleCAqbSkKKyAgICBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKKy8vIElmIGFueSBvdGhlciBwcm9jZXNzZXMgYXJlIGNvbmRpdGlvbl93YWl0aW5nIG9uIGMsIHdha2UgMSBvZiB0aGVtLiBEb2VzIG5vdAorLy8gcmVxdWlyZSBtIHRvIGJlIGxvY2tlZC4KKy8vIE5PVEU6IFRoZXJlIGlzIGEgc21hbGwgY2hhbmNlIHRoYXQgdGhpcyB3aWxsIHdha2UgbW9yZSB0aGFuIGp1c3QgMSB3YWl0ZXIuCit2b2lkIGNvbmRpdGlvbl9zaWduYWwoYW9zX2NvbmRpdGlvbiAqYywgc3RydWN0IGFvc19tdXRleCAqbSk7CisvLyBXYWtlcyBhbGwgcHJvY2Vzc2VzIHRoYXQgYXJlIGNvbmRpdGlvbl93YWl0aW5nIG9uIGMuIERvZXMgbm90IHJlcXVpcmUgbSB0byBiZQorLy8gbG9ja2VkLgordm9pZCBjb25kaXRpb25fYnJvYWRjYXN0KGFvc19jb25kaXRpb24gKmMsIHN0cnVjdCBhb3NfbXV0ZXggKm0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmICAvLyBBT1NfTElOVVhfQ09ERV9JUENfTElCX1NZTkNfSF8KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2lwY19saWIvY29uZGl0aW9uLmNjIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9jb25kaXRpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlZGUxYwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2lwY19saWIvY29uZGl0aW9uLmNjCkBAIC0wLDAgKzEsMzAgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbmRpdGlvbi5oIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL211dGV4LmgiCisKK25hbWVzcGFjZSBhb3MgeworCitzdGF0aWNfYXNzZXJ0KHNobV9vazxDb25kaXRpb24+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIkNvbmRpdGlvbiBzaG91bGQgd29yayBpbiBzaGFyZWQgbWVtb3J5Iik7CisKK0NvbmRpdGlvbjo6Q29uZGl0aW9uKE11dGV4ICptKSA6IGltcGxfKCksIG1fKG0pIHt9CisKK2Jvb2wgQ29uZGl0aW9uOjpXYWl0KCkgeworICBjb25zdCBpbnQgcmV0ID0gY29uZGl0aW9uX3dhaXQoJmltcGxfLCAmbV8tPmltcGxfKTsKKyAgYXNzZXJ0KF9fYnVpbHRpbl9leHBlY3QocmV0ID09IDAgfHwgcmV0ID09IDEsIDEpKTsKKyAgcmV0dXJuIHJldCA9PSAxOworfQorCit2b2lkIENvbmRpdGlvbjo6U2lnbmFsKCkgeworICBjb25kaXRpb25fc2lnbmFsKCZpbXBsXywgJm1fLT5pbXBsXyk7Cit9CisKK3ZvaWQgQ29uZGl0aW9uOjpCcm9hZGNhc3QoKSB7CisgIGNvbmRpdGlvbl9icm9hZGNhc3QoJmltcGxfLCAmbV8tPmltcGxfKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9jb3JlX2xpYi5jIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9jb3JlX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDE4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9pcGNfbGliL2NvcmVfbGliLmMKQEAgLTAsMCArMSw0NiBAQAorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvY29yZV9saWIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL3NoYXJlZF9tZW0uaCIKKworc3RhdGljIHVpbnQ4X3QgYW9zXzhtYXgodWludDhfdCBsLCB1aW50OF90IHIpIHsKKyAgcmV0dXJuIChsID4gcikgPyBsIDogcjsKK30KK3ZvaWQgKnNobV9tYWxsb2NfYWxpZ25lZChzaXplX3QgbGVuZ3RoLCB1aW50OF90IGFsaWdubWVudCkgeworICAvLyBtaW5pbXVtIGFsaWdubWVudHMgZnJvbQorICAvLyA8aHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9kYXRhLWFsaWdubWVudC13aGVuLW1pZ3JhdGluZy10by02NC1iaXQtaW50ZWwtYXJjaGl0ZWN0dXJlLz4KKyAgaWYgKGxlbmd0aCA8PSAxKSB7CisgICAgYWxpZ25tZW50ID0gYW9zXzhtYXgoYWxpZ25tZW50LCAxKTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPD0gMikgeworICAgIGFsaWdubWVudCA9IGFvc184bWF4KGFsaWdubWVudCwgMik7CisgIH0gZWxzZSBpZiAobGVuZ3RoIDw9IDQpIHsKKyAgICBhbGlnbm1lbnQgPSBhb3NfOG1heChhbGlnbm1lbnQsIDQpOworICB9IGVsc2UgaWYgKGxlbmd0aCA8PSA4KSB7CisgICAgYWxpZ25tZW50ID0gYW9zXzhtYXgoYWxpZ25tZW50LCA4KTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPD0gMTYpIHsKKyAgICBhbGlnbm1lbnQgPSBhb3NfOG1heChhbGlnbm1lbnQsIDE2KTsKKyAgfSBlbHNlIHsKKyAgICBhbGlnbm1lbnQgPSBhb3NfOG1heChhbGlnbm1lbnQsIChsZW5ndGggPj0gNjQpID8gNjQgOiAxNik7CisgIH0KKworICB2b2lkICptc2cgPSBOVUxMOworICBhb3Nfc2htX2NvcmUgKnNobV9jb3JlID0gZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3Q7CisgIGludCByZXN1bHQgPSBtdXRleF9ncmFiKCZzaG1fY29yZS0+bXNnX2FsbG9jX2xvY2spOworICBhc3NlcnQocmVzdWx0ID09IDApOworICBzaG1fY29yZS0+bXNnX2FsbG9jID0gKHVpbnQ4X3QgKilzaG1fY29yZS0+bXNnX2FsbG9jIC0gbGVuZ3RoOworICBjb25zdCB1aW50OF90IGFsaWduX2V4dHJhID0gKHVpbnRwdHJfdClzaG1fY29yZS0+bXNnX2FsbG9jICUgYWxpZ25tZW50OworICBzaG1fY29yZS0+bXNnX2FsbG9jID0gKHVpbnQ4X3QgKilzaG1fY29yZS0+bXNnX2FsbG9jIC0gYWxpZ25fZXh0cmE7CisgIG1zZyA9IHNobV9jb3JlLT5tc2dfYWxsb2M7CisgIGlmIChtc2cgPD0gZ2xvYmFsX2NvcmUtPnNoYXJlZF9tZW0pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNvcmVfbGliOiBSQU4gT1VUIE9GIFNIQVJFRCBNRU1PUlkhISEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBwcmludGYoImlmIHlvdSBkaWRuJ3Qgc2VlIHRoZSBzdGRlcnIgb3V0cHV0IGp1c3QgdGhlbiwgeW91IHNob3VsZCBoYXZlXG4iKTsKKyAgICBhYm9ydCgpOworICB9CisgIC8vcHJpbnRmKCJhbGxvYyAlcFxuIiwgbXNnKTsKKyAgbXV0ZXhfdW5sb2NrKCZzaG1fY29yZS0+bXNnX2FsbG9jX2xvY2spOworICByZXR1cm4gbXNnOworfQorCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9pcGNfbGliL2NvcmVfbGliLmggYi9hb3MvbGludXhfY29kZS9pcGNfbGliL2NvcmVfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4MWMzYwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2lwY19saWIvY29yZV9saWIuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9BT1NfQ09SRV9MSUJfSF8KKyNkZWZpbmUgX0FPU19DT1JFX0xJQl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL2Fvc19zeW5jLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKy8vIGFsbG9jX3NpemUgd2FzIHRha2VuIG91dCBvZiBjbGFuZyBpbiByMTk3ODY2LiBJdCBhcHBlYXJzIHRoYXQgaXQgbmV2ZXIKKy8vIGFjdHVhbGx5IGRpZCBhbnl0aGluZy4KKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgYXR0cmlidXRlX2FsbG9jX3NpemUobikKKyNlbHNlCisjZGVmaW5lIGF0dHJpYnV0ZV9hbGxvY19zaXplKG4pIF9fYXR0cmlidXRlX18oKGFsbG9jX3NpemUobikpKQorI2VuZGlmCisKK3ZvaWQgKnNobV9tYWxsb2NfYWxpZ25lZChzaXplX3QgbGVuZ3RoLCB1aW50OF90IGFsaWdubWVudCkKKyAgICBhdHRyaWJ1dGVfYWxsb2Nfc2l6ZSgxKTsKK3N0YXRpYyB2b2lkICpzaG1fbWFsbG9jKHNpemVfdCBsZW5ndGgpIGF0dHJpYnV0ZV9hbGxvY19zaXplKDEpOworc3RhdGljIGlubGluZSB2b2lkICpzaG1fbWFsbG9jKHNpemVfdCBsZW5ndGgpIHsKKyAgcmV0dXJuIHNobV9tYWxsb2NfYWxpZ25lZChsZW5ndGgsIDApOworfQorCisjdW5kZWYgYXR0cmlidXRlX2FsbG9jX3NpemUKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9ldmVudC5jYyBiL2Fvcy9saW51eF9jb2RlL2lwY19saWIvZXZlbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1YjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2lwY19saWIvZXZlbnQuY2MKQEAgLTAsMCArMSwzNSBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vZXZlbnQuaCIKKworI2luY2x1ZGUgImFvcy9jb21tb24vdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgYW9zIHsKKworRXZlbnQ6OkV2ZW50KCkgOiBpbXBsXygwKSB7CisgIHN0YXRpY19hc3NlcnQoc2htX29rPEV2ZW50Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIkV2ZW50IGlzIG5vdCBzYWZlIGZvciB1c2UgaW4gc2hhcmVkIG1lbW9yeS4iKTsKK30KKwordm9pZCBFdmVudDo6V2FpdCgpIHsKKyAgaW50IHJldDsKKyAgZG8geworICAgIHJldCA9IGZ1dGV4X3dhaXQoJmltcGxfKTsKKyAgfSB3aGlsZSAocmV0ID09IDEpOworICBpZiAocmV0ID09IDApIHJldHVybjsKKyAgQ0hFQ0tfRVEoLTEsIHJldCk7CisgIFBMT0coRkFUQUwsICJmdXRleF93YWl0KCVwKSBmYWlsZWQiLCAmaW1wbF8pOworfQorCisvLyBXZSdyZSBub3QgZ29pbmcgdG8gZXhwb3NlIHRoZSBudW1iZXIgd29rZW4gYmVjYXVzZSB0aGF0J3Mgbm90IGVhc2lseSBwb3J0YWJsZQorLy8gdG8gY29uZGl0aW9uIHZhcmlhYmxlLWJhc2VkIGltcGxlbWVudGF0aW9ucy4KK3ZvaWQgRXZlbnQ6OlNldCgpIHsKKyAgaWYgKGZ1dGV4X3NldCgmaW1wbF8pID09IC0xKSB7CisgICAgUExPRyhGQVRBTCwgImZ1dGV4X3NldCglcCkgZmFpbGVkIiwgJmltcGxfKTsKKyAgfQorfQorCitib29sIEV2ZW50OjpDbGVhcigpIHsKKyAgcmV0dXJuICFmdXRleF91bnNldCgmaW1wbF8pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRhOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cApAQCAtMCwwICsxLDExMSBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYW9zX3N5bmMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhb3Nfc3luYy5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmdfaW50ZXJmYWNlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpvbmNlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY29yZV9saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjb3JlX2xpYi5jJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnYW9zX3N5bmMnLAorICAgICAgICAnc2hhcmVkX21lbScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICdhb3Nfc3luYycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3NoYXJlZF9tZW0nLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzaGFyZWRfbWVtLmMnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdhb3Nfc3luYycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICdhb3Nfc3luYycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAncXVldWUuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6Y29uZGl0aW9uJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDptdXRleCcsCisgICAgICAgICdjb3JlX2xpYicsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Jhd19xdWV1ZV90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdyYXdfcXVldWVfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdxdWV1ZScsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJ2NvcmVfbGliJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90ZXN0dXRpbHMnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOmRpZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dGhyZWFkJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpkZWF0aF90ZXN0X2xvZ19pbXBsZW1lbnRhdGlvbicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2lwY19zdHJlc3NfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnaXBjX3N0cmVzc190ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90ZXN0dXRpbHMnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOm11dGV4JywKKyAgICAgICAgJ2NvcmVfbGliJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpkaWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9saWJjL2xpYmMuZ3lwOmRpcm5hbWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9saWJjL2xpYmMuZ3lwOmFvc19zdHJzaWduYWwnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2lzX3NwZWNpYWxfdGVzdCc6IDEsCisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Njb3BlZF9tZXNzYWdlX3B0cicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgIydzY29wZWRfbWVzc2FnZV9wdHIuaCcsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJ3F1ZXVlJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2lwY19saWIvaXBjX3N0cmVzc190ZXN0LmNjIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfc3RyZXNzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZDIyNgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2lwY19saWIvaXBjX3N0cmVzc190ZXN0LmNjCkBAIC0wLDAgKzEsMjUzIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL211dGV4LmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9jb3JlX2xpYi5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9saWJjL2Rpcm5hbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xpYmMvYW9zX3N0cnNpZ25hbC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKKy8vIFRoaXMgcnVucyBhbGwgb2YgdGhlIElQQy1yZWxhdGVkIHRlc3RzIGluIGEgYnVuY2ggb2YgcGFyYWxsZWwgcHJvY2Vzc2VzIGZvciBhCisvLyB3aGlsZSBhbmQgbWFrZXMgc3VyZSB0aGF0IHRoZXkgZG9uJ3QgZmFpbC4gSXQgYWxzbyBjYXB0dXJlcyB0aGUgc3Rkb3V0IGFuZAorLy8gc3RkZXJyIG91dHB1dCBmcm9tIGVhY2ggdGVzdCBydW4gYW5kIG9ubHkgcHJpbnRzIGl0IG91dCAobm90IGludGVybGVhdmVkIHdpdGgKKy8vIHRoZSBvdXRwdXQgZnJvbSBhbnkgb3RoZXIgcnVuKSBpZiB0aGUgdGVzdCBmYWlscy4KKy8vCisvLyBUaGV5IGhhdmUgdG8gYmUgcnVuIGluIHNlcGFyYXRlIHByb2Nlc3NlcyBiZWNhdXNlIChpbiBhZGRpdGlvbiB0byB2YXJpb3VzCisvLyBwYXJ0cyBvZiBvdXIgY29kZSBub3QgYmVpbmcgdGhyZWFkLXNhZmUuLi4pIGd0ZXN0IGRvZXMgbm90IGxpa2UgbXVsdGlwbGUKKy8vIHRocmVhZHMuCisvLworLy8gSXQncyB3cml0dGVuIGluIEMrKyBmb3IgcGVyZm9ybWFuY2UuIFdlIG5lZWQgYWN0dWFsIE9TLWxldmVsIHBhcmFsbGVsaXNtIGZvcgorLy8gdGhpcyB0byB3b3JrLCB3aGljaCBtZWFucyB0aGF0IFJ1YnkncyBvdXQgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgZ29vZAorLy8gc3VwcG9ydCBmb3IgZG9pbmcgdGhhdC4gTXkgUHl0aG9uIGltcGxlbWVudGF0aW9uIGVuZGVkIHVwIHByZXR0eSBoZWF2aWx5IGRpc2sKKy8vIElPLWJvdW5kLCB3aGljaCBpcyBhIGJhZCB3YXkgdG8gdGVzdCBDUFUgY29udGVudGlvbi4KKworbmFtZXNwYWNlIGFvcyB7CisKKy8vIEVhY2ggdGVzdCBpcyByZXByZXNlbnRlZCBieSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBiaW5hcnkgYW5kIHRoZW4gYW55CisvLyBhcmd1bWVudHMgdG8gcGFzcyB0byBpdC4KKy8vIFVzaW5nIC0tZ3Rlc3RfZmlsdGVyIGlzIGEgYmFkIGlkZWEgYmVjYXVzZSBpdCBzZWVtcyB0byByZXN1bHQgaW4gYSBsb3Qgb2YKKy8vIHN3YXBwaW5nIHdoaWNoIGNhdXNlcyBldmVyeXRoaW5nIHRvIGJlIGRpc2stYm91bmQgKGF0IGxlYXN0IGZvciBtZSkuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0TWF4QXJncyA9IDEwOworc3RhdGljIGNvbnN0IGNoYXIgKiBrVGVzdHNbXVtrVGVzdE1heEFyZ3NdID0geworICB7InF1ZXVlX3Rlc3QifSwKKyAgeyJjb25kaXRpb25fdGVzdCJ9LAorICB7Im11dGV4X3Rlc3QifSwKKyAgeyJyYXdfcXVldWVfdGVzdCJ9LAorfTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RzTGVuZ3RoID0gc2l6ZW9mKGtUZXN0cykgLyBzaXplb2Yoa1Rlc3RzWzBdKTsKKy8vIFRoZXNlIGFyZ3VtZW50cyBnZXQgaW5zZXJ0ZWQgYmVmb3JlIGFueSBwZXItdGVzdCBhcmd1bWVudHMuCitzdGF0aWMgY29uc3QgY2hhciAqa0RlZmF1bHRBcmdzW10gPSB7CisgICItLWd0ZXN0X3JlcGVhdD0zMCIsCisgICItLWd0ZXN0X3NodWZmbGUiLAorfTsKKworLy8gSG93IG1hbnkgdGVzdCBwcm9jZXNzZXMgdG8gcnVuIGF0IGEgdGltZS4KK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RlcnMgPSAxMDA7CisvLyBIb3cgbG9uZyB0byB0ZXN0IGZvci4KK3N0YXRpYyBjb25zdGV4cHIgdGltZTo6VGltZSBrVGVzdFRpbWUgPSB0aW1lOjpUaW1lOjpJblNlY29uZHMoMzApOworCisvLyBUaGUgc3RydWN0dXJlIHRoYXQgZ2V0cyBwdXQgaW50byBzaGFyZWQgbWVtb3J5IGFuZCB0aGVuIHJlZmVyZW5jZWQgYnkgYWxsIG9mCisvLyB0aGUgY2hpbGQgcHJvY2Vzc2VzLgorc3RydWN0IFNoYXJlZCB7CisgIFNoYXJlZChjb25zdCB0aW1lOjpUaW1lICZzdG9wX3RpbWUpCisgICAgOiBzdG9wX3RpbWUoc3RvcF90aW1lKSwgdG90YWxfaXRlcmF0aW9ucygwKSB7fQorCisgIC8vIFN5bmNocm9uaXplcyBhY2Nlc3MgdG8gc3Rkb3V0L3N0ZGVyciB0byBhdm9pZCBpbnRlcmxlYXZpbmcgZmFpbHVyZQorICAvLyBtZXNzYWdlcy4KKyAgTXV0ZXggb3V0cHV0X211dGV4OworCisgIC8vIFdoZW4gdG8gc3RvcC4KKyAgdGltZTo6VGltZSBzdG9wX3RpbWU7CisKKyAgLy8gVGhlIHRvdGFsIG51bWJlciBvZiBpdGVyYXRpb25zLiBVcGRhdGVkIGJ5IGVhY2ggY2hpbGQgYXMgaXQgZmluaXNoZXMuCisgIGludCB0b3RhbF9pdGVyYXRpb25zOworICAvLyBTeWNocm9uaXplcyB3cml0ZXMgdG8gdG90YWxfaXRlcmF0aW9ucworICBNdXRleCB0b3RhbF9pdGVyYXRpb25zX211dGV4OworCisgIGNvbnN0IGNoYXIgKnBhdGg7Cit9Oworc3RhdGljX2Fzc2VydChzaG1fb2s8U2hhcmVkPjo6dmFsdWUsCisgICAgICAgICAgICAgICJpdCdzIGdvaW5nIHRvIGdldCBzaGFyZWQgYmV0d2VlbiBmb3JrZWQgcHJvY2Vzc2VzIik7CisKKy8vIEdldHMgY2FsbGVkIGFmdGVyIGVhY2ggY2hpbGQgZm9ya3MgdG8gcnVuIGEgdGVzdC4KK3ZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSBEb1J1blRlc3QoCisgICAgU2hhcmVkICpzaGFyZWQsIGNvbnN0IGNoYXIgKigqdGVzdClba1Rlc3RNYXhBcmdzXSwgaW50IHBpcGVzWzJdKSB7CisgIGlmIChjbG9zZShwaXBlc1swXSkgPT0gLTEpIHsKKyAgICBQRGllKCJjbG9zZSglZCkgb2YgcmVhZCBlbmQgb2YgcGlwZSBmYWlsZWQiLCBwaXBlc1swXSk7CisgIH0KKyAgaWYgKGNsb3NlKFNURElOX0ZJTEVOTykgPT0gLTEpIHsKKyAgICBQRGllKCJjbG9zZShTVERJTl9GSUxFTk8oPSVkKSkgZmFpbGVkIiwgU1RESU5fRklMRU5PKTsKKyAgfQorICBpZiAoZHVwMihwaXBlc1sxXSwgU1RET1VUX0ZJTEVOTykgPT0gLTEpIHsKKyAgICBQRGllKCJkdXAyKCVkLCBTVERPVVRfRklMRU5PKD0lZCkpIGZhaWxlZCIsIHBpcGVzWzFdLCBTVERPVVRfRklMRU5PKTsKKyAgfQorICBpZiAoZHVwMihwaXBlc1sxXSwgU1RERVJSX0ZJTEVOTykgPT0gLTEpIHsKKyAgICBQRGllKCJkdXAyKCVkLCBTVERFUlJfRklMRU5PKD0lZCkpIGZhaWxlZCIsIHBpcGVzWzFdLCBTVERFUlJfRklMRU5PKTsKKyAgfQorCisgIHNpemVfdCBzaXplID0ga1Rlc3RNYXhBcmdzOworICBzaXplX3QgZGVmYXVsdF9zaXplID0gc2l6ZW9mKGtEZWZhdWx0QXJncykgLyBzaXplb2Yoa0RlZmF1bHRBcmdzWzBdKTsKKyAgLy8gVGhlcmUncyBubyBjaGFuY2UgdG8gZnJlZSB0aGlzIGJlY2F1c2Ugd2UgZWl0aGVyIGV4ZWMgb3IgRGllLgorICBjb25zdCBjaGFyICoqYXJncyA9IG5ldyBjb25zdCBjaGFyICpbc2l6ZSArIGRlZmF1bHRfc2l6ZSArIDFdOworICAvLyBUaGUgYWN0dWFsIGV4ZWN1dGFibGUgdG8gcnVuLgorICA6OnN0ZDo6c3RyaW5nIGV4ZWN1dGFibGU7CisgIGludCBpID0gMDsKKyAgZm9yIChzaXplX3QgdGVzdF9pID0gMDsgdGVzdF9pIDwgc2l6ZTsgKyt0ZXN0X2kpIHsKKyAgICBjb25zdCBjaGFyICpjID0gKCp0ZXN0KVt0ZXN0X2ldOworICAgIGlmIChpID09IDApIHsKKyAgICAgIGV4ZWN1dGFibGUgPSA6OnN0ZDo6c3RyaW5nKHNoYXJlZC0+cGF0aCkgKyAiLyIgKyBjOworICAgICAgYXJnc1swXSA9IGV4ZWN1dGFibGUuY19zdHIoKTsKKyAgICAgIGZvciAoY29uc3QgOjpzdGQ6OnN0cmluZyAmY2kgOiBrRGVmYXVsdEFyZ3MpIHsKKyAgICAgICAgYXJnc1srK2ldID0gY2kuY19zdHIoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYXJnc1tpXSA9IGM7CisgICAgfQorICAgICsraTsKKyAgfQorICBhcmdzW3NpemVdID0gTlVMTDsKKyAgZXhlY3YoZXhlY3V0YWJsZS5jX3N0cigpLCBjb25zdF9jYXN0PGNoYXIgKmNvbnN0ICo+KGFyZ3MpKTsKKyAgUERpZSgiZXhlY3YoJXMsICVwKSBmYWlsZWQiLCBleGVjdXRhYmxlLmNfc3RyKCksIGFyZ3MpOworfQorCit2b2lkIERvUnVuKFNoYXJlZCAqc2hhcmVkKSB7CisgIGludCBpdGVyYXRpb25zID0gMDsKKyAgLy8gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gYSByYW5kb20gb25lIG9mIHRoZSB0ZXN0cy4KKyAgLy8gV2UgcmFuZG9taXplIGJhc2VkIG9uIFBJRCBiZWNhdXNlIG90aGVyd2lzZSB0aGV5IGFsbCBlbmQgdXAgcnVubmluZyB0aGUKKyAgLy8gc2FtZSB0ZXN0IGF0IHRoZSBzYW1lIHRpbWUgZm9yIHRoZSB3aG9sZSB0ZXN0LgorICBjb25zdCBjaGFyICooKnRlc3QpW2tUZXN0TWF4QXJnc10gPSAma1Rlc3RzW2dldHBpZCgpICUga1Rlc3RzTGVuZ3RoXTsKKyAgaW50IHBpcGVzWzJdOworICB3aGlsZSAodGltZTo6VGltZTo6Tm93KCkgPCBzaGFyZWQtPnN0b3BfdGltZSkgeworICAgIGlmIChwaXBlKHBpcGVzKSA9PSAtMSkgeworICAgICAgUERpZSgicGlwZSglcCkgZmFpbGVkIiwgJnBpcGVzKTsKKyAgICB9CisgICAgc3dpdGNoIChmb3JrKCkpIHsKKyAgICAgIGNhc2UgMDogIC8vIGluIHJ1bm5lcgorICAgICAgICBEb1J1blRlc3Qoc2hhcmVkLCB0ZXN0LCBwaXBlcyk7CisgICAgICBjYXNlIC0xOgorICAgICAgICBQRGllKCJmb3JrKCkgZmFpbGVkIik7CisgICAgfQorCisgICAgaWYgKGNsb3NlKHBpcGVzWzFdKSA9PSAtMSkgeworICAgICAgUERpZSgiY2xvc2UoJWQpIG9mIHdyaXRlIGVuZCBvZiBwaXBlIGZhaWxlZCIsIHBpcGVzWzFdKTsKKyAgICB9CisKKyAgICA6OnN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgICBjaGFyIGJ1ZmZlclsyMDQ4XTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3NpemVfdCByZXQgPSByZWFkKHBpcGVzWzBdLCAmYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICBpZiAocmV0ID09IDApIHsgIC8vIEVPRgorICAgICAgICBpZiAoY2xvc2UocGlwZXNbMF0pID09IC0xKSB7CisgICAgICAgICAgUERpZSgiY2xvc2UoJWQpIG9mIHBpcGUgYXQgRU9GIGZhaWxlZCIsIHBpcGVzWzBdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAocmV0ID09IC0xKSB7CisgICAgICAgIFBEaWUoInJlYWQoJWQsICVwLCAlemQpIGZhaWxlZCIsIHBpcGVzWzBdLCAmYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICB9CisgICAgICBvdXRwdXQgKz0gOjpzdGQ6OnN0cmluZyhidWZmZXIsIHJldCk7CisgICAgfQorCisgICAgaW50IHN0YXR1czsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKHdhaXQoJnN0YXR1cykgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgICAgUERpZSgid2FpdCglcCkgaW4gY2hpbGQgZmFpbGVkIiwgJnN0YXR1cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKFdJRkVYSVRFRChzdGF0dXMpKSB7CisgICAgICBpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKSB7CisgICAgICAgIE11dGV4TG9ja2VyIHN5bmMoJnNoYXJlZC0+b3V0cHV0X211dGV4KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUZXN0ICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZC4gb3V0cHV0OlxuIiwKKyAgICAgICAgICAgICAgICAoKnRlc3QpWzBdLCBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKKyAgICAgICAgZnB1dHMob3V0cHV0LmNfc3RyKCksIHN0ZGVycik7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisgICAgICBNdXRleExvY2tlciBzeW5jKCZzaGFyZWQtPm91dHB1dF9tdXRleCk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3QgJXMgdGVybWluYXRlZCBieSBzaWduYWwgJWQ6ICVzLlxuIiwgKCp0ZXN0KVswXSwKKyAgICAgICAgICAgICAgV1RFUk1TSUcoc3RhdHVzKSwgYW9zX3N0cnNpZ25hbChXVEVSTVNJRyhzdGF0dXMpKSk7CisgICAgICAgIGZwdXRzKG91dHB1dC5jX3N0cigpLCBzdGRlcnIpOworICAgIH0gZWxzZSB7CisgICAgICBDSEVDSyhXSUZTVE9QUEVEKHN0YXR1cykpOworICAgICAgRGllKCJUZXN0ICVzIHdhcyBzdG9wcGVkLlxuIiwgKCp0ZXN0KVswXSk7CisgICAgfQorCisgICAgKyt0ZXN0OworICAgIGlmICh0ZXN0ID09IGtUZXN0cyArIDEpIHRlc3QgPSBrVGVzdHM7CisgICAgKytpdGVyYXRpb25zOworICB9CisgIHsKKyAgICBNdXRleExvY2tlciBzeW5jKCZzaGFyZWQtPnRvdGFsX2l0ZXJhdGlvbnNfbXV0ZXgpOworICAgIHNoYXJlZC0+dG90YWxfaXRlcmF0aW9ucyArPSBpdGVyYXRpb25zOworICB9Cit9CisKK3ZvaWQgUnVuKFNoYXJlZCAqc2hhcmVkKSB7CisgIHN3aXRjaCAoZm9yaygpKSB7CisgICAgY2FzZSAwOiAgLy8gaW4gY2hpbGQKKyAgICAgIERvUnVuKHNoYXJlZCk7CisgICAgICBfZXhpdChFWElUX1NVQ0NFU1MpOworICAgIGNhc2UgLTE6CisgICAgICBQRGllKCJmb3JrKCkgb2YgY2hpbGQgZmFpbGVkIik7CisgIH0KK30KKworaW50IE1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGlmIChhcmdjIDwgMSkgeworICAgIGZwdXRzKCJuZWVkIGFuIGFyZ3VtZW50XG4iLCBzdGRlcnIpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICA6OmFvczo6Y29tbW9uOjp0ZXN0aW5nOjpHbG9iYWxDb3JlSW5zdGFuY2UgZ2xvYmFsX2NvcmU7CisKKyAgU2hhcmVkICpzaGFyZWQgPSBzdGF0aWNfY2FzdDxTaGFyZWQgKj4oc2htX21hbGxvYyhzaXplb2YoU2hhcmVkKSkpOworICBuZXcgKHNoYXJlZCkgU2hhcmVkKHRpbWU6OlRpbWU6Ok5vdygpICsga1Rlc3RUaW1lKTsKKworICBpZiAoYXNwcmludGYoY29uc3RfY2FzdDxjaGFyICoqPigmc2hhcmVkLT5wYXRoKSwKKyAgICAgICAgICAgICAgICIlcy8uLi90ZXN0cyIsIDo6YW9zOjpsaWJjOjpEaXJuYW1lKGFyZ3ZbMF0pLmNfc3RyKCkpID09IC0xKSB7CisgICAgUERpZSgiYXNwcmludGYgZmFpbGVkIik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGtUZXN0ZXJzOyArK2kpIHsKKyAgICBSdW4oc2hhcmVkKTsKKyAgfQorCisgIGJvb2wgZXJyb3IgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGVzdGVyczsgKytpKSB7CisgICAgaW50IHN0YXR1czsKKyAgICBpZiAod2FpdCgmc3RhdHVzKSA9PSAtMSkgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CisgICAgICAgIC0taTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFBEaWUoIndhaXQoJXApIGZhaWxlZCIsICZzdGF0dXMpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkgeworICAgICAgZXJyb3IgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHByaW50ZigiUmFuIGEgdG90YWwgb2YgJWQgdGVzdHMuXG4iLCBzaGFyZWQtPnRvdGFsX2l0ZXJhdGlvbnMpOworICBpZiAoZXJyb3IpIHsKKyAgICBwcmludGYoIkEgY2hpbGQgaGFkIGEgcHJvYmxlbSBkdXJpbmcgdGhlIHRlc3QuXG4iKTsKKyAgfQorICByZXR1cm4gZXJyb3IgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHJldHVybiA6OmFvczo6TWFpbihhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2lwY19saWIvbXV0ZXguY2MgYi9hb3MvbGludXhfY29kZS9pcGNfbGliL211dGV4LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Yjg2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9pcGNfbGliL211dGV4LmNjCkBAIC0wLDAgKzEsNTggQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL211dGV4LmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGFvcyB7CisKK011dGV4OjpNdXRleCgpIDogaW1wbF8oKSB7CisgIHN0YXRpY19hc3NlcnQoc2htX29rPE11dGV4Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIk11dGV4IGlzIG5vdCBzYWZlIGZvciB1c2UgaW4gc2hhcmVkIG1lbW9yeS4iKTsKK30KKworTXV0ZXg6On5NdXRleCgpIHsKKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QobXV0ZXhfaXNsb2NrZWQoJmltcGxfKSwgZmFsc2UpKSB7CisgICAgTE9HKEZBVEFMLCAiZGVzdHJveWluZyBsb2NrZWQgbXV0ZXggJXAgKGFrYSAlcClcbiIsCisgICAgICAgIHRoaXMsICZpbXBsXyk7CisgIH0KK30KKworLy8gTG9jayBhbmQgVW5sb2NrIHVzZSB0aGUgcmV0dXJuIHZhbHVlcyBvZiBtdXRleF9sb2NrL211dGV4X3VubG9jaworLy8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGxvY2svdW5sb2NrIHN1Y2NlZWRlZC4KKworYm9vbCBNdXRleDo6TG9jaygpIHsKKyAgY29uc3QgaW50IHJldCA9IG11dGV4X2dyYWIoJmltcGxfKTsKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIExPRyhGQVRBTCwgIm11dGV4X2dyYWIoJXAoPSUiIFBSSXUzMiAiKSkgZmFpbGVkIHdpdGggJWRcbiIsCisgICAgICAgICZpbXBsXywgaW1wbF8uZnV0ZXgsIHJldCk7CisgIH0KK30KKwordm9pZCBNdXRleDo6VW5sb2NrKCkgeworICBtdXRleF91bmxvY2soJmltcGxfKTsKK30KKworTXV0ZXg6OlN0YXRlIE11dGV4OjpUcnlMb2NrKCkgeworICBjb25zdCBpbnQgcmV0ID0gbXV0ZXhfdHJ5bG9jaygmaW1wbF8pOworICBzd2l0Y2ggKHJldCkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiBTdGF0ZTo6a0xvY2tlZDsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gU3RhdGU6OmtMb2NrRmFpbGVkOworICAgIGRlZmF1bHQ6CisgICAgICBMT0coRkFUQUwsICJtdXRleF90cnlsb2NrKCVwKD0lIiBQUkl1MzIgIikpIGZhaWxlZCB3aXRoICVkXG4iLAorICAgICAgICAgICZpbXBsXywgaW1wbF8uZnV0ZXgsIHJldCk7CisgIH0KK30KKworYm9vbCBNdXRleDo6T3duZWRCeVNlbGYoKSBjb25zdCB7CisgIHJldHVybiBtdXRleF9pc2xvY2tlZCgmaW1wbF8pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9pcGNfbGliL3F1ZXVlLmNjIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9xdWV1ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFkNTFiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9xdWV1ZS5jYwpAQCAtMCwwICsxLDU2NyBAQAorI2lmICFBT1NfREVCVUcKKyNkZWZpbmUgTkRFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvcXVldWUuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9jb3JlX2xpYi5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB7CisKK3N0YXRpY19hc3NlcnQoc2htX29rPFJhd1F1ZXVlPjo6dmFsdWUsCisgICAgICAgICAgICAgICJSYXdRdWV1ZSBpbnN0YW5jZXMgZ28gaW50byBzaGFyZWQgbWVtb3J5Iik7CisKK2NvbnN0IGJvb2wga1JlYWREZWJ1ZyA9IGZhbHNlOworY29uc3QgYm9vbCBrV3JpdGVEZWJ1ZyA9IGZhbHNlOworY29uc3QgYm9vbCBrUmVmRGVidWcgPSBmYWxzZTsKK2NvbnN0IGJvb2wga0ZldGNoRGVidWcgPSBmYWxzZTsKK2NvbnN0IGJvb2wga1JlYWRJbmRleERlYnVnID0gZmFsc2U7CisKKy8vIFRoZSBudW1iZXIgb2YgZXh0cmEgbWVzc2FnZXMgdGhlIHBvb2wgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcXVldWUgd2lsbCBiZSBhYmxlCisvLyB0byBob2xkIChmb3IgcmVhZGVycyB3aG8gYXJlIHNsb3cgYWJvdXQgZnJlZWluZyB0aGVtIG9yIHdobyBsZWFrIG9uZSB3aGVuCisvLyB0aGV5IGdldCBraWxsZWQpLgorY29uc3QgaW50IGtFeHRyYU1lc3NhZ2VzID0gMjA7CisKK30gIC8vIG5hbWVzcGFjZQorCitjb25zdGV4cHIgT3B0aW9uczxSYXdRdWV1ZT46Ok9wdGlvbiBSYXdRdWV1ZTo6a1BlZWs7Citjb25zdGV4cHIgT3B0aW9uczxSYXdRdWV1ZT46Ok9wdGlvbiBSYXdRdWV1ZTo6a0Zyb21FbmQ7Citjb25zdGV4cHIgT3B0aW9uczxSYXdRdWV1ZT46Ok9wdGlvbiBSYXdRdWV1ZTo6a05vbkJsb2NrOworY29uc3RleHByIE9wdGlvbnM8UmF3UXVldWU+OjpPcHRpb24gUmF3UXVldWU6OmtCbG9jazsKK2NvbnN0ZXhwciBPcHRpb25zPFJhd1F1ZXVlPjo6T3B0aW9uIFJhd1F1ZXVlOjprT3ZlcnJpZGU7CisKKy8vIFRoaXMgaXMgd2hhdCBnZXRzIHN0dWNrIGluIGJlZm9yZSBlYWNoIHF1ZXVlIG1lc3NhZ2UgaW4gbWVtb3J5LiBJdCBpcyBhbHdheXMKKy8vIGFsbG9jYXRlZCBhbGlnbmVkIHRvIDggYnl0ZXMgYW5kIGl0cyBzaXplIGhhcyB0byBtYWludGFpbiB0aGF0IGFsaWdubWVudCBmb3IKKy8vIHRoZSBtZXNzYWdlIHRoYXQgZm9sbG93cyBpbW1lZGlhdGVseS4KK3N0cnVjdCBSYXdRdWV1ZTo6TWVzc2FnZUhlYWRlciB7CisgIE1lc3NhZ2VIZWFkZXIgKm5leHQ7CisKKyAgLy8gR2V0cyB0aGUgbWVzc2FnZSBoZWFkZXIgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIG1zZy4KKyAgc3RhdGljIE1lc3NhZ2VIZWFkZXIgKkdldChjb25zdCB2b2lkICptc2cpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlSGVhZGVyICo+KF9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCAqPihjb25zdF9jYXN0PHZvaWQgKj4obXNnKSkgLSBzaXplb2YoTWVzc2FnZUhlYWRlciksCisgICAgICAgIGFsaWdub2YoTWVzc2FnZUhlYWRlcikpKTsKKyAgfQorCisgIGludDMyX3QgcmVmX2NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBfX2F0b21pY19sb2FkX24oJnJlZl9jb3VudF8sIF9fQVRPTUlDX1JFTEFYRUQpOworICB9CisgIHZvaWQgc2V0X3JlZl9jb3VudChpbnQzMl90IHZhbCkgeworICAgIF9fYXRvbWljX3N0b3JlX24oJnJlZl9jb3VudF8sIHZhbCwgX19BVE9NSUNfUkVMQVhFRCk7CisgIH0KKworICB2b2lkIHJlZl9jb3VudF9zdWIoKSB7CisgICAgX19hdG9taWNfc3ViX2ZldGNoKCZyZWZfY291bnRfLCAxLCBfX0FUT01JQ19SRUxBWEVEKTsKKyAgfQorICB2b2lkIHJlZl9jb3VudF9hZGQoKSB7CisgICAgX19hdG9taWNfYWRkX2ZldGNoKCZyZWZfY291bnRfLCAxLCBfX0FUT01JQ19SRUxBWEVEKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVGhpcyBnZXRzIGFjY2Vzc2VkIHdpdGggYXRvbWljIGluc3RydWN0aW9ucyB3aXRob3V0IGFueQorICAvLyBsb2NrcyBoZWxkIGJ5IHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgaW50MzJfdCByZWZfY291bnRfOworCisgIC8vIFBhZGRpbmcgdG8gbWFrZSB0aGUgdG90YWwgc2l6ZSA4IGJ5dGVzIGlmIHdlIGhhdmUgNC1ieXRlIHBvaW50ZXJzIG9yIGJ1bXAKKyAgLy8gaXQgdG8gMTYgaWYgYSBwb2ludGVyIGlzIDggYnl0ZXMgYnkgaXRzZWxmLgorI2lmIF9fU0laRU9GX1BPSU5URVJfXyA9PSA4CisjaWZkZWYgX19jbGFuZ19fCisgIC8vIENsYW5nIGlzIHNtYXJ0IGVub3VnaCB0byByZWFsaXplIHRoaXMgaXMgdW51c2VkLCBidXQgR0NDIGRvZXNuJ3QgbGlrZSB0aGUKKyAgLy8gYXR0cmlidXRlIGhlcmUuLi4KKyAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbmRpZgorICBjaGFyIHBhZGRpbmdbNF07CisjZWxpZiBfX1NJWkVPRl9QT0lOVEVSX18gPT0gNAorICAvLyBObyBwYWRkaW5nIG5lZWRlZCB0byBnZXQgOCBieXRlIHRvdGFsIHNpemUuCisjZWxzZQorI2Vycm9yIFVua25vd24gcG9pbnRlciBzaXplLgorI2VuZGlmCit9OworCitpbmxpbmUgaW50IFJhd1F1ZXVlOjppbmRleF9hZGQxKGludCBpbmRleCkgeworICAvLyBEb2luZyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHdpdGggJSBpcyBtb3JlIGVmZmljaWVudCBvbiBBUk0uCisgIGludCByID0gaW5kZXggKyAxOworICBhc3NlcnQoaW5kZXggPD0gZGF0YV9sZW5ndGhfKTsKKyAgaWYgKHIgPT0gZGF0YV9sZW5ndGhfKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHI7CisgIH0KK30KKwordm9pZCBSYXdRdWV1ZTo6RGVjcmVtZW50TWVzc2FnZVJlZmVyZW5jZUNvdW50KGNvbnN0IHZvaWQgKm1zZykgeworICBNZXNzYWdlSGVhZGVyICpoZWFkZXIgPSBNZXNzYWdlSGVhZGVyOjpHZXQobXNnKTsKKyAgaGVhZGVyLT5yZWZfY291bnRfc3ViKCk7CisgIGlmIChrUmVmRGVidWcpIHsKKyAgICBwcmludGYoIiVwIHJlZiBkZWMgY291bnQ6ICVwIGNvdW50PSVkXG4iLCB0aGlzLCBtc2csIGhlYWRlci0+cmVmX2NvdW50KCkpOworICB9CisKKyAgLy8gVGhlIG9ubHkgd2F5IGl0IHNob3VsZCBldmVyIGJlIDAgaXMgaWYgd2Ugd2VyZSB0aGUgbGFzdCBvbmUgdG8gZGVjcmVtZW50LAorICAvLyBpbiB3aGljaCBjYXNlIG5vYm9keSBlbHNlIHNob3VsZCBoYXZlIGl0IGFyb3VuZCB0byByZS1pbmNyZW1lbnQgaXQgb3IKKyAgLy8gYW55dGhpbmcgaW4gdGhlIG1pZGRsZSwgc28gdGhpcyBpcyBzYWZlIHRvIGRvIG5vdCBhdG9taWNhbGx5IHdpdGggdGhlCisgIC8vIGRlY3JlbWVudC4KKyAgaWYgKGhlYWRlci0+cmVmX2NvdW50KCkgPT0gMCkgeworICAgIERvRnJlZU1lc3NhZ2UobXNnKTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoaGVhZGVyLT5yZWZfY291bnQoKSA+IDApOworICB9Cit9CisKK2lubGluZSB2b2lkIFJhd1F1ZXVlOjpJbmNyZW1lbnRNZXNzYWdlUmVmZXJlbmNlQ291bnQoY29uc3Qgdm9pZCAqbXNnKSBjb25zdCB7CisgIE1lc3NhZ2VIZWFkZXIgKmNvbnN0IGhlYWRlciA9IE1lc3NhZ2VIZWFkZXI6OkdldChtc2cpOworICBoZWFkZXItPnJlZl9jb3VudF9hZGQoKTsKKyAgaWYgKGtSZWZEZWJ1ZykgeworICAgIHByaW50ZigiJXAgcmVmIGluYyBjb3VudDogJXBcbiIsIHRoaXMsIG1zZyk7CisgIH0KK30KKworaW5saW5lIHZvaWQgUmF3UXVldWU6OkRvRnJlZU1lc3NhZ2UoY29uc3Qgdm9pZCAqbXNnKSB7CisgIE1lc3NhZ2VIZWFkZXIgKmhlYWRlciA9IE1lc3NhZ2VIZWFkZXI6OkdldChtc2cpOworICBpZiAoa1JlZkRlYnVnKSB7CisgICAgcHJpbnRmKCIlcCByZWYgZnJlZSB0byAlcDogJXBcbiIsIHRoaXMsIHJlY3ljbGVfLCBtc2cpOworICB9CisKKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QocmVjeWNsZV8gIT0gbnVsbHB0ciwgMCkpIHsKKyAgICB2b2lkICpjb25zdCBuZXdfbXNnID0gcmVjeWNsZV8tPkdldE1lc3NhZ2UoKTsKKyAgICBpZiAobmV3X21zZyA9PSBudWxscHRyKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInF1ZXVlOiBjb3VsZG4ndCBnZXQgYSBtZXNzYWdlIgorICAgICAgICAgICAgICAiIGZvciByZWN5Y2xlIHF1ZXVlICVwXG4iLCByZWN5Y2xlXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGhlYWRlci0+cmVmX2NvdW50X2FkZCgpOworICAgICAgaWYgKCFyZWN5Y2xlXy0+V3JpdGVNZXNzYWdlKGNvbnN0X2Nhc3Q8dm9pZCAqPihtc2cpLCBrT3ZlcnJpZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicXVldWU6ICVwLT5Xcml0ZU1lc3NhZ2UoJXAsIGtPdmVycmlkZSkgZmFpbGVkLiIKKyAgICAgICAgICAgICAgICAiIGFib3J0aW5nXG4iLCByZWN5Y2xlXywgbXNnKTsKKyAgICAgICAgcHJpbnRmKCJzZWUgc3RkZXJyXG4iKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICAgIH0KKyAgICAgIG1zZyA9IG5ld19tc2c7CisgICAgICBoZWFkZXIgPSBNZXNzYWdlSGVhZGVyOjpHZXQobmV3X21zZyk7CisgICAgfQorICB9CisKKyAgLy8gVGhpcyB3b3JrcyBhcm91bmQgR0NDIGJ1ZyA2MDI3MiAoZml4ZWQgaW4gNC44LjMpLgorICAvLyBuZXdfbmV4dCBzaG91bGQganVzdCBnZXQgcmVwbGFjZWQgd2l0aCBoZWFkZXItPm5leHQgKGFuZCB0aGUgYm9keSBvZiB0aGUKKyAgLy8gbG9vcCBzaG91bGQgYmVjb21lIGVtcHR5KS4KKyAgLy8gVGhlIGJ1ZyBpcyB0aGF0IHRoZSBzdG9yZSB0byBuZXdfbmV4dCBhZnRlciB0aGUgY29tcGFyZS9leGNoYW5nZSBpcworICAvLyB1bmNvbmRpdGlvbmFsIGJ1dCBpdCBzaG91bGQgb25seSBiZSBpZiBpdCBmYWlscywgd2hpY2ggY291bGQgbWVhbgorICAvLyBvdmVyd3JpdGluZyB3aGF0IHNvbWVib2R5IGVsc2Ugd2hvIHByZWVtcHRlZCB1cyByaWdodCB0aGVuIGNoYW5nZWQgaXQgdG8uCisgIC8vIFRPRE8oYnJpYW5zKTogR2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmQgb25jZSB3ZSBnZXQgYSBuZXcgZW5vdWdoIEdDQy4KKyAgTWVzc2FnZUhlYWRlciAqbmV3X25leHQgPSBfX2F0b21pY19sb2FkX24oJmZyZWVfbWVzc2FnZXNfLCBfX0FUT01JQ19SRUxBWEVEKTsKKyAgZG8geworICAgIGhlYWRlci0+bmV4dCA9IG5ld19uZXh0OworICB9IHdoaWxlIChfX2J1aWx0aW5fZXhwZWN0KAorICAgICAgIV9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmZnJlZV9tZXNzYWdlc18sICZuZXdfbmV4dCwgaGVhZGVyLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FUT01JQ19SRUxFQVNFLCBfX0FUT01JQ19SRUxBWEVEKSwKKyAgICAgIDApKTsKK30KKwordm9pZCAqUmF3UXVldWU6OkdldE1lc3NhZ2UoKSB7CisgIE1lc3NhZ2VIZWFkZXIgKmhlYWRlciA9IF9fYXRvbWljX2xvYWRfbigmZnJlZV9tZXNzYWdlc18sIF9fQVRPTUlDX1JFTEFYRUQpOworICBkbyB7CisgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoaGVhZGVyID09IG51bGxwdHIsIDApKSB7CisgICAgICBMT0coRkFUQUwsICJvdmVydXNlZCBwb29sIG9mIHF1ZXVlICVwICglcylcbiIsIHRoaXMsIG5hbWVfKTsKKyAgICB9CisgIH0gd2hpbGUgKF9fYnVpbHRpbl9leHBlY3QoCisgICAgICAhX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKCZmcmVlX21lc3NhZ2VzXywgJmhlYWRlciwgaGVhZGVyLT5uZXh0LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FUT01JQ19BQ1FfUkVMLCBfX0FUT01JQ19SRUxBWEVEKSwKKyAgICAgIDApKTsKKyAgdm9pZCAqbXNnID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGhlYWRlciArIDEpOworICAvLyBJdCBtaWdodCBiZSB1bmluaXRpYWxpemVkLCAwIGZyb20gYSBwcmV2aW91cyB1c2UsIG9yIDEgZnJvbSBwcmV2aW91c2x5CisgIC8vIGJlaW5nIHJlY3ljbGVkLgorICBoZWFkZXItPnNldF9yZWZfY291bnQoMSk7CisgIGlmIChrUmVmRGVidWcpIHsKKyAgICBwcmludGYoIiVwIHJlZiBhbGxvYzogJXBcbiIsIHRoaXMsIG1zZyk7CisgIH0KKyAgcmV0dXJuIG1zZzsKK30KKworUmF3UXVldWU6OlJhd1F1ZXVlKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW5ndGgsIGludCBoYXNoLCBpbnQgcXVldWVfbGVuZ3RoKQorICAgIDogcmVhZGFibGVfKCZkYXRhX2xvY2tfKSwgd3JpdGFibGVfKCZkYXRhX2xvY2tfKSB7CisgIHN0YXRpY19hc3NlcnQoc2htX29rPFJhd1F1ZXVlOjpNZXNzYWdlSGVhZGVyPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgInRoZSB3aG9sZSBwb2ludCBpcyB0byBzdGljayBpdCBpbiBzaGFyZWQgbWVtb3J5Iik7CisgIHN0YXRpY19hc3NlcnQoKHNpemVvZihSYXdRdWV1ZTo6TWVzc2FnZUhlYWRlcikgJSA4KSA9PSAwLAorICAgICAgICAgICAgICAgICJuZWVkIHRvIHJldmFsaWRhdGUgc2l6ZS9hbGlnbmVudCBhc3N1bXB0aW9ucyIpOworCisgIGlmIChxdWV1ZV9sZW5ndGggPCAxKSB7CisgICAgTE9HKEZBVEFMLCAicXVldWUgbGVuZ3RoICVkIG9mICVzIG5lZWRzIHRvIGJlIGF0IGxlYXN0IDFcbiIsIHF1ZXVlX2xlbmd0aCwKKyAgICAgICAgbmFtZV8pOworICB9CisKKyAgY29uc3Qgc2l6ZV90IG5hbWVfc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CisgIGNoYXIgKnRlbXAgPSBzdGF0aWNfY2FzdDxjaGFyICo+KHNobV9tYWxsb2MobmFtZV9zaXplKSk7CisgIG1lbWNweSh0ZW1wLCBuYW1lLCBuYW1lX3NpemUpOworICBuYW1lXyA9IHRlbXA7CisgIGxlbmd0aF8gPSBsZW5ndGg7CisgIGhhc2hfID0gaGFzaDsKKyAgcXVldWVfbGVuZ3RoXyA9IHF1ZXVlX2xlbmd0aDsKKworICBuZXh0XyA9IE5VTEw7CisgIHJlY3ljbGVfID0gTlVMTDsKKworICBpZiAoa0ZldGNoRGVidWcpIHsKKyAgICBwcmludGYoImluaXRpYWxpemluZyBuYW1lPSVzLCBsZW5ndGg9JXpkLCBoYXNoPSVkLCBxdWV1ZV9sZW5ndGg9JWRcbiIsCisgICAgICAgICAgIG5hbWUsIGxlbmd0aCwgaGFzaCwgcXVldWVfbGVuZ3RoKTsKKyAgfQorCisgIGRhdGFfbGVuZ3RoXyA9IHF1ZXVlX2xlbmd0aCArIDE7CisgIGRhdGFfID0gc3RhdGljX2Nhc3Q8dm9pZCAqKj4oc2htX21hbGxvYyhzaXplb2Yodm9pZCAqKSAqIGRhdGFfbGVuZ3RoXykpOworICBkYXRhX3N0YXJ0XyA9IDA7CisgIGRhdGFfZW5kXyA9IDA7CisgIG1lc3NhZ2VzXyA9IDA7CisKKyAgbXNnX2xlbmd0aF8gPSBsZW5ndGggKyBzaXplb2YoTWVzc2FnZUhlYWRlcik7CisKKyAgLy8gQ3JlYXRlIGFsbCBvZiB0aGUgbWVzc2FnZXMgZm9yIHRoZSBmcmVlIGxpc3QgYW5kIHN0aWNrIHRoZW0gb24uCisgIHsKKyAgICBNZXNzYWdlSGVhZGVyICpwcmV2aW91cyA9IG51bGxwdHI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxdWV1ZV9sZW5ndGggKyBrRXh0cmFNZXNzYWdlczsgKytpKSB7CisgICAgICBNZXNzYWdlSGVhZGVyICpjb25zdCBtZXNzYWdlID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxNZXNzYWdlSGVhZGVyICo+KHNobV9tYWxsb2MobXNnX2xlbmd0aF8pKTsKKyAgICAgIGZyZWVfbWVzc2FnZXNfID0gbWVzc2FnZTsKKyAgICAgIG1lc3NhZ2UtPm5leHQgPSBwcmV2aW91czsKKyAgICAgIHByZXZpb3VzID0gbWVzc2FnZTsKKyAgICB9CisgIH0KKworICByZWFkYWJsZV93YWl0aW5nXyA9IGZhbHNlOworCisgIGlmIChrRmV0Y2hEZWJ1ZykgeworICAgIHByaW50ZigibWFkZSBxdWV1ZSAlc1xuIiwgbmFtZSk7CisgIH0KK30KKworUmF3UXVldWUgKlJhd1F1ZXVlOjpGZXRjaChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuZ3RoLCBpbnQgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHF1ZXVlX2xlbmd0aCkgeworICBpZiAoa0ZldGNoRGVidWcpIHsKKyAgICBwcmludGYoImZldGNoaW5nIHF1ZXVlICVzXG4iLCBuYW1lKTsKKyAgfQorICBpZiAobXV0ZXhfbG9jaygmZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QtPnF1ZXVlcy5sb2NrKSAhPSAwKSB7CisgICAgTE9HKEZBVEFMLCAibXV0ZXhfbG9jayglcCkgZmFpbGVkXG4iLAorICAgICAgICAmZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QtPnF1ZXVlcy5sb2NrKTsKKyAgfQorICBSYXdRdWV1ZSAqY3VycmVudCA9IHN0YXRpY19jYXN0PFJhd1F1ZXVlICo+KAorICAgICAgZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QtPnF1ZXVlcy5wb2ludGVyKTsKKyAgaWYgKGN1cnJlbnQgIT0gTlVMTCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAvLyBJZiB3ZSBmb3VuZCBhIG1hdGNoaW5nIHF1ZXVlLgorICAgICAgaWYgKHN0cmNtcChjdXJyZW50LT5uYW1lXywgbmFtZSkgPT0gMCAmJiBjdXJyZW50LT5sZW5ndGhfID09IGxlbmd0aCAmJgorICAgICAgICAgIGN1cnJlbnQtPmhhc2hfID09IGhhc2ggJiYgY3VycmVudC0+cXVldWVfbGVuZ3RoXyA9PSBxdWV1ZV9sZW5ndGgpIHsKKyAgICAgICAgbXV0ZXhfdW5sb2NrKCZnbG9iYWxfY29yZS0+bWVtX3N0cnVjdC0+cXVldWVzLmxvY2spOworICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChrRmV0Y2hEZWJ1ZykgeworICAgICAgICAgIHByaW50ZigicmVqZWN0ZWQgcXVldWUgJXMgc3RyY21wPSVkIHRhcmdldD0lc1xuIiwgY3VycmVudC0+bmFtZV8sCisgICAgICAgICAgICAgICAgIHN0cmNtcChjdXJyZW50LT5uYW1lXywgbmFtZSksIG5hbWUpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IG9uZS4KKyAgICAgIGlmIChjdXJyZW50LT5uZXh0XyA9PSBOVUxMKSBicmVhazsKKyAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0XzsKKyAgICB9CisgIH0KKworICBSYXdRdWV1ZSAqciA9IG5ldyAoc2htX21hbGxvYyhzaXplb2YoUmF3UXVldWUpKSkKKyAgICAgIFJhd1F1ZXVlKG5hbWUsIGxlbmd0aCwgaGFzaCwgcXVldWVfbGVuZ3RoKTsKKyAgaWYgKGN1cnJlbnQgPT0gTlVMTCkgeyAgLy8gaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQorICAgIGdsb2JhbF9jb3JlLT5tZW1fc3RydWN0LT5xdWV1ZXMucG9pbnRlciA9IHI7CisgIH0gZWxzZSB7CisgICAgY3VycmVudC0+bmV4dF8gPSByOworICB9CisKKyAgbXV0ZXhfdW5sb2NrKCZnbG9iYWxfY29yZS0+bWVtX3N0cnVjdC0+cXVldWVzLmxvY2spOworICByZXR1cm4gcjsKK30KKworUmF3UXVldWUgKlJhd1F1ZXVlOjpGZXRjaChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuZ3RoLCBpbnQgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHF1ZXVlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ljbGVfaGFzaCwgaW50IHJlY3ljbGVfbGVuZ3RoLCBSYXdRdWV1ZSAqKnJlY3ljbGUpIHsKKyAgUmF3UXVldWUgKnIgPSBGZXRjaChuYW1lLCBsZW5ndGgsIGhhc2gsIHF1ZXVlX2xlbmd0aCk7CisgIHItPnJlY3ljbGVfID0gRmV0Y2gobmFtZSwgbGVuZ3RoLCByZWN5Y2xlX2hhc2gsIHJlY3ljbGVfbGVuZ3RoKTsKKyAgaWYgKHIgPT0gci0+cmVjeWNsZV8pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInF1ZXVlOiByLT5yZWN5Y2xlXyg9JXApID09IHIoPSVwKVxuIiwgci0+cmVjeWNsZV8sIHIpOworICAgIHByaW50Zigic2VlIHN0ZGVyclxuIik7CisgICAgci0+cmVjeWNsZV8gPSBOVUxMOworICAgIGFib3J0KCk7CisgIH0KKyAgKnJlY3ljbGUgPSByLT5yZWN5Y2xlXzsKKyAgcmV0dXJuIHI7Cit9CisKK2Jvb2wgUmF3UXVldWU6OkRvV3JpdGVNZXNzYWdlKHZvaWQgKm1zZywgT3B0aW9uczxSYXdRdWV1ZT4gb3B0aW9ucykgeworICBpZiAoa1dyaXRlRGVidWcpIHsKKyAgICBwcmludGYoInF1ZXVlOiAlcC0+V3JpdGVNZXNzYWdlKCVwLCAleClcbiIsIHRoaXMsIG1zZywgb3B0aW9ucy5wcmludGFibGUoKSk7CisgIH0KKyAgeworICAgIElQQ011dGV4TG9ja2VyIGxvY2tlcigmZGF0YV9sb2NrXyk7CisgICAgQ0hFQ0soIWxvY2tlci5vd25lcl9kaWVkKCkpOworICAgIGJvb2wgd3JpdGFibGVfd2FpdGVkID0gZmFsc2U7CisKKyAgICBpbnQgbmV3X2VuZDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgbmV3X2VuZCA9IGluZGV4X2FkZDEoZGF0YV9lbmRfKTsKKyAgICAgIC8vIElmIHRoZXJlIGlzIHJvb20gaW4gdGhlIHF1ZXVlIHJpZ2h0IG5vdy4KKyAgICAgIGlmIChuZXdfZW5kICE9IGRhdGFfc3RhcnRfKSBicmVhazsKKyAgICAgIGlmIChvcHRpb25zICYga05vbkJsb2NrKSB7CisgICAgICAgIGlmIChrV3JpdGVEZWJ1ZykgeworICAgICAgICAgIHByaW50ZigicXVldWU6IG5vdCBibG9ja2luZyBvbiAlcC4gcmV0dXJuaW5nIGZhbHNlXG4iLCB0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBEZWNyZW1lbnRNZXNzYWdlUmVmZXJlbmNlQ291bnQobXNnKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYga092ZXJyaWRlKSB7CisgICAgICAgIGlmIChrV3JpdGVEZWJ1ZykgeworICAgICAgICAgIHByaW50ZigicXVldWU6IG92ZXJyaWRpbmcgb24gJXBcbiIsIHRoaXMpOworICAgICAgICB9CisgICAgICAgIC8vIEF2b2lkIGxlYWtpbmcgdGhlIG1lc3NhZ2UgdGhhdCB3ZSdyZSBnb2luZyB0byBvdmVyd3JpdGUuCisgICAgICAgIERlY3JlbWVudE1lc3NhZ2VSZWZlcmVuY2VDb3VudChkYXRhX1tkYXRhX3N0YXJ0X10pOworICAgICAgICBkYXRhX3N0YXJ0XyA9IGluZGV4X2FkZDEoZGF0YV9zdGFydF8pOworICAgICAgfSBlbHNlIHsgIC8vIGtCbG9jaworICAgICAgICBhc3NlcnQob3B0aW9ucyAmIGtCbG9jayk7CisgICAgICAgIGlmIChrV3JpdGVEZWJ1ZykgeworICAgICAgICAgIHByaW50ZigicXVldWU6IGdvaW5nIHRvIHdhaXQgZm9yIHdyaXRhYmxlXyBvZiAlcFxuIiwgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0soIXdyaXRhYmxlXy5XYWl0KCkpOworICAgICAgICB3cml0YWJsZV93YWl0ZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBkYXRhX1tkYXRhX2VuZF9dID0gbXNnOworICAgICsrbWVzc2FnZXNfOworICAgIGRhdGFfZW5kXyA9IG5ld19lbmQ7CisKKyAgICBpZiAocmVhZGFibGVfd2FpdGluZ18pIHsKKyAgICAgIGlmIChrV3JpdGVEZWJ1ZykgeworICAgICAgICBwcmludGYoInF1ZXVlOiBicm9hZGNhc3RpbmcgdG8gcmVhZGFibGVfIG9mICVwXG4iLCB0aGlzKTsKKyAgICAgIH0KKyAgICAgIHJlYWRhYmxlX3dhaXRpbmdfID0gZmFsc2U7CisgICAgICByZWFkYWJsZV8uQnJvYWRjYXN0KCk7CisgICAgfSBlbHNlIGlmIChrV3JpdGVEZWJ1ZykgeworICAgICAgcHJpbnRmKCJxdWV1ZTogc2tpcHBpbmcgYnJvYWRjYXN0IHRvIHJlYWRhYmxlXyBvZiAlcFxuIiwgdGhpcyk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZ290IGEgc2lnbmFsIG9uIHdyaXRhYmxlXyBoZXJlIGFuZCBpdCdzIHN0aWxsIHdyaXRhYmxlLCB0aGVuIHdlCisgICAgLy8gbmVlZCB0byBzaWduYWwgdGhlIG5leHQgcGVyc29uIGluIGxpbmUgKGlmIGFueSkuCisgICAgaWYgKHdyaXRhYmxlX3dhaXRlZCAmJiBpc193cml0YWJsZSgpKSB7CisgICAgICBpZiAoa1dyaXRlRGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJxdWV1ZTogcmVzaWduYWxsaW5nIHdyaXRhYmxlXyBvZiAlcFxuIiwgdGhpcyk7CisgICAgICB9CisgICAgICB3cml0YWJsZV8uU2lnbmFsKCk7CisgICAgfQorICB9CisgIGlmIChrV3JpdGVEZWJ1ZykgeworICAgIHByaW50ZigicXVldWU6IHdyaXRlIHJldHVybmluZyB0cnVlIG9uIHF1ZXVlICVwXG4iLCB0aGlzKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIHZvaWQgUmF3UXVldWU6OlJlYWRDb21tb25FbmQoKSB7CisgIGlmIChpc193cml0YWJsZSgpKSB7CisgICAgaWYgKGtSZWFkRGVidWcpIHsKKyAgICAgIHByaW50ZigicXVldWU6ICVzc2lnbmFsbGluZyB3cml0YWJsZV8gb2YgJXBcbiIsCisgICAgICAgICAgICAgd3JpdGFibGVfc3RhcnRfID8gIm5vdCAiIDogIiIsIHRoaXMpOworICAgIH0KKyAgICBpZiAoIXdyaXRhYmxlX3N0YXJ0Xykgd3JpdGFibGVfLlNpZ25hbCgpOworICB9Cit9CisKK2Jvb2wgUmF3UXVldWU6OlJlYWRDb21tb25TdGFydChPcHRpb25zPFJhd1F1ZXVlPiBvcHRpb25zLCBpbnQgKmluZGV4KSB7CisgIHdoaWxlIChkYXRhX3N0YXJ0XyA9PSBkYXRhX2VuZF8gfHwgKChpbmRleCAhPSBOVUxMKSAmJiBtZXNzYWdlc18gPD0gKmluZGV4KSkgeworICAgIGlmIChvcHRpb25zICYga05vbkJsb2NrKSB7CisgICAgICBpZiAoa1JlYWREZWJ1ZykgeworICAgICAgICBwcmludGYoInF1ZXVlOiBub3QgZ29pbmcgdG8gYmxvY2sgd2FpdGluZyBvbiAlcFxuIiwgdGhpcyk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsgIC8vIGtCbG9jaworICAgICAgYXNzZXJ0KG9wdGlvbnMgJiBrQmxvY2spOworICAgICAgaWYgKGtSZWFkRGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJxdWV1ZTogZ29pbmcgdG8gd2FpdCBmb3IgcmVhZGFibGVfIG9mICVwXG4iLCB0aGlzKTsKKyAgICAgIH0KKyAgICAgIHJlYWRhYmxlX3dhaXRpbmdfID0gdHJ1ZTsKKyAgICAgIC8vIFdhaXQgZm9yIGEgbWVzc2FnZSB0byBiZWNvbWUgcmVhZGFibGUuCisgICAgICBDSEVDSyghcmVhZGFibGVfLldhaXQoKSk7CisgICAgICBpZiAoa1JlYWREZWJ1ZykgeworICAgICAgICBwcmludGYoInF1ZXVlOiBkb25lIHdhaXRpbmcgZm9yIHJlYWRhYmxlXyBvZiAlcFxuIiwgdGhpcyk7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIFdlIGhhdmUgdG8gY2hlY2sgZG93biBoZXJlIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSB1bmxvY2tlZCB0aGUgbXV0ZXggd2hpbGUKKyAgLy8gV2FpdCgpaW5nIGFib3ZlIHNvIHRoaXMgdmFsdWUgbWlnaHQgaGF2ZSBjaGFuZ2VkLgorICB3cml0YWJsZV9zdGFydF8gPSBpc193cml0YWJsZSgpOworICBpZiAoa1JlYWREZWJ1ZykgeworICAgIHByaW50ZigicXVldWU6ICVwLT5yZWFkKCVwKSBzdGFydD0lZCBlbmQ9JWQgd3JpdGFibGVfc3RhcnQ9JWRcbiIsCisgICAgICAgICAgIHRoaXMsIGluZGV4LCBkYXRhX3N0YXJ0XywgZGF0YV9lbmRfLCB3cml0YWJsZV9zdGFydF8pOworICB9CisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgaW50IFJhd1F1ZXVlOjpMYXN0TWVzc2FnZUluZGV4KCkgY29uc3QgeworICBpbnQgcG9zID0gZGF0YV9lbmRfIC0gMTsKKyAgaWYgKHBvcyA8IDApIHsgIC8vIElmIGl0IHdyYXBwZWQgYXJvdW5kLgorICAgIHBvcyA9IGRhdGFfbGVuZ3RoXyAtIDE7CisgIH0KKyAgcmV0dXJuIHBvczsKK30KKworY29uc3Qgdm9pZCAqUmF3UXVldWU6OkRvUmVhZE1lc3NhZ2UoT3B0aW9uczxSYXdRdWV1ZT4gb3B0aW9ucykgeworICAvLyBUT0RPKGJyaWFucyk6IFRlc3QgdGhpcyBmdW5jdGlvbi4KKyAgaWYgKGtSZWFkRGVidWcpIHsKKyAgICBwcmludGYoInF1ZXVlOiAlcC0+UmVhZE1lc3NhZ2UoJXgpXG4iLCB0aGlzLCBvcHRpb25zLnByaW50YWJsZSgpKTsKKyAgfQorICB2b2lkICptc2cgPSBOVUxMOworCisgIElQQ011dGV4TG9ja2VyIGxvY2tlcigmZGF0YV9sb2NrXyk7CisgIENIRUNLKCFsb2NrZXIub3duZXJfZGllZCgpKTsKKworICBpZiAoIVJlYWRDb21tb25TdGFydChvcHRpb25zLCBudWxscHRyKSkgeworICAgIGlmIChrUmVhZERlYnVnKSB7CisgICAgICBwcmludGYoInF1ZXVlOiAlcCBjb21tb24gcmV0dXJuZWQgZmFsc2VcbiIsIHRoaXMpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChvcHRpb25zICYga0Zyb21FbmQpIHsKKyAgICBpZiAob3B0aW9ucyAmIGtQZWVrKSB7CisgICAgICBpZiAoa1JlYWREZWJ1ZykgeworICAgICAgICBwcmludGYoInF1ZXVlOiAlcCBzaG9ydGN1dHRpbmcgYzI6ICVkXG4iLCB0aGlzLCBMYXN0TWVzc2FnZUluZGV4KCkpOworICAgICAgfQorICAgICAgbXNnID0gZGF0YV9bTGFzdE1lc3NhZ2VJbmRleCgpXTsKKyAgICAgIEluY3JlbWVudE1lc3NhZ2VSZWZlcmVuY2VDb3VudChtc2cpOworICAgIH0gZWxzZSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoa1JlYWREZWJ1ZykgeworICAgICAgICAgIHByaW50ZigicXVldWU6ICVwIHN0YXJ0IG9mIGMyXG4iLCB0aGlzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGlzIGxvb3AgcHVsbHMgZWFjaCBtZXNzYWdlIG91dCBvZiB0aGUgYnVmZmVyLgorICAgICAgICBjb25zdCBpbnQgcG9zID0gZGF0YV9zdGFydF87CisgICAgICAgIGRhdGFfc3RhcnRfID0gaW5kZXhfYWRkMShkYXRhX3N0YXJ0Xyk7CisgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3Qgb25lLgorICAgICAgICBpZiAoZGF0YV9zdGFydF8gPT0gZGF0YV9lbmRfKSB7CisgICAgICAgICAgaWYgKGtSZWFkRGVidWcpIHsKKyAgICAgICAgICAgIHByaW50ZigicXVldWU6ICVwIHJlYWRpbmcgZnJvbSBjMjogJWRcbiIsIHRoaXMsIHBvcyk7CisgICAgICAgICAgfQorICAgICAgICAgIG1zZyA9IGRhdGFfW3Bvc107CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBtZXNzYWdlIGlzIG5vdCBnb2luZyB0byBiZSBpbiB0aGUgcXVldWUgYW55IG1vcmUuCisgICAgICAgIERlY3JlbWVudE1lc3NhZ2VSZWZlcmVuY2VDb3VudChkYXRhX1twb3NdKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGtSZWFkRGVidWcpIHsKKyAgICAgIHByaW50ZigicXVldWU6ICVwIHJlYWRpbmcgZnJvbSBkMjogJWRcbiIsIHRoaXMsIGRhdGFfc3RhcnRfKTsKKyAgICB9CisgICAgbXNnID0gZGF0YV9bZGF0YV9zdGFydF9dOworICAgIGlmIChvcHRpb25zICYga1BlZWspIHsKKyAgICAgIEluY3JlbWVudE1lc3NhZ2VSZWZlcmVuY2VDb3VudChtc2cpOworICAgIH0gZWxzZSB7CisgICAgICBkYXRhX3N0YXJ0XyA9IGluZGV4X2FkZDEoZGF0YV9zdGFydF8pOworICAgIH0KKyAgfQorICBSZWFkQ29tbW9uRW5kKCk7CisgIGlmIChrUmVhZERlYnVnKSB7CisgICAgcHJpbnRmKCJxdWV1ZTogJXAgcmVhZCByZXR1cm5pbmcgJXBcbiIsIHRoaXMsIG1zZyk7CisgIH0KKyAgcmV0dXJuIG1zZzsKK30KKworY29uc3Qgdm9pZCAqUmF3UXVldWU6OkRvUmVhZE1lc3NhZ2VJbmRleChPcHRpb25zPFJhd1F1ZXVlPiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4KSB7CisgIGlmIChrUmVhZERlYnVnKSB7CisgICAgcHJpbnRmKCJxdWV1ZTogJXAtPlJlYWRNZXNzYWdlSW5kZXgoJXgsICVwKCo9JWQpKVxuIiwKKyAgICAgICAgICAgdGhpcywgb3B0aW9ucy5wcmludGFibGUoKSwgaW5kZXgsICppbmRleCk7CisgIH0KKyAgdm9pZCAqbXNnID0gTlVMTDsKKworICBJUENNdXRleExvY2tlciBsb2NrZXIoJmRhdGFfbG9ja18pOworICBDSEVDSyghbG9ja2VyLm93bmVyX2RpZWQoKSk7CisKKyAgaWYgKCFSZWFkQ29tbW9uU3RhcnQob3B0aW9ucywgaW5kZXgpKSB7CisgICAgaWYgKGtSZWFkRGVidWcpIHsKKyAgICAgIHByaW50ZigicXVldWU6ICVwIGNvbW1vbiByZXR1cm5lZCBmYWxzZVxuIiwgdGhpcyk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gVE9ETyhwYXJrZXIpOiBIYW5kbGUgaW50ZWdlciB3cmFwIG9uIHRoZSBpbmRleC4KKworICBpZiAob3B0aW9ucyAmIGtGcm9tRW5kKSB7CisgICAgaWYgKGtSZWFkRGVidWcpIHsKKyAgICAgIHByaW50ZigicXVldWU6ICVwIHJlYWRpbmcgZnJvbSBjMTogJWRcbiIsIHRoaXMsIExhc3RNZXNzYWdlSW5kZXgoKSk7CisgICAgfQorICAgIG1zZyA9IGRhdGFfW0xhc3RNZXNzYWdlSW5kZXgoKV07CisKKyAgICAvLyBXZSdkIHNraXAgdGhpcyBpZiB3ZSBoYWQga1BlZWssIGJ1dCBrUGVlayB8IGtGcm9tRW5kIGlzbid0IHZhbGlkIGZvcgorICAgIC8vIHJlYWRpbmcgd2l0aCBhbiBpbmRleC4KKyAgICAqaW5kZXggPSBtZXNzYWdlc187CisgIH0gZWxzZSB7CisgICAgLy8gV2hlcmUgd2UncmUgZ29pbmcgdG8gc3RhcnQgcmVhZGluZy4KKyAgICBpbnQgbXlfc3RhcnQ7CisKKyAgICBjb25zdCBpbnQgdW5yZWFkX21lc3NhZ2VzID0gbWVzc2FnZXNfIC0gKmluZGV4OworICAgIGFzc2VydCh1bnJlYWRfbWVzc2FnZXMgPiAwKTsKKyAgICBpbnQgY3VycmVudF9tZXNzYWdlcyA9IGRhdGFfZW5kXyAtIGRhdGFfc3RhcnRfOworICAgIGlmIChjdXJyZW50X21lc3NhZ2VzIDwgMCkgY3VycmVudF9tZXNzYWdlcyArPSBkYXRhX2xlbmd0aF87CisgICAgaWYgKGtSZWFkSW5kZXhEZWJ1ZykgeworICAgICAgcHJpbnRmKCJxdWV1ZTogJXAgc3RhcnQ9JWQgZW5kPSVkIGN1cnJlbnQ9JWRcbiIsCisgICAgICAgICAgICAgdGhpcywgZGF0YV9zdGFydF8sIGRhdGFfZW5kXywgY3VycmVudF9tZXNzYWdlcyk7CisgICAgfQorICAgIGFzc2VydChjdXJyZW50X21lc3NhZ2VzID4gMCk7CisgICAgLy8gSWYgd2UncmUgYmVoaW5kIHRoZSBhdmFpbGFibGUgbWVzc2FnZXMuCisgICAgaWYgKHVucmVhZF9tZXNzYWdlcyA+IGN1cnJlbnRfbWVzc2FnZXMpIHsKKyAgICAgIC8vIENhdGNoIGluZGV4IHVwIHRvIHRoZSBsYXN0IGF2YWlsYWJsZSBtZXNzYWdlLgorICAgICAgKmluZGV4ID0gbWVzc2FnZXNfIC0gY3VycmVudF9tZXNzYWdlczsKKyAgICAgIC8vIEFuZCB0aGF0J3MgdGhlIG9uZSB3ZSdyZSBnb2luZyB0byByZWFkLgorICAgICAgbXlfc3RhcnQgPSBkYXRhX3N0YXJ0XzsKKyAgICAgIGlmIChrUmVhZEluZGV4RGVidWcpIHsKKyAgICAgICAgcHJpbnRmKCJxdWV1ZTogJXAganVtcGluZyBhaGVhZCB0byBtZXNzYWdlICVkIChoYXZlICVkKSAoYXQgJWQpXG4iLAorICAgICAgICAgICAgICAgdGhpcywgKmluZGV4LCBtZXNzYWdlc18sIGRhdGFfc3RhcnRfKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gSnVzdCBzdGFydCByZWFkaW5nIGF0IHRoZSBmaXJzdCBhdmFpbGFibGUgbWVzc2FnZSB0aGF0IHdlIGhhdmVuJ3QgeWV0CisgICAgICAvLyByZWFkLgorICAgICAgbXlfc3RhcnQgPSBkYXRhX2VuZF8gLSB1bnJlYWRfbWVzc2FnZXM7CisgICAgICBpZiAoa1JlYWRJbmRleERlYnVnKSB7CisgICAgICAgIHByaW50ZigicXVldWU6ICVwIG9yaWdpbmFsIHJlYWQgZnJvbSAlZFxuIiwgdGhpcywgbXlfc3RhcnQpOworICAgICAgfQorICAgICAgaWYgKGRhdGFfc3RhcnRfIDwgZGF0YV9lbmRfKSB7CisgICAgICAgIGFzc2VydChteV9zdGFydCA+PSAwKTsKKyAgICAgIH0KKyAgICAgIGlmIChteV9zdGFydCA8IDApIG15X3N0YXJ0ICs9IGRhdGFfbGVuZ3RoXzsKKyAgICB9CisKKyAgICBpZiAoa1JlYWREZWJ1ZykgeworICAgICAgcHJpbnRmKCJxdWV1ZTogJXAgcmVhZGluZyBmcm9tIGQxOiAlZFxuIiwgdGhpcywgbXlfc3RhcnQpOworICAgIH0KKyAgICAvLyBXZSBoYXZlIHRvIGJlIGVpdGhlciBhZnRlciB0aGUgc3RhcnQgb3IgYmVmb3JlIHRoZSBlbmQsIGV2ZW4gaWYgdGhlIHF1ZXVlCisgICAgLy8gaXMgd3JhcHBlZCBhcm91bmQgKHNob3VsZCBiZSBib3RoIGlmIGl0J3Mgbm90KS4KKyAgICBhc3NlcnQoKG15X3N0YXJ0ID49IGRhdGFfc3RhcnRfKSB8fCAobXlfc3RhcnQgPCBkYXRhX2VuZF8pKTsKKyAgICAvLyBNb3JlIHNhbml0eSBjaGVja2luZy4KKyAgICBhc3NlcnQoKG15X3N0YXJ0ID49IDApICYmIChteV9zdGFydCA8IGRhdGFfbGVuZ3RoXykpOworICAgIG1zZyA9IGRhdGFfW215X3N0YXJ0XTsKKyAgICBpZiAoIShvcHRpb25zICYga1BlZWspKSArKygqaW5kZXgpOworICB9CisgIEluY3JlbWVudE1lc3NhZ2VSZWZlcmVuY2VDb3VudChtc2cpOworCisgIFJlYWRDb21tb25FbmQoKTsKKyAgcmV0dXJuIG1zZzsKK30KKworaW50IFJhd1F1ZXVlOjpGcmVlTWVzc2FnZXMoKSBjb25zdCB7CisgIGludCByID0gMDsKKyAgTWVzc2FnZUhlYWRlciAqaGVhZGVyID0gZnJlZV9tZXNzYWdlc187CisgIHdoaWxlIChoZWFkZXIgIT0gbnVsbHB0cikgeworICAgICsrcjsKKyAgICBoZWFkZXIgPSBoZWFkZXItPm5leHQ7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2lwY19saWIvcXVldWUuaCBiL2Fvcy9saW51eF9jb2RlL2lwY19saWIvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhlOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9xdWV1ZS5oCkBAIC0wLDAgKzEsMjI4IEBACisjaWZuZGVmIEFPU19MSU5VWF9DT0RFX0lQQ19MSUJfUVVFVUVfSF8KKyNkZWZpbmUgQU9TX0xJTlVYX0NPREVfSVBDX0xJQl9RVUVVRV9IXworCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9zaGFyZWRfbWVtLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tdXRleC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29uZGl0aW9uLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL29wdGlvbnMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorCisvLyBUT0RPKGJyaWFucykgYWRkIHZhbGdyaW5kIGNsaWVudCByZXF1ZXN0cyB0byB0aGUgcXVldWUgYW5kIHNoYXJlZF9tZW1fbWFsbG9jCisvLyBjb2RlIHRvIG1ha2UgY2hlY2tpbmcgZm9yIGxlYWtzIHdvcmsgYmV0dGVyCisvLyA8aHR0cDovL3d3dy52YWxncmluZC5vcmcvZG9jcy9tYW51YWwvbWMtbWFudWFsLmh0bWwjbWMtbWFudWFsLm1lbXBvb2xzPgorLy8gZGVzY3JpYmVzIGhvdworCisvLyBBbnkgcG9pbnRlcnMgcmV0dXJuZWQgZnJvbSB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIHNhZmVseSBwYXNzZWQgdG8gb3RoZXIKKy8vIHByb2Nlc3NlcyBiZWNhdXNlIHRoZXkgYXJlIGFsbCBzaGFyZWQgbWVtb3J5IHBvaW50ZXJzLgorLy8gSU1QT1JUQU5UOiBBbnkgbWVzc2FnZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIGJhY2sgaW4gc29tZSB3YXkKKy8vIChGcmVlTWVzc2FnZSBhbmQgV3JpdGVNZXNzYWdlIGFyZSBjb21tb24gb25lcykgb3IgdGhlCisvLyBhcHBsaWNhdGlvbiB3aWxsIGxlYWsgc2hhcmVkIG1lbW9yeS4KKy8vIE5PVEU6IFRha2luZyBhIG1lc3NhZ2UgZnJvbSBSZWFkTWVzc2FnZSBhbmQgdGhlbiBwYXNzaW5nIGl0IHRvIFdyaXRlTWVzc2FnZQorLy8gbWlnaHQgd29yaywgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvLgorCituYW1lc3BhY2UgYW9zIHsKKworLy8gUXVldWVzIGFyZSB0aGUgcHJpbWFyeSB3YXkgdG8gdXNlIHNoYXJlZCBtZW1vcnkuIEJhc2ljIHVzZSBjb25zaXN0cyBvZgorLy8gY2FsbGluZyBRdWV1ZTo6RmV0Y2ggYW5kIHRoZW4gcmVhZGluZyBhbmQvb3Igd3JpdGluZyBtZXNzYWdlcy4KKy8vIFF1ZXVlcyAoYXMgdGhlIG5hbWUgc3VnZ2VzdHMpIGFyZSBhIEZJRk8gc3RhY2sgb2YgbWVzc2FnZXMuIEVhY2ggY29tYmluYXRpb24KKy8vIG9mIG5hbWUgYW5kIHR5cGUgc2lnbmF0dXJlIHdpbGwgcmVzdWx0IGluIGEgZGlmZmVyZW50IHF1ZXVlLCB3aGljaCBtZWFucworLy8gdGhhdCBpZiB5b3Ugb25seSByZWNvbXBpbGUgc29tZSBjb2RlIHRoYXQgdXNlcyBkaWZmZXJlbnRseSBzaXplZCBtZXNzYWdlcywKKy8vIGl0IHdpbGwgc2ltcGx5IHVzZSBhIGRpZmZlcmVudCBxdWV1ZSB0aGFuIHRoZSBvbGQgY29kZS4KK2NsYXNzIFJhd1F1ZXVlIHsKKyBwdWJsaWM6CisgIC8vIFJldHJpZXZlcyAoYW5kIGNyZWF0ZXMgaWYgbmVjZXNzYXJ5KSBhIHF1ZXVlLiBFYWNoIGNvbWJpbmF0aW9uIG9mIG5hbWUgYW5kCisgIC8vIHNpZ25hdHVyZSByZWZlcnMgdG8gYSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IHF1ZXVlLgorICAvLyBsZW5ndGggaXMgaG93IGxhcmdlIGVhY2ggbWVzc2FnZSB3aWxsIGJlCisgIC8vIGhhc2ggY2FuIGRpZmZlcmVudGlhdGUgbXVsdGlwbGUgb3RoZXJ3aXNlIGlkZW50aWNhbCBxdWV1ZXMKKyAgLy8gcXVldWVfbGVuZ3RoIGlzIGhvdyBtYW55IG1lc3NhZ2VzIHRoZSBxdWV1ZSB3aWxsIGJlIGFibGUgdG8gaG9sZAorICAvLyBXaWxsIG5ldmVyIHJldHVybiBOVUxMLgorICBzdGF0aWMgUmF3UXVldWUgKkZldGNoKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW5ndGgsIGludCBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWV1ZV9sZW5ndGgpOworICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgc2V0cyB1cCB0aGUgcmV0dXJuZWQgcXVldWUgc28gdGhhdCBpdCB3aWxsIHB1dAorICAvLyBtZXNzYWdlcyBvbiAqcmVjeWNsZSB3aGVuIHRoZXkgYXJlIGZyZWVkIChhZnRlciB0aGV5IGhhdmUgYmVlbiByZWxlYXNlZCBieQorICAvLyBhbGwgb3RoZXIgcmVhZGVycy93cml0ZXJzIGFuZCBhcmUgbm90IGluIHRoZSBxdWV1ZSkuCisgIC8vIHJlY3ljbGVfcXVldWVfbGVuZ3RoIGRldGVybWluZXMgaG93IG1hbnkgZnJlZWQgbWVzc2FnZXMgd2lsbCBiZSBrZXB0LgorICAvLyBPdGhlciBjb2RlIGNhbiByZXRyaWV2ZSB0aGUgMiBxdWV1ZXMgc2VwYXJhdGVseSAodGhlIHJlY3ljbGUgcXVldWUgd2lsbAorICAvLyBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgaGFzaCBhcyB0aGUgbWFpbiBvbmUpLiBIb3dldmVyLCBhbnkgZnJlZXMgbWFkZQorICAvLyB1c2luZyBhIHF1ZXVlIHdpdGggb25seSAobmFtZSxsZW5ndGgsaGFzaCxxdWV1ZV9sZW5ndGgpIGJlZm9yZSB0aGUKKyAgLy8gcmVjeWNsZSBxdWV1ZSBoYXMgYmVlbiBhc3NvY2lhdGVkIHdpdGggaXQgd2lsbCBub3QgZ28gb24gdG8gdGhlIHJlY3ljbGUKKyAgLy8gcXVldWUuCisgIC8vIE5PVEU6IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIChuYW1lLGxlbmd0aCxoYXNoLHF1ZXVlX2xlbmd0aCkKKyAgLy8gYnV0IG11bHRpcGxlIHJlY3ljbGVfcXVldWVfbGVuZ3RocyB3aWxsIHJlc3VsdCBpbiBlYWNoIGZyZWVkIG1lc3NhZ2UgYmVpbmcKKyAgLy8gcHV0IG9udG8gYW4gdW5kZWZpbmVkIG9uZSBvZiB0aGUgcmVjeWNsZSBxdWV1ZXMuCisgIC8vIFdpbGwgbmV2ZXIgcmV0dXJuIE5VTEwuCisgIHN0YXRpYyBSYXdRdWV1ZSAqRmV0Y2goY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbmd0aCwgaW50IGhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1ZXVlX2xlbmd0aCwgaW50IHJlY3ljbGVfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjeWNsZV9xdWV1ZV9sZW5ndGgsIFJhd1F1ZXVlICoqcmVjeWNsZSk7CisKKyAgLy8gRG9lc24ndCB1cGRhdGUgdGhlIGN1cnJlbnRseSByZWFkIGluZGV4ICh0aGUgcmVhZCBtZXNzYWdlcyBpbiB0aGUgcXVldWUgb3IKKyAgLy8gdGhlIGluZGV4KS4gVGhpcyBtZWFucyB0aGUgcmV0dXJuZWQgbWVzc2FnZSAoYW5kIGFueSBvdGhlcnMgc2tpcHBlZCB3aXRoCisgIC8vIGtGcm9tRW5kKSB3aWxsIGJlIGxlZnQgaW4gdGhlIHF1ZXVlLgorICAvLyBGb3IgcmVhZGluZyBvbmx5LgorICAvLyBOb3QgdmFsaWQgZm9yIFJlYWRNZXNzYWdlSW5kZXggY29tYmluZWQgd2l0aCBrRnJvbUVuZC4KKyAgc3RhdGljIGNvbnN0ZXhwciBPcHRpb25zPFJhd1F1ZXVlPjo6T3B0aW9uIGtQZWVrezB4MDAwMX07CisgIC8vIFJlYWRzIHRoZSBsYXN0IG1lc3NhZ2UgaW4gdGhlIHF1ZXVlIGluc3RlYWQgb2YganVzdCB0aGUgbmV4dCBvbmUuCisgIC8vIE5PVEU6IFRoaXMgcmVtb3ZlcyBhbGwgb2YgdGhlIG1lc3NhZ2VzIHVudGlsIHRoZSBsYXN0IG9uZSBmcm9tIHRoZSBxdWV1ZQorICAvLyAod2hpY2ggbWVhbnMgdGhhdCBub2JvZHkgZWxzZSB3aWxsIHJlYWQgdGhlbSkuCisgIC8vIEZvciByZWFkaW5nIG9ubHkuCisgIC8vIE5vdCB2YWxpZCBmb3IgUmVhZE1lc3NhZ2VJbmRleCBjb21iaW5lZCB3aXRoIGtQZWVrLgorICBzdGF0aWMgY29uc3RleHByIE9wdGlvbnM8UmF3UXVldWU+OjpPcHRpb24ga0Zyb21FbmR7MHgwMDAyfTsKKyAgLy8gQ2F1c2VzIHJlYWRzIHRvIHJldHVybiBOVUxMIGFuZCB3cml0ZXMgdG8gZmFpbCBpbnN0ZWFkIG9mIHdhaXRpbmcuCisgIC8vIEZvciByZWFkaW5nIGFuZCB3cml0aW5nLgorICBzdGF0aWMgY29uc3RleHByIE9wdGlvbnM8UmF3UXVldWU+OjpPcHRpb24ga05vbkJsb2NrezB4MDAwNH07CisgIC8vIENhdXNlcyB0aGluZ3MgdG8gYmxvY2suCisgIC8vIEZvciByZWFkaW5nIGFuZCB3cml0aW5nLgorICBzdGF0aWMgY29uc3RleHByIE9wdGlvbnM8UmF3UXVldWU+OjpPcHRpb24ga0Jsb2NrezB4MDAwOH07CisgIC8vIENhdXNlcyB3cml0ZXMgdG8gb3ZlcndyaXRlIHRoZSBvbGRlc3QgbWVzc2FnZSBpbiB0aGUgcXVldWUgaW5zdGVhZCBvZgorICAvLyBibG9ja2luZy4KKyAgLy8gRm9yIHdyaXRpbmcgb25seS4KKyAgc3RhdGljIGNvbnN0ZXhwciBPcHRpb25zPFJhd1F1ZXVlPjo6T3B0aW9uIGtPdmVycmlkZXsweDAwMTB9OworCisgIC8vIFdyaXRlcyBhIG1lc3NhZ2UgaW50byB0aGUgcXVldWUuCisgIC8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mIG1zZy4KKyAgLy8gTk9URTogbXNnIG11c3QgcG9pbnQgdG8gYSB2YWxpZCBtZXNzYWdlIGZyb20gdGhpcyBxdWV1ZQorICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gQSByZXR1cm4gdmFsdWUgb2YgZmFsc2UgbWVhbnMgbXNnIGhhcyBhbHJlYWR5IGJlZW4KKyAgLy8gZnJlZWQuCisgIGJvb2wgV3JpdGVNZXNzYWdlKHZvaWQgKm1zZywgT3B0aW9uczxSYXdRdWV1ZT4gb3B0aW9ucykgeworICAgIHN0YXRpYyBjb25zdGV4cHIgT3B0aW9uczxSYXdRdWV1ZT4ga1dyaXRlRmFpbHVyZU9wdGlvbnMgPQorICAgICAgICBrTm9uQmxvY2sgfCBrQmxvY2sgfCBrT3ZlcnJpZGU7CisgICAgaWYgKCFvcHRpb25zLk5vT3RoZXJzU2V0KGtXcml0ZUZhaWx1cmVPcHRpb25zKSkgeworICAgICAgTE9HKEZBVEFMLCAiaWxsZWdhbCB3cml0ZSBvcHRpb25zIGluICV4XG4iLCBvcHRpb25zLnByaW50YWJsZSgpKTsKKyAgICB9CisgICAgaWYgKCFvcHRpb25zLkV4YWN0bHlPbmVTZXQoa1dyaXRlRmFpbHVyZU9wdGlvbnMpKSB7CisgICAgICBMT0coRkFUQUwsICJpbnZhbGlkIHdyaXRlIG9wdGlvbnMgJXhcbiIsIG9wdGlvbnMucHJpbnRhYmxlKCkpOworICAgIH0KKyAgICByZXR1cm4gRG9Xcml0ZU1lc3NhZ2UobXNnLCBvcHRpb25zKTsKKyAgfQorCisgIC8vIFJlYWRzIGEgbWVzc2FnZSBvdXQgb2YgdGhlIHF1ZXVlLgorICAvLyBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGUgbGVuZ3RoIG9mIHRoaXMgcXVldWUncyB3b3J0aCBvZgorICAvLyB2YWxpZCBkYXRhIHdoZXJlIGl0J3MgcG9pbnRpbmcgdG8uCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgY29uc3QgYmVjYXVzZSBvdGhlciBwZW9wbGUgbWlnaHQgYmUgdmlld2luZyB0aGUgc2FtZQorICAvLyBtZXNzc2FnZS4gRG8gbm90IGNhc3QgdGhlIGNvbnN0IGF3YXkhCisgIC8vIElNUE9SVEFOVDogVGhlIHJldHVybiB2YWx1ZSAoaWYgbm90IE5VTEwpIG11c3QgZXZlbnR1YWxseSBiZSBwYXNzZWQgdG8KKyAgLy8gRnJlZU1lc3NhZ2UuCisgIGNvbnN0IHZvaWQgKlJlYWRNZXNzYWdlKE9wdGlvbnM8UmF3UXVldWU+IG9wdGlvbnMpIHsKKyAgICBDaGVja1JlYWRPcHRpb25zKG9wdGlvbnMpOworICAgIHJldHVybiBEb1JlYWRNZXNzYWdlKG9wdGlvbnMpOworICB9CisgIC8vIFRoZSBzYW1lIGFzIFJlYWRNZXNzYWdlLCBleGNlcHQgaXQgd2lsbCBuZXZlciByZXR1cm4gdGhlCisgIC8vIHNhbWUgbWVzc2FnZSB0d2ljZSAod2hlbiB1c2VkIHdpdGggdGhlIHNhbWUgaW5kZXggYXJndW1lbnQpLiBIb3dldmVyLAorICAvLyBtYXkgbm90IHJldHVybiBzb21lIG1lc3NhZ2VzIHRoYXQgcGFzcyB0aHJvdWdoIHRoZSBxdWV1ZS4KKyAgLy8gKmluZGV4IHNob3VsZCBzdGFydCBhcyAwLiBpbmRleCBkb2VzIG5vdCBoYXZlIHRvIGJlIGluIHNoYXJlZCBtZW1vcnksIGJ1dAorICAvLyBpdCBjYW4gYmUuCisgIC8vIENhbGxpbmcgd2l0aCBib3RoIGtQZWVrIGFuZCBrRnJvbUVuZCBpbiBvcHRpb25zIGlzbid0IHZhbGlkIGJlY2F1c2UgdGhhdAorICAvLyB3b3VsZCBtZWFuIGlnbm9yaW5nIGluZGV4LCB3aGljaCB3b3VsZCBtYWtlIHRoaXMgZnVuY3Rpb24gdGhlIHNhbWUgYXMKKyAgLy8gUmVhZE1lc3NhZ2UgKHdoaWNoIHNob3VsZCBiZSB1c2VkIGluc3RlYWQpLgorICBjb25zdCB2b2lkICpSZWFkTWVzc2FnZUluZGV4KE9wdGlvbnM8UmF3UXVldWU+IG9wdGlvbnMsIGludCAqaW5kZXgpIHsKKyAgICBDaGVja1JlYWRPcHRpb25zKG9wdGlvbnMpOworICAgIHN0YXRpYyBjb25zdGV4cHIgT3B0aW9uczxSYXdRdWV1ZT4ga0Zyb21FbmRBbmRQZWVrID0ga0Zyb21FbmQgfCBrUGVlazsKKyAgICBpZiAob3B0aW9ucy5BbGxTZXQoa0Zyb21FbmRBbmRQZWVrKSkgeworICAgICAgTE9HKEZBVEFMLCAiUmVhZE1lc3NhZ2VJbmRleChrRnJvbUVuZCB8IGtQZWVrKSBpcyBub3QgYWxsb3dlZFxuIik7CisgICAgfQorICAgIHJldHVybiBEb1JlYWRNZXNzYWdlSW5kZXgob3B0aW9ucywgaW5kZXgpOworICB9CisKKyAgLy8gUmV0cmlldmVzICgiYWxsb2NhdGVzIikgYSBtZXNzYWdlIHRoYXQgY2FuIHRoZW4gYmUgd3JpdHRlbiB0byB0aGUgcXVldWUuCisgIC8vIE5PVEU6IHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBjb21wbGV0ZWx5IHVuaW5pdGlhbGl6ZWQKKyAgLy8gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGhhdmUgYXQgbGVhc3QgdGhlIGxlbmd0aCBvZiB0aGlzIHF1ZXVlJ3Mgd29ydGggb2YKKyAgLy8gdmFsaWQgbWVtb3J5IHdoZXJlIGl0J3MgcG9pbnRpbmcgdG8uCisgIC8vIFJldHVybnMgTlVMTCBmb3IgZXJyb3IuCisgIC8vIElNUE9SVEFOVDogVGhlIHJldHVybiB2YWx1ZSAoaWYgbm90IE5VTEwpIG11c3QgZXZlbnR1YWxseSBiZSBwYXNzZWQgdG8KKyAgLy8gRnJlZU1lc3NhZ2Ugb3IgV3JpdGVNZXNzYWdlLgorICB2b2lkICpHZXRNZXNzYWdlKCk7CisKKyAgLy8gSXQgaXMgb2sgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aXRoIGEgTlVMTCBtc2cuCisgIHZvaWQgRnJlZU1lc3NhZ2UoY29uc3Qgdm9pZCAqbXNnKSB7CisgICAgaWYgKG1zZyAhPSBOVUxMKSBEZWNyZW1lbnRNZXNzYWdlUmVmZXJlbmNlQ291bnQobXNnKTsKKyAgfQorCisgIC8vIFVOU0FGRSEgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyZWUgbWVzc2FnZXMgd2UgaGF2ZS4gT25seSBzYWZlIHRvIHVzZSB3aGVuCisgIC8vIG9ubHkgMSB0YXNrIGlzIHVzaW5nIHRoaXMgb2JqZWN0IChpZSBpbiB0ZXN0cykuCisgIGludCBGcmVlTWVzc2FnZXMoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0cnVjdCBNZXNzYWdlSGVhZGVyOworCisgIC8vIFRoZSBwdWJsaWMgd3JhcHBlcnMgYXJvdW5kIHRoZXNlIGFyZSBpbmxpbmVkIGFuZCBkbyBhcmd1bWVudCBjaGVja2luZy4KKyAgYm9vbCBEb1dyaXRlTWVzc2FnZSh2b2lkICptc2csIE9wdGlvbnM8UmF3UXVldWU+IG9wdGlvbnMpOworICBjb25zdCB2b2lkICpEb1JlYWRNZXNzYWdlKE9wdGlvbnM8UmF3UXVldWU+IG9wdGlvbnMpOworICBjb25zdCB2b2lkICpEb1JlYWRNZXNzYWdlSW5kZXgoT3B0aW9uczxSYXdRdWV1ZT4gb3B0aW9ucywgaW50ICppbmRleCk7CisgIHZvaWQgQ2hlY2tSZWFkT3B0aW9ucyhPcHRpb25zPFJhd1F1ZXVlPiBvcHRpb25zKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBPcHRpb25zPFJhd1F1ZXVlPiBrVmFsaWRPcHRpb25zID0KKyAgICAgICAga1BlZWsgfCBrRnJvbUVuZCB8IGtOb25CbG9jayB8IGtCbG9jazsKKyAgICBpZiAoIW9wdGlvbnMuTm9PdGhlcnNTZXQoa1ZhbGlkT3B0aW9ucykpIHsKKyAgICAgIExPRyhGQVRBTCwgImlsbGVnYWwgcmVhZCBvcHRpb25zIGluICV4XG4iLCBvcHRpb25zLnByaW50YWJsZSgpKTsKKyAgICB9CisgICAgc3RhdGljIGNvbnN0ZXhwciBPcHRpb25zPFJhd1F1ZXVlPiBrQmxvY2tDaG9pY2VzID0ga05vbkJsb2NrIHwga0Jsb2NrOworICAgIGlmICghb3B0aW9ucy5FeGFjdGx5T25lU2V0KGtCbG9ja0Nob2ljZXMpKSB7CisgICAgICBMT0coRkFUQUwsICJpbnZhbGlkIHJlYWQgb3B0aW9ucyAleFxuIiwgb3B0aW9ucy5wcmludGFibGUoKSk7CisgICAgfQorICB9CisKKyAgLy8gQWRkcyAxIHRvIHRoZSBnaXZlbiBpbmRleCBhbmQgaGFuZGxlcyB3cmFwcGluZyBjb3JyZWN0bHkuCisgIGludCBpbmRleF9hZGQxKGludCBpbmRleCk7CisKKyAgYm9vbCBpc19yZWFkYWJsZSgpIHsgcmV0dXJuIGRhdGFfZW5kXyAhPSBkYXRhX3N0YXJ0XzsgfQorICBib29sIGlzX3dyaXRhYmxlKCkgeyByZXR1cm4gaW5kZXhfYWRkMShkYXRhX2VuZF8pICE9IGRhdGFfc3RhcnRfOyB9CisKKyAgLy8gVGhlc2UgbmV4dCA0IGFsbG93IGZpbmRpbmcgdGhlIHJpZ2h0IG9uZS4KKyAgY29uc3QgY2hhciAqbmFtZV87CisgIHNpemVfdCBsZW5ndGhfOworICBpbnQgaGFzaF87CisgIGludCBxdWV1ZV9sZW5ndGhfOworICAvLyBUaGUgbmV4dCBvbmUgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIHF1ZXVlcy4KKyAgUmF3UXVldWUgKm5leHRfOworCisgIFJhd1F1ZXVlICpyZWN5Y2xlXzsKKworICBNdXRleCBkYXRhX2xvY2tfOyAgLy8gcHJvdGVjdHMgb3BlcmF0aW9ucyBvbiBkYXRhXyBldGMKKyAgLy8gQWx3YXlzIGdldHMgYnJvYWRjYXN0ZWQgdG8gYmVjYXVzZSBkaWZmZXJlbnQgcmVhZGVycyBtaWdodCBoYXZlIGRpZmZlcmVudAorICAvLyBpZGVhcyBvZiB3aGF0ICJyZWFkYWJsZSIgbWVhbnMgKGllIG9uZXMgdXNpbmcgc2VwYXJhdGVkIGluZGljZXMpLgorICBDb25kaXRpb24gcmVhZGFibGVfOworICBDb25kaXRpb24gd3JpdGFibGVfOworICBpbnQgZGF0YV9sZW5ndGhfOyAgLy8gbWF4IGxlbmd0aCBpbnRvIGRhdGEgKyAxCisgIGludCBkYXRhX3N0YXJ0XzsgIC8vIGlzIGFuIGluZGV4IGludG8gZGF0YQorICBpbnQgZGF0YV9lbmRfOyAgLy8gaXMgYW4gaW5kZXggaW50byBkYXRhCisgIGludCBtZXNzYWdlc187ICAvLyB0aGF0IGhhdmUgcGFzc2VkIHRocm91Z2gKKyAgdm9pZCAqKmRhdGFfOyAgLy8gYXJyYXkgb2YgbWVzc2FnZXMgKHdpdGggaGVhZGVycykKKworICBzaXplX3QgbXNnX2xlbmd0aF87ICAvLyBzaXplb2YoZWFjaCBtZXNzYWdlKSBpbmNsdWRpbmcgdGhlIGhlYWRlcgorICAvLyBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGluIHRoZSBsaW5rZWQgbGlzdCBvZiBmcmVlIG1lc3NhZ2VzLgorICBNZXNzYWdlSGVhZGVyICpmcmVlX21lc3NhZ2VzXzsKKworICAvLyBLZWVwcyB0cmFjayBvZiBpZiB0aGUgcXVldWUgd2FzIHdyaXRhYmxlIGJlZm9yZSBhIHJlYWQgc28gd2UgY2FuIFNpZ25hbCgpIGEKKyAgLy8gcmVhZGVyIGlmIHdlIHRyYW5zaXRpb24gaXQuCisgIGJvb2wgd3JpdGFibGVfc3RhcnRfOworCisgIC8vIFRydWUgaWZmIHNvbWVib2R5IGlzIGN1cnJlbnRseSBXYWl0KClpbmcgb24gcmVhZGFibGVfLgorICAvLyBTZXQgdG8gdHJ1ZSBieSBlYWNoIHJlYWRlciBiZWZvcmUgY2FsbGluZyBXYWl0KCkgYW5kIHNldCBiYWNrIHRvIGZhbHNlCisgIC8vIGJlZm9yZSB0aGUgQnJvYWRjYXN0KCkuCisgIGJvb2wgcmVhZGFibGVfd2FpdGluZ187CisKKyAgLy8gQWN0dWFsbHkgZnJlZXMgdGhlIGdpdmVuIG1lc3NhZ2UuCisgIHZvaWQgRG9GcmVlTWVzc2FnZShjb25zdCB2b2lkICptc2cpOworICAvLyBDYWxscyBEb0ZyZWVNZXNzYWdlIGlmIGFwcHJvcHJpYXRlLgorICB2b2lkIERlY3JlbWVudE1lc3NhZ2VSZWZlcmVuY2VDb3VudChjb25zdCB2b2lkICptc2cpOworICAvLyBPbmx5IGRvZXMgdGhlIGFjdHVhbCBpbmNyZW1lbnRpbmcgb2YgdGhlIHJlZmVyZW5jZSBjb3VudC4KKyAgdm9pZCBJbmNyZW1lbnRNZXNzYWdlUmVmZXJlbmNlQ291bnQoY29uc3Qgdm9pZCAqbXNnKSBjb25zdDsKKworICAvLyBNdXN0IGJlIGNhbGxlZCB3aXRoIGRhdGFfbG9ja18gbG9ja2VkLgorICAvLyAqcmVhZF9kYXRhIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgIC8vIFJldHVybnMgd2l0aCBhIHJlYWRhYmxlIG1lc3NhZ2UgaW4gZGF0YV8gb3IgZmFsc2UuCisgIGJvb2wgUmVhZENvbW1vblN0YXJ0KE9wdGlvbnM8UmF3UXVldWU+IG9wdGlvbnMsIGludCAqaW5kZXgpOworICAvLyBEZWFscyB3aXRoIHNldHRpbmcvdW5zZXR0aW5nIHJlYWRhYmxlXyBhbmQgd3JpdGFibGVfLgorICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBkYXRhX2xvY2tfIGhhcyBiZWVuIHVubG9ja2VkLgorICAvLyByZWFkX2RhdGEgc2hvdWxkIGJlIHRoZSBzYW1lIHRoaW5nIHRoYXQgd2FzIHBhc3NlZCBpbiB0byBSZWFkQ29tbW9uU3RhcnQuCisgIHZvaWQgUmVhZENvbW1vbkVuZCgpOworICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBtZXNzYWdlLgorICAvLyBVc2VmdWwgZm9yIHJlYWRpbmcgd2l0aCBrUGVlay4KKyAgaW50IExhc3RNZXNzYWdlSW5kZXgoKSBjb25zdDsKKworICAvLyBHZXRzIGNhbGxlZCBieSBGZXRjaCB3aGVuIG5lY2Vzc2FyeSAod2l0aCBwbGFjZW1lbnQgbmV3KS4KKyAgUmF3UXVldWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbmd0aCwgaW50IGhhc2gsIGludCBxdWV1ZV9sZW5ndGgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19MSU5VWF9DT0RFX0lQQ19MSUJfUVVFVUVfSF8KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2lwY19saWIvcmF3X3F1ZXVlX3Rlc3QuY2MgYi9hb3MvbGludXhfY29kZS9pcGNfbGliL3Jhd19xdWV1ZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjg0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9pcGNfbGliL3Jhd19xdWV1ZV90ZXN0LmNjCkBAIC0wLDAgKzEsMTAzMiBAQAorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvcXVldWUuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL2NvcmVfbGliLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWVfdGVzdHV0aWxzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2RpZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC90aHJlYWQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvb3B0aW9ucy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9kZWF0aF90ZXN0X2xvZ19pbXBsZW1lbnRhdGlvbi5oIgorCit1c2luZyA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdDsKK3VzaW5nIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzczsKK3VzaW5nIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZTsKK3VzaW5nIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6Okdsb2JhbENvcmVJbnN0YW5jZTsKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoZSBzYW1lIGNvbnN0YW50IGZyb20gcXVldWUuY2MuIFRoaXMgd2lsbCBoYXZlIHRvIGJlIHVwZGF0ZWQgaWYgdGhhdCBvbmUgaXMuCitjb25zdCBpbnQga0V4dHJhTWVzc2FnZXMgPSAyMDsKKworY2xhc3MgUmF3UXVldWVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGYWlsdXJlU2l6ZSA9IDQwMDsKKyAgc3RhdGljIGNoYXIgKmZhdGFsX2ZhaWx1cmU7CisgcHJpdmF0ZToKKyAgZW51bSBjbGFzcyBSZXN1bHRUeXBlIDogdWludDhfdCB7CisgICAgTm90Q2FsbGVkLAorICAgIENhbGxlZCwKKyAgICBSZXR1cm5lZCwKKyAgfTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgUmVzdWx0VHlwZVN0cmluZyh2b2xhdGlsZSBjb25zdCBSZXN1bHRUeXBlICZyZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgY2FzZSBSZXN1bHRUeXBlOjpSZXR1cm5lZDoKKyAgICAgICAgcmV0dXJuICJSZXR1cm5lZCI7CisgICAgICBjYXNlIFJlc3VsdFR5cGU6OkNhbGxlZDoKKyAgICAgICAgcmV0dXJuICJDYWxsZWQiOworICAgICAgY2FzZSBSZXN1bHRUeXBlOjpOb3RDYWxsZWQ6CisgICAgICAgIHJldHVybiAiTm90Q2FsbGVkIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygidW5rbm93bigiKSArCisgICAgICAgICAgICAgICA6OnN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdCkpICsgIikiOworICAgIH0KKyAgfQorICBzdGF0aWNfYXNzZXJ0KGFvczo6c2htX29rPFJlc3VsdFR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAidGhpcyB3aWxsIGdldCBwdXQgaW4gc2hhcmVkIG1lbW9yeSIpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgRnVuY3Rpb25Ub0NhbGwgeworICAgIEZ1bmN0aW9uVG9DYWxsKCkgOiByZXN1bHQoUmVzdWx0VHlwZTo6Tm90Q2FsbGVkKSwgc3RhcnRlZCgpIHsKKyAgICB9CisKKyAgICB2b2xhdGlsZSBSZXN1bHRUeXBlIHJlc3VsdDsKKyAgICBib29sIGV4cGVjdGVkOworICAgIHZvaWQgKCpmdW5jdGlvbikoVCosIGNoYXIqKTsKKyAgICBUICphcmc7CisgICAgdm9sYXRpbGUgY2hhciBmYWlsdXJlW2tGYWlsdXJlU2l6ZV07CisgICAgYW9zX2Z1dGV4IHN0YXJ0ZWQ7CisgIH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB2b2lkIEhhbmdzXyhGdW5jdGlvblRvQ2FsbDxUPiAqY29uc3QgdG9fY2FsbCkgeworICAgIHRpbWU6OlNsZWVwRm9yKHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjAxKSk7CisgICAgQVNTRVJUX0VRKDEsIGZ1dGV4X3NldCgmdG9fY2FsbC0+c3RhcnRlZCkpOworICAgIHRvX2NhbGwtPnJlc3VsdCA9IFJlc3VsdFR5cGU6OkNhbGxlZDsKKyAgICB0b19jYWxsLT5mdW5jdGlvbih0b19jYWxsLT5hcmcsIGNvbnN0X2Nhc3Q8Y2hhciAqPih0b19jYWxsLT5mYWlsdXJlKSk7CisgICAgdG9fY2FsbC0+cmVzdWx0ID0gUmVzdWx0VHlwZTo6UmV0dXJuZWQ7CisgIH0KKworICAvLyBIb3cgbG9uZyB1bnRpbCBhIGZ1bmN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBodW5nLgorICBzdGF0aWMgY29uc3RleHByIHRpbWU6OlRpbWUga0hhbmdUaW1lID0gdGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMDkpOworICAvLyBIb3cgbG9uZyB0byBzbGVlcCBhZnRlciBmb3JraW5nIChmb3IgZGVidWdnaW5nKS4KKyAgc3RhdGljIGNvbnN0ZXhwciB0aW1lOjpUaW1lIGtGb3JrU2xlZXAgPSB0aW1lOjpUaW1lOjpJblNlY29uZHMoMCk7CisKKyAgLy8gUmVwcmVzZW50cyBhIHByb2Nlc3MgdGhhdCBoYXMgYmVlbiBmb3JrZWQgb2ZmLiBUaGUgZGVzdHJ1Y3RvciBraWxscyB0aGUKKyAgLy8gcHJvY2VzcyBhbmQgd2FpdCgyKXMgZm9yIGl0LgorICBjbGFzcyBGb3JrZWRQcm9jZXNzIHsKKyAgIHB1YmxpYzoKKyAgICBGb3JrZWRQcm9jZXNzKHBpZF90IHBpZCwgYW9zX2Z1dGV4ICpkb25lKQorICAgICAgICA6IHBpZF8ocGlkKSwgZG9uZV8oZG9uZSksIGV4aXRpbmdfKGZhbHNlKSB7fTsKKyAgICB+Rm9ya2VkUHJvY2VzcygpIHsKKyAgICAgIGlmICghZXhpdGluZ18pIHsKKyAgICAgICAgaWYgKGtpbGwocGlkXywgU0lHVEVSTSkgPT0gLTEpIHsKKyAgICAgICAgICBpZiAoZXJybm8gPT0gRVNSQ0gpIHsKKyAgICAgICAgICAgIHByaW50ZigicHJvY2VzcyAlamQgd2FzIGFscmVhZHkgZGVhZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnRtYXhfdD4ocGlkXykpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HKEZBVEFMLCAia2lsbChTSUdLSUxMLCAlamQpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludG1heF90PihwaWRfKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBjb25zdCBwaWRfdCByZXQgPSB3YWl0KE5VTEwpOworICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICBMT0coV0FSTklORywgIndhaXQoTlVMTCkgZmFpbGVkLiIKKyAgICAgICAgICAgICIgY2hpbGQgJWpkIG1pZ2h0IHN0aWxsIGJlIGFsaXZlXG4iLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50bWF4X3Q+KHBpZF8pKTsKKyAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgICAgTE9HKFdBUk5JTkcsICJjaGlsZCAlamQgd2Fzbid0IHdhaXRhYmxlLiBpdCBtaWdodCBzdGlsbCBiZSBhbGl2ZVxuIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludG1heF90PihwaWRfKSk7CisgICAgICB9IGVsc2UgaWYgKHJldCAhPSBwaWRfKSB7CisgICAgICAgIExPRyhXQVJOSU5HLCAiY2hpbGQgJWQgaXMgbm93IGNvbmZpcm1lZCBkZWFkIgorICAgICAgICAgICAgIiwgYnV0IGNoaWxkICVqZCBtaWdodCBzdGlsbCBiZSBhbGl2ZVxuIiwKKyAgICAgICAgICAgIHJldCwgc3RhdGljX2Nhc3Q8aW50bWF4X3Q+KHBpZF8pKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIGNsYXNzIEpvaW5SZXN1bHQgeworICAgICAgRmluaXNoZWQsIEh1bmcsIEVycm9yCisgICAgfTsKKyAgICBKb2luUmVzdWx0IEpvaW4odGltZTo6VGltZSB0aW1lb3V0ID0ga0hhbmdUaW1lKSB7CisgICAgICB0aW1lc3BlYyBkb25lX3RpbWVvdXQgPSAoa0ZvcmtTbGVlcCArIHRpbWVvdXQpLlRvVGltZXNwZWMoKTsKKyAgICAgIHN3aXRjaCAoZnV0ZXhfd2FpdF90aW1lb3V0KGRvbmVfLCAmZG9uZV90aW1lb3V0KSkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgcmV0dXJuIEpvaW5SZXN1bHQ6Okh1bmc7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBleGl0aW5nXyA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIEpvaW5SZXN1bHQ6OkZpbmlzaGVkOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBKb2luUmVzdWx0OjpFcnJvcjsKKyAgICAgIH0KKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgcGlkX3QgcGlkXzsKKyAgICBhb3NfZnV0ZXggKmNvbnN0IGRvbmVfOworICAgIC8vIFRydWUgaWZmIHdlIGtub3cgdGhhdCB0aGUgcHJvY2VzcyBpcyBhbHJlYWR5IGV4aXRpbmcuCisgICAgYm9vbCBleGl0aW5nXzsKKyAgfSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKKworICAvLyBTdGF0ZSBmb3IgSGFuZ3NGb3JrIGFuZCBIYW5nc0NoZWNrLgorICB0eXBlZGVmIHVpbnQ4X3QgQ2hpbGRJRDsKKyAgc3RhdGljIHZvaWQgUmVhcEV4aXRIYW5kbGVyKCkgeworICAgIGZvciAoYXV0byBpdCA9IGNoaWxkcmVuXy5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbl8uZW5kKCk7ICsraXQpIHsKKyAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgIH0KKyAgfQorICBzdGF0aWMgc3RkOjptYXA8Q2hpbGRJRCwgRm9ya2VkUHJvY2VzcyAqPiBjaGlsZHJlbl87CisgIHN0ZDo6bWFwPENoaWxkSUQsIEZ1bmN0aW9uVG9DYWxsPHZvaWQ+ICo+IHRvX2NhbGxzXzsKKworICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIDo6dGVzdGluZzo6VGVzdDo6U2V0VXAoKTsKKworICAgIFNldERpZVRlc3RNb2RlKHRydWUpOworCisgICAgZmF0YWxfZmFpbHVyZSA9IHN0YXRpY19jYXN0PGNoYXIgKj4oc2htX21hbGxvYyhzaXplb2YoZmF0YWxfZmFpbHVyZSkpKTsKKyAgICBzdGF0aWMgYm9vbCByZWdpc3RlcmVkID0gZmFsc2U7CisgICAgaWYgKCFyZWdpc3RlcmVkKSB7CisgICAgICBhdGV4aXQoUmVhcEV4aXRIYW5kbGVyKTsKKyAgICAgIHJlZ2lzdGVyZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aXRoIGFyZyBpbiBhIGZvcmtlZCBwcm9jZXNzLgorICAvLyBMZWFrcyBzaGFyZWQgbWVtb3J5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKQorICBzdGQ6OnVuaXF1ZV9wdHI8Rm9ya2VkUHJvY2Vzcz4gRm9ya0V4ZWN1dGUodm9pZCAoKmZ1bmN0aW9uKShUKiksIFQgKmFyZykgeworICAgIGFvc19mdXRleCAqZG9uZSA9IHN0YXRpY19jYXN0PGFvc19mdXRleCAqPihzaG1fbWFsbG9jX2FsaWduZWQoCisgICAgICAgICAgICBzaXplb2YoKmRvbmUpLCBhbGlnbm9mKGFvc19mdXRleCkpKTsKKyAgICAqZG9uZSA9IDA7CisgICAgY29uc3QgcGlkX3QgcGlkID0gZm9yaygpOworICAgIHN3aXRjaCAocGlkKSB7CisgICAgICBjYXNlIDA6ICAvLyBjaGlsZAorICAgICAgICBpZiAoa0ZvcmtTbGVlcCAhPSB0aW1lOjpUaW1lKDAsIDApKSB7CisgICAgICAgICAgTE9HKElORk8sICJwaWQgJWpkIHNsZWVwaW5nIGZvciAlZHMlZG5zXG4iLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnRtYXhfdD4oZ2V0cGlkKCkpLAorICAgICAgICAgICAgICBrRm9ya1NsZWVwLnNlYygpLCBrRm9ya1NsZWVwLm5zZWMoKSk7CisgICAgICAgICAgdGltZTo6U2xlZXBGb3Ioa0ZvcmtTbGVlcCk7CisgICAgICAgIH0KKyAgICAgICAgOjphb3M6OmNvbW1vbjo6dGVzdGluZzo6UHJldmVudEV4aXQoKTsKKyAgICAgICAgZnVuY3Rpb24oYXJnKTsKKyAgICAgICAgQ0hFQ0tfTkUoLTEsIGZ1dGV4X3NldChkb25lKSk7CisgICAgICAgIGV4aXQoRVhJVF9TVUNDRVNTKTsKKyAgICAgIGNhc2UgLTE6ICAvLyBwYXJlbnQgZmFpbHVyZQorICAgICAgICBQTE9HKEVSUk9SLCAiZm9yaygpIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEZvcmtlZFByb2Nlc3M+KCk7CisgICAgICBkZWZhdWx0OiAgLy8gcGFyZW50CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8Rm9ya2VkUHJvY2Vzcz4obmV3IEZvcmtlZFByb2Nlc3MocGlkLCBkb25lKSk7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBmdW5jdGlvbiBoYW5ncy4KKyAgLy8gZXhwZWN0ZWQgaXMgd2hldGhlciB0byByZXR1cm4gc3VjY2VzcyBvciBmYWlsdXJlIGlmIHRoZSBmdW5jdGlvbiBoYW5ncworICAvLyBOT1RFOiBUaGVyZSBhcmUgb3RoZXIgcmVhc29ucyBmb3IgaXQgdG8gcmV0dXJuIGEgZmFpbHVyZSB0aGFuIHRoZSBmdW5jdGlvbgorICAvLyBkb2luZyB0aGUgd3JvbmcgdGhpbmcuCisgIC8vIExlYWtzIHNoYXJlZCBtZW1vcnkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIEFzc2VydGlvblJlc3VsdCBIYW5ncyh2b2lkICgqZnVuY3Rpb24pKFQqLCBjaGFyKiksIFQgKmFyZywgYm9vbCBleHBlY3RlZCkgeworICAgIEFzc2VydGlvblJlc3VsdCBmb3JrX3Jlc3VsdChIYW5nc0Zvcms8VD4oZnVuY3Rpb24sIGFyZywgZXhwZWN0ZWQsIDApKTsKKyAgICBpZiAoIWZvcmtfcmVzdWx0KSB7CisgICAgICByZXR1cm4gZm9ya19yZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBIYW5nc0NoZWNrKDApOworICB9CisgIC8vIFN0YXJ0cyB0aGUgZmlyc3QgcGFydCBvZiBIYW5ncy4KKyAgLy8gVXNlIEhhbmdzQ2hlY2sgdG8gZ2V0IHRoZSByZXN1bHQuCisgIC8vIFJldHVybnMgd2hldGhlciB0aGUgZm9yayBzdWNjZWVkZWQgb3Igbm90LCBOT1Qgd2hldGhlciBvciBub3QgdGhlIGhhbmcKKyAgLy8gY2hlY2sgc3VjY2VlZGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBBc3NlcnRpb25SZXN1bHQgSGFuZ3NGb3JrKHZvaWQgKCpmdW5jdGlvbikoVCosIGNoYXIgKiksIFQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGVjdGVkLCBDaGlsZElEIGlkKSB7CisgICAgc3RhdGljX2Fzc2VydChhb3M6OnNobV9vazxGdW5jdGlvblRvQ2FsbDxUPj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInRoaXMgaXMgZ29pbmcgaW50byBzaGFyZWQgbWVtb3J5Iik7CisgICAgRnVuY3Rpb25Ub0NhbGw8VD4gKmNvbnN0IHRvX2NhbGwgPQorICAgICAgICBzdGF0aWNfY2FzdDxGdW5jdGlvblRvQ2FsbDxUPiAqPigKKyAgICAgICAgICAgIHNobV9tYWxsb2NfYWxpZ25lZChzaXplb2YoKnRvX2NhbGwpLCBhbGlnbm9mKEZ1bmN0aW9uVG9DYWxsPFQ+KSkpOworICAgIG5ldyAodG9fY2FsbCkgRnVuY3Rpb25Ub0NhbGw8VD4oKTsKKyAgICB0b19jYWxsLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgIHRvX2NhbGwtPmFyZyA9IGFyZzsKKyAgICB0b19jYWxsLT5leHBlY3RlZCA9IGV4cGVjdGVkOworICAgIHRvX2NhbGwtPmZhaWx1cmVbMF0gPSAnXDAnOworICAgIHN0YXRpY19jYXN0PGNoYXIgKj4oZmF0YWxfZmFpbHVyZSlbMF0gPSAnXDAnOworICAgIGNoaWxkcmVuX1tpZF0gPSBGb3JrRXhlY3V0ZShIYW5nc18sIHRvX2NhbGwpLnJlbGVhc2UoKTsKKyAgICBpZiAoIWNoaWxkcmVuX1tpZF0pIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkZvcmtFeGVjdXRlIGZhaWxlZCI7CisgICAgQ0hFQ0tfRVEoMCwgZnV0ZXhfd2FpdCgmdG9fY2FsbC0+c3RhcnRlZCkpOworICAgIHRvX2NhbGxzX1tpZF0gPSByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uVG9DYWxsPHZvaWQ+ICo+KHRvX2NhbGwpOworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKyAgLy8gQ2hlY2tzIHdoZXRoZXIgb3Igbm90IGEgZnVuY3Rpb24gaHVuZyBsaWtlIGl0IHdhcyBzdXBwb3NlZCB0by4KKyAgLy8gVXNlIEhhbmdzRm9yayBmaXJzdC4KKyAgLy8gTk9URTogY2FsbHMgdG8gSGFuZ3NGb3JrIGFuZCBIYW5nc0NoZWNrIHdpdGggdGhlIHNhbWUgaWQgYXJndW1lbnQgd2lsbAorICAvLyBjb3JyZXNwb25kLCBidXQgdGhleSBkbyBub3QgbmVzdC4gQWxzbywgaWQgMCBpcyB1c2VkIGJ5IEhhbmdzLgorICAvLyBSZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgYXMgSGFuZ3MuCisgIEFzc2VydGlvblJlc3VsdCBIYW5nc0NoZWNrKENoaWxkSUQgaWQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Rm9ya2VkUHJvY2Vzcz4gY2hpbGQoY2hpbGRyZW5fW2lkXSk7CisgICAgY2hpbGRyZW5fLmVyYXNlKGlkKTsKKyAgICBjb25zdCBGb3JrZWRQcm9jZXNzOjpKb2luUmVzdWx0IHJlc3VsdCA9IGNoaWxkLT5Kb2luKCk7CisgICAgaWYgKHRvX2NhbGxzX1tpZF0tPmZhaWx1cmVbMF0gIT0gJ1wwJykgeworICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiZnVuY3Rpb24gc2F5czogIgorICAgICAgICAgIDw8IGNvbnN0X2Nhc3Q8Y2hhciAqPih0b19jYWxsc19baWRdLT5mYWlsdXJlKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA9PSBGb3JrZWRQcm9jZXNzOjpKb2luUmVzdWx0OjpGaW5pc2hlZCkgeworICAgICAgcmV0dXJuICF0b19jYWxsc19baWRdLT5leHBlY3RlZCA/IEFzc2VydGlvblN1Y2Nlc3MoKSA6IChBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgICAgICA8PCAic29tZXRoaW5nIGhhcHBlbmVkIGFuZCB0aGUgdGhlIHRlc3Qgb25seSBnb3QgdG8gIgorICAgICAgICAgIDw8IFJlc3VsdFR5cGVTdHJpbmcodG9fY2FsbHNfW2lkXS0+cmVzdWx0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh0b19jYWxsc19baWRdLT5yZXN1bHQgPT0gUmVzdWx0VHlwZTo6Q2FsbGVkKSB7CisgICAgICAgIHJldHVybiB0b19jYWxsc19baWRdLT5leHBlY3RlZCA/IEFzc2VydGlvblN1Y2Nlc3MoKSA6CisgICAgICAgICAgICBBc3NlcnRpb25GYWlsdXJlKCk7CisgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBGb3JrZWRQcm9jZXNzOjpKb2luUmVzdWx0OjpFcnJvcikgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJlcnJvciBqb2luaW5nIGNoaWxkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0b19jYWxsc19baWRdLT5yZXN1bHQgPT0gUmVzdWx0VHlwZTo6Tm90Q2FsbGVkKSB7CisgICAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAic3R1ZmYgdG9vayB0b28gbG9uZyBnZXR0aW5nIHN0YXJ0ZWQiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgInNvbWV0aGluZyB3ZWlyZCBoYXBwZW5lZCI7CisgICAgICB9CisgICAgfQorICB9CisjZGVmaW5lIEVYUEVDVF9IQU5HUyhmdW5jdGlvbiwgYXJnKSBcCisgIEVYUEVDVF9IQU5HU19DT05EKGZ1bmN0aW9uLCBhcmcsIHRydWUsIEVYUEVDVF9UUlVFKQorI2RlZmluZSBFWFBFQ1RfUkVUVVJOUyhmdW5jdGlvbiwgYXJnKSBcCisgIEVYUEVDVF9IQU5HU19DT05EKGZ1bmN0aW9uLCBhcmcsIGZhbHNlLCBFWFBFQ1RfVFJVRSkKKyNkZWZpbmUgRVhQRUNUX1JFVFVSTlNfRkFJTFMoZnVuY3Rpb24sIGFyZykgXAorICBFWFBFQ1RfSEFOR1NfQ09ORChmdW5jdGlvbiwgYXJnLCBmYWxzZSwgRVhQRUNUX0ZBTFNFKQorI2RlZmluZSBFWFBFQ1RfSEFOR1NfQ09ORChmdW5jdGlvbiwgYXJnLCBoYW5ncywgY29uZCkgZG8geyBcCisgIGNvbmQoSGFuZ3MoZnVuY3Rpb24sIGFyZywgaGFuZ3MpKTsgXAorICBpZiAoZmF0YWxfZmFpbHVyZVswXSAhPSAnXDAnKSB7IFwKKyAgICBGQUlMKCkgPDwgZmF0YWxfZmFpbHVyZTsgXAorICB9IFwKK30gd2hpbGUgKGZhbHNlKQorCisgIHN0cnVjdCBUZXN0TWVzc2FnZSB7CisgICAgLy8gU29tZSBjb250ZW50cyBiZWNhdXNlIHdlIGRvbid0IHJlYWxseSB3YW50IHRvIHRlc3QgZW1wdHkgbWVzc2FnZXMuCisgICAgaW50MTZfdCBkYXRhOworICB9OworICBzdHJ1Y3QgTWVzc2FnZUFyZ3MgeworICAgIFJhd1F1ZXVlICpjb25zdCBxdWV1ZTsKKyAgICBPcHRpb25zPFJhd1F1ZXVlPiBmbGFnczsKKyAgICBpbnQxNl90IGRhdGE7ICAvLyAtMSBtZWFucyBOVUxMIGV4cGVjdGVkCisgIH07CisgIHN0YXRpYyB2b2lkIFdyaXRlVGVzdE1lc3NhZ2UoTWVzc2FnZUFyZ3MgKmFyZ3MsIGNoYXIgKmZhaWx1cmUpIHsKKyAgICBUZXN0TWVzc2FnZSAqbXNnID0gc3RhdGljX2Nhc3Q8VGVzdE1lc3NhZ2UgKj4oYXJncy0+cXVldWUtPkdldE1lc3NhZ2UoKSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKSB7CisgICAgICBzbnByaW50ZihmYXRhbF9mYWlsdXJlLCBrRmFpbHVyZVNpemUsCisgICAgICAgICAgICAgICAiY291bGRuJ3QgZ2V0X21zZyBmcm9tICVwIiwgYXJncy0+cXVldWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtc2ctPmRhdGEgPSBhcmdzLT5kYXRhOworICAgIGlmICghYXJncy0+cXVldWUtPldyaXRlTWVzc2FnZShtc2csIGFyZ3MtPmZsYWdzKSkgeworICAgICAgc25wcmludGYoZmFpbHVyZSwga0ZhaWx1cmVTaXplLCAiJXAtPldyaXRlTWVzc2FnZSglcCwgJXgpIGZhaWxlZCIsCisgICAgICAgICAgICAgICBhcmdzLT5xdWV1ZSwgbXNnLCBhcmdzLT5mbGFncy5wcmludGFibGUoKSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIFJlYWRUZXN0TWVzc2FnZShNZXNzYWdlQXJncyAqYXJncywgY2hhciAqZmFpbHVyZSkgeworICAgIGNvbnN0IFRlc3RNZXNzYWdlICptc2cgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgICAgYXJncy0+cXVldWUtPlJlYWRNZXNzYWdlKGFyZ3MtPmZsYWdzKSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKSB7CisgICAgICBpZiAoYXJncy0+ZGF0YSAhPSAtMSkgeworICAgICAgICBzbnByaW50ZihmYWlsdXJlLCBrRmFpbHVyZVNpemUsCisgICAgICAgICAgICAgICAgICJleHBlY3RlZCBkYXRhIG9mICUiIFBSSWQxNiAiIGJ1dCBnb3QgTlVMTCBtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgYXJncy0+ZGF0YSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChhcmdzLT5kYXRhICE9IG1zZy0+ZGF0YSkgeworICAgICAgICBzbnByaW50ZihmYWlsdXJlLCBrRmFpbHVyZVNpemUsCisgICAgICAgICAgICAgICAgICJleHBlY3RlZCBkYXRhIG9mICUiIFBSSWQxNiAiIGJ1dCBnb3QgJSIgUFJJZDE2ICIgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgIGFyZ3MtPmRhdGEsIG1zZy0+ZGF0YSk7CisgICAgICB9CisgICAgICBhcmdzLT5xdWV1ZS0+RnJlZU1lc3NhZ2UobXNnKTsKKyAgICB9CisgIH0KKworICB2b2lkIFB1c2hNZXNzYWdlKFJhd1F1ZXVlICpxdWV1ZSwgdWludDE2X3QgZGF0YSkgeworICAgIFRlc3RNZXNzYWdlICptZXNzYWdlID0gc3RhdGljX2Nhc3Q8VGVzdE1lc3NhZ2UgKj4ocXVldWUtPkdldE1lc3NhZ2UoKSk7CisgICAgbWVzc2FnZS0+ZGF0YSA9IGRhdGE7CisgICAgQVNTRVJUX1RSVUUocXVldWUtPldyaXRlTWVzc2FnZShtZXNzYWdlLCBSYXdRdWV1ZTo6a092ZXJyaWRlKSk7CisgIH0KKworIHByaXZhdGU6CisgIEdsb2JhbENvcmVJbnN0YW5jZSBteV9jb3JlOworfTsKKworY2hhciAqUmF3UXVldWVUZXN0OjpmYXRhbF9mYWlsdXJlOworc3RkOjptYXA8UmF3UXVldWVUZXN0OjpDaGlsZElELCBSYXdRdWV1ZVRlc3Q6OkZvcmtlZFByb2Nlc3MgKj4KKyAgICBSYXdRdWV1ZVRlc3Q6OmNoaWxkcmVuXzsKK2NvbnN0ZXhwciB0aW1lOjpUaW1lIFJhd1F1ZXVlVGVzdDo6a0hhbmdUaW1lOworY29uc3RleHByIHRpbWU6OlRpbWUgUmF3UXVldWVUZXN0OjprRm9ya1NsZWVwOworCit0eXBlZGVmIFJhd1F1ZXVlVGVzdCBSYXdRdWV1ZURlYXRoVGVzdDsKKworVEVTVF9GKFJhd1F1ZXVlVGVzdCwgUmVhZGluZykgeworICBSYXdRdWV1ZSAqY29uc3QgcXVldWUgPSBSYXdRdWV1ZTo6RmV0Y2goIlF1ZXVlIiwgc2l6ZW9mKFRlc3RNZXNzYWdlKSwgMSwgMSk7CisgIE1lc3NhZ2VBcmdzIGFyZ3N7cXVldWUsIFJhd1F1ZXVlOjprQmxvY2ssIC0xfTsKKworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtOb25CbG9jazsKKyAgRVhQRUNUX1JFVFVSTlMoUmVhZFRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrOworICBFWFBFQ1RfUkVUVVJOUyhSZWFkVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprQmxvY2s7CisgIEVYUEVDVF9IQU5HUyhSZWFkVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprUGVlayB8IFJhd1F1ZXVlOjprQmxvY2s7CisgIEVYUEVDVF9IQU5HUyhSZWFkVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgYXJncy5kYXRhID0gMjU0OworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtCbG9jazsKKyAgRVhQRUNUX1JFVFVSTlMoV3JpdGVUZXN0TWVzc2FnZSwgJmFyZ3MpOworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtQZWVrIHwgUmF3UXVldWU6OmtCbG9jazsKKyAgRVhQRUNUX1JFVFVSTlMoUmVhZFRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a1BlZWsgfCBSYXdRdWV1ZTo6a0Jsb2NrOworICBFWFBFQ1RfUkVUVVJOUyhSZWFkVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprUGVlayB8IFJhd1F1ZXVlOjprTm9uQmxvY2s7CisgIEVYUEVDVF9SRVRVUk5TKFJlYWRUZXN0TWVzc2FnZSwgJmFyZ3MpOworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtCbG9jazsKKyAgRVhQRUNUX1JFVFVSTlMoUmVhZFRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a0Jsb2NrOworICBhcmdzLmRhdGEgPSAtMTsKKyAgRVhQRUNUX0hBTkdTKFJlYWRUZXN0TWVzc2FnZSwgJmFyZ3MpOworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtOb25CbG9jazsKKyAgRVhQRUNUX1JFVFVSTlMoUmVhZFRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a0Jsb2NrOworICBhcmdzLmRhdGEgPSA5NzE7CisgIEVYUEVDVF9SRVRVUk5TX0ZBSUxTKFJlYWRUZXN0TWVzc2FnZSwgJmFyZ3MpOworfQorVEVTVF9GKFJhd1F1ZXVlVGVzdCwgV3JpdGluZykgeworICBSYXdRdWV1ZSAqY29uc3QgcXVldWUgPSBSYXdRdWV1ZTo6RmV0Y2goIlF1ZXVlIiwgc2l6ZW9mKFRlc3RNZXNzYWdlKSwgMSwgMSk7CisgIE1lc3NhZ2VBcmdzIGFyZ3N7cXVldWUsIFJhd1F1ZXVlOjprQmxvY2ssIDk3M307CisKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprQmxvY2s7CisgIEVYUEVDVF9SRVRVUk5TKFdyaXRlVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprQmxvY2s7CisgIEVYUEVDVF9IQU5HUyhXcml0ZVRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a05vbkJsb2NrOworICBFWFBFQ1RfUkVUVVJOU19GQUlMUyhXcml0ZVRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a05vbkJsb2NrOworICBFWFBFQ1RfUkVUVVJOU19GQUlMUyhXcml0ZVRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a1BlZWsgfCBSYXdRdWV1ZTo6a0Jsb2NrOworICBFWFBFQ1RfUkVUVVJOUyhSZWFkVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgYXJncy5kYXRhID0gOTcxOworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtPdmVycmlkZTsKKyAgRVhQRUNUX1JFVFVSTlMoV3JpdGVUZXN0TWVzc2FnZSwgJmFyZ3MpOworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtPdmVycmlkZTsKKyAgRVhQRUNUX1JFVFVSTlMoV3JpdGVUZXN0TWVzc2FnZSwgJmFyZ3MpOworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtCbG9jazsKKyAgRVhQRUNUX1JFVFVSTlMoUmVhZFRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a05vbkJsb2NrOworICBFWFBFQ1RfUkVUVVJOUyhXcml0ZVRlc3RNZXNzYWdlLCAmYXJncyk7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a0Jsb2NrOworICBFWFBFQ1RfUkVUVVJOUyhSZWFkVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprT3ZlcnJpZGU7CisgIEVYUEVDVF9SRVRVUk5TKFdyaXRlVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprQmxvY2s7CisgIEVYUEVDVF9SRVRVUk5TKFJlYWRUZXN0TWVzc2FnZSwgJmFyZ3MpOworfQorCitURVNUX0YoUmF3UXVldWVUZXN0LCBNdWx0aVJlYWQpIHsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIHNpemVvZihUZXN0TWVzc2FnZSksIDEsIDEpOworICBNZXNzYWdlQXJncyBhcmdze3F1ZXVlLCBSYXdRdWV1ZTo6a0Jsb2NrLCAxMzIzfTsKKworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtCbG9jazsKKyAgRVhQRUNUX1JFVFVSTlMoV3JpdGVUZXN0TWVzc2FnZSwgJmFyZ3MpOworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtCbG9jazsKKyAgQVNTRVJUX1RSVUUoSGFuZ3NGb3JrKFJlYWRUZXN0TWVzc2FnZSwgJmFyZ3MsIHRydWUsIDEpKTsKKyAgQVNTRVJUX1RSVUUoSGFuZ3NGb3JrKFJlYWRUZXN0TWVzc2FnZSwgJmFyZ3MsIHRydWUsIDIpKTsKKyAgQXNzZXJ0aW9uUmVzdWx0IG9uZSA9IEhhbmdzQ2hlY2soMSk7CisgIEFzc2VydGlvblJlc3VsdCB0d28gPSBIYW5nc0NoZWNrKDIpOworICBFWFBFQ1RfVFJVRShvbmUgIT0gdHdvKSA8PCAiJyIgPDwKKyAgICAgIG9uZS5mYWlsdXJlX21lc3NhZ2UoKSA8PCAiJyB2cyAnIiA8PCB0d28uZmFpbHVyZV9tZXNzYWdlKCkgPDwgIiciOworICAvLyBUT0RPKGJyaWFucykgZmluaXNoIHRoaXMKK30KKworLy8gVGhlcmUgdXNlZCB0byBiZSBhIGJ1ZyB3aGVyZSByZWFkaW5nIGZpcnN0IHdpdGhvdXQgYW4gaW5kZXggYW5kIHRoZW4gd2l0aCBhbgorLy8gaW5kZXggd291bGQgY3Jhc2guIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQncyBmaXhlZC4KK1RFU1RfRihSYXdRdWV1ZVRlc3QsIFJlYWRJbmRleEFuZE5vdCkgeworICBSYXdRdWV1ZSAqY29uc3QgcXVldWUgPSBSYXdRdWV1ZTo6RmV0Y2goIlF1ZXVlIiwgc2l6ZW9mKFRlc3RNZXNzYWdlKSwgMSwgMik7CisKKyAgLy8gV3JpdGUgYSBtZXNzYWdlLCByZWFkIGl0ICh3aXRoIFJlYWRNZXNzYWdlKSwgYW5kIHRoZW4gd3JpdGUgYW5vdGhlcgorICAvLyBtZXNzYWdlIChiZWZvcmUgZnJlZWluZyB0aGUgcmVhZCBvbmUgc28gdGhlIHF1ZXVlIGFsbG9jYXRlcyBhIGRpc3RpbmN0CisgIC8vIG1lc3NhZ2UgdG8gdXNlIGZvciBpdCkuCisgIFRlc3RNZXNzYWdlICptc2cgPSBzdGF0aWNfY2FzdDxUZXN0TWVzc2FnZSAqPihxdWV1ZS0+R2V0TWVzc2FnZSgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1zZyk7CisgIEFTU0VSVF9UUlVFKHF1ZXVlLT5Xcml0ZU1lc3NhZ2UobXNnLCBSYXdRdWV1ZTo6a0Jsb2NrKSk7CisgIGNvbnN0IHZvaWQgKnJlYWRfbXNnID0gcXVldWUtPlJlYWRNZXNzYWdlKFJhd1F1ZXVlOjprQmxvY2spOworICBFWFBFQ1RfTkUobnVsbHB0ciwgcmVhZF9tc2cpOworICBtc2cgPSBzdGF0aWNfY2FzdDxUZXN0TWVzc2FnZSAqPihxdWV1ZS0+R2V0TWVzc2FnZSgpKTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKHJlYWRfbXNnKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1zZyk7CisgIEFTU0VSVF9UUlVFKHF1ZXVlLT5Xcml0ZU1lc3NhZ2UobXNnLCBSYXdRdWV1ZTo6a0Jsb2NrKSk7CisKKyAgaW50IGluZGV4ID0gMDsKKyAgY29uc3Qgdm9pZCAqc2Vjb25kX3JlYWRfbXNnID0KKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprQmxvY2ssICZpbmRleCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBzZWNvbmRfcmVhZF9tc2cpOworICBFWFBFQ1RfTkUocmVhZF9tc2csIHNlY29uZF9yZWFkX21zZykKKyAgICAgIDw8ICJXZSBhbHJlYWR5IHRvb2sgdGhhdCBtZXNzYWdlIG91dCBvZiB0aGUgcXVldWUuIjsKK30KKworVEVTVF9GKFJhd1F1ZXVlVGVzdCwgUmVjeWNsZSkgeworICAvLyBUT0RPKGJyaWFucykgYmFzaWMgdGVzdCBvZiByZWN5Y2xlIHF1ZXVlCisgIC8vIGluY2x1ZGUgYWxsIG9mIHRoZSB3YXlzIGEgbWVzc2FnZSBjYW4gZ2V0IGludG8gdGhlIHJlY3ljbGUgcXVldWUKKyAgUmF3UXVldWUgKnJlY3ljbGVfcXVldWUgPSByZWludGVycHJldF9jYXN0PFJhd1F1ZXVlICo+KDIzKTsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIHNpemVvZihUZXN0TWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAyLCAyLCAmcmVjeWNsZV9xdWV1ZSk7CisgIEFTU0VSVF9ORShyZWludGVycHJldF9jYXN0PFJhd1F1ZXVlICo+KDIzKSwgcmVjeWNsZV9xdWV1ZSk7CisgIE1lc3NhZ2VBcmdzIGFyZ3N7cXVldWUsIFJhd1F1ZXVlOjprQmxvY2ssIDk3M30sCisgICAgICByZWN5Y2xle3JlY3ljbGVfcXVldWUsIFJhd1F1ZXVlOjprQmxvY2ssIDk3M307CisKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprQmxvY2s7CisgIEVYUEVDVF9SRVRVUk5TKFdyaXRlVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgRVhQRUNUX0hBTkdTKFJlYWRUZXN0TWVzc2FnZSwgJnJlY3ljbGUpOworICBhcmdzLmRhdGEgPSAyNTQ7CisgIEVYUEVDVF9SRVRVUk5TKFdyaXRlVGVzdE1lc3NhZ2UsICZhcmdzKTsKKyAgRVhQRUNUX0hBTkdTKFJlYWRUZXN0TWVzc2FnZSwgJnJlY3ljbGUpOworICBhcmdzLmRhdGEgPSA5NzE7CisgIGFyZ3MuZmxhZ3MgPSBSYXdRdWV1ZTo6a092ZXJyaWRlOworICBFWFBFQ1RfUkVUVVJOUyhXcml0ZVRlc3RNZXNzYWdlLCAmYXJncyk7CisgIHJlY3ljbGUuZmxhZ3MgPSBSYXdRdWV1ZTo6a0Jsb2NrOworICBFWFBFQ1RfUkVUVVJOUyhSZWFkVGVzdE1lc3NhZ2UsICZyZWN5Y2xlKTsKKworICBFWFBFQ1RfSEFOR1MoUmVhZFRlc3RNZXNzYWdlLCAmcmVjeWNsZSk7CisKKyAgVGVzdE1lc3NhZ2UgKm1zZyA9IHN0YXRpY19jYXN0PFRlc3RNZXNzYWdlICo+KHF1ZXVlLT5HZXRNZXNzYWdlKCkpOworICBBU1NFUlRfVFJVRShtc2cgIT0gTlVMTCk7CisgIG1zZy0+ZGF0YSA9IDM0MTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1zZyk7CisgIHJlY3ljbGUuZGF0YSA9IDM0MTsKKyAgRVhQRUNUX1JFVFVSTlMoUmVhZFRlc3RNZXNzYWdlLCAmcmVjeWNsZSk7CisKKyAgRVhQRUNUX0hBTkdTKFJlYWRUZXN0TWVzc2FnZSwgJnJlY3ljbGUpOworCisgIGFyZ3MuZGF0YSA9IDI1NDsKKyAgYXJncy5mbGFncyA9IFJhd1F1ZXVlOjprUGVlayB8IFJhd1F1ZXVlOjprQmxvY2s7CisgIEVYUEVDVF9SRVRVUk5TKFJlYWRUZXN0TWVzc2FnZSwgJmFyZ3MpOworICByZWN5Y2xlLmZsYWdzID0gUmF3UXVldWU6OmtCbG9jazsKKyAgRVhQRUNUX0hBTkdTKFJlYWRUZXN0TWVzc2FnZSwgJnJlY3ljbGUpOworICBhcmdzLmZsYWdzID0gUmF3UXVldWU6OmtCbG9jazsKKyAgRVhQRUNUX1JFVFVSTlMoUmVhZFRlc3RNZXNzYWdlLCAmYXJncyk7CisgIHJlY3ljbGUuZGF0YSA9IDI1NDsKKyAgRVhQRUNUX1JFVFVSTlMoUmVhZFRlc3RNZXNzYWdlLCAmcmVjeWNsZSk7Cit9CisKKy8vIE1ha2VzIHN1cmUgdGhhdCB3aGVuIGEgbWVzc2FnZSBkb2Vzbid0IGdldCB3cml0dGVuIHdpdGgga05vbkJsb2NrIGl0IGRvZXMgZ2V0CisvLyBmcmVlZC4KK1RFU1RfRihSYXdRdWV1ZVRlc3QsIE5vbkJsb2NrRmFpbEZyZWUpIHsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIHNpemVvZihUZXN0TWVzc2FnZSksIDEsIDEpOworCisgIHZvaWQgKm1lc3NhZ2UxID0gcXVldWUtPkdldE1lc3NhZ2UoKTsKKyAgdm9pZCAqbWVzc2FnZTIgPSBxdWV1ZS0+R2V0TWVzc2FnZSgpOworICBBU1NFUlRfVFJVRShxdWV1ZS0+V3JpdGVNZXNzYWdlKG1lc3NhZ2UxLCBSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisgIEFTU0VSVF9GQUxTRShxdWV1ZS0+V3JpdGVNZXNzYWdlKG1lc3NhZ2UyLCBSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMiwgcXVldWUtPkdldE1lc3NhZ2UoKSk7Cit9CisKKy8vIEFsbCBvZiB0aGUgdGVzdHMgZnJvbSBoZXJlIGRvd24gYXJlIGRlc2lnbmVkIHRvIHRlc3QgZXZlcnkgYnJhbmNoIHRvCisvLyBtYWtlIHN1cmUgaXQgZG9lcyB3aGF0IGl0J3Mgc3VwcG9zZWQgdG8uIFRoZXkgYXJlIGdlbmVyYWxseSBwcmV0dHkgcmVwZXRpdGl2ZQorLy8gYW5kIGJvcmluZywgYW5kIHNvbWUgb2YgdGhlbSBtYXkgZHVwbGljYXRlIG90aGVyIHRlc3RzIGFib3ZlLCBidXQgdGhlc2Ugb25lcworLy8gbWFrZSBpdCBhIGxvdCBlYXNpZXIgdG8gZmlndXJlIG91dCB3aGF0J3Mgd3Jvbmcgd2l0aCBidWdzIG5vdCByZWxhdGVkIHRvIHJhY2UKKy8vIGNvbmRpdGlvbnMuCisKK1RFU1RfRihSYXdRdWV1ZVRlc3QsIFJlYWRJbmRleE5vdEZ1bGwpIHsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIHNpemVvZihUZXN0TWVzc2FnZSksIDEsIDIpOworICBjb25zdCBUZXN0TWVzc2FnZSAqbWVzc2FnZSwgKnBlZWtfbWVzc2FnZTsKKworICBFWFBFQ1RfRVEoMCwga0V4dHJhTWVzc2FnZXMgKyAyIC0gcXVldWUtPkZyZWVNZXNzYWdlcygpKTsKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDk3MSk7CisgIEVYUEVDVF9FUSgxLCBrRXh0cmFNZXNzYWdlcyArIDIgLSBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworCisgIGludCBpbmRleCA9IDA7CisgIHBlZWtfbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KAorICAgICAgcXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoUmF3UXVldWU6OmtOb25CbG9jayB8IFJhd1F1ZXVlOjprUGVlaywgJmluZGV4KSk7CisgIG1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2ssICZpbmRleCkpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLCBwZWVrX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoOTcxLCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDEsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UocGVla19tZXNzYWdlKTsKKworICBQdXNoTWVzc2FnZShxdWV1ZSwgMTc2OCk7CisgIEVYUEVDVF9FUSgyLCBrRXh0cmFNZXNzYWdlcyArIDIgLSBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWssICZpbmRleCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDE3NjgsIG1lc3NhZ2UtPmRhdGEpOworICBFWFBFQ1RfRVEoMiwgaW5kZXgpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UobWVzc2FnZSk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShwZWVrX21lc3NhZ2UpOworCisgIFB1c2hNZXNzYWdlKHF1ZXVlLCAyNTQpOworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWssICZpbmRleCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDI1NCwgbWVzc2FnZS0+ZGF0YSk7CisgIEVYUEVDVF9FUSgzLCBpbmRleCk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlKTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKHBlZWtfbWVzc2FnZSk7CisKKyAgaW5kZXggPSAwOworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2UoCisgICAgICBSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrIHwgUmF3UXVldWU6OmtGcm9tRW5kKSk7CisgIG1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleCgKKyAgICAgIFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a0Zyb21FbmQsICZpbmRleCkpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLCBwZWVrX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoMjU0LCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDMsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UocGVla19tZXNzYWdlKTsKKworICBFWFBFQ1RfRVEoMiwga0V4dHJhTWVzc2FnZXMgKyAyIC0gcXVldWUtPkZyZWVNZXNzYWdlcygpKTsKK30KKworVEVTVF9GKFJhd1F1ZXVlVGVzdCwgUmVhZEluZGV4Tm90QmVoaW5kKSB7CisgIFJhd1F1ZXVlICpjb25zdCBxdWV1ZSA9IFJhd1F1ZXVlOjpGZXRjaCgiUXVldWUiLCBzaXplb2YoVGVzdE1lc3NhZ2UpLCAxLCAyKTsKKyAgY29uc3QgVGVzdE1lc3NhZ2UgKm1lc3NhZ2UsICpwZWVrX21lc3NhZ2U7CisKKyAgRVhQRUNUX0VRKDAsIGtFeHRyYU1lc3NhZ2VzICsgMiAtIHF1ZXVlLT5GcmVlTWVzc2FnZXMoKSk7CisgIFB1c2hNZXNzYWdlKHF1ZXVlLCA5NzEpOworICBFWFBFQ1RfRVEoMSwga0V4dHJhTWVzc2FnZXMgKyAyIC0gcXVldWUtPkZyZWVNZXNzYWdlcygpKTsKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDE3NjgpOworICBFWFBFQ1RfRVEoMiwga0V4dHJhTWVzc2FnZXMgKyAyIC0gcXVldWUtPkZyZWVNZXNzYWdlcygpKTsKKworICBpbnQgaW5kZXggPSAwOworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWssICZpbmRleCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDk3MSwgbWVzc2FnZS0+ZGF0YSk7CisgIEVYUEVDVF9FUSgxLCBpbmRleCk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlKTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKHBlZWtfbWVzc2FnZSk7CisKKyAgaW5kZXggPSAwOworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2UoCisgICAgICBSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrIHwgUmF3UXVldWU6OmtGcm9tRW5kKSk7CisgIG1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleCgKKyAgICAgIFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a0Zyb21FbmQsICZpbmRleCkpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLCBwZWVrX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoMTc2OCwgbWVzc2FnZS0+ZGF0YSk7CisgIEVYUEVDVF9FUSgyLCBpbmRleCk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlKTsKK30KKworVEVTVF9GKFJhd1F1ZXVlVGVzdCwgUmVhZEluZGV4TGl0dGxlQmVoaW5kTm90RnVsbCkgeworICBSYXdRdWV1ZSAqY29uc3QgcXVldWUgPSBSYXdRdWV1ZTo6RmV0Y2goIlF1ZXVlIiwgc2l6ZW9mKFRlc3RNZXNzYWdlKSwgMSwgMik7CisgIGNvbnN0IFRlc3RNZXNzYWdlICptZXNzYWdlLCAqcGVla19tZXNzYWdlOworCisgIFB1c2hNZXNzYWdlKHF1ZXVlLCA5NzEpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgMTc2OCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBxdWV1ZS0+UmVhZE1lc3NhZ2UoUmF3UXVldWU6OmtOb25CbG9jaykpOworCisgIGludCBpbmRleCA9IDA7CisKKyAgcGVla19tZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrLCAmaW5kZXgpKTsKKyAgbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KAorICAgICAgcXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoUmF3UXVldWU6OmtOb25CbG9jaywgJmluZGV4KSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UsIHBlZWtfbWVzc2FnZSk7CisgIEVYUEVDVF9FUSgxNzY4LCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDIsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UocGVla19tZXNzYWdlKTsKKworICBpbmRleCA9IDA7CisgIHBlZWtfbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KHF1ZXVlLT5SZWFkTWVzc2FnZSgKKyAgICAgIFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWsgfCBSYXdRdWV1ZTo6a0Zyb21FbmQpKTsKKyAgbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KAorICAgICAgUmF3UXVldWU6OmtOb25CbG9jayB8IFJhd1F1ZXVlOjprRnJvbUVuZCwgJmluZGV4KSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UsIHBlZWtfbWVzc2FnZSk7CisgIEVYUEVDVF9FUSgxNzY4LCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDIsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworfQorCitURVNUX0YoUmF3UXVldWVUZXN0LCBSZWFkSW5kZXhNb3JlQmVoaW5kKSB7CisgIFJhd1F1ZXVlICpjb25zdCBxdWV1ZSA9IFJhd1F1ZXVlOjpGZXRjaCgiUXVldWUiLCBzaXplb2YoVGVzdE1lc3NhZ2UpLCAxLCAyKTsKKyAgY29uc3QgVGVzdE1lc3NhZ2UgKm1lc3NhZ2UsICpwZWVrX21lc3NhZ2U7CisKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDk3MSk7CisgIFB1c2hNZXNzYWdlKHF1ZXVlLCAxNzY4KTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHF1ZXVlLT5SZWFkTWVzc2FnZShSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisgIFB1c2hNZXNzYWdlKHF1ZXVlLCAyNTQpOworCisgIGludCBpbmRleCA9IDA7CisKKyAgcGVla19tZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrLCAmaW5kZXgpKTsKKyAgbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KAorICAgICAgcXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoUmF3UXVldWU6OmtOb25CbG9jaywgJmluZGV4KSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UsIHBlZWtfbWVzc2FnZSk7CisgIEVYUEVDVF9FUSgxNzY4LCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDIsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UocGVla19tZXNzYWdlKTsKKworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWssICZpbmRleCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDI1NCwgbWVzc2FnZS0+ZGF0YSk7CisgIEVYUEVDVF9FUSgzLCBpbmRleCk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlKTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKHBlZWtfbWVzc2FnZSk7CisKKyAgaW5kZXggPSAwOworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2UoCisgICAgICBSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrIHwgUmF3UXVldWU6OmtGcm9tRW5kKSk7CisgIG1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleCgKKyAgICAgIFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a0Zyb21FbmQsICZpbmRleCkpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLCBwZWVrX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoMjU0LCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDMsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworfQorCitURVNUX0YoUmF3UXVldWVUZXN0LCBSZWFkSW5kZXhNb3JlQmVoaW5kTm90RnVsbCkgeworICBSYXdRdWV1ZSAqY29uc3QgcXVldWUgPSBSYXdRdWV1ZTo6RmV0Y2goIlF1ZXVlIiwgc2l6ZW9mKFRlc3RNZXNzYWdlKSwgMSwgMik7CisgIGNvbnN0IFRlc3RNZXNzYWdlICptZXNzYWdlLCAqcGVla19tZXNzYWdlOworCisgIFB1c2hNZXNzYWdlKHF1ZXVlLCA5NzEpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgMTc2OCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBxdWV1ZS0+UmVhZE1lc3NhZ2UoUmF3UXVldWU6OmtOb25CbG9jaykpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgMjU0KTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHF1ZXVlLT5SZWFkTWVzc2FnZShSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisKKyAgaW50IGluZGV4ID0gMDsKKworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWssICZpbmRleCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDI1NCwgbWVzc2FnZS0+ZGF0YSk7CisgIEVYUEVDVF9FUSgzLCBpbmRleCk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlKTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKHBlZWtfbWVzc2FnZSk7CisKKyAgaW5kZXggPSAwOworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2UoCisgICAgICBSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrIHwgUmF3UXVldWU6OmtGcm9tRW5kKSk7CisgIG1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleCgKKyAgICAgIFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a0Zyb21FbmQsICZpbmRleCkpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLCBwZWVrX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoMjU0LCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDMsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworfQorCitURVNUX0YoUmF3UXVldWVUZXN0LCBSZWFkSW5kZXhMb3RCZWhpbmQpIHsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIHNpemVvZihUZXN0TWVzc2FnZSksIDEsIDIpOworICBjb25zdCBUZXN0TWVzc2FnZSAqbWVzc2FnZSwgKnBlZWtfbWVzc2FnZTsKKworICBQdXNoTWVzc2FnZShxdWV1ZSwgOTcxKTsKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDE3NjgpOworICB7CisgICAgY29uc3Qgdm9pZCAqbWVzc2FnZTEsICptZXNzYWdlMjsKKyAgICBtZXNzYWdlMSA9IHF1ZXVlLT5SZWFkTWVzc2FnZShSYXdRdWV1ZTo6a05vbkJsb2NrKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZTEpOworICAgIFB1c2hNZXNzYWdlKHF1ZXVlLCAyNTQpOworICAgIG1lc3NhZ2UyID0gcXVldWUtPlJlYWRNZXNzYWdlKFJhd1F1ZXVlOjprTm9uQmxvY2spOworICAgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlMik7CisgICAgUHVzaE1lc3NhZ2UocXVldWUsIDk3Myk7CisgICAgRVhQRUNUX0VRKDQsIGtFeHRyYU1lc3NhZ2VzICsgMiAtIHF1ZXVlLT5GcmVlTWVzc2FnZXMoKSk7CisgICAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UxKTsKKyAgICBFWFBFQ1RfRVEoMywga0V4dHJhTWVzc2FnZXMgKyAyIC0gcXVldWUtPkZyZWVNZXNzYWdlcygpKTsKKyAgICBxdWV1ZS0+RnJlZU1lc3NhZ2UobWVzc2FnZTIpOworICAgIEVYUEVDVF9FUSgyLCBrRXh0cmFNZXNzYWdlcyArIDIgLSBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworICB9CisKKyAgaW50IGluZGV4ID0gMDsKKworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWssICZpbmRleCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDI1NCwgbWVzc2FnZS0+ZGF0YSk7CisgIEVYUEVDVF9FUSgzLCBpbmRleCk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlKTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKHBlZWtfbWVzc2FnZSk7CisKKyAgcGVla19tZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrLCAmaW5kZXgpKTsKKyAgbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KAorICAgICAgcXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoUmF3UXVldWU6OmtOb25CbG9jaywgJmluZGV4KSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UsIHBlZWtfbWVzc2FnZSk7CisgIEVYUEVDVF9FUSg5NzMsIG1lc3NhZ2UtPmRhdGEpOworICBFWFBFQ1RfRVEoNCwgaW5kZXgpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UobWVzc2FnZSk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShwZWVrX21lc3NhZ2UpOworCisgIGluZGV4ID0gMDsKKyAgcGVla19tZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4ocXVldWUtPlJlYWRNZXNzYWdlKAorICAgICAgUmF3UXVldWU6OmtOb25CbG9jayB8IFJhd1F1ZXVlOjprUGVlayB8IFJhd1F1ZXVlOjprRnJvbUVuZCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4ocXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoCisgICAgICBSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtGcm9tRW5kLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDk3MywgbWVzc2FnZS0+ZGF0YSk7CisgIEVYUEVDVF9FUSg0LCBpbmRleCk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlKTsKK30KKworVEVTVF9GKFJhd1F1ZXVlVGVzdCwgUmVhZEluZGV4TG90QmVoaW5kTm90RnVsbCkgeworICBSYXdRdWV1ZSAqY29uc3QgcXVldWUgPSBSYXdRdWV1ZTo6RmV0Y2goIlF1ZXVlIiwgc2l6ZW9mKFRlc3RNZXNzYWdlKSwgMSwgMik7CisgIGNvbnN0IFRlc3RNZXNzYWdlICptZXNzYWdlLCAqcGVla19tZXNzYWdlOworCisgIFB1c2hNZXNzYWdlKHF1ZXVlLCA5NzEpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgMTc2OCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBxdWV1ZS0+UmVhZE1lc3NhZ2UoUmF3UXVldWU6OmtOb25CbG9jaykpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgMjU0KTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHF1ZXVlLT5SZWFkTWVzc2FnZShSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisgIFB1c2hNZXNzYWdlKHF1ZXVlLCA5NzMpOworICBBU1NFUlRfTkUobnVsbHB0ciwgcXVldWUtPlJlYWRNZXNzYWdlKFJhd1F1ZXVlOjprTm9uQmxvY2spKTsKKworICBpbnQgaW5kZXggPSAwOworCisgIHBlZWtfbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KAorICAgICAgcXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoUmF3UXVldWU6OmtOb25CbG9jayB8IFJhd1F1ZXVlOjprUGVlaywgJmluZGV4KSk7CisgIG1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2ssICZpbmRleCkpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLCBwZWVrX21lc3NhZ2UpOworICBFWFBFQ1RfRVEoOTczLCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDQsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UocGVla19tZXNzYWdlKTsKKworICBpbmRleCA9IDA7CisgIHBlZWtfbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KHF1ZXVlLT5SZWFkTWVzc2FnZSgKKyAgICAgIFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWsgfCBSYXdRdWV1ZTo6a0Zyb21FbmQpKTsKKyAgbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KAorICAgICAgUmF3UXVldWU6OmtOb25CbG9jayB8IFJhd1F1ZXVlOjprRnJvbUVuZCwgJmluZGV4KSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UsIHBlZWtfbWVzc2FnZSk7CisgIEVYUEVDVF9FUSg5NzMsIG1lc3NhZ2UtPmRhdGEpOworICBFWFBFQ1RfRVEoNCwgaW5kZXgpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UobWVzc2FnZSk7Cit9CisKK1RFU1RfRihSYXdRdWV1ZVRlc3QsIFJlYWRJbmRleEV2ZW5Nb3JlQmVoaW5kKSB7CisgIFJhd1F1ZXVlICpjb25zdCBxdWV1ZSA9IFJhd1F1ZXVlOjpGZXRjaCgiUXVldWUiLCBzaXplb2YoVGVzdE1lc3NhZ2UpLCAxLCAyKTsKKyAgY29uc3QgVGVzdE1lc3NhZ2UgKm1lc3NhZ2UsICpwZWVrX21lc3NhZ2U7CisKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDk3MSk7CisgIFB1c2hNZXNzYWdlKHF1ZXVlLCAxNzY4KTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHF1ZXVlLT5SZWFkTWVzc2FnZShSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisgIFB1c2hNZXNzYWdlKHF1ZXVlLCAyNTQpOworICBBU1NFUlRfTkUobnVsbHB0ciwgcXVldWUtPlJlYWRNZXNzYWdlKFJhd1F1ZXVlOjprTm9uQmxvY2spKTsKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDk3Myk7CisgIEFTU0VSVF9ORShudWxscHRyLCBxdWV1ZS0+UmVhZE1lc3NhZ2UoUmF3UXVldWU6OmtOb25CbG9jaykpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgMTExNCk7CisKKyAgaW50IGluZGV4ID0gMDsKKworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWssICZpbmRleCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDk3MywgbWVzc2FnZS0+ZGF0YSk7CisgIEVYUEVDVF9FUSg0LCBpbmRleCk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlKTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKHBlZWtfbWVzc2FnZSk7CisKKyAgcGVla19tZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtQZWVrLCAmaW5kZXgpKTsKKyAgbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KAorICAgICAgcXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoUmF3UXVldWU6OmtOb25CbG9jaywgJmluZGV4KSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UsIHBlZWtfbWVzc2FnZSk7CisgIEVYUEVDVF9FUSgxMTE0LCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDUsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UocGVla19tZXNzYWdlKTsKKworICBpbmRleCA9IDA7CisgIHBlZWtfbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KHF1ZXVlLT5SZWFkTWVzc2FnZSgKKyAgICAgIFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWsgfCBSYXdRdWV1ZTo6a0Zyb21FbmQpKTsKKyAgbWVzc2FnZSA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3RNZXNzYWdlICo+KHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KAorICAgICAgUmF3UXVldWU6OmtOb25CbG9jayB8IFJhd1F1ZXVlOjprRnJvbUVuZCwgJmluZGV4KSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UsIHBlZWtfbWVzc2FnZSk7CisgIEVYUEVDVF9FUSgxMTE0LCBtZXNzYWdlLT5kYXRhKTsKKyAgRVhQRUNUX0VRKDUsIGluZGV4KTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UpOworfQorCitURVNUX0YoUmF3UXVldWVUZXN0LCBSZWFkSW5kZXhFdmVuTW9yZUJlaGluZE5vdEZ1bGwpIHsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIHNpemVvZihUZXN0TWVzc2FnZSksIDEsIDIpOworICBjb25zdCBUZXN0TWVzc2FnZSAqbWVzc2FnZSwgKnBlZWtfbWVzc2FnZTsKKworICBQdXNoTWVzc2FnZShxdWV1ZSwgOTcxKTsKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDE3NjgpOworICBBU1NFUlRfTkUobnVsbHB0ciwgcXVldWUtPlJlYWRNZXNzYWdlKFJhd1F1ZXVlOjprTm9uQmxvY2spKTsKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDI1NCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBxdWV1ZS0+UmVhZE1lc3NhZ2UoUmF3UXVldWU6OmtOb25CbG9jaykpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgOTczKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHF1ZXVlLT5SZWFkTWVzc2FnZShSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisgIFB1c2hNZXNzYWdlKHF1ZXVlLCAxMTE0KTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHF1ZXVlLT5SZWFkTWVzc2FnZShSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisKKyAgaW50IGluZGV4ID0gMDsKKworICBwZWVrX21lc3NhZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPigKKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a1BlZWssICZpbmRleCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4oCisgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a05vbkJsb2NrLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDExMTQsIG1lc3NhZ2UtPmRhdGEpOworICBFWFBFQ1RfRVEoNSwgaW5kZXgpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UobWVzc2FnZSk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShwZWVrX21lc3NhZ2UpOworCisgIGluZGV4ID0gMDsKKyAgcGVla19tZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4ocXVldWUtPlJlYWRNZXNzYWdlKAorICAgICAgUmF3UXVldWU6OmtOb25CbG9jayB8IFJhd1F1ZXVlOjprUGVlayB8IFJhd1F1ZXVlOjprRnJvbUVuZCkpOworICBtZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGVzdE1lc3NhZ2UgKj4ocXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoCisgICAgICBSYXdRdWV1ZTo6a05vbkJsb2NrIHwgUmF3UXVldWU6OmtGcm9tRW5kLCAmaW5kZXgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UpOworICBFWFBFQ1RfRVEobWVzc2FnZSwgcGVla19tZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDExMTQsIG1lc3NhZ2UtPmRhdGEpOworICBFWFBFQ1RfRVEoNSwgaW5kZXgpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UobWVzc2FnZSk7Cit9CisKK1RFU1RfRihSYXdRdWV1ZVRlc3QsIE1lc3NhZ2VSZWZlcmVuY2VDb3VudHMpIHsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIHNpemVvZihUZXN0TWVzc2FnZSksIDEsIDIpOworICBjb25zdCB2b2lkICptZXNzYWdlMSwgKm1lc3NhZ2UyOworCisgIEVYUEVDVF9FUSgwLCBrRXh0cmFNZXNzYWdlcyArIDIgLSBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworICBtZXNzYWdlMSA9IHF1ZXVlLT5HZXRNZXNzYWdlKCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBtZXNzYWdlMSk7CisgIEVYUEVDVF9FUSgxLCBrRXh0cmFNZXNzYWdlcyArIDIgLSBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworICBtZXNzYWdlMiA9IHF1ZXVlLT5HZXRNZXNzYWdlKCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBtZXNzYWdlMik7CisgIEVYUEVDVF9FUSgyLCBrRXh0cmFNZXNzYWdlcyArIDIgLSBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UobWVzc2FnZTEpOworICBFWFBFQ1RfRVEoMSwga0V4dHJhTWVzc2FnZXMgKyAyIC0gcXVldWUtPkZyZWVNZXNzYWdlcygpKTsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX0VRKDAsIGtFeHRyYU1lc3NhZ2VzICsgMiAtIHF1ZXVlLT5GcmVlTWVzc2FnZXMoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd3JpdGluZyB3aXRoIGtOb25CbG9jayBmYWlscyBhbmQgZnJlZXMgdGhlIG1lc3NhZ2UuCitURVNUX0YoUmF3UXVldWVUZXN0LCBXcml0ZURvbnRCbG9jaykgeworICBSYXdRdWV1ZSAqY29uc3QgcXVldWUgPSBSYXdRdWV1ZTo6RmV0Y2goIlF1ZXVlIiwgc2l6ZW9mKFRlc3RNZXNzYWdlKSwgMSwgMSk7CisgIHZvaWQgKm1lc3NhZ2U7CisKKyAgUHVzaE1lc3NhZ2UocXVldWUsIDk3MSk7CisgIGludCBmcmVlX2JlZm9yZSA9IHF1ZXVlLT5GcmVlTWVzc2FnZXMoKTsKKyAgbWVzc2FnZSA9IHF1ZXVlLT5HZXRNZXNzYWdlKCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBtZXNzYWdlKTsKKyAgRVhQRUNUX05FKGZyZWVfYmVmb3JlLCBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworICBFWFBFQ1RfRkFMU0UocXVldWUtPldyaXRlTWVzc2FnZShtZXNzYWdlLCBSYXdRdWV1ZTo6a05vbkJsb2NrKSk7CisgIEVYUEVDVF9FUShmcmVlX2JlZm9yZSwgcXVldWUtPkZyZWVNZXNzYWdlcygpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3cml0aW5nIHdpdGgga092ZXJyaWRlIHB1c2hlcyB0aGUgbGFzdCBtZXNzYWdlIG91dCBvZiB0aGUgcXVldWUuCitURVNUX0YoUmF3UXVldWVUZXN0LCBXcml0ZU92ZXJyaWRlKSB7CisgIFJhd1F1ZXVlICpjb25zdCBxdWV1ZSA9IFJhd1F1ZXVlOjpGZXRjaCgiUXVldWUiLCBzaXplb2YoVGVzdE1lc3NhZ2UpLCAxLCAyKTsKKyAgVGVzdE1lc3NhZ2UgKm1lc3NhZ2UxOworCisgIFB1c2hNZXNzYWdlKHF1ZXVlLCA5NzEpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgMTc2OCk7CisgIGludCBmcmVlX2JlZm9yZSA9IHF1ZXVlLT5GcmVlTWVzc2FnZXMoKTsKKyAgbWVzc2FnZTEgPSBzdGF0aWNfY2FzdDxUZXN0TWVzc2FnZSAqPihxdWV1ZS0+R2V0TWVzc2FnZSgpKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIG1lc3NhZ2UxKTsKKyAgRVhQRUNUX05FKGZyZWVfYmVmb3JlLCBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworICBtZXNzYWdlMS0+ZGF0YSA9IDI1NDsKKyAgRVhQRUNUX1RSVUUocXVldWUtPldyaXRlTWVzc2FnZShtZXNzYWdlMSwgUmF3UXVldWU6OmtPdmVycmlkZSkpOworICBFWFBFQ1RfRVEoZnJlZV9iZWZvcmUsIHF1ZXVlLT5GcmVlTWVzc2FnZXMoKSk7CisKKyAgY29uc3QgVGVzdE1lc3NhZ2UgKm1lc3NhZ2UyOworICBtZXNzYWdlMiA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2UoUmF3UXVldWU6OmtOb25CbG9jaykpOworICBFWFBFQ1RfRVEoMTc2OCwgbWVzc2FnZTItPmRhdGEpOworICBxdWV1ZS0+RnJlZU1lc3NhZ2UobWVzc2FnZTIpOworICBFWFBFQ1RfRVEoZnJlZV9iZWZvcmUgKyAxLCBxdWV1ZS0+RnJlZU1lc3NhZ2VzKCkpOworICBtZXNzYWdlMiA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBUZXN0TWVzc2FnZSAqPihxdWV1ZS0+UmVhZE1lc3NhZ2UoUmF3UXVldWU6OmtOb25CbG9jaykpOworICBFWFBFQ1RfRVEoMjU0LCBtZXNzYWdlMi0+ZGF0YSk7CisgIHF1ZXVlLT5GcmVlTWVzc2FnZShtZXNzYWdlMik7CisgIEVYUEVDVF9FUShmcmVlX2JlZm9yZSArIDIsIHF1ZXVlLT5GcmVlTWVzc2FnZXMoKSk7Cit9CisKKy8vIE1ha2VzIHN1cmUgdGhhdCBUaHJlYWRTYW5pdGl6ZXIgZG9lc24ndCBjYXRjaCBhbnkgaXNzdWVzIGZyZWVpbmcgZnJvbQorLy8gbXVsdGlwbGUgdGhyZWFkcyBhdCBvbmNlLgorVEVTVF9GKFJhd1F1ZXVlVGVzdCwgTXVsdGlUaHJlYWRlZEZyZWUpIHsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIHNpemVvZihUZXN0TWVzc2FnZSksIDEsIDEpOworICBQdXNoTWVzc2FnZShxdWV1ZSwgOTcxKTsKKyAgaW50IGZyZWVfYmVmb3JlID0gcXVldWUtPkZyZWVNZXNzYWdlcygpOworCisgIGNvbnN0IHZvaWQgKmNvbnN0IG1lc3NhZ2UxID0KKyAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZShSYXdRdWV1ZTo6a1BlZWsgfCBSYXdRdWV1ZTo6a05vbkJsb2NrKTsKKyAgY29uc3Qgdm9pZCAqY29uc3QgbWVzc2FnZTIgPQorICAgICAgcXVldWUtPlJlYWRNZXNzYWdlKFJhd1F1ZXVlOjprUGVlayB8IFJhd1F1ZXVlOjprTm9uQmxvY2spOworICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZTEpOworICBBU1NFUlRfTkUobnVsbHB0ciwgbWVzc2FnZTIpOworICBFWFBFQ1RfRVEoZnJlZV9iZWZvcmUsIHF1ZXVlLT5GcmVlTWVzc2FnZXMoKSk7CisgIHV0aWw6OkZ1bmN0aW9uVGhyZWFkIHQxKFttZXNzYWdlMSwgcXVldWVdKHV0aWw6OlRocmVhZCAqKSB7CisgICAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UxKTsKKyAgfSk7CisgIHV0aWw6OkZ1bmN0aW9uVGhyZWFkIHQyKFttZXNzYWdlMiwgcXVldWVdKHV0aWw6OlRocmVhZCAqKSB7CisgICAgcXVldWUtPkZyZWVNZXNzYWdlKG1lc3NhZ2UyKTsKKyAgfSk7CisgIHQxLlN0YXJ0KCk7CisgIHQyLlN0YXJ0KCk7CisgIHQxLldhaXRVbnRpbERvbmUoKTsKKyAgdDIuV2FpdFVudGlsRG9uZSgpOworICBFWFBFQ1RfRVEoZnJlZV9iZWZvcmUsIHF1ZXVlLT5GcmVlTWVzc2FnZXMoKSk7Cit9CisKK1RFU1RfRihSYXdRdWV1ZURlYXRoVGVzdCwgT3B0aW9uc1ZhbGlkYXRpb24pIHsKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJRdWV1ZSIsIDEsIDEsIDEpOworCisgIEVYUEVDVF9ERUFUSCgKKyAgICAgIHsKKyAgICAgICAgbG9nZ2luZzo6QWRkSW1wbGVtZW50YXRpb24obmV3IHV0aWw6OkRlYXRoVGVzdExvZ0ltcGxlbWVudGF0aW9uKCkpOworICAgICAgICBxdWV1ZS0+V3JpdGVNZXNzYWdlKG51bGxwdHIsIFJhd1F1ZXVlOjprUGVlayk7CisgICAgICB9LAorICAgICAgIi4qaWxsZWdhbCB3cml0ZSBvcHRpb24uKiIpOworICBFWFBFQ1RfREVBVEgoCisgICAgICB7CisgICAgICAgIGxvZ2dpbmc6OkFkZEltcGxlbWVudGF0aW9uKG5ldyB1dGlsOjpEZWF0aFRlc3RMb2dJbXBsZW1lbnRhdGlvbigpKTsKKyAgICAgICAgcXVldWUtPldyaXRlTWVzc2FnZShudWxscHRyLCBSYXdRdWV1ZTo6a0Zyb21FbmQpOworICAgICAgfSwKKyAgICAgICIuKmlsbGVnYWwgd3JpdGUgb3B0aW9uLioiKTsKKyAgRVhQRUNUX0RFQVRIKAorICAgICAgeworICAgICAgICBsb2dnaW5nOjpBZGRJbXBsZW1lbnRhdGlvbihuZXcgdXRpbDo6RGVhdGhUZXN0TG9nSW1wbGVtZW50YXRpb24oKSk7CisgICAgICAgIHF1ZXVlLT5Xcml0ZU1lc3NhZ2UobnVsbHB0ciwgUmF3UXVldWU6OmtQZWVrIHwgUmF3UXVldWU6OmtGcm9tRW5kKTsKKyAgICAgIH0sCisgICAgICAiLippbGxlZ2FsIHdyaXRlIG9wdGlvbi4qIik7CisgIEVYUEVDVF9ERUFUSCgKKyAgICAgIHsKKyAgICAgICAgbG9nZ2luZzo6QWRkSW1wbGVtZW50YXRpb24obmV3IHV0aWw6OkRlYXRoVGVzdExvZ0ltcGxlbWVudGF0aW9uKCkpOworICAgICAgICBxdWV1ZS0+V3JpdGVNZXNzYWdlKG51bGxwdHIsIFJhd1F1ZXVlOjprTm9uQmxvY2sgfCBSYXdRdWV1ZTo6a0Jsb2NrKTsKKyAgICAgIH0sCisgICAgICAiLippbnZhbGlkIHdyaXRlIG9wdGlvbi4qIik7CisKKyAgRVhQRUNUX0RFQVRIKAorICAgICAgeworICAgICAgICBsb2dnaW5nOjpBZGRJbXBsZW1lbnRhdGlvbihuZXcgdXRpbDo6RGVhdGhUZXN0TG9nSW1wbGVtZW50YXRpb24oKSk7CisgICAgICAgIHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KAorICAgICAgICAgICAgUmF3UXVldWU6OmtCbG9jayB8IFJhd1F1ZXVlOjprRnJvbUVuZCB8IFJhd1F1ZXVlOjprUGVlaywgbnVsbHB0cik7CisgICAgICB9LAorICAgICAgIi4qUmVhZE1lc3NhZ2VJbmRleC4qaXMgbm90IGFsbG93ZWQuKiIpOworICBFWFBFQ1RfREVBVEgoCisgICAgICB7CisgICAgICAgIGxvZ2dpbmc6OkFkZEltcGxlbWVudGF0aW9uKG5ldyB1dGlsOjpEZWF0aFRlc3RMb2dJbXBsZW1lbnRhdGlvbigpKTsKKyAgICAgICAgcXVldWUtPlJlYWRNZXNzYWdlSW5kZXgoUmF3UXVldWU6OmtPdmVycmlkZSwgbnVsbHB0cik7CisgICAgICB9LAorICAgICAgIi4qaWxsZWdhbCByZWFkIG9wdGlvbi4qIik7CisgIEVYUEVDVF9ERUFUSCgKKyAgICAgIHsKKyAgICAgICAgbG9nZ2luZzo6QWRkSW1wbGVtZW50YXRpb24obmV3IHV0aWw6OkRlYXRoVGVzdExvZ0ltcGxlbWVudGF0aW9uKCkpOworICAgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a092ZXJyaWRlIHwgUmF3UXVldWU6OmtCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICB9LAorICAgICAgIi4qaWxsZWdhbCByZWFkIG9wdGlvbi4qIik7CisgIEVYUEVDVF9ERUFUSCgKKyAgICAgIHsKKyAgICAgICAgbG9nZ2luZzo6QWRkSW1wbGVtZW50YXRpb24obmV3IHV0aWw6OkRlYXRoVGVzdExvZ0ltcGxlbWVudGF0aW9uKCkpOworICAgICAgICBxdWV1ZS0+UmVhZE1lc3NhZ2UoUmF3UXVldWU6OmtOb25CbG9jayB8IFJhd1F1ZXVlOjprQmxvY2spOworICAgICAgfSwKKyAgICAgICIuKmludmFsaWQgcmVhZCBvcHRpb24uKiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9zaGFyZWRfbWVtLmMgYi9hb3MvbGludXhfY29kZS9pcGNfbGliL3NoYXJlZF9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNiZmEyCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9zaGFyZWRfbWVtLmMKQEAgLTAsMCArMSwxNDAgQEAKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL3NoYXJlZF9tZW0uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL2NvcmVfbGliLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKworLy8gdGhlIHBhdGggZm9yIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuIHNlZSBzaG1fb3BlbigzKSBmb3IgcmVzdHJpY3Rpb25zCisjZGVmaW5lIEFPU19TSE1fTkFNRSAiL2Fvc19zaGFyZWRfbWVtIgorLy8gU2l6ZSBvZiB0aGUgc2hhcmVkIG1lbSBzZWdtZW50LgorLy8gVGhpcyBtdXN0IGZpdCBpbiB0aGUgdG1wZnMgZm9yIC9kZXYvc2htLworI2RlZmluZSBTSVpFT0ZTSE1TRUcgKDQwOTYgKiAweDMwMDApCisKK3ZvaWQgaW5pdF9zaGFyZWRfbWVtX2NvcmUoYW9zX3NobV9jb3JlICpzaG1fY29yZSkgeworICBtZW1zZXQoJnNobV9jb3JlLT50aW1lX29mZnNldCwgMCAsIHNpemVvZihzaG1fY29yZS0+dGltZV9vZmZzZXQpKTsKKyAgbWVtc2V0KCZzaG1fY29yZS0+bXNnX2FsbG9jX2xvY2ssIDAsIHNpemVvZihzaG1fY29yZS0+bXNnX2FsbG9jX2xvY2spKTsKKyAgc2htX2NvcmUtPnF1ZXVlcy5wb2ludGVyID0gTlVMTDsKKyAgbWVtc2V0KCZzaG1fY29yZS0+cXVldWVzLmxvY2ssIDAsIHNpemVvZihzaG1fY29yZS0+cXVldWVzLmxvY2spKTsKKyAgc2htX2NvcmUtPnF1ZXVlX3R5cGVzLnBvaW50ZXIgPSBOVUxMOworICBtZW1zZXQoJnNobV9jb3JlLT5xdWV1ZV90eXBlcy5sb2NrLCAwLCBzaXplb2Yoc2htX2NvcmUtPnF1ZXVlX3R5cGVzLmxvY2spKTsKK30KKworcHRyZGlmZl90IGFvc19jb3JlX2dldF9tZW1fdXNhZ2Uodm9pZCkgeworICByZXR1cm4gZ2xvYmFsX2NvcmUtPnNpemUgLQorICAgICAgKChwdHJkaWZmX3QpZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QtPm1zZ19hbGxvYyAtCisgICAgICAgKHB0cmRpZmZfdClnbG9iYWxfY29yZS0+bWVtX3N0cnVjdCk7Cit9CisKK3N0cnVjdCBhb3NfY29yZSAqZ2xvYmFsX2NvcmUgPSBOVUxMOworCisvLyBUT0RPKGJyaWFucyk6IG1hZHZpc2UoMikgaXQgdG8gcHV0IHRoaXMgc2htIGluIGNvcmUgZHVtcHMuCit2b2lkIGFvc19jb3JlX2NyZWF0ZV9zaGFyZWRfbWVtKGludCBjcmVhdGUsIGludCBsb2NrKSB7CisgIGFzc2VydChnbG9iYWxfY29yZSA9PSBOVUxMKTsKKyAgc3RhdGljIHN0cnVjdCBhb3NfY29yZSBnbG9iYWxfY29yZV9kYXRhOworICBnbG9iYWxfY29yZSA9ICZnbG9iYWxfY29yZV9kYXRhOworCisgIHsKKyAgICBjaGFyICpzaG1fbmFtZSA9IGdldGVudigiQU9TX1NITV9OQU1FIik7CisgICAgaWYgKHNobV9uYW1lID09IE5VTEwpIHsKKyAgICAgIGdsb2JhbF9jb3JlLT5zaG1fbmFtZSA9IEFPU19TSE1fTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJBT1NfU0hNX05BTUUgZGVmaW5lZCwgdXNpbmcgJXNcbiIsIHNobV9uYW1lKTsKKyAgICAgIGdsb2JhbF9jb3JlLT5zaG1fbmFtZSA9IHNobV9uYW1lOworICAgIH0KKyAgfQorCisgIGludCBzaG07CisgIGlmIChjcmVhdGUpIHsKKyAgICB3aGlsZSAoMSkgeworICAgICAgc2htID0gc2htX29wZW4oZ2xvYmFsX2NvcmUtPnNobV9uYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKyAgICAgIGdsb2JhbF9jb3JlLT5vd25lciA9IDE7CisgICAgICBpZiAoc2htID09IC0xICYmIGVycm5vID09IEVFWElTVCkgeworICAgICAgICBwcmludGYoInNoYXJlZF9tZW06IGdvaW5nIHRvIHNobV91bmxpbmsoJXMpXG4iLCBnbG9iYWxfY29yZS0+c2htX25hbWUpOworICAgICAgICBpZiAoc2htX3VubGluayhnbG9iYWxfY29yZS0+c2htX25hbWUpID09IC0xKSB7CisgICAgICAgICAgUExPRyhXQVJOSU5HLCAic2htX3VubGluayglcykgZmFpbGVkIiwgZ2xvYmFsX2NvcmUtPnNobV9uYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHNobSA9IHNobV9vcGVuKGdsb2JhbF9jb3JlLT5zaG1fbmFtZSwgT19SRFdSLCAwKTsKKyAgICBnbG9iYWxfY29yZS0+b3duZXIgPSAwOworICB9CisgIGlmIChzaG0gPT0gLTEpIHsKKyAgICBQTE9HKEZBVEFMLCAic2htX29wZW4oJXMsIE9fUkRXUiBbfCBPX0NSRUFUIHwgT19FWENMLCAwfDA2NjYpIGZhaWxlZCIsCisgICAgICAgICBnbG9iYWxfY29yZS0+c2htX25hbWUpOworICB9CisgIGlmIChnbG9iYWxfY29yZS0+b3duZXIpIHsKKyAgICBpZiAoZnRydW5jYXRlKHNobSwgU0laRU9GU0hNU0VHKSA9PSAtMSkgeworICAgICAgUExPRyhGQVRBTCwgImZydW5jYXRlKCVkLCAweCV6eCkgZmFpbGVkIiwgc2htLCAoc2l6ZV90KVNJWkVPRlNITVNFRyk7CisgICAgfQorICB9CisgIGludCBmbGFncyA9IE1BUF9TSEFSRUQgfCBNQVBfRklYRUQ7CisgIGlmIChsb2NrKSBmbGFncyB8PSBNQVBfTE9DS0VEIHwgTUFQX1BPUFVMQVRFOworICB2b2lkICpzaG1fYWRkcmVzcyA9IG1tYXAoKHZvaWQgKilTSE1fU1RBUlQsIFNJWkVPRlNITVNFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIGZsYWdzLCBzaG0sIDApOworICBpZiAoc2htX2FkZHJlc3MgPT0gTUFQX0ZBSUxFRCkgeworICAgIFBMT0coRkFUQUwsICJzaGFyZWRfbWVtOiBtbWFwKCVwLCAweCV6eCwgc3R1ZmYsICV4LCAlZCwgMCkgZmFpbGVkIiwKKyAgICAgICAgICh2b2lkICopU0hNX1NUQVJULCAoc2l6ZV90KVNJWkVPRlNITVNFRywgZmxhZ3MsIHNobSk7CisgIH0KKyAgaWYgKGNyZWF0ZSkgeworICAgIHByaW50Zigic2hhcmVkX21lbTogY3JlYXRpbmcgJXMsIHNobSBhdDogJXBcbiIsIGdsb2JhbF9jb3JlLT5zaG1fbmFtZSwKKyAgICAgICAgICAgc2htX2FkZHJlc3MpOworICB9IGVsc2UgeworICAgIHByaW50Zigic2hhcmVkX21lbTogbm90IGNyZWF0aW5nLCBzaG0gYXQ6ICVwXG4iLCBzaG1fYWRkcmVzcyk7CisgIH0KKyAgaWYgKGNsb3NlKHNobSkgPT0gLTEpIHsKKyAgICBQTE9HKFdBUk5JTkcsICJjbG9zZSglZCg9c2htKSBmYWlsZWQiLCBzaG0pOworICB9CisgIGlmIChzaG1fYWRkcmVzcyAhPSAodm9pZCAqKVNITV9TVEFSVCkgeworICAgIExPRyhGQVRBTCwgInNobSBpc24ndCBhdCBoYXJkLWNvZGVkICVwLiBhdCAlcCBpbnN0ZWFkXG4iLAorICAgICAgICAodm9pZCAqKVNITV9TVEFSVCwgc2htX2FkZHJlc3MpOworICB9CisgIGFvc19jb3JlX3VzZV9hZGRyZXNzX2FzX3NoYXJlZF9tZW0oc2htX2FkZHJlc3MsIFNJWkVPRlNITVNFRyk7CisgIExPRyhJTkZPLCAic2hhcmVkX21lbTogZW5kIG9mIGNyZWF0ZV9zaGFyZWRfbWVtIG93bmVyPSVkXG4iLAorICAgICAgICAgIGdsb2JhbF9jb3JlLT5vd25lcik7Cit9CisKK3ZvaWQgYW9zX2NvcmVfdXNlX2FkZHJlc3NfYXNfc2hhcmVkX21lbSh2b2lkICphZGRyZXNzLCBzaXplX3Qgc2l6ZSkgeworICBnbG9iYWxfY29yZS0+bWVtX3N0cnVjdCA9IGFkZHJlc3M7CisgIGdsb2JhbF9jb3JlLT5zaXplID0gc2l6ZTsKKyAgZ2xvYmFsX2NvcmUtPnNoYXJlZF9tZW0gPQorICAgICAgKHVpbnQ4X3QgKilhZGRyZXNzICsgc2l6ZW9mKCpnbG9iYWxfY29yZS0+bWVtX3N0cnVjdCk7CisgIGlmIChnbG9iYWxfY29yZS0+b3duZXIpIHsKKyAgICBnbG9iYWxfY29yZS0+bWVtX3N0cnVjdC0+bXNnX2FsbG9jID0gKHVpbnQ4X3QgKilhZGRyZXNzICsgZ2xvYmFsX2NvcmUtPnNpemU7CisgICAgaW5pdF9zaGFyZWRfbWVtX2NvcmUoZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QpOworICAgIGZ1dGV4X3NldCgmZ2xvYmFsX2NvcmUtPm1lbV9zdHJ1Y3QtPmNyZWF0aW9uX2NvbmRpdGlvbik7CisgIH0gZWxzZSB7CisgICAgaWYgKGZ1dGV4X3dhaXQoJmdsb2JhbF9jb3JlLT5tZW1fc3RydWN0LT5jcmVhdGlvbl9jb25kaXRpb24pICE9IDApIHsKKyAgICAgIExPRyhGQVRBTCwgIndhaXRpbmcgb24gY3JlYXRpb25fY29uZGl0aW9uIGZhaWxlZFxuIik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgYW9zX2NvcmVfZnJlZV9zaGFyZWRfbWVtKCkgeworICB2b2lkICpzaG1fYWRkcmVzcyA9IGdsb2JhbF9jb3JlLT5zaGFyZWRfbWVtOworICBpZiAobXVubWFwKCh2b2lkICopU0hNX1NUQVJULCBTSVpFT0ZTSE1TRUcpID09IC0xKSB7CisgICAgUExPRyhGQVRBTCwgIm11bm1hcCglcCwgMHglengpIGZhaWxlZCIsIHNobV9hZGRyZXNzLAorICAgICAgICAgKHNpemVfdClTSVpFT0ZTSE1TRUcpOworICB9CisgIGlmIChnbG9iYWxfY29yZS0+b3duZXIpIHsKKyAgICBpZiAoc2htX3VubGluayhnbG9iYWxfY29yZS0+c2htX25hbWUpKSB7CisgICAgICBQTE9HKEZBVEFMLCAic2hhcmVkX21lbTogc2htX3VubGluayglcykgZmFpbGVkIiwgZ2xvYmFsX2NvcmUtPnNobV9uYW1lKTsKKyAgICB9CisgIH0KK30KKworaW50IGFvc19jb3JlX2lzX2luaXQodm9pZCkgeworICByZXR1cm4gZ2xvYmFsX2NvcmUgIT0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2lwY19saWIvc2hhcmVkX21lbS5oIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi9zaGFyZWRfbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzZmQwYwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2lwY19saWIvc2hhcmVkX21lbS5oCkBAIC0wLDAgKzEsODcgQEAKKyNpZm5kZWYgX1NIQVJFRF9NRU1fSF8KKyNkZWZpbmUgX1NIQVJFRF9NRU1fSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvYW9zX3N5bmMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGFvc19jb3JlICpnbG9iYWxfY29yZSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CisKKy8vIFdoZXJlIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgc3RhcnRzIGluIGVhY2ggcHJvY2VzcydzIGFkZHJlc3Mgc3BhY2UuCisvLyBIYXMgdG8gYmUgdGhlIHNhbWUgaW4gYWxsIG9mIHRoZW0gc28gdGhhdCBzdHVmZiBpbiBzaGFyZWQgbWVtb3J5CisvLyBjYW4gaGF2ZSByZWd1bGFyIHBvaW50ZXJzIHRvIG90aGVyIHN0dWZmIGluIHNoYXJlZCBtZW1vcnkuCisjZGVmaW5lIFNITV9TVEFSVCAweDIwMDAwMDAwCisKKy8vIEEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBzb21lIGtpbmQgb2YgZ2xvYmFsIHBvaW50ZXIgdGhhdCBldmVyeXRoaW5nCisvLyBzaGFyZXMuCit0eXBlZGVmIHN0cnVjdCBhb3NfZ2xvYmFsX3BvaW50ZXJfdCB7CisgIHN0cnVjdCBhb3NfbXV0ZXggbG9jazsKKyAgdm9pZCAqcG9pbnRlcjsKK30gYW9zX2dsb2JhbF9wb2ludGVyOworCit0eXBlZGVmIHN0cnVjdCBhb3Nfc2htX2NvcmVfdCB7CisgIC8vIEdldHMgMC1pbml0aWFsaXplZCBhdCB0aGUgc3RhcnQgKGFzIHBhcnQgb2Ygc2hhcmVkIG1lbW9yeSkgYW5kCisgIC8vIHRoZSBvd25lciBzZXRzIGFzIHNvb24gYXMgaXQgZmluaXNoZXMgc2V0dGluZyBzdHVmZiB1cC4KKyAgYW9zX2NvbmRpdGlvbiBjcmVhdGlvbl9jb25kaXRpb247CisKKyAgLy8gQW4gb2Zmc2V0IGZyb20gQ0xPQ0tfUkVBTFRJTUUgdG8gdGltZXMgZm9yIGFsbCB0aGUgY29kZS4KKyAgLy8gVGhpcyBpcyBjdXJyZW50bHkgb25seSBzZXQgdG8gbm9uLXplcm8gYnkgdGhlIGxvZyByZXBsYXkgY29kZS4KKyAgLy8gVGhlcmUgaXMgbm8gc3luY2hyb25pemF0aW9uIG9uIHRoaXMgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIGJlY2F1c2UgaXQgaXMKKyAgLy8gb25seSB1cGRhdGVkIHdpdGggcHJvcGVyIG1lbW9yeSBiYXJyaWVycyB3aGVuIG9ubHkgYSBzaW5nbGUgdGFzayBpcworICAvLyBydW5uaW5nLgorICBzdHJ1Y3QgdGltZXNwZWMgdGltZV9vZmZzZXQ7CisKKyAgc3RydWN0IGFvc19tdXRleCBtc2dfYWxsb2NfbG9jazsKKyAgdm9pZCAqbXNnX2FsbG9jOworCisgIC8vIEEgcG9pbnRlciB0byB0aGUgaGVhZCBvZiB0aGUgbGlua2VkIGxpc3Qgb2YgcXVldWVzLgorICAvLyBwb2ludGVyIHBvaW50cyB0byBhIDo6YW9zOjpRdWV1ZS4KKyAgYW9zX2dsb2JhbF9wb2ludGVyIHF1ZXVlczsKKyAgLy8gQSBwb2ludGVyIHRvIHRoZSBoZWFkIG9mIHRoZSBsaW5rZWQgbGlzdCBvZiBxdWV1ZSBtZXNzYWdlIHR5cGVzLgorICAvLyBwb2ludGVyIHBvaW50cyB0byBhIDo6YW9zOjp0eXBlX2NhY2hlOjpTaG1UeXBlLgorICBhb3NfZ2xvYmFsX3BvaW50ZXIgcXVldWVfdHlwZXM7Cit9IGFvc19zaG1fY29yZTsKKworc3RydWN0IGFvc19jb3JlIHsKKyAgLy8gTm9uLTAgaWYgd2UgIm93biIgc2hhcmVkX21lbSBhbmQgc2hvdWxkIHNobV91bmxpbmsoMykgaXQgd2hlbiB3ZSdyZSBkb25lLgorICBpbnQgb3duZXI7CisgIHZvaWQgKnNoYXJlZF9tZW07CisgIC8vIEhvdyBsYXJnZSB0aGUgY2h1bmsgb2Ygc2hhcmVkIG1lbW9yeSBpcy4KKyAgcHRyZGlmZl90IHNpemU7CisgIGFvc19zaG1fY29yZSAqbWVtX3N0cnVjdDsKKyAgLy8gRm9yIHRoZSBvd25lciB0byBzdG9yZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB1bmxpbmsgd2hlbiBjbG9zaW5nLgorICBjb25zdCBjaGFyICpzaG1fbmFtZTsKK307CisKK3ZvaWQgaW5pdF9zaGFyZWRfbWVtX2NvcmUoYW9zX3NobV9jb3JlICpzaG1fY29yZSk7CisKK3B0cmRpZmZfdCBhb3NfY29yZV9nZXRfbWVtX3VzYWdlKHZvaWQpOworCisvLyBUYWtlcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBhZGRyZXNzIGFuZCB1c2VzIGl0IGFzIHRoZSBzaGFyZWQgbWVtb3J5LgorLy8gYWRkcmVzcyBpcyB0aGUgbWVtb3J5IGFkZHJlc3MsIGFuZCBzaXplIGlzIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkuCisvLyBnbG9iYWxfY29yZSBuZWVkcyB0byBwb2ludCB0byBhbiBpbnN0YW5jZSBvZiBzdHJ1Y3QgYW9zX2NvcmUsIGFuZCBvd25lcgorLy8gc2hvdWxkIGJlIHNldCBjb3JyZWN0bHkgdGhlcmUuCisvLyBUaGUgb3duZXIgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBmaXJzdCBzaXplb2YobXV0ZXgpIG9mIGRhdGEgaXMgc2V0IHRvIDAKKy8vIGJlZm9yZSBwYXNzaW5nIHRoZSBtZW1vcnkgdG8gdGhpcyBmdW5jdGlvbi4KK3ZvaWQgYW9zX2NvcmVfdXNlX2FkZHJlc3NfYXNfc2hhcmVkX21lbSh2b2lkICphZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8vIGNyZWF0ZSBpcyB0cnVlIHRvIHJlbW92ZSBhbnkgZXhpc3Rpbmcgc2htIHRvIGNyZWF0ZSBhIGZyZXNoIG9uZSBvciBmYWxzZSB0bworLy8gZmFpbCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorLy8gbG9jayBpcyB0cnVlIHRvIGxvY2sgc2hhcmVkIG1lbW9yeSBpbnRvIFJBTSBvciBmYWxzZSB0byBub3QuCit2b2lkIGFvc19jb3JlX2NyZWF0ZV9zaGFyZWRfbWVtKGludCBjcmVhdGUsIGludCBsb2NrKTsKK3ZvaWQgYW9zX2NvcmVfZnJlZV9zaGFyZWRfbWVtKHZvaWQpOworCisvLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzaGFyZWQgbWVtb3J5IHN5c3RlbSBpcyBhY3RpdmUuCitpbnQgYW9zX2NvcmVfaXNfaW5pdCh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9pcGNfbGliL3VuaXF1ZV9tZXNzYWdlX3B0ci5oIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi91bmlxdWVfbWVzc2FnZV9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzBhNGMwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvaXBjX2xpYi91bmlxdWVfbWVzc2FnZV9wdHIuaApAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2F0b21fY29kZS9pcGNfbGliL3F1ZXVlLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIHF1ZXVlX2ZyZWUgeworIHB1YmxpYzoKKyAgcXVldWVfZnJlZShSYXdRdWV1ZSAqcXVldWUpIDogcXVldWVfKHF1ZXVlKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBUICptZXNzYWdlKSB7CisgICAgcXVldWVfLT5GcmVlTWVzc2FnZShzdGF0aWNfY2FzdDxjb25zdCB2b2lkICo+KG1lc3NhZ2UpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgUmF3UXVldWUgKmNvbnN0IHF1ZXVlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgdW5pcXVlX21lc3NhZ2VfcHRyIDogcHVibGljIDo6c3RkOjp1bmlxdWVfcHRyPFQsIDo6YW9zOjppbnRlcm5hbDo6cXVldWVfZnJlZTxUPj4geworIHB1YmxpYzoKKyAgdW5pcXVlX21lc3NhZ2VfcHRyKFJhd1F1ZXVlICpxdWV1ZSwgVCAqbWVzc2FnZSA9IE5VTEwpCisgICAgICA6IDo6c3RkOjp1bmlxdWVfcHRyPFQsIDo6YW9zOjppbnRlcm5hbDo6cXVldWVfZnJlZTxUPj4obWVzc2FnZSwgOjphb3M6OmludGVybmFsOjpxdWV1ZV9mcmVlPFQ+KHF1ZXVlKSkge30KKworICAvLyBQZXJmZWN0bHkgZm9yd2FyZCB0aGlzIHNvIHRoYXQgdGhlIG1vdmUgZnVuY3Rpb25hbGl0eSBvZiA6OnN0ZDo6dW5pcXVlX3B0cgorICAvLyB3b3Jrcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgIHVuaXF1ZV9tZXNzYWdlX3B0cjxUPiAmb3BlcmF0b3I9KEFyZ3MgJiYuLi4gYXJncykgeworICAgICAgICA6OnN0ZDo6dW5pcXVlX3B0cjxULCA6OmFvczo6aW50ZXJuYWw6OnF1ZXVlX2ZyZWU8VD4+OjpvcGVyYXRvcj0oCisgICAgICAgICAgICA6OnN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXAgYi9hb3MvbGludXhfY29kZS9saW51eF9jb2RlLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWY1ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXAKQEAgLTAsMCArMSw3NiBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZHVtcF9ydHByaW8nLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnbm9fcnN5bmMnOiAxLAorICAgICAgfSwKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZHVtcF9ydHByaW8uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY29tcGxleF90aHJlYWRfbG9jYWwnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjb21wbGV4X3RocmVhZF9sb2NhbC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpvbmNlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpkaWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdjb21wbGV4X3RocmVhZF9sb2NhbF90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjb21wbGV4X3RocmVhZF9sb2NhbF90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnY29tcGxleF90aHJlYWRfbG9jYWwnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDp0aHJlYWQnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2luaXQnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdpbml0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvaXBjX2xpYi9pcGNfbGliLmd5cDpzaGFyZWRfbWVtJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpkaWUnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvbmZpZ3VyYXRpb24nLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjb25maWd1cmF0aW9uLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOm9uY2UnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvcmUnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2NvcmUuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdpbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpydW5fY29tbWFuZCcsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9sb2dnaW5nL2JpbmFyeV9sb2dfZmlsZS5jYyBiL2Fvcy9saW51eF9jb2RlL2xvZ2dpbmcvYmluYXJ5X2xvZ19maWxlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjNmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2JpbmFyeV9sb2dfZmlsZS5jYwpAQCAtMCwwICsxLDI2MyBAQAorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2xvZ2dpbmcvYmluYXJ5X2xvZ19maWxlLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbG9nZ2luZyB7CituYW1lc3BhY2UgbGludXhfY29kZSB7CituYW1lc3BhY2UgeworCit1bnNpZ25lZCBsb25nIFN5c3RlbVBhZ2VTaXplKCkgeworICBzdGF0aWMgdW5zaWduZWQgbG9uZyByID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworICByZXR1cm4gcjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0xvZ0ZpbGVBY2Nlc3Nvcjo6TG9nRmlsZUFjY2Vzc29yKGludCBmZCwgYm9vbCB3cml0YWJsZSkKKyAgICA6IGZkXyhmZCksIHdyaXRhYmxlXyh3cml0YWJsZSksIG9mZnNldF8oMCksIGN1cnJlbnRfKDApLCBwb3NpdGlvbl8oMCkgeworICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCBtbWFwIHdpbGwgYWxsb3cgbW1hcGluZyBpbiBjaHVua3Mgb2Yga1BhZ2VTaXplLgorICBpZiAoU3lzdGVtUGFnZVNpemUoKSA+IGtQYWdlU2l6ZSB8fCAoa1BhZ2VTaXplICUgU3lzdGVtUGFnZVNpemUoKSkgIT0gMCkgeworICAgIExPRyhGQVRBTCwgInN5c3RlbSBwYWdlIHNpemUgKCVsdSkgbm90IGZhY3RvciBvZiBrUGFnZVNpemUgKCV6ZCkuXG4iLAorICAgICAgICBTeXN0ZW1QYWdlU2l6ZSgpLCBrUGFnZVNpemUpOworICB9CisKKyAgTWFwTmV4dFBhZ2UoKTsKK30KKwordm9pZCBMb2dGaWxlQWNjZXNzb3I6OlN5bmMoKSBjb25zdCB7CisgIG1zeW5jKGN1cnJlbnRfLCBrUGFnZVNpemUsIE1TX0FTWU5DIHwgTVNfSU5WQUxJREFURSk7Cit9CisKK3ZvaWQgTG9nRmlsZUFjY2Vzc29yOjpTa2lwVG9MYXN0U2Vla2FibGVQYWdlKCkgeworICBDSEVDSyhkZWZpbml0ZWx5X3VzZV9tbWFwKCkpOworCisgIHN0cnVjdCBzdGF0IGluZm87CisgIGlmIChmc3RhdChmZF8sICZpbmZvKSA9PSAtMSkgeworICAgIFBMT0coRkFUQUwsICJmc3RhdCglZCwgJXApIGZhaWxlZCIsIGZkXywgJmluZm8pOworICB9CisKKyAgQ0hFQ0soKGluZm8uc3Rfc2l6ZSAlIGtQYWdlU2l6ZSkgPT0gMCk7CisgIGNvbnN0IGF1dG8gbGFzdF9yZWFkYWJsZV9wYWdlX251bWJlciA9IChpbmZvLnN0X3NpemUgLyBrUGFnZVNpemUpIC0gMTsKKyAgY29uc3QgYXV0byBsYXN0X3NlZWthYmxlX3BhZ2VfbnVtYmVyID0KKyAgICAgIGxhc3RfcmVhZGFibGVfcGFnZV9udW1iZXIgLyBrU2Vla1BhZ2VzICoga1NlZWtQYWdlczsKKyAgY29uc3Qgb2ZmX3QgbmV3X29mZnNldCA9IGxhc3Rfc2Vla2FibGVfcGFnZV9udW1iZXIgKiBrUGFnZVNpemU7CisgIC8vIFdlIGRvbid0IHdhbnQgdG8gZ28gYmFja3dhcmRzLi4uCisgIGlmIChuZXdfb2Zmc2V0ID4gb2Zmc2V0XykgeworICAgIFVubWFwKGN1cnJlbnRfKTsKKyAgICBvZmZzZXRfID0gbmV3X29mZnNldDsKKyAgICBNYXBOZXh0UGFnZSgpOworICB9Cit9CisKKy8vIFRoZSBvbmx5IHdheSB0byB0ZWxsIGlzIHVzaW5nIGZzdGF0LCBidXQgd2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gYmUgbWFraW5nIGEKKy8vIHN5c2NhbGwgZXZlcnkgc2luZ2xlIHRpbWUgc29tZWJvZHkgd2FudHMgdG8ga25vdyB0aGUgYW5zd2VyLCBzbyBpdCBnZXRzCisvLyBjYWNoZWQgaW4gaXNfbGFzdF9wYWdlXy4KK2Jvb2wgTG9nRmlsZUFjY2Vzc29yOjpJc0xhc3RQYWdlKCkgeworICBpZiAoaXNfbGFzdF9wYWdlXyAhPSBNYXliZTo6a1Vua25vd24pIHsKKyAgICByZXR1cm4gaXNfbGFzdF9wYWdlXyA9PSBNYXliZTo6a1llczsKKyAgfQorCisgIHN0cnVjdCBzdGF0IGluZm87CisgIGlmIChmc3RhdChmZF8sICZpbmZvKSA9PSAtMSkgeworICAgIFBMT0coRkFUQUwsICJmc3RhdCglZCwgJXApIGZhaWxlZCIsIGZkXywgJmluZm8pOworICB9CisgIGJvb2wgciA9IG9mZnNldF8gPT0gc3RhdGljX2Nhc3Q8b2ZmX3Q+KGluZm8uc3Rfc2l6ZSAtIGtQYWdlU2l6ZSk7CisgIGlzX2xhc3RfcGFnZV8gPSByID8gTWF5YmU6OmtZZXMgOiBNYXliZTo6a05vOworICByZXR1cm4gcjsKK30KKwordm9pZCBMb2dGaWxlQWNjZXNzb3I6Ok1hcE5leHRQYWdlKCkgeworICBpZiAod3JpdGFibGVfKSB7CisgICAgaWYgKGZ0cnVuY2F0ZShmZF8sIG9mZnNldF8gKyBrUGFnZVNpemUpID09IC0xKSB7CisgICAgICBQTE9HKEZBVEFMLCAiZnRydW5jYXRlKCVkLCAlemQpIGZhaWxlZCIsIGZkXywga1BhZ2VTaXplKTsKKyAgICB9CisgIH0KKworICBpZiAodXNlX3JlYWRfID09IE1heWJlOjprWWVzKSB7CisgICAgc3NpemVfdCB0b2RvID0ga1BhZ2VTaXplOworICAgIHdoaWxlICh0b2RvID4gMCkgeworICAgICAgc3NpemVfdCByZXN1bHQgPSByZWFkKGZkXywgY3VycmVudF8gKyAoa1BhZ2VTaXplIC0gdG9kbyksIHRvZG8pOworICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBQTE9HKEZBVEFMLCAicmVhZCglZCwgJXAsICV6dSkgZmFpbGVkIiwgZmRfLAorICAgICAgICAgICAgIGN1cnJlbnRfICsgKGtQYWdlU2l6ZSAtIHRvZG8pLCB0b2RvKTsKKyAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgbWVtc2V0KGN1cnJlbnRfLCAwLCB0b2RvKTsKKyAgICAgICAgcmVzdWx0ID0gdG9kbzsKKyAgICAgIH0KKyAgICAgIHRvZG8gLT0gcmVzdWx0OworICAgIH0KKyAgICBDSEVDS19FUSgwLCB0b2RvKTsKKyAgfSBlbHNlIHsKKyAgICBjdXJyZW50XyA9IHN0YXRpY19jYXN0PGNoYXIgKj4oCisgICAgICAgIG1tYXAoTlVMTCwga1BhZ2VTaXplLCBQUk9UX1JFQUQgfCAod3JpdGFibGVfID8gUFJPVF9XUklURSA6IDApLAorICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkXywgb2Zmc2V0XykpOworICAgIGlmIChjdXJyZW50XyA9PSBNQVBfRkFJTEVEKSB7CisgICAgICBpZiAoIXdyaXRhYmxlXyAmJiB1c2VfcmVhZF8gPT0gTWF5YmU6OmtVbmtub3duICYmIGVycm5vID09IEVOT0RFVikgeworICAgICAgICBMT0coSU5GTywgIkZhbGxpbmcgYmFjayB0byByZWFkaW5nIHRoZSBmaWxlIHVzaW5nIHJlYWQoMikuXG4iKTsKKyAgICAgICAgdXNlX3JlYWRfID0gTWF5YmU6OmtZZXM7CisgICAgICAgIGN1cnJlbnRfID0gbmV3IGNoYXJba1BhZ2VTaXplXTsKKyAgICAgICAgTWFwTmV4dFBhZ2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUExPRyhGQVRBTCwKKyAgICAgICAgICAgICAibW1hcChOVUxMLCAlemQsIFBST1RfUkVBRCBbIHwgUFJPVF9XUklURV0sIE1BUF9TSEFSRUQsICVkLCAlamQpIgorICAgICAgICAgICAgICIgZmFpbGVkIiwKKyAgICAgICAgICAgICBrUGFnZVNpemUsIGZkXywgc3RhdGljX2Nhc3Q8aW50bWF4X3Q+KG9mZnNldF8pKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdXNlX3JlYWRfID0gTWF5YmU6OmtObzsKKyAgICB9CisgICAgaWYgKG1hZHZpc2UoY3VycmVudF8sIGtQYWdlU2l6ZSwgTUFEVl9TRVFVRU5USUFMIHwgTUFEVl9XSUxMTkVFRCkgPT0gLTEpIHsKKyAgICAgIFBMT0coV0FSTklORywgIm1hZHZpc2UoJXAsICV6ZCwgTUFEVl9TRVFVRU5USUFMIHwgTUFEVl9XSUxMTkVFRCkgZmFpbGVkIiwKKyAgICAgICAgICAgY3VycmVudF8sIGtQYWdlU2l6ZSk7CisgICAgfQorICB9CisgIG9mZnNldF8gKz0ga1BhZ2VTaXplOworfQorCit2b2lkIExvZ0ZpbGVBY2Nlc3Nvcjo6VW5tYXAodm9pZCAqbG9jYXRpb24pIHsKKyAgQ0hFQ0tfTkUoTWF5YmU6OmtVbmtub3duLCB1c2VfcmVhZF8pOworCisgIGlmICh1c2VfcmVhZF8gPT0gTWF5YmU6OmtObykgeworICAgIGlmIChtdW5tYXAobG9jYXRpb24sIGtQYWdlU2l6ZSkgPT0gLTEpIHsKKyAgICAgIFBMT0coRkFUQUwsICJtdW5tYXAoJXAsICV6ZCkgZmFpbGVkIiwgbG9jYXRpb24sIGtQYWdlU2l6ZSk7CisgICAgfQorICB9CisgIGlzX2xhc3RfcGFnZV8gPSBNYXliZTo6a1Vua25vd247CisgIHBvc2l0aW9uXyA9IDA7Cit9CisKK2NvbnN0IExvZ0ZpbGVNZXNzYWdlSGVhZGVyICpMb2dGaWxlUmVhZGVyOjpSZWFkTmV4dE1lc3NhZ2UoYm9vbCB3YWl0KSB7CisgIExvZ0ZpbGVNZXNzYWdlSGVhZGVyICpyOworICBkbyB7CisgICAgciA9IHN0YXRpY19jYXN0PExvZ0ZpbGVNZXNzYWdlSGVhZGVyICo+KAorICAgICAgICBzdGF0aWNfY2FzdDx2b2lkICo+KCZjdXJyZW50KClbcG9zaXRpb24oKV0pKTsKKyAgICBpZiAod2FpdCkgeworICAgICAgQ0hFQ0soZGVmaW5pdGVseV91c2VfbW1hcCgpKTsKKyAgICAgIGlmIChmdXRleF93YWl0KCZyLT5tYXJrZXIpICE9IDApIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoci0+bWFya2VyID09IDIpIHsKKyAgICAgIFVubWFwKGN1cnJlbnQoKSk7CisgICAgICBNYXBOZXh0UGFnZSgpOworICAgICAgQ2hlY2tDdXJyZW50UGFnZVJlYWRhYmxlKCk7CisgICAgICByID0gc3RhdGljX2Nhc3Q8TG9nRmlsZU1lc3NhZ2VIZWFkZXIgKj4oc3RhdGljX2Nhc3Q8dm9pZCAqPihjdXJyZW50KCkpKTsKKyAgICB9CisgIH0gd2hpbGUgKHdhaXQgJiYgci0+bWFya2VyID09IDApOworICBpZiAoci0+bWFya2VyID09IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBJbmNyZW1lbnRQb3NpdGlvbihzaXplb2YoTG9nRmlsZU1lc3NhZ2VIZWFkZXIpICsgci0+bmFtZV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgci0+bWVzc2FnZV9zaXplKTsKKyAgaWYgKHBvc2l0aW9uKCkgPj0ga1BhZ2VTaXplKSB7CisgICAgLy8gSXQncyBhIGxvdCBiZXR0ZXIgdG8gYmxvdyB1cCBoZXJlIHJhdGhlciB0aGFuIGdldHRpbmcgU0lHQlVTIGVycm9ycyB0aGUKKyAgICAvLyBuZXh0IHRpbWUgd2UgdHJ5IHRvIHJlYWQuLi4KKyAgICBMT0coRkFUQUwsICJjb3JydXB0IGxvZyBmaWxlIHJ1bm5pbmcgb3ZlciBwYWdlIHNpemVcbiIpOworICB9CisgIHJldHVybiByOworfQorCisvLyBUaGlzIG1lc3MgaXMgYmVjYXVzZSB0aGUgb25seSBub3QgY29tcGxldGVseSBoYWNraXNoIHdheSB0byBkbyB0aGlzIGlzIHRvIHNldAorLy8gdXAgYSBoYW5kbGVyIGZvciBTSUdCVVMvU0lHU0VHViB0aGF0IHNpZ2xvbmdqbXBzIG91dCB0byBhdm9pZCBlaXRoZXIgdGhlCisvLyBpbnN0cnVjdGlvbiBiZWluZyByZXBlYXRlZCBpbmZpbml0ZWx5IChhbmQgbW9yZSBzaWduYWxzIGJlaW5nIGRlbGl2ZXJlZCkgb3IKKy8vICh3aXRoIFNBX1JFU0VUSEFORCkgdGhlIHNpZ25hbCBraWxsaW5nIHRoZSBwcm9jZXNzLgorbmFtZXNwYWNlIHsKKwordm9pZCAqdm9sYXRpbGUgZmF1bHRfYWRkcmVzczsKK3NpZ2ptcF9idWYganVtcF9jb250ZXh0OworCit2b2lkIENoZWNrQ3VycmVudFBhZ2VSZWFkYWJsZUhhbmRsZXIoaW50IC8qc2lnbmFsKi8sIHNpZ2luZm9fdCAqaW5mbywgdm9pZCAqKSB7CisgIGZhdWx0X2FkZHJlc3MgPSBpbmZvLT5zaV9hZGRyOworCisgIHNpZ2xvbmdqbXAoanVtcF9jb250ZXh0LCAxKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit2b2lkIExvZ0ZpbGVSZWFkZXI6OkNoZWNrQ3VycmVudFBhZ2VSZWFkYWJsZSgpIHsKKyAgaWYgKGRlZmluaXRlbHlfdXNlX3JlYWQoKSkgcmV0dXJuOworCisgIGlmIChzaWdzZXRqbXAoanVtcF9jb250ZXh0LCAxKSA9PSAwKSB7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247CisgICAgYWN0aW9uLnNhX3NpZ2FjdGlvbiA9IENoZWNrQ3VycmVudFBhZ2VSZWFkYWJsZUhhbmRsZXI7CisgICAgc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKKyAgICBhY3Rpb24uc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQgfCBTQV9TSUdJTkZPOworICAgIHN0cnVjdCBzaWdhY3Rpb24gcHJldmlvdXNfYnVzLCBwcmV2aW91c19zZWd2OworICAgIGlmIChzaWdhY3Rpb24oU0lHQlVTLCAmYWN0aW9uLCAmcHJldmlvdXNfYnVzKSA9PSAtMSkgeworICAgICAgUExPRyhGQVRBTCwgInNpZ2FjdGlvbihTSUdCVVMoPSVkKSwgJXAsICVwKSBmYWlsZWQiLAorICAgICAgICAgICBTSUdCVVMsICZhY3Rpb24sICZwcmV2aW91c19idXMpOworICAgIH0KKyAgICBpZiAoc2lnYWN0aW9uKFNJR1NFR1YsICZhY3Rpb24sICZwcmV2aW91c19zZWd2KSA9PSAtMSkgeworICAgICAgUExPRyhGQVRBTCwgInNpZ2FjdGlvbihTSUdTRUdWKD0lZCksICVwLCAlcCkgZmFpbGVkIiwKKyAgICAgICAgICAgU0lHU0VHViwgJmFjdGlvbiwgJnByZXZpb3VzX3NlZ3YpOworICAgIH0KKworICAgIGNoYXIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgYyA9IGN1cnJlbnQoKVswXTsKKworICAgIGlmIChzaWdhY3Rpb24oU0lHQlVTLCAmcHJldmlvdXNfYnVzLCBOVUxMKSA9PSAtMSkgeworICAgICAgUExPRyhGQVRBTCwgInNpZ2FjdGlvbihTSUdCVVMoPSVkKSwgJXAsIE5VTEwpIGZhaWxlZCIsCisgICAgICAgICAgIFNJR0JVUywgJnByZXZpb3VzX2J1cyk7CisgICAgfQorICAgIGlmIChzaWdhY3Rpb24oU0lHU0VHViwgJnByZXZpb3VzX3NlZ3YsIE5VTEwpID09IC0xKSB7CisgICAgICBQTE9HKEZBVEFMLCAic2lnYWN0aW9uKFNJR1NFR1YoPSVkKSwgJXAsIE5VTEwpIGZhaWxlZCIsCisgICAgICAgICAgIFNJR1NFR1YsICZwcmV2aW91c19zZWd2KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZhdWx0X2FkZHJlc3MgPT0gY3VycmVudCgpKSB7CisgICAgICBMT0coRkFUQUwsICJjb3VsZCBub3QgcmVhZCAxIGJ5dGUgYXQgb2Zmc2V0IDB4JWp4IGludG8gbG9nIGZpbGVcbiIsCisgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludG1heF90PihvZmZzZXQoKSkpOworICAgIH0gZWxzZSB7CisgICAgICBMT0coRkFUQUwsICJmYXVsdGVkIGF0ICVwLCBub3QgJXAgbGlrZSB3ZSB3ZXJlIChtYXliZSkgc3VwcG9zZWQgdG9cbiIsCisgICAgICAgICAgZmF1bHRfYWRkcmVzcywgY3VycmVudCgpKTsKKyAgICB9CisgIH0KK30KKworTG9nRmlsZU1lc3NhZ2VIZWFkZXIgKkxvZ0ZpbGVXcml0ZXI6OkdldFdyaXRlUG9zaXRpb24oc2l6ZV90IG1lc3NhZ2Vfc2l6ZSkgeworICBpZiAoTmVlZE5ld1BhZ2VGb3IobWVzc2FnZV9zaXplKSkgRm9yY2VOZXdQYWdlKCk7CisgIExvZ0ZpbGVNZXNzYWdlSGVhZGVyICpjb25zdCByID0gc3RhdGljX2Nhc3Q8TG9nRmlsZU1lc3NhZ2VIZWFkZXIgKj4oCisgICAgICBzdGF0aWNfY2FzdDx2b2lkICo+KCZjdXJyZW50KClbcG9zaXRpb24oKV0pKTsKKyAgSW5jcmVtZW50UG9zaXRpb24obWVzc2FnZV9zaXplKTsKKyAgcmV0dXJuIHI7Cit9CisKKy8vIEEgbnVtYmVyIG9mIHNlZWthYmxlIHBhZ2VzLCBub3QgdGhlIGFjdHVhbCBmaWxlIG9mZnNldCwgaXMgc3RvcmVkIGluICpjb29raWUuCitib29sIExvZ0ZpbGVXcml0ZXI6OlNob3VsZENsZWFyU2Vla2FibGVEYXRhKG9mZl90ICpjb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZXh0X21lc3NhZ2Vfc2l6ZSkgY29uc3QgeworICBvZmZfdCBuZXh0X21lc3NhZ2VfcGFnZSA9IChvZmZzZXQoKSAvIGtQYWdlU2l6ZSkgLSAxOworICBpZiAoTmVlZE5ld1BhZ2VGb3IobmV4dF9tZXNzYWdlX3NpemUpKSB7CisgICAgKytuZXh0X21lc3NhZ2VfcGFnZTsKKyAgfQorICBjb25zdCBvZmZfdCBjdXJyZW50X3NlZWthYmxlX3BhZ2UgPSBuZXh0X21lc3NhZ2VfcGFnZSAvIGtTZWVrUGFnZXM7CisgIENIRUNLX0xFKCpjb29raWUsIGN1cnJlbnRfc2Vla2FibGVfcGFnZSk7CisgIGNvbnN0IGJvb2wgciA9ICpjb29raWUgIT0gY3VycmVudF9zZWVrYWJsZV9wYWdlOworICAqY29va2llID0gY3VycmVudF9zZWVrYWJsZV9wYWdlOworICByZXR1cm4gcjsKK30KKworYm9vbCBMb2dGaWxlV3JpdGVyOjpOZWVkTmV3UGFnZUZvcihzaXplX3QgYnl0ZXMpIGNvbnN0IHsKKyAgcmV0dXJuIHBvc2l0aW9uKCkgKyBieXRlcyArIChrQWxpZ25tZW50IC0gKGJ5dGVzICUga0FsaWdubWVudCkpICsKKyAgICAgICAgICAgICBzaXplb2YoYW9zX2Z1dGV4KSA+CisgICAgICAgICBrUGFnZVNpemU7Cit9CisKK3ZvaWQgTG9nRmlsZVdyaXRlcjo6Rm9yY2VOZXdQYWdlKCkgeworICBjaGFyICpjb25zdCB0ZW1wID0gY3VycmVudCgpOworICBNYXBOZXh0UGFnZSgpOworICBpZiAoZnV0ZXhfc2V0X3ZhbHVlKAorICAgICAgICAgIHN0YXRpY19jYXN0PGFvc19mdXRleCAqPihzdGF0aWNfY2FzdDx2b2lkICo+KCZ0ZW1wW3Bvc2l0aW9uKCldKSksCisgICAgICAgICAgMikgPT0gLTEpIHsKKyAgICBQTE9HKFdBUk5JTkcsICJyZWFkZXJzIHdpbGwgaGFuZyBiZWNhdXNlIGZ1dGV4X3NldF92YWx1ZSglcCwgMikgZmFpbGVkIiwKKyAgICAgICAgICZ0ZW1wW3Bvc2l0aW9uKCldKTsKKyAgfQorICBVbm1hcCh0ZW1wKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGxpbnV4X2NvZGUKK30gIC8vIG5hbWVzcGFjZSBsb2dnaW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9sb2dnaW5nL2JpbmFyeV9sb2dfZmlsZS5oIGIvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9iaW5hcnlfbG9nX2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Y5ZGExCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9iaW5hcnlfbG9nX2ZpbGUuaApAQCAtMCwwICsxLDIwNyBAQAorI2lmbmRlZiBBT1NfTElOVVhfQ09ERV9MT0dHSU5HX0JJTkFSWV9MT0dfRklMRV9IXworI2RlZmluZSBBT1NfTElOVVhfQ09ERV9MT0dHSU5HX0JJTkFSWV9MT0dfRklMRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGxvZ2dpbmcgeworbmFtZXNwYWNlIGxpbnV4X2NvZGUgeworCisvLyBXaGF0IHRvIGFsaWduIG1lc3NhZ2VzIHRvLiBBIG1hY3JvIGJlY2F1c2UgaXQgZ2V0cyB1c2VkIGluIGF0dHJpYnV0ZXMuCisvLyBUaGlzIGRlZmluaXRpb24gZ2V0cyAjdW5kZWZlZCBsYXRlci4gVXNlIExvZ0ZpbGVBY2Nlc3Nvcjo6a0FsaWdubWVudCBpbnN0ZWFkLgorI2RlZmluZSBNRVNTQUdFX0FMSUdOTUVOVCA4CisKKy8vIEZpbGUgZm9ybWF0OiB7CisvLyAgIExvZ0ZpbGVNZXNzYWdlSGVhZGVyIGhlYWRlcjsKKy8vICAgY2hhciAqbmFtZTsgIC8vIG9mIHRoZSBwcm9jZXNzIHRoYXQgd3JvdGUgdGhlIG1lc3NhZ2UKKy8vICAgdm9pZCAqbWVzc2FnZTsKKy8vIH0gbm90IGNyb3NzaW5nIGtQYWdlU2l6ZSBib3VuZGFyaWVzIGludG8gdGhlIGZpbGUgYW5kIGFsaWduZWQgdG8KKy8vIE1FU1NBR0VfQUxJR05NRU5ULgorLy8KKy8vIEZpZWxkIHNpemVzIGRlc2lnbmVkIHRvIGZpdCB0aGUgdmFyaW91cyB2YWx1ZXMgZnJvbSBMb2dNZXNzYWdlIGV2ZW4gb24KKy8vIG90aGVyIG1hY2hpbmVzIChob3BlZnVsbHkpIGJlY2F1c2UgdGhleSdyZSBiYWtlZCBpbnRvIHRoZSBmaWxlcy4gVGhleSBhcmUKKy8vIGxheWVkIG91dCBzbyB0aGF0IGFsbCBvZiB0aGUgZmllbGRzIGFyZSBhbGlnbmVkIGV2ZW4gdGhvdWdoIHRoZSB3aG9sZSB0aGluZworLy8gaXMgcGFja2VkLgorLy8KKy8vIEEgbG90IG9mIHRoZSBmaWVsZHMgZG9uJ3QgaGF2ZSBjb21tZW50cyBiZWNhdXNlIHRoZXkncmUgdGhlIHNhbWUgYXMgdGhlCisvLyBpZGVudGljYWxseSBuYW1lZCBmaWVsZHMgaW4gTG9nTWVzc2FnZS4KK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKE1FU1NBR0VfQUxJR05NRU5UKSkpIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisgICAgTG9nRmlsZU1lc3NhZ2VIZWFkZXIgeworICAvLyBSZXByZXNlbnRzIHRoZSB0eXBlIG9mIGFuIGluZGl2aWR1YWwgbWVzc2FnZS4KKyAgZW51bSBjbGFzcyBNZXNzYWdlVHlwZSA6IHVpbnQxNl90IHsKKyAgICAvLyBjaGFyW10gKG5vICdcMCcgb24gdGhlIGVuZCkuCisgICAga1N0cmluZywKKyAgICBrU3RydWN0VHlwZSwKKyAgICBrU3RydWN0LAorICAgIGtNYXRyaXgsCisgIH07CisKKyAgLy8gR2V0cyBmdXRleF9zZXQgb25jZSB0aGlzIG9uZSBoYXMgYmVlbiB3cml0dGVuCisgIC8vIGZvciByZWFkZXJzIGtlZXBpbmcgdXAgd2l0aCBhIGxpdmUgd3JpdGVyLgorICAvLworICAvLyBHZXRzIGluaXRpYWxpemVkIHRvIDAgYnkgZnRydW5jYXRlLgorICAvLworICAvLyBUaGVyZSB3aWxsIGJlIHNvbWV0aGluZyBoZXJlIGFmdGVyIHRoZSBsYXN0IG1lc3NhZ2Ugb24gYSAicGFnZSIgc2V0IHRvIDIKKyAgLy8gKGJ5IHRoZSBmdXRleF9zZXQpIHRvIGluZGljYXRlIHRoYXQgdGhlIG5leHQgbWVzc2FnZSBpcyBvbiB0aGUgbmV4dCBwYWdlLgorICBhb3NfZnV0ZXggbWFya2VyOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtYXJrZXIpID09IDQsICJtdXRleCBjaGFuZ2VkIHNpemUhIik7CisgIHN0YXRpY19hc3NlcnQoTUVTU0FHRV9BTElHTk1FTlQgPj0gYWxpZ25vZihhb3NfZnV0ZXgpLAorICAgICAgICAgICAgICAgICJNRVNTQUdFX0FMSUdOTUVOVCBpcyB0b28gc21hbGwiKTsKKworICB1aW50MzJfdCB0aW1lX3NlYzsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodGltZV9zZWMpID49IHNpemVvZihMb2dNZXNzYWdlOjpzZWNvbmRzKSwKKyAgICAgICAgICAgICAgICAidHZfc2VjIHdvbid0IGZpdCIpOworICB1aW50MzJfdCB0aW1lX25zZWM7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHRpbWVfbnNlYykgPj0gc2l6ZW9mKExvZ01lc3NhZ2U6Om5zZWNvbmRzKSwKKyAgICAgICAgICAgICAgICAidHZfbnNlYyB3b24ndCBmaXQiKTsKKworICBpbnQzMl90IHNvdXJjZTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2Yoc291cmNlKSA+PSBzaXplb2YoTG9nTWVzc2FnZTo6c291cmNlKSwgIlBJRHMgd29uJ3QgZml0Iik7CisKKyAgLy8gQm90aCBpbmNsdWRpbmcgYWxsIG9mIHRoZSBieXRlcyBpbiB0aGF0IHBhcnQgb2YgdGhlIG1lc3NhZ2UuCisgIHVpbnQzMl90IG5hbWVfc2l6ZSwgbWVzc2FnZV9zaXplOworCisgIHVpbnQxNl90IHNlcXVlbmNlOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihzZXF1ZW5jZSkgPT0gc2l6ZW9mKExvZ01lc3NhZ2U6OnNlcXVlbmNlKSwKKyAgICAgICAgICAgICAgICAic29tZXRoaW5nIGNoYW5nZWQiKTsKKworICBNZXNzYWdlVHlwZSB0eXBlOworCisgIGxvZ19sZXZlbCBsZXZlbDsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YobGV2ZWwpID09IDEsICJsb2dfbGV2ZWwgY2hhbmdlZCBzaXplISIpOworfTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19wb2Q8TG9nRmlsZU1lc3NhZ2VIZWFkZXI+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIkxvZ0ZpbGVNZXNzYWdlSGVhZGVyIHdpbGwgdG8gZ2V0IGR1bXBlZCB0byBhIGZpbGUiKTsKK3N0YXRpY19hc3NlcnQob2Zmc2V0b2YoTG9nRmlsZU1lc3NhZ2VIZWFkZXIsIG1hcmtlcikgPT0gMCwKKyAgICAgICAgICAgICAgIm1hcmtlciBoYXMgdG8gYmUgYXQgdGhlIHN0YXJ0IHNvIHJlYWRlcnMgY2FuIGZpbmQgaXQiKTsKKworLy8gSGFuZGxlcyB0aGUgbW1hcHBpbmcgYW5kIG11bm1hcHBpbmcgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgbG9nIGZpbGVzLgorY2xhc3MgTG9nRmlsZUFjY2Vzc29yIHsKKyBwdWJsaWM6CisgIExvZ0ZpbGVBY2Nlc3NvcihpbnQgZmQsIGJvb2wgd3JpdGFibGUpOworICB+TG9nRmlsZUFjY2Vzc29yKCkgeworICAgIGlmICh1c2VfcmVhZF8gPT0gTWF5YmU6OmtZZXMpIHsKKyAgICAgIGRlbGV0ZVtdIGN1cnJlbnRfOworICAgIH0KKyAgfQorCisgIC8vIEFzeW5jaHJvbm91c2x5IHN5bmNzIGFsbCBvcGVuIG1hcHBpbmdzLgorICB2b2lkIFN5bmMoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHdlIGN1cnJlbnRseSBoYXZlIHRoZSBsYXN0IHBhZ2UgaW4gdGhlIGZpbGUgbWFwcGVkLgorICAvLyBUaGlzIGlzIGZ1bmRhbWVudGFsbHkgYSByYWN5IHF1ZXN0aW9uLCBzbyB0aGUgcmV0dXJuIHZhbHVlIG1heSBub3QgYmUKKyAgLy8gYWNjdXJhdGUgYnkgdGhlIHRpbWUgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgYm9vbCBJc0xhc3RQYWdlKCk7CisKKyAgLy8gU2tpcHMgdG8gdGhlIGxhc3QgcGFnZSB3aGljaCBpcyBhbiBldmVuIG11bHRpcGxlIG9mIGtTZWVrUGFnZXMuCisgIC8vIFRoaXMgaXMgZnVuZGFtZW50YWxseSByYWN5LCBzbyBpdCBtYXkgbm90IGFjdHVhbGx5IGJlIG9uIHRoZSB2ZXJ5IGxhc3QKKyAgLy8gcG9zc2libGUgbXVsdGlwbGUgb2Yga1NlZWtQYWdlcyB3aGVuIGl0IHJldHVybnMsIGJ1dCBpdCBzaG91bGQgYmUgY2xvc2UuCisgIC8vIFRoaXMgd2lsbCBuZXZlciBtb3ZlIGJhY2t3YXJkcy4KKyAgdm9pZCBTa2lwVG9MYXN0U2Vla2FibGVQYWdlKCk7CisKKyAgc2l6ZV90IGZpbGVfb2Zmc2V0KGNvbnN0IHZvaWQgKm1zZykgeworICAgIHJldHVybiBvZmZzZXQoKSArIChzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KG1zZykgLSBjdXJyZW50KCkpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIFRoZSBzaXplIG9mIHRoZSBjaHVua3MgdGhhdCBnZXQgbW1hcGVkL211bm1hcHBlZCB0b2dldGhlci4gTGFyZ2UgZW5vdWdoIHNvCisgIC8vIHRoYXQgbm90IHRvbyBtdWNoIHNwYWNlIGlzIHdhc3RlZCBhbmQgaXQncyBob3BlZnVsbHkgYmlnZ2VyIHRoYW4gYW5kIGEKKyAgLy8gbXVsdGlwbGUgb2YgdGhlIHN5c3RlbSBwYWdlIHNpemUgYnV0IHNtYWxsIGVub3VnaCBzbyB0aGF0IHJlYWxseSBsYXJnZQorICAvLyBjaHVua3Mgb2YgbWVtb3J5IGRvbid0IGhhdmUgdG8gZ2V0IG1hcHBlZCBhdCB0aGUgc2FtZSB0aW1lLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYWdlU2l6ZSA9IDE2Mzg0OworICAvLyBXaGF0IHRvIGFsaWduIG1lc3NhZ2VzIHRvLCBjb3BpZWQgaW50byBhbiBhY3R1YWwgY29uc3RhbnQuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0FsaWdubWVudCA9IE1FU1NBR0VfQUxJR05NRU5UOworI3VuZGVmIE1FU1NBR0VfQUxJR05NRU5UCisgIC8vIFBhZ2VzIHdoaWNoIGFyZSBtdWx0aXBsZXMgb2YgdGhpcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlIHN0YXJ0IHdpdGgKKyAgLy8gbm8gc2F2ZWQgc3RhdGUgKGllIHN0cnVjdCB0eXBlcykuIFRoaXMgYWxsb3dzIHNlZWtpbmcgaW1tZWRpYXRlbHkgdG8gdGhlCisgIC8vIGxhcmdlc3QgY3VycmVudGx5IHdyaXR0ZW4gaW50ZXJ2YWwgb2YgdGhpcyBudW1iZXIgd2hlbiBmb2xsb3dpbmcuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NlZWtQYWdlcyA9IDI1NjsKKworICBjaGFyICpjdXJyZW50KCkgY29uc3QgeyByZXR1cm4gY3VycmVudF87IH0KKyAgc2l6ZV90IHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gcG9zaXRpb25fOyB9CisgIG9mZl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG9mZnNldF87IH0KKworICB2b2lkIEluY3JlbWVudFBvc2l0aW9uKHNpemVfdCBzaXplKSB7CisgICAgcG9zaXRpb25fICs9IHNpemU7CisgICAgQWxpZ25Qb3NpdGlvbigpOworICB9CisKKyAgdm9pZCBNYXBOZXh0UGFnZSgpOworICB2b2lkIFVubWFwKHZvaWQgKmxvY2F0aW9uKTsKKworICAvLyBBZHZhbmNlcyBwb3NpdGlvbiB0byB0aGUgbmV4dCAoYWxpZ25lZCkgbG9jYXRpb24uCisgIHZvaWQgQWxpZ25Qb3NpdGlvbigpIHsKKyAgICBwb3NpdGlvbl8gKz0ga0FsaWdubWVudCAtIChwb3NpdGlvbl8gJSBrQWxpZ25tZW50KTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBib29sIGRlZmluaXRlbHlfdXNlX3JlYWQoKSBjb25zdCB7IHJldHVybiB1c2VfcmVhZF8gPT0gTWF5YmU6OmtZZXM7IH0KKyAgYm9vbCBkZWZpbml0ZWx5X3VzZV9tbWFwKCkgY29uc3QgeyByZXR1cm4gdXNlX3JlYWRfID09IE1heWJlOjprTm87IH0KKworIHByaXZhdGU6CisgIC8vIFVzZWQgZm9yIHJlcHJlc2VudGluZyB0aGluZ3MgdGhhdCB3ZSBtaWdodCBrbm93IHRvIGJlIHRydWUvZmFsc2Ugb3Igd2UKKyAgLy8gbWlnaHQgbm90IGtub3cgKHlldCkuCisgIGVudW0gY2xhc3MgTWF5YmUgeyBrVW5rbm93biwga1llcywga05vIH07CisKKyAgY29uc3QgaW50IGZkXzsKKyAgY29uc3QgYm9vbCB3cml0YWJsZV87CisKKyAgLy8gSW50byB0aGUgZmlsZS4gQWx3YXlzIGEgbXVsdGlwbGUgb2Yga1BhZ2VTaXplLgorICBvZmZfdCBvZmZzZXRfOworICBjaGFyICpjdXJyZW50XzsKKyAgc2l6ZV90IHBvc2l0aW9uXzsKKworICBNYXliZSBpc19sYXN0X3BhZ2VfID0gTWF5YmU6OmtVbmtub3duOworCisgIC8vIFVzZSByZWFkIGluc3RlYWQgb2YgbW1hcCAobmVjZXNzYXJ5IGZvciBmZHMgdGhhdCBkb24ndCBzdXBwb3J0IG1tYXApLgorICBNYXliZSB1c2VfcmVhZF8gPSBNYXliZTo6a1Vua25vd247Cit9OworCitjbGFzcyBMb2dGaWxlUmVhZGVyIDogcHVibGljIExvZ0ZpbGVBY2Nlc3NvciB7CisgcHVibGljOgorICBMb2dGaWxlUmVhZGVyKGludCBmZCkgOiBMb2dGaWxlQWNjZXNzb3IoZmQsIGZhbHNlKSB7fQorCisgIC8vIE1heSByZXR1cm4gTlVMTCBpZmYgd2FpdCBpcyBmYWxzZS4KKyAgY29uc3QgTG9nRmlsZU1lc3NhZ2VIZWFkZXIgKlJlYWROZXh0TWVzc2FnZShib29sIHdhaXQpOworCisgcHJpdmF0ZToKKyAgLy8gVHJpZXMgcmVhZGluZyBmcm9tIHRoZSBjdXJyZW50IHBhZ2UgdG8gc2VlIGlmIGl0IGZhaWxzIGJlY2F1c2UgdGhlIGZpbGUKKyAgLy8gaXNuJ3QgYmlnIGVub3VnaC4KKyAgdm9pZCBDaGVja0N1cnJlbnRQYWdlUmVhZGFibGUoKTsKK307CisKK2NsYXNzIExvZ0ZpbGVXcml0ZXIgOiBwdWJsaWMgTG9nRmlsZUFjY2Vzc29yIHsKKyBwdWJsaWM6CisgIExvZ0ZpbGVXcml0ZXIoaW50IGZkKSA6IExvZ0ZpbGVBY2Nlc3NvcihmZCwgdHJ1ZSkge30KKworICAvLyBtZXNzYWdlX3NpemUgc2hvdWxkIGJlIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIGZvciB0aGUgbWVzc2FnZS4KKyAgTG9nRmlsZU1lc3NhZ2VIZWFkZXIgKkdldFdyaXRlUG9zaXRpb24oc2l6ZV90IG1lc3NhZ2Vfc2l6ZSk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGV4YWN0bHkgb25jZSBmb3IgZWFjaCB1bmlxdWUgY29va2llIG9uIGVhY2ggcGFnZSB3aGVyZSBjYWNoZWQKKyAgLy8gZGF0YSBzaG91bGQgYmUgY2xlYXJlZC4KKyAgLy8gQ2FsbCB3aXRoIGEgbm9uLXplcm8gbmV4dF9tZXNzYWdlX3NpemUgdG8gZGV0ZXJtaW5lIGlmIGNhY2hlZCBkYXRhIHNob3VsZAorICAvLyBiZSBmb3Jnb3R0ZW4gYmVmb3JlIHdyaXRpbmcgYSBuZXh0X21lc3NhZ2Vfc2l6ZS1zaXplZCBtZXNzYWdlLgorICAvLyBjb29raWUgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIDAuCisgIGJvb2wgU2hvdWxkQ2xlYXJTZWVrYWJsZURhdGEob2ZmX3QgKmNvb2tpZSwgc2l6ZV90IG5leHRfbWVzc2FnZV9zaXplKSBjb25zdDsKKworICAvLyBGb3JjZXMgYSBtb3ZlIHRvIGEgbmV3IHBhZ2UgZm9yIHRoZSBuZXh0IG1lc3NhZ2UuCisgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gdGhlcmUgaXMgY2FjaGVhYmxlIGRhdGEgdGhhdCBuZWVkcyB0byBiZSByZS13cml0dGVuCisgIC8vIGJlZm9yZSBhIG1lc3NhZ2Ugd2hpY2ggd2lsbCBzcGlsbCBvdmVyIG9udG8gdGhlIG5leHQgcGFnZSBidXQgdGhlIGNhY2hlYWJsZQorICAvLyBtZXNzYWdlIGJlaW5nIHJlZnJlc2hlZCBpcyBzbWFsbGVyIGFuZCB3b24ndCBnZXQgdG8gYSBuZXcgcGFnZSBieSBpdHNlbGYuCisgIHZvaWQgRm9yY2VOZXdQYWdlKCk7CisKKyBwcml2YXRlOgorICBib29sIE5lZWROZXdQYWdlRm9yKHNpemVfdCBieXRlcykgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbGludXhfY29kZQorfSAgLy8gbmFtZXNwYWNlIGxvZ2dpbmcKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfTElOVVhfQ09ERV9MT0dHSU5HX0JJTkFSWV9MT0dfRklMRV9IXwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9iaW5hcnlfbG9nX3dyaXRlci5jYyBiL2Fvcy9saW51eF9jb2RlL2xvZ2dpbmcvYmluYXJ5X2xvZ193cml0ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlNjFlMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2xvZ2dpbmcvYmluYXJ5X2xvZ193cml0ZXIuY2MKQEAgLTAsMCArMSwzMTEgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG1udGVudC5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9sb2dnaW5nL2xpbnV4X2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9sb2dnaW5nL2JpbmFyeV9sb2dfZmlsZS5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90eXBlcy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGxvZ2dpbmcgeworbmFtZXNwYWNlIGxpbnV4X2NvZGUgeworbmFtZXNwYWNlIHsKKwordm9pZCBDaGVja1R5cGVXcml0dGVuKHVpbnQzMl90IHR5cGVfaWQsIExvZ0ZpbGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gKndyaXR0ZW5fdHlwZV9pZHMpIHsKKyAgaWYgKHdyaXR0ZW5fdHlwZV9pZHMtPmNvdW50KHR5cGVfaWQpID4gMCkgcmV0dXJuOworICBpZiAoTWVzc2FnZVR5cGU6OklzUHJpbWl0aXZlKHR5cGVfaWQpKSByZXR1cm47CisKKyAgY29uc3QgTWVzc2FnZVR5cGUgJnR5cGUgPSB0eXBlX2NhY2hlOjpHZXQodHlwZV9pZCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5udW1iZXJfZmllbGRzOyArK2kpIHsKKyAgICBDaGVja1R5cGVXcml0dGVuKHR5cGUuZmllbGRzW2ldLT50eXBlLCB3cml0ZXIsIHdyaXR0ZW5fdHlwZV9pZHMpOworICB9CisKKyAgY2hhciBidWZmZXJbMTAyNF07CisgIHNzaXplX3Qgc2l6ZSA9IHR5cGUuU2VyaWFsaXplKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBpZiAoc2l6ZSA9PSAtMSkgeworICAgIExPRyhXQVJOSU5HLCAiJXp1LWJ5dGUgYnVmZmVyIGlzIHRvbyBzbWFsbCB0byBzZXJpYWxpemUgdHlwZSAlc1xuIiwKKyAgICAgICAgc2l6ZW9mKGJ1ZmZlciksIHR5cGUubmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm47CisgIH0KKyAgTG9nRmlsZU1lc3NhZ2VIZWFkZXIgKmNvbnN0IG91dHB1dCA9CisgICAgICB3cml0ZXItPkdldFdyaXRlUG9zaXRpb24oc2l6ZW9mKExvZ0ZpbGVNZXNzYWdlSGVhZGVyKSArIHNpemUpOworCisgIG91dHB1dC0+dGltZV9zZWMgPSBvdXRwdXQtPnRpbWVfbnNlYyA9IDA7CisgIG91dHB1dC0+c291cmNlID0gZ2V0cGlkKCk7CisgIG91dHB1dC0+bmFtZV9zaXplID0gMDsKKyAgb3V0cHV0LT5zZXF1ZW5jZSA9IDA7CisgIG91dHB1dC0+bGV2ZWwgPSBGQVRBTDsKKworICBtZW1jcHkob3V0cHV0ICsgMSwgYnVmZmVyLCBzaXplKTsKKyAgb3V0cHV0LT5tZXNzYWdlX3NpemUgPSBzaXplOworCisgIG91dHB1dC0+dHlwZSA9IExvZ0ZpbGVNZXNzYWdlSGVhZGVyOjpNZXNzYWdlVHlwZTo6a1N0cnVjdFR5cGU7CisgIGZ1dGV4X3NldCgmb3V0cHV0LT5tYXJrZXIpOworCisgIHdyaXR0ZW5fdHlwZV9pZHMtPmluc2VydCh0eXBlX2lkKTsKK30KKwordm9pZCBBbGxvY2F0ZUxvZ05hbWUoY2hhciAqKmZpbGVuYW1lLCBjb25zdCBjaGFyICpkaXJlY3RvcnkpIHsKKyAgaW50IGZpbGVpbmRleCA9IDA7CisgIERJUiAqY29uc3QgZCA9IG9wZW5kaXIoZGlyZWN0b3J5KTsKKyAgaWYgKGQgPT0gbnVsbHB0cikgeworICAgIFBEaWUoImNvdWxkIG5vdCBvcGVuIGRpcmVjdG9yeSAlcyIsIGRpcmVjdG9yeSk7CisgIH0KKyAgaW50IGluZGV4ID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBlcnJubyA9IDA7CisgICAgc3RydWN0IGRpcmVudCAqY29uc3QgZGlyID0gcmVhZGRpcihkKTsKKyAgICBpZiAoZGlyID09IG51bGxwdHIpIHsKKyAgICAgIGlmIChlcnJubyA9PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUExPRyhGQVRBTCwgInJlYWRkaXIoJXApIGZhaWxlZCIsIGQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3NjYW5mKGRpci0+ZF9uYW1lLCAiYW9zX2xvZy0lZCIsICZpbmRleCkgPT0gMSkgeworICAgICAgICBpZiAoaW5kZXggPj0gZmlsZWluZGV4KSB7CisgICAgICAgICAgZmlsZWluZGV4ID0gaW5kZXggKyAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGNsb3NlZGlyKGQpOworCisgIGNoYXIgcHJldmlvdXNbNTEyXTsKKyAgOjpzdGQ6OnN0cmluZyBwYXRoID0gOjpzdGQ6OnN0cmluZyhkaXJlY3RvcnkpICsgIi9hb3NfbG9nLWN1cnJlbnQiOworICBzc2l6ZV90IGxlbiA9IDo6cmVhZGxpbmsocGF0aC5jX3N0cigpLCBwcmV2aW91cywgc2l6ZW9mKHByZXZpb3VzKSk7CisgIGlmIChsZW4gIT0gLTEpIHsKKyAgICBwcmV2aW91c1tsZW5dID0gJ1wwJzsKKyAgfSBlbHNlIHsKKyAgICBwcmV2aW91c1swXSA9ICdcMCc7CisgICAgTE9HKElORk8sICJDb3VsZCBub3QgZmluZCBhb3NfbG9nLWN1cnJlbnRcbiIpOworICAgIHByaW50ZigiQ291bGQgbm90IGZpbmQgYW9zX2xvZy1jdXJyZW50XG4iKTsKKyAgfQorICBpZiAoYXNwcmludGYoZmlsZW5hbWUsICIlcy9hb3NfbG9nLSUwM2QiLCBkaXJlY3RvcnksIGZpbGVpbmRleCkgPT0gLTEpIHsKKyAgICBQRGllKCJjb3VsZG4ndCBjcmVhdGUgZmluYWwgbmFtZSIpOworICB9CisgIExPRyhJTkZPLCAiQ3JlYXRlZCBsb2cgZmlsZSAoYW9zX2xvZy0lZCkgaW4gZGlyZWN0b3J5ICglcykuIFByZXZpb3VzIGZpbGUgIgorICAgICAgICAgICAgIndhcyAoJXMpLlxuIiwKKyAgICAgIGZpbGVpbmRleCwgZGlyZWN0b3J5LCBwcmV2aW91cyk7CisgIHByaW50ZigiQ3JlYXRlZCBsb2cgZmlsZSAoYW9zX2xvZy0lZCkgaW4gZGlyZWN0b3J5ICglcykuIFByZXZpb3VzIGZpbGUgd2FzICIKKyAgICAgICAgICIoJXMpLlxuIiwKKyAgICAgICAgIGZpbGVpbmRleCwgZGlyZWN0b3J5LCBwcmV2aW91cyk7Cit9CisKKyNpZmRlZiBBT1NfQVJDSElURUNUVVJFX2FybV9mcmMKK2Jvb2wgRm91bmRUaHVtYkRyaXZlKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgRklMRSAqbW50X2ZwID0gc2V0bW50ZW50KCIvZXRjL210YWIiLCAiciIpOworICBpZiAobW50X2ZwID09IG51bGxwdHIpIHsKKyAgICBEaWUoIkNvdWxkIG5vdCBvcGVuIC9ldGMvbXRhYiIpOworICB9CisKKyAgYm9vbCBmb3VuZCA9IGZhbHNlOworICBzdHJ1Y3QgbW50ZW50IG1udGJ1ZjsKKyAgY2hhciBidWZbMjU2XTsKKyAgd2hpbGUgKCFmb3VuZCkgeworICAgIHN0cnVjdCBtbnRlbnQgKm1vdW50X2xpc3QgPSBnZXRtbnRlbnRfcihtbnRfZnAsICZtbnRidWYsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIGlmIChtb3VudF9saXN0ID09IG51bGxwdHIpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoc3RyY21wKG1vdW50X2xpc3QtPm1udF9kaXIsIHBhdGgpID09IDApIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZW5kbW50ZW50KG1udF9mcCk7CisgIHJldHVybiBmb3VuZDsKK30KKworYm9vbCBGaW5kRGV2aWNlKGNoYXIgKmRldmljZSwgc2l6ZV90IGRldmljZV9zaXplKSB7CisgIGNoYXIgdGVzdF9kZXZpY2VbMTBdOworICBmb3IgKGNoYXIgaSA9ICdhJzsgaSA8ICd6JzsgKytpKSB7CisgICAgc25wcmludGYodGVzdF9kZXZpY2UsIHNpemVvZih0ZXN0X2RldmljZSksICIvZGV2L3NkJWMiLCBpKTsKKyAgICBMT0coSU5GTywgIlRyeWluZyB0byBhY2Nlc3MgJXNcbiIsIHRlc3RfZGV2aWNlKTsKKyAgICBpZiAoYWNjZXNzKHRlc3RfZGV2aWNlLCBGX09LKSAhPSAtMSkgeworICAgICAgc25wcmludGYoZGV2aWNlLCBkZXZpY2Vfc2l6ZSwgInNkJWMiLCBpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworaW50IEJpbmFyeUxvZ1JlYWRlck1haW4oKSB7CisgIEluaXROUlQoKTsKKworI2lmZGVmIEFPU19BUkNISVRFQ1RVUkVfYXJtX2ZyYworICBjaGFyIGZvbGRlclsxMjhdOworCisgIHsKKyAgICBjaGFyIGRldl9uYW1lWzhdOworICAgIHdoaWxlICghRmluZERldmljZShkZXZfbmFtZSwgc2l6ZW9mKGRldl9uYW1lKSkpIHsKKyAgICAgIExPRyhJTkZPLCAiV2FpdGluZyBmb3IgYSBkZXZpY2VcbiIpOworICAgICAgcHJpbnRmKCJXYWl0aW5nIGZvciBhIGRldmljZVxuIik7CisgICAgICBzbGVlcCg1KTsKKyAgICB9CisgICAgc25wcmludGYoZm9sZGVyLCBzaXplb2YoZm9sZGVyKSwgIi9tZWRpYS8lczEiLCBkZXZfbmFtZSk7CisgICAgd2hpbGUgKCFGb3VuZFRodW1iRHJpdmUoZm9sZGVyKSkgeworICAgICAgTE9HKElORk8sICJXYWl0aW5nIGZvciAlc1xuIiwgZm9sZGVyKTsKKyAgICAgIHByaW50ZigiV2FpdGluZyBmb3IgJXNcbiIsIGZvbGRlcik7CisgICAgICBzbGVlcCgxKTsKKyAgICB9CisgICAgc25wcmludGYoZm9sZGVyLCBzaXplb2YoZm9sZGVyKSwgIi9tZWRpYS8lczEvIiwgZGV2X25hbWUpOworICB9CisKKyAgaWYgKGFjY2Vzcyhmb2xkZXIsIEZfT0spID09IC0xKSB7CisjZWxzZQorICBjb25zdCBjaGFyICpmb2xkZXIgPSBjb25maWd1cmF0aW9uOjpHZXRMb2dnaW5nRGlyZWN0b3J5KCk7CisgIGlmIChhY2Nlc3MoZm9sZGVyLCBSX09LIHwgV19PSykgPT0gLTEpIHsKKyNlbmRpZgorICAgIExPRyhGQVRBTCwgImZvbGRlciAnJXMnIGRvZXMgbm90IGV4aXN0LiBwbGVhc2UgY3JlYXRlIGl0XG4iLCBmb2xkZXIpOworICB9CisgIExPRyhJTkZPLCAibG9nZ2luZyB0byBmb2xkZXIgJyVzJ1xuIiwgZm9sZGVyKTsKKworICBjaGFyICp0bXA7CisgIEFsbG9jYXRlTG9nTmFtZSgmdG1wLCBmb2xkZXIpOworICBjaGFyICp0bXAyOworICBpZiAoYXNwcmludGYoJnRtcDIsICIlcy9hb3NfbG9nLWN1cnJlbnQiLCBmb2xkZXIpID09IC0xKSB7CisgICAgUExPRyhXQVJOSU5HLCAiY291bGRuJ3QgY3JlYXRlIGN1cnJlbnQgc3ltbGluayBuYW1lIik7CisgIH0gZWxzZSB7CisgICAgaWYgKHVubGluayh0bXAyKSA9PSAtMSAmJiAoZXJybm8gIT0gRVJPRlMgJiYgZXJybm8gIT0gRU5PRU5UKSkgeworICAgICAgTE9HKFdBUk5JTkcsICJ1bmxpbmsoJyVzJykgZmFpbGVkIiwgdG1wMik7CisgICAgfQorICAgIGlmIChzeW1saW5rKHRtcCwgdG1wMikgPT0gLTEpIHsKKyAgICAgIFBMT0coV0FSTklORywgInN5bWxpbmsoJyVzJywgJyVzJykgZmFpbGVkIiwgdG1wLCB0bXAyKTsKKyAgICB9CisgICAgZnJlZSh0bXAyKTsKKyAgfQorICBpbnQgZmQgPSBvcGVuKHRtcCwgT19TWU5DIHwgT19BUFBFTkQgfCBPX1JEV1IgfCBPX0NSRUFULAorICAgICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCk7CisgIGZyZWUodG1wKTsKKyAgaWYgKGZkID09IC0xKSB7CisgICAgUExPRyhGQVRBTCwgIm9wZW5pbmcgZmlsZSAnJXMnIGZhaWxlZCIsIHRtcCk7CisgIH0KKyAgTG9nRmlsZVdyaXRlciB3cml0ZXIoZmQpOworCisgIDo6c3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiB3cml0dGVuX3R5cGVfaWRzOworICBvZmZfdCBjbGVhcl90eXBlX2lkc19jb29raWUgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgY29uc3QgTG9nTWVzc2FnZSAqY29uc3QgbXNnID0gUmVhZE5leHQoKTsKKyAgICBpZiAobXNnID09IE5VTEwpIGNvbnRpbnVlOworCisgICAgY29uc3Qgc2l6ZV90IHJhd19vdXRwdXRfbGVuZ3RoID0KKyAgICAgICAgc2l6ZW9mKExvZ0ZpbGVNZXNzYWdlSGVhZGVyKSArIG1zZy0+bmFtZV9sZW5ndGggKyBtc2ctPm1lc3NhZ2VfbGVuZ3RoOworICAgIHNpemVfdCBvdXRwdXRfbGVuZ3RoID0gcmF3X291dHB1dF9sZW5ndGg7CisgICAgaWYgKG1zZy0+dHlwZSA9PSBMb2dNZXNzYWdlOjpUeXBlOjprU3RydWN0KSB7CisgICAgICBvdXRwdXRfbGVuZ3RoICs9IHNpemVvZihtc2ctPnN0cnVjdHVyZS50eXBlX2lkKSArIHNpemVvZih1aW50MzJfdCkgKworICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnN0cnVjdHVyZS5zdHJpbmdfbGVuZ3RoOworICAgICAgaWYgKHdyaXRlci5TaG91bGRDbGVhclNlZWthYmxlRGF0YSgmY2xlYXJfdHlwZV9pZHNfY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbGVuZ3RoKSkgeworICAgICAgICB3cml0ZXIuRm9yY2VOZXdQYWdlKCk7CisgICAgICAgIHdyaXR0ZW5fdHlwZV9pZHMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICAgIENoZWNrVHlwZVdyaXR0ZW4obXNnLT5zdHJ1Y3R1cmUudHlwZV9pZCwgJndyaXRlciwgJndyaXR0ZW5fdHlwZV9pZHMpOworICAgIH0gZWxzZSBpZiAobXNnLT50eXBlID09IExvZ01lc3NhZ2U6OlR5cGU6OmtNYXRyaXgpIHsKKyAgICAgIG91dHB1dF9sZW5ndGggKz0KKyAgICAgICAgICBzaXplb2YobXNnLT5tYXRyaXgudHlwZSkgKyBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKHVpbnQxNl90KSArCisgICAgICAgICAgc2l6ZW9mKHVpbnQxNl90KSArIG1zZy0+bWF0cml4LnN0cmluZ19sZW5ndGg7CisgICAgICBDSEVDSyhNZXNzYWdlVHlwZTo6SXNQcmltaXRpdmUobXNnLT5tYXRyaXgudHlwZSkpOworICAgIH0KKyAgICBMb2dGaWxlTWVzc2FnZUhlYWRlciAqY29uc3Qgb3V0cHV0ID0gd3JpdGVyLkdldFdyaXRlUG9zaXRpb24ob3V0cHV0X2xlbmd0aCk7CisgICAgY2hhciAqb3V0cHV0X3N0cmluZ3MgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4ob3V0cHV0KSArIHNpemVvZigqb3V0cHV0KTsKKyAgICBvdXRwdXQtPm5hbWVfc2l6ZSA9IG1zZy0+bmFtZV9sZW5ndGg7CisgICAgb3V0cHV0LT5tZXNzYWdlX3NpemUgPSBtc2ctPm1lc3NhZ2VfbGVuZ3RoOworICAgIG91dHB1dC0+c291cmNlID0gbXNnLT5zb3VyY2U7CisgICAgb3V0cHV0LT5sZXZlbCA9IG1zZy0+bGV2ZWw7CisgICAgb3V0cHV0LT50aW1lX3NlYyA9IG1zZy0+c2Vjb25kczsKKyAgICBvdXRwdXQtPnRpbWVfbnNlYyA9IG1zZy0+bnNlY29uZHM7CisgICAgb3V0cHV0LT5zZXF1ZW5jZSA9IG1zZy0+c2VxdWVuY2U7CisgICAgbWVtY3B5KG91dHB1dF9zdHJpbmdzLCBtc2ctPm5hbWUsIG1zZy0+bmFtZV9sZW5ndGgpOworCisgICAgc3dpdGNoIChtc2ctPnR5cGUpIHsKKyAgICAgIGNhc2UgTG9nTWVzc2FnZTo6VHlwZTo6a1N0cmluZzoKKyAgICAgICAgbWVtY3B5KG91dHB1dF9zdHJpbmdzICsgbXNnLT5uYW1lX2xlbmd0aCwgbXNnLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgbXNnLT5tZXNzYWdlX2xlbmd0aCk7CisgICAgICAgIG91dHB1dC0+dHlwZSA9IExvZ0ZpbGVNZXNzYWdlSGVhZGVyOjpNZXNzYWdlVHlwZTo6a1N0cmluZzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExvZ01lc3NhZ2U6OlR5cGU6OmtTdHJ1Y3Q6IHsKKyAgICAgICAgY2hhciAqcG9zaXRpb24gPSBvdXRwdXRfc3RyaW5ncyArIG1zZy0+bmFtZV9sZW5ndGg7CisKKyAgICAgICAgbWVtY3B5KHBvc2l0aW9uLCAmbXNnLT5zdHJ1Y3R1cmUudHlwZV9pZCwKKyAgICAgICAgICAgICAgIHNpemVvZihtc2ctPnN0cnVjdHVyZS50eXBlX2lkKSk7CisgICAgICAgIHBvc2l0aW9uICs9IHNpemVvZihtc2ctPnN0cnVjdHVyZS50eXBlX2lkKTsKKyAgICAgICAgb3V0cHV0LT5tZXNzYWdlX3NpemUgKz0gc2l6ZW9mKG1zZy0+c3RydWN0dXJlLnR5cGVfaWQpOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGxlbmd0aCA9IG1zZy0+c3RydWN0dXJlLnN0cmluZ19sZW5ndGg7CisgICAgICAgIG1lbWNweShwb3NpdGlvbiwgJmxlbmd0aCwgc2l6ZW9mKGxlbmd0aCkpOworICAgICAgICBwb3NpdGlvbiArPSBzaXplb2YobGVuZ3RoKTsKKyAgICAgICAgbWVtY3B5KHBvc2l0aW9uLCBtc2ctPnN0cnVjdHVyZS5zZXJpYWxpemVkLAorICAgICAgICAgICAgICAgbGVuZ3RoICsgbXNnLT5tZXNzYWdlX2xlbmd0aCk7CisgICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aCArIG1zZy0+bWVzc2FnZV9sZW5ndGg7CisgICAgICAgIG91dHB1dC0+bWVzc2FnZV9zaXplICs9IHNpemVvZihsZW5ndGgpICsgbGVuZ3RoOworCisgICAgICAgIG91dHB1dC0+dHlwZSA9IExvZ0ZpbGVNZXNzYWdlSGVhZGVyOjpNZXNzYWdlVHlwZTo6a1N0cnVjdDsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIExvZ01lc3NhZ2U6OlR5cGU6OmtNYXRyaXg6IHsKKyAgICAgICAgY2hhciAqcG9zaXRpb24gPSBvdXRwdXRfc3RyaW5ncyArIG1zZy0+bmFtZV9sZW5ndGg7CisKKyAgICAgICAgbWVtY3B5KHBvc2l0aW9uLCAmbXNnLT5tYXRyaXgudHlwZSwgc2l6ZW9mKG1zZy0+bWF0cml4LnR5cGUpKTsKKyAgICAgICAgcG9zaXRpb24gKz0gc2l6ZW9mKG1zZy0+bWF0cml4LnR5cGUpOworICAgICAgICBvdXRwdXQtPm1lc3NhZ2Vfc2l6ZSArPSBzaXplb2YobXNnLT5tYXRyaXgudHlwZSk7CisKKyAgICAgICAgdWludDMyX3QgbGVuZ3RoID0gbXNnLT5tYXRyaXguc3RyaW5nX2xlbmd0aDsKKyAgICAgICAgbWVtY3B5KHBvc2l0aW9uLCAmbGVuZ3RoLCBzaXplb2YobGVuZ3RoKSk7CisgICAgICAgIHBvc2l0aW9uICs9IHNpemVvZihsZW5ndGgpOworICAgICAgICBvdXRwdXQtPm1lc3NhZ2Vfc2l6ZSArPSBzaXplb2YobGVuZ3RoKTsKKworICAgICAgICB1aW50MTZfdCByb3dzID0gbXNnLT5tYXRyaXgucm93cywgY29scyA9IG1zZy0+bWF0cml4LmNvbHM7CisgICAgICAgIG1lbWNweShwb3NpdGlvbiwgJnJvd3MsIHNpemVvZihyb3dzKSk7CisgICAgICAgIHBvc2l0aW9uICs9IHNpemVvZihyb3dzKTsKKyAgICAgICAgbWVtY3B5KHBvc2l0aW9uLCAmY29scywgc2l6ZW9mKGNvbHMpKTsKKyAgICAgICAgcG9zaXRpb24gKz0gc2l6ZW9mKGNvbHMpOworICAgICAgICBvdXRwdXQtPm1lc3NhZ2Vfc2l6ZSArPSBzaXplb2Yocm93cykgKyBzaXplb2YoY29scyk7CisgICAgICAgIENIRUNLX0VRKG1zZy0+bWVzc2FnZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlOjpTaXplb2YobXNnLT5tYXRyaXgudHlwZSkgKiByb3dzICogY29scyk7CisKKyAgICAgICAgbWVtY3B5KHBvc2l0aW9uLCBtc2ctPm1hdHJpeC5kYXRhLCBtc2ctPm1lc3NhZ2VfbGVuZ3RoICsgbGVuZ3RoKTsKKyAgICAgICAgb3V0cHV0LT5tZXNzYWdlX3NpemUgKz0gbGVuZ3RoOworCisgICAgICAgIG91dHB1dC0+dHlwZSA9IExvZ0ZpbGVNZXNzYWdlSGVhZGVyOjpNZXNzYWdlVHlwZTo6a01hdHJpeDsKKyAgICAgIH0gYnJlYWs7CisgICAgfQorCisgICAgaWYgKG91dHB1dC0+bWVzc2FnZV9zaXplIC0gbXNnLT5tZXNzYWdlX2xlbmd0aCAhPQorICAgICAgICBvdXRwdXRfbGVuZ3RoIC0gcmF3X291dHB1dF9sZW5ndGgpIHsKKyAgICAgIExPRyhGQVRBTCwgIiV6dSAhPSAlenVcbiIsIG91dHB1dC0+bWVzc2FnZV9zaXplIC0gbXNnLT5tZXNzYWdlX2xlbmd0aCwKKyAgICAgICAgICBvdXRwdXRfbGVuZ3RoIC0gcmF3X291dHB1dF9sZW5ndGgpOworICAgIH0KKworICAgIGZ1dGV4X3NldCgmb3V0cHV0LT5tYXJrZXIpOworCisgICAgbG9nZ2luZzo6bGludXhfY29kZTo6RnJlZShtc2cpOworICB9CisKKyAgQ2xlYW51cCgpOworICByZXR1cm4gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbGludXhfY29kZQorfSAgLy8gbmFtZXNwYWNlIGxvZ2dpbmcKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworaW50IG1haW4oKSB7CisgIHJldHVybiA6OmFvczo6bG9nZ2luZzo6bGludXhfY29kZTo6QmluYXJ5TG9nUmVhZGVyTWFpbigpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9saW51eF9pbnRlcmZhY2UuY2MgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xpbnV4X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGE1YzFiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9saW51eF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw4NSBAQAorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2xvZ2dpbmcvbGludXhfbG9nZ2luZy5oIgorCisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9jb21wbGV4X3RocmVhZF9sb2NhbC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGxvZ2dpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8oYnJpYW5zKTogRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRocmVhZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCisvLyBwcm9jZXNzLgorCis6OnN0ZDo6c3RyaW5nIEdldE15TmFtZSgpIHsKKyAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gbWFrZSB1cCBhIHRocmVhZCBuYW1lLgorICAvLyBUaGUgZG9jcyBhcmUgdW5jbGVhciBpZiBpdCBjYW4gYmUgMTYgY2hhcmFjdGVycyB3aXRoIG5vICdcMCcsIHNvIHdlJ2xsIGJlCisgIC8vIHNhZmUgYnkgYWRkaW5nIG91ciBvd24gd2hlcmUgbmVjZXNzYXJ5LgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUaHJlYWROYW1lTGVuZ3RoID0gMTY7CisKKyAgOjpzdGQ6OnN0cmluZyBwcm9jZXNzX25hbWUocHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOworCisgIGNoYXIgdGhyZWFkX25hbWVfYXJyYXlba1RocmVhZE5hbWVMZW5ndGggKyAxXTsKKyAgaWYgKHByY3RsKFBSX0dFVF9OQU1FLCB0aHJlYWRfbmFtZV9hcnJheSkgIT0gMCkgeworICAgIFBEaWUoInByY3RsKFBSX0dFVF9OQU1FLCAlcCkgZmFpbGVkIiwgdGhyZWFkX25hbWVfYXJyYXkpOworICB9CisgIHRocmVhZF9uYW1lX2FycmF5W3NpemVvZih0aHJlYWRfbmFtZV9hcnJheSkgLSAxXSA9ICdcMCc7CisgIDo6c3RkOjpzdHJpbmcgdGhyZWFkX25hbWUodGhyZWFkX25hbWVfYXJyYXkpOworCisgIC8vIElmIHRoZSBmaXJzdCBidW5jaCBvZiBjaGFyYWN0ZXJzIGFyZSB0aGUgc2FtZS4KKyAgLy8gV2UgY3V0IG9mZiBjb21wYXJpbmcgYXQgdGhlIHNob3J0ZXIgb2YgdGhlIDIgc3RyaW5ncyBiZWNhdXNlIG9uZSBvciB0aGUKKyAgLy8gb3RoZXIgb2Z0ZW4gZW5kcyB1cCBjdXQgb2ZmLgorICBpZiAoc3RybmNtcCh0aHJlYWRfbmFtZS5jX3N0cigpLCBwcm9jZXNzX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgOjpzdGQ6Om1pbih0aHJlYWRfbmFtZS5sZW5ndGgoKSwgcHJvY2Vzc19uYW1lLmxlbmd0aCgpKSkgPT0gMCkgeworICAgIC8vIFRoaXMgdGhyZWFkIGRvZXNuJ3QgaGF2ZSBhbiBhY3R1YWwgbmFtZS4KKyAgICByZXR1cm4gcHJvY2Vzc19uYW1lOworICB9CisKKyAgcmV0dXJuIHByb2Nlc3NfbmFtZSArICcuJyArIHRocmVhZF9uYW1lOworfQorCis6OmFvczo6Q29tcGxleFRocmVhZExvY2FsPENvbnRleHQ+IG15X2NvbnRleHQ7CisKKy8vIFRydWUgaWYgd2UncmUgZ29pbmcgdG8gZGVsZXRlIHRoZSBjdXJyZW50IENvbnRleHQgb2JqZWN0IEFTQVAuIFRoZQorLy8gcmVhc29uIGZvciBkb2luZyB0aGlzIGluc3RlYWQgb2YganVzdCBkZWxldGluZyB0aGVtIGlzIHRoYXQgdHNhbiAoYXQgbGVhc3QpCisvLyBkb2Vzbid0IGxpa2UgaXQgd2hlbiBwdGhyZWFkX2F0Zm9yayBoYW5kbGVycyBkbyBjb21wbGljYXRlZCBzdHVmZiBhbmQgaXQncworLy8gbm90IGEgZ3JlYXQgaWRlYSBhbnl3YXlzLgordGhyZWFkX2xvY2FsIGJvb2wgZGVsZXRlX2N1cnJlbnRfY29udGV4dChmYWxzZSk7CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBVc2VkIGluIGFvcy9saW51eF9jb2RlL2luaXQuY2Mgd2hlbiBhIHRocmVhZCdzIG5hbWUgaXMgY2hhbmdlZC4KK3ZvaWQgUmVsb2FkVGhyZWFkTmFtZSgpIHsKKyAgaWYgKG15X2NvbnRleHQuY3JlYXRlZCgpKSB7CisgICAgOjpzdGQ6OnN0cmluZyBteV9uYW1lID0gR2V0TXlOYW1lKCk7CisgICAgaWYgKG15X25hbWUuc2l6ZSgpICsgMSA+IHNpemVvZihDb250ZXh0OjpuYW1lKSkgeworICAgICAgRGllKCJsb2dnaW5nOiBwcm9jZXNzL3RocmVhZCBuYW1lICclcycgaXMgdG9vIGxvbmdcbiIsCisgICAgICAgICAgbXlfbmFtZS5jX3N0cigpKTsKKyAgICB9CisgICAgc3RyY3B5KG15X2NvbnRleHQtPm5hbWUsIG15X25hbWUuY19zdHIoKSk7CisgICAgbXlfY29udGV4dC0+bmFtZV9zaXplID0gbXlfbmFtZS5zaXplKCk7CisgIH0KK30KKworQ29udGV4dCAqQ29udGV4dDo6R2V0KCkgeworICBpZiAoX19idWlsdGluX2V4cGVjdChkZWxldGVfY3VycmVudF9jb250ZXh0LCBmYWxzZSkpIHsKKyAgICBteV9jb250ZXh0LkNsZWFyKCk7CisgICAgZGVsZXRlX2N1cnJlbnRfY29udGV4dCA9IGZhbHNlOworICB9CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0KCFteV9jb250ZXh0LmNyZWF0ZWQoKSwgZmFsc2UpKSB7CisgICAgbXlfY29udGV4dC5DcmVhdGUoKTsKKyAgICBSZWxvYWRUaHJlYWROYW1lKCk7CisgICAgbXlfY29udGV4dC0+c291cmNlID0gZ2V0cGlkKCk7CisgIH0KKyAgcmV0dXJuIG15X2NvbnRleHQuZ2V0KCk7Cit9CisKK3ZvaWQgQ29udGV4dDo6RGVsZXRlKCkgeworICBkZWxldGVfY3VycmVudF9jb250ZXh0ID0gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9saW51eF9sb2dnaW5nLmNjIGIvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9saW51eF9sb2dnaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2E3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xpbnV4X2xvZ2dpbmcuY2MKQEAgLTAsMCArMSwxNDUgQEAKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9sb2dnaW5nL2xpbnV4X2xvZ2dpbmcuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2lwY19saWIvcXVldWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgbG9nZ2luZyB7CituYW1lc3BhY2UgbGludXhfY29kZSB7CituYW1lc3BhY2UgeworCitSYXdRdWV1ZSAqcXVldWUgPSBOVUxMOworCitpbnQgZHJvcHBlZF9tZXNzYWdlcyA9IDA7Cis6OmFvczo6dGltZTo6VGltZSBkcm9wcGVkX3N0YXJ0LCBiYWNrb2ZmX3N0YXJ0OworLy8gV2FpdCB0aGlzIGxvbmcgYWZ0ZXIgZHJvcHBpbmcgYSBtZXNzYWdlIGJlZm9yZSBldmVuIHRyeWluZyB0byB3cml0ZSBhbnkgbW9yZS4KK2NvbnN0ZXhwciA6OmFvczo6dGltZTo6VGltZSBrRHJvcEJhY2tvZmYgPSA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMSk7CisKK0xvZ01lc3NhZ2UgKkdldE1lc3NhZ2VPckRpZSgpIHsKKyAgTG9nTWVzc2FnZSAqbWVzc2FnZSA9IHN0YXRpY19jYXN0PExvZ01lc3NhZ2UgKj4ocXVldWUtPkdldE1lc3NhZ2UoKSk7CisgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICBMT0coRkFUQUwsICIlcC0+R2V0TWVzc2FnZSgpIGZhaWxlZFxuIiwgcXVldWUpOworICB9IGVsc2UgeworICAgIHJldHVybiBtZXNzYWdlOworICB9Cit9CisKK2NsYXNzIExpbnV4UXVldWVMb2dJbXBsZW1lbnRhdGlvbiA6IHB1YmxpYyBMb2dJbXBsZW1lbnRhdGlvbiB7CisgIF9fYXR0cmlidXRlX18oKGZvcm1hdChHT09EX1BSSU5URl9GT1JNQVRfVFlQRSwgMywgMCkpKQorICB2aXJ0dWFsIHZvaWQgRG9Mb2cobG9nX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApIG92ZXJyaWRlIHsKKyAgICBMb2dNZXNzYWdlICptZXNzYWdlID0gR2V0TWVzc2FnZU9yRGllKCk7CisgICAgaW50ZXJuYWw6OkZpbGxJbk1lc3NhZ2UobGV2ZWwsIGZvcm1hdCwgYXAsIG1lc3NhZ2UpOworICAgIFdyaXRlKG1lc3NhZ2UpOworICB9CisKKyAgdmlydHVhbCB2b2lkIExvZ1N0cnVjdChsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2Vfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBjb25zdCBNZXNzYWdlVHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6ZnVuY3Rpb248c2l6ZV90KGNoYXIgKik+ICZzZXJpYWxpemUpCisgICAgICBvdmVycmlkZSB7CisgICAgTG9nTWVzc2FnZSAqbWVzc2FnZSA9IEdldE1lc3NhZ2VPckRpZSgpOworICAgIGludGVybmFsOjpGaWxsSW5NZXNzYWdlU3RydWN0dXJlKGxldmVsLCBtZXNzYWdlX3N0cmluZywgc2l6ZSwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUsIG1lc3NhZ2UpOworICAgIFdyaXRlKG1lc3NhZ2UpOworICB9CisKKyAgdmlydHVhbCB2b2lkIExvZ01hdHJpeChsb2dfbGV2ZWwgbGV2ZWwsIGNvbnN0IDo6c3RkOjpzdHJpbmcgJm1lc3NhZ2Vfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGVfaWQsIGludCByb3dzLCBpbnQgY29scywgY29uc3Qgdm9pZCAqZGF0YSkKKyAgICAgIG92ZXJyaWRlIHsKKyAgICBMb2dNZXNzYWdlICptZXNzYWdlID0gR2V0TWVzc2FnZU9yRGllKCk7CisgICAgaW50ZXJuYWw6OkZpbGxJbk1lc3NhZ2VNYXRyaXgobGV2ZWwsIG1lc3NhZ2Vfc3RyaW5nLCB0eXBlX2lkLCByb3dzLCBjb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIG1lc3NhZ2UpOworICAgIFdyaXRlKG1lc3NhZ2UpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBSZWdpc3RlcigpIHsKKyAgSW5pdCgpOworCisgIHF1ZXVlID0gUmF3UXVldWU6OkZldGNoKCJMb2dnaW5nUXVldWUiLCBzaXplb2YoTG9nTWVzc2FnZSksIDEzMjMsIDQwMDAwKTsKKyAgaWYgKHF1ZXVlID09IE5VTEwpIHsKKyAgICBEaWUoImxvZ2dpbmc6IGNvdWxkbid0IGZldGNoIHF1ZXVlXG4iKTsKKyAgfQorCisgIEFkZEltcGxlbWVudGF0aW9uKG5ldyBMaW51eFF1ZXVlTG9nSW1wbGVtZW50YXRpb24oKSk7Cit9CisKK2NvbnN0IExvZ01lc3NhZ2UgKlJlYWROZXh0KE9wdGlvbnM8UmF3UXVldWU+IGZsYWdzLCBpbnQgKmluZGV4KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBMb2dNZXNzYWdlICo+KHF1ZXVlLT5SZWFkTWVzc2FnZUluZGV4KGZsYWdzLCBpbmRleCkpOworfQorCitjb25zdCBMb2dNZXNzYWdlICpSZWFkTmV4dCgpIHsKKyAgcmV0dXJuIFJlYWROZXh0KFJhd1F1ZXVlOjprQmxvY2spOworfQorCitjb25zdCBMb2dNZXNzYWdlICpSZWFkTmV4dChPcHRpb25zPFJhd1F1ZXVlPiBmbGFncykgeworICBjb25zdCBMb2dNZXNzYWdlICpyID0gTlVMTDsKKyAgZG8geworICAgIHIgPSBzdGF0aWNfY2FzdDxjb25zdCBMb2dNZXNzYWdlICo+KHF1ZXVlLT5SZWFkTWVzc2FnZShmbGFncykpOworICAgIC8vIG5vdCBibG9ja2luZyBtZWFucyByZXR1cm4gYSBOVUxMIGlmIHRoYXQncyB3aGF0IGl0IGdldHMKKyAgfSB3aGlsZSAoKGZsYWdzICYgUmF3UXVldWU6OmtCbG9jaykgJiYgciA9PSBOVUxMKTsKKyAgcmV0dXJuIHI7Cit9CisKK0xvZ01lc3NhZ2UgKkdldCgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PExvZ01lc3NhZ2UgKj4ocXVldWUtPkdldE1lc3NhZ2UoKSk7Cit9CisKK3ZvaWQgRnJlZShjb25zdCBMb2dNZXNzYWdlICptc2cpIHsKKyAgcXVldWUtPkZyZWVNZXNzYWdlKG1zZyk7Cit9CisKK3ZvaWQgV3JpdGUoTG9nTWVzc2FnZSAqbXNnKSB7CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGRyb3BwZWRfbWVzc2FnZXMgPiAwLCBmYWxzZSkpIHsKKyAgICA6OmFvczo6dGltZTo6VGltZSBtZXNzYWdlX3RpbWUgPQorICAgICAgICA6OmFvczo6dGltZTo6VGltZShtc2ctPnNlY29uZHMsIG1zZy0+bnNlY29uZHMpOworICAgIGlmIChtZXNzYWdlX3RpbWUgLSBiYWNrb2ZmX3N0YXJ0IDwga0Ryb3BCYWNrb2ZmKSB7CisgICAgICArK2Ryb3BwZWRfbWVzc2FnZXM7CisgICAgICBxdWV1ZS0+RnJlZU1lc3NhZ2UobXNnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMb2dNZXNzYWdlICpkcm9wcGVkX21lc3NhZ2UgPSBHZXRNZXNzYWdlT3JEaWUoKTsKKyAgICBpbnRlcm5hbDo6RmlsbEluTWVzc2FnZVZhcmFyZ3MoCisgICAgICAgIEVSUk9SLCBkcm9wcGVkX21lc3NhZ2UsCisgICAgICAgICIlZCBsb2dzIHN0YXJ0aW5nIGF0ICUiIFBSSWQzMiAiLiUiIFBSSWQzMiAiIGRyb3BwZWRcbiIsCisgICAgICAgIGRyb3BwZWRfbWVzc2FnZXMsIGRyb3BwZWRfc3RhcnQuc2VjKCksIGRyb3BwZWRfc3RhcnQubnNlYygpKTsKKyAgICBpZiAocXVldWUtPldyaXRlTWVzc2FnZShkcm9wcGVkX21lc3NhZ2UsIFJhd1F1ZXVlOjprTm9uQmxvY2spKSB7CisgICAgICBkcm9wcGVkX21lc3NhZ2VzID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRG9uJ3QgZXZlbiBib3RoZXIgdHJ5aW5nIHRvIHdyaXRlIHRoaXMgbWVzc2FnZSBiZWNhdXNlIGl0J3Mgbm90IGxpa2VseQorICAgICAgLy8gdG8gd29yayBhbmQgaXQgd291bGQgYmUgY29uZnVzaW5nIHRvIGhhdmUgb25lIGxvZyBpbiB0aGUgbWlkZGxlIG9mIGEKKyAgICAgIC8vIHN0cmluZyBvZiBmYWlsdXJlcyBnZXQgdGhyb3VnaC4KKyAgICAgICsrZHJvcHBlZF9tZXNzYWdlczsKKyAgICAgIGJhY2tvZmZfc3RhcnQgPSBtZXNzYWdlX3RpbWU7CisgICAgICBxdWV1ZS0+RnJlZU1lc3NhZ2UobXNnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYgKCFxdWV1ZS0+V3JpdGVNZXNzYWdlKG1zZywgUmF3UXVldWU6OmtOb25CbG9jaykpIHsKKyAgICBpZiAoZHJvcHBlZF9tZXNzYWdlcyA9PSAwKSB7CisgICAgICBkcm9wcGVkX3N0YXJ0ID0gYmFja29mZl9zdGFydCA9CisgICAgICAgICAgOjphb3M6OnRpbWU6OlRpbWUobXNnLT5zZWNvbmRzLCBtc2ctPm5zZWNvbmRzKTsKKyAgICB9CisgICAgKytkcm9wcGVkX21lc3NhZ2VzOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsaW51eF9jb2RlCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9saW51eF9sb2dnaW5nLmggYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xpbnV4X2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2VlYWYxCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9saW51eF9sb2dnaW5nLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBBT1NfTElOVVhfQ09ERV9MT0dHSU5HX0xPR0dJTkdfSF8KKyNkZWZpbmUgQU9TX0xJTlVYX0NPREVfTE9HR0lOR19MT0dHSU5HX0hfCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ19pbXBsLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL29wdGlvbnMuaCIKKworbmFtZXNwYWNlIGFvcyB7CisKK2NsYXNzIFJhd1F1ZXVlOworCituYW1lc3BhY2UgbG9nZ2luZyB7CituYW1lc3BhY2UgbGludXhfY29kZSB7CisKKy8vIENhbGxzIEFkZEltcGxlbWVudGF0aW9uIHRvIHJlZ2lzdGVyIHRoZSB1c3VhbCBsaW51eCBsb2dnaW5nIGltcGxlbWVudGF0aW9uCisvLyB3aGljaCBzZW5kcyB0aGUgbWVzc2FnZXMgdGhyb3VnaCBhIHF1ZXVlLiBUaGlzIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbgorLy8gYW5vdGhlciBwcm9jZXNzKGVzKSB0byByZWFkIHRoZSBsb2cgbWVzc2FnZXMgdGhhdCBpdCBwdXRzIGludG8gdGhlIHF1ZXVlLgorLy8gVGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IGNhbGxlZCBieSBhb3M6OkluaXQqLgordm9pZCBSZWdpc3RlcigpOworCisvLyBGYWlybHkgc2ltcGxlIHdyYXBwZXJzIGFyb3VuZCB0aGUgcmF3IHF1ZXVlIGNhbGxzLgorCisvLyBUaGlzIG9uZSBuZXZlciByZXR1cm5zIE5VTEwgaWYgZmxhZ3MgY29udGFpbnMgQkxPQ0suCitjb25zdCBMb2dNZXNzYWdlICpSZWFkTmV4dChPcHRpb25zPFJhd1F1ZXVlPiBmbGFncyk7Citjb25zdCBMb2dNZXNzYWdlICpSZWFkTmV4dChPcHRpb25zPFJhd1F1ZXVlPiBmbGFncywgaW50ICppbmRleCk7Citjb25zdCBMb2dNZXNzYWdlICpSZWFkTmV4dCgpOworTG9nTWVzc2FnZSAqR2V0KCk7Cit2b2lkIEZyZWUoY29uc3QgTG9nTWVzc2FnZSAqbXNnKTsKK3ZvaWQgV3JpdGUoTG9nTWVzc2FnZSAqbXNnKTsKKworfSAgLy8gbmFtZXNwYWNlIGxpbnV4X2NvZGUKK30gIC8vIG5hbWVzcGFjZSBsb2dnaW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9sb2dfZGlzcGxheWVyLmNjIGIvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9sb2dfZGlzcGxheWVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTBiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ19kaXNwbGF5ZXIuY2MKQEAgLTAsMCArMSw0MTAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9iaW5hcnlfbG9nX2ZpbGUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3R5cGVzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nX3ByaW50Zl9mb3JtYXRzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3N0cmluZ190b19udW0uaCIKKwordXNpbmcgOjphb3M6OmxvZ2dpbmc6OmxpbnV4X2NvZGU6OkxvZ0ZpbGVNZXNzYWdlSGVhZGVyOworCituYW1lc3BhY2UgeworCitjb25zdCBjaGFyICprQXJnc0hlbHAgPSAiW09QVElPTl0uLi4gW0ZJTEVdXG4iCisgICAgIkRpc3BsYXkgbG9nIGZpbGUgRklMRSAoY3JlYXRlZCBieSBCaW5hcnlMb2dSZWFkZXIpIHRvIHN0ZG91dC5cbiIKKyAgICAiRklMRSBpcyBcImFvc19sb2ctY3VycmVudFwiIGJ5IGRlZmF1bHQuXG4iCisgICAgIkZJTEUgY2FuIGFsc28gYmUgXCItXCIgdG8gcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LlxuIgorICAgICJcbiIKKyAgICAiICAtbiwgLS1uYW1lLXByZWZpeCBOQU1FICAiCisgICAgIm9ubHkgZGlzcGxheSBlbnRyaWVzIGZyb20gcHJvY2Vzc2VzIHdoaWNoIHNoYXJlIE5BTUUgYXMgYSBwcmVmaXhcbiIKKyAgICAiICAtTiwgLS1uYW1lIE5BTUUgICAgICAgICBvbmx5IGRpc3BsYXkgZW50cmllcyBmcm9tIHByb2Nlc3NlcyBuYW1lZCBOQU1FXG4iCisgICAgIiAgLWwsIC0tbGV2ZWwgTEVWRUwgICAgICAgIgorICAgICAgIm9ubHkgZGlzcGxheSBsb2cgZW50cmllcyBhdCBsZWFzdCBhcyBpbXBvcnRhbnQgYXMgTEVWRUxcbiIKKyAgICAiICAtcCwgLS1waWQgUElEICAgICAgICAgICBvbmx5IGRpc3BsYXkgbG9nIGVudHJpZXMgZnJvbSBwcm9jZXNzIFBJRFxuIgorICAgICIgIC1mLCAtLWZvbGxvdyAgICAgICAgICAgICIKKyAgICAgICJ3YWl0IHdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkIChpbXBsaWVzIC0tZW5kKVxuIgorICAgICIgIC10LCAtLXRlcm1pbmF0ZSAgICAgICAgIHN0b3Agd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCAoZGVmYXVsdClcbiIKKyAgICAiICAtYiwgLS1iZWdpbm5pbmcgICAgICAgICBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIChkZWZhdWx0KVxuIgorICAgICIgIC1lLCAtLWVuZCAgICAgICAgICAgICAgIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGVcbiIKKyAgICAiICAtcywgLS1za2lwIE5VTUJFUiAgICAgICBza2lwIE5VTUJFUiBtYXRjaGluZyBsb2dzXG4iCisgICAgIiAgLW0sIC0tbWF4IE5VTUJFUiAgICAgICAgb25seSBkaXNwbGF5IHVwIHRvIE5VTUJFUiBsb2dzXG4iCisgICAgIiAgLy8gLW8sIC0tZm9ybWF0IEZPUk1BVCAgdXNlIEZPUk1BVCB0byBkaXNwbGF5IGxvZyBlbnRyaWVzXG4iCisgICAgIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIKKyAgICAiXG4iCisgICAgIkxFVkVMIG11c3QgYmUgREVCVUcsIElORk8sIFdBUk5JTkcsIEVSUk9SLCBvciBGQVRBTC5cbiIKKyAgICAiICBJdCBkZWZhdWx0cyB0byBJTkZPLlxuIgorICAgICJcbiIKKyAgICAiVE9ETyhicmlhbnMpIGltcGxlbWVudCB0aGUgY29tbWVudGVkIG91dCBvbmVzLlxuIjsKKworY29uc3QgY2hhciAqa0V4YW1wbGVVc2FnZXMgPSAiVG8gdmlldyBsb2dzIGZyb20gdGhlIHNob290ZXI6XG4iCisgICAgIlx0YGxvZ19kaXNwbGF5ZXIgLW4gc2hvb3RlcmBcbiIKKyAgICAiVG8gdmlldyBkZWJ1ZyBsb2dzIGZyb20gdGhlIHNob290ZXI6XG4iCisgICAgIlx0YGxvZ19kaXNwbGF5ZXIgLW4gc2hvb3RlciAtbCBERUJVR2BcbiIKKyAgICAiVG8gdmlldyB3aGF0IHRoZSBzaG9vdGVyIGlzIGxvZ2dpbmcgaW4gcmVhbHRpbWU6XG4iCisgICAgIlx0YGxvZ19kaXNwbGF5ZXIgLWYgLW4gc2hvb3RlcmBcbiIKKyAgICAiVG8gdmlldyBzaG9vdGVyIGxvZ3MgZnJvbSBhbiBvbGQgbG9nIGZpbGU6XG4iCisgICAgIlx0YGxvZ19kaXNwbGF5ZXIgYW9zX2xvZy08bnVtYmVyPiAtbiBzaG9vdGVyYFxuIgorICAgICJUbyB2aWV3IHRoZSBzdGF0dXNlcyBvZiB0aGUgc2hvb3RlciBoYWxsIGVmZmVjdHMgaW4gcmVhbHRpbWU6XG4iCisgICAgIlx0YGxvZ19kaXNwbGF5ZXIgLWYgLW4gc2hvb3RlciAtbCBERUJVRyB8IGdyZXAgLlBvc2l0aW9uYFxuIjsKKwordm9pZCBQcmludEhlbHBBbmRFeGl0KCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyAlcyIsIHByb2dyYW1faW52b2NhdGlvbl9uYW1lLCBrQXJnc0hlbHApOworICBmcHJpbnRmKHN0ZGVyciwgIlxuRXhhbXBsZSB1c2FnZXM6XG5cbiVzIiwga0V4YW1wbGVVc2FnZXMpOworCisgIC8vIEdldCB0aGUgcG9zc2libGUgZXhlY3V0YWJsZXMgZnJvbSBzdGFydF9saXN0LnR4dC4KKyAgRklMRSAqc3RhcnRfbGlzdCA9IGZvcGVuKCJzdGFydF9saXN0LnR4dCIsICJyIik7CisgIGlmICghc3RhcnRfbGlzdCkgeworICAgIDo6c3RkOjpzdHJpbmcgcGF0aCg6OmFvczo6Y29uZmlndXJhdGlvbjo6R2V0Um9vdERpcmVjdG9yeSgpKTsKKyAgICBwYXRoICs9ICIvc3RhcnRfbGlzdC50eHQiOworICAgIHN0YXJ0X2xpc3QgPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7CisgICAgaWYgKCFzdGFydF9saXN0KSB7CisgICAgICBwcmludGYoIlxuQ2Fubm90IG9wZW4gc3RhcnRfbGlzdC50eHQuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbiIKKyAgICAgICJwb3NzaWJsZSBhcmd1bWVudHMgZm9yIHRoZSAtbiBvcHRpb24gY2Fubm90IGJlIHNob3duLiBsb2dfZGlzcGxheWVyXG4iCisgICAgICAibG9va3MgZm9yIHN0YXJ0X2xpc3QudHh0IGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBpblxuIgorICAgICAgIiVzLlxuXG4iLCA6OmFvczo6Y29uZmlndXJhdGlvbjo6R2V0Um9vdERpcmVjdG9yeSgpKTsKKyAgICAgIFBMT0coRkFUQUwsICJVbmFibGUgdG8gb3BlbiBzdGFydF9saXN0LnR4dCIpOworICAgIH0KKyAgfQorCisgIC8vIEdldCBmaWxlIHNpemUuCisgIGlmIChmc2VlayhzdGFydF9saXN0LCAwLCBTRUVLX0VORCkpIHsKKyAgICBQTE9HKEZBVEFMLCAiZnNlZWsoKSBmYWlsZWQgd2hpbGUgcmVhZGluZyBzdGFydF9saXN0LnR4dCIpOworICB9CisgIGludCBzaXplID0gZnRlbGwoc3RhcnRfbGlzdCk7CisgIGlmIChzaXplIDwgMCkgeworICAgIFBMT0coRkFUQUwsICJmdGVsbCgpIGZhaWxlZCB3aGlsZSByZWFkaW5nIHN0YXJ0X2xpc3QudHh0Iik7CisgIH0KKyAgcmV3aW5kKHN0YXJ0X2xpc3QpOworCisgIDo6c3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gY29udGVudHMobmV3IGNoYXJbc2l6ZSArIDFdKTsKKyAgaWYgKGNvbnRlbnRzID09IE5VTEwpIHsKKyAgICBMT0coRkFUQUwsICJtYWxsb2MoKSBmYWlsZWQgd2hpbGUgcmVhZGluZyBzdGFydF9saXN0LnR4dC5cbiIpOworICB9CisgIHNpemVfdCBieXRlc19yZWFkID0gZnJlYWQoY29udGVudHMuZ2V0KCksIDEsIHNpemUsIHN0YXJ0X2xpc3QpOworICBpZiAoYnl0ZXNfcmVhZCA8IHN0YXRpY19jYXN0PHNpemVfdD4oc2l6ZSkpIHsKKyAgICBMT0coRkFUQUwsICJSZWFkICV6dSBieXRlcyBmcm9tIHN0YXJ0X2xpc3QudHh0LCBleHBlY3RlZCAlZC5cbiIsCisgICAgICAgIGJ5dGVzX3JlYWQsIHNpemUpOworICB9CisKKyAgLy8gcHJpbnRmIGRvZXNuJ3QgbGlrZSBzdHJpbmdzIHdpdGhvdXQgdGhlIFwwLgorICBjb250ZW50c1tzaXplXSA9ICdcMCc7CisgIGZwcmludGYoc3RkZXJyLCAiXG5Qb3NzaWJsZSBhcmd1bWVudHMgZm9yIHRoZSAtbiBvcHRpb246XG4lcyIsIGNvbnRlbnRzLmdldCgpKTsKKworICBpZiAoZmNsb3NlKHN0YXJ0X2xpc3QpKSB7CisgICAgTE9HKEZBVEFMLCAiZmNsb3NlKCkgZmFpbGVkLlxuIik7CisgIH0KKworICBleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgY29uc3QgY2hhciAqZmlsdGVyX25hbWUgPSBudWxscHRyLCAqZmlsdGVyX2V4YWN0X25hbWUgPSBudWxscHRyOworICBzaXplX3QgZmlsdGVyX2xlbmd0aCA9IDA7CisgIGxvZ19sZXZlbCBmaWx0ZXJfbGV2ZWwgPSBJTkZPOworICBib29sIGZvbGxvdyA9IGZhbHNlOworICAvLyBXaGV0aGVyIHdlIG5lZWQgdG8gc2tpcCBldmVyeXRoaW5nIHVudGlsIHdlIGdldCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICBib29sIHNraXBfdG9fZW5kID0gZmFsc2U7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gImFvc19sb2ctY3VycmVudCI7CisgIGludCBkaXNwbGF5X21heCA9IDA7CisgIGludDMyX3Qgc291cmNlX3BpZCA9IC0xOworCisgIDo6YW9zOjpsb2dnaW5nOjpJbml0KCk7CisgIDo6YW9zOjpsb2dnaW5nOjpBZGRJbXBsZW1lbnRhdGlvbigKKyAgICAgIG5ldyA6OmFvczo6bG9nZ2luZzo6U3RyZWFtTG9nSW1wbGVtZW50YXRpb24oc3Rkb3V0KSk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKyAgICAgIHsibmFtZS1wcmVmaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ24nfSwKKyAgICAgIHsibmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnTid9LAorICAgICAgeyJsZXZlbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAorICAgICAgeyJwaWQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3AnfSwKKworICAgICAgeyJmb2xsb3ciLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKKyAgICAgIHsidGVybWluYXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsICd0J30sCisgICAgICB7ImJlZ2lubmluZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYid9LAorICAgICAgeyJlbmQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2UnfSwKKyAgICAgIHsic2tpcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAncyd9LAorICAgICAgeyJtYXgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ20nfSwKKworICAgICAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ28nfSwKKworICAgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCisgICAgICB7MCwgMCwgMCwgMH0KKyAgICB9OworICAgIGludCBvcHRpb25faW5kZXggPSAwOworCisgICAgY29uc3QgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiTjpuOmw6cDpmdHM6bTpvOmgiLAorICAgICAgICAgICAgICAgICAgICBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworICAgIGlmIChjID09IC0xKSB7IC8vIGlmIHdlJ3JlIGF0IHRoZSBlbmQKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgZnB1dHMoIkxvZ0Rpc3BsYXllcjogZ290IGEgMCBvcHRpb24gYnV0IGRpZG4ndCBzZXQgdXAgYW55XG4iLCBzdGRlcnIpOworICAgICAgICBhYm9ydCgpOworICAgICAgY2FzZSAnbic6CisgICAgICAgIGZpbHRlcl9uYW1lID0gb3B0YXJnOworICAgICAgICBmaWx0ZXJfZXhhY3RfbmFtZSA9IG51bGxwdHI7CisgICAgICAgIGZpbHRlcl9sZW5ndGggPSBzdHJsZW4oZmlsdGVyX25hbWUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ04nOgorICAgICAgICBmaWx0ZXJfZXhhY3RfbmFtZSA9IG9wdGFyZzsKKyAgICAgICAgZmlsdGVyX25hbWUgPSBudWxscHRyOworICAgICAgICBmaWx0ZXJfbGVuZ3RoID0gc3RybGVuKGZpbHRlcl9uYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdsJzoKKyAgICAgICAgZmlsdGVyX2xldmVsID0gOjphb3M6OmxvZ2dpbmc6OnN0cl9sb2cob3B0YXJnKTsKKyAgICAgICAgaWYgKGZpbHRlcl9sZXZlbCA9PSBMT0dfVU5LTk9XTikgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTG9nRGlzcGxheWVyOiB1bmtub3duIGxvZyBsZXZlbCAnJXMnXG4iLCBvcHRhcmcpOworICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3AnOgorICAgICAgICBpZiAoITo6YW9zOjp1dGlsOjpTdHJpbmdUb051bWJlcig6OnN0ZDo6c3RyaW5nKG9wdGFyZyksICZzb3VyY2VfcGlkKSkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IC1wIGV4cGVjdHMgYSBudW1iZXIsIG5vdCAnJXMnLlxuIiwgb3B0YXJnKTsKKyAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZV9waWQgPCAwKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJMb2dEaXNwbGF5ZXI6IGludmFsaWQgcGlkICclcydcbiIsIG9wdGFyZyk7CisgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnZic6CisgICAgICAgIGZvbGxvdyA9IHRydWU7CisgICAgICAgIHNraXBfdG9fZW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0JzoKKyAgICAgICAgZm9sbG93ID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnYic6CisgICAgICAgIHNraXBfdG9fZW5kID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnZSc6CisgICAgICAgIHNraXBfdG9fZW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdtJzoKKyAgICAgICAgaWYgKCE6OmFvczo6dXRpbDo6U3RyaW5nVG9OdW1iZXIoOjpzdGQ6OnN0cmluZyhvcHRhcmcpLCAmZGlzcGxheV9tYXgpKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogLW0gZXhwZWN0cyBhIG51bWJlciwgbm90ICclcycuXG4iLCBvcHRhcmcpOworICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlzcGxheV9tYXggPD0gMCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTG9nRGlzcGxheWVyOiBpbnZhbGlkIG1heCBsb2cgbnVtYmVyICclcydcbiIsCisgICAgICAgICAgICAgIG9wdGFyZyk7CisgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnbyc6CisgICAgICAgIGFib3J0KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnaCc6CisgICAgICAgIFByaW50SGVscEFuZEV4aXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc/JzoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkxvZ0Rpc3BsYXllcjogaW4gYSBiYWQgc3BvdCAoJXM6ICVkKVxuIiwKKyAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOworICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgfQorCisgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgLy8gV2UgZ290IGEgZmlsZW5hbWUuCisgICAgZmlsZW5hbWUgPSBhcmd2W29wdGluZCsrXTsKKyAgfQorICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgIGZwdXRzKCJub24tb3B0aW9uIEFSR1YtZWxlbWVudHM6ICIsIHN0ZGVycik7CisgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGFyZ3Zbb3B0aW5kKytdKTsKKyAgICB9CisgIH0KKworICBpbnQgZmQ7CisgIGlmIChzdHJjbXAoZmlsZW5hbWUsICItIikgPT0gMCkgeworICAgIGlmIChza2lwX3RvX2VuZCkgeworICAgICAgZnB1dHMoIkNhbid0IHNraXAgdG8gZW5kIG9mIHN0ZGluIVxuIiwgc3RkZXJyKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGZkID0gU1RESU5fRklMRU5POworICB9IGVsc2UgeworICAgIGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworICB9CisKKyAgZnByaW50ZihzdGRlcnIsICJkaXNwbGF5aW5nIGRvd24gdG8gbGV2ZWwgJXMgZnJvbSBmaWxlICclcydcbiIsCisgICAgICA6OmFvczo6bG9nZ2luZzo6bG9nX3N0cihmaWx0ZXJfbGV2ZWwpLCBmaWxlbmFtZSk7CisKKyAgaWYgKGZkID09IC0xKSB7CisgICAgUExPRyhGQVRBTCwgImNvdWxkbid0IG9wZW4gZmlsZSAnJXMnIGZvciByZWFkaW5nIiwgZmlsZW5hbWUpOworICB9CisgIDo6YW9zOjpsb2dnaW5nOjpsaW51eF9jb2RlOjpMb2dGaWxlUmVhZGVyIHJlYWRlcihmZCk7CisKKyAgaWYgKHNraXBfdG9fZW5kKSB7CisgICAgZnB1dHMoInNraXBwaW5nIG9sZCBsb2dzLi4uXG4iLCBzdGRlcnIpOworICAgIHJlYWRlci5Ta2lwVG9MYXN0U2Vla2FibGVQYWdlKCk7CisgIH0KKworICBjb25zdCBMb2dGaWxlTWVzc2FnZUhlYWRlciAqbXNnOworICBpbnQgZGlzcGxheWVkID0gMDsKKyAgZG8geworICAgIG1zZyA9IHJlYWRlci5SZWFkTmV4dE1lc3NhZ2UoZm9sbG93KTsKKyAgICBpZiAobXNnID09IE5VTEwpIHsKKyAgICAgIGZwdXRzKCJyZWFjaGVkIGVuZCBvZiBmaWxlXG4iLCBzdGRlcnIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG1zZy0+dHlwZSA9PSBMb2dGaWxlTWVzc2FnZUhlYWRlcjo6TWVzc2FnZVR5cGU6OmtTdHJ1Y3RUeXBlKSB7CisgICAgICBzaXplX3QgYnl0ZXMgPSBtc2ctPm1lc3NhZ2Vfc2l6ZTsKKyAgICAgIDo6YW9zOjpNZXNzYWdlVHlwZSAqdHlwZSA9IDo6YW9zOjpNZXNzYWdlVHlwZTo6RGVzZXJpYWxpemUoCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KG1zZyArIDEpLCAmYnl0ZXMpOworICAgICAgaWYgKHR5cGUgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coSU5GTywgIlRyeWluZyBvbGQgdmVyc2lvbiBvZiB0eXBlIGRlY29kaW5nLlxuIik7CisgICAgICAgIGJ5dGVzID0gbXNnLT5tZXNzYWdlX3NpemU7CisgICAgICAgIHR5cGUgPSA6OmFvczo6TWVzc2FnZVR5cGU6OkRlc2VyaWFsaXplKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KG1zZyArIDEpLCAmYnl0ZXMsIGZhbHNlKTsKKyAgICAgIH0KKworICAgICAgaWYgKHR5cGUgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coV0FSTklORywgIkVycm9yIGRlc2VyaWFsaXppbmcgTWVzc2FnZVR5cGUgb2Ygc2l6ZSAlIiBQUkl4MzIKKyAgICAgICAgICAgICAgICAgICAgICIgc3RhcnRpbmcgYXQgJXp4LlxuIiwKKyAgICAgICAgICAgIG1zZy0+bWVzc2FnZV9zaXplLCByZWFkZXIuZmlsZV9vZmZzZXQobXNnICsgMSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgOjphb3M6OnR5cGVfY2FjaGU6OkFkZCgqdHlwZSk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlX3BpZCA+PSAwICYmIG1zZy0+c291cmNlICE9IHNvdXJjZV9waWQpIHsKKyAgICAgIC8vIE1lc3NhZ2UgaXMgZnJvbSB0aGUgd3JvbmcgcHJvY2Vzcy4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChza2lwX3RvX2VuZCkgeworICAgICAgaWYgKHJlYWRlci5Jc0xhc3RQYWdlKCkpIHsKKyAgICAgICAgZnB1dHMoImRvbmUgc2tpcHBpbmcgb2xkIGxvZ3NcbiIsIHN0ZGVycik7CisgICAgICAgIHNraXBfdG9fZW5kID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoOjphb3M6OmxvZ2dpbmc6OmxvZ19ndF9pbXBvcnRhbnQoZmlsdGVyX2xldmVsLCBtc2ctPmxldmVsKSkgY29udGludWU7CisKKyAgICBjb25zdCBjaGFyICpwb3NpdGlvbiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihtc2cgKyAxKTsKKworICAgIGlmIChmaWx0ZXJfbmFtZSAhPSBudWxscHRyKSB7CisgICAgICBjb25zdCBzaXplX3QgY29tcGFyZV9sZW5ndGggPQorICAgICAgICAgIDo6c3RkOjptaW48c2l6ZV90PihmaWx0ZXJfbGVuZ3RoLCBtc2ctPm5hbWVfc2l6ZSk7CisgICAgICBpZiAobWVtY21wKGZpbHRlcl9uYW1lLCBwb3NpdGlvbiwgY29tcGFyZV9sZW5ndGgpICE9IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoY29tcGFyZV9sZW5ndGggPCBtc2ctPm5hbWVfc2l6ZSkgeworICAgICAgICBpZiAocG9zaXRpb25bY29tcGFyZV9sZW5ndGhdICE9ICcuJykgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpbHRlcl9leGFjdF9uYW1lICE9IG51bGxwdHIpIHsKKyAgICAgIGlmIChmaWx0ZXJfbGVuZ3RoICE9IG1zZy0+bmFtZV9zaXplKSBjb250aW51ZTsKKyAgICAgIGlmIChtZW1jbXAoZmlsdGVyX2V4YWN0X25hbWUsIHBvc2l0aW9uLCBmaWx0ZXJfbGVuZ3RoKSAhPSAwKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChkaXNwbGF5X21heCAmJiBkaXNwbGF5ZWQrKyA+PSBkaXNwbGF5X21heCkgeworICAgICAgZnB1dHMoIk5vdCBkaXNwbGF5aW5nIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlcy5cbiIsIHN0ZGVycik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwb3NpdGlvbiArPSBtc2ctPm5hbWVfc2l6ZTsKKworI2RlZmluZSBCQVNFX0FSR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQU9TX0xPR0dJTkdfQkFTRV9BUkdTKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtc2ctPm5hbWVfc2l6ZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KG1zZyArIDEpLCBtc2ctPnNvdXJjZSwgXAorICAgICAgbXNnLT5zZXF1ZW5jZSwgbXNnLT5sZXZlbCwgbXNnLT50aW1lX3NlYywgbXNnLT50aW1lX25zZWMpCisgICAgc3dpdGNoIChtc2ctPnR5cGUpIHsKKyAgICAgIGNhc2UgTG9nRmlsZU1lc3NhZ2VIZWFkZXI6Ok1lc3NhZ2VUeXBlOjprU3RyaW5nOgorICAgICAgICBmcHJpbnRmKHN0ZG91dCwgQU9TX0xPR0dJTkdfQkFTRV9GT1JNQVQgIiUuKnMiLCBCQVNFX0FSR1MsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihtc2ctPm1lc3NhZ2Vfc2l6ZSksIHBvc2l0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExvZ0ZpbGVNZXNzYWdlSGVhZGVyOjpNZXNzYWdlVHlwZTo6a1N0cnVjdDogeworICAgICAgICB1aW50MzJfdCB0eXBlX2lkOworICAgICAgICBtZW1jcHkoJnR5cGVfaWQsIHBvc2l0aW9uLCBzaXplb2YodHlwZV9pZCkpOworICAgICAgICBwb3NpdGlvbiArPSBzaXplb2YodHlwZV9pZCk7CisKKyAgICAgICAgdWludDMyX3Qgc3RyaW5nX2xlbmd0aDsKKyAgICAgICAgbWVtY3B5KCZzdHJpbmdfbGVuZ3RoLCBwb3NpdGlvbiwgc2l6ZW9mKHN0cmluZ19sZW5ndGgpKTsKKyAgICAgICAgcG9zaXRpb24gKz0gc2l6ZW9mKHN0cmluZ19sZW5ndGgpOworCisgICAgICAgIGNoYXIgYnVmZmVyWzIwNDhdOworICAgICAgICBzaXplX3Qgb3V0cHV0X2xlbmd0aCA9IHNpemVvZihidWZmZXIpOworICAgICAgICBzaXplX3QgaW5wdXRfbGVuZ3RoID0KKyAgICAgICAgICAgIG1zZy0+bWVzc2FnZV9zaXplIC0KKyAgICAgICAgICAgIChzaXplb2YodHlwZV9pZCkgKyBzaXplb2YodWludDMyX3QpICsgc3RyaW5nX2xlbmd0aCk7CisgICAgICAgIGlmICghUHJpbnRNZXNzYWdlKGJ1ZmZlciwgJm91dHB1dF9sZW5ndGgsIHBvc2l0aW9uICsgc3RyaW5nX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0X2xlbmd0aCwgOjphb3M6OnR5cGVfY2FjaGU6OkdldCh0eXBlX2lkKSkpIHsKKyAgICAgICAgICBMT0coRkFUQUwsICJwcmludGluZyBtZXNzYWdlICglLipzKSBvZiB0eXBlICVzIGludG8gJXp1LWJ5dGUgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICJmYWlsZWRcbiIsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RyaW5nX2xlbmd0aCksIHBvc2l0aW9uLAorICAgICAgICAgICAgICA6OmFvczo6dHlwZV9jYWNoZTo6R2V0KHR5cGVfaWQpLm5hbWUuY19zdHIoKSwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dF9sZW5ndGggPiAwKSB7CisgICAgICAgICAgTE9HKFdBUk5JTkcsICIlenUgZXh0cmEgYnl0ZXMgb24gbWVzc2FnZSBvZiB0eXBlICVzXG4iLAorICAgICAgICAgICAgICBpbnB1dF9sZW5ndGgsIDo6YW9zOjp0eXBlX2NhY2hlOjpHZXQodHlwZV9pZCkubmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKHN0ZG91dCwgQU9TX0xPR0dJTkdfQkFTRV9GT1JNQVQgIiUuKnM6ICUuKnNcbiIsIEJBU0VfQVJHUywKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0cmluZ19sZW5ndGgpLCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihidWZmZXIpIC0gb3V0cHV0X2xlbmd0aCksIGJ1ZmZlcik7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBMb2dGaWxlTWVzc2FnZUhlYWRlcjo6TWVzc2FnZVR5cGU6OmtNYXRyaXg6IHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgbWVtY3B5KCZ0eXBlLCBwb3NpdGlvbiwgc2l6ZW9mKHR5cGUpKTsKKyAgICAgICAgcG9zaXRpb24gKz0gc2l6ZW9mKHR5cGUpOworCisgICAgICAgIHVpbnQzMl90IHN0cmluZ19sZW5ndGg7CisgICAgICAgIG1lbWNweSgmc3RyaW5nX2xlbmd0aCwgcG9zaXRpb24sIHNpemVvZihzdHJpbmdfbGVuZ3RoKSk7CisgICAgICAgIHBvc2l0aW9uICs9IHNpemVvZihzdHJpbmdfbGVuZ3RoKTsKKworICAgICAgICB1aW50MTZfdCByb3dzOworICAgICAgICBtZW1jcHkoJnJvd3MsIHBvc2l0aW9uLCBzaXplb2Yocm93cykpOworICAgICAgICBwb3NpdGlvbiArPSBzaXplb2Yocm93cyk7CisgICAgICAgIHVpbnQxNl90IGNvbHM7CisgICAgICAgIG1lbWNweSgmY29scywgcG9zaXRpb24sIHNpemVvZihjb2xzKSk7CisgICAgICAgIHBvc2l0aW9uICs9IHNpemVvZihjb2xzKTsKKworICAgICAgICBjb25zdCBzaXplX3QgbWF0cml4X2J5dGVzID0KKyAgICAgICAgICAgIG1zZy0+bWVzc2FnZV9zaXplIC0KKyAgICAgICAgICAgIChzaXplb2YodHlwZSkgKyBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKHVpbnQxNl90KSArCisgICAgICAgICAgICAgc2l6ZW9mKHVpbnQxNl90KSArIHN0cmluZ19sZW5ndGgpOworICAgICAgICBDSEVDS19FUShtYXRyaXhfYnl0ZXMsIDo6YW9zOjpNZXNzYWdlVHlwZTo6U2l6ZW9mKHR5cGUpICogcm93cyAqIGNvbHMpOworICAgICAgICBjaGFyIGJ1ZmZlclsyMDQ4XTsKKyAgICAgICAgc2l6ZV90IG91dHB1dF9sZW5ndGggPSBzaXplb2YoYnVmZmVyKTsKKyAgICAgICAgaWYgKCE6OmFvczo6UHJpbnRNYXRyaXgoYnVmZmVyLCAmb3V0cHV0X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gKyBzdHJpbmdfbGVuZ3RoLCB0eXBlLCByb3dzLCBjb2xzKSkgeworICAgICAgICAgIExPRyhGQVRBTCwgInByaW50aW5nICVkeCVkIG1hdHJpeCBvZiB0eXBlICUiIFBSSXUzMiAiIGZhaWxlZFxuIiwgcm93cywKKyAgICAgICAgICAgICAgY29scywgdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihzdGRvdXQsIEFPU19MT0dHSU5HX0JBU0VfRk9STUFUICIlLipzOiAlLipzXG4iLCBCQVNFX0FSR1MsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdHJpbmdfbGVuZ3RoKSwgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoYnVmZmVyKSAtIG91dHB1dF9sZW5ndGgpLCBidWZmZXIpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgTG9nRmlsZU1lc3NhZ2VIZWFkZXI6Ok1lc3NhZ2VUeXBlOjprU3RydWN0VHlwZToKKyAgICAgICAgTE9HKEZBVEFMLCAic2hvdWxkbid0IGdldCBoZXJlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI3VuZGVmIEJBU0VfQVJHUworICB9IHdoaWxlIChtc2cgIT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ19yZXBsYXkuY2MgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ19yZXBsYXkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5OTFkZQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL2xvZ2dpbmcvbG9nX3JlcGxheS5jYwpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9sb2dfcmVwbGF5LmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGxvZ2dpbmcgeworbmFtZXNwYWNlIGxpbnV4X2NvZGUgeworCitib29sIExvZ1JlcGxheWVyOjpQcm9jZXNzTWVzc2FnZSgpIHsKKyAgY29uc3QgTG9nRmlsZU1lc3NhZ2VIZWFkZXIgKm1lc3NhZ2UgPSByZWFkZXJfLT5SZWFkTmV4dE1lc3NhZ2UoZmFsc2UpOworICBpZiAobWVzc2FnZSA9PSBudWxscHRyKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKG1lc3NhZ2UtPnR5cGUgIT0gTG9nRmlsZU1lc3NhZ2VIZWFkZXI6Ok1lc3NhZ2VUeXBlOjprU3RydWN0KSByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgY2hhciAqcG9zaXRpb24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4obWVzc2FnZSArIDEpOworCisgIDo6c3RkOjpzdHJpbmcgcHJvY2Vzcyhwb3NpdGlvbiwgbWVzc2FnZS0+bmFtZV9zaXplKTsKKyAgcG9zaXRpb24gKz0gbWVzc2FnZS0+bmFtZV9zaXplOworCisgIHVpbnQzMl90IHR5cGVfaWQ7CisgIG1lbWNweSgmdHlwZV9pZCwgcG9zaXRpb24sIHNpemVvZih0eXBlX2lkKSk7CisgIHBvc2l0aW9uICs9IHNpemVvZih0eXBlX2lkKTsKKworICB1aW50MzJfdCBtZXNzYWdlX2xlbmd0aDsKKyAgbWVtY3B5KCZtZXNzYWdlX2xlbmd0aCwgcG9zaXRpb24sIHNpemVvZihtZXNzYWdlX2xlbmd0aCkpOworICBwb3NpdGlvbiArPSBzaXplb2YobWVzc2FnZV9sZW5ndGgpOworICA6OnN0ZDo6c3RyaW5nIG1lc3NhZ2VfdGV4dChwb3NpdGlvbiwgbWVzc2FnZV9sZW5ndGgpOworICBwb3NpdGlvbiArPSBtZXNzYWdlX2xlbmd0aDsKKworICBzaXplX3Qgc3BsaXRfaW5kZXggPSBtZXNzYWdlX3RleHQuZmluZF9maXJzdF9vZignOicpICsgMjsKKyAgc3BsaXRfaW5kZXggPSBtZXNzYWdlX3RleHQuZmluZF9maXJzdF9vZignOicsIHNwbGl0X2luZGV4KSArIDI7CisgIG1lc3NhZ2VfdGV4dCA9IG1lc3NhZ2VfdGV4dC5zdWJzdHIoc3BsaXRfaW5kZXgpOworCisgIGF1dG8gaGFuZGxlciA9IGhhbmRsZXJzXy5maW5kKEtleShwcm9jZXNzLCBtZXNzYWdlX3RleHQpKTsKKyAgaWYgKGhhbmRsZXIgPT0gaGFuZGxlcnNfLmVuZCgpKSByZXR1cm4gZmFsc2U7CisKKyAgaGFuZGxlci0+c2Vjb25kLT5IYW5kbGVTdHJ1Y3QoCisgICAgICA6OmFvczo6dGltZTo6VGltZShtZXNzYWdlLT50aW1lX3NlYywgbWVzc2FnZS0+dGltZV9uc2VjKSwgdHlwZV9pZCwKKyAgICAgIHBvc2l0aW9uLAorICAgICAgbWVzc2FnZS0+bWVzc2FnZV9zaXplIC0KKyAgICAgICAgICAoc2l6ZW9mKHR5cGVfaWQpICsgc2l6ZW9mKG1lc3NhZ2VfbGVuZ3RoKSArIG1lc3NhZ2VfbGVuZ3RoKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGxpbnV4X2NvZGUKK30gIC8vIG5hbWVzcGFjZSBsb2dnaW5nCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ19yZXBsYXkuaCBiL2Fvcy9saW51eF9jb2RlL2xvZ2dpbmcvbG9nX3JlcGxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmYyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ19yZXBsYXkuaApAQCAtMCwwICsxLDE2NCBAQAorI2lmbmRlZiBBT1NfTElOVVhfQ09ERV9MT0dHSU5HX0xPR19SRVBMQVlfSF8KKyNkZWZpbmUgQU9TX0xJTlVYX0NPREVfTE9HR0lOR19MT0dfUkVQTEFZX0hfCisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2xvZ2dpbmcvYmluYXJ5X2xvZ19maWxlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL3F1ZXVlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90eXBlcy5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBsb2dnaW5nIHsKK25hbWVzcGFjZSBsaW51eF9jb2RlIHsKKworLy8gTWFuYWdlcyBwdWxsaW5nIGxvZ2dlZCBxdWV1ZSBtZXNzYWdlcyBvdXQgb2YgbG9nIGZpbGVzLgorLy8KKy8vIEJhc2ljIHVzYWdlOgorLy8gICAtIFVzZSB0aGUgQWRkKiBtZXRob2RzIHRvIHJlZ2lzdGVyIGhhbmRsZXJzIGZvciB2YXJpb3VzIG1lc3NhZ2Ugc291cmNlcy4KKy8vICAgLSBDYWxsIE9wZW5GaWxlIHRvIG9wZW4gYSBsb2cgZmlsZS4KKy8vICAgLSBDYWxsIFByb2Nlc3NNZXNzYWdlIHJlcGVhdGVkbHkgdW50aWwgaXQgcmV0dXJucyB0cnVlLgorLy8KKy8vIFRoaXMgY29kZSBjb3VsZCBkbyBzb21ldGhpbmcgdG8gYWRhcHQgc2ltaWxhci1idXQtbm90LWlkZW50aWNhbAorLy8gbWVzc2FnZXMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbnMsIGJ1dCBjdXJyZW50bHkgaXQgd2lsbCBMT0coRkFUQUwpIGlmIGFueSBvZgorLy8gdGhlIG1lc3NhZ2VzIGRvbid0IG1hdGNoIHVwIGV4YWN0bHkuCitjbGFzcyBMb2dSZXBsYXllciB7CisgcHVibGljOgorICBMb2dSZXBsYXllcigpIHt9CisKKyAgLy8gR2V0cyByZWFkeSB0byByZWFkIG1lc3NhZ2VzIGZyb20gZmQuCisgIC8vIERvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIGZkLgorICB2b2lkIE9wZW5GaWxlKGludCBmZCkgeworICAgIHJlYWRlcl8ucmVzZXQobmV3IExvZ0ZpbGVSZWFkZXIoZmQpKTsKKyAgfQorICAvLyBDbG9zZXMgdGhlIGN1cnJlbnRseSBvcGVuIGZpbGUuCisgIHZvaWQgQ2xvc2VDdXJyZW50RmlsZSgpIHsgcmVhZGVyXy5yZXNldCgpOyB9CisgIC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBoYXZlIGEgZmlsZSB3aGljaCBpcyBjdXJyZW50bHkgb3Blbi4KKyAgYm9vbCBIYXNDdXJyZW50RmlsZSgpIGNvbnN0IHsgcmV0dXJuIHJlYWRlcl8uZ2V0KCkgIT0gbnVsbHB0cjsgfQorCisgIC8vIFByb2Nlc3NlcyBhIHNpbmdsZSBtZXNzYWdlIGZyb20gdGhlIGN1cnJlbnRseSBvcGVuIGZpbGUuCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtZXNzYWdlcyBpbiB0aGUgZmlsZS4KKyAgLy8gVGhpcyB3aWxsIG5vdCBjYWxsIGFueSBvZiB0aGUgaGFuZGxlcnMgaWYgdGhlIG5leHQgbWVzc2FnZSBlaXRoZXIgaGFzIG5vCisgIC8vIHJlZ2lzdGVyZWQgaGFuZGxlcnMgb3IgaXMgbm90IGEgcXVldWUgbWVzc2FnZS4KKyAgYm9vbCBQcm9jZXNzTWVzc2FnZSgpOworCisgIC8vIEFkZHMgYSBoYW5kbGVyIGZvciBtZXNzYWdlcyB3aXRoIGEgY2VydGFpbiBzdHJpbmcgZnJvbSBhIGNlcnRhaW4gcHJvY2Vzcy4KKyAgLy8gVCBtdXN0IGJlIGEgTWVzc2FnZSB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5CisgIC8vIHRoZSAucSBmaWxlcy4KKyAgLy8gTE9HKEZBVEFMKXMgZm9yIGR1cGxpY2F0ZSBoYW5kbGVycy4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHZvaWQgQWRkSGFuZGxlcihjb25zdCA6OnN0ZDo6c3RyaW5nICZwcm9jZXNzX25hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nICZsb2dfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIDo6c3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFQgJm1lc3NhZ2UpPiBoYW5kbGVyKSB7CisgICAgQ0hFQ0soaGFuZGxlcnNfLmVtcGxhY2UoCisgICAgICAgIDo6c3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICA6OnN0ZDo6Zm9yd2FyZF9hc190dXBsZShwcm9jZXNzX25hbWUsIGxvZ19tZXNzYWdlKSwKKyAgICAgICAgOjpzdGQ6OmZvcndhcmRfYXNfdHVwbGUoOjpzdGQ6OnVuaXF1ZV9wdHI8U3RydWN0SGFuZGxlckludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgVHlwZWRTdHJ1Y3RIYW5kbGVyPFQ+KGhhbmRsZXIpKSkpLnNlY29uZCk7CisgIH0KKworICAvLyBBZGRzIGEgaGFuZGxlciB3aGljaCB0YWtlcyBtZXNzYWdlcyBhbmQgcGxhY2VzIHRoZW0gZGlyZWN0bHkgb24gYSBxdWV1ZS4KKyAgLy8gVCBtdXN0IGJlIGEgTWVzc2FnZSB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5CisgIC8vIHRoZSAucSBmaWxlcy4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHZvaWQgQWRkRGlyZWN0UXVldWVTZW5kZXIoY29uc3QgOjpzdGQ6OnN0cmluZyAmcHJvY2Vzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcgJmxvZ19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YW9zOjpRdWV1ZTxUPiAmcXVldWUpIHsKKyAgICBBZGRIYW5kbGVyKHByb2Nlc3NfbmFtZSwgbG9nX21lc3NhZ2UsCisgICAgICAgICAgICAgICA6OnN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBUICYpPigKKyAgICAgICAgICAgICAgICAgICBRdWV1ZUR1bXBTdHJ1Y3RIYW5kbGVyPFQ+KHF1ZXVlLm5hbWUoKSkpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQSBnZW5lcmljIGhhbmRsZXIgb2Ygc3RydWN0IGxvZyBtZXNzYWdlcy4KKyAgY2xhc3MgU3RydWN0SGFuZGxlckludGVyZmFjZSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+U3RydWN0SGFuZGxlckludGVyZmFjZSgpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlU3RydWN0KDo6YW9zOjp0aW1lOjpUaW1lIGxvZ190aW1lLCB1aW50MzJfdCB0eXBlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgPSAwOworICB9OworCisgIC8vIENvbnZlcnRzIHN0cnVjdCBsb2cgbWVzc2FnZXMgdG8gYSBtZXNzYWdlIHR5cGUgYW5kIHBhc3NlcyBpdCB0byBhbgorICAvLyA6OnN0ZDo6ZnVuY3Rpb24uCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBjbGFzcyBUeXBlZFN0cnVjdEhhbmRsZXIgOiBwdWJsaWMgU3RydWN0SGFuZGxlckludGVyZmFjZSB7CisgICBwdWJsaWM6CisgICAgVHlwZWRTdHJ1Y3RIYW5kbGVyKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFQgJm1lc3NhZ2UpPiBoYW5kbGVyKQorICAgICAgICA6IGhhbmRsZXJfKGhhbmRsZXIpIHt9CisKKyAgICB2b2lkIEhhbmRsZVN0cnVjdCg6OmFvczo6dGltZTo6VGltZSBsb2dfdGltZSwgdWludDMyX3QgdHlwZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKSBvdmVycmlkZSB7CisgICAgICBDSEVDS19FUSh0eXBlX2lkLCBUOjpHZXRUeXBlKCktPmlkKTsKKyAgICAgIFQgbWVzc2FnZTsKKyAgICAgIENIRUNLX0VRKGRhdGFfc2l6ZSwgVDo6U2l6ZSgpKTsKKyAgICAgIENIRUNLX0VRKGRhdGFfc2l6ZSwgbWVzc2FnZS5EZXNlcmlhbGl6ZShzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KGRhdGEpKSk7CisgICAgICBtZXNzYWdlLnNlbnRfdGltZSA9IGxvZ190aW1lOworICAgICAgaGFuZGxlcl8obWVzc2FnZSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IDo6c3RkOjpmdW5jdGlvbjx2b2lkKFQgbWVzc2FnZSk+IGhhbmRsZXJfOworICB9OworCisgIC8vIEEgY2FsbGFibGUgY2xhc3Mgd2hpY2ggZHVtcHMgbWVzc2FnZXMgc3RyYWlnaHQgdG8gYSBxdWV1ZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIGNsYXNzIFF1ZXVlRHVtcFN0cnVjdEhhbmRsZXIgeworICAgcHVibGljOgorICAgIFF1ZXVlRHVtcFN0cnVjdEhhbmRsZXIoY29uc3QgOjpzdGQ6OnN0cmluZyAmcXVldWVfbmFtZSkKKyAgICAgICAgOiBxdWV1ZV8oUmF3UXVldWU6OkZldGNoKHF1ZXVlX25hbWUuY19zdHIoKSwgc2l6ZW9mKFQpLCBUOjprSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ6OmtRdWV1ZUxlbmd0aCkpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgVCAmbWVzc2FnZSkgeworICAgICAgTE9HX1NUUlVDVChERUJVRywgInJlLXNlbmRpbmciLCBtZXNzYWdlKTsKKyAgICAgIHZvaWQgKnJhd19tZXNzYWdlID0gcXVldWVfLT5HZXRNZXNzYWdlKCk7CisgICAgICBDSEVDS19OT1ROVUxMKHJhd19tZXNzYWdlKTsKKyAgICAgIG1lbWNweShyYXdfbWVzc2FnZSwgJm1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSk7CisgICAgICBDSEVDSyhxdWV1ZV8tPldyaXRlTWVzc2FnZShyYXdfbWVzc2FnZSwgUmF3UXVldWU6OmtPdmVycmlkZSkpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICA6OmFvczo6UmF3UXVldWUgKmNvbnN0IHF1ZXVlXzsKKyAgfTsKKworICAvLyBBIGtleSBmb3Igc3BlY2lmeWluZyBsb2cgbWVzc2FnZXMgdG8gZ2l2ZSB0byBhIGNlcnRhaW4gaGFuZGxlci4KKyAgc3RydWN0IEtleSB7CisgICAgS2V5KGNvbnN0IDo6c3RkOjpzdHJpbmcgJnByb2Nlc3NfbmFtZSwgY29uc3QgOjpzdGQ6OnN0cmluZyAmbG9nX21lc3NhZ2UpCisgICAgICAgIDogcHJvY2Vzc19uYW1lKHByb2Nlc3NfbmFtZSksIGxvZ19tZXNzYWdlKGxvZ19tZXNzYWdlKSB7fQorCisgICAgOjpzdGQ6OnN0cmluZyBwcm9jZXNzX25hbWU7CisgICAgOjpzdGQ6OnN0cmluZyBsb2dfbWVzc2FnZTsKKyAgfTsKKworICBzdHJ1Y3QgS2V5SGFzaCB7CisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgS2V5ICZrZXkpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdHJpbmdfaGFzaChrZXkucHJvY2Vzc19uYW1lKSBeCisgICAgICAgICAgICAgKHN0cmluZ19oYXNoKGtleS5sb2dfbWVzc2FnZSkgPDwgMSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IDo6c3RkOjpoYXNoPDo6c3RkOjpzdHJpbmc+IHN0cmluZ19oYXNoID0gOjpzdGQ6Omhhc2g8OjpzdGQ6OnN0cmluZz4oKTsKKyAgfTsKKyAgc3RydWN0IEtleUVxdWFsIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgS2V5ICZhLCBjb25zdCBLZXkgJmIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBhLnByb2Nlc3NfbmFtZSA9PSBiLnByb2Nlc3NfbmFtZSAmJiBhLmxvZ19tZXNzYWdlID09IGIubG9nX21lc3NhZ2U7CisgICAgfQorICB9OworCisgIDo6c3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IEtleSwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RydWN0SGFuZGxlckludGVyZmFjZT4sCisgICAgICAgICAgICAgICAgICAgICAgIEtleUhhc2gsIEtleUVxdWFsPiBoYW5kbGVyc187CisgIDo6c3RkOjp1bmlxdWVfcHRyPExvZ0ZpbGVSZWFkZXI+IHJlYWRlcl87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExvZ1JlcGxheWVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBsaW51eF9jb2RlCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcworCisjZW5kaWYgIC8vIEFPU19MSU5VWF9DT0RFX0xPR0dJTkdfTE9HX1JFUExBWV9IXwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9sb2dfc3RyZWFtZXIuY2MgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ19zdHJlYW1lci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmU3YzA0Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvbG9nZ2luZy9sb2dfc3RyZWFtZXIuY2MKQEAgLTAsMCArMSw1MSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2xvZ2dpbmcvbGludXhfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pcGNfbGliL3F1ZXVlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBsb2dnaW5nIHsKK25hbWVzcGFjZSBsaW51eF9jb2RlIHsKK25hbWVzcGFjZSB7CisKK2ludCBMb2dTdHJlYW1lck1haW4oKSB7CisgIEluaXROUlQoKTsKKworICBjb25zdCB0aW1lOjpUaW1lIG5vdyA9IHRpbWU6OlRpbWU6Ok5vdygpOworICBwcmludGYoInN0YXJ0aW5nIGF0ICUiIFBSSWQzMiAicyUiIFBSSWQzMiAibnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwKKyAgICAgICAgIG5vdy5zZWMoKSwgbm93Lm5zZWMoKSk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb25zdCBMb2dNZXNzYWdlICpjb25zdCBtc2cgPSBSZWFkTmV4dCgpOworICAgIGlmIChtc2cgPT0gTlVMTCkgY29udGludWU7CisKKyAgICBpbnRlcm5hbDo6UHJpbnRNZXNzYWdlKHN0ZG91dCwgKm1zZyk7CisKKyAgICBsb2dnaW5nOjpsaW51eF9jb2RlOjpGcmVlKG1zZyk7CisgIH0KKworICBDbGVhbnVwKCk7CisgIHJldHVybiAwOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBsaW51eF9jb2RlCit9ICAvLyBuYW1lc3BhY2UgbG9nZ2luZworfSAgLy8gbmFtZXNwYWNlIGFvcworCitpbnQgbWFpbigpIHsKKyAgcmV0dXJuIDo6YW9zOjpsb2dnaW5nOjpsaW51eF9jb2RlOjpMb2dTdHJlYW1lck1haW4oKTsKK30KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL2xvZ2dpbmcvbG9nZ2luZy5neXAgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ2dpbmcuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTllMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9sb2dnaW5nL2xvZ2dpbmcuZ3lwCkBAIC0wLDAgKzEsNzMgQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgIyBsaW51eF8qIGlzIGRlYWx0IHdpdGggYnkgYW9zL2J1aWxkL2Fvcy5neXA6bG9nZ2luZy4KKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbG9nX3JlcGxheScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2xvZ19yZXBsYXkuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdiaW5hcnlfbG9nX2ZpbGUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlcycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2lwY19saWIvaXBjX2xpYi5neXA6cXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdiaW5hcnlfbG9nX3dyaXRlcicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnYmluYXJ5X2xvZ193cml0ZXIuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6Y29uZmlndXJhdGlvbicsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6ZGllJywKKyAgICAgICAgJ2JpbmFyeV9sb2dfZmlsZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVfdHlwZXMnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsb2dfc3RyZWFtZXInLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2xvZ19zdHJlYW1lci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9pcGNfbGliL2lwY19saWIuZ3lwOnF1ZXVlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbG9nX2Rpc3BsYXllcicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnbG9nX2Rpc3BsYXllci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICdiaW5hcnlfbG9nX2ZpbGUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlX3R5cGVzJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmNvbmZpZ3VyYXRpb24nLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdiaW5hcnlfbG9nX2ZpbGUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdiaW5hcnlfbG9nX2ZpbGUuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L0hUVFBTZXJ2ZXIuY3BwIGIvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L0hUVFBTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODU3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9vdXRwdXQvSFRUUFNlcnZlci5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9vdXRwdXQvSFRUUFNlcnZlci5oIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImV2ZW50Mi9ldmVudC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9zY29wZWRfZmQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3VuaXF1ZV9tYWxsb2NfcHRyLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGh0dHAgeworCitIVFRQU2VydmVyOjpIVFRQU2VydmVyKGNvbnN0IGNoYXIgKmRpcmVjdG9yeSwgdWludDE2X3QgcG9ydCkgOgorICAgIGRpcmVjdG9yeV8oZGlyZWN0b3J5KSwgYmFzZV8oZXZlbnRfYmFzZV9uZXcoKSksIGh0dHBfKGV2aHR0cF9uZXcoYmFzZV8pKSB7CisgIGlmIChiYXNlXyA9PSBOVUxMKSB7CisgICAgTE9HKEZBVEFMLCAiY291bGRuJ3QgY3JlYXRlIGFuIGV2ZW50X2Jhc2VcbiIpOworICB9CisgIGlmIChodHRwXyA9PSBOVUxMKSB7CisgICAgTE9HKEZBVEFMLCAiY291bGRuJ3QgY3JlYXRlIGFuIGV2aHR0cFxuIik7CisgIH0KKyAgaWYgKGV2aHR0cF9iaW5kX3NvY2tldChodHRwXywgIjAuMC4wLjAiLCBwb3J0KSAhPSAwKSB7CisgICAgTE9HKEZBVEFMLCAiZXZodHRwX2JpbmRfc29ja2V0KCVwLCBcIjAuMC4wLjBcIiwgJSIgUFJJdTE2ICIpIGZhaWxlZFxuIiwKKyAgICAgICAgaHR0cF8sIHBvcnQpOworICB9CisgIGV2aHR0cF9zZXRfZ2VuY2IoaHR0cF8sIFN0YXRpY1NlcnZlRmlsZSwgdGhpcyk7Cit9CisKK3ZvaWQgSFRUUFNlcnZlcjo6QWRkUGFnZShjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqaGFuZGxlcikoZXZodHRwX3JlcXVlc3QgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSkgeworICBzd2l0Y2ggKGV2aHR0cF9zZXRfY2IoaHR0cF8sIHBhdGguY19zdHIoKSwgaGFuZGxlciwgZGF0YSkpIHsKKyAgICBjYXNlIDA6CisgICAgICBMT0coREVCVUcsICJzZXQgY2FsbGJhY2sgaGFuZGxlciBmb3IgJyVzJ1xuIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgLTE6CisgICAgICBMT0coSU5GTywgImNoYW5nZWQgY2FsbGJhY2sgaGFuZGxlciBmb3IgJyVzJ1xuIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBMT0coV0FSTklORywgImV2aHR0cF9zZXRfY2IoJXAsICVzLCAlcCwgJXApIGZhaWxlZFxuIiwgaHR0cF8sIHBhdGguY19zdHIoKSwKKyAgICAgICAgICBoYW5kbGVyLCBkYXRhKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgSFRUUFNlcnZlcjo6QWRkU3RhbmRhcmRIZWFkZXJzKGV2aHR0cF9yZXF1ZXN0ICpyZXF1ZXN0KSB7CisgIGlmIChldmh0dHBfYWRkX2hlYWRlcihldmh0dHBfcmVxdWVzdF9nZXRfb3V0cHV0X2hlYWRlcnMocmVxdWVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIiwgImFvczo6SFRUUFNlcnZlci8wLjAiKSA9PSAtMSkgeworICAgIExPRyhXQVJOSU5HLCAiYWRkaW5nIFNlcnZlciBoZWFkZXIgZmFpbGVkXG4iKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworLy8gQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gZmFsc2UsIE5VTEwsIG9yIC0xIGlmIHRoZXkgZmFpbCAoYW5kIHNlbmQgYmFjaworLy8gYW4gZXJyb3IpLgorCisvLyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLgorY29uc3QgY2hhciAqR2V0UGF0aChldmh0dHBfcmVxdWVzdCAqcmVxdWVzdCkgeworICAvLyBEb2NzIGFyZSB1bmNsZWFyIHdoZXRoZXIgdGhpcyBuZWVkcyBmcmVlaW5nLCBidXQgaXQgbG9va3MgbGlrZSBpdCBqdXN0CisgIC8vIHJldHVybnMgYW4gaW50ZXJuYWwgZmllbGQgb2YgdGhlIHJlcXVlc3QuCisgIC8vIFJ1bm5pbmcgdmFsZ3JpbmQgd2l0aCBubyBmcmVlaW5nIG9mIHVyaSBvciBwYXRoIGRvZXNuJ3QgcmVwb3J0IGFueXRoaW5nCisgIC8vIHJlbGF0ZWQgdG8gdGhpcyBjb2RlLgorICBjb25zdCBldmh0dHBfdXJpICp1cmkgPSBldmh0dHBfcmVxdWVzdF9nZXRfZXZodHRwX3VyaShyZXF1ZXN0KTsKKyAgY29uc3QgY2hhciAqcGF0aCA9IGV2aHR0cF91cmlfZ2V0X3BhdGgodXJpKTsKKyAgaWYgKHBhdGggPT0gTlVMTCkgeworICAgIGV2aHR0cF9zZW5kX2Vycm9yKHJlcXVlc3QsIEhUVFBfQkFEUkVRVUVTVCwgIm5lZWQgYSBwYXRoIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHN0cnN0cihwYXRoLCAiLi4iKSAhPSBOVUxMKSB7CisgICAgZXZodHRwX3NlbmRfZXJyb3IocmVxdWVzdCwgSFRUUF9OT1RGT1VORCwgIm5vIC4uIGFsbG93ZWQhISIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwYXRoOworfQorLy8gUmV0dXJucyBhbiBmZCBvcGVuIGZvciByZWFkaW5nIGZvciB0aGUgZmlsZSBhdCAiZGlyZWN0b3J5L3BhdGgiLgoraW50IE9wZW5GaWxlKGV2aHR0cF9yZXF1ZXN0ICpyZXF1ZXN0LCBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRpcmVjdG9yeSkgeworICBjaGFyICp0ZW1wOworICBpZiAoYXNwcmludGYoJnRlbXAsICIlcy8lcyIsIGRpcmVjdG9yeSwgcGF0aCkgPT0gLTEpIHsKKyAgICBQTE9HKFdBUk5JTkcsICJhc3ByaW50ZiglcCwgXCIlJXMvJSVzXCIsICVwLCAlcCkgZmFpbGVkIiwKKyAgICAgICAgICZ0ZW1wLCBkaXJlY3RvcnksIHBhdGgpOworICAgIGV2aHR0cF9zZW5kX2Vycm9yKHJlcXVlc3QsIEhUVFBfSU5URVJOQUwsIE5VTEwpOworICAgIHJldHVybiAtMTsKKyAgfQorICBjb25zdCB1bmlxdWVfY19wdHI8Y2hhcj4gZmlsZW5hbWUodGVtcCk7CisgIFNjb3BlZEZEIGZpbGUob3BlbihmaWxlbmFtZS5nZXQoKSwgT19SRE9OTFkpKTsKKyAgaWYgKCFmaWxlKSB7CisgICAgaWYgKGVycm5vID09IEVOT0VOVCkgeworICAgICAgZXZodHRwX3NlbmRfZXJyb3IocmVxdWVzdCwgSFRUUF9OT1RGT1VORCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFBMT0coRVJST1IsICJvcGVuKCclcycsIDApIGZhaWxlZCIsIGZpbGVuYW1lLmdldCgpLAorICAgIGV2aHR0cF9zZW5kX2Vycm9yKHJlcXVlc3QsIEhUVFBfSU5URVJOQUwsIE5VTEwpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gZmlsZS5yZWxlYXNlKCk7Cit9CisvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gZmQuCitvZmZfdCBHZXRTaXplKGludCBmaWxlKSB7CisgIHN0cnVjdCBzdGF0IGluZm87CisgIGlmIChmc3RhdChmaWxlLCAmaW5mbykgPT0gLTEpIHsKKyAgICBQTE9HKEVSUk9SLCAic3RhdCglZCwgJXApIGZhaWxlZCIsIGZpbGUsICZpbmZvKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGluZm8uc3Rfc2l6ZTsKK30KK2Jvb2wgU2VuZEZpbGVSZXNwb25zZShldmh0dHBfcmVxdWVzdCAqcmVxdWVzdCwgaW50IGZpbGVfbnVtKSB7CisgIFNjb3BlZEZEIGZpbGUoZmlsZV9udW0pOworICBjb25zdCBvZmZfdCBzaXplID0gR2V0U2l6ZShmaWxlLmdldCgpKTsKKyAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICBldmh0dHBfc2VuZF9lcnJvcihyZXF1ZXN0LCBIVFRQX0lOVEVSTkFMLCBOVUxMKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZXZidWZmZXIgKmNvbnN0IGJ1ZiA9IGV2aHR0cF9yZXF1ZXN0X2dldF9vdXRwdXRfYnVmZmVyKHJlcXVlc3QpOworICBpZiAoZXZidWZmZXJfYWRkX2ZpbGUoYnVmLCBmaWxlLmdldCgpLCAwLCBzaXplKSA9PSAtMSkgeworICAgIExPRyhXQVJOSU5HLCAiZXZidWZmZXJfYWRkX2ZpbGUoJXAsICVkLCAwLCAlamQpIGZhaWxlZFxuIiwgYnVmLAorICAgICAgICBmaWxlLmdldCgpLCBzdGF0aWNfY2FzdDxpbnRtYXhfdD4oc2l6ZSkpOworICAgIGV2aHR0cF9zZW5kX2Vycm9yKHJlcXVlc3QsIEhUVFBfSU5URVJOQUwsIE5VTEwpOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBpdCBzdWNjZWVkZWQsIHNvIGV2aHR0cCB0YWtlcyBvd25lcnNoaXAKKyAgICBmaWxlLnJlbGVhc2UoKTsKKyAgfQorICBldmh0dHBfc2VuZF9yZXBseShyZXF1ZXN0LCBIVFRQX09LLCBOVUxMLCBOVUxMKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQordm9pZCBIVFRQU2VydmVyOjpTZXJ2ZUZpbGUoZXZodHRwX3JlcXVlc3QgKnJlcXVlc3QpIHsKKyAgQWRkU3RhbmRhcmRIZWFkZXJzKHJlcXVlc3QpOworCisgIGNvbnN0IGNoYXIgKnBhdGggPSBHZXRQYXRoKHJlcXVlc3QpOworICBpZiAocGF0aCA9PSBOVUxMKSByZXR1cm47CisKKyAgU2NvcGVkRkQgZmlsZShPcGVuRmlsZShyZXF1ZXN0LCBwYXRoLCBkaXJlY3RvcnlfKSk7CisgIGlmICghZmlsZSkgcmV0dXJuOworCisgIGlmICghU2VuZEZpbGVSZXNwb25zZShyZXF1ZXN0LCBmaWxlLnJlbGVhc2UoKSkpIHJldHVybjsKK30KKwordm9pZCBIVFRQU2VydmVyOjpSdW4oKSB7CisgIGV2ZW50X2Jhc2VfZGlzcGF0Y2goYmFzZV8pOworICBMT0coRkFUQUwsICJldmVudF9iYXNlX2Rpc3BhdGNoIHJldHVybmVkXG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGh0dHAKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL291dHB1dC9IVFRQU2VydmVyLmggYi9hb3MvbGludXhfY29kZS9vdXRwdXQvSFRUUFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZWIyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9vdXRwdXQvSFRUUFNlcnZlci5oCkBAIC0wLDAgKzEsNTggQEAKKyNpbmNsdWRlICJldmVudDIvYnVmZmVyLmgiCisjaW5jbHVkZSAiZXZlbnQyL2h0dHAuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgaHR0cCB7CisKKy8vIEFuIEhUVFAgc2VydmVyIHRoYXQgc2VydmVzIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkgdXNpbmcgbGliZXZlbnQuCisvLyBBbHNvIGFsbG93cyBjb25maWd1cmluZyBjZXJ0YWluIFVSTHMgdG8gYmUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkLgorY2xhc3MgSFRUUFNlcnZlciB7CisgcHVibGljOgorICBIVFRQU2VydmVyKGNvbnN0IGNoYXIgKmRpcmVjdG9yeSwgdWludDE2X3QgcG9ydCk7CisgIC8vIFN0YXJ0cyBzZXJ2aW5nIHBhZ2VzLgorICAvLyBNaWdodCBub3QgY2xlYW4gdXAgZXZlcnl0aGluZyBiZWZvcmUgcmV0dXJuaW5nLgorICB2b2lkIFJ1bigpOworIHByb3RlY3RlZDoKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgTWVtYmVySGFuZGxlciB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkIChUOjoqSGFuZGxlcikoZXZodHRwX3JlcXVlc3QgKik7CisgICAgc3RydWN0IEhvbGRlciB7CisgICAgICBUICpzZWxmOworICAgICAgSGFuZGxlciBoYW5kbGVyOworICAgIH07CisgICAgc3RhdGljIHZvaWQgQ2FsbChldmh0dHBfcmVxdWVzdCAqcmVxdWVzdCwgdm9pZCAqaGFuZGxlcl9pbikgeworICAgICAgY29uc3QgSG9sZGVyICpjb25zdCBob2xkZXIgPSBzdGF0aWNfY2FzdDxIb2xkZXIgKj4oaGFuZGxlcl9pbik7CisgICAgICBBZGRTdGFuZGFyZEhlYWRlcnMocmVxdWVzdCk7CisgICAgICAoKGhvbGRlci0+c2VsZiktPiooaG9sZGVyLT5oYW5kbGVyKSkocmVxdWVzdCk7CisgICAgfQorICB9OworICB2b2lkIEFkZFBhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIHZvaWQgKCpoYW5kbGVyKShldmh0dHBfcmVxdWVzdCAqLCB2b2lkICopLAorICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgQWRkUGFnZShjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIE1lbWJlckhhbmRsZXI8VD46OkhhbmRsZXIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnNlbGYpIHsKKyAgICAvLyBoYXZlIHRvIHB1dCAidHlwZW5hbWUiIGluLCBzbyB0aGUgdHlwZWRlZiBtYWtlcyBpdCBjbGVhcmVyCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNZW1iZXJIYW5kbGVyPFQ+OjpIb2xkZXIgSG9sZGVyVHlwZTsKKyAgICBBZGRQYWdlKHBhdGgsIE1lbWJlckhhbmRsZXI8VD46OkNhbGwsIG5ldyBIb2xkZXJUeXBle3NlbGYsIGhhbmRsZXJ9KTsKKyAgfQorICAvLyBUaGlzIGdldHMgc2V0IHVwIGFzIHRoZSBnZW5lcmljIGhhbmRsZXIuCisgIC8vIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBzZXBhcmF0ZWx5IHRvIHNlcnZlIHRoZSBmaWxlIHRoYXQgdGhlIHJlcXVlc3QgaXMKKyAgLy8gcmVxdWVzdGluZyBmcm9tIHRoZSBmaWxlc3lzdGVtLgorICB2b2lkIFNlcnZlRmlsZShldmh0dHBfcmVxdWVzdCAqcmVxdWVzdCk7CisgcHJpdmF0ZToKKyAgLy8gVGhlIGRpcmVjdG9yeSB3aGVyZSBmaWxlcyB0byBiZSBzZXJ2ZWQgY29tZSBmcm9tLgorICBjb25zdCBjaGFyICpkaXJlY3RvcnlfOworICAvLyBUaGUgbWFpbiBsaWJldmVudCBzdHJ1Y3R1cmUuCisgIGV2ZW50X2Jhc2UgKmNvbnN0IGJhc2VfOworICAvLyBUaGUgbGliZXZlbnQgSFRUUCBzZXJ2ZXIgaGFuZGxlLgorICBldmh0dHAgKmNvbnN0IGh0dHBfOworICBzdGF0aWMgdm9pZCBBZGRTdGFuZGFyZEhlYWRlcnMoZXZodHRwX3JlcXVlc3QgKnJlcXVlc3QpOworICBzdGF0aWMgdm9pZCBTdGF0aWNTZXJ2ZUZpbGUoZXZodHRwX3JlcXVlc3QgKnJlcXVlc3QsIHZvaWQgKnNlbGYpIHsKKyAgICBzdGF0aWNfY2FzdDxIVFRQU2VydmVyICo+KHNlbGYpLT5TZXJ2ZUZpbGUocmVxdWVzdCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBodHRwCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9vdXRwdXQvY3RlbXBsYXRlX2NhY2hlLmNjIGIvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L2N0ZW1wbGF0ZV9jYWNoZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjk2MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L2N0ZW1wbGF0ZV9jYWNoZS5jYwpAQCAtMCwwICsxLDI0IEBACisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvb3V0cHV0L2N0ZW1wbGF0ZV9jYWNoZS5oIgorCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vb25jZS5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSBodHRwIHsKKworbmFtZXNwYWNlIHsKK2N0ZW1wbGF0ZTo6VGVtcGxhdGVDYWNoZSAqQ3JlYXRlVGVtcGxhdGVDYWNoZSgpIHsKKyAgY3RlbXBsYXRlOjpUZW1wbGF0ZUNhY2hlICpyID0gbmV3IGN0ZW1wbGF0ZTo6VGVtcGxhdGVDYWNoZSgpOworCisgIHItPlNldFRlbXBsYXRlUm9vdERpcmVjdG9yeShjb25maWd1cmF0aW9uOjpHZXRSb290RGlyZWN0b3J5KCkpOworCisgIHJldHVybiByOworfQorfSAgLy8gbmFtZXNwYWNlCitjdGVtcGxhdGU6OlRlbXBsYXRlQ2FjaGUgKmdldF90ZW1wbGF0ZV9jYWNoZSgpIHsKKyAgc3RhdGljIE9uY2U8Y3RlbXBsYXRlOjpUZW1wbGF0ZUNhY2hlPiBvbmNlKENyZWF0ZVRlbXBsYXRlQ2FjaGUpOworICByZXR1cm4gb25jZS5HZXQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGh0dHAKK30gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL291dHB1dC9jdGVtcGxhdGVfY2FjaGUuaCBiL2Fvcy9saW51eF9jb2RlL291dHB1dC9jdGVtcGxhdGVfY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTVkYzNkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L2N0ZW1wbGF0ZV9jYWNoZS5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpbmNsdWRlICJjdGVtcGxhdGUvdGVtcGxhdGVfY2FjaGUuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgaHR0cCB7CisKKy8vIFJldHJpZXZlcyB0aGUgY2FjaGUgdXNlZCBieSBhbGwgb2YgdGhlIGFvcyBmdW5jdGlvbnMgZXRjLgorLy8gVGhpcyBjYWNoZSB3aWxsIGhhdmUgaXRzIHJvb3QgZGlyZWN0b3J5IHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZQorLy8gZXhlY3V0YWJsZSBpcyBydW5uaW5nIGZyb20uCitjdGVtcGxhdGU6OlRlbXBsYXRlQ2FjaGUgKmdldF90ZW1wbGF0ZV9jYWNoZSgpOworCit9ICAvLyBuYW1lc3BhY2UgaHR0cAorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L2V2aHR0cF9jdGVtcGxhdGVfZW1pdHRlci5jYyBiL2Fvcy9saW51eF9jb2RlL291dHB1dC9ldmh0dHBfY3RlbXBsYXRlX2VtaXR0ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwMWZmYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL291dHB1dC9ldmh0dHBfY3RlbXBsYXRlX2VtaXR0ZXIuY2MKQEAgLTAsMCArMSwxOCBAQAorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL291dHB1dC9ldmh0dHBfY3RlbXBsYXRlX2VtaXR0ZXIuaCIKKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGh0dHAgeworCit2b2lkIEV2aHR0cEN0ZW1wbGF0ZUVtaXR0ZXI6OkVtaXQoY29uc3QgY2hhciAqcywgc2l6ZV90IHNsZW4pIHsKKyAgaWYgKGVycm9yXykgcmV0dXJuOworICBpZiAoZXZidWZmZXJfYWRkKGJ1Zl8sIHMsIHNsZW4pICE9IDApIHsKKyAgICBMT0coRVJST1IsICJldmJ1ZmZlcl9hZGQoJXAsICVwLCAlemQpIGZhaWxlZFxuIiwKKyAgICAgICAgYnVmXywgcywgc2xlbik7CisgICAgZXJyb3JfID0gdHJ1ZTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaHR0cAorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L2V2aHR0cF9jdGVtcGxhdGVfZW1pdHRlci5oIGIvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L2V2aHR0cF9jdGVtcGxhdGVfZW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOGU5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9vdXRwdXQvZXZodHRwX2N0ZW1wbGF0ZV9lbWl0dGVyLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBBT1NfTElOVVhfQ09ERV9PVVRQVVRfRVZIVFRQX0NURU1QTEFURV9FTUlUVEVSX0hfCisjZGVmaW5lIEFPU19MSU5VWF9DT0RFX09VVFBVVF9FVkhUVFBfQ1RFTVBMQVRFX0VNSVRURVJfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZXZlbnQyL2J1ZmZlci5oIgorI2luY2x1ZGUgImN0ZW1wbGF0ZS90ZW1wbGF0ZV9lbWl0dGVyLmgiCisKK25hbWVzcGFjZSBhb3MgeworbmFtZXNwYWNlIGh0dHAgeworCisvLyBXcml0ZXMgZXZlcnl0aGluZyBkaXJlY3RseSBpbnRvIGFuIGV2YnVmZmVyKi4KKy8vIEhhbmRsZXMgZXJyb3JzIGJ5IHJlZnVzaW5nIHRvIHdyaXRlIGFueXRoaW5nIGVsc2UgaW50byB0aGUgYnVmZmVyIGFuZCBzdG9yaW5nCisvLyB0aGUgc3RhdGUgKHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBlcnJvcigpKS4KK2NsYXNzIEV2aHR0cEN0ZW1wbGF0ZUVtaXR0ZXIgOiBwdWJsaWMgY3RlbXBsYXRlOjpFeHBhbmRFbWl0dGVyIHsKKyBwdWJsaWM6CisgIEV2aHR0cEN0ZW1wbGF0ZUVtaXR0ZXIoZXZidWZmZXIgKmJ1ZikgOiBidWZfKGJ1ZiksIGVycm9yXyhmYWxzZSkge30KKyAgdmlydHVhbCB2b2lkIEVtaXQoY2hhciBjKSB7IEVtaXQoJmMsIDEpOyB9OworICB2aXJ0dWFsIHZvaWQgRW1pdChjb25zdCBzdGQ6OnN0cmluZyYgcykgeyBFbWl0KHMuZGF0YSgpLCBzLnNpemUoKSk7IH07CisgIHZpcnR1YWwgdm9pZCBFbWl0KGNvbnN0IGNoYXIqIHMpIHsgRW1pdChzLCBzdHJsZW4ocykpOyB9CisgIHZpcnR1YWwgdm9pZCBFbWl0KGNvbnN0IGNoYXIqIHMsIHNpemVfdCBzbGVuKTsKKyAgLy8gUmV0cmlldmVzIHdoZXRoZXIgb3Igbm90IHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yLiBJZiB0cnVlLCB0aGUgZXJyb3Igd2lsbAorICAvLyBhbHJlYWR5IGhhdmUgYmVlbiBsb2dnZWQuCisgIGJvb2wgZXJyb3IoKSB7IHJldHVybiBlcnJvcl87IH0KKworIHByaXZhdGU6CisgIGV2YnVmZmVyICpjb25zdCBidWZfOworICBib29sIGVycm9yXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBodHRwCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gQU9TX0xJTlVYX0NPREVfT1VUUFVUX0VWSFRUUF9DVEVNUExBVEVfRU1JVFRFUl9IXwpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L291dHB1dC5neXAgYi9hb3MvbGludXhfY29kZS9vdXRwdXQvb3V0cHV0Lmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjk3NjMwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvb3V0cHV0L291dHB1dC5neXAKQEAgLTAsMCArMSwyNCBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaHR0cF9zZXJ2ZXInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdIVFRQU2VydmVyLmNwcCcsCisgICAgICAgICdldmh0dHBfY3RlbXBsYXRlX2VtaXR0ZXIuY2MnLAorICAgICAgICAnY3RlbXBsYXRlX2NhY2hlLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmxpYmV2ZW50JywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpjdGVtcGxhdGUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOm9uY2UnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnNjb3BlZF9mZCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpsaWJldmVudCcsCisgICAgICAgICc8KEVYVEVSTkFMUyk6Y3RlbXBsYXRlJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL2Fvcy9saW51eF9jb2RlL3F1ZXVlLXRtcGwuaCBiL2Fvcy9saW51eF9jb2RlL3F1ZXVlLXRtcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWViOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2xpbnV4X2NvZGUvcXVldWUtdG1wbC5oCkBAIC0wLDAgKzEsMTE2IEBACituYW1lc3BhY2UgYW9zIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIFNjb3BlZE1lc3NhZ2VQdHI8VD46OlNlbmQoKSB7CisgIGFzc2VydChtc2dfICE9IE5VTEwpOworICBtc2dfLT5TZXRUaW1lVG9Ob3coKTsKKyAgYXNzZXJ0KHF1ZXVlXyAhPSBOVUxMKTsKKyAgYm9vbCByZXR1cm5fdmFsdWUgPSBxdWV1ZV8tPldyaXRlTWVzc2FnZShtc2dfLCBSYXdRdWV1ZTo6a092ZXJyaWRlKTsKKyAgbXNnXyA9IE5VTEw7CisgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBTY29wZWRNZXNzYWdlUHRyPFQ+OjpTZW5kQmxvY2tpbmcoKSB7CisgIGFzc2VydChtc2dfICE9IE5VTEwpOworICBtc2dfLT5TZXRUaW1lVG9Ob3coKTsKKyAgYXNzZXJ0KHF1ZXVlXyAhPSBOVUxMKTsKKyAgYm9vbCByZXR1cm5fdmFsdWUgPSBxdWV1ZV8tPldyaXRlTWVzc2FnZShtc2dfLCBSYXdRdWV1ZTo6a0Jsb2NrKTsKKyAgbXNnXyA9IE5VTEw7CisgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBTY29wZWRNZXNzYWdlUHRyPFQ+OjpyZXNldChUICptc2cpIHsKKyAgaWYgKHF1ZXVlXyAhPSBOVUxMICYmIG1zZ18gIT0gTlVMTCkgeworICAgIHF1ZXVlXy0+RnJlZU1lc3NhZ2UobXNnXyk7CisgIH0KKyAgbXNnXyA9IG1zZzsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFF1ZXVlPFQ+OjpJbml0KCkgeworICBpZiAocXVldWVfID09IE5VTEwpIHsKKyAgICBxdWV1ZV8gPSBSYXdRdWV1ZTo6RmV0Y2gocXVldWVfbmFtZV8sIHNpemVvZihUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihUOjprSGFzaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ6OmtRdWV1ZUxlbmd0aCk7CisgICAgcXVldWVfbXNnXy5zZXRfcXVldWUocXVldWVfKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgUXVldWU8VD46OkNsZWFyKCkgeworICBpZiAocXVldWVfICE9IE5VTEwpIHsKKyAgICBxdWV1ZV9tc2dfLnJlc2V0KCk7CisgICAgcXVldWVfID0gTlVMTDsKKyAgICBxdWV1ZV9tc2dfLnNldF9xdWV1ZShOVUxMKTsKKyAgfQorICBpbmRleF8gPSAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgUXVldWU8VD46OkZldGNoTmV4dCgpIHsKKyAgSW5pdCgpOworICBjb25zdCBUICptc2cgPSBzdGF0aWNfY2FzdDxjb25zdCBUICo+KAorICAgICAgcXVldWVfLT5SZWFkTWVzc2FnZUluZGV4KFJhd1F1ZXVlOjprTm9uQmxvY2ssICZpbmRleF8pKTsKKyAgLy8gT25seSB1cGRhdGUgdGhlIGludGVybmFsIHBvaW50ZXIgaWYgd2UgZ290IGEgbmV3IG1lc3NhZ2UuCisgIGlmIChtc2cgIT0gTlVMTCkgeworICAgIHF1ZXVlX21zZ18ucmVzZXQobXNnKTsKKyAgfQorICByZXR1cm4gbXNnICE9IE5VTEw7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBRdWV1ZTxUPjo6RmV0Y2hOZXh0QmxvY2tpbmcoKSB7CisgIEluaXQoKTsKKyAgY29uc3QgVCAqbXNnID0gc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPigKKyAgICAgIHF1ZXVlXy0+UmVhZE1lc3NhZ2VJbmRleChSYXdRdWV1ZTo6a0Jsb2NrLCAmaW5kZXhfKSk7CisgIHF1ZXVlX21zZ18ucmVzZXQobXNnKTsKKyAgYXNzZXJ0IChtc2cgIT0gTlVMTCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBRdWV1ZTxUPjo6RmV0Y2hMYXRlc3QoKSB7CisgIEluaXQoKTsKKyAgc3RhdGljIGNvbnN0ZXhwciBPcHRpb25zPFJhd1F1ZXVlPiBrT3B0aW9ucyA9CisgICAgICBSYXdRdWV1ZTo6a0Zyb21FbmQgfCBSYXdRdWV1ZTo6a05vbkJsb2NrOworICBjb25zdCBUICptc2cgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPihxdWV1ZV8tPlJlYWRNZXNzYWdlSW5kZXgoa09wdGlvbnMsICZpbmRleF8pKTsKKyAgLy8gT25seSB1cGRhdGUgdGhlIGludGVybmFsIHBvaW50ZXIgaWYgd2UgZ290IGEgbmV3IG1lc3NhZ2UuCisgIGlmIChtc2cgIT0gTlVMTCAmJiBtc2cgIT0gcXVldWVfbXNnXy5nZXQoKSkgeworICAgIHF1ZXVlX21zZ18ucmVzZXQobXNnKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAvLyBUaGUgbWVzc2FnZSBoYXMgdG8gZ2V0IGZyZWVkIGlmIHdlIGRpZG4ndCB1c2UgaXQgKGFuZCBSYXdRdWV1ZTo6RnJlZU1lc3NhZ2UKKyAgLy8gaXMgb2sgdG8gY2FsbCBvbiBOVUxMKS4KKyAgcXVldWVfLT5GcmVlTWVzc2FnZShtc2cpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBRdWV1ZTxUPjo6RmV0Y2hBbm90aGVyKCkgeworICBpZiAoIUZldGNoTGF0ZXN0KCkpIEZldGNoTmV4dEJsb2NraW5nKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorU2NvcGVkTWVzc2FnZVB0cjxUPiBRdWV1ZTxUPjo6TWFrZU1lc3NhZ2UoKSB7CisgIEluaXQoKTsKKyAgcmV0dXJuIFNjb3BlZE1lc3NhZ2VQdHI8VD4ocXVldWVfLCBNYWtlUmF3TWVzc2FnZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitUICpRdWV1ZTxUPjo6TWFrZVJhd01lc3NhZ2UoKSB7CisgIFQgKnJldCA9IHN0YXRpY19jYXN0PFQgKj4ocXVldWVfLT5HZXRNZXNzYWdlKCkpOworICBhc3NlcnQocmV0ICE9IE5VTEwpOworICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Fvczo6TWVzc2FnZUJ1aWxkZXI8VD4gUXVldWU8VD46Ok1ha2VXaXRoQnVpbGRlcigpIHsKKyAgSW5pdCgpOworICBUICpjb25zdCByZXQgPSBNYWtlUmF3TWVzc2FnZSgpOworICByZXQtPlplcm8oKTsKKyAgcmV0dXJuIGFvczo6TWVzc2FnZUJ1aWxkZXI8VD4ocXVldWVfLCByZXQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9zdGFydGVyL3N0YXJ0ZXIuY2MgYi9hb3MvbGludXhfY29kZS9zdGFydGVyL3N0YXJ0ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2YmJkYgotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL3N0YXJ0ZXIvc3RhcnRlci5jYwpAQCAtMCwwICsxLDgxOSBAQAorLy8gVGhpcyBoYXMgdG8gY29tZSBiZWZvcmUgYW55Ym9keSBkcmFncyBpbiA8c3RkbGliLmg+IG9yIGVsc2Ugd2UgZW5kIHVwIHdpdGgKKy8vIHRoZSB3cm9uZyB2ZXJzaW9uIG9mIFdJRkVYSVRFRCBldGMgKGZvciBvbmUgdGhpbmcsIHRoZXkgZG9uJ3QgY29uc3QtcXVhbGlmeQorLy8gdGhlaXIgY2FzdHMpIChzb21ldGltZXMgYXQgbGVhc3QpLgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lub3RpZnkuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxldmVudDIvZXZlbnQuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmdfaW1wbC5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3VuaXF1ZV9tYWxsb2NfcHRyLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9vbmNlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9saWJjL2Fvc19zdHJzaWduYWwuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvcnVuX2NvbW1hbmQuaCIKKworLy8gVGhpcyBpcyB0aGUgbWFpbiBwaWVjZSBvZiBjb2RlIHRoYXQgc3RhcnRzIGFsbCBvZiB0aGUgcmVzdCBvZiB0aGUgY29kZSBhbmQKKy8vIHJlc3RhcnRzIGl0IHdoZW4gdGhlIGJpbmFyaWVzIGFyZSBtb2RpZmllZC4KKy8vCisvLyBUaHJvdWdob3V0LCB0aGUgY29kZSBpcyBub3QgdGVycmlibHkgY29uY2VybmVkIHdpdGggdGhyZWFkIHNhZmV0eSBiZWNhdXNlCisvLyB0aGVyZSBpcyBvbmx5IDEgdGhyZWFkLiBJdCBkb2VzIHNvbWUgc2V0dXAgYW5kIHRoZW4gbGV0cyBpbm90aWZ5IHJ1biB0aGluZ3MKKy8vIHdoZW4gYXBwcm9wcmlhdGUuCisvLworLy8gTk9URTogVGhpcyBwcm9ncmFtIHNob3VsZCBuZXZlciBleGl0IG5pY2VseS4gSXQgY2F0Y2hlcyBhbGwgbmljZSBhdHRlbXB0cyB0bworLy8gZXhpdCwgZm9yd2FyZHMgdGhlbSB0byBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgaXQgaGFzIHN0YXJ0ZWQsIHdhaXRzIGZvcgorLy8gdGhlbSB0byBleGl0IG5pY2VseSwgYW5kIHRoZW4gU0lHS0lMTHMgYW55Ym9keSBsZWZ0ICh3aGljaCB3aWxsIGFsd2F5cworLy8gaW5jbHVkZSBpdHNlbGYpLgorCit1c2luZyA6OnN0ZDo6dW5pcXVlX3B0cjsKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2Ugc3RhcnRlciB7CisKKy8vIFRPRE8oYnJpYW5zKTogc3BsaXQgb3V0IHRoZSBjKysgbGliZXZlbnQgd3JhcHBlciBzdHVmZiBpbnRvIGl0cyBvd24gZmlsZShzKQorY2xhc3MgRXZlbnRCYXNlRGVsZXRlciB7CisgcHVibGljOgorICB2b2lkIG9wZXJhdG9yKCkoZXZlbnRfYmFzZSAqYmFzZSkgeworICAgIGlmIChiYXNlID09IE5VTEwpIHJldHVybjsKKyAgICBldmVudF9iYXNlX2ZyZWUoYmFzZSk7CisgIH0KK307Cit0eXBlZGVmIHVuaXF1ZV9wdHI8ZXZlbnRfYmFzZSwgRXZlbnRCYXNlRGVsZXRlcj4gRXZlbnRCYXNlVW5pcXVlUHRyOworRXZlbnRCYXNlVW5pcXVlUHRyIGxpYmV2ZW50X2Jhc2U7CisKK2NsYXNzIEV2ZW50RGVsZXRlciB7CisgcHVibGljOgorICB2b2lkIG9wZXJhdG9yKCkoZXZlbnQgKmV2dCkgeworICAgIGlmIChldnQgPT0gTlVMTCkgcmV0dXJuOworICAgIGlmIChldmVudF9kZWwoZXZ0KSAhPSAwKSB7CisgICAgICBMT0coV0FSTklORywgImV2ZW50X2RlbCglcCkgZmFpbGVkXG4iLCBldnQpOworICAgIH0KKyAgfQorfTsKK3R5cGVkZWYgdW5pcXVlX3B0cjxldmVudCwgRXZlbnREZWxldGVyPiBFdmVudFVuaXF1ZVB0cjsKKworLy8gV2F0Y2hlcyBhIGZpbGUgcGF0aCBmb3IgbW9kaWZpY2F0aW9ucy4gT25jZSBjcmVhdGVkLCBrZWVwcyB3YXRjaGluZyB1bnRpbAorLy8gZGVzdHJveWVkIG9yIFJlbW92ZVdhdGNoKCkgaXMgY2FsbGVkLgorLy8gVE9ETyhicmlhbnMpOiBzcGxpdCB0aGlzIG91dCBpbnRvIGl0cyBvd24gZmlsZSArIHRlc3RzCitjbGFzcyBGaWxlV2F0Y2ggeworIHB1YmxpYzoKKyAgLy8gV2lsbCBjYWxsIGNhbGxiYWNrKHZhbHVlKSB3aGVuIGZpbGVuYW1lIGlzIG1vZGlmaWVkLgorICAvLyBJZiB2YWx1ZSBpcyBOVUxMLCB0aGVuIGEgcG9pbnRlciB0byB0aGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCBpbnN0ZWFkLgorICAvLworICAvLyBXYXRjaGluZyBmb3IgZmlsZSBjcmVhdGlvbnMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50LiBUbyBkbyB0aGF0LCBwYXNzIHRydWUKKyAgLy8gYXMgY3JlYXRlLCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBmaWxlIHdpbGwgYmUgY3JlYXRlZCBmb3IgZmlsZW5hbWUsIGFuZAorICAvLyB0aGUgbmFtZSBvZiB0aGUgZmlsZSAod2l0aG91dCBkaXJlY3RvcnkgbmFtZSkgZm9yIGNoZWNrX2ZpbGVuYW1lLgorICBGaWxlV2F0Y2goc3RkOjpzdHJpbmcgZmlsZW5hbWUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCAqKT4gY2FsbGJhY2ssCisgICAgICAgICAgICB2b2lkICp2YWx1ZSwKKyAgICAgICAgICAgIGJvb2wgY3JlYXRlID0gZmFsc2UsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjaGVja19maWxlbmFtZSA9ICIiKQorICAgICAgOiBmaWxlbmFtZV8oZmlsZW5hbWUpLAorICAgICAgICBjYWxsYmFja18oY2FsbGJhY2spLAorICAgICAgICB2YWx1ZV8odmFsdWUpLAorICAgICAgICBjcmVhdGVfKGNyZWF0ZSksCisgICAgICAgIGNoZWNrX2ZpbGVuYW1lXyhjaGVja19maWxlbmFtZSksCisgICAgICAgIHdhdGNoXygtMSkgeworICAgIGluaXRfb25jZS5HZXQoKTsKKworICAgIENyZWF0ZVdhdGNoKCk7CisgIH0KKyAgLy8gQ2xlYW5zIHVwIGV2ZXJ5dGhpbmcuCisgIH5GaWxlV2F0Y2goKSB7CisgICAgaWYgKHdhdGNoXyAhPSAtMSkgeworICAgICAgUmVtb3ZlV2F0Y2goKTsKKyAgICB9CisgIH0KKworICAvLyBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGlzIG9iamVjdCB3b24ndCByZWFsbHkgYmUgZG9pbmcgbXVjaCBvZgorICAvLyBhbnl0aGluZyBiZXNpZGVzIHBvc3NpYmx5IHJ1bm5pbmcgaXRzIGNhbGxiYWNrIG9yIHNvbWV0aGluZy4KKyAgdm9pZCBSZW1vdmVXYXRjaCgpIHsKKyAgICBDSEVDS19ORSh3YXRjaF8sIC0xKTsKKyAgICBDSEVDS19FUSh3YXRjaF90b19yZW1vdmVfLCAtMSk7CisKKyAgICBpZiAoaW5vdGlmeV9ybV93YXRjaChub3RpZnlfZmQsIHdhdGNoXykgPT0gLTEpIHsKKyAgICAgIFBMT0coV0FSTklORywgImlub3RpZnlfcm1fd2F0Y2goJWQsICVkKSBmYWlsZWQiLCBub3RpZnlfZmQsIHdhdGNoXyk7CisgICAgfQorICAgIHdhdGNoX3RvX3JlbW92ZV8gPSB3YXRjaF87CisgICAgd2F0Y2hfID0gLTE7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFBlcmZvcm1zIHRoZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uIENhbGxlZCBieSBpbml0X29uY2UgZnJvbSB0aGUKKyAgLy8gY29uc3RydWN0b3IuCisgIHN0YXRpYyB2b2lkICpJbml0KCkgeworICAgIG5vdGlmeV9mZCA9IGlub3RpZnlfaW5pdDEoSU5fQ0xPRVhFQyk7CisgICAgRXZlbnRVbmlxdWVQdHIgbm90aWZ5X2V2ZW50KGV2ZW50X25ldyhsaWJldmVudF9iYXNlLmdldCgpLCBub3RpZnlfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVXYXRjaDo6SU5vdGlmeVJlYWRhYmxlLCBOVUxMKSk7CisgICAgZXZlbnRfYWRkKG5vdGlmeV9ldmVudC5yZWxlYXNlKCksIE5VTEwpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdm9pZCBSZW1vdmVXYXRjaEZyb21NYXAoKSB7CisgICAgaW50IHdhdGNoID0gd2F0Y2hfdG9fcmVtb3ZlXzsKKyAgICBpZiAod2F0Y2ggPT0gLTEpIHsKKyAgICAgIENIRUNLX05FKHdhdGNoXywgLTEpOworICAgICAgd2F0Y2ggPSB3YXRjaF87CisgICAgfQorICAgIGlmICh3YXRjaGVyc1t3YXRjaF0gIT0gdGhpcykgeworICAgICAgTE9HKFdBUk5JTkcsICJ3YXRjaGVyIGZvciAlcyAoJXApIGRpZG4ndCBmaW5kIGl0c2VsZiBpbiB0aGUgbWFwXG4iLAorICAgICAgICAgIGZpbGVuYW1lXy5jX3N0cigpLCB0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgd2F0Y2hlcnMuZXJhc2Uod2F0Y2gpOworICAgIH0KKyAgICBMT0coREVCVUcsICJyZW1vdmVkIHdhdGNoIElEICVkXG4iLCB3YXRjaCk7CisgICAgaWYgKHdhdGNoX3RvX3JlbW92ZV8gPT0gLTEpIHsKKyAgICAgIHdhdGNoXyA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICB3YXRjaF90b19yZW1vdmVfID0gLTE7CisgICAgfQorICB9CisKKyAgdm9pZCBDcmVhdGVXYXRjaCgpIHsKKyAgICBDSEVDS19FUSh3YXRjaF8sIC0xKTsKKyAgICB3YXRjaF8gPSBpbm90aWZ5X2FkZF93YXRjaChub3RpZnlfZmQsIGZpbGVuYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV8gPyBJTl9DUkVBVEUgOiAoSU5fQVRUUklCIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5fTU9ESUZZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5fREVMRVRFX1NFTEYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTl9NT1ZFX1NFTEYpKTsKKyAgICBpZiAod2F0Y2hfID09IC0xKSB7CisgICAgICBQTE9HKEZBVEFMLCAiaW5vdGlmeV9hZGRfd2F0Y2goJWQsICVzLCIKKyAgICAgICAgICAgICAgICAgICIgJXMgPyBJTl9DUkVBVEUgOiAoSU5fQVRUUklCIHwgSU5fTU9ESUZZKSkgZmFpbGVkIiwKKyAgICAgICAgICAgbm90aWZ5X2ZkLCBmaWxlbmFtZV8uY19zdHIoKSwgY3JlYXRlXyA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIH0KKyAgICB3YXRjaGVyc1t3YXRjaF9dID0gdGhpczsKKyAgICBMT0coREVCVUcsICJ3YXRjaCBmb3IgJXMgaXMgJWRcbiIsIGZpbGVuYW1lXy5jX3N0cigpLCB3YXRjaF8pOworICB9CisKKyAgLy8gVGhpcyBnZXRzIHNldCB1cCBhcyB0aGUgY2FsbGJhY2sgZm9yIEVWX1JFQUQgb24gdGhlIGlub3RpZnkgZmlsZQorICAvLyBkZXNjcmlwdG9yLiBJdCBjYWxscyBGaWxlTm90aWZpZWQgb24gdGhlIGFwcHJvcHJpYXRlIGluc3RhbmNlLgorICBzdGF0aWMgdm9pZCBJTm90aWZ5UmVhZGFibGUoaW50IC8qZmQqLywgc2hvcnQgLypldmVudHMqLywgdm9pZCAqKSB7CisgICAgdW5zaWduZWQgaW50IHRvX3JlYWQ7CisgICAgLy8gVXNlIEZJT05SRUFEIHRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgdGhlcmUgYXJlIHRvIHJlYWQuCisgICAgaWYgKGlvY3RsKG5vdGlmeV9mZCwgRklPTlJFQUQsICZ0b19yZWFkKSA8IDApIHsKKyAgICAgIFBMT0coRkFUQUwsICJGSU9OUkVBRCglZCwgJXApIGZhaWxlZCIsIG5vdGlmeV9mZCwgJnRvX3JlYWQpOworICAgIH0KKyAgICBpbm90aWZ5X2V2ZW50ICpub3RpZnlldnQgPSBzdGF0aWNfY2FzdDxpbm90aWZ5X2V2ZW50ICo+KG1hbGxvYyh0b19yZWFkKSk7CisgICAgY29uc3QgY2hhciAqZW5kID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KG5vdGlmeWV2dCkgKyB0b19yZWFkOworICAgIGFvczo6dW5pcXVlX2NfcHRyPGlub3RpZnlfZXZlbnQ+IGZyZWVyKG5vdGlmeWV2dCk7CisKKyAgICBzc2l6ZV90IHJldCA9IHJlYWQobm90aWZ5X2ZkLCBub3RpZnlldnQsIHRvX3JlYWQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICBQTE9HKEZBVEFMLCAicmVhZCglZCwgJXAsICV1KSBmYWlsZWQiLCBub3RpZnlfZmQsIG5vdGlmeWV2dCwgdG9fcmVhZCk7CisgICAgfQorICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkgIT0gdG9fcmVhZCkgeworICAgICAgTE9HKEVSUk9SLCAicmVhZCglZCwgJXAsICV1KSByZXR1cm5lZCAlemQgaW5zdGVhZCBvZiAldVxuIiwKKyAgICAgICAgICBub3RpZnlfZmQsIG5vdGlmeWV2dCwgdG9fcmVhZCwgcmV0LCB0b19yZWFkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBLZWVwIGxvb3BpbmcgdGhyb3VnaCB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBiZWNhdXNlIGlub3RpZnkgZG9lcyByZXR1cm4KKyAgICAvLyBtdWx0aXBsZSBldmVudHMgYXQgb25jZS4KKyAgICB3aGlsZSAocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KG5vdGlmeWV2dCkgPCBlbmQpIHsKKyAgICAgIGlmICh3YXRjaGVycy5jb3VudChub3RpZnlldnQtPndkKSAhPSAxKSB7CisgICAgICAgIExPRyhXQVJOSU5HLCAiY291bGRuJ3QgZmluZCB3aG9zZSB3YXRjaCBJRCAlZCBpc1xuIiwgbm90aWZ5ZXZ0LT53ZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0coREVCVUcsICJtYXNrPSUiIFBSSXUzMiAiXG4iLCBub3RpZnlldnQtPm1hc2spOworICAgICAgICAvLyBJZiB0aGUgd2F0Y2ggd2FzIHJlbW92ZWQuCisgICAgICAgIGlmIChub3RpZnlldnQtPm1hc2sgJiBJTl9JR05PUkVEKSB7CisgICAgICAgICAgd2F0Y2hlcnNbbm90aWZ5ZXZ0LT53ZF0tPldhdGNoRGVsZXRlZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdhdGNoZXJzW25vdGlmeWV2dC0+d2RdCisgICAgICAgICAgICAgIC0+RmlsZU5vdGlmaWVkKChub3RpZnlldnQtPmxlbiA+IDApID8gbm90aWZ5ZXZ0LT5uYW1lIDogTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbm90aWZ5ZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxpbm90aWZ5X2V2ZW50ICo+KAorICAgICAgICAgIF9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4obm90aWZ5ZXZ0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm5vdGlmeWV2dCkgKyBub3RpZnlldnQtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25vZihpbm90aWZ5X2V2ZW50KSkpOworICAgIH0KKyAgfQorCisgIC8vIElOb3RpZnlSZWFkYWJsZSBjYWxscyB0aGlzIG1ldGhvZCB3aGVuZXZlciB0aGUgd2F0Y2ggZm9yIG91ciBmaWxlIGdldHMKKyAgLy8gcmVtb3ZlZCBzb21laG93LgorICB2b2lkIFdhdGNoRGVsZXRlZCgpIHsKKyAgICBMT0coREVCVUcsICJ3YXRjaCBmb3IgJXMgZGVsZXRlZFxuIiwgZmlsZW5hbWVfLmNfc3RyKCkpOworICAgIFJlbW92ZVdhdGNoRnJvbU1hcCgpOworICAgIENyZWF0ZVdhdGNoKCk7CisgIH0KKworICAvLyBJTm90aWZ5UmVhZGFibGUgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgdGhlIHdhdGNoIGZvciBvdXIgZmlsZSB0cmlnZ2Vycy4KKyAgdm9pZCBGaWxlTm90aWZpZWQoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBDSEVDS19ORSh3YXRjaF8sIC0xKTsKKyAgICBMT0coREVCVUcsICJnb3QgYSBub3RpZmljYXRpb24gZm9yICVzXG4iLCBmaWxlbmFtZV8uY19zdHIoKSk7CisKKyAgICBpZiAoIWNoZWNrX2ZpbGVuYW1lXy5lbXB0eSgpKSB7CisgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoc3RkOjpzdHJpbmcoZmlsZW5hbWUpICE9IGNoZWNrX2ZpbGVuYW1lXykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgY2FsbGJhY2tfKCh2YWx1ZV8gPT0gTlVMTCkgPyB0aGlzIDogdmFsdWVfKTsKKyAgfQorCisgIC8vIFRvIG1ha2Ugc3VyZSB0aGF0IEluaXQgZ2V0cyBjYWxsZWQgZXhhY3RseSBvbmNlLgorICBzdGF0aWMgOjphb3M6Ok9uY2U8dm9pZD4gaW5pdF9vbmNlOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsKKyAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQgKik+IGNhbGxiYWNrXzsKKyAgdm9pZCAqY29uc3QgdmFsdWVfOworICBjb25zdCBib29sIGNyZWF0ZV87CisgIHN0ZDo6c3RyaW5nIGNoZWNrX2ZpbGVuYW1lXzsKKworICAvLyBUaGUgd2F0Y2ggZGVzY3JpcHRvciBvciAtMSBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbnkgbW9yZS4KKyAgaW50IHdhdGNoXzsKKyAgLy8gVGhlIHdhdGNoIHRoYXQgd2Ugc3RpbGwgaGF2ZSB0byB0YWtlIG91dCBvZiB0aGUgbWFwIG9uY2Ugd2UgZ2V0IHRoZQorICAvLyBJTl9JR05PUkVEIG9yIC0xLgorICBpbnQgd2F0Y2hfdG9fcmVtb3ZlXyA9IC0xOworCisgIC8vIE1hcCBmcm9tIHdhdGNoIElEcyB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KKyAgLy8gPGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvcGF0Y2gvNzMxOTIvPiAoImlub3RpZnk6IGRvIG5vdCByZXVzZSB3YXRjaAorICAvLyBkZXNjcmlwdG9ycyIpIHNheXMgdGhleSB3b24ndCBnZXQgcmV1c2VkLCBidXQgdGhhdCBzaG91bGRuJ3QgYmUgY291bnRlZCBvbgorICAvLyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgYSBtb2RpZmllZC9kaWZmZXJlbnQgdmVyc2lvbi93aGF0ZXZlciBrZXJuZWwuCisgIHN0YXRpYyBzdGQ6Om1hcDxpbnQsIEZpbGVXYXRjaCAqPiB3YXRjaGVyczsKKyAgLy8gVGhlIGlub3RpZnkoNykgZmlsZSBkZXNjcmlwdG9yLgorICBzdGF0aWMgaW50IG5vdGlmeV9mZDsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRmlsZVdhdGNoKTsKK307Cis6OmFvczo6T25jZTx2b2lkPiBGaWxlV2F0Y2g6OmluaXRfb25jZShGaWxlV2F0Y2g6OkluaXQpOworc3RkOjptYXA8aW50LCBGaWxlV2F0Y2ggKj4gRmlsZVdhdGNoOjp3YXRjaGVyczsKK2ludCBGaWxlV2F0Y2g6Om5vdGlmeV9mZDsKKworLy8gUnVucyB0aGUgZ2l2ZW4gY29tbWFuZCBhbmQgcmV0dXJucyBpdHMgZmlyc3QgbGluZSBvZiBvdXRwdXQgKG5vdCBpbmNsdWRpbmcKKy8vIHRoZSBcbikuIExPRyhGQVRBTClzIGlmIHRoZSBjb21tYW5kIGhhcyBhbiBleGl0IHN0YXR1cyBvdGhlciB0aGFuIDAgb3IgZG9lcworLy8gbm90IHByaW50IG91dCBhbiBlbnRpcmUgbGluZS4KK3N0ZDo6c3RyaW5nIFJ1bkNvbW1hbmQoc3RkOjpzdHJpbmcgY29tbWFuZCkgeworICAvLyBwb3BlbigzKSBtaWdodCBmYWlsIGFuZCBub3Qgc2V0IGl0LgorICBlcnJubyA9IDA7CisgIEZJTEUgKnBpcGUgPSBwb3Blbihjb21tYW5kLmNfc3RyKCksICJyIik7CisgIGlmIChwaXBlID09IE5VTEwpIHsKKyAgICBQTE9HKEZBVEFMLCAicG9wZW4oXCIlc1wiLCBcInJcIikgZmFpbGVkIiwgY29tbWFuZC5jX3N0cigpKTsKKyAgfQorCisgIC8vIHJlc3VsdF9zaXplIGlzIGhvdyBtYW55IGJ5dGVzIHJlc3VsdCBpcyBjdXJyZW50bHkgYWxsb2NhdGVkIHRvLgorICBzaXplX3QgcmVzdWx0X3NpemUgPSAxMjgsIHJlYWQgPSAwOworICB1bmlxdWVfY19wdHI8Y2hhcj4gcmVzdWx0KHN0YXRpY19jYXN0PGNoYXIgKj4obWFsbG9jKHJlc3VsdF9zaXplKSkpOworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIElmIHdlIGZpbGxlZCB1cCB0aGUgYnVmZmVyLCB0aGVuIHJlYWxsb2MoMykgaXQgYmlnZ2VyLgorICAgIGlmIChyZWFkID09IHJlc3VsdF9zaXplKSB7CisgICAgICByZXN1bHRfc2l6ZSAqPSAyOworICAgICAgdm9pZCAqbmV3X3Jlc3VsdCA9IHJlYWxsb2MocmVzdWx0LmdldCgpLCByZXN1bHRfc2l6ZSk7CisgICAgICBpZiAobmV3X3Jlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFBMT0coRkFUQUwsICJyZWFsbG9jKCVwLCAlemQpIGZhaWxlZCIsIHJlc3VsdC5nZXQoKSwgcmVzdWx0X3NpemUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LnJlbGVhc2UoKTsKKyAgICAgICAgcmVzdWx0ID0gdW5pcXVlX2NfcHRyPGNoYXI+KHN0YXRpY19jYXN0PGNoYXIgKj4obmV3X3Jlc3VsdCkpOworICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCByZXQgPSBmcmVhZChyZXN1bHQuZ2V0KCkgKyByZWFkLCAxLCByZXN1bHRfc2l6ZSAtIHJlYWQsIHBpcGUpOworICAgIC8vIElmIHRoZSByZWFkIGRpZG4ndCBmaWxsIHVwIHRoZSB3aG9sZSBidWZmZXIsIGNoZWNrIHRvIHNlZSBpZiBpdCB3YXMKKyAgICAvLyBiZWNhdXNlIG9mIGFuIGVycm9yLgorICAgIGlmIChyZXQgPCByZXN1bHRfc2l6ZSAtIHJlYWQpIHsKKyAgICAgIGlmIChmZXJyb3IocGlwZSkpIHsKKyAgICAgICAgUExPRyhGQVRBTCwgImNvdWxkbid0IGZpbmlzaCByZWFkaW5nIG91dHB1dCBvZiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgY29tbWFuZC5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmVhZCArPSByZXQ7CisgICAgaWYgKHJlYWQgPiAwICYmIHJlc3VsdC5nZXQoKVtyZWFkIC0gMV0gPT0gJ1xuJykgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGZlb2YocGlwZSkpIHsKKyAgICAgIExPRyhGQVRBTCwgImAlc2AgZmFpbGVkLiBkaWRuJ3QgcHJpbnQgYSB3aG9sZSBsaW5lXG4iLCBjb21tYW5kLmNfc3RyKCkpOworICAgIH0KKyAgfQorCisgIC8vIEdldCByaWQgb2YgdGhlIGZpcnN0IFxuIGFuZCBhbnl0aGluZyBhZnRlciBpdC4KKyAgKnN0cmNocm51bChyZXN1bHQuZ2V0KCksICdcbicpID0gJ1wwJzsKKworICBpbnQgY2hpbGRfc3RhdHVzID0gcGNsb3NlKHBpcGUpOworICBpZiAoY2hpbGRfc3RhdHVzID09IC0xKSB7CisgICAgUExPRyhGQVRBTCwgInBjbG9zZSglcCkgZmFpbGVkIiwgcGlwZSk7CisgIH0KKworICBpZiAoY2hpbGRfc3RhdHVzICE9IDApIHsKKyAgICBMT0coRkFUQUwsICJgJXNgIGZhaWxlZC4gcmV0dXJuICVkXG4iLCBjb21tYW5kLmNfc3RyKCksIGNoaWxkX3N0YXR1cyk7CisgIH0KKworICByZXR1cm4gc3RkOjpzdHJpbmcocmVzdWx0LmdldCgpKTsKK30KKworLy8gV2lsbCBjYWxsIGNhbGxiYWNrKGFyZykgYWZ0ZXIgdGltZS4KK3ZvaWQgVGltZW91dCh0aW1lOjpUaW1lIHRpbWUsIHZvaWQgKCpjYWxsYmFjaykoaW50LCBzaG9ydCwgdm9pZCAqKSwgdm9pZCAqYXJnKSB7CisgIEV2ZW50VW5pcXVlUHRyIHRpbWVvdXQoZXZ0aW1lcl9uZXcobGliZXZlbnRfYmFzZS5nZXQoKSwgY2FsbGJhY2ssIGFyZykpOworICBzdHJ1Y3QgdGltZXZhbCB0aW1lX3RpbWV2YWwgPSB0aW1lLlRvVGltZXZhbCgpOworICBpZiAoZXZ0aW1lcl9hZGQodGltZW91dC5yZWxlYXNlKCksICZ0aW1lX3RpbWV2YWwpICE9IDApIHsKKyAgICBMT0coRkFUQUwsICJldnRpbWVyX2FkZCglcCwgJXApIGZhaWxlZFxuIiwKKyAgICAgICAgdGltZW91dC5yZWxlYXNlKCksICZ0aW1lX3RpbWV2YWwpOworICB9Cit9CisKK2NsYXNzIENoaWxkOworLy8gVGhpcyBpcyB3aGVyZSBhbGwgb2YgdGhlIENoaWxkIGluc3RhbmNlcyBleGNlcHQgY29yZSBsaXZlLgorc3RkOjp2ZWN0b3I8dW5pcXVlX3B0cjxDaGlsZD4+IGNoaWxkcmVuOworLy8gQSBnbG9iYWwgcGxhY2UgdG8gaG9sZCBvbiB0byB3aGljaCBjaGlsZCBpcyBjb3JlLgordW5pcXVlX3B0cjxDaGlsZD4gY29yZTsKKworLy8gUmVwcmVzZW50cyBhIGNoaWxkIHByb2Nlc3MuIEl0IHdpbGwgdGFrZSBjYXJlIG9mIHJlc3RhcnRpbmcgaXRzZWxmIGV0Yy4KK2NsYXNzIENoaWxkIHsKKyBwdWJsaWM6CisgIC8vIGNvbW1hbmQgaXMgdGhlIChzcGFjZS1zZXBhcmF0ZWQpIGNvbW1hbmQgdG8gcnVuIGFuZCBpdHMgYXJndW1lbnRzLgorICBDaGlsZChjb25zdCBzdGQ6OnN0cmluZyAmY29tbWFuZCkgOiBwaWRfKC0xKSwKKyAgICAgICAgc3RhdF9hdF9zdGFydF92YWxpZF8oZmFsc2UpIHsKKyAgICBpZiAoIXJlc3RhcnRfdGltZW91dCkgeworICAgICAgcmVzdGFydF90aW1lb3V0ID0gRXZlbnRVbmlxdWVQdHIoCisgICAgICAgICAgZXZ0aW1lcl9uZXcobGliZXZlbnRfYmFzZS5nZXQoKSwgU3RhdGljRG9SZXN0YXJ0LCBudWxscHRyKSk7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0YXJ0LCAqZW5kOworICAgIHN0YXJ0ID0gY29tbWFuZC5jX3N0cigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBlbmQgPSBzdHJjaHJudWwoc3RhcnQsICcgJyk7CisgICAgICBhcmdzXy5wdXNoX2JhY2soc3RkOjpzdHJpbmcoc3RhcnQsIGVuZCAtIHN0YXJ0KSk7CisgICAgICBzdGFydCA9IGVuZCArIDE7CisgICAgICBpZiAoKmVuZCA9PSAnXDAnKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIG9yaWdpbmFsX2JpbmFyeV8gPSBSdW5Db21tYW5kKCJ3aGljaCAiICsgYXJnc19bMF0pOworICAgIGJpbmFyeV8gPSBvcmlnaW5hbF9iaW5hcnlfICsgIi5zdG0iOworCisgICAgd2F0Y2hlcl8gPSB1bmlxdWVfcHRyPEZpbGVXYXRjaD4oCisgICAgICAgIG5ldyBGaWxlV2F0Y2gob3JpZ2luYWxfYmluYXJ5XywgU3RhdGljRmlsZU1vZGlmaWVkLCB0aGlzKSk7CisKKyAgICBTdGFydCgpOworICB9CisKKyAgcGlkX3QgcGlkKCkgeyByZXR1cm4gcGlkXzsgfQorCisgIC8vIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGFjdHVhbCBwcm9jZXNzIGRpZXMgYW5kIHNob3VsZCAocHJvYmFibHkpIGJlCisgIC8vIHJlc3RhcnRlZC4KKyAgdm9pZCBQcm9jZXNzRGllZCgpIHsKKyAgICBwaWRfID0gLTE7CisgICAgcmVzdGFydHNfLnB1c2godGltZTo6VGltZTo6Tm93KCkpOworICAgIGlmIChyZXN0YXJ0c18uc2l6ZSgpID4ga01heFJlc3RhcnRzTnVtYmVyKSB7CisgICAgICB0aW1lOjpUaW1lIG9sZGVzdCA9IHJlc3RhcnRzXy5mcm9udCgpOworICAgICAgcmVzdGFydHNfLnBvcCgpOworICAgICAgaWYgKCh0aW1lOjpUaW1lOjpOb3coKSAtIG9sZGVzdCkgPD0ga01heFJlc3RhcnRzVGltZSkgeworICAgICAgICBMT0coV0FSTklORywgInByb2Nlc3MgJXMgZ2V0dGluZyByZXN0YXJ0ZWQgdG9vIG9mdGVuXG4iLCBuYW1lKCkpOworICAgICAgICBUaW1lb3V0KGtSZXN1bWVXYWl0LCBTdGF0aWNTdGFydCwgdGhpcyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgU3RhcnQoKTsKKyAgfQorCisgIC8vIFJldHVybnMgYSBuYW1lIGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICBjb25zdCBjaGFyICpuYW1lKCkgeworICAgIHJldHVybiBhcmdzX1swXS5jX3N0cigpOworICB9CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgQ2hlY2tEaWVkU3RhdHVzIHsKKyAgICBDaGlsZCAqc2VsZjsKKyAgICBwaWRfdCBvbGRfcGlkOworICB9OworCisgIC8vIEhvdyBsb25nIHRvIHdhaXQgZm9yIGEgY2hpbGQgdG8gZGllIG5pY2VseS4KKyAgc3RhdGljIGNvbnN0ZXhwciB0aW1lOjpUaW1lIGtQcm9jZXNzRGllVGltZSA9IHRpbWU6OlRpbWU6OkluU2Vjb25kcygyKTsKKworICAvLyBIb3cgbG9uZyB0byB3YWl0IGFmdGVyIHRoZSBmaWxlIGlzIG1vZGlmaWVkIHRvIHJlc3RhcnQgaXQuCisgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBwcm9ncmFtcyBsaWtlIG1vZGlmeWluZyB0aGUgYmluYXJpZXMgYnkKKyAgLy8gd3JpdGluZyB0aGVtIGluIGxpdHRsZSBiaXRzLCB3aGljaCByZXN1bHRzIGluIGF0dGVtcHRpbmcgdG8gc3RhcnQgcGFydGlhbAorICAvLyBiaW5hcmllcyB3aXRob3V0IHRoaXMuCisgIHN0YXRpYyBjb25zdGV4cHIgdGltZTo6VGltZSBrUmVzdGFydFdhaXRUaW1lID0gdGltZTo6VGltZTo6SW5TZWNvbmRzKDEuNSk7CisKKyAgLy8gT25seSBrTWF4UmVzdGFydHNOdW1iZXIgcmVzdGFydHMgd2lsbCBiZSBhbGxvd2VkIGluIGtNYXhSZXN0YXJ0c1RpbWUuCisgIHN0YXRpYyBjb25zdGV4cHIgdGltZTo6VGltZSBrTWF4UmVzdGFydHNUaW1lID0gdGltZTo6VGltZTo6SW5TZWNvbmRzKDQpOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhSZXN0YXJ0c051bWJlciA9IDM7CisgIC8vIEhvdyBsb25nIHRvIHdhaXQgaWYgaXQgZ2V0cyByZXN0YXJ0ZWQgdG9vIG1hbnkgdGltZXMuCisgIHN0YXRpYyBjb25zdGV4cHIgdGltZTo6VGltZSBrUmVzdW1lV2FpdCA9IHRpbWU6OlRpbWU6OkluU2Vjb25kcyg1KTsKKworICBzdGF0aWMgdm9pZCBTdGF0aWNGaWxlTW9kaWZpZWQodm9pZCAqc2VsZikgeworICAgIHN0YXRpY19jYXN0PENoaWxkICo+KHNlbGYpLT5GaWxlTW9kaWZpZWQoKTsKKyAgfQorCisgIHZvaWQgRmlsZU1vZGlmaWVkKCkgeworICAgIExPRyhERUJVRywgImZpbGUgZm9yICVzIG1vZGlmaWVkXG4iLCBuYW1lKCkpOworICAgIHN0cnVjdCB0aW1ldmFsIHJlc3RhcnRfdGltZV90aW1ldmFsID0ga1Jlc3RhcnRXYWl0VGltZS5Ub1RpbWV2YWwoKTsKKyAgICAvLyBUaGlzIHdpbGwgcmVzZXQgdGhlIHRpbWVvdXQgYWdhaW4gaWYgaXQgaGFzbid0IHJ1biB5ZXQuCisgICAgaWYgKGV2dGltZXJfYWRkKHJlc3RhcnRfdGltZW91dC5nZXQoKSwgJnJlc3RhcnRfdGltZV90aW1ldmFsKSAhPSAwKSB7CisgICAgICBMT0coRkFUQUwsICJldnRpbWVyX2FkZCglcCwgJXApIGZhaWxlZFxuIiwKKyAgICAgICAgICByZXN0YXJ0X3RpbWVvdXQuZ2V0KCksICZyZXN0YXJ0X3RpbWVfdGltZXZhbCk7CisgICAgfQorICAgIHdhaXRpbmdfdG9fcmVzdGFydC5pbnNlcnQodGhpcyk7CisgIH0KKworICBzdGF0aWMgdm9pZCBTdGF0aWNEb1Jlc3RhcnQoaW50LCBzaG9ydCwgdm9pZCAqKSB7CisgICAgTE9HKERFQlVHLCAicmVzdGFydGluZyBldmVyeXRoaW5nIHRoYXQgbmVlZHMgaXRcbiIpOworICAgIGlmICh3YWl0aW5nX3RvX3Jlc3RhcnQuZmluZChjb3JlLmdldCgpKSAhPSB3YWl0aW5nX3RvX3Jlc3RhcnQuZW5kKCkpIHsKKyAgICAgIGNvcmUtPkRvUmVzdGFydCgpOworICAgICAgd2FpdGluZ190b19yZXN0YXJ0LmVyYXNlKGNvcmUuZ2V0KCkpOworICAgIH0KKyAgICBmb3IgKGF1dG8gYyA6IHdhaXRpbmdfdG9fcmVzdGFydCkgeworICAgICAgYy0+RG9SZXN0YXJ0KCk7CisgICAgfQorICAgIHdhaXRpbmdfdG9fcmVzdGFydC5jbGVhcigpOworICB9CisKKyAgLy8gQ2FsbGVkIGFmdGVyIHNvbWVib2R5IGVsc2UgaGFzIGZpbmlzaGVkIG1vZGlmeWluZyB0aGUgZmlsZS4KKyAgdm9pZCBEb1Jlc3RhcnQoKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJEb1Jlc3RhcnQoJXMpXG4iLCBiaW5hcnlfLmNfc3RyKCkpOworICAgIGlmIChzdGF0X2F0X3N0YXJ0X3ZhbGlkXykgeworICAgICAgc3RydWN0IHN0YXQgY3VycmVudF9zdGF0OworICAgICAgaWYgKHN0YXQob3JpZ2luYWxfYmluYXJ5Xy5jX3N0cigpLCAmY3VycmVudF9zdGF0KSA9PSAtMSkgeworICAgICAgICBQTE9HKEZBVEFMLCAic3RhdCglcywgJXApIGZhaWxlZCIsCisgICAgICAgICAgICAgb3JpZ2luYWxfYmluYXJ5Xy5jX3N0cigpLCAmY3VycmVudF9zdGF0KTsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50X3N0YXQuc3RfbXRpbWUgPT0gc3RhdF9hdF9zdGFydF8uc3RfbXRpbWUpIHsKKyAgICAgICAgTE9HKERFQlVHLCAiaWdub3JpbmcgdHJpZ2dlciBmb3IgJXMgYmVjYXVzZSBtdGltZSBkaWRuJ3QgY2hhbmdlXG4iLAorICAgICAgICAgICAgbmFtZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzID09IGNvcmUuZ2V0KCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdGFydGluZyBjb3JlIC0+IGV4aXRpbmcgbm93LlxuIik7CisgICAgICBleGl0KDApOworICAgIH0KKyAgICBpZiAocGlkXyAhPSAtMSkgeworICAgICAgTE9HKERFQlVHLCAic2VuZGluZyBTSUdURVJNIHRvIGNoaWxkICVkIHRvIHJlc3RhcnQgaXRcbiIsIHBpZF8pOworICAgICAgaWYgKGtpbGwocGlkXywgU0lHVEVSTSkgPT0gLTEpIHsKKyAgICAgICAgUExPRyhXQVJOSU5HLCAia2lsbCglZCwgU0lHVEVSTSkgZmFpbGVkIiwgcGlkXyk7CisgICAgICB9CisgICAgICBDaGVja0RpZWRTdGF0dXMgKnN0YXR1cyA9IG5ldyBDaGVja0RpZWRTdGF0dXMoKTsKKyAgICAgIHN0YXR1cy0+c2VsZiA9IHRoaXM7CisgICAgICBzdGF0dXMtPm9sZF9waWQgPSBwaWRfOworICAgICAgVGltZW91dChrUHJvY2Vzc0RpZVRpbWUsIFN0YXRpY0NoZWNrRGllZCwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgTE9HKFdBUk5JTkcsICIlcyByZXN0YXJ0IGF0dGVtcHRlZCBidXQgbm90IHJ1bm5pbmdcbiIsIG5hbWUoKSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgU3RhdGljQ2hlY2tEaWVkKGludCwgc2hvcnQsIHZvaWQgKnN0YXR1c19pbikgeworICAgIENoZWNrRGllZFN0YXR1cyAqc3RhdHVzID0gc3RhdGljX2Nhc3Q8Q2hlY2tEaWVkU3RhdHVzICo+KHN0YXR1c19pbik7CisgICAgc3RhdHVzLT5zZWxmLT5DaGVja0RpZWQoc3RhdHVzLT5vbGRfcGlkKTsKKyAgICBkZWxldGUgc3RhdHVzOworICB9CisKKyAgLy8gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgY2hpbGQgdXNpbmcgdGhlIFBJRCBvbGRfcGlkIGlzIHN0aWxsIHJ1bm5pbmcuCisgIHZvaWQgQ2hlY2tEaWVkKHBpZF90IG9sZF9waWQpIHsKKyAgICBpZiAocGlkXyA9PSBvbGRfcGlkKSB7CisgICAgICBMT0coV0FSTklORywgImNoaWxkICVkIHJlZnVzZWQgdG8gZGllXG4iLCBvbGRfcGlkKTsKKyAgICAgIGlmIChraWxsKG9sZF9waWQsIFNJR0tJTEwpID09IC0xKSB7CisgICAgICAgIFBMT0coV0FSTklORywgImtpbGwoJWQsIFNJR0tJTEwpIGZhaWxlZCIsIG9sZF9waWQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIFN0YXRpY1N0YXJ0KGludCwgc2hvcnQsIHZvaWQgKnNlbGYpIHsKKyAgICBzdGF0aWNfY2FzdDxDaGlsZCAqPihzZWxmKS0+U3RhcnQoKTsKKyAgfQorCisgIC8vIEFjdHVhbGx5IHN0YXJ0cyB0aGUgY2hpbGQuCisgIHZvaWQgU3RhcnQoKSB7CisgICAgaWYgKHBpZF8gIT0gLTEpIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiY2FsbGluZyBTdGFydCgpIGJ1dCBhbHJlYWR5IGhhdmUgY2hpbGQgJWQgcnVubmluZ1xuIiwKKyAgICAgICAgICBwaWRfKTsKKyAgICAgIGlmIChraWxsKHBpZF8sIFNJR0tJTEwpID09IC0xKSB7CisgICAgICAgIFBMT0coV0FSTklORywgImtpbGwoJWQsIFNJR0tJTEwpIGZhaWxlZCIsIHBpZF8pOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBwaWRfID0gLTE7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBuYW1lIHRoYXQgd2UgcnVuIGZyb20gKGllIGZyb20gYSBwcmV2aW91cyBleGVjdXRpb24pIGFuZCB0aGVuCisgICAgLy8gaGFyZCBsaW5rIHRoZSByZWFsIGZpbGVuYW1lIHRvIGl0LgorICAgIGlmICh1bmxpbmsoYmluYXJ5Xy5jX3N0cigpKSAhPSAwICYmIGVycm5vICE9IEVOT0VOVCkgeworICAgICAgUExPRyhGQVRBTCwgInJlbW92aW5nICVzIGZhaWxlZCIsIGJpbmFyeV8uY19zdHIoKSk7CisgICAgfQorICAgIGlmIChsaW5rKG9yaWdpbmFsX2JpbmFyeV8uY19zdHIoKSwgYmluYXJ5Xy5jX3N0cigpKSAhPSAwKSB7CisgICAgICBQTE9HKEZBVEFMLCAibGluaygnJXMnLCAnJXMnKSBmYWlsZWQiLAorICAgICAgICAgICBvcmlnaW5hbF9iaW5hcnlfLmNfc3RyKCksIGJpbmFyeV8uY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKHN0YXQob3JpZ2luYWxfYmluYXJ5Xy5jX3N0cigpLCAmc3RhdF9hdF9zdGFydF8pID09IC0xKSB7CisgICAgICBQTE9HKEZBVEFMLCAic3RhdCglcywgJXApIGZhaWxlZCIsCisgICAgICAgICAgIG9yaWdpbmFsX2JpbmFyeV8uY19zdHIoKSwgJnN0YXRfYXRfc3RhcnRfKTsKKyAgICB9CisgICAgc3RhdF9hdF9zdGFydF92YWxpZF8gPSB0cnVlOworCisgICAgaWYgKChwaWRfID0gZm9yaygpKSA9PSAwKSB7CisgICAgICBzc2l6ZV90IGFyZ3Nfc2l6ZSA9IGFyZ3NfLnNpemUoKTsKKyAgICAgIGNvbnN0IGNoYXIgKiphcmd2ID0gbmV3IGNvbnN0IGNoYXIgKlthcmdzX3NpemUgKyAxXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc19zaXplOyArK2kpIHsKKyAgICAgICAgYXJndltpXSA9IGFyZ3NfW2ldLmNfc3RyKCk7CisgICAgICB9CisgICAgICBhcmd2W2FyZ3Nfc2l6ZV0gPSBOVUxMOworICAgICAgLy8gVGhlIGNvbnN0X2Nhc3QgaXMgc2FmZSBiZWNhdXNlIG5vIGNvZGUgdGhhdCBtaWdodCBjYXJlIGlmIGl0IGdldHMKKyAgICAgIC8vIG1vZGlmaWVkIGNhbiBydW4gYWZ0ZXJ3YXJkcy4KKyAgICAgIGV4ZWN2KGJpbmFyeV8uY19zdHIoKSwgY29uc3RfY2FzdDxjaGFyICoqPihhcmd2KSk7CisgICAgICBQTE9HKEZBVEFMLCAiZXhlY3YoJXMsICVwKSBmYWlsZWQiLCBiaW5hcnlfLmNfc3RyKCksIGFyZ3YpOworICAgICAgX2V4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgaWYgKHBpZF8gPT0gLTEpIHsKKyAgICAgIFBMT0coRkFUQUwsICJmb3JraW5nIHRvIHJ1biBcIiVzXCIgZmFpbGVkIiwgYmluYXJ5Xy5jX3N0cigpKTsKKyAgICB9CisgICAgTE9HKERFQlVHLCAic3RhcnRlZCBcIiVzXCIgc3VjY2Vzc2Z1bGx5XG4iLCBiaW5hcnlfLmNfc3RyKCkpOworICB9CisKKyAgLy8gQSBoaXN0b3J5IG9mIHRoZSB0aW1lcyB0aGF0IHRoaXMgcHJvY2VzcyBoYXMgYmVlbiByZXN0YXJ0ZWQuCisgIHN0ZDo6cXVldWU8dGltZTo6VGltZSwgc3RkOjpsaXN0PHRpbWU6OlRpbWU+PiByZXN0YXJ0c187CisKKyAgLy8gVGhlIGN1cnJlbnRseSBydW5uaW5nIGNoaWxkJ3MgUElEIG9yIE5VTEwuCisgIHBpZF90IHBpZF87CisKKyAgLy8gQWxsIG9mIHRoZSBhcmd1bWVudHMgKGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUgYmluYXJ5KS4KKyAgc3RkOjpkZXF1ZTxzdGQ6OnN0cmluZz4gYXJnc187CisKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIHJlYWwgYmluYXJ5IHRoYXQgd2Ugd2VyZSB0b2xkIHRvIHJ1bi4KKyAgc3RkOjpzdHJpbmcgb3JpZ2luYWxfYmluYXJ5XzsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3ZSdyZSBhY3R1YWxseSBydW5uaW5nLgorICBzdGQ6OnN0cmluZyBiaW5hcnlfOworCisgIC8vIFdhdGNoZXMgb3JpZ2luYWxfYmluYXJ5Xy4KKyAgdW5pcXVlX3B0cjxGaWxlV2F0Y2g+IHdhdGNoZXJfOworCisgIC8vIENhcHR1cmVkIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUgd2hlbiB3ZSBtb3N0IHJlY2VudGx5IHN0YXJ0ZWQgYSBuZXcgY2hpbGQKKyAgLy8gcHJvY2Vzcy4gVXNlZCB0byBzZWUgaWYgaXQgYWN0dWFsbHkgY2hhbmdlcyBvciBub3QuCisgIHN0cnVjdCBzdGF0IHN0YXRfYXRfc3RhcnRfOworICBib29sIHN0YXRfYXRfc3RhcnRfdmFsaWRfOworCisgIC8vIEFuIGV2ZW50IHRoYXQgcmVzdGFydHMgYWZ0ZXIga1Jlc3RhcnRXYWl0VGltZS4KKyAgc3RhdGljIEV2ZW50VW5pcXVlUHRyIHJlc3RhcnRfdGltZW91dDsKKworICAvLyBUaGUgc2V0IG9mIGNoaWxkcmVuIHdhaXRpbmcgdG8gYmUgcmVzdGFydGVkIG9uY2UgYWxsIG1vZGlmaWNhdGlvbnMgc3RvcC4KKyAgc3RhdGljIDo6c3RkOjpzZXQ8Q2hpbGQgKj4gd2FpdGluZ190b19yZXN0YXJ0OworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDaGlsZCk7Cit9OworCitjb25zdGV4cHIgdGltZTo6VGltZSBDaGlsZDo6a1Byb2Nlc3NEaWVUaW1lOworY29uc3RleHByIHRpbWU6OlRpbWUgQ2hpbGQ6OmtSZXN0YXJ0V2FpdFRpbWU7Citjb25zdGV4cHIgdGltZTo6VGltZSBDaGlsZDo6a01heFJlc3RhcnRzVGltZTsKK2NvbnN0ZXhwciB0aW1lOjpUaW1lIENoaWxkOjprUmVzdW1lV2FpdDsKKworRXZlbnRVbmlxdWVQdHIgQ2hpbGQ6OnJlc3RhcnRfdGltZW91dDsKKzo6c3RkOjpzZXQ8Q2hpbGQgKj4gQ2hpbGQ6OndhaXRpbmdfdG9fcmVzdGFydDsKKworLy8gS2lsbHMgb2ZmIHRoZSBlbnRpcmUgcHJvY2VzcyBncm91cCAoaW5jbHVkaW5nIG91cnNlbGYpLgordm9pZCBLaWxsQ2hpbGRyZW4oYm9vbCB0cnlfbmljZSkgeworICBpZiAodHJ5X25pY2UpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtOaWNlU3RvcFNpZ25hbCA9IFNJR1RFUk07CisgICAgc3RhdGljIGNvbnN0IHRpbWU6OlRpbWUga05pY2VXYWl0VGltZSA9IHRpbWU6OlRpbWU6OkluU2Vjb25kcygxKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGp1c3QgbmljZWx5IHN0b3Agb3Vyc2VsZi4uLgorICAgIHNpZ3NldF90IG1hc2s7CisgICAgc2lnZW1wdHlzZXQoJm1hc2spOworICAgIHNpZ2FkZHNldCgmbWFzaywga05pY2VTdG9wU2lnbmFsKTsKKyAgICBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZtYXNrLCBOVUxMKTsKKworICAgIGtpbGwoLWdldHBpZCgpLCBrTmljZVN0b3BTaWduYWwpOworCisgICAgZmZsdXNoKE5VTEwpOworICAgIHRpbWU6OlNsZWVwRm9yKGtOaWNlV2FpdFRpbWUpOworICB9CisKKyAgLy8gU2VuZCBTSUdLSUxMIHRvIG91ciB3aG9sZSBwcm9jZXNzIGdyb3VwLCB3aGljaCB3aWxsIGZvcmNpYmx5IHRlcm1pbmF0ZSBhbnkKKyAgLy8gb2YgdGhlbSB0aGF0IGFyZSBzdGlsbCBydW5uaW5nICh1cyBmb3Igc3VyZSwgbWF5YmUgbW9yZSB0b28pLgorICBraWxsKC1nZXRwaWQoKSwgU0lHS0lMTCk7Cit9CisKK3ZvaWQgRXhpdEhhbmRsZXIoKSB7CisgIEtpbGxDaGlsZHJlbih0cnVlKTsKK30KKwordm9pZCBLaWxsQ2hpbGRyZW5TaWduYWxIYW5kbGVyKGludCBzaWdudW0pIHsKKyAgLy8gSWYgd2UgZ2V0IFNJR1NFR1Ygb3Igc29tZSBvdGhlciByYW5kb20gc2lnbmFsIHdobyBrbm93cyB3aGF0J3MgaGFwcGVuaW5nCisgIC8vIGFuZCB3ZSBzaG91bGQganVzdCBraWxsIGV2ZXJ5Ym9keSBpbW1lZGlhdGVseS4KKyAgLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBzaWduYWxzIHRoYXQgbWVhbiBzb21lIGZvcm0gb2YgIm5pY2VseSBzdG9wIi4KKyAgS2lsbENoaWxkcmVuKHNpZ251bSA9PSBTSUdIVVAgfHwgc2lnbnVtID09IFNJR0lOVCB8fCBzaWdudW0gPT0gU0lHUVVJVCB8fAorICAgICAgICAgICAgICAgc2lnbnVtID09IFNJR0FCUlQgfHwgc2lnbnVtID09IFNJR1BJUEUgfHwgc2lnbnVtID09IFNJR1RFUk0gfHwKKyAgICAgICAgICAgICAgIHNpZ251bSA9PSBTSUdYQ1BVKTsKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgY2hpbGQgd2l0aCBQSUQgcGlkIG9yIGFuIGVtcHR5IHVuaXF1ZV9wdHIuCitjb25zdCB1bmlxdWVfcHRyPENoaWxkPiAmRmluZENoaWxkKHBpZF90IHBpZCkgeworICBmb3IgKGF1dG8gaXQgPSBjaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytpdCkgeworICAgIGlmIChwaWQgPT0gKCppdCktPnBpZCgpKSB7CisgICAgICByZXR1cm4gKml0OworICAgIH0KKyAgfQorCisgIGlmIChwaWQgPT0gY29yZS0+cGlkKCkpIHsKKyAgICByZXR1cm4gY29yZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCB1bmlxdWVfcHRyPENoaWxkPiBrTm90aGluZzsKKyAgcmV0dXJuIGtOb3RoaW5nOworfQorCisvLyBHZXRzIHNldCB1cCBhcyBhIGxpYmV2ZW50IGhhbmRsZXIgZm9yIFNJR0NITEQuCisvLyBIYW5kbGVzIGNhbGxpbmcgQ2hpbGQ6OlByb2Nlc3NEaWVkKCkgb24gdGhlIGFwcHJvcHJpYXRlIG9uZS4KK3ZvaWQgU2lnQ0hMRFJlY2VpdmVkKGludCAvKmZkKi8sIHNob3J0IC8qZXZlbnRzKi8sIHZvaWQgKikgeworICAvLyBJbiBhIHdoaWxlIGxvb3AgaW4gY2FzZSB3ZSBtaXNzIGFueSBTSUdDSExEcy4KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzaWdpbmZvX3QgaW5mb3A7CisgICAgaW5mb3Auc2lfcGlkID0gMDsKKyAgICBpZiAod2FpdGlkKFBfQUxMLCAwLCAmaW5mb3AsIFdFWElURUQgfCBXU1RPUFBFRCB8IFdOT0hBTkcpICE9IDApIHsKKyAgICAgIFBMT0coV0FSTklORywgIndhaXRpZCBmYWlsZWQiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSBjaGlsZCBwcm9jZXNzIGRlYXRocyB0byBwcm9jZXNzLgorICAgIGlmIChpbmZvcC5zaV9waWQgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBpZF90IHBpZCA9IGluZm9wLnNpX3BpZDsKKyAgICBpbnQgc3RhdHVzID0gaW5mb3Auc2lfc3RhdHVzOworICAgIGNvbnN0IHVuaXF1ZV9wdHI8Q2hpbGQ+ICZjaGlsZCA9IEZpbmRDaGlsZChwaWQpOworICAgIGlmIChjaGlsZCkgeworICAgICAgc3dpdGNoIChpbmZvcC5zaV9jb2RlKSB7CisgICAgICAgIGNhc2UgQ0xEX0VYSVRFRDoKKyAgICAgICAgICBMT0coV0FSTklORywgImNoaWxkICVkICglcykgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iLAorICAgICAgICAgICAgICBwaWQsIGNoaWxkLT5uYW1lKCksIHN0YXR1cyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0xEX0RVTVBFRDoKKyAgICAgICAgICBMT0coSU5GTywgImNoaWxkICVkIGFjdHVhbGx5IGR1bXBlZCBjb3JlLiAiCisgICAgICAgICAgICAgICJmYWxsaW5nIHRocm91Z2ggdG8ga2lsbGVkIGJ5IHNpZ25hbCBjYXNlXG4iLCBwaWQpOworICAgICAgICBjYXNlIENMRF9LSUxMRUQ6CisgICAgICAgICAgLy8gSWYgc29tZWJvZHkgKHBvc3NpYmx5IHVzKSBzZW50IGl0IFNJR1RFUk0gdGhhdCBtZWFucyB0aGF0IHRoZXkganVzdAorICAgICAgICAgIC8vIHdhbnQgaXQgdG8gc3RvcCwgc28gaXQgc3RvcHBpbmcgaXNuJ3QgYSBXQVJOSU5HLgorICAgICAgICAgIExPRygoc3RhdHVzID09IFNJR1RFUk0pID8gREVCVUcgOiBXQVJOSU5HLAorICAgICAgICAgICAgICAiY2hpbGQgJWQgKCVzKSB3YXMga2lsbGVkIGJ5IHNpZ25hbCAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICBwaWQsIGNoaWxkLT5uYW1lKCksIHN0YXR1cywgYW9zX3N0cnNpZ25hbChzdGF0dXMpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDTERfU1RPUFBFRDoKKyAgICAgICAgICBMT0coV0FSTklORywgImNoaWxkICVkICglcykgd2FzIHN0b3BwZWQgYnkgc2lnbmFsICVkICIKKyAgICAgICAgICAgICAgIihnaXZpbmcgaXQgYSBTSUdDT05UKCVkKSlcbiIsCisgICAgICAgICAgICAgIHBpZCwgY2hpbGQtPm5hbWUoKSwgc3RhdHVzLCBTSUdDT05UKTsKKyAgICAgICAgICBraWxsKHBpZCwgU0lHQ09OVCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgTE9HKFdBUk5JTkcsICJzb21ldGhpbmcgaGFwcGVuZWQgdG8gY2hpbGQgJWQgKCVzKSAoa2lsbGluZyBpdClcbiIsCisgICAgICAgICAgICAgIHBpZCwgY2hpbGQtPm5hbWUoKSk7CisgICAgICAgICAga2lsbChwaWQsIFNJR0tJTEwpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBMT0coV0FSTklORywgImNvdWxkbid0IGZpbmQgYSBDaGlsZCBmb3IgcGlkICVkXG4iLCBwaWQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjaGlsZCA9PSBjb3JlKSB7CisgICAgICBMT0coRkFUQUwsICJjb3JlIGRpZWRcbiIpOworICAgIH0KKyAgICBjaGlsZC0+UHJvY2Vzc0RpZWQoKTsKKyAgfQorfQorCisvLyBUaGlzIGlzIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmVhZCBwcm9jZXNzZXMgdG8KKy8vIHN0YXJ0IGZyb20gbWFpbiB0byBSdW4uCitjb25zdCBjaGFyICpjaGlsZF9saXN0X2ZpbGU7CisKK3ZvaWQgUnVuKHZvaWQgKndhdGNoKTsKK3ZvaWQgTWFpbigpIHsKKyAgbG9nZ2luZzo6SW5pdCgpOworCisgIGlmIChzZXRwZ2lkKDAgLypzZWxmKi8sIDAgLyptYWtlIFBHSUQgdGhlIHNhbWUgYXMgUElEKi8pICE9IDApIHsKKyAgICBQTE9HKEZBVEFMLCAic2V0cGdpZCgwLCAwKSBmYWlsZWQiKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGtpbGwgYWxsIGNoaWxkcmVuIHdoZW4gd2UgZXhpdC4KKyAgYXRleGl0KEV4aXRIYW5kbGVyKTsKKyAgLy8gRG8gaXQgb24gc29tZSBzaWduYWxzIHRvbyAob25lcyB0aGF0IHdlIG90aGVyd2lzZSB0ZW5kIHRvIHJlY2VpdmUgYW5kIHRoZW4KKyAgLy8gbGVhdmUgYWxsIG9mIG91ciBjaGlsZHJlbiBnb2luZykuCisgIHNpZ25hbChTSUdIVVAsIEtpbGxDaGlsZHJlblNpZ25hbEhhbmRsZXIpOworICBzaWduYWwoU0lHSU5ULCBLaWxsQ2hpbGRyZW5TaWduYWxIYW5kbGVyKTsKKyAgc2lnbmFsKFNJR1FVSVQsIEtpbGxDaGlsZHJlblNpZ25hbEhhbmRsZXIpOworICBzaWduYWwoU0lHSUxMLCBLaWxsQ2hpbGRyZW5TaWduYWxIYW5kbGVyKTsKKyAgc2lnbmFsKFNJR0FCUlQsIEtpbGxDaGlsZHJlblNpZ25hbEhhbmRsZXIpOworICBzaWduYWwoU0lHRlBFLCBLaWxsQ2hpbGRyZW5TaWduYWxIYW5kbGVyKTsKKyAgc2lnbmFsKFNJR1NFR1YsIEtpbGxDaGlsZHJlblNpZ25hbEhhbmRsZXIpOworICBzaWduYWwoU0lHUElQRSwgS2lsbENoaWxkcmVuU2lnbmFsSGFuZGxlcik7CisgIHNpZ25hbChTSUdURVJNLCBLaWxsQ2hpbGRyZW5TaWduYWxIYW5kbGVyKTsKKyAgc2lnbmFsKFNJR0JVUywgS2lsbENoaWxkcmVuU2lnbmFsSGFuZGxlcik7CisgIHNpZ25hbChTSUdYQ1BVLCBLaWxsQ2hpbGRyZW5TaWduYWxIYW5kbGVyKTsKKyAgCisgIGxpYmV2ZW50X2Jhc2UgPSBFdmVudEJhc2VVbmlxdWVQdHIoZXZlbnRfYmFzZV9uZXcoKSk7CisKKyAgc3RkOjpzdHJpbmcgY29yZV90b3VjaF9maWxlID0gIi90bXAvc3RhcnRlci4iOworICBjb3JlX3RvdWNoX2ZpbGUgKz0gc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50bWF4X3Q+KGdldHBpZCgpKSk7CisgIGNvcmVfdG91Y2hfZmlsZSArPSAiLmNvcmVfdG91Y2hfZmlsZSI7CisgIGNvbnN0IGludCByZXN1bHQgPQorICAgICAgOjphb3M6OnV0aWw6OlJ1bkNvbW1hbmQoKCJ0b3VjaCAnIiArIGNvcmVfdG91Y2hfZmlsZSArICInIikuY19zdHIoKSk7CisgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICBQTE9HKEZBVEFMLCAicnVubmluZyBgdG91Y2ggJyVzJ2AgZmFpbGVkXG4iLCBjb3JlX3RvdWNoX2ZpbGUuY19zdHIoKSk7CisgIH0gZWxzZSBpZiAoIVdJRkVYSVRFRChyZXN1bHQpIHx8IFdFWElUU1RBVFVTKHJlc3VsdCkgIT0gMCkgeworICAgIExPRyhGQVRBTCwgImB0b3VjaCAnJXMnYCBnYXZlIHJlc3VsdCAleFxuIiwgY29yZV90b3VjaF9maWxlLmNfc3RyKCksCisgICAgICAgIHJlc3VsdCk7CisgIH0KKyAgRmlsZVdhdGNoIGNvcmVfdG91Y2hfZmlsZV93YXRjaChjb3JlX3RvdWNoX2ZpbGUsIFJ1biwgTlVMTCk7CisgIGNvcmUgPSB1bmlxdWVfcHRyPENoaWxkPigKKyAgICAgIG5ldyBDaGlsZCgiY29yZSAiICsgY29yZV90b3VjaF9maWxlKSk7CisKKyAgRklMRSAqcGlkX2ZpbGUgPSBmb3BlbigiL3RtcC9zdGFydGVyLnBpZCIsICJ3Iik7CisgIGlmIChwaWRfZmlsZSA9PSBOVUxMKSB7CisgICAgUExPRyhGQVRBTCwgImZvcGVuKFwiL3RtcC9zdGFydGVyLnBpZFwiLCBcIndcIikgZmFpbGVkIik7CisgIH0gZWxzZSB7CisgICAgaWYgKGZwcmludGYocGlkX2ZpbGUsICIlZCIsIGNvcmUtPnBpZCgpKSA9PSAtMSkgeworICAgICAgUExPRyhXQVJOSU5HLCAiZnByaW50ZiglcCwgXCIlJWRcIiwgJWQpIGZhaWxlZCIsCisgICAgICAgICAgIHBpZF9maWxlLCBjb3JlLT5waWQoKSk7CisgICAgfQorICAgIGZjbG9zZShwaWRfZmlsZSk7CisgIH0KKworICBMT0coSU5GTywgIndhaXRpbmcgZm9yICVzIHRvIGFwcGVhclxuIiwgY29yZV90b3VjaF9maWxlLmNfc3RyKCkpOworCisgIGV2ZW50X2Jhc2VfZGlzcGF0Y2gobGliZXZlbnRfYmFzZS5nZXQoKSk7CisgIExPRyhGQVRBTCwgImV2ZW50X2Jhc2VfZGlzcGF0Y2goJXApIHJldHVybmVkXG4iLCBsaWJldmVudF9iYXNlLmdldCgpKTsKK30KKworLy8gVGhpcyBpcyB0aGUgY2FsbGJhY2sgZm9yIHdoZW4gY29yZSBjcmVhdGVzIHRoZSBmaWxlIGluZGljYXRpbmcgdGhhdCBpdCBoYXMKKy8vIHN0YXJ0ZWQuCit2b2lkIFJ1bih2b2lkICp3YXRjaCkgeworICAvLyBNYWtlIGl0IHNvIGl0IGRvZXNuJ3Qga2VlcCBvbiBzZWVpbmcgcmFuZG9tIGNoYW5nZXMgaW4gL3RtcC4KKyAgc3RhdGljX2Nhc3Q8RmlsZVdhdGNoICo+KHdhdGNoKS0+UmVtb3ZlV2F0Y2goKTsKKworICAvLyBJdCdzIHNhZmUgbm93IGJlY2F1c2UgY29yZSBpcyB1cC4KKyAgYW9zOjpJbml0TlJUKCk7CisKKyAgc3RkOjppZnN0cmVhbSBsaXN0X2ZpbGUoY2hpbGRfbGlzdF9maWxlKTsKKyAgCisgIHdoaWxlICh0cnVlKSB7CisgICAgc3RkOjpzdHJpbmcgY2hpbGRfbmFtZTsKKyAgICBnZXRsaW5lKGxpc3RfZmlsZSwgY2hpbGRfbmFtZSk7CisgICAgaWYgKChsaXN0X2ZpbGUucmRzdGF0ZSgpICYgc3RkOjppb3NfYmFzZTo6ZW9mYml0KSAhPSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGxpc3RfZmlsZS5yZHN0YXRlKCkgIT0gMCkgeworICAgICAgTE9HKEZBVEFMLCAicmVhZGluZyBpbnB1dCBmaWxlICVzIGZhaWxlZFxuIiwgY2hpbGRfbGlzdF9maWxlKTsKKyAgICB9CisgICAgY2hpbGRyZW4ucHVzaF9iYWNrKHVuaXF1ZV9wdHI8Q2hpbGQ+KG5ldyBDaGlsZChjaGlsZF9uYW1lKSkpOworICB9CisKKyAgRXZlbnRVbmlxdWVQdHIgc2lnY2hsZChldmVudF9uZXcobGliZXZlbnRfYmFzZS5nZXQoKSwgU0lHQ0hMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZfU0lHTkFMIHwgRVZfUEVSU0lTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnQ0hMRFJlY2VpdmVkLCBOVUxMKSk7CisgIGV2ZW50X2FkZChzaWdjaGxkLnJlbGVhc2UoKSwgTlVMTCk7Cit9CisKK2NvbnN0IGNoYXIgKmtBcmdzSGVscCA9ICJbT1BUSU9OXS4uLiBTVEFSVF9MSVNUXG4iCisgICAgIlN0YXJ0IGFsbCBvZiB0aGUgcm9ib3QgY29kZSBiaW5hcmllcyBpbiBTVEFSVF9MSVNULlxuIgorICAgICJcbiIKKyAgICAiU1RBUlRfTElTVCBpcyB0aGUgZmlsZSB0byByZWFkIGJpbmFyaWVzIChsb29rZWQgdXAgb24gUEFUSCkgdG8gcnVuLlxuIgorICAgICIgIC0taGVscCAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiI7Cit2b2lkIFByaW50SGVscCgpIHsKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgJXMiLCBwcm9ncmFtX2ludm9jYXRpb25fbmFtZSwga0FyZ3NIZWxwKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN0YXJ0ZXIKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyAhPSAyKSB7CisgICAgYW9zOjpzdGFydGVyOjpQcmludEhlbHAoKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgaWYgKHN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikgPT0gMCkgeworICAgIGFvczo6c3RhcnRlcjo6UHJpbnRIZWxwKCk7CisgICAgZXhpdChFWElUX1NVQ0NFU1MpOworICB9CisKKyAgYW9zOjpzdGFydGVyOjpjaGlsZF9saXN0X2ZpbGUgPSBhcmd2WzFdOworCisgIGFvczo6c3RhcnRlcjo6TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvc3RhcnRlci9zdGFydGVyLmd5cCBiL2Fvcy9saW51eF9jb2RlL3N0YXJ0ZXIvc3RhcnRlci5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExNjY0NwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL3N0YXJ0ZXIvc3RhcnRlci5neXAKQEAgLTAsMCArMSwyOCBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RhcnRlcl9leGUnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3N0YXJ0ZXIuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpsaWJldmVudCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpvbmNlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbGliYy9saWJjLmd5cDphb3Nfc3Ryc2lnbmFsJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpydW5fY29tbWFuZCcsCisgICAgICBdLAorICAgICAgJ2NvcGllcyc6IFsKKyAgICAgICAgeworICAgICAgICAgICdkZXN0aW5hdGlvbic6ICc8KHJzeW5jX2RpciknLAorICAgICAgICAgICdmaWxlcyc6IFsKKyAgICAgICAgICAgICdzdGFydGVyLnNoJywKKyAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYW9zL2xpbnV4X2NvZGUvc3RhcnRlci9zdGFydGVyLnNoIGIvYW9zL2xpbnV4X2NvZGUvc3RhcnRlci9zdGFydGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4MWJmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvbGludXhfY29kZS9zdGFydGVyL3N0YXJ0ZXIuc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vYmFzaAorCisjIE5JIGFscmVhZHkgaGFzIGEgY29yZSBwYXR0ZXJuLCBzbyB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgY2hhbmdlIGl0LgorI2VjaG8gJy9ob21lL2RyaXZlci90bXAvcm9ib3RfbG9ncy8lZS0lcy0lcC0ldC5jb3JlZHVtcCcgPiAvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybgorCit3aGlsZSB0cnVlOyBkbworCWV4cG9ydCBQQVRIPSRQQVRIOi9ob21lL2FkbWluL3JvYm90X2NvZGUKKwlzdGFydGVyX2V4ZSAvaG9tZS9hZG1pbi9yb2JvdF9jb2RlL3N0YXJ0X2xpc3QudHh0Citkb25lCmRpZmYgLS1naXQgYS9hb3MvbGludXhfY29kZS9zdGFydGVyL3Rlc3RpbmdfbGlzdC50eHQgYi9hb3MvbGludXhfY29kZS9zdGFydGVyL3Rlc3RpbmdfbGlzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkNDEyZAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9saW51eF9jb2RlL3N0YXJ0ZXIvdGVzdGluZ19saXN0LnR4dApAQCAtMCwwICsxLDMgQEAKKy4uL2Jpbi9Mb2dSZWFkZXIKKy4uL2Jpbi9Kb3lzdGlja0NvZGUKKy4uL2Jpbi9BdXRvTW9kZQpkaWZmIC0tZ2l0IGEvYW9zL3ByaW1lL1JFQURNRS50eHQgYi9hb3MvcHJpbWUvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M0MTRiCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL3ByaW1lL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMCBAQAorc2VlIC4uL1JFQURNRS50eHQgZm9yIHN0dWZmIGFmZmVjdGluZyBjcmlvIGFuZCBsaW51eCBjb2RlCisKK1RoaXMgZm9sZGVyIGhhcyBjb2RlIGZvciB0aGUgbGludXggYm94IHRoYXQgdGFsa3MgdG8gdGhlIGNSSU8gZXRjLiBJdCBpcyBjYWxsZWQgdGhlIHByaW1lLiBXZSBoYXZlIG11bHRpcGxlIGV4cGxhbmF0aW9ucyBmb3IgdGhhdCBuYW1lOgorICBJdCBpcyB0aGUgcHJpbWFyeSBjb250cm9sbGVyLgorICBQUklNRS9QcmltYXJ5IFJvYm90IEludGVsbGlnZW50IE1hbmFnZW1lbnQgRW50aXR5CisgIFJlcHJlc2VudHMgT3B0aW11cyBQcmltZSwgb25lIG9mIHRoZSBnb29kIHRyYW5zZm9ybWVycyB3aG8gYmF0dGxlIHRoZSBiYWQgb25lcyB0aGF0IDI1NCBuYW1lcyByb2JvdHMgYWZ0ZXIuCisgIEl0IGlzIGVhc3kgdG8gdHlwZSBhbmQgZG9lc24ndCBjb25mbGljdCB3aXRoIGFueXRoaW5nIGVsc2UgY29tbW9uIGZvciB0YWItY29tcGxldGlvbi4KKyAgSXQncyBub3QgaGFyZHdhcmUtc3BlY2lmaWMuCisKK1RoZSBjb2RlIHRoYXQgd291bGQgYmUgdXNlZnVsIG9uIGFueSBsaW51eCBib3ggaXMgaW4gLi4vbGludXhfY29kZS8uCmRpZmYgLS1naXQgYS9hb3MvcHJpbWUvaW5wdXQvaW5wdXQuZ3lwIGIvYW9zL3ByaW1lL2lucHV0L2lucHV0Lmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJhNDVkCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL3ByaW1lL2lucHV0L2lucHV0Lmd5cApAQCAtMCwwICsxLDIxIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdqb3lzdGlja19pbnB1dCcsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2pveXN0aWNrX2lucHV0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9pbnB1dC9pbnB1dC5neXA6ZHJpdmVyX3N0YXRpb25fZGF0YScsCisgICAgICAgICc8KEFPUykvY29tbW9uL21lc3NhZ2VzL21lc3NhZ2VzLmd5cDpyb2JvdF9zdGF0ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL25ldHdvcmsvbmV0d29yay5neXA6c29ja2V0JywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9pbnB1dC9pbnB1dC5neXA6ZHJpdmVyX3N0YXRpb25fZGF0YScsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9hb3MvcHJpbWUvaW5wdXQvam95c3RpY2tfaW5wdXQuY2MgYi9hb3MvcHJpbWUvaW5wdXQvam95c3RpY2tfaW5wdXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5ZTdjMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9wcmltZS9pbnB1dC9qb3lzdGlja19pbnB1dC5jYwpAQCAtMCwwICsxLDY2IEBACisjaW5jbHVkZSAiYW9zL3ByaW1lL2lucHV0L2pveXN0aWNrX2lucHV0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vbWVzc2FnZXMvcm9ib3Rfc3RhdGUucS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgaW5wdXQgeworCit2b2lkIEpveXN0aWNrSW5wdXQ6OlJ1bigpIHsKKyAgZHJpdmVyX3N0YXRpb246OkRhdGEgZGF0YTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBqb3lzdGlja19zdGF0ZS5GZXRjaEFub3RoZXIoKTsKKworICAgIGRhdGEuVXBkYXRlKCpqb3lzdGlja19zdGF0ZSk7CisKKyAgICB7CisgICAgICB1c2luZyBkcml2ZXJfc3RhdGlvbjo6Sm95c3RpY2tGZWF0dXJlOworICAgICAgdXNpbmcgZHJpdmVyX3N0YXRpb246OkJ1dHRvbkxvY2F0aW9uOworICAgICAgZm9yIChpbnQgam95c3RpY2sgPSAxOyBqb3lzdGljayA8PSBKb3lzdGlja0ZlYXR1cmU6OmtKb3lzdGlja3M7CisgICAgICAgICAgICsram95c3RpY2spIHsKKyAgICAgICAgZm9yIChpbnQgYnV0dG9uID0gMTsgYnV0dG9uIDw9IEJ1dHRvbkxvY2F0aW9uOjprQnV0dG9uczsgKytidXR0b24pIHsKKyAgICAgICAgICBCdXR0b25Mb2NhdGlvbiBsb2NhdGlvbihqb3lzdGljaywgYnV0dG9uKTsKKyAgICAgICAgICBpZiAoZGF0YS5Qb3NFZGdlKGxvY2F0aW9uKSkgeworICAgICAgICAgICAgTE9HKElORk8sICJQb3NFZGdlKCVkLCAlZClcbiIsIGpveXN0aWNrLCBidXR0b24pOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZGF0YS5OZWdFZGdlKGxvY2F0aW9uKSkgeworICAgICAgICAgICAgTE9HKElORk8sICJOZWdFZGdlKCVkLCAlZClcbiIsIGpveXN0aWNrLCBidXR0b24pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YS5HZXRQT1Yoam95c3RpY2spICE9IGRhdGEuR2V0T2xkUE9WKGpveXN0aWNrKSkgeworICAgICAgICAgIExPRyhJTkZPLCAiUE9WICVkICVkLT4lZFxuIiwgam95c3RpY2ssIGRhdGEuR2V0T2xkUE9WKGpveXN0aWNrKSwKKyAgICAgICAgICAgICAgZGF0YS5HZXRQT1Yoam95c3RpY2spKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICB1c2luZyBkcml2ZXJfc3RhdGlvbjo6Q29udHJvbEJpdDsKKyAgICAgIGlmIChkYXRhLlBvc0VkZ2UoQ29udHJvbEJpdDo6a0Ztc0F0dGFjaGVkKSkgeworICAgICAgICBMT0coSU5GTywgIlBvc0VkZ2Uoa0Ztc0F0dGFjaGVkKVxuIik7CisgICAgICB9CisgICAgICBpZiAoZGF0YS5OZWdFZGdlKENvbnRyb2xCaXQ6OmtGbXNBdHRhY2hlZCkpIHsKKyAgICAgICAgTE9HKElORk8sICJOZWdFZGdlKGtGbXNBdHRhY2hlZClcbiIpOworICAgICAgfQorICAgICAgaWYgKGRhdGEuUG9zRWRnZShDb250cm9sQml0OjprQXV0b25vbW91cykpIHsKKyAgICAgICAgTE9HKElORk8sICJQb3NFZGdlKGtBdXRvbm9tb3VzKVxuIik7CisgICAgICB9CisgICAgICBpZiAoZGF0YS5OZWdFZGdlKENvbnRyb2xCaXQ6OmtBdXRvbm9tb3VzKSkgeworICAgICAgICBMT0coSU5GTywgIk5lZ0VkZ2Uoa0F1dG9ub21vdXMpXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChkYXRhLlBvc0VkZ2UoQ29udHJvbEJpdDo6a0VuYWJsZWQpKSB7CisgICAgICAgIExPRyhJTkZPLCAiUG9zRWRnZShrRW5hYmxlZClcbiIpOworICAgICAgfQorICAgICAgaWYgKGRhdGEuTmVnRWRnZShDb250cm9sQml0OjprRW5hYmxlZCkpIHsKKyAgICAgICAgTE9HKElORk8sICJOZWdFZGdlKGtFbmFibGVkKVxuIik7CisgICAgICB9CisgICAgfQorCisgICAgUnVuSXRlcmF0aW9uKGRhdGEpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnB1dAorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL3ByaW1lL2lucHV0L2pveXN0aWNrX2lucHV0LmggYi9hb3MvcHJpbWUvaW5wdXQvam95c3RpY2tfaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk3NTgwCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL3ByaW1lL2lucHV0L2pveXN0aWNrX2lucHV0LmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBBT1NfTElOVVhfQ09ERV9JTlBVVF9KT1lTVElDS1NfSU5QVVRfSF8KKyNkZWZpbmUgQU9TX0xJTlVYX0NPREVfSU5QVVRfSk9ZU1RJQ0tTX0lOUFVUX0hfCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2lucHV0L2RyaXZlcl9zdGF0aW9uX2RhdGEuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgaW5wdXQgeworCisvLyBBIGNsYXNzIGZvciBoYW5kbGluZyBqb3lzdGljayBwYWNrZXQgdmFsdWVzLgorLy8gSXQgd2lsbCBjYWxsIFJ1bkl0ZXJhdGlvbiBlYWNoIHRpbWUgYSBuZXcgcGFja2V0IGlzIHJlY2VpdmVkLgorLy8KKy8vIFRoaXMgY2xhc3MgYXV0b21hdGljYWxseSBoYW5kbGVzIHVwZGF0aW5nIDo6YW9zOjpqb3lzdGlja19zdGF0ZSBhbmQgbG9nZ2luZworLy8gKGF0IElORk8pIGJ1dHRvbiBlZGdlcy4KK2NsYXNzIEpveXN0aWNrSW5wdXQgeworIHB1YmxpYzoKKyAgdm9pZCBSdW4oKTsKKworIHByaXZhdGU6CisgIC8vIFN1YmNsYXNzZXMgc2hvdWxkIGRvIHdoYXRldmVyIHRoZXkgd2FudCB3aXRoIGRhdGEgaGVyZS4KKyAgdmlydHVhbCB2b2lkIFJ1bkl0ZXJhdGlvbihjb25zdCBkcml2ZXJfc3RhdGlvbjo6RGF0YSAmZGF0YSkgPSAwOworfTsKKworLy8gQ2xhc3Mgd2hpY2ggd2lsbCBwcm94eSBqb3lzdGljayBpbmZvcm1hdGlvbiBmcm9tIFVEUCBwYWNrZXRzIHRvIHRoZSBxdWV1ZXMuCitjbGFzcyBKb3lzdGlja1Byb3h5IHsKKyBwdWJsaWM6CisgIHZvaWQgUnVuKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW5wdXQKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBBT1NfTElOVVhfQ09ERV9JTlBVVF9KT1lTVElDS1NfSU5QVVRfSF8KZGlmZiAtLWdpdCBhL2JvdDMvYWN0b3JzL2FjdG9ycy5neXAgYi9ib3QzL2FjdG9ycy9hY3RvcnMuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NDkzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2FjdG9ycy9hY3RvcnMuZ3lwCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2JpbmFyaWVzJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL2JvdDMvYXV0b25vbW91cy9hdXRvLmNjIGIvYm90My9hdXRvbm9tb3VzL2F1dG8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyZjk5YQotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvYXV0b25vbW91cy9hdXRvLmNjCkBAIC0wLDAgKzEsNDcgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3RyYXBlem9pZF9wcm9maWxlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorCisjaW5jbHVkZSAiYm90My9hdXRvbm9tb3VzL2F1dG8ucS5oIgorI2luY2x1ZGUgImJvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgorI2luY2x1ZGUgImZyYzk3MS9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5oIgorCit1c2luZyA6OmFvczo6dGltZTo6VGltZTsKK3VzaW5nIDo6Ym90Mzo6Y29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZTsKKworbmFtZXNwYWNlIGJvdDMgeworbmFtZXNwYWNlIGF1dG9ub21vdXMgeworCitzdHJ1Y3QgUHJvZmlsZVBhcmFtcyB7CisgIGRvdWJsZSB2ZWxvY2l0eTsKKyAgZG91YmxlIGFjY2VsZXJhdGlvbjsKK307CisKK25hbWVzcGFjZSB0aW1lID0gOjphb3M6OnRpbWU7CisKK2Jvb2wgU2hvdWxkRXhpdEF1dG8oKSB7CisgIDo6Ym90Mzo6YXV0b25vbW91czo6YXV0b25vbW91cy5GZXRjaExhdGVzdCgpOworICBib29sIGFucyA9ICE6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMtPnJ1bl9hdXRvOworICBpZiAoYW5zKSB7CisgICAgTE9HKElORk8sICJUaW1lIHRvIGV4aXQgYXV0byBtb2RlXG4iKTsKKyAgfQorICByZXR1cm4gYW5zOworfQorCit2b2lkIEhhbmRsZUF1dG8oKSB7CisgIDo6YW9zOjp0aW1lOjpUaW1lIHN0YXJ0X3RpbWUgPSA6OmFvczo6dGltZTo6VGltZTo6Tm93KCk7CisgIExPRyhJTkZPLCAiU3RhcnRpbmcgYXV0byBtb2RlIGF0ICVmXG4iLCBzdGFydF90aW1lLlRvU2Vjb25kcygpKTsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8OjpmcmM5NzE6OmFjdG9yczo6RHJpdmV0cmFpbkFjdGlvbj4gZHJpdmU7CisgIExPRyhJTkZPLCAiRG9pbmcgbm90aGluZyBpbiBhdXRvLlxuIik7CisKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGF1dG9ub21vdXMKK30gIC8vIG5hbWVzcGFjZSBib3QzCmRpZmYgLS1naXQgYS9ib3QzL2F1dG9ub21vdXMvYXV0by5oIGIvYm90My9hdXRvbm9tb3VzL2F1dG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTZkMjJjCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9hdXRvbm9tb3VzL2F1dG8uaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIEJPVDNfQVVUT05PTU9VU19BVVRPX0hfCisjZGVmaW5lIEJPVDNfQVVUT05PTU9VU19BVVRPX0hfCisKK25hbWVzcGFjZSBib3QzIHsKK25hbWVzcGFjZSBhdXRvbm9tb3VzIHsKKwordm9pZCBIYW5kbGVBdXRvKCk7CisKK30gIC8vIG5hbWVzcGFjZSBhdXRvbm9tb3VzCit9ICAvLyBuYW1lc3BhY2UgYm90MworCisjZW5kaWYgIC8vIEJPVDNfQVVUT05PTU9VU19BVVRPX0hfCmRpZmYgLS1naXQgYS9ib3QzL2F1dG9ub21vdXMvYXV0by5xIGIvYm90My9hdXRvbm9tb3VzL2F1dG8ucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjM2ZDMxCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9hdXRvbm9tb3VzL2F1dG8ucQpAQCAtMCwwICsxLDggQEAKK3BhY2thZ2UgYm90My5hdXRvbm9tb3VzOworCittZXNzYWdlIEF1dG9Db250cm9sIHsKKyAgLy8gVHJ1ZSBpZiBhdXRvIG1vZGUgc2hvdWxkIGJlIHJ1bm5pbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBydW5fYXV0bzsKK307CisKK3F1ZXVlIEF1dG9Db250cm9sIGF1dG9ub21vdXM7CmRpZmYgLS1naXQgYS9ib3QzL2F1dG9ub21vdXMvYXV0b19tYWluLmNjIGIvYm90My9hdXRvbm9tb3VzL2F1dG9fbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI5NzhjCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9hdXRvbm9tb3VzL2F1dG9fbWFpbi5jYwpAQCAtMCwwICsxLDQyIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJvdDMvYXV0b25vbW91cy9hdXRvLnEuaCIKKyNpbmNsdWRlICJib3QzL2F1dG9ub21vdXMvYXV0by5oIgorCit1c2luZyA6OmFvczo6dGltZTo6VGltZTsKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyICogLyphcmd2Ki9bXSkgeworICA6OmFvczo6SW5pdCgpOworCisgIExPRyhJTkZPLCAiQXV0byBtYWluIHN0YXJ0ZWRcbiIpOworICA6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hMYXRlc3QoKTsKKyAgd2hpbGUgKCE6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuZ2V0KCkpIHsKKyAgICA6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICBMT0coSU5GTywgIkdvdCBhbm90aGVyIGF1dG8gcGFja2V0XG4iKTsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisgICAgd2hpbGUgKCE6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMtPnJ1bl9hdXRvKSB7CisgICAgICA6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICAgIExPRyhJTkZPLCAiR290IGFub3RoZXIgYXV0byBwYWNrZXRcbiIpOworICAgIH0KKyAgICBMT0coSU5GTywgIlN0YXJ0aW5nIGF1dG8gbW9kZVxuIik7CisgICAgOjphb3M6OnRpbWU6OlRpbWUgc3RhcnRfdGltZSA9IDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKTsKKyAgICA6OmJvdDM6OmF1dG9ub21vdXM6OkhhbmRsZUF1dG8oKTsKKworICAgIDo6YW9zOjp0aW1lOjpUaW1lIGVsYXBzZWRfdGltZSA9IDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKSAtIHN0YXJ0X3RpbWU7CisgICAgTE9HKElORk8sICJBdXRvIG1vZGUgZXhpdGVkIGluICVmLCB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2guXG4iLAorICAgICAgICBlbGFwc2VkX3RpbWUuVG9TZWNvbmRzKCkpOworICAgIHdoaWxlICg6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMtPnJ1bl9hdXRvKSB7CisgICAgICA6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICAgIExPRyhJTkZPLCAiR290IGFub3RoZXIgYXV0byBwYWNrZXRcbiIpOworICAgIH0KKyAgICBMT0coSU5GTywgIldhaXRpbmcgZm9yIGF1dG8gdG8gc3RhcnQgYmFjayB1cC5cbiIpOworICB9CisgIDo6YW9zOjpDbGVhbnVwKCk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9ib3QzL2F1dG9ub21vdXMvYXV0b25vbW91cy5neXAgYi9ib3QzL2F1dG9ub21vdXMvYXV0b25vbW91cy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwZmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cApAQCAtMCwwICsxLDQ2IEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdhdXRvX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWydhdXRvLnEnXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICdib3QzL2F1dG9ub21vdXMnLAorICAgICAgfSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vYW9zL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYXV0b19saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhdXRvLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnYXV0b19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgICAnPChERVBUSCkvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXA6ZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnRyYXBlem9pZF9wcm9maWxlJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAjJzwoREVQVEgpL2ZyYzk3MS9hY3RvcnMvYWN0b3JzLmd5cDpkcml2ZXRyYWluX2FjdGlvbl9saWInLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYXV0b19ib3QzJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhdXRvX21haW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJ2F1dG9fcXVldWUnLAorICAgICAgICAnYXV0b19saWInLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvYm90My9ib3QzLmd5cCBiL2JvdDMvYm90My5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5NGY1MwotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvYm90My5neXAKQEAgLTAsMCArMSwyMyBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnam95c3RpY2tfcmVhZGVyX2JvdDMnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2pveXN0aWNrX3JlYWRlci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9wcmltZS9pbnB1dC9pbnB1dC5neXA6am95c3RpY2tfaW5wdXQnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpsb2dfaW50ZXJ2YWwnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvcXVldWVzL3F1ZXVlcy5neXA6Z3lybycsCisgICAgICAgICc8KERFUFRIKS9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL2JvdDMvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cDphdXRvX3F1ZXVlJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uY2MgYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTkxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmNjCkBAIC0wLDAgKzEsNzYyIEBACisjaW5jbHVkZSAiYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9wb2x5dG9wZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29tbW9ubWF0aC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL21hdHJpeF9sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29lcmNlX2dvYWwuaCIKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jaW1fcGxhbnQuaCIKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvcXVldWVzL2d5cm8ucS5oIgorI2luY2x1ZGUgImZyYzk3MS9zaGlmdGVyX2hhbGxfZWZmZWN0LmgiCisjaW5jbHVkZSAiYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaCIKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaCIKKworLy8gQSBjb25zaXN0ZW50IHdheSB0byBtYXJrIGNvZGUgdGhhdCBnb2VzIGF3YXkgd2l0aG91dCBzaGlmdGVycy4KKyNkZWZpbmUgSEFWRV9TSElGVEVSUyAwCisKK3VzaW5nIDo6ZnJjOTcxOjpzZW5zb3JzOjpneXJvX3JlYWRpbmc7CisKK25hbWVzcGFjZSBib3QzIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworY2xhc3MgRHJpdmV0cmFpbk1vdG9yc1NTIHsKKyBwdWJsaWM6CisgIGNsYXNzIExpbWl0ZWREcml2ZXRyYWluTG9vcCA6IHB1YmxpYyBTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPiB7CisgICBwdWJsaWM6CisgICAgTGltaXRlZERyaXZldHJhaW5Mb29wKFN0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+ICYmbG9vcCkKKyAgICAgICAgOiBTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPig6OnN0ZDo6bW92ZShsb29wKSksCisgICAgICAgICAgVV9Qb2x5XygoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+KCkgPDwgMSwgMCwgLTEsIDAsIDAsIDEsIDAsIC0xKQorICAgICAgICAgICAgICAgICAgICAgIC5maW5pc2hlZCgpLAorICAgICAgICAgICAgICAgICAgKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPigpIDw8IDEyLjAsIDEyLjAsIDEyLjAsIDEyLjApCisgICAgICAgICAgICAgICAgICAgICAgLmZpbmlzaGVkKCkpIHsKKyAgICAgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDA+OjpJbml0KCk7CisgICAgICBUIDw8IDEsIC0xLCAxLCAxOworICAgICAgVF9pbnZlcnNlID0gVC5pbnZlcnNlKCk7CisgICAgfQorCisgICAgYm9vbCBvdXRwdXRfd2FzX2NhcHBlZCgpIGNvbnN0IHsgcmV0dXJuIG91dHB1dF93YXNfY2FwcGVkXzsgfQorCisgICBwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCBDYXBVKCkgeworICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IGVycm9yID0gUigpIC0gWF9oYXQoKTsKKworICAgICAgaWYgKDo6c3RkOjphYnMoVSgwLCAwKSkgPiAxMi4wIHx8IDo6c3RkOjphYnMoVSgxLCAwKSkgPiAxMi4wKSB7CisgICAgICAgIG11dGFibGVfVSgpID0KKyAgICAgICAgICAgIFUoKSAqIDEyLjAgLyA6OnN0ZDo6bWF4KDo6c3RkOjphYnMoVSgwLCAwKSksIDo6c3RkOjphYnMoVSgxLCAwKSkpOworICAgICAgICBMT0dfTUFUUklYKERFQlVHLCAiVSBpcyBub3ciLCBVKCkpOworICAgICAgICAvLyBUT0RPKEF1c3Rpbik6IEZpZ3VyZSBvdXQgd2h5IHRoZSBwb2x5dG9wZSBzdHVmZiB3YXNuJ3Qgd29ya2luZyBhbmQKKyAgICAgICAgLy8gcmVtb3ZlIHRoaXMgaGFjay4KKyAgICAgICAgb3V0cHV0X3dhc19jYXBwZWRfID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworCisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJVIGF0IHN0YXJ0IiwgVSgpKTsKKyAgICAgICAgTE9HX01BVFJJWChERUJVRywgIlIgYXQgc3RhcnQiLCBSKCkpOworICAgICAgICBMT0dfTUFUUklYKERFQlVHLCAiWGhhdCBhdCBzdGFydCIsIFhfaGF0KCkpOworCisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBwb3NpdGlvbl9LOworICAgICAgICBwb3NpdGlvbl9LIDw8IEsoMCwgMCksIEsoMCwgMiksIEsoMSwgMCksIEsoMSwgMik7CisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiB2ZWxvY2l0eV9LOworICAgICAgICB2ZWxvY2l0eV9LIDw8IEsoMCwgMSksIEsoMCwgMyksIEsoMSwgMSksIEsoMSwgMyk7CisKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHBvc2l0aW9uX2Vycm9yOworICAgICAgICBwb3NpdGlvbl9lcnJvciA8PCBlcnJvcigwLCAwKSwgZXJyb3IoMiwgMCk7CisgICAgICAgIGNvbnN0IGF1dG8gZHJpdmVfZXJyb3IgPSBUX2ludmVyc2UgKiBwb3NpdGlvbl9lcnJvcjsKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHZlbG9jaXR5X2Vycm9yOworICAgICAgICB2ZWxvY2l0eV9lcnJvciA8PCBlcnJvcigxLCAwKSwgZXJyb3IoMywgMCk7CisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJlcnJvciIsIGVycm9yKTsKKworICAgICAgICBjb25zdCBhdXRvICZwb2x5ID0gVV9Qb2x5XzsKKyAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IHBvc19wb2x5X0ggPQorICAgICAgICAgICAgcG9seS5IKCkgKiBwb3NpdGlvbl9LICogVDsKKyAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IHBvc19wb2x5X2sgPQorICAgICAgICAgICAgcG9seS5rKCkgLSBwb2x5LkgoKSAqIHZlbG9jaXR5X0sgKiB2ZWxvY2l0eV9lcnJvcjsKKyAgICAgICAgY29uc3QgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gcG9zX3BvbHkocG9zX3BvbHlfSCwgcG9zX3BvbHlfayk7CisKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGFkanVzdGVkX3Bvc19lcnJvcjsKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGF1dG8gJlAgPSBkcml2ZV9lcnJvcjsKKworICAgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBMNDU7CisgICAgICAgICAgTDQ1IDw8IDo6YW9zOjpzaWduKFAoMSwgMCkpLCAtOjphb3M6OnNpZ24oUCgwLCAwKSk7CisgICAgICAgICAgY29uc3QgZG91YmxlIHc0NSA9IDA7CisKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gTEg7CisgICAgICAgICAgaWYgKDo6c3RkOjphYnMoUCgwLCAwKSkgPiA6OnN0ZDo6YWJzKFAoMSwgMCkpKSB7CisgICAgICAgICAgICBMSCA8PCAwLCAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMSCA8PCAxLCAwOworICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdCBkb3VibGUgd2ggPSBMSC5kb3QoUCk7CisKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gc3RhbmRhcmQ7CisgICAgICAgICAgc3RhbmRhcmQgPDwgTDQ1LCBMSDsKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVzsKKyAgICAgICAgICBXIDw8IHc0NSwgd2g7CisgICAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGludGVyc2VjdGlvbiA9CisgICAgICAgICAgICAgIHN0YW5kYXJkLmludmVyc2UoKSAqIFc7CisKKyAgICAgICAgICBib29sIGlzX2luc2lkZV9oOworICAgICAgICAgIGNvbnN0IGF1dG8gYWRqdXN0ZWRfcG9zX2Vycm9yX2ggPSBmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRvQ29lcmNlR29hbCgKKyAgICAgICAgICAgICAgcG9zX3BvbHksIExILCB3aCwgZHJpdmVfZXJyb3IsICZpc19pbnNpZGVfaCk7CisgICAgICAgICAgY29uc3QgYXV0byBhZGp1c3RlZF9wb3NfZXJyb3JfNDUgPQorICAgICAgICAgICAgICBmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRvQ29lcmNlR29hbChwb3NfcG9seSwgTDQ1LCB3NDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbiwgbnVsbHB0cik7CisgICAgICAgICAgaWYgKHBvc19wb2x5LklzSW5zaWRlKGludGVyc2VjdGlvbikpIHsKKyAgICAgICAgICAgIGFkanVzdGVkX3Bvc19lcnJvciA9IGFkanVzdGVkX3Bvc19lcnJvcl9oOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXNfaW5zaWRlX2gpIHsKKyAgICAgICAgICAgICAgaWYgKGFkanVzdGVkX3Bvc19lcnJvcl9oLm5vcm0oKSA+IGFkanVzdGVkX3Bvc19lcnJvcl80NS5ub3JtKCkpIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZF9wb3NfZXJyb3IgPSBhZGp1c3RlZF9wb3NfZXJyb3JfaDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZF9wb3NfZXJyb3IgPSBhZGp1c3RlZF9wb3NfZXJyb3JfNDU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGFkanVzdGVkX3Bvc19lcnJvciA9IGFkanVzdGVkX3Bvc19lcnJvcl80NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMT0dfTUFUUklYKERFQlVHLCAiYWRqdXN0ZWRfcG9zX2Vycm9yIiwgYWRqdXN0ZWRfcG9zX2Vycm9yKTsKKyAgICAgICAgbXV0YWJsZV9VKCkgPQorICAgICAgICAgICAgdmVsb2NpdHlfSyAqIHZlbG9jaXR5X2Vycm9yICsgcG9zaXRpb25fSyAqIFQgKiBhZGp1c3RlZF9wb3NfZXJyb3I7CisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJVIGlzIG5vdyIsIFUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRfd2FzX2NhcHBlZF8gPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCA6OmFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwyPiBVX1BvbHlfOworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBULCBUX2ludmVyc2U7CisgICAgYm9vbCBvdXRwdXRfd2FzX2NhcHBlZF8gPSBmYWxzZTsKKyAgICA7CisgIH07CisKKyAgRHJpdmV0cmFpbk1vdG9yc1NTKCkKKyAgICAgIDogbG9vcF8obmV3IExpbWl0ZWREcml2ZXRyYWluTG9vcCgKKyAgICAgICAgICAgIDo6Ym90Mzo6Y29udHJvbF9sb29wczo6TWFrZURyaXZldHJhaW5Mb29wKCkpKSwKKyAgICAgICAgZmlsdGVyZWRfb2Zmc2V0XygwLjApLAorICAgICAgICBneXJvXygwLjApLAorICAgICAgICBsZWZ0X2dvYWxfKDAuMCksCisgICAgICAgIHJpZ2h0X2dvYWxfKDAuMCksCisgICAgICAgIHJhd19sZWZ0XygwLjApLAorICAgICAgICByYXdfcmlnaHRfKDAuMCkgeworICAgIC8vIExvdyBnZWFyIG9uIGJvdGguCisgICAgbG9vcF8tPnNldF9jb250cm9sbGVyX2luZGV4KDApOworICB9CisKKyAgdm9pZCBTZXRHb2FsKGRvdWJsZSBsZWZ0LCBkb3VibGUgbGVmdF92ZWxvY2l0eSwgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0X3ZlbG9jaXR5KSB7CisgICAgbGVmdF9nb2FsXyA9IGxlZnQ7CisgICAgcmlnaHRfZ29hbF8gPSByaWdodDsKKyAgICBsb29wXy0+bXV0YWJsZV9SKCkgPDwgbGVmdCwgbGVmdF92ZWxvY2l0eSwgcmlnaHQsIHJpZ2h0X3ZlbG9jaXR5OworICB9CisgIHZvaWQgU2V0UmF3UG9zaXRpb24oZG91YmxlIGxlZnQsIGRvdWJsZSByaWdodCkgeworICAgIHJhd19yaWdodF8gPSByaWdodDsKKyAgICByYXdfbGVmdF8gPSBsZWZ0OworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBZOworICAgIFkgPDwgbGVmdCArIGZpbHRlcmVkX29mZnNldF8sIHJpZ2h0IC0gZmlsdGVyZWRfb2Zmc2V0XzsKKyAgICBsb29wXy0+Q29ycmVjdChZKTsKKyAgfQorICB2b2lkIFNldFBvc2l0aW9uKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBneXJvKSB7CisgICAgLy8gRGVjYXkgdGhlIG9mZnNldCBxdWlja2x5IGJlY2F1c2UgdGhpcyBneXJvIGlzIGdyZWF0LgorICAgIGNvbnN0IGRvdWJsZSBvZmZzZXQgPSAocmlnaHQgLSBsZWZ0IC0gZ3lybyAqIGtEcml2ZXRyYWluVHVybldpZHRoKSAvIDIuMDsKKyAgICBmaWx0ZXJlZF9vZmZzZXRfID0gMC4yNSAqIG9mZnNldCArIDAuNzUgKiBmaWx0ZXJlZF9vZmZzZXRfOworICAgIGd5cm9fID0gZ3lybzsKKyAgICBTZXRSYXdQb3NpdGlvbihsZWZ0LCByaWdodCk7CisgIH0KKworICB2b2lkIFNldEV4dGVybmFsTW90b3JzKGRvdWJsZSBsZWZ0X3ZvbHRhZ2UsIGRvdWJsZSByaWdodF92b2x0YWdlKSB7CisgICAgbG9vcF8tPm11dGFibGVfVSgpIDw8IGxlZnRfdm9sdGFnZSwgcmlnaHRfdm9sdGFnZTsKKyAgfQorCisgIHZvaWQgVXBkYXRlKGJvb2wgc3RvcF9tb3RvcnMsIGJvb2wgZW5hYmxlX2NvbnRyb2xfbG9vcCkgeworICAgIGlmIChlbmFibGVfY29udHJvbF9sb29wKSB7CisgICAgICBsb29wXy0+VXBkYXRlKHN0b3BfbW90b3JzKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHN0b3BfbW90b3JzKSB7CisgICAgICAgIGxvb3BfLT5tdXRhYmxlX1UoKS5zZXRaZXJvKCk7CisgICAgICAgIGxvb3BfLT5tdXRhYmxlX1VfdW5jYXBwZWQoKS5zZXRaZXJvKCk7CisgICAgICB9CisgICAgICBsb29wXy0+VXBkYXRlT2JzZXJ2ZXIoKTsKKyAgICB9CisgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMT4gRSA9IGxvb3BfLT5SKCkgLSBsb29wXy0+WF9oYXQoKTsKKyAgICBMT0dfTUFUUklYKERFQlVHLCAiRSIsIEUpOworICB9CisKKyAgZG91YmxlIEdldEVzdGltYXRlZFJvYm90U3BlZWQoKSBjb25zdCB7CisgICAgLy8gbGV0cyBqdXN0IGNhbGwgdGhlIGF2ZXJhZ2Ugb2YgbGVmdCBhbmQgcmlnaHQgdmVsb2NpdGllcyBjbG9zZSBlbm91Z2gKKyAgICByZXR1cm4gKGxvb3BfLT5YX2hhdCgxLCAwKSArIGxvb3BfLT5YX2hhdCgzLCAwKSkgLyAyOworICB9CisKKyAgZG91YmxlIEdldEVzdGltYXRlZExlZnRFbmNvZGVyKCkgY29uc3QgeyByZXR1cm4gbG9vcF8tPlhfaGF0KDAsIDApOyB9CisKKyAgZG91YmxlIEdldEVzdGltYXRlZFJpZ2h0RW5jb2RlcigpIGNvbnN0IHsgcmV0dXJuIGxvb3BfLT5YX2hhdCgyLCAwKTsgfQorCisgIGJvb2wgT3V0cHV0V2FzQ2FwcGVkKCkgY29uc3QgeyByZXR1cm4gbG9vcF8tPm91dHB1dF93YXNfY2FwcGVkKCk7IH0KKworICB2b2lkIFNlbmRNb3RvcnMoRHJpdmV0cmFpblF1ZXVlOjpPdXRwdXQgKm91dHB1dCkgY29uc3QgeworICAgIGlmIChvdXRwdXQpIHsKKyAgICAgIG91dHB1dC0+bGVmdF92b2x0YWdlID0gbG9vcF8tPlUoMCwgMCk7CisgICAgICBvdXRwdXQtPnJpZ2h0X3ZvbHRhZ2UgPSBsb29wXy0+VSgxLCAwKTsKKyAgICAgIG91dHB1dC0+bGVmdF9oaWdoID0gZmFsc2U7CisgICAgICBvdXRwdXQtPnJpZ2h0X2hpZ2ggPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBjb25zdCBMaW1pdGVkRHJpdmV0cmFpbkxvb3AgJmxvb3AoKSBjb25zdCB7IHJldHVybiAqbG9vcF87IH0KKworIHByaXZhdGU6CisgIDo6c3RkOjp1bmlxdWVfcHRyPExpbWl0ZWREcml2ZXRyYWluTG9vcD4gbG9vcF87CisKKyAgZG91YmxlIGZpbHRlcmVkX29mZnNldF87CisgIGRvdWJsZSBneXJvXzsKKyAgZG91YmxlIGxlZnRfZ29hbF87CisgIGRvdWJsZSByaWdodF9nb2FsXzsKKyAgZG91YmxlIHJhd19sZWZ0XzsKKyAgZG91YmxlIHJhd19yaWdodF87Cit9OworCitjbGFzcyBQb2x5RHJpdmV0cmFpbiB7CisgcHVibGljOgorICBlbnVtIEdlYXIgeyBISUdILCBMT1csIFNISUZUSU5HX1VQLCBTSElGVElOR19ET1dOIH07CisgIC8vIFN0YWxsIFRvcnF1ZSBpbiBOIG0KKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1N0YWxsVG9ycXVlID0gMi40MjsKKyAgLy8gU3RhbGwgQ3VycmVudCBpbiBBbXBzCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtTdGFsbEN1cnJlbnQgPSAxMzMuMDsKKyAgLy8gRnJlZSBTcGVlZCBpbiBSUE0uIFVzZWQgbnVtYmVyIGZyb20gbGFzdCB5ZWFyLgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRnJlZVNwZWVkID0gNDY1MC4wOworICAvLyBGcmVlIEN1cnJlbnQgaW4gQW1wcworICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRnJlZUN1cnJlbnQgPSAyLjc7CisgIC8vIE1vbWVudCBvZiBpbmVydGlhIG9mIHRoZSBkcml2ZXRyYWluIGluIGtnIG1eMgorICAvLyBKdXN0IGJvcnJvd2VkIGZyb20gbGFzdCB5ZWFyLgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBKID0gMTA7CisgIC8vIE1hc3Mgb2YgdGhlIHJvYm90LCBpbiBrZy4KKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUgbSA9IDY4OworICAvLyBSYWRpdXMgb2YgdGhlIHJvYm90LCBpbiBtZXRlcnMgKGZyb20gbGFzdCB5ZWFyKS4KKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUgcmIgPSAwLjk2MDMgLyAyLjA7CisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtXaGVlbFJhZGl1cyA9IDAuMDUxNTkzODsKKyAgLy8gUmVzaXN0YW5jZSBvZiB0aGUgbW90b3IsIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBtb3RvcnMuCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtSID0KKyAgICAgICgxMi4wIC8ga1N0YWxsQ3VycmVudCAvIDIgKyAwLjAzKSAvICgwLjkzICogMC45Myk7CisgIC8vIE1vdG9yIHZlbG9jaXR5IGNvbnN0YW50CisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIEt2ID0KKyAgICAgICgoa0ZyZWVTcGVlZCAvIDYwLjAgKiAyLjAgKiBNX1BJKSAvICgxMi4wIC0ga1IgKiBrRnJlZUN1cnJlbnQpKTsKKyAgLy8gVG9ycXVlIGNvbnN0YW50CisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIEt0ID0ga1N0YWxsVG9ycXVlIC8ga1N0YWxsQ3VycmVudDsKKworICBQb2x5RHJpdmV0cmFpbigpCisgICAgICA6IFVfUG9seV8oKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPigpIDw8IC8qW1sqLyAxLCAwIC8qXSovLAorICAgICAgICAgICAgICAgICAvKlsqLyAtMSwgMCAvKl0qLywKKyAgICAgICAgICAgICAgICAgLypbKi8gMCwgMSAvKl0qLywKKyAgICAgICAgICAgICAgICAgLypbKi8gMCwgLTEgLypdXSovKS5maW5pc2hlZCgpLAorICAgICAgICAgICAgICAgIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMT4oKSA8PCAvKltbKi8gMTIgLypdKi8sCisgICAgICAgICAgICAgICAgIC8qWyovIDEyIC8qXSovLAorICAgICAgICAgICAgICAgICAvKlsqLyAxMiAvKl0qLywKKyAgICAgICAgICAgICAgICAgLypbKi8gMTIgLypdXSovKS5maW5pc2hlZCgpKSwKKyAgICAgICAgbG9vcF8obmV3IFN0YXRlRmVlZGJhY2tMb29wPDIsIDIsIDI+KAorICAgICAgICAgICAgOjpib3QzOjpjb250cm9sX2xvb3BzOjpNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG9vcCgpKSksCisgICAgICAgIHR0cnVzdF8oMS4xKSwKKyAgICAgICAgd2hlZWxfKDAuMCksCisgICAgICAgIHRocm90dGxlXygwLjApLAorICAgICAgICBxdWlja3R1cm5fKGZhbHNlKSwKKyAgICAgICAgc3RhbGVfY291bnRfKDApLAorICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXygwLjAxKSwKKyAgICAgICAgbGVmdF9nZWFyXyhMT1cpLAorICAgICAgICByaWdodF9nZWFyXyhMT1cpLAorICAgICAgICBjb3VudGVyXygwKSB7CisgICAgbGFzdF9wb3NpdGlvbl8uWmVybygpOworICAgIHBvc2l0aW9uXy5aZXJvKCk7CisgIH0KKyAgc3RhdGljIGJvb2wgSXNJbkdlYXIoR2VhciBnZWFyKSB7IHJldHVybiBnZWFyID09IExPVyB8fCBnZWFyID09IEhJR0g7IH0KKworICBzdGF0aWMgZG91YmxlIE1vdG9yU3BlZWQoCisgICAgICBjb25zdCBmcmM5NzE6OmNvbnN0YW50czo6U2hpZnRlckhhbGxFZmZlY3QgJmhhbGxfZWZmZWN0LAorICAgICAgZG91YmxlIHNoaWZ0ZXJfcG9zaXRpb24sIGRvdWJsZSB2ZWxvY2l0eSkgeworICAgIC8vIFRPRE8oYXVzdGluKTogR19oaWdoLCBHX2xvdyBhbmQga1doZWVsUmFkaXVzCisgICAgY29uc3QgZG91YmxlIGF2Z19oYWxsX2VmZmVjdCA9CisgICAgICAgIChoYWxsX2VmZmVjdC5jbGVhcl9oaWdoICsgaGFsbF9lZmZlY3QuY2xlYXJfbG93KSAvIDIuMDsKKworICAgIGlmIChzaGlmdGVyX3Bvc2l0aW9uID4gYXZnX2hhbGxfZWZmZWN0KSB7CisgICAgICByZXR1cm4gdmVsb2NpdHkgLyBrRHJpdmV0cmFpbkhpZ2hHZWFyUmF0aW8gLyBrV2hlZWxSYWRpdXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB2ZWxvY2l0eSAvIGtEcml2ZXRyYWluTG93R2VhclJhdGlvIC8ga1doZWVsUmFkaXVzOworICAgIH0KKyAgfQorCisgIEdlYXIgQ29tcHV0ZUdlYXIoY29uc3QgZnJjOTcxOjpjb25zdGFudHM6OlNoaWZ0ZXJIYWxsRWZmZWN0ICZoYWxsX2VmZmVjdCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgdmVsb2NpdHksIEdlYXIgY3VycmVudCkgeworICAgIGNvbnN0IGRvdWJsZSBsb3dfb21lZ2EgPSBNb3RvclNwZWVkKGhhbGxfZWZmZWN0LCAwLjAsIDo6c3RkOjphYnModmVsb2NpdHkpKTsKKyAgICBjb25zdCBkb3VibGUgaGlnaF9vbWVnYSA9CisgICAgICAgIE1vdG9yU3BlZWQoaGFsbF9lZmZlY3QsIDEuMCwgOjpzdGQ6OmFicyh2ZWxvY2l0eSkpOworCisgICAgZG91YmxlIGhpZ2hfdG9ycXVlID0gKCgxMi4wIC0gaGlnaF9vbWVnYSAvIEt2KSAqIEt0IC8ga1IpOworICAgIGRvdWJsZSBsb3dfdG9ycXVlID0gKCgxMi4wIC0gbG93X29tZWdhIC8gS3YpICogS3QgLyBrUik7CisgICAgZG91YmxlIGhpZ2hfcG93ZXIgPSBoaWdoX3RvcnF1ZSAqIGhpZ2hfb21lZ2E7CisgICAgZG91YmxlIGxvd19wb3dlciA9IGxvd190b3JxdWUgKiBsb3dfb21lZ2E7CisKKyAgICAvLyBUT0RPKGFzY2h1aCk6IERvIHRoaXMgcmlnaHQhCisgICAgaWYgKChjdXJyZW50ID09IEhJR0ggfHwgaGlnaF9wb3dlciA+IGxvd19wb3dlciArIDE2MCkgJiYKKyAgICAgICAgOjpzdGQ6OmFicyh2ZWxvY2l0eSkgPiAwLjE0KSB7CisgICAgICByZXR1cm4gSElHSDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIExPVzsKKyAgICB9CisgIH0KKworICB2b2lkIFNldEdvYWwoZG91YmxlIHdoZWVsLCBkb3VibGUgdGhyb3R0bGUsIGJvb2wgcXVpY2t0dXJuLCBib29sIGhpZ2hnZWFyKSB7CisgICAgY29uc3QgZG91YmxlIGtXaGVlbE5vbkxpbmVhcml0eSA9IDAuNTsKKyAgICAvLyBBcHBseSBhIHNpbiBmdW5jdGlvbiB0aGF0J3Mgc2NhbGVkIHRvIG1ha2UgaXQgZmVlbCBiZXR0ZXIuCisgICAgY29uc3QgZG91YmxlIGFuZ3VsYXJfcmFuZ2UgPSBNX1BJXzIgKiBrV2hlZWxOb25MaW5lYXJpdHk7CisKKyAgICB3aGVlbF8gPSBzaW4oYW5ndWxhcl9yYW5nZSAqIHdoZWVsKSAvIHNpbihhbmd1bGFyX3JhbmdlKTsKKyAgICB3aGVlbF8gPSBzaW4oYW5ndWxhcl9yYW5nZSAqIHdoZWVsXykgLyBzaW4oYW5ndWxhcl9yYW5nZSk7CisgICAgd2hlZWxfICo9IDIuMzsKKyAgICBxdWlja3R1cm5fID0gcXVpY2t0dXJuOworCisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrVGhyb3R0bGVEZWFkYmFuZCA9IDAuMDU7CisgICAgaWYgKDo6c3RkOjphYnModGhyb3R0bGUpIDwga1Rocm90dGxlRGVhZGJhbmQpIHsKKyAgICAgIHRocm90dGxlXyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm90dGxlXyA9IGNvcHlzaWduKCg6OnN0ZDo6YWJzKHRocm90dGxlKSAtIGtUaHJvdHRsZURlYWRiYW5kKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEuMCAtIGtUaHJvdHRsZURlYWRiYW5kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlKTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGF1c3Rpbik6IEZpeCB0aGUgdXBzaGlmdCBsb2dpYyB0byBpbmNsdWRlIHN0YXRlcy4KKyAgICBHZWFyIHJlcXVlc3RlZF9nZWFyOworICAgIGlmIChmYWxzZSkgeworICAgICAgY29uc3QgZG91YmxlIGN1cnJlbnRfbGVmdF92ZWxvY2l0eSA9CisgICAgICAgICAgKHBvc2l0aW9uXy5sZWZ0X2VuY29kZXIgLSBsYXN0X3Bvc2l0aW9uXy5sZWZ0X2VuY29kZXIpIC8KKyAgICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXzsKKyAgICAgIGNvbnN0IGRvdWJsZSBjdXJyZW50X3JpZ2h0X3ZlbG9jaXR5ID0KKyAgICAgICAgICAocG9zaXRpb25fLnJpZ2h0X2VuY29kZXIgLSBsYXN0X3Bvc2l0aW9uXy5yaWdodF9lbmNvZGVyKSAvCisgICAgICAgICAgcG9zaXRpb25fdGltZV9kZWx0YV87CisKKyAgICAgIEdlYXIgbGVmdF9yZXF1ZXN0ZWQgPSBDb21wdXRlR2VhcihrRHJpdmV0cmFpbkxlZnRTaGlmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbGVmdF92ZWxvY2l0eSwgbGVmdF9nZWFyXyk7CisgICAgICBHZWFyIHJpZ2h0X3JlcXVlc3RlZCA9IENvbXB1dGVHZWFyKGtEcml2ZXRyYWluUmlnaHRTaGlmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3JpZ2h0X3ZlbG9jaXR5LCByaWdodF9nZWFyXyk7CisgICAgICByZXF1ZXN0ZWRfZ2VhciA9CisgICAgICAgICAgKGxlZnRfcmVxdWVzdGVkID09IEhJR0ggfHwgcmlnaHRfcmVxdWVzdGVkID09IEhJR0gpID8gSElHSCA6IExPVzsKKyAgICB9IGVsc2UgeworICAgICAgcmVxdWVzdGVkX2dlYXIgPSBoaWdoZ2VhciA/IEhJR0ggOiBMT1c7CisgICAgfQorCisgICAgY29uc3QgR2VhciBzaGlmdF91cCA9IGtEcml2ZXRyYWluQ2x1dGNoVHJhbnNtaXNzaW9uID8gSElHSCA6IFNISUZUSU5HX1VQOworICAgIGNvbnN0IEdlYXIgc2hpZnRfZG93biA9IGtEcml2ZXRyYWluQ2x1dGNoVHJhbnNtaXNzaW9uID8gTE9XIDogU0hJRlRJTkdfRE9XTjsKKworICAgIGlmIChsZWZ0X2dlYXJfICE9IHJlcXVlc3RlZF9nZWFyKSB7CisgICAgICBpZiAoSXNJbkdlYXIobGVmdF9nZWFyXykpIHsKKyAgICAgICAgaWYgKHJlcXVlc3RlZF9nZWFyID09IEhJR0gpIHsKKyAgICAgICAgICBsZWZ0X2dlYXJfID0gc2hpZnRfdXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbGVmdF9nZWFyXyA9IHNoaWZ0X2Rvd247CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRfZ2VhciA9PSBISUdIICYmIGxlZnRfZ2Vhcl8gPT0gU0hJRlRJTkdfRE9XTikgeworICAgICAgICAgIGxlZnRfZ2Vhcl8gPSBTSElGVElOR19VUDsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRfZ2VhciA9PSBMT1cgJiYgbGVmdF9nZWFyXyA9PSBTSElGVElOR19VUCkgeworICAgICAgICAgIGxlZnRfZ2Vhcl8gPSBTSElGVElOR19ET1dOOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChyaWdodF9nZWFyXyAhPSByZXF1ZXN0ZWRfZ2VhcikgeworICAgICAgaWYgKElzSW5HZWFyKHJpZ2h0X2dlYXJfKSkgeworICAgICAgICBpZiAocmVxdWVzdGVkX2dlYXIgPT0gSElHSCkgeworICAgICAgICAgIHJpZ2h0X2dlYXJfID0gc2hpZnRfdXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmlnaHRfZ2Vhcl8gPSBzaGlmdF9kb3duOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocmVxdWVzdGVkX2dlYXIgPT0gSElHSCAmJiByaWdodF9nZWFyXyA9PSBTSElGVElOR19ET1dOKSB7CisgICAgICAgICAgcmlnaHRfZ2Vhcl8gPSBTSElGVElOR19VUDsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRfZ2VhciA9PSBMT1cgJiYgcmlnaHRfZ2Vhcl8gPT0gU0hJRlRJTkdfVVApIHsKKyAgICAgICAgICByaWdodF9nZWFyXyA9IFNISUZUSU5HX0RPV047CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBTZXRQb3NpdGlvbihjb25zdCBEcml2ZXRyYWluUXVldWU6OlBvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChwb3NpdGlvbiA9PSBOVUxMKSB7CisgICAgICArK3N0YWxlX2NvdW50XzsKKyAgICB9IGVsc2UgeworICAgICAgbGFzdF9wb3NpdGlvbl8gPSBwb3NpdGlvbl87CisgICAgICBwb3NpdGlvbl8gPSAqcG9zaXRpb247CisgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXyA9IChzdGFsZV9jb3VudF8gKyAxKSAqIDAuMDE7CisgICAgICBzdGFsZV9jb3VudF8gPSAwOworICAgIH0KKworI2lmIEhBVkVfU0hJRlRFUlMKKyAgICBpZiAocG9zaXRpb24pIHsKKyAgICAgIEdlYXJMb2dnaW5nIGdlYXJfbG9nZ2luZzsKKyAgICAgIC8vIFN3aXRjaCB0byB0aGUgY29ycmVjdCBjb250cm9sbGVyLgorICAgICAgY29uc3QgZG91YmxlIGxlZnRfbWlkZGxlX3NoaWZ0ZXJfcG9zaXRpb24gPQorICAgICAgICAgIChrRHJpdmV0cmFpbkxlZnRTaGlmdGVyLmNsZWFyX2hpZ2ggKworICAgICAgICAgICBrRHJpdmV0cmFpbkxlZnRTaGlmdGVyLmNsZWFyX2xvdykgLworICAgICAgICAgIDIuMDsKKyAgICAgIGNvbnN0IGRvdWJsZSByaWdodF9taWRkbGVfc2hpZnRlcl9wb3NpdGlvbiA9CisgICAgICAgICAgKGtEcml2ZXRyYWluUmlnaHRTaGlmdGVyLmNsZWFyX2hpZ2ggKworICAgICAgICAgICBrRHJpdmV0cmFpblJpZ2h0U2hpZnRlci5jbGVhcl9sb3cpIC8KKyAgICAgICAgICAyLjA7CisKKyAgICAgIGlmIChwb3NpdGlvbi0+bGVmdF9zaGlmdGVyX3Bvc2l0aW9uIDwgbGVmdF9taWRkbGVfc2hpZnRlcl9wb3NpdGlvbiB8fAorICAgICAgICAgIGxlZnRfZ2Vhcl8gPT0gTE9XKSB7CisgICAgICAgIGlmIChwb3NpdGlvbi0+cmlnaHRfc2hpZnRlcl9wb3NpdGlvbiA8IHJpZ2h0X21pZGRsZV9zaGlmdGVyX3Bvc2l0aW9uIHx8CisgICAgICAgICAgICByaWdodF9nZWFyXyA9PSBMT1cpIHsKKyAgICAgICAgICBnZWFyX2xvZ2dpbmcubGVmdF9sb29wX2hpZ2ggPSBmYWxzZTsKKyAgICAgICAgICBnZWFyX2xvZ2dpbmcucmlnaHRfbG9vcF9oaWdoID0gZmFsc2U7CisgICAgICAgICAgbG9vcF8tPnNldF9jb250cm9sbGVyX2luZGV4KGdlYXJfbG9nZ2luZy5jb250cm9sbGVyX2luZGV4ID0gMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2Vhcl9sb2dnaW5nLmxlZnRfbG9vcF9oaWdoID0gZmFsc2U7CisgICAgICAgICAgZ2Vhcl9sb2dnaW5nLnJpZ2h0X2xvb3BfaGlnaCA9IHRydWU7CisgICAgICAgICAgbG9vcF8tPnNldF9jb250cm9sbGVyX2luZGV4KGdlYXJfbG9nZ2luZy5jb250cm9sbGVyX2luZGV4ID0gMSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwb3NpdGlvbi0+cmlnaHRfc2hpZnRlcl9wb3NpdGlvbiA8IHJpZ2h0X21pZGRsZV9zaGlmdGVyX3Bvc2l0aW9uIHx8CisgICAgICAgICAgICByaWdodF9nZWFyXyA9PSBMT1cpIHsKKyAgICAgICAgICBnZWFyX2xvZ2dpbmcubGVmdF9sb29wX2hpZ2ggPSB0cnVlOworICAgICAgICAgIGdlYXJfbG9nZ2luZy5yaWdodF9sb29wX2hpZ2ggPSBmYWxzZTsKKyAgICAgICAgICBsb29wXy0+c2V0X2NvbnRyb2xsZXJfaW5kZXgoZ2Vhcl9sb2dnaW5nLmNvbnRyb2xsZXJfaW5kZXggPSAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZWFyX2xvZ2dpbmcubGVmdF9sb29wX2hpZ2ggPSB0cnVlOworICAgICAgICAgIGdlYXJfbG9nZ2luZy5yaWdodF9sb29wX2hpZ2ggPSB0cnVlOworICAgICAgICAgIGxvb3BfLT5zZXRfY29udHJvbGxlcl9pbmRleChnZWFyX2xvZ2dpbmcuY29udHJvbGxlcl9pbmRleCA9IDMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRPRE8oYXVzdGluKTogQ29uc3RhbnRzLgorICAgICAgaWYgKHBvc2l0aW9uLT5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24gPiBrRHJpdmV0cmFpbkxlZnRTaGlmdGVyLmNsZWFyX2hpZ2ggJiYKKyAgICAgICAgICBsZWZ0X2dlYXJfID09IFNISUZUSU5HX1VQKSB7CisgICAgICAgIGxlZnRfZ2Vhcl8gPSBISUdIOworICAgICAgfQorICAgICAgaWYgKHBvc2l0aW9uLT5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24gPCBrRHJpdmV0cmFpbkxlZnRTaGlmdGVyLmNsZWFyX2xvdyAmJgorICAgICAgICAgIGxlZnRfZ2Vhcl8gPT0gU0hJRlRJTkdfRE9XTikgeworICAgICAgICBsZWZ0X2dlYXJfID0gTE9XOworICAgICAgfQorICAgICAgaWYgKHBvc2l0aW9uLT5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID4KKyAgICAgICAgICAgICAga0RyaXZldHJhaW5SaWdodFNoaWZ0ZXIuY2xlYXJfaGlnaCAmJgorICAgICAgICAgIHJpZ2h0X2dlYXJfID09IFNISUZUSU5HX1VQKSB7CisgICAgICAgIHJpZ2h0X2dlYXJfID0gSElHSDsKKyAgICAgIH0KKyAgICAgIGlmIChwb3NpdGlvbi0+cmlnaHRfc2hpZnRlcl9wb3NpdGlvbiA8CisgICAgICAgICAgICAgIGtEcml2ZXRyYWluUmlnaHRTaGlmdGVyLmNsZWFyX2xvdyAmJgorICAgICAgICAgIHJpZ2h0X2dlYXJfID09IFNISUZUSU5HX0RPV04pIHsKKyAgICAgICAgcmlnaHRfZ2Vhcl8gPSBMT1c7CisgICAgICB9CisKKyAgICAgIGdlYXJfbG9nZ2luZy5sZWZ0X3N0YXRlID0gbGVmdF9nZWFyXzsKKyAgICAgIGdlYXJfbG9nZ2luZy5yaWdodF9zdGF0ZSA9IHJpZ2h0X2dlYXJfOworICAgICAgTE9HX1NUUlVDVChERUJVRywgInN0YXRlIiwgZ2Vhcl9sb2dnaW5nKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIGRvdWJsZSBGaWx0ZXJWZWxvY2l0eShkb3VibGUgdGhyb3R0bGUpIHsKKyAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRkYgPQorICAgICAgICBsb29wXy0+QigpLmludmVyc2UoKSAqCisgICAgICAgIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj46OklkZW50aXR5KCkgLSBsb29wXy0+QSgpKTsKKworICAgIGNvbnN0ZXhwciBpbnQga0hpZ2hHZWFyQ29udHJvbGxlciA9IDM7CisgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEZGX2hpZ2ggPQorICAgICAgICBsb29wXy0+Y29udHJvbGxlcihrSGlnaEdlYXJDb250cm9sbGVyKS5wbGFudC5CKCkuaW52ZXJzZSgpICoKKyAgICAgICAgKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPjo6SWRlbnRpdHkoKSAtCisgICAgICAgICBsb29wXy0+Y29udHJvbGxlcihrSGlnaEdlYXJDb250cm9sbGVyKS5wbGFudC5BKCkpOworCisgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gRkZfc3VtID0gRkYuY29sd2lzZSgpLnN1bSgpOworICAgIGludCBtaW5fRkZfc3VtX2luZGV4OworICAgIGNvbnN0IGRvdWJsZSBtaW5fRkZfc3VtID0gRkZfc3VtLm1pbkNvZWZmKCZtaW5fRkZfc3VtX2luZGV4KTsKKyAgICBjb25zdCBkb3VibGUgbWluX0tfc3VtID0gbG9vcF8tPksoKS5jb2wobWluX0ZGX3N1bV9pbmRleCkuc3VtKCk7CisgICAgY29uc3QgZG91YmxlIGhpZ2hfbWluX0ZGX3N1bSA9IEZGX2hpZ2guY29sKDApLnN1bSgpOworCisgICAgY29uc3QgZG91YmxlIGFkanVzdGVkX2ZmX3ZvbHRhZ2UgPSA6OmFvczo6Q2xpcCgKKyAgICAgICAgdGhyb3R0bGUgKiAxMi4wICogbWluX0ZGX3N1bSAvIGhpZ2hfbWluX0ZGX3N1bSwgLTEyLjAsIDEyLjApOworICAgIHJldHVybiAoYWRqdXN0ZWRfZmZfdm9sdGFnZSArCisgICAgICAgICAgICB0dHJ1c3RfICogbWluX0tfc3VtICogKGxvb3BfLT5YX2hhdCgwLCAwKSArIGxvb3BfLT5YX2hhdCgxLCAwKSkgLworICAgICAgICAgICAgICAgIDIuMCkgLworICAgICAgICAgICAodHRydXN0XyAqIG1pbl9LX3N1bSArIG1pbl9GRl9zdW0pOworICB9CisKKyAgZG91YmxlIE1heFZlbG9jaXR5KCkgeworICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBGRiA9CisgICAgICAgIGxvb3BfLT5CKCkuaW52ZXJzZSgpICoKKyAgICAgICAgKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPjo6SWRlbnRpdHkoKSAtIGxvb3BfLT5BKCkpOworCisgICAgY29uc3RleHByIGludCBrSGlnaEdlYXJDb250cm9sbGVyID0gMzsKKyAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRkZfaGlnaCA9CisgICAgICAgIGxvb3BfLT5jb250cm9sbGVyKGtIaWdoR2VhckNvbnRyb2xsZXIpLnBsYW50LkIoKS5pbnZlcnNlKCkgKgorICAgICAgICAoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+OjpJZGVudGl0eSgpIC0KKyAgICAgICAgIGxvb3BfLT5jb250cm9sbGVyKGtIaWdoR2VhckNvbnRyb2xsZXIpLnBsYW50LkEoKSk7CisKKyAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBGRl9zdW0gPSBGRi5jb2x3aXNlKCkuc3VtKCk7CisgICAgaW50IG1pbl9GRl9zdW1faW5kZXg7CisgICAgY29uc3QgZG91YmxlIG1pbl9GRl9zdW0gPSBGRl9zdW0ubWluQ29lZmYoJm1pbl9GRl9zdW1faW5kZXgpOworICAgIC8vIGNvbnN0IGRvdWJsZSBtaW5fS19zdW0gPSBsb29wXy0+SygpLmNvbChtaW5fRkZfc3VtX2luZGV4KS5zdW0oKTsKKyAgICBjb25zdCBkb3VibGUgaGlnaF9taW5fRkZfc3VtID0gRkZfaGlnaC5jb2woMCkuc3VtKCk7CisKKyAgICBjb25zdCBkb3VibGUgYWRqdXN0ZWRfZmZfdm9sdGFnZSA9CisgICAgICAgIDo6YW9zOjpDbGlwKDEyLjAgKiBtaW5fRkZfc3VtIC8gaGlnaF9taW5fRkZfc3VtLCAtMTIuMCwgMTIuMCk7CisgICAgcmV0dXJuIGFkanVzdGVkX2ZmX3ZvbHRhZ2UgLyBtaW5fRkZfc3VtOworICB9CisKKyAgdm9pZCBVcGRhdGUoKSB7CisgICAgLy8gVE9ETyhhdXN0aW4pOiBPYnNlcnZlciBmb3IgdGhlIGN1cnJlbnQgdmVsb2NpdHkgaW5zdGVhZCBvZiBkaWZmZXJlbmNlCisgICAgLy8gY2FsY3VsYXRpb25zLgorICAgICsrY291bnRlcl87CisjaWYgSEFWRV9TSElGVEVSUworICAgIGNvbnN0IGRvdWJsZSBjdXJyZW50X2xlZnRfdmVsb2NpdHkgPQorICAgICAgICAocG9zaXRpb25fLmxlZnRfZW5jb2RlciAtIGxhc3RfcG9zaXRpb25fLmxlZnRfZW5jb2RlcikgLworICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXzsKKyAgICBjb25zdCBkb3VibGUgY3VycmVudF9yaWdodF92ZWxvY2l0eSA9CisgICAgICAgIChwb3NpdGlvbl8ucmlnaHRfZW5jb2RlciAtIGxhc3RfcG9zaXRpb25fLnJpZ2h0X2VuY29kZXIpIC8KKyAgICAgICAgcG9zaXRpb25fdGltZV9kZWx0YV87CisgICAgY29uc3QgZG91YmxlIGxlZnRfbW90b3Jfc3BlZWQgPQorICAgICAgICBNb3RvclNwZWVkKGtEcml2ZXRyYWluTGVmdFNoaWZ0ZXIsIHBvc2l0aW9uXy5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgY3VycmVudF9sZWZ0X3ZlbG9jaXR5KTsKKyAgICBjb25zdCBkb3VibGUgcmlnaHRfbW90b3Jfc3BlZWQgPQorICAgICAgICBNb3RvclNwZWVkKGtEcml2ZXRyYWluUmlnaHRTaGlmdGVyLCBwb3NpdGlvbl8ucmlnaHRfc2hpZnRlcl9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBjdXJyZW50X3JpZ2h0X3ZlbG9jaXR5KTsKKworICAgIHsKKyAgICAgIENJTUxvZ2dpbmcgbG9nZ2luZzsKKworICAgICAgLy8gUmVzZXQgdGhlIENJTSBtb2RlbCB0byB0aGUgY3VycmVudCBjb25kaXRpb25zIHRvIGJlIHJlYWR5IGZvciB3aGVuIHdlCisgICAgICAvLyBzaGlmdC4KKyAgICAgIGlmIChJc0luR2VhcihsZWZ0X2dlYXJfKSkgeworICAgICAgICBsb2dnaW5nLmxlZnRfaW5fZ2VhciA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb2dnaW5nLmxlZnRfaW5fZ2VhciA9IGZhbHNlOworICAgICAgfQorICAgICAgbG9nZ2luZy5sZWZ0X21vdG9yX3NwZWVkID0gbGVmdF9tb3Rvcl9zcGVlZDsKKyAgICAgIGxvZ2dpbmcubGVmdF92ZWxvY2l0eSA9IGN1cnJlbnRfbGVmdF92ZWxvY2l0eTsKKyAgICAgIGlmIChJc0luR2VhcihyaWdodF9nZWFyXykpIHsKKyAgICAgICAgbG9nZ2luZy5yaWdodF9pbl9nZWFyID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvZ2dpbmcucmlnaHRfaW5fZ2VhciA9IGZhbHNlOworICAgICAgfQorICAgICAgbG9nZ2luZy5yaWdodF9tb3Rvcl9zcGVlZCA9IHJpZ2h0X21vdG9yX3NwZWVkOworICAgICAgbG9nZ2luZy5yaWdodF92ZWxvY2l0eSA9IGN1cnJlbnRfcmlnaHRfdmVsb2NpdHk7CisKKyAgICAgIExPR19TVFJVQ1QoREVCVUcsICJjdXJyZW50bHkiLCBsb2dnaW5nKTsKKyAgICB9CisjZW5kaWYKKworI2lmIEhBVkVfU0hJRlRFUlMKKyAgICBpZiAoSXNJbkdlYXIobGVmdF9nZWFyXykgJiYgSXNJbkdlYXIocmlnaHRfZ2Vhcl8pKSB7CisjZWxzZQorICAgIHsKKyNlbmRpZgorICAgICAgLy8gRkYgKiBYID0gVSAoc3RlYWR5IHN0YXRlKQorICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEZGID0KKyAgICAgICAgICBsb29wXy0+QigpLmludmVyc2UoKSAqCisgICAgICAgICAgKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPjo6SWRlbnRpdHkoKSAtIGxvb3BfLT5BKCkpOworCisgICAgICAvLyBJbnZlcnQgdGhlIHBsYW50IHRvIGZpZ3VyZSBvdXQgaG93IHRoZSB2ZWxvY2l0eSBmaWx0ZXIgd291bGQgaGF2ZSB0bworICAgICAgLy8gd29yaworICAgICAgLy8gb3V0IGluIG9yZGVyIHRvIGZpbHRlciBvdXQgdGhlIGZvcndhcmRzIG5lZ2F0aXZlIGluZXJ0aWEuCisgICAgICAvLyBUaGlzIG1hdGggYXNzdW1lcyB0aGF0IHRoZSBsZWZ0IGFuZCByaWdodCBwb3dlciBhbmQgdmVsb2NpdHkgYXJlCisgICAgICAvLyBlcXVhbHMsCisgICAgICAvLyBhbmQgdGhhdCB0aGUgcGxhbnQgaXMgdGhlIHNhbWUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0LgorICAgICAgY29uc3QgZG91YmxlIGZ2ZWwgPSBGaWx0ZXJWZWxvY2l0eSh0aHJvdHRsZV8pOworCisgICAgICBjb25zdCBkb3VibGUgc2lnbl9zdmVsID0gd2hlZWxfICogKChmdmVsID4gMC4wKSA/IDEuMCA6IC0xLjApOworICAgICAgZG91YmxlIHN0ZWVyaW5nX3ZlbG9jaXR5OworICAgICAgaWYgKHF1aWNrdHVybl8pIHsKKyAgICAgICAgc3RlZXJpbmdfdmVsb2NpdHkgPSB3aGVlbF8gKiBNYXhWZWxvY2l0eSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RlZXJpbmdfdmVsb2NpdHkgPSA6OnN0ZDo6YWJzKGZ2ZWwpICogd2hlZWxfOworICAgICAgfQorICAgICAgY29uc3QgZG91YmxlIGxlZnRfdmVsb2NpdHkgPSBmdmVsIC0gc3RlZXJpbmdfdmVsb2NpdHk7CisgICAgICBjb25zdCBkb3VibGUgcmlnaHRfdmVsb2NpdHkgPSBmdmVsICsgc3RlZXJpbmdfdmVsb2NpdHk7CisgICAgICBMT0coREVCVUcsICJsPSVmIHI9JWZcbiIsIGxlZnRfdmVsb2NpdHksIHJpZ2h0X3ZlbG9jaXR5KTsKKworICAgICAgLy8gSW50ZWdyYXRlIHZlbG9jaXR5IHRvIGdldCB0aGUgcG9zaXRpb24uCisgICAgICAvLyBUaGlzIHBvc2l0aW9uIGlzIHVzZWQgdG8gZ2V0IGludGVncmFsIGNvbnRyb2wuCisgICAgICBsb29wXy0+bXV0YWJsZV9SKCkgPDwgbGVmdF92ZWxvY2l0eSwgcmlnaHRfdmVsb2NpdHk7CisKKyAgICAgIGlmICghcXVpY2t0dXJuXykgeworICAgICAgICAvLyBLICogUiA9IHcKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IGVxdWFsaXR5X2s7CisgICAgICAgIGVxdWFsaXR5X2sgPDwgMSArIHNpZ25fc3ZlbCwgLSgxIC0gc2lnbl9zdmVsKTsKKyAgICAgICAgY29uc3QgZG91YmxlIGVxdWFsaXR5X3cgPSAwLjA7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgY29uc3RyYWludCBvbiBSIGJ5IG1hbmlwdWxhdGluZyB0aGUgY29uc3RyYWludCBvbiBVCisgICAgICAgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IFJfcG9seSA9IDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+KAorICAgICAgICAgICAgVV9Qb2x5Xy5IKCkgKiAobG9vcF8tPksoKSArIEZGKSwKKyAgICAgICAgICAgIFVfUG9seV8uaygpICsgVV9Qb2x5Xy5IKCkgKiBsb29wXy0+SygpICogbG9vcF8tPlhfaGF0KCkpOworCisgICAgICAgIC8vIExpbWl0IFIgYmFjayBpbnNpZGUgdGhlIGJveC4KKyAgICAgICAgbG9vcF8tPm11dGFibGVfUigpID0gZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDb2VyY2VHb2FsKAorICAgICAgICAgICAgUl9wb2x5LCBlcXVhbGl0eV9rLCBlcXVhbGl0eV93LCBsb29wXy0+UigpKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IEZGX3ZvbHRzID0gRkYgKiBsb29wXy0+UigpOworICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfaWRlYWwgPQorICAgICAgICAgIGxvb3BfLT5LKCkgKiAobG9vcF8tPlIoKSAtIGxvb3BfLT5YX2hhdCgpKSArIEZGX3ZvbHRzOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBsb29wXy0+bXV0YWJsZV9VKClbaV0gPSA6OmFvczo6Q2xpcChVX2lkZWFsW2ldLCAtMTIsIDEyKTsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETyhhdXN0aW4pOiBNb2RlbCB0aGlzIGJldHRlci4KKyAgICAgIC8vIFRPRE8oYXVzdGluKTogRmVlZCBiYWNrPworICAgICAgbG9vcF8tPm11dGFibGVfWF9oYXQoKSA9CisgICAgICAgICAgbG9vcF8tPkEoKSAqIGxvb3BfLT5YX2hhdCgpICsgbG9vcF8tPkIoKSAqIGxvb3BfLT5VKCk7CisjaWYgSEFWRV9TSElGVEVSUworICAgIH0gZWxzZSB7CisgICAgICAvLyBBbnkgbW90b3IgaXMgbm90IGluIGdlYXIuICBTcGVlZCBtYXRjaC4KKyAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFJfbGVmdDsKKyAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFJfcmlnaHQ7CisgICAgICBSX2xlZnQoMCwgMCkgPSBsZWZ0X21vdG9yX3NwZWVkOworICAgICAgUl9yaWdodCgwLCAwKSA9IHJpZ2h0X21vdG9yX3NwZWVkOworCisgICAgICBjb25zdCBkb3VibGUgd2lnZ2xlID0KKyAgICAgICAgICAoc3RhdGljX2Nhc3Q8ZG91YmxlPigoY291bnRlcl8gJSAyMCkgLyAxMCkgLSAwLjUpICogNS4wOworCisgICAgICBsb29wXy0+bXV0YWJsZV9VKDAsIDApID0KKyAgICAgICAgICA6OmFvczo6Q2xpcCgoUl9sZWZ0IC8gS3YpKDAsIDApICsgKElzSW5HZWFyKGxlZnRfZ2Vhcl8pID8gMCA6IHdpZ2dsZSksCisgICAgICAgICAgICAgICAgICAgICAgLTEyLjAsIDEyLjApOworICAgICAgbG9vcF8tPm11dGFibGVfVSgxLCAwKSA9IDo6YW9zOjpDbGlwKAorICAgICAgICAgIChSX3JpZ2h0IC8gS3YpKDAsIDApICsgKElzSW5HZWFyKHJpZ2h0X2dlYXJfKSA/IDAgOiB3aWdnbGUpLCAtMTIuMCwKKyAgICAgICAgICAxMi4wKTsKKyAgICAgIGxvb3BfLT5tdXRhYmxlX1UoKSAqPSAxMi4wIC8gOjphb3M6OnJvYm90X3N0YXRlLT52b2x0YWdlX2JhdHRlcnk7CisjZW5kaWYKKyAgICB9CisgIH0KKworICB2b2lkIFNlbmRNb3RvcnMoRHJpdmV0cmFpblF1ZXVlOjpPdXRwdXQgKm91dHB1dCkgeworICAgIGlmIChvdXRwdXQgIT0gTlVMTCkgeworICAgICAgb3V0cHV0LT5sZWZ0X3ZvbHRhZ2UgPSBsb29wXy0+VSgwLCAwKTsKKyAgICAgIG91dHB1dC0+cmlnaHRfdm9sdGFnZSA9IGxvb3BfLT5VKDEsIDApOworICAgICAgb3V0cHV0LT5sZWZ0X2hpZ2ggPSBsZWZ0X2dlYXJfID09IEhJR0ggfHwgbGVmdF9nZWFyXyA9PSBTSElGVElOR19VUDsKKyAgICAgIG91dHB1dC0+cmlnaHRfaGlnaCA9IHJpZ2h0X2dlYXJfID09IEhJR0ggfHwgcmlnaHRfZ2Vhcl8gPT0gU0hJRlRJTkdfVVA7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBjb25zdCA6OmFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwyPiBVX1BvbHlfOworCisgIDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tMb29wPDIsIDIsIDI+PiBsb29wXzsKKworICBjb25zdCBkb3VibGUgdHRydXN0XzsKKyAgZG91YmxlIHdoZWVsXzsKKyAgZG91YmxlIHRocm90dGxlXzsKKyAgYm9vbCBxdWlja3R1cm5fOworICBpbnQgc3RhbGVfY291bnRfOworICBkb3VibGUgcG9zaXRpb25fdGltZV9kZWx0YV87CisgIEdlYXIgbGVmdF9nZWFyXzsKKyAgR2VhciByaWdodF9nZWFyXzsKKyAgRHJpdmV0cmFpblF1ZXVlOjpQb3NpdGlvbiBsYXN0X3Bvc2l0aW9uXzsKKyAgRHJpdmV0cmFpblF1ZXVlOjpQb3NpdGlvbiBwb3NpdGlvbl87CisgIGludCBjb3VudGVyXzsKK307Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjprU3RhbGxUb3JxdWU7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjprU3RhbGxDdXJyZW50OworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6a0ZyZWVTcGVlZDsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46OmtGcmVlQ3VycmVudDsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46Oko7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjptOworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6cmI7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjprV2hlZWxSYWRpdXM7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjprUjsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46Okt2OworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6S3Q7CisKK3ZvaWQgRHJpdmV0cmFpbkxvb3A6OlJ1bkl0ZXJhdGlvbihjb25zdCBEcml2ZXRyYWluUXVldWU6OkdvYWwgKmdvYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJpdmV0cmFpblF1ZXVlOjpQb3NpdGlvbiAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmV0cmFpblF1ZXVlOjpPdXRwdXQgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXRyYWluUXVldWU6OlN0YXR1cyAqc3RhdHVzKSB7CisgIC8vIFRPRE8oYXNjaHVoKTogVGhlc2Ugc2hvdWxkIGJlIG1lbWJlcnMgb2YgdGhlIGNsYXNzLgorICBzdGF0aWMgRHJpdmV0cmFpbk1vdG9yc1NTIGR0X2Nsb3NlZGxvb3A7CisgIHN0YXRpYyBQb2x5RHJpdmV0cmFpbiBkdF9vcGVubG9vcDsKKworICBib29sIGJhZF9wb3MgPSBmYWxzZTsKKyAgaWYgKHBvc2l0aW9uID09IG51bGxwdHIpIHsKKyAgICBMT0dfSU5URVJWQUwobm9fcG9zaXRpb25fKTsKKyAgICBiYWRfcG9zID0gdHJ1ZTsKKyAgfQorICBub19wb3NpdGlvbl8uUHJpbnQoKTsKKworICBib29sIGNvbnRyb2xfbG9vcF9kcml2aW5nID0gZmFsc2U7CisgIGlmIChnb2FsKSB7CisgICAgZG91YmxlIHdoZWVsID0gZ29hbC0+c3RlZXJpbmc7CisgICAgZG91YmxlIHRocm90dGxlID0gZ29hbC0+dGhyb3R0bGU7CisgICAgYm9vbCBxdWlja3R1cm4gPSBnb2FsLT5xdWlja3R1cm47CisjaWYgSEFWRV9TSElGVEVSUworICAgIGJvb2wgaGlnaGdlYXIgPSBnb2FsLT5oaWdoZ2VhcjsKKyNlbmRpZgorCisgICAgY29udHJvbF9sb29wX2RyaXZpbmcgPSBnb2FsLT5jb250cm9sX2xvb3BfZHJpdmluZzsKKyAgICBkb3VibGUgbGVmdF9nb2FsID0gZ29hbC0+bGVmdF9nb2FsOworICAgIGRvdWJsZSByaWdodF9nb2FsID0gZ29hbC0+cmlnaHRfZ29hbDsKKworICAgIGR0X2Nsb3NlZGxvb3AuU2V0R29hbChsZWZ0X2dvYWwsIGdvYWwtPmxlZnRfdmVsb2NpdHlfZ29hbCwgcmlnaHRfZ29hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ29hbC0+cmlnaHRfdmVsb2NpdHlfZ29hbCk7CisjaWYgSEFWRV9TSElGVEVSUworICAgIGR0X29wZW5sb29wLlNldEdvYWwod2hlZWwsIHRocm90dGxlLCBxdWlja3R1cm4sIGhpZ2hnZWFyKTsKKyNlbHNlCisgICAgZHRfb3Blbmxvb3AuU2V0R29hbCh3aGVlbCwgdGhyb3R0bGUsIHF1aWNrdHVybiwgZmFsc2UpOworI2VuZGlmCisgIH0KKworICBpZiAoIWJhZF9wb3MpIHsKKyAgICBjb25zdCBkb3VibGUgbGVmdF9lbmNvZGVyID0gcG9zaXRpb24tPmxlZnRfZW5jb2RlcjsKKyAgICBjb25zdCBkb3VibGUgcmlnaHRfZW5jb2RlciA9IHBvc2l0aW9uLT5yaWdodF9lbmNvZGVyOworICAgIGlmIChneXJvX3JlYWRpbmcuRmV0Y2hMYXRlc3QoKSkgeworICAgICAgTE9HX1NUUlVDVChERUJVRywgInVzaW5nIiwgKmd5cm9fcmVhZGluZy5nZXQoKSk7CisgICAgICBkdF9jbG9zZWRsb29wLlNldFBvc2l0aW9uKGxlZnRfZW5jb2RlciwgcmlnaHRfZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3lyb19yZWFkaW5nLT5hbmdsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGR0X2Nsb3NlZGxvb3AuU2V0UmF3UG9zaXRpb24obGVmdF9lbmNvZGVyLCByaWdodF9lbmNvZGVyKTsKKyAgICB9CisgIH0KKyAgZHRfb3Blbmxvb3AuU2V0UG9zaXRpb24ocG9zaXRpb24pOworICBkdF9vcGVubG9vcC5VcGRhdGUoKTsKKworICBpZiAoY29udHJvbF9sb29wX2RyaXZpbmcpIHsKKyAgICBkdF9jbG9zZWRsb29wLlVwZGF0ZShvdXRwdXQgPT0gTlVMTCwgdHJ1ZSk7CisgICAgZHRfY2xvc2VkbG9vcC5TZW5kTW90b3JzKG91dHB1dCk7CisgIH0gZWxzZSB7CisgICAgZHRfb3Blbmxvb3AuU2VuZE1vdG9ycyhvdXRwdXQpOworICAgIGlmIChvdXRwdXQpIHsKKyAgICAgIGR0X2Nsb3NlZGxvb3AuU2V0RXh0ZXJuYWxNb3RvcnMob3V0cHV0LT5sZWZ0X3ZvbHRhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+cmlnaHRfdm9sdGFnZSk7CisgICAgfQorICAgIGR0X2Nsb3NlZGxvb3AuVXBkYXRlKG91dHB1dCA9PSBOVUxMLCBmYWxzZSk7CisgIH0KKworICAvLyBzZXQgdGhlIG91dHB1dCBzdGF0dXMgb2YgdGhlIGNvbnRyb2wgbG9vcCBzdGF0ZQorICBpZiAoc3RhdHVzKSB7CisgICAgYm9vbCBkb25lID0gZmFsc2U7CisgICAgaWYgKGdvYWwpIHsKKyAgICAgIGRvbmUgPSAoKDo6c3RkOjphYnMoZ29hbC0+bGVmdF9nb2FsIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHRfY2xvc2VkbG9vcC5HZXRFc3RpbWF0ZWRMZWZ0RW5jb2RlcigpKSA8CisgICAgICAgICAgICAgICBrRHJpdmV0cmFpbkRvbmVEaXN0YW5jZSkgJiYKKyAgICAgICAgICAgICAgKDo6c3RkOjphYnMoZ29hbC0+cmlnaHRfZ29hbCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR0X2Nsb3NlZGxvb3AuR2V0RXN0aW1hdGVkUmlnaHRFbmNvZGVyKCkpIDwKKyAgICAgICAgICAgICAgIGtEcml2ZXRyYWluRG9uZURpc3RhbmNlKSk7CisgICAgfQorICAgIHN0YXR1cy0+aXNfZG9uZSA9IGRvbmU7CisgICAgc3RhdHVzLT5yb2JvdF9zcGVlZCA9IGR0X2Nsb3NlZGxvb3AuR2V0RXN0aW1hdGVkUm9ib3RTcGVlZCgpOworICAgIHN0YXR1cy0+ZmlsdGVyZWRfbGVmdF9wb3NpdGlvbiA9IGR0X2Nsb3NlZGxvb3AuR2V0RXN0aW1hdGVkTGVmdEVuY29kZXIoKTsKKyAgICBzdGF0dXMtPmZpbHRlcmVkX3JpZ2h0X3Bvc2l0aW9uID0gZHRfY2xvc2VkbG9vcC5HZXRFc3RpbWF0ZWRSaWdodEVuY29kZXIoKTsKKworICAgIHN0YXR1cy0+ZmlsdGVyZWRfbGVmdF92ZWxvY2l0eSA9IGR0X2Nsb3NlZGxvb3AubG9vcCgpLlhfaGF0KDEsIDApOworICAgIHN0YXR1cy0+ZmlsdGVyZWRfcmlnaHRfdmVsb2NpdHkgPSBkdF9jbG9zZWRsb29wLmxvb3AoKS5YX2hhdCgzLCAwKTsKKyAgICBzdGF0dXMtPm91dHB1dF93YXNfY2FwcGVkID0gZHRfY2xvc2VkbG9vcC5PdXRwdXRXYXNDYXBwZWQoKTsKKyAgICBzdGF0dXMtPnVuY2FwcGVkX2xlZnRfdm9sdGFnZSA9IGR0X2Nsb3NlZGxvb3AubG9vcCgpLlVfdW5jYXBwZWQoMCwgMCk7CisgICAgc3RhdHVzLT51bmNhcHBlZF9yaWdodF92b2x0YWdlID0gZHRfY2xvc2VkbG9vcC5sb29wKCkuVV91bmNhcHBlZCgxLCAwKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGJvdDMKZGlmZiAtLWdpdCBhL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uZ3lwIGIvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2NzhkMQotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uZ3lwCkBAIC0wLDAgKzEsMTA1IEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdyZXBsYXlfZHJpdmV0cmFpbl9ib3QzJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ25vX3JzeW5jJzogMSwKKyAgICAgIH0sCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3JlcGxheV9kcml2ZXRyYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpyZXBsYXlfY29udHJvbF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWydkcml2ZXRyYWluLnEnXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICdib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbicsCisgICAgICB9LAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3F1ZXVlcycsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi8uLi9hb3MvYnVpbGQvcXVldWVzLmd5cGknXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdwb2x5ZHJpdmV0cmFpbl9wbGFudHMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdwb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MnLAorICAgICAgICAnZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkcml2ZXRyYWluX2xpYicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2RyaXZldHJhaW4uY2MnLAorICAgICAgICAncG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjJywKKyAgICAgICAgJ2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjJywKKyAgICAgICAgJ3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2RyaXZldHJhaW5fcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnBvbHl0b3BlJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6Y29lcmNlX2dvYWwnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3F1ZXVlcy9xdWV1ZXMuZ3lwOmd5cm8nLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOmxvZ19pbnRlcnZhbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6bWF0cml4X2xvZ2dpbmcnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6cG9seXRvcGUnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpjb2VyY2VfZ29hbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgICAnZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RyaXZldHJhaW5fbGliX3Rlc3RfYm90MycsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZHJpdmV0cmFpbl9saWJfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgICAgJ2RyaXZldHJhaW5fbGliJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcF90ZXN0JywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3F1ZXVlcy9xdWV1ZXMuZ3lwOmd5cm8nLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlcycsCisgICAgICAgICc8KEFPUykvY29tbW9uL25ldHdvcmsvbmV0d29yay5neXA6dGVhbV9udW1iZXInLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkcml2ZXRyYWluX2JvdDMnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2RyaXZldHJhaW5fbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnZHJpdmV0cmFpbl9saWInLAorICAgICAgICAnZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmggYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxMzQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uaApAQCAtMCwwICsxLDYwIEBACisjaWZuZGVmIEJPVDNfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX0hfCisjZGVmaW5lIEJPVDNfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX0hfCisKKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKworI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvbG9nX2ludGVydmFsLmgiCisKKyNpbmNsdWRlICJmcmM5NzEvc2hpZnRlcl9oYWxsX2VmZmVjdC5oIgorI2luY2x1ZGUgImJvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgorCituYW1lc3BhY2UgYm90MyB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKKy8vIENvbnN0YW50cworLy8gVE9ETyhjb21yYW4pOiBHZXQgYWN0dWFsIGNvbnN0YW50cy4KK2NvbnN0ZXhwciBkb3VibGUga0RyaXZldHJhaW5UdXJuV2lkdGggPSAwLjU7Citjb25zdGV4cHIgZG91YmxlIGtEcml2ZXRyYWluRG9uZURpc3RhbmNlID0gMC4wMjsKK2NvbnN0ZXhwciBkb3VibGUga0RyaXZldHJhaW5FbmNvZGVyUmF0aW8gPSAyMC4wIC8gNTAuMDsKK2NvbnN0ZXhwciBkb3VibGUga0RyaXZldHJhaW5IaWdoR2VhclJhdGlvID0KKyAgICBrRHJpdmV0cmFpbkVuY29kZXJSYXRpbyAqIDIwLjAgLyA1MC4wOworY29uc3RleHByIGRvdWJsZSBrRHJpdmV0cmFpbkxvd0dlYXJSYXRpbyA9IGtEcml2ZXRyYWluSGlnaEdlYXJSYXRpbzsKK2NvbnN0IGJvb2wga0RyaXZldHJhaW5DbHV0Y2hUcmFuc21pc3Npb24gPSBmYWxzZTsKK2NvbnN0IDo6ZnJjOTcxOjpjb25zdGFudHM6OlNoaWZ0ZXJIYWxsRWZmZWN0IGtEcml2ZXRyYWluUmlnaHRTaGlmdGVyeworICAgIDU1NSwgNjU3LCA2NjAsIDU2MCwgMC4yLCAwLjd9OworY29uc3QgOjpmcmM5NzE6OmNvbnN0YW50czo6U2hpZnRlckhhbGxFZmZlY3Qga0RyaXZldHJhaW5MZWZ0U2hpZnRlcnsKKyAgICA1NTUsIDY2MCwgNjQ0LCA1NTIsIDAuMiwgMC43fTsKKy8vIEVuZCBjb25zdGFudHMKKworY2xhc3MgRHJpdmV0cmFpbkxvb3AKKyAgICA6IHB1YmxpYyBhb3M6OmNvbnRyb2xzOjpDb250cm9sTG9vcDxjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU+IHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYSBjb250cm9sIGxvb3Agd2hpY2ggY2FuIHRha2UgYSBEcml2ZXRyYWluIG9yIGRlZmF1bHRzIHRvIHRoZQorICAvLyBkcml2ZXRyYWluIGF0IGJvdDM6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW4KKyAgZXhwbGljaXQgRHJpdmV0cmFpbkxvb3AoY29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlICpteV9kcml2ZXRyYWluID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlKQorICAgICAgOiBhb3M6OmNvbnRyb2xzOjpDb250cm9sTG9vcDxjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU+KAorICAgICAgICAgICAgbXlfZHJpdmV0cmFpbikgeworICAgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDA+OjpJbml0KCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgLy8gRXhlY3V0ZXMgb25lIGN5Y2xlIG9mIHRoZSBjb250cm9sIGxvb3AuCisgIHZpcnR1YWwgdm9pZCBSdW5JdGVyYXRpb24oCisgICAgICBjb25zdCBjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWwgKmdvYWwsCisgICAgICBjb25zdCBjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OlBvc2l0aW9uICpwb3NpdGlvbiwKKyAgICAgIGNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6T3V0cHV0ICpvdXRwdXQsCisgICAgICBjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OlN0YXR1cyAqc3RhdHVzKTsKKworICB0eXBlZGVmIDo6YW9zOjp1dGlsOjpTaW1wbGVMb2dJbnRlcnZhbCBTaW1wbGVMb2dJbnRlcnZhbDsKKyAgU2ltcGxlTG9nSW50ZXJ2YWwgbm9fcG9zaXRpb25fID0gU2ltcGxlTG9nSW50ZXJ2YWwoCisgICAgICA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMjUpLCBXQVJOSU5HLCAibm8gcG9zaXRpb24iKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgYm90MworCisjZW5kaWYgIC8vIEJPVDNfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX0hfCmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEgYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlYjAzMAotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIGJvdDMuY29udHJvbF9sb29wczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcHMucSI7CisKK3N0cnVjdCBHZWFyTG9nZ2luZyB7CisgIGludDhfdCBjb250cm9sbGVyX2luZGV4OworICBib29sIGxlZnRfbG9vcF9oaWdoOworICBib29sIHJpZ2h0X2xvb3BfaGlnaDsKKyAgaW50OF90IGxlZnRfc3RhdGU7CisgIGludDhfdCByaWdodF9zdGF0ZTsKK307CisKK3N0cnVjdCBDSU1Mb2dnaW5nIHsKKyAgYm9vbCBsZWZ0X2luX2dlYXI7CisgIGJvb2wgcmlnaHRfaW5fZ2VhcjsKKyAgZG91YmxlIGxlZnRfbW90b3Jfc3BlZWQ7CisgIGRvdWJsZSByaWdodF9tb3Rvcl9zcGVlZDsKKyAgZG91YmxlIGxlZnRfdmVsb2NpdHk7CisgIGRvdWJsZSByaWdodF92ZWxvY2l0eTsKK307CisKK3F1ZXVlX2dyb3VwIERyaXZldHJhaW5RdWV1ZSB7CisgIGltcGxlbWVudHMgYW9zLmNvbnRyb2xfbG9vcHMuQ29udHJvbExvb3A7CisKKyAgbWVzc2FnZSBHb2FsIHsKKyAgICBkb3VibGUgc3RlZXJpbmc7CisgICAgZG91YmxlIHRocm90dGxlOworICAgIC8vYm9vbCBoaWdoZ2VhcjsKKyAgICBib29sIHF1aWNrdHVybjsKKyAgICBib29sIGNvbnRyb2xfbG9vcF9kcml2aW5nOworICAgIGRvdWJsZSBsZWZ0X2dvYWw7CisgICAgZG91YmxlIGxlZnRfdmVsb2NpdHlfZ29hbDsKKyAgICBkb3VibGUgcmlnaHRfZ29hbDsKKyAgICBkb3VibGUgcmlnaHRfdmVsb2NpdHlfZ29hbDsKKyAgfTsKKworICBtZXNzYWdlIFBvc2l0aW9uIHsKKyAgICBkb3VibGUgbGVmdF9lbmNvZGVyOworICAgIGRvdWJsZSByaWdodF9lbmNvZGVyOworICAgIC8vZG91YmxlIGxlZnRfc2hpZnRlcl9wb3NpdGlvbjsKKyAgICAvL2RvdWJsZSByaWdodF9zaGlmdGVyX3Bvc2l0aW9uOworICB9OworCisgIG1lc3NhZ2UgT3V0cHV0IHsKKyAgICBkb3VibGUgbGVmdF92b2x0YWdlOworICAgIGRvdWJsZSByaWdodF92b2x0YWdlOworICAgIGJvb2wgbGVmdF9oaWdoOworICAgIGJvb2wgcmlnaHRfaGlnaDsKKyAgfTsKKworICBtZXNzYWdlIFN0YXR1cyB7CisgICAgZG91YmxlIHJvYm90X3NwZWVkOworICAgIGRvdWJsZSBmaWx0ZXJlZF9sZWZ0X3Bvc2l0aW9uOworICAgIGRvdWJsZSBmaWx0ZXJlZF9yaWdodF9wb3NpdGlvbjsKKyAgICBkb3VibGUgZmlsdGVyZWRfbGVmdF92ZWxvY2l0eTsKKyAgICBkb3VibGUgZmlsdGVyZWRfcmlnaHRfdmVsb2NpdHk7CisKKyAgICBkb3VibGUgdW5jYXBwZWRfbGVmdF92b2x0YWdlOworICAgIGRvdWJsZSB1bmNhcHBlZF9yaWdodF92b2x0YWdlOworICAgIGJvb2wgb3V0cHV0X3dhc19jYXBwZWQ7CisKKyAgICBib29sIGlzX2RvbmU7CisgIH07CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBQb3NpdGlvbiBwb3NpdGlvbjsKKyAgcXVldWUgT3V0cHV0IG91dHB1dDsKKyAgcXVldWUgU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIERyaXZldHJhaW5RdWV1ZSBkcml2ZXRyYWluX3F1ZXVlOwpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MgYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmYTcxCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MKQEAgLTAsMCArMSwxMzMgQEAKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgYm90MyB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0xvd1BsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQTsKKyAgQSA8PCAxLjAsIDAuMDA0OTQzNDg2MTI4MjQsIDAuMCwgMS4yNDA0ODQ1NTQwNGUtMDUsIDAuMCwgMC45Nzc0ODQwOTI3MDMsIDAuMCwgMC4wMDQ5MjQzMzI4NDA0OCwgMC4wLCAxLjI0MDQ4NDU1NDA0ZS0wNSwgMS4wLCAwLjAwNDk0MzQ4NjEyODI0LCAwLjAsIDAuMDA0OTI0MzMyODQwNDgsIDAuMCwgMC45Nzc0ODQwOTI3MDM7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBCOworICBCIDw8IDIuMDkxODA3NTYxNzdlLTA1LCAtNC41OTE1MzYzNjA0M2UtMDYsIDAuMDA4MzM0MDUwMzI3OTUsIC0wLjAwMTgyMjY5NTI2OTcxLCAtNC41OTE1MzYzNjA0M2UtMDYsIDIuMDkxODA3NTYxNzdlLTA1LCAtMC4wMDE4MjI2OTUyNjk3MSwgMC4wMDgzMzQwNTAzMjc5NTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEM7CisgIEMgPDwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMCwgMCwgMCwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBOworICBBIDw8IDEuMCwgMC4wMDQ5NDM0ODYxMjgyNCwgMC4wLCAxLjI0MDQ4NDU1NDA0ZS0wNSwgMC4wLCAwLjk3NzQ4NDA5MjcwMywgMC4wLCAwLjAwNDkyNDMzMjg0MDQ4LCAwLjAsIDEuMjQwNDg0NTU0MDRlLTA1LCAxLjAsIDAuMDA0OTQzNDg2MTI4MjQsIDAuMCwgMC4wMDQ5MjQzMzI4NDA0OCwgMC4wLCAwLjk3NzQ4NDA5MjcwMzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEI7CisgIEIgPDwgMi4wOTE4MDc1NjE3N2UtMDUsIC00LjU5MTUzNjM2MDQzZS0wNiwgMC4wMDgzMzQwNTAzMjc5NSwgLTAuMDAxODIyNjk1MjY5NzEsIC00LjU5MTUzNjM2MDQzZS0wNiwgMi4wOTE4MDc1NjE3N2UtMDUsIC0wLjAwMTgyMjY5NTI2OTcxLCAwLjAwODMzNDA1MDMyNzk1OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gQzsKKyAgQyA8PCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRDsKKyAgRCA8PCAwLCAwLCAwLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjAsIDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjAsIC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEE7CisgIEEgPDwgMS4wLCAwLjAwNDk0MzQ4NjEyODI0LCAwLjAsIDEuMjQwNDg0NTU0MDRlLTA1LCAwLjAsIDAuOTc3NDg0MDkyNzAzLCAwLjAsIDAuMDA0OTI0MzMyODQwNDgsIDAuMCwgMS4yNDA0ODQ1NTQwNGUtMDUsIDEuMCwgMC4wMDQ5NDM0ODYxMjgyNCwgMC4wLCAwLjAwNDkyNDMzMjg0MDQ4LCAwLjAsIDAuOTc3NDg0MDkyNzAzOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gQjsKKyAgQiA8PCAyLjA5MTgwNzU2MTc3ZS0wNSwgLTQuNTkxNTM2MzYwNDNlLTA2LCAwLjAwODMzNDA1MDMyNzk1LCAtMC4wMDE4MjI2OTUyNjk3MSwgLTQuNTkxNTM2MzYwNDNlLTA2LCAyLjA5MTgwNzU2MTc3ZS0wNSwgLTAuMDAxODIyNjk1MjY5NzEsIDAuMDA4MzM0MDUwMzI3OTU7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA0PiBDOworICBDIDw8IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAsIDAsIDAsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEE7CisgIEEgPDwgMS4wLCAwLjAwNDk0MzQ4NjEyODI0LCAwLjAsIDEuMjQwNDg0NTU0MDRlLTA1LCAwLjAsIDAuOTc3NDg0MDkyNzAzLCAwLjAsIDAuMDA0OTI0MzMyODQwNDgsIDAuMCwgMS4yNDA0ODQ1NTQwNGUtMDUsIDEuMCwgMC4wMDQ5NDM0ODYxMjgyNCwgMC4wLCAwLjAwNDkyNDMzMjg0MDQ4LCAwLjAsIDAuOTc3NDg0MDkyNzAzOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gQjsKKyAgQiA8PCAyLjA5MTgwNzU2MTc3ZS0wNSwgLTQuNTkxNTM2MzYwNDNlLTA2LCAwLjAwODMzNDA1MDMyNzk1LCAtMC4wMDE4MjI2OTUyNjk3MSwgLTQuNTkxNTM2MzYwNDNlLTA2LCAyLjA5MTgwNzU2MTc3ZS0wNSwgLTAuMDAxODIyNjk1MjY5NzEsIDAuMDA4MzM0MDUwMzI3OTU7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA0PiBDOworICBDIDw8IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAsIDAsIDAsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dMb3dDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gTDsKKyAgTCA8PCAxLjI3NzQ4NDA5MjcsIDAuMDA0OTI0MzMyODQwNDgsIDc5LjE0NDA0NTY2MjIsIDEuMDUxNTA3MjI2MzYsIDAuMDA0OTI0MzMyODQwNDgsIDEuMjc3NDg0MDkyNywgMS4wNTE1MDcyMjYzNiwgNzkuMTQ0MDQ1NjYyMjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEs7CisgIEsgPDwgMTYwLjE5Njc3MjQ3LCAxNS41MzU4NDY4OTM4LCAxLjYwNDAxMTk0MTM5LCAxLjMzODYxMjEzMDkzLCAxLjYwNDAxMTk0MTQyLCAxLjMzODYxMjEzMDk0LCAxNjAuMTk2NzcyNDcsIDE1LjUzNTg0Njg5Mzg7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wLCAtMC4wMDUwNTc0MjE1MzI1NiwgMC4wLCAxLjI3ODc1MDM2NDcyZS0wNSwgMC4wLCAxLjAyMzA2MDUxNTQyLCAwLjAsIC0wLjAwNTE1MzkzNjAzOTk4LCAwLjAsIDEuMjc4NzUwMzY0NzJlLTA1LCAxLjAsIC0wLjAwNTA1NzQyMTUzMjU2LCAwLjAsIC0wLjAwNTE1MzkzNjAzOTk4LCAwLjAsIDEuMDIzMDYwNTE1NDI7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dIaWdoQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEw7CisgIEwgPDwgMS4yNzc0ODQwOTI3LCAwLjAwNDkyNDMzMjg0MDQ4LCA3OS4xNDQwNDU2NjIyLCAxLjA1MTUwNzIyNjM2LCAwLjAwNDkyNDMzMjg0MDQ4LCAxLjI3NzQ4NDA5MjcsIDEuMDUxNTA3MjI2MzYsIDc5LjE0NDA0NTY2MjI7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA0PiBLOworICBLIDw8IDE2MC4xOTY3NzI0NywgMTUuNTM1ODQ2ODkzOCwgMS42MDQwMTE5NDEzOSwgMS4zMzg2MTIxMzA5MywgMS42MDQwMTE5NDE0MiwgMS4zMzg2MTIxMzA5NCwgMTYwLjE5Njc3MjQ3LCAxNS41MzU4NDY4OTM4OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQV9pbnY7CisgIEFfaW52IDw8IDEuMCwgLTAuMDA1MDU3NDIxNTMyNTYsIDAuMCwgMS4yNzg3NTAzNjQ3MmUtMDUsIDAuMCwgMS4wMjMwNjA1MTU0MiwgMC4wLCAtMC4wMDUxNTM5MzYwMzk5OCwgMC4wLCAxLjI3ODc1MDM2NDcyZS0wNSwgMS4wLCAtMC4wMDUwNTc0MjE1MzI1NiwgMC4wLCAtMC4wMDUxNTM5MzYwMzk5OCwgMC4wLCAxLjAyMzA2MDUxNTQyOworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VEcml2ZXRyYWluTG93SGlnaFBsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkhpZ2hMb3dDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gTDsKKyAgTCA8PCAxLjI3NzQ4NDA5MjcsIDAuMDA0OTI0MzMyODQwNDgsIDc5LjE0NDA0NTY2MjIsIDEuMDUxNTA3MjI2MzYsIDAuMDA0OTI0MzMyODQwNDgsIDEuMjc3NDg0MDkyNywgMS4wNTE1MDcyMjYzNiwgNzkuMTQ0MDQ1NjYyMjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEs7CisgIEsgPDwgMTYwLjE5Njc3MjQ3LCAxNS41MzU4NDY4OTM4LCAxLjYwNDAxMTk0MTM5LCAxLjMzODYxMjEzMDkzLCAxLjYwNDAxMTk0MTQyLCAxLjMzODYxMjEzMDk0LCAxNjAuMTk2NzcyNDcsIDE1LjUzNTg0Njg5Mzg7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wLCAtMC4wMDUwNTc0MjE1MzI1NiwgMC4wLCAxLjI3ODc1MDM2NDcyZS0wNSwgMC4wLCAxLjAyMzA2MDUxNTQyLCAwLjAsIC0wLjAwNTE1MzkzNjAzOTk4LCAwLjAsIDEuMjc4NzUwMzY0NzJlLTA1LCAxLjAsIC0wLjAwNTA1NzQyMTUzMjU2LCAwLjAsIC0wLjAwNTE1MzkzNjAzOTk4LCAwLjAsIDEuMDIzMDYwNTE1NDI7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gTDsKKyAgTCA8PCAxLjI3NzQ4NDA5MjcsIDAuMDA0OTI0MzMyODQwNDgsIDc5LjE0NDA0NTY2MjIsIDEuMDUxNTA3MjI2MzYsIDAuMDA0OTI0MzMyODQwNDgsIDEuMjc3NDg0MDkyNywgMS4wNTE1MDcyMjYzNiwgNzkuMTQ0MDQ1NjYyMjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEs7CisgIEsgPDwgMTYwLjE5Njc3MjQ3LCAxNS41MzU4NDY4OTM4LCAxLjYwNDAxMTk0MTM5LCAxLjMzODYxMjEzMDkzLCAxLjYwNDAxMTk0MTQyLCAxLjMzODYxMjEzMDk0LCAxNjAuMTk2NzcyNDcsIDE1LjUzNTg0Njg5Mzg7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wLCAtMC4wMDUwNTc0MjE1MzI1NiwgMC4wLCAxLjI3ODc1MDM2NDcyZS0wNSwgMC4wLCAxLjAyMzA2MDUxNTQyLCAwLjAsIC0wLjAwNTE1MzkzNjAzOTk4LCAwLjAsIDEuMjc4NzUwMzY0NzJlLTA1LCAxLjAsIC0wLjAwNTA1NzQyMTUzMjU2LCAwLjAsIC0wLjAwNTE1MzkzNjAzOTk4LCAwLjAsIDEuMDIzMDYwNTE1NDI7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5QbGFudCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+Pj4gcGxhbnRzKDQpOworICBwbGFudHNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4oTWFrZURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1sxXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1syXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1szXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkhpZ2hIaWdoUGxhbnRDb2VmZmljaWVudHMoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+KCZwbGFudHMpOworfQorCitTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvb3AoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+Pj4gY29udHJvbGxlcnMoNCk7CisgIGNvbnRyb2xsZXJzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkxvd0xvd0NvbnRyb2xsZXIoKSkpOworICBjb250cm9sbGVyc1sxXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4oTWFrZURyaXZldHJhaW5Mb3dIaWdoQ29udHJvbGxlcigpKSk7CisgIGNvbnRyb2xsZXJzWzJdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkhpZ2hMb3dDb250cm9sbGVyKCkpKTsKKyAgY29udHJvbGxlcnNbM10gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hDb250cm9sbGVyKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+KCZjb250cm9sbGVycyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgYm90MwpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaCBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkNTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBCT1QzX0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9EUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXworI2RlZmluZSBCT1QzX0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9EUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXworCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgYm90MyB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0xvd1BsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluTG93TG93Q29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dIaWdoQ29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoTG93Q29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudDw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpblBsYW50KCk7CisKK1N0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluTG9vcCgpOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGJvdDMKKworI2VuZGlmICAvLyBCT1QzX0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9EUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXwpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9saWJfdGVzdC5jYyBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fbGliX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllODI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fbGliX3Rlc3QuY2MKQEAgLTAsMCArMSwyOTYgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9uZXR3b3JrL3RlYW1fbnVtYmVyLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3BvbHl0b3BlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BfdGVzdC5oIgorCisjaW5jbHVkZSAiYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xLmgiCisjaW5jbHVkZSAiYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9jb2VyY2VfZ29hbC5oIgorI2luY2x1ZGUgImJvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgiCisjaW5jbHVkZSAiZnJjOTcxL3F1ZXVlcy9neXJvLnEuaCIKKworbmFtZXNwYWNlIGJvdDMgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkVudmlyb25tZW50KCkge30KKyAgLy8gaG93IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBhb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8MD46OkluaXQoKTsKKyAgfQorfTsKKzo6dGVzdGluZzo6RW52aXJvbm1lbnQqIGNvbnN0IGhvbGRlcl9lbnYgPQorICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRW52aXJvbm1lbnQpOworCitjbGFzcyBUZWFtTnVtYmVyRW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgcHVibGljOgorICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudC4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyBhb3M6Om5ldHdvcms6Ok92ZXJyaWRlVGVhbU51bWJlcig5NzEpOyB9Cit9OworCis6OnRlc3Rpbmc6OkVudmlyb25tZW50KiBjb25zdCB0ZWFtX251bWJlcl9lbnYgPQorICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBUZWFtTnVtYmVyRW52aXJvbm1lbnQpOworCisvLyBDbGFzcyB3aGljaCBzaW11bGF0ZXMgdGhlIGRyaXZldHJhaW4gYW5kIHNlbmRzIG91dCBxdWV1ZSBtZXNzYWdlcyBjb250YWluaW5nCisvLyB0aGUgcG9zaXRpb24uCitjbGFzcyBEcml2ZXRyYWluU2ltdWxhdGlvbiB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgbW90b3Igc2ltdWxhdGlvbi4KKyAgLy8gVE9ETyhhc2NodWgpIERvIHdlIHdhbnQgdG8gdGVzdCB0aGUgY2x1dGNoIG9uZSB0b28/CisgIERyaXZldHJhaW5TaW11bGF0aW9uKCkKKyAgICAgIDogZHJpdmV0cmFpbl9wbGFudF8oCisgICAgICAgICAgICBuZXcgU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluUGxhbnQoKSkpLAorICAgICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXygiLmJvdDMuY29udHJvbF9sb29wcy5kcml2ZXRyYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMHg4YThkZGU3NywgIi5ib3QzLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5nb2FsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIi5ib3QzLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5wb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICIuYm90My5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4ub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIi5ib3QzLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5zdGF0dXMiKSB7CisgICAgUmVpbml0aWFsaXplKCk7CisgIH0KKworICAvLyBSZXNldHMgdGhlIHBsYW50LgorICB2b2lkIFJlaW5pdGlhbGl6ZSgpIHsKKyAgICBkcml2ZXRyYWluX3BsYW50Xy0+bXV0YWJsZV9YKDAsIDApID0gMC4wOworICAgIGRyaXZldHJhaW5fcGxhbnRfLT5tdXRhYmxlX1goMSwgMCkgPSAwLjA7CisgICAgZHJpdmV0cmFpbl9wbGFudF8tPm11dGFibGVfWSgpID0KKyAgICAgICAgZHJpdmV0cmFpbl9wbGFudF8tPkMoKSAqIGRyaXZldHJhaW5fcGxhbnRfLT5YKCk7CisgICAgbGFzdF9sZWZ0X3Bvc2l0aW9uXyA9IGRyaXZldHJhaW5fcGxhbnRfLT5ZKDAsIDApOworICAgIGxhc3RfcmlnaHRfcG9zaXRpb25fID0gZHJpdmV0cmFpbl9wbGFudF8tPlkoMSwgMCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJpdmV0cmFpbi4KKyAgZG91YmxlIEdldExlZnRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIGRyaXZldHJhaW5fcGxhbnRfLT5ZKDAsIDApOyB9CisgIGRvdWJsZSBHZXRSaWdodFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gZHJpdmV0cmFpbl9wbGFudF8tPlkoMSwgMCk7IH0KKworICAvLyBTZW5kcyBvdXQgdGhlIHBvc2l0aW9uIHF1ZXVlIG1lc3NhZ2VzLgorICB2b2lkIFNlbmRQb3NpdGlvbk1lc3NhZ2UoKSB7CisgICAgY29uc3QgZG91YmxlIGxlZnRfZW5jb2RlciA9IEdldExlZnRQb3NpdGlvbigpOworICAgIGNvbnN0IGRvdWJsZSByaWdodF9lbmNvZGVyID0gR2V0UmlnaHRQb3NpdGlvbigpOworCisgICAgOjphb3M6OlNjb3BlZE1lc3NhZ2VQdHI8Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpQb3NpdGlvbj4gcG9zaXRpb24gPQorICAgICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5wb3NpdGlvbi5NYWtlTWVzc2FnZSgpOworICAgIHBvc2l0aW9uLT5sZWZ0X2VuY29kZXIgPSBsZWZ0X2VuY29kZXI7CisgICAgcG9zaXRpb24tPnJpZ2h0X2VuY29kZXIgPSByaWdodF9lbmNvZGVyOworICAgIHBvc2l0aW9uLlNlbmQoKTsKKyAgfQorCisgIC8vIFNpbXVsYXRlcyB0aGUgZHJpdmV0cmFpbiBtb3ZpbmcgZm9yIG9uZSB0aW1lc3RlcC4KKyAgdm9pZCBTaW11bGF0ZSgpIHsKKyAgICBsYXN0X2xlZnRfcG9zaXRpb25fID0gZHJpdmV0cmFpbl9wbGFudF8tPlkoMCwgMCk7CisgICAgbGFzdF9yaWdodF9wb3NpdGlvbl8gPSBkcml2ZXRyYWluX3BsYW50Xy0+WSgxLCAwKTsKKyAgICBFWFBFQ1RfVFJVRShteV9kcml2ZXRyYWluX3F1ZXVlXy5vdXRwdXQuRmV0Y2hMYXRlc3QoKSk7CisgICAgZHJpdmV0cmFpbl9wbGFudF8tPm11dGFibGVfVSgpIDw8IG15X2RyaXZldHJhaW5fcXVldWVfLm91dHB1dC0+bGVmdF92b2x0YWdlLAorICAgICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5vdXRwdXQtPnJpZ2h0X3ZvbHRhZ2U7CisgICAgZHJpdmV0cmFpbl9wbGFudF8tPlVwZGF0ZSgpOworICB9CisKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+PiBkcml2ZXRyYWluX3BsYW50XzsKKyBwcml2YXRlOgorICBEcml2ZXRyYWluUXVldWUgbXlfZHJpdmV0cmFpbl9xdWV1ZV87CisgIGRvdWJsZSBsYXN0X2xlZnRfcG9zaXRpb25fOworICBkb3VibGUgbGFzdF9yaWdodF9wb3NpdGlvbl87Cit9OworCitjbGFzcyBEcml2ZXRyYWluVGVzdCA6IHB1YmxpYyA6OmFvczo6dGVzdGluZzo6Q29udHJvbExvb3BUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBxdWV1ZSBzbyB0aGF0IGl0IGludmFsaWRhdGVzIHRoZSBxdWV1ZQorICAvLyB0aGF0IGl0IHBvaW50cyB0by4gIE90aGVyd2lzZSwgd2Ugd2lsbCBoYXZlIGEgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5IHRoYXQKKyAgLy8gaXMgbm8gbG9uZ2VyIHZhbGlkLgorICBEcml2ZXRyYWluUXVldWUgbXlfZHJpdmV0cmFpbl9xdWV1ZV87CisKKyAgLy8gQ3JlYXRlIGEgbG9vcCBhbmQgc2ltdWxhdGlvbiBwbGFudC4KKyAgRHJpdmV0cmFpbkxvb3AgZHJpdmV0cmFpbl9tb3Rvcl87CisgIERyaXZldHJhaW5TaW11bGF0aW9uIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfOworCisgIERyaXZldHJhaW5UZXN0KCkgOiBteV9kcml2ZXRyYWluX3F1ZXVlXygiLmJvdDMuY29udHJvbF9sb29wcy5kcml2ZXRyYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhhOGRkZTc3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuYm90My5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4uZ29hbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5ib3QzLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5wb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5ib3QzLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5vdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuYm90My5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4uc3RhdHVzIiksCisgICAgICAgICAgICAgICAgZHJpdmV0cmFpbl9tb3Rvcl8oJm15X2RyaXZldHJhaW5fcXVldWVfKSwKKyAgICAgICAgICAgICAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50XygpIHsKKyAgICA6OmZyYzk3MTo6c2Vuc29yczo6Z3lyb19yZWFkaW5nLkNsZWFyKCk7CisgIH0KKworICB2b2lkIFZlcmlmeU5lYXJHb2FsKCkgeworICAgIG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuRmV0Y2hMYXRlc3QoKTsKKyAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5wb3NpdGlvbi5GZXRjaExhdGVzdCgpOworICAgIEVYUEVDVF9ORUFSKG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwtPmxlZnRfZ29hbCwKKyAgICAgICAgICAgICAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5HZXRMZWZ0UG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAxZS0yKTsKKyAgICBFWFBFQ1RfTkVBUihteV9kcml2ZXRyYWluX3F1ZXVlXy5nb2FsLT5yaWdodF9nb2FsLAorICAgICAgICAgICAgICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLkdldFJpZ2h0UG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAxZS0yKTsKKyAgfQorCisgIHZpcnR1YWwgfkRyaXZldHJhaW5UZXN0KCkgeworICAgIDo6ZnJjOTcxOjpzZW5zb3JzOjpneXJvX3JlYWRpbmcuQ2xlYXIoKTsKKyAgfQorfTsKKworLy8gVGVzdHMgdGhhdCB0aGUgZHJpdmV0cmFpbiBjb252ZXJnZXMgb24gYSBnb2FsLgorVEVTVF9GKERyaXZldHJhaW5UZXN0LCBDb252ZXJnZXNDb3JyZWN0bHkpIHsKKyAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5jb250cm9sX2xvb3BfZHJpdmluZyh0cnVlKQorICAgICAgLmxlZnRfZ29hbCgtMS4wKQorICAgICAgLnJpZ2h0X2dvYWwoMS4wKS5TZW5kKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyArK2kpIHsKKyAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgfQorICBWZXJpZnlOZWFyR29hbCgpOworfQorCisvLyBUZXN0cyB0aGF0IGl0IHN1cnZpdmVzIGRpc2FibGluZy4KK1RFU1RfRihEcml2ZXRyYWluVGVzdCwgU3Vydml2ZXNEaXNhYmxpbmcpIHsKKyAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5jb250cm9sX2xvb3BfZHJpdmluZyh0cnVlKQorICAgICAgLmxlZnRfZ29hbCgtMS4wKQorICAgICAgLnJpZ2h0X2dvYWwoMS4wKS5TZW5kKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyArK2kpIHsKKyAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgaWYgKGkgPiAyMCAmJiBpIDwgMjAwKSB7CisgICAgICBTaW11bGF0ZVRpbWVzdGVwKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgICB9CisgIH0KKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCBuZXZlciBoYXZpbmcgYSBnb2FsIGRvZXNuJ3QgYnJlYWsuCitURVNUX0YoRHJpdmV0cmFpblRlc3QsIE5vR29hbFN0YXJ0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgeworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBkcml2ZXRyYWluX21vdG9yXy5JdGVyYXRlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGF0IG5ldmVyIGhhdmluZyBhIGdvYWwsIGJ1dCBoYXZpbmcgZHJpdmVyJ3Mgc3RhdGlvbiBtZXNzYWdlcywgZG9lc24ndAorLy8gYnJlYWsuCitURVNUX0YoRHJpdmV0cmFpblRlc3QsIE5vR29hbFdpdGhSb2JvdFN0YXRlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgeworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBkcml2ZXRyYWluX21vdG9yXy5JdGVyYXRlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9Cit9CisKKzo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IE1ha2VCb3goZG91YmxlIHgxX21pbiwgZG91YmxlIHgxX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgyX21pbiwgZG91YmxlIHgyX21heCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gYm94X0g7CisgIGJveF9IIDw8IC8qW1sqLyAxLjAsIDAuMCAvKl0qLywKKyAgICAgICAgICAgIC8qWyovLTEuMCwgMC4wIC8qXSovLAorICAgICAgICAgICAgLypbKi8gMC4wLCAxLjAgLypdKi8sCisgICAgICAgICAgICAvKlsqLyAwLjAsLTEuMCAvKl1dKi87CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPiBib3hfazsKKyAgYm94X2sgPDwgLypbWyovIHgxX21heCAvKl0qLywKKyAgICAgICAgICAgIC8qWyovLXgxX21pbiAvKl0qLywKKyAgICAgICAgICAgIC8qWyovIHgyX21heCAvKl0qLywKKyAgICAgICAgICAgIC8qWyovLXgyX21pbiAvKl1dKi87CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IHRfcG9seShib3hfSCwgYm94X2spOworICByZXR1cm4gdF9wb2x5OworfQorCitjbGFzcyBDb2VyY2VHb2FsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworfTsKKworLy8gV0hPT09ISCEKK1RFU1RfRihDb2VyY2VHb2FsVGVzdCwgSW5zaWRlKSB7CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IGJveCA9IE1ha2VCb3goMSwgMiwgMSwgMik7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEs7CisgIEsgPDwgLypbWyovIDEsIC0xIC8qXV0qLzsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gUjsKKyAgUiA8PCAvKltbKi8gMS41LCAxLjUgLypdXSovOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBvdXRwdXQgPQorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkNvZXJjZUdvYWwoYm94LCBLLCAwLCBSKTsKKworICBFWFBFQ1RfRVEoUigwLCAwKSwgb3V0cHV0KDAsIDApKTsKKyAgRVhQRUNUX0VRKFIoMSwgMCksIG91dHB1dCgxLCAwKSk7Cit9CisKK1RFU1RfRihDb2VyY2VHb2FsVGVzdCwgT3V0c2lkZV9JbnNpZGVfSW50ZXJzZWN0KSB7CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IGJveCA9IE1ha2VCb3goMSwgMiwgMSwgMik7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEs7CisgIEsgPDwgMSwgLTE7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFI7CisgIFIgPDwgNSwgNTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gb3V0cHV0ID0KKyAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDb2VyY2VHb2FsKGJveCwgSywgMCwgUik7CisKKyAgRVhQRUNUX0VRKDIuMCwgb3V0cHV0KDAsIDApKTsKKyAgRVhQRUNUX0VRKDIuMCwgb3V0cHV0KDEsIDApKTsKK30KKworVEVTVF9GKENvZXJjZUdvYWxUZXN0LCBPdXRzaWRlX0luc2lkZV9ub19JbnRlcnNlY3QpIHsKKyAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gYm94ID0gTWFrZUJveCgzLCA0LCAxLCAyKTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gSzsKKyAgSyA8PCAxLCAtMTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gUjsKKyAgUiA8PCA1LCA1OworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBvdXRwdXQgPQorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkNvZXJjZUdvYWwoYm94LCBLLCAwLCBSKTsKKworICBFWFBFQ1RfRVEoMy4wLCBvdXRwdXQoMCwgMCkpOworICBFWFBFQ1RfRVEoMi4wLCBvdXRwdXQoMSwgMCkpOworfQorCitURVNUX0YoQ29lcmNlR29hbFRlc3QsIE1pZGRsZV9PZl9FZGdlKSB7CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IGJveCA9IE1ha2VCb3goMCwgNCwgMSwgMik7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEs7CisgIEsgPDwgLTEsIDE7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFI7CisgIFIgPDwgNSwgNTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gb3V0cHV0ID0KKyAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDb2VyY2VHb2FsKGJveCwgSywgMCwgUik7CisKKyAgRVhQRUNUX0VRKDIuMCwgb3V0cHV0KDAsIDApKTsKKyAgRVhQRUNUX0VRKDIuMCwgb3V0cHV0KDEsIDApKTsKK30KKworVEVTVF9GKENvZXJjZUdvYWxUZXN0LCBQZXJwZW5kaWN1bGFyTGluZSkgeworICA6OmFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwyPiBib3ggPSBNYWtlQm94KDEsIDIsIDEsIDIpOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBLOworICBLIDw8IDEsIDE7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFI7CisgIFIgPDwgNSwgNTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gb3V0cHV0ID0KKyAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDb2VyY2VHb2FsKGJveCwgSywgMCwgUik7CisKKyAgRVhQRUNUX0VRKDEuMCwgb3V0cHV0KDAsIDApKTsKKyAgRVhQRUNUX0VRKDEuMCwgb3V0cHV0KDEsIDApKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgYm90MwpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9tYWluLmNjIGIvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNmFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX21haW4uY2MKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgImJvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uaCIKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKworaW50IG1haW4oKSB7CisgIDo6YW9zOjpJbml0KCk7CisgIGJvdDM6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5Mb29wIGRyaXZldHJhaW47CisgIGRyaXZldHJhaW4uUnVuKCk7CisgIDo6YW9zOjpDbGVhbnVwKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjIGIvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWI5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jaW1fcGxhbnQuY2MKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgImJvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgYm90MyB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwxLCAxLCAxPiBNYWtlQ0lNUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBBOworICBBIDw8IDAuNzgzOTI0NDczNTQ0OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gQjsKKyAgQiA8PCA4Ljk0OTc5NTg2OTczOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gQzsKKyAgQyA8PCAxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gRDsKKyAgRCA8PCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MSwgMSwgMT4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MSwgMSwgMT4gTWFrZUNJTUNvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBMOworICBMIDw8IDAuNzczOTI0NDczNTQ0OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gSzsKKyAgSyA8PCAwLjA4NjQ3Mzk4MDUwMzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEFfaW52OworICBBX2ludiA8PCAxLjI3NTYzMzA5MTk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwxLCAxLCAxPihMLCBLLCBBX2ludiwgTWFrZUNJTVBsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnQ8MSwgMSwgMT4gTWFrZUNJTVBsYW50KCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MSwgMSwgMT4+PiBwbGFudHMoMSk7CisgIHBsYW50c1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwxLCAxLCAxPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwxLCAxLCAxPihNYWtlQ0lNUGxhbnRDb2VmZmljaWVudHMoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50PDEsIDEsIDE+KCZwbGFudHMpOworfQorCitTdGF0ZUZlZWRiYWNrTG9vcDwxLCAxLCAxPiBNYWtlQ0lNTG9vcCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MSwgMSwgMT4+PiBjb250cm9sbGVycygxKTsKKyAgY29udHJvbGxlcnNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwxLCAxLCAxPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDEsIDEsIDE+KE1ha2VDSU1Db250cm9sbGVyKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tMb29wPDEsIDEsIDE+KCZjb250cm9sbGVycyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgYm90MwpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmggYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jaW1fcGxhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2JkNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBCT1QzX0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9DSU1fUExBTlRfSF8KKyNkZWZpbmUgQk9UM19DT05UUk9MX0xPT1BTX0RSSVZFVFJBSU5fUE9MWURSSVZFVFJBSU5fQ0lNX1BMQU5UX0hfCisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBib3QzIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDEsIDEsIDE+IE1ha2VDSU1QbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwxLCAxLCAxPiBNYWtlQ0lNQ29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnQ8MSwgMSwgMT4gTWFrZUNJTVBsYW50KCk7CisKK1N0YXRlRmVlZGJhY2tMb29wPDEsIDEsIDE+IE1ha2VDSU1Mb29wKCk7CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgYm90MworCisjZW5kaWYgIC8vIEJPVDNfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX1BPTFlEUklWRVRSQUlOX0NJTV9QTEFOVF9IXwpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjIGIvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTEzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MKQEAgLTAsMCArMSwxMzMgQEAKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGJvdDMgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0xvd1BsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQTsKKyAgQSA8PCAwLjk1NTQ5OTQwMDU0MSwgMC4wMDk2MjY5MTQwMzc0OSwgMC4wMDk2MjY5MTQwMzc0OSwgMC45NTU0OTk0MDA1NDE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBCOworICBCIDw8IDAuMDE2NDcxNDc2MzkzMSwgLTAuMDAzNTYzMzExMjYzOTcsIC0wLjAwMzU2MzMxMTI2Mzk3LCAwLjAxNjQ3MTQ3NjM5MzE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBDOworICBDIDw8IDEuMCwgMC4wLCAwLjAsIDEuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMC4wLCAwLjAsIDAuMCwgMC4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjAsIDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjAsIC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93SGlnaFBsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQTsKKyAgQSA8PCAwLjk1NTQ5OTQwMDU0MSwgMC4wMDk2MjY5MTQwMzc0OSwgMC4wMDk2MjY5MTQwMzc0OSwgMC45NTU0OTk0MDA1NDE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBCOworICBCIDw8IDAuMDE2NDcxNDc2MzkzMSwgLTAuMDAzNTYzMzExMjYzOTcsIC0wLjAwMzU2MzMxMTI2Mzk3LCAwLjAxNjQ3MTQ3NjM5MzE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBDOworICBDIDw8IDEuMCwgMC4wLCAwLjAsIDEuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMC4wLCAwLjAsIDAuMCwgMC4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjAsIDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjAsIC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaExvd1BsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQTsKKyAgQSA8PCAwLjk1NTQ5OTQwMDU0MSwgMC4wMDk2MjY5MTQwMzc0OSwgMC4wMDk2MjY5MTQwMzc0OSwgMC45NTU0OTk0MDA1NDE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBCOworICBCIDw8IDAuMDE2NDcxNDc2MzkzMSwgLTAuMDAzNTYzMzExMjYzOTcsIC0wLjAwMzU2MzMxMTI2Mzk3LCAwLjAxNjQ3MTQ3NjM5MzE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBDOworICBDIDw8IDEuMCwgMC4wLCAwLjAsIDEuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMC4wLCAwLjAsIDAuMCwgMC4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjAsIDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjAsIC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaEhpZ2hQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEE7CisgIEEgPDwgMC45NTU0OTk0MDA1NDEsIDAuMDA5NjI2OTE0MDM3NDksIDAuMDA5NjI2OTE0MDM3NDksIDAuOTU1NDk5NDAwNTQxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQjsKKyAgQiA8PCAwLjAxNjQ3MTQ3NjM5MzEsIC0wLjAwMzU2MzMxMTI2Mzk3LCAtMC4wMDM1NjMzMTEyNjM5NywgMC4wMTY0NzE0NzYzOTMxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQzsKKyAgQyA8PCAxLjAsIDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAuMCwgMC4wLCAwLjAsIDAuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93TG93Q29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEw7CisgIEwgPDwgMC45MzU0OTk0MDA1NDEsIDAuMDA5NjI2OTE0MDM3NDksIDAuMDA5NjI2OTE0MDM3NDksIDAuOTM1NDk5NDAwNTQxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gSzsKKyAgSyA8PCAyMi43NzUwMjg4NTczLCA1LjUxMTQzMjUzNTU2LCA1LjUxMTQzMjUzNTU2LCAyMi43NzUwMjg4NTczOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQV9pbnY7CisgIEFfaW52IDw8IDEuMDQ2Njc5MzgxMjcsIC0wLjAxMDU0NTU3NjkyMywgLTAuMDEwNTQ1NTc2OTIzLCAxLjA0NjY3OTM4MTI3OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gTDsKKyAgTCA8PCAwLjkzNTQ5OTQwMDU0MSwgMC4wMDk2MjY5MTQwMzc0OSwgMC4wMDk2MjY5MTQwMzc0OSwgMC45MzU0OTk0MDA1NDE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBLOworICBLIDw8IDIyLjc3NTAyODg1NzMsIDUuNTExNDMyNTM1NTYsIDUuNTExNDMyNTM1NTYsIDIyLjc3NTAyODg1NzM7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wNDY2NzkzODEyNywgLTAuMDEwNTQ1NTc2OTIzLCAtMC4wMTA1NDU1NzY5MjMsIDEuMDQ2Njc5MzgxMjc7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hMb3dDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gTDsKKyAgTCA8PCAwLjkzNTQ5OTQwMDU0MSwgMC4wMDk2MjY5MTQwMzc0OSwgMC4wMDk2MjY5MTQwMzc0OSwgMC45MzU0OTk0MDA1NDE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBLOworICBLIDw8IDIyLjc3NTAyODg1NzMsIDUuNTExNDMyNTM1NTYsIDUuNTExNDMyNTM1NTYsIDIyLjc3NTAyODg1NzM7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wNDY2NzkzODEyNywgLTAuMDEwNTQ1NTc2OTIzLCAtMC4wMTA1NDU1NzY5MjMsIDEuMDQ2Njc5MzgxMjc7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hIaWdoQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEw7CisgIEwgPDwgMC45MzU0OTk0MDA1NDEsIDAuMDA5NjI2OTE0MDM3NDksIDAuMDA5NjI2OTE0MDM3NDksIDAuOTM1NDk5NDAwNTQxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gSzsKKyAgSyA8PCAyMi43NzUwMjg4NTczLCA1LjUxMTQzMjUzNTU2LCA1LjUxMTQzMjUzNTU2LCAyMi43NzUwMjg4NTczOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQV9pbnY7CisgIEFfaW52IDw8IDEuMDQ2Njc5MzgxMjcsIC0wLjAxMDU0NTU3NjkyMywgLTAuMDEwNTQ1NTc2OTIzLCAxLjA0NjY3OTM4MTI3OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnQ8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpblBsYW50KCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4+PiBwbGFudHMoNCk7CisgIHBsYW50c1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93TG93UGxhbnRDb2VmZmljaWVudHMoKSkpOworICBwbGFudHNbMV0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4oTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1syXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaExvd1BsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcGxhbnRzWzNdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+KE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudDwyLCAyLCAyPigmcGxhbnRzKTsKK30KKworU3RhdGVGZWVkYmFja0xvb3A8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvb3AoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+Pj4gY29udHJvbGxlcnMoNCk7CisgIGNvbnRyb2xsZXJzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPihNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93TG93Q29udHJvbGxlcigpKSk7CisgIGNvbnRyb2xsZXJzWzFdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPihNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93SGlnaENvbnRyb2xsZXIoKSkpOworICBjb250cm9sbGVyc1syXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hMb3dDb250cm9sbGVyKCkpKTsKKyAgY29udHJvbGxlcnNbM10gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+KE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaENvbnRyb2xsZXIoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja0xvb3A8MiwgMiwgMj4oJmNvbnRyb2xsZXJzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBib3QzCmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaCBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWQxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIEJPVDNfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX1BPTFlEUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXworI2RlZmluZSBCT1QzX0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9ET0dfTU9UT1JfUExBTlRfSF8KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGJvdDMgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0xvd1BsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dMb3dDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93SGlnaFBsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dIaWdoQ29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaExvd0NvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaENvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5QbGFudCgpOworCitTdGF0ZUZlZWRiYWNrTG9vcDwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG9vcCgpOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGJvdDMKKworI2VuZGlmICAvLyBCT1QzX0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9ET0dfTU9UT1JfUExBTlRfSF8KZGlmZiAtLWdpdCBhL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3JlcGxheV9kcml2ZXRyYWluLmNjIGIvYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcmVwbGF5X2RyaXZldHJhaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmYjg3YwotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3JlcGxheV9kcml2ZXRyYWluLmNjCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3JlcGxheV9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKworLy8gUmVhZHMgb25lIG9yIG1vcmUgbG9nIGZpbGVzIGFuZCBzZW5kcyBvdXQgYWxsIHRoZSBxdWV1ZSBtZXNzYWdlcyAoaW4gdGhlCisvLyBjb3JyZWN0IG9yZGVyIGFuZCBhdCB0aGUgY29ycmVjdCB0aW1lKSB0byBmZWVkIGEgImxpdmUiIGRyaXZldHJhaW4gcHJvY2Vzcy4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGlmIChhcmdjIDw9IDEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5lZWQgYXQgbGVhc3Qgb25lIGZpbGUgdG8gcmVwbGF5IVxuIik7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIDo6YW9zOjpJbml0TlJUKCk7CisKKyAgOjphb3M6OmNvbnRyb2xzOjpDb250cm9sTG9vcFJlcGxheWVyPDo6Ym90Mzo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlPgorICAgICAgcmVwbGF5ZXIoJjo6Ym90Mzo6Y29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZSwgImRyaXZldHJhaW4iKTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKyAgICByZXBsYXllci5Qcm9jZXNzRmlsZShhcmd2W2ldKTsKKyAgfQorCisgIDo6YW9zOjpDbGVhbnVwKCk7Cit9CmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZS5jYyBiL2JvdDMvY29udHJvbF9sb29wcy9pbnRha2UvaW50YWtlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTczMGIKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZS5jYwpAQCAtMCwwICsxLDM2IEBACisjaW5jbHVkZSAiYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UuaCIKKworI2luY2x1ZGUgImJvdDMvY29udHJvbF9sb29wcy9pbnRha2UvaW50YWtlLnEuaCIKKworbmFtZXNwYWNlIGJvdDMgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitJbnRha2U6OkludGFrZShjb250cm9sX2xvb3BzOjpJbnRha2VRdWV1ZSAqaW50YWtlKQorICAgIDogYW9zOjpjb250cm9sczo6Q29udHJvbExvb3A8Y29udHJvbF9sb29wczo6SW50YWtlUXVldWU+KGludGFrZSkge30KKwordm9pZCBJbnRha2U6OlJ1bkl0ZXJhdGlvbigKKyAgICBjb25zdCBjb250cm9sX2xvb3BzOjpJbnRha2VRdWV1ZTo6R29hbCAqZ29hbCwKKyAgICBjb25zdCBjb250cm9sX2xvb3BzOjpJbnRha2VRdWV1ZTo6UG9zaXRpb24gKiAvKnBvc2l0aW9uKi8sCisgICAgY29udHJvbF9sb29wczo6SW50YWtlUXVldWU6Ok91dHB1dCAqb3V0cHV0LAorICAgIGNvbnRyb2xfbG9vcHM6OkludGFrZVF1ZXVlOjpTdGF0dXMgKiAvKnN0YXR1cyovKSB7CisKKyAgaWYgKG91dHB1dCAhPSBudWxscHRyKSB7CisgICAgb3V0cHV0LT5aZXJvKCk7CisKKyAgICBjb25zdCBpbnQxNl90IGludGFrZV9tb3ZlbWVudCA9IGdvYWwtPm1vdmVtZW50OworCisgICAgaWYgKGludGFrZV9tb3ZlbWVudCA+IDApIHsKKyAgICAgIC8vIFN1Y2suCisgICAgICBvdXRwdXQtPmludGFrZSA9IGtJbnRha2VWb2x0YWdlRnVsbFBvd2VyOworICAgIH0gZWxzZSBpZiAoaW50YWtlX21vdmVtZW50IDwgMCkgeworICAgICAgLy8gU3BpdC4KKyAgICAgIG91dHB1dC0+aW50YWtlID0gLWtJbnRha2VWb2x0YWdlRnVsbFBvd2VyOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTdGF0aW9uYXJ5LgorICAgICAgb3V0cHV0LT5pbnRha2UgPSAwLjA7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgYm90MwpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UuZ3lwIGIvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjFiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZS5neXAKQEAgLTAsMCArMSw2MCBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaW50YWtlX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWydpbnRha2UucSddLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9wYXRoJzogJ2JvdDMvY29udHJvbF9sb29wcy9pbnRha2UnLAorICAgICAgfSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3BfcXVldWVzJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vLi4vYW9zL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaW50YWtlX2xpYicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2ludGFrZS5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2ludGFrZV9xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnaW50YWtlX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2ludGFrZV9saWJfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnaW50YWtlX2xpYl90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJ2ludGFrZV9saWInLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3BfdGVzdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDp0ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaW50YWtlJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdpbnRha2VfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnaW50YWtlX2xpYicsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZS5oIGIvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2NkOWZjCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIEJPVDNfQ09OVFJPTF9MT09QU19JTlRBS0VfSF8KKyNkZWZpbmUgQk9UM19DT05UUk9MX0xPT1BTX0lOVEFLRV9IXworCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaCIKKworI2luY2x1ZGUgImJvdDMvY29udHJvbF9sb29wcy9pbnRha2UvaW50YWtlLnEuaCIKKworbmFtZXNwYWNlIGJvdDMgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitjb25zdGV4cHIgZG91YmxlIGtJbnRha2VWb2x0YWdlRnVsbFBvd2VyID0gMTIuMDsKKworY2xhc3MgSW50YWtlIDogcHVibGljIGFvczo6Y29udHJvbHM6OkNvbnRyb2xMb29wPGNvbnRyb2xfbG9vcHM6OkludGFrZVF1ZXVlPiB7CisgcHVibGljOgorICBleHBsaWNpdCBJbnRha2UoCisgICAgICBjb250cm9sX2xvb3BzOjpJbnRha2VRdWV1ZSAqaW50YWtlX3F1ZXVlID0gJmNvbnRyb2xfbG9vcHM6OmludGFrZV9xdWV1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgUnVuSXRlcmF0aW9uKGNvbnN0IGNvbnRyb2xfbG9vcHM6OkludGFrZVF1ZXVlOjpHb2FsICpnb2FsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sX2xvb3BzOjpJbnRha2VRdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpJbnRha2VRdWV1ZTo6T3V0cHV0ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OkludGFrZVF1ZXVlOjpTdGF0dXMgKnN0YXR1cykgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGJvdDMKKworI2VuZGlmICAvLyBCT1QzX0NPTlRST0xfTE9PUFNfSU5UQUtFX0hfCmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZS5xIGIvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ3ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UucQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGJvdDMuY29udHJvbF9sb29wczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcHMucSI7CisKK3F1ZXVlX2dyb3VwIEludGFrZVF1ZXVlIHsKKyAgaW1wbGVtZW50cyBhb3MuY29udHJvbF9sb29wcy5Db250cm9sTG9vcDsKKworICBtZXNzYWdlIEdvYWwgeworICAgIC8vIFBvc2l0aXZlID0gc3VjaywgbmVnYXRpdmUgPSBzcGl0LCB6ZXJvID0gc3RhdGlvbmFyeS4KKyAgICBpbnQxNl90IG1vdmVtZW50OworICB9OworCisgIG1lc3NhZ2UgUG9zaXRpb24ge307CisKKyAgbWVzc2FnZSBPdXRwdXQgeworICAgIGRvdWJsZSBpbnRha2U7CisgIH07CisKKyAgbWVzc2FnZSBTdGF0dXMge307CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBQb3NpdGlvbiBwb3NpdGlvbjsKKyAgcXVldWUgT3V0cHV0IG91dHB1dDsKKyAgcXVldWUgU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIEludGFrZVF1ZXVlIGludGFrZV9xdWV1ZTsKZGlmZiAtLWdpdCBhL2JvdDMvY29udHJvbF9sb29wcy9pbnRha2UvaW50YWtlX2xpYl90ZXN0LmNjIGIvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2VfbGliX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlNjY3MgotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvY29udHJvbF9sb29wcy9pbnRha2UvaW50YWtlX2xpYl90ZXN0LmNjCkBAIC0wLDAgKzEsMTIzIEBACisjaW5jbHVkZSAiYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29tbW9ubWF0aC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wX3Rlc3QuaCIKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZS5xLmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCituYW1lc3BhY2UgYm90MyB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIENsYXNzIHdoaWNoIHNpbXVsYXRlcyB0aGUgZWxldmF0b3IgYW5kIHNlbmRzIG91dCBxdWV1ZSBtZXNzYWdlcyB3aXRoIHRoZQorLy8gcG9zaXRpb24uCitjbGFzcyBJbnRha2VTaW11bGF0aW9uIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYSBzaW11bGF0aW9uLgorICBJbnRha2VTaW11bGF0aW9uKCkKKyAgICAgIDogcXVldWVfKCIuYm90My5jb250cm9sX2xvb3BzLmludGFrZV9xdWV1ZSIsIDB4NjI3Y2VlZWIsCisgICAgICAgICAgICAgICAgICAgICAgIi5ib3QzLmNvbnRyb2xfbG9vcHMuaW50YWtlX3F1ZXVlLmdvYWwiLAorICAgICAgICAgICAgICAgICAgICAgICIuYm90My5jb250cm9sX2xvb3BzLmludGFrZV9xdWV1ZS5wb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgIi5ib3QzLmNvbnRyb2xfbG9vcHMuaW50YWtlX3F1ZXVlLm91dHB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgIi5ib3QzLmNvbnRyb2xfbG9vcHMuaW50YWtlX3F1ZXVlLnN0YXR1cyIpIHsKKyAgfQorCisgIC8vIFNpbXVsYXRlcyBmb3IgYSBzaW5nbGUgdGltZXN0ZXAuCisgIHZvaWQgU2ltdWxhdGUoKSB7CisgICAgRVhQRUNUX1RSVUUocXVldWVfLm91dHB1dC5GZXRjaExhdGVzdCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgSW50YWtlUXVldWUgcXVldWVfOworfTsKKworY2xhc3MgSW50YWtlVGVzdCA6IHB1YmxpYyA6OmFvczo6dGVzdGluZzo6Q29udHJvbExvb3BUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEludGFrZVRlc3QoKQorICAgICAgOiBxdWV1ZV8oIi5ib3QzLmNvbnRyb2xfbG9vcHMuaW50YWtlX3F1ZXVlIiwgMHg2MjdjZWVlYiwKKyAgICAgICAgICAgICAgICAgICAgICAiLmJvdDMuY29udHJvbF9sb29wcy5pbnRha2VfcXVldWUuZ29hbCIsCisgICAgICAgICAgICAgICAgICAgICAgIi5ib3QzLmNvbnRyb2xfbG9vcHMuaW50YWtlX3F1ZXVlLnBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAiLmJvdDMuY29udHJvbF9sb29wcy5pbnRha2VfcXVldWUub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAiLmJvdDMuY29udHJvbF9sb29wcy5pbnRha2VfcXVldWUuc3RhdHVzIiksCisgICAgICAgIGludGFrZV8oJnF1ZXVlXyksCisgICAgICAgIHBsYW50XygpIHsKKyAgICBzZXRfdGVhbV9pZCg5NzEpOworICB9CisKKyAgLy8gUnVucyBvbmUgaXRlcmF0aW9uIG9mIHRoZSB3aG9sZSBzaW11bGF0aW9uLgorICB2b2lkIFJ1bkl0ZXJhdGlvbihib29sIGVuYWJsZWQgPSB0cnVlKSB7CisgICAgU2VuZE1lc3NhZ2VzKGVuYWJsZWQpOworCisgICAgcXVldWVfLnBvc2l0aW9uLk1ha2VNZXNzYWdlKCkuU2VuZCgpOworCisgICAgaW50YWtlXy5JdGVyYXRlKCk7CisKKyAgICBUaWNrVGltZSgpOworICB9CisKKyAgLy8gUnVucyBpdGVyYXRpb25zIHVudGlsIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHNpbXVsYXRlZCB0aW1lIGhhcyBlbGFwc2VkLgorICB2b2lkIFJ1bkZvclRpbWUoY29uc3QgVGltZSAmcnVuX2ZvciwgYm9vbCBlbmFibGVkID0gdHJ1ZSkgeworICAgIGNvbnN0IGF1dG8gc3RhcnRfdGltZSA9IFRpbWU6Ok5vdygpOworICAgIHdoaWxlIChUaW1lOjpOb3coKSA8IHN0YXJ0X3RpbWUgKyBydW5fZm9yKSB7CisgICAgICBSdW5JdGVyYXRpb24oZW5hYmxlZCk7CisgICAgfQorICB9CisKKyAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0IHF1ZXVlIHNvIHRoYXQgaXQgaW52YWxpZGF0ZXMgdGhlIHF1ZXVlCisgIC8vIHRoYXQgaXQgcG9pbnRzIHRvLiBPdGhlcndpc2UsIHdlIHdpbGwgaGF2ZSBhIHBvaW50ZWQgdG8gc2hhcmVkIG1lbW9yeSB0aGF0CisgIC8vIGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgSW50YWtlUXVldWUgcXVldWVfOworCisgIC8vIENyZWF0ZSBhIGNvbnRyb2wgbG9vcC4KKyAgSW50YWtlIGludGFrZV87CisgIEludGFrZVNpbXVsYXRpb24gcGxhbnRfOworfTsKKworLy8gVGVzdHMgdGhhdCB0aGUgbG9vcCBkb2VzIG5vdGhpbmcgd2hlbiB0aGUgZ29hbCBpcyB6ZXJvLgorVEVTVF9GKEludGFrZVRlc3QsIERvZXNOb3RoaW5nKSB7CisgIEFTU0VSVF9UUlVFKHF1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAubW92ZW1lbnQoMCkKKyAgICAgICAgICAgICAgICAgIC5TZW5kKCkpOworCisgIC8vIFJ1biBmb3IgYSBiaXQuCisgIFJ1bkZvclRpbWUoMS4wKTsKKworICBBU1NFUlRfVFJVRShxdWV1ZV8ub3V0cHV0LkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfRVEocXVldWVfLm91dHB1dC0+aW50YWtlLCAwLjApOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBpbnRha2Ugc3Vja3Mgd2l0aCBhIHBvc2l0aXZlIGdvYWwuCitURVNUX0YoSW50YWtlVGVzdCwgU3Vja2luZ0dvYWwpIHsKKyAgQVNTRVJUX1RSVUUocXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgIC5tb3ZlbWVudCgxKQorICAgICAgICAgICAgICAgICAgLlNlbmQoKSk7CisKKyAgLy8gUnVuIGZvciBhIGJpdC4KKyAgUnVuRm9yVGltZSgxLjApOworCisgIEFTU0VSVF9UUlVFKHF1ZXVlXy5vdXRwdXQuRmV0Y2hMYXRlc3QoKSk7CisgIEVYUEVDVF9HVChxdWV1ZV8ub3V0cHV0LT5pbnRha2UsIDAuMCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGludGFrZSBzcGl0cyB3aXRoIGEgbmVnYXRpdmUgZ29hbC4KK1RFU1RfRihJbnRha2VUZXN0LCBTcGl0dGluZ0dvYWwpIHsKKyAgQVNTRVJUX1RSVUUocXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgIC5tb3ZlbWVudCgtMSkKKyAgICAgICAgICAgICAgICAgIC5TZW5kKCkpOworCisgIC8vIFJ1biBmb3IgYSBiaXQuCisgIFJ1bkZvclRpbWUoMS4wKTsKKworICBBU1NFUlRfVFJVRShxdWV1ZV8ub3V0cHV0LkZldGNoTGF0ZXN0KCkpOworICBFWFBFQ1RfTFQocXVldWVfLm91dHB1dC0+aW50YWtlLCAwLjApOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBib3QzCmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZV9tYWluLmNjIGIvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2VfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2M1ZmFiCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2VfbWFpbi5jYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSAiYm90My9jb250cm9sX2xvb3BzL2ludGFrZS9pbnRha2UuaCIKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKworaW50IG1haW4oKSB7CisgIDo6YW9zOjpJbml0KCk7CisgIDo6Ym90Mzo6Y29udHJvbF9sb29wczo6SW50YWtlIGludGFrZTsKKyAgaW50YWtlLlJ1bigpOworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvdDMvY29udHJvbF9sb29wcy9weXRob24vY29udHJvbF9sb29wLnB5IGIvYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9jb250cm9sX2xvb3AucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxODgwZgotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvY29udHJvbF9sb29wcy9weXRob24vY29udHJvbF9sb29wLnB5CkBAIC0wLDAgKzEsMzM4IEBACitpbXBvcnQgY29udHJvbHMKK2ltcG9ydCBudW1weQorCitjbGFzcyBDb25zdGFudChvYmplY3QpOgorICBkZWYgX19pbml0X18gKHNlbGYsIG5hbWUsIGZvcm1hdHQsIHZhbHVlKToKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi5mb3JtYXR0ID0gZm9ybWF0dAorICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgIHNlbGYuZm9ybWF0VG9UeXBlID0ge30KKyAgICBzZWxmLmZvcm1hdFRvVHlwZVsnJWYnXSA9ICJkb3VibGUiOworICAgIHNlbGYuZm9ybWF0VG9UeXBlWyclZCddID0gImludCI7CisgIGRlZiBfX3N0cl9fIChzZWxmKToKKyAgICByZXR1cm4gc3RyKCJcbnN0YXRpYyBjb25zdGV4cHIgJXMgJXMgPSAiKyBzZWxmLmZvcm1hdHQgKyI7XG4iKSAlIFwKKyAgICAgICAgKHNlbGYuZm9ybWF0VG9UeXBlW3NlbGYuZm9ybWF0dF0sIHNlbGYubmFtZSwgc2VsZi52YWx1ZSkKKworCitjbGFzcyBDb250cm9sTG9vcFdyaXRlcihvYmplY3QpOgorICBkZWYgX19pbml0X18oc2VsZiwgZ2Fpbl9zY2hlZHVsZV9uYW1lLCBsb29wcywgbmFtZXNwYWNlcz1Ob25lLCB3cml0ZV9jb25zdGFudHM9RmFsc2UpOgorICAgICIiIkNvbnN0cnVjdHMgYSBjb250cm9sIGxvb3Agd3JpdGVyLgorCisgICAgQXJnczoKKyAgICAgIGdhaW5fc2NoZWR1bGVfbmFtZTogc3RyaW5nLCBOYW1lIG9mIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIuCisgICAgICBsb29wczogYXJyYXlbQ29udHJvbExvb3BdLCBhIGxpc3Qgb2YgY29udHJvbCBsb29wcyB0byBnYWluIHNjaGVkdWxlCisgICAgICAgIGluIG9yZGVyLgorICAgICAgbmFtZXNwYWNlczogYXJyYXlbc3RyaW5nXSwgYSBsaXN0IG9mIG5hbWVzIG9mIG5hbWVzcGFjZXMgdG8gbmVzdCBpbgorICAgICAgICBvcmRlci4gIElmIE5vbmUsIHRoZSBkZWZhdWx0IHdpbGwgYmUgdXNlZC4KKyAgICAiIiIKKyAgICBzZWxmLl9nYWluX3NjaGVkdWxlX25hbWUgPSBnYWluX3NjaGVkdWxlX25hbWUKKyAgICBzZWxmLl9sb29wcyA9IGxvb3BzCisgICAgaWYgbmFtZXNwYWNlczoKKyAgICAgIHNlbGYuX25hbWVzcGFjZXMgPSBuYW1lc3BhY2VzCisgICAgZWxzZToKKyAgICAgIHNlbGYuX25hbWVzcGFjZXMgPSBbJ2ZyYzk3MScsICdjb250cm9sX2xvb3BzJ10KKworICAgIHNlbGYuX25hbWVzcGFjZV9zdGFydCA9ICdcbicuam9pbigKKyAgICAgICAgWyduYW1lc3BhY2UgJXMgeycgJSBuYW1lIGZvciBuYW1lIGluIHNlbGYuX25hbWVzcGFjZXNdKQorCisgICAgc2VsZi5fbmFtZXNwYWNlX2VuZCA9ICdcbicuam9pbigKKyAgICAgICAgWyd9ICAvLyBuYW1lc3BhY2UgJXMnICUgbmFtZSBmb3IgbmFtZSBpbiByZXZlcnNlZChzZWxmLl9uYW1lc3BhY2VzKV0pCisgICAgCisgICAgc2VsZi5fY29uc3RhbnRfbGlzdCA9IFtdCisKKyAgZGVmIEFkZENvbnN0YW50KHNlbGYsIGNvbnN0YW50KToKKyAgICAiIiJBZGRzIGEgY29uc3RhbnQgdG8gd3JpdGUuCisKKyAgICBBcmdzOgorICAgICAgY29uc3RhbnQ6IENvbnN0YW50LCB0aGUgY29uc3RhbnQgdG8gYWRkIHRvIHRoZSBoZWFkZXIuCisgICAgIiIiCisgICAgc2VsZi5fY29uc3RhbnRfbGlzdC5hcHBlbmQoY29uc3RhbnQpCisKKyAgZGVmIF9Ub3BEaXJlY3Rvcnkoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX25hbWVzcGFjZXNbMF0KKworICBkZWYgX0hlYWRlckd1YXJkKHNlbGYsIGhlYWRlcl9maWxlKToKKyAgICByZXR1cm4gKHNlbGYuX1RvcERpcmVjdG9yeSgpLnVwcGVyKCkgKyAnX0NPTlRST0xfTE9PUFNfJyArCisgICAgICAgICAgICBoZWFkZXJfZmlsZS51cHBlcigpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy8nLCAnXycpICsKKyAgICAgICAgICAgICdfJykKKworICBkZWYgV3JpdGUoc2VsZiwgaGVhZGVyX2ZpbGUsIGNjX2ZpbGUpOgorICAgICIiIldyaXRlcyB0aGUgbG9vcHMgdG8gdGhlIHNwZWNpZmllZCBmaWxlcy4iIiIKKyAgICBzZWxmLldyaXRlSGVhZGVyKGhlYWRlcl9maWxlKQorICAgIHNlbGYuV3JpdGVDQyhoZWFkZXJfZmlsZSwgY2NfZmlsZSkKKworICBkZWYgX0dlbmVyaWNUeXBlKHNlbGYsIHR5cGVuYW1lKToKKyAgICAiIiJSZXR1cm5zIGEgbG9vcCB0ZW1wbGF0ZSB1c2luZyB0eXBlbmFtZSBmb3IgdGhlIHR5cGUuIiIiCisgICAgbnVtX3N0YXRlcyA9IHNlbGYuX2xvb3BzWzBdLkEuc2hhcGVbMF0KKyAgICBudW1faW5wdXRzID0gc2VsZi5fbG9vcHNbMF0uQi5zaGFwZVsxXQorICAgIG51bV9vdXRwdXRzID0gc2VsZi5fbG9vcHNbMF0uQy5zaGFwZVswXQorICAgIHJldHVybiAnJXM8JWQsICVkLCAlZD4nICUgKAorICAgICAgICB0eXBlbmFtZSwgbnVtX3N0YXRlcywgbnVtX2lucHV0cywgbnVtX291dHB1dHMpCisKKyAgZGVmIF9Db250cm9sbGVyVHlwZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgdGVtcGxhdGUgbmFtZSBmb3IgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXIuIiIiCisgICAgcmV0dXJuIHNlbGYuX0dlbmVyaWNUeXBlKCdTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcicpCisKKyAgZGVmIF9Mb29wVHlwZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgdGVtcGxhdGUgbmFtZSBmb3IgU3RhdGVGZWVkYmFja0xvb3AuIiIiCisgICAgcmV0dXJuIHNlbGYuX0dlbmVyaWNUeXBlKCdTdGF0ZUZlZWRiYWNrTG9vcCcpCisKKyAgZGVmIF9QbGFudFR5cGUoc2VsZik6CisgICAgIiIiUmV0dXJucyBhIHRlbXBsYXRlIG5hbWUgZm9yIFN0YXRlRmVlZGJhY2tQbGFudC4iIiIKKyAgICByZXR1cm4gc2VsZi5fR2VuZXJpY1R5cGUoJ1N0YXRlRmVlZGJhY2tQbGFudCcpCisKKyAgZGVmIF9Db2VmZlR5cGUoc2VsZik6CisgICAgIiIiUmV0dXJucyBhIHRlbXBsYXRlIG5hbWUgZm9yIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50cy4iIiIKKyAgICByZXR1cm4gc2VsZi5fR2VuZXJpY1R5cGUoJ1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50cycpCisKKyAgZGVmIFdyaXRlSGVhZGVyKHNlbGYsIGhlYWRlcl9maWxlLCBkb3VibGVfYXBwZW5kYWdlPUZhbHNlLCBNb0lfcmF0aW89MC4wKToKKyAgICAiIiJXcml0ZXMgdGhlIGhlYWRlciBmaWxlIHRvIHRoZSBmaWxlIG5hbWVkIGhlYWRlcl9maWxlLgorICAgICAgIFNldCBkb3VibGVfYXBwZW5kYWdlIHRvIHRydWUgaW4gb3JkZXIgdG8gaW5jbHVkZSBhIHJhdGlvIG9mCisgICAgICAgbW9tZW50cyBvZiBpbmVydGlhIGNvbnN0YW50LiBDdXJyZW50bHksIG9ubHkgdXNlZCBmb3IgMjAxNCBjbGF3LiIiIgorICAgIHdpdGggb3BlbihoZWFkZXJfZmlsZSwgJ3cnKSBhcyBmZDoKKyAgICAgIGhlYWRlcl9ndWFyZCA9IHNlbGYuX0hlYWRlckd1YXJkKGhlYWRlcl9maWxlKQorICAgICAgZmQud3JpdGUoJyNpZm5kZWYgJXNcbicKKyAgICAgICAgICAgICAgICcjZGVmaW5lICVzXG5cbicgJSAoaGVhZGVyX2d1YXJkLCBoZWFkZXJfZ3VhcmQpKQorICAgICAgZmQud3JpdGUoJyNpbmNsdWRlIFwiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oXCJcbicpCisgICAgICBmZC53cml0ZSgnXG4nKQorCisgICAgICBmZC53cml0ZShzZWxmLl9uYW1lc3BhY2Vfc3RhcnQpCisKKyAgICAgIGZvciBjb25zdCBpbiBzZWxmLl9jb25zdGFudF9saXN0OgorICAgICAgICAgIGZkLndyaXRlKHN0cihjb25zdCkpCisKKyAgICAgIGZkLndyaXRlKCdcblxuJykKKyAgICAgIGZvciBsb29wIGluIHNlbGYuX2xvb3BzOgorICAgICAgICBmZC53cml0ZShsb29wLkR1bXBQbGFudEhlYWRlcigpKQorICAgICAgICBmZC53cml0ZSgnXG4nKQorICAgICAgICBmZC53cml0ZShsb29wLkR1bXBDb250cm9sbGVySGVhZGVyKCkpCisgICAgICAgIGZkLndyaXRlKCdcbicpCisKKyAgICAgIGZkLndyaXRlKCclcyBNYWtlJXNQbGFudCgpO1xuXG4nICUKKyAgICAgICAgICAgICAgIChzZWxmLl9QbGFudFR5cGUoKSwgc2VsZi5fZ2Fpbl9zY2hlZHVsZV9uYW1lKSkKKworICAgICAgZmQud3JpdGUoJyVzIE1ha2Ulc0xvb3AoKTtcblxuJyAlCisgICAgICAgICAgICAgICAoc2VsZi5fTG9vcFR5cGUoKSwgc2VsZi5fZ2Fpbl9zY2hlZHVsZV9uYW1lKSkKKworICAgICAgZmQud3JpdGUoc2VsZi5fbmFtZXNwYWNlX2VuZCkKKyAgICAgIGZkLndyaXRlKCdcblxuJykKKyAgICAgIGZkLndyaXRlKCIjZW5kaWYgIC8vICVzXG4iICUgaGVhZGVyX2d1YXJkKQorCisgIGRlZiBXcml0ZUNDKHNlbGYsIGhlYWRlcl9maWxlX25hbWUsIGNjX2ZpbGUpOgorICAgICIiIldyaXRlcyB0aGUgY2MgZmlsZSB0byB0aGUgZmlsZSBuYW1lZCBjY19maWxlLiIiIgorICAgIHdpdGggb3BlbihjY19maWxlLCAndycpIGFzIGZkOgorICAgICAgZmQud3JpdGUoJyNpbmNsdWRlIFwiJXMvY29udHJvbF9sb29wcy8lc1wiXG4nICUKKyAgICAgICAgICAgICAgIChzZWxmLl9Ub3BEaXJlY3RvcnkoKSwgaGVhZGVyX2ZpbGVfbmFtZSkpCisgICAgICBmZC53cml0ZSgnXG4nKQorICAgICAgZmQud3JpdGUoJyNpbmNsdWRlIDx2ZWN0b3I+XG4nKQorICAgICAgZmQud3JpdGUoJ1xuJykKKyAgICAgIGZkLndyaXRlKCcjaW5jbHVkZSBcImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaFwiXG4nKQorICAgICAgZmQud3JpdGUoJ1xuJykKKyAgICAgIGZkLndyaXRlKHNlbGYuX25hbWVzcGFjZV9zdGFydCkKKyAgICAgIGZkLndyaXRlKCdcblxuJykKKyAgICAgIGZvciBsb29wIGluIHNlbGYuX2xvb3BzOgorICAgICAgICBmZC53cml0ZShsb29wLkR1bXBQbGFudCgpKQorICAgICAgICBmZC53cml0ZSgnXG4nKQorCisgICAgICBmb3IgbG9vcCBpbiBzZWxmLl9sb29wczoKKyAgICAgICAgZmQud3JpdGUobG9vcC5EdW1wQ29udHJvbGxlcigpKQorICAgICAgICBmZC53cml0ZSgnXG4nKQorCisgICAgICBmZC53cml0ZSgnJXMgTWFrZSVzUGxhbnQoKSB7XG4nICUKKyAgICAgICAgICAgICAgIChzZWxmLl9QbGFudFR5cGUoKSwgc2VsZi5fZ2Fpbl9zY2hlZHVsZV9uYW1lKSkKKyAgICAgIGZkLndyaXRlKCcgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPCVzPj4gcGxhbnRzKCVkKTtcbicgJSAoCisgICAgICAgICAgc2VsZi5fQ29lZmZUeXBlKCksIGxlbihzZWxmLl9sb29wcykpKQorICAgICAgZm9yIGluZGV4LCBsb29wIGluIGVudW1lcmF0ZShzZWxmLl9sb29wcyk6CisgICAgICAgIGZkLndyaXRlKCcgIHBsYW50c1slZF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjwlcz4obmV3ICVzKCVzKSk7XG4nICUKKyAgICAgICAgICAgICAgICAgKGluZGV4LCBzZWxmLl9Db2VmZlR5cGUoKSwgc2VsZi5fQ29lZmZUeXBlKCksCisgICAgICAgICAgICAgICAgICBsb29wLlBsYW50RnVuY3Rpb24oKSkpCisgICAgICBmZC53cml0ZSgnICByZXR1cm4gJXMoJnBsYW50cyk7XG4nICUgc2VsZi5fUGxhbnRUeXBlKCkpCisgICAgICBmZC53cml0ZSgnfVxuXG4nKQorCisgICAgICBmZC53cml0ZSgnJXMgTWFrZSVzTG9vcCgpIHtcbicgJQorICAgICAgICAgICAgICAgKHNlbGYuX0xvb3BUeXBlKCksIHNlbGYuX2dhaW5fc2NoZWR1bGVfbmFtZSkpCisgICAgICBmZC53cml0ZSgnICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjwlcz4+IGNvbnRyb2xsZXJzKCVkKTtcbicgJSAoCisgICAgICAgICAgc2VsZi5fQ29udHJvbGxlclR5cGUoKSwgbGVuKHNlbGYuX2xvb3BzKSkpCisgICAgICBmb3IgaW5kZXgsIGxvb3AgaW4gZW51bWVyYXRlKHNlbGYuX2xvb3BzKToKKyAgICAgICAgZmQud3JpdGUoJyAgY29udHJvbGxlcnNbJWRdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8JXM+KG5ldyAlcyglcykpO1xuJyAlCisgICAgICAgICAgICAgICAgIChpbmRleCwgc2VsZi5fQ29udHJvbGxlclR5cGUoKSwgc2VsZi5fQ29udHJvbGxlclR5cGUoKSwKKyAgICAgICAgICAgICAgICAgIGxvb3AuQ29udHJvbGxlckZ1bmN0aW9uKCkpKQorICAgICAgZmQud3JpdGUoJyAgcmV0dXJuICVzKCZjb250cm9sbGVycyk7XG4nICUgc2VsZi5fTG9vcFR5cGUoKSkKKyAgICAgIGZkLndyaXRlKCd9XG5cbicpCisKKyAgICAgIGZkLndyaXRlKHNlbGYuX25hbWVzcGFjZV9lbmQpCisgICAgICBmZC53cml0ZSgnXG4nKQorCisKK2NsYXNzIENvbnRyb2xMb29wKG9iamVjdCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAiIiJDb25zdHJ1Y3RzIGEgY29udHJvbCBsb29wIG9iamVjdC4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBzdHJpbmcsIFRoZSBuYW1lIG9mIHRoZSBsb29wIHRvIHVzZSB3aGVuIHdyaXRpbmcgdGhlIEMrKyBmaWxlcy4KKyAgICAiIiIKKyAgICBzZWxmLl9uYW1lID0gbmFtZQorCisgIGRlZiBDb250aW51b3VzVG9EaXNjcmV0ZShzZWxmLCBBX2NvbnRpbnVvdXMsIEJfY29udGludW91cywgZHQpOgorICAgICIiIkNhbGN1bGF0ZXMgdGhlIGRpc2NyZXRlIHRpbWUgdmFsdWVzIGZvciBBIGFuZCBCLgorCisgICAgICBBcmdzOgorICAgICAgICBBX2NvbnRpbnVvdXM6IG51bXB5Lm1hdHJpeCwgVGhlIGNvbnRpbnVvdXMgdGltZSBBIG1hdHJpeAorICAgICAgICBCX2NvbnRpbnVvdXM6IG51bXB5Lm1hdHJpeCwgVGhlIGNvbnRpbnVvdXMgdGltZSBCIG1hdHJpeAorICAgICAgICBkdDogZmxvYXQsIFRoZSB0aW1lIHN0ZXAgb2YgdGhlIGNvbnRyb2wgbG9vcAorCisgICAgICBSZXR1cm5zOgorICAgICAgICAoQSwgQiksIG51bXB5Lm1hdHJpeCwgdGhlIGNvbnRyb2wgbWF0cmljaWVzLgorICAgICIiIgorICAgIHJldHVybiBjb250cm9scy5jMmQoQV9jb250aW51b3VzLCBCX2NvbnRpbnVvdXMsIGR0KQorCisgIGRlZiBJbml0aWFsaXplU3RhdGUoc2VsZik6CisgICAgIiIiU2V0cyBYLCBZLCBhbmQgWF9oYXQgdG8gemVybyBkZWZhdWx0cy4iIiIKKyAgICBzZWxmLlggPSBudW1weS56ZXJvcygoc2VsZi5BLnNoYXBlWzBdLCAxKSkKKyAgICBzZWxmLlkgPSBzZWxmLkMgKiBzZWxmLlgKKyAgICBzZWxmLlhfaGF0ID0gbnVtcHkuemVyb3MoKHNlbGYuQS5zaGFwZVswXSwgMSkpCisKKyAgZGVmIFBsYWNlQ29udHJvbGxlclBvbGVzKHNlbGYsIHBvbGVzKToKKyAgICAiIiJQbGFjZXMgdGhlIGNvbnRyb2xsZXIgcG9sZXMuCisKKyAgICBBcmdzOgorICAgICAgcG9sZXM6IGFycmF5LCBBbiBhcnJheSBvZiBwb2xlcy4gIE11c3QgYmUgY29tcGxleCBjb25qZWdhdGVzIGlmIHRoZXkgaGF2ZQorICAgICAgICBhbnkgaW1hZ2luYXJ5IHBvcnRpb25zLgorICAgICIiIgorICAgIHNlbGYuSyA9IGNvbnRyb2xzLmRwbGFjZShzZWxmLkEsIHNlbGYuQiwgcG9sZXMpCisKKyAgZGVmIFBsYWNlT2JzZXJ2ZXJQb2xlcyhzZWxmLCBwb2xlcyk6CisgICAgIiIiUGxhY2VzIHRoZSBvYnNlcnZlciBwb2xlcy4KKworICAgIEFyZ3M6CisgICAgICBwb2xlczogYXJyYXksIEFuIGFycmF5IG9mIHBvbGVzLiAgTXVzdCBiZSBjb21wbGV4IGNvbmplZ2F0ZXMgaWYgdGhleSBoYXZlCisgICAgICAgIGFueSBpbWFnaW5hcnkgcG9ydGlvbnMuCisgICAgIiIiCisgICAgc2VsZi5MID0gY29udHJvbHMuZHBsYWNlKHNlbGYuQS5ULCBzZWxmLkMuVCwgcG9sZXMpLlQKKworICBkZWYgVXBkYXRlKHNlbGYsIFUpOgorICAgICIiIlNpbXVsYXRlcyBvbmUgdGltZSBzdGVwIHdpdGggdGhlIHByb3ZpZGVkIFUuIiIiCisgICAgI1UgPSBudW1weS5jbGlwKFUsIHNlbGYuVV9taW4sIHNlbGYuVV9tYXgpCisgICAgc2VsZi5YID0gc2VsZi5BICogc2VsZi5YICsgc2VsZi5CICogVQorICAgIHNlbGYuWSA9IHNlbGYuQyAqIHNlbGYuWCArIHNlbGYuRCAqIFUKKworICBkZWYgUHJlZGljdE9ic2VydmVyKHNlbGYsIFUpOgorICAgICIiIlJ1bnMgdGhlIHByZWRpY3Qgc3RlcCBvZiB0aGUgb2JzZXJ2ZXIgdXBkYXRlLiIiIgorICAgIHNlbGYuWF9oYXQgPSAoc2VsZi5BICogc2VsZi5YX2hhdCArIHNlbGYuQiAqIFUpCisKKyAgZGVmIENvcnJlY3RPYnNlcnZlcihzZWxmLCBVKToKKyAgICAiIiJSdW5zIHRoZSBjb3JyZWN0IHN0ZXAgb2YgdGhlIG9ic2VydmVyIHVwZGF0ZS4iIiIKKyAgICBzZWxmLlhfaGF0ICs9IG51bXB5LmxpbmFsZy5pbnYoc2VsZi5BKSAqIHNlbGYuTCAqICgKKyAgICAgICAgc2VsZi5ZIC0gc2VsZi5DICogc2VsZi5YX2hhdCAtIHNlbGYuRCAqIFUpCisKKyAgZGVmIFVwZGF0ZU9ic2VydmVyKHNlbGYsIFUpOgorICAgICIiIlVwZGF0ZXMgdGhlIG9ic2VydmVyIGdpdmVuIHRoZSBwcm92aWRlZCBVLiIiIgorICAgIHNlbGYuWF9oYXQgPSAoc2VsZi5BICogc2VsZi5YX2hhdCArIHNlbGYuQiAqIFUgKworICAgICAgICAgICAgICAgICAgc2VsZi5MICogKHNlbGYuWSAtIHNlbGYuQyAqIHNlbGYuWF9oYXQgLSBzZWxmLkQgKiBVKSkKKworICBkZWYgX0R1bXBNYXRyaXgoc2VsZiwgbWF0cml4X25hbWUsIG1hdHJpeCk6CisgICAgIiIiRHVtcHMgdGhlIHByb3ZpZGVkIG1hdHJpeCBpbnRvIGEgdmFyaWFibGUgY2FsbGVkIG1hdHJpeF9uYW1lLgorCisgICAgQXJnczoKKyAgICAgIG1hdHJpeF9uYW1lOiBzdHJpbmcsIFRoZSB2YXJpYWJsZSBuYW1lIHRvIHNhdmUgdGhlIG1hdHJpeCB0by4KKyAgICAgIG1hdHJpeDogVGhlIG1hdHJpeCB0byBkdW1wLgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cmluZywgVGhlIEMrKyBjb21tYW5kcyByZXF1aXJlZCB0byBwb3B1bGF0ZSBhIHZhcmlhYmxlIG5hbWVkIG1hdHJpeF9uYW1lCisgICAgICAgIHdpdGggdGhlIGNvbnRlbnRzIG9mIG1hdHJpeC4KKyAgICAiIiIKKyAgICBhbnMgPSBbJyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsICVkLCAlZD4gJXM7XG4nICUgKAorICAgICAgICBtYXRyaXguc2hhcGVbMF0sIG1hdHJpeC5zaGFwZVsxXSwgbWF0cml4X25hbWUpXQorICAgIGZpcnN0ID0gVHJ1ZQorICAgIGZvciB4IGluIHhyYW5nZShtYXRyaXguc2hhcGVbMF0pOgorICAgICAgZm9yIHkgaW4geHJhbmdlKG1hdHJpeC5zaGFwZVsxXSk6CisgICAgICAgIGVsZW1lbnQgPSBtYXRyaXhbeCwgeV0KKyAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgYW5zLmFwcGVuZCgnICAlcyA8PCAnICUgbWF0cml4X25hbWUpCisgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgIGFucy5hcHBlbmQoJywgJykKKyAgICAgICAgYW5zLmFwcGVuZChzdHIoZWxlbWVudCkpCisKKyAgICBhbnMuYXBwZW5kKCc7XG4nKQorICAgIHJldHVybiAnJy5qb2luKGFucykKKworICBkZWYgRHVtcFBsYW50SGVhZGVyKHNlbGYpOgorICAgICIiIldyaXRlcyBvdXQgYSBjKysgaGVhZGVyIGRlY2xhcmF0aW9uIHdoaWNoIHdpbGwgY3JlYXRlIGEgUGxhbnQgb2JqZWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cmluZywgVGhlIGhlYWRlciBkZWNsYXJhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uLgorICAgICIiIgorICAgIG51bV9zdGF0ZXMgPSBzZWxmLkEuc2hhcGVbMF0KKyAgICBudW1faW5wdXRzID0gc2VsZi5CLnNoYXBlWzFdCisgICAgbnVtX291dHB1dHMgPSBzZWxmLkMuc2hhcGVbMF0KKyAgICByZXR1cm4gJ1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwlZCwgJWQsICVkPiBNYWtlJXNQbGFudENvZWZmaWNpZW50cygpO1xuJyAlICgKKyAgICAgICAgbnVtX3N0YXRlcywgbnVtX2lucHV0cywgbnVtX291dHB1dHMsIHNlbGYuX25hbWUpCisKKyAgZGVmIER1bXBQbGFudChzZWxmKToKKyAgICAiIiJXcml0ZXMgb3V0IGEgYysrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY3JlYXRlIGEgUGxhbnRDb2VmZmljaWVudHMgb2JqZWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cmluZywgVGhlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBvYmplY3QuCisgICAgIiIiCisgICAgbnVtX3N0YXRlcyA9IHNlbGYuQS5zaGFwZVswXQorICAgIG51bV9pbnB1dHMgPSBzZWxmLkIuc2hhcGVbMV0KKyAgICBudW1fb3V0cHV0cyA9IHNlbGYuQy5zaGFwZVswXQorICAgIGFucyA9IFsnU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPCVkLCAlZCwgJWQ+JworICAgICAgICAgICAnIE1ha2Ulc1BsYW50Q29lZmZpY2llbnRzKCkge1xuJyAlICgKKyAgICAgICAgbnVtX3N0YXRlcywgbnVtX2lucHV0cywgbnVtX291dHB1dHMsIHNlbGYuX25hbWUpXQorCisgICAgYW5zLmFwcGVuZChzZWxmLl9EdW1wTWF0cml4KCdBJywgc2VsZi5BKSkKKyAgICBhbnMuYXBwZW5kKHNlbGYuX0R1bXBNYXRyaXgoJ0InLCBzZWxmLkIpKQorICAgIGFucy5hcHBlbmQoc2VsZi5fRHVtcE1hdHJpeCgnQycsIHNlbGYuQykpCisgICAgYW5zLmFwcGVuZChzZWxmLl9EdW1wTWF0cml4KCdEJywgc2VsZi5EKSkKKyAgICBhbnMuYXBwZW5kKHNlbGYuX0R1bXBNYXRyaXgoJ1VfbWF4Jywgc2VsZi5VX21heCkpCisgICAgYW5zLmFwcGVuZChzZWxmLl9EdW1wTWF0cml4KCdVX21pbicsIHNlbGYuVV9taW4pKQorCisgICAgYW5zLmFwcGVuZCgnICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPCVkLCAlZCwgJWQ+JworICAgICAgICAgICAgICAgJyhBLCBCLCBDLCBELCBVX21heCwgVV9taW4pO1xuJyAlIChudW1fc3RhdGVzLCBudW1faW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fb3V0cHV0cykpCisgICAgYW5zLmFwcGVuZCgnfVxuJykKKyAgICByZXR1cm4gJycuam9pbihhbnMpCisKKyAgZGVmIFBsYW50RnVuY3Rpb24oc2VsZik6CisgICAgIiIiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGxhbnQgY29lZmZpY2llbnQgZnVuY3Rpb24uIiIiCisgICAgcmV0dXJuICdNYWtlJXNQbGFudENvZWZmaWNpZW50cygpJyAlIHNlbGYuX25hbWUKKworICBkZWYgQ29udHJvbGxlckZ1bmN0aW9uKHNlbGYpOgorICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsZXIgZnVuY3Rpb24uIiIiCisgICAgcmV0dXJuICdNYWtlJXNDb250cm9sbGVyKCknICUgc2VsZi5fbmFtZQorCisgIGRlZiBEdW1wQ29udHJvbGxlckhlYWRlcihzZWxmKToKKyAgICAiIiJXcml0ZXMgb3V0IGEgYysrIGhlYWRlciBkZWNsYXJhdGlvbiB3aGljaCB3aWxsIGNyZWF0ZSBhIENvbnRyb2xsZXIgb2JqZWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cmluZywgVGhlIGhlYWRlciBkZWNsYXJhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uLgorICAgICIiIgorICAgIG51bV9zdGF0ZXMgPSBzZWxmLkEuc2hhcGVbMF0KKyAgICBudW1faW5wdXRzID0gc2VsZi5CLnNoYXBlWzFdCisgICAgbnVtX291dHB1dHMgPSBzZWxmLkMuc2hhcGVbMF0KKyAgICByZXR1cm4gJ1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPCVkLCAlZCwgJWQ+ICVzO1xuJyAlICgKKyAgICAgICAgbnVtX3N0YXRlcywgbnVtX2lucHV0cywgbnVtX291dHB1dHMsIHNlbGYuQ29udHJvbGxlckZ1bmN0aW9uKCkpCisKKyAgZGVmIER1bXBDb250cm9sbGVyKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBjKysgZnVuY3Rpb24gd2hpY2ggd2lsbCBjcmVhdGUgYSBDb250cm9sbGVyIG9iamVjdC4KKworICAgIFJldHVybnM6CisgICAgICBzdHJpbmcsIFRoZSBmdW5jdGlvbiB3aGljaCB3aWxsIGNyZWF0ZSB0aGUgb2JqZWN0LgorICAgICIiIgorICAgIG51bV9zdGF0ZXMgPSBzZWxmLkEuc2hhcGVbMF0KKyAgICBudW1faW5wdXRzID0gc2VsZi5CLnNoYXBlWzFdCisgICAgbnVtX291dHB1dHMgPSBzZWxmLkMuc2hhcGVbMF0KKyAgICBhbnMgPSBbJ1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPCVkLCAlZCwgJWQ+ICVzIHtcbicgJSAoCisgICAgICAgIG51bV9zdGF0ZXMsIG51bV9pbnB1dHMsIG51bV9vdXRwdXRzLCBzZWxmLkNvbnRyb2xsZXJGdW5jdGlvbigpKV0KKworICAgIGFucy5hcHBlbmQoc2VsZi5fRHVtcE1hdHJpeCgnTCcsIHNlbGYuTCkpCisgICAgYW5zLmFwcGVuZChzZWxmLl9EdW1wTWF0cml4KCdLJywgc2VsZi5LKSkKKyAgICBhbnMuYXBwZW5kKHNlbGYuX0R1bXBNYXRyaXgoJ0FfaW52JywgbnVtcHkubGluYWxnLmludihzZWxmLkEpKSkKKworICAgIGFucy5hcHBlbmQoJyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPCVkLCAlZCwgJWQ+JworICAgICAgICAgICAgICAgJyhMLCBLLCBBX2ludiwgTWFrZSVzUGxhbnRDb2VmZmljaWVudHMoKSk7XG4nICUgKAorICAgICAgICAgICAgICAgICAgIG51bV9zdGF0ZXMsIG51bV9pbnB1dHMsIG51bV9vdXRwdXRzLCBzZWxmLl9uYW1lKSkKKyAgICBhbnMuYXBwZW5kKCd9XG4nKQorICAgIHJldHVybiAnJy5qb2luKGFucykKZGlmZiAtLWdpdCBhL2JvdDMvY29udHJvbF9sb29wcy9weXRob24vY29udHJvbHMucHkgYi9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2NvbnRyb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmJkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2NvbnRyb2xzLnB5CkBAIC0wLDAgKzEsMTUzIEBACisjIS91c3IvYmluL3B5dGhvbgorCisiIiIKK0NvbnRyb2wgbG9vcCBwb2xlIHBsYWNlbWVudCBsaWJyYXJ5LgorCitUaGlzIGxpYnJhcnkgd2lsbCBncm93IHRvIHN1cHBvcnQgbWFueSBkaWZmZXJlbnQgcG9sZSBwbGFjZW1lbnQgbWV0aG9kcy4KK0N1cnJlbnRseSBpdCBvbmx5IHN1cHBvcnRzIGRpcmVjdCBwb2xlIHBsYWNlbWVudC4KKyIiIgorCitfX2F1dGhvcl9fID0gJ0F1c3RpbiBTY2h1aCAoYXVzdGluLmxpbnV4QGdtYWlsLmNvbSknCisKK2ltcG9ydCBudW1weQoraW1wb3J0IHNseWNvdAoraW1wb3J0IHNjaXB5LnNpZ25hbC5jb250MmRpc2NyZXRlCisKK2NsYXNzIEVycm9yIChFeGNlcHRpb24pOgorICAiIiJCYXNlIGNsYXNzIGZvciBhbGwgY29udHJvbCBsb29wIGV4Y2VwdGlvbnMuIiIiCisKKworY2xhc3MgUG9sZVBsYWNlbWVudEVycm9yKEVycm9yKToKKyAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHBvbGUgcGxhY2VtZW50IGZhaWxzLiIiIgorCisKKyMgVE9ETyhhc2NodWgpOiBkcGxhY2Ugc2hvdWxkIHRha2UgYSBjb250cm9sIHN5c3RlbSBvYmplY3QuCisjIFRoZXJlIHNob3VsZCBhbHNvIGV4aXN0IGEgZnVuY3Rpb24gdG8gbWFuaXB1bGF0ZSBsYXBsYWNlIGV4cHJlc3Npb25zLCBhbmQKKyMgc29tZXRoaW5nIHRvIHBsb3QgYm9kZSBwbG90cyBhbmQgYWxsIHRoYXQuCitkZWYgZHBsYWNlKEEsIEIsIHBvbGVzLCBhbHBoYT0xZS02KToKKyAgIiIiU2V0IHRoZSBwb2xlcyBvZiAoQSAtIEJGKSB0byBwb2xlcy4KKworICBBcmdzOgorICAgIEE6IG51bXB5Lm1hdHJpeChuIHggbiksIFRoZSBBIG1hdHJpeC4KKyAgICBCOiBudW1weS5tYXRyaXgobiB4IG0pLCBUaGUgQiBtYXRyaXguCisgICAgcG9sZXM6IGFycmF5KGltYWdpbmFyeSBudW1iZXJzKSwgVGhlIHBvbGVzIHRvIHVzZS4gIENvbXBsZXggY29uanVnYXRlcyBwb2xlcworICAgICAgbXVzdCBiZSBpbiBwYWlycy4KKworICBSYWlzZXM6CisgICAgVmFsdWVFcnJvcjogQXJndW1lbnRzIHdlcmUgdGhlIHdyb25nIHNoYXBlIG9yIHRoZXJlIHdlcmUgdG9vIG1hbnkgcG9sZXMuCisgICAgUG9sZVBsYWNlbWVudEVycm9yOiBQb2xlIHBsYWNlbWVudCBmYWlsZWQuCisKKyAgUmV0dXJuczoKKyAgICBudW1weS5tYXRyaXgobSB4IG4pLCBLCisgICIiIgorICAjIFNlZSBodHRwOi8vd3d3LmljbS50dS1icy5kZS9OSUNPTkVUL2RvYy9TQjAxQkQuaHRtbCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgIyBmb3J0cmFuIGNvZGUgdGhhdCB0aGlzIGlzIGNsZWFuaW5nIHVwIHRoZSBpbnRlcmZhY2UgdG8uCisgIG4gPSBBLnNoYXBlWzBdCisgIGlmIEEuc2hhcGVbMV0gIT0gbjoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJBIG11c3QgYmUgc3F1YXJlIikKKyAgaWYgQi5zaGFwZVswXSAhPSBuOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoIkIgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBzdGF0ZXMgYXMgQS4iKQorICBtID0gQi5zaGFwZVsxXQorCisgIG51bV9wb2xlcyA9IGxlbihwb2xlcykKKyAgaWYgbnVtX3BvbGVzID4gbjoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJUcnlpbmcgdG8gcGxhY2UgbW9yZSBwb2xlcyB0aGFuIHN0YXRlcy4iKQorCisgIG91dCA9IHNseWNvdC5zYjAxYmQobj1uLAorICAgICAgICAgICAgICAgICAgICAgIG09bSwKKyAgICAgICAgICAgICAgICAgICAgICBucD1udW1fcG9sZXMsCisgICAgICAgICAgICAgICAgICAgICAgYWxwaGE9YWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgQT1BLAorICAgICAgICAgICAgICAgICAgICAgIEI9QiwKKyAgICAgICAgICAgICAgICAgICAgICB3PW51bXB5LmFycmF5KHBvbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICBkaWNvPSdEJykKKworICBBX3ogPSBudW1weS5tYXRyaXgob3V0WzBdKQorICBudW1fdG9vX3NtYWxsX2VpZ2VudmFsdWVzID0gb3V0WzJdCisgIG51bV9hc3NpZ25lZF9laWdlbnZhbHVlcyA9IG91dFszXQorICBudW1fdW5jb250cm9sbGFibGVfZWlnZW52YWx1ZXMgPSBvdXRbNF0KKyAgSyA9IG51bXB5Lm1hdHJpeCgtb3V0WzVdKQorICBaID0gbnVtcHkubWF0cml4KG91dFs2XSkKKworICBpZiBudW1fdG9vX3NtYWxsX2VpZ2VudmFsdWVzICE9IDA6CisgICAgcmFpc2UgUG9sZVBsYWNlbWVudEVycm9yKCJOdW1iZXIgb2YgZWlnZW52YWx1ZXMgdGhhdCBhcmUgdG9vIHNtYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhcmUgdGhlcmVmb3JlIHVubW9kaWZpZWQgaXMgJWQuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b29fc21hbGxfZWlnZW52YWx1ZXMpCisgIGlmIG51bV9hc3NpZ25lZF9laWdlbnZhbHVlcyAhPSBudW1fcG9sZXM6CisgICAgcmFpc2UgUG9sZVBsYWNlbWVudEVycm9yKCJEaWQgbm90IHBsYWNlIGFsbCB0aGUgZWlnZW52YWx1ZXMgdGhhdCB3ZXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZC4gT25seSBwbGFjZWQgJWQgZWlnZW52YWx1ZXMuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hc3NpZ25lZF9laWdlbnZhbHVlcykKKyAgaWYgbnVtX3VuY29udHJvbGxhYmxlX2VpZ2VudmFsdWVzICE9IDA6CisgICAgcmFpc2UgUG9sZVBsYWNlbWVudEVycm9yKCJGb3VuZCAlZCB1bmNvbnRyb2xsYWJsZSBlaWdlbnZsYXVlcy4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3VuY29udHJvbGxhYmxlX2VpZ2VudmFsdWVzKQorCisgIHJldHVybiBLCisKKworZGVmIGMyZChBLCBCLCBkdCk6CisgICIiIkNvbnZlcnRzIGZyb20gY29udGludW91cyB0aW1lIHN0YXRlIHNwYWNlIHJlcHJlc2VudGF0aW9uIHRvIGRpc2NyZXRlIHRpbWUuCisgICAgIFJldHVybnMgKEEsIEIpLiAgQyBhbmQgRCBhcmUgdW5jaGFuZ2VkLiIiIgorCisgIGFuc19hLCBhbnNfYiwgXywgXywgXyA9IHNjaXB5LnNpZ25hbC5jb250MmRpc2NyZXRlKChBLCBCLCBOb25lLCBOb25lKSwgZHQpCisgIHJldHVybiBudW1weS5tYXRyaXgoYW5zX2EpLCBudW1weS5tYXRyaXgoYW5zX2IpCisKK2RlZiBjdHJiKEEsIEIpOgorICAiIiJSZXR1cm5zIHRoZSBjb250cm9sYWJpbGl0eSBtYXRyaXguCisKKyAgICBUaGlzIG1hdHJpeCBtdXN0IGhhdmUgZnVsbCByYW5rIGZvciBhbGwgdGhlIHN0YXRlcyB0byBiZSBjb250cm9sYWJsZS4KKyAgIiIiCisgIG4gPSBBLnNoYXBlWzBdCisgIG91dHB1dCA9IEIKKyAgaW50ZXJtZWRpYXRlID0gQgorICBmb3IgaSBpbiB4cmFuZ2UoMCwgbik6CisgICAgaW50ZXJtZWRpYXRlID0gQSAqIGludGVybWVkaWF0ZQorICAgIG91dHB1dCA9IG51bXB5LmNvbmNhdGVuYXRlKChvdXRwdXQsIGludGVybWVkaWF0ZSksIGF4aXM9MSkKKworICByZXR1cm4gb3V0cHV0CisKK2RlZiBkbHFyKEEsIEIsIFEsIFIpOgorICAiIiJTb2x2ZXMgZm9yIHRoZSBvcHRpbWFsIGxxciBjb250cm9sbGVyLgorCisgICAgeChuKzEpID0gQSAqIHgobikgKyBCICogdShuKQorICAgIEogPSBzdW0oMCwgaW5mLCB4LlQgKiBRICogeCArIHUuVCAqIFIgKiB1KQorICAiIiIKKworICAjIFAgPSAoQS5UICogUCAqIEEpIC0gKEEuVCAqIFAgKiBCICogbnVtcHkubGluYWxnLmludihSICsgQi5UICogUCAqQikgKiAoQS5UICogUC5UICogQikuVCArIFEKKworICBQLCByY29uZCwgdywgUywgVCA9IHNseWNvdC5zYjAyb2QoCisgICAgICBuPUEuc2hhcGVbMF0sIG09Qi5zaGFwZVsxXSwgQT1BLCBCPUIsIFE9USwgUj1SLCBkaWNvPSdEJykKKworICBGID0gbnVtcHkubGluYWxnLmludihSICsgQi5UICogUCAqQikgKiBCLlQgKiBQICogQQorICByZXR1cm4gRgorCitkZWYga2FsbWFuKEEsIEIsIEMsIFEsIFIpOgorICAiIiJTb2x2ZXMgZm9yIHRoZSBzdGVhZHkgc3RhdGUga2FsbWFuIGdhaW4gYW5kIGNvdmFyaWFuY2UgbWF0cmljaWVzLgorCisgICAgQXJnczoKKyAgICAgIEEsIEIsIEM6IFNTIG1hdHJpY2llcy4KKyAgICAgIFE6IFRoZSBtb2RlbCB1bmNlcnRhbnRpdHkKKyAgICAgIFI6IFRoZSBtZWFzdXJlbWVudCB1bmNlcnRhaW50eQorCisgICAgUmV0dXJuczoKKyAgICAgIEthbG1hbkdhaW4sIENvdmFyaWFuY2UuCisgICIiIgorICBQID0gUQorCisgIEkgPSBudW1weS5tYXRyaXgobnVtcHkuZXllKFAuc2hhcGVbMF0pKQorICBBdCA9IEEuVAorICBDdCA9IEMuVAorICBpID0gMAorCisgIHdoaWxlIFRydWU6CisgICAgbGFzdF9QID0gUAorICAgIFBfcHJpb3IgPSBBICogUCAqIEF0ICsgUQorICAgIFMgPSBDICogUF9wcmlvciAqIEN0ICsgUgorICAgIEsgPSBQX3ByaW9yICogQ3QgKiBudW1weS5saW5hbGcuaW52KFMpCisgICAgUCA9IChJIC0gSyAqIEMpICogUF9wcmlvcgorCisgICAgZGlmZiA9IFAgLSBsYXN0X1AKKyAgICBpICs9IDEKKyAgICBpZiBudW1weS5saW5hbGcubm9ybShkaWZmKSAvIG51bXB5LmxpbmFsZy5ub3JtKFApIDwgMWUtOToKKyAgICAgIGJyZWFrCisKKyAgcmV0dXJuIEssIFAKZGlmZiAtLWdpdCBhL2JvdDMvY29udHJvbF9sb29wcy9weXRob24vZHJpdmV0cmFpbi5weSBiL2JvdDMvY29udHJvbF9sb29wcy9weXRob24vZHJpdmV0cmFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ2MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9kcml2ZXRyYWluLnB5CkBAIC0wLDAgKzEsMjQyIEBACisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgY29udHJvbF9sb29wCitpbXBvcnQgY29udHJvbHMKK2ltcG9ydCBudW1weQoraW1wb3J0IHN5cworZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgorCisKK2NsYXNzIENJTShjb250cm9sX2xvb3AuQ29udHJvbExvb3ApOgorICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc3VwZXIoQ0lNLCBzZWxmKS5fX2luaXRfXygiQ0lNIikKKyAgICAjIFN0YWxsIFRvcnF1ZSBpbiBOIG0KKyAgICBzZWxmLnN0YWxsX3RvcnF1ZSA9IDIuNDIKKyAgICAjIFN0YWxsIEN1cnJlbnQgaW4gQW1wcworICAgIHNlbGYuc3RhbGxfY3VycmVudCA9IDEzMworICAgICMgRnJlZSBTcGVlZCBpbiBSUE0KKyAgICBzZWxmLmZyZWVfc3BlZWQgPSA0NjUwLjAKKyAgICAjIEZyZWUgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5mcmVlX2N1cnJlbnQgPSAyLjcKKyAgICAjIE1vbWVudCBvZiBpbmVydGlhIG9mIHRoZSBDSU0gaW4ga2cgbV4yCisgICAgc2VsZi5KID0gMC4wMDAxCisgICAgIyBSZXNpc3RhbmNlIG9mIHRoZSBtb3RvciwgZGl2aWRlZCBieSAyIHRvIGFjY291bnQgZm9yIHRoZSAyIG1vdG9ycworICAgIHNlbGYuUiA9IDEyLjAgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIE1vdG9yIHZlbG9jaXR5IGNvbnN0YW50CisgICAgc2VsZi5LdiA9ICgoc2VsZi5mcmVlX3NwZWVkIC8gNjAuMCAqIDIuMCAqIG51bXB5LnBpKSAvCisgICAgICAgICAgICAgICgxMi4wIC0gc2VsZi5SICogc2VsZi5mcmVlX2N1cnJlbnQpKQorICAgICMgVG9ycXVlIGNvbnN0YW50CisgICAgc2VsZi5LdCA9IHNlbGYuc3RhbGxfdG9ycXVlIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBDb250cm9sIGxvb3AgdGltZSBzdGVwCisgICAgc2VsZi5kdCA9IDAuMDA1CisKKyAgICAjIFN0YXRlIGZlZWRiYWNrIG1hdHJpY2VzCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbLXNlbGYuS3QgLyBzZWxmLkt2IC8gKHNlbGYuSiAqIHNlbGYuUildXSkKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1tzZWxmLkt0IC8gKHNlbGYuSiAqIHNlbGYuUildXSkKKyAgICBzZWxmLkMgPSBudW1weS5tYXRyaXgoW1sxXV0pCisgICAgc2VsZi5EID0gbnVtcHkubWF0cml4KFtbMF1dKQorCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKHNlbGYuQV9jb250aW51b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJfY29udGludW91cywgc2VsZi5kdCkKKworICAgIHNlbGYuUGxhY2VDb250cm9sbGVyUG9sZXMoWzAuMDFdKQorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFswLjAxXSkKKworICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXV0pCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKKworY2xhc3MgRHJpdmV0cmFpbihjb250cm9sX2xvb3AuQ29udHJvbExvb3ApOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iRHJpdmV0cmFpbiIsIGxlZnRfbG93PVRydWUsIHJpZ2h0X2xvdz1UcnVlKToKKyAgICBzdXBlcihEcml2ZXRyYWluLCBzZWxmKS5fX2luaXRfXyhuYW1lKQorICAgICMgU3RhbGwgVG9ycXVlIGluIE4gbQorICAgIHNlbGYuc3RhbGxfdG9ycXVlID0gMi40MgorICAgICMgU3RhbGwgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5zdGFsbF9jdXJyZW50ID0gMTMzLjAKKyAgICAjIEZyZWUgU3BlZWQgaW4gUlBNLiBVc2VkIG51bWJlciBmcm9tIGxhc3QgeWVhci4KKyAgICBzZWxmLmZyZWVfc3BlZWQgPSA0NjUwLjAKKyAgICAjIEZyZWUgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5mcmVlX2N1cnJlbnQgPSAyLjcKKyAgICAjIE1vbWVudCBvZiBpbmVydGlhIG9mIHRoZSBkcml2ZXRyYWluIGluIGtnIG1eMgorICAgICMgSnVzdCBib3Jyb3dlZCBmcm9tIGxhc3QgeWVhci4KKyAgICBzZWxmLkogPSAxMAorICAgICMgTWFzcyBvZiB0aGUgcm9ib3QsIGluIGtnLgorICAgIHNlbGYubSA9IDY4CisgICAgIyBSYWRpdXMgb2YgdGhlIHJvYm90LCBpbiBtZXRlcnMgKGZyb20gbGFzdCB5ZWFyKS4KKyAgICBzZWxmLnJiID0gMC45NjAzIC8gMi4wCisgICAgIyBSYWRpdXMgb2YgdGhlIHdoZWVscywgaW4gbWV0ZXJzLgorICAgIHNlbGYuciA9IC4wNTE1OTM4CisgICAgIyBSZXNpc3RhbmNlIG9mIHRoZSBtb3RvciwgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIG1vdG9ycy4KKyAgICBzZWxmLlIgPSAxMi4wIC8gc2VsZi5zdGFsbF9jdXJyZW50IC8gMgorICAgICMgTW90b3IgdmVsb2NpdHkgY29uc3RhbnQKKyAgICBzZWxmLkt2ID0gKChzZWxmLmZyZWVfc3BlZWQgLyA2MC4wICogMi4wICogbnVtcHkucGkpIC8KKyAgICAgICAgICAgICAgICgxMi4wIC0gc2VsZi5SICogc2VsZi5mcmVlX2N1cnJlbnQpKQorICAgICMgVG9ycXVlIGNvbnN0YW50CisgICAgc2VsZi5LdCA9IHNlbGYuc3RhbGxfdG9ycXVlIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBHZWFyIHJhdGlvcworICAgIHNlbGYuR19jb25zdCA9IDI4LjAgLyA1MC4wICogMjAuMCAvIDY0LjAKKworICAgIHNlbGYuR19sb3cgPSBzZWxmLkdfY29uc3QKKyAgICBzZWxmLkdfaGlnaCA9IHNlbGYuR19jb25zdAorCisgICAgaWYgbGVmdF9sb3c6CisgICAgICBzZWxmLkdsID0gc2VsZi5HX2xvdworICAgIGVsc2U6CisgICAgICBzZWxmLkdsID0gc2VsZi5HX2hpZ2gKKyAgICBpZiByaWdodF9sb3c6CisgICAgICBzZWxmLkdyID0gc2VsZi5HX2xvdworICAgIGVsc2U6CisgICAgICBzZWxmLkdyID0gc2VsZi5HX2hpZ2gKKworICAgICMgQ29udHJvbCBsb29wIHRpbWUgc3RlcAorICAgIHNlbGYuZHQgPSAwLjAwNQorCisgICAgIyBUaGVzZSBkZXNjcmliZSB0aGUgd2F5IHRoYXQgYSBnaXZlbiBzaWRlIG9mIGEgcm9ib3Qgd2lsbCBiZSBpbmZsdWVuY2VkCisgICAgIyBieSB0aGUgb3RoZXIgc2lkZS4gVW5pdHMgb2YgMSAvIGtnLgorICAgIHNlbGYubXNwID0gMS4wIC8gc2VsZi5tICsgc2VsZi5yYiAqIHNlbGYucmIgLyBzZWxmLkoKKyAgICBzZWxmLm1zbiA9IDEuMCAvIHNlbGYubSAtIHNlbGYucmIgKiBzZWxmLnJiIC8gc2VsZi5KCisgICAgIyBUaGUgY2FsY3VsYXRpb25zIHdoaWNoIHdlIHdpbGwgbmVlZCBmb3IgQSBhbmQgQi4KKyAgICBzZWxmLnRjbCA9IC1zZWxmLkt0IC8gc2VsZi5LdiAvIChzZWxmLkdsICogc2VsZi5HbCAqIHNlbGYuUiAqIHNlbGYuciAqIHNlbGYucikKKyAgICBzZWxmLnRjciA9IC1zZWxmLkt0IC8gc2VsZi5LdiAvIChzZWxmLkdyICogc2VsZi5HciAqIHNlbGYuUiAqIHNlbGYuciAqIHNlbGYucikKKyAgICBzZWxmLm1wbCA9IHNlbGYuS3QgLyAoc2VsZi5HbCAqIHNlbGYuUiAqIHNlbGYucikKKyAgICBzZWxmLm1wciA9IHNlbGYuS3QgLyAoc2VsZi5HciAqIHNlbGYuUiAqIHNlbGYucikKKworICAgICMgU3RhdGUgZmVlZGJhY2sgbWF0cmljZXMKKyAgICAjIFggd2lsbCBiZSBvZiB0aGUgZm9ybWF0CisgICAgIyBbW3Bvc2l0aW9ubF0sIFt2ZWxvY2l0eWxdLCBbcG9zaXRpb25yXSwgdmVsb2NpdHlyXV0KKyAgICBzZWxmLkFfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLCAxLCAwLCAwXSwKKyAgICAgICAgIFswLCBzZWxmLm1zcCAqIHNlbGYudGNsLCAwLCBzZWxmLm1zbiAqIHNlbGYudGNyXSwKKyAgICAgICAgIFswLCAwLCAwLCAxXSwKKyAgICAgICAgIFswLCBzZWxmLm1zbiAqIHNlbGYudGNsLCAwLCBzZWxmLm1zcCAqIHNlbGYudGNyXV0pCisgICAgc2VsZi5CX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMF0sCisgICAgICAgICBbc2VsZi5tc3AgKiBzZWxmLm1wbCwgc2VsZi5tc24gKiBzZWxmLm1wcl0sCisgICAgICAgICBbMCwgMF0sCisgICAgICAgICBbc2VsZi5tc24gKiBzZWxmLm1wbCwgc2VsZi5tc3AgKiBzZWxmLm1wcl1dKQorICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEsIDAsIDAsIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDAsIDEsIDBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwXV0pCisKKyAgICAjcHJpbnQgIlRIRSBOVU1CRVIgSSBXQU5UIiArIHN0cihudW1weS5saW5hbGcuaW52KHNlbGYuQV9jb250aW51b3VzKSAqIC1zZWxmLkJfY29udGludW91cyAqIG51bXB5Lm1hdHJpeChbWzEyLjBdLCBbMTIuMF1dKSkKKyAgICBzZWxmLkEsIHNlbGYuQiA9IHNlbGYuQ29udGludW91c1RvRGlzY3JldGUoCisgICAgICAgIHNlbGYuQV9jb250aW51b3VzLCBzZWxmLkJfY29udGludW91cywgc2VsZi5kdCkKKworICAgICMgUG9sZXMgZnJvbSBsYXN0IHllYXIuCisgICAgc2VsZi5ocCA9IDAuNjUKKyAgICBzZWxmLmxwID0gMC44MworICAgIHNlbGYuUGxhY2VDb250cm9sbGVyUG9sZXMoW3NlbGYuaHAsIHNlbGYubHAsIHNlbGYuaHAsIHNlbGYubHBdKQorICAgIHByaW50IHNlbGYuSworICAgIHFfcG9zID0gMC4wNworICAgIHFfdmVsID0gMS4wCisgICAgc2VsZi5RID0gbnVtcHkubWF0cml4KFtbKDEuMCAvIChxX3BvcyAqKiAyLjApKSwgMC4wLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAoMS4wIC8gKHFfdmVsICoqIDIuMCkpLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsICgxLjAgLyAocV9wb3MgKiogMi4wKSksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgKDEuMCAvIChxX3ZlbCAqKiAyLjApKV1dKQorCisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KFtbKDEuMCAvICgxMi4wICoqIDIuMCkpLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKDEuMCAvICgxMi4wICoqIDIuMCkpXV0pCisgICAgc2VsZi5LID0gY29udHJvbHMuZGxxcihzZWxmLkEsIHNlbGYuQiwgc2VsZi5RLCBzZWxmLlIpCisgICAgcHJpbnQgc2VsZi5BCisgICAgcHJpbnQgc2VsZi5CCisgICAgcHJpbnQgc2VsZi5LCisgICAgcHJpbnQgbnVtcHkubGluYWxnLmVpZyhzZWxmLkEgLSBzZWxmLkIgKiBzZWxmLkspWzBdCisKKyAgICBzZWxmLmhscCA9IDAuMworICAgIHNlbGYubGxwID0gMC40CisgICAgc2VsZi5QbGFjZU9ic2VydmVyUG9sZXMoW3NlbGYuaGxwLCBzZWxmLmhscCwgc2VsZi5sbHAsIHNlbGYubGxwXSkKKworICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXSwgWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KFtbLTEyLjBdLCBbLTEyLjBdXSkKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKK2RlZiBtYWluKGFyZ3YpOgorICAjIFNpbXVsYXRlIHRoZSByZXNwb25zZSBvZiB0aGUgc3lzdGVtIHRvIGEgc3RlcCBpbnB1dC4KKyAgZHJpdmV0cmFpbiA9IERyaXZldHJhaW4oKQorICBzaW11bGF0ZWRfbGVmdCA9IFtdCisgIHNpbXVsYXRlZF9yaWdodCA9IFtdCisgIGZvciBfIGluIHhyYW5nZSgxMDApOgorICAgIGRyaXZldHJhaW4uVXBkYXRlKG51bXB5Lm1hdHJpeChbWzEyLjBdLCBbMTIuMF1dKSkKKyAgICBzaW11bGF0ZWRfbGVmdC5hcHBlbmQoZHJpdmV0cmFpbi5YWzAsIDBdKQorICAgIHNpbXVsYXRlZF9yaWdodC5hcHBlbmQoZHJpdmV0cmFpbi5YWzIsIDBdKQorCisgICNweWxhYi5wbG90KHJhbmdlKDEwMCksIHNpbXVsYXRlZF9sZWZ0KQorICAjcHlsYWIucGxvdChyYW5nZSgxMDApLCBzaW11bGF0ZWRfcmlnaHQpCisgICNweWxhYi5zaG93KCkKKworICAjIFNpbXVsYXRlIGZvcndhcmRzIG1vdGlvbi4KKyAgZHJpdmV0cmFpbiA9IERyaXZldHJhaW4oKQorICBjbG9zZV9sb29wX2xlZnQgPSBbXQorICBjbG9zZV9sb29wX3JpZ2h0ID0gW10KKyAgUiA9IG51bXB5Lm1hdHJpeChbWzEuMF0sIFswLjBdLCBbMS4wXSwgWzAuMF1dKQorICBmb3IgXyBpbiB4cmFuZ2UoMTAwKToKKyAgICBVID0gbnVtcHkuY2xpcChkcml2ZXRyYWluLksgKiAoUiAtIGRyaXZldHJhaW4uWF9oYXQpLAorICAgICAgICAgICAgICAgICAgIGRyaXZldHJhaW4uVV9taW4sIGRyaXZldHJhaW4uVV9tYXgpCisgICAgZHJpdmV0cmFpbi5VcGRhdGVPYnNlcnZlcihVKQorICAgIGRyaXZldHJhaW4uVXBkYXRlKFUpCisgICAgY2xvc2VfbG9vcF9sZWZ0LmFwcGVuZChkcml2ZXRyYWluLlhbMCwgMF0pCisgICAgY2xvc2VfbG9vcF9yaWdodC5hcHBlbmQoZHJpdmV0cmFpbi5YWzIsIDBdKQorCisgICNweWxhYi5wbG90KHJhbmdlKDEwMCksIGNsb3NlX2xvb3BfbGVmdCkKKyAgI3B5bGFiLnBsb3QocmFuZ2UoMTAwKSwgY2xvc2VfbG9vcF9yaWdodCkKKyAgI3B5bGFiLnNob3coKQorCisgICMgVHJ5IHR1cm5pbmcgaW4gcGxhY2UKKyAgZHJpdmV0cmFpbiA9IERyaXZldHJhaW4oKQorICBjbG9zZV9sb29wX2xlZnQgPSBbXQorICBjbG9zZV9sb29wX3JpZ2h0ID0gW10KKyAgUiA9IG51bXB5Lm1hdHJpeChbWy0xLjBdLCBbMC4wXSwgWzEuMF0sIFswLjBdXSkKKyAgZm9yIF8gaW4geHJhbmdlKDEwMCk6CisgICAgVSA9IG51bXB5LmNsaXAoZHJpdmV0cmFpbi5LICogKFIgLSBkcml2ZXRyYWluLlhfaGF0KSwKKyAgICAgICAgICAgICAgICAgICBkcml2ZXRyYWluLlVfbWluLCBkcml2ZXRyYWluLlVfbWF4KQorICAgIGRyaXZldHJhaW4uVXBkYXRlT2JzZXJ2ZXIoVSkKKyAgICBkcml2ZXRyYWluLlVwZGF0ZShVKQorICAgIGNsb3NlX2xvb3BfbGVmdC5hcHBlbmQoZHJpdmV0cmFpbi5YWzAsIDBdKQorICAgIGNsb3NlX2xvb3BfcmlnaHQuYXBwZW5kKGRyaXZldHJhaW4uWFsyLCAwXSkKKworICAjcHlsYWIucGxvdChyYW5nZSgxMDApLCBjbG9zZV9sb29wX2xlZnQpCisgICNweWxhYi5wbG90KHJhbmdlKDEwMCksIGNsb3NlX2xvb3BfcmlnaHQpCisgICNweWxhYi5zaG93KCkKKworICAjIFRyeSB0dXJuaW5nIGp1c3Qgb25lIHNpZGUuCisgIGRyaXZldHJhaW4gPSBEcml2ZXRyYWluKCkKKyAgY2xvc2VfbG9vcF9sZWZ0ID0gW10KKyAgY2xvc2VfbG9vcF9yaWdodCA9IFtdCisgIFIgPSBudW1weS5tYXRyaXgoW1swLjBdLCBbMC4wXSwgWzEuMF0sIFswLjBdXSkKKyAgZm9yIF8gaW4geHJhbmdlKDEwMCk6CisgICAgVSA9IG51bXB5LmNsaXAoZHJpdmV0cmFpbi5LICogKFIgLSBkcml2ZXRyYWluLlhfaGF0KSwKKyAgICAgICAgICAgICAgICAgICBkcml2ZXRyYWluLlVfbWluLCBkcml2ZXRyYWluLlVfbWF4KQorICAgIGRyaXZldHJhaW4uVXBkYXRlT2JzZXJ2ZXIoVSkKKyAgICBkcml2ZXRyYWluLlVwZGF0ZShVKQorICAgIGNsb3NlX2xvb3BfbGVmdC5hcHBlbmQoZHJpdmV0cmFpbi5YWzAsIDBdKQorICAgIGNsb3NlX2xvb3BfcmlnaHQuYXBwZW5kKGRyaXZldHJhaW4uWFsyLCAwXSkKKworICAjcHlsYWIucGxvdChyYW5nZSgxMDApLCBjbG9zZV9sb29wX2xlZnQpCisgICNweWxhYi5wbG90KHJhbmdlKDEwMCksIGNsb3NlX2xvb3BfcmlnaHQpCisgICNweWxhYi5zaG93KCkKKworICAjIFdyaXRlIHRoZSBnZW5lcmF0ZWQgY29uc3RhbnRzIG91dCB0byBhIGZpbGUuCisgIHByaW50ICJPdXRwdXQgb25lIgorICBkcml2ZXRyYWluX2xvd19sb3cgPSBEcml2ZXRyYWluKG5hbWU9IkRyaXZldHJhaW5Mb3dMb3ciLCBsZWZ0X2xvdz1UcnVlLCByaWdodF9sb3c9VHJ1ZSkKKyAgZHJpdmV0cmFpbl9sb3dfaGlnaCA9IERyaXZldHJhaW4obmFtZT0iRHJpdmV0cmFpbkxvd0hpZ2giLCBsZWZ0X2xvdz1UcnVlLCByaWdodF9sb3c9RmFsc2UpCisgIGRyaXZldHJhaW5faGlnaF9sb3cgPSBEcml2ZXRyYWluKG5hbWU9IkRyaXZldHJhaW5IaWdoTG93IiwgbGVmdF9sb3c9RmFsc2UsIHJpZ2h0X2xvdz1UcnVlKQorICBkcml2ZXRyYWluX2hpZ2hfaGlnaCA9IERyaXZldHJhaW4obmFtZT0iRHJpdmV0cmFpbkhpZ2hIaWdoIiwgbGVmdF9sb3c9RmFsc2UsIHJpZ2h0X2xvdz1GYWxzZSkKKworICBpZiBsZW4oYXJndikgIT0gNToKKyAgICBwcmludCAiRXhwZWN0ZWQgLmggZmlsZSBuYW1lIGFuZCAuY2MgZmlsZSBuYW1lIgorICBlbHNlOgorICAgIGRvZ19sb29wX3dyaXRlciA9IGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcFdyaXRlcigKKyAgICAgICAgIkRyaXZldHJhaW4iLCBbZHJpdmV0cmFpbl9sb3dfbG93LCBkcml2ZXRyYWluX2xvd19oaWdoLAorICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXRyYWluX2hpZ2hfbG93LCBkcml2ZXRyYWluX2hpZ2hfaGlnaF0pCisgICAgaWYgYXJndlsxXVstMzpdID09ICcuY2MnOgorICAgICAgZG9nX2xvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMl0sIGFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgIGRvZ19sb29wX3dyaXRlci5Xcml0ZShhcmd2WzFdLCBhcmd2WzJdKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKHN5cy5hcmd2KSkKZGlmZiAtLWdpdCBhL2JvdDMvY29udHJvbF9sb29wcy9weXRob24vZWxldmF0b3IucHkgYi9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2VsZXZhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzJmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2VsZXZhdG9yLnB5CkBAIC0wLDAgKzEsMjQ3IEBACisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgY29udHJvbF9sb29wCitpbXBvcnQgY29udHJvbHMKK2ltcG9ydCBwb2x5dG9wZQoraW1wb3J0IHBvbHlkcml2ZXRyYWluCitpbXBvcnQgbnVtcHkKK2ltcG9ydCBzeXMKK2ltcG9ydCBtYXRwbG90bGliCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCisKK2NsYXNzIEVsZXZhdG9yKGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSJFbGV2YXRvciIsIG1hc3M9Tm9uZSk6CisgICAgc3VwZXIoRWxldmF0b3IsIHNlbGYpLl9faW5pdF9fKG5hbWUpCisgICAgIyBTdGFsbCBUb3JxdWUgaW4gTiBtCisgICAgc2VsZi5zdGFsbF90b3JxdWUgPSAyLjQyCisgICAgIyBTdGFsbCBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLnN0YWxsX2N1cnJlbnQgPSAxMzMKKyAgICAjIEZyZWUgU3BlZWQgaW4gUlBNCisgICAgc2VsZi5mcmVlX3NwZWVkID0gNDY1MC4wCisgICAgIyBGcmVlIEN1cnJlbnQgaW4gQW1wcworICAgIHNlbGYuZnJlZV9jdXJyZW50ID0gMi43CisgICAgIyBNYXNzIG9mIHRoZSBlbGV2YXRvcgorICAgICMgVE9ETyhjb21yYW4pOiBHZXQgYWN0dWFsIHZhbHVlLgorICAgIHNlbGYubWFzcyA9IDEzLjAKKyAgICAjIFJlc2lzdGFuY2Ugb2YgdGhlIG1vdG9yCisgICAgc2VsZi5SID0gMTIuMCAvIHNlbGYuc3RhbGxfY3VycmVudAorICAgICMgTW90b3IgdmVsb2NpdHkgY29uc3RhbnQKKyAgICBzZWxmLkt2ID0gKChzZWxmLmZyZWVfc3BlZWQgLyA2MC4wICogMi4wICogbnVtcHkucGkpIC8KKyAgICAgICAgICAgICAgICgxMi4wIC0gc2VsZi5SICogc2VsZi5mcmVlX2N1cnJlbnQpKQorICAgICMgVG9ycXVlIGNvbnN0YW50CisgICAgc2VsZi5LdCA9IHNlbGYuc3RhbGxfdG9ycXVlIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBHZWFyIHJhdGlvCisgICAgIyBUT0RPKGNvbXJhbik6IEdldCBhY3R1YWwgdmFsdWUuCisgICAgc2VsZi5HID0gKDU2LjAgLyAxMi4wKSAqICg4NC4wIC8gMTQuMCkKKyAgICAjIFB1bGxleSBkaWFtZXRlcgorICAgICMgVE9ETyhjb21yYW4pOiBHZXQgYWN0dWFsIHZhbHVlLgorICAgIHNlbGYuciA9IDMyICogMC4wMDUgLyBudW1weS5waSAvIDIuMAorICAgICMgQ29udHJvbCBsb29wIHRpbWUgc3RlcAorICAgIHNlbGYuZHQgPSAwLjAwNQorCisgICAgIyBFbGV2YXRvciBzcHJpbmcgY29uc3RhbnQgKE4vbSkKKyAgICAjIFRPRE8oY29tcmFuKTogR2V0IGFjdHVhbCB2YWx1ZS4KKyAgICBzZWxmLnNwcmluZyA9IDgwMC4wCisKKyAgICAjIFN0YXRlIGlzIFthdmVyYWdlIHBvc2l0aW9uLCBhdmVyYWdlIHZlbG9jaXR5XQorICAgICMgSW5wdXQgaXMgW1ZdCisKKyAgICAjIFRPRE8oY29tcmFuKTogQ2hhbmdlIGV2ZXJ5dGhpbmcgYmVsb3cuCisKKyAgICBDMSA9IHNlbGYuc3ByaW5nIC8gKHNlbGYubWFzcyAqIDAuNSkKKyAgICBDMiA9IHNlbGYuS3QgKiBzZWxmLkcgLyAoc2VsZi5tYXNzICogMC41ICogc2VsZi5yICogc2VsZi5SKQorICAgIEMzID0gc2VsZi5HICogc2VsZi5HICogc2VsZi5LdCAvICgKKyAgICAgICAgc2VsZi5SICAqIHNlbGYuciAqIHNlbGYuciAqIHNlbGYubWFzcyAqIDAuNSAqIHNlbGYuS3YpCisKKyAgICBzZWxmLkFfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLCAxLCAwLCAwXSwKKyAgICAgICAgIFswLCAtQzMsIDAsIDBdLAorICAgICAgICAgWzAsIDAsIDAsIDFdLAorICAgICAgICAgWzAsIDAsIC1DMSAqIDIuMCwgLUMzXV0pCisKKyAgICBwcmludCAiRnVsbCBzcGVlZCBpcyIsIEMyIC8gQzMgKiAxMi4wCisKKyAgICAjIFN0YXJ0IHdpdGggdGhlIHVubW9kaWZpZWQgaW5wdXQKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLCAwXSwKKyAgICAgICAgIFtDMiAvIDIuMCwgQzIgLyAyLjBdLAorICAgICAgICAgWzAsIDBdLAorICAgICAgICAgW0MyIC8gMi4wLCAtQzIgLyAyLjBdXSkKKworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEsIDAsIDEsIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDAsIC0xLCAwXV0pCisgICAgc2VsZi5EID0gbnVtcHkubWF0cml4KFtbMCwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMF1dKQorCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKAorICAgICAgICBzZWxmLkFfY29udGludW91cywgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICBwcmludCBzZWxmLkEKKworICAgIGNvbnRyb2xhYmlsaXR5ID0gY29udHJvbHMuY3RyYihzZWxmLkEsIHNlbGYuQik7CisgICAgcHJpbnQgIlJhbmsgb2YgYXVnbWVudGVkIGNvbnRyb2xhYmlsaXR5IG1hdHJpeC4iLCBudW1weS5saW5hbGcubWF0cml4X3JhbmsoCisgICAgICAgIGNvbnRyb2xhYmlsaXR5KQorCisgICAgcV9wb3MgPSAwLjAyCisgICAgcV92ZWwgPSAwLjQwMAorICAgIHFfcG9zX2RpZmYgPSAwLjAxCisgICAgcV92ZWxfZGlmZiA9IDAuNDUKKyAgICBzZWxmLlEgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKHFfcG9zICoqIDIuMCkpLCAwLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsICgxLjAgLyAocV92ZWwgKiogMi4wKSksIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgKDEuMCAvIChxX3Bvc19kaWZmICoqIDIuMCkpLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAwLjAsICgxLjAgLyAocV92ZWxfZGlmZiAqKiAyLjApKV1dKQorCisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KFtbKDEuMCAvICgxMi4wICoqIDIuMCkpLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMS4wIC8gKDEyLjAgKiogMi4wKV1dKQorICAgIHNlbGYuSyA9IGNvbnRyb2xzLmRscXIoc2VsZi5BLCBzZWxmLkIsIHNlbGYuUSwgc2VsZi5SKQorICAgIHByaW50IHNlbGYuSworCisgICAgcHJpbnQgbnVtcHkubGluYWxnLmVpZyhzZWxmLkEgLSBzZWxmLkIgKiBzZWxmLkspWzBdCisKKyAgICBzZWxmLnJwbCA9IDAuMjAKKyAgICBzZWxmLmlwbCA9IDAuMDUKKyAgICBzZWxmLlBsYWNlT2JzZXJ2ZXJQb2xlcyhbc2VsZi5ycGwgKyAxaiAqIHNlbGYuaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbCArIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsIC0gMWogKiBzZWxmLmlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGwgLSAxaiAqIHNlbGYuaXBsXSkKKworICAgICMgVGhlIGJveCBmb3JtZWQgYnkgVV9taW4gYW5kIFVfbWF4IG11c3QgZW5jb21wYXNzIGFsbCBwb3NzaWJsZSB2YWx1ZXMsCisgICAgIyBvciBlbHNlIEF1c3RpbidzIGNvZGUgZ2V0cyBhbmdyeS4KKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KFtbMTIuMF0sIFsxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXSwgWy0xMi4wXV0pCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKKworZGVmIENhcFUoVSk6CisgIGlmIFVbMCwgMF0gLSBVWzEsIDBdID4gMjQ6CisgICAgcmV0dXJuIG51bXB5Lm1hdHJpeChbWzEyXSwgWy0xMl1dKQorICBlbGlmIFVbMCwgMF0gLSBVWzEsIDBdIDwgLTI0OgorICAgIHJldHVybiBudW1weS5tYXRyaXgoW1stMTJdLCBbMTJdXSkKKyAgZWxzZToKKyAgICBtYXhfdSA9IG1heChVWzAsIDBdLCBVWzEsIDBdKQorICAgIG1pbl91ID0gbWluKFVbMCwgMF0sIFVbMSwgMF0pCisgICAgaWYgbWF4X3UgPiAxMjoKKyAgICAgIHJldHVybiBVIC0gKG1heF91IC0gMTIpCisgICAgaWYgbWluX3UgPCAtMTI6CisgICAgICByZXR1cm4gVSAtIChtaW5fdSArIDEyKQorICAgIHJldHVybiBVCisKKworZGVmIHJ1bl90ZXN0KGVsZXZhdG9yLCBpbml0aWFsX1gsIGdvYWwsIG1heF9zZXBhcmF0aW9uX2Vycm9yPTAuMDEsCisgICAgICAgICAgICAgc2hvd19ncmFwaD1UcnVlLCBpdGVyYXRpb25zPTIwMCwgY29udHJvbGxlcl9lbGV2YXRvcj1Ob25lLAorICAgICAgICAgICAgIG9ic2VydmVyX2VsZXZhdG9yPU5vbmUpOgorICAiIiJSdW5zIHRoZSBlbGV2YXRvciBwbGFudCB3aXRoIGFuIGluaXRpYWwgY29uZGl0aW9uIGFuZCBnb2FsLgorCisgICAgVGhlIHRlc3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCB0ZXJyaWJseSBzb3BoaXN0aWNhdGVkOyBJIGp1c3QgdGVzdCBmb3IKKyAgICB3aGV0aGVyIHRoZSBnb2FsIGhhcyBiZWVuIHJlYWNoZWQgYW5kIHdoZXRoZXIgdGhlIHNlcGFyYXRpb24gZ29lcworICAgIG91dHNpZGUgb2YgdGhlIGluaXRpYWwgYW5kIGdvYWwgdmFsdWVzIGJ5IG1vcmUgdGhhbiBtYXhfc2VwYXJhdGlvbl9lcnJvci4KKyAgICBQcmludHMgb3V0IHNvbWV0aGluZyBmb3IgYSBmYWlsdXJlIG9mIGVpdGhlciBjb25kaXRpb24gYW5kIHJldHVybnMKKyAgICBGYWxzZSBpZiB0ZXN0cyBmYWlsLgorICAgIEFyZ3M6CisgICAgICBlbGV2YXRvcjogZWxldmF0b3Igb2JqZWN0IHRvIHVzZS4KKyAgICAgIGluaXRpYWxfWDogc3RhcnRpbmcgc3RhdGUuCisgICAgICBnb2FsOiBnb2FsIHN0YXRlLgorICAgICAgc2hvd19ncmFwaDogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSBhIGdyYXBoIHNob3dpbmcgdGhlIGNoYW5naW5nCisgICAgICAgICAgIHN0YXRlcyBhbmQgdm9sdGFnZXMuCisgICAgICBpdGVyYXRpb25zOiBOdW1iZXIgb2YgdGltZXN0ZXBzIHRvIHJ1biB0aGUgbW9kZWwgZm9yLgorICAgICAgY29udHJvbGxlcl9lbGV2YXRvcjogZWxldmF0b3Igb2JqZWN0IHRvIGdldCBLIGZyb20sIG9yIE5vbmUgaWYgd2Ugc2hvdWxkCisgICAgICAgICAgdXNlIGVsZXZhdG9yLgorICAgICAgb2JzZXJ2ZXJfZWxldmF0b3I6IGVsZXZhdG9yIG9iamVjdCB0byB1c2UgZm9yIHRoZSBvYnNlcnZlciwgb3IgTm9uZSBpZiB3ZQorICAgICAgICAgIHNob3VsZCB1c2UgdGhlIGFjdHVhbCBzdGF0ZS4KKyAgIiIiCisKKyAgZWxldmF0b3IuWCA9IGluaXRpYWxfWAorCisgIGlmIGNvbnRyb2xsZXJfZWxldmF0b3IgaXMgTm9uZToKKyAgICBjb250cm9sbGVyX2VsZXZhdG9yID0gZWxldmF0b3IKKworICBpZiBvYnNlcnZlcl9lbGV2YXRvciBpcyBub3QgTm9uZToKKyAgICBvYnNlcnZlcl9lbGV2YXRvci5YX2hhdCA9IGluaXRpYWxfWCArIDAuMDEKKyAgICBvYnNlcnZlcl9lbGV2YXRvci5YX2hhdCA9IGluaXRpYWxfWAorCisgICMgVmFyaW91cyBsaXN0cyBmb3IgZ3JhcGhpbmcgdGhpbmdzLgorICB0ID0gW10KKyAgeF9hdmcgPSBbXQorICB4X3NlcCA9IFtdCisgIHhfaGF0X2F2ZyA9IFtdCisgIHhfaGF0X3NlcCA9IFtdCisgIHZfYXZnID0gW10KKyAgdl9zZXAgPSBbXQorICB1X2xlZnQgPSBbXQorICB1X3JpZ2h0ID0gW10KKworICBzZXBfcGxvdF9nYWluID0gMTAwLjAKKworICBmb3IgaSBpbiB4cmFuZ2UoaXRlcmF0aW9ucyk6CisgICAgWF9oYXQgPSBlbGV2YXRvci5YCisgICAgaWYgb2JzZXJ2ZXJfZWxldmF0b3IgaXMgbm90IE5vbmU6CisgICAgICBYX2hhdCA9IG9ic2VydmVyX2VsZXZhdG9yLlhfaGF0CisgICAgICB4X2hhdF9hdmcuYXBwZW5kKG9ic2VydmVyX2VsZXZhdG9yLlhfaGF0WzAsIDBdKQorICAgICAgeF9oYXRfc2VwLmFwcGVuZChvYnNlcnZlcl9lbGV2YXRvci5YX2hhdFsyLCAwXSAqIHNlcF9wbG90X2dhaW4pCisgICAgVSA9IGNvbnRyb2xsZXJfZWxldmF0b3IuSyAqIChnb2FsIC0gWF9oYXQpCisgICAgVSA9IENhcFUoVSkKKyAgICB4X2F2Zy5hcHBlbmQoZWxldmF0b3IuWFswLCAwXSkKKyAgICB2X2F2Zy5hcHBlbmQoZWxldmF0b3IuWFsxLCAwXSkKKyAgICB4X3NlcC5hcHBlbmQoZWxldmF0b3IuWFsyLCAwXSAqIHNlcF9wbG90X2dhaW4pCisgICAgdl9zZXAuYXBwZW5kKGVsZXZhdG9yLlhbMywgMF0pCisgICAgaWYgb2JzZXJ2ZXJfZWxldmF0b3IgaXMgbm90IE5vbmU6CisgICAgICBvYnNlcnZlcl9lbGV2YXRvci5QcmVkaWN0T2JzZXJ2ZXIoVSkKKyAgICBlbGV2YXRvci5VcGRhdGUoVSkKKyAgICBpZiBvYnNlcnZlcl9lbGV2YXRvciBpcyBub3QgTm9uZToKKyAgICAgIG9ic2VydmVyX2VsZXZhdG9yLlkgPSBlbGV2YXRvci5ZCisgICAgICBvYnNlcnZlcl9lbGV2YXRvci5Db3JyZWN0T2JzZXJ2ZXIoVSkKKworICAgIHQuYXBwZW5kKGkgKiBlbGV2YXRvci5kdCkKKyAgICB1X2xlZnQuYXBwZW5kKFVbMCwgMF0pCisgICAgdV9yaWdodC5hcHBlbmQoVVsxLCAwXSkKKworICBwcmludCBudW1weS5saW5hbGcuaW52KGVsZXZhdG9yLkEpCisgIHByaW50ICJkZWx0YSB0aW1lIGlzICIsIGVsZXZhdG9yLmR0CisgIHByaW50ICJWZWxvY2l0eSBhdCB0PTAgaXMgIiwgeF9hdmdbMF0sIHZfYXZnWzBdLCB4X3NlcFswXSwgdl9zZXBbMF0KKyAgcHJpbnQgIlZlbG9jaXR5IGF0IHQ9MStkdCBpcyAiLCB4X2F2Z1sxXSwgdl9hdmdbMV0sIHhfc2VwWzFdLCB2X3NlcFsxXQorCisgIGlmIHNob3dfZ3JhcGg6CisgICAgcHlsYWIuc3VicGxvdCgyLCAxLCAxKQorICAgIHB5bGFiLnBsb3QodCwgeF9hdmcsIGxhYmVsPSd4IGF2ZycpCisgICAgcHlsYWIucGxvdCh0LCB4X3NlcCwgbGFiZWw9J3ggc2VwJykKKyAgICBpZiBvYnNlcnZlcl9lbGV2YXRvciBpcyBub3QgTm9uZToKKyAgICAgIHB5bGFiLnBsb3QodCwgeF9oYXRfYXZnLCBsYWJlbD0neF9oYXQgYXZnJykKKyAgICAgIHB5bGFiLnBsb3QodCwgeF9oYXRfc2VwLCBsYWJlbD0neF9oYXQgc2VwJykKKyAgICBweWxhYi5sZWdlbmQoKQorCisgICAgcHlsYWIuc3VicGxvdCgyLCAxLCAyKQorICAgIHB5bGFiLnBsb3QodCwgdV9sZWZ0LCBsYWJlbD0ndSBsZWZ0JykKKyAgICBweWxhYi5wbG90KHQsIHVfcmlnaHQsIGxhYmVsPSd1IHJpZ2h0JykKKyAgICBweWxhYi5sZWdlbmQoKQorICAgIHB5bGFiLnNob3coKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICBsb2FkZWRfbWFzcyA9IDI1CisgICNsb2FkZWRfbWFzcyA9IDAKKyAgZWxldmF0b3IgPSBFbGV2YXRvcihtYXNzPTEzICsgbG9hZGVkX21hc3MpCisgIGVsZXZhdG9yX2NvbnRyb2xsZXIgPSBFbGV2YXRvcihtYXNzPTEzICsgMTUpCisgIG9ic2VydmVyX2VsZXZhdG9yID0gRWxldmF0b3IobWFzcz0xMyArIDE1KQorICAjb2JzZXJ2ZXJfZWxldmF0b3IgPSBOb25lCisKKyAgIyBUZXN0IG1vdmluZyB0aGUgZWxldmF0b3Igd2l0aCBjb25zdGFudCBzZXBhcmF0aW9uLgorICBpbml0aWFsX1ggPSBudW1weS5tYXRyaXgoW1swLjBdLCBbMC4wXSwgWzAuMDFdLCBbMC4wXV0pCisgICNpbml0aWFsX1ggPSBudW1weS5tYXRyaXgoW1swLjBdLCBbMC4wXSwgWzAuMDBdLCBbMC4wXV0pCisgIFIgPSBudW1weS5tYXRyaXgoW1sxLjBdLCBbMC4wXSwgWzAuMF0sIFswLjBdXSkKKyAgcnVuX3Rlc3QoZWxldmF0b3IsIGluaXRpYWxfWCwgUiwgY29udHJvbGxlcl9lbGV2YXRvcj1lbGV2YXRvcl9jb250cm9sbGVyLAorICAgICAgICAgICBvYnNlcnZlcl9lbGV2YXRvcj1vYnNlcnZlcl9lbGV2YXRvcikKKworICAjIFdyaXRlIHRoZSBnZW5lcmF0ZWQgY29uc3RhbnRzIG91dCB0byBhIGZpbGUuCisgIGlmIGxlbihhcmd2KSAhPSAzOgorICAgIHByaW50ICJFeHBlY3RlZCAuaCBmaWxlIG5hbWUgYW5kIC5jYyBmaWxlIG5hbWUgZm9yIHRoZSBlbGV2YXRvci4iCisgIGVsc2U6CisgICAgZWxldmF0b3IgPSBFbGV2YXRvcigiRWxldmF0b3IiKQorICAgIGxvb3Bfd3JpdGVyID0gY29udHJvbF9sb29wLkNvbnRyb2xMb29wV3JpdGVyKCJFbGV2YXRvciIsIFtlbGV2YXRvcl0pCisgICAgaWYgYXJndlsxXVstMzpdID09ICcuY2MnOgorICAgICAgbG9vcF93cml0ZXIuV3JpdGUoYXJndlsyXSwgYXJndlsxXSkKKyAgICBlbHNlOgorICAgICAgbG9vcF93cml0ZXIuV3JpdGUoYXJndlsxXSwgYXJndlsyXSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2VsZXZhdG9yMy5weSBiL2JvdDMvY29udHJvbF9sb29wcy9weXRob24vZWxldmF0b3IzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyMGU4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2VsZXZhdG9yMy5weQpAQCAtMCwwICsxLDI3MyBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IGNvbnRyb2xfbG9vcAoraW1wb3J0IGNvbnRyb2xzCitpbXBvcnQgbnVtcHkKK2ltcG9ydCBzeXMKK2ltcG9ydCBtYXRwbG90bGliCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCisKK2NsYXNzIEVsZXZhdG9yKGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSJFbGV2YXRvciIsIG1hc3M9Tm9uZSk6CisgICAgc3VwZXIoRWxldmF0b3IsIHNlbGYpLl9faW5pdF9fKG5hbWUpCisgICAgIyBTdGFsbCBUb3JxdWUgaW4gTiBtCisgICAgc2VsZi5zdGFsbF90b3JxdWUgPSAyLjQwMgorICAgICMgU3RhbGwgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5zdGFsbF9jdXJyZW50ID0gMTI2LjE0NQorICAgICMgRnJlZSBTcGVlZCBpbiBSUE0KKyAgICBzZWxmLmZyZWVfc3BlZWQgPSA1MDE1LjU2MgorICAgICMgRnJlZSBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLmZyZWVfY3VycmVudCA9IDEuMTcwCisgICAgIyBNYXNzIG9mIHRoZSBFbGV2YXRvcgorICAgIGlmIG1hc3MgaXMgTm9uZToKKyAgICAgIHNlbGYubWFzcyA9IDUuMAorICAgIGVsc2U6CisgICAgICBzZWxmLm1hc3MgPSBtYXNzCisKKyAgICAjIE51bWJlciBvZiBtb3RvcnMKKyAgICBzZWxmLm51bV9tb3RvcnMgPSAyLjAKKyAgICAjIFJlc2lzdGFuY2Ugb2YgdGhlIG1vdG9yCisgICAgc2VsZi5yZXNpc3RhbmNlID0gMTIuMCAvIHNlbGYuc3RhbGxfY3VycmVudAorICAgICMgTW90b3IgdmVsb2NpdHkgY29uc3RhbnQKKyAgICBzZWxmLkt2ID0gKChzZWxmLmZyZWVfc3BlZWQgLyA2MC4wICogMi4wICogbnVtcHkucGkpIC8KKyAgICAgICAgICAgICAgICgxMi4wIC0gc2VsZi5yZXNpc3RhbmNlICogc2VsZi5mcmVlX2N1cnJlbnQpKQorICAgICMgVG9ycXVlIGNvbnN0YW50CisgICAgc2VsZi5LdCA9IChzZWxmLm51bV9tb3RvcnMgKiBzZWxmLnN0YWxsX3RvcnF1ZSkgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIEdlYXIgcmF0aW8KKyAgICBzZWxmLkcgPSA4CisgICAgIyBSYWRpdXMgb2YgcHVsbGV5CisgICAgc2VsZi5yID0gMC4wMjU0CisKKyAgICAjIENvbnRyb2wgbG9vcCB0aW1lIHN0ZXAKKyAgICBzZWxmLmR0ID0gMC4wMDUKKworICAgICMgU3RhdGUgaXMgW3Bvc2l0aW9uLCB2ZWxvY2l0eV0KKyAgICAjIElucHV0IGlzIFtWb2x0YWdlXQorCisgICAgQzEgPSBzZWxmLkt0ICogc2VsZi5HICogc2VsZi5HIC8gKHNlbGYuS3YgKiBzZWxmLnJlc2lzdGFuY2UgKiBzZWxmLnIgKiBzZWxmLnIgKiBzZWxmLm1hc3MpCisgICAgQzIgPSBzZWxmLkcgKiBzZWxmLkt0IC8gKHNlbGYucmVzaXN0YW5jZSAqIHNlbGYuciAqIHNlbGYubWFzcykKKworICAgIHNlbGYuQV9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDFdLAorICAgICAgICAgWzAsIC1DMV1dKQorCisgICAgIyBTdGFydCB3aXRoIHRoZSB1bm1vZGlmaWVkIGlucHV0CisgICAgc2VsZi5CX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMF0sCisgICAgICAgICBbQzJdXSkKKworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEsIDBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swXV0pCisgICAgCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKAorICAgICAgICBzZWxmLkFfY29udGludW91cywgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICBjb250cm9sYWJpbGl0eSA9IGNvbnRyb2xzLmN0cmIoc2VsZi5BLCBzZWxmLkIpOworCisgICAgcV9wb3MgPSAwLjAxNQorICAgIHFfdmVsID0gMC41CisgICAgc2VsZi5RID0gbnVtcHkubWF0cml4KFtbKDEuMCAvIChxX3BvcyAqKiAyLjApKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsICgxLjAgLyAocV92ZWwgKiogMi4wKSldXSkKKworICAgIHNlbGYuUiA9IG51bXB5Lm1hdHJpeChbWygxLjAgLyAoMTIuMCAqKiAyLjApKV1dKQorICAgIHNlbGYuSyA9IGNvbnRyb2xzLmRscXIoc2VsZi5BLCBzZWxmLkIsIHNlbGYuUSwgc2VsZi5SKQorCisgICAgcHJpbnQgJ0snLCBzZWxmLksKKyAgICBwcmludCAnUG9sZXMgYXJlJywgbnVtcHkubGluYWxnLmVpZyhzZWxmLkEgLSBzZWxmLkIgKiBzZWxmLkspWzBdCisKKyAgICBzZWxmLnJwbCA9IDAuMzAKKyAgICBzZWxmLmlwbCA9IDAuMTAKKyAgICBzZWxmLlBsYWNlT2JzZXJ2ZXJQb2xlcyhbc2VsZi5ycGwgKyAxaiAqIHNlbGYuaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbCAtIDFqICogc2VsZi5pcGxdKQorCisgICAgIyAgICBwcmludCAnTCBpcycsIHNlbGYuTAorCisgICAgcV9wb3MgPSAwLjA1CisgICAgcV92ZWwgPSAyLjY1CisgICAgc2VsZi5RID0gbnVtcHkubWF0cml4KFtbKHFfcG9zICoqIDIuMCksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAocV92ZWwgKiogMi4wKV1dKQorCisgICAgcl92b2x0cyA9IDAuMDI1CisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KFtbKHJfdm9sdHMgKiogMi4wKV1dKQorCisgICAgc2VsZi5LYWxtYW5HYWluLCBzZWxmLlFfc3RlYWR5ID0gY29udHJvbHMua2FsbWFuKAorICAgICAgICBBPXNlbGYuQSwgQj1zZWxmLkIsIEM9c2VsZi5DLCBRPXNlbGYuUSwgUj1zZWxmLlIpCisKKyAgICAjICAgIHByaW50ICdLYWwnLCBzZWxmLkthbG1hbkdhaW4KKyAgICBzZWxmLkwgPSBzZWxmLkEgKiBzZWxmLkthbG1hbkdhaW4KKyAgICBwcmludCAnS2FsTCBpcycsIHNlbGYuTAorCisgICAgIyBUaGUgYm94IGZvcm1lZCBieSBVX21pbiBhbmQgVV9tYXggbXVzdCBlbmNvbXBhc3MgYWxsIHBvc3NpYmxlIHZhbHVlcywKKyAgICAjIG9yIGVsc2UgQXVzdGluJ3MgY29kZSBnZXRzIGFuZ3J5LgorICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXV0pCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKK2NsYXNzIEludGVncmFsRWxldmF0b3IoRWxldmF0b3IpOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iSW50ZWdyYWxFbGV2YXRvciIsIG1hc3M9Tm9uZSk6CisgICAgc3VwZXIoSW50ZWdyYWxFbGV2YXRvciwgc2VsZikuX19pbml0X18obmFtZT1uYW1lLCBtYXNzPW1hc3MpCisKKyAgICBzZWxmLkFfY29udGludW91c191bmF1Z21lbnRlZCA9IHNlbGYuQV9jb250aW51b3VzCisgICAgc2VsZi5CX2NvbnRpbnVvdXNfdW5hdWdtZW50ZWQgPSBzZWxmLkJfY29udGludW91cworCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgobnVtcHkuemVyb3MoKDMsIDMpKSkKKyAgICBzZWxmLkFfY29udGludW91c1swOjIsIDA6Ml0gPSBzZWxmLkFfY29udGludW91c191bmF1Z21lbnRlZAorICAgIHNlbGYuQV9jb250aW51b3VzWzA6MiwgMl0gPSBzZWxmLkJfY29udGludW91c191bmF1Z21lbnRlZAorCisgICAgc2VsZi5CX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgobnVtcHkuemVyb3MoKDMsIDEpKSkKKyAgICBzZWxmLkJfY29udGludW91c1swOjIsIDBdID0gc2VsZi5CX2NvbnRpbnVvdXNfdW5hdWdtZW50ZWQKKworICAgIHNlbGYuQ191bmF1Z21lbnRlZCA9IHNlbGYuQworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChudW1weS56ZXJvcygoMSwgMykpKQorICAgIHNlbGYuQ1swOjEsIDA6Ml0gPSBzZWxmLkNfdW5hdWdtZW50ZWQKKworICAgIHNlbGYuQSwgc2VsZi5CID0gc2VsZi5Db250aW51b3VzVG9EaXNjcmV0ZShzZWxmLkFfY29udGludW91cywgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICBxX3BvcyA9IDAuMDgKKyAgICBxX3ZlbCA9IDAuNDAKKyAgICBxX3ZvbHRhZ2UgPSA2LjAKKyAgICBzZWxmLlEgPSBudW1weS5tYXRyaXgoW1socV9wb3MgKiogMi4wKSwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKHFfdmVsICoqIDIuMCksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIChxX3ZvbHRhZ2UgKiogMi4wKV1dKQorCisgICAgcl9wb3MgPSAwLjA1CisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KFtbKHJfcG9zICoqIDIuMCldXSkKKworICAgIHNlbGYuS2FsbWFuR2Fpbiwgc2VsZi5RX3N0ZWFkeSA9IGNvbnRyb2xzLmthbG1hbigKKyAgICAgICAgQT1zZWxmLkEsIEI9c2VsZi5CLCBDPXNlbGYuQywgUT1zZWxmLlEsIFI9c2VsZi5SKQorICAgIHNlbGYuTCA9IHNlbGYuQSAqIHNlbGYuS2FsbWFuR2FpbgorCisgICAgc2VsZi5LX3VuYXVnbWVudGVkID0gc2VsZi5LCisgICAgc2VsZi5LID0gbnVtcHkubWF0cml4KG51bXB5Lnplcm9zKCgxLCAzKSkpCisgICAgc2VsZi5LWzAsIDA6Ml0gPSBzZWxmLktfdW5hdWdtZW50ZWQKKyAgICBzZWxmLktbMCwgMl0gPSAxCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKKworY2xhc3MgU2NlbmFyaW9QbG90dGVyKG9iamVjdCk6CisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAjIFZhcmlvdXMgbGlzdHMgZm9yIGdyYXBoaW5nIHRoaW5ncy4KKyAgICBzZWxmLnQgPSBbXQorICAgIHNlbGYueCA9IFtdCisgICAgc2VsZi52ID0gW10KKyAgICBzZWxmLmEgPSBbXQorICAgIHNlbGYueF9oYXQgPSBbXQorICAgIHNlbGYudSA9IFtdCisKKyAgZGVmIHJ1bl90ZXN0KHNlbGYsIGVsZXZhdG9yLCBnb2FsLAorICAgICAgICAgICAgICAgaXRlcmF0aW9ucz0yMDAsIGNvbnRyb2xsZXJfZWxldmF0b3I9Tm9uZSwKKyAgICAgICAgICAgICAgIG9ic2VydmVyX2VsZXZhdG9yPU5vbmUpOgorICAgICIiIlJ1bnMgdGhlIEVsZXZhdG9yIHBsYW50IHdpdGggYW4gaW5pdGlhbCBjb25kaXRpb24gYW5kIGdvYWwuCisKKyAgICAgIEFyZ3M6CisgICAgICAgIEVsZXZhdG9yOiBlbGV2YXRvciBvYmplY3QgdG8gdXNlLgorICAgICAgICBpbml0aWFsX1g6IHN0YXJ0aW5nIHN0YXRlLgorICAgICAgICBnb2FsOiBnb2FsIHN0YXRlLgorICAgICAgICBpdGVyYXRpb25zOiBOdW1iZXIgb2YgdGltZXN0ZXBzIHRvIHJ1biB0aGUgbW9kZWwgZm9yLgorICAgICAgICBjb250cm9sbGVyX0VsZXZhdG9yOiBlbGV2YXRvciBvYmplY3QgdG8gZ2V0IEsgZnJvbSwgb3IgTm9uZSBpZiB3ZSBzaG91bGQKKyAgICAgICAgICAgIHVzZSBFbGV2YXRvci4KKyAgICAgICAgb2JzZXJ2ZXJfRWxldmF0b3I6IGVsZXZhdG9yIG9iamVjdCB0byB1c2UgZm9yIHRoZSBvYnNlcnZlciwgb3IgTm9uZSBpZiB3ZSBzaG91bGQKKyAgICAgICAgICAgIHVzZSB0aGUgYWN0dWFsIHN0YXRlLgorICAgICIiIgorCisgICAgaWYgY29udHJvbGxlcl9lbGV2YXRvciBpcyBOb25lOgorICAgICAgY29udHJvbGxlcl9lbGV2YXRvciA9IGVsZXZhdG9yCisKKyAgICB2YmF0ID0gMTAuMAorICAgIGlmIHNlbGYudDoKKyAgICAgIGluaXRpYWxfdCA9IHNlbGYudFstMV0gKyBlbGV2YXRvci5kdAorICAgIGVsc2U6CisgICAgICBpbml0aWFsX3QgPSAwCisgICAgZm9yIGkgaW4geHJhbmdlKGl0ZXJhdGlvbnMpOgorICAgICAgWF9oYXQgPSBlbGV2YXRvci5YCisgICAgICBpZiBvYnNlcnZlcl9lbGV2YXRvciBpcyBub3QgTm9uZToKKyAgICAgICAgWF9oYXQgPSBvYnNlcnZlcl9lbGV2YXRvci5YX2hhdAorICAgICAgICBzZWxmLnhfaGF0LmFwcGVuZChvYnNlcnZlcl9lbGV2YXRvci5YX2hhdFswLCAwXSkKKyAgICAgIGdyYXZpdHlfY29tcGVuc2F0aW9uID0gIDkuOCAqIGVsZXZhdG9yLm1hc3MgKiBlbGV2YXRvci5yIC8gZWxldmF0b3IuRyAvIGVsZXZhdG9yLkt0ICogZWxldmF0b3IucmVzaXN0YW5jZQorCisgICAgICBVID0gY29udHJvbGxlcl9lbGV2YXRvci5LICogKGdvYWwgLSBYX2hhdCkKKyAgICAgIFVbMCwgMF0gPSBudW1weS5jbGlwKFVbMCwgMF0sIC12YmF0ICwgdmJhdCApCisgICAgICBzZWxmLnguYXBwZW5kKGVsZXZhdG9yLlhbMCwgMF0pCisgICAgICBpZiBzZWxmLnY6CisgICAgICAgIGxhc3RfdiA9IHNlbGYudlstMV0KKyAgICAgIGVsc2U6CisgICAgICAgIGxhc3RfdiA9IDAKKyAgICAgIHNlbGYudi5hcHBlbmQoZWxldmF0b3IuWFsxLCAwXSkKKyAgICAgIHNlbGYuYS5hcHBlbmQoKHNlbGYudlstMV0gLSBsYXN0X3YpIC8gZWxldmF0b3IuZHQpCisKKyAgICAgIGlmIG9ic2VydmVyX2VsZXZhdG9yIGlzIG5vdCBOb25lOgorICAgICAgICBvYnNlcnZlcl9lbGV2YXRvci5ZID0gZWxldmF0b3IuWQorICAgICAgICBvYnNlcnZlcl9lbGV2YXRvci5Db3JyZWN0T2JzZXJ2ZXIoVSkKKworICAgICAgZWxldmF0b3IuVXBkYXRlKFUgLSBncmF2aXR5X2NvbXBlbnNhdGlvbikKKworICAgICAgaWYgb2JzZXJ2ZXJfZWxldmF0b3IgaXMgbm90IE5vbmU6CisgICAgICAgIG9ic2VydmVyX2VsZXZhdG9yLlByZWRpY3RPYnNlcnZlcihVKQorCisgICAgICBzZWxmLnQuYXBwZW5kKGluaXRpYWxfdCArIGkgKiBlbGV2YXRvci5kdCkKKyAgICAgIHNlbGYudS5hcHBlbmQoVVswLCAwXSkKKyMgICAgICBpZiBudW1weS5hYnMoKGdvYWwgLSBYX2hhdClbMDoyLCAwXSkuc3VtKCkgPCAuMDI1OgorIyAgICAgICAgcHJpbnQgIlRpbWU6ICIsIHNlbGYudFstMV0KKyMgICAgICAgIGJyZWFrCisKKyAgICBwcmludCAiVGltZTogIiwgc2VsZi50Wy0xXQorCisKKyAgZGVmIFBsb3Qoc2VsZik6CisgICAgcHlsYWIuc3VicGxvdCgzLCAxLCAxKQorICAgIHB5bGFiLnBsb3Qoc2VsZi50LCBzZWxmLngsIGxhYmVsPSd4JykKKyAgICBweWxhYi5wbG90KHNlbGYudCwgc2VsZi54X2hhdCwgbGFiZWw9J3hfaGF0JykKKyAgICBweWxhYi5sZWdlbmQoKQorCisgICAgcHlsYWIuc3VicGxvdCgzLCAxLCAyKQorICAgIHB5bGFiLnBsb3Qoc2VsZi50LCBzZWxmLnUsIGxhYmVsPSd1JykKKworICAgIHB5bGFiLnN1YnBsb3QoMywgMSwgMykKKyAgICBweWxhYi5wbG90KHNlbGYudCwgc2VsZi5hLCBsYWJlbD0nYScpCisKKyAgICBweWxhYi5sZWdlbmQoKQorICAgIHB5bGFiLnNob3coKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICBsb2FkZWRfbWFzcyA9IDcrNC4wCisgICNsb2FkZWRfbWFzcyA9IDAKKyAgI29ic2VydmVyX2VsZXZhdG9yID0gTm9uZQorCisgICMgVGVzdCBtb3ZpbmcgdGhlIEVsZXZhdG9yCisgIGluaXRpYWxfWCA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdXSkKKyAgdXBfUiA9IG51bXB5Lm1hdHJpeChbWzAuNDU3Ml0sIFswLjBdLCBbMC4wXV0pCisgIGRvd25fUiA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdLCBbMC4wXV0pCisgIHRvdGVtYXNzID0gMy41NAorICBzY2VuYXJpb19wbG90dGVyID0gU2NlbmFyaW9QbG90dGVyKCkKKworICBlbGV2YXRvcl9jb250cm9sbGVyID0gSW50ZWdyYWxFbGV2YXRvcihtYXNzPTQqdG90ZW1hc3MgKyBsb2FkZWRfbWFzcykKKyAgb2JzZXJ2ZXJfZWxldmF0b3IgPSBJbnRlZ3JhbEVsZXZhdG9yKG1hc3M9NCp0b3RlbWFzcyArIGxvYWRlZF9tYXNzKQorCisgIGZvciBpIGluIHhyYW5nZSgwLCA3KToKKyAgICBlbGV2YXRvciA9IEVsZXZhdG9yKG1hc3M9aSp0b3RlbWFzcyArIGxvYWRlZF9tYXNzKQorICAgIHByaW50ICdBY3R1YWwgcG9sZXMgYXJlJywgbnVtcHkubGluYWxnLmVpZyhlbGV2YXRvci5BIC0gZWxldmF0b3IuQiAqIGVsZXZhdG9yX2NvbnRyb2xsZXIuS1swLCAwOjJdKVswXQorCisgICAgZWxldmF0b3IuWCA9IGluaXRpYWxfWAorICAgIHNjZW5hcmlvX3Bsb3R0ZXIucnVuX3Rlc3QoZWxldmF0b3IsIGdvYWw9dXBfUiwgY29udHJvbGxlcl9lbGV2YXRvcj1lbGV2YXRvcl9jb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJfZWxldmF0b3I9b2JzZXJ2ZXJfZWxldmF0b3IsIGl0ZXJhdGlvbnM9MjAwKQorICAgIHNjZW5hcmlvX3Bsb3R0ZXIucnVuX3Rlc3QoZWxldmF0b3IsIGdvYWw9ZG93bl9SLCBjb250cm9sbGVyX2VsZXZhdG9yPWVsZXZhdG9yX2NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcl9lbGV2YXRvcj1vYnNlcnZlcl9lbGV2YXRvciwgaXRlcmF0aW9ucz0yMDApCisKKyAgc2NlbmFyaW9fcGxvdHRlci5QbG90KCkKKworICAjIFdyaXRlIHRoZSBnZW5lcmF0ZWQgY29uc3RhbnRzIG91dCB0byBhIGZpbGUuCisgIGlmIGxlbihhcmd2KSAhPSAzOgorICAgIHByaW50ICJFeHBlY3RlZCAuaCBmaWxlIG5hbWUgYW5kIC5jYyBmaWxlIG5hbWUgZm9yIHRoZSBFbGV2YXRvci4iCisgIGVsc2U6CisgICAgZWxldmF0b3IgPSBFbGV2YXRvcigiRWxldmF0b3IiKQorICAgIGxvb3Bfd3JpdGVyID0gY29udHJvbF9sb29wLkNvbnRyb2xMb29wV3JpdGVyKCJFbGV2YXRvciIsIFtlbGV2YXRvcl0pCisgICAgaWYgYXJndlsxXVstMzpdID09ICcuY2MnOgorICAgICAgbG9vcF93cml0ZXIuV3JpdGUoYXJndlsyXSwgYXJndlsxXSkKKyAgICBlbHNlOgorICAgICAgbG9vcF93cml0ZXIuV3JpdGUoYXJndlsxXSwgYXJndlsyXSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL3BvbHlkcml2ZXRyYWluLnB5IGIvYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9wb2x5ZHJpdmV0cmFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjJjOGM4Ci0tLSAvZGV2L251bGwKKysrIGIvYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9wb2x5ZHJpdmV0cmFpbi5weQpAQCAtMCwwICsxLDUwNCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IG51bXB5CitpbXBvcnQgc3lzCitpbXBvcnQgcG9seXRvcGUKK2ltcG9ydCBkcml2ZXRyYWluCitpbXBvcnQgY29udHJvbF9sb29wCitpbXBvcnQgY29udHJvbHMKK2Zyb20gbWF0cGxvdGxpYiBpbXBvcnQgcHlsYWIKKworX19hdXRob3JfXyA9ICdBdXN0aW4gU2NodWggKGF1c3Rpbi5saW51eEBnbWFpbC5jb20pJworCisKK2RlZiBDb2VyY2VHb2FsKHJlZ2lvbiwgSywgdywgUik6CisgICIiIkludGVyc2VjdHMgYSBsaW5lIHdpdGggYSByZWdpb24sIGFuZCBmaW5kcyB0aGUgY2xvc2VzdCBwb2ludCB0byBSLgorCisgIEZpbmRzIGEgcG9pbnQgdGhhdCBpcyBjbG9zZXN0IHRvIFIgaW5zaWRlIHRoZSByZWdpb24sIGFuZCBvbiB0aGUgbGluZQorICBkZWZpbmVkIGJ5IEsgWCA9IHcuICBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gZmluZCBhIHBvaW50IG9uIHRoZSBsaW5lLAorICBmaW5kcyBhIHBvaW50IHRoYXQgaXMgaW5zaWRlIHRoZSByZWdpb24gYW5kIGNsb3Nlc3QgdG8gdGhlIGxpbmUuICBUaGlzCisgIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdAorCisgIEFyZ3M6CisgICAgcmVnaW9uOiBIUG9seXRvcGUsIHRoZSB2YWxpZCBnb2FsIHJlZ2lvbi4KKyAgICBLOiBudW1weS5tYXRyaXggKDIgeCAxKSwgdGhlIG1hdHJpeCBmb3IgdGhlIGVxdWF0aW9uIFtLMSwgSzJdIFt4MTsgeDJdID0gdworICAgIHc6IGZsb2F0LCB0aGUgb2Zmc2V0IGluIHRoZSBlcXVhdGlvbiBhYm92ZS4KKyAgICBSOiBudW1weS5tYXRyaXggKDIgeCAxKSwgdGhlIHBvaW50IHRvIGJlIGNsb3Nlc3QgdG8uCisKKyAgUmV0dXJuczoKKyAgICBudW1weS5tYXRyaXggKDIgeCAxKSwgdGhlIHBvaW50LgorICAiIiIKKyAgcmV0dXJuIERvQ29lcmNlR29hbChyZWdpb24sIEssIHcsIFIpWzBdCisKK2RlZiBEb0NvZXJjZUdvYWwocmVnaW9uLCBLLCB3LCBSKToKKyAgaWYgcmVnaW9uLklzSW5zaWRlKFIpOgorICAgIHJldHVybiAoUiwgVHJ1ZSkKKworICBwZXJwZW5kaWN1bGFyX3ZlY3RvciA9IEsuVCAvIG51bXB5LmxpbmFsZy5ub3JtKEspCisgIHBhcmFsbGVsX3ZlY3RvciA9IG51bXB5Lm1hdHJpeChbW3BlcnBlbmRpY3VsYXJfdmVjdG9yWzEsIDBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLXBlcnBlbmRpY3VsYXJfdmVjdG9yWzAsIDBdXV0pCisgIAorICAjIFdlIHdhbnQgdG8gaW1wb3NlIHRoZSBjb25zdHJhaW50IEsgKiBYID0gdyBvbiB0aGUgcG9seXRvcGUgSCAqIFggPD0gay4KKyAgIyBXZSBkbyB0aGlzIGJ5IGJyZWFraW5nIFggdXAgaW50byBwYXJhbGxlbCBhbmQgcGVycGVuZGljdWxhciBjb21wb25lbnRzIHRvCisgICMgdGhlIGhhbGYgcGxhbmUuICBUaGlzIGdpdmVzIHVzIHRoZSBmb2xsb3dpbmcgZXF1YXRpb24uCisgICMKKyAgIyAgcGFyYWxsZWwgKiAocGFyYWxsZWwuVCBcZG90IFgpICsgcGVycGVuZGljdWxhciAqIChwZXJwZW5kaWN1bGFyIFxkb3QgWCkpID0gWAorICAjCisgICMgVGhlbiwgc3Vic3RpdHV0ZSB0aGlzIGludG8gdGhlIHBvbHl0b3BlLgorICAjCisgICMgIEggKiAocGFyYWxsZWwgKiAocGFyYWxsZWwuVCBcZG90IFgpICsgcGVycGVuZGljdWxhciAqIChwZXJwZW5kaWN1bGFyIFxkb3QgWCkpIDw9IGsKKyAgIworICAjIFN1YnN0aXR1dGUgSyAqIFggPSB3CisgICMKKyAgIyBIICogcGFyYWxsZWwgKiAocGFyYWxsZWwuVCBcZG90IFgpICsgSCAqIHBlcnBlbmRpY3VsYXIgKiB3IDw9IGsKKyAgIworICAjIE1vdmUgYWxsIHRoZSBrbm93bnMgdG8gdGhlIHJpZ2h0IHNpZGUuCisgICMKKyAgIyBIICogcGFyYWxsZWwgKiAoW3BhcmFsbGVsMSBwYXJhbGxlbDJdICogWCkgPD0gayAtIEggKiBwZXJwZW5kaWN1bGFyICogdworICAjCisgICMgTGV0IHQgPSBwYXJhbGxlbC5UIFxkb3QgWCwgdGhlIGNvbXBvbmVudCBwYXJhbGxlbCB0byB0aGUgc3VyZmFjZS4KKyAgIworICAjIEggKiBwYXJhbGxlbCAqIHQgPD0gayAtIEggKiBwZXJwZW5kaWN1bGFyICogdworICAjCisgICMgVGhpcyBpcyBhIHBvbHl0b3BlIHdoaWNoIHdlIGNhbiBzb2x2ZSwgYW5kIHVzZSB0byBmaWd1cmUgb3V0IHRoZSByYW5nZSBvZiBYCisgICMgdGhhdCB3ZSBjYXJlIGFib3V0IQorCisgIHRfcG9seSA9IHBvbHl0b3BlLkhQb2x5dG9wZSgKKyAgICAgIHJlZ2lvbi5IICogcGFyYWxsZWxfdmVjdG9yLAorICAgICAgcmVnaW9uLmsgLSByZWdpb24uSCAqIHBlcnBlbmRpY3VsYXJfdmVjdG9yICogdykKKworICB2ZXJ0aWNlcyA9IHRfcG9seS5WZXJ0aWNlcygpCisKKyAgaWYgdmVydGljZXMuc2hhcGVbMF06CisgICAgIyBUaGUgcmVnaW9uIGV4aXN0cyEKKyAgICAjIEZpbmQgdGhlIGNsb3Nlc3QgdmVydGV4CisgICAgbWluX2Rpc3RhbmNlID0gbnVtcHkuaW5mdHkKKyAgICBjbG9zZXN0X3BvaW50ID0gTm9uZQorICAgIGZvciB2ZXJ0ZXggaW4gdmVydGljZXM6CisgICAgICBwb2ludCA9IHBhcmFsbGVsX3ZlY3RvciAqIHZlcnRleCArIHBlcnBlbmRpY3VsYXJfdmVjdG9yICogdworICAgICAgbGVuZ3RoID0gbnVtcHkubGluYWxnLm5vcm0oUiAtIHBvaW50KQorICAgICAgaWYgbGVuZ3RoIDwgbWluX2Rpc3RhbmNlOgorICAgICAgICBtaW5fZGlzdGFuY2UgPSBsZW5ndGgKKyAgICAgICAgY2xvc2VzdF9wb2ludCA9IHBvaW50CisKKyAgICByZXR1cm4gKGNsb3Nlc3RfcG9pbnQsIFRydWUpCisgIGVsc2U6CisgICAgIyBGaW5kIHRoZSB2ZXJ0ZXggb2YgdGhlIHNwYWNlIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgbGluZS4KKyAgICByZWdpb25fdmVydGljZXMgPSByZWdpb24uVmVydGljZXMoKQorICAgIG1pbl9kaXN0YW5jZSA9IG51bXB5LmluZnR5CisgICAgY2xvc2VzdF9wb2ludCA9IE5vbmUKKyAgICBmb3IgdmVydGV4IGluIHJlZ2lvbl92ZXJ0aWNlczoKKyAgICAgIHBvaW50ID0gdmVydGV4LlQKKyAgICAgIGxlbmd0aCA9IG51bXB5LmFicygocGVycGVuZGljdWxhcl92ZWN0b3IuVCAqIHBvaW50KVswLCAwXSkKKyAgICAgIGlmIGxlbmd0aCA8IG1pbl9kaXN0YW5jZToKKyAgICAgICAgbWluX2Rpc3RhbmNlID0gbGVuZ3RoCisgICAgICAgIGNsb3Nlc3RfcG9pbnQgPSBwb2ludAorCisgICAgcmV0dXJuIChjbG9zZXN0X3BvaW50LCBGYWxzZSkKKworCitjbGFzcyBWZWxvY2l0eURyaXZldHJhaW5Nb2RlbChjb250cm9sX2xvb3AuQ29udHJvbExvb3ApOgorICBkZWYgX19pbml0X18oc2VsZiwgbGVmdF9sb3c9VHJ1ZSwgcmlnaHRfbG93PVRydWUsIG5hbWU9IlZlbG9jaXR5RHJpdmV0cmFpbk1vZGVsIik6CisgICAgc3VwZXIoVmVsb2NpdHlEcml2ZXRyYWluTW9kZWwsIHNlbGYpLl9faW5pdF9fKG5hbWUpCisgICAgc2VsZi5fZHJpdmV0cmFpbiA9IGRyaXZldHJhaW4uRHJpdmV0cmFpbihsZWZ0X2xvdz1sZWZ0X2xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X2xvdz1yaWdodF9sb3cpCisgICAgc2VsZi5kdCA9IDAuMDEKKyAgICBzZWxmLkFfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1tzZWxmLl9kcml2ZXRyYWluLkFfY29udGludW91c1sxLCAxXSwgc2VsZi5fZHJpdmV0cmFpbi5BX2NvbnRpbnVvdXNbMSwgM11dLAorICAgICAgICAgW3NlbGYuX2RyaXZldHJhaW4uQV9jb250aW51b3VzWzMsIDFdLCBzZWxmLl9kcml2ZXRyYWluLkFfY29udGludW91c1szLCAzXV1dKQorCisgICAgc2VsZi5CX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbc2VsZi5fZHJpdmV0cmFpbi5CX2NvbnRpbnVvdXNbMSwgMF0sIHNlbGYuX2RyaXZldHJhaW4uQl9jb250aW51b3VzWzEsIDFdXSwKKyAgICAgICAgIFtzZWxmLl9kcml2ZXRyYWluLkJfY29udGludW91c1szLCAwXSwgc2VsZi5fZHJpdmV0cmFpbi5CX2NvbnRpbnVvdXNbMywgMV1dXSkKKyAgICBzZWxmLkMgPSBudW1weS5tYXRyaXgobnVtcHkuZXllKDIpKTsKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgobnVtcHkuemVyb3MoKDIsIDIpKSk7CisKKyAgICBzZWxmLkEsIHNlbGYuQiA9IHNlbGYuQ29udGludW91c1RvRGlzY3JldGUoc2VsZi5BX2NvbnRpbnVvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQl9jb250aW51b3VzLCBzZWxmLmR0KQorCisgICAgIyBGRiAqIFggPSBVIChzdGVhZHkgc3RhdGUpCisgICAgc2VsZi5GRiA9IHNlbGYuQi5JICogKG51bXB5LmV5ZSgyKSAtIHNlbGYuQSkKKworICAgIHNlbGYuUGxhY2VDb250cm9sbGVyUG9sZXMoWzAuNiwgMC42XSkKKyAgICBzZWxmLlBsYWNlT2JzZXJ2ZXJQb2xlcyhbMC4wMiwgMC4wMl0pCisKKyAgICBzZWxmLkdfaGlnaCA9IHNlbGYuX2RyaXZldHJhaW4uR19oaWdoCisgICAgc2VsZi5HX2xvdyA9IHNlbGYuX2RyaXZldHJhaW4uR19sb3cKKyAgICBzZWxmLlIgPSBzZWxmLl9kcml2ZXRyYWluLlIKKyAgICBzZWxmLnIgPSBzZWxmLl9kcml2ZXRyYWluLnIKKyAgICBzZWxmLkt2ID0gc2VsZi5fZHJpdmV0cmFpbi5LdgorICAgIHNlbGYuS3QgPSBzZWxmLl9kcml2ZXRyYWluLkt0CisKKyAgICBzZWxmLlVfbWF4ID0gc2VsZi5fZHJpdmV0cmFpbi5VX21heAorICAgIHNlbGYuVV9taW4gPSBzZWxmLl9kcml2ZXRyYWluLlVfbWluCisKKworY2xhc3MgVmVsb2NpdHlEcml2ZXRyYWluKG9iamVjdCk6CisgIEhJR0ggPSAnaGlnaCcKKyAgTE9XID0gJ2xvdycKKyAgU0hJRlRJTkdfVVAgPSAndXAnCisgIFNISUZUSU5HX0RPV04gPSAnZG93bicKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi5kcml2ZXRyYWluX2xvd19sb3cgPSBWZWxvY2l0eURyaXZldHJhaW5Nb2RlbCgKKyAgICAgICAgbGVmdF9sb3c9VHJ1ZSwgcmlnaHRfbG93PVRydWUsIG5hbWU9J1ZlbG9jaXR5RHJpdmV0cmFpbkxvd0xvdycpCisgICAgc2VsZi5kcml2ZXRyYWluX2xvd19oaWdoID0gVmVsb2NpdHlEcml2ZXRyYWluTW9kZWwobGVmdF9sb3c9VHJ1ZSwgcmlnaHRfbG93PUZhbHNlLCBuYW1lPSdWZWxvY2l0eURyaXZldHJhaW5Mb3dIaWdoJykKKyAgICBzZWxmLmRyaXZldHJhaW5faGlnaF9sb3cgPSBWZWxvY2l0eURyaXZldHJhaW5Nb2RlbChsZWZ0X2xvdz1GYWxzZSwgcmlnaHRfbG93PVRydWUsIG5hbWUgPSAnVmVsb2NpdHlEcml2ZXRyYWluSGlnaExvdycpCisgICAgc2VsZi5kcml2ZXRyYWluX2hpZ2hfaGlnaCA9IFZlbG9jaXR5RHJpdmV0cmFpbk1vZGVsKGxlZnRfbG93PUZhbHNlLCByaWdodF9sb3c9RmFsc2UsIG5hbWUgPSAnVmVsb2NpdHlEcml2ZXRyYWluSGlnaEhpZ2gnKQorCisgICAgIyBYIGlzIFtsdmVsLCBydmVsXQorICAgIHNlbGYuWCA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLjBdLAorICAgICAgICAgWzAuMF1dKQorCisgICAgc2VsZi5VX3BvbHkgPSBwb2x5dG9wZS5IUG9seXRvcGUoCisgICAgICAgIG51bXB5Lm1hdHJpeChbWzEsIDBdLAorICAgICAgICAgICAgICAgICAgICAgIFstMSwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgWzAsIDFdLAorICAgICAgICAgICAgICAgICAgICAgIFswLCAtMV1dKSwKKyAgICAgICAgbnVtcHkubWF0cml4KFtbMTJdLAorICAgICAgICAgICAgICAgICAgICAgIFsxMl0sCisgICAgICAgICAgICAgICAgICAgICAgWzEyXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTJdXSkpCisKKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzEyLjBdLAorICAgICAgICAgWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWy0xMi4wMDAwMDAwMDAwXSwKKyAgICAgICAgIFstMTIuMDAwMDAwMDAwMF1dKQorCisgICAgc2VsZi5kdCA9IDAuMDEKKworICAgIHNlbGYuUiA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLjBdLAorICAgICAgICAgWzAuMF1dKQorCisgICAgIyB0dHJ1c3QgaXMgdGhlIGNvbXByaW1pc2UgYmV0d2VlbiBoYXZpbmcgZnVsbCB0aHJvdHRsZSBuZWdhdGl2ZSBpbmVydGlhLAorICAgICMgYW5kIGhhdmluZyBubyB0aHJvdHRsZSBuZWdhdGl2ZSBpbmVydGlhLiAgQSB2YWx1ZSBvZiAwIGlzIGZ1bGwgdGhyb3R0bGUKKyAgICAjIGluZXJ0aWEuICBBIHZhbHVlIG9mIDEgaXMgbm8gdGhyb3R0bGUgbmVnYXRpdmUgaW5lcnRpYS4KKyAgICBzZWxmLnR0cnVzdCA9IDEuMQorCisgICAgc2VsZi5sZWZ0X2dlYXIgPSBWZWxvY2l0eURyaXZldHJhaW4uTE9XCisgICAgc2VsZi5yaWdodF9nZWFyID0gVmVsb2NpdHlEcml2ZXRyYWluLkxPVworICAgIHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uID0gMC4wCisgICAgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID0gMC4wCisgICAgc2VsZi5sZWZ0X2NpbSA9IGRyaXZldHJhaW4uQ0lNKCkKKyAgICBzZWxmLnJpZ2h0X2NpbSA9IGRyaXZldHJhaW4uQ0lNKCkKKworICBkZWYgSXNJbkdlYXIoc2VsZiwgZ2Vhcik6CisgICAgcmV0dXJuIGdlYXIgaXMgVmVsb2NpdHlEcml2ZXRyYWluLkhJR0ggb3IgZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uTE9XCisKKyAgZGVmIE1vdG9yUlBNKHNlbGYsIHNoaWZ0ZXJfcG9zaXRpb24sIHZlbG9jaXR5KToKKyAgICBpZiBzaGlmdGVyX3Bvc2l0aW9uID4gMC41OgorICAgICAgcmV0dXJuICh2ZWxvY2l0eSAvIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5HX2hpZ2ggLworICAgICAgICAgICAgICBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkucikKKyAgICBlbHNlOgorICAgICAgcmV0dXJuICh2ZWxvY2l0eSAvIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5HX2xvdyAvCisgICAgICAgICAgICAgIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5yKQorCisgIGRlZiBDdXJyZW50RHJpdmV0cmFpbihzZWxmKToKKyAgICBpZiBzZWxmLmxlZnRfc2hpZnRlcl9wb3NpdGlvbiA+IDAuNToKKyAgICAgIGlmIHNlbGYucmlnaHRfc2hpZnRlcl9wb3NpdGlvbiA+IDAuNToKKyAgICAgICAgcmV0dXJuIHNlbGYuZHJpdmV0cmFpbl9oaWdoX2hpZ2gKKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBzZWxmLmRyaXZldHJhaW5faGlnaF9sb3cKKyAgICBlbHNlOgorICAgICAgaWYgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID4gMC41OgorICAgICAgICByZXR1cm4gc2VsZi5kcml2ZXRyYWluX2xvd19oaWdoCisgICAgICBlbHNlOgorICAgICAgICByZXR1cm4gc2VsZi5kcml2ZXRyYWluX2xvd19sb3cKKworICBkZWYgU2ltU2hpZnRlcihzZWxmLCBnZWFyLCBzaGlmdGVyX3Bvc2l0aW9uKToKKyAgICBpZiBnZWFyIGlzIFZlbG9jaXR5RHJpdmV0cmFpbi5ISUdIIG9yIGdlYXIgaXMgVmVsb2NpdHlEcml2ZXRyYWluLlNISUZUSU5HX1VQOgorICAgICAgc2hpZnRlcl9wb3NpdGlvbiA9IG1pbihzaGlmdGVyX3Bvc2l0aW9uICsgMC41LCAxLjApCisgICAgZWxzZToKKyAgICAgIHNoaWZ0ZXJfcG9zaXRpb24gPSBtYXgoc2hpZnRlcl9wb3NpdGlvbiAtIDAuNSwgMC4wKQorCisgICAgaWYgc2hpZnRlcl9wb3NpdGlvbiA9PSAxLjA6CisgICAgICBnZWFyID0gVmVsb2NpdHlEcml2ZXRyYWluLkhJR0gKKyAgICBlbGlmIHNoaWZ0ZXJfcG9zaXRpb24gPT0gMC4wOgorICAgICAgZ2VhciA9IFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKworICAgIHJldHVybiBnZWFyLCBzaGlmdGVyX3Bvc2l0aW9uCisKKyAgZGVmIENvbXB1dGVHZWFyKHNlbGYsIHdoZWVsX3ZlbG9jaXR5LCBzaG91bGRfcHJpbnQ9RmFsc2UsIGN1cnJlbnRfZ2Vhcj1GYWxzZSwgZ2Vhcl9uYW1lPU5vbmUpOgorICAgIGhpZ2hfb21lZ2EgPSAod2hlZWxfdmVsb2NpdHkgLyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuR19oaWdoIC8KKyAgICAgICAgICAgICAgICAgIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5yKQorICAgIGxvd19vbWVnYSA9ICh3aGVlbF92ZWxvY2l0eSAvIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5HX2xvdyAvCisgICAgICAgICAgICAgICAgIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5yKQorICAgICNwcmludCBnZWFyX25hbWUsICJNb3RvciBFbmVyZ3kgRGlmZmVyZW5jZS4iLCAwLjUgKiAwLjAwMDE0MDAzMjY0NyAqIChsb3dfb21lZ2EgKiBsb3dfb21lZ2EgLSBoaWdoX29tZWdhICogaGlnaF9vbWVnYSksICJqb3VsZXMiCisgICAgaGlnaF90b3JxdWUgPSAoKDEyLjAgLSBoaWdoX29tZWdhIC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkt2KSAqCisgICAgICAgICAgICAgICAgICAgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkt0IC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLlIpCisgICAgbG93X3RvcnF1ZSA9ICgoMTIuMCAtIGxvd19vbWVnYSAvIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5LdikgKgorICAgICAgICAgICAgICAgICAgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkt0IC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLlIpCisgICAgaGlnaF9wb3dlciA9IGhpZ2hfdG9ycXVlICogaGlnaF9vbWVnYQorICAgIGxvd19wb3dlciA9IGxvd190b3JxdWUgKiBsb3dfb21lZ2EKKyAgICAjaWYgc2hvdWxkX3ByaW50OgorICAgICMgIHByaW50IGdlYXJfbmFtZSwgIkhpZ2ggb21lZ2EiLCBoaWdoX29tZWdhLCAiTG93IG9tZWdhIiwgbG93X29tZWdhCisgICAgIyAgcHJpbnQgZ2Vhcl9uYW1lLCAiSGlnaCB0b3JxdWUiLCBoaWdoX3RvcnF1ZSwgIkxvdyB0b3JxdWUiLCBsb3dfdG9ycXVlCisgICAgIyAgcHJpbnQgZ2Vhcl9uYW1lLCAiSGlnaCBwb3dlciIsIGhpZ2hfcG93ZXIsICJMb3cgcG93ZXIiLCBsb3dfcG93ZXIKKworICAgICMgU2hpZnQgYWxnb3JpdGhtIGltcHJvdmVtZW50cy4KKyAgICAjIFRPRE8oYXNjaHVoKToKKyAgICAjIEl0IHRha2VzIHRpbWUgdG8gc2hpZnQuICBTaGlmdGluZyBkb3duIGZvciAxIGN5Y2xlIGRvZXNuJ3QgbWFrZSBzZW5zZQorICAgICMgYmVjYXVzZSB5b3Ugd2lsbCBlbmQgdXAgc2xvd2VyIHRoYW4gd2l0aG91dCBzaGlmdGluZy4gIEZpZ3VyZSBvdXQgaG93CisgICAgIyB0byBpbmNsdWRlIHRoYXQgaW5mby4KKyAgICAjIElmIHRoZSBkcml2ZXIgaXMgc3RpbGwgaW4gaGlnaCBnZWFyLCBidXQgaXNuJ3QgYXNraW5nIGZvciB0aGUgZXh0cmEgcG93ZXIKKyAgICAjIGZyb20gbG93IGdlYXIsIGRvbid0IHNoaWZ0IHVudGlsIGhlIGFza3MgZm9yIGl0LgorICAgIGdvYWxfZ2Vhcl9pc19oaWdoID0gaGlnaF9wb3dlciA+IGxvd19wb3dlcgorICAgICNnb2FsX2dlYXJfaXNfaGlnaCA9IFRydWUKKworICAgIGlmIG5vdCBzZWxmLklzSW5HZWFyKGN1cnJlbnRfZ2Vhcik6CisgICAgICBwcmludCBnZWFyX25hbWUsICdOb3QgaW4gZ2Vhci4nCisgICAgICByZXR1cm4gY3VycmVudF9nZWFyCisgICAgZWxzZToKKyAgICAgIGlzX2hpZ2ggPSBjdXJyZW50X2dlYXIgaXMgVmVsb2NpdHlEcml2ZXRyYWluLkhJR0gKKyAgICAgIGlmIGlzX2hpZ2ggIT0gZ29hbF9nZWFyX2lzX2hpZ2g6CisgICAgICAgIGlmIGdvYWxfZ2Vhcl9pc19oaWdoOgorICAgICAgICAgIHByaW50IGdlYXJfbmFtZSwgJ1NoaWZ0aW5nIHVwLicKKyAgICAgICAgICByZXR1cm4gVmVsb2NpdHlEcml2ZXRyYWluLlNISUZUSU5HX1VQCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcHJpbnQgZ2Vhcl9uYW1lLCAnU2hpZnRpbmcgZG93bi4nCisgICAgICAgICAgcmV0dXJuIFZlbG9jaXR5RHJpdmV0cmFpbi5TSElGVElOR19ET1dOCisgICAgICBlbHNlOgorICAgICAgICByZXR1cm4gY3VycmVudF9nZWFyCisKKyAgZGVmIEZpbHRlclZlbG9jaXR5KHNlbGYsIHRocm90dGxlKToKKyAgICAjIEludmVydCB0aGUgcGxhbnQgdG8gZmlndXJlIG91dCBob3cgdGhlIHZlbG9jaXR5IGZpbHRlciB3b3VsZCBoYXZlIHRvIHdvcmsKKyAgICAjIG91dCBpbiBvcmRlciB0byBmaWx0ZXIgb3V0IHRoZSBmb3J3YXJkcyBuZWdhdGl2ZSBpbmVydGlhLgorICAgICMgVGhpcyBtYXRoIGFzc3VtZXMgdGhhdCB0aGUgbGVmdCBhbmQgcmlnaHQgcG93ZXIgYW5kIHZlbG9jaXR5IGFyZSBlcXVhbC4KKworICAgICMgVGhlIHRocm90dGxlIGZpbHRlciBzaG91bGQgZmlsdGVyIHN1Y2ggdGhhdCB0aGUgbW90b3IgaW4gdGhlIGhpZ2hlc3QgZ2VhcgorICAgICMgc2hvdWxkIGJlIGNvbnRyb2xsaW5nIHRoZSB0aW1lIGNvbnN0YW50LgorICAgICMgRG8gdGhpcyBieSBmaW5kaW5nIHRoZSBpbmRleCBvZiBGRiB0aGF0IGhhcyB0aGUgbG93ZXN0IHZhbHVlLCBhbmQgY29tcHV0aW5nCisgICAgIyB0aGUgc3VtcyB1c2luZyB0aGF0IGluZGV4LgorICAgIEZGX3N1bSA9IHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5GRi5zdW0oYXhpcz0xKQorICAgIG1pbl9GRl9zdW1faW5kZXggPSBudW1weS5hcmdtaW4oRkZfc3VtKQorICAgIG1pbl9GRl9zdW0gPSBGRl9zdW1bbWluX0ZGX3N1bV9pbmRleCwgMF0KKyAgICBtaW5fS19zdW0gPSBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuS1ttaW5fRkZfc3VtX2luZGV4LCA6XS5zdW0oKQorICAgICMgQ29tcHV0ZSB0aGUgRkYgc3VtIGZvciBoaWdoIGdlYXIuCisgICAgaGlnaF9taW5fRkZfc3VtID0gc2VsZi5kcml2ZXRyYWluX2hpZ2hfaGlnaC5GRlswLCA6XS5zdW0oKQorCisgICAgIyBVID0gc2VsZi5LWzAsIDpdLnN1bSgpICogKFIgLSB4X2F2ZykgKyBzZWxmLkZGWzAsIDpdLnN1bSgpICogUgorICAgICMgdGhyb3R0bGUgKiAxMi4wID0gKHNlbGYuS1swLCA6XS5zdW0oKSArIHNlbGYuRkZbMCwgOl0uc3VtKCkpICogUgorICAgICMgICAgICAgICAgICAgICAgICAgLSBzZWxmLktbMCwgOl0uc3VtKCkgKiB4X2F2ZworCisgICAgIyBSID0gKHRocm90dGxlICogMTIuMCArIHNlbGYuS1swLCA6XS5zdW0oKSAqIHhfYXZnKSAvCisgICAgIyAgICAgKHNlbGYuS1swLCA6XS5zdW0oKSArIHNlbGYuRkZbMCwgOl0uc3VtKCkpCisKKyAgICAjIFUgPSAoSyArIEZGKSAqIFIgLSBLICogWAorICAgICMgKEsgKyBGRikgXi0xICogKFUgKyBLICogWCkgPSBSCisKKyAgICAjIFNjYWxlIHRocm90dGxlIGJ5IG1pbl9GRl9zdW0gLyBoaWdoX21pbl9GRl9zdW0uICBUaGlzIHdpbGwgbWFrZSBsb3cgZ2VhcgorICAgICMgaGF2ZSB0aGUgc2FtZSB2ZWxvY2l0eSBnb2FsIGFzIGhpZ2ggZ2VhciwgYW5kIHNvIHRoYXQgdGhlIHJvYm90IHdpbGwgaG9sZAorICAgICMgdGhlIHNhbWUgc3BlZWQgZm9yIHRoZSBzYW1lIHRocm90dGxlIGZvciBhbGwgZ2VhcnMuCisgICAgYWRqdXN0ZWRfZmZfdm9sdGFnZSA9IG51bXB5LmNsaXAodGhyb3R0bGUgKiAxMi4wICogbWluX0ZGX3N1bSAvIGhpZ2hfbWluX0ZGX3N1bSwgLTEyLjAsIDEyLjApCisgICAgcmV0dXJuICgoYWRqdXN0ZWRfZmZfdm9sdGFnZSArIHNlbGYudHRydXN0ICogbWluX0tfc3VtICogKHNlbGYuWFswLCAwXSArIHNlbGYuWFsxLCAwXSkgLyAyLjApCisgICAgICAgICAgICAvIChzZWxmLnR0cnVzdCAqIG1pbl9LX3N1bSArIG1pbl9GRl9zdW0pKQorCisgIGRlZiBVcGRhdGUoc2VsZiwgdGhyb3R0bGUsIHN0ZWVyaW5nKToKKyAgICAjIFNoaWZ0IGludG8gdGhlIGdlYXIgd2hpY2ggc2VuZHMgdGhlIG1vc3QgcG93ZXIgdG8gdGhlIGZsb29yLgorICAgICMgVGhpcyBpcyB0aGUgc2FtZSBhcyBzZW5kaW5nIHRoZSBtb3N0IHRvcnF1ZSBkb3duIHRvIHRoZSBmbG9vciBhdCB0aGUKKyAgICAjIHdoZWVsLgorCisgICAgc2VsZi5sZWZ0X2dlYXIgPSBzZWxmLnJpZ2h0X2dlYXIgPSBUcnVlCisgICAgaWYgRmFsc2U6CisgICAgICBzZWxmLmxlZnRfZ2VhciA9IHNlbGYuQ29tcHV0ZUdlYXIoc2VsZi5YWzAsIDBdLCBzaG91bGRfcHJpbnQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2dlYXI9c2VsZi5sZWZ0X2dlYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Vhcl9uYW1lPSJsZWZ0IikKKyAgICAgIHNlbGYucmlnaHRfZ2VhciA9IHNlbGYuQ29tcHV0ZUdlYXIoc2VsZi5YWzEsIDBdLCBzaG91bGRfcHJpbnQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9nZWFyPXNlbGYucmlnaHRfZ2VhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Vhcl9uYW1lPSJyaWdodCIpCisgICAgICBpZiBzZWxmLklzSW5HZWFyKHNlbGYubGVmdF9nZWFyKToKKyAgICAgICAgc2VsZi5sZWZ0X2NpbS5YWzAsIDBdID0gc2VsZi5Nb3RvclJQTShzZWxmLmxlZnRfc2hpZnRlcl9wb3NpdGlvbiwgc2VsZi5YWzAsIDBdKQorCisgICAgICBpZiBzZWxmLklzSW5HZWFyKHNlbGYucmlnaHRfZ2Vhcik6CisgICAgICAgIHNlbGYucmlnaHRfY2ltLlhbMCwgMF0gPSBzZWxmLk1vdG9yUlBNKHNlbGYucmlnaHRfc2hpZnRlcl9wb3NpdGlvbiwgc2VsZi5YWzAsIDBdKQorCisgICAgc3RlZXJpbmcgKj0gMi4zCisgICAgaWYgVHJ1ZSBvciBzZWxmLklzSW5HZWFyKHNlbGYubGVmdF9nZWFyKSBhbmQgc2VsZi5Jc0luR2VhcihzZWxmLnJpZ2h0X2dlYXIpOgorICAgICAgIyBGaWx0ZXIgdGhlIHRocm90dGxlIHRvIHByb3ZpZGUgYSBuaWNlciByZXNwb25zZS4KKyAgICAgIGZ2ZWwgPSBzZWxmLkZpbHRlclZlbG9jaXR5KHRocm90dGxlKQorCisgICAgICAjIENvbnN0YW50IHJhZGl1cyBtZWFucyB0aGF0IGFuZ3VhbGFyX3ZlbG9jaXR5IC8gbGluZWFyX3ZlbG9jaXR5ID0gY29uc3RhbnQuCisgICAgICAjIENvbXB1dGUgdGhlIGxlZnQgYW5kIHJpZ2h0IHZlbG9jaXRpZXMuCisgICAgICBzdGVlcmluZ192ZWxvY2l0eSA9IG51bXB5LmFicyhmdmVsKSAqIHN0ZWVyaW5nCisgICAgICBsZWZ0X3ZlbG9jaXR5ID0gZnZlbCAtIHN0ZWVyaW5nX3ZlbG9jaXR5CisgICAgICByaWdodF92ZWxvY2l0eSA9IGZ2ZWwgKyBzdGVlcmluZ192ZWxvY2l0eQorCisgICAgICAjIFdyaXRlIHRoaXMgY29uc3RyYWludCBpbiB0aGUgZm9ybSBvZiBLICogUiA9IHcKKyAgICAgICMgYW5ndWxhciB2ZWxvY2l0eSAvIGxpbmVhciB2ZWxvY2l0eSA9IGNvbnN0YW50CisgICAgICAjIChsZWZ0IC0gcmlnaHQpIC8gKGxlZnQgKyByaWdodCkgPSBjb25zdGFudAorICAgICAgIyBsZWZ0IC0gcmlnaHQgPSBjb25zdGFudCAqIGxlZnQgKyBjb25zdGFudCAqIHJpZ2h0CisKKyAgICAgICMgKGZ2ZWwgLSBzdGVlcmluZyAqIG51bXB5LmFicyhmdmVsKSAtIGZ2ZWwgLSBzdGVlcmluZyAqIG51bXB5LmFicyhmdmVsKSkgLworICAgICAgIyAgKGZ2ZWwgLSBzdGVlcmluZyAqIG51bXB5LmFicyhmdmVsKSArIGZ2ZWwgKyBzdGVlcmluZyAqIG51bXB5LmFicyhmdmVsKSkgPQorICAgICAgIyAgICAgICBjb25zdGFudAorICAgICAgIyAoLSAyICogc3RlZXJpbmcgKiBudW1weS5hYnMoZnZlbCkpIC8gKDIgKiBmdmVsKSA9IGNvbnN0YW50CisgICAgICAjICgtc3RlZXJpbmcgKiBzaWduKGZ2ZWwpKSA9IGNvbnN0YW50CisgICAgICAjICgtc3RlZXJpbmcgKiBzaWduKGZ2ZWwpKSAqIChsZWZ0ICsgcmlnaHQpID0gbGVmdCAtIHJpZ2h0CisgICAgICAjIChzdGVlcmluZyAqIHNpZ24oZnZlbCkgKyAxKSAqIGxlZnQgKyAoc3RlZXJpbmcgKiBzaWduKGZ2ZWwpIC0gMSkgKiByaWdodCA9IDAKKworICAgICAgZXF1YWxpdHlfayA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgICBbWzEgKyBzdGVlcmluZyAqIG51bXB5LnNpZ24oZnZlbCksIC0oMSAtIHN0ZWVyaW5nICogbnVtcHkuc2lnbihmdmVsKSldXSkKKyAgICAgIGVxdWFsaXR5X3cgPSAwLjAKKworICAgICAgc2VsZi5SWzAsIDBdID0gbGVmdF92ZWxvY2l0eQorICAgICAgc2VsZi5SWzEsIDBdID0gcmlnaHRfdmVsb2NpdHkKKworICAgICAgIyBDb25zdHJ1Y3QgYSBjb25zdHJhaW50IG9uIFIgYnkgbWFuaXB1bGF0aW5nIHRoZSBjb25zdHJhaW50IG9uIFUKKyAgICAgICMgU3RhcnQgb3V0IHdpdGggSCAqIFUgPD0gaworICAgICAgIyBVID0gRkYgKiBSICsgSyAqIChSIC0gWCkKKyAgICAgICMgSCAqIChGRiAqIFIgKyBLICogUiAtIEsgKiBYKSA8PSBrCisgICAgICAjIEggKiAoRkYgKyBLKSAqIFIgPD0gayArIEggKiBLICogWAorICAgICAgUl9wb2x5ID0gcG9seXRvcGUuSFBvbHl0b3BlKAorICAgICAgICAgIHNlbGYuVV9wb2x5LkggKiAoc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLksgKyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuRkYpLAorICAgICAgICAgIHNlbGYuVV9wb2x5LmsgKyBzZWxmLlVfcG9seS5IICogc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLksgKiBzZWxmLlgpCisKKyAgICAgICMgTGltaXQgUiBiYWNrIGluc2lkZSB0aGUgYm94LgorICAgICAgc2VsZi5ib3hlZF9SID0gQ29lcmNlR29hbChSX3BvbHksIGVxdWFsaXR5X2ssIGVxdWFsaXR5X3csIHNlbGYuUikKKworICAgICAgRkZfdm9sdHMgPSBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuRkYgKiBzZWxmLmJveGVkX1IKKyAgICAgIHNlbGYuVV9pZGVhbCA9IHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5LICogKHNlbGYuYm94ZWRfUiAtIHNlbGYuWCkgKyBGRl92b2x0cworICAgIGVsc2U6CisgICAgICBwcmludCAnTm90IGFsbCBpbiBnZWFyJworICAgICAgaWYgbm90IHNlbGYuSXNJbkdlYXIoc2VsZi5sZWZ0X2dlYXIpIGFuZCBub3Qgc2VsZi5Jc0luR2VhcihzZWxmLnJpZ2h0X2dlYXIpOgorICAgICAgICAjIFRPRE8oYXVzdGluKTogVXNlIGJhdHRlcnkgdm9sdHMgaGVyZS4KKyAgICAgICAgUl9sZWZ0ID0gc2VsZi5Nb3RvclJQTShzZWxmLmxlZnRfc2hpZnRlcl9wb3NpdGlvbiwgc2VsZi5YWzAsIDBdKQorICAgICAgICBzZWxmLlVfaWRlYWxbMCwgMF0gPSBudW1weS5jbGlwKAorICAgICAgICAgICAgc2VsZi5sZWZ0X2NpbS5LICogKFJfbGVmdCAtIHNlbGYubGVmdF9jaW0uWCkgKyBSX2xlZnQgLyBzZWxmLmxlZnRfY2ltLkt2LAorICAgICAgICAgICAgc2VsZi5sZWZ0X2NpbS5VX21pbiwgc2VsZi5sZWZ0X2NpbS5VX21heCkKKyAgICAgICAgc2VsZi5sZWZ0X2NpbS5VcGRhdGUoc2VsZi5VX2lkZWFsWzAsIDBdKQorCisgICAgICAgIFJfcmlnaHQgPSBzZWxmLk1vdG9yUlBNKHNlbGYucmlnaHRfc2hpZnRlcl9wb3NpdGlvbiwgc2VsZi5YWzEsIDBdKQorICAgICAgICBzZWxmLlVfaWRlYWxbMSwgMF0gPSBudW1weS5jbGlwKAorICAgICAgICAgICAgc2VsZi5yaWdodF9jaW0uSyAqIChSX3JpZ2h0IC0gc2VsZi5yaWdodF9jaW0uWCkgKyBSX3JpZ2h0IC8gc2VsZi5yaWdodF9jaW0uS3YsCisgICAgICAgICAgICBzZWxmLnJpZ2h0X2NpbS5VX21pbiwgc2VsZi5yaWdodF9jaW0uVV9tYXgpCisgICAgICAgIHNlbGYucmlnaHRfY2ltLlVwZGF0ZShzZWxmLlVfaWRlYWxbMSwgMF0pCisgICAgICBlbHNlOgorICAgICAgICBhc3NlcnQgRmFsc2UKKworICAgIHNlbGYuVSA9IG51bXB5LmNsaXAoc2VsZi5VX2lkZWFsLCBzZWxmLlVfbWluLCBzZWxmLlVfbWF4KQorCisgICAgIyBUT0RPKGF1c3Rpbik6IE1vZGVsIHRoZSByb2JvdCBhcyBub3QgYWNjZWxlcmF0aW5nIHdoZW4geW91IHNoaWZ0Li4uCisgICAgIyBUaGlzIGhhY2sgb25seSB3b3JrcyB3aGVuIHlvdSBzaGlmdCBhdCB0aGUgc2FtZSB0aW1lLgorICAgIGlmIFRydWUgb3Igc2VsZi5Jc0luR2VhcihzZWxmLmxlZnRfZ2VhcikgYW5kIHNlbGYuSXNJbkdlYXIoc2VsZi5yaWdodF9nZWFyKToKKyAgICAgIHNlbGYuWCA9IHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5BICogc2VsZi5YICsgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkIgKiBzZWxmLlUKKworICAgIHNlbGYubGVmdF9nZWFyLCBzZWxmLmxlZnRfc2hpZnRlcl9wb3NpdGlvbiA9IHNlbGYuU2ltU2hpZnRlcigKKyAgICAgICAgc2VsZi5sZWZ0X2dlYXIsIHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uKQorICAgIHNlbGYucmlnaHRfZ2Vhciwgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID0gc2VsZi5TaW1TaGlmdGVyKAorICAgICAgICBzZWxmLnJpZ2h0X2dlYXIsIHNlbGYucmlnaHRfc2hpZnRlcl9wb3NpdGlvbikKKworICAgIHByaW50ICJVIGlzIiwgc2VsZi5VWzAsIDBdLCBzZWxmLlVbMSwgMF0KKyAgICBwcmludCAiTGVmdCBzaGlmdGVyIiwgc2VsZi5sZWZ0X2dlYXIsIHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uLCAiUmlnaHQgc2hpZnRlciIsIHNlbGYucmlnaHRfZ2Vhciwgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uCisKKworZGVmIG1haW4oYXJndik6CisgIHZkcml2ZXRyYWluID0gVmVsb2NpdHlEcml2ZXRyYWluKCkKKworICBpZiBsZW4oYXJndikgIT0gNzoKKyAgICBwcmludCAiRXhwZWN0ZWQgLmggZmlsZSBuYW1lIGFuZCAuY2MgZmlsZSBuYW1lIgorICBlbHNlOgorICAgIGRvZ19sb29wX3dyaXRlciA9IGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcFdyaXRlcigKKyAgICAgICAgIlZlbG9jaXR5RHJpdmV0cmFpbiIsIFt2ZHJpdmV0cmFpbi5kcml2ZXRyYWluX2xvd19sb3csCisgICAgICAgICAgICAgICAgICAgICAgIHZkcml2ZXRyYWluLmRyaXZldHJhaW5fbG93X2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgIHZkcml2ZXRyYWluLmRyaXZldHJhaW5faGlnaF9sb3csCisgICAgICAgICAgICAgICAgICAgICAgIHZkcml2ZXRyYWluLmRyaXZldHJhaW5faGlnaF9oaWdoXSkKKworICAgIGlmIGFyZ3ZbMV1bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGRvZ19sb29wX3dyaXRlci5Xcml0ZShhcmd2WzJdLCBhcmd2WzFdKQorICAgIGVsc2U6CisgICAgICBkb2dfbG9vcF93cml0ZXIuV3JpdGUoYXJndlsxXSwgYXJndlsyXSkKKworICAgIGNpbV93cml0ZXIgPSBjb250cm9sX2xvb3AuQ29udHJvbExvb3BXcml0ZXIoCisgICAgICAgICJDSU0iLCBbZHJpdmV0cmFpbi5DSU0oKV0pCisKKyAgICBpZiBhcmd2WzVdWy0zOl0gPT0gJy5jYyc6CisgICAgICBjaW1fd3JpdGVyLldyaXRlKGFyZ3ZbNl0sIGFyZ3ZbNV0pCisgICAgZWxzZToKKyAgICAgIGNpbV93cml0ZXIuV3JpdGUoYXJndls1XSwgYXJndls2XSkKKyAgICByZXR1cm4KKworICB2bF9wbG90ID0gW10KKyAgdnJfcGxvdCA9IFtdCisgIHVsX3Bsb3QgPSBbXQorICB1cl9wbG90ID0gW10KKyAgcmFkaXVzX3Bsb3QgPSBbXQorICB0X3Bsb3QgPSBbXQorICBsZWZ0X2dlYXJfcGxvdCA9IFtdCisgIHJpZ2h0X2dlYXJfcGxvdCA9IFtdCisgIHZkcml2ZXRyYWluLmxlZnRfc2hpZnRlcl9wb3NpdGlvbiA9IDAuMAorICB2ZHJpdmV0cmFpbi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID0gMC4wCisgIHZkcml2ZXRyYWluLmxlZnRfZ2VhciA9IFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKyAgdmRyaXZldHJhaW4ucmlnaHRfZ2VhciA9IFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKworICBwcmludCAiSyBpcyIsIHZkcml2ZXRyYWluLkN1cnJlbnREcml2ZXRyYWluKCkuSworCisgIGlmIHZkcml2ZXRyYWluLmxlZnRfZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSDoKKyAgICBwcmludCAiTGVmdCBpcyBoaWdoIgorICBlbHNlOgorICAgIHByaW50ICJMZWZ0IGlzIGxvdyIKKyAgaWYgdmRyaXZldHJhaW4ucmlnaHRfZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSDoKKyAgICBwcmludCAiUmlnaHQgaXMgaGlnaCIKKyAgZWxzZToKKyAgICBwcmludCAiUmlnaHQgaXMgbG93IgorCisgIGZvciB0IGluIG51bXB5LmFyYW5nZSgwLCAxLjcsIHZkcml2ZXRyYWluLmR0KToKKyAgICBpZiB0IDwgMC41OgorICAgICAgdmRyaXZldHJhaW4uVXBkYXRlKHRocm90dGxlPTAuMDAsIHN0ZWVyaW5nPTEuMCkKKyAgICBlbGlmIHQgPCAxLjI6CisgICAgICB2ZHJpdmV0cmFpbi5VcGRhdGUodGhyb3R0bGU9MC41LCBzdGVlcmluZz0xLjApCisgICAgZWxzZToKKyAgICAgIHZkcml2ZXRyYWluLlVwZGF0ZSh0aHJvdHRsZT0wLjAwLCBzdGVlcmluZz0xLjApCisgICAgdF9wbG90LmFwcGVuZCh0KQorICAgIHZsX3Bsb3QuYXBwZW5kKHZkcml2ZXRyYWluLlhbMCwgMF0pCisgICAgdnJfcGxvdC5hcHBlbmQodmRyaXZldHJhaW4uWFsxLCAwXSkKKyAgICB1bF9wbG90LmFwcGVuZCh2ZHJpdmV0cmFpbi5VWzAsIDBdKQorICAgIHVyX3Bsb3QuYXBwZW5kKHZkcml2ZXRyYWluLlVbMSwgMF0pCisgICAgbGVmdF9nZWFyX3Bsb3QuYXBwZW5kKCh2ZHJpdmV0cmFpbi5sZWZ0X2dlYXIgaXMgVmVsb2NpdHlEcml2ZXRyYWluLkhJR0gpICogMi4wIC0gMTAuMCkKKyAgICByaWdodF9nZWFyX3Bsb3QuYXBwZW5kKCh2ZHJpdmV0cmFpbi5yaWdodF9nZWFyIGlzIFZlbG9jaXR5RHJpdmV0cmFpbi5ISUdIKSAqIDIuMCAtIDEwLjApCisKKyAgICBmd2RfdmVsb2NpdHkgPSAodmRyaXZldHJhaW4uWFsxLCAwXSArIHZkcml2ZXRyYWluLlhbMCwgMF0pIC8gMgorICAgIHR1cm5fdmVsb2NpdHkgPSAodmRyaXZldHJhaW4uWFsxLCAwXSAtIHZkcml2ZXRyYWluLlhbMCwgMF0pCisgICAgaWYgYWJzKGZ3ZF92ZWxvY2l0eSkgPCAwLjAwMDAwMDE6CisgICAgICByYWRpdXNfcGxvdC5hcHBlbmQodHVybl92ZWxvY2l0eSkKKyAgICBlbHNlOgorICAgICAgcmFkaXVzX3Bsb3QuYXBwZW5kKHR1cm5fdmVsb2NpdHkgLyBmd2RfdmVsb2NpdHkpCisKKyAgY2ltX3ZlbG9jaXR5X3Bsb3QgPSBbXQorICBjaW1fdm9sdGFnZV9wbG90ID0gW10KKyAgY2ltX3RpbWUgPSBbXQorICBjaW0gPSBkcml2ZXRyYWluLkNJTSgpCisgIFIgPSBudW1weS5tYXRyaXgoW1szMDBdXSkKKyAgZm9yIHQgaW4gbnVtcHkuYXJhbmdlKDAsIDAuNSwgY2ltLmR0KToKKyAgICBVID0gbnVtcHkuY2xpcChjaW0uSyAqIChSIC0gY2ltLlgpICsgUiAvIGNpbS5LdiwgY2ltLlVfbWluLCBjaW0uVV9tYXgpCisgICAgY2ltLlVwZGF0ZShVKQorICAgIGNpbV92ZWxvY2l0eV9wbG90LmFwcGVuZChjaW0uWFswLCAwXSkKKyAgICBjaW1fdm9sdGFnZV9wbG90LmFwcGVuZChVWzAsIDBdICogMTApCisgICAgY2ltX3RpbWUuYXBwZW5kKHQpCisgIHB5bGFiLnBsb3QoY2ltX3RpbWUsIGNpbV92ZWxvY2l0eV9wbG90LCBsYWJlbD0nY2ltIHNwaW51cCcpCisgIHB5bGFiLnBsb3QoY2ltX3RpbWUsIGNpbV92b2x0YWdlX3Bsb3QsIGxhYmVsPSdjaW0gdm9sdGFnZScpCisgIHB5bGFiLmxlZ2VuZCgpCisgIHB5bGFiLnNob3coKQorCisgICMgVE9ETyhhdXN0aW4pOgorICAjIFNoaWZ0aW5nIGNvbXBlbnNhdGlvbi4KKworICAjIFRpZ2h0ZW4gdGhlIHR1cm4uCisgICMgQ2xvc2VkIGxvb3AgZHJpdmUuCisKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHZsX3Bsb3QsIGxhYmVsPSdsZWZ0IHZlbG9jaXR5JykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHZyX3Bsb3QsIGxhYmVsPSdyaWdodCB2ZWxvY2l0eScpCisgIHB5bGFiLnBsb3QodF9wbG90LCB1bF9wbG90LCBsYWJlbD0nbGVmdCB2b2x0YWdlJykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHVyX3Bsb3QsIGxhYmVsPSdyaWdodCB2b2x0YWdlJykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHJhZGl1c19wbG90LCBsYWJlbD0ncmFkaXVzJykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIGxlZnRfZ2Vhcl9wbG90LCBsYWJlbD0nbGVmdCBnZWFyIGhpZ2gnKQorICBweWxhYi5wbG90KHRfcGxvdCwgcmlnaHRfZ2Vhcl9wbG90LCBsYWJlbD0ncmlnaHQgZ2VhciBoaWdoJykKKyAgcHlsYWIubGVnZW5kKCkKKyAgcHlsYWIuc2hvdygpCisgIHJldHVybiAwCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9wb2x5ZHJpdmV0cmFpbl90ZXN0LnB5IGIvYm90My9jb250cm9sX2xvb3BzL3B5dGhvbi9wb2x5ZHJpdmV0cmFpbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNGNkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvcHl0aG9uL3BvbHlkcml2ZXRyYWluX3Rlc3QucHkKQEAgLTAsMCArMSw4MiBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IHBvbHlkcml2ZXRyYWluCitpbXBvcnQgbnVtcHkKK2Zyb20gbnVtcHkudGVzdGluZyBpbXBvcnQgKgoraW1wb3J0IHBvbHl0b3BlCitpbXBvcnQgdW5pdHRlc3QKKworX19hdXRob3JfXyA9ICdBdXN0aW4gU2NodWggKGF1c3Rpbi5saW51eEBnbWFpbC5jb20pJworCisKK2NsYXNzIFRlc3RWZWxvY2l0eURyaXZldHJhaW4odW5pdHRlc3QuVGVzdENhc2UpOgorICBkZWYgTWFrZUJveChzZWxmLCB4MV9taW4sIHgxX21heCwgeDJfbWluLCB4Ml9tYXgpOgorICAgIEggPSBudW1weS5tYXRyaXgoW1sxLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICBbLTEsIDBdLAorICAgICAgICAgICAgICAgICAgICAgIFswLCAxXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMCwgLTFdXSkKKyAgICBLID0gbnVtcHkubWF0cml4KFtbeDFfbWF4XSwKKyAgICAgICAgICAgICAgICAgICAgICBbLXgxX21pbl0sCisgICAgICAgICAgICAgICAgICAgICAgW3gyX21heF0sCisgICAgICAgICAgICAgICAgICAgICAgWy14Ml9taW5dXSkKKyAgICByZXR1cm4gcG9seXRvcGUuSFBvbHl0b3BlKEgsIEspCisKKyAgZGVmIHRlc3RfY29lcmNlX2luc2lkZShzZWxmKToKKyAgICAiIiJUZXN0cyBjb2VyY2lvbiB3aGVuIHRoZSBwb2ludCBpcyBpbnNpZGUgdGhlIGJveC4iIiIKKyAgICBib3ggPSBzZWxmLk1ha2VCb3goMSwgMiwgMSwgMikKKworICAgICMgeDEgPSB4MgorICAgIEsgPSBudW1weS5tYXRyaXgoW1sxLCAtMV1dKQorICAgIHcgPSAwCisKKyAgICBhc3NlcnRfYXJyYXlfZXF1YWwocG9seWRyaXZldHJhaW4uQ29lcmNlR29hbChib3gsIEssIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcHkubWF0cml4KFtbMS41XSwgWzEuNV1dKSksCisgICAgICAgICAgICAgICAgICAgICAgIG51bXB5Lm1hdHJpeChbWzEuNV0sIFsxLjVdXSkpCisKKyAgZGVmIHRlc3RfY29lcmNlX291dHNpZGVfaW50ZXJzZWN0KHNlbGYpOgorICAgICIiIlRlc3RzIGNvZXJjaW9uIHdoZW4gdGhlIGxpbmUgaW50ZXJzZWN0cyB0aGUgYm94LiIiIgorICAgIGJveCA9IHNlbGYuTWFrZUJveCgxLCAyLCAxLCAyKQorCisgICAgIyB4MSA9IHgyCisgICAgSyA9IG51bXB5Lm1hdHJpeChbWzEsIC0xXV0pCisgICAgdyA9IDAKKworICAgIGFzc2VydF9hcnJheV9lcXVhbChwb2x5ZHJpdmV0cmFpbi5Db2VyY2VHb2FsKGJveCwgSywgdywgbnVtcHkubWF0cml4KFtbNV0sIFs1XV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtcHkubWF0cml4KFtbMi4wXSwgWzIuMF1dKSkKKworICBkZWYgdGVzdF9jb2VyY2Vfb3V0c2lkZV9ub19pbnRlcnNlY3Qoc2VsZik6CisgICAgIiIiVGVzdHMgY29lcmNpb24gd2hlbiB0aGUgbGluZSBkb2VzIG5vdCBpbnRlcnNlY3QgdGhlIGJveC4iIiIKKyAgICBib3ggPSBzZWxmLk1ha2VCb3goMywgNCwgMSwgMikKKworICAgICMgeDEgPSB4MgorICAgIEsgPSBudW1weS5tYXRyaXgoW1sxLCAtMV1dKQorICAgIHcgPSAwCisKKyAgICBhc3NlcnRfYXJyYXlfZXF1YWwocG9seWRyaXZldHJhaW4uQ29lcmNlR29hbChib3gsIEssIHcsIG51bXB5Lm1hdHJpeChbWzVdLCBbNV1dKSksCisgICAgICAgICAgICAgICAgICAgICAgIG51bXB5Lm1hdHJpeChbWzMuMF0sIFsyLjBdXSkpCisKKyAgZGVmIHRlc3RfY29lcmNlX21pZGRsZV9vZl9lZGdlKHNlbGYpOgorICAgICIiIlRlc3RzIGNvZXJjaW9uIHdoZW4gdGhlIGxpbmUgaW50ZXJzZWN0cyB0aGUgbWlkZGxlIG9mIGFuIGVkZ2UuIiIiCisgICAgYm94ID0gc2VsZi5NYWtlQm94KDAsIDQsIDEsIDIpCisKKyAgICAjIHgxID0geDIKKyAgICBLID0gbnVtcHkubWF0cml4KFtbLTEsIDFdXSkKKyAgICB3ID0gMAorCisgICAgYXNzZXJ0X2FycmF5X2VxdWFsKHBvbHlkcml2ZXRyYWluLkNvZXJjZUdvYWwoYm94LCBLLCB3LCBudW1weS5tYXRyaXgoW1s1XSwgWzVdXSkpLAorICAgICAgICAgICAgICAgICAgICAgICBudW1weS5tYXRyaXgoW1syLjBdLCBbMi4wXV0pKQorCisgIGRlZiB0ZXN0X2NvZXJjZV9wZXJwZW5kaWN1bGFyX2xpbmUoc2VsZik6CisgICAgIiIiVGVzdHMgY29lcmNpb24gd2hlbiB0aGUgbGluZSBkb2VzIG5vdCBpbnRlcnNlY3QgYW5kIGlzIGluIHF1YWRyYW50IDIuIiIiCisgICAgYm94ID0gc2VsZi5NYWtlQm94KDEsIDIsIDEsIDIpCisKKyAgICAjIHgxID0gLXgyCisgICAgSyA9IG51bXB5Lm1hdHJpeChbWzEsIDFdXSkKKyAgICB3ID0gMAorCisgICAgYXNzZXJ0X2FycmF5X2VxdWFsKHBvbHlkcml2ZXRyYWluLkNvZXJjZUdvYWwoYm94LCBLLCB3LCBudW1weS5tYXRyaXgoW1s1XSwgWzVdXSkpLAorICAgICAgICAgICAgICAgICAgICAgICBudW1weS5tYXRyaXgoW1sxLjBdLCBbMS4wXV0pKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYm90My9jb250cm9sX2xvb3BzL3VwZGF0ZV9kcml2ZXRyYWluLnNoIGIvYm90My9jb250cm9sX2xvb3BzL3VwZGF0ZV9kcml2ZXRyYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OWNiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2NvbnRyb2xfbG9vcHMvdXBkYXRlX2RyaXZldHJhaW4uc2gKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVXBkYXRlcyB0aGUgZHJpdmV0cmFpbiBjb250cm9sbGVycy4KKworY2QgJChkaXJuYW1lICQwKQorCisuL3B5dGhvbi9kcml2ZXRyYWluLnB5IGRyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaCBcCisgICAgZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYyBcCisgICAgZHJpdmV0cmFpbi9kcml2ZXRyYWluX2NsdXRjaF9tb3Rvcl9wbGFudC5oIFwKKyAgICBkcml2ZXRyYWluL2RyaXZldHJhaW5fY2x1dGNoX21vdG9yX3BsYW50LmNjCmRpZmYgLS1naXQgYS9ib3QzL2NvbnRyb2xfbG9vcHMvdXBkYXRlX3BvbHlkcml2ZXRyYWluLnNoIGIvYm90My9jb250cm9sX2xvb3BzL3VwZGF0ZV9wb2x5ZHJpdmV0cmFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzk4N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvYm90My9jb250cm9sX2xvb3BzL3VwZGF0ZV9wb2x5ZHJpdmV0cmFpbi5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vYmFzaAorIworIyBVcGRhdGVzIHRoZSBwb2x5ZHJpdmV0cmFpbiBjb250cm9sbGVycyBhbmQgQ0lNIG1vZGVscy4KKworY2QgJChkaXJuYW1lICQwKQorCisuL3B5dGhvbi9wb2x5ZHJpdmV0cmFpbi5weSBkcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIFwKKyAgICBkcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYyBcCisgICAgZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jbHV0Y2hfbW90b3JfcGxhbnQuaCBcCisgICAgZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jbHV0Y2hfbW90b3JfcGxhbnQuY2MgXAorICAgIGRyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmggXAorICAgIGRyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjCmRpZmYgLS1naXQgYS9ib3QzL2pveXN0aWNrX3JlYWRlci5jYyBiL2JvdDMvam95c3RpY2tfcmVhZGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2YzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL2pveXN0aWNrX3JlYWRlci5jYwpAQCAtMCwwICsxLDE0OCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorI2luY2x1ZGUgImFvcy9wcmltZS9pbnB1dC9qb3lzdGlja19pbnB1dC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vaW5wdXQvZHJpdmVyX3N0YXRpb25fZGF0YS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL2xvZ19pbnRlcnZhbC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmgiCisKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvcXVldWVzL2d5cm8ucS5oIgorI2luY2x1ZGUgImJvdDMvYXV0b25vbW91cy9hdXRvLnEuaCIKKwordXNpbmcgOjpib3QzOjpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlOwordXNpbmcgOjpmcmM5NzE6OnNlbnNvcnM6Omd5cm9fcmVhZGluZzsKKwordXNpbmcgOjphb3M6OmlucHV0Ojpkcml2ZXJfc3RhdGlvbjo6QnV0dG9uTG9jYXRpb247Cit1c2luZyA6OmFvczo6aW5wdXQ6OmRyaXZlcl9zdGF0aW9uOjpQT1ZMb2NhdGlvbjsKK3VzaW5nIDo6YW9zOjppbnB1dDo6ZHJpdmVyX3N0YXRpb246OkpveXN0aWNrQXhpczsKK3VzaW5nIDo6YW9zOjppbnB1dDo6ZHJpdmVyX3N0YXRpb246OkNvbnRyb2xCaXQ7CisKK25hbWVzcGFjZSBib3QzIHsKK25hbWVzcGFjZSBpbnB1dCB7CituYW1lc3BhY2Ugam95c3RpY2tzIHsKKworY29uc3QgSm95c3RpY2tBeGlzIGtTdGVlcmluZ1doZWVsKDEsIDEpLCBrRHJpdmVUaHJvdHRsZSgyLCAyKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtTaGlmdEhpZ2goMiwgMSksIGtTaGlmdExvdygyLCAzKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtRdWlja1R1cm4oMSwgNSk7CisKKy8vIFRPRE8oY29tcmFuKTogRmlndXJlIG91dCB0aGUgYWN0aW9ucyB3ZSBuZWVkLgorCitjbGFzcyBSZWFkZXIgOiBwdWJsaWMgOjphb3M6OmlucHV0OjpKb3lzdGlja0lucHV0IHsKKyBwdWJsaWM6CisgIFJlYWRlcigpIDogd2FzX3J1bm5pbmdfKGZhbHNlKSB7fQorCisgIHZpcnR1YWwgdm9pZCBSdW5JdGVyYXRpb24oY29uc3QgOjphb3M6OmlucHV0Ojpkcml2ZXJfc3RhdGlvbjo6RGF0YSAmZGF0YSkgeworICAgIGJvb2wgbGFzdF9hdXRvX3J1bm5pbmcgPSBhdXRvX3J1bm5pbmdfOworICAgIGF1dG9fcnVubmluZ18gPSBkYXRhLkdldENvbnRyb2xCaXQoQ29udHJvbEJpdDo6a0F1dG9ub21vdXMpICYmCisgICAgICAgICAgICAgICAgICAgIGRhdGEuR2V0Q29udHJvbEJpdChDb250cm9sQml0OjprRW5hYmxlZCk7CisgICAgaWYgKGF1dG9fcnVubmluZ18gIT0gbGFzdF9hdXRvX3J1bm5pbmcpIHsKKyAgICAgIGlmIChhdXRvX3J1bm5pbmdfKSB7CisgICAgICAgIFN0YXJ0QXV0bygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU3RvcEF1dG8oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRhdGEuR2V0Q29udHJvbEJpdChDb250cm9sQml0OjprQXV0b25vbW91cykpIHsKKyAgICAgIEhhbmRsZURyaXZldHJhaW4oZGF0YSk7CisgICAgICBIYW5kbGVUZWxlb3AoZGF0YSk7CisgICAgfQorICB9CisKKyAgdm9pZCBIYW5kbGVEcml2ZXRyYWluKGNvbnN0IDo6YW9zOjppbnB1dDo6ZHJpdmVyX3N0YXRpb246OkRhdGEgJmRhdGEpIHsKKyAgICBjb25zdCBkb3VibGUgd2hlZWwgPSAtZGF0YS5HZXRBeGlzKGtTdGVlcmluZ1doZWVsKTsKKyAgICBjb25zdCBkb3VibGUgdGhyb3R0bGUgPSAtZGF0YS5HZXRBeGlzKGtEcml2ZVRocm90dGxlKTsKKworICAgIGlmICghZHJpdmV0cmFpbl9xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgLnN0ZWVyaW5nKHdoZWVsKQorICAgICAgICAgICAgIC50aHJvdHRsZSh0aHJvdHRsZSkKKyAgICAgICAgICAgICAucXVpY2t0dXJuKGRhdGEuSXNQcmVzc2VkKGtRdWlja1R1cm4pKQorICAgICAgICAgICAgIC5jb250cm9sX2xvb3BfZHJpdmluZyhmYWxzZSkKKyAgICAgICAgICAgICAuU2VuZCgpKSB7CisgICAgICBMT0coV0FSTklORywgInNlbmRpbmcgc3RpY2sgdmFsdWVzIGZhaWxlZFxuIik7CisgICAgfQorICB9CisKKyAgdm9pZCBIYW5kbGVUZWxlb3AoY29uc3QgOjphb3M6OmlucHV0Ojpkcml2ZXJfc3RhdGlvbjo6RGF0YSAmZGF0YSkgeworICAgIGlmICghZGF0YS5HZXRDb250cm9sQml0KENvbnRyb2xCaXQ6OmtFbmFibGVkKSkgeworICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgIH0KKworICAgIC8vIFRPRE8oY29tcmFuKTogUnVuIHN0dWZmIHdoZW4gYnV0dG9ucyBhcmUgcHVzaGVkLgorCisgICAgLy8gVE9ETyhjb21yYW4pOiBJZiBpdCBjYW5ub3QgZ2V0IGEgc3RhdHVzIGZyb20gdGhlIHN1cGVyc3RydWN0dXJlLi4uCisgICAgLyoKKyAgICBpZiAoIXN1cGVyc3RydWN0dXJlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgICAgTE9HKEVSUk9SLCAiR290IG5vIHN1cGVyc3RydWN0dXJlIHN0YXR1cyBwYWNrZXQuXG4iKTsKKyAgICB9CisgICAgKi8KKworICAgIC8vIFRPRE8oY29tcmFuKTogSWYgZXZlcnl0aGluZyBsb29rcyBnb29kLCBzdGFydCB0ZWxlb3AuCisgICAgLyppZiAoc3VwZXJzdHJ1Y3R1cmVfcXVldWUuc3RhdHVzLmdldCgpICYmIHN1cGVyc3RydWN0dXJlX3F1ZXVlLnN0YXR1cy0+emVyb2VkKSB7CisgICAgICBpZiAod2FpdGluZ19mb3JfemVyb18pIHsKKyAgICAgICAgTE9HKElORk8sICJaZXJvZWQhIFN0YXJ0aW5nIHRlbGVvcCBtb2RlLlxuIik7CisgICAgICAgIHdhaXRpbmdfZm9yX3plcm9fID0gZmFsc2U7CisKKyAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIGdvYWxzIHRvIHdoZXJlIHdlIGFyZSBub3cuCisgICAgICAgIHN1cGVyc3RydWN0dXJlX2dvYWxfID0gMC4wOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB3YWl0aW5nX2Zvcl96ZXJvXyA9IHRydWU7CisgICAgfSovCisKKyAgICBpZiAoIXdhaXRpbmdfZm9yX3plcm9fKSB7CisgICAgICBpZiAoIWFjdGlvbl9xdWV1ZV8uUnVubmluZygpKSB7CisgICAgICAgIC8vIFRPRE8oY29tcmFuKTogU2VuZCBzb21lIGdvYWxzLgorICAgICAgfQorICAgIH0KKworICAgIGlmIChhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKSkgeworICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgYW4gYWN0aW9uLCB1cGRhdGUgb3VyIGdvYWxzIHRvIHRoZSBjdXJyZW50IGdvYWxzLgorICAgICAgLy8gVE9ETyhjb21yYW4pOiBEbyB0aGlzIGZvciBlYWNoIHN1cGVyc3RydWN0dXJlIHF1ZXVlLgorICAgIH0KKyAgICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgICB3YXNfcnVubmluZ18gPSBhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBTdGFydEF1dG8oKSB7CisgICAgTE9HKElORk8sICJTdGFydGluZyBhdXRvIG1vZGVcbiIpOworICAgIDo6Ym90Mzo6YXV0b25vbW91czo6YXV0b25vbW91cy5NYWtlV2l0aEJ1aWxkZXIoKS5ydW5fYXV0byh0cnVlKS5TZW5kKCk7CisgIH0KKworICB2b2lkIFN0b3BBdXRvKCkgeworICAgIExPRyhJTkZPLCAiU3RvcHBpbmcgYXV0byBtb2RlXG4iKTsKKyAgICA6OmJvdDM6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuTWFrZVdpdGhCdWlsZGVyKCkucnVuX2F1dG8oZmFsc2UpLlNlbmQoKTsKKyAgfQorCisgIGJvb2wgd2FzX3J1bm5pbmdfOworCisgIC8vIElmIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBzdWJzeXN0ZW1zIHRvIHplcm8uCisgIGJvb2wgd2FpdGluZ19mb3JfemVyb18gPSB0cnVlOworCisgIGJvb2wgYXV0b19ydW5uaW5nXyA9IGZhbHNlOworCisgIDo6YW9zOjpjb21tb246OmFjdGlvbnM6OkFjdGlvblF1ZXVlIGFjdGlvbl9xdWV1ZV87CisKKyAgOjphb3M6OnV0aWw6OlNpbXBsZUxvZ0ludGVydmFsIG5vX2RyaXZldHJhaW5fc3RhdHVzXyA9CisgICAgICA6OmFvczo6dXRpbDo6U2ltcGxlTG9nSW50ZXJ2YWwoOjphb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjIpLCBXQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBkcml2ZXRyYWluIHN0YXR1cyIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGpveXN0aWNrcworfSAgLy8gbmFtZXNwYWNlIGlucHV0Cit9ICAvLyBuYW1lc3BhY2UgYm90MworCitpbnQgbWFpbigpIHsKKyAgOjphb3M6OkluaXQoKTsKKyAgOjpib3QzOjppbnB1dDo6am95c3RpY2tzOjpSZWFkZXIgcmVhZGVyOworICByZWFkZXIuUnVuKCk7CisgIDo6YW9zOjpDbGVhbnVwKCk7Cit9CmRpZmYgLS1naXQgYS9ib3QzL3ByaW1lL2J1aWxkLnNoIGIvYm90My9wcmltZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTg2NTkwCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9wcmltZS9idWlsZC5zaApAQCAtMCwwICsxLDUgQEAKKyMhL2Jpbi9iYXNoCisKK2NkICQoZGlybmFtZSAkMCkKKworZXhlYyAuLi8uLi9hb3MvYnVpbGQvYnVpbGQucHkgJDAgcHJpbWUgYm90MyBwcmltZS5neXAgIiRAIgpkaWZmIC0tZ2l0IGEvYm90My9wcmltZS9wcmltZS5neXAgYi9ib3QzL3ByaW1lL3ByaW1lLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGEwZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYm90My9wcmltZS9wcmltZS5neXAKQEAgLTAsMCArMSw0MCBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnQWxsJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3NfYWxsLmd5cDpQcmltZScsCisKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3BfdGVzdCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpwb3NpdGlvbl9zZW5zb3Jfc2ltX3Rlc3QnLAorICAgICAgICAnLi4vY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uZ3lwOmRyaXZldHJhaW5fYm90MycsCisgICAgICAgICcuLi9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXA6ZHJpdmV0cmFpbl9saWJfdGVzdF9ib3QzJywKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpyZXBsYXlfZHJpdmV0cmFpbl9ib3QzJywKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZS5neXA6aW50YWtlJywKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvaW50YWtlL2ludGFrZS5neXA6aW50YWtlX2xpYl90ZXN0JywKKyAgICAgICAgIycuLi9hdXRvbm9tb3VzL2F1dG9ub21vdXMuZ3lwOmF1dG9fYm90MycsCisgICAgICAgICcuLi9ib3QzLmd5cDpqb3lzdGlja19yZWFkZXJfYm90MycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvemVyb2luZy96ZXJvaW5nLmd5cDp6ZXJvaW5nX3Rlc3QnLAorICAgICAgICAjJy4uL2h0dHBfc3RhdHVzL2h0dHBfc3RhdHVzLmd5cDpodHRwX3N0YXR1cycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy92b2x0YWdlX2NhcC92b2x0YWdlX2NhcC5neXA6dm9sdGFnZV9jYXBfdGVzdCcsCisgICAgICAgICcuLi9hY3RvcnMvYWN0b3JzLmd5cDpiaW5hcmllcycsCisgICAgICBdLAorICAgICAgJ2NvcGllcyc6IFsKKyAgICAgICAgeworICAgICAgICAgICdkZXN0aW5hdGlvbic6ICc8KHJzeW5jX2RpciknLAorICAgICAgICAgICdmaWxlcyc6IFsKKyAgICAgICAgICAgICdzdGFydF9saXN0LnR4dCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgIF0sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydBUkNISVRFQ1RVUkU9PSJhcm1fZnJjIicsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJy4uL3dwaWxpYi93cGlsaWIuZ3lwOndwaWxpYl9pbnRlcmZhY2VfYm90MycsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9ib3QzL3ByaW1lL3N0YXJ0X2xpc3QudHh0IGIvYm90My9wcmltZS9zdGFydF9saXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTA1OTVhCi0tLSAvZGV2L251bGwKKysrIGIvYm90My9wcmltZS9zdGFydF9saXN0LnR4dApAQCAtMCwwICsxLDcgQEAKK2pveXN0aWNrX3JlYWRlcl9ib3QzCit3cGlsaWJfaW50ZXJmYWNlX2JvdDMKK2JpbmFyeV9sb2dfd3JpdGVyCitkcml2ZXRyYWluX2JvdDMKK2F1dG9fYm90MworZHJpdmV0cmFpbl9hY3Rpb25fYm90MworaHR0cF9zdGF0dXNfYm90MwpkaWZmIC0tZ2l0IGEvYm90My93cGlsaWIvd3BpbGliLmd5cCBiL2JvdDMvd3BpbGliL3dwaWxpYi5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExZjZjZAotLS0gL2Rldi9udWxsCisrKyBiL2JvdDMvd3BpbGliL3dwaWxpYi5neXAKQEAgLTAsMCArMSwzNiBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnd3BpbGliX2ludGVyZmFjZV9ib3QzJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICd3cGlsaWJfaW50ZXJmYWNlLmNjJworICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpzdGxfbXV0ZXgnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEVYVEVSTkFMUyk6V1BJTGliJywKKyAgICAgICAgJzwoREVQVEgpL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uZ3lwOmRyaXZldHJhaW5fcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpsb2dfaW50ZXJ2YWwnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9tZXNzYWdlcy9tZXNzYWdlcy5neXA6cm9ib3Rfc3RhdGUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnBoYXNlZF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbWVzc2FnZXMvbWVzc2FnZXMuZ3lwOnJvYm90X3N0YXRlJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDpoYWxsX2VmZmVjdCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6am95c3RpY2tfc2VuZGVyJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDpsb29wX291dHB1dF9oYW5kbGVyJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDpidWZmZXJlZF9wY20nLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmd5cm9fc2VuZGVyJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDpkbWFfZWRnZV9jb3VudGluZycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6aW50ZXJydXB0X2VkZ2VfY291bnRpbmcnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmVuY29kZXJfYW5kX3BvdGVudGlvbWV0ZXInLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6cXVldWVzJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDpsb2dnaW5nX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL2JvdDMvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uZ3lwOmRyaXZldHJhaW5fbGliJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL2JvdDMvd3BpbGliL3dwaWxpYl9pbnRlcmZhY2UuY2MgYi9ib3QzL3dwaWxpYi93cGlsaWJfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmU4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9ib3QzL3dwaWxpYi93cGlsaWJfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMzYzIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL2xvZ19pbnRlcnZhbC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC93cmFwcGluZ19jb3VudGVyLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9zdGxfbXV0ZXguaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tZXNzYWdlcy9yb2JvdF9zdGF0ZS5xLmgiCisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEuaCIKKyNpbmNsdWRlICJib3QzL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKworI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvaGFsbF9lZmZlY3QuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2pveXN0aWNrX3NlbmRlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvbG9vcF9vdXRwdXRfaGFuZGxlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYnVmZmVyZWRfc29sZW5vaWQuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3BjbS5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvZ3lyb19zZW5kZXIuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmgiCisjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9pbnRlcnJ1cHRfZWRnZV9jb3VudGluZy5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvbG9nZ2luZy5xLmgiCisjaW5jbHVkZSAiYm90My9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5oIgorCisjaW5jbHVkZSAiRW5jb2Rlci5oIgorI2luY2x1ZGUgIlRhbG9uLmgiCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisjaW5jbHVkZSAiQ29tcHJlc3Nvci5oIgorI2luY2x1ZGUgIlJlbGF5LmgiCisjaW5jbHVkZSAiUm9ib3RCYXNlLmgiCisjaW5jbHVkZSAiZG1hLmgiCisjaW5jbHVkZSAiQ29udHJvbGxlclBvd2VyLmgiCisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCit1c2luZyA6OmFvczo6dXRpbDo6U2ltcGxlTG9nSW50ZXJ2YWw7Cit1c2luZyA6OmJvdDM6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWU7Cit1c2luZyA6OmZyYzk3MTo6d3BpbGliOjpETUFFbmNvZGVyQW5kUG90ZW50aW9tZXRlcjsKK3VzaW5nIDo6ZnJjOTcxOjpQb3RBbmRJbmRleFBvc2l0aW9uOwordXNpbmcgOjpmcmM5NzE6OndwaWxpYjo6SW50ZXJydXB0RW5jb2RlckFuZFBvdGVudGlvbWV0ZXI7Cit1c2luZyA6OmZyYzk3MTo6d3BpbGliOjpETUFTeW5jaHJvbml6ZXI7Cit1c2luZyA6OmZyYzk3MTo6d3BpbGliOjpCdWZmZXJlZFBjbTsKK3VzaW5nIDo6ZnJjOTcxOjp3cGlsaWI6Okxvb3BPdXRwdXRIYW5kbGVyOwordXNpbmcgOjpmcmM5NzE6OndwaWxpYjo6Sm95c3RpY2tTZW5kZXI7Cit1c2luZyA6OmZyYzk3MTo6d3BpbGliOjpHeXJvU2VuZGVyOworCituYW1lc3BhY2UgYm90MyB7CituYW1lc3BhY2Ugd3BpbGliIHsKKworZG91YmxlIGRyaXZldHJhaW5fdHJhbnNsYXRlKGludDMyX3QgaW4pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oaW4pIC8KKyAgICAgICAgICgyNTYuMCAvKmNwciovICogNC4wIC8qNHgqLykgKgorICAgICAgICAgOjpib3QzOjpjb250cm9sX2xvb3BzOjprRHJpdmV0cmFpbkVuY29kZXJSYXRpbyAqCisgICAgICAgICAoNCAvKndoZWVsIGRpYW1ldGVyKi8gKiAyLjU0IC8gMTAwLjAgKiBNX1BJKTsKK30KKworLy8gVE9ETyhjb21yYW4pOiBDaGVjay91cGRhdGUgdGhlIHZhbHVlcyBiZWxvdyBmb3IgdGhlIGJvdDMuCitzdGF0aWMgY29uc3QgZG91YmxlIGtNYXhpbXVtRW5jb2RlclB1bHNlc1BlclNlY29uZCA9CisgICAgMTk1MDAuMCAvKiBmcmVlIHNwZWVkIFJQTSAqLyAqIDEyLjAgLyA1Ni4wIC8qIGJlbHQgcmVkdWN0aW9uICovIC8KKyAgICA2MC4wIC8qIHNlY29uZHMgLyBtaW51dGUgKi8gKiAyNTYuMCAvKiBDUFIgKi8gKgorICAgIDQuMCAvKiBpbmRleCBwdWxzZSA9IDEvNCBjeWNsZSAqLzsKKworY2xhc3MgU2Vuc29yUmVhZGVyIHsKKyBwdWJsaWM6CisgIFNlbnNvclJlYWRlcigpIHsKKyAgICAvLyBTZXQgaXQgdG8gZmlsdGVyIG91dCBhbnl0aGluZyBzaG9ydGVyIHRoYW4gMS80IG9mIHRoZSBtaW5pbXVtIHB1bHNlIHdpZHRoCisgICAgLy8gd2Ugc2hvdWxkIGV2ZXIgc2VlLgorICAgIGZpbHRlcl8uU2V0UGVyaW9kTmFub1NlY29uZHMoCisgICAgICAgIHN0YXRpY19jYXN0PGludD4oMSAvIDQuMCAvIGtNYXhpbXVtRW5jb2RlclB1bHNlc1BlclNlY29uZCAqIDFlOSArIDAuNSkpOworICB9CisKKyAgdm9pZCBzZXRfbGVmdF9lbmNvZGVyKDo6c3RkOjp1bmlxdWVfcHRyPEVuY29kZXI+IGxlZnRfZW5jb2RlcikgeworICAgIGxlZnRfZW5jb2Rlcl8gPSA6OnN0ZDo6bW92ZShsZWZ0X2VuY29kZXIpOworICB9CisKKyAgdm9pZCBzZXRfcmlnaHRfZW5jb2Rlcig6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiByaWdodF9lbmNvZGVyKSB7CisgICAgcmlnaHRfZW5jb2Rlcl8gPSA6OnN0ZDo6bW92ZShyaWdodF9lbmNvZGVyKTsKKyAgfQorCisgIC8vIEFsbCBvZiB0aGUgRE1BLXJlbGF0ZWQgc2V0XyogY2FsbHMgbXVzdCBiZSBtYWRlIGJlZm9yZSB0aGlzLCBhbmQgaXQgZG9lc24ndAorICAvLyBodXJ0IHRvIGRvIGFsbCBvZiB0aGVtLgorICAvLyBUT0RPKGNvbXJhbik6IERvIHdlIHN0aWxsIG5lZWQgZG1hPworICB2b2lkIHNldF9kbWEoOjpzdGQ6OnVuaXF1ZV9wdHI8RE1BPiBkbWEpIHsKKyAgICBkbWFfc3luY2hyb25pemVyXy5yZXNldChuZXcgRE1BU3luY2hyb25pemVyKDo6c3RkOjptb3ZlKGRtYSkpKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IoKSgpIHsKKyAgICBMT0coSU5GTywgIkluIHNlbnNvciByZWFkZXIgdGhyZWFkXG4iKTsKKyAgICA6OmFvczo6U2V0Q3VycmVudFRocmVhZE5hbWUoIlNlbnNvclJlYWRlciIpOworCisgICAgbXlfcGlkXyA9IGdldHBpZCgpOworICAgIGRzXyA9IERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCk7CisKKyAgICBkbWFfc3luY2hyb25pemVyXy0+U3RhcnQoKTsKKyAgICBMT0coSU5GTywgIlRoaW5ncyBhcmUgbm93IHN0YXJ0ZWRcbiIpOworCisgICAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWRSZWFsdGltZVByaW9yaXR5KGtQcmlvcml0eSk7CisgICAgd2hpbGUgKHJ1bl8pIHsKKyAgICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKDUsIDQwMDApOworICAgICAgUnVuSXRlcmF0aW9uKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBSdW5JdGVyYXRpb24oKSB7CisgICAgeworICAgICAgYXV0byBuZXdfc3RhdGUgPSA6OmFvczo6cm9ib3Rfc3RhdGUuTWFrZU1lc3NhZ2UoKTsKKworICAgICAgbmV3X3N0YXRlLT5yZWFkZXJfcGlkID0gbXlfcGlkXzsKKyAgICAgIG5ld19zdGF0ZS0+b3V0cHV0c19lbmFibGVkID0gZHNfLT5Jc1N5c0FjdGl2ZSgpOworICAgICAgbmV3X3N0YXRlLT5icm93bmVkX291dCA9IGRzXy0+SXNTeXNCcm93bmVkT3V0KCk7CisKKyAgICAgIG5ld19zdGF0ZS0+aXNfM3YzX2FjdGl2ZSA9IENvbnRyb2xsZXJQb3dlcjo6R2V0RW5hYmxlZDNWMygpOworICAgICAgbmV3X3N0YXRlLT5pc181dl9hY3RpdmUgPSBDb250cm9sbGVyUG93ZXI6OkdldEVuYWJsZWQ1VigpOworICAgICAgbmV3X3N0YXRlLT52b2x0YWdlXzN2MyA9IENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTNWMygpOworICAgICAgbmV3X3N0YXRlLT52b2x0YWdlXzV2ID0gQ29udHJvbGxlclBvd2VyOjpHZXRWb2x0YWdlNVYoKTsKKworICAgICAgbmV3X3N0YXRlLT52b2x0YWdlX3JvYm9yaW9faW4gPSBDb250cm9sbGVyUG93ZXI6OkdldElucHV0Vm9sdGFnZSgpOworICAgICAgbmV3X3N0YXRlLT52b2x0YWdlX2JhdHRlcnkgPSBkc18tPkdldEJhdHRlcnlWb2x0YWdlKCk7CisKKyAgICAgIExPR19TVFJVQ1QoREVCVUcsICJyb2JvdF9zdGF0ZSIsICpuZXdfc3RhdGUpOworCisgICAgICBuZXdfc3RhdGUuU2VuZCgpOworICAgIH0KKworICAgIHsKKyAgICAgIGF1dG8gZHJpdmV0cmFpbl9tZXNzYWdlID0gZHJpdmV0cmFpbl9xdWV1ZS5wb3NpdGlvbi5NYWtlTWVzc2FnZSgpOworICAgICAgZHJpdmV0cmFpbl9tZXNzYWdlLT5yaWdodF9lbmNvZGVyID0KKyAgICAgICAgICAtZHJpdmV0cmFpbl90cmFuc2xhdGUocmlnaHRfZW5jb2Rlcl8tPkdldFJhdygpKTsKKyAgICAgIGRyaXZldHJhaW5fbWVzc2FnZS0+bGVmdF9lbmNvZGVyID0KKyAgICAgICAgICBkcml2ZXRyYWluX3RyYW5zbGF0ZShsZWZ0X2VuY29kZXJfLT5HZXRSYXcoKSk7CisKKyAgICAgIGRyaXZldHJhaW5fbWVzc2FnZS5TZW5kKCk7CisgICAgfQorCisgICAgZG1hX3N5bmNocm9uaXplcl8tPlJ1bkl0ZXJhdGlvbigpOworICB9CisKKyAgdm9pZCBRdWl0KCkgeyBydW5fID0gZmFsc2U7IH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBpbnQga1ByaW9yaXR5ID0gMzA7CisgIHN0YXRpYyBjb25zdCBpbnQga0ludGVycnVwdFByaW9yaXR5ID0gNTU7CisKKyAgaW50MzJfdCBteV9waWRfOworICBEcml2ZXJTdGF0aW9uICpkc187CisKKyAgdm9pZCBDb3B5UG90QW5kSW5kZXhQb3NpdGlvbigKKyAgICAgIGNvbnN0IERNQUVuY29kZXJBbmRQb3RlbnRpb21ldGVyICZlbmNvZGVyLCBQb3RBbmRJbmRleFBvc2l0aW9uICpwb3NpdGlvbiwKKyAgICAgIDo6c3RkOjpmdW5jdGlvbjxkb3VibGUoaW50MzJfdCk+IGVuY29kZXJfdHJhbnNsYXRlLAorICAgICAgOjpzdGQ6OmZ1bmN0aW9uPGRvdWJsZShkb3VibGUpPiBwb3RlbnRpb21ldGVyX3RyYW5zbGF0ZSwgYm9vbCByZXZlcnNlLAorICAgICAgZG91YmxlIHBvdGVudGlvbWV0ZXJfb2Zmc2V0KSB7CisgICAgY29uc3QgZG91YmxlIG11bHRpcGxpZXIgPSByZXZlcnNlID8gLTEuMCA6IDEuMDsKKyAgICBwb3NpdGlvbi0+ZW5jb2RlciA9CisgICAgICAgIG11bHRpcGxpZXIgKiBlbmNvZGVyX3RyYW5zbGF0ZShlbmNvZGVyLnBvbGxlZF9lbmNvZGVyX3ZhbHVlKCkpOworICAgIHBvc2l0aW9uLT5wb3QgPSBtdWx0aXBsaWVyICogcG90ZW50aW9tZXRlcl90cmFuc2xhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5wb2xsZWRfcG90ZW50aW9tZXRlcl92b2x0YWdlKCkpICsKKyAgICAgICAgICAgICAgICAgICAgcG90ZW50aW9tZXRlcl9vZmZzZXQ7CisgICAgcG9zaXRpb24tPmxhdGNoZWRfZW5jb2RlciA9CisgICAgICAgIG11bHRpcGxpZXIgKiBlbmNvZGVyX3RyYW5zbGF0ZShlbmNvZGVyLmxhc3RfZW5jb2Rlcl92YWx1ZSgpKTsKKyAgICBwb3NpdGlvbi0+bGF0Y2hlZF9wb3QgPQorICAgICAgICBtdWx0aXBsaWVyICoKKyAgICAgICAgICAgIHBvdGVudGlvbWV0ZXJfdHJhbnNsYXRlKGVuY29kZXIubGFzdF9wb3RlbnRpb21ldGVyX3ZvbHRhZ2UoKSkgKworICAgICAgICBwb3RlbnRpb21ldGVyX29mZnNldDsKKyAgICBwb3NpdGlvbi0+aW5kZXhfcHVsc2VzID0gZW5jb2Rlci5pbmRleF9wb3NlZGdlX2NvdW50KCk7CisgIH0KKworICB2b2lkIENvcHlQb3RBbmRJbmRleFBvc2l0aW9uKAorICAgICAgY29uc3QgSW50ZXJydXB0RW5jb2RlckFuZFBvdGVudGlvbWV0ZXIgJmVuY29kZXIsCisgICAgICBQb3RBbmRJbmRleFBvc2l0aW9uICpwb3NpdGlvbiwKKyAgICAgIDo6c3RkOjpmdW5jdGlvbjxkb3VibGUoaW50MzJfdCk+IGVuY29kZXJfdHJhbnNsYXRlLAorICAgICAgOjpzdGQ6OmZ1bmN0aW9uPGRvdWJsZShkb3VibGUpPiBwb3RlbnRpb21ldGVyX3RyYW5zbGF0ZSwgYm9vbCByZXZlcnNlLAorICAgICAgZG91YmxlIHBvdGVudGlvbWV0ZXJfb2Zmc2V0KSB7CisgICAgY29uc3QgZG91YmxlIG11bHRpcGxpZXIgPSByZXZlcnNlID8gLTEuMCA6IDEuMDsKKyAgICBwb3NpdGlvbi0+ZW5jb2RlciA9CisgICAgICAgIG11bHRpcGxpZXIgKiBlbmNvZGVyX3RyYW5zbGF0ZShlbmNvZGVyLmVuY29kZXIoKS0+R2V0UmF3KCkpOworICAgIHBvc2l0aW9uLT5wb3QgPSBtdWx0aXBsaWVyICogcG90ZW50aW9tZXRlcl90cmFuc2xhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5wb3RlbnRpb21ldGVyKCktPkdldFZvbHRhZ2UoKSkgKworICAgICAgICAgICAgICAgICAgICBwb3RlbnRpb21ldGVyX29mZnNldDsKKyAgICBwb3NpdGlvbi0+bGF0Y2hlZF9lbmNvZGVyID0KKyAgICAgICAgbXVsdGlwbGllciAqIGVuY29kZXJfdHJhbnNsYXRlKGVuY29kZXIubGFzdF9lbmNvZGVyX3ZhbHVlKCkpOworICAgIHBvc2l0aW9uLT5sYXRjaGVkX3BvdCA9CisgICAgICAgIG11bHRpcGxpZXIgKgorICAgICAgICAgICAgcG90ZW50aW9tZXRlcl90cmFuc2xhdGUoZW5jb2Rlci5sYXN0X3BvdGVudGlvbWV0ZXJfdm9sdGFnZSgpKSArCisgICAgICAgIHBvdGVudGlvbWV0ZXJfb2Zmc2V0OworICAgIHBvc2l0aW9uLT5pbmRleF9wdWxzZXMgPSBlbmNvZGVyLmluZGV4X3Bvc2VkZ2VfY291bnQoKTsKKyAgfQorCisgIDo6c3RkOjp1bmlxdWVfcHRyPERNQVN5bmNocm9uaXplcj4gZG1hX3N5bmNocm9uaXplcl87CisKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gbGVmdF9lbmNvZGVyXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gcmlnaHRfZW5jb2Rlcl87CisKKyAgOjpzdGQ6OmF0b21pYzxib29sPiBydW5fe3RydWV9OworICBEaWdpdGFsR2xpdGNoRmlsdGVyIGZpbHRlcl87Cit9OworCitjbGFzcyBTb2xlbm9pZFdyaXRlciB7CisgcHVibGljOgorICBTb2xlbm9pZFdyaXRlcihjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjw6OmZyYzk3MTo6d3BpbGliOjpCdWZmZXJlZFBjbT4gJnBjbSkKKyAgICAgIDogcGNtXyhwY20pIHt9CisKKyAgdm9pZCBzZXRfcHJlc3N1cmVfc3dpdGNoKDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IHByZXNzdXJlX3N3aXRjaCkgeworICAgIHByZXNzdXJlX3N3aXRjaF8gPSA6OnN0ZDo6bW92ZShwcmVzc3VyZV9zd2l0Y2gpOworICB9CisKKyAgdm9pZCBzZXRfY29tcHJlc3Nvcl9yZWxheSg6OnN0ZDo6dW5pcXVlX3B0cjxSZWxheT4gY29tcHJlc3Nvcl9yZWxheSkgeworICAgIGNvbXByZXNzb3JfcmVsYXlfID0gOjpzdGQ6Om1vdmUoY29tcHJlc3Nvcl9yZWxheSk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkoKSB7CisgICAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWROYW1lKCJTb2xlbm9pZHMiKTsKKyAgICA6OmFvczo6U2V0Q3VycmVudFRocmVhZFJlYWx0aW1lUHJpb3JpdHkoMzApOworCisgICAgd2hpbGUgKHJ1bl8pIHsKKyAgICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKDIwLCAxMDAwKTsKKworICAgICAgOjphb3M6OmpveXN0aWNrX3N0YXRlLkZldGNoTGF0ZXN0KCk7CisKKyAgICAgIHsKKyAgICAgICAgOjpmcmM5NzE6OndwaWxpYjo6UG5ldW1hdGljc1RvTG9nIHRvX2xvZzsKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGJvb2wgY29tcHJlc3Nvcl9vbiA9ICFwcmVzc3VyZV9zd2l0Y2hfLT5HZXQoKTsKKyAgICAgICAgICB0b19sb2cuY29tcHJlc3Nvcl9vbiA9IGNvbXByZXNzb3Jfb247CisgICAgICAgICAgaWYgKGNvbXByZXNzb3Jfb24pIHsKKyAgICAgICAgICAgIGNvbXByZXNzb3JfcmVsYXlfLT5TZXQoUmVsYXk6OmtGb3J3YXJkKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcHJlc3Nvcl9yZWxheV8tPlNldChSZWxheTo6a09mZik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGNtXy0+Rmx1c2goKTsKKyAgICAgICAgdG9fbG9nLnJlYWRfc29sZW5vaWRzID0gcGNtXy0+R2V0QWxsKCk7CisgICAgICAgIExPR19TVFJVQ1QoREVCVUcsICJwbmV1bWF0aWNzIGluZm8iLCB0b19sb2cpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgUXVpdCgpIHsgcnVuXyA9IGZhbHNlOyB9CisKKyBwcml2YXRlOgorICBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFBjbT4gJnBjbV87CisgIDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IHByZXNzdXJlX3N3aXRjaF87CisgIDo6c3RkOjp1bmlxdWVfcHRyPFJlbGF5PiBjb21wcmVzc29yX3JlbGF5XzsKKworICA6OnN0ZDo6YXRvbWljPGJvb2w+IHJ1bl97dHJ1ZX07Cit9OworCitjbGFzcyBEcml2ZXRyYWluV3JpdGVyIDogcHVibGljIExvb3BPdXRwdXRIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZvaWQgc2V0X2xlZnRfZHJpdmV0cmFpbl90YWxvbig6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gdCkgeworICAgIGxlZnRfZHJpdmV0cmFpbl90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgIHZvaWQgc2V0X3JpZ2h0X2RyaXZldHJhaW5fdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICByaWdodF9kcml2ZXRyYWluX3RhbG9uXyA9IDo6c3RkOjptb3ZlKHQpOworICB9CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgUmVhZCgpIG92ZXJyaWRlIHsKKyAgICA6OmJvdDM6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUub3V0cHV0LkZldGNoQW5vdGhlcigpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFdyaXRlKCkgb3ZlcnJpZGUgeworICAgIGF1dG8gJnF1ZXVlID0gOjpib3QzOjpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLm91dHB1dDsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAid2lsbCBvdXRwdXQiLCAqcXVldWUpOworICAgIGxlZnRfZHJpdmV0cmFpbl90YWxvbl8tPlNldChxdWV1ZS0+bGVmdF92b2x0YWdlIC8gMTIuMCk7CisgICAgcmlnaHRfZHJpdmV0cmFpbl90YWxvbl8tPlNldCgtcXVldWUtPnJpZ2h0X3ZvbHRhZ2UgLyAxMi4wKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTdG9wKCkgb3ZlcnJpZGUgeworICAgIExPRyhXQVJOSU5HLCAiZHJpdmV0cmFpbiBvdXRwdXQgdG9vIG9sZFxuIik7CisgICAgbGVmdF9kcml2ZXRyYWluX3RhbG9uXy0+RGlzYWJsZSgpOworICAgIHJpZ2h0X2RyaXZldHJhaW5fdGFsb25fLT5EaXNhYmxlKCk7CisgIH0KKworICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gbGVmdF9kcml2ZXRyYWluX3RhbG9uXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHJpZ2h0X2RyaXZldHJhaW5fdGFsb25fOworfTsKKworLy8gVE9ETyhicmlhbik6IFJlcGxhY2UgdGhpcyB3aXRoIDo6c3RkOjptYWtlX3VuaXF1ZSBvbmNlIGFsbCBvdXIgdG9vbGNoYWlucworLy8gaGF2ZSBzdXBwb3J0LgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIFU+CitzdGQ6OnVuaXF1ZV9wdHI8VD4gbWFrZV91bmlxdWUoVSAmJi4uLiB1KSB7CisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPFU+KHUpLi4uKSk7Cit9CisKK2NsYXNzIFdQSUxpYlJvYm90IDogcHVibGljIFJvYm90QmFzZSB7CisgcHVibGljOgorICA6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBlbmNvZGVyKGludCBpbmRleCkgeworICAgIHJldHVybiBtYWtlX3VuaXF1ZTxFbmNvZGVyPigxMCArIGluZGV4ICogMiwgMTEgKyBpbmRleCAqIDIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVyOjprNFgpOworICB9CisgIHZpcnR1YWwgdm9pZCBTdGFydENvbXBldGl0aW9uKCkgeworICAgIDo6YW9zOjpJbml0TlJUKCk7CisgICAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWROYW1lKCJTdGFydENvbXBldGl0aW9uIik7CisKKyAgICBKb3lzdGlja1NlbmRlciBqb3lzdGlja19zZW5kZXI7CisgICAgOjpzdGQ6OnRocmVhZCBqb3lzdGlja190aHJlYWQoOjpzdGQ6OnJlZihqb3lzdGlja19zZW5kZXIpKTsKKworICAgIFNlbnNvclJlYWRlciByZWFkZXI7CisgICAgTE9HKElORk8sICJDcmVhdGluZyB0aGUgcmVhZGVyXG4iKTsKKworICAgIC8vIFRPRE8oY29tcmFuKTogRmluZCB0YWxvbi9lbmNvZGVyIG51bWJlcnMuCisgICAgcmVhZGVyLnNldF9sZWZ0X2VuY29kZXIoZW5jb2RlcigyKSk7CisgICAgcmVhZGVyLnNldF9yaWdodF9lbmNvZGVyKGVuY29kZXIoMykpOworICAgIHJlYWRlci5zZXRfZG1hKG1ha2VfdW5pcXVlPERNQT4oKSk7CisgICAgOjpzdGQ6OnRocmVhZCByZWFkZXJfdGhyZWFkKDo6c3RkOjpyZWYocmVhZGVyKSk7CisgICAgR3lyb1NlbmRlciBneXJvX3NlbmRlcjsKKyAgICA6OnN0ZDo6dGhyZWFkIGd5cm9fdGhyZWFkKDo6c3RkOjpyZWYoZ3lyb19zZW5kZXIpKTsKKworICAgIERyaXZldHJhaW5Xcml0ZXIgZHJpdmV0cmFpbl93cml0ZXI7CisgICAgZHJpdmV0cmFpbl93cml0ZXIuc2V0X2xlZnRfZHJpdmV0cmFpbl90YWxvbigKKyAgICAgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+KG5ldyBUYWxvbig4KSkpOworICAgIGRyaXZldHJhaW5fd3JpdGVyLnNldF9yaWdodF9kcml2ZXRyYWluX3RhbG9uKAorICAgICAgICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4obmV3IFRhbG9uKDApKSk7CisgICAgOjpzdGQ6OnRocmVhZCBkcml2ZXRyYWluX3dyaXRlcl90aHJlYWQoOjpzdGQ6OnJlZihkcml2ZXRyYWluX3dyaXRlcikpOworCisgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8OjpmcmM5NzE6OndwaWxpYjo6QnVmZmVyZWRQY20+IHBjbSgKKyAgICAgICAgbmV3IDo6ZnJjOTcxOjp3cGlsaWI6OkJ1ZmZlcmVkUGNtKCkpOworICAgIFNvbGVub2lkV3JpdGVyIHNvbGVub2lkX3dyaXRlcihwY20pOworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfcHJlc3N1cmVfc3dpdGNoKG1ha2VfdW5pcXVlPERpZ2l0YWxJbnB1dD4oOSkpOworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfY29tcHJlc3Nvcl9yZWxheShtYWtlX3VuaXF1ZTxSZWxheT4oMCkpOworICAgIDo6c3RkOjp0aHJlYWQgc29sZW5vaWRfdGhyZWFkKDo6c3RkOjpyZWYoc29sZW5vaWRfd3JpdGVyKSk7CisKKyAgICAvLyBXYWl0IGZvcmV2ZXIuIE5vdCBtdWNoIGVsc2UgdG8gZG8uLi4KKyAgICBQQ0hFQ0soc2VsZWN0KDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKTsKKworICAgIExPRyhFUlJPUiwgIkV4aXRpbmcgV1BJTGliUm9ib3RcbiIpOworCisgICAgam95c3RpY2tfc2VuZGVyLlF1aXQoKTsKKyAgICBqb3lzdGlja190aHJlYWQuam9pbigpOworICAgIHJlYWRlci5RdWl0KCk7CisgICAgcmVhZGVyX3RocmVhZC5qb2luKCk7CisgICAgZ3lyb19zZW5kZXIuUXVpdCgpOworICAgIGd5cm9fdGhyZWFkLmpvaW4oKTsKKworICAgIGRyaXZldHJhaW5fd3JpdGVyLlF1aXQoKTsKKyAgICBkcml2ZXRyYWluX3dyaXRlcl90aHJlYWQuam9pbigpOworICAgIHNvbGVub2lkX3dyaXRlci5RdWl0KCk7CisgICAgc29sZW5vaWRfdGhyZWFkLmpvaW4oKTsKKworICAgIDo6YW9zOjpDbGVhbnVwKCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSB3cGlsaWIKK30gIC8vIG5hbWVzcGFjZSBib3QzCisKKworU1RBUlRfUk9CT1RfQ0xBU1MoOjpib3QzOjp3cGlsaWI6OldQSUxpYlJvYm90KTsKZGlmZiAtLWdpdCBhL2RvYy9idWlsZGluZy10aGUtY29kZS50eHQgYi9kb2MvYnVpbGRpbmctdGhlLWNvZGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjc2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYnVpbGRpbmctdGhlLWNvZGUudHh0CkBAIC0wLDAgKzEsNDMgQEAKK1RoaXMgZmlsZSBjb250YWlucyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHNldCB1cCBhIGNvbXB1dGVyIHRvIGJ1aWxkIHRoZSBjb2RlLgorCitbT1NdCitNb3N0IG9mIHRoZXNlIGluc3RydWN0aW9ucyBhc3N1bWUgNjQgYml0IERlYmlhbiBXaGVlenkuCisKK1tJbnN0YWxsIFBhY2thZ2VzXQorRmlyc3QsIHlvdSBoYXZlIHRvIGRvd25sb2FkIGFuZCBmb2xsb3cgdGhlIGRpcmVjdGlvbnMgaW4KKyAgPGh0dHA6Ly9yb2JvdGljcy5tdmxhLm5ldC9maWxlcy9mcmM5NzEvcGFja2FnZXMvZnJjOTcxLmxpc3Q+LgorVGhlbiwgcnVuIGBhcHQtZ2V0IGluc3RhbGwgcHl0aG9uM2AuCitUaGUgYnVpbGQgc2NyaXB0IHdpbGwgdGVsbCB5b3Ugd2hhdCBvdGhlciBwYWNrYWdlcyB0byBpbnN0YWxsIHdoZW4geW91IHJ1biBpdC4KKyAgSXQncyBwcmV0dHkgc21hcnQgYWJvdXQgbm90IGNoZWNraW5nIGZvciB0aGluZ3MgaXQgZG9lc24ndCBuZWVkLCBzbyB5b3UgbWlnaHQKKyAgd2FudCB0byBidWlsZCAnZGVwbG95IGFsbCcgdG8gc2VlIGV2ZXJ5dGhpbmcgaXQgd2FudHMuCisgIFlvdSB3aWxsIGhhdmUgdG8gYWNjZXB0IHRoZQorICAgICJXQVJOSU5HOiBUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGNhbm5vdCBiZSBhdXRoZW50aWNhdGVkISIgd2FybmluZyBmb3IKKyAgICB2YXJpb3VzIHBhY2thZ2VzIGRvd25sb2FkZWQgZnJvbSBvdXIgcGFja2FnZSByZXBvc2l0b3J5LgorICBUaGlzIHdvcmtzIGZvciBhbWQ2NCBXaGVlenksIG5vIGd1YXJhbnRlZXMgb3Igc3VwcG9ydCBmb3IgYW55dGhpbmcgZWxzZS4KKworW1J1bm5pbmcgTG9jYWxseV0KK0lmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcnVuIHRoZSByZWFsdGltZSBjb2RlIG9uIHlvdXIgZGV2ZWxvcG1lbnQgbWFjaGluZQorICB3aXRob3V0IGp1c3QgZGlzYWJsaW5nIHRoZSByZWFsdGltZSBwYXJ0IChzZXQgdGhlIEFPU19OT19SRUFMVElNRSBlbnZpcm9ubWVudAorICB2YXJpYWJsZSksIGZvbGxvdyB0aGUgZGlyZWN0aW9ucyBpbiAvL2Fvcy9jb25maWcvYW9zLmNvbmYuCitJZiB5b3Ugd2FudCB0byBydW4gdGhlIGNsYW5nIG9yIGdjY180LjggYW1kNjQgY29kZSwgYWRkIC9vcHQvY2xhbmctMy41L2xpYjY0LyB0bworICBMRF9MSUJSQVJZX1BBVEguIFVzaW5nIHRoZSBzeXN0ZW0gZ2NjLWNvbXBpbGVkIHZlcnNpb25zIHNob3VsZCBqdXN0IHdvcmsuCisKK1tDb21waWxpbmcgYW5kIERvd25sb2FkaW5nXQorUnVuIC8vZnJjOTcxLyovYnVpbGQuc2guCisgIEdpdmUgaXQgY2xlYW4sIHRlc3RzLCBvciBkZXBsb3kgYXMgYSBmaXJzdCBhcmd1bWVudCB0byBkbyBzb21ldGhpbmcgb3RoZXIKKyAgICB0aGFuIGp1c3QgYnVpbGQuCisgIEVhY2ggYWN0aW9uIChidWlsZCAodGhlIGRlZmF1bHQpLCBjbGVhbiwgdGVzdHMsIG9yIGRlcGxveSkgaGFzIGEgZGlmZmVyZW50CisgICAgZGVmYXVsdCBzZXQgb2YgdmVyc2lvbnMgb2YgdGhlIGNvZGUgaXQgYnVpbGRzLiBZb3UgY2FuIGNoYW5nZSB0aG9zZSBieQorICAgIHBhc3NpbmcgYW5vdGhlciBhcmd1bWVudC4gU29tZSBwb3B1bGFyIG9uZXMgYXJlICdhbGwnIChidWlsZCBldmVyeXRoaW5nKSwKKyAgICAgICAgJ2NsYW5nLWFtZDY0LW5vbmUnICh0aGUgbW9zdCBiYXNpYyBvbmUgZm9yIGxvY2FsIHRlc3RpbmcpLCBhbmQKKyAgICAgICAgJ2djY19mcmMtYXJtLW5vZGVidWcnICh0aGUgb25lIHRoYXQgZ2V0cyBkb3dubG9hZGVkKS4gU2VlIGl0cyAtLWhlbHAgZm9yCisgICAgICAgIG1vcmUgZGV0YWlscy4KKworW0NvbW11bmljYXRpbmcgd2l0aCB0aGUgY1JJT10KK1VzZSBuZXRjb25zb2xlIChpbiB0aGUgYW1kNjQgb3V0cHV0cyBkaXJlY3RvcmllcykgdG8gY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aAorICB0aGUgY1JJTy4KK1VzZSAicmVib290IiBmcm9tIHdpdGhpbiBuZXRjb25zb2xlLnNoIHdpbGwgcmVib290IHRoZSBjUklPLiAgXkMgd2lsbAorICBzdG9wIHRoZSBuZXRjb25zb2xlIHByb2dyYW0uICAidmVyc2lvbiIgd2lsbCB0ZWxsIHlvdSB0aGUgdGhlCisgIFZ4V29ya3MgYW5kIFdJTkQgdmVyc2lvbnMgYW5kICJoZWxwIiB3aWxsIGdpdmUgeW91IGEgbGlzdCBvZiBWeFdvcmtzCisgIGNvbW1hbmRzIHRoYXQgeW91IGNhbiB1c2UuCitNYWtlIHN1cmUgeW91ciBjb21wdXRlciBpcyBvbiB0aGUgcmlnaHQgc3VibmV0IGZpcnN0LgpkaWZmIC0tZ2l0IGEvZG9jL2NsYW5nLTMuNS5jdGwgYi9kb2MvY2xhbmctMy41LmN0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjBjNTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NsYW5nLTMuNS5jdGwKQEAgLTAsMCArMSwxMyBAQAorU291cmNlOiBsbHZtLXRvb2xjaGFpbi1zbmFwc2hvdAorU2VjdGlvbjogbWlzYworUHJpb3JpdHk6IG9wdGlvbmFsCitIb21lcGFnZTogaHR0cDovL3d3dy5sbHZtLm9yZy8KK1N0YW5kYXJkcy1WZXJzaW9uOiAzLjkuMgorUGFja2FnZTogY2xhbmctMy41CitWZXJzaW9uOiAxOjMuNX5zdm4yMDE1NjEKK01haW50YWluZXI6IEZSQyBUZWFtIDk3MSA8c3BhcnRhbnJvYm90aWNzLm9yZz4KK0RlcGVuZHM6IGxpYmJzZDAsIGxpYmM2LCBsaWJlZGl0MiwgbGlibmN1cnNlczUsIGxpYnB5dGhvbjIuNywgbGlidGluZm81LCB6bGliMWcKK0FyY2hpdGVjdHVyZTogYW1kNjQKK0Rlc2NyaXB0aW9uOiBDbGFuZyAzLjUgd2l0aCBpbmNsdWRlZCBHQ0MgNC44IHNvIGl0IGFjdHVhbGx5IHdvcmtzLgorIFRoaXMgaXMganVzdCAxIG1hc3NpdmUgcGFja2FnZSB3aXRoIGEgbmV3ZXIgY2xhbmcgdGhhdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGgKKyBvdGhlciBzdHVmZiBsaWtlIHRoZSBvZmZpY2lhbCBjbGFuZy0zLjUgcGFja2FnZSBkb2VzLgpkaWZmIC0tZ2l0IGEvZG9jL2NvZGVyZXZpZXctZGlyZWN0aW9ucy50eHQgYi9kb2MvY29kZXJldmlldy1kaXJlY3Rpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjEwYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvZGVyZXZpZXctZGlyZWN0aW9ucy50eHQKQEAgLTAsMCArMSw1NiBAQAorVGhpcyBmaWxlIGhhcyBzb21lIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IDk3MSBkb2VzIGNvZGUgcmV2aWV3cy4KKworV2UgdXNlIFJpZXR2ZWxkICg8aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9yaWV0dmVsZD4pIHJ1bm5pbmcgaW4gYW4gYXBwIGVuZ2luZQorICBhcHAgb2Ygb3Vycy4gSXQgaXMgYXQgPGh0dHA6Ly85NzFjb2RlLmFwcHNwb3QuY29tLz4uCisKK1tHZW5lcmFsIFByb2NlZHVyZV0KK1dlIHRyeSB0byBjb2RlIHJldmlldyBhbGwgY29kZSBiZWZvcmUgaXQgZ2V0cyBjaGVja2VkIGluIHRvIHN2bi4gQ29kZSByZXZpZXdzCisgIGFyZSBhbHNvIHNvbWV0aW1lcyB1c2VmdWwgZm9yIGdldHRpbmcgZmVlZGJhY2sgYWJvdXQgZG9jdW1lbnRhdGlvbiBldGMuCitGaXJzdCwgc29tZWJvZHkgc3RhcnRzIGEgY29kZSByZXZpZXcgYW5kIHNlbmRzIG91dCBlbWFpbHMgdG8gcGVvcGxlIGFza2luZyB0aGVtCisgIHRvIGxvb2suIFRoZW4sIG90aGVyIHBlb3BsZSBsb29rIGF0IGl0IGFuZCBtYWtlIHN1Z2dlc3Rpb25zIChpbiB0aGUgZm9ybSBvZgorICBjb21tZW50cykuIFRoZSBwZXJzb24gd2hvIHN0YXJ0ZWQgdGhlIHJldmlldyAodGhlIG93bmVyIG9mIGl0KSBsb29rcyBhdCB0aGUKKyAgY29tbWVudHMgYW5kIHJlc3BvbmRzIHRvIHRoZW0gYW5kL29yIGNoYW5nZXMgdGhlaXIgY29kZSBhbmQgdXBsb2FkcyBuZXcKKyAgdmVyc2lvbnMgZm9yIGV2ZXJ5Ym9keSB0byBsb29rIGF0LiBPbmNlIGFsbCBvZiB0aGUgcmV2aWV3ZXJzIGFwcHJvdmUgdGhlIGNvZGUsCisgIHRoZSBvd25lciBjaGVja3MgaXQgaW4gYW5kIGNsb3NlcyB0aGUgY29kZSByZXZpZXcgKGlzc3VlKS4KKworW1Jldmlld2luZ10KK1RoaXMgaXMgdGhlIHNlY3Rpb24gZm9yIHBlb3BsZSB3aG8gaGF2ZSByZWNlaXZlZCBlbWFpbHMgYWJvdXQgcmV2aWV3aW5nIGNvZGUKKyAgc2hvdWxkIGxvb2suCitUaGUgZW1haWwgdGhhdCB5b3UgcmVjZWl2ZSB3aWxsIGhhdmUgYSBsaW5rIHRvIHRoZSBpc3N1ZSAobGlrZQorICA8aHR0cDovLzk3MWNvZGUuYXBwc3BvdC5jb20vODIwMDEvPikuIENsaWNrIG9uIGl0IHRvIGdvIHRvIHRoZSBpc3N1ZSBwYWdlLgorICBUaGUgbW9zdCB1c2VmdWwgZm9ybSBvZiBkaWZmIGFyZSB0aGUgIlNpZGUtYnktc2lkZSBkaWZmcyIuIENsaWNrIHRoZSAiVmlldyIKKyAgbGluayBpbiB0aGF0IGNvbHVtbiBuZXh0IHRvIGVhY2ggZmlsZSB0byBsb29rIGF0IGl0LiBBZnRlciB0aGUgZmlyc3Qgc2V0IG9mCisgIGNvbW1lbnRzLCB0aGUgIkRlbHRhIGZyb20gcGF0Y2ggc2V0IiBsaW5rcyBhcmUgYWxzbyBoZWxwZnVsIHRvIHNlZSB3aGF0IGdvdAorICBjaGFuZ2VkIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gbG9vayBhdCBldmVyeXRoaW5nIGFnYWluLiBXaGlsZSBsb29raW5nIGF0CisgIGEgZGlmZiwgZG91YmxlLWNsaWNrIG9uIGFueSBsaW5lIG9mIGNvZGUgdG8gbGVhdmUgYSBjb21tZW50IHRoZXJlLiBZb3UgY2FuCisgIGFsc28gcmVwbHkgdG8gZXhpc3RpbmcgY29tbWVudHMuIFRoZSB3ZWIgaW50ZXJmYWNlIHNvbWV0aW1lcyBoaWRlcyBjb21tZW50cworICByaWdodCBhZnRlciB5b3UgY3JlYXRlL2VkaXQgdGhlbS4gUmVmcmVzaCB0aGUgcGFnZSB0byBmaXggdGhhdCAoZG9uJ3QganVzdCBkbworICBpdCBhZ2Fpbiwgb3IgeW91J2xsIGVuZCB1cCB3aXRoIDIgaWRlbnRpY2FsIGNvbW1lbnRzKS4gT25jZSB5b3UgYXJlIGRvbmUKKyAgbG9va2luZyBhdCBhbGwgb2YgdGhlIGZpbGVzIGFuZCBtYWtpbmcgY29tbWVudHMsIGNsaWNrIHRoZQorICAiUHVibGlzaCtNYWlsIENvbW1lbnRzIiBsaW5rIChhdCB0aGUgdG9wIG9mIGVhY2ggZGlmZiBvciBvbiB0aGUgbGVmdCBvZiB0aGUKKyAgbWFpbiBpc3N1ZSBwYWdlKSB0byBzZW5kIG91dCB5b3VyIGNvbW1lbnRzLiBZb3UgY2FuIGFsc28gcHV0IGdlbmVyYWwgbm90ZXMgaW4KKyAgdGhlICJNZXNzYWdlIiBib3guIElmIHlvdSB0aGluayB0aGF0IGl0IGxvb2tzIGdvb2QsIHRoZW4gcHV0ICJMR1RNIiBhdCB0aGUgdG9wCisgIG9mIHRoZSBtZXNzYWdlLiBUaGUgb3duZXIgb2YgdGhlIGNvZGUgcmV2aWV3IHdpbGwga2VlcCBsb29raW5nIGF0IHlvdXIKKyAgY29tbWVudHMsIG1ha2luZyBjaGFuZ2VzLCBhbmQgc2VuZGluZyBvdXQgbW9yZSBtZXNzYWdlcyB1bnRpbCBpdCdzIGZpbmlzaGVkLgorCitbU3RhcnRpbmcgYSBSZXZpZXddCitUbyBiZWdpbiwgbG9nIGluIHRvIDxodHRwOi8vOTcxY29kZS5hcHBzcG90LmNvbS8+IHRoZW4gY2xpY2sgdGhlICJDcmVhdGUgSXNzdWUiCisgIGxpbmsuIERvd25sb2FkIHRoZSAidXBsb2FkLnB5IiBzY3JpcHQgYW5kIHVzZSB0aGF0LCBub3QgdGhlIHdlYiBmb3JtLCBmb3IKKyAgdXBsb2FkaW5nIGEgZGlmZi4gKFRoZSB3ZWIgZm9ybSBoYXMgdG9vIG1hbnkgcHJvYmxlbXMgYW5kIGlzIHVudXNhYmxlIHdpdGgKKyAgZ2l0LikgVGhlIHNjcmlwdCB3aWxsIGZpbmQgc3ZuLCBnaXQsIG9yIGhnIGRpZmZzIGluIHlvdXIgY3VycmVudCBkaXJlY3RvcnkuIElmCisgIHlvdSB3YW50IHRoZSBkaWZmIHRvIGNvdmVyIGJhY2sgdG8gYW4gZWFybGllciBjaGFuZ2UgbnVtYmVyLCB1c2UgdGhlIC0tcmV2CisgIGFyZy4KKworICBZb3UgZG9uJ3QgbmVlZCB0byBnaXZlIGl0IGEgLXMgKC0tc2VydmVyKSBhcmcgc2luY2UgdGhlIHJpZ2h0IGRlZmF1bHQgc2VydmVyCisgIGFkZHJlc3MgaXMgaW4gdGhlIHNjcmlwdC4gWW91IGNhbiBnaXZlIGl0IGEgLWUgKC0tZW1haWwpIGFyZyB3aXRoIHlvdXIgZ21haWwKKyAgYWRkcmVzcyBvciBsZXQgaXQgYXNrIHlvdS4gKElmIHlvdSB1c2UgMi1mYWN0b3IgbG9naW4gZm9yIGdtYWlsLCB3aGljaCBJCisgIHJlY29tbWVuZCwgeW91J2xsIG5lZWQgdG8gY3JlYXRlIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIHBhc3N3b3JkIGluc3RlYWQgb2YKKyAgdXNpbmcgeW91ciByZWd1bGFyIHBhc3N3b3JkICsgT1RQIGNvZGUuKQorCisgIEFmdGVyIGl0IHVwbG9hZHMsIHlvdSBjYW4gcmV2aWV3IHRoZSBkaWZmcyBvbiB0aGUgd2ViIHBhZ2UuIFlvdSBjYW4gY2hhbmdlCisgIGNvZGUgYW5kIHVwbG9hZCBhbm90aGVyIGRpZmYuIFdoZW4gcmVhZHksIHVzZSB0aGUgd2ViIFVJIHRvIHNlbmQgdGhlIGNvZGUKKyAgcmV2aWV3IGVtYWlsLiBEb24ndCBkZWxldGUgdGhlIG9sZCBkaWZmczsgdGhleSBhcmUgaGVscGZ1bCBmb3IgcmV2aWV3ZXJzIHRvCisgIGZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyBSaWV0dmVsZCwgc2VlCisgIDxodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3JpZXR2ZWxkL3dpa2kvQ29kZVJldmlld0hlbHA+LgpkaWZmIC0tZ2l0IGEvZG9jL2Vudmlyb25tZW50X3ZhcmlhYmxlcyBiL2RvYy9lbnZpcm9ubWVudF92YXJpYWJsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkNTFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lbnZpcm9ubWVudF92YXJpYWJsZXMKQEAgLTAsMCArMSw0IEBACitBIGxpc3Qgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWZ1bCBmb3IgcnVubmluZyB0aGUgY29kZSBvbiBub3Qtcm9ib3RzOgorICBBT1NfTk9fUkVBTFRJTUUKKyAgQU9TX1NITV9OQU1FCisgIEFPU19URUFNX05VTUJFUgpkaWZmIC0tZ2l0IGEvZG9jL2dpdC1zZXR1cC50eHQgYi9kb2MvZ2l0LXNldHVwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmM1MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2dpdC1zZXR1cC50eHQKQEAgLTAsMCArMSw1OCBAQAorU29tZSBvZiB1cyBhcmUgdXNpbmcgZ2l0IGZvciBtYW5hZ2luZyBxdWlja2x5IGNoYW5naW5nIGNvZGUuIFRoaXMgZmlsZSBoYXMKK25vdGVzIGZvciBzZXR0aW5nIHRoYXQgdXAuCisKK1tDbG9uaW5nXQorYGdpdCBjbG9uZSBcCisgICAgc3NoOi8vVVNFUk5BTUVAcm9ib3RpY3MubXZsYS5uZXQvd3d3L2h0dHBzL2dpdC9mcmM5NzEvU09NRUJPRFkvMjAxNC5naXRgCisgIHdoZXJlIFVTRVJOQU1FIGlzIHlvdXIgbG9naW4gb24gdGhlIHNlcnZlciBhbmQgU09NRUJPRFkgaXMgd2hvZXZlcidzIGdpdAorICByZXBvIHlvdSB3YW50IHRvIGNsb25lCitJZiB5b3UgZG9uJ3QgaGF2ZSBhIGxvZ2luIG9uIHRoZSBzZXJ2ZXIsIHRoZW4gY2xvbmluZworICBodHRwczovL3JvYm90aWNzLm12bGEubmV0L2dpdC9mcmM5NzEvc29tZWJvZHkvMjAxNC5naXQgaW5zdGVhZCBzaG91bGQgd29yaworICAod2l0aCB5b3VyIFNWTiB1c2VybmFtZSBhbmQgcGFzc3dvcmQpLiBIb3dldmVyLCB0aGF0IGZvcm0gb2YgVVJMIGlzIHJlYWQtCisgIG9ubHkuIEluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmssIHlvdSBoYXZlIHRvIGVpdGhlciBzZXQgdGhlIGVudmlyb25tZW50CisgIHZhcmlhYmxlIEdJVF9TU0xfTk9fVkVSSUZZIHRvIDEgb3Igc2V0IHRoZSBnaXQgb3B0aW9uIGh0dHAuc3NsdmVyaWZ5IHRvIGZhbHNlLgorICBJZiB5b3UgZ2V0IGFuIGVycm9yIGxpa2UgdGhlIG9uZSBiZWxvdywgaW5zdGFsbCBhIG5ld2VyIHZlcnNpb24gb2YgZ2l0LgorICAgIFVuYWJsZSB0byBmaW5kIDhmY2Q4NzUzM2I3NmNhNWI0YjgzZmI2MDMxZGRmMGRlNWUwM2ViNTcgdW5kZXIgaHR0cHM6Ly9yb2JvdGljcy5tdmxhLm5ldC9naXQvZnJjOTcxL2JyaWFuLzIwMTMuZ2l0CisgICAgQ2Fubm90IG9idGFpbiBuZWVkZWQgb2JqZWN0IDhmY2Q4NzUzM2I3NmNhNWI0YjgzZmI2MDMxZGRmMGRlNWUwM2ViNTcKKyAgICBlcnJvcjogRmV0Y2ggZmFpbGVkLgorICBJIGdldCB0aGlzIGVycm9yIHNvbWV0aW1lcyB3aXRoIHZlcnNpb24gMS43LjIuNSBidXQgbm90IHdpdGggdmVyc2lvbiAxLjcuMTAuNC4KKworW0FkZGluZyBPdGhlciBQZW9wbGUncyBSZXBvc2l0b3JpZXNdCitgZ2l0IHJlbW90ZSBhZGQgU09NRUJPRFkgXAorICAgIHNzaDovL1VTRVJOQU1FQHJvYm90aWNzLm12bGEubmV0L3d3dy9odHRwcy9naXQvZnJjOTcxL1NPTUVCT0RZLzIwMTQuZ2l0YAorICB3aGVyZSBVU0VSTkFNRSBpcyB5b3VyIGxvZ2luIG9uIHRoZSBzZXJ2ZXIgYW5kIFNPTUVCT0RZIGlzIGFub3RoZXIgcGVyc29uJ3MKKyAgZ2l0IHJlcG9zaXRvcnkKK1RoZSBodHRwczovLyBVUkwgZGlzY3Vzc2VkIGFib3ZlIGluIFtDbG9uaW5nXSB3aWxsIHdvcmsgdG9vLgorCitbV29ya2luZyB3aXRoIE90aGVyIFBlb3BsZSdzIFJlcG9zaXRvcmllc10KK2BnaXQgZmV0Y2ggU09NRUJPRFlgIHdpbGwgcHVsbCB0aGVpciBjaGFuZ2VzLCBhbmQgdGhlbiB5b3UgY2FuIHJlYmFzZSBvbiB0b3Agb2YKKyAgdGhlbSwgbWVyZ2UgdGhlbSBpbiwgZXRjLgorYGdpdCBwdXNoIC0tbWlycm9yYCB3aWxsIHB1c2ggYWxsIG9mIHlvdXIgbG9jYWwgYnJhbmNoZXMgc28gdGhhdCBldmVyeWJvZHkgZWxzZQorICBjYW4gc2VlIHRoZW0uIChUaGlzIGlzIHRoZSBkZWZhdWx0IGlmIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbiByZW1vdGUuPHJlbW90ZT4ubWlycm9yIGlzIHNldC4pCisgIEhvd2V2ZXIsIHlvdSBjYW4gbm90IGRvIHRoYXQgd2l0aCBhbiBodHRwczovLyBVUkwuCisKK1tTeW5jaHJvbml6aW5nIHdpdGggU1ZOXQorU29tZWJvZHkgc2hvdWxkIG9jY2FzaW9uYWxseSBjb3B5IGFsbCBvZiB0aGUgZmlsZXMgZnJvbSBnaXQgKGJiYl9jYXBlLAorICBmcmM5NzEsIGFuZCBhb3MpIGludG8gc3ZuLgorCitbU2VydmVyIFNldHVwXQorWW91IG5lZWQgYSBwbGFjZSB0byBzdG9yZSB5b3VyIGZpbGVzLiBZb3Ugd2lsbCBuZWVkIGFuIGFkbWluc3RyYXRvciB0bworICBjcmVhdGUgYSBmb2xkZXIgZm9yIHlvdSBpbiAvd3d3L2h0dHBzL2dpdC9mcmM5NzEgKG9uIHRoZSBzZXJ2ZXIpIHdpdGggdGhlCisgIGNvcnJlY3QgcGVybWlzc2lvbnMgYW5kIGdyb3VwLgorCitbUmVwb3NpdG9yeSBTZXR1cF0KK1RvIGNyZWF0ZSBhIGdpdCByZXBvc2l0b3J5IG9uIHRoZSBzZXJ2ZXIsCisgIGBnaXQgaW5pdCAtLWJhcmUgMjAxNC5naXRgIGluIHlvdXIgZm9sZGVyIChpZQorICAgICIvd3d3L2h0dHBzL2dpdC9mcmM5NzEvVVNFUk5BTUUvIiksIGBjZCAyMDE0LmdpdGAsCisgICAgYGdpdCBjb25maWcgLS1sb2NhbCBnYy5wcnVuZUV4cGlyZSBuZXZlcmAsIGBybSAtciBvYmplY3RzL2AsIGFuZCB0aGVuCisgICAgYGxuIC1zIC93d3cvaHR0cHMvZ2l0L2ZyYzk3MS9vYmplY3RzLzIwMTQgb2JqZWN0c2AuIFRoYXQgd2lsbCBzZXQgeW91IHVwCisgICAgd2l0aCBhIHJlcG9zaXRvcnkgaW4gdGhlIHN0YW5kYXJkIGxvY2F0aW9uIGFuZCBtYWtlIGl0IHNvIGFsbCBvZiB0aGUgb2JqZWN0cworICAgIGluIGl0IHdvbid0IGJlIGR1cGxpY2F0ZWQgd2l0aCB0aGUgaWRlbnRpY2FsIG9uZXMgaW4gZXZlcnlib2R5IGVsc2UncworICAgIHJlcG9zaXRvcmllcy4KK0luIG9yZGVyIGZvciBodHRwczovLyBhY2Nlc3MgdG8gd29yaywgeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRvIHJlbmFtZQorICAuZ2l0L2hvb2tzL3Bvc3QtdXBkYXRlLnNhbXBsZSB0byAuZ2l0L2hvb2tzL3Bvc3QtdXBkYXRlIChhbmQgdGhlbiBydW4KKyAgYGdpdCB1cGRhdGUtc2VydmVyLWluZm9gIGlmIHlvdSdyZSBub3QgZ29pbmcgdG8gcHVzaCBpbW1lZGlhdGVseSkuCisKK1RvIGxlYXJuIG1vcmUgYWJvdXQgZ2l0LCBzZWUgZ2l0KDEpIChgbWFuIGdpdGAgb3IKKyAgPGh0dHA6Ly9tYW5wYWdlcy5kZWJpYW4ubmV0L2NnaS1iaW4vbWFuLmNnaT9xdWVyeT1naXQ+KSAoZXNwZWNpYWxseSB0aGUgTk9URVMKKyAgc2VjdGlvbikuCmRpZmYgLS1naXQgYS9mcmM5NzEvYW5hbHlzaXMvYW5hbHlzaXMucHkgYi9mcmM5NzEvYW5hbHlzaXMvYW5hbHlzaXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTQ3N2JkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS9hbmFseXNpcy9hbmFseXNpcy5weQpAQCAtMCwwICsxLDM3NyBAQAorIyEvdXNyL2Jpbi9weXRob24zCitpbXBvcnQgbWF0cGxvdGxpYgorZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgorZnJvbSBtYXRwbG90bGliLmZvbnRfbWFuYWdlciBpbXBvcnQgRm9udFByb3BlcnRpZXMKKworY2xhc3MgRGF0YXNldChvYmplY3QpOgorICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi50aW1lID0gW10KKyAgICBzZWxmLmRhdGEgPSBbXQorCisgIGRlZiBBZGQoc2VsZiwgdGltZSwgZGF0YSk6CisgICAgc2VsZi50aW1lLmFwcGVuZCh0aW1lKQorICAgIHNlbGYuZGF0YS5hcHBlbmQoZGF0YSkKKworCitjbGFzcyBQbG90dGVyKG9iamVjdCk6CisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnNpZ25hbCA9IGRpY3QoKQorCisgIGRlZiBBZGQoc2VsZiwgYmluYXJ5LCBzdHJ1Y3RfaW5zdGFuY2VfbmFtZSwgKmRhdGFfc2VhcmNoX3BhdGgpOgorICAgICIiIgorICAgIFNwZWNpZmllcyBhIHNwZWNpZmljIHBpZWNlIG9mIGRhdGEgdG8gcGxvdAorCisgICAgQXJnczoKKyAgICAgIGJpbmFyeTogc3RyLCBUaGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSB0aGF0IGdlbmVyYXRlZCB0aGUgbG9nLgorICAgICAgc3RydWN0X2luc3RhbmNlX25hbWU6IHN0ciwgVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCBpbnN0YW5jZSB3aG9zZSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMgc2hvdWxkIGJlIHBsb3R0ZWQuCisgICAgICBkYXRhX3NlYXJjaF9wYXRoOiBbc3RyXSwgVGhlIHBhdGggaW50byB0aGUgc3RydWN0IG9mIHRoZSBleGFjdCBwaWVjZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0byBwbG90LgorCisgICAgUmV0dXJuczoKKyAgICAgIE5vbmUKKyAgICAiIiIKKyAgICBzZWxmLnNpZ25hbFsoYmluYXJ5LCBzdHJ1Y3RfaW5zdGFuY2VfbmFtZSwgZGF0YV9zZWFyY2hfcGF0aCldID0gRGF0YXNldCgpCisKKyAgZGVmIEhhbmRsZUxpbmUoc2VsZiwgbGluZSk6CisgICAgIiIiCisgICAgUGFyc2VzIGEgbGluZSBmcm9tIGEgbG9nIGZpbGUgYW5kIGFkZHMgdGhlIGRhdGEgdG8gdGhlIHBsb3QgZGF0YS4KKworICAgIEFyZ3M6CisgICAgICBsaW5lOiBzdHIsIFRoZSBsaW5lIGZyb20gdGhlIGxvZyBmaWxlIHRvIHBhcnNlCisKKyAgICBSZXR1cm5zOgorICAgICAgTm9uZQorICAgICIiIgorICAgIHBsaW5lID0gUGFyc2VMaW5lKGxpbmUpCisgICAgZm9yIGtleSBpbiBzZWxmLnNpZ25hbDoKKyAgICAgIHZhbHVlID0gc2VsZi5zaWduYWxba2V5XQorICAgICAgYmluYXJ5ID0ga2V5WzBdCisgICAgICBzdHJ1Y3RfaW5zdGFuY2VfbmFtZSA9IGtleVsxXQorICAgICAgZGF0YV9zZWFyY2hfcGF0aCA9IGtleVsyXQorICAgICAgYm9vbGVhbl9tdWx0aXBsaWVyID0gTm9uZQorCisgICAgICAjIElmIHRoZSBwbG90IGRlZmluaXRpb24gbGluZSBlbmRzIHdpdGggYSAiLWIgWCIgd2hlcmUgWCBpcyBhIG51bWJlciB0aGVuCisgICAgICAjIHRoYXQgbnVtYmVyIGdldHMgZHJhd24gd2hlbiB0aGUgdmFsdWUgaXMgVHJ1ZS4gWmVybyBnZXRzIGRyYXduIHdoZW4gdGhlCisgICAgICAjIHZhbHVlIGlzIEZhbHNlLgorICAgICAgaWYgbGVuKGRhdGFfc2VhcmNoX3BhdGgpID49IDIgYW5kIGRhdGFfc2VhcmNoX3BhdGhbLTJdID09ICctYic6CisgICAgICAgIGJvb2xlYW5fbXVsdGlwbGllciA9IGZsb2F0KGRhdGFfc2VhcmNoX3BhdGhbLTFdKQorICAgICAgICBkYXRhX3NlYXJjaF9wYXRoID0gZGF0YV9zZWFyY2hfcGF0aFs6LTJdCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2UncmUgbG9va2luZyBhdCB0aGUgcmlnaHQgYmluYXJ5IHN0cnVjdHVyZSBpbnN0YW5jZS4KKyAgICAgIGlmIGJpbmFyeSA9PSBwbGluZS5uYW1lOgorICAgICAgICBpZiBwbGluZS5tc2cuc3RhcnRzd2l0aChzdHJ1Y3RfaW5zdGFuY2VfbmFtZSArICc6ICcpOgorICAgICAgICAgICMgUGFyc2UgdGhlIHN0cnVjdHVyZSBhbmQgdHJhdmVyc2UgaXQgYXMgc3BlY2lmaWVkIGluCisgICAgICAgICAgIyBgZGF0YV9zZWFyY2hfcGF0aGAuIFRoaXMgbGV0cyB0aGUgdXNlciBhY2Nlc3MgdmVyeSBkZWVwbHkgbmVzdGVkCisgICAgICAgICAgIyBzdHJ1Y3R1cmVzLgorICAgICAgICAgIF8sIF8sIGRhdGEgPSBwbGluZS5QYXJzZVN0cnVjdCgpCisgICAgICAgICAgZm9yIHBhdGggaW4gZGF0YV9zZWFyY2hfcGF0aDoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhW3BhdGhdCisKKyAgICAgICAgICBpZiBib29sZWFuX211bHRpcGxpZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBkYXRhID09ICdUJzoKKyAgICAgICAgICAgICAgdmFsdWUuQWRkKHBsaW5lLnRpbWUsIGJvb2xlYW5fbXVsdGlwbGllcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgIHZhbHVlLkFkZChwbGluZS50aW1lLCAwKQorICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZS5BZGQocGxpbmUudGltZSwgZGF0YSkKKworICBkZWYgUGxvdChzZWxmLCBub19iaW5hcnlfaW5fbGVnZW5kKToKKyAgICAiIiIKKyAgICBQbG90cyBhbGwgdGhlIGRhdGEgYWZ0ZXIgaXQncyBwYXJzZWQuCisKKyAgICBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBgSGFuZGxlRmlsZWAgaGFzIGJlZW4gY2FsbGVkIHNvIHRoYXQgdGhlcmUKKyAgICBpcyBhY3R1YWwgZGF0YSB0byBwbG90LgorICAgICIiIgorICAgIGZvciBrZXkgaW4gc2VsZi5zaWduYWw6CisgICAgICB2YWx1ZSA9IHNlbGYuc2lnbmFsW2tleV0KKworICAgICAgIyBDcmVhdGUgYSBsZWdlbmQgbGFiZWwgdXNpbmcgdGhlIGJpbmFyeSBuYW1lIChvcHRpb25hbCksIHRoZSBzdHJ1Y3R1cmUKKyAgICAgICMgbmFtZSBhbmQgdGhlIGRhdGEgc2VhcmNoIHBhdGguCisgICAgICBsYWJlbCA9IGtleVsxXSArICcuJyArICcuJy5qb2luKGtleVsyXSkKKyAgICAgIGlmIG5vdCBub19iaW5hcnlfaW5fbGVnZW5kOgorICAgICAgICBsYWJlbCA9IGtleVswXSArICcgJyArIGxhYmVsCisKKyAgICAgIHB5bGFiLnBsb3QodmFsdWUudGltZSwgdmFsdWUuZGF0YSwgbGFiZWw9bGFiZWwpCisKKyAgICAjIFNldCBsZWdlbmQgZm9udCBzaXplIHRvIHNtYWxsIGFuZCBtb3ZlIGl0IHRvIHRoZSB0b3AgY2VudGVyLgorICAgIGZvbnRQID0gRm9udFByb3BlcnRpZXMoKQorICAgIGZvbnRQLnNldF9zaXplKCdzbWFsbCcpCisgICAgcHlsYWIubGVnZW5kKGJib3hfdG9fYW5jaG9yPSgwLjUsIDEuMDUpLCBwcm9wPWZvbnRQKQorCisgICAgcHlsYWIuc2hvdygpCisKKyAgZGVmIFBsb3RGaWxlKHNlbGYsIGYsIG5vX2JpbmFyeV9pbl9sZWdlbmQ9RmFsc2UpOgorICAgICIiIgorICAgIFBhcnNlcyBhbmQgcGxvdHMgYWxsIHRoZSBkYXRhLgorCisgICAgQXJnczoKKyAgICAgIGY6IHN0ciwgVGhlIGZpbGVuYW1lIG9mIHRoZSBsb2cgd2hvc2UgZGF0YSB0byBwYXJzZSBhbmQgcGxvdC4KKworICAgIFJldHVybnM6CisgICAgICBOb25lCisgICAgIiIiCisgICAgc2VsZi5IYW5kbGVGaWxlKGYpCisgICAgc2VsZi5QbG90KG5vX2JpbmFyeV9pbl9sZWdlbmQpCisKKyAgZGVmIEhhbmRsZUZpbGUoc2VsZiwgZik6CisgICAgIiIiCisgICAgUGFyc2VzIHRoZSBzcGVjaWZpZWQgbG9nIGZpbGUuCisKKyAgICBBcmdzOgorICAgICAgZjogc3RyLCBUaGUgZmlsZW5hbWUgb2YgdGhlIGxvZyB3aG9zZSBkYXRhIHRvIHBhcnNlLgorCisgICAgUmV0dXJuczoKKyAgICAgIE5vbmUKKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oZiwgJ3InKSBhcyBmZDoKKyAgICAgIGZvciBsaW5lIGluIGZkOgorICAgICAgICBzZWxmLkhhbmRsZUxpbmUobGluZSkKKworCitjbGFzcyBMb2dFbnRyeToKKyAgIiIiVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdheSB0byBwYXJzZSBsb2cgZW50cmllcy4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbGluZSk6CisgICAgIiIiQ3JlYXRlcyBhIExvZ0VudHJ5IGZyb20gYSBsaW5lLiIiIgorICAgIG5hbWVfaW5kZXggPSBsaW5lLmZpbmQoJygnKQorICAgIHNlbGYubmFtZSA9IGxpbmVbMDpuYW1lX2luZGV4XQorCisgICAgcGlkX2luZGV4ID0gbGluZS5maW5kKCcpJywgbmFtZV9pbmRleCArIDEpCisgICAgc2VsZi5waWQgPSBpbnQobGluZVtuYW1lX2luZGV4ICsgMTpwaWRfaW5kZXhdKQorCisgICAgbXNnX2luZGV4X2luZGV4ID0gbGluZS5maW5kKCcpJywgcGlkX2luZGV4ICsgMSkKKyAgICBzZWxmLm1zZ19pbmRleCA9IGludChsaW5lW3BpZF9pbmRleCArIDI6bXNnX2luZGV4X2luZGV4XSkKKworICAgIGxldmVsX2luZGV4ID0gbGluZS5maW5kKCcgJywgbXNnX2luZGV4X2luZGV4ICsgMykKKyAgICBzZWxmLmxldmVsID0gbGluZVttc2dfaW5kZXhfaW5kZXggKyAzOmxldmVsX2luZGV4XQorCisgICAgdGltZV9pbmRleF9zdGFydCA9IGxpbmUuZmluZCgnIGF0ICcsIGxldmVsX2luZGV4KSArIDQKKyAgICB0aW1lX2luZGV4X2VuZCA9IGxpbmUuZmluZCgnczonLCBsZXZlbF9pbmRleCkKKyAgICBzZWxmLnRpbWUgPSBmbG9hdChsaW5lW3RpbWVfaW5kZXhfc3RhcnQ6dGltZV9pbmRleF9lbmRdKQorCisgICAgZmlsZW5hbWVfZW5kID0gbGluZS5maW5kKCc6JywgdGltZV9pbmRleF9lbmQgKyAzKQorICAgIHNlbGYuZmlsZW5hbWUgPSBsaW5lW3RpbWVfaW5kZXhfZW5kICsgMzpmaWxlbmFtZV9lbmRdCisKKyAgICBsaW5lbnVtYmVyX2VuZCA9IGxpbmUuZmluZCgnOicsIGZpbGVuYW1lX2VuZCArIDIpCisgICAgc2VsZi5saW5lbnVtYmVyID0gaW50KGxpbmVbZmlsZW5hbWVfZW5kICsgMjpsaW5lbnVtYmVyX2VuZF0pCisKKyAgICBzZWxmLm1zZyA9IGxpbmVbbGluZW51bWJlcl9lbmQrMjpdCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgIiIiRm9ybWF0cyB0aGUgZGF0YSBjbGVhbmx5LiIiIgorICAgIHJldHVybiAnJXMoJWQpKCVkKTogJXMgYXQgJWZzOiAlczogJWQ6ICVzJyAlIChzZWxmLm5hbWUsIHNlbGYucGlkLCBzZWxmLm1zZ19pbmRleCwgc2VsZi5sZXZlbCwgc2VsZi50aW1lLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVudW1iZXIsIHNlbGYubXNnKQorCisgIGRlZiBfX0pzb25pemVUb2tlbkFycmF5KHNlbGYsIHN1Yl9hcnJheSwgdG9rZW5zLCB0b2tlbl9pbmRleCk6CisgICAgIiIiUGFyc2VzIGFuIGFycmF5IGZyb20gdGhlIHByb3ZpZGVkIHRva2Vucy4KKworICAgIEFyZ3M6CisgICAgICBzdWJfYXJyYXk6IGxpc3QsIFRoZSBsaXN0IHRvIHN0aWNrIHRoZSBlbGVtZW50cyBpbi4KKyAgICAgIHRva2VuczogbGlzdCBvZiBzdHJpbmdzLCBUaGUgbGlzdCB3aXRoIGFsbCB0aGUgdG9rZW5zIGluIGl0LgorICAgICAgdG9rZW5faW5kZXg6IGludCwgV2hlcmUgdG8gc3RhcnQgaW4gdGhlIHRva2VuIGxpc3QuCisKKyAgICBSZXR1cm5zOgorICAgICAgaW50LCBUaGUgbGFzdCB0b2tlbiB1c2VkLgorICAgICIiIgorICAgICMgTWFrZSBzdXJlIHRoZSBkYXRhIHN0YXJ0cyB3aXRoIGEgJ1snCisgICAgaWYgdG9rZW5zW3Rva2VuX2luZGV4XSAhPSAnWyc6CisgICAgICBwcmludCh0b2tlbnMpCisgICAgICBwcmludCgnRXhwZWN0ZWQgWyBhdCBiZWdpbm5pbmcsIGZvdW5kJywgdG9rZW5zW3Rva2VuX2luZGV4ICsgMV0pCisgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBFYXQgdGhlICdbJworICAgIHRva2VuX2luZGV4ICs9IDEKKworICAgICMgTG9vcCB0aHJvdWdoIHRoZSB0b2tlbnMuCisgICAgd2hpbGUgdG9rZW5faW5kZXggPCBsZW4odG9rZW5zKToKKyAgICAgIGlmIHRva2Vuc1t0b2tlbl9pbmRleCArIDFdID09ICcsJzoKKyAgICAgICAgIyBOZXh0IGl0ZW0gaXMgYSBjb21tYSwgc28gd2Ugc2hvdWxkIGp1c3QgYWRkIHRoZSBlbGVtZW50LgorICAgICAgICBzdWJfYXJyYXkuYXBwZW5kKHRva2Vuc1t0b2tlbl9pbmRleF0pCisgICAgICAgIHRva2VuX2luZGV4ICs9IDIKKyAgICAgIGVsaWYgdG9rZW5zW3Rva2VuX2luZGV4ICsgMV0gPT0gJ10nOgorICAgICAgICAjIE5leHQgaXRlbSBpcyBhICddJywgc28gd2Ugc2hvdWxkIGp1c3QgYWRkIHRoZSBlbGVtZW50IGFuZCBmaW5pc2guCisgICAgICAgIHN1Yl9hcnJheS5hcHBlbmQodG9rZW5zW3Rva2VuX2luZGV4XSkKKyAgICAgICAgdG9rZW5faW5kZXggKz0gMQorICAgICAgICByZXR1cm4gdG9rZW5faW5kZXgKKyAgICAgIGVsc2U6CisgICAgICAgICMgT3RoZXJ3aXNlLCBpdCBtdXN0IGJlIGEgc3ViLW1lc3NhZ2UuCisgICAgICAgIHN1Yl9qc29uID0gZGljdCgpCisgICAgICAgIHRva2VuX2luZGV4ID0gc2VsZi5Kc29uaXplVG9rZW5zKHN1Yl9qc29uLCB0b2tlbnMsIHRva2VuX2luZGV4ICsgMSkKKyAgICAgICAgc3ViX2FycmF5LmFwcGVuZChzdWJfanNvbikKKyAgICAgICAgaWYgdG9rZW5zW3Rva2VuX2luZGV4XSA9PSAnLCc6CisgICAgICAgICAgIyBIYW5kbGUgdGhlcmUgZWl0aGVyIGJlaW5nIGFub3RoZXIgZGF0YSBlbGVtZW50LgorICAgICAgICAgIHRva2VuX2luZGV4ICs9IDEKKyAgICAgICAgZWxpZiB0b2tlbnNbdG9rZW5faW5kZXhdID09ICddJzoKKyAgICAgICAgICAjIEhhbmRsZSB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAgICAgICAgICByZXR1cm4gdG9rZW5faW5kZXgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBwcmludCgnVW5leHBlY3RlZCAnLCB0b2tlbnNbdG9rZW5faW5kZXhdKQorICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBwcmludCgnVW5leHBlY3RlZCBlbmQnKQorICAgIHJldHVybiBOb25lCisKKyAgZGVmIEpzb25pemVUb2tlbnMoc2VsZiwganNvbiwgdG9rZW5zLCB0b2tlbl9pbmRleCk6CisgICAgIiIiQ3JlYXRlcyBhIGpzb24tbGlrZSBkaWN0aW9uYXJ5IGZyb20gdGhlIHByb3ZpZGVkIHRva2Vucy4KKworICAgIEFyZ3M6CisgICAgICBqc29uOiBkaWN0LCBUaGUgZGljdCB0byBzdGljayB0aGUgZWxlbWVudHMgaW4uCisgICAgICB0b2tlbnM6IGxpc3Qgb2Ygc3RyaW5ncywgVGhlIGxpc3Qgd2l0aCBhbGwgdGhlIHRva2VucyBpbiBpdC4KKyAgICAgIHRva2VuX2luZGV4OiBpbnQsIFdoZXJlIHRvIHN0YXJ0IGluIHRoZSB0b2tlbiBsaXN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIGludCwgVGhlIGxhc3QgdG9rZW4gdXNlZC4KKyAgICAiIiIKKyAgICAjIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2Ugc3RhcnRzIHdpdGggYSB7CisgICAgaWYgdG9rZW5zW3Rva2VuX2luZGV4XSAhPSAneyc6CisgICAgICBwcmludCh0b2tlbnMpCisgICAgICBwcmludCgnRXhwZWN0ZWQgeyBhdCBiZWdpbm5pbmcsIGZvdW5kJywgdG9rZW5zW3Rva2VuX2luZGV4XSkKKyAgICAgIHJldHVybiBOb25lCisKKyAgICAjIEVhdCB0aGUgeworICAgIHRva2VuX2luZGV4ICs9IDEKKworICAgICMgU3RhdGVzIGFuZCBzdGF0ZSB2YXJpYWJsZSBmb3IgcGFyc2luZyBlbGVtZW50cy4KKyAgICBTVEFURV9JTklUID0gJ2luaXQnCisgICAgU1RBVEVfSEFTX05BTUUgPSAnbmFtZScKKyAgICBTVEFURV9IQVNfQ09MT04gPSAnY29sb24nCisgICAgU1RBVEVfRVhQRUNUSU5HX1NVQk1TRyA9ICdzdWJtc2cnCisgICAgU1RBVEVfRVhQRUNUSU5HX0NPTU1BID0gJ2NvbW1hJworICAgIHBhcnNlcl9zdGF0ZSA9IFNUQVRFX0lOSVQKKworICAgIHdoaWxlIHRva2VuX2luZGV4IDwgbGVuKHRva2Vucyk6CisgICAgICBpZiB0b2tlbnNbdG9rZW5faW5kZXhdID09ICd9JzoKKyAgICAgICAgIyBGaW5pc2ggaWYgdGhlcmUgaXMgYSB9CisgICAgICAgIHJldHVybiB0b2tlbl9pbmRleCArIDEKKyAgICAgIGVsaWYgdG9rZW5zW3Rva2VuX2luZGV4XSA9PSAneyc6CisgICAgICAgIGlmIHBhcnNlcl9zdGF0ZSAhPSBTVEFURV9FWFBFQ1RJTkdfU1VCTVNHOgorICAgICAgICAgIHByaW50KHRva2VucykKKyAgICAgICAgICBwcmludChwYXJzZXJfc3RhdGUpCisgICAgICAgICAgcHJpbnQoJ0JhZCBpbnB1dCwgd2FzIG5vdCBleHBlY3RpbmcgeycpCisgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBGb3VuZCBhIHN1Ym1lc3NhZ2UsIHBhcnNlIGl0LgorICAgICAgICBzdWJfanNvbiA9IGRpY3QoKQorICAgICAgICB0b2tlbl9pbmRleCA9IHNlbGYuSnNvbml6ZVRva2VucyhzdWJfanNvbiwgdG9rZW5zLCB0b2tlbl9pbmRleCkKKyAgICAgICAganNvblt0b2tlbl9uYW1lXSA9IHN1Yl9qc29uCisgICAgICAgIHBhcnNlcl9zdGF0ZSA9IFNUQVRFX0VYUEVDVElOR19DT01NQQorICAgICAgZWxzZToKKyAgICAgICAgaWYgcGFyc2VyX3N0YXRlID09IFNUQVRFX0lOSVQ6CisgICAgICAgICAgIyBUaGlzIHRva2VuIGlzIHRoZSBuYW1lLgorICAgICAgICAgIHRva2VuX25hbWUgPSB0b2tlbnNbdG9rZW5faW5kZXhdCisgICAgICAgICAgcGFyc2VyX3N0YXRlID0gU1RBVEVfSEFTX05BTUUKKyAgICAgICAgZWxpZiBwYXJzZXJfc3RhdGUgPT0gU1RBVEVfSEFTX05BTUU6CisgICAgICAgICAgaWYgdG9rZW5zW3Rva2VuX2luZGV4XSAhPSAnOic6CisgICAgICAgICAgICBwcmludCh0b2tlbnMpCisgICAgICAgICAgICBwcmludChwYXJzZXJfc3RhdGUpCisgICAgICAgICAgICBwcmludCgnQmFkIGlucHV0LCBmb3VuZCcsIHRva2Vuc1t0b2tlbl9pbmRleF0sICdleHBlY3RlZCA6JykKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgIyBBZnRlciBhIG5hbWUsIGNvbWVzIGEgOgorICAgICAgICAgIHBhcnNlcl9zdGF0ZSA9IFNUQVRFX0hBU19DT0xPTgorICAgICAgICBlbGlmIHBhcnNlcl9zdGF0ZSA9PSBTVEFURV9IQVNfQ09MT046CisgICAgICAgICAgIyBBZnRlciB0aGUgY29sb24sIGZpZ3VyZSBvdXQgd2hhdCBpcyBuZXh0LgorICAgICAgICAgIGlmIHRva2Vuc1t0b2tlbl9pbmRleF0gPT0gJ1snOgorICAgICAgICAgICAgIyBGb3VuZCBhIHN1Yi1hcnJheSEKKyAgICAgICAgICAgIHN1Yl9hcnJheSA9IFtdCisgICAgICAgICAgICB0b2tlbl9pbmRleCA9IHNlbGYuX19Kc29uaXplVG9rZW5BcnJheShzdWJfYXJyYXksIHRva2VucywgdG9rZW5faW5kZXgpCisgICAgICAgICAgICBqc29uW3Rva2VuX25hbWVdID0gc3ViX2FycmF5CisgICAgICAgICAgICBwYXJzZXJfc3RhdGUgPSBTVEFURV9FWFBFQ1RJTkdfQ09NTUEKKyAgICAgICAgICBlbGlmIHRva2Vuc1t0b2tlbl9pbmRleCArIDFdID09ICd7JzoKKyAgICAgICAgICAgICMgRm91bmQgYSBzdWItbWVzc2FnZSwgdHJpZ2dlciBwYXJzaW5nIGl0LgorICAgICAgICAgICAgcGFyc2VyX3N0YXRlID0gU1RBVEVfRVhQRUNUSU5HX1NVQk1TRworICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoaXMgaXMganVzdCBhbiBlbGVtZW50LCBtb3ZlIG9uLgorICAgICAgICAgICAganNvblt0b2tlbl9uYW1lXSA9IHRva2Vuc1t0b2tlbl9pbmRleF0KKyAgICAgICAgICAgIHBhcnNlcl9zdGF0ZSA9IFNUQVRFX0VYUEVDVElOR19DT01NQQorICAgICAgICBlbGlmIHBhcnNlcl9zdGF0ZSA9PSBTVEFURV9FWFBFQ1RJTkdfQ09NTUE6CisgICAgICAgICAgIyBDb21wbGFpbiBpZiB0aGVyZSBpc24ndCBhIGNvbW1hIGhlcmUuCisgICAgICAgICAgaWYgdG9rZW5zW3Rva2VuX2luZGV4XSAhPSAnLCc6CisgICAgICAgICAgICBwcmludCh0b2tlbnMpCisgICAgICAgICAgICBwcmludChwYXJzZXJfc3RhdGUpCisgICAgICAgICAgICBwcmludCgnQmFkIGlucHV0LCBmb3VuZCcsIHRva2Vuc1t0b2tlbl9pbmRleF0sICdleHBlY3RlZCAsJykKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgcGFyc2VyX3N0YXRlID0gU1RBVEVfSU5JVAorICAgICAgICBlbHNlOgorICAgICAgICAgIHByaW50KCdCYWQgcGFyc2VyIHN0YXRlJykKKyAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICB0b2tlbl9pbmRleCArPSAxCisKKyAgICBwcmludCgnVW5leHBlY3RlZCBlbmQnKQorICAgIHJldHVybiBOb25lCisKKyAgZGVmIFBhcnNlU3RydWN0KHNlbGYpOgorICAgICIiIlBhcnNlcyB0aGUgbWVzc2FnZSBhcyBhIHN0cnVjdHVyZS4KKworICAgIFJldHVybnM6CisgICAgICBzdHJ1Y3RfbmFtZSwgc3RydWN0X3R5cGUsIGpzb24gZGljdC4KKyAgICAiIiIKKyAgICBzdHJ1Y3RfbmFtZV9pbmRleCA9IHNlbGYubXNnLmZpbmQoJzonKQorICAgIHN0cnVjdF9uYW1lID0gc2VsZi5tc2dbMDpzdHJ1Y3RfbmFtZV9pbmRleF0KKworICAgIHN0cnVjdF9ib2R5ID0gc2VsZi5tc2dbc3RydWN0X25hbWVfaW5kZXgrMjpdCisgICAgdG9rZW5zID0gW10KKyAgICB0aGlzX3Rva2VuID0gJycKKyAgICAjIEZvciB0aGUgdmFyaW91cyBkZWxpbWluYXRvcnMsIGFwcGVuZCB3aGF0IHdlIGhhdmUgZm91bmQgc28gZmFyIHRvIHRoZQorICAgICMgbGlzdCBhbmQgdGhlIHRva2VuLgorICAgIGZvciBjaGFyIGluIHN0cnVjdF9ib2R5OgorICAgICAgaWYgY2hhciA9PSAneyc6CisgICAgICAgIGlmIHRoaXNfdG9rZW46CisgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0aGlzX3Rva2VuKQorICAgICAgICAgIHRoaXNfdG9rZW4gPSAnJworICAgICAgICB0b2tlbnMuYXBwZW5kKCd7JykKKyAgICAgIGVsaWYgY2hhciA9PSAnfSc6CisgICAgICAgIGlmIHRoaXNfdG9rZW46CisgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0aGlzX3Rva2VuKQorICAgICAgICAgIHRoaXNfdG9rZW4gPSAnJworICAgICAgICB0b2tlbnMuYXBwZW5kKCd9JykKKyAgICAgIGVsaWYgY2hhciA9PSAnWyc6CisgICAgICAgIGlmIHRoaXNfdG9rZW46CisgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0aGlzX3Rva2VuKQorICAgICAgICAgIHRoaXNfdG9rZW4gPSAnJworICAgICAgICB0b2tlbnMuYXBwZW5kKCdbJykKKyAgICAgIGVsaWYgY2hhciA9PSAnXSc6CisgICAgICAgIGlmIHRoaXNfdG9rZW46CisgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0aGlzX3Rva2VuKQorICAgICAgICAgIHRoaXNfdG9rZW4gPSAnJworICAgICAgICB0b2tlbnMuYXBwZW5kKCddJykKKyAgICAgIGVsaWYgY2hhciA9PSAnOic6CisgICAgICAgIGlmIHRoaXNfdG9rZW46CisgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0aGlzX3Rva2VuKQorICAgICAgICAgIHRoaXNfdG9rZW4gPSAnJworICAgICAgICB0b2tlbnMuYXBwZW5kKCc6JykKKyAgICAgIGVsaWYgY2hhciA9PSAnLCc6CisgICAgICAgIGlmIHRoaXNfdG9rZW46CisgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0aGlzX3Rva2VuKQorICAgICAgICAgIHRoaXNfdG9rZW4gPSAnJworICAgICAgICB0b2tlbnMuYXBwZW5kKCcsJykKKyAgICAgIGVsaWYgY2hhciA9PSAnICc6CisgICAgICAgIGlmIHRoaXNfdG9rZW46CisgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0aGlzX3Rva2VuKQorICAgICAgICAgIHRoaXNfdG9rZW4gPSAnJworICAgICAgZWxzZToKKyAgICAgICAgdGhpc190b2tlbiArPSBjaGFyCisgICAgaWYgdGhpc190b2tlbjoKKyAgICAgIHRva2Vucy5hcHBlbmQodGhpc190b2tlbikKKworICAgIHN0cnVjdF90eXBlID0gdG9rZW5zWzBdCisgICAganNvbiA9IGRpY3QoKQorICAgICMgTm93IHRoYXQgd2UgaGF2ZSB0b2tlbnMsIHBhcnNlIHRoZW0uCisgICAgc2VsZi5Kc29uaXplVG9rZW5zKGpzb24sIHRva2VucywgMSkKKworICAgIHJldHVybiAoc3RydWN0X25hbWUsIHN0cnVjdF90eXBlLCBqc29uKQorCisKK2RlZiBQYXJzZUxpbmUobGluZSk6CisgIHJldHVybiBMb2dFbnRyeShsaW5lKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBwcmludCgnbW90b3Jfd3JpdGVyKDIyNDApKDA3NDIxKTogREVCVUcgICBhdCAwMDAwMDAwODE5Ljk5NjIwczogLi4vLi4vZnJjOTcxL291dHB1dC9tb3Rvcl93cml0ZXIuY2M6IDEwNTogc2VuZGluZzogLmFvcy5jb250cm9scy5PdXRwdXRDaGVja3twd21fdmFsdWU6MjIxLCBwdWxzZV9sZW5ndGg6Mi4yMzMzMzN9JykKKyAgbGluZSA9IFBhcnNlTGluZSgnbW90b3Jfd3JpdGVyKDIyNDApKDA3NDIxKTogREVCVUcgICBhdCAwMDAwMDAwODE5Ljk5NjIwczogLi4vLi4vZnJjOTcxL291dHB1dC9tb3Rvcl93cml0ZXIuY2M6IDEwNTogc2VuZGluZzogLmFvcy5jb250cm9scy5PdXRwdXRDaGVja3twd21fdmFsdWU6MjIxLCBwdWxzZV9sZW5ndGg6Mi4yMzMzMzN9JykKKyAgaWYgJy5hb3MuY29udHJvbHMuT3V0cHV0Q2hlY2snIGluIGxpbmUubXNnOgorICAgIHByaW50KGxpbmUpCisgICAgcHJpbnQobGluZS5QYXJzZVN0cnVjdCgpKQorCisgIGxpbmUgPSBQYXJzZUxpbmUoJ2NsYXcoMjI2MykoMTk0MDQpOiBERUJVRyAgIGF0IDAwMDAwMDA4MjAuMDAwMDBzOiAuLi8uLi9hb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC10bXBsLmg6IDEwNDogcG9zaXRpb246IC5mcmM5NzEuY29udHJvbF9sb29wcy5DbGF3R3JvdXAuUG9zaXRpb257dG9wOi5mcmM5NzEuY29udHJvbF9sb29wcy5IYWxmQ2xhd1Bvc2l0aW9ue3Bvc2l0aW9uOjEuNjcyMTUzLCBmcm9udDouZnJjOTcxLkhhbGxFZmZlY3RTdHJ1Y3R7Y3VycmVudDpmLCBwb3NlZGdlX2NvdW50OjAsIG5lZ2VkZ2VfY291bnQ6NTJ9LCBjYWxpYnJhdGlvbjouZnJjOTcxLkhhbGxFZmZlY3RTdHJ1Y3R7Y3VycmVudDpmLCBwb3NlZGdlX2NvdW50OjYsIG5lZ2VkZ2VfY291bnQ6MTN9LCBiYWNrOi5mcmM5NzEuSGFsbEVmZmVjdFN0cnVjdHtjdXJyZW50OmYsIHBvc2VkZ2VfY291bnQ6MCwgbmVnZWRnZV9jb3VudDo2Mn0sIHBvc2VkZ2VfdmFsdWU6MC42NDI2ODEsIG5lZ2VkZ2VfdmFsdWU6MC45MjIyMDd9LCBib3R0b206LmZyYzk3MS5jb250cm9sX2xvb3BzLkhhbGZDbGF3UG9zaXRpb257cG9zaXRpb246MS4zNTM1MzksIGZyb250Oi5mcmM5NzEuSGFsbEVmZmVjdFN0cnVjdHtjdXJyZW50OmYsIHBvc2VkZ2VfY291bnQ6MiwgbmVnZWRnZV9jb3VudDoxNTB9LCBjYWxpYnJhdGlvbjouZnJjOTcxLkhhbGxFZmZlY3RTdHJ1Y3R7Y3VycmVudDpmLCBwb3NlZGdlX2NvdW50OjgsIG5lZ2VkZ2VfY291bnQ6MTh9LCBiYWNrOi5mcmM5NzEuSGFsbEVmZmVjdFN0cnVjdHtjdXJyZW50OmYsIHBvc2VkZ2VfY291bnQ6MCwgbmVnZWRnZV9jb3VudDo2fSwgcG9zZWRnZV92YWx1ZTowLjQzNDUxNCwgbmVnZWRnZV92YWx1ZTowLjc1OTQ5MX19JykKKyAgcHJpbnQobGluZS5QYXJzZVN0cnVjdCgpKQorCisgIGxpbmUgPSBQYXJzZUxpbmUoJ2pveXN0aWNrX3Byb3h5KDIyNTUpKDM5NTYwKTogREVCVUcgICBhdCAwMDAwMDAwODIwLjAwNzMwczogLi4vLi4vYW9zL3ByaW1lL2lucHV0L2pveXN0aWNrX2lucHV0LmNjOiA2MTogc2VuZGluZzogLmFvcy5Sb2JvdFN0YXRle2pveXN0aWNrczpbLmFvcy5Kb3lzdGlja3tidXR0b25zOjAsIGF4aXM6WzAuMDAwMDAwLCAxLjAwMDAwMCwgMS4wMDAwMDAsIDAuMDAwMDAwXX0sIC5hb3MuSm95c3RpY2t7YnV0dG9uczowLCBheGlzOlstMC40MDE1NzUsIDEuMDAwMDAwLCAtMS4wMDc4NzQsIDAuMDAwMDAwXX0sIC5hb3MuSm95c3RpY2t7YnV0dG9uczowLCBheGlzOlswLjAwNzg3NCwgMC4wMDAwMDAsIDEuMDAwMDAwLCAtMS4wMDc4NzRdfSwgLmFvcy5Kb3lzdGlja3tidXR0b25zOjAsIGF4aXM6WzAuMDAwMDAwLCAwLjAwMDAwMCwgMC4wMDAwMDAsIDAuMDAwMDAwXX1dLCB0ZXN0X21vZGU6ZiwgZm1zX2F0dGFjaGVkOmYsIGVuYWJsZWQ6VCwgYXV0b25vbW91czpmLCB0ZWFtX2lkOjk3MSwgZmFrZTpmfScpCisgIHByaW50KGxpbmUuUGFyc2VTdHJ1Y3QoKSkKZGlmZiAtLWdpdCBhL2ZyYzk3MS9hbmFseXNpcy9wbG90X2FjdGlvbi5weSBiL2ZyYzk3MS9hbmFseXNpcy9wbG90X2FjdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjUwZmZkCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2FuYWx5c2lzL3Bsb3RfYWN0aW9uLnB5CkBAIC0wLDAgKzEsODggQEAKKyMhL3Vzci9iaW4vcHl0aG9uMworCitpbXBvcnQgc3lzCitpbXBvcnQgbnVtcHkKK2ltcG9ydCBhbmFseXNpcworaW1wb3J0IGFyZ3BhcnNlCisKK2RlZiBSZWFkUGxvdERlZmluaXRpb25zKGZpbGVuYW1lKToKKyAgIiIiCisgIFJlYWQgYSBmaWxlIHdpdGggcGxvdHRpbmcgZGVmaW5pdGlvbnMuCisKKyAgQSBwbG90dGluZyBkZWZpbml0aW9uIGlzIGEgc2luZ2xlIGxpbmUgdGhhdCBkZWZpbmVzIHdoYXQgZGF0YSB0byBzZWFyY2ggZm9yCisgIGluIG9yZGVyIHRvIHBsb3QgaXQuIFRoZSBmb2xsb3dpbmcgaW4gYSBmaWxlIHdvdWxkIGR1cGxpY2F0ZSB0aGUgZGVmYXVsdAorICBiZWhhdmlvdXI6CisKKyAgICBmcmlkZ2UgZ29hbCBoZWlnaHQKKyAgICBmcmlkZ2UgZ29hbCBhbmdsZQorICAgIGZyaWRnZSBnb2FsIHZlbG9jaXR5CisgICAgZnJpZGdlIGdvYWwgYW5ndWxhcl92ZWxvY2l0eQorICAgIGZyaWRnZSBvdXRwdXQgbGVmdF9hcm0KKyAgICBmcmlkZ2Ugb3V0cHV0IHJpZ2h0X2FybQorICAgIGZyaWRnZSBvdXRwdXQgbGVmdF9lbGV2YXRvcgorICAgIGZyaWRnZSBvdXRwdXQgcmlnaHRfZWxldmF0b3IKKworICBMaW5lcyBhcmUgaWdub3JlZCBpZiB0aGV5IHN0YXJ0IHdpdGggYSBoYXNoIG1hcmsgKGkuZS4gJyMnKS4KKworICBMaW5lcyB0aGF0IGVuZCB3aXRoIGEgIi1iIFgiIHdoZXJlIFggaXMgYSBudW1iZXIgdGhlbiBpdCBkZXNpZ25hdGVzIHRoYXQgbGluZQorICBhcyBwbG90dGluZyBhIGJvb2xlYW4gdmFsdWUuIFggaXMgdGhlIHZhbHVlIHBsb3R0ZWQgd2hlbiB0aGUgYm9vbGVhbiBpcyB0cnVlLgorICBXaGVuIHRoZSBib29sZWFuIGlzIGZhbHNlIHRoZW4gdGhlIHZhbHVlcyBpcyBwbG90dGVkIGFzIHplcm8uIEZvciBleGFtcGxlLAorICB0aGUgZm9sbG93aW5nIGJvb2xlYW4gdmFsdWUgaXMgZHJhd24gdG8gdG9nZ2xlIGJldHdlZW4gMi4wIGFuZCAwIHdoZW4gdGhlCisgIGJvb2xlYW4gaXMgVHJ1ZSBhbmQgRmFsc2UsIHJlc3BlY3RpdmVseToKKworICAgIGZyaWRnZSBzdGF0dXMgemVyb2VkIC1iIDIuMAorCisgIEFyZ3M6CisgICAgZmlsZW5hbWU6IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHJlYWQgdGhlIGRlZmluaXRpb25zIGZyb20uCisKKyAgUmV0dXJuczoKKyAgICBbW3N0cl1dOiBUaGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBmaWxlLgorICAiIiIKKyAgZGVmcyA9IFtdCisgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZmQ6CisgICAgZm9yIGxpbmUgaW4gZmQ6CisgICAgICByYXdfZGVmcyA9IGxpbmUuc3BsaXQoKQorCisgICAgICAjIE9ubHkgYWRkIHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIHRoZSBsaW5lJ3Mgbm90IGVtcHR5IGFuZCBpdAorICAgICAgIyBkb2Vzbid0IHN0YXJ0IHdpdGggYSBoYXNoLgorICAgICAgaWYgcmF3X2RlZnMgYW5kIG5vdCByYXdfZGVmc1swXS5zdGFydHN3aXRoKCcjJyk6CisgICAgICAgIGRlZnMuYXBwZW5kKHJhd19kZWZzKQorCisgIHJldHVybiBkZWZzCisKK2RlZiBtYWluKCk6CisgICMgUGFyc2UgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgIGFyZ19wYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0nTG9nIFBsb3R0ZXInKQorICBhcmdfcGFyc2VyLmFkZF9hcmd1bWVudCgnbG9nX2ZpbGUnLCBtZXRhdmFyPSdMT0dfRklMRScsIHR5cGU9c3RyLCBcCisgICAgICBoZWxwPSdUaGUgZmlsZSBmcm9tIHdoaWNoIHRvIHJlYWQgbG9ncyBhbmQgcGxvdC4nKQorICBhcmdfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wbG90LWRlZnMnLCAnLXAnLCBhY3Rpb249J3N0b3JlJywgdHlwZT1zdHIsIFwKKyAgICAgIGhlbHA9J1JlYWQgdGhlIGl0ZW1zIHRvIHBsb3QgZnJvbSB0aGlzIGZpbGUuJykKKyAgYXJnX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tbm8tYmluYXJ5JywgJy1uJywgYWN0aW9uPSdzdG9yZV90cnVlJywgXAorICAgICAgaGVscD0nRG9uXCd0IHByaW50IHRoZSBiaW5hcnkgbmFtZSBpbiB0aGUgbGVnZW5kLicpCisKKyAgYXJncyA9IGFyZ19wYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndlsxOl0pCisKKyAgcCA9IGFuYWx5c2lzLlBsb3R0ZXIoKQorCisgICMgSWYgdGhlIHVzZXIgZGVmaW5lcyB0aGUgbGlzdCBvZiBkYXRhIHRvIHBsb3QgaW4gYSBmaWxlLCByZWFkIGl0IGZyb20gdGhlcmUuCisgIGlmIGFyZ3MucGxvdF9kZWZzOgorICAgIGRlZnMgPSBSZWFkUGxvdERlZmluaXRpb25zKGFyZ3MucGxvdF9kZWZzKQorICAgIGZvciBkZWZpbml0aW9uIGluIGRlZnM6CisgICAgICBwLkFkZChkZWZpbml0aW9uWzBdLCBkZWZpbml0aW9uWzFdLCAqZGVmaW5pdGlvblsyOl0pCisKKyAgIyBPdGhlcndpc2UgdXNlIGEgcHJlLWRlZmluZWQgc2V0IG9mIGRhdGEgdG8gcGxvdC4KKyAgZWxzZToKKyAgICBwLkFkZCgnZnJpZGdlJywgJ2dvYWwnLCAnaGVpZ2h0JykKKyAgICBwLkFkZCgnZnJpZGdlJywgJ2dvYWwnLCAnYW5nbGUnKQorICAgIHAuQWRkKCdmcmlkZ2UnLCAnZ29hbCcsICd2ZWxvY2l0eScpCisgICAgcC5BZGQoJ2ZyaWRnZScsICdnb2FsJywgJ2FuZ3VsYXJfdmVsb2NpdHknKQorCisgICAgcC5BZGQoJ2ZyaWRnZScsICdvdXRwdXQnLCAnbGVmdF9hcm0nKQorICAgIHAuQWRkKCdmcmlkZ2UnLCAnb3V0cHV0JywgJ3JpZ2h0X2FybScpCisgICAgcC5BZGQoJ2ZyaWRnZScsICdvdXRwdXQnLCAnbGVmdF9lbGV2YXRvcicpCisgICAgcC5BZGQoJ2ZyaWRnZScsICdvdXRwdXQnLCAncmlnaHRfZWxldmF0b3InKQorCisgIHAuUGxvdEZpbGUoYXJncy5sb2dfZmlsZSwgYXJncy5ub19iaW5hcnkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2F1dG9ub21vdXMvYXV0by5xIGIvZnJjOTcxL2F1dG9ub21vdXMvYXV0by5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTEwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvYXV0b25vbW91cy9hdXRvLnEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIGZyYzk3MS5hdXRvbm9tb3VzOworCittZXNzYWdlIEF1dG9Db250cm9sIHsKKyAgLy8gVHJ1ZSBpZiBhdXRvIG1vZGUgc2hvdWxkIGJlIHJ1bm5pbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBydW5fYXV0bzsKK307CisKK3F1ZXVlIEF1dG9Db250cm9sIGF1dG9ub21vdXM7CmRpZmYgLS1naXQgYS9mcmM5NzEvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cCBiL2ZyYzk3MS9hdXRvbm9tb3VzL2F1dG9ub21vdXMuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmE1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cApAQCAtMCwwICsxLDEzIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdhdXRvX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWydhdXRvLnEnXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICdmcmM5NzEvYXV0b25vbW91cycsCisgICAgICB9LAorICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9hb3MvYnVpbGQvcXVldWVzLmd5cGknXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnN0YW50cy5oIGIvZnJjOTcxL2NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MGM2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29uc3RhbnRzLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBGUkM5NzFfQ09OU1RBTlRTX0hfCisjZGVmaW5lIEZSQzk3MV9DT05TVEFOVFNfSF8KKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29uc3RhbnRzIHsKKworc3RydWN0IFplcm9pbmdDb25zdGFudHMgeworICAvLyBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG1vdmluZyBhdmVyYWdlIGZpbHRlci4KKyAgaW50IGF2ZXJhZ2VfZmlsdGVyX3NpemU7CisgIC8vIFRoZSBkaWZmZXJlbmNlIGluIHNjYWxlZCB1bml0cyBiZXR3ZWVuIHR3byBpbmRleCBwdWxzZXMuCisgIGRvdWJsZSBpbmRleF9kaWZmZXJlbmNlOworICAvLyBUaGUgYWJzb2x1dGUgcG9zaXRpb24gaW4gc2NhbGVkIHVuaXRzIG9mIG9uZSBvZiB0aGUgaW5kZXggcHVsc2VzLgorICBkb3VibGUgbWVhc3VyZWRfaW5kZXhfcG9zaXRpb247CisgIC8vIFZhbHVlIGJldHdlZW4gMCBhbmQgMSB3aGljaCBkZXRlcm1pbmVzIGEgZnJhY3Rpb24gb2YgdGhlIGluZGV4X2RpZmYKKyAgLy8geW91IHdhbnQgdG8gdXNlLgorICBkb3VibGUgYWxsb3dhYmxlX2VuY29kZXJfZXJyb3I7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29uc3RhbnRzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gRlJDOTcxX0NPTlNUQU5UU19IXwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29lcmNlX2dvYWwuY2MgYi9mcmM5NzEvY29udHJvbF9sb29wcy9jb2VyY2VfZ29hbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDgyY2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29lcmNlX2dvYWwuY2MKQEAgLTAsMCArMSw2MyBAQAorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2NvZXJjZV9nb2FsLmgiCisKKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKworI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK0VpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBEb0NvZXJjZUdvYWwoY29uc3QgYW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+ICZyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiAmSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiAmUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNfaW5zaWRlKSB7CisgIGlmIChyZWdpb24uSXNJbnNpZGUoUikpIHsKKyAgICBpZiAoaXNfaW5zaWRlKSAqaXNfaW5zaWRlID0gdHJ1ZTsKKyAgICByZXR1cm4gUjsKKyAgfQorICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gcGFyYWxsZWxfdmVjdG9yOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gcGVycGVuZGljdWxhcl92ZWN0b3I7CisgIHBlcnBlbmRpY3VsYXJfdmVjdG9yID0gSy50cmFuc3Bvc2UoKS5ub3JtYWxpemVkKCk7CisgIHBhcmFsbGVsX3ZlY3RvciA8PCBwZXJwZW5kaWN1bGFyX3ZlY3RvcigxLCAwKSwgLXBlcnBlbmRpY3VsYXJfdmVjdG9yKDAsIDApOworCisgIGFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwxPiB0X3BvbHkoCisgICAgICByZWdpb24uSCgpICogcGFyYWxsZWxfdmVjdG9yLAorICAgICAgcmVnaW9uLmsoKSAtIHJlZ2lvbi5IKCkgKiBwZXJwZW5kaWN1bGFyX3ZlY3RvciAqIHcpOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCBFaWdlbjo6RHluYW1pYz4gdmVydGljZXMgPSB0X3BvbHkuVmVydGljZXMoKTsKKyAgaWYgKHZlcnRpY2VzLmlubmVyU2l6ZSgpID4gMCkgeworICAgIGRvdWJsZSBtaW5fZGlzdGFuY2Vfc3FyID0gMDsKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gY2xvc2VzdF9wb2ludDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnRpY2VzLmlubmVyU2l6ZSgpOyBpKyspIHsKKyAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBwb2ludDsKKyAgICAgIHBvaW50ID0gcGFyYWxsZWxfdmVjdG9yICogdmVydGljZXMoMCwgaSkgKyBwZXJwZW5kaWN1bGFyX3ZlY3RvciAqIHc7CisgICAgICBjb25zdCBkb3VibGUgbGVuZ3RoID0gKFIgLSBwb2ludCkuc3F1YXJlZE5vcm0oKTsKKyAgICAgIGlmIChpID09IDAgfHwgbGVuZ3RoIDwgbWluX2Rpc3RhbmNlX3NxcikgeworICAgICAgICBjbG9zZXN0X3BvaW50ID0gcG9pbnQ7CisgICAgICAgIG1pbl9kaXN0YW5jZV9zcXIgPSBsZW5ndGg7CisgICAgICB9CisgICAgfQorICAgIGlmIChpc19pbnNpZGUpICppc19pbnNpZGUgPSB0cnVlOworICAgIHJldHVybiBjbG9zZXN0X3BvaW50OworICB9IGVsc2UgeworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCBFaWdlbjo6RHluYW1pYz4gcmVnaW9uX3ZlcnRpY2VzID0KKyAgICAgICAgcmVnaW9uLlZlcnRpY2VzKCk7CisgICAgZG91YmxlIG1pbl9kaXN0YW5jZSA9IElORklOSVRZOworICAgIGludCBjbG9zZXN0X2kgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9uX3ZlcnRpY2VzLm91dGVyU2l6ZSgpOyBpKyspIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBsZW5ndGggPSA6OnN0ZDo6YWJzKAorICAgICAgICAgIChwZXJwZW5kaWN1bGFyX3ZlY3Rvci50cmFuc3Bvc2UoKSAqIChyZWdpb25fdmVydGljZXMuY29sKGkpKSkoMCwgMCkpOworICAgICAgaWYgKGkgPT0gMCB8fCBsZW5ndGggPCBtaW5fZGlzdGFuY2UpIHsKKyAgICAgICAgY2xvc2VzdF9pID0gaTsKKyAgICAgICAgbWluX2Rpc3RhbmNlID0gbGVuZ3RoOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaXNfaW5zaWRlKSAqaXNfaW5zaWRlID0gZmFsc2U7CisgICAgcmV0dXJuIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4oKSA8PCByZWdpb25fdmVydGljZXMoMCwgY2xvc2VzdF9pKSwKKyAgICAgICAgICAgIHJlZ2lvbl92ZXJ0aWNlcygxLCBjbG9zZXN0X2kpKS5maW5pc2hlZCgpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy9jb2VyY2VfZ29hbC5oIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29lcmNlX2dvYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTMzMDUwCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29lcmNlX2dvYWwuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIEZSQzk3MV9DT05UUk9MX0xPT1BTX0NPRVJDRV9HT0FMX0hfCisjZGVmaW5lIEZSQzk3MV9DT05UUk9MX0xPT1BTX0NPRVJDRV9HT0FMX0hfCisKKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKworI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK0VpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBEb0NvZXJjZUdvYWwoY29uc3QgYW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+ICZyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiAmSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiAmUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNfaW5zaWRlKTsKKworLy8gSW50ZXJzZWN0cyBhIGxpbmUgd2l0aCBhIHJlZ2lvbiwgYW5kIGZpbmRzIHRoZSBjbG9zZXN0IHBvaW50IHRvIFIuCisvLyBGaW5kcyBhIHBvaW50IHRoYXQgaXMgY2xvc2VzdCB0byBSIGluc2lkZSB0aGUgcmVnaW9uLCBhbmQgb24gdGhlIGxpbmUKKy8vIGRlZmluZWQgYnkgSyBYID0gdy4gIElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBmaW5kIGEgcG9pbnQgb24gdGhlIGxpbmUsCisvLyBmaW5kcyBhIHBvaW50IHRoYXQgaXMgaW5zaWRlIHRoZSByZWdpb24gYW5kIGNsb3Nlc3QgdG8gdGhlIGxpbmUuCitzdGF0aWMgaW5saW5lIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPgorICAgIENvZXJjZUdvYWwoY29uc3QgYW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+ICZyZWdpb24sCisgICAgICAgICAgICAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gJkssCisgICAgICAgICAgICAgICBkb3VibGUgdywKKyAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiAmUikgeworICByZXR1cm4gRG9Db2VyY2VHb2FsKHJlZ2lvbiwgSywgdywgUiwgbnVsbHB0cik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gRlJDOTcxX0NPTlRST0xfTE9PUFNfQ09FUkNFX0dPQUxfSF8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2MmJhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwCkBAIC0wLDAgKzEsMTEyIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICd0ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50JywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAndGVhbV9udW1iZXJfdGVzdF9lbnZpcm9ubWVudC5jYycKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9uZXR3b3JrL25ldHdvcmsuZ3lwOnRlYW1fbnVtYmVyJywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGF0ZV9mZWVkYmFja19sb29wX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3N0YXRlX2ZlZWRiYWNrX2xvb3BfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3N0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaGFsbF9lZmZlY3RfdHJhY2tlcicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgIydoYWxsX2VmZmVjdF90cmFja2VyLmgnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdxdWV1ZXMnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAncXVldWVzJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncXVldWVzJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY29udHJvbF9sb29wcy5xJywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAnZnJjOTcxL2NvbnRyb2xfbG9vcHMnLAorICAgICAgfSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vYW9zL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncG9zaXRpb25fc2Vuc29yX3NpbV90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdwb3NpdGlvbl9zZW5zb3Jfc2ltX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdxdWV1ZXMnLAorICAgICAgICAncG9zaXRpb25fc2Vuc29yX3NpbScsCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Bvc2l0aW9uX3NlbnNvcl9zaW0nLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdwb3NpdGlvbl9zZW5zb3Jfc2ltLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAncXVldWVzJywKKyAgICAgICAgJ2dhdXNzaWFuX25vaXNlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZ2F1c3NpYW5fbm9pc2UnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdnYXVzc2lhbl9ub2lzZS5jYycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NvZXJjZV9nb2FsJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY29lcmNlX2dvYWwuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6ZWlnZW4nLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6cG9seXRvcGUnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmVpZ2VuJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnBvbHl0b3BlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgIydzdGF0ZV9mZWVkYmFja19sb29wLmgnCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTplaWdlbicsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6ZWlnZW4nLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5xIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTY0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBmcmM5NzE7CisKKy8vIFJlcHJlc2VudHMgYWxsIG9mIHRoZSBkYXRhIGZvciBhIHNpbmdsZSBwb3RlbnRpb21ldGVyIGFuZCBpbmRleGVkIGVuY29kZXIKKy8vIHBhaXIuCisvLyBUaGUgdW5pdHMgb24gYWxsIG9mIHRoZSBwb3NpdGlvbnMgYXJlIHRoZSBzYW1lLgorLy8gQWxsIGVuY29kZXIgdmFsdWVzIGFyZSByZWxhdGl2ZSB0byB3aGVyZSB0aGUgZW5jb2RlciB3YXMgYXQgc29tZSBhcmJpdHJhcnkKKy8vIHBvaW50IGluIHRpbWUuIEFsbCBwb3RlbnRpb21ldGVyIHZhbHVlcyBhcmUgcmVsYXRpdmUgdG8gc29tZSBhcmJpdHJhcnkgMAorLy8gcG9zaXRpb24gd2hpY2ggdmFyaWVzIHdpdGggZWFjaCByb2JvdC4KK3N0cnVjdCBQb3RBbmRJbmRleFBvc2l0aW9uIHsKKyAgLy8gQ3VycmVudCBwb3NpdGlvbiByZWFkIGZyb20gdGhlIGVuY29kZXIuCisgIGRvdWJsZSBlbmNvZGVyOworICAvLyBDdXJyZW50IHBvc2l0aW9uIHJlYWQgZnJvbSB0aGUgcG90ZW50aW9tZXRlci4KKyAgZG91YmxlIHBvdDsKKworICAvLyBQb3NpdGlvbiBmcm9tIHRoZSBlbmNvZGVyIGxhdGNoZWQgYXQgdGhlIGxhc3QgaW5kZXggcHVsc2UuCisgIGRvdWJsZSBsYXRjaGVkX2VuY29kZXI7CisgIC8vIFBvc2l0aW9uIGZyb20gdGhlIHBvdGVudGlvbWV0ZXIgbGF0Y2hlZCBhdCB0aGUgbGFzdCBpbmRleCBwdWxzZS4KKyAgZG91YmxlIGxhdGNoZWRfcG90OworCisgIC8vIEhvdyBtYW55IGluZGV4IHB1bHNlcyB3ZSd2ZSBzZWVuIHNpbmNlIHN0YXJ0dXAuIFN0YXJ0cyBhdCAwLgorICB1aW50MzJfdCBpbmRleF9wdWxzZXM7Cit9OworCisvLyBUaGUgaW50ZXJuYWwgc3RhdGUgb2YgYSB6ZXJvaW5nIGVzdGltYXRvci4KK3N0cnVjdCBFc3RpbWF0b3JTdGF0ZSB7CisgIC8vIElmIHRydWUsIHRoZXJlIGhhcyBiZWVuIGEgZmF0YWwgZXJyb3IgZm9yIHRoZSBlc3RpbWF0b3IuCisgIGJvb2wgZXJyb3I7CisgIC8vIElmIHRoZSBqb2ludCBoYXMgc2VlbiBhbiBpbmRleCBwdWxzZSBhbmQgaXMgemVyb2VkLgorICBib29sIHplcm9lZDsKKyAgLy8gVGhlIGVzdGltYXRlZCBwb3NpdGlvbiBvZiB0aGUgam9pbnQuCisgIGRvdWJsZSBwb3NpdGlvbjsKK307CisKKy8vIEEgbGVmdC9yaWdodCBwYWlyIG9mIFBvdEFuZEluZGV4UG9zaXRpb25zLgorc3RydWN0IFBvdEFuZEluZGV4UGFpciB7CisgIFBvdEFuZEluZGV4UG9zaXRpb24gbGVmdDsKKyAgUG90QW5kSW5kZXhQb3NpdGlvbiByaWdodDsKK307CisKKy8vIFJlY29yZHMgZWRnZXMgY2FwdHVyZWQgb24gYSBzaW5nbGUgaGFsbCBlZmZlY3Qgc2Vuc29yLgorc3RydWN0IEhhbGxFZmZlY3RTdHJ1Y3QgeworICBib29sIGN1cnJlbnQ7CisgIGludDMyX3QgcG9zZWRnZV9jb3VudDsKKyAgaW50MzJfdCBuZWdlZGdlX2NvdW50OworICBkb3VibGUgcG9zZWRnZV92YWx1ZTsKKyAgZG91YmxlIG5lZ2VkZ2VfdmFsdWU7Cit9OworCisvLyBSZWNvcmRzIHRoZSBwb3NpdGlvbnMgZm9yIGEgbWVjaGFuaXNtIHdpdGggZWRnZS1jYXB0dXJpbmcgc2Vuc29ycyBvbiBpdC4KK3N0cnVjdCBIYWxsRWZmZWN0UG9zaXRpb25zIHsKKyAgZG91YmxlIGN1cnJlbnQ7CisgIGRvdWJsZSBwb3NlZGdlOworICBkb3VibGUgbmVnZWRnZTsKK307CisKKy8vIFJlY29yZHMgZWRnZXMgY2FwdHVyZWQgb24gYSBzaW5nbGUgaGFsbCBlZmZlY3Qgc2Vuc29yLgorc3RydWN0IFBvc2VkZ2VPbmx5Q291bnRlZEhhbGxFZmZlY3RTdHJ1Y3QgeworICBib29sIGN1cnJlbnQ7CisgIGludDMyX3QgcG9zZWRnZV9jb3VudDsKKyAgaW50MzJfdCBuZWdlZGdlX2NvdW50OworICBkb3VibGUgcG9zZWRnZV92YWx1ZTsKK307CmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy9nYXVzc2lhbl9ub2lzZS5jYyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2dhdXNzaWFuX25vaXNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzg3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9nYXVzc2lhbl9ub2lzZS5jYwpAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvZ2F1c3NpYW5fbm9pc2UuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK0dhdXNzaWFuTm9pc2U6OkdhdXNzaWFuTm9pc2UodW5zaWduZWQgaW50IHNlZWQsIGRvdWJsZSBzdGRkZXYpCisgICAgOiBzdGRkZXZfKHN0ZGRldiksCisgICAgICBnZW5lcmF0b3JfKHNlZWQpLAorICAgICAgZGlzdHJpYnV0aW9uXygwLjAsIDEuMCkgeworICAvLyBFdmVyeXRoaW5nIGlzIGluaXRpYWxpemVkIG5vdy4KK30KKworZG91YmxlIEdhdXNzaWFuTm9pc2U6OkFkZE5vaXNlVG9TYW1wbGUoZG91YmxlIHNhbXBsZSkgeworICByZXR1cm4gc2FtcGxlICsgKGRpc3RyaWJ1dGlvbl8oZ2VuZXJhdG9yXykgKiBzdGRkZXZfKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2dhdXNzaWFuX25vaXNlLmggYi9mcmM5NzEvY29udHJvbF9sb29wcy9nYXVzc2lhbl9ub2lzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGY4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9nYXVzc2lhbl9ub2lzZS5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgRlJDOTcxX0NPTlRST0xfTE9PUFNfR0FVU1NJQU5fTk9JU0VfSF8KKyNkZWZpbmUgRlJDOTcxX0NPTlRST0xfTE9PUFNfR0FVU1NJQU5fTk9JU0VfSF8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHJhbmRvbT4KKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK2NsYXNzIEdhdXNzaWFuTm9pc2UgeworIHB1YmxpYzoKKyAgLy8gc2VlZDogVGhlIHNlZWQgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgLy8gc3RkZGV2OiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBkaXN0cmlidXRpb24uCisgIEdhdXNzaWFuTm9pc2UodW5zaWduZWQgaW50IHNlZWQsIGRvdWJsZSBzdGRkZXYpOworCisgIC8vIFJldHVybnMgYSB2ZXJzaW9uIG9mIHRoZSBzYW1wbGUgd2l0aCBnYXVzc2lhbiBub2lzZSBhZGRlZCBpbi4KKyAgZG91YmxlIEFkZE5vaXNlVG9TYW1wbGUoZG91YmxlIHNhbXBsZSk7CisKKyAgLy8gU2V0cyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBnYXVzc2lhbiBub2lzZS4KKyAgaW5saW5lIHZvaWQgc2V0X3N0YW5kYXJkX2RldmlhdGlvbihkb3VibGUgc3RkZGV2KSB7CisgICAgc3RkZGV2XyA9IHN0ZGRldjsKKyAgfQorCisgcHJpdmF0ZToKKyAgZG91YmxlIHN0ZGRldl87CisKKyAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZ2VuZXJhdG9yXzsKKyAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gZGlzdHJpYnV0aW9uXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gRlJDOTcxX0NPTlRST0xfTE9PUFNfR0FVU1NJQU5fTk9JU0VfSF8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2hhbGxfZWZmZWN0X3RyYWNrZXIuaCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2hhbGxfZWZmZWN0X3RyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWI2ZWZlCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvaGFsbF9lZmZlY3RfdHJhY2tlci5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgRlJDOTcxX0NPTlRST0xfTE9PUFNfSEFMTF9FRkZFQ1RfSF8KKyNkZWZpbmUgRlJDOTcxX0NPTlRST0xfTE9PUFNfSEFMTF9FRkZFQ1RfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5xLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworCisvLyBUT0RPKGFzY2h1aCk6IENhbiB3ZSBmaWx0ZXIgZm9yIDIgY3ljbGVzIGluc3RlYWQgb2YganVzdCAxPworY2xhc3MgSGFsbEVmZmVjdFRyYWNrZXIgeworIHB1YmxpYzoKKyAgaW50MzJfdCBnZXRfcG9zZWRnZXMoKSBjb25zdCB7IHJldHVybiBwb3NlZGdlc18uY291bnQoKTsgfQorICBpbnQzMl90IGdldF9uZWdlZGdlcygpIGNvbnN0IHsgcmV0dXJuIG5lZ2VkZ2VzXy5jb3VudCgpOyB9CisKKyAgYm9vbCBlaXRoZXJfY291bnRfY2hhbmdlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcG9zZWRnZXNfLmNvdW50X2NoYW5nZWQoKSB8fCBuZWdlZGdlc18uY291bnRfY2hhbmdlZCgpOworICB9CisgIGJvb2wgcG9zZWRnZV9jb3VudF9jaGFuZ2VkKCkgY29uc3QgeyByZXR1cm4gcG9zZWRnZXNfLmNvdW50X2NoYW5nZWQoKTsgfQorICBib29sIG5lZ2VkZ2VfY291bnRfY2hhbmdlZCgpIGNvbnN0IHsgcmV0dXJuIG5lZ2VkZ2VzXy5jb3VudF9jaGFuZ2VkKCk7IH0KKworICBib29sIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgIGJvb2wgbGFzdF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfdmFsdWVfOyB9CisgIGJvb2wgaXNfcG9zZWRnZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlKCkgJiYgIWxhc3RfdmFsdWUoKTsgfQorICBib29sIGlzX25lZ2VkZ2UoKSBjb25zdCB7IHJldHVybiAhdmFsdWUoKSAmJiBsYXN0X3ZhbHVlKCk7IH0KKworICBkb3VibGUgcG9zZWRnZV92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHBvc2VkZ2VfdmFsdWVfOyB9CisgIGRvdWJsZSBuZWdlZGdlX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gbmVnZWRnZV92YWx1ZV87IH0KKworICB2b2lkIFVwZGF0ZShjb25zdCBIYWxsRWZmZWN0U3RydWN0ICZwb3NpdGlvbikgeworICAgIGxhc3RfdmFsdWVfID0gdmFsdWVfOworICAgIHZhbHVlXyA9IHBvc2l0aW9uLmN1cnJlbnQ7CisgICAgcG9zZWRnZV92YWx1ZV8gPSBwb3NpdGlvbi5wb3NlZGdlX3ZhbHVlOworICAgIG5lZ2VkZ2VfdmFsdWVfID0gcG9zaXRpb24ubmVnZWRnZV92YWx1ZTsKKyAgICBwb3NlZGdlc18udXBkYXRlKHBvc2l0aW9uLnBvc2VkZ2VfY291bnQpOworICAgIG5lZ2VkZ2VzXy51cGRhdGUocG9zaXRpb24ubmVnZWRnZV9jb3VudCk7CisgIH0KKworICB2b2lkIFJlc2V0KGNvbnN0IEhhbGxFZmZlY3RTdHJ1Y3QgJnBvc2l0aW9uKSB7CisgICAgcG9zZWRnZXNfLlJlc2V0KHBvc2l0aW9uLnBvc2VkZ2VfY291bnQpOworICAgIG5lZ2VkZ2VzXy5SZXNldChwb3NpdGlvbi5uZWdlZGdlX2NvdW50KTsKKyAgICB2YWx1ZV8gPSBwb3NpdGlvbi5jdXJyZW50OworICAgIGxhc3RfdmFsdWVfID0gcG9zaXRpb24uY3VycmVudDsKKyAgICBwb3NlZGdlX3ZhbHVlXyA9IHBvc2l0aW9uLnBvc2VkZ2VfdmFsdWU7CisgICAgbmVnZWRnZV92YWx1ZV8gPSBwb3NpdGlvbi5uZWdlZGdlX3ZhbHVlOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyB7CisgICBwdWJsaWM6CisgICAgdm9pZCB1cGRhdGUoaW50MzJfdCBjb3VudCkgeworICAgICAgcHJldmlvdXNfY291bnRfID0gY291bnRfOworICAgICAgY291bnRfID0gY291bnQ7CisgICAgfQorCisgICAgdm9pZCBSZXNldChpbnQzMl90IGNvdW50KSB7IGNvdW50XyA9IGNvdW50OyB9CisKKyAgICBib29sIGNvdW50X2NoYW5nZWQoKSBjb25zdCB7IHJldHVybiBwcmV2aW91c19jb3VudF8gIT0gY291bnRfOyB9CisKKyAgICBpbnQzMl90IGNvdW50KCkgY29uc3QgeyByZXR1cm4gY291bnRfOyB9CisKKyAgIHByaXZhdGU6CisgICAgaW50MzJfdCBjb3VudF8gPSAwOworICAgIGludDMyX3QgcHJldmlvdXNfY291bnRfID0gMDsKKyAgfSBwb3NlZGdlc18sIG5lZ2VkZ2VzXzsKKworICBib29sIHZhbHVlXyA9IGZhbHNlOworICBib29sIGxhc3RfdmFsdWVfID0gZmFsc2U7CisKKyAgZG91YmxlIHBvc2VkZ2VfdmFsdWVfID0gMCwgbmVnZWRnZV92YWx1ZV8gPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9DT05UUk9MX0xPT1BTX0hBTExfRUZGRUNUX0hfCmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy9wb3NpdGlvbl9zZW5zb3Jfc2ltLmNjIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWEzODNlCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbS5jYwpAQCAtMCwwICsxLDk3IEBACisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbS5oIgorCisjaW5jbHVkZSA8Y21hdGg+CisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCisvKiBJbmRleCBwdWxzZS9zZWdtZW50IEV4cGxhbmF0aW9uOgorICoKKyAqIFRoZSBpbmRleCBzZWdtZW50cyBhcmUgbGFiZWxsZWQgc3RhcnRpbmcgYXQgemVybyBhbmQgZ28gdXAuIEVhY2ggaW5kZXgKKyAqIHNlZ21lbnQgaXMgdGhlIHNwYWNlIGJldHdlZW4gdGhlIHR3byBib3JkZXJpbmcgaW5kZXggcHVsc2VzLiBUaGUgbGVuZ3RoIG9mCisgKiBlYWNoIGluZGV4IHNlZ21lbnQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGluZGV4X2RpZmZgIHZhcmlhYmxlIGluIHRoZQorICogY29uc3RydWN0b3IgYmVsb3cuCisgKgorICogVGhlIGluZGV4IHB1bHNlcyBhcmUgZW5jb3VudGVyZWQgd2hlbiB0aGUgbWVjaGFuaXNtIG1vdmVzIGZyb20gb25lIGluZGV4CisgKiBzZWdtZW50IHRvIGFub3RoZXIuCisgKgorICogICAgICAgICBpbmRleCBzZWdtZW50CisgKiAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgVgorICoKKyAqICstLS0gMC0tLSstLS0gMS0tLSstLS0gMi0tLSstLS0gMy0tLSstLS0gNC0tLSstLS0gNS0tLSstLS0gNi0tLSsKKyAqCisgKiB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8CisgKiAwICAgICAgICAxICAgICAgICAyICAgICAgICAzICAgICAgICA0ICAgICAgICA1ICAgICAgICA2ICAgICAgICA3CisgKgorICogICAgICAgICAgICAgICAgICAgQQorICogICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgIGluZGV4IHB1bHNlCisgKi8KKworUG9zaXRpb25TZW5zb3JTaW11bGF0b3I6OlBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yKGRvdWJsZSBpbmRleF9kaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBub2lzZV9zZWVkKQorICAgIDogaW5kZXhfZGlmZl8oaW5kZXhfZGlmZiksIHBvdF9ub2lzZV8obm9pc2Vfc2VlZCwgMC4wKSB7CisgIEluaXRpYWxpemUoMC4wLCAwLjApOworfQorCit2b2lkIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yOjpJbml0aWFsaXplKGRvdWJsZSBzdGFydF9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBvdF9ub2lzZV9zdGRkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBrbm93bl9pbmRleF9wb3MgLyogPSAwKi8pIHsKKyAgLy8gV2UncmUgZ29pbmcgdG8gbWFrZSB0aGUgaW5kZXggcHVsc2Ugd2Uga25vdyAic2VnbWVudCB6ZXJvIi4KKyAgY3VyX2luZGV4X3NlZ21lbnRfID0gZmxvb3IoKHN0YXJ0X3Bvc2l0aW9uIC0ga25vd25faW5kZXhfcG9zKSAvIGluZGV4X2RpZmZfKTsKKyAga25vd25faW5kZXhfcG9zXyA9IGtub3duX2luZGV4X3BvczsKKyAgY3VyX2luZGV4XyA9IDA7CisgIGluZGV4X2NvdW50XyA9IDA7CisgIGN1cl9wb3NfID0gc3RhcnRfcG9zaXRpb247CisgIHN0YXJ0X3Bvc2l0aW9uXyA9IHN0YXJ0X3Bvc2l0aW9uOworICBwb3Rfbm9pc2VfLnNldF9zdGFuZGFyZF9kZXZpYXRpb24ocG90X25vaXNlX3N0ZGRldik7Cit9CisKK3ZvaWQgUG9zaXRpb25TZW5zb3JTaW11bGF0b3I6Ok1vdmVUbyhkb3VibGUgbmV3X3BvcykgeworICAvLyBDb21wdXRlIHdoaWNoIGluZGV4IHNlZ21lbnQgd2UncmUgaW4uIEluIG90aGVyIHdvcmRzLCBjb21wdXRlIGJldHdlZW4KKyAgLy8gd2hpY2ggdHdvIGluZGV4IHB1bHNlcyB3ZSBhcmUuCisgIGNvbnN0IGludCBuZXdfaW5kZXhfc2VnbWVudCA9CisgICAgICBmbG9vcigobmV3X3BvcyAtIGtub3duX2luZGV4X3Bvc18pIC8gaW5kZXhfZGlmZl8pOworCisgIGlmIChuZXdfaW5kZXhfc2VnbWVudCA8IGN1cl9pbmRleF9zZWdtZW50XykgeworICAgIC8vIFdlJ3ZlIGNyb3NzZWQgYW4gaW5kZXggcHVsc2UgaW4gdGhlIG5lZ2F0aXZlIGRpcmVjdGlvbi4gVGhhdCBtZWFucyB0aGUKKyAgICAvLyBpbmRleCBwdWxzZSB3ZSBqdXN0IGNyb3NzZWQgaXMgdGhlIGhpZ2hlciBlbmQgb2YgdGhlIGN1cnJlbnQgaW5kZXgKKyAgICAvLyBzZWdtZW50LiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1lY2hhbmlzbSBtb3ZlZCBmcm9tIGluZGV4IHNlZ21lbnQgZm91ciB0bworICAgIC8vIGluZGV4IHNlZ21lbnQgdGhyZWUsIHRoZW4gd2UganVzdCBjcm9zc2VkIGluZGV4IHB1bHNlIDQuCisgICAgY3VyX2luZGV4XyA9IG5ld19pbmRleF9zZWdtZW50ICsgMTsKKyAgICBpbmRleF9jb3VudF8rKzsKKyAgfSBlbHNlIGlmIChuZXdfaW5kZXhfc2VnbWVudCA+IGN1cl9pbmRleF9zZWdtZW50XykgeworICAgIC8vIFdlJ3ZlIGNyb3NzZWQgYW4gaW5kZXggcHVsc2UgaW4gdGhlIHBvc2l0aXZlIGRpcmVjdGlvbi4gVGhhdCBtZWFucyB0aGUKKyAgICAvLyBpbmRleCBwdWxzZSB3ZSBqdXN0IGNyb3NzZWQgaXMgdGhlIGxvd2VyIGVuZCBvZiB0aGUgaW5kZXggc2VnbWVudC4gRm9yCisgICAgLy8gZXhhbXBsZSwgaWYgdGhlIG1lY2hhbmlzbSBtb3ZlZCBmcm9tIGluZGV4IHNlZ21lbnQgc2V2ZW4gdG8gaW5kZXgKKyAgICAvLyBzZWdtZW50IGVpZ2h0LCB0aGVuIHdlIGp1c3QgY3Jvc3NlZCBpbmRleCBwdWxzZSBlaWdodC4KKyAgICBjdXJfaW5kZXhfID0gbmV3X2luZGV4X3NlZ21lbnQ7CisgICAgaW5kZXhfY291bnRfKys7CisgIH0KKworICBjdXJfaW5kZXhfc2VnbWVudF8gPSBuZXdfaW5kZXhfc2VnbWVudDsKKyAgY3VyX3Bvc18gPSBuZXdfcG9zOworfQorCit2b2lkIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yOjpHZXRTZW5zb3JWYWx1ZXMoUG90QW5kSW5kZXhQb3NpdGlvbiAqdmFsdWVzKSB7CisgIHZhbHVlcy0+cG90ID0gcG90X25vaXNlXy5BZGROb2lzZVRvU2FtcGxlKGN1cl9wb3NfKTsKKyAgdmFsdWVzLT5lbmNvZGVyID0gY3VyX3Bvc18gLSBzdGFydF9wb3NpdGlvbl87CisKKyAgaWYgKGluZGV4X2NvdW50XyA9PSAwKSB7CisgICAgdmFsdWVzLT5sYXRjaGVkX3BvdCA9IDAuMDsKKyAgICB2YWx1ZXMtPmxhdGNoZWRfZW5jb2RlciA9IDAuMDsKKyAgfSBlbHNlIHsKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbmRleCBwdWxzZSByZWxhdGl2ZSB0byBhYnNvbHV0ZSB6ZXJvLgorICAgIGRvdWJsZSBpbmRleF9wdWxzZV9wb3NpdGlvbiA9IGN1cl9pbmRleF8gKiBpbmRleF9kaWZmXyArIGtub3duX2luZGV4X3Bvc187CisKKyAgICAvLyBQb3B1bGF0ZSB0aGUgbGF0Y2hlZCBwb3QvZW5jb2RlciBzYW1wbGVzLgorICAgIHZhbHVlcy0+bGF0Y2hlZF9wb3QgPSBwb3Rfbm9pc2VfLkFkZE5vaXNlVG9TYW1wbGUoaW5kZXhfcHVsc2VfcG9zaXRpb24pOworICAgIHZhbHVlcy0+bGF0Y2hlZF9lbmNvZGVyID0gaW5kZXhfcHVsc2VfcG9zaXRpb24gLSBzdGFydF9wb3NpdGlvbl87CisgIH0KKworICB2YWx1ZXMtPmluZGV4X3B1bHNlcyA9IGluZGV4X2NvdW50XzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3Bvc2l0aW9uX3NlbnNvcl9zaW0uaCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3Bvc2l0aW9uX3NlbnNvcl9zaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzE4ODRkCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbS5oCkBAIC0wLDAgKzEsNzYgQEAKKyNpZm5kZWYgRlJDOTcxX0NPTlRST0xfTE9PUFNfUE9TSVRJT05fU0VOU09SX1NJTV9IXworI2RlZmluZSBGUkM5NzFfQ09OVFJPTF9MT09QU19QT1NJVElPTl9TRU5TT1JfU0lNX0hfCisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9nYXVzc2lhbl9ub2lzZS5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworLy8gTk9URTogQWxsIHBvdGVudGlvbWV0ZXIgYW5kIGVuY29kZXIgdmFsdWVzIGluIHRoaXMgY2xhc3MgYXJlIGFzc3VtZWQgdG8gYmUgaW4KKy8vIHRyYW5zbGF0ZWQgU0kgdW5pdHMuCisKK2NsYXNzIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yIHsKKyBwdWJsaWM6CisgIC8vIGluZGV4X2RpZmY6IFRoZSBpbnRlcnZhbCBiZXR3ZWVuIGluZGV4IHB1bHNlcy4gVGhpcyBpcyBtZWFzdXJlZCBpbiBTSQorICAvLyAgICAgICAgICAgICB1bml0cy4gRm9yIGV4YW1wbGUsIGlmIGFuIGluZGV4IHB1bHNlIGhpdHMgZXZlcnkgNWNtIG9uIHRoZQorICAvLyAgICAgICAgICAgICBlbGV2YXRvciwgc2V0IHRoaXMgdG8gMC4wNS4KKyAgLy8gbm9pc2Vfc2VlZDogVGhlIHNlZWQgdG8gZmVlZCBpbnRvIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmb3IgdGhlCisgIC8vICAgICAgICAgICAgIHBvdGVudGlvbWV0ZXIgdmFsdWVzLgorICAvLyBUT0RPKGRhbmllbHApOiBBbGxvdyBmb3Igc3RhcnRpbmcgd2l0aCBhIG5vbi16ZXJvIGVuY29kZXIgdmFsdWUuCisgIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yKGRvdWJsZSBpbmRleF9kaWZmLCB1bnNpZ25lZCBpbnQgbm9pc2Vfc2VlZCA9IDApOworCisgIC8vIFNldCBuZXcgcGFyYW1ldGVycyBmb3IgdGhlIHNlbnNvcnMuIFRoaXMgaXMgdXNlZnVsIGZvciB1bml0IHRlc3RzIHRvIGNoYW5nZQorICAvLyB0aGUgc2ltdWxhdGVkIHNlbnNvcnMnIGJlaGF2aW9yIG9uIHRoZSBmbHkuCisgIC8vIHN0YXJ0X3Bvc2l0aW9uOiBUaGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gYWJzb2x1dGUgemVybyB3aGVyZSB0aGUgc2ltdWxhdGVkCisgIC8vICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgc3RhcnRzLiBGb3IgZXhhbXBsZSwgdG8gc2ltdWxhdGUgdGhlIGVsZXZhdG9yCisgIC8vICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCA0MGNtIGFib3ZlIGFic29sdXRlIHplcm8sIHNldCB0aGlzIHRvIDAuNC4KKyAgLy8gcG90X25vaXNlX3N0ZGRldjogVGhlIHBvdCBub2lzZSBpcyBzYW1wbGVkIGZyb20gYSBnYXVzc2lhbiBkaXN0cmlidXRpb24uCisgIC8vICAgICAgICAgICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhhdAorICAvLyAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24uCisgIC8vIGtub3duX2luZGV4X3BvczogVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIGFuIGluZGV4IHB1bHNlLgorICB2b2lkIEluaXRpYWxpemUoZG91YmxlIHN0YXJ0X3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgZG91YmxlIHBvdF9ub2lzZV9zdGRkZXYsCisgICAgICAgICAgICAgICAgICBkb3VibGUga25vd25faW5kZXhfcG9zID0gMC4wKTsKKworICAvLyBTaW11bGF0ZSB0aGUgc3RydWN0dXJlIG1vdmluZyB0byBhIG5ldyBwb3NpdGlvbi4gVGhlIG5ldyB2YWx1ZSBpcyBtZWFzdXJlZAorICAvLyByZWxhdGl2ZSB0byBhYnNvbHV0ZSB6ZXJvLiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBzaW11bGF0ZWQgc2Vuc29ycyB3aXRoIG5ldworICAvLyByZWFkaW5ncy4KKyAgLy8gbmV3X3Bvc2l0aW9uOiBUaGUgbmV3IHBvc2l0aW9uIHJlbGF0aXZlIHRvIGFic29sdXRlIHplcm8uCisgIHZvaWQgTW92ZVRvKGRvdWJsZSBuZXdfcG9zaXRpb24pOworCisgIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHNpbXVsYXRlZCBzZW5zb3JzLgorICAvLyB2YWx1ZXM6IFRoZSB0YXJnZXQgc3RydWN0dXJlIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggc2ltdWxhdGVkIHNlbnNvcgorICAvLyAgICAgICAgIHJlYWRpbmdzLiBUaGUgcmVhZGluZ3Mgd2lsbCBiZSBpbiBTSSB1bml0cy4gRm9yIGV4YW1wbGUgdGhlIHVuaXRzCisgIC8vICAgICAgICAgY2FuIGJlIGdpdmVuIGluIHJhZGlhbnMsIG1ldGVycywgZXRjLgorICB2b2lkIEdldFNlbnNvclZhbHVlcyhQb3RBbmRJbmRleFBvc2l0aW9uKiB2YWx1ZXMpOworCisgcHJpdmF0ZToKKyAgLy8gVGhlIGFic29sdXRlIHNlZ21lbnQgYmV0d2VlbiB0d28gaW5kZXggcHVsc2VzIHRoZSBzaW11bGF0aW9uIGlzIG9uLiBGb3IKKyAgLy8gZXhhbXBsZSwgd2hlbiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBiZXR3ZW4gaW5kZXggcHVsc2UgemVybyBhbmQgb25lLAorICAvLyB0aGUgY3VycmVudCBpbmRleCBzZWdtZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgemVyby4gSW5kZXggc2VnbWVudCBvbmUgaXMKKyAgLy8gYmV0d2VlbiBpbmRleCBwdWxzZXMgMSBhbmQgMiwgZXRjLgorICBpbnQgY3VyX2luZGV4X3NlZ21lbnRfOworICAvLyBJbmRleCBwdWxzZSB0byB1c2UgZm9yIGNhbGN1bGF0aW5nIGxhdGNoZWQgc2Vuc29yIHZhbHVlcywgcmVsYXRpdmUgdG8KKyAgLy8gYWJzb2x1dGUgemVyby4gSW4gb3RoZXIgd29yZHMgdGhpcyBhbHdheXMgaG9sZHMgdGhlIGluZGV4IHB1bHNlIHRoYXQgd2FzCisgIC8vIGVuY291bnRlcmVkIG1vc3QgcmVjZW50bHkuCisgIGludCBjdXJfaW5kZXhfOworICAvLyBIb3cgbWFueSBpbmRleCBwdWxzZXMgd2UndmUgc2Vlbi4KKyAgaW50IGluZGV4X2NvdW50XzsKKyAgLy8gRGlzdGFuY2UgYmV0d2VlbiBpbmRleCBwdWxzZXMgb24gdGhlIG1lY2hhbmlzbS4KKyAgZG91YmxlIGluZGV4X2RpZmZfOworICAvLyBBYnNvbHV0ZSBwb3NpdGlvbiBvZiBhIGtub3duIGluZGV4IHB1bHNlLgorICBkb3VibGUga25vd25faW5kZXhfcG9zXzsKKyAgLy8gQ3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbWVjaGFuaXNtIHJlbGF0aXZlIHRvIGFic29sdXRlIHplcm8uCisgIGRvdWJsZSBjdXJfcG9zXzsKKyAgLy8gU3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1lY2hhbmlzbSByZWxhdGl2ZSB0byBhYnNvbHV0ZSB6ZXJvLiBTZWUgdGhlCisgIC8vIGBzdGFydGluZ19wb3NpdGlvbmAgcGFyYW1ldGVyIGluIHRoZSBjb25zdHJ1Y3RvciBmb3IgbW9yZSBpbmZvLgorICBkb3VibGUgc3RhcnRfcG9zaXRpb25fOworICAvLyBHYXVzc2lhbiBub2lzZSB0byBhZGQgdG8gcG90IHJlYWRpbmdzLgorICBHYXVzc2lhbk5vaXNlIHBvdF9ub2lzZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgLyogRlJDOTcxX0NPTlRST0xfTE9PUFNfUE9TSVRJT05fU0VOU09SX1NJTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbV90ZXN0LmNjIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWQzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9wb3NpdGlvbl9zZW5zb3Jfc2ltX3Rlc3QuY2MKQEAgLTAsMCArMSwxNTQgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHJhbmRvbT4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5xLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vZGllLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitjbGFzcyBQb3NpdGlvblNlbnNvclNpbVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFBvc2l0aW9uU2Vuc29yU2ltVGVzdCgpIHt9Cit9OworCitURVNUX0YoUG9zaXRpb25TZW5zb3JTaW1UZXN0LCBOb0luZGljZXMpIHsKKyAgLy8gV2UnbGwgc2ltdWxhdGUgYSBwb3RlbnRpb21ldGVyIHdpdGggbm8gbm9pc2Ugc28gdGhhdCB3ZSBjYW4gYWNjdXJhdGVseQorICAvLyB2ZXJpZnkgd2hlcmUgdGhlIG1lY2hhbmlzbSBjdXJyZW50bHkgaXMuIE92ZXJhbGwgdGhvdWdoLCB0aGUgcHVycG9zZSBvZgorICAvLyB0aGlzIHRlc3QgaXMgdG8gdmVyaWZ5IHRoYXQgbm8gZmFsc2UgaW5kZXggcHVsc2VzIGFyZSBnZW5lcmF0ZWQgd2hpbGUgdGhlCisgIC8vIG1lY2hhbmlzbSBzdGF5cyBiZXR3ZWVuIHR3byBpbmRleCBwdWxzZXMuCisgIGNvbnN0IGRvdWJsZSBpbmRleF9kaWZmID0gMC41OworICBQb3RBbmRJbmRleFBvc2l0aW9uIHBvc2l0aW9uOworICBQb3NpdGlvblNlbnNvclNpbXVsYXRvciBzaW0oaW5kZXhfZGlmZik7CisgIHNpbS5Jbml0aWFsaXplKDMuNiAqIGluZGV4X2RpZmYsIDApOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGFjY2lkZW50YWxseSBoaXQgYW4gaW5kZXggcHVsc2UuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzA7IGkrKykgeworICAgIHNpbS5Nb3ZlVG8oMy42ICogaW5kZXhfZGlmZik7CisgICAgc2ltLkdldFNlbnNvclZhbHVlcygmcG9zaXRpb24pOworICAgIEFTU0VSVF9ET1VCTEVfRVEoMy42ICogaW5kZXhfZGlmZiwgcG9zaXRpb24ucG90KTsKKyAgICBBU1NFUlRfRVEoMHUsIHBvc2l0aW9uLmluZGV4X3B1bHNlcyk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDMwOyBpKyspIHsKKyAgICBzaW0uTW92ZVRvKDMuMCAqIGluZGV4X2RpZmYpOworICAgIHNpbS5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uKTsKKyAgICBBU1NFUlRfRE9VQkxFX0VRKDMuMCAqIGluZGV4X2RpZmYsIHBvc2l0aW9uLnBvdCk7CisgICAgQVNTRVJUX0VRKDB1LCBwb3NpdGlvbi5pbmRleF9wdWxzZXMpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisgICAgc2ltLk1vdmVUbygzLjk5ICogaW5kZXhfZGlmZik7CisgICAgc2ltLkdldFNlbnNvclZhbHVlcygmcG9zaXRpb24pOworICAgIEFTU0VSVF9ET1VCTEVfRVEoMy45OSAqIGluZGV4X2RpZmYsIHBvc2l0aW9uLnBvdCk7CisgICAgQVNTRVJUX0VRKDB1LCBwb3NpdGlvbi5pbmRleF9wdWxzZXMpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisgICAgc2ltLk1vdmVUbygzLjAgKiBpbmRleF9kaWZmKTsKKyAgICBzaW0uR2V0U2Vuc29yVmFsdWVzKCZwb3NpdGlvbik7CisgICAgQVNTRVJUX0RPVUJMRV9FUSgzLjAgKiBpbmRleF9kaWZmLCBwb3NpdGlvbi5wb3QpOworICAgIEFTU0VSVF9FUSgwdSwgcG9zaXRpb24uaW5kZXhfcHVsc2VzKTsKKyAgfQorfQorCitURVNUX0YoUG9zaXRpb25TZW5zb3JTaW1UZXN0LCBDb3VudEluZGljZXMpIHsKKyAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyB0ZXN0IGlzIHRvIHZlcmlmeSB0aGF0IHRoZSBzaW11bGF0b3IgbGF0Y2hlcyB0aGUKKyAgLy8gY29ycmVjdCBpbmRleCBwdWxzZSB3aGVuIHRyYW5zaXRpb25pbmcgZnJvbSBvbmUgc2VnbWVudCB0byBhbm90aGVyLiBXZQorICAvLyBhZ2FpbiBzaW11bGF0ZSB6ZXJvIG5vaXNlIG9uIHRoZSBwb3RlbnRpb21ldGVyIHRvIGFjY3VyYXRlbHkgdmVyaWZ5IHRoZQorICAvLyBtZWNoYW5pc20ncyBwb3NpdGlvbiBkdXJpbmcgdGhlIGluZGV4IHB1bHNlcy4KKyAgY29uc3QgZG91YmxlIGluZGV4X2RpZmYgPSAwLjg7CisgIFBvdEFuZEluZGV4UG9zaXRpb24gcG9zaXRpb247CisgIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yIHNpbShpbmRleF9kaWZmKTsKKyAgc2ltLkluaXRpYWxpemUoNC42ICogaW5kZXhfZGlmZiwgMCk7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgZ2V0IGFuIGluZGV4IHB1bHNlIG9uIGV2ZXJ5IHRyYW5zaXRpb24uCisgIHNpbS5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uKTsKKyAgQVNTRVJUX0VRKDB1LCBwb3NpdGlvbi5pbmRleF9wdWxzZXMpOworCisgIHNpbS5Nb3ZlVG8oMy42ICogaW5kZXhfZGlmZik7CisgIHNpbS5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uKTsKKyAgQVNTRVJUX0RPVUJMRV9FUSg0LjAgKiBpbmRleF9kaWZmLCBwb3NpdGlvbi5sYXRjaGVkX3BvdCk7CisgIEFTU0VSVF9FUSgxdSwgcG9zaXRpb24uaW5kZXhfcHVsc2VzKTsKKworICBzaW0uTW92ZVRvKDQuNSAqIGluZGV4X2RpZmYpOworICBzaW0uR2V0U2Vuc29yVmFsdWVzKCZwb3NpdGlvbik7CisgIEFTU0VSVF9ET1VCTEVfRVEoNC4wICogaW5kZXhfZGlmZiwgcG9zaXRpb24ubGF0Y2hlZF9wb3QpOworICBBU1NFUlRfRVEoMnUsIHBvc2l0aW9uLmluZGV4X3B1bHNlcyk7CisKKyAgc2ltLk1vdmVUbyg1LjkgKiBpbmRleF9kaWZmKTsKKyAgc2ltLkdldFNlbnNvclZhbHVlcygmcG9zaXRpb24pOworICBBU1NFUlRfRE9VQkxFX0VRKDUuMCAqIGluZGV4X2RpZmYsIHBvc2l0aW9uLmxhdGNoZWRfcG90KTsKKyAgQVNTRVJUX0VRKDN1LCBwb3NpdGlvbi5pbmRleF9wdWxzZXMpOworCisgIHNpbS5Nb3ZlVG8oNi4xICogaW5kZXhfZGlmZik7CisgIHNpbS5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uKTsKKyAgQVNTRVJUX0RPVUJMRV9FUSg2LjAgKiBpbmRleF9kaWZmLCBwb3NpdGlvbi5sYXRjaGVkX3BvdCk7CisgIEFTU0VSVF9FUSg0dSwgcG9zaXRpb24uaW5kZXhfcHVsc2VzKTsKKworICBzaW0uTW92ZVRvKDguNyAqIGluZGV4X2RpZmYpOworICBzaW0uR2V0U2Vuc29yVmFsdWVzKCZwb3NpdGlvbik7CisgIEFTU0VSVF9ET1VCTEVfRVEoOC4wICogaW5kZXhfZGlmZiwgcG9zaXRpb24ubGF0Y2hlZF9wb3QpOworICBBU1NFUlRfRVEoNXUsIHBvc2l0aW9uLmluZGV4X3B1bHNlcyk7CisKKyAgc2ltLk1vdmVUbyg3LjMgKiBpbmRleF9kaWZmKTsKKyAgc2ltLkdldFNlbnNvclZhbHVlcygmcG9zaXRpb24pOworICBBU1NFUlRfRE9VQkxFX0VRKDguMCAqIGluZGV4X2RpZmYsIHBvc2l0aW9uLmxhdGNoZWRfcG90KTsKKyAgQVNTRVJUX0VRKDZ1LCBwb3NpdGlvbi5pbmRleF9wdWxzZXMpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBzaW11bGF0b3IgaGFuZGxlcyBub24temVybyBzcGVjaWZpZWQgaW5kZXggcHVsc2UgbG9jYXRpb25zCisvLyBjb3JyZWN0bHkuCitURVNUX0YoUG9zaXRpb25TZW5zb3JTaW1UZXN0LCBOb25aZXJvSW5kZXhMb2NhdGlvbikgeworICBjb25zdCBkb3VibGUgaW5kZXhfZGlmZiA9IDAuNTsKKyAgUG9zaXRpb25TZW5zb3JTaW11bGF0b3Igc2ltKGluZGV4X2RpZmYpOworICBzaW0uSW5pdGlhbGl6ZShpbmRleF9kaWZmICogMC4yNSwgMC4wLCBpbmRleF9kaWZmICogMC41KTsKKyAgUG90QW5kSW5kZXhQb3NpdGlvbiBwb3NpdGlvbjsKKworICBzaW0uTW92ZVRvKDAuNzUgKiBpbmRleF9kaWZmKTsKKyAgc2ltLkdldFNlbnNvclZhbHVlcygmcG9zaXRpb24pOworICBFWFBFQ1RfRVEoMXUsIHBvc2l0aW9uLmluZGV4X3B1bHNlcyk7CisgIEVYUEVDVF9ET1VCTEVfRVEoaW5kZXhfZGlmZiAqIDAuNSwgcG9zaXRpb24ubGF0Y2hlZF9wb3QpOworICBFWFBFQ1RfRE9VQkxFX0VRKGluZGV4X2RpZmYgKiAwLjI1LCBwb3NpdGlvbi5sYXRjaGVkX2VuY29kZXIpOworCisgIHNpbS5Nb3ZlVG8oaW5kZXhfZGlmZik7CisgIHNpbS5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uKTsKKyAgRVhQRUNUX0VRKDF1LCBwb3NpdGlvbi5pbmRleF9wdWxzZXMpOworICBFWFBFQ1RfRE9VQkxFX0VRKGluZGV4X2RpZmYgKiAwLjUsIHBvc2l0aW9uLmxhdGNoZWRfcG90KTsKKyAgRVhQRUNUX0RPVUJMRV9FUShpbmRleF9kaWZmICogMC4yNSwgcG9zaXRpb24ubGF0Y2hlZF9lbmNvZGVyKTsKKworICBzaW0uTW92ZVRvKDEuNzUgKiBpbmRleF9kaWZmKTsKKyAgc2ltLkdldFNlbnNvclZhbHVlcygmcG9zaXRpb24pOworICBFWFBFQ1RfRVEoMnUsIHBvc2l0aW9uLmluZGV4X3B1bHNlcyk7CisgIEVYUEVDVF9ET1VCTEVfRVEoaW5kZXhfZGlmZiAqIDEuNSwgcG9zaXRpb24ubGF0Y2hlZF9wb3QpOworICBFWFBFQ1RfRE9VQkxFX0VRKGluZGV4X2RpZmYgKiAxLjI1LCBwb3NpdGlvbi5sYXRjaGVkX2VuY29kZXIpOworCisgIC8vIFRyeSBpdCB3aXRoIG91ciBrbm93biBpbmRleCBwdWxzZSBub3QgYmVpbmcgb3VyIGZpcnN0IG9uZS4KKyAgc2ltLkluaXRpYWxpemUoaW5kZXhfZGlmZiAqIDAuMjUsIDAuMCwgaW5kZXhfZGlmZiAqIDEuNSk7CisKKyAgc2ltLk1vdmVUbygwLjc1ICogaW5kZXhfZGlmZik7CisgIHNpbS5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uKTsKKyAgRVhQRUNUX0VRKDF1LCBwb3NpdGlvbi5pbmRleF9wdWxzZXMpOworICBFWFBFQ1RfRE9VQkxFX0VRKGluZGV4X2RpZmYgKiAwLjUsIHBvc2l0aW9uLmxhdGNoZWRfcG90KTsKKyAgRVhQRUNUX0RPVUJMRV9FUShpbmRleF9kaWZmICogMC4yNSwgcG9zaXRpb24ubGF0Y2hlZF9lbmNvZGVyKTsKKworICBzaW0uTW92ZVRvKGluZGV4X2RpZmYpOworICBzaW0uR2V0U2Vuc29yVmFsdWVzKCZwb3NpdGlvbik7CisgIEVYUEVDVF9FUSgxdSwgcG9zaXRpb24uaW5kZXhfcHVsc2VzKTsKKyAgRVhQRUNUX0RPVUJMRV9FUShpbmRleF9kaWZmICogMC41LCBwb3NpdGlvbi5sYXRjaGVkX3BvdCk7CisgIEVYUEVDVF9ET1VCTEVfRVEoaW5kZXhfZGlmZiAqIDAuMjUsIHBvc2l0aW9uLmxhdGNoZWRfZW5jb2Rlcik7CisKKyAgc2ltLk1vdmVUbygxLjc1ICogaW5kZXhfZGlmZik7CisgIHNpbS5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uKTsKKyAgRVhQRUNUX0VRKDJ1LCBwb3NpdGlvbi5pbmRleF9wdWxzZXMpOworICBFWFBFQ1RfRE9VQkxFX0VRKGluZGV4X2RpZmYgKiAxLjUsIHBvc2l0aW9uLmxhdGNoZWRfcG90KTsKKyAgRVhQRUNUX0RPVUJMRV9FUShpbmRleF9kaWZmICogMS4yNSwgcG9zaXRpb24ubGF0Y2hlZF9lbmNvZGVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3B5dGhvbi9jb250cm9sX2xvb3AucHkgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vY29udHJvbF9sb29wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTg4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vY29udHJvbF9sb29wLnB5CkBAIC0wLDAgKzEsMzM4IEBACitpbXBvcnQgY29udHJvbHMKK2ltcG9ydCBudW1weQorCitjbGFzcyBDb25zdGFudChvYmplY3QpOgorICBkZWYgX19pbml0X18gKHNlbGYsIG5hbWUsIGZvcm1hdHQsIHZhbHVlKToKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi5mb3JtYXR0ID0gZm9ybWF0dAorICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgIHNlbGYuZm9ybWF0VG9UeXBlID0ge30KKyAgICBzZWxmLmZvcm1hdFRvVHlwZVsnJWYnXSA9ICJkb3VibGUiOworICAgIHNlbGYuZm9ybWF0VG9UeXBlWyclZCddID0gImludCI7CisgIGRlZiBfX3N0cl9fIChzZWxmKToKKyAgICByZXR1cm4gc3RyKCJcbnN0YXRpYyBjb25zdGV4cHIgJXMgJXMgPSAiKyBzZWxmLmZvcm1hdHQgKyI7XG4iKSAlIFwKKyAgICAgICAgKHNlbGYuZm9ybWF0VG9UeXBlW3NlbGYuZm9ybWF0dF0sIHNlbGYubmFtZSwgc2VsZi52YWx1ZSkKKworCitjbGFzcyBDb250cm9sTG9vcFdyaXRlcihvYmplY3QpOgorICBkZWYgX19pbml0X18oc2VsZiwgZ2Fpbl9zY2hlZHVsZV9uYW1lLCBsb29wcywgbmFtZXNwYWNlcz1Ob25lLCB3cml0ZV9jb25zdGFudHM9RmFsc2UpOgorICAgICIiIkNvbnN0cnVjdHMgYSBjb250cm9sIGxvb3Agd3JpdGVyLgorCisgICAgQXJnczoKKyAgICAgIGdhaW5fc2NoZWR1bGVfbmFtZTogc3RyaW5nLCBOYW1lIG9mIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIuCisgICAgICBsb29wczogYXJyYXlbQ29udHJvbExvb3BdLCBhIGxpc3Qgb2YgY29udHJvbCBsb29wcyB0byBnYWluIHNjaGVkdWxlCisgICAgICAgIGluIG9yZGVyLgorICAgICAgbmFtZXNwYWNlczogYXJyYXlbc3RyaW5nXSwgYSBsaXN0IG9mIG5hbWVzIG9mIG5hbWVzcGFjZXMgdG8gbmVzdCBpbgorICAgICAgICBvcmRlci4gIElmIE5vbmUsIHRoZSBkZWZhdWx0IHdpbGwgYmUgdXNlZC4KKyAgICAiIiIKKyAgICBzZWxmLl9nYWluX3NjaGVkdWxlX25hbWUgPSBnYWluX3NjaGVkdWxlX25hbWUKKyAgICBzZWxmLl9sb29wcyA9IGxvb3BzCisgICAgaWYgbmFtZXNwYWNlczoKKyAgICAgIHNlbGYuX25hbWVzcGFjZXMgPSBuYW1lc3BhY2VzCisgICAgZWxzZToKKyAgICAgIHNlbGYuX25hbWVzcGFjZXMgPSBbJ2ZyYzk3MScsICdjb250cm9sX2xvb3BzJ10KKworICAgIHNlbGYuX25hbWVzcGFjZV9zdGFydCA9ICdcbicuam9pbigKKyAgICAgICAgWyduYW1lc3BhY2UgJXMgeycgJSBuYW1lIGZvciBuYW1lIGluIHNlbGYuX25hbWVzcGFjZXNdKQorCisgICAgc2VsZi5fbmFtZXNwYWNlX2VuZCA9ICdcbicuam9pbigKKyAgICAgICAgWyd9ICAvLyBuYW1lc3BhY2UgJXMnICUgbmFtZSBmb3IgbmFtZSBpbiByZXZlcnNlZChzZWxmLl9uYW1lc3BhY2VzKV0pCisgICAgCisgICAgc2VsZi5fY29uc3RhbnRfbGlzdCA9IFtdCisKKyAgZGVmIEFkZENvbnN0YW50KHNlbGYsIGNvbnN0YW50KToKKyAgICAiIiJBZGRzIGEgY29uc3RhbnQgdG8gd3JpdGUuCisKKyAgICBBcmdzOgorICAgICAgY29uc3RhbnQ6IENvbnN0YW50LCB0aGUgY29uc3RhbnQgdG8gYWRkIHRvIHRoZSBoZWFkZXIuCisgICAgIiIiCisgICAgc2VsZi5fY29uc3RhbnRfbGlzdC5hcHBlbmQoY29uc3RhbnQpCisKKyAgZGVmIF9Ub3BEaXJlY3Rvcnkoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX25hbWVzcGFjZXNbMF0KKworICBkZWYgX0hlYWRlckd1YXJkKHNlbGYsIGhlYWRlcl9maWxlKToKKyAgICByZXR1cm4gKHNlbGYuX1RvcERpcmVjdG9yeSgpLnVwcGVyKCkgKyAnX0NPTlRST0xfTE9PUFNfJyArCisgICAgICAgICAgICBoZWFkZXJfZmlsZS51cHBlcigpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy8nLCAnXycpICsKKyAgICAgICAgICAgICdfJykKKworICBkZWYgV3JpdGUoc2VsZiwgaGVhZGVyX2ZpbGUsIGNjX2ZpbGUpOgorICAgICIiIldyaXRlcyB0aGUgbG9vcHMgdG8gdGhlIHNwZWNpZmllZCBmaWxlcy4iIiIKKyAgICBzZWxmLldyaXRlSGVhZGVyKGhlYWRlcl9maWxlKQorICAgIHNlbGYuV3JpdGVDQyhoZWFkZXJfZmlsZSwgY2NfZmlsZSkKKworICBkZWYgX0dlbmVyaWNUeXBlKHNlbGYsIHR5cGVuYW1lKToKKyAgICAiIiJSZXR1cm5zIGEgbG9vcCB0ZW1wbGF0ZSB1c2luZyB0eXBlbmFtZSBmb3IgdGhlIHR5cGUuIiIiCisgICAgbnVtX3N0YXRlcyA9IHNlbGYuX2xvb3BzWzBdLkEuc2hhcGVbMF0KKyAgICBudW1faW5wdXRzID0gc2VsZi5fbG9vcHNbMF0uQi5zaGFwZVsxXQorICAgIG51bV9vdXRwdXRzID0gc2VsZi5fbG9vcHNbMF0uQy5zaGFwZVswXQorICAgIHJldHVybiAnJXM8JWQsICVkLCAlZD4nICUgKAorICAgICAgICB0eXBlbmFtZSwgbnVtX3N0YXRlcywgbnVtX2lucHV0cywgbnVtX291dHB1dHMpCisKKyAgZGVmIF9Db250cm9sbGVyVHlwZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgdGVtcGxhdGUgbmFtZSBmb3IgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXIuIiIiCisgICAgcmV0dXJuIHNlbGYuX0dlbmVyaWNUeXBlKCdTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcicpCisKKyAgZGVmIF9Mb29wVHlwZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgdGVtcGxhdGUgbmFtZSBmb3IgU3RhdGVGZWVkYmFja0xvb3AuIiIiCisgICAgcmV0dXJuIHNlbGYuX0dlbmVyaWNUeXBlKCdTdGF0ZUZlZWRiYWNrTG9vcCcpCisKKyAgZGVmIF9QbGFudFR5cGUoc2VsZik6CisgICAgIiIiUmV0dXJucyBhIHRlbXBsYXRlIG5hbWUgZm9yIFN0YXRlRmVlZGJhY2tQbGFudC4iIiIKKyAgICByZXR1cm4gc2VsZi5fR2VuZXJpY1R5cGUoJ1N0YXRlRmVlZGJhY2tQbGFudCcpCisKKyAgZGVmIF9Db2VmZlR5cGUoc2VsZik6CisgICAgIiIiUmV0dXJucyBhIHRlbXBsYXRlIG5hbWUgZm9yIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50cy4iIiIKKyAgICByZXR1cm4gc2VsZi5fR2VuZXJpY1R5cGUoJ1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50cycpCisKKyAgZGVmIFdyaXRlSGVhZGVyKHNlbGYsIGhlYWRlcl9maWxlLCBkb3VibGVfYXBwZW5kYWdlPUZhbHNlLCBNb0lfcmF0aW89MC4wKToKKyAgICAiIiJXcml0ZXMgdGhlIGhlYWRlciBmaWxlIHRvIHRoZSBmaWxlIG5hbWVkIGhlYWRlcl9maWxlLgorICAgICAgIFNldCBkb3VibGVfYXBwZW5kYWdlIHRvIHRydWUgaW4gb3JkZXIgdG8gaW5jbHVkZSBhIHJhdGlvIG9mCisgICAgICAgbW9tZW50cyBvZiBpbmVydGlhIGNvbnN0YW50LiBDdXJyZW50bHksIG9ubHkgdXNlZCBmb3IgMjAxNCBjbGF3LiIiIgorICAgIHdpdGggb3BlbihoZWFkZXJfZmlsZSwgJ3cnKSBhcyBmZDoKKyAgICAgIGhlYWRlcl9ndWFyZCA9IHNlbGYuX0hlYWRlckd1YXJkKGhlYWRlcl9maWxlKQorICAgICAgZmQud3JpdGUoJyNpZm5kZWYgJXNcbicKKyAgICAgICAgICAgICAgICcjZGVmaW5lICVzXG5cbicgJSAoaGVhZGVyX2d1YXJkLCBoZWFkZXJfZ3VhcmQpKQorICAgICAgZmQud3JpdGUoJyNpbmNsdWRlIFwiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oXCJcbicpCisgICAgICBmZC53cml0ZSgnXG4nKQorCisgICAgICBmZC53cml0ZShzZWxmLl9uYW1lc3BhY2Vfc3RhcnQpCisKKyAgICAgIGZvciBjb25zdCBpbiBzZWxmLl9jb25zdGFudF9saXN0OgorICAgICAgICAgIGZkLndyaXRlKHN0cihjb25zdCkpCisKKyAgICAgIGZkLndyaXRlKCdcblxuJykKKyAgICAgIGZvciBsb29wIGluIHNlbGYuX2xvb3BzOgorICAgICAgICBmZC53cml0ZShsb29wLkR1bXBQbGFudEhlYWRlcigpKQorICAgICAgICBmZC53cml0ZSgnXG4nKQorICAgICAgICBmZC53cml0ZShsb29wLkR1bXBDb250cm9sbGVySGVhZGVyKCkpCisgICAgICAgIGZkLndyaXRlKCdcbicpCisKKyAgICAgIGZkLndyaXRlKCclcyBNYWtlJXNQbGFudCgpO1xuXG4nICUKKyAgICAgICAgICAgICAgIChzZWxmLl9QbGFudFR5cGUoKSwgc2VsZi5fZ2Fpbl9zY2hlZHVsZV9uYW1lKSkKKworICAgICAgZmQud3JpdGUoJyVzIE1ha2Ulc0xvb3AoKTtcblxuJyAlCisgICAgICAgICAgICAgICAoc2VsZi5fTG9vcFR5cGUoKSwgc2VsZi5fZ2Fpbl9zY2hlZHVsZV9uYW1lKSkKKworICAgICAgZmQud3JpdGUoc2VsZi5fbmFtZXNwYWNlX2VuZCkKKyAgICAgIGZkLndyaXRlKCdcblxuJykKKyAgICAgIGZkLndyaXRlKCIjZW5kaWYgIC8vICVzXG4iICUgaGVhZGVyX2d1YXJkKQorCisgIGRlZiBXcml0ZUNDKHNlbGYsIGhlYWRlcl9maWxlX25hbWUsIGNjX2ZpbGUpOgorICAgICIiIldyaXRlcyB0aGUgY2MgZmlsZSB0byB0aGUgZmlsZSBuYW1lZCBjY19maWxlLiIiIgorICAgIHdpdGggb3BlbihjY19maWxlLCAndycpIGFzIGZkOgorICAgICAgZmQud3JpdGUoJyNpbmNsdWRlIFwiJXMvY29udHJvbF9sb29wcy8lc1wiXG4nICUKKyAgICAgICAgICAgICAgIChzZWxmLl9Ub3BEaXJlY3RvcnkoKSwgaGVhZGVyX2ZpbGVfbmFtZSkpCisgICAgICBmZC53cml0ZSgnXG4nKQorICAgICAgZmQud3JpdGUoJyNpbmNsdWRlIDx2ZWN0b3I+XG4nKQorICAgICAgZmQud3JpdGUoJ1xuJykKKyAgICAgIGZkLndyaXRlKCcjaW5jbHVkZSBcImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaFwiXG4nKQorICAgICAgZmQud3JpdGUoJ1xuJykKKyAgICAgIGZkLndyaXRlKHNlbGYuX25hbWVzcGFjZV9zdGFydCkKKyAgICAgIGZkLndyaXRlKCdcblxuJykKKyAgICAgIGZvciBsb29wIGluIHNlbGYuX2xvb3BzOgorICAgICAgICBmZC53cml0ZShsb29wLkR1bXBQbGFudCgpKQorICAgICAgICBmZC53cml0ZSgnXG4nKQorCisgICAgICBmb3IgbG9vcCBpbiBzZWxmLl9sb29wczoKKyAgICAgICAgZmQud3JpdGUobG9vcC5EdW1wQ29udHJvbGxlcigpKQorICAgICAgICBmZC53cml0ZSgnXG4nKQorCisgICAgICBmZC53cml0ZSgnJXMgTWFrZSVzUGxhbnQoKSB7XG4nICUKKyAgICAgICAgICAgICAgIChzZWxmLl9QbGFudFR5cGUoKSwgc2VsZi5fZ2Fpbl9zY2hlZHVsZV9uYW1lKSkKKyAgICAgIGZkLndyaXRlKCcgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPCVzPj4gcGxhbnRzKCVkKTtcbicgJSAoCisgICAgICAgICAgc2VsZi5fQ29lZmZUeXBlKCksIGxlbihzZWxmLl9sb29wcykpKQorICAgICAgZm9yIGluZGV4LCBsb29wIGluIGVudW1lcmF0ZShzZWxmLl9sb29wcyk6CisgICAgICAgIGZkLndyaXRlKCcgIHBsYW50c1slZF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjwlcz4obmV3ICVzKCVzKSk7XG4nICUKKyAgICAgICAgICAgICAgICAgKGluZGV4LCBzZWxmLl9Db2VmZlR5cGUoKSwgc2VsZi5fQ29lZmZUeXBlKCksCisgICAgICAgICAgICAgICAgICBsb29wLlBsYW50RnVuY3Rpb24oKSkpCisgICAgICBmZC53cml0ZSgnICByZXR1cm4gJXMoJnBsYW50cyk7XG4nICUgc2VsZi5fUGxhbnRUeXBlKCkpCisgICAgICBmZC53cml0ZSgnfVxuXG4nKQorCisgICAgICBmZC53cml0ZSgnJXMgTWFrZSVzTG9vcCgpIHtcbicgJQorICAgICAgICAgICAgICAgKHNlbGYuX0xvb3BUeXBlKCksIHNlbGYuX2dhaW5fc2NoZWR1bGVfbmFtZSkpCisgICAgICBmZC53cml0ZSgnICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjwlcz4+IGNvbnRyb2xsZXJzKCVkKTtcbicgJSAoCisgICAgICAgICAgc2VsZi5fQ29udHJvbGxlclR5cGUoKSwgbGVuKHNlbGYuX2xvb3BzKSkpCisgICAgICBmb3IgaW5kZXgsIGxvb3AgaW4gZW51bWVyYXRlKHNlbGYuX2xvb3BzKToKKyAgICAgICAgZmQud3JpdGUoJyAgY29udHJvbGxlcnNbJWRdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8JXM+KG5ldyAlcyglcykpO1xuJyAlCisgICAgICAgICAgICAgICAgIChpbmRleCwgc2VsZi5fQ29udHJvbGxlclR5cGUoKSwgc2VsZi5fQ29udHJvbGxlclR5cGUoKSwKKyAgICAgICAgICAgICAgICAgIGxvb3AuQ29udHJvbGxlckZ1bmN0aW9uKCkpKQorICAgICAgZmQud3JpdGUoJyAgcmV0dXJuICVzKCZjb250cm9sbGVycyk7XG4nICUgc2VsZi5fTG9vcFR5cGUoKSkKKyAgICAgIGZkLndyaXRlKCd9XG5cbicpCisKKyAgICAgIGZkLndyaXRlKHNlbGYuX25hbWVzcGFjZV9lbmQpCisgICAgICBmZC53cml0ZSgnXG4nKQorCisKK2NsYXNzIENvbnRyb2xMb29wKG9iamVjdCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAiIiJDb25zdHJ1Y3RzIGEgY29udHJvbCBsb29wIG9iamVjdC4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBzdHJpbmcsIFRoZSBuYW1lIG9mIHRoZSBsb29wIHRvIHVzZSB3aGVuIHdyaXRpbmcgdGhlIEMrKyBmaWxlcy4KKyAgICAiIiIKKyAgICBzZWxmLl9uYW1lID0gbmFtZQorCisgIGRlZiBDb250aW51b3VzVG9EaXNjcmV0ZShzZWxmLCBBX2NvbnRpbnVvdXMsIEJfY29udGludW91cywgZHQpOgorICAgICIiIkNhbGN1bGF0ZXMgdGhlIGRpc2NyZXRlIHRpbWUgdmFsdWVzIGZvciBBIGFuZCBCLgorCisgICAgICBBcmdzOgorICAgICAgICBBX2NvbnRpbnVvdXM6IG51bXB5Lm1hdHJpeCwgVGhlIGNvbnRpbnVvdXMgdGltZSBBIG1hdHJpeAorICAgICAgICBCX2NvbnRpbnVvdXM6IG51bXB5Lm1hdHJpeCwgVGhlIGNvbnRpbnVvdXMgdGltZSBCIG1hdHJpeAorICAgICAgICBkdDogZmxvYXQsIFRoZSB0aW1lIHN0ZXAgb2YgdGhlIGNvbnRyb2wgbG9vcAorCisgICAgICBSZXR1cm5zOgorICAgICAgICAoQSwgQiksIG51bXB5Lm1hdHJpeCwgdGhlIGNvbnRyb2wgbWF0cmljaWVzLgorICAgICIiIgorICAgIHJldHVybiBjb250cm9scy5jMmQoQV9jb250aW51b3VzLCBCX2NvbnRpbnVvdXMsIGR0KQorCisgIGRlZiBJbml0aWFsaXplU3RhdGUoc2VsZik6CisgICAgIiIiU2V0cyBYLCBZLCBhbmQgWF9oYXQgdG8gemVybyBkZWZhdWx0cy4iIiIKKyAgICBzZWxmLlggPSBudW1weS56ZXJvcygoc2VsZi5BLnNoYXBlWzBdLCAxKSkKKyAgICBzZWxmLlkgPSBzZWxmLkMgKiBzZWxmLlgKKyAgICBzZWxmLlhfaGF0ID0gbnVtcHkuemVyb3MoKHNlbGYuQS5zaGFwZVswXSwgMSkpCisKKyAgZGVmIFBsYWNlQ29udHJvbGxlclBvbGVzKHNlbGYsIHBvbGVzKToKKyAgICAiIiJQbGFjZXMgdGhlIGNvbnRyb2xsZXIgcG9sZXMuCisKKyAgICBBcmdzOgorICAgICAgcG9sZXM6IGFycmF5LCBBbiBhcnJheSBvZiBwb2xlcy4gIE11c3QgYmUgY29tcGxleCBjb25qZWdhdGVzIGlmIHRoZXkgaGF2ZQorICAgICAgICBhbnkgaW1hZ2luYXJ5IHBvcnRpb25zLgorICAgICIiIgorICAgIHNlbGYuSyA9IGNvbnRyb2xzLmRwbGFjZShzZWxmLkEsIHNlbGYuQiwgcG9sZXMpCisKKyAgZGVmIFBsYWNlT2JzZXJ2ZXJQb2xlcyhzZWxmLCBwb2xlcyk6CisgICAgIiIiUGxhY2VzIHRoZSBvYnNlcnZlciBwb2xlcy4KKworICAgIEFyZ3M6CisgICAgICBwb2xlczogYXJyYXksIEFuIGFycmF5IG9mIHBvbGVzLiAgTXVzdCBiZSBjb21wbGV4IGNvbmplZ2F0ZXMgaWYgdGhleSBoYXZlCisgICAgICAgIGFueSBpbWFnaW5hcnkgcG9ydGlvbnMuCisgICAgIiIiCisgICAgc2VsZi5MID0gY29udHJvbHMuZHBsYWNlKHNlbGYuQS5ULCBzZWxmLkMuVCwgcG9sZXMpLlQKKworICBkZWYgVXBkYXRlKHNlbGYsIFUpOgorICAgICIiIlNpbXVsYXRlcyBvbmUgdGltZSBzdGVwIHdpdGggdGhlIHByb3ZpZGVkIFUuIiIiCisgICAgI1UgPSBudW1weS5jbGlwKFUsIHNlbGYuVV9taW4sIHNlbGYuVV9tYXgpCisgICAgc2VsZi5YID0gc2VsZi5BICogc2VsZi5YICsgc2VsZi5CICogVQorICAgIHNlbGYuWSA9IHNlbGYuQyAqIHNlbGYuWCArIHNlbGYuRCAqIFUKKworICBkZWYgUHJlZGljdE9ic2VydmVyKHNlbGYsIFUpOgorICAgICIiIlJ1bnMgdGhlIHByZWRpY3Qgc3RlcCBvZiB0aGUgb2JzZXJ2ZXIgdXBkYXRlLiIiIgorICAgIHNlbGYuWF9oYXQgPSAoc2VsZi5BICogc2VsZi5YX2hhdCArIHNlbGYuQiAqIFUpCisKKyAgZGVmIENvcnJlY3RPYnNlcnZlcihzZWxmLCBVKToKKyAgICAiIiJSdW5zIHRoZSBjb3JyZWN0IHN0ZXAgb2YgdGhlIG9ic2VydmVyIHVwZGF0ZS4iIiIKKyAgICBzZWxmLlhfaGF0ICs9IG51bXB5LmxpbmFsZy5pbnYoc2VsZi5BKSAqIHNlbGYuTCAqICgKKyAgICAgICAgc2VsZi5ZIC0gc2VsZi5DICogc2VsZi5YX2hhdCAtIHNlbGYuRCAqIFUpCisKKyAgZGVmIFVwZGF0ZU9ic2VydmVyKHNlbGYsIFUpOgorICAgICIiIlVwZGF0ZXMgdGhlIG9ic2VydmVyIGdpdmVuIHRoZSBwcm92aWRlZCBVLiIiIgorICAgIHNlbGYuWF9oYXQgPSAoc2VsZi5BICogc2VsZi5YX2hhdCArIHNlbGYuQiAqIFUgKworICAgICAgICAgICAgICAgICAgc2VsZi5MICogKHNlbGYuWSAtIHNlbGYuQyAqIHNlbGYuWF9oYXQgLSBzZWxmLkQgKiBVKSkKKworICBkZWYgX0R1bXBNYXRyaXgoc2VsZiwgbWF0cml4X25hbWUsIG1hdHJpeCk6CisgICAgIiIiRHVtcHMgdGhlIHByb3ZpZGVkIG1hdHJpeCBpbnRvIGEgdmFyaWFibGUgY2FsbGVkIG1hdHJpeF9uYW1lLgorCisgICAgQXJnczoKKyAgICAgIG1hdHJpeF9uYW1lOiBzdHJpbmcsIFRoZSB2YXJpYWJsZSBuYW1lIHRvIHNhdmUgdGhlIG1hdHJpeCB0by4KKyAgICAgIG1hdHJpeDogVGhlIG1hdHJpeCB0byBkdW1wLgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cmluZywgVGhlIEMrKyBjb21tYW5kcyByZXF1aXJlZCB0byBwb3B1bGF0ZSBhIHZhcmlhYmxlIG5hbWVkIG1hdHJpeF9uYW1lCisgICAgICAgIHdpdGggdGhlIGNvbnRlbnRzIG9mIG1hdHJpeC4KKyAgICAiIiIKKyAgICBhbnMgPSBbJyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsICVkLCAlZD4gJXM7XG4nICUgKAorICAgICAgICBtYXRyaXguc2hhcGVbMF0sIG1hdHJpeC5zaGFwZVsxXSwgbWF0cml4X25hbWUpXQorICAgIGZpcnN0ID0gVHJ1ZQorICAgIGZvciB4IGluIHhyYW5nZShtYXRyaXguc2hhcGVbMF0pOgorICAgICAgZm9yIHkgaW4geHJhbmdlKG1hdHJpeC5zaGFwZVsxXSk6CisgICAgICAgIGVsZW1lbnQgPSBtYXRyaXhbeCwgeV0KKyAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgYW5zLmFwcGVuZCgnICAlcyA8PCAnICUgbWF0cml4X25hbWUpCisgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgIGFucy5hcHBlbmQoJywgJykKKyAgICAgICAgYW5zLmFwcGVuZChzdHIoZWxlbWVudCkpCisKKyAgICBhbnMuYXBwZW5kKCc7XG4nKQorICAgIHJldHVybiAnJy5qb2luKGFucykKKworICBkZWYgRHVtcFBsYW50SGVhZGVyKHNlbGYpOgorICAgICIiIldyaXRlcyBvdXQgYSBjKysgaGVhZGVyIGRlY2xhcmF0aW9uIHdoaWNoIHdpbGwgY3JlYXRlIGEgUGxhbnQgb2JqZWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cmluZywgVGhlIGhlYWRlciBkZWNsYXJhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uLgorICAgICIiIgorICAgIG51bV9zdGF0ZXMgPSBzZWxmLkEuc2hhcGVbMF0KKyAgICBudW1faW5wdXRzID0gc2VsZi5CLnNoYXBlWzFdCisgICAgbnVtX291dHB1dHMgPSBzZWxmLkMuc2hhcGVbMF0KKyAgICByZXR1cm4gJ1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwlZCwgJWQsICVkPiBNYWtlJXNQbGFudENvZWZmaWNpZW50cygpO1xuJyAlICgKKyAgICAgICAgbnVtX3N0YXRlcywgbnVtX2lucHV0cywgbnVtX291dHB1dHMsIHNlbGYuX25hbWUpCisKKyAgZGVmIER1bXBQbGFudChzZWxmKToKKyAgICAiIiJXcml0ZXMgb3V0IGEgYysrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY3JlYXRlIGEgUGxhbnRDb2VmZmljaWVudHMgb2JqZWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cmluZywgVGhlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBvYmplY3QuCisgICAgIiIiCisgICAgbnVtX3N0YXRlcyA9IHNlbGYuQS5zaGFwZVswXQorICAgIG51bV9pbnB1dHMgPSBzZWxmLkIuc2hhcGVbMV0KKyAgICBudW1fb3V0cHV0cyA9IHNlbGYuQy5zaGFwZVswXQorICAgIGFucyA9IFsnU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPCVkLCAlZCwgJWQ+JworICAgICAgICAgICAnIE1ha2Ulc1BsYW50Q29lZmZpY2llbnRzKCkge1xuJyAlICgKKyAgICAgICAgbnVtX3N0YXRlcywgbnVtX2lucHV0cywgbnVtX291dHB1dHMsIHNlbGYuX25hbWUpXQorCisgICAgYW5zLmFwcGVuZChzZWxmLl9EdW1wTWF0cml4KCdBJywgc2VsZi5BKSkKKyAgICBhbnMuYXBwZW5kKHNlbGYuX0R1bXBNYXRyaXgoJ0InLCBzZWxmLkIpKQorICAgIGFucy5hcHBlbmQoc2VsZi5fRHVtcE1hdHJpeCgnQycsIHNlbGYuQykpCisgICAgYW5zLmFwcGVuZChzZWxmLl9EdW1wTWF0cml4KCdEJywgc2VsZi5EKSkKKyAgICBhbnMuYXBwZW5kKHNlbGYuX0R1bXBNYXRyaXgoJ1VfbWF4Jywgc2VsZi5VX21heCkpCisgICAgYW5zLmFwcGVuZChzZWxmLl9EdW1wTWF0cml4KCdVX21pbicsIHNlbGYuVV9taW4pKQorCisgICAgYW5zLmFwcGVuZCgnICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPCVkLCAlZCwgJWQ+JworICAgICAgICAgICAgICAgJyhBLCBCLCBDLCBELCBVX21heCwgVV9taW4pO1xuJyAlIChudW1fc3RhdGVzLCBudW1faW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fb3V0cHV0cykpCisgICAgYW5zLmFwcGVuZCgnfVxuJykKKyAgICByZXR1cm4gJycuam9pbihhbnMpCisKKyAgZGVmIFBsYW50RnVuY3Rpb24oc2VsZik6CisgICAgIiIiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGxhbnQgY29lZmZpY2llbnQgZnVuY3Rpb24uIiIiCisgICAgcmV0dXJuICdNYWtlJXNQbGFudENvZWZmaWNpZW50cygpJyAlIHNlbGYuX25hbWUKKworICBkZWYgQ29udHJvbGxlckZ1bmN0aW9uKHNlbGYpOgorICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsZXIgZnVuY3Rpb24uIiIiCisgICAgcmV0dXJuICdNYWtlJXNDb250cm9sbGVyKCknICUgc2VsZi5fbmFtZQorCisgIGRlZiBEdW1wQ29udHJvbGxlckhlYWRlcihzZWxmKToKKyAgICAiIiJXcml0ZXMgb3V0IGEgYysrIGhlYWRlciBkZWNsYXJhdGlvbiB3aGljaCB3aWxsIGNyZWF0ZSBhIENvbnRyb2xsZXIgb2JqZWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIHN0cmluZywgVGhlIGhlYWRlciBkZWNsYXJhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uLgorICAgICIiIgorICAgIG51bV9zdGF0ZXMgPSBzZWxmLkEuc2hhcGVbMF0KKyAgICBudW1faW5wdXRzID0gc2VsZi5CLnNoYXBlWzFdCisgICAgbnVtX291dHB1dHMgPSBzZWxmLkMuc2hhcGVbMF0KKyAgICByZXR1cm4gJ1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPCVkLCAlZCwgJWQ+ICVzO1xuJyAlICgKKyAgICAgICAgbnVtX3N0YXRlcywgbnVtX2lucHV0cywgbnVtX291dHB1dHMsIHNlbGYuQ29udHJvbGxlckZ1bmN0aW9uKCkpCisKKyAgZGVmIER1bXBDb250cm9sbGVyKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBjKysgZnVuY3Rpb24gd2hpY2ggd2lsbCBjcmVhdGUgYSBDb250cm9sbGVyIG9iamVjdC4KKworICAgIFJldHVybnM6CisgICAgICBzdHJpbmcsIFRoZSBmdW5jdGlvbiB3aGljaCB3aWxsIGNyZWF0ZSB0aGUgb2JqZWN0LgorICAgICIiIgorICAgIG51bV9zdGF0ZXMgPSBzZWxmLkEuc2hhcGVbMF0KKyAgICBudW1faW5wdXRzID0gc2VsZi5CLnNoYXBlWzFdCisgICAgbnVtX291dHB1dHMgPSBzZWxmLkMuc2hhcGVbMF0KKyAgICBhbnMgPSBbJ1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPCVkLCAlZCwgJWQ+ICVzIHtcbicgJSAoCisgICAgICAgIG51bV9zdGF0ZXMsIG51bV9pbnB1dHMsIG51bV9vdXRwdXRzLCBzZWxmLkNvbnRyb2xsZXJGdW5jdGlvbigpKV0KKworICAgIGFucy5hcHBlbmQoc2VsZi5fRHVtcE1hdHJpeCgnTCcsIHNlbGYuTCkpCisgICAgYW5zLmFwcGVuZChzZWxmLl9EdW1wTWF0cml4KCdLJywgc2VsZi5LKSkKKyAgICBhbnMuYXBwZW5kKHNlbGYuX0R1bXBNYXRyaXgoJ0FfaW52JywgbnVtcHkubGluYWxnLmludihzZWxmLkEpKSkKKworICAgIGFucy5hcHBlbmQoJyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPCVkLCAlZCwgJWQ+JworICAgICAgICAgICAgICAgJyhMLCBLLCBBX2ludiwgTWFrZSVzUGxhbnRDb2VmZmljaWVudHMoKSk7XG4nICUgKAorICAgICAgICAgICAgICAgICAgIG51bV9zdGF0ZXMsIG51bV9pbnB1dHMsIG51bV9vdXRwdXRzLCBzZWxmLl9uYW1lKSkKKyAgICBhbnMuYXBwZW5kKCd9XG4nKQorICAgIHJldHVybiAnJy5qb2luKGFucykKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3B5dGhvbi9jb250cm9scy5weSBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3B5dGhvbi9jb250cm9scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZiZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2NvbnRyb2xzLnB5CkBAIC0wLDAgKzEsMTUzIEBACisjIS91c3IvYmluL3B5dGhvbgorCisiIiIKK0NvbnRyb2wgbG9vcCBwb2xlIHBsYWNlbWVudCBsaWJyYXJ5LgorCitUaGlzIGxpYnJhcnkgd2lsbCBncm93IHRvIHN1cHBvcnQgbWFueSBkaWZmZXJlbnQgcG9sZSBwbGFjZW1lbnQgbWV0aG9kcy4KK0N1cnJlbnRseSBpdCBvbmx5IHN1cHBvcnRzIGRpcmVjdCBwb2xlIHBsYWNlbWVudC4KKyIiIgorCitfX2F1dGhvcl9fID0gJ0F1c3RpbiBTY2h1aCAoYXVzdGluLmxpbnV4QGdtYWlsLmNvbSknCisKK2ltcG9ydCBudW1weQoraW1wb3J0IHNseWNvdAoraW1wb3J0IHNjaXB5LnNpZ25hbC5jb250MmRpc2NyZXRlCisKK2NsYXNzIEVycm9yIChFeGNlcHRpb24pOgorICAiIiJCYXNlIGNsYXNzIGZvciBhbGwgY29udHJvbCBsb29wIGV4Y2VwdGlvbnMuIiIiCisKKworY2xhc3MgUG9sZVBsYWNlbWVudEVycm9yKEVycm9yKToKKyAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHBvbGUgcGxhY2VtZW50IGZhaWxzLiIiIgorCisKKyMgVE9ETyhhc2NodWgpOiBkcGxhY2Ugc2hvdWxkIHRha2UgYSBjb250cm9sIHN5c3RlbSBvYmplY3QuCisjIFRoZXJlIHNob3VsZCBhbHNvIGV4aXN0IGEgZnVuY3Rpb24gdG8gbWFuaXB1bGF0ZSBsYXBsYWNlIGV4cHJlc3Npb25zLCBhbmQKKyMgc29tZXRoaW5nIHRvIHBsb3QgYm9kZSBwbG90cyBhbmQgYWxsIHRoYXQuCitkZWYgZHBsYWNlKEEsIEIsIHBvbGVzLCBhbHBoYT0xZS02KToKKyAgIiIiU2V0IHRoZSBwb2xlcyBvZiAoQSAtIEJGKSB0byBwb2xlcy4KKworICBBcmdzOgorICAgIEE6IG51bXB5Lm1hdHJpeChuIHggbiksIFRoZSBBIG1hdHJpeC4KKyAgICBCOiBudW1weS5tYXRyaXgobiB4IG0pLCBUaGUgQiBtYXRyaXguCisgICAgcG9sZXM6IGFycmF5KGltYWdpbmFyeSBudW1iZXJzKSwgVGhlIHBvbGVzIHRvIHVzZS4gIENvbXBsZXggY29uanVnYXRlcyBwb2xlcworICAgICAgbXVzdCBiZSBpbiBwYWlycy4KKworICBSYWlzZXM6CisgICAgVmFsdWVFcnJvcjogQXJndW1lbnRzIHdlcmUgdGhlIHdyb25nIHNoYXBlIG9yIHRoZXJlIHdlcmUgdG9vIG1hbnkgcG9sZXMuCisgICAgUG9sZVBsYWNlbWVudEVycm9yOiBQb2xlIHBsYWNlbWVudCBmYWlsZWQuCisKKyAgUmV0dXJuczoKKyAgICBudW1weS5tYXRyaXgobSB4IG4pLCBLCisgICIiIgorICAjIFNlZSBodHRwOi8vd3d3LmljbS50dS1icy5kZS9OSUNPTkVUL2RvYy9TQjAxQkQuaHRtbCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgIyBmb3J0cmFuIGNvZGUgdGhhdCB0aGlzIGlzIGNsZWFuaW5nIHVwIHRoZSBpbnRlcmZhY2UgdG8uCisgIG4gPSBBLnNoYXBlWzBdCisgIGlmIEEuc2hhcGVbMV0gIT0gbjoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJBIG11c3QgYmUgc3F1YXJlIikKKyAgaWYgQi5zaGFwZVswXSAhPSBuOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoIkIgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBzdGF0ZXMgYXMgQS4iKQorICBtID0gQi5zaGFwZVsxXQorCisgIG51bV9wb2xlcyA9IGxlbihwb2xlcykKKyAgaWYgbnVtX3BvbGVzID4gbjoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJUcnlpbmcgdG8gcGxhY2UgbW9yZSBwb2xlcyB0aGFuIHN0YXRlcy4iKQorCisgIG91dCA9IHNseWNvdC5zYjAxYmQobj1uLAorICAgICAgICAgICAgICAgICAgICAgIG09bSwKKyAgICAgICAgICAgICAgICAgICAgICBucD1udW1fcG9sZXMsCisgICAgICAgICAgICAgICAgICAgICAgYWxwaGE9YWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgQT1BLAorICAgICAgICAgICAgICAgICAgICAgIEI9QiwKKyAgICAgICAgICAgICAgICAgICAgICB3PW51bXB5LmFycmF5KHBvbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICBkaWNvPSdEJykKKworICBBX3ogPSBudW1weS5tYXRyaXgob3V0WzBdKQorICBudW1fdG9vX3NtYWxsX2VpZ2VudmFsdWVzID0gb3V0WzJdCisgIG51bV9hc3NpZ25lZF9laWdlbnZhbHVlcyA9IG91dFszXQorICBudW1fdW5jb250cm9sbGFibGVfZWlnZW52YWx1ZXMgPSBvdXRbNF0KKyAgSyA9IG51bXB5Lm1hdHJpeCgtb3V0WzVdKQorICBaID0gbnVtcHkubWF0cml4KG91dFs2XSkKKworICBpZiBudW1fdG9vX3NtYWxsX2VpZ2VudmFsdWVzICE9IDA6CisgICAgcmFpc2UgUG9sZVBsYWNlbWVudEVycm9yKCJOdW1iZXIgb2YgZWlnZW52YWx1ZXMgdGhhdCBhcmUgdG9vIHNtYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhcmUgdGhlcmVmb3JlIHVubW9kaWZpZWQgaXMgJWQuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90b29fc21hbGxfZWlnZW52YWx1ZXMpCisgIGlmIG51bV9hc3NpZ25lZF9laWdlbnZhbHVlcyAhPSBudW1fcG9sZXM6CisgICAgcmFpc2UgUG9sZVBsYWNlbWVudEVycm9yKCJEaWQgbm90IHBsYWNlIGFsbCB0aGUgZWlnZW52YWx1ZXMgdGhhdCB3ZXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZC4gT25seSBwbGFjZWQgJWQgZWlnZW52YWx1ZXMuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hc3NpZ25lZF9laWdlbnZhbHVlcykKKyAgaWYgbnVtX3VuY29udHJvbGxhYmxlX2VpZ2VudmFsdWVzICE9IDA6CisgICAgcmFpc2UgUG9sZVBsYWNlbWVudEVycm9yKCJGb3VuZCAlZCB1bmNvbnRyb2xsYWJsZSBlaWdlbnZsYXVlcy4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3VuY29udHJvbGxhYmxlX2VpZ2VudmFsdWVzKQorCisgIHJldHVybiBLCisKKworZGVmIGMyZChBLCBCLCBkdCk6CisgICIiIkNvbnZlcnRzIGZyb20gY29udGludW91cyB0aW1lIHN0YXRlIHNwYWNlIHJlcHJlc2VudGF0aW9uIHRvIGRpc2NyZXRlIHRpbWUuCisgICAgIFJldHVybnMgKEEsIEIpLiAgQyBhbmQgRCBhcmUgdW5jaGFuZ2VkLiIiIgorCisgIGFuc19hLCBhbnNfYiwgXywgXywgXyA9IHNjaXB5LnNpZ25hbC5jb250MmRpc2NyZXRlKChBLCBCLCBOb25lLCBOb25lKSwgZHQpCisgIHJldHVybiBudW1weS5tYXRyaXgoYW5zX2EpLCBudW1weS5tYXRyaXgoYW5zX2IpCisKK2RlZiBjdHJiKEEsIEIpOgorICAiIiJSZXR1cm5zIHRoZSBjb250cm9sYWJpbGl0eSBtYXRyaXguCisKKyAgICBUaGlzIG1hdHJpeCBtdXN0IGhhdmUgZnVsbCByYW5rIGZvciBhbGwgdGhlIHN0YXRlcyB0byBiZSBjb250cm9sYWJsZS4KKyAgIiIiCisgIG4gPSBBLnNoYXBlWzBdCisgIG91dHB1dCA9IEIKKyAgaW50ZXJtZWRpYXRlID0gQgorICBmb3IgaSBpbiB4cmFuZ2UoMCwgbik6CisgICAgaW50ZXJtZWRpYXRlID0gQSAqIGludGVybWVkaWF0ZQorICAgIG91dHB1dCA9IG51bXB5LmNvbmNhdGVuYXRlKChvdXRwdXQsIGludGVybWVkaWF0ZSksIGF4aXM9MSkKKworICByZXR1cm4gb3V0cHV0CisKK2RlZiBkbHFyKEEsIEIsIFEsIFIpOgorICAiIiJTb2x2ZXMgZm9yIHRoZSBvcHRpbWFsIGxxciBjb250cm9sbGVyLgorCisgICAgeChuKzEpID0gQSAqIHgobikgKyBCICogdShuKQorICAgIEogPSBzdW0oMCwgaW5mLCB4LlQgKiBRICogeCArIHUuVCAqIFIgKiB1KQorICAiIiIKKworICAjIFAgPSAoQS5UICogUCAqIEEpIC0gKEEuVCAqIFAgKiBCICogbnVtcHkubGluYWxnLmludihSICsgQi5UICogUCAqQikgKiAoQS5UICogUC5UICogQikuVCArIFEKKworICBQLCByY29uZCwgdywgUywgVCA9IHNseWNvdC5zYjAyb2QoCisgICAgICBuPUEuc2hhcGVbMF0sIG09Qi5zaGFwZVsxXSwgQT1BLCBCPUIsIFE9USwgUj1SLCBkaWNvPSdEJykKKworICBGID0gbnVtcHkubGluYWxnLmludihSICsgQi5UICogUCAqQikgKiBCLlQgKiBQICogQQorICByZXR1cm4gRgorCitkZWYga2FsbWFuKEEsIEIsIEMsIFEsIFIpOgorICAiIiJTb2x2ZXMgZm9yIHRoZSBzdGVhZHkgc3RhdGUga2FsbWFuIGdhaW4gYW5kIGNvdmFyaWFuY2UgbWF0cmljaWVzLgorCisgICAgQXJnczoKKyAgICAgIEEsIEIsIEM6IFNTIG1hdHJpY2llcy4KKyAgICAgIFE6IFRoZSBtb2RlbCB1bmNlcnRhbnRpdHkKKyAgICAgIFI6IFRoZSBtZWFzdXJlbWVudCB1bmNlcnRhaW50eQorCisgICAgUmV0dXJuczoKKyAgICAgIEthbG1hbkdhaW4sIENvdmFyaWFuY2UuCisgICIiIgorICBQID0gUQorCisgIEkgPSBudW1weS5tYXRyaXgobnVtcHkuZXllKFAuc2hhcGVbMF0pKQorICBBdCA9IEEuVAorICBDdCA9IEMuVAorICBpID0gMAorCisgIHdoaWxlIFRydWU6CisgICAgbGFzdF9QID0gUAorICAgIFBfcHJpb3IgPSBBICogUCAqIEF0ICsgUQorICAgIFMgPSBDICogUF9wcmlvciAqIEN0ICsgUgorICAgIEsgPSBQX3ByaW9yICogQ3QgKiBudW1weS5saW5hbGcuaW52KFMpCisgICAgUCA9IChJIC0gSyAqIEMpICogUF9wcmlvcgorCisgICAgZGlmZiA9IFAgLSBsYXN0X1AKKyAgICBpICs9IDEKKyAgICBpZiBudW1weS5saW5hbGcubm9ybShkaWZmKSAvIG51bXB5LmxpbmFsZy5ub3JtKFApIDwgMWUtOToKKyAgICAgIGJyZWFrCisKKyAgcmV0dXJuIEssIFAKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3B5dGhvbi9saWJjZGQucHkgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vbGliY2RkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiODFhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vbGliY2RkLnB5CkBAIC0wLDAgKzEsMTMwIEBACisjIS91c3IvYmluL3B5dGhvbgorCisiIiJXcmFwcGVyIGFyb3VuZCBsaWJjZGQsIGEgcG9seXRvcGUgbWFuaXB1bGF0aW9uIGxpYnJhcnkuIiIiCisKK19fYXV0aG9yX18gPSAnQXVzdGluIFNjaHVoIChhdXN0aW4ubGludXhAZ21haWwuY29tKScKKworaW1wb3J0IGN0eXBlcworaW1wb3J0IHN5cworCisjIFdyYXBwZXIgYXJvdW5kIFB5RmlsZV9Bc0ZpbGUgc28gdGhhdCB3ZSBjYW4gcHJpbnQgb3V0IHRoZSBlcnJvciBtZXNzYWdlcy4KKyMgU2V0IHRoZSBhcmcgdHlwZSBhbmQgcmV0dXJuIHR5cGVzIG9mIHRoZSBmdW5jdGlvbiBjYWxsLgorY2xhc3MgRklMRShjdHlwZXMuU3RydWN0dXJlKToKKyAgcGFzcworCitjdHlwZXMucHl0aG9uYXBpLlB5RmlsZV9Bc0ZpbGUuYXJndHlwZXMgPSBbY3R5cGVzLnB5X29iamVjdF0KK2N0eXBlcy5weXRob25hcGkuUHlGaWxlX0FzRmlsZS5yZXN0eXBlID0gY3R5cGVzLlBPSU5URVIoRklMRSkKKworIyBMb2FkIGFuZCBpbml0IGxpYmNkZC4gIGxpYmNkZCBpcyBhIEMgbGlicmFyeSB0aGF0IGltcGxlbWVudHMgYWxnb3JpdGhtIHRvCisjIG1hbmlwdWxhdGUgaGFsZiBzcGFjZSBhbmQgdmVydGV4IHJlcHJlc2VudGF0aW9ucyBvZiBwb2x5dG9wZXMuCisjIFVuZm9ydHVuYXRlbHksIHRoZSBsaWJyYXJ5IHdhcyBjb21waWxlZCB3aXRoIEMrKyBldmVuIHRob3VnaCBpdCBoYXMgYSBsb3Qgb2YgQworIyBjb2RlIGluIGl0LCBzbyBhbGwgdGhlIHN5bWJvbCBuYW1lcyBhcmUgbWFuZ2xlZC4gIFVnLgorbGliY2RkID0gY3R5cGVzLmNkbGwuTG9hZExpYnJhcnkoJ2xpYmNkZC5zbycpCitsaWJjZGQuX1oyM2RkX3NldF9nbG9iYWxfY29uc3RhbnRzdigpCisKKyMgVGhlIHZhcmlhYmxlIHR5cGUgbXl0eXBlIHRoYXQgbGliY2RkIGRlZmluZXMgKGRvdWJsZVsxXSkKKyMgU2VlIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L2N0eXBlcy5odG1sI2FycmF5cyBmb3IgdGhlIGRvY3VtZW50YXRpb24KKyMgZXhwbGFpbmluZyB3aHkgY3R5cGVzLmNfZG91YmxlICogMSA9PiBkb3VibGVbMV0KKyMgbGliY2RkIGRlZmluZXMgbXl0eXBlIHRvIHZhcmlvdXMgdGhpbmdzIHNvIGl0IGNhbiBlc3NlbnRpYWxseSB0ZW1wbGF0ZSBpdHMKKyMgZnVuY3Rpb25zLiAgV2hhdCBhIHdlaXJkIGxpYnJhcnkuCitteXR5cGUgPSBjdHlwZXMuY19kb3VibGUgKiAxCisKKworIyBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB0aGUgcG9seWhlZHJhIGRhdGEgc3RydWN0dXJlLgorY2xhc3MgZGRfcG9seWhlZHJhZGF0YShjdHlwZXMuU3RydWN0dXJlKToKKyAgcGFzcworCisKKyMgRGVmaW5pdGlvbiBvZiBkZF9tYXRyaXhkYXRhCitjbGFzcyBkZF9tYXRyaXhkYXRhKGN0eXBlcy5TdHJ1Y3R1cmUpOgorICBfZmllbGRzXyA9IFsKKyAgICAgICgicm93c2l6ZSIsIGN0eXBlcy5jX2xvbmcpLAorICAgICAgKCJsaW5zZXQiLCBjdHlwZXMuUE9JTlRFUihjdHlwZXMuY191bG9uZykpLAorICAgICAgKCJjb2xzaXplIiwgY3R5cGVzLmNfbG9uZyksCisgICAgICAoInJlcHJlc2VudGF0aW9uIiwgY3R5cGVzLmNfaW50KSwKKyAgICAgICgibnVtYnR5cGUiLCBjdHlwZXMuY19pbnQpLAorICAgICAgKCJtYXRyaXgiLCBjdHlwZXMuUE9JTlRFUihjdHlwZXMuUE9JTlRFUihteXR5cGUpKSksCisgICAgICAoIm9iamVjdGl2ZSIsIGN0eXBlcy5jX2ludCksCisgICAgICAoInJvd3ZlYyIsIGN0eXBlcy5QT0lOVEVSKG15dHlwZSkpLAorICBdCisKKyMgRGVmaW5lIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzIGZvciBhIGJ1bmNoIG9mIGxpYmNkZCBmdW5jdGlvbnMuCitsaWJjZGQuX1oxNWRkX0NyZWF0ZU1hdHJpeGxsLnJlc3R5cGUgPSBjdHlwZXMuUE9JTlRFUihkZF9tYXRyaXhkYXRhKQorbGliY2RkLl9aOWRkZF9nZXRfZFBkLmFyZ3R5cGVzID0gW215dHlwZV0KK2xpYmNkZC5fWjlkZGRfZ2V0X2RQZC5yZXN0eXBlID0gY3R5cGVzLmNfZG91YmxlCisKK2xpYmNkZC5fWjE3ZGRfQ29weUdlbmVyYXRvcnNQMTZkZF9wb2x5aGVkcmFkYXRhLmFyZ3R5cGVzID0gWworICAgIGN0eXBlcy5QT0lOVEVSKGRkX3BvbHloZWRyYWRhdGEpCitdCitsaWJjZGQuX1oxN2RkX0NvcHlHZW5lcmF0b3JzUDE2ZGRfcG9seWhlZHJhZGF0YS5yZXN0eXBlID0gY3R5cGVzLlBPSU5URVIoZGRfbWF0cml4ZGF0YSkKKworbGliY2RkLl9aMTZkZF9ERE1hdHJpeDJQb2x5UDEzZGRfbWF0cml4ZGF0YVAxMmRkX0Vycm9yVHlwZS5hcmd0eXBlcyA9IFsKKyAgICBjdHlwZXMuUE9JTlRFUihkZF9tYXRyaXhkYXRhKSwKKyAgICBjdHlwZXMuUE9JTlRFUihjdHlwZXMuY19pbnQpCitdCitsaWJjZGQuX1oxNmRkX0RETWF0cml4MlBvbHlQMTNkZF9tYXRyaXhkYXRhUDEyZGRfRXJyb3JUeXBlLnJlc3R5cGUgPSAoCisgIGN0eXBlcy5QT0lOVEVSKGRkX3BvbHloZWRyYWRhdGEpKQorCitsaWJjZGQuX1oxM2RkX0ZyZWVNYXRyaXhQMTNkZF9tYXRyaXhkYXRhLmFyZ3R5cGVzID0gWworICAgIGN0eXBlcy5QT0lOVEVSKGRkX21hdHJpeGRhdGEpCitdCisKK2xpYmNkZC5fWjE2ZGRfRnJlZVBvbHloZWRyYVAxNmRkX3BvbHloZWRyYWRhdGEuYXJndHlwZXMgPSBbCisgIGN0eXBlcy5QT0lOVEVSKGRkX3BvbHloZWRyYWRhdGEpCitdCisKK2xpYmNkZC5fWjlkZGRfc2V0X2RQZGQuYXJndHlwZXMgPSBbCisgIG15dHlwZSwKKyAgY3R5cGVzLmNfZG91YmxlCitdCisKKworIyBWYXJpb3VzIGVudW1zLgorRERfSU5FUVVBTElUWSA9IDEKK0REX1JFQUwgPSAxCitERF9OT19FUlJPUlMgPSAxNworCisKK2RlZiBkZF9DcmVhdGVNYXRyaXgocm93cywgY29scyk6CisgIHJldHVybiBsaWJjZGQuX1oxNWRkX0NyZWF0ZU1hdHJpeGxsKAorICAgICAgY3R5cGVzLmNfbG9uZyhyb3dzKSwKKyAgICAgIGN0eXBlcy5jX2xvbmcoY29scykpCisKKworZGVmIGRkX3NldF9kKG15dHlwZV9hZGRyZXNzLCBkb3VibGVfdmFsdWUpOgorICBsaWJjZGQuX1o5ZGRkX3NldF9kUGRkKG15dHlwZV9hZGRyZXNzLAorICAgICAgY3R5cGVzLmNfZG91YmxlKGRvdWJsZV92YWx1ZSkpCisKKworZGVmIGRkX0NvcHlHZW5lcmF0b3JzKHBvbHloZWRyYXB0cik6CisgIHJldHVybiBsaWJjZGQuX1oxN2RkX0NvcHlHZW5lcmF0b3JzUDE2ZGRfcG9seWhlZHJhZGF0YShwb2x5aGVkcmFwdHIpCisKKworZGVmIGRkX2dldF9kKG15dHlwZV9hZGRyZXNzKToKKyAgcmV0dXJuIGxpYmNkZC5fWjlkZGRfZ2V0X2RQZChteXR5cGVfYWRkcmVzcykKKworCitkZWYgZGRfRnJlZU1hdHJpeChtYXRyaXhwdHIpOgorICBsaWJjZGQuX1oxM2RkX0ZyZWVNYXRyaXhQMTNkZF9tYXRyaXhkYXRhKG1hdHJpeHB0cikKKworCitkZWYgZGRfRnJlZVBvbHloZWRyYShwb2x5aGVkcmFwdHIpOgorICBsaWJjZGQuX1oxNmRkX0ZyZWVQb2x5aGVkcmFQMTZkZF9wb2x5aGVkcmFkYXRhKHBvbHloZWRyYXB0cikKKworCitkZWYgZGRfRERNYXRyaXgyUG9seShtYXRyaXhwdHIpOgorICBlcnJvciA9IGN0eXBlcy5jX2ludCgpCisgIHBvbHloZWRyYXB0ciA9IGxpYmNkZC5fWjE2ZGRfRERNYXRyaXgyUG9seVAxM2RkX21hdHJpeGRhdGFQMTJkZF9FcnJvclR5cGUoCisgICAgICBtYXRyaXhwdHIsCisgICAgICBjdHlwZXMuYnlyZWYoZXJyb3IpKQorCisgICMgUmV0dXJuIE5vbmUgb24gZXJyb3IuCisgICMgVGhlIGVycm9yIHZhbHVlcyBhcmUgZW51bXMsIHNvIHRoZXkgYXJlbid0IGV4cG9zZWQuCisgIGlmIGVycm9yLnZhbHVlICE9IEREX05PX0VSUk9SUzoKKyAgICAjIER1bXAgb3V0IHRoZSBlcnJvcnMgdG8gc3RkZXJyCisgICAgbGliY2RkLl9aMjFkZF9Xcml0ZUVycm9yTWVzc2FnZXNQOF9JT19GSUxFMTJkZF9FcnJvclR5cGUoCisgICAgICAgIGN0eXBlcy5weXRob25hcGkuUHlGaWxlX0FzRmlsZShjdHlwZXMucHlfb2JqZWN0KHN5cy5zdGRvdXQpKSwKKyAgICAgICAgZXJyb3IpCisgICAgZGRfRnJlZVBvbHloZWRyYShwb2x5aGVkcmFwdHIpCisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHBvbHloZWRyYXB0cgpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uL3BvbHl0b3BlLnB5IGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uL3BvbHl0b3BlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGExNjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vcG9seXRvcGUucHkKQEAgLTAsMCArMSwyMjQgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyIiIgorUG9seWhlZHJhbCBzZXQgbGlicmFyeS4KKworVGhpcyBsaWJyYXJ5IGltcGxlbWVudHMgY29udmV4IHJlZ2lvbnMgb2YgdGhlIGZvcm0gSCB4IDw9IGssIHdoZXJlIEgsIHgsIGFuZCBrCithcmUgbWF0cmljaWVzLiAgSXQgYWxzbyBwcm92aWRlcyBjb252ZW5pZW50IG1ldGhvZHMgdG8gZmluZCBhbGwgdGhlIHZlcnRpY2llcy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ0F1c3RpbiBTY2h1aCAoYXVzdGluLmxpbnV4QGdtYWlsLmNvbSknCisKKworaW1wb3J0IGxpYmNkZAoraW1wb3J0IG51bXB5CitpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3lzCisKKworZGVmIF9QaWVjZXdpc2VDb25jYXQoKmFyZ3MpOgorICAiIiJDb25jYXRlbmF0ZXMgc3RyaW5ncyBpbnNpZGUgbGlzdHMsIGVsZW1lbnR3aXNlLgorCisgIEdpdmVuIFsnYScsICdzJ10gYW5kIFsnZCcsICdmJ10sIHJldHVybnMgWydhZCcsICdzZiddCisgICIiIgorICByZXR1cm4gbWFwKCcnLmpvaW4sIHppcCgqYXJncykpCisKKworZGVmIF9TcGxpdEFuZFBhZChzKToKKyAgIiIiU3BsaXRzIGEgc3RyaW5nIG9uIG5ld2xpbmVzLCBhbmQgcGFkcyB0aGUgbGluZXMgdG8gYmUgdGhlIHNhbWUgd2lkdGguIiIiCisgIHNwbGl0X3N0cmluZyA9IHMuc3BsaXQoJ1xuJykKKyAgd2lkdGggPSBtYXgobGVuKHN0cmluZ3BpZWNlKSBmb3Igc3RyaW5ncGllY2UgaW4gc3BsaXRfc3RyaW5nKSArIDEKKworICBwYWRkZWRfc3RyaW5ncyA9IFtzdHJpbmcubGp1c3Qoc3RyaW5ncGllY2UsIHdpZHRoLCAnICcpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3RyaW5ncGllY2UgaW4gc3BsaXRfc3RyaW5nXQorICByZXR1cm4gcGFkZGVkX3N0cmluZ3MKKworCitkZWYgX1BhZEhlaWdodChwYWRkZWRfYXJyYXksIG1pbl9oZWlnaHQpOgorICAiIiJBZGRzIGxpbmVzIG9mIHNwYWNlcyB0byB0aGUgdG9wIGFuZCBib3R0b20gb2YgYW4gYXJyYXkgc3ltbWV0cmljYWxseS4iIiIKKyAgaGVpZ2h0ID0gbGVuKHBhZGRlZF9hcnJheSkKKyAgaWYgaGVpZ2h0IDwgbWluX2hlaWdodDoKKyAgICBwYWRfYXJyYXkgPSBbJyAnICogbGVuKHBhZGRlZF9hcnJheVswXSldCisgICAgaGVpZ2h0X2Vycm9yID0gbWluX2hlaWdodCAtIGhlaWdodAorICAgIHJldHVybiAocGFkX2FycmF5ICogKChoZWlnaHRfZXJyb3IpIC8gMikgKworICAgICAgICAgICAgcGFkZGVkX2FycmF5ICsKKyAgICAgICAgICAgIHBhZF9hcnJheSAqICgoaGVpZ2h0X2Vycm9yICsgMSkgLyAyKSkKKyAgcmV0dXJuIHBhZGRlZF9hcnJheQorCisKK2NsYXNzIEhQb2x5dG9wZShvYmplY3QpOgorICAiIiJUaGlzIG9iamVjdCByZXByZXNlbnRzIGEgSC1wb2x5dG9wZS4KKworICBQb2x5dG9wZXMgYXJlIGNvbnZleCByZWdpb25zIGluIG4tZGltZW5zaW9uYWwgc3BhY2UuCisgIEZvciBILXBvbHl0b3BlcywgdGhpcyBpcyByZXByZXNlbnRlZCBhcyB0aGUgaW50ZXJzZWN0aW9uIG9mIGEgc2V0IG9mIGhhbGYKKyAgcGxhbmVzLiAgVGhlIG1hdGhlbWF0aWMgZXF1YXRpb24gdGhhdCByZXByZXNlbnRzIHRoaXMgaXMgSCB4IDw9IGsuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBILCBrKToKKyAgICAiIiJDb25zdHJ1Y3RzIGEgSC1wb2x5dG9wZSBmcm9tIHRoZSBIIGFuZCBrIG1hdHJpY2llcy4KKworICAgIEFyZ3M6CisgICAgICBIOiBudW1weS5NYXRyaXggKG4gYnkgayksIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBjb25zdHJhaW50cywgYW5kIGsgaXMKKyAgICAgICAgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIHRoZSBzcGFjZS4gIERvZXMgbm90IGNvcHkgdGhlIG1hdHJpeC4KKyAgICAgIGs6IG51bXB5Lk1hdHJpeCAobiBieSAxKS4gIERvZXMgbm90IGNvcHkgdGhlIG1hdHJpeC4KKyAgICAiIiIKKyAgICBzZWxmLl9IID0gSAorICAgIHNlbGYuX2sgPSBrCisKKyAgQHByb3BlcnR5CisgIGRlZiBrKHNlbGYpOgorICAgICIiIlJldHVybnMgdGhlIGsgaW4gSCB4IDw9IGsuIiIiCisgICAgcmV0dXJuIHNlbGYuX2sKKworICBAcHJvcGVydHkKKyAgZGVmIEgoc2VsZik6CisgICAgIiIiUmV0dXJucyB0aGUgSCBpbiBIIHggPD0gay4iIiIKKyAgICByZXR1cm4gc2VsZi5fSAorCisgIEBwcm9wZXJ0eQorICBkZWYgbmRpbShzZWxmKToKKyAgICAiIiJSZXR1cm5zIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNldC4iIiIKKyAgICByZXR1cm4gc2VsZi5fSC5zaGFwZVsxXQorCisgIEBwcm9wZXJ0eQorICBkZWYgbnVtX2NvbnN0cmFpbnRzKHNlbGYpOgorICAgICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBjb25zdHJhaW50cyBkZWZpbmluZyB0aGUgc2V0LiIiIgorICAgIHJldHVybiBzZWxmLl9rLnNoYXBlWzBdCisKKyAgZGVmIElzSW5zaWRlKHNlbGYsIHBvaW50KToKKyAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgcG9seXRvcGUsIGVkZ2VzIGluY2x1ZGVkLiIiIgorICAgIHJldHVybiAoc2VsZi5fSCAqIHBvaW50IDw9IHNlbGYuX2spLmFsbCgpCisKKyAgZGVmIFZlcnRpY2VzKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBtYXRyaXggd2l0aCB0aGUgdmVydGljZXMgb2YgdGhlIHNldCBpbiBpdHMgcm93cy4iIiIKKyAgICAjIFRPRE8oYXNjaHVoKTogSXQgd291bGQgYmUgYmV0dGVyIHRvIHdyaXRlIHNvbWUgc21hbGwgQy9DKysgZnVuY3Rpb24gdGhhdAorICAgICMgZG9lcyBhbGwgb2YgdGhpcyBhbmQgdGFrZXMgaW4gYSBudW1weSBhcnJheS4KKyAgICAjIFRoZSBjb3B5IGlzIGV4cGVuc2l2ZSBpbiBQeXRob24gYW5kIGNoZWFwZXIgaW4gQy4KKworICAgICMgQ3JlYXRlIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHRoZSBjb3JyZWN0IHNpemUuCisgICAgbWF0cml4cHRyID0gbGliY2RkLmRkX0NyZWF0ZU1hdHJpeChzZWxmLm51bV9jb25zdHJhaW50cywgc2VsZi5uZGltICsgMSkKKyAgICBtYXRyaXggPSBtYXRyaXhwdHIuY29udGVudHMKKworICAgIHRyeToKKyAgICAgICMgQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBtYXRyaXguCisgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5udW1fY29uc3RyYWludHMpOgorICAgICAgICBsaWJjZGQuZGRfc2V0X2QobWF0cml4Lm1hdHJpeFtpXVswXSwgc2VsZi5fa1tpLCAwXSkKKyAgICAgICAgZm9yIGogaW4geHJhbmdlKHNlbGYubmRpbSk6CisgICAgICAgICAgbGliY2RkLmRkX3NldF9kKG1hdHJpeC5tYXRyaXhbaV1baiArIDFdLCAtc2VsZi5fSFtpLCBqXSkKKworICAgICAgIyBTZXQgZW51bXMgdG8gdGhlIGNvcnJlY3QgdmFsdWVzLgorICAgICAgbWF0cml4LnJlcHJlc2VudGF0aW9uID0gbGliY2RkLkREX0lORVFVQUxJVFkKKyAgICAgIG1hdHJpeC5udW1idHlwZSA9IGxpYmNkZC5ERF9SRUFMCisKKyAgICAgICMgVE9ETyhhc2NodWgpOiBTZXQgbGluZWFyaXR5IGlmIGl0IGlzIHVzZWZ1bC4KKyAgICAgICMgVGhpcyB3b3VsZCBiZSB1c2VmdWwgaWYgd2UgaGFkIGFueSBjb25zdHJhaW50cyBzYXlpbmcgQiAtIEEgeCA9IDAKKworICAgICAgIyBCdWlsZCBhIFBvbHloZWRyYQorICAgICAgcG9seWhlZHJhcHRyID0gbGliY2RkLmRkX0RETWF0cml4MlBvbHkobWF0cml4cHRyKQorCisgICAgICBpZiBub3QgcG9seWhlZHJhcHRyOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICB0cnk6CisgICAgICAgICMgUmV0dXJuIE5vbmUgb24gZXJyb3IuCisgICAgICAgICMgVGhlIGVycm9yIHZhbHVlcyBhcmUgZW51bXMsIHNvIHRoZXkgYXJlbid0IGV4cG9zZWQuCisKKyAgICAgICAgIyBNYWdpYyBoYXBwZW5zIGhlcmUuICBDb21wdXRlcyB0aGUgdmVydGljZXMKKyAgICAgICAgdmVydGV4X21hdHJpeHB0ciA9IGxpYmNkZC5kZF9Db3B5R2VuZXJhdG9ycygKKyAgICAgICAgICAgIHBvbHloZWRyYXB0cikKKyAgICAgICAgdmVydGV4X21hdHJpeCA9IHZlcnRleF9tYXRyaXhwdHIuY29udGVudHMKKworICAgICAgICB0cnk6CisgICAgICAgICAgIyBDb3VudCB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzIGFuZCByYXlzIGluIHRoZSByZXN1bHQuCisgICAgICAgICAgbnVtX3ZlcnRpY2VzID0gMAorICAgICAgICAgIG51bV9yYXlzID0gMAorICAgICAgICAgIGZvciBpIGluIHhyYW5nZSh2ZXJ0ZXhfbWF0cml4LnJvd3NpemUpOgorICAgICAgICAgICAgaWYgbGliY2RkLmRkX2dldF9kKHZlcnRleF9tYXRyaXgubWF0cml4W2ldWzBdKSA9PSAwOgorICAgICAgICAgICAgICBudW1fcmF5cyArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICBudW1fdmVydGljZXMgKz0gMQorCisgICAgICAgICAgIyBCdWlsZCB6ZXJvZWQgbWF0cmljaWVzIGZvciB0aGUgbmV3IHZlcnRpY2VzIGFuZCByYXlzLgorICAgICAgICAgIHZlcnRpY2VzID0gbnVtcHkubWF0cml4KG51bXB5Lnplcm9zKChudW1fdmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF9tYXRyaXguY29sc2l6ZSAtIDEpKSkKKyAgICAgICAgICByYXlzID0gbnVtcHkubWF0cml4KG51bXB5Lnplcm9zKChudW1fcmF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfbWF0cml4LmNvbHNpemUgLSAxKSkpCisKKyAgICAgICAgICByYXlfaW5kZXggPSAwCisgICAgICAgICAgdmVydGV4X2luZGV4ID0gMAorCisgICAgICAgICAgIyBDb3B5IHRoZSBkYXRhIG91dCBvZiB0aGUgbWF0cml4LgorICAgICAgICAgIGZvciBpbmRleCBpbiB4cmFuZ2UodmVydGV4X21hdHJpeC5yb3dzaXplKToKKyAgICAgICAgICAgIGlmIGxpYmNkZC5kZF9nZXRfZCh2ZXJ0ZXhfbWF0cml4Lm1hdHJpeFtpbmRleF1bMF0pID09IDAuMDoKKyAgICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKHZlcnRleF9tYXRyaXguY29sc2l6ZSAtIDEpOgorICAgICAgICAgICAgICAgIHJheXNbcmF5X2luZGV4LCBqXSA9IGxpYmNkZC5kZF9nZXRfZCgKKyAgICAgICAgICAgICAgICAgICAgdmVydGV4X21hdHJpeC5tYXRyaXhbaW5kZXhdW2ogKyAxXSkKKyAgICAgICAgICAgICAgcmF5X2luZGV4ICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZSh2ZXJ0ZXhfbWF0cml4LmNvbHNpemUgLSAxKToKKyAgICAgICAgICAgICAgICB2ZXJ0aWNlc1t2ZXJ0ZXhfaW5kZXgsIGpdID0gbGliY2RkLmRkX2dldF9kKAorICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfbWF0cml4Lm1hdHJpeFtpbmRleF1baiArIDFdKQorICAgICAgICAgICAgICB2ZXJ0ZXhfaW5kZXggKz0gMQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICMgRnJlZSBldmVyeXRoaW5nLgorICAgICAgICAgIGxpYmNkZC5kZF9GcmVlTWF0cml4KHZlcnRleF9tYXRyaXhwdHIpCisKKyAgICAgIGZpbmFsbHk6CisgICAgICAgIGxpYmNkZC5kZF9GcmVlUG9seWhlZHJhKHBvbHloZWRyYXB0cikKKworICAgIGZpbmFsbHk6CisgICAgICBsaWJjZGQuZGRfRnJlZU1hdHJpeChtYXRyaXhwdHIpCisKKyAgICAjIFJheXMgYXJlIHVuc3VwcG9ydGVkIHJpZ2h0IG5vdy4gIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorICAgIGFzc2VydChyYXlzLnNoYXBlWzBdID09IDApCisKKyAgICByZXR1cm4gdmVydGljZXMKKworCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiB0aGUgcG9seXRvcGUuCisKKyAgICBUaGUgZHVtcCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgd2hpY2ggcHJpbnRzIG91dCB0aGUgbWF0cml4CisgICAgY29tcGFyaXNvbi4KKworICAgIFtbIDEgIDBdICAgICAgICAgICAgW1sxMl0KKyAgICAgWy0xICAwXSAgW1t4MF0gIDw9ICBbMTJdCisgICAgIFsgMCAgMV0gICBbeDFdXSAgICAgWzEyXQorICAgICBbIDAgLTFdXSAgICAgICAgICAgIFsxMl1dCisgICAgIiIiCisgICAgaGVpZ2h0ID0gbWF4KHNlbGYubmRpbSwgc2VsZi5udW1fY29uc3RyYWludHMpCisKKyAgICAjIFNwbGl0IHRoZSBwcmludCB1cCBpbnRvIDQgcGFydHMgYW5kIGNvbmNhdGVuYXRlIHRoZW0gYWxsLgorICAgIEhfc3RyaW5ncyA9IF9QYWRIZWlnaHQoX1NwbGl0QW5kUGFkKHN0cihzZWxmLkgpKSwgaGVpZ2h0KQorICAgIHZfc3RyaW5ncyA9IF9QYWRIZWlnaHQoX1NwbGl0QW5kUGFkKHN0cihzZWxmLmspKSwgaGVpZ2h0KQorICAgIHhfc3RyaW5ncyA9IF9QYWRIZWlnaHQoc2VsZi5fTWFrZVhTdHJpbmdzKCksIGhlaWdodCkKKyAgICBjbXBfc3RyaW5ncyA9IHNlbGYuX01ha2VDbXBTdHJpbmdzKGhlaWdodCkKKworICAgIHJldHVybiAnXG4nLmpvaW4oX1BpZWNld2lzZUNvbmNhdChIX3N0cmluZ3MsIHhfc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wX3N0cmluZ3MsIHZfc3RyaW5ncykpCisKKyAgZGVmIF9NYWtlWFN0cmluZ3Moc2VsZik6CisgICAgIiIiQnVpbGRzIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCBjb25zdHJhaW50IG5hbWVzIGluIGl0IGZvciBwcmludGluZy4iIiIKKyAgICB4X3N0cmluZ3MgPSBbXQorICAgIGlmIHNlbGYubmRpbSA9PSAxOgorICAgICAgeF9zdHJpbmdzID0gWyJbW3gwXV0gIl0KKyAgICBlbHNlOgorICAgICAgZm9yIGluZGV4IGluIHhyYW5nZShzZWxmLm5kaW0pOgorICAgICAgICBpZiBpbmRleCA9PSAwOgorICAgICAgICAgIHggPSAiW1t4JWRdICAiICUgaW5kZXgKKyAgICAgICAgZWxpZiBpbmRleCA9PSBzZWxmLm5kaW0gLSAxOgorICAgICAgICAgIHggPSAiIFt4JWRdXSAiICUgaW5kZXgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICB4ID0gIiBbeCVkXSAgIiAlIGluZGV4CisgICAgICAgIHhfc3RyaW5ncy5hcHBlbmQoeCkKKyAgICByZXR1cm4geF9zdHJpbmdzCisKKyAgZGVmIF9NYWtlQ21wU3RyaW5ncyhzZWxmLCBoZWlnaHQpOgorICAgICIiIkJ1aWxkcyBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIGNvbXBhcmlzb24gaW4gaXQgZm9yIHByaW50aW5nLiIiIgorICAgIGNtcF9zdHJpbmdzID0gW10KKyAgICBmb3IgaW5kZXggaW4geHJhbmdlKGhlaWdodCk6CisgICAgICBpZiBpbmRleCA9PSAoaGVpZ2h0IC0gMSkgLyAyOgorICAgICAgICBjbXBfc3RyaW5ncy5hcHBlbmQoIjw9ICIpCisgICAgICBlbHNlOgorICAgICAgICBjbXBfc3RyaW5ncy5hcHBlbmQoIiAgICIpCisgICAgcmV0dXJuIGNtcF9zdHJpbmdzCmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vcG9seXRvcGVfdGVzdC5weSBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3B5dGhvbi9wb2x5dG9wZV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhMzVlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vcG9seXRvcGVfdGVzdC5weQpAQCAtMCwwICsxLDE5MiBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IG51bXB5Citmcm9tIG51bXB5LnRlc3RpbmcgaW1wb3J0ICoKK2ltcG9ydCBwb2x5dG9wZQoraW1wb3J0IHVuaXR0ZXN0CisKK19fYXV0aG9yX18gPSAnQXVzdGluIFNjaHVoIChhdXN0aW4ubGludXhAZ21haWwuY29tKScKKworZGVmIE1ha2VQb2ludCgqYXJncyk6CisgICIiIk1ha2VzIGEgcG9pbnQgZnJvbSBhIHNldCBvZiBhcmd1bWVudHMuIiIiCisgIHJldHVybiBudW1weS5tYXRyaXgoW1thcmddIGZvciBhcmcgaW4gYXJnc10pCisKK2NsYXNzIFRlc3RIUG9seXRvcGUodW5pdHRlc3QuVGVzdENhc2UpOgorICBkZWYgc2V0VXAoc2VsZik6CisgICAgIiIiQnVpbGRzIGEgc2ltcGxlIGJveCBwb2x5dG9wZS4iIiIKKyAgICBzZWxmLkggPSBudW1weS5tYXRyaXgoW1sxLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFstMSwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgLTFdXSkKKyAgICBzZWxmLmsgPSBudW1weS5tYXRyaXgoW1sxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMl1dKQorICAgIHNlbGYucCA9IHBvbHl0b3BlLkhQb2x5dG9wZShzZWxmLkgsIHNlbGYuaykKKworICBkZWYgdGVzdF9IayhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IEggYW5kIGsgYXJlIHNhdmVkIGNvcnJlY3RseS4iIiIKKyAgICBhc3NlcnRfYXJyYXlfZXF1YWwoc2VsZi5wLkgsIHNlbGYuSCkKKyAgICBhc3NlcnRfYXJyYXlfZXF1YWwoc2VsZi5wLmssIHNlbGYuaykKKworICBkZWYgdGVzdF9Jc0luc2lkZShzZWxmKToKKyAgICAiIiJUZXN0cyBJc0luc2lkZSBmb3IgdmFyaW91cyBwb2ludHMuIiIiCisgICAgaW5zaWRlX3BvaW50cyA9IFsKKyAgICAgIE1ha2VQb2ludCgwLCAwKSwKKyAgICAgIE1ha2VQb2ludCg2LCA2KSwKKyAgICAgIE1ha2VQb2ludCgxMiwgNiksCisgICAgICBNYWtlUG9pbnQoLTYsIDEwKV0KKyAgICBvdXRzaWRlX3BvaW50cyA9IFsKKyAgICAgIE1ha2VQb2ludCgxNCwgMCksCisgICAgICBNYWtlUG9pbnQoLTE0LCAwKSwKKyAgICAgIE1ha2VQb2ludCgwLCAxNCksCisgICAgICBNYWtlUG9pbnQoMCwgLTE0KSwKKyAgICAgIE1ha2VQb2ludCgxNCwgLTE0KV0KKworICAgIGZvciBpbnNpZGVfcG9pbnQgaW4gaW5zaWRlX3BvaW50czoKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnAuSXNJbnNpZGUoaW5zaWRlX3BvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICBtc2c9J1BvaW50IGlzJyArIHN0cihpbnNpZGVfcG9pbnQpKQorCisgICAgZm9yIG91dHNpZGVfcG9pbnQgaW4gb3V0c2lkZV9wb2ludHM6CisgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucC5Jc0luc2lkZShvdXRzaWRlX3BvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdQb2ludCBpcycgKyBzdHIob3V0c2lkZV9wb2ludCkpCisKKyAgZGVmIEFyZVZlcnRpY2VzKHNlbGYsIHAsIHZlcnRpY2VzKToKKyAgICAiIiJDaGVja3MgdGhhdCBhbGwgdGhlIHZlcnRpY2VzIGFyZSBvbiBjb3JuZXJzIG9mIHRoZSBzZXQuIiIiCisgICAgZm9yIGkgaW4geHJhbmdlKHZlcnRpY2VzLnNoYXBlWzBdKToKKyAgICAgICMgQ2hlY2sgdGhhdCBhbGwgdGhlIHZlcnRpY2VzIGhhdmUgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFjdGl2ZQorICAgICAgIyBjb25zdHJhaW50cy4KKyAgICAgIGxtZGEgPSBwLkggKiB2ZXJ0aWNlc1tpLDpdLlQgLSBwLmsKKyAgICAgIG51bV9hY3RpdmVfY29uc3RyYWludHMgPSAwCisgICAgICBmb3IgaiBpbiB4cmFuZ2UobG1kYS5zaGFwZVswXSk6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGNvbnN0cmFpbnRzIGFyZSBlaXRoZXIgYWN0aXZlLCBvciBub3QgdmlvbGF0ZWQuCisgICAgICAgIGlmIG51bXB5LmFicyhsbWRhW2osIDBdKSA8PSAxZS05OgorICAgICAgICAgIG51bV9hY3RpdmVfY29uc3RyYWludHMgKz0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKGxtZGFbaiwgMF0sIDAuMCkKKworICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5kaW0sIG51bV9hY3RpdmVfY29uc3RyYWludHMpCisKKyAgZGVmIEhhc1NhbWVQb2ludHMoc2VsZiwgZXhwZWN0ZWQsIGFjdHVhbCk6CisgICAgIiIiVmVyaWZpZXMgdGhhdCB0aGUgcG9pbnRzIGluIGV4cGVjdGVkIGFyZSBpbiBhY3R1YWwuIiIiCisgICAgZm91bmRfcG9pbnRzID0gc2V0KCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLnNoYXBlLCBhY3R1YWwuc2hhcGUpCisgICAgZm9yIGluZGV4IGluIHhyYW5nZShleHBlY3RlZC5zaGFwZVswXSk6CisgICAgICBleHBlY3RlZF9wb2ludCA9IGV4cGVjdGVkW2luZGV4LCA6XQorICAgICAgZm9yIGFjdHVhbF9pbmRleCBpbiB4cmFuZ2UoYWN0dWFsLnNoYXBlWzBdKToKKyAgICAgICAgYWN0dWFsX3BvaW50ID0gYWN0dWFsW2FjdHVhbF9pbmRleCwgOl0KKyAgICAgICAgaWYgbnVtcHkuYWJzKGV4cGVjdGVkX3BvaW50IC0gYWN0dWFsX3BvaW50KS5tYXgoKSA8PSAxZS00OgorICAgICAgICAgIGZvdW5kX3BvaW50cy5hZGQoYWN0dWFsX2luZGV4KQorICAgICAgICAgIGJyZWFrCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmb3VuZF9wb2ludHMpLCBhY3R1YWwuc2hhcGVbMF0sCisgICAgICAgIG1zZz0iRXhwZWN0ZWQ6XG4iICsgc3RyKGV4cGVjdGVkKSArICJcbkFjdHVhbDpcbiIgKyBzdHIoYWN0dWFsKSkKKworICBkZWYgdGVzdF9Ta2V3ZWRfTm9uc3ltX1ZlcnRpY2VzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSB2ZXJ0aWNlcyBvZiBhIHNldmVyZWx5IHNrZXdlZCBzcGFjZS4iIiIKKyAgICBzZWxmLkggPSBudW1weS5tYXRyaXgoW1sxMCwgLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWy0xLCAtMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbLTEsIDEwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMCwgMTBdXSkKKyAgICBzZWxmLmsgPSBudW1weS5tYXRyaXgoW1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyXV0pCisgICAgc2VsZi5wID0gcG9seXRvcGUuSFBvbHl0b3BlKHNlbGYuSCwgc2VsZi5rKQorICAgIHZlcnRpY2VzID0gc2VsZi5wLlZlcnRpY2VzKCkKKyAgICBzZWxmLkFyZVZlcnRpY2VzKHNlbGYucCwgdmVydGljZXMpCisKKyAgICBzZWxmLkhhc1NhbWVQb2ludHMoCisgICAgICAgIG51bXB5Lm1hdHJpeChbWzAuLCAwLjJdLAorICAgICAgICAgICAgICAgICAgICAgIFswLjIsIDAuXSwKKyAgICAgICAgICAgICAgICAgICAgICBbLTIuLCAwLl0sCisgICAgICAgICAgICAgICAgICAgICAgWzAuLCAtMi5dXSksCisgICAgICAgIHZlcnRpY2VzKQorCisgIGRlZiB0ZXN0X1ZlcnRpY2VzX05vbnN5bShzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgdmVydGljZXMgb2YgYSBub25zeW1ldHJpYyBzcGFjZS4iIiIKKyAgICBzZWxmLmsgPSBudW1weS5tYXRyaXgoW1s2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTBdXSkKKyAgICBzZWxmLnAgPSBwb2x5dG9wZS5IUG9seXRvcGUoc2VsZi5ILCBzZWxmLmspCisgICAgdmVydGljZXMgPSBzZWxmLnAuVmVydGljZXMoKQorICAgIHNlbGYuQXJlVmVydGljZXMoc2VsZi5wLCB2ZXJ0aWNlcykKKworICAgIHNlbGYuSGFzU2FtZVBvaW50cygKKyAgICAgICAgbnVtcHkubWF0cml4KFtbNi4sIDIuXSwKKyAgICAgICAgICAgICAgICAgICAgICBbNi4sIC0xMC5dLAorICAgICAgICAgICAgICAgICAgICAgIFstMTIuLCAtMTAuXSwKKyAgICAgICAgICAgICAgICAgICAgICBbLTEyLiwgMi5dXSksCisgICAgICAgIHZlcnRpY2VzKQorCisgIGRlZiB0ZXN0X1ZlcnRpY2VzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSB2ZXJ0aWNlcyBvZiBhIG5vbnN5bWV0cmljIHNwYWNlLiIiIgorICAgIHNlbGYuSGFzU2FtZVBvaW50cyhzZWxmLnAuVmVydGljZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtcHkubWF0cml4KFtbMTIuLCAxMi5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMi4sIC0xMi5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFstMTIuLCAtMTIuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLTEyLiwgMTIuXV0pKQorCisgIGRlZiB0ZXN0X2NvbmNhdChzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHRoZSBjb25jYXQgZnVuY3Rpb24gd29ya3MgZm9yIHNpbXBsZSBpbnB1dHMuIiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbChbImFzZCIsICJxd2UiXSwKKyAgICAgICAgICAgICAgICAgICAgIHBvbHl0b3BlLl9QaWVjZXdpc2VDb25jYXQoWyJhIiwgInEiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJzIiwgInciXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJkIiwgImUiXSkpCisKKyAgZGVmIHRlc3Rfc3RyKHNlbGYpOgorICAgICIiIlZlcmlmaWVzIHRoYXQgdGhlIHN0ciBtZXRob2Qgd29ya3MgZm9yIHRoZSBwcm92aWRlZCBwLiIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1tbIDEgIDBdICAgICAgICAgICAgW1sxMl0gIFxuJworICAgICAgICAgICAgICAgICAgICAgJyBbLTEgIDBdICBbW3gwXSAgPD0gIFsxMl0gIFxuJworICAgICAgICAgICAgICAgICAgICAgJyBbIDAgIDFdICAgW3gxXV0gICAgIFsxMl0gIFxuJworICAgICAgICAgICAgICAgICAgICAgJyBbIDAgLTFdXSAgICAgICAgICAgIFsxMl1dICcsCisgICAgICAgICAgICAgICAgICAgICBzdHIoc2VsZi5wKSkKKworICBkZWYgTWFrZVBXaXRoRGltcyhzZWxmLCBudW1fY29uc3RyYWludHMsIG51bV9kaW1zKToKKyAgICAiIiJNYWtlcyBhIHplcm9lZCBvdXQgcG9seXRvcGUgd2l0aCB0aGUgY29ycmVjdCBzaXplLiIiIgorICAgIHNlbGYucCA9IHBvbHl0b3BlLkhQb2x5dG9wZSgKKyAgICAgICAgbnVtcHkubWF0cml4KG51bXB5Lnplcm9zKChudW1fY29uc3RyYWludHMsIG51bV9kaW1zKSkpLAorICAgICAgICBudW1weS5tYXRyaXgobnVtcHkuemVyb3MoKG51bV9jb25zdHJhaW50cywgMSkpKSkKKworICBkZWYgdGVzdF9mZXdfY29uc3RyYWludHNfb2RkX2NvbnN0cmFpbnRfZXZlbl9kaW1zX3N0cihzZWxmKToKKyAgICAiIiJUZXN0cyBwcmludGluZyBvdXQgdGhlIHNldCB3aXRoIG9kZCBjb25zdHJhaW50cyBhbmQgZXZlbiBkaW1lbnNpb25zLiIiIgorICAgIHNlbGYuTWFrZVBXaXRoRGltcyhudW1fY29uc3RyYWludHM9NSwgbnVtX2RpbXM9MikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdbWyAwLiAgMC5dICAgICAgICAgICAgW1sgMC5dICBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgWyAwLiAgMC5dICBbW3gwXSAgICAgIFsgMC5dICBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgWyAwLiAgMC5dICAgW3gxXV0gPD0gIFsgMC5dICBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgWyAwLiAgMC5dICAgICAgICAgICAgIFsgMC5dICBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgWyAwLiAgMC5dXSAgICAgICAgICAgIFsgMC5dXSAnLAorICAgICAgICAgICAgICAgICAgICAgc3RyKHNlbGYucCkpCisKKyAgZGVmIHRlc3RfZmV3X2NvbnN0cmFpbnRzX29kZF9jb25zdHJhaW50X3NtYWxsX2RpbXNfc3RyKHNlbGYpOgorICAgICIiIlRlc3RzIHByaW50aW5nIG91dCB0aGUgc2V0IHdpdGggb2RkIGNvbnN0cmFpbnRzIGFuZCBvZGQgZGltZW5zaW9ucy4iIiIKKyAgICBzZWxmLk1ha2VQV2l0aERpbXMobnVtX2NvbnN0cmFpbnRzPTUsIG51bV9kaW1zPTEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnW1sgMC5dICAgICAgICAgICAgW1sgMC5dICBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgWyAwLl0gICAgICAgICAgICAgWyAwLl0gIFxuJworICAgICAgICAgICAgICAgICAgICAgJyBbIDAuXSAgW1t4MF1dIDw9ICBbIDAuXSAgXG4nCisgICAgICAgICAgICAgICAgICAgICAnIFsgMC5dICAgICAgICAgICAgIFsgMC5dICBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgWyAwLl1dICAgICAgICAgICAgWyAwLl1dICcsCisgICAgICAgICAgICAgICAgICAgICBzdHIoc2VsZi5wKSkKKworICBkZWYgdGVzdF9mZXdfY29uc3RyYWludHNfb2RkX2NvbnN0cmFpbnRfb2RkX2RpbXNfc3RyKHNlbGYpOgorICAgICIiIlRlc3RzIHByaW50aW5nIG91dCB0aGUgc2V0IHdpdGggb2RkIGNvbnN0cmFpbnRzIGFuZCBvZGQgZGltZW5zaW9ucy4iIiIKKyAgICBzZWxmLk1ha2VQV2l0aERpbXMobnVtX2NvbnN0cmFpbnRzPTUsIG51bV9kaW1zPTMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnW1sgMC4gIDAuICAwLl0gICAgICAgICAgICBbWyAwLl0gIFxuJworICAgICAgICAgICAgICAgICAgICAgJyBbIDAuICAwLiAgMC5dICBbW3gwXSAgICAgIFsgMC5dICBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgWyAwLiAgMC4gIDAuXSAgIFt4MV0gIDw9ICBbIDAuXSAgXG4nCisgICAgICAgICAgICAgICAgICAgICAnIFsgMC4gIDAuICAwLl0gICBbeDJdXSAgICAgWyAwLl0gIFxuJworICAgICAgICAgICAgICAgICAgICAgJyBbIDAuICAwLiAgMC5dXSAgICAgICAgICAgIFsgMC5dXSAnLAorICAgICAgICAgICAgICAgICAgICAgc3RyKHNlbGYucCkpCisKKyAgZGVmIHRlc3RfbWFueV9jb25zdHJhaW50c19ldmVuX2NvbnN0cmFpbnRfb2RkX2RpbXNfc3RyKHNlbGYpOgorICAgICIiIlRlc3RzIHByaW50aW5nIG91dCB0aGUgc2V0IHdpdGggZXZlbiBjb25zdHJhaW50cyBhbmQgb2RkIGRpbWVuc2lvbnMuIiIiCisgICAgc2VsZi5NYWtlUFdpdGhEaW1zKG51bV9jb25zdHJhaW50cz0yLCBudW1fZGltcz0zKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1tbIDAuICAwLiAgMC5dICBbW3gwXSAgICAgW1sgMC5dICBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgWyAwLiAgMC4gIDAuXV0gIFt4MV0gIDw9ICBbIDAuXV0gXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICBbeDJdXSAgICAgICAgICAgICcsCisgICAgICAgICAgICAgICAgICAgICBzdHIoc2VsZi5wKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJkMzJlCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oCkBAIC0wLDAgKzEsNDI4IEBACisjaWZuZGVmIEZSQzk3MV9DT05UUk9MX0xPT1BTX1NUQVRFX0ZFRURCQUNLX0xPT1BfSF8KKyNkZWZpbmUgRlJDOTcxX0NPTlRST0xfTE9PUFNfU1RBVEVfRkVFREJBQ0tfTE9PUF9IXworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiRWlnZW4vRGVuc2UiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbWFjcm9zLmgiCisKKy8vIEZvciBldmVyeXRoaW5nIGluIHRoaXMgZmlsZSwgImlucHV0cyIgYW5kICJvdXRwdXRzIiBhcmUgZGVmaW5lZCBmcm9tIHRoZQorLy8gcGVyc3BlY3RpdmUgb2YgdGhlIHBsYW50LiBUaGlzIG1lYW5zIFUgaXMgYW4gaW5wdXQgYW5kIFkgaXMgYW4gb3V0cHV0CisvLyAoYmVjYXVzZSB5b3UgZ2l2ZSB0aGUgcGxhbnQgVSAocG93ZXJzKSBhbmQgaXQgZ2l2ZXMgeW91IGJhY2sgYSBZIChzZW5zb3IKKy8vIHZhbHVlcykuIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIHdoYXQgdGhleSBtZWFuIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZQorLy8gY29udHJvbGxlciAoVSBpcyBhbiBvdXRwdXQgYmVjYXVzZSB0aGF0J3Mgd2hhdCBnb2VzIHRvIHRoZSBtb3RvcnMgYW5kIFkgaXMgYW4KKy8vIGlucHV0IGJlY2F1c2UgdGhhdCdzIHdoYXQgY29tZXMgYmFjayBmcm9tIHRoZSBzZW5zb3JzKS4KKwordGVtcGxhdGUgPGludCBudW1iZXJfb2Zfc3RhdGVzLCBpbnQgbnVtYmVyX29mX2lucHV0cywgaW50IG51bWJlcl9vZl9vdXRwdXRzPgorY2xhc3MgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzIGZpbmFsIHsKKyBwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVc7CisKKyAgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzKGNvbnN0IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50cyAmb3RoZXIpCisgICAgICA6IEFfKG90aGVyLkEoKSksCisgICAgICAgIEJfKG90aGVyLkIoKSksCisgICAgICAgIENfKG90aGVyLkMoKSksCisgICAgICAgIERfKG90aGVyLkQoKSksCisgICAgICAgIFVfbWluXyhvdGhlci5VX21pbigpKSwKKyAgICAgICAgVV9tYXhfKG90aGVyLlVfbWF4KCkpIHsKKyAgfQorCisgIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50cygKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2Zfc3RhdGVzPiAmQSwKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2ZfaW5wdXRzPiAmQiwKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfb3V0cHV0cywgbnVtYmVyX29mX3N0YXRlcz4gJkMsCisgICAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX291dHB1dHMsIG51bWJlcl9vZl9pbnB1dHM+ICZELAorICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9pbnB1dHMsIDE+ICZVX21heCwKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfaW5wdXRzLCAxPiAmVV9taW4pCisgICAgICA6IEFfKEEpLAorICAgICAgICBCXyhCKSwKKyAgICAgICAgQ18oQyksCisgICAgICAgIERfKEQpLAorICAgICAgICBVX21pbl8oVV9taW4pLAorICAgICAgICBVX21heF8oVV9tYXgpIHsKKyAgfQorCisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2Zfc3RhdGVzPiAmQSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQV87CisgIH0KKyAgZG91YmxlIEEoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBBKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9pbnB1dHM+ICZCKCkgY29uc3QgeworICAgIHJldHVybiBCXzsKKyAgfQorICBkb3VibGUgQihpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIEIoKShpLCBqKTsgfQorICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX291dHB1dHMsIG51bWJlcl9vZl9zdGF0ZXM+ICZDKCkgY29uc3QgeworICAgIHJldHVybiBDXzsKKyAgfQorICBkb3VibGUgQyhpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIEMoKShpLCBqKTsgfQorICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX291dHB1dHMsIG51bWJlcl9vZl9pbnB1dHM+ICZEKCkgY29uc3QgeworICAgIHJldHVybiBEXzsKKyAgfQorICBkb3VibGUgRChpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIEQoKShpLCBqKTsgfQorICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgMT4gJlVfbWluKCkgY29uc3QgeworICAgIHJldHVybiBVX21pbl87CisgIH0KKyAgZG91YmxlIFVfbWluKGludCBpLCBpbnQgaikgY29uc3QgeyByZXR1cm4gVV9taW4oKShpLCBqKTsgfQorICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgMT4gJlVfbWF4KCkgY29uc3QgeworICAgIHJldHVybiBVX21heF87CisgIH0KKyAgZG91YmxlIFVfbWF4KGludCBpLCBpbnQgaikgY29uc3QgeyByZXR1cm4gVV9tYXgoKShpLCBqKTsgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9zdGF0ZXM+IEFfOworICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX2lucHV0cz4gQl87CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfb3V0cHV0cywgbnVtYmVyX29mX3N0YXRlcz4gQ187CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfb3V0cHV0cywgbnVtYmVyX29mX2lucHV0cz4gRF87CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfaW5wdXRzLCAxPiBVX21pbl87CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfaW5wdXRzLCAxPiBVX21heF87CisKKyAgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzICZvcGVyYXRvcj0oCisgICAgICBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHMgb3RoZXIpID0gZGVsZXRlOworfTsKKwordGVtcGxhdGUgPGludCBudW1iZXJfb2Zfc3RhdGVzLCBpbnQgbnVtYmVyX29mX2lucHV0cywgaW50IG51bWJlcl9vZl9vdXRwdXRzPgorY2xhc3MgU3RhdGVGZWVkYmFja1BsYW50IHsKKyBwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVc7CisKKyAgU3RhdGVGZWVkYmFja1BsYW50KAorICAgICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPAorICAgICAgICAgIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9pbnB1dHMsIG51bWJlcl9vZl9vdXRwdXRzPj4+ICoKKyAgICAgICAgICBjb2VmZmljaWVudHMpCisgICAgICA6IGNvZWZmaWNpZW50c18oOjpzdGQ6Om1vdmUoKmNvZWZmaWNpZW50cykpLCBwbGFudF9pbmRleF8oMCkgeworICAgIFJlc2V0KCk7CisgIH0KKworICBTdGF0ZUZlZWRiYWNrUGxhbnQoU3RhdGVGZWVkYmFja1BsYW50ICYmb3RoZXIpCisgICAgICA6IHBsYW50X2luZGV4XyhvdGhlci5wbGFudF9pbmRleF8pIHsKKyAgICA6OnN0ZDo6c3dhcChjb2VmZmljaWVudHNfLCBvdGhlci5jb2VmZmljaWVudHNfKTsKKyAgICBYXy5zd2FwKG90aGVyLlhfKTsKKyAgICBZXy5zd2FwKG90aGVyLllfKTsKKyAgICBVXy5zd2FwKG90aGVyLlVfKTsKKyAgfQorCisgIHZpcnR1YWwgflN0YXRlRmVlZGJhY2tQbGFudCgpIHt9CisKKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9zdGF0ZXM+ICZBKCkgY29uc3QgeworICAgIHJldHVybiBjb2VmZmljaWVudHMoKS5BKCk7CisgIH0KKyAgZG91YmxlIEEoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBBKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9pbnB1dHM+ICZCKCkgY29uc3QgeworICAgIHJldHVybiBjb2VmZmljaWVudHMoKS5CKCk7CisgIH0KKyAgZG91YmxlIEIoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBCKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9vdXRwdXRzLCBudW1iZXJfb2Zfc3RhdGVzPiAmQygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29lZmZpY2llbnRzKCkuQygpOworICB9CisgIGRvdWJsZSBDKGludCBpLCBpbnQgaikgY29uc3QgeyByZXR1cm4gQygpKGksIGopOyB9CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfb3V0cHV0cywgbnVtYmVyX29mX2lucHV0cz4gJkQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvZWZmaWNpZW50cygpLkQoKTsKKyAgfQorICBkb3VibGUgRChpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIEQoKShpLCBqKTsgfQorICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgMT4gJlVfbWluKCkgY29uc3QgeworICAgIHJldHVybiBjb2VmZmljaWVudHMoKS5VX21pbigpOworICB9CisgIGRvdWJsZSBVX21pbihpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIFVfbWluKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9pbnB1dHMsIDE+ICZVX21heCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29lZmZpY2llbnRzKCkuVV9tYXgoKTsKKyAgfQorICBkb3VibGUgVV9tYXgoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBVX21heCgpKGksIGopOyB9CisKKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIDE+ICZYKCkgY29uc3QgeyByZXR1cm4gWF87IH0KKyAgZG91YmxlIFgoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBYKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9vdXRwdXRzLCAxPiAmWSgpIGNvbnN0IHsgcmV0dXJuIFlfOyB9CisgIGRvdWJsZSBZKGludCBpLCBpbnQgaikgY29uc3QgeyByZXR1cm4gWSgpKGksIGopOyB9CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfaW5wdXRzLCAxPiAmVSgpIGNvbnN0IHsgcmV0dXJuIFVfOyB9CisgIGRvdWJsZSBVKGludCBpLCBpbnQgaikgY29uc3QgeyByZXR1cm4gVSgpKGksIGopOyB9CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIDE+ICZtdXRhYmxlX1goKSB7IHJldHVybiBYXzsgfQorICBkb3VibGUgJm11dGFibGVfWChpbnQgaSwgaW50IGopIHsgcmV0dXJuIG11dGFibGVfWCgpKGksIGopOyB9CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfb3V0cHV0cywgMT4gJm11dGFibGVfWSgpIHsgcmV0dXJuIFlfOyB9CisgIGRvdWJsZSAmbXV0YWJsZV9ZKGludCBpLCBpbnQgaikgeyByZXR1cm4gbXV0YWJsZV9ZKCkoaSwgaik7IH0KKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9pbnB1dHMsIDE+ICZtdXRhYmxlX1UoKSB7IHJldHVybiBVXzsgfQorICBkb3VibGUgJm11dGFibGVfVShpbnQgaSwgaW50IGopIHsgcmV0dXJuIG11dGFibGVfVSgpKGksIGopOyB9CisKKyAgY29uc3QgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPAorICAgICAgbnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX2lucHV0cywgbnVtYmVyX29mX291dHB1dHM+CisgICAgICAgICAgJmNvZWZmaWNpZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gKmNvZWZmaWNpZW50c19bcGxhbnRfaW5kZXhfXTsKKyAgfQorCisgIGludCBwbGFudF9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIHBsYW50X2luZGV4XzsgfQorICB2b2lkIHNldF9wbGFudF9pbmRleChpbnQgcGxhbnRfaW5kZXgpIHsKKyAgICBpZiAocGxhbnRfaW5kZXggPCAwKSB7CisgICAgICBwbGFudF9pbmRleF8gPSAwOworICAgIH0gZWxzZSBpZiAocGxhbnRfaW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50Pihjb2VmZmljaWVudHNfLnNpemUoKSkpIHsKKyAgICAgIHBsYW50X2luZGV4XyA9IHN0YXRpY19jYXN0PGludD4oY29lZmZpY2llbnRzXy5zaXplKCkpIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgcGxhbnRfaW5kZXhfID0gcGxhbnRfaW5kZXg7CisgICAgfQorICB9CisKKyAgdm9pZCBSZXNldCgpIHsKKyAgICBYXy5zZXRaZXJvKCk7CisgICAgWV8uc2V0WmVybygpOworICAgIFVfLnNldFplcm8oKTsKKyAgfQorCisgIC8vIEFzc2VydCB0aGF0IFUgaXMgd2l0aGluIHRoZSBoYXJkd2FyZSByYW5nZS4KKyAgdmlydHVhbCB2b2lkIENoZWNrVSgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JbnB1dHM7ICsraSkgeworICAgICAgYXNzZXJ0KFUoaSwgMCkgPD0gVV9tYXgoaSwgMCkgKyAwLjAwMDAxKTsKKyAgICAgIGFzc2VydChVKGksIDApID49IFVfbWluKGksIDApIC0gMC4wMDAwMSk7CisgICAgfQorICB9CisKKyAgLy8gQ29tcHV0ZXMgdGhlIG5ldyBYIGFuZCBZIGdpdmVuIHRoZSBjb250cm9sIGlucHV0LgorICB2b2lkIFVwZGF0ZSgpIHsKKyAgICAvLyBQb3dlcnMgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgYXJlIG1vcmUgbGlrZWx5IGNvbnRyb2xsZXIgYnVncyB0aGFuIHRoaW5ncworICAgIC8vIHRoYXQgdGhlIHBsYW50IHNob3VsZCBkZWFsIHdpdGguCisgICAgQ2hlY2tVKCk7CisgICAgWF8gPSBBKCkgKiBYKCkgKyBCKCkgKiBVKCk7CisgICAgWV8gPSBDKCkgKiBYKCkgKyBEKCkgKiBVKCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgLy8gdGhlc2UgYXJlIGFjY2Vzc2libGUgZnJvbSBub24tdGVtcGxhdGVkIHN1YmNsYXNzZXMKKyAgc3RhdGljIGNvbnN0IGludCBrTnVtU3RhdGVzID0gbnVtYmVyX29mX3N0YXRlczsKKyAgc3RhdGljIGNvbnN0IGludCBrTnVtT3V0cHV0cyA9IG51bWJlcl9vZl9vdXRwdXRzOworICBzdGF0aWMgY29uc3QgaW50IGtOdW1JbnB1dHMgPSBudW1iZXJfb2ZfaW5wdXRzOworCisgcHJpdmF0ZToKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIDE+IFhfOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX291dHB1dHMsIDE+IFlfOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgMT4gVV87CisKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPAorICAgICAgbnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX2lucHV0cywgbnVtYmVyX29mX291dHB1dHM+Pj4gY29lZmZpY2llbnRzXzsKKworICBpbnQgcGxhbnRfaW5kZXhfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdGF0ZUZlZWRiYWNrUGxhbnQpOworfTsKKworLy8gQSBDb250cm9sbGVyIGlzIGEgc3RydWN0dXJlIHdoaWNoIGhvbGRzIGEgcGxhbnQgYW5kIHRoZSBLIGFuZCBMIG1hdHJpY2VzLgorLy8gVGhpcyBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgbXVsdGlwbGUgY29udHJvbGxlcnMgY2FuIHNoYXJlIG9uZSBzZXQgb2Ygc3RhdGUgdG8KKy8vIHN1cHBvcnQgZ2FpbiBzY2hlZHVsaW5nIGVhc2lseS4KK3RlbXBsYXRlIDxpbnQgbnVtYmVyX29mX3N0YXRlcywgaW50IG51bWJlcl9vZl9pbnB1dHMsIGludCBudW1iZXJfb2Zfb3V0cHV0cz4KK3N0cnVjdCBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlciBmaW5hbCB7CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVc7CisKKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9vdXRwdXRzPiBMOworICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgbnVtYmVyX29mX3N0YXRlcz4gSzsKKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9zdGF0ZXM+IEFfaW52OworICBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8bnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9vdXRwdXRzPiBwbGFudDsKKworICBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcigKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2Zfb3V0cHV0cz4gJkwsCisgICAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgbnVtYmVyX29mX3N0YXRlcz4gJkssCisgICAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX3N0YXRlcz4gJkFfaW52LAorICAgICAgY29uc3QgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX291dHB1dHM+ICZwbGFudCkKKyAgICAgIDogTChMKSwKKyAgICAgICAgSyhLKSwKKyAgICAgICAgQV9pbnYoQV9pbnYpLAorICAgICAgICBwbGFudChwbGFudCkgeworICB9Cit9OworCit0ZW1wbGF0ZSA8aW50IG51bWJlcl9vZl9zdGF0ZXMsIGludCBudW1iZXJfb2ZfaW5wdXRzLCBpbnQgbnVtYmVyX29mX291dHB1dHM+CitjbGFzcyBTdGF0ZUZlZWRiYWNrTG9vcCB7CisgcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXOworCisgIFN0YXRlRmVlZGJhY2tMb29wKGNvbnN0IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPAorICAgICAgbnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX2lucHV0cywgbnVtYmVyX29mX291dHB1dHM+ICZjb250cm9sbGVyKQorICAgICAgOiBjb250cm9sbGVyX2luZGV4XygwKSB7CisgICAgY29udHJvbGxlcnNfLmVtcGxhY2VfYmFjayhuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8CisgICAgICAgIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9pbnB1dHMsIG51bWJlcl9vZl9vdXRwdXRzPihjb250cm9sbGVyKSk7CisgICAgUmVzZXQoKTsKKyAgfQorCisgIFN0YXRlRmVlZGJhY2tMb29wKAorICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9vdXRwdXRzPiAmTCwKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfaW5wdXRzLCBudW1iZXJfb2Zfc3RhdGVzPiAmSywKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2Zfc3RhdGVzPiAmQV9pbnYsCisgICAgICBjb25zdCBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8bnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2Zfb3V0cHV0cz4gJnBsYW50KQorICAgICAgOiBjb250cm9sbGVyX2luZGV4XygwKSB7CisgICAgY29udHJvbGxlcnNfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgbmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2Zfb3V0cHV0cz4oTCwgSywgQV9pbnYsIHBsYW50KSk7CisKKyAgICBSZXNldCgpOworICB9CisKKyAgU3RhdGVGZWVkYmFja0xvb3AoOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8CisgICAgICBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2ZfaW5wdXRzLCBudW1iZXJfb2Zfb3V0cHV0cz4+PiAqY29udHJvbGxlcnMpCisgICAgICA6IGNvbnRyb2xsZXJzXyg6OnN0ZDo6bW92ZSgqY29udHJvbGxlcnMpKSwgY29udHJvbGxlcl9pbmRleF8oMCkgeworICAgIFJlc2V0KCk7CisgIH0KKworICBTdGF0ZUZlZWRiYWNrTG9vcChTdGF0ZUZlZWRiYWNrTG9vcCAmJm90aGVyKSB7CisgICAgWF9oYXRfLnN3YXAob3RoZXIuWF9oYXRfKTsKKyAgICBSXy5zd2FwKG90aGVyLlJfKTsKKyAgICBVXy5zd2FwKG90aGVyLlVfKTsKKyAgICBVX3VuY2FwcGVkXy5zd2FwKG90aGVyLlVfdW5jYXBwZWRfKTsKKyAgICA6OnN0ZDo6c3dhcChjb250cm9sbGVyc18sIG90aGVyLmNvbnRyb2xsZXJzXyk7CisgICAgY29udHJvbGxlcl9pbmRleF8gPSBvdGhlci5jb250cm9sbGVyX2luZGV4XzsKKyAgfQorCisgIHZpcnR1YWwgflN0YXRlRmVlZGJhY2tMb29wKCkge30KKworICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX3N0YXRlcz4gJkEoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIoKS5wbGFudC5BKCk7CisgIH0KKyAgZG91YmxlIEEoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBBKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9pbnB1dHM+ICZCKCkgY29uc3QgeworICAgIHJldHVybiBjb250cm9sbGVyKCkucGxhbnQuQigpOworICB9CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2Zfc3RhdGVzPiAmQV9pbnYoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIoKS5BX2ludjsKKyAgfQorICBkb3VibGUgQV9pbnYoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBBX2ludigpKGksIGopOyB9CisgIGRvdWJsZSBCKGludCBpLCBpbnQgaikgY29uc3QgeyByZXR1cm4gQigpKGksIGopOyB9CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfb3V0cHV0cywgbnVtYmVyX29mX3N0YXRlcz4gJkMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIoKS5wbGFudC5DKCk7CisgIH0KKyAgZG91YmxlIEMoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBDKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9vdXRwdXRzLCBudW1iZXJfb2ZfaW5wdXRzPiAmRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29udHJvbGxlcigpLnBsYW50LkQoKTsKKyAgfQorICBkb3VibGUgRChpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIEQoKShpLCBqKTsgfQorICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgMT4gJlVfbWluKCkgY29uc3QgeworICAgIHJldHVybiBjb250cm9sbGVyKCkucGxhbnQuVV9taW4oKTsKKyAgfQorICBkb3VibGUgVV9taW4oaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBVX21pbigpKGksIGopOyB9CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfaW5wdXRzLCAxPiAmVV9tYXgoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIoKS5wbGFudC5VX21heCgpOworICB9CisgIGRvdWJsZSBVX21heChpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIFVfbWF4KCkoaSwgaik7IH0KKworICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgbnVtYmVyX29mX3N0YXRlcz4gJksoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIoKS5LOworICB9CisgIGRvdWJsZSBLKGludCBpLCBpbnQgaikgY29uc3QgeyByZXR1cm4gSygpKGksIGopOyB9CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2Zfb3V0cHV0cz4gJkwoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIoKS5MOworICB9CisgIGRvdWJsZSBMKGludCBpLCBpbnQgaikgY29uc3QgeyByZXR1cm4gTCgpKGksIGopOyB9CisKKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIDE+ICZYX2hhdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gWF9oYXRfOworICB9CisgIGRvdWJsZSBYX2hhdChpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIFhfaGF0KCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIDE+ICZSKCkgY29uc3QgeyByZXR1cm4gUl87IH0KKyAgZG91YmxlIFIoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBSKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9pbnB1dHMsIDE+ICZVKCkgY29uc3QgeyByZXR1cm4gVV87IH0KKyAgZG91YmxlIFUoaW50IGksIGludCBqKSBjb25zdCB7IHJldHVybiBVKCkoaSwgaik7IH0KKyAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9pbnB1dHMsIDE+ICZVX3VuY2FwcGVkKCkgY29uc3QgeworICAgIHJldHVybiBVX3VuY2FwcGVkXzsKKyAgfQorICBkb3VibGUgVV91bmNhcHBlZChpbnQgaSwgaW50IGopIGNvbnN0IHsgcmV0dXJuIFVfdW5jYXBwZWQoKShpLCBqKTsgfQorCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCAxPiAmbXV0YWJsZV9YX2hhdCgpIHsgcmV0dXJuIFhfaGF0XzsgfQorICBkb3VibGUgJm11dGFibGVfWF9oYXQoaW50IGksIGludCBqKSB7IHJldHVybiBtdXRhYmxlX1hfaGF0KCkoaSwgaik7IH0KKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9zdGF0ZXMsIDE+ICZtdXRhYmxlX1IoKSB7IHJldHVybiBSXzsgfQorICBkb3VibGUgJm11dGFibGVfUihpbnQgaSwgaW50IGopIHsgcmV0dXJuIG11dGFibGVfUigpKGksIGopOyB9CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2ZfaW5wdXRzLCAxPiAmbXV0YWJsZV9VKCkgeyByZXR1cm4gVV87IH0KKyAgZG91YmxlICZtdXRhYmxlX1UoaW50IGksIGludCBqKSB7IHJldHVybiBtdXRhYmxlX1UoKShpLCBqKTsgfQorICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgMT4gJm11dGFibGVfVV91bmNhcHBlZCgpIHsKKyAgICByZXR1cm4gVV91bmNhcHBlZF87CisgIH0KKyAgZG91YmxlICZtdXRhYmxlX1VfdW5jYXBwZWQoaW50IGksIGludCBqKSB7CisgICAgcmV0dXJuIG11dGFibGVfVV91bmNhcHBlZCgpKGksIGopOworICB9CisKKyAgY29uc3QgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8bnVtYmVyX29mX3N0YXRlcywgbnVtYmVyX29mX2lucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX291dHB1dHM+ICZjb250cm9sbGVyKCkgY29uc3QgeworICAgIHJldHVybiAqY29udHJvbGxlcnNfW2NvbnRyb2xsZXJfaW5kZXhfXTsKKyAgfQorCisgIGNvbnN0IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPG51bWJlcl9vZl9zdGF0ZXMsIG51bWJlcl9vZl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9vdXRwdXRzPiAmY29udHJvbGxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiAqY29udHJvbGxlcnNfW2luZGV4XTsKKyAgfQorCisgIHZvaWQgUmVzZXQoKSB7CisgICAgWF9oYXRfLnNldFplcm8oKTsKKyAgICBSXy5zZXRaZXJvKCk7CisgICAgVV8uc2V0WmVybygpOworICAgIFVfdW5jYXBwZWRfLnNldFplcm8oKTsKKyAgfQorCisgIC8vIElmIFUgaXMgb3V0c2lkZSB0aGUgaGFyZHdhcmUgcmFuZ2UsIGxpbWl0IGl0IGJlZm9yZSB0aGUgcGxhbnQgdHJpZXMgdG8gdXNlCisgIC8vIGl0LgorICB2aXJ0dWFsIHZvaWQgQ2FwVSgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JbnB1dHM7ICsraSkgeworICAgICAgaWYgKFUoaSwgMCkgPiBVX21heChpLCAwKSkgeworICAgICAgICBVXyhpLCAwKSA9IFVfbWF4KGksIDApOworICAgICAgfSBlbHNlIGlmIChVKGksIDApIDwgVV9taW4oaSwgMCkpIHsKKyAgICAgICAgVV8oaSwgMCkgPSBVX21pbihpLCAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDb3JyZWN0cyBYX2hhdCBnaXZlbiB0aGUgb2JzZXJ2YXRpb24gaW4gWS4KKyAgdm9pZCBDb3JyZWN0KGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfb3V0cHV0cywgMT4gJlkpIHsKKyAgICBYX2hhdF8gKz0gQV9pbnYoKSAqIEwoKSAqIChZIC0gQygpICogWF9oYXRfIC0gRCgpICogVSgpKTsKKyAgfQorCisgIC8vIHN0b3BfbW90b3JzIGlzIHdoZXRoZXIgb3Igbm90IHRvIG91dHB1dCBhbGwgMHMuCisgIHZvaWQgVXBkYXRlKGJvb2wgc3RvcF9tb3RvcnMpIHsKKyAgICBpZiAoc3RvcF9tb3RvcnMpIHsKKyAgICAgIFVfLnNldFplcm8oKTsKKyAgICAgIFVfdW5jYXBwZWRfLnNldFplcm8oKTsKKyAgICB9IGVsc2UgeworICAgICAgVV8gPSBVX3VuY2FwcGVkXyA9IEsoKSAqIChSKCkgLSBYX2hhdCgpKTsKKyAgICAgIENhcFUoKTsKKyAgICB9CisKKyAgICBVcGRhdGVPYnNlcnZlcigpOworICB9CisKKyAgdm9pZCBVcGRhdGVPYnNlcnZlcigpIHsKKyAgICBYX2hhdF8gPSBBKCkgKiBYX2hhdCgpICsgQigpICogVSgpOworICB9CisKKyAgLy8gU2V0cyB0aGUgY3VycmVudCBjb250cm9sbGVyIHRvIGJlIGluZGV4LCBjbGFtcGVkIHRvIGJlIHdpdGhpbiByYW5nZS4KKyAgdm9pZCBzZXRfY29udHJvbGxlcl9pbmRleChpbnQgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICBjb250cm9sbGVyX2luZGV4XyA9IDA7CisgICAgfSBlbHNlIGlmIChpbmRleCA+PSBzdGF0aWNfY2FzdDxpbnQ+KGNvbnRyb2xsZXJzXy5zaXplKCkpKSB7CisgICAgICBjb250cm9sbGVyX2luZGV4XyA9IHN0YXRpY19jYXN0PGludD4oY29udHJvbGxlcnNfLnNpemUoKSkgLSAxOworICAgIH0gZWxzZSB7CisgICAgICBjb250cm9sbGVyX2luZGV4XyA9IGluZGV4OworICAgIH0KKyAgfQorCisgIGludCBjb250cm9sbGVyX2luZGV4KCkgY29uc3QgeyByZXR1cm4gY29udHJvbGxlcl9pbmRleF87IH0KKworIHByb3RlY3RlZDoKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8CisgICAgICBudW1iZXJfb2Zfc3RhdGVzLCBudW1iZXJfb2ZfaW5wdXRzLCBudW1iZXJfb2Zfb3V0cHV0cz4+PiBjb250cm9sbGVyc187CisKKyAgLy8gVGhlc2UgYXJlIGFjY2Vzc2libGUgZnJvbSBub24tdGVtcGxhdGVkIHN1YmNsYXNzZXMuCisgIHN0YXRpYyBjb25zdCBpbnQga051bVN0YXRlcyA9IG51bWJlcl9vZl9zdGF0ZXM7CisgIHN0YXRpYyBjb25zdCBpbnQga051bU91dHB1dHMgPSBudW1iZXJfb2Zfb3V0cHV0czsKKyAgc3RhdGljIGNvbnN0IGludCBrTnVtSW5wdXRzID0gbnVtYmVyX29mX2lucHV0czsKKworIHByaXZhdGU6CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCAxPiBYX2hhdF87CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCBudW1iZXJfb2Zfc3RhdGVzLCAxPiBSXzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIG51bWJlcl9vZl9pbnB1dHMsIDE+IFVfOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgbnVtYmVyX29mX2lucHV0cywgMT4gVV91bmNhcHBlZF87CisKKyAgaW50IGNvbnRyb2xsZXJfaW5kZXhfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdGF0ZUZlZWRiYWNrTG9vcCk7Cit9OworCisjZW5kaWYgIC8vIEZSQzk3MV9DT05UUk9MX0xPT1BTX1NUQVRFX0ZFRURCQUNLX0xPT1BfSF8KZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3BfdGVzdC5jYyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3BfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzU1YjZkCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcF90ZXN0LmNjCkBAIC0wLDAgKzEsNDkgQEAKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRlc3RzIHRoYXQgZXZlcnl0aGluZyBjb21waWxlcyBhbmQgbm90aGluZyBjcmFzaGVzIGV2ZW4gaWYKKy8vIG51bWJlcl9vZl9pbnB1dHMhPW51bWJlcl9vZl9vdXRwdXRzLgorLy8gVGhlcmUgdXNlZCB0byBiZSBsb3RzIG9mIGJ1Z3MgaW4gdGhpcyBhcmVhLgorVEVTVChTdGF0ZUZlZWRiYWNrTG9vcFRlc3QsIFVuZXF1YWxTaXplcykgeworICAvLyBJbiBnZW5lcmFsLCBtb3N0IChhbGw/KSBlcnJvcnMgd2lsbCBtYWtlIHRoZXNlIHN0YXRlbWVudHMgZWl0aGVyIG5vdAorICAvLyBjb21waWxlIG9yIGhhdmUgYXNzZXJ0aW9uIGZhaWx1cmVzIGF0IHJ1bnRpbWUuCisgIGNvbnN0IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCA0LCA3PiBjb2VmZmljaWVudHMoCisgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj46OklkZW50aXR5KCksCisgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND46OklkZW50aXR5KCksCisgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNywgMj46OklkZW50aXR5KCksCisgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNywgND46OklkZW50aXR5KCksCisgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMT46OkNvbnN0YW50KDEpLAorICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+OjpDb25zdGFudCgtMSkpOworCisgIHsKKyAgICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgNCwgNz4+PiB2OworICAgIHYuZW1wbGFjZV9iYWNrKG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgNCwgNz4oY29lZmZpY2llbnRzKSk7CisgICAgU3RhdGVGZWVkYmFja1BsYW50PDIsIDQsIDc+IHBsYW50KCZ2KTsKKyAgICBwbGFudC5VcGRhdGUoKTsKKyAgICBwbGFudC5SZXNldCgpOworICAgIHBsYW50LkNoZWNrVSgpOworICB9CisgIHsKKyAgICBTdGF0ZUZlZWRiYWNrTG9vcDwyLCA0LCA3PiB0ZXN0X2xvb3AoU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgNCwgNz4oCisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA3Pjo6SWRlbnRpdHkoKSwKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+OjpJZGVudGl0eSgpLAorICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj46OklkZW50aXR5KCksIGNvZWZmaWNpZW50cykpOworICAgIHRlc3RfbG9vcC5Db3JyZWN0KEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA3LCAxPjo6SWRlbnRpdHkoKSk7CisgICAgdGVzdF9sb29wLlVwZGF0ZShmYWxzZSk7CisgICAgdGVzdF9sb29wLkNhcFUoKTsKKyAgfQorICB7CisgICAgU3RhdGVGZWVkYmFja0xvb3A8MiwgNCwgNz4gdGVzdF9sb29wKAorICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgNz46OklkZW50aXR5KCksCisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPjo6SWRlbnRpdHkoKSwKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+OjpJZGVudGl0eSgpLCBjb2VmZmljaWVudHMpOworICAgIHRlc3RfbG9vcC5Db3JyZWN0KEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA3LCAxPjo6SWRlbnRpdHkoKSk7CisgICAgdGVzdF9sb29wLlVwZGF0ZShmYWxzZSk7CisgICAgdGVzdF9sb29wLkNhcFUoKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvdGVhbV9udW1iZXJfdGVzdF9lbnZpcm9ubWVudC5jYyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3RlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0YTExOQotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3RlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQuY2MKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3RlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQuaCIKKworI2luY2x1ZGUgImFvcy9jb21tb24vbmV0d29yay90ZWFtX251bWJlci5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordm9pZCBUZWFtTnVtYmVyRW52aXJvbm1lbnQ6OlNldFVwKCkgeworICA6OmFvczo6bmV0d29yazo6T3ZlcnJpZGVUZWFtTnVtYmVyKGtUZWFtTnVtYmVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy90ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50LmggYi9mcmM5NzEvY29udHJvbF9sb29wcy90ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjMWExNgotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3RlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIEZSQzk3MV9DT05UUk9MX0xPT1BTX1RFQU1fTlVNQkVSX1RFU1RfRU5WSVJPTk1FTlRfSF8KKyNkZWZpbmUgRlJDOTcxX0NPTlRST0xfTE9PUFNfVEVBTV9OVU1CRVJfVEVTVF9FTlZJUk9OTUVOVF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoZSB0ZWFtIG51bWJlciB3ZSB1c2UgZm9yIHRlc3RzLgorc3RhdGljIGNvbnN0IGludCBrVGVhbU51bWJlciA9IDE7CisKKy8vIE92ZXJyaWRlcyB0aGUgdGVhbSBudW1iZXIgdG8ga1RlYW1OdW1iZXIgYmVmb3JlIGFueSB0ZXN0IGNvbnNydWN0b3JzIHJ1bi4KKy8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0ZXN0cyB3aGljaCByZXRyaWV2ZSBjb25zdGFudHMgdmFsdWVzIGR1cmluZworLy8gY29uc3RydWN0aW9uLgorY2xhc3MgVGVhbU51bWJlckVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworfTsKKworLy8gVGhlIHN0YXRpYyB2YXJpYWJsZSBpbiBhIGhlYWRlciBpcyBpbnRlbnRpb25hbC4gS2luZCBvZiBhIGhhY2ssIHVuZGVmaW5lZAorLy8gb3JkZXIsIGJ1dCB0aGF0IHdvcmtzIE9LIGhlcmUuCitzdGF0aWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgdGVhbV9udW1iZXJfZW52ID0KKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgVGVhbU51bWJlckVudmlyb25tZW50KCkpOworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBGUkM5NzFfQ09OVFJPTF9MT09QU19URUFNX05VTUJFUl9URVNUX0VOVklST05NRU5UX0hfCmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy92b2x0YWdlX2NhcC92b2x0YWdlX2NhcC5jYyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3ZvbHRhZ2VfY2FwL3ZvbHRhZ2VfY2FwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTU4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy92b2x0YWdlX2NhcC92b2x0YWdlX2NhcC5jYwpAQCAtMCwwICsxLDk1IEBACisjaW5jbHVkZSAidm9sdGFnZV9jYXAuaCIKKworI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK3ZvaWQgVm9sdGFnZUNhcChkb3VibGUgbWF4X3ZvbHRhZ2UsIGRvdWJsZSB2b2x0YWdlX29uZSwgZG91YmxlIHZvbHRhZ2VfdHdvLAorICAgICAgICAgICAgICAgIGRvdWJsZSAqb3V0X3ZvbHRhZ2Vfb25lLCBkb3VibGUgKm91dF92b2x0YWdlX3R3bykgeworICAqb3V0X3ZvbHRhZ2Vfb25lID0gKm91dF92b2x0YWdlX3R3byA9CisgICAgICA6OnN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7CisgIGlmICh2b2x0YWdlX29uZSA8PSBtYXhfdm9sdGFnZSAmJiB2b2x0YWdlX3R3byA8PSBtYXhfdm9sdGFnZSAmJgorICAgICAgdm9sdGFnZV9vbmUgPj0gLW1heF92b2x0YWdlICYmIHZvbHRhZ2VfdHdvID49IC1tYXhfdm9sdGFnZSkgeworICAgICpvdXRfdm9sdGFnZV9vbmUgPSB2b2x0YWdlX29uZTsKKyAgICAqb3V0X3ZvbHRhZ2VfdHdvID0gdm9sdGFnZV90d287CisgIH0gZWxzZSBpZiAodm9sdGFnZV9vbmUgLSB2b2x0YWdlX3R3byA+IDIgKiBtYXhfdm9sdGFnZSkgeworICAgIC8vKHZvbHRhZ2Vfb25lIGlzIGxhcmdlcikKKyAgICAvLyBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gdm9sdGFnZXMgaXMgbW9yZSB0aGFuIDI0IHdlIGtub3cgYQorICAgIC8vIDQ1ZGVncmVlIHNsb3BlIHdpbGwgbm90IGludGVyc2VjdCB0aGUgJ2JveCcKKyAgICAqb3V0X3ZvbHRhZ2Vfb25lID0gbWF4X3ZvbHRhZ2U7CisgICAgKm91dF92b2x0YWdlX3R3byA9IC1tYXhfdm9sdGFnZTsKKyAgICAvLyB0b3AgbGVmdCBjb3JuZXIgb2YgJ2JveCcKKyAgfSBlbHNlIGlmICh2b2x0YWdlX29uZSAtIHZvbHRhZ2VfdHdvIDwgLTIgKiBtYXhfdm9sdGFnZSkgeworICAgIC8vKHZvbHRhZ2VfdHdvIGlzIGxhcmdlcikKKyAgICAvLyBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gdm9sdGFnZXMgaXMgbGVzcyB0aGFuIC0yNCB3ZSBrbm93IGEKKyAgICAvLyAgNDVkZWdyZWUgc2xvcGUgd2lsbCBub3QgaW50ZXJzZWN0IHRoZSAnYm94JworICAgICpvdXRfdm9sdGFnZV9vbmUgPSAtbWF4X3ZvbHRhZ2U7CisgICAgKm91dF92b2x0YWdlX3R3byA9IG1heF92b2x0YWdlOworICAgIC8vIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgJ2JveCcKKyAgfSBlbHNlIHsKKyAgICBpZiAodm9sdGFnZV9vbmUgPj0gMCkgeworICAgICAgaWYgKHZvbHRhZ2VfdHdvID49IDApIHsKKyAgICAgICAgLy8gUXVhZHJhbnQgMQorICAgICAgICBpZiAodm9sdGFnZV9vbmUgPiB2b2x0YWdlX3R3bykgeworICAgICAgICAgIC8vIEFib3ZlIGJveAorICAgICAgICAgIGRvdWJsZSBkaWZmZXJlbmNlID0gdm9sdGFnZV9vbmUgLSB2b2x0YWdlX3R3bzsKKyAgICAgICAgICAqb3V0X3ZvbHRhZ2Vfb25lID0gbWF4X3ZvbHRhZ2U7CisgICAgICAgICAgKm91dF92b2x0YWdlX3R3byA9IG1heF92b2x0YWdlIC0gZGlmZmVyZW5jZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBSaWdodCBvZiBib3gKKyAgICAgICAgICBkb3VibGUgZGlmZmVyZW5jZSA9IHZvbHRhZ2VfdHdvIC0gdm9sdGFnZV9vbmU7CisgICAgICAgICAgKm91dF92b2x0YWdlX29uZSA9IG1heF92b2x0YWdlIC0gZGlmZmVyZW5jZTsKKyAgICAgICAgICAqb3V0X3ZvbHRhZ2VfdHdvID0gbWF4X3ZvbHRhZ2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7ICAvLyB2b2x0YWdlX3R3byA8IDAKKyAgICAgICAgLy8gUXVhZHJhbnQgMgorICAgICAgICBkb3VibGUgZGlmZmVyZW5jZSA9IHZvbHRhZ2Vfb25lIC0gdm9sdGFnZV90d287CisgICAgICAgIGlmICgtdm9sdGFnZV90d28gPiB2b2x0YWdlX29uZSkgeworICAgICAgICAgIC8vIExlZnQgb2YgYm94CisgICAgICAgICAgKm91dF92b2x0YWdlX29uZSA9IC1tYXhfdm9sdGFnZSArIGRpZmZlcmVuY2U7CisgICAgICAgICAgKm91dF92b2x0YWdlX3R3byA9IC1tYXhfdm9sdGFnZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBBYm92ZSBib3gKKyAgICAgICAgICAqb3V0X3ZvbHRhZ2Vfb25lID0gbWF4X3ZvbHRhZ2U7CisgICAgICAgICAgKm91dF92b2x0YWdlX3R3byA9IG1heF92b2x0YWdlIC0gZGlmZmVyZW5jZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7ICAvLyB2b2x0YWdlX29uZSA8IDAKKyAgICAgIGlmICh2b2x0YWdlX3R3byA8PSAwKSB7CisgICAgICAgIC8vIFF1YWRyYW50IDMKKyAgICAgICAgaWYgKHZvbHRhZ2Vfb25lIDwgdm9sdGFnZV90d28pIHsKKyAgICAgICAgICAvLyBMZWZ0IG9mIEJveAorICAgICAgICAgIGRvdWJsZSBkaWZmZXJlbmNlID0gdm9sdGFnZV90d28gLSB2b2x0YWdlX29uZTsKKyAgICAgICAgICAqb3V0X3ZvbHRhZ2Vfb25lID0gLW1heF92b2x0YWdlOworICAgICAgICAgICpvdXRfdm9sdGFnZV90d28gPSAtbWF4X3ZvbHRhZ2UgKyBkaWZmZXJlbmNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFVuZGVyIGJveAorICAgICAgICAgIGRvdWJsZSBkaWZmZXJlbmNlID0gdm9sdGFnZV9vbmUgLSB2b2x0YWdlX3R3bzsKKyAgICAgICAgICAqb3V0X3ZvbHRhZ2Vfb25lID0gLW1heF92b2x0YWdlICsgZGlmZmVyZW5jZTsKKyAgICAgICAgICAqb3V0X3ZvbHRhZ2VfdHdvID0gLW1heF92b2x0YWdlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAgLy8gdm9sdGFnZV90d28gPiAwCisgICAgICAgIC8vIFF1YWRyYW50IDQKKyAgICAgICAgZG91YmxlIGRpZmZlcmVuY2UgPSB2b2x0YWdlX3R3byAtIHZvbHRhZ2Vfb25lOworICAgICAgICBpZiAoLXZvbHRhZ2Vfb25lID4gdm9sdGFnZV90d28pIHsKKyAgICAgICAgICAvLyBSaWdodCBvZiBib3gKKyAgICAgICAgICAqb3V0X3ZvbHRhZ2Vfb25lID0gLW1heF92b2x0YWdlOworICAgICAgICAgICpvdXRfdm9sdGFnZV90d28gPSAtbWF4X3ZvbHRhZ2UgKyBkaWZmZXJlbmNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFVuZGVyIGJveAorICAgICAgICAgICpvdXRfdm9sdGFnZV9vbmUgPSBtYXhfdm9sdGFnZSAtIGRpZmZlcmVuY2U7CisgICAgICAgICAgKm91dF92b2x0YWdlX3R3byA9IG1heF92b2x0YWdlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgVm9sdGFnZUNhcChkb3VibGUgdm9sdGFnZV9vbmUsIGRvdWJsZSB2b2x0YWdlX3R3bywgZG91YmxlICpvdXRfdm9sdGFnZV9vbmUsCisgICAgICAgICAgICAgICAgZG91YmxlICpvdXRfdm9sdGFnZV90d28pIHsKKyAgVm9sdGFnZUNhcCgxMi4wLCB2b2x0YWdlX29uZSwgdm9sdGFnZV90d28sIG91dF92b2x0YWdlX29uZSwgb3V0X3ZvbHRhZ2VfdHdvKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3ZvbHRhZ2VfY2FwL3ZvbHRhZ2VfY2FwLmd5cCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3ZvbHRhZ2VfY2FwL3ZvbHRhZ2VfY2FwLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGJkMjdhCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvdm9sdGFnZV9jYXAvdm9sdGFnZV9jYXAuZ3lwCkBAIC0wLDAgKzEsMjMgQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3ZvbHRhZ2VfY2FwJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAndm9sdGFnZV9jYXAuY2MnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICd2b2x0YWdlX2NhcF90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICd2b2x0YWdlX2NhcF90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAndm9sdGFnZV9jYXAnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90ZXN0dXRpbHMnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvdm9sdGFnZV9jYXAvdm9sdGFnZV9jYXAuaCBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3ZvbHRhZ2VfY2FwL3ZvbHRhZ2VfY2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhYTllOAotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL3ZvbHRhZ2VfY2FwL3ZvbHRhZ2VfY2FwLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBGUkM5NzFfQ09OVFJPTF9MT09QU19WT0xUQUdFX0NBUF9WT0xUQUdFX0NBUF9IXworI2RlZmluZSBGUkM5NzFfQ09OVFJPTF9MT09QU19WT0xUQUdFX0NBUF9WT0xUQUdFX0NBUF9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKKy8vIFRoaXMgZnVuY3Rpb24gbWFpbnRhaW5zIHRoZSBkaWZmZXJlbmNlIG9mIHBvd2VyIGJldHdlZW4gdHdvIHZvbHRhZ2VzIHBhc3NlZCBpbgorLy8gICB0aGF0IGFyZSBvdXRzaWRlIG9mIG91ciByYW5nZSBvZiBwb3NzaWJsZSB2b2x0YWdlIG91dHB1dC4KKy8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBmaWd1cmVkIHRoYXQgbWFpbnRhaW5pbmcgdGhlIGRpZmZlcmVuY2UgcmF0aGVyIHRoYW4gdGhlIHJhdGlvCisvLyAgIGJldHdlZW4gdGhlIHZvbHRhZ2VzIHdvdWxkIGdldCB1cyB0byBvdXIgZ29hbCBhcyBmYXN0IGFzIHBvc3NpYmxlLgorLy8KKy8vCisvLyBUaGUgJ2JveCcgaXMgYSBib3ggZm9ybWVkIG9uIGEgZ3JhcGggYnkgdGhlIG1heGltdW0gYW5kIG1pbmltdW4gdm9sdGFnZXMgb2YKKy8vICAgdm9sdGFnZV9vbmUgYW5kIHZvbHRhZ2VfdHdvIHdpdGgKKy8vICAgdm9sdGFnZV9vbmUgb24gdGhlIHktYXhpcyBhbmQgdm9sdGFnZV90d28gb24gdGhlIHgtYXhpcy4KKy8vIElmIGEgbGluZSB3aXRoIGEgc2xvcGUgb2Ygb25lKDQ1ZGVncmVlcykgaXMgcGxvdHRlZCBmcm9tIHRoZSBwb2ludCBmb3JtZWQKKy8vICAgYnkgZ3JhcGhpbmcgdm9sdGFnZV9vbmUoeSkgYW5kIHZvbHRhZ2VfdHdvKHgpLCB0aGUgZmlyc3QgaW50ZXJzZWN0aW5nIHBvaW50IG9mCisvLyAgIHRoZSBib3ggaXMgdGhlIG1heGltdW0gdm9sdGFnZSB0aGF0IHdlIGNhbiBvdXRwdXQgdG8gZ2V0IHRvIHRoZSBnb2FsIGFzCisvLyAgIGZhc3QgYXMgcG9zc2libGUuCisvLyBJZiB0aGUgbGluZSBkb2VzIG5vdCBpbnRlcnNlY3QgdGhlIGJveCwgdGhlbiB3ZSB1c2UgdGhlIGNsb3Nlc3QgY29ybmVyIG9mCisvLyAgIHRoZSBib3ggdG8gdGhlIGxpbmUgaW4gZWl0aGVyIHF1YWRyYW50IHR3byBvciBxdWFkcmFudCBmb3VyIG9mIHRoZSBncmFwaC4KK3ZvaWQgVm9sdGFnZUNhcChkb3VibGUgbWF4X3ZvbHRhZ2UsIGRvdWJsZSB2b2x0YWdlX29uZSwgZG91YmxlIHZvbHRhZ2VfdHdvLAorICAgICAgICAgICAgICAgIGRvdWJsZSAqb3V0X3ZvbHRhZ2Vfb25lLCBkb3VibGUgKm91dF92b2x0YWdlX3R3byk7CisgIC8vIERlZmF1bHRzIHRvIDEydiBpZiBubyB2b2x0YWdlIGlzIHNwZWNpZmllZC4KK3ZvaWQgVm9sdGFnZUNhcChkb3VibGUgdm9sdGFnZV9vbmUsIGRvdWJsZSB2b2x0YWdlX3R3bywgZG91YmxlICpvdXRfdm9sdGFnZV9vbmUsCisgICAgICAgICAgICAgICAgZG91YmxlICpvdXRfdm9sdGFnZV90d28pOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9DT05UUk9MX0xPT1BTX1ZPTFRBR0VfQ0FQX1ZPTFRBR0VfQ0FQX0hfCmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy92b2x0YWdlX2NhcC92b2x0YWdlX2NhcF90ZXN0LmNjIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvdm9sdGFnZV9jYXAvdm9sdGFnZV9jYXBfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTA4YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvdm9sdGFnZV9jYXAvdm9sdGFnZV9jYXBfdGVzdC5jYwpAQCAtMCwwICsxLDI1MyBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvdm9sdGFnZV9jYXAvdm9sdGFnZV9jYXAuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWVfdGVzdHV0aWxzLmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgVm9sdGFnZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIEJyaW5nIHVwIGFuZCBkb3duIENvcmUuCisgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6Okdsb2JhbENvcmVJbnN0YW5jZSBteV9jb3JlOworfTsKKworLy8gVGVzdHMgdGhhdCB2b2x0YWdlIGlucHV0cyByZXR1cm4gdGhlIHNhbWUgaWYgaW5zaWRlIHRoZSBib3guCitURVNUX0YoVm9sdGFnZVRlc3QsIEJhc2ljVm9sdGFnZTEyKSB7CisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoMTIuMCwgMTEuMywgMi42LCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSgxMS4zLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgyLjYsIHZvbHRhZ2VfdHdvKTsKK30KKy8vIFRlc3RzIHRoYXQgdm9sdGFnZSBpbnB1dHMgaW4gdGhlIDR0aCBxdWFkcmFudCBib3RoIGdldCBjYXBwZWQgdG8gdGhlaXIKKy8vIG1heGltdW0uCitURVNUX0YoVm9sdGFnZVRlc3QsIFF1YWRyYW50Rm91ck5vSW50ZXJzZWN0MTIpIHsKKyAgZG91YmxlIHZvbHRhZ2Vfb25lLCB2b2x0YWdlX3R3bzsKKyAgVm9sdGFnZUNhcCgxMi4wLCAtNTAuMCwgNTAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKC0xMi4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgxMi4wLCB2b2x0YWdlX3R3byk7Cit9CisKKy8vIFRlc3RzIGlmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHZvbHRhZ2VzIGlzIG1vcmUgdGhhbiAyNC4wdiB0aGVuIGRlZmF1bHQKKy8vIHRvIHRoZSBtb3N0IG91dHB1dGFibGUgdm9sdGFnZSBpbiB0aGF0IGRpcmVjdGlvbi4KK1RFU1RfRihWb2x0YWdlVGVzdCwgTGFyZ2VEaWZmZXJlbmNlMTIpIHsKKyAgZG91YmxlIHZvbHRhZ2Vfb25lLCB2b2x0YWdlX3R3bzsKKyAgVm9sdGFnZUNhcCgxMi4wLCAtMTMuMCwgMTMuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoLTEyLjAsIHZvbHRhZ2Vfb25lKTsgIC8vIGp1c3Qgb2ZmIGJvdHRvbSByaWdodCBjb3JuZXIKKyAgRVhQRUNUX0VRKDEyLjAsIHZvbHRhZ2VfdHdvKTsKKworICBWb2x0YWdlQ2FwKDEyLjAsIDEzLjAsIC0xMy4wLCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSgxMi4wLCB2b2x0YWdlX29uZSk7ICAvLyBqdXN0IG9mZiB0b3AgbGVmdCBjb3JuZXIKKyAgRVhQRUNUX0VRKC0xMi4wLCB2b2x0YWdlX3R3byk7CisKKyAgVm9sdGFnZUNhcCgxMi4wLCAxMC4wLCAzNi4wLCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSgtMTIuMCwgdm9sdGFnZV9vbmUpOyAgLy8gMXN0IHF1YWRyYW50IGxpbmUganVzdCBvZmYgYm90dG9tIHJpZ2h0CisgIEVYUEVDVF9FUSgxMi4wLCB2b2x0YWdlX3R3byk7CisKKyAgVm9sdGFnZUNhcCgxMi4wLCAxMC4wLCAtMzYuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoMTIuMCwgdm9sdGFnZV9vbmUpOyAgLy8gM3JkIHF1YWRyYW50IGxpbmUganVzdCBvZmYgdG9wIGxlZnQKKyAgRVhQRUNUX0VRKC0xMi4wLCB2b2x0YWdlX3R3byk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIDQ1ZGVncmVlIGFuZ2xlIGxpbmUgaW50ZXJzZWN0cyB0aGUgYm94IGFuZCByZXR1cm5zIGEgdmFsdWUKKy8vIHdpdGhpbiB0aGUgYm94LgorVEVTVF9GKFZvbHRhZ2VUZXN0LCBRdWFkcmFudE9uZUludGVyc2VjdDEyKSB7CisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoMTIuMCwgNTAuMCwgNTAuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoMTIuMCwgdm9sdGFnZV9vbmUpOyAgLy8gNDVkZWdyZWUgYW5nbGUgZnJvbSBvcmlnaW4KKyAgRVhQRUNUX0VRKDEyLjAsIHZvbHRhZ2VfdHdvKTsKKworICB2b2x0YWdlX29uZSA9IDAuMDsKKworICBWb2x0YWdlQ2FwKDEyLjAsIDEzLjAsIDExLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKDEyLjAsIHZvbHRhZ2Vfb25lKTsKKyAgRVhQRUNUX0VRKDEwLjAsIHZvbHRhZ2VfdHdvKTsKK30KK1RFU1RfRihWb2x0YWdlVGVzdCwgUXVhZHJhbnRUd29JbnRlcnNlY3QxMikgeworICBkb3VibGUgdm9sdGFnZV9vbmUsIHZvbHRhZ2VfdHdvOworICBWb2x0YWdlQ2FwKDEyLjAsIDEzLjAsIC0yLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKDEyLjAsIHZvbHRhZ2Vfb25lKTsKKyAgRVhQRUNUX0VRKC0zLjAsIHZvbHRhZ2VfdHdvKTsKKworICBWb2x0YWdlQ2FwKDEyLjAsIDIuMCwgLTEzLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKDMuMCwgdm9sdGFnZV9vbmUpOworICBFWFBFQ1RfRVEoLTEyLjAsIHZvbHRhZ2VfdHdvKTsKK30KK1RFU1RfRihWb2x0YWdlVGVzdCwgUXVhZHJhbnRUaHJlZUludGVyc2VjdDEyKSB7CisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoMTIuMCwgLTUwLjAsIC01MC4wLCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSgtMTIuMCwgdm9sdGFnZV9vbmUpOyAgLy8gNDVkZWdyZWUgYW5nbGUgZnJvbSBvcmlnaW4KKyAgRVhQRUNUX0VRKC0xMi4wLCB2b2x0YWdlX3R3byk7CisKKyAgdm9sdGFnZV9vbmUgPSAwLjA7CisKKyAgVm9sdGFnZUNhcCgxMi4wLCAtMTMuMCwgLTExLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKC0xMi4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgtMTAuMCwgdm9sdGFnZV90d28pOworfQorVEVTVF9GKFZvbHRhZ2VUZXN0LCBRdWFkcmFudEZvdXJJbnRlcnNlY3QxMikgeworICBkb3VibGUgdm9sdGFnZV9vbmUsIHZvbHRhZ2VfdHdvOworICBWb2x0YWdlQ2FwKDEyLjAsIC0xMy4wLCAyLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKC0xMi4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgzLjAsIHZvbHRhZ2VfdHdvKTsKKworICBWb2x0YWdlQ2FwKDEyLjAsIC0yLjAsIDEzLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKC0zLjAsIHZvbHRhZ2Vfb25lKTsKKyAgRVhQRUNUX0VRKDEyLjAsIHZvbHRhZ2VfdHdvKTsKK30KKworLy8gVGVzdHMgd2hldGhlciBjcm9zcyBxdWFkcmFudHMgd29ya3MgKGFsc28gc3VwcGxpZXMgYWRkaXRpb25hbCBwb2ludHMgdG8KKy8vIHRlc3QpLgorVEVTVF9GKFZvbHRhZ2VUZXN0LCBRdWFkcmFudE9uZVRvVHdvMTIpIHsKKyAgLy8gUG9pbnQgaW4gUXVhZHJhbnQgMSBpbnRlcnNlY3RzIGJveCBpbiBRdWFkcmFudCAyLgorICBkb3VibGUgdm9sdGFnZV9vbmUsIHZvbHRhZ2VfdHdvOworICBWb2x0YWdlQ2FwKDEyLjAsIDMzLjAsIDExLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKDEyLjAsIHZvbHRhZ2Vfb25lKTsKKyAgRVhQRUNUX0VRKC0xMC4wLCB2b2x0YWdlX3R3byk7Cit9CitURVNUX0YoVm9sdGFnZVRlc3QsIFF1YWRyYW50T25lVG9Gb3VyMTIpeworICAvLyBQb2ludCBpbiBRdWFkcmFudCAxIGludGVyc2VjdHMgYm94IGluIFF1YWRyYW50IDQuCisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoMTIuMCwgMTEuMCwgMzMuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoLTEwLjAsIHZvbHRhZ2Vfb25lKTsKKyAgRVhQRUNUX0VRKDEyLjAsIHZvbHRhZ2VfdHdvKTsKK30KK1RFU1RfRihWb2x0YWdlVGVzdCwgUXVhZHJhbnRUaHJlZVRvVHdvMTIpIHsKKyAgLy8gUG9pbnQgaW4gUXVhZHJhbnQgMyBpbnRlcnNlY3RzIGJveCBpbiBRdWFkcmFudCAyLgorICBkb3VibGUgdm9sdGFnZV9vbmUsIHZvbHRhZ2VfdHdvOworICBWb2x0YWdlQ2FwKDEyLjAsIC0xMS4wLCAtMzMuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoMTAuMCwgdm9sdGFnZV9vbmUpOworICBFWFBFQ1RfRVEoLTEyLjAsIHZvbHRhZ2VfdHdvKTsKK30KK1RFU1RfRihWb2x0YWdlVGVzdCwgUXVhZHJhbnRUaHJlZVRvRm91cjEyKSB7CisgIC8vIFBvaW50IGluIFF1YWRyYW50IDMgaW50ZXJzZWN0cyBib3ggaW4gUXVhZHJhbnQgNC4KKyAgZG91YmxlIHZvbHRhZ2Vfb25lLCB2b2x0YWdlX3R3bzsKKyAgVm9sdGFnZUNhcCgxMi4wLCAtMzMuMCwgLTExLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKC0xMi4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgxMC4wLCB2b2x0YWdlX3R3byk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdm9sdGFnZSBpbnB1dHMgcmV0dXJuIHRoZSBzYW1lIGlmIGluc2lkZSB0aGUgYm94LgorVEVTVF9GKFZvbHRhZ2VUZXN0LCBCYXNpY1ZvbHRhZ2U2KSB7CisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoNi4wLCA1LjMsIDIuNiwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoNS4zLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgyLjYsIHZvbHRhZ2VfdHdvKTsKK30KKy8vIFRlc3RzIHRoYXQgdm9sdGFnZSBpbnB1dHMgaW4gdGhlIDR0aCBxdWFkcmFudCBib3RoIGdldCBjYXBwZWQgdG8gdGhlaXIKKy8vIG1heGltdW0uCitURVNUX0YoVm9sdGFnZVRlc3QsIFF1YWRyYW50Rm91ck5vSW50ZXJzZWN0NikgeworICBkb3VibGUgdm9sdGFnZV9vbmUsIHZvbHRhZ2VfdHdvOworICBWb2x0YWdlQ2FwKDYuMCwgLTUwLjAsIDUwLCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSgtNi4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSg2LjAsIHZvbHRhZ2VfdHdvKTsKK30KKworLy8gVGVzdHMgaWYgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gdm9sdGFnZXMgaXMgbW9yZSB0aGFuIDEyLjB2IHRoZW4gZGVmYXVsdAorLy8gdG8gdGhlIG1vc3Qgb3V0cHV0YWJsZSB2b2x0YWdlIGluIHRoYXQgZGlyZWN0aW9uLgorVEVTVF9GKFZvbHRhZ2VUZXN0LCBMYXJnZURpZmZlcmVuY2U2KSB7CisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoNi4wLCAtMTMuMCwgMTMuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoLTYuMCwgdm9sdGFnZV9vbmUpOyAgLy8ganVzdCBvZmYgYm90dG9tIHJpZ2h0IGNvcm5lcgorICBFWFBFQ1RfRVEoNi4wLCB2b2x0YWdlX3R3byk7CisKKyAgVm9sdGFnZUNhcCg2LjAsIDEzLjAsIC0xMy4wLCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSg2LjAsIHZvbHRhZ2Vfb25lKTsgIC8vIGp1c3Qgb2ZmIHRvcCBsZWZ0IGNvcm5lcgorICBFWFBFQ1RfRVEoLTYuMCwgdm9sdGFnZV90d28pOworCisgIFZvbHRhZ2VDYXAoNi4wLCAxMC4wLCAzNi4wLCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSgtNi4wLCB2b2x0YWdlX29uZSk7ICAvLyAxc3QgcXVhZHJhbnQgbGluZSBqdXN0IG9mZiBib3R0b20gcmlnaHQKKyAgRVhQRUNUX0VRKDYuMCwgdm9sdGFnZV90d28pOworCisgIFZvbHRhZ2VDYXAoNi4wLCAxMC4wLCAtMzYuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoNi4wLCB2b2x0YWdlX29uZSk7ICAvLyAzcmQgcXVhZHJhbnQgbGluZSBqdXN0IG9mZiB0b3AgbGVmdAorICBFWFBFQ1RfRVEoLTYuMCwgdm9sdGFnZV90d28pOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSA0NWRlZ3JlZSBhbmdsZSBsaW5lIGludGVyc2VjdHMgdGhlIGJveCBhbmQgcmV0dXJucyBhIHZhbHVlCisvLyB3aXRoaW4gdGhlIGJveAorVEVTVF9GKFZvbHRhZ2VUZXN0LCBRdWFkcmFudE9uZUludGVyc2VjdDYpIHsKKyAgZG91YmxlIHZvbHRhZ2Vfb25lLCB2b2x0YWdlX3R3bzsKKyAgVm9sdGFnZUNhcCg2LjAsIDUwLjAsIDUwLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKDYuMCwgdm9sdGFnZV9vbmUpOyAgLy8gNDVkZWdyZWUgYW5nbGUgZnJvbSBvcmlnaW4KKyAgRVhQRUNUX0VRKDYuMCwgdm9sdGFnZV90d28pOworCisgIHZvbHRhZ2Vfb25lID0gMC4wOworCisgIFZvbHRhZ2VDYXAoNi4wLCAxMy4wLCAxMS4wLCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSg2LjAsIHZvbHRhZ2Vfb25lKTsKKyAgRVhQRUNUX0VRKDQuMCwgdm9sdGFnZV90d28pOworfQorVEVTVF9GKFZvbHRhZ2VUZXN0LCBRdWFkcmFudFR3b0ludGVyc2VjdDYpIHsKKyAgZG91YmxlIHZvbHRhZ2Vfb25lLCB2b2x0YWdlX3R3bzsKKyAgVm9sdGFnZUNhcCg2LjAsIDkuMCwgLTIuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoNi4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgtNS4wLCB2b2x0YWdlX3R3byk7CisKKyAgVm9sdGFnZUNhcCg2LjAsIDIuMCwgLTkuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoNS4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgtNi4wLCB2b2x0YWdlX3R3byk7Cit9CitURVNUX0YoVm9sdGFnZVRlc3QsIFF1YWRyYW50VGhyZWVJbnRlcnNlY3Q2KSB7CisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoNi4wLCAtNTAuMCwgLTUwLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKC02LjAsIHZvbHRhZ2Vfb25lKTsgIC8vIDQ1ZGVncmVlIGFuZ2xlIGZyb20gb3JpZ2luCisgIEVYUEVDVF9FUSgtNi4wLCB2b2x0YWdlX3R3byk7CisKKyAgdm9sdGFnZV9vbmUgPSAwLjA7CisKKyAgVm9sdGFnZUNhcCg2LjAsIC0xMy4wLCAtMTEuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoLTYuMCwgdm9sdGFnZV9vbmUpOworICBFWFBFQ1RfRVEoLTQuMCwgdm9sdGFnZV90d28pOworfQorVEVTVF9GKFZvbHRhZ2VUZXN0LCBRdWFkcmFudEZvdXJJbnRlcnNlY3Q2KSB7CisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoNi4wLCAtOS4wLCAyLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKC02LjAsIHZvbHRhZ2Vfb25lKTsKKyAgRVhQRUNUX0VRKDUuMCwgdm9sdGFnZV90d28pOworCisgIFZvbHRhZ2VDYXAoNi4wLCAtMi4wLCA5LjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKC01LjAsIHZvbHRhZ2Vfb25lKTsKKyAgRVhQRUNUX0VRKDYuMCwgdm9sdGFnZV90d28pOworfQorCisvLyBUZXN0cyB3aGV0aGVyIGNyb3NzIHF1YWRyYW50cyB3b3JrcyAoYWxzbyBzdXBwbGllcyBhZGRpdGlvbmFsIHBvaW50cyB0bworLy8gdGVzdCkuCitURVNUX0YoVm9sdGFnZVRlc3QsIFF1YWRyYW50T25lVG9Ud282KSB7CisgIC8vIFBvaW50IGluIFF1YWRyYW50IDEgaW50ZXJzZWN0cyBib3ggaW4gUXVhZHJhbnQgMi4KKyAgZG91YmxlIHZvbHRhZ2Vfb25lLCB2b2x0YWdlX3R3bzsKKyAgVm9sdGFnZUNhcCg2LjAsIDMzLjAsIDIyLjAsICZ2b2x0YWdlX29uZSwgJnZvbHRhZ2VfdHdvKTsKKyAgRVhQRUNUX0VRKDYuMCwgdm9sdGFnZV9vbmUpOworICBFWFBFQ1RfRVEoLTUuMCwgdm9sdGFnZV90d28pOworfQorVEVTVF9GKFZvbHRhZ2VUZXN0LCBRdWFkcmFudE9uZVRvRm91cjYpeworICAvLyBQb2ludCBpbiBRdWFkcmFudCAxIGludGVyc2VjdHMgYm94IGluIFF1YWRyYW50IDQuCisgIGRvdWJsZSB2b2x0YWdlX29uZSwgdm9sdGFnZV90d287CisgIFZvbHRhZ2VDYXAoNi4wLCAyMi4wLCAzMy4wLCAmdm9sdGFnZV9vbmUsICZ2b2x0YWdlX3R3byk7CisgIEVYUEVDVF9FUSgtNS4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSg2LjAsIHZvbHRhZ2VfdHdvKTsKK30KK1RFU1RfRihWb2x0YWdlVGVzdCwgUXVhZHJhbnRUaHJlZVRvVHc2KSB7CisgIC8vIFBvaW50IGluIFF1YWRyYW50IDMgaW50ZXJzZWN0cyBib3ggaW4gUXVhZHJhbnQgMi4KKyAgZG91YmxlIHZvbHRhZ2Vfb25lLCB2b2x0YWdlX3R3bzsKKyAgVm9sdGFnZUNhcCg2LjAsIC0yMi4wLCAtMzMuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoNS4wLCB2b2x0YWdlX29uZSk7CisgIEVYUEVDVF9FUSgtNi4wLCB2b2x0YWdlX3R3byk7Cit9CitURVNUX0YoVm9sdGFnZVRlc3QsIFF1YWRyYW50VGhyZWVUb0ZvdXI2KSB7CisgIC8vIFBvaW50IGluIFF1YWRyYW50IDMgaW50ZXJzZWN0cyBib3ggaW4gUXVhZHJhbnQgNC4KKyAgZG91YmxlIHZvbHRhZ2Vfb25lLCB2b2x0YWdlX3R3bzsKKyAgVm9sdGFnZUNhcCg2LjAsIC0zMy4wLCAtMjIuMCwgJnZvbHRhZ2Vfb25lLCAmdm9sdGFnZV90d28pOworICBFWFBFQ1RfRVEoLTYuMCwgdm9sdGFnZV9vbmUpOworICBFWFBFQ1RfRVEoNS4wLCB2b2x0YWdlX3R3byk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvemVyb2VkX2pvaW50LmggYi9mcmM5NzEvY29udHJvbF9sb29wcy96ZXJvZWRfam9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjU0MzRmCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvemVyb2VkX2pvaW50LmgKQEAgLTAsMCArMSw0NTcgQEAKKyNpZm5kZWYgRlJDOTcxX0NPTlRST0xfTE9PUFNfWkVST0VEX0pPSU5UX0hfCisjZGVmaW5lIEZSQzk3MV9DT05UUk9MX0xPT1BTX1pFUk9FRF9KT0lOVF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworY2xhc3MgV3Jpc3RUZXN0X05vV2luZHVwUG9zaXRpdmVfVGVzdDsKK2NsYXNzIFdyaXN0VGVzdF9Ob1dpbmR1cE5lZ2F0aXZlX1Rlc3Q7Cit9OworCisvLyBOb3RlOiBFdmVyeXRoaW5nIGluIHRoaXMgZmlsZSBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYSAxIGN5Y2xlIGRlbGF5IGJldHdlZW4KKy8vIHBvd2VyIGJlaW5nIHJlcXVlc3RlZCBhbmQgaXQgc2hvd2luZyB1cCBhdCB0aGUgbW90b3IuICBJdCBhc3N1bWVzIHRoYXQKKy8vIFhfaGF0KDIsIDEpIGlzIHRoZSB2b2x0YWdlIGJlaW5nIGFwcGxpZWQgYXMgd2VsbC4gIEl0IHdpbGwgZ28gdW5zdGFibGUgaWYKKy8vIHRoYXQgaXNuJ3QgdHJ1ZS4KKwordGVtcGxhdGU8aW50IGtOdW1aZXJvU2Vuc29ycz4KK2NsYXNzIFplcm9lZEpvaW50OworCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIENhcFUgZnVuY3Rpb24gY29ycmVjdGx5IGdpdmVuIGFsbCB0aGUgZXh0cmEKKy8vIGluZm9ybWF0aW9uIHRoYXQgd2Uga25vdyBhYm91dCBmcm9tIHRoZSB3cmlzdCBtb3Rvci4KK3RlbXBsYXRlPGludCBrTnVtWmVyb1NlbnNvcnM+CitjbGFzcyBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcCA6IHB1YmxpYyBTdGF0ZUZlZWRiYWNrTG9vcDwzLCAxLCAxPiB7CisgcHVibGljOgorICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcChTdGF0ZUZlZWRiYWNrTG9vcDwzLCAxLCAxPiBsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBaZXJvZWRKb2ludDxrTnVtWmVyb1NlbnNvcnM+ICp6ZXJvZWRfam9pbnQpCisgICAgICA6IFN0YXRlRmVlZGJhY2tMb29wPDMsIDEsIDE+KGxvb3ApLAorICAgICAgICB6ZXJvZWRfam9pbnRfKHplcm9lZF9qb2ludCksCisgICAgICAgIHZvbHRhZ2VfKDAuMCksCisgICAgICAgIGxhc3Rfdm9sdGFnZV8oMC4wKSB7CisgIH0KKworICAvLyBDYXBzIFUsIGJ1dCB0aGlzIHRpbWUgcmVzcGVjdHMgdGhlIHN0YXRlIG9mIHRoZSB3cmlzdCBhcyB3ZWxsLgorICB2aXJ0dWFsIHZvaWQgQ2FwVSgpOworCisgIC8vIFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZvbHRhZ2UuCisgIGRvdWJsZSB2b2x0YWdlKCkgY29uc3QgeyByZXR1cm4gdm9sdGFnZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSB1bmNhcHBlZCB2b2x0YWdlLgorICBkb3VibGUgdW5jYXBwZWRfdm9sdGFnZSgpIGNvbnN0IHsgcmV0dXJuIHVuY2FwcGVkX3ZvbHRhZ2VfOyB9CisKKyAgLy8gWmVyb3MgdGhlIGFjY3VtdWxhdG9yLgorICB2b2lkIFplcm9Qb3dlcigpIHsgdm9sdGFnZV8gPSAwLjA7IH0KKyBwcml2YXRlOgorICBaZXJvZWRKb2ludDxrTnVtWmVyb1NlbnNvcnM+ICp6ZXJvZWRfam9pbnRfOworCisgIC8vIFRoZSBhY2N1bXVsYXRlZCB2b2x0YWdlIHRvIGFwcGx5IHRvIHRoZSBtb3Rvci4KKyAgZG91YmxlIHZvbHRhZ2VfOworICBkb3VibGUgbGFzdF92b2x0YWdlXzsKKyAgZG91YmxlIHVuY2FwcGVkX3ZvbHRhZ2VfOworfTsKKwordGVtcGxhdGU8aW50IGtOdW1aZXJvU2Vuc29ycz4KK3ZvaWQgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A8a051bVplcm9TZW5zb3JzPjo6Q2FwVSgpIHsKKyAgY29uc3QgZG91YmxlIG9sZF92b2x0YWdlID0gdm9sdGFnZV87CisgIHZvbHRhZ2VfICs9IFUoMCwgMCk7CisKKyAgdW5jYXBwZWRfdm9sdGFnZV8gPSB2b2x0YWdlXzsKKworICAvLyBEbyBhbGwgb3VyIGNvbXB1dGF0aW9ucyB3aXRoIHRoZSB2b2x0YWdlLCBhbmQgdGhlbiBjb21wdXRlIHdoYXQgdGhlIGRlbHRhCisgIC8vIGlzIHRvIG1ha2UgdGhhdCBoYXBwZW4uCisgIGlmICh6ZXJvZWRfam9pbnRfLT5zdGF0ZV8gPT0gWmVyb2VkSm9pbnQ8a051bVplcm9TZW5zb3JzPjo6UkVBRFkpIHsKKyAgICBpZiAoWSgwLCAwKSA+PSB6ZXJvZWRfam9pbnRfLT5jb25maWdfZGF0YV8udXBwZXJfbGltaXQpIHsKKyAgICAgIHZvbHRhZ2VfID0gc3RkOjptaW4oMC4wLCB2b2x0YWdlXyk7CisgICAgfQorICAgIGlmIChZKDAsIDApIDw9IHplcm9lZF9qb2ludF8tPmNvbmZpZ19kYXRhXy5sb3dlcl9saW1pdCkgeworICAgICAgdm9sdGFnZV8gPSBzdGQ6Om1heCgwLjAsIHZvbHRhZ2VfKTsKKyAgICB9CisgIH0KKworICBjb25zdCBib29sIGlzX3JlYWR5ID0KKyAgICAgIHplcm9lZF9qb2ludF8tPnN0YXRlXyA9PSBaZXJvZWRKb2ludDxrTnVtWmVyb1NlbnNvcnM+OjpSRUFEWTsKKyAgZG91YmxlIGxpbWl0ID0gaXNfcmVhZHkgPworICAgICAgMTIuMCA6IHplcm9lZF9qb2ludF8tPmNvbmZpZ19kYXRhXy5tYXhfemVyb2luZ192b2x0YWdlOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHJlYWxpdHkgYW5kIHRoZSBvYnNlcnZlciBjYW4ndCBnZXQgdG9vIGZhciBvZmYuICBUaGVyZSBpcyBhCisgIC8vIGRlbGF5IGJ5IG9uZSBjeWNsZSBiZXR3ZWVuIHRoZSBhcHBsaWVkIHZvbHRhZ2UgYW5kIFhfaGF0KDIsIDApLCBzbyBjb21wYXJlCisgIC8vIGFnYWluc3QgbGFzdCBjeWNsZSdzIHZvbHRhZ2UuCisgIGlmIChYX2hhdCgyLCAwKSA+IGxhc3Rfdm9sdGFnZV8gKyAyLjApIHsKKyAgICAvL1hfaGF0KDIsIDApID0gbGFzdF92b2x0YWdlXyArIDIuMDsKKyAgICB2b2x0YWdlXyAtPSBYX2hhdCgyLCAwKSAtIChsYXN0X3ZvbHRhZ2VfICsgMi4wKTsKKyAgICBMT0coREVCVUcsICJYX2hhdCgyLCAwKSA9ICVmXG4iLCBYX2hhdCgyLCAwKSk7CisgIH0gZWxzZSBpZiAoWF9oYXQoMiwgMCkgPCBsYXN0X3ZvbHRhZ2VfIC0yLjApIHsKKyAgICAvL1hfaGF0KDIsIDApID0gbGFzdF92b2x0YWdlXyAtIDIuMDsKKyAgICB2b2x0YWdlXyArPSBYX2hhdCgyLCAwKSAtIChsYXN0X3ZvbHRhZ2VfIC0gMi4wKTsKKyAgICBMT0coREVCVUcsICJYX2hhdCgyLCAwKSA9ICVmXG4iLCBYX2hhdCgyLCAwKSk7CisgIH0KKworICB2b2x0YWdlXyA9IHN0ZDo6bWluKGxpbWl0LCB2b2x0YWdlXyk7CisgIHZvbHRhZ2VfID0gc3RkOjptYXgoLWxpbWl0LCB2b2x0YWdlXyk7CisgIFUoMCwgMCkgPSB2b2x0YWdlXyAtIG9sZF92b2x0YWdlOworICBMT0coREVCVUcsICJhYmMgJWZcbiIsIFhfaGF0KDIsIDApIC0gdm9sdGFnZV8pOworICBMT0coREVCVUcsICJlcnJvciAlZlxuIiwgWF9oYXQoMCwgMCkgLSBSKDAsIDApKTsKKworICBsYXN0X3ZvbHRhZ2VfID0gdm9sdGFnZV87Cit9CisKKworLy8gQ2xhc3MgdG8gemVybyBhbmQgY29udHJvbCBhIGpvaW50IHdpdGggYW55IG51bWJlciBvZiB6ZXJvaW5nIHNlbnNvcnMgd2l0aCBhCisvLyBzdGF0ZSBmZWVkYmFjayBjb250cm9sbGVyLgordGVtcGxhdGU8aW50IGtOdW1aZXJvU2Vuc29ycz4KK2NsYXNzIFplcm9lZEpvaW50IHsKKyBwdWJsaWM6CisgIC8vIFN0dXJjdHVyZSB0byBob2xkIHRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICBzdHJ1Y3QgQ29uZmlndXJhdGlvbkRhdGEgeworICAgIC8vIEFuZ2xlIGF0IHRoZSBsb3dlciBoYXJkd2FyZSBsaW1pdC4KKyAgICBkb3VibGUgbG93ZXJfbGltaXQ7CisgICAgLy8gQW5nbGUgYXQgdGhlIHVwcGVyIGhhcmR3YXJlIGxpbWl0LgorICAgIGRvdWJsZSB1cHBlcl9saW1pdDsKKyAgICAvLyBTcGVlZCAoYW5kIGRpcmVjdGlvbikgdG8gbW92ZSB3aGlsZSB6ZXJvaW5nLgorICAgIGRvdWJsZSB6ZXJvaW5nX3NwZWVkOworICAgIC8vIFNwZWVkIChhbmQgZGlyZWN0aW9uKSB0byBtb3ZlIHdoaWxlIG1vdmluZyBvZmYgdGhlIHNlbnNvci4KKyAgICBkb3VibGUgemVyb2luZ19vZmZfc3BlZWQ7CisgICAgLy8gTWF4aW11bSB2b2x0YWdlIHRvIGFwcGx5IHdoZW4gemVyb2luZy4KKyAgICBkb3VibGUgbWF4X3plcm9pbmdfdm9sdGFnZTsKKyAgICAvLyBEZWFkYmFuZCB2b2x0YWdlLgorICAgIGRvdWJsZSBkZWFkYmFuZF92b2x0YWdlOworICAgIC8vIEFuZ2xlcyB3aGVyZSB3ZSBzZWUgYSBwb3NpdGl2ZSBlZGdlIGZyb20gdGhlIGhhbGwgZWZmZWN0IHNlbnNvcnMuCisgICAgZG91YmxlIGhhbGxfZWZmZWN0X3N0YXJ0X2FuZ2xlW2tOdW1aZXJvU2Vuc29yc107CisgIH07CisKKyAgLy8gQ3VycmVudCBwb3NpdGlvbiBkYXRhIGZvciB0aGUgZW5jb2RlciBhbmQgaGFsbCBlZmZlY3QgaW5mb3JtYXRpb24uCisgIHN0cnVjdCBQb3NpdGlvbkRhdGEgeworICAgIC8vIEN1cnJlbnQgZW5jb2RlciBwb3NpdGlvbi4KKyAgICBkb3VibGUgcG9zaXRpb247CisgICAgLy8gQXJyYXkgb2YgaGFsbCBlZmZlY3QgdmFsdWVzLgorICAgIGJvb2wgaGFsbF9lZmZlY3RzW2tOdW1aZXJvU2Vuc29yc107CisgICAgLy8gQXJyYXkgb2YgdGhlIGxhc3QgcG9zaXRpdmUgZWRnZSBwb3NpdGlvbiBmb3IgdGhlIHNlbnNvcnMuCisgICAgZG91YmxlIGhhbGxfZWZmZWN0X3Bvc2l0aW9uc1trTnVtWmVyb1NlbnNvcnNdOworICB9OworCisgIFplcm9lZEpvaW50KFN0YXRlRmVlZGJhY2tMb29wPDMsIDEsIDE+IGxvb3ApCisgICAgICA6IGxvb3BfKG5ldyBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDxrTnVtWmVyb1NlbnNvcnM+KGxvb3AsIHRoaXMpKSwKKyAgICAgICAgbGFzdF9nb29kX3RpbWVfKDAsIDApLAorICAgICAgICBzdGF0ZV8oVU5JTklUSUFMSVpFRCksCisgICAgICAgIGVycm9yX2NvdW50XygwKSwKKyAgICAgICAgemVyb19vZmZzZXRfKDAuMCksCisgICAgICAgIGNhcHBlZF9nb2FsXyhmYWxzZSkgeworICB9CisKKyAgLy8gQ29waWVzIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uIGRhdGEgbG9jYWxseS4KKyAgdm9pZCBzZXRfY29uZmlnX2RhdGEoY29uc3QgQ29uZmlndXJhdGlvbkRhdGEgJmNvbmZpZ19kYXRhKSB7CisgICAgY29uZmlnX2RhdGFfID0gY29uZmlnX2RhdGE7CisgIH0KKworICAvLyBDbGlwcyB0aGUgZ29hbCB0byBiZSBpbnNpZGUgdGhlIGxpbWl0cyBhbmQgcmV0dXJucyB0aGUgY2xpcHBlZCBnb2FsLgorICAvLyBSZXF1aXJlcyB0aGUgY29uc3RhbnRzIHRvIGhhdmUgYWxyZWFkeSBiZWVuIGZldGNoZWQuCisgIGRvdWJsZSBDbGlwR29hbChkb3VibGUgZ29hbCkgY29uc3QgeworICAgIHJldHVybiA6OnN0ZDo6bWluKGNvbmZpZ19kYXRhXy51cHBlcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChjb25maWdfZGF0YV8ubG93ZXJfbGltaXQsIGdvYWwpKTsKKyAgfQorCisgIC8vIFVwZGF0ZXMgdGhlIGxvb3AgYW5kIHN0YXRlIG1hY2hpbmUuCisgIC8vIHBvc2l0aW9uIGlzIG51bGwgaWYgdGhlIHBvc2l0aW9uIGRhdGEgaXMgc3RhbGUsIG91dHB1dF9lbmFibGVkIGlzIHRydWUgaWYKKyAgLy8gdGhlIG91dHB1dCB3aWxsIGFjdHVhbGx5IGdvIHRvIHRoZSBtb3RvcnMsIGFuZCBnb2FsX2FuZ2xlIGFuZCBnb2FsX3ZlbG9jaXR5CisgIC8vIGFyZSB0aGUgZ29hbCBwb3NpdGlvbiBhbmQgdmVsb2NpdGllcy4KKyAgZG91YmxlIFVwZGF0ZShjb25zdCBaZXJvZWRKb2ludDxrTnVtWmVyb1NlbnNvcnM+OjpQb3NpdGlvbkRhdGEgKnBvc2l0aW9uLAorICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0X2VuYWJsZWQsCisgICAgICAgICAgICAgICAgZG91YmxlIGdvYWxfYW5nbGUsIGRvdWJsZSBnb2FsX3ZlbG9jaXR5KTsKKworICAvLyBUcnVlIGlmIHRoZSBjb2RlIGlzIHplcm9pbmcuCisgIGJvb2wgaXNfemVyb2luZygpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXyA9PSBaRVJPSU5HOyB9CisKKyAgLy8gVHJ1ZSBpZiB0aGUgY29kZSBpcyBtb3Zpbmcgb2ZmIHRoZSBoYWxsIGVmZmVjdC4KKyAgYm9vbCBpc19tb3Zpbmdfb2ZmKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfID09IE1PVklOR19PRkY7IH0KKworICAvLyBUcnVlIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIHVuaW5pdGlhbGl6ZWQuCisgIGJvb2wgaXNfdW5pbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXyA9PSBVTklOSVRJQUxJWkVEOyB9CisKKyAgLy8gVHJ1ZSBpZiB0aGUgc3RhdGUgbWFjaGluZSBpcyByZWFkeS4KKyAgYm9vbCBpc19yZWFkeSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXyA9PSBSRUFEWTsgfQorCisgIC8vIFJldHVybnMgdGhlIHVuY2FwcGVkIHZvbHRhZ2UuCisgIGRvdWJsZSBVX3VuY2FwcGVkKCkgY29uc3QgeyByZXR1cm4gbG9vcF8tPlVfdW5jYXBwZWQoMCwgMCk7IH0KKworICAvLyBUcnVlIGlmIHRoZSBnb2FsIHdhcyBtb3ZlZCB0byBhdm9pZCBnb2FsIHdpbmR1cC4KKyAgYm9vbCBjYXBwZWRfZ29hbCgpIGNvbnN0IHsgcmV0dXJuIGNhcHBlZF9nb2FsXzsgfQorCisgIC8vIFRpbWVzdGFtcAorICBzdGF0aWMgY29uc3QgZG91YmxlIGR0OworCisgIGRvdWJsZSBhYnNvbHV0ZV9wb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIGxvb3BfLT5YX2hhdCgwLCAwKTsgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFplcm9lZFN0YXRlRmVlZGJhY2tMb29wPGtOdW1aZXJvU2Vuc29ycz47CisgIC8vIEZyaWVuZCB0aGUgd3Jpc3QgdGVzdCBjYXNlcyBzbyB0aGF0IHRoZXkgY2FuIHNpbXVsYXRlIHdpbmRldXAuCisgIGZyaWVuZCBjbGFzcyB0ZXN0aW5nOjpXcmlzdFRlc3RfTm9XaW5kdXBQb3NpdGl2ZV9UZXN0OworICBmcmllbmQgY2xhc3MgdGVzdGluZzo6V3Jpc3RUZXN0X05vV2luZHVwTmVnYXRpdmVfVGVzdDsKKworICBzdGF0aWMgY29uc3QgOjphb3M6OnRpbWU6OlRpbWUga1JlemVyb1RpbWU7CisKKyAgLy8gVGhlIHN0YXRlIGZlZWRiYWNrIGNvbnRyb2wgbG9vcCB0byB0YWxrIHRvLgorICA6OnN0ZDo6dW5pcXVlX3B0cjxaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDxrTnVtWmVyb1NlbnNvcnM+PiBsb29wXzsKKworICBDb25maWd1cmF0aW9uRGF0YSBjb25maWdfZGF0YV87CisKKyAgOjphb3M6OnRpbWU6OlRpbWUgbGFzdF9nb29kX3RpbWVfOworCisgIC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhY3RpdmUgc2Vuc29yLCBvciAtMSBpZiBub25lIGFyZSBhY3RpdmUuCisgIGludCBBY3RpdmVTZW5zb3JJbmRleCgKKyAgICAgIGNvbnN0IFplcm9lZEpvaW50PGtOdW1aZXJvU2Vuc29ycz46OlBvc2l0aW9uRGF0YSAqcG9zaXRpb24pIHsKKyAgICBpZiAoIXBvc2l0aW9uKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBhY3RpdmVfaW5kZXggPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1aZXJvU2Vuc29yczsgKytpKSB7CisgICAgICBpZiAocG9zaXRpb24tPmhhbGxfZWZmZWN0c1tpXSkgeworICAgICAgICBpZiAoYWN0aXZlX2luZGV4ICE9IC0xKSB7CisgICAgICAgICAgTE9HKEVSUk9SLCAiTW9yZSB0aGFuIG9uZSBoYWxsIGVmZmVjdCBzZW5zb3IgaXMgYWN0aXZlXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhY3RpdmVfaW5kZXggPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBhY3RpdmVfaW5kZXg7CisgIH0KKyAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgc2Vuc29ycyBhcmUgYWN0aXZlLgorICBib29sIEFueVNlbnNvcnNBY3RpdmUoCisgICAgICBjb25zdCBaZXJvZWRKb2ludDxrTnVtWmVyb1NlbnNvcnM+OjpQb3NpdGlvbkRhdGEgKnBvc2l0aW9uKSB7CisgICAgcmV0dXJuIEFjdGl2ZVNlbnNvckluZGV4KHBvc2l0aW9uKSAhPSAtMTsKKyAgfQorCisgIC8vIEVudW0gdG8gc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBpbnRlcm5hbCB6ZXJvaW5nIHN0YXRlIG1hY2hpbmUuCisgIGVudW0gU3RhdGUgeworICAgIFVOSU5JVElBTElaRUQsCisgICAgTU9WSU5HX09GRiwKKyAgICBaRVJPSU5HLAorICAgIFJFQURZLAorICAgIEVTVE9QCisgIH07CisKKyAgLy8gSW50ZXJuYWwgc3RhdGUgZm9yIHplcm9pbmcuCisgIFN0YXRlIHN0YXRlXzsKKworICAvLyBNaXNzZWQgcG9zaXRpb24gcGFja2V0IGNvdW50LgorICBpbnQgZXJyb3JfY291bnRfOworICAvLyBPZmZzZXQgZnJvbSB0aGUgcmF3IGVuY29kZXIgdmFsdWUgdG8gdGhlIGFic29sdXRlIGFuZ2xlLgorICBkb3VibGUgemVyb19vZmZzZXRfOworICAvLyBQb3NpdGlvbiB0aGF0IGdldHMgaW5jcmVtZW50ZWQgd2hlbiB6ZXJvaW5nIHRoZSB3cmlzdCB0byBzbG93bHkgbW92ZSBpdCB0bworICAvLyB0aGUgaGFsbCBlZmZlY3Qgc2Vuc29yLgorICBkb3VibGUgemVyb2luZ19wb3NpdGlvbl87CisgIC8vIExhc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhlIGhhbGwgZWZmZWN0IHNlbnNvciB3YXMgb2ZmLgorICBkb3VibGUgbGFzdF9vZmZfcG9zaXRpb25fOworCisgIC8vIFRydWUgaWYgdGhlIHplcm9pbmcgZ29hbCB3YXMgY2FwcGVkIGR1cmluZyB0aGlzIGN5Y2xlLgorICBib29sIGNhcHBlZF9nb2FsXzsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgbnVtYmVyIGlzIGJldHdlZW4gZmlyc3QgYW5kIHNlY29uZCBpbmNsdXNpdmUuCisgIGJvb2wgaXNfYmV0d2Vlbihkb3VibGUgZmlyc3QsIGRvdWJsZSBzZWNvbmQsIGRvdWJsZSBudW1iZXIpIHsKKyAgICBpZiAoKG51bWJlciA+PSBmaXJzdCB8fCBudW1iZXIgPj0gc2Vjb25kKSAmJgorICAgICAgICAobnVtYmVyIDw9IGZpcnN0IHx8IG51bWJlciA8PSBzZWNvbmQpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFplcm9lZEpvaW50KTsKK307CisKK3RlbXBsYXRlIDxpbnQga051bVplcm9TZW5zb3JzPgorY29uc3QgOjphb3M6OnRpbWU6OlRpbWUgWmVyb2VkSm9pbnQ8a051bVplcm9TZW5zb3JzPjo6a1JlemVyb1RpbWUgPQorICAgIDo6YW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMoMik7CisKK3RlbXBsYXRlIDxpbnQga051bVplcm9TZW5zb3JzPgorLypzdGF0aWMqLyBjb25zdCBkb3VibGUgWmVyb2VkSm9pbnQ8a051bVplcm9TZW5zb3JzPjo6ZHQgPSAwLjAxOworCisvLyBVcGRhdGVzIHRoZSB6ZXJvZWQgam9pbnQgY29udHJvbGxlciBhbmQgc3RhdGUgbWFjaGluZS4KK3RlbXBsYXRlIDxpbnQga051bVplcm9TZW5zb3JzPgorZG91YmxlIFplcm9lZEpvaW50PGtOdW1aZXJvU2Vuc29ycz46OlVwZGF0ZSgKKyAgICBjb25zdCBaZXJvZWRKb2ludDxrTnVtWmVyb1NlbnNvcnM+OjpQb3NpdGlvbkRhdGEgKnBvc2l0aW9uLAorICAgIGJvb2wgb3V0cHV0X2VuYWJsZWQsCisgICAgZG91YmxlIGdvYWxfYW5nbGUsIGRvdWJsZSBnb2FsX3ZlbG9jaXR5KSB7CisgIC8vIFVuaW5pdGlhbGl6ZSB0aGUgYm90IGlmIHRvbyBtYW55IGN5Y2xlcyBwYXNzIHdpdGhvdXQgYW4gZW5jb2Rlci4KKyAgaWYgKHBvc2l0aW9uID09IE5VTEwpIHsKKyAgICBMT0coV0FSTklORywgIm5vIG5ldyBwb3MgZ2l2ZW5cbiIpOworICAgIGVycm9yX2NvdW50XysrOworICB9CisgIGlmIChlcnJvcl9jb3VudF8gPj0gNCkgeworICAgIG91dHB1dF9lbmFibGVkID0gZmFsc2U7CisgICAgTE9HKFdBUk5JTkcsICJlcnJfY291bnQgaXMgJWQgc28gZGlzYWJsaW5nXG4iLCBlcnJvcl9jb3VudF8pOworCisgICAgaWYgKCg6OmFvczo6dGltZTo6VGltZTo6Tm93KCkgLSBsYXN0X2dvb2RfdGltZV8pID4ga1JlemVyb1RpbWUpIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiZXJyX2NvdW50IGlzICVkIChvciAxc3QgdGltZSkgc28gZm9yY2luZyBhIHJlLXplcm9cbiIsCisgICAgICAgICAgZXJyb3JfY291bnRfKTsKKyAgICAgIHN0YXRlXyA9IFVOSU5JVElBTElaRUQ7CisgICAgICBsb29wXy0+UmVzZXQoKTsKKyAgICB9CisgIH0KKyAgaWYgKHBvc2l0aW9uICE9IE5VTEwpIHsKKyAgICBsYXN0X2dvb2RfdGltZV8gPSA6OmFvczo6dGltZTo6VGltZTo6Tm93KCk7CisgICAgZXJyb3JfY291bnRfID0gMDsKKyAgfQorCisgIC8vIENvbXB1dGUgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3cmlzdC4KKyAgZG91YmxlIGFic29sdXRlX3Bvc2l0aW9uOworICBpZiAocG9zaXRpb24pIHsKKyAgICBhYnNvbHV0ZV9wb3NpdGlvbiA9IHBvc2l0aW9uLT5wb3NpdGlvbjsKKyAgICBpZiAoc3RhdGVfID09IFJFQURZKSB7CisgICAgICBhYnNvbHV0ZV9wb3NpdGlvbiAtPSB6ZXJvX29mZnNldF87CisgICAgfQorICAgIGxvb3BfLT5ZIDw8IGFic29sdXRlX3Bvc2l0aW9uOworICAgIGlmICghQW55U2Vuc29yc0FjdGl2ZShwb3NpdGlvbikpIHsKKyAgICAgIGxhc3Rfb2ZmX3Bvc2l0aW9uXyA9IHBvc2l0aW9uLT5wb3NpdGlvbjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gRGVhZCByZWNvbiBmb3Igbm93LgorICAgIGFic29sdXRlX3Bvc2l0aW9uID0gbG9vcF8tPlhfaGF0KDAsIDApOworICB9CisKKyAgc3dpdGNoIChzdGF0ZV8pIHsKKyAgICBjYXNlIFVOSU5JVElBTElaRUQ6CisgICAgICBMT0coREVCVUcsICJVTklOSVRJQUxJWkVEXG4iKTsKKyAgICAgIGlmIChwb3NpdGlvbikgeworICAgICAgICAvLyBSZXNldCB0aGUgemVyb2luZyBnb2FsLgorICAgICAgICB6ZXJvaW5nX3Bvc2l0aW9uXyA9IGFic29sdXRlX3Bvc2l0aW9uOworICAgICAgICAvLyBDbGVhciB0aGUgb2JzZXJ2ZXIgc3RhdGUuCisgICAgICAgIGxvb3BfLT5YX2hhdCA8PCBhYnNvbHV0ZV9wb3NpdGlvbiwgMC4wLCAwLjA7CisgICAgICAgIGxvb3BfLT5aZXJvUG93ZXIoKTsKKyAgICAgICAgLy8gU2V0IHRoZSBnb2FsIHRvIGhlcmUgdG8gbWFrZSBpdCBzbyBpdCBkb2Vzbid0IG1vdmUgd2hlbiBkaXNhYmxlZC4KKyAgICAgICAgbG9vcF8tPlIgPSBsb29wXy0+WF9oYXQ7CisgICAgICAgIC8vIE9ubHkgcHJvZ3Jlc3MgaWYgd2UgYXJlIGVuYWJsZWQuCisgICAgICAgIGlmICg6OmFvczo6am95c3RpY2tfc3RhdGUtPmVuYWJsZWQpIHsKKyAgICAgICAgICBpZiAoQW55U2Vuc29yc0FjdGl2ZShwb3NpdGlvbikpIHsKKyAgICAgICAgICAgIHN0YXRlXyA9IE1PVklOR19PRkY7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXRlXyA9IFpFUk9JTkc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PVklOR19PRkY6CisgICAgICBMT0coREVCVUcsICJNT1ZJTkdfT0ZGXG4iKTsKKyAgICAgIHsKKyAgICAgICAgLy8gTW92ZSBvZmYgdGhlIGhhbGwgZWZmZWN0IHNlbnNvci4KKyAgICAgICAgaWYgKCE6OmFvczo6am95c3RpY2tfc3RhdGUtPmVuYWJsZWQpIHsKKyAgICAgICAgICAvLyBTdGFydCBvdmVyIGlmIGRpc2FibGVkLgorICAgICAgICAgIHN0YXRlXyA9IFVOSU5JVElBTElaRUQ7CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gJiYgIUFueVNlbnNvcnNBY3RpdmUocG9zaXRpb24pKSB7CisgICAgICAgICAgLy8gV2UgYXJlIG5vdyBvZmYgdGhlIHNlbnNvci4gIFRpbWUgdG8gemVybyBub3cuCisgICAgICAgICAgc3RhdGVfID0gWkVST0lORzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBTbG93bHkgY3JlZXAgb2ZmIHRoZSBzZW5zb3IuCisgICAgICAgICAgemVyb2luZ19wb3NpdGlvbl8gLT0gY29uZmlnX2RhdGFfLnplcm9pbmdfb2ZmX3NwZWVkICogZHQ7CisgICAgICAgICAgbG9vcF8tPlIgPDwgemVyb2luZ19wb3NpdGlvbl8sIC1jb25maWdfZGF0YV8uemVyb2luZ19vZmZfc3BlZWQsIDAuMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIGNhc2UgWkVST0lORzoKKyAgICAgIExPRyhERUJVRywgIlpFUk9JTkdcbiIpOworICAgICAgeworICAgICAgICBpbnQgYWN0aXZlX3NlbnNvcl9pbmRleCA9IEFjdGl2ZVNlbnNvckluZGV4KHBvc2l0aW9uKTsKKyAgICAgICAgaWYgKCE6OmFvczo6am95c3RpY2tfc3RhdGUtPmVuYWJsZWQpIHsKKyAgICAgICAgICAvLyBTdGFydCBvdmVyIGlmIGRpc2FibGVkLgorICAgICAgICAgIHN0YXRlXyA9IFVOSU5JVElBTElaRUQ7CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gJiYgYWN0aXZlX3NlbnNvcl9pbmRleCAhPSAtMSkgeworICAgICAgICAgIHN0YXRlXyA9IFJFQURZOworICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjYWxpYnJhdGlvbiBudW1iZXIgaXMgYmV0d2VlbiB0aGUgbGFzdCBvZmYgcG9zaXRpb24KKyAgICAgICAgICAvLyBhbmQgdGhlIGN1cnJlbnQgb24gcG9zaXRpb24uICBJZiB0aGlzIGlzIG5vdCB0cnVlLCBtb3ZlIG9mZiBhbmQgdHJ5CisgICAgICAgICAgLy8gYWdhaW4uCisgICAgICAgICAgY29uc3QgZG91YmxlIGNhbGlicmF0aW9uID0KKyAgICAgICAgICAgICAgcG9zaXRpb24tPmhhbGxfZWZmZWN0X3Bvc2l0aW9uc1thY3RpdmVfc2Vuc29yX2luZGV4XTsKKyAgICAgICAgICBpZiAoIWlzX2JldHdlZW4obGFzdF9vZmZfcG9zaXRpb25fLCBwb3NpdGlvbi0+cG9zaXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxpYnJhdGlvbikpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUiwgIkdvdCBhIGJvZ3VzIGNhbGlicmF0aW9uIG51bWJlci4gIFRyeWluZyBhZ2Fpbi5cbiIpOworICAgICAgICAgICAgTE9HKEVSUk9SLAorICAgICAgICAgICAgICAgICJMYXN0IG9mZiBwb3NpdGlvbiB3YXMgJWYsIGN1cnJlbnQgaXMgJWYsIGNhbGlicmF0aW9uIGlzICVmXG4iLAorICAgICAgICAgICAgICAgIGxhc3Rfb2ZmX3Bvc2l0aW9uXywgcG9zaXRpb24tPnBvc2l0aW9uLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5oYWxsX2VmZmVjdF9wb3NpdGlvbnNbYWN0aXZlX3NlbnNvcl9pbmRleF0pOworICAgICAgICAgICAgc3RhdGVfID0gTU9WSU5HX09GRjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgemVybywgYW5kIHRoZW4gb2Zmc2V0IHRoZSBvYnNlcnZlciB0byBkZWFsIHdpdGggdGhlCisgICAgICAgICAgICAvLyBwaGFudG9tIHN0ZXAgY2hhbmdlLgorICAgICAgICAgICAgY29uc3QgZG91YmxlIG9sZF96ZXJvX29mZnNldCA9IHplcm9fb2Zmc2V0XzsKKyAgICAgICAgICAgIHplcm9fb2Zmc2V0XyA9CisgICAgICAgICAgICAgICAgcG9zaXRpb24tPmhhbGxfZWZmZWN0X3Bvc2l0aW9uc1thY3RpdmVfc2Vuc29yX2luZGV4XSAtCisgICAgICAgICAgICAgICAgY29uZmlnX2RhdGFfLmhhbGxfZWZmZWN0X3N0YXJ0X2FuZ2xlW2FjdGl2ZV9zZW5zb3JfaW5kZXhdOworICAgICAgICAgICAgbG9vcF8tPlhfaGF0KDAsIDApICs9IG9sZF96ZXJvX29mZnNldCAtIHplcm9fb2Zmc2V0XzsKKyAgICAgICAgICAgIGxvb3BfLT5ZKDAsIDApICs9IG9sZF96ZXJvX29mZnNldCAtIHplcm9fb2Zmc2V0XzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gU2xvd2x5IGNyZWVwIHRvd2FyZHMgdGhlIHNlbnNvci4KKyAgICAgICAgICB6ZXJvaW5nX3Bvc2l0aW9uXyArPSBjb25maWdfZGF0YV8uemVyb2luZ19zcGVlZCAqIGR0OworICAgICAgICAgIGxvb3BfLT5SIDw8IHplcm9pbmdfcG9zaXRpb25fLCBjb25maWdfZGF0YV8uemVyb2luZ19zcGVlZCwgMC4wOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgY2FzZSBSRUFEWToKKyAgICAgIExPRyhERUJVRywgIlJFQURZXG4iKTsKKyAgICAgIHsKKyAgICAgICAgY29uc3QgZG91YmxlIGxpbWl0ZWRfZ29hbCA9IENsaXBHb2FsKGdvYWxfYW5nbGUpOworICAgICAgICBsb29wXy0+UiA8PCBsaW1pdGVkX2dvYWwsIGdvYWxfdmVsb2NpdHksIDAuMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIEVTVE9QOgorICAgICAgTE9HKERFQlVHLCAiRVNUT1BcbiIpOworICAgICAgTE9HKFdBUk5JTkcsICJoYXZlIGFscmVhZHkgZ2l2ZW4gdXBcbiIpOworICAgICAgcmV0dXJuIDAuMDsKKyAgfQorCisgIC8vIFVwZGF0ZSB0aGUgb2JzZXJ2ZXIuCisgIGxvb3BfLT5VcGRhdGUocG9zaXRpb24gIT0gTlVMTCwgIW91dHB1dF9lbmFibGVkKTsKKworICBMT0coREVCVUcsICJYX2hhdD17JWYsICVmLCAlZn1cbiIsCisgICAgICBsb29wXy0+WF9oYXQoMCwgMCksIGxvb3BfLT5YX2hhdCgxLCAwKSwgbG9vcF8tPlhfaGF0KDIsIDApKTsKKworICBjYXBwZWRfZ29hbF8gPSBmYWxzZTsKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIHplcm9pbmcgZ29hbCBoYXNuJ3QgcnVuIGF3YXkuCisgIHN3aXRjaCAoc3RhdGVfKSB7CisgICAgY2FzZSBVTklOSVRJQUxJWkVEOgorICAgIGNhc2UgUkVBRFk6CisgICAgY2FzZSBFU1RPUDoKKyAgICAgIC8vIE5vdCB6ZXJvaW5nLiAgTm8gd29ycmllcy4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9WSU5HX09GRjoKKyAgICBjYXNlIFpFUk9JTkc6CisgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGNsaXBlZCBhbmQgYWRqdXN0IHRoZSBnb2FsLgorICAgICAgaWYgKGxvb3BfLT51bmNhcHBlZF92b2x0YWdlKCkgPiBjb25maWdfZGF0YV8ubWF4X3plcm9pbmdfdm9sdGFnZSkgeworICAgICAgICBkb3VibGUgZHggPSAobG9vcF8tPnVuY2FwcGVkX3ZvbHRhZ2UoKSAtCisgICAgICAgICAgICAgICAgICAgICBjb25maWdfZGF0YV8ubWF4X3plcm9pbmdfdm9sdGFnZSkgLyBsb29wXy0+SygwLCAwKTsKKyAgICAgICAgemVyb2luZ19wb3NpdGlvbl8gLT0gZHg7CisgICAgICAgIGNhcHBlZF9nb2FsXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYobG9vcF8tPnVuY2FwcGVkX3ZvbHRhZ2UoKSA8IC1jb25maWdfZGF0YV8ubWF4X3plcm9pbmdfdm9sdGFnZSkgeworICAgICAgICBkb3VibGUgZHggPSAobG9vcF8tPnVuY2FwcGVkX3ZvbHRhZ2UoKSArCisgICAgICAgICAgICAgICAgICAgICBjb25maWdfZGF0YV8ubWF4X3plcm9pbmdfdm9sdGFnZSkgLyBsb29wXy0+SygwLCAwKTsKKyAgICAgICAgemVyb2luZ19wb3NpdGlvbl8gLT0gZHg7CisgICAgICAgIGNhcHBlZF9nb2FsXyA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorICBpZiAob3V0cHV0X2VuYWJsZWQpIHsKKyAgICBkb3VibGUgdm9sdGFnZSA9IGxvb3BfLT52b2x0YWdlKCk7CisgICAgaWYgKHZvbHRhZ2UgPiAwKSB7CisgICAgICB2b2x0YWdlICs9IGNvbmZpZ19kYXRhXy5kZWFkYmFuZF92b2x0YWdlOworICAgIH0gZWxzZSBpZiAodm9sdGFnZSA8IDApIHsKKyAgICAgIHZvbHRhZ2UgLT0gY29uZmlnX2RhdGFfLmRlYWRiYW5kX3ZvbHRhZ2U7CisgICAgfQorICAgIGlmICh2b2x0YWdlID4gMTIuMCkgeworICAgICAgdm9sdGFnZSA9IDEyLjA7CisgICAgfSBlbHNlIGlmICh2b2x0YWdlIDwgLTEyLjApIHsKKyAgICAgIHZvbHRhZ2UgPSAtMTIuMDsKKyAgICB9CisgICAgcmV0dXJuIHZvbHRhZ2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDAuMDsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9DT05UUk9MX0xPT1BTX1pFUk9FRF9KT0lOVF9IXwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2ZyYzk3MS5neXAgYi9mcmM5NzEvZnJjOTcxLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM4MTgwCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL2ZyYzk3MS5neXAKQEAgLTAsMCArMSwxNiBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnQWxsJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3NfYWxsLmd5cDpQcmltZScsCisKKyAgICAgICAgJ2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcF90ZXN0JywKKyAgICAgICAgJ2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6cG9zaXRpb25fc2Vuc29yX3NpbV90ZXN0JywKKyAgICAgICAgJ3plcm9pbmcvemVyb2luZy5neXA6emVyb2luZ190ZXN0JywKKyAgICAgICAgJ2NvbnRyb2xfbG9vcHMvdm9sdGFnZV9jYXAvdm9sdGFnZV9jYXAuZ3lwOnZvbHRhZ2VfY2FwX3Rlc3QnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvZnJjOTcxL3F1ZXVlcy9neXJvLnEgYi9mcmM5NzEvcXVldWVzL2d5cm8ucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjIzNGExCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3F1ZXVlcy9neXJvLnEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBmcmM5NzEuc2Vuc29yczsKKworbWVzc2FnZSBHeXJvUmVhZGluZyB7CisJLy8gUG9zaXRpdmUgaXMgY291bnRlci1jbG9ja3dpc2UgKEF1c3RpbiBzYXlzICJpdCdzIFBvc2l0aXZlIikuCisJLy8gUmlnaHQtaGFuZCBjb29yZGluYXRlIHN5c3RlbSBhcm91bmQgdGhlIFotYXhpcyBnb2luZyB1cC4KKwlkb3VibGUgYW5nbGU7Cit9OworcXVldWUgR3lyb1JlYWRpbmcgZ3lyb19yZWFkaW5nOworCittZXNzYWdlIFVpZCB7CisJdWludDMyX3QgdWlkOworfTsKK3F1ZXVlIFVpZCBneXJvX3BhcnRfaWQ7CmRpZmYgLS1naXQgYS9mcmM5NzEvcXVldWVzL3F1ZXVlcy5neXAgYi9mcmM5NzEvcXVldWVzL3F1ZXVlcy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxOGY4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS9xdWV1ZXMvcXVldWVzLmd5cApAQCAtMCwwICsxLDE1IEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdneXJvJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZ3lyby5xJywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAnZnJjOTcxL3F1ZXVlcycsCisgICAgICB9LAorICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9hb3MvYnVpbGQvcXVldWVzLmd5cGknXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvZnJjOTcxL3NoaWZ0ZXJfaGFsbF9lZmZlY3QuaCBiL2ZyYzk3MS9zaGlmdGVyX2hhbGxfZWZmZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhNWViZAotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS9zaGlmdGVyX2hhbGxfZWZmZWN0LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBGUkM5NzFfU0hJRlRFUl9IQUxMX0VGRkVDVF9IXworI2RlZmluZSBGUkM5NzFfU0hJRlRFUl9IQUxMX0VGRkVDVF9IXworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb25zdGFudHMgeworCisvLyBDb250YWlucyB0aGUgdm9sdGFnZXMgZm9yIGFuIGFuYWxvZyBoYWxsIGVmZmVjdCBzZW5zb3Igb24gYSBzaGlmdGVyLgorc3RydWN0IFNoaWZ0ZXJIYWxsRWZmZWN0IHsKKyAgLy8gVGhlIG51bWJlcnMgdG8gdXNlIGZvciBzY2FsaW5nIHJhdyB2b2x0YWdlcyB0byAwLTEuCisgIC8vIExvdyBpcyBuZWFyIDAuMCwgaGlnaCBpcyBuZWFyIDEuMAorICBkb3VibGUgbG93X2dlYXJfbWlkZGxlLCBsb3dfZ2Vhcl9sb3c7CisgIGRvdWJsZSBoaWdoX2dlYXJfaGlnaCwgaGlnaF9nZWFyX21pZGRsZTsKKworICAvLyBUaGUgbnVtYmVycyBmb3Igd2hlbiB0aGUgZG9nIGlzIGNsZWFyIG9mIGVhY2ggZ2Vhci4KKyAgZG91YmxlIGNsZWFyX2xvdywgY2xlYXJfaGlnaDsKK307CisKK30gLy8gY29uc3RhbnRzCit9IC8vIGZyYzk3MQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfcGNtLmNjIGIvZnJjOTcxL3dwaWxpYi9idWZmZXJlZF9wY20uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0ZDRiNQotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfcGNtLmNjCkBAIC0wLDAgKzEsMjkgQEAKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3BjbS5oIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHdwaWxpYiB7CisKKzo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkU29sZW5vaWQ+IEJ1ZmZlcmVkUGNtOjpNYWtlU29sZW5vaWQoaW50IG51bWJlcikgeworICByZXR1cm4gOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4oCisgICAgICBuZXcgQnVmZmVyZWRTb2xlbm9pZChudW1iZXIsIHRoaXMpKTsKK30KKwordm9pZCBCdWZmZXJlZFBjbTo6U2V0KGludCBudW1iZXIsIGJvb2wgdmFsdWUpIHsKKyAgaWYgKHZhbHVlKSB7CisgICAgdmFsdWVzXyB8PSAxIDw8IG51bWJlcjsKKyAgfSBlbHNlIHsKKyAgICB2YWx1ZXNfICY9IH4oMSA8PCBudW1iZXIpOworICB9Cit9CisKK3ZvaWQgQnVmZmVyZWRQY206OkZsdXNoKCkgeworICBMT0coREVCVUcsICJzZW5kaW5nIHNvbGVub2lkcyAweCUiIFBSSXg4ICJcbiIsIHZhbHVlc18pOworICBTb2xlbm9pZEJhc2U6OlNldCh2YWx1ZXNfLCAweEZGKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHdwaWxpYgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9idWZmZXJlZF9wY20uaCBiL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfcGNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmODZmYwotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfcGNtLmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBGUkM5NzFfV1BJTElCX0JVRkZFUkVEX1BDTV9IXworI2RlZmluZSBGUkM5NzFfV1BJTElCX0JVRkZFUkVEX1BDTV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiU29sZW5vaWRCYXNlLmgiCisKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3NvbGVub2lkLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHdwaWxpYiB7CisKKy8vIE1hbmFnZXMgc2V0dGluZyB2YWx1ZXMgZm9yIGFsbCBzb2xlbm9pZHMgZm9yIGEgc2luZ2xlIFBDTSBpbiBhIHNpbmdsZSBDQU4KKy8vIG1lc3NhZ2UuCisvLworLy8gVGhlIHdheSB0byB1c2UgdGhpcyBpcyB0byBjYWxsIE1ha2VTb2xlbm9pZCBmb3Igd2hpY2hldmVyIHNvbGVub2lkIG51bWJlcnMKKy8vIHlvdSB3YW50LCBjYWxsIFNldCBvbiB0aG9zZSwgYW5kIHRoZW4gcGVyaW9kaWNhbGx5IGNhbGwgRmx1c2ggb24gdGhpcyBvYmplY3QKKy8vIHRvIHdyaXRlIGFsbCBvZiB0aGUgYnVmZmVyZWQgdmFsdWVzIG91dC4KK2NsYXNzIEJ1ZmZlcmVkUGNtIDogcHVibGljIFNvbGVub2lkQmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBCdWZmZXJlZFBjbSh1aW50OF90IG1vZHVsZSA9IEdldERlZmF1bHRTb2xlbm9pZE1vZHVsZSgpKQorICAgICAgOiBTb2xlbm9pZEJhc2UobW9kdWxlKSB7fQorCisgIC8vIENyZWF0ZXMgYSBuZXcgQnVmZmVyZWRTb2xlbm9pZCBmb3IgYSBzcGVjaWZpZWQgcG9ydCBudW1iZXIuCisgIDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkU29sZW5vaWQ+IE1ha2VTb2xlbm9pZChpbnQgbnVtYmVyKTsKKworICAvLyBBY3R1YWxseSBzZW5kcyBhbGwgb2YgdGhlIHZhbHVlcyBvdXQuCisgIHZvaWQgRmx1c2goKTsKKworIHByaXZhdGU6CisgIC8vIFdQSUxpYiBkZWNsYXJlcyB0aGlzIHB1cmUgdmlydHVhbCBhbmQgdGhlbiBuZXZlciBjYWxscyBpdC4uLgorICB2aXJ0dWFsIHZvaWQgSW5pdFNvbGVub2lkKCkgb3ZlcnJpZGUge30KKworICB2b2lkIFNldChpbnQgbnVtYmVyLCBib29sIHZhbHVlKTsKKworICB1aW50OF90IHZhbHVlc18gPSAwOworCisgIGZyaWVuZCBjbGFzcyBCdWZmZXJlZFNvbGVub2lkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHdwaWxpYgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9XUElMSUJfQlVGRkVSRURfUENNX0hfCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3NvbGVub2lkLmNjIGIvZnJjOTcxL3dwaWxpYi9idWZmZXJlZF9zb2xlbm9pZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDY4ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3dwaWxpYi9idWZmZXJlZF9zb2xlbm9pZC5jYwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9idWZmZXJlZF9zb2xlbm9pZC5oIgorCisjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9idWZmZXJlZF9wY20uaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2Ugd3BpbGliIHsKKwordm9pZCBCdWZmZXJlZFNvbGVub2lkOjpTZXQoYm9vbCB2YWx1ZSkgeworICBwY21fLT5TZXQobnVtYmVyXywgdmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3NvbGVub2lkLmggYi9mcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3NvbGVub2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhNGMxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfc29sZW5vaWQuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIEZSQzk3MV9XUElMSUJfQlVGRkVSRURfU09MRU5PSURfSF8KKyNkZWZpbmUgRlJDOTcxX1dQSUxJQl9CVUZGRVJFRF9TT0xFTk9JRF9IXworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB3cGlsaWIgeworCitjbGFzcyBCdWZmZXJlZFBjbTsKKworLy8gSGFuZGxlcyBzZW5kaW5nIHZhbHVlcyBmb3IgYSBzaW5nbGUgc29sZW5vaWQgdG8gYSBCdWZmZXJlZFBjbS4gSW5zdGFuY2VzIGFyZQorLy8gY3JlYXRlZCB3aXRoIEJ1ZmZlcmVkUGNtOjpNYWtlU29sZW5vaWQuCitjbGFzcyBCdWZmZXJlZFNvbGVub2lkIHsKKyBwdWJsaWM6CisgIC8vIFNldHMgb3IgdW5zZXRzIHRoZSBzb2xlbm9pZC4KKyAgdm9pZCBTZXQoYm9vbCB2YWx1ZSk7CisKKyBwcml2YXRlOgorICBCdWZmZXJlZFNvbGVub2lkKGludCBudW1iZXIsIEJ1ZmZlcmVkUGNtICpwY20pIDogbnVtYmVyXyhudW1iZXIpLCBwY21fKHBjbSkge30KKworICBjb25zdCBpbnQgbnVtYmVyXzsKKyAgQnVmZmVyZWRQY20gKmNvbnN0IHBjbV87CisKKyAgZnJpZW5kIGNsYXNzIEJ1ZmZlcmVkUGNtOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHdwaWxpYgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9XUElMSUJfQlVGRkVSRURfU09MRU5PSURfSF8KZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvZG1hX2VkZ2VfY291bnRpbmcuY2MgYi9mcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDg0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmNjCkBAIC0wLDAgKzEsNjUgQEAKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB3cGlsaWIgeworCitib29sIERNQUVkZ2VDb3VudGVyOjpFeHRyYWN0VmFsdWUoY29uc3QgRE1BU2FtcGxlICZzYW1wbGUpIGNvbnN0IHsKKyAgaWYgKGludmVydGVkXykgeworICAgIHJldHVybiAhc2FtcGxlLkdldChpbnB1dF8pOworICB9IGVsc2UgeworICAgIHJldHVybiBzYW1wbGUuR2V0KGlucHV0Xyk7CisgIH0KK30KKwordm9pZCBETUFFZGdlQ291bnRlcjo6VXBkYXRlRnJvbVNhbXBsZShjb25zdCBETUFTYW1wbGUgJnNhbXBsZSkgeworICBpZiAoIWhhdmVfcHJldl9zYW1wbGVfKSB7CisgICAgaGF2ZV9wcmV2X3NhbXBsZV8gPSB0cnVlOworICB9IGVsc2UgeworICAgIGlmICghRXh0cmFjdFZhbHVlKHByZXZfc2FtcGxlXykgJiYgRXh0cmFjdFZhbHVlKHNhbXBsZSkpIHsKKyAgICAgIHBvc19lZGdlX2NvdW50XysrOworICAgICAgcG9zX2VkZ2VfdGltZV8gPSBzYW1wbGUuR2V0VGltZXN0YW1wKCk7CisgICAgICBwb3NfbGFzdF9lbmNvZGVyXyA9IHNhbXBsZS5HZXRSYXcoZW5jb2Rlcl8pOworICAgIH0gZWxzZSBpZiAoRXh0cmFjdFZhbHVlKHByZXZfc2FtcGxlXykgJiYgIUV4dHJhY3RWYWx1ZShzYW1wbGUpKSB7CisgICAgICBuZWdfZWRnZV9jb3VudF8rKzsKKyAgICAgIG5lZ19lZGdlX3RpbWVfID0gc2FtcGxlLkdldFRpbWVzdGFtcCgpOworICAgICAgbmVnX2xhc3RfZW5jb2Rlcl8gPSBzYW1wbGUuR2V0UmF3KGVuY29kZXJfKTsKKyAgICB9CisgIH0KKworICBwcmV2X3NhbXBsZV8gPSBzYW1wbGU7Cit9CisKK3ZvaWQgRE1BU3luY2hyb25pemVyOjpDaGVja0RNQSgpIHsKKyAgRE1BU2FtcGxlIGN1cnJlbnRfc2FtcGxlOworCisgIHNpemVfdCByZW1haW5pbmcgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIHN3aXRjaCAoZG1hXy0+UmVhZCgmY3VycmVudF9zYW1wbGUsIDAsICZyZW1haW5pbmcpKSB7CisgICAgICBjYXNlIERNQTo6U1RBVFVTX09LOgorICAgICAgICBmb3IgKGF1dG8gJmMgOiBoYW5kbGVyc18pIHsKKyAgICAgICAgICBjLT5VcGRhdGVGcm9tU2FtcGxlKGN1cnJlbnRfc2FtcGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgeworICAgICAgICAgIGlmIChzYW1wbGVfdGltZV8gPCBjdXJyZW50X3NhbXBsZS5HZXRUaW1lc3RhbXAoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGxhdGVzdCBETUEgc2FtcGxlIGhhcHBlbmVkIGFmdGVyIHdlIHN0YXJ0ZWQgcG9sbGluZywgdGhlbgorICAgICAgICAgICAgLy8ganVzdCB1c2UgdGhlIHZhbHVlcyBmcm9tIGl0IGJlY2F1c2UgdGhleSdyZSBtb3JlIHJlY2VudC4KKyAgICAgICAgICAgIGZvciAoYXV0byAmYyA6IGhhbmRsZXJzXykgeworICAgICAgICAgICAgICBjLT5Qb2xsRnJvbVNhbXBsZShjdXJyZW50X3NhbXBsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgY2FzZSBETUE6OlNUQVRVU19USU1FT1VUOgorICAgICAgICByZXR1cm47CisgICAgICBjYXNlIERNQTo6U1RBVFVTX0VSUk9SOgorICAgICAgICBMT0coV0FSTklORywgIkRNQSByZWFkIGZhaWxlZFxuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmggYi9mcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5ZGM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvZG1hX2VkZ2VfY291bnRpbmcuaApAQCAtMCwwICsxLDE4NSBAQAorI2lmbmRlZiBGUkM5NzFfV1BJTElCX0RNQV9FREdFX0NPVU5USU5HX0hfCisjZGVmaW5lIEZSQzk3MV9XUElMSUJfRE1BX0VER0VfQ09VTlRJTkdfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL21hY3Jvcy5oIgorCisjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9oYWxsX2VmZmVjdC5oIgorCisjaW5jbHVkZSAiRGlnaXRhbFNvdXJjZS5oIgorI2luY2x1ZGUgIkVuY29kZXIuaCIKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJkbWEuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2Ugd3BpbGliIHsKKworLy8gR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCBkbyBzb21ldGhpbmcgd2l0aCBETUEgc2FtcGxlcyBhbmQgYWxzbworLy8gcG9sbCBjdXJyZW50IHNlbnNvciB2YWx1ZXMuCitjbGFzcyBETUFTYW1wbGVIYW5kbGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkRNQVNhbXBsZUhhbmRsZXJJbnRlcmZhY2UoKSB7fQorCisgIC8vIFVwZGF0ZXMgdmFsdWVzIGJhc2VkIG9uIGEgbmV3IERNQSBzYW1wbGUuCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVGcm9tU2FtcGxlKGNvbnN0IERNQVNhbXBsZSAmc2FtcGxlKSA9IDA7CisKKyAgLy8gUG9sbHMgdGhlIGN1cnJlbnQgdmFsdWVzIGFuZCBzYXZlcyB0aGVtIGZvciBsYXRlciByZWZlcmVuY2UuCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVQb2xsZWRWYWx1ZSgpID0gMDsKKworICAvLyBGaWxscyBpbiB0aGUgInBvbGxlZCIgdmFsdWVzIGZyb20gc2FtcGxlLgorICAvLyBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gYSBETUEgZXZlbnQgaGFwcGVucyByaWdodCBhcyB3ZSdyZSBwb2xsaW5nIHZhbHVlcy4KKyAgdmlydHVhbCB2b2lkIFBvbGxGcm9tU2FtcGxlKGNvbnN0IERNQVNhbXBsZSAmc2FtcGxlKSA9IDA7CisKKyAgLy8gQWRkcyByZWFkaW5ncyBhbmQgdHJpZ2dlcnMgYXBwcm9wcmlhdGUgdG8gdGhpcyBvYmplY3QgdG8gZG1hLgorICB2aXJ0dWFsIHZvaWQgQWRkVG9ETUEoRE1BICpkbWEpID0gMDsKK307CisKKy8vIENvdW50cyBlZGdlcyBvbiBhIHNlbnNvciB1c2luZyBETUEgZGF0YSBhbmQgbGF0Y2hlcyBlbmNvZGVyIHZhbHVlcworLy8gY29ycmVzcG9uZGluZyB0byB0aG9zZSBlZGdlcy4KK2NsYXNzIERNQUVkZ2VDb3VudGVyIDogcHVibGljIERNQVNhbXBsZUhhbmRsZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgRE1BRWRnZUNvdW50ZXIoRW5jb2RlciAqZW5jb2RlciwgRGlnaXRhbFNvdXJjZSAqaW5wdXQpCisgICAgICA6IGVuY29kZXJfKGVuY29kZXIpLCBpbnB1dF8oaW5wdXQpLCBpbnZlcnRlZF8oZmFsc2UpIHt9CisgIERNQUVkZ2VDb3VudGVyKEVuY29kZXIgKmVuY29kZXIsIEhhbGxFZmZlY3QgKmlucHV0KQorICAgICAgOiBlbmNvZGVyXyhlbmNvZGVyKSwgaW5wdXRfKGlucHV0KSwgaW52ZXJ0ZWRfKHRydWUpIHt9CisKKyAgaW50IHBvc2l0aXZlX2NvdW50KCkgY29uc3QgeyByZXR1cm4gcG9zX2VkZ2VfY291bnRfOyB9CisgIGludCBuZWdhdGl2ZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIG5lZ19lZGdlX2NvdW50XzsgfQorICBpbnQgbGFzdF9wb3NpdGl2ZV9lbmNvZGVyX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gcG9zX2xhc3RfZW5jb2Rlcl87IH0KKyAgaW50IGxhc3RfbmVnYXRpdmVfZW5jb2Rlcl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG5lZ19sYXN0X2VuY29kZXJfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNlbnNvciBpbiB0aGUgbGFzdC1yZWFkIERNQSBzYW1wbGUuCisgIGJvb2wgbGFzdF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEV4dHJhY3RWYWx1ZShwcmV2X3NhbXBsZV8pOyB9CisgIC8vIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHBvbGxlZCB2YWx1ZSBvZiB0aGUgc2Vuc29yLgorICBib29sIHBvbGxlZF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHBvbGxlZF92YWx1ZV87IH0KKyAgLy8gUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgcG9sbGVkIHJlYWRpbmcgZnJvbSB0aGUgZW5jb2Rlci4KKyAgaW50IHBvbGxlZF9lbmNvZGVyKCkgY29uc3QgeyByZXR1cm4gcG9sbGVkX2VuY29kZXJfOyB9CisKKyBwcml2YXRlOgorICB2b2lkIFVwZGF0ZUZyb21TYW1wbGUoY29uc3QgRE1BU2FtcGxlICZzYW1wbGUpIG92ZXJyaWRlOworICB2b2lkIFVwZGF0ZVBvbGxlZFZhbHVlKCkgb3ZlcnJpZGUgeworICAgIHBvbGxlZF92YWx1ZV8gPSBpbnB1dF8tPkdldCgpOworICAgIHBvbGxlZF9lbmNvZGVyXyA9IGVuY29kZXJfLT5HZXRSYXcoKTsKKyAgfQorICB2b2lkIFBvbGxGcm9tU2FtcGxlKGNvbnN0IERNQVNhbXBsZSAmc2FtcGxlKSBvdmVycmlkZSB7CisgICAgcG9sbGVkX3ZhbHVlXyA9IEV4dHJhY3RWYWx1ZShzYW1wbGUpOworICAgIHBvbGxlZF9lbmNvZGVyXyA9IHNhbXBsZS5HZXRSYXcoZW5jb2Rlcl8pOworICB9CisgIHZvaWQgQWRkVG9ETUEoRE1BICpkbWEpIG92ZXJyaWRlIHsKKyAgICBkbWEtPkFkZChlbmNvZGVyXyk7CisgICAgZG1hLT5BZGQoaW5wdXRfKTsKKyAgfQorCisgIGJvb2wgRXh0cmFjdFZhbHVlKGNvbnN0IERNQVNhbXBsZSAmc2FtcGxlKSBjb25zdDsKKworICBFbmNvZGVyICpjb25zdCBlbmNvZGVyXzsKKyAgRGlnaXRhbFNvdXJjZSAqY29uc3QgaW5wdXRfOworICBjb25zdCBib29sIGludmVydGVkXzsKKworICAvLyBUaGUgbGFzdCBETUEgcmVhZGluZyB3ZSBnb3QuCisgIERNQVNhbXBsZSBwcmV2X3NhbXBsZV87CisgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGFjdHVhbGx5IGhhdmUgYW55dGhpbmcgaW4gcHJldl9zYW1wbGVfLgorICBib29sIGhhdmVfcHJldl9zYW1wbGVfID0gZmFsc2U7CisKKyAgLy8gVmFsdWVzIHJlbGF0ZWQgdG8gdGhlIHBvc2l0aXZlIGVkZ2UuCisgIGludCBwb3NfZWRnZV9jb3VudF8gPSAwOworICBkb3VibGUgcG9zX2VkZ2VfdGltZV8gPSAwLjA7CisgIGludCBwb3NfbGFzdF9lbmNvZGVyXyA9IDA7CisKKyAgLy8gVmFsdWVzIHJlbGF0ZWQgdG8gdGhlIG5lZ2F0aXZlIGVkZ2UuCisgIGludCBuZWdfZWRnZV9jb3VudF8gPSAwOworICBkb3VibGUgbmVnX2VkZ2VfdGltZV8gPSAwLjA7CisgIGludCBuZWdfbGFzdF9lbmNvZGVyXyA9IDA7CisKKyAgYm9vbCBwb2xsZWRfdmFsdWVfID0gZmFsc2U7CisgIGludCBwb2xsZWRfZW5jb2Rlcl8gPSAwOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihETUFFZGdlQ291bnRlcik7Cit9OworCisvLyBSZWFkcyBhIGhhbGwgZWZmZWN0IGluIHN5bmMgd2l0aCBETUEgc2FtcGxlcy4KK2NsYXNzIERNQURpZ2l0YWxSZWFkZXIgOiBwdWJsaWMgRE1BU2FtcGxlSGFuZGxlckludGVyZmFjZSB7CisgcHVibGljOgorICBETUFEaWdpdGFsUmVhZGVyKERpZ2l0YWxTb3VyY2UgKmlucHV0KSA6IGlucHV0XyhpbnB1dCksIGludmVydGVkXyhmYWxzZSkge30KKyAgRE1BRGlnaXRhbFJlYWRlcihIYWxsRWZmZWN0ICppbnB1dCkgOiBpbnB1dF8oaW5wdXQpLCBpbnZlcnRlZF8odHJ1ZSkge30KKworICBib29sIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICB2b2lkIFVwZGF0ZUZyb21TYW1wbGUoY29uc3QgRE1BU2FtcGxlICYgLypzYW1wbGUqLykgb3ZlcnJpZGUge30KKyAgdm9pZCBVcGRhdGVQb2xsZWRWYWx1ZSgpIG92ZXJyaWRlIHsgdmFsdWVfID0gaW5wdXRfLT5HZXQoKTsgfQorICB2b2lkIFBvbGxGcm9tU2FtcGxlKGNvbnN0IERNQVNhbXBsZSAmc2FtcGxlKSBvdmVycmlkZSB7CisgICAgaWYgKGludmVydGVkXykgeworICAgICAgdmFsdWVfID0gIXNhbXBsZS5HZXQoaW5wdXRfKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFsdWVfID0gc2FtcGxlLkdldChpbnB1dF8pOworICAgIH0KKyAgfQorICB2b2lkIEFkZFRvRE1BKERNQSAqZG1hKSBvdmVycmlkZSB7CisgICAgZG1hLT5BZGQoaW5wdXRfKTsKKyAgfQorCisgIERpZ2l0YWxTb3VyY2UgKmNvbnN0IGlucHV0XzsKKyAgY29uc3QgYm9vbCBpbnZlcnRlZF87CisKKyAgYm9vbCB2YWx1ZV87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERNQURpZ2l0YWxSZWFkZXIpOworfTsKKworLy8gVGhpcyBjbGFzcyBoYW5kbGVzIHVwZGF0aW5nIHRoZSBzYW1wbGVkIGRhdGEgb24gbXVsdGlwbGUKKy8vIERNQVNhbXBsZUhhbmRsZXJJbnRlcmZhY2VzLiBUaGUgY2FsbGVyIHNob3VsZCBjcmVhdGUgYW4gaW5zdGFuY2UgYW5kIHRoZW4KKy8vIHBlcmlvZGljYWxseSBjYWxsIFJ1bkl0ZXJhdGlvbiwgcmV0cmlldmluZyB3aGF0ZXZlciBkYXRhIGZyb20gdGhlCisvLyBETUFTYW1wbGVIYW5kbGVySW50ZXJmYWNlcyBhZnRlciBlYWNoIGl0ZXJhdGlvbi4KK2NsYXNzIERNQVN5bmNocm9uaXplciB7CisgcHVibGljOgorICBETUFTeW5jaHJvbml6ZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8RE1BPiBkbWEpIDogZG1hXyg6OnN0ZDo6bW92ZShkbWEpKSB7fQorCisgIC8vIEFkZHMgYSBuZXcgaGFuZGxlciB0byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkIGFmdGVyCisgIC8vIFN0YXJ0KCkuCisgIHZvaWQgQWRkKERNQVNhbXBsZUhhbmRsZXJJbnRlcmZhY2UgKmhhbmRsZXIpIHsKKyAgICBoYW5kbGVyLT5BZGRUb0RNQShkbWFfLmdldCgpKTsKKyAgICBoYW5kbGVyc18uZW1wbGFjZV9iYWNrKGhhbmRsZXIpOworICB9CisKKyAgLy8gQWN0dWFsbHkgc3RhcnRzIHdhdGNoaW5nIGZvciBETUEgc2FtcGxlcy4KKyAgLy8gQWRkIG1heSBub3QgYmUgY2FsbGVkIGFueSBtb3JlIGFmdGVyIHRoaXMuCisgIHZvaWQgU3RhcnQoKSB7CisgICAgZG1hXy0+U3RhcnQoMTAyNCk7CisgIH0KKworICAvLyBVcGRhdGVzIGFsbCBzZW5zb3IgdmFsdWVzLgorICB2b2lkIFJ1bkl0ZXJhdGlvbigpIHsKKyAgICBTYW1wbGVTZW5zb3JzKCk7CisgICAgQ2hlY2tETUEoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gUmVhZHMgdGhlIHN0YXRlIG9mIGFsbCB0aGUgc2Vuc29ycyBhbmQgcmVjb3JkcyBpdCBhcyB0aGUgcG9sbGVkIHZhbHVlcyBvZgorICAvLyBhbGwgdGhlIGlucHV0cy4KKyAgdm9pZCBTYW1wbGVTZW5zb3JzKCkgeworICAgIHNhbXBsZV90aW1lXyA9IEdldEZQR0FUaW1lKCk7CisgICAgZm9yIChhdXRvICZjIDogaGFuZGxlcnNfKSB7CisgICAgICBjLT5VcGRhdGVQb2xsZWRWYWx1ZSgpOworICAgIH0KKyAgfQorCisgIC8vIEdldHMgY2FsbGVkIGJ5IHRoZSBETUEgaGFuZGxlciB0byB1cGRhdGUgZWRnZSBjb3VudHMuCisgIHZvaWQgQ2hlY2tETUEoKTsKKworICBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxETUE+IGRtYV87CisgIDo6c3RkOjp2ZWN0b3I8RE1BU2FtcGxlSGFuZGxlckludGVyZmFjZSAqPiBoYW5kbGVyc187CisKKyAgLy8gVGhlIHRpbWUgYXQgd2hpY2ggd2UgbW9zdCByZWNlbnRseSByZWFkIHRoZSBzZW5zb3IgdmFsdWVzLgorICBkb3VibGUgc2FtcGxlX3RpbWVfID0gMC4wOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihETUFTeW5jaHJvbml6ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHdwaWxpYgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9XUElMSUJfRE1BX0VER0VfQ09VTlRJTkdfSF8KZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlci5jYyBiL2ZyYzk3MS93cGlsaWIvZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDBjNDliCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3dwaWxpYi9lbmNvZGVyX2FuZF9wb3RlbnRpb21ldGVyLmNjCkBAIC0wLDAgKzEsNTcgQEAKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2VuY29kZXJfYW5kX3BvdGVudGlvbWV0ZXIuaCIKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB3cGlsaWIgeworCit2b2lkIERNQUVuY29kZXJBbmRQb3RlbnRpb21ldGVyOjpVcGRhdGVGcm9tU2FtcGxlKGNvbnN0IERNQVNhbXBsZSAmc2FtcGxlKSB7CisgIGlmIChpbmRleF9sYXN0X3ZhbHVlXykgeworICAgIC8vIEl0IHdhcyBhbHJlYWR5IHRydWUgbGFzdCB0aW1lLCBzbyBjaGVjayBpZiBpdCdzIHJlc2V0IGJhY2sgdG8gZmFsc2UgeWV0LgorICAgIGluZGV4X2xhc3RfdmFsdWVfID0gc2FtcGxlLkdldChpbmRleF8uZ2V0KCkpOworICB9IGVsc2UgaWYgKHNhbXBsZS5HZXQoaW5kZXhfLmdldCgpKSkgeworICAgIC8vIFRoaXMgc2FtcGxlIGlzIHBvc2VkZ2UsIHNvIHJlY29yZCBhbGwgdGhlIHZhbHVlcy4KKyAgICBpbmRleF9sYXN0X3ZhbHVlXyA9IHRydWU7CisgICAgKytpbmRleF9wb3NlZGdlX2NvdW50XzsKKyAgICBsYXN0X2VuY29kZXJfdmFsdWVfID0gc2FtcGxlLkdldFJhdyhlbmNvZGVyXy5nZXQoKSk7CisgICAgbGFzdF9wb3RlbnRpb21ldGVyX3ZvbHRhZ2VfID0gc2FtcGxlLkdldFZvbHRhZ2UocG90ZW50aW9tZXRlcl8uZ2V0KCkpOworICB9Cit9CisKK3ZvaWQgSW50ZXJydXB0RW5jb2RlckFuZFBvdGVudGlvbWV0ZXI6OlN0YXJ0KCkgeworICBDSEVDS19ORShudWxscHRyLCBlbmNvZGVyXyk7CisgIENIRUNLX05FKG51bGxwdHIsIGluZGV4Xyk7CisgIENIRUNLX05FKG51bGxwdHIsIHBvdGVudGlvbWV0ZXJfKTsKKyAgQ0hFQ0tfTkUoMCwgcHJpb3JpdHlfKTsKKyAgdGhyZWFkXyA9IDo6c3RkOjp0aHJlYWQoOjpzdGQ6OnJlZigqdGhpcykpOworfQorCit2b2lkIEludGVycnVwdEVuY29kZXJBbmRQb3RlbnRpb21ldGVyOjpvcGVyYXRvcigpKCkgeworICA6OmFvczo6U2V0Q3VycmVudFRocmVhZE5hbWUoIkludEVuY1BvdF8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjp0b19zdHJpbmcocG90ZW50aW9tZXRlcl8tPkdldENoYW5uZWwoKSkpOworCisgIGluZGV4Xy0+UmVxdWVzdEludGVycnVwdHMoKTsKKyAgaW5kZXhfLT5TZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOworCisgIDo6YW9zOjpTZXRDdXJyZW50VGhyZWFkUmVhbHRpbWVQcmlvcml0eShwcmlvcml0eV8pOworCisgIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpXYWl0UmVzdWx0IHJlc3VsdCA9IEludGVycnVwdGFibGVTZW5zb3JCYXNlOjprQm90aDsKKyAgd2hpbGUgKHJ1bl8pIHsKKyAgICByZXN1bHQgPSBpbmRleF8tPldhaXRGb3JJbnRlcnJ1cHQoCisgICAgICAgIDAuMSwgcmVzdWx0ICE9IEludGVycnVwdGFibGVTZW5zb3JCYXNlOjprVGltZW91dCk7CisgICAgaWYgKHJlc3VsdCA9PSBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6a1RpbWVvdXQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHsKKyAgICAgIDo6YW9zOjpNdXRleExvY2tlciBsb2NrZXIoJm11dGV4Xyk7CisgICAgICBsYXN0X3BvdGVudGlvbWV0ZXJfdm9sdGFnZV8gPSBwb3RlbnRpb21ldGVyXy0+R2V0Vm9sdGFnZSgpOworICAgICAgbGFzdF9lbmNvZGVyX3ZhbHVlXyA9IGVuY29kZXJfLT5HZXRSYXcoKTsKKyAgICAgICsraW5kZXhfcG9zZWRnZV9jb3VudF87CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSB3cGlsaWIKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlci5oIGIvZnJjOTcxL3dwaWxpYi9lbmNvZGVyX2FuZF9wb3RlbnRpb21ldGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1MDg0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlci5oCkBAIC0wLDAgKzEsMTY5IEBACisjaWZuZGVmIEZSQzk3MV9FTkNPREVSX0FORF9QT1RFTlRJT01FVEVSX0hfCisjZGVmaW5lIEZSQzk3MV9FTkNPREVSX0FORF9QT1RFTlRJT01FVEVSX0hfCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tYWNyb3MuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL211dGV4LmgiCisKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisjaW5jbHVkZSAiRGlnaXRhbFNvdXJjZS5oIgorI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisjaW5jbHVkZSAiZG1hLmgiCisKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHdwaWxpYiB7CisKKy8vIExhdGNoZXMgdmFsdWVzIGZyb20gYW4gZW5jb2RlciBhbmQgcG90ZW50aW9tZXRlciBvbiBwb3NpdGl2ZSBlZGdlcyBmcm9tCisvLyBhbm90aGVyIGlucHV0IHVzaW5nIGFuIGludGVycnVwdC4KK2NsYXNzIEludGVycnVwdEVuY29kZXJBbmRQb3RlbnRpb21ldGVyIHsKKyBwdWJsaWM6CisgIC8vIHByaW9yaXR5IGlzIHRoZSBwcmlvcml0eSB0aGUgdGhyZWFkIHdpbGwgcnVuIGF0LgorICBJbnRlcnJ1cHRFbmNvZGVyQW5kUG90ZW50aW9tZXRlcihpbnQgcHJpb3JpdHkpIDogcHJpb3JpdHlfKHByaW9yaXR5KSB7fQorCisgIC8vIFN0YXJ0cyB0aGUgdGhyZWFkIHJ1bm5pbmcgc28gaXQgY2FuIHJlY2VpdmUgaW50ZXJydXB0cy4KKyAgdm9pZCBTdGFydCgpOworCisgIC8vIFRlbGxzIHRoZSB0aHJlYWQgdG8gc3RvcCBydW5uaW5nIGFuZCB0aGVuIHdhaXRzIGZvciBpdCB0byBmaW5pc2guCisgIHZvaWQgU3RvcCgpIHsKKyAgICBydW5fID0gZmFsc2U7CisgICAgdGhyZWFkXy5qb2luKCk7CisgIH0KKworICAvLyBMb29wcyB1bnRpbCBTdG9wKCkgaXMgY2FsbGVkLCByZWFkaW5nIGludGVycnVwdHMuCisgIC8vIERlc2lnbmVkIHRvIGJlIGNhbGxlZCBieSA6OnN0ZDo6dGhyZWFkIGludGVybmFsbHkuCisgIHZvaWQgb3BlcmF0b3IoKSgpOworCisgIC8vIFJldHVybnMgdGhlIG11dGV4IHdoaWNoIG11c3QgYmUgaGVsZCB3aGlsZSBjYWxsaW5nIGluZGV4X3Bvc2VkZ2VfY291bnQoKSwKKyAgLy8gbGFzdF9lbmNvZGVyX3ZhbHVlKCksIGFuZCBsYXN0X3BvdGVudGlvbWV0ZXJfdm9sdGFnZSgpLgorICAvLyBIb2xkaW5nIHRoaXMgbXV0ZXggd2lsbCBpbmNyZWFzZSB0aGUgaGFuZGxpbmcgbGF0ZW5jeS4KKyAgOjphb3M6Ok11dGV4ICptdXRleCgpIHsgcmV0dXJuICZtdXRleF87IH0KKworICB2b2lkIHNldF9lbmNvZGVyKDo6c3RkOjp1bmlxdWVfcHRyPEVuY29kZXI+IGVuY29kZXIpIHsKKyAgICBlbmNvZGVyXyA9IDo6c3RkOjptb3ZlKGVuY29kZXIpOworICB9CisgIEVuY29kZXIgKmVuY29kZXIoKSBjb25zdCB7IHJldHVybiBlbmNvZGVyXy5nZXQoKTsgfQorCisgIHZvaWQgc2V0X2luZGV4KDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IGluZGV4KSB7CisgICAgaW5kZXhfID0gOjpzdGQ6Om1vdmUoaW5kZXgpOworICB9CisgIERpZ2l0YWxTb3VyY2UgKmluZGV4KCkgY29uc3QgeyByZXR1cm4gaW5kZXhfLmdldCgpOyB9CisKKyAgdm9pZCBzZXRfcG90ZW50aW9tZXRlcig6OnN0ZDo6dW5pcXVlX3B0cjxBbmFsb2dJbnB1dD4gcG90ZW50aW9tZXRlcikgeworICAgIHBvdGVudGlvbWV0ZXJfID0gOjpzdGQ6Om1vdmUocG90ZW50aW9tZXRlcik7CisgIH0KKyAgQW5hbG9nSW5wdXQgKnBvdGVudGlvbWV0ZXIoKSBjb25zdCB7IHJldHVybiBwb3RlbnRpb21ldGVyXy5nZXQoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBwb3NlZ2VzIHRoYXQgaGF2ZSBoYXBwZW5lZCBvbiB0aGUgaW5kZXggaW5wdXQuCisgIC8vIG11dGV4KCkgbXVzdCBiZSBoZWxkIHdoaWxlIGNhbGxpbmcgdGhpcy4KKyAgdWludDMyX3QgaW5kZXhfcG9zZWRnZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGluZGV4X3Bvc2VkZ2VfY291bnRfOyB9CisgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbmNvZGVyIGF0IHRoZSBsYXN0IGluZGV4IHBvc2VkZ2UuCisgIC8vIG11dGV4KCkgbXVzdCBiZSBoZWxkIHdoaWxlIGNhbGxpbmcgdGhpcy4KKyAgaW50MzJfdCBsYXN0X2VuY29kZXJfdmFsdWUoKSBjb25zdCB7IHJldHVybiBsYXN0X2VuY29kZXJfdmFsdWVfOyB9CisgIC8vIFJldHVybnMgdGhlIHZvbHRhZ2Ugb2YgdGhlIHBvdGVudGlvbWV0ZXIgYXQgdGhlIGxhc3QgaW5kZXggcG9zZWRnZS4KKyAgLy8gbXV0ZXgoKSBtdXN0IGJlIGhlbGQgd2hpbGUgY2FsbGluZyB0aGlzLgorICBmbG9hdCBsYXN0X3BvdGVudGlvbWV0ZXJfdm9sdGFnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGFzdF9wb3RlbnRpb21ldGVyX3ZvbHRhZ2VfOworICB9CisKKyBwcml2YXRlOgorICA6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBlbmNvZGVyXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RGlnaXRhbFNvdXJjZT4gaW5kZXhfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxBbmFsb2dJbnB1dD4gcG90ZW50aW9tZXRlcl87CisKKyAgaW50MzJfdCBsYXN0X2VuY29kZXJfdmFsdWVfezB9OworICBmbG9hdCBsYXN0X3BvdGVudGlvbWV0ZXJfdm9sdGFnZV97MC4wZn07CisgIHVpbnQzMl90IGluZGV4X3Bvc2VkZ2VfY291bnRfezB9OworCisgIDo6YW9zOjpNdXRleCBtdXRleF87CisKKyAgY29uc3QgaW50IHByaW9yaXR5XzsKKworICA6OnN0ZDo6YXRvbWljPGJvb2w+IHJ1bl97dHJ1ZX07CisgIDo6c3RkOjp0aHJlYWQgdGhyZWFkXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSW50ZXJydXB0RW5jb2RlckFuZFBvdGVudGlvbWV0ZXIpOworfTsKKworLy8gTGF0Y2hlcyB2YWx1ZXMgZnJvbSBhbiBlbmNvZGVyIGFuZCBwb3RlbnRpb21ldGVyIG9uIHBvc2l0aXZlIGVkZ2VzIGZyb20KKy8vIGFub3RoZXIgaW5wdXQgdXNpbmcgRE1BLgorY2xhc3MgRE1BRW5jb2RlckFuZFBvdGVudGlvbWV0ZXIgOiBwdWJsaWMgRE1BU2FtcGxlSGFuZGxlckludGVyZmFjZSB7CisgcHVibGljOgorICBETUFFbmNvZGVyQW5kUG90ZW50aW9tZXRlcigpIHt9CisKKyAgdm9pZCBzZXRfZW5jb2Rlcig6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBlbmNvZGVyKSB7CisgICAgZW5jb2Rlcl8gPSA6OnN0ZDo6bW92ZShlbmNvZGVyKTsKKyAgfQorICBFbmNvZGVyICplbmNvZGVyKCkgY29uc3QgeyByZXR1cm4gZW5jb2Rlcl8uZ2V0KCk7IH0KKworICB2b2lkIHNldF9pbmRleCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBpbmRleCkgeworICAgIGluZGV4XyA9IDo6c3RkOjptb3ZlKGluZGV4KTsKKyAgfQorICBEaWdpdGFsU291cmNlICppbmRleCgpIGNvbnN0IHsgcmV0dXJuIGluZGV4Xy5nZXQoKTsgfQorCisgIHZvaWQgc2V0X3BvdGVudGlvbWV0ZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8QW5hbG9nSW5wdXQ+IHBvdGVudGlvbWV0ZXIpIHsKKyAgICBwb3RlbnRpb21ldGVyXyA9IDo6c3RkOjptb3ZlKHBvdGVudGlvbWV0ZXIpOworICB9CisgIEFuYWxvZ0lucHV0ICpwb3RlbnRpb21ldGVyKCkgY29uc3QgeyByZXR1cm4gcG90ZW50aW9tZXRlcl8uZ2V0KCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBwb2xsZWQgdmFsdWUgb2YgdGhlIGVuY29kZXIuCisgIHVpbnQzMl90IHBvbGxlZF9lbmNvZGVyX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gcG9sbGVkX2VuY29kZXJfdmFsdWVfOyB9CisgIC8vIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHBvbGxlZCB2b2x0YWdlIG9mIHRoZSBwb3RlbnRpb21ldGVyLgorICBmbG9hdCBwb2xsZWRfcG90ZW50aW9tZXRlcl92b2x0YWdlKCkgY29uc3QgeworICAgIHJldHVybiBwb2xsZWRfcG90ZW50aW9tZXRlcl92b2x0YWdlXzsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBwb3NlZ2VzIHRoYXQgaGF2ZSBoYXBwZW5lZCBvbiB0aGUgaW5kZXggaW5wdXQuCisgIHVpbnQzMl90IGluZGV4X3Bvc2VkZ2VfY291bnQoKSBjb25zdCB7IHJldHVybiBpbmRleF9wb3NlZGdlX2NvdW50XzsgfQorICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZW5jb2RlciBhdCB0aGUgbGFzdCBpbmRleCBwb3NlZGdlLgorICBpbnQzMl90IGxhc3RfZW5jb2Rlcl92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfZW5jb2Rlcl92YWx1ZV87IH0KKyAgLy8gUmV0dXJucyB0aGUgdm9sdGFnZSBvZiB0aGUgcG90ZW50aW9tZXRlciBhdCB0aGUgbGFzdCBpbmRleCBwb3NlZGdlLgorICBmbG9hdCBsYXN0X3BvdGVudGlvbWV0ZXJfdm9sdGFnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbGFzdF9wb3RlbnRpb21ldGVyX3ZvbHRhZ2VfOworICB9CisKKyAgdmlydHVhbCB2b2lkIFVwZGF0ZUZyb21TYW1wbGUoY29uc3QgRE1BU2FtcGxlICZzYW1wbGUpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBQb2xsRnJvbVNhbXBsZShjb25zdCBETUFTYW1wbGUgJnNhbXBsZSkgb3ZlcnJpZGUgeworICAgIHBvbGxlZF9lbmNvZGVyX3ZhbHVlXyA9IHNhbXBsZS5HZXRSYXcoZW5jb2Rlcl8uZ2V0KCkpOworICAgIHBvbGxlZF9wb3RlbnRpb21ldGVyX3ZvbHRhZ2VfID0gc2FtcGxlLkdldFZvbHRhZ2UocG90ZW50aW9tZXRlcl8uZ2V0KCkpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVBvbGxlZFZhbHVlKCkgb3ZlcnJpZGUgeworICAgIHBvbGxlZF9lbmNvZGVyX3ZhbHVlXyA9IGVuY29kZXJfLT5HZXRSYXcoKTsKKyAgICBwb2xsZWRfcG90ZW50aW9tZXRlcl92b2x0YWdlXyA9IHBvdGVudGlvbWV0ZXJfLT5HZXRWb2x0YWdlKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgQWRkVG9ETUEoRE1BICpkbWEpIG92ZXJyaWRlIHsKKyAgICBkbWEtPkFkZChlbmNvZGVyXy5nZXQoKSk7CisgICAgZG1hLT5BZGQoaW5kZXhfLmdldCgpKTsKKyAgICBkbWEtPkFkZChwb3RlbnRpb21ldGVyXy5nZXQoKSk7CisgICAgZG1hLT5TZXRFeHRlcm5hbFRyaWdnZXIoaW5kZXhfLmdldCgpLCB0cnVlLCB0cnVlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2Rlcl87CisgIDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IGluZGV4XzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QW5hbG9nSW5wdXQ+IHBvdGVudGlvbWV0ZXJfOworCisgIGludDMyX3QgcG9sbGVkX2VuY29kZXJfdmFsdWVfID0gMDsKKyAgZmxvYXQgcG9sbGVkX3BvdGVudGlvbWV0ZXJfdm9sdGFnZV8gPSAwLjBmOworCisgIGludDMyX3QgbGFzdF9lbmNvZGVyX3ZhbHVlXyA9IDA7CisgIGZsb2F0IGxhc3RfcG90ZW50aW9tZXRlcl92b2x0YWdlXyA9IDAuMGY7CisKKyAgdWludDMyX3QgaW5kZXhfcG9zZWRnZV9jb3VudF8gPSAwOworCisgIC8vIFdoZXRoZXIgb3Igbm90IGl0IHdhcyB0cmlnZ2VyZWQgaW4gdGhlIGxhc3Qgc2FtcGxlLgorICBib29sIGluZGV4X2xhc3RfdmFsdWVfID0gZmFsc2U7CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERNQUVuY29kZXJBbmRQb3RlbnRpb21ldGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB3cGlsaWIKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBGUkM5NzFfRU5DT0RFUl9BTkRfUE9URU5USU9NRVRFUl9IXwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9neXJvX2ludGVyZmFjZS5jYyBiL2ZyYzk3MS93cGlsaWIvZ3lyb19pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0NDBhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvZ3lyb19pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwxNDQgQEAKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2d5cm9faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHdwaWxpYiB7CisKK0d5cm9JbnRlcmZhY2U6Okd5cm9JbnRlcmZhY2UoKSA6IGd5cm9fKG5ldyBTUEkoU1BJOjprT25ib2FyZENTMCkpIHsKKyAgLy8gVGhlIGd5cm8gZ29lcyB1cCB0byA4LjA4TUh6LgorICAvLyBUaGUgbXlSSU8gZ29lcyB1cCB0byA0TUh6LCBzbyB0aGUgcm9ib1JJTyBwcm9iYWJseSBkb2VzIHRvby4KKyAgZ3lyb18tPlNldENsb2NrUmF0ZSg0ZTYpOworICBneXJvXy0+U2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpOworICBneXJvXy0+U2V0Q2xvY2tBY3RpdmVIaWdoKCk7CisgIGd5cm9fLT5TZXRTYW1wbGVEYXRhT25SaXNpbmcoKTsKKyAgZ3lyb18tPlNldE1TQkZpcnN0KCk7Cit9CisKK2Jvb2wgR3lyb0ludGVyZmFjZTo6SW5pdGlhbGl6ZUd5cm8oKSB7CisgIHVpbnQzMl90IHJlc3VsdDsKKyAgaWYgKCFEb1RyYW5zYWN0aW9uKDB4MjAwMDAwMDMsICZyZXN1bHQpKSB7CisgICAgTE9HKFdBUk5JTkcsICJmYWlsZWQgdG8gc3RhcnQgYSBzZWxmLWNoZWNrXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHJlc3VsdCAhPSAxKSB7CisgICAgLy8gV2UgbWlnaHQgaGF2ZSBoaXQgYSBwYXJpdHkgZXJyb3Igb3Igc29tZXRoaW5nIGFuZCBhcmUgbm93IHJldHJ5aW5nLCBzbworICAgIC8vIHRoaXMgaXNuJ3QgYSB2ZXJ5IGJpZyBkZWFsLgorICAgIExPRyhJTkZPLCAiZ3lybyB1bmV4cGVjdGVkIGluaXRpYWwgcmVzcG9uc2UgMHglIiBQUkl4MzIgIlxuIiwgcmVzdWx0KTsKKyAgfQorCisgIC8vIFdhaXQgZm9yIGl0IHRvIGFzc2VydCB0aGUgZmF1bHQgY29uZGl0aW9ucyBiZWZvcmUgcmVhZGluZyB0aGVtLgorICA6OmFvczo6dGltZTo6U2xlZXBGb3IoOjphb3M6OnRpbWU6OlRpbWU6OkluTVMoNTApKTsKKworICBpZiAoIURvVHJhbnNhY3Rpb24oMHgyMDAwMDAwMCwgJnJlc3VsdCkpIHsKKyAgICBMT0coV0FSTklORywgImZhaWxlZCB0byBjbGVhciBsYXRjaGVkIG5vbi1mYXVsdCBkYXRhXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTE9HKERFQlVHLCAiZ3lybyBkdW1teSByZXNwb25zZSBpcyAweCUiIFBSSXgzMiAiXG4iLCByZXN1bHQpOworCisgIGlmICghRG9UcmFuc2FjdGlvbigweDIwMDAwMDAwLCAmcmVzdWx0KSkgeworICAgIExPRyhXQVJOSU5HLCAiZmFpbGVkIHRvIHJlYWQgc2VsZi10ZXN0IGRhdGFcbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoRXh0cmFjdFN0YXR1cyhyZXN1bHQpICE9IDIpIHsKKyAgICBMT0coV0FSTklORywgImd5cm8gZmlyc3QgdmFsdWUgMHglIiBQUkl4MzIgIiBub3Qgc2VsZi10ZXN0IGRhdGFcbiIsIHJlc3VsdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChFeHRyYWN0RXJyb3JzKHJlc3VsdCkgIT0gMHg3RikgeworICAgIExPRyhXQVJOSU5HLCAiZ3lybyBmaXJzdCB2YWx1ZSAweCUiIFBSSXgzMiAiIGRvZXMgbm90IGhhdmUgYWxsIGVycm9yc1xuIiwKKyAgICAgICAgcmVzdWx0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIURvVHJhbnNhY3Rpb24oMHgyMDAwMDAwMCwgJnJlc3VsdCkpIHsKKyAgICBMT0coV0FSTklORywgImZhaWxlZCB0byBjbGVhciBsYXRjaGVkIHNlbGYtdGVzdCBkYXRhXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKEV4dHJhY3RTdGF0dXMocmVzdWx0KSAhPSAyKSB7CisgICAgTE9HKFdBUk5JTkcsICJneXJvIHNlY29uZCB2YWx1ZSAweCUiIFBSSXgzMiAiIG5vdCBzZWxmLXRlc3QgZGF0YVxuIiwKKyAgICAgICAgcmVzdWx0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHeXJvSW50ZXJmYWNlOjpEb1RyYW5zYWN0aW9uKHVpbnQzMl90IHRvX3dyaXRlLCB1aW50MzJfdCAqcmVzdWx0KSB7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtCeXRlcyA9IDQ7CisgIHN0YXRpY19hc3NlcnQoa0J5dGVzID09IHNpemVvZih0b193cml0ZSksCisgICAgICAgICAgICAgICAgIm5lZWQgdGhlIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGFzIHNpemVvZih0aGUgZGF0YSkiKTsKKworICBpZiAoX19idWlsdGluX3Bhcml0eSh0b193cml0ZSAmIH4xKSA9PSAwKSB0b193cml0ZSB8PSAxOworCisgIHVpbnQ4X3QgdG9fc2VuZFtrQnl0ZXNdLCB0b19yZWNlaXZlW2tCeXRlc107CisgIGNvbnN0IHVpbnQzMl90IHRvX3dyaXRlX2ZsaXBwZWQgPSBfX2J1aWx0aW5fYnN3YXAzMih0b193cml0ZSk7CisgIG1lbWNweSh0b19zZW5kLCAmdG9fd3JpdGVfZmxpcHBlZCwga0J5dGVzKTsKKworICBzd2l0Y2ggKGd5cm9fLT5UcmFuc2FjdGlvbih0b19zZW5kLCB0b19yZWNlaXZlLCBrQnl0ZXMpKSB7CisgICAgY2FzZSAtMToKKyAgICAgIExPRyhJTkZPLCAiU1BJOjpUcmFuc2FjdGlvbiBmYWlsZWRcbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2Uga0J5dGVzOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIExPRyhGQVRBTCwgIlNQSTo6VHJhbnNhY3Rpb24gcmV0dXJuZWQgc29tZXRoaW5nIHdlaXJkXG4iKTsKKyAgfQorCisgIG1lbWNweShyZXN1bHQsIHRvX3JlY2VpdmUsIGtCeXRlcyk7CisgIGlmIChfX2J1aWx0aW5fcGFyaXR5KCpyZXN1bHQgJiAweEZGRkYpICE9IDEpIHsKKyAgICBMT0coSU5GTywgImhpZ2ggYnl0ZSBwYXJpdHkgZmFpbHVyZVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChfX2J1aWx0aW5fcGFyaXR5KCpyZXN1bHQpICE9IDEpIHsKKyAgICBMT0coSU5GTywgIndob2xlIHZhbHVlIHBhcml0eSBmYWlsdXJlXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqcmVzdWx0ID0gX19idWlsdGluX2Jzd2FwMzIoKnJlc3VsdCk7CisgIHJldHVybiB0cnVlOworfQorCit1aW50MTZfdCBHeXJvSW50ZXJmYWNlOjpEb1JlYWQodWludDhfdCBhZGRyZXNzKSB7CisgIGNvbnN0IHVpbnQzMl90IGNvbW1hbmQgPSAoMHg4IDw8IDI4KSB8IChhZGRyZXNzIDw8IDE3KTsKKyAgdWludDMyX3QgcmVzcG9uc2U7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKCFEb1RyYW5zYWN0aW9uKGNvbW1hbmQsICZyZXNwb25zZSkpIHsKKyAgICAgIExPRyhXQVJOSU5HLCAicmVhZGluZyAweCUiIFBSSXg4ICIgZmFpbGVkXG4iLCBhZGRyZXNzKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoKHJlc3BvbnNlICYgMHhFRkUwMDAwMCkgIT0gMHg0RTAwMDAwMCkgeworICAgICAgTE9HKFdBUk5JTkcsICJneXJvIHJlYWQgZnJvbSAweCUiIFBSSXg4CisgICAgICAgICAgICAgICAgICAgIiBnYXZlIHVuZXhwZWN0ZWQgcmVzcG9uc2UgMHglIiBQUkl4MzIgIlxuIiwKKyAgICAgICAgICBhZGRyZXNzLCByZXNwb25zZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcmV0dXJuIChyZXNwb25zZSA+PiA1KSAmIDB4RkZGRjsKKyAgfQorfQorCitkb3VibGUgR3lyb0ludGVyZmFjZTo6RXh0cmFjdEFuZ2xlKHVpbnQzMl90IHZhbHVlKSB7CisgIGNvbnN0IGludDE2X3QgcmVhZGluZyA9IC0oaW50MTZfdCkodmFsdWUgPj4gMTAgJiAweEZGRkYpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihyZWFkaW5nKSAqIDIuMCAqIE1fUEkgLyAzNjAuMCAvIDgwLjA7Cit9CisKK3VpbnQzMl90IEd5cm9JbnRlcmZhY2U6OlJlYWRQYXJ0SUQoKSB7CisgIHJldHVybiAoRG9SZWFkKDB4MEUpIDw8IDE2KSB8IERvUmVhZCgweDEwKTsKK30KKwordWludDMyX3QgR3lyb0ludGVyZmFjZTo6R2V0UmVhZGluZygpIHsKKyAgdWludDMyX3QgcmVzdWx0OworICBpZiAoIURvVHJhbnNhY3Rpb24oMHgyMDAwMDAwMCwgJnJlc3VsdCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2d5cm9faW50ZXJmYWNlLmggYi9mcmM5NzEvd3BpbGliL2d5cm9faW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiYTI0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvZ3lyb19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIEZSQzk3MV9XUElMSUJfR1lST19JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgRlJDOTcxX1dQSUxJQl9HWVJPX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiU1BJLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHdwaWxpYiB7CisKK2NsYXNzIEd5cm9JbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgR3lyb0ludGVyZmFjZSgpOworCisgIC8vIFJ1bnMgdGhlIHJlY29tbWVuZGVkIGd5cm8gc3RhcnR1cCBwcm9jZWR1cmUgaW5jbHVkaW5nIGNoZWNraW5nIGFsbCBvZiB0aGUKKyAgLy8gc2VsZi10ZXN0IGJpdHMuCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcy4KKyAgYm9vbCBJbml0aWFsaXplR3lybygpOworCisgIC8vIFJlYWRzIG9uZSBvZiB0aGUgZ3lybydzICJyZWdpc3RlcnMiIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS4KKyAgLy8gUmV0cmllcyB1bnRpbCBpdCBzdWNjZWVkcy4KKyAgdWludDE2X3QgRG9SZWFkKHVpbnQ4X3QgYWRkcmVzcyk7CisKKyAgLy8gUmV0dXJucyBhbGwgb2YgdGhlIG5vbi1kYXRhIGJpdHMgaW4gdGhlICJoZWFkZXIiIGV4Y2VwdCB0aGUgcGFyaXR5IGZyb20KKyAgLy8gdmFsdWUuCisgIHVpbnQ4X3QgRXh0cmFjdFN0YXR1cyh1aW50MzJfdCB2YWx1ZSkgeyByZXR1cm4gKHZhbHVlID4+IDI2KSAmIH40OyB9CisgIC8vIFJldHVybnMgYWxsIG9mIHRoZSBlcnJvciBiaXRzIGluIHRoZSAiZm9vdGVyIiBmcm9tIHZhbHVlLgorICB1aW50OF90IEV4dHJhY3RFcnJvcnModWludDMyX3QgdmFsdWUpIHsgcmV0dXJuICh2YWx1ZSA+PiAxKSAmIDB4N0Y7IH0KKworICAvLyBSZXR1cm5zIHRoZSBhbmdsdWxhciByYXRlIGNvbnRhaW5lZCBpbiB2YWx1ZS4KKyAgZG91YmxlIEV4dHJhY3RBbmdsZSh1aW50MzJfdCB2YWx1ZSk7CisKKyAgLy8gUGVyZm9ybXMgYSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBneXJvLgorICAvLyB0b193cml0ZSBpcyB0aGUgdmFsdWUgdG8gd3JpdGUuIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXR0aW5nIHRoZSBjaGVja3N1bQorICAvLyBiaXQuCisgIC8vIHJlc3VsdCBpcyB3aGVyZSB0byBzdGljayB0aGUgcmVzdWx0LiBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSBwYXJpdHkgYml0LgorICAvLyBSZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3MuCisgIGJvb2wgRG9UcmFuc2FjdGlvbih1aW50MzJfdCB0b193cml0ZSwgdWludDMyX3QgKnJlc3VsdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgcGFydCBJRCBmcm9tIHRoZSBneXJvLgorICAvLyBSZXRyaWVzIHVudGlsIGl0IHN1Y2NlZWRzLgorICB1aW50MzJfdCBSZWFkUGFydElEKCk7CisKKyAgLy8gR2V0cyBhIHJlYWRpbmcgZnJvbSB0aGUgZ3lyby4KKyAgLy8gUmV0dXJucyBhIHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgRXh0cmFjdCogbWV0aG9kcyBvciAwIGZvciBlcnJvci4KKyAgdWludDMyX3QgR2V0UmVhZGluZygpOworCisgcHJpdmF0ZToKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8U1BJPiBneXJvXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSB3cGlsaWIKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBGUkM5NzFfV1BJTElCX0dZUk9fSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2d5cm9fc2VuZGVyLmNjIGIvZnJjOTcxL3dwaWxpYi9neXJvX3NlbmRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2I5NTAwCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3dwaWxpYi9neXJvX3NlbmRlci5jYwpAQCAtMCwwICsxLDEzOCBAQAorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvZ3lyb19zZW5kZXIuaCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tZXNzYWdlcy9yb2JvdF9zdGF0ZS5xLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorCisjaW5jbHVkZSAiZnJjOTcxL3F1ZXVlcy9neXJvLnEuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2Ugd3BpbGliIHsKKworR3lyb1NlbmRlcjo6R3lyb1NlbmRlcigpIHt9CisKK3ZvaWQgR3lyb1NlbmRlcjo6b3BlcmF0b3IoKSgpIHsKKyAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWROYW1lKCJHeXJvIik7CisKKyAgLy8gVHJ5IHRvIGluaXRpYWxpemUgcmVwZWF0ZWRseSBhcyBsb25nIGFzIHdlJ3JlIHN1cHBvc2VkIHRvIGJlIHJ1bm5pbmcuCisgIHdoaWxlIChydW5fICYmICFneXJvXy5Jbml0aWFsaXplR3lybygpKSB7CisgICAgOjphb3M6OnRpbWU6OlNsZWVwRm9yKDo6YW9zOjp0aW1lOjpUaW1lOjpJbk1TKDUwKSk7CisgIH0KKyAgTE9HKElORk8sICJneXJvIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseVxuIik7CisKKyAgYXV0byBtZXNzYWdlID0gOjpmcmM5NzE6OnNlbnNvcnM6Omd5cm9fcGFydF9pZC5NYWtlTWVzc2FnZSgpOworICBtZXNzYWdlLT51aWQgPSBneXJvXy5SZWFkUGFydElEKCk7CisgIExPR19TVFJVQ1QoSU5GTywgImd5cm8gSUQiLCAqbWVzc2FnZSk7CisgIG1lc3NhZ2UuU2VuZCgpOworCisgIC8vIEluIHJhZGlhbnMsIHJlYWR5IHRvIHNlbmQgb3V0LgorICBkb3VibGUgYW5nbGUgPSAwOworCisgIGludCBzdGFydHVwX2N5Y2xlc19sZWZ0ID0gMiAqIGtSZWFkaW5nUmF0ZTsKKworICBkb3VibGUgemVyb2luZ19kYXRhWzYgKiBrUmVhZGluZ1JhdGVdOworICBzaXplX3QgemVyb2luZ19pbmRleCA9IDA7CisgIGJvb2wgemVyb2VkID0gZmFsc2U7CisgIGJvb2wgaGF2ZV96ZXJvaW5nX2RhdGEgPSBmYWxzZTsKKyAgZG91YmxlIHplcm9fb2Zmc2V0ID0gMDsKKworICB3aGlsZSAocnVuXykgeworICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKDEwMDAgLyBrUmVhZGluZ1JhdGUsIDApOworCisgICAgY29uc3QgdWludDMyX3QgcmVzdWx0ID0gZ3lyb18uR2V0UmVhZGluZygpOworICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgTE9HKFdBUk5JTkcsICJub3JtYWwgZ3lybyByZWFkIGZhaWxlZFxuIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3dpdGNoIChneXJvXy5FeHRyYWN0U3RhdHVzKHJlc3VsdCkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgTE9HKFdBUk5JTkcsICJneXJvIHNheXMgZGF0YSBpcyBiYWRcbiIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0coV0FSTklORywgImd5cm8gZ2F2ZSB3ZWlyZCBzdGF0dXMgMHglIiBQUkl4OCAiXG4iLAorICAgICAgICAgICAgZ3lyb18uRXh0cmFjdFN0YXR1cyhyZXN1bHQpKTsKKyAgICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChneXJvXy5FeHRyYWN0RXJyb3JzKHJlc3VsdCkgIT0gMCkgeworICAgICAgY29uc3QgdWludDhfdCBlcnJvcnMgPSBneXJvXy5FeHRyYWN0RXJyb3JzKHJlc3VsdCk7CisgICAgICBpZiAoZXJyb3JzICYgKDEgPDwgNikpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcsICJneXJvIGdhdmUgUExMIGVycm9yXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChlcnJvcnMgJiAoMSA8PCA1KSkgeworICAgICAgICBMT0coV0FSTklORywgImd5cm8gZ2F2ZSBxdWFkcmF0dXJlIGVycm9yXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChlcnJvcnMgJiAoMSA8PCA0KSkgeworICAgICAgICBMT0coV0FSTklORywgImd5cm8gZ2F2ZSBub24tdm9sYXRpbGUgbWVtb3J5IGVycm9yXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChlcnJvcnMgJiAoMSA8PCAzKSkgeworICAgICAgICBMT0coV0FSTklORywgImd5cm8gZ2F2ZSB2b2xhdGlsZSBtZW1vcnkgZXJyb3JcbiIpOworICAgICAgfQorICAgICAgaWYgKGVycm9ycyAmICgxIDw8IDIpKSB7CisgICAgICAgIExPRyhXQVJOSU5HLCAiZ3lybyBnYXZlIHBvd2VyIGVycm9yXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChlcnJvcnMgJiAoMSA8PCAxKSkgeworICAgICAgICBMT0coV0FSTklORywgImd5cm8gZ2F2ZSBjb250aW51b3VzIHNlbGYtdGVzdCBlcnJvclxuIik7CisgICAgICB9CisgICAgICBpZiAoZXJyb3JzICYgMSkgeworICAgICAgICBMT0coV0FSTklORywgImd5cm8gZ2F2ZSB1bmV4cGVjdGVkIHNlbGYtdGVzdCBtb2RlXG4iKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChzdGFydHVwX2N5Y2xlc19sZWZ0ID4gMCkgeworICAgICAgLS1zdGFydHVwX2N5Y2xlc19sZWZ0OworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY29uc3QgZG91YmxlIG5ld19hbmdsZSA9CisgICAgICAgIGd5cm9fLkV4dHJhY3RBbmdsZShyZXN1bHQpIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihrUmVhZGluZ1JhdGUpOworICAgIGF1dG8gbWVzc2FnZSA9IDo6ZnJjOTcxOjpzZW5zb3JzOjpneXJvX3JlYWRpbmcuTWFrZU1lc3NhZ2UoKTsKKyAgICBpZiAoemVyb2VkKSB7CisgICAgICBhbmdsZSArPSBuZXdfYW5nbGU7CisgICAgICBhbmdsZSArPSB6ZXJvX29mZnNldDsKKyAgICAgIG1lc3NhZ2UtPmFuZ2xlID0gYW5nbGU7CisgICAgICBMT0dfU1RSVUNUKERFQlVHLCAic2VuZGluZyIsICptZXNzYWdlKTsKKyAgICAgIG1lc3NhZ2UuU2VuZCgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RPKGJyaWFuKTogRG9uJ3QgYnJlYWsgd2l0aG91dCA2IHNlY29uZHMgb2Ygc3RhbmRpbmcgc3RpbGwgYmVmb3JlCisgICAgICAvLyBlbmFibGluZy4gSWRlYXM6CisgICAgICAvLyAgIERvbid0IGFsbG93IGRyaXZpbmcgdW50aWwgd2UgaGF2ZSBhdCBsZWFzdCBzb21lIGRhdGE/CisgICAgICAvLyAgIFNvbWUga2luZCBvZiBpbmRpY2F0b3IgbGlnaHQ/CisgICAgICB7CisgICAgICAgIG1lc3NhZ2UtPmFuZ2xlID0gbmV3X2FuZ2xlOworICAgICAgICBMT0dfU1RSVUNUKERFQlVHLCAiY29sbGVjdGVkIHdoaWxlIHplcm9pbmciLCAqbWVzc2FnZSk7CisgICAgICAgIG1lc3NhZ2UtPmFuZ2xlID0gMC4wOworICAgICAgICBtZXNzYWdlLlNlbmQoKTsKKyAgICAgIH0KKyAgICAgIHplcm9pbmdfZGF0YVt6ZXJvaW5nX2luZGV4XSA9IG5ld19hbmdsZTsKKyAgICAgICsremVyb2luZ19pbmRleDsKKyAgICAgIGlmICh6ZXJvaW5nX2luZGV4ID49IHNpemVvZih6ZXJvaW5nX2RhdGEpIC8gc2l6ZW9mKHplcm9pbmdfZGF0YVswXSkpIHsKKyAgICAgICAgemVyb2luZ19pbmRleCA9IDA7CisgICAgICAgIGhhdmVfemVyb2luZ19kYXRhID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgOjphb3M6OmpveXN0aWNrX3N0YXRlLkZldGNoTGF0ZXN0KCk7CisgICAgICBpZiAoOjphb3M6OmpveXN0aWNrX3N0YXRlLmdldCgpICYmIDo6YW9zOjpqb3lzdGlja19zdGF0ZS0+ZW5hYmxlZCAmJgorICAgICAgICAgIGhhdmVfemVyb2luZ19kYXRhKSB7CisgICAgICAgIHplcm9fb2Zmc2V0ID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoemVyb2luZ19kYXRhKSAvIHNpemVvZih6ZXJvaW5nX2RhdGFbMF0pOworICAgICAgICAgICAgICsraSkgeworICAgICAgICAgIHplcm9fb2Zmc2V0IC09IHplcm9pbmdfZGF0YVtpXTsKKyAgICAgICAgfQorICAgICAgICB6ZXJvX29mZnNldCAvPSBzaXplb2YoemVyb2luZ19kYXRhKSAvIHNpemVvZih6ZXJvaW5nX2RhdGFbMF0pOworICAgICAgICBMT0coSU5GTywgInRvdGFsIHplcm8gb2Zmc2V0ICVmXG4iLCB6ZXJvX29mZnNldCk7CisgICAgICAgIHplcm9lZCA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSB3cGlsaWIKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvZ3lyb19zZW5kZXIuaCBiL2ZyYzk3MS93cGlsaWIvZ3lyb19zZW5kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlhY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3dwaWxpYi9neXJvX3NlbmRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgRlJDOTcxX1dQSUxJQl9HWVJPX0hfCisjZGVmaW5lIEZSQzk3MV9XUElMSUJfR1lST19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2d5cm9faW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHdwaWxpYiB7CisKKy8vIEhhbmRsZXMgcmVhZGluZyB0aGUgZ3lybyBvdmVyIFNQSSBhbmQgc2VuZGluZyBvdXQgYW5nbGVzIG9uIGEgcXVldWUuCisvLworLy8gVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBwYXNzZWQgaW50byA6OnN0ZDo6dGhyZWFkJ3MgY29uc3RydWN0b3Igc28gaXQgd2lsbCBydW4KKy8vIGFzIGEgc2VwYXJhdGUgdGhyZWFkLgorY2xhc3MgR3lyb1NlbmRlciB7CisgcHVibGljOgorICBHeXJvU2VuZGVyKCk7CisKKyAgLy8gRm9yIDo6c3RkOjp0aHJlYWQgdG8gY2FsbC4KKyAgLy8KKyAgLy8gSW5pdGlhbGl6ZXMgdGhlIGd5cm8gYW5kIHRoZW4gbG9vcHMgZm9yZXZlciB0YWtpbmcgcmVhZGluZ3MuCisgIHZvaWQgb3BlcmF0b3IoKSgpOworCisgIHZvaWQgUXVpdCgpIHsgcnVuXyA9IGZhbHNlOyB9CisKKyBwcml2YXRlOgorCisgIC8vIFJlYWRpbmdzIHBlciBzZWNvbmQuCisgIHN0YXRpYyBjb25zdCBpbnQga1JlYWRpbmdSYXRlID0gMjAwOworCisgIEd5cm9JbnRlcmZhY2UgZ3lyb187CisKKyAgOjpzdGQ6OmF0b21pYzxib29sPiBydW5fe3RydWV9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHdwaWxpYgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9XUElMSUJfR1lST19IXwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9oYWxsX2VmZmVjdC5oIGIvZnJjOTcxL3dwaWxpYi9oYWxsX2VmZmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2YyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvd3BpbGliL2hhbGxfZWZmZWN0LmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBGUkM5NzFfV1BJTElCX0hBTExfRUZGRUNUX0hfCisjZGVmaW5lIEZSQzk3MV9XUElMSUJfSEFMTF9FRkZFQ1RfSF8KKworI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB3cGlsaWIgeworCisvLyBJbnZlcnRzIHRoZSBvdXRwdXQgZnJvbSBhIGRpZ2l0YWwgaW5wdXQuCitjbGFzcyBIYWxsRWZmZWN0IDogcHVibGljIERpZ2l0YWxJbnB1dCB7CisgcHVibGljOgorICBIYWxsRWZmZWN0KGludCBpbmRleCkgOiBEaWdpdGFsSW5wdXQoaW5kZXgpIHt9CisgIHZpcnR1YWwgYm9vbCBHZXQoKSBvdmVycmlkZSB7IHJldHVybiAhRGlnaXRhbElucHV0OjpHZXQoKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHdwaWxpYgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9XUElMSUJfSEFMTF9FRkZFQ1RfSF8KZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvaW50ZXJydXB0X2VkZ2VfY291bnRpbmcuY2MgYi9mcmM5NzEvd3BpbGliL2ludGVycnVwdF9lZGdlX2NvdW50aW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGIyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvd3BpbGliL2ludGVycnVwdF9lZGdlX2NvdW50aW5nLmNjCkBAIC0wLDAgKzEsMTA0IEBACisjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9pbnRlcnJ1cHRfZWRnZV9jb3VudGluZy5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB3cGlsaWIgeworCit2b2lkIEVkZ2VDb3VudGVyOjpHYXRoZXJQb2xsZWRWYWx1ZSgpIHsKKyAgc2hhZG93X3ZhbHVlc18ucG9sbGVkX3ZhbHVlID0gaW5wdXRfLT5HZXQoKTsKKyAgYm9vbCBtaXNzX21hdGNoID0gKHNoYWRvd192YWx1ZXNfLnBvbGxlZF92YWx1ZSAhPSBjdXJyZW50X3ZhbHVlXyk7CisgIGlmIChtaXNzX21hdGNoICYmIGxhc3RfbWlzc19tYXRjaF8pIHsKKyAgICBjdXJyZW50X3ZhbHVlXyA9IHNoYWRvd192YWx1ZXNfLnBvbGxlZF92YWx1ZTsKKyAgICBsYXN0X21pc3NfbWF0Y2hfID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgbGFzdF9taXNzX21hdGNoXyA9IG1pc3NfbWF0Y2g7CisgIH0KK30KKwordm9pZCBFZGdlQ291bnRlcjo6b3BlcmF0b3IoKSgpIHsKKyAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWROYW1lKCJFZGdlQ291bnRlcl8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjp0b19zdHJpbmcoaW5wdXRfLT5HZXRDaGFubmVsRm9yUm91dGluZygpKSk7CisKKyAgaW5wdXRfLT5SZXF1ZXN0SW50ZXJydXB0cygpOworICBpbnB1dF8tPlNldFVwU291cmNlRWRnZSh0cnVlLCB0cnVlKTsKKworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPDo6YW9zOjpzdGxfbXV0ZXg+IG11dGV4X2d1YXJkKCptdXRleCgpKTsKKyAgICBjdXJyZW50X3ZhbHVlXyA9IGlucHV0Xy0+R2V0KCk7CisgIH0KKworICA6OmFvczo6U2V0Q3VycmVudFRocmVhZFJlYWx0aW1lUHJpb3JpdHkocHJpb3JpdHkoKSk7CisgIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpXYWl0UmVzdWx0IHJlc3VsdCA9IEludGVycnVwdGFibGVTZW5zb3JCYXNlOjprQm90aDsKKyAgd2hpbGUgKHNob3VsZF9ydW4oKSkgeworICAgIHJlc3VsdCA9IGlucHV0Xy0+V2FpdEZvckludGVycnVwdCgKKyAgICAgICAgMC4xLCByZXN1bHQgIT0gSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OmtUaW1lb3V0KTsKKyAgICBpZiAocmVzdWx0ID09IEludGVycnVwdGFibGVTZW5zb3JCYXNlOjprVGltZW91dCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludGVycnVwdF9yZWNlaXZlZCgpOworCisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPDo6YW9zOjpzdGxfbXV0ZXg+IG11dGV4X2d1YXJkKCptdXRleCgpKTsKKyAgICBpbnQzMl90IGVuY29kZXJfdmFsdWUgPSBlbmNvZGVyXy0+R2V0UmF3KCk7CisgICAgYm9vbCBoYWxsX3ZhbHVlID0gaW5wdXRfLT5HZXQoKTsKKyAgICBpZiAoY3VycmVudF92YWx1ZV8gIT0gaGFsbF92YWx1ZSkgeworICAgICAgaWYgKGhhbGxfdmFsdWUpIHsKKyAgICAgICAgKytzaGFkb3dfdmFsdWVzXy5wb3NpdGl2ZV9pbnRlcnJ1cHRfY291bnQ7CisgICAgICAgIHNoYWRvd192YWx1ZXNfLmxhc3RfcG9zaXRpdmVfZW5jb2Rlcl92YWx1ZSA9IGVuY29kZXJfdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICArK3NoYWRvd192YWx1ZXNfLm5lZ2F0aXZlX2ludGVycnVwdF9jb3VudDsKKyAgICAgICAgc2hhZG93X3ZhbHVlc18ubGFzdF9uZWdhdGl2ZV9lbmNvZGVyX3ZhbHVlID0gZW5jb2Rlcl92YWx1ZTsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRfdmFsdWVfID0gaGFsbF92YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgTE9HKFdBUk5JTkcsICJEZXRlY3RlZCBzcHVyaW91cyBlZGdlIG9uICVkLiAgRHJvcHBpbmcgaXQuXG4iLAorICAgICAgICAgIGlucHV0Xy0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgSW50ZXJydXB0U3luY2hyb25pemVyOjpSdW5JdGVyYXRpb24oKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKCFUcnlTdGFydEl0ZXJhdGlvbigpKSBjb250aW51ZTsKKworICAgIC8vIFdhaXQgbW9yZSB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyBmb3IgYSBkaWdpdGFsIGlucHV0IGNoYW5nZQorICAgIC8vIHRvIGdvIGZyb20gdmlzaWJsZSB0byBzb2Z0d2FyZSB0byBoYXZpbmcgdHJpZ2dlcmVkIGFuIGludGVycnVwdC4KKyAgICA6OmFvczo6dGltZTo6U2xlZXBGb3IoOjphb3M6OnRpbWU6OlRpbWU6OkluVVMoMTIwKSk7CisKKyAgICBpZiAoVHJ5RmluaXNoaW5nSXRlcmF0aW9uKCkpIHJldHVybjsKKyAgfQorfQorCitib29sIEludGVycnVwdFN5bmNocm9uaXplcjo6VHJ5U3RhcnRJdGVyYXRpb24oKSB7CisgIGZvciAoYXV0byAmYyA6IGhhbmRsZXJzXykgeworICAgIGMtPnNhdmVfaW50ZXJydXB0X2NvdW50KCk7CisgIH0KKworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPDo6YW9zOjpzdGxfbXV0ZXg+IG11dGV4X2d1YXJkKG11dGV4Xyk7CisgICAgZm9yIChhdXRvICZjIDogaGFuZGxlcnNfKSB7CisgICAgICBjLT5HYXRoZXJQb2xsZWRWYWx1ZSgpOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJbnRlcnJ1cHRTeW5jaHJvbml6ZXI6OlRyeUZpbmlzaGluZ0l0ZXJhdGlvbigpIHsKKyAgLy8gTWFrZSBzdXJlIG5vIGludGVycnVwdHMgaGF2ZSBvY2N1cnJlZCB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcuICBJZiB0aGV5CisgIC8vIGhhdmUsIHdlIGFyZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIG5lZWQgdG8gdHJ5IGFnYWluLgorICA6OnN0ZDo6dW5pcXVlX2xvY2s8Ojphb3M6OnN0bF9tdXRleD4gbXV0ZXhfZ3VhcmQobXV0ZXhfKTsKKyAgZm9yIChhdXRvICZjIDogaGFuZGxlcnNfKSB7CisgICAgaWYgKGMtPmludGVycnVwdF9jb3VudF9jaGFuZ2VkKCkpIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiZ290IGFuIGludGVycnVwdCB3aGlsZSBzYW1wbGluZy4gcmV0cnlpbmdcbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBmb3IgKGF1dG8gJmMgOiBoYW5kbGVyc18pIHsKKyAgICBjLT5Db21taXRWYWx1ZSgpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2ludGVycnVwdF9lZGdlX2NvdW50aW5nLmggYi9mcmM5NzEvd3BpbGliL2ludGVycnVwdF9lZGdlX2NvdW50aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiNWUzMgotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvaW50ZXJydXB0X2VkZ2VfY291bnRpbmcuaApAQCAtMCwwICsxLDIzNCBAQAorI2lmbmRlZiBGUkM5NzFfV1BJTElCX0lOVEVSUlVQVF9FREdFX0NPVU5USU5HX0hfCisjZGVmaW5lIEZSQzk3MV9XUElMSUJfSU5URVJSVVBUX0VER0VfQ09VTlRJTkdfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImFvcy9jb21tb24vc3RsX211dGV4LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tYWNyb3MuaCIKKworI2luY2x1ZGUgIkRpZ2l0YWxTb3VyY2UuaCIKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHdwaWxpYiB7CisKK2NsYXNzIEludGVycnVwdFN5bmNocm9uaXplcjsKKworLy8gSGFuZGxlcyBpbnRlcnJ1cHRzIGFycml2aW5nIGZyb20gYSBzaW5nbGUgc291cmNlLgorLy8KKy8vIEluc3RhbmNlcyBvZiBzdWJjbGFzc2VzIHNob3VsZCBiZSBwYXNzZWQgdG8gSW50ZXJydXB0U3luY2hyb25pemVyOjpBZGQgdG8gdXNlCisvLyB0aGVtLiBBbGwgbWV0aG9kcyB3aGljaCBhcmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBzaG91bGQgYXZvaWQgdGFraW5nIHRvbworLy8gbG9uZyBiZWNhdXNlIHRoZXkgZGlyZWN0bHkgY29udHJpYnV0ZSB0byBpbnRlcnJ1cHQtaGFuZGxpbmcgbGF0ZW5jeSBmb3IgYWxsCisvLyBJbnRlcnJ1cHRIYW5kbGVycyBpbiB0aGUgc2FtZSBJbnRlcnJ1cHRTeW5jaHJvbml6ZXIuCisvLworLy8gRWFjaCBpbnN0YW5jZSBoYW5kbGVzIGFueSBpbXBvcnRhbnQgc2Vuc29yIHJlYWRpbmcgd2hpY2ggbXVzdCBoYXBwZW4gcmlnaHQKKy8vIGFmdGVyIGFuIGludGVycnVwdCB0cmlnZ2VycyBmcm9tIGEgc2luZ2xlIHNvdXJjZS4gSXQgaXMgYWxzbyBpbXBvcnRhbnQgdGhhdAorLy8gc29tZSBzZW5zb3JzIGFyZSBzYW1wbGVkIGFmdGVyIGFueSBwZW5kaW5nIGludGVycnVwdHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KKy8vIFRoaXMgaXMgaGFuZGxlZCB1c2luZyBhIHBlci1JbnRlcnJ1cHRTeW5jaHJvbml6ZXIgbXV0ZXguIEVhY2gKKy8vIEludGVycnVwdEhhbmRsZXIgcmVjb3JkcyB0aGF0IGl0IGhhcyByZWNlaXZlZCBhbiBpbnRlcnJ1cHQsIGxvY2tzIHRoZSBtdXRleCwKKy8vIGFuZCB0aGVuIHVwZGF0ZXMgYSAic2hhZG93IiBzdGF0ZS4gVGhlIEludGVycnVwdFN5bmNocm9uaXplciB0aGVuIHRyaWdnZXJzCisvLyBtYWtpbmcgdGhpcyAic2hhZG93IiBzdGF0ZSB2aXNpYmxlIGFmdGVyIG1ha2luZyBzdXJlIG5vIG1vcmUgaW50ZXJydXB0cyBoYXZlCisvLyBhcnJpdmVkIHdoaWxlIGhvbGRpbmcgdGhlIG11dGV4LgorY2xhc3MgSW50ZXJydXB0SGFuZGxlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JbnRlcnJ1cHRIYW5kbGVyKCkge30KKworICAvLyBTdG9wcyB0aGUgdGhyZWFkIHdoaWNoIGFjdHVhbGx5IGRvZXMgdGhlIHNhbXBsaW5nIGFuZCB3YWl0cyBmb3IgaXQgdG8KKyAgLy8gZmluaXNoLgorICB2b2lkIFF1aXQoKSB7CisgICAgcnVuXyA9IGZhbHNlOworICAgIHRocmVhZF8uam9pbigpOworICB9CisKKyAgLy8gU3RhcnRzIHRoZSB0aHJlYWQgcnVubmluZy4KKyAgLy8gc2V0X3ByaW9yaXR5IGFuZCBzZXRfbXV0ZXggbXVzdCBiZSBjYWxsZWQgZmlyc3QuCisgIHZvaWQgU3RhcnQoKSB7CisgICAgQ0hFQ0tfTkUobnVsbHB0ciwgbXV0ZXhfKTsKKyAgICBDSEVDS19ORSgwLCBwcmlvcml0eV8pOworICAgIHRocmVhZF8gPSA6OnN0ZDo6dGhyZWFkKDo6c3RkOjpyZWYoKnRoaXMpKTsKKyAgfQorCisgIC8vIFBvbGxzIHRoZSBjdXJyZW50IHZhbHVlcyBhbmQgc2F2ZXMgdGhlbSB0byB0aGUgInNoYWRvdyIgb3V0cHV0LgorICAvLyBDYWxsZWQgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC4KKyAgdmlydHVhbCB2b2lkIEdhdGhlclBvbGxlZFZhbHVlKCkgPSAwOworCisgIC8vIEFjdHVhbGx5IG91dHB1dHMgdGhlICJzaGFkb3ciIHN0YXRlIGNvbGxlY3RlZCBkdXJpbmcgdGhlIG1vc3QgcmVjZW50CisgIC8vIEdhdGhlclBvbGxlZFZhbHVlLgorICAvLyBDYWxsZWQgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC4KKyAgdmlydHVhbCB2b2lkIENvbW1pdFZhbHVlKCkgPSAwOworCisgIC8vIFNhdmVzIHRoZSBjdXJyZW50IGludGVycnVwdCBjb3VudCB0byBiZSBjb21wYXJlZCB3aGVuCisgIC8vIGludGVycnVwdF9jb3VudF9jaGFuZ2VkKCkgaXMgY2FsbGVkLgorICB2b2lkIHNhdmVfaW50ZXJydXB0X2NvdW50KCkgeyBzYXZlZF9pbnRlcnJ1cHRfY291bnRfID0gaW50ZXJydXB0X2NvdW50XzsgfQorICAvLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBpbnRlcnJ1cHQgY291bnQgaGFzIGNoYW5nZWQgc2luY2UKKyAgLy8gc2F2ZV9pbnRlcnJ1cHRfY291bnQoKSB3YXMgbGFzdCBjYWxsZWQuCisgIGJvb2wgaW50ZXJydXB0X2NvdW50X2NoYW5nZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIHNhdmVkX2ludGVycnVwdF9jb3VudF8gIT0gaW50ZXJydXB0X2NvdW50XzsKKyAgfQorCisgIC8vIFNldHMgdGhlIHByaW9yaXR5IHRoZSB0aHJlYWQgd2lsbCBydW4gYXQuCisgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIFN0YXJ0LgorICB2b2lkIHNldF9wcmlvcml0eShpbnQgcHJpb3JpdHkpIHsgcHJpb3JpdHlfID0gcHJpb3JpdHk7IH0KKworICAvLyBTZXRzIHRoZSBtdXRleCB0byB1c2UgZm9yIHN5bmNocm9uaXppbmcgcmVhZGluZ3MuCisgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIFN0YXJ0LgorICB2b2lkIHNldF9tdXRleCg6OmFvczo6c3RsX211dGV4ICptdXRleCkgeyBtdXRleF8gPSBtdXRleDsgfQorCisgIC8vIFdhaXRzIGZvciBpbnRlcnJ1cHRzLCBsb2NrcyB0aGUgbXV0ZXgsIGFuZCB1cGRhdGVzIHRoZSBpbnRlcm5hbCBzdGF0ZS4KKyAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSAoaW50ZXJuYWwpIDo6c3RkOjp0aHJlYWQuCisgIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKCkgPSAwOworCisgcHJvdGVjdGVkOgorICAvLyBJbmRpY2F0ZXMgdGhhdCBhbm90aGVyIGludGVycnVwdCBoYXMgYmVlbiByZWNlaXZlZCAobm90IGhhbmRsZWQgeWV0KS4KKyAgdm9pZCBpbnRlcnJ1cHRfcmVjZWl2ZWQoKSB7ICsraW50ZXJydXB0X2NvdW50XzsgfQorCisgIGludCBwcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIHByaW9yaXR5XzsgfQorCisgIDo6YW9zOjpzdGxfbXV0ZXggKm11dGV4KCkgeyByZXR1cm4gbXV0ZXhfOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0aHJlYWQgc2hvdWxkIGNvbnRpbnVlIHJ1bm5pbmcuCisgIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHJ1bl87IH0KKworIHByaXZhdGU6CisgIDo6c3RkOjphdG9taWM8aW50PiBpbnRlcnJ1cHRfY291bnRfezB9OworICBpbnQgc2F2ZWRfaW50ZXJydXB0X2NvdW50XzsKKworICA6OnN0ZDo6YXRvbWljPGJvb2w+IHJ1bl97dHJ1ZX07CisgIDo6c3RkOjp0aHJlYWQgdGhyZWFkXzsKKworICBpbnQgcHJpb3JpdHlfID0gMDsKKyAgOjphb3M6OnN0bF9tdXRleCAqbXV0ZXhfID0gbnVsbHB0cjsKK307CisKKy8vIExhdGNoZXMgdGhlIHZhbHVlIG9mIGFuIGVuY29kZXIgb24gcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIG9mIGEgZGlnaXRhbAorLy8gaW5wdXQuCitjbGFzcyBFZGdlQ291bnRlciA6IHB1YmxpYyBJbnRlcnJ1cHRIYW5kbGVyIHsKKyBwdWJsaWM6CisgIEVkZ2VDb3VudGVyKEVuY29kZXIgKmVuY29kZXIsIERpZ2l0YWxTb3VyY2UgKmlucHV0KQorICAgICAgOiBlbmNvZGVyXyhlbmNvZGVyKSwgaW5wdXRfKGlucHV0KSB7fQorCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgaW50ZXJydXB0IGVkZ2UgY291bnRzIGFuZCBlbmNvZGVyIHZhbHVlcy4KKyAgaW50IHBvc2l0aXZlX2ludGVycnVwdF9jb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gb3V0cHV0Xy5wb3NpdGl2ZV9pbnRlcnJ1cHRfY291bnQ7CisgIH0KKyAgaW50IG5lZ2F0aXZlX2ludGVycnVwdF9jb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gb3V0cHV0Xy5uZWdhdGl2ZV9pbnRlcnJ1cHRfY291bnQ7CisgIH0KKyAgaW50MzJfdCBsYXN0X3Bvc2l0aXZlX2VuY29kZXJfdmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG91dHB1dF8ubGFzdF9wb3NpdGl2ZV9lbmNvZGVyX3ZhbHVlOworICB9CisgIGludDMyX3QgbGFzdF9uZWdhdGl2ZV9lbmNvZGVyX3ZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBvdXRwdXRfLmxhc3RfbmVnYXRpdmVfZW5jb2Rlcl92YWx1ZTsKKyAgfQorICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHBvbGxlZCB2YWx1ZS4KKyAgYm9vbCBwb2xsZWRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBvdXRwdXRfLnBvbGxlZF92YWx1ZTsgfQorCisgcHJpdmF0ZToKKyAgc3RydWN0IE91dHB1dFZhbHVlcyB7CisgICAgYm9vbCBwb2xsZWRfdmFsdWUgPSBmYWxzZTsKKyAgICBpbnQgcG9zaXRpdmVfaW50ZXJydXB0X2NvdW50ID0gMCwgbmVnYXRpdmVfaW50ZXJydXB0X2NvdW50ID0gMDsKKyAgICBpbnQzMl90IGxhc3RfcG9zaXRpdmVfZW5jb2Rlcl92YWx1ZSA9IDAsIGxhc3RfbmVnYXRpdmVfZW5jb2Rlcl92YWx1ZSA9IDA7CisgIH07CisKKyAgdm9pZCBHYXRoZXJQb2xsZWRWYWx1ZSgpIG92ZXJyaWRlOworICB2b2lkIENvbW1pdFZhbHVlKCkgb3ZlcnJpZGUgeyBvdXRwdXRfID0gc2hhZG93X3ZhbHVlc187IH0KKyAgdm9pZCBvcGVyYXRvcigpKCkgb3ZlcnJpZGU7CisKKyAgRW5jb2RlciAqZW5jb2Rlcl87CisgIERpZ2l0YWxTb3VyY2UgKmlucHV0XzsKKworICAvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyByZXByZXNlbnQgdGhlIGN1cnJlbnQgInNoYWRvdyIgc3RhdGUuCisgIGJvb2wgY3VycmVudF92YWx1ZV8gPSBmYWxzZTsKKyAgYm9vbCBsYXN0X21pc3NfbWF0Y2hfID0gdHJ1ZTsKKyAgT3V0cHV0VmFsdWVzIHNoYWRvd192YWx1ZXNfOworCisgIC8vIFRoZSBhY3R1YWwgb3V0cHV0IHZhbHVlcy4KKyAgT3V0cHV0VmFsdWVzIG91dHB1dF87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEVkZ2VDb3VudGVyKTsKK307CisKKy8vIFN5bmNocm9uaXplcyByZWFkaW5nIGFuIGVuY29kZXIgd2l0aCBpbnRlcnJ1cHQgaGFuZGxpbmcuCitjbGFzcyBJbnRlcnJ1cHRTeW5jaHJvbml6ZWRFbmNvZGVyIDogcHVibGljIEludGVycnVwdEhhbmRsZXIgeworIHB1YmxpYzoKKyAgSW50ZXJydXB0U3luY2hyb25pemVkRW5jb2RlcihFbmNvZGVyICplbmNvZGVyKSA6IGVuY29kZXJfKGVuY29kZXIpIHt9CisKKyAgaW50MzJfdCBnZXQoKSBjb25zdCB7IHJldHVybiBvdXRwdXRfOyB9CisKKyBwcml2YXRlOgorICB2b2lkIEdhdGhlclBvbGxlZFZhbHVlKCkgb3ZlcnJpZGUgeyBzaGFkb3dfID0gZW5jb2Rlcl8tPkdldFJhdygpOyB9CisgIHZvaWQgQ29tbWl0VmFsdWUoKSBvdmVycmlkZSB7IG91dHB1dF8gPSBzaGFkb3dfOyB9CisgIHZvaWQgb3BlcmF0b3IoKSgpIG92ZXJyaWRlIHt9CisKKyAgRW5jb2RlciAqY29uc3QgZW5jb2Rlcl87CisKKyAgaW50MzJfdCBzaGFkb3dfLCBvdXRwdXRfOworfTsKKworLy8gU3luY2hyb25pemVzIGludGVycnVwdHMgd2l0aCBwb2xsLWJhc2VkIHNhbXBsaW5nIG9uIG11bHRpcGxlCisvLyBJbnRlcnJ1cHRIYW5kbGVycy4KKy8vCisvLyBTZWUgSW50ZXJydXB0SGFuZGxlciBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGxvZ2ljLgorLy8KKy8vIFVzYWdlIGlzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSwgY2FsbCBBZGQgMSBvciBtb3JlIHRpbWVzLCBjYWxsIFN0YXJ0LCBhbmQKKy8vIHRoZW4gY2FsbCBSdW5JdGVyYXRpb24gZHVyaW5nIG5vcm1hbCBzZW5zb3Igc2FtcGxpbmcuIEFmdGVyIFJ1bkl0ZXJhdGlvbgorLy8gcmV0dXJucywgdGhlIG91dHB1dCB2YWx1ZXMgZnJvbSB0aGUgdmFyaW91cyBJbnRlcnJ1cHRIYW5kbGVycyBjYW4gYmUKKy8vIHJldHJpZXZlZC4KK2NsYXNzIEludGVycnVwdFN5bmNocm9uaXplciB7CisgcHVibGljOgorICBJbnRlcnJ1cHRTeW5jaHJvbml6ZXIoaW50IGludGVycnVwdF9wcmlvcml0eSkKKyAgICAgIDogaW50ZXJydXB0X3ByaW9yaXR5XyhpbnRlcnJ1cHRfcHJpb3JpdHkpIHt9CisKKyAgdm9pZCBBZGQoSW50ZXJydXB0SGFuZGxlciAqaGFuZGxlcikgeworICAgIGhhbmRsZXItPnNldF9tdXRleCgmbXV0ZXhfKTsKKyAgICBoYW5kbGVyLT5zZXRfcHJpb3JpdHkoaW50ZXJydXB0X3ByaW9yaXR5Xyk7CisgICAgaGFuZGxlcnNfLmVtcGxhY2VfYmFjayhoYW5kbGVyKTsKKyAgfQorCisgIHZvaWQgU3RhcnQoKSB7CisgICAgZm9yIChhdXRvICZjIDogaGFuZGxlcnNfKSB7CisgICAgICBjLT5TdGFydCgpOworICAgIH0KKyAgfQorCisgIC8vIFVwZGF0ZXMgYWxsIG9mIHRoZSBjb3VudHMgYW5kIG1ha2VzIHN1cmUgZXZlcnl0aGluZyBpcyBzeW5jaHJvbml6ZWQuCisgIC8vIElNUE9SVEFOVDogVGhpcyB3aWxsIHVzdWFsbHkgb25seSB0YWtlIDEyMHVTIGJ1dCBXSUxMIG9jY2FzaW9uYWxseSB0YWtlCisgIC8vIGxvbmdlciwgc28gYmUgY2FyZWZ1bCBhYm91dCBsZXR0aW5nIHRoYXQgaml0dGVyIGdldCBpbnRvIGNvbnRyb2wgbG9vcHMuCisgIHZvaWQgUnVuSXRlcmF0aW9uKCk7CisKKyAgLy8gQXNrcyBhbGwgb2YgdGhlIEludGVycnVwdEhhbmRsZXJzIHRvIHN0b3AgYW5kIHdhaXRzIHVudGlsIHRoZXkgaGF2ZSBkb25lCisgIC8vIHNvLgorICB2b2lkIFF1aXQoKSB7CisgICAgZm9yIChhdXRvICZjIDogaGFuZGxlcnNfKSB7CisgICAgICBjLT5RdWl0KCk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICAvLyBTdGFydHMgYSBzYW1wbGluZyBpdGVyYXRpb24uICBTZWUgUnVuSXRlcmF0aW9uIGZvciB1c2FnZS4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHdlIGFyZSByZWFkeSB0byBnbyBvciBmYWxzZSBpZiB3ZSBhbHJlYWR5IG5lZWQgdG8gcmV0cnkuCisgIGJvb2wgVHJ5U3RhcnRJdGVyYXRpb24oKTsKKworICAvLyBBdHRlbXB0cyB0byBmaW5pc2ggYSBzYW1wbGluZyBpdGVyYXRpb24uICBTZWUgUnVuSXRlcmF0aW9uIGZvciB1c2FnZS4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBpdGVyYXRpb24gc3VjY2VlZGVkLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIFRyeUZpbmlzaGluZ0l0ZXJhdGlvbigpOworCisgIGNvbnN0IGludCBpbnRlcnJ1cHRfcHJpb3JpdHlfOworCisgIC8vIFRoZSBtdXRleCB1c2VkIHRvIHN5bmNocm9uaXplIGFsbCB0aGUgc2FtcGxpbmcuCisgIDo6YW9zOjpzdGxfbXV0ZXggbXV0ZXhfOworCisgIDo6c3RkOjp2ZWN0b3I8SW50ZXJydXB0SGFuZGxlciAqPiBoYW5kbGVyc187CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEludGVycnVwdFN5bmNocm9uaXplcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gRlJDOTcxX1dQSUxJQl9JTlRFUlJVUFRfRURHRV9DT1VOVElOR19IXwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9qb3lzdGlja19zZW5kZXIuY2MgYi9mcmM5NzEvd3BpbGliL2pveXN0aWNrX3NlbmRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzZjYzBmCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3dwaWxpYi9qb3lzdGlja19zZW5kZXIuY2MKQEAgLTAsMCArMSw1MCBAQAorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvam95c3RpY2tfc2VuZGVyLmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL21lc3NhZ2VzL3JvYm90X3N0YXRlLnEuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9uZXR3b3JrL3RlYW1fbnVtYmVyLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuaCIKKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2Ugd3BpbGliIHsKKwordm9pZCBKb3lzdGlja1NlbmRlcjo6b3BlcmF0b3IoKSgpIHsKKyAgRHJpdmVyU3RhdGlvbiAqZHMgPSBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpOworICA6OmFvczo6U2V0Q3VycmVudFRocmVhZE5hbWUoIkRTUmVhZGVyIik7CisgIHVpbnQxNl90IHRlYW1faWQgPSA6OmFvczo6bmV0d29yazo6R2V0VGVhbU51bWJlcigpOworCisgIDo6YW9zOjpTZXRDdXJyZW50VGhyZWFkUmVhbHRpbWVQcmlvcml0eSgyOSk7CisKKyAgd2hpbGUgKHJ1bl8pIHsKKyAgICBkcy0+V2FpdEZvckRhdGEoKTsKKyAgICBhdXRvIG5ld19zdGF0ZSA9IDo6YW9zOjpqb3lzdGlja19zdGF0ZS5NYWtlTWVzc2FnZSgpOworCisgICAgSEFMQ29udHJvbFdvcmQgY29udHJvbF93b3JkOworICAgIEhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sX3dvcmQpOworICAgIG5ld19zdGF0ZS0+dGVzdF9tb2RlID0gY29udHJvbF93b3JkLnRlc3Q7CisgICAgbmV3X3N0YXRlLT5mbXNfYXR0YWNoZWQgPSBjb250cm9sX3dvcmQuZm1zQXR0YWNoZWQ7CisgICAgbmV3X3N0YXRlLT5lbmFibGVkID0gY29udHJvbF93b3JkLmVuYWJsZWQ7CisgICAgbmV3X3N0YXRlLT5hdXRvbm9tb3VzID0gY29udHJvbF93b3JkLmF1dG9ub21vdXM7CisgICAgbmV3X3N0YXRlLT50ZWFtX2lkID0gdGVhbV9pZDsKKyAgICBuZXdfc3RhdGUtPmZha2UgPSBmYWxzZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICBuZXdfc3RhdGUtPmpveXN0aWNrc1tpXS5idXR0b25zID0gZHMtPkdldFN0aWNrQnV0dG9ucyhpKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgIG5ld19zdGF0ZS0+am95c3RpY2tzW2ldLmF4aXNbal0gPSBkcy0+R2V0U3RpY2tBeGlzKGksIGopOworICAgICAgfQorICAgICAgbmV3X3N0YXRlLT5qb3lzdGlja3NbaV0ucG92ID0gZHMtPkdldFN0aWNrUE9WKGksIDApOworICAgIH0KKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiam95c3RpY2tfc3RhdGUiLCAqbmV3X3N0YXRlKTsKKworICAgIGlmICghbmV3X3N0YXRlLlNlbmQoKSkgeworICAgICAgTE9HKFdBUk5JTkcsICJzZW5kaW5nIGpveXN0aWNrX3N0YXRlIGZhaWxlZFxuIik7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSB3cGlsaWIKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvam95c3RpY2tfc2VuZGVyLmggYi9mcmM5NzEvd3BpbGliL2pveXN0aWNrX3NlbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNWY5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvd3BpbGliL2pveXN0aWNrX3NlbmRlci5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgRlJDOTcxX1dQSUxJQl9KT1lTVElDS19TRU5ERVJfSF8KKyNkZWZpbmUgRlJDOTcxX1dQSUxJQl9KT1lTVElDS19TRU5ERVJfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2Ugd3BpbGliIHsKKworY2xhc3MgSm95c3RpY2tTZW5kZXIgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcigpKCk7CisKKyAgdm9pZCBRdWl0KCkgeyBydW5fID0gZmFsc2U7IH0KKworIHByaXZhdGU6CisgIDo6c3RkOjphdG9taWM8Ym9vbD4gcnVuX3t0cnVlfTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB3cGlsaWIKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBGUkM5NzFfV1BJTElCX0pPWVNUSUNLX1NFTkRFUl9IXwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9sb2dnaW5nLnEgYi9mcmM5NzEvd3BpbGliL2xvZ2dpbmcucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmIzNzk5Ci0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3dwaWxpYi9sb2dnaW5nLnEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIGZyYzk3MS53cGlsaWI7CisKKy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwbmV1bWF0aWNzIHN5c3RlbSB0byBsb2cuCitzdHJ1Y3QgUG5ldW1hdGljc1RvTG9nIHsKKyAgYm9vbCBjb21wcmVzc29yX29uOworICB1aW50OF90IHJlYWRfc29sZW5vaWRzOworfTsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvbG9vcF9vdXRwdXRfaGFuZGxlci5jYyBiL2ZyYzk3MS93cGlsaWIvbG9vcF9vdXRwdXRfaGFuZGxlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjVlNGVjCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3dwaWxpYi9sb29wX291dHB1dF9oYW5kbGVyLmNjCkBAIC0wLDAgKzEsNzIgQEAKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2xvb3Bfb3V0cHV0X2hhbmRsZXIuaCIKKworI2luY2x1ZGUgPHN5cy90aW1lcmZkLmg+CisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL21lc3NhZ2VzL3JvYm90X3N0YXRlLnEuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2Ugd3BpbGliIHsKKworY29uc3RleHByIDo6YW9zOjp0aW1lOjpUaW1lIExvb3BPdXRwdXRIYW5kbGVyOjprU3RvcFRpbWVvdXQ7CisKK0xvb3BPdXRwdXRIYW5kbGVyOjpMb29wT3V0cHV0SGFuZGxlcigpIDogd2F0Y2hkb2dfKHRoaXMpIHt9CisKK3ZvaWQgTG9vcE91dHB1dEhhbmRsZXI6Om9wZXJhdG9yKCkoKSB7CisgIDo6YW9zOjpTZXRDdXJyZW50VGhyZWFkTmFtZSgiT3V0cHV0SGFuZGxlciIpOworICA6OnN0ZDo6dGhyZWFkIHdhdGNoZG9nX3RocmVhZCg6OnN0ZDo6cmVmKHdhdGNoZG9nXykpOworCisgIDo6YW9zOjpTZXRDdXJyZW50VGhyZWFkUmVhbHRpbWVQcmlvcml0eSgzMCk7CisgIHdoaWxlIChydW5fKSB7CisgICAgbm9fam95c3RpY2tfc3RhdGVfLlByaW50KCk7CisgICAgZmFrZV9qb3lzdGlja19zdGF0ZV8uUHJpbnQoKTsKKyAgICBSZWFkKCk7CisgICAgOjphb3M6OmpveXN0aWNrX3N0YXRlLkZldGNoTGF0ZXN0KCk7CisgICAgaWYgKCE6OmFvczo6am95c3RpY2tfc3RhdGUuZ2V0KCkpIHsKKyAgICAgIExPR19JTlRFUlZBTChub19qb3lzdGlja19zdGF0ZV8pOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICg6OmFvczo6am95c3RpY2tfc3RhdGUtPmZha2UpIHsKKyAgICAgIExPR19JTlRFUlZBTChmYWtlX2pveXN0aWNrX3N0YXRlXyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB3YXRjaGRvZ18uUmVzZXQoKTsKKyAgICBXcml0ZSgpOworICB9CisKKyAgU3RvcCgpOworCisgIHdhdGNoZG9nXy5RdWl0KCk7CisgIHdhdGNoZG9nX3RocmVhZC5qb2luKCk7Cit9CisKK0xvb3BPdXRwdXRIYW5kbGVyOjpXYXRjaGRvZzo6V2F0Y2hkb2coTG9vcE91dHB1dEhhbmRsZXIgKmhhbmRsZXIpCisgICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwKKyAgICAgIHRpbWVyZmRfKHRpbWVyZmRfY3JlYXRlKDo6YW9zOjp0aW1lOjpUaW1lOjprRGVmYXVsdENsb2NrLCAwKSkgeworICBpZiAodGltZXJmZF8uZ2V0KCkgPT0gLTEpIHsKKyAgICBQTE9HKEZBVEFMLCAidGltZXJmZF9jcmVhdGUoVGltZTo6a0RlZmF1bHRDbG9jaywgMCkiKTsKKyAgfQorICA6OmFvczo6U2V0Q3VycmVudFRocmVhZFJlYWx0aW1lUHJpb3JpdHkoMzUpOworICA6OmFvczo6U2V0Q3VycmVudFRocmVhZE5hbWUoIk91dHB1dFdhdGNoZG9nIik7Cit9CisKK3ZvaWQgTG9vcE91dHB1dEhhbmRsZXI6OldhdGNoZG9nOjpvcGVyYXRvcigpKCkgeworICB1aW50OF90IGJ1Zls4XTsKKyAgd2hpbGUgKHJ1bl8pIHsKKyAgICBQQ0hFQ0socmVhZCh0aW1lcmZkXy5nZXQoKSwgYnVmLCBzaXplb2YoYnVmKSkpOworICAgIGhhbmRsZXJfLT5TdG9wKCk7CisgIH0KK30KKwordm9pZCBMb29wT3V0cHV0SGFuZGxlcjo6V2F0Y2hkb2c6OlJlc2V0KCkgeworICBpdGltZXJzcGVjIHZhbHVlID0gaXRpbWVyc3BlYygpOworICB2YWx1ZS5pdF92YWx1ZSA9IGtTdG9wVGltZW91dC5Ub1RpbWVzcGVjKCk7CisgIFBDSEVDSyh0aW1lcmZkX3NldHRpbWUodGltZXJmZF8uZ2V0KCksIDAsICZ2YWx1ZSwgbnVsbHB0cikpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2xvb3Bfb3V0cHV0X2hhbmRsZXIuaCBiL2ZyYzk3MS93cGlsaWIvbG9vcF9vdXRwdXRfaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzI3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvd3BpbGliL2xvb3Bfb3V0cHV0X2hhbmRsZXIuaApAQCAtMCwwICsxLDg5IEBACisjaWZuZGVmIEZSQzk3MV9XUElMSUJfTE9PUF9PVVRQVVRfSEFORExFUl9IXworI2RlZmluZSBGUkM5NzFfV1BJTElCX0xPT1BfT1VUUFVUX0hBTkRMRVJfSF8KKworI2luY2x1ZGUgImFvcy9jb21tb24vc2NvcGVkX2ZkLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL2xvZ19pbnRlcnZhbC5oIgorCisjaW5jbHVkZSA8YXRvbWljPgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB3cGlsaWIgeworCisvLyBIYW5kbGVzIHNlbmRpbmcgdGhlIG91dHB1dCBmcm9tIGEgc2luZ2xlIGNvbnRyb2wgbG9vcCB0byB0aGUgaGFyZHdhcmUuCisvLworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHN0b3BwaW5nIG1vdG9ycyB3aGVuIG5vIG5ldyB2YWx1ZXMgYXJlIHJlY2VpdmVkIGZvciB0b28KKy8vIGxvbmcgZWZmaWNpZW50bHkuCisvLworLy8gVGhlIGludGVuZGVkIHVzZSBpcyB0byBoYXZlIGEgc3ViY2xhc3MgZm9yIGVhY2ggbG9vcCB3aGljaCBpbXBsZW1lbnRzIHRoZQorLy8gcHVyZSB2aXJ0dWFsIG1ldGhvZHMgYW5kIGlzIHRoZW4gcnVuIGluIGEgc2VwYXJhdGUgdGhyZWFkLiBUaGUgb3BlcmF0b3IoKQorLy8gbG9vcHMgd3JpdGluZyB2YWx1ZXMgdW50aWwgUXVpdCgpIGlzIGNhbGxlZC4KK2NsYXNzIExvb3BPdXRwdXRIYW5kbGVyIHsKKyBwdWJsaWM6CisgIExvb3BPdXRwdXRIYW5kbGVyKCk7CisKKyAgdm9pZCBRdWl0KCkgeyBydW5fID0gZmFsc2U7IH0KKworICB2b2lkIG9wZXJhdG9yKCkoKTsKKworIHByb3RlY3RlZDoKKyAgLy8gUmVhZCBhIG1lc3NhZ2UgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcXVldWUuCisgIC8vIFRoaXMgbXVzdCBibG9jay4KKyAgdmlydHVhbCB2b2lkIFJlYWQoKSA9IDA7CisKKyAgLy8gU2VuZCB0aGUgb3V0cHV0IGZyb20gdGhlIGFwcHJvcHJpYXRlIHF1ZXVlIHRvIHRoZSBoYXJkd2FyZS4KKyAgLy8gUmVhZCgpIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSBwZXIgaW52b2NhdGlvbiBvZiB0aGlzLgorICB2aXJ0dWFsIHZvaWQgV3JpdGUoKSA9IDA7CisKKyAgLy8gU3RvcCBhbGwgb3V0cHV0cy4gVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiBhIHNlcGFyYXRlIHRocmVhZCAoaWYgYXQgYWxsKS4KKyAgLy8gVGhlIHN1YmNsYXNzIGltcGxlbWVudGF0aW9uIHNob3VsZCBoYW5kbGUgYW55IGFwcHJvcHJpYXRlIGxvZ2dpbmcuCisgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGlmIFJlYWQoKSBibG9ja3MgZm9yIHRvbyBsb25nIGFuZCBvbmNlCisgIC8vIGFmdGVyIFF1aXQgaXMgY2FsbGVkLgorICB2aXJ0dWFsIHZvaWQgU3RvcCgpID0gMDsKKworIHByaXZhdGU6CisgIC8vIFRoZSB0aHJlYWQgdGhhdCBhY3R1YWxseSBjb250YWlucyBhIHRpbWVyZmQgdG8gaW1wbGVtZW50IHRpbWVvdXRzLiBUaGUKKyAgLy8gaWRlYSBpcyB0byBoYXZlIGEgdGltZXJmZCB0aGF0IGlzIHJlcGVhdGVkbHkgc2V0IHRvIHRoZSB0aW1lb3V0IGV4cGlyYXRpb24KKyAgLy8gaW4gdGhlIGZ1dHVyZSBzbyBpdCB3aWxsIG5ldmVyIGFjdHVhbGx5IGV4cGlyZSB1bmxlc3MgaXQgaXMgbm90IHJlc2V0IGZvcgorICAvLyB0b28gbG9uZy4KKyAgLy8KKyAgLy8gVGhpcyBjbGFzcyBuaWNlbHkgZW5jYXBzdWxhdGVzIHRoZSByYXcgZmQgYW5kIG1hbmlwdWxhdGluZyBpdC4gSXRzCisgIC8vIG9wZXJhdG9yKCkgbG9vcHMgdW50aWwgUXVpdCgpIGlzIGNhbGxlZCwgY2FsbGluZyBTdG9wKCkgb24gaXRzIGFzc29jaWF0ZWQKKyAgLy8gTG9vcE91dHB1dEhhbmRsZXIgd2hlbmV2ZXIgdGhlIHRpbWVyZmQgZXhwaXJlcy4KKyAgY2xhc3MgV2F0Y2hkb2cgeworICAgcHVibGljOgorICAgIFdhdGNoZG9nKExvb3BPdXRwdXRIYW5kbGVyICpoYW5kbGVyKTsKKworICAgIHZvaWQgb3BlcmF0b3IoKSgpOworCisgICAgdm9pZCBSZXNldCgpOworCisgICAgdm9pZCBRdWl0KCkgeyBydW5fID0gZmFsc2U7IH0KKworICAgcHJpdmF0ZToKKyAgICBMb29wT3V0cHV0SGFuZGxlciAqY29uc3QgaGFuZGxlcl87CisKKyAgICA6OmFvczo6U2NvcGVkRkQgdGltZXJmZF87CisKKyAgICA6OnN0ZDo6YXRvbWljPGJvb2w+IHJ1bl97dHJ1ZX07CisgIH07CisKKyAgc3RhdGljIGNvbnN0ZXhwciA6OmFvczo6dGltZTo6VGltZSBrU3RvcFRpbWVvdXQgPQorICAgICAgOjphb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjAyKTsKKworICBXYXRjaGRvZyB3YXRjaGRvZ187CisKKyAgOjpzdGQ6OmF0b21pYzxib29sPiBydW5fe3RydWV9OworCisgIDo6YW9zOjp1dGlsOjpTaW1wbGVMb2dJbnRlcnZhbCBub19qb3lzdGlja19zdGF0ZV8gPQorICAgICAgOjphb3M6OnV0aWw6OlNpbXBsZUxvZ0ludGVydmFsKDo6YW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMoMC41KSwgSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gam95c3RpY2sgc3RhdGUgLT4gbm90IG91dHB1dHRpbmciKTsKKyAgOjphb3M6OnV0aWw6OlNpbXBsZUxvZ0ludGVydmFsIGZha2Vfam95c3RpY2tfc3RhdGVfID0KKyAgICAgIDo6YW9zOjp1dGlsOjpTaW1wbGVMb2dJbnRlcnZhbCg6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDAuNSksIERFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWtlIGpveXN0aWNrIHN0YXRlIC0+IG5vdCBvdXRwdXR0aW5nIik7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gRlJDOTcxX1dQSUxJQl9MT09QX09VVFBVVF9IQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXAgYi9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3YjgxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cApAQCAtMCwwICsxLDE2NSBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbG9nZ2luZ19xdWV1ZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2xvZ2dpbmcucScsCisgICAgICBdLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9wYXRoJzogJ2ZyYzk3MS93cGlsaWInLAorICAgICAgfSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaScgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdlbmNvZGVyX2FuZF9wb3RlbnRpb21ldGVyJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpXUElMaWInLAorICAgICAgICAnZG1hX2VkZ2VfY291bnRpbmcnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDptdXRleCcsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6V1BJTGliJywKKyAgICAgICAgJ2RtYV9lZGdlX2NvdW50aW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDptdXRleCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RtYV9lZGdlX2NvdW50aW5nJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZG1hX2VkZ2VfY291bnRpbmcuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6V1BJTGliJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnaGFsbF9lZmZlY3QnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOldQSUxpYicsCisgICAgICAgICdoYWxsX2VmZmVjdCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2ludGVycnVwdF9lZGdlX2NvdW50aW5nJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnaW50ZXJydXB0X2VkZ2VfY291bnRpbmcuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6V1BJTGliJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnN0bF9tdXRleCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpXUElMaWInLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6c3RsX211dGV4JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYnVmZmVyZWRfcGNtJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnYnVmZmVyZWRfc29sZW5vaWQuY2MnLAorICAgICAgICAnYnVmZmVyZWRfcGNtLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOldQSUxpYicsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpXUElMaWInLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdneXJvX2ludGVyZmFjZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2d5cm9faW50ZXJmYWNlLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOldQSUxpYicsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpXUElMaWInLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdneXJvX3NlbmRlcicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2d5cm9fc2VuZGVyLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChERVBUSCkvZnJjOTcxL3F1ZXVlcy9xdWV1ZXMuZ3lwOmd5cm8nLAorICAgICAgICAnZ3lyb19pbnRlcmZhY2UnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9tZXNzYWdlcy9tZXNzYWdlcy5neXA6cm9ib3Rfc3RhdGUnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICdneXJvX2ludGVyZmFjZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xvb3Bfb3V0cHV0X2hhbmRsZXInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdsb29wX291dHB1dF9oYW5kbGVyLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnNjb3BlZF9mZCcsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpsb2dfaW50ZXJ2YWwnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9tZXNzYWdlcy9tZXNzYWdlcy5neXA6cm9ib3Rfc3RhdGUnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnNjb3BlZF9mZCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6bG9nX2ludGVydmFsJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnam95c3RpY2tfc2VuZGVyJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnam95c3RpY2tfc2VuZGVyLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOldQSUxpYicsCisgICAgICAgICc8KEFPUykvY29tbW9uL21lc3NhZ2VzL21lc3NhZ2VzLmd5cDpyb2JvdF9zdGF0ZScsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbmV0d29yay9uZXR3b3JrLmd5cDp0ZWFtX251bWJlcicsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2hhbGxfZWZmZWN0JywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAjJ2hhbGxfZWZmZWN0LmgnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6V1BJTGliJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpXUElMaWInLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvZnJjOTcxL3plcm9pbmcvemVyb2luZy5jYyBiL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmcuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0NDQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmcuY2MKQEAgLTAsMCArMSwxMjQgQEAKKyNpbmNsdWRlICJmcmM5NzEvemVyb2luZy96ZXJvaW5nLmgiCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHplcm9pbmcgeworCit2b2lkIFBvcHVsYXRlRXN0aW1hdG9yU3RhdGUoY29uc3QgemVyb2luZzo6WmVyb2luZ0VzdGltYXRvciYgZXN0aW1hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRvclN0YXRlKiBzdGF0ZSkgeworICBzdGF0ZS0+ZXJyb3IgPSBlc3RpbWF0b3IuZXJyb3IoKTsKKyAgc3RhdGUtPnplcm9lZCA9IGVzdGltYXRvci56ZXJvZWQoKTsKKyAgc3RhdGUtPnBvc2l0aW9uID0gZXN0aW1hdG9yLnBvc2l0aW9uKCk7Cit9CisKK1plcm9pbmdFc3RpbWF0b3I6Olplcm9pbmdFc3RpbWF0b3IoCisgICAgY29uc3QgY29uc3RhbnRzOjpaZXJvaW5nQ29uc3RhbnRzJiBjb25zdGFudHMpIHsKKyAgaW5kZXhfZGlmZl8gPSBjb25zdGFudHMuaW5kZXhfZGlmZmVyZW5jZTsKKyAgbWF4X3NhbXBsZV9jb3VudF8gPSBjb25zdGFudHMuYXZlcmFnZV9maWx0ZXJfc2l6ZTsKKyAga25vd25faW5kZXhfcG9zXyA9IGNvbnN0YW50cy5tZWFzdXJlZF9pbmRleF9wb3NpdGlvbjsKKyAgYWxsb3dhYmxlX2VuY29kZXJfZXJyb3JfID0gY29uc3RhbnRzLmFsbG93YWJsZV9lbmNvZGVyX2Vycm9yOworICBzdGFydF9wb3Nfc2FtcGxlc18ucmVzZXJ2ZShtYXhfc2FtcGxlX2NvdW50Xyk7CisgIFJlc2V0KCk7Cit9CisKK3ZvaWQgWmVyb2luZ0VzdGltYXRvcjo6UmVzZXQoKSB7CisgIHNhbXBsZXNfaWR4XyA9IDA7CisgIHN0YXJ0X3Bvc18gPSAwOworICBzdGFydF9wb3Nfc2FtcGxlc18uY2xlYXIoKTsKKyAgemVyb2VkXyA9IGZhbHNlOworICB3YWl0X2Zvcl9pbmRleF9wdWxzZV8gPSB0cnVlOworICBsYXN0X3VzZWRfaW5kZXhfcHVsc2VfY291bnRfID0gMDsKKyAgZmlyc3Rfc3RhcnRfcG9zXyA9IDAuMDsKKyAgZXJyb3JfID0gZmFsc2U7Cit9CisKK3ZvaWQgWmVyb2luZ0VzdGltYXRvcjo6VHJpZ2dlckVycm9yKCkgeworICBpZiAoIWVycm9yXykgeworICAgIExPRyhFUlJPUiwgIk1hbnVhbGx5IHRyaWdnZXJlZCB6ZXJvaW5nIGVycm9yLlxuIik7CisgICAgZXJyb3JfID0gdHJ1ZTsKKyAgfQorfQorCitkb3VibGUgWmVyb2luZ0VzdGltYXRvcjo6Q2FsY3VsYXRlU3RhcnRQb3NpdGlvbihkb3VibGUgc3RhcnRfYXZlcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRjaGVkX2VuY29kZXIpIGNvbnN0IHsKKyAgLy8gV2UgY2FsY3VsYXRlIGFuIGFwcm94aW1hdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgaW5kZXggcG9zaXRpb24uCisgIC8vIEFsc28gYWNjb3VudCBmb3IgaW5kZXggcHVsc2VzIG5vdCBsaW5pbmcgdXAgd2l0aCBpbnRlZ2VyIG11bHRpcGxlcyBvZiB0aGUKKyAgLy8gaW5kZXhfZGlmZi4KKyAgZG91YmxlIGluZGV4X3BvcyA9IHN0YXJ0X2F2ZXJhZ2UgKyBsYXRjaGVkX2VuY29kZXIgLSBrbm93bl9pbmRleF9wb3NfOworICAvLyBXZSByb3VuZCBpbmRleF9wb3MgdG8gdGhlIGNsb3Nlc3QgdmFsaWQgdmFsdWUgb2YgdGhlIGluZGV4LgorICBkb3VibGUgYWNjdXJhdGVfaW5kZXhfcG9zID0gKHJvdW5kKGluZGV4X3BvcyAvIGluZGV4X2RpZmZfKSkgKiBpbmRleF9kaWZmXzsKKyAgLy8gTm93IHdlIHJldmVyc2UgdGhlIGZpcnN0IGNhbGN1bGF0aW9uIHRvIGdldCB0aGUgYWNjdXJhdGUgc3RhcnQgcG9zaXRpb24uCisgIHJldHVybiBhY2N1cmF0ZV9pbmRleF9wb3MgLSBsYXRjaGVkX2VuY29kZXIgKyBrbm93bl9pbmRleF9wb3NfOworfQorCit2b2lkIFplcm9pbmdFc3RpbWF0b3I6OlVwZGF0ZUVzdGltYXRlKGNvbnN0IFBvdEFuZEluZGV4UG9zaXRpb24mIGluZm8pIHsKKyAgLy8gV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBlbmNvdW50ZXIgYXQgbGVhc3Qgb25lIGluZGV4IHB1bHNlIHdoaWxlCisgIC8vIHplcm9pbmcuIFNvIHdlIHRha2UgdGhlIGluZGV4IHB1bHNlIGNvdW50IGZyb20gdGhlIGZpcnN0IHNhbXBsZSBhZnRlcgorICAvLyByZXNldCBhbmQgd2FpdCBmb3IgdGhhdCBjb3VudCB0byBjaGFuZ2UgYmVmb3JlIHdlIGNvbnNpZGVyIG91cnNlbHZlcworICAvLyB6ZXJvZWQuCisgIGlmICh3YWl0X2Zvcl9pbmRleF9wdWxzZV8pIHsKKyAgICBsYXN0X3VzZWRfaW5kZXhfcHVsc2VfY291bnRfID0gaW5mby5pbmRleF9wdWxzZXM7CisgICAgd2FpdF9mb3JfaW5kZXhfcHVsc2VfID0gZmFsc2U7CisgIH0KKworICBpZiAoc3RhcnRfcG9zX3NhbXBsZXNfLnNpemUoKSA8IG1heF9zYW1wbGVfY291bnRfKSB7CisgICAgc3RhcnRfcG9zX3NhbXBsZXNfLnB1c2hfYmFjayhpbmZvLnBvdCAtIGluZm8uZW5jb2Rlcik7CisgIH0gZWxzZSB7CisgICAgc3RhcnRfcG9zX3NhbXBsZXNfW3NhbXBsZXNfaWR4X10gPSBpbmZvLnBvdCAtIGluZm8uZW5jb2RlcjsKKyAgfQorCisgIC8vIERyb3AgdGhlIG9sZGVzdCBzYW1wbGUgd2hlbiB3ZSBydW4gdGhpcyBmdW5jdGlvbiB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KKyAgc2FtcGxlc19pZHhfID0gKHNhbXBsZXNfaWR4XyArIDEpICUgbWF4X3NhbXBsZV9jb3VudF87CisKKyAgZG91YmxlIHNhbXBsZV9zdW0gPSAwLjA7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGFydF9wb3Nfc2FtcGxlc18uc2l6ZSgpOyArK2kpIHsKKyAgICBzYW1wbGVfc3VtICs9IHN0YXJ0X3Bvc19zYW1wbGVzX1tpXTsKKyAgfQorCisgIC8vIENhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uLgorICBkb3VibGUgc3RhcnRfYXZlcmFnZSA9IHNhbXBsZV9zdW0gLyBzdGFydF9wb3Nfc2FtcGxlc18uc2l6ZSgpOworCisgIC8vIElmIHRoZXJlIGFyZSBubyBpbmRleCBwdWxzZXMgdG8gdXNlIG9yIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNhbXBsZXMgeWV0IHRvCisgIC8vIGhhdmUgYSB3ZWxsLWZpbHRlcmVkIHN0YXJ0aW5nIHBvc2l0aW9uIHRoZW4gd2UgdXNlIHRoZSBmaWx0ZXJlZCB2YWx1ZSBhcworICAvLyBvdXIgYmVzdCBndWVzcy4KKyAgaWYgKCF6ZXJvZWRfICYmIChpbmZvLmluZGV4X3B1bHNlcyA9PSBsYXN0X3VzZWRfaW5kZXhfcHVsc2VfY291bnRfIHx8CisgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3JhdGlvX3JlYWR5KCkgPCAxLjApKSB7CisgICAgc3RhcnRfcG9zXyA9IHN0YXJ0X2F2ZXJhZ2U7CisgIH0gZWxzZSBpZiAoIXplcm9lZF8gfHwgbGFzdF91c2VkX2luZGV4X3B1bHNlX2NvdW50XyAhPSBpbmZvLmluZGV4X3B1bHNlcykgeworICAgIC8vIE5vdGUgdGhlIGFjY3VyYXRlIHN0YXJ0IHBvc2l0aW9uIGFuZCB0aGUgY3VycmVudCBpbmRleCBwdWxzZSBjb3VudCBzbworICAgIC8vIHRoYXQgd2Ugb25seSBydW4gdGhpcyBsb2dpYyBvbmNlIHBlciBpbmRleCBwdWxzZS4gVGhhdCBzaG91bGQgYmUgbW9yZQorICAgIC8vIHJlc2lsaWVudCB0byBjb3JydXB0ZWQgaW50ZXJtZWRpYXRlIGRhdGEuCisgICAgc3RhcnRfcG9zXyA9IENhbGN1bGF0ZVN0YXJ0UG9zaXRpb24oc3RhcnRfYXZlcmFnZSwgaW5mby5sYXRjaGVkX2VuY29kZXIpOworICAgIGxhc3RfdXNlZF9pbmRleF9wdWxzZV9jb3VudF8gPSBpbmZvLmluZGV4X3B1bHNlczsKKyAgICAvLyBTYXZlIHRoZSBmaXJzdCBzdGFydGluZyBwb3NpdGlvbi4KKyAgICBpZiAoIXplcm9lZF8pIHsKKyAgICAgIGZpcnN0X3N0YXJ0X3Bvc18gPSBzdGFydF9wb3NfOworICAgICAgTE9HKElORk8sICJsYXRjaGluZyBzdGFydCBwb3NpdGlvbiAlZlxuIiwgZmlyc3Rfc3RhcnRfcG9zXyk7CisgICAgfQorCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhbiBhY2N1cmF0ZSBzdGFydGluZyBwb3NpdGlvbiB3ZSBjYW4gY29uc2lkZXIgb3Vyc2VsdmVzCisgICAgLy8gemVyb2VkLgorICAgIHplcm9lZF8gPSB0cnVlOworICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGZpcnN0X3N0YXJ0X3BvcyBpcyBiaWdnZXIvc21hbGxlciB0aGFuCisgICAgLy8gYWxsb3dhYmxlX2VuY29kZXJfZXJyb3JfICogaW5kZXhfZGlmZiArCisgICAgLy8gc3RhcnRfcG9zLgorICAgIGlmICg6OnN0ZDo6YWJzKGZpcnN0X3N0YXJ0X3Bvc18gLSBzdGFydF9wb3NfKSA+CisgICAgICAgIGFsbG93YWJsZV9lbmNvZGVyX2Vycm9yXyAqIGluZGV4X2RpZmZfKSB7CisgICAgICBpZiAoIWVycm9yXykgeworICAgICAgICBMT0coRVJST1IsCisgICAgICAgICAgICAiRW5jb2RlciB0aWNrcyBvdXQgb2YgcmFuZ2Ugc2luY2UgbGFzdCBpbmRleCBwdWxzZS4gZmlyc3Qgc3RhcnQgIgorICAgICAgICAgICAgInBvc2l0aW9uOiAlZiByZWNlbnQgc3RhcnRpbmcgcG9zaXRpb246ICVmXG4iLAorICAgICAgICAgICAgZmlyc3Rfc3RhcnRfcG9zXywgc3RhcnRfcG9zXyk7CisgICAgICAgIGVycm9yXyA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcG9zXyA9IHN0YXJ0X3Bvc18gKyBpbmZvLmVuY29kZXI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB6ZXJvaW5nCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9mcmM5NzEvemVyb2luZy96ZXJvaW5nLmd5cCBiL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmcuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhN2EyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcmM5NzEvemVyb2luZy96ZXJvaW5nLmd5cApAQCAtMCwwICsxLDMzIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICd6ZXJvaW5nJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnemVyb2luZy5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnF1ZXVlcycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpxdWV1ZXMnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICd6ZXJvaW5nX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3plcm9pbmdfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVfdGVzdHV0aWxzJywKKyAgICAgICAgJ3plcm9pbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnRocmVhZCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6ZGllJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnBvc2l0aW9uX3NlbnNvcl9zaW0nLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6cXVldWVzJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmcuaCBiL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTc2ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3plcm9pbmcvemVyb2luZy5oCkBAIC0wLDAgKzEsMTIxIEBACisjaWZuZGVmIEZSQzk3MV9aRVJPSU5HX1pFUk9JTkdfSF8KKyNkZWZpbmUgRlJDOTcxX1pFUk9JTkdfWkVST0lOR19IXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29uc3RhbnRzLmgiCisKKy8vIFRPRE8ocHNjaHJhZGVyKTogRmxhZyBhbiBlcnJvciBpZiBlbmNvZGVyIGluZGV4IHB1bHNlIGlzIG5vdCBuIHJldm9sdXRpb25zCisvLyBhd2F5IGZyb20gdGhlIGxhc3Qgb25lIChpLmUuIGdvdCBleHRyYSBjb3VudHMgZnJvbSBub2lzZSwgZXRjLi4pCisvLworLy8gVE9ETyhwc2NocmFkZXIpOiBGbGFnIGVycm9yIGlmIHRoZSBwb3QgZGlzYWdyZWVzIHRvbyBtdWNoIHdpdGggdGhlIGVuY29kZXIKKy8vIGFmdGVyIGJlaW5nIHplcm9lZC4KKy8vCisvLyBUT0RPKHBzY2hyYWRlcik6IFdhdGNoIHRoZSBvZmZzZXQgb3ZlciBsb25nIHBlcmlvZHMgb2YgdGltZSBhbmQgZmxhZyBpZiBpdAorLy8gZ2V0cyB0b28gZmFyIGF3YXkgZnJvbSB0aGUgaW5pdGlhbCB2YWx1ZS4KKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgemVyb2luZyB7CisKKy8vIEVzdGltYXRlcyB0aGUgcG9zaXRpb24gd2l0aCBlbmNvZGVyLAorLy8gdGhlIHBvdCBhbmQgdGhlIGluZGljZXMuCitjbGFzcyBaZXJvaW5nRXN0aW1hdG9yIHsKKyBwdWJsaWM6CisgIFplcm9pbmdFc3RpbWF0b3IoY29uc3QgY29uc3RhbnRzOjpaZXJvaW5nQ29uc3RhbnRzICZjb25zdGFudHMpOworCisgIC8vIFVwZGF0ZSB0aGUgaW50ZXJuYWwgbG9naWMgd2l0aCB0aGUgbmV4dCBzZW5zb3IgdmFsdWVzLgorICB2b2lkIFVwZGF0ZUVzdGltYXRlKGNvbnN0IFBvdEFuZEluZGV4UG9zaXRpb24gJmluZm8pOworCisgIC8vIFJlc2V0IHRoZSBpbnRlcm5hbCBsb2dpYyBzbyBpdCBuZWVkcyB0byBiZSByZS16ZXJvZWQuCisgIHZvaWQgUmVzZXQoKTsKKworICAvLyBNYW51YWxseSB0cmlnZ2VyIGFuIGludGVybmFsIGVycm9yLiBUaGlzIGlzIHVzZWQgZm9yIHRlc3RpbmcgdGhlIGVycm9yCisgIC8vIGxvZ2ljLgorICB2b2lkIFRyaWdnZXJFcnJvcigpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBoYXMgb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4gVGhpcyBnZXRzIHJlc2V0IHRvCisgIC8vIGZhbHNlIHdoZW4gdGhlIFJlc2V0KCkgZnVuY3Rpb24gaXMgY2FsbGVkLgorICBib29sIGVycm9yKCkgY29uc3QgeyByZXR1cm4gZXJyb3JfOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsb2dpYyBjb25zaWRlcnMgdGhlIGNvcnJlc3BvbmRpbmcgbWVjaGFuaXNtIHRvIGJlCisgIC8vIHplcm9lZC4gSXQgcmV0dXJuIGZhbHNlIG90aGVyd2lzZS4gRm9yIGV4YW1wbGUsIHJpZ2h0IGFmdGVyIGEgY2FsbCB0bworICAvLyBSZXNldCgpIHRoaXMgcmV0dXJucyBmYWxzZS4KKyAgYm9vbCB6ZXJvZWQoKSBjb25zdCB7IHJldHVybiB6ZXJvZWRfOyB9CisKKyAgLy8gUmV0dXJuIHRoZSBlc3RpbWF0ZWQgcG9zaXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgbWVjaGFuaXNtLiBUaGlzIHZhbHVlCisgIC8vIGlzIGluIFNJIHVuaXRzLiBGb3IgZXhhbXBsZSwgdGhlIGVzdGltYXRvciBmb3IgdGhlIGVsZXZhdG9yIHdvdWxkIHJldHVybiBhCisgIC8vIHZhbHVlIGluIG1ldGVycyBmb3IgdGhlIGhlaWdodCByZWxhdGl2ZSB0byBhYnNvbHV0ZSB6ZXJvLgorICBkb3VibGUgcG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBwb3NfOyB9CisKKyAgLy8gUmV0dXJuIHRoZSBlc3RpbWF0ZWQgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgbWVjaGFuc2ltLiBJbgorICAvLyBzb21lIGNvbnRleHRzIHdlIHJlZmVyIHRvIHRoaXMgYXMgdGhlICJvZmZzZXQiLgorICBkb3VibGUgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gc3RhcnRfcG9zXzsgfQorCisgIC8vIFJldHVybnMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxIHRoYXQgcmVwcmVzZW50cyB0aGUgcGVyY2VudGFnZSBvZiB0aGUKKyAgLy8gc2FtcGxlcyBiZWluZyB1c2VkIGluIHRoZSBtb3ZpbmcgYXZlcmFnZSBmaWx0ZXIuIEEgdmFsdWUgb2YgMC4wIG1lYW5zIHRoYXQKKyAgLy8gbm8gc2FtcGxlcyBhcmUgYmVpbmcgdXNlZC4gQSB2YWx1ZSBvZiAxLjAgbWVhbnMgdGhhdCB0aGUgZmlsdGVyIGlzIHVzaW5nCisgIC8vIGFzIG1hbnkgc2FtcGxlcyBhcyBpdCBoYXMgcm9vbSBmb3IuIEZvciBleGFtcGxlLCBhZnRlciBhIFJlc2V0KCkgdGhpcworICAvLyB2YWx1ZSByZXR1cm5zIDAuMC4gQXMgbW9yZSBzYW1wbGVzIGdldCBhZGRlZCB3aXRoIFVwZGF0ZUVzdGltYXRlKC4uLikgdGhlCisgIC8vIHJldHVybiB2YWx1ZSBzdGFydHMgaW5jcmVhc2luZyB0byAxLjAuCisgIGRvdWJsZSBvZmZzZXRfcmF0aW9fcmVhZHkoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXJ0X3Bvc19zYW1wbGVzXy5zaXplKCkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KG1heF9zYW1wbGVfY291bnRfKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdGFydCBwb3NpdGlvbiBnaXZlbiB0aGUgaW50ZXJuYWwgc3RhdGUgYW5kCisgIC8vIHRoZSBwcm92aWRlZCBgbGF0Y2hlZF9lbmNvZGVyJyB2YWx1ZS4KKyAgZG91YmxlIENhbGN1bGF0ZVN0YXJ0UG9zaXRpb24oZG91YmxlIHN0YXJ0X2F2ZXJhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRjaGVkX2VuY29kZXIpIGNvbnN0OworCisgIC8vIFRoZSBlc3RpbWF0ZWQgcG9zaXRpb24uCisgIGRvdWJsZSBwb3NfOworICAvLyBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgaW5kZXggcG9zaXRpb25zLgorICBkb3VibGUgaW5kZXhfZGlmZl87CisgIC8vIFRoZSBuZXh0IHBvc2l0aW9uIGluICdzdGFydF9wb3Nfc2FtcGxlc18nIHRvIGJlIHVzZWQgdG8gc3RvcmUgdGhlIG5leHQKKyAgLy8gc2FtcGxlLgorICBpbnQgc2FtcGxlc19pZHhfOworICAvLyBMYXN0ICdtYXhfc2FtcGxlX2NvdW50Xycgc2FtcGxlcyBmb3Igc3RhcnQgcG9zaXRpb25zLgorICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHN0YXJ0X3Bvc19zYW1wbGVzXzsKKyAgLy8gVGhlIG51bWJlciBvZiB0aGUgbGFzdCBzYW1wbGVzIG9mIHN0YXJ0IHBvc2l0aW9uIHRvIGNvbnNpZGVyIGluIHRoZQorICAvLyBlc3RpbWF0aW9uLgorICBzaXplX3QgbWF4X3NhbXBsZV9jb3VudF87CisgIC8vIFRoZSBlc3RpbWF0ZWQgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1lY2hhbmlzbS4gV2UgYWxzbyBjYWxsIHRoaXMgdGhlCisgIC8vICdvZmZzZXQnIGluIHNvbWUgY29udGV4dHMuCisgIGRvdWJsZSBzdGFydF9wb3NfOworICAvLyBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgYW55IGluZGV4IHB1bHNlIG9uIHRoZSBtZWNoYW5pc20uIFRoaXMgaXMgdXNlZCB0bworICAvLyBhY2NvdW50IGZvciB0aGUgdmFyaW91cyB3YXlzIHRoZSBlbmNvZGVycyBnZXQgbW91bnRlZCBpbnRvIHRoZSByb2JvdC4KKyAgZG91YmxlIGtub3duX2luZGV4X3Bvc187CisgIC8vIEZsYWcgZm9yIHRyaWdnZXJpbmcgbG9naWMgdGhhdCB0YWtlcyBub3RlIG9mIHRoZSBjdXJyZW50IGluZGV4IHB1bHNlIGNvdW50CisgIC8vIGFmdGVyIGEgcmVzZXQuIFNlZSBgbGFzdF91c2VkX2luZGV4X3B1bHNlX2NvdW50XycuCisgIGJvb2wgd2FpdF9mb3JfaW5kZXhfcHVsc2VfOworICAvLyBBZnRlciBhIHJlc2V0IHdlIGtlZXAgdHJhY2sgb2YgdGhlIGluZGV4IHB1bHNlIGNvdW50IHdpdGggdGhpcy4gT25seSBhZnRlcgorICAvLyB0aGUgaW5kZXggcHVsc2UgY291bnQgY2hhbmdlcyAoaS5lLiBpbmNyZW1lbnRzIGF0IGxlYXN0IG9uY2Ugb3Igd3JhcHMKKyAgLy8gYXJvdW5kKSB3aWxsIHdlIGNvbnNpZGVyIHRoZSBtZWNoYW5pc20gemVyb2VkLiBXZSBhbHNvIHVzZSB0aGlzIHRvIHN0b3JlCisgIC8vIHRoZSBtb3N0IHJlY2VudCBgUG90QW5kSW5kZXhQb3NpdGlvbjo6aW5kZXhfcHVsc2VzJyB2YWx1ZSB3aGVuIHRoZSBzdGFydAorICAvLyBwb3NpdGlvbiB3YXMgY2FsY3VsYXRlZC4gSXQgaGVscHMgdXMgY2FsY3VsYXRlIHRoZSBzdGFydCBwb3NpdGlvbiBvbmx5IG9uCisgIC8vIGluZGV4IHB1bHNlcyB0byByZWplY3QgY29ycnVwdGVkIGludGVybWVkaWF0ZSBkYXRhLgorICB1aW50MzJfdCBsYXN0X3VzZWRfaW5kZXhfcHVsc2VfY291bnRfOworICAvLyBNYXJrZXIgdG8gdHJhY2sgd2hldGhlciB3ZSdyZSBmdWxseSB6ZXJvZWQgeWV0IG9yIG5vdC4KKyAgYm9vbCB6ZXJvZWRfOworICAvLyBNYXJrZXIgdG8gdHJhY2sgd2hldGhlciBhbiBlcnJvciBoYXMgb2NjdXJyZWQuIFRoaXMgZ2V0cyByZXNldCB0byBmYWxzZQorICAvLyB3aGVuZXZlciBSZXNldCgpIGlzIGNhbGxlZC4KKyAgYm9vbCBlcnJvcl87CisgIC8vIFN0b3JlcyB0aGUgcG9zaXRpb24gInN0YXJ0X3BvcyIgdmFyaWFibGUgdGhlIGZpcnN0IHRpbWUgdGhlIHByb2dyYW0KKyAgLy8gaXMgemVyb2VkLgorICBkb3VibGUgZmlyc3Rfc3RhcnRfcG9zXzsKKyAgLy8gVmFsdWUgYmV0d2VlbiAwIGFuZCAxIHdoaWNoIGRldGVybWluZXMgYSBmcmFjdGlvbiBvZiB0aGUgaW5kZXhfZGlmZgorICAvLyB5b3Ugd2FudCB0byB1c2UuCisgIGRvdWJsZSBhbGxvd2FibGVfZW5jb2Rlcl9lcnJvcl87Cit9OworCisvLyBQb3B1bGF0ZXMgYW4gRXN0aW1hdG9yU3RhdGUgc3RydWN0IHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgemVyb2luZworLy8gZXN0aW1hdG9yLgordm9pZCBQb3B1bGF0ZUVzdGltYXRvclN0YXRlKGNvbnN0IFplcm9pbmdFc3RpbWF0b3IgJmVzdGltYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFc3RpbWF0b3JTdGF0ZSAqc3RhdGUpOworCit9ICAvLyBuYW1lc3BhY2UgemVyb2luZworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIEZSQzk3MV9aRVJPSU5HX1pFUk9JTkdfSF8KZGlmZiAtLWdpdCBhL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmdfcXVldWUucSBiL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmdfcXVldWUucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE4MTczCi0tLSAvZGV2L251bGwKKysrIGIvZnJjOTcxL3plcm9pbmcvemVyb2luZ19xdWV1ZS5xCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgZnJjOTcxLnplcm9pbmc7CisKK3N0cnVjdCBaZXJvaW5nSW5mbyB7CisJZG91YmxlIHBvdDsKKwlkb3VibGUgZW5jb2RlcjsKKwlkb3VibGUgaW5kZXhfZW5jb2RlcjsKKwlpbnQzMl90IGluZGV4X2NvdW50OworfTsKKworbWVzc2FnZSBUZXN0TWVzc2FnZSB7CisJaW50MzJfdCB0ZXN0X2ludDsKK307CisKK3F1ZXVlIFRlc3RNZXNzYWdlIHRlc3RfcXVldWU7CmRpZmYgLS1naXQgYS9mcmM5NzEvemVyb2luZy96ZXJvaW5nX3Rlc3QuY2MgYi9mcmM5NzEvemVyb2luZy96ZXJvaW5nX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4MmUwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmdfdGVzdC5jYwpAQCAtMCwwICsxLDI5NyBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8cmFuZG9tPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJmcmM5NzEvemVyb2luZy96ZXJvaW5nLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5xLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvdGhyZWFkLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9kaWUuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9wb3NpdGlvbl9zZW5zb3Jfc2ltLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHplcm9pbmcgeworCit1c2luZyBjb250cm9sX2xvb3BzOjpQb3NpdGlvblNlbnNvclNpbXVsYXRvcjsKK3VzaW5nIGNvbnN0YW50czo6WmVyb2luZ0NvbnN0YW50czsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrU2FtcGxlU2l6ZSA9IDMwOworc3RhdGljIGNvbnN0IGRvdWJsZSBrQWNjZXB0YWJsZVVuemVyb2VkRXJyb3IgPSAwLjI7CitzdGF0aWMgY29uc3QgZG91YmxlIGtJbmRleEVycm9yRnJhY3Rpb24gPSAwLjM7CisKK2NsYXNzIFplcm9pbmdUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBhb3M6OlNldERpZVRlc3RNb2RlKHRydWUpOyB9CisKKyAgdm9pZCBNb3ZlVG8oUG9zaXRpb25TZW5zb3JTaW11bGF0b3IqIHNpbXVsYXRvciwgWmVyb2luZ0VzdGltYXRvciogZXN0aW1hdG9yLAorICAgICAgICAgICAgICBkb3VibGUgbmV3X3Bvc2l0aW9uKSB7CisgICAgUG90QW5kSW5kZXhQb3NpdGlvbiBzZW5zb3JfdmFsdWVzXzsKKyAgICBzaW11bGF0b3ItPk1vdmVUbyhuZXdfcG9zaXRpb24pOworICAgIHNpbXVsYXRvci0+R2V0U2Vuc29yVmFsdWVzKCZzZW5zb3JfdmFsdWVzXyk7CisgICAgZXN0aW1hdG9yLT5VcGRhdGVFc3RpbWF0ZShzZW5zb3JfdmFsdWVzXyk7CisgIH0KKworICBhb3M6OmNvbW1vbjo6dGVzdGluZzo6R2xvYmFsQ29yZUluc3RhbmNlIG15X2NvcmU7Cit9OworCitURVNUX0YoWmVyb2luZ1Rlc3QsIFRlc3RNb3ZpbmdBdmVyYWdlRmlsdGVyKSB7CisgIGNvbnN0IGRvdWJsZSBpbmRleF9kaWZmID0gMS4wOworICBQb3NpdGlvblNlbnNvclNpbXVsYXRvciBzaW0oaW5kZXhfZGlmZik7CisgIHNpbS5Jbml0aWFsaXplKDMuNiAqIGluZGV4X2RpZmYsIGluZGV4X2RpZmYgLyAzLjApOworICBaZXJvaW5nRXN0aW1hdG9yIGVzdGltYXRvcihaZXJvaW5nQ29uc3RhbnRzeworICAgICAga1NhbXBsZVNpemUsIGluZGV4X2RpZmYsIDAuMCwga0luZGV4RXJyb3JGcmFjdGlvbn0pOworCisgIC8vIFRoZSB6ZXJvaW5nIGNvZGUgaXMgc3VwcG9zZWQgdG8gcGVyZm9ybSBzb21lIGZpbHRlcmluZyBvbiB0aGUgZGlmZmVyZW5jZQorICAvLyBiZXR3ZWVuIHRoZSBwb3RlbnRpb21ldGVyIHZhbHVlIGFuZCB0aGUgZW5jb2RlciB2YWx1ZS4gV2UgYXNzdW1lIHRoYXQgMzAwCisgIC8vIHNhbXBsZXMgYXJlIHN1ZmZpY2llbnQgdG8gaGF2ZSB1cGRhdGVkIHRoZSBmaWx0ZXIuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAwOyBpKyspIHsKKyAgICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgMy4zICogaW5kZXhfZGlmZik7CisgIH0KKyAgQVNTRVJUX05FQVIoMy4zICogaW5kZXhfZGlmZiwgZXN0aW1hdG9yLnBvc2l0aW9uKCksCisgICAgICAgICAgICAgIGtBY2NlcHRhYmxlVW56ZXJvZWRFcnJvciAqIGluZGV4X2RpZmYpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAwOyBpKyspIHsKKyAgICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgMy45ICogaW5kZXhfZGlmZik7CisgIH0KKyAgQVNTRVJUX05FQVIoMy45ICogaW5kZXhfZGlmZiwgZXN0aW1hdG9yLnBvc2l0aW9uKCksCisgICAgICAgICAgICAgIGtBY2NlcHRhYmxlVW56ZXJvZWRFcnJvciAqIGluZGV4X2RpZmYpOworfQorCitURVNUX0YoWmVyb2luZ1Rlc3QsIE5vdFplcm9lZEJlZm9yZUVub3VnaFNhbXBsZXNDb2xsZWN0ZWQpIHsKKyAgZG91YmxlIGluZGV4X2RpZmYgPSAwLjU7CisgIGRvdWJsZSBwb3NpdGlvbiA9IDMuNiAqIGluZGV4X2RpZmY7CisgIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yIHNpbShpbmRleF9kaWZmKTsKKyAgc2ltLkluaXRpYWxpemUocG9zaXRpb24sIGluZGV4X2RpZmYgLyAzLjApOworICBaZXJvaW5nRXN0aW1hdG9yIGVzdGltYXRvcihaZXJvaW5nQ29uc3RhbnRzeworICAgICAga1NhbXBsZVNpemUsIGluZGV4X2RpZmYsIDAuMCwga0luZGV4RXJyb3JGcmFjdGlvbn0pOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB6ZXJvaW5nIGNvZGUgZG9lcyBub3QgY29uc2lkZXIgaXRzZWxmIHplcm9lZCB1bnRpbCB3ZQorICAvLyBjb2xsZWN0IGEgZ29vZCBhbW91bnQgb2Ygc2FtcGxlcy4gSW4gdGhpcyBjYXNlIHdlJ3JlIHdhaXRpbmcgdW50aWwgdGhlCisgIC8vIG1vdmluZyBhdmVyYWdlIGZpbHRlciBpcyBmdWxsLgorICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGtTYW1wbGVTaXplIC0gMTsgaSsrKSB7CisgICAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIHBvc2l0aW9uICs9IGluZGV4X2RpZmYpOworICAgIEFTU0VSVF9GQUxTRShlc3RpbWF0b3IuemVyb2VkKCkpOworICB9CisKKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIHBvc2l0aW9uKTsKKyAgQVNTRVJUX1RSVUUoZXN0aW1hdG9yLnplcm9lZCgpKTsKK30KKworVEVTVF9GKFplcm9pbmdUZXN0LCBUZXN0TG90c09mTW92ZW1lbnQpIHsKKyAgZG91YmxlIGluZGV4X2RpZmYgPSAxLjA7CisgIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yIHNpbShpbmRleF9kaWZmKTsKKyAgc2ltLkluaXRpYWxpemUoMy42LCBpbmRleF9kaWZmIC8gMy4wKTsKKyAgWmVyb2luZ0VzdGltYXRvciBlc3RpbWF0b3IoWmVyb2luZ0NvbnN0YW50c3sKKyAgICAgIGtTYW1wbGVTaXplLCBpbmRleF9kaWZmLCAwLjAsIGtJbmRleEVycm9yRnJhY3Rpb259KTsKKworICAvLyBUaGUgemVyb2luZyBjb2RlIGlzIHN1cHBvc2VkIHRvIHBlcmZvcm0gc29tZSBmaWx0ZXJpbmcgb24gdGhlIGRpZmZlcmVuY2UKKyAgLy8gYmV0d2VlbiB0aGUgcG90ZW50aW9tZXRlciB2YWx1ZSBhbmQgdGhlIGVuY29kZXIgdmFsdWUuIFdlIGFzc3VtZSB0aGF0IDMwMAorICAvLyBzYW1wbGVzIGFyZSBzdWZmaWNpZW50IHRvIGhhdmUgdXBkYXRlZCB0aGUgZmlsdGVyLgorICBmb3IgKGludCBpID0gMDsgaSA8IDMwMDsgaSsrKSB7CisgICAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDMuNik7CisgIH0KKyAgQVNTRVJUX05FQVIoMy42LCBlc3RpbWF0b3IucG9zaXRpb24oKSwga0FjY2VwdGFibGVVbnplcm9lZEVycm9yICogaW5kZXhfZGlmZik7CisKKyAgLy8gV2l0aCBhIHNpbmdsZSBpbmRleCBwdWxzZSB0aGUgemVyb2luZyBlc3RpbWF0b3Igc2hvdWxkIGJlIGFibGUgdG8gbG9jaworICAvLyBvbnRvIHRoZSB0cnVlIHZhbHVlIG9mIHRoZSBwb3NpdGlvbi4KKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDQuMDEpOworICBBU1NFUlRfTkVBUig0LjAxLCBlc3RpbWF0b3IucG9zaXRpb24oKSwgMC4wMDEpOworCisgIE1vdmVUbygmc2ltLCAmZXN0aW1hdG9yLCA0Ljk5KTsKKyAgQVNTRVJUX05FQVIoNC45OSwgZXN0aW1hdG9yLnBvc2l0aW9uKCksIDAuMDAxKTsKKworICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgMy45OSk7CisgIEFTU0VSVF9ORUFSKDMuOTksIGVzdGltYXRvci5wb3NpdGlvbigpLCAwLjAwMSk7CisKKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDMuMDEpOworICBBU1NFUlRfTkVBUigzLjAxLCBlc3RpbWF0b3IucG9zaXRpb24oKSwgMC4wMDEpOworCisgIE1vdmVUbygmc2ltLCAmZXN0aW1hdG9yLCAxMy41NSk7CisgIEFTU0VSVF9ORUFSKDEzLjU1LCBlc3RpbWF0b3IucG9zaXRpb24oKSwgMC4wMDEpOworfQorCitURVNUX0YoWmVyb2luZ1Rlc3QsIFRlc3REaWZmZXJlbnRJbmRleERpZmZzKSB7CisgIGRvdWJsZSBpbmRleF9kaWZmID0gMC44OTsKKyAgUG9zaXRpb25TZW5zb3JTaW11bGF0b3Igc2ltKGluZGV4X2RpZmYpOworICBzaW0uSW5pdGlhbGl6ZSgzLjUgKiBpbmRleF9kaWZmLCBpbmRleF9kaWZmIC8gMy4wKTsKKyAgWmVyb2luZ0VzdGltYXRvciBlc3RpbWF0b3IoWmVyb2luZ0NvbnN0YW50c3sKKyAgICAgIGtTYW1wbGVTaXplLCBpbmRleF9kaWZmLCAwLjAsIGtJbmRleEVycm9yRnJhY3Rpb259KTsKKworICAvLyBUaGUgemVyb2luZyBjb2RlIGlzIHN1cHBvc2VkIHRvIHBlcmZvcm0gc29tZSBmaWx0ZXJpbmcgb24gdGhlIGRpZmZlcmVuY2UKKyAgLy8gYmV0d2VlbiB0aGUgcG90ZW50aW9tZXRlciB2YWx1ZSBhbmQgdGhlIGVuY29kZXIgdmFsdWUuIFdlIGFzc3VtZSB0aGF0IDMwMAorICAvLyBzYW1wbGVzIGFyZSBzdWZmaWNpZW50IHRvIGhhdmUgdXBkYXRlZCB0aGUgZmlsdGVyLgorICBmb3IgKGludCBpID0gMDsgaSA8IDMwMDsgaSsrKSB7CisgICAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDMuNSAqIGluZGV4X2RpZmYpOworICB9CisgIEFTU0VSVF9ORUFSKDMuNSAqIGluZGV4X2RpZmYsIGVzdGltYXRvci5wb3NpdGlvbigpLAorICAgICAgICAgICAgICBrQWNjZXB0YWJsZVVuemVyb2VkRXJyb3IgKiBpbmRleF9kaWZmKTsKKworICAvLyBXaXRoIGEgc2luZ2xlIGluZGV4IHB1bHNlIHRoZSB6ZXJvaW5nIGVzdGltYXRvciBzaG91bGQgYmUgYWJsZSB0byBsb2NrCisgIC8vIG9udG8gdGhlIHRydWUgdmFsdWUgb2YgdGhlIHBvc2l0aW9uLgorICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgNC4wMSk7CisgIEFTU0VSVF9ORUFSKDQuMDEsIGVzdGltYXRvci5wb3NpdGlvbigpLCAwLjAwMSk7CisKKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDQuOTkpOworICBBU1NFUlRfTkVBUig0Ljk5LCBlc3RpbWF0b3IucG9zaXRpb24oKSwgMC4wMDEpOworCisgIE1vdmVUbygmc2ltLCAmZXN0aW1hdG9yLCAzLjk5KTsKKyAgQVNTRVJUX05FQVIoMy45OSwgZXN0aW1hdG9yLnBvc2l0aW9uKCksIDAuMDAxKTsKKworICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgMy4wMSk7CisgIEFTU0VSVF9ORUFSKDMuMDEsIGVzdGltYXRvci5wb3NpdGlvbigpLCAwLjAwMSk7CisKKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDEzLjU1KTsKKyAgQVNTRVJUX05FQVIoMTMuNTUsIGVzdGltYXRvci5wb3NpdGlvbigpLCAwLjAwMSk7Cit9CisKK1RFU1RfRihaZXJvaW5nVGVzdCwgVGVzdFBlcmNlbnRhZ2UpIHsKKyAgZG91YmxlIGluZGV4X2RpZmYgPSAwLjg5OworICBQb3NpdGlvblNlbnNvclNpbXVsYXRvciBzaW0oaW5kZXhfZGlmZik7CisgIHNpbS5Jbml0aWFsaXplKDMuNSAqIGluZGV4X2RpZmYsIGluZGV4X2RpZmYgLyAzLjApOworICBaZXJvaW5nRXN0aW1hdG9yIGVzdGltYXRvcihaZXJvaW5nQ29uc3RhbnRzeworICAgICAga1NhbXBsZVNpemUsIGluZGV4X2RpZmYsIDAuMCwga0luZGV4RXJyb3JGcmFjdGlvbn0pOworCisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwga1NhbXBsZVNpemUgLyAyOyBpKyspIHsKKyAgICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgMy41ICogaW5kZXhfZGlmZik7CisgIH0KKyAgQVNTRVJUX05FQVIoMC41LCBlc3RpbWF0b3Iub2Zmc2V0X3JhdGlvX3JlYWR5KCksIDAuMDAxKTsKK30KKworVEVTVF9GKFplcm9pbmdUZXN0LCBUZXN0T2Zmc2V0KSB7CisgIGRvdWJsZSBpbmRleF9kaWZmID0gMC44OTsKKyAgUG9zaXRpb25TZW5zb3JTaW11bGF0b3Igc2ltKGluZGV4X2RpZmYpOworICBzaW0uSW5pdGlhbGl6ZSgzLjEgKiBpbmRleF9kaWZmLCBpbmRleF9kaWZmIC8gMy4wKTsKKyAgWmVyb2luZ0VzdGltYXRvciBlc3RpbWF0b3IoWmVyb2luZ0NvbnN0YW50c3sKKyAgICAgIGtTYW1wbGVTaXplLCBpbmRleF9kaWZmLCAwLjAsIGtJbmRleEVycm9yRnJhY3Rpb259KTsKKworICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgMy4xICogaW5kZXhfZGlmZik7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBrU2FtcGxlU2l6ZTsgaSsrKSB7CisgICAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDUuMCAqIGluZGV4X2RpZmYpOworICB9CisKKyAgQVNTRVJUX05FQVIoMy4xICogaW5kZXhfZGlmZiwgZXN0aW1hdG9yLm9mZnNldCgpLCAwLjAwMSk7Cit9CisKK1RFU1RfRihaZXJvaW5nVGVzdCwgV2FpdEZvckluZGV4UHVsc2VBZnRlclJlc2V0KSB7CisgIGRvdWJsZSBpbmRleF9kaWZmID0gMC42OworICBQb3NpdGlvblNlbnNvclNpbXVsYXRvciBzaW0oaW5kZXhfZGlmZik7CisgIHNpbS5Jbml0aWFsaXplKDMuMSAqIGluZGV4X2RpZmYsIGluZGV4X2RpZmYgLyAzLjApOworICBaZXJvaW5nRXN0aW1hdG9yIGVzdGltYXRvcihaZXJvaW5nQ29uc3RhbnRzeworICAgICAga1NhbXBsZVNpemUsIGluZGV4X2RpZmYsIDAuMCwga0luZGV4RXJyb3JGcmFjdGlvbn0pOworCisgIC8vIE1ha2Ugc3VyZSB0byBmaWxsIHVwIHRoZSBhdmVyYWdpbmcgZmlsdGVyIHdpdGggc2FtcGxlcy4KKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBrU2FtcGxlU2l6ZTsgaSsrKSB7CisgICAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDMuMSAqIGluZGV4X2RpZmYpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCB6ZXJvZWQgdW50aWwgd2UgaGl0IGFuIGluZGV4IHB1bHNlLgorICBBU1NFUlRfRkFMU0UoZXN0aW1hdG9yLnplcm9lZCgpKTsKKworICAvLyBUcmlnZ2VyIGFuIGluZGV4IHB1bHNlOyB3ZSBzaG91bGQgbm93IGJlIHplcm9lZC4KKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDQuNSAqIGluZGV4X2RpZmYpOworICBBU1NFUlRfVFJVRShlc3RpbWF0b3IuemVyb2VkKCkpOworCisgIC8vIFJlc2V0IHRoZSB6ZXJvaW5nIGxvZ2ljIGFuZCBzdXBwbHkgYSBidW5jaCBvZiBzYW1wbGVzIHdpdGhpbiB0aGUgY3VycmVudAorICAvLyBpbmRleCBzZWdtZW50LgorICBlc3RpbWF0b3IuUmVzZXQoKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBrU2FtcGxlU2l6ZTsgaSsrKSB7CisgICAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDQuMiAqIGluZGV4X2RpZmYpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCB6ZXJvZWQgdW50aWwgd2UgaGl0IGFuIGluZGV4IHB1bHNlLgorICBBU1NFUlRfRkFMU0UoZXN0aW1hdG9yLnplcm9lZCgpKTsKKworICAvLyBUcmlnZ2VyIGFub3RoZXIgaW5kZXggcHVsc2U7IHdlIHNob3VsZCBiZSB6ZXJvZWQgYWdhaW4uCisgIE1vdmVUbygmc2ltLCAmZXN0aW1hdG9yLCAzLjEgKiBpbmRleF9kaWZmKTsKKyAgQVNTRVJUX1RSVUUoZXN0aW1hdG9yLnplcm9lZCgpKTsKK30KKworVEVTVF9GKFplcm9pbmdUZXN0LCBUZXN0Tm9uWmVyb0luZGV4UHVsc2VPZmZzZXRzKSB7CisgIGNvbnN0IGRvdWJsZSBpbmRleF9kaWZmID0gMC45OworICBjb25zdCBkb3VibGUga25vd25faW5kZXhfcG9zID0gMy41ICogaW5kZXhfZGlmZjsKKyAgUG9zaXRpb25TZW5zb3JTaW11bGF0b3Igc2ltKGluZGV4X2RpZmYpOworICBzaW0uSW5pdGlhbGl6ZSgzLjMgKiBpbmRleF9kaWZmLCBpbmRleF9kaWZmIC8gMy4wLCBrbm93bl9pbmRleF9wb3MpOworICBaZXJvaW5nRXN0aW1hdG9yIGVzdGltYXRvcihaZXJvaW5nQ29uc3RhbnRzeworICAgICAga1NhbXBsZVNpemUsIGluZGV4X2RpZmYsIGtub3duX2luZGV4X3Bvcywga0luZGV4RXJyb3JGcmFjdGlvbn0pOworCisgIC8vIE1ha2Ugc3VyZSB0byBmaWxsIHVwIHRoZSBhdmVyYWdpbmcgZmlsdGVyIHdpdGggc2FtcGxlcy4KKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBrU2FtcGxlU2l6ZTsgaSsrKSB7CisgICAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDMuMyAqIGluZGV4X2RpZmYpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCB6ZXJvZWQgdW50aWwgd2UgaGl0IGFuIGluZGV4IHB1bHNlLgorICBBU1NFUlRfRkFMU0UoZXN0aW1hdG9yLnplcm9lZCgpKTsKKworICAvLyBUcmlnZ2VyIGFuIGluZGV4IHB1bHNlOyB3ZSBzaG91bGQgbm93IGJlIHplcm9lZC4KKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDMuNyAqIGluZGV4X2RpZmYpOworICBBU1NFUlRfVFJVRShlc3RpbWF0b3IuemVyb2VkKCkpOworICBBU1NFUlRfRE9VQkxFX0VRKDMuMyAqIGluZGV4X2RpZmYsIGVzdGltYXRvci5vZmZzZXQoKSk7CisgIEFTU0VSVF9ET1VCTEVfRVEoMy43ICogaW5kZXhfZGlmZiwgZXN0aW1hdG9yLnBvc2l0aW9uKCkpOworCisgIC8vIFRyaWdnZXIgb25lIG1vcmUgaW5kZXggcHVsc2UgYW5kIGNoZWNrIHRoZSBvZmZzZXQuCisgIE1vdmVUbygmc2ltLCAmZXN0aW1hdG9yLCA0LjcgKiBpbmRleF9kaWZmKTsKKyAgQVNTRVJUX0RPVUJMRV9FUSgzLjMgKiBpbmRleF9kaWZmLCBlc3RpbWF0b3Iub2Zmc2V0KCkpOworICBBU1NFUlRfRE9VQkxFX0VRKDQuNyAqIGluZGV4X2RpZmYsIGVzdGltYXRvci5wb3NpdGlvbigpKTsKK30KKworVEVTVF9GKFplcm9pbmdUZXN0LCBCYXNpY0Vycm9yQVBJVGVzdCkgeworICBjb25zdCBkb3VibGUgaW5kZXhfZGlmZiA9IDEuMDsKKyAgWmVyb2luZ0VzdGltYXRvciBlc3RpbWF0b3IoWmVyb2luZ0NvbnN0YW50c3sKKyAgICAgIGtTYW1wbGVTaXplLCBpbmRleF9kaWZmLCAwLjAsIGtJbmRleEVycm9yRnJhY3Rpb259KTsKKyAgUG9zaXRpb25TZW5zb3JTaW11bGF0b3Igc2ltKGluZGV4X2RpZmYpOworICBzaW0uSW5pdGlhbGl6ZSgxLjUgKiBpbmRleF9kaWZmLCBpbmRleF9kaWZmIC8gMy4wLCAwLjApOworCisgIC8vIFBlcmZvcm0gYSBzaW1wbGUgbW92ZSBhbmQgbWFrZSBzdXJlIHRoYXQgbm8gZXJyb3Igb2NjdXJlZC4KKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDMuNSAqIGluZGV4X2RpZmYpOworICBBU1NFUlRfRkFMU0UoZXN0aW1hdG9yLmVycm9yKCkpOworCisgIC8vIFRyaWdnZXIgYW4gZXJyb3IgYW5kIG1ha2Ugc3VyZSBpdCdzIHJlcG9ydGVkLgorICBlc3RpbWF0b3IuVHJpZ2dlckVycm9yKCk7CisgIEFTU0VSVF9UUlVFKGVzdGltYXRvci5lcnJvcigpKTsKKworICAvLyBNYWtlIHN1cmUgdGhhdCBpdCBjYW4gcmVjb3ZlciBhZnRlciBhIHJlc2V0LgorICBlc3RpbWF0b3IuUmVzZXQoKTsKKyAgQVNTRVJUX0ZBTFNFKGVzdGltYXRvci5lcnJvcigpKTsKKyAgTW92ZVRvKCZzaW0sICZlc3RpbWF0b3IsIDQuNSAqIGluZGV4X2RpZmYpOworICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgNS41ICogaW5kZXhfZGlmZik7CisgIEFTU0VSVF9GQUxTRShlc3RpbWF0b3IuZXJyb3IoKSk7Cit9CisKKy8vIEkgd2FudCB0byB0ZXN0IHRoYXQgdGhlIHRoZSB6ZXJvaW5nIGNsYXNzIGNhbgorLy8gZGV0ZWN0IGFuIGVycm9yIHdoZW4gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uCisvLyBjaGFuZ2VzIHRvbyBtdWNoLiBJIGRvIHNvIGJ5IGNyZWF0aW5nIHRoZQorLy8gc2ltdWxhdG9yIGF0IGFuICdYJyBwb3NpdG9uLCBtYWtpbmcgc3VyZQorLy8gdGhhdCB0aGUgZXN0aW1hdG9yIGlzIHplcm9lZCwgYW5kIHRoZW4KKy8vIGluaXRpYWxpemluZyB0aGUgc2ltdWxhdG9yIGF0IGFub3RoZXIKKy8vIHBvc2l0aW9uLiBBZnRlciBtYWtpbmcgc3VyZSBpdCdzIHplcm9lZCwKKy8vIGlmIHRoZSBlcnJvcigpIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwKKy8vIHRoZW4sIGl0IHdvcmtzLgorVEVTVF9GKFplcm9pbmdUZXN0LCBUZXN0T2Zmc2V0RXJyb3IpIHsKKyAgY29uc3QgZG91YmxlIGluZGV4X2RpZmYgPSAwLjg7CisgIGNvbnN0IGRvdWJsZSBrbm93bl9pbmRleF9wb3MgPSAyICogaW5kZXhfZGlmZjsKKyAgaW50IHNhbXBsZV9zaXplID0gMzA7CisgIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yIHNpbShpbmRleF9kaWZmKTsKKyAgc2ltLkluaXRpYWxpemUoMTAgKiBpbmRleF9kaWZmLCBpbmRleF9kaWZmIC8gMy4wLCBrbm93bl9pbmRleF9wb3MpOworICBaZXJvaW5nRXN0aW1hdG9yIGVzdGltYXRvcihaZXJvaW5nQ29uc3RhbnRzeworICAgICAgc2FtcGxlX3NpemUsIGluZGV4X2RpZmYsIGtub3duX2luZGV4X3Bvcywga0luZGV4RXJyb3JGcmFjdGlvbn0pOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlX3NpemU7IGkrKykgeworICAgIE1vdmVUbygmc2ltLCAmZXN0aW1hdG9yLCAxMyAqIGluZGV4X2RpZmYpOworICB9CisgIE1vdmVUbygmc2ltLCAmZXN0aW1hdG9yLCA4ICogaW5kZXhfZGlmZik7CisKKyAgQVNTRVJUX1RSVUUoZXN0aW1hdG9yLnplcm9lZCgpKTsKKyAgQVNTRVJUX0ZBTFNFKGVzdGltYXRvci5lcnJvcigpKTsKKyAgc2ltLkluaXRpYWxpemUoOS4wICogaW5kZXhfZGlmZiArIDAuMzEgKiBpbmRleF9kaWZmLCBpbmRleF9kaWZmIC8gMy4wLAorICAgICAgICAgICAgICAgICBrbm93bl9pbmRleF9wb3MpOworICBNb3ZlVG8oJnNpbSwgJmVzdGltYXRvciwgOSAqIGluZGV4X2RpZmYpOworICBBU1NFUlRfVFJVRShlc3RpbWF0b3IuemVyb2VkKCkpOworICBBU1NFUlRfVFJVRShlc3RpbWF0b3IuZXJyb3IoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB6ZXJvaW5nCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS9vdXRwdXQvLmdpdGlnbm9yZSBiL291dHB1dC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzViMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vdXRwdXQvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE2IEBACisvcHJpbWUvCisvY3Jpby8KKy9mbGFzaGVyLworL2NvbXBpbGVkLSovCisvaXBfYWRkcmVzcy50eHQKKy9jY2FjaGVfZGlyLworCisvY3Jpby8KKy9jcmlvLWRlYnVnLworCisvYXJtX2ZyYy1bXi1dKi1bXi1dKi8KKy9hcm1fZnJjLVteLV0qLWRlYnVnLVteLV0qLworL2FtZDY0LVteLV0qLVteLV0qLworL2FtZDY0LVteLV0qLWRlYnVnLVteLV0qLworL2JvdDMtW14tXSotW14tXSotW14tXSovCisvYm90My1bXi1dKi1bXi1dKi1kZWJ1Zy1bXi1dKi8KZGlmZiAtLWdpdCBhL291dHB1dC9kb3dubG9hZGVkLy5naXRpZ25vcmUgYi9vdXRwdXQvZG93bmxvYWRlZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWI1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vdXRwdXQvZG93bmxvYWRlZC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjEgQEAKKy9jdGVtcGxhdGUtMTI5LnRhci5negorL2N0ZW1wbGF0ZS0xMjkvCisvZWlnZW4tMy4yLjEudGFyLmJ6MgorL2VpZ2VuLTMuMi4xLworL2d0ZXN0LTEuNi4wLXAyLworL2d0ZXN0LTEuNi4wLnppcAorL2d5cC0xNzM4LworL2pwZWctOGQvCisvanBlZ3NyYy52OGQudGFyLmd6CisvbGlianBlZy8KKy9uaW5qYS12MS40LjAvCisvZ2ZsYWdzLTIuMC50YXIuZ3oKKy9nZmxhZ3MtMi4wLworL2xpYmV2ZW50LTIuMC4yMS50YXIuZ3oKKy9saWJldmVudC0yLjAuMjEvCisvbGliY2RkLTA5NGcudGFyLmd6CisvbGliY2RkLTA5NGcvCisvZ21wLTUuMS4zLnRhci5segorL2dwZXJmdG9vbHMtMi4zLnRhci5negorL2xpYnVud2luZC0xLjEudGFyLmd6Cisvc2Vhc29ja3MtMS4xLjItcDEvCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3MvLmdpdGF0dHJpYnV0ZXMgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmZTljMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy8uZ2l0YXR0cmlidXRlcwpAQCAtMCwwICsxLDMgQEAKKyMgdHJlYXQgYWxsIGZpbGVzIGluIHRoaXMgcmVwb3NpdG9yeSBhcyB0ZXh0IGZpbGVzCisjIGFuZCBub3JtYWxpemUgdGhlbSB0byBMRiBsaW5lIGVuZGluZ3Mgd2hlbiBjb21taXR0ZWQKKyogdGV4dApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzLy5naXRpZ25vcmUgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjgxNTIyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxNyBAQAorL3hjb2RlLworL2J1aWxkLworL2J1aWxkLSovCisuRFNfU3RvcmUKK0NNYWtlQ2FjaGUudHh0CitEYXJ0Q29uZmlndXJhdGlvbi50Y2wKK01ha2VmaWxlCitDTWFrZUZpbGVzLworL1Rlc3RpbmcvCisvaW5jbHVkZS9nZmxhZ3MvY29uZmlnLmgKKy9pbmNsdWRlL2dmbGFncy9nZmxhZ3NfY29tcGxldGlvbnMuaAorL2luY2x1ZGUvZ2ZsYWdzL2dmbGFnc19kZWNsYXJlLmgKKy9pbmNsdWRlL2dmbGFncy9nZmxhZ3MuaAorL2xpYi8KKy90ZXN0L2dmbGFnc191bml0dGVzdF9tYWluLmNjCisvdGVzdC9nZmxhZ3NfdW5pdHRlc3QtbWFpbi5jYworL3BhY2thZ2VzLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzLy5naXRtb2R1bGVzIGIvdGhpcmRfcGFydHkvZ2ZsYWdzLy5naXRtb2R1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMjA3MmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvLmdpdG1vZHVsZXMKQEAgLTAsMCArMSw0IEBACitbc3VibW9kdWxlICJkb2MiXQorCXBhdGggPSBkb2MKKwl1cmwgPSBodHRwczovL2dpdGh1Yi5jb20vZ2ZsYWdzL2dmbGFncy5naXQKKwlicmFuY2ggPSBnaC1wYWdlcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL0FVVEhPUlMudHh0IGIvdGhpcmRfcGFydHkvZ2ZsYWdzL0FVVEhPUlMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzkxOGIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvQVVUSE9SUy50eHQKQEAgLTAsMCArMSwyIEBACitnb29nbGUtZ2ZsYWdzQGdvb2dsZWdyb3Vwcy5jb20KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvZ2ZsYWdzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmJjZTMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1MTAgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQgKFZFUlNJT04gMi44LjEyIEZBVEFMX0VSUk9SKQorCitpZiAoUE9MSUNZIENNUDAwNDIpCisgIGNtYWtlX3BvbGljeSAoU0VUIENNUDAwNDIgTkVXKQorZW5kaWYgKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGluY2x1ZGVzCitzZXQgKENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UiKQoraW5jbHVkZSAodXRpbHMpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBwYWNrYWdlIGluZm9ybWF0aW9uCitzZXQgKFBBQ0tBR0VfTkFNRSAgICAgICJnZmxhZ3MiKQorc2V0IChQQUNLQUdFX1ZFUlNJT04gICAiMi4yLjAiKQorc2V0IChQQUNLQUdFX1NUUklORyAgICAiJHtQQUNLQUdFX05BTUV9ICR7UEFDS0FHRV9WRVJTSU9OfSIpCitzZXQgKFBBQ0tBR0VfVEFSTkFNRSAgICIke1BBQ0tBR0VfTkFNRX0tJHtQQUNLQUdFX1ZFUlNJT059IikKK3NldCAoUEFDS0FHRV9CVUdSRVBPUlQgImh0dHBzOi8vZ2l0aHViLmNvbS9zY2h1aHNjaHVoL2dmbGFncy9pc3N1ZXMiKQorCitwcm9qZWN0ICgke1BBQ0tBR0VfTkFNRX0gQ1hYKQoraWYgKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDEwMCkKKyAgIyBDIGxhbmd1YWdlIHN0aWxsIG5lZWRlZCBiZWNhdXNlIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgQ01ha2UgbW9kdWxlcworICAjIChvciB0aGVpciBkZXBlbmRlbmNpZXMsIHJlc3BlY3RpdmVseSkgYXJlIG5vdCBjb3JyZWN0bHkgaGFuZGxpbmcKKyAgIyB0aGUgY2FzZSB3aGVyZSBvbmx5IENYWCBpcyBlbmFibGVkLgorICAjIC0gQ2hlY2tUeXBlU2l6ZS5jbWFrZSAoZml4ZWQgaW4gQ01ha2UgMy4xLCBjZi4gaHR0cDovL3d3dy5jbWFrZS5vcmcvQnVnL3ZpZXcucGhwP2lkPTE0MDU2KQorICAjIC0gRmluZFRocmVhZHMuY21ha2UgKC0tPiBDaGVja0luY2x1ZGVGaWxlcy5jbWFrZSA8LS0pCisgIGVuYWJsZV9sYW5ndWFnZSAoQykKK2VuZGlmICgpCisKK3ZlcnNpb25fbnVtYmVycyAoCisgICR7UEFDS0FHRV9WRVJTSU9OfQorICAgIFBBQ0tBR0VfVkVSU0lPTl9NQUpPUgorICAgIFBBQ0tBR0VfVkVSU0lPTl9NSU5PUgorICAgIFBBQ0tBR0VfVkVSU0lPTl9QQVRDSAorKQorCitzZXQgKFBBQ0tBR0VfU09WRVJTSU9OICIke1BBQ0tBR0VfVkVSU0lPTl9NQUpPUn0iKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgb3B0aW9ucworaWYgKE5PVCBHRkxBR1NfTkFNRVNQQUNFKQorICAjIG1haW50YWluIGJpbmFyeSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGdmbGFncyBsaWJyYXJ5IHZlcnNpb24gPD0gMi4wLAorICAjIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIGVuYWJsZSB0aGUgdXNlIG9mIHRoZSBwcmVmZXJyZWQgbmV3ICJnZmxhZ3MiIG5hbWVzcGFjZQorICBzZXQgKEdGTEFHU19OQU1FU1BBQ0UgImdvb2dsZTske1BBQ0tBR0VfTkFNRX0iIENBQ0hFIFNUUklORyAiTmFtZShzKSBvZiBsaWJyYXJ5IG5hbWVzcGFjZSAoc2VwYXJhdGUgbXVsdGlwbGUgb3B0aW9ucyBieSBzZW1pY29sb24pIikKKyAgbWFya19hc19hZHZhbmNlZCAoR0ZMQUdTX05BTUVTUEFDRSkKK2VuZGlmICgpCitzZXQgKEdGTEFHU19OQU1FU1BBQ0VfU0VDT05EQVJZICIke0dGTEFHU19OQU1FU1BBQ0V9IikKK2xpc3QgKFJFTU9WRV9EVVBMSUNBVEVTIEdGTEFHU19OQU1FU1BBQ0VfU0VDT05EQVJZKQoraWYgKE5PVCBHRkxBR1NfTkFNRVNQQUNFX1NFQ09OREFSWSkKKyAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIkdGTEFHU19OQU1FU1BBQ0UgbXVzdCBiZSBzZXQgdG8gb25lIChvciBtb3JlKSB2YWxpZCBDKysgbmFtZXNwYWNlIGlkZW50aWZpZXIocyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9uIFwiO1wiKS4iKQorZW5kaWYgKCkKK2ZvcmVhY2ggKG5zIElOIExJU1RTIEdGTEFHU19OQU1FU1BBQ0VfU0VDT05EQVJZKQorICBpZiAoTk9UIG5zIE1BVENIRVMgIl5bYS16QS1aXVthLXpBLVowLTlfXSokIikKKyAgICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiR0ZMQUdTX05BTUVTUEFDRSBjb250YWlucyBpbnZhbGlkIG5hbWVzcGFjZSBpZGVudGlmaWVyOiAke25zfSIpCisgIGVuZGlmICgpCitlbmRmb3JlYWNoICgpCitsaXN0IChHRVQgICAgICAgR0ZMQUdTX05BTUVTUEFDRV9TRUNPTkRBUlkgMCBHRkxBR1NfTkFNRVNQQUNFKQorbGlzdCAoUkVNT1ZFX0FUIEdGTEFHU19OQU1FU1BBQ0VfU0VDT05EQVJZIDApCisKK29wdGlvbiAoQlVJTERfU0hBUkVEX0xJQlMgICAgICAgICAgIlJlcXVlc3QgYnVpbGQgb2Ygc2hhcmVkIGxpYnJhcmllcy4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGKQorb3B0aW9uIChCVUlMRF9TVEFUSUNfTElCUyAgICAgICAgICAiUmVxdWVzdCBidWlsZCBvZiBzdGF0aWMgbGlicmFyaWVzIChkZWZhdWx0IGlmIEJVSUxEX1NIQVJFRF9MSUJTIGlzIE9GRikuIiBPRkYpCitvcHRpb24gKEJVSUxEX2dmbGFnc19MSUIgICAgICAgICAgICJSZXF1ZXN0IGJ1aWxkIG9mIHRoZSBtdWx0aS10aHJlYWRlZCBnZmxhZ3MgbGlicmFyeS4iICAgICAgICAgICAgICAgICAgICAgIE9OKQorb3B0aW9uIChCVUlMRF9nZmxhZ3Nfbm90aHJlYWRzX0xJQiAiUmVxdWVzdCBidWlsZCBvZiB0aGUgc2luZ2xlLXRocmVhZGVkIGdmbGFncyBsaWJyYXJ5LiIgICAgICAgICAgICAgICAgICAgICBPTikKK29wdGlvbiAoQlVJTERfUEFDS0FHSU5HICAgICAgICAgICAgIkVuYWJsZSBidWlsZCBvZiBkaXN0cmlidXRpb24gcGFja2FnZXMgdXNpbmcgQ1BhY2suIiAgICAgICAgICAgICAgICAgICAgICAgT0ZGKQorb3B0aW9uIChCVUlMRF9URVNUSU5HICAgICAgICAgICAgICAiRW5hYmxlIGJ1aWxkIG9mIHRoZSB1bml0IHRlc3RzIGFuZCB0aGVpciBleGVjdXRpb24gdXNpbmcgQ1Rlc3QuIiAgICAgICAgICBPRkYpCitvcHRpb24gKElOU1RBTExfSEVBREVSUyAgICAgICAgICAgICJSZXF1ZXN0IHBhY2thZ2luZyBvZiBoZWFkZXJzIGFuZCBvdGhlciBkZXZlbG9wbWVudCBmaWxlcy4iICAgICAgICAgICAgICAgIE9OKQorCittYXJrX2FzX2FkdmFuY2VkIChDTEVBUiBDTUFLRV9JTlNUQUxMX1BSRUZJWCkKK21hcmtfYXNfYWR2YW5jZWQgKENNQUtFX0NPTkZJR1VSQVRJT05fVFlQRVMKKyAgICAgICAgICAgICAgICAgIEJVSUxEX1NUQVRJQ19MSUJTCisgICAgICAgICAgICAgICAgICBJTlNUQUxMX0hFQURFUlMpCitpZiAoQVBQTEUpCisgIG1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMKKyAgICAgICAgICAgICAgICAgICBDTUFLRV9PU1hfREVQTE9ZTUVOVF9UQVJHRVQKKyAgICAgICAgICAgICAgICAgICBDTUFLRV9PU1hfU1lTUk9PVCkKK2VuZGlmICgpCisKK2lmIChOT1QgQlVJTERfU0hBUkVEX0xJQlMgQU5EIE5PVCBCVUlMRF9TVEFUSUNfTElCUykKKyAgc2V0IChCVUlMRF9TVEFUSUNfTElCUyBPTikKK2VuZGlmICgpCitpZiAoTk9UIEJVSUxEX2dmbGFnc19MSUIgQU5EIE5PVCBCVUlMRF9nZmxhZ3Nfbm90aHJlYWRzX0xJQikKKyBtZXNzYWdlIChGQVRBTF9FUlJPUiAiQXQgbGVhc3Qgb25lIG9mIEJVSUxEX2dmbGFnc19MSUIgYW5kIEJVSUxEX2dmbGFnc19ub3RocmVhZHNfTElCIG11c3QgYmUgT04uIikKK2VuZGlmICgpCisKK2lmIChOT1QgQ01BS0VfQlVJTERfVFlQRSBBTkQgTk9UIENNQUtFX0NYWF9GTEFHUykKKyAgc2V0X3Byb3BlcnR5IChDQUNIRSBDTUFLRV9CVUlMRF9UWVBFIFBST1BFUlRZIFZBTFVFIFJlbGVhc2UpCitlbmRpZiAoKQorCitpZiAoTk9UIEdGTEFHU19JTkNMVURFX0RJUikKKyAgc2V0IChHRkxBR1NfSU5DTFVERV9ESVIgIiR7UEFDS0FHRV9OQU1FfSIgQ0FDSEUgU1RSSU5HICJOYW1lIG9mIGluY2x1ZGUgZGlyZWN0b3J5IG9mIGluc3RhbGxlZCBoZWFkZXIgZmlsZXMiKQorICBtYXJrX2FzX2FkdmFuY2VkIChHRkxBR1NfSU5DTFVERV9ESVIpCitlbHNlICgpCisgIGlmIChJU19BQlNPTFVURSBHRkxBR1NfSU5DTFVERV9ESVIpCisgICAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIkdGTEFHU19JTkNMVURFX0RJUiBtdXN0IGJlIGEgcGF0aCByZWxhdGl2ZSB0byBDTUFLRV9JTlNUQUxMX1BSRUZJWC9pbmNsdWRlIikKKyAgZW5kaWYgKCkKKyAgaWYgKEdGTEFHU19JTkNMVURFX0RJUiBNQVRDSEVTICJeXFwuXFwuWy9cXF0iKQorICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJHRkxBR1NfSU5DTFVERV9ESVIgbXVzdCBub3Qgc3RhcnQgd2l0aCBwYXJlbnQgZGlyZWN0b3J5IHJlZmVyZW5jZSAoLi4vKSIpCisgIGVuZGlmICgpCitlbmRpZiAoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc3lzdGVtIGNoZWNrcworaW5jbHVkZSAoQ2hlY2tUeXBlU2l6ZSkKK2luY2x1ZGUgKENoZWNrSW5jbHVkZUZpbGVDWFgpCitpbmNsdWRlIChDaGVja0NYWFN5bWJvbEV4aXN0cykKKworaWYgKFdJTjMyIEFORCBOT1QgQ1lHV0lOKQorICBzZXQgKE9TX1dJTkRPV1MgMSkKK2Vsc2UgKCkKKyAgc2V0IChPU19XSU5ET1dTIDApCitlbmRpZiAoKQorCitpZiAoTVNWQykKKyAgc2V0IChIQVZFX1NZU19UWVBFU19IIDEpCisgIHNldCAoSEFWRV9TVERJTlRfSCAgICAxKQorICBzZXQgKEhBVkVfU1REREVGX0ggICAgMSkgIyB1c2VkIGJ5IENoZWNrVHlwZVNpemUgbW9kdWxlCisgIHNldCAoSEFWRV9JTlRUWVBFU19IICAwKQorICBzZXQgKEhBVkVfVU5JU1REX0ggICAgMCkKKyAgc2V0IChIQVZFX1NZU19TVEFUX0ggIDEpCisgIHNldCAoSEFWRV9TSExXQVBJX0ggICAxKQorZWxzZSAoKQorICBmb3JlYWNoIChmbmFtZSBJTiBJVEVNUyB1bmlzdGQgc3RkaW50IGludHR5cGVzIHN5cy90eXBlcyBzeXMvc3RhdCBmbm1hdGNoKQorICAgIHN0cmluZyAoVE9VUFBFUiAiJHtmbmFtZX0iIEZOQU1FKQorICAgIHN0cmluZyAoUkVQTEFDRSAiLyIgIl8iIEZOQU1FICIke0ZOQU1FfSIpCisgICAgaWYgKE5PVCBIQVZFXyR7Rk5BTUV9X0gpCisgICAgICBjaGVja19pbmNsdWRlX2ZpbGVfY3h4ICgiJHtmbmFtZX0uaCIgSEFWRV8ke0ZOQU1FfV9IKQorICAgIGVuZGlmICgpCisgIGVuZGZvcmVhY2ggKCkKKyAgIyB0aGUgZm9sbG93aW5nIGFyZSB1c2VkIGluICNpZiBkaXJlY3RpdmVzIG5vdCAjaWZkZWYKKyAgYm9vbF90b19pbnQgKEhBVkVfU1RESU5UX0gpCisgIGJvb2xfdG9faW50IChIQVZFX1NZU19UWVBFU19IKQorICBib29sX3RvX2ludCAoSEFWRV9JTlRUWVBFU19IKQorICBpZiAoTk9UIEhBVkVfRk5NQVRDSF9IIEFORCBPU19XSU5ET1dTKQorICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jeHggKCJzaGx3YXBpLmgiIEhBVkVfU0hMV0FQSV9IKQorICBlbmRpZiAoKQorZW5kaWYgKCkKKworc2V0IChHRkxBR1NfSU5UVFlQRVNfRk9STUFUICIiIENBQ0hFIFNUUklORyAiRm9ybWF0IG9mIGludGVnZXIgdHlwZXM6IFwiQzk5XCIgKHVpbnQzMl90KSwgXCJCU0RcIiAodV9pbnQzMl90KSwgXCJWQzdcIiAoX19pbnQzMikiKQorc2V0X3Byb3BlcnR5IChDQUNIRSBHRkxBR1NfSU5UVFlQRVNfRk9STUFUIFBST1BFUlRZIFNUUklOR1MgIkM5OTtCU0Q7VkM3IikKK21hcmtfYXNfYWR2YW5jZWQgKEdGTEFHU19JTlRUWVBFU19GT1JNQVQpCitpZiAoTk9UIEdGTEFHU19JTlRUWVBFU19GT1JNQVQpCisgIHNldCAoVFlQRVMgdWludDMyX3QgdV9pbnQzMl90KQorICBpZiAoTVNWQykKKyAgICBsaXN0IChJTlNFUlQgVFlQRVMgMCBfX2ludDMyKQorICBlbmRpZiAoKQorICBmb3JlYWNoICh0eXBlIElOIExJU1RTIFRZUEVTKQorICAgIGNoZWNrX3R5cGVfc2l6ZSAoJHt0eXBlfSAke3R5cGV9IExBTkdVQUdFIENYWCkKKyAgICBpZiAoSEFWRV8ke3R5cGV9KQorICAgICAgYnJlYWsgKCkKKyAgICBlbmRpZiAoKQorICBlbmRmb3JlYWNoICgpCisgIGlmIChIQVZFX3VpbnQzMl90KQorICAgIHNldF9wcm9wZXJ0eSAoQ0FDSEUgR0ZMQUdTX0lOVFRZUEVTX0ZPUk1BVCBQUk9QRVJUWSBWQUxVRSBDOTkpCisgIGVsc2VpZiAoSEFWRV91X2ludDMyX3QpCisgICAgc2V0X3Byb3BlcnR5IChDQUNIRSBHRkxBR1NfSU5UVFlQRVNfRk9STUFUIFBST1BFUlRZIFZBTFVFIEJTRCkKKyAgZWxzZWlmIChIQVZFX19faW50MzIpCisgICAgc2V0X3Byb3BlcnR5IChDQUNIRSBHRkxBR1NfSU5UVFlQRVNfRk9STUFUIFBST1BFUlRZIFZBTFVFIFZDNykKKyAgZWxzZSAoKQorICAgIG1hcmtfYXNfYWR2YW5jZWQgKENMRUFSIEdGTEFHU19JTlRUWVBFU19GT1JNQVQpCisgICAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIkRvIG5vdCBrbm93IGhvdyB0byBkZWZpbmUgYSAzMi1iaXQgaW50ZWdlciBxdWFudGl0eSBvbiB5b3VyIHN5c3RlbSEiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBOZWl0aGVyIHVpbnQzMl90LCB1X2ludDMyX3QsIG5vciBfX2ludDMyIHNlZW0gdG8gYmUgYXZhaWxhYmxlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIFNldCBHRkxBR1NfSU5UVFlQRVNfRk9STUFUIHRvIGVpdGhlciBDOTksIEJTRCwgb3IgVkM3IGFuZCB0cnkgYWdhaW4uIikKKyAgZW5kaWYgKCkKK2VuZGlmICgpCisjIHVzZSBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyB0byBjaXJjdW12ZW50IGJ1ZyAjMDAwODIyNgoraWYgKCJeJHtHRkxBR1NfSU5UVFlQRVNfRk9STUFUfSQiIFNUUkVRVUFMICJeV0lOJCIpCisgIHNldF9wcm9wZXJ0eSAoQ0FDSEUgR0ZMQUdTX0lOVFRZUEVTX0ZPUk1BVCBQUk9QRVJUWSBWQUxVRSBWQzcpCitlbmRpZiAoKQoraWYgKE5PVCBHRkxBR1NfSU5UVFlQRVNfRk9STUFUIE1BVENIRVMgIl4oQzk5fEJTRHxWQzcpJCIpCisgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJJbnZhbGlkIHZhbHVlIGZvciBHRkxBR1NfSU5UVFlQRVNfRk9STUFUISBDaG9vc2Ugb25lIG9mIFwiQzk5XCIsIFwiQlNEXCIsIG9yIFwiVkM3XCIiKQorZW5kaWYgKCkKK3NldCAoR0ZMQUdTX0lOVFRZUEVTX0ZPUk1BVF9DOTkgMCkKK3NldCAoR0ZMQUdTX0lOVFRZUEVTX0ZPUk1BVF9CU0QgMCkKK3NldCAoR0ZMQUdTX0lOVFRZUEVTX0ZPUk1BVF9WQzcgMCkKK3NldCAoIkdGTEFHU19JTlRUWVBFU19GT1JNQVRfJHtHRkxBR1NfSU5UVFlQRVNfRk9STUFUfSIgMSkKKworaWYgKE1TVkMpCisgIHNldCAoSEFWRV9zdHJ0b2xsIDApCisgIHNldCAoSEFWRV9zdHJ0b3EgIDApCitlbHNlICgpCisgIGNoZWNrX2N4eF9zeW1ib2xfZXhpc3RzIChzdHJ0b2xsIHN0ZGxpYi5oIEhBVkVfU1RSVE9MTCkKKyAgaWYgKE5PVCBIQVZFX1NUUlRPTEwpCisgICAgY2hlY2tfY3h4X3N5bWJvbF9leGlzdHMgKHN0cnRvcSBzdGRsaWIuaCBIQVZFX1NUUlRPUSkKKyAgZW5kaWYgKCkKK2VuZGlmICgpCisKK3NldCAoQ01BS0VfVEhSRUFEX1BSRUZFUl9QVEhSRUFEIFRSVUUpCitmaW5kX3BhY2thZ2UgKFRocmVhZHMpCitpZiAoVGhyZWFkc19GT1VORCBBTkQgQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCisgIHNldCAoSEFWRV9QVEhSRUFEIDEpCisgIGNoZWNrX3R5cGVfc2l6ZSAocHRocmVhZF9yd2xvY2tfdCBSV0xPQ0sgTEFOR1VBR0UgQ1hYKQorZWxzZSAoKQorICBzZXQgKEhBVkVfUFRIUkVBRCAwKQorZW5kaWYgKCkKKworaWYgKFVOSVggQU5EIE5PVCBIQVZFX1BUSFJFQUQgQU5EIEJVSUxEX2dmbGFnc19MSUIpCisgIGlmIChDTUFLRV9IQVZFX1BUSFJFQURfSCkKKyAgICBzZXQgKHdoYXQgImxpYnJhcnkiKQorICBlbHNlICgpCisgICAgc2V0ICh3aGF0ICIuaCBmaWxlIikKKyAgZW5kaWYgKCkKKyAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIkNvdWxkIG5vdCBmaW5kIHB0aHJlYWQke3doYXR9LiBDaGVjayB0aGUgbG9nIGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAgICJcblx0JHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZyIKKyAgICAgICAgICAgICAgICAgICAgICAgIlxub3IgZGlzYWJsZSB0aGUgYnVpbGQgb2YgdGhlIG11bHRpLXRocmVhZGVkIGdmbGFncyBsaWJyYXJ5IChCVUlMRF9nZmxhZ3NfTElCPU9GRikuIikKK2VuZGlmICgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzb3VyY2UgZmlsZXMgLSBleGNsdWRpbmcgcm9vdCBzdWJkaXJlY3RvcnkgYW5kL29yIC5pbiBzdWZmaXgKK3NldCAoUFVCTElDX0hEUlMKKyAgImdmbGFncy5oIgorICAiZ2ZsYWdzX2RlY2xhcmUuaCIKKyAgImdmbGFnc19jb21wbGV0aW9ucy5oIgorKQorCitpZiAoR0ZMQUdTX05BTUVTUEFDRV9TRUNPTkRBUlkpCisgIHNldCAoSU5DTFVERV9HRkxBR1NfTlNfSCAiLy8gSW1wb3J0IGdmbGFncyBsaWJyYXJ5IHN5bWJvbHMgaW50byBhbHRlcm5hdGl2ZS9kZXByZWNhdGVkIG5hbWVzcGFjZShzKSIpCisgIGZvcmVhY2ggKG5zIElOIExJU1RTIEdGTEFHU19OQU1FU1BBQ0VfU0VDT05EQVJZKQorICAgIHN0cmluZyAoVE9VUFBFUiAiJHtuc30iIE5TKQorICAgIHNldCAoZ2ZsYWdzX25zX2ggIiR7UFJPSkVDVF9CSU5BUllfRElSfS9pbmNsdWRlLyR7R0ZMQUdTX0lOQ0xVREVfRElSfS9nZmxhZ3NfJHtuc30uaCIpCisgICAgY29uZmlndXJlX2ZpbGUgKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vc3JjL2dmbGFnc19ucy5oLmluIiAiJHtnZmxhZ3NfbnNfaH0iIEBPTkxZKQorICAgIGxpc3QgKEFQUEVORCBQVUJMSUNfSERSUyAiJHtnZmxhZ3NfbnNfaH0iKQorICAgIHNldCAoSU5DTFVERV9HRkxBR1NfTlNfSCAiJHtJTkNMVURFX0dGTEFHU19OU19IfVxuI2luY2x1ZGUgXCJnZmxhZ3NfJHtuc30uaFwiIikKKyAgZW5kZm9yZWFjaCAoKQorZWxzZSAoKQorICBzZXQgKElOQ0xVREVfR0ZMQUdTX05TX0gpCitlbmRpZiAoKQorCitzZXQgKFBSSVZBVEVfSERSUworICAiY29uZmlnLmgiCisgICJ1dGlsLmgiCisgICJtdXRleC5oIgorKQorCitzZXQgKEdGTEFHU19TUkNTCisgICJnZmxhZ3MuY2MiCisgICJnZmxhZ3NfcmVwb3J0aW5nLmNjIgorICAiZ2ZsYWdzX2NvbXBsZXRpb25zLmNjIgorKQorCitpZiAoT1NfV0lORE9XUykKKyAgbGlzdCAoQVBQRU5EIFBSSVZBVEVfSERSUyAid2luZG93c19wb3J0LmgiKQorICBsaXN0IChBUFBFTkQgR0ZMQUdTX1NSQ1MgICJ3aW5kb3dzX3BvcnQuY2MiKQorZW5kaWYgKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyZSBzb3VyY2UgZmlsZXMKK2lmIChDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisgIHNldCAoR0ZMQUdTX0FUVFJJQlVURV9VTlVTRUQgIl9fYXR0cmlidXRlKCh1bnVzZWQpKSIpCitlbHNlICgpCisgIHNldCAoR0ZMQUdTX0FUVFJJQlVURV9VTlVTRUQpCitlbmRpZiAoKQorCisjIHdoZW5ldmVyIHdlIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgKERMTCBvbiBXaW5kb3dzKSwgY29uZmlndXJlIHRoZSBwdWJsaWMKKyMgaGVhZGVycyBvZiB0aGUgQVBJIGZvciB1c2Ugb2YgdGhpcyBsaWJyYXJ5IHJhdGhlciB0aGFuIHRoZSBvcHRpb25hbGx5CisjIGFsc28gYnVpbGQgc3RhdGljYWxseSBsaW5rZWQgbGlicmFyeTsgdXNlcnMgY2FuIG92ZXJyaWRlIEdGTEFHU19ETExfREVDTAoraWYgKEJVSUxEX1NIQVJFRF9MSUJTKQorICBzZXQgKEdGTEFHU19JU19BX0RMTCAxKQorZWxzZSAoKQorICBzZXQgKEdGTEFHU19JU19BX0RMTCAwKQorZW5kaWYgKCkKKworY29uZmlndXJlX2hlYWRlcnMgKFBVQkxJQ19IRFJTICAke1BVQkxJQ19IRFJTfSkKK2NvbmZpZ3VyZV9zb3VyY2VzIChQUklWQVRFX0hEUlMgJHtQUklWQVRFX0hEUlN9KQorY29uZmlndXJlX3NvdXJjZXMgKEdGTEFHU19TUkNTICAke0dGTEFHU19TUkNTfSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIG91dHB1dCBkaXJlY3Rvcmllcworc2V0IChDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgImJpbiIpCitzZXQgKENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAibGliIikKK3NldCAoQ01BS0VfQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICJsaWIiKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzCitpZiAoT1NfV0lORE9XUykKKyAgc2V0IChSVU5USU1FX0lOU1RBTExfRElSIEJpbikKKyAgc2V0IChMSUJSQVJZX0lOU1RBTExfRElSIExpYikKKyAgc2V0IChJTkNMVURFX0lOU1RBTExfRElSIEluY2x1ZGUpCisgIHNldCAoQ09ORklHX0lOU1RBTExfRElSICBDTWFrZSkKK2Vsc2UgKCkKKyAgc2V0IChSVU5USU1FX0lOU1RBTExfRElSIGJpbikKKyAgIyBUaGUgTElCX0lOU1RBTExfRElSIGFuZCBMSUJfU1VGRklYIHZhcmlhYmxlcyBhcmUgdXNlZCBieSB0aGUgRmVkb3JhCisgICMgcGFja2FnZSBtYWludGFpbmVycy4gQWxzbyBwYWNrYWdlIG1haW50YWluZXJzIG9mIG90aGVyIGRpc3RyaWJ1dGlvbgorICAjIHBhY2thZ2VzIG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgaWYgKE5PVCBMSUJfSU5TVEFMTF9ESVIpCisgICAgc2V0IChMSUJfSU5TVEFMTF9ESVIgImxpYiR7TElCX1NVRkZJWH0iKQorICBlbmRpZiAoKQorICBzZXQgKExJQlJBUllfSU5TVEFMTF9ESVIgIiR7TElCX0lOU1RBTExfRElSfSIKKyAgICBDQUNIRSBQQVRIICJEaXJlY3Rvcnkgb2YgaW5zdGFsbGVkIGxpYnJhcmllcywgZS5nLiwgXCJsaWI2NFwiIgorICApCisgIG1hcmtfYXNfYWR2YW5jZWQgKExJQlJBUllfSU5TVEFMTF9ESVIpCisgIHNldCAoSU5DTFVERV9JTlNUQUxMX0RJUiBpbmNsdWRlKQorICBzZXQgKENPTkZJR19JTlNUQUxMX0RJUiAgJHtMSUJSQVJZX0lOU1RBTExfRElSfS9jbWFrZS8ke1BBQ0tBR0VfTkFNRX0pCitlbmRpZiAoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgYWRkIGxpYnJhcnkgdGFyZ2V0cworc2V0IChUQVJHRVRTKQorIyBzdGF0aWMgdnMuIHNoYXJlZAorZm9yZWFjaCAoVFlQRSBJTiBJVEVNUyBTVEFUSUMgU0hBUkVEKQorICBpZiAoQlVJTERfJHtUWVBFfV9MSUJTKQorICAgICMgd2hldGhlciBvciBub3QgdGFyZ2V0cyBhcmUgYSBETEwKKyAgICBpZiAoT1NfV0lORE9XUyBBTkQgIl4ke1RZUEV9JCIgU1RSRVFVQUwgIl5TSEFSRUQkIikKKyAgICAgIHNldCAoR0ZMQUdTX0lTX0FfRExMIDEpCisgICAgZWxzZSAoKQorICAgICAgc2V0IChHRkxBR1NfSVNfQV9ETEwgMCkKKyAgICBlbmRpZiAoKQorICAgIHN0cmluZyAoVE9MT1dFUiAiJHtUWVBFfSIgdHlwZSkKKyAgICAjIG11bHRpLXRocmVhZGVkIHZzLiBzaW5nbGUtdGhyZWFkZWQKKyAgICBmb3JlYWNoIChvcHRzIElOIElURU1TICIiIF9ub3RocmVhZHMpCisgICAgICBpZiAoQlVJTERfZ2ZsYWdzJHtvcHRzfV9MSUIpCisgICAgICAgIGFkZF9saWJyYXJ5IChnZmxhZ3Mke29wdHN9LSR7dHlwZX0gJHtUWVBFfSAke0dGTEFHU19TUkNTfSAke1BSSVZBVEVfSERSU30gJHtQVUJMSUNfSERSU30pCisgICAgICAgIHNldCAoaW5jbHVkZV9kaXJzICIkPEJVSUxEX0lOVEVSRkFDRToke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZT4iKQorICAgICAgICBpZiAoSU5TVEFMTF9IRUFERVJTKQorICAgICAgICAgIGxpc3QgKEFQUEVORCBpbmNsdWRlX2RpcnMgIiQ8SU5TVEFMTF9JTlRFUkZBQ0U6JHtJTkNMVURFX0lOU1RBTExfRElSfT4iKQorICAgICAgICBlbmRpZiAoKQorICAgICAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoZ2ZsYWdzJHtvcHRzfS0ke3R5cGV9CisgICAgICAgICAgUFVCTElDICAiJHtpbmNsdWRlX2RpcnN9IgorICAgICAgICAgIFBSSVZBVEUgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9zcmM7JHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvJHtHRkxBR1NfSU5DTFVERV9ESVJ9IgorICAgICAgICApCisgICAgICAgIGlmIChvcHRzIE1BVENIRVMgIm5vdGhyZWFkcyIpCisgICAgICAgICAgc2V0IChkZWZpbmVzICJHRkxBR1NfSVNfQV9ETEw9JHtHRkxBR1NfSVNfQV9ETEx9O05PVEhSRUFEUyIpCisgICAgICAgIGVsc2UgKCkKKyAgICAgICAgICBzZXQgKGRlZmluZXMgIkdGTEFHU19JU19BX0RMTD0ke0dGTEFHU19JU19BX0RMTH0iKQorICAgICAgICAgIGlmIChDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkKKyAgICAgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyAoZ2ZsYWdzJHtvcHRzfS0ke3R5cGV9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCisgICAgICAgICAgZW5kaWYgKCkKKyAgICAgICAgZW5kaWYgKCkKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzICgKKyAgICAgICAgICBnZmxhZ3Mke29wdHN9LSR7dHlwZX0gUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICIke2RlZmluZXN9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9OQU1FICAgICAgICAgImdmbGFncyR7b3B0c30iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTiAgICAgICAgICAgICAiJHtQQUNLQUdFX1ZFUlNJT059IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPVkVSU0lPTiAgICAgICAgICAgIiR7UEFDS0FHRV9TT1ZFUlNJT059IgorICAgICAgICApCisgICAgICAgIGlmIChIQVZFX1NITFdBUElfSCkKKyAgICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMgKGdmbGFncyR7b3B0c30tJHt0eXBlfSBzaGx3YXBpLmxpYikKKyAgICAgICAgZW5kaWYgKCkKKyAgICAgICAgaWYgKE5PVCBUQVJHRVQgZ2ZsYWdzJHtvcHRzfSkKKyAgICAgICAgICBhZGRfY3VzdG9tX3RhcmdldCAoZ2ZsYWdzJHtvcHRzfSkKKyAgICAgICAgZW5kaWYgKCkKKyAgICAgICAgYWRkX2RlcGVuZGVuY2llcyAoZ2ZsYWdzJHtvcHRzfSBnZmxhZ3Mke29wdHN9LSR7dHlwZX0pCisgICAgICAgIGxpc3QgKEFQUEVORCBUQVJHRVRTIGdmbGFncyR7b3B0c30tJHt0eXBlfSkKKyAgICAgIGVuZGlmICgpCisgICAgZW5kZm9yZWFjaCAoKQorICBlbmRpZiAoKQorZW5kZm9yZWFjaCAoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW5zdGFsbGF0aW9uIHJ1bGVzCitmaWxlIChSRUxBVElWRV9QQVRIIElOU1RBTExfUFJFRklYX1JFTDJDT05GSUdfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS8ke0NPTkZJR19JTlNUQUxMX0RJUn0iICIke0NNQUtFX0lOU1RBTExfUFJFRklYfSIpCitjb25maWd1cmVfZmlsZSAoY21ha2UvY29uZmlnLmNtYWtlLmluICAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9LyR7UEFDS0FHRV9OQU1FfS1jb25maWctaW5zdGFsbC5jbWFrZSIgQE9OTFkpCitjb25maWd1cmVfZmlsZSAoY21ha2UvdmVyc2lvbi5jbWFrZS5pbiAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9LyR7UEFDS0FHRV9OQU1FfS1jb25maWctdmVyc2lvbi5jbWFrZSIgQE9OTFkpCisKK2luc3RhbGwgKFRBUkdFVFMgJHtUQVJHRVRTfSBERVNUSU5BVElPTiAke0xJQlJBUllfSU5TVEFMTF9ESVJ9IEVYUE9SVCBnZmxhZ3MtbGliKQoraWYgKElOU1RBTExfSEVBREVSUykKKyAgaW5zdGFsbCAoRklMRVMgJHtQVUJMSUNfSERSU30gREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS8ke0dGTEFHU19JTkNMVURFX0RJUn0pCisgIGluc3RhbGwgKAorICAgIEZJTEVTICIke1BST0pFQ1RfQklOQVJZX0RJUn0vJHtQQUNLQUdFX05BTUV9LWNvbmZpZy1pbnN0YWxsLmNtYWtlIgorICAgIFJFTkFNRSAke1BBQ0tBR0VfTkFNRX0tY29uZmlnLmNtYWtlCisgICAgREVTVElOQVRJT04gJHtDT05GSUdfSU5TVEFMTF9ESVJ9CisgICkKKyAgaW5zdGFsbCAoCisgICAgRklMRVMgIiR7UFJPSkVDVF9CSU5BUllfRElSfS8ke1BBQ0tBR0VfTkFNRX0tY29uZmlnLXZlcnNpb24uY21ha2UiCisgICAgREVTVElOQVRJT04gJHtDT05GSUdfSU5TVEFMTF9ESVJ9CisgICkKKyAgaW5zdGFsbCAoRVhQT1JUIGdmbGFncy1saWIgREVTVElOQVRJT04gJHtDT05GSUdfSU5TVEFMTF9ESVJ9IEZJTEUgJHtQQUNLQUdFX05BTUV9LWV4cG9ydC5jbWFrZSkKKyAgaWYgKFVOSVgpCisgICAgaW5zdGFsbCAoUFJPR1JBTVMgc3JjL2dmbGFnc19jb21wbGV0aW9ucy5zaCBERVNUSU5BVElPTiAke1JVTlRJTUVfSU5TVEFMTF9ESVJ9KQorICBlbmRpZiAoKQorZW5kaWYgKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHN1cHBvcnQgZGlyZWN0IHVzZSBvZiBidWlsZCB0cmVlCitzZXQgKElOU1RBTExfUFJFRklYX1JFTDJDT05GSUdfRElSIC4pCitleHBvcnQgKFRBUkdFVFMgJHtUQVJHRVRTfSBGSUxFICIke1BST0pFQ1RfQklOQVJZX0RJUn0vJHtQQUNLQUdFX05BTUV9LWV4cG9ydC5jbWFrZSIpCitleHBvcnQgKFBBQ0tBR0UgZ2ZsYWdzKQorY29uZmlndXJlX2ZpbGUgKGNtYWtlL2NvbmZpZy5jbWFrZS5pbiAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9LyR7UEFDS0FHRV9OQU1FfS1jb25maWcuY21ha2UiIEBPTkxZKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdGVzdGluZyAtIE1VU1QgZm9sbG93IHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBidWlsZCB0cmVlIGNvbmZpZyBmaWxlCitpZiAoQlVJTERfVEVTVElORykKKyAgaW5jbHVkZSAoQ1Rlc3QpCisgIGVuYWJsZV90ZXN0aW5nICgpCisgIGFkZF9zdWJkaXJlY3RvcnkgKHRlc3QpCitlbmRpZiAoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcGFja2FnaW5nCitpZiAoQlVJTERfUEFDS0FHSU5HKQorCisgIGlmIChOT1QgQlVJTERfU0hBUkVEX0xJQlMgQU5EIE5PVCBJTlNUQUxMX0hFQURFUlMpCisgICAgbWVzc2FnZSAoV0FSTklORyAiUGFja2FnZSB3aWxsIGNvbnRhaW4gc3RhdGljIGxpYnJhcmllcyB3aXRob3V0IGhlYWRlcnMhIgorICAgICAgICAgICAgICAgICAgICAgIlxuUmVjb21tZW5kZWQgb3B0aW9ucyBmb3IgZ2VuZXJhdGlvbiBvZiBydW50aW1lIHBhY2thZ2U6IgorICAgICAgICAgICAgICAgICAgICAgIlxuICBCVUlMRF9TSEFSRURfTElCUz1PTiIKKyAgICAgICAgICAgICAgICAgICAgICJcbiAgQlVJTERfU1RBVElDX0xJQlM9T0ZGIgorICAgICAgICAgICAgICAgICAgICAgIlxuICBJTlNUQUxMX0hFQURFUlM9T0ZGIgorICAgICAgICAgICAgICAgICAgICAgIlxuUmVjb21tZW5kZWQgb3B0aW9ucyBmb3IgZ2VuZXJhdGlvbiBvZiBkZXZlbG9wbWVudCBwYWNrYWdlOiIKKyAgICAgICAgICAgICAgICAgICAgICJcbiAgQlVJTERfU0hBUkVEX0xJQlM9T04iCisgICAgICAgICAgICAgICAgICAgICAiXG4gIEJVSUxEX1NUQVRJQ19MSUJTPU9OIgorICAgICAgICAgICAgICAgICAgICAgIlxuICBJTlNUQUxMX0hFQURFUlM9T04iKQorICBlbmRpZiAoKQorCisgICMgZGVmYXVsdCBwYWNrYWdlIGdlbmVyYXRvcnMKKyAgaWYgKEFQUExFKQorICAgIHNldCAoUEFDS0FHRV9HRU5FUkFUT1IgICAgICAgICJQYWNrYWdlTWFrZXIiKQorICAgIHNldCAoUEFDS0FHRV9TT1VSQ0VfR0VORVJBVE9SICJUR1o7WklQIikKKyAgZWxzZWlmIChVTklYKQorICAgIHNldCAoUEFDS0FHRV9HRU5FUkFUT1IgICAgICAgICJERUI7UlBNIikKKyAgICBzZXQgKFBBQ0tBR0VfU09VUkNFX0dFTkVSQVRPUiAiVEdaO1pJUCIpCisgIGVsc2UgKCkKKyAgICBzZXQgKFBBQ0tBR0VfR0VORVJBVE9SICAgICAgICAiWklQIikKKyAgICBzZXQgKFBBQ0tBR0VfU09VUkNFX0dFTkVSQVRPUiAiWklQIikKKyAgZW5kaWYgKCkKKworICAjIHVzZWQgcGFja2FnZSBnZW5lcmF0b3JzCisgIHNldCAoQ1BBQ0tfR0VORVJBVE9SICAgICAgICAiJHtQQUNLQUdFX0dFTkVSQVRPUn0iICAgICAgICBDQUNIRSBTVFJJTkcgIkxpc3Qgb2YgYmluYXJ5IHBhY2thZ2UgZ2VuZXJhdG9ycyAoQ1BhY2spLiIpCisgIHNldCAoQ1BBQ0tfU09VUkNFX0dFTkVSQVRPUiAiJHtQQUNLQUdFX1NPVVJDRV9HRU5FUkFUT1J9IiBDQUNIRSBTVFJJTkcgIkxpc3Qgb2Ygc291cmNlIHBhY2thZ2UgZ2VuZXJhdG9ycyAoQ1BhY2spLiIpCisgIG1hcmtfYXNfYWR2YW5jZWQgKENQQUNLX0dFTkVSQVRPUiBDUEFDS19TT1VSQ0VfR0VORVJBVE9SKQorCisgICMgc29tZSBwYWNrYWdlIGdlbmVyYXRvcnMgKGUuZy4sIFBhY2thZ2VNYWtlcikgZG8gbm90IGFsbG93IC5tZCBleHRlbnNpb24KKyAgY29uZmlndXJlX2ZpbGUgKCIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9L1JFQURNRS5tZCIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9SRUFETUUudHh0IiBDT1BZT05MWSkKKworICAjIGNvbW1vbiBwYWNrYWdlIGluZm9ybWF0aW9uCisgIHNldCAoQ1BBQ0tfUEFDS0FHRV9WRU5ET1IgICAgICAgICAgICAgICJBbmRyZWFzIFNjaHVoIikKKyAgc2V0IChDUEFDS19QQUNLQUdFX0NPTlRBQ1QgICAgICAgICAgICAgImdvb2dsZS1nZmxhZ3NAZ29vZ2xlZ3JvdXBzLmNvbSIpCisgIHNldCAoQ1BBQ0tfUEFDS0FHRV9OQU1FICAgICAgICAgICAgICAgICIke1BBQ0tBR0VfTkFNRX0iKQorICBzZXQgKENQQUNLX1BBQ0tBR0VfVkVSU0lPTiAgICAgICAgICAgICAiJHtQQUNLQUdFX1ZFUlNJT059IikKKyAgc2V0IChDUEFDS19QQUNLQUdFX1ZFUlNJT05fTUFKT1IgICAgICAgIiR7UEFDS0FHRV9WRVJTSU9OX01BSk9SfSIpCisgIHNldCAoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01JTk9SICAgICAgICIke1BBQ0tBR0VfVkVSU0lPTl9NSU5PUn0iKQorICBzZXQgKENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9QQVRDSCAgICAgICAiJHtQQUNLQUdFX1ZFUlNJT05fUEFUQ0h9IikKKyAgc2V0IChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkgIkEgY29tbWFuZGxpbmUgZmxhZ3MgbGlicmFyeSB0aGF0IGFsbG93cyBmb3IgZGlzdHJpYnV0ZWQgZmxhZ3MuIikKKyAgc2V0IChDUEFDS19SRVNPVVJDRV9GSUxFX1dFTENPTUUgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9SRUFETUUudHh0IikKKyAgc2V0IChDUEFDS19SRVNPVVJDRV9GSUxFX0xJQ0VOU0UgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vQ09QWUlORy50eHQiKQorICBzZXQgKENQQUNLX1BBQ0tBR0VfREVTQ1JJUFRJT05fRklMRSAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1JFQURNRS50eHQiKQorICBzZXQgKENQQUNLX0lOU1RBTExfUFJFRklYICAgICAgICAgICAgICAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0iKQorICBzZXQgKENQQUNLX09VVFBVVF9GSUxFX1BSRUZJWCAgICAgICAgICBwYWNrYWdlcykKKyAgc2V0IChDUEFDS19QQUNLQUdFX1JFTE9DQVRBQkxFICAgICAgICAgVFJVRSkKKyAgc2V0IChDUEFDS19NT05PTElUSElDX0lOU1RBTEwgICAgICAgICAgVFJVRSkKKworICAjIFJQTSBwYWNrYWdlIGluZm9ybWF0aW9uIC0tIHVzZWQgaW4gY21ha2UvcGFja2FnZS5jbWFrZS5pbiBhbHNvIGZvciBERUIKKyAgc2V0IChDUEFDS19SUE1fUEFDS0FHRV9HUk9VUCAgICJEZXZlbG9wbWVudC9MaWJyYXJpZXMiKQorICBzZXQgKENQQUNLX1JQTV9QQUNLQUdFX0xJQ0VOU0UgIkJTRCIpCisgIHNldCAoQ1BBQ0tfUlBNX1BBQ0tBR0VfVVJMICAgICAiaHR0cDovL3NjaHVoc2NodWguZ2l0aHViLmNvbS9nZmxhZ3MiKQorICBzZXQgKENQQUNLX1JQTV9DSEFOR0VMT0dfRklMRSAgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vQ2hhbmdlTG9nLnR4dCIpCisKKyAgaWYgKElOU1RBTExfSEVBREVSUykKKyAgICBzZXQgKENQQUNLX1JFU09VUkNFX0ZJTEVfUkVBRE1FICIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9L2RvYy9pbmRleC5odG1sIikKKyAgZWxzZSAoKQorICAgIHNldCAoQ1BBQ0tfUkVTT1VSQ0VfRklMRV9SRUFETUUgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vY21ha2UvUkVBRE1FX3J1bnRpbWUudHh0IikKKyAgZW5kaWYgKCkKKworICAjIHN5c3RlbS9hcmNoaXRlY3R1cmUKKyAgaWYgKFdJTkRPV1MpCisgICAgaWYgKENNQUtFX0NMXzY0KQorICAgICAgc2V0IChDUEFDS19TWVNURU1fTkFNRSAid2luNjQiKQorICAgIGVsc2UgKCkKKyAgICAgIHNldCAoQ1BBQ0tfU1lTVEVNX05BTUUgIndpbjMyIikKKyAgICBlbmRpZiAoKQorICAgIHNldCAoQ1BBQ0tfUEFDS0FHRV9BUkNISVRFQ1RVUkUpCisgIGVsc2VpZiAoQVBQTEUpCisgICAgc2V0IChDUEFDS19QQUNLQUdFX0FSQ0hJVEVDVFVSRSBkYXJ3aW4pCisgIGVsc2UgKCkKKyAgICBzdHJpbmcgKFRPTE9XRVIgIiR7Q01BS0VfU1lTVEVNX05BTUV9IiBDUEFDS19TWVNURU1fTkFNRSkKKyAgICBpZiAoQ01BS0VfQ1hYX0ZMQUdTIE1BVENIRVMgIi1tMzIiKQorICAgICAgc2V0IChDUEFDS19QQUNLQUdFX0FSQ0hJVEVDVFVSRSBpMzg2KQorICAgIGVsc2UgKCkKKyAgICAgIGV4ZWN1dGVfcHJvY2VzcyAoCisgICAgICAgIENPTU1BTkQgICAgICAgICBkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlCisgICAgICAgIFJFU1VMVF9WQVJJQUJMRSBSVgorICAgICAgICBPVVRQVVRfVkFSSUFCTEUgQ1BBQ0tfUEFDS0FHRV9BUkNISVRFQ1RVUkUKKyAgICAgICkKKyAgICAgIGlmIChSViBFUVVBTCAwKQorCSAgICAgIHN0cmluZyAoU1RSSVAgIiR7Q1BBQ0tfUEFDS0FHRV9BUkNISVRFQ1RVUkV9IiBDUEFDS19QQUNLQUdFX0FSQ0hJVEVDVFVSRSkKKyAgICAgIGVsc2UgKCkKKyAgICAgICAgZXhlY3V0ZV9wcm9jZXNzIChDT01NQU5EIHVuYW1lIC1tIE9VVFBVVF9WQVJJQUJMRSBDUEFDS19QQUNLQUdFX0FSQ0hJVEVDVFVSRSkKKyAgICAgICAgaWYgKENQQUNLX1BBQ0tBR0VfQVJDSElURUNUVVJFIE1BVENIRVMgIng4Nl82NCIpCisJICAgICAgICBzZXQgKENQQUNLX1BBQ0tBR0VfQVJDSElURUNUVVJFIGFtZDY0KQorICAgICAgICBlbHNlICgpCisgICAgICAgICAgc2V0IChDUEFDS19QQUNLQUdFX0FSQ0hJVEVDVFVSRSBpMzg2KQorICAgICAgICBlbmRpZiAoKQorICAgICAgZW5kaWYgKCkKKyAgICBlbmRpZiAoKQorICBlbmRpZiAoKQorCisgICMgc291cmNlIHBhY2thZ2Ugc2V0dGluZ3MKKyAgc2V0IChDUEFDS19TT1VSQ0VfVE9QTEVWRUxfVEFHICAgICAgInNvdXJjZSIpCisgIHNldCAoQ1BBQ0tfU09VUkNFX1BBQ0tBR0VfRklMRV9OQU1FICIke0NQQUNLX1BBQ0tBR0VfTkFNRX0tJHtDUEFDS19QQUNLQUdFX1ZFUlNJT059IikKKyAgc2V0IChDUEFDS19TT1VSQ0VfSUdOT1JFX0ZJTEVTICAgICAgIi9cXFxcLmdpdC87XFxcXC5zd3AkO1xcXFwuIzsvIztcXFxcLip+O2NzY29wZVxcXFwuKjsvW0JiXXVpbGRbListX2EtekEtWjAtOV0qLyIpCisKKyAgIyBkZWZhdWx0IGJpbmFyeSBwYWNrYWdlIHNldHRpbmdzCisgIHNldCAoQ1BBQ0tfSU5DTFVERV9UT1BMRVZFTF9ESVJFQ1RPUlkgVFJVRSkKKyAgc2V0IChDUEFDS19QQUNLQUdFX0ZJTEVfTkFNRSAgICAgICAgICAiJHtDUEFDS19QQUNLQUdFX05BTUV9LSR7Q1BBQ0tfUEFDS0FHRV9WRVJTSU9OfS0ke0NQQUNLX1NZU1RFTV9OQU1FfSIpCisgIGlmIChDUEFDS19QQUNLQUdFX0FSQ0hJVEVDVFVSRSkKKyAgICBzZXQgKENQQUNLX1BBQ0tBR0VfRklMRV9OQU1FICIke0NQQUNLX1BBQ0tBR0VfRklMRV9OQU1FfS0ke0NQQUNLX1BBQ0tBR0VfQVJDSElURUNUVVJFfSIpCisgIGVuZGlmICgpCisKKyAgIyBnZW5lcmF0b3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlCisgICMKKyAgIyBhbGxvdyBwYWNrYWdlIG1haW50YWluZXJzIHRvIHVzZSB0aGVpciBvd24gY29uZmlndXJhdGlvbiBmaWxlCisgICMgJCBjbWFrZSAtRENQQUNLX1BST0pFQ1RfQ09ORklHX0ZJTEU6RklMRT0vcGF0aC90by9wYWNrYWdlL2NvbmZpZworICBpZiAoTk9UIENQQUNLX1BST0pFQ1RfQ09ORklHX0ZJTEUpCisgICAgY29uZmlndXJlX2ZpbGUgKAorICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vY21ha2UvcGFja2FnZS5jbWFrZS5pbiIKKyAgICAgICIke1BST0pFQ1RfQklOQVJZX0RJUn0vJHtQQUNLQUdFX05BTUV9LXBhY2thZ2UuY21ha2UiIEBPTkxZCisgICAgKQorICAgIHNldCAoQ1BBQ0tfUFJPSkVDVF9DT05GSUdfRklMRSAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9LyR7UEFDS0FHRV9OQU1FfS1wYWNrYWdlLmNtYWtlIikKKyAgZW5kaWYgKCkKKworICBpbmNsdWRlIChDUGFjaykKKworZW5kaWYgKCkgIyBCVUlMRF9QQUNLQUdJTkcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9DT1BZSU5HLnR4dCBiL3RoaXJkX3BhcnR5L2dmbGFncy9DT1BZSU5HLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTViMGMyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL0NPUFlJTkcudHh0CkBAIC0wLDAgKzEsMjggQEAKK0NvcHlyaWdodCAoYykgMjAwNiwgR29vZ2xlIEluYy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgoraW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3MvQ2hhbmdlTG9nLnR4dCBiL3RoaXJkX3BhcnR5L2dmbGFncy9DaGFuZ2VMb2cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTlmODMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvQ2hhbmdlTG9nLnR4dApAQCAtMCwwICsxLDIxOCBAQAorKiBUdWUgTWFyIDI0IDIwMTQgLSBBbmRyZWFzIFNjaHVoIDxhbmRyZWFzLnNjaHVoLjg0QGdtYWlsLmNvbT4KKworLSBnZmxhZ3M6IHZlcnNpb24gMi4xLjIKKy0gTW92ZWQgcHJvamVjdCB0byBHaXRIdWIKKy0gQWRkZWQgR0ZMQUdTX05BTUVTUEFDRSBkZWZpbml0aW9uIHRvIGdmbGFnc19kZWNsYXJlLmgKKy0gRml4ZWQgaXNzdWUgOTQ6IEtlZXAgImdvb2dsZSIgYXMgcHJpbWFyeSBuYW1lc3BhY2UgYW5kIGltcG9ydCBzeW1ib2xzIGludG8gImdmbGFncyIgbmFtZXNwYWNlCistIEZpeGVkIGlzc3VlIDk2OiBGaXggYmluYXJ5IEFCSSBjb21wYXRpYmlsaXR5IHdpdGggZ2ZsYWdzIDIuMCB1c2luZyAiZ29vZ2xlIiBhcyBwcmltYXJ5IG5hbWVzcGFjZQorLSBGaXhlZCBpc3N1ZSA5Ny8xMDE6IFJlbW92ZWQgKHBhdGNoZWQpIENNYWtlIG1vZHVsZXMgYW5kIGVuYWJsZWQgQyBsYW5ndWFnZSBpbnN0ZWFkCistIEZpeGVkIGlzc3VlIDEwMzogU2V0IENNYWtlIHBvbGljeSBDTVAwMDQyIHRvIHNpbGVuY2Ugd2FybmluZyByZWdhcmRpbmcgTUFDT1NfUlBBVEggc2V0dGluZworCisqIFN1biBNYXIgMjAgMjAxNCAtIEFuZHJlYXMgU2NodWggPGdvb2dsZS1nZmxhZ3NAZ29vZ2xlZ3JvdXBzLmNvbT4KKworLSBnZmxhZ3M6IHZlcnNpb24gMi4xLjEKKy0gRml4ZWQgaXNzdWUgNzc6IEdGTEFHU19JU19BX0RMTCBleHBhbmRzIHRvIGVtcHR5IHN0cmluZyBpbiBnZmxhZ3NfZGVjbGFyZS5oCistIEZpeGVkIGlzc3VlIDc5OiBHRkxBR1NfTkFNRVNQQUNFIG5vdCBleHBhbmRlZCB0byBhY3R1YWwgbmFtZXNwYWNlIGluIGdmbGFnc19kZWNsYXJlLmgKKy0gRml4ZWQgaXNzdWUgODA6IEFsbG93IGluY2x1ZGUgcGF0aCB0byBkaWZmZXIgZnJvbSBHRkxBR1NfTkFNRVNQQUNFCisKKyogVGh1IE1hciAyMCAyMDE0IC0gQW5kcmVhcyBTY2h1aCA8Z29vZ2xlLWdmbGFnc0Bnb29nbGVncm91cHMuY29tPgorCistIGdmbGFnczogdmVyc2lvbiAyLjEuMAorLSBCdWlsZCBzeXN0ZW0gY29uZmlndXJhdGlvbiB1c2luZyBDTWFrZSBpbnN0ZWFkIG9mIGF1dG90b29scworLSBDUGFjayBwYWNrYWdpbmcgc3VwcG9ydCBmb3IgRGViaWFuL1VidW50dSwgUmVkIEhhdCwgYW5kIE1hYyBPUyBYCistIEZpeGVkIGlzc3VlIDU0OiBGaXggImludmFsaWQgc3VmZml4IG9uIGxpdGVyYWwiIChDKysxMSkKKy0gRml4ZWQgaXNzdWUgNTc6IFVzZSBfc3RyZHVwIGluc3RlYWQgb2Ygc3RyZHVwIG9uIFdpbmRvd3MKKy0gRml4ZWQgaXNzdWUgNjI6IENoYW5nZSBhbGwgcHJlcHJvY2Vzc29yIGluY2x1ZGUgZ3VhcmRzIHRvIHN0YXJ0IHdpdGggR0ZMQUdTXworLSBGaXhlZCBpc3N1ZSA2NDogQWRkIERFRklORV92YWxpZGF0b3IgbWFjcm8KKy0gRml4ZWQgaXNzdWUgNzM6IFdhcm5pbmdzIGluIFZpc3VhbCBTdHVkaW8gMjAxMCBhbmQgdW5hYmxlIHRvIGNvbXBpbGUgdW5pdCB0ZXN0CisKKyogV2VkIEphbiAyNSAyMDEyIC0gR29vZ2xlIEluYy4gPGdvb2dsZS1nZmxhZ3NAZ29vZ2xlZ3JvdXBzLmNvbT4KKworLSBnZmxhZ3M6IHZlcnNpb24gMi4wCistIENoYW5nZWQgdGhlICdvZmZpY2lhbCcgZ2ZsYWdzIGVtYWlsIGluIHNldHVwLnB5L2V0YworLSBSZW5hbWVkIGdvb2dsZS1nZmxhZ3Muc2xuIHRvIGdmbGFncy5zbG4KKy0gQ2hhbmdlZCBjb3B5cmlnaHQgdGV4dCB0byByZWZsZWN0IEdvb2dsZSdzIHJlbGlucXVpc2hlZCBvd25lcnNoaXAKKworKiBUdWUgRGVjIDIwIDIwMTEgLSBHb29nbGUgSW5jLiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorCistIGdvb2dsZS1nZmxhZ3M6IHZlcnNpb24gMS43CistIEFkZCBDb21tYW5kTGluZUZsYWdJbmZvOjpmbGFnX3B0ciBwb2ludGluZyB0byBjdXJyZW50IHN0b3JhZ2UgKG11c2ppKQorLSBQT1JUSU5HOiBmbHVzaCBhZnRlciB3cml0aW5nIHRvIHN0ZGVyciwgbmVlZGVkIG9uIGN5Z3dpbgorLSBQT1JUSU5HOiBDbGVhbiB1cCB0aGUgR0ZMQUdTX0RMTF9ERUNMIHN0dWZmIGJldHRlcgorLSBGaXggYSBidWcgaW4gU3RyaW5nUHJpbnRmKCkgdGhhdCBhZmZlY3RlZCBsYXJnZSBzdHJpbmdzIChjc2lsdmVycykKKy0gRGllIGF0IGNvbmZpZ3VyZS10aW1lIHdoZW4gZysrIGlzbid0IGluc3RhbGxlZAorCisqIEZyaSBKdWwgMjkgMjAxMSAtIEdvb2dsZSBJbmMuIDxvcGVuc291cmNlQGdvb2dsZS5jb20+CisKKy0gZ29vZ2xlLWdmbGFnczogdmVyc2lvbiAxLjYKKy0gQlVHRklYOiBGaXggYSBidWcgd2hlcmUgd2Ugd2VyZSBsZWF2aW5nIG91dCBhIHJlcXVpcmVkICQodG9wX3NyY2RpcikKKy0gRml4IGRlZmluaXRpb24gb2YgY2xzdHJpbmcgKGp5cmtpKQorLSBTcGxpdCB1cCBmbGFnIGRlY2xhcmVzIGludG8gaXRzIG93biBmaWxlIChqeXJraSkKKy0gQWRkIC0tdmVyc2lvbiBzdXBwb3J0IChjc2lsdmVycykKKy0gVXBkYXRlIHRoZSBSRUFETUUgZm9yIGdmbGFncyB3aXRoIHN0YXRpYyBsaWJzCistIFVwZGF0ZSBhY3hfcHRocmVhZC5tNCBmb3Igbm9zdGRsaWIKKy0gQ2hhbmdlIFJlcGFyc2VDb21tYW5kTGluZUZsYWdzIHRvIHJldHVybiB2b2lkIChjc2lsdmVycykKKy0gU29tZSBkb2MgdHlwb2ZpeGVzIGFuZCBleGFtcGxlIGF1Z21lbnRhdGlvbiAodmFyaW91cykKKworKiBNb24gSmFuIDI0IDIwMTEgLSBHb29nbGUgSW5jLiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorCistIGdvb2dsZS1nZmxhZ3M6IHZlcnNpb24gMS41CistIEJldHRlciByZXBvcnRpbmcgb2YgY3VycmVudCB2cyBkZWZhdWx0IHZhbHVlIChoYW5kbGVyKQorLSBBZGQgQVBJIGZvciBjbGVhbmluZyB1cCBvZiBtZW1vcnkgYXQgcHJvZ3JhbS1leGl0IChqbWFyYW50eikKKy0gRml4IG1hY3JvcyB0byB3b3JrIGluc2lkZSBuYW1lc3BhY2VzIChjc2lsdmVycykKKy0gVXNlIG91ciBvd24gc3RyaW5nIHR5cGVkZWYgaW4gY2FzZSBzdHJpbmcgaXMgcmVkZWZpbmVkIChjc2lsdmVycykKKy0gVXBkYXRlZCB0byBhdXRvY29uZiAyLjY1CisKKyogV2VkIE9jdCAxMyAyMDEwIC0gR29vZ2xlIEluYy4gPG9wZW5zb3VyY2VAZ29vZ2xlLmNvbT4KKworLSBnb29nbGUtZ2ZsYWdzOiB2ZXJzaW9uIDEuNAorLSBBZGQgYSBjaGVjayB0byBwcmV2ZW50IHBhc3NpbmcgMCB0byBERUZJTkVfc3RyaW5nIChqb3JnKQorLSBSZWR1Y2UgY29tcGlsZSAoLm8pIHNpemUgKGp5cmtpKQorLSBTb21lIHNtYWxsIGNoYW5nZXMgdG8gcXVpZXQgZGVidWcgY29tcGlsZXMgKGFsZXhrKQorLSBQT1JUSU5HOiBiZXR0ZXIgc3VwcG9ydCBzdGF0aWMgbGlua2luZyBvbiB3aW5kb3dzIChjc2lsdmVycykKKy0gRE9DVU1FTlRBVElPTjogY2hhbmdlIGRlZmF1bHQgdmFsdWVzLCB1c2UgdmFsaWRhdG9ycywgZXRjLgorLSBVcGRhdGUgdGhlIE5FV1MgZmlsZSB0byBiZSBub24tZW1wdHkKKy0gQWRkIHBrZy1jb25maWcgKC5wYykgZmlsZXMgZm9yIGxpYmdmbGFncyBhbmQgbGliZ2ZsYWdzX25vdGhyZWFkcworCisqIE1vbiBKYW4gIDQgMjAxMCAtIEdvb2dsZSBJbmMuIDxvcGVuc291cmNlQGdvb2dsZS5jb20+CisKKy0gZ29vZ2xlLWdmbGFnczogdmVyc2lvbiAxLjMKKy0gUE9SVEFCSUxJVFk6IGNhbiBub3cgYnVpbGQgYW5kIHJ1biB0ZXN0cyB1bmRlciBNU1ZDIChjc2lsdmVycykKKy0gUmVtb3ZlIHRoZSBweXRob24gZ2ZsYWdzIGNvZGUsIHdoaWNoIGlzIG5vdyBpdHMgb3duIHBhY2thZ2UgKHRhbnNlbGwpCistIENsYXJpZnkgdGhhdCAibGFzdCBmbGFnIHdpbnMiIGluIHRoZSBkb2NzIChjc2lsdmVycykKKy0gQ29tbWVudCBkYW5nZXIgb2YgdXNpbmcgR2V0QWxsRmxhZ3MgaW4gdmFsaWRhdG9ycyAod29qdGVrbSkKKy0gUE9SVEFCSUxJVFk6IFNvbWUgZml4ZXMgbmVjZXNzYXJ5IGZvciBjKysweCAobWJvZXJnZXIpCistIE1ha2VmaWxlIGZpeDogJChzcmNkaXIpIC0+ICQodG9wX3NyY2RpcikgaW4gb25lIHBsYWNlIChjc2lsdnJlcykKKy0gSU5TVEFMTDogYXV0b3Rvb2xzIHRvIGF1dG9jb25mIHYyLjY0ICsgYXV0b21ha2UgdjEuMTEgKGNzaWx2ZXJzKQorCisqIFRodSBTZXAgMTAgMjAwOSAtIEdvb2dsZSBJbmMuIDxvcGVuc291cmNlQGdvb2dsZS5jb20+CisKKy0gZ29vZ2xlLWdmbGFnczogdmVyc2lvbiAxLjIKKy0gUE9SVEFCSUxJVFk6IGNhbiBub3cgYnVpbGQgYW5kIHJ1biB0ZXN0cyB1bmRlciBtaW5ndyAoY3NpbHZlcnMpCistIFVzaW5nIGEgc3RyaW5nIGFyZyBmb3IgYSBib29sIGZsYWcgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgKHJiYXlhcmRvKQorLSBBZGQgLS1oZWxweG1sIHRvIGdmbGFncy5weSAoc2FsY2lhbnUpCistIFByb3RlY3QgYWdhaW5zdCBhIGh5cG90aGV0aWNhbCBnbG9iYWwgZCd0b3IgbXV0ZXggcHJvYmxlbSAoY3NpbHZlcnMpCistIEJVR0ZJWDogY2FuIG5vdyBkZWZpbmUgYSBmbGFnIGFmdGVyICd1c2luZyBuYW1lc3BhY2UgZ29vZ2xlJyAoaGFtYWppKQorCisqIFR1ZSBBcHIgMTQgMjAwOSAtIEdvb2dsZSBJbmMuIDxvcGVuc291cmNlQGdvb2dsZS5jb20+CisKKy0gZ29vZ2xlLWdmbGFnczogdmVyc2lvbiAxLjEKKy0gQWRkIGJvdGggZm9vIGFuZCBub2ZvbyBmb3IgYm9vbGVhbiBmbGFncywgd2l0aCAtLXVuZGVmb2sgKGFuZHljaHUpCistIEJldHRlciBkb2N1bWVudCBob3cgdmFsaWRhdG9ycyB3b3JrICh3b2p0ZWttKQorLSBJbXByb3ZlIGJpbmFyeS1kZXRlY3Rpb24gZm9yIGJhc2gtY29tcGxldGlvbiAobXRhbXNreSkKKy0gUHl0aG9uOiBBZGQgYSBjb25jZXB0IG9mICJrZXkgZmxhZ3MiLCB1c2VkIHdpdGggLS1oZWxwIChzYWxjaWFudSkKKy0gUHl0aG9uOiBSb2J1c3RpZnkgZmxhZ192YWx1ZXMgKHNhbGNpYW51KQorLSBQeXRob246IEFkZCBhIG5ldyBERUZJTkVfYm9vbCBhbGlhcyAoa2VpciwgYW5kcmV3bGl1KQorLSBQeXRob246IERvIG1vZHVsZSBpbnRyb3NwZWN0aW9uIGJhc2VkIG9uIG1vZHVsZSBuYW1lIChkc3R1cnRldmFudCkKKy0gRml4IGF1dG9jb25mIGEgYml0IGJldHRlciwgZXNwZWNpYWxseSBvbiB3aW5kb3dzIGFuZCBzb2xhcmlzIChhamVuam8pCistIEJVRyBGSVg6IGdmbGFnc19ub3RocmVhZHMgd2FzIGxpbmtpbmcgYWdhaW5zdCB0aGUgd3JvbmcgbGliIChhamVuam8pCistIEJVRyBGSVg6IHRocmVhZHMtZGV0ZWN0aW9uIGZhaWxlZCBvbiBGcmVlQlNEOyByZXBsYWNlIGl0IChhamVuam8pCistIFBPUlRBQklMSVRZOiBRdWlldCBhbiBpbnRlcm5hbCBjb21waWxlciBlcnJvciB3aXRoIFNVU0UgMTAgKGNzaWx2ZXJzKQorLSBQT1JUQUJJTElUWTogVXBkYXRlIGRlYi5zaCBmb3IgbW9yZSByZWNlbnR5IGRlYnVpbGRzIChjc2lsdmVycykKKy0gUE9SVEFCSUxJVFk6ICNpbmNsdWRlIG1vcmUgaGVhZGVycyB0byBzYXRpZnkgbmV3IGdjYydzIChjc2lsdmVycykKKy0gSU5TVEFMTDogVXBkYXRlZCB0byBhdXRvY29uZiAyLjYxIGFuZCBsaWJ0b29sIDEuNS4yNiAoY3NpbHZlcnMpCisKKyogRnJpIE9jdCAgMyAyMDA4IC0gR29vZ2xlIEluYy4gPG9wZW5zb3VyY2VAZ29vZ2xlLmNvbT4KKworLSBnb29nbGUtZ2ZsYWdzOiB2ZXJzaW9uIDEuMAorLSBBZGQgYSBtaXNzaW5nIG5ld2xpbmUgdG8gYW4gZXJyb3Igc3RyaW5nIChiY21pbGxzKQorLSAob3RoZXJ3aXNlIGV4YWN0bHkgdGhlIHNhbWUgYXMgZ2ZsYWdzIDEuMHJjMikKKworKiBUaHUgU2VwIDE4IDIwMDggLSBHb29nbGUgSW5jLiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorCistIGdvb2dsZS1nZmxhZ3M6IHZlcnNpb24gMS4wcmMyCistIFJlcG9ydCBjdXJyZW50IGZsYWcgdmFsdWVzIGluIC0taGVscHhtbCAoaGRuKQorLSBGaXggY29tcGlsYXRpb24gdHJvdWJsZXMgd2l0aCBnY2MgNC4zLjMgKHNpbW9uYikKKy0gQlVHIEZJWDogSSB3YXMgbWlzc2luZyBhIHN0ZDo6IGluIERFQ0xBUkVfc3RyaW5nIChjc2lsdmVycykKKy0gQlVHIEZJWDogQ2xhcmlmeSBpbiBkb2NzIGhvdyB0byBzcGVjaWZ5IC0tYm9vbCBmbGFncyAoY3NpbHZlcnMpCistIEJVRyBGSVg6IEZpeCAtLWhlbHBzaG9ydCBmb3Igc291cmNlIGZpbGVzIG5vdCBpbiBhIHN1YmRpciAoY3NpbHZlcnMpCistIEJVRyBGSVg6IEZpeCBweXRob24gdW5pdHRlc3QgZm9yIDY0LWJpdCBidWlsZHMgKGJjbWlsbHMpCisKKyogVHVlIEF1ZyAxOSAyMDA4IC0gR29vZ2xlIEluYy4gPG9wZW5zb3VyY2VAZ29vZ2xlLmNvbT4KKworLSBnb29nbGUtZ2ZsYWdzOiB2ZXJzaW9uIDEuMHJjMQorLSBNb3ZlICNpbmNsdWRlIGZpbGVzIGZyb20gZ29vZ2xlLyB0byBnZmxhZ3MvIChjc2lsdmVycykKKy0gU21hbGwgb3B0aW1pemF0aW9ucyB0byByZWR1Y2UgYmluYXJ5IChsaWJyYXJ5KSBzaXplIChqeXJraSkKKy0gQlVHRklYOiBmb3Jnb3QgYSBzdGQ6OiBpbiBvbmUgb2YgdGhlIC5oIGZpbGVzIChjc2lsdmVycykKKy0gU3BlZWQgdXAgbG9ja2luZyBieSBtYWtpbmcgc3VyZSBjYWxscyBhcmUgaW5saW5lZCAoYWplbmpvKQorLSA2NC1CSVQgQ09NUEFUSUJJTElUWTogVXNlICVQUklkNjQgaW5zdGVhZCBvZiAlbGxkIChjc2lsdmVycykKKy0gUE9SVEFCSUxJVFk6IGZpeCBNYWtlZmlsZSB0byB3b3JrIHdpdGggQ3lnd2luIChhamVuam8pCistIFBPUlRBQklMSVRZOiBmaXggY29kZSB0byBjb21waWxlIHVuZGVyIFZpc3VhbCBTdHVkaW8gKGFqZW5qbykKKy0gUE9SVEFCSUxJVFk6IGZpeCBjb2RlIHRvIGNvbXBpbGUgdW5kZXIgU29sYXJpcyAxMCB3aXRoIENDIChjc2lsdmVycykKKworKiBNb24gSnVsIDIxIDIwMDggLSBHb29nbGUgSW5jLiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorCistIGdvb2dsZS1nZmxhZ3M6IHZlcnNpb24gMC45CistIEFkZCB0aGUgYWJpbGl0eSB0byB2YWxpZGF0ZSBhIGNvbW1hbmQtbGluZSBmbGFnIChjc2lsdmVycykKKy0gQWRkIGNvbXBsZXRpb24gc3VwcG9ydCBmb3IgY29tbWFuZGxpbmUgZmxhZ3MgaW4gYmFzaCAoZGF2ZW4pCistIEFkZCAtVyBjb21waWxlIGZsYWdzIHRvIE1ha2VmaWxlLCB3aGVuIHVzaW5nIGdjYyAoY3NpbHZlcnMpCistIEFsbG93IGhlbHBzdHJpbmcgdG8gYmUgTlVMTCAoY3Jpc3RpYW5vYykKKy0gSW1wcm92ZWQgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGluIHRoZSAuY2MgZmlsZSAoY3NpbHZlcnMpCistIEZpeCBweXRob24gYnVnIHdpdGggQXBwZW5kRmxhZ1ZhbHVlcyArIHNob3J0bmFtZXMgKGpqdHN3YW4pCistIFVzZSBib29sIGluc3RlYWQgb2YgaW50IGZvciBib29sZWFuIGZsYWdzIGluIGdmbGFncy5weSAoYmNtaWxscykKKy0gU2ltcGxpZnkgdGhlIHdheSB3ZSBkZWNsYXJlIGZsYWdzLCBub3cgbW9yZSBmb29scHJvb2YgKGNzaWx2ZXJzKQorLSBCZXR0ZXIgZXJyb3IgbWVzc2FnZXMgd2hlbiBib29sIGZsYWdzIGNvbGxpZGUgKGNvbG9oYW4pCistIE9ubHkgZXZhbHVhdGUgREVGSU5FX2ZvbyBtYWNybyBhcmdzIG9uY2UgKGNzaWx2ZXJzKQorCisqIFdlZCBNYXIgMjYgMjAwOCAtIEdvb2dsZSBJbmMuIDxvcGVuc291cmNlQGdvb2dsZS5jb20+CisKKy0gZ29vZ2xlLWdmbGFnczogdmVyc2lvbiAwLjgKKy0gRXhwb3J0IERlc2NyaWJlT25lRmxhZygpIGluIHRoZSBBUEkKKy0gQWRkIHN1cHBvcnQgZm9yIGF1dG9tYXRpYyBsaW5lIHdyYXBwaW5nIGF0IDgwIGNvbHMgZm9yIGdmbGFncy5weQorLSBCdWdmaXg6IGRvIG5vdCB0cmVhdCBhbiBpc29sYXRlZCAiLSIgdGhlIHNhbWUgYXMgYW4gaXNvbGF0ZWQgIi0tIgorLSBVcGRhdGUgcnBtIHNwZWMgdG8gcG9pbnQgdG8gR29vZ2xlIENvZGUgcmF0aGVyIHRoYW4gc291cmNlZm9yZ2UgKCEpCistIEltcHJvdmUgZG9jdW1lbnRhdGlvbiAoaW5jbHVkaW5nIGRvY3VtZW50aW5nIHRocmVhZC1zYWZldHkpCistIEltcHJvdmUgI2luY2x1ZGUgaHlnaWVuZQorLSBJbXByb3ZlIHRlc3RpbmcKKworKiBUaHUgT2N0IDE4IDIwMDcgLSBHb29nbGUgSW5jLiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorCistIGdvb2dsZS1nZmxhZ3M6IHZlcnNpb24gMC43CistIERlYWwgZXZlbiBtb3JlIGNvcnJlY3RseSB3aXRoIGxpYnB0aHJlYWQgbm90IGxpbmtlZCBpbiAoY3NpbHZlcnMpCistIEFkZCBTVFJJUF9MT0csIGFuIGltcHJvdmVkIERPX05PVF9TSE9XX0NPTU1BTkRMSU5FX0hFTFAgKHNpb2ZmZSkKKy0gQmUgbW9yZSBhY2N1cmF0ZSBwcmludGluZyBkZWZhdWx0IGZsYWcgdmFsdWVzIGluIC0taGVscCAoZHN0dXJ0ZXZhbnQpCistIFJlZHVjZSAubyBmaWxlIHNpemUgYSBiaXQgYnkgdXNpbmcgc2hvcnRlciBuYW1lc3BhY2UgbmFtZXMgKGplZmYpCistIFVzZSByZWxhdGl2ZSBpbnN0YWxsIHBhdGgsIHNvICdzZXR1cC5weSAtLWhvbWUnIHdvcmtzIChjc2lsdmVycykKKy0gTm90aWNlIHdoZW4gYSBib29sZWFuIGZsYWcgaGFzIGEgbm9uLWJvb2xlYW4gZGVmYXVsdCAoYm5tb3VsaSkKKy0gQnJvYWRlbiAtLWhlbHBzaG9ydCB0byBtYXRjaCBmb28tbWFpbi5jYyBhbmQgZm9vX21haW4uY2MgKGhlbmRyaWUpCistIEZpeCAibm8gbW9kdWxlcyBtYXRjaCIgbWVzc2FnZSBmb3IgLS1oZWxwc2hvcnQsIGV0YyAoaGVuZHJpZSkKKworKiBXZWQgQXVnIDE1IDIwMDcgLSBHb29nbGUgSW5jLiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorCistIGdvb2dsZS1nZmxhZ3M6IHZlcnNpb24gMC42CistIERlYWwgY29ycmVjdGx5IHdpdGggY2FzZSB0aGF0IGxpYnB0aHJlYWQgaXMgbm90IGxpbmtlZCBpbiAoY3NpbHZlcnMpCistIFVwZGF0ZSBNYWtlZmlsZS90ZXN0cyBzbyB3ZSBwYXNzICJtYWtlIGRpc3RjaGVjayIgKGNzaWx2ZXJzKQorLSBEb2N1bWVudCBhbmQgdGVzdCB0aGF0IGxhc3QgYXNzaWdubWVudCB0byBhIGZsYWcgd2lucyAod2FuKQorCisqIFR1ZSBKdW4gMTIgMjAwNyAtIEdvb2dsZSBJbmMuIDxvcGVuc291cmNlQGdvb2dsZS5jb20+CisKKy0gZ29vZ2xlLWdmbGFnczogdmVyc2lvbiAwLjUKKy0gSW5jbHVkZSBhbGwgbTQgbWFjcm9zIGluIHRoZSBkaXN0cmlidXRpb24gKGNzaWx2ZXJzKQorLSBQeXRob246IEZpeCBicm9rZW4gZGF0YV9maWxlcyBmaWVsZCBpbiBzZXR1cC5weSAoc2lkbG9uKQorLSBQeXRob246IGJldHRlciBzdHJpbmcgc2VybGlhaXppbmcgYW5kIHVucGFyc2luZyAoYWJvLCBjc2ltbW9ucykKKy0gRml4IGNoZWNrcyBmb3IgTmFOIGFuZCBpbmYgdG8gd29yayB3aXRoIE1hYyBPUyBYIChjc2lsdmVycykKKworKiBUaHUgQXByIDE5IDIwMDcgLSBHb29nbGUgSW5jLiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorCistIGdvb2dsZS1nZmxhZ3M6IHZlcnNpb24gMC40CistIFJlbW92ZSBpc19kZWZhdWx0IGZyb20gR2V0Q29tbWFuZExpbmVGbGFnSW5mbyAoY3NpbHZlcnMpCistIFBvcnRhYmlsaXR5IGZpeGVzOiBpbmNsdWRlcywgc3RydG9sbCwgZ2NjNC4zIGVycm9ycyAoY3NpbHZlcnMpCistIEEgZmV3IGRvYyB0eXBvIGNsZWFudXBzIChjc2lsdmVycykKKworKiBXZWQgTWFyIDI4IDIwMDcgLSBHb29nbGUgSW5jLiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorCistIGdvb2dsZS1nZmxhZ3M6IHZlcnNpb24gMC4zCistIHB5dGhvbiBwb3J0YWJpbGl0eSBmaXg6IHVzZSBwb3BlbiBpbnN0ZWFkIG9mIHN1YnByb2Nlc3MgKGNzaWx2ZXJzKQorLSBBZGQgaXNfZGVmYXVsdCB0byBDb21tYW5kTGluZUZsYWdJbmZvIChwY2hpZW4pCistIE1ha2UgZG9jcyBhIGJpdCBwcmV0dGllciAoY3NpbHZlcnMpCistIEFjdHVhbGx5IGluY2x1ZGUgdGhlIHB5dGhvbiBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uISA6LS8gKGNzaWx2ZXJzKQorCisqIE1vbiBKYW4gMjIgMjAwNyAtIEdvb2dsZSBJbmMuIDxvcGVuc291cmNlQGdvb2dsZS5jb20+CisKKy0gZ29vZ2xlLWdmbGFnczogdmVyc2lvbiAwLjIKKy0gYWRkZWQgc3VwcG9ydCBmb3IgcHl0aG9uIGNvbW1hbmRsaW5lZmxhZ3MsIGFzIHdlbGwgYXMgYysrCistIGdmbGFnczJtYW4sIGEgc2NyaXB0IHRvIHR1cm4gZmxhZ3MgaW50byBhIG1hbiBwYWdlIChkY2hyaXN0aWFuKQorCisqIFdlZCBEZWMgMTMgMjAwNiAtIEdvb2dsZSBJbmMuIDxvcGVuc291cmNlQGdvb2dsZS5jb20+CisKKy0gZ29vZ2xlLWdmbGFnczogdmVyc2lvbiAwLjEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9JTlNUQUxMLm1kIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL0lOU1RBTEwubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5ZDg2ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy9JTlNUQUxMLm1kCkBAIC0wLDAgKzEsNjcgQEAKK0luc3RhbGxpbmcgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIHBhY2thZ2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTm8gb2ZmaWNpYWwgYmluYXJ5IGRpc3RyaWJ1dGlvbiBwYWNrYWdlcyBhcmUgcHJvdmlkZWQgYnkgdGhlIGdmbGFncyBkZXZlbG9wZXJzLgorVGhlcmUgbWF5LCBob3dldmVyLCBiZSBiaW5hcnkgcGFja2FnZXMgYXZhaWxhYmxlIGZvciB5b3VyIE9TLiBQbGVhc2UgY29uc3VsdAorYWxzbyB0aGUgcGFja2FnZSByZXBvc2l0b3JpZXMgb2YgeW91ciBMaW51eCBkaXN0cmlidXRpb24uCisKK0ZvciBleGFtcGxlIG9uIERlYmlhbi9VYnVudHUgTGludXgsIGdmbGFncyBjYW4gYmUgaW5zdGFsbGVkIHVzaW5nIHRoZQorZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBnZmxhZ3MKKworCitDb21waWxpbmcgdGhlIHNvdXJjZSBjb2RlCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCBzeXN0ZW0gb2YgZ2ZsYWdzIGlzIHNpbmNlIHZlcnNpb24gMi4xIGJhc2VkIG9uIFtDTWFrZV0oaHR0cDovL2NtYWtlLm9yZykuCitUaGUgY29tbW9uIHN0ZXBzIHRvIGJ1aWxkLCB0ZXN0LCBhbmQgaW5zdGFsbCBzb2Z0d2FyZSBhcmUgdGhlcmVmb3JlOgorCisxLiBFeHRyYWN0IHNvdXJjZSBmaWxlcy4KKzIuIENyZWF0ZSBidWlsZCBkaXJlY3RvcnkgYW5kIGNoYW5nZSB0byBpdC4KKzMuIFJ1biBDTWFrZSB0byBjb25maWd1cmUgdGhlIGJ1aWxkIHRyZWUuCis0LiBCdWlsZCB0aGUgc29mdHdhcmUgdXNpbmcgc2VsZWN0ZWQgYnVpbGQgdG9vbC4KKzUuIFRlc3QgdGhlIGJ1aWx0IHNvZnR3YXJlLgorNi4gSW5zdGFsbCB0aGUgYnVpbHQgZmlsZXMuCisKK09uIFVuaXgtbGlrZSBzeXN0ZW1zIHdpdGggR05VIE1ha2UgYXMgYnVpbGQgdG9vbCwgdGhlc2UgYnVpbGQgc3RlcHMgY2FuIGJlCitzdW1tYXJpemVkIGJ5IHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YgY29tbWFuZHMgZXhlY3V0ZWQgaW4gYSBzaGVsbCwKK3doZXJlIGBgYCRwYWNrYWdlYGBgIGFuZCBgYGAkdmVyc2lvbmBgYCBhcmUgc2hlbGwgdmFyaWFibGVzIHdoaWNoIHJlcHJlc2VudAordGhlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGFuZCB0aGUgb2J0YWluZWQgdmVyc2lvbiBvZiB0aGUgc29mdHdhcmUuCisKKyAgICAkIHRhciB4emYgZ2ZsYWdzLSR2ZXJzaW9uLXNvdXJjZS50YXIuZ3oKKyAgICAkIGNkIGdmbGFncy0kdmVyc2lvbgorICAgICQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQKKyAgICAkIGNjbWFrZSAuLgorICAgIAorICAgICAgLSBQcmVzcyAnYycgdG8gY29uZmlndXJlIHRoZSBidWlsZCBzeXN0ZW0gYW5kICdlJyB0byBpZ25vcmUgd2FybmluZ3MuCisgICAgICAtIFNldCBDTUFLRV9JTlNUQUxMX1BSRUZJWCBhbmQgb3RoZXIgQ01ha2UgdmFyaWFibGVzIGFuZCBvcHRpb25zLgorICAgICAgLSBDb250aW51ZSBwcmVzc2luZyAnYycgdW50aWwgdGhlIG9wdGlvbiAnZycgaXMgYXZhaWxhYmxlLgorICAgICAgLSBUaGVuIHByZXNzICdnJyB0byBnZW5lcmF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgR05VIE1ha2UuCisgICAgCisgICAgJCBtYWtlCisgICAgJCBtYWtlIHRlc3QgICAgKG9wdGlvbmFsKQorICAgICQgbWFrZSBpbnN0YWxsIChvcHRpb25hbCkKKworSW4gdGhlIGZvbGxvd2luZywgb25seSBnZmxhZ3Mtc3BlY2lmaWMgQ01ha2Ugc2V0dGluZ3MgYXZhaWxhYmxlIHRvCitjb25maWd1cmUgdGhlIGJ1aWxkIGFuZCBpbnN0YWxsYXRpb24gYXJlIGRvY3VtZW50ZWQuIE5vdGUgdGhhdCBtb3N0IG9mIHRoZXNlCit2YXJpYWJsZXMgYXJlIGZvciBhZHZhbmNlZCB1c2VycyBhbmQgYmluYXJ5IHBhY2thZ2UgbWFpbnRhaW5lcnMgb25seS4KK1RoZXkgdXN1YWxseSBkbyBub3QgaGF2ZSB0byBiZSBtb2RpZmllZC4KKworCitDTWFrZSBPcHRpb24gICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ01BS0VfSU5TVEFMTF9QUkVGSVggICAgICAgIHwgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgZS5nLiwgIi91c3IvbG9jYWwiIG9uIFVuaXggYW5kICJDOlxQcm9ncmFtIEZpbGVzXGdmbGFncyIgb24gV2luZG93cy4KK0JVSUxEX1NIQVJFRF9MSUJTICAgICAgICAgICB8IFJlcXVlc3QgYnVpbGQgb2YgZHluYW1pYyBsaW5rIGxpYnJhcmllcy4KK0JVSUxEX1NUQVRJQ19MSUJTICAgICAgICAgICB8IFJlcXVlc3QgYnVpbGQgb2Ygc3RhdGljIGxpbmsgbGlicmFyaWVzLiBJbXBsaWVkIGlmIEJVSUxEX1NIQVJFRF9MSUJTIGlzIE9GRi4KK0JVSUxEX1BBQ0tBR0lORyAgICAgICAgICAgICB8IEVuYWJsZSBiaW5hcnkgcGFja2FnZSBnZW5lcmF0aW9uIHVzaW5nIENQYWNrLgorQlVJTERfVEVTVElORyAgICAgICAgICAgICAgIHwgQnVpbGQgdGVzdHMgZm9yIGV4ZWN1dGlvbiBieSBDVGVzdC4KK0JVSUxEX05DX1RFU1RTICAgICAgICAgICAgICB8IFJlcXVlc3QgaW5jbHVzaW9uIG9mIG5lZ2F0aXZlIGNvbXBpbGF0aW9uIHRlc3RzIChyZXF1aXJlcyBQeXRob24pLgorQlVJTERfQ09ORklHX1RFU1RTICAgICAgICAgIHwgUmVxdWVzdCBpbmNsdXNpb24gb2YgcGFja2FnZSBjb25maWd1cmF0aW9uIHRlc3RzIChyZXF1aXJlcyBQeXRob24pLgorQlVJTERfZ2ZsYWdzX0xJQlMgICAgICAgICAgIHwgUmVxdWVzdCBidWlsZCBvZiBtdWx0aS10aHJlYWRlZCBnZmxhZ3MgbGlicmFyaWVzIChpZiB0aHJlYWRpbmcgbGlicmFyeSBmb3VuZCkuCitCVUlMRF9nZmxhZ3Nfbm90aHJlYWRzX0xJQlMgfCBSZXF1ZXN0IGJ1aWxkIG9mIHNpbmdsZS10aHJlYWRlZCBnZmxhZ3MgbGlicmFyaWVzLgorR0ZMQUdTX05BTUVTUEFDRSAgICAgICAgICAgIHwgTmFtZSBvZiB0aGUgQysrIG5hbWVzcGFjZSB0byBiZSB1c2VkIGJ5IHRoZSBnZmxhZ3MgbGlicmFyeS4gTm90ZSB0aGF0IHRoZSBwdWJsaWMgc291cmNlIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIGluIGEgc3ViZGlyZWN0b3J5IG5hbWVkIGFmdGVyIHRoaXMgbmFtZXNwYWNlLiBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBHb29nbGUgQ29tbWFuZGxpbmUgRmxhZ3MsIHNldCB0aGlzIHZhcmlhYmxlIHRvICJnb29nbGUiLiBUaGUgZGVmYXVsdCBpcyAiZ2ZsYWdzIi4KK0dGTEFHU19JTlRUWVBFU19GT1JNQVQgICAgICB8IFN0cmluZyBpZGVudGlmeWluZyBmb3JtYXQgb2YgYnVpbHQtaW4gaW50ZWdlciB0eXBlcy4KK0dGTEFHU19JTkNMVURFX0RJUiAgICAgICAgICB8IE5hbWUgb2YgaGVhZGVycyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHJlbGF0aXZlIHRvIENNQUtFX0lOU1RBTExfUFJFRklYLgorTElCUkFSWV9JTlNUQUxMX0RJUiAgICAgICAgIHwgTmFtZSBvZiBsaWJyYXJ5IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gQ01BS0VfSU5TVEFMTF9QUkVGSVguCitJTlNUQUxMX0hFQURFUlMgICAgICAgICAgICAgfCBSZXF1ZXN0IGluc3RhbGxhdGlvbiBvZiBwdWJsaWMgaGVhZGVyIGZpbGVzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL1JFQURNRS5tZCBiL3RoaXJkX3BhcnR5L2dmbGFncy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliZDIwMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy9SRUFETUUubWQKQEAgLTAsMCArMSwyNzAgQEAKKzI0IE1hcmNoIDIwMTUKKy0tLS0tLS0tLS0tLS0KKworSSd2ZSBqdXN0IHJlbGVhc2VkIGdmbGFncyAyLjEuMi4KKworVGhpcyByZWxlYXNlIGNvbXBsZXRlcyB0aGUgbmFtZXNwYWNlIGNoYW5nZSBmaXhlcy4gSW4gcGFydGljdWxhciwKK2l0IHJlc3RvcmVzIGJpbmFyeSBBQkkgY29tcGF0aWJpbGl0eSB3aXRoIHJlbGVhc2UgdmVyc2lvbiAyLjAuCitUaGUgZGVwcmVjYXRlZCAiZ29vZ2xlIiBuYW1lc3BhY2UgaXMgYnkgZGVmYXVsdCBzdGlsbCBrZXB0IGFzCitwcmltYXJ5IG5hbWVzcGFjZSB3aGlsZSBzeW1ib2xzIGFyZSBpbXBvcnRlZCBpbnRvIHRoZSBuZXcgImdmbGFncyIgbmFtZXNwYWNlLgorVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgQ01ha2UgdmFyaWFibGUgR0ZMQUdTX05BTUVTUEFDRS4KKworT3RoZXIgZml4ZXMgb2YgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gYXJlIHJlbGF0ZWQgdG8gdGhlIChwYXRjaGVkKQorQ01ha2UgbW9kdWxlcyBGaW5kVGhyZWFkcy5jbWFrZSBhbmQgQ2hlY2tUeXBlU2l6ZS5jbWFrZS4gVGhlc2UgaGF2ZQorYmVlbiByZW1vdmVkIGFuZCBpbnN0ZWFkIHRoZSBDIGxhbmd1YWdlIGlzIGVuYWJsZWQgYWdhaW4gZXZlbiB0aG91Z2gKK2dmbGFncyBpcyB3cml0dGVuIGluIEMrKyBvbmx5LgorCitUaGlzIHJlbGVhc2UgYWxzbyBtYXJrcyB0aGUgY29tcGxldGUgbW92ZSBvZiB0aGUgZ2ZsYWdzIHByb2plY3QKK2Zyb20gR29vZ2xlIENvZGUgdG8gR2l0SHViLiBFbWFpbCBhZGRyZXNzZXMgb2Ygb3JpZ2luYWwgaXNzdWUKK3JlcG9ydGVycyBnb3QgbG9zdCBpbiB0aGUgcHJvY2Vzcy4gR2l2ZW4gdGhlIGFnZSBvZiBtb3N0IGlzc3VlIHJlcG9ydHMsCit0aGlzIHNob3VsZCBiZSBuZWdsaWdhYmxlLgorCitQbGVhc2UgcmVwb3J0IGFueSBmdXJ0aGVyIGlzc3VlcyB1c2luZyB0aGUgR2l0SHViIGlzc3VlIHRyYWNrZXIuCisKKworMzAgTWFyY2ggMjAxNAorLS0tLS0tLS0tLS0tLQorCitJJ3ZlIGp1c3QgcmVsZWFzZWQgZ2ZsYWdzIDIuMS4xLgorCitUaGlzIHJlbGVhc2UgZml4ZXMgYSBmZXcgYnVncyBpbiB0aGUgY29uZmlndXJhdGlvbiBvZiBnZmxhZ3NcX2RlY2xhcmUuaAorYW5kIGFkZHMgYSBzZXBhcmF0ZSBHRkxBR1NcX0lOQ0xVREVcX0RJUiBDTWFrZSB2YXJpYWJsZSB0byB0aGUgYnVpbGQgY29uZmlndXJhdGlvbi4KK1NldHRpbmcgR0ZMQUdTXF9OQU1FU1BBQ0UgdG8gImdvb2dsZSIgbm8gbG9uZ2VyIGNoYW5nZXMgYWxzbyB0aGUgaW5jbHVkZQorcGF0aCBvZiB0aGUgcHVibGljIGhlYWRlciBmaWxlcy4gVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiB0aGUgbGlicmFyeSB3aXRoCitvdGhlciBHb29nbGUgcHJvamVjdHMgc3VjaCBhcyBnbG9nIHdoaWNoIHN0aWxsIHVzZSB0aGUgZGVwcmVjYXRlZCAiZ29vZ2xlIgorbmFtZXNwYWNlIGZvciB0aGUgZ2ZsYWdzIGxpYnJhcnksIGJ1dCBpbmNsdWRlIGl0IGFzICJnZmxhZ3MvZ2ZsYWdzLmgiLgorCisyMCBNYXJjaCAyMDE0CistLS0tLS0tLS0tLS0tCisKK0kndmUganVzdCByZWxlYXNlZCBnZmxhZ3MgMi4xLgorCitUaGUgbWFqb3IgY2hhbmdlcyBhcmUgdGhlIHVzZSBvZiBDTWFrZSBmb3IgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gaW5zdGVhZAorb2YgdGhlIGF1dG90b29scyBhbmQgcGFja2FnaW5nIHN1cHBvcnQgdGhyb3VnaCBDUGFjay4gVGhlIGRlZmF1bHQgbmFtZXNwYWNlCitvZiBhbGwgQysrIHN5bWJvbHMgaXMgbm93ICJnZmxhZ3MiIGluc3RlYWQgb2YgImdvb2dsZSIuIFRoaXMgY2FuIGJlCitjb25maWd1cmVkIHZpYSB0aGUgR0ZMQUdTXF9OQU1FU1BBQ0UgdmFyaWFibGUuCisKK1RoaXMgcmVsZWFzZSBjb21waWxlcyB3aXRoIGFsbCBtYWpvciBjb21waWxlcnMgd2l0aG91dCB3YXJuaW5ncyBhbmQgcGFzc2VkCit0aGUgdW5pdCB0ZXN0cyBvbiAgVWJ1bnR1IDEyLjA0LCBXaW5kb3dzIDcgKFZpc3VhbCBTdHVkaW8gMjAwOCBhbmQgMjAxMCwKK0N5Z3dpbiwgTWluR1cpLCBhbmQgTWFjIE9TIFggKFhjb2RlIDUuMSkuCisKK1RoZSBTVk4gcmVwb3NpdG9yeSBvbiBHb29nbGUgQ29kZSBpcyBub3cgZnJvemVuIGFuZCByZXBsYWNlZCBieSBhIEdpdAorcmVwb3NpdG9yeSBzdWNoIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgR2l0IHN1Ym1vZHVsZSBieSBwcm9qZWN0cy4gVGhlIG1haW4KK2hvc3Rpbmcgb2YgdGhpcyBwcm9qZWN0IHJlbWFpbnMgYXQgR29vZ2xlIENvZGUuIFRoYW5rcyB0byB0aGUgZGlzdHJpYnV0ZWQKK2NoYXJhY3RlciBvZiBHaXQsIEkgY2FuIHB1c2ggKGFuZCBwdWxsKSBjaGFuZ2VzIGZyb20gYm90aCBHaXRIdWIgYW5kIEdvb2dsZSBDb2RlCitpbiBvcmRlciB0byBrZWVwIHRoZSB0d28gcHVibGljIHJlcG9zaXRvcmllcyBpbiBzeW5jLgorV2hlbiBmaXhpbmcgYW4gaXNzdWUgZm9yIGEgcHVsbCByZXF1ZXN0IHRocm91Z2ggZWl0aGVyIG9mIHRoZXNlIGhvc3RpbmcKK3BsYXRmb3JtcywgcGxlYXNlIHJlZmVyZW5jZSB0aGUgaXNzdWUgbnVtYmVyIGFzCitbZGVzY3JpYmVkIGhlcmVdKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avc3VwcG9ydC93aWtpL0lzc3VlVHJhY2tlciNJbnRlZ3JhdGlvbl93aXRoX3ZlcnNpb25fY29udHJvbCkuCitGb3IgdGhlIGZ1cnRoZXIgZGV2ZWxvcG1lbnQsIEkgYW0gZm9sbG93aW5nIHRoZQorW0dpdCBicmFuY2hpbmcgbW9kZWxdKGh0dHA6Ly9udmllLmNvbS9wb3N0cy9hLXN1Y2Nlc3NmdWwtZ2l0LWJyYW5jaGluZy1tb2RlbC8pCit3aXRoIGZlYXR1cmUgYnJhbmNoIG5hbWVzIHByZWZpeGVkIGJ5ICJmZWF0dXJlLyIgYW5kIGJ1Z2ZpeCBicmFuY2ggbmFtZXMKK3ByZWZpeGVkIGJ5ICJidWdmaXgvIiwgcmVzcGVjdGl2ZWx5LgorCitCaW5hcnkgYW5kIHNvdXJjZSBbcGFja2FnZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zY2h1aHNjaHVoL2dmbGFncy9yZWxlYXNlcykgYXJlIGF2YWlsYWJsZSBvbiBHaXRIdWIuCisKKworMTQgSmFudWFyeSAyMDE0CistLS0tLS0tLS0tLS0tLS0KKworVGhlIG1pZ3JhdGlvbiBvZiB0aGUgYnVpbGQgc3lzdGVtIHRvIENNYWtlIGlzIGFsbW9zdCBjb21wbGV0ZS4KK1doYXQgcmVtYWlucyB0byBiZSBkb25lIGlzIHJld3JpdGluZyB0aGUgdGVzdHMgaW4gUHl0aG9uIHN1Y2ggdGhleSBjYW4gYmUKK2V4ZWN1dGVkIG9uIG5vbi1Vbml4IHBsYXRmb3JtcyBhbmQgc3BsaXR0aW5nIHRoZW0gdXAgaW50byBzZXBhcmF0ZSBDVGVzdCB0ZXN0cy4KK1Rob3VnaCBtZXJnaW5nIHRoZXNlIGNoYW5nZXMgaW50byB0aGUgbWFzdGVyIGJyYW5jaCB5ZXQgcmVtYWlucyB0byBiZSBkb25lLAoraXQgaXMgcmVjb21tZW5kZWQgdG8gYWxyZWFkeSBzdGFydCB1c2luZyB0aGUKK1tjbWFrZS1taWdyYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9zY2h1aHNjaHVoL2dmbGFncy90cmVlL2NtYWtlLW1pZ3JhdGlvbikgYnJhbmNoLgorCisKKzIwIEFwcmlsIDIwMTMKKy0tLS0tLS0tLS0tLS0KKworTW9yZSB0aGFuIGEgeWVhciBoYXMgcGFzdCBzaW5jZSBJIChBbmRyZWFzKSB0b29rIG92ZXIgdGhlIG1haW50ZW5hbmNlIGZvcgorYGdmbGFnc2AuIE9ubHkgZmV3IG1pbm9yIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgc2luY2UgdGhlbiwgbXVjaCB0byBteSByZWdyZXQuCitUbyBnZXQgbW9yZSBpbnZvbHZlZCBhbmQgc3RpbXVsYXRlIHBhcnRpY2lwYXRpb24gaW4gdGhlIGZ1cnRoZXIKK2RldmVsb3BtZW50IG9mIHRoZSBsaWJyYXJ5LCBJIG1vdmVkIHRoZSBwcm9qZWN0IHNvdXJjZSBjb2RlIHRvZGF5IHRvCitbR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vc2NodWhzY2h1aC9nZmxhZ3MpLgorSSBiZWxpZXZlIHRoYXQgdGhlIHN0cmVuZ3RocyBvZiBbR2l0XShodHRwOi8vZ2l0LXNjbS5jb20vKSB3aWxsIGFsbG93IGZvciBiZXR0ZXIgY29tbXVuaXR5IGNvbGxhYm9yYXRpb24KK2FzIHdlbGwgYXMgZWFzZSB0aGUgaW50ZWdyYXRpb24gb2YgY2hhbmdlcyBtYWRlIGJ5IG90aGVycy4gSSBlbmNvdXJhZ2UgZXZlcnlvbmUKK3dobyB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8gc2VuZCBtZSBwdWxsIHJlcXVlc3RzLgorR2l0J3MgbGlnaHR3ZWlnaHQgZmVhdHVyZSBicmFuY2hlcyB3aWxsIGFsc28gcHJvdmlkZSB0aGUgcmlnaHQgdG9vbCBmb3IgbW9yZQorcmFkaWNhbCBjaGFuZ2VzIHdoaWNoIHNob3VsZCBvbmx5IGJlIG1lcmdlZCBiYWNrIGludG8gdGhlIG1hc3RlciBicmFuY2gKK2FmdGVyIHRoZXNlIGFyZSBjb21wbGV0ZSBhbmQgaW1wbGVtZW50IHRoZSBkZXNpcmVkIGJlaGF2aW9yLgorCitUaGUgU1ZOIHJlcG9zaXRvcnkgcmVtYWlucyBhY2Nlc3NpYmxlIGF0IEdvb2dsZSBDb2RlIGFuZCBJIHdpbGwga2VlcCB0aGUKK21hc3RlciBicmFuY2ggb2YgdGhlIEdpdCByZXBvc2l0b3J5IGhvc3RlZCBhdCBHaXRIdWIgYW5kIHRoZSB0cnVuayBvZiB0aGUKK1N1YnZlcnNpb24gcmVwb3NpdG9yeSBzeW5jaHJvbml6ZWQuIEluaXRpYWxseSwgSSB3YXMgZ29pbmcgdG8gc2ltcGx5IHN3aXRjaCB0aGUKK0dvb2dsZSBDb2RlIHByb2plY3QgdG8gR2l0LCBidXQgaW4gdGhpcyBjYXNlIHRoZSBTVk4gcmVwb3NpdG9yeSB3b3VsZCBiZQorZnJvemVuIGFuZCBmb3JjZSBldmVyeW9uZSB3aG8gd291bGQgbGlrZSB0aGUgbGF0ZXN0IGRldmVsb3BtZW50IGNoYW5nZXMgdG8KK3VzZSBHaXQgYXMgd2VsbC4gVGhlcmVmb3JlIEkgZGVjaWRlZCB0byBob3N0IHRoZSBwdWJsaWMgR2l0IHJlcG9zaXRvcnkgYXQgR2l0SHViCitpbnN0ZWFkLgorCitQbGVhc2UgY29udGludWUgdG8gcmVwb3J0IGFueSBpc3N1ZXMgd2l0aCBnZmxhZ3Mgb24gR29vZ2xlIENvZGUuIFRoZSBHaXRIdWIgcHJvamVjdCB3aWxsCitvbmx5IGJlIHVzZWQgdG8gaG9zdCB0aGUgR2l0IHJlcG9zaXRvcnkuCisKK09uZSBtYWpvciBjaGFuZ2Ugb2YgdGhlIHByb2plY3Qgc3RydWN0dXJlIEkgaGF2ZSBpbiBtaW5kIGZvciB0aGUgbmV4dCB3ZWVrcworaXMgdGhlIG1pZ3JhdGlvbiBmcm9tIGF1dG90b29scyB0byBbQ01ha2VdKGh0dHA6Ly93d3cuY21ha2Uub3JnLykuCitDaGVjayBvdXQgdGhlICh1bnN0YWJsZSEpCitbY21ha2UtbWlncmF0aW9uXShodHRwczovL2dpdGh1Yi5jb20vc2NodWhzY2h1aC9nZmxhZ3MvdHJlZS9jbWFrZS1taWdyYXRpb24pCiticmFuY2ggb24gR2l0SHViIGZvciBkZXRhaWxzLgorCisKKzI1IEphbnVhcnkgMjAxMgorLS0tLS0tLS0tLS0tLS0tCisKK0kndmUganVzdCByZWxlYXNlZCBnZmxhZ3MgMi4wLgorCitUaGUgYGdvb2dsZS1nZmxhZ3NgIHByb2plY3QgaGFzIGJlZW4gcmVuYW1lZCB0byBgZ2ZsYWdzYC4gIEkKKyhjc2lsdmVycykgYW0gc3RlcHBpbmcgZG93biBhcyBtYWludGFpbmVyLCB0byBiZSByZXBsYWNlZCBieSBBbmRyZWFzCitTY2h1aC4gIFdlbGNvbWUgdG8gdGhlIHRlYW0sIEFuZHJlYXMhICBJJ3ZlIHNlZW4gdGhlIGVuZXJneSB5b3UgaGF2ZQorYXJvdW5kIGdmbGFncyBhbmQgdGhlIGlkZWFzIHlvdSBoYXZlIGZvciB0aGUgcHJvamVjdCBnb2luZyBmb3J3YXJkLAorYW5kIGxvb2sgZm9yd2FyZCB0byBoYXZpbmcgeW91IG9uIHRoZSB0ZWFtLgorCitJIGJ1bXBlZCB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgdXAgdG8gMiB0byByZWZsZWN0IHRoZSBuZXcgY29tbXVuaXR5Citvd25lcnNoaXAgb2YgdGhlIHByb2plY3QuICBBbGwgdGhlIFtjaGFuZ2VzXShDaGFuZ2VMb2cudHh0KQorYXJlIHJlbGF0ZWQgdG8gdGhlIHJlbmFtaW5nLiAgVGhlcmUgYXJlIG5vIGZ1bmN0aW9uYWwgY2hhbmdlcyBmcm9tCitnZmxhZ3MgMS43LiAgSW4gcGFydGljdWxhciwgSSd2ZSBrZXB0IHRoZSBjb2RlIGluIHRoZSBuYW1lc3BhY2UKK2Bnb29nbGVgLCB0aG91Z2ggaW4gYSBmdXR1cmUgdmVyc2lvbiBpdCBzaG91bGQgYmUgcmVuYW1lZCB0byBgZ2ZsYWdzYC4KK0kndmUgYWxzbyBrZXB0IHRoZSBgL3Vzci9sb2NhbC9pbmNsdWRlL2dvb2dsZS9gIHN1YmRpcmVjdG9yeSBhcworc3lub255bSBvZiBgL3Vzci9sb2NhbC9pbmNsdWRlL2dmbGFncy9gLCB0aG91Z2ggdGhlIGZvcm1lciBuYW1lIGhhcworYmVlbiBvYnNvbGV0ZSBmb3Igc29tZSB0aW1lIG5vdy4KKworCisxOCBKYW51YXJ5IDIwMTEKKy0tLS0tLS0tLS0tLS0tLQorCitUaGUgYGdvb2dsZS1nZmxhZ3NgIEdvb2dsZSBDb2RlIHBhZ2UgaGFzIGJlZW4gcmVuYW1lZCB0bworYGdmbGFnc2AsIGluIHByZXBhcmF0aW9uIGZvciB0aGUgcHJvamVjdCBiZWluZyByZW5hbWVkIHRvCitgZ2ZsYWdzYC4gIEluIHRoZSBjb21pbmcgd2Vla3MsIEknbGwgYmUgc3RlcHBpbmcgZG93biBhcworbWFpbnRhaW5lciBmb3IgdGhlIGdmbGFncyBwcm9qZWN0LCBhbmQgYXMgcGFydCBvZiB0aGF0IEdvb2dsZSBpcworcmVsaW5xdWlzaGluZyBvd25lcnNoaXAgb2YgdGhlIHByb2plY3Q7IGl0IHdpbGwgbm93IGJlIGVudGlyZWx5Citjb21tdW5pdHkgcnVuLiAgVGhlIG5hbWUgY2hhbmdlIHJlZmxlY3RzIHRoYXQgc2hpZnQuCisKKworMjAgRGVjZW1iZXIgMjAxMQorLS0tLS0tLS0tLS0tLS0tLQorCitJJ3ZlIGp1c3QgcmVsZWFzZWQgZ2ZsYWdzIDEuNy4gIFRoaXMgaXMgYSBtaW5vciByZWxlYXNlOyB0aGUgbWFqb3IKK2NoYW5nZSBpcyB0aGF0IGBDb21tYW5kTGluZUZsYWdJbmZvYCBub3cgZXhwb3J0cyB0aGUgYWRkcmVzcyBpbiBtZW1vcnkKK3doZXJlIHRoZSBmbGFnIGlzIGxvY2F0ZWQuICBUaGVyZSBoYXMgYWxzbyBiZWVuIGEgYnVnZml4IGludm9sdmluZwordmVyeSBsb25nIC0taGVscCBzdHJpbmdzLCBhbmQgc29tZSBvdGhlciBtaW5vciBbY2hhbmdlc10oQ2hhbmdlTG9nLnR4dCkuCisKKzI5IEp1bHkgMjAxMQorLS0tLS0tLS0tLS0tCisKK0kndmUganVzdCByZWxlYXNlZCBnZmxhZ3MgMS42LiAgVGhlIG1ham9yIG5ldyBmZWF0dXJlIGluIHRoaXMgcmVsZWFzZQoraXMgc3VwcG9ydCBmb3Igc2V0dGluZyB2ZXJzaW9uIGluZm8sIHNvIHRoYXQgLS12ZXJzaW9uIGRvZXMgc29tZXRoaW5nCit1c2VmdWwuCisKK09uZSBtaW5vciBjaGFuZ2UgaGFzIHJlcXVpcmVkIGJ1bXBpbmcgdGhlIGxpYnJhcnkgbnVtYmVyOgorYFJlcGFyc2VDb21tYW5kbGluZUZsYWdzYCBub3cgcmV0dXJucyBgdm9pZGAgaW5zdGVhZCBvZiBgaW50YCAodGhlIGludAorcmV0dXJuIHZhbHVlIHdhcyBhbHdheXMgbWVhbmluZ2xlc3MpLiAgVGhvdWdoIEkgZG91YnQgYW55b25lIGV2ZXIgdXNlZAordGhpcyAobWVhbmluZ2xlc3MpIHJldHVybiB2YWx1ZSwgdGVjaG5pY2FsbHkgaXQncyBhIGNoYW5nZSB0byB0aGUgQUJJCit0aGF0IHJlcXVpcmVzIGEgdmVyc2lvbiBidW1wLiAgQSBiaXQgc2FkLgorCitUaGVyZSdzIGFsc28gYSBwcm9jZWR1cmFsIGNoYW5nZSB3aXRoIHRoaXMgcmVsZWFzZTogSSd2ZSBjaGFuZ2VkIHRoZQoraW50ZXJuYWwgdG9vbHMgdXNlZCB0byBpbnRlZ3JhdGUgR29vZ2xlLXN1cHBsaWVkIHBhdGNoZXMgZm9yIGdmbGFncworaW50byB0aGUgb3BlbnNvdXJjZSByZWxlYXNlLiAgVGhlc2UgbmV3IHRvb2xzIHNob3VsZCByZXN1bHQgaW4gbW9yZQorZnJlcXVlbnQgdXBkYXRlcyB3aXRoIGJldHRlciBjaGFuZ2UgZGVzY3JpcHRpb25zLiAgVGhleSB3aWxsIGFsc28KK3Jlc3VsdCBpbiBmdXR1cmUgYENoYW5nZUxvZ2AgZW50cmllcyBiZWluZyBtdWNoIG1vcmUgdmVyYm9zZSAoZm9yIGJldHRlcgorb3IgZm9yIHdvcnNlKS4KKworU2VlIHRoZSBbQ2hhbmdlTG9nXShDaGFuZ2VMb2cudHh0KSBmb3IgYSBmdWxsIGxpc3Qgb2YgY2hhbmdlcyBmb3IgdGhpcyByZWxlYXNlLgorCisyNCBKYW51YXJ5IDIwMTEKKy0tLS0tLS0tLS0tLS0tLQorCitJJ3ZlIGp1c3QgcmVsZWFzZWQgZ2ZsYWdzIDEuNS4gIFRoaXMgcmVsZWFzZSBoYXMgb25seSBtaW5vciBjaGFuZ2VzCitmcm9tIDEuNCwgaW5jbHVkaW5nIHNvbWUgc2xpZ2h0bHkgYmV0dGVyIHJlcG9ydGluZyBpbiAtLWhlbHAsIGFuZAorYW4gbmV3IG1lbW9yeS1jbGVhbnVwIGZ1bmN0aW9uIHRoYXQgY2FuIGhlbHAgd2hlbiBydW5uaW5nIGdmbGFncy11c2luZworbGlicmFyaWVzIHVuZGVyIHZhbGdyaW5kLiAgVGhlIG1ham9yIGNoYW5nZSBpcyB0byBmaXggdXAgdGhlIG1hY3JvcworKGBERUZJTkVfYm9vbGAgYW5kIHRoZSBsaWtlKSB0byB3b3JrIG1vcmUgcmVsaWFibHkgaW5zaWRlIG5hbWVzcGFjZXMuCisKK0lmIHlvdSBoYXZlIG5vdCBoYWQgYSBwcm9ibGVtIHdpdGggdGhlc2UgbWFjcm9zLCBhbmQgZG9uJ3QgbmVlZCBhbnkgb2YKK3RoZSBvdGhlciBjaGFuZ2VzIGRlc2NyaWJlZCwgdGhlcmUgaXMgbm8gbmVlZCB0byB1cGdyYWRlLiAgU2VlIHRoZQorW0NoYW5nZUxvZ10oQ2hhbmdlTG9nLnR4dCkgZm9yIGEgZnVsbCBsaXN0IG9mIGNoYW5nZXMgZm9yIHRoaXMgcmVsZWFzZS4KKworMTEgT2N0b2JlciAyMDEwCistLS0tLS0tLS0tLS0tLS0KKworSSd2ZSBqdXN0IHJlbGVhc2VkIGdmbGFncyAxLjQuICBUaGlzIHJlbGVhc2UgaGFzIG9ubHkgbWlub3IgY2hhbmdlcworZnJvbSAxLjMsIGluY2x1ZGluZyBzb21lIGRvY3VtZW50YXRpb24gdHdlYWtzIGFuZCBzb21lIHdvcmsgdG8gbWFrZQordGhlIGxpYnJhcnkgc21hbGxlci4gIElmIDEuMyBpcyB3b3JraW5nIHdlbGwgZm9yIHlvdSwgdGhlcmUncyBubworcGFydGljdWxhciByZWFzb24gdG8gdXBncmFkZS4KKworNCBKYW51YXJ5IDIwMTAKKy0tLS0tLS0tLS0tLS0tCisKK0kndmUganVzdCByZWxlYXNlZCBnZmxhZ3MgMS4zLiAgZ2ZsYWdzIG5vdyBjb21waWxlcyB1bmRlciBNU1ZDLCBhbmQKK2FsbCB0ZXN0cyBwYXNzLiAgSSAqKnJlYWxseSoqIG5ldmVyIHRob3VnaHQgbm9uLXVuaXgteSBXaW5kb3dzIGZvbGtzCit3b3VsZCB3YW50IGdmbGFncywgYnV0IGF0IGxlYXN0IHNvbWUgb2YgdGhlbSBkby4KKworVGhlIG1ham9yIG5ld3MsIHRob3VnaCwgaXMgdGhhdCBJJ3ZlIHNlcGFyYXRlZCBvdXQgdGhlIHB5dGhvbiBwYWNrYWdlCitpbnRvIGl0cyBvd24gbGlicmFyeSwgW3B5dGhvbi1nZmxhZ3NdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9weXRob24tZ2ZsYWdzKS4KK0lmIHlvdSdyZSBpbnRlcmVzdGVkIGluIHRoZSBQeXRob24gdmVyc2lvbiBvZiBnZmxhZ3MsIHRoYXQncyB0aGUgcGxhY2UgdG8KK2dldCBpdCBub3cuCisKKzEwIFNlcHRlbWJlciAyMDA5CistLS0tLS0tLS0tLS0tLS0tLQorCitJJ3ZlIGp1c3QgcmVsZWFzZWQgZ2ZsYWdzIDEuMi4gIFRoZSBtYWpvciBjaGFuZ2UgZnJvbSBnZmxhZ3MgMS4xIGlzIGl0Citub3cgY29tcGlsZXMgdW5kZXIgTWluR1cgKGFzIHdlbGwgYXMgY3lnd2luKSwgYW5kIGFsbCB0ZXN0cyBwYXNzLiAgSQorbmV2ZXIgdGhvdWdodCBXaW5kb3dzIGZvbGtzIHdvdWxkIHdhbnQgdW5peC1zdHlsZSBjb21tYW5kLWxpbmUgZmxhZ3MsCitzaW5jZSB0aGV5J3JlIHNvIGRpZmZlcmVudCBmcm9tIHRoZSBXaW5kb3dzIHN0eWxlLCBidXQgSSBndWVzcyBJIHdhcword3JvbmchCisKK1RoZSBvdGhlciBjaGFuZ2VzIGFyZSBtaW5vciwgc3VjaCBhcyBzdXBwb3J0IGZvciAtLWh0bWx4bWwgaW4gdGhlCitweXRob24gdmVyc2lvbiBvZiBnZmxhZ3MuCisKKzE1IEFwcmlsIDIwMDkKKy0tLS0tLS0tLS0tLS0KKworSSd2ZSBqdXN0IHJlbGVhc2VkIGdmbGFncyAxLjEuICBJdCBoYXMgb25seSBtaW5vciBjaGFuZ2VzIGZkcm9tIGdmbGFncworMS4wIChzZWUgdGhlIFtDaGFuZ2VMb2ddKENoYW5nZUxvZy50eHQpIGZvciBkZXRhaWxzKS4KK1RoZSBtYWpvciBjaGFuZ2UgaXMgdGhhdCBJIG1vdmVkIHRvIGEgbmV3IHN5c3RlbSBmb3IgY3JlYXRpbmcgLmRlYiBhbmQgLnJwbSBmaWxlcy4KK1RoaXMgYWxsb3dzIG1lIHRvIGNyZWF0ZSB4ODZcXzY0IGRlYiBhbmQgcnBtIGZpbGVzLgorCitJbiB0aGUgcHJvY2VzcyBvZiBtb3ZpbmcgdG8gdGhpcyBuZXcgc3lzdGVtLCBJIG5vdGljZWQgYW4KK2luY29uc2lzdGVuY3k6IHRoZSB0YXIuZ3ogYW5kIC5ycG0gZmlsZXMgY3JlYXRlZCBsaWJyYXJpZXMgbmFtZWQKK2xpYmdmbGFncy5zbywgYnV0IHRoZSBkZWIgZmlsZSBjcmVhdGVkIGxpYmdvb2dsZS1nZmxhZ3Muc28uICBJIGhhdmUKK2ZpeGVkIHRoZSBkZWIgZmlsZSB0byBjcmVhdGUgbGlicmFyaWVzIGxpa2UgdGhlIG90aGVycy4gIEknbSBubyBleHBlcnQKK2luIGRlYmlhbiBwYWNrYWdpbmcsIGJ1dCBJIGJlbGlldmUgdGhpcyBoYXMgY2F1c2VkIHRoZSBwYWNrYWdlIG5hbWUgdG8KK2NoYW5nZSBhcyB3ZWxsLiAgUGxlYXNlIGxldCBtZSBrbm93IChhdAorW1ttYWlsdG86Z29vZ2xlLWdmbGFnc0Bnb29nbGVncm91cHMuY29tXShtYWlsdG86Z29vZ2xlLWdmbGFnc0Bnb29nbGVncm91cHMuY29tKQorZ29vZ2xlLWdmbGFnc0Bnb29nbGVncm91cHMuY29tXSkgaWYgdGhpcyBjYXVzZXMgcHJvYmxlbXMgZm9yIHlvdSAtLQorZXNwZWNpYWxseSBpZiB5b3Uga25vdyBvZiBhIGZpeCEgIEkgd291bGQgYmUgaGFwcHkgdG8gY2hhbmdlIHRoZSBkZWIKK3BhY2thZ2VzIHRvIGFkZCBzeW1saW5rcyBmcm9tIHRoZSBvbGQgbGlicmFyeSBuYW1lIHRvIHRoZSBuZXcKKyhsaWJnb29nbGUtZ2ZsYWdzLnNvIC0+IGxpYmdmbGFncy5zbyksIGJ1dCB0aGF0IGlzIGJleW9uZCBteSBrbm93bGVkZ2UKK29mIGhvdyB0byBtYWtlIC5kZWJzLgorCitJZiB5b3UndmUgdHJpZWQgdG8gaW5zdGFsbCBhIC5ycG0gb3IgLmRlYiBhbmQgaXQgZG9lc24ndCB3b3JrIGZvciB5b3UsCitsZXQgbWUga25vdy4gIEknbSBleGNpdGVkIHRvIGZpbmFsbHkgaGF2ZSA2NC1iaXQgcGFja2FnZSBmaWxlcywgYnV0Cit0aGVyZSBtYXkgc3RpbGwgYmUgc29tZSB3cmlua2xlcyBpbiB0aGUgbmV3IHN5c3RlbSB0byBpcm9uIG91dC4KKworMSBPY3RvYmVyIDIwMDgKKy0tLS0tLS0tLS0tLS0tCisKK2dmbGFncyAxLjByYzIgd2FzIG91dCBmb3IgYSBmZXcgd2Vla3Mgd2l0aG91dCBhbnkgaXNzdWVzLCBzbyBnZmxhZ3MKKzEuMCBpcyBub3cgcmVsZWFzZWQuICBUaGlzIGlzIG11Y2ggbGlrZSBnZmxhZ3MgMC45LiAgVGhlIG1ham9yIGNoYW5nZQoraXMgdGhhdCB0aGUgLmggZmlsZXMgaGF2ZSBiZWVuIG1vdmVkIGZyb20gYC91c3IvaW5jbHVkZS9nb29nbGVgIHRvCitgL3Vzci9pbmNsdWRlL2dmbGFnc2AuICBXaGlsZSBJIGhhdmUgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkKK2ZvcndhcmRpbmcgaGVhZGVkcyBpbiBwbGFjZSwgcGxlYXNlIHJld3JpdGUgZXhpc3RpbmcgY29kZSB0byBzYXkKK2BgYAorICAgI2luY2x1ZGUgPGdmbGFncy9nZmxhZ3MuaD4KK2BgYAoraW5zdGVhZCBvZgorYGBgCisgICAjaW5jbHVkZSA8Z29vZ2xlL2dmbGFncy5oPgorYGBgCisKK0kndmUga2VwdCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgdG8gZ29vZ2xlLiAgWW91IGNhbiBzdGlsbCBjaGFuZ2Ugd2l0aAord2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZyB0byB0aGUgY29uZmlndXJlIHNjcmlwdCAoYC4vY29uZmlndXJlCistLWhlbHBgIHRvIHNlZSB0aGUgZmxhZ3MpLiAgSWYgeW91IGhhdmUgZmVlZGJhY2sgYXMgdG8gd2hldGhlciB0aGUKK2RlZmF1bHQgbmFtZXNwYWNlIHNob3VsZCBjaGFuZ2UgdG8gZ2ZsYWdzLCB3aGljaCB3b3VsZCBiZSBhCitub24tYmFja3dhcmRzLWNvbXBhdGlibGUgY2hhbmdlLCBzZW5kIG1haWwgdG8KK2Bnb29nbGUtZ2ZsYWdzQGdvb2dsZWdyb3Vwcy5jb21gIQorCitWZXJzaW9uIDEuMCBhbHNvIGhhcyBzb21lIG5lYXQgbmV3IGZlYXR1cmVzLCBsaWtlIHN1cHBvcnQgZm9yIGJhc2gKK2NvbW1hbmRsaW5lLWNvbXBsZXRpb24gb2YgaGVscCBmbGFncy4gIFNlZSB0aGUgW0NoYW5nZUxvZ10oQ2hhbmdlTG9nLnR4dCkKK2ZvciBtb3JlIGRldGFpbHMuCisKK0lmIEkgZG9uJ3QgaGVhciBhbnkgYmFkIG5ld3MgZm9yIGEgZmV3IHdlZWtzLCBJJ2xsIHJlbGVhc2UgMS4wLWZpbmFsLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL2NtYWtlL1JFQURNRV9ydW50aW1lLnR4dCBiL3RoaXJkX3BhcnR5L2dmbGFncy9jbWFrZS9SRUFETUVfcnVudGltZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1NTZiMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy9jbWFrZS9SRUFETUVfcnVudGltZS50eHQKQEAgLTAsMCArMSw0IEBACitUaGlzIHBhY2thZ2UgY29udGFpbnMgcnVudGltZSBsaWJyYXJpZXMgb25seSB3aGljaCBhcmUgcmVxdWlyZWQKK2J5IGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGVzZSBsaWJyYXJpZXMgZm9yIHRoZSBjb21tYW5kbGluZSBmbGFncworcHJvY2Vzc2luZy4gSWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBzdWNoIGFwcGxpY2F0aW9uLCBkb3dubG9hZAorYW5kIGluc3RhbGwgdGhlIGRldmVsb3BtZW50IHBhY2thZ2UgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9jbWFrZS9jb25maWcuY21ha2UuaW4gYi90aGlyZF9wYXJ0eS9nZmxhZ3MvY21ha2UvY29uZmlnLmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDE5YzIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvY21ha2UvY29uZmlnLmNtYWtlLmluCkBAIC0wLDAgKzEsMTExIEBACisjIyBnZmxhZ3MgQ01ha2UgY29uZmlndXJhdGlvbiBmaWxlCisKKyMgbGlicmFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uCitzZXQgKEBQQUNLQUdFX05BTUVAX1ZFUlNJT05fU1RSSU5HICJAUEFDS0FHRV9WRVJTSU9OQCIpCitzZXQgKEBQQUNLQUdFX05BTUVAX1ZFUlNJT05fTUFKT1IgIEBQQUNLQUdFX1ZFUlNJT05fTUFKT1JAKQorc2V0IChAUEFDS0FHRV9OQU1FQF9WRVJTSU9OX01JTk9SICBAUEFDS0FHRV9WRVJTSU9OX01JTk9SQCkKK3NldCAoQFBBQ0tBR0VfTkFNRUBfVkVSU0lPTl9QQVRDSCAgQFBBQ0tBR0VfVkVSU0lPTl9QQVRDSEApCisKKyMgaW1wb3J0IHRhcmdldHMKK2luY2x1ZGUgKCIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9L0BQQUNLQUdFX05BTUVALWV4cG9ydC5jbWFrZSIpCisKKyMgaW5zdGFsbGF0aW9uIHByZWZpeAorZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudCAoQ01BS0VfQ1VSUkVOVF9MSVNUX0RJUiAiJHtDTUFLRV9DVVJSRU5UX0xJU1RfRklMRX0iIFBBVEgpCitnZXRfZmlsZW5hbWVfY29tcG9uZW50IChfSU5TVEFMTF9QUkVGSVggIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vQElOU1RBTExfUFJFRklYX1JFTDJDT05GSUdfRElSQCIgQUJTT0xVVEUpCisKKyMgaW5jbHVkZSBkaXJlY3RvcnkKKyMKKyMgTmV3ZXIgdmVyc2lvbnMgb2YgQ01ha2Ugc2V0IHRoZSBJTlRFUkZBQ0VfSU5DTFVERV9ESVJFQ1RPUklFUyBwcm9wZXJ0eQorIyBvZiB0aGUgaW1wb3J0ZWQgdGFyZ2V0cy4gSXQgaXMgaGVuY2Ugbm90IG5lY2Vzc2FyeSB0byBhZGQgdGhpcyBwYXRoCisjIG1hbnVhbGx5IHRvIHRoZSBpbmNsdWRlIHNlYXJjaCBwYXRoIGZvciB0YXJnZXRzIHdoaWNoIGxpbmsgdG8gZ2ZsYWdzLgorc2V0IChAUEFDS0FHRV9OQU1FQF9JTkNMVURFX0RJUiAiJHtfSU5TVEFMTF9QUkVGSVh9L0BJTkNMVURFX0lOU1RBTExfRElSQCIpCisKKyMgZGVmYXVsdCBzZXR0aW5ncworaWYgKE5PVCBERUZJTkVEIEBQQUNLQUdFX05BTUVAX1NIQVJFRCkKKyAgaWYgKFRBUkdFVCBAUEFDS0FHRV9OQU1FQC1zdGF0aWMgT1IgVEFSR0VUIEBQQUNLQUdFX05BTUVAX25vdGhyZWFkcy1zdGF0aWMpCisgICAgc2V0IChAUEFDS0FHRV9OQU1FQF9TSEFSRUQgRkFMU0UpCisgIGVsc2UgKCkKKyAgICBzZXQgKEBQQUNLQUdFX05BTUVAX1NIQVJFRCBUUlVFKQorICBlbmRpZiAoKQorZW5kaWYgKCkKK2lmIChOT1QgREVGSU5FRCBAUEFDS0FHRV9OQU1FQF9OT1RIUkVBRFMpCisgIGlmIChUQVJHRVQgQFBBQ0tBR0VfTkFNRUAtc3RhdGljIE9SIFRBUkdFVCBAUEFDS0FHRV9OQU1FQC1zaGFyZWQpCisgICAgc2V0IChAUEFDS0FHRV9OQU1FQF9OT1RIUkVBRFMgRkFMU0UpCisgIGVsc2UgKCkKKyAgICBzZXQgKEBQQUNLQUdFX05BTUVAX05PVEhSRUFEUyBUUlVFKQorICBlbmRpZiAoKQorZW5kaWYgKCkKKworIyBjaG9vc2UgaW1wb3J0ZWQgbGlicmFyeSB0YXJnZXQKK2lmIChOT1QgQFBBQ0tBR0VfTkFNRUBfVEFSR0VUKQorICBpZiAoQFBBQ0tBR0VfTkFNRUBfU0hBUkVEKQorICAgIGlmIChAUEFDS0FHRV9OQU1FQF9OT1RIUkVBRFMpCisgICAgICBzZXQgKEBQQUNLQUdFX05BTUVAX1RBUkdFVCBAUEFDS0FHRV9OQU1FQF9ub3RocmVhZHMtc2hhcmVkKQorICAgIGVsc2UgKCkKKyAgICAgIHNldCAoQFBBQ0tBR0VfTkFNRUBfVEFSR0VUIEBQQUNLQUdFX05BTUVALXNoYXJlZCkKKyAgICBlbmRpZiAoKQorICBlbHNlICgpCisgICAgaWYgKEBQQUNLQUdFX05BTUVAX05PVEhSRUFEUykKKyAgICAgIHNldCAoQFBBQ0tBR0VfTkFNRUBfVEFSR0VUIEBQQUNLQUdFX05BTUVAX25vdGhyZWFkcy1zdGF0aWMpCisgICAgZWxzZSAoKQorICAgICAgc2V0IChAUEFDS0FHRV9OQU1FQF9UQVJHRVQgQFBBQ0tBR0VfTkFNRUAtc3RhdGljKQorICAgIGVuZGlmICgpCisgIGVuZGlmICgpCitlbmRpZiAoKQoraWYgKE5PVCBUQVJHRVQgJHtAUEFDS0FHRV9OQU1FQF9UQVJHRVR9KQorICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiWW91ciBAUEFDS0FHRV9OQU1FQCBpbnN0YWxsYXRpb24gZG9lcyBub3QgY29udGFpbiBhICR7QFBBQ0tBR0VfTkFNRUBfVEFSR0VUfSBsaWJyYXJ5IHRhcmdldCEiCisgICAgICAgICAgICAgICAgICAgICAgICIgVHJ5IGEgZGlmZmVyZW50IGNvbWJpbmF0aW9uIG9mIEBQQUNLQUdFX05BTUVAX1NIQVJFRCBhbmQgQFBBQ0tBR0VfTkFNRUBfTk9USFJFQURTLiIpCitlbmRpZiAoKQorCisjIGFkZCBtb3JlIGNvbnZlbmllbnQgIkBQQUNLQUdFX05BTUVAIiBpbXBvcnQgdGFyZ2V0CitpZiAoTk9UIFRBUkdFVCBAUEFDS0FHRV9OQU1FQCkKKyAgaWYgKEBQQUNLQUdFX05BTUVAX1NIQVJFRCkKKyAgICBhZGRfbGlicmFyeSAoQFBBQ0tBR0VfTkFNRUAgU0hBUkVEIElNUE9SVEVEKQorICBlbHNlICgpCisgICAgYWRkX2xpYnJhcnkgKEBQQUNLQUdFX05BTUVAIFNUQVRJQyBJTVBPUlRFRCkKKyAgZW5kaWYgKCkKKyAgIyBJTlRFUkZBQ0VfSU5DTFVERV9ESVJFQ1RPUklFUworICBnZXRfdGFyZ2V0X3Byb3BlcnR5IChfQFBBQ0tBR0VfTkFNRUBfSU5DTFVERVMgJHtAUEFDS0FHRV9OQU1FQF9UQVJHRVR9IElOVEVSRkFDRV9JTkNMVURFX0RJUkVDVE9SSUVTKQorICBpZiAoX0BQQUNLQUdFX05BTUVAX0lOQ0xVREVTKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhAUEFDS0FHRV9OQU1FQCBQUk9QRVJUSUVTCisgICAgICBJTlRFUkZBQ0VfSU5DTFVERV9ESVJFQ1RPUklFUyAiJHtfQFBBQ0tBR0VfTkFNRUBfSU5DTFVERVN9IgorICAgICkKKyAgZW5kaWYgKCkKKyAgdW5zZXQgKF9AUEFDS0FHRV9OQU1FQF9JTkNMVURFUykKKyAgIyBzZXQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgIGdldF90YXJnZXRfcHJvcGVydHkgKF9AUEFDS0FHRV9OQU1FQF9DT05GSUdVUkFUSU9OUyAke0BQQUNLQUdFX05BTUVAX1RBUkdFVH0gSU1QT1JURURfQ09ORklHVVJBVElPTlMpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyAoQFBBQ0tBR0VfTkFNRUAgUFJPUEVSVElFUyBJTVBPUlRFRF9DT05GSUdVUkFUSU9OUyAiJHtfQFBBQ0tBR0VfTkFNRUBfQ09ORklHVVJBVElPTlN9IikKKyAgZm9yZWFjaCAoX0BQQUNLQUdFX05BTUVAX0NPTkZJRyBJTiBMSVNUUyBfQFBBQ0tBR0VfTkFNRUBfQ09ORklHVVJBVElPTlMpCisgICAgIyBJTVBPUlRFRF9MT0NBVElPTl88Y29uZmlnPgorICAgIGdldF90YXJnZXRfcHJvcGVydHkgKF9AUEFDS0FHRV9OQU1FQF9MT0NBVElPTiAke0BQQUNLQUdFX05BTUVAX1RBUkdFVH0gSU1QT1JURURfTE9DQVRJT05fJHtfQFBBQ0tBR0VfTkFNRUBfQ09ORklHfSkKKyAgICBpZiAoX0BQQUNLQUdFX05BTUVAX0xPQ0FUSU9OKQorICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKEBQQUNLQUdFX05BTUVAIFBST1BFUlRJRVMKKyAgICAgICAgSU1QT1JURURfTE9DQVRJT05fJHtfQFBBQ0tBR0VfTkFNRUBfQ09ORklHfSAiJHtfQFBBQ0tBR0VfTkFNRUBfTE9DQVRJT059IgorICAgICAgKQorICAgIGVuZGlmICgpCisgICAgdW5zZXQgKF9AUEFDS0FHRV9OQU1FQF9MT0NBVElPTikKKyAgICAjIElNUE9SVEVEX0xJTktfSU5URVJGQUNFX0xBTkdVQUdFU188Y29uZmlnPiAoc3RhdGljKQorICAgIGdldF90YXJnZXRfcHJvcGVydHkgKF9AUEFDS0FHRV9OQU1FQF9MQU5HVUFHRVMgJHtAUEFDS0FHRV9OQU1FQF9UQVJHRVR9IElNUE9SVEVEX0xJTktfSU5URVJGQUNFX0xBTkdVQUdFU18ke19AUEFDS0FHRV9OQU1FQF9DT05GSUd9KQorICAgIGlmIChfQFBBQ0tBR0VfTkFNRUBfTEFOR1VBR0VTKQorICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKEBQQUNLQUdFX05BTUVAIFBST1BFUlRJRVMKKyAgICAgICAgSU1QT1JURURfTElOS19JTlRFUkZBQ0VfTEFOR1VBR0VTXyR7X0BQQUNLQUdFX05BTUVAX0NPTkZJR30gIiR7X0BQQUNLQUdFX05BTUVAX0xBTkdVQUdFU30iCisgICAgICApCisgICAgZW5kaWYgKCkKKyAgICB1bnNldCAoX0BQQUNLQUdFX05BTUVAX0xBTkdVQUdFUykKKyAgICAjIElNUE9SVEVEX1NPTkFNRV88Y29uZmlnPiAoc2hhcmVkKQorICAgIGdldF90YXJnZXRfcHJvcGVydHkgKF9AUEFDS0FHRV9OQU1FQF9TT05BTUUgJHtAUEFDS0FHRV9OQU1FQF9UQVJHRVR9IElNUE9SVEVEX1NPTkFNRV8ke19AUEFDS0FHRV9OQU1FQF9DT05GSUd9KQorICAgIGlmIChfQFBBQ0tBR0VfTkFNRUBfU09OQU1FKQorICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKEBQQUNLQUdFX05BTUVAIFBST1BFUlRJRVMKKyAgICAgICAgSU1QT1JURURfU09OQU1FXyR7X0BQQUNLQUdFX05BTUVAX0NPTkZJR30gIiR7X0BQQUNLQUdFX05BTUVAX1NPTkFNRX0iCisgICAgICApCisgICAgZW5kaWYgKCkKKyAgICB1bnNldCAoX0BQQUNLQUdFX05BTUVAX1NPTkFNRSkKKyAgZW5kZm9yZWFjaCAoKQorICB1bnNldCAoX0BQQUNLQUdFX05BTUVAX0NPTkZJR1VSQVRJT05TKQorZW5kaWYgKCkKKworIyBhbGlhcyBmb3IgZGVmYXVsdCBpbXBvcnQgdGFyZ2V0IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvbGRlciBDTWFrZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb25zCitzZXQgKEBQQUNLQUdFX05BTUVAX0xJQlJBUklFUyAiJHtAUEFDS0FHRV9OQU1FQF9UQVJHRVR9IikKKworIyB1bnNldCBwcml2YXRlIHZhcmlhYmxlcwordW5zZXQgKF9JTlNUQUxMX1BSRUZJWCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9jbWFrZS9leGVjdXRlX3Rlc3QuY21ha2UgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvY21ha2UvZXhlY3V0ZV90ZXN0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDA4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvY21ha2UvZXhlY3V0ZV90ZXN0LmNtYWtlCkBAIC0wLDAgKzEsNTMgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzYW5pdGl6ZSBzdHJpbmcgc3RvcmVkIGluIHZhcmlhYmxlIGZvciB1c2UgaW4gcmVndWxhciBleHByZXNzaW9uLgorbWFjcm8gKHNhbml0aXplX2Zvcl9yZWdleCBTVFJWQVIpCisgIHN0cmluZyAoUkVHRVggUkVQTEFDRSAiKFsuKyo/XiQoKV0pIiAiXFxcXFxcMSIgJHtTVFJWQVJ9ICIkeyR7U1RSVkFSfX0iKQorZW5kbWFjcm8gKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNjcmlwdCBhcmd1bWVudHMKK2lmIChOT1QgQ09NTUFORCkKKyAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIlRlc3QgY29tbWFuZCBub3Qgc3BlY2lmaWVkISIpCitlbmRpZiAoKQoraWYgKE5PVCBERUZJTkVEIEVYUEVDVEVEX1JDKQorICBzZXQgKEVYUEVDVEVEX1JDIDApCitlbmRpZiAoKQoraWYgKEVYUEVDVEVEX09VVFBVVCkKKyAgc2FuaXRpemVfZm9yX3JlZ2V4KEVYUEVDVEVEX09VVFBVVCkKK2VuZGlmICgpCitpZiAoVU5FWFBFQ1RFRF9PVVRQVVQpCisgIHNhbml0aXplX2Zvcl9yZWdleChVTkVYUEVDVEVEX09VVFBVVCkKK2VuZGlmICgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZXQgYSBmZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzICh1c2VmdWwgZm9yIC0tdHJ5ZnJvbWVudikKK3NldCAoRU5We0ZMQUdTX3VuZGVmb2t9ICJmb28sYmFyIikKK3NldCAoRU5We0ZMQUdTX3dlaXJkb30gICIiKQorc2V0IChFTlZ7RkxBR1NfdmVyc2lvbn0gInRydWUiKQorc2V0IChFTlZ7RkxBR1NfaGVscH0gICAgImZhbHNlIikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGV4ZWN1dGUgdGVzdCBjb21tYW5kCitleGVjdXRlX3Byb2Nlc3MoCisgIENPTU1BTkQgJHtDT01NQU5EfQorICBSRVNVTFRfVkFSSUFCTEUgUkMKKyAgT1VUUFVUX1ZBUklBQkxFIE9VVFBVVAorICBFUlJPUl9WQVJJQUJMRSAgT1VUUFVUCispCisKK2lmIChPVVRQVVQpCisgIG1lc3NhZ2UgKCIke09VVFBVVH0iKQorZW5kaWYgKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNoZWNrIHRlc3QgcmVzdWx0CitpZiAoTk9UIFJDIEVRVUFMIEVYUEVDVEVEX1JDKQorICBzdHJpbmcgKFJFUExBQ0UgIjsiICIgIiBDT01NQU5EICIke0NPTU1BTkR9IikKKyAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIkNvbW1hbmQ6XG5cdCR7Q09NTUFORH1cbkV4aXQgc3RhdHVzIGlzICR7UkN9LCBleHBlY3RlZCAke0VYUEVDVEVEX1JDfSIpCitlbmRpZiAoKQoraWYgKEVYUEVDVEVEX09VVFBVVCBBTkQgTk9UIE9VVFBVVCBNQVRDSEVTICIke0VYUEVDVEVEX09VVFBVVH0iKQorICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiVGVzdCBvdXRwdXQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgb3V0cHV0OiAke0VYUEVDVEVEX09VVFBVVH0iKQorZW5kaWYgKCkKK2lmIChVTkVYUEVDVEVEX09VVFBVVCBBTkQgT1VUUFVUIE1BVENIRVMgIiR7VU5FWFBFQ1RFRF9PVVRQVVR9IikKKyAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIlRlc3Qgb3V0cHV0IG1hdGNoZXMgdW5leHBlY3RlZCBvdXRwdXQ6ICR7VU5FWFBFQ1RFRF9PVVRQVVR9IikKK2VuZGlmICgpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL2NtYWtlL3BhY2thZ2UuY21ha2UuaW4gYi90aGlyZF9wYXJ0eS9nZmxhZ3MvY21ha2UvcGFja2FnZS5jbWFrZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWVjNzkyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL2NtYWtlL3BhY2thZ2UuY21ha2UuaW4KQEAgLTAsMCArMSw0OSBAQAorIyBQZXItZ2VuZXJhdG9yIENQYWNrIGNvbmZpZ3VyYXRpb24gZmlsZS4gU2VlIENQQUNLX1BST0pFQ1RfQ09ORklHX0ZJTEUgZG9jdW1lbnRlZCBhdAorIyBodHRwOi8vd3d3LmNtYWtlLm9yZy9jbWFrZS9oZWxwL3YyLjguMTIvY3BhY2suaHRtbCN2YXJpYWJsZTpDUEFDS19QUk9KRUNUX0NPTkZJR19GSUxFCisjCisjIEFsbCBjb21tb24gQ1BBQ0tfKiB2YXJpYWJsZXMgYXJlIHNldCBpbiBDTWFrZUxpc3RzLnR4dCBhbHJlYWR5LiBUaGlzIGZpbGUgb25seQorIyBvdmVycmlkZXMgc29tZSBvZiB0aGVzZSB0byBwcm92aWRlIHBhY2thZ2UgZ2VuZXJhdG9yIHNwZWNpZmljIHNldHRpbmdzLgorCisjIHdoZXRoZXIgcGFja2FnZSBjb250YWlucyBhbGwgZGV2ZWxvcG1lbnQgZmlsZXMgb3Igb25seSBydW50aW1lIGZpbGVzCitzZXQgKERFVkVMIEBJTlNUQUxMX0hFQURFUlNAKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWMgT1MgWCBwYWNrYWdlCitpZiAoQ1BBQ0tfR0VORVJBVE9SIE1BVENIRVMgIlBhY2thZ2VNYWtlcnxEcmFnTkRyb3AiKQorCisgIHNldCAoQ1BBQ0tfUEFDS0FHRV9GSUxFX05BTUUgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCisgIGlmIChERVZFTCkKKyAgICBzZXQgKENQQUNLX1BBQ0tBR0VfRklMRV9OQU1FICIke0NQQUNLX1BBQ0tBR0VfRklMRV9OQU1FfS1kZXZlbCIpCisgIGVuZGlmICgpCisgIHNldCAoQ1BBQ0tfUEFDS0FHRV9GSUxFX05BTUUgIiR7Q1BBQ0tfUEFDS0FHRV9GSUxFX05BTUV9LSR7Q1BBQ0tfUEFDS0FHRV9WRVJTSU9OfSIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlYmlhbiBwYWNrYWdlCitlbHNlaWYgKENQQUNLX0dFTkVSQVRPUiBNQVRDSEVTICJERUIiKQorCisgIHNldCAoQ1BBQ0tfUEFDS0FHRV9GSUxFX05BTUUgICAibGliJHtDUEFDS19QQUNLQUdFX05BTUV9IikKKyAgaWYgKERFVkVMKQorICAgIHNldCAoQ1BBQ0tfUEFDS0FHRV9GSUxFX05BTUUgIiR7Q1BBQ0tfUEFDS0FHRV9GSUxFX05BTUV9LWRldiIpCisgIGVsc2UgKCkKKyAgICBzZXQgKENQQUNLX1BBQ0tBR0VfRklMRV9OQU1FICIke0NQQUNLX1BBQ0tBR0VfRklMRV9OQU1FfTAiKQorICBlbmRpZiAoKQorICBzZXQgKENQQUNLX1BBQ0tBR0VfRklMRV9OQU1FICAgIiR7Q1BBQ0tfUEFDS0FHRV9GSUxFX05BTUV9XyR7Q1BBQ0tfUEFDS0FHRV9WRVJTSU9OfS0xXyR7Q1BBQ0tfUEFDS0FHRV9BUkNISVRFQ1RVUkV9IikKKworICBzZXQgKENQQUNLX0RFQklBTl9QQUNLQUdFX0RFUEVORFMpCisgIHNldCAoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfU0VDVElPTiAgICAgICJkZXZlbCIpCisgIHNldCAoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfUFJJT1JJVFkgICAgICJvcHRpb25hbCIpCisgIHNldCAoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfSE9NRVBBR0UgICAgICIke0NQQUNLX1JQTV9QQUNLQUdFX1VSTH0iKQorICBzZXQgKENQQUNLX0RFQklBTl9QQUNLQUdFX01BSU5UQUlORVIgICAiJHtDUEFDS19QQUNLQUdFX1ZFTkRPUn0iKQorICBzZXQgKENQQUNLX0RFQklBTl9QQUNLQUdFX0FSQ0hJVEVDVFVSRSAiJHtDUEFDS19QQUNLQUdFX0FSQ0hJVEVDVFVSRX0iKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSUE0gcGFja2FnZQorZWxzZWlmIChDUEFDS19HRU5FUkFUT1IgTUFUQ0hFUyAiUlBNIikKKworICBzZXQgKENQQUNLX1BBQ0tBR0VfRklMRV9OQU1FICAgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCisgIGlmIChERVZFTCkKKyAgICBzZXQgKENQQUNLX1BBQ0tBR0VfRklMRV9OQU1FICIke0NQQUNLX1BBQ0tBR0VfRklMRV9OQU1FfS1kZXZlbCIpCisgIGVuZGlmICgpCisgIHNldCAoQ1BBQ0tfUEFDS0FHRV9GSUxFX05BTUUgICAiJHtDUEFDS19QQUNLQUdFX0ZJTEVfTkFNRX0tJHtDUEFDS19QQUNLQUdFX1ZFUlNJT059LTEuJHtDUEFDS19QQUNLQUdFX0FSQ0hJVEVDVFVSRX0iKQorCitlbmRpZiAoKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL2NtYWtlL3V0aWxzLmNtYWtlIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL2NtYWtlL3V0aWxzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZWY0NjMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvY21ha2UvdXRpbHMuY21ha2UKQEAgLTAsMCArMSw5NiBAQAorIyMgVXRpbGl0eSBDTWFrZSBmdW5jdGlvbnMuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQ29udmVydCBib29sZWFuIHZhbHVlIHRvIDAgb3IgMQorbWFjcm8gKGJvb2xfdG9faW50IFZBUikKKyAgaWYgKCR7VkFSfSkKKyAgICBzZXQgKCR7VkFSfSAxKQorICBlbHNlICgpCisgICAgc2V0ICgke1ZBUn0gMCkKKyAgZW5kaWYgKCkKK2VuZG1hY3JvICgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgRXh0cmFjdCB2ZXJzaW9uIG51bWJlcnMgZnJvbSB2ZXJzaW9uIHN0cmluZy4KK2Z1bmN0aW9uICh2ZXJzaW9uX251bWJlcnMgdmVyc2lvbiBtYWpvciBtaW5vciBwYXRjaCkKKyAgaWYgKHZlcnNpb24gTUFUQ0hFUyAiKFswLTldKykoXFwuWzAtOV0rKT8oXFwuWzAtOV0rKT8ocmNbMS05XVswLTldKnxbYS16XSspPyIpCisgICAgaWYgKENNQUtFX01BVENIXzEpCisgICAgICBzZXQgKF9tYWpvciAke0NNQUtFX01BVENIXzF9KQorICAgIGVsc2UgKCkKKyAgICAgIHNldCAoX21ham9yIDApCisgICAgZW5kaWYgKCkKKyAgICBpZiAoQ01BS0VfTUFUQ0hfMikKKyAgICAgIHNldCAoX21pbm9yICR7Q01BS0VfTUFUQ0hfMn0pCisgICAgICBzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIl5cXC4iICIiIF9taW5vciAiJHtfbWlub3J9IikKKyAgICBlbHNlICgpCisgICAgICBzZXQgKF9taW5vciAwKQorICAgIGVuZGlmICgpCisgICAgaWYgKENNQUtFX01BVENIXzMpCisgICAgICBzZXQgKF9wYXRjaCAke0NNQUtFX01BVENIXzN9KQorICAgICAgc3RyaW5nIChSRUdFWCBSRVBMQUNFICJeXFwuIiAiIiBfcGF0Y2ggIiR7X3BhdGNofSIpCisgICAgZWxzZSAoKQorICAgICAgc2V0IChfcGF0Y2ggMCkKKyAgICBlbmRpZiAoKQorICBlbHNlICgpCisgICAgc2V0IChfbWFqb3IgMCkKKyAgICBzZXQgKF9taW5vciAwKQorICAgIHNldCAoX3BhdGNoIDApCisgIGVuZGlmICgpCisgIHNldCAoIiR7bWFqb3J9IiAiJHtfbWFqb3J9IiBQQVJFTlRfU0NPUEUpCisgIHNldCAoIiR7bWlub3J9IiAiJHtfbWlub3J9IiBQQVJFTlRfU0NPUEUpCisgIHNldCAoIiR7cGF0Y2h9IiAiJHtfcGF0Y2h9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbiAoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIENvbmZpZ3VyZSBwdWJsaWMgaGVhZGVyIGZpbGVzCitmdW5jdGlvbiAoY29uZmlndXJlX2hlYWRlcnMgb3V0KQorICBzZXQgKHRtcCkKKyAgZm9yZWFjaCAoc3JjIElOIExJU1RTIEFSR04pCisgICAgaWYgKElTX0FCU09MVVRFICIke3NyY30iKQorICAgICAgbGlzdCAoQVBQRU5EIHRtcCAiJHtzcmN9IikKKyAgICBlbHNlaWYgKEVYSVNUUyAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3NyYy8ke3NyY30uaW4iKQorICAgICAgY29uZmlndXJlX2ZpbGUgKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vc3JjLyR7c3JjfS5pbiIgIiR7UFJPSkVDVF9CSU5BUllfRElSfS9pbmNsdWRlLyR7R0ZMQUdTX0lOQ0xVREVfRElSfS8ke3NyY30iIEBPTkxZKQorICAgICAgbGlzdCAoQVBQRU5EIHRtcCAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvJHtHRkxBR1NfSU5DTFVERV9ESVJ9LyR7c3JjfSIpCisgICAgZWxzZSAoKQorCSAgICBjb25maWd1cmVfZmlsZSAoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9zcmMvJHtzcmN9IiAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvJHtHRkxBR1NfSU5DTFVERV9ESVJ9LyR7c3JjfSIgQ09QWU9OTFkpCisgICAgICBsaXN0IChBUFBFTkQgdG1wICIke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS8ke0dGTEFHU19JTkNMVURFX0RJUn0vJHtzcmN9IikKKyAgICBlbmRpZiAoKQorICBlbmRmb3JlYWNoICgpCisgIHNldCAoJHtvdXR9ICIke3RtcH0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uICgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQ29uZmlndXJlIHNvdXJjZSBmaWxlcyB3aXRoIC5pbiBzdWZmaXgKK2Z1bmN0aW9uIChjb25maWd1cmVfc291cmNlcyBvdXQpCisgIHNldCAodG1wKQorICBmb3JlYWNoIChzcmMgSU4gTElTVFMgQVJHTikKKyAgICBpZiAoc3JjIE1BVENIRVMgIi5oJCIgQU5EIEVYSVNUUyAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3NyYy8ke3NyY30uaW4iKQorICAgICAgY29uZmlndXJlX2ZpbGUgKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vc3JjLyR7c3JjfS5pbiIgIiR7UFJPSkVDVF9CSU5BUllfRElSfS9pbmNsdWRlLyR7R0ZMQUdTX0lOQ0xVREVfRElSfS8ke3NyY30iIEBPTkxZKQorICAgICAgbGlzdCAoQVBQRU5EIHRtcCAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvJHtHRkxBR1NfSU5DTFVERV9ESVJ9LyR7c3JjfSIpCisgICAgZWxzZSAoKQorICAgICAgbGlzdCAoQVBQRU5EIHRtcCAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3NyYy8ke3NyY30iKQorICAgIGVuZGlmICgpCisgIGVuZGZvcmVhY2ggKCkKKyAgc2V0ICgke291dH0gIiR7dG1wfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24gKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBBZGQgdXNhZ2UgdGVzdAorIworIyBVc2luZyBQQVNTX1JFR1VMQVJfRVhQUkVTU0lPTiBhbmQgRkFJTF9SRUdVTEFSX0VYUFJFU1NJT04gd291bGQKKyMgZG8gYXMgd2VsbCwgYnV0IENNYWtlL0NUZXN0IGRvZXMgbm90IGFsbG93IHVzIHRvIHNwZWNpZnkgYW4KKyMgZXhwZWN0ZWQgZXhpdCBzdGF0dXMuIE1vcmVvdmVyLCB0aGUgZXhlY3V0ZV90ZXN0LmNtYWtlIHNjcmlwdAorIyBzZXRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhlIC0tZnJvbWVudi8tLXRyeWZyb21lbnYgdGVzdHMuCittYWNybyAoYWRkX2dmbGFnc190ZXN0IG5hbWUgZXhwZWN0ZWRfcmMgZXhwZWN0ZWRfb3V0cHV0IHVuZXhwZWN0ZWRfb3V0cHV0IGNtZCkKKyAgc2V0IChhcmdzICItLXRlc3RfdG1wZGlyPSR7UFJPSkVDVF9CSU5BUllfRElSfS9UZXN0aW5nL1RlbXBvcmFyeSIKKyAgICAgICAgICAgICItLXNyY2Rpcj0ke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdCIpCisgIGFkZF90ZXN0ICgKKyAgICBOQU1FICAgICR7bmFtZX0KKyAgICBDT01NQU5EICIke0NNQUtFX0NPTU1BTkR9IiAiLURDT01NQU5EOlNUUklORz0kPFRBUkdFVF9GSUxFOiR7Y21kfT47JHthcmdzfTske0FSR059IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItREVYUEVDVEVEX1JDOlNUUklORz0ke2V4cGVjdGVkX3JjfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURFWFBFQ1RFRF9PVVRQVVQ6U1RSSU5HPSR7ZXhwZWN0ZWRfb3V0cHV0fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURVTkVYUEVDVEVEX09VVFBVVDpTVFJJTkc9JHt1bmV4cGVjdGVkX291dHB1dH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVAgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jbWFrZS9leGVjdXRlX3Rlc3QuY21ha2UiCisgICAgV09SS0lOR19ESVJFQ1RPUlkgIiR7R0ZMQUdTX0ZMQUdGSUxFU19ESVJ9IgorICApCitlbmRtYWNybyAoKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL2NtYWtlL3ZlcnNpb24uY21ha2UuaW4gYi90aGlyZF9wYXJ0eS9nZmxhZ3MvY21ha2UvdmVyc2lvbi5jbWFrZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFhZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL2NtYWtlL3ZlcnNpb24uY21ha2UuaW4KQEAgLTAsMCArMSwyMSBAQAorIyMgZ2ZsYWdzIENNYWtlIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiBmaWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbGlicmFyeSB2ZXJzaW9uCitzZXQgKFBBQ0tBR0VfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNoZWNrIGNvbXBhdGliaWxpdHkKKworIyBQZXJmb3JtIGNvbXBhdGliaWxpdHkgY2hlY2sgaGVyZSB1c2luZyB0aGUgaW5wdXQgQ01ha2UgdmFyaWFibGVzLgorIyBTZWUgZXhhbXBsZSBpbiBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlXzIuNl9Ob3Rlcy4KKworc2V0IChQQUNLQUdFX1ZFUlNJT05fQ09NUEFUSUJMRSBUUlVFKQorc2V0IChQQUNLQUdFX1ZFUlNJT05fVU5TVUlUQUJMRSBGQUxTRSkKKworaWYgKCIke1BBQ0tBR0VfRklORF9WRVJTSU9OX01BSk9SfSIgRVFVQUwgIkBQQUNLQUdFX1ZFUlNJT05fTUFKT1JAIiBBTkQKKyAgICAiJHtQQUNLQUdFX0ZJTkRfVkVSU0lPTl9NSU5PUn0iIEVRVUFMICJAUEFDS0FHRV9WRVJTSU9OX01JTk9SQCIpCisgIHNldCAoUEFDS0FHRV9WRVJTSU9OX0VYQUNUIFRSVUUpCitlbHNlICgpCisgIHNldCAoUEFDS0FHRV9WRVJTSU9OX0VYQUNUIEZBTFNFKQorZW5kaWYgKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9kb2MgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvZG9jCm5ldyBmaWxlIG1vZGUgMTYwMDAwCmluZGV4IDAwMDAwMDAuLmUxZDE1YjMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvZG9jCkBAIC0wLDAgKzEgQEAKK1N1YnByb2plY3QgY29tbWl0IGUxZDE1YjMzNDA2ZWM1NzEwOTVlN2E5MWRiYzRiMmFkYTFhZTNiYWMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvY29uZmlnLmguaW4gYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NzA4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMTEyIEBACisvKiBHZW5lcmF0ZWQgZnJvbSBjb25maWcuaC5pbiBkdXJpbmcgYnVpbGQgY29uZmlndXJhdGlvbiB1c2luZyBDTWFrZS4gKi8KKworLy8gTm90ZTogVGhpcyBoZWFkZXIgZmlsZSBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseS4gSXQgaXMgbm90IHBhcnQgb2YgcHVibGljIGludGVyZmFjZSEKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTeXN0ZW0gY2hlY2tzCisKKy8vIERlZmluZSBpZiB5b3UgYnVpbGQgdGhpcyBsaWJyYXJ5IGZvciBhIE1TIFdpbmRvd3MgT1MuCisjY21ha2VkZWZpbmUgT1NfV0lORE9XUworCisvLyBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuCisjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSAorCisvLyBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAorCisvLyBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4KKyNjbWFrZWRlZmluZSBIQVZFX0lOVFRZUEVTX0gKKworLy8gRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU1RBVF9ICisKKy8vIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4KKyNjbWFrZWRlZmluZSBIQVZFX1VOSVNURF9ICisKKy8vIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZubWF0Y2guaD4gaGVhZGVyIGZpbGUuCisjY21ha2VkZWZpbmUgSEFWRV9GTk1BVENIX0gKKworLy8gRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c2hsd2FwaS5oPiBoZWFkZXIgZmlsZSAoV2luZG93cyAyMDAwL1hQKS4KKyNjbWFrZWRlZmluZSBIQVZFX1NITFdBUElfSAorCisvLyBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvbGwgZnVuY3Rpb24uCisjY21ha2VkZWZpbmUgSEFWRV9TVFJUT0xMCisKKy8vIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG9xIGZ1bmN0aW9uLgorI2NtYWtlZGVmaW5lIEhBVkVfU1RSVE9RCisKKy8vIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHB0aHJlYWQuaD4gaGVhZGVyIGZpbGUuCisjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFECisKKy8vIERlZmluZSBpZiB5b3VyIHB0aHJlYWQgbGlicmFyeSBkZWZpbmVzIHRoZSB0eXBlIHB0aHJlYWRfcndsb2NrX3QKKyNjbWFrZWRlZmluZSBIQVZFX1JXTE9DSworCisvLyBnY2MgcmVxdWlyZXMgdGhpcyB0byBnZXQgUFJJZDY0LCBldGMuCisjaWYgZGVmaW5lZChIQVZFX0lOVFRZUEVTX0gpICYmICFkZWZpbmVkKF9fU1REQ19GT1JNQVRfTUFDUk9TKQorIyAgZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TIDEKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhY2thZ2UgaW5mb3JtYXRpb24KKworLy8gTmFtZSBvZiBwYWNrYWdlLgorI2RlZmluZSBQQUNLQUdFIEBQUk9KRUNUX05BTUVACisKKy8vIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4KKyNkZWZpbmUgUEFDS0FHRV9OQU1FIEBQQUNLQUdFX05BTUVACisKKy8vIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgQFBBQ0tBR0VfU1RSSU5HQAorCisvLyBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSBAUEFDS0FHRV9UQVJOQU1FQAorCisvLyBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gQFBBQ0tBR0VfVkVSU0lPTkAKKworLy8gVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZS4KKyNkZWZpbmUgVkVSU0lPTiBQQUNLQUdFX1ZFUlNJT04KKworLy8gRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUIEBQQUNLQUdFX0JVR1JFUE9SVEAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXRoIHNlcGFyYXRvcgorI2lmbmRlZiBQQVRIX1NFUEFSQVRPUgorIyAgaWZkZWYgT1NfV0lORE9XUworIyAgICBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgICdcXCcKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICAnLycKKyMgIGVuZGlmCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXaW5kb3dzCisKKy8vIFdoZXRoZXIgZ2ZsYWdzIGxpYnJhcnkgaXMgYSBETEwuCisjaWZuZGVmIEdGTEFHU19JU19BX0RMTAorIyAgZGVmaW5lIEdGTEFHU19JU19BX0RMTCAwCisjZW5kaWYKKworLy8gQWx3YXlzIGV4cG9ydCBzeW1ib2xzIHdoZW4gY29tcGlsaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXMgdGhpcyBmaWxlIGlzIG9ubHkKKy8vIGluY2x1ZGVkIGJ5IGludGVybmFsIG1vZHVsZXMgd2hlbiBidWlsZGluZyB0aGUgZ2ZsYWdzIGxpYnJhcnkgaXRzZWxmLgorLy8gVGhlIGdmbGFnc19kZWNsYXJlLmggaGVhZGVyIGZpbGUgd2lsbCBzZXQgaXQgdG8gaW1wb3J0IHRoZXNlIHN5bWJvbHMgb3RoZXJ3aXNlLgorI2lmbmRlZiBHRkxBR1NfRExMX0RFQ0wKKyMgIGlmIEdGTEFHU19JU19BX0RMTCAmJiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgICBkZWZpbmUgR0ZMQUdTX0RMTF9ERUNMIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgZWxzZQorIyAgICBkZWZpbmUgR0ZMQUdTX0RMTF9ERUNMCisjICBlbmRpZgorI2VuZGlmCisvLyBGbGFncyBkZWZpbmVkIGJ5IHRoZSBnZmxhZ3MgbGlicmFyeSBpdHNlbGYgbXVzdCBiZSBleHBvcnRlZAorI2lmbmRlZiBHRkxBR1NfRExMX0RFRklORV9GTEFHCisjICBkZWZpbmUgR0ZMQUdTX0RMTF9ERUZJTkVfRkxBRyBHRkxBR1NfRExMX0RFQ0wKKyNlbmRpZgorCisjaWZkZWYgT1NfV0lORE9XUworLy8gVGhlIHVuaXR0ZXN0cyBpbXBvcnQgdGhlIHN5bWJvbHMgb2YgdGhlIHNoYXJlZCBnZmxhZ3MgbGlicmFyeQorIyAgaWYgR0ZMQUdTX0lTX0FfRExMICYmIGRlZmluZWQoX01TQ19WRVIpCisjICAgIGRlZmluZSBHRkxBR1NfRExMX0RFQ0xfRk9SX1VOSVRURVNUUyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVuZGlmCisjICBpbmNsdWRlICJ3aW5kb3dzX3BvcnQuaCIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3MuY2MgYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2dmbGFncy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODUwNTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3MuY2MKQEAgLTAsMCArMSwxOTU3IEBACisvLyBDb3B5cmlnaHQgKGMpIDE5OTksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAtLS0KKy8vIFJldmFtcGVkIGFuZCByZW9yZ2FuaXplZCBieSBDcmFpZyBTaWx2ZXJzdGVpbgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYWxsIG91ciBjb21tYW5kIGxpbmUgZmxhZ3MKKy8vIHN0dWZmLiAgSGVyZSdzIGhvdyBldmVyeXRoaW5nIGZpdHMgdG9nZXRoZXIKKy8vCisvLyAqIEZsYWdSZWdpc3RyeSBvd25zIENvbW1hbmRMaW5lRmxhZ3Mgb3ducyBGbGFnVmFsdWUuCisvLyAqIEZsYWdTYXZlciBob2xkcyBhIEZsYWdSZWdpc3RyeSAoc2F2ZXMgaXQgYXQgY29uc3RydWN0IHRpbWUsCisvLyAgICAgcmVzdG9yZXMgaXQgYXQgZGVzdHJveSB0aW1lKS4KKy8vICogQ29tbWFuZExpbmVGbGFnUGFyc2VyIGxpdmVzIG91dHNpZGUgdGhhdCBoaWVyYXJjaHksIGJ1dCB3b3JrcyBvbgorLy8gICAgIENvbW1hbmRMaW5lRmxhZ3MgKG1vZGlmeWluZyB0aGUgRmxhZ1ZhbHVlcykuCisvLyAqIEZyZWUgZnVuY3Rpb25zIGxpa2UgU2V0Q29tbWFuZExpbmVPcHRpb24oKSB3b3JrIHZpYSBvbmUgb2YgdGhlCisvLyAgICAgYWJvdmUgKHN1Y2ggYXMgQ29tbWFuZExpbmVGbGFnUGFyc2VyKS4KKy8vCisvLyBJbiBtb3JlIGRldGFpbDoKKy8vCisvLyAtLSBUaGUgbWFpbiBjbGFzc2VzIHRoYXQgaG9sZCBmbGFnIGRhdGE6CisvLworLy8gRmxhZ1ZhbHVlIGhvbGRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgZmxhZy4gIEl0J3MKKy8vIHBzZXVkby10ZW1wbGF0aXplZDogZXZlcnkgb3BlcmF0aW9uIG9uIGEgRmxhZ1ZhbHVlIGlzIHR5cGVkLiAgSXQKKy8vIGFsc28gZGVhbHMgd2l0aCBzdG9yYWdlLWxpZmV0aW1lIGlzc3VlcyAoc28gZmxhZyB2YWx1ZXMgZG9uJ3QgZ28KKy8vIGF3YXkgaW4gYSBkZXN0cnVjdG9yKSwgd2hpY2ggaXMgd2h5IHdlIG5lZWQgYSB3aG9sZSBjbGFzcyB0byBob2xkIGEKKy8vIHZhcmlhYmxlJ3MgdmFsdWUuCisvLworLy8gQ29tbWFuZExpbmVGbGFnIGlzIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgY29tbWFuZC1saW5lCisvLyBmbGFnLiAgSXQgaGFzIGEgRmxhZ1ZhbHVlIGZvciB0aGUgZmxhZydzIGN1cnJlbnQgdmFsdWUsIGJ1dCBhbHNvCisvLyB0aGUgZmxhZydzIG5hbWUsIHR5cGUsIGV0Yy4KKy8vCisvLyBGbGFnUmVnaXN0cnkgaXMgYSBjb2xsZWN0aW9uIG9mIENvbW1hbmRMaW5lRmxhZ3MuICBUaGVyZSdzIHRoZQorLy8gZ2xvYmFsIHJlZ2lzdHJ5LCB3aGljaCBpcyB3aGVyZSBmbGFncyBkZWZpbmVkIHZpYSBERUZJTkVfZm9vKCkKKy8vIGxpdmUuICBCdXQgaXQncyBwb3NzaWJsZSB0byBkZWZpbmUgeW91ciBvd24gZmxhZywgbWFudWFsbHksIGluIGEKKy8vIGRpZmZlcmVudCByZWdpc3RyeSB5b3UgY3JlYXRlLiAgKEluIHByYWN0aWNlLCBtdWx0aXBsZSByZWdpc3RyaWVzCisvLyBhcmUgdXNlZCBvbmx5IGJ5IEZsYWdTYXZlcikuCisvLworLy8gQSBnaXZlbiBGbGFnVmFsdWUgaXMgb3duZWQgYnkgZXhhY3RseSBvbmUgQ29tbWFuZExpbmVGbGFnLiAgQSBnaXZlbgorLy8gQ29tbWFuZExpbmVGbGFnIGlzIG93bmVkIGJ5IGV4YWN0bHkgb25lIEZsYWdSZWdpc3RyeS4gIEZsYWdSZWdpc3RyeQorLy8gaGFzIGEgbG9jazsgYW55IG9wZXJhdGlvbiB0aGF0IHdyaXRlcyB0byBhIEZsYWdWYWx1ZSBvcgorLy8gQ29tbWFuZExpbmVGbGFnIG93bmVkIGJ5IHRoYXQgcmVnaXN0cnkgbXVzdCBhY3F1aXJlIHRoZQorLy8gRmxhZ1JlZ2lzdHJ5IGxvY2sgYmVmb3JlIGRvaW5nIHNvLgorLy8KKy8vIC0tLSBTb21lIG90aGVyIGNsYXNzZXMgYW5kIGZyZWUgZnVuY3Rpb25zOgorLy8KKy8vIENvbW1hbmRMaW5lRmxhZ0luZm8gaXMgYSBjbGllbnQtZXhwb3NlZCB2ZXJzaW9uIG9mIENvbW1hbmRMaW5lRmxhZy4KKy8vIE9uY2UgaXQncyBpbnN0YW50aWF0ZWQsIGl0IGhhcyBubyBkZXBlbmRlbmNpZXMgb3IgcmVsYXRpb25zaGlwcworLy8gd2l0aCBhbnkgb3RoZXIgcGFydCBvZiB0aGlzIGZpbGUuCisvLworLy8gRmxhZ1JlZ2lzdGVyZXIgaXMgdGhlIGhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBERUZJTkVfKiBtYWNyb3MgdG8KKy8vIGFsbG93IHdvcmsgdG8gYmUgZG9uZSBhdCBnbG9iYWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCisvLyBDb21tYW5kTGluZUZsYWdQYXJzZXIgaXMgdGhlIGNsYXNzIHRoYXQgcmVhZHMgZnJvbSB0aGUgY29tbWFuZGxpbmUKKy8vIGFuZCBpbnN0YW50aWF0ZXMgZmxhZyB2YWx1ZXMgYmFzZWQgb24gdGhhdC4gIEl0IG5lZWRzIHRvIHBva2UgaW50bworLy8gdGhlIGlubmFyZHMgb2YgdGhlIEZsYWdWYWx1ZS0+Q29tbWFuZExpbmVGbGFnLT5GbGFnUmVnaXN0cnkgY2xhc3MKKy8vIGhpZXJhcmNoeSB0byBkbyB0aGF0LiAgSXQncyBjYXJlZnVsIHRvIGFjcXVpcmUgdGhlIEZsYWdSZWdpc3RyeQorLy8gbG9jayBiZWZvcmUgZG9pbmcgYW55IHdyaXRpbmcgb3Igb3RoZXIgbm9uLWNvbnN0IGFjdGlvbnMuCisvLworLy8gR2V0Q29tbWFuZExpbmVPcHRpb24gaXMganVzdCBhIGhvb2sgaW50byByZWdpc3RyeSByb3V0aW5lcyB0bworLy8gcmV0cmlldmUgYSBmbGFnIGJhc2VkIG9uIGl0cyBuYW1lLiAgU2V0Q29tbWFuZExpbmVPcHRpb24sIG9uIHRoZQorLy8gb3RoZXIgaGFuZCwgaG9va3MgaW50byBDb21tYW5kTGluZUZsYWdQYXJzZXIuICBPdGhlciBBUEkgZnVuY3Rpb25zCisvLyBhcmUsIHNpbWlsYXJseSwgbW9zdGx5IGhvb2tzIGludG8gdGhlIGZ1bmN0aW9uYWxpdHkgZGVzY3JpYmVkIGFib3ZlLgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZ2ZsYWdzLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaWYgZGVmaW5lZChIQVZFX0ZOTUFUQ0hfSCkKKyMgIGluY2x1ZGUgPGZubWF0Y2guaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9TSExXQVBJX0gpCisjICBpbmNsdWRlIDxzaGx3YXBpLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRhcmcuaD4gLy8gRm9yIHZhX2xpc3QgYW5kIHJlbGF0ZWQgb3BlcmF0aW9ucworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PiAgICAgLy8gZm9yIHBhaXI8PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIm11dGV4LmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisvLyBTcGVjaWFsIGZsYWdzLCB0eXBlIDE6IHRoZSAncmVjdXJzaXZlJyBmbGFncy4gIFRoZXkgc2V0IGFub3RoZXIgZmxhZydzIHZhbC4KK0RFRklORV9zdHJpbmcoZmxhZ2ZpbGUsICAgIiIsICJsb2FkIGZsYWdzIGZyb20gZmlsZSIpOworREVGSU5FX3N0cmluZyhmcm9tZW52LCAgICAiIiwgInNldCBmbGFncyBmcm9tIHRoZSBlbnZpcm9ubWVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW3VzZSAnZXhwb3J0IEZMQUdTX2ZsYWcxPXZhbHVlJ10iKTsKK0RFRklORV9zdHJpbmcodHJ5ZnJvbWVudiwgIiIsICJzZXQgZmxhZ3MgZnJvbSB0aGUgZW52aXJvbm1lbnQgaWYgcHJlc2VudCIpOworCisvLyBTcGVjaWFsIGZsYWdzLCB0eXBlIDI6IHRoZSAncGFyc2luZycgZmxhZ3MuICBUaGV5IG1vZGlmeSBob3cgd2UgcGFyc2UuCitERUZJTkVfc3RyaW5nKHVuZGVmb2ssICIiLCAiY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmxhZyBuYW1lcyB0aGF0IGl0IGlzIG9rYXkgdG8gc3BlY2lmeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhlIGNvbW1hbmQgbGluZSBldmVuIGlmIHRoZSBwcm9ncmFtIGRvZXMgbm90IGRlZmluZSBhIGZsYWcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggdGhhdCBuYW1lLiAgSU1QT1JUQU5UOiBmbGFncyBpbiB0aGlzIGxpc3QgdGhhdCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudHMgTVVTVCB1c2UgdGhlIGZsYWc9dmFsdWUgZm9ybWF0Iik7CisKK25hbWVzcGFjZSBHRkxBR1NfTkFNRVNQQUNFIHsKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnBhaXI7Cit1c2luZyBzdGQ6OnNvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHVuaXR0ZXN0IHRvIHRlc3QgZXJyb3ItZXhpdCBjb2RlCit2b2lkIEdGTEFHU19ETExfREVDTCAoKmdmbGFnc19leGl0ZnVuYykoaW50KSA9ICZleGl0OyAgLy8gZnJvbSBzdGRsaWIuaAorCisKKy8vIFRoZSBoZWxwIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSBjb21tYW5kbGluZSBmbGFnIGhhcyBiZWVuCisvLyAnc3RyaXBwZWQnLiBJdCB3aWxsIG5vdCBzaG93IHVwIHdoZW4gZG9pbmcgIi1oZWxwIiBhbmQgaXRzCisvLyB2YXJpYW50cy4gVGhlIGZsYWcgaXMgc3RyaXBwZWQgaWYgU1RSSVBfRkxBR19IRUxQIGlzIHNldCB0byAxCisvLyBiZWZvcmUgaW5jbHVkaW5nIGJhc2UvZ2ZsYWdzLmgKKworLy8gVGhpcyBpcyB1c2VkIGJ5IHRoaXMgZmlsZSwgYW5kIGFsc28gaW4gZ2ZsYWdzX3JlcG9ydGluZy5jYworY29uc3QgY2hhciBrU3RyaXBwZWRGbGFnSGVscFtdID0gIlwwMDFcMDAyXDAwM1wwMDQgKHVua25vd24pIFwwMDRcMDAzXDAwMlwwMDEiOworCituYW1lc3BhY2UgeworCisvLyBUaGVyZSBhcmUgYWxzbyAncmVwb3J0aW5nJyBmbGFncywgaW4gZ2ZsYWdzX3JlcG9ydGluZy5jYy4KKworc3RhdGljIGNvbnN0IGNoYXIga0Vycm9yW10gPSAiRVJST1I6ICI7CisKKy8vIEluZGljYXRlcyB0aGF0IHVuZGVmaW5lZCBvcHRpb25zIGFyZSB0byBiZSBpZ25vcmVkLgorLy8gRW5hYmxlcyBkZWZlcnJlZCBwcm9jZXNzaW5nIG9mIGZsYWdzIGluIGR5bmFtaWNhbGx5IGxvYWRlZCBsaWJyYXJpZXMuCitzdGF0aWMgYm9vbCBhbGxvd19jb21tYW5kX2xpbmVfcmVwYXJzaW5nID0gZmFsc2U7CisKK3N0YXRpYyBib29sIGxvZ2dpbmdfaXNfcHJvYmFibHlfc2V0X3VwID0gZmFsc2U7CisKKy8vIFRoaXMgaXMgYSAncHJvdG90eXBlJyB2YWxpZGF0ZS1mdW5jdGlvbi4gICdSZWFsJyB2YWxpZGF0ZQorLy8gZnVuY3Rpb25zLCB0YWtlIGEgZmxhZy12YWx1ZSBhcyBhbiBhcmd1bWVudDogVmFsaWRhdGVGbihib29sKSBvcgorLy8gVmFsaWRhdGVGbih1aW50NjQpLiAgSG93ZXZlciwgZm9yIGVhc2llciBzdG9yYWdlLCB3ZSBzdHJpcCBvZmYgdGhpcworLy8gYXJndW1lbnQgYW5kIHRoZW4gcmVzdG9yZSBpdCB3aGVuIGFjdHVhbGx5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIG9uCisvLyBhIGZsYWcgdmFsdWUuCit0eXBlZGVmIGJvb2wgKCpWYWxpZGF0ZUZuUHJvdG8pKCk7CisKKy8vIFdoZXRoZXIgd2Ugc2hvdWxkIGRpZSB3aGVuIHJlcG9ydGluZyBhbiBlcnJvci4KK2VudW0gRGllV2hlblJlcG9ydGluZyB7IERJRSwgRE9fTk9UX0RJRSB9OworCisvLyBSZXBvcnQgRXJyb3IgYW5kIGV4aXQgaWYgcmVxdWVzdGVkLgorc3RhdGljIHZvaWQgUmVwb3J0RXJyb3IoRGllV2hlblJlcG9ydGluZyBzaG91bGRfZGllLCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICBjaGFyIGVycm9yX21lc3NhZ2VbMjU1XTsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIHZzbnByaW50ZihlcnJvcl9tZXNzYWdlLCBzaXplb2YoZXJyb3JfbWVzc2FnZSksIGZvcm1hdCwgYXApOworICB2YV9lbmQoYXApOworICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgZXJyb3JfbWVzc2FnZSk7CisgIGZmbHVzaChzdGRlcnIpOyAgIC8vIHNob3VsZCBiZSB1bm5lY2Vzc2FyeSwgYnV0IGN5Z3dpbidzIHJ4dnQgYnVmZmVycyBzdGRlcnIKKyAgaWYgKHNob3VsZF9kaWUgPT0gRElFKSBnZmxhZ3NfZXhpdGZ1bmMoMSk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsYWdWYWx1ZQorLy8gICAgVGhpcyByZXByZXNlbnQgdGhlIHZhbHVlIGEgc2luZ2xlIGZsYWcgbWlnaHQgaGF2ZS4gIFRoZSBtYWpvcgorLy8gICAgZnVuY3Rpb25hbGl0eSBpcyB0byBjb252ZXJ0IGZyb20gYSBzdHJpbmcgdG8gYW4gb2JqZWN0IG9mIGEKKy8vICAgIGdpdmVuIHR5cGUsIGFuZCBiYWNrLiAgVGhyZWFkLWNvbXBhdGlibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBDb21tYW5kTGluZUZsYWc7CitjbGFzcyBGbGFnVmFsdWUgeworIHB1YmxpYzoKKyAgRmxhZ1ZhbHVlKHZvaWQqIHZhbGJ1ZiwgY29uc3QgY2hhciogdHlwZSwgYm9vbCB0cmFuc2Zlcl9vd25lcnNoaXBfb2ZfdmFsdWUpOworICB+RmxhZ1ZhbHVlKCk7CisKKyAgYm9vbCBQYXJzZUZyb20oY29uc3QgY2hhciogc3BlYyk7CisgIHN0cmluZyBUb1N0cmluZygpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENvbW1hbmRMaW5lRmxhZzsgIC8vIGZvciBtYW55IHRoaW5ncywgaW5jbHVkaW5nIFZhbGlkYXRlKCkKKyAgZnJpZW5kIGNsYXNzIEdGTEFHU19OQU1FU1BBQ0U6OkZsYWdTYXZlckltcGw7ICAvLyBjYWxscyBOZXcoKQorICBmcmllbmQgY2xhc3MgRmxhZ1JlZ2lzdHJ5OyAgICAgLy8gY2hlY2tzIHZhbHVlX2J1ZmZlcl8gZm9yIGZsYWdzX2J5X3B0cl8gbWFwCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgVCBHZXRGcm9tRW52KGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgVCk7CisgIGZyaWVuZCBib29sIFRyeVBhcnNlTG9ja2VkKGNvbnN0IENvbW1hbmRMaW5lRmxhZyosIEZsYWdWYWx1ZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBzdHJpbmcqKTsgIC8vIGZvciBOZXcoKSwgQ29weUZyb20oKQorCisgIGVudW0gVmFsdWVUeXBlIHsKKyAgICBGVl9CT09MID0gMCwKKyAgICBGVl9JTlQzMiA9IDEsCisgICAgRlZfSU5UNjQgPSAyLAorICAgIEZWX1VJTlQ2NCA9IDMsCisgICAgRlZfRE9VQkxFID0gNCwKKyAgICBGVl9TVFJJTkcgPSA1LAorICAgIEZWX01BWF9JTkRFWCA9IDUsCisgIH07CisgIGNvbnN0IGNoYXIqIFR5cGVOYW1lKCkgY29uc3Q7CisgIGJvb2wgRXF1YWwoY29uc3QgRmxhZ1ZhbHVlJiB4KSBjb25zdDsKKyAgRmxhZ1ZhbHVlKiBOZXcoKSBjb25zdDsgICAvLyBjcmVhdGVzIGEgbmV3IG9uZSB3aXRoIGRlZmF1bHQgdmFsdWUKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBGbGFnVmFsdWUmIHgpOworICBpbnQgVmFsdWVTaXplKCkgY29uc3Q7CisKKyAgLy8gQ2FsbHMgdGhlIGdpdmVuIHZhbGlkYXRlLWZuIG9uIHZhbHVlX2J1ZmZlcl8sIGFuZCByZXR1cm5zCisgIC8vIHdoYXRldmVyIGl0IHJldHVybnMuICBCdXQgZmlyc3QgY2FzdHMgdmFsaWRhdGVfZm5fcHJvdG8gdG8gYQorICAvLyBmdW5jdGlvbiB0aGF0IHRha2VzIG91ciB2YWx1ZSBhcyBhbiBhcmd1bWVudCAoZWcgdm9pZAorICAvLyAoKnZhbGlkYXRlX2ZuKShib29sKSBmb3IgYSBib29sIGZsYWcpLgorICBib29sIFZhbGlkYXRlKGNvbnN0IGNoYXIqIGZsYWduYW1lLCBWYWxpZGF0ZUZuUHJvdG8gdmFsaWRhdGVfZm5fcHJvdG8pIGNvbnN0OworCisgIHZvaWQqIHZhbHVlX2J1ZmZlcl87ICAgICAgICAgIC8vIHBvaW50cyB0byB0aGUgYnVmZmVyIGhvbGRpbmcgb3VyIGRhdGEKKyAgaW50OCB0eXBlXzsgICAgICAgICAgICAgICAgICAgLy8gaG93IHRvIGludGVycHJldCB2YWx1ZV8KKyAgYm9vbCBvd25zX3ZhbHVlXzsgICAgICAgICAvLyB3aGV0aGVyIHRvIGZyZWUgdmFsdWUgb24gZGVzdHJ1Y3QKKworICBGbGFnVmFsdWUoY29uc3QgRmxhZ1ZhbHVlJik7ICAgLy8gbm8gY29weWluZyEKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRmxhZ1ZhbHVlJik7Cit9OworCisKKy8vIFRoaXMgY291bGQgYmUgYSB0ZW1wbGF0ZWQgbWV0aG9kIG9mIEZsYWdWYWx1ZSwgYnV0IGRvaW5nIHNvIGFkZHMgdG8gdGhlCisvLyBzaXplIG9mIHRoZSAuby4gIFNpbmNlIHRoZXJlJ3Mgbm8gdHlwZS1zYWZldHkgaGVyZSBhbnl3YXksIG1hY3JvIGlzIG9rLgorI2RlZmluZSBWQUxVRV9BUyh0eXBlKSAgKnJlaW50ZXJwcmV0X2Nhc3Q8dHlwZSo+KHZhbHVlX2J1ZmZlcl8pCisjZGVmaW5lIE9USEVSX1ZBTFVFX0FTKGZ2LCB0eXBlKSAgKnJlaW50ZXJwcmV0X2Nhc3Q8dHlwZSo+KGZ2LnZhbHVlX2J1ZmZlcl8pCisjZGVmaW5lIFNFVF9WQUxVRV9BUyh0eXBlLCB2YWx1ZSkgIFZBTFVFX0FTKHR5cGUpID0gKHZhbHVlKQorCitGbGFnVmFsdWU6OkZsYWdWYWx1ZSh2b2lkKiB2YWxidWYsIGNvbnN0IGNoYXIqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBib29sIHRyYW5zZmVyX293bmVyc2hpcF9vZl92YWx1ZSkKKyAgICA6IHZhbHVlX2J1ZmZlcl8odmFsYnVmKSwKKyAgICAgIG93bnNfdmFsdWVfKHRyYW5zZmVyX293bmVyc2hpcF9vZl92YWx1ZSkgeworICBmb3IgKHR5cGVfID0gMDsgdHlwZV8gPD0gRlZfTUFYX0lOREVYOyArK3R5cGVfKSB7CisgICAgaWYgKCFzdHJjbXAodHlwZSwgVHlwZU5hbWUoKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBhc3NlcnQodHlwZV8gPD0gRlZfTUFYX0lOREVYKTsgIC8vIFVua25vd24gdHlwZW5hbWUKK30KKworRmxhZ1ZhbHVlOjp+RmxhZ1ZhbHVlKCkgeworICBpZiAoIW93bnNfdmFsdWVfKSB7CisgICAgcmV0dXJuOworICB9CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIEZWX0JPT0w6IGRlbGV0ZSByZWludGVycHJldF9jYXN0PGJvb2wqPih2YWx1ZV9idWZmZXJfKTsgYnJlYWs7CisgICAgY2FzZSBGVl9JTlQzMjogZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzIqPih2YWx1ZV9idWZmZXJfKTsgYnJlYWs7CisgICAgY2FzZSBGVl9JTlQ2NDogZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjQqPih2YWx1ZV9idWZmZXJfKTsgYnJlYWs7CisgICAgY2FzZSBGVl9VSU5UNjQ6IGRlbGV0ZSByZWludGVycHJldF9jYXN0PHVpbnQ2NCo+KHZhbHVlX2J1ZmZlcl8pOyBicmVhazsKKyAgICBjYXNlIEZWX0RPVUJMRTogZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8ZG91YmxlKj4odmFsdWVfYnVmZmVyXyk7IGJyZWFrOworICAgIGNhc2UgRlZfU1RSSU5HOiBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzdHJpbmcqPih2YWx1ZV9idWZmZXJfKTsgYnJlYWs7CisgIH0KK30KKworYm9vbCBGbGFnVmFsdWU6OlBhcnNlRnJvbShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBpZiAodHlwZV8gPT0gRlZfQk9PTCkgeworICAgIGNvbnN0IGNoYXIqIGtUcnVlW10gPSB7ICIxIiwgInQiLCAidHJ1ZSIsICJ5IiwgInllcyIgfTsKKyAgICBjb25zdCBjaGFyKiBrRmFsc2VbXSA9IHsgIjAiLCAiZiIsICJmYWxzZSIsICJuIiwgIm5vIiB9OworICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihrVHJ1ZSkgPT0gc2l6ZW9mKGtGYWxzZSksIHRydWVfZmFsc2VfZXF1YWwpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtUcnVlKS9zaXplb2YoKmtUcnVlKTsgKytpKSB7CisgICAgICBpZiAoc3RyY2FzZWNtcCh2YWx1ZSwga1RydWVbaV0pID09IDApIHsKKyAgICAgICAgU0VUX1ZBTFVFX0FTKGJvb2wsIHRydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcCh2YWx1ZSwga0ZhbHNlW2ldKSA9PSAwKSB7CisgICAgICAgIFNFVF9WQUxVRV9BUyhib29sLCBmYWxzZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7ICAgLy8gZGlkbid0IG1hdGNoIGEgbGVnYWwgaW5wdXQKKworICB9IGVsc2UgaWYgKHR5cGVfID09IEZWX1NUUklORykgeworICAgIFNFVF9WQUxVRV9BUyhzdHJpbmcsIHZhbHVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIE9LLCBpdCdzIGxpa2VseSB0byBiZSBudW1lcmljLCBhbmQgd2UnbGwgYmUgdXNpbmcgYSBzdHJ0b1hYWCBtZXRob2QuCisgIGlmICh2YWx1ZVswXSA9PSAnXDAnKSAgIC8vIGVtcHR5LXN0cmluZyBpcyBvbmx5IGFsbG93ZWQgZm9yIHN0cmluZyB0eXBlLgorICAgIHJldHVybiBmYWxzZTsKKyAgY2hhciogZW5kOworICAvLyBMZWFkaW5nIDB4IHB1dHMgdXMgaW4gYmFzZSAxNi4gIEJ1dCBsZWFkaW5nIDAgZG9lcyBub3QgcHV0IHVzIGluIGJhc2UgOCEKKyAgLy8gSXQgY2F1c2VkIHRvbyBtYW55IGJ1Z3Mgd2hlbiB3ZSBoYWQgdGhhdCBiZWhhdmlvci4KKyAgaW50IGJhc2UgPSAxMDsgICAgLy8gYnkgZGVmYXVsdAorICBpZiAodmFsdWVbMF0gPT0gJzAnICYmICh2YWx1ZVsxXSA9PSAneCcgfHwgdmFsdWVbMV0gPT0gJ1gnKSkKKyAgICBiYXNlID0gMTY7CisgIGVycm5vID0gMDsKKworICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBGVl9JTlQzMjogeworICAgICAgY29uc3QgaW50NjQgciA9IHN0cnRvNjQodmFsdWUsICZlbmQsIGJhc2UpOworICAgICAgaWYgKGVycm5vIHx8IGVuZCAhPSB2YWx1ZSArIHN0cmxlbih2YWx1ZSkpICByZXR1cm4gZmFsc2U7ICAvLyBiYWQgcGFyc2UKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQzMj4ocikgIT0gcikgIC8vIHdvcmtlZCwgYnV0IG51bWJlciBvdXQgb2YgcmFuZ2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgU0VUX1ZBTFVFX0FTKGludDMyLCBzdGF0aWNfY2FzdDxpbnQzMj4ocikpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgRlZfSU5UNjQ6IHsKKyAgICAgIGNvbnN0IGludDY0IHIgPSBzdHJ0bzY0KHZhbHVlLCAmZW5kLCBiYXNlKTsKKyAgICAgIGlmIChlcnJubyB8fCBlbmQgIT0gdmFsdWUgKyBzdHJsZW4odmFsdWUpKSAgcmV0dXJuIGZhbHNlOyAgLy8gYmFkIHBhcnNlCisgICAgICBTRVRfVkFMVUVfQVMoaW50NjQsIHIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgRlZfVUlOVDY0OiB7CisgICAgICB3aGlsZSAoKnZhbHVlID09ICcgJykgdmFsdWUrKzsKKyAgICAgIGlmICgqdmFsdWUgPT0gJy0nKSByZXR1cm4gZmFsc2U7ICAvLyBuZWdhdGl2ZSBudW1iZXIKKyAgICAgIGNvbnN0IHVpbnQ2NCByID0gc3RydG91NjQodmFsdWUsICZlbmQsIGJhc2UpOworICAgICAgaWYgKGVycm5vIHx8IGVuZCAhPSB2YWx1ZSArIHN0cmxlbih2YWx1ZSkpICByZXR1cm4gZmFsc2U7ICAvLyBiYWQgcGFyc2UKKyAgICAgIFNFVF9WQUxVRV9BUyh1aW50NjQsIHIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgRlZfRE9VQkxFOiB7CisgICAgICBjb25zdCBkb3VibGUgciA9IHN0cnRvZCh2YWx1ZSwgJmVuZCk7CisgICAgICBpZiAoZXJybm8gfHwgZW5kICE9IHZhbHVlICsgc3RybGVuKHZhbHVlKSkgIHJldHVybiBmYWxzZTsgIC8vIGJhZCBwYXJzZQorICAgICAgU0VUX1ZBTFVFX0FTKGRvdWJsZSwgcik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgYXNzZXJ0KGZhbHNlKTsgIC8vIHVua25vd24gdHlwZQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCitzdHJpbmcgRmxhZ1ZhbHVlOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgY2hhciBpbnRidWZbNjRdOyAgICAvLyBlbm91Z2ggdG8gaG9sZCBldmVuIHRoZSBiaWdnZXN0IG51bWJlcgorICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBGVl9CT09MOgorICAgICAgcmV0dXJuIFZBTFVFX0FTKGJvb2wpID8gInRydWUiIDogImZhbHNlIjsKKyAgICBjYXNlIEZWX0lOVDMyOgorICAgICAgc25wcmludGYoaW50YnVmLCBzaXplb2YoaW50YnVmKSwgIiUiIFBSSWQzMiwgVkFMVUVfQVMoaW50MzIpKTsKKyAgICAgIHJldHVybiBpbnRidWY7CisgICAgY2FzZSBGVl9JTlQ2NDoKKyAgICAgIHNucHJpbnRmKGludGJ1Ziwgc2l6ZW9mKGludGJ1ZiksICIlIiBQUklkNjQsIFZBTFVFX0FTKGludDY0KSk7CisgICAgICByZXR1cm4gaW50YnVmOworICAgIGNhc2UgRlZfVUlOVDY0OgorICAgICAgc25wcmludGYoaW50YnVmLCBzaXplb2YoaW50YnVmKSwgIiUiIFBSSXU2NCwgVkFMVUVfQVModWludDY0KSk7CisgICAgICByZXR1cm4gaW50YnVmOworICAgIGNhc2UgRlZfRE9VQkxFOgorICAgICAgc25wcmludGYoaW50YnVmLCBzaXplb2YoaW50YnVmKSwgIiUuMTdnIiwgVkFMVUVfQVMoZG91YmxlKSk7CisgICAgICByZXR1cm4gaW50YnVmOworICAgIGNhc2UgRlZfU1RSSU5HOgorICAgICAgcmV0dXJuIFZBTFVFX0FTKHN0cmluZyk7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICByZXR1cm4gIiI7ICAvLyB1bmtub3duIHR5cGUKKyAgfQorfQorCitib29sIEZsYWdWYWx1ZTo6VmFsaWRhdGUoY29uc3QgY2hhciogZmxhZ25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVGblByb3RvIHZhbGlkYXRlX2ZuX3Byb3RvKSBjb25zdCB7CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIEZWX0JPT0w6CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxib29sICgqKShjb25zdCBjaGFyKiwgYm9vbCk+KAorICAgICAgICAgIHZhbGlkYXRlX2ZuX3Byb3RvKShmbGFnbmFtZSwgVkFMVUVfQVMoYm9vbCkpOworICAgIGNhc2UgRlZfSU5UMzI6CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxib29sICgqKShjb25zdCBjaGFyKiwgaW50MzIpPigKKyAgICAgICAgICB2YWxpZGF0ZV9mbl9wcm90bykoZmxhZ25hbWUsIFZBTFVFX0FTKGludDMyKSk7CisgICAgY2FzZSBGVl9JTlQ2NDoKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGJvb2wgKCopKGNvbnN0IGNoYXIqLCBpbnQ2NCk+KAorICAgICAgICAgIHZhbGlkYXRlX2ZuX3Byb3RvKShmbGFnbmFtZSwgVkFMVUVfQVMoaW50NjQpKTsKKyAgICBjYXNlIEZWX1VJTlQ2NDoKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGJvb2wgKCopKGNvbnN0IGNoYXIqLCB1aW50NjQpPigKKyAgICAgICAgICB2YWxpZGF0ZV9mbl9wcm90bykoZmxhZ25hbWUsIFZBTFVFX0FTKHVpbnQ2NCkpOworICAgIGNhc2UgRlZfRE9VQkxFOgorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Ym9vbCAoKikoY29uc3QgY2hhciosIGRvdWJsZSk+KAorICAgICAgICAgIHZhbGlkYXRlX2ZuX3Byb3RvKShmbGFnbmFtZSwgVkFMVUVfQVMoZG91YmxlKSk7CisgICAgY2FzZSBGVl9TVFJJTkc6CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxib29sICgqKShjb25zdCBjaGFyKiwgY29uc3Qgc3RyaW5nJik+KAorICAgICAgICAgIHZhbGlkYXRlX2ZuX3Byb3RvKShmbGFnbmFtZSwgVkFMVUVfQVMoc3RyaW5nKSk7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydChmYWxzZSk7ICAvLyB1bmtub3duIHR5cGUKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitjb25zdCBjaGFyKiBGbGFnVmFsdWU6OlR5cGVOYW1lKCkgY29uc3QgeworICBzdGF0aWMgY29uc3QgY2hhciB0eXBlc1tdID0KKyAgICAgICJib29sXDB4eCIKKyAgICAgICJpbnQzMlwweCIKKyAgICAgICJpbnQ2NFwweCIKKyAgICAgICJ1aW50NjRcMCIKKyAgICAgICJkb3VibGVcMCIKKyAgICAgICJzdHJpbmciOworICBpZiAodHlwZV8gPiBGVl9NQVhfSU5ERVgpIHsKKyAgICBhc3NlcnQoZmFsc2UpOworICAgIHJldHVybiAiIjsKKyAgfQorICAvLyBEaXJlY3RseSBpbmRleGluZyB0aGUgc3RyaW5ncyBpbiB0aGUgJ3R5cGVzJyBzdHJpbmcsIGVhY2ggb2YgdGhlbSBpcyA3IGJ5dGVzIGxvbmcuCisgIHJldHVybiAmdHlwZXNbdHlwZV8gKiA3XTsKK30KKworYm9vbCBGbGFnVmFsdWU6OkVxdWFsKGNvbnN0IEZsYWdWYWx1ZSYgeCkgY29uc3QgeworICBpZiAodHlwZV8gIT0geC50eXBlXykKKyAgICByZXR1cm4gZmFsc2U7CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIEZWX0JPT0w6ICAgcmV0dXJuIFZBTFVFX0FTKGJvb2wpID09IE9USEVSX1ZBTFVFX0FTKHgsIGJvb2wpOworICAgIGNhc2UgRlZfSU5UMzI6ICByZXR1cm4gVkFMVUVfQVMoaW50MzIpID09IE9USEVSX1ZBTFVFX0FTKHgsIGludDMyKTsKKyAgICBjYXNlIEZWX0lOVDY0OiAgcmV0dXJuIFZBTFVFX0FTKGludDY0KSA9PSBPVEhFUl9WQUxVRV9BUyh4LCBpbnQ2NCk7CisgICAgY2FzZSBGVl9VSU5UNjQ6IHJldHVybiBWQUxVRV9BUyh1aW50NjQpID09IE9USEVSX1ZBTFVFX0FTKHgsIHVpbnQ2NCk7CisgICAgY2FzZSBGVl9ET1VCTEU6IHJldHVybiBWQUxVRV9BUyhkb3VibGUpID09IE9USEVSX1ZBTFVFX0FTKHgsIGRvdWJsZSk7CisgICAgY2FzZSBGVl9TVFJJTkc6IHJldHVybiBWQUxVRV9BUyhzdHJpbmcpID09IE9USEVSX1ZBTFVFX0FTKHgsIHN0cmluZyk7CisgICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlKTsgcmV0dXJuIGZhbHNlOyAgLy8gdW5rbm93biB0eXBlCisgIH0KK30KKworRmxhZ1ZhbHVlKiBGbGFnVmFsdWU6Ok5ldygpIGNvbnN0IHsKKyAgY29uc3QgY2hhciAqdHlwZSA9IFR5cGVOYW1lKCk7CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIEZWX0JPT0w6ICAgcmV0dXJuIG5ldyBGbGFnVmFsdWUobmV3IGJvb2woZmFsc2UpLCB0eXBlLCB0cnVlKTsKKyAgICBjYXNlIEZWX0lOVDMyOiAgcmV0dXJuIG5ldyBGbGFnVmFsdWUobmV3IGludDMyKDApLCB0eXBlLCB0cnVlKTsKKyAgICBjYXNlIEZWX0lOVDY0OiAgcmV0dXJuIG5ldyBGbGFnVmFsdWUobmV3IGludDY0KDApLCB0eXBlLCB0cnVlKTsKKyAgICBjYXNlIEZWX1VJTlQ2NDogcmV0dXJuIG5ldyBGbGFnVmFsdWUobmV3IHVpbnQ2NCgwKSwgdHlwZSwgdHJ1ZSk7CisgICAgY2FzZSBGVl9ET1VCTEU6IHJldHVybiBuZXcgRmxhZ1ZhbHVlKG5ldyBkb3VibGUoMC4wKSwgdHlwZSwgdHJ1ZSk7CisgICAgY2FzZSBGVl9TVFJJTkc6IHJldHVybiBuZXcgRmxhZ1ZhbHVlKG5ldyBzdHJpbmcsIHR5cGUsIHRydWUpOworICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7IHJldHVybiBOVUxMOyAgLy8gdW5rbm93biB0eXBlCisgIH0KK30KKwordm9pZCBGbGFnVmFsdWU6OkNvcHlGcm9tKGNvbnN0IEZsYWdWYWx1ZSYgeCkgeworICBhc3NlcnQodHlwZV8gPT0geC50eXBlXyk7CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIEZWX0JPT0w6ICAgU0VUX1ZBTFVFX0FTKGJvb2wsIE9USEVSX1ZBTFVFX0FTKHgsIGJvb2wpKTsgICAgICBicmVhazsKKyAgICBjYXNlIEZWX0lOVDMyOiAgU0VUX1ZBTFVFX0FTKGludDMyLCBPVEhFUl9WQUxVRV9BUyh4LCBpbnQzMikpOyAgICBicmVhazsKKyAgICBjYXNlIEZWX0lOVDY0OiAgU0VUX1ZBTFVFX0FTKGludDY0LCBPVEhFUl9WQUxVRV9BUyh4LCBpbnQ2NCkpOyAgICBicmVhazsKKyAgICBjYXNlIEZWX1VJTlQ2NDogU0VUX1ZBTFVFX0FTKHVpbnQ2NCwgT1RIRVJfVkFMVUVfQVMoeCwgdWludDY0KSk7ICBicmVhazsKKyAgICBjYXNlIEZWX0RPVUJMRTogU0VUX1ZBTFVFX0FTKGRvdWJsZSwgT1RIRVJfVkFMVUVfQVMoeCwgZG91YmxlKSk7ICBicmVhazsKKyAgICBjYXNlIEZWX1NUUklORzogU0VUX1ZBTFVFX0FTKHN0cmluZywgT1RIRVJfVkFMVUVfQVMoeCwgc3RyaW5nKSk7ICBicmVhazsKKyAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UpOyAgLy8gdW5rbm93biB0eXBlCisgIH0KK30KKworaW50IEZsYWdWYWx1ZTo6VmFsdWVTaXplKCkgY29uc3QgeworICBpZiAodHlwZV8gPiBGVl9NQVhfSU5ERVgpIHsKKyAgICBhc3NlcnQoZmFsc2UpOyAgLy8gdW5rbm93biB0eXBlCisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3RhdGljIGNvbnN0IHVpbnQ4IHZhbHVlc2l6ZVtdID0geworICAgIHNpemVvZihib29sKSwKKyAgICBzaXplb2YoaW50MzIpLAorICAgIHNpemVvZihpbnQ2NCksCisgICAgc2l6ZW9mKHVpbnQ2NCksCisgICAgc2l6ZW9mKGRvdWJsZSksCisgICAgc2l6ZW9mKHN0cmluZyksCisgIH07CisgIHJldHVybiB2YWx1ZXNpemVbdHlwZV9dOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbWFuZExpbmVGbGFnCisvLyAgICBUaGlzIHJlcHJlc2VudHMgYSBzaW5nbGUgZmxhZywgaW5jbHVkaW5nIGl0cyBuYW1lLCBkZXNjcmlwdGlvbiwKKy8vICAgIGRlZmF1bHQgdmFsdWUsIGFuZCBjdXJyZW50IHZhbHVlLiAgTW9zdGx5IHRoaXMgc2VydmVzIGFzIGEKKy8vICAgIHN0cnVjdCwgdGhvdWdoIGl0IGFsc28ga25vd3MgaG93IHRvIHJlZ2lzdGVyIGl0c2VsZi4KKy8vICAgICAgIEFsbCBDb21tYW5kTGluZUZsYWdzIGFyZSBvd25lZCBieSBhIChleGFjdGx5IG9uZSkKKy8vICAgIEZsYWdSZWdpc3RyeS4gIElmIHlvdSB3aXNoIHRvIG1vZGlmeSBmaWVsZHMgaW4gdGhpcyBjbGFzcywgeW91CisvLyAgICBzaG91bGQgYWNxdWlyZSB0aGUgRmxhZ1JlZ2lzdHJ5IGxvY2sgZm9yIHRoZSByZWdpc3RyeSB0aGF0IG93bnMKKy8vICAgIHRoaXMgZmxhZy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIENvbW1hbmRMaW5lRmxhZyB7CisgcHVibGljOgorICAvLyBOb3RlOiB3ZSB0YWtlIG92ZXIgbWVtb3J5LW93bmVyc2hpcCBvZiBjdXJyZW50X3ZhbCBhbmQgZGVmYXVsdF92YWwuCisgIENvbW1hbmRMaW5lRmxhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBoZWxwLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIEZsYWdWYWx1ZSogY3VycmVudF92YWwsIEZsYWdWYWx1ZSogZGVmYXVsdF92YWwpOworICB+Q29tbWFuZExpbmVGbGFnKCk7CisKKyAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgIGNvbnN0IGNoYXIqIGhlbHAoKSBjb25zdCB7IHJldHVybiBoZWxwXzsgfQorICBjb25zdCBjaGFyKiBmaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9CisgIGNvbnN0IGNoYXIqIENsZWFuRmlsZU5hbWUoKSBjb25zdDsgIC8vIG5peGVzIGlycmVsZXZhbnQgcHJlZml4IHN1Y2ggYXMgaG9tZWRpcgorICBzdHJpbmcgY3VycmVudF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfLT5Ub1N0cmluZygpOyB9CisgIHN0cmluZyBkZWZhdWx0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gZGVmdmFsdWVfLT5Ub1N0cmluZygpOyB9CisgIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGRlZnZhbHVlXy0+VHlwZU5hbWUoKTsgfQorICBWYWxpZGF0ZUZuUHJvdG8gdmFsaWRhdGVfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZV9mbl9wcm90b187IH0KKyAgY29uc3Qgdm9pZCogZmxhZ19wdHIoKSBjb25zdCB7IHJldHVybiBjdXJyZW50Xy0+dmFsdWVfYnVmZmVyXzsgfQorCisgIHZvaWQgRmlsbENvbW1hbmRMaW5lRmxhZ0luZm8oc3RydWN0IENvbW1hbmRMaW5lRmxhZ0luZm8qIHJlc3VsdCk7CisKKyAgLy8gSWYgdmFsaWRhdGVfZm5fcHJvdG9fIGlzIG5vbi1OVUxMLCBjYWxscyBpdCBvbiB2YWx1ZSwgcmV0dXJucyByZXN1bHQuCisgIGJvb2wgVmFsaWRhdGUoY29uc3QgRmxhZ1ZhbHVlJiB2YWx1ZSkgY29uc3Q7CisgIGJvb2wgVmFsaWRhdGVDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gVmFsaWRhdGUoKmN1cnJlbnRfKTsgfQorCisgcHJpdmF0ZToKKyAgLy8gZm9yIFNldEZsYWdMb2NrZWQoKSBhbmQgc2V0dGluZyBmbGFnc19ieV9wdHJfCisgIGZyaWVuZCBjbGFzcyBGbGFnUmVnaXN0cnk7CisgIGZyaWVuZCBjbGFzcyBHRkxBR1NfTkFNRVNQQUNFOjpGbGFnU2F2ZXJJbXBsOyAgLy8gZm9yIGNsb25pbmcgdGhlIHZhbHVlcworICAvLyBzZXQgdmFsaWRhdGVfZm4KKyAgZnJpZW5kIGJvb2wgQWRkRmxhZ1ZhbGlkYXRvcihjb25zdCB2b2lkKiwgVmFsaWRhdGVGblByb3RvKTsKKworICAvLyBUaGlzIGNvcGllcyBhbGwgdGhlIG5vbi1jb25zdCBtZW1iZXJzOiBtb2RpZmllZCwgcHJvY2Vzc2VkLCBkZWZ2YWx1ZSwgZXRjLgorICB2b2lkIENvcHlGcm9tKGNvbnN0IENvbW1hbmRMaW5lRmxhZyYgc3JjKTsKKworICB2b2lkIFVwZGF0ZU1vZGlmaWVkQml0KCk7CisKKyAgY29uc3QgY2hhciogY29uc3QgbmFtZV87ICAgICAvLyBGbGFnIG5hbWUKKyAgY29uc3QgY2hhciogY29uc3QgaGVscF87ICAgICAvLyBIZWxwIG1lc3NhZ2UKKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87ICAgICAvLyBXaGljaCBmaWxlIGRpZCB0aGlzIGNvbWUgZnJvbT8KKyAgYm9vbCBtb2RpZmllZF87ICAgICAgICAgICAgICAvLyBTZXQgYWZ0ZXIgZGVmYXVsdCBhc3NpZ25tZW50PworICBGbGFnVmFsdWUqIGRlZnZhbHVlXzsgICAgICAgIC8vIERlZmF1bHQgdmFsdWUgZm9yIGZsYWcKKyAgRmxhZ1ZhbHVlKiBjdXJyZW50XzsgICAgICAgICAvLyBDdXJyZW50IHZhbHVlIGZvciBmbGFnCisgIC8vIFRoaXMgaXMgYSBjYXN0ZWQsICdnZW5lcmljJyB2ZXJzaW9uIG9mIHZhbGlkYXRlX2ZuLCB3aGljaCBhY3R1YWxseQorICAvLyB0YWtlcyBhIGZsYWctdmFsdWUgYXMgYW4gYXJnICh2b2lkICgqdmFsaWRhdGVfZm4pKGJvb2wpLCBzYXkpLgorICAvLyBXaGVuIHdlIHBhc3MgdGhpcyB0byBjdXJyZW50Xy0+VmFsaWRhdGUoKSwgaXQgd2lsbCBjYXN0IGl0IGJhY2sgdG8KKyAgLy8gdGhlIHByb3BlciB0eXBlLiAgVGhpcyBtYXkgYmUgTlVMTCB0byBtZWFuIHdlIGhhdmUgbm8gdmFsaWRhdGVfZm4uCisgIFZhbGlkYXRlRm5Qcm90byB2YWxpZGF0ZV9mbl9wcm90b187CisKKyAgQ29tbWFuZExpbmVGbGFnKGNvbnN0IENvbW1hbmRMaW5lRmxhZyYpOyAgIC8vIG5vIGNvcHlpbmchCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENvbW1hbmRMaW5lRmxhZyYpOworfTsKKworQ29tbWFuZExpbmVGbGFnOjpDb21tYW5kTGluZUZsYWcoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogaGVscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlKiBjdXJyZW50X3ZhbCwgRmxhZ1ZhbHVlKiBkZWZhdWx0X3ZhbCkKKyAgICA6IG5hbWVfKG5hbWUpLCBoZWxwXyhoZWxwKSwgZmlsZV8oZmlsZW5hbWUpLCBtb2RpZmllZF8oZmFsc2UpLAorICAgICAgZGVmdmFsdWVfKGRlZmF1bHRfdmFsKSwgY3VycmVudF8oY3VycmVudF92YWwpLCB2YWxpZGF0ZV9mbl9wcm90b18oTlVMTCkgeworfQorCitDb21tYW5kTGluZUZsYWc6On5Db21tYW5kTGluZUZsYWcoKSB7CisgIGRlbGV0ZSBjdXJyZW50XzsKKyAgZGVsZXRlIGRlZnZhbHVlXzsKK30KKworY29uc3QgY2hhciogQ29tbWFuZExpbmVGbGFnOjpDbGVhbkZpbGVOYW1lKCkgY29uc3QgeworICAvLyBDb21wdXRlIHRvcC1sZXZlbCBkaXJlY3RvcnkgJiBmaWxlIHRoYXQgdGhpcyBhcHBlYXJzIGluCisgIC8vIHNlYXJjaCBmdWxsIHBhdGggYmFja3dhcmRzLgorICAvLyBTdG9wIGdvaW5nIGJhY2t3YXJkcyBhdCBrUm9vdERpcjsgYW5kIHNraXAgYnkgdGhlIGZpcnN0IHNsYXNoLgorICBzdGF0aWMgY29uc3QgY2hhciBrUm9vdERpcltdID0gIiI7ICAgIC8vIGNhbiBzZXQgdGhpcyB0byByb290IGRpcmVjdG9yeSwKKworICBpZiAoc2l6ZW9mKGtSb290RGlyKS0xID09IDApICAgICAgICAgIC8vIG5vIHByZWZpeCB0byBzdHJpcAorICAgIHJldHVybiBmaWxlbmFtZSgpOworCisgIGNvbnN0IGNoYXIqIGNsZWFuX25hbWUgPSBmaWxlbmFtZSgpICsgc3RybGVuKGZpbGVuYW1lKCkpIC0gMTsKKyAgd2hpbGUgKCBjbGVhbl9uYW1lID4gZmlsZW5hbWUoKSApIHsKKyAgICBpZiAoKmNsZWFuX25hbWUgPT0gUEFUSF9TRVBBUkFUT1IpIHsKKyAgICAgIGlmIChzdHJuY21wKGNsZWFuX25hbWUsIGtSb290RGlyLCBzaXplb2Yoa1Jvb3REaXIpLTEpID09IDApIHsKKyAgICAgICAgY2xlYW5fbmFtZSArPSBzaXplb2Yoa1Jvb3REaXIpLTE7ICAgIC8vIHBhc3Qgcm9vdC1kaXIKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIC0tY2xlYW5fbmFtZTsKKyAgfQorICB3aGlsZSAoICpjbGVhbl9uYW1lID09IFBBVEhfU0VQQVJBVE9SICkgKytjbGVhbl9uYW1lOyAgLy8gU2tpcCBhbnkgc2xhc2hlcworICByZXR1cm4gY2xlYW5fbmFtZTsKK30KKwordm9pZCBDb21tYW5kTGluZUZsYWc6OkZpbGxDb21tYW5kTGluZUZsYWdJbmZvKAorICAgIENvbW1hbmRMaW5lRmxhZ0luZm8qIHJlc3VsdCkgeworICByZXN1bHQtPm5hbWUgPSBuYW1lKCk7CisgIHJlc3VsdC0+dHlwZSA9IHR5cGVfbmFtZSgpOworICByZXN1bHQtPmRlc2NyaXB0aW9uID0gaGVscCgpOworICByZXN1bHQtPmN1cnJlbnRfdmFsdWUgPSBjdXJyZW50X3ZhbHVlKCk7CisgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZSA9IGRlZmF1bHRfdmFsdWUoKTsKKyAgcmVzdWx0LT5maWxlbmFtZSA9IENsZWFuRmlsZU5hbWUoKTsKKyAgVXBkYXRlTW9kaWZpZWRCaXQoKTsKKyAgcmVzdWx0LT5pc19kZWZhdWx0ID0gIW1vZGlmaWVkXzsKKyAgcmVzdWx0LT5oYXNfdmFsaWRhdG9yX2ZuID0gdmFsaWRhdGVfZnVuY3Rpb24oKSAhPSBOVUxMOworICByZXN1bHQtPmZsYWdfcHRyID0gZmxhZ19wdHIoKTsKK30KKwordm9pZCBDb21tYW5kTGluZUZsYWc6OlVwZGF0ZU1vZGlmaWVkQml0KCkgeworICAvLyBVcGRhdGUgdGhlICJtb2RpZmllZCIgYml0IGluIGNhc2Ugc29tZWJvZHkgYnlwYXNzZWQgdGhlCisgIC8vIEZsYWdzIEFQSSBhbmQgd3JvdGUgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRkxBR1NfbmFtZSB2YXJpYWJsZS4KKyAgaWYgKCFtb2RpZmllZF8gJiYgIWN1cnJlbnRfLT5FcXVhbCgqZGVmdmFsdWVfKSkgeworICAgIG1vZGlmaWVkXyA9IHRydWU7CisgIH0KK30KKwordm9pZCBDb21tYW5kTGluZUZsYWc6OkNvcHlGcm9tKGNvbnN0IENvbW1hbmRMaW5lRmxhZyYgc3JjKSB7CisgIC8vIE5vdGUgd2Ugb25seSBjb3B5IHRoZSBub24tY29uc3QgbWVtYmVyczsgb3RoZXJzIGFyZSBmaXhlZCBhdCBjb25zdHJ1Y3QgdGltZQorICBpZiAobW9kaWZpZWRfICE9IHNyYy5tb2RpZmllZF8pIG1vZGlmaWVkXyA9IHNyYy5tb2RpZmllZF87CisgIGlmICghY3VycmVudF8tPkVxdWFsKCpzcmMuY3VycmVudF8pKSBjdXJyZW50Xy0+Q29weUZyb20oKnNyYy5jdXJyZW50Xyk7CisgIGlmICghZGVmdmFsdWVfLT5FcXVhbCgqc3JjLmRlZnZhbHVlXykpIGRlZnZhbHVlXy0+Q29weUZyb20oKnNyYy5kZWZ2YWx1ZV8pOworICBpZiAodmFsaWRhdGVfZm5fcHJvdG9fICE9IHNyYy52YWxpZGF0ZV9mbl9wcm90b18pCisgICAgdmFsaWRhdGVfZm5fcHJvdG9fID0gc3JjLnZhbGlkYXRlX2ZuX3Byb3RvXzsKK30KKworYm9vbCBDb21tYW5kTGluZUZsYWc6OlZhbGlkYXRlKGNvbnN0IEZsYWdWYWx1ZSYgdmFsdWUpIGNvbnN0IHsKKworICBpZiAodmFsaWRhdGVfZnVuY3Rpb24oKSA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworICBlbHNlCisgICAgcmV0dXJuIHZhbHVlLlZhbGlkYXRlKG5hbWUoKSwgdmFsaWRhdGVfZnVuY3Rpb24oKSk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsYWdSZWdpc3RyeQorLy8gICAgQSBGbGFnUmVnaXN0cnkgc2luZ2xldG9uIG9iamVjdCBob2xkcyBhbGwgZmxhZyBvYmplY3RzIGluZGV4ZWQKKy8vICAgIGJ5IHRoZWlyIG5hbWVzIHNvIHRoYXQgaWYgeW91IGtub3cgYSBmbGFnJ3MgbmFtZSAoYXMgYSBDCisvLyAgICBzdHJpbmcpLCB5b3UgY2FuIGFjY2VzcyBvciBzZXQgaXQuICBJZiB0aGUgZnVuY3Rpb24gaXMgbmFtZWQKKy8vICAgIEZvb0xvY2tlZCgpLCB5b3UgbXVzdCBvd24gdGhlIHJlZ2lzdHJ5IGxvY2sgYmVmb3JlIGNhbGxpbmcKKy8vICAgIHRoZSBmdW5jdGlvbjsgb3RoZXJ3aXNlLCB5b3Ugc2hvdWxkICpub3QqIGhvbGQgdGhlIGxvY2ssIGFuZAorLy8gICAgdGhlIGZ1bmN0aW9uIHdpbGwgYWNxdWlyZSBpdCBpdHNlbGYgaWYgbmVlZGVkLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IFN0cmluZ0NtcCB7ICAvLyBVc2VkIGJ5IHRoZSBGbGFnUmVnaXN0cnkgbWFwIGNsYXNzIHRvIGNvbXBhcmUgY2hhcioncworICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeworICAgIHJldHVybiAoc3RyY21wKHMxLCBzMikgPCAwKTsKKyAgfQorfTsKKworCitjbGFzcyBGbGFnUmVnaXN0cnkgeworIHB1YmxpYzoKKyAgRmxhZ1JlZ2lzdHJ5KCkgeworICB9CisgIH5GbGFnUmVnaXN0cnkoKSB7CisgICAgLy8gTm90IHVzaW5nIFNUTERlbGV0ZUVsZW1lbnRzIGFzIHRoYXQgcmVzaWRlcyBpbiB1dGlsIGFuZCB0aGlzCisgICAgLy8gY2xhc3MgaXMgYmFzZS4KKyAgICBmb3IgKEZsYWdNYXA6Oml0ZXJhdG9yIHAgPSBmbGFnc18uYmVnaW4oKSwgZSA9IGZsYWdzXy5lbmQoKTsgcCAhPSBlOyArK3ApIHsKKyAgICAgIENvbW1hbmRMaW5lRmxhZyogZmxhZyA9IHAtPnNlY29uZDsKKyAgICAgIGRlbGV0ZSBmbGFnOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIERlbGV0ZUdsb2JhbFJlZ2lzdHJ5KCkgeworICAgIGRlbGV0ZSBnbG9iYWxfcmVnaXN0cnlfOworICAgIGdsb2JhbF9yZWdpc3RyeV8gPSBOVUxMOworICB9CisKKyAgLy8gU3RvcmUgYSBmbGFnIGluIHRoaXMgcmVnaXN0cnkuICBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIHBvaW50ZXIuCisgIHZvaWQgUmVnaXN0ZXJGbGFnKENvbW1hbmRMaW5lRmxhZyogZmxhZyk7CisKKyAgdm9pZCBMb2NrKCkgeyBsb2NrXy5Mb2NrKCk7IH0KKyAgdm9pZCBVbmxvY2soKSB7IGxvY2tfLlVubG9jaygpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgZmxhZyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZSwgb3IgTlVMTCBpZiBub3QgZm91bmQuCisgIENvbW1hbmRMaW5lRmxhZyogRmluZEZsYWdMb2NrZWQoY29uc3QgY2hhciogbmFtZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgZmxhZyBvYmplY3Qgd2hvc2UgY3VycmVudC12YWx1ZSBpcyBzdG9yZWQgYXQgZmxhZ19wdHIuCisgIC8vIFRoYXQgaXMsIGZvciB3aG9tIGN1cnJlbnRfLT52YWx1ZV9idWZmZXJfID09IGZsYWdfcHRyCisgIENvbW1hbmRMaW5lRmxhZyogRmluZEZsYWdWaWFQdHJMb2NrZWQoY29uc3Qgdm9pZCogZmxhZ19wdHIpOworCisgIC8vIEEgZmFuY2llciBmb3JtIG9mIEZpbmRGbGFnIHRoYXQgd29ya3MgY29ycmVjdGx5IGlmIG5hbWUgaXMgb2YgdGhlCisgIC8vIGZvcm0gZmxhZz12YWx1ZS4gIEluIHRoYXQgY2FzZSwgd2Ugc2V0IGtleSB0byBwb2ludCB0byBmbGFnLCBhbmQKKyAgLy8gbW9kaWZ5IHYgdG8gcG9pbnQgdG8gdGhlIHZhbHVlIChpZiBwcmVzZW50KSwgYW5kIHJldHVybiB0aGUgZmxhZworICAvLyB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgdGhlIGZsYWcgZG9lcyBub3QgZXhpc3QsIHJldHVybnMgTlVMTAorICAvLyBhbmQgc2V0cyBlcnJvcl9tZXNzYWdlLgorICBDb21tYW5kTGluZUZsYWcqIFNwbGl0QXJndW1lbnRMb2NrZWQoY29uc3QgY2hhciogYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGtleSwgY29uc3QgY2hhcioqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yX21lc3NhZ2UpOworCisgIC8vIFNldCB0aGUgdmFsdWUgb2YgYSBmbGFnLiAgSWYgdGhlIGZsYWcgd2FzIHN1Y2Nlc3NmdWxseSBzZXQgdG8KKyAgLy8gdmFsdWUsIHNldCBtc2cgdG8gaW5kaWNhdGUgdGhlIG5ldyBmbGFnLXZhbHVlLCBhbmQgcmV0dXJuIHRydWUuCisgIC8vIE90aGVyd2lzZSwgc2V0IG1zZyB0byBpbmRpY2F0ZSB0aGUgZXJyb3IsIGxlYXZlIGZsYWcgdW5jaGFuZ2VkLAorICAvLyBhbmQgcmV0dXJuIGZhbHNlLiAgbXNnIGNhbiBiZSBOVUxMLgorICBib29sIFNldEZsYWdMb2NrZWQoQ29tbWFuZExpbmVGbGFnKiBmbGFnLCBjb25zdCBjaGFyKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIEZsYWdTZXR0aW5nTW9kZSBzZXRfbW9kZSwgc3RyaW5nKiBtc2cpOworCisgIHN0YXRpYyBGbGFnUmVnaXN0cnkqIEdsb2JhbFJlZ2lzdHJ5KCk7ICAgLy8gcmV0dXJucyBhIHNpbmdsZXRvbiByZWdpc3RyeQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEdGTEFHU19OQU1FU1BBQ0U6OkZsYWdTYXZlckltcGw7ICAvLyByZWFkcyBhbGwgdGhlIGZsYWdzIGluIG9yZGVyIHRvIGNvcHkgdGhlbQorICBmcmllbmQgY2xhc3MgQ29tbWFuZExpbmVGbGFnUGFyc2VyOyAgICAvLyBmb3IgVmFsaWRhdGVBbGxGbGFncworICBmcmllbmQgdm9pZCBHRkxBR1NfTkFNRVNQQUNFOjpHZXRBbGxGbGFncyh2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz4qKTsKKworICAvLyBUaGUgbWFwIGZyb20gbmFtZSB0byBmbGFnLCBmb3IgRmluZEZsYWdMb2NrZWQoKS4KKyAgdHlwZWRlZiBtYXA8Y29uc3QgY2hhciosIENvbW1hbmRMaW5lRmxhZyosIFN0cmluZ0NtcD4gRmxhZ01hcDsKKyAgdHlwZWRlZiBGbGFnTWFwOjppdGVyYXRvciBGbGFnSXRlcmF0b3I7CisgIHR5cGVkZWYgRmxhZ01hcDo6Y29uc3RfaXRlcmF0b3IgRmxhZ0NvbnN0SXRlcmF0b3I7CisgIEZsYWdNYXAgZmxhZ3NfOworCisgIC8vIFRoZSBtYXAgZnJvbSBjdXJyZW50LXZhbHVlIHBvaW50ZXIgdG8gZmxhZywgZm8gRmluZEZsYWdWaWFQdHJMb2NrZWQoKS4KKyAgdHlwZWRlZiBtYXA8Y29uc3Qgdm9pZCosIENvbW1hbmRMaW5lRmxhZyo+IEZsYWdQdHJNYXA7CisgIEZsYWdQdHJNYXAgZmxhZ3NfYnlfcHRyXzsKKworICBzdGF0aWMgRmxhZ1JlZ2lzdHJ5KiBnbG9iYWxfcmVnaXN0cnlfOyAgIC8vIGEgc2luZ2xldG9uIHJlZ2lzdHJ5CisKKyAgTXV0ZXggbG9ja187CisgIHN0YXRpYyBNdXRleCBnbG9iYWxfcmVnaXN0cnlfbG9ja187CisKKyAgc3RhdGljIHZvaWQgSW5pdEdsb2JhbFJlZ2lzdHJ5KCk7CisKKyAgLy8gRGlzYWxsb3cKKyAgRmxhZ1JlZ2lzdHJ5KGNvbnN0IEZsYWdSZWdpc3RyeSYpOworICBGbGFnUmVnaXN0cnkmIG9wZXJhdG9yPShjb25zdCBGbGFnUmVnaXN0cnkmKTsKK307CisKK2NsYXNzIEZsYWdSZWdpc3RyeUxvY2sgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRmxhZ1JlZ2lzdHJ5TG9jayhGbGFnUmVnaXN0cnkqIGZyKSA6IGZyXyhmcikgeyBmcl8tPkxvY2soKTsgfQorICB+RmxhZ1JlZ2lzdHJ5TG9jaygpIHsgZnJfLT5VbmxvY2soKTsgfQorIHByaXZhdGU6CisgIEZsYWdSZWdpc3RyeSAqY29uc3QgZnJfOworfTsKKworCit2b2lkIEZsYWdSZWdpc3RyeTo6UmVnaXN0ZXJGbGFnKENvbW1hbmRMaW5lRmxhZyogZmxhZykgeworICBMb2NrKCk7CisgIHBhaXI8RmxhZ0l0ZXJhdG9yLCBib29sPiBpbnMgPQorICAgIGZsYWdzXy5pbnNlcnQocGFpcjxjb25zdCBjaGFyKiwgQ29tbWFuZExpbmVGbGFnKj4oZmxhZy0+bmFtZSgpLCBmbGFnKSk7CisgIGlmIChpbnMuc2Vjb25kID09IGZhbHNlKSB7ICAgLy8gbWVhbnMgdGhlIG5hbWUgd2FzIGFscmVhZHkgaW4gdGhlIG1hcAorICAgIGlmIChzdHJjbXAoaW5zLmZpcnN0LT5zZWNvbmQtPmZpbGVuYW1lKCksIGZsYWctPmZpbGVuYW1lKCkpICE9IDApIHsKKyAgICAgIFJlcG9ydEVycm9yKERJRSwgIkVSUk9SOiBmbGFnICclcycgd2FzIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UgIgorICAgICAgICAgICAgICAgICAgIihpbiBmaWxlcyAnJXMnIGFuZCAnJXMnKS5cbiIsCisgICAgICAgICAgICAgICAgICBmbGFnLT5uYW1lKCksCisgICAgICAgICAgICAgICAgICBpbnMuZmlyc3QtPnNlY29uZC0+ZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgIGZsYWctPmZpbGVuYW1lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBSZXBvcnRFcnJvcihESUUsICJFUlJPUjogc29tZXRoaW5nIHdyb25nIHdpdGggZmxhZyAnJXMnIGluIGZpbGUgJyVzJy4gICIKKyAgICAgICAgICAgICAgICAgICJPbmUgcG9zc2liaWxpdHk6IGZpbGUgJyVzJyBpcyBiZWluZyBsaW5rZWQgYm90aCBzdGF0aWNhbGx5ICIKKyAgICAgICAgICAgICAgICAgICJhbmQgZHluYW1pY2FsbHkgaW50byB0aGlzIGV4ZWN1dGFibGUuXG4iLAorICAgICAgICAgICAgICAgICAgZmxhZy0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAgZmxhZy0+ZmlsZW5hbWUoKSwgZmxhZy0+ZmlsZW5hbWUoKSk7CisgICAgfQorICB9CisgIC8vIEFsc28gYWRkIHRvIHRoZSBmbGFnc19ieV9wdHJfIG1hcC4KKyAgZmxhZ3NfYnlfcHRyX1tmbGFnLT5jdXJyZW50Xy0+dmFsdWVfYnVmZmVyX10gPSBmbGFnOworICBVbmxvY2soKTsKK30KKworQ29tbWFuZExpbmVGbGFnKiBGbGFnUmVnaXN0cnk6OkZpbmRGbGFnTG9ja2VkKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgRmxhZ0NvbnN0SXRlcmF0b3IgaSA9IGZsYWdzXy5maW5kKG5hbWUpOworICBpZiAoaSA9PSBmbGFnc18uZW5kKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gaS0+c2Vjb25kOworICB9Cit9CisKK0NvbW1hbmRMaW5lRmxhZyogRmxhZ1JlZ2lzdHJ5OjpGaW5kRmxhZ1ZpYVB0ckxvY2tlZChjb25zdCB2b2lkKiBmbGFnX3B0cikgeworICBGbGFnUHRyTWFwOjpjb25zdF9pdGVyYXRvciBpID0gZmxhZ3NfYnlfcHRyXy5maW5kKGZsYWdfcHRyKTsKKyAgaWYgKGkgPT0gZmxhZ3NfYnlfcHRyXy5lbmQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIHJldHVybiBpLT5zZWNvbmQ7CisgIH0KK30KKworQ29tbWFuZExpbmVGbGFnKiBGbGFnUmVnaXN0cnk6OlNwbGl0QXJndW1lbnRMb2NrZWQoY29uc3QgY2hhciogYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3JfbWVzc2FnZSkgeworICAvLyBGaW5kIHRoZSBmbGFnIG9iamVjdCBmb3IgdGhpcyBvcHRpb24KKyAgY29uc3QgY2hhciogZmxhZ19uYW1lOworICBjb25zdCBjaGFyKiB2YWx1ZSA9IHN0cmNocihhcmcsICc9Jyk7CisgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAga2V5LT5hc3NpZ24oYXJnKTsKKyAgICAqdiA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgLy8gU3RyaXAgb3V0IHRoZSAiPXZhbHVlIiBwb3J0aW9uIGZyb20gYXJnCisgICAga2V5LT5hc3NpZ24oYXJnLCB2YWx1ZS1hcmcpOworICAgICp2ID0gKyt2YWx1ZTsgICAgLy8gYWR2YW5jZSBwYXN0IHRoZSAnPScKKyAgfQorICBmbGFnX25hbWUgPSBrZXktPmNfc3RyKCk7CisKKyAgQ29tbWFuZExpbmVGbGFnKiBmbGFnID0gRmluZEZsYWdMb2NrZWQoZmxhZ19uYW1lKTsKKworICBpZiAoZmxhZyA9PSBOVUxMKSB7CisgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCB0aGUgZmxhZy1uYW1lLCB0aGVuIHdlIHNob3VsZCByZXR1cm4gYW4gZXJyb3IuCisgICAgLy8gVGhlIG9uZSBleGNlcHRpb24gaXMgaWYgMSkgdGhlIGZsYWctbmFtZSBpcyAnbm94JywgMikgdGhlcmUKKyAgICAvLyBleGlzdHMgYSBmbGFnIG5hbWVkICd4JywgYW5kIDMpICd4JyBpcyBhIGJvb2xlYW4gZmxhZy4KKyAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHdhbnQgdG8gcmV0dXJuIGZsYWcgJ3gnLgorICAgIGlmICghKGZsYWdfbmFtZVswXSA9PSAnbicgJiYgZmxhZ19uYW1lWzFdID09ICdvJykpIHsKKyAgICAgIC8vIGZsYWctbmFtZSBpcyBub3QgJ25veCcsIHNvIHdlJ3JlIG5vdCBpbiB0aGUgZXhjZXB0aW9uIGNhc2UuCisgICAgICAqZXJyb3JfbWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXN1bmtub3duIGNvbW1hbmQgbGluZSBmbGFnICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXJyb3IsIGtleS0+Y19zdHIoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZmxhZyA9IEZpbmRGbGFnTG9ja2VkKGZsYWdfbmFtZSsyKTsKKyAgICBpZiAoZmxhZyA9PSBOVUxMKSB7CisgICAgICAvLyBObyBmbGFnIG5hbWVkICd4JyBleGlzdHMsIHNvIHdlJ3JlIG5vdCBpbiB0aGUgZXhjZXB0aW9uIGNhc2UuCisgICAgICAqZXJyb3JfbWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXN1bmtub3duIGNvbW1hbmQgbGluZSBmbGFnICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXJyb3IsIGtleS0+Y19zdHIoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHN0cmNtcChmbGFnLT50eXBlX25hbWUoKSwgImJvb2wiKSAhPSAwKSB7CisgICAgICAvLyAneCcgZXhpc3RzIGJ1dCBpcyBub3QgYm9vbGVhbiwgc28gd2UncmUgbm90IGluIHRoZSBleGNlcHRpb24gY2FzZS4KKyAgICAgICplcnJvcl9tZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICIlc2Jvb2xlYW4gdmFsdWUgKCVzKSBzcGVjaWZpZWQgZm9yICVzIGNvbW1hbmQgbGluZSBmbGFnXG4iLAorICAgICAgICAgIGtFcnJvciwga2V5LT5jX3N0cigpLCBmbGFnLT50eXBlX25hbWUoKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gV2UncmUgaW4gdGhlIGV4Y2VwdGlvbiBjYXNlIQorICAgIC8vIE1ha2UgdXAgYSBmYWtlIHZhbHVlIHRvIHJlcGxhY2UgdGhlICJubyIgd2Ugc3RyaXBwZWQgb3V0CisgICAga2V5LT5hc3NpZ24oZmxhZ19uYW1lKzIpOyAgIC8vIHRoZSBuYW1lIHdpdGhvdXQgdGhlICJubyIKKyAgICAqdiA9ICIwIjsKKyAgfQorCisgIC8vIEFzc2lnbiBhIHZhbHVlIGlmIHRoaXMgaXMgYSBib29sZWFuIGZsYWcKKyAgaWYgKCp2ID09IE5VTEwgJiYgc3RyY21wKGZsYWctPnR5cGVfbmFtZSgpLCAiYm9vbCIpID09IDApIHsKKyAgICAqdiA9ICIxIjsgICAgLy8gdGhlIC0tbm94IGNhc2Ugd2FzIGFscmVhZHkgaGFuZGxlZCwgc28gdGhpcyBpcyB0aGUgLS14IGNhc2UKKyAgfQorCisgIHJldHVybiBmbGFnOworfQorCitib29sIFRyeVBhcnNlTG9ja2VkKGNvbnN0IENvbW1hbmRMaW5lRmxhZyogZmxhZywgRmxhZ1ZhbHVlKiBmbGFnX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgc3RyaW5nKiBtc2cpIHsKKyAgLy8gVXNlIHRlbmF0aXZlX3ZhbHVlLCBub3QgZmxhZ192YWx1ZSwgdW50aWwgd2Uga25vdyB2YWx1ZSBpcyB2YWxpZC4KKyAgRmxhZ1ZhbHVlKiB0ZW50YXRpdmVfdmFsdWUgPSBmbGFnX3ZhbHVlLT5OZXcoKTsKKyAgaWYgKCF0ZW50YXRpdmVfdmFsdWUtPlBhcnNlRnJvbSh2YWx1ZSkpIHsKKyAgICBpZiAobXNnKSB7CisgICAgICBTdHJpbmdBcHBlbmRGKG1zZywKKyAgICAgICAgICAgICAgICAgICAgIiVzaWxsZWdhbCB2YWx1ZSAnJXMnIHNwZWNpZmllZCBmb3IgJXMgZmxhZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICBrRXJyb3IsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICBmbGFnLT50eXBlX25hbWUoKSwgZmxhZy0+bmFtZSgpKTsKKyAgICB9CisgICAgZGVsZXRlIHRlbnRhdGl2ZV92YWx1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAoIWZsYWctPlZhbGlkYXRlKCp0ZW50YXRpdmVfdmFsdWUpKSB7CisgICAgaWYgKG1zZykgeworICAgICAgU3RyaW5nQXBwZW5kRihtc2csCisgICAgICAgICAgIiVzZmFpbGVkIHZhbGlkYXRpb24gb2YgbmV3IHZhbHVlICclcycgZm9yIGZsYWcgJyVzJ1xuIiwKKyAgICAgICAgICBrRXJyb3IsIHRlbnRhdGl2ZV92YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgIGZsYWctPm5hbWUoKSk7CisgICAgfQorICAgIGRlbGV0ZSB0ZW50YXRpdmVfdmFsdWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIGZsYWdfdmFsdWUtPkNvcHlGcm9tKCp0ZW50YXRpdmVfdmFsdWUpOworICAgIGlmIChtc2cpIHsKKyAgICAgIFN0cmluZ0FwcGVuZEYobXNnLCAiJXMgc2V0IHRvICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBmbGFnLT5uYW1lKCksIGZsYWdfdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorICAgIGRlbGV0ZSB0ZW50YXRpdmVfdmFsdWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworYm9vbCBGbGFnUmVnaXN0cnk6OlNldEZsYWdMb2NrZWQoQ29tbWFuZExpbmVGbGFnKiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnU2V0dGluZ01vZGUgc2V0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIG1zZykgeworICBmbGFnLT5VcGRhdGVNb2RpZmllZEJpdCgpOworICBzd2l0Y2ggKHNldF9tb2RlKSB7CisgICAgY2FzZSBTRVRfRkxBR1NfVkFMVUU6IHsKKyAgICAgIC8vIHNldCBvciBtb2RpZnkgdGhlIGZsYWcncyB2YWx1ZQorICAgICAgaWYgKCFUcnlQYXJzZUxvY2tlZChmbGFnLCBmbGFnLT5jdXJyZW50XywgdmFsdWUsIG1zZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGZsYWctPm1vZGlmaWVkXyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBTRVRfRkxBR19JRl9ERUZBVUxUOiB7CisgICAgICAvLyBzZXQgdGhlIGZsYWcncyB2YWx1ZSwgYnV0IG9ubHkgaWYgaXQgaGFzbid0IGJlZW4gc2V0IGJ5IHNvbWVvbmUgZWxzZQorICAgICAgaWYgKCFmbGFnLT5tb2RpZmllZF8pIHsKKyAgICAgICAgaWYgKCFUcnlQYXJzZUxvY2tlZChmbGFnLCBmbGFnLT5jdXJyZW50XywgdmFsdWUsIG1zZykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmbGFnLT5tb2RpZmllZF8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKm1zZyA9IFN0cmluZ1ByaW50ZigiJXMgc2V0IHRvICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLT5uYW1lKCksIGZsYWctPmN1cnJlbnRfdmFsdWUoKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFNFVF9GTEFHU19ERUZBVUxUOiB7CisgICAgICAvLyBtb2RpZnkgdGhlIGZsYWcncyBkZWZhdWx0LXZhbHVlCisgICAgICBpZiAoIVRyeVBhcnNlTG9ja2VkKGZsYWcsIGZsYWctPmRlZnZhbHVlXywgdmFsdWUsIG1zZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghZmxhZy0+bW9kaWZpZWRfKSB7CisgICAgICAgIC8vIE5lZWQgdG8gc2V0IGJvdGggZGVmdmFsdWUgKmFuZCogY3VycmVudCwgaW4gdGhpcyBjYXNlCisgICAgICAgIFRyeVBhcnNlTG9ja2VkKGZsYWcsIGZsYWctPmN1cnJlbnRfLCB2YWx1ZSwgTlVMTCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgLy8gdW5rbm93biBzZXRfbW9kZQorICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gR2V0IHRoZSBzaW5nbGV0b24gRmxhZ1JlZ2lzdHJ5IG9iamVjdAorRmxhZ1JlZ2lzdHJ5KiBGbGFnUmVnaXN0cnk6Omdsb2JhbF9yZWdpc3RyeV8gPSBOVUxMOworTXV0ZXggRmxhZ1JlZ2lzdHJ5OjpnbG9iYWxfcmVnaXN0cnlfbG9ja18oTXV0ZXg6OkxJTktFUl9JTklUSUFMSVpFRCk7CisKK0ZsYWdSZWdpc3RyeSogRmxhZ1JlZ2lzdHJ5OjpHbG9iYWxSZWdpc3RyeSgpIHsKKyAgTXV0ZXhMb2NrIGFjcXVpcmVfbG9jaygmZ2xvYmFsX3JlZ2lzdHJ5X2xvY2tfKTsKKyAgaWYgKCFnbG9iYWxfcmVnaXN0cnlfKSB7CisgICAgZ2xvYmFsX3JlZ2lzdHJ5XyA9IG5ldyBGbGFnUmVnaXN0cnk7CisgIH0KKyAgcmV0dXJuIGdsb2JhbF9yZWdpc3RyeV87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21tYW5kTGluZUZsYWdQYXJzZXIKKy8vICAgIFBhcnNpbmcgaXMgZG9uZSBpbiB0d28gc3RhZ2VzLiAgSW4gdGhlIGZpcnN0LCB3ZSBnbyB0aHJvdWdoCisvLyAgICBhcmd2LiAgRm9yIGV2ZXJ5IGZsYWctbGlrZSBhcmcgd2UgY2FuIG1ha2Ugc2Vuc2Ugb2YsIHdlIHBhcnNlCisvLyAgICBpdCBhbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSBGTEFHU18qIHZhcmlhYmxlLiAgRm9yIGV2ZXJ5IGZsYWctCisvLyAgICBsaWtlIGFyZyB3ZSBjYW4ndCBtYWtlIHNlbnNlIG9mLCB3ZSBzdG9yZSBpdCBpbiBhIHZlY3RvciwKKy8vICAgIGFsb25nIHdpdGggYW4gZXhwbGFuYXRpb24gb2YgdGhlIHRyb3VibGUuICBJbiBzdGFnZSAyLCB3ZQorLy8gICAgaGFuZGxlIHRoZSAncmVwb3J0aW5nJyBmbGFncyBsaWtlIC0taGVscCBhbmQgLS1tcG1fdmVyc2lvbi4KKy8vICAgIChUaGlzIGlzIHZpYSBhIGNhbGwgdG8gSGFuZGxlQ29tbWFuZExpbmVIZWxwRmxhZ3MoKSwgaW4KKy8vICAgIGdmbGFnc19yZXBvcnRpbmcuY2MuKQorLy8gICAgQW4gb3B0aW9uYWwgc3RhZ2UgMyBwcmludHMgb3V0IHRoZSBlcnJvciBtZXNzYWdlcy4KKy8vICAgICAgIFRoaXMgaXMgYSBiaXQgb2YgYSBzaW1wbGlmaWNhdGlvbi4gIEZvciBpbnN0YW5jZSwgLS1mbGFnZmlsZQorLy8gICAgaXMgaGFuZGxlZCBhcyBzb29uIGFzIGl0J3Mgc2VlbiBpbiBzdGFnZSAxLCBub3QgaW4gc3RhZ2UgMi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIENvbW1hbmRMaW5lRmxhZ1BhcnNlciB7CisgcHVibGljOgorICAvLyBUaGUgYXJndW1lbnQgaXMgdGhlIGZsYWctcmVnaXN0cnkgdG8gcmVnaXN0ZXIgdGhlIHBhcnNlZCBmbGFncyBpbgorICBleHBsaWNpdCBDb21tYW5kTGluZUZsYWdQYXJzZXIoRmxhZ1JlZ2lzdHJ5KiByZWcpIDogcmVnaXN0cnlfKHJlZykge30KKyAgfkNvbW1hbmRMaW5lRmxhZ1BhcnNlcigpIHt9CisKKyAgLy8gU3RhZ2UgMTogRXZlcnkgdGltZSB0aGlzIGlzIGNhbGxlZCwgaXQgcmVhZHMgYWxsIGZsYWdzIGluIGFyZ3YuCisgIC8vIEhvd2V2ZXIsIGl0IGlnbm9yZXMgYWxsIGZsYWdzIHRoYXQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQKKyAgLy8gYmVmb3JlLiAgVHlwaWNhbGx5IHRoaXMgaXMgb25seSBjYWxsZWQgb25jZSwgc28gdGhpcyAncmVwYXJzaW5nJworICAvLyBiZWhhdmlvciBpc24ndCBpbXBvcnRhbnQuICBJdCBjYW4gYmUgdXNlZnVsIHdoZW4gdHJ5aW5nIHRvCisgIC8vIHJlcGFyc2UgYWZ0ZXIgbG9hZGluZyBhIGRsbCwgdGhvdWdoLgorICB1aW50MzIgUGFyc2VOZXdDb21tYW5kTGluZUZsYWdzKGludCogYXJnYywgY2hhcioqKiBhcmd2LCBib29sIHJlbW92ZV9mbGFncyk7CisKKyAgLy8gU3RhZ2UgMjogcHJpbnQgcmVwb3J0aW5nIGluZm8gYW5kIGV4aXQsIGlmIHJlcXVlc3RlZC4KKyAgLy8gSW4gZ2ZsYWdzX3JlcG9ydGluZy5jYzpIYW5kbGVDb21tYW5kTGluZUhlbHBGbGFncygpLgorCisgIC8vIFN0YWdlIDM6IHZhbGlkYXRlIGFsbCB0aGUgY29tbWFuZGxpbmUgZmxhZ3MgdGhhdCBoYXZlIHZhbGlkYXRvcnMKKyAgLy8gcmVnaXN0ZXJlZC4KKyAgdm9pZCBWYWxpZGF0ZUFsbEZsYWdzKCk7CisKKyAgLy8gU3RhZ2UgNDogcmVwb3J0IGFueSBlcnJvcnMgYW5kIHJldHVybiB0cnVlIGlmIGFueSB3ZXJlIGZvdW5kLgorICBib29sIFJlcG9ydEVycm9ycygpOworCisgIC8vIFNldCBhIHBhcnRpY3VsYXIgY29tbWFuZCBsaW5lIG9wdGlvbi4gICJuZXd2YWwiIGlzIGEgc3RyaW5nCisgIC8vIGRlc2NyaWJpbmcgdGhlIG5ldyB2YWx1ZSB0aGF0IHRoZSBvcHRpb24gaGFzIGJlZW4gc2V0IHRvLiAgSWYKKyAgLy8gb3B0aW9uX25hbWUgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbGlkIG9wdGlvbiBuYW1lLCBvciB2YWx1ZSBpcyBub3QKKyAgLy8gYSB2YWxpZCB2YWx1ZSBmb3Igb3B0aW9uX25hbWUsIG5ld3ZhbCBpcyBlbXB0eS4gIERvZXMgcmVjdXJzaXZlCisgIC8vIHByb2Nlc3NpbmcgZm9yIC0tZmxhZ2ZpbGUgYW5kIC0tZnJvbWVudi4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZQorICAvLyBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIG9yIGVtcHR5LXN0cmluZyBpZiBub3QuICAoQWN0dWFsbHksIHRoZQorICAvLyByZXR1cm4tc3RyaW5nIGNvdWxkIGhvbGQgbWFueSBmbGFnL3ZhbHVlIHBhaXJzIGR1ZSB0byAtLWZsYWdmaWxlLikKKyAgLy8gTkI6IE11c3QgaGF2ZSBjYWxsZWQgcmVnaXN0cnlfLT5Mb2NrKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgc3RyaW5nIFByb2Nlc3NTaW5nbGVPcHRpb25Mb2NrZWQoQ29tbWFuZExpbmVGbGFnKiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1NldHRpbmdNb2RlIHNldF9tb2RlKTsKKworICAvLyBTZXQgYSB3aG9sZSBiYXRjaCBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcyBzcGVjaWZpZWQgYnkgY29udGVudGRhdGEsCisgIC8vIHdoaWNoIGlzIGluIGZsYWdmaWxlIGZvcm1hdCAoYW5kIHByb2JhYmx5IGhhcyBiZWVuIHJlYWQgZnJvbSBhIGZsYWdmaWxlKS4KKyAgLy8gUmV0dXJucyB0aGUgbmV3IHZhbHVlIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgb3IgZW1wdHktc3RyaW5nIGlmCisgIC8vIG5vdC4gIChBY3R1YWxseSwgdGhlIHJldHVybi1zdHJpbmcgY291bGQgaG9sZCBtYW55IGZsYWcvdmFsdWUKKyAgLy8gcGFpcnMgZHVlIHRvIC0tZmxhZ2ZpbGUuKQorICAvLyBOQjogTXVzdCBoYXZlIGNhbGxlZCByZWdpc3RyeV8tPkxvY2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICBzdHJpbmcgUHJvY2Vzc09wdGlvbnNGcm9tU3RyaW5nTG9ja2VkKGNvbnN0IHN0cmluZyYgY29udGVudGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1NldHRpbmdNb2RlIHNldF9tb2RlKTsKKworICAvLyBUaGVzZSBhcmUgdGhlICdyZWN1cnNpdmUnIGZsYWdzLCBkZWZpbmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLgorICAvLyBXaGVuZXZlciB3ZSBzZWUgdGhlc2UgZmxhZ3Mgb24gdGhlIGNvbW1hbmRsaW5lLCB3ZSBtdXN0IHRha2UgYWN0aW9uLgorICAvLyBUaGVzZSBhcmUgY2FsbGVkIGJ5IFByb2Nlc3NTaW5nbGVPcHRpb25Mb2NrZWQgYW5kLCBzaW1pbGFybHksIHJldHVybgorICAvLyBuZXcgdmFsdWVzIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgb3IgdGhlIGVtcHR5LXN0cmluZyBpZiBub3QuCisgIHN0cmluZyBQcm9jZXNzRmxhZ2ZpbGVMb2NrZWQoY29uc3Qgc3RyaW5nJiBmbGFndmFsLCBGbGFnU2V0dGluZ01vZGUgc2V0X21vZGUpOworICAvLyBkaWZmIGZyb21lbnYvdHJ5ZnJvbWVudgorICBzdHJpbmcgUHJvY2Vzc0Zyb21lbnZMb2NrZWQoY29uc3Qgc3RyaW5nJiBmbGFndmFsLCBGbGFnU2V0dGluZ01vZGUgc2V0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVycm9yc19hcmVfZmF0YWwpOworCisgcHJpdmF0ZToKKyAgRmxhZ1JlZ2lzdHJ5KiBjb25zdCByZWdpc3RyeV87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gZXJyb3JfZmxhZ3NfOyAgICAgIC8vIG1hcCBmcm9tIG5hbWUgdG8gZXJyb3IgbWVzc2FnZQorICAvLyBUaGlzIGNvdWxkIGJlIGEgc2V0PHN0cmluZz4sIGJ1dCB3ZSByZXVzZSB0aGUgbWFwIHRvIG1pbmltaXplIHRoZSAubyBzaXplCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdW5kZWZpbmVkX25hbWVzXzsgIC8vIC0tW2ZsYWddIG5hbWUgd2FzIG5vdCByZWdpc3RlcmVkCit9OworCisKKy8vIFBhcnNlIGEgbGlzdCBvZiAoY29tbWEtc2VwYXJhdGVkKSBmbGFncy4KK3N0YXRpYyB2b2lkIFBhcnNlRmxhZ0xpc3QoY29uc3QgY2hhciogdmFsdWUsIHZlY3RvcjxzdHJpbmc+KiBmbGFncykgeworICBmb3IgKGNvbnN0IGNoYXIgKnAgPSB2YWx1ZTsgcCAmJiAqcDsgdmFsdWUgPSBwKSB7CisgICAgcCA9IHN0cmNocih2YWx1ZSwgJywnKTsKKyAgICBzaXplX3QgbGVuOworICAgIGlmIChwKSB7CisgICAgICBsZW4gPSBwIC0gdmFsdWU7CisgICAgICBwKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGxlbiA9IHN0cmxlbih2YWx1ZSk7CisgICAgfQorCisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgUmVwb3J0RXJyb3IoRElFLCAiRVJST1I6IGVtcHR5IGZsYWdsaXN0IGVudHJ5XG4iKTsKKyAgICBpZiAodmFsdWVbMF0gPT0gJy0nKQorICAgICAgUmVwb3J0RXJyb3IoRElFLCAiRVJST1I6IGZsYWcgXCIlKnNcIiBiZWdpbnMgd2l0aCAnLSdcbiIsIGxlbiwgdmFsdWUpOworCisgICAgZmxhZ3MtPnB1c2hfYmFjayhzdHJpbmcodmFsdWUsIGxlbikpOworICB9Cit9CisKKy8vIFNuYXJmIGFuIGVudGlyZSBmaWxlIGludG8gYSBDKysgc3RyaW5nLiAgVGhpcyBpcyBqdXN0IHNvIHRoYXQgd2UKKy8vIGNhbiBkbyBhbGwgdGhlIEkvTyBpbiBvbmUgcGxhY2UgYW5kIG5vdCB3b3JyeSBhYm91dCBpdCBldmVyeXdoZXJlLgorLy8gUGx1cywgaXQncyBjb252ZW5pZW50IHRvIGhhdmUgdGhlIHdob2xlIGZpbGUgY29udGVudHMgYXQgaGFuZC4KKy8vIEFkZHMgYSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisjZGVmaW5lIFBGQVRBTChzKSAgZG8geyBwZXJyb3Iocyk7IGdmbGFnc19leGl0ZnVuYygxKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIHN0cmluZyBSZWFkRmlsZUludG9TdHJpbmcoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgY29uc3QgaW50IGtCdWZTaXplID0gODA5MjsKKyAgY2hhciBidWZmZXJba0J1ZlNpemVdOworICBzdHJpbmcgczsKKyAgRklMRSogZnA7CisgIGlmICgoZXJybm8gPSBTYWZlRk9wZW4oJmZwLCBmaWxlbmFtZSwgInIiKSkgIT0gMCkgUEZBVEFMKGZpbGVuYW1lKTsKKyAgc2l6ZV90IG47CisgIHdoaWxlICggKG49ZnJlYWQoYnVmZmVyLCAxLCBrQnVmU2l6ZSwgZnApKSA+IDAgKSB7CisgICAgaWYgKGZlcnJvcihmcCkpICBQRkFUQUwoZmlsZW5hbWUpOworICAgIHMuYXBwZW5kKGJ1ZmZlciwgbik7CisgIH0KKyAgZmNsb3NlKGZwKTsKKyAgcmV0dXJuIHM7Cit9CisKK3VpbnQzMiBDb21tYW5kTGluZUZsYWdQYXJzZXI6OlBhcnNlTmV3Q29tbWFuZExpbmVGbGFncyhpbnQqIGFyZ2MsIGNoYXIqKiogYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlbW92ZV9mbGFncykgeworICBjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSBzdHJyY2hyKCgqYXJndilbMF0sIFBBVEhfU0VQQVJBVE9SKTsgICAvLyBuaXggcGF0aAorICBwcm9ncmFtX25hbWUgPSAocHJvZ3JhbV9uYW1lID09IE5VTEwgPyAoKmFyZ3YpWzBdIDogcHJvZ3JhbV9uYW1lKzEpOworCisgIGludCBmaXJzdF9ub25vcHQgPSAqYXJnYzsgICAgICAgIC8vIGZvciBub24tb3B0aW9ucyBtb3ZlZCB0byB0aGUgZW5kCisKKyAgcmVnaXN0cnlfLT5Mb2NrKCk7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgZmlyc3Rfbm9ub3B0OyBpKyspIHsKKyAgICBjaGFyKiBhcmcgPSAoKmFyZ3YpW2ldOworCisgICAgLy8gTGlrZSBnZXRvcHQoKSwgd2UgcGVybXV0ZSBub24tb3B0aW9uIGZsYWdzIHRvIGJlIGF0IHRoZSBlbmQuCisgICAgaWYgKGFyZ1swXSAhPSAnLScgfHwgICAgICAgICAgIC8vIG11c3QgYmUgYSBwcm9ncmFtIGFyZ3VtZW50CisgICAgICAgIChhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSA9PSAnXDAnKSkgeyAgLy8gIi0iIGlzIGFuIGFyZ3VtZW50LCBub3QgYSBmbGFnCisgICAgICBtZW1tb3ZlKCgqYXJndikgKyBpLCAoKmFyZ3YpICsgaSsxLCAoKmFyZ2MgLSAoaSsxKSkgKiBzaXplb2YoKCphcmd2KVtpXSkpOworICAgICAgKCphcmd2KVsqYXJnYy0xXSA9IGFyZzsgICAgICAvLyB3ZSBnbyBsYXN0CisgICAgICBmaXJzdF9ub25vcHQtLTsgICAgICAgICAgICAgIC8vIHdlJ3ZlIGJlZW4gcHVzaGVkIG9udG8gdGhlIHN0YWNrCisgICAgICBpLS07ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHVuZG8gdGhlIGkrKyBpbiB0aGUgbG9vcAorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKGFyZ1swXSA9PSAnLScpIGFyZysrOyAgICAgIC8vIGFsbG93IGxlYWRpbmcgJy0nCisgICAgaWYgKGFyZ1swXSA9PSAnLScpIGFyZysrOyAgICAgIC8vIG9yIGxlYWRpbmcgJy0tJworCisgICAgLy8gLS0gYWxvbmUgbWVhbnMgd2hhdCBpdCBkb2VzIGZvciBHTlU6IHN0b3Agb3B0aW9ucyBwYXJzaW5nCisgICAgaWYgKCphcmcgPT0gJ1wwJykgeworICAgICAgZmlyc3Rfbm9ub3B0ID0gaSsxOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gRmluZCB0aGUgZmxhZyBvYmplY3QgZm9yIHRoaXMgb3B0aW9uCisgICAgc3RyaW5nIGtleTsKKyAgICBjb25zdCBjaGFyKiB2YWx1ZTsKKyAgICBzdHJpbmcgZXJyb3JfbWVzc2FnZTsKKyAgICBDb21tYW5kTGluZUZsYWcqIGZsYWcgPSByZWdpc3RyeV8tPlNwbGl0QXJndW1lbnRMb2NrZWQoYXJnLCAma2V5LCAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9tZXNzYWdlKTsKKyAgICBpZiAoZmxhZyA9PSBOVUxMKSB7CisgICAgICB1bmRlZmluZWRfbmFtZXNfW2tleV0gPSAiIjsgICAgLy8gdmFsdWUgaXNuJ3QgYWN0dWFsbHkgdXNlZAorICAgICAgZXJyb3JfZmxhZ3NfW2tleV0gPSBlcnJvcl9tZXNzYWdlOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgIC8vIEJvb2xlYW4gb3B0aW9ucyBhcmUgYWx3YXlzIGFzc2lnbmVkIGEgdmFsdWUgYnkgU3BsaXRBcmd1bWVudExvY2tlZCgpCisgICAgICBhc3NlcnQoc3RyY21wKGZsYWctPnR5cGVfbmFtZSgpLCAiYm9vbCIpICE9IDApOworICAgICAgaWYgKGkrMSA+PSBmaXJzdF9ub25vcHQpIHsKKyAgICAgICAgLy8gVGhpcyBmbGFnIG5lZWRzIGEgdmFsdWUsIGJ1dCB0aGVyZSBpcyBub3RoaW5nIGF2YWlsYWJsZQorICAgICAgICBlcnJvcl9mbGFnc19ba2V5XSA9IChzdHJpbmcoa0Vycm9yKSArICJmbGFnICciICsgKCphcmd2KVtpXSArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbWlzc2luZyBpdHMgYXJndW1lbnQiKTsKKyAgICAgICAgaWYgKGZsYWctPmhlbHAoKSAmJiBmbGFnLT5oZWxwKClbMF0gPiAnXDAwMScpIHsKKyAgICAgICAgICAvLyBCZSB1c2VmdWwgaW4gY2FzZSB3ZSBoYXZlIGEgbm9uLXN0cmlwcGVkIGRlc2NyaXB0aW9uLgorICAgICAgICAgIGVycm9yX2ZsYWdzX1trZXldICs9IHN0cmluZygiOyBmbGFnIGRlc2NyaXB0aW9uOiAiKSArIGZsYWctPmhlbHAoKTsKKyAgICAgICAgfQorICAgICAgICBlcnJvcl9mbGFnc19ba2V5XSArPSAiXG4iOworICAgICAgICBicmVhazsgICAgLy8gd2UgdHJlYXQgdGhpcyBhcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yCisgICAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZSA9ICgqYXJndilbKytpXTsgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBuZXh0IGFyZyBmb3IgdmFsdWUKKworICAgICAgICAvLyBIZXVyaXN0aWMgdG8gZGV0ZWN0IHRoZSBjYXNlIHdoZXJlIHNvbWVvbmUgdHJlYXRzIGEgc3RyaW5nIGFyZworICAgICAgICAvLyBsaWtlIGEgYm9vbDoKKyAgICAgICAgLy8gLS1teV9zdHJpbmdfdmFyIC0tZm9vPWJhcgorICAgICAgICAvLyBXZSBsb29rIGZvciBhIGZsYWcgb2Ygc3RyaW5nIHR5cGUsIHdob3NlIHZhbHVlIGJlZ2lucyB3aXRoIGEKKyAgICAgICAgLy8gZGFzaCwgYW5kIHdoZXJlIHRoZSBmbGFnLW5hbWUgYW5kIHZhbHVlIGFyZSBzZXBhcmF0ZWQgYnkgYQorICAgICAgICAvLyBzcGFjZSByYXRoZXIgdGhhbiBhbiAnPScuCisgICAgICAgIC8vIFRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcywgd2UgYWxzbyByZXF1aXJlIHRoZSB3b3JkICJ0cnVlIgorICAgICAgICAvLyBvciAiZmFsc2UiIGluIHRoZSBoZWxwIHN0cmluZy4gIFdpdGhvdXQgdGhpcywgYSB2YWxpZCB1c2FnZQorICAgICAgICAvLyAiLWxhdCAtMzAuNSIgd291bGQgdHJpZ2dlciB0aGUgd2FybmluZy4gIFRoZSBjb21tb24gY2FzZXMgd2UKKyAgICAgICAgLy8gd2FudCB0byBzb2x2ZSB0YWxrIGFib3V0IHRydWUgYW5kIGZhbHNlIGFzIHZhbHVlcy4KKyAgICAgICAgaWYgKHZhbHVlWzBdID09ICctJworICAgICAgICAgICAgJiYgc3RyY21wKGZsYWctPnR5cGVfbmFtZSgpLCAic3RyaW5nIikgPT0gMAorICAgICAgICAgICAgJiYgKHN0cnN0cihmbGFnLT5oZWxwKCksICJ0cnVlIikKKyAgICAgICAgICAgICAgICB8fCBzdHJzdHIoZmxhZy0+aGVscCgpLCAiZmFsc2UiKSkpIHsKKyAgICAgICAgICBMT0coV0FSTklORykgPDwgIkRpZCB5b3UgcmVhbGx5IG1lYW4gdG8gc2V0IGZsYWcgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZmxhZy0+bmFtZSgpIDw8ICInIHRvIHRoZSB2YWx1ZSAnIgorICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiJz8iOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyhjc2lsdmVycyk6IG9ubHkgc2V0IGEgZmxhZyBpZiB3ZSBoYWRuJ3Qgc2V0IGl0IGJlZm9yZSBoZXJlCisgICAgUHJvY2Vzc1NpbmdsZU9wdGlvbkxvY2tlZChmbGFnLCB2YWx1ZSwgU0VUX0ZMQUdTX1ZBTFVFKTsKKyAgfQorICByZWdpc3RyeV8tPlVubG9jaygpOworCisgIGlmIChyZW1vdmVfZmxhZ3MpIHsgICAvLyBGaXggdXAgYXJnYyBhbmQgYXJndiBieSByZW1vdmluZyBjb21tYW5kIGxpbmUgZmxhZ3MKKyAgICAoKmFyZ3YpW2ZpcnN0X25vbm9wdC0xXSA9ICgqYXJndilbMF07CisgICAgKCphcmd2KSArPSAoZmlyc3Rfbm9ub3B0LTEpOworICAgICgqYXJnYykgLT0gKGZpcnN0X25vbm9wdC0xKTsKKyAgICBmaXJzdF9ub25vcHQgPSAxOyAgIC8vIGJlY2F1c2Ugd2Ugc3RpbGwgZG9uJ3QgY291bnQgYXJndlswXQorICB9CisKKyAgbG9nZ2luZ19pc19wcm9iYWJseV9zZXRfdXAgPSB0cnVlOyAgIC8vIGJlY2F1c2Ugd2UndmUgcGFyc2VkIC0tbG9nZGlyLCBldGMuCisKKyAgcmV0dXJuIGZpcnN0X25vbm9wdDsKK30KKworc3RyaW5nIENvbW1hbmRMaW5lRmxhZ1BhcnNlcjo6UHJvY2Vzc0ZsYWdmaWxlTG9ja2VkKGNvbnN0IHN0cmluZyYgZmxhZ3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnU2V0dGluZ01vZGUgc2V0X21vZGUpIHsKKyAgaWYgKGZsYWd2YWwuZW1wdHkoKSkKKyAgICByZXR1cm4gIiI7CisKKyAgc3RyaW5nIG1zZzsKKyAgdmVjdG9yPHN0cmluZz4gZmlsZW5hbWVfbGlzdDsKKyAgUGFyc2VGbGFnTGlzdChmbGFndmFsLmNfc3RyKCksICZmaWxlbmFtZV9saXN0KTsgIC8vIHRha2UgYSBsaXN0IG9mIGZpbGVuYW1lcworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbGVuYW1lX2xpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBjaGFyKiBmaWxlID0gZmlsZW5hbWVfbGlzdFtpXS5jX3N0cigpOworICAgIG1zZyArPSBQcm9jZXNzT3B0aW9uc0Zyb21TdHJpbmdMb2NrZWQoUmVhZEZpbGVJbnRvU3RyaW5nKGZpbGUpLCBzZXRfbW9kZSk7CisgIH0KKyAgcmV0dXJuIG1zZzsKK30KKworc3RyaW5nIENvbW1hbmRMaW5lRmxhZ1BhcnNlcjo6UHJvY2Vzc0Zyb21lbnZMb2NrZWQoY29uc3Qgc3RyaW5nJiBmbGFndmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1NldHRpbmdNb2RlIHNldF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlcnJvcnNfYXJlX2ZhdGFsKSB7CisgIGlmIChmbGFndmFsLmVtcHR5KCkpCisgICAgcmV0dXJuICIiOworCisgIHN0cmluZyBtc2c7CisgIHZlY3RvcjxzdHJpbmc+IGZsYWdsaXN0OworICBQYXJzZUZsYWdMaXN0KGZsYWd2YWwuY19zdHIoKSwgJmZsYWdsaXN0KTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsYWdsaXN0LnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgY2hhciogZmxhZ25hbWUgPSBmbGFnbGlzdFtpXS5jX3N0cigpOworICAgIENvbW1hbmRMaW5lRmxhZyogZmxhZyA9IHJlZ2lzdHJ5Xy0+RmluZEZsYWdMb2NrZWQoZmxhZ25hbWUpOworICAgIGlmIChmbGFnID09IE5VTEwpIHsKKyAgICAgIGVycm9yX2ZsYWdzX1tmbGFnbmFtZV0gPQorICAgICAgICAgIFN0cmluZ1ByaW50ZigiJXN1bmtub3duIGNvbW1hbmQgbGluZSBmbGFnICclcycgIgorICAgICAgICAgICAgICAgICAgICAgICAiKHZpYSAtLWZyb21lbnYgb3IgLS10cnlmcm9tZW52KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAga0Vycm9yLCBmbGFnbmFtZSk7CisgICAgICB1bmRlZmluZWRfbmFtZXNfW2ZsYWduYW1lXSA9ICIiOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY29uc3Qgc3RyaW5nIGVudm5hbWUgPSBzdHJpbmcoIkZMQUdTXyIpICsgc3RyaW5nKGZsYWduYW1lKTsKKwlzdHJpbmcgZW52dmFsOworCWlmICghU2FmZUdldEVudihlbnZuYW1lLmNfc3RyKCksIGVudnZhbCkpIHsKKyAgICAgIGlmIChlcnJvcnNfYXJlX2ZhdGFsKSB7CisgICAgICAgIGVycm9yX2ZsYWdzX1tmbGFnbmFtZV0gPSAoc3RyaW5nKGtFcnJvcikgKyBlbnZuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5vdCBmb3VuZCBpbiBlbnZpcm9ubWVudFxuIik7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBBdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgaWYgKGVudnZhbCA9PSAiZnJvbWVudiIgfHwgZW52dmFsID09ICJ0cnlmcm9tZW52IikgeworICAgICAgZXJyb3JfZmxhZ3NfW2ZsYWduYW1lXSA9CisgICAgICAgICAgU3RyaW5nUHJpbnRmKCIlc2luZmluaXRlIHJlY3Vyc2lvbiBvbiBlbnZpcm9ubWVudCBmbGFnICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGtFcnJvciwgZW52dmFsLmNfc3RyKCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgbXNnICs9IFByb2Nlc3NTaW5nbGVPcHRpb25Mb2NrZWQoZmxhZywgZW52dmFsLmNfc3RyKCksIHNldF9tb2RlKTsKKyAgfQorICByZXR1cm4gbXNnOworfQorCitzdHJpbmcgQ29tbWFuZExpbmVGbGFnUGFyc2VyOjpQcm9jZXNzU2luZ2xlT3B0aW9uTG9ja2VkKAorICAgIENvbW1hbmRMaW5lRmxhZyogZmxhZywgY29uc3QgY2hhciogdmFsdWUsIEZsYWdTZXR0aW5nTW9kZSBzZXRfbW9kZSkgeworICBzdHJpbmcgbXNnOworICBpZiAodmFsdWUgJiYgIXJlZ2lzdHJ5Xy0+U2V0RmxhZ0xvY2tlZChmbGFnLCB2YWx1ZSwgc2V0X21vZGUsICZtc2cpKSB7CisgICAgZXJyb3JfZmxhZ3NfW2ZsYWctPm5hbWUoKV0gPSBtc2c7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gVGhlIHJlY3Vyc2l2ZSBmbGFncywgLS1mbGFnZmlsZSBhbmQgLS1mcm9tZW52IGFuZCAtLXRyeWZyb21lbnYsCisgIC8vIG11c3QgYmUgZGVhbHQgd2l0aCBhcyBzb29uIGFzIHRoZXkncmUgc2Vlbi4gIFRoZXkgd2lsbCBlbWl0CisgIC8vIG1lc3NhZ2VzIG9mIHRoZWlyIG93bi4KKyAgaWYgKHN0cmNtcChmbGFnLT5uYW1lKCksICJmbGFnZmlsZSIpID09IDApIHsKKyAgICBtc2cgKz0gUHJvY2Vzc0ZsYWdmaWxlTG9ja2VkKEZMQUdTX2ZsYWdmaWxlLCBzZXRfbW9kZSk7CisKKyAgfSBlbHNlIGlmIChzdHJjbXAoZmxhZy0+bmFtZSgpLCAiZnJvbWVudiIpID09IDApIHsKKyAgICAvLyBsYXN0IGFyZyBpbmRpY2F0ZXMgZW52dmFsLW5vdC1mb3VuZCBpcyBmYXRhbCAodW5saWtlIGluIC0tdHJ5ZnJvbWVudikKKyAgICBtc2cgKz0gUHJvY2Vzc0Zyb21lbnZMb2NrZWQoRkxBR1NfZnJvbWVudiwgc2V0X21vZGUsIHRydWUpOworCisgIH0gZWxzZSBpZiAoc3RyY21wKGZsYWctPm5hbWUoKSwgInRyeWZyb21lbnYiKSA9PSAwKSB7CisgICAgbXNnICs9IFByb2Nlc3NGcm9tZW52TG9ja2VkKEZMQUdTX3RyeWZyb21lbnYsIHNldF9tb2RlLCBmYWxzZSk7CisgIH0KKworICByZXR1cm4gbXNnOworfQorCit2b2lkIENvbW1hbmRMaW5lRmxhZ1BhcnNlcjo6VmFsaWRhdGVBbGxGbGFncygpIHsKKyAgRmxhZ1JlZ2lzdHJ5TG9jayBmcmwocmVnaXN0cnlfKTsKKyAgZm9yIChGbGFnUmVnaXN0cnk6OkZsYWdDb25zdEl0ZXJhdG9yIGkgPSByZWdpc3RyeV8tPmZsYWdzXy5iZWdpbigpOworICAgICAgIGkgIT0gcmVnaXN0cnlfLT5mbGFnc18uZW5kKCk7ICsraSkgeworICAgIGlmICghaS0+c2Vjb25kLT5WYWxpZGF0ZUN1cnJlbnQoKSkgeworICAgICAgLy8gb25seSBzZXQgYSBtZXNzYWdlIGlmIG9uZSBpc24ndCBhbHJlYWR5IHRoZXJlLiAgKElmIHRoZXJlJ3MKKyAgICAgIC8vIGFuIGVycm9yIG1lc3NhZ2UsIG91ciBqb2IgaXMgZG9uZSwgZXZlbiBpZiBpdCdzIG5vdCBleGFjdGx5CisgICAgICAvLyB0aGUgc2FtZSBlcnJvci4pCisgICAgICBpZiAoZXJyb3JfZmxhZ3NfW2ktPnNlY29uZC0+bmFtZSgpXS5lbXB0eSgpKQorICAgICAgICBlcnJvcl9mbGFnc19baS0+c2Vjb25kLT5uYW1lKCldID0KKyAgICAgICAgICAgIHN0cmluZyhrRXJyb3IpICsgIi0tIiArIGktPnNlY29uZC0+bmFtZSgpICsKKyAgICAgICAgICAgICIgbXVzdCBiZSBzZXQgb24gdGhlIGNvbW1hbmRsaW5lIgorICAgICAgICAgICAgIiAoZGVmYXVsdCB2YWx1ZSBmYWlscyB2YWxpZGF0aW9uKVxuIjsKKyAgICB9CisgIH0KK30KKworYm9vbCBDb21tYW5kTGluZUZsYWdQYXJzZXI6OlJlcG9ydEVycm9ycygpIHsKKyAgLy8gZXJyb3JfZmxhZ3NfIGluZGljYXRlcyBlcnJvcnMgd2Ugc2F3IHdoaWxlIHBhcnNpbmcuCisgIC8vIEJ1dCB3ZSBpZ25vcmUgdW5kZWZpbmVkLW5hbWVzIGlmIG9rJ2VkIGJ5IC0tdW5kZWZfb2sKKyAgaWYgKCFGTEFHU191bmRlZm9rLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8c3RyaW5nPiBmbGFnbGlzdDsKKyAgICBQYXJzZUZsYWdMaXN0KEZMQUdTX3VuZGVmb2suY19zdHIoKSwgJmZsYWdsaXN0KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsYWdsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAvLyBXZSBhbHNvIGRlYWwgd2l0aCAtLW5vPGZsYWc+LCBpbiBjYXNlIHRoZSBmbGFnbmFtZSB3YXMgYm9vbGVhbgorICAgICAgY29uc3Qgc3RyaW5nIG5vX3ZlcnNpb24gPSBzdHJpbmcoIm5vIikgKyBmbGFnbGlzdFtpXTsKKyAgICAgIGlmICh1bmRlZmluZWRfbmFtZXNfLmZpbmQoZmxhZ2xpc3RbaV0pICE9IHVuZGVmaW5lZF9uYW1lc18uZW5kKCkpIHsKKyAgICAgICAgZXJyb3JfZmxhZ3NfW2ZsYWdsaXN0W2ldXSA9ICIiOyAgICAvLyBjbGVhciB0aGUgZXJyb3IgbWVzc2FnZQorICAgICAgfSBlbHNlIGlmICh1bmRlZmluZWRfbmFtZXNfLmZpbmQobm9fdmVyc2lvbikgIT0gdW5kZWZpbmVkX25hbWVzXy5lbmQoKSkgeworICAgICAgICBlcnJvcl9mbGFnc19bbm9fdmVyc2lvbl0gPSAiIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gTGlrZXdpc2UsIGlmIHRoZXkgZGVjaWRlZCB0byBhbGxvdyByZXBhcnNpbmcsIGFsbCB1bmRlZmluZWQtbmFtZXMKKyAgLy8gYXJlIG9rOyB3ZSBqdXN0IHNpbGVudGx5IGlnbm9yZSB0aGVtIG5vdywgYW5kIGhvcGUgdGhhdCBhIGZ1dHVyZQorICAvLyBwYXJzZSB3aWxsIHBpY2sgdGhlbSB1cCBzb21laG93LgorICBpZiAoYWxsb3dfY29tbWFuZF9saW5lX3JlcGFyc2luZykgeworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB1bmRlZmluZWRfbmFtZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB1bmRlZmluZWRfbmFtZXNfLmVuZCgpOyAgKytpdCkKKyAgICAgIGVycm9yX2ZsYWdzX1tpdC0+Zmlyc3RdID0gIiI7ICAgICAgLy8gY2xlYXIgdGhlIGVycm9yIG1lc3NhZ2UKKyAgfQorCisgIGJvb2wgZm91bmRfZXJyb3IgPSBmYWxzZTsKKyAgc3RyaW5nIGVycm9yX21lc3NhZ2U7CisgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlcnJvcl9mbGFnc18uYmVnaW4oKTsKKyAgICAgICBpdCAhPSBlcnJvcl9mbGFnc18uZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoIWl0LT5zZWNvbmQuZW1wdHkoKSkgeworICAgICAgZXJyb3JfbWVzc2FnZS5hcHBlbmQoaXQtPnNlY29uZC5kYXRhKCksIGl0LT5zZWNvbmQuc2l6ZSgpKTsKKyAgICAgIGZvdW5kX2Vycm9yID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgaWYgKGZvdW5kX2Vycm9yKQorICAgIFJlcG9ydEVycm9yKERPX05PVF9ESUUsICIlcyIsIGVycm9yX21lc3NhZ2UuY19zdHIoKSk7CisgIHJldHVybiBmb3VuZF9lcnJvcjsKK30KKworc3RyaW5nIENvbW1hbmRMaW5lRmxhZ1BhcnNlcjo6UHJvY2Vzc09wdGlvbnNGcm9tU3RyaW5nTG9ja2VkKAorICAgIGNvbnN0IHN0cmluZyYgY29udGVudGRhdGEsIEZsYWdTZXR0aW5nTW9kZSBzZXRfbW9kZSkgeworICBzdHJpbmcgcmV0dmFsOworICBjb25zdCBjaGFyKiBmbGFnZmlsZV9jb250ZW50cyA9IGNvbnRlbnRkYXRhLmNfc3RyKCk7CisgIGJvb2wgZmxhZ3NfYXJlX3JlbGV2YW50ID0gdHJ1ZTsgICAvLyBzZXQgdG8gZmFsc2Ugd2hlbiBmaWxlbmFtZXMgZG9uJ3QgbWF0Y2gKKyAgYm9vbCBpbl9maWxlbmFtZV9zZWN0aW9uID0gZmFsc2U7CisKKyAgY29uc3QgY2hhciogbGluZV9lbmQgPSBmbGFnZmlsZV9jb250ZW50czsKKyAgLy8gV2UgcmVhZCB0aGlzIGZpbGUgYSBsaW5lIGF0IGEgdGltZS4KKyAgZm9yICg7IGxpbmVfZW5kOyBmbGFnZmlsZV9jb250ZW50cyA9IGxpbmVfZW5kICsgMSkgeworICAgIHdoaWxlICgqZmxhZ2ZpbGVfY29udGVudHMgJiYgaXNzcGFjZSgqZmxhZ2ZpbGVfY29udGVudHMpKQorICAgICAgKytmbGFnZmlsZV9jb250ZW50czsKKyAgICBsaW5lX2VuZCA9IHN0cmNocihmbGFnZmlsZV9jb250ZW50cywgJ1xuJyk7CisgICAgc2l6ZV90IGxlbiA9IGxpbmVfZW5kID8gbGluZV9lbmQgLSBmbGFnZmlsZV9jb250ZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0cmxlbihmbGFnZmlsZV9jb250ZW50cyk7CisgICAgc3RyaW5nIGxpbmUoZmxhZ2ZpbGVfY29udGVudHMsIGxlbik7CisKKyAgICAvLyBFYWNoIGxpbmUgY2FuIGJlIG9uZSBvZiBmb3VyIHRoaW5nczoKKyAgICAvLyAxKSBBIGNvbW1lbnQgbGluZSAtLSB3ZSBza2lwIGl0CisgICAgLy8gMikgQW4gZW1wdHkgbGluZSAtLSB3ZSBza2lwIGl0CisgICAgLy8gMykgQSBsaXN0IG9mIGZpbGVuYW1lcyAtLSBzdGFydHMgYSBuZXcgZmlsZW5hbWVzK2ZsYWdzIHNlY3Rpb24KKyAgICAvLyA0KSBBIC0tZmxhZz12YWx1ZSBsaW5lIC0tIGFwcGx5IGlmIHByZXZpb3VzIGZpbGVuYW1lcyBtYXRjaAorICAgIGlmIChsaW5lLmVtcHR5KCkgfHwgbGluZVswXSA9PSAnIycpIHsKKyAgICAgIC8vIGNvbW1lbnQgb3IgZW1wdHkgbGluZTsganVzdCBpZ25vcmUKKworICAgIH0gZWxzZSBpZiAobGluZVswXSA9PSAnLScpIHsgICAgLy8gZmxhZworICAgICAgaW5fZmlsZW5hbWVfc2VjdGlvbiA9IGZhbHNlOyAgLy8gaW5zdGVhZCwgaXQgd2FzIGEgZmxhZy1saW5lCisgICAgICBpZiAoIWZsYWdzX2FyZV9yZWxldmFudCkgICAgICAvLyBza2lwIHRoaXMgZmxhZzsgYXBwbGllcyB0byBzb21lb25lIGVsc2UKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGNvbnN0IGNoYXIqIG5hbWVfYW5kX3ZhbCA9IGxpbmUuY19zdHIoKSArIDE7ICAgIC8vIHNraXAgdGhlIGxlYWRpbmcgLQorICAgICAgaWYgKCpuYW1lX2FuZF92YWwgPT0gJy0nKQorICAgICAgICBuYW1lX2FuZF92YWwrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBzZWNvbmQgLSB0b28KKyAgICAgIHN0cmluZyBrZXk7CisgICAgICBjb25zdCBjaGFyKiB2YWx1ZTsKKyAgICAgIHN0cmluZyBlcnJvcl9tZXNzYWdlOworICAgICAgQ29tbWFuZExpbmVGbGFnKiBmbGFnID0gcmVnaXN0cnlfLT5TcGxpdEFyZ3VtZW50TG9ja2VkKG5hbWVfYW5kX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LCAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yX21lc3NhZ2UpOworICAgICAgLy8gQnkgQVBJLCBlcnJvcnMgcGFyc2luZyBmbGFnZmlsZSBsaW5lcyBhcmUgc2lsZW50bHkgaWdub3JlZC4KKyAgICAgIGlmIChmbGFnID09IE5VTEwpIHsKKyAgICAgICAgLy8gIldBUk5JTkc6IGZsYWduYW1lICciICsga2V5ICsgIicgbm90IGZvdW5kXG4iCisgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgLy8gIldBUk5JTkc6IGZsYWduYW1lICciICsga2V5ICsgIicgbWlzc2luZyBhIHZhbHVlXG4iCisgICAgICB9IGVsc2UgeworICAgICAgICByZXR2YWwgKz0gUHJvY2Vzc1NpbmdsZU9wdGlvbkxvY2tlZChmbGFnLCB2YWx1ZSwgc2V0X21vZGUpOworICAgICAgfQorCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZpbGVuYW1lIQorICAgICAgaWYgKCFpbl9maWxlbmFtZV9zZWN0aW9uKSB7ICAgLy8gc3RhcnQgb3ZlcjogYXNzdW1lIGZpbGVuYW1lcyBkb24ndCBtYXRjaAorICAgICAgICBpbl9maWxlbmFtZV9zZWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgZmxhZ3NfYXJlX3JlbGV2YW50ID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vIFNwbGl0IHRoZSBsaW5lIHVwIGF0IHNwYWNlcyBpbnRvIGdsb2ItcGF0dGVybnMKKyAgICAgIGNvbnN0IGNoYXIqIHNwYWNlID0gbGluZS5jX3N0cigpOyAgIC8vIGp1c3QgaGFzIHRvIGJlIG5vbi1OVUxMCisgICAgICBmb3IgKGNvbnN0IGNoYXIqIHdvcmQgPSBsaW5lLmNfc3RyKCk7ICpzcGFjZTsgd29yZCA9IHNwYWNlKzEpIHsKKyAgICAgICAgaWYgKGZsYWdzX2FyZV9yZWxldmFudCkgICAgIC8vIHdlIGNhbiBzdG9wIGFzIHNvb24gYXMgd2UgbWF0Y2gKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3BhY2UgPSBzdHJjaHIod29yZCwgJyAnKTsKKyAgICAgICAgaWYgKHNwYWNlID09IE5VTEwpCisgICAgICAgICAgc3BhY2UgPSB3b3JkICsgc3RybGVuKHdvcmQpOworICAgICAgICBjb25zdCBzdHJpbmcgZ2xvYih3b3JkLCBzcGFjZSAtIHdvcmQpOworICAgICAgICAvLyBXZSB0cnkgbWF0Y2hpbmcgYm90aCBhZ2FpbnN0IHRoZSBmdWxsIGFyZ3YwIGFuZCBiYXNlbmFtZShhcmd2MCkKKyAgICAgICAgaWYgKGdsb2IgPT0gUHJvZ3JhbUludm9jYXRpb25OYW1lKCkgICAgICAgLy8gc21hbGwgb3B0aW1pemF0aW9uCisgICAgICAgICAgICB8fCBnbG9iID09IFByb2dyYW1JbnZvY2F0aW9uU2hvcnROYW1lKCkKKyNpZiBkZWZpbmVkKEhBVkVfRk5NQVRDSF9IKQorICAgICAgICAgICAgfHwgZm5tYXRjaChnbG9iLmNfc3RyKCksIFByb2dyYW1JbnZvY2F0aW9uTmFtZSgpLCAgICAgIEZOTV9QQVRITkFNRSkgPT0gMAorICAgICAgICAgICAgfHwgZm5tYXRjaChnbG9iLmNfc3RyKCksIFByb2dyYW1JbnZvY2F0aW9uU2hvcnROYW1lKCksIEZOTV9QQVRITkFNRSkgPT0gMAorI2VsaWYgZGVmaW5lZChIQVZFX1NITFdBUElfSCkKKyAgICAgICAgICAgIHx8IFBhdGhNYXRjaFNwZWMoZ2xvYi5jX3N0cigpLCBQcm9ncmFtSW52b2NhdGlvbk5hbWUoKSkKKyAgICAgICAgICAgIHx8IFBhdGhNYXRjaFNwZWMoZ2xvYi5jX3N0cigpLCBQcm9ncmFtSW52b2NhdGlvblNob3J0TmFtZSgpKQorI2VuZGlmCisgICAgICAgICAgICApIHsKKyAgICAgICAgICBmbGFnc19hcmVfcmVsZXZhbnQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZXRGcm9tRW52KCkKKy8vIEFkZEZsYWdWYWxpZGF0b3IoKQorLy8gICAgVGhlc2UgYXJlIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJvdXRpbmVzIGxpa2UgQm9vbEZyb21FbnYoKSBhbmQKKy8vICAgIFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvciwgZGVmaW5lZCBiZWxvdy4gIFRoZXkncmUgZGVmaW5lZCBoZXJlIHNvCisvLyAgICB0aGV5IGNhbiBsaXZlIGluIHRoZSB1bm5hbWVkIG5hbWVzcGFjZSAod2hpY2ggbWFrZXMgZnJpZW5kc2hpcAorLy8gICAgZGVjbGFyYXRpb25zIGZvciB0aGVzZSBjbGFzc2VzIHBvc3NpYmxlKS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIEdldEZyb21FbnYoY29uc3QgY2hhciAqdmFybmFtZSwgY29uc3QgY2hhciogdHlwZSwgVCBkZmx0KSB7CisgIHN0ZDo6c3RyaW5nIHZhbHN0cjsKKyAgaWYgKFNhZmVHZXRFbnYodmFybmFtZSwgdmFsc3RyKSkgeworICAgIEZsYWdWYWx1ZSBpZnYobmV3IFQsIHR5cGUsIHRydWUpOworICAgIGlmICghaWZ2LlBhcnNlRnJvbSh2YWxzdHIuY19zdHIoKSkpIHsKKyAgICAgIFJlcG9ydEVycm9yKERJRSwgIkVSUk9SOiBlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSAnJXMnIHdpdGggdmFsdWUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIHZhcm5hbWUsIHZhbHN0ci5jX3N0cigpKTsKKwl9CisgICAgcmV0dXJuIE9USEVSX1ZBTFVFX0FTKGlmdiwgVCk7CisgIH0gZWxzZSByZXR1cm4gZGZsdDsKK30KKworYm9vbCBBZGRGbGFnVmFsaWRhdG9yKGNvbnN0IHZvaWQqIGZsYWdfcHRyLCBWYWxpZGF0ZUZuUHJvdG8gdmFsaWRhdGVfZm5fcHJvdG8pIHsKKyAgLy8gV2Ugd2FudCBhIGxvY2sgYXJvdW5kIHRoaXMgcm91dGluZSwgaW4gY2FzZSB0d28gdGhyZWFkcyB0cnkgdG8KKyAgLy8gYWRkIGEgdmFsaWRhdG9yIChob3BlZnVsbHkgdGhlIHNhbWUgb25lISkgYXQgb25jZS4gIFdlIGNvdWxkIHVzZQorICAvLyBvdXIgb3duIHRocmVhZCwgYnV0IHdlIG5lZWQgdG8gbG9vb2sgYXQgdGhlIHJlZ2lzdHJ5IGFueXdheSwgc28KKyAgLy8gd2UganVzdCBzdGVhbCB0aGF0IG9uZS4KKyAgRmxhZ1JlZ2lzdHJ5KiBjb25zdCByZWdpc3RyeSA9IEZsYWdSZWdpc3RyeTo6R2xvYmFsUmVnaXN0cnkoKTsKKyAgRmxhZ1JlZ2lzdHJ5TG9jayBmcmwocmVnaXN0cnkpOworICAvLyBGaXJzdCwgZmluZCB0aGUgZmxhZyB3aG9zZSBjdXJyZW50LWZsYWcgc3RvcmFnZSBpcyAnZmxhZycuCisgIC8vIFRoaXMgaXMgdGhlIENvbW1hbmRMaW5lRmxhZyB3aG9zZSBjdXJyZW50Xy0+dmFsdWVfYnVmZmVyXyA9PSBmbGFnCisgIENvbW1hbmRMaW5lRmxhZyogZmxhZyA9IHJlZ2lzdHJ5LT5GaW5kRmxhZ1ZpYVB0ckxvY2tlZChmbGFnX3B0cik7CisgIGlmICghZmxhZykgeworICAgIExPRyhXQVJOSU5HKSA8PCAiSWdub3JpbmcgUmVnaXN0ZXJWYWxpZGF0ZUZ1bmN0aW9uKCkgZm9yIGZsYWcgcG9pbnRlciAiCisgICAgICAgICAgICAgICAgIDw8IGZsYWdfcHRyIDw8ICI6IG5vIGZsYWcgZm91bmQgYXQgdGhhdCBhZGRyZXNzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodmFsaWRhdGVfZm5fcHJvdG8gPT0gZmxhZy0+dmFsaWRhdGVfZnVuY3Rpb24oKSkgeworICAgIHJldHVybiB0cnVlOyAgICAvLyBvayB0byByZWdpc3RlciB0aGUgc2FtZSBmdW5jdGlvbiBvdmVyIGFuZCBvdmVyIGFnYWluCisgIH0gZWxzZSBpZiAodmFsaWRhdGVfZm5fcHJvdG8gIT0gTlVMTCAmJiBmbGFnLT52YWxpZGF0ZV9mdW5jdGlvbigpICE9IE5VTEwpIHsKKyAgICBMT0coV0FSTklORykgPDwgIklnbm9yaW5nIFJlZ2lzdGVyVmFsaWRhdGVGdW5jdGlvbigpIGZvciBmbGFnICciCisgICAgICAgICAgICAgICAgIDw8IGZsYWctPm5hbWUoKSA8PCAiJzogdmFsaWRhdGUtZm4gYWxyZWFkeSByZWdpc3RlcmVkIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgZmxhZy0+dmFsaWRhdGVfZm5fcHJvdG9fID0gdmFsaWRhdGVfZm5fcHJvdG87CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworfSAgLy8gZW5kIHVubmFtZWQgbmFtZXNwYWNlcworCisKKy8vIE5vdyBkZWZpbmUgdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBleHBvcnRlZCB2aWEgdGhlIC5oIGZpbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsYWdSZWdpc3RlcmVyCisvLyAgICBUaGlzIGNsYXNzIGV4aXN0cyBtZXJlbHkgdG8gaGF2ZSBhIGdsb2JhbCBjb25zdHJ1Y3RvciAodGhlCisvLyAgICBraW5kIHRoYXQgcnVucyBiZWZvcmUgbWFpbigpLCB0aGF0IGdvZXMgYW4gaW5pdGlhbGl6ZXMgZWFjaAorLy8gICAgZmxhZyB0aGF0J3MgYmVlbiBkZWNsYXJlZC4gIE5vdGUgdGhhdCBpdCdzIHZlcnkgaW1wb3J0YW50IHdlCisvLyAgICBkb24ndCBoYXZlIGEgZGVzdHJ1Y3RvciB0aGF0IGRlbGV0ZXMgZmxhZ18sIGJlY2F1c2UgdGhhdCB3b3VsZAorLy8gICAgY2F1c2UgdXMgdG8gZGVsZXRlIGN1cnJlbnRfc3RvcmFnZS9kZWZ2YWx1ZV9zdG9yYWdlIGFzIHdlbGwsCisvLyAgICB3aGljaCBjYW4gY2F1c2UgYSBjcmFzaCBpZiBhbnl0aGluZyB0cmllcyB0byBhY2Nlc3MgdGhlIGZsYWcKKy8vICAgIHZhbHVlcyBpbiBhIGdsb2JhbCBkZXN0cnVjdG9yLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmxhZ1JlZ2lzdGVyZXI6OkZsYWdSZWdpc3RlcmVyKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaGVscCwgY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY3VycmVudF9zdG9yYWdlLCB2b2lkKiBkZWZ2YWx1ZV9zdG9yYWdlKSB7CisgIGlmIChoZWxwID09IE5VTEwpCisgICAgaGVscCA9ICIiOworICAvLyBGbGFnVmFsdWUgZXhwZWN0cyB0aGUgdHlwZS1uYW1lIHRvIG5vdCBpbmNsdWRlIGFueSBuYW1lc3BhY2UKKyAgLy8gY29tcG9uZW50cywgc28gd2UgZ2V0IHJpZCBvZiB0aG9zZSwgaWYgYW55LgorICBpZiAoc3RyY2hyKHR5cGUsICc6JykpCisgICAgdHlwZSA9IHN0cnJjaHIodHlwZSwgJzonKSArIDE7CisgIEZsYWdWYWx1ZSogY3VycmVudCA9IG5ldyBGbGFnVmFsdWUoY3VycmVudF9zdG9yYWdlLCB0eXBlLCBmYWxzZSk7CisgIEZsYWdWYWx1ZSogZGVmdmFsdWUgPSBuZXcgRmxhZ1ZhbHVlKGRlZnZhbHVlX3N0b3JhZ2UsIHR5cGUsIGZhbHNlKTsKKyAgLy8gSW1wb3J0YW50bHksIGZsYWdfIHdpbGwgbmV2ZXIgYmUgZGVsZXRlZCwgc28gc3RvcmFnZSBpcyBhbHdheXMgZ29vZC4KKyAgQ29tbWFuZExpbmVGbGFnKiBmbGFnID0gbmV3IENvbW1hbmRMaW5lRmxhZyhuYW1lLCBoZWxwLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LCBkZWZ2YWx1ZSk7CisgIEZsYWdSZWdpc3RyeTo6R2xvYmFsUmVnaXN0cnkoKS0+UmVnaXN0ZXJGbGFnKGZsYWcpOyAgIC8vIGRlZmF1bHQgcmVnaXN0cnkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdldEFsbEZsYWdzKCkKKy8vICAgIFRoZSBtYWluIHdheSB0aGUgRmxhZ1JlZ2lzdHJ5IGNsYXNzIGV4cG9zZXMgaXRzIGRhdGEuICBUaGlzCisvLyAgICByZXR1cm5zLCBhcyBzdHJpbmdzLCBhbGwgdGhlIGluZm8gYWJvdXQgYWxsIHRoZSBmbGFncyBpbgorLy8gICAgdGhlIG1haW4gcmVnaXN0cnksIHNvcnRlZCBmaXJzdCBieSBmaWxlbmFtZSB0aGV5IGFyZSBkZWZpbmVkCisvLyAgICBpbiwgYW5kIHRoZW4gYnkgZmxhZ25hbWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgRmlsZW5hbWVGbGFnbmFtZUNtcCB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBDb21tYW5kTGluZUZsYWdJbmZvJiBhLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyYgYikgY29uc3QgeworICAgIGludCBjbXAgPSBzdHJjbXAoYS5maWxlbmFtZS5jX3N0cigpLCBiLmZpbGVuYW1lLmNfc3RyKCkpOworICAgIGlmIChjbXAgPT0gMCkKKyAgICAgIGNtcCA9IHN0cmNtcChhLm5hbWUuY19zdHIoKSwgYi5uYW1lLmNfc3RyKCkpOyAgLy8gc2Vjb25kYXJ5IHNvcnQga2V5CisgICAgcmV0dXJuIGNtcCA8IDA7CisgIH0KK307CisKK3ZvaWQgR2V0QWxsRmxhZ3ModmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+KiBPVVRQVVQpIHsKKyAgRmxhZ1JlZ2lzdHJ5KiBjb25zdCByZWdpc3RyeSA9IEZsYWdSZWdpc3RyeTo6R2xvYmFsUmVnaXN0cnkoKTsKKyAgcmVnaXN0cnktPkxvY2soKTsKKyAgZm9yIChGbGFnUmVnaXN0cnk6OkZsYWdDb25zdEl0ZXJhdG9yIGkgPSByZWdpc3RyeS0+ZmxhZ3NfLmJlZ2luKCk7CisgICAgICAgaSAhPSByZWdpc3RyeS0+ZmxhZ3NfLmVuZCgpOyArK2kpIHsKKyAgICBDb21tYW5kTGluZUZsYWdJbmZvIGZpOworICAgIGktPnNlY29uZC0+RmlsbENvbW1hbmRMaW5lRmxhZ0luZm8oJmZpKTsKKyAgICBPVVRQVVQtPnB1c2hfYmFjayhmaSk7CisgIH0KKyAgcmVnaXN0cnktPlVubG9jaygpOworICAvLyBOb3cgc29ydCB0aGUgZmxhZ3MsIGZpcnN0IGJ5IGZpbGVuYW1lIHRoZXkgb2NjdXIgaW4sIHRoZW4gYWxwaGFiZXRpY2FsbHkKKyAgc29ydChPVVRQVVQtPmJlZ2luKCksIE9VVFBVVC0+ZW5kKCksIEZpbGVuYW1lRmxhZ25hbWVDbXAoKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXRBcmd2KCkKKy8vIEdldEFyZ3ZzKCkKKy8vIEdldEFyZ3YoKQorLy8gR2V0QXJndjAoKQorLy8gUHJvZ3JhbUludm9jYXRpb25OYW1lKCkKKy8vIFByb2dyYW1JbnZvY2F0aW9uU2hvcnROYW1lKCkKKy8vIFNldFVzYWdlTWVzc2FnZSgpCisvLyBQcm9ncmFtVXNhZ2UoKQorLy8gICAgRnVuY3Rpb25zIHRvIHNldCBhbmQgZ2V0IGFyZ3YuICBUeXBpY2FsbHkgdGhlIHNldHRlciBpcyBjYWxsZWQKKy8vICAgIGJ5IFBhcnNlQ29tbWFuZExpbmVGbGFncy4gIEFsc28gY2FuIGdldCB0aGUgUHJvZ3JhbVVzYWdlIHN0cmluZywKKy8vICAgIHNldCBieSBTZXRVc2FnZU1lc3NhZ2UuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGVzZSB2YWx1ZXMgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBNdXRleCBiZWNhdXNlIHRoZXkgYXJlIG5vcm1hbGx5CisvLyBzZXQgb25seSBvbmNlIGR1cmluZyBwcm9ncmFtIHN0YXJ0dXAuCitzdGF0aWMgY29uc3QgY2hhciogYXJndjAgPSAiVU5LTk9XTiI7ICAgICAgLy8ganVzdCB0aGUgcHJvZ3JhbSBuYW1lCitzdGF0aWMgY29uc3QgY2hhciogY21kbGluZSA9ICIiOyAgICAgICAgICAgLy8gdGhlIGVudGlyZSBjb21tYW5kLWxpbmUKK3N0YXRpYyB2ZWN0b3I8c3RyaW5nPiBhcmd2czsKK3N0YXRpYyB1aW50MzIgYXJndl9zdW0gPSAwOworc3RhdGljIGNvbnN0IGNoYXIqIHByb2dyYW1fdXNhZ2UgPSBOVUxMOworCit2b2lkIFNldEFyZ3YoaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2KSB7CisgIHN0YXRpYyBib29sIGNhbGxlZF9zZXRfYXJndiA9IGZhbHNlOworICBpZiAoY2FsbGVkX3NldF9hcmd2KSAgICAgICAgIC8vIHdlIGFscmVhZHkgaGF2ZSBhbiBhcmd2IGZvciB5b3UKKyAgICByZXR1cm47CisKKyAgY2FsbGVkX3NldF9hcmd2ID0gdHJ1ZTsKKworICBhc3NlcnQoYXJnYyA+IDApOyAgICAgICAgICAgIC8vIGV2ZXJ5IHByb2dyYW0gaGFzIGF0IGxlYXN0IGEgcHJvZ25hbWUKKyAgYXJndjAgPSBzdHJkdXAoYXJndlswXSk7ICAgICAvLyBzbWFsbCBtZW1vcnkgbGVhaywgYnV0IGZuIG9ubHkgY2FsbGVkIG9uY2UKKyAgYXNzZXJ0KGFyZ3YwKTsKKworICBzdHJpbmcgY21kbGluZV9zdHJpbmc7ICAgICAgIC8vIGVhc2llciB0aGFuIGRvaW5nIHN0cmNhdHMKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICBjbWRsaW5lX3N0cmluZyArPSAiICI7CisgICAgfQorICAgIGNtZGxpbmVfc3RyaW5nICs9IGFyZ3ZbaV07CisgICAgYXJndnMucHVzaF9iYWNrKGFyZ3ZbaV0pOworICB9CisgIGNtZGxpbmUgPSBzdHJkdXAoY21kbGluZV9zdHJpbmcuY19zdHIoKSk7ICAvLyBhbm90aGVyIHNtYWxsIG1lbW9yeSBsZWFrCisgIGFzc2VydChjbWRsaW5lKTsKKworICAvLyBDb21wdXRlIGEgc2ltcGxlIHN1bSBvZiBhbGwgdGhlIGNoYXJzIGluIGFyZ3YKKyAgZm9yIChjb25zdCBjaGFyKiBjID0gY21kbGluZTsgKmM7IGMrKykKKyAgICBhcmd2X3N1bSArPSAqYzsKK30KKworY29uc3QgdmVjdG9yPHN0cmluZz4mIEdldEFyZ3ZzKCkgeyByZXR1cm4gYXJndnM7IH0KK2NvbnN0IGNoYXIqIEdldEFyZ3YoKSAgICAgICAgICAgIHsgcmV0dXJuIGNtZGxpbmU7IH0KK2NvbnN0IGNoYXIqIEdldEFyZ3YwKCkgICAgICAgICAgIHsgcmV0dXJuIGFyZ3YwOyB9Cit1aW50MzIgR2V0QXJndlN1bSgpICAgICAgICAgICAgICB7IHJldHVybiBhcmd2X3N1bTsgfQorY29uc3QgY2hhciogUHJvZ3JhbUludm9jYXRpb25OYW1lKCkgeyAgICAgICAgICAgICAvLyBsaWtlIHRoZSBHTlUgbGliYyBmbgorICByZXR1cm4gR2V0QXJndjAoKTsKK30KK2NvbnN0IGNoYXIqIFByb2dyYW1JbnZvY2F0aW9uU2hvcnROYW1lKCkgeyAgICAgICAgLy8gbGlrZSB0aGUgR05VIGxpYmMgZm4KKyAgY29uc3QgY2hhciogc2xhc2ggPSBzdHJyY2hyKGFyZ3YwLCAnLycpOworI2lmZGVmIE9TX1dJTkRPV1MKKyAgaWYgKCFzbGFzaCkgIHNsYXNoID0gc3RycmNocihhcmd2MCwgJ1xcJyk7CisjZW5kaWYKKyAgcmV0dXJuIHNsYXNoID8gc2xhc2ggKyAxIDogYXJndjA7Cit9CisKK3ZvaWQgU2V0VXNhZ2VNZXNzYWdlKGNvbnN0IHN0cmluZyYgdXNhZ2UpIHsKKyAgaWYgKHByb2dyYW1fdXNhZ2UgIT0gTlVMTCkKKyAgICBSZXBvcnRFcnJvcihESUUsICJFUlJPUjogU2V0VXNhZ2VNZXNzYWdlKCkgY2FsbGVkIHR3aWNlXG4iKTsKKyAgcHJvZ3JhbV91c2FnZSA9IHN0cmR1cCh1c2FnZS5jX3N0cigpKTsgICAgICAvLyBzbWFsbCBtZW1vcnkgbGVhaworfQorCitjb25zdCBjaGFyKiBQcm9ncmFtVXNhZ2UoKSB7CisgIGlmIChwcm9ncmFtX3VzYWdlKSB7CisgICAgcmV0dXJuIHByb2dyYW1fdXNhZ2U7CisgIH0KKyAgcmV0dXJuICJXYXJuaW5nOiBTZXRVc2FnZU1lc3NhZ2UoKSBuZXZlciBjYWxsZWQiOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2V0VmVyc2lvblN0cmluZygpCisvLyBWZXJzaW9uU3RyaW5nKCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uX3N0cmluZyA9IE5VTEw7CisKK3ZvaWQgU2V0VmVyc2lvblN0cmluZyhjb25zdCBzdHJpbmcmIHZlcnNpb24pIHsKKyAgaWYgKHZlcnNpb25fc3RyaW5nICE9IE5VTEwpCisgICAgUmVwb3J0RXJyb3IoRElFLCAiRVJST1I6IFNldFZlcnNpb25TdHJpbmcoKSBjYWxsZWQgdHdpY2VcbiIpOworICB2ZXJzaW9uX3N0cmluZyA9IHN0cmR1cCh2ZXJzaW9uLmNfc3RyKCkpOyAgIC8vIHNtYWxsIG1lbW9yeSBsZWFrCit9CisKK2NvbnN0IGNoYXIqIFZlcnNpb25TdHJpbmcoKSB7CisgIHJldHVybiB2ZXJzaW9uX3N0cmluZyA/IHZlcnNpb25fc3RyaW5nIDogIiI7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdldENvbW1hbmRMaW5lT3B0aW9uKCkKKy8vIEdldENvbW1hbmRMaW5lRmxhZ0luZm8oKQorLy8gR2V0Q29tbWFuZExpbmVGbGFnSW5mb09yRGllKCkKKy8vIFNldENvbW1hbmRMaW5lT3B0aW9uKCkKKy8vIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoKQorLy8gICAgVGhlIHByb2dyYW1tYXRpYyB3YXkgdG8gc2V0IGEgZmxhZydzIHZhbHVlLCB1c2luZyBhIHN0cmluZworLy8gICAgZm9yIGl0cyBuYW1lIHJhdGhlciB0aGFuIHRoZSB2YXJpYWJsZSBpdHNlbGYgKHRoYXQgaXMsCisvLyAgICBTZXRDb21tYW5kTGluZU9wdGlvbigiZm9vIiwgeCkgcmF0aGVyIHRoYW4gRkxBR1NfZm9vID0geCkuCisvLyAgICBUaGVyZSdzIGFsc28gYSBiaXQgbW9yZSBmbGV4aWJpbGl0eSBoZXJlIGR1ZSB0byB0aGUgdmFyaW91cworLy8gICAgc2V0LW1vZGVzLCBidXQgdHlwaWNhbGx5IHRoZXNlIGFyZSB1c2VkIHdoZW4geW91IG9ubHkgaGF2ZQorLy8gICAgdGhhdCBmbGFnJ3MgbmFtZSBhcyBhIHN0cmluZywgcGVyaGFwcyBhdCBydW50aW1lLgorLy8gICAgQWxsIG9mIHRoZXNlIHdvcmsgb24gdGhlIGRlZmF1bHQsIGdsb2JhbCByZWdpc3RyeS4KKy8vICAgICAgIEZvciBHZXRDb21tYW5kTGluZU9wdGlvbiwgcmV0dXJuIGZhbHNlIGlmIG5vIHN1Y2ggZmxhZworLy8gICAgaXMga25vd24sIHRydWUgb3RoZXJ3aXNlLiAgV2UgY2xlYXIgInZhbHVlIiBpZiBhIHN1aXRhYmxlCisvLyAgICBmbGFnIGlzIGZvdW5kLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitib29sIEdldENvbW1hbmRMaW5lT3B0aW9uKGNvbnN0IGNoYXIqIG5hbWUsIHN0cmluZyogdmFsdWUpIHsKKyAgaWYgKE5VTEwgPT0gbmFtZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGFzc2VydCh2YWx1ZSk7CisKKyAgRmxhZ1JlZ2lzdHJ5KiBjb25zdCByZWdpc3RyeSA9IEZsYWdSZWdpc3RyeTo6R2xvYmFsUmVnaXN0cnkoKTsKKyAgRmxhZ1JlZ2lzdHJ5TG9jayBmcmwocmVnaXN0cnkpOworICBDb21tYW5kTGluZUZsYWcqIGZsYWcgPSByZWdpc3RyeS0+RmluZEZsYWdMb2NrZWQobmFtZSk7CisgIGlmIChmbGFnID09IE5VTEwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgKnZhbHVlID0gZmxhZy0+Y3VycmVudF92YWx1ZSgpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgR2V0Q29tbWFuZExpbmVGbGFnSW5mbyhjb25zdCBjaGFyKiBuYW1lLCBDb21tYW5kTGluZUZsYWdJbmZvKiBPVVRQVVQpIHsKKyAgaWYgKE5VTEwgPT0gbmFtZSkgcmV0dXJuIGZhbHNlOworICBGbGFnUmVnaXN0cnkqIGNvbnN0IHJlZ2lzdHJ5ID0gRmxhZ1JlZ2lzdHJ5OjpHbG9iYWxSZWdpc3RyeSgpOworICBGbGFnUmVnaXN0cnlMb2NrIGZybChyZWdpc3RyeSk7CisgIENvbW1hbmRMaW5lRmxhZyogZmxhZyA9IHJlZ2lzdHJ5LT5GaW5kRmxhZ0xvY2tlZChuYW1lKTsKKyAgaWYgKGZsYWcgPT0gTlVMTCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoT1VUUFVUKTsKKyAgICBmbGFnLT5GaWxsQ29tbWFuZExpbmVGbGFnSW5mbyhPVVRQVVQpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK0NvbW1hbmRMaW5lRmxhZ0luZm8gR2V0Q29tbWFuZExpbmVGbGFnSW5mb09yRGllKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgQ29tbWFuZExpbmVGbGFnSW5mbyBpbmZvOworICBpZiAoIUdldENvbW1hbmRMaW5lRmxhZ0luZm8obmFtZSwgJmluZm8pKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJGQVRBTCBFUlJPUjogZmxhZyBuYW1lICclcycgZG9lc24ndCBleGlzdFxuIiwgbmFtZSk7CisgICAgZ2ZsYWdzX2V4aXRmdW5jKDEpOyAgICAvLyBhbG1vc3QgY2VydGFpbmx5IGdmbGFnc19leGl0ZnVuYygpCisgIH0KKyAgcmV0dXJuIGluZm87Cit9CisKK3N0cmluZyBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1NldHRpbmdNb2RlIHNldF9tb2RlKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIEZsYWdSZWdpc3RyeSogY29uc3QgcmVnaXN0cnkgPSBGbGFnUmVnaXN0cnk6Okdsb2JhbFJlZ2lzdHJ5KCk7CisgIEZsYWdSZWdpc3RyeUxvY2sgZnJsKHJlZ2lzdHJ5KTsKKyAgQ29tbWFuZExpbmVGbGFnKiBmbGFnID0gcmVnaXN0cnktPkZpbmRGbGFnTG9ja2VkKG5hbWUpOworICBpZiAoZmxhZykgeworICAgIENvbW1hbmRMaW5lRmxhZ1BhcnNlciBwYXJzZXIocmVnaXN0cnkpOworICAgIHJlc3VsdCA9IHBhcnNlci5Qcm9jZXNzU2luZ2xlT3B0aW9uTG9ja2VkKGZsYWcsIHZhbHVlLCBzZXRfbW9kZSk7CisgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgeyAgIC8vIGluIHRoZSBlcnJvciBjYXNlLCB3ZSd2ZSBhbHJlYWR5IGxvZ2dlZAorICAgICAgLy8gQ291bGQgY29uc2lkZXIgbG9nZ2luZyB0aGlzIGNoYW5nZQorICAgIH0KKyAgfQorICAvLyBUaGUgQVBJIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCB3ZSByZXR1cm4gZW1wdHkgc3RyaW5nIG9uIGVycm9yCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyBTZXRDb21tYW5kTGluZU9wdGlvbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICByZXR1cm4gU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZShuYW1lLCB2YWx1ZSwgU0VUX0ZMQUdTX1ZBTFVFKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsYWdTYXZlcgorLy8gRmxhZ1NhdmVySW1wbAorLy8gICAgVGhpcyBjbGFzcyBzdG9yZXMgdGhlIHN0YXRlcyBvZiBhbGwgZmxhZ3MgYXQgY29uc3RydWN0IHRpbWUsCisvLyAgICBhbmQgcmVzdG9yZXMgYWxsIGZsYWdzIHRvIHRoYXQgc3RhdGUgYXQgZGVzdHJ1Y3QgdGltZS4KKy8vICAgIEl0cyBtYWpvciBpbXBsZW1lbnRhdGlvbiBjaGFsbGVuZ2UgaXMgdGhhdCBpdCBuZXZlciBtb2RpZmllcworLy8gICAgcG9pbnRlcnMgaW4gdGhlICdtYWluJyByZWdpc3RyeSwgc28gZ2xvYmFsIEZMQUdfKiB2YXJzIGFsd2F5cworLy8gICAgcG9pbnQgdG8gdGhlIHJpZ2h0IHBsYWNlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgRmxhZ1NhdmVySW1wbCB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IEZsYWdTYXZlckltcGwgb2JqZWN0LgorICBleHBsaWNpdCBGbGFnU2F2ZXJJbXBsKEZsYWdSZWdpc3RyeSogbWFpbl9yZWdpc3RyeSkKKyAgICAgIDogbWFpbl9yZWdpc3RyeV8obWFpbl9yZWdpc3RyeSkgeyB9CisgIH5GbGFnU2F2ZXJJbXBsKCkgeworICAgIC8vIHJlY2xhaW0gbWVtb3J5IGZyb20gZWFjaCBvZiBvdXIgQ29tbWFuZExpbmVGbGFncworICAgIHZlY3RvcjxDb21tYW5kTGluZUZsYWcqPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IGJhY2t1cF9yZWdpc3RyeV8uYmVnaW4oKTsgaXQgIT0gYmFja3VwX3JlZ2lzdHJ5Xy5lbmQoKTsgKytpdCkKKyAgICAgIGRlbGV0ZSAqaXQ7CisgIH0KKworICAvLyBTYXZlcyB0aGUgZmxhZyBzdGF0ZXMgZnJvbSB0aGUgZmxhZyByZWdpc3RyeSBpbnRvIHRoaXMgb2JqZWN0LgorICAvLyBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtb3JlIHRoYW4gb25jZS4KKyAgLy8gTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVnaXN0cnkgbXV0ZXggaXMgbm90IGhlbGQuCisgIHZvaWQgU2F2ZUZyb21SZWdpc3RyeSgpIHsKKyAgICBGbGFnUmVnaXN0cnlMb2NrIGZybChtYWluX3JlZ2lzdHJ5Xyk7CisgICAgYXNzZXJ0KGJhY2t1cF9yZWdpc3RyeV8uZW1wdHkoKSk7ICAgLy8gY2FsbCBvbmx5IG9uY2UhCisgICAgZm9yIChGbGFnUmVnaXN0cnk6OkZsYWdDb25zdEl0ZXJhdG9yIGl0ID0gbWFpbl9yZWdpc3RyeV8tPmZsYWdzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbWFpbl9yZWdpc3RyeV8tPmZsYWdzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGNvbnN0IENvbW1hbmRMaW5lRmxhZyogbWFpbiA9IGl0LT5zZWNvbmQ7CisgICAgICAvLyBTZXRzIHVwIGFsbCB0aGUgY29uc3QgdmFyaWFibGVzIGluIGJhY2t1cCBjb3JyZWN0bHkKKyAgICAgIENvbW1hbmRMaW5lRmxhZyogYmFja3VwID0gbmV3IENvbW1hbmRMaW5lRmxhZygKKyAgICAgICAgICBtYWluLT5uYW1lKCksIG1haW4tPmhlbHAoKSwgbWFpbi0+ZmlsZW5hbWUoKSwKKyAgICAgICAgICBtYWluLT5jdXJyZW50Xy0+TmV3KCksIG1haW4tPmRlZnZhbHVlXy0+TmV3KCkpOworICAgICAgLy8gU2V0cyB1cCBhbGwgdGhlIG5vbi1jb25zdCB2YXJpYWJsZXMgaW4gYmFja3VwIGNvcnJlY3RseQorICAgICAgYmFja3VwLT5Db3B5RnJvbSgqbWFpbik7CisgICAgICBiYWNrdXBfcmVnaXN0cnlfLnB1c2hfYmFjayhiYWNrdXApOyAgIC8vIGFkZCBpdCB0byBhIGNvbnZlbmllbnQgbGlzdAorICAgIH0KKyAgfQorCisgIC8vIFJlc3RvcmVzIHRoZSBzYXZlZCBmbGFnIHN0YXRlcyBpbnRvIHRoZSBmbGFnIHJlZ2lzdHJ5LiAgV2UKKyAgLy8gYXNzdW1lIG5vIGZsYWdzIHdlcmUgYWRkZWQgb3IgZGVsZXRlZCBmcm9tIHRoZSByZWdpc3RyeSBzaW5jZQorICAvLyB0aGUgU2F2ZUZyb21SZWdpc3RyeTsgaWYgdGhleSB3ZXJlLCB0aGF0J3MgdHJvdWJsZSEgIE11c3QgYmUKKyAgLy8gY2FsbGVkIHdoZW4gdGhlIHJlZ2lzdHJ5IG11dGV4IGlzIG5vdCBoZWxkLgorICB2b2lkIFJlc3RvcmVUb1JlZ2lzdHJ5KCkgeworICAgIEZsYWdSZWdpc3RyeUxvY2sgZnJsKG1haW5fcmVnaXN0cnlfKTsKKyAgICB2ZWN0b3I8Q29tbWFuZExpbmVGbGFnKj46OmNvbnN0X2l0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBiYWNrdXBfcmVnaXN0cnlfLmJlZ2luKCk7IGl0ICE9IGJhY2t1cF9yZWdpc3RyeV8uZW5kKCk7ICsraXQpIHsKKyAgICAgIENvbW1hbmRMaW5lRmxhZyogbWFpbiA9IG1haW5fcmVnaXN0cnlfLT5GaW5kRmxhZ0xvY2tlZCgoKml0KS0+bmFtZSgpKTsKKyAgICAgIGlmIChtYWluICE9IE5VTEwpIHsgICAgICAgLy8gaWYgTlVMTCwgZmxhZyBnb3QgZGVsZXRlZCBmcm9tIHJlZ2lzdHJ5KCEpCisgICAgICAgIG1haW4tPkNvcHlGcm9tKCoqaXQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgRmxhZ1JlZ2lzdHJ5KiBjb25zdCBtYWluX3JlZ2lzdHJ5XzsKKyAgdmVjdG9yPENvbW1hbmRMaW5lRmxhZyo+IGJhY2t1cF9yZWdpc3RyeV87CisKKyAgRmxhZ1NhdmVySW1wbChjb25zdCBGbGFnU2F2ZXJJbXBsJik7ICAvLyBubyBjb3B5aW5nIQorICB2b2lkIG9wZXJhdG9yPShjb25zdCBGbGFnU2F2ZXJJbXBsJik7Cit9OworCitGbGFnU2F2ZXI6OkZsYWdTYXZlcigpCisgICAgOiBpbXBsXyhuZXcgRmxhZ1NhdmVySW1wbChGbGFnUmVnaXN0cnk6Okdsb2JhbFJlZ2lzdHJ5KCkpKSB7CisgIGltcGxfLT5TYXZlRnJvbVJlZ2lzdHJ5KCk7Cit9CisKK0ZsYWdTYXZlcjo6fkZsYWdTYXZlcigpIHsKKyAgaW1wbF8tPlJlc3RvcmVUb1JlZ2lzdHJ5KCk7CisgIGRlbGV0ZSBpbXBsXzsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbWFuZGxpbmVGbGFnc0ludG9TdHJpbmcoKQorLy8gUmVhZEZsYWdzRnJvbVN0cmluZygpCisvLyBBcHBlbmRGbGFnc0ludG9GaWxlKCkKKy8vIFJlYWRGcm9tRmxhZ3NGaWxlKCkKKy8vICAgIFRoZXNlIGFyZSBtb3N0bHktZGVwcmVjYXRlZCByb3V0aW5lcyB0aGF0IHN0aWNrIHRoZQorLy8gICAgY29tbWFuZGxpbmUgZmxhZ3MgaW50byBhIGZpbGUvc3RyaW5nIGFuZCByZWFkIHRoZW0gYmFjaworLy8gICAgb3V0IGFnYWluLiAgSSBjYW4gc2VlIGEgdXNlIGZvciBDb21tYW5kbGluZUZsYWdzSW50b1N0cmluZywKKy8vICAgIGZvciBjcmVhdGluZyBhIGZsYWdmaWxlLCBidXQgdGhlIHJlc3QgZG9uJ3Qgc2VlbSB0aGF0IHVzZWZ1bAorLy8gICAgLS0gc29tZSwgSSB0aGluaywgYXJlIGEgcG9vci1tYW4ncyBhdHRlbXB0IGF0IEZsYWdTYXZlciAtLQorLy8gICAgYW5kIGFyZSBpbmNsdWRlZCBvbmx5IHVudGlsIHdlIGNhbiBkZWxldGUgdGhlbSBmcm9tIGNhbGxlcnMuCisvLyAgICBOb3RlIHRoZXkgZG9uJ3Qgc2F2ZSAtLWZsYWdmaWxlIGZsYWdzICh0aG91Z2ggdGhleSBkbyBzYXZlCisvLyAgICB0aGUgcmVzdWx0IG9mIGhhdmluZyBjYWxsZWQgdGhlIGZsYWdmaWxlLCBvZiBjb3Vyc2UpLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHN0cmluZyBUaGVzZUNvbW1hbmRsaW5lRmxhZ3NJbnRvU3RyaW5nKAorICAgIGNvbnN0IHZlY3RvcjxDb21tYW5kTGluZUZsYWdJbmZvPiYgZmxhZ3MpIHsKKyAgdmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+Ojpjb25zdF9pdGVyYXRvciBpOworCisgIHNpemVfdCByZXR2YWxfc3BhY2UgPSAwOworICBmb3IgKGkgPSBmbGFncy5iZWdpbigpOyBpICE9IGZsYWdzLmVuZCgpOyArK2kpIHsKKyAgICAvLyBBbiAob3Zlcillc3RpbWF0ZSBvZiBob3cgbXVjaCBzcGFjZSBpdCB3aWxsIHRha2UgdG8gcHJpbnQgdGhpcyBmbGFnCisgICAgcmV0dmFsX3NwYWNlICs9IGktPm5hbWUubGVuZ3RoKCkgKyBpLT5jdXJyZW50X3ZhbHVlLmxlbmd0aCgpICsgNTsKKyAgfQorCisgIHN0cmluZyByZXR2YWw7CisgIHJldHZhbC5yZXNlcnZlKHJldHZhbF9zcGFjZSk7CisgIGZvciAoaSA9IGZsYWdzLmJlZ2luKCk7IGkgIT0gZmxhZ3MuZW5kKCk7ICsraSkgeworICAgIHJldHZhbCArPSAiLS0iOworICAgIHJldHZhbCArPSBpLT5uYW1lOworICAgIHJldHZhbCArPSAiPSI7CisgICAgcmV0dmFsICs9IGktPmN1cnJlbnRfdmFsdWU7CisgICAgcmV0dmFsICs9ICJcbiI7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RyaW5nIENvbW1hbmRsaW5lRmxhZ3NJbnRvU3RyaW5nKCkgeworICB2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz4gc29ydGVkX2ZsYWdzOworICBHZXRBbGxGbGFncygmc29ydGVkX2ZsYWdzKTsKKyAgcmV0dXJuIFRoZXNlQ29tbWFuZGxpbmVGbGFnc0ludG9TdHJpbmcoc29ydGVkX2ZsYWdzKTsKK30KKworYm9vbCBSZWFkRmxhZ3NGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZmxhZ2ZpbGVjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKnByb2dfbmFtZSovLCAgLy8gVE9ETyhjc2lsdmVycyk6IG5peCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlcnJvcnNfYXJlX2ZhdGFsKSB7CisgIEZsYWdSZWdpc3RyeSogY29uc3QgcmVnaXN0cnkgPSBGbGFnUmVnaXN0cnk6Okdsb2JhbFJlZ2lzdHJ5KCk7CisgIEZsYWdTYXZlckltcGwgc2F2ZWRfc3RhdGVzKHJlZ2lzdHJ5KTsKKyAgc2F2ZWRfc3RhdGVzLlNhdmVGcm9tUmVnaXN0cnkoKTsKKworICBDb21tYW5kTGluZUZsYWdQYXJzZXIgcGFyc2VyKHJlZ2lzdHJ5KTsKKyAgcmVnaXN0cnktPkxvY2soKTsKKyAgcGFyc2VyLlByb2Nlc3NPcHRpb25zRnJvbVN0cmluZ0xvY2tlZChmbGFnZmlsZWNvbnRlbnRzLCBTRVRfRkxBR1NfVkFMVUUpOworICByZWdpc3RyeS0+VW5sb2NrKCk7CisgIC8vIFNob3VsZCB3ZSBoYW5kbGUgLS1oZWxwIGFuZCBzdWNoIHdoZW4gcmVhZGluZyBmbGFncyBmcm9tIGEgc3RyaW5nPyAgU3VyZS4KKyAgSGFuZGxlQ29tbWFuZExpbmVIZWxwRmxhZ3MoKTsKKyAgaWYgKHBhcnNlci5SZXBvcnRFcnJvcnMoKSkgeworICAgIC8vIEVycm9yLiAgUmVzdG9yZSBhbGwgZ2xvYmFsIGZsYWdzIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcy4KKyAgICBpZiAoZXJyb3JzX2FyZV9mYXRhbCkKKyAgICAgIGdmbGFnc19leGl0ZnVuYygxKTsKKyAgICBzYXZlZF9zdGF0ZXMuUmVzdG9yZVRvUmVnaXN0cnkoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRPRE8oY3NpbHZlcnMpOiBuaXggcHJvZ19uYW1lIGluIGZhdm9yIG9mIFByb2dyYW1JbnZvY2F0aW9uU2hvcnROYW1lKCkKK2Jvb2wgQXBwZW5kRmxhZ3NJbnRvRmlsZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBjaGFyICpwcm9nX25hbWUpIHsKKyAgRklMRSAqZnA7CisgIGlmIChTYWZlRk9wZW4oJmZwLCBmaWxlbmFtZS5jX3N0cigpLCAiYSIpICE9IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAocHJvZ19uYW1lKQorICAgIGZwcmludGYoZnAsICIlc1xuIiwgcHJvZ19uYW1lKTsKKworICB2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz4gZmxhZ3M7CisgIEdldEFsbEZsYWdzKCZmbGFncyk7CisgIC8vIEJ1dCB3ZSBkb24ndCB3YW50IC0tZmxhZ2ZpbGUsIHdoaWNoIGxlYWRzIHRvIHdlaXJkIHJlY3Vyc2lvbiBpc3N1ZXMKKyAgdmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+OjppdGVyYXRvciBpOworICBmb3IgKGkgPSBmbGFncy5iZWdpbigpOyBpICE9IGZsYWdzLmVuZCgpOyArK2kpIHsKKyAgICBpZiAoc3RyY21wKGktPm5hbWUuY19zdHIoKSwgImZsYWdmaWxlIikgPT0gMCkgeworICAgICAgZmxhZ3MuZXJhc2UoaSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZnByaW50ZihmcCwgIiVzIiwgVGhlc2VDb21tYW5kbGluZUZsYWdzSW50b1N0cmluZyhmbGFncykuY19zdHIoKSk7CisKKyAgZmNsb3NlKGZwKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZEZyb21GbGFnc0ZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgY2hhciogcHJvZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGVycm9yc19hcmVfZmF0YWwpIHsKKyAgcmV0dXJuIFJlYWRGbGFnc0Zyb21TdHJpbmcoUmVhZEZpbGVJbnRvU3RyaW5nKGZpbGVuYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nX25hbWUsIGVycm9yc19hcmVfZmF0YWwpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCb29sRnJvbUVudigpCisvLyBJbnQzMkZyb21FbnYoKQorLy8gSW50NjRGcm9tRW52KCkKKy8vIFVpbnQ2NEZyb21FbnYoKQorLy8gRG91YmxlRnJvbUVudigpCisvLyBTdHJpbmdGcm9tRW52KCkKKy8vICAgIFJlYWRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBhbmQgcmV0dXJucyBpdC4KKy8vICAgIFdlIHVzZSBhbiBGbGFnVmFsdWUgdG8gbWFrZSB0aGUgcGFyc2luZyBlYXN5LgorLy8gICAgRXhhbXBsZSB1c2FnZToKKy8vICAgICAgIERFRklORV9ib29sKG15ZmxhZywgQm9vbEZyb21FbnYoIk1ZRkxBR19ERUZBVUxUIiwgZmFsc2UpLCAid2hhdGV2ZXIiKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Jvb2wgQm9vbEZyb21FbnYoY29uc3QgY2hhciAqdiwgYm9vbCBkZmx0KSB7CisgIHJldHVybiBHZXRGcm9tRW52KHYsICJib29sIiwgZGZsdCk7Cit9CitpbnQzMiBJbnQzMkZyb21FbnYoY29uc3QgY2hhciAqdiwgaW50MzIgZGZsdCkgeworICByZXR1cm4gR2V0RnJvbUVudih2LCAiaW50MzIiLCBkZmx0KTsKK30KK2ludDY0IEludDY0RnJvbUVudihjb25zdCBjaGFyICp2LCBpbnQ2NCBkZmx0KSAgICB7CisgIHJldHVybiBHZXRGcm9tRW52KHYsICJpbnQ2NCIsIGRmbHQpOworfQordWludDY0IFVpbnQ2NEZyb21FbnYoY29uc3QgY2hhciAqdiwgdWludDY0IGRmbHQpIHsKKyAgcmV0dXJuIEdldEZyb21FbnYodiwgInVpbnQ2NCIsIGRmbHQpOworfQorZG91YmxlIERvdWJsZUZyb21FbnYoY29uc3QgY2hhciAqdiwgZG91YmxlIGRmbHQpIHsKKyAgcmV0dXJuIEdldEZyb21FbnYodiwgImRvdWJsZSIsIGRmbHQpOworfQorCisjaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0OTk2KSAvLyBpZ25vcmUgZ2V0ZW52IHNlY3VyaXR5IHdhcm5pbmcKKyNlbmRpZgorY29uc3QgY2hhciAqU3RyaW5nRnJvbUVudihjb25zdCBjaGFyICp2YXJuYW1lLCBjb25zdCBjaGFyICpkZmx0KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbCA9IGdldGVudih2YXJuYW1lKTsKKyAgcmV0dXJuIHZhbCA/IHZhbCA6IGRmbHQ7Cit9CisjaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZWdpc3RlckZsYWdWYWxpZGF0b3IoKQorLy8gICAgUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKCkgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgY2xpZW50cyB1c2UgdG8KKy8vICAgICdkZWNvcmF0ZScgYSBmbGFnIHdpdGggYSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiAgT25jZSB0aGlzIGlzCisvLyAgICBkb25lLCBldmVyeSB0aW1lIHRoZSBmbGFnIGlzIHNldCAoaW5jbHVkaW5nIHdoZW4gdGhlIGZsYWcKKy8vICAgIGlzIHBhcnNlZCBmcm9tIGFyZ3YpLCB0aGUgdmFsaWRhdG9yLWZ1bmN0aW9uIGlzIGNhbGxlZC4KKy8vICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsaWRhdG9yIHdhcyBhZGRlZAorLy8gICAgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBpZiBub3Q6IHRoZSBmbGFnIGFscmVhZHkgaGFzIGEgdmFsaWRhdG9yLAorLy8gICAgKG9ubHkgb25lIGFsbG93ZWQgcGVyIGZsYWcpLCB0aGUgMXN0IGFyZyBpc24ndCBhIGZsYWcsIGV0Yy4KKy8vICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZC1zYWZlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBSZWdpc3RlckZsYWdWYWxpZGF0b3IoY29uc3QgYm9vbCogZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCp2YWxpZGF0ZV9mbikoY29uc3QgY2hhciosIGJvb2wpKSB7CisgIHJldHVybiBBZGRGbGFnVmFsaWRhdG9yKGZsYWcsIHJlaW50ZXJwcmV0X2Nhc3Q8VmFsaWRhdGVGblByb3RvPih2YWxpZGF0ZV9mbikpOworfQorYm9vbCBSZWdpc3RlckZsYWdWYWxpZGF0b3IoY29uc3QgaW50MzIqIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqdmFsaWRhdGVfZm4pKGNvbnN0IGNoYXIqLCBpbnQzMikpIHsKKyAgcmV0dXJuIEFkZEZsYWdWYWxpZGF0b3IoZmxhZywgcmVpbnRlcnByZXRfY2FzdDxWYWxpZGF0ZUZuUHJvdG8+KHZhbGlkYXRlX2ZuKSk7Cit9Citib29sIFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcihjb25zdCBpbnQ2NCogZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCp2YWxpZGF0ZV9mbikoY29uc3QgY2hhciosIGludDY0KSkgeworICByZXR1cm4gQWRkRmxhZ1ZhbGlkYXRvcihmbGFnLCByZWludGVycHJldF9jYXN0PFZhbGlkYXRlRm5Qcm90bz4odmFsaWRhdGVfZm4pKTsKK30KK2Jvb2wgUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKGNvbnN0IHVpbnQ2NCogZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCp2YWxpZGF0ZV9mbikoY29uc3QgY2hhciosIHVpbnQ2NCkpIHsKKyAgcmV0dXJuIEFkZEZsYWdWYWxpZGF0b3IoZmxhZywgcmVpbnRlcnByZXRfY2FzdDxWYWxpZGF0ZUZuUHJvdG8+KHZhbGlkYXRlX2ZuKSk7Cit9Citib29sIFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcihjb25zdCBkb3VibGUqIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqdmFsaWRhdGVfZm4pKGNvbnN0IGNoYXIqLCBkb3VibGUpKSB7CisgIHJldHVybiBBZGRGbGFnVmFsaWRhdG9yKGZsYWcsIHJlaW50ZXJwcmV0X2Nhc3Q8VmFsaWRhdGVGblByb3RvPih2YWxpZGF0ZV9mbikpOworfQorYm9vbCBSZWdpc3RlckZsYWdWYWxpZGF0b3IoY29uc3Qgc3RyaW5nKiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAoKnZhbGlkYXRlX2ZuKShjb25zdCBjaGFyKiwgY29uc3Qgc3RyaW5nJikpIHsKKyAgcmV0dXJuIEFkZEZsYWdWYWxpZGF0b3IoZmxhZywgcmVpbnRlcnByZXRfY2FzdDxWYWxpZGF0ZUZuUHJvdG8+KHZhbGlkYXRlX2ZuKSk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcnNlQ29tbWFuZExpbmVGbGFncygpCisvLyBQYXJzZUNvbW1hbmRMaW5lTm9uSGVscEZsYWdzKCkKKy8vIEhhbmRsZUNvbW1hbmRMaW5lSGVscEZsYWdzKCkKKy8vICAgIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gY2FsbGVkIGZyb20gbWFpbigpLCB0byBhY3R1YWxseQorLy8gICAgcGFyc2UgdGhlIGNvbW1hbmRsaW5lLiAgSXQgbW9kaWZpZXMgYXJnYyBhbmQgYXJndiBhcyBkZXNjcmliZWQKKy8vICAgIGF0IHRoZSB0b3Agb2YgZ2ZsYWdzLmguICBZb3UgY2FuIGFsc28gZGl2aWRlIHRoaXMKKy8vICAgIGZ1bmN0aW9uIGludG8gdHdvIHBhcnRzLCBpZiB5b3Ugd2FudCB0byBkbyB3b3JrIGJldHdlZW4KKy8vICAgIHRoZSBwYXJzaW5nIG9mIHRoZSBmbGFncyBhbmQgdGhlIHByaW50aW5nIG9mIGFueSBoZWxwIG91dHB1dC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB1aW50MzIgUGFyc2VDb21tYW5kTGluZUZsYWdzSW50ZXJuYWwoaW50KiBhcmdjLCBjaGFyKioqIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVtb3ZlX2ZsYWdzLCBib29sIGRvX3JlcG9ydCkgeworICBTZXRBcmd2KCphcmdjLCBjb25zdF9jYXN0PGNvbnN0IGNoYXIqKj4oKmFyZ3YpKTsgICAgLy8gc2F2ZSBpdCBmb3IgbGF0ZXIKKworICBGbGFnUmVnaXN0cnkqIGNvbnN0IHJlZ2lzdHJ5ID0gRmxhZ1JlZ2lzdHJ5OjpHbG9iYWxSZWdpc3RyeSgpOworICBDb21tYW5kTGluZUZsYWdQYXJzZXIgcGFyc2VyKHJlZ2lzdHJ5KTsKKworICAvLyBXaGVuIHdlIHBhcnNlIHRoZSBjb21tYW5kbGluZSBmbGFncywgd2UnbGwgaGFuZGxlIC0tZmxhZ2ZpbGUsCisgIC8vIC0tdHJ5ZnJvbWVudiwgZXRjLiBhcyB3ZSBzZWUgdGhlbSAoc2luY2UgZmxhZy1ldmFsdWF0aW9uIG9yZGVyCisgIC8vIG1heSBiZSBpbXBvcnRhbnQpLiAgQnV0IHNvbWV0aW1lcyBhcHBzIHNldCBGTEFHU190cnlmcm9tZW52L2V0Yy4KKyAgLy8gbWFudWFsbHkgYmVmb3JlIGNhbGxpbmcgUGFyc2VDb21tYW5kTGluZUZsYWdzLiAgV2Ugd2FudCB0byBldmFsdWF0ZQorICAvLyB0aG9zZSB0b28sIGFzIGlmIHRoZXkgd2VyZSB0aGUgZmlyc3QgZmxhZ3Mgb24gdGhlIGNvbW1hbmRsaW5lLgorICByZWdpc3RyeS0+TG9jaygpOworICBwYXJzZXIuUHJvY2Vzc0ZsYWdmaWxlTG9ja2VkKEZMQUdTX2ZsYWdmaWxlLCBTRVRfRkxBR1NfVkFMVUUpOworICAvLyBMYXN0IGFyZyBoZXJlIGluZGljYXRlcyB3aGV0aGVyIGZsYWctbm90LWZvdW5kIGlzIGEgZmF0YWwgZXJyb3Igb3Igbm90CisgIHBhcnNlci5Qcm9jZXNzRnJvbWVudkxvY2tlZChGTEFHU19mcm9tZW52LCBTRVRfRkxBR1NfVkFMVUUsIHRydWUpOworICBwYXJzZXIuUHJvY2Vzc0Zyb21lbnZMb2NrZWQoRkxBR1NfdHJ5ZnJvbWVudiwgU0VUX0ZMQUdTX1ZBTFVFLCBmYWxzZSk7CisgIHJlZ2lzdHJ5LT5VbmxvY2soKTsKKworICAvLyBOb3cgZ2V0IHRoZSBmbGFncyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lCisgIGNvbnN0IGludCByID0gcGFyc2VyLlBhcnNlTmV3Q29tbWFuZExpbmVGbGFncyhhcmdjLCBhcmd2LCByZW1vdmVfZmxhZ3MpOworCisgIGlmIChkb19yZXBvcnQpCisgICAgSGFuZGxlQ29tbWFuZExpbmVIZWxwRmxhZ3MoKTsgICAvLyBtYXkgY2F1c2UgdXMgdG8gZXhpdCBvbiAtLWhlbHAsIGV0Yy4KKworICAvLyBTZWUgaWYgYW55IG9mIHRoZSB1bnNldCBmbGFncyBmYWlsIHRoZWlyIHZhbGlkYXRpb24gY2hlY2tzCisgIHBhcnNlci5WYWxpZGF0ZUFsbEZsYWdzKCk7CisKKyAgaWYgKHBhcnNlci5SZXBvcnRFcnJvcnMoKSkgICAgICAgIC8vIG1heSBjYXVzZSB1cyB0byBleGl0IG9uIGlsbGVnYWwgZmxhZ3MKKyAgICBnZmxhZ3NfZXhpdGZ1bmMoMSk7CisgIHJldHVybiByOworfQorCit1aW50MzIgUGFyc2VDb21tYW5kTGluZUZsYWdzKGludCogYXJnYywgY2hhcioqKiBhcmd2LCBib29sIHJlbW92ZV9mbGFncykgeworICByZXR1cm4gUGFyc2VDb21tYW5kTGluZUZsYWdzSW50ZXJuYWwoYXJnYywgYXJndiwgcmVtb3ZlX2ZsYWdzLCB0cnVlKTsKK30KKwordWludDMyIFBhcnNlQ29tbWFuZExpbmVOb25IZWxwRmxhZ3MoaW50KiBhcmdjLCBjaGFyKioqIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlbW92ZV9mbGFncykgeworICByZXR1cm4gUGFyc2VDb21tYW5kTGluZUZsYWdzSW50ZXJuYWwoYXJnYywgYXJndiwgcmVtb3ZlX2ZsYWdzLCBmYWxzZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbGxvd0NvbW1hbmRMaW5lUmVwYXJzaW5nKCkKKy8vIFJlcGFyc2VDb21tYW5kTGluZU5vbkhlbHBGbGFncygpCisvLyAgICBUaGlzIGlzIG1vc3QgdXNlZnVsIGZvciBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIGlkZWEgaXMgaWYKKy8vICAgIGEgZmxhZyBpcyBkZWZpbmVkIGluIGEgc2hhcmVkIGxpYnJhcnkgdGhhdCBpcyBkbG9wZW4nZWQKKy8vICAgIHNvbWV0aW1lIGFmdGVyIG1haW4oKSwgeW91IGNhbiBQYXJzZUNvbW1hbmRMaW5lRmxhZ3MgYmVmb3JlCisvLyAgICB0aGUgZGxvcGVuLCB0aGVuIFJlcGFyc2VDb21tYW5kTGluZU5vbkhlbHBGbGFncygpIGFmdGVyIHRoZQorLy8gICAgZGxvcGVuLCB0byBnZXQgdGhlIG5ldyBmbGFncy4gIEJ1dCB5b3UgaGF2ZSB0byBleHBsaWNpdGx5CisvLyAgICBBbGxvdygpIGl0OyBvdGhlcndpc2UsIHlvdSBnZXQgdGhlIG5vcm1hbCBkZWZhdWx0IGJlaGF2aW9yCisvLyAgICBvZiB1bnJlY29nbml6ZWQgZmxhZ3MgY2FsbGluZyBhIGZhdGFsIGVycm9yLgorLy8gVE9ETyhjc2lsdmVycyk6IHRoaXMgaXNuJ3QgdXNlZC4gIEp1c3QgZGVsZXRlIGl0PworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBBbGxvd0NvbW1hbmRMaW5lUmVwYXJzaW5nKCkgeworICBhbGxvd19jb21tYW5kX2xpbmVfcmVwYXJzaW5nID0gdHJ1ZTsKK30KKwordm9pZCBSZXBhcnNlQ29tbWFuZExpbmVOb25IZWxwRmxhZ3MoKSB7CisgIC8vIFdlIG1ha2UgYSBjb3B5IG9mIGFyZ2MgYW5kIGFyZ3YgdG8gcGFzcyBpbgorICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJndnMgPSBHZXRBcmd2cygpOworICBpbnQgdG1wX2FyZ2MgPSBzdGF0aWNfY2FzdDxpbnQ+KGFyZ3ZzLnNpemUoKSk7CisgIGNoYXIqKiB0bXBfYXJndiA9IG5ldyBjaGFyKiBbdG1wX2FyZ2MgKyAxXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBfYXJnYzsgKytpKQorICAgIHRtcF9hcmd2W2ldID0gc3RyZHVwKGFyZ3ZzW2ldLmNfc3RyKCkpOyAgIC8vIFRPRE8oY3NpbHZlcnMpOiBkb24ndCBkdXAKKworICBQYXJzZUNvbW1hbmRMaW5lTm9uSGVscEZsYWdzKCZ0bXBfYXJnYywgJnRtcF9hcmd2LCBmYWxzZSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBfYXJnYzsgKytpKQorICAgIGZyZWUodG1wX2FyZ3ZbaV0pOworICBkZWxldGVbXSB0bXBfYXJndjsKK30KKwordm9pZCBTaHV0RG93bkNvbW1hbmRMaW5lRmxhZ3MoKSB7CisgIEZsYWdSZWdpc3RyeTo6RGVsZXRlR2xvYmFsUmVnaXN0cnkoKTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBHRkxBR1NfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2dmbGFncy5oLmluIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3MuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzI0ZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3MuaC5pbgpAQCAtMCwwICsxLDU3MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gLS0tCisvLyBSZXZhbXBlZCBhbmQgcmVvcmdhbml6ZWQgYnkgQ3JhaWcgU2lsdmVyc3RlaW4KKy8vCisvLyBUaGlzIGlzIHRoZSBmaWxlIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IGFueSBmaWxlIHdoaWNoIGRlY2xhcmVzCisvLyBvciBkZWZpbmVzIGEgY29tbWFuZCBsaW5lIGZsYWcgb3Igd2FudHMgdG8gcGFyc2UgY29tbWFuZCBsaW5lIGZsYWdzCisvLyBvciBwcmludCBhIHByb2dyYW0gdXNhZ2UgbWVzc2FnZSAod2hpY2ggd2lsbCBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0CisvLyBmbGFncykuICBFeGVjdXRpdmUgc3VtbWFyeSwgaW4gdGhlIGZvcm0gb2YgYW4gZXhhbXBsZSBmb28uY2MgZmlsZToKKy8vCisvLyAgICAjaW5jbHVkZSAiZm9vLmgiICAgICAgICAgLy8gZm9vLmggaGFzIGEgbGluZSAiREVDTEFSRV9pbnQzMihzdGFydCk7IgorLy8gICAgI2luY2x1ZGUgInZhbGlkYXRvcnMuaCIgIC8vIGh5cG90aGV0aWNhbCBmaWxlIGRlZmluaW5nIFZhbGlkYXRlSXNGaWxlKCkKKy8vCisvLyAgICBERUZJTkVfaW50MzIoZW5kLCAxMDAwLCAiVGhlIGxhc3QgcmVjb3JkIHRvIHJlYWQiKTsKKy8vCisvLyAgICBERUZJTkVfc3RyaW5nKGZpbGVuYW1lLCAibXlfZmlsZS50eHQiLCAiVGhlIGZpbGUgdG8gcmVhZCIpOworLy8gICAgLy8gQ3Jhc2ggaWYgdGhlIHNwZWNpZmllZCBmaWxlIGRvZXMgbm90IGV4aXN0LgorLy8gICAgc3RhdGljIGJvb2wgZHVtbXkgPSBSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX2ZpbGVuYW1lLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlZhbGlkYXRlSXNGaWxlKTsKKy8vCisvLyAgICBERUNMQVJFX2Jvb2wodmVyYm9zZSk7IC8vIHNvbWUgb3RoZXIgZmlsZSBoYXMgYSBERUZJTkVfYm9vbCh2ZXJib3NlLCAuLi4pCisvLworLy8gICAgdm9pZCBNeUZ1bmMoKSB7CisvLyAgICAgIGlmIChGTEFHU192ZXJib3NlKSBwcmludGYoIlJlY29yZHMgJWQtJWRcbiIsIEZMQUdTX3N0YXJ0LCBGTEFHU19lbmQpOworLy8gICAgfQorLy8KKy8vICAgIFRoZW4sIGF0IHRoZSBjb21tYW5kLWxpbmU6CisvLyAgICAgICAuL2ZvbyAtLW5vdmVyYm9zZSAtLXN0YXJ0PTUgLS1lbmQ9MTAwCisvLworLy8gRm9yIG1vcmUgZGV0YWlscywgc2VlCisvLyAgICBkb2MvZ2ZsYWdzLmh0bWwKKy8vCisvLyAtLS0gQSBub3RlIGFib3V0IHRocmVhZC1zYWZldHk6CisvLworLy8gV2UgZGVzY3JpYmUgbWFueSBmdW5jdGlvbnMgaW4gdGhpcyByb3V0aW5lIGFzIGJlaW5nIHRocmVhZC1ob3N0aWxlLAorLy8gdGhyZWFkLWNvbXBhdGlibGUsIG9yIHRocmVhZC1zYWZlLiAgSGVyZSBhcmUgdGhlIG1lYW5pbmdzIHdlIHVzZToKKy8vCisvLyB0aHJlYWQtc2FmZTogaXQgaXMgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIHRoaXMgcm91dGluZQorLy8gICAob3IsIHdoZW4gcmVmZXJyaW5nIHRvIGEgY2xhc3MsIG1ldGhvZHMgb2YgdGhpcyBjbGFzcykKKy8vICAgY29uY3VycmVudGx5LgorLy8gdGhyZWFkLWhvc3RpbGU6IGl0IGlzIG5vdCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgdGhpcworLy8gICByb3V0aW5lIChvciBtZXRob2RzIG9mIHRoaXMgY2xhc3MpIGNvbmN1cnJlbnRseS4gIEluIGdmbGFncywKKy8vICAgbW9zdCB0aHJlYWQtaG9zdGlsZSByb3V0aW5lcyBhcmUgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGVhcmx5IGluLAorLy8gICBvciBldmVuIGJlZm9yZSwgbWFpbigpIC0tIHRoYXQgaXMsIGJlZm9yZSB0aHJlYWRzIGFyZSBzcGF3bmVkLgorLy8gdGhyZWFkLWNvbXBhdGlibGU6IGl0IGlzIHNhZmUgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gcmVhZCBmcm9tCisvLyAgIHRoaXMgdmFyaWFibGUgKHdoZW4gYXBwbGllZCB0byB2YXJpYWJsZXMpLCBvciB0byBjYWxsIGNvbnN0CisvLyAgIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyAod2hlbiBhcHBsaWVkIHRvIGNsYXNzZXMpLCBhcyBsb25nIGFzIG5vCisvLyAgIG90aGVyIHRocmVhZCBpcyB3cml0aW5nIHRvIHRoZSB2YXJpYWJsZSBvciBjYWxsaW5nIG5vbi1jb25zdAorLy8gICBtZXRob2RzIG9mIHRoaXMgY2xhc3MuCisKKyNpZm5kZWYgR0ZMQUdTX0dGTEFHU19IXworI2RlZmluZSBHRkxBR1NfR0ZMQUdTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ2ZsYWdzX2RlY2xhcmUuaCIgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorCisKKy8vIFdlIGFsd2F5cyB3YW50IHRvIGV4cG9ydCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB1c2VyIGNvZGUKKyNpZm5kZWYgR0ZMQUdTX0RMTF9ERUZJTkVfRkxBRworIyAgaWZkZWYgX01TQ19WRVIKKyMgICAgZGVmaW5lIEdGTEFHU19ETExfREVGSU5FX0ZMQUcgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICBlbHNlCisjICAgIGRlZmluZSBHRkxBR1NfRExMX0RFRklORV9GTEFHCisjICBlbmRpZgorI2VuZGlmCisKKworbmFtZXNwYWNlIEdGTEFHU19OQU1FU1BBQ0UgeworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUbyBhY3R1YWxseSBkZWZpbmUgYSBmbGFnIGluIGEgZmlsZSwgdXNlIERFRklORV9ib29sLAorLy8gREVGSU5FX3N0cmluZywgZXRjLiBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZS4gIFlvdSBtYXkgYWxzbyBmaW5kCisvLyBpdCB1c2VmdWwgdG8gcmVnaXN0ZXIgYSB2YWxpZGF0b3Igd2l0aCB0aGUgZmxhZy4gIFRoaXMgZW5zdXJlcyB0aGF0CisvLyB3aGVuIHRoZSBmbGFnIGlzIHBhcnNlZCBmcm9tIHRoZSBjb21tYW5kbGluZSwgb3IgaXMgbGF0ZXIgc2V0IHZpYQorLy8gU2V0Q29tbWFuZExpbmVPcHRpb24sIHdlIGNhbGwgdGhlIHZhbGlkYXRpb24gZnVuY3Rpb24uIEl0IGlzIF9ub3RfCisvLyBjYWxsZWQgd2hlbiB5b3UgYXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZmxhZyBkaXJlY3RseSB1c2luZyB0aGUgPSBvcGVyYXRvci4KKy8vCisvLyBUaGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIGZsYWcgdmFsdWUgaXMgdmFsaWQsIGFuZAorLy8gZmFsc2Ugb3RoZXJ3aXNlLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IgdGhlIG5ldyBzZXR0aW5nIG9mIHRoZQorLy8gZmxhZywgdGhlIGZsYWcgd2lsbCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWUuIElmIGl0IHJldHVybnMgZmFsc2UgZm9yIHRoZQorLy8gZGVmYXVsdCB2YWx1ZSwgUGFyc2VDb21tYW5kTGluZUZsYWdzKCkgd2lsbCBkaWUuCisvLworLy8gVGhpcyBmdW5jdGlvbiBpcyBzYWZlIHRvIGNhbGwgYXQgZ2xvYmFsIGNvbnN0cnVjdCB0aW1lIChhcyBpbiB0aGUKKy8vIGV4YW1wbGUgYmVsb3cpLgorLy8KKy8vIEV4YW1wbGUgdXNlOgorLy8gICAgc3RhdGljIGJvb2wgVmFsaWRhdGVQb3J0KGNvbnN0IGNoYXIqIGZsYWduYW1lLCBpbnQzMiB2YWx1ZSkgeworLy8gICAgICAgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8IDMyNzY4KSAgIC8vIHZhbHVlIGlzIG9rCisvLyAgICAgICAgIHJldHVybiB0cnVlOworLy8gICAgICAgcHJpbnRmKCJJbnZhbGlkIHZhbHVlIGZvciAtLSVzOiAlZFxuIiwgZmxhZ25hbWUsIChpbnQpdmFsdWUpOworLy8gICAgICAgcmV0dXJuIGZhbHNlOworLy8gICAgfQorLy8gICAgREVGSU5FX2ludDMyKHBvcnQsIDAsICJXaGF0IHBvcnQgdG8gbGlzdGVuIG9uIik7CisvLyAgICBzdGF0aWMgYm9vbCBkdW1teSA9IFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfcG9ydCwgJlZhbGlkYXRlUG9ydCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCwgZmFsc2UgaWYgbm90IChiZWNhdXNlIHRoZQorLy8gZmlyc3QgYXJndW1lbnQgZG9lc24ndCBwb2ludCB0byBhIGNvbW1hbmQtbGluZSBmbGFnLCBvciBiZWNhdXNlIGEKKy8vIHZhbGlkYXRvciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZmxhZykuCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGJvb2wgUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKGNvbnN0IGJvb2wqICAgICAgICBmbGFnLCBib29sICgqdmFsaWRhdGVfZm4pKGNvbnN0IGNoYXIqLCBib29sKSk7CitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGJvb2wgUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKGNvbnN0IGludDMyKiAgICAgICBmbGFnLCBib29sICgqdmFsaWRhdGVfZm4pKGNvbnN0IGNoYXIqLCBpbnQzMikpOworZXh0ZXJuIEdGTEFHU19ETExfREVDTCBib29sIFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcihjb25zdCBpbnQ2NCogICAgICAgZmxhZywgYm9vbCAoKnZhbGlkYXRlX2ZuKShjb25zdCBjaGFyKiwgaW50NjQpKTsKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgYm9vbCBSZWdpc3RlckZsYWdWYWxpZGF0b3IoY29uc3QgdWludDY0KiAgICAgIGZsYWcsIGJvb2wgKCp2YWxpZGF0ZV9mbikoY29uc3QgY2hhciosIHVpbnQ2NCkpOworZXh0ZXJuIEdGTEFHU19ETExfREVDTCBib29sIFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcihjb25zdCBkb3VibGUqICAgICAgZmxhZywgYm9vbCAoKnZhbGlkYXRlX2ZuKShjb25zdCBjaGFyKiwgZG91YmxlKSk7CitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGJvb2wgUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKGNvbnN0IHN0ZDo6c3RyaW5nKiBmbGFnLCBib29sICgqdmFsaWRhdGVfZm4pKGNvbnN0IGNoYXIqLCBjb25zdCBzdGQ6OnN0cmluZyYpKTsKKworLy8gQ29udmVuaWVuY2UgbWFjcm8gZm9yIHRoZSByZWdpc3RyYXRpb24gb2YgYSBmbGFnIHZhbGlkYXRvcgorI2RlZmluZSBERUZJTkVfdmFsaWRhdG9yKG5hbWUsIHZhbGlkYXRvcikgXAorICAgIHN0YXRpYyBjb25zdCBib29sIG5hbWUjI192YWxpZGF0b3JfcmVnaXN0ZXJlZCA9IFwKKyAgICAgICAgICAgIEdGTEFHU19OQU1FU1BBQ0U6OlJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfIyNuYW1lLCB2YWxpZGF0b3IpCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZXNlIG1ldGhvZHMgYXJlIHRoZSBiZXN0IHdheSB0byBnZXQgYWNjZXNzIHRvIGluZm8gYWJvdXQgdGhlCisvLyBsaXN0IG9mIGNvbW1hbmRsaW5lIGZsYWdzLiAgTm90ZSB0aGF0IHRoZXNlIHJvdXRpbmVzIGFyZSBwcmV0dHkgc2xvdy4KKy8vICAgR2V0QWxsRmxhZ3M6IG1vc3RseS1jb21wbGV0ZSBpbmZvIGFib3V0IHRoZSBsaXN0LCBzb3J0ZWQgYnkgZmlsZS4KKy8vICAgU2hvd1VzYWdlV2l0aEZsYWdzOiBwcmV0dHktcHJpbnRzIHRoZSBsaXN0IHRvIHN0ZG91dCAod2hhdCAtLWhlbHAgZG9lcykKKy8vICAgU2hvd1VzYWdlV2l0aEZsYWdzUmVzdHJpY3Q6IGxpbWl0IHRvIGZpbGVuYW1lcyB3aXRoIHJlc3RyaWN0IGFzIGEgc3Vic3RyCisvLworLy8gSW4gYWRkaXRpb24gdG8gYWNjZXNzaW5nIGZsYWdzLCB5b3UgY2FuIGFsc28gYWNjZXNzIGFyZ3ZbMF0gKHRoZSBwcm9ncmFtCisvLyBuYW1lKSBhbmQgYXJndiAodGhlIGVudGlyZSBjb21tYW5kbGluZSksIHdoaWNoIHdlIHNvY2sgYXdheSBhIGNvcHkgb2YuCisvLyBUaGVzZSB2YXJpYWJsZXMgYXJlIHN0YXRpYywgc28geW91IHNob3VsZCBvbmx5IHNldCB0aGVtIG9uY2UuCisvLworLy8gTm8gbmVlZCB0byBleHBvcnQgdGhpcyBkYXRhIG9ubHkgc3RydWN0dXJlIGZyb20gRExMLCBhdm9pZGluZyBWUyB3YXJuaW5nIDQyNTEuCitzdHJ1Y3QgQ29tbWFuZExpbmVGbGFnSW5mbyB7CisgIHN0ZDo6c3RyaW5nIG5hbWU7ICAgICAgICAgICAgLy8gdGhlIG5hbWUgb2YgdGhlIGZsYWcKKyAgc3RkOjpzdHJpbmcgdHlwZTsgICAgICAgICAgICAvLyB0aGUgdHlwZSBvZiB0aGUgZmxhZzogaW50MzIsIGV0YworICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsgICAgIC8vIHRoZSAiaGVscCB0ZXh0IiBhc3NvY2lhdGVkIHdpdGggdGhlIGZsYWcKKyAgc3RkOjpzdHJpbmcgY3VycmVudF92YWx1ZTsgICAvLyB0aGUgY3VycmVudCB2YWx1ZSwgYXMgYSBzdHJpbmcKKyAgc3RkOjpzdHJpbmcgZGVmYXVsdF92YWx1ZTsgICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSwgYXMgYSBzdHJpbmcKKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWU7ICAgICAgICAvLyAnY2xlYW5lZCcgdmVyc2lvbiBvZiBmaWxlbmFtZSBob2xkaW5nIHRoZSBmbGFnCisgIGJvb2wgaGFzX3ZhbGlkYXRvcl9mbjsgICAgICAgLy8gdHJ1ZSBpZiBSZWdpc3RlckZsYWdWYWxpZGF0b3IgY2FsbGVkIG9uIHRoaXMgZmxhZworICBib29sIGlzX2RlZmF1bHQ7ICAgICAgICAgICAgIC8vIHRydWUgaWYgdGhlIGZsYWcgaGFzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcyBub3QgYmVlbiBzZXQgZXhwbGljaXRseSBmcm9tIHRoZSBjbWRsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgdmlhIFNldENvbW1hbmRMaW5lT3B0aW9uCisgIGNvbnN0IHZvaWQqIGZsYWdfcHRyOyAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgZmxhZydzIGN1cnJlbnQgdmFsdWUgKGkuZS4gRkxBR1NfZm9vKQorfTsKKworLy8gVXNpbmcgdGhpcyBpbnNpZGUgb2YgYSB2YWxpZGF0b3IgaXMgYSByZWNpcGUgZm9yIGEgZGVhZGxvY2suCisvLyBUT0RPKHVzZXIpIEZpeCBsb2NraW5nIHdoZW4gdmFsaWRhdG9ycyBhcmUgcnVubmluZywgdG8gbWFrZSBpdCBzYWZlIHRvCisvLyBjYWxsIHZhbGlkYXRvcnMgZHVyaW5nIFBhcnNlQWxsRmxhZ3MuCisvLyBBbHNvIG1ha2Ugc3VyZSB0aGVuIHRvIHVuY29tbWVudCB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3QgaW4KKy8vIGdmbGFnc191bml0dGVzdC5zaAorZXh0ZXJuIEdGTEFHU19ETExfREVDTCB2b2lkIEdldEFsbEZsYWdzKHN0ZDo6dmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+KiBPVVRQVVQpOworLy8gVGhlc2UgdHdvIGFyZSBhY3R1YWxseSBkZWZpbmVkIGluIGdmbGFnc19yZXBvcnRpbmcuY2MuCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIHZvaWQgU2hvd1VzYWdlV2l0aEZsYWdzKGNvbnN0IGNoYXIgKmFyZ3YwKTsgIC8vIHdoYXQgLS1oZWxwIGRvZXMKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgdm9pZCBTaG93VXNhZ2VXaXRoRmxhZ3NSZXN0cmljdChjb25zdCBjaGFyICphcmd2MCwgY29uc3QgY2hhciAqcmVzdHJpY3QpOworCisvLyBDcmVhdGUgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIGEgZmxhZy4KKy8vIEdvZXMgdG8gc29tZSB0cm91YmxlIHRvIG1ha2UgcHJldHR5IGxpbmUgYnJlYWtzLgorZXh0ZXJuIEdGTEFHU19ETExfREVDTCBzdGQ6OnN0cmluZyBEZXNjcmliZU9uZUZsYWcoY29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyYgZmxhZyk7CisKKy8vIFRocmVhZC1ob3N0aWxlOyBtZWFudCB0byBiZSBjYWxsZWQgYmVmb3JlIGFueSB0aHJlYWRzIGFyZSBzcGF3bmVkLgorZXh0ZXJuIEdGTEFHU19ETExfREVDTCB2b2lkIFNldEFyZ3YoaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2KTsKKworLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHRocmVhZC1zYWZlIGFzIGxvbmcgYXMgU2V0QXJndigpIGlzCisvLyBvbmx5IGNhbGxlZCBiZWZvcmUgYW55IHRocmVhZHMgc3RhcnQuCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgR2V0QXJndnMoKTsKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgY29uc3QgY2hhciogR2V0QXJndigpOyAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb2YgYXJndiBhcyBhIHN0cmluZworZXh0ZXJuIEdGTEFHU19ETExfREVDTCBjb25zdCBjaGFyKiBHZXRBcmd2MCgpOyAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYXJndjAKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgdWludDMyIEdldEFyZ3ZTdW0oKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGUgY2hlY2tzdW0gb2YgYXJndgorZXh0ZXJuIEdGTEFHU19ETExfREVDTCBjb25zdCBjaGFyKiBQcm9ncmFtSW52b2NhdGlvbk5hbWUoKTsgICAgICAgIC8vIGFyZ3YwLCBvciAiVU5LTk9XTiIgaWYgbm90IHNldAorZXh0ZXJuIEdGTEFHU19ETExfREVDTCBjb25zdCBjaGFyKiBQcm9ncmFtSW52b2NhdGlvblNob3J0TmFtZSgpOyAgIC8vIGJhc2VuYW1lKGFyZ3YwKQorCisvLyBQcm9ncmFtVXNhZ2UoKSBpcyB0aHJlYWQtc2FmZSBhcyBsb25nIGFzIFNldFVzYWdlTWVzc2FnZSgpIGlzIG9ubHkKKy8vIGNhbGxlZCBiZWZvcmUgYW55IHRocmVhZHMgc3RhcnQuCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGNvbnN0IGNoYXIqIFByb2dyYW1Vc2FnZSgpOyAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHNldCBieSBTZXRVc2FnZU1lc3NhZ2UoKQorCisvLyBWZXJzaW9uU3RyaW5nKCkgaXMgdGhyZWFkLXNhZmUgYXMgbG9uZyBhcyBTZXRWZXJzaW9uU3RyaW5nKCkgaXMgb25seQorLy8gY2FsbGVkIGJlZm9yZSBhbnkgdGhyZWFkcyBzdGFydC4KK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgY29uc3QgY2hhciogVmVyc2lvblN0cmluZygpOyAgICAgICAgICAgICAgICAvLyBzdHJpbmcgc2V0IGJ5IFNldFZlcnNpb25TdHJpbmcoKQorCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vcm1hbGx5IHlvdSBhY2Nlc3MgY29tbWFuZGxpbmUgZmxhZ3MgYnkganVzdCBzYXlpbmcgImlmIChGTEFHU19mb28pIgorLy8gb3Igd2hhdGV2ZXIsIGFuZCBzZXQgdGhlbSBieSBjYWxsaW5nICJGTEFHU19mb28gPSBiYXIiIChvciwgbW9yZQorLy8gY29tbW9ubHksIHZpYSB0aGUgREVGSU5FX2ZvbyBtYWNybykuICBCdXQgaWYgeW91IG5lZWQgYSBiaXQgbW9yZQorLy8gY29udHJvbCwgd2UgaGF2ZSBwcm9ncmFtbWF0aWMgd2F5cyB0byBnZXQvc2V0IHRoZSBmbGFncyBhcyB3ZWxsLgorLy8gVGhlc2UgcHJvZ3JhbW1hdGljIHdheXMgdG8gYWNjZXNzIGZsYWdzIGFyZSB0aHJlYWQtc2FmZSwgYnV0IGRpcmVjdAorLy8gYWNjZXNzIGlzIG9ubHkgdGhyZWFkLWNvbXBhdGlibGUuCisKKy8vIFJldHVybiB0cnVlIGlmZiB0aGUgZmxhZ25hbWUgd2FzIGZvdW5kLgorLy8gT1VUUFVUIGlzIHNldCB0byB0aGUgZmxhZydzIHZhbHVlLCBvciB1bmNoYW5nZWQgaWYgd2UgcmV0dXJuIGZhbHNlLgorZXh0ZXJuIEdGTEFHU19ETExfREVDTCBib29sIEdldENvbW1hbmRMaW5lT3B0aW9uKGNvbnN0IGNoYXIqIG5hbWUsIHN0ZDo6c3RyaW5nKiBPVVRQVVQpOworCisvLyBSZXR1cm4gdHJ1ZSBpZmYgdGhlIGZsYWduYW1lIHdhcyBmb3VuZC4gT1VUUFVUIGlzIHNldCB0byB0aGUgZmxhZydzCisvLyBDb21tYW5kTGluZUZsYWdJbmZvIG9yIHVuY2hhbmdlZCBpZiB3ZSByZXR1cm4gZmFsc2UuCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGJvb2wgR2V0Q29tbWFuZExpbmVGbGFnSW5mbyhjb25zdCBjaGFyKiBuYW1lLCBDb21tYW5kTGluZUZsYWdJbmZvKiBPVVRQVVQpOworCisvLyBSZXR1cm4gdGhlIENvbW1hbmRMaW5lRmxhZ0luZm8gb2YgdGhlIGZsYWduYW1lLiAgZXhpdCgpIGlmIG5hbWUgbm90IGZvdW5kLgorLy8gRXhhbXBsZSB1c2FnZSwgdG8gY2hlY2sgaWYgYSBmbGFnJ3MgdmFsdWUgaXMgY3VycmVudGx5IHRoZSBkZWZhdWx0IHZhbHVlOgorLy8gICBpZiAoR2V0Q29tbWFuZExpbmVGbGFnSW5mb09yRGllKCJmb28iKS5pc19kZWZhdWx0KSAuLi4KK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgQ29tbWFuZExpbmVGbGFnSW5mbyBHZXRDb21tYW5kTGluZUZsYWdJbmZvT3JEaWUoY29uc3QgY2hhciogbmFtZSk7CisKK2VudW0gR0ZMQUdTX0RMTF9ERUNMIEZsYWdTZXR0aW5nTW9kZSB7CisgIC8vIHVwZGF0ZSB0aGUgZmxhZydzIHZhbHVlIChjYW4gY2FsbCB0aGlzIG11bHRpcGxlIHRpbWVzKS4KKyAgU0VUX0ZMQUdTX1ZBTFVFLAorICAvLyB1cGRhdGUgdGhlIGZsYWcncyB2YWx1ZSwgYnV0ICpvbmx5IGlmKiBpdCBoYXMgbm90IHlldCBiZWVuIHVwZGF0ZWQKKyAgLy8gd2l0aCBTRVRfRkxBR1NfVkFMVUUsIFNFVF9GTEFHX0lGX0RFRkFVTFQsIG9yICJGTEFHU194eHggPSBub25kZWYiLgorICBTRVRfRkxBR19JRl9ERUZBVUxULAorICAvLyBzZXQgdGhlIGZsYWcncyBkZWZhdWx0IHZhbHVlIHRvIHRoaXMuICBJZiB0aGUgZmxhZyBoYXMgbm90IHlldCB1cGRhdGVkCisgIC8vIHlldCAodmlhIFNFVF9GTEFHU19WQUxVRSwgU0VUX0ZMQUdfSUZfREVGQVVMVCwgb3IgIkZMQUdTX3h4eCA9IG5vbmRlZiIpCisgIC8vIGNoYW5nZSB0aGUgZmxhZydzIGN1cnJlbnQgdmFsdWUgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGFzIHdlbGwuCisgIFNFVF9GTEFHU19ERUZBVUxUCit9OworCisvLyBTZXQgYSBwYXJ0aWN1bGFyIGZsYWcgKCJjb21tYW5kIGxpbmUgb3B0aW9uIikuICBSZXR1cm5zIGEgc3RyaW5nCisvLyBkZXNjcmliaW5nIHRoZSBuZXcgdmFsdWUgdGhhdCB0aGUgb3B0aW9uIGhhcyBiZWVuIHNldCB0by4gIFRoZQorLy8gcmV0dXJuIHZhbHVlIEFQSSBpcyBub3Qgd2VsbC1zcGVjaWZpZWQsIHNvIGJhc2ljYWxseSBqdXN0IGRlcGVuZCBvbgorLy8gaXQgdG8gYmUgZW1wdHkgaWYgdGhlIHNldHRpbmcgZmFpbGVkIGZvciBzb21lIHJlYXNvbiAtLSB0aGUgbmFtZSBpcworLy8gbm90IGEgdmFsaWQgZmxhZyBuYW1lLCBvciB0aGUgdmFsdWUgaXMgbm90IGEgdmFsaWQgdmFsdWUgLS0gYW5kCisvLyBub24tZW1wdHkgZWxzZS4KKworLy8gU2V0Q29tbWFuZExpbmVPcHRpb24gdXNlcyBzZXRfbW9kZSA9PSBTRVRfRkxBR1NfVkFMVUUgKHRoZSBjb21tb24gY2FzZSkKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgc3RkOjpzdHJpbmcgU2V0Q29tbWFuZExpbmVPcHRpb24gICAgICAgIChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7CitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIHN0ZDo6c3RyaW5nIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIEZsYWdTZXR0aW5nTW9kZSBzZXRfbW9kZSk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNhdmVzIHRoZSBzdGF0ZXMgKHZhbHVlLCBkZWZhdWx0IHZhbHVlLCB3aGV0aGVyIHRoZSB1c2VyIGhhcyBzZXQKKy8vIHRoZSBmbGFnLCByZWdpc3RlcmVkIHZhbGlkYXRvcnMsIGV0Yykgb2YgYWxsIGZsYWdzLCBhbmQgcmVzdG9yZXMKKy8vIHRoZW0gd2hlbiB0aGUgRmxhZ1NhdmVyIGlzIGRlc3Ryb3llZC4gIFRoaXMgaXMgdmVyeSB1c2VmdWwgaW4KKy8vIHRlc3RzLCBzYXksIHdoZW4geW91IHdhbnQgdG8gbGV0IHlvdXIgdGVzdHMgY2hhbmdlIHRoZSBmbGFncywgYnV0CisvLyBtYWtlIHN1cmUgdGhhdCB0aGV5IGdldCByZXZlcnRlZCB0byB0aGUgb3JpZ2luYWwgc3RhdGVzIHdoZW4geW91cgorLy8gdGVzdCBpcyBjb21wbGV0ZS4KKy8vCisvLyBFeGFtcGxlIHVzYWdlOgorLy8gICB2b2lkIFRlc3RGb28oKSB7CisvLyAgICAgRmxhZ1NhdmVyIHMxOworLy8gICAgIEZMQUdfZm9vID0gZmFsc2U7CisvLyAgICAgRkxBR19iYXIgPSAic29tZSB2YWx1ZSI7CisvLworLy8gICAgIC8vIHRlc3QgaGFwcGVucyBoZXJlLiAgWW91IGNhbiByZXR1cm4gYXQgYW55IHRpbWUKKy8vICAgICAvLyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHJlc3RvcmluZyB0aGUgRkxBRyB2YWx1ZXMuCisvLyAgIH0KKy8vCisvLyBOb3RlOiBUaGlzIGNsYXNzIGlzIG1hcmtlZCB3aXRoIEdGTEFHU19BVFRSSUJVVEVfVU5VU0VEIGJlY2F1c2UgYWxsCisvLyB0aGUgd29yayBpcyBkb25lIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3Rvciwgc28gaW4gdGhlIHN0YW5kYXJkCisvLyB1c2FnZSBleGFtcGxlIGFib3ZlLCB0aGUgY29tcGlsZXIgd291bGQgY29tcGxhaW4gdGhhdCBpdCdzIGFuCisvLyB1bnVzZWQgdmFyaWFibGUuCisvLworLy8gVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZS4gIEhvd2V2ZXIsIGl0cyBkZXN0cnVjdG9yIHdyaXRlcyB0bworLy8gZXhhY3RseSB0aGUgc2V0IG9mIGZsYWdzIHRoYXQgaGF2ZSBjaGFuZ2VkIHZhbHVlIGR1cmluZyBpdHMKKy8vIGxpZmV0aW1lLCBzbyBjb25jdXJyZW50IF9kaXJlY3RfIGFjY2VzcyB0byB0aG9zZSBmbGFncworLy8gKGkuZS4gRkxBR1NfZm9vIGluc3RlYWQgb2Yge0dldCxTZXR9Q29tbWFuZExpbmVPcHRpb24oKSkgaXMgdW5zYWZlLgorCitjbGFzcyBHRkxBR1NfRExMX0RFQ0wgRmxhZ1NhdmVyIHsKKyBwdWJsaWM6CisgIEZsYWdTYXZlcigpOworICB+RmxhZ1NhdmVyKCk7CisKKyBwcml2YXRlOgorICBjbGFzcyBGbGFnU2F2ZXJJbXBsKiBpbXBsXzsgICAvLyB3ZSB1c2UgcGltcGwgaGVyZSB0byBrZWVwIEFQSSBzdGVhZHkKKworICBGbGFnU2F2ZXIoY29uc3QgRmxhZ1NhdmVyJik7ICAvLyBubyBjb3B5aW5nIQorICB2b2lkIG9wZXJhdG9yPShjb25zdCBGbGFnU2F2ZXImKTsKK31AR0ZMQUdTX0FUVFJJQlVURV9VTlVTRURAOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU29tZSBkZXByZWNhdGVkIG9yIGhvcGVmdWxseS1zb29uLXRvLWJlLWRlcHJlY2F0ZWQgZnVuY3Rpb25zLgorCisvLyBUaGlzIGlzIG9mdGVuIHVzZWQgZm9yIGxvZ2dpbmcuICBUT0RPKGNzaWx2ZXJzKTogZmlndXJlIG91dCBhIGJldHRlciB3YXkKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgc3RkOjpzdHJpbmcgQ29tbWFuZGxpbmVGbGFnc0ludG9TdHJpbmcoKTsKKy8vIFVzdWFsbHkgd2hlcmUgdGhpcyBpcyB1c2VkLCBhIEZsYWdTYXZlciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorZXh0ZXJuIEdGTEFHU19ETExfREVDTAorYm9vbCBSZWFkRmxhZ3NGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnZmlsZWNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb2dfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVycm9yc19hcmVfZmF0YWwpOyAgLy8gdXNlcyBTRVRfRkxBR1NfVkFMVUUKKworLy8gVGhlc2UgbGV0IHlvdSBtYW51YWxseSBpbXBsZW1lbnQgLS1mbGFnZmlsZSBmdW5jdGlvbmFsaXR5LgorLy8gREVQUkVDQVRFRC4KK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgYm9vbCBBcHBlbmRGbGFnc0ludG9GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgY2hhciogcHJvZ19uYW1lKTsKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgYm9vbCBSZWFkRnJvbUZsYWdzRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IGNoYXIqIHByb2dfbmFtZSwgYm9vbCBlcnJvcnNfYXJlX2ZhdGFsKTsgICAvLyB1c2VzIFNFVF9GTEFHU19WQUxVRQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VmdWwgcm91dGluZXMgZm9yIGluaXRpYWxpemluZyBmbGFncyBmcm9tIHRoZSBlbnZpcm9ubWVudC4KKy8vIEluIGVhY2ggY2FzZSwgaWYgJ3Zhcm5hbWUnIGRvZXMgbm90IGV4aXN0IGluIHRoZSBlbnZpcm9ubWVudAorLy8gcmV0dXJuIGRlZnZhbC4gIElmICd2YXJuYW1lJyBkb2VzIGV4aXN0IGJ1dCBpcyBub3QgdmFsaWQKKy8vIChlLmcuLCBub3QgYSBudW1iZXIgZm9yIGFuIGludDMyIGZsYWcpLCBhYm9ydCB3aXRoIGFuIGVycm9yLgorLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHZhbHVlLiAgTk9URTogZm9yIGJvb2xlYW5zLCBmb3IgdHJ1ZSB1c2UKKy8vICd0JyBvciAnVCcgb3IgJ3RydWUnIG9yICcxJywgZm9yIGZhbHNlICdmJyBvciAnRicgb3IgJ2ZhbHNlJyBvciAnMCcuCisKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgYm9vbCBCb29sRnJvbUVudihjb25zdCBjaGFyICp2YXJuYW1lLCBib29sIGRlZnZhbCk7CitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGludDMyIEludDMyRnJvbUVudihjb25zdCBjaGFyICp2YXJuYW1lLCBpbnQzMiBkZWZ2YWwpOworZXh0ZXJuIEdGTEFHU19ETExfREVDTCBpbnQ2NCBJbnQ2NEZyb21FbnYoY29uc3QgY2hhciAqdmFybmFtZSwgaW50NjQgZGVmdmFsKTsKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgdWludDY0IFVpbnQ2NEZyb21FbnYoY29uc3QgY2hhciAqdmFybmFtZSwgdWludDY0IGRlZnZhbCk7CitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGRvdWJsZSBEb3VibGVGcm9tRW52KGNvbnN0IGNoYXIgKnZhcm5hbWUsIGRvdWJsZSBkZWZ2YWwpOworZXh0ZXJuIEdGTEFHU19ETExfREVDTCBjb25zdCBjaGFyICpTdHJpbmdGcm9tRW52KGNvbnN0IGNoYXIgKnZhcm5hbWUsIGNvbnN0IGNoYXIgKmRlZnZhbCk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBuZXh0IHR3byBmdW5jdGlvbnMgcGFyc2UgZ2ZsYWdzIGZyb20gbWFpbigpOgorCisvLyBTZXQgdGhlICJ1c2FnZSIgbWVzc2FnZSBmb3IgdGhpcyBwcm9ncmFtLiAgRm9yIGV4YW1wbGU6CisvLyAgIHN0cmluZyB1c2FnZSgiVGhpcyBwcm9ncmFtIGRvZXMgbm90aGluZy4gIFNhbXBsZSB1c2FnZTpcbiIpOworLy8gICB1c2FnZSArPSBhcmd2WzBdICsgIiA8dXNlbGVzc2FyZzE+IDx1c2VsZXNzYXJnMj4iOworLy8gICBTZXRVc2FnZU1lc3NhZ2UodXNhZ2UpOworLy8gRG8gbm90IGluY2x1ZGUgY29tbWFuZGxpbmUgZmxhZ3MgaW4gdGhlIHVzYWdlOiB3ZSBkbyB0aGF0IGZvciB5b3UhCisvLyBUaHJlYWQtaG9zdGlsZTsgbWVhbnQgdG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgdGhyZWFkcyBhcmUgc3Bhd25lZC4KK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgdm9pZCBTZXRVc2FnZU1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHVzYWdlKTsKKworLy8gU2V0cyB0aGUgdmVyc2lvbiBzdHJpbmcsIHdoaWNoIGlzIGVtaXR0ZWQgd2l0aCAtLXZlcnNpb24uCisvLyBGb3IgaW5zdGFuY2U6IFNldFZlcnNpb25TdHJpbmcoIjEuMyIpOworLy8gVGhyZWFkLWhvc3RpbGU7IG1lYW50IHRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IHRocmVhZHMgYXJlIHNwYXduZWQuCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIHZvaWQgU2V0VmVyc2lvblN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgdmVyc2lvbik7CisKKworLy8gTG9va3MgZm9yIGZsYWdzIGluIGFyZ3YgYW5kIHBhcnNlcyB0aGVtLiAgUmVhcnJhbmdlcyBhcmd2IHRvIHB1dAorLy8gZmxhZ3MgZmlyc3QsIG9yIHJlbW92ZXMgdGhlbSBlbnRpcmVseSBpZiByZW1vdmVfZmxhZ3MgaXMgdHJ1ZS4KKy8vIElmIGEgZmxhZyBpcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb21tYW5kIGxpbmUgb3IgZmxhZworLy8gZmlsZSwgdGhlIGxhc3QgZGVmaW5pdGlvbiBpcyB1c2VkLiAgUmV0dXJucyB0aGUgaW5kZXggKGludG8gYXJndikKKy8vIG9mIHRoZSBmaXJzdCBub24tZmxhZyBhcmd1bWVudC4KKy8vIFNlZSB0b3Atb2YtZmlsZSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgZnVuY3Rpb24uCisjaWZuZGVmIFNXSUcgICAvLyBJbiBzd2lnLCB1c2UgUGFyc2VDb21tYW5kTGluZUZsYWdzU2NyaXB0KCkgaW5zdGVhZC4KK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgdWludDMyIFBhcnNlQ29tbWFuZExpbmVGbGFncyhpbnQgKmFyZ2MsIGNoYXIqKiogYXJndiwgYm9vbCByZW1vdmVfZmxhZ3MpOworI2VuZGlmCisKKworLy8gQ2FsbHMgdG8gUGFyc2VDb21tYW5kTGluZU5vbkhlbHBGbGFncyBhbmQgdGhlbiB0bworLy8gSGFuZGxlQ29tbWFuZExpbmVIZWxwRmxhZ3MgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGNhbGwgdG8KKy8vIFBhcnNlQ29tbWFuZExpbmVGbGFncyBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIGluIG9yZGVyIHRvIGFsbG93IGZvcgorLy8gY2hhbmdpbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIHNvbWUgRkxBR1MgKHZpYQorLy8gZS5nLiBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlIGNhbGxzKSBiZXR3ZWVuIHRoZSB0aW1lIG9mCisvLyBjb21tYW5kIGxpbmUgcGFyc2luZyBhbmQgdGhlIHRpbWUgb2YgZHVtcGluZyBoZWxwIGluZm9ybWF0aW9uIGZvcgorLy8gdGhlIGZsYWdzIGFzIGEgcmVzdWx0IG9mIGNvbW1hbmQgbGluZSBwYXJzaW5nLiAgSWYgYSBmbGFnIGlzCisvLyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb21tYW5kIGxpbmUgb3IgZmxhZyBmaWxlLCB0aGUgbGFzdAorLy8gZGVmaW5pdGlvbiBpcyB1c2VkLiAgUmV0dXJucyB0aGUgaW5kZXggKGludG8gYXJndikgb2YgdGhlIGZpcnN0CisvLyBub24tZmxhZyBhcmd1bWVudC4gIChJZiByZW1vdmVfZmxhZ3MgaXMgdHJ1ZSwgd2lsbCBhbHdheXMgcmV0dXJuIDEuKQorZXh0ZXJuIEdGTEFHU19ETExfREVDTCB1aW50MzIgUGFyc2VDb21tYW5kTGluZU5vbkhlbHBGbGFncyhpbnQgKmFyZ2MsIGNoYXIqKiogYXJndiwgYm9vbCByZW1vdmVfZmxhZ3MpOworCisvLyBUaGlzIGlzIGFjdHVhbGx5IGRlZmluZWQgaW4gZ2ZsYWdzX3JlcG9ydGluZy5jYy4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgbWlzbmFtZWQgKGl0IGFsc28gaGFuZGxlcyAtLXZlcnNpb24sIGV0Yy4pLCBidXQKKy8vIGl0J3MgdG9vIGxhdGUgdG8gY2hhbmdlIHRoYXQgbm93LiA6LSgKK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgdm9pZCBIYW5kbGVDb21tYW5kTGluZUhlbHBGbGFncygpOyAgIC8vIGluIGdmbGFnc19yZXBvcnRpbmcuY2MKKworLy8gQWxsb3cgY29tbWFuZCBsaW5lIHJlcGFyc2luZy4gIERpc2FibGVzIHRoZSBlcnJvciBub3JtYWxseQorLy8gZ2VuZXJhdGVkIHdoZW4gYW4gdW5rbm93biBmbGFnIGlzIGZvdW5kLCBzaW5jZSBpdCBtYXkgYmUgZm91bmQgaW4gYQorLy8gbGF0ZXIgcGFyc2UuICBUaHJlYWQtaG9zdGlsZTsgbWVhbnQgdG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgdGhyZWFkcworLy8gYXJlIHNwYXduZWQuCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIHZvaWQgQWxsb3dDb21tYW5kTGluZVJlcGFyc2luZygpOworCisvLyBSZXBhcnNlIHRoZSBmbGFncyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHJlY29nbml6ZWQuICBPbmx5IGZsYWdzCisvLyByZWdpc3RlcmVkIHNpbmNlIHRoZSBsYXN0IHBhcnNlIHdpbGwgYmUgcmVjb2duaXplZC4gIEFueSBmbGFnIHZhbHVlCisvLyBtdXN0IGJlIHByb3ZpZGVkIGFzIHBhcnQgb2YgdGhlIGFyZ3VtZW50IHVzaW5nICI9Iiwgbm90IGFzIGEKKy8vIHNlcGFyYXRlIGNvbW1hbmQgbGluZSBhcmd1bWVudCB0aGF0IGZvbGxvd3MgdGhlIGZsYWcgYXJndW1lbnQuCisvLyBJbnRlbmRlZCBmb3IgaGFuZGxpbmcgZmxhZ3MgZnJvbSBkeW5hbWljYWxseSBsb2FkZWQgbGlicmFyaWVzLAorLy8gc2luY2UgdGhlaXIgZmxhZ3MgYXJlIG5vdCByZWdpc3RlcmVkIHVudGlsIHRoZXkgYXJlIGxvYWRlZC4KK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgdm9pZCBSZXBhcnNlQ29tbWFuZExpbmVOb25IZWxwRmxhZ3MoKTsKKworLy8gQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRlZCBieSBmbGFncy4gIFRoaXMgaXMgb25seSBuZWVkZWQgdG8gcmVkdWNlCisvLyB0aGUgcXVhbnRpdHkgb2YgInBvdGVudGlhbGx5IGxlYWtlZCIgcmVwb3J0cyBlbWl0dGVkIGJ5IG1lbW9yeQorLy8gZGVidWdnaW5nIHRvb2xzIHN1Y2ggYXMgdmFsZ3JpbmQuICBJdCBpcyBub3QgcmVxdWlyZWQgZm9yIG5vcm1hbAorLy8gb3BlcmF0aW9uLCBvciBmb3IgdGhlIGdvb2dsZSBwZXJmdG9vbHMgaGVhcC1jaGVja2VyLiAgSXQgbXVzdCBvbmx5CisvLyBiZSBjYWxsZWQgd2hlbiB0aGUgcHJvY2VzcyBpcyBhYm91dCB0byBleGl0LCBhbmQgYWxsIHRocmVhZHMgdGhhdAorLy8gbWlnaHQgYWNjZXNzIGZsYWdzIGFyZSBxdWllc2NlbnQuICBSZWZlcmVuY2luZyBmbGFncyBhZnRlciB0aGlzIGlzCisvLyBjYWxsZWQgd2lsbCBoYXZlIHVuZXhwZWN0ZWQgY29uc2VxdWVuY2VzLiAgVGhpcyBpcyBub3Qgc2FmZSB0byBydW4KKy8vIHdoZW4gbXVsdGlwbGUgdGhyZWFkcyBtaWdodCBiZSBydW5uaW5nOiB0aGUgZnVuY3Rpb24gaXMKKy8vIHRocmVhZC1ob3N0aWxlLgorZXh0ZXJuIEdGTEFHU19ETExfREVDTCB2b2lkIFNodXREb3duQ29tbWFuZExpbmVGbGFncygpOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb3cgY29tZSB0aGUgY29tbWFuZCBsaW5lIGZsYWcgZGVjbGFyYXRpb24vZGVmaW5pdGlvbiBtYWNyb3MgdGhhdAorLy8gd2lsbCBhY3R1YWxseSBiZSB1c2VkLiAgVGhleSdyZSBraW5kIG9mIGhhaXJ5LiAgQSBtYWpvciByZWFzb24KKy8vIGZvciB0aGlzIGlzIGluaXRpYWxpemF0aW9uOiB3ZSB3YW50IHBlb3BsZSB0byBiZSBhYmxlIHRvIGFjY2VzcworLy8gdmFyaWFibGVzIGluIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGhhdmUgdGhhdCBub3QgY3Jhc2gsIGV2ZW4gaWYKKy8vIHRoZWlyIGdsb2JhbCBjb25zdHJ1Y3RvciBydW5zIGJlZm9yZSB0aGUgZ2xvYmFsIGNvbnN0cnVjdG9yIGhlcmUuCisvLyAoT2J2aW91c2x5LCB3ZSBjYW4ndCBndWFyYW50ZWUgdGhlIGZsYWdzIHdpbGwgaGF2ZSB0aGUgY29ycmVjdAorLy8gZGVmYXVsdCB2YWx1ZSBpbiB0aGF0IGNhc2UsIGJ1dCBhdCBsZWFzdCBhY2Nlc3NpbmcgdGhlbSBpcyBzYWZlLikKKy8vIFRoZSBvbmx5IHdheSB0byBkbyB0aGF0IGlzIGhhdmUgZmxhZ3MgcG9pbnQgdG8gYSBzdGF0aWMgYnVmZmVyLgorLy8gU28gd2UgbWFrZSBvbmUsIHVzaW5nIGEgdW5pb24gdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQsIGFuZAorLy8gdGhlbiB1c2UgcGxhY2VtZW50LW5ldyB0byBhY3R1YWxseSBzZXQgdXAgdGhlIGZsYWcgd2l0aCB0aGUKKy8vIGNvcnJlY3QgZGVmYXVsdCB2YWx1ZS4gIEluIHRoZSBzYW1lIHZlaW4sIHdlIGhhdmUgdG8gd29ycnkgYWJvdXQKKy8vIGZsYWcgYWNjZXNzIGluIGdsb2JhbCBkZXN0cnVjdG9ycywgc28gRmxhZ1JlZ2lzdGVyZXIgaGFzIHRvIGJlCisvLyBjYXJlZnVsIG5ldmVyIHRvIGRlc3Ryb3kgdGhlIGZsYWctdmFsdWVzIGl0IGNvbnN0cnVjdHMuCisvLworLy8gTm90ZSB0aGF0IHdoZW4gd2UgZGVmaW5lIGEgZmxhZyB2YXJpYWJsZSBGTEFHU188bmFtZT4sIHdlIGFsc28KKy8vIHByZWVtcHRpdmVseSBkZWZpbmUgYSBqdW5rIHZhcmlhYmxlLCBGTEFHU19ubzxuYW1lPi4gIFRoaXMgaXMgdG8KKy8vIGNhdXNlIGEgbGluay10aW1lIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgdG8gZGVmaW5lIDIgZmxhZ3Mgd2l0aAorLy8gbmFtZXMgbGlrZSAibG9nZ2luZyIgYW5kICJub2xvZ2dpbmciLiAgV2UgZG8gdGhpcyBiZWNhdXNlIGEgYm9vbAorLy8gZmxhZyBGTEFHIGNhbiBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHRvIHRydWUgd2l0aCBhICItRkxBRyIKKy8vIGFyZ3VtZW50LCBhbmQgdG8gZmFsc2Ugd2l0aCBhICItbm9GTEFHIiBhcmd1bWVudCwgYW5kIHNvIHRoaXMgY2FuCisvLyBwb3RlbnRpYWxseSBhdmVydCBjb25mdXNpb24uCisvLworLy8gV2UgYWxzbyBwdXQgZmxhZ3MgaW50byB0aGVpciBvd24gbmFtZXNwYWNlLiAgSXQgaXMgcHVycG9zZWZ1bGx5CisvLyBuYW1lZCBpbiBhbiBvcGFxdWUgd2F5IHRoYXQgcGVvcGxlIHNob3VsZCBoYXZlIHRyb3VibGUgdHlwaW5nCisvLyBkaXJlY3RseS4gIFRoZSBpZGVhIGlzIHRoYXQgREVGSU5FIHB1dHMgdGhlIGZsYWcgaW4gdGhlIHdlaXJkCisvLyBuYW1lc3BhY2UsIGFuZCBERUNMQVJFIGltcG9ydHMgdGhlIGZsYWcgZnJvbSB0aGVyZSBpbnRvIHRoZSBjdXJyZW50CisvLyBuYW1lc3BhY2UuICBUaGUgbmV0IHJlc3VsdCBpcyB0byBmb3JjZSBwZW9wbGUgdG8gdXNlIERFQ0xBUkUgdG8gZ2V0CisvLyBhY2Nlc3MgdG8gYSBmbGFnLCByYXRoZXIgdGhhbiBzYXlpbmcgImV4dGVybiBHRkxBR1NfRExMX0RFQ0wgYm9vbCBGTEFHU193aGF0ZXZlcjsiCisvLyBvciBzb21lIHN1Y2ggaW5zdGVhZC4gIFdlIHdhbnQgdGhpcyBzbyB3ZSBjYW4gcHV0IGV4dHJhCisvLyBmdW5jdGlvbmFsaXR5IChsaWtlIHNhbml0eS1jaGVja2luZykgaW4gREVDTEFSRSBpZiB3ZSB3YW50LCBhbmQKKy8vIG1ha2Ugc3VyZSBpdCBpcyBwaWNrZWQgdXAgZXZlcnl3aGVyZS4KKy8vCisvLyBXZSBhbHNvIHB1dCB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIG5hbWVzcGFjZSwgc28gdGhhdAorLy8gcGVvcGxlIGNhbid0IERFQ0xBUkVfaW50MzIgc29tZXRoaW5nIHRoYXQgdGhleSBERUZJTkVfYm9vbCdkCisvLyBlbHNld2hlcmUuCisKK2NsYXNzIEdGTEFHU19ETExfREVDTCBGbGFnUmVnaXN0ZXJlciB7CisgcHVibGljOgorICBGbGFnUmVnaXN0ZXJlcihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB0eXBlLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBoZWxwLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgdm9pZCogY3VycmVudF9zdG9yYWdlLCB2b2lkKiBkZWZ2YWx1ZV9zdG9yYWdlKTsKK307CisKKy8vIElmIHlvdXIgYXBwbGljYXRpb24gI2RlZmluZXMgU1RSSVBfRkxBR19IRUxQIHRvIGEgbm9uLXplcm8gdmFsdWUKKy8vIGJlZm9yZSAjaW5jbHVkaW5nIHRoaXMgZmlsZSwgd2UgcmVtb3ZlIHRoZSBoZWxwIG1lc3NhZ2UgZnJvbSB0aGUKKy8vIGJpbmFyeSBmaWxlLiBUaGlzIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBiaW5hcnkKKy8vIHNvbWV3aGF0LCBhbmQgbWF5IGFsc28gYmUgdXNlZnVsIGZvciBzZWN1cml0eSByZWFzb25zLgorCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIGNvbnN0IGNoYXIga1N0cmlwcGVkRmxhZ0hlbHBbXTsKKworCit9IC8vIG5hbWVzcGFjZSBHRkxBR1NfTkFNRVNQQUNFCisKKworI2lmbmRlZiBTV0lHICAvLyBJbiBzd2lnLCBpZ25vcmUgdGhlIG1haW4gZmxhZyBkZWNsYXJhdGlvbnMKKworI2lmIGRlZmluZWQoU1RSSVBfRkxBR19IRUxQKSAmJiBTVFJJUF9GTEFHX0hFTFAgPiAwCisvLyBOZWVkIHRoaXMgY29uc3RydWN0IHRvIGF2b2lkIHRoZSAnZGVmaW5lZCBidXQgbm90IHVzZWQnIHdhcm5pbmcuCisjZGVmaW5lIE1BWUJFX1NUUklQUEVEX0hFTFAodHh0KSBcCisgICAoZmFsc2UgPyAodHh0KSA6IEdGTEFHU19OQU1FU1BBQ0U6OmtTdHJpcHBlZEZsYWdIZWxwKQorI2Vsc2UKKyNkZWZpbmUgTUFZQkVfU1RSSVBQRURfSEVMUCh0eHQpIHR4dAorI2VuZGlmCisKKy8vIEVhY2ggY29tbWFuZC1saW5lIGZsYWcgaGFzIHR3byB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIGl0OiBvbmUKKy8vIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUsIGFuZCBvbmUgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZS4gIEhvd2V2ZXIsCisvLyB3ZSBoYXZlIGEgdGhpcmQgdmFyaWFibGUsIHdoaWNoIGlzIHdoZXJlIHZhbHVlIGlzIGFzc2lnbmVkOyBpdCdzIGEKKy8vIGNvbnN0YW50LiAgVGhpcyBndWFyYW50ZWVzIHRoYXQgRkxBR18jI3ZhbHVlIGlzIGluaXRpYWxpemVkIGF0CisvLyBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdGltZSAoZS5nLiBiZWZvcmUgcHJvZ3JhbS1zdGFydCkgcmF0aGVyIHRoYW4KKy8vIHRoYW4gZ2xvYmFsIGNvbnN0cnVjdGlvbiB0aW1lICh3aGljaCBpcyBhZnRlciBwcm9ncmFtLXN0YXJ0IGJ1dAorLy8gYmVmb3JlIG1haW4pLCBhdCBsZWFzdCB3aGVuICd2YWx1ZScgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuICBXZQorLy8gdXNlIGEgc21hbGwgdHJpY2sgZm9yIHRoZSAiZGVmYXVsdCB2YWx1ZSIgdmFyaWFibGUsIGFuZCBjYWxsIGl0CisvLyBGTEFHU19ubzxuYW1lPi4gIFRoaXMgc2VydmVzIHRoZSBzZWNvbmQgcHVycG9zZSBvZiBhc3N1cmluZyBhCisvLyBjb21waWxlIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgdG8gZGVmaW5lIGEgZmxhZyBuYW1lZCBubzxuYW1lPgorLy8gd2hpY2ggaXMgaWxsZWdhbCAoLS1mb28gYW5kIC0tbm9mb28gYm90aCBhZmZlY3QgdGhlICJmb28iIGZsYWcpLgorI2RlZmluZSBERUZJTkVfVkFSSUFCTEUodHlwZSwgc2hvcnR0eXBlLCBuYW1lLCB2YWx1ZSwgaGVscCkgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgZkwjI3Nob3J0dHlwZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjb25zdCB0eXBlIEZMQUdTX25vbm8jI25hbWUgPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIFdlIGFsd2F5cyB3YW50IHRvIGV4cG9ydCBkZWZpbmVkIHZhcmlhYmxlcywgZGxsIG9yIG5vICovICAgICAgICAgXAorICAgIEdGTEFHU19ETExfREVGSU5FX0ZMQUcgdHlwZSBGTEFHU18jI25hbWUgPSBGTEFHU19ub25vIyNuYW1lOyAgICAgICAgXAorICAgIHR5cGUgRkxBR1Nfbm8jI25hbWUgPSBGTEFHU19ub25vIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBHRkxBR1NfTkFNRVNQQUNFOjpGbGFnUmVnaXN0ZXJlciBvXyMjbmFtZSggICAgICAgICAgICAgICAgICAgXAorICAgICAgI25hbWUsICN0eXBlLCBNQVlCRV9TVFJJUFBFRF9IRUxQKGhlbHApLCBfX0ZJTEVfXywgICAgICAgICAgICAgICAgXAorICAgICAgJkZMQUdTXyMjbmFtZSwgJkZMQUdTX25vIyNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyBmTCMjc2hvcnR0eXBlOjpGTEFHU18jI25hbWUKKworLy8gRm9yIERFRklORV9ib29sLCB3ZSB3YW50IHRvIGRvIHRoZSBleHRyYSBjaGVjayB0aGF0IHRoZSBwYXNzZWQtaW4KKy8vIHZhbHVlIGlzIGFjdHVhbGx5IGEgYm9vbCwgYW5kIG5vdCBhIHN0cmluZyBvciBzb21ldGhpbmcgdGhhdCBjYW4gYmUKKy8vIGNvZXJjZWQgdG8gYSBib29sLiAgVGhlc2UgZGVjbGFyYXRpb25zIChubyBkZWZpbml0aW9uIG5lZWRlZCEpIHdpbGwKKy8vIGhlbHAgdXMgZG8gdGhhdCwgYW5kIG5ldmVyIGV2YWx1YXRlIEZyb20sIHdoaWNoIGlzIGltcG9ydGFudC4KKy8vIFdlJ2xsIHVzZSAnc2l6ZW9mKElzQm9vbCh2YWwpKScgdG8gZGlzdGluZ3Vpc2guIFRoaXMgY29kZSByZXF1aXJlcworLy8gdGhhdCB0aGUgY29tcGlsZXIgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgZm9yIGJvb2wgJiBkb3VibGUuIFNpbmNlCisvLyB0aGlzIGlzIG5vdCBndWFyYW50ZWVkIGJ5IHRoZSBzdGFuZGFyZCwgd2UgY2hlY2sgaXQgd2l0aCBhCisvLyBDT01QSUxFX0FTU0VSVC4KK25hbWVzcGFjZSBmTEIgeworc3RydWN0IENvbXBpbGVBc3NlcnQge307Cit0eXBlZGVmIENvbXBpbGVBc3NlcnQgZXhwZWN0ZWRfc2l6ZW9mX2RvdWJsZV9uZXFfc2l6ZW9mX2Jvb2xbCisgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihkb3VibGUpICE9IHNpemVvZihib29sKSkgPyAxIDogLTFdOwordGVtcGxhdGU8dHlwZW5hbWUgRnJvbT4gZG91YmxlIEdGTEFHU19ETExfREVDTCBJc0Jvb2xGbGFnKGNvbnN0IEZyb20mIGZyb20pOworR0ZMQUdTX0RMTF9ERUNMIGJvb2wgSXNCb29sRmxhZyhib29sIGZyb20pOworfSAgLy8gbmFtZXNwYWNlIGZMQgorCisvLyBIZXJlIGFyZSB0aGUgYWN0dWFsIERFRklORV8qLW1hY3Jvcy4gVGhlIHJlc3BlY3RpdmUgREVDTEFSRV8qLW1hY3JvcworLy8gYXJlIGluIGEgc2VwYXJhdGUgaW5jbHVkZSwgZ2ZsYWdzX2RlY2xhcmUuaCwgZm9yIHJlZHVjaW5nCisvLyB0aGUgcGh5c2ljYWwgdHJhbnNpdGl2ZSBzaXplIGZvciBERUNMQVJFIHVzZS4KKyNkZWZpbmUgREVGSU5FX2Jvb2wobmFtZSwgdmFsLCB0eHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGZMQiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIDo6ZkxCOjpDb21waWxlQXNzZXJ0IEZMQUdfIyNuYW1lIyNfdmFsdWVfaXNfbm90X2FfYm9vbFsgICAgIFwKKyAgICAgICAgICAgIChzaXplb2YoOjpmTEI6OklzQm9vbEZsYWcodmFsKSkgIT0gc2l6ZW9mKGRvdWJsZSkpPyAxOiAtMV07IFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREVGSU5FX1ZBUklBQkxFKGJvb2wsIEIsIG5hbWUsIHZhbCwgdHh0KQorCisjZGVmaW5lIERFRklORV9pbnQzMihuYW1lLCB2YWwsIHR4dCkgXAorICAgREVGSU5FX1ZBUklBQkxFKEdGTEFHU19OQU1FU1BBQ0U6OmludDMyLCBJLCBcCisgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsLCB0eHQpCisKKyNkZWZpbmUgREVGSU5FX2ludDY0KG5hbWUsIHZhbCwgdHh0KSBcCisgICBERUZJTkVfVkFSSUFCTEUoR0ZMQUdTX05BTUVTUEFDRTo6aW50NjQsIEk2NCwgXAorICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbCwgdHh0KQorCisjZGVmaW5lIERFRklORV91aW50NjQobmFtZSx2YWwsIHR4dCkgXAorICAgREVGSU5FX1ZBUklBQkxFKEdGTEFHU19OQU1FU1BBQ0U6OnVpbnQ2NCwgVTY0LCBcCisgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsLCB0eHQpCisKKyNkZWZpbmUgREVGSU5FX2RvdWJsZShuYW1lLCB2YWwsIHR4dCkgXAorICAgREVGSU5FX1ZBUklBQkxFKGRvdWJsZSwgRCwgbmFtZSwgdmFsLCB0eHQpCisKKy8vIFN0cmluZ3MgYXJlIHRyaWNraWVyLCBiZWNhdXNlIHRoZXkncmUgbm90IGEgUE9ELCBzbyB3ZSBjYW4ndAorLy8gY29uc3RydWN0IHRoZW0gYXQgc3RhdGljLWluaXRpYWxpemF0aW9uIHRpbWUgKGluc3RlYWQgdGhleSBnZXQKKy8vIGNvbnN0cnVjdGVkIGF0IGdsb2JhbC1jb25zdHJ1Y3RvciB0aW1lLCB3aGljaCBpcyBtdWNoIGxhdGVyKS4gIFRvCisvLyB0cnkgdG8gYXZvaWQgY3Jhc2hlcyBpbiB0aGF0IGNhc2UsIHdlIHVzZSBhIGNoYXIgYnVmZmVyIHRvIHN0b3JlCisvLyB0aGUgc3RyaW5nLCB3aGljaCB3ZSBjYW4gc3RhdGljLWluaXRpYWxpemUsIGFuZCB0aGVuIHBsYWNlbWVudC1uZXcKKy8vIGludG8gaXQgbGF0ZXIuICBJdCdzIG5vdCBwZXJmZWN0LCBidXQgdGhlIGJlc3Qgd2UgY2FuIGRvLgorCituYW1lc3BhY2UgZkxTIHsKKworaW5saW5lIGNsc3RyaW5nKiBkb250X3Bhc3MwdG9ERUZJTkVfc3RyaW5nKGNoYXIgKnN0cmluZ3Nwb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgcmV0dXJuIG5ldyhzdHJpbmdzcG90KSBjbHN0cmluZyh2YWx1ZSk7Cit9CitpbmxpbmUgY2xzdHJpbmcqIGRvbnRfcGFzczB0b0RFRklORV9zdHJpbmcoY2hhciAqc3RyaW5nc3BvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbHN0cmluZyAmdmFsdWUpIHsKKyAgcmV0dXJuIG5ldyhzdHJpbmdzcG90KSBjbHN0cmluZyh2YWx1ZSk7Cit9CitpbmxpbmUgY2xzdHJpbmcqIGRvbnRfcGFzczB0b0RFRklORV9zdHJpbmcoY2hhciAqc3RyaW5nc3BvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpOworfSAgLy8gbmFtZXNwYWNlIGZMUworCisvLyBXZSBuZWVkIHRvIGRlZmluZSBhIHZhciBuYW1lZCBGTEFHU19ubyMjbmFtZSBzbyBwZW9wbGUgZG9uJ3QgZGVmaW5lCisvLyAtLXN0cmluZyBhbmQgLS1ub3N0cmluZy4gIEFuZCB3ZSBuZWVkIGEgdGVtcG9yYXJ5IHBsYWNlIHRvIHB1dCB2YWwKKy8vIHNvIHdlIGRvbid0IGhhdmUgdG8gZXZhbHVhdGUgaXQgdHdpY2UuICBUd28gZ3JlYXQgbmVlZHMgdGhhdCBnbworLy8gZ3JlYXQgdG9nZXRoZXIhCisvLyBUaGUgd2VpcmQgJ3VzaW5nJyArICdleHRlcm4nIGluc2lkZSB0aGUgZkxTIG5hbWVzcGFjZSBpcyB0byB3b3JrIGFyb3VuZAorLy8gYW4gdW5rbm93biBjb21waWxlciBidWcvaXNzdWUgd2l0aCB0aGUgZ2NjIDQuMi4xIG9uIFNVU0UgMTAuICBTZWUKKy8vICAgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZ2ZsYWdzL2lzc3Vlcy9kZXRhaWw/aWQ9MjAKKyNkZWZpbmUgREVGSU5FX3N0cmluZyhuYW1lLCB2YWwsIHR4dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBmTFMgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIDo6ZkxTOjpjbHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdW5pb24geyB2b2lkKiBhbGlnbjsgY2hhciBzW3NpemVvZihjbHN0cmluZyldOyB9IHNfIyNuYW1lWzJdOyAgICBcCisgICAgY2xzdHJpbmcqIGNvbnN0IEZMQUdTX25vIyNuYW1lID0gOjpmTFM6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb250X3Bhc3MwdG9ERUZJTkVfc3RyaW5nKHNfIyNuYW1lWzBdLnMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwpOyAgICAgICAgICBcCisgICAgc3RhdGljIEdGTEFHU19OQU1FU1BBQ0U6OkZsYWdSZWdpc3RlcmVyIG9fIyNuYW1lKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAjbmFtZSwgInN0cmluZyIsIE1BWUJFX1NUUklQUEVEX0hFTFAodHh0KSwgX19GSUxFX18sICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc18jI25hbWVbMF0ucywgbmV3IChzXyMjbmFtZVsxXS5zKSBjbHN0cmluZygqRkxBR1Nfbm8jI25hbWUpKTsgICAgICBcCisgICAgZXh0ZXJuIEdGTEFHU19ETExfREVGSU5FX0ZMQUcgY2xzdHJpbmcmIEZMQUdTXyMjbmFtZTsgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIGZMUzo6RkxBR1NfIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbHN0cmluZyYgRkxBR1NfIyNuYW1lID0gKkZMQUdTX25vIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyBmTFM6OkZMQUdTXyMjbmFtZQorCisjZW5kaWYgIC8vIFNXSUcKKworCitASU5DTFVERV9HRkxBR1NfTlNfSEAKKworCisjZW5kaWYgIC8vIEdGTEFHU19HRkxBR1NfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvZ2ZsYWdzX2NvbXBsZXRpb25zLmNjIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3NfY29tcGxldGlvbnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0NzYyMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvZ2ZsYWdzX2NvbXBsZXRpb25zLmNjCkBAIC0wLDAgKzEsNzY5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIC0tLQorCisvLyBCYXNoLXN0eWxlIGNvbW1hbmQgbGluZSBmbGFnIGNvbXBsZXRpb24gZm9yIEMrKyBiaW5hcmllcworLy8KKy8vIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYmFzaC1zdHlsZSBjb21wbGV0aW9ucy4gIEl0IGFjaGlldmVzIHRoaXMKKy8vIGdvYWwgaW4gdGhlIGZvbGxvd2luZyBicm9hZCBjaHVua3M6CisvLworLy8gIDEpIFRha2UgYSB0by1iZS1jb21wbGV0ZWQgd29yZCwgYW5kIGV4YW1pbmUgaXQgZm9yIHNlYXJjaCBoaW50cworLy8gIDIpIElkZW50aWZ5IGFsbCBwb3RlbnRpYWxseSBtYXRjaGluZyBmbGFncworLy8gICAgIDJhKSBJZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgZmxhZ3MsIGRvIG5vdGhpbmcuCisvLyAgICAgMmIpIElmIGFsbCBtYXRjaGluZyBmbGFncyBzaGFyZSBhIGNvbW1vbiBwcmVmaXggbG9uZ2VyIHRoYW4gdGhlCisvLyAgICAgICAgIGNvbXBsZXRpb24gd29yZCwgb3V0cHV0IGp1c3QgdGhhdCBtYXRjaGluZyBwcmVmaXgKKy8vICAzKSBDYXRlZ29yaXplIHRob3NlIGZsYWdzIHRvIHByb2R1Y2UgYSByb3VnaCBvcmRlcmluZyBvZiByZWxldmVuY2UuCisvLyAgNCkgUG90ZW50aWFsbHkgdHJpbSB0aGUgc2V0IG9mIGZsYWdzIHJldHVybmVkIHRvIGEgc21hbGxlciBudW1iZXIKKy8vICAgICB0aGF0IGJhc2ggaXMgaGFwcGllciB3aXRoCisvLyAgNSkgT3V0cHV0IHRoZSBtYXRjaGluZyBmbGFncyBpbiBncm91cHMgb3JkZXJlZCBieSByZWxldmVuY2UuCisvLyAgICAgNWEpIEZvcmNlIGJhc2ggdG8gcGxhY2UgbW9zdC1yZWxldmVudCBncm91cHMgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdAorLy8gICAgIDViKSBUcmltIG1vc3QgZmxhZydzIGRlc2NyaXB0aW9ucyB0byBmaXQgb24gYSBzaW5nbGUgdGVybWluYWwgbGluZQorCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgLy8gZm9yIHN0cmxlbgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImdmbGFncy5oIgorI2luY2x1ZGUgInV0aWwuaCIKKwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisKK0RFRklORV9zdHJpbmcodGFiX2NvbXBsZXRpb25fd29yZCwgIiIsCisgICAgICAgICAgICAgICJJZiBub24tZW1wdHksIEhhbmRsZUNvbW1hbmRMaW5lQ29tcGxldGlvbnMoKSB3aWxsIGhpamFjayB0aGUgIgorICAgICAgICAgICAgICAicHJvY2VzcyBhbmQgYXR0ZW1wdCB0byBkbyBiYXNoLXN0eWxlIGNvbW1hbmQgbGluZSBmbGFnICIKKyAgICAgICAgICAgICAgImNvbXBsZXRpb24gb24gdGhpcyB2YWx1ZS4iKTsKK0RFRklORV9pbnQzMih0YWJfY29tcGxldGlvbl9jb2x1bW5zLCA4MCwKKyAgICAgICAgICAgICAiTnVtYmVyIG9mIGNvbHVtbnMgdG8gdXNlIGluIG91dHB1dCBmb3IgdGFiIGNvbXBsZXRpb24iKTsKKworCituYW1lc3BhY2UgR0ZMQUdTX05BTUVTUEFDRSB7CisKKworbmFtZXNwYWNlIHsKKy8vIEZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIFR5cGUgZm9yd2FyZCBkZWNsYXJhdGlvbnMuICBDb2RlIG1heSBiZQorLy8gbW9yZSBlYXNpbHkgdW5kZXJzdG9vZCBpZiBpdCBpcyByb3VnaGx5IG9yZGVyZWQgYWNjb3JkaW5nIHRvCisvLyBjb250cm9sIGZsb3csIHJhdGhlciB0aGFuIGJ5IEMncyAiZGVjbGFyZSBiZWZvcmUgdXNlIiBvcmRlcmluZworc3RydWN0IENvbXBsZXRpb25PcHRpb25zOworc3RydWN0IE5vdGFibGVGbGFnczsKKworLy8gVGhlIGVudHJ5IHBvaW50IGlmIGZsYWcgY29tcGxldGlvbiBpcyB0byBiZSB1c2VkLgorc3RhdGljIHZvaWQgUHJpbnRGbGFnQ29tcGxldGlvbkluZm8odm9pZCk7CisKKworLy8gMSkgRXhhbWluZSBzZWFyY2ggd29yZAorc3RhdGljIHZvaWQgQ2Fub25pY2FsaXplQ3Vyc29yV29yZEFuZFNlYXJjaE9wdGlvbnMoCisgICAgY29uc3Qgc3RyaW5nICZjdXJzb3Jfd29yZCwKKyAgICBzdHJpbmcgKmNhbm9uaWNhbF9zZWFyY2hfdG9rZW4sCisgICAgQ29tcGxldGlvbk9wdGlvbnMgKm9wdGlvbnMpOworCitzdGF0aWMgYm9vbCBSZW1vdmVUcmFpbGluZ0NoYXIoc3RyaW5nICpzdHIsIGNoYXIgYyk7CisKKworLy8gMikgRmluZCBhbGwgbWF0Y2hlcworc3RhdGljIHZvaWQgRmluZE1hdGNoaW5nRmxhZ3MoCisgICAgY29uc3QgdmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+ICZhbGxfZmxhZ3MsCisgICAgY29uc3QgQ29tcGxldGlvbk9wdGlvbnMgJm9wdGlvbnMsCisgICAgY29uc3Qgc3RyaW5nICZtYXRjaF90b2tlbiwKKyAgICBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAqYWxsX21hdGNoZXMsCisgICAgc3RyaW5nICpsb25nZXN0X2NvbW1vbl9wcmVmaXgpOworCitzdGF0aWMgYm9vbCBEb2VzU2luZ2xlRmxhZ01hdGNoKAorICAgIGNvbnN0IENvbW1hbmRMaW5lRmxhZ0luZm8gJmZsYWcsCisgICAgY29uc3QgQ29tcGxldGlvbk9wdGlvbnMgJm9wdGlvbnMsCisgICAgY29uc3Qgc3RyaW5nICZtYXRjaF90b2tlbik7CisKKworLy8gMykgQ2F0ZWdvcml6ZSBtYXRjaGVzCitzdGF0aWMgdm9pZCBDYXRlZ29yaXplQWxsTWF0Y2hpbmdGbGFncygKKyAgICBjb25zdCBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAmYWxsX21hdGNoZXMsCisgICAgY29uc3Qgc3RyaW5nICZzZWFyY2hfdG9rZW4sCisgICAgY29uc3Qgc3RyaW5nICZtb2R1bGUsCisgICAgY29uc3Qgc3RyaW5nICZwYWNrYWdlX2RpciwKKyAgICBOb3RhYmxlRmxhZ3MgKm5vdGFibGVfZmxhZ3MpOworCitzdGF0aWMgdm9pZCBUcnlGaW5kTW9kdWxlQW5kUGFja2FnZURpcigKKyAgICBjb25zdCB2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz4gYWxsX2ZsYWdzLAorICAgIHN0cmluZyAqbW9kdWxlLAorICAgIHN0cmluZyAqcGFja2FnZV9kaXIpOworCisKKy8vIDQpIERlY2lkZSB3aGljaCBmbGFncyB0byB1c2UKK3N0YXRpYyB2b2lkIEZpbmFsaXplQ29tcGxldGlvbk91dHB1dCgKKyAgICBjb25zdCBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAmbWF0Y2hpbmdfZmxhZ3MsCisgICAgQ29tcGxldGlvbk9wdGlvbnMgKm9wdGlvbnMsCisgICAgTm90YWJsZUZsYWdzICpub3RhYmxlX2ZsYWdzLAorICAgIHZlY3RvcjxzdHJpbmc+ICpjb21wbGV0aW9ucyk7CisKK3N0YXRpYyB2b2lkIFJldHJpZXZlVW51c2VkRmxhZ3MoCisgICAgY29uc3Qgc2V0PGNvbnN0IENvbW1hbmRMaW5lRmxhZ0luZm8gKj4gJm1hdGNoaW5nX2ZsYWdzLAorICAgIGNvbnN0IE5vdGFibGVGbGFncyAmbm90YWJsZV9mbGFncywKKyAgICBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAqdW51c2VkX2ZsYWdzKTsKKworCisvLyA1KSBPdXRwdXQgbWF0Y2hlcworc3RhdGljIHZvaWQgT3V0cHV0U2luZ2xlR3JvdXBXaXRoTGltaXQoCisgICAgY29uc3Qgc2V0PGNvbnN0IENvbW1hbmRMaW5lRmxhZ0luZm8gKj4gJmdyb3VwLAorICAgIGNvbnN0IHN0cmluZyAmbGluZV9pbmRlbnRhdGlvbiwKKyAgICBjb25zdCBzdHJpbmcgJmhlYWRlciwKKyAgICBjb25zdCBzdHJpbmcgJmZvb3RlciwKKyAgICBib29sIGxvbmdfb3V0cHV0X2Zvcm1hdCwKKyAgICBpbnQgKnJlbWFpbmluZ19saW5lX2xpbWl0LAorICAgIHNpemVfdCAqY29tcGxldGlvbl9lbGVtZW50c19hZGRlZCwKKyAgICB2ZWN0b3I8c3RyaW5nPiAqY29tcGxldGlvbnMpOworCisvLyAoaGVscGVycyBmb3IgIzUpCitzdGF0aWMgc3RyaW5nIEdldFNob3J0RmxhZ0xpbmUoCisgICAgY29uc3Qgc3RyaW5nICZsaW5lX2luZGVudGF0aW9uLAorICAgIGNvbnN0IENvbW1hbmRMaW5lRmxhZ0luZm8gJmluZm8pOworCitzdGF0aWMgc3RyaW5nIEdldExvbmdGbGFnTGluZSgKKyAgICBjb25zdCBzdHJpbmcgJmxpbmVfaW5kZW50YXRpb24sCisgICAgY29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAmaW5mbyk7CisKKworLy8KKy8vIFVzZWZ1bCB0eXBlcworCisvLyBUcnkgdG8gZGVkdWNlIHRoZSBpbnRlbnRpb25zIGJlaGluZCB0aGlzIGNvbXBsZXRpb24gYXR0ZW1wdC4gIFJldHVybiB0aGUKKy8vIGNhbm9uaWNhbCBzZWFyY2ggdGVybSBpbiAnY2Fub25pY2FsX3NlYXJjaF90b2tlbicuICBCaW5hcnkgc2VhcmNoIG9wdGlvbnMKKy8vIGFyZSByZXR1cm5lZCBpbiB0aGUgdmFyaW91cyBib29sZWFucywgd2hpY2ggc2hvdWxkIGFsbCBoYXZlIGludHVpdGl2ZQorLy8gc2VtYW50aWNzLCBwb3NzaWJseSBleGNlcHQ6CisvLyAgLSByZXR1cm5fYWxsX21hdGNoaW5nX2ZsYWdzOiBHZW5lcmFsbHksIHdlJ2xsIHRyaW0gdGhlIG51bWJlciBvZgorLy8gICAgcmV0dXJuZWQgY2FuZGlkYXRlcyB0byBzb21lIHNtYWxsIG51bWJlciwgc2hvd2luZyB0aG9zZSB0aGF0IGFyZQorLy8gICAgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIGZpcnN0LiAgSWYgdGhpcyBpcyBzZXQsIGhvd2V2ZXIsIHRoZSB1c2VyCisvLyAgICByZWFsbHkgZG9lcyB3YW50IHVzIHRvIHJldHVybiBldmVyeSBzaW5nbGUgZmxhZyBhcyBhbiBvcHRpb24uCisvLyAgLSBmb3JjZV9ub191cGRhdGU6IEFueSB0aW1lIHdlIG91dHB1dCBsaW5lcywgYWxsIG9mIHdoaWNoIHNoYXJlIGEKKy8vICAgIGNvbW1vbiBwcmVmaXgsIGJhc2ggd2lsbCAnaGVscGZ1bGx5JyBub3QgZXZlbiBib3RoZXIgdG8gc2hvdyB0aGUKKy8vICAgIG91dHB1dCwgaW5zdGVhZCBjaGFuZ2luZyB0aGUgY3VycmVudCB3b3JkIHRvIGJlIHRoYXQgY29tbW9uIHByZWZpeC4KKy8vICAgIElmIGl0J3MgY2xlYXIgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCB3ZSdsbCBzZXQgdGhpcyBib29sZWFuCitzdHJ1Y3QgQ29tcGxldGlvbk9wdGlvbnMgeworICBib29sIGZsYWdfbmFtZV9zdWJzdHJpbmdfc2VhcmNoOworICBib29sIGZsYWdfbG9jYXRpb25fc3Vic3RyaW5nX3NlYXJjaDsKKyAgYm9vbCBmbGFnX2Rlc2NyaXB0aW9uX3N1YnN0cmluZ19zZWFyY2g7CisgIGJvb2wgcmV0dXJuX2FsbF9tYXRjaGluZ19mbGFnczsKKyAgYm9vbCBmb3JjZV9ub191cGRhdGU7Cit9OworCisvLyBOb3RhYmxlIGZsYWdzIGFyZSBmbGFncyB0aGF0IGFyZSBzcGVjaWFsIG9yIHByZWZlcnJlZCBmb3Igc29tZQorLy8gcmVhc29uLiAgRm9yIGV4YW1wbGUsIGZsYWdzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGJpbmFyeSdzIG1vZHVsZQorLy8gYXJlIGV4cGVjdGVkIHRvIGJlIG11Y2ggbW9yZSByZWxldmVudCB0aGFuIGZsYWdzIGRlZmluZWQgaW4gc29tZQorLy8gb3RoZXIgcmFuZG9tIGxvY2F0aW9uLiAgVGhlc2Ugc2V0cyBhcmUgc3BlY2lmaWVkIHJvdWdobHkgaW4gcHJlY2VkZW5jZQorLy8gb3JkZXIuICBPbmNlIGEgZmxhZyBpcyBwbGFjZWQgaW4gb25lIG9mIHRoZXNlICdoaWdoZXInIHNldHMsIGl0IHdvbid0CisvLyBiZSBwbGFjZWQgaW4gYW55IG9mIHRoZSAnbG93ZXInIHNldHMuCitzdHJ1Y3QgTm90YWJsZUZsYWdzIHsKKyAgdHlwZWRlZiBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiBGbGFnU2V0OworICBGbGFnU2V0IHBlcmZlY3RfbWF0Y2hfZmxhZzsKKyAgRmxhZ1NldCBtb2R1bGVfZmxhZ3M7ICAgICAgIC8vIEZvdW5kIGluIG1vZHVsZSBmaWxlCisgIEZsYWdTZXQgcGFja2FnZV9mbGFnczsgICAgICAvLyBGb3VuZCBpbiBzYW1lIGRpcmVjdG9yeSBhcyBtb2R1bGUgZmlsZQorICBGbGFnU2V0IG1vc3RfY29tbW9uX2ZsYWdzOyAgLy8gT25lIG9mIHRoZSBYWFggbW9zdCBjb21tb25seSBzdXBwbGllZCBmbGFncworICBGbGFnU2V0IHN1YnBhY2thZ2VfZmxhZ3M7ICAgLy8gRm91bmQgaW4gc3ViZGlyZWN0b3JpZXMgb2YgcGFja2FnZQorfTsKKworCisvLworLy8gVGFiIGNvbXBsZXRpb24gaW1wbGVtZW50YXRpb24gLSBlbnRyeSBwb2ludAorc3RhdGljIHZvaWQgUHJpbnRGbGFnQ29tcGxldGlvbkluZm8odm9pZCkgeworICBzdHJpbmcgY3Vyc29yX3dvcmQgPSBGTEFHU190YWJfY29tcGxldGlvbl93b3JkOworICBzdHJpbmcgY2Fub25pY2FsX3Rva2VuOworICBDb21wbGV0aW9uT3B0aW9ucyBvcHRpb25zID0geyB9OworICBDYW5vbmljYWxpemVDdXJzb3JXb3JkQW5kU2VhcmNoT3B0aW9ucygKKyAgICAgIGN1cnNvcl93b3JkLAorICAgICAgJmNhbm9uaWNhbF90b2tlbiwKKyAgICAgICZvcHRpb25zKTsKKworICBEVkxPRygxKSA8PCAiSWRlbnRpZmllZCBjYW5vbmljYWxfdG9rZW46ICciIDw8IGNhbm9uaWNhbF90b2tlbiA8PCAiJyI7CisKKyAgdmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+IGFsbF9mbGFnczsKKyAgc2V0PGNvbnN0IENvbW1hbmRMaW5lRmxhZ0luZm8gKj4gbWF0Y2hpbmdfZmxhZ3M7CisgIEdldEFsbEZsYWdzKCZhbGxfZmxhZ3MpOworICBEVkxPRygyKSA8PCAiRm91bmQgIiA8PCBhbGxfZmxhZ3Muc2l6ZSgpIDw8ICIgZmxhZ3Mgb3ZlcmFsbCI7CisKKyAgc3RyaW5nIGxvbmdlc3RfY29tbW9uX3ByZWZpeDsKKyAgRmluZE1hdGNoaW5nRmxhZ3MoCisgICAgICBhbGxfZmxhZ3MsCisgICAgICBvcHRpb25zLAorICAgICAgY2Fub25pY2FsX3Rva2VuLAorICAgICAgJm1hdGNoaW5nX2ZsYWdzLAorICAgICAgJmxvbmdlc3RfY29tbW9uX3ByZWZpeCk7CisgIERWTE9HKDEpIDw8ICJJZGVudGlmaWVkICIgPDwgbWF0Y2hpbmdfZmxhZ3Muc2l6ZSgpIDw8ICIgbWF0Y2hpbmcgZmxhZ3MiOworICBEVkxPRygxKSA8PCAiSWRlbnRpZmllZCAiIDw8IGxvbmdlc3RfY29tbW9uX3ByZWZpeAorICAgICAgICAgIDw8ICIgYXMgbG9uZ2VzdCBjb21tb24gcHJlZml4LiI7CisgIGlmIChsb25nZXN0X2NvbW1vbl9wcmVmaXguc2l6ZSgpID4gY2Fub25pY2FsX3Rva2VuLnNpemUoKSkgeworICAgIC8vIFRoZXJlJ3MgYWN0dWFsbHkgYSBzaGFyZWQgY29tbW9uIHByZWZpeCB0byBhbGwgbWF0Y2hpbmcgZmxhZ3MsCisgICAgLy8gc28gbWF5IGFzIHdlbGwgb3V0cHV0IHRoYXQgYW5kIHF1aXQgcXVpY2tseS4KKyAgICBEVkxPRygxKSA8PCAiVGhlIGNvbW1vbiBwcmVmaXggJyIgPDwgbG9uZ2VzdF9jb21tb25fcHJlZml4CisgICAgICAgICAgICA8PCAiJyB3YXMgbG9uZ2VyIHRoYW4gdGhlIHRva2VuICciIDw8IGNhbm9uaWNhbF90b2tlbgorICAgICAgICAgICAgPDwgIicuICBSZXR1cm5pbmcganVzdCB0aGlzIHByZWZpeCBmb3IgY29tcGxldGlvbi4iOworICAgIGZwcmludGYoc3Rkb3V0LCAiLS0lcyIsIGxvbmdlc3RfY29tbW9uX3ByZWZpeC5jX3N0cigpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1hdGNoaW5nX2ZsYWdzLmVtcHR5KCkpIHsKKyAgICBWTE9HKDEpIDw8ICJUaGVyZSB3ZXJlIG5vIG1hdGNoaW5nIGZsYWdzLCByZXR1cm5pbmcgbm90aGluZy4iOworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBtb2R1bGU7CisgIHN0cmluZyBwYWNrYWdlX2RpcjsKKyAgVHJ5RmluZE1vZHVsZUFuZFBhY2thZ2VEaXIoYWxsX2ZsYWdzLCAmbW9kdWxlLCAmcGFja2FnZV9kaXIpOworICBEVkxPRygxKSA8PCAiSWRlbnRpZmllZCBtb2R1bGU6ICciIDw8IG1vZHVsZSA8PCAiJyI7CisgIERWTE9HKDEpIDw8ICJJZGVudGlmaWVkIHBhY2thZ2VfZGlyOiAnIiA8PCBwYWNrYWdlX2RpciA8PCAiJyI7CisKKyAgTm90YWJsZUZsYWdzIG5vdGFibGVfZmxhZ3M7CisgIENhdGVnb3JpemVBbGxNYXRjaGluZ0ZsYWdzKAorICAgICAgbWF0Y2hpbmdfZmxhZ3MsCisgICAgICBjYW5vbmljYWxfdG9rZW4sCisgICAgICBtb2R1bGUsCisgICAgICBwYWNrYWdlX2RpciwKKyAgICAgICZub3RhYmxlX2ZsYWdzKTsKKyAgRFZMT0coMikgPDwgIkNhdGVnb3JpemVkIG1hdGNoaW5nIGZsYWdzOiI7CisgIERWTE9HKDIpIDw8ICIgcGVyZmVjdF9tYXRjaDogIiA8PCBub3RhYmxlX2ZsYWdzLnBlcmZlY3RfbWF0Y2hfZmxhZy5zaXplKCk7CisgIERWTE9HKDIpIDw8ICIgbW9kdWxlOiAiIDw8IG5vdGFibGVfZmxhZ3MubW9kdWxlX2ZsYWdzLnNpemUoKTsKKyAgRFZMT0coMikgPDwgIiBwYWNrYWdlOiAiIDw8IG5vdGFibGVfZmxhZ3MucGFja2FnZV9mbGFncy5zaXplKCk7CisgIERWTE9HKDIpIDw8ICIgbW9zdCBjb21tb246ICIgPDwgbm90YWJsZV9mbGFncy5tb3N0X2NvbW1vbl9mbGFncy5zaXplKCk7CisgIERWTE9HKDIpIDw8ICIgc3VicGFja2FnZTogIiA8PCBub3RhYmxlX2ZsYWdzLnN1YnBhY2thZ2VfZmxhZ3Muc2l6ZSgpOworCisgIHZlY3RvcjxzdHJpbmc+IGNvbXBsZXRpb25zOworICBGaW5hbGl6ZUNvbXBsZXRpb25PdXRwdXQoCisgICAgICBtYXRjaGluZ19mbGFncywKKyAgICAgICZvcHRpb25zLAorICAgICAgJm5vdGFibGVfZmxhZ3MsCisgICAgICAmY29tcGxldGlvbnMpOworCisgIGlmIChvcHRpb25zLmZvcmNlX25vX3VwZGF0ZSkKKyAgICBjb21wbGV0aW9ucy5wdXNoX2JhY2soIn4iKTsKKworICBEVkxPRygxKSA8PCAiRmluYWxpemVkIHdpdGggIiA8PCBjb21wbGV0aW9ucy5zaXplKCkKKyAgICAgICAgICA8PCAiIGNob3NlbiBjb21wbGV0aW9ucyI7CisKKyAgZm9yICh2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb21wbGV0aW9ucy5iZWdpbigpOworICAgICAgaXQgIT0gY29tcGxldGlvbnMuZW5kKCk7CisgICAgICArK2l0KSB7CisgICAgRFZMT0coOSkgPDwgIiAgQ29tcGxldGlvbiBlbnRyeTogJyIgPDwgKml0IDw8ICInIjsKKyAgICBmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCBpdC0+Y19zdHIoKSk7CisgIH0KK30KKworCisvLyAxKSBFeGFtaW5lIHNlYXJjaCB3b3JkIChhbmQgaGVscGVyIG1ldGhvZCkKK3N0YXRpYyB2b2lkIENhbm9uaWNhbGl6ZUN1cnNvcldvcmRBbmRTZWFyY2hPcHRpb25zKAorICAgIGNvbnN0IHN0cmluZyAmY3Vyc29yX3dvcmQsCisgICAgc3RyaW5nICpjYW5vbmljYWxfc2VhcmNoX3Rva2VuLAorICAgIENvbXBsZXRpb25PcHRpb25zICpvcHRpb25zKSB7CisgICpjYW5vbmljYWxfc2VhcmNoX3Rva2VuID0gY3Vyc29yX3dvcmQ7CisgIGlmIChjYW5vbmljYWxfc2VhcmNoX3Rva2VuLT5lbXB0eSgpKSByZXR1cm47CisKKyAgLy8gR2V0IHJpZCBvZiBsZWFkaW5nIHF1b3RlcyBhbmQgZGFzaGVzIGluIHRoZSBzZWFyY2ggdGVybQorICBpZiAoKCpjYW5vbmljYWxfc2VhcmNoX3Rva2VuKVswXSA9PSAnIicpCisgICAgKmNhbm9uaWNhbF9zZWFyY2hfdG9rZW4gPSBjYW5vbmljYWxfc2VhcmNoX3Rva2VuLT5zdWJzdHIoMSk7CisgIHdoaWxlICgoKmNhbm9uaWNhbF9zZWFyY2hfdG9rZW4pWzBdID09ICctJykKKyAgICAqY2Fub25pY2FsX3NlYXJjaF90b2tlbiA9IGNhbm9uaWNhbF9zZWFyY2hfdG9rZW4tPnN1YnN0cigxKTsKKworICBvcHRpb25zLT5mbGFnX25hbWVfc3Vic3RyaW5nX3NlYXJjaCA9IGZhbHNlOworICBvcHRpb25zLT5mbGFnX2xvY2F0aW9uX3N1YnN0cmluZ19zZWFyY2ggPSBmYWxzZTsKKyAgb3B0aW9ucy0+ZmxhZ19kZXNjcmlwdGlvbl9zdWJzdHJpbmdfc2VhcmNoID0gZmFsc2U7CisgIG9wdGlvbnMtPnJldHVybl9hbGxfbWF0Y2hpbmdfZmxhZ3MgPSBmYWxzZTsKKyAgb3B0aW9ucy0+Zm9yY2Vfbm9fdXBkYXRlID0gZmFsc2U7CisKKyAgLy8gTG9vayBmb3IgYWxsIHNlYXJjaCBvcHRpb25zIHdlIGNhbiBkZWR1Y2Ugbm93LiAgRG8gdGhpcyBieSB3YWxraW5nCisgIC8vIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0ZXJtLCBsb29raW5nIGZvciB1cCB0byB0aHJlZSAnPycgYW5kIHVwIHRvCisgIC8vIG9uZSAnKycgYXMgc3VmZml4ZWQgY2hhcmFjdGVycy4gIENvbnN1bWUgdGhlbSBpZiBmb3VuZCwgYW5kIHJlbW92ZQorICAvLyB0aGVtIGZyb20gdGhlIGNhbm9uaWNhbCBzZWFyY2ggdG9rZW4uCisgIGludCBmb3VuZF9xdWVzdGlvbl9tYXJrcyA9IDA7CisgIGludCBmb3VuZF9wbHVzc2VzID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoZm91bmRfcXVlc3Rpb25fbWFya3MgPCAzICYmCisgICAgICAgIFJlbW92ZVRyYWlsaW5nQ2hhcihjYW5vbmljYWxfc2VhcmNoX3Rva2VuLCAnPycpKSB7CisgICAgICArK2ZvdW5kX3F1ZXN0aW9uX21hcmtzOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChmb3VuZF9wbHVzc2VzIDwgMSAmJgorICAgICAgICBSZW1vdmVUcmFpbGluZ0NoYXIoY2Fub25pY2FsX3NlYXJjaF90b2tlbiwgJysnKSkgeworICAgICAgKytmb3VuZF9wbHVzc2VzOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChmb3VuZF9xdWVzdGlvbl9tYXJrcykgeyAgLy8gYWxsIGZhbGx0aHJvdWdocworICAgIGNhc2UgMzogb3B0aW9ucy0+ZmxhZ19kZXNjcmlwdGlvbl9zdWJzdHJpbmdfc2VhcmNoID0gdHJ1ZTsKKyAgICBjYXNlIDI6IG9wdGlvbnMtPmZsYWdfbG9jYXRpb25fc3Vic3RyaW5nX3NlYXJjaCA9IHRydWU7CisgICAgY2FzZSAxOiBvcHRpb25zLT5mbGFnX25hbWVfc3Vic3RyaW5nX3NlYXJjaCA9IHRydWU7CisgIH07CisKKyAgb3B0aW9ucy0+cmV0dXJuX2FsbF9tYXRjaGluZ19mbGFncyA9IChmb3VuZF9wbHVzc2VzID4gMCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBhIGNoYXIgd2FzIHJlbW92ZWQKK3N0YXRpYyBib29sIFJlbW92ZVRyYWlsaW5nQ2hhcihzdHJpbmcgKnN0ciwgY2hhciBjKSB7CisgIGlmIChzdHItPmVtcHR5KCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKCgqc3RyKVtzdHItPnNpemUoKSAtIDFdID09IGMpIHsKKyAgICAqc3RyID0gc3RyLT5zdWJzdHIoMCwgc3RyLT5zaXplKCkgLSAxKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKworLy8gMikgRmluZCBhbGwgbWF0Y2hlcyAoYW5kIGhlbHBlciBtZXRob2RzKQorc3RhdGljIHZvaWQgRmluZE1hdGNoaW5nRmxhZ3MoCisgICAgY29uc3QgdmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+ICZhbGxfZmxhZ3MsCisgICAgY29uc3QgQ29tcGxldGlvbk9wdGlvbnMgJm9wdGlvbnMsCisgICAgY29uc3Qgc3RyaW5nICZtYXRjaF90b2tlbiwKKyAgICBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAqYWxsX21hdGNoZXMsCisgICAgc3RyaW5nICpsb25nZXN0X2NvbW1vbl9wcmVmaXgpIHsKKyAgYWxsX21hdGNoZXMtPmNsZWFyKCk7CisgIGJvb2wgZmlyc3RfbWF0Y2ggPSB0cnVlOworICBmb3IgKHZlY3RvcjxDb21tYW5kTGluZUZsYWdJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhbGxfZmxhZ3MuYmVnaW4oKTsKKyAgICAgIGl0ICE9IGFsbF9mbGFncy5lbmQoKTsKKyAgICAgICsraXQpIHsKKyAgICBpZiAoRG9lc1NpbmdsZUZsYWdNYXRjaCgqaXQsIG9wdGlvbnMsIG1hdGNoX3Rva2VuKSkgeworICAgICAgYWxsX21hdGNoZXMtPmluc2VydCgmKml0KTsKKyAgICAgIGlmIChmaXJzdF9tYXRjaCkgeworICAgICAgICBmaXJzdF9tYXRjaCA9IGZhbHNlOworICAgICAgICAqbG9uZ2VzdF9jb21tb25fcHJlZml4ID0gaXQtPm5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobG9uZ2VzdF9jb21tb25fcHJlZml4LT5lbXB0eSgpIHx8IGl0LT5uYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgICBsb25nZXN0X2NvbW1vbl9wcmVmaXgtPmNsZWFyKCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGxvbmdlc3RfY29tbW9uX3ByZWZpeC0+c2l6ZSgpICYmCisgICAgICAgICAgICBwb3MgPCBpdC0+bmFtZS5zaXplKCkgJiYKKyAgICAgICAgICAgICgqbG9uZ2VzdF9jb21tb25fcHJlZml4KVtwb3NdID09IGl0LT5uYW1lW3Bvc10pCisgICAgICAgICAgKytwb3M7CisgICAgICAgIGxvbmdlc3RfY29tbW9uX3ByZWZpeC0+ZXJhc2UocG9zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gR2l2ZW4gdGhlIHNldCBvZiBhbGwgZmxhZ3MsIHRoZSBwYXJzZWQgbWF0Y2ggb3B0aW9ucywgYW5kIHRoZQorLy8gY2Fub25pY2FsIHNlYXJjaCB0b2tlbiwgcHJvZHVjZSB0aGUgc2V0IG9mIGFsbCBjYW5kaWRhdGUgbWF0Y2hpbmcKKy8vIGZsYWdzIGZvciBzdWJzZXF1ZW50IGFuYWx5c2lzIG9yIGZpbHRlcmluZy4KK3N0YXRpYyBib29sIERvZXNTaW5nbGVGbGFnTWF0Y2goCisgICAgY29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAmZmxhZywKKyAgICBjb25zdCBDb21wbGV0aW9uT3B0aW9ucyAmb3B0aW9ucywKKyAgICBjb25zdCBzdHJpbmcgJm1hdGNoX3Rva2VuKSB7CisgIC8vIElzIHRoZXJlIGEgcHJlZml4IG1hdGNoPworICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBmbGFnLm5hbWUuZmluZChtYXRjaF90b2tlbik7CisgIGlmIChwb3MgPT0gMCkgcmV0dXJuIHRydWU7CisKKyAgLy8gSXMgdGhlcmUgYSBzdWJzdHJpbmcgbWF0Y2ggaWYgd2Ugd2FudCBpdD8KKyAgaWYgKG9wdGlvbnMuZmxhZ19uYW1lX3N1YnN0cmluZ19zZWFyY2ggJiYKKyAgICAgIHBvcyAhPSBzdHJpbmc6Om5wb3MpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gSXMgdGhlcmUgYSBsb2NhdGlvbiBtYXRjaCBpZiB3ZSB3YW50IGl0PworICBpZiAob3B0aW9ucy5mbGFnX2xvY2F0aW9uX3N1YnN0cmluZ19zZWFyY2ggJiYKKyAgICAgIGZsYWcuZmlsZW5hbWUuZmluZChtYXRjaF90b2tlbikgIT0gc3RyaW5nOjpucG9zKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFRPRE8odXNlcik6IEFsbCBzZWFyY2hlcyBzaG91bGQgcHJvYmFibHkgYmUgY2FzZS1pbnNlbnNpdGl2ZQorICAvLyAoZXNwZWNpYWxseSB0aGlzIG9uZS4uLikKKyAgaWYgKG9wdGlvbnMuZmxhZ19kZXNjcmlwdGlvbl9zdWJzdHJpbmdfc2VhcmNoICYmCisgICAgICBmbGFnLmRlc2NyaXB0aW9uLmZpbmQobWF0Y2hfdG9rZW4pICE9IHN0cmluZzo6bnBvcykKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIDMpIENhdGVnb3JpemUgbWF0Y2hlcyAoYW5kIGhlbHBlciBtZXRob2QpCisKKy8vIEdpdmVuIGEgc2V0IG9mIG1hdGNoaW5nIGZsYWdzLCBjYXRlZ29yaXplIHRoZW0gYnkKKy8vIGxpa2VseSByZWxldmVuY2UgdG8gdGhpcyBzcGVjaWZpYyBiaW5hcnkKK3N0YXRpYyB2b2lkIENhdGVnb3JpemVBbGxNYXRjaGluZ0ZsYWdzKAorICAgIGNvbnN0IHNldDxjb25zdCBDb21tYW5kTGluZUZsYWdJbmZvICo+ICZhbGxfbWF0Y2hlcywKKyAgICBjb25zdCBzdHJpbmcgJnNlYXJjaF90b2tlbiwKKyAgICBjb25zdCBzdHJpbmcgJm1vZHVsZSwgIC8vIGVtcHR5IGlmIHdlIGNvdWxkbid0IGZpbmQgYW55CisgICAgY29uc3Qgc3RyaW5nICZwYWNrYWdlX2RpciwgIC8vIGVtcHR5IGlmIHdlIGNvdWxkbid0IGZpbmQgYW55CisgICAgTm90YWJsZUZsYWdzICpub3RhYmxlX2ZsYWdzKSB7CisgIG5vdGFibGVfZmxhZ3MtPnBlcmZlY3RfbWF0Y2hfZmxhZy5jbGVhcigpOworICBub3RhYmxlX2ZsYWdzLT5tb2R1bGVfZmxhZ3MuY2xlYXIoKTsKKyAgbm90YWJsZV9mbGFncy0+cGFja2FnZV9mbGFncy5jbGVhcigpOworICBub3RhYmxlX2ZsYWdzLT5tb3N0X2NvbW1vbl9mbGFncy5jbGVhcigpOworICBub3RhYmxlX2ZsYWdzLT5zdWJwYWNrYWdlX2ZsYWdzLmNsZWFyKCk7CisKKyAgZm9yIChzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICBhbGxfbWF0Y2hlcy5iZWdpbigpOworICAgICAgaXQgIT0gYWxsX21hdGNoZXMuZW5kKCk7CisgICAgICArK2l0KSB7CisgICAgRFZMT0coMikgPDwgIkV4YW1pbmluZyBtYXRjaCAnIiA8PCAoKml0KS0+bmFtZSA8PCAiJyI7CisgICAgRFZMT0coNykgPDwgIiAgZmlsZW5hbWU6ICciIDw8ICgqaXQpLT5maWxlbmFtZSA8PCAiJyI7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gc3RyaW5nOjpucG9zOworICAgIGlmICghcGFja2FnZV9kaXIuZW1wdHkoKSkKKyAgICAgIHBvcyA9ICgqaXQpLT5maWxlbmFtZS5maW5kKHBhY2thZ2VfZGlyKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IHN0cmluZzo6bnBvczsKKyAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgIC8vIGNhbmRpZGF0ZSBmb3IgcGFja2FnZSBvciBzdWJwYWNrYWdlIG1hdGNoCisgICAgICBzbGFzaCA9ICgqaXQpLT5maWxlbmFtZS5maW5kKAorICAgICAgICAgIFBBVEhfU0VQQVJBVE9SLAorICAgICAgICAgIHBvcyArIHBhY2thZ2VfZGlyLnNpemUoKSArIDEpOworCisgICAgaWYgKCgqaXQpLT5uYW1lID09IHNlYXJjaF90b2tlbikgeworICAgICAgLy8gRXhhY3QgbWF0Y2ggb24gc29tZSBmbGFnJ3MgbmFtZQorICAgICAgbm90YWJsZV9mbGFncy0+cGVyZmVjdF9tYXRjaF9mbGFnLmluc2VydCgqaXQpOworICAgICAgRFZMT0coMykgPDwgIlJlc3VsdDogcGVyZmVjdCBtYXRjaCI7CisgICAgfSBlbHNlIGlmICghbW9kdWxlLmVtcHR5KCkgJiYgKCppdCktPmZpbGVuYW1lID09IG1vZHVsZSkgeworICAgICAgLy8gRXhhY3QgbWF0Y2ggb24gbW9kdWxlIGZpbGVuYW1lCisgICAgICBub3RhYmxlX2ZsYWdzLT5tb2R1bGVfZmxhZ3MuaW5zZXJ0KCppdCk7CisgICAgICBEVkxPRygzKSA8PCAiUmVzdWx0OiBtb2R1bGUgbWF0Y2giOworICAgIH0gZWxzZSBpZiAoIXBhY2thZ2VfZGlyLmVtcHR5KCkgJiYKKyAgICAgICAgcG9zICE9IHN0cmluZzo6bnBvcyAmJiBzbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIC8vIEluIHRoZSBwYWNrYWdlLCBzaW5jZSB0aGVyZSB3YXMgbm8gc2xhc2ggYWZ0ZXIgdGhlIHBhY2thZ2UgcG9ydGlvbgorICAgICAgbm90YWJsZV9mbGFncy0+cGFja2FnZV9mbGFncy5pbnNlcnQoKml0KTsKKyAgICAgIERWTE9HKDMpIDw8ICJSZXN1bHQ6IHBhY2thZ2UgbWF0Y2giOworICAgIH0gZWxzZSBpZiAoZmFsc2UpIHsKKyAgICAgIC8vIEluIHRoZSBsaXN0IG9mIHRoZSBYWFggbW9zdCBjb21tb25seSBzdXBwbGllZCBmbGFncyBvdmVyYWxsCisgICAgICAvLyBUT0RPKHVzZXIpOiBDb21waWxlIHRoaXMgbGlzdC4KKyAgICAgIERWTE9HKDMpIDw8ICJSZXN1bHQ6IG1vc3QtY29tbW9uIG1hdGNoIjsKKyAgICB9IGVsc2UgaWYgKCFwYWNrYWdlX2Rpci5lbXB0eSgpICYmCisgICAgICAgIHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgc2xhc2ggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBJbiBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcGFja2FnZQorICAgICAgbm90YWJsZV9mbGFncy0+c3VicGFja2FnZV9mbGFncy5pbnNlcnQoKml0KTsKKyAgICAgIERWTE9HKDMpIDw8ICJSZXN1bHQ6IHN1YnBhY2thZ2UgbWF0Y2giOworICAgIH0KKworICAgIERWTE9HKDMpIDw8ICJSZXN1bHQ6IG5vdCBzcGVjaWFsIG1hdGNoIjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBQdXNoTmFtZVdpdGhTdWZmaXgodmVjdG9yPHN0cmluZz4qIHN1ZmZpeGVzLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgc3VmZml4ZXMtPnB1c2hfYmFjaygKKyAgICAgIFN0cmluZ1ByaW50ZigiLyVzJXMiLCBQcm9ncmFtSW52b2NhdGlvblNob3J0TmFtZSgpLCBzdWZmaXgpKTsKK30KKworc3RhdGljIHZvaWQgVHJ5RmluZE1vZHVsZUFuZFBhY2thZ2VEaXIoCisgICAgY29uc3QgdmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+IGFsbF9mbGFncywKKyAgICBzdHJpbmcgKm1vZHVsZSwKKyAgICBzdHJpbmcgKnBhY2thZ2VfZGlyKSB7CisgIG1vZHVsZS0+Y2xlYXIoKTsKKyAgcGFja2FnZV9kaXItPmNsZWFyKCk7CisKKyAgdmVjdG9yPHN0cmluZz4gc3VmZml4ZXM7CisgIC8vIFRPRE8odXNlcik6IFRoZXJlJ3Mgc29tZSBpbmhlcmFudCBhbWJpZ3VpdHkgaGVyZSAtIG11bHRpcGxlIGRpcmVjdG9yaWVzCisgIC8vIGNvdWxkIHNoYXJlIHRoZSBzYW1lIHRyYWlsaW5nIGZvbGRlciBhbmQgZmlsZSBzdHJ1Y3R1cmUgKGFuZCBldmVuIHdvcnNlLAorICAvLyBzYW1lIGZpbGUgbmFtZXMpLCBjYXVzaW5nIHVzIHRvIGJlIHVuc3VyZSBhcyB0byB3aGljaCBvZiB0aGUgdHdvIGlzIHRoZQorICAvLyBhY3R1YWwgcGFja2FnZSBmb3IgdGhpcyBiaW5hcnkuICBJbiB0aGlzIGNhc2UsIHdlJ2xsIGFyYml0cmFyaWx5IGNob29zZS4KKyAgUHVzaE5hbWVXaXRoU3VmZml4KCZzdWZmaXhlcywgIi4iKTsKKyAgUHVzaE5hbWVXaXRoU3VmZml4KCZzdWZmaXhlcywgIi1tYWluLiIpOworICBQdXNoTmFtZVdpdGhTdWZmaXgoJnN1ZmZpeGVzLCAiX21haW4uIik7CisgIC8vIFRoZXNlIGZvdXIgYXJlIG5ldyBidXQgcHJvYmFibHkgbWVyaXRlZD8KKyAgUHVzaE5hbWVXaXRoU3VmZml4KCZzdWZmaXhlcywgIi10ZXN0LiIpOworICBQdXNoTmFtZVdpdGhTdWZmaXgoJnN1ZmZpeGVzLCAiX3Rlc3QuIik7CisgIFB1c2hOYW1lV2l0aFN1ZmZpeCgmc3VmZml4ZXMsICItdW5pdHRlc3QuIik7CisgIFB1c2hOYW1lV2l0aFN1ZmZpeCgmc3VmZml4ZXMsICJfdW5pdHRlc3QuIik7CisKKyAgZm9yICh2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYWxsX2ZsYWdzLmJlZ2luKCk7CisgICAgICBpdCAhPSBhbGxfZmxhZ3MuZW5kKCk7CisgICAgICArK2l0KSB7CisgICAgZm9yICh2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc3VmZml4ID0gc3VmZml4ZXMuYmVnaW4oKTsKKyAgICAgICAgc3VmZml4ICE9IHN1ZmZpeGVzLmVuZCgpOworICAgICAgICArK3N1ZmZpeCkgeworICAgICAgLy8gVE9ETyh1c2VyKTogTWFrZSBzdXJlIHRoZSBtYXRjaCBpcyBuZWFyIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgaWYgKGl0LT5maWxlbmFtZS5maW5kKCpzdWZmaXgpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICAqbW9kdWxlID0gaXQtPmZpbGVuYW1lOworICAgICAgICBzdHJpbmc6OnNpemVfdHlwZSBzZXAgPSBpdC0+ZmlsZW5hbWUucmZpbmQoUEFUSF9TRVBBUkFUT1IpOworICAgICAgICAqcGFja2FnZV9kaXIgPSBpdC0+ZmlsZW5hbWUuc3Vic3RyKDAsIChzZXAgPT0gc3RyaW5nOjpucG9zKSA/IDAgOiBzZXApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIENhbid0IHNwZWNpYWxpemUgdGVtcGxhdGUgdHlwZSBvbiBhIGxvY2FsbHkgZGVmaW5lZCB0eXBlLiAgU2lsbHkgQysrLi4uCitzdHJ1Y3QgRGlzcGxheUluZm9Hcm91cCB7CisgIGNvbnN0IGNoYXIqIGhlYWRlcjsKKyAgY29uc3QgY2hhciogZm9vdGVyOworICBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAqZ3JvdXA7CisKKyAgaW50IFNpemVJbkxpbmVzKCkgY29uc3QgeworICAgIGludCBzaXplX2luX2xpbmVzID0gc3RhdGljX2Nhc3Q8aW50Pihncm91cC0+c2l6ZSgpKSArIDE7CisgICAgaWYgKHN0cmxlbihoZWFkZXIpID4gMCkgeworICAgICAgc2l6ZV9pbl9saW5lcysrOworICAgIH0KKyAgICBpZiAoc3RybGVuKGZvb3RlcikgPiAwKSB7CisgICAgICBzaXplX2luX2xpbmVzKys7CisgICAgfQorICAgIHJldHVybiBzaXplX2luX2xpbmVzOworICB9Cit9OworCisvLyA0KSBGaW5hbGl6ZSBhbmQgdHJpbSBvdXRwdXQgZmxhZyBzZXQKK3N0YXRpYyB2b2lkIEZpbmFsaXplQ29tcGxldGlvbk91dHB1dCgKKyAgICBjb25zdCBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAmbWF0Y2hpbmdfZmxhZ3MsCisgICAgQ29tcGxldGlvbk9wdGlvbnMgKm9wdGlvbnMsCisgICAgTm90YWJsZUZsYWdzICpub3RhYmxlX2ZsYWdzLAorICAgIHZlY3RvcjxzdHJpbmc+ICpjb21wbGV0aW9ucykgeworCisgIC8vIFdlIHdhbnQgdG8gb3V0cHV0IGxpbmVzIGluIGdyb3Vwcy4gIEVhY2ggZ3JvdXAgbmVlZHMgdG8gYmUgaW5kZW50ZWQKKyAgLy8gdGhlIHNhbWUgdG8ga2VlcCBpdHMgbGluZXMgdG9nZXRoZXIuICBVbmxlc3Mgb3RoZXJ3aXNlIHJlcXVpcmVkLAorICAvLyBvbmx5IDk5IGxpbmVzIHNob3VsZCBiZSBvdXRwdXQgdG8gcHJldmVudCBiYXNoIGZyb20gaGFyYXNzaW5nIHRoZQorICAvLyB1c2VyLgorCisgIC8vIEZpcnN0LCBmaWd1cmUgb3V0IHdoaWNoIG91dHB1dCBncm91cHMgd2UnbGwgYWN0dWFsbHkgdXNlLiAgRm9yIGVhY2gKKyAgLy8gbm9uZW1wdHkgZ3JvdXAsIHRoZXJlIHdpbGwgYmUgfjMgbGluZXMgb2YgaGVhZGVyICYgZm9vdGVyLCBwbHVzIGFsbAorICAvLyBvdXRwdXQgbGluZXMgdGhlbXNlbHZlcy4KKyAgaW50IG1heF9kZXNpcmVkX2xpbmVzID0gIC8vICI5OTk5OTkgZmxhZ3Mgc2hvdWxkIGJlIGVub3VnaCBmb3IgYW55b25lLiAgLWRhdmUiCisgICAgKG9wdGlvbnMtPnJldHVybl9hbGxfbWF0Y2hpbmdfZmxhZ3MgPyA5OTk5OTkgOiA5OCk7CisgIGludCBsaW5lc19zb19mYXIgPSAwOworCisgIHZlY3RvcjxEaXNwbGF5SW5mb0dyb3VwPiBvdXRwdXRfZ3JvdXBzOworICBib29sIHBlcmZlY3RfbWF0Y2hfZm91bmQgPSBmYWxzZTsKKyAgaWYgKGxpbmVzX3NvX2ZhciA8IG1heF9kZXNpcmVkX2xpbmVzICYmCisgICAgICAhbm90YWJsZV9mbGFncy0+cGVyZmVjdF9tYXRjaF9mbGFnLmVtcHR5KCkpIHsKKyAgICBwZXJmZWN0X21hdGNoX2ZvdW5kID0gdHJ1ZTsKKyAgICBEaXNwbGF5SW5mb0dyb3VwIGdyb3VwID0KKyAgICAgICAgeyAiIiwKKyAgICAgICAgICAiPT09PT09PT09PSIsCisgICAgICAgICAgJm5vdGFibGVfZmxhZ3MtPnBlcmZlY3RfbWF0Y2hfZmxhZyB9OworICAgIGxpbmVzX3NvX2ZhciArPSBncm91cC5TaXplSW5MaW5lcygpOworICAgIG91dHB1dF9ncm91cHMucHVzaF9iYWNrKGdyb3VwKTsKKyAgfQorICBpZiAobGluZXNfc29fZmFyIDwgbWF4X2Rlc2lyZWRfbGluZXMgJiYKKyAgICAgICFub3RhYmxlX2ZsYWdzLT5tb2R1bGVfZmxhZ3MuZW1wdHkoKSkgeworICAgIERpc3BsYXlJbmZvR3JvdXAgZ3JvdXAgPSB7CisgICAgICAgICItKiBNYXRjaGluZyBtb2R1bGUgZmxhZ3MgKi0iLAorICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09IiwKKyAgICAgICAgJm5vdGFibGVfZmxhZ3MtPm1vZHVsZV9mbGFncyB9OworICAgIGxpbmVzX3NvX2ZhciArPSBncm91cC5TaXplSW5MaW5lcygpOworICAgIG91dHB1dF9ncm91cHMucHVzaF9iYWNrKGdyb3VwKTsKKyAgfQorICBpZiAobGluZXNfc29fZmFyIDwgbWF4X2Rlc2lyZWRfbGluZXMgJiYKKyAgICAgICFub3RhYmxlX2ZsYWdzLT5wYWNrYWdlX2ZsYWdzLmVtcHR5KCkpIHsKKyAgICBEaXNwbGF5SW5mb0dyb3VwIGdyb3VwID0geworICAgICAgICAiLSogTWF0Y2hpbmcgcGFja2FnZSBmbGFncyAqLSIsCisgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09IiwKKyAgICAgICAgJm5vdGFibGVfZmxhZ3MtPnBhY2thZ2VfZmxhZ3MgfTsKKyAgICBsaW5lc19zb19mYXIgKz0gZ3JvdXAuU2l6ZUluTGluZXMoKTsKKyAgICBvdXRwdXRfZ3JvdXBzLnB1c2hfYmFjayhncm91cCk7CisgIH0KKyAgaWYgKGxpbmVzX3NvX2ZhciA8IG1heF9kZXNpcmVkX2xpbmVzICYmCisgICAgICAhbm90YWJsZV9mbGFncy0+bW9zdF9jb21tb25fZmxhZ3MuZW1wdHkoKSkgeworICAgIERpc3BsYXlJbmZvR3JvdXAgZ3JvdXAgPSB7CisgICAgICAgICItKiBDb21tb25seSB1c2VkIGZsYWdzICotIiwKKyAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT0iLAorICAgICAgICAmbm90YWJsZV9mbGFncy0+bW9zdF9jb21tb25fZmxhZ3MgfTsKKyAgICBsaW5lc19zb19mYXIgKz0gZ3JvdXAuU2l6ZUluTGluZXMoKTsKKyAgICBvdXRwdXRfZ3JvdXBzLnB1c2hfYmFjayhncm91cCk7CisgIH0KKyAgaWYgKGxpbmVzX3NvX2ZhciA8IG1heF9kZXNpcmVkX2xpbmVzICYmCisgICAgICAhbm90YWJsZV9mbGFncy0+c3VicGFja2FnZV9mbGFncy5lbXB0eSgpKSB7CisgICAgRGlzcGxheUluZm9Hcm91cCBncm91cCA9IHsKKyAgICAgICAgIi0qIE1hdGNoaW5nIHN1Yi1wYWNrYWdlIGZsYWdzICotIiwKKyAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiwKKyAgICAgICAgJm5vdGFibGVfZmxhZ3MtPnN1YnBhY2thZ2VfZmxhZ3MgfTsKKyAgICBsaW5lc19zb19mYXIgKz0gZ3JvdXAuU2l6ZUluTGluZXMoKTsKKyAgICBvdXRwdXRfZ3JvdXBzLnB1c2hfYmFjayhncm91cCk7CisgIH0KKworICBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiBvYnNjdXJlX2ZsYWdzOyAgLy8gZmxhZ3Mgbm90IG5vdGFibGUKKyAgaWYgKGxpbmVzX3NvX2ZhciA8IG1heF9kZXNpcmVkX2xpbmVzKSB7CisgICAgUmV0cmlldmVVbnVzZWRGbGFncyhtYXRjaGluZ19mbGFncywgKm5vdGFibGVfZmxhZ3MsICZvYnNjdXJlX2ZsYWdzKTsKKyAgICBpZiAoIW9ic2N1cmVfZmxhZ3MuZW1wdHkoKSkgeworICAgICAgRGlzcGxheUluZm9Hcm91cCBncm91cCA9IHsKKyAgICAgICAgICAiLSogT3RoZXIgZmxhZ3MgKi0iLAorICAgICAgICAgICIiLAorICAgICAgICAgICZvYnNjdXJlX2ZsYWdzIH07CisgICAgICBsaW5lc19zb19mYXIgKz0gZ3JvdXAuU2l6ZUluTGluZXMoKTsKKyAgICAgIG91dHB1dF9ncm91cHMucHVzaF9iYWNrKGdyb3VwKTsKKyAgICB9CisgIH0KKworICAvLyBTZWNvbmQsIGdvIHRocm91Z2ggZWFjaCBvZiB0aGUgY2hvc2VuIG91dHB1dCBncm91cHMgYW5kIG91dHB1dAorICAvLyBhcyBtYW55IG9mIHRob3NlIGZsYWdzIGFzIHdlIGNhbiwgd2hpbGUgcmVtYWluaW5nIGJlbG93IG91ciBsaW1pdAorICBpbnQgcmVtYWluaW5nX2xpbmVzID0gbWF4X2Rlc2lyZWRfbGluZXM7CisgIHNpemVfdCBjb21wbGV0aW9uc19vdXRwdXQgPSAwOworICBpbnQgaW5kZW50ID0gc3RhdGljX2Nhc3Q8aW50PihvdXRwdXRfZ3JvdXBzLnNpemUoKSkgLSAxOworICBmb3IgKHZlY3RvcjxEaXNwbGF5SW5mb0dyb3VwPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICBvdXRwdXRfZ3JvdXBzLmJlZ2luKCk7CisgICAgICBpdCAhPSBvdXRwdXRfZ3JvdXBzLmVuZCgpOworICAgICAgKytpdCwgLS1pbmRlbnQpIHsKKyAgICBPdXRwdXRTaW5nbGVHcm91cFdpdGhMaW1pdCgKKyAgICAgICAgKml0LT5ncm91cCwgIC8vIGdyb3VwCisgICAgICAgIHN0cmluZyhpbmRlbnQsICcgJyksICAvLyBsaW5lIGluZGVudGF0aW9uCisgICAgICAgIHN0cmluZyhpdC0+aGVhZGVyKSwgIC8vIGhlYWRlcgorICAgICAgICBzdHJpbmcoaXQtPmZvb3RlciksICAvLyBmb290ZXIKKyAgICAgICAgcGVyZmVjdF9tYXRjaF9mb3VuZCwgIC8vIGxvbmcgZm9ybWF0CisgICAgICAgICZyZW1haW5pbmdfbGluZXMsICAvLyBsaW5lIGxpbWl0IC0gcmVkdWNlcyB0aGlzIGJ5IG51bWJlciBwcmludGVkCisgICAgICAgICZjb21wbGV0aW9uc19vdXRwdXQsICAvLyBjb21wbGV0aW9ucyAobm90IGxpbmVzKSBhZGRlZAorICAgICAgICBjb21wbGV0aW9ucyk7ICAvLyBwcm9kdWNlZCBjb21wbGV0aW9ucworICAgIHBlcmZlY3RfbWF0Y2hfZm91bmQgPSBmYWxzZTsKKyAgfQorCisgIGlmIChjb21wbGV0aW9uc19vdXRwdXQgIT0gbWF0Y2hpbmdfZmxhZ3Muc2l6ZSgpKSB7CisgICAgb3B0aW9ucy0+Zm9yY2Vfbm9fdXBkYXRlID0gZmFsc2U7CisgICAgY29tcGxldGlvbnMtPnB1c2hfYmFjaygifiAoUmVtYWluaW5nIGZsYWdzIGhpZGRlbikgfiIpOworICB9IGVsc2UgeworICAgIG9wdGlvbnMtPmZvcmNlX25vX3VwZGF0ZSA9IHRydWU7CisgIH0KK30KKworc3RhdGljIHZvaWQgUmV0cmlldmVVbnVzZWRGbGFncygKKyAgICBjb25zdCBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAmbWF0Y2hpbmdfZmxhZ3MsCisgICAgY29uc3QgTm90YWJsZUZsYWdzICZub3RhYmxlX2ZsYWdzLAorICAgIHNldDxjb25zdCBDb21tYW5kTGluZUZsYWdJbmZvICo+ICp1bnVzZWRfZmxhZ3MpIHsKKyAgLy8gUmVtb3ZlIGZyb20gJ21hdGNoaW5nX2ZsYWdzJyBzZXQgYWxsIG1lbWJlcnMgb2YgdGhlIHNldHMgb2YKKyAgLy8gZmxhZ3Mgd2UndmUgYWxyZWFkeSBwcmludGVkIChzcGVjaWZpY2FsbHksIHRob3NlIGluIG5vdGFibGVfZmxhZ3MpCisgIGZvciAoc2V0PGNvbnN0IENvbW1hbmRMaW5lRmxhZ0luZm8gKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgbWF0Y2hpbmdfZmxhZ3MuYmVnaW4oKTsKKyAgICAgIGl0ICE9IG1hdGNoaW5nX2ZsYWdzLmVuZCgpOworICAgICAgKytpdCkgeworICAgIGlmIChub3RhYmxlX2ZsYWdzLnBlcmZlY3RfbWF0Y2hfZmxhZy5jb3VudCgqaXQpIHx8CisgICAgICAgIG5vdGFibGVfZmxhZ3MubW9kdWxlX2ZsYWdzLmNvdW50KCppdCkgfHwKKyAgICAgICAgbm90YWJsZV9mbGFncy5wYWNrYWdlX2ZsYWdzLmNvdW50KCppdCkgfHwKKyAgICAgICAgbm90YWJsZV9mbGFncy5tb3N0X2NvbW1vbl9mbGFncy5jb3VudCgqaXQpIHx8CisgICAgICAgIG5vdGFibGVfZmxhZ3Muc3VicGFja2FnZV9mbGFncy5jb3VudCgqaXQpKQorICAgICAgY29udGludWU7CisgICAgdW51c2VkX2ZsYWdzLT5pbnNlcnQoKml0KTsKKyAgfQorfQorCisvLyA1KSBPdXRwdXQgbWF0Y2hlcyAoYW5kIGhlbHBlciBtZXRob2RzKQorCitzdGF0aWMgdm9pZCBPdXRwdXRTaW5nbGVHcm91cFdpdGhMaW1pdCgKKyAgICBjb25zdCBzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPiAmZ3JvdXAsCisgICAgY29uc3Qgc3RyaW5nICZsaW5lX2luZGVudGF0aW9uLAorICAgIGNvbnN0IHN0cmluZyAmaGVhZGVyLAorICAgIGNvbnN0IHN0cmluZyAmZm9vdGVyLAorICAgIGJvb2wgbG9uZ19vdXRwdXRfZm9ybWF0LAorICAgIGludCAqcmVtYWluaW5nX2xpbmVfbGltaXQsCisgICAgc2l6ZV90ICpjb21wbGV0aW9uX2VsZW1lbnRzX291dHB1dCwKKyAgICB2ZWN0b3I8c3RyaW5nPiAqY29tcGxldGlvbnMpIHsKKyAgaWYgKGdyb3VwLmVtcHR5KCkpIHJldHVybjsKKyAgaWYgKCFoZWFkZXIuZW1wdHkoKSkgeworICAgIGlmICgqcmVtYWluaW5nX2xpbmVfbGltaXQgPCAyKSByZXR1cm47CisgICAgKnJlbWFpbmluZ19saW5lX2xpbWl0IC09IDI7CisgICAgY29tcGxldGlvbnMtPnB1c2hfYmFjayhsaW5lX2luZGVudGF0aW9uICsgaGVhZGVyKTsKKyAgICBjb21wbGV0aW9ucy0+cHVzaF9iYWNrKGxpbmVfaW5kZW50YXRpb24gKyBzdHJpbmcoaGVhZGVyLnNpemUoKSwgJy0nKSk7CisgIH0KKyAgZm9yIChzZXQ8Y29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBncm91cC5iZWdpbigpOworICAgICAgaXQgIT0gZ3JvdXAuZW5kKCkgJiYgKnJlbWFpbmluZ19saW5lX2xpbWl0ID4gMDsKKyAgICAgICsraXQpIHsKKyAgICAtLSpyZW1haW5pbmdfbGluZV9saW1pdDsKKyAgICArKypjb21wbGV0aW9uX2VsZW1lbnRzX291dHB1dDsKKyAgICBjb21wbGV0aW9ucy0+cHVzaF9iYWNrKAorICAgICAgICAobG9uZ19vdXRwdXRfZm9ybWF0CisgICAgICAgICAgPyBHZXRMb25nRmxhZ0xpbmUobGluZV9pbmRlbnRhdGlvbiwgKippdCkKKyAgICAgICAgICA6IEdldFNob3J0RmxhZ0xpbmUobGluZV9pbmRlbnRhdGlvbiwgKippdCkpKTsKKyAgfQorICBpZiAoIWZvb3Rlci5lbXB0eSgpKSB7CisgICAgaWYgKCpyZW1haW5pbmdfbGluZV9saW1pdCA8IDEpIHJldHVybjsKKyAgICAtLSpyZW1haW5pbmdfbGluZV9saW1pdDsKKyAgICBjb21wbGV0aW9ucy0+cHVzaF9iYWNrKGxpbmVfaW5kZW50YXRpb24gKyBmb290ZXIpOworICB9Cit9CisKK3N0YXRpYyBzdHJpbmcgR2V0U2hvcnRGbGFnTGluZSgKKyAgICBjb25zdCBzdHJpbmcgJmxpbmVfaW5kZW50YXRpb24sCisgICAgY29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyAmaW5mbykgeworICBzdHJpbmcgcHJlZml4OworICBib29sIGlzX3N0cmluZyA9IChpbmZvLnR5cGUgPT0gInN0cmluZyIpOworICBTU3RyaW5nUHJpbnRmKCZwcmVmaXgsICIlcy0tJXMgWyVzJXMlc10gIiwKKyAgICAgICAgICAgICAgICBsaW5lX2luZGVudGF0aW9uLmNfc3RyKCksCisgICAgICAgICAgICAgICAgaW5mby5uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgKGlzX3N0cmluZyA/ICInIiA6ICIiKSwKKyAgICAgICAgICAgICAgICBpbmZvLmRlZmF1bHRfdmFsdWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAoaXNfc3RyaW5nID8gIiciIDogIiIpKTsKKyAgaW50IHJlbWFpbmRlciA9CisgICAgICBGTEFHU190YWJfY29tcGxldGlvbl9jb2x1bW5zIC0gc3RhdGljX2Nhc3Q8aW50PihwcmVmaXguc2l6ZSgpKTsKKyAgc3RyaW5nIHN1ZmZpeDsKKyAgaWYgKHJlbWFpbmRlciA+IDApCisgICAgc3VmZml4ID0KKyAgICAgICAgKHN0YXRpY19jYXN0PGludD4oaW5mby5kZXNjcmlwdGlvbi5zaXplKCkpID4gcmVtYWluZGVyID8KKyAgICAgICAgIChpbmZvLmRlc2NyaXB0aW9uLnN1YnN0cigwLCByZW1haW5kZXIgLSAzKSArICIuLi4iKS5jX3N0cigpIDoKKyAgICAgICAgIGluZm8uZGVzY3JpcHRpb24uY19zdHIoKSk7CisgIHJldHVybiBwcmVmaXggKyBzdWZmaXg7Cit9CisKK3N0YXRpYyBzdHJpbmcgR2V0TG9uZ0ZsYWdMaW5lKAorICAgIGNvbnN0IHN0cmluZyAmbGluZV9pbmRlbnRhdGlvbiwKKyAgICBjb25zdCBDb21tYW5kTGluZUZsYWdJbmZvICZpbmZvKSB7CisKKyAgc3RyaW5nIG91dHB1dCA9IERlc2NyaWJlT25lRmxhZyhpbmZvKTsKKworICAvLyBSZXBsYWNlICctJyB3aXRoICctLScsIGFuZCByZW1vdmUgdHJhaWxpbmcgbmV3bGluZSBiZWZvcmUgYXBwZW5kaW5nCisgIC8vIHRoZSBtb2R1bGUgZGVmaW5pdGlvbiBsb2NhdGlvbi4KKyAgc3RyaW5nIG9sZF9mbGFnbmFtZSA9ICItIiArIGluZm8ubmFtZTsKKyAgb3V0cHV0LnJlcGxhY2UoCisgICAgICBvdXRwdXQuZmluZChvbGRfZmxhZ25hbWUpLAorICAgICAgb2xkX2ZsYWduYW1lLnNpemUoKSwKKyAgICAgICItIiArIG9sZF9mbGFnbmFtZSk7CisgIC8vIFN0aWNrIGEgbmV3bGluZSBhbmQgaW5kZW50YXRpb24gaW4gZnJvbnQgb2YgdGhlIHR5cGUgYW5kIGRlZmF1bHQKKyAgLy8gcG9ydGlvbnMgb2YgRGVzY3JpYmVPbmVGbGFnKClzIGRlc2NyaXB0aW9uCisgIHN0YXRpYyBjb25zdCBjaGFyIGtOZXdsaW5lV2l0aEluZGVudFtdID0gIlxuICAgICI7CisgIG91dHB1dC5yZXBsYWNlKG91dHB1dC5maW5kKCIgdHlwZToiKSwgMSwgc3RyaW5nKGtOZXdsaW5lV2l0aEluZGVudCkpOworICBvdXRwdXQucmVwbGFjZShvdXRwdXQuZmluZCgiIGRlZmF1bHQ6IiksIDEsIHN0cmluZyhrTmV3bGluZVdpdGhJbmRlbnQpKTsKKyAgb3V0cHV0ID0gU3RyaW5nUHJpbnRmKCIlcyBEZXRhaWxzIGZvciAnLS0lcyc6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgICAgZGVmaW5lZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9pbmRlbnRhdGlvbi5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZmlsZW5hbWUuY19zdHIoKSk7CisKKyAgLy8gRWxpbWluYXRlIGFueSBkb3VibGVkIG5ld2xpbmVzIHRoYXQgY3JlcHQgaW4uICBTcGVjaWZpY2FsbHksIGlmCisgIC8vIERlc2NyaWJlT25lRmxhZygpIGRlY2lkZWQgdG8gYnJlYWsgdGhlIGxpbmUganVzdCBiZWZvcmUgInR5cGUiCisgIC8vIG9yICJkZWZhdWx0Iiwgd2UgZG9uJ3Qgd2FudCB0byBpbnRyb2R1Y2UgYW4gZXh0cmEgYmxhbmsgbGluZQorICBzdGF0aWMgY29uc3Qgc3RyaW5nIGxpbmVfb2Zfc3BhY2VzKEZMQUdTX3RhYl9jb21wbGV0aW9uX2NvbHVtbnMsICcgJyk7CisgIHN0YXRpYyBjb25zdCBjaGFyIGtEb3VibGVkTmV3bGluZXNbXSA9ICJcbiAgICAgXG4iOworICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIG5ld2xpbmVzID0gb3V0cHV0LmZpbmQoa0RvdWJsZWROZXdsaW5lcyk7CisgICAgICBuZXdsaW5lcyAhPSBzdHJpbmc6Om5wb3M7CisgICAgICBuZXdsaW5lcyA9IG91dHB1dC5maW5kKGtEb3VibGVkTmV3bGluZXMpKQorICAgIC8vIFJlcGxhY2UgZWFjaCAnZG91YmxlZCBuZXdsaW5lJyB3aXRoIGEgc2luZ2xlIG5ld2xpbmUKKyAgICBvdXRwdXQucmVwbGFjZShuZXdsaW5lcywgc2l6ZW9mKGtEb3VibGVkTmV3bGluZXMpIC0gMSwgc3RyaW5nKCJcbiIpKTsKKworICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIG5ld2xpbmUgPSBvdXRwdXQuZmluZCgnXG4nKTsKKyAgICAgIG5ld2xpbmUgIT0gc3RyaW5nOjpucG9zOworICAgICAgbmV3bGluZSA9IG91dHB1dC5maW5kKCdcbicpKSB7CisgICAgaW50IG5ld2xpbmVfcG9zID0gc3RhdGljX2Nhc3Q8aW50PihuZXdsaW5lKSAlIEZMQUdTX3RhYl9jb21wbGV0aW9uX2NvbHVtbnM7CisgICAgaW50IG1pc3Npbmdfc3BhY2VzID0gRkxBR1NfdGFiX2NvbXBsZXRpb25fY29sdW1ucyAtIG5ld2xpbmVfcG9zOworICAgIG91dHB1dC5yZXBsYWNlKG5ld2xpbmUsIDEsIGxpbmVfb2Zfc3BhY2VzLCAxLCBtaXNzaW5nX3NwYWNlcyk7CisgIH0KKyAgcmV0dXJuIG91dHB1dDsKK30KK30gIC8vIGFub255bW91cworCit2b2lkIEhhbmRsZUNvbW1hbmRMaW5lQ29tcGxldGlvbnModm9pZCkgeworICBpZiAoRkxBR1NfdGFiX2NvbXBsZXRpb25fd29yZC5lbXB0eSgpKSByZXR1cm47CisgIFByaW50RmxhZ0NvbXBsZXRpb25JbmZvKCk7CisgIGdmbGFnc19leGl0ZnVuYygwKTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBHRkxBR1NfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2dmbGFnc19jb21wbGV0aW9ucy5oLmluIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3NfY29tcGxldGlvbnMuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjdlNWZkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3NfY29tcGxldGlvbnMuaC5pbgpAQCAtMCwwICsxLDEyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyAtLS0KKworLy8KKy8vIEltcGxlbWVudCBoZWxwZnVsIGJhc2gtc3R5bGUgY29tbWFuZCBsaW5lIGZsYWcgY29tcGxldGlvbnMKKy8vCisvLyAqKiBGdW5jdGlvbmFsIEFQSToKKy8vIEhhbmRsZUNvbW1hbmRMaW5lQ29tcGxldGlvbnMoKSBzaG91bGQgYmUgY2FsbGVkIGVhcmx5IGR1cmluZworLy8gcHJvZ3JhbSBzdGFydHVwLCBidXQgYWZ0ZXIgY29tbWFuZCBsaW5lIGZsYWcgY29kZSBoYXMgYmVlbgorLy8gaW5pdGlhbGl6ZWQsIHN1Y2ggYXMgdGhlIGJlZ2lubmluZyBvZiBIYW5kbGVDb21tYW5kTGluZUhlbHBGbGFncygpLgorLy8gSXQgY2hlY2tzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyAtLXRhYl9jb21wbGV0aW9uX3dvcmQuICBJZiB0aGlzCisvLyBmbGFnIGlzIGVtcHR5LCBub3RoaW5nIGhhcHBlbnMgaGVyZS4gIElmIGl0IGNvbnRhaW5zIGEgc3RyaW5nLAorLy8gaG93ZXZlciwgdGhlbiBIYW5kbGVDb21tYW5kTGluZUNvbXBsZXRpb25zKCkgd2lsbCBoaWphY2sgdGhlCisvLyBwcm9jZXNzLCBhdHRlbXB0aW5nIHRvIGlkZW50aWZ5IHRoZSBpbnRlbnRpb24gYmVoaW5kIHRoaXMKKy8vIGNvbXBsZXRpb24uICBSZWdhcmRsZXNzIG9mIHRoZSBvdXRjb21lIG9mIHRoaXMgZGVkdWN0aW9uLCB0aGUKKy8vIHByb2Nlc3Mgd2lsbCBiZSB0ZXJtaW5hdGVkLCBzaW1pbGFyIHRvIC0taGVscHNob3J0IGZsYWcKKy8vIGhhbmRsaW5nLgorLy8KKy8vICoqIE92ZXJ2aWV3IG9mIEJhc2ggY29tcGxldGlvbnM6CisvLyBCYXNoIGNhbiBiZSB0b2xkIHRvIHByb2dyYW1hdGljYWxseSBkZXRlcm1pbmUgY29tcGxldGlvbnMgZm9yIHRoZQorLy8gY3VycmVudCAnY3Vyc29yIHdvcmQnLiAgSXQgZG9lcyB0aGlzIGJ5IChpbiB0aGlzIGNhc2UpIGludm9raW5nIGEKKy8vIGNvbW1hbmQgd2l0aCBzb21lIGFkZGl0aW9uYWwgYXJndW1lbnRzIGlkZW50aWZ5aW5nIHRoZSBjb21tYW5kCisvLyBiZWluZyBleGVjdXRlZCwgdGhlIHdvcmQgYmVpbmcgY29tcGxldGVkLCBhbmQgdGhlIHByZXZpb3VzIHdvcmQKKy8vIChpZiBhbnkpLiAgQmFzaCB0aGVuIGV4cGVjdHMgYSBzZXF1ZW5jZSBvZiBvdXRwdXQgbGluZXMgdG8gYmUKKy8vIHByaW50ZWQgdG8gc3Rkb3V0LiAgSWYgdGhlc2UgbGluZXMgYWxsIGNvbnRhaW4gYSBjb21tb24gcHJlZml4CisvLyBsb25nZXIgdGhhbiB0aGUgY3Vyc29yIHdvcmQsIGJhc2ggd2lsbCByZXBsYWNlIHRoZSBjdXJzb3Igd29yZAorLy8gd2l0aCB0aGF0IGNvbW1vbiBwcmVmaXgsIGFuZCBkaXNwbGF5IG5vdGhpbmcuICBJZiB0aGVyZSBpc24ndCBzdWNoCisvLyBhIGNvbW1vbiBwcmVmaXgsIGJhc2ggd2lsbCBkaXNwbGF5IHRoZSBsaW5lcyBpbiBwYWdlcyB1c2luZyAnbW9yZScuCisvLworLy8gKiogU3RyYXRlZ3kgdGFrZW4gZm9yIGNvbW1hbmQgbGluZSBjb21wbGV0aW9uczoKKy8vIElmIHdlIGNhbiBkZWR1Y2UgZWl0aGVyIHRoZSBleGFjdCBmbGFnIGludGVuZGVkLCBvciBhIGNvbW1vbiBmbGFnCisvLyBwcmVmaXgsIHdlJ2xsIG91dHB1dCBleGFjdGx5IHRoYXQuICBPdGhlcndpc2UsIGlmIGluZm9ybWF0aW9uCisvLyBtdXN0IGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciwgd2UnbGwgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRkCisvLyBzb21lIGhlbHBmdWwgaW5mb3JtYXRpb24gYmV5b25kIGp1c3QgdGhlIGZsYWcgbmFtZSAoc3BlY2lmaWNhbGx5LAorLy8gd2UnbGwgaW5jbHVkZSB0aGUgZGVmYXVsdCBmbGFnIHZhbHVlIGFuZCBhcyBtdWNoIG9mIHRoZSBmbGFnJ3MKKy8vIGRlc2NyaXB0aW9uIGFzIGNhbiBmaXQgb24gYSBzaW5nbGUgdGVybWluYWwgbGluZSB3aWR0aCwgYXMgc3BlY2lmaWVkCisvLyBieSB0aGUgZmxhZyAtLXRhYl9jb21wbGV0aW9uX2NvbHVtbnMpLiAgRnVydGhlcm1vcmUsIHdlJ2xsIHRyeSB0bworLy8gbWFrZSBiYXNoIG9yZGVyIHRoZSBvdXRwdXQgc3VjaCB0aGF0IHRoZSBtb3N0IHVzZWZ1bCBvciByZWxldmVudAorLy8gZmxhZ3MgYXJlIHRoZSBtb3N0IGxpa2VseSB0byBiZSBzaG93biBhdCB0aGUgdG9wLgorLy8KKy8vICoqIEFkZGl0aW9uYWwgZmVhdHVyZXM6CisvLyBUbyBhc3Npc3QgaW4gZmluZGluZyB0aGF0IG9uZSByZWFsbHkgdXNlZnVsIGZsYWcsIHN1YnN0cmluZyBtYXRjaGluZworLy8gd2FzIGltcGxlbWVudGVkLiAgQmVmb3JlIHByZXNzaW5nIGEgPFRBQj4gdG8gZ2V0IGNvbXBsZXRpb24gZm9yIHRoZQorLy8gY3VycmVudCB3b3JkLCB5b3UgY2FuIGFwcGVuZCBvbmUgb3IgbW9yZSAnPycgdG8gdGhlIGZsYWcgdG8gZG8KKy8vIHN1YnN0cmluZyBtYXRjaGluZy4gIEhlcmUncyB0aGUgc2VtYW50aWNzOgorLy8gICAtLWZvbzxUQUI+ICAgICBTaG93IG1lIGFsbCBmbGFncyB3aXRoIG5hbWVzIHByZWZpeGVkIGJ5ICdmb28nCisvLyAgIC0tZm9vPzxUQUI+ICAgIFNob3cgbWUgYWxsIGZsYWdzIHdpdGggJ2Zvbycgc29tZXdoZXJlIGluIHRoZSBuYW1lCisvLyAgIC0tZm9vPz88VEFCPiAgIFNhbWUgYXMgcHJpb3IgY2FzZSwgYnV0IGFsc28gc2VhcmNoIGluIG1vZHVsZQorLy8gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uIHBhdGggZm9yICdmb28nCisvLyAgIC0tZm9vPz8/PFRBQj4gIFNhbWUgYXMgcHJpb3IgY2FzZSwgYnV0IGFsc28gc2VhcmNoIGluIGZsYWcKKy8vICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25zIGZvciAnZm9vJworLy8gRmluYWxseSwgd2UnbGwgdHJpbSB0aGUgb3V0cHV0IHRvIGEgcmVsYXRpdmVseSBzbWFsbCBudW1iZXIgb2YKKy8vIGZsYWdzIHRvIGtlZXAgYmFzaCBxdWlldCBhYm91dCB0aGUgdmVyYm9zaXR5IG9mIG91dHB1dC4gIElmIG9uZQorLy8gcmVhbGx5IHdhbnRlZCB0byBzZWUgYWxsIHBvc3NpYmxlIG1hdGNoZXMsIGFwcGVuZGluZyBhICcrJyB0byB0aGUKKy8vIHNlYXJjaCB3b3JkIHdpbGwgZm9yY2UgdGhlIGV4aGF1c3RpdmUgbGlzdCBvZiBtYXRjaGVzIHRvIGJlIHByaW50ZWQuCisvLworLy8gKiogSG93IHRvIGhhdmUgYmFzaCBhY2NlcHQgY29tcGxldGlvbnMgZnJvbSBhIGJpbmFyeToKKy8vIEJhc2ggcmVxdWlyZXMgdGhhdCBpdCBiZSBpbmZvcm1lZCBhYm91dCBlYWNoIGNvbW1hbmQgdGhhdCBwcm9ncmFtbWF0aWMKKy8vIGNvbXBsZXRpb24gc2hvdWxkIGJlIGVuYWJsZWQgZm9yLiAgRXhhbXBsZSBhZGRpdGlvbiB0byBhIC5iYXNocmMKKy8vIGZpbGUgd291bGQgYmUgKHlvdXIgcGF0aCB0byBnZmxhZ3NfY29tcGxldGlvbnMuc2ggZmlsZSBtYXkgZGlmZmVyKToKKworLyoKKyQgY29tcGxldGUgLW8gYmFzaGRlZmF1bHQgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1DICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAnL2hvbWUvYnVpbGQvZW5nL2Jhc2gvYmFzaF9jb21wbGV0aW9ucy5zaCAtLXRhYl9jb21wbGV0aW9uX2NvbHVtbnMgJENPTFVNTlMnIFwKKyAgdGltZSAgZW52ICBiaW5hcnlfbmFtZSAgYW5vdGhlcl9iaW5hcnkgIFsuLi5dCisqLworCisvLyBUaGlzIHdvdWxkIGFsbG93IHRoZSBmb2xsb3dpbmcgdG8gd29yazoKKy8vICAgJCAvcGF0aC90by9iaW5hcnlfbmFtZSAtLXZtb2R1bGU8VEFCPgorLy8gT3I6CisvLyAgICQgLi9iaW4vcGF0aC9hbm90aGVyX2JpbmFyeSAtLWdmc191PFRBQj4KKy8vIChldGMpCisvLworLy8gU2FkbHksIGl0IGFwcGVhcnMgdGhhdCBiYXNoIGdpdmVzIG5vIGVhc3kgd2F5IHRvIGZvcmNlIHRoaXMgYmVoYXZpb3IgZm9yCisvLyBhbGwgY29tbWFuZHMuICBUaGF0J3Mgd2hlcmUgdGhlICJ0aW1lIiBpbiB0aGUgYWJvdmUgZXhhbXBsZSBjb21lcyBpbi4KKy8vIElmIHlvdSBoYXZlbid0IHNwZWNpZmljYWxseSBhZGRlZCBhIGNvbW1hbmQgdG8gdGhlIGxpc3Qgb2YgY29tcGxldGlvbgorLy8gc3VwcG9ydGVkIGNvbW1hbmRzLCB5b3UgY2FuIHN0aWxsIGdldCBjb21wbGV0aW9ucyBieSBwcmVmaXhpbmcgdGhlCisvLyBlbnRpcmUgY29tbWFuZCB3aXRoICJlbnYiLgorLy8gICAkIGVudiAvc29tZS9icmFuZC9uZXcvYmluYXJ5IC0tdm1vZDxUQUI+CisvLyBBc3N1bWluZyB0aGF0ICJiaW5hcnkiIGlzIGEgbmV3bHkgY29tcGlsZWQgYmluYXJ5LCB0aGlzIHNob3VsZCBzdGlsbAorLy8gcHJvZHVjZSB0aGUgZXhwZWN0ZWQgY29tcGxldGlvbiBvdXRwdXQuCisKKworI2lmbmRlZiBHRkxBR1NfQ09NUExFVElPTlNfSF8KKyNkZWZpbmUgR0ZMQUdTX0NPTVBMRVRJT05TX0hfCisKK25hbWVzcGFjZSBAR0ZMQUdTX05BTUVTUEFDRUAgeworCitleHRlcm4gdm9pZCBIYW5kbGVDb21tYW5kTGluZUNvbXBsZXRpb25zKHZvaWQpOworCit9CisKKyNlbmRpZiAgLy8gR0ZMQUdTX0NPTVBMRVRJT05TX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2dmbGFnc19jb21wbGV0aW9ucy5zaCBiL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvZ2ZsYWdzX2NvbXBsZXRpb25zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM1ZmI3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2dmbGFnc19jb21wbGV0aW9ucy5zaApAQCAtMCwwICsxLDExNyBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyAtLS0KKyMgQXV0aG9yOiBEYXZlIE5pY3BvbnNraQorIworIyBUaGlzIHNjcmlwdCBpcyBpbnZva2VkIGJ5IGJhc2ggaW4gcmVzcG9uc2UgdG8gYSBtYXRjaGluZyBjb21wc3BlYy4gIFdoZW4KKyMgdGhpcyBoYXBwZW5zLCBiYXNoIGNhbGxzIHRoaXMgc2NyaXB0IHVzaW5nIHRoZSBjb21tYW5kIHNob3duIGluIHRoZSAtQworIyBibG9jayBvZiB0aGUgY29tcGxldGUgZW50cnksIGJ1dCBhbHNvIGFwcGVuZHMgMyBhcmd1bWVudHMuICBUaGV5IGFyZToKKyMgICAtIFRoZSBjb21tYW5kIGJlaW5nIHVzZWQgZm9yIGNvbXBsZXRpb24KKyMgICAtIFRoZSB3b3JkIGJlaW5nIGNvbXBsZXRlZAorIyAgIC0gVGhlIHdvcmQgcHJlY2VkaW5nIHRoZSBjb21wbGV0aW9uIHdvcmQuCisjCisjIEhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB5b3UgbWlnaHQgdXNlIHRoaXMgc2NyaXB0OgorIyAkIGNvbXBsZXRlIC1vIGJhc2hkZWZhdWx0IC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtQyAgICAgICAgICAgICAgICAgICAgICAgICBcCisjICAgJy91c3IvbG9jYWwvYmluL2dmbGFnc19jb21wbGV0aW9ucy5zaCAtLXRhYl9jb21wbGV0aW9uX2NvbHVtbnMgJENPTFVNTlMnIFwKKyMgICB0aW1lICBlbnYgIGJpbmFyeV9uYW1lICBhbm90aGVyX2JpbmFyeSAgWy4uLl0KKworIyBjb21wbGV0aW9uX3dvcmRfaW5kZXggZ2V0cyB0aGUgaW5kZXggb2YgdGhlIChOLTEpdGggYXJndW1lbnQgZm9yCisjIHRoaXMgY29tbWFuZCBsaW5lLiAgY29tcGxldGlvbl93b3JkIGdldHMgdGhlIGFjdHVhbCBhcmd1bWVudCBmcm9tCisjIHRoaXMgY29tbWFuZCBsaW5lIGF0IHRoZSAoTi0xKXRoIHBvc2l0aW9uCitjb21wbGV0aW9uX3dvcmRfaW5kZXg9IiQoKCQjIC0gMSkpIgorY29tcGxldGlvbl93b3JkPSIkeyFjb21wbGV0aW9uX3dvcmRfaW5kZXh9IgorCisjIFRPRE8odXNlcik6IFJlcGxhY2UgdGhpcyBvbmNlIGdmbGFnc19jb21wbGV0aW9ucy5jYyBoYXMKKyMgYSBib29sIHBhcmFtZXRlciBpbmRpY2F0aW5nIHVuYW1iaWd1b3VzbHkgdG8gaGlqYWNrIHRoZSBwcm9jZXNzIGZvcgorIyBjb21wbGV0aW9uIHB1cnBvc2VzLgoraWYgWyAteiAiJGNvbXBsZXRpb25fd29yZCIgXTsgdGhlbgorICAjIFVudGlsIGFuIGVtcHR5IHZhbHVlIGZvciB0aGUgY29tcGxldGlvbiB3b3JkIHN0b3BzIGJlaW5nIG1pc3VuZGVyc3Rvb2QKKyAgIyBieSBiaW5hcmllcywgZG9uJ3QgYWN0dWFsbHkgZXhlY3V0ZSB0aGUgYmluYXJ5IG9yIHRoZSBwcm9jZXNzCisgICMgd29uJ3QgYmUgaGlqYWNrZWQhCisgIGV4aXQgMAorZmkKKworIyBiaW5hcnlfaW5kZXggZ2V0cyB0aGUgaW5kZXggb2YgdGhlIGNvbW1hbmQgYmVpbmcgY29tcGxldGVkICh3aGljaCBiYXNoCisjIHBsYWNlcyBpbiB0aGUgKE4tMiluZCBwb3NpdGlvbi4gIGJpbmFyeSBnZXRzIHRoZSBhY3R1YWwgY29tbWFuZCBmcm9tCisjIHRoaXMgY29tbWFuZCBsaW5lIGF0IHRoYXQgKE4tMiluZCBwb3NpdGlvbgorYmluYXJ5X2luZGV4PSIkKCgkIyAtIDIpKSIKK2JpbmFyeT0iJHshYmluYXJ5X2luZGV4fSIKKworIyBGb3IgY29tcGxldGlvbnMgdG8gYmUgdW5pdmVyc2FsLCB3ZSBtYXkgaGF2ZSBzZXR1cCB0aGUgY29tcHNwZWMgdG8KKyMgdHJpZ2dlciBvbiAnaGFybWxlc3MgcGFzcy10aHJvdWdoJyBjb21tYW5kcywgbGlrZSAndGltZScgb3IgJ2VudicuCisjIElmIHRoZSBjb21tYW5kIGJlaW5nIGNvbXBsZXRlZCBpcyBvbmUgb2YgdGhvc2UgdHdvLCB3ZSdsbCBuZWVkIHRvCisjIGlkZW50aWZ5IHRoZSBhY3R1YWwgY29tbWFuZCBiZWluZyBleGVjdXRlZC4gIFRvIGRvIHRoaXMsIHdlIG5lZWQKKyMgdGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgdGhhdCB0aGUgPFRBQj4gd2FzIHByZXNzZWQgb24uICBCYXNoIGhlbHBmdWxseQorIyBwbGFjZXMgdGhpcyBpbiB0aGUgJENPTVBfTElORSB2YXJpYWJsZS4KK2lmIFsgIiRiaW5hcnkiID09ICJ0aW1lIiBdIHx8IFsgIiRiaW5hcnkiID09ICJlbnYiIF07IHRoZW4KKyAgIyB3ZSdsbCBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgJ2FyZ3VtZW50JyBpcyBhY3R1YWxseSB0aGUKKyAgIyBiaW5hcnkKKworCisgICMgVE9ETyh1c2VyKTogVGhpcyBpcyBub3QgcGVyZmVjdCAtIHRoZSAnZW52JyBjb21tYW5kLCBmb3IgaW5zdGFuY2UsCisgICMgICBpcyBhbGxvd2VkIHRvIGhhdmUgb3B0aW9ucyBiZXR3ZWVuIHRoZSAnZW52JyBhbmQgJ3RoZSBjb21tYW5kIHRvCisgICMgICBiZSBleGVjdXRlZCcuICBGb3IgZXhhbXBsZSwgY29uc2lkZXI6CisgICMgJCBlbnYgRk9PPSJiYXIiICBiaW4vZG9fc29tZXRoaW5nICAtLWhlbHA8VEFCPgorICAjIEluIHRoaXMgY2FzZSwgd2UnbGwgbWlzdGFrZSB0aGUgRk9PPSJiYXIiIHBvcnRpb24gYXMgdGhlIGJpbmFyeS4KKyAgIyAgIFBlcmhhcHMgd2Ugc2hvdWxkIGNvbnRpbnVpbmcgY29uc3VtaW5nIGxlYWRpbmcgd29yZHMgdW50aWwgd2UKKyAgIyAgIGVpdGhlciBydW4gb3V0IG9mIHdvcmRzLCBvciBmaW5kIGEgd29yZCB0aGF0IGlzIGEgdmFsaWQgZmlsZQorICAjICAgbWFya2VkIGFzIGV4ZWN1dGFibGUuICBJIGNhbid0IHRoaW5rIG9mIGFueSByZWFzb24gdGhpcyB3b3VsZG4ndAorICAjICAgd29yay4KKworICAjIEJyZWFrIHVwIHRoZSAnb3JpZ2luYWwgY29tbWFuZCBsaW5lJyAobm90IHRoaXMgc2NyaXB0J3MgY29tbWFuZCBsaW5lLAorICAjIHJhdGhlciB0aGUgb25lIHRoZSA8VEFCPiB3YXMgcHJlc3NlZCBvbikgYW5kIGZpbmQgdGhlIHNlY29uZCB3b3JkLgorICBwYXJ0cz0oICR7Q09NUF9MSU5FfSApCisgIGJpbmFyeT0ke3BhcnRzWzFdfQorZmkKKworIyBCdWlsZCB0aGUgY29tbWFuZCBsaW5lIHRvIHVzZSBmb3IgY29tcGxldGlvbi4gIEJhc2ljYWxseSBpdCBpbnZvbHZlcworIyBwYXNzaW5nIHRocm91Z2ggYWxsIHRoZSBhcmd1bWVudHMgZ2l2ZW4gdG8gdGhpcyBzY3JpcHQgKGV4Y2VwdCB0aGUgMworIyB0aGF0IGJhc2ggYWRkZWQpLCBhbmQgYXBwZW5kaW5nIGEgJy0tdGFiX2NvbXBsZXRpb25fd29yZCAiV09SRCInIHRvCisjIHRoZSBhcmd1bWVudHMuCitwYXJhbXM9IiIKK2ZvciAoKGk9MTsgaTw9JCgoJCMgLSAzKSk7ICsraSkpOyBkbyAKKyAgcGFyYW1zPSIkcGFyYW1zIFwiJHshaX1cIiI7Citkb25lCitwYXJhbXM9IiRwYXJhbXMgLS10YWJfY29tcGxldGlvbl93b3JkIFwiJGNvbXBsZXRpb25fd29yZFwiIgorCisjIFRPRE8odXNlcik6IFBlcmhhcHMgc3Rhc2ggdGhlIG91dHB1dCBpbiBhIHRlbXBvcmFyeSBmaWxlIHNvbWV3aGVyZQorIyBpbiAvdG1wLCBhbmQgb25seSBjYXQgaXQgdG8gc3Rkb3V0IGlmIHRoZSBjb21tYW5kIHJldHVybmVkIGEgc3VjY2VzcworIyBjb2RlLCB0byBwcmV2ZW50IGZhbHNlIHBvc2l0aXZlcworCisjIElmIHdlIHRoaW5rIHdlIGhhdmUgYSByZWFzb25hYmxlIGNvbW1hbmQgdG8gZXhlY3V0ZSwgdGhlbiBleGVjdXRlIGl0CisjIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KK2NhbmRpZGF0ZT0kKHR5cGUgLXAgIiRiaW5hcnkiKQoraWYgWyAhIC16ICIkY2FuZGlkYXRlIiBdOyB0aGVuCisgIGV2YWwgIiRjYW5kaWRhdGUgMj4vZGV2L251bGwgJHBhcmFtcyIKK2VsaWYgWyAtZiAiJGJpbmFyeSIgXSAmJiBbIC14ICIkYmluYXJ5IiBdOyB0aGVuCisgIGV2YWwgIiRiaW5hcnkgMj4vZGV2L251bGwgJHBhcmFtcyIKK2ZpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2dmbGFnc19kZWNsYXJlLmguaW4gYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2dmbGFnc19kZWNsYXJlLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5ZGIyNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvZ2ZsYWdzX2RlY2xhcmUuaC5pbgpAQCAtMCwwICsxLDE0MSBAQAorLy8gQ29weXJpZ2h0IChjKSAxOTk5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gLS0tCisvLworLy8gUmV2YW1wZWQgYW5kIHJlb3JnYW5pemVkIGJ5IENyYWlnIFNpbHZlcnN0ZWluCisvLworLy8gVGhpcyBpcyB0aGUgZmlsZSB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBieSBhbnkgZmlsZSB3aGljaCBkZWNsYXJlcworLy8gY29tbWFuZCBsaW5lIGZsYWcuCisKKyNpZm5kZWYgR0ZMQUdTX0RFQ0xBUkVfSF8KKyNkZWZpbmUgR0ZMQUdTX0RFQ0xBUkVfSF8KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hbWVzcGFjZSBvZiBnZmxhZ3MgbGlicmFyeSBzeW1ib2xzLgorI2RlZmluZSBHRkxBR1NfTkFNRVNQQUNFIEBHRkxBR1NfTkFNRVNQQUNFQAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdpbmRvd3MgRExMIGltcG9ydC9leHBvcnQuCisKKy8vIFdlIGFsd2F5cyB3YW50IHRvIGltcG9ydCB0aGUgc3ltYm9scyBvZiB0aGUgZ2ZsYWdzIGxpYnJhcnkKKyNpZm5kZWYgR0ZMQUdTX0RMTF9ERUNMCisjICBpZiBAR0ZMQUdTX0lTX0FfRExMQCAmJiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgICBkZWZpbmUgR0ZMQUdTX0RMTF9ERUNMIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgZWxzZQorIyAgICBkZWZpbmUgR0ZMQUdTX0RMTF9ERUNMCisjICBlbmRpZgorI2VuZGlmCisKKy8vIFdlIGFsd2F5cyB3YW50IHRvIGltcG9ydCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdXNlciBjb2RlCisjaWZuZGVmIEdGTEFHU19ETExfREVDTEFSRV9GTEFHCisjICBpZmRlZiBfTVNDX1ZFUgorIyAgICBkZWZpbmUgR0ZMQUdTX0RMTF9ERUNMQVJFX0ZMQUcgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICBlbHNlCisjICAgIGRlZmluZSBHRkxBR1NfRExMX0RFQ0xBUkVfRkxBRworIyAgZW5kaWYKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsYWcgdHlwZXMKKyNpbmNsdWRlIDxzdHJpbmc+CisjaWYgQEhBVkVfU1RESU5UX0hACisjICBpbmNsdWRlIDxzdGRpbnQuaD4gICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vcm1hbCBwbGFjZSB1aW50MzJfdCBpcyBkZWZpbmVkCisjZWxpZiBASEFWRV9TWVNfVFlQRVNfSEAKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgICAgICAgICAgICAvLyB0aGUgbm9ybWFsIHBsYWNlIHVfaW50MzJfdCBpcyBkZWZpbmVkCisjZWxpZiBASEFWRV9JTlRUWVBFU19IQAorIyAgaW5jbHVkZSA8aW50dHlwZXMuaD4gICAgICAgICAgICAgICAgIC8vIGEgdGhpcmQgcGxhY2UgZm9yIHVpbnQzMl90IG9yIHVfaW50MzJfdAorI2VuZGlmCisKK25hbWVzcGFjZSBHRkxBR1NfTkFNRVNQQUNFIHsKKworI2lmIEBHRkxBR1NfSU5UVFlQRVNfRk9STUFUX0M5OUAgLy8gQzk5Cit0eXBlZGVmIGludDMyX3QgICAgICAgICAgaW50MzI7Cit0eXBlZGVmIHVpbnQzMl90ICAgICAgICAgdWludDMyOwordHlwZWRlZiBpbnQ2NF90ICAgICAgICAgIGludDY0OwordHlwZWRlZiB1aW50NjRfdCAgICAgICAgIHVpbnQ2NDsKKyNlbGlmIEBHRkxBR1NfSU5UVFlQRVNfRk9STUFUX0JTREAgLy8gQlNECit0eXBlZGVmIGludDMyX3QgICAgICAgICAgaW50MzI7Cit0eXBlZGVmIHVfaW50MzJfdCAgICAgICAgdWludDMyOwordHlwZWRlZiBpbnQ2NF90ICAgICAgICAgIGludDY0OwordHlwZWRlZiB1X2ludDY0X3QgICAgICAgIHVpbnQ2NDsKKyNlbGlmIEBHRkxBR1NfSU5UVFlQRVNfRk9STUFUX1ZDN0AgLy8gV2luZG93cwordHlwZWRlZiBfX2ludDMyICAgICAgICAgIGludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIHVpbnQzMjsKK3R5cGVkZWYgX19pbnQ2NCAgICAgICAgICBpbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjQ7CisjZWxzZQorIyAgZXJyb3IgRG8gbm90IGtub3cgaG93IHRvIGRlZmluZSBhIDMyLWJpdCBpbnRlZ2VyIHF1YW50aXR5IG9uIHlvdXIgc3lzdGVtCisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgR0ZMQUdTX05BTUVTUEFDRQorCisKK25hbWVzcGFjZSBmTFMgeworCisvLyBUaGUgbWVhbmluZyBvZiAic3RyaW5nIiBtaWdodCBiZSBkaWZmZXJlbnQgYmV0d2VlbiBub3cgYW5kIHdoZW4gdGhlCisvLyBtYWNyb3MgYmVsb3cgZ2V0IGludm9rZWQgKGUuZy4sIGlmIHNvbWVvbmUgaXMgZXhwZXJpbWVudGluZyB3aXRoCisvLyBvdGhlciBzdHJpbmcgaW1wbGVtZW50YXRpb25zIHRoYXQgZ2V0IGRlZmluZWQgYWZ0ZXIgdGhpcyBmaWxlIGlzCisvLyBpbmNsdWRlZCkuICBTYXZlIHRoZSBjdXJyZW50IG1lYW5pbmcgbm93IGFuZCB1c2UgaXQgaW4gdGhlIG1hY3Jvcy4KK3R5cGVkZWYgc3RkOjpzdHJpbmcgY2xzdHJpbmc7CisKK30gLy8gbmFtZXNwYWNlIGZMUworCisKKyNkZWZpbmUgREVDTEFSRV9WQVJJQUJMRSh0eXBlLCBzaG9ydHR5cGUsIG5hbWUpIFwKKyAgLyogV2UgYWx3YXlzIHdhbnQgdG8gaW1wb3J0IGRlY2xhcmVkIHZhcmlhYmxlcywgZGxsIG9yIG5vICovIFwKKyAgbmFtZXNwYWNlIGZMIyNzaG9ydHR5cGUgeyBleHRlcm4gR0ZMQUdTX0RMTF9ERUNMQVJFX0ZMQUcgdHlwZSBGTEFHU18jI25hbWU7IH0gXAorICB1c2luZyBmTCMjc2hvcnR0eXBlOjpGTEFHU18jI25hbWUKKworI2RlZmluZSBERUNMQVJFX2Jvb2wobmFtZSkgXAorICBERUNMQVJFX1ZBUklBQkxFKGJvb2wsIEIsIG5hbWUpCisKKyNkZWZpbmUgREVDTEFSRV9pbnQzMihuYW1lKSBcCisgIERFQ0xBUkVfVkFSSUFCTEUoOjpHRkxBR1NfTkFNRVNQQUNFOjppbnQzMiwgSSwgbmFtZSkKKworI2RlZmluZSBERUNMQVJFX2ludDY0KG5hbWUpIFwKKyAgREVDTEFSRV9WQVJJQUJMRSg6OkdGTEFHU19OQU1FU1BBQ0U6OmludDY0LCBJNjQsIG5hbWUpCisKKyNkZWZpbmUgREVDTEFSRV91aW50NjQobmFtZSkgXAorICBERUNMQVJFX1ZBUklBQkxFKDo6R0ZMQUdTX05BTUVTUEFDRTo6dWludDY0LCBVNjQsIG5hbWUpCisKKyNkZWZpbmUgREVDTEFSRV9kb3VibGUobmFtZSkgXAorICBERUNMQVJFX1ZBUklBQkxFKGRvdWJsZSwgRCwgbmFtZSkKKworI2RlZmluZSBERUNMQVJFX3N0cmluZyhuYW1lKSBcCisgIC8qIFdlIGFsd2F5cyB3YW50IHRvIGltcG9ydCBkZWNsYXJlZCB2YXJpYWJsZXMsIGRsbCBvciBubyAqLyBcCisgIG5hbWVzcGFjZSBmTFMgeyBcCisgIHVzaW5nIDo6ZkxTOjpjbHN0cmluZzsgXAorICBleHRlcm4gR0ZMQUdTX0RMTF9ERUNMQVJFX0ZMQUcgOjpmTFM6OmNsc3RyaW5nJiBGTEFHU18jI25hbWU7IFwKKyAgfSBcCisgIHVzaW5nIGZMUzo6RkxBR1NfIyNuYW1lCisKKworI2VuZGlmICAvLyBHRkxBR1NfREVDTEFSRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3NfbnMuaC5pbiBiL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvZ2ZsYWdzX25zLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5MjY2NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvZ2ZsYWdzX25zLmguaW4KQEAgLTAsMCArMSwxMDEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNCwgQW5kcmVhcyBTY2h1aAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltcG9ydHMgdGhlIGdmbGFncyBsaWJyYXJ5IHN5bWJvbHMgaW50byBhbiBhbHRlcm5hdGl2ZS9kZXByZWNhdGVkIG5hbWVzcGFjZS4KKworI2lmbmRlZiBHRkxBR1NfR0ZMQUdTX0hfCisjICBlcnJvciBUaGUgaW50ZXJuYWwgaGVhZGVyIGdmbGFnc19AbnNALmggbWF5IG9ubHkgYmUgaW5jbHVkZWQgYnkgZ2ZsYWdzLmgKKyNlbmRpZgorCisjaWZuZGVmIEdGTEFHU19OU19ATlNAX0hfCisjZGVmaW5lIEdGTEFHU19OU19ATlNAX0hfCisKKworbmFtZXNwYWNlIEBuc0AgeworCisKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OmludDMyOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6dWludDMyOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6aW50NjQ7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjp1aW50NjQ7CisKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcjsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkNvbW1hbmRMaW5lRmxhZ0luZm87Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpHZXRBbGxGbGFnczsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlNob3dVc2FnZVdpdGhGbGFnczsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlNob3dVc2FnZVdpdGhGbGFnc1Jlc3RyaWN0OwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6RGVzY3JpYmVPbmVGbGFnOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6U2V0QXJndjsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkdldEFyZ3ZzOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6R2V0QXJndjsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkdldEFyZ3YwOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6R2V0QXJndlN1bTsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlByb2dyYW1JbnZvY2F0aW9uTmFtZTsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlByb2dyYW1JbnZvY2F0aW9uU2hvcnROYW1lOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6UHJvZ3JhbVVzYWdlOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6VmVyc2lvblN0cmluZzsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkdldENvbW1hbmRMaW5lT3B0aW9uOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6R2V0Q29tbWFuZExpbmVGbGFnSW5mbzsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkdldENvbW1hbmRMaW5lRmxhZ0luZm9PckRpZTsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkZsYWdTZXR0aW5nTW9kZTsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlNFVF9GTEFHU19WQUxVRTsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlNFVF9GTEFHX0lGX0RFRkFVTFQ7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpTRVRfRkxBR1NfREVGQVVMVDsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlNldENvbW1hbmRMaW5lT3B0aW9uOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6U2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZTsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkZsYWdTYXZlcjsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkNvbW1hbmRsaW5lRmxhZ3NJbnRvU3RyaW5nOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6UmVhZEZsYWdzRnJvbVN0cmluZzsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkFwcGVuZEZsYWdzSW50b0ZpbGU7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpSZWFkRnJvbUZsYWdzRmlsZTsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkJvb2xGcm9tRW52OwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6SW50MzJGcm9tRW52OwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6SW50NjRGcm9tRW52OwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6VWludDY0RnJvbUVudjsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkRvdWJsZUZyb21FbnY7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpTdHJpbmdGcm9tRW52OwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6U2V0VXNhZ2VNZXNzYWdlOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6U2V0VmVyc2lvblN0cmluZzsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlBhcnNlQ29tbWFuZExpbmVOb25IZWxwRmxhZ3M7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpIYW5kbGVDb21tYW5kTGluZUhlbHBGbGFnczsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OkFsbG93Q29tbWFuZExpbmVSZXBhcnNpbmc7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpSZXBhcnNlQ29tbWFuZExpbmVOb25IZWxwRmxhZ3M7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpTaHV0RG93bkNvbW1hbmRMaW5lRmxhZ3M7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpGbGFnUmVnaXN0ZXJlcjsKKworI2lmbmRlZiBTV0lHCit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpQYXJzZUNvbW1hbmRMaW5lRmxhZ3M7CisjZW5kaWYKKworCit9IC8vIG5hbWVzcGFjZSBAbnNACisKKworI2VuZGlmICAvLyBHRkxBR1NfTlNfQE5TQF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3NfcmVwb3J0aW5nLmNjIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9nZmxhZ3NfcmVwb3J0aW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzQxYTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL2dmbGFnc19yZXBvcnRpbmcuY2MKQEAgLTAsMCArMSw0NDEgQEAKKy8vIENvcHlyaWdodCAoYykgMTk5OSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIC0tLQorLy8KKy8vIFJldmFtcGVkIGFuZCByZW9yZ2FuaXplZCBieSBDcmFpZyBTaWx2ZXJzdGVpbgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBoYW5kbGluZyB0aGUgJ3JlcG9ydGluZycgZmxhZ3MuICBUaGVzZQorLy8gYXJlIGZsYWdzIHRoYXQsIHdoZW4gcHJlc2VudCwgY2F1c2UgdGhlIHByb2dyYW0gdG8gcmVwb3J0IHNvbWUKKy8vIGluZm9ybWF0aW9uIGFuZCB0aGVuIGV4aXQuICAtLWhlbHAgYW5kIC0tdmVyc2lvbiBhcmUgdGhlIGNhbm9uaWNhbAorLy8gcmVwb3J0aW5nIGZsYWdzLCBidXQgd2UgYWxzbyBoYXZlIGZsYWdzIGxpa2UgLS1oZWxweG1sLCBldGMuCisvLworLy8gVGhlcmUncyBvbmx5IG9uZSBmdW5jdGlvbiB0aGF0J3MgbWVhbnQgdG8gYmUgY2FsbGVkIGV4dGVybmFsbHk6CisvLyBIYW5kbGVDb21tYW5kTGluZUhlbHBGbGFncygpLiAgKFdlbGwsIGFjdHVhbGx5LCBTaG93VXNhZ2VXaXRoRmxhZ3MoKSwKKy8vIFNob3dVc2FnZVdpdGhGbGFnc1Jlc3RyaWN0KCksIGFuZCBEZXNjcmliZU9uZUZsYWcoKSBjYW4gYmUgY2FsbGVkCisvLyBleHRlcm5hbGx5IHRvbywgYnV0IHRoZXJlJ3MgbGl0dGxlIG5lZWQgZm9yIGl0LikgIFRoZXNlIGFyZSBhbGwKKy8vIGRlY2xhcmVkIGluIHRoZSBtYWluIGdmbGFncy5oIGhlYWRlciBmaWxlLgorLy8KKy8vIEhhbmRsZUNvbW1hbmRMaW5lSGVscEZsYWdzKCkgd2lsbCBjaGVjayB3aGF0ICdyZXBvcnRpbmcnIGZsYWdzIGhhdmUKKy8vIGJlZW4gZGVmaW5lZCwgaWYgYW55IC0tIHRoZSAiaGVscCIgcGFydCBvZiB0aGUgZnVuY3Rpb24gbmFtZSBpcyBhCisvLyBiaXQgbWlzbGVhZGluZyAtLSBhbmQgZG8gdGhlIHJlbGV2YW50IHJlcG9ydGluZy4gIEl0IHNob3VsZCBiZQorLy8gY2FsbGVkIGFmdGVyIGFsbCBmbGFnLXZhbHVlcyBoYXZlIGJlZW4gYXNzaWduZWQsIHRoYXQgaXMsIGFmdGVyCisvLyBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImdmbGFncy5oIgorI2luY2x1ZGUgImdmbGFnc19jb21wbGV0aW9ucy5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworCisvLyBUaGUgJ3JlcG9ydGluZycgZmxhZ3MuICBUaGV5IGFsbCBjYWxsIGdmbGFnc19leGl0ZnVuYygpLgorREVGSU5FX2Jvb2wgIChoZWxwLCAgICAgICAgZmFsc2UsICJzaG93IGhlbHAgb24gYWxsIGZsYWdzIFt0aXA6IGFsbCBmbGFncyBjYW4gaGF2ZSB0d28gZGFzaGVzXSIpOworREVGSU5FX2Jvb2wgIChoZWxwZnVsbCwgICAgZmFsc2UsICJzaG93IGhlbHAgb24gYWxsIGZsYWdzIC0tIHNhbWUgYXMgLWhlbHAiKTsKK0RFRklORV9ib29sICAoaGVscHNob3J0LCAgIGZhbHNlLCAic2hvdyBoZWxwIG9uIG9ubHkgdGhlIG1haW4gbW9kdWxlIGZvciB0aGlzIHByb2dyYW0iKTsKK0RFRklORV9zdHJpbmcoaGVscG9uLCAgICAgICIiLCAgICAic2hvdyBoZWxwIG9uIHRoZSBtb2R1bGVzIG5hbWVkIGJ5IHRoaXMgZmxhZyB2YWx1ZSIpOworREVGSU5FX3N0cmluZyhoZWxwbWF0Y2gsICAgIiIsICAgICJzaG93IGhlbHAgb24gbW9kdWxlcyB3aG9zZSBuYW1lIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgc3Vic3RyIik7CitERUZJTkVfYm9vbCAgKGhlbHBwYWNrYWdlLCBmYWxzZSwgInNob3cgaGVscCBvbiBhbGwgbW9kdWxlcyBpbiB0aGUgbWFpbiBwYWNrYWdlIik7CitERUZJTkVfYm9vbCAgKGhlbHB4bWwsICAgICBmYWxzZSwgInByb2R1Y2UgYW4geG1sIHZlcnNpb24gb2YgaGVscCIpOworREVGSU5FX2Jvb2wgICh2ZXJzaW9uLCAgICAgZmFsc2UsICJzaG93IHZlcnNpb24gYW5kIGJ1aWxkIGluZm8gYW5kIGV4aXQiKTsKKworCituYW1lc3BhY2UgR0ZMQUdTX05BTUVTUEFDRSB7CisKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVzY3JpYmVPbmVGbGFnKCkKKy8vIERlc2NyaWJlT25lRmxhZ0luWE1MKCkKKy8vICAgIFJvdXRpbmVzIHRoYXQgcHJldHR5LXByaW50IGluZm8gYWJvdXQgYSBmbGFnLiAgVGhlc2UgdXNlCisvLyAgICBhIENvbW1hbmRMaW5lRmxhZ0luZm8sIHdoaWNoIGlzIHRoZSB3YXkgdGhlIGdmbGFncworLy8gICAgQVBJIGV4cG9zZXMgc3RhdGljIGluZm8gYWJvdXQgYSBmbGFnLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IGludCBrTGluZUxlbmd0aCA9IDgwOworCitzdGF0aWMgdm9pZCBBZGRTdHJpbmcoY29uc3Qgc3RyaW5nJiBzLAorICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZmluYWxfc3RyaW5nLCBpbnQqIGNoYXJzX2luX2xpbmUpIHsKKyAgY29uc3QgaW50IHNsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KHMubGVuZ3RoKCkpOworICBpZiAoKmNoYXJzX2luX2xpbmUgKyAxICsgc2xlbiA+PSBrTGluZUxlbmd0aCkgeyAgLy8gPCA4MCBjaGFycy9saW5lCisgICAgKmZpbmFsX3N0cmluZyArPSAiXG4gICAgICAiOworICAgICpjaGFyc19pbl9saW5lID0gNjsKKyAgfSBlbHNlIHsKKyAgICAqZmluYWxfc3RyaW5nICs9ICIgIjsKKyAgICAqY2hhcnNfaW5fbGluZSArPSAxOworICB9CisgICpmaW5hbF9zdHJpbmcgKz0gczsKKyAgKmNoYXJzX2luX2xpbmUgKz0gc2xlbjsKK30KKworc3RhdGljIHN0cmluZyBQcmludFN0cmluZ0ZsYWdzV2l0aFF1b3Rlcyhjb25zdCBDb21tYW5kTGluZUZsYWdJbmZvJiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRleHQsIGJvb2wgY3VycmVudCkgeworICBjb25zdCBjaGFyKiBjX3N0cmluZyA9IChjdXJyZW50ID8gZmxhZy5jdXJyZW50X3ZhbHVlLmNfc3RyKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLmRlZmF1bHRfdmFsdWUuY19zdHIoKSk7CisgIGlmIChzdHJjbXAoZmxhZy50eXBlLmNfc3RyKCksICJzdHJpbmciKSA9PSAwKSB7ICAvLyBhZGQgcXVvdGVzIGZvciBzdHJpbmdzCisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJXM6IFwiJXNcIiIsIHRleHQuY19zdHIoKSwgY19zdHJpbmcpOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVzOiAlcyIsIHRleHQuY19zdHIoKSwgY19zdHJpbmcpOworICB9Cit9CisKKy8vIENyZWF0ZSBhIGRlc2NyaXB0aXZlIHN0cmluZyBmb3IgYSBmbGFnLgorLy8gR29lcyB0byBzb21lIHRyb3VibGUgdG8gbWFrZSBwcmV0dHkgbGluZSBicmVha3MuCitzdHJpbmcgRGVzY3JpYmVPbmVGbGFnKGNvbnN0IENvbW1hbmRMaW5lRmxhZ0luZm8mIGZsYWcpIHsKKyAgc3RyaW5nIG1haW5fcGFydDsKKyAgU1N0cmluZ1ByaW50ZigmbWFpbl9wYXJ0LCAiICAgIC0lcyAoJXMpIiwKKyAgICAgICAgICAgICAgICBmbGFnLm5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBmbGFnLmRlc2NyaXB0aW9uLmNfc3RyKCkpOworICBjb25zdCBjaGFyKiBjX3N0cmluZyA9IG1haW5fcGFydC5jX3N0cigpOworICBpbnQgY2hhcnNfbGVmdCA9IHN0YXRpY19jYXN0PGludD4obWFpbl9wYXJ0Lmxlbmd0aCgpKTsKKyAgc3RyaW5nIGZpbmFsX3N0cmluZyA9ICIiOworICBpbnQgY2hhcnNfaW5fbGluZSA9IDA7ICAvLyBob3cgbWFueSBjaGFycyBpbiBjdXJyZW50IGxpbmUgc28gZmFyPworICB3aGlsZSAoMSkgeworICAgIGFzc2VydChjaGFyc19sZWZ0ID09IHN0cmxlbihjX3N0cmluZykpOyAgLy8gVW5sZXNzIHRoZXJlJ3MgYSBcMCBpbiB0aGVyZT8KKyAgICBjb25zdCBjaGFyKiBuZXdsaW5lID0gc3RyY2hyKGNfc3RyaW5nLCAnXG4nKTsKKyAgICBpZiAobmV3bGluZSA9PSBOVUxMICYmIGNoYXJzX2luX2xpbmUrY2hhcnNfbGVmdCA8IGtMaW5lTGVuZ3RoKSB7CisgICAgICAvLyBUaGUgd2hvbGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgZml0cyBvbiB0aGlzIGxpbmUKKyAgICAgIGZpbmFsX3N0cmluZyArPSBjX3N0cmluZzsKKyAgICAgIGNoYXJzX2luX2xpbmUgKz0gY2hhcnNfbGVmdDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobmV3bGluZSAhPSBOVUxMICYmIG5ld2xpbmUgLSBjX3N0cmluZyA8IGtMaW5lTGVuZ3RoIC0gY2hhcnNfaW5fbGluZSkgeworICAgICAgaW50IG4gPSBzdGF0aWNfY2FzdDxpbnQ+KG5ld2xpbmUgLSBjX3N0cmluZyk7CisgICAgICBmaW5hbF9zdHJpbmcuYXBwZW5kKGNfc3RyaW5nLCBuKTsKKyAgICAgIGNoYXJzX2xlZnQgLT0gbiArIDE7CisgICAgICBjX3N0cmluZyArPSBuICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRmluZCB0aGUgbGFzdCB3aGl0ZXNwYWNlIG9uIHRoaXMgODAtY2hhciBsaW5lCisgICAgICBpbnQgd2hpdGVzcGFjZSA9IGtMaW5lTGVuZ3RoLWNoYXJzX2luX2xpbmUtMTsgIC8vIDwgODAgY2hhcnMvbGluZQorICAgICAgd2hpbGUgKCB3aGl0ZXNwYWNlID4gMCAmJiAhaXNzcGFjZShjX3N0cmluZ1t3aGl0ZXNwYWNlXSkgKSB7CisgICAgICAgIC0td2hpdGVzcGFjZTsKKyAgICAgIH0KKyAgICAgIGlmICh3aGl0ZXNwYWNlIDw9IDApIHsKKyAgICAgICAgLy8gQ291bGRuJ3QgZmluZCBhbnkgd2hpdGVzcGFjZSB0byBtYWtlIGEgbGluZSBicmVhay4gIEp1c3QgZHVtcCB0aGUKKyAgICAgICAgLy8gcmVzdCBvdXQhCisgICAgICAgIGZpbmFsX3N0cmluZyArPSBjX3N0cmluZzsKKyAgICAgICAgY2hhcnNfaW5fbGluZSA9IGtMaW5lTGVuZ3RoOyAgLy8gbmV4dCBwYXJ0IGdldHMgaXRzIG93biBsaW5lIGZvciBzdXJlIQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZpbmFsX3N0cmluZyArPSBzdHJpbmcoY19zdHJpbmcsIHdoaXRlc3BhY2UpOworICAgICAgY2hhcnNfaW5fbGluZSArPSB3aGl0ZXNwYWNlOworICAgICAgd2hpbGUgKGlzc3BhY2UoY19zdHJpbmdbd2hpdGVzcGFjZV0pKSAgKyt3aGl0ZXNwYWNlOworICAgICAgY19zdHJpbmcgKz0gd2hpdGVzcGFjZTsKKyAgICAgIGNoYXJzX2xlZnQgLT0gd2hpdGVzcGFjZTsKKyAgICB9CisgICAgaWYgKCpjX3N0cmluZyA9PSAnXDAnKQorICAgICAgYnJlYWs7CisgICAgU3RyaW5nQXBwZW5kRigmZmluYWxfc3RyaW5nLCAiXG4gICAgICAiKTsKKyAgICBjaGFyc19pbl9saW5lID0gNjsKKyAgfQorCisgIC8vIEFwcGVuZCBkYXRhIHR5cGUKKyAgQWRkU3RyaW5nKHN0cmluZygidHlwZTogIikgKyBmbGFnLnR5cGUsICZmaW5hbF9zdHJpbmcsICZjaGFyc19pbl9saW5lKTsKKyAgLy8gVGhlIGxpc3RlZCBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdGhlIGFjdHVhbCBkZWZhdWx0IGZyb20gdGhlIGZsYWcKKyAgLy8gZGVmaW5pdGlvbiBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUsIHVubGVzcyB0aGUgdmFsdWUgaGFzCisgIC8vIHN1YnNlcXVlbnRseSBiZWVuIG1vZGlmaWVkIHVzaW5nIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoKSB3aXRoIG1vZGUKKyAgLy8gU0VUX0ZMQUdTX0RFRkFVTFQsIG9yIGJ5IHNldHRpbmcgRkxBR1NfZm9vID0gYmFyIGJlZm9yZSBQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoKS4KKyAgQWRkU3RyaW5nKFByaW50U3RyaW5nRmxhZ3NXaXRoUXVvdGVzKGZsYWcsICJkZWZhdWx0IiwgZmFsc2UpLCAmZmluYWxfc3RyaW5nLAorICAgICAgICAgICAgJmNoYXJzX2luX2xpbmUpOworICBpZiAoIWZsYWcuaXNfZGVmYXVsdCkgeworICAgIEFkZFN0cmluZyhQcmludFN0cmluZ0ZsYWdzV2l0aFF1b3RlcyhmbGFnLCAiY3VycmVudGx5IiwgdHJ1ZSksCisgICAgICAgICAgICAgICZmaW5hbF9zdHJpbmcsICZjaGFyc19pbl9saW5lKTsKKyAgfQorCisgIFN0cmluZ0FwcGVuZEYoJmZpbmFsX3N0cmluZywgIlxuIik7CisgIHJldHVybiBmaW5hbF9zdHJpbmc7Cit9CisKKy8vIFNpbXBsZSByb3V0aW5lIHRvIHhtbC1lc2NhcGUgYSBzdHJpbmc6IGVzY2FwZSAmIGFuZCA8IG9ubHkuCitzdGF0aWMgc3RyaW5nIFhNTFRleHQoY29uc3Qgc3RyaW5nJiB0eHQpIHsKKyAgc3RyaW5nIGFucyA9IHR4dDsKKyAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOyAocG9zID0gYW5zLmZpbmQoIiYiLCBwb3MpKSAhPSBzdHJpbmc6Om5wb3M7ICkKKyAgICBhbnMucmVwbGFjZShwb3MrKywgMSwgIiZhbXA7Iik7CisgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsgKHBvcyA9IGFucy5maW5kKCI8IiwgcG9zKSkgIT0gc3RyaW5nOjpucG9zOyApCisgICAgYW5zLnJlcGxhY2UocG9zKyssIDEsICImbHQ7Iik7CisgIHJldHVybiBhbnM7Cit9CisKK3N0YXRpYyB2b2lkIEFkZFhNTFRhZyhzdHJpbmcqIHIsIGNvbnN0IGNoYXIqIHRhZywgY29uc3Qgc3RyaW5nJiB0eHQpIHsKKyAgU3RyaW5nQXBwZW5kRihyLCAiPCVzPiVzPC8lcz4iLCB0YWcsIFhNTFRleHQodHh0KS5jX3N0cigpLCB0YWcpOworfQorCisKK3N0YXRpYyBzdHJpbmcgRGVzY3JpYmVPbmVGbGFnSW5YTUwoY29uc3QgQ29tbWFuZExpbmVGbGFnSW5mbyYgZmxhZykgeworICAvLyBUaGUgZmlsZSBhbmQgZmxhZ25hbWUgY291bGQgaGF2ZSBiZWVuIGF0dHJpYnV0ZXMsIGJ1dCBkZWZhdWx0CisgIC8vIGFuZCBtZWFuaW5nIG5lZWQgdG8gYXZvaWQgYXR0cmlidXRlIG5vcm1hbGl6YXRpb24uICBUaGlzIHdheSBpdAorICAvLyBjYW4gYmUgcGFyc2VkIGJ5IHNpbXBsZSBwcm9ncmFtcywgaW4gYWRkaXRpb24gdG8geG1sIHBhcnNlcnMuCisgIHN0cmluZyByKCI8ZmxhZz4iKTsKKyAgQWRkWE1MVGFnKCZyLCAiZmlsZSIsIGZsYWcuZmlsZW5hbWUpOworICBBZGRYTUxUYWcoJnIsICJuYW1lIiwgZmxhZy5uYW1lKTsKKyAgQWRkWE1MVGFnKCZyLCAibWVhbmluZyIsIGZsYWcuZGVzY3JpcHRpb24pOworICBBZGRYTUxUYWcoJnIsICJkZWZhdWx0IiwgZmxhZy5kZWZhdWx0X3ZhbHVlKTsKKyAgQWRkWE1MVGFnKCZyLCAiY3VycmVudCIsIGZsYWcuY3VycmVudF92YWx1ZSk7CisgIEFkZFhNTFRhZygmciwgInR5cGUiLCBmbGFnLnR5cGUpOworICByICs9ICI8L2ZsYWc+IjsKKyAgcmV0dXJuIHI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaG93VXNhZ2VXaXRoRmxhZ3MoKQorLy8gU2hvd1VzYWdlV2l0aEZsYWdzUmVzdHJpY3QoKQorLy8gU2hvd1hNTE9mRmxhZ3MoKQorLy8gICAgVGhlc2Ugcm91dGluZXMgdmFyaW91c2x5IGV4cG9zZSB0aGUgcmVnaXN0cnkncyBsaXN0IG9mIGZsYWcKKy8vICAgIHZhbHVlcy4gIFNob3dVc2FnZSooKSBwcmludHMgdGhlIGZsYWctdmFsdWUgaW5mb3JtYXRpb24KKy8vICAgIHRvIHN0ZG91dCBpbiBhIHVzZXItcmVhZGFibGUgZm9ybWF0ICh0aGF0J3Mgd2hhdCAtLWhlbHAgdXNlcykuCisvLyAgICBUaGUgUmVzdHJpY3QoKSB2ZXJzaW9uIGxpbWl0cyB3aGF0IGZsYWdzIGFyZSBzaG93bi4KKy8vICAgIFNob3dYTUxPZkZsYWdzKCkgcHJpbnRzIHRoZSBmbGFnLXZhbHVlIGluZm9ybWF0aW9uIHRvIHN0ZG91dAorLy8gICAgaW4gYSBtYWNoaW5lLXJlYWRhYmxlIGZvcm1hdC4gIEluIGFsbCBjYXNlcywgdGhlIGZsYWdzIGFyZQorLy8gICAgc29ydGVkOiBmaXJzdCBieSBmaWxlbmFtZSB0aGV5IGFyZSBkZWZpbmVkIGluLCB0aGVuIGJ5IGZsYWduYW1lLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IGNoYXIqIEJhc2VuYW1lKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7CisgIGNvbnN0IGNoYXIqIHNlcCA9IHN0cnJjaHIoZmlsZW5hbWUsIFBBVEhfU0VQQVJBVE9SKTsKKyAgcmV0dXJuIHNlcCA/IHNlcCArIDEgOiBmaWxlbmFtZTsKK30KKworc3RhdGljIHN0cmluZyBEaXJuYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc2VwID0gZmlsZW5hbWUucmZpbmQoUEFUSF9TRVBBUkFUT1IpOworICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyKDAsIChzZXAgPT0gc3RyaW5nOjpucG9zKSA/IDAgOiBzZXApOworfQorCisvLyBUZXN0IHdoZXRoZXIgYSBmaWxlbmFtZSBjb250YWlucyBhdCBsZWFzdCBvbmUgb2YgdGhlIHN1YnN0cmluZ3MuCitzdGF0aWMgYm9vbCBGaWxlTWF0Y2hlc1N1YnN0cmluZyhjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHN1YnN0cmluZ3MpIHsKKyAgZm9yICh2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgdGFyZ2V0ID0gc3Vic3RyaW5ncy5iZWdpbigpOworICAgICAgIHRhcmdldCAhPSBzdWJzdHJpbmdzLmVuZCgpOworICAgICAgICsrdGFyZ2V0KSB7CisgICAgaWYgKHN0cnN0cihmaWxlbmFtZS5jX3N0cigpLCB0YXJnZXQtPmNfc3RyKCkpICE9IE5VTEwpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBJZiB0aGUgc3Vic3RyaW5nIHN0YXJ0cyB3aXRoIGEgJy8nLCB0aGF0IG1lYW5zIHRoYXQgd2Ugd2FudAorICAgIC8vIHRoZSBzdHJpbmcgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGRpcmVjdG9yeSBjb21wb25lbnQuCisgICAgLy8gVGhhdCBzaG91bGQgbWF0Y2ggdGhlIGZpcnN0IGRpcmVjdG9yeSBjb21wb25lbnQgYXMgd2VsbCwgc28KKyAgICAvLyB3ZSBhbGxvdyAnL2ZvbycgdG8gbWF0Y2ggYSBmaWxlbmFtZSBvZiAnZm9vJy4KKyAgICBpZiAoIXRhcmdldC0+ZW1wdHkoKSAmJiAoKnRhcmdldClbMF0gPT0gUEFUSF9TRVBBUkFUT1IgJiYKKyAgICAgICAgc3RybmNtcChmaWxlbmFtZS5jX3N0cigpLCB0YXJnZXQtPmNfc3RyKCkgKyAxLAorICAgICAgICAgICAgICAgIHN0cmxlbih0YXJnZXQtPmNfc3RyKCkgKyAxKSkgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gU2hvdyBoZWxwIGZvciBldmVyeSBmaWxlbmFtZSB3aGljaCBtYXRjaGVzIGFueSBvZiB0aGUgdGFyZ2V0IHN1YnN0cmluZ3MuCisvLyBJZiBzdWJzdHJpbmdzIGlzIGVtcHR5LCBzaG93cyBoZWxwIGZvciBldmVyeSBmaWxlLiBJZiBhIGZsYWcncyBoZWxwIG1lc3NhZ2UKKy8vIGhhcyBiZWVuIHN0cmlwcGVkIChlLmcuIGJ5IGFkZGluZyAnI2RlZmluZSBTVFJJUF9GTEFHX0hFTFAgMScKKy8vIGJlZm9yZSBpbmNsdWRpbmcgZ2ZsYWdzL2dmbGFncy5oKSwgdGhlbiB0aGlzIGZsYWcgd2lsbCBub3QgYmUgZGlzcGxheWVkCisvLyBieSAnLS1oZWxwJyBhbmQgaXRzIHZhcmlhbnRzLgorc3RhdGljIHZvaWQgU2hvd1VzYWdlV2l0aEZsYWdzTWF0Y2hpbmcoY29uc3QgY2hhciAqYXJndjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiAmc3Vic3RyaW5ncykgeworICBmcHJpbnRmKHN0ZG91dCwgIiVzOiAlc1xuIiwgQmFzZW5hbWUoYXJndjApLCBQcm9ncmFtVXNhZ2UoKSk7CisKKyAgdmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+IGZsYWdzOworICBHZXRBbGxGbGFncygmZmxhZ3MpOyAgICAgICAgICAgLy8gZmxhZ3MgYXJlIHNvcnRlZCBieSBmaWxlbmFtZSwgdGhlbiBmbGFnbmFtZQorCisgIHN0cmluZyBsYXN0X2ZpbGVuYW1lOyAgICAgICAgICAvLyBzbyB3ZSBrbm93IHdoZW4gd2UncmUgYXQgYSBuZXcgZmlsZQorICBib29sIGZpcnN0X2RpcmVjdG9yeSA9IHRydWU7ICAgLy8gY29udHJvbHMgYmxhbmsgbGluZXMgYmV0d2VlbiBkaXJzCisgIGJvb2wgZm91bmRfbWF0Y2ggPSBmYWxzZTsgICAgICAvLyBzdGF5cyBmYWxzZSBpZmYgbm8gZGlyIG1hdGNoZXMgcmVzdHJpY3QKKyAgZm9yICh2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGZsYWcgPSBmbGFncy5iZWdpbigpOworICAgICAgIGZsYWcgIT0gZmxhZ3MuZW5kKCk7CisgICAgICAgKytmbGFnKSB7CisgICAgaWYgKHN1YnN0cmluZ3MuZW1wdHkoKSB8fAorICAgICAgICBGaWxlTWF0Y2hlc1N1YnN0cmluZyhmbGFnLT5maWxlbmFtZSwgc3Vic3RyaW5ncykpIHsKKyAgICAgIC8vIElmIHRoZSBmbGFnIGhhcyBiZWVuIHN0cmlwcGVkLCBwcmV0ZW5kIHRoYXQgaXQgZG9lc24ndCBleGlzdC4KKyAgICAgIGlmIChmbGFnLT5kZXNjcmlwdGlvbiA9PSBrU3RyaXBwZWRGbGFnSGVscCkgY29udGludWU7CisgICAgICBmb3VuZF9tYXRjaCA9IHRydWU7ICAgICAvLyB0aGlzIGZsYWcgcGFzc2VkIHRoZSBtYXRjaCEKKyAgICAgIGlmIChmbGFnLT5maWxlbmFtZSAhPSBsYXN0X2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBmaWxlCisgICAgICAgIGlmIChEaXJuYW1lKGZsYWctPmZpbGVuYW1lKSAhPSBEaXJuYW1lKGxhc3RfZmlsZW5hbWUpKSB7ICAvLyBuZXcgZGlyIQorICAgICAgICAgIGlmICghZmlyc3RfZGlyZWN0b3J5KQorICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJcblxuIik7ICAgLy8gcHV0IGJsYW5rIGxpbmVzIGJldHdlZW4gZGlyZWN0b3JpZXMKKyAgICAgICAgICBmaXJzdF9kaXJlY3RvcnkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuICBGbGFncyBmcm9tICVzOlxuIiwgZmxhZy0+ZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgIGxhc3RfZmlsZW5hbWUgPSBmbGFnLT5maWxlbmFtZTsKKyAgICAgIH0KKyAgICAgIC8vIE5vdyBwcmludCB0aGlzIGZsYWcKKyAgICAgIGZwcmludGYoc3Rkb3V0LCAiJXMiLCBEZXNjcmliZU9uZUZsYWcoKmZsYWcpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBpZiAoIWZvdW5kX21hdGNoICYmICFzdWJzdHJpbmdzLmVtcHR5KCkpIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwgIlxuICBObyBtb2R1bGVzIG1hdGNoZWQ6IHVzZSAtaGVscFxuIik7CisgIH0KK30KKwordm9pZCBTaG93VXNhZ2VXaXRoRmxhZ3NSZXN0cmljdChjb25zdCBjaGFyICphcmd2MCwgY29uc3QgY2hhciAqcmVzdHJpY3QpIHsKKyAgdmVjdG9yPHN0cmluZz4gc3Vic3RyaW5nczsKKyAgaWYgKHJlc3RyaWN0ICE9IE5VTEwgJiYgKnJlc3RyaWN0ICE9ICdcMCcpIHsKKyAgICBzdWJzdHJpbmdzLnB1c2hfYmFjayhyZXN0cmljdCk7CisgIH0KKyAgU2hvd1VzYWdlV2l0aEZsYWdzTWF0Y2hpbmcoYXJndjAsIHN1YnN0cmluZ3MpOworfQorCit2b2lkIFNob3dVc2FnZVdpdGhGbGFncyhjb25zdCBjaGFyICphcmd2MCkgeworICBTaG93VXNhZ2VXaXRoRmxhZ3NSZXN0cmljdChhcmd2MCwgIiIpOworfQorCisvLyBDb252ZXJ0IHRoZSBoZWxwLCBwcm9ncmFtLCBhbmQgdXNhZ2UgdG8geG1sLgorc3RhdGljIHZvaWQgU2hvd1hNTE9mRmxhZ3MoY29uc3QgY2hhciAqcHJvZ19uYW1lKSB7CisgIHZlY3RvcjxDb21tYW5kTGluZUZsYWdJbmZvPiBmbGFnczsKKyAgR2V0QWxsRmxhZ3MoJmZsYWdzKTsgICAvLyBmbGFncyBhcmUgc29ydGVkOiBieSBmaWxlbmFtZSwgdGhlbiBmbGFnbmFtZQorCisgIC8vIFhNTC4gIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgc2NoZW1hIHlldAorICBmcHJpbnRmKHN0ZG91dCwgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4iKTsKKyAgLy8gVGhlIGRvY3VtZW50CisgIGZwcmludGYoc3Rkb3V0LCAiPEFsbEZsYWdzPlxuIik7CisgIC8vIHRoZSBwcm9ncmFtIG5hbWUgYW5kIHVzYWdlCisgIGZwcmludGYoc3Rkb3V0LCAiPHByb2dyYW0+JXM8L3Byb2dyYW0+XG4iLAorICAgICAgICAgIFhNTFRleHQoQmFzZW5hbWUocHJvZ19uYW1lKSkuY19zdHIoKSk7CisgIGZwcmludGYoc3Rkb3V0LCAiPHVzYWdlPiVzPC91c2FnZT5cbiIsCisgICAgICAgICAgWE1MVGV4dChQcm9ncmFtVXNhZ2UoKSkuY19zdHIoKSk7CisgIC8vIEFsbCB0aGUgZmxhZ3MKKyAgZm9yICh2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGZsYWcgPSBmbGFncy5iZWdpbigpOworICAgICAgIGZsYWcgIT0gZmxhZ3MuZW5kKCk7CisgICAgICAgKytmbGFnKSB7CisgICAgaWYgKGZsYWctPmRlc2NyaXB0aW9uICE9IGtTdHJpcHBlZEZsYWdIZWxwKQorICAgICAgZnByaW50ZihzdGRvdXQsICIlc1xuIiwgRGVzY3JpYmVPbmVGbGFnSW5YTUwoKmZsYWcpLmNfc3RyKCkpOworICB9CisgIC8vIFRoZSBlbmQgb2YgdGhlIGRvY3VtZW50CisgIGZwcmludGYoc3Rkb3V0LCAiPC9BbGxGbGFncz5cbiIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2hvd1ZlcnNpb24oKQorLy8gICAgQ2FsbGVkIHVwb24gLS12ZXJzaW9uLiAgUHJpbnRzIGJ1aWxkLXJlbGF0ZWQgaW5mby4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIFNob3dWZXJzaW9uKCkgeworICBjb25zdCBjaGFyKiB2ZXJzaW9uX3N0cmluZyA9IFZlcnNpb25TdHJpbmcoKTsKKyAgaWYgKHZlcnNpb25fc3RyaW5nICYmICp2ZXJzaW9uX3N0cmluZykgeworICAgIGZwcmludGYoc3Rkb3V0LCAiJXMgdmVyc2lvbiAlc1xuIiwKKyAgICAgICAgICAgIFByb2dyYW1JbnZvY2F0aW9uU2hvcnROYW1lKCksIHZlcnNpb25fc3RyaW5nKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCBQcm9ncmFtSW52b2NhdGlvblNob3J0TmFtZSgpKTsKKyAgfQorIyBpZiAhZGVmaW5lZChOREVCVUcpCisgIGZwcmludGYoc3Rkb3V0LCAiRGVidWcgYnVpbGQgKE5ERUJVRyBub3QgI2RlZmluZWQpXG4iKTsKKyMgZW5kaWYKK30KKworc3RhdGljIHZvaWQgQXBwZW5kUHJvZ25hbWVTdHJpbmdzKHZlY3RvcjxzdHJpbmc+KiBzdWJzdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb2duYW1lKSB7CisgIHN0cmluZyByKCIiKTsKKyAgciArPSBQQVRIX1NFUEFSQVRPUjsKKyAgciArPSBwcm9nbmFtZTsKKyAgc3Vic3RyaW5ncy0+cHVzaF9iYWNrKHIgKyAiLiIpOworICBzdWJzdHJpbmdzLT5wdXNoX2JhY2sociArICItbWFpbi4iKTsKKyAgc3Vic3RyaW5ncy0+cHVzaF9iYWNrKHIgKyAiX21haW4uIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYW5kbGVDb21tYW5kTGluZUhlbHBGbGFncygpCisvLyAgICBDaGVja3MgYWxsIHRoZSAncmVwb3J0aW5nJyBjb21tYW5kbGluZSBmbGFncyB0byBzZWUgaWYgYW55CisvLyAgICBoYXZlIGJlZW4gc2V0LiAgSWYgc28sIGhhbmRsZXMgdGhlbSBhcHByb3ByaWF0ZWx5LiAgTm90ZQorLy8gICAgdGhhdCBhbGwgb2YgdGhlbSwgYnkgZGVmaW5pdGlvbiwgY2F1c2UgdGhlIHByb2dyYW0gdG8gZXhpdAorLy8gICAgaWYgdGhleSB0cmlnZ2VyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBIYW5kbGVDb21tYW5kTGluZUhlbHBGbGFncygpIHsKKyAgY29uc3QgY2hhciogcHJvZ25hbWUgPSBQcm9ncmFtSW52b2NhdGlvblNob3J0TmFtZSgpOworCisgIEhhbmRsZUNvbW1hbmRMaW5lQ29tcGxldGlvbnMoKTsKKworICB2ZWN0b3I8c3RyaW5nPiBzdWJzdHJpbmdzOworICBBcHBlbmRQcm9nbmFtZVN0cmluZ3MoJnN1YnN0cmluZ3MsIHByb2duYW1lKTsKKworICBpZiAoRkxBR1NfaGVscHNob3J0KSB7CisgICAgLy8gc2hvdyBvbmx5IGZsYWdzIHJlbGF0ZWQgdG8gdGhpcyBiaW5hcnk6CisgICAgLy8gRS5nLiBmb3IgZmlsZXV0aWwuY2MsIHdhbnQgZmxhZ3MgY29udGFpbmluZyAgIC4uLiAiL2ZpbGV1dGlsLiIgY2MKKyAgICBTaG93VXNhZ2VXaXRoRmxhZ3NNYXRjaGluZyhwcm9nbmFtZSwgc3Vic3RyaW5ncyk7CisgICAgZ2ZsYWdzX2V4aXRmdW5jKDEpOworCisgIH0gZWxzZSBpZiAoRkxBR1NfaGVscCB8fCBGTEFHU19oZWxwZnVsbCkgeworICAgIC8vIHNob3cgYWxsIG9wdGlvbnMKKyAgICBTaG93VXNhZ2VXaXRoRmxhZ3NSZXN0cmljdChwcm9nbmFtZSwgIiIpOyAgIC8vIGVtcHR5IHJlc3RyaWN0CisgICAgZ2ZsYWdzX2V4aXRmdW5jKDEpOworCisgIH0gZWxzZSBpZiAoIUZMQUdTX2hlbHBvbi5lbXB0eSgpKSB7CisgICAgc3RyaW5nIHJlc3RyaWN0ID0gUEFUSF9TRVBBUkFUT1IgKyBGTEFHU19oZWxwb24gKyAiLiI7CisgICAgU2hvd1VzYWdlV2l0aEZsYWdzUmVzdHJpY3QocHJvZ25hbWUsIHJlc3RyaWN0LmNfc3RyKCkpOworICAgIGdmbGFnc19leGl0ZnVuYygxKTsKKworICB9IGVsc2UgaWYgKCFGTEFHU19oZWxwbWF0Y2guZW1wdHkoKSkgeworICAgIFNob3dVc2FnZVdpdGhGbGFnc1Jlc3RyaWN0KHByb2duYW1lLCBGTEFHU19oZWxwbWF0Y2guY19zdHIoKSk7CisgICAgZ2ZsYWdzX2V4aXRmdW5jKDEpOworCisgIH0gZWxzZSBpZiAoRkxBR1NfaGVscHBhY2thZ2UpIHsKKyAgICAvLyBTaG93cyBoZWxwIGZvciBhbGwgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIG1haW4oKS4gIFdlCisgICAgLy8gZG9uJ3Qgd2FudCB0byByZXNvcnQgdG8gbG9va2luZyBhdCBkaXJuYW1lKHByb2duYW1lKSwgYmVjYXVzZQorICAgIC8vIHRoZSB1c2VyIGNhbiBwaWNrIHByb2duYW1lLCBhbmQgaXQgbWF5IG5vdCByZWxhdGUgdG8gdGhlIGZpbGUKKyAgICAvLyB3aGVyZSBtYWluKCkgcmVzaWRlcy4gIFNvIGluc3RlYWQsIHdlIHNlYXJjaCB0aGUgZmxhZ3MgZm9yIGEKKyAgICAvLyBmaWxlbmFtZSBsaWtlICIvcHJvZ25hbWUuY2MiLCBhbmQgdGFrZSB0aGUgZGlybmFtZSBvZiB0aGF0LgorICAgIHZlY3RvcjxDb21tYW5kTGluZUZsYWdJbmZvPiBmbGFnczsKKyAgICBHZXRBbGxGbGFncygmZmxhZ3MpOworICAgIHN0cmluZyBsYXN0X3BhY2thZ2U7CisgICAgZm9yICh2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGZsYWcgPSBmbGFncy5iZWdpbigpOworICAgICAgICAgZmxhZyAhPSBmbGFncy5lbmQoKTsKKyAgICAgICAgICsrZmxhZykgeworICAgICAgaWYgKCFGaWxlTWF0Y2hlc1N1YnN0cmluZyhmbGFnLT5maWxlbmFtZSwgc3Vic3RyaW5ncykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgY29uc3Qgc3RyaW5nIHBhY2thZ2UgPSBEaXJuYW1lKGZsYWctPmZpbGVuYW1lKSArIFBBVEhfU0VQQVJBVE9SOworICAgICAgaWYgKHBhY2thZ2UgIT0gbGFzdF9wYWNrYWdlKSB7CisgICAgICAgIFNob3dVc2FnZVdpdGhGbGFnc1Jlc3RyaWN0KHByb2duYW1lLCBwYWNrYWdlLmNfc3RyKCkpOworICAgICAgICBWTE9HKDcpIDw8ICJGb3VuZCBwYWNrYWdlOiAiIDw8IHBhY2thZ2U7CisgICAgICAgIGlmICghbGFzdF9wYWNrYWdlLmVtcHR5KCkpIHsgICAgICAvLyBtZWFucyB0aGlzIGlzbid0IG91ciBmaXJzdCBwa2cKKyAgICAgICAgICBMT0coV0FSTklORykgPDwgIk11bHRpcGxlIHBhY2thZ2VzIGNvbnRhaW4gYSBmaWxlPSIgPDwgcHJvZ25hbWU7CisgICAgICAgIH0KKyAgICAgICAgbGFzdF9wYWNrYWdlID0gcGFja2FnZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGxhc3RfcGFja2FnZS5lbXB0eSgpKSB7ICAgLy8gbmV2ZXIgZm91bmQgYSBwYWNrYWdlIHRvIHByaW50CisgICAgICBMT0coV0FSTklORykgPDwgIlVuYWJsZSB0byBmaW5kIGEgcGFja2FnZSBmb3IgZmlsZT0iIDw8IHByb2duYW1lOworICAgIH0KKyAgICBnZmxhZ3NfZXhpdGZ1bmMoMSk7CisKKyAgfSBlbHNlIGlmIChGTEFHU19oZWxweG1sKSB7CisgICAgU2hvd1hNTE9mRmxhZ3MocHJvZ25hbWUpOworICAgIGdmbGFnc19leGl0ZnVuYygxKTsKKworICB9IGVsc2UgaWYgKEZMQUdTX3ZlcnNpb24pIHsKKyAgICBTaG93VmVyc2lvbigpOworICAgIC8vIFVubGlrZSBoZWxwLCB3ZSBtYXkgYmUgYXNraW5nIGZvciB2ZXJzaW9uIGluIGEgc2NyaXB0LCBzbyByZXR1cm4gMAorICAgIGdmbGFnc19leGl0ZnVuYygwKTsKKworICB9Cit9CisKKworfSAvLyBuYW1lc3BhY2UgR0ZMQUdTX05BTUVTUEFDRQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9tdXRleC5oIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZGQ5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL211dGV4LmgKQEAgLTAsMCArMSwzNTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8gCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLyAKKy8vIC0tLQorLy8KKy8vIEEgc2ltcGxlIG11dGV4IHdyYXBwZXIsIHN1cHBvcnRpbmcgbG9ja3MgYW5kIHJlYWQtd3JpdGUgbG9ja3MuCisvLyBZb3Ugc2hvdWxkIGFzc3VtZSB0aGUgbG9ja3MgYXJlICpub3QqIHJlLWVudHJhbnQuCisvLworLy8gVGhpcyBjbGFzcyBpcyBtZWFudCB0byBiZSBpbnRlcm5hbC1vbmx5IGFuZCBzaG91bGQgYmUgd3JhcHBlZCBieSBhbgorLy8gaW50ZXJuYWwgbmFtZXNwYWNlLiAgQmVmb3JlIHlvdSB1c2UgdGhpcyBtb2R1bGUsIHBsZWFzZSBnaXZlIHRoZQorLy8gbmFtZSBvZiB5b3VyIGludGVybmFsIG5hbWVzcGFjZSBmb3IgdGhpcyBtb2R1bGUuICBPciwgaWYgeW91IHdhbnQKKy8vIHRvIGV4cG9zZSBpdCwgeW91J2xsIHdhbnQgdG8gbW92ZSBpdCB0byB0aGUgR29vZ2xlIG5hbWVzcGFjZS4gIFdlCisvLyBjYW5ub3QgcHV0IHRoaXMgY2xhc3MgaW4gZ2xvYmFsIG5hbWVzcGFjZSBiZWNhdXNlIHRoZXJlIGNhbiBiZSBzb21lCisvLyBwcm9ibGVtcyB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTXV0ZXggaW4gZWFjaCBzaGFyZWQgb2JqZWN0LgorLy8KKy8vIE5PVEU6IGJ5IGRlZmF1bHQsIHdlIGhhdmUgI2lmZGVmJ2VkIG91dCB0aGUgVHJ5TG9jaygpIG1ldGhvZC4KKy8vICAgICAgIFRoaXMgaXMgZm9yIHR3byByZWFzb25zOgorLy8gMSkgVHJ5TG9jaygpIHVuZGVyIFdpbmRvd3MgaXMgYSBiaXQgYW5ub3lpbmcgKGl0IHJlcXVpcmVzIGEKKy8vICAgICNkZWZpbmUgdG8gYmUgZGVmaW5lZCB2ZXJ5IGVhcmx5KS4KKy8vIDIpIFRyeUxvY2soKSBpcyBicm9rZW4gZm9yIE5PX1RIUkVBRFMgbW9kZSwgYXQgbGVhc3QgaW4gTkRFQlVHCisvLyAgICBtb2RlLgorLy8gSWYgeW91IG5lZWQgVHJ5TG9jaygpLCBhbmQgZWl0aGVyIHRoZXNlIHR3byBjYXZlYXRzIGFyZSBub3QgYQorLy8gcHJvYmxlbSBmb3IgeW91LCBvciB5b3UncmUgd2lsbGluZyB0byB3b3JrIGFyb3VuZCB0aGVtLCB0aGVuCisvLyBmZWVsIGZyZWUgdG8gI2RlZmluZSBHTVVURVhfVFJZTE9DSywgb3IgdG8gcmVtb3ZlIHRoZSAjaWZkZWZzCisvLyBpbiB0aGUgY29kZSBiZWxvdy4KKy8vCisvLyBDWUdXSU4gTk9URTogQ3lnd2luIHN1cHBvcnQgZm9yIHJ3bG9jayBzZWVtcyB0byBiZSBidWdneToKKy8vICAgIGh0dHA6Ly93d3cuY3lnd2luLmNvbS9tbC9jeWd3aW4vMjAwOC0xMi9tc2cwMDAxNy5odG1sCisvLyBCZWNhdXNlIG9mIHRoYXQsIHdlIG1pZ2h0IGFzIHdlbGwgdXNlIHdpbmRvd3MgbG9ja3MgZm9yCisvLyBjeWd3aW4uICBUaGV5IHNlZW0gdG8gYmUgbW9yZSByZWxpYWJsZSB0aGFuIHRoZSBjeWd3aW4gcHRocmVhZHMgbGF5ZXIuCisvLworLy8gVFJJQ0tZIElNUExFTUVOVEFUSU9OIE5PVEU6CisvLyBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIHNhZmUgdG8gdXNlIGR1cmluZworLy8gZHluYW1pYy1pbml0aWFsaXphdGlvbiAtLSB0aGF0IGlzLCBieSBnbG9iYWwgY29uc3RydWN0b3JzIHRoYXQgYXJlCisvLyBydW4gYmVmb3JlIG1haW4oKSBzdGFydHMuICBUaGUgaXNzdWUgaW4gdGhpcyBjYXNlIGlzIHRoYXQKKy8vIGR5bmFtaWMtaW5pdGlhbGl6YXRpb24gaGFwcGVucyBpbiBhbiB1bnByZWRpY3RhYmxlIG9yZGVyLCBhbmQgaXQKKy8vIGNvdWxkIGJlIHRoYXQgc29tZW9uZSBlbHNlJ3MgZHluYW1pYyBpbml0aWFsaXplciBjb3VsZCBjYWxsIGEKKy8vIGZ1bmN0aW9uIHRoYXQgdHJpZXMgdG8gYWNxdWlyZSB0aGlzIG11dGV4IC0tIGJ1dCB0aGF0IGFsbCBoYXBwZW5zCisvLyBiZWZvcmUgdGhpcyBtdXRleCdzIGNvbnN0cnVjdG9yIGhhcyBydW4uICAoVGhpcyBjYW4gaGFwcGVuIGV2ZW4gaWYKKy8vIHRoZSBtdXRleCBhbmQgdGhlIGZ1bmN0aW9uIHRoYXQgdXNlcyB0aGUgbXV0ZXggYXJlIGluIHRoZSBzYW1lIC5jYworLy8gZmlsZS4pICBCYXNpY2FsbHksIGJlY2F1c2UgTXV0ZXggZG9lcyBub24tdHJpdmlhbCB3b3JrIGluIGl0cworLy8gY29uc3RydWN0b3IsIGl0J3Mgbm90LCBpbiB0aGUgbmFpdmUgaW1wbGVtZW50YXRpb24sIHNhZmUgdG8gdXNlCisvLyBiZWZvcmUgZHluYW1pYyBpbml0aWFsaXphdGlvbiBoYXMgcnVuIG9uIGl0LgorLy8KKy8vIFRoZSBzb2x1dGlvbiB1c2VkIGhlcmUgaXMgdG8gcGFpciB0aGUgYWN0dWFsIG11dGV4IHByaW1pdGl2ZSB3aXRoIGEKKy8vIGJvb2wgdGhhdCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBtdXRleCBpcyBkeW5hbWljYWxseSBpbml0aWFsaXplZC4KKy8vIChCZWZvcmUgdGhhdCBpdCdzIGZhbHNlLikgIFRoZW4gd2UgbW9kaWZ5IGFsbCBtdXRleCByb3V0aW5lcyB0bworLy8gbG9vayBhdCB0aGUgYm9vbCwgYW5kIG5vdCB0cnkgdG8gbG9jay91bmxvY2sgdW50aWwgdGhlIGJvb2wgbWFrZXMKKy8vIGl0IHRvIHRydWUgKHdoaWNoIGhhcHBlbnMgYWZ0ZXIgdGhlIE11dGV4IGNvbnN0cnVjdG9yIGhhcyBydW4uKQorLy8KKy8vIFRoaXMgd29ya3MgYmVjYXVzZSBiZWZvcmUgbWFpbigpIHN0YXJ0cyAtLSBwYXJ0aWN1bGFybHksIGR1cmluZworLy8gZHluYW1pYyBpbml0aWFsaXphdGlvbiAtLSB0aGVyZSBhcmUgbm8gdGhyZWFkcywgc28gYSkgaXQncyBvayB0aGF0CisvLyB0aGUgbXV0ZXggb3BlcmF0aW9ucyBhcmUgYSBuby1vcCwgc2luY2Ugd2UgZG9uJ3QgbmVlZCBsb2NraW5nIHRoZW4KKy8vIGFueXdheTsgYW5kIGIpIHdlIGNhbiBiZSBxdWl0ZSBjb25maWRlbnQgb3VyIGJvb2wgd29uJ3QgY2hhbmdlCisvLyBzdGF0ZSBiZXR3ZWVuIGEgY2FsbCB0byBMb2NrKCkgYW5kIGEgY2FsbCB0byBVbmxvY2soKSAodGhhdCB3b3VsZAorLy8gcmVxdWlyZSBhIGdsb2JhbCBjb25zdHJ1Y3RvciBpbiBvbmUgdHJhbnNsYXRpb24gdW5pdCB0byBjYWxsIExvY2soKQorLy8gYW5kIGFub3RoZXIgZ2xvYmFsIGNvbnN0cnVjdG9yIGluIGFub3RoZXIgdHJhbnNsYXRpb24gdW5pdCB0byBjYWxsCisvLyBVbmxvY2soKSBsYXRlciwgd2hpY2ggaXMgcHJldHR5IHBlcnZlcnNlKS4KKy8vCisvLyBUaGF0IHNhaWQsIGl0J3MgdHJpY2t5LCBhbmQgY2FuIGNvbmNlaXZhYmx5IGZhaWw7IGl0J3Mgc2FmZXN0IHRvCisvLyBhdm9pZCB0cnlpbmcgdG8gYWNxdWlyZSBhIG11dGV4IGluIGEgZ2xvYmFsIGNvbnN0cnVjdG9yLCBpZiB5b3UKKy8vIGNhbi4gIE9uZSB3YXkgaXQgY2FuIGZhaWwgaXMgdGhhdCBhIHJlYWxseSBzbWFydCBjb21waWxlciBtaWdodAorLy8gaW5pdGlhbGl6ZSB0aGUgYm9vbCB0byB0cnVlIGF0IHN0YXRpYy1pbml0aWFsaXphdGlvbiB0aW1lICh0b28KKy8vIGVhcmx5KSByYXRoZXIgdGhhbiBhdCBkeW5hbWljLWluaXRpYWxpemF0aW9uIHRpbWUuICBUbyBkaXNjb3VyYWdlCisvLyB0aGF0LCB3ZSBzZXQgaXNfc2FmZV8gdG8gdHJ1ZSBpbiBjb2RlIChub3QgdGhlIGNvbnN0cnVjdG9yCisvLyBjb2xvbi1pbml0aWFsaXplcikgYW5kIHNldCBpdCB0byB0cnVlIHZpYSBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzCisvLyBldmFsdWF0ZXMgdG8gdHJ1ZSwgYnV0IHRoYXQgdGhlIGNvbXBpbGVyIGNhbid0IGtub3cgYWx3YXlzCisvLyBldmFsdWF0ZXMgdG8gdHJ1ZS4gIFRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLgorLy8KKy8vIEEgcmVsYXRlZCBpc3N1ZSBpcyBjb2RlIHRoYXQgY291bGQgdHJ5IHRvIGFjY2VzcyB0aGUgbXV0ZXgKKy8vIGFmdGVyIGl0J3MgYmVlbiBkZXN0cm95ZWQgaW4gdGhlIGdsb2JhbCBkZXN0cnVjdG9ycyAoYmVjYXVzZQorLy8gdGhlIE11dGV4IGdsb2JhbCBkZXN0cnVjdG9yIHJ1bnMgYmVmb3JlIHNvbWUgb3RoZXIgZ2xvYmFsCisvLyBkZXN0cnVjdG9yLCB0aGF0IHRyaWVzIHRvIGFjcXVpcmUgdGhlIG11dGV4KS4gIFRoZSB3YXkgd2UKKy8vIGRlYWwgd2l0aCB0aGlzIGlzIGJ5IHRha2luZyBhIGNvbnN0cnVjdG9yIGFyZyB0aGF0IGdsb2JhbAorLy8gbXV0ZXhlcyBzaG91bGQgcGFzcyBpbiwgdGhhdCBjYXVzZXMgdGhlIGRlc3RydWN0b3IgdG8gZG8gbm8KKy8vIHdvcmsuICBXZSBzdGlsbCBkZXBlbmQgb24gdGhlIGNvbXBpbGVyIG5vdCBkb2luZyBhbnl0aGluZworLy8gd2VpcmQgdG8gYSBNdXRleCdzIG1lbW9yeSBhZnRlciBpdCBpcyBkZXN0cm95ZWQsIGJ1dCBmb3IgYQorLy8gc3RhdGljIGdsb2JhbCB2YXJpYWJsZSwgdGhhdCdzIHByZXR0eSBzYWZlLgorCisjaWZuZGVmIEdGTEFHU19NVVRFWF9IXworI2RlZmluZSBHRkxBR1NfTVVURVhfSF8KKworI2luY2x1ZGUgImdmbGFnc19kZWNsYXJlLmgiICAgICAvLyB0byBmaWd1cmUgb3V0IHB0aHJlYWRzIHN1cHBvcnQKKworI2lmIGRlZmluZWQoTk9fVEhSRUFEUykKKyAgdHlwZWRlZiBpbnQgTXV0ZXhUeXBlOyAgICAgICAgLy8gdG8ga2VlcCBhIGxvY2stY291bnQKKyNlbGlmIGRlZmluZWQoT1NfV0lORE9XUykKKyMgaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAgLy8gV2Ugb25seSBuZWVkIG1pbmltYWwgaW5jbHVkZXMKKyMgZW5kaWYKKyMgaWZuZGVmIE5PTUlOTUFYCisjICAgZGVmaW5lIE5PTUlOTUFYICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgd2luZG93cyB0byBvdmVycmlkZSBtaW4oKS9tYXgoKQorIyBlbmRpZgorIyBpZmRlZiBHTVVURVhfVFJZTE9DSworICAvLyBXZSBuZWVkIFdpbmRvd3MgTlQgb3IgbGF0ZXIgZm9yIFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKCkuICBJZiB5b3UKKyAgLy8gZG9uJ3QgbmVlZCB0aGF0IGZ1bmN0aW9uYWxpdHksIHlvdSBjYW4gcmVtb3ZlIHRoZXNlIF9XSU4zMl9XSU5OVAorICAvLyBsaW5lcywgYW5kIGNoYW5nZSBUcnlMb2NrKCkgdG8gYXNzZXJ0KDApIG9yIHNvbWV0aGluZy4KKyMgICBpZm5kZWYgX1dJTjMyX1dJTk5UCisjICAgICBkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDQwMAorIyAgIGVuZGlmCisjIGVuZGlmCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyAgdHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OIE11dGV4VHlwZTsKKyNlbGlmIGRlZmluZWQoSEFWRV9QVEhSRUFEKSAmJiBkZWZpbmVkKEhBVkVfUldMT0NLKQorICAvLyBOZWVkZWQgZm9yIHB0aHJlYWRfcndsb2NrXyouICBJZiBpdCBjYXVzZXMgcHJvYmxlbXMsIHlvdSBjb3VsZCB0YWtlIGl0CisgIC8vIG91dCwgYnV0IHRoZW4geW91J2QgaGF2ZSB0byB1bnNldCBIQVZFX1JXTE9DSyAoYXQgbGVhc3Qgb24gbGludXggLS0gaXQKKyAgLy8gKmRvZXMqIGNhdXNlIHByb2JsZW1zIGZvciBGcmVlQlNELCBvciBNYWNPU1gsIGJ1dCBpc24ndCBuZWVkZWQKKyAgLy8gZm9yIGxvY2tpbmcgdGhlcmUuKQorIyBpZmRlZiBfX2xpbnV4X18KKyMgICBpZiBfWE9QRU5fU09VUkNFIDwgNTAwICAgICAgLy8gaW5jbHVkaW5nIG5vdCBiZWluZyBkZWZpbmVkIGF0IGFsbAorIyAgICAgdW5kZWYgX1hPUEVOX1NPVVJDRQorIyAgICAgZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNTAwICAvLyBtYXkgYmUgbmVlZGVkIHRvIGdldCB0aGUgcndsb2NrIGNhbGxzCisjICAgZW5kaWYKKyMgZW5kaWYKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorICB0eXBlZGVmIHB0aHJlYWRfcndsb2NrX3QgTXV0ZXhUeXBlOworI2VsaWYgZGVmaW5lZChIQVZFX1BUSFJFQUQpCisjIGluY2x1ZGUgPHB0aHJlYWQuaD4KKyAgdHlwZWRlZiBwdGhyZWFkX211dGV4X3QgTXV0ZXhUeXBlOworI2Vsc2UKKyMgZXJyb3IgTmVlZCB0byBpbXBsZW1lbnQgbXV0ZXguaCBmb3IgeW91ciBhcmNoaXRlY3R1cmUsIG9yICNkZWZpbmUgTk9fVEhSRUFEUworI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAvLyBmb3IgYWJvcnQoKQorCisjZGVmaW5lIE1VVEVYX05BTUVTUEFDRSBnZmxhZ3NfbXV0ZXhfbmFtZXNwYWNlCisKK25hbWVzcGFjZSBNVVRFWF9OQU1FU1BBQ0UgeworCitjbGFzcyBNdXRleCB7CisgcHVibGljOgorICAvLyBUaGlzIGlzIHVzZWQgZm9yIHRoZSBzaW5nbGUtYXJnIGNvbnN0cnVjdG9yCisgIGVudW0gTGlua2VySW5pdGlhbGl6ZWQgeyBMSU5LRVJfSU5JVElBTElaRUQgfTsKKworICAvLyBDcmVhdGUgYSBNdXRleCB0aGF0IGlzIG5vdCBoZWxkIGJ5IGFueWJvZHkuICBUaGlzIGNvbnN0cnVjdG9yIGlzCisgIC8vIHR5cGljYWxseSB1c2VkIGZvciBNdXRleGVzIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBvciB0aGUgc3RhY2suCisgIGlubGluZSBNdXRleCgpOworICAvLyBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGZvciBnbG9iYWwsIHN0YXRpYyBNdXRleCBvYmplY3RzLgorICAvLyBJdCBpbmhpYml0cyB3b3JrIGJlaW5nIGRvbmUgYnkgdGhlIGRlc3RydWN0b3IsIHdoaWNoIG1ha2VzIGl0CisgIC8vIHNhZmVyIGZvciBjb2RlIHRoYXQgdHJpZXMgdG8gYWNxaXVyZSB0aGlzIG11dGV4IGluIHRoZWlyIGdsb2JhbAorICAvLyBkZXN0cnVjdG9yLgorICBpbmxpbmUgTXV0ZXgoTGlua2VySW5pdGlhbGl6ZWQpOworCisgIC8vIERlc3RydWN0b3IKKyAgaW5saW5lIH5NdXRleCgpOworCisgIGlubGluZSB2b2lkIExvY2soKTsgICAgLy8gQmxvY2sgaWYgbmVlZGVkIHVudGlsIGZyZWUgdGhlbiBhY3F1aXJlIGV4Y2x1c2l2ZWx5CisgIGlubGluZSB2b2lkIFVubG9jaygpOyAgLy8gUmVsZWFzZSBhIGxvY2sgYWNxdWlyZWQgdmlhIExvY2soKQorI2lmZGVmIEdNVVRFWF9UUllMT0NLCisgIGlubGluZSBib29sIFRyeUxvY2soKTsgLy8gSWYgZnJlZSwgTG9jaygpIGFuZCByZXR1cm4gdHJ1ZSwgZWxzZSByZXR1cm4gZmFsc2UKKyNlbmRpZgorICAvLyBOb3RlIHRoYXQgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgcmVhZC13cml0ZSBsb2NrcywgdGhlc2UgbWF5CisgIC8vIGJlIGltcGxlbWVudGVkIGFzIHN5bm9ueW1zIHRvIExvY2soKSBhbmQgVW5sb2NrKCkuICBTbyB5b3UgY2FuIHVzZQorICAvLyB0aGVzZSBmb3IgZWZmaWNpZW5jeSwgYnV0IGRvbid0IHVzZSB0aGVtIGFueXBsYWNlIHdoZXJlIGJlaW5nIGFibGUKKyAgLy8gdG8gZG8gc2hhcmVkIHJlYWRzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkZWFkbG9jay4KKyAgaW5saW5lIHZvaWQgUmVhZGVyTG9jaygpOyAgIC8vIEJsb2NrIHVudGlsIGZyZWUgb3Igc2hhcmVkIHRoZW4gYWNxdWlyZSBhIHNoYXJlCisgIGlubGluZSB2b2lkIFJlYWRlclVubG9jaygpOyAvLyBSZWxlYXNlIGEgcmVhZCBzaGFyZSBvZiB0aGlzIE11dGV4CisgIGlubGluZSB2b2lkIFdyaXRlckxvY2soKSB7IExvY2soKTsgfSAgICAgLy8gQWNxdWlyZSBhbiBleGNsdXNpdmUgbG9jaworICBpbmxpbmUgdm9pZCBXcml0ZXJVbmxvY2soKSB7IFVubG9jaygpOyB9IC8vIFJlbGVhc2UgYSBsb2NrIGZyb20gV3JpdGVyTG9jaygpCisKKyBwcml2YXRlOgorICBNdXRleFR5cGUgbXV0ZXhfOworICAvLyBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb21waWxlciBzZXRzIGlzX3NhZmVfIHRvIHRydWUgb25seQorICAvLyB3aGVuIHdlIHRlbGwgaXQgdG8sIGFuZCBuZXZlciBtYWtlcyBhc3N1bXB0aW9ucyBpc19zYWZlXyBpcworICAvLyBhbHdheXMgdHJ1ZS4gIHZvbGF0aWxlIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBkbyB0aGF0LgorICB2b2xhdGlsZSBib29sIGlzX3NhZmVfOworICAvLyBUaGlzIGluZGljYXRlcyB3aGljaCBjb25zdHJ1Y3RvciB3YXMgY2FsbGVkLgorICBib29sIGRlc3Ryb3lfOworCisgIGlubGluZSB2b2lkIFNldElzU2FmZSgpIHsgaXNfc2FmZV8gPSB0cnVlOyB9CisKKyAgLy8gQ2F0Y2ggdGhlIGVycm9yIG9mIHdyaXRpbmcgTXV0ZXggd2hlbiBpbnRlbmRpbmcgTXV0ZXhMb2NrLgorICBNdXRleChNdXRleCogLyppZ25vcmVkKi8pIHt9CisgIC8vIERpc2FsbG93ICJldmlsIiBjb25zdHJ1Y3RvcnMKKyAgTXV0ZXgoY29uc3QgTXV0ZXgmKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTXV0ZXgmKTsKK307CisKKy8vIE5vdyB0aGUgaW1wbGVtZW50YXRpb24gb2YgTXV0ZXggZm9yIHZhcmlvdXMgc3lzdGVtcworI2lmIGRlZmluZWQoTk9fVEhSRUFEUykKKworLy8gV2hlbiB3ZSBkb24ndCBoYXZlIHRocmVhZHMsIHdlIGNhbiBiZSBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nLAorLy8gYnV0IG5vdCBib3RoLiAgV2UgY2FuIGhhdmUgbG90cyBvZiByZWFkZXJzIGF0IG9uY2UgKGluIG5vLXRocmVhZHMKKy8vIG1vZGUsIHRoYXQncyBtb3N0IGxpa2VseSB0byBoYXBwZW4gaW4gcmVjdXJzaXZlIGZ1bmN0aW9uIGNhbGxzKSwKKy8vIGJ1dCBvbmx5IG9uZSB3cml0ZXIuICBXZSByZXByZXNlbnQgdGhpcyBieSBoYXZpbmcgbXV0ZXhfIGJlIC0xIHdoZW4KKy8vIHdyaXRpbmcgYW5kIGEgbnVtYmVyID4gMCB3aGVuIHJlYWRpbmcgKGFuZCAwIHdoZW4gbm8gbG9jayBpcyBoZWxkKS4KKy8vCisvLyBJbiBkZWJ1ZyBtb2RlLCB3ZSBhc3NlcnQgdGhlc2UgaW52YXJpYW50cywgd2hpbGUgaW4gbm9uLWRlYnVnIG1vZGUKKy8vIHdlIGRvIG5vdGhpbmcsIGZvciBlZmZpY2llbmN5LiAgVGhhdCdzIHdoeSBldmVyeXRoaW5nIGlzIGluIGFuCisvLyBhc3NlcnQuCisKK011dGV4OjpNdXRleCgpIDogbXV0ZXhfKDApIHsgfQorTXV0ZXg6Ok11dGV4KE11dGV4OjpMaW5rZXJJbml0aWFsaXplZCkgOiBtdXRleF8oMCkgeyB9CitNdXRleDo6fk11dGV4KCkgICAgICAgICAgICB7IGFzc2VydChtdXRleF8gPT0gMCk7IH0KK3ZvaWQgTXV0ZXg6OkxvY2soKSAgICAgICAgIHsgYXNzZXJ0KC0tbXV0ZXhfID09IC0xKTsgfQordm9pZCBNdXRleDo6VW5sb2NrKCkgICAgICAgeyBhc3NlcnQobXV0ZXhfKysgPT0gLTEpOyB9CisjaWZkZWYgR01VVEVYX1RSWUxPQ0sKK2Jvb2wgTXV0ZXg6OlRyeUxvY2soKSAgICAgIHsgaWYgKG11dGV4XykgcmV0dXJuIGZhbHNlOyBMb2NrKCk7IHJldHVybiB0cnVlOyB9CisjZW5kaWYKK3ZvaWQgTXV0ZXg6OlJlYWRlckxvY2soKSAgIHsgYXNzZXJ0KCsrbXV0ZXhfID4gMCk7IH0KK3ZvaWQgTXV0ZXg6OlJlYWRlclVubG9jaygpIHsgYXNzZXJ0KG11dGV4Xy0tID4gMCk7IH0KKworI2VsaWYgZGVmaW5lZChPU19XSU5ET1dTKQorCitNdXRleDo6TXV0ZXgoKSA6IGRlc3Ryb3lfKHRydWUpIHsKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXhfKTsKKyAgU2V0SXNTYWZlKCk7Cit9CitNdXRleDo6TXV0ZXgoTGlua2VySW5pdGlhbGl6ZWQpIDogZGVzdHJveV8oZmFsc2UpIHsKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXhfKTsKKyAgU2V0SXNTYWZlKCk7Cit9CitNdXRleDo6fk11dGV4KCkgICAgICAgICAgICB7IGlmIChkZXN0cm95XykgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZtdXRleF8pOyB9Cit2b2lkIE11dGV4OjpMb2NrKCkgICAgICAgICB7IGlmIChpc19zYWZlXykgRW50ZXJDcml0aWNhbFNlY3Rpb24oJm11dGV4Xyk7IH0KK3ZvaWQgTXV0ZXg6OlVubG9jaygpICAgICAgIHsgaWYgKGlzX3NhZmVfKSBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXhfKTsgfQorI2lmZGVmIEdNVVRFWF9UUllMT0NLCitib29sIE11dGV4OjpUcnlMb2NrKCkgICAgICB7IHJldHVybiBpc19zYWZlXyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigmbXV0ZXhfKSAhPSAwIDogdHJ1ZTsgfQorI2VuZGlmCit2b2lkIE11dGV4OjpSZWFkZXJMb2NrKCkgICB7IExvY2soKTsgfSAgICAgIC8vIHdlIGRvbid0IGhhdmUgcmVhZC13cml0ZSBsb2Nrcwordm9pZCBNdXRleDo6UmVhZGVyVW5sb2NrKCkgeyBVbmxvY2soKTsgfQorCisjZWxpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRCkgJiYgZGVmaW5lZChIQVZFX1JXTE9DSykKKworI2RlZmluZSBTQUZFX1BUSFJFQUQoZm5jYWxsKSAgZG8geyAgIC8qIHJ1biBmbmNhbGwgaWYgaXNfc2FmZV8gaXMgdHJ1ZSAqLyAgXAorICBpZiAoaXNfc2FmZV8gJiYgZm5jYWxsKCZtdXRleF8pICE9IDApIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworTXV0ZXg6Ok11dGV4KCkgOiBkZXN0cm95Xyh0cnVlKSB7CisgIFNldElzU2FmZSgpOworICBpZiAoaXNfc2FmZV8gJiYgcHRocmVhZF9yd2xvY2tfaW5pdCgmbXV0ZXhfLCBOVUxMKSAhPSAwKSBhYm9ydCgpOworfQorTXV0ZXg6Ok11dGV4KE11dGV4OjpMaW5rZXJJbml0aWFsaXplZCkgOiBkZXN0cm95XyhmYWxzZSkgeworICBTZXRJc1NhZmUoKTsKKyAgaWYgKGlzX3NhZmVfICYmIHB0aHJlYWRfcndsb2NrX2luaXQoJm11dGV4XywgTlVMTCkgIT0gMCkgYWJvcnQoKTsKK30KK011dGV4Ojp+TXV0ZXgoKSAgICAgICB7IGlmIChkZXN0cm95XykgU0FGRV9QVEhSRUFEKHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3kpOyB9Cit2b2lkIE11dGV4OjpMb2NrKCkgICAgICAgICB7IFNBRkVfUFRIUkVBRChwdGhyZWFkX3J3bG9ja193cmxvY2spOyB9Cit2b2lkIE11dGV4OjpVbmxvY2soKSAgICAgICB7IFNBRkVfUFRIUkVBRChwdGhyZWFkX3J3bG9ja191bmxvY2spOyB9CisjaWZkZWYgR01VVEVYX1RSWUxPQ0sKK2Jvb2wgTXV0ZXg6OlRyeUxvY2soKSAgICAgIHsgcmV0dXJuIGlzX3NhZmVfID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX3J3bG9ja190cnl3cmxvY2soJm11dGV4XykgPT0gMCA6IHRydWU7IH0KKyNlbmRpZgordm9pZCBNdXRleDo6UmVhZGVyTG9jaygpICAgeyBTQUZFX1BUSFJFQUQocHRocmVhZF9yd2xvY2tfcmRsb2NrKTsgfQordm9pZCBNdXRleDo6UmVhZGVyVW5sb2NrKCkgeyBTQUZFX1BUSFJFQUQocHRocmVhZF9yd2xvY2tfdW5sb2NrKTsgfQorI3VuZGVmIFNBRkVfUFRIUkVBRAorCisjZWxpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRCkKKworI2RlZmluZSBTQUZFX1BUSFJFQUQoZm5jYWxsKSAgZG8geyAgIC8qIHJ1biBmbmNhbGwgaWYgaXNfc2FmZV8gaXMgdHJ1ZSAqLyAgXAorICBpZiAoaXNfc2FmZV8gJiYgZm5jYWxsKCZtdXRleF8pICE9IDApIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworTXV0ZXg6Ok11dGV4KCkgOiBkZXN0cm95Xyh0cnVlKSB7CisgIFNldElzU2FmZSgpOworICBpZiAoaXNfc2FmZV8gJiYgcHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpICE9IDApIGFib3J0KCk7Cit9CitNdXRleDo6TXV0ZXgoTXV0ZXg6OkxpbmtlckluaXRpYWxpemVkKSA6IGRlc3Ryb3lfKGZhbHNlKSB7CisgIFNldElzU2FmZSgpOworICBpZiAoaXNfc2FmZV8gJiYgcHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpICE9IDApIGFib3J0KCk7Cit9CitNdXRleDo6fk11dGV4KCkgICAgICAgeyBpZiAoZGVzdHJveV8pIFNBRkVfUFRIUkVBRChwdGhyZWFkX211dGV4X2Rlc3Ryb3kpOyB9Cit2b2lkIE11dGV4OjpMb2NrKCkgICAgICAgICB7IFNBRkVfUFRIUkVBRChwdGhyZWFkX211dGV4X2xvY2spOyB9Cit2b2lkIE11dGV4OjpVbmxvY2soKSAgICAgICB7IFNBRkVfUFRIUkVBRChwdGhyZWFkX211dGV4X3VubG9jayk7IH0KKyNpZmRlZiBHTVVURVhfVFJZTE9DSworYm9vbCBNdXRleDo6VHJ5TG9jaygpICAgICAgeyByZXR1cm4gaXNfc2FmZV8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90cnlsb2NrKCZtdXRleF8pID09IDAgOiB0cnVlOyB9CisjZW5kaWYKK3ZvaWQgTXV0ZXg6OlJlYWRlckxvY2soKSAgIHsgTG9jaygpOyB9Cit2b2lkIE11dGV4OjpSZWFkZXJVbmxvY2soKSB7IFVubG9jaygpOyB9CisjdW5kZWYgU0FGRV9QVEhSRUFECisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU29tZSBoZWxwZXIgY2xhc3NlcworCisvLyBNdXRleExvY2sobXUpIGFjcXVpcmVzIG11IHdoZW4gY29uc3RydWN0ZWQgYW5kIHJlbGVhc2VzIGl0IHdoZW4gZGVzdHJveWVkLgorY2xhc3MgTXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE11dGV4TG9jayhNdXRleCAqbXUpIDogbXVfKG11KSB7IG11Xy0+TG9jaygpOyB9CisgIH5NdXRleExvY2soKSB7IG11Xy0+VW5sb2NrKCk7IH0KKyBwcml2YXRlOgorICBNdXRleCAqIGNvbnN0IG11XzsKKyAgLy8gRGlzYWxsb3cgImV2aWwiIGNvbnN0cnVjdG9ycworICBNdXRleExvY2soY29uc3QgTXV0ZXhMb2NrJik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE11dGV4TG9jayYpOworfTsKKworLy8gUmVhZGVyTXV0ZXhMb2NrIGFuZCBXcml0ZXJNdXRleExvY2sgZG8gdGhlIHNhbWUsIGZvciByd2xvY2tzCitjbGFzcyBSZWFkZXJNdXRleExvY2sgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVhZGVyTXV0ZXhMb2NrKE11dGV4ICptdSkgOiBtdV8obXUpIHsgbXVfLT5SZWFkZXJMb2NrKCk7IH0KKyAgflJlYWRlck11dGV4TG9jaygpIHsgbXVfLT5SZWFkZXJVbmxvY2soKTsgfQorIHByaXZhdGU6CisgIE11dGV4ICogY29uc3QgbXVfOworICAvLyBEaXNhbGxvdyAiZXZpbCIgY29uc3RydWN0b3JzCisgIFJlYWRlck11dGV4TG9jayhjb25zdCBSZWFkZXJNdXRleExvY2smKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUmVhZGVyTXV0ZXhMb2NrJik7Cit9OworCitjbGFzcyBXcml0ZXJNdXRleExvY2sgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgV3JpdGVyTXV0ZXhMb2NrKE11dGV4ICptdSkgOiBtdV8obXUpIHsgbXVfLT5Xcml0ZXJMb2NrKCk7IH0KKyAgfldyaXRlck11dGV4TG9jaygpIHsgbXVfLT5Xcml0ZXJVbmxvY2soKTsgfQorIHByaXZhdGU6CisgIE11dGV4ICogY29uc3QgbXVfOworICAvLyBEaXNhbGxvdyAiZXZpbCIgY29uc3RydWN0b3JzCisgIFdyaXRlck11dGV4TG9jayhjb25zdCBXcml0ZXJNdXRleExvY2smKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgV3JpdGVyTXV0ZXhMb2NrJik7Cit9OworCisvLyBDYXRjaCBidWcgd2hlcmUgdmFyaWFibGUgbmFtZSBpcyBvbWl0dGVkLCBlLmcuIE11dGV4TG9jayAoJm11KTsKKyNkZWZpbmUgTXV0ZXhMb2NrKHgpIENPTVBJTEVfQVNTRVJUKDAsIG11dGV4X2xvY2tfZGVjbF9taXNzaW5nX3Zhcl9uYW1lKQorI2RlZmluZSBSZWFkZXJNdXRleExvY2soeCkgQ09NUElMRV9BU1NFUlQoMCwgcm11dGV4X2xvY2tfZGVjbF9taXNzaW5nX3Zhcl9uYW1lKQorI2RlZmluZSBXcml0ZXJNdXRleExvY2soeCkgQ09NUElMRV9BU1NFUlQoMCwgd211dGV4X2xvY2tfZGVjbF9taXNzaW5nX3Zhcl9uYW1lKQorCit9ICAvLyBuYW1lc3BhY2UgTVVURVhfTkFNRVNQQUNFCisKK3VzaW5nIG5hbWVzcGFjZSBNVVRFWF9OQU1FU1BBQ0U7CisKKyN1bmRlZiBNVVRFWF9OQU1FU1BBQ0UKKworI2VuZGlmICAvKiAjZGVmaW5lIEdGTEFHU19NVVRFWF9IX18gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvdXRpbC5oIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2ZTFiZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvdXRpbC5oCkBAIC0wLDAgKzEsMzczIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8gLS0tCisvLworLy8gU29tZSBnZW5lcmljYWxseSB1c2VmdWwgdXRpbGl0eSByb3V0aW5lcyB0aGF0IGluIGdvb2dsZS1sYW5kIHdvdWxkCisvLyBiZSB0aGVpciBvd24gcHJvamVjdHMuICBXZSBtYWtlIGEgc2hvcnRlbmVkIHZlcnNpb24gaGVyZS4KKworI2lmbmRlZiBHRkxBR1NfVVRJTF9IXworI2RlZmluZSBHRkxBR1NfVVRJTF9IXworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyMgIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRhcmcuaD4gICAgIC8vIGZvciB2YV8qCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+IC8vIGZvciBta2RpcgorI2VuZGlmCisKKworbmFtZXNwYWNlIEdGTEFHU19OQU1FU1BBQ0UgeworCisKKy8vIFRoaXMgaXMgdXNlZCBmb3IgdW5pdHRlc3RzIGZvciBkZWF0aC10ZXN0aW5nLiAgSXQgaXMgZGVmaW5lZCBpbiBnZmxhZ3MuY2MuCitleHRlcm4gR0ZMQUdTX0RMTF9ERUNMIHZvaWQgKCpnZmxhZ3NfZXhpdGZ1bmMpKGludCk7CisKKy8vIFdvcmsgcHJvcGVybHkgaWYgZWl0aGVyIHN0cnRvbGwgb3Igc3RydG9xIGlzIG9uIHRoaXMgc3lzdGVtLgorI2lmIGRlZmluZWQoc3RydG9sbCkgfHwgZGVmaW5lZChIQVZFX1NUUlRPTEwpCisjICBkZWZpbmUgc3RydG82NCAgc3RydG9sbAorIyAgZGVmaW5lIHN0cnRvdTY0IHN0cnRvdWxsCisjZWxpZiBkZWZpbmVkKEhBVkVfU1RSVE9RKQorIyAgZGVmaW5lIHN0cnRvNjQgIHN0cnRvcQorIyAgZGVmaW5lIHN0cnRvdTY0IHN0cnRvdXEKKy8vIE5laXRoZXIgc3RydG9sbCBub3Igc3RydG9xIGFyZSBkZWZpbmVkLiAgSSBob3BlIHN0cnRvbCB3b3JrcyEKKyNlbHNlCisjICBkZWZpbmUgc3RydG82NCAgc3RydG9sCisjICBkZWZpbmUgc3RydG91NjQgc3RydG91bAorI2VuZGlmCisKKy8vIElmIHdlIGhhdmUgaW50dHlwZXMuaCwgaXQgd2lsbCBoYXZlIGRlZmluZWQgUFJJZDMyL2V0YyBmb3IgdXMuCisvLyBJZiBub3QsIHRha2Ugb3VyIGJlc3QgZ3Vlc3MuCisjaWZuZGVmIFBSSWQzMgorIyAgZGVmaW5lIFBSSWQzMiAiZCIKKyNlbmRpZgorI2lmbmRlZiBQUklkNjQKKyMgIGRlZmluZSBQUklkNjQgImxsZCIKKyNlbmRpZgorI2lmbmRlZiBQUkl1NjQKKyMgIGRlZmluZSBQUkl1NjQgImxsdSIKKyNlbmRpZgorCit0eXBlZGVmIHNpZ25lZCBjaGFyIGludDg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7CisKKy8vIC0tIHV0aWxpdHkgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8Ym9vbD4gc3RydWN0IENvbXBpbGVBc3NlcnQge307CisjZGVmaW5lIENPTVBJTEVfQVNTRVJUKGV4cHIsIG1zZykgXAorICB0eXBlZGVmIENvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiBtc2dbYm9vbChleHByKSA/IDEgOiAtMV0KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5LgorI2RlZmluZSBhcnJheXNpemUoYXJyKSAoc2l6ZW9mKGFycikvc2l6ZW9mKCooYXJyKSkpCisKKworLy8gLS0gbG9nZ2luZyBhbmQgdGVzdGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRm9yIG5vdywgd2UgaWdub3JlIHRoZSBsZXZlbCBmb3IgbG9nZ2luZywgYW5kIGRvbid0IHNob3cgKlZMT0cncyBhdAorLy8gYWxsLCBleGNlcHQgYnkgaGFuZC1lZGl0aW5nIHRoZSBsaW5lcyBiZWxvdworI2RlZmluZSBMT0cobGV2ZWwpICAgIHN0ZDo6Y2VycgorI2RlZmluZSBWTE9HKGxldmVsKSAgIGlmICh0cnVlKSB7fSBlbHNlIHN0ZDo6Y2VycgorI2RlZmluZSBEVkxPRyhsZXZlbCkgIGlmICh0cnVlKSB7fSBlbHNlIHN0ZDo6Y2VycgorCisvLyBDSEVDSyBkaWVzIHdpdGggYSBmYXRhbCBlcnJvciBpZiBjb25kaXRpb24gaXMgbm90IHRydWUuICBJdCBpcyAqbm90KgorLy8gY29udHJvbGxlZCBieSBOREVCVUcsIHNvIHRoZSBjaGVjayB3aWxsIGJlIGV4ZWN1dGVkIHJlZ2FyZGxlc3Mgb2YKKy8vIGNvbXBpbGF0aW9uIG1vZGUuICBUaGVyZWZvcmUsIGl0IGlzIHNhZmUgdG8gZG8gdGhpbmdzIGxpa2U6CisvLyAgICBDSEVDSyhmcC0+V3JpdGUoeCkgPT0gNCkKKy8vIFdlIGFsbG93IHN0cmVhbS1saWtlIG9iamVjdHMgYWZ0ZXIgdGhpcyBmb3IgZGVidWdnaW5nLCBidXQgdGhleSdyZSBpZ25vcmVkLgorI2RlZmluZSBFWFBFQ1RfVFJVRShjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHRydWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoY29uZGl0aW9uKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJDaGVjayBmYWlsZWQ6ICVzXG4iLCAjY29uZGl0aW9uKTsgICAgICAgIFwKKyAgICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2Ugc3RkOjpjZXJyIDw8ICIiCisKKyNkZWZpbmUgRVhQRUNUX09QKG9wLCB2YWwxLCB2YWwyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHRydWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoISgodmFsMSkgb3AgKHZhbDIpKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2hlY2sgZmFpbGVkOiAlcyAlcyAlc1xuIiwgI3ZhbDEsICNvcCwgI3ZhbDIpOyAgIFwKKyAgICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHN0ZDo6Y2VyciA8PCAiIgorCisjZGVmaW5lIEVYUEVDVF9FUSh2YWwxLCB2YWwyKSBFWFBFQ1RfT1AoPT0sIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9ORSh2YWwxLCB2YWwyKSBFWFBFQ1RfT1AoIT0sIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9MRSh2YWwxLCB2YWwyKSBFWFBFQ1RfT1AoPD0sIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9MVCh2YWwxLCB2YWwyKSBFWFBFQ1RfT1AoPCAsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9HRSh2YWwxLCB2YWwyKSBFWFBFQ1RfT1AoPj0sIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9HVCh2YWwxLCB2YWwyKSBFWFBFQ1RfT1AoPiAsIHZhbDEsIHZhbDIpCisjZGVmaW5lIEVYUEVDVF9GQUxTRShjb25kKSAgICBFWFBFQ1RfVFJVRSghKGNvbmQpKQorCisvLyBDOTkgZGVjbGFyZXMgaXNuYW4gYW5kIGlzaW5mIHNob3VsZCBiZSBtYWNyb3MsIHNvIHRoZSAjaWZkZWYgdGVzdAorLy8gc2hvdWxkIGJlIHJlbGlhYmxlIGV2ZXJ5d2hlcmUuICBPZiBjb3Vyc2UsIGl0J3Mgbm90LCBidXQgdGhlc2UKKy8vIGFyZSB0ZXN0aW5nIHBlcnR0eSBtYXJnaW5hbCBmdW5jdGlvbmFsaXR5IGFueXdheSwgc28gaXQncyBvayB0bworLy8gbm90LXJ1biB0aGVtIGV2ZW4gaW4gc2l0dWF0aW9ucyB0aGV5IG1pZ2h0LCB3aXRoIGVmZm9ydCwgYmUgbWFkZSB0byB3b3JrLgorI2lmZGVmIGlzbmFuICAvLyBTb21lIGNvbXBpbGVycywgbGlrZSBzdW4ncyBmb3IgU29sYXJpcyAxMCwgZG9uJ3QgZGVmaW5lIHRoaXMKKyNkZWZpbmUgRVhQRUNUX05BTihhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghaXNuYW4oYXJnKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2hlY2sgZmFpbGVkOiBpc25hbiglcylcbiIsICNhcmcpOyAgICAgICBcCisgICAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEVYUEVDVF9OQU4oYXJnKQorI2VuZGlmCisKKyNpZmRlZiBpc2luZiAgLy8gU29tZSBjb21waWxlcnMsIGxpa2Ugc3VuJ3MgZm9yIFNvbGFyaXMgMTAsIGRvbid0IGRlZmluZSB0aGlzCisjZGVmaW5lIEVYUEVDVF9JTkYoYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWlzaW5mKGFyZykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNoZWNrIGZhaWxlZDogaXNpbmYoJXMpXG4iLCAjYXJnKTsgICAgICAgXAorICAgICAgZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBFWFBFQ1RfSU5GKGFyZykKKyNlbmRpZgorCisjZGVmaW5lIEVYUEVDVF9ET1VCTEVfRVEodmFsMSwgdmFsMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgodmFsMSkgPCAodmFsMikgLSAwLjAwMSB8fCAodmFsMSkgPiAodmFsMikgKyAwLjAwMSkpIHsgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNoZWNrIGZhaWxlZDogJXMgPT0gJXNcbiIsICN2YWwxLCAjdmFsMik7ICAgICAgICBcCisgICAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRVhQRUNUX1NUUkVRKHZhbDEsIHZhbDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RyY21wKCh2YWwxKSwgKHZhbDIpKSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2hlY2sgZmFpbGVkOiBzdHJlcSglcywgJXMpXG4iLCAjdmFsMSwgI3ZhbDIpOyAgIFwKKyAgICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLy8gQ2FsbCB0aGlzIGluIGEgLmNjIGZpbGUgd2hlcmUgeW91IHdpbGwgbGF0ZXIgY2FsbCBSVU5fQUxMX1RFU1RTIGluIG1haW4oKS4KKyNkZWZpbmUgVEVTVF9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPHZvaWQgKCopKCk+IGdfdGVzdGxpc3Q7ICAvKiB0aGUgdGVzdHMgdG8gcnVuICovICAgIFwKKyAgc3RhdGljIGludCBSVU5fQUxMX1RFU1RTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGQ6OnZlY3Rvcjx2b2lkICgqKSgpPjo6Y29uc3RfaXRlcmF0b3IgaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGl0ID0gZ190ZXN0bGlzdC5iZWdpbigpOyBpdCAhPSBnX3Rlc3RsaXN0LmVuZCgpOyArK2l0KSB7ICAgICAgIFwKKyAgICAgICgqaXQpKCk7ICAgLyogVGhlIHRlc3Qgd2lsbCBlcnJvci1leGl0IGlmIHRoZXJlJ3MgYSBwcm9ibGVtLiAqLyAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuUGFzc2VkICVkIHRlc3RzXG5cblBBU1NcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZ190ZXN0bGlzdC5zaXplKCkpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBOb3RlIHRoYXQgdGhpcyBtYWNybyB1c2VzIGEgRmxhZ1NhdmVyIHRvIGtlZXAgdGVzdHMgaXNvbGF0ZWQuCisjZGVmaW5lIFRFU1QoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IFRlc3RfIyNhIyNfIyNiIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRlc3RfIyNhIyNfIyNiKCkgeyBnX3Rlc3RsaXN0LnB1c2hfYmFjaygmUnVuKTsgfSAgICBcCisgICAgc3RhdGljIHZvaWQgUnVuKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZsYWdTYXZlciBmczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJSdW5uaW5nIHRlc3QgJXMvJXNcbiIsICNhLCAjYik7ICBcCisgICAgICBSdW5UZXN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIFJ1blRlc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIFRlc3RfIyNhIyNfIyNiIGdfdGVzdF8jI2EjI18jI2I7ICAgICAgICAgICAgICAgXAorICB2b2lkIFRlc3RfIyNhIyNfIyNiOjpSdW5UZXN0KCkKKworLy8gVGhpcyBpcyBhIGR1bW15IGNsYXNzIHRoYXQgZWFzZXMgdGhlIGdvb2dsZS0+b3BlbnNvdXJjZSB0cmFuc2l0aW9uLgorbmFtZXNwYWNlIHRlc3RpbmcgeworY2xhc3MgVGVzdCB7fTsKK30KKworLy8gQ2FsbCB0aGlzIGluIGEgLmNjIGZpbGUgd2hlcmUgeW91IHdpbGwgbGF0ZXIgY2FsbCBFWFBFQ1RfREVBVEgKKyNkZWZpbmUgRVhQRUNUX0RFQVRIX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgYm9vbCBnX2NhbGxlZF9leGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIENhbGxlZEV4aXQoaW50KSB7IGdfY2FsbGVkX2V4aXQgPSB0cnVlOyB9CisKKyNkZWZpbmUgRVhQRUNUX0RFQVRIKGZuLCBtc2cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnX2NhbGxlZF9leGl0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZmxhZ3NfZXhpdGZ1bmMgPSAmQ2FsbGVkRXhpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdmbGFnc19leGl0ZnVuYyA9ICZleGl0OyAgICAvKiBzZXQgYmFjayB0byBpdHMgZGVmYXVsdCAqLyBcCisgICAgaWYgKCFnX2NhbGxlZF9leGl0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZ1bmN0aW9uIGRpZG4ndCBkaWUgKCVzKTogJXNcbiIsIG1zZywgI2ZuKTsgICAgICBcCisgICAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR1RFU1RfSEFTX0RFQVRIX1RFU1QgMQorCisvLyAtLSBwYXRoIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJpZXMgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkgcGF0aCBhcyBhIHRlbXAtZGlyLiAgSWYgaXQgZmFpbHMsCisvLyBjaGFuZ2VzIHBhdGggdG8gc29tZSBkaXJlY3RvcnkgaXQgKmNhbiogY3JlYXRlLgorI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCisjaW5jbHVkZSA8aW8uaD4KK2lubGluZSB2b2lkIE1ha2VUbXBkaXIoc3RkOjpzdHJpbmcqIHBhdGgpIHsKKyAgaWYgKCFwYXRoLT5lbXB0eSgpKSB7CisJcGF0aC0+YXBwZW5kKCIvZ2ZsYWdzX3VuaXR0ZXN0X3Rlc3RkaXIiKTsKKwlpbnQgZXJyID0gbWtkaXIocGF0aC0+Y19zdHIoKSk7CisJaWYgKGVyciA9PSAwIHx8IGVycm5vID09IEVFWElTVCkgcmV0dXJuOworICB9CisgIC8vIEkgaGFkIHRyb3VibGUgY3JlYXRpbmcgYSBkaXJlY3RvcnkgaW4gL3RtcCBmcm9tIG1pbmd3CisgICpwYXRoID0gIi4vZ2ZsYWdzX3VuaXR0ZXN0IjsKKyAgbWtkaXIocGF0aC0+Y19zdHIoKSk7Cit9CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgPGRpcmVjdC5oPgoraW5saW5lIHZvaWQgTWFrZVRtcGRpcihzdGQ6OnN0cmluZyogcGF0aCkgeworICBpZiAoIXBhdGgtPmVtcHR5KCkpIHsKKwlpbnQgZXJyID0gX21rZGlyKHBhdGgtPmNfc3RyKCkpOworCWlmIChlcnIgPT0gMCB8fCBlcnJubyA9PSBFRVhJU1QpIHJldHVybjsKKyAgfQorICBjaGFyIHRtcHBhdGhfYnVmZmVyWzEwMjRdOworICBpbnQgdG1wcGF0aF9sZW4gPSBHZXRUZW1wUGF0aEEoc2l6ZW9mKHRtcHBhdGhfYnVmZmVyKSwgdG1wcGF0aF9idWZmZXIpOworICBhc3NlcnQodG1wcGF0aF9sZW4gPiAwICYmIHRtcHBhdGhfbGVuIDwgc2l6ZW9mKHRtcHBhdGhfYnVmZmVyKSk7CisgIGFzc2VydCh0bXBwYXRoX2J1ZmZlclt0bXBwYXRoX2xlbiAtIDFdID09ICdcXCcpOyAgIC8vIEFQSSBndWFyYW50ZWVzIGl0CisgICpwYXRoID0gc3RkOjpzdHJpbmcodG1wcGF0aF9idWZmZXIpICsgImdmbGFnc191bml0dGVzdCI7CisgIF9ta2RpcihwYXRoLT5jX3N0cigpKTsKK30KKyNlbHNlCitpbmxpbmUgdm9pZCBNYWtlVG1wZGlyKHN0ZDo6c3RyaW5nKiBwYXRoKSB7CisgIGlmICghcGF0aC0+ZW1wdHkoKSkgeworCWludCBlcnIgPSBta2RpcihwYXRoLT5jX3N0cigpLCAwNzU1KTsKKwlpZiAoZXJyID09IDAgfHwgZXJybm8gPT0gRUVYSVNUKSByZXR1cm47CisgIH0KKyAgbWtkaXIoIi90bXAvZ2ZsYWdzX3VuaXR0ZXN0IiwgMDc1NSk7Cit9CisjZW5kaWYKKworLy8gLS0gc3RyaW5nIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSB2b2lkIEludGVybmFsU3RyaW5nUHJpbnRmKHN0ZDo6c3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXApIHsKKyAgY2hhciBzcGFjZVsxMjhdOyAgICAvLyB0cnkgYSBzbWFsbCBidWZmZXIgYW5kIGhvcGUgaXQgZml0cworCisgIC8vIEl0J3MgcG9zc2libGUgZm9yIG1ldGhvZHMgdGhhdCB1c2UgYSB2YV9saXN0IHRvIGludmFsaWRhdGUKKyAgLy8gdGhlIGRhdGEgaW4gaXQgdXBvbiB1c2UuICBUaGUgZml4IGlzIHRvIG1ha2UgYSBjb3B5CisgIC8vIG9mIHRoZSBzdHJ1Y3R1cmUgYmVmb3JlIHVzaW5nIGl0IGFuZCB1c2UgdGhhdCBjb3B5IGluc3RlYWQuCisgIHZhX2xpc3QgYmFja3VwX2FwOworICB2YV9jb3B5KGJhY2t1cF9hcCwgYXApOworICBpbnQgYnl0ZXNfd3JpdHRlbiA9IHZzbnByaW50ZihzcGFjZSwgc2l6ZW9mKHNwYWNlKSwgZm9ybWF0LCBiYWNrdXBfYXApOworICB2YV9lbmQoYmFja3VwX2FwKTsKKworICBpZiAoKGJ5dGVzX3dyaXR0ZW4gPj0gMCkgJiYgKHN0YXRpY19jYXN0PHNpemVfdD4oYnl0ZXNfd3JpdHRlbikgPCBzaXplb2Yoc3BhY2UpKSkgeworICAgIG91dHB1dC0+YXBwZW5kKHNwYWNlLCBieXRlc193cml0dGVuKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBSZXBlYXRlZGx5IGluY3JlYXNlIGJ1ZmZlciBzaXplIHVudGlsIGl0IGZpdHMuCisgIGludCBsZW5ndGggPSBzaXplb2Yoc3BhY2UpOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChieXRlc193cml0dGVuIDwgMCkgeworICAgICAgLy8gT2xkZXIgc25wcmludGYoKSBiZWhhdmlvci4gOi0oICBKdXN0IHRyeSBkb3VibGluZyB0aGUgYnVmZmVyIHNpemUKKyAgICAgIGxlbmd0aCAqPSAyOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBuZWVkIGV4YWN0bHkgImJ5dGVzX3dyaXR0ZW4rMSIgY2hhcmFjdGVycworICAgICAgbGVuZ3RoID0gYnl0ZXNfd3JpdHRlbisxOworICAgIH0KKyAgICBjaGFyKiBidWYgPSBuZXcgY2hhcltsZW5ndGhdOworCisgICAgLy8gUmVzdG9yZSB0aGUgdmFfbGlzdCBiZWZvcmUgd2UgdXNlIGl0IGFnYWluCisgICAgdmFfY29weShiYWNrdXBfYXAsIGFwKTsKKyAgICBieXRlc193cml0dGVuID0gdnNucHJpbnRmKGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGJhY2t1cF9hcCk7CisgICAgdmFfZW5kKGJhY2t1cF9hcCk7CisKKyAgICBpZiAoKGJ5dGVzX3dyaXR0ZW4gPj0gMCkgJiYgKGJ5dGVzX3dyaXR0ZW4gPCBsZW5ndGgpKSB7CisgICAgICBvdXRwdXQtPmFwcGVuZChidWYsIGJ5dGVzX3dyaXR0ZW4pOworICAgICAgZGVsZXRlW10gYnVmOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZWxldGVbXSBidWY7CisgIH0KK30KKworLy8gQ2xlYXJzIG91dHB1dCBiZWZvcmUgd3JpdGluZyB0byBpdC4KK2lubGluZSB2b2lkIFNTdHJpbmdQcmludGYoc3RkOjpzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIG91dHB1dC0+Y2xlYXIoKTsKKyAgSW50ZXJuYWxTdHJpbmdQcmludGYob3V0cHV0LCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKK30KKworaW5saW5lIHZvaWQgU3RyaW5nQXBwZW5kRihzdGQ6OnN0cmluZyogb3V0cHV0LCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgSW50ZXJuYWxTdHJpbmdQcmludGYob3V0cHV0LCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIFN0cmluZ1ByaW50Zihjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBJbnRlcm5hbFN0cmluZ1ByaW50Zigmb3V0cHV0LCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworaW5saW5lIGJvb2wgU2FmZUdldEVudihjb25zdCBjaGFyICp2YXJuYW1lLCBzdGQ6OnN0cmluZyAmdmFsc3RyKQoreworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE0MDAKKwljaGFyICAqdmFsOworCXNpemVfdCBzejsKKwlpZiAoX2R1cGVudl9zKCZ2YWwsICZzeiwgdmFybmFtZSkgIT0gMCB8fCAhdmFsKSByZXR1cm4gZmFsc2U7CisJdmFsc3RyID0gdmFsOworCWZyZWUodmFsKTsKKyNlbHNlCisJY29uc3QgY2hhciAqIGNvbnN0IHZhbCA9IGdldGVudih2YXJuYW1lKTsKKwlpZiAoIXZhbCkgcmV0dXJuIGZhbHNlOworCXZhbHN0ciA9IHZhbDsKKyNlbmRpZgorCXJldHVybiB0cnVlOworfQorCitpbmxpbmUgaW50IFNhZmVGT3BlbihGSUxFICoqZnAsIGNvbnN0IGNoYXIqIGZuYW1lLCBjb25zdCBjaGFyICptb2RlKQoreworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE0MDAKKwlyZXR1cm4gZm9wZW5fcyhmcCwgZm5hbWUsIG1vZGUpOworI2Vsc2UKKwlhc3NlcnQoZnAgIT0gTlVMTCk7CisJKmZwID0gZm9wZW4oZm5hbWUsIG1vZGUpOworICAgIC8vIGVycm5vIG9ubHkgZ3VhcmFudGVlZCB0byBiZSBzZXQgb24gZmFpbHVyZQorCXJldHVybiAoKCpmcCA9PSBOVUxMKSA/IGVycm5vIDogMCk7CisjZW5kaWYKK30KKworCit9IC8vIG5hbWVzcGFjZSBHRkxBR1NfTkFNRVNQQUNFCisKKworI2VuZGlmICAvLyBHRkxBR1NfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy93aW5kb3dzX3BvcnQuY2MgYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL3dpbmRvd3NfcG9ydC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2NiNjMwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3NyYy93aW5kb3dzX3BvcnQuY2MKQEAgLTAsMCArMSw3NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDA5LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAtLS0KKyAqIEF1dGhvcjogQ3JhaWcgU2lsdmVyc3RlaW4KKyAqLworCisjaWZuZGVmIF9XSU4zMgorIyAgZXJyb3IgWW91IHNob3VsZCBvbmx5IGJlIGluY2x1ZGluZyB3aW5kb3dzL3BvcnQuY2MgaW4gYSB3aW5kb3dzIGVudmlyb25tZW50IQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgLy8gZm9yIHN0cmxlbigpLCBtZW1zZXQoKSwgbWVtY21wKCkKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4gICAgLy8gZm9yIHZhX2xpc3QsIHZhX3N0YXJ0LCB2YV9lbmQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJ3aW5kb3dzX3BvcnQuaCIKKworLy8gVGhlc2UgY2FsbCB0aGUgd2luZG93cyBfdnNucHJpbnRmLCBidXQgYWx3YXlzIE5VTC10ZXJtaW5hdGUuCisjaWYgIWRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9fTUlOR1c2NF9fKSAgLyogbWluZ3cgYWxyZWFkeSBkZWZpbmVzICovCisKKyNpZmRlZiBfTVNDX1ZFUgorIyAgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ5OTYpIC8vIGlnbm9yZSBfdnNucHJpbnRmIHNlY3VyaXR5IHdhcm5pbmcKKyNlbmRpZgoraW50IHNhZmVfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkgeworICBpZiAoc2l6ZSA9PSAwKSAgICAgICAgLy8gbm90IGV2ZW4gcm9vbSBmb3IgYSBcMD8KKyAgICByZXR1cm4gLTE7ICAgICAgICAgIC8vIG5vdCB3aGF0IEM5OSBzYXlzIHRvIGRvLCBidXQgd2hhdCB3aW5kb3dzIGRvZXMKKyAgc3RyW3NpemUtMV0gPSAnXDAnOyAKKyAgcmV0dXJuIF92c25wcmludGYoc3RyLCBzaXplLTEsIGZvcm1hdCwgYXApOworfQorI2lmZGVmIF9NU0NfVkVSCisjICBwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworI2lmIF9NU0NfVkVSIDwgMTkwMCAgLy8gbXN2cyAyMDE1IGZpbmFsbHkgaW5jbHVkZXMgc25wcmludGYKKworaW50IHNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgIGludCByOworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgciA9IHZzbnByaW50ZihzdHIsIHNpemUsIGZvcm1hdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gcjsKK30KKworI2VuZGlmCisKKyNlbmRpZiAgLyogI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXNjRfXykgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy9zcmMvd2luZG93c19wb3J0LmggYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL3dpbmRvd3NfcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZmYyNGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3Mvc3JjL3dpbmRvd3NfcG9ydC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMDksIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBDcmFpZyBTaWx2ZXJzdGVpbgorICoKKyAqIFRoZXNlIGFyZSBzb21lIHBvcnRhYmlsaXR5IHR5cGVkZWZzIGFuZCBkZWZpbmVzIHRvIG1ha2UgaXQgYSBiaXQKKyAqIGVhc2llciB0byBjb21waWxlIHRoaXMgY29kZSB1bmRlciBWQysrLgorICoKKyAqIFNldmVyYWwgb2YgdGhlc2UgYXJlIHRha2VuIGZyb20gZ2xpYjoKKyAqICAgIGh0dHA6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2RvYy9BUEkvZ2xpYi9nbGliLXdpbmRvd3MtY29tcGF0YWJpbGl0eS1mdW5jdGlvbnMuaHRtbAorICovCisKKyNpZm5kZWYgR0ZMQUdTX1dJTkRPV1NfUE9SVF9IXworI2RlZmluZSBHRkxBR1NfV0lORE9XU19QT1JUX0hfCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworLy8gVGhpcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHRoZSB3aW5kb3dzLmggaXMgaW5jbHVkZWQuCisvLyBJdCdzIG5lZWRlZCBmb3IgbXV0ZXguaCwgdG8gZ2l2ZSBhY2Nlc3MgdG8gdGhlIFRyeUxvY2sgbWV0aG9kLgorIyAgaWYgIWRlZmluZWQoX1dJTjMyX1dJTk5UKSAmJiAhKGRlZmluZWQoIF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fTUlOR1c2NF9fKSkKKyMgICAgZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA0MDAKKyMgIGVuZGlmCisvLyBXZSBhbHdheXMgd2FudCBtaW5pbWFsIGluY2x1ZGVzCisjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8ZGlyZWN0Lmg+ICAgICAgICAgIC8qIGZvciBta2RpciAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgICAgICAvKiBmb3IgX3B1dGVudiwgZ2V0ZW52ICovCisjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgICAgIC8qIG5lZWQgdGhpcyB0byBvdmVycmlkZSBzdGRpbydzIHNucHJpbnRmLCBhbHNvIGRlZmluZXMgX3VubGluayB1c2VkIGJ5IHVuaXQgdGVzdHMgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4gICAgICAgICAgLyogdXRpbC5oIHVzZXMgdmFfY29weSAqLworI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgICAgICAvKiBmb3IgX3N0cmljbXAgYW5kIF9zdHJkdXAgKi8KKworLyogV2UgY2FuJ3QganVzdCB1c2UgX3ZzbnByaW50ZiBhbmQgX3NucHJpbnRmIGFzIGRyb3AtaW4tcmVwbGFjZW1lbnRzLAorICogYmVjYXVzZSB0aGV5IGRvbid0IGFsd2F5cyBOVUwtdGVybWluYXRlLiA6LSggIFdlIGFsc28gY2FuJ3QgdXNlIHRoZQorICogbmFtZSB2c25wcmludGYsIHNpbmNlIHdpbmRvd3MgZGVmaW5lcyB0aGF0IChidXQgbm90IHNucHJpbnRmICghKSkuCisgKi8KKyNpZiAhZGVmaW5lZChfX01JTkdXMzJfXykgJiYgIWRlZmluZWQoX19NSU5HVzY0X18pICAvKiBtaW5ndyBhbHJlYWR5IGRlZmluZXMgKi8KK2V4dGVybiBHRkxBR1NfRExMX0RFQ0wgaW50IHNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gaW50IEdGTEFHU19ETExfREVDTCBzYWZlX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKKyNkZWZpbmUgdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCBhcCkgIHNhZmVfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCBhcCkKKyNkZWZpbmUgdmFfY29weShkc3QsIHNyYykgIChkc3QpID0gKHNyYykKKyNlbmRpZiAgLyogI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXNjRfXykgKi8KKworI2lmZGVmIF9NU0NfVkVSCisjICBwcmFnbWEgd2FybmluZyhwdXNoKQorIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDk5NikgLy8gaWdub3JlIGdldGVudiBzZWN1cml0eSB3YXJuaW5nCisjZW5kaWYKK2lubGluZSB2b2lkIHNldGVudihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgaW50KSB7CisgIC8vIEluIHdpbmRvd3MsIGl0J3MgaW1wb3NzaWJsZSB0byBzZXQgYSB2YXJpYWJsZSB0byB0aGUgZW1wdHkgc3RyaW5nLgorICAvLyBXZSBoYW5kbGUgdGhpcyBieSBzZXR0aW5nIGl0IHRvICIwIiBhbmQgdGhlIE5VTC1pbmcgb3V0IHRoZSBcMC4KKyAgLy8gVGhhdCBpcywgd2UgcHV0ZW52KCJGT089MCIpIGFuZCB0aGVuIGZpbmQgb3V0IHdoZXJlIGluIG1lbW9yeSB0aGUKKyAgLy8gcHV0ZW52IHdyb3RlICJGT089MCIsIGFuZCBjaGFuZ2UgaXQgaW4tcGxhY2UgdG8gIkZPTz1cMCIuCisgIC8vIGMuZi4gaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9zdGRjeHgvdHJ1bmsvdGVzdHMvc3JjL2Vudmlyb24uY3BwP3IxPTYxMTQ1MSZyMj02Mzc1MDgmcGF0aHJldj02Mzc1MDgKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtGYWtlWmVybyA9ICIwIjsKKyAgaWYgKCp2YWx1ZSA9PSAnXDAnKQorICAgIHZhbHVlID0ga0Zha2VaZXJvOworICAvLyBBcHBhcmVudGx5IHRoZSBzZW1hbnRpY3Mgb2YgcHV0ZW52KCkgaXMgdGhhdCB0aGUgaW5wdXQKKyAgLy8gbXVzdCBsaXZlIGZvcmV2ZXIsIHNvIHdlIGxlYWsgbWVtb3J5IGhlcmUuIDotKAorICBjb25zdCBzaXplX3QgbmFtZXZhbF9sZW4gPSBzdHJsZW4obmFtZSkgKyAxICsgc3RybGVuKHZhbHVlKSArIDE7CisgIGNoYXIqIG5hbWV2YWwgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihtYWxsb2MobmFtZXZhbF9sZW4pKTsKKyAgc25wcmludGYobmFtZXZhbCwgbmFtZXZhbF9sZW4sICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKKyAgX3B1dGVudihuYW1ldmFsKTsKKyAgaWYgKHZhbHVlID09IGtGYWtlWmVybykgeworICAgIG5hbWV2YWxbbmFtZXZhbF9sZW4gLSAyXSA9ICdcMCc7ICAgLy8gd29ya3Mgd2hlbiBwdXRlbnYoKSBtYWtlcyBubyBjb3B5CisgICAgaWYgKCpnZXRlbnYobmFtZSkgIT0gJ1wwJykKKyAgICAgICpnZXRlbnYobmFtZSkgPSAnXDAnOyAgICAgICAgICAgIC8vIHdvcmtzIHdoZW4gcHV0ZW52KCkgY29waWVzIG5hbWV2YWwKKyAgfQorfQorI2lmZGVmIF9NU0NfVkVSCisjICBwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworI2RlZmluZSBzdHJjYXNlY21wIF9zdHJpY21wCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNDAwCisjZGVmaW5lIHN0cmR1cCAgIF9zdHJkdXAKKyNkZWZpbmUgdW5saW5rICAgX3VubGluaworI2VuZGlmCisKKyNkZWZpbmUgUFJJZDMyICAiZCIKKyNkZWZpbmUgUFJJdTMyICAidSIKKyNkZWZpbmUgUFJJZDY0ICAiSTY0ZCIKKyNkZWZpbmUgUFJJdTY0ICAiSTY0dSIKKworI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXNjRfXykKKyNkZWZpbmUgc3RydG9xICAgX3N0cnRvaTY0CisjZGVmaW5lIHN0cnRvdXEgIF9zdHJ0b3VpNjQKKyNkZWZpbmUgc3RydG9sbCAgX3N0cnRvaTY0CisjZGVmaW5lIHN0cnRvdWxsIF9zdHJ0b3VpNjQKKyNkZWZpbmUgYXRvbGwgICAgX2F0b2k2NAorI2VuZGlmCisKKyNpZm5kZWYgUEFUSF9NQVgKKyNkZWZpbmUgUEFUSF9NQVggMTAyNAorI2VuZGlmCisKKyNlbmRpZiAgLyogR0ZMQUdTX1dJTkRPV1NfUE9SVF9IXyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2I1ODJmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMDUgQEAKKyMjIGdmbGFncyB0ZXN0cworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgb3V0cHV0IGRpcmVjdG9yaWVzCitzZXQgKENNQUtFX1JVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2JpbiIpCitzZXQgKENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2xpYiIpCitzZXQgKENNQUtFX0FSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2xpYiIpCisKKyMgc2V0IHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRlc3QgY29tbWFuZHMKK3NldCAoR0ZMQUdTX0ZMQUdGSUxFU19ESVIgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb21tb24gaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQgbGluayBsaWJyYXJpZXMKK2luY2x1ZGVfZGlyZWN0b3JpZXMgKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQoraW5jbHVkZV9kaXJlY3RvcmllcyAoIiR7Z2ZsYWdzX1NPVVJDRV9ESVJ9L3NyYyIpCitpbmNsdWRlX2RpcmVjdG9yaWVzICgiJHtnZmxhZ3NfQklOQVJZX0RJUn0vaW5jbHVkZSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzICgiJHtnZmxhZ3NfQklOQVJZX0RJUn0vaW5jbHVkZS9nZmxhZ3MiKQorCitpZiAoQlVJTERfU0hBUkVEX0xJQlMpCisgIHNldCAodHlwZSBzaGFyZWQpCitlbHNlICgpCisgIHNldCAodHlwZSBzdGF0aWMpCitlbmRpZiAoKQoraWYgKEJVSUxEX2dmbGFnc19MSUIpCisgIGxpbmtfbGlicmFyaWVzIChnZmxhZ3MtJHt0eXBlfSkKK2Vsc2UgKCkKKyAgbGlua19saWJyYXJpZXMgKGdmbGFnc19ub3RocmVhZHMtJHt0eXBlfSkKK2VuZGlmICgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTVFJJUF9GTEFHX0hFTFAKK2FkZF9leGVjdXRhYmxlIChnZmxhZ3Nfc3RyaXBfZmxhZ3NfdGVzdCBnZmxhZ3Nfc3RyaXBfZmxhZ3NfdGVzdC5jYykKKyMgTWFrZSBzdXJlIHRoZSAtLWhlbHAgb3V0cHV0IGRvZXNuJ3QgcHJpbnQgdGhlIHN0cmlwcGVkIHRleHQuCithZGRfZ2ZsYWdzX3Rlc3QgKHN0cmlwX2ZsYWdzX2hlbHAgMSAiIiAiVGhpcyB0ZXh0IHNob3VsZCBiZSBzdHJpcHBlZCBvdXQiIGdmbGFnc19zdHJpcF9mbGFnc190ZXN0IC0taGVscCkKKyMgTWFrZSBzdXJlIHRoZSBzdHJpcHBlZCB0ZXh0IGlzbid0IGluIHRoZSBiaW5hcnkgYXQgYWxsLgorYWRkX3Rlc3QgKAorICBOQU1FIHN0cmlwX2ZsYWdzX2JpbmFyeQorICBDT01NQU5EICIke0NNQUtFX0NPTU1BTkR9IiAiLURCSU5BUlk9JDxUQVJHRVRfRklMRTpnZmxhZ3Nfc3RyaXBfZmxhZ3NfdGVzdD4iCisgICAgICAgICAgLVAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9nZmxhZ3Nfc3RyaXBfZmxhZ3NfdGVzdC5jbWFrZSIKKykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHVuaXQgdGVzdHMKK2NvbmZpZ3VyZV9maWxlIChnZmxhZ3NfdW5pdHRlc3QuY2MgZ2ZsYWdzX3VuaXR0ZXN0LW1haW4uY2MgQ09QWU9OTFkpCitjb25maWd1cmVfZmlsZSAoZ2ZsYWdzX3VuaXR0ZXN0LmNjIGdmbGFnc191bml0dGVzdF9tYWluLmNjIENPUFlPTkxZKQorCithZGRfZXhlY3V0YWJsZSAoZ2ZsYWdzX3VuaXR0ZXN0ICAgICAgZ2ZsYWdzX3VuaXR0ZXN0LmNjKQorYWRkX2V4ZWN1dGFibGUgKGdmbGFnc191bml0dGVzdC1tYWluIGdmbGFnc191bml0dGVzdC1tYWluLmNjKQorYWRkX2V4ZWN1dGFibGUgKGdmbGFnc191bml0dGVzdF9tYWluIGdmbGFnc191bml0dGVzdF9tYWluLmNjKQorCitpZiAoT1NfV0lORE9XUykKKyAgc2V0IChTTEFTSCAiXFxcXCIpCitlbHNlICgpCisgIHNldCAoU0xBU0ggIi8iKQorZW5kaWYgKCkKKworIyBGaXJzdCwganVzdCBtYWtlIHN1cmUgdGhlICBnZmxhZ3NfdW5pdHRlc3QgIHdvcmtzIGFzLWlzCithZGRfZ2ZsYWdzX3Rlc3QodW5pdHRlc3QgMCAiIiAiIiBnZmxhZ3NfdW5pdHRlc3QpCisKKyMgLS1oZWxwIHNob3VsZCBzaG93IGFsbCBmbGFncywgaW5jbHVkaW5nIGZsYWdzIGZyb20gZ2ZsYWdzX3JlcG9ydGluZworYWRkX2dmbGFnc190ZXN0KGhlbHAtcmVwb3J0aW5nIDEgIiR7U0xBU0h9Z2ZsYWdzX3JlcG9ydGluZy5jYzoiICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0taGVscCkKKworIyBNYWtlIHN1cmUgdGhhdCAtLWhlbHAgcHJpbnRzIGV2ZW4gdmVyeSBsb25nIGhlbHBzdHJpbmdzLgorYWRkX2dmbGFnc190ZXN0KGxvbmctaGVscHN0cmluZyAxICJlbmQgb2YgYSBsb25nIGhlbHBzdHJpbmciICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0taGVscCkKKworIyBNYWtlIHN1cmUgLS1oZWxwIHJlZmxlY3RzIGZsYWcgY2hhbmdlcyBtYWRlIGJlZm9yZSBmbGFnLXBhcnNpbmcKK2FkZF9nZmxhZ3NfdGVzdChjaGFuZ2VkX2Jvb2wxIDEgIi1jaGFuZ2VkX2Jvb2wxIChjaGFuZ2VkKSB0eXBlOiBib29sIGRlZmF1bHQ6IHRydWUiICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0taGVscCkKK2FkZF9nZmxhZ3NfdGVzdChjaGFuZ2VkX2Jvb2wyIDEgIi1jaGFuZ2VkX2Jvb2wyIChjaGFuZ2VkKSB0eXBlOiBib29sIGRlZmF1bHQ6IGZhbHNlIGN1cnJlbnRseTogdHJ1ZSIgIiIgIGdmbGFnc191bml0dGVzdCAgLS1oZWxwKQorIyBBbmQgb24gdGhlIGNvbW1hbmQtbGluZSwgdG9vCithZGRfZ2ZsYWdzX3Rlc3QoY2hhbmdlYWJsZV9zdHJpbmdfdmFyIDEgIi1jaGFuZ2VhYmxlX3N0cmluZ192YXIgKCkgdHlwZTogc3RyaW5nIGRlZmF1bHQ6IFwiMVwiIGN1cnJlbnRseTogXCIyXCIiICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0tY2hhbmdlYWJsZV9zdHJpbmdfdmFyIDIgLS1oZWxwKQorCisjIC0tbm9oZWxwIGFuZCAtLWhlbHA9ZmFsc2Ugc2hvdWxkIGJlIGFzIGlmIHdlIGRpZG4ndCBzYXkgYW55dGhpbmcKK2FkZF9nZmxhZ3NfdGVzdChub2hlbHAgICAgIDAgIlBBU1MiICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0tbm9oZWxwKQorYWRkX2dmbGFnc190ZXN0KGhlbHA9ZmFsc2UgMCAiUEFTUyIgIiIgIGdmbGFnc191bml0dGVzdCAgLS1oZWxwPWZhbHNlKQorCisjIC0taGVscGZ1bGwgaXMgdGhlIHNhbWUgYXMgaGVscAorYWRkX2dmbGFnc190ZXN0KGhlbHBmdWxsIDEgIiR7U0xBU0h9Z2ZsYWdzX3JlcG9ydGluZy5jYzoiICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0taGVscGZ1bGwpCisKKyMgLS1oZWxwc2hvcnQgc2hvdWxkIHNob3cgb25seSBmbGFncyBmcm9tIHRoZSAgZ2ZsYWdzX3VuaXR0ZXN0ICBpdHNlbGYKK2FkZF9nZmxhZ3NfdGVzdChoZWxwc2hvcnQgMSAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M6IiAiJHtTTEFTSH1nZmxhZ3NfcmVwb3J0aW5nLmNjOiIgIGdmbGFnc191bml0dGVzdCAgLS1oZWxwc2hvcnQpCisKKyMgLS1oZWxwc2hvcnQgc2hvdWxkIHNob3cgdGhlIHRsZGZsYWcgd2UgY3JlYXRlZCBpbiB0aGUgIGdmbGFnc191bml0dGVzdCAgZGlyCithZGRfZ2ZsYWdzX3Rlc3QoaGVscHNob3J0LXRsZGZsYWcxIDEgInRsZGZsYWcxIiAiJHtTTEFTSH1nb29nbGUuY2M6IiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLWhlbHBzaG9ydCkKK2FkZF9nZmxhZ3NfdGVzdChoZWxwc2hvcnQtdGxkZmxhZzIgMSAidGxkZmxhZzIiICIke1NMQVNIfWdvb2dsZS5jYzoiICBnZmxhZ3NfdW5pdHRlc3QgIC0taGVscHNob3J0KQorCisjIC0taGVscHNob3J0IHNob3VsZCB3b3JrIGlmIHRoZSBtYWluIHNvdXJjZSBmaWxlIGlzIHN1ZmZpeGVkIHdpdGggW18tXW1haW4KK2FkZF9nZmxhZ3NfdGVzdChoZWxwc2hvcnQtbWFpbiAxICIke1NMQVNIfWdmbGFnc191bml0dGVzdC1tYWluLmNjOiIgIiR7U0xBU0h9Z2ZsYWdzX3JlcG9ydGluZy5jYzoiIGdmbGFnc191bml0dGVzdC1tYWluIC0taGVscHNob3J0KQorYWRkX2dmbGFnc190ZXN0KGhlbHBzaG9ydF9tYWluIDEgIiR7U0xBU0h9Z2ZsYWdzX3VuaXR0ZXN0X21haW4uY2M6IiAiJHtTTEFTSH1nZmxhZ3NfcmVwb3J0aW5nLmNjOiIgZ2ZsYWdzX3VuaXR0ZXN0X21haW4gLS1oZWxwc2hvcnQpCisKKyMgLS1oZWxwb24gbmVlZHMgYW4gYXJndW1lbnQKK2FkZF9nZmxhZ3NfdGVzdChoZWxwb24gMSAiJy0taGVscG9uJyBpcyBtaXNzaW5nIGl0cyBhcmd1bWVudDsgZmxhZyBkZXNjcmlwdGlvbjogc2hvdyBoZWxwIG9uIiAiIiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLWhlbHBvbikKKyMgLS1oZWxwb24gYXJndW1lbnQgaW5kaWNhdGVzIHdoYXQgZmlsZSB3ZSdsbCBzaG93IGFyZ3MgZnJvbQorYWRkX2dmbGFnc190ZXN0KGhlbHBvbj1nZmxhZ3MgMSAiJHtTTEFTSH1nZmxhZ3MuY2M6IiAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M6IiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLWhlbHBvbj1nZmxhZ3MpCisjIGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50CithZGRfZ2ZsYWdzX3Rlc3QoaGVscG9uX2dmbGFncyAxICIke1NMQVNIfWdmbGFncy5jYzoiICIke1NMQVNIfWdmbGFnc191bml0dGVzdC5jYzoiICBnZmxhZ3NfdW5pdHRlc3QgIC0taGVscG9uIGdmbGFncykKKyMgdGVzdCBhbm90aGVyIGFyZ3VtZW50CithZGRfZ2ZsYWdzX3Rlc3QoaGVscG9uPWdmbGFnc191bml0dGVzdCAxICIke1NMQVNIfWdmbGFnc191bml0dGVzdC5jYzoiICIke1NMQVNIfWdmbGFncy5jYzoiICBnZmxhZ3NfdW5pdHRlc3QgIC0taGVscG9uPWdmbGFnc191bml0dGVzdCkKKworIyBoZWxwbWF0Y2ggaXMgbGlrZSBoZWxwb24gYnV0IHRha2VzIHN1YnN0cmluZ3MKK2FkZF9nZmxhZ3NfdGVzdChoZWxwbWF0Y2hfcmVwb3J0aW5nIDEgIiR7U0xBU0h9Z2ZsYWdzX3JlcG9ydGluZy5jYzoiICIke1NMQVNIfWdmbGFnc191bml0dGVzdC5jYzoiICBnZmxhZ3NfdW5pdHRlc3QgIC1oZWxwbWF0Y2ggcmVwb3J0aW5nKQorYWRkX2dmbGFnc190ZXN0KGhlbHBtYXRjaD11bml0dGVzdCAgMSAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M6IiAiJHtTTEFTSH1nZmxhZ3MuY2M6IiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtaGVscG1hdGNoPXVuaXR0ZXN0KQorCisjIGlmIG5vIGZsYWdzIGFyZSBmb3VuZCB3aXRoIGhlbHBtYXRjaCBvciBoZWxwb24sIHN1Z2dlc3QgLS1oZWxwCithZGRfZ2ZsYWdzX3Rlc3QoaGVscG1hdGNoPW5vc3VjaHN1YnN0cmluZyAxICJObyBtb2R1bGVzIG1hdGNoZWQiICIke1NMQVNIfWdmbGFnc191bml0dGVzdC5jYzoiICBnZmxhZ3NfdW5pdHRlc3QgIC1oZWxwbWF0Y2g9bm9zdWNoc3Vic3RyaW5nKQorYWRkX2dmbGFnc190ZXN0KGhlbHBvbj1ub3N1Y2htb2R1bGUgICAgICAgMSAiTm8gbW9kdWxlcyBtYXRjaGVkIiAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M6IiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtaGVscG9uPW5vc3VjaG1vZHVsZSkKKworIyBoZWxwcGFja2FnZSBzaG93cyBhbGwgdGhlIGZsYWdzIGluIHRoZSBzYW1lIGRpciBhcyB0aGlzIHVuaXR0ZXN0CisjIC0taGVscCBzaG91bGQgc2hvdyBhbGwgZmxhZ3MsIGluY2x1ZGluZyBmbGFncyBmcm9tIGdvb2dsZS5jYworYWRkX2dmbGFnc190ZXN0KGhlbHBwYWNrYWdlIDEgIiR7U0xBU0h9Z2ZsYWdzX3JlcG9ydGluZy5jYzoiICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0taGVscHBhY2thZ2UpCisKKyMgeG1sIQorYWRkX2dmbGFnc190ZXN0KGhlbHB4bWwgMSAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M8L2ZpbGU+IiAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M6IiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLWhlbHB4bWwpCisKKyMganVzdCBwcmludCB0aGUgdmVyc2lvbiBpbmZvIGFuZCBleGl0CithZGRfZ2ZsYWdzX3Rlc3QodmVyc2lvbi0xIDAgImdmbGFnc191bml0dGVzdCIgICAgICAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M6IiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLXZlcnNpb24pCithZGRfZ2ZsYWdzX3Rlc3QodmVyc2lvbi0yIDAgInZlcnNpb24gdGVzdF92ZXJzaW9uIiAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M6IiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLXZlcnNpb24pCisKKyMgLS11bmRlZm9rIGlzIGEgZnVuIGZsYWcuLi4KK2FkZF9nZmxhZ3NfdGVzdCh1bmRlZm9rLTEgMSAidW5rbm93biBjb21tYW5kIGxpbmUgZmxhZyAnZm9vJyIgIiIgIGdmbGFnc191bml0dGVzdCAgLS11bmRlZm9rPSAtLWZvbyAtLXVudXNlZF9ib29sKQorYWRkX2dmbGFnc190ZXN0KHVuZGVmb2stMiAwICJQQVNTIiAiIiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLXVuZGVmb2s9Zm9vIC0tZm9vIC0tdW51c2VkX2Jvb2wpCisjIElmIHlvdSBzYXkgZm9vIGlzIG9rIHRvIGJlIHVuZGVmaW5lZCwgd2UnbGwgYWNjZXB0IC0tbm9mb28gYXMgd2VsbAorYWRkX2dmbGFnc190ZXN0KHVuZGVmb2stMyAwICJQQVNTIiAiIiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLXVuZGVmb2s9Zm9vIC0tbm9mb28gLS11bnVzZWRfYm9vbCkKKyMgSXQncyBvayBpZiB0aGUgZm9vIGlzIGluIHRoZSBtaWRkbGUKK2FkZF9nZmxhZ3NfdGVzdCh1bmRlZm9rLTQgMCAiUEFTUyIgIiIgIGdmbGFnc191bml0dGVzdCAgLS11bmRlZm9rPWZlZSxmaSxmb28sZnVtIC0tZm9vIC0tdW51c2VkX2Jvb2wpCisjIEJ1dCB0aGUgc3BlbGxpbmcgaGFzIHRvIGJlIGp1c3QgcmlnaHQuLi4KK2FkZF9nZmxhZ3NfdGVzdCh1bmRlZm9rLTUgMSAidW5rbm93biBjb21tYW5kIGxpbmUgZmxhZyAnZm9vJyIgIiIgIGdmbGFnc191bml0dGVzdCAgLS11bmRlZm9rPWZvIC0tZm9vIC0tdW51c2VkX2Jvb2wpCithZGRfZ2ZsYWdzX3Rlc3QodW5kZWZvay02IDEgInVua25vd24gY29tbWFuZCBsaW5lIGZsYWcgJ2ZvbyciICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0tdW5kZWZvaz1mb290IC0tZm9vIC0tdW51c2VkX2Jvb2wpCisKKyMgU2VlIGlmIHdlIGNhbiBzdWNjZXNzZnVsbHkgbG9hZCBvdXIgZmxhZ3MgZnJvbSB0aGUgZmxhZ2ZpbGUKK2FkZF9nZmxhZ3NfdGVzdChmbGFnZmlsZS4xIDAgImdmbGFnc191bml0dGVzdCIgIiR7U0xBU0h9Z2ZsYWdzX3VuaXR0ZXN0LmNjOiIgIGdmbGFnc191bml0dGVzdCAgIi0tZmxhZ2ZpbGU9ZmxhZ2ZpbGUuMSIpCithZGRfZ2ZsYWdzX3Rlc3QoZmxhZ2ZpbGUuMiAwICJQQVNTIiAiIiAgZ2ZsYWdzX3VuaXR0ZXN0ICAiLS1mbGFnZmlsZT1mbGFnZmlsZS4yIikKK2FkZF9nZmxhZ3NfdGVzdChmbGFnZmlsZS4zIDAgIlBBU1MiICIiICBnZmxhZ3NfdW5pdHRlc3QgICItLWZsYWdmaWxlPWZsYWdmaWxlLjMiKQorCisjIEFsc28gdHJ5IHRvIGxvYWQgZmxhZ3MgZnJvbSB0aGUgZW52aXJvbm1lbnQKK2FkZF9nZmxhZ3NfdGVzdChmcm9tZW52PXZlcnNpb24gICAgICAwICJnZmxhZ3NfdW5pdHRlc3QiICIke1NMQVNIfWdmbGFnc191bml0dGVzdC5jYzoiICBnZmxhZ3NfdW5pdHRlc3QgIC0tZnJvbWVudj12ZXJzaW9uKQorYWRkX2dmbGFnc190ZXN0KHRyeWZyb21lbnY9dmVyc2lvbiAgIDAgImdmbGFnc191bml0dGVzdCIgIiR7U0xBU0h9Z2ZsYWdzX3VuaXR0ZXN0LmNjOiIgIGdmbGFnc191bml0dGVzdCAgLS10cnlmcm9tZW52PXZlcnNpb24pCithZGRfZ2ZsYWdzX3Rlc3QoZnJvbWVudj1oZWxwICAgICAgICAgMCAiUEFTUyIgIiIgIGdmbGFnc191bml0dGVzdCAgLS1mcm9tZW52PWhlbHApCithZGRfZ2ZsYWdzX3Rlc3QodHJ5ZnJvbWVudj1oZWxwICAgICAgMCAiUEFTUyIgIiIgIGdmbGFnc191bml0dGVzdCAgLS10cnlmcm9tZW52PWhlbHApCithZGRfZ2ZsYWdzX3Rlc3QoZnJvbWVudj1oZWxwZnVsbCAgICAgMSAiaGVscGZ1bGwgbm90IGZvdW5kIGluIGVudmlyb25tZW50IiAiIiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLWZyb21lbnY9aGVscGZ1bGwpCithZGRfZ2ZsYWdzX3Rlc3QodHJ5ZnJvbWVudj1oZWxwZnVsbCAgMCAiUEFTUyIgIiIgIGdmbGFnc191bml0dGVzdCAgLS10cnlmcm9tZW52PWhlbHBmdWxsKQorYWRkX2dmbGFnc190ZXN0KHRyeWZyb21lbnY9dW5kZWZvayAgIDAgIlBBU1MiICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0tdHJ5ZnJvbWVudj11bmRlZm9rIC0tZm9vKQorYWRkX2dmbGFnc190ZXN0KHRyeWZyb21lbnY9d2VpcmRvICAgIDEgInVua25vd24gY29tbWFuZCBsaW5lIGZsYWciICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0tdHJ5ZnJvbWVudj13ZWlyZG8pCithZGRfZ2ZsYWdzX3Rlc3QodHJ5ZnJvbWVudi1tdWx0aXBsZSAgMCAiZ2ZsYWdzX3VuaXR0ZXN0IiAiJHtTTEFTSH1nZmxhZ3NfdW5pdHRlc3QuY2M6IiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLXRyeWZyb21lbnY9dGVzdF9ib29sLHZlcnNpb24sdW51c2VkX2Jvb2wpCithZGRfZ2ZsYWdzX3Rlc3QoZnJvbWVudj10ZXN0X2Jvb2wgICAgMSAibm90IGZvdW5kIGluIGVudmlyb25tZW50IiAiIiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLWZyb21lbnY9dGVzdF9ib29sKQorYWRkX2dmbGFnc190ZXN0KGZyb21lbnY9dGVzdF9ib29sLW9rIDEgInVua25vd24gY29tbWFuZCBsaW5lIGZsYWciICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0tZnJvbWVudj10ZXN0X2Jvb2wsb2spCisjIEhlcmUsIHRoZSAtLXZlcnNpb24gb3ZlcnJpZGVzIHRoZSBmcm9tZW52CithZGRfZ2ZsYWdzX3Rlc3QodmVyc2lvbi1vdmVycmlkZXMtZnJvbWVudiAwICJnZmxhZ3NfdW5pdHRlc3QiICIke1NMQVNIfWdmbGFnc191bml0dGVzdC5jYzoiICBnZmxhZ3NfdW5pdHRlc3QgIC0tZnJvbWVudj10ZXN0X2Jvb2wsdmVyc2lvbixvaykKKworIyBNYWtlIHN1cmUgLS0gYnkgaXRzZWxmIHN0b3BzIGFyZ3YgcHJvY2Vzc2luZworYWRkX2dmbGFnc190ZXN0KGRhc2hkYXNoIDAgIlBBU1MiICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0tIC0taGVscCkKKworIyBBbmQgd2Ugc2hvdWxkIGRpZSBpZiB0aGUgZmxhZyB2YWx1ZSBkb2Vzbid0IHBhc3MgdGhlIHZhbGlkYXRvcgorYWRkX2dmbGFnc190ZXN0KGFsd2F5c19mYWlsIDEgIkVSUk9SOiBmYWlsZWQgdmFsaWRhdGlvbiBvZiBuZXcgdmFsdWUgJ3RydWUnIGZvciBmbGFnICdhbHdheXNfZmFpbCciICIiICBnZmxhZ3NfdW5pdHRlc3QgIC0tYWx3YXlzX2ZhaWwpCisKKyMgQW5kIGlmIGxvY2tpbmcgaW4gdmFsaWRhdG9ycyBmYWlscworIyBUT0RPKGFuZHJlYXMpOiBXb3JrZWQgb24gV2luZG93cyA3IFJlbGVhc2UgY29uZmlndXJhdGlvbiwgYnV0IGNhdXNlcworIyAgICAgICAgICAgICAgICBkZWJ1Z2dlciBhYm9ydCgpIGludGVydmVudGlvbiBpbiBjYXNlIG9mIERlYnVnIGNvbmZpZ3VyYXRpb24uCisjYWRkX2dmbGFnc190ZXN0KGRlYWRsb2NrX2lmX2NhbnRfbG9jayAwICJQQVNTIiAiIiAgZ2ZsYWdzX3VuaXR0ZXN0ICAtLWRlYWRsb2NrX2lmX2NhbnRfbG9jaykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHVzZSBnZmxhZ3NfZGVjbGFyZS5oCithZGRfZXhlY3V0YWJsZSAoZ2ZsYWdzX2RlY2xhcmVfdGVzdCBnZmxhZ3NfZGVjbGFyZV90ZXN0LmNjIGdmbGFnc19kZWNsYXJlX2ZsYWdzLmNjKQorCithZGRfdGVzdChOQU1FIGdmbGFnc19kZWNsYXJlIENPTU1BTkQgZ2ZsYWdzX2RlY2xhcmVfdGVzdCAtLW1lc3NhZ2UgIkhlbGxvIGdmbGFncyEiKQorc2V0X3Rlc3RzX3Byb3BlcnRpZXMoZ2ZsYWdzX2RlY2xhcmUgUFJPUEVSVElFUyBQQVNTX1JFR1VMQVJfRVhQUkVTU0lPTiAiSGVsbG8gZ2ZsYWdzISIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmUgUHl0aG9uIHNjcmlwdCB3aGljaCBjb25maWd1cmVzIGFuZCBidWlsZHMgYSB0ZXN0IHByb2plY3QKK2lmIChCVUlMRF9OQ19URVNUUyBPUiBCVUlMRF9DT05GSUdfVEVTVFMpCisgIGZpbmRfcGFja2FnZSAoUHl0aG9uSW50ZXJwKQorICBpZiAoTk9UIFBZVEhPTl9FWEVDVVRBQkxFKQorICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJObyBQeXRob24gaW5zdGFsbGF0aW9uIGZvdW5kISBJdCBpcyByZXF1aXJlZCBieSB0aGUgKG5lZ2F0aXZlKSBjb21waWxhdGlvbiB0ZXN0cy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBFaXRoZXIgaW5zdGFsbCBQeXRob24gb3Igc2V0IEJVSUxEX05DX1RFU1RTIGFuZCBCVUlMRF9DT05GSUdfVEVTVFMgdG8gRkFMU0UuIikKKyAgZW5kaWYgKCkKKyAgc2V0IChUTVBESVIgIiR7UFJPSkVDVF9CSU5BUllfRElSfS9UZXN0aW5nL1RlbXBvcmFyeSIpCisgIGNvbmZpZ3VyZV9maWxlIChnZmxhZ3NfYnVpbGQucHkuaW4gIiR7Q01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZfS9idWlsZC5weSIgQE9OTFkpCisgIGZ1bmN0aW9uIChhZGRfZ2ZsYWdzX2J1aWxkX3Rlc3QgbmFtZSBzcmNkaXIgZXhwZWN0X2ZhaWwpCisgICAgc2V0IChzcmNkaXIgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke3NyY2Rpcn0iKQorICAgIGFkZF90ZXN0ICgKKyAgICAgIE5BTUUgICAgIiR7bmFtZX0iCisgICAgICBDT01NQU5EICIke1BZVEhPTl9FWEVDVVRBQkxFfSIgIiR7Q01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZfS9idWlsZC5weSIgCisgICAgICAgICAgICAgICAgICAgICR7bmFtZX0gJHtzcmNkaXJ9ICR7ZXhwZWN0X2ZhaWx9CisgICAgKQorICBlbmRmdW5jdGlvbiAoKQorZW5kaWYgKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIG5lZ2F0aXZlIGNvbXBpbGF0aW9uIHRlc3RzCitvcHRpb24gKEJVSUxEX05DX1RFU1RTICJSZXF1ZXN0IGFkZGl0aW9uIG9mIG5lZ2F0aXZlIGNvbXBpbGF0aW9uIHRlc3RzLiIgT0ZGKQorbWFya19hc19hZHZhbmNlZCAoQlVJTERfTkNfVEVTVFMpCitpZiAoQlVJTERfTkNfVEVTVFMpCisgIGFkZF9nZmxhZ3NfYnVpbGRfdGVzdCAobmNfc2FuaXR5ICAgICAgICAgICAgICAgbmMgMCkKKyAgYWRkX2dmbGFnc19idWlsZF90ZXN0IChuY19zd2FwcGVkX2FyZ3MgICAgICAgICBuYyAxKQorICBhZGRfZ2ZsYWdzX2J1aWxkX3Rlc3QgKG5jX2ludF9pbnN0ZWFkX29mX2Jvb2wgIG5jIDEpCisgIGFkZF9nZmxhZ3NfYnVpbGRfdGVzdCAobmNfYm9vbF9pbl9xdW90ZXMgICAgICAgbmMgMSkKKyAgYWRkX2dmbGFnc19idWlsZF90ZXN0IChuY19kZWZpbmVfc3RyaW5nX3dpdGhfMCBuYyAxKQorZW5kaWYgKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGJ1aWxkIGNvbmZpZ3VyYXRpb24gdGVzdAorb3B0aW9uIChCVUlMRF9DT05GSUdfVEVTVFMgIlJlcXVlc3QgYWRkaXRpb24gb2YgcGFja2FnZSBjb25maWd1cmF0aW9uIHRlc3RzLiIgT0ZGKQorbWFya19hc19hZHZhbmNlZCAoQlVJTERfQ09ORklHX1RFU1RTKQoraWYgKEJVSUxEX0NPTkZJR19URVNUUykKKyAgYWRkX2dmbGFnc19idWlsZF90ZXN0IChjbWFrZV9jb25maWcgY29uZmlnIDApCitlbmRpZiAoKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvY29uZmlnL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvY29uZmlnL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmMyODIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9jb25maWcvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMCBAQAorIyMgZ2ZsYWdzIHBhY2thZ2UgY29uZmlndXJhdGlvbiB0ZXN0cworCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkIChWRVJTSU9OIDIuOCkKKworcHJvamVjdCAoZ2ZsYWdzXyR7VEVTVF9OQU1FfSkKKworZmluZF9wYWNrYWdlIChnZmxhZ3MgUkVRVUlSRUQpCisKK2FkZF9leGVjdXRhYmxlIChmb28gbWFpbi5jYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoZm9vIGdmbGFncykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2NvbmZpZy9tYWluLmNjIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvY29uZmlnL21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyYjg5OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2NvbmZpZy9tYWluLmNjCkBAIC0wLDAgKzEsMTIgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxnZmxhZ3MvZ2ZsYWdzLmg+CisKK0RFRklORV9zdHJpbmcobWVzc2FnZSwgIkhlbGxvIFdvcmxkISIsICJUaGUgbWVzc2FnZSB0byBwcmludCIpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGdmbGFnczo6U2V0VXNhZ2VNZXNzYWdlKCJUZXN0IENNYWtlIGNvbmZpZ3VyYXRpb24gb2YgZ2ZsYWdzIGxpYnJhcnkgKGdmbGFncy1jb25maWcuY21ha2UpIik7CisgIGdmbGFnczo6UGFyc2VDb21tYW5kTGluZUZsYWdzKCZhcmdjLCAmYXJndiwgdHJ1ZSk7CisgIHN0ZDo6Y291dCA8PCBGTEFHU19tZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9jb25maWdfZm9yX3VuaXR0ZXN0cy5oIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvY29uZmlnX2Zvcl91bml0dGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ1NzFiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvY29uZmlnX2Zvcl91bml0dGVzdHMuaApAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vIAorLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAtLS0KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8KKy8vIFRoaXMgZmlsZSBpcyBuZWVkZWQgZm9yIHdpbmRvd3MgLS0gdW5pdHRlc3RzIGFyZSBub3QgcGFydCBvZiB0aGUKKy8vIGdmbGFncyBkbGwsIGJ1dCBzdGlsbCB3YW50IHRvIGluY2x1ZGUgY29uZmlnLmgganVzdCBsaWtlIHRoZQorLy8gZGxsIGRvZXMsIHNvIHRoZXkgY2FuIHVzZSBpbnRlcm5hbCB0b29scyBhbmQgQVBJcyBmb3IgdGVzdGluZy4KKy8vCisvLyBUaGUgcHJvYmxlbSBpcyB0aGF0IGNvbmZpZy5oIGRlY2xhcmVzIEdGTEFHU19ETExfREVDTCB0byBiZQorLy8gZm9yIGV4cG9ydGluZyBzeW1ib2xzLCBidXQgdGhlIHVuaXR0ZXN0IG5lZWRzIHRvICppbXBvcnQqIHN5bWJvbHMKKy8vIChzaW5jZSBpdCdzIG5vdCB0aGUgZGxsKS4KKy8vCisvLyBUaGUgc29sdXRpb24gaXMgdG8gaGF2ZSB0aGlzIGZpbGUsIHdoaWNoIGlzIGp1c3QgbGlrZSBjb25maWcuaCBidXQKKy8vIHNldHMgR0ZMQUdTX0RMTF9ERUNMIHRvIGRvIGEgZGxsaW1wb3J0IGluc3RlYWQgb2YgYSBkbGxleHBvcnQuCisvLworLy8gVGhlIHJlYXNvbiB3ZSBuZWVkIHRoaXMgZXh0cmEgR0ZMQUdTX0RMTF9ERUNMX0ZPUl9VTklUVEVTVFMKKy8vIHZhcmlhYmxlIGlzIGluIGNhc2UgcGVvcGxlIHdhbnQgdG8gc2V0IEdGTEFHU19ETExfREVDTCBleHBsaWNpdGx5CisvLyB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkuICBJbiB0aGF0IGNhc2UsIHRoZXkKKy8vIG1heSB3YW50IHRvIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgZm9yIHRoZQorLy8gdW5pdHRlc3QgY2FzZS4gIEZvciB0aGF0LCB3ZSBhbGxvdyBmb2xrcyB0byBkZWZpbmUgYm90aAorLy8gR0ZMQUdTX0RMTF9ERUNMIGFuZCBHRkxBR1NfRExMX0RFQ0xfRk9SX1VOSVRURVNUUyBleHBsaWNpdGx5LgorLy8KKy8vIE5PVEU6IFRoaXMgZmlsZSBpcyBlcXVpdmFsZW50IHRvIGNvbmZpZy5oIG9uIG5vbi13aW5kb3dzIHN5c3RlbXMsCisvLyB3aGljaCBuZXZlciBkZWZpbmVkIEdGTEFHU19ETExfREVDTF9GT1JfVU5JVFRFU1RTIGFuZCBhbHdheXMKKy8vIGRlZmluZSBHRkxBR1NfRExMX0RFQ0wgdG8gdGhlIGVtcHR5IHN0cmluZy4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgR0ZMQUdTX0RMTF9ERUNMCisjICB1bmRlZiBHRkxBR1NfRExMX0RFQ0wKKyNlbmRpZgorI2lmZGVmIEdGTEFHU19ETExfREVGSU5FX0ZMQUcKKyMgIHVuZGVmIEdGTEFHU19ETExfREVGSU5FX0ZMQUcKKyNlbmRpZgorI2lmZGVmIEdGTEFHU19ETExfREVDTEFSRV9GTEFHCisjICB1bmRlZiBHRkxBR1NfRExMX0RFQ0xBUkVfRkxBRworI2VuZGlmCisKKyNpZmRlZiBHRkxBR1NfRExMX0RFQ0xfRk9SX1VOSVRURVNUUworIyAgZGVmaW5lIEdGTEFHU19ETExfREVDTCAgR0ZMQUdTX0RMTF9ERUNMX0ZPUl9VTklUVEVTVFMKKyNlbHNlCisjICBkZWZpbmUgR0ZMQUdTX0RMTF9ERUNMICAvLyBpZiBETExfREVDTF9GT1JfVU5JVFRFU1RTIGlzbid0IGRlZmluZWQsIHVzZSAiIgorI2VuZGlmCisKKy8vIEltcG9ydCBmbGFncyBkZWZpbmVkIGJ5IGdmbGFncy5jYworI2lmIEdGTEFHU19JU19BX0RMTCAmJiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgZGVmaW5lIEdGTEFHU19ETExfREVDTEFSRV9GTEFHIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2Vsc2UKKyMgIGRlZmluZSBHRkxBR1NfRExMX0RFQ0xBUkVfRkxBRworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZmxhZ2ZpbGUuMSBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2ZsYWdmaWxlLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmOTIxNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2ZsYWdmaWxlLjEKQEAgLTAsMCArMSBAQAorLS12ZXJzaW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZmxhZ2ZpbGUuMiBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2ZsYWdmaWxlLjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0ZjhlOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2ZsYWdmaWxlLjIKQEAgLTAsMCArMSwyIEBACistLWZvbz1iYXIKKy0tbm91bnVzZWRfYm9vbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2ZsYWdmaWxlLjMgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9mbGFnZmlsZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDkyYmIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9mbGFnZmlsZS4zCkBAIC0wLDAgKzEgQEAKKy0tZmxhZ2ZpbGU9ZmxhZ2ZpbGUuMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc19idWlsZC5weS5pbiBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc19idWlsZC5weS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNiYTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZ2ZsYWdzX2J1aWxkLnB5LmluCkBAIC0wLDAgKzEsNDMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc2h1dGlsCisKK0NNQUtFICAgICAgICAgICAgPSAnQENNQUtFX0NPTU1BTkRAJworQ01BS0VfQlVJTERfVFlQRSA9ICdAQ01BS0VfQlVJTERfVFlQRUAnCitUTVBESVIgICAgICAgICAgID0gJ0BUTVBESVJAJworU1JDRElSICAgICAgICAgICA9ICdAU1JDRElSQCcKK0dGTEFHU19ESVIgICAgICAgPSAnQGdmbGFnc19CSU5BUllfRElSQCcKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgaWYgbGVuKHN5cy5hcmd2KSAhPSA0OgorICAgIHN5cy5zdGRlcnIud3JpdGUoJyAnLmpvaW4oWyd1c2FnZTonLCBzeXMuYXJndlswXSwgJzx0ZXN0X25hbWU+IDxzcmNkaXI+IDxleHBlY3RfZmFpbDowfDE+XG4nXSkpCisgICAgc3lzLmV4aXQoMSkKKyAgdGVzdF9uYW1lICAgPSBzeXMuYXJndlsxXQorICBzcmNkaXIgICAgICA9IHN5cy5hcmd2WzJdCisgIGV4cGVjdF9mYWlsID0gKHN5cy5hcmd2WzNdLmxvd2VyKCkgaW4gWyd0cnVlJywgJ3llcycsICdvbicsICcxJ10pCisgIGJpbmRpciAgICAgID0gb3MucGF0aC5qb2luKFRNUERJUiwgdGVzdF9uYW1lKQorICBpZiBUTVBESVIgPT0gJyc6CisgICAgc3lzLnN0ZGVyci53cml0ZSgnVGVtcG9yYXJ5IGRpcmVjdG9yeSBub3Qgc2V0IVxuJykKKyAgICBzeXMuZXhpdCgxKQorICAjIGNyZWF0ZSBidWlsZCBkaXJlY3RvcnkKKyAgaWYgb3MucGF0aC5pc2RpcihiaW5kaXIpOiBzaHV0aWwucm10cmVlKGJpbmRpcikKKyAgb3MubWFrZWRpcnMoYmluZGlyKQorICAjIGNvbmZpZ3VyZSB0aGUgYnVpbGQgdHJlZQorICBpZiBzdWJwcm9jZXNzLmNhbGwoW0NNQUtFLCAnLURDTUFLRV9CVUlMRF9UWVBFOlNUUklORz0nK0NNQUtFX0JVSUxEX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctRGdmbGFnc19ESVI6UEFUSD0nK0dGTEFHU19ESVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctRFRFU1RfTkFNRTpTVFJJTkc9Jyt0ZXN0X25hbWUsIHNyY2Rpcl0sIGN3ZD1iaW5kaXIpICE9IDA6CisgICAgc3lzLnN0ZGVyci53cml0ZSgnRmFpbGVkIHRvIGNvbmZpZ3VyZSB0aGUgYnVpbGQgdHJlZSFcbicpCisgICAgc3lzLmV4aXQoMSkKKyAgIyBidWlsZCB0aGUgdGVzdCBwcm9qZWN0CisgIGV4aXRfY29kZSA9IHN1YnByb2Nlc3MuY2FsbChbQ01BS0UsICctLWJ1aWxkJywgYmluZGlyLCAnLS1jb25maWcnLCBDTUFLRV9CVUlMRF9UWVBFXSwgY3dkPWJpbmRpcikKKyAgaWYgZXhwZWN0X2ZhaWwgPT0gVHJ1ZToKKyAgICBpZiBleGl0X2NvZGUgPT0gMDoKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ0J1aWxkIGV4cGVjdGVkIHRvIGZhaWwsIGJ1dCBpdCBzdWNjZWVkZWQhXG4nKQorICAgICAgc3lzLmV4aXQoMSkKKyAgICBlbHNlOgorICAgICAgc3lzLnN0ZGVyci53cml0ZSgnQnVpbGQgZmFpbGVkIGFzIGV4cGVjdGVkXG4nKQorICAgICAgZXhpdF9jb2RlID0gMAorICBzeXMuZXhpdChleGl0X2NvZGUpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9nZmxhZ3NfZGVjbGFyZV9mbGFncy5jYyBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc19kZWNsYXJlX2ZsYWdzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTNkZTUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9nZmxhZ3NfZGVjbGFyZV9mbGFncy5jYwpAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxnZmxhZ3MvZ2ZsYWdzX2RlY2xhcmUuaD4KKworREVDTEFSRV9zdHJpbmcobWVzc2FnZSk7IC8vIGluIGdmbGFnc19kZWxjYXJlX3Rlc3QuY2MKKwordm9pZCBwcmludF9tZXNzYWdlKCkKK3sKKyAgc3RkOjpjb3V0IDw8IEZMQUdTX21lc3NhZ2UgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZ2ZsYWdzX2RlY2xhcmVfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc19kZWNsYXJlX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3YmNjMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc19kZWNsYXJlX3Rlc3QuY2MKQEAgLTAsMCArMSwxMiBAQAorI2luY2x1ZGUgPGdmbGFncy9nZmxhZ3MuaD4KKworREVGSU5FX3N0cmluZyhtZXNzYWdlLCAiIiwgIlRoZSBtZXNzYWdlIHRvIHByaW50Iik7Cit2b2lkIHByaW50X21lc3NhZ2UoKTsgLy8gaW4gZ2ZsYWdzX2RlY2xhcmVfZmxhZ3MuY2MKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBnZmxhZ3M6OlNldFVzYWdlTWVzc2FnZSgiVGVzdCBjb21waWxhdGlvbiBhbmQgdXNlIG9mIGdmbGFnc19kZWNsYXJlLmgiKTsKKyAgZ2ZsYWdzOjpQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoJmFyZ2MsICZhcmd2LCB0cnVlKTsKKyAgcHJpbnRfbWVzc2FnZSgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc19zdHJpcF9mbGFnc190ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZ2ZsYWdzX3N0cmlwX2ZsYWdzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlZjUzYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc19zdHJpcF9mbGFnc190ZXN0LmNjCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gLS0tCisvLyBBdXRob3I6IGNzaWx2ZXJzQGdvb2dsZS5jb20gKENyYWlnIFNpbHZlcnN0ZWluKQorLy8KKy8vIEEgc2ltcGxlIHByb2dyYW0gdGhhdCB1c2VzIFNUUklQX0ZMQUdfSEVMUC4gIFdlJ2xsIGhhdmUgYSBzaGVsbAorLy8gc2NyaXB0IHRoYXQgcnVucyAnc3RyaW5ncycgb3ZlciB0aGlzIHByb2dyYW0gYW5kIG1ha2VzIHN1cmUKKy8vIHRoYXQgdGhlIGhlbHAgc3RyaW5nIGlzIG5vdCBpbiB0aGVyZS4KKworI2luY2x1ZGUgImNvbmZpZ19mb3JfdW5pdHRlc3RzLmgiCisjZGVmaW5lIFNUUklQX0ZMQUdfSEVMUCAxCisjaW5jbHVkZSA8Z2ZsYWdzL2dmbGFncy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6U2V0VXNhZ2VNZXNzYWdlOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6UGFyc2VDb21tYW5kTGluZUZsYWdzOworCisKK0RFRklORV9ib29sKHRlc3QsIHRydWUsICJUaGlzIHRleHQgc2hvdWxkIGJlIHN0cmlwcGVkIG91dCIpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgU2V0VXNhZ2VNZXNzYWdlKCJVc2FnZSBtZXNzYWdlIik7CisgIFBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIGZhbHNlKTsKKworICAvLyBVbmZvcnR1bmF0ZWx5LCBmb3IgdXMsIGxpYnRvb2wgY2FuIHJlcGxhY2UgZXhlY3V0YWJsZXMgd2l0aCBhIHNoZWxsCisgIC8vIHNjcmlwdCB0aGF0IGRvZXMgc29tZSB3b3JrIGJlZm9yZSBjYWxsaW5nIHRoZSAncmVhbCcgZXhlY3V0YWJsZQorICAvLyB1bmRlciBhIGRpZmZlcmVudCBuYW1lLiAgV2UgbmVlZCB0aGUgJ3JlYWwnIGV4ZWN1dGFibGUgbmFtZSB0byBydW4KKyAgLy8gJ3N0cmluZ3MnIG9uIGl0LCBzbyB3ZSBjb25zdHJ1Y3QgdGhpcyBiaW5hcnkgdG8gcHJpbnQgdGhlIHJlYWwKKyAgLy8gbmFtZSAoYXJndlswXSkgb24gc3Rkb3V0IHdoZW4gcnVuLgorICBwdXRzKGFyZ3ZbMF0pOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZ2ZsYWdzX3N0cmlwX2ZsYWdzX3Rlc3QuY21ha2UgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9nZmxhZ3Nfc3RyaXBfZmxhZ3NfdGVzdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQxOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZ2ZsYWdzX3N0cmlwX2ZsYWdzX3Rlc3QuY21ha2UKQEAgLTAsMCArMSw3IEBACitpZiAoTk9UIEJJTkFSWSkKKyAgbWVzc2FnZSAoRkFUQWxfRVJST1IgIkJJTkFSWSBmaWxlIHRvIGNoZWNrIG5vdCBzcGVjaWZpZWQhIikKK2VuZGlmICgpCitmaWxlIChTVFJJTkdTICIke0JJTkFSWX0iIHN0cmluZ3MgUkVHRVggIlRoaXMgdGV4dCBzaG91bGQgYmUgc3RyaXBwZWQgb3V0IikKK2lmIChzdHJpbmdzKQorICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiVGV4dCBub3Qgc3RyaXBwZWQgZnJvbSBiaW5hcnkgbGlrZSBpdCBzaG91bGQgYmU6ICR7QklOQVJZfSIpCitlbmRpZiAoKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc191bml0dGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L2dmbGFnc191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGY3Mzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZ2ZsYWdzX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTUzNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gLS0tCisvLworLy8gRm9yIG5vdywgdGhpcyB1bml0IHRlc3QgZG9lcyBub3QgY292ZXIgYWxsIGZlYXR1cmVzIG9mCisvLyBnZmxhZ3MuY2MKKworI2luY2x1ZGUgImNvbmZpZ19mb3JfdW5pdHRlc3RzLmgiCisjaW5jbHVkZSA8Z2ZsYWdzL2dmbGFncy5oPgorCisjaW5jbHVkZSA8bWF0aC5oPiAgICAgICAvLyBmb3IgaXNpbmYoKSBhbmQgaXNuYW4oKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgLy8gZm9yIHVubGluaygpCisjZW5kaWYKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInV0aWwuaCIKK1RFU1RfSU5JVAorRVhQRUNUX0RFQVRIX0lOSVQKKworLy8gSSBkb24ndCBhY3R1YWxseSB1c2UgdGhpcyBoZWFkZXIgZmlsZSwgYnV0ICNpbmNsdWRlIGl0IHVuZGVyIHRoZQorLy8gb2xkIGxvY2F0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbmNsdWRlLWhlYWRlci1mb3J3YXJkaW5nCisvLyB3b3Jrcy4gIEJ1dCBkb24ndCBib3RoZXIgb24gd2luZG93czsgdGhlIHdpbmRvd3MgcG9ydCBpcyBzbyBuZXcKKy8vIGl0IG5ldmVyIGhhZCB0aGUgb2xkIGxvY2F0aW9uLW5hbWVzLgorI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGdmbGFncy9nZmxhZ3NfY29tcGxldGlvbnMuaD4KK3ZvaWQgKCp1bnVzZWRfZm4pKCkgPSAmR0ZMQUdTX05BTUVTUEFDRTo6SGFuZGxlQ29tbWFuZExpbmVDb21wbGV0aW9uczsKKyNlbmRpZgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6aW50MzI7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpGbGFnUmVnaXN0ZXJlcjsKK3VzaW5nIEdGTEFHU19OQU1FU1BBQ0U6OlN0cmluZ0Zyb21FbnY7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpSZWdpc3RlckZsYWdWYWxpZGF0b3I7Cit1c2luZyBHRkxBR1NfTkFNRVNQQUNFOjpDb21tYW5kTGluZUZsYWdJbmZvOwordXNpbmcgR0ZMQUdTX05BTUVTUEFDRTo6R2V0QWxsRmxhZ3M7CisKK0RFRklORV9zdHJpbmcodGVzdF90bXBkaXIsICIiLCAiRGlyIHdlIHVzZSBmb3IgdGVtcCBmaWxlcyIpOworREVGSU5FX3N0cmluZyhzcmNkaXIsIFN0cmluZ0Zyb21FbnYoIlNSQ0RJUiIsICIuIiksICJTb3VyY2UtZGlyIHJvb3QsIG5lZWRlZCB0byBmaW5kIGdmbGFnc191bml0dGVzdF9mbGFnZmlsZSIpOworCitERUNMQVJFX3N0cmluZyh0cnlmcm9tZW52KTsgICAvLyBpbiBnZmxhZ3MuY2MKKworREVGSU5FX2Jvb2wodGVzdF9ib29sLCBmYWxzZSwgInRlc3RzIGJvb2wtbmVzcyIpOworREVGSU5FX2ludDMyKHRlc3RfaW50MzIsIC0xLCAiIik7CitERUZJTkVfaW50NjQodGVzdF9pbnQ2NCwgLTIsICIiKTsKK0RFRklORV91aW50NjQodGVzdF91aW50NjQsIDIsICIiKTsKK0RFRklORV9kb3VibGUodGVzdF9kb3VibGUsIC0xLjAsICIiKTsKK0RFRklORV9zdHJpbmcodGVzdF9zdHJpbmcsICJpbml0aWFsIiwgIiIpOworCisvLworLy8gVGhlIGJlbG93IHVnbGluZXNzIGdldHMgc29tZSBhZGRpdGlvbmFsIGNvZGUgY292ZXJhZ2UgaW4gdGhlIC1oZWxweG1sCisvLyBhbmQgLWhlbHBtYXRjaCB0ZXN0IGNhc2VzIGhhdmluZyB0byBkbyB3aXRoIHN0cmluZyBsZW5ndGhzIGFuZCBmb3JtYXR0aW5nCisvLworREVGSU5FX2Jvb2wodGVzdF9ib29sX3dpdGhfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfcXVpdGVfbG9uZ19uYW1lLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAiZXh0cmVtZWx5X2V4dHJlbWVseV9leHRyZW1lbHlfZXh0cmVtZWx5X2V4dHJlbWVseV9leHRyZW1lbHlfZXh0cmVtZWx5X2V4dHJlbWVseV9sb25nX21lYW5pbmciKTsKKworREVGSU5FX3N0cmluZyh0ZXN0X3N0cjEsICJpbml0aWFsIiwgIiIpOworREVGSU5FX3N0cmluZyh0ZXN0X3N0cjIsICJpbml0aWFsIiwgIiIpOworREVGSU5FX3N0cmluZyh0ZXN0X3N0cjMsICJpbml0aWFsIiwgIiIpOworCisvLyBUaGlzIGlzIHVzZWQgdG8gdGVzdCBzZXR0aW5nIHRyeWZyb21lbnYgbWFudWFsbHkKK0RFRklORV9zdHJpbmcodGVzdF90cnlmcm9tZW52LCAiaW5pdGlhbCIsICIiKTsKKworLy8gRG9uJ3QgdHJ5IHRoaXMgYXQgaG9tZSEKK3N0YXRpYyBpbnQgY2hhbmdlYWJsZV92YXIgPSAxMjsKK0RFRklORV9pbnQzMihjaGFuZ2VhYmxlX3ZhciwgKytjaGFuZ2VhYmxlX3ZhciwgIiIpOworCitzdGF0aWMgaW50IGNoYW5nZWFibGVfYm9vbF92YXIgPSA4MDA4OworREVGSU5FX2Jvb2woY2hhbmdlYWJsZV9ib29sX3ZhciwgKytjaGFuZ2VhYmxlX2Jvb2xfdmFyID09IDgwMDksICIiKTsKKworc3RhdGljIGludCBjaGFuZ2VhYmxlX3N0cmluZ192YXIgPSAwOworc3RhdGljIHN0cmluZyBDaGFuZ2VhYmxlU3RyaW5nKCkgeworICBjaGFyIHJbXSA9IHtzdGF0aWNfY2FzdDxjaGFyPignMCcgKyArK2NoYW5nZWFibGVfc3RyaW5nX3ZhciksICdcMCd9OworICByZXR1cm4gcjsKK30KK0RFRklORV9zdHJpbmcoY2hhbmdlYWJsZV9zdHJpbmdfdmFyLCBDaGFuZ2VhYmxlU3RyaW5nKCksICIiKTsKKworLy8gVGhlc2UgYXJlIG5ldmVyIHVzZWQgaW4gdGhpcyB1bml0dGVzdCwgYnV0IGNhbiBiZSB1c2VkIGJ5CisvLyBnZmxhZ3NfdW5pdHRlc3Quc2ggd2hlbiBpdCBuZWVkcyB0byBzcGVjaWZ5IGZsYWdzCisvLyB0aGF0IGFyZSBsZWdhbCBmb3IgZ2ZsYWdzX3VuaXR0ZXN0IGJ1dCBkb24ndCBuZWVkIHRvCisvLyBiZSBhIHBhcnRpY3VsYXIgdmFsdWUuCitERUZJTkVfYm9vbCh1bnVzZWRfYm9vbCwgdHJ1ZSwgInVudXNlZCBib29sLW5lc3MiKTsKK0RFRklORV9pbnQzMih1bnVzZWRfaW50MzIsIC0xMDAxLCAiIik7CitERUZJTkVfaW50NjQodW51c2VkX2ludDY0LCAtMjAwMSwgIiIpOworREVGSU5FX3VpbnQ2NCh1bnVzZWRfdWludDY0LCAyMDAwLCAiIik7CitERUZJTkVfZG91YmxlKHVudXNlZF9kb3VibGUsIC0xMDAwLjAsICIiKTsKK0RFRklORV9zdHJpbmcodW51c2VkX3N0cmluZywgInVudXNlZCIsICIiKTsKKworLy8gVGhlc2UgZmxhZ3MgYXJlIHVzZWQgYnkgZ2ZsYWdzX3VuaXR0ZXN0LnNoCitERUZJTkVfYm9vbChjaGFuZ2VkX2Jvb2wxLCBmYWxzZSwgImNoYW5nZWQiKTsKK0RFRklORV9ib29sKGNoYW5nZWRfYm9vbDIsIGZhbHNlLCAiY2hhbmdlZCIpOworREVGSU5FX2Jvb2wobG9uZ19oZWxwc3RyaW5nLCBmYWxzZSwKKyAgICAgICAgICAgICJUaGlzIGhlbHBzdHJpbmcgZ29lcyBvbiBmb3JldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCAiCisgICAgICAgICAgICAiZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgIgorICAgICAgICAgICAgImV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kICIKKyAgICAgICAgICAgICJldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCAiCisgICAgICAgICAgICAiZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgIgorICAgICAgICAgICAgImV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kICIKKyAgICAgICAgICAgICJldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCAiCisgICAgICAgICAgICAiZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgZXZlciBhbmQgIgorICAgICAgICAgICAgImV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kIGV2ZXIgYW5kICIKKyAgICAgICAgICAgICJldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCBldmVyIGFuZCAiCisgICAgICAgICAgICAiZXZlci4gIFRoaXMgaXMgdGhlIGVuZCBvZiBhIGxvbmcgaGVscHN0cmluZyIpOworCisKK3N0YXRpYyBib29sIEFsd2F5c0ZhaWwoY29uc3QgY2hhciogZmxhZywgYm9vbCB2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPT0gZmFsc2U7IH0KK0RFRklORV9ib29sKGFsd2F5c19mYWlsLCBmYWxzZSwgIndpbGwgZmFpbCB0byB2YWxpZGF0ZSB3aGVuIHlvdSBzZXQgaXQiKTsKK0RFRklORV92YWxpZGF0b3IoYWx3YXlzX2ZhaWwsIEFsd2F5c0ZhaWwpOworCisvLyBTZWUgdGhlIGNvbW1lbnQgYnkgR2V0QWxsRmxhZ3MgaW4gZ2ZsYWdzLmgKK3N0YXRpYyBib29sIERlYWRsb2NrSWZDYW50TG9ja0luVmFsaWRhdG9ycyhjb25zdCBjaGFyKiBmbGFnLCBib29sIHZhbHVlKSB7CisgIGlmICghdmFsdWUpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB2ZWN0b3I8Q29tbWFuZExpbmVGbGFnSW5mbz4gZHVtbXk7CisgIEdldEFsbEZsYWdzKCZkdW1teSk7CisgIHJldHVybiB0cnVlOworfQorREVGSU5FX2Jvb2woZGVhZGxvY2tfaWZfY2FudF9sb2NrLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAid2lsbCBkZWFkbG9jayBpZiBzZXQgdG8gdHJ1ZSBhbmQgIgorICAgICAgICAgICAgImlmIGxvY2tpbmcgb2YgcmVnaXN0cnkgaW4gdmFsaWRhdG9ycyBmYWlscy4iKTsKK0RFRklORV92YWxpZGF0b3IoZGVhZGxvY2tfaWZfY2FudF9sb2NrLCBEZWFkbG9ja0lmQ2FudExvY2tJblZhbGlkYXRvcnMpOworCisjZGVmaW5lIE1BS0VGTEFHKHgpIERFRklORV9pbnQzMih0ZXN0X2ZsYWdfbnVtIyN4LCB4LCAiVGVzdCBmbGFnIikKKworLy8gRGVmaW5lIDEwIGZsYWdzCisjZGVmaW5lIE1BS0VGTEFHMTAoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VGTEFHKHgjIzkpCisKKy8vIERlZmluZSAxMDAgZmxhZ3MKKyNkZWZpbmUgTUFLRUZMQUcxMDAoeCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyMzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyM0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyM1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyM2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyM3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyM4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTUFLRUZMQUcxMCh4IyM5KQorCisvLyBEZWZpbmUgYSBidW5jaCBvZiBjb21tYW5kLWxpbmUgZmxhZ3MuICBFYWNoIG9jY3VycmVuY2Ugb2YgdGhlIE1BS0VGTEFHMTAwCisvLyBtYWNybyBkZWZpbmVzIDEwMCBpbnRlZ2VyIGZsYWdzLiAgVGhpcyBsZXRzIHVzIHRlc3QgdGhlIGVmZmVjdCBvZiBoYXZpbmcKKy8vIG1hbnkgZmxhZ3Mgb24gc3RhcnR1cCB0aW1lLgorTUFLRUZMQUcxMDAoMSk7CitNQUtFRkxBRzEwMCgyKTsKK01BS0VGTEFHMTAwKDMpOworTUFLRUZMQUcxMDAoNCk7CitNQUtFRkxBRzEwMCg1KTsKK01BS0VGTEFHMTAwKDYpOworTUFLRUZMQUcxMDAoNyk7CitNQUtFRkxBRzEwMCg4KTsKK01BS0VGTEFHMTAwKDkpOworTUFLRUZMQUcxMDAoMTApOworTUFLRUZMQUcxMDAoMTEpOworTUFLRUZMQUcxMDAoMTIpOworTUFLRUZMQUcxMDAoMTMpOworTUFLRUZMQUcxMDAoMTQpOworTUFLRUZMQUcxMDAoMTUpOworCisjdW5kZWYgTUFLRUZMQUcxMDAKKyN1bmRlZiBNQUtFRkxBRzEwCisjdW5kZWYgTUFLRUZMQUcKKworLy8gVGhpcyBpcyBhIHBzZXVkby1mbGFnIC0tIHdlIHdhbnQgdG8gcmVnaXN0ZXIgYSBmbGFnIHdpdGggYSBmaWxlbmFtZQorLy8gYXQgdGhlIHRvcCBsZXZlbCwgYnV0IHRoZXJlIGlzIG5vIHdheSB0byBkbyB0aGlzIGV4Y2VwdCBieSBmYWtpbmcKKy8vIHRoZSBmaWxlbmFtZS4KK25hbWVzcGFjZSBmTEkgeworICBzdGF0aWMgY29uc3QgaW50MzIgRkxBR1Nfbm9ub3RsZGZsYWcxID0gMTI7CisgIGludDMyIEZMQUdTX3RsZGZsYWcxID0gRkxBR1Nfbm9ub3RsZGZsYWcxOworICBpbnQzMiBGTEFHU19ub3RsZGZsYWcxID0gRkxBR1Nfbm9ub3RsZGZsYWcxOworICBzdGF0aWMgRmxhZ1JlZ2lzdGVyZXIgb190bGRmbGFnMSgKKyAgICAidGxkZmxhZzEiLCAiaW50MzIiLAorICAgICJzaG91bGQgc2hvdyB1cCBpbiAtLWhlbHBzaG9ydCIsICJnZmxhZ3NfdW5pdHRlc3QuY2MiLAorICAgICZGTEFHU190bGRmbGFnMSwgJkZMQUdTX25vdGxkZmxhZzEpOworfQordXNpbmcgZkxJOjpGTEFHU190bGRmbGFnMTsKKworbmFtZXNwYWNlIGZMSSB7CisgIHN0YXRpYyBjb25zdCBpbnQzMiBGTEFHU19ub25vdGxkZmxhZzIgPSAyMzsKKyAgaW50MzIgRkxBR1NfdGxkZmxhZzIgPSBGTEFHU19ub25vdGxkZmxhZzI7CisgIGludDMyIEZMQUdTX25vdGxkZmxhZzIgPSBGTEFHU19ub25vdGxkZmxhZzI7CisgIHN0YXRpYyBGbGFnUmVnaXN0ZXJlciBvX3RsZGZsYWcyKAorICAgICJ0bGRmbGFnMiIsICJpbnQzMiIsCisgICAgInNob3VsZCBzaG93IHVwIGluIC0taGVscHNob3J0IiwgImdmbGFnc191bml0dGVzdC4iLAorICAgICZGTEFHU190bGRmbGFnMiwgJkZMQUdTX25vdGxkZmxhZzIpOworfQordXNpbmcgZkxJOjpGTEFHU190bGRmbGFnMjsKKworbmFtZXNwYWNlIEdGTEFHU19OQU1FU1BBQ0UgeworCituYW1lc3BhY2UgeworCisKK3N0YXRpYyBzdHJpbmcgVG1wRmlsZShjb25zdCBzdHJpbmcmIGJhc2VuYW1lKSB7CisjaWZkZWYgX01TQ19WRVIKKyAgcmV0dXJuIEZMQUdTX3Rlc3RfdG1wZGlyICsgIlxcIiArIGJhc2VuYW1lOworI2Vsc2UKKyAgcmV0dXJuIEZMQUdTX3Rlc3RfdG1wZGlyICsgIi8iICsgYmFzZW5hbWU7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgLS1mbGFnZmlsZSBmbGFnIHRvIGJlIHVzZWQgaW4gdGhlIHRlc3RzLgorLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgUGFyc2VDb21tYW5kTGluZUZsYWdzKCkuCitzdGF0aWMgY29uc3QgY2hhciogR2V0RmxhZ0ZpbGVGbGFnKCkgeworI2lmZGVmIF9NU0NfVkVSCisgIHN0YXRpYyBjb25zdCBzdHJpbmcgZmxhZ2ZpbGUgPSBGTEFHU19zcmNkaXIgKyAiXFxnZmxhZ3NfdW5pdHRlc3RfZmxhZ2ZpbGUiOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IHN0cmluZyBmbGFnZmlsZSA9IEZMQUdTX3NyY2RpciArICIvZ2ZsYWdzX3VuaXR0ZXN0X2ZsYWdmaWxlIjsKKyNlbmRpZgorICBzdGF0aWMgY29uc3Qgc3RyaW5nIGZsYWdmaWxlX2ZsYWcgPSBzdHJpbmcoIi0tZmxhZ2ZpbGU9IikgKyBmbGFnZmlsZTsKKyAgcmV0dXJuIGZsYWdmaWxlX2ZsYWcuY19zdHIoKTsKK30KKworCisvLyBEZWZpbmluZyBhIHZhcmlhYmxlIG9mIHR5cGUgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIFQyPiB3aWxsIGNhdXNlIGEKKy8vIGNvbXBpbGVyIGVycm9yIGlmZiBUMSBhbmQgVDIgYXJlIGRpZmZlcmVudCB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQsIFQ+IHsKK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV4cGVjdGVkLCB0eXBlbmFtZSBBY3R1YWw+Cit2b2lkIEFzc2VydElzVHlwZShBY3R1YWwmIHgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8RXhwZWN0ZWQsIEFjdHVhbD4oKTsKK30KKworLy8gVmVyaWZ5IGFsbCB0aGUgZmxhZ3MgYXJlIHRoZSByaWdodCB0eXBlLgorVEVTVChGbGFnVHlwZXMsIEZsYWdUeXBlcykgeworICBBc3NlcnRJc1R5cGU8Ym9vbD4oRkxBR1NfdGVzdF9ib29sKTsKKyAgQXNzZXJ0SXNUeXBlPGludDMyPihGTEFHU190ZXN0X2ludDMyKTsKKyAgQXNzZXJ0SXNUeXBlPGludDY0PihGTEFHU190ZXN0X2ludDY0KTsKKyAgQXNzZXJ0SXNUeXBlPHVpbnQ2ND4oRkxBR1NfdGVzdF91aW50NjQpOworICBBc3NlcnRJc1R5cGU8ZG91YmxlPihGTEFHU190ZXN0X2RvdWJsZSk7CisgIEFzc2VydElzVHlwZTxzdHJpbmc+KEZMQUdTX3Rlc3Rfc3RyaW5nKTsKK30KKworI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUCisvLyBEZWF0aCB0ZXN0cyBmb3IgImhlbHAiIG9wdGlvbnMuCisvLworLy8gVGhlIGhlbHAgc3lzdGVtIGF1dG9tYXRpY2FsbHkgY2FsbHMgZ2ZsYWdzX2V4aXRmdW5jKDEpIHdoZW4geW91IHNwZWNpZnkgYW55IG9mCisvLyB0aGUgaGVscC1yZWxhdGVkIGZsYWdzICgiLWhlbHBtYXRjaCIsICItaGVscHhtbCIpIHNvIHdlIGNhbid0IHRlc3QKKy8vIHRob3NlIG1haW5saW5lLgorCisvLyBUZXN0cyB0aGF0ICItaGVscG1hdGNoIiBjYXVzZXMgdGhlIHByb2Nlc3MgdG8gZGllLgorVEVTVChSZWFkRmxhZ3NGcm9tU3RyaW5nRGVhdGhUZXN0LCBIZWxwTWF0Y2gpIHsKKyAgRVhQRUNUX0RFQVRIKFJlYWRGbGFnc0Zyb21TdHJpbmcoIi1oZWxwbWF0Y2g9YmFzZSIsIEdldEFyZ3YwKCksIHRydWUpLAorICAgICAgICAgICAgICAgIiIpOworfQorCisKKy8vIFRlc3RzIHRoYXQgIi1oZWxweG1sIiBjYXVzZXMgdGhlIHByb2Nlc3MgdG8gZGllLgorVEVTVChSZWFkRmxhZ3NGcm9tU3RyaW5nRGVhdGhUZXN0LCBIZWxwWG1sKSB7CisgIEVYUEVDVF9ERUFUSChSZWFkRmxhZ3NGcm9tU3RyaW5nKCItaGVscHhtbCIsIEdldEFyZ3YwKCksIHRydWUpLAorICAgICAgICAgICAgICAgIiIpOworfQorI2VuZGlmCisKKworLy8gQSBzdWJyb3V0aW5lIG5lZWRlZCBmb3IgdGVzdGluZyByZWFkaW5nIGZsYWdzIGZyb20gYSBzdHJpbmcuCit2b2lkIFRlc3RGbGFnU3RyaW5nKGNvbnN0IHN0cmluZyYgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBib29sIGV4cGVjdGVkX2Jvb2wsCisgICAgICAgICAgICAgICAgICAgIGludDMyIGV4cGVjdGVkX2ludDMyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgZXhwZWN0ZWRfZG91YmxlKSB7CisgIEVYUEVDVF9UUlVFKFJlYWRGbGFnc0Zyb21TdHJpbmcoZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QXJndjAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMgYXJlIGZhdGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOworCisgIEVYUEVDVF9FUShleHBlY3RlZF9zdHJpbmcsIEZMQUdTX3Rlc3Rfc3RyaW5nKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX2Jvb2wsIEZMQUdTX3Rlc3RfYm9vbCk7CisgIEVYUEVDVF9FUShleHBlY3RlZF9pbnQzMiwgRkxBR1NfdGVzdF9pbnQzMik7CisgIEVYUEVDVF9ET1VCTEVfRVEoZXhwZWN0ZWRfZG91YmxlLCBGTEFHU190ZXN0X2RvdWJsZSk7Cit9CisKKworLy8gVGVzdHMgcmVhZGluZyBmbGFncyBmcm9tIGEgc3RyaW5nLgorVEVTVChGbGFnRmlsZVRlc3QsIFJlYWRGbGFnc0Zyb21TdHJpbmcpIHsKKyAgVGVzdEZsYWdTdHJpbmcoCisgICAgICAvLyBGbGFnIHN0cmluZworICAgICAgIi10ZXN0X3N0cmluZz1jb250aW51ZWRcbiIKKyAgICAgICIjIHNvbWUgY29tbWVudHMgYXJlIGluIG9yZGVyXG4iCisgICAgICAiIyBzb21lXG4iCisgICAgICAiICAjIGNvbW1lbnRzXG4iCisgICAgICAiI2FyZVxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICN0cmlja2llclxuIgorICAgICAgIiMgdGhhbiBvdGhlcnNcbiIKKyAgICAgICItdGVzdF9ib29sPXRydWVcbiIKKyAgICAgICIgICAgIC10ZXN0X2ludDMyPTFcbiIKKyAgICAgICItdGVzdF9kb3VibGU9MC4wXG4iLAorICAgICAgLy8gRXhwZWN0ZWQgdmFsdWVzCisgICAgICAiY29udGludWVkIiwKKyAgICAgIHRydWUsCisgICAgICAxLAorICAgICAgMC4wKTsKKworICBUZXN0RmxhZ1N0cmluZygKKyAgICAgIC8vIEZsYWcgc3RyaW5nCisgICAgICAiIyBsZXQncyBtYWtlIHN1cmUgaXQgY2FuIHVwZGF0ZSB2YWx1ZXNcbiIKKyAgICAgICItdGVzdF9zdHJpbmc9aW5pdGlhbFxuIgorICAgICAgIi10ZXN0X2Jvb2w9ZmFsc2VcbiIKKyAgICAgICItdGVzdF9pbnQzMj0xMjNcbiIKKyAgICAgICItdGVzdF9kb3VibGU9MTIzLjBcbiIsCisgICAgICAvLyBFeHBlY3RlZCB2YWx1ZXMKKyAgICAgICJpbml0aWFsIiwKKyAgICAgIGZhbHNlLAorICAgICAgMTIzLAorICAgICAgMTIzLjApOworfQorCisvLyBUZXN0cyB0aGUgZmlsZW5hbWUgcGFydCBvZiB0aGUgZmxhZ2ZpbGUKK1RFU1QoRmxhZ0ZpbGVUZXN0LCBGaWxlbmFtZXNPdXJmaWxlTGFzdCkgeworICBGTEFHU190ZXN0X3N0cmluZyA9ICJpbml0aWFsIjsKKyAgRkxBR1NfdGVzdF9ib29sID0gZmFsc2U7CisgIEZMQUdTX3Rlc3RfaW50MzIgPSAtMTsKKyAgRkxBR1NfdGVzdF9kb3VibGUgPSAtMS4wOworICBUZXN0RmxhZ1N0cmluZygKKyAgICAgIC8vIEZsYWcgc3RyaW5nCisgICAgICAiLXRlc3Rfc3RyaW5nPWNvbnRpbnVlZFxuIgorICAgICAgIiMgc29tZSBjb21tZW50cyBhcmUgaW4gb3JkZXJcbiIKKyAgICAgICIjIHNvbWVcbiIKKyAgICAgICIgICMgY29tbWVudHNcbiIKKyAgICAgICIjYXJlXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgI3RyaWNraWVyXG4iCisgICAgICAiIyB0aGFuIG90aGVyc1xuIgorICAgICAgIm5vdF9vdXJfZmlsZW5hbWVcbiIKKyAgICAgICItdGVzdF9ib29sPXRydWVcbiIKKyAgICAgICIgICAgIC10ZXN0X2ludDMyPTFcbiIKKyAgICAgICJnZmxhZ3NfdW5pdHRlc3RcbiIKKyAgICAgICItdGVzdF9kb3VibGU9MTAwMC4wXG4iLAorICAgICAgLy8gRXhwZWN0ZWQgdmFsdWVzCisgICAgICAiY29udGludWVkIiwKKyAgICAgIGZhbHNlLAorICAgICAgLTEsCisgICAgICAxMDAwLjApOworfQorCitURVNUKEZsYWdGaWxlVGVzdCwgRmlsZW5hbWVzT3VyZmlsZUZpcnN0KSB7CisgIEZMQUdTX3Rlc3Rfc3RyaW5nID0gImluaXRpYWwiOworICBGTEFHU190ZXN0X2Jvb2wgPSBmYWxzZTsKKyAgRkxBR1NfdGVzdF9pbnQzMiA9IC0xOworICBGTEFHU190ZXN0X2RvdWJsZSA9IC0xLjA7CisgIFRlc3RGbGFnU3RyaW5nKAorICAgICAgLy8gRmxhZyBzdHJpbmcKKyAgICAgICItdGVzdF9zdHJpbmc9Y29udGludWVkXG4iCisgICAgICAiIyBzb21lIGNvbW1lbnRzIGFyZSBpbiBvcmRlclxuIgorICAgICAgIiMgc29tZVxuIgorICAgICAgIiAgIyBjb21tZW50c1xuIgorICAgICAgIiNhcmVcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAjdHJpY2tpZXJcbiIKKyAgICAgICIjIHRoYW4gb3RoZXJzXG4iCisgICAgICAiZ2ZsYWdzX3VuaXR0ZXN0XG4iCisgICAgICAiLXRlc3RfYm9vbD10cnVlXG4iCisgICAgICAiICAgICAtdGVzdF9pbnQzMj0xXG4iCisgICAgICAibm90X291cl9maWxlbmFtZVxuIgorICAgICAgIi10ZXN0X2RvdWJsZT0xMDAwLjBcbiIsCisgICAgICAvLyBFeHBlY3RlZCB2YWx1ZXMKKyAgICAgICJjb250aW51ZWQiLAorICAgICAgdHJ1ZSwKKyAgICAgIDEsCisgICAgICAtMS4wKTsKK30KKworI2lmIGRlZmluZWQoSEFWRV9GTk1BVENIX0gpIHx8IGRlZmluZWQoSEFWRV9TSExXQVBJX0gpICAvLyBvdGhlcndpc2UgZ2xvYiBpc24ndCBzdXBwb3J0ZWQKK1RFU1QoRmxhZ0ZpbGVUZXN0LCBGaWxlbmFtZXNPdXJmaWxlR2xvYikgeworICBGTEFHU190ZXN0X3N0cmluZyA9ICJpbml0aWFsIjsKKyAgRkxBR1NfdGVzdF9ib29sID0gZmFsc2U7CisgIEZMQUdTX3Rlc3RfaW50MzIgPSAtMTsKKyAgRkxBR1NfdGVzdF9kb3VibGUgPSAtMS4wOworICBUZXN0RmxhZ1N0cmluZygKKyAgICAgIC8vIEZsYWcgc3RyaW5nCisgICAgICAiLXRlc3Rfc3RyaW5nPWNvbnRpbnVlZFxuIgorICAgICAgIiMgc29tZSBjb21tZW50cyBhcmUgaW4gb3JkZXJcbiIKKyAgICAgICIjIHNvbWVcbiIKKyAgICAgICIgICMgY29tbWVudHNcbiIKKyAgICAgICIjYXJlXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgI3RyaWNraWVyXG4iCisgICAgICAiIyB0aGFuIG90aGVyc1xuIgorICAgICAgIipmbGFncypcbiIKKyAgICAgICItdGVzdF9ib29sPXRydWVcbiIKKyAgICAgICIgICAgIC10ZXN0X2ludDMyPTFcbiIKKyAgICAgICJmbGFnc1xuIgorICAgICAgIi10ZXN0X2RvdWJsZT0xMDAwLjBcbiIsCisgICAgICAvLyBFeHBlY3RlZCB2YWx1ZXMKKyAgICAgICJjb250aW51ZWQiLAorICAgICAgdHJ1ZSwKKyAgICAgIDEsCisgICAgICAtMS4wKTsKK30KKworVEVTVChGbGFnRmlsZVRlc3QsIEZpbGVuYW1lc091cmZpbGVJbkJpZ0xpc3QpIHsKKyAgRkxBR1NfdGVzdF9zdHJpbmcgPSAiaW5pdGlhbCI7CisgIEZMQUdTX3Rlc3RfYm9vbCA9IGZhbHNlOworICBGTEFHU190ZXN0X2ludDMyID0gLTE7CisgIEZMQUdTX3Rlc3RfZG91YmxlID0gLTEuMDsKKyAgVGVzdEZsYWdTdHJpbmcoCisgICAgICAvLyBGbGFnIHN0cmluZworICAgICAgIi10ZXN0X3N0cmluZz1jb250aW51ZWRcbiIKKyAgICAgICIjIHNvbWUgY29tbWVudHMgYXJlIGluIG9yZGVyXG4iCisgICAgICAiIyBzb21lXG4iCisgICAgICAiICAjIGNvbW1lbnRzXG4iCisgICAgICAiI2FyZVxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICN0cmlja2llclxuIgorICAgICAgIiMgdGhhbiBvdGhlcnNcbiIKKyAgICAgICIqZmlyc3QqICpmbGFncyogKnRoaXJkKlxuIgorICAgICAgIi10ZXN0X2Jvb2w9dHJ1ZVxuIgorICAgICAgIiAgICAgLXRlc3RfaW50MzI9MVxuIgorICAgICAgImZsYWdzXG4iCisgICAgICAiLXRlc3RfZG91YmxlPTEwMDAuMFxuIiwKKyAgICAgIC8vIEV4cGVjdGVkIHZhbHVlcworICAgICAgImNvbnRpbnVlZCIsCisgICAgICB0cnVlLAorICAgICAgMSwKKyAgICAgIC0xLjApOworfQorI2VuZGlmICAvLyBkZWZpbmVkKEhBVkVfRk5NQVRDSF9IKSB8fCBkZWZpbmVkKEhBVkVfU0hMV0FQSV9IKQorCisvLyBUZXN0cyB0aGF0IGEgZmFpbGVkIGZsYWctZnJvbS1zdHJpbmcgcmVhZCBrZWVwcyBmbGFncyBhdCBkZWZhdWx0IHZhbHVlcworVEVTVChGbGFnRmlsZVRlc3QsIEZhaWxSZWFkRmxhZ3NGcm9tU3RyaW5nKSB7CisgIEZMQUdTX3Rlc3RfaW50MzIgPSAxMTk7CisgIHN0cmluZyBmbGFncygiIyBsZXQncyBtYWtlIHN1cmUgaXQgY2FuIHVwZGF0ZSB2YWx1ZXNcbiIKKyAgICAgICAgICAgICAgICItdGVzdF9zdHJpbmc9bm9uX2luaXRpYWxcbiIKKyAgICAgICAgICAgICAgICItdGVzdF9ib29sPWZhbHNlXG4iCisgICAgICAgICAgICAgICAiLXRlc3RfaW50MzI9MTIzXG4iCisgICAgICAgICAgICAgICAiLXRlc3RfZG91YmxlPWlsbGVnYWxcbiIpOworCisgIEVYUEVDVF9GQUxTRShSZWFkRmxhZ3NGcm9tU3RyaW5nKGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRBcmd2MCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMgYXJlIGZhdGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CisKKyAgRVhQRUNUX0VRKDExOSwgRkxBR1NfdGVzdF9pbnQzMik7CisgIEVYUEVDVF9FUSgiaW5pdGlhbCIsIEZMQUdTX3Rlc3Rfc3RyaW5nKTsKK30KKworLy8gVGVzdHMgdGhhdCBmbGFncyBjYW4gYmUgc2V0IHRvIG9yZGluYXJ5IHZhbHVlcy4KK1RFU1QoU2V0RmxhZ1ZhbHVlVGVzdCwgT3JkaW5hcnlWYWx1ZXMpIHsKKyAgRVhQRUNUX0VRKCJpbml0aWFsIiwgRkxBR1NfdGVzdF9zdHIxKTsKKworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjEiLCAic2Vjb25kIiwgU0VUX0ZMQUdfSUZfREVGQVVMVCk7CisgIEVYUEVDVF9FUSgic2Vjb25kIiwgRkxBR1NfdGVzdF9zdHIxKTsgIC8vIHNldDsgd2FzIGRlZmF1bHQKKworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjEiLCAidGhpcmQiLCBTRVRfRkxBR19JRl9ERUZBVUxUKTsKKyAgRVhQRUNUX0VRKCJzZWNvbmQiLCBGTEFHU190ZXN0X3N0cjEpOyAgLy8gYWxyZWFkeSBzZXQgb25jZQorCisgIEZMQUdTX3Rlc3Rfc3RyMSA9ICJpbml0aWFsIjsKKyAgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgidGVzdF9zdHIxIiwgInRoaXJkIiwgU0VUX0ZMQUdfSUZfREVGQVVMVCk7CisgIEVYUEVDVF9FUSgiaW5pdGlhbCIsIEZMQUdTX3Rlc3Rfc3RyMSk7ICAvLyBzdGlsbCBhbHJlYWR5IHNldCBiZWZvcmUKKworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjEiLCAidGhpcmQiLCBTRVRfRkxBR1NfVkFMVUUpOworICBFWFBFQ1RfRVEoInRoaXJkIiwgRkxBR1NfdGVzdF9zdHIxKTsgIC8vIGNoYW5nZWQgdmFsdWUKKworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjEiLCAiZm91cnRoIiwgU0VUX0ZMQUdTX0RFRkFVTFQpOworICBFWFBFQ1RfRVEoInRoaXJkIiwgRkxBR1NfdGVzdF9zdHIxKTsKKyAgLy8gdmFsdWUgbm90IGNoYW5nZWQgKGFscmVhZHkgc2V0IGJlZm9yZSkKKworICBFWFBFQ1RfRVEoImluaXRpYWwiLCBGTEFHU190ZXN0X3N0cjIpOworCisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoInRlc3Rfc3RyMiIsICJzZWNvbmQiLCBTRVRfRkxBR1NfREVGQVVMVCk7CisgIEVYUEVDVF9FUSgic2Vjb25kIiwgRkxBR1NfdGVzdF9zdHIyKTsgIC8vIGNoYW5nZWQgKHdhcyBkZWZhdWx0KQorCisgIEZMQUdTX3Rlc3Rfc3RyMiA9ICJleHRyYSI7CisgIEVYUEVDVF9FUSgiZXh0cmEiLCBGTEFHU190ZXN0X3N0cjIpOworCisgIEZMQUdTX3Rlc3Rfc3RyMiA9ICJzZWNvbmQiOworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjIiLCAidGhpcmQiLCBTRVRfRkxBR1NfREVGQVVMVCk7CisgIEVYUEVDVF9FUSgidGhpcmQiLCBGTEFHU190ZXN0X3N0cjIpOyAgLy8gc3RpbGwgY2hhbmdlZCAod2FzIGVxdWFsIHRvIGRlZmF1bHQpCisKKyAgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgidGVzdF9zdHIyIiwgImZvdXJ0aCIsIFNFVF9GTEFHX0lGX0RFRkFVTFQpOworICBFWFBFQ1RfRVEoImZvdXJ0aCIsIEZMQUdTX3Rlc3Rfc3RyMik7ICAvLyBjaGFuZ2VkICh3YXMgZGVmYXVsdCkKKworICBFWFBFQ1RfRVEoImluaXRpYWwiLCBGTEFHU190ZXN0X3N0cjMpOworCisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoInRlc3Rfc3RyMyIsICJzZWNvbmQiLCBTRVRfRkxBR1NfREVGQVVMVCk7CisgIEVYUEVDVF9FUSgic2Vjb25kIiwgRkxBR1NfdGVzdF9zdHIzKTsgIC8vIGNoYW5nZWQKKworICBGTEFHU190ZXN0X3N0cjMgPSAidGhpcmQiOworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjMiLCAiZm91cnRoIiwgU0VUX0ZMQUdTX0RFRkFVTFQpOworICBFWFBFQ1RfRVEoInRoaXJkIiwgRkxBR1NfdGVzdF9zdHIzKTsgIC8vIG5vdCBjaGFuZ2VkICh3YXMgc2V0KQorCisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoInRlc3Rfc3RyMyIsICJmb3VydGgiLCBTRVRfRkxBR19JRl9ERUZBVUxUKTsKKyAgRVhQRUNUX0VRKCJ0aGlyZCIsIEZMQUdTX3Rlc3Rfc3RyMyk7ICAvLyBub3QgY2hhbmdlZCAod2FzIHNldCkKKworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjMiLCAiZm91cnRoIiwgU0VUX0ZMQUdTX1ZBTFVFKTsKKyAgRVhQRUNUX0VRKCJmb3VydGgiLCBGTEFHU190ZXN0X3N0cjMpOyAgLy8gY2hhbmdlZCB2YWx1ZQorfQorCisKKy8vIFRlc3RzIHRoYXQgZmxhZ3MgY2FuIGJlIHNldCB0byBleGNlcHRpb25hbCB2YWx1ZXMuCisvLyBOb3RlOiBhcHBhcmVudGx5IE1JTkdXIGRvZXNuJ3QgcGFyc2UgaW5mIGFuZCBuYW4gY29ycmVjdGx5OgorLy8gICAgaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL2J1Zy1nbnVsaWJAZ251Lm9yZy9tc2cwOTU3My5odG1sCisvLyBUaGlzIHVybCBzYXlzIEZyZWVCU0QgYWxzbyBoYXMgYSBwcm9ibGVtLCBidXQgSSBkaWRuJ3Qgc2VlIHRoYXQuCitURVNUKFNldEZsYWdWYWx1ZVRlc3QsIEV4Y2VwdGlvbmFsVmFsdWVzKSB7CisjaWYgZGVmaW5lZChpc2luZikgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisgIEVYUEVDVF9FUSgidGVzdF9kb3VibGUgc2V0IHRvIGluZlxuIiwKKyAgICAgICAgICAgIFNldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2RvdWJsZSIsICJpbmYiKSk7CisgIEVYUEVDVF9JTkYoRkxBR1NfdGVzdF9kb3VibGUpOworCisgIEVYUEVDVF9FUSgidGVzdF9kb3VibGUgc2V0IHRvIGluZlxuIiwKKyAgICAgICAgICAgIFNldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2RvdWJsZSIsICJJTkYiKSk7CisgIEVYUEVDVF9JTkYoRkxBR1NfdGVzdF9kb3VibGUpOworI2VuZGlmCisKKyAgLy8gc2V0IHNvbWUgYmFkIHZhbHVlcworICBFWFBFQ1RfRVEoIiIsCisgICAgICAgICAgICBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9kb3VibGUiLCAiMC4xeHh4IikpOworICBFWFBFQ1RfRVEoIiIsCisgICAgICAgICAgICBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9kb3VibGUiLCAiICIpKTsKKyAgRVhQRUNUX0VRKCIiLAorICAgICAgICAgICAgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfZG91YmxlIiwgIiIpKTsKKyNpZiBkZWZpbmVkKGlzaW5mKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyAgRVhQRUNUX0VRKCJ0ZXN0X2RvdWJsZSBzZXQgdG8gLWluZlxuIiwKKyAgICAgICAgICAgIFNldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2RvdWJsZSIsICItaW5mIikpOworICBFWFBFQ1RfSU5GKEZMQUdTX3Rlc3RfZG91YmxlKTsKKyAgRVhQRUNUX0dUKDAsIEZMQUdTX3Rlc3RfZG91YmxlKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChpc25hbikgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisgIEVYUEVDVF9FUSgidGVzdF9kb3VibGUgc2V0IHRvIG5hblxuIiwKKyAgICAgICAgICAgIFNldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2RvdWJsZSIsICJOYU4iKSk7CisgIEVYUEVDVF9OQU4oRkxBR1NfdGVzdF9kb3VibGUpOworI2VuZGlmCit9CisKKy8vIFRlc3RzIHRoYXQgaW50ZWdlciBmbGFncyBjYW4gYmUgc3BlY2lmaWVkIGluIG1hbnkgd2F5cworVEVTVChTZXRGbGFnVmFsdWVUZXN0LCBEaWZmZXJlbnRSYWRpY2VzKSB7CisgIEVYUEVDVF9FUSgidGVzdF9pbnQzMiBzZXQgdG8gMTJcbiIsCisgICAgICAgICAgICBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9pbnQzMiIsICIxMiIpKTsKKworICBFWFBFQ1RfRVEoInRlc3RfaW50MzIgc2V0IHRvIDE2XG4iLAorICAgICAgICAgICAgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfaW50MzIiLCAiMHgxMCIpKTsKKworICBFWFBFQ1RfRVEoInRlc3RfaW50MzIgc2V0IHRvIDM0XG4iLAorICAgICAgICAgICAgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfaW50MzIiLCAiMFgyMiIpKTsKKworICAvLyBMZWFkaW5nIDAgaXMgKm5vdCogb2N0YWw7IGl0J3Mgc3RpbGwgZGVjaW1hbAorICBFWFBFQ1RfRVEoInRlc3RfaW50MzIgc2V0IHRvIDEwXG4iLAorICAgICAgICAgICAgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfaW50MzIiLCAiMDEwIikpOworfQorCisvLyBUZXN0cyB3aGF0IGhhcHBlbnMgd2hlbiB5b3UgdHJ5IHRvIHNldCBhIGZsYWcgdG8gYW4gaWxsZWdhbCB2YWx1ZQorVEVTVChTZXRGbGFnVmFsdWVUZXN0LCBJbGxlZ2FsVmFsdWVzKSB7CisgIEZMQUdTX3Rlc3RfYm9vbCA9IHRydWU7CisgIEZMQUdTX3Rlc3RfaW50MzIgPSAxMTk7CisgIEZMQUdTX3Rlc3RfaW50NjQgPSAxMTkxOworICBGTEFHU190ZXN0X3VpbnQ2NCA9IDExOTExOworCisgIEVYUEVDVF9FUSgiIiwKKyAgICAgICAgICAgIFNldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2Jvb2wiLCAiMTIiKSk7CisKKyAgRVhQRUNUX0VRKCIiLAorICAgICAgICAgICAgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfaW50MzIiLCAiNzAwMDAwMDAwMDAwMCIpKTsKKworICBFWFBFQ1RfRVEoIiIsCisgICAgICAgICAgICBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF91aW50NjQiLCAiLTEiKSk7CisKKyAgRVhQRUNUX0VRKCIiLAorICAgICAgICAgICAgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfaW50NjQiLCAibm90IGEgbnVtYmVyISIpKTsKKworICAvLyBUZXN0IHRoZSBlbXB0eSBzdHJpbmcgd2l0aCBlYWNoIHR5cGUgb2YgaW5wdXQKKyAgRVhQRUNUX0VRKCIiLCBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9ib29sIiwgIiIpKTsKKyAgRVhQRUNUX0VRKCIiLCBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9pbnQzMiIsICIiKSk7CisgIEVYUEVDVF9FUSgiIiwgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfaW50NjQiLCAiIikpOworICBFWFBFQ1RfRVEoIiIsIFNldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X3VpbnQ2NCIsICIiKSk7CisgIEVYUEVDVF9FUSgiIiwgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfZG91YmxlIiwgIiIpKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0X3N0cmluZyBzZXQgdG8gXG4iLCBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9zdHJpbmciLCAiIikpOworCisgIEVYUEVDVF9UUlVFKEZMQUdTX3Rlc3RfYm9vbCk7CisgIEVYUEVDVF9FUSgxMTksIEZMQUdTX3Rlc3RfaW50MzIpOworICBFWFBFQ1RfRVEoMTE5MSwgRkxBR1NfdGVzdF9pbnQ2NCk7CisgIEVYUEVDVF9FUSgxMTkxMSwgRkxBR1NfdGVzdF91aW50NjQpOworfQorCisKKy8vIFRlc3RzIHRoYXQgd2Ugb25seSBldmFsdWF0ZSBtYWNybyBhcmdzIG9uY2UKK1RFU1QoTWFjcm9BcmdzLCBFdmFsdWF0ZU9uY2UpIHsKKyAgRVhQRUNUX0VRKDEzLCBGTEFHU19jaGFuZ2VhYmxlX3Zhcik7CisgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCArKyB0aGUgdmFsdWUgc29tZWhvdywgd2hlbiBldmFsdWF0aW5nIHRoZSBmbGFnLgorICBFWFBFQ1RfRVEoMTMsIEZMQUdTX2NoYW5nZWFibGVfdmFyKTsKKyAgLy8gTWFrZSBzdXJlIHRoZSBtYWNybyBvbmx5IGV2YWx1YXRlZCB0aGlzIHZhciBvbmNlLgorICBFWFBFQ1RfRVEoMTMsIGNoYW5nZWFibGVfdmFyKTsKKyAgLy8gTWFrZSBzdXJlIHRoZSBhY3R1YWwgdmFsdWUgYW5kIGRlZmF1bHQgdmFsdWUgYXJlIHRoZSBzYW1lCisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoImNoYW5nZWFibGVfdmFyIiwgIjIxIiwgU0VUX0ZMQUdfSUZfREVGQVVMVCk7CisgIEVYUEVDVF9FUSgyMSwgRkxBR1NfY2hhbmdlYWJsZV92YXIpOworfQorCitURVNUKE1hY3JvQXJncywgRXZhbHVhdGVPbmNlQm9vbCkgeworICBFWFBFQ1RfVFJVRShGTEFHU19jaGFuZ2VhYmxlX2Jvb2xfdmFyKTsKKyAgRVhQRUNUX1RSVUUoRkxBR1NfY2hhbmdlYWJsZV9ib29sX3Zhcik7CisgIEVYUEVDVF9FUSg4MDA5LCBjaGFuZ2VhYmxlX2Jvb2xfdmFyKTsKKyAgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgiY2hhbmdlYWJsZV9ib29sX3ZhciIsICJmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0ZMQUdfSUZfREVGQVVMVCk7CisgIEVYUEVDVF9GQUxTRShGTEFHU19jaGFuZ2VhYmxlX2Jvb2xfdmFyKTsKK30KKworVEVTVChNYWNyb0FyZ3MsIEV2YWx1YXRlT25jZVN0cmluZ3MpIHsKKyAgRVhQRUNUX0VRKCIxIiwgRkxBR1NfY2hhbmdlYWJsZV9zdHJpbmdfdmFyKTsKKyAgRVhQRUNUX0VRKCIxIiwgRkxBR1NfY2hhbmdlYWJsZV9zdHJpbmdfdmFyKTsKKyAgRVhQRUNUX0VRKDEsIGNoYW5nZWFibGVfc3RyaW5nX3Zhcik7CisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoImNoYW5nZWFibGVfc3RyaW5nX3ZhciIsICJkaWZmZXJlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9GTEFHX0lGX0RFRkFVTFQpOworICBFWFBFQ1RfRVEoImRpZmZlcmVudCIsIEZMQUdTX2NoYW5nZWFibGVfc3RyaW5nX3Zhcik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIEZvb0Zyb21FbnYgZG9lcyB0aGUgcmlnaHQgdGhpbmcKK1RFU1QoRnJvbUVudlRlc3QsIExlZ2FsVmFsdWVzKSB7CisgIHNldGVudigiQk9PTF9WQUwxIiwgInRydWUiLCAxKTsKKyAgc2V0ZW52KCJCT09MX1ZBTDIiLCAiZmFsc2UiLCAxKTsKKyAgc2V0ZW52KCJCT09MX1ZBTDMiLCAiMSIsIDEpOworICBzZXRlbnYoIkJPT0xfVkFMNCIsICJGIiwgMSk7CisgIEVYUEVDVF9UUlVFKEJvb2xGcm9tRW52KCJCT09MX1ZBTDEiLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoQm9vbEZyb21FbnYoIkJPT0xfVkFMMiIsIHRydWUpKTsKKyAgRVhQRUNUX1RSVUUoQm9vbEZyb21FbnYoIkJPT0xfVkFMMyIsIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShCb29sRnJvbUVudigiQk9PTF9WQUw0IiwgdHJ1ZSkpOworICBFWFBFQ1RfVFJVRShCb29sRnJvbUVudigiQk9PTF9WQUxfVU5LTk9XTiIsIHRydWUpKTsKKyAgRVhQRUNUX0ZBTFNFKEJvb2xGcm9tRW52KCJCT09MX1ZBTF9VTktOT1dOIiwgZmFsc2UpKTsKKworICBzZXRlbnYoIklOVF9WQUwxIiwgIjEiLCAxKTsKKyAgc2V0ZW52KCJJTlRfVkFMMiIsICItMSIsIDEpOworICBFWFBFQ1RfRVEoMSwgSW50MzJGcm9tRW52KCJJTlRfVkFMMSIsIDEwKSk7CisgIEVYUEVDVF9FUSgtMSwgSW50MzJGcm9tRW52KCJJTlRfVkFMMiIsIDEwKSk7CisgIEVYUEVDVF9FUSgxMCwgSW50MzJGcm9tRW52KCJJTlRfVkFMX1VOS05PV04iLCAxMCkpOworCisgIHNldGVudigiSU5UX1ZBTDMiLCAiMTA5OTUxMTYyNzc3NiIsIDEpOworICBFWFBFQ1RfRVEoMSwgSW50NjRGcm9tRW52KCJJTlRfVkFMMSIsIDIwKSk7CisgIEVYUEVDVF9FUSgtMSwgSW50NjRGcm9tRW52KCJJTlRfVkFMMiIsIDIwKSk7CisgIEVYUEVDVF9FUSgxMDk5NTExNjI3Nzc2TEwsIEludDY0RnJvbUVudigiSU5UX1ZBTDMiLCAyMCkpOworICBFWFBFQ1RfRVEoMjAsIEludDY0RnJvbUVudigiSU5UX1ZBTF9VTktOT1dOIiwgMjApKTsKKworICBFWFBFQ1RfRVEoMSwgVWludDY0RnJvbUVudigiSU5UX1ZBTDEiLCAzMCkpOworICBFWFBFQ1RfRVEoMTA5OTUxMTYyNzc3NlVMTCwgVWludDY0RnJvbUVudigiSU5UX1ZBTDMiLCAzMCkpOworICBFWFBFQ1RfRVEoMzAsIFVpbnQ2NEZyb21FbnYoIklOVF9WQUxfVU5LTk9XTiIsIDMwKSk7CisKKyAgLy8gSSBwaWNrIHZhbHVlcyBoZXJlIHRoYXQgY2FuIGJlIGVhc2lseSByZXByZXNlbnRlZCBleGFjdGx5IGluIGZsb2F0aW5nLXBvaW50CisgIHNldGVudigiRE9VQkxFX1ZBTDEiLCAiMC4wIiwgMSk7CisgIHNldGVudigiRE9VQkxFX1ZBTDIiLCAiMS4wIiwgMSk7CisgIHNldGVudigiRE9VQkxFX1ZBTDMiLCAiLTEuMCIsIDEpOworICBFWFBFQ1RfRVEoMC4wLCBEb3VibGVGcm9tRW52KCJET1VCTEVfVkFMMSIsIDQwLjApKTsKKyAgRVhQRUNUX0VRKDEuMCwgRG91YmxlRnJvbUVudigiRE9VQkxFX1ZBTDIiLCA0MC4wKSk7CisgIEVYUEVDVF9FUSgtMS4wLCBEb3VibGVGcm9tRW52KCJET1VCTEVfVkFMMyIsIDQwLjApKTsKKyAgRVhQRUNUX0VRKDQwLjAsIERvdWJsZUZyb21FbnYoIkRPVUJMRV9WQUxfVU5LTk9XTiIsIDQwLjApKTsKKworICBzZXRlbnYoIlNUUklOR19WQUwxIiwgIiIsIDEpOworICBzZXRlbnYoIlNUUklOR19WQUwyIiwgIm15IGhhcHB5IHN0cmluZyEiLCAxKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBTdHJpbmdGcm9tRW52KCJTVFJJTkdfVkFMMSIsICJ1bmtub3duIikpOworICBFWFBFQ1RfU1RSRVEoIm15IGhhcHB5IHN0cmluZyEiLCBTdHJpbmdGcm9tRW52KCJTVFJJTkdfVkFMMiIsICJ1bmtub3duIikpOworICBFWFBFQ1RfU1RSRVEoInVua25vd24iLCBTdHJpbmdGcm9tRW52KCJTVFJJTkdfVkFMX1VOS05PV04iLCAidW5rbm93biIpKTsKK30KKworI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUCisvLyBUZXN0cyB0aGF0IHRoZSBGb29Gcm9tRW52IGRpZXMgb24gcGFyc2UtZXJyb3IKK1RFU1QoRnJvbUVudkRlYXRoVGVzdCwgSWxsZWdhbFZhbHVlcykgeworICBzZXRlbnYoIkJPT0xfQkFEMSIsICJzbyB0cnVlISIsIDEpOworICBzZXRlbnYoIkJPT0xfQkFEMiIsICIiLCAxKTsKKyAgRVhQRUNUX0RFQVRIKEJvb2xGcm9tRW52KCJCT09MX0JBRDEiLCBmYWxzZSksICJlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSIpOworICBFWFBFQ1RfREVBVEgoQm9vbEZyb21FbnYoIkJPT0xfQkFEMiIsIHRydWUpLCAiZXJyb3IgcGFyc2luZyBlbnYgdmFyaWFibGUiKTsKKworICBzZXRlbnYoIklOVF9CQUQxIiwgIm9uZSIsIDEpOworICBzZXRlbnYoIklOVF9CQUQyIiwgIjEwMDAwMDAwMDAwMDAwMDAwMCIsIDEpOworICBzZXRlbnYoIklOVF9CQUQzIiwgIjB4eDEwIiwgMSk7CisgIHNldGVudigiSU5UX0JBRDQiLCAiIiwgMSk7CisgIEVYUEVDVF9ERUFUSChJbnQzMkZyb21FbnYoIklOVF9CQUQxIiwgMTApLCAiZXJyb3IgcGFyc2luZyBlbnYgdmFyaWFibGUiKTsKKyAgRVhQRUNUX0RFQVRIKEludDMyRnJvbUVudigiSU5UX0JBRDIiLCAxMCksICJlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSIpOworICBFWFBFQ1RfREVBVEgoSW50MzJGcm9tRW52KCJJTlRfQkFEMyIsIDEwKSwgImVycm9yIHBhcnNpbmcgZW52IHZhcmlhYmxlIik7CisgIEVYUEVDVF9ERUFUSChJbnQzMkZyb21FbnYoIklOVF9CQUQ0IiwgMTApLCAiZXJyb3IgcGFyc2luZyBlbnYgdmFyaWFibGUiKTsKKworICBzZXRlbnYoIkJJR0lOVF9CQUQxIiwgIjE4NDQ2NzQ0MDczNzA5NTUxNjE2MDAwIiwgMSk7CisgIEVYUEVDVF9ERUFUSChJbnQ2NEZyb21FbnYoIklOVF9CQUQxIiwgMjApLCAiZXJyb3IgcGFyc2luZyBlbnYgdmFyaWFibGUiKTsKKyAgRVhQRUNUX0RFQVRIKEludDY0RnJvbUVudigiSU5UX0JBRDMiLCAyMCksICJlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSIpOworICBFWFBFQ1RfREVBVEgoSW50NjRGcm9tRW52KCJJTlRfQkFENCIsIDIwKSwgImVycm9yIHBhcnNpbmcgZW52IHZhcmlhYmxlIik7CisgIEVYUEVDVF9ERUFUSChJbnQ2NEZyb21FbnYoIkJJR0lOVF9CQUQxIiwgMjAwKSwgImVycm9yIHBhcnNpbmcgZW52IHZhcmlhYmxlIik7CisKKyAgc2V0ZW52KCJCSUdJTlRfQkFEMiIsICItMSIsIDEpOworICBFWFBFQ1RfREVBVEgoVWludDY0RnJvbUVudigiSU5UX0JBRDEiLCAzMCksICJlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSIpOworICBFWFBFQ1RfREVBVEgoVWludDY0RnJvbUVudigiSU5UX0JBRDMiLCAzMCksICJlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSIpOworICBFWFBFQ1RfREVBVEgoVWludDY0RnJvbUVudigiSU5UX0JBRDQiLCAzMCksICJlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSIpOworICBFWFBFQ1RfREVBVEgoVWludDY0RnJvbUVudigiQklHSU5UX0JBRDEiLCAzMCksICJlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSIpOworICAvLyBUT0RPKGNzaWx2ZXJzKTogdW5jb21tZW50IHRoaXMgd2hlbiB3ZSBkaXNhbGxvdyBuZWdhdGl2ZSBudW1iZXJzIGZvciB1aW50NjQKKyNpZiAwCisgIEVYUEVDVF9ERUFUSChVaW50NjRGcm9tRW52KCJCSUdJTlRfQkFEMiIsIDMwKSwgImVycm9yIHBhcnNpbmcgZW52IHZhcmlhYmxlIik7CisjZW5kaWYKKworICBzZXRlbnYoIkRPVUJMRV9CQUQxIiwgIjAuMC4wIiwgMSk7CisgIHNldGVudigiRE9VQkxFX0JBRDIiLCAiIiwgMSk7CisgIEVYUEVDVF9ERUFUSChEb3VibGVGcm9tRW52KCJET1VCTEVfQkFEMSIsIDQwLjApLCAiZXJyb3IgcGFyc2luZyBlbnYgdmFyaWFibGUiKTsKKyAgRVhQRUNUX0RFQVRIKERvdWJsZUZyb21FbnYoIkRPVUJMRV9CQUQyIiwgNDAuMCksICJlcnJvciBwYXJzaW5nIGVudiB2YXJpYWJsZSIpOworfQorI2VuZGlmCisKKworLy8gVGVzdHMgdGhhdCBGbGFnU2F2ZXIgY2FuIHNhdmUgdGhlIHN0YXRlcyBvZiBzdHJpbmcgZmxhZ3MuCitURVNUKEZsYWdTYXZlclRlc3QsIENhblNhdmVTdHJpbmdGbGFnU3RhdGVzKSB7CisgIC8vIDEuIEluaXRpYWxpemVzIHRoZSBmbGFncy4KKworICAvLyBTdGF0ZSBvZiBmbGFnIHRlc3Rfc3RyMToKKyAgLy8gICBkZWZhdWx0IHZhbHVlIC0gImluaXRpYWwiCisgIC8vICAgY3VycmVudCB2YWx1ZSAtICJpbml0aWFsIgorICAvLyAgIG5vdCBzZXQgICAgICAgLSB0cnVlCisKKyAgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgidGVzdF9zdHIyIiwgInNlY29uZCIsIFNFVF9GTEFHU19WQUxVRSk7CisgIC8vIFN0YXRlIG9mIGZsYWcgdGVzdF9zdHIyOgorICAvLyAgIGRlZmF1bHQgdmFsdWUgLSAiaW5pdGlhbCIKKyAgLy8gICBjdXJyZW50IHZhbHVlIC0gInNlY29uZCIKKyAgLy8gICBub3Qgc2V0ICAgICAgIC0gZmFsc2UKKworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjMiLCAic2Vjb25kIiwgU0VUX0ZMQUdTX0RFRkFVTFQpOworICAvLyBTdGF0ZSBvZiBmbGFnIHRlc3Rfc3RyMzoKKyAgLy8gICBkZWZhdWx0IHZhbHVlIC0gInNlY29uZCIKKyAgLy8gICBjdXJyZW50IHZhbHVlIC0gInNlY29uZCIKKyAgLy8gICBub3Qgc2V0ICAgICAgIC0gdHJ1ZQorCisgIC8vIDIuIFNhdmVzIHRoZSBmbGFnIHN0YXRlcy4KKworICB7CisgICAgRmxhZ1NhdmVyIGZzOworCisgICAgLy8gMy4gTW9kaWZpZXMgdGhlIGZsYWcgc3RhdGVzLgorCisgICAgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgidGVzdF9zdHIxIiwgInNlY29uZCIsIFNFVF9GTEFHU19WQUxVRSk7CisgICAgRVhQRUNUX0VRKCJzZWNvbmQiLCBGTEFHU190ZXN0X3N0cjEpOworICAgIC8vIFN0YXRlIG9mIGZsYWcgdGVzdF9zdHIxOgorICAgIC8vICAgZGVmYXVsdCB2YWx1ZSAtICJzZWNvbmQiCisgICAgLy8gICBjdXJyZW50IHZhbHVlIC0gInNlY29uZCIKKyAgICAvLyAgIG5vdCBzZXQgICAgICAgLSB0cnVlCisKKyAgICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjIiLCAidGhpcmQiLCBTRVRfRkxBR1NfREVGQVVMVCk7CisgICAgRVhQRUNUX0VRKCJzZWNvbmQiLCBGTEFHU190ZXN0X3N0cjIpOworICAgIC8vIFN0YXRlIG9mIGZsYWcgdGVzdF9zdHIyOgorICAgIC8vICAgZGVmYXVsdCB2YWx1ZSAtICJ0aGlyZCIKKyAgICAvLyAgIGN1cnJlbnQgdmFsdWUgLSAic2Vjb25kIgorICAgIC8vICAgbm90IHNldCAgICAgICAtIGZhbHNlCisKKyAgICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X3N0cjMiLCAidGhpcmQiLCBTRVRfRkxBR1NfVkFMVUUpOworICAgIEVYUEVDVF9FUSgidGhpcmQiLCBGTEFHU190ZXN0X3N0cjMpOworICAgIC8vIFN0YXRlIG9mIGZsYWcgdGVzdF9zdHIxOgorICAgIC8vICAgZGVmYXVsdCB2YWx1ZSAtICJzZWNvbmQiCisgICAgLy8gICBjdXJyZW50IHZhbHVlIC0gInRoaXJkIgorICAgIC8vICAgbm90IHNldCAgICAgICAtIGZhbHNlCisKKyAgICAvLyA0LiBSZXN0b3JlcyB0aGUgZmxhZyBzdGF0ZXMuCisgIH0KKworICAvLyA1LiBWZXJpZmllcyB0aGF0IHRoZSBzdGF0ZXMgd2VyZSByZXN0b3JlZC4KKworICAvLyBWZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBvZiB0ZXN0X3N0cjEgd2FzIHJlc3RvcmVkLgorICBFWFBFQ1RfRVEoImluaXRpYWwiLCBGTEFHU190ZXN0X3N0cjEpOworICAvLyBWZXJpZmllcyB0aGF0IHRoZSAibm90IHNldCIgYXR0cmlidXRlIG9mIHRlc3Rfc3RyMSB3YXMgcmVzdG9yZWQgdG8gdHJ1ZS4KKyAgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgidGVzdF9zdHIxIiwgInNlY29uZCIsIFNFVF9GTEFHX0lGX0RFRkFVTFQpOworICBFWFBFQ1RfRVEoInNlY29uZCIsIEZMQUdTX3Rlc3Rfc3RyMSk7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGVzdF9zdHIyIHdhcyByZXN0b3JlZC4KKyAgRVhQRUNUX0VRKCJzZWNvbmQiLCBGTEFHU190ZXN0X3N0cjIpOworICAvLyBWZXJpZmllcyB0aGF0IHRoZSAibm90IHNldCIgYXR0cmlidXRlIG9mIHRlc3Rfc3RyMiB3YXMgcmVzdG9yZWQgdG8gZmFsc2UuCisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoInRlc3Rfc3RyMiIsICJmb3VydGgiLCBTRVRfRkxBR19JRl9ERUZBVUxUKTsKKyAgRVhQRUNUX0VRKCJzZWNvbmQiLCBGTEFHU190ZXN0X3N0cjIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHZhbHVlIG9mIHRlc3Rfc3RyMyB3YXMgcmVzdG9yZWQuCisgIEVYUEVDVF9FUSgic2Vjb25kIiwgRkxBR1NfdGVzdF9zdHIzKTsKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgIm5vdCBzZXQiIGF0dHJpYnV0ZSBvZiB0ZXN0X3N0cjMgd2FzIHJlc3RvcmVkIHRvIHRydWUuCisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoInRlc3Rfc3RyMyIsICJmb3VydGgiLCBTRVRfRkxBR19JRl9ERUZBVUxUKTsKKyAgRVhQRUNUX0VRKCJmb3VydGgiLCBGTEFHU190ZXN0X3N0cjMpOworfQorCisKKy8vIFRlc3RzIHRoYXQgRmxhZ1NhdmVyIGNhbiBzYXZlIHRoZSB2YWx1ZXMgb2YgdmFyaW91cy10eXBlZCBmbGFncy4KK1RFU1QoRmxhZ1NhdmVyVGVzdCwgQ2FuU2F2ZVZhcmlvdXNUeXBlZEZsYWdWYWx1ZXMpIHsKKyAgLy8gSW5pdGlhbGl6ZXMgdGhlIGZsYWdzLgorICBGTEFHU190ZXN0X2Jvb2wgPSBmYWxzZTsKKyAgRkxBR1NfdGVzdF9pbnQzMiA9IC0xOworICBGTEFHU190ZXN0X2ludDY0ID0gLTI7CisgIEZMQUdTX3Rlc3RfdWludDY0ID0gMzsKKyAgRkxBR1NfdGVzdF9kb3VibGUgPSA0LjA7CisgIEZMQUdTX3Rlc3Rfc3RyaW5nID0gImdvb2QiOworCisgIC8vIFNhdmVzIHRoZSBmbGFnIHN0YXRlcy4KKyAgeworICAgIEZsYWdTYXZlciBmczsKKworICAgIC8vIE1vZGlmaWVzIHRoZSBmbGFncy4KKyAgICBGTEFHU190ZXN0X2Jvb2wgPSB0cnVlOworICAgIEZMQUdTX3Rlc3RfaW50MzIgPSAtNTsKKyAgICBGTEFHU190ZXN0X2ludDY0ID0gLTY7CisgICAgRkxBR1NfdGVzdF91aW50NjQgPSA3OworICAgIEZMQUdTX3Rlc3RfZG91YmxlID0gOC4wOworICAgIEZMQUdTX3Rlc3Rfc3RyaW5nID0gImJhZCI7CisKKyAgICAvLyBSZXN0b3JlcyB0aGUgZmxhZyBzdGF0ZXMuCisgIH0KKworICAvLyBWZXJpZmllcyB0aGUgZmxhZyB2YWx1ZXMgd2VyZSByZXN0b3JlZC4KKyAgRVhQRUNUX0ZBTFNFKEZMQUdTX3Rlc3RfYm9vbCk7CisgIEVYUEVDVF9FUSgtMSwgRkxBR1NfdGVzdF9pbnQzMik7CisgIEVYUEVDVF9FUSgtMiwgRkxBR1NfdGVzdF9pbnQ2NCk7CisgIEVYUEVDVF9FUSgzLCBGTEFHU190ZXN0X3VpbnQ2NCk7CisgIEVYUEVDVF9ET1VCTEVfRVEoNC4wLCBGTEFHU190ZXN0X2RvdWJsZSk7CisgIEVYUEVDVF9FUSgiZ29vZCIsIEZMQUdTX3Rlc3Rfc3RyaW5nKTsKK30KKworVEVTVChHZXRBbGxGbGFnc1Rlc3QsIEJhc2VUZXN0KSB7CisgIHZlY3RvcjxDb21tYW5kTGluZUZsYWdJbmZvPiBmbGFnczsKKyAgR2V0QWxsRmxhZ3MoJmZsYWdzKTsKKyAgYm9vbCBmb3VuZF90ZXN0X2Jvb2wgPSBmYWxzZTsKKyAgdmVjdG9yPENvbW1hbmRMaW5lRmxhZ0luZm8+Ojpjb25zdF9pdGVyYXRvciBpOworICBmb3IgKGkgPSBmbGFncy5iZWdpbigpOyBpICE9IGZsYWdzLmVuZCgpOyArK2kpIHsKKyAgICBpZiAoaS0+bmFtZSA9PSAidGVzdF9ib29sIikgeworICAgICAgZm91bmRfdGVzdF9ib29sID0gdHJ1ZTsKKyAgICAgIEVYUEVDVF9FUShpLT50eXBlLCAiYm9vbCIpOworICAgICAgRVhQRUNUX0VRKGktPmRlZmF1bHRfdmFsdWUsICJmYWxzZSIpOworICAgICAgRVhQRUNUX0VRKGktPmZsYWdfcHRyLCAmRkxBR1NfdGVzdF9ib29sKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBFWFBFQ1RfVFJVRShmb3VuZF90ZXN0X2Jvb2wpOworfQorCitURVNUKFNob3dVc2FnZVdpdGhGbGFnc1Rlc3QsIEJhc2VUZXN0KSB7CisgIC8vIFRPRE8oY3NpbHZlcnMpOiB0ZXN0IHRoaXMgYnkgYWxsb3dpbmcgb3V0cHV0IG90aGVyIHRoYW4gdG8gc3Rkb3V0LgorICAvLyBOb3QgdXJnZW50IHNpbmNlIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyB0ZXN0ZWQgdmlhCisgIC8vIGdmbGFnc191bml0dGVzdC5zaCwgdGhvdWdoIG9ubHkgdGhyb3VnaCB1c2Ugb2YgLS1oZWxwLgorfQorCitURVNUKFNob3dVc2FnZVdpdGhGbGFnc1Jlc3RyaWN0VGVzdCwgQmFzZVRlc3QpIHsKKyAgLy8gVE9ETyhjc2lsdmVycyk6IHRlc3QgdGhpcyBieSBhbGxvd2luZyBvdXRwdXQgb3RoZXIgdGhhbiB0byBzdGRvdXQuCisgIC8vIE5vdCB1cmdlbnQgc2luY2UgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHRlc3RlZCB2aWEKKyAgLy8gZ2ZsYWdzX3VuaXR0ZXN0LnNoLCB0aG91Z2ggb25seSB0aHJvdWdoIHVzZSBvZiAtLWhlbHBtYXRjaC4KK30KKworLy8gTm90ZTogYWxsIHRoZXNlIGFyZ3YtYmFzZWQgdGVzdHMgZGVwZW5kIG9uIFNldEFyZ3YgYmVpbmcgY2FsbGVkCisvLyBiZWZvcmUgUGFyc2VDb21tYW5kTGluZUZsYWdzKCkgaW4gbWFpbigpLCBiZWxvdy4KK1RFU1QoR2V0QXJndnNUZXN0LCBCYXNlVGVzdCkgeworICB2ZWN0b3I8c3RyaW5nPiBhcmd2cyA9IEdldEFyZ3ZzKCk7CisgIEVYUEVDVF9FUSg0LCBhcmd2cy5zaXplKCkpOworICBFWFBFQ1RfRVEoIi90ZXN0L2FyZ3YvZm9yL2dmbGFnc191bml0dGVzdCIsIGFyZ3ZzWzBdKTsKKyAgRVhQRUNUX0VRKCJhcmd2IDIiLCBhcmd2c1sxXSk7CisgIEVYUEVDVF9FUSgiM3JkIGFyZ3YiLCBhcmd2c1syXSk7CisgIEVYUEVDVF9FUSgiYXJndiAjNCIsIGFyZ3ZzWzNdKTsKK30KKworVEVTVChHZXRBcmd2VGVzdCwgQmFzZVRlc3QpIHsKKyAgRVhQRUNUX1NUUkVRKCIvdGVzdC9hcmd2L2Zvci9nZmxhZ3NfdW5pdHRlc3QgIgorICAgICAgICAgICAgICAgImFyZ3YgMiAzcmQgYXJndiBhcmd2ICM0IiwgR2V0QXJndigpKTsKK30KKworVEVTVChHZXRBcmd2MFRlc3QsIEJhc2VUZXN0KSB7CisgIEVYUEVDVF9TVFJFUSgiL3Rlc3QvYXJndi9mb3IvZ2ZsYWdzX3VuaXR0ZXN0IiwgR2V0QXJndjAoKSk7Cit9CisKK1RFU1QoR2V0QXJndlN1bVRlc3QsIEJhc2VUZXN0KSB7CisgIC8vIFRoaXMgbnVtYmVyIGlzIGp1c3QgdGhlIHN1bSBvZiB0aGUgQVNDSUkgdmFsdWVzIG9mIGFsbCB0aGUgY2hhcnMKKyAgLy8gaW4gR2V0QXJndigpLgorICBFWFBFQ1RfRVEoNDkwNCwgR2V0QXJndlN1bSgpKTsKK30KKworVEVTVChQcm9ncmFtSW52b2NhdGlvbk5hbWVUZXN0LCBCYXNlVGVzdCkgeworICBFWFBFQ1RfU1RSRVEoIi90ZXN0L2FyZ3YvZm9yL2dmbGFnc191bml0dGVzdCIsCisgICAgICAgICAgICAgICBQcm9ncmFtSW52b2NhdGlvbk5hbWUoKSk7Cit9CisKK1RFU1QoUHJvZ3JhbUludm9jYXRpb25TaG9ydE5hbWVUZXN0LCBCYXNlVGVzdCkgeworICBFWFBFQ1RfU1RSRVEoImdmbGFnc191bml0dGVzdCIsIFByb2dyYW1JbnZvY2F0aW9uU2hvcnROYW1lKCkpOworfQorCitURVNUKFByb2dyYW1Vc2FnZVRlc3QsIEJhc2VUZXN0KSB7ICAvLyBEZXBlbmRzIG9uIDFzdCBhcmcgdG8gUGFyc2VDb21tYW5kTGluZUZsYWdzKCkKKyAgRVhQRUNUX1NUUkVRKCIvdGVzdC9hcmd2L2Zvci9nZmxhZ3NfdW5pdHRlc3Q6ICIKKyAgICAgICAgICAgICAgICI8dXNlbGVzcyBmbGFnPiBbLi4uXVxuRG9lcyBzb21ldGhpbmcgdXNlbGVzcy5cbiIsCisgICAgICAgICAgICAgICBQcm9ncmFtVXNhZ2UoKSk7Cit9CisKK1RFU1QoR2V0Q29tbWFuZExpbmVPcHRpb25UZXN0LCBOYW1lRXhpc3RzQW5kSXNEZWZhdWx0KSB7CisgIHN0cmluZyB2YWx1ZSgid2lsbCBiZSBjaGFuZ2VkIik7CisgIGJvb2wgciA9IEdldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2Jvb2wiLCAmdmFsdWUpOworICBFWFBFQ1RfVFJVRShyKTsKKyAgRVhQRUNUX0VRKCJmYWxzZSIsIHZhbHVlKTsKKworICByID0gR2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfaW50MzIiLCAmdmFsdWUpOworICBFWFBFQ1RfVFJVRShyKTsKKyAgRVhQRUNUX0VRKCItMSIsIHZhbHVlKTsKK30KKworVEVTVChHZXRDb21tYW5kTGluZU9wdGlvblRlc3QsIE5hbWVFeGlzdHNBbmRXYXNBc3NpZ25lZCkgeworICBGTEFHU190ZXN0X2ludDMyID0gNDAwOworICBzdHJpbmcgdmFsdWUoIndpbGwgYmUgY2hhbmdlZCIpOworICBjb25zdCBib29sIHIgPSBHZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9pbnQzMiIsICZ2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKHIpOworICBFWFBFQ1RfRVEoIjQwMCIsIHZhbHVlKTsKK30KKworVEVTVChHZXRDb21tYW5kTGluZU9wdGlvblRlc3QsIE5hbWVFeGlzdHNBbmRXYXNTZXQpIHsKKyAgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfaW50MzIiLCAiNzAwIik7CisgIHN0cmluZyB2YWx1ZSgid2lsbCBiZSBjaGFuZ2VkIik7CisgIGNvbnN0IGJvb2wgciA9IEdldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2ludDMyIiwgJnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUocik7CisgIEVYUEVDVF9FUSgiNzAwIiwgdmFsdWUpOworfQorCitURVNUKEdldENvbW1hbmRMaW5lT3B0aW9uVGVzdCwgTmFtZUV4aXN0c0FuZFdhc05vdFNldCkgeworICAvLyBUaGlzIGRvZXNuJ3Qgc2V0IHRoZSBmbGFnJ3MgdmFsdWUsIGJ1dCByYXRoZXIgaXRzIGRlZmF1bHQgdmFsdWUuCisgIC8vIGlzX2RlZmF1bHQgaXMgc3RpbGwgdHJ1ZSwgYnV0IHRoZSAnZGVmYXVsdCcgdmFsdWUgcmV0dXJuZWQgaGFzIGNoYW5nZWQhCisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoInRlc3RfaW50MzIiLCAiODAwIiwgU0VUX0ZMQUdTX0RFRkFVTFQpOworICBzdHJpbmcgdmFsdWUoIndpbGwgYmUgY2hhbmdlZCIpOworICBjb25zdCBib29sIHIgPSBHZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9pbnQzMiIsICZ2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKHIpOworICBFWFBFQ1RfRVEoIjgwMCIsIHZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q29tbWFuZExpbmVGbGFnSW5mb09yRGllKCJ0ZXN0X2ludDMyIikuaXNfZGVmYXVsdCk7Cit9CisKK1RFU1QoR2V0Q29tbWFuZExpbmVPcHRpb25UZXN0LCBOYW1lRXhpc3RzQW5kV2FzQ29uZGl0aW9uYWxseVNldCkgeworICBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X2ludDMyIiwgIjkwMCIsIFNFVF9GTEFHX0lGX0RFRkFVTFQpOworICBzdHJpbmcgdmFsdWUoIndpbGwgYmUgY2hhbmdlZCIpOworICBjb25zdCBib29sIHIgPSBHZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9pbnQzMiIsICZ2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKHIpOworICBFWFBFQ1RfRVEoIjkwMCIsIHZhbHVlKTsKK30KKworVEVTVChHZXRDb21tYW5kTGluZU9wdGlvblRlc3QsIE5hbWVEb2VzTm90RXhpc3QpIHsKKyAgc3RyaW5nIHZhbHVlKCJ3aWxsIG5vdCBiZSBjaGFuZ2VkIik7CisgIGNvbnN0IGJvb2wgciA9IEdldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2ludDMyMTAiLCAmdmFsdWUpOworICBFWFBFQ1RfRkFMU0Uocik7CisgIEVYUEVDVF9FUSgid2lsbCBub3QgYmUgY2hhbmdlZCIsIHZhbHVlKTsKK30KKworVEVTVChHZXRDb21tYW5kTGluZUZsYWdJbmZvVGVzdCwgRmxhZ0V4aXN0cykgeworICBDb21tYW5kTGluZUZsYWdJbmZvIGluZm87CisgIGJvb2wgciA9IEdldENvbW1hbmRMaW5lRmxhZ0luZm8oInRlc3RfaW50MzIiLCAmaW5mbyk7CisgIEVYUEVDVF9UUlVFKHIpOworICBFWFBFQ1RfRVEoInRlc3RfaW50MzIiLCBpbmZvLm5hbWUpOworICBFWFBFQ1RfRVEoImludDMyIiwgaW5mby50eXBlKTsKKyAgRVhQRUNUX0VRKCIiLCBpbmZvLmRlc2NyaXB0aW9uKTsKKyAgRVhQRUNUX0VRKCItMSIsIGluZm8uY3VycmVudF92YWx1ZSk7CisgIEVYUEVDVF9FUSgiLTEiLCBpbmZvLmRlZmF1bHRfdmFsdWUpOworICBFWFBFQ1RfVFJVRShpbmZvLmlzX2RlZmF1bHQpOworICBFWFBFQ1RfRkFMU0UoaW5mby5oYXNfdmFsaWRhdG9yX2ZuKTsKKyAgRVhQRUNUX0VRKCZGTEFHU190ZXN0X2ludDMyLCBpbmZvLmZsYWdfcHRyKTsKKworICBGTEFHU190ZXN0X2Jvb2wgPSB0cnVlOworICByID0gR2V0Q29tbWFuZExpbmVGbGFnSW5mbygidGVzdF9ib29sIiwgJmluZm8pOworICBFWFBFQ1RfVFJVRShyKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0X2Jvb2wiLCBpbmZvLm5hbWUpOworICBFWFBFQ1RfRVEoImJvb2wiLCBpbmZvLnR5cGUpOworICBFWFBFQ1RfRVEoInRlc3RzIGJvb2wtbmVzcyIsIGluZm8uZGVzY3JpcHRpb24pOworICBFWFBFQ1RfRVEoInRydWUiLCBpbmZvLmN1cnJlbnRfdmFsdWUpOworICBFWFBFQ1RfRVEoImZhbHNlIiwgaW5mby5kZWZhdWx0X3ZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGluZm8uaXNfZGVmYXVsdCk7CisgIEVYUEVDVF9GQUxTRShpbmZvLmhhc192YWxpZGF0b3JfZm4pOworICBFWFBFQ1RfRVEoJkZMQUdTX3Rlc3RfYm9vbCwgaW5mby5mbGFnX3B0cik7CisKKyAgRkxBR1NfdGVzdF9ib29sID0gZmFsc2U7CisgIHIgPSBHZXRDb21tYW5kTGluZUZsYWdJbmZvKCJ0ZXN0X2Jvb2wiLCAmaW5mbyk7CisgIEVYUEVDVF9UUlVFKHIpOworICBFWFBFQ1RfRVEoInRlc3RfYm9vbCIsIGluZm8ubmFtZSk7CisgIEVYUEVDVF9FUSgiYm9vbCIsIGluZm8udHlwZSk7CisgIEVYUEVDVF9FUSgidGVzdHMgYm9vbC1uZXNzIiwgaW5mby5kZXNjcmlwdGlvbik7CisgIEVYUEVDVF9FUSgiZmFsc2UiLCBpbmZvLmN1cnJlbnRfdmFsdWUpOworICBFWFBFQ1RfRVEoImZhbHNlIiwgaW5mby5kZWZhdWx0X3ZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGluZm8uaXNfZGVmYXVsdCk7ICAvLyB2YWx1ZSBpcyBzYW1lLCBidXQgZmxhZyAqd2FzKiBtb2RpZmllZAorICBFWFBFQ1RfRkFMU0UoaW5mby5oYXNfdmFsaWRhdG9yX2ZuKTsKKyAgRVhQRUNUX0VRKCZGTEFHU190ZXN0X2Jvb2wsIGluZm8uZmxhZ19wdHIpOworfQorCitURVNUKEdldENvbW1hbmRMaW5lRmxhZ0luZm9UZXN0LCBGbGFnRG9lc05vdEV4aXN0KSB7CisgIENvbW1hbmRMaW5lRmxhZ0luZm8gaW5mbzsKKyAgLy8gU2V0IHRvIHNvbWUgcmFuZG9tIHZhbHVlcyB0aGF0IEdldENvbW1hbmRMaW5lRmxhZ0luZm8gc2hvdWxkIG5vdCBjaGFuZ2UKKyAgaW5mby5uYW1lID0gIm5hbWUiOworICBpbmZvLnR5cGUgPSAidHlwZSI7CisgIGluZm8uY3VycmVudF92YWx1ZSA9ICJjdXJyIjsKKyAgaW5mby5kZWZhdWx0X3ZhbHVlID0gImRlZiI7CisgIGluZm8uZmlsZW5hbWUgPSAiLyI7CisgIGluZm8uaXNfZGVmYXVsdCA9IGZhbHNlOworICBpbmZvLmhhc192YWxpZGF0b3JfZm4gPSB0cnVlOworICBpbmZvLmZsYWdfcHRyID0gTlVMTDsKKyAgYm9vbCByID0gR2V0Q29tbWFuZExpbmVGbGFnSW5mbygidGVzdF9pbnQzMjEwIiwgJmluZm8pOworICBFWFBFQ1RfRkFMU0Uocik7CisgIEVYUEVDVF9FUSgibmFtZSIsIGluZm8ubmFtZSk7CisgIEVYUEVDVF9FUSgidHlwZSIsIGluZm8udHlwZSk7CisgIEVYUEVDVF9FUSgiIiwgaW5mby5kZXNjcmlwdGlvbik7CisgIEVYUEVDVF9FUSgiY3VyciIsIGluZm8uY3VycmVudF92YWx1ZSk7CisgIEVYUEVDVF9FUSgiZGVmIiwgaW5mby5kZWZhdWx0X3ZhbHVlKTsKKyAgRVhQRUNUX0VRKCIvIiwgaW5mby5maWxlbmFtZSk7CisgIEVYUEVDVF9GQUxTRShpbmZvLmlzX2RlZmF1bHQpOworICBFWFBFQ1RfVFJVRShpbmZvLmhhc192YWxpZGF0b3JfZm4pOworICBFWFBFQ1RfRVEoTlVMTCwgaW5mby5mbGFnX3B0cik7Cit9CisKK1RFU1QoR2V0Q29tbWFuZExpbmVGbGFnSW5mb09yRGllVGVzdCwgRmxhZ0V4aXN0c0FuZElzRGVmYXVsdCkgeworICBDb21tYW5kTGluZUZsYWdJbmZvIGluZm87CisgIGluZm8gPSBHZXRDb21tYW5kTGluZUZsYWdJbmZvT3JEaWUoInRlc3RfaW50MzIiKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0X2ludDMyIiwgaW5mby5uYW1lKTsKKyAgRVhQRUNUX0VRKCJpbnQzMiIsIGluZm8udHlwZSk7CisgIEVYUEVDVF9FUSgiIiwgaW5mby5kZXNjcmlwdGlvbik7CisgIEVYUEVDVF9FUSgiLTEiLCBpbmZvLmN1cnJlbnRfdmFsdWUpOworICBFWFBFQ1RfRVEoIi0xIiwgaW5mby5kZWZhdWx0X3ZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaW5mby5pc19kZWZhdWx0KTsKKyAgRVhQRUNUX0VRKCZGTEFHU190ZXN0X2ludDMyLCBpbmZvLmZsYWdfcHRyKTsKKyAgaW5mbyA9IEdldENvbW1hbmRMaW5lRmxhZ0luZm9PckRpZSgidGVzdF9ib29sIik7CisgIEVYUEVDVF9FUSgidGVzdF9ib29sIiwgaW5mby5uYW1lKTsKKyAgRVhQRUNUX0VRKCJib29sIiwgaW5mby50eXBlKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0cyBib29sLW5lc3MiLCBpbmZvLmRlc2NyaXB0aW9uKTsKKyAgRVhQRUNUX0VRKCJmYWxzZSIsIGluZm8uY3VycmVudF92YWx1ZSk7CisgIEVYUEVDVF9FUSgiZmFsc2UiLCBpbmZvLmRlZmF1bHRfdmFsdWUpOworICBFWFBFQ1RfVFJVRShpbmZvLmlzX2RlZmF1bHQpOworICBFWFBFQ1RfRkFMU0UoaW5mby5oYXNfdmFsaWRhdG9yX2ZuKTsKKyAgRVhQRUNUX0VRKCZGTEFHU190ZXN0X2Jvb2wsIGluZm8uZmxhZ19wdHIpOworfQorCitURVNUKEdldENvbW1hbmRMaW5lRmxhZ0luZm9PckRpZVRlc3QsIEZsYWdFeGlzdHNBbmRXYXNBc3NpZ25lZCkgeworICBGTEFHU190ZXN0X2ludDMyID0gNDAwOworICBDb21tYW5kTGluZUZsYWdJbmZvIGluZm87CisgIGluZm8gPSBHZXRDb21tYW5kTGluZUZsYWdJbmZvT3JEaWUoInRlc3RfaW50MzIiKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0X2ludDMyIiwgaW5mby5uYW1lKTsKKyAgRVhQRUNUX0VRKCJpbnQzMiIsIGluZm8udHlwZSk7CisgIEVYUEVDVF9FUSgiIiwgaW5mby5kZXNjcmlwdGlvbik7CisgIEVYUEVDVF9FUSgiNDAwIiwgaW5mby5jdXJyZW50X3ZhbHVlKTsKKyAgRVhQRUNUX0VRKCItMSIsIGluZm8uZGVmYXVsdF92YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpbmZvLmlzX2RlZmF1bHQpOworICBFWFBFQ1RfRVEoJkZMQUdTX3Rlc3RfaW50MzIsIGluZm8uZmxhZ19wdHIpOworICBGTEFHU190ZXN0X2Jvb2wgPSB0cnVlOworICBpbmZvID0gR2V0Q29tbWFuZExpbmVGbGFnSW5mb09yRGllKCJ0ZXN0X2Jvb2wiKTsKKyAgRVhQRUNUX0VRKCJ0ZXN0X2Jvb2wiLCBpbmZvLm5hbWUpOworICBFWFBFQ1RfRVEoImJvb2wiLCBpbmZvLnR5cGUpOworICBFWFBFQ1RfRVEoInRlc3RzIGJvb2wtbmVzcyIsIGluZm8uZGVzY3JpcHRpb24pOworICBFWFBFQ1RfRVEoInRydWUiLCBpbmZvLmN1cnJlbnRfdmFsdWUpOworICBFWFBFQ1RfRVEoImZhbHNlIiwgaW5mby5kZWZhdWx0X3ZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKGluZm8uaXNfZGVmYXVsdCk7CisgIEVYUEVDVF9GQUxTRShpbmZvLmhhc192YWxpZGF0b3JfZm4pOworICBFWFBFQ1RfRVEoJkZMQUdTX3Rlc3RfYm9vbCwgaW5mby5mbGFnX3B0cik7Cit9CisKKyNpZmRlZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorVEVTVChHZXRDb21tYW5kTGluZUZsYWdJbmZvT3JEaWVEZWF0aFRlc3QsIEZsYWdEb2VzTm90RXhpc3QpIHsKKyAgRVhQRUNUX0RFQVRIKEdldENvbW1hbmRMaW5lRmxhZ0luZm9PckRpZSgidGVzdF9pbnQzMjEwIiksCisgICAgICAgICAgICAgICAiLio6IGZsYWcgdGVzdF9pbnQzMjEwIGRvZXMgbm90IGV4aXN0Iik7Cit9CisjZW5kaWYKKworCisvLyBUaGVzZSBhcmUgbGlnaHRseSB0ZXN0ZWQgYmVjYXVzZSB0aGV5J3JlIGRlcHJlY2F0ZWQuICBCYXNpY2FsbHksCisvLyB0aGUgdGVzdHMgYXJlIG1lYW50IHRvIGNvdmVyIGhvdyBleGlzdGluZyB1c2VycyB1c2UgdGhlc2UgZnVuY3Rpb25zLAorLy8gYnV0IG5vdCBuZWNlc3NhcmlseSBob3cgbmV3IHVzZXJzIGNvdWxkIHVzZSB0aGVtLgorVEVTVChEZXByZWNhdGVkRnVuY3Rpb25zVGVzdCwgQ29tbWFuZGxpbmVGbGFnc0ludG9TdHJpbmcpIHsKKyAgc3RyaW5nIHMgPSBDb21tYW5kbGluZUZsYWdzSW50b1N0cmluZygpOworICBFWFBFQ1RfTkUoc3RyaW5nOjpucG9zLCBzLmZpbmQoIi0tdGVzdF9ib29sPSIpKTsKK30KKworVEVTVChEZXByZWNhdGVkRnVuY3Rpb25zVGVzdCwgQXBwZW5kRmxhZ3NJbnRvRmlsZSkgeworICBGTEFHU190ZXN0X2ludDMyID0gMTA7ICAgICAvLyBqdXN0IHRvIG1ha2UgdGhlIHRlc3QgbW9yZSBpbnRlcmVzdGluZworICBzdHJpbmcgZmlsZW5hbWUoVG1wRmlsZSgiZmxhZ2ZpbGUiKSk7CisgIHVubGluayhmaWxlbmFtZS5jX3N0cigpKTsgIC8vIGp1c3QgdG8gYmUgc2FmZQorICBjb25zdCBib29sIHIgPSBBcHBlbmRGbGFnc0ludG9GaWxlKGZpbGVuYW1lLCAibm90IHRoZSByZWFsIGFyZ3YwIik7CisgIEVYUEVDVF9UUlVFKHIpOworCisgIEZJTEUqIGZwOworICBFWFBFQ1RfRVEoMCwgU2FmZUZPcGVuKCZmcCwgZmlsZW5hbWUuY19zdHIoKSwgInIiKSk7CisgIEVYUEVDVF9UUlVFKGZwICE9IE5VTEwpOworICBjaGFyIGxpbmVbODE5Ml07CisgIEVYUEVDVF9UUlVFKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKS0xLCBmcCkgIT0gTlVMTCk7ICAvLyBnZXQgdGhlIGZpcnN0IGxpbmUKKyAgLy8gRmlyc3QgbGluZSBzaG91bGQgYmUgcHJvZ25hbWUuCisgIEVYUEVDVF9TVFJFUSgibm90IHRoZSByZWFsIGFyZ3YwXG4iLCBsaW5lKTsKKworICBib29sIGZvdW5kX2Jvb2wgPSBmYWxzZSwgZm91bmRfaW50MzIgPSBmYWxzZTsKKyAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKS0xLCBmcCkpIHsKKyAgICBsaW5lW3NpemVvZihsaW5lKS0xXSA9ICdcMCc7ICAgIC8vIGp1c3QgdG8gYmUgc2FmZQorICAgIGlmIChzdHJjbXAobGluZSwgIi0tdGVzdF9ib29sPWZhbHNlXG4iKSA9PSAwKQorICAgICAgZm91bmRfYm9vbCA9IHRydWU7CisgICAgaWYgKHN0cmNtcChsaW5lLCAiLS10ZXN0X2ludDMyPTEwXG4iKSA9PSAwKQorICAgICAgZm91bmRfaW50MzIgPSB0cnVlOworICB9CisgIEVYUEVDVF9UUlVFKGZvdW5kX2ludDMyKTsKKyAgRVhQRUNUX1RSVUUoZm91bmRfYm9vbCk7CisgIGZjbG9zZShmcCk7Cit9CisKK1RFU1QoRGVwcmVjYXRlZEZ1bmN0aW9uc1Rlc3QsIFJlYWRGcm9tRmxhZ3NGaWxlKSB7CisgIEZMQUdTX3Rlc3RfaW50MzIgPSAtMTA7ICAgIC8vIGp1c3QgdG8gbWFrZSB0aGUgdGVzdCBtb3JlIGludGVyZXN0aW5nCisgIHN0cmluZyBmaWxlbmFtZShUbXBGaWxlKCJmbGFnZmlsZTIiKSk7CisgIHVubGluayhmaWxlbmFtZS5jX3N0cigpKTsgIC8vIGp1c3QgdG8gYmUgc2FmZQorICBib29sIHIgPSBBcHBlbmRGbGFnc0ludG9GaWxlKGZpbGVuYW1lLCBHZXRBcmd2MCgpKTsKKyAgRVhQRUNUX1RSVUUocik7CisKKyAgRkxBR1NfdGVzdF9pbnQzMiA9IC0xMTsKKyAgciA9IFJlYWRGcm9tRmxhZ3NGaWxlKGZpbGVuYW1lLCBHZXRBcmd2MCgpLCB0cnVlKTsKKyAgRVhQRUNUX1RSVUUocik7CisgIEVYUEVDVF9FUSgtMTAsIEZMQUdTX3Rlc3RfaW50MzIpOworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworVEVTVChEZXByZWNhdGVkRnVuY3Rpb25zVGVzdCwgUmVhZEZyb21GbGFnc0ZpbGVGYWlsdXJlKSB7CisgIEZMQUdTX3Rlc3RfaW50MzIgPSAtMjA7CisgIHN0cmluZyBmaWxlbmFtZShUbXBGaWxlKCJmbGFnZmlsZTMiKSk7CisgIEZJTEUqIGZwOworICBFWFBFQ1RfRVEoMCwgU2FmZUZPcGVuKCZmcCwgZmlsZW5hbWUuY19zdHIoKSwgInciKSk7CisgIEVYUEVDVF9UUlVFKGZwICE9IE5VTEwpOworICAvLyBOb3RlIHRoZSBlcnJvciBpbiB0aGUgYm9vbCBhc3NpZ25tZW50IGJlbG93Li4uCisgIGZwcmludGYoZnAsICIlc1xuLS10ZXN0X2ludDMyPS0yMVxuLS10ZXN0X2Jvb2w9bm90X2FfYm9vbCFcbiIsIEdldEFyZ3YwKCkpOworICBmY2xvc2UoZnApOworCisgIEZMQUdTX3Rlc3RfaW50MzIgPSAtMjI7CisgIGNvbnN0IGJvb2wgciA9IFJlYWRGcm9tRmxhZ3NGaWxlKGZpbGVuYW1lLCBHZXRBcmd2MCgpLCBmYWxzZSk7CisgIEVYUEVDVF9GQUxTRShyKTsKKyAgRVhQRUNUX0VRKC0yMiwgRkxBR1NfdGVzdF9pbnQzMik7ICAgLy8gdGhlIC0yMSBmcm9tIHRoZSBmbGFnc2ZpbGUgZGlkbid0IHRha2UKK30KKworVEVTVChGbGFnc1NldEJlZm9yZUluaXRUZXN0LCBUcnlGcm9tRW52KSB7CisgIEVYUEVDVF9FUSgicHJlLXNldCIsIEZMQUdTX3Rlc3RfdHJ5ZnJvbWVudik7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdGVzdCBjYXNlIHZlcmlmaWVzIHRoYXQgUGFyc2VDb21tYW5kTGluZUZsYWdzKCkgYW5kCisvLyBQYXJzZUNvbW1hbmRMaW5lTm9uSGVscEZsYWdzKCkgdXNlcyB0aGUgbGFzdCBkZWZpbml0aW9uIG9mIGEgZmxhZworLy8gaW4gY2FzZSBpdCdzIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UuCisKK0RFRklORV9pbnQzMih0ZXN0X2ZsYWcsIC0xLCAidXNlZCBmb3IgdGVzdGluZyBnZmxhZ3MuY2MiKTsKKworLy8gUGFyc2VzIGFuZCByZXR1cm5zIHRoZSAtLXRlc3RfZmxhZyBmbGFnLgorLy8gSWYgd2l0aF9oZWxwIGlzIHRydWUsIGNhbGxzIFBhcnNlQ29tbWFuZExpbmVGbGFnczsgb3RoZXJ3aXNlIGNhbGxzCisvLyBQYXJzZUNvbW1hbmRMaW5lTm9uSGVscEZsYWdzLgoraW50MzIgUGFyc2VUZXN0RmxhZyhib29sIHdpdGhfaGVscCwgaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBjb25zdF9hcmd2KSB7CisgIEZsYWdTYXZlciBmczsgIC8vIFJlc3RvcmVzIHRoZSBmbGFncyBiZWZvcmUgcmV0dXJuaW5nLgorCisgIC8vIE1ha2VzIGEgY29weSBvZiB0aGUgaW5wdXQgYXJyYXkgcy50LiBpdCBjYW4gYmUgcmV1c2VkCisgIC8vIChQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoKSB3aWxsIGFsdGVyIHRoZSBhcnJheSkuCisgIGNoYXIqKiBjb25zdCBhcmd2X3NhdmUgPSBuZXcgY2hhcipbYXJnYyArIDFdOworICBjaGFyKiogYXJndiA9IGFyZ3Zfc2F2ZTsKKyAgbWVtY3B5KGFyZ3YsIGNvbnN0X2FyZ3YsIHNpemVvZigqYXJndikqKGFyZ2MgKyAxKSk7CisKKyAgaWYgKHdpdGhfaGVscCkgeworICAgIFBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIHRydWUpOworICB9IGVsc2UgeworICAgIFBhcnNlQ29tbWFuZExpbmVOb25IZWxwRmxhZ3MoJmFyZ2MsICZhcmd2LCB0cnVlKTsKKyAgfQorCisgIGRlbGV0ZVtdIGFyZ3Zfc2F2ZTsKKyAgcmV0dXJuIEZMQUdTX3Rlc3RfZmxhZzsKK30KKworVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NVc2VzTGFzdERlZmluaXRpb25UZXN0LAorICAgICBXaGVuRmxhZ0lzRGVmaW5lZFR3aWNlT25Db21tYW5kTGluZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgIm15X3Rlc3QiLAorICAgICItLXRlc3RfZmxhZz0xIiwKKyAgICAiLS10ZXN0X2ZsYWc9MiIsCisgICAgTlVMTCwKKyAgfTsKKworICBFWFBFQ1RfRVEoMiwgUGFyc2VUZXN0RmxhZyh0cnVlLCBhcnJheXNpemUoYXJndikgLSAxLCBhcmd2KSk7CisgIEVYUEVDVF9FUSgyLCBQYXJzZVRlc3RGbGFnKGZhbHNlLCBhcnJheXNpemUoYXJndikgLSAxLCBhcmd2KSk7Cit9CisKK1RFU1QoUGFyc2VDb21tYW5kTGluZUZsYWdzVXNlc0xhc3REZWZpbml0aW9uVGVzdCwKKyAgICAgV2hlbkZsYWdJc0RlZmluZWRUd2ljZUluRmxhZ0ZpbGUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJteV90ZXN0IiwKKyAgICBHZXRGbGFnRmlsZUZsYWcoKSwKKyAgICBOVUxMLAorICB9OworCisgIEVYUEVDVF9FUSgyLCBQYXJzZVRlc3RGbGFnKHRydWUsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpKTsKKyAgRVhQRUNUX0VRKDIsIFBhcnNlVGVzdEZsYWcoZmFsc2UsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpKTsKK30KKworVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NVc2VzTGFzdERlZmluaXRpb25UZXN0LAorICAgICBXaGVuRmxhZ0lzRGVmaW5lZEluQ29tbWFuZExpbmVBbmRUaGVuRmxhZ0ZpbGUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJteV90ZXN0IiwKKyAgICAiLS10ZXN0X2ZsYWc9MCIsCisgICAgR2V0RmxhZ0ZpbGVGbGFnKCksCisgICAgTlVMTCwKKyAgfTsKKworICBFWFBFQ1RfRVEoMiwgUGFyc2VUZXN0RmxhZyh0cnVlLCBhcnJheXNpemUoYXJndikgLSAxLCBhcmd2KSk7CisgIEVYUEVDVF9FUSgyLCBQYXJzZVRlc3RGbGFnKGZhbHNlLCBhcnJheXNpemUoYXJndikgLSAxLCBhcmd2KSk7Cit9CisKK1RFU1QoUGFyc2VDb21tYW5kTGluZUZsYWdzVXNlc0xhc3REZWZpbml0aW9uVGVzdCwKKyAgICAgV2hlbkZsYWdJc0RlZmluZWRJbkZsYWdGaWxlQW5kVGhlbkNvbW1hbmRMaW5lKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAibXlfdGVzdCIsCisgICAgR2V0RmxhZ0ZpbGVGbGFnKCksCisgICAgIi0tdGVzdF9mbGFnPTMiLAorICAgIE5VTEwsCisgIH07CisKKyAgRVhQRUNUX0VRKDMsIFBhcnNlVGVzdEZsYWcodHJ1ZSwgYXJyYXlzaXplKGFyZ3YpIC0gMSwgYXJndikpOworICBFWFBFQ1RfRVEoMywgUGFyc2VUZXN0RmxhZyhmYWxzZSwgYXJyYXlzaXplKGFyZ3YpIC0gMSwgYXJndikpOworfQorCitURVNUKFBhcnNlQ29tbWFuZExpbmVGbGFnc1VzZXNMYXN0RGVmaW5pdGlvblRlc3QsCisgICAgIFdoZW5GbGFnSXNEZWZpbmVkSW5Db21tYW5kTGluZUFuZEZsYWdGaWxlQW5kVGhlbkNvbW1hbmRMaW5lKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAibXlfdGVzdCIsCisgICAgIi0tdGVzdF9mbGFnPTAiLAorICAgIEdldEZsYWdGaWxlRmxhZygpLAorICAgICItLXRlc3RfZmxhZz0zIiwKKyAgICBOVUxMLAorICB9OworCisgIEVYUEVDVF9FUSgzLCBQYXJzZVRlc3RGbGFnKHRydWUsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpKTsKKyAgRVhQRUNUX0VRKDMsIFBhcnNlVGVzdEZsYWcoZmFsc2UsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpKTsKK30KKworVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NBbmREYXNoQXJncywgVHdvRGFzaEFyZ0ZpcnN0KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAibXlfdGVzdCIsCisgICAgIi0tIiwKKyAgICAiLS10ZXN0X2ZsYWc9MCIsCisgICAgTlVMTCwKKyAgfTsKKworICBFWFBFQ1RfRVEoLTEsIFBhcnNlVGVzdEZsYWcodHJ1ZSwgYXJyYXlzaXplKGFyZ3YpIC0gMSwgYXJndikpOworICBFWFBFQ1RfRVEoLTEsIFBhcnNlVGVzdEZsYWcoZmFsc2UsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpKTsKK30KKworVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NBbmREYXNoQXJncywgVHdvRGFzaEFyZ01pZGRsZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgIm15X3Rlc3QiLAorICAgICItLXRlc3RfZmxhZz03IiwKKyAgICAiLS0iLAorICAgICItLXRlc3RfZmxhZz0wIiwKKyAgICBOVUxMLAorICB9OworCisgIEVYUEVDVF9FUSg3LCBQYXJzZVRlc3RGbGFnKHRydWUsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpKTsKKyAgRVhQRUNUX0VRKDcsIFBhcnNlVGVzdEZsYWcoZmFsc2UsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpKTsKK30KKworVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NBbmREYXNoQXJncywgT25lRGFzaEFyZykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgIm15X3Rlc3QiLAorICAgICItIiwKKyAgICAiLS10ZXN0X2ZsYWc9MCIsCisgICAgTlVMTCwKKyAgfTsKKworICBFWFBFQ1RfRVEoMCwgUGFyc2VUZXN0RmxhZyh0cnVlLCBhcnJheXNpemUoYXJndikgLSAxLCBhcmd2KSk7CisgIEVYUEVDVF9FUSgwLCBQYXJzZVRlc3RGbGFnKGZhbHNlLCBhcnJheXNpemUoYXJndikgLSAxLCBhcmd2KSk7Cit9CisKKyNpZmRlZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NVbmtub3duRmxhZ0RlYXRoVGVzdCwKKyAgICAgRmxhZ0lzQ29tcGxldGVseVVua25vd24pIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJteV90ZXN0IiwKKyAgICAiLS10aGlzX2ZsYWdfZG9lc19ub3RfZXhpc3QiLAorICAgIE5VTEwsCisgIH07CisKKyAgRVhQRUNUX0RFQVRIKFBhcnNlVGVzdEZsYWcodHJ1ZSwgYXJyYXlzaXplKGFyZ3YpIC0gMSwgYXJndiksCisgICAgICAgICAgICAgICAidW5rbm93biBjb21tYW5kIGxpbmUgZmxhZy4qIik7CisgIEVYUEVDVF9ERUFUSChQYXJzZVRlc3RGbGFnKGZhbHNlLCBhcnJheXNpemUoYXJndikgLSAxLCBhcmd2KSwKKyAgICAgICAgICAgICAgICJ1bmtub3duIGNvbW1hbmQgbGluZSBmbGFnLioiKTsKK30KKworVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NVbmtub3duRmxhZ0RlYXRoVGVzdCwKKyAgICAgQm9vbEZsYWdJc0NvbXBsZXRlbHlVbmtub3duKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAibXlfdGVzdCIsCisgICAgIi0tbm90aGlzX2ZsYWdfZG9lc19ub3RfZXhpc3QiLAorICAgIE5VTEwsCisgIH07CisKKyAgRVhQRUNUX0RFQVRIKFBhcnNlVGVzdEZsYWcodHJ1ZSwgYXJyYXlzaXplKGFyZ3YpIC0gMSwgYXJndiksCisgICAgICAgICAgICAgICAidW5rbm93biBjb21tYW5kIGxpbmUgZmxhZy4qIik7CisgIEVYUEVDVF9ERUFUSChQYXJzZVRlc3RGbGFnKGZhbHNlLCBhcnJheXNpemUoYXJndikgLSAxLCBhcmd2KSwKKyAgICAgICAgICAgICAgICJ1bmtub3duIGNvbW1hbmQgbGluZSBmbGFnLioiKTsKK30KKworVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NVbmtub3duRmxhZ0RlYXRoVGVzdCwKKyAgICAgRmxhZ0lzTm90QUJvb2wpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJteV90ZXN0IiwKKyAgICAiLS1ub3Rlc3Rfc3RyaW5nIiwKKyAgICBOVUxMLAorICB9OworCisgIEVYUEVDVF9ERUFUSChQYXJzZVRlc3RGbGFnKHRydWUsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpLAorICAgICAgICAgICAgICAgImJvb2xlYW4gdmFsdWUgLiogc3BlY2lmaWVkIGZvciAuKiBjb21tYW5kIGxpbmUgZmxhZyIpOworICBFWFBFQ1RfREVBVEgoUGFyc2VUZXN0RmxhZyhmYWxzZSwgYXJyYXlzaXplKGFyZ3YpIC0gMSwgYXJndiksCisgICAgICAgICAgICAgICAiYm9vbGVhbiB2YWx1ZSAuKiBzcGVjaWZpZWQgZm9yIC4qIGNvbW1hbmQgbGluZSBmbGFnIik7Cit9CisjZW5kaWYKKworVEVTVChQYXJzZUNvbW1hbmRMaW5lRmxhZ3NXcm9uZ0ZpZWxkcywKKyAgICAgRGVzY3JpcHRpb25Jc0ludmFsaWQpIHsKKyAgLy8gVGhlc2UgbXVzdCBub3QgYmUgYXV0b21hdGljIHZhcmlhYmxlcywgc2luY2UgY29tbWFuZCBsaW5lIGZsYWdzCisgIC8vIGFyZW4ndCB1bnJlZ2lzdGVyZWQgYW5kIGdVbml0IHVzZXMgRmxhZ1NhdmVyIHRvIHNhdmUgYW5kIHJlc3RvcmUKKyAgLy8gY29tbWFuZCBsaW5lIGZsYWdzJyB2YWx1ZXMuICBJZiB0aGVzZSBhcmUgb24gdGhlIHN0YWNrLCB0aGVuIHdoZW4KKyAgLy8gbGF0ZXIgdGVzdHMgYXR0ZW1wdCB0byBzYXZlIGFuZCByZXN0b3JlIHRoZWlyIHZhbHVlcywgdGhlIHN0YWNrCisgIC8vIGFkZHJlc3NlcyBvZiB0aGVzZSB2YXJpYWJsZXMgd2lsbCBiZSBvdmVyd3JpdHRlbi4uLiAgU3RhY2sgc21hc2ghCisgIHN0YXRpYyBib29sIGN1cnJlbnRfc3RvcmFnZTsKKyAgc3RhdGljIGJvb2wgZGVmdmFsdWVfc3RvcmFnZTsKKyAgRmxhZ1JlZ2lzdGVyZXIgZnIoImZsYWdfbmFtZSIsICJib29sIiwgMCwgImZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfc3RvcmFnZSwgJmRlZnZhbHVlX3N0b3JhZ2UpOworICBDb21tYW5kTGluZUZsYWdJbmZvIGZpOworICBFWFBFQ1RfVFJVRShHZXRDb21tYW5kTGluZUZsYWdJbmZvKCJmbGFnX25hbWUiLCAmZmkpKTsKKyAgRVhQRUNUX0VRKCIiLCBmaS5kZXNjcmlwdGlvbik7CisgIEVYUEVDVF9FUSgmY3VycmVudF9zdG9yYWdlLCBmaS5mbGFnX3B0cik7Cit9CisKK3N0YXRpYyBib29sIFZhbGlkYXRlVGVzdEZsYWdJczUoY29uc3QgY2hhciogZmxhZ25hbWUsIGludDMyIGZsYWd2YWwpIHsKKyAgaWYgKGZsYWd2YWwgPT0gNSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcHJpbnRmKCIlcyBpc24ndCA1IVxuIiwgZmxhZ25hbWUpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIFZhbGlkYXRlVGVzdEZsYWdJczEwKGNvbnN0IGNoYXIqIGZsYWduYW1lLCBpbnQzMiBmbGFndmFsKSB7CisgIHJldHVybiBmbGFndmFsID09IDEwOworfQorCisKK1RFU1QoRmxhZ3NWYWxpZGF0b3IsIFZhbGlkRmxhZ1ZpYUFyZ3YpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJteV90ZXN0IiwKKyAgICAiLS10ZXN0X2ZsYWc9NSIsCisgICAgTlVMTCwKKyAgfTsKKyAgRVhQRUNUX1RSVUUoUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKCZGTEFHU190ZXN0X2ZsYWcsICZWYWxpZGF0ZVRlc3RGbGFnSXM1KSk7CisgIEVYUEVDVF9FUSg1LCBQYXJzZVRlc3RGbGFnKHRydWUsIGFycmF5c2l6ZShhcmd2KSAtIDEsIGFyZ3YpKTsKKyAgLy8gVW5kbyB0aGUgZmxhZyB2YWxpZGF0b3Igc2V0dGluZworICBFWFBFQ1RfVFJVRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX3Rlc3RfZmxhZywgTlVMTCkpOworfQorCitURVNUKEZsYWdzVmFsaWRhdG9yLCBWYWxpZEZsYWdWaWFTZXREZWZhdWx0KSB7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCAmVmFsaWRhdGVUZXN0RmxhZ0lzNSkpOworICAvLyBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBvbiBlcnJvci4KKyAgRVhQRUNUX05FKCIiLCBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X2ZsYWciLCAiNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRkxBR19JRl9ERUZBVUxUKSk7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCBOVUxMKSk7Cit9CisKK1RFU1QoRmxhZ3NWYWxpZGF0b3IsIFZhbGlkRmxhZ1ZpYVNldFZhbHVlKSB7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCAmVmFsaWRhdGVUZXN0RmxhZ0lzNSkpOworICBGTEFHU190ZXN0X2ZsYWcgPSAxMDA7ICAgLy8gZG9lc24ndCB0cmlnZ2VyIHRoZSB2YWxpZGF0b3IKKyAgLy8gU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCisgIEVYUEVDVF9ORSgiIiwgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgidGVzdF9mbGFnIiwgIjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0ZMQUdTX1ZBTFVFKSk7CisgIEVYUEVDVF9ORSgiIiwgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgidGVzdF9mbGFnIiwgIjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0ZMQUdTX0RFRkFVTFQpKTsKKyAgRVhQRUNUX05FKCIiLCBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9mbGFnIiwgIjUiKSk7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCBOVUxMKSk7Cit9CisKKyNpZmRlZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorVEVTVChGbGFnc1ZhbGlkYXRvckRlYXRoVGVzdCwgSW52YWxpZEZsYWdWaWFBcmd2KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAibXlfdGVzdCIsCisgICAgIi0tdGVzdF9mbGFnPTUwIiwKKyAgICBOVUxMLAorICB9OworICBFWFBFQ1RfVFJVRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX3Rlc3RfZmxhZywgJlZhbGlkYXRlVGVzdEZsYWdJczUpKTsKKyAgRVhQRUNUX0RFQVRIKFBhcnNlVGVzdEZsYWcodHJ1ZSwgYXJyYXlzaXplKGFyZ3YpIC0gMSwgYXJndiksCisgICAgICAgICAgICAgICAiRVJST1I6IGZhaWxlZCB2YWxpZGF0aW9uIG9mIG5ldyB2YWx1ZSAnNTAnIGZvciBmbGFnICd0ZXN0X2ZsYWcnIik7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCBOVUxMKSk7Cit9CisjZW5kaWYKKworVEVTVChGbGFnc1ZhbGlkYXRvciwgSW52YWxpZEZsYWdWaWFTZXREZWZhdWx0KSB7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCAmVmFsaWRhdGVUZXN0RmxhZ0lzNSkpOworICAvLyBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBvbiBlcnJvci4KKyAgRVhQRUNUX0VRKCIiLCBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X2ZsYWciLCAiNTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0ZMQUdfSUZfREVGQVVMVCkpOworICBFWFBFQ1RfRVEoLTEsIEZMQUdTX3Rlc3RfZmxhZyk7ICAgLy8gdGhlIHNldHRpbmctdG8tNTAgc2hvdWxkIGhhdmUgZmFpbGVkCisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCBOVUxMKSk7Cit9CisKK1RFU1QoRmxhZ3NWYWxpZGF0b3IsIEludmFsaWRGbGFnVmlhU2V0VmFsdWUpIHsKKyAgRVhQRUNUX1RSVUUoUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKCZGTEFHU190ZXN0X2ZsYWcsICZWYWxpZGF0ZVRlc3RGbGFnSXM1KSk7CisgIEZMQUdTX3Rlc3RfZmxhZyA9IDEwMDsgICAvLyBkb2Vzbid0IHRyaWdnZXIgdGhlIHZhbGlkYXRvcgorICAvLyBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBvbiBlcnJvci4KKyAgRVhQRUNUX0VRKCIiLCBTZXRDb21tYW5kTGluZU9wdGlvbldpdGhNb2RlKCJ0ZXN0X2ZsYWciLCAiNTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0ZMQUdTX1ZBTFVFKSk7CisgIEVYUEVDVF9FUSgiIiwgU2V0Q29tbWFuZExpbmVPcHRpb25XaXRoTW9kZSgidGVzdF9mbGFnIiwgIjUwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9GTEFHU19ERUZBVUxUKSk7CisgIEVYUEVDVF9FUSgiIiwgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfZmxhZyIsICI1MCIpKTsKKyAgRVhQRUNUX0VRKDEwMCwgRkxBR1NfdGVzdF9mbGFnKTsgICAvLyB0aGUgc2V0dGluZy10by01MCBzaG91bGQgaGF2ZSBmYWlsZWQKKyAgRVhQRUNUX1RSVUUoUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKCZGTEFHU190ZXN0X2ZsYWcsIE5VTEwpKTsKK30KKworI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUCitURVNUKEZsYWdzVmFsaWRhdG9yRGVhdGhUZXN0LCBJbnZhbGlkRmxhZ05ldmVyU2V0KSB7CisgIC8vIElmIGEgZmxhZyBrZWVwcyBpdHMgZGVmYXVsdCB2YWx1ZSwgYW5kIHRoYXQgZGVmYXVsdCB2YWx1ZSBpcworICAvLyBpbnZhbGlkLCB3ZSBzaG91bGQgZGllIGF0IGFyZ3YtcGFyc2UgdGltZS4KKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJteV90ZXN0IiwKKyAgICBOVUxMLAorICB9OworICBFWFBFQ1RfVFJVRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX3Rlc3RfZmxhZywgJlZhbGlkYXRlVGVzdEZsYWdJczUpKTsKKyAgRVhQRUNUX0RFQVRIKFBhcnNlVGVzdEZsYWcodHJ1ZSwgYXJyYXlzaXplKGFyZ3YpIC0gMSwgYXJndiksCisgICAgICAgICAgICAgICAiRVJST1I6IC0tdGVzdF9mbGFnIG11c3QgYmUgc2V0IG9uIHRoZSBjb21tYW5kbGluZSIpOworfQorI2VuZGlmCisKK1RFU1QoRmxhZ3NWYWxpZGF0b3IsIEludmFsaWRGbGFnUHRyKSB7CisgIGludDMyIGR1bW15OworICBFWFBFQ1RfRkFMU0UoUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKE5VTEwsICZWYWxpZGF0ZVRlc3RGbGFnSXM1KSk7CisgIEVYUEVDVF9GQUxTRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJmR1bW15LCAmVmFsaWRhdGVUZXN0RmxhZ0lzNSkpOworfQorCitURVNUKEZsYWdzVmFsaWRhdG9yLCBSZWdpc3RlclZhbGlkYXRvclR3aWNlKSB7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCAmVmFsaWRhdGVUZXN0RmxhZ0lzNSkpOworICBFWFBFQ1RfVFJVRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX3Rlc3RfZmxhZywgJlZhbGlkYXRlVGVzdEZsYWdJczUpKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCAmVmFsaWRhdGVUZXN0RmxhZ0lzMTApKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCAmVmFsaWRhdGVUZXN0RmxhZ0lzMTApKTsKKyAgRVhQRUNUX1RSVUUoUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKCZGTEFHU190ZXN0X2ZsYWcsICZWYWxpZGF0ZVRlc3RGbGFnSXM1KSk7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCBOVUxMKSk7CisgIEVYUEVDVF9UUlVFKFJlZ2lzdGVyRmxhZ1ZhbGlkYXRvcigmRkxBR1NfdGVzdF9mbGFnLCAmVmFsaWRhdGVUZXN0RmxhZ0lzMTApKTsKKyAgRVhQRUNUX1RSVUUoUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKCZGTEFHU190ZXN0X2ZsYWcsIE5VTEwpKTsKK30KKworVEVTVChGbGFnc1ZhbGlkYXRvciwgQ29tbWFuZExpbmVGbGFnSW5mbykgeworICBDb21tYW5kTGluZUZsYWdJbmZvIGluZm87CisgIGluZm8gPSBHZXRDb21tYW5kTGluZUZsYWdJbmZvT3JEaWUoInRlc3RfZmxhZyIpOworICBFWFBFQ1RfRkFMU0UoaW5mby5oYXNfdmFsaWRhdG9yX2ZuKTsKKworICBFWFBFQ1RfVFJVRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX3Rlc3RfZmxhZywgJlZhbGlkYXRlVGVzdEZsYWdJczUpKTsKKyAgaW5mbyA9IEdldENvbW1hbmRMaW5lRmxhZ0luZm9PckRpZSgidGVzdF9mbGFnIik7CisgIEVYUEVDVF9UUlVFKGluZm8uaGFzX3ZhbGlkYXRvcl9mbik7CisKKyAgRVhQRUNUX1RSVUUoUmVnaXN0ZXJGbGFnVmFsaWRhdG9yKCZGTEFHU190ZXN0X2ZsYWcsIE5VTEwpKTsKKyAgaW5mbyA9IEdldENvbW1hbmRMaW5lRmxhZ0luZm9PckRpZSgidGVzdF9mbGFnIik7CisgIEVYUEVDVF9GQUxTRShpbmZvLmhhc192YWxpZGF0b3JfZm4pOworfQorCitURVNUKEZsYWdzVmFsaWRhdG9yLCBGbGFnU2F2ZXIpIHsKKyAgeworICAgIEZsYWdTYXZlciBmczsKKyAgICBFWFBFQ1RfVFJVRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX3Rlc3RfZmxhZywgJlZhbGlkYXRlVGVzdEZsYWdJczUpKTsKKyAgICBFWFBFQ1RfRVEoIiIsIFNldENvbW1hbmRMaW5lT3B0aW9uKCJ0ZXN0X2ZsYWciLCAiNTAiKSk7ICAvLyBmYWlscyB2YWxpZGF0aW9uCisgIH0KKyAgRVhQRUNUX05FKCIiLCBTZXRDb21tYW5kTGluZU9wdGlvbigidGVzdF9mbGFnIiwgIjUwIikpOyAgLy8gdmFsaWRhdG9yIGlzIGdvbmUKKworICBFWFBFQ1RfVFJVRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX3Rlc3RfZmxhZywgJlZhbGlkYXRlVGVzdEZsYWdJczUpKTsKKyAgeworICAgIEZsYWdTYXZlciBmczsKKyAgICBFWFBFQ1RfVFJVRShSZWdpc3RlckZsYWdWYWxpZGF0b3IoJkZMQUdTX3Rlc3RfZmxhZywgTlVMTCkpOworICAgIEVYUEVDVF9ORSgiIiwgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfZmxhZyIsICI1MCIpKTsgIC8vIG5vIHZhbGlkYXRvcgorICB9CisgIEVYUEVDVF9FUSgiIiwgU2V0Q29tbWFuZExpbmVPcHRpb24oInRlc3RfZmxhZyIsICI1MCIpKTsgIC8vIHZhbGlkYXRvciBpcyBiYWNrCit9CisKKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisKKyAgLy8gUnVuIHVuaXQgdGVzdHMgb25seSBpZiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIG90aGVyd2lzZSB0aGlzIHByb2dyYW0KKyAgLy8gaXMgdXNlZCBieSBhbiAiZXh0ZXJuYWwiIHVzYWdlIHRlc3QKKyAgY29uc3QgYm9vbCBydW5fdGVzdHMgPSAoYXJnYyA9PSAxKTsKKworICAvLyBXZSBuZWVkIHRvIGNhbGwgU2V0QXJndiBiZWZvcmUgcGFyc2luZyBmbGFncywgc28gb3VyICJ0ZXN0IiBhcmd2IHdpbGwKKyAgLy8gd2luIG91dCBvdmVyIHRoaXMgZXhlY3V0YWJsZSdzIHJlYWwgYXJndi4gIFRoYXQgbWFrZXMgcnVubmluZyB0aGlzCisgIC8vIHRlc3Qgd2l0aCBhIHJlYWwgLS1oZWxwIGZsYWcga2luZGEgYW5ub3lpbmcsIHVuZm9ydHVuYXRlbHkuCisgIGNvbnN0IGNoYXIqIHRlc3RfYXJndltdID0geyAiL3Rlc3QvYXJndi9mb3IvZ2ZsYWdzX3VuaXR0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd2IDIiLCAiM3JkIGFyZ3YiLCAiYXJndiAjNCIgfTsKKyAgU2V0QXJndihhcnJheXNpemUodGVzdF9hcmd2KSwgdGVzdF9hcmd2KTsKKworICAvLyBUaGUgZmlyc3QgYXJnIGlzIHRoZSB1c2FnZSBtZXNzYWdlLCBhbHNvIGltcG9ydGFudCBmb3IgdGVzdGluZy4KKyAgc3RyaW5nIHVzYWdlX21lc3NhZ2UgPSAoc3RyaW5nKEdldEFyZ3YwKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjogPHVzZWxlc3MgZmxhZz4gWy4uLl1cbkRvZXMgc29tZXRoaW5nIHVzZWxlc3MuXG4iKTsKKworICAvLyBXZSB0ZXN0IHNldHRpbmcgdHJ5ZnJvbWVudiBtYW51YWxseSwgYW5kIG1ha2luZyBzdXJlCisgIC8vIFBhcnNlQ29tbWFuZExpbmVGbGFncyBzdGlsbCBldmFsdWF0ZXMgaXQuCisgIEZMQUdTX3RyeWZyb21lbnYgPSAidGVzdF90cnlmcm9tZW52IjsKKyAgc2V0ZW52KCJGTEFHU190ZXN0X3RyeWZyb21lbnYiLCAicHJlLXNldCIsIDEpOworCisgIC8vIE1vZGlmeSBmbGFnIHZhbHVlcyBmcm9tIGRlY2xhcmVkIGRlZmF1bHQgdmFsdWUgaW4gdHdvIHdheXMuCisgIC8vIFRoZSByZWNvbW1lbmRlZCB3YXk6CisgIFNldENvbW1hbmRMaW5lT3B0aW9uV2l0aE1vZGUoImNoYW5nZWRfYm9vbDEiLCAidHJ1ZSIsIFNFVF9GTEFHU19ERUZBVUxUKTsKKworICAvLyBUaGUgbm9uLXJlY29tbWVuZGVkIHdheToKKyAgRkxBR1NfY2hhbmdlZF9ib29sMiA9IHRydWU7CisKKyAgU2V0VXNhZ2VNZXNzYWdlKHVzYWdlX21lc3NhZ2UuY19zdHIoKSk7CisgIFNldFZlcnNpb25TdHJpbmcoInRlc3RfdmVyc2lvbiIpOworICBQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoJmFyZ2MsICZhcmd2LCB0cnVlKTsKKyAgTWFrZVRtcGRpcigmRkxBR1NfdGVzdF90bXBkaXIpOworCisgIGludCBleGl0X3N0YXR1cyA9IDA7CisgIGlmIChydW5fdGVzdHMpIHsKKwkgIGZwcmludGYoc3Rkb3V0LCAiUnVubmluZyB0aGUgdW5pdCB0ZXN0cyBub3cuLi5cblxuIik7IGZmbHVzaChzdGRvdXQpOworCSAgZXhpdF9zdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIH0gZWxzZSBmcHJpbnRmKHN0ZGVyciwgIlxuXG5QQVNTXG4iKTsKKyAgU2h1dERvd25Db21tYW5kTGluZUZsYWdzKCk7CisgIHJldHVybiBleGl0X3N0YXR1czsKK30KKworfSAvLyBHRkxBR1NfTkFNRVNQQUNFCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICByZXR1cm4gR0ZMQUdTX05BTUVTUEFDRTo6bWFpbihhcmdjLCBhcmd2KTsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZ2ZsYWdzX3VuaXR0ZXN0X2ZsYWdmaWxlIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvZ2ZsYWdzX3VuaXR0ZXN0X2ZsYWdmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmEwYzQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9nZmxhZ3NfdW5pdHRlc3RfZmxhZ2ZpbGUKQEAgLTAsMCArMSwyIEBACistLXRlc3RfZmxhZz0xCistLXRlc3RfZmxhZz0yCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9uYy9DTWFrZUxpc3RzLnR4dCBiL3RoaXJkX3BhcnR5L2dmbGFncy90ZXN0L25jL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjVkOTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9uYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIyBnZmxhZ3MgbmVnYXRpdmUgY29tcGlsYXRpb24gdGVzdHMKKworY21ha2VfbWluaW11bV9yZXF1aXJlZCAoVkVSU0lPTiAyLjgpCisKK2lmIChOT1QgVEVTVF9OQU1FKQorICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiTWlzc2luZyBURVNUX05BTUUgQ01ha2UgZmxhZyIpCitlbmRpZiAoKQorc3RyaW5nIChUT1VQUEVSICR7VEVTVF9OQU1FfSBURVNUX05BTUVfVVBQRVIpCisKK3Byb2plY3QgKGdmbGFnc18ke1RFU1RfTkFNRX0pCisKK2ZpbmRfcGFja2FnZSAoZ2ZsYWdzIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3RvcmllcyAoIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLiIpCithZGRfZGVmaW5pdGlvbnMgKC1EVEVTVF8ke1RFU1RfTkFNRV9VUFBFUn0pCithZGRfZXhlY3V0YWJsZSAoZ2ZsYWdzXyR7VEVTVF9OQU1FfSBnZmxhZ3NfbmMuY2MpCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ2ZsYWdzXyR7VEVTVF9OQU1FfSAke2dmbGFnc19MSUJSQVJJRVN9KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvbmMvZ2ZsYWdzX25jLmNjIGIvdGhpcmRfcGFydHkvZ2ZsYWdzL3Rlc3QvbmMvZ2ZsYWdzX25jLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OTBjMzAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nZmxhZ3MvdGVzdC9uYy9nZmxhZ3NfbmMuY2MKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDA5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gLS0tCisvLworLy8gQSBuZWdhdGl2ZSBjb21pcGxlIHRlc3QgZm9yIGdmbGFncy4KKworI2luY2x1ZGUgPGdmbGFncy9nZmxhZ3MuaD4KKworI2lmIGRlZmluZWQoVEVTVF9OQ19TV0FQUEVEX0FSR1MpCisKK0RFRklORV9ib29sKHNvbWVfYm9vbF9mbGFnLAorICAgICAgICAgICAgInRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBnbyBoZXJlLCBub3QgdGhlIGRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgIGZhbHNlKTsKKworCisjZWxpZiBkZWZpbmVkKFRFU1RfTkNfSU5UX0lOU1RFQURfT0ZfQk9PTCkKKworREVGSU5FX2Jvb2woc29tZV9ib29sX2ZsYWdfMiwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiBhbiBpbnQzMiBmbGFnIGJ1dCBtaXN0YWtlbmx5IHVzZWQgYm9vbCBpbnN0ZWFkIik7CisKKyNlbGlmIGRlZmluZWQoVEVTVF9OQ19CT09MX0lOX1FVT1RFUykKKworCitERUZJTkVfYm9vbChzb21lX2Jvb2xfZmxhZ18zLAorICAgICAgICAgICAgImZhbHNlIiwKKyAgICAgICAgICAgICJmYWxzZSBpbiBpbiBxdW90ZXMsIHdoaWNoIGlzIHdyb25nIik7CisKKyNlbGlmIGRlZmluZWQoVEVTVF9OQ19TQU5JVFkpCisKK0RFRklORV9ib29sKHNvbWVfYm9vbF9mbGFnXzQsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgInRoaXMgaXMgdGhlIGNvcnJlY3QgdXNhZ2Ugb2YgREVGSU5FX2Jvb2wiKTsKKworI2VsaWYgZGVmaW5lZChURVNUX05DX0RFRklORV9TVFJJTkdfV0lUSF8wKQorCitERUZJTkVfc3RyaW5nKHNvbWVfc3RyaW5nX2ZsYWcsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICJUcnlpbmcgdG8gY29uc3RydWN0IGEgc3RyaW5nIGJ5IHBhc3NpbmcgMCB3b3VsZCBjYXVzZSBhIGNyYXNoLiIpOworCisjZW5kaWYKKworaW50IG1haW4oaW50LCBjaGFyICoqKQoreworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvLnRyYXZpcy55bWwgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0Ly50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMzQ4NWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0Ly50cmF2aXMueW1sCkBAIC0wLDAgKzEsNDUgQEAKKyMgQnVpbGQgbWF0cml4IC8gZW52aXJvbm1lbnQgdmFyaWFibGUgYXJlIGV4cGxhaW5lZCBvbjoKKyMgaHR0cDovL2Fib3V0LnRyYXZpcy1jaS5vcmcvZG9jcy91c2VyL2J1aWxkLWNvbmZpZ3VyYXRpb24vCisjIFRoaXMgZmlsZSBjYW4gYmUgdmFsaWRhdGVkIG9uOgorIyBodHRwOi8vbGludC50cmF2aXMtY2kub3JnLworIyBTZWUgYWxzbworIyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIyMTExNTQ5L3RyYXZpcy1jaS13aXRoLWNsYW5nLTMtNC1hbmQtYzExLzMwOTI1NDQ4IzMwOTI1NDQ4CisjIHRvIGFsbG93IEMrKzExLCB0aG91Z2ggd2UgYXJlIG5vdCB5ZXQgYnVpbGRpbmcgd2l0aCAtc3RkPWMrKzExCisKK2luc3RhbGw6CisjIC91c3IvYmluL2djYyBpcyA0LjYgYWx3YXlzLCBidXQgZ2NjLVguWSBpcyBhdmFpbGFibGUuCistIGlmIFsgIiRDWFgiID0gImcrKyIgXTsgdGhlbiBleHBvcnQgQ1hYPSJnKystNC45IiBDQz0iZ2NjLTQuOSI7IGZpCisjIC91c3IvYmluL2NsYW5nIGlzIG91ciB2ZXJzaW9uIGFscmVhZHksIGFuZCBjbGFuZy1YLlkgZG9lcyBub3QgZXhpc3QuCisjLSBpZiBbICIkQ1hYIiA9ICJjbGFuZysrIiBdOyB0aGVuIGV4cG9ydCBDWFg9ImNsYW5nKystMy43IiBDQz0iY2xhbmctMy43IjsgZmkKKy0gZWNobyAke1BBVEh9CistIGxzIC91c3IvbG9jYWwKKy0gbHMgL3Vzci9sb2NhbC9iaW4KKy0gZXhwb3J0IFBBVEg9L3Vzci9sb2NhbC9iaW46L3Vzci9iaW46JHtQQVRIfQorLSBlY2hvICR7Q1hYfQorLSAke0NYWH0gLS12ZXJzaW9uCithZGRvbnM6CisgIGFwdDoKKyAgICBzb3VyY2VzOgorICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKyAgICBwYWNrYWdlczoKKyAgICAtIGdjYy00LjkKKyAgICAtIGcrKy00LjkKKyAgICAtIGNsYW5nCisgICAgLSB2YWxncmluZAorb3M6CisgIC0gbGludXgKKyAgLSBvc3gKK2xhbmd1YWdlOiBjcHAKK2NvbXBpbGVyOgorICAtIGdjYworICAtIGNsYW5nCitzY3JpcHQ6IC4vdHJhdmlzLnNoCitlbnY6CisgIG1hdHJpeDoKKyAgICAtIEdURVNUX1RBUkdFVD1nb29nbGV0ZXN0IFNIQVJFRF9MSUI9T0ZGIFNUQVRJQ19MSUI9T04gQ01BS0VfUEtHPU9GRiBCVUlMRF9UWVBFPWRlYnVnICAgVkVSQk9TRV9NQUtFPXRydWUgVkVSQk9TRQorICAgIC0gR1RFU1RfVEFSR0VUPWdvb2dsZW1vY2sgU0hBUkVEX0xJQj1PRkYgU1RBVElDX0xJQj1PTiBDTUFLRV9QS0c9T0ZGIEJVSUxEX1RZUEU9ZGVidWcgICBWRVJCT1NFX01BS0U9dHJ1ZSBWRVJCT1NFCisjICAgIC0gR1RFU1RfVEFSR0VUPWdvb2dsZXRlc3QgU0hBUkVEX0xJQj1PTiAgU1RBVElDX0xJQj1PTiBDTUFLRV9QS0c9T04gIEJVSUxEX1RZUEU9cmVsZWFzZSBWRVJCT1NFX01BS0U9ZmFsc2UKKyMgICAgLSBHVEVTVF9UQVJHRVQ9Z29vZ2xlbW9jayBTSEFSRURfTElCPU9OICBTVEFUSUNfTElCPU9OIENNQUtFX1BLRz1PTiAgQlVJTERfVFlQRT1yZWxlYXNlIFZFUkJPU0VfTUFLRT1mYWxzZQorbm90aWZpY2F0aW9uczoKKyAgZW1haWw6IGZhbHNlCitzdWRvOiBmYWxzZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9SRUFETUUubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzVhMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwxMzggQEAKKworIyBHb29nbGUgVGVzdCAjCisKK1shW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2dvb2dsZS9nb29nbGV0ZXN0LnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2dvb2dsZS9nb29nbGV0ZXN0KQorCitXZWxjb21lIHRvICoqR29vZ2xlIFRlc3QqKiwgR29vZ2xlJ3MgQysrIHRlc3QgZnJhbWV3b3JrIQorCitUaGlzIHJlcG9zaXRvcnkgaXMgYSBtZXJnZXIgb2YgdGhlIGZvcm1lcmx5IHNlcGFyYXRlIEdvb2dsZVRlc3QgYW5kCitHb29nbGVNb2NrIHByb2plY3RzLiBUaGVzZSB3ZXJlIHNvIGNsb3NlbHkgcmVsYXRlZCB0aGF0IGl0IG1ha2VzIHNlbnNlIHRvCittYWludGFpbiBhbmQgcmVsZWFzZSB0aGVtIHRvZ2V0aGVyLgorCitQbGVhc2Ugc2VlIHRoZSBwcm9qZWN0IHBhZ2UgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYXMgd2VsbCBhcyB0aGUKK21haWxpbmcgbGlzdCBmb3IgcXVlc3Rpb25zLCBkaXNjdXNzaW9ucywgYW5kIGRldmVsb3BtZW50LiAgVGhlcmUgaXMKK2Fsc28gYW4gSVJDIGNoYW5uZWwgb24gT0ZUQyAoaXJjLm9mdGMubmV0KSAjZ3Rlc3QgYXZhaWxhYmxlLiAgUGxlYXNlCitqb2luIHVzIQorCisqKkdvb2dsZSBNb2NrKiogaXMgYW4gZXh0ZW5zaW9uIHRvIEdvb2dsZSBUZXN0IGZvciB3cml0aW5nIGFuZCB1c2luZyBDKysgbW9jaworY2xhc3Nlcy4gIFNlZSB0aGUgc2VwYXJhdGUgW0dvb2dsZSBNb2NrIGRvY3VtZW50YXRpb25dKGdvb2dsZW1vY2svUkVBRE1FLm1kKS4KKworTW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGZvciBnb29nbGV0ZXN0IChpbmNsdWRpbmcgYnVpbGQgaW5zdHJ1Y3Rpb25zKSBhcmUKK2luIGl0cyBpbnRlcmlvciBbZ29vZ2xldGVzdC9SRUFETUUubWRdKGdvb2dsZXRlc3QvUkVBRE1FLm1kKSBmaWxlLgorCisjIyBGZWF0dXJlcyAjIworCisgICogQW4gW1hVbml0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YVW5pdCkgdGVzdCBmcmFtZXdvcmsuCisgICogVGVzdCBkaXNjb3ZlcnkuCisgICogQSByaWNoIHNldCBvZiBhc3NlcnRpb25zLgorICAqIFVzZXItZGVmaW5lZCBhc3NlcnRpb25zLgorICAqIERlYXRoIHRlc3RzLgorICAqIEZhdGFsIGFuZCBub24tZmF0YWwgZmFpbHVyZXMuCisgICogVmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgKiBUeXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICogVmFyaW91cyBvcHRpb25zIGZvciBydW5uaW5nIHRoZSB0ZXN0cy4KKyAgKiBYTUwgdGVzdCByZXBvcnQgZ2VuZXJhdGlvbi4KKworIyMgUGxhdGZvcm1zICMjCisKK0dvb2dsZSB0ZXN0IGhhcyBiZWVuIHVzZWQgb24gYSB2YXJpZXR5IG9mIHBsYXRmb3JtczoKKworICAqIExpbnV4CisgICogTWFjIE9TIFgKKyAgKiBXaW5kb3dzCisgICogQ3lnd2luCisgICogTWluR1cKKyAgKiBXaW5kb3dzIE1vYmlsZQorICAqIFN5bWJpYW4KKworIyMgV2hvIElzIFVzaW5nIEdvb2dsZSBUZXN0PyAjIworCitJbiBhZGRpdGlvbiB0byBtYW55IGludGVybmFsIHByb2plY3RzIGF0IEdvb2dsZSwgR29vZ2xlIFRlc3QgaXMgYWxzbyB1c2VkIGJ5Cit0aGUgZm9sbG93aW5nIG5vdGFibGUgcHJvamVjdHM6CisKKyAgKiBUaGUgW0Nocm9taXVtIHByb2plY3RzXShodHRwOi8vd3d3LmNocm9taXVtLm9yZy8pIChiZWhpbmQgdGhlIENocm9tZQorICAgIGJyb3dzZXIgYW5kIENocm9tZSBPUykuCisgICogVGhlIFtMTFZNXShodHRwOi8vbGx2bS5vcmcvKSBjb21waWxlci4KKyAgKiBbUHJvdG9jb2wgQnVmZmVyc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLyksIEdvb2dsZSdzIGRhdGEKKyAgICBpbnRlcmNoYW5nZSBmb3JtYXQuCisgICogVGhlIFtPcGVuQ1ZdKGh0dHA6Ly9vcGVuY3Yub3JnLykgY29tcHV0ZXIgdmlzaW9uIGxpYnJhcnkuCisKKyMjIFJlbGF0ZWQgT3BlbiBTb3VyY2UgUHJvamVjdHMgIyMKKworW0dvb2dsZSBUZXN0IFVJXShodHRwczovL2dpdGh1Yi5jb20vb3NwZWN0b3IvZ3Rlc3QtZ2JhcikgaXMgdGVzdCBydW5uZXIgdGhhdCBydW5zCit5b3VyIHRlc3QgYmluYXJ5LCBhbGxvd3MgeW91IHRvIHRyYWNrIGl0cyBwcm9ncmVzcyB2aWEgYSBwcm9ncmVzcyBiYXIsIGFuZAorZGlzcGxheXMgYSBsaXN0IG9mIHRlc3QgZmFpbHVyZXMuIENsaWNraW5nIG9uIG9uZSBzaG93cyBmYWlsdXJlIHRleHQuIEdvb2dsZQorVGVzdCBVSSBpcyB3cml0dGVuIGluIEMjLgorCitbR1Rlc3QgVEFQIExpc3RlbmVyXShodHRwczovL2dpdGh1Yi5jb20va2lub3cvZ3Rlc3QtdGFwLWxpc3RlbmVyKSBpcyBhbiBldmVudAorbGlzdGVuZXIgZm9yIEdvb2dsZSBUZXN0IHRoYXQgaW1wbGVtZW50cyB0aGUKK1tUQVAgcHJvdG9jb2xdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVzdF9Bbnl0aGluZ19Qcm90b2NvbCkgZm9yIHRlc3QKK3Jlc3VsdCBvdXRwdXQuIElmIHlvdXIgdGVzdCBydW5uZXIgdW5kZXJzdGFuZHMgVEFQLCB5b3UgbWF5IGZpbmQgaXQgdXNlZnVsLgorCisjIyBSZXF1aXJlbWVudHMgIyMKKworR29vZ2xlIFRlc3QgaXMgZGVzaWduZWQgdG8gaGF2ZSBmYWlybHkgbWluaW1hbCByZXF1aXJlbWVudHMgdG8gYnVpbGQKK2FuZCB1c2Ugd2l0aCB5b3VyIHByb2plY3RzLCBidXQgdGhlcmUgYXJlIHNvbWUuICBDdXJyZW50bHksIHdlIHN1cHBvcnQKK0xpbnV4LCBXaW5kb3dzLCBNYWMgT1MgWCwgYW5kIEN5Z3dpbi4gIFdlIHdpbGwgYWxzbyBtYWtlIG91ciBiZXN0CitlZmZvcnQgdG8gc3VwcG9ydCBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gU29sYXJpcywgQUlYLCBhbmQgei9PUykuCitIb3dldmVyLCBzaW5jZSBjb3JlIG1lbWJlcnMgb2YgdGhlIEdvb2dsZSBUZXN0IHByb2plY3QgaGF2ZSBubyBhY2Nlc3MKK3RvIHRoZXNlIHBsYXRmb3JtcywgR29vZ2xlIFRlc3QgbWF5IGhhdmUgb3V0c3RhbmRpbmcgaXNzdWVzIHRoZXJlLiAgSWYKK3lvdSBub3RpY2UgYW55IHByb2JsZW1zIG9uIHlvdXIgcGxhdGZvcm0sIHBsZWFzZSBub3RpZnkKKzxnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20+LiBQYXRjaGVzIGZvciBmaXhpbmcgdGhlbSBhcmUKK2V2ZW4gbW9yZSB3ZWxjb21lIQorCisjIyMgTGludXggUmVxdWlyZW1lbnRzICMjIworCitUaGVzZSBhcmUgdGhlIGJhc2UgcmVxdWlyZW1lbnRzIHRvIGJ1aWxkIGFuZCB1c2UgR29vZ2xlIFRlc3QgZnJvbSBhIHNvdXJjZQorcGFja2FnZSAoYXMgZGVzY3JpYmVkIGJlbG93KToKKworICAqIEdOVS1jb21wYXRpYmxlIE1ha2Ugb3IgZ21ha2UKKyAgKiBQT1NJWC1zdGFuZGFyZCBzaGVsbAorICAqIFBPU0lYKC0yKSBSZWd1bGFyIEV4cHJlc3Npb25zIChyZWdleC5oKQorICAqIEEgQysrOTgtc3RhbmRhcmQtY29tcGxpYW50IGNvbXBpbGVyCisKKyMjIyBXaW5kb3dzIFJlcXVpcmVtZW50cyAjIyMKKworICAqIE1pY3Jvc29mdCBWaXN1YWwgQysrIHY3LjEgb3IgbmV3ZXIKKworIyMjIEN5Z3dpbiBSZXF1aXJlbWVudHMgIyMjCisKKyAgKiBDeWd3aW4gdjEuNS4yNS0xNCBvciBuZXdlcgorCisjIyMgTWFjIE9TIFggUmVxdWlyZW1lbnRzICMjIworCisgICogTWFjIE9TIFggdjEwLjQgVGlnZXIgb3IgbmV3ZXIKKyAgKiBYQ29kZSBEZXZlbG9wZXIgVG9vbHMKKworIyMjIFJlcXVpcmVtZW50cyBmb3IgQ29udHJpYnV0b3JzICMjIworCitXZSB3ZWxjb21lIHBhdGNoZXMuICBJZiB5b3UgcGxhbiB0byBjb250cmlidXRlIGEgcGF0Y2gsIHlvdSBuZWVkIHRvCitidWlsZCBHb29nbGUgVGVzdCBhbmQgaXRzIG93biB0ZXN0cyBmcm9tIGEgZ2l0IGNoZWNrb3V0IChkZXNjcmliZWQKK2JlbG93KSwgd2hpY2ggaGFzIGZ1cnRoZXIgcmVxdWlyZW1lbnRzOgorCisgICogW1B5dGhvbl0oaHR0cDovL3B5dGhvbi5vcmcvKSB2Mi4zIG9yIG5ld2VyIChmb3IgcnVubmluZyBzb21lIG9mCisgICAgdGhlIHRlc3RzIGFuZCByZS1nZW5lcmF0aW5nIGNlcnRhaW4gc291cmNlIGZpbGVzIGZyb20gdGVtcGxhdGVzKQorICAqIFtDTWFrZV0oaHR0cDovL3d3dy5jbWFrZS5vcmcvKSB2Mi42LjQgb3IgbmV3ZXIKKworIyMgUmVnZW5lcmF0aW5nIFNvdXJjZSBGaWxlcyAjIworCitTb21lIG9mIEdvb2dsZSBUZXN0J3Mgc291cmNlIGZpbGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZXMgKG5vdAoraW4gdGhlIEMrKyBzZW5zZSkgdXNpbmcgYSBzY3JpcHQuCitGb3IgZXhhbXBsZSwgdGhlCitmaWxlIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcCBpcyB1c2VkIHRvIGdlbmVyYXRlCitndGVzdC10eXBlLXV0aWwuaCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisKK1lvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlZ2VuZXJhdGluZyB0aGUgc291cmNlIGZpbGVzCit1bmxlc3MgeW91IG5lZWQgdG8gbW9kaWZ5IHRoZW0uICBZb3Ugd291bGQgdGhlbiBtb2RpZnkgdGhlCitjb3JyZXNwb25kaW5nIGAucHVtcGAgZmlsZXMgYW5kIHJ1biB0aGUgJ1twdW1wLnB5XShnb29nbGV0ZXN0L3NjcmlwdHMvcHVtcC5weSknCitnZW5lcmF0b3Igc2NyaXB0LiAgU2VlIHRoZSBbUHVtcCBNYW51YWxdKGdvb2dsZXRlc3QvZG9jcy9QdW1wTWFudWFsLm1kKS4KKworIyMjIENvbnRyaWJ1dGluZyBDb2RlICMjIworCitXZSB3ZWxjb21lIHBhdGNoZXMuICBQbGVhc2UgcmVhZCB0aGUKK1tEZXZlbG9wZXIncyBHdWlkZV0oZ29vZ2xldGVzdC9kb2NzL0Rldkd1aWRlLm1kKQorZm9yIGhvdyB5b3UgY2FuIGNvbnRyaWJ1dGUuIEluIHBhcnRpY3VsYXIsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBzaWduZWQKK3RoZSBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCwgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byBhY2NlcHQgdGhlCitwYXRjaC4KKworSGFwcHkgdGVzdGluZyEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9DSEFOR0VTIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL0NIQU5HRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmMmY3NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9DSEFOR0VTCkBAIC0wLDAgKzEsMTI2IEBACitDaGFuZ2VzIGZvciAxLjcuMDoKKworKiBBbGwgbmV3IGltcHJvdmVtZW50cyBpbiBHb29nbGUgVGVzdCAxLjcuMC4KKyogTmV3IGZlYXR1cmU6IG1hdGNoZXJzIERvdWJsZU5lYXIoKSwgRmxvYXROZWFyKCksCisgIE5hblNlbnNpdGl2ZURvdWJsZU5lYXIoKSwgTmFuU2Vuc2l0aXZlRmxvYXROZWFyKCksCisgIFVub3JkZXJlZEVsZW1lbnRzQXJlKCksIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoKSwgV2hlblNvcnRlZCgpLAorICBXaGVuU29ydGVkQnkoKSwgSXNFbXB0eSgpLCBhbmQgU2l6ZUlzKCkuCisqIEltcHJvdmVtZW50OiBHb29nbGUgTW9jayBjYW4gbm93IGJlIGJ1aWx0IGFzIGEgRExMLgorKiBJbXByb3ZlbWVudDogd2hlbiBjb21waWxlZCBieSBhIEMrKzExIGNvbXBpbGVyLCBtYXRjaGVycyBBbGxPZigpCisgIGFuZCBBbnlPZigpIGNhbiBhY2NlcHQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBtYXRjaGVycy4KKyogSW1wcm92ZW1lbnQ6IHdoZW4gY29tcGlsZWQgYnkgYSBDKysxMSBjb21waWxlciwgbWF0Y2hlcnMKKyAgRWxlbWVudHNBcmVBcnJheSgpIGNhbiBhY2NlcHQgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyogSW1wcm92ZW1lbnQ6IHdoZW4gZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgYSBtb2NrIG1ldGhvZCB3aXRoIG5vCisgIGRlZmF1bHQgYWN0aW9uIG5vdyB0aHJvd3MgaW5zdGVhZCBjcmFzaGluZyB0aGUgdGVzdC4KKyogSW1wcm92ZW1lbnQ6IGFkZGVkIGNsYXNzIHRlc3Rpbmc6OlN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgdG8gYWlkCisgIGRlZmluaXRpb24gb2YgY29tcG9zaXRlIG1hdGNoZXJzLgorKiBJbXByb3ZlbWVudDogZnVuY3Rpb24gcmV0dXJuIHR5cGVzIHVzZWQgaW4gTU9DS19NRVRIT0QqKCkgbWFjcm9zIGNhbgorICBub3cgY29udGFpbiB1bnByb3RlY3RlZCBjb21tYXMuCisqIEltcHJvdmVtZW50IChwb3RlbnRpYWxseSBicmVha2luZyk6IEVYUEVDVF9USEFUKCkgYW5kIEFTU0VSVF9USEFUKCkKKyAgYXJlIG5vdyBtb3JlIHN0cmljdCBpbiBlbnN1cmluZyB0aGF0IHRoZSB2YWx1ZSB0eXBlIGFuZCB0aGUgbWF0Y2hlcgorICB0eXBlIGFyZSBjb21wYXRpYmxlLCBjYXRjaGluZyBwb3RlbnRpYWwgYnVncyBpbiB0ZXN0cy4KKyogSW1wcm92ZW1lbnQ6IFBvaW50ZWUoKSBub3cgd29ya3Mgb24gYW4gb3B0aW9uYWw8VD4uCisqIEltcHJvdmVtZW50OiB0aGUgRWxlbWVudHNBcmVBcnJheSgpIG1hdGNoZXIgY2FuIG5vdyB0YWtlIGEgdmVjdG9yIG9yCisgIGl0ZXJhdG9yIHJhbmdlIGFzIGlucHV0LCBhbmQgbWFrZXMgYSBjb3B5IG9mIGl0cyBpbnB1dCBlbGVtZW50cworICBiZWZvcmUgdGhlIGNvbnZlcnNpb24gdG8gYSBNYXRjaGVyLgorKiBJbXByb3ZlbWVudDogdGhlIEdvb2dsZSBNb2NrIEdlbmVyYXRvciBjYW4gbm93IGdlbmVyYXRlIG1vY2tzIGZvcgorICBzb21lIGNsYXNzIHRlbXBsYXRlcy4KKyogQnVnIGZpeDogbW9jayBvYmplY3QgZGVzdHJ1Y3Rpb24gdHJpZ2dlcnJlZCBieSBhbm90aGVyIG1vY2sgb2JqZWN0J3MKKyAgZGVzdHJ1Y3Rpb24gbm8gbG9uZ2VyIGhhbmdzLgorKiBJbXByb3ZlbWVudDogR29vZ2xlIE1vY2sgRG9jdG9yIHdvcmtzIGJldHRlciB3aXRoIG5ld2VyIENsYW5nIGFuZAorICBHQ0Mgbm93LgorKiBDb21wYXRpYmlsaXR5IGZpeGVzLgorKiBCdWcvd2FybmluZyBmaXhlcy4KKworQ2hhbmdlcyBmb3IgMS42LjA6CisKKyogQ29tcGlsYXRpb24gaXMgbXVjaCBmYXN0ZXIgYW5kIHVzZXMgbXVjaCBsZXNzIG1lbW9yeSwgZXNwZWNpYWxseQorICB3aGVuIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBvZiBhIG1vY2sgY2xhc3MgYXJlIG1vdmVkIG91dCBvZgorICB0aGUgY2xhc3MgYm9keS4KKyogTmV3IG1hdGNoZXJzOiBQb2ludHdpc2UoKSwgRWFjaCgpLgorKiBOZXcgYWN0aW9uczogUmV0dXJuUG9pbnRlZSgpIGFuZCBSZXR1cm5SZWZPZkNvcHkoKS4KKyogQ01ha2Ugc3VwcG9ydC4KKyogUHJvamVjdCBmaWxlcyBmb3IgVmlzdWFsIFN0dWRpbyAyMDEwLgorKiBBbGxPZigpIGFuZCBBbnlPZigpIGNhbiBoYW5kbGUgdXAtdG8gMTAgYXJndW1lbnRzIG5vdy4KKyogR29vZ2xlIE1vY2sgZG9jdG9yIHVuZGVyc3RhbmRzIENsYW5nIGVycm9yIG1lc3NhZ2VzIG5vdy4KKyogU2V0QXJnUG9pbnRlZTw+IG5vdyBhY2NlcHRzIHN0cmluZyBsaXRlcmFscy4KKyogZ21vY2tfZ2VuLnB5IGhhbmRsZXMgc3RvcmFnZSBzcGVjaWZpZXIgbWFjcm9zIGFuZCB0ZW1wbGF0ZSByZXR1cm4KKyAgdHlwZXMgbm93LgorKiBDb21wYXRpYmlsaXR5IGZpeGVzLgorKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KKyogUG90ZW50aWFsbHkgaW5jb21wYXRpYmxlIGNoYW5nZXM6IGRpc2FibGVzIHRoZSBoYXJtZnVsICdtYWtlIGluc3RhbGwnCisgIGNvbW1hbmQgaW4gYXV0b3Rvb2xzLgorCitQb3RlbnRpYWxseSBicmVha2luZyBjaGFuZ2VzOgorCisqIFRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIE1BVENIRVIqKCkgY2hhbmdlcyBmcm9tIFB5dGhvbi1zdHlsZQorICBpbnRlcnBvbGF0aW9uIHRvIGFuIG9yZGluYXJ5IEMrKyBzdHJpbmcgZXhwcmVzc2lvbi4KKyogU2V0QXJndW1lbnRQb2ludGVlIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgU2V0QXJnUG9pbnRlZS4KKyogU29tZSBub24tZXNzZW50aWFsIHByb2plY3QgZmlsZXMgZm9yIFZpc3VhbCBTdHVkaW8gMjAwNSBhcmUgcmVtb3ZlZC4KKworQ2hhbmdlcyBmb3IgMS41LjA6CisKKyAqIE5ldyBmZWF0dXJlOiBHb29nbGUgTW9jayBjYW4gYmUgc2FmZWx5IHVzZWQgaW4gbXVsdGktdGhyZWFkZWQgdGVzdHMKKyAgIG9uIHBsYXRmb3JtcyBoYXZpbmcgcHRocmVhZHMuCisgKiBOZXcgZmVhdHVyZTogZnVuY3Rpb24gZm9yIHByaW50aW5nIGEgdmFsdWUgb2YgYXJiaXRyYXJ5IHR5cGUuCisgKiBOZXcgZmVhdHVyZTogZnVuY3Rpb24gRXhwbGFpbk1hdGNoUmVzdWx0KCkgZm9yIGVhc3kgZGVmaW5pdGlvbiBvZgorICAgY29tcG9zaXRlIG1hdGNoZXJzLgorICogVGhlIG5ldyBtYXRjaGVyIEFQSSBsZXRzIHVzZXItZGVmaW5lZCBtYXRjaGVycyBnZW5lcmF0ZSBjdXN0b20KKyAgIGV4cGxhbmF0aW9ucyBtb3JlIGRpcmVjdGx5IGFuZCBlZmZpY2llbnRseS4KKyAqIEJldHRlciBmYWlsdXJlIG1lc3NhZ2VzIGFsbCBhcm91bmQuCisgKiBOb3ROdWxsKCkgYW5kIElzTnVsbCgpIG5vdyB3b3JrIHdpdGggc21hcnQgcG9pbnRlcnMuCisgKiBGaWVsZCgpIGFuZCBQcm9wZXJ0eSgpIG5vdyB3b3JrIHdoZW4gdGhlIG1hdGNoZXIgYXJndW1lbnQgaXMgYSBwb2ludGVyCisgICBwYXNzZWQgYnkgcmVmZXJlbmNlLgorICogUmVndWxhciBleHByZXNzaW9uIG1hdGNoZXJzIG9uIGFsbCBwbGF0Zm9ybXMuCisgKiBBZGRlZCBHQ0MgNC4wIHN1cHBvcnQgZm9yIEdvb2dsZSBNb2NrIERvY3Rvci4KKyAqIEFkZGVkIGdtb2NrX2FsbF90ZXN0LmNjIGZvciBjb21waWxpbmcgbW9zdCBHb29nbGUgTW9jayB0ZXN0cworICAgaW4gYSBzaW5nbGUgZmlsZS4KKyAqIFNpZ25pZmljYW50bHkgY2xlYW5lZCB1cCBjb21waWxlciB3YXJuaW5ncy4KKyAqIEJ1ZyBmaXhlcywgYmV0dGVyIHRlc3QgY292ZXJhZ2UsIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisKKyBQb3RlbnRpYWxseSBicmVha2luZyBjaGFuZ2VzOgorCisgKiBDdXN0b20gbWF0Y2hlcnMgZGVmaW5lZCB1c2luZyBNYXRjaGVySW50ZXJmYWNlIG9yIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKQorICAgbmVlZCB0byBiZSB1cGRhdGVkIGFmdGVyIHVwZ3JhZGluZyB0byBHb29nbGUgTW9jayAxLjUuMDsgbWF0Y2hlcnMgZGVmaW5lZAorICAgdXNpbmcgTUFUQ0hFUiBvciBNQVRDSEVSX1AqIGFyZW4ndCBhZmZlY3RlZC4KKyAqIERyb3BwZWQgc3VwcG9ydCBmb3IgJ21ha2UgaW5zdGFsbCcuCisKK0NoYW5nZXMgZm9yIDEuNC4wICh3ZSBza2lwcGVkIDEuMi4qIGFuZCAxLjMuKiB0byBtYXRjaCB0aGUgdmVyc2lvbiBvZgorR29vZ2xlIFRlc3QpOgorCisgKiBXb3JrcyBpbiBtb3JlIGVudmlyb25tZW50czogU3ltYmlhbiBhbmQgbWluR1csIFZpc3VhbCBDKysgNy4xLgorICogTGlnaHRlciB3ZWlnaHQ6IGNvbWVzIHdpdGggb3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBUUjEgdHVwbGUgKG5vCisgICBtb3JlIGRlcGVuZGVuY3kgb24gQm9vc3QhKS4KKyAqIE5ldyBmZWF0dXJlOiAtLWdtb2NrX2NhdGNoX2xlYWtlZF9tb2NrcyBmb3IgZGV0ZWN0aW5nIGxlYWtlZCBtb2Nrcy4KKyAqIE5ldyBmZWF0dXJlOiBBQ1RJT05fVEVNUExBVEUgZm9yIGRlZmluaW5nIHRlbXBsYXRpemVkIGFjdGlvbnMuCisgKiBOZXcgZmVhdHVyZTogdGhlIC5BZnRlcigpIGNsYXVzZSBmb3Igc3BlY2lmeWluZyBleHBlY3RhdGlvbiBvcmRlci4KKyAqIE5ldyBmZWF0dXJlOiB0aGUgLldpdGgoKSBjbGF1c2UgZm9yIGZvciBzcGVjaWZ5aW5nIGludGVyLWFyZ3VtZW50CisgICBjb25zdHJhaW50cy4KKyAqIE5ldyBmZWF0dXJlOiBhY3Rpb25zIFJldHVybkFyZzxrPigpLCBSZXR1cm5OZXc8VD4oLi4uKSwgYW5kCisgICBEZWxldGVBcmc8az4oKS4KKyAqIE5ldyBmZWF0dXJlOiBtYXRjaGVycyBLZXkoKSwgUGFpcigpLCBBcmdzPC4uLj4oKSwgQWxsQXJncygpLCBJc051bGwoKSwKKyAgIGFuZCBDb250YWlucygpLgorICogTmV3IGZlYXR1cmU6IHV0aWxpdHkgY2xhc3MgTW9ja0Z1bmN0aW9uPEY+LCB1c2VmdWwgZm9yIGNoZWNrcG9pbnRzLCBldGMuCisgKiBOZXcgZmVhdHVyZTogZnVuY3Rpb25zIFZhbHVlKHgsIG0pIGFuZCBTYWZlTWF0Y2hlckNhc3Q8VD4obSkuCisgKiBOZXcgZmVhdHVyZTogY29weWluZyBhIG1vY2sgb2JqZWN0IGlzIHJlamVjdGVkIGF0IGNvbXBpbGUgdGltZS4KKyAqIE5ldyBmZWF0dXJlOiBhIHNjcmlwdCBmb3IgZnVzaW5nIGFsbCBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3QKKyAgIHNvdXJjZSBmaWxlcyBmb3IgZWFzeSBkZXBsb3ltZW50LgorICogSW1wcm92ZWQgdGhlIEdvb2dsZSBNb2NrIGRvY3RvciB0byBkaWFnbm9zZSBtb3JlIGRpc2Vhc2VzLgorICogSW1wcm92ZWQgdGhlIEdvb2dsZSBNb2NrIGdlbmVyYXRvciBzY3JpcHQuCisgKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBNYWMgT1MgWCBhbmQgZ2NjLgorICogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisKK0NoYW5nZXMgZm9yIDEuMS4wOgorCisgKiBOZXcgZmVhdHVyZTogYWJpbGl0eSB0byB1c2UgR29vZ2xlIE1vY2sgd2l0aCBhbnkgdGVzdGluZyBmcmFtZXdvcmsuCisgKiBOZXcgZmVhdHVyZTogbWFjcm9zIGZvciBlYXNpbHkgZGVmaW5pbmcgbmV3IG1hdGNoZXJzCisgKiBOZXcgZmVhdHVyZTogbWFjcm9zIGZvciBlYXNpbHkgZGVmaW5pbmcgbmV3IGFjdGlvbnMuCisgKiBOZXcgZmVhdHVyZTogbW9yZSBjb250YWluZXIgbWF0Y2hlcnMuCisgKiBOZXcgZmVhdHVyZTogYWN0aW9ucyBmb3IgYWNjZXNzaW5nIGZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgdGhyb3dpbmcKKyAgIGV4Y2VwdGlvbnMuCisgKiBJbXByb3ZlZCB0aGUgR29vZ2xlIE1vY2sgZG9jdG9yIHNjcmlwdCBmb3IgZGlhZ25vc2luZyBjb21waWxlciBlcnJvcnMuCisgKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KKworQ2hhbmdlcyBmb3IgMS4wLjA6CisKKyAqIEluaXRpYWwgT3BlbiBTb3VyY2UgcmVsZWFzZSBvZiBHb29nbGUgTW9jawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxODYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDTWFrZSBidWlsZCBzY3JpcHQgZm9yIEdvb2dsZSBNb2NrLgorIworIyBUbyBydW4gdGhlIHRlc3RzIGZvciBHb29nbGUgTW9jayBpdHNlbGYgb24gTGludXgsIHVzZSAnbWFrZSB0ZXN0JyBvcgorIyBjdGVzdC4gIFlvdSBjYW4gc2VsZWN0IHdoaWNoIHRlc3RzIHRvIHJ1biB1c2luZyAnY3Rlc3QgLVIgcmVnZXgnLgorIyBGb3IgbW9yZSBvcHRpb25zLCBydW4gJ2N0ZXN0IC0taGVscCcuCisKKyMgQlVJTERfU0hBUkVEX0xJQlMgaXMgYSBzdGFuZGFyZCBDTWFrZSB2YXJpYWJsZSwgYnV0IHdlIGRlY2xhcmUgaXQgaGVyZSB0bworIyBtYWtlIGl0IHByb21pbmVudCBpbiB0aGUgR1VJLgorb3B0aW9uKEJVSUxEX1NIQVJFRF9MSUJTICJCdWlsZCBzaGFyZWQgbGlicmFyaWVzIChETExzKS4iIE9GRikKKworb3B0aW9uKGdtb2NrX2J1aWxkX3Rlc3RzICJCdWlsZCBhbGwgb2YgR29vZ2xlIE1vY2sncyBvd24gdGVzdHMuIiBPRkYpCisKKyMgQSBkaXJlY3RvcnkgdG8gZmluZCBHb29nbGUgVGVzdCBzb3VyY2VzLgoraWYgKEVYSVNUUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2d0ZXN0L0NNYWtlTGlzdHMudHh0IikKKyAgc2V0KGd0ZXN0X2RpciBndGVzdCkKK2Vsc2UoKQorICBzZXQoZ3Rlc3RfZGlyIC4uL2dvb2dsZXRlc3QpCitlbmRpZigpCisKKyMgRGVmaW5lcyBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKSBhbmQgc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkuCitpbmNsdWRlKCIke2d0ZXN0X2Rpcn0vY21ha2UvaGVybWV0aWNfYnVpbGQuY21ha2UiIE9QVElPTkFMKQorCitpZiAoQ09NTUFORCBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQpCisgICMgR29vZ2xlIFRlc3QgYWxzbyBjYWxscyBoZXJtZXRpYyBzZXR1cCBmdW5jdGlvbnMgZnJvbSBhZGRfc3ViZGlyZWN0b3J5LAorICAjIGFsdGhvdWdoIGl0cyBjaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCB0aGluZ3MgYXQgdGhlIGN1cnJlbnQgc2NvcGUuCisgIHByZV9wcm9qZWN0X3NldF91cF9oZXJtZXRpY19idWlsZCgpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQcm9qZWN0LXdpZGUgc2V0dGluZ3MKKworIyBOYW1lIG9mIHRoZSBwcm9qZWN0LgorIworIyBDTWFrZSBmaWxlcyBpbiB0aGlzIHByb2plY3QgY2FuIHJlZmVyIHRvIHRoZSByb290IHNvdXJjZSBkaXJlY3RvcnkKKyMgYXMgJHtnbW9ja19TT1VSQ0VfRElSfSBhbmQgdG8gdGhlIHJvb3QgYmluYXJ5IGRpcmVjdG9yeSBhcworIyAke2dtb2NrX0JJTkFSWV9ESVJ9LgorIyBMYW5ndWFnZSAiQyIgaXMgcmVxdWlyZWQgZm9yIGZpbmRfcGFja2FnZShUaHJlYWRzKS4KK3Byb2plY3QoZ21vY2sgQ1hYIEMpCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42LjIpCisKK2lmIChDT01NQU5EIHNldF91cF9oZXJtZXRpY19idWlsZCkKKyAgc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkKK2VuZGlmKCkKKworIyBJbnN0cnVjdHMgQ01ha2UgdG8gcHJvY2VzcyBHb29nbGUgVGVzdCdzIENNYWtlTGlzdHMudHh0IGFuZCBhZGQgaXRzCisjIHRhcmdldHMgdG8gdGhlIGN1cnJlbnQgc2NvcGUuICBXZSBhcmUgcGxhY2luZyBHb29nbGUgVGVzdCdzIGJpbmFyeQorIyBkaXJlY3RvcnkgaW4gYSBzdWJkaXJlY3Rvcnkgb2Ygb3VyIG93biBhcyBWQyBjb21waWxhdGlvbiBtYXkgYnJlYWsKKyMgaWYgdGhleSBhcmUgdGhlIHNhbWUgKHRoZSBkZWZhdWx0KS4KK2FkZF9zdWJkaXJlY3RvcnkoIiR7Z3Rlc3RfZGlyfSIgIiR7Z21vY2tfQklOQVJZX0RJUn0vZ3Rlc3QiKQorCisjIEFsdGhvdWdoIEdvb2dsZSBUZXN0J3MgQ01ha2VMaXN0cy50eHQgY2FsbHMgdGhpcyBmdW5jdGlvbiwgdGhlCisjIGNoYW5nZXMgdGhlcmUgZG9uJ3QgYWZmZWN0IHRoZSBjdXJyZW50IHNjb3BlLiAgVGhlcmVmb3JlIHdlIGhhdmUgdG8KKyMgY2FsbCBpdCBhZ2FpbiBoZXJlLgorY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIoKSAgIyBmcm9tICR7Z3Rlc3RfZGlyfS9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQorCisjIEFkZHMgR29vZ2xlIE1vY2sncyBhbmQgR29vZ2xlIFRlc3QncyBoZWFkZXIgZGlyZWN0b3JpZXMgdG8gdGhlIHNlYXJjaCBwYXRoLgoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtnbW9ja19TT1VSQ0VfRElSfS9pbmNsdWRlIgorICAgICAgICAgICAgICAgICAgICAiJHtnbW9ja19TT1VSQ0VfRElSfSIKKyAgICAgICAgICAgICAgICAgICAgIiR7Z3Rlc3RfU09VUkNFX0RJUn0vaW5jbHVkZSIKKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGRpcmVjdG9yeSBpcyBuZWVkZWQgdG8gYnVpbGQgZGlyZWN0bHkgZnJvbSBHb29nbGUKKyAgICAgICAgICAgICAgICAgICAgIyBUZXN0IHNvdXJjZXMuCisgICAgICAgICAgICAgICAgICAgICIke2d0ZXN0X1NPVVJDRV9ESVJ9IikKKworIyBTdW1tYXJ5IG9mIHR1cGxlIHN1cHBvcnQgZm9yIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvOgorIyBDb21waWxlciAgICB2ZXJzaW9uKE1TKSAgdmVyc2lvbihjbWFrZSkgIFN1cHBvcnQKKyMgLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyA8PSBWUyAyMDEwICA8PSAxMCAgICAgICAgPD0gMTYwMCAgICAgICAgIFVzZSBHb29nbGUgVGVzdHMncyBvd24gdHVwbGUuCisjIFZTIDIwMTIgICAgIDExICAgICAgICAgICAxNzAwICAgICAgICAgICAgc3RkOjp0cjE6OnR1cGxlICsgX1ZBUklBRElDX01BWD0xMAorIyBWUyAyMDEzICAgICAxMiAgICAgICAgICAgMTgwMCAgICAgICAgICAgIHN0ZDo6dHIxOjp0dXBsZQoraWYgKE1TVkMgQU5EIE1TVkNfVkVSU0lPTiBFUVVBTCAxNzAwKQorICBhZGRfZGVmaW5pdGlvbnMoL0QgX1ZBUklBRElDX01BWD0xMCkKK2VuZGlmKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIERlZmluZXMgdGhlIGdtb2NrICYgZ21vY2tfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rCisjIHdpdGggb25lIG9mIHRoZW0uCisKKyMgR29vZ2xlIE1vY2sgbGlicmFyaWVzLiAgV2UgYnVpbGQgdGhlbSB1c2luZyBtb3JlIHN0cmljdCB3YXJuaW5ncyB0aGFuIHdoYXQKKyMgYXJlIHVzZWQgZm9yIG90aGVyIHRhcmdldHMsIHRvIGVuc3VyZSB0aGF0IEdvb2dsZSBNb2NrIGNhbiBiZSBjb21waWxlZCBieQorIyBhIHVzZXIgYWdncmVzc2l2ZSBhYm91dCB3YXJuaW5ncy4KK2N4eF9saWJyYXJ5KGdtb2NrCisgICAgICAgICAgICAiJHtjeHhfc3RyaWN0fSIKKyAgICAgICAgICAgICIke2d0ZXN0X2Rpcn0vc3JjL2d0ZXN0LWFsbC5jYyIKKyAgICAgICAgICAgIHNyYy9nbW9jay1hbGwuY2MpCisKK2N4eF9saWJyYXJ5KGdtb2NrX21haW4KKyAgICAgICAgICAgICIke2N4eF9zdHJpY3R9IgorICAgICAgICAgICAgIiR7Z3Rlc3RfZGlyfS9zcmMvZ3Rlc3QtYWxsLmNjIgorICAgICAgICAgICAgc3JjL2dtb2NrLWFsbC5jYworICAgICAgICAgICAgc3JjL2dtb2NrX21haW4uY2MpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBHb29nbGUgTW9jaydzIG93biB0ZXN0cy4KKyMKKyMgWW91IGNhbiBza2lwIHRoaXMgc2VjdGlvbiBpZiB5b3UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGVzdGluZworIyBHb29nbGUgTW9jayBpdHNlbGYuCisjCisjIFRoZSB0ZXN0cyBhcmUgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuICBUbyBidWlsZCB0aGVtLCBzZXQgdGhlCisjIGdtb2NrX2J1aWxkX3Rlc3RzIG9wdGlvbiB0byBPTi4gIFlvdSBjYW4gZG8gaXQgYnkgcnVubmluZyBjY21ha2UKKyMgb3Igc3BlY2lmeWluZyB0aGUgLURnbW9ja19idWlsZF90ZXN0cz1PTiBmbGFnIHdoZW4gcnVubmluZyBjbWFrZS4KKworaWYgKGdtb2NrX2J1aWxkX3Rlc3RzKQorICAjIFRoaXMgbXVzdCBiZSBzZXQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGZvciB0aGUgdGVzdHMgdG8gYmUgcnVuIGJ5CisgICMgJ21ha2UgdGVzdCcgb3IgY3Rlc3QuCisgIGVuYWJsZV90ZXN0aW5nKCkKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyBDKysgdGVzdHMgYnVpbHQgd2l0aCBzdGFuZGFyZCBjb21waWxlciBmbGFncy4KKworICBjeHhfdGVzdChnbW9jay1hY3Rpb25zX3Rlc3QgZ21vY2tfbWFpbikKKyAgY3h4X3Rlc3QoZ21vY2stY2FyZGluYWxpdGllc190ZXN0IGdtb2NrX21haW4pCisgIGN4eF90ZXN0KGdtb2NrX2V4X3Rlc3QgZ21vY2tfbWFpbikKKyAgY3h4X3Rlc3QoZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnNfdGVzdCBnbW9ja19tYWluKQorICBjeHhfdGVzdChnbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vyc190ZXN0IGdtb2NrX21haW4pCisgIGN4eF90ZXN0KGdtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlsc190ZXN0IGdtb2NrX21haW4pCisgIGN4eF90ZXN0KGdtb2NrLWdlbmVyYXRlZC1tYXRjaGVyc190ZXN0IGdtb2NrX21haW4pCisgIGN4eF90ZXN0KGdtb2NrLWludGVybmFsLXV0aWxzX3Rlc3QgZ21vY2tfbWFpbikKKyAgY3h4X3Rlc3QoZ21vY2stbWF0Y2hlcnNfdGVzdCBnbW9ja19tYWluKQorICBjeHhfdGVzdChnbW9jay1tb3JlLWFjdGlvbnNfdGVzdCBnbW9ja19tYWluKQorICBjeHhfdGVzdChnbW9jay1uaWNlLXN0cmljdF90ZXN0IGdtb2NrX21haW4pCisgIGN4eF90ZXN0KGdtb2NrLXBvcnRfdGVzdCBnbW9ja19tYWluKQorICBjeHhfdGVzdChnbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QgZ21vY2tfbWFpbikKKyAgY3h4X3Rlc3QoZ21vY2tfbGlua190ZXN0IGdtb2NrX21haW4gdGVzdC9nbW9ja19saW5rMl90ZXN0LmNjKQorICBjeHhfdGVzdChnbW9ja190ZXN0IGdtb2NrX21haW4pCisKKyAgaWYgKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQorICAgIGN4eF90ZXN0KGdtb2NrX3N0cmVzc190ZXN0IGdtb2NrKQorICBlbmRpZigpCisKKyAgIyBnbW9ja19hbGxfdGVzdCBpcyBjb21tZW50ZWQgdG8gc2F2ZSB0aW1lIGJ1aWxkaW5nIGFuZCBydW5uaW5nIHRlc3RzLgorICAjIFVuY29tbWVudCBpZiBuZWNlc3NhcnkuCisgICMgY3h4X3Rlc3QoZ21vY2tfYWxsX3Rlc3QgZ21vY2tfbWFpbikKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyBDKysgdGVzdHMgYnVpbHQgd2l0aCBub24tc3RhbmRhcmQgY29tcGlsZXIgZmxhZ3MuCisKKyAgY3h4X2xpYnJhcnkoZ21vY2tfbWFpbl9ub19leGNlcHRpb24gIiR7Y3h4X25vX2V4Y2VwdGlvbn0iCisgICAgIiR7Z3Rlc3RfZGlyfS9zcmMvZ3Rlc3QtYWxsLmNjIiBzcmMvZ21vY2stYWxsLmNjIHNyYy9nbW9ja19tYWluLmNjKQorCisgIGN4eF9saWJyYXJ5KGdtb2NrX21haW5fbm9fcnR0aSAiJHtjeHhfbm9fcnR0aX0iCisgICAgIiR7Z3Rlc3RfZGlyfS9zcmMvZ3Rlc3QtYWxsLmNjIiBzcmMvZ21vY2stYWxsLmNjIHNyYy9nbW9ja19tYWluLmNjKQorCisgIGlmIChOT1QgTVNWQyBPUiBNU1ZDX1ZFUlNJT04gTEVTUyAxNjAwKSAgIyAxNjAwIGlzIFZpc3VhbCBTdHVkaW8gMjAxMC4KKyAgICAjIFZpc3VhbCBTdHVkaW8gMjAxMCwgMjAxMiwgYW5kIDIwMTMgZGVmaW5lIHN5bWJvbHMgaW4gc3RkOjp0cjEgdGhhdAorICAgICMgY29uZmxpY3Qgd2l0aCBvdXIgb3duIGRlZmluaXRpb25zLiBUaGVyZWZvcmUgdXNpbmcgb3VyIG93biB0dXBsZSBkb2VzIG5vdAorICAgICMgd29yayBvbiB0aG9zZSBjb21waWxlcnMuCisgICAgY3h4X2xpYnJhcnkoZ21vY2tfbWFpbl91c2Vfb3duX3R1cGxlICIke2N4eF91c2Vfb3duX3R1cGxlfSIKKyAgICAgICIke2d0ZXN0X2Rpcn0vc3JjL2d0ZXN0LWFsbC5jYyIgc3JjL2dtb2NrLWFsbC5jYyBzcmMvZ21vY2tfbWFpbi5jYykKKworICAgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ21vY2tfdXNlX293bl90dXBsZV90ZXN0ICIke2N4eF91c2Vfb3duX3R1cGxlfSIKKyAgICAgIGdtb2NrX21haW5fdXNlX293bl90dXBsZSB0ZXN0L2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYykKKyAgZW5kaWYoKQorCisgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ21vY2stbW9yZS1hY3Rpb25zX25vX2V4Y2VwdGlvbl90ZXN0ICIke2N4eF9ub19leGNlcHRpb259IgorICAgIGdtb2NrX21haW5fbm9fZXhjZXB0aW9uIHRlc3QvZ21vY2stbW9yZS1hY3Rpb25zX3Rlc3QuY2MpCisKKyAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhnbW9ja19ub19ydHRpX3Rlc3QgIiR7Y3h4X25vX3J0dGl9IgorICAgIGdtb2NrX21haW5fbm9fcnR0aSB0ZXN0L2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYykKKworICBjeHhfc2hhcmVkX2xpYnJhcnkoc2hhcmVkX2dtb2NrX21haW4gIiR7Y3h4X2RlZmF1bHR9IgorICAgICIke2d0ZXN0X2Rpcn0vc3JjL2d0ZXN0LWFsbC5jYyIgc3JjL2dtb2NrLWFsbC5jYyBzcmMvZ21vY2tfbWFpbi5jYykKKworICAjIFRlc3RzIHRoYXQgYSBiaW5hcnkgY2FuIGJlIGJ1aWx0IHdpdGggR29vZ2xlIE1vY2sgYXMgYSBzaGFyZWQgbGlicmFyeS4gIE9uCisgICMgc29tZSBzeXN0ZW0gY29uZmlndXJhdGlvbnMsIGl0IG1heSBub3QgcG9zc2libGUgdG8gcnVuIHRoZSBiaW5hcnkgd2l0aG91dAorICAjIGtub3dpbmcgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbnMuIFdlIGRvIG5vdCB0cnkgdG8gcnVuCisgICMgdGhpcyBiaW5hcnkuIFRvIGdldCBhIG1vcmUgcm9idXN0IHNoYXJlZCBsaWJyYXJ5IGNvdmVyYWdlLCBjb25maWd1cmUgd2l0aAorICAjIC1EQlVJTERfU0hBUkVEX0xJQlM9T04uCisgIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3Moc2hhcmVkX2dtb2NrX3Rlc3RfICIke2N4eF9kZWZhdWx0fSIKKyAgICBzaGFyZWRfZ21vY2tfbWFpbiB0ZXN0L2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYykKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHNoYXJlZF9nbW9ja190ZXN0XworICAgIFBST1BFUlRJRVMKKyAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MSIpCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgUHl0aG9uIHRlc3RzLgorCisgIGN4eF9leGVjdXRhYmxlKGdtb2NrX2xlYWtfdGVzdF8gdGVzdCBnbW9ja19tYWluKQorICBweV90ZXN0KGdtb2NrX2xlYWtfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShnbW9ja19vdXRwdXRfdGVzdF8gdGVzdCBnbW9jaykKKyAgcHlfdGVzdChnbW9ja19vdXRwdXRfdGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9DT05UUklCVVRPUlMgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svQ09OVFJJQlVUT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOWFlMzYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svQ09OVFJJQlVUT1JTCkBAIC0wLDAgKzEsNDAgQEAKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBwZW9wbGUgd2hvJ3ZlIG1hZGUgbm9uLXRyaXZpYWwKKyMgY29udHJpYnV0aW9uIHRvIHRoZSBHb29nbGUgQysrIE1vY2tpbmcgRnJhbWV3b3JrIHByb2plY3QuICBQZW9wbGUKKyMgd2hvIGNvbW1pdCBjb2RlIHRvIHRoZSBwcm9qZWN0IGFyZSBlbmNvdXJhZ2VkIHRvIGFkZCB0aGVpciBuYW1lcworIyBoZXJlLiAgUGxlYXNlIGtlZXAgdGhlIGxpc3Qgc29ydGVkIGJ5IGZpcnN0IG5hbWVzLgorCitCZW5vaXQgU2lnb3VyZSA8dHN1bmFAZ29vZ2xlLmNvbT4KK0JvZ2RhbiBQaWxvY2EgPGJvb0Bnb29nbGUuY29tPgorQ2hhbmRsZXIgQ2FycnV0aCA8Y2hhbmRsZXJjQGdvb2dsZS5jb20+CitEYXZlIE1hY0xhY2hsYW4gPGRtYWNsYWNoQGdtYWlsLmNvbT4KK0RhdmlkIEFuZGVyc29uIDxkYW5kZXJzb25AZ29vZ2xlLmNvbT4KK0RlYW4gU3R1cnRldmFudAorR2VuZSBWb2xvdmljaCA8Z3ZAY2l0ZS5jb20+CitIYWwgQnVyY2ggPGdtb2NrQGhidXJjaC5jb20+CitKZWZmcmV5IFlhc3NraW4gPGp5YXNza2luQGdvb2dsZS5jb20+CitKaW0gS2VsbGVyIDxqaW1rZWxsZXJAZ29vZ2xlLmNvbT4KK0pvZSBXYWxuZXMgPGpvZUB0cnVlbWVzaC5jb20+CitKb24gV3JheSA8andyYXlAZ29vZ2xlLmNvbT4KK0tlaXIgTWllcmxlIDxtaWVybGVAZ21haWwuY29tPgorS2VpdGggUmF5IDxrZWl0aC5yYXlAZ21haWwuY29tPgorS29zdHlhIFNlcmVicnlhbnkgPGtjY0Bnb29nbGUuY29tPgorTGV2IE1ha2hsaXMKK01hbnVlbCBLbGltZWsgPGtsaW1la0Bnb29nbGUuY29tPgorTWFyaW8gVGFuZXYgPHJhZGl4QGdvb2dsZS5jb20+CitNYXJrIFBhc2tpbgorTWFya3VzIEhldWxlIDxtYXJrdXMuaGV1bGVAZ21haWwuY29tPgorTWF0dGhldyBTaW1tb25zIDxzaW1tb25tdEBhY20ub3JnPgorTWlrZSBCbGFuZCA8bWJsYW5kQGdvb2dsZS5jb20+CitOZWFsIE5vcndpdHogPG5ub3J3aXR6QGdtYWlsLmNvbT4KK05lcm1pbiBPemtpcmFuYXJ0bGkgPG5lcm1pbkBnb29nbGUuY29tPgorT3dlbiBDYXJsc2VuIDxvY2FybHNlbkBnb29nbGUuY29tPgorUGFuZWVuZHJhIEJhIDxwYW5lZW5kcmFAZ29vZ2xlLmNvbT4KK1BhdWwgTWVuYWdlIDxtZW5hZ2VAZ29vZ2xlLmNvbT4KK1Bpb3RyIEthbWluc2tpIDxwaW90cmtAZ29vZ2xlLmNvbT4KK1J1c3MgUnVmZXIgPHJ1c3NAcGVudGFkLmNvbT4KK1N2ZXJyZSBTdW5kc2RhbCA8c3VuZHNkYWxAZ21haWwuY29tPgorVGFrZXNoaSBZb3NoaW5vIDx0eW9zaGlub0Bnb29nbGUuY29tPgorVmFkaW0gQmVybWFuIDx2YWRpbWJAZ29vZ2xlLmNvbT4KK1ZsYWQgTG9zZXYgPHZsYWRsQGdvb2dsZS5jb20+CitXb2xmZ2FuZyBLbGllciA8d2tsaWVyQGdvb2dsZS5jb20+CitaaGFueW9uZyBXYW4gPHdhbkBnb29nbGUuY29tPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL0xJQ0VOU0UgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQxYTExCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL0xJQ0VOU0UKQEAgLTAsMCArMSwyOCBAQAorQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKK2luIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKK2Rpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKK2NvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCit0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDQ1ODgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMjAgQEAKKyMgQXV0b21ha2UgZmlsZQorCisjIE5vbnN0YW5kYXJkIHBhY2thZ2UgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbi4KK0VYVFJBX0RJU1QgPSBMSUNFTlNFCisKKyMgV2UgbWF5IG5lZWQgdG8gYnVpbGQgb3VyIGludGVybmFsbHkgcGFja2FnZWQgZ3Rlc3QuIElmIHNvLCBpdCB3aWxsIGJlCisjIGluY2x1ZGVkIGluIHRoZSAnc3ViZGlycycgdmFyaWFibGUuCitTVUJESVJTID0gJChzdWJkaXJzKQorCisjIFRoaXMgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LCBzbyBjbGVhbiBpdCBmb3IgZGlzdHJpYnV0aW9uLgorRElTVENMRUFORklMRVMgPSBzY3JpcHRzL2dtb2NrLWNvbmZpZworCisjIFdlIGRlZmluZSB0aGUgZ2xvYmFsIEFNX0NQUEZMQUdTIGFzIGV2ZXJ5dGhpbmcgd2UgY29tcGlsZSBpbmNsdWRlcyBmcm9tIHRoZXNlCisjIGRpcmVjdG9yaWVzLgorQU1fQ1BQRkxBR1MgPSAkKEdURVNUX0NQUEZMQUdTKSAtSSQoc3JjZGlyKS9pbmNsdWRlCisKKyMgTW9kaWZpZXMgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncyBmb3IgcHRocmVhZHMgY29tcGF0aWJpbGl0eS4KK2lmIEhBVkVfUFRIUkVBRFMKKyAgQU1fQ1hYRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NAIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MQorICBBTV9MSUJTID0gQFBUSFJFQURfTElCU0AKK2VuZGlmCisKKyMgQnVpbGQgcnVsZXMgZm9yIGxpYnJhcmllcy4KK2xpYl9MVExJQlJBUklFUyA9IGxpYi9saWJnbW9jay5sYSBsaWIvbGliZ21vY2tfbWFpbi5sYQorCitsaWJfbGliZ21vY2tfbGFfU09VUkNFUyA9IHNyYy9nbW9jay1hbGwuY2MKKworcGtnaW5jbHVkZV9IRUFERVJTID0gXAorICBpbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaCBcCisgIGluY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIFwKKyAgaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIFwKKyAgaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oIFwKKyAgaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCBcCisgIGluY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmggXAorICBpbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmggXAorICBpbmNsdWRlL2dtb2NrL2dtb2NrLW1vcmUtYWN0aW9ucy5oIFwKKyAgaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmggXAorICBpbmNsdWRlL2dtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCBcCisgIGluY2x1ZGUvZ21vY2svZ21vY2suaAorCitwa2dpbmNsdWRlX2ludGVybmFsZGlyID0gJChwa2dpbmNsdWRlZGlyKS9pbnRlcm5hbAorcGtnaW5jbHVkZV9pbnRlcm5hbF9IRUFERVJTID0gXAorICBpbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oIFwKKyAgaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIFwKKyAgaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgKKworbGliX2xpYmdtb2NrX21haW5fbGFfU09VUkNFUyA9IHNyYy9nbW9ja19tYWluLmNjCitsaWJfbGliZ21vY2tfbWFpbl9sYV9MSUJBREQgPSBsaWIvbGliZ21vY2subGEKKworIyBCdWlsZCBydWxlcyBmb3IgdGVzdHMuIEF1dG9tYWtlJ3MgbmFtaW5nIGZvciBzb21lIG9mIHRoZXNlIHZhcmlhYmxlcyBpc24ndAorIyB0ZXJyaWJseSBvYnZpb3VzLCBzbyB0aGlzIGlzIGEgYnJpZWYgcmVmZXJlbmNlOgorIworIyBURVNUUyAtLSBQcm9ncmFtcyBydW4gYXV0b21hdGljYWxseSBieSAibWFrZSBjaGVjayIKKyMgY2hlY2tfUFJPR1JBTVMgLS0gUHJvZ3JhbXMgYnVpbHQgYnkgIm1ha2UgY2hlY2siIGJ1dCBub3QgbmVjZXNzYXJpbHkgcnVuCisKK1RFU1RTPQorY2hlY2tfUFJPR1JBTVM9CitBTV9MREZMQUdTID0gJChHVEVTVF9MREZMQUdTKQorCisjIFRoaXMgZXhlcmNpc2VzIGFsbCBtYWpvciBjb21wb25lbnRzIG9mIEdvb2dsZSBNb2NrLiAgSXQgYWxzbworIyB2ZXJpZmllcyB0aGF0IGxpYmdtb2NrIHdvcmtzLgorVEVTVFMgKz0gdGVzdC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QKK2NoZWNrX1BST0dSQU1TICs9IHRlc3QvZ21vY2stc3BlYy1idWlsZGVyc190ZXN0Cit0ZXN0X2dtb2NrX3NwZWNfYnVpbGRlcnNfdGVzdF9TT1VSQ0VTID0gdGVzdC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QuY2MKK3Rlc3RfZ21vY2tfc3BlY19idWlsZGVyc190ZXN0X0xEQUREID0gJChHVEVTVF9MSUJTKSBsaWIvbGliZ21vY2subGEKKworIyBUaGlzIHRlc3RzIHVzaW5nIEdvb2dsZSBNb2NrIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzLiAgSXQgYWxzbworIyB2ZXJpZmllcyB0aGF0IGxpYmdtb2NrX21haW4gYW5kIGxpYmdtb2NrIHdvcmsuCitURVNUUyArPSB0ZXN0L2dtb2NrX2xpbmtfdGVzdAorY2hlY2tfUFJPR1JBTVMgKz0gdGVzdC9nbW9ja19saW5rX3Rlc3QKK3Rlc3RfZ21vY2tfbGlua190ZXN0X1NPVVJDRVMgPSBcCisgIHRlc3QvZ21vY2tfbGluazJfdGVzdC5jYyBcCisgIHRlc3QvZ21vY2tfbGlua190ZXN0LmNjIFwKKyAgdGVzdC9nbW9ja19saW5rX3Rlc3QuaAordGVzdF9nbW9ja19saW5rX3Rlc3RfTERBREQgPSAkKEdURVNUX0xJQlMpIGxpYi9saWJnbW9ja19tYWluLmxhICBsaWIvbGliZ21vY2subGEKKworaWYgSEFWRV9QWVRIT04KKyAgIyBUZXN0cyB0aGF0IGZ1c2VkIGdtb2NrIGZpbGVzIGNvbXBpbGUgYW5kIHdvcmsuCisgIFRFU1RTICs9IHRlc3QvZ21vY2tfZnVzZWRfdGVzdAorICBjaGVja19QUk9HUkFNUyArPSB0ZXN0L2dtb2NrX2Z1c2VkX3Rlc3QKKyAgdGVzdF9nbW9ja19mdXNlZF90ZXN0X1NPVVJDRVMgPSBcCisgICAgZnVzZWQtc3JjL2dtb2NrLWd0ZXN0LWFsbC5jYyBcCisgICAgZnVzZWQtc3JjL2dtb2NrL2dtb2NrLmggXAorICAgIGZ1c2VkLXNyYy9nbW9ja19tYWluLmNjIFwKKyAgICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QuaCBcCisgICAgdGVzdC9nbW9ja190ZXN0LmNjCisgIHRlc3RfZ21vY2tfZnVzZWRfdGVzdF9DUFBGTEFHUyA9IC1JIiQoc3JjZGlyKS9mdXNlZC1zcmMiCitlbmRpZgorCisjIEdvb2dsZSBNb2NrIHNvdXJjZSBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUgZGlyZWN0bHkuCitHTU9DS19TT1VSQ0VfSU5HTFVERVMgPSBcCisgIHNyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjIFwKKyAgc3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjIFwKKyAgc3JjL2dtb2NrLW1hdGNoZXJzLmNjIFwKKyAgc3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MgXAorICBzcmMvZ21vY2suY2MKKworRVhUUkFfRElTVCArPSAkKEdNT0NLX1NPVVJDRV9JTkdMVURFUykKKworIyBDKysgdGVzdHMgdGhhdCB3ZSBkb24ndCBjb21waWxlIHVzaW5nIGF1dG90b29scy4KK0VYVFJBX0RJU1QgKz0gXAorICB0ZXN0L2dtb2NrLWFjdGlvbnNfdGVzdC5jYyBcCisgIHRlc3QvZ21vY2tfYWxsX3Rlc3QuY2MgXAorICB0ZXN0L2dtb2NrLWNhcmRpbmFsaXRpZXNfdGVzdC5jYyBcCisgIHRlc3QvZ21vY2tfZXhfdGVzdC5jYyBcCisgIHRlc3QvZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnNfdGVzdC5jYyBcCisgIHRlc3QvZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnNfdGVzdC5jYyBcCisgIHRlc3QvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzX3Rlc3QuY2MgXAorICB0ZXN0L2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVyc190ZXN0LmNjIFwKKyAgdGVzdC9nbW9jay1pbnRlcm5hbC11dGlsc190ZXN0LmNjIFwKKyAgdGVzdC9nbW9jay1tYXRjaGVyc190ZXN0LmNjIFwKKyAgdGVzdC9nbW9jay1tb3JlLWFjdGlvbnNfdGVzdC5jYyBcCisgIHRlc3QvZ21vY2stbmljZS1zdHJpY3RfdGVzdC5jYyBcCisgIHRlc3QvZ21vY2stcG9ydF90ZXN0LmNjIFwKKyAgdGVzdC9nbW9ja19zdHJlc3NfdGVzdC5jYworCisjIFB5dGhvbiB0ZXN0cywgd2hpY2ggd2UgZG9uJ3QgcnVuIHVzaW5nIGF1dG90b29scy4KK0VYVFJBX0RJU1QgKz0gXAorICB0ZXN0L2dtb2NrX2xlYWtfdGVzdC5weSBcCisgIHRlc3QvZ21vY2tfbGVha190ZXN0Xy5jYyBcCisgIHRlc3QvZ21vY2tfb3V0cHV0X3Rlc3QucHkgXAorICB0ZXN0L2dtb2NrX291dHB1dF90ZXN0Xy5jYyBcCisgIHRlc3QvZ21vY2tfb3V0cHV0X3Rlc3RfZ29sZGVuLnR4dCBcCisgIHRlc3QvZ21vY2tfdGVzdF91dGlscy5weQorCisjIE5vbnN0YW5kYXJkIHBhY2thZ2UgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbi4KK0VYVFJBX0RJU1QgKz0gXAorICBDSEFOR0VTIFwKKyAgQ09OVFJJQlVUT1JTIFwKKyAgbWFrZS9NYWtlZmlsZQorCisjIFB1bXAgc2NyaXB0cyBmb3IgZ2VuZXJhdGluZyBHb29nbGUgTW9jayBoZWFkZXJzLgorIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKTogYXV0b21hdGUgdGhlIGdlbmVyYXRpb24gb2YgKi5oIGZyb20gKi5oLnB1bXAuCitFWFRSQV9ESVNUICs9IFwKKyAgaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAgXAorICBpbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcCBcCisgIGluY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgucHVtcCBcCisgIGluY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcCBcCisgIGluY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgucHVtcAorCisjIFNjcmlwdCBmb3IgZnVzaW5nIEdvb2dsZSBNb2NrIGFuZCBHb29nbGUgVGVzdCBzb3VyY2UgZmlsZXMuCitFWFRSQV9ESVNUICs9IHNjcmlwdHMvZnVzZV9nbW9ja19maWxlcy5weQorCisjIFRoZSBHb29nbGUgTW9jayBHZW5lcmF0b3IgdG9vbCBmcm9tIHRoZSBjcHBjbGVhbiBwcm9qZWN0LgorRVhUUkFfRElTVCArPSBcCisgIHNjcmlwdHMvZ2VuZXJhdG9yL0xJQ0VOU0UgXAorICBzY3JpcHRzL2dlbmVyYXRvci9SRUFETUUgXAorICBzY3JpcHRzL2dlbmVyYXRvci9SRUFETUUuY3BwY2xlYW4gXAorICBzY3JpcHRzL2dlbmVyYXRvci9jcHAvX19pbml0X18ucHkgXAorICBzY3JpcHRzL2dlbmVyYXRvci9jcHAvYXN0LnB5IFwKKyAgc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2dtb2NrX2NsYXNzLnB5IFwKKyAgc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2tleXdvcmRzLnB5IFwKKyAgc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3Rva2VuaXplLnB5IFwKKyAgc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3V0aWxzLnB5IFwKKyAgc2NyaXB0cy9nZW5lcmF0b3IvZ21vY2tfZ2VuLnB5CisKKyMgU2NyaXB0IGZvciBkaWFnbm9zaW5nIGNvbXBpbGVyIGVycm9ycyBpbiBwcm9ncmFtcyB0aGF0IHVzZSBHb29nbGUKKyMgTW9jay4KK0VYVFJBX0RJU1QgKz0gc2NyaXB0cy9nbW9ja19kb2N0b3IucHkKKworIyBDTWFrZSBzY3JpcHRzLgorRVhUUkFfRElTVCArPSBcCisgIENNYWtlTGlzdHMudHh0CisKKyMgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAwNSBwcm9qZWN0cy4KK0VYVFJBX0RJU1QgKz0gXAorICBtc3ZjLzIwMDUvZ21vY2suc2xuIFwKKyAgbXN2Yy8yMDA1L2dtb2NrLnZjcHJvaiBcCisgIG1zdmMvMjAwNS9nbW9ja19jb25maWcudnNwcm9wcyBcCisgIG1zdmMvMjAwNS9nbW9ja19tYWluLnZjcHJvaiBcCisgIG1zdmMvMjAwNS9nbW9ja190ZXN0LnZjcHJvagorCisjIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTAgcHJvamVjdHMuCitFWFRSQV9ESVNUICs9IFwKKyAgbXN2Yy8yMDEwL2dtb2NrLnNsbiBcCisgIG1zdmMvMjAxMC9nbW9jay52Y3hwcm9qIFwKKyAgbXN2Yy8yMDEwL2dtb2NrX2NvbmZpZy5wcm9wcyBcCisgIG1zdmMvMjAxMC9nbW9ja19tYWluLnZjeHByb2ogXAorICBtc3ZjLzIwMTAvZ21vY2tfdGVzdC52Y3hwcm9qCisKK2lmIEhBVkVfUFlUSE9OCisjIGdtb2NrX3Rlc3QuY2MgZG9lcyBub3QgcmVhbGx5IGRlcGVuZCBvbiBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlCisjIGZ1c2VkLWdtb2NrLWludGVybmFsIHJ1bGUuICBIb3dldmVyLCBnbW9ja190ZXN0Lm8gZG9lcywgYW5kIGl0IGlzCisjIGltcG9ydGFudCB0byBpbmNsdWRlIHRlc3QvZ21vY2tfdGVzdC5jYyBhcyBwYXJ0IG9mIHRoaXMgcnVsZSBpbiBvcmRlciB0bworIyBwcmV2ZW50IGNvbXBpbGluZyBnbW9ja190ZXN0Lm8gdW50aWwgYWxsIGRlcGVuZGVudCBmaWxlcyBoYXZlIGJlZW4KKyMgZ2VuZXJhdGVkLgorJCh0ZXN0X2dtb2NrX2Z1c2VkX3Rlc3RfU09VUkNFUyk6IGZ1c2VkLWdtb2NrLWludGVybmFsCisKKyMgVE9ETyh2bGFkbEBnb29nbGUuY29tKTogRmluZCBhIHdheSB0byBhZGQgR29vZ2xlIFRlc3RzJ3Mgc291cmNlcyBoZXJlLgorZnVzZWQtZ21vY2staW50ZXJuYWw6ICQocGtnaW5jbHVkZV9IRUFERVJTKSAkKHBrZ2luY2x1ZGVfaW50ZXJuYWxfSEVBREVSUykgXAorICAgICAgICAgICAgICAgICAgICAgICQobGliX2xpYmdtb2NrX2xhX1NPVVJDRVMpICQoR01PQ0tfU09VUkNFX0lOR0xVREVTKSBcCisgICAgICAgICAgICAgICAgICAgICAgJChsaWJfbGliZ21vY2tfbWFpbl9sYV9TT1VSQ0VTKSBcCisgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy9mdXNlX2dtb2NrX2ZpbGVzLnB5CisJbWtkaXIgLXAgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCisJY2htb2QgLVIgdSt3ICIkKHNyY2RpcikvZnVzZWQtc3JjIgorCXJtIC1mICIkKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LmgiCisJcm0gLWYgIiQoc3JjZGlyKS9mdXNlZC1zcmMvZ21vY2svZ21vY2suaCIKKwlybSAtZiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9nbW9jay1ndGVzdC1hbGwuY2MiCisJIiQoc3JjZGlyKS9zY3JpcHRzL2Z1c2VfZ21vY2tfZmlsZXMucHkiICIkKHNyY2RpcikvZnVzZWQtc3JjIgorCWNwIC1mICIkKHNyY2Rpcikvc3JjL2dtb2NrX21haW4uY2MiICIkKHNyY2RpcikvZnVzZWQtc3JjIgorCittYWludGFpbmVyLWNsZWFuLWxvY2FsOgorCXJtIC1yZiAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKK2VuZGlmCisKKyMgRGVhdGggdGVzdHMgbWF5IHByb2R1Y2UgY29yZSBkdW1wcyBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LiBJbiBjYXNlCisjIHRoaXMgaGFwcGVucywgY2xlYW4gdGhlbSB0byBrZWVwIGRpc3RjbGVhbmNoZWNrIGhhcHB5LgorQ0xFQU5GSUxFUyA9IGNvcmUKKworIyBEaXNhYmxlcyAnbWFrZSBpbnN0YWxsJyBhcyBpbnN0YWxsaW5nIGEgY29tcGlsZWQgdmVyc2lvbiBvZiBHb29nbGUKKyMgTW9jayBjYW4gbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3IgZHVlIHRvIHZpb2xhdGlvbiBvZiB0aGUKKyMgT25lLURlZmluaXRpb24gUnVsZS4KKworaW5zdGFsbC1leGVjLWxvY2FsOgorCWVjaG8gIidtYWtlIGluc3RhbGwnIGlzIGRhbmdlcm91cyBhbmQgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgc2VlIFJFQURNRSBmb3IgaG93IHRvIGludGVncmF0ZSBHb29nbGUgTW9jayBpbnRvIHlvdXIgYnVpbGQgc3lzdGVtLiIKKwlmYWxzZQorCitpbnN0YWxsLWRhdGEtbG9jYWw6CisJZWNobyAiJ21ha2UgaW5zdGFsbCcgaXMgZGFuZ2Vyb3VzIGFuZCBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBzZWUgUkVBRE1FIGZvciBob3cgdG8gaW50ZWdyYXRlIEdvb2dsZSBNb2NrIGludG8geW91ciBidWlsZCBzeXN0ZW0uIgorCWZhbHNlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svUkVBRE1FLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDU1NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL1JFQURNRS5tZApAQCAtMCwwICsxLDMzMyBAQAorIyMgR29vZ2xlIE1vY2sgIyMKKworVGhlIEdvb2dsZSBDKysgbW9ja2luZyBmcmFtZXdvcmsuCisKKyMjIyBPdmVydmlldyAjIyMKKworR29vZ2xlJ3MgZnJhbWV3b3JrIGZvciB3cml0aW5nIGFuZCB1c2luZyBDKysgbW9jayBjbGFzc2VzLgorSXQgY2FuIGhlbHAgeW91IGRlcml2ZSBiZXR0ZXIgZGVzaWducyBvZiB5b3VyIHN5c3RlbSBhbmQgd3JpdGUgYmV0dGVyIHRlc3RzLgorCitJdCBpcyBpbnNwaXJlZCBieToKKworICAqIFtqTW9ja10oaHR0cDovL3d3dy5qbW9jay5vcmcvKSwKKyAgKiBbRWFzeU1vY2tdKGh0dHA6Ly93d3cuZWFzeW1vY2sub3JnLyksIGFuZAorICAqIFtIYW1jcmVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2hhbWNyZXN0LyksCisKK2FuZCBkZXNpZ25lZCB3aXRoIEMrKydzIHNwZWNpZmljcyBpbiBtaW5kLgorCitHb29nbGUgbW9jazoKKworICAqIGxldHMgeW91IGNyZWF0ZSBtb2NrIGNsYXNzZXMgdHJpdmlhbGx5IHVzaW5nIHNpbXBsZSBtYWNyb3MuCisgICogc3VwcG9ydHMgYSByaWNoIHNldCBvZiBtYXRjaGVycyBhbmQgYWN0aW9ucy4KKyAgKiBoYW5kbGVzIHVub3JkZXJlZCwgcGFydGlhbGx5IG9yZGVyZWQsIG9yIGNvbXBsZXRlbHkgb3JkZXJlZCBleHBlY3RhdGlvbnMuCisgICogaXMgZXh0ZW5zaWJsZSBieSB1c2Vycy4KKworV2UgaG9wZSB5b3UgZmluZCBpdCB1c2VmdWwhCisKKyMjIyBGZWF0dXJlcyAjIyMKKworICAqIFByb3ZpZGVzIGEgZGVjbGFyYXRpdmUgc3ludGF4IGZvciBkZWZpbmluZyBtb2Nrcy4KKyAgKiBDYW4gZWFzaWx5IGRlZmluZSBwYXJ0aWFsIChoeWJyaWQpIG1vY2tzLCB3aGljaCBhcmUgYSBjcm9zcyBvZiByZWFsCisgICAgYW5kIG1vY2sgb2JqZWN0cy4KKyAgKiBIYW5kbGVzIGZ1bmN0aW9ucyBvZiBhcmJpdHJhcnkgdHlwZXMgYW5kIG92ZXJsb2FkZWQgZnVuY3Rpb25zLgorICAqIENvbWVzIHdpdGggYSByaWNoIHNldCBvZiBtYXRjaGVycyBmb3IgdmFsaWRhdGluZyBmdW5jdGlvbiBhcmd1bWVudHMuCisgICogVXNlcyBhbiBpbnR1aXRpdmUgc3ludGF4IGZvciBjb250cm9sbGluZyB0aGUgYmVoYXZpb3Igb2YgYSBtb2NrLgorICAqIERvZXMgYXV0b21hdGljIHZlcmlmaWNhdGlvbiBvZiBleHBlY3RhdGlvbnMgKG5vIHJlY29yZC1hbmQtcmVwbGF5IG5lZWRlZCkuCisgICogQWxsb3dzIGFyYml0cmFyeSAocGFydGlhbCkgb3JkZXJpbmcgY29uc3RyYWludHMgb24KKyAgICBmdW5jdGlvbiBjYWxscyB0byBiZSBleHByZXNzZWQsLgorICAqIExldHMgYSB1c2VyIGV4dGVuZCBpdCBieSBkZWZpbmluZyBuZXcgbWF0Y2hlcnMgYW5kIGFjdGlvbnMuCisgICogRG9lcyBub3QgdXNlIGV4Y2VwdGlvbnMuCisgICogSXMgZWFzeSB0byBsZWFybiBhbmQgdXNlLgorCitQbGVhc2Ugc2VlIHRoZSBwcm9qZWN0IHBhZ2UgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYXMgd2VsbCBhcyB0aGUKK21haWxpbmcgbGlzdCBmb3IgcXVlc3Rpb25zLCBkaXNjdXNzaW9ucywgYW5kIGRldmVsb3BtZW50LiAgVGhlcmUgaXMKK2Fsc28gYW4gSVJDIGNoYW5uZWwgb24gT0ZUQyAoaXJjLm9mdGMubmV0KSAjZ3Rlc3QgYXZhaWxhYmxlLiAgUGxlYXNlCitqb2luIHVzIQorCitQbGVhc2Ugbm90ZSB0aGF0IGNvZGUgdW5kZXIgW3NjcmlwdHMvZ2VuZXJhdG9yXShzY3JpcHRzL2dlbmVyYXRvci8pIGlzCitmcm9tIFtjcHBjbGVhbl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NwcGNsZWFuLykgYW5kIHJlbGVhc2VkIHVuZGVyCit0aGUgQXBhY2hlIExpY2Vuc2UsIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIEdvb2dsZSBNb2NrJ3MgbGljZW5zZS4KKworIyMgR2V0dGluZyBTdGFydGVkICMjCisKK0lmIHlvdSBhcmUgbmV3IHRvIHRoZSBwcm9qZWN0LCB3ZSBzdWdnZXN0IHRoYXQgeW91IHJlYWQgdGhlIHVzZXIKK2RvY3VtZW50YXRpb24gaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKworICAqIExlYXJuIHRoZSBbYmFzaWNzXSguLi9nb29nbGV0ZXN0L2RvY3MvUHJpbWVyLm1kKSBvZgorICAgIEdvb2dsZSBUZXN0LCBpZiB5b3UgY2hvb3NlIHRvIHVzZSBHb29nbGUgTW9jayB3aXRoIGl0IChyZWNvbW1lbmRlZCkuCisgICogUmVhZCBbR29vZ2xlIE1vY2sgZm9yIER1bW1pZXNdKGRvY3MvRm9yRHVtbWllcy5tZCkuCisgICogUmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93IG9uIGhvdyB0byBidWlsZCBHb29nbGUgTW9jay4KKworWW91IGNhbiBhbHNvIHdhdGNoIFpoYW55b25nJ3MgW3RhbGtdKGh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1zWXBDeUxJNDdyTSkgb24gR29vZ2xlIE1vY2sncyB1c2FnZSBhbmQgaW1wbGVtZW50YXRpb24uCisKK09uY2UgeW91IHVuZGVyc3RhbmQgdGhlIGJhc2ljcywgY2hlY2sgb3V0IHRoZSByZXN0IG9mIHRoZSBkb2NzOgorCisgICogW0NoZWF0U2hlZXRdKGdvb2dsZW1vY2svZG9jcy9DaGVhdFNoZWV0Lm1kKSAtIGFsbCB0aGUgY29tbW9ubHkgdXNlZCBzdHVmZgorICAgIGF0IGEgZ2xhbmNlLgorICAqIFtDb29rQm9va10oZ29vZ2xlbW9jay9kb2NzL0Nvb2tCb29rLm1kKSAtIHJlY2lwZXMgZm9yIGdldHRpbmcgdGhpbmdzIGRvbmUsCisgICAgaW5jbHVkaW5nIGFkdmFuY2VkIHRlY2huaXF1ZXMuCisKK0lmIHlvdSBuZWVkIGhlbHAsIHBsZWFzZSBjaGVjayB0aGUKK1tLbm93bklzc3Vlc10oZ29vZ2xlbW9jay9kb2NzL0tub3duSXNzdWVzLm1kKSBhbmQKK1tGcmVxdWVudGx5QXNrZWRRdWVzdGlvbnNdKGdvb2dsZW1vY2svZG9jcy9mcmVxdWVudGx5YXNrZWRxdWVzdGlvbnMubWQpIGJlZm9yZQorcG9zdGluZyBhIHF1ZXN0aW9uIG9uIHRoZQorW2Rpc2N1c3Npb24gZ3JvdXBdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGVtb2NrKS4KKworCisjIyMgVXNpbmcgR29vZ2xlIE1vY2sgV2l0aG91dCBHb29nbGUgVGVzdCAjIyMKKworR29vZ2xlIE1vY2sgaXMgbm90IGEgdGVzdGluZyBmcmFtZXdvcmsgaXRzZWxmLiAgSW5zdGVhZCwgaXQgbmVlZHMgYQordGVzdGluZyBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgdGVzdHMuICBHb29nbGUgTW9jayB3b3JrcyBzZWFtbGVzc2x5Cit3aXRoIFtHb29nbGUgVGVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvKSwgYnV0agoreW91IGNhbiBhbHNvIHVzZSBpdCB3aXRoIFthbnkgQysrIHRlc3RpbmcgZnJhbWV3b3JrXShnb29nbGVtb2NrL0ZvckR1bW1pZXMubWQjVXNpbmdfR29vZ2xlX01vY2tfd2l0aF9BbnlfVGVzdGluZ19GcmFtZXdvcmspLgorCisjIyMgUmVxdWlyZW1lbnRzIGZvciBFbmQgVXNlcnMgIyMjCisKK0dvb2dsZSBNb2NrIGlzIGltcGxlbWVudGVkIG9uIHRvcCBvZiBbR29vZ2xlIFRlc3RdKAoraHR0cDovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QvKSwgYW5kIGRlcGVuZHMgb24gaXQuCitZb3UgbXVzdCB1c2UgdGhlIGJ1bmRsZWQgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCB3aGVuIHVzaW5nIEdvb2dsZSBNb2NrLgorCitZb3UgY2FuIGFsc28gZWFzaWx5IGNvbmZpZ3VyZSBHb29nbGUgTW9jayB0byB3b3JrIHdpdGggYW5vdGhlciB0ZXN0aW5nCitmcmFtZXdvcmssIGFsdGhvdWdoIGl0IHdpbGwgc3RpbGwgbmVlZCBHb29nbGUgVGVzdC4gIFBsZWFzZSByZWFkCitbIlVzaW5nX0dvb2dsZV9Nb2NrX3dpdGhfQW55X1Rlc3RpbmdfRnJhbWV3b3JrIl0oCisgICAgZG9jcy9Gb3JEdW1taWVzLm1kI1VzaW5nX0dvb2dsZV9Nb2NrX3dpdGhfQW55X1Rlc3RpbmdfRnJhbWV3b3JrKQorZm9yIGluc3RydWN0aW9ucy4KKworR29vZ2xlIE1vY2sgZGVwZW5kcyBvbiBhZHZhbmNlZCBDKysgZmVhdHVyZXMgYW5kIHRodXMgcmVxdWlyZXMgYSBtb3JlCittb2Rlcm4gY29tcGlsZXIuIFRoZSBmb2xsb3dpbmcgYXJlIG5lZWRlZCB0byB1c2UgR29vZ2xlIE1vY2s6CisKKyMjIyMgTGludXggUmVxdWlyZW1lbnRzICMjIyMKKworICAqIEdOVS1jb21wYXRpYmxlIE1ha2Ugb3IgImdtYWtlIgorICAqIFBPU0lYLXN0YW5kYXJkIHNoZWxsCisgICogUE9TSVgoLTIpIFJlZ3VsYXIgRXhwcmVzc2lvbnMgKHJlZ2V4LmgpCisgICogQysrOTgtc3RhbmRhcmQtY29tcGxpYW50IGNvbXBpbGVyIChlLmcuIEdDQyAzLjQgb3IgbmV3ZXIpCisKKyMjIyMgV2luZG93cyBSZXF1aXJlbWVudHMgIyMjIworCisgICogTWljcm9zb2Z0IFZpc3VhbCBDKysgOC4wIFNQMSBvciBuZXdlcgorCisjIyMjIE1hYyBPUyBYIFJlcXVpcmVtZW50cyAjIyMjCisKKyAgKiBNYWMgT1MgWCAxMC40IFRpZ2VyIG9yIG5ld2VyCisgICogRGV2ZWxvcGVyIFRvb2xzIEluc3RhbGxlZAorCisjIyMgUmVxdWlyZW1lbnRzIGZvciBDb250cmlidXRvcnMgIyMjCisKK1dlIHdlbGNvbWUgcGF0Y2hlcy4gSWYgeW91IHBsYW4gdG8gY29udHJpYnV0ZSBhIHBhdGNoLCB5b3UgbmVlZCB0bworYnVpbGQgR29vZ2xlIE1vY2sgYW5kIGl0cyB0ZXN0cywgd2hpY2ggaGFzIGZ1cnRoZXIgcmVxdWlyZW1lbnRzOgorCisgICogQXV0b21ha2UgdmVyc2lvbiAxLjkgb3IgbmV3ZXIKKyAgKiBBdXRvY29uZiB2ZXJzaW9uIDIuNTkgb3IgbmV3ZXIKKyAgKiBMaWJ0b29sIC8gTGlidG9vbGl6ZQorICAqIFB5dGhvbiB2ZXJzaW9uIDIuMyBvciBuZXdlciAoZm9yIHJ1bm5pbmcgc29tZSBvZiB0aGUgdGVzdHMgYW5kCisgICAgcmUtZ2VuZXJhdGluZyBjZXJ0YWluIHNvdXJjZSBmaWxlcyBmcm9tIHRlbXBsYXRlcykKKworIyMjIEJ1aWxkaW5nIEdvb2dsZSBNb2NrICMjIworCisjIyMjIFByZXBhcmluZyB0byBCdWlsZCAoVW5peCBvbmx5KSAjIyMjCisKK0lmIHlvdSBhcmUgdXNpbmcgYSBVbml4IHN5c3RlbSBhbmQgcGxhbiB0byB1c2UgdGhlIEdOVSBBdXRvdG9vbHMgYnVpbGQKK3N5c3RlbSB0byBidWlsZCBHb29nbGUgTW9jayAoZGVzY3JpYmVkIGJlbG93KSwgeW91J2xsIG5lZWQgdG8KK2NvbmZpZ3VyZSBpdCBub3cuCisKK1RvIHByZXBhcmUgdGhlIEF1dG90b29scyBidWlsZCBzeXN0ZW06CisKKyAgICBjZCBnb29nbGVtb2NrCisgICAgYXV0b3JlY29uZiAtZnZpCisKK1RvIGJ1aWxkIEdvb2dsZSBNb2NrIGFuZCB5b3VyIHRlc3RzIHRoYXQgdXNlIGl0LCB5b3UgbmVlZCB0byB0ZWxsIHlvdXIKK2J1aWxkIHN5c3RlbSB3aGVyZSB0byBmaW5kIGl0cyBoZWFkZXJzIGFuZCBzb3VyY2UgZmlsZXMuICBUaGUgZXhhY3QKK3dheSB0byBkbyBpdCBkZXBlbmRzIG9uIHdoaWNoIGJ1aWxkIHN5c3RlbSB5b3UgdXNlLCBhbmQgaXMgdXN1YWxseQorc3RyYWlnaHRmb3J3YXJkLgorCitUaGlzIHNlY3Rpb24gc2hvd3MgaG93IHlvdSBjYW4gaW50ZWdyYXRlIEdvb2dsZSBNb2NrIGludG8geW91cgorZXhpc3RpbmcgYnVpbGQgc3lzdGVtLgorCitTdXBwb3NlIHlvdSBwdXQgR29vZ2xlIE1vY2sgaW4gZGlyZWN0b3J5IGAke0dNT0NLX0RJUn1gIGFuZCBHb29nbGUgVGVzdAoraW4gYCR7R1RFU1RfRElSfWAgKHRoZSBsYXR0ZXIgaXMgYCR7R01PQ0tfRElSfS9ndGVzdGAgYnkgZGVmYXVsdCkuICBUbworYnVpbGQgR29vZ2xlIE1vY2ssIGNyZWF0ZSBhIGxpYnJhcnkgYnVpbGQgdGFyZ2V0IChvciBhIHByb2plY3QgYXMKK2NhbGxlZCBieSBWaXN1YWwgU3R1ZGlvIGFuZCBYY29kZSkgdG8gY29tcGlsZQorCisgICAgJHtHVEVTVF9ESVJ9L3NyYy9ndGVzdC1hbGwuY2MgYW5kICR7R01PQ0tfRElSfS9zcmMvZ21vY2stYWxsLmNjCisKK3dpdGgKKworICAgICR7R1RFU1RfRElSfS9pbmNsdWRlIGFuZCAke0dNT0NLX0RJUn0vaW5jbHVkZQorCitpbiB0aGUgc3lzdGVtIGhlYWRlciBzZWFyY2ggcGF0aCwgYW5kCisKKyAgICAke0dURVNUX0RJUn0gYW5kICR7R01PQ0tfRElSfQorCitpbiB0aGUgbm9ybWFsIGhlYWRlciBzZWFyY2ggcGF0aC4gIEFzc3VtaW5nIGEgTGludXgtbGlrZSBzeXN0ZW0gYW5kIGdjYywKK3NvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgd2lsbCBkbzoKKworICAgIGcrKyAtaXN5c3RlbSAke0dURVNUX0RJUn0vaW5jbHVkZSAtSSR7R1RFU1RfRElSfSBcCisgICAgICAgIC1pc3lzdGVtICR7R01PQ0tfRElSfS9pbmNsdWRlIC1JJHtHTU9DS19ESVJ9IFwKKyAgICAgICAgLXB0aHJlYWQgLWMgJHtHVEVTVF9ESVJ9L3NyYy9ndGVzdC1hbGwuY2MKKyAgICBnKysgLWlzeXN0ZW0gJHtHVEVTVF9ESVJ9L2luY2x1ZGUgLUkke0dURVNUX0RJUn0gXAorICAgICAgICAtaXN5c3RlbSAke0dNT0NLX0RJUn0vaW5jbHVkZSAtSSR7R01PQ0tfRElSfSBcCisgICAgICAgIC1wdGhyZWFkIC1jICR7R01PQ0tfRElSfS9zcmMvZ21vY2stYWxsLmNjCisgICAgYXIgLXJ2IGxpYmdtb2NrLmEgZ3Rlc3QtYWxsLm8gZ21vY2stYWxsLm8KKworKFdlIG5lZWQgLXB0aHJlYWQgYXMgR29vZ2xlIFRlc3QgYW5kIEdvb2dsZSBNb2NrIHVzZSB0aHJlYWRzLikKKworTmV4dCwgeW91IHNob3VsZCBjb21waWxlIHlvdXIgdGVzdCBzb3VyY2UgZmlsZSB3aXRoCiske0dURVNUXF9ESVJ9L2luY2x1ZGUgYW5kICR7R01PQ0tcX0RJUn0vaW5jbHVkZSBpbiB0aGUgaGVhZGVyIHNlYXJjaAorcGF0aCwgYW5kIGxpbmsgaXQgd2l0aCBnbW9jayBhbmQgYW55IG90aGVyIG5lY2Vzc2FyeSBsaWJyYXJpZXM6CisKKyAgICBnKysgLWlzeXN0ZW0gJHtHVEVTVF9ESVJ9L2luY2x1ZGUgLWlzeXN0ZW0gJHtHTU9DS19ESVJ9L2luY2x1ZGUgXAorICAgICAgICAtcHRocmVhZCBwYXRoL3RvL3lvdXJfdGVzdC5jYyBsaWJnbW9jay5hIC1vIHlvdXJfdGVzdAorCitBcyBhbiBleGFtcGxlLCB0aGUgbWFrZS8gZGlyZWN0b3J5IGNvbnRhaW5zIGEgTWFrZWZpbGUgdGhhdCB5b3UgY2FuCit1c2UgdG8gYnVpbGQgR29vZ2xlIE1vY2sgb24gc3lzdGVtcyB3aGVyZSBHTlUgbWFrZSBpcyBhdmFpbGFibGUKKyhlLmcuIExpbnV4LCBNYWMgT1MgWCwgYW5kIEN5Z3dpbikuICBJdCBkb2Vzbid0IHRyeSB0byBidWlsZCBHb29nbGUKK01vY2sncyBvd24gdGVzdHMuICBJbnN0ZWFkLCBpdCBqdXN0IGJ1aWxkcyB0aGUgR29vZ2xlIE1vY2sgbGlicmFyeSBhbmQKK2Egc2FtcGxlIHRlc3QuICBZb3UgY2FuIHVzZSBpdCBhcyBhIHN0YXJ0aW5nIHBvaW50IGZvciB5b3VyIG93biBidWlsZAorc2NyaXB0LgorCitJZiB0aGUgZGVmYXVsdCBzZXR0aW5ncyBhcmUgY29ycmVjdCBmb3IgeW91ciBlbnZpcm9ubWVudCwgdGhlCitmb2xsb3dpbmcgY29tbWFuZHMgc2hvdWxkIHN1Y2NlZWQ6CisKKyAgICBjZCAke0dNT0NLX0RJUn0vbWFrZQorICAgIG1ha2UKKyAgICAuL2dtb2NrX3Rlc3QKKworSWYgeW91IHNlZSBlcnJvcnMsIHRyeSB0byB0d2VhayB0aGUgY29udGVudHMgb2YKK1ttYWtlL01ha2VmaWxlXShtYWtlL01ha2VmaWxlKSB0byBtYWtlIHRoZW0gZ28gYXdheS4KKworIyMjIFdpbmRvd3MgIyMjCisKK1RoZSBtc3ZjLzIwMDUgZGlyZWN0b3J5IGNvbnRhaW5zIFZDKysgMjAwNSBwcm9qZWN0cyBhbmQgdGhlIG1zdmMvMjAxMAorZGlyZWN0b3J5IGNvbnRhaW5zIFZDKysgMjAxMCBwcm9qZWN0cyBmb3IgYnVpbGRpbmcgR29vZ2xlIE1vY2sgYW5kCitzZWxlY3RlZCB0ZXN0cy4KKworQ2hhbmdlIHRvIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYW5kIHJ1biAibXNidWlsZCBnbW9jay5zbG4iIHRvCitidWlsZCB0aGUgbGlicmFyeSBhbmQgdGVzdHMgKG9yIG9wZW4gdGhlIGdtb2NrLnNsbiBpbiB0aGUgTVNWQyBJREUpLgorSWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIHByb2plY3QgdG8gdXNlIHdpdGggR29vZ2xlIE1vY2ssIHlvdSdsbAoraGF2ZSB0byBjb25maWd1cmUgaXQgdG8gdXNlIHRoZSBgZ21vY2tfY29uZmlnYCBwcm9wZXR5IHNoZWV0LiAgRm9yIHRoYXQ6CisKKyAqIE9wZW4gdGhlIFByb3BlcnR5IE1hbmFnZXIgd2luZG93IChWaWV3IHwgT3RoZXIgV2luZG93cyB8IFByb3BlcnR5IE1hbmFnZXIpCisgKiBSaWdodC1jbGljayBvbiB5b3VyIHByb2plY3QgYW5kIHNlbGVjdCAiQWRkIEV4aXN0aW5nIFByb3BlcnR5IFNoZWV0Li4uIgorICogTmF2aWdhdGUgdG8gYGdtb2NrX2NvbmZpZy52c3Byb3BzYCBvciBgZ21vY2tfY29uZmlnLnByb3BzYCBhbmQgc2VsZWN0IGl0LgorICogSW4gUHJvamVjdCBQcm9wZXJ0aWVzIHwgQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIHwgR2VuZXJhbCB8IEFkZGl0aW9uYWwKKyAgIEluY2x1ZGUgRGlyZWN0b3JpZXMsIHR5cGUgPHBhdGggdG8gR29vZ2xlIE1vY2s+L2luY2x1ZGUuCisKKyMjIyBUd2Vha2luZyBHb29nbGUgTW9jayAjIyMKKworR29vZ2xlIE1vY2sgY2FuIGJlIHVzZWQgaW4gZGl2ZXJzZSBlbnZpcm9ubWVudHMuICBUaGUgZGVmYXVsdAorY29uZmlndXJhdGlvbiBtYXkgbm90IHdvcmsgKG9yIG1heSBub3Qgd29yayB3ZWxsKSBvdXQgb2YgdGhlIGJveCBpbgorc29tZSBlbnZpcm9ubWVudHMuICBIb3dldmVyLCB5b3UgY2FuIGVhc2lseSB0d2VhayBHb29nbGUgTW9jayBieQorZGVmaW5pbmcgY29udHJvbCBtYWNyb3Mgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4gIEdlbmVyYWxseSwKK3RoZXNlIG1hY3JvcyBhcmUgbmFtZWQgbGlrZSBgR1RFU1RfWFlaYCBhbmQgeW91IGRlZmluZSB0aGVtIHRvIGVpdGhlciAxCitvciAwIHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgY2VydGFpbiBmZWF0dXJlLgorCitXZSBsaXN0IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBtYWNyb3MgYmVsb3cuICBGb3IgYSBjb21wbGV0ZSBsaXN0LAorc2VlIGZpbGUgWyR7R1RFU1RcX0RJUn0vaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmhdKAorLi4vZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCkuCisKKyMjIyBDaG9vc2luZyBhIFRSMSBUdXBsZSBMaWJyYXJ5ICMjIworCitHb29nbGUgTW9jayB1c2VzIHRoZSBDKysgVGVjaG5pY2FsIFJlcG9ydCAxIChUUjEpIHR1cGxlIGxpYnJhcnkKK2hlYXZpbHkuICBVbmZvcnR1bmF0ZWx5IFRSMSB0dXBsZSBpcyBub3QgeWV0IHdpZGVseSBhdmFpbGFibGUgd2l0aCBhbGwKK2NvbXBpbGVycy4gIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBHb29nbGUgVGVzdCAxLjQuMCsgaW1wbGVtZW50cyBhCitzdWJzZXQgb2YgVFIxIHR1cGxlIHRoYXQncyBlbm91Z2ggZm9yIEdvb2dsZSBNb2NrJ3MgbmVlZC4gIEdvb2dsZSBNb2NrCit3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoYXQgaW1wbGVtZW50YXRpb24gd2hlbiB0aGUgY29tcGlsZXIgZG9lc24ndAorcHJvdmlkZSBUUjEgdHVwbGUuCisKK1VzdWFsbHkgeW91IGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB3aGljaCB0dXBsZSBsaWJyYXJ5IEdvb2dsZSBUZXN0CithbmQgR29vZ2xlIE1vY2sgdXNlLiAgSG93ZXZlciwgaWYgeW91ciBwcm9qZWN0IGFscmVhZHkgdXNlcyBUUjEgdHVwbGUsCit5b3UgbmVlZCB0byB0ZWxsIEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jayB0byB1c2UgdGhlIHNhbWUgVFIxIHR1cGxlCitsaWJyYXJ5IHRoZSByZXN0IG9mIHlvdXIgcHJvamVjdCB1c2VzLCBvciB0aGUgdHdvIHR1cGxlCitpbXBsZW1lbnRhdGlvbnMgd2lsbCBjbGFzaC4gIFRvIGRvIHRoYXQsIGFkZAorCisgICAgLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0wCisKK3RvIHRoZSBjb21waWxlciBmbGFncyB3aGlsZSBjb21waWxpbmcgR29vZ2xlIFRlc3QsIEdvb2dsZSBNb2NrLCBhbmQKK3lvdXIgdGVzdHMuICBJZiB5b3Ugd2FudCB0byBmb3JjZSBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2sgdG8gdXNlCit0aGVpciBvd24gdHVwbGUgbGlicmFyeSwganVzdCBhZGQKKworICAgIC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MQorCit0byB0aGUgY29tcGlsZXIgZmxhZ3MgaW5zdGVhZC4KKworSWYgeW91IHdhbnQgdG8gdXNlIEJvb3N0J3MgVFIxIHR1cGxlIGxpYnJhcnkgd2l0aCBHb29nbGUgTW9jaywgcGxlYXNlCityZWZlciB0byB0aGUgQm9vc3Qgd2Vic2l0ZSAoaHR0cDovL3d3dy5ib29zdC5vcmcvKSBmb3IgaG93IHRvIG9idGFpbgoraXQgYW5kIHNldCBpdCB1cC4KKworIyMjIEFzIGEgU2hhcmVkIExpYnJhcnkgKERMTCkgIyMjCisKK0dvb2dsZSBNb2NrIGlzIGNvbXBhY3QsIHNvIG1vc3QgdXNlcnMgY2FuIGJ1aWxkIGFuZCBsaW5rIGl0IGFzIGEgc3RhdGljCitsaWJyYXJ5IGZvciB0aGUgc2ltcGxpY2l0eS4gIEdvb2dsZSBNb2NrIGNhbiBiZSB1c2VkIGFzIGEgRExMLCBidXQgdGhlCitzYW1lIERMTCBtdXN0IGNvbnRhaW4gR29vZ2xlIFRlc3QgYXMgd2VsbC4gIFNlZQorW0dvb2dsZSBUZXN0J3MgUkVBRE1FXVtndGVzdF9yZWFkbWVdCitmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBzZXQgdXAgbmVjZXNzYXJ5IGNvbXBpbGVyIHNldHRpbmdzLgorCisjIyMgVHdlYWtpbmcgR29vZ2xlIE1vY2sgIyMjCisKK01vc3Qgb2YgR29vZ2xlIFRlc3QncyBjb250cm9sIG1hY3JvcyBhcHBseSB0byBHb29nbGUgTW9jayBhcyB3ZWxsLgorUGxlYXNlIHNlZSBbR29vZ2xlIFRlc3QncyBSRUFETUVdW2d0ZXN0X3JlYWRtZV0gZm9yIGhvdyB0byB0d2VhayB0aGVtLgorCisjIyMgVXBncmFkaW5nIGZyb20gYW4gRWFybGllciBWZXJzaW9uICMjIworCitXZSBzdHJpdmUgdG8ga2VlcCBHb29nbGUgTW9jayByZWxlYXNlcyBiYWNrd2FyZCBjb21wYXRpYmxlLgorU29tZXRpbWVzLCB0aG91Z2gsIHdlIGhhdmUgdG8gbWFrZSBzb21lIGJyZWFraW5nIGNoYW5nZXMgZm9yIHRoZQordXNlcnMnIGxvbmctdGVybSBiZW5lZml0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgd2hhdCB5b3UnbGwgbmVlZCB0bworZG8gaWYgeW91IGFyZSB1cGdyYWRpbmcgZnJvbSBhbiBlYXJsaWVyIHZlcnNpb24gb2YgR29vZ2xlIE1vY2suCisKKyMjIyMgVXBncmFkaW5nIGZyb20gMS4xLjAgb3IgRWFybGllciAjIyMjCisKK1lvdSBtYXkgbmVlZCB0byBleHBsaWNpdGx5IGVuYWJsZSBvciBkaXNhYmxlIEdvb2dsZSBUZXN0J3Mgb3duIFRSMQordHVwbGUgbGlicmFyeS4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHNlY3Rpb24gIltDaG9vc2luZyBhIFRSMSBUdXBsZQorTGlicmFyeV0oLi4vZ29vZ2xldGVzdC8jY2hvb3NpbmctYS10cjEtdHVwbGUtbGlicmFyeSkiLgorCisjIyMjIFVwZ3JhZGluZyBmcm9tIDEuNC4wIG9yIEVhcmxpZXIgIyMjIworCitPbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIHB0aHJlYWQgbGlicmFyeSBpcyBhdmFpbGFibGUsIEdvb2dsZSBUZXN0IGFuZAorR29vZ2xlIE1vY2sgdXNlIGl0IGluIG9yZGVyIHRvIGJlIHRocmVhZC1zYWZlLiAgRm9yIHRoaXMgdG8gd29yaywgeW91CittYXkgbmVlZCB0byB0d2VhayB5b3VyIGNvbXBpbGVyIGFuZC9vciBsaW5rZXIgZmxhZ3MuICBQbGVhc2Ugc2VlIHRoZQorIltNdWx0aS10aHJlYWRlZCBUZXN0c10oLi4vZ29vZ2xldGVzdCNtdWx0aS10aHJlYWRlZC10ZXN0cworKSIgc2VjdGlvbiBpbiBmaWxlIEdvb2dsZSBUZXN0J3MgUkVBRE1FIGZvciB3aGF0IHlvdSBtYXkgbmVlZCB0byBkby4KKworSWYgeW91IGhhdmUgY3VzdG9tIG1hdGNoZXJzIGRlZmluZWQgdXNpbmcgYE1hdGNoZXJJbnRlcmZhY2VgIG9yCitgTWFrZVBvbHltb3JwaGljTWF0Y2hlcigpYCwgeW91J2xsIG5lZWQgdG8gdXBkYXRlIHRoZWlyIGRlZmluaXRpb25zIHRvCit1c2UgdGhlIG5ldyBtYXRjaGVyIEFQSSAoCitbbW9ub21vcnBoaWNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjV3JpdGluZ19OZXdfTW9ub21vcnBoaWNfTWF0Y2hlcnMpLAorW3BvbHltb3JwaGljXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI1dyaXRpbmdfTmV3X1BvbHltb3JwaGljX01hdGNoZXJzKSkuCitNYXRjaGVycyBkZWZpbmVkIHVzaW5nIGBNQVRDSEVSKClgIG9yIGBNQVRDSEVSX1AqKClgIGFyZW4ndCBhZmZlY3RlZC4KKworIyMjIERldmVsb3BpbmcgR29vZ2xlIE1vY2sgIyMjCisKK1RoaXMgc2VjdGlvbiBkaXNjdXNzZXMgaG93IHRvIG1ha2UgeW91ciBvd24gY2hhbmdlcyB0byBHb29nbGUgTW9jay4KKworIyMjIyBUZXN0aW5nIEdvb2dsZSBNb2NrIEl0c2VsZiAjIyMjCisKK1RvIG1ha2Ugc3VyZSB5b3VyIGNoYW5nZXMgd29yayBhcyBpbnRlbmRlZCBhbmQgZG9uJ3QgYnJlYWsgZXhpc3RpbmcKK2Z1bmN0aW9uYWxpdHksIHlvdSdsbCB3YW50IHRvIGNvbXBpbGUgYW5kIHJ1biBHb29nbGUgVGVzdCdzIG93biB0ZXN0cy4KK0ZvciB0aGF0IHlvdSdsbCBuZWVkIEF1dG90b29scy4gIEZpcnN0LCBtYWtlIHN1cmUgeW91IGhhdmUgZm9sbG93ZWQKK3RoZSBpbnN0cnVjdGlvbnMgYWJvdmUgdG8gY29uZmlndXJlIEdvb2dsZSBNb2NrLgorVGhlbiwgY3JlYXRlIGEgYnVpbGQgb3V0cHV0IGRpcmVjdG9yeSBhbmQgZW50ZXIgaXQuICBOZXh0LAorCisgICAgJHtHTU9DS19ESVJ9L2NvbmZpZ3VyZSAgIyB0cnkgLS1oZWxwIGZvciBtb3JlIGluZm8KKworT25jZSB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgY29uZmlndXJlZCBHb29nbGUgTW9jaywgdGhlIGJ1aWxkIHN0ZXBzIGFyZQorc3RhbmRhcmQgZm9yIEdOVS1zdHlsZSBPU1MgcGFja2FnZXMuCisKKyAgICBtYWtlICAgICAgICAjIFN0YW5kYXJkIG1ha2VmaWxlIGZvbGxvd2luZyBHTlUgY29udmVudGlvbnMKKyAgICBtYWtlIGNoZWNrICAjIEJ1aWxkcyBhbmQgcnVucyBhbGwgdGVzdHMgLSBhbGwgc2hvdWxkIHBhc3MuCisKK05vdGUgdGhhdCB3aGVuIGJ1aWxkaW5nIHlvdXIgcHJvamVjdCBhZ2FpbnN0IEdvb2dsZSBNb2NrLCB5b3UgYXJlIGJ1aWxkaW5nCithZ2FpbnN0IEdvb2dsZSBUZXN0IGFzIHdlbGwuICBUaGVyZSBpcyBubyBuZWVkIHRvIGNvbmZpZ3VyZSBHb29nbGUgVGVzdAorc2VwYXJhdGVseS4KKworIyMjIyBDb250cmlidXRpbmcgYSBQYXRjaCAjIyMjCisKK1dlIHdlbGNvbWUgcGF0Y2hlcy4KK1BsZWFzZSByZWFkIHRoZSBbRGV2ZWxvcGVyJ3MgR3VpZGVdKGRvY3MvRGV2R3VpZGUubWQpCitmb3IgaG93IHlvdSBjYW4gY29udHJpYnV0ZS4gSW4gcGFydGljdWxhciwgbWFrZSBzdXJlIHlvdSBoYXZlIHNpZ25lZAordGhlIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50LCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIGFjY2VwdCB0aGUKK3BhdGNoLgorCitIYXBweSB0ZXN0aW5nIQorCitbZ3Rlc3RfcmVhZG1lXTogLi4vZ29vZ2xldGVzdC9SRUFETUUubWQgImdvb2dsZXRlc3QiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svYnVpbGQtYXV4Ly5rZWVwIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2J1aWxkLWF1eC8ua2VlcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2J1aWxkLWF1eC8ua2VlcApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2NvbmZpZ3VyZS5hYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2OGQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9jb25maWd1cmUuYWMKQEAgLTAsMCArMSwxNDYgQEAKK200X2luY2x1ZGUoZ3Rlc3QvbTQvYWN4X3B0aHJlYWQubTQpCisKK0FDX0lOSVQoW0dvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcmtdLAorICAgICAgICBbMS43LjBdLAorICAgICAgICBbZ29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tXSwKKyAgICAgICAgW2dtb2NrXSkKKworIyBQcm92aWRlIHZhcmlvdXMgb3B0aW9ucyB0byBpbml0aWFsaXplIHRoZSBBdXRvY29uZiBhbmQgY29uZmlndXJlIHByb2Nlc3Nlcy4KK0FDX1BSRVJFUShbMi41OV0pCitBQ19DT05GSUdfU1JDRElSKFsuL0xJQ0VOU0VdKQorQUNfQ09ORklHX0FVWF9ESVIoW2J1aWxkLWF1eF0pCitBQ19DT05GSUdfSEVBREVSUyhbYnVpbGQtYXV4L2NvbmZpZy5oXSkKK0FDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGVdKQorQUNfQ09ORklHX0ZJTEVTKFtzY3JpcHRzL2dtb2NrLWNvbmZpZ10sIFtjaG1vZCAreCBzY3JpcHRzL2dtb2NrLWNvbmZpZ10pCisKKyMgSW5pdGlhbGl6ZSBBdXRvbWFrZSB3aXRoIHZhcmlvdXMgb3B0aW9ucy4gV2UgcmVxdWlyZSBhdCBsZWFzdCB2MS45LCBwcmV2ZW50CisjIHBlZGFudGljIGNvbXBsYWludHMgYWJvdXQgcGFja2FnZSBmaWxlcywgYW5kIGVuYWJsZSB2YXJpb3VzIGRpc3RyaWJ1dGlvbgorIyB0YXJnZXRzLgorQU1fSU5JVF9BVVRPTUFLRShbMS45IGRpc3QtYnppcDIgZGlzdC16aXAgZm9yZWlnbiBzdWJkaXItb2JqZWN0c10pCisKKyMgQ2hlY2sgZm9yIHByb2dyYW1zIHVzZWQgaW4gYnVpbGRpbmcgR29vZ2xlIFRlc3QuCitBQ19QUk9HX0NDCitBQ19QUk9HX0NYWAorQUNfTEFORyhbQysrXSkKK0FDX1BST0dfTElCVE9PTAorCisjIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pOiBDdXJyZW50bHkgd2UgYXJlbid0IHJ1bm5pbmcgdGhlIFB5dGhvbiB0ZXN0cworIyBhZ2FpbnN0IHRoZSBpbnRlcnByZXRlciBkZXRlY3RlZCBieSBBTV9QQVRIX1BZVEhPTiwgYW5kIHNvIHdlIGNvbmRpdGlvbgorIyBIQVZFX1BZVEhPTiBieSByZXF1aXJpbmcgInB5dGhvbiIgdG8gYmUgaW4gdGhlIFBBVEgsIGFuZCB0aGF0IGludGVycHJldGVyJ3MKKyMgdmVyc2lvbiB0byBiZSA+PSAyLjMuIFRoaXMgd2lsbCBhbGxvdyB0aGUgc2NyaXB0cyB0byB1c2UgYSAiL3Vzci9iaW4vZW52IgorIyBoYXNoYmFuZy4KK1BZVEhPTj0gICMgV2UgKmRvIG5vdCogYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHB5dGhvbiBpbnRlcnByZXRlcgorQUNfUEFUSF9QUk9HKFtQWVRIT05dLFtweXRob25dLFs6XSkKK0FTX0lGKFt0ZXN0ICIkUFlUSE9OIiAhPSAiOiJdLAorICAgICAgW0FNX1BZVEhPTl9DSEVDS19WRVJTSU9OKFskUFlUSE9OXSxbMi4zXSxbOl0sW1BZVEhPTj0iOiJdKV0pCitBTV9DT05ESVRJT05BTChbSEFWRV9QWVRIT05dLFt0ZXN0ICIkUFlUSE9OIiAhPSAiOiJdKQorCisjIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pIENoZWNrIGZvciB0aGUgbmVjZXNzYXJ5IHN5c3RlbSBoZWFkZXJzLgorCisjIENvbmZpZ3VyZSBwdGhyZWFkcy4KK0FDX0FSR19XSVRIKFtwdGhyZWFkc10sCisgICAgICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1wdGhyZWFkc10sCisgICAgICAgICAgICAgICBbdXNlIHB0aHJlYWRzIChkZWZhdWx0IGlzIHllcyldKV0sCisgICAgICAgICAgICBbd2l0aF9wdGhyZWFkcz0kd2l0aHZhbF0sCisgICAgICAgICAgICBbd2l0aF9wdGhyZWFkcz1jaGVja10pCisKK2hhdmVfcHRocmVhZHM9bm8KK0FTX0lGKFt0ZXN0ICJ4JHdpdGhfcHRocmVhZHMiICE9ICJ4bm8iXSwKKyAgICAgIFtBQ1hfUFRIUkVBRCgKKyAgICAgICAgW10sCisgICAgICAgIFtBU19JRihbdGVzdCAieCR3aXRoX3B0aHJlYWRzIiAhPSAieGNoZWNrIl0sCisgICAgICAgICAgICAgICBbQUNfTVNHX0ZBSUxVUkUoCisgICAgICAgICAgICAgICAgIFstLXdpdGgtcHRocmVhZHMgd2FzIHNwZWNpZmllZCwgYnV0IHVuYWJsZSB0byBiZSB1c2VkXSldKV0pCisgICAgICAgaGF2ZV9wdGhyZWFkcz0iJGFjeF9wdGhyZWFkX29rIl0pCitBTV9DT05ESVRJT05BTChbSEFWRV9QVEhSRUFEU10sW3Rlc3QgIngkaGF2ZV9wdGhyZWFkcyIgPT0gInh5ZXMiXSkKK0FDX1NVQlNUKFBUSFJFQURfQ0ZMQUdTKQorQUNfU1VCU1QoUFRIUkVBRF9MSUJTKQorCisjIEdvb2dsZU1vY2sgY3VycmVudGx5IGhhcyBoYXJkIGRlcGVuZGVuY2llcyB1cG9uIEdvb2dsZVRlc3QgYWJvdmUgYW5kIGJleW9uZAorIyBydW5uaW5nIGl0cyBvd24gdGVzdCBzdWl0ZSwgc28gd2UgYm90aCBwcm92aWRlIG91ciBvd24gdmVyc2lvbiBpbgorIyBhIHN1YmRpcmVjdG9yeSBhbmQgcHJvdmlkZSBzb21lIGxvZ2ljIHRvIHVzZSBhIGN1c3RvbSB2ZXJzaW9uIG9yIGEgc3lzdGVtCisjIGluc3RhbGxlZCB2ZXJzaW9uLgorQUNfQVJHX1dJVEgoW2d0ZXN0XSwKKyAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWd0ZXN0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3BlY2lmaWVzIGhvdyB0byBmaW5kIHRoZSBndGVzdCBwYWNrYWdlLiBJZiBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGluc3RhbGxlZCBndGVzdCB3aWxsIGJlIHVzZWQgaWYgcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYW4gaW50ZXJuYWwgdmVyc2lvbiBidWlsdCBvdGhlcndpc2UuIElmIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoIGlzIHByb3ZpZGVkLCB0aGUgZ3Rlc3QgYnVpbHQgb3IgaW5zdGFsbGVkIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBwcmVmaXggd2lsbCBiZSB1c2VkLl0pXSwKKyAgICAgICAgICAgIFtdLAorICAgICAgICAgICAgW3dpdGhfZ3Rlc3Q9eWVzXSkKK0FDX0FSR19FTkFCTEUoW2V4dGVybmFsLWd0ZXN0XSwKKyAgICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtZXh0ZXJuYWwtZ3Rlc3RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGVzIGFueSBkZXRlY3Rpb24gb3IgdXNlIG9mIGEgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQgb3IgdXNlciBwcm92aWRlZCBndGVzdC4gQW55IG9wdGlvbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0td2l0aC1ndGVzdCcgaXMgaWdub3JlZC4gKERlZmF1bHQgaXMgZW5hYmxlZC4pXSkKKyAgICAgICAgICAgICAgXSwgW10sIFtlbmFibGVfZXh0ZXJuYWxfZ3Rlc3Q9eWVzXSkKK0FTX0lGKFt0ZXN0ICJ4JHdpdGhfZ3Rlc3QiID09ICJ4bm8iXSwKKyAgICAgIFtBQ19NU0dfRVJST1IoW2RubAorU3VwcG9ydCBmb3IgR29vZ2xlVGVzdCB3YXMgZXhwbGljaXRseSBkaXNhYmxlZC4gQ3VycmVudGx5IEdvb2dsZU1vY2sgaGFzIGEgaGFyZAorZGVwZW5kZW5jeSB1cG9uIEdvb2dsZVRlc3QgdG8gYnVpbGQsIHBsZWFzZSBwcm92aWRlIGEgdmVyc2lvbiwgb3IgYWxsb3cKK0dvb2dsZU1vY2sgdG8gdXNlIGFueSBpbnN0YWxsZWQgdmVyc2lvbiBhbmQgZmFsbCBiYWNrIHVwb24gaXRzIGludGVybmFsCit2ZXJzaW9uLl0pXSkKKworIyBTZXR1cCB2YXJpb3VzIEdURVNUIHZhcmlhYmxlcy4gVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IFdoZW4gdGhlc2UgYXJlCisjIHVzZWQgYmVsb3csIHRoZXkgc2hvdWxkIGJlIHVzZWQgc3VjaCB0aGF0IGFueSBwcmUtZXhpc3RpbmcgdmFsdWVzIGFsd2F5cworIyB0cnVtcCB2YWx1ZXMgd2Ugc2V0IHRoZW0gdG8sIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCB0byBzZWxlY3RpdmVseSBvdmVycmlkZQorIyBkZXRhaWxzIG9mIHRoZSBkZXRlY3Rpb24gcHJvY2Vzcy4KK0FDX0FSR19WQVIoW0dURVNUX0NPTkZJR10sCisgICAgICAgICAgIFtUaGUgZXhhY3QgcGF0aCBvZiBHb29nbGUgVGVzdCdzICdndGVzdC1jb25maWcnIHNjcmlwdC5dKQorQUNfQVJHX1ZBUihbR1RFU1RfQ1BQRkxBR1NdLAorICAgICAgICAgICBbQy1saWtlIHByZXByb2Nlc3NvciBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKK0FDX0FSR19WQVIoW0dURVNUX0NYWEZMQUdTXSwKKyAgICAgICAgICAgW0MrKyBjb21waWxlIGZsYWdzIGZvciBHb29nbGUgVGVzdC5dKQorQUNfQVJHX1ZBUihbR1RFU1RfTERGTEFHU10sCisgICAgICAgICAgIFtMaW5rZXIgcGF0aCBhbmQgb3B0aW9uIGZsYWdzIGZvciBHb29nbGUgVGVzdC5dKQorQUNfQVJHX1ZBUihbR1RFU1RfTElCU10sCisgICAgICAgICAgIFtMaWJyYXJ5IGxpbmtpbmcgZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9WRVJTSU9OXSwKKyAgICAgICAgICAgW1RoZSB2ZXJzaW9uIG9mIEdvb2dsZSBUZXN0IGF2YWlsYWJsZS5dKQorSEFWRV9CVUlMVF9HVEVTVD0ibm8iCisKK0dURVNUX01JTl9WRVJTSU9OPSIxLjcuMCIKKworQVNfSUYoW3Rlc3QgIngke2VuYWJsZV9leHRlcm5hbF9ndGVzdH0iID0gInh5ZXMiXSwKKyAgICAgIFsjIEJlZ2luIGZpbGxpbmcgaW4gdmFyaWFibGVzIGFzIHdlIGFyZSBhYmxlLgorICAgICAgQVNfSUYoW3Rlc3QgIngke3dpdGhfZ3Rlc3R9IiAhPSAieHllcyJdLAorICAgICAgICAgICAgW0FTX0lGKFt0ZXN0IC14ICIke3dpdGhfZ3Rlc3R9L3NjcmlwdHMvZ3Rlc3QtY29uZmlnIl0sCisgICAgICAgICAgICAgICAgICAgW0dURVNUX0NPTkZJRz0iJHt3aXRoX2d0ZXN0fS9zY3JpcHRzL2d0ZXN0LWNvbmZpZyJdLAorICAgICAgICAgICAgICAgICAgIFtHVEVTVF9DT05GSUc9IiR7d2l0aF9ndGVzdH0vYmluL2d0ZXN0LWNvbmZpZyJdKQorICAgICAgICAgICAgQVNfSUYoW3Rlc3QgLXggIiR7R1RFU1RfQ09ORklHfSJdLCBbXSwKKyAgICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW2RubAorVW5hYmxlIHRvIGxvY2F0ZSBlaXRoZXIgYSBidWlsdCBvciBpbnN0YWxsZWQgR29vZ2xlIFRlc3QgYXQgJyR7d2l0aF9ndGVzdH0nLl0pCisgICAgICAgICAgICAgICAgICBdKV0pCisKKyAgICAgIEFTX0lGKFt0ZXN0IC14ICIke0dURVNUX0NPTkZJR30iXSwgW10sCisgICAgICAgICAgICBbQUNfUEFUSF9QUk9HKFtHVEVTVF9DT05GSUddLCBbZ3Rlc3QtY29uZmlnXSldKQorICAgICAgQVNfSUYoW3Rlc3QgLXggIiR7R1RFU1RfQ09ORklHfSJdLAorICAgICAgICAgICAgW0FDX01TR19DSEVDS0lORyhbZm9yIEdvb2dsZSBUZXN0IHZlcnNpb24gPj0gJHtHVEVTVF9NSU5fVkVSU0lPTn1dKQorICAgICAgICAgICAgQVNfSUYoWyR7R1RFU1RfQ09ORklHfSAtLW1pbi12ZXJzaW9uPSR7R1RFU1RfTUlOX1ZFUlNJT059XSwKKyAgICAgICAgICAgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICAgICAgSEFWRV9CVUlMVF9HVEVTVD0ieWVzIl0sCisgICAgICAgICAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pXSldKQorCitBU19JRihbdGVzdCAieCR7SEFWRV9CVUlMVF9HVEVTVH0iID0gInh5ZXMiXSwKKyAgICAgIFtHVEVTVF9DUFBGTEFHUz1gJHtHVEVTVF9DT05GSUd9IC0tY3BwZmxhZ3NgCisgICAgICBHVEVTVF9DWFhGTEFHUz1gJHtHVEVTVF9DT05GSUd9IC0tY3h4ZmxhZ3NgCisgICAgICBHVEVTVF9MREZMQUdTPWAke0dURVNUX0NPTkZJR30gLS1sZGZsYWdzYAorICAgICAgR1RFU1RfTElCUz1gJHtHVEVTVF9DT05GSUd9IC0tbGlic2AKKyAgICAgIEdURVNUX1ZFUlNJT049YCR7R1RFU1RfQ09ORklHfSAtLXZlcnNpb25gXSwKKyAgICAgIFtBQ19DT05GSUdfU1VCRElSUyhbZ3Rlc3RdKQorICAgICAgIyBHVEVTVF9DT05GSUcgbmVlZHMgdG8gYmUgZXhlY3V0YWJsZSBib3RoIGluIGEgTWFrZWZpbGUgZW52aXJvbm1vbnQgYW5kCisgICAgICAjIGluIGEgc2hlbGwgc2NyaXB0IGVudmlyb25tZW50LCBzbyByZXNvbHZlIGFuIGFic29sdXRlIHBhdGggZm9yIGl0IGhlcmUuCisgICAgICBHVEVTVF9DT05GSUc9ImBwd2QgLVBgL2d0ZXN0L3NjcmlwdHMvZ3Rlc3QtY29uZmlnIgorICAgICAgR1RFU1RfQ1BQRkxBR1M9Jy1JJCh0b3Bfc3JjZGlyKS9ndGVzdC9pbmNsdWRlJworICAgICAgR1RFU1RfQ1hYRkxBR1M9Jy1nJworICAgICAgR1RFU1RfTERGTEFHUz0nJworICAgICAgR1RFU1RfTElCUz0nJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdC5sYScKKyAgICAgIEdURVNUX1ZFUlNJT049IiR7R1RFU1RfTUlOX1ZFUlNJT059Il0pCisKKyMgVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSkgQ2hlY2sgdGhlIHR5cGVzLCBzdHJ1Y3R1cmVzLCBhbmQgb3RoZXIgY29tcGlsZXIKKyMgYW5kIGFyY2hpdGVjdHVyZSBjaGFyYWN0ZXJpc3RpY3MuCisKKyMgT3V0cHV0IHRoZSBnZW5lcmF0ZWQgZmlsZXMuIE5vIGZ1cnRoZXIgYXV0b2NvbmYgbWFjcm9zIG1heSBiZSB1c2VkLgorQUNfT1VUUFVUCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9DaGVhdFNoZWV0Lm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvQ2hlYXRTaGVldC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYwMWIxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvQ2hlYXRTaGVldC5tZApAQCAtMCwwICsxLDU2MiBAQAorCisKKyMgRGVmaW5pbmcgYSBNb2NrIENsYXNzICMKKworIyMgTW9ja2luZyBhIE5vcm1hbCBDbGFzcyAjIworCitHaXZlbgorYGBgCitjbGFzcyBGb28geworICAuLi4KKyAgdmlydHVhbCB+Rm9vKCk7CisgIHZpcnR1YWwgaW50IEdldFNpemUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RyaW5nIERlc2NyaWJlKGNvbnN0IGNoYXIqIG5hbWUpID0gMDsKKyAgdmlydHVhbCBzdHJpbmcgRGVzY3JpYmUoaW50IHR5cGUpID0gMDsKKyAgdmlydHVhbCBib29sIFByb2Nlc3MoQmFyIGVsZW0sIGludCBjb3VudCkgPSAwOworfTsKK2BgYAorKG5vdGUgdGhhdCBgfkZvbygpYCAqKm11c3QqKiBiZSB2aXJ0dWFsKSB3ZSBjYW4gZGVmaW5lIGl0cyBtb2NrIGFzCitgYGAKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRTaXplLCBpbnQoKSk7CisgIE1PQ0tfTUVUSE9EMShEZXNjcmliZSwgc3RyaW5nKGNvbnN0IGNoYXIqIG5hbWUpKTsKKyAgTU9DS19NRVRIT0QxKERlc2NyaWJlLCBzdHJpbmcoaW50IHR5cGUpKTsKKyAgTU9DS19NRVRIT0QyKFByb2Nlc3MsIGJvb2woQmFyIGVsZW0sIGludCBjb3VudCkpOworfTsKK2BgYAorCitUbyBjcmVhdGUgYSAibmljZSIgbW9jayBvYmplY3Qgd2hpY2ggaWdub3JlcyBhbGwgdW5pbnRlcmVzdGluZyBjYWxscywKK29yIGEgInN0cmljdCIgbW9jayBvYmplY3QsIHdoaWNoIHRyZWF0cyB0aGVtIGFzIGZhaWx1cmVzOgorYGBgCitOaWNlTW9jazxNb2NrRm9vPiBuaWNlX2ZvbzsgICAgIC8vIFRoZSB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgTW9ja0Zvby4KK1N0cmljdE1vY2s8TW9ja0Zvbz4gc3RyaWN0X2ZvbzsgLy8gVGhlIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vLgorYGBgCisKKyMjIE1vY2tpbmcgYSBDbGFzcyBUZW1wbGF0ZSAjIworCitUbyBtb2NrCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtPgorY2xhc3MgU3RhY2tJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgflN0YWNrSW50ZXJmYWNlKCk7CisgIHZpcnR1YWwgaW50IEdldFNpemUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBQdXNoKGNvbnN0IEVsZW0mIHgpID0gMDsKK307CitgYGAKKyhub3RlIHRoYXQgYH5TdGFja0ludGVyZmFjZSgpYCAqKm11c3QqKiBiZSB2aXJ0dWFsKSBqdXN0IGFwcGVuZCBgX1RgIHRvIHRoZSBgTU9DS18qYCBtYWNyb3M6CitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtPgorY2xhc3MgTW9ja1N0YWNrIDogcHVibGljIFN0YWNrSW50ZXJmYWNlPEVsZW0+IHsKKyBwdWJsaWM6CisgIC4uLgorICBNT0NLX0NPTlNUX01FVEhPRDBfVChHZXRTaXplLCBpbnQoKSk7CisgIE1PQ0tfTUVUSE9EMV9UKFB1c2gsIHZvaWQoY29uc3QgRWxlbSYgeCkpOworfTsKK2BgYAorCisjIyBTcGVjaWZ5aW5nIENhbGxpbmcgQ29udmVudGlvbnMgZm9yIE1vY2sgRnVuY3Rpb25zICMjCisKK0lmIHlvdXIgbW9jayBmdW5jdGlvbiBkb2Vzbid0IHVzZSB0aGUgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24sIHlvdQorY2FuIHNwZWNpZnkgaXQgYnkgYXBwZW5kaW5nIGBfV0lUSF9DQUxMVFlQRWAgdG8gYW55IG9mIHRoZSBtYWNyb3MKK2Rlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgdHdvIHNlY3Rpb25zIGFuZCBzdXBwbHlpbmcgdGhlIGNhbGxpbmcKK2NvbnZlbnRpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBtYWNyby4gRm9yIGV4YW1wbGUsCitgYGAKKyAgTU9DS19NRVRIT0RfMV9XSVRIX0NBTExUWVBFKFNURE1FVEhPRENBTExUWVBFLCBGb28sIGJvb2woaW50IG4pKTsKKyAgTU9DS19DT05TVF9NRVRIT0QyX1dJVEhfQ0FMTFRZUEUoU1RETUVUSE9EQ0FMTFRZUEUsIEJhciwgaW50KGRvdWJsZSB4LCBkb3VibGUgeSkpOworYGBgCit3aGVyZSBgU1RETUVUSE9EQ0FMTFRZUEVgIGlzIGRlZmluZWQgYnkgYDxvYmpiYXNlLmg+YCBvbiBXaW5kb3dzLgorCisjIFVzaW5nIE1vY2tzIGluIFRlc3RzICMKKworVGhlIHR5cGljYWwgZmxvdyBpczoKKyAgMS4gSW1wb3J0IHRoZSBHb29nbGUgTW9jayBuYW1lcyB5b3UgbmVlZCB0byB1c2UuIEFsbCBHb29nbGUgTW9jayBuYW1lcyBhcmUgaW4gdGhlIGB0ZXN0aW5nYCBuYW1lc3BhY2UgdW5sZXNzIHRoZXkgYXJlIG1hY3JvcyBvciBvdGhlcndpc2Ugbm90ZWQuCisgIDEuIENyZWF0ZSB0aGUgbW9jayBvYmplY3RzLgorICAxLiBPcHRpb25hbGx5LCBzZXQgdGhlIGRlZmF1bHQgYWN0aW9ucyBvZiB0aGUgbW9jayBvYmplY3RzLgorICAxLiBTZXQgeW91ciBleHBlY3RhdGlvbnMgb24gdGhlIG1vY2sgb2JqZWN0cyAoSG93IHdpbGwgdGhleSBiZSBjYWxsZWQ/IFdoYXQgd2lsIHRoZXkgZG8/KS4KKyAgMS4gRXhlcmNpc2UgY29kZSB0aGF0IHVzZXMgdGhlIG1vY2sgb2JqZWN0czsgaWYgbmVjZXNzYXJ5LCBjaGVjayB0aGUgcmVzdWx0IHVzaW5nIFtHb29nbGUgVGVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvKSBhc3NlcnRpb25zLgorICAxLiBXaGVuIGEgbW9jayBvYmplY3RzIGlzIGRlc3RydWN0ZWQsIEdvb2dsZSBNb2NrIGF1dG9tYXRpY2FsbHkgdmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIGl0IGhhdmUgYmVlbiBzYXRpc2ZpZWQuCisKK0hlcmUgaXMgYW4gZXhhbXBsZToKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICMxCisKK1RFU1QoQmFyVGVzdCwgRG9lc1RoaXMpIHsKKyAgTW9ja0ZvbyBmb287ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzIKKworICBPTl9DQUxMKGZvbywgR2V0U2l6ZSgpKSAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjMworICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDEpKTsKKyAgLy8gLi4uIG90aGVyIGRlZmF1bHQgYWN0aW9ucyAuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIERlc2NyaWJlKDUpKSAgICAgICAgICAgICAgICAgICAvLyAjNAorICAgICAgLlRpbWVzKDMpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCJDYXRlZ29yeSA1IikpOworICAvLyAuLi4gb3RoZXIgZXhwZWN0YXRpb25zIC4uLgorCisgIEVYUEVDVF9FUSgiZ29vZCIsIE15UHJvZHVjdGlvbkZ1bmN0aW9uKCZmb28pKTsgIC8vICM1Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICM2CitgYGAKKworIyBTZXR0aW5nIERlZmF1bHQgQWN0aW9ucyAjCisKK0dvb2dsZSBNb2NrIGhhcyBhICoqYnVpbHQtaW4gZGVmYXVsdCBhY3Rpb24qKiBmb3IgYW55IGZ1bmN0aW9uIHRoYXQKK3JldHVybnMgYHZvaWRgLCBgYm9vbGAsIGEgbnVtZXJpYyB2YWx1ZSwgb3IgYSBwb2ludGVyLgorCitUbyBjdXN0b21pemUgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciBmdW5jdGlvbnMgd2l0aCByZXR1cm4gdHlwZSBgVGAgZ2xvYmFsbHk6CitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RGVmYXVsdFZhbHVlOworCisvLyBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIHJldHVybmVkLiBUIG11c3QgYmUgQ29weUNvbnN0cnVjdGlibGUuCitEZWZhdWx0VmFsdWU8VD46OlNldCh2YWx1ZSk7CisvLyBTZXRzIGEgZmFjdG9yeS4gV2lsbCBiZSBpbnZva2VkIG9uIGRlbWFuZC4gVCBtdXN0IGJlIE1vdmVDb25zdHJ1Y3RpYmxlLgorLy8gICBUIE1ha2VUKCk7CitEZWZhdWx0VmFsdWU8VD46OlNldEZhY3RvcnkoJk1ha2VUKTsKKy8vIC4uLiB1c2UgdGhlIG1vY2tzIC4uLgorLy8gUmVzZXRzIHRoZSBkZWZhdWx0IHZhbHVlLgorRGVmYXVsdFZhbHVlPFQ+OjpDbGVhcigpOworYGBgCisKK1RvIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBtZXRob2QsIHVzZSBgT05fQ0FMTCgpYDoKK2BgYAorT05fQ0FMTChtb2NrX29iamVjdCwgbWV0aG9kKG1hdGNoZXJzKSkKKyAgICAuV2l0aChtdWx0aV9hcmd1bWVudF9tYXRjaGVyKSAgPworICAgIC5XaWxsQnlEZWZhdWx0KGFjdGlvbik7CitgYGAKKworIyBTZXR0aW5nIEV4cGVjdGF0aW9ucyAjCisKK2BFWFBFQ1RfQ0FMTCgpYCBzZXRzICoqZXhwZWN0YXRpb25zKiogb24gYSBtb2NrIG1ldGhvZCAoSG93IHdpbGwgaXQgYmUKK2NhbGxlZD8gV2hhdCB3aWxsIGl0IGRvPyk6CitgYGAKK0VYUEVDVF9DQUxMKG1vY2tfb2JqZWN0LCBtZXRob2QobWF0Y2hlcnMpKQorICAgIC5XaXRoKG11bHRpX2FyZ3VtZW50X21hdGNoZXIpICA/CisgICAgLlRpbWVzKGNhcmRpbmFsaXR5KSAgICAgICAgICAgID8KKyAgICAuSW5TZXF1ZW5jZShzZXF1ZW5jZXMpICAgICAgICAgKgorICAgIC5BZnRlcihleHBlY3RhdGlvbnMpICAgICAgICAgICAqCisgICAgLldpbGxPbmNlKGFjdGlvbikgICAgICAgICAgICAgICoKKyAgICAuV2lsbFJlcGVhdGVkbHkoYWN0aW9uKSAgICAgICAgPworICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7ICAgICAgICA/CitgYGAKKworSWYgYFRpbWVzKClgIGlzIG9taXR0ZWQsIHRoZSBjYXJkaW5hbGl0eSBpcyBhc3N1bWVkIHRvIGJlOgorCisgICogYFRpbWVzKDEpYCB3aGVuIHRoZXJlIGlzIG5laXRoZXIgYFdpbGxPbmNlKClgIG5vciBgV2lsbFJlcGVhdGVkbHkoKWA7CisgICogYFRpbWVzKG4pYCB3aGVuIHRoZXJlIGFyZSBgbiBXaWxsT25jZSgpYHMgYnV0IG5vIGBXaWxsUmVwZWF0ZWRseSgpYCwgd2hlcmUgYG5gID49IDE7IG9yCisgICogYFRpbWVzKEF0TGVhc3QobikpYCB3aGVuIHRoZXJlIGFyZSBgbiBXaWxsT25jZSgpYHMgYW5kIGEgYFdpbGxSZXBlYXRlZGx5KClgLCB3aGVyZSBgbmAgPj0gMC4KKworQSBtZXRob2Qgd2l0aCBubyBgRVhQRUNUX0NBTEwoKWAgaXMgZnJlZSB0byBiZSBpbnZva2VkIF9hbnkgbnVtYmVyIG9mIHRpbWVzXywgYW5kIHRoZSBkZWZhdWx0IGFjdGlvbiB3aWxsIGJlIHRha2VuIGVhY2ggdGltZS4KKworIyBNYXRjaGVycyAjCisKK0EgKiptYXRjaGVyKiogbWF0Y2hlcyBhIF9zaW5nbGVfIGFyZ3VtZW50LiAgWW91IGNhbiB1c2UgaXQgaW5zaWRlCitgT05fQ0FMTCgpYCBvciBgRVhQRUNUX0NBTEwoKWAsIG9yIHVzZSBpdCB0byB2YWxpZGF0ZSBhIHZhbHVlCitkaXJlY3RseToKKworfCBgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpYCB8IEFzc2VydHMgdGhhdCBgdmFsdWVgIG1hdGNoZXMgYG1hdGNoZXJgLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAgfCBUaGUgc2FtZSBhcyBgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpYCwgZXhjZXB0IHRoYXQgaXQgZ2VuZXJhdGVzIGEgKipmYXRhbCoqIGZhaWx1cmUuIHwKKworQnVpbHQtaW4gbWF0Y2hlcnMgKHdoZXJlIGBhcmd1bWVudGAgaXMgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50KSBhcmUKK2RpdmlkZWQgaW50byBzZXZlcmFsIGNhdGVnb3JpZXM6CisKKyMjIFdpbGRjYXJkICMjCit8YF9gfGBhcmd1bWVudGAgY2FuIGJlIGFueSB2YWx1ZSBvZiB0aGUgY29ycmVjdCB0eXBlLnwKK3w6LS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBPHR5cGU+KClgIG9yIGBBbjx0eXBlPigpYHxgYXJndW1lbnRgIGNhbiBiZSBhbnkgdmFsdWUgb2YgdHlwZSBgdHlwZWAuICAgICB8CisKKyMjIEdlbmVyaWMgQ29tcGFyaXNvbiAjIworCit8YEVxKHZhbHVlKWAgb3IgYHZhbHVlYHxgYXJndW1lbnQgPT0gdmFsdWVgfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgR2UodmFsdWUpYCAgICAgICAgICAgfGBhcmd1bWVudCA+PSB2YWx1ZWB8Cit8YEd0KHZhbHVlKWAgICAgICAgICAgIHxgYXJndW1lbnQgPiB2YWx1ZWAgfAorfGBMZSh2YWx1ZSlgICAgICAgICAgICB8YGFyZ3VtZW50IDw9IHZhbHVlYHwKK3xgTHQodmFsdWUpYCAgICAgICAgICAgfGBhcmd1bWVudCA8IHZhbHVlYCB8Cit8YE5lKHZhbHVlKWAgICAgICAgICAgIHxgYXJndW1lbnQgIT0gdmFsdWVgfAorfGBJc051bGwoKWAgICAgICAgICAgICB8YGFyZ3VtZW50YCBpcyBhIGBOVUxMYCBwb2ludGVyIChyYXcgb3Igc21hcnQpLnwKK3xgTm90TnVsbCgpYCAgICAgICAgICAgfGBhcmd1bWVudGAgaXMgYSBub24tbnVsbCBwb2ludGVyIChyYXcgb3Igc21hcnQpLnwKK3xgUmVmKHZhcmlhYmxlKWAgICAgICAgfGBhcmd1bWVudGAgaXMgYSByZWZlcmVuY2UgdG8gYHZhcmlhYmxlYC58Cit8YFR5cGVkRXE8dHlwZT4odmFsdWUpYHxgYXJndW1lbnRgIGhhcyB0eXBlIGB0eXBlYCBhbmQgaXMgZXF1YWwgdG8gYHZhbHVlYC4gWW91IG1heSBuZWVkIHRvIHVzZSB0aGlzIGluc3RlYWQgb2YgYEVxKHZhbHVlKWAgd2hlbiB0aGUgbW9jayBmdW5jdGlvbiBpcyBvdmVybG9hZGVkLnwKKworRXhjZXB0IGBSZWYoKWAsIHRoZXNlIG1hdGNoZXJzIG1ha2UgYSBfY29weV8gb2YgYHZhbHVlYCBpbiBjYXNlIGl0J3MKK21vZGlmaWVkIG9yIGRlc3RydWN0ZWQgbGF0ZXIuIElmIHRoZSBjb21waWxlciBjb21wbGFpbnMgdGhhdCBgdmFsdWVgCitkb2Vzbid0IGhhdmUgYSBwdWJsaWMgY29weSBjb25zdHJ1Y3RvciwgdHJ5IHdyYXAgaXQgaW4gYEJ5UmVmKClgLAorZS5nLiBgRXEoQnlSZWYobm9uX2NvcHlhYmxlX3ZhbHVlKSlgLiBJZiB5b3UgZG8gdGhhdCwgbWFrZSBzdXJlCitgbm9uX2NvcHlhYmxlX3ZhbHVlYCBpcyBub3QgY2hhbmdlZCBhZnRlcndhcmRzLCBvciB0aGUgbWVhbmluZyBvZiB5b3VyCittYXRjaGVyIHdpbGwgYmUgY2hhbmdlZC4KKworIyMgRmxvYXRpbmctUG9pbnQgTWF0Y2hlcnMgIyMKKworfGBEb3VibGVFcShhX2RvdWJsZSlgfGBhcmd1bWVudGAgaXMgYSBgZG91YmxlYCB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGBhX2RvdWJsZWAsIHRyZWF0aW5nIHR3byBOYU5zIGFzIHVuZXF1YWwufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBGbG9hdEVxKGFfZmxvYXQpYCAgfGBhcmd1bWVudGAgaXMgYSBgZmxvYXRgIHZhbHVlIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gYGFfZmxvYXRgLCB0cmVhdGluZyB0d28gTmFOcyBhcyB1bmVxdWFsLiAgfAorfGBOYW5TZW5zaXRpdmVEb3VibGVFcShhX2RvdWJsZSlgfGBhcmd1bWVudGAgaXMgYSBgZG91YmxlYCB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGBhX2RvdWJsZWAsIHRyZWF0aW5nIHR3byBOYU5zIGFzIGVxdWFsLiAgfAorfGBOYW5TZW5zaXRpdmVGbG9hdEVxKGFfZmxvYXQpYHxgYXJndW1lbnRgIGlzIGEgYGZsb2F0YCB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGBhX2Zsb2F0YCwgdHJlYXRpbmcgdHdvIE5hTnMgYXMgZXF1YWwuICAgIHwKKworVGhlIGFib3ZlIG1hdGNoZXJzIHVzZSBVTFAtYmFzZWQgY29tcGFyaXNvbiAodGhlIHNhbWUgYXMgdXNlZCBpbgorW0dvb2dsZSBUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8pKS4gVGhleQorYXV0b21hdGljYWxseSBwaWNrIGEgcmVhc29uYWJsZSBlcnJvciBib3VuZCBiYXNlZCBvbiB0aGUgYWJzb2x1dGUKK3ZhbHVlIG9mIHRoZSBleHBlY3RlZCB2YWx1ZS4gIGBEb3VibGVFcSgpYCBhbmQgYEZsb2F0RXEoKWAgY29uZm9ybSB0bwordGhlIElFRUUgc3RhbmRhcmQsIHdoaWNoIHJlcXVpcmVzIGNvbXBhcmluZyB0d28gTmFOcyBmb3IgZXF1YWxpdHkgdG8KK3JldHVybiBmYWxzZS4gVGhlIGBOYW5TZW5zaXRpdmUqYCB2ZXJzaW9uIGluc3RlYWQgdHJlYXRzIHR3byBOYU5zIGFzCitlcXVhbCwgd2hpY2ggaXMgb2Z0ZW4gd2hhdCBhIHVzZXIgd2FudHMuCisKK3xgRG91YmxlTmVhcihhX2RvdWJsZSwgbWF4X2Fic19lcnJvcilgfGBhcmd1bWVudGAgaXMgYSBgZG91YmxlYCB2YWx1ZSBjbG9zZSB0byBgYV9kb3VibGVgIChhYnNvbHV0ZSBlcnJvciA8PSBgbWF4X2Fic19lcnJvcmApLCB0cmVhdGluZyB0d28gTmFOcyBhcyB1bmVxdWFsLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgRmxvYXROZWFyKGFfZmxvYXQsIG1heF9hYnNfZXJyb3IpYCAgfGBhcmd1bWVudGAgaXMgYSBgZmxvYXRgIHZhbHVlIGNsb3NlIHRvIGBhX2Zsb2F0YCAoYWJzb2x1dGUgZXJyb3IgPD0gYG1heF9hYnNfZXJyb3JgKSwgdHJlYXRpbmcgdHdvIE5hTnMgYXMgdW5lcXVhbC4gIHwKK3xgTmFuU2Vuc2l0aXZlRG91YmxlTmVhcihhX2RvdWJsZSwgbWF4X2Fic19lcnJvcilgfGBhcmd1bWVudGAgaXMgYSBgZG91YmxlYCB2YWx1ZSBjbG9zZSB0byBgYV9kb3VibGVgIChhYnNvbHV0ZSBlcnJvciA8PSBgbWF4X2Fic19lcnJvcmApLCB0cmVhdGluZyB0d28gTmFOcyBhcyBlcXVhbC4gIHwKK3xgTmFuU2Vuc2l0aXZlRmxvYXROZWFyKGFfZmxvYXQsIG1heF9hYnNfZXJyb3IpYHxgYXJndW1lbnRgIGlzIGEgYGZsb2F0YCB2YWx1ZSBjbG9zZSB0byBgYV9mbG9hdGAgKGFic29sdXRlIGVycm9yIDw9IGBtYXhfYWJzX2Vycm9yYCksIHRyZWF0aW5nIHR3byBOYU5zIGFzIGVxdWFsLiAgICB8CisKKyMjIFN0cmluZyBNYXRjaGVycyAjIworCitUaGUgYGFyZ3VtZW50YCBjYW4gYmUgZWl0aGVyIGEgQyBzdHJpbmcgb3IgYSBDKysgc3RyaW5nIG9iamVjdDoKKworfGBDb250YWluc1JlZ2V4KHN0cmluZylgfGBhcmd1bWVudGAgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEVuZHNXaXRoKHN1ZmZpeClgICAgICB8YGFyZ3VtZW50YCBlbmRzIHdpdGggc3RyaW5nIGBzdWZmaXhgLiAgICAgICAgICAgfAorfGBIYXNTdWJzdHIoc3RyaW5nKWAgICAgfGBhcmd1bWVudGAgY29udGFpbnMgYHN0cmluZ2AgYXMgYSBzdWItc3RyaW5nLiAgIHwKK3xgTWF0Y2hlc1JlZ2V4KHN0cmluZylgIHxgYXJndW1lbnRgIG1hdGNoZXMgdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIHRoZSBtYXRjaCBzdGFydGluZyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBlbmRpbmcgYXQgdGhlIGxhc3QgY2hhcmFjdGVyLnwKK3xgU3RhcnRzV2l0aChwcmVmaXgpYCAgIHxgYXJndW1lbnRgIHN0YXJ0cyB3aXRoIHN0cmluZyBgcHJlZml4YC4gICAgICAgICB8Cit8YFN0ckNhc2VFcShzdHJpbmcpYCAgICB8YGFyZ3VtZW50YCBpcyBlcXVhbCB0byBgc3RyaW5nYCwgaWdub3JpbmcgY2FzZS4gfAorfGBTdHJDYXNlTmUoc3RyaW5nKWAgICAgfGBhcmd1bWVudGAgaXMgbm90IGVxdWFsIHRvIGBzdHJpbmdgLCBpZ25vcmluZyBjYXNlLnwKK3xgU3RyRXEoc3RyaW5nKWAgICAgICAgIHxgYXJndW1lbnRgIGlzIGVxdWFsIHRvIGBzdHJpbmdgLiAgICAgICAgICAgICAgICB8Cit8YFN0ck5lKHN0cmluZylgICAgICAgICB8YGFyZ3VtZW50YCBpcyBub3QgZXF1YWwgdG8gYHN0cmluZ2AuICAgICAgICAgICAgfAorCitgQ29udGFpbnNSZWdleCgpYCBhbmQgYE1hdGNoZXNSZWdleCgpYCB1c2UgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorc3ludGF4IGRlZmluZWQKK1toZXJlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0FkdmFuY2VkR3VpZGUjUmVndWxhcl9FeHByZXNzaW9uX1N5bnRheCkuCitgU3RyQ2FzZUVxKClgLCBgU3RyQ2FzZU5lKClgLCBgU3RyRXEoKWAsIGFuZCBgU3RyTmUoKWAgd29yayBmb3Igd2lkZQorc3RyaW5ncyBhcyB3ZWxsLgorCisjIyBDb250YWluZXIgTWF0Y2hlcnMgIyMKKworTW9zdCBTVEwtc3R5bGUgY29udGFpbmVycyBzdXBwb3J0IGA9PWAsIHNvIHlvdSBjYW4gdXNlCitgRXEoZXhwZWN0ZWRfY29udGFpbmVyKWAgb3Igc2ltcGx5IGBleHBlY3RlZF9jb250YWluZXJgIHRvIG1hdGNoIGEKK2NvbnRhaW5lciBleGFjdGx5LiAgIElmIHlvdSB3YW50IHRvIHdyaXRlIHRoZSBlbGVtZW50cyBpbi1saW5lLAorbWF0Y2ggdGhlbSBtb3JlIGZsZXhpYmx5LCBvciBnZXQgbW9yZSBpbmZvcm1hdGl2ZSBtZXNzYWdlcywgeW91IGNhbiB1c2U6CisKK3wgYENvbnRhaW5lckVxKGNvbnRhaW5lcilgIHwgVGhlIHNhbWUgYXMgYEVxKGNvbnRhaW5lcilgIGV4Y2VwdCB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgYWxzbyBpbmNsdWRlcyB3aGljaCBlbGVtZW50cyBhcmUgaW4gb25lIGNvbnRhaW5lciBidXQgbm90IHRoZSBvdGhlci4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBDb250YWlucyhlKWAgICAgICAgICAgICB8IGBhcmd1bWVudGAgY29udGFpbnMgYW4gZWxlbWVudCB0aGF0IG1hdGNoZXMgYGVgLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYEVhY2goZSlgICAgICAgICAgICAgICAgIHwgYGFyZ3VtZW50YCBpcyBhIGNvbnRhaW5lciB3aGVyZSBfZXZlcnlfIGVsZW1lbnQgbWF0Y2hlcyBgZWAsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSB2YWx1ZSBvciBhIG1hdGNoZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgRWxlbWVudHNBcmUoZTAsIGUxLCAuLi4sIGVuKWAgfCBgYXJndW1lbnRgIGhhcyBgbiArIDFgIGVsZW1lbnRzLCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IG1hdGNoZXMgYGVpYCwgd2hpY2ggY2FuIGJlIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAwIHRvIDEwIGFyZ3VtZW50cyBhcmUgYWxsb3dlZC4gfAorfCBgRWxlbWVudHNBcmVBcnJheSh7IGUwLCBlMSwgLi4uLCBlbiB9KWAsIGBFbGVtZW50c0FyZUFycmF5KGFycmF5KWAsIG9yIGBFbGVtZW50c0FyZUFycmF5KGFycmF5LCBjb3VudClgIHwgVGhlIHNhbWUgYXMgYEVsZW1lbnRzQXJlKClgIGV4Y2VwdCB0aGF0IHRoZSBleHBlY3RlZCBlbGVtZW50IHZhbHVlcy9tYXRjaGVycyBjb21lIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdCwgU1RMLXN0eWxlIGNvbnRhaW5lciwgb3IgQy1zdHlsZSBhcnJheS4gfAorfCBgSXNFbXB0eSgpYCAgICAgICAgICAgICAgfCBgYXJndW1lbnRgIGlzIGFuIGVtcHR5IGNvbnRhaW5lciAoYGNvbnRhaW5lci5lbXB0eSgpYCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBQb2ludHdpc2UobSwgY29udGFpbmVyKWAgfCBgYXJndW1lbnRgIGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbiBgY29udGFpbmVyYCwgYW5kIGZvciBhbGwgaSwgKHRoZSBpLXRoIGVsZW1lbnQgaW4gYGFyZ3VtZW50YCwgdGhlIGktdGggZWxlbWVudCBpbiBgY29udGFpbmVyYCkgbWF0Y2ggYG1gLCB3aGljaCBpcyBhIG1hdGNoZXIgb24gMi10dXBsZXMuIEUuZy4gYFBvaW50d2lzZShMZSgpLCB1cHBlcl9ib3VuZHMpYCB2ZXJpZmllcyB0aGF0IGVhY2ggZWxlbWVudCBpbiBgYXJndW1lbnRgIGRvZXNuJ3QgZXhjZWVkIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gYHVwcGVyX2JvdW5kc2AuIFNlZSBtb3JlIGRldGFpbCBiZWxvdy4gfAorfCBgU2l6ZUlzKG0pYCAgICAgICAgICAgICAgfCBgYXJndW1lbnRgIGlzIGEgY29udGFpbmVyIHdob3NlIHNpemUgbWF0Y2hlcyBgbWAuIEUuZy4gYFNpemVJcygyKWAgb3IgYFNpemVJcyhMdCgyKSlgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBVbm9yZGVyZWRFbGVtZW50c0FyZShlMCwgZTEsIC4uLiwgZW4pYCB8IGBhcmd1bWVudGAgaGFzIGBuICsgMWAgZWxlbWVudHMsIGFuZCB1bmRlciBzb21lIHBlcm11dGF0aW9uIGVhY2ggZWxlbWVudCBtYXRjaGVzIGFuIGBlaWAgKGZvciBhIGRpZmZlcmVudCBgaWApLCB3aGljaCBjYW4gYmUgYSB2YWx1ZSBvciBhIG1hdGNoZXIuIDAgdG8gMTAgYXJndW1lbnRzIGFyZSBhbGxvd2VkLiB8Cit8IGBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHsgZTAsIGUxLCAuLi4sIGVuIH0pYCwgYFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpYCwgb3IgYFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoYXJyYXksIGNvdW50KWAgfCBUaGUgc2FtZSBhcyBgVW5vcmRlcmVkRWxlbWVudHNBcmUoKWAgZXhjZXB0IHRoYXQgdGhlIGV4cGVjdGVkIGVsZW1lbnQgdmFsdWVzL21hdGNoZXJzIGNvbWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LCBTVEwtc3R5bGUgY29udGFpbmVyLCBvciBDLXN0eWxlIGFycmF5LiB8Cit8IGBXaGVuU29ydGVkKG0pYCAgICAgICAgICB8IFdoZW4gYGFyZ3VtZW50YCBpcyBzb3J0ZWQgdXNpbmcgdGhlIGA8YCBvcGVyYXRvciwgaXQgbWF0Y2hlcyBjb250YWluZXIgbWF0Y2hlciBgbWAuIEUuZy4gYFdoZW5Tb3J0ZWQoVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgMiwgMykpYCB2ZXJpZmllcyB0aGF0IGBhcmd1bWVudGAgY29udGFpbnMgZWxlbWVudHMgYDFgLCBgMmAsIGFuZCBgM2AsIGlnbm9yaW5nIG9yZGVyLiB8Cit8IGBXaGVuU29ydGVkQnkoY29tcGFyYXRvciwgbSlgIHwgVGhlIHNhbWUgYXMgYFdoZW5Tb3J0ZWQobSlgLCBleGNlcHQgdGhhdCB0aGUgZ2l2ZW4gY29tcGFyYXRvciBpbnN0ZWFkIG9mIGA8YCBpcyB1c2VkIHRvIHNvcnQgYGFyZ3VtZW50YC4gRS5nLiBgV2hlblNvcnRlZEJ5KHN0ZDo6Z3JlYXRlcjxpbnQ+KCksIEVsZW1lbnRzQXJlKDMsIDIsIDEpKWAuIHwKKworTm90ZXM6CisKKyAgKiBUaGVzZSBtYXRjaGVycyBjYW4gYWxzbyBtYXRjaDoKKyAgICAxLiBhIG5hdGl2ZSBhcnJheSBwYXNzZWQgYnkgcmVmZXJlbmNlIChlLmcuIGluIGBGb28oY29uc3QgaW50ICgmYSlbNV0pYCksIGFuZAorICAgIDEuIGFuIGFycmF5IHBhc3NlZCBhcyBhIHBvaW50ZXIgYW5kIGEgY291bnQgKGUuZy4gaW4gYEJhcihjb25zdCBUKiBidWZmZXIsIGludCBsZW4pYCAtLSBzZWUgW011bHRpLWFyZ3VtZW50IE1hdGNoZXJzXSgjTXVsdGlhcmd1bWVudF9NYXRjaGVycy5tZCkpLgorICAqIFRoZSBhcnJheSBiZWluZyBtYXRjaGVkIG1heSBiZSBtdWx0aS1kaW1lbnNpb25hbCAoaS5lLiBpdHMgZWxlbWVudHMgY2FuIGJlIGFycmF5cykuCisgICogYG1gIGluIGBQb2ludHdpc2UobSwgLi4uKWAgc2hvdWxkIGJlIGEgbWF0Y2hlciBmb3IgYDo6dGVzdGluZzo6dHVwbGU8VCwgVT5gIHdoZXJlIGBUYCBhbmQgYFVgIGFyZSB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBhY3R1YWwgY29udGFpbmVyIGFuZCB0aGUgZXhwZWN0ZWQgY29udGFpbmVyLCByZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLCB0byBjb21wYXJlIHR3byBgRm9vYCBjb250YWluZXJzIHdoZXJlIGBGb29gIGRvZXNuJ3Qgc3VwcG9ydCBgb3BlcmF0b3I9PWAgYnV0IGhhcyBhbiBgRXF1YWxzKClgIG1ldGhvZCwgb25lIG1pZ2h0IHdyaXRlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6Z2V0OworTUFUQ0hFUihGb29FcSwgIiIpIHsKKyAgcmV0dXJuIGdldDwwPihhcmcpLkVxdWFscyhnZXQ8MT4oYXJnKSk7Cit9CisuLi4KK0VYUEVDVF9USEFUKGFjdHVhbF9mb29zLCBQb2ludHdpc2UoRm9vRXEoKSwgZXhwZWN0ZWRfZm9vcykpOworYGBgCisKKyMjIE1lbWJlciBNYXRjaGVycyAjIworCit8YEZpZWxkKCZjbGFzczo6ZmllbGQsIG0pYHxgYXJndW1lbnQuZmllbGRgIChvciBgYXJndW1lbnQtPmZpZWxkYCB3aGVuIGBhcmd1bWVudGAgaXMgYSBwbGFpbiBwb2ludGVyKSBtYXRjaGVzIG1hdGNoZXIgYG1gLCB3aGVyZSBgYXJndW1lbnRgIGlzIGFuIG9iamVjdCBvZiB0eXBlIF9jbGFzc18ufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgS2V5KGUpYCAgICAgICAgICAgICAgICAgfGBhcmd1bWVudC5maXJzdGAgbWF0Y2hlcyBgZWAsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSB2YWx1ZSBvciBhIG1hdGNoZXIuIEUuZy4gYENvbnRhaW5zKEtleShMZSg1KSkpYCBjYW4gdmVyaWZ5IHRoYXQgYSBgbWFwYCBjb250YWlucyBhIGtleSBgPD0gNWAufAorfGBQYWlyKG0xLCBtMilgICAgICAgICAgICB8YGFyZ3VtZW50YCBpcyBhbiBgc3RkOjpwYWlyYCB3aG9zZSBgZmlyc3RgIGZpZWxkIG1hdGNoZXMgYG0xYCBhbmQgYHNlY29uZGAgZmllbGQgbWF0Y2hlcyBgbTJgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgUHJvcGVydHkoJmNsYXNzOjpwcm9wZXJ0eSwgbSlgfGBhcmd1bWVudC5wcm9wZXJ0eSgpYCAob3IgYGFyZ3VtZW50LT5wcm9wZXJ0eSgpYCB3aGVuIGBhcmd1bWVudGAgaXMgYSBwbGFpbiBwb2ludGVyKSBtYXRjaGVzIG1hdGNoZXIgYG1gLCB3aGVyZSBgYXJndW1lbnRgIGlzIGFuIG9iamVjdCBvZiB0eXBlIF9jbGFzc18ufAorCisjIyBNYXRjaGluZyB0aGUgUmVzdWx0IG9mIGEgRnVuY3Rpb24gb3IgRnVuY3RvciAjIworCit8YFJlc3VsdE9mKGYsIG0pYHxgZihhcmd1bWVudClgIG1hdGNoZXMgbWF0Y2hlciBgbWAsIHdoZXJlIGBmYCBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IufAorfDotLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworIyMgUG9pbnRlciBNYXRjaGVycyAjIworCit8YFBvaW50ZWUobSlgfGBhcmd1bWVudGAgKGVpdGhlciBhIHNtYXJ0IHBvaW50ZXIgb3IgYSByYXcgcG9pbnRlcikgcG9pbnRzIHRvIGEgdmFsdWUgdGhhdCBtYXRjaGVzIG1hdGNoZXIgYG1gLnwKK3w6LS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBXaGVuRHluYW1pY0Nhc3RUbzxUPihtKWB8IHdoZW4gYGFyZ3VtZW50YCBpcyBwYXNzZWQgdGhyb3VnaCBgZHluYW1pY19jYXN0PFQ+KClgLCBpdCBtYXRjaGVzIG1hdGNoZXIgYG1gLiAgICAgICAgICAgICAgICAgfAorCisjIyBNdWx0aWFyZ3VtZW50IE1hdGNoZXJzICMjCisKK1RlY2huaWNhbGx5LCBhbGwgbWF0Y2hlcnMgbWF0Y2ggYSBfc2luZ2xlXyB2YWx1ZS4gQSAibXVsdGktYXJndW1lbnQiCittYXRjaGVyIGlzIGp1c3Qgb25lIHRoYXQgbWF0Y2hlcyBhIF90dXBsZV8uIFRoZSBmb2xsb3dpbmcgbWF0Y2hlcnMgY2FuCitiZSB1c2VkIHRvIG1hdGNoIGEgdHVwbGUgYCh4LCB5KWA6CisKK3xgRXEoKWB8YHggPT0geWB8Cit8Oi0tLS0tfDotLS0tLS0tfAorfGBHZSgpYHxgeCA+PSB5YHwKK3xgR3QoKWB8YHggPiB5YCB8Cit8YExlKClgfGB4IDw9IHlgfAorfGBMdCgpYHxgeCA8IHlgIHwKK3xgTmUoKWB8YHggIT0geWB8CisKK1lvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgc2VsZWN0b3JzIHRvIHBpY2sgYSBzdWJzZXQgb2YgdGhlIGFyZ3VtZW50cworKG9yIHJlb3JkZXIgdGhlbSkgdG8gcGFydGljaXBhdGUgaW4gdGhlIG1hdGNoaW5nOgorCit8YEFsbEFyZ3MobSlgfEVxdWl2YWxlbnQgdG8gYG1gLiBVc2VmdWwgYXMgc3ludGFjdGljIHN1Z2FyIGluIGAuV2l0aChBbGxBcmdzKG0pKWAufAorfDotLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgQXJnczxOMSwgTjIsIC4uLiwgTms+KG0pYHxUaGUgdHVwbGUgb2YgdGhlIGBrYCBzZWxlY3RlZCAodXNpbmcgMC1iYXNlZCBpbmRpY2VzKSBhcmd1bWVudHMgbWF0Y2hlcyBgbWAsIGUuZy4gYEFyZ3M8MSwgMj4oRXEoKSlgLnwKKworIyMgQ29tcG9zaXRlIE1hdGNoZXJzICMjCisKK1lvdSBjYW4gbWFrZSBhIG1hdGNoZXIgZnJvbSBvbmUgb3IgbW9yZSBvdGhlciBtYXRjaGVyczoKKworfGBBbGxPZihtMSwgbTIsIC4uLiwgbW4pYHxgYXJndW1lbnRgIG1hdGNoZXMgYWxsIG9mIHRoZSBtYXRjaGVycyBgbTFgIHRvIGBtbmAufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBbnlPZihtMSwgbTIsIC4uLiwgbW4pYHxgYXJndW1lbnRgIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYXRjaGVycyBgbTFgIHRvIGBtbmAufAorfGBOb3QobSlgICAgICAgICAgICAgICAgIHxgYXJndW1lbnRgIGRvZXNuJ3QgbWF0Y2ggbWF0Y2hlciBgbWAuICAgICAgICAgICAgICAgfAorCisjIyBBZGFwdGVycyBmb3IgTWF0Y2hlcnMgIyMKKworfGBNYXRjaGVyQ2FzdDxUPihtKWB8Y2FzdHMgbWF0Y2hlciBgbWAgdG8gdHlwZSBgTWF0Y2hlcjxUPmAufAorfDotLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBTYWZlTWF0Y2hlckNhc3Q8VD4obSlgfCBbc2FmZWx5IGNhc3RzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI0Nhc3RpbmdfTWF0Y2hlcnMpIG1hdGNoZXIgYG1gIHRvIHR5cGUgYE1hdGNoZXI8VD5gLiB8Cit8YFRydWx5KHByZWRpY2F0ZSlgIHxgcHJlZGljYXRlKGFyZ3VtZW50KWAgcmV0dXJucyBzb21ldGhpbmcgY29uc2lkZXJlZCBieSBDKysgdG8gYmUgdHJ1ZSwgd2hlcmUgYHByZWRpY2F0ZWAgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yLnwKKworIyMgTWF0Y2hlcnMgYXMgUHJlZGljYXRlcyAjIworCit8YE1hdGNoZXMobSkodmFsdWUpYHxldmFsdWF0ZXMgdG8gYHRydWVgIGlmIGB2YWx1ZWAgbWF0Y2hlcyBgbWAuIFlvdSBjYW4gdXNlIGBNYXRjaGVzKG0pYCBhbG9uZSBhcyBhIHVuYXJ5IGZ1bmN0b3IufAorfDotLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgRXhwbGFpbk1hdGNoUmVzdWx0KG0sIHZhbHVlLCByZXN1bHRfbGlzdGVuZXIpYHxldmFsdWF0ZXMgdG8gYHRydWVgIGlmIGB2YWx1ZWAgbWF0Y2hlcyBgbWAsIGV4cGxhaW5pbmcgdGhlIHJlc3VsdCB0byBgcmVzdWx0X2xpc3RlbmVyYC4gICAgICAgfAorfGBWYWx1ZSh2YWx1ZSwgbSlgICB8ZXZhbHVhdGVzIHRvIGB0cnVlYCBpZiBgdmFsdWVgIG1hdGNoZXMgYG1gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworIyMgRGVmaW5pbmcgTWF0Y2hlcnMgIyMKKworfCBgTUFUQ0hFUihJc0V2ZW4sICIiKSB7IHJldHVybiAoYXJnICUgMikgPT0gMDsgfWAgfCBEZWZpbmVzIGEgbWF0Y2hlciBgSXNFdmVuKClgIHRvIG1hdGNoIGFuIGV2ZW4gbnVtYmVyLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYE1BVENIRVJfUChJc0RpdmlzaWJsZUJ5LCBuLCAiIikgeyAqcmVzdWx0X2xpc3RlbmVyIDw8ICJ3aGVyZSB0aGUgcmVtYWluZGVyIGlzICIgPDwgKGFyZyAlIG4pOyByZXR1cm4gKGFyZyAlIG4pID09IDA7IH1gIHwgRGVmaW5lcyBhIG1hY2hlciBgSXNEaXZpc2libGVCeShuKWAgdG8gbWF0Y2ggYSBudW1iZXIgZGl2aXNpYmxlIGJ5IGBuYC4gfAorfCBgTUFUQ0hFUl9QMihJc0JldHdlZW4sIGEsIGIsIHN0ZDo6c3RyaW5nKG5lZ2F0aW9uID8gImlzbid0IiA6ICJpcyIpICsgIiBiZXR3ZWVuICIgKyBQcmludFRvU3RyaW5nKGEpICsgIiBhbmQgIiArIFByaW50VG9TdHJpbmcoYikpIHsgcmV0dXJuIGEgPD0gYXJnICYmIGFyZyA8PSBiOyB9YCB8IERlZmluZXMgYSBtYXRjaGVyIGBJc0JldHdlZW4oYSwgYilgIHRvIG1hdGNoIGEgdmFsdWUgaW4gdGhlIHJhbmdlIFtgYWAsIGBiYF0uIHwKKworKipOb3RlczoqKgorCisgIDEuIFRoZSBgTUFUQ0hFUipgIG1hY3JvcyBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgYSBmdW5jdGlvbiBvciBjbGFzcy4KKyAgMS4gVGhlIG1hdGNoZXIgYm9keSBtdXN0IGJlIF9wdXJlbHkgZnVuY3Rpb25hbF8gKGkuZS4gaXQgY2Fubm90IGhhdmUgYW55IHNpZGUgZWZmZWN0LCBhbmQgdGhlIHJlc3VsdCBtdXN0IG5vdCBkZXBlbmQgb24gYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCBhbmQgdGhlIG1hdGNoZXIgcGFyYW1ldGVycykuCisgIDEuIFlvdSBjYW4gdXNlIGBQcmludFRvU3RyaW5nKHgpYCB0byBjb252ZXJ0IGEgdmFsdWUgYHhgIG9mIGFueSB0eXBlIHRvIGEgc3RyaW5nLgorCisjIyBNYXRjaGVycyBhcyBUZXN0IEFzc2VydGlvbnMgIyMKKworfGBBU1NFUlRfVEhBVChleHByZXNzaW9uLCBtKWB8R2VuZXJhdGVzIGEgW2ZhdGFsIGZhaWx1cmVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvUHJpbWVyI0Fzc2VydGlvbnMpIGlmIHRoZSB2YWx1ZSBvZiBgZXhwcmVzc2lvbmAgZG9lc24ndCBtYXRjaCBtYXRjaGVyIGBtYC58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgRVhQRUNUX1RIQVQoZXhwcmVzc2lvbiwgbSlgfEdlbmVyYXRlcyBhIG5vbi1mYXRhbCBmYWlsdXJlIGlmIHRoZSB2YWx1ZSBvZiBgZXhwcmVzc2lvbmAgZG9lc24ndCBtYXRjaCBtYXRjaGVyIGBtYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisjIEFjdGlvbnMgIworCisqKkFjdGlvbnMqKiBzcGVjaWZ5IHdoYXQgYSBtb2NrIGZ1bmN0aW9uIHNob3VsZCBkbyB3aGVuIGludm9rZWQuCisKKyMjIFJldHVybmluZyBhIFZhbHVlICMjCisKK3xgUmV0dXJuKClgfFJldHVybiBmcm9tIGEgYHZvaWRgIG1vY2sgZnVuY3Rpb24ufAorfDotLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YFJldHVybih2YWx1ZSlgfFJldHVybiBgdmFsdWVgLiBJZiB0aGUgdHlwZSBvZiBgdmFsdWVgIGlzIGRpZmZlcmVudCB0byB0aGUgbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlLCBgdmFsdWVgIGlzIGNvbnZlcnRlZCB0byB0aGUgbGF0dGVyIHR5cGUgPGk+YXQgdGhlIHRpbWUgdGhlIGV4cGVjdGF0aW9uIGlzIHNldDwvaT4sIG5vdCB3aGVuIHRoZSBhY3Rpb24gaXMgZXhlY3V0ZWQufAorfGBSZXR1cm5Bcmc8Tj4oKWB8UmV0dXJuIHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50LnwKK3xgUmV0dXJuTmV3PFQ+KGExLCAuLi4sIGFrKWB8UmV0dXJuIGBuZXcgVChhMSwgLi4uLCBhaylgOyBhIGRpZmZlcmVudCBvYmplY3QgaXMgY3JlYXRlZCBlYWNoIHRpbWUufAorfGBSZXR1cm5OdWxsKClgfFJldHVybiBhIG51bGwgcG9pbnRlci4gICAgICAgICAgICAgfAorfGBSZXR1cm5Qb2ludGVlKHB0cilgfFJldHVybiB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBgcHRyYC58Cit8YFJldHVyblJlZih2YXJpYWJsZSlgfFJldHVybiBhIHJlZmVyZW5jZSB0byBgdmFyaWFibGVgLiAgfAorfGBSZXR1cm5SZWZPZkNvcHkodmFsdWUpYHxSZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBjb3B5IG9mIGB2YWx1ZWA7IHRoZSBjb3B5IGxpdmVzIGFzIGxvbmcgYXMgdGhlIGFjdGlvbi58CisKKyMjIFNpZGUgRWZmZWN0cyAjIworCit8YEFzc2lnbigmdmFyaWFibGUsIHZhbHVlKWB8QXNzaWduIGB2YWx1ZWAgdG8gdmFyaWFibGUufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYERlbGV0ZUFyZzxOPigpYCAgICAgICAgIHwgRGVsZXRlIHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgcG9pbnRlci4gfAorfCBgU2F2ZUFyZzxOPihwb2ludGVyKWAgICAgfCBTYXZlIHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvIGAqcG9pbnRlcmAuIHwKK3wgYFNhdmVBcmdQb2ludGVlPE4+KHBvaW50ZXIpYCB8IFNhdmUgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgdGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQgdG8gYCpwb2ludGVyYC4gfAorfCBgU2V0QXJnUmVmZXJlZTxOPih2YWx1ZSlgIHwJQXNzaWduIHZhbHVlIHRvIHRoZSB2YXJpYWJsZSByZWZlcmVuY2VkIGJ5IHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50LiB8Cit8YFNldEFyZ1BvaW50ZWU8Tj4odmFsdWUpYCB8QXNzaWduIGB2YWx1ZWAgdG8gdGhlIHZhcmlhYmxlIHBvaW50ZWQgYnkgdGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQufAorfGBTZXRBcmd1bWVudFBvaW50ZWU8Tj4odmFsdWUpYHxTYW1lIGFzIGBTZXRBcmdQb2ludGVlPE4+KHZhbHVlKWAuIERlcHJlY2F0ZWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MS43LjAufAorfGBTZXRBcnJheUFyZ3VtZW50PE4+KGZpcnN0LCBsYXN0KWB8Q29waWVzIHRoZSBlbGVtZW50cyBpbiBzb3VyY2UgcmFuZ2UgW2BmaXJzdGAsIGBsYXN0YCkgdG8gdGhlIGFycmF5IHBvaW50ZWQgdG8gYnkgdGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBwb2ludGVyIG9yIGFuIGl0ZXJhdG9yLiBUaGUgYWN0aW9uIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc291cmNlIHJhbmdlLnwKK3xgU2V0RXJybm9BbmRSZXR1cm4oZXJyb3IsIHZhbHVlKWB8U2V0IGBlcnJub2AgdG8gYGVycm9yYCBhbmQgcmV0dXJuIGB2YWx1ZWAufAorfGBUaHJvdyhleGNlcHRpb24pYCAgICAgICAgfFRocm93cyB0aGUgZ2l2ZW4gZXhjZXB0aW9uLCB3aGljaCBjYW4gYmUgYW55IGNvcHlhYmxlIHZhbHVlLiBBdmFpbGFibGUgc2luY2UgdjEuMS4wLnwKKworIyMgVXNpbmcgYSBGdW5jdGlvbiBvciBhIEZ1bmN0b3IgYXMgYW4gQWN0aW9uICMjCisKK3xgSW52b2tlKGYpYHxJbnZva2UgYGZgIHdpdGggdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIG1vY2sgZnVuY3Rpb24sIHdoZXJlIGBmYCBjYW4gYmUgYSBnbG9iYWwvc3RhdGljIGZ1bmN0aW9uIG9yIGEgZnVuY3Rvci58Cit8Oi0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBJbnZva2Uob2JqZWN0X3BvaW50ZXIsICZjbGFzczo6bWV0aG9kKWB8SW52b2tlIHRoZSB7bWV0aG9kIG9uIHRoZSBvYmplY3Qgd2l0aCB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbW9jayBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfGBJbnZva2VXaXRob3V0QXJncyhmKWB8SW52b2tlIGBmYCwgd2hpY2ggY2FuIGJlIGEgZ2xvYmFsL3N0YXRpYyBmdW5jdGlvbiBvciBhIGZ1bmN0b3IuIGBmYCBtdXN0IHRha2Ugbm8gYXJndW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgfAorfGBJbnZva2VXaXRob3V0QXJncyhvYmplY3RfcG9pbnRlciwgJmNsYXNzOjptZXRob2QpYHxJbnZva2UgdGhlIG1ldGhvZCBvbiB0aGUgb2JqZWN0LCB3aGljaCB0YWtlcyBubyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8YEludm9rZUFyZ3VtZW50PE4+KGFyZzEsIGFyZzIsIC4uLiwgYXJnaylgfEludm9rZSB0aGUgbW9jayBmdW5jdGlvbidzIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhIGZ1bmN0b3IsIHdpdGggdGhlIGBrYCBhcmd1bWVudHMufAorCitUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBpbnZva2VkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIHJldHVybiB2YWx1ZQorb2YgdGhlIGFjdGlvbi4KKworV2hlbiBkZWZpbmluZyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdG8gYmUgdXNlZCB3aXRoIGBJbnZva2UqKClgLCB5b3UgY2FuIGRlY2xhcmUgYW55IHVudXNlZCBwYXJhbWV0ZXJzIGFzIGBVbnVzZWRgOgorYGBgCisgIGRvdWJsZSBEaXN0YW5jZShVbnVzZWQsIGRvdWJsZSB4LCBkb3VibGUgeSkgeyByZXR1cm4gc3FydCh4KnggKyB5KnkpOyB9CisgIC4uLgorICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oIkhpIiwgXywgXykpLldpbGxPbmNlKEludm9rZShEaXN0YW5jZSkpOworYGBgCisKK0luIGBJbnZva2VBcmd1bWVudDxOPiguLi4pYCwgaWYgYW4gYXJndW1lbnQgbmVlZHMgdG8gYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSwgd3JhcCBpdCBpbnNpZGUgYEJ5UmVmKClgLiBGb3IgZXhhbXBsZSwKK2BgYAorICBJbnZva2VBcmd1bWVudDwyPig1LCBzdHJpbmcoIkhpIiksIEJ5UmVmKGZvbykpCitgYGAKK2NhbGxzIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgIzIgYXJndW1lbnQsIHBhc3NpbmcgdG8gaXQgYDVgIGFuZCBgc3RyaW5nKCJIaSIpYCBieSB2YWx1ZSwgYW5kIGBmb29gIGJ5IHJlZmVyZW5jZS4KKworIyMgRGVmYXVsdCBBY3Rpb24gIyMKKworfGBEb0RlZmF1bHQoKWB8RG8gdGhlIGRlZmF1bHQgYWN0aW9uIChzcGVjaWZpZWQgYnkgYE9OX0NBTEwoKWAgb3IgdGhlIGJ1aWx0LWluIG9uZSkufAorfDotLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCisqKk5vdGU6KiogZHVlIHRvIHRlY2huaWNhbCByZWFzb25zLCBgRG9EZWZhdWx0KClgIGNhbm5vdCBiZSB1c2VkIGluc2lkZSAgYSBjb21wb3NpdGUgYWN0aW9uIC0gdHJ5aW5nIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGEgcnVuLXRpbWUgZXJyb3IuCisKKyMjIENvbXBvc2l0ZSBBY3Rpb25zICMjCisKK3xgRG9BbGwoYTEsIGEyLCAuLi4sIGFuKWB8RG8gYWxsIGFjdGlvbnMgYGExYCB0byBgYW5gIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvZiBgYW5gIGluIGVhY2ggaW52b2NhdGlvbi4gVGhlIGZpcnN0IGBuIC0gMWAgc3ViLWFjdGlvbnMgbXVzdCByZXR1cm4gdm9pZC4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YElnbm9yZVJlc3VsdChhKWAgICAgICAgfFBlcmZvcm0gYWN0aW9uIGBhYCBhbmQgaWdub3JlIGl0cyByZXN1bHQuIGBhYCBtdXN0IG5vdCByZXR1cm4gdm9pZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgV2l0aEFyZzxOPihhKWAgICAgICAgICB8UGFzcyB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhY3Rpb24gYGFgIGFuZCBwZXJmb3JtIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfGBXaXRoQXJnczxOMSwgTjIsIC4uLiwgTms+KGEpYHxQYXNzIHRoZSBzZWxlY3RlZCAoMC1iYXNlZCkgYXJndW1lbnRzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRvIGFjdGlvbiBgYWAgYW5kIHBlcmZvcm0gaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8YFdpdGhvdXRBcmdzKGEpYCAgICAgICAgfFBlcmZvcm0gYWN0aW9uIGBhYCB3aXRob3V0IGFueSBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworIyMgRGVmaW5pbmcgQWN0aW9ucyAjIworCit8IGBBQ1RJT04oU3VtKSB7IHJldHVybiBhcmcwICsgYXJnMTsgfWAgfCBEZWZpbmVzIGFuIGFjdGlvbiBgU3VtKClgIHRvIHJldHVybiB0aGUgc3VtIG9mIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnQgIzAgYW5kICMxLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBBQ1RJT05fUChQbHVzLCBuKSB7IHJldHVybiBhcmcwICsgbjsgfWAgfCBEZWZpbmVzIGFuIGFjdGlvbiBgUGx1cyhuKWAgdG8gcmV0dXJuIHRoZSBzdW0gb2YgdGhlIG1vY2sgZnVuY3Rpb24ncyBhcmd1bWVudCAjMCBhbmQgYG5gLiB8Cit8IGBBQ1RJT05fUGsoRm9vLCBwMSwgLi4uLCBwaykgeyBzdGF0ZW1lbnRzOyB9YCB8IERlZmluZXMgYSBwYXJhbWV0ZXJpemVkIGFjdGlvbiBgRm9vKHAxLCAuLi4sIHBrKWAgdG8gZXhlY3V0ZSB0aGUgZ2l2ZW4gYHN0YXRlbWVudHNgLiAgIHwKKworVGhlIGBBQ1RJT04qYCBtYWNyb3MgY2Fubm90IGJlIHVzZWQgaW5zaWRlIGEgZnVuY3Rpb24gb3IgY2xhc3MuCisKKyMgQ2FyZGluYWxpdGllcyAjCisKK1RoZXNlIGFyZSB1c2VkIGluIGBUaW1lcygpYCB0byBzcGVjaWZ5IGhvdyBtYW55IHRpbWVzIGEgbW9jayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZDoKKworfGBBbnlOdW1iZXIoKWB8VGhlIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcy58Cit8Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgQXRMZWFzdChuKWAgfFRoZSBjYWxsIGlzIGV4cGVjdGVkIGF0IGxlYXN0IGBuYCB0aW1lcy4gICAgICAgfAorfGBBdE1vc3QobilgICB8VGhlIGNhbGwgaXMgZXhwZWN0ZWQgYXQgbW9zdCBgbmAgdGltZXMuICAgICAgICB8Cit8YEJldHdlZW4obSwgbilgfFRoZSBjYWxsIGlzIGV4cGVjdGVkIGJldHdlZW4gYG1gIGFuZCBgbmAgKGluY2x1c2l2ZSkgdGltZXMufAorfGBFeGFjdGx5KG4pIG9yIG5gfFRoZSBjYWxsIGlzIGV4cGVjdGVkIGV4YWN0bHkgYG5gIHRpbWVzLiBJbiBwYXJ0aWN1bGFyLCB0aGUgY2FsbCBzaG91bGQgbmV2ZXIgaGFwcGVuIHdoZW4gYG5gIGlzIDAufAorCisjIEV4cGVjdGF0aW9uIE9yZGVyICMKKworQnkgZGVmYXVsdCwgdGhlIGV4cGVjdGF0aW9ucyBjYW4gYmUgbWF0Y2hlZCBpbiBfYW55XyBvcmRlci4gIElmIHNvbWUKK29yIGFsbCBleHBlY3RhdGlvbnMgbXVzdCBiZSBtYXRjaGVkIGluIGEgZ2l2ZW4gb3JkZXIsIHRoZXJlIGFyZSB0d28KK3dheXMgdG8gc3BlY2lmeSBpdC4gIFRoZXkgY2FuIGJlIHVzZWQgZWl0aGVyIGluZGVwZW5kZW50bHkgb3IKK3RvZ2V0aGVyLgorCisjIyBUaGUgQWZ0ZXIgQ2xhdXNlICMjCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpFeHBlY3RhdGlvbjsKKy4uLgorRXhwZWN0YXRpb24gaW5pdF94ID0gRVhQRUNUX0NBTEwoZm9vLCBJbml0WCgpKTsKK0V4cGVjdGF0aW9uIGluaXRfeSA9IEVYUEVDVF9DQUxMKGZvbywgSW5pdFkoKSk7CitFWFBFQ1RfQ0FMTChmb28sIEJhcigpKQorICAgIC5BZnRlcihpbml0X3gsIGluaXRfeSk7CitgYGAKK3NheXMgdGhhdCBgQmFyKClgIGNhbiBiZSBjYWxsZWQgb25seSBhZnRlciBib3RoIGBJbml0WCgpYCBhbmQKK2BJbml0WSgpYCBoYXZlIGJlZW4gY2FsbGVkLgorCitJZiB5b3UgZG9uJ3Qga25vdyBob3cgbWFueSBwcmUtcmVxdWlzaXRlcyBhbiBleHBlY3RhdGlvbiBoYXMgd2hlbiB5b3UKK3dyaXRlIGl0LCB5b3UgY2FuIHVzZSBhbiBgRXhwZWN0YXRpb25TZXRgIHRvIGNvbGxlY3QgdGhlbToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkV4cGVjdGF0aW9uU2V0OworLi4uCitFeHBlY3RhdGlvblNldCBhbGxfaW5pdHM7Citmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRfY291bnQ7IGkrKykgeworICBhbGxfaW5pdHMgKz0gRVhQRUNUX0NBTEwoZm9vLCBJbml0RWxlbWVudChpKSk7Cit9CitFWFBFQ1RfQ0FMTChmb28sIEJhcigpKQorICAgIC5BZnRlcihhbGxfaW5pdHMpOworYGBgCitzYXlzIHRoYXQgYEJhcigpYCBjYW4gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYWxsIGVsZW1lbnRzIGhhdmUgYmVlbgoraW5pdGlhbGl6ZWQgKGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IHdoaWNoIGVsZW1lbnRzIGdldCBpbml0aWFsaXplZAorYmVmb3JlIHRoZSBvdGhlcnMpLgorCitNb2RpZnlpbmcgYW4gYEV4cGVjdGF0aW9uU2V0YCBhZnRlciB1c2luZyBpdCBpbiBhbiBgLkFmdGVyKClgIGRvZXNuJ3QKK2FmZmVjdCB0aGUgbWVhbmluZyBvZiB0aGUgYC5BZnRlcigpYC4KKworIyMgU2VxdWVuY2VzICMjCisKK1doZW4geW91IGhhdmUgYSBsb25nIGNoYWluIG9mIHNlcXVlbnRpYWwgZXhwZWN0YXRpb25zLCBpdCdzIGVhc2llciB0bworc3BlY2lmeSB0aGUgb3JkZXIgdXNpbmcgKipzZXF1ZW5jZXMqKiwgd2hpY2ggZG9uJ3QgcmVxdWlyZSB5b3UgdG8gZ2l2ZW4KK2VhY2ggZXhwZWN0YXRpb24gaW4gdGhlIGNoYWluIGEgZGlmZmVyZW50IG5hbWUuICA8aT5BbGwgZXhwZWN0ZWQ8YnI+CitjYWxsczwvaT4gaW4gdGhlIHNhbWUgc2VxdWVuY2UgbXVzdCBvY2N1ciBpbiB0aGUgb3JkZXIgdGhleSBhcmUKK3NwZWNpZmllZC4KKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlNlcXVlbmNlOworU2VxdWVuY2UgczEsIHMyOworLi4uCitFWFBFQ1RfQ0FMTChmb28sIFJlc2V0KCkpCisgICAgLkluU2VxdWVuY2UoczEsIHMyKQorICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOworRVhQRUNUX0NBTEwoZm9vLCBHZXRTaXplKCkpCisgICAgLkluU2VxdWVuY2UoczEpCisgICAgLldpbGxPbmNlKFJldHVybigxKSk7CitFWFBFQ1RfQ0FMTChmb28sIERlc2NyaWJlKEE8Y29uc3QgY2hhcio+KCkpKQorICAgIC5JblNlcXVlbmNlKHMyKQorICAgIC5XaWxsT25jZShSZXR1cm4oImR1bW15IikpOworYGBgCitzYXlzIHRoYXQgYFJlc2V0KClgIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBfYm90aF8gYEdldFNpemUoKWAgX2FuZF8KK2BEZXNjcmliZSgpYCwgYW5kIHRoZSBsYXR0ZXIgdHdvIGNhbiBvY2N1ciBpbiBhbnkgb3JkZXIuCisKK1RvIHB1dCBtYW55IGV4cGVjdGF0aW9ucyBpbiBhIHNlcXVlbmNlIGNvbnZlbmllbnRseToKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpJblNlcXVlbmNlOworeworICBJblNlcXVlbmNlIGR1bW15OworCisgIEVYUEVDVF9DQUxMKC4uLikuLi47CisgIEVYUEVDVF9DQUxMKC4uLikuLi47CisgIC4uLgorICBFWFBFQ1RfQ0FMTCguLi4pLi4uOworfQorYGBgCitzYXlzIHRoYXQgYWxsIGV4cGVjdGVkIGNhbGxzIGluIHRoZSBzY29wZSBvZiBgZHVtbXlgIG11c3Qgb2NjdXIgaW4KK3N0cmljdCBvcmRlci4gVGhlIG5hbWUgYGR1bW15YCBpcyBpcnJlbGV2YW50LikKKworIyBWZXJpZnlpbmcgYW5kIFJlc2V0dGluZyBhIE1vY2sgIworCitHb29nbGUgTW9jayB3aWxsIHZlcmlmeSB0aGUgZXhwZWN0YXRpb25zIG9uIGEgbW9jayBvYmplY3Qgd2hlbiBpdCBpcyBkZXN0cnVjdGVkLCBvciB5b3UgY2FuIGRvIGl0IGVhcmxpZXI6CitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TW9jazsKKy4uLgorLy8gVmVyaWZpZXMgYW5kIHJlbW92ZXMgdGhlIGV4cGVjdGF0aW9ucyBvbiBtb2NrX29iajsKKy8vIHJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KK01vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX29iaik7CisuLi4KKy8vIFZlcmlmaWVzIGFuZCByZW1vdmVzIHRoZSBleHBlY3RhdGlvbnMgb24gbW9ja19vYmo7CisvLyBhbHNvIHJlbW92ZXMgdGhlIGRlZmF1bHQgYWN0aW9ucyBzZXQgYnkgT05fQ0FMTCgpOworLy8gcmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJm1vY2tfb2JqKTsKK2BgYAorCitZb3UgY2FuIGFsc28gdGVsbCBHb29nbGUgTW9jayB0aGF0IGEgbW9jayBvYmplY3QgY2FuIGJlIGxlYWtlZCBhbmQgZG9lc24ndAorbmVlZCB0byBiZSB2ZXJpZmllZDoKK2BgYAorTW9jazo6QWxsb3dMZWFrKCZtb2NrX29iaik7CitgYGAKKworIyBNb2NrIENsYXNzZXMgIworCitHb29nbGUgTW9jayBkZWZpbmVzIGEgY29udmVuaWVudCBtb2NrIGNsYXNzIHRlbXBsYXRlCitgYGAKK2NsYXNzIE1vY2tGdW5jdGlvbjxSKEExLCAuLi4sIEFuKT4geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0RuKENhbGwsIFIoQTEsIC4uLiwgQW4pKTsKK307CitgYGAKK1NlZSB0aGlzIFtyZWNpcGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjVXNpbmdfQ2hlY2tfUG9pbnRzKSBmb3Igb25lIGFwcGxpY2F0aW9uIG9mIGl0LgorCisjIEZsYWdzICMKKworfCBgLS1nbW9ja19jYXRjaF9sZWFrZWRfbW9ja3M9MGAgfCBEb24ndCByZXBvcnQgbGVha2VkIG1vY2sgb2JqZWN0cyBhcyBmYWlsdXJlcy4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgLS1nbW9ja192ZXJib3NlPUxFVkVMYCAgICAgICAgfCBTZXRzIHRoZSBkZWZhdWx0IHZlcmJvc2l0eSBsZXZlbCAoYGluZm9gLCBgd2FybmluZ2AsIG9yIGBlcnJvcmApIG9mIEdvb2dsZSBNb2NrIG1lc3NhZ2VzLiB8ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvQ29va0Jvb2subWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9Db29rQm9vay5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTBkM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvQ29va0Jvb2subWQKQEAgLTAsMCArMSwzNjc1IEBACisKKworWW91IGNhbiBmaW5kIHJlY2lwZXMgZm9yIHVzaW5nIEdvb2dsZSBNb2NrIGhlcmUuIElmIHlvdSBoYXZlbid0IHlldCwKK3BsZWFzZSByZWFkIHRoZSBbRm9yRHVtbWllc10oRm9yRHVtbWllcy5tZCkgZG9jdW1lbnQgZmlyc3QgdG8gbWFrZSBzdXJlIHlvdSB1bmRlcnN0YW5kCit0aGUgYmFzaWNzLgorCisqKk5vdGU6KiogR29vZ2xlIE1vY2sgbGl2ZXMgaW4gdGhlIGB0ZXN0aW5nYCBuYW1lIHNwYWNlLiBGb3IKK3JlYWRhYmlsaXR5LCBpdCBpcyByZWNvbW1lbmRlZCB0byB3cml0ZSBgdXNpbmcgOjp0ZXN0aW5nOjpGb287YCBvbmNlIGluCit5b3VyIGZpbGUgYmVmb3JlIHVzaW5nIHRoZSBuYW1lIGBGb29gIGRlZmluZWQgYnkgR29vZ2xlIE1vY2suIFdlIG9taXQKK3N1Y2ggYHVzaW5nYCBzdGF0ZW1lbnRzIGluIHRoaXMgcGFnZSBmb3IgYnJldml0eSwgYnV0IHlvdSBzaG91bGQgZG8gaXQKK2luIHlvdXIgb3duIGNvZGUuCisKKyMgQ3JlYXRpbmcgTW9jayBDbGFzc2VzICMKKworIyMgTW9ja2luZyBQcml2YXRlIG9yIFByb3RlY3RlZCBNZXRob2RzICMjCisKK1lvdSBtdXN0IGFsd2F5cyBwdXQgYSBtb2NrIG1ldGhvZCBkZWZpbml0aW9uIChgTU9DS19NRVRIT0QqYCkgaW4gYQorYHB1YmxpYzpgIHNlY3Rpb24gb2YgdGhlIG1vY2sgY2xhc3MsIHJlZ2FyZGxlc3Mgb2YgdGhlIG1ldGhvZCBiZWluZworbW9ja2VkIGJlaW5nIGBwdWJsaWNgLCBgcHJvdGVjdGVkYCwgb3IgYHByaXZhdGVgIGluIHRoZSBiYXNlIGNsYXNzLgorVGhpcyBhbGxvd3MgYE9OX0NBTExgIGFuZCBgRVhQRUNUX0NBTExgIHRvIHJlZmVyZW5jZSB0aGUgbW9jayBmdW5jdGlvbgorZnJvbSBvdXRzaWRlIG9mIHRoZSBtb2NrIGNsYXNzLiAgKFllcywgQysrIGFsbG93cyBhIHN1YmNsYXNzIHRvIGNoYW5nZQordGhlIGFjY2VzcyBsZXZlbCBvZiBhIHZpcnR1YWwgZnVuY3Rpb24gaW4gdGhlIGJhc2UgY2xhc3MuKSAgRXhhbXBsZToKKworYGBgCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBUcmFuc2Zvcm0oR2FkZ2V0KiBnKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBSZXN1bWUoKTsKKworIHByaXZhdGU6CisgIHZpcnR1YWwgaW50IEdldFRpbWVPdXQoKTsKK307CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC4uLgorICBNT0NLX01FVEhPRDEoVHJhbnNmb3JtLCBib29sKEdhZGdldCogZykpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBpbiB0aGUgcHVibGljIHNlY3Rpb24sIGV2ZW4gdGhvdWdoIHRoZQorICAvLyBtZXRob2RzIGFyZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZSBpbiB0aGUgYmFzZSBjbGFzcy4KKyAgTU9DS19NRVRIT0QwKFJlc3VtZSwgdm9pZCgpKTsKKyAgTU9DS19NRVRIT0QwKEdldFRpbWVPdXQsIGludCgpKTsKK307CitgYGAKKworIyMgTW9ja2luZyBPdmVybG9hZGVkIE1ldGhvZHMgIyMKKworWW91IGNhbiBtb2NrIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFzIHVzdWFsLiBObyBzcGVjaWFsIGF0dGVudGlvbiBpcyByZXF1aXJlZDoKKworYGBgCitjbGFzcyBGb28geworICAuLi4KKworICAvLyBNdXN0IGJlIHZpcnR1YWwgYXMgd2UnbGwgaW5oZXJpdCBmcm9tIEZvby4KKyAgdmlydHVhbCB+Rm9vKCk7CisKKyAgLy8gT3ZlcmxvYWRlZCBvbiB0aGUgdHlwZXMgYW5kL29yIG51bWJlcnMgb2YgYXJndW1lbnRzLgorICB2aXJ0dWFsIGludCBBZGQoRWxlbWVudCB4KTsKKyAgdmlydHVhbCBpbnQgQWRkKGludCB0aW1lcywgRWxlbWVudCB4KTsKKworICAvLyBPdmVybG9hZGVkIG9uIHRoZSBjb25zdC1uZXNzIG9mIHRoaXMgb2JqZWN0LgorICB2aXJ0dWFsIEJhciYgR2V0QmFyKCk7CisgIHZpcnR1YWwgY29uc3QgQmFyJiBHZXRCYXIoKSBjb25zdDsKK307CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgLi4uCisgIE1PQ0tfTUVUSE9EMShBZGQsIGludChFbGVtZW50IHgpKTsKKyAgTU9DS19NRVRIT0QyKEFkZCwgaW50KGludCB0aW1lcywgRWxlbWVudCB4KTsKKworICBNT0NLX01FVEhPRDAoR2V0QmFyLCBCYXImKCkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0QmFyLCBjb25zdCBCYXImKCkpOworfTsKK2BgYAorCisqKk5vdGU6KiogaWYgeW91IGRvbid0IG1vY2sgYWxsIHZlcnNpb25zIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZCwgdGhlCitjb21waWxlciB3aWxsIGdpdmUgeW91IGEgd2FybmluZyBhYm91dCBzb21lIG1ldGhvZHMgaW4gdGhlIGJhc2UgY2xhc3MKK2JlaW5nIGhpZGRlbi4gVG8gZml4IHRoYXQsIHVzZSBgdXNpbmdgIHRvIGJyaW5nIHRoZW0gaW4gc2NvcGU6CisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgdXNpbmcgRm9vOjpBZGQ7CisgIE1PQ0tfTUVUSE9EMShBZGQsIGludChFbGVtZW50IHgpKTsKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBtb2NrIGludCBBZGQoaW50IHRpbWVzLCBFbGVtZW50IHgpOworICAuLi4KK307CitgYGAKKworIyMgTW9ja2luZyBDbGFzcyBUZW1wbGF0ZXMgIyMKKworVG8gbW9jayBhIGNsYXNzIHRlbXBsYXRlLCBhcHBlbmQgYF9UYCB0byB0aGUgYE1PQ0tfKmAgbWFjcm9zOgorCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtPgorY2xhc3MgU3RhY2tJbnRlcmZhY2UgeworICAuLi4KKyAgLy8gTXVzdCBiZSB2aXJ0dWFsIGFzIHdlJ2xsIGluaGVyaXQgZnJvbSBTdGFja0ludGVyZmFjZS4KKyAgdmlydHVhbCB+U3RhY2tJbnRlcmZhY2UoKTsKKworICB2aXJ0dWFsIGludCBHZXRTaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgUHVzaChjb25zdCBFbGVtJiB4KSA9IDA7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbT4KK2NsYXNzIE1vY2tTdGFjayA6IHB1YmxpYyBTdGFja0ludGVyZmFjZTxFbGVtPiB7CisgIC4uLgorICBNT0NLX0NPTlNUX01FVEhPRDBfVChHZXRTaXplLCBpbnQoKSk7CisgIE1PQ0tfTUVUSE9EMV9UKFB1c2gsIHZvaWQoY29uc3QgRWxlbSYgeCkpOworfTsKK2BgYAorCisjIyBNb2NraW5nIE5vbnZpcnR1YWwgTWV0aG9kcyAjIworCitHb29nbGUgTW9jayBjYW4gbW9jayBub24tdmlydHVhbCBmdW5jdGlvbnMgdG8gYmUgdXNlZCBpbiB3aGF0IHdlIGNhbGwgX2hpLXBlcmYKK2RlcGVuZGVuY3kgaW5qZWN0aW9uXy4KKworSW4gdGhpcyBjYXNlLCBpbnN0ZWFkIG9mIHNoYXJpbmcgYSBjb21tb24gYmFzZSBjbGFzcyB3aXRoIHRoZSByZWFsCitjbGFzcywgeW91ciBtb2NrIGNsYXNzIHdpbGwgYmUgX3VucmVsYXRlZF8gdG8gdGhlIHJlYWwgY2xhc3MsIGJ1dAorY29udGFpbiBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlcy4gIFRoZSBzeW50YXggZm9yIG1vY2tpbmcKK25vbi12aXJ0dWFsIG1ldGhvZHMgaXMgdGhlIF9zYW1lXyBhcyBtb2NraW5nIHZpcnR1YWwgbWV0aG9kczoKKworYGBgCisvLyBBIHNpbXBsZSBwYWNrZXQgc3RyZWFtIGNsYXNzLiAgTm9uZSBvZiBpdHMgbWVtYmVycyBpcyB2aXJ0dWFsLgorY2xhc3MgQ29uY3JldGVQYWNrZXRTdHJlYW0geworIHB1YmxpYzoKKyAgdm9pZCBBcHBlbmRQYWNrZXQoUGFja2V0KiBuZXdfcGFja2V0KTsKKyAgY29uc3QgUGFja2V0KiBHZXRQYWNrZXQoc2l6ZV90IHBhY2tldF9udW1iZXIpIGNvbnN0OworICBzaXplX3QgTnVtYmVyT2ZQYWNrZXRzKCkgY29uc3Q7CisgIC4uLgorfTsKKworLy8gQSBtb2NrIHBhY2tldCBzdHJlYW0gY2xhc3MuICBJdCBpbmhlcml0cyBmcm9tIG5vIG90aGVyLCBidXQgZGVmaW5lcworLy8gR2V0UGFja2V0KCkgYW5kIE51bWJlck9mUGFja2V0cygpLgorY2xhc3MgTW9ja1BhY2tldFN0cmVhbSB7CisgcHVibGljOgorICBNT0NLX0NPTlNUX01FVEhPRDEoR2V0UGFja2V0LCBjb25zdCBQYWNrZXQqKHNpemVfdCBwYWNrZXRfbnVtYmVyKSk7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMChOdW1iZXJPZlBhY2tldHMsIHNpemVfdCgpKTsKKyAgLi4uCit9OworYGBgCisKK05vdGUgdGhhdCB0aGUgbW9jayBjbGFzcyBkb2Vzbid0IGRlZmluZSBgQXBwZW5kUGFja2V0KClgLCB1bmxpa2UgdGhlCityZWFsIGNsYXNzLiBUaGF0J3MgZmluZSBhcyBsb25nIGFzIHRoZSB0ZXN0IGRvZXNuJ3QgbmVlZCB0byBjYWxsIGl0LgorCitOZXh0LCB5b3UgbmVlZCBhIHdheSB0byBzYXkgdGhhdCB5b3Ugd2FudCB0byB1c2UKK2BDb25jcmV0ZVBhY2tldFN0cmVhbWAgaW4gcHJvZHVjdGlvbiBjb2RlLCBhbmQgdXNlIGBNb2NrUGFja2V0U3RyZWFtYAoraW4gdGVzdHMuICBTaW5jZSB0aGUgZnVuY3Rpb25zIGFyZSBub3QgdmlydHVhbCBhbmQgdGhlIHR3byBjbGFzc2VzIGFyZQordW5yZWxhdGVkLCB5b3UgbXVzdCBzcGVjaWZ5IHlvdXIgY2hvaWNlIGF0IF9jb21waWxlIHRpbWVfIChhcyBvcHBvc2VkCit0byBydW4gdGltZSkuCisKK09uZSB3YXkgdG8gZG8gaXQgaXMgdG8gdGVtcGxhdGl6ZSB5b3VyIGNvZGUgdGhhdCBuZWVkcyB0byB1c2UgYSBwYWNrZXQKK3N0cmVhbS4gIE1vcmUgc3BlY2lmaWNhbGx5LCB5b3Ugd2lsbCBnaXZlIHlvdXIgY29kZSBhIHRlbXBsYXRlIHR5cGUKK2FyZ3VtZW50IGZvciB0aGUgdHlwZSBvZiB0aGUgcGFja2V0IHN0cmVhbS4gIEluIHByb2R1Y3Rpb24sIHlvdSB3aWxsCitpbnN0YW50aWF0ZSB5b3VyIHRlbXBsYXRlIHdpdGggYENvbmNyZXRlUGFja2V0U3RyZWFtYCBhcyB0aGUgdHlwZQorYXJndW1lbnQuICBJbiB0ZXN0cywgeW91IHdpbGwgaW5zdGFudGlhdGUgdGhlIHNhbWUgdGVtcGxhdGUgd2l0aAorYE1vY2tQYWNrZXRTdHJlYW1gLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkgd3JpdGU6CisKK2BgYAordGVtcGxhdGUgPGNsYXNzIFBhY2tldFN0cmVhbT4KK3ZvaWQgQ3JlYXRlQ29ubmVjdGlvbihQYWNrZXRTdHJlYW0qIHN0cmVhbSkgeyAuLi4gfQorCit0ZW1wbGF0ZSA8Y2xhc3MgUGFja2V0U3RyZWFtPgorY2xhc3MgUGFja2V0UmVhZGVyIHsKKyBwdWJsaWM6CisgIHZvaWQgUmVhZFBhY2tldHMoUGFja2V0U3RyZWFtKiBzdHJlYW0sIHNpemVfdCBwYWNrZXRfbnVtKTsKK307CitgYGAKKworVGhlbiB5b3UgY2FuIHVzZSBgQ3JlYXRlQ29ubmVjdGlvbjxDb25jcmV0ZVBhY2tldFN0cmVhbT4oKWAgYW5kCitgUGFja2V0UmVhZGVyPENvbmNyZXRlUGFja2V0U3RyZWFtPmAgaW4gcHJvZHVjdGlvbiBjb2RlLCBhbmQgdXNlCitgQ3JlYXRlQ29ubmVjdGlvbjxNb2NrUGFja2V0U3RyZWFtPigpYCBhbmQKK2BQYWNrZXRSZWFkZXI8TW9ja1BhY2tldFN0cmVhbT5gIGluIHRlc3RzLgorCitgYGAKKyAgTW9ja1BhY2tldFN0cmVhbSBtb2NrX3N0cmVhbTsKKyAgRVhQRUNUX0NBTEwobW9ja19zdHJlYW0sIC4uLikuLi47CisgIC4uIHNldCBtb3JlIGV4cGVjdGF0aW9ucyBvbiBtb2NrX3N0cmVhbSAuLi4KKyAgUGFja2V0UmVhZGVyPE1vY2tQYWNrZXRTdHJlYW0+IHJlYWRlcigmbW9ja19zdHJlYW0pOworICAuLi4gZXhlcmNpc2UgcmVhZGVyIC4uLgorYGBgCisKKyMjIE1vY2tpbmcgRnJlZSBGdW5jdGlvbnMgIyMKKworSXQncyBwb3NzaWJsZSB0byB1c2UgR29vZ2xlIE1vY2sgdG8gbW9jayBhIGZyZWUgZnVuY3Rpb24gKGkuZS4gYQorQy1zdHlsZSBmdW5jdGlvbiBvciBhIHN0YXRpYyBtZXRob2QpLiAgWW91IGp1c3QgbmVlZCB0byByZXdyaXRlIHlvdXIKK2NvZGUgdG8gdXNlIGFuIGludGVyZmFjZSAoYWJzdHJhY3QgY2xhc3MpLgorCitJbnN0ZWFkIG9mIGNhbGxpbmcgYSBmcmVlIGZ1bmN0aW9uIChzYXksIGBPcGVuRmlsZWApIGRpcmVjdGx5LAoraW50cm9kdWNlIGFuIGludGVyZmFjZSBmb3IgaXQgYW5kIGhhdmUgYSBjb25jcmV0ZSBzdWJjbGFzcyB0aGF0IGNhbGxzCit0aGUgZnJlZSBmdW5jdGlvbjoKKworYGBgCitjbGFzcyBGaWxlSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgT3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlKSA9IDA7Cit9OworCitjbGFzcyBGaWxlIDogcHVibGljIEZpbGVJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBPcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsKKyAgICByZXR1cm4gT3BlbkZpbGUocGF0aCwgbW9kZSk7CisgIH0KK307CitgYGAKKworWW91ciBjb2RlIHNob3VsZCB0YWxrIHRvIGBGaWxlSW50ZXJmYWNlYCB0byBvcGVuIGEgZmlsZS4gIE5vdyBpdCdzCitlYXN5IHRvIG1vY2sgb3V0IHRoZSBmdW5jdGlvbi4KKworVGhpcyBtYXkgc2VlbSBtdWNoIGhhc3NsZSwgYnV0IGluIHByYWN0aWNlIHlvdSBvZnRlbiBoYXZlIG11bHRpcGxlCityZWxhdGVkIGZ1bmN0aW9ucyB0aGF0IHlvdSBjYW4gcHV0IGluIHRoZSBzYW1lIGludGVyZmFjZSwgc28gdGhlCitwZXItZnVuY3Rpb24gc3ludGFjdGljIG92ZXJoZWFkIHdpbGwgYmUgbXVjaCBsb3dlci4KKworSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgdGhlIHBlcmZvcm1hbmNlIG92ZXJoZWFkIGluY3VycmVkIGJ5Cit2aXJ0dWFsIGZ1bmN0aW9ucywgYW5kIHByb2ZpbGluZyBjb25maXJtcyB5b3VyIGNvbmNlcm4sIHlvdSBjYW4KK2NvbWJpbmUgdGhpcyB3aXRoIHRoZSByZWNpcGUgZm9yIFttb2NraW5nIG5vbi12aXJ0dWFsIG1ldGhvZHNdKCNNb2NraW5nX05vbnZpcnR1YWxfTWV0aG9kcy5tZCkuCisKKyMjIFRoZSBOaWNlLCB0aGUgU3RyaWN0LCBhbmQgdGhlIE5hZ2d5ICMjCisKK0lmIGEgbW9jayBtZXRob2QgaGFzIG5vIGBFWFBFQ1RfQ0FMTGAgc3BlYyBidXQgaXMgY2FsbGVkLCBHb29nbGUgTW9jaword2lsbCBwcmludCBhIHdhcm5pbmcgYWJvdXQgdGhlICJ1bmludGVyZXN0aW5nIGNhbGwiLiBUaGUgcmF0aW9uYWxlIGlzOgorCisgICogTmV3IG1ldGhvZHMgbWF5IGJlIGFkZGVkIHRvIGFuIGludGVyZmFjZSBhZnRlciBhIHRlc3QgaXMgd3JpdHRlbi4gV2Ugc2hvdWxkbid0IGZhaWwgYSB0ZXN0IGp1c3QgYmVjYXVzZSBhIG1ldGhvZCBpdCBkb2Vzbid0IGtub3cgYWJvdXQgaXMgY2FsbGVkLgorICAqIEhvd2V2ZXIsIHRoaXMgbWF5IGFsc28gbWVhbiB0aGVyZSdzIGEgYnVnIGluIHRoZSB0ZXN0LCBzbyBHb29nbGUgTW9jayBzaG91bGRuJ3QgYmUgc2lsZW50IGVpdGhlci4gSWYgdGhlIHVzZXIgYmVsaWV2ZXMgdGhlc2UgY2FsbHMgYXJlIGhhcm1sZXNzLCBoZSBjYW4gYWRkIGFuIGBFWFBFQ1RfQ0FMTCgpYCB0byBzdXBwcmVzcyB0aGUgd2FybmluZy4KKworSG93ZXZlciwgc29tZXRpbWVzIHlvdSBtYXkgd2FudCB0byBzdXBwcmVzcyBhbGwgInVuaW50ZXJlc3RpbmcgY2FsbCIKK3dhcm5pbmdzLCB3aGlsZSBzb21ldGltZXMgeW91IG1heSB3YW50IHRoZSBvcHBvc2l0ZSwgaS5lLiB0byB0cmVhdCBhbGwKK29mIHRoZW0gYXMgZXJyb3JzLiBHb29nbGUgTW9jayBsZXRzIHlvdSBtYWtlIHRoZSBkZWNpc2lvbiBvbiBhCitwZXItbW9jay1vYmplY3QgYmFzaXMuCisKK1N1cHBvc2UgeW91ciB0ZXN0IHVzZXMgYSBtb2NrIGNsYXNzIGBNb2NrRm9vYDoKKworYGBgCitURVNUKC4uLikgeworICBNb2NrRm9vIG1vY2tfZm9vOworICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgRG9UaGlzKCkpOworICAuLi4gY29kZSB0aGF0IHVzZXMgbW9ja19mb28gLi4uCit9CitgYGAKKworSWYgYSBtZXRob2Qgb2YgYG1vY2tfZm9vYCBvdGhlciB0aGFuIGBEb1RoaXMoKWAgaXMgY2FsbGVkLCBpdCB3aWxsIGJlCityZXBvcnRlZCBieSBHb29nbGUgTW9jayBhcyBhIHdhcm5pbmcuIEhvd2V2ZXIsIGlmIHlvdSByZXdyaXRlIHlvdXIKK3Rlc3QgdG8gdXNlIGBOaWNlTW9jazxNb2NrRm9vPmAgaW5zdGVhZCwgdGhlIHdhcm5pbmcgd2lsbCBiZSBnb25lLAorcmVzdWx0aW5nIGluIGEgY2xlYW5lciB0ZXN0IG91dHB1dDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok5pY2VNb2NrOworCitURVNUKC4uLikgeworICBOaWNlTW9jazxNb2NrRm9vPiBtb2NrX2ZvbzsKKyAgRVhQRUNUX0NBTEwobW9ja19mb28sIERvVGhpcygpKTsKKyAgLi4uIGNvZGUgdGhhdCB1c2VzIG1vY2tfZm9vIC4uLgorfQorYGBgCisKK2BOaWNlTW9jazxNb2NrRm9vPmAgaXMgYSBzdWJjbGFzcyBvZiBgTW9ja0Zvb2AsIHNvIGl0IGNhbiBiZSB1c2VkCit3aGVyZXZlciBgTW9ja0Zvb2AgaXMgYWNjZXB0ZWQuCisKK0l0IGFsc28gd29ya3MgaWYgYE1vY2tGb29gJ3MgY29uc3RydWN0b3IgdGFrZXMgc29tZSBhcmd1bWVudHMsIGFzCitgTmljZU1vY2s8TW9ja0Zvbz5gICJpbmhlcml0cyIgYE1vY2tGb29gJ3MgY29uc3RydWN0b3JzOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TmljZU1vY2s7CisKK1RFU1QoLi4uKSB7CisgIE5pY2VNb2NrPE1vY2tGb28+IG1vY2tfZm9vKDUsICJoaSIpOyAgLy8gQ2FsbHMgTW9ja0Zvbyg1LCAiaGkiKS4KKyAgRVhQRUNUX0NBTEwobW9ja19mb28sIERvVGhpcygpKTsKKyAgLi4uIGNvZGUgdGhhdCB1c2VzIG1vY2tfZm9vIC4uLgorfQorYGBgCisKK1RoZSB1c2FnZSBvZiBgU3RyaWN0TW9ja2AgaXMgc2ltaWxhciwgZXhjZXB0IHRoYXQgaXQgbWFrZXMgYWxsCit1bmludGVyZXN0aW5nIGNhbGxzIGZhaWx1cmVzOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6U3RyaWN0TW9jazsKKworVEVTVCguLi4pIHsKKyAgU3RyaWN0TW9jazxNb2NrRm9vPiBtb2NrX2ZvbzsKKyAgRVhQRUNUX0NBTEwobW9ja19mb28sIERvVGhpcygpKTsKKyAgLi4uIGNvZGUgdGhhdCB1c2VzIG1vY2tfZm9vIC4uLgorCisgIC8vIFRoZSB0ZXN0IHdpbGwgZmFpbCBpZiBhIG1ldGhvZCBvZiBtb2NrX2ZvbyBvdGhlciB0aGFuIERvVGhpcygpCisgIC8vIGlzIGNhbGxlZC4KK30KK2BgYAorCitUaGVyZSBhcmUgc29tZSBjYXZlYXRzIHRob3VnaCAoSSBkb24ndCBsaWtlIHRoZW0ganVzdCBhcyBtdWNoIGFzIHRoZQorbmV4dCBndXksIGJ1dCBzYWRseSB0aGV5IGFyZSBzaWRlIGVmZmVjdHMgb2YgQysrJ3MgbGltaXRhdGlvbnMpOgorCisgIDEuIGBOaWNlTW9jazxNb2NrRm9vPmAgYW5kIGBTdHJpY3RNb2NrPE1vY2tGb28+YCBvbmx5IHdvcmsgZm9yIG1vY2sgbWV0aG9kcyBkZWZpbmVkIHVzaW5nIHRoZSBgTU9DS19NRVRIT0QqYCBmYW1pbHkgb2YgbWFjcm9zICoqZGlyZWN0bHkqKiBpbiB0aGUgYE1vY2tGb29gIGNsYXNzLiBJZiBhIG1vY2sgbWV0aG9kIGlzIGRlZmluZWQgaW4gYSAqKmJhc2UgY2xhc3MqKiBvZiBgTW9ja0Zvb2AsIHRoZSAibmljZSIgb3IgInN0cmljdCIgbW9kaWZpZXIgbWF5IG5vdCBhZmZlY3QgaXQsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIuIEluIHBhcnRpY3VsYXIsIG5lc3RpbmcgYE5pY2VNb2NrYCBhbmQgYFN0cmljdE1vY2tgIChlLmcuIGBOaWNlTW9jazxTdHJpY3RNb2NrPE1vY2tGb28+ID5gKSBpcyAqKm5vdCoqIHN1cHBvcnRlZC4KKyAgMS4gVGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgYmFzZSBtb2NrIChgTW9ja0Zvb2ApIGNhbm5vdCBoYXZlIGFyZ3VtZW50cyBwYXNzZWQgYnkgbm9uLWNvbnN0IHJlZmVyZW5jZSwgd2hpY2ggaGFwcGVucyB0byBiZSBiYW5uZWQgYnkgdGhlIFtHb29nbGUgQysrIHN0eWxlIGd1aWRlXShodHRwOi8vZ29vZ2xlLXN0eWxlZ3VpZGUuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL2NwcGd1aWRlLnhtbCkuCisgIDEuIER1cmluZyB0aGUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBvZiBgTW9ja0Zvb2AsIHRoZSBtb2NrIG9iamVjdCBpcyBfbm90XyBuaWNlIG9yIHN0cmljdC4gIFRoaXMgbWF5IGNhdXNlIHN1cnByaXNlcyBpZiB0aGUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBjYWxscyBhIG1vY2sgbWV0aG9kIG9uIGB0aGlzYCBvYmplY3QuIChUaGlzIGJlaGF2aW9yLCBob3dldmVyLCBpcyBjb25zaXN0ZW50IHdpdGggQysrJ3MgZ2VuZXJhbCBydWxlOiBpZiBhIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgY2FsbHMgYSB2aXJ0dWFsIG1ldGhvZCBvZiBgdGhpc2Agb2JqZWN0LCB0aGF0IG1ldGhvZCBpcyB0cmVhdGVkIGFzIG5vbi12aXJ0dWFsLiAgSW4gb3RoZXIgd29yZHMsIHRvIHRoZSBiYXNlIGNsYXNzJ3MgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciwgYHRoaXNgIG9iamVjdCBiZWhhdmVzIGxpa2UgYW4gaW5zdGFuY2Ugb2YgdGhlIGJhc2UgY2xhc3MsIG5vdCB0aGUgZGVyaXZlZCBjbGFzcy4gIFRoaXMgcnVsZSBpcyByZXF1aXJlZCBmb3Igc2FmZXR5LiAgT3RoZXJ3aXNlIGEgYmFzZSBjb25zdHJ1Y3RvciBtYXkgdXNlIG1lbWJlcnMgb2YgYSBkZXJpdmVkIGNsYXNzIGJlZm9yZSB0aGV5IGFyZSBpbml0aWFsaXplZCwgb3IgYSBiYXNlIGRlc3RydWN0b3IgbWF5IHVzZSBtZW1iZXJzIG9mIGEgZGVyaXZlZCBjbGFzcyBhZnRlciB0aGV5IGhhdmUgYmVlbiBkZXN0cm95ZWQuKQorCitGaW5hbGx5LCB5b3Ugc2hvdWxkIGJlICoqdmVyeSBjYXV0aW91cyoqIGFib3V0IHdoZW4gdG8gdXNlIG5hZ2d5IG9yIHN0cmljdCBtb2NrcywgYXMgdGhleSB0ZW5kIHRvIG1ha2UgdGVzdHMgbW9yZSBicml0dGxlIGFuZCBoYXJkZXIgdG8gbWFpbnRhaW4uIFdoZW4geW91IHJlZmFjdG9yIHlvdXIgY29kZSB3aXRob3V0IGNoYW5naW5nIGl0cyBleHRlcm5hbGx5IHZpc2libGUgYmVoYXZpb3IsIGlkZWFsbHkgeW91IHNob3VsZCd0IG5lZWQgdG8gdXBkYXRlIGFueSB0ZXN0cy4gSWYgeW91ciBjb2RlIGludGVyYWN0cyB3aXRoIGEgbmFnZ3kgbW9jaywgaG93ZXZlciwgeW91IG1heSBzdGFydCB0byBnZXQgc3BhbW1lZCB3aXRoIHdhcm5pbmdzIGFzIHRoZSByZXN1bHQgb2YgeW91ciBjaGFuZ2UuIFdvcnNlLCBpZiB5b3VyIGNvZGUgaW50ZXJhY3RzIHdpdGggYSBzdHJpY3QgbW9jaywgeW91ciB0ZXN0cyBtYXkgc3RhcnQgdG8gZmFpbCBhbmQgeW91J2xsIGJlIGZvcmNlZCB0byBmaXggdGhlbS4gT3VyIGdlbmVyYWwgcmVjb21tZW5kYXRpb24gaXMgdG8gdXNlIG5pY2UgbW9ja3MgKG5vdCB5ZXQgdGhlIGRlZmF1bHQpIG1vc3Qgb2YgdGhlIHRpbWUsIHVzZSBuYWdneSBtb2NrcyAodGhlIGN1cnJlbnQgZGVmYXVsdCkgd2hlbiBkZXZlbG9waW5nIG9yIGRlYnVnZ2luZyB0ZXN0cywgYW5kIHVzZSBzdHJpY3QgbW9ja3Mgb25seSBhcyB0aGUgbGFzdCByZXNvcnQuCisKKyMjIFNpbXBsaWZ5aW5nIHRoZSBJbnRlcmZhY2Ugd2l0aG91dCBCcmVha2luZyBFeGlzdGluZyBDb2RlICMjCisKK1NvbWV0aW1lcyBhIG1ldGhvZCBoYXMgYSBsb25nIGxpc3Qgb2YgYXJndW1lbnRzIHRoYXQgaXMgbW9zdGx5Cit1bmludGVyZXN0aW5nLiBGb3IgZXhhbXBsZSwKKworYGBgCitjbGFzcyBMb2dTaW5rIHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIHZvaWQgc2VuZChMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZnVsbF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYmFzZV9maWxlbmFtZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0bSogdG1fdGltZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VfbGVuKSA9IDA7Cit9OworYGBgCisKK1RoaXMgbWV0aG9kJ3MgYXJndW1lbnQgbGlzdCBpcyBsZW5ndGh5IGFuZCBoYXJkIHRvIHdvcmsgd2l0aCAobGV0J3MKK3NheSB0aGF0IHRoZSBgbWVzc2FnZWAgYXJndW1lbnQgaXMgbm90IGV2ZW4gMC10ZXJtaW5hdGVkKS4gSWYgd2UgbW9jaworaXQgYXMgaXMsIHVzaW5nIHRoZSBtb2NrIHdpbGwgYmUgYXdrd2FyZC4gSWYsIGhvd2V2ZXIsIHdlIHRyeSB0bworc2ltcGxpZnkgdGhpcyBpbnRlcmZhY2UsIHdlJ2xsIG5lZWQgdG8gZml4IGFsbCBjbGllbnRzIGRlcGVuZGluZyBvbgoraXQsIHdoaWNoIGlzIG9mdGVuIGluZmVhc2libGUuCisKK1RoZSB0cmljayBpcyB0byByZS1kaXNwYXRjaCB0aGUgbWV0aG9kIGluIHRoZSBtb2NrIGNsYXNzOgorCitgYGAKK2NsYXNzIFNjb3BlZE1vY2tMb2cgOiBwdWJsaWMgTG9nU2luayB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCB2b2lkIHNlbmQoTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqIGZ1bGxfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJhc2VfZmlsZW5hbWUsIGludCBsaW5lLCBjb25zdCB0bSogdG1fdGltZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VfbGVuKSB7CisgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgbG9nIHNldmVyaXR5LCBmdWxsIGZpbGUgbmFtZSwgYW5kCisgICAgLy8gbG9nIG1lc3NhZ2UuCisgICAgTG9nKHNldmVyaXR5LCBmdWxsX2ZpbGVuYW1lLCBzdGQ6OnN0cmluZyhtZXNzYWdlLCBtZXNzYWdlX2xlbikpOworICB9CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgbW9jayBtZXRob2Q6CisgIC8vCisgIC8vICAgdm9pZCBMb2coTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgIC8vICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgsCisgIC8vICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKTsKKyAgTU9DS19NRVRIT0QzKExvZywgdm9pZChMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSk7Cit9OworYGBgCisKK0J5IGRlZmluaW5nIGEgbmV3IG1vY2sgbWV0aG9kIHdpdGggYSB0cmltbWVkIGFyZ3VtZW50IGxpc3QsIHdlIG1ha2UKK3RoZSBtb2NrIGNsYXNzIG11Y2ggbW9yZSB1c2VyLWZyaWVuZGx5LgorCisjIyBBbHRlcm5hdGl2ZSB0byBNb2NraW5nIENvbmNyZXRlIENsYXNzZXMgIyMKKworT2Z0ZW4geW91IG1heSBmaW5kIHlvdXJzZWxmIHVzaW5nIGNsYXNzZXMgdGhhdCBkb24ndCBpbXBsZW1lbnQKK2ludGVyZmFjZXMuIEluIG9yZGVyIHRvIHRlc3QgeW91ciBjb2RlIHRoYXQgdXNlcyBzdWNoIGEgY2xhc3MgKGxldCdzCitjYWxsIGl0IGBDb25jcmV0ZWApLCB5b3UgbWF5IGJlIHRlbXB0ZWQgdG8gbWFrZSB0aGUgbWV0aG9kcyBvZgorYENvbmNyZXRlYCB2aXJ0dWFsIGFuZCB0aGVuIG1vY2sgaXQuCisKK1RyeSBub3QgdG8gZG8gdGhhdC4KKworTWFraW5nIGEgbm9uLXZpcnR1YWwgZnVuY3Rpb24gdmlydHVhbCBpcyBhIGJpZyBkZWNpc2lvbi4gSXQgY3JlYXRlcyBhbgorZXh0ZW5zaW9uIHBvaW50IHdoZXJlIHN1YmNsYXNzZXMgY2FuIHR3ZWFrIHlvdXIgY2xhc3MnIGJlaGF2aW9yLiBUaGlzCit3ZWFrZW5zIHlvdXIgY29udHJvbCBvbiB0aGUgY2xhc3MgYmVjYXVzZSBub3cgaXQncyBoYXJkZXIgdG8gbWFpbnRhaW4KK3RoZSBjbGFzcycgaW52YXJpYW50cy4gWW91IHNob3VsZCBtYWtlIGEgZnVuY3Rpb24gdmlydHVhbCBvbmx5IHdoZW4KK3RoZXJlIGlzIGEgdmFsaWQgcmVhc29uIGZvciBhIHN1YmNsYXNzIHRvIG92ZXJyaWRlIGl0LgorCitNb2NraW5nIGNvbmNyZXRlIGNsYXNzZXMgZGlyZWN0bHkgaXMgcHJvYmxlbWF0aWMgYXMgaXQgY3JlYXRlcyBhIHRpZ2h0Citjb3VwbGluZyBiZXR3ZWVuIHRoZSBjbGFzcyBhbmQgdGhlIHRlc3RzIC0gYW55IHNtYWxsIGNoYW5nZSBpbiB0aGUKK2NsYXNzIG1heSBpbnZhbGlkYXRlIHlvdXIgdGVzdHMgYW5kIG1ha2UgdGVzdCBtYWludGVuYW5jZSBhIHBhaW4uCisKK1RvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIG1hbnkgcHJvZ3JhbW1lcnMgaGF2ZSBiZWVuIHByYWN0aWNpbmcgImNvZGluZwordG8gaW50ZXJmYWNlcyI6IGluc3RlYWQgb2YgdGFsa2luZyB0byB0aGUgYENvbmNyZXRlYCBjbGFzcywgeW91ciBjb2RlCit3b3VsZCBkZWZpbmUgYW4gaW50ZXJmYWNlIGFuZCB0YWxrIHRvIGl0LiBUaGVuIHlvdSBpbXBsZW1lbnQgdGhhdAoraW50ZXJmYWNlIGFzIGFuIGFkYXB0b3Igb24gdG9wIG9mIGBDb25jcmV0ZWAuIEluIHRlc3RzLCB5b3UgY2FuIGVhc2lseQorbW9jayB0aGF0IGludGVyZmFjZSB0byBvYnNlcnZlIGhvdyB5b3VyIGNvZGUgaXMgZG9pbmcuCisKK1RoaXMgdGVjaG5pcXVlIGluY3VycyBzb21lIG92ZXJoZWFkOgorCisgICogWW91IHBheSB0aGUgY29zdCBvZiB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzICh1c3VhbGx5IG5vdCBhIHByb2JsZW0pLgorICAqIFRoZXJlIGlzIG1vcmUgYWJzdHJhY3Rpb24gZm9yIHRoZSBwcm9ncmFtbWVycyB0byBsZWFybi4KKworSG93ZXZlciwgaXQgY2FuIGFsc28gYnJpbmcgc2lnbmlmaWNhbnQgYmVuZWZpdHMgaW4gYWRkaXRpb24gdG8gYmV0dGVyCit0ZXN0YWJpbGl0eToKKworICAqIGBDb25jcmV0ZWAncyBBUEkgbWF5IG5vdCBmaXQgeW91ciBwcm9ibGVtIGRvbWFpbiB2ZXJ5IHdlbGwsIGFzIHlvdSBtYXkgbm90IGJlIHRoZSBvbmx5IGNsaWVudCBpdCB0cmllcyB0byBzZXJ2ZS4gQnkgZGVzaWduaW5nIHlvdXIgb3duIGludGVyZmFjZSwgeW91IGhhdmUgYSBjaGFuY2UgdG8gdGFpbG9yIGl0IHRvIHlvdXIgbmVlZCAtIHlvdSBtYXkgYWRkIGhpZ2hlci1sZXZlbCBmdW5jdGlvbmFsaXRpZXMsIHJlbmFtZSBzdHVmZiwgZXRjIGluc3RlYWQgb2YganVzdCB0cmltbWluZyB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSB5b3VyIGNvZGUgKHVzZXIgb2YgdGhlIGludGVyZmFjZSkgaW4gYSBtb3JlIG5hdHVyYWwgd2F5LCB3aGljaCBtZWFucyBpdCB3aWxsIGJlIG1vcmUgcmVhZGFibGUsIG1vcmUgbWFpbnRhaW5hYmxlLCBhbmQgeW91J2xsIGJlIG1vcmUgcHJvZHVjdGl2ZS4KKyAgKiBJZiBgQ29uY3JldGVgJ3MgaW1wbGVtZW50YXRpb24gZXZlciBoYXMgdG8gY2hhbmdlLCB5b3UgZG9uJ3QgaGF2ZSB0byByZXdyaXRlIGV2ZXJ5d2hlcmUgaXQgaXMgdXNlZC4gSW5zdGVhZCwgeW91IGNhbiBhYnNvcmIgdGhlIGNoYW5nZSBpbiB5b3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UsIGFuZCB5b3VyIG90aGVyIGNvZGUgYW5kIHRlc3RzIHdpbGwgYmUgaW5zdWxhdGVkIGZyb20gdGhpcyBjaGFuZ2UuCisKK1NvbWUgcGVvcGxlIHdvcnJ5IHRoYXQgaWYgZXZlcnlvbmUgaXMgcHJhY3RpY2luZyB0aGlzIHRlY2huaXF1ZSwgdGhleQord2lsbCBlbmQgdXAgd3JpdGluZyBsb3RzIG9mIHJlZHVuZGFudCBjb2RlLiBUaGlzIGNvbmNlcm4gaXMgdG90YWxseQordW5kZXJzdGFuZGFibGUuIEhvd2V2ZXIsIHRoZXJlIGFyZSB0d28gcmVhc29ucyB3aHkgaXQgbWF5IG5vdCBiZSB0aGUKK2Nhc2U6CisKKyAgKiBEaWZmZXJlbnQgcHJvamVjdHMgbWF5IG5lZWQgdG8gdXNlIGBDb25jcmV0ZWAgaW4gZGlmZmVyZW50IHdheXMsIHNvIHRoZSBiZXN0IGludGVyZmFjZXMgZm9yIHRoZW0gd2lsbCBiZSBkaWZmZXJlbnQuIFRoZXJlZm9yZSwgZWFjaCBvZiB0aGVtIHdpbGwgaGF2ZSBpdHMgb3duIGRvbWFpbi1zcGVjaWZpYyBpbnRlcmZhY2Ugb24gdG9wIG9mIGBDb25jcmV0ZWAsIGFuZCB0aGV5IHdpbGwgbm90IGJlIHRoZSBzYW1lIGNvZGUuCisgICogSWYgZW5vdWdoIHByb2plY3RzIHdhbnQgdG8gdXNlIHRoZSBzYW1lIGludGVyZmFjZSwgdGhleSBjYW4gYWx3YXlzIHNoYXJlIGl0LCBqdXN0IGxpa2UgdGhleSBoYXZlIGJlZW4gc2hhcmluZyBgQ29uY3JldGVgLiBZb3UgY2FuIGNoZWNrIGluIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBhZGFwdG9yIHNvbWV3aGVyZSBuZWFyIGBDb25jcmV0ZWAgKHBlcmhhcHMgaW4gYSBgY29udHJpYmAgc3ViLWRpcmVjdG9yeSkgYW5kIGxldCBtYW55IHByb2plY3RzIHVzZSBpdC4KKworWW91IG5lZWQgdG8gd2VpZ2ggdGhlIHByb3MgYW5kIGNvbnMgY2FyZWZ1bGx5IGZvciB5b3VyIHBhcnRpY3VsYXIKK3Byb2JsZW0sIGJ1dCBJJ2QgbGlrZSB0byBhc3N1cmUgeW91IHRoYXQgdGhlIEphdmEgY29tbXVuaXR5IGhhcyBiZWVuCitwcmFjdGljaW5nIHRoaXMgZm9yIGEgbG9uZyB0aW1lIGFuZCBpdCdzIGEgcHJvdmVuIGVmZmVjdGl2ZSB0ZWNobmlxdWUKK2FwcGxpY2FibGUgaW4gYSB3aWRlIHZhcmlldHkgb2Ygc2l0dWF0aW9ucy4gOi0pCisKKyMjIERlbGVnYXRpbmcgQ2FsbHMgdG8gYSBGYWtlICMjCisKK1NvbWUgdGltZXMgeW91IGhhdmUgYSBub24tdHJpdmlhbCBmYWtlIGltcGxlbWVudGF0aW9uIG9mIGFuCitpbnRlcmZhY2UuIEZvciBleGFtcGxlOgorCitgYGAKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Gb28oKSB7fQorICB2aXJ0dWFsIGNoYXIgRG9UaGlzKGludCBuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEb1RoYXQoY29uc3QgY2hhciogcywgaW50KiBwKSA9IDA7Cit9OworCitjbGFzcyBGYWtlRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIGNoYXIgRG9UaGlzKGludCBuKSB7CisgICAgcmV0dXJuIChuID4gMCkgPyAnKycgOgorICAgICAgICAobiA8IDApID8gJy0nIDogJzAnOworICB9CisKKyAgdmlydHVhbCB2b2lkIERvVGhhdChjb25zdCBjaGFyKiBzLCBpbnQqIHApIHsKKyAgICAqcCA9IHN0cmxlbihzKTsKKyAgfQorfTsKK2BgYAorCitOb3cgeW91IHdhbnQgdG8gbW9jayB0aGlzIGludGVyZmFjZSBzdWNoIHRoYXQgeW91IGNhbiBzZXQgZXhwZWN0YXRpb25zCitvbiBpdC4gSG93ZXZlciwgeW91IGFsc28gd2FudCB0byB1c2UgYEZha2VGb29gIGZvciB0aGUgZGVmYXVsdAorYmVoYXZpb3IsIGFzIGR1cGxpY2F0aW5nIGl0IGluIHRoZSBtb2NrIG9iamVjdCBpcywgd2VsbCwgYSBsb3Qgb2YKK3dvcmsuCisKK1doZW4geW91IGRlZmluZSB0aGUgbW9jayBjbGFzcyB1c2luZyBHb29nbGUgTW9jaywgeW91IGNhbiBoYXZlIGl0CitkZWxlZ2F0ZSBpdHMgZGVmYXVsdCBhY3Rpb24gdG8gYSBmYWtlIGNsYXNzIHlvdSBhbHJlYWR5IGhhdmUsIHVzaW5nCit0aGlzIHBhdHRlcm46CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC8vIE5vcm1hbCBtb2NrIG1ldGhvZCBkZWZpbml0aW9ucyB1c2luZyBHb29nbGUgTW9jay4KKyAgTU9DS19NRVRIT0QxKERvVGhpcywgY2hhcihpbnQgbikpOworICBNT0NLX01FVEhPRDIoRG9UaGF0LCB2b2lkKGNvbnN0IGNoYXIqIHMsIGludCogcCkpOworCisgIC8vIERlbGVnYXRlcyB0aGUgZGVmYXVsdCBhY3Rpb25zIG9mIHRoZSBtZXRob2RzIHRvIGEgRmFrZUZvbyBvYmplY3QuCisgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGN1c3RvbSBPTl9DQUxMKCkgc3RhdGVtZW50cy4KKyAgdm9pZCBEZWxlZ2F0ZVRvRmFrZSgpIHsKKyAgICBPTl9DQUxMKCp0aGlzLCBEb1RoaXMoXykpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmZmFrZV8sICZGYWtlRm9vOjpEb1RoaXMpKTsKKyAgICBPTl9DQUxMKCp0aGlzLCBEb1RoYXQoXywgXykpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmZmFrZV8sICZGYWtlRm9vOjpEb1RoYXQpKTsKKyAgfQorIHByaXZhdGU6CisgIEZha2VGb28gZmFrZV87ICAvLyBLZWVwcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFrZSBpbiB0aGUgbW9jay4KK307CitgYGAKKworV2l0aCB0aGF0LCB5b3UgY2FuIHVzZSBgTW9ja0Zvb2AgaW4geW91ciB0ZXN0cyBhcyB1c3VhbC4gSnVzdCByZW1lbWJlcgordGhhdCBpZiB5b3UgZG9uJ3QgZXhwbGljaXRseSBzZXQgYW4gYWN0aW9uIGluIGFuIGBPTl9DQUxMKClgIG9yCitgRVhQRUNUX0NBTEwoKWAsIHRoZSBmYWtlIHdpbGwgYmUgY2FsbGVkIHVwb24gdG8gZG8gaXQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworCitURVNUKEFiY1Rlc3QsIFh5eikgeworICBNb2NrRm9vIGZvbzsKKyAgZm9vLkRlbGVnYXRlVG9GYWtlKCk7IC8vIEVuYWJsZXMgdGhlIGZha2UgZm9yIGRlbGVnYXRpb24uCisKKyAgLy8gUHV0IHlvdXIgT05fQ0FMTChmb28sIC4uLilzIGhlcmUsIGlmIGFueS4KKworICAvLyBObyBhY3Rpb24gc3BlY2lmaWVkLCBtZWFuaW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBhY3Rpb24uCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDUpKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoXywgXykpOworCisgIGludCBuID0gMDsKKyAgRVhQRUNUX0VRKCcrJywgZm9vLkRvVGhpcyg1KSk7ICAvLyBGYWtlRm9vOjpEb1RoaXMoKSBpcyBpbnZva2VkLgorICBmb28uRG9UaGF0KCJIaSIsICZuKTsgICAgICAgICAgIC8vIEZha2VGb286OkRvVGhhdCgpIGlzIGludm9rZWQuCisgIEVYUEVDVF9FUSgyLCBuKTsKK30KK2BgYAorCisqKlNvbWUgdGlwczoqKgorCisgICogSWYgeW91IHdhbnQsIHlvdSBjYW4gc3RpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYWN0aW9uIGJ5IHByb3ZpZGluZyB5b3VyIG93biBgT05fQ0FMTCgpYCBvciB1c2luZyBgLldpbGxPbmNlKClgIC8gYC5XaWxsUmVwZWF0ZWRseSgpYCBpbiBgRVhQRUNUX0NBTEwoKWAuCisgICogSW4gYERlbGVnYXRlVG9GYWtlKClgLCB5b3Ugb25seSBuZWVkIHRvIGRlbGVnYXRlIHRoZSBtZXRob2RzIHdob3NlIGZha2UgaW1wbGVtZW50YXRpb24geW91IGludGVuZCB0byB1c2UuCisgICogVGhlIGdlbmVyYWwgdGVjaG5pcXVlIGRpc2N1c3NlZCBoZXJlIHdvcmtzIGZvciBvdmVybG9hZGVkIG1ldGhvZHMsIGJ1dCB5b3UnbGwgbmVlZCB0byB0ZWxsIHRoZSBjb21waWxlciB3aGljaCB2ZXJzaW9uIHlvdSBtZWFuLiBUbyBkaXNhbWJpZ3VhdGUgYSBtb2NrIGZ1bmN0aW9uICh0aGUgb25lIHlvdSBzcGVjaWZ5IGluc2lkZSB0aGUgcGFyZW50aGVzZXMgb2YgYE9OX0NBTEwoKWApLCBzZWUgdGhlICJTZWxlY3RpbmcgQmV0d2VlbiBPdmVybG9hZGVkIEZ1bmN0aW9ucyIgc2VjdGlvbiBvbiB0aGlzIHBhZ2U7IHRvIGRpc2FtYmlndWF0ZSBhIGZha2UgZnVuY3Rpb24gKHRoZSBvbmUgeW91IHBsYWNlIGluc2lkZSBgSW52b2tlKClgKSwgdXNlIGEgYHN0YXRpY19jYXN0YCB0byBzcGVjaWZ5IHRoZSBmdW5jdGlvbidzIHR5cGUuIEZvciBpbnN0YW5jZSwgaWYgY2xhc3MgYEZvb2AgaGFzIG1ldGhvZHMgYGNoYXIgRG9UaGlzKGludCBuKWAgYW5kIGBib29sIERvVGhpcyhkb3VibGUgeCkgY29uc3RgLCBhbmQgeW91IHdhbnQgdG8gaW52b2tlIHRoZSBsYXR0ZXIsIHlvdSBuZWVkIHRvIHdyaXRlIGBJbnZva2UoJmZha2VfLCBzdGF0aWNfY2FzdDxib29sIChGYWtlRm9vOjoqKShkb3VibGUpIGNvbnN0PigmRmFrZUZvbzo6RG9UaGlzKSlgIGluc3RlYWQgb2YgYEludm9rZSgmZmFrZV8sICZGYWtlRm9vOjpEb1RoaXMpYCAoVGhlIHN0cmFuZ2UtbG9va2luZyB0aGluZyBpbnNpZGUgdGhlIGFuZ2xlZCBicmFja2V0cyBvZiBgc3RhdGljX2Nhc3RgIGlzIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgc2Vjb25kIGBEb1RoaXMoKWAgbWV0aG9kLikuCisgICogSGF2aW5nIHRvIG1peCBhIG1vY2sgYW5kIGEgZmFrZSBpcyBvZnRlbiBhIHNpZ24gb2Ygc29tZXRoaW5nIGdvbmUgd3JvbmcuIFBlcmhhcHMgeW91IGhhdmVuJ3QgZ290IHVzZWQgdG8gdGhlIGludGVyYWN0aW9uLWJhc2VkIHdheSBvZiB0ZXN0aW5nIHlldC4gT3IgcGVyaGFwcyB5b3VyIGludGVyZmFjZSBpcyB0YWtpbmcgb24gdG9vIG1hbnkgcm9sZXMgYW5kIHNob3VsZCBiZSBzcGxpdCB1cC4gVGhlcmVmb3JlLCAqKmRvbid0IGFidXNlIHRoaXMqKi4gV2Ugd291bGQgb25seSByZWNvbW1lbmQgdG8gZG8gaXQgYXMgYW4gaW50ZXJtZWRpYXRlIHN0ZXAgd2hlbiB5b3UgYXJlIHJlZmFjdG9yaW5nIHlvdXIgY29kZS4KKworUmVnYXJkaW5nIHRoZSB0aXAgb24gbWl4aW5nIGEgbW9jayBhbmQgYSBmYWtlLCBoZXJlJ3MgYW4gZXhhbXBsZSBvbgord2h5IGl0IG1heSBiZSBhIGJhZCBzaWduOiBTdXBwb3NlIHlvdSBoYXZlIGEgY2xhc3MgYFN5c3RlbWAgZm9yCitsb3ctbGV2ZWwgc3lzdGVtIG9wZXJhdGlvbnMuIEluIHBhcnRpY3VsYXIsIGl0IGRvZXMgZmlsZSBhbmQgSS9PCitvcGVyYXRpb25zLiBBbmQgc3VwcG9zZSB5b3Ugd2FudCB0byB0ZXN0IGhvdyB5b3VyIGNvZGUgdXNlcyBgU3lzdGVtYAordG8gZG8gSS9PLCBhbmQgeW91IGp1c3Qgd2FudCB0aGUgZmlsZSBvcGVyYXRpb25zIHRvIHdvcmsgbm9ybWFsbHkuIElmCit5b3UgbW9jayBvdXQgdGhlIGVudGlyZSBgU3lzdGVtYCBjbGFzcywgeW91J2xsIGhhdmUgdG8gcHJvdmlkZSBhIGZha2UKK2ltcGxlbWVudGF0aW9uIGZvciB0aGUgZmlsZSBvcGVyYXRpb24gcGFydCwgd2hpY2ggc3VnZ2VzdHMgdGhhdAorYFN5c3RlbWAgaXMgdGFraW5nIG9uIHRvbyBtYW55IHJvbGVzLgorCitJbnN0ZWFkLCB5b3UgY2FuIGRlZmluZSBhIGBGaWxlT3BzYCBpbnRlcmZhY2UgYW5kIGFuIGBJT09wc2AgaW50ZXJmYWNlCithbmQgc3BsaXQgYFN5c3RlbWAncyBmdW5jdGlvbmFsaXRpZXMgaW50byB0aGUgdHdvLiBUaGVuIHlvdSBjYW4gbW9jaworYElPT3BzYCB3aXRob3V0IG1vY2tpbmcgYEZpbGVPcHNgLgorCisjIyBEZWxlZ2F0aW5nIENhbGxzIHRvIGEgUmVhbCBPYmplY3QgIyMKKworV2hlbiB1c2luZyB0ZXN0aW5nIGRvdWJsZXMgKG1vY2tzLCBmYWtlcywgc3R1YnMsIGFuZCBldGMpLCBzb21ldGltZXMKK3RoZWlyIGJlaGF2aW9ycyB3aWxsIGRpZmZlciBmcm9tIHRob3NlIG9mIHRoZSByZWFsIG9iamVjdHMuIFRoaXMKK2RpZmZlcmVuY2UgY291bGQgYmUgZWl0aGVyIGludGVudGlvbmFsIChhcyBpbiBzaW11bGF0aW5nIGFuIGVycm9yIHN1Y2gKK3RoYXQgeW91IGNhbiB0ZXN0IHRoZSBlcnJvciBoYW5kbGluZyBjb2RlKSBvciB1bmludGVudGlvbmFsLiBJZiB5b3VyCittb2NrcyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcnMgdGhhbiB0aGUgcmVhbCBvYmplY3RzIGJ5IG1pc3Rha2UsIHlvdQorY291bGQgZW5kIHVwIHdpdGggY29kZSB0aGF0IHBhc3NlcyB0aGUgdGVzdHMgYnV0IGZhaWxzIGluIHByb2R1Y3Rpb24uCisKK1lvdSBjYW4gdXNlIHRoZSBfZGVsZWdhdGluZy10by1yZWFsXyB0ZWNobmlxdWUgdG8gZW5zdXJlIHRoYXQgeW91cgorbW9jayBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHJlYWwgb2JqZWN0IHdoaWxlIHJldGFpbmluZyB0aGUKK2FiaWxpdHkgdG8gdmFsaWRhdGUgY2FsbHMuIFRoaXMgdGVjaG5pcXVlIGlzIHZlcnkgc2ltaWxhciB0byB0aGUKK2RlbGVnYXRpbmctdG8tZmFrZSB0ZWNobmlxdWUsIHRoZSBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgd2UgdXNlIGEgcmVhbAorb2JqZWN0IGluc3RlYWQgb2YgYSBmYWtlLiBIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkF0TGVhc3Q7Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTW9ja0ZvbygpIHsKKyAgICAvLyBCeSBkZWZhdWx0LCBhbGwgY2FsbHMgYXJlIGRlbGVnYXRlZCB0byB0aGUgcmVhbCBvYmplY3QuCisgICAgT05fQ0FMTCgqdGhpcywgRG9UaGlzKCkpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmcmVhbF8sICZGb286OkRvVGhpcykpOworICAgIE9OX0NBTEwoKnRoaXMsIERvVGhhdChfKSkKKyAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKCZyZWFsXywgJkZvbzo6RG9UaGF0KSk7CisgICAgLi4uCisgIH0KKyAgTU9DS19NRVRIT0QwKERvVGhpcywgLi4uKTsKKyAgTU9DS19NRVRIT0QxKERvVGhhdCwgLi4uKTsKKyAgLi4uCisgcHJpdmF0ZToKKyAgRm9vIHJlYWxfOworfTsKKy4uLgorCisgIE1vY2tGb28gbW9jazsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBEb1RoaXMoKSkKKyAgICAgIC5UaW1lcygzKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgRG9UaGF0KCJIaSIpKQorICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpOworICAuLi4gdXNlIG1vY2sgaW4gdGVzdCAuLi4KK2BgYAorCitXaXRoIHRoaXMsIEdvb2dsZSBNb2NrIHdpbGwgdmVyaWZ5IHRoYXQgeW91ciBjb2RlIG1hZGUgdGhlIHJpZ2h0IGNhbGxzCisod2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzLCBpbiB0aGUgcmlnaHQgb3JkZXIsIGNhbGxlZCB0aGUgcmlnaHQgbnVtYmVyCitvZiB0aW1lcywgZXRjKSwgYW5kIGEgcmVhbCBvYmplY3Qgd2lsbCBhbnN3ZXIgdGhlIGNhbGxzIChzbyB0aGUKK2JlaGF2aW9yIHdpbGwgYmUgdGhlIHNhbWUgYXMgaW4gcHJvZHVjdGlvbikuIFRoaXMgZ2l2ZXMgeW91IHRoZSBiZXN0CitvZiBib3RoIHdvcmxkcy4KKworIyMgRGVsZWdhdGluZyBDYWxscyB0byBhIFBhcmVudCBDbGFzcyAjIworCitJZGVhbGx5LCB5b3Ugc2hvdWxkIGNvZGUgdG8gaW50ZXJmYWNlcywgd2hvc2UgbWV0aG9kcyBhcmUgYWxsIHB1cmUKK3ZpcnR1YWwuIEluIHJlYWxpdHksIHNvbWV0aW1lcyB5b3UgZG8gbmVlZCB0byBtb2NrIGEgdmlydHVhbCBtZXRob2QKK3RoYXQgaXMgbm90IHB1cmUgKGkuZSwgaXQgYWxyZWFkeSBoYXMgYW4gaW1wbGVtZW50YXRpb24pLiBGb3IgZXhhbXBsZToKKworYGBgCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Rm9vKCk7CisKKyAgdmlydHVhbCB2b2lkIFB1cmUoaW50IG4pID0gMDsKKyAgdmlydHVhbCBpbnQgQ29uY3JldGUoY29uc3QgY2hhciogc3RyKSB7IC4uLiB9Cit9OworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICAvLyBNb2NraW5nIGEgcHVyZSBtZXRob2QuCisgIE1PQ0tfTUVUSE9EMShQdXJlLCB2b2lkKGludCBuKSk7CisgIC8vIE1vY2tpbmcgYSBjb25jcmV0ZSBtZXRob2QuICBGb286OkNvbmNyZXRlKCkgaXMgc2hhZG93ZWQuCisgIE1PQ0tfTUVUSE9EMShDb25jcmV0ZSwgaW50KGNvbnN0IGNoYXIqIHN0cikpOworfTsKK2BgYAorCitTb21ldGltZXMgeW91IG1heSB3YW50IHRvIGNhbGwgYEZvbzo6Q29uY3JldGUoKWAgaW5zdGVhZCBvZgorYE1vY2tGb286OkNvbmNyZXRlKClgLiBQZXJoYXBzIHlvdSB3YW50IHRvIGRvIGl0IGFzIHBhcnQgb2YgYSBzdHViCithY3Rpb24sIG9yIHBlcmhhcHMgeW91ciB0ZXN0IGRvZXNuJ3QgbmVlZCB0byBtb2NrIGBDb25jcmV0ZSgpYCBhdCBhbGwKKyhidXQgaXQgd291bGQgYmUgb2gtc28gcGFpbmZ1bCB0byBoYXZlIHRvIGRlZmluZSBhIG5ldyBtb2NrIGNsYXNzCit3aGVuZXZlciB5b3UgZG9uJ3QgbmVlZCB0byBtb2NrIG9uZSBvZiBpdHMgbWV0aG9kcykuCisKK1RoZSB0cmljayBpcyB0byBsZWF2ZSBhIGJhY2sgZG9vciBpbiB5b3VyIG1vY2sgY2xhc3MgZm9yIGFjY2Vzc2luZyB0aGUKK3JlYWwgbWV0aG9kcyBpbiB0aGUgYmFzZSBjbGFzczoKKworYGBgCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICAvLyBNb2NraW5nIGEgcHVyZSBtZXRob2QuCisgIE1PQ0tfTUVUSE9EMShQdXJlLCB2b2lkKGludCBuKSk7CisgIC8vIE1vY2tpbmcgYSBjb25jcmV0ZSBtZXRob2QuICBGb286OkNvbmNyZXRlKCkgaXMgc2hhZG93ZWQuCisgIE1PQ0tfTUVUSE9EMShDb25jcmV0ZSwgaW50KGNvbnN0IGNoYXIqIHN0cikpOworCisgIC8vIFVzZSB0aGlzIHRvIGNhbGwgQ29uY3JldGUoKSBkZWZpbmVkIGluIEZvby4KKyAgaW50IEZvb0NvbmNyZXRlKGNvbnN0IGNoYXIqIHN0cikgeyByZXR1cm4gRm9vOjpDb25jcmV0ZShzdHIpOyB9Cit9OworYGBgCisKK05vdywgeW91IGNhbiBjYWxsIGBGb286OkNvbmNyZXRlKClgIGluc2lkZSBhbiBhY3Rpb24gYnk6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBDb25jcmV0ZShfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoJmZvbywgJk1vY2tGb286OkZvb0NvbmNyZXRlKSk7CitgYGAKKworb3IgdGVsbCB0aGUgbW9jayBvYmplY3QgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byBtb2NrIGBDb25jcmV0ZSgpYDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKy4uLgorICBPTl9DQUxMKGZvbywgQ29uY3JldGUoXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoJmZvbywgJk1vY2tGb286OkZvb0NvbmNyZXRlKSk7CitgYGAKKworKFdoeSBkb24ndCB3ZSBqdXN0IHdyaXRlIGBJbnZva2UoJmZvbywgJkZvbzo6Q29uY3JldGUpYD8gSWYgeW91IGRvCit0aGF0LCBgTW9ja0Zvbzo6Q29uY3JldGUoKWAgd2lsbCBiZSBjYWxsZWQgKGFuZCBjYXVzZSBhbiBpbmZpbml0ZQorcmVjdXJzaW9uKSBzaW5jZSBgRm9vOjpDb25jcmV0ZSgpYCBpcyB2aXJ0dWFsLiBUaGF0J3MganVzdCBob3cgQysrCit3b3Jrcy4pCisKKyMgVXNpbmcgTWF0Y2hlcnMgIworCisjIyBNYXRjaGluZyBBcmd1bWVudCBWYWx1ZXMgRXhhY3RseSAjIworCitZb3UgY2FuIHNwZWNpZnkgZXhhY3RseSB3aGljaCBhcmd1bWVudHMgYSBtb2NrIG1ldGhvZCBpcyBleHBlY3Rpbmc6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoNSkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCdhJykpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgiSGVsbG8iLCBiYXIpKTsKK2BgYAorCisjIyBVc2luZyBTaW1wbGUgTWF0Y2hlcnMgIyMKKworWW91IGNhbiB1c2UgbWF0Y2hlcnMgdG8gbWF0Y2ggYXJndW1lbnRzIHRoYXQgaGF2ZSBhIGNlcnRhaW4gcHJvcGVydHk6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpHZTsKK3VzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKEdlKDUpKSkgIC8vIFRoZSBhcmd1bWVudCBtdXN0IGJlID49IDUuCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCdhJykpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgiSGVsbG8iLCBOb3ROdWxsKCkpKTsKKyAgLy8gVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IG5vdCBiZSBOVUxMLgorYGBgCisKK0EgZnJlcXVlbnRseSB1c2VkIG1hdGNoZXIgaXMgYF9gLCB3aGljaCBtYXRjaGVzIGFueXRoaW5nOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdChfLCBOb3ROdWxsKCkpKTsKK2BgYAorCisjIyBDb21iaW5pbmcgTWF0Y2hlcnMgIyMKKworWW91IGNhbiBidWlsZCBjb21wbGV4IG1hdGNoZXJzIGZyb20gZXhpc3Rpbmcgb25lcyB1c2luZyBgQWxsT2YoKWAsCitgQW55T2YoKWAsIGFuZCBgTm90KClgOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6QWxsT2Y7Cit1c2luZyA6OnRlc3Rpbmc6Okd0OwordXNpbmcgOjp0ZXN0aW5nOjpIYXNTdWJzdHI7Cit1c2luZyA6OnRlc3Rpbmc6Ok5lOwordXNpbmcgOjp0ZXN0aW5nOjpOb3Q7CisuLi4KKyAgLy8gVGhlIGFyZ3VtZW50IG11c3QgYmUgPiA1IGFuZCAhPSAxMC4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoQWxsT2YoR3QoNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lKDEwKSkpKTsKKworICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBub3QgY29udGFpbiBzdWItc3RyaW5nICJibGFoIi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoTm90KEhhc1N1YnN0cigiYmxhaCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworYGBgCisKKyMjIENhc3RpbmcgTWF0Y2hlcnMgIyMKKworR29vZ2xlIE1vY2sgbWF0Y2hlcnMgYXJlIHN0YXRpY2FsbHkgdHlwZWQsIG1lYW5pbmcgdGhhdCB0aGUgY29tcGlsZXIKK2NhbiBjYXRjaCB5b3VyIG1pc3Rha2UgaWYgeW91IHVzZSBhIG1hdGNoZXIgb2YgdGhlIHdyb25nIHR5cGUgKGZvcgorZXhhbXBsZSwgaWYgeW91IHVzZSBgRXEoNSlgIHRvIG1hdGNoIGEgYHN0cmluZ2AgYXJndW1lbnQpLiBHb29kIGZvcgoreW91IQorCitTb21ldGltZXMsIGhvd2V2ZXIsIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nIGFuZCB3YW50IHRoZSBjb21waWxlcgordG8gZ2l2ZSB5b3Ugc29tZSBzbGFjay4gT25lIGV4YW1wbGUgaXMgdGhhdCB5b3UgaGF2ZSBhIG1hdGNoZXIgZm9yCitgbG9uZ2AgYW5kIHRoZSBhcmd1bWVudCB5b3Ugd2FudCB0byBtYXRjaCBpcyBgaW50YC4gV2hpbGUgdGhlIHR3bwordHlwZXMgYXJlbid0IGV4YWN0bHkgdGhlIHNhbWUsIHRoZXJlIGlzIG5vdGhpbmcgcmVhbGx5IHdyb25nIHdpdGgKK3VzaW5nIGEgYE1hdGNoZXI8bG9uZz5gIHRvIG1hdGNoIGFuIGBpbnRgIC0gYWZ0ZXIgYWxsLCB3ZSBjYW4gZmlyc3QKK2NvbnZlcnQgdGhlIGBpbnRgIGFyZ3VtZW50IHRvIGEgYGxvbmdgIGJlZm9yZSBnaXZpbmcgaXQgdG8gdGhlCittYXRjaGVyLgorCitUbyBzdXBwb3J0IHRoaXMgbmVlZCwgR29vZ2xlIE1vY2sgZ2l2ZXMgeW91IHRoZQorYFNhZmVNYXRjaGVyQ2FzdDxUPihtKWAgZnVuY3Rpb24uIEl0IGNhc3RzIGEgbWF0Y2hlciBgbWAgdG8gdHlwZQorYE1hdGNoZXI8VD5gLiBUbyBlbnN1cmUgc2FmZXR5LCBHb29nbGUgTW9jayBjaGVja3MgdGhhdCAobGV0IGBVYCBiZSB0aGUKK3R5cGUgYG1gIGFjY2VwdHMpOgorCisgIDEuIFR5cGUgYFRgIGNhbiBiZSBpbXBsaWNpdGx5IGNhc3QgdG8gdHlwZSBgVWA7CisgIDEuIFdoZW4gYm90aCBgVGAgYW5kIGBVYCBhcmUgYnVpbHQtaW4gYXJpdGhtZXRpYyB0eXBlcyAoYGJvb2xgLCBpbnRlZ2VycywgYW5kIGZsb2F0aW5nLXBvaW50IG51bWJlcnMpLCB0aGUgY29udmVyc2lvbiBmcm9tIGBUYCB0byBgVWAgaXMgbm90IGxvc3N5IChpbiBvdGhlciB3b3JkcywgYW55IHZhbHVlIHJlcHJlc2VudGFibGUgYnkgYFRgIGNhbiBhbHNvIGJlIHJlcHJlc2VudGVkIGJ5IGBVYCk7IGFuZAorICAxLiBXaGVuIGBVYCBpcyBhIHJlZmVyZW5jZSwgYFRgIG11c3QgYWxzbyBiZSBhIHJlZmVyZW5jZSAoYXMgdGhlIHVuZGVybHlpbmcgbWF0Y2hlciBtYXkgYmUgaW50ZXJlc3RlZCBpbiB0aGUgYWRkcmVzcyBvZiB0aGUgYFVgIHZhbHVlKS4KKworVGhlIGNvZGUgd29uJ3QgY29tcGlsZSBpZiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBpc24ndCBtZXQuCisKK0hlcmUncyBvbmUgZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDsKKworLy8gQSBiYXNlIGNsYXNzIGFuZCBhIGNoaWxkIGNsYXNzLgorY2xhc3MgQmFzZSB7IC4uLiB9OworY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsgLi4uIH07CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShEb1RoaXMsIHZvaWQoRGVyaXZlZCogZGVyaXZlZCkpOworfTsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICAvLyBtIGlzIGEgTWF0Y2hlcjxCYXNlKj4gd2UgZ290IGZyb20gc29tZXdoZXJlLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhTYWZlTWF0Y2hlckNhc3Q8RGVyaXZlZCo+KG0pKSk7CitgYGAKKworSWYgeW91IGZpbmQgYFNhZmVNYXRjaGVyQ2FzdDxUPihtKWAgdG9vIGxpbWl0aW5nLCB5b3UgY2FuIHVzZSBhIHNpbWlsYXIKK2Z1bmN0aW9uIGBNYXRjaGVyQ2FzdDxUPihtKWAuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgYE1hdGNoZXJDYXN0YCB3b3JrcworYXMgbG9uZyBhcyB5b3UgY2FuIGBzdGF0aWNfY2FzdGAgdHlwZSBgVGAgdG8gdHlwZSBgVWAuCisKK2BNYXRjaGVyQ2FzdGAgZXNzZW50aWFsbHkgbGV0cyB5b3UgYnlwYXNzIEMrKydzIHR5cGUgc3lzdGVtCisoYHN0YXRpY19jYXN0YCBpc24ndCBhbHdheXMgc2FmZSBhcyBpdCBjb3VsZCB0aHJvdyBhd2F5IGluZm9ybWF0aW9uLAorZm9yIGV4YW1wbGUpLCBzbyBiZSBjYXJlZnVsIG5vdCB0byBtaXN1c2UvYWJ1c2UgaXQuCisKKyMjIFNlbGVjdGluZyBCZXR3ZWVuIE92ZXJsb2FkZWQgRnVuY3Rpb25zICMjCisKK0lmIHlvdSBleHBlY3QgYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbiB0byBiZSBjYWxsZWQsIHRoZSBjb21waWxlciBtYXkKK25lZWQgc29tZSBoZWxwIG9uIHdoaWNoIG92ZXJsb2FkZWQgdmVyc2lvbiBpdCBpcy4KKworVG8gZGlzYW1iaWd1YXRlIGZ1bmN0aW9ucyBvdmVybG9hZGVkIG9uIHRoZSBjb25zdC1uZXNzIG9mIHRoaXMgb2JqZWN0LAordXNlIHRoZSBgQ29uc3QoKWAgYXJndW1lbnQgd3JhcHBlci4KKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVyblJlZjsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgTU9DS19NRVRIT0QwKEdldEJhciwgQmFyJigpKTsKKyAgTU9DS19DT05TVF9NRVRIT0QwKEdldEJhciwgY29uc3QgQmFyJigpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgQmFyIGJhcjEsIGJhcjI7CisgIEVYUEVDVF9DQUxMKGZvbywgR2V0QmFyKCkpICAgICAgICAgLy8gVGhlIG5vbi1jb25zdCBHZXRCYXIoKS4KKyAgICAgIC5XaWxsT25jZShSZXR1cm5SZWYoYmFyMSkpOworICBFWFBFQ1RfQ0FMTChDb25zdChmb28pLCBHZXRCYXIoKSkgIC8vIFRoZSBjb25zdCBHZXRCYXIoKS4KKyAgICAgIC5XaWxsT25jZShSZXR1cm5SZWYoYmFyMikpOworYGBgCisKKyhgQ29uc3QoKWAgaXMgZGVmaW5lZCBieSBHb29nbGUgTW9jayBhbmQgcmV0dXJucyBhIGBjb25zdGAgcmVmZXJlbmNlCit0byBpdHMgYXJndW1lbnQuKQorCitUbyBkaXNhbWJpZ3VhdGUgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzCitidXQgZGlmZmVyZW50IGFyZ3VtZW50IHR5cGVzLCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSB0aGUgZXhhY3QgdHlwZQorb2YgYSBtYXRjaGVyLCBlaXRoZXIgYnkgd3JhcHBpbmcgeW91ciBtYXRjaGVyIGluIGBNYXRjaGVyPHR5cGU+KClgLCBvcgordXNpbmcgYSBtYXRjaGVyIHdob3NlIHR5cGUgaXMgZml4ZWQgKGBUeXBlZEVxPHR5cGU+YCwgYEFuPHR5cGU+KClgLAorZXRjKToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkFuOwordXNpbmcgOjp0ZXN0aW5nOjpMdDsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6VHlwZWRFcTsKKworY2xhc3MgTW9ja1ByaW50ZXIgOiBwdWJsaWMgUHJpbnRlciB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoUHJpbnQsIHZvaWQoaW50IG4pKTsKKyAgTU9DS19NRVRIT0QxKFByaW50LCB2b2lkKGNoYXIgYykpOworfTsKKworVEVTVChQcmludGVyVGVzdCwgUHJpbnQpIHsKKyAgTW9ja1ByaW50ZXIgcHJpbnRlcjsKKworICBFWFBFQ1RfQ0FMTChwcmludGVyLCBQcmludChBbjxpbnQ+KCkpKTsgICAgICAgICAgICAvLyB2b2lkIFByaW50KGludCk7CisgIEVYUEVDVF9DQUxMKHByaW50ZXIsIFByaW50KE1hdGNoZXI8aW50PihMdCg1KSkpKTsgIC8vIHZvaWQgUHJpbnQoaW50KTsKKyAgRVhQRUNUX0NBTEwocHJpbnRlciwgUHJpbnQoVHlwZWRFcTxjaGFyPignYScpKSk7ICAgLy8gdm9pZCBQcmludChjaGFyKTsKKworICBwcmludGVyLlByaW50KDMpOworICBwcmludGVyLlByaW50KDYpOworICBwcmludGVyLlByaW50KCdhJyk7Cit9CitgYGAKKworIyMgUGVyZm9ybWluZyBEaWZmZXJlbnQgQWN0aW9ucyBCYXNlZCBvbiB0aGUgQXJndW1lbnRzICMjCisKK1doZW4gYSBtb2NrIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBfbGFzdF8gbWF0Y2hpbmcgZXhwZWN0YXRpb24gdGhhdCdzCitzdGlsbCBhY3RpdmUgd2lsbCBiZSBzZWxlY3RlZCAodGhpbmsgIm5ld2VyIG92ZXJyaWRlcyBvbGRlciIpLiBTbywgeW91CitjYW4gbWFrZSBhIG1ldGhvZCBkbyBkaWZmZXJlbnQgdGhpbmdzIGRlcGVuZGluZyBvbiBpdHMgYXJndW1lbnQgdmFsdWVzCitsaWtlIHRoaXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpMdDsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworLi4uCisgIC8vIFRoZSBkZWZhdWx0IGNhc2UuCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKF8pKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybignYicpKTsKKworICAvLyBUaGUgbW9yZSBzcGVjaWZpYyBjYXNlLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhMdCg1KSkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCdhJykpOworYGBgCisKK05vdywgaWYgYGZvby5Eb1RoaXMoKWAgaXMgY2FsbGVkIHdpdGggYSB2YWx1ZSBsZXNzIHRoYW4gNSwgYCdhJ2Agd2lsbAorYmUgcmV0dXJuZWQ7IG90aGVyd2lzZSBgJ2InYCB3aWxsIGJlIHJldHVybmVkLgorCisjIyBNYXRjaGluZyBNdWx0aXBsZSBBcmd1bWVudHMgYXMgYSBXaG9sZSAjIworCitTb21ldGltZXMgaXQncyBub3QgZW5vdWdoIHRvIG1hdGNoIHRoZSBhcmd1bWVudHMgaW5kaXZpZHVhbGx5LiBGb3IKK2V4YW1wbGUsIHdlIG1heSB3YW50IHRvIHNheSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGxlc3MgdGhhbgordGhlIHNlY29uZCBhcmd1bWVudC4gVGhlIGBXaXRoKClgIGNsYXVzZSBhbGxvd3MgdXMgdG8gbWF0Y2gKK2FsbCBhcmd1bWVudHMgb2YgYSBtb2NrIGZ1bmN0aW9uIGFzIGEgd2hvbGUuIEZvciBleGFtcGxlLAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6THQ7Cit1c2luZyA6OnRlc3Rpbmc6Ok5lOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgSW5SYW5nZShOZSgwKSwgXykpCisgICAgICAuV2l0aChMdCgpKTsKK2BgYAorCitzYXlzIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGBJblJhbmdlKClgIG11c3Qgbm90IGJlIDAsIGFuZCBtdXN0IGJlCitsZXNzIHRoYW4gdGhlIHNlY29uZCBhcmd1bWVudC4KKworVGhlIGV4cHJlc3Npb24gaW5zaWRlIGBXaXRoKClgIG11c3QgYmUgYSBtYXRjaGVyIG9mIHR5cGUKK2BNYXRjaGVyPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCAuLi4sIEFuPiA+YCwgd2hlcmUgYEExYCwgLi4uLCBgQW5gIGFyZSB0aGUKK3R5cGVzIG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuCisKK1lvdSBjYW4gYWxzbyB3cml0ZSBgQWxsQXJncyhtKWAgaW5zdGVhZCBvZiBgbWAgaW5zaWRlIGAuV2l0aCgpYC4gVGhlCit0d28gZm9ybXMgYXJlIGVxdWl2YWxlbnQsIGJ1dCBgLldpdGgoQWxsQXJncyhMdCgpKSlgIGlzIG1vcmUgcmVhZGFibGUKK3RoYW4gYC5XaXRoKEx0KCkpYC4KKworWW91IGNhbiB1c2UgYEFyZ3M8azEsIC4uLiwga24+KG0pYCB0byBtYXRjaCB0aGUgYG5gIHNlbGVjdGVkIGFyZ3VtZW50cworKGFzIGEgdHVwbGUpIGFnYWluc3QgYG1gLiBGb3IgZXhhbXBsZSwKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkFsbE9mOwordXNpbmcgOjp0ZXN0aW5nOjpBcmdzOwordXNpbmcgOjp0ZXN0aW5nOjpMdDsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIEJsYWgoXywgXywgXykpCisgICAgICAuV2l0aChBbGxPZihBcmdzPDAsIDE+KEx0KCkpLCBBcmdzPDEsIDI+KEx0KCkpKSk7CitgYGAKKworc2F5cyB0aGF0IGBCbGFoKClgIHdpbGwgYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzIGB4YCwgYHlgLCBhbmQgYHpgIHdoZXJlCitgeCA8IHkgPCB6YC4KKworQXMgYSBjb252ZW5pZW5jZSBhbmQgZXhhbXBsZSwgR29vZ2xlIE1vY2sgcHJvdmlkZXMgc29tZSBtYXRjaGVycyBmb3IKKzItdHVwbGVzLCBpbmNsdWRpbmcgdGhlIGBMdCgpYCBtYXRjaGVyIGFib3ZlLiBTZWUgdGhlIFtDaGVhdFNoZWV0XShDaGVhdFNoZWV0Lm1kKSBmb3IKK3RoZSBjb21wbGV0ZSBsaXN0LgorCitOb3RlIHRoYXQgaWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgYXJndW1lbnRzIHRvIGEgcHJlZGljYXRlIG9mIHlvdXIgb3duCisoZS5nLiBgLldpdGgoQXJnczwwLCAxPihUcnVseSgmTXlQcmVkaWNhdGUpKSlgKSwgdGhhdCBwcmVkaWNhdGUgTVVTVCBiZQord3JpdHRlbiB0byB0YWtlIGEgYDo6dGVzdGluZzo6dHVwbGVgIGFzIGl0cyBhcmd1bWVudDsgR29vZ2xlIE1vY2sgd2lsbCBwYXNzIHRoZSBgbmAgc2VsZWN0ZWQgYXJndW1lbnRzIGFzIF9vbmVfIHNpbmdsZSB0dXBsZSB0byB0aGUgcHJlZGljYXRlLgorCisjIyBVc2luZyBNYXRjaGVycyBhcyBQcmVkaWNhdGVzICMjCisKK0hhdmUgeW91IG5vdGljZWQgdGhhdCBhIG1hdGNoZXIgaXMganVzdCBhIGZhbmN5IHByZWRpY2F0ZSB0aGF0IGFsc28KK2tub3dzIGhvdyB0byBkZXNjcmliZSBpdHNlbGY/IE1hbnkgZXhpc3RpbmcgYWxnb3JpdGhtcyB0YWtlIHByZWRpY2F0ZXMKK2FzIGFyZ3VtZW50cyAoZS5nLiB0aG9zZSBkZWZpbmVkIGluIFNUTCdzIGA8YWxnb3JpdGhtPmAgaGVhZGVyKSwgYW5kCitpdCB3b3VsZCBiZSBhIHNoYW1lIGlmIEdvb2dsZSBNb2NrIG1hdGNoZXJzIGFyZSBub3QgYWxsb3dlZCB0bworcGFydGljaXBhdGUuCisKK0x1Y2tpbHksIHlvdSBjYW4gdXNlIGEgbWF0Y2hlciB3aGVyZSBhIHVuYXJ5IHByZWRpY2F0ZSBmdW5jdG9yIGlzCitleHBlY3RlZCBieSB3cmFwcGluZyBpdCBpbnNpZGUgdGhlIGBNYXRjaGVzKClgIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwKKworYGBgCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworc3RkOjp2ZWN0b3I8aW50PiB2OworLi4uCisvLyBIb3cgbWFueSBlbGVtZW50cyBpbiB2IGFyZSA+PSAxMD8KK2NvbnN0IGludCBjb3VudCA9IGNvdW50X2lmKHYuYmVnaW4oKSwgdi5lbmQoKSwgTWF0Y2hlcyhHZSgxMCkpKTsKK2BgYAorCitTaW5jZSB5b3UgY2FuIGJ1aWxkIGNvbXBsZXggbWF0Y2hlcnMgZnJvbSBzaW1wbGVyIG9uZXMgZWFzaWx5IHVzaW5nCitHb29nbGUgTW9jaywgdGhpcyBnaXZlcyB5b3UgYSB3YXkgdG8gY29udmVuaWVudGx5IGNvbnN0cnVjdCBjb21wb3NpdGUKK3ByZWRpY2F0ZXMgKGRvaW5nIHRoZSBzYW1lIHVzaW5nIFNUTCdzIGA8ZnVuY3Rpb25hbD5gIGhlYWRlciBpcyBqdXN0CitwYWluZnVsKS4gRm9yIGV4YW1wbGUsIGhlcmUncyBhIHByZWRpY2F0ZSB0aGF0J3Mgc2F0aXNmaWVkIGJ5IGFueQorbnVtYmVyIHRoYXQgaXMgPj0gMCwgPD0gMTAwLCBhbmQgIT0gNTA6CisKK2BgYAorTWF0Y2hlcyhBbGxPZihHZSgwKSwgTGUoMTAwKSwgTmUoNTApKSkKK2BgYAorCisjIyBVc2luZyBNYXRjaGVycyBpbiBHb29nbGUgVGVzdCBBc3NlcnRpb25zICMjCisKK1NpbmNlIG1hdGNoZXJzIGFyZSBiYXNpY2FsbHkgcHJlZGljYXRlcyB0aGF0IGFsc28ga25vdyBob3cgdG8gZGVzY3JpYmUKK3RoZW1zZWx2ZXMsIHRoZXJlIGlzIGEgd2F5IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZW0gaW4KK1tHb29nbGUgVGVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvKSBhc3NlcnRpb25zLiBJdCdzCitjYWxsZWQgYEFTU0VSVF9USEFUYCBhbmQgYEVYUEVDVF9USEFUYDoKKworYGBgCisgIEFTU0VSVF9USEFUKHZhbHVlLCBtYXRjaGVyKTsgIC8vIEFzc2VydHMgdGhhdCB2YWx1ZSBtYXRjaGVzIG1hdGNoZXIuCisgIEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKTsgIC8vIFRoZSBub24tZmF0YWwgdmVyc2lvbi4KK2BgYAorCitGb3IgZXhhbXBsZSwgaW4gYSBHb29nbGUgVGVzdCB0ZXN0IHlvdSBjYW4gd3JpdGU6CisKK2BgYAorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKK3VzaW5nIDo6dGVzdGluZzo6QWxsT2Y7Cit1c2luZyA6OnRlc3Rpbmc6OkdlOwordXNpbmcgOjp0ZXN0aW5nOjpMZTsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hlc1JlZ2V4OwordXNpbmcgOjp0ZXN0aW5nOjpTdGFydHNXaXRoOworLi4uCisKKyAgRVhQRUNUX1RIQVQoRm9vKCksIFN0YXJ0c1dpdGgoIkhlbGxvIikpOworICBFWFBFQ1RfVEhBVChCYXIoKSwgTWF0Y2hlc1JlZ2V4KCJMaW5lIFxcZCsiKSk7CisgIEFTU0VSVF9USEFUKEJheigpLCBBbGxPZihHZSg1KSwgTGUoMTApKSk7CitgYGAKKword2hpY2ggKGFzIHlvdSBjYW4gcHJvYmFibHkgZ3Vlc3MpIGV4ZWN1dGVzIGBGb28oKWAsIGBCYXIoKWAsIGFuZAorYEJheigpYCwgYW5kIHZlcmlmaWVzIHRoYXQ6CisKKyAgKiBgRm9vKClgIHJldHVybnMgYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCBgIkhlbGxvImAuCisgICogYEJhcigpYCByZXR1cm5zIGEgc3RyaW5nIHRoYXQgbWF0Y2hlcyByZWd1bGFyIGV4cHJlc3Npb24gYCJMaW5lIFxcZCsiYC4KKyAgKiBgQmF6KClgIHJldHVybnMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFs1LCAxMF0uCisKK1RoZSBuaWNlIHRoaW5nIGFib3V0IHRoZXNlIG1hY3JvcyBpcyB0aGF0IF90aGV5IHJlYWQgbGlrZQorRW5nbGlzaF8uIFRoZXkgZ2VuZXJhdGUgaW5mb3JtYXRpdmUgbWVzc2FnZXMgdG9vLiBGb3IgZXhhbXBsZSwgaWYgdGhlCitmaXJzdCBgRVhQRUNUX1RIQVQoKWAgYWJvdmUgZmFpbHMsIHRoZSBtZXNzYWdlIHdpbGwgYmUgc29tZXRoaW5nIGxpa2U6CisKK2BgYAorVmFsdWUgb2Y6IEZvbygpCisgIEFjdHVhbDogIkhpLCB3b3JsZCEiCitFeHBlY3RlZDogc3RhcnRzIHdpdGggIkhlbGxvIgorYGBgCisKKyoqQ3JlZGl0OioqIFRoZSBpZGVhIG9mIGAoQVNTRVJUfEVYUEVDVClfVEhBVGAgd2FzIHN0b2xlbiBmcm9tIHRoZQorW0hhbWNyZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaGFtY3Jlc3QvKSBwcm9qZWN0LCB3aGljaCBhZGRzCitgYXNzZXJ0VGhhdCgpYCB0byBKVW5pdC4KKworIyMgVXNpbmcgUHJlZGljYXRlcyBhcyBNYXRjaGVycyAjIworCitHb29nbGUgTW9jayBwcm92aWRlcyBhIGJ1aWx0LWluIHNldCBvZiBtYXRjaGVycy4gSW4gY2FzZSB5b3UgZmluZCB0aGVtCitsYWNraW5nLCB5b3UgY2FuIHVzZSBhbiBhcmJpdHJheSB1bmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24gb3IgZnVuY3RvcgorYXMgYSBtYXRjaGVyIC0gYXMgbG9uZyBhcyB0aGUgcHJlZGljYXRlIGFjY2VwdHMgYSB2YWx1ZSBvZiB0aGUgdHlwZQoreW91IHdhbnQuIFlvdSBkbyB0aGlzIGJ5IHdyYXBwaW5nIHRoZSBwcmVkaWNhdGUgaW5zaWRlIHRoZSBgVHJ1bHkoKWAKK2Z1bmN0aW9uLCBmb3IgZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlRydWx5OworCitpbnQgSXNFdmVuKGludCBuKSB7IHJldHVybiAobiAlIDIpID09IDAgPyAxIDogMDsgfQorLi4uCisKKyAgLy8gQmFyKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBldmVuIG51bWJlci4KKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoVHJ1bHkoSXNFdmVuKSkpOworYGBgCisKK05vdGUgdGhhdCB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIC8gZnVuY3RvciBkb2Vzbid0IGhhdmUgdG8gcmV0dXJuCitgYm9vbGAuIEl0IHdvcmtzIGFzIGxvbmcgYXMgdGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUKK2NvbmRpdGlvbiBpbiBzdGF0ZW1lbnQgYGlmIChjb25kaXRpb24pIC4uLmAuCisKKyMjIE1hdGNoaW5nIEFyZ3VtZW50cyB0aGF0IEFyZSBOb3QgQ29weWFibGUgIyMKKworV2hlbiB5b3UgZG8gYW4gYEVYUEVDVF9DQUxMKG1vY2tfb2JqLCBGb28oYmFyKSlgLCBHb29nbGUgTW9jayBzYXZlcworYXdheSBhIGNvcHkgb2YgYGJhcmAuIFdoZW4gYEZvbygpYCBpcyBjYWxsZWQgbGF0ZXIsIEdvb2dsZSBNb2NrCitjb21wYXJlcyB0aGUgYXJndW1lbnQgdG8gYEZvbygpYCB3aXRoIHRoZSBzYXZlZCBjb3B5IG9mIGBiYXJgLiBUaGlzCit3YXksIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGBiYXJgIGJlaW5nIG1vZGlmaWVkIG9yIGRlc3Ryb3llZAorYWZ0ZXIgdGhlIGBFWFBFQ1RfQ0FMTCgpYCBpcyBleGVjdXRlZC4gVGhlIHNhbWUgaXMgdHJ1ZSB3aGVuIHlvdSB1c2UKK21hdGNoZXJzIGxpa2UgYEVxKGJhcilgLCBgTGUoYmFyKWAsIGFuZCBzbyBvbi4KKworQnV0IHdoYXQgaWYgYGJhcmAgY2Fubm90IGJlIGNvcGllZCAoaS5lLiBoYXMgbm8gY29weSBjb25zdHJ1Y3Rvcik/IFlvdQorY291bGQgZGVmaW5lIHlvdXIgb3duIG1hdGNoZXIgZnVuY3Rpb24gYW5kIHVzZSBpdCB3aXRoIGBUcnVseSgpYCwgYXMKK3RoZSBwcmV2aW91cyBjb3VwbGUgb2YgcmVjaXBlcyBoYXZlIHNob3duLiBPciwgeW91IG1heSBiZSBhYmxlIHRvIGdldAorYXdheSBmcm9tIGl0IGlmIHlvdSBjYW4gZ3VhcmFudGVlIHRoYXQgYGJhcmAgd29uJ3QgYmUgY2hhbmdlZCBhZnRlcgordGhlIGBFWFBFQ1RfQ0FMTCgpYCBpcyBleGVjdXRlZC4gSnVzdCB0ZWxsIEdvb2dsZSBNb2NrIHRoYXQgaXQgc2hvdWxkCitzYXZlIGEgcmVmZXJlbmNlIHRvIGBiYXJgLCBpbnN0ZWFkIG9mIGEgY29weSBvZiBpdC4gSGVyZSdzIGhvdzoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkVxOwordXNpbmcgOjp0ZXN0aW5nOjpCeVJlZjsKK3VzaW5nIDo6dGVzdGluZzo6THQ7CisuLi4KKyAgLy8gRXhwZWN0cyB0aGF0IEZvbygpJ3MgYXJndW1lbnQgPT0gYmFyLgorICBFWFBFQ1RfQ0FMTChtb2NrX29iaiwgRm9vKEVxKEJ5UmVmKGJhcikpKSk7CisKKyAgLy8gRXhwZWN0cyB0aGF0IEZvbygpJ3MgYXJndW1lbnQgPCBiYXIuCisgIEVYUEVDVF9DQUxMKG1vY2tfb2JqLCBGb28oTHQoQnlSZWYoYmFyKSkpKTsKK2BgYAorCitSZW1lbWJlcjogaWYgeW91IGRvIHRoaXMsIGRvbid0IGNoYW5nZSBgYmFyYCBhZnRlciB0aGUKK2BFWFBFQ1RfQ0FMTCgpYCwgb3IgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisKKyMjIFZhbGlkYXRpbmcgYSBNZW1iZXIgb2YgYW4gT2JqZWN0ICMjCisKK09mdGVuIGEgbW9jayBmdW5jdGlvbiB0YWtlcyBhIHJlZmVyZW5jZSB0byBvYmplY3QgYXMgYW4gYXJndW1lbnQuIFdoZW4KK21hdGNoaW5nIHRoZSBhcmd1bWVudCwgeW91IG1heSBub3Qgd2FudCB0byBjb21wYXJlIHRoZSBlbnRpcmUgb2JqZWN0CithZ2FpbnN0IGEgZml4ZWQgb2JqZWN0LCBhcyB0aGF0IG1heSBiZSBvdmVyLXNwZWNpZmljYXRpb24uIEluc3RlYWQsCit5b3UgbWF5IG5lZWQgdG8gdmFsaWRhdGUgYSBjZXJ0YWluIG1lbWJlciB2YXJpYWJsZSBvciB0aGUgcmVzdWx0IG9mIGEKK2NlcnRhaW4gZ2V0dGVyIG1ldGhvZCBvZiB0aGUgb2JqZWN0LiBZb3UgY2FuIGRvIHRoaXMgd2l0aCBgRmllbGQoKWAKK2FuZCBgUHJvcGVydHkoKWAuIE1vcmUgc3BlY2lmaWNhbGx5LAorCitgYGAKK0ZpZWxkKCZGb286OmJhciwgbSkKK2BgYAorCitpcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgYEZvb2Agb2JqZWN0IHdob3NlIGBiYXJgIG1lbWJlciB2YXJpYWJsZQorc2F0aXNmaWVzIG1hdGNoZXIgYG1gLgorCitgYGAKK1Byb3BlcnR5KCZGb286OmJheiwgbSkKK2BgYAorCitpcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgYEZvb2Agb2JqZWN0IHdob3NlIGBiYXooKWAgbWV0aG9kIHJldHVybnMKK2EgdmFsdWUgdGhhdCBzYXRpc2ZpZXMgbWF0Y2hlciBgbWAuCisKK0ZvciBleGFtcGxlOgorCis+IHwgYEZpZWxkKCZGb286Om51bWJlciwgR2UoMykpYCB8IE1hdGNoZXMgYHhgIHdoZXJlIGB4Lm51bWJlciA+PSAzYC4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cis+IHwgYFByb3BlcnR5KCZGb286Om5hbWUsIFN0YXJ0c1dpdGgoIkpvaG4gIikpYCB8IE1hdGNoZXMgYHhgIHdoZXJlIGB4Lm5hbWUoKWAgc3RhcnRzIHdpdGggYCJKb2huICJgLiB8CisKK05vdGUgdGhhdCBpbiBgUHJvcGVydHkoJkZvbzo6YmF6LCAuLi4pYCwgbWV0aG9kIGBiYXooKWAgbXVzdCB0YWtlIG5vCithcmd1bWVudCBhbmQgYmUgZGVjbGFyZWQgYXMgYGNvbnN0YC4KKworQlRXLCBgRmllbGQoKWAgYW5kIGBQcm9wZXJ0eSgpYCBjYW4gYWxzbyBtYXRjaCBwbGFpbiBwb2ludGVycyB0bworb2JqZWN0cy4gRm9yIGluc3RhbmNlLAorCitgYGAKK0ZpZWxkKCZGb286Om51bWJlciwgR2UoMykpCitgYGAKKworbWF0Y2hlcyBhIHBsYWluIHBvaW50ZXIgYHBgIHdoZXJlIGBwLT5udW1iZXIgPj0gM2AuIElmIGBwYCBpcyBgTlVMTGAsCit0aGUgbWF0Y2ggd2lsbCBhbHdheXMgZmFpbCByZWdhcmRsZXNzIG9mIHRoZSBpbm5lciBtYXRjaGVyLgorCitXaGF0IGlmIHlvdSB3YW50IHRvIHZhbGlkYXRlIG1vcmUgdGhhbiBvbmUgbWVtYmVycyBhdCB0aGUgc2FtZSB0aW1lPworUmVtZW1iZXIgdGhhdCB0aGVyZSBpcyBgQWxsT2YoKWAuCisKKyMjIFZhbGlkYXRpbmcgdGhlIFZhbHVlIFBvaW50ZWQgdG8gYnkgYSBQb2ludGVyIEFyZ3VtZW50ICMjCisKK0MrKyBmdW5jdGlvbnMgb2Z0ZW4gdGFrZSBwb2ludGVycyBhcyBhcmd1bWVudHMuIFlvdSBjYW4gdXNlIG1hdGNoZXJzCitsaWtlIGBJc051bGwoKWAsIGBOb3ROdWxsKClgLCBhbmQgb3RoZXIgY29tcGFyaXNvbiBtYXRjaGVycyB0byBtYXRjaCBhCitwb2ludGVyLCBidXQgd2hhdCBpZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIHZhbHVlIF9wb2ludGVkIHRvXyBieQordGhlIHBvaW50ZXIsIGluc3RlYWQgb2YgdGhlIHBvaW50ZXIgaXRzZWxmLCBoYXMgYSBjZXJ0YWluIHByb3BlcnR5PworV2VsbCwgeW91IGNhbiB1c2UgdGhlIGBQb2ludGVlKG0pYCBtYXRjaGVyLgorCitgUG9pbnRlZShtKWAgbWF0Y2hlcyBhIHBvaW50ZXIgaWZmIGBtYCBtYXRjaGVzIHRoZSB2YWx1ZSB0aGUgcG9pbnRlcgorcG9pbnRzIHRvLiBGb3IgZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkdlOwordXNpbmcgOjp0ZXN0aW5nOjpQb2ludGVlOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKFBvaW50ZWUoR2UoMykpKSk7CitgYGAKKworZXhwZWN0cyBgZm9vLkJhcigpYCB0byBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSB2YWx1ZQorZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMuCisKK09uZSBuaWNlIHRoaW5nIGFib3V0IGBQb2ludGVlKClgIGlzIHRoYXQgaXQgdHJlYXRzIGEgYE5VTExgIHBvaW50ZXIgYXMKK2EgbWF0Y2ggZmFpbHVyZSwgc28geW91IGNhbiB3cml0ZSBgUG9pbnRlZShtKWAgaW5zdGVhZCBvZgorCitgYGAKKyAgQWxsT2YoTm90TnVsbCgpLCBQb2ludGVlKG0pKQorYGBgCisKK3dpdGhvdXQgd29ycnlpbmcgdGhhdCBhIGBOVUxMYCBwb2ludGVyIHdpbGwgY3Jhc2ggeW91ciB0ZXN0LgorCitBbHNvLCBkaWQgd2UgdGVsbCB5b3UgdGhhdCBgUG9pbnRlZSgpYCB3b3JrcyB3aXRoIGJvdGggcmF3IHBvaW50ZXJzCisqKmFuZCoqIHNtYXJ0IHBvaW50ZXJzIChgbGlua2VkX3B0cmAsIGBzaGFyZWRfcHRyYCwgYHNjb3BlZF9wdHJgLCBhbmQKK2V0Yyk/CisKK1doYXQgaWYgeW91IGhhdmUgYSBwb2ludGVyIHRvIHBvaW50ZXI/IFlvdSBndWVzc2VkIGl0IC0geW91IGNhbiB1c2UKK25lc3RlZCBgUG9pbnRlZSgpYCB0byBwcm9iZSBkZWVwZXIgaW5zaWRlIHRoZSB2YWx1ZS4gRm9yIGV4YW1wbGUsCitgUG9pbnRlZShQb2ludGVlKEx0KDMpKSlgIG1hdGNoZXMgYSBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgcG9pbnRlcgordGhhdCBwb2ludHMgdG8gYSBudW1iZXIgbGVzcyB0aGFuIDMgKHdoYXQgYSBtb3V0aGZ1bC4uLikuCisKKyMjIFRlc3RpbmcgYSBDZXJ0YWluIFByb3BlcnR5IG9mIGFuIE9iamVjdCAjIworCitTb21ldGltZXMgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGF0IGFuIG9iamVjdCBhcmd1bWVudCBoYXMgYSBjZXJ0YWluCitwcm9wZXJ0eSwgYnV0IHRoZXJlIGlzIG5vIGV4aXN0aW5nIG1hdGNoZXIgdGhhdCBkb2VzIHRoaXMuIElmIHlvdSB3YW50Citnb29kIGVycm9yIG1lc3NhZ2VzLCB5b3Ugc2hvdWxkIGRlZmluZSBhIG1hdGNoZXIuIElmIHlvdSB3YW50IHRvIGRvIGl0CitxdWljayBhbmQgZGlydHksIHlvdSBjb3VsZCBnZXQgYXdheSB3aXRoIHdyaXRpbmcgYW4gb3JkaW5hcnkgZnVuY3Rpb24uCisKK0xldCdzIHNheSB5b3UgaGF2ZSBhIG1vY2sgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBvYmplY3Qgb2YgdHlwZSBgRm9vYCwKK3doaWNoIGhhcyBhbiBgaW50IGJhcigpYCBtZXRob2QgYW5kIGFuIGBpbnQgYmF6KClgIG1ldGhvZCwgYW5kIHlvdQord2FudCB0byBjb25zdHJhaW4gdGhhdCB0aGUgYXJndW1lbnQncyBgYmFyKClgIHZhbHVlIHBsdXMgaXRzIGBiYXooKWAKK3ZhbHVlIGlzIGEgZ2l2ZW4gbnVtYmVyLiBIZXJlJ3MgaG93IHlvdSBjYW4gZGVmaW5lIGEgbWF0Y2hlciB0byBkbyBpdDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisKK2NsYXNzIEJhclBsdXNCYXpFcU1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxjb25zdCBGb28mPiB7CisgcHVibGljOgorICBleHBsaWNpdCBCYXJQbHVzQmF6RXFNYXRjaGVyKGludCBleHBlY3RlZF9zdW0pCisgICAgICA6IGV4cGVjdGVkX3N1bV8oZXhwZWN0ZWRfc3VtKSB7fQorCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgRm9vJiBmb28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gKGZvby5iYXIoKSArIGZvby5iYXooKSkgPT0gZXhwZWN0ZWRfc3VtXzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiYmFyKCkgKyBiYXooKSBlcXVhbHMgIiA8PCBleHBlY3RlZF9zdW1fOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImJhcigpICsgYmF6KCkgZG9lcyBub3QgZXF1YWwgIiA8PCBleHBlY3RlZF9zdW1fOworICB9CisgcHJpdmF0ZToKKyAgY29uc3QgaW50IGV4cGVjdGVkX3N1bV87Cit9OworCitpbmxpbmUgTWF0Y2hlcjxjb25zdCBGb28mPiBCYXJQbHVzQmF6RXEoaW50IGV4cGVjdGVkX3N1bSkgeworICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEJhclBsdXNCYXpFcU1hdGNoZXIoZXhwZWN0ZWRfc3VtKSk7Cit9CisKKy4uLgorCisgIEVYUEVDVF9DQUxMKC4uLiwgRG9UaGlzKEJhclBsdXNCYXpFcSg1KSkpLi4uOworYGBgCisKKyMjIE1hdGNoaW5nIENvbnRhaW5lcnMgIyMKKworU29tZXRpbWVzIGFuIFNUTCBjb250YWluZXIgKGUuZy4gbGlzdCwgdmVjdG9yLCBtYXAsIC4uLikgaXMgcGFzc2VkIHRvCithIG1vY2sgZnVuY3Rpb24gYW5kIHlvdSBtYXkgd2FudCB0byB2YWxpZGF0ZSBpdC4gU2luY2UgbW9zdCBTVEwKK2NvbnRhaW5lcnMgc3VwcG9ydCB0aGUgYD09YCBvcGVyYXRvciwgeW91IGNhbiB3cml0ZQorYEVxKGV4cGVjdGVkX2NvbnRhaW5lcilgIG9yIHNpbXBseSBgZXhwZWN0ZWRfY29udGFpbmVyYCB0byBtYXRjaCBhCitjb250YWluZXIgZXhhY3RseS4KKworU29tZXRpbWVzLCB0aG91Z2gsIHlvdSBtYXkgd2FudCB0byBiZSBtb3JlIGZsZXhpYmxlIChmb3IgZXhhbXBsZSwgdGhlCitmaXJzdCBlbGVtZW50IG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gsIGJ1dCB0aGUgc2Vjb25kIGVsZW1lbnQgY2FuIGJlCithbnkgcG9zaXRpdmUgbnVtYmVyLCBhbmQgc28gb24pLiBBbHNvLCBjb250YWluZXJzIHVzZWQgaW4gdGVzdHMgb2Z0ZW4KK2hhdmUgYSBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMsIGFuZCBoYXZpbmcgdG8gZGVmaW5lIHRoZSBleHBlY3RlZAorY29udGFpbmVyIG91dC1vZi1saW5lIGlzIGEgYml0IG9mIGEgaGFzc2xlLgorCitZb3UgY2FuIHVzZSB0aGUgYEVsZW1lbnRzQXJlKClgIG9yIGBVbm9yZGVyZWRFbGVtZW50c0FyZSgpYCBtYXRjaGVyIGluCitzdWNoIGNhc2VzOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6RWxlbWVudHNBcmU7Cit1c2luZyA6OnRlc3Rpbmc6Okd0OworLi4uCisKKyAgTU9DS19NRVRIT0QxKEZvbywgdm9pZChjb25zdCB2ZWN0b3I8aW50PiYgbnVtYmVycykpOworLi4uCisKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKEVsZW1lbnRzQXJlKDEsIEd0KDApLCBfLCA1KSkpOworYGBgCisKK1RoZSBhYm92ZSBtYXRjaGVyIHNheXMgdGhhdCB0aGUgY29udGFpbmVyIG11c3QgaGF2ZSA0IGVsZW1lbnRzLCB3aGljaAorbXVzdCBiZSAxLCBncmVhdGVyIHRoYW4gMCwgYW55dGhpbmcsIGFuZCA1IHJlc3BlY3RpdmVseS4KKworSWYgeW91IGluc3RlYWQgd3JpdGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpHdDsKK3VzaW5nIDo6dGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmU7CisuLi4KKworICBNT0NLX01FVEhPRDEoRm9vLCB2b2lkKGNvbnN0IHZlY3RvcjxpbnQ+JiBudW1iZXJzKSk7CisuLi4KKworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgR3QoMCksIF8sIDUpKSk7CitgYGAKKworSXQgbWVhbnMgdGhhdCB0aGUgY29udGFpbmVyIG11c3QgaGF2ZSA0IGVsZW1lbnRzLCB3aGljaCB1bmRlciBzb21lCitwZXJtdXRhdGlvbiBtdXN0IGJlIDEsIGdyZWF0ZXIgdGhhbiAwLCBhbnl0aGluZywgYW5kIDUgcmVzcGVjdGl2ZWx5LgorCitgRWxlbWVudHNBcmUoKWAgYW5kIGBVbm9yZGVyZWRFbGVtZW50c0FyZSgpYCBhcmUgb3ZlcmxvYWRlZCB0byB0YWtlIDAKK3RvIDEwIGFyZ3VtZW50cy4gSWYgbW9yZSBhcmUgbmVlZGVkLCB5b3UgY2FuIHBsYWNlIHRoZW0gaW4gYSBDLXN0eWxlCithcnJheSBhbmQgdXNlIGBFbGVtZW50c0FyZUFycmF5KClgIG9yIGBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KClgCitpbnN0ZWFkOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RWxlbWVudHNBcmVBcnJheTsKKy4uLgorCisgIC8vIEVsZW1lbnRzQXJlQXJyYXkgYWNjZXB0cyBhbiBhcnJheSBvZiBlbGVtZW50IHZhbHVlcy4KKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZlY3RvcjFbXSA9IHsgMSwgNSwgMiwgNCwgLi4uIH07CisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkX3ZlY3RvcjEpKSk7CisKKyAgLy8gT3IsIGFuIGFycmF5IG9mIGVsZW1lbnQgbWF0Y2hlcnMuCisgIE1hdGNoZXI8aW50PiBleHBlY3RlZF92ZWN0b3IyID0geyAxLCBHdCgyKSwgXywgMywgLi4uIH07CisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkX3ZlY3RvcjIpKSk7CitgYGAKKworSW4gY2FzZSB0aGUgYXJyYXkgbmVlZHMgdG8gYmUgZHluYW1pY2FsbHkgY3JlYXRlZCAoYW5kIHRoZXJlZm9yZSB0aGUKK2FycmF5IHNpemUgY2Fubm90IGJlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlciksIHlvdSBjYW4gZ2l2ZQorYEVsZW1lbnRzQXJlQXJyYXkoKWAgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB0byBzcGVjaWZ5IHRoZSBhcnJheSBzaXplOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RWxlbWVudHNBcmVBcnJheTsKKy4uLgorICBpbnQqIGNvbnN0IGV4cGVjdGVkX3ZlY3RvcjMgPSBuZXcgaW50W2NvdW50XTsKKyAgLi4uIGZpbGwgZXhwZWN0ZWRfdmVjdG9yMyB3aXRoIHZhbHVlcyAuLi4KKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKEVsZW1lbnRzQXJlQXJyYXkoZXhwZWN0ZWRfdmVjdG9yMywgY291bnQpKSk7CitgYGAKKworKipUaXBzOioqCisKKyAgKiBgRWxlbWVudHNBcmUqKClgIGNhbiBiZSB1c2VkIHRvIG1hdGNoIF9hbnlfIGNvbnRhaW5lciB0aGF0IGltcGxlbWVudHMgdGhlIFNUTCBpdGVyYXRvciBwYXR0ZXJuIChpLmUuIGl0IGhhcyBhIGBjb25zdF9pdGVyYXRvcmAgdHlwZSBhbmQgc3VwcG9ydHMgYGJlZ2luKCkvZW5kKClgKSwgbm90IGp1c3QgdGhlIG9uZXMgZGVmaW5lZCBpbiBTVEwuIEl0IHdpbGwgZXZlbiB3b3JrIHdpdGggY29udGFpbmVyIHR5cGVzIHlldCB0byBiZSB3cml0dGVuIC0gYXMgbG9uZyBhcyB0aGV5IGZvbGxvd3MgdGhlIGFib3ZlIHBhdHRlcm4uCisgICogWW91IGNhbiB1c2UgbmVzdGVkIGBFbGVtZW50c0FyZSooKWAgdG8gbWF0Y2ggbmVzdGVkIChtdWx0aS1kaW1lbnNpb25hbCkgY29udGFpbmVycy4KKyAgKiBJZiB0aGUgY29udGFpbmVyIGlzIHBhc3NlZCBieSBwb2ludGVyIGluc3RlYWQgb2YgYnkgcmVmZXJlbmNlLCBqdXN0IHdyaXRlIGBQb2ludGVlKEVsZW1lbnRzQXJlKiguLi4pKWAuCisgICogVGhlIG9yZGVyIG9mIGVsZW1lbnRzIF9tYXR0ZXJzXyBmb3IgYEVsZW1lbnRzQXJlKigpYC4gVGhlcmVmb3JlIGRvbid0IHVzZSBpdCB3aXRoIGNvbnRhaW5lcnMgd2hvc2UgZWxlbWVudCBvcmRlciBpcyB1bmRlZmluZWQgKGUuZy4gYGhhc2hfbWFwYCkuCisKKyMjIFNoYXJpbmcgTWF0Y2hlcnMgIyMKKworVW5kZXIgdGhlIGhvb2QsIGEgR29vZ2xlIE1vY2sgbWF0Y2hlciBvYmplY3QgY29uc2lzdHMgb2YgYSBwb2ludGVyIHRvCithIHJlZi1jb3VudGVkIGltcGxlbWVudGF0aW9uIG9iamVjdC4gQ29weWluZyBtYXRjaGVycyBpcyBhbGxvd2VkIGFuZAordmVyeSBlZmZpY2llbnQsIGFzIG9ubHkgdGhlIHBvaW50ZXIgaXMgY29waWVkLiBXaGVuIHRoZSBsYXN0IG1hdGNoZXIKK3RoYXQgcmVmZXJlbmNlcyB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0IGRpZXMsIHRoZSBpbXBsZW1lbnRhdGlvbgorb2JqZWN0IHdpbGwgYmUgZGVsZXRlZC4KKworVGhlcmVmb3JlLCBpZiB5b3UgaGF2ZSBzb21lIGNvbXBsZXggbWF0Y2hlciB0aGF0IHlvdSB3YW50IHRvIHVzZSBhZ2FpbgorYW5kIGFnYWluLCB0aGVyZSBpcyBubyBuZWVkIHRvIGJ1aWxkIGl0IGV2ZXJ5dGltZS4gSnVzdCBhc3NpZ24gaXQgdG8gYQorbWF0Y2hlciB2YXJpYWJsZSBhbmQgdXNlIHRoYXQgdmFyaWFibGUgcmVwZWF0ZWRseSEgRm9yIGV4YW1wbGUsCisKK2BgYAorICBNYXRjaGVyPGludD4gaW5fcmFuZ2UgPSBBbGxPZihHdCg1KSwgTGUoMTApKTsKKyAgLi4uIHVzZSBpbl9yYW5nZSBhcyBhIG1hdGNoZXIgaW4gbXVsdGlwbGUgRVhQRUNUX0NBTExzIC4uLgorYGBgCisKKyMgU2V0dGluZyBFeHBlY3RhdGlvbnMgIworCisjIyBLbm93aW5nIFdoZW4gdG8gRXhwZWN0ICMjCisKK2BPTl9DQUxMYCBpcyBsaWtlbHkgdGhlIHNpbmdsZSBtb3N0IHVuZGVyLXV0aWxpemVkIGNvbnN0cnVjdCBpbiBHb29nbGUgTW9jay4KKworVGhlcmUgYXJlIGJhc2ljYWxseSB0d28gY29uc3RydWN0cyBmb3IgZGVmaW5pbmcgdGhlIGJlaGF2aW9yIG9mIGEgbW9jayBvYmplY3Q6IGBPTl9DQUxMYCBhbmQgYEVYUEVDVF9DQUxMYC4gVGhlIGRpZmZlcmVuY2U/IGBPTl9DQUxMYCBkZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIGEgbW9jayBtZXRob2QgaXMgY2FsbGVkLCBidXQgX2RvZXNuJ3QgaW1wbHkgYW55IGV4cGVjdGF0aW9uIG9uIHRoZSBtZXRob2QgYmVpbmcgY2FsbGVkLl8gYEVYUEVDVF9DQUxMYCBub3Qgb25seSBkZWZpbmVzIHRoZSBiZWhhdmlvciwgYnV0IGFsc28gc2V0cyBhbiBleHBlY3RhdGlvbiB0aGF0IF90aGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cywgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgdGltZXNfIChhbmQgX2luIHRoZSBnaXZlbiBvcmRlcl8gd2hlbiB5b3Ugc3BlY2lmeSB0aGUgb3JkZXIgdG9vKS4KKworU2luY2UgYEVYUEVDVF9DQUxMYCBkb2VzIG1vcmUsIGlzbid0IGl0IGJldHRlciB0aGFuIGBPTl9DQUxMYD8gTm90IHJlYWxseS4gRXZlcnkgYEVYUEVDVF9DQUxMYCBhZGRzIGEgY29uc3RyYWludCBvbiB0aGUgYmVoYXZpb3Igb2YgdGhlIGNvZGUgdW5kZXIgdGVzdC4gSGF2aW5nIG1vcmUgY29uc3RyYWludHMgdGhhbiBuZWNlc3NhcnkgaXMgX2JhYWFkXyAtIGV2ZW4gd29yc2UgdGhhbiBub3QgaGF2aW5nIGVub3VnaCBjb25zdHJhaW50cy4KKworVGhpcyBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUuIEhvdyBjb3VsZCB0ZXN0cyB0aGF0IHZlcmlmeSBtb3JlIGJlIHdvcnNlIHRoYW4gdGVzdHMgdGhhdCB2ZXJpZnkgbGVzcz8gSXNuJ3QgdmVyaWZpY2F0aW9uIHRoZSB3aG9sZSBwb2ludCBvZiB0ZXN0cz8KKworVGhlIGFuc3dlciwgbGllcyBpbiBfd2hhdF8gYSB0ZXN0IHNob3VsZCB2ZXJpZnkuICoqQSBnb29kIHRlc3QgdmVyaWZpZXMgdGhlIGNvbnRyYWN0IG9mIHRoZSBjb2RlLioqIElmIGEgdGVzdCBvdmVyLXNwZWNpZmllcywgaXQgZG9lc24ndCBsZWF2ZSBlbm91Z2ggZnJlZWRvbSB0byB0aGUgaW1wbGVtZW50YXRpb24uIEFzIGEgcmVzdWx0LCBjaGFuZ2luZyB0aGUgaW1wbGVtZW50YXRpb24gd2l0aG91dCBicmVha2luZyB0aGUgY29udHJhY3QgKGUuZy4gcmVmYWN0b3JpbmcgYW5kIG9wdGltaXphdGlvbiksIHdoaWNoIHNob3VsZCBiZSBwZXJmZWN0bHkgZmluZSB0byBkbywgY2FuIGJyZWFrIHN1Y2ggdGVzdHMuIFRoZW4geW91IGhhdmUgdG8gc3BlbmQgdGltZSBmaXhpbmcgdGhlbSwgb25seSB0byBzZWUgdGhlbSBicm9rZW4gYWdhaW4gdGhlIG5leHQgdGltZSB0aGUgaW1wbGVtZW50YXRpb24gaXMgY2hhbmdlZC4KKworS2VlcCBpbiBtaW5kIHRoYXQgb25lIGRvZXNuJ3QgaGF2ZSB0byB2ZXJpZnkgbW9yZSB0aGFuIG9uZSBwcm9wZXJ0eSBpbiBvbmUgdGVzdC4gSW4gZmFjdCwgKippdCdzIGEgZ29vZCBzdHlsZSB0byB2ZXJpZnkgb25seSBvbmUgdGhpbmcgaW4gb25lIHRlc3QuKiogSWYgeW91IGRvIHRoYXQsIGEgYnVnIHdpbGwgbGlrZWx5IGJyZWFrIG9ubHkgb25lIG9yIHR3byB0ZXN0cyBpbnN0ZWFkIG9mIGRvemVucyAod2hpY2ggY2FzZSB3b3VsZCB5b3UgcmF0aGVyIGRlYnVnPykuIElmIHlvdSBhcmUgYWxzbyBpbiB0aGUgaGFiaXQgb2YgZ2l2aW5nIHRlc3RzIGRlc2NyaXB0aXZlIG5hbWVzIHRoYXQgdGVsbCB3aGF0IHRoZXkgdmVyaWZ5LCB5b3UgY2FuIG9mdGVuIGVhc2lseSBndWVzcyB3aGF0J3Mgd3JvbmcganVzdCBmcm9tIHRoZSB0ZXN0IGxvZyBpdHNlbGYuCisKK1NvIHVzZSBgT05fQ0FMTGAgYnkgZGVmYXVsdCwgYW5kIG9ubHkgdXNlIGBFWFBFQ1RfQ0FMTGAgd2hlbiB5b3UgYWN0dWFsbHkgaW50ZW5kIHRvIHZlcmlmeSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuIEZvciBleGFtcGxlLCB5b3UgbWF5IGhhdmUgYSBidW5jaCBvZiBgT05fQ0FMTGBzIGluIHlvdXIgdGVzdCBmaXh0dXJlIHRvIHNldCB0aGUgY29tbW9uIG1vY2sgYmVoYXZpb3Igc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGUgc2FtZSBncm91cCwgYW5kIHdyaXRlIChzY2FyY2VseSkgZGlmZmVyZW50IGBFWFBFQ1RfQ0FMTGBzIGluIGRpZmZlcmVudCBgVEVTVF9GYHMgdG8gdmVyaWZ5IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSBjb2RlJ3MgYmVoYXZpb3IuIENvbXBhcmVkIHdpdGggdGhlIHN0eWxlIHdoZXJlIGVhY2ggYFRFU1RgIGhhcyBtYW55IGBFWFBFQ1RfQ0FMTGBzLCB0aGlzIGxlYWRzIHRvIHRlc3RzIHRoYXQgYXJlIG1vcmUgcmVzaWxpZW50IHRvIGltcGxlbWVudGF0aW9uYWwgY2hhbmdlcyAoYW5kIHRodXMgbGVzcyBsaWtlbHkgdG8gcmVxdWlyZSBtYWludGVuYW5jZSkgYW5kIG1ha2VzIHRoZSBpbnRlbnQgb2YgdGhlIHRlc3RzIG1vcmUgb2J2aW91cyAoc28gdGhleSBhcmUgZWFzaWVyIHRvIG1haW50YWluIHdoZW4geW91IGRvIG5lZWQgdG8gbWFpbnRhaW4gdGhlbSkuCisKK0lmIHlvdSBhcmUgYm90aGVyZWQgYnkgdGhlICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCIgbWVzc2FnZSBwcmludGVkIHdoZW4gYSBtb2NrIG1ldGhvZCB3aXRob3V0IGFuIGBFWFBFQ1RfQ0FMTGAgaXMgY2FsbGVkLCB5b3UgbWF5IHVzZSBhIGBOaWNlTW9ja2AgaW5zdGVhZCB0byBzdXBwcmVzcyBhbGwgc3VjaCBtZXNzYWdlcyBmb3IgdGhlIG1vY2sgb2JqZWN0LCBvciBzdXBwcmVzcyB0aGUgbWVzc2FnZSBmb3Igc3BlY2lmaWMgbWV0aG9kcyBieSBhZGRpbmcgYEVYUEVDVF9DQUxMKC4uLikuVGltZXMoQW55TnVtYmVyKCkpYC4gRE8gTk9UIHN1cHByZXNzIGl0IGJ5IGJsaW5kbHkgYWRkaW5nIGFuIGBFWFBFQ1RfQ0FMTCguLi4pYCwgb3IgeW91J2xsIGhhdmUgYSB0ZXN0IHRoYXQncyBhIHBhaW4gdG8gbWFpbnRhaW4uCisKKyMjIElnbm9yaW5nIFVuaW50ZXJlc3RpbmcgQ2FsbHMgIyMKKworSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiBob3cgYSBtb2NrIG1ldGhvZCBpcyBjYWxsZWQsIGp1c3QgZG9uJ3QKK3NheSBhbnl0aGluZyBhYm91dCBpdC4gSW4gdGhpcyBjYXNlLCBpZiB0aGUgbWV0aG9kIGlzIGV2ZXIgY2FsbGVkLAorR29vZ2xlIE1vY2sgd2lsbCBwZXJmb3JtIGl0cyBkZWZhdWx0IGFjdGlvbiB0byBhbGxvdyB0aGUgdGVzdCBwcm9ncmFtCit0byBjb250aW51ZS4gSWYgeW91IGFyZSBub3QgaGFwcHkgd2l0aCB0aGUgZGVmYXVsdCBhY3Rpb24gdGFrZW4gYnkKK0dvb2dsZSBNb2NrLCB5b3UgY2FuIG92ZXJyaWRlIGl0IHVzaW5nIGBEZWZhdWx0VmFsdWU8VD46OlNldCgpYAorKGRlc2NyaWJlZCBsYXRlciBpbiB0aGlzIGRvY3VtZW50KSBvciBgT05fQ0FMTCgpYC4KKworUGxlYXNlIG5vdGUgdGhhdCBvbmNlIHlvdSBleHByZXNzZWQgaW50ZXJlc3QgaW4gYSBwYXJ0aWN1bGFyIG1vY2sKK21ldGhvZCAodmlhIGBFWFBFQ1RfQ0FMTCgpYCksIGFsbCBpbnZvY2F0aW9ucyB0byBpdCBtdXN0IG1hdGNoIHNvbWUKK2V4cGVjdGF0aW9uLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBidXQgdGhlIGFyZ3VtZW50cyBkb24ndCBtYXRjaAorYW55IGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnQsIGl0IHdpbGwgYmUgYW4gZXJyb3IuCisKKyMjIERpc2FsbG93aW5nIFVuZXhwZWN0ZWQgQ2FsbHMgIyMKKworSWYgYSBtb2NrIG1ldGhvZCBzaG91bGRuJ3QgYmUgY2FsbGVkIGF0IGFsbCwgZXhwbGljaXRseSBzYXkgc286CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKF8pKQorICAgICAgLlRpbWVzKDApOworYGBgCisKK0lmIHNvbWUgY2FsbHMgdG8gdGhlIG1ldGhvZCBhcmUgYWxsb3dlZCwgYnV0IHRoZSByZXN0IGFyZSBub3QsIGp1c3QKK2xpc3QgYWxsIHRoZSBleHBlY3RlZCBjYWxsczoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKK3VzaW5nIDo6dGVzdGluZzo6R3Q7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoNSkpOworICBFWFBFQ1RfQ0FMTChmb28sIEJhcihHdCgxMCkpKQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKK2BgYAorCitBIGNhbGwgdG8gYGZvby5CYXIoKWAgdGhhdCBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgYEVYUEVDVF9DQUxMKClgCitzdGF0ZW1lbnRzIHdpbGwgYmUgYW4gZXJyb3IuCisKKyMjIFVuZGVyc3RhbmRpbmcgVW5pbnRlcmVzdGluZyB2cyBVbmV4cGVjdGVkIENhbGxzICMjCisKK19VbmludGVyZXN0aW5nXyBjYWxscyBhbmQgX3VuZXhwZWN0ZWRfIGNhbGxzIGFyZSBkaWZmZXJlbnQgY29uY2VwdHMgaW4gR29vZ2xlIE1vY2suIF9WZXJ5XyBkaWZmZXJlbnQuCisKK0EgY2FsbCBgeC5ZKC4uLilgIGlzICoqdW5pbnRlcmVzdGluZyoqIGlmIHRoZXJlJ3MgX25vdCBldmVuIGEgc2luZ2xlXyBgRVhQRUNUX0NBTEwoeCwgWSguLi4pKWAgc2V0LiBJbiBvdGhlciB3b3JkcywgdGhlIHRlc3QgaXNuJ3QgaW50ZXJlc3RlZCBpbiB0aGUgYHguWSgpYCBtZXRob2QgYXQgYWxsLCBhcyBldmlkZW50IGluIHRoYXQgdGhlIHRlc3QgZG9lc24ndCBjYXJlIHRvIHNheSBhbnl0aGluZyBhYm91dCBpdC4KKworQSBjYWxsIGB4LlkoLi4uKWAgaXMgKip1bmV4cGVjdGVkKiogaWYgdGhlcmUgYXJlIHNvbWUgYEVYUEVDVF9DQUxMKHgsIFkoLi4uKSlzYCBzZXQsIGJ1dCBub25lIG9mIHRoZW0gbWF0Y2hlcyB0aGUgY2FsbC4gUHV0IGFub3RoZXIgd2F5LCB0aGUgdGVzdCBpcyBpbnRlcmVzdGVkIGluIHRoZSBgeC5ZKClgIG1ldGhvZCAodGhlcmVmb3JlIGl0IF9leHBsaWNpdGx5XyBzZXRzIHNvbWUgYEVYUEVDVF9DQUxMYCB0byB2ZXJpZnkgaG93IGl0J3MgY2FsbGVkKTsgaG93ZXZlciwgdGhlIHZlcmlmaWNhdGlvbiBmYWlscyBhcyB0aGUgdGVzdCBkb2Vzbid0IGV4cGVjdCB0aGlzIHBhcnRpY3VsYXIgY2FsbCB0byBoYXBwZW4uCisKKyoqQW4gdW5leHBlY3RlZCBjYWxsIGlzIGFsd2F5cyBhbiBlcnJvciwqKiBhcyB0aGUgY29kZSB1bmRlciB0ZXN0IGRvZXNuJ3QgYmVoYXZlIHRoZSB3YXkgdGhlIHRlc3QgZXhwZWN0cyBpdCB0byBiZWhhdmUuCisKKyoqQnkgZGVmYXVsdCwgYW4gdW5pbnRlcmVzdGluZyBjYWxsIGlzIG5vdCBhbiBlcnJvciwqKiBhcyBpdCB2aW9sYXRlcyBubyBjb25zdHJhaW50IHNwZWNpZmllZCBieSB0aGUgdGVzdC4gKEdvb2dsZSBNb2NrJ3MgcGhpbG9zb3BoeSBpcyB0aGF0IHNheWluZyBub3RoaW5nIG1lYW5zIHRoZXJlIGlzIG5vIGNvbnN0cmFpbnQuKSBIb3dldmVyLCBpdCBsZWFkcyB0byBhIHdhcm5pbmcsIGFzIGl0IF9taWdodF8gaW5kaWNhdGUgYSBwcm9ibGVtIChlLmcuIHRoZSB0ZXN0IGF1dGhvciBtaWdodCBoYXZlIGZvcmdvdHRlbiB0byBzcGVjaWZ5IGEgY29uc3RyYWludCkuCisKK0luIEdvb2dsZSBNb2NrLCBgTmljZU1vY2tgIGFuZCBgU3RyaWN0TW9ja2AgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIG1vY2sgY2xhc3MgIm5pY2UiIG9yICJzdHJpY3QiLiBIb3cgZG9lcyB0aGlzIGFmZmVjdCB1bmludGVyZXN0aW5nIGNhbGxzIGFuZCB1bmV4cGVjdGVkIGNhbGxzPworCitBICoqbmljZSBtb2NrKiogc3VwcHJlc3NlcyB1bmludGVyZXN0aW5nIGNhbGwgd2FybmluZ3MuIEl0IGlzIGxlc3MgY2hhdHR5IHRoYW4gdGhlIGRlZmF1bHQgbW9jaywgYnV0IG90aGVyd2lzZSBpcyB0aGUgc2FtZS4gSWYgYSB0ZXN0IGZhaWxzIHdpdGggYSBkZWZhdWx0IG1vY2ssIGl0IHdpbGwgYWxzbyBmYWlsIHVzaW5nIGEgbmljZSBtb2NrIGluc3RlYWQuIEFuZCB2aWNlIHZlcnNhLiBEb24ndCBleHBlY3QgbWFraW5nIGEgbW9jayBuaWNlIHRvIGNoYW5nZSB0aGUgdGVzdCdzIHJlc3VsdC4KKworQSAqKnN0cmljdCBtb2NrKiogdHVybnMgdW5pbnRlcmVzdGluZyBjYWxsIHdhcm5pbmdzIGludG8gZXJyb3JzLiBTbyBtYWtpbmcgYSBtb2NrIHN0cmljdCBtYXkgY2hhbmdlIHRoZSB0ZXN0J3MgcmVzdWx0LgorCitMZXQncyBsb29rIGF0IGFuIGV4YW1wbGU6CisKK2BgYAorVEVTVCguLi4pIHsKKyAgTmljZU1vY2s8TW9ja0RvbWFpblJlZ2lzdHJ5PiBtb2NrX3JlZ2lzdHJ5OworICBFWFBFQ1RfQ0FMTChtb2NrX3JlZ2lzdHJ5LCBHZXREb21haW5Pd25lcigiZ29vZ2xlLmNvbSIpKQorICAgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oIkxhcnJ5IFBhZ2UiKSk7CisKKyAgLy8gVXNlIG1vY2tfcmVnaXN0cnkgaW4gY29kZSB1bmRlciB0ZXN0LgorICAuLi4gJm1vY2tfcmVnaXN0cnkgLi4uCit9CitgYGAKKworVGhlIHNvbGUgYEVYUEVDVF9DQUxMYCBoZXJlIHNheXMgdGhhdCBhbGwgY2FsbHMgdG8gYEdldERvbWFpbk93bmVyKClgIG11c3QgaGF2ZSBgImdvb2dsZS5jb20iYCBhcyB0aGUgYXJndW1lbnQuIElmIGBHZXREb21haW5Pd25lcigieWFob28uY29tIilgIGlzIGNhbGxlZCwgaXQgd2lsbCBiZSBhbiB1bmV4cGVjdGVkIGNhbGwsIGFuZCB0aHVzIGFuIGVycm9yLiBIYXZpbmcgYSBuaWNlIG1vY2sgZG9lc24ndCBjaGFuZ2UgdGhlIHNldmVyaXR5IG9mIGFuIHVuZXhwZWN0ZWQgY2FsbC4KKworU28gaG93IGRvIHdlIHRlbGwgR29vZ2xlIE1vY2sgdGhhdCBgR2V0RG9tYWluT3duZXIoKWAgY2FuIGJlIGNhbGxlZCB3aXRoIHNvbWUgb3RoZXIgYXJndW1lbnRzIGFzIHdlbGw/IFRoZSBzdGFuZGFyZCB0ZWNobmlxdWUgaXMgdG8gYWRkIGEgImNhdGNoIGFsbCIgYEVYUEVDVF9DQUxMYDoKKworYGBgCisgIEVYUEVDVF9DQUxMKG1vY2tfcmVnaXN0cnksIEdldERvbWFpbk93bmVyKF8pKQorICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpOyAgLy8gY2F0Y2hlcyBhbGwgb3RoZXIgY2FsbHMgdG8gdGhpcyBtZXRob2QuCisgIEVYUEVDVF9DQUxMKG1vY2tfcmVnaXN0cnksIEdldERvbWFpbk93bmVyKCJnb29nbGUuY29tIikpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oIkxhcnJ5IFBhZ2UiKSk7CitgYGAKKworUmVtZW1iZXIgdGhhdCBgX2AgaXMgdGhlIHdpbGRjYXJkIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nLiBXaXRoIHRoaXMsIGlmIGBHZXREb21haW5Pd25lcigiZ29vZ2xlLmNvbSIpYCBpcyBjYWxsZWQsIGl0IHdpbGwgZG8gd2hhdCB0aGUgc2Vjb25kIGBFWFBFQ1RfQ0FMTGAgc2F5czsgaWYgaXQgaXMgY2FsbGVkIHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQsIGl0IHdpbGwgZG8gd2hhdCB0aGUgZmlyc3QgYEVYUEVDVF9DQUxMYCBzYXlzLgorCitOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSB0d28gYEVYUEVDVF9DQUxMc2AgaXMgaW1wb3J0YW50LCBhcyBhIG5ld2VyIGBFWFBFQ1RfQ0FMTGAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGFuIG9sZGVyIG9uZS4KKworRm9yIG1vcmUgb24gdW5pbnRlcmVzdGluZyBjYWxscywgbmljZSBtb2NrcywgYW5kIHN0cmljdCBtb2NrcywgcmVhZCBbIlRoZSBOaWNlLCB0aGUgU3RyaWN0LCBhbmQgdGhlIE5hZ2d5Il0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjVGhlX05pY2UsX3RoZV9TdHJpY3QsX2FuZF90aGVfTmFnZ3kpLgorCisjIyBFeHBlY3RpbmcgT3JkZXJlZCBDYWxscyAjIworCitBbHRob3VnaCBhbiBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50IGRlZmluZWQgZWFybGllciB0YWtlcyBwcmVjZWRlbmNlCit3aGVuIEdvb2dsZSBNb2NrIHRyaWVzIHRvIG1hdGNoIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGFuIGV4cGVjdGF0aW9uLAorYnkgZGVmYXVsdCBjYWxscyBkb24ndCBoYXZlIHRvIGhhcHBlbiBpbiB0aGUgb3JkZXIgYEVYUEVDVF9DQUxMKClgCitzdGF0ZW1lbnRzIGFyZSB3cml0dGVuLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFyZ3VtZW50cyBtYXRjaCB0aGUKK21hdGNoZXJzIGluIHRoZSB0aGlyZCBgRVhQRUNUX0NBTEwoKWAsIGJ1dCBub3QgdGhvc2UgaW4gdGhlIGZpcnN0IHR3bywKK3RoZW4gdGhlIHRoaXJkIGV4cGVjdGF0aW9uIHdpbGwgYmUgdXNlZC4KKworSWYgeW91IHdvdWxkIHJhdGhlciBoYXZlIGFsbCBjYWxscyBvY2N1ciBpbiB0aGUgb3JkZXIgb2YgdGhlCitleHBlY3RhdGlvbnMsIHB1dCB0aGUgYEVYUEVDVF9DQUxMKClgIHN0YXRlbWVudHMgaW4gYSBibG9jayB3aGVyZSB5b3UKK2RlZmluZSBhIHZhcmlhYmxlIG9mIHR5cGUgYEluU2VxdWVuY2VgOgorCitgYGAKKyAgdXNpbmcgOjp0ZXN0aW5nOjpfOworICB1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7CisKKyAgeworICAgIEluU2VxdWVuY2UgczsKKworICAgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDUpKTsKKyAgICBFWFBFQ1RfQ0FMTChiYXIsIERvVGhhdChfKSkKKyAgICAgICAgLlRpbWVzKDIpOworICAgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDYpKTsKKyAgfQorYGBgCisKK0luIHRoaXMgZXhhbXBsZSwgd2UgZXhwZWN0IGEgY2FsbCB0byBgZm9vLkRvVGhpcyg1KWAsIGZvbGxvd2VkIGJ5IHR3bworY2FsbHMgdG8gYGJhci5Eb1RoYXQoKWAgd2hlcmUgdGhlIGFyZ3VtZW50IGNhbiBiZSBhbnl0aGluZywgd2hpY2ggYXJlCitpbiB0dXJuIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byBgZm9vLkRvVGhpcyg2KWAuIElmIGEgY2FsbCBvY2N1cnJlZAorb3V0LW9mLW9yZGVyLCBHb29nbGUgTW9jayB3aWxsIHJlcG9ydCBhbiBlcnJvci4KKworIyMgRXhwZWN0aW5nIFBhcnRpYWxseSBPcmRlcmVkIENhbGxzICMjCisKK1NvbWV0aW1lcyByZXF1aXJpbmcgZXZlcnl0aGluZyB0byBvY2N1ciBpbiBhIHByZWRldGVybWluZWQgb3JkZXIgY2FuCitsZWFkIHRvIGJyaXR0bGUgdGVzdHMuIEZvciBleGFtcGxlLCB3ZSBtYXkgY2FyZSBhYm91dCBgQWAgb2NjdXJyaW5nCitiZWZvcmUgYm90aCBgQmAgYW5kIGBDYCwgYnV0IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGl2ZSBvcmRlcgorb2YgYEJgIGFuZCBgQ2AuIEluIHRoaXMgY2FzZSwgdGhlIHRlc3Qgc2hvdWxkIHJlZmxlY3Qgb3VyIHJlYWwgaW50ZW50LAoraW5zdGVhZCBvZiBiZWluZyBvdmVybHkgY29uc3RyYWluaW5nLgorCitHb29nbGUgTW9jayBhbGxvd3MgeW91IHRvIGltcG9zZSBhbiBhcmJpdHJhcnkgREFHIChkaXJlY3RlZCBhY3ljbGljCitncmFwaCkgb24gdGhlIGNhbGxzLiBPbmUgd2F5IHRvIGV4cHJlc3MgdGhlIERBRyBpcyB0byB1c2UgdGhlCitbQWZ0ZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ2hlYXRTaGVldCNUaGVfQWZ0ZXJfQ2xhdXNlKSBjbGF1c2Ugb2YgYEVYUEVDVF9DQUxMYC4KKworQW5vdGhlciB3YXkgaXMgdmlhIHRoZSBgSW5TZXF1ZW5jZSgpYCBjbGF1c2UgKG5vdCB0aGUgc2FtZSBhcyB0aGUKK2BJblNlcXVlbmNlYCBjbGFzcyksIHdoaWNoIHdlIGJvcnJvd2VkIGZyb20gak1vY2sgMi4gSXQncyBsZXNzCitmbGV4aWJsZSB0aGFuIGBBZnRlcigpYCwgYnV0IG1vcmUgY29udmVuaWVudCB3aGVuIHlvdSBoYXZlIGxvbmcgY2hhaW5zCitvZiBzZXF1ZW50aWFsIGNhbGxzLCBhcyBpdCBkb2Vzbid0IHJlcXVpcmUgeW91IHRvIGNvbWUgdXAgd2l0aAorZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgZXhwZWN0YXRpb25zIGluIHRoZSBjaGFpbnMuICBIZXJlJ3MgaG93IGl0Cit3b3JrczoKKworSWYgd2UgdmlldyBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50cyBhcyBub2RlcyBpbiBhIGdyYXBoLCBhbmQgYWRkIGFuCitlZGdlIGZyb20gbm9kZSBBIHRvIG5vZGUgQiB3aGVyZXZlciBBIG11c3Qgb2NjdXIgYmVmb3JlIEIsIHdlIGNhbiBnZXQKK2EgREFHLiBXZSB1c2UgdGhlIHRlcm0gInNlcXVlbmNlIiB0byBtZWFuIGEgZGlyZWN0ZWQgcGF0aCBpbiB0aGlzCitEQUcuIE5vdywgaWYgd2UgZGVjb21wb3NlIHRoZSBEQUcgaW50byBzZXF1ZW5jZXMsIHdlIGp1c3QgbmVlZCB0byBrbm93Cit3aGljaCBzZXF1ZW5jZXMgZWFjaCBgRVhQRUNUX0NBTEwoKWAgYmVsb25ncyB0byBpbiBvcmRlciB0byBiZSBhYmxlIHRvCityZWNvbnN0cnVjdCB0aGUgb3JnaW5hbCBEQUcuCisKK1NvLCB0byBzcGVjaWZ5IHRoZSBwYXJ0aWFsIG9yZGVyIG9uIHRoZSBleHBlY3RhdGlvbnMgd2UgbmVlZCB0byBkbyB0d28KK3RoaW5nczogZmlyc3QgdG8gZGVmaW5lIHNvbWUgYFNlcXVlbmNlYCBvYmplY3RzLCBhbmQgdGhlbiBmb3IgZWFjaAorYEVYUEVDVF9DQUxMKClgIHNheSB3aGljaCBgU2VxdWVuY2VgIG9iamVjdHMgaXQgaXMgcGFydAorb2YuIEV4cGVjdGF0aW9ucyBpbiB0aGUgc2FtZSBzZXF1ZW5jZSBtdXN0IG9jY3VyIGluIHRoZSBvcmRlciB0aGV5IGFyZQord3JpdHRlbi4gRm9yIGV4YW1wbGUsCisKK2BgYAorICB1c2luZyA6OnRlc3Rpbmc6OlNlcXVlbmNlOworCisgIFNlcXVlbmNlIHMxLCBzMjsKKworICBFWFBFQ1RfQ0FMTChmb28sIEEoKSkKKyAgICAgIC5JblNlcXVlbmNlKHMxLCBzMik7CisgIEVYUEVDVF9DQUxMKGJhciwgQigpKQorICAgICAgLkluU2VxdWVuY2UoczEpOworICBFWFBFQ1RfQ0FMTChiYXIsIEMoKSkKKyAgICAgIC5JblNlcXVlbmNlKHMyKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEKCkpCisgICAgICAuSW5TZXF1ZW5jZShzMik7CitgYGAKKworc3BlY2lmaWVzIHRoZSBmb2xsb3dpbmcgREFHICh3aGVyZSBgczFgIGlzIGBBIC0+IEJgLCBhbmQgYHMyYCBpcyBgQSAtPgorQyAtPiBEYCk6CisKK2BgYAorICAgICAgICstLS0+IEIKKyAgICAgICB8CisgIEEgLS0tfAorICAgICAgIHwKKyAgICAgICArLS0tPiBDIC0tLT4gRAorYGBgCisKK1RoaXMgbWVhbnMgdGhhdCBBIG11c3Qgb2NjdXIgYmVmb3JlIEIgYW5kIEMsIGFuZCBDIG11c3Qgb2NjdXIgYmVmb3JlCitELiBUaGVyZSdzIG5vIHJlc3RyaWN0aW9uIGFib3V0IHRoZSBvcmRlciBvdGhlciB0aGFuIHRoZXNlLgorCisjIyBDb250cm9sbGluZyBXaGVuIGFuIEV4cGVjdGF0aW9uIFJldGlyZXMgIyMKKworV2hlbiBhIG1vY2sgbWV0aG9kIGlzIGNhbGxlZCwgR29vZ2xlIE1vY2sgb25seSBjb25zaWRlciBleHBlY3RhdGlvbnMKK3RoYXQgYXJlIHN0aWxsIGFjdGl2ZS4gQW4gZXhwZWN0YXRpb24gaXMgYWN0aXZlIHdoZW4gY3JlYXRlZCwgYW5kCitiZWNvbWVzIGluYWN0aXZlIChha2EgX3JldGlyZXNfKSB3aGVuIGEgY2FsbCB0aGF0IGhhcyB0byBvY2N1ciBsYXRlcgoraGFzIG9jY3VycmVkLiBGb3IgZXhhbXBsZSwgaW4KKworYGBgCisgIHVzaW5nIDo6dGVzdGluZzo6XzsKKyAgdXNpbmcgOjp0ZXN0aW5nOjpTZXF1ZW5jZTsKKworICBTZXF1ZW5jZSBzMSwgczI7CisKKyAgRVhQRUNUX0NBTEwobG9nLCBMb2coV0FSTklORywgXywgIkZpbGUgdG9vIGxhcmdlLiIpKSAgICAgLy8gIzEKKyAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKKyAgICAgIC5JblNlcXVlbmNlKHMxLCBzMik7CisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sICJEYXRhIHNldCBpcyBlbXB0eS4iKSkgIC8vICMyCisgICAgICAuSW5TZXF1ZW5jZShzMSk7CisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sICJVc2VyIG5vdCBmb3VuZC4iKSkgICAgIC8vICMzCisgICAgICAuSW5TZXF1ZW5jZShzMik7CitgYGAKKworYXMgc29vbiBhcyBlaXRoZXIgIzIgb3IgIzMgaXMgbWF0Y2hlZCwgIzEgd2lsbCByZXRpcmUuIElmIGEgd2FybmluZworYCJGaWxlIHRvbyBsYXJnZS4iYCBpcyBsb2dnZWQgYWZ0ZXIgdGhpcywgaXQgd2lsbCBiZSBhbiBlcnJvci4KKworTm90ZSB0aGF0IGFuIGV4cGVjdGF0aW9uIGRvZXNuJ3QgcmV0aXJlIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCdzCitzYXR1cmF0ZWQuIEZvciBleGFtcGxlLAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKy4uLgorICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCBfKSk7ICAgICAgICAgICAgICAgICAgLy8gIzEKKyAgRVhQRUNUX0NBTEwobG9nLCBMb2coV0FSTklORywgXywgIkZpbGUgdG9vIGxhcmdlLiIpKTsgIC8vICMyCitgYGAKKworc2F5cyB0aGF0IHRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgd2FybmluZyB3aXRoIHRoZSBtZXNzYWdlIGAiRmlsZQordG9vIGxhcmdlLiJgLiBJZiB0aGUgc2Vjb25kIHdhcm5pbmcgY29udGFpbnMgdGhpcyBtZXNzYWdlIHRvbywgIzIgd2lsbAorbWF0Y2ggYWdhaW4gYW5kIHJlc3VsdCBpbiBhbiB1cHBlci1ib3VuZC12aW9sYXRlZCBlcnJvci4KKworSWYgdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCwgeW91IGNhbiBhc2sgYW4gZXhwZWN0YXRpb24gdG8gcmV0aXJlIGFzCitzb29uIGFzIGl0IGJlY29tZXMgc2F0dXJhdGVkOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKy4uLgorICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCBfKSk7ICAgICAgICAgICAgICAgICAvLyAjMQorICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCAiRmlsZSB0b28gbGFyZ2UuIikpICAvLyAjMgorICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK2BgYAorCitIZXJlICMyIGNhbiBiZSB1c2VkIG9ubHkgb25jZSwgc28gaWYgeW91IGhhdmUgdHdvIHdhcm5pbmdzIHdpdGggdGhlCittZXNzYWdlIGAiRmlsZSB0b28gbGFyZ2UuImAsIHRoZSBmaXJzdCB3aWxsIG1hdGNoICMyIGFuZCB0aGUgc2Vjb25kCit3aWxsIG1hdGNoICMxIC0gdGhlcmUgd2lsbCBiZSBubyBlcnJvci4KKworIyBVc2luZyBBY3Rpb25zICMKKworIyMgUmV0dXJuaW5nIFJlZmVyZW5jZXMgZnJvbSBNb2NrIE1ldGhvZHMgIyMKKworSWYgYSBtb2NrIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UsIHlvdSBuZWVkIHRvIHVzZQorYFJldHVyblJlZigpYCBpbnN0ZWFkIG9mIGBSZXR1cm4oKWAgdG8gcmV0dXJuIGEgcmVzdWx0OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuUmVmOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDAoR2V0QmFyLCBCYXImKCkpOworfTsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBCYXIgYmFyOworICBFWFBFQ1RfQ0FMTChmb28sIEdldEJhcigpKQorICAgICAgLldpbGxPbmNlKFJldHVyblJlZihiYXIpKTsKK2BgYAorCisjIyBSZXR1cm5pbmcgTGl2ZSBWYWx1ZXMgZnJvbSBNb2NrIE1ldGhvZHMgIyMKKworVGhlIGBSZXR1cm4oeClgIGFjdGlvbiBzYXZlcyBhIGNvcHkgb2YgYHhgIHdoZW4gdGhlIGFjdGlvbiBpcworX2NyZWF0ZWRfLCBhbmQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgd2hlbmV2ZXIgaXQncworZXhlY3V0ZWQuIFNvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdG8gaW5zdGVhZCByZXR1cm4gdGhlIF9saXZlXyB2YWx1ZSBvZgorYHhgIChpLmUuIGl0cyB2YWx1ZSBhdCB0aGUgdGltZSB3aGVuIHRoZSBhY3Rpb24gaXMgX2V4ZWN1dGVkXy4pLgorCitJZiB0aGUgbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlIGlzIGEgcmVmZXJlbmNlLCB5b3UgY2FuIGRvIGl0IHVzaW5nCitgUmV0dXJuUmVmKHgpYCwgYXMgc2hvd24gaW4gdGhlIHByZXZpb3VzIHJlY2lwZSAoIlJldHVybmluZyBSZWZlcmVuY2VzCitmcm9tIE1vY2sgTWV0aG9kcyIpLiBIb3dldmVyLCBHb29nbGUgTW9jayBkb2Vzbid0IGxldCB5b3UgdXNlCitgUmV0dXJuUmVmKClgIGluIGEgbW9jayBmdW5jdGlvbiB3aG9zZSByZXR1cm4gdHlwZSBpcyBub3QgYSByZWZlcmVuY2UsCithcyBkb2luZyB0aGF0IHVzdWFsbHkgaW5kaWNhdGVzIGEgdXNlciBlcnJvci4gU28sIHdoYXQgc2hhbGwgeW91IGRvPworCitZb3UgbWF5IGJlIHRlbXB0ZWQgdG8gdHJ5IGBCeVJlZigpYDoKKworYGBgCit1c2luZyB0ZXN0aW5nOjpCeVJlZjsKK3VzaW5nIHRlc3Rpbmc6OlJldHVybjsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QwKEdldFZhbHVlLCBpbnQoKSk7Cit9OworLi4uCisgIGludCB4ID0gMDsKKyAgTW9ja0ZvbyBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgR2V0VmFsdWUoKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oQnlSZWYoeCkpKTsKKyAgeCA9IDQyOworICBFWFBFQ1RfRVEoNDIsIGZvby5HZXRWYWx1ZSgpKTsKK2BgYAorCitVbmZvcnR1bmF0ZWx5LCBpdCBkb2Vzbid0IHdvcmsgaGVyZS4gVGhlIGFib3ZlIGNvZGUgd2lsbCBmYWlsIHdpdGggZXJyb3I6CisKK2BgYAorVmFsdWUgb2Y6IGZvby5HZXRWYWx1ZSgpCisgIEFjdHVhbDogMAorRXhwZWN0ZWQ6IDQyCitgYGAKKworVGhlIHJlYXNvbiBpcyB0aGF0IGBSZXR1cm4odmFsdWUpYCBjb252ZXJ0cyBgdmFsdWVgIHRvIHRoZSBhY3R1YWwKK3JldHVybiB0eXBlIG9mIHRoZSBtb2NrIGZ1bmN0aW9uIGF0IHRoZSB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcworX2NyZWF0ZWRfLCBub3Qgd2hlbiBpdCBpcyBfZXhlY3V0ZWRfLiAoVGhpcyBiZWhhdmlvciB3YXMgY2hvc2VuIGZvcgordGhlIGFjdGlvbiB0byBiZSBzYWZlIHdoZW4gYHZhbHVlYCBpcyBhIHByb3h5IG9iamVjdCB0aGF0IHJlZmVyZW5jZXMKK3NvbWUgdGVtcG9yYXJ5IG9iamVjdHMuKSBBcyBhIHJlc3VsdCwgYEJ5UmVmKHgpYCBpcyBjb252ZXJ0ZWQgdG8gYW4KK2BpbnRgIHZhbHVlIChpbnN0ZWFkIG9mIGEgYGNvbnN0IGludCZgKSB3aGVuIHRoZSBleHBlY3RhdGlvbiBpcyBzZXQsCithbmQgYFJldHVybihCeVJlZih4KSlgIHdpbGwgYWx3YXlzIHJldHVybiAwLgorCitgUmV0dXJuUG9pbnRlZShwb2ludGVyKWAgd2FzIHByb3ZpZGVkIHRvIHNvbHZlIHRoaXMgcHJvYmxlbQorc3BlY2lmaWNhbGx5LiBJdCByZXR1cm5zIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IGBwb2ludGVyYCBhdCB0aGUgdGltZQordGhlIGFjdGlvbiBpcyBfZXhlY3V0ZWRfOgorCitgYGAKK3VzaW5nIHRlc3Rpbmc6OlJldHVyblBvaW50ZWU7CisuLi4KKyAgaW50IHggPSAwOworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBHZXRWYWx1ZSgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblBvaW50ZWUoJngpKTsgIC8vIE5vdGUgdGhlICYgaGVyZS4KKyAgeCA9IDQyOworICBFWFBFQ1RfRVEoNDIsIGZvby5HZXRWYWx1ZSgpKTsgIC8vIFRoaXMgd2lsbCBzdWNjZWVkIG5vdy4KK2BgYAorCisjIyBDb21iaW5pbmcgQWN0aW9ucyAjIworCitXYW50IHRvIGRvIG1vcmUgdGhhbiBvbmUgdGhpbmcgd2hlbiBhIGZ1bmN0aW9uIGlzIGNhbGxlZD8gVGhhdCdzCitmaW5lLiBgRG9BbGwoKWAgYWxsb3cgeW91IHRvIGRvIHNlcXVlbmNlIG9mIGFjdGlvbnMgZXZlcnkgdGltZS4gT25seQordGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbGFzdCBhY3Rpb24gaW4gdGhlIHNlcXVlbmNlIHdpbGwgYmUgdXNlZC4KKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkRvQWxsOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoQmFyLCBib29sKGludCBuKSk7Cit9OworLi4uCisKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoXykpCisgICAgICAuV2lsbE9uY2UoRG9BbGwoYWN0aW9uXzEsCisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uXzIsCisgICAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX24pKTsKK2BgYAorCisjIyBNb2NraW5nIFNpZGUgRWZmZWN0cyAjIworCitTb21ldGltZXMgYSBtZXRob2QgZXhoaWJpdHMgaXRzIGVmZmVjdCBub3QgdmlhIHJldHVybmluZyBhIHZhbHVlIGJ1dAordmlhIHNpZGUgZWZmZWN0cy4gRm9yIGV4YW1wbGUsIGl0IG1heSBjaGFuZ2Ugc29tZSBnbG9iYWwgc3RhdGUgb3IKK21vZGlmeSBhbiBvdXRwdXQgYXJndW1lbnQuIFRvIG1vY2sgc2lkZSBlZmZlY3RzLCBpbiBnZW5lcmFsIHlvdSBjYW4KK2RlZmluZSB5b3VyIG93biBhY3Rpb24gYnkgaW1wbGVtZW50aW5nIGA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZWAuCisKK0lmIGFsbCB5b3UgbmVlZCB0byBkbyBpcyB0byBjaGFuZ2UgYW4gb3V0cHV0IGFyZ3VtZW50LCB0aGUgYnVpbHQtaW4KK2BTZXRBcmdQb2ludGVlKClgIGFjdGlvbiBpcyBjb252ZW5pZW50OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKKworY2xhc3MgTW9ja011dGF0b3IgOiBwdWJsaWMgTXV0YXRvciB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoTXV0YXRlLCB2b2lkKGJvb2wgbXV0YXRlLCBpbnQqIHZhbHVlKSk7CisgIC4uLgorfTsKKy4uLgorCisgIE1vY2tNdXRhdG9yIG11dGF0b3I7CisgIEVYUEVDVF9DQUxMKG11dGF0b3IsIE11dGF0ZSh0cnVlLCBfKSkKKyAgICAgIC5XaWxsT25jZShTZXRBcmdQb2ludGVlPDE+KDUpKTsKK2BgYAorCitJbiB0aGlzIGV4YW1wbGUsIHdoZW4gYG11dGF0b3IuTXV0YXRlKClgIGlzIGNhbGxlZCwgd2Ugd2lsbCBhc3NpZ24gNQordG8gdGhlIGBpbnRgIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgYXJndW1lbnQgIzEKKygwLWJhc2VkKS4KKworYFNldEFyZ1BvaW50ZWUoKWAgY29udmVuaWVudGx5IG1ha2VzIGFuIGludGVybmFsIGNvcHkgb2YgdGhlCit2YWx1ZSB5b3UgcGFzcyB0byBpdCwgcmVtb3ZpbmcgdGhlIG5lZWQgdG8ga2VlcCB0aGUgdmFsdWUgaW4gc2NvcGUgYW5kCithbGl2ZS4gVGhlIGltcGxpY2F0aW9uIGhvd2V2ZXIgaXMgdGhhdCB0aGUgdmFsdWUgbXVzdCBoYXZlIGEgY29weQorY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisKK0lmIHRoZSBtb2NrIG1ldGhvZCBhbHNvIG5lZWRzIHRvIHJldHVybiBhIHZhbHVlIGFzIHdlbGwsIHlvdSBjYW4gY2hhaW4KK2BTZXRBcmdQb2ludGVlKClgIHdpdGggYFJldHVybigpYCB1c2luZyBgRG9BbGwoKWA6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Cit1c2luZyA6OnRlc3Rpbmc6OlNldEFyZ1BvaW50ZWU7CisKK2NsYXNzIE1vY2tNdXRhdG9yIDogcHVibGljIE11dGF0b3IgeworIHB1YmxpYzoKKyAgLi4uCisgIE1PQ0tfTUVUSE9EMShNdXRhdGVJbnQsIGJvb2woaW50KiB2YWx1ZSkpOworfTsKKy4uLgorCisgIE1vY2tNdXRhdG9yIG11dGF0b3I7CisgIEVYUEVDVF9DQUxMKG11dGF0b3IsIE11dGF0ZUludChfKSkKKyAgICAgIC5XaWxsT25jZShEb0FsbChTZXRBcmdQb2ludGVlPDA+KDUpLAorICAgICAgICAgICAgICAgICAgICAgIFJldHVybih0cnVlKSkpOworYGBgCisKK0lmIHRoZSBvdXRwdXQgYXJndW1lbnQgaXMgYW4gYXJyYXksIHVzZSB0aGUKK2BTZXRBcnJheUFyZ3VtZW50PE4+KGZpcnN0LCBsYXN0KWAgYWN0aW9uIGluc3RlYWQuIEl0IGNvcGllcyB0aGUKK2VsZW1lbnRzIGluIHNvdXJjZSByYW5nZSBgW2ZpcnN0LCBsYXN0KWAgdG8gdGhlIGFycmF5IHBvaW50ZWQgdG8gYnkKK3RoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKK3VzaW5nIDo6dGVzdGluZzo6U2V0QXJyYXlBcmd1bWVudDsKKworY2xhc3MgTW9ja0FycmF5TXV0YXRvciA6IHB1YmxpYyBBcnJheU11dGF0b3IgeworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKE11dGF0ZSwgdm9pZChpbnQqIHZhbHVlcywgaW50IG51bV92YWx1ZXMpKTsKKyAgLi4uCit9OworLi4uCisKKyAgTW9ja0FycmF5TXV0YXRvciBtdXRhdG9yOworICBpbnQgdmFsdWVzWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CisgIEVYUEVDVF9DQUxMKG11dGF0b3IsIE11dGF0ZShOb3ROdWxsKCksIDUpKQorICAgICAgLldpbGxPbmNlKFNldEFycmF5QXJndW1lbnQ8MD4odmFsdWVzLCB2YWx1ZXMgKyA1KSk7CitgYGAKKworVGhpcyBhbHNvIHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGFuIG91dHB1dCBpdGVyYXRvcjoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OlNlQXJyYXlBcmd1bWVudDsKKworY2xhc3MgTW9ja1JvbG9kZXggOiBwdWJsaWMgUm9sb2RleCB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoR2V0TmFtZXMsIHZvaWQoc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcjx2ZWN0b3I8c3RyaW5nPiA+KSk7CisgIC4uLgorfTsKKy4uLgorCisgIE1vY2tSb2xvZGV4IHJvbG9kZXg7CisgIHZlY3RvcjxzdHJpbmc+IG5hbWVzOworICBuYW1lcy5wdXNoX2JhY2soIkdlb3JnZSIpOworICBuYW1lcy5wdXNoX2JhY2soIkpvaG4iKTsKKyAgbmFtZXMucHVzaF9iYWNrKCJUaG9tYXMiKTsKKyAgRVhQRUNUX0NBTEwocm9sb2RleCwgR2V0TmFtZXMoXykpCisgICAgICAuV2lsbE9uY2UoU2V0QXJyYXlBcmd1bWVudDwwPihuYW1lcy5iZWdpbigpLCBuYW1lcy5lbmQoKSkpOworYGBgCisKKyMjIENoYW5naW5nIGEgTW9jayBPYmplY3QncyBCZWhhdmlvciBCYXNlZCBvbiB0aGUgU3RhdGUgIyMKKworSWYgeW91IGV4cGVjdCBhIGNhbGwgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBhIG1vY2sgb2JqZWN0LCB5b3UgY2FuIHVzZSBgOjp0ZXN0aW5nOjpJblNlcXVlbmNlYCB0byBzcGVjaWZ5IGRpZmZlcmVudCBiZWhhdmlvcnMgYmVmb3JlIGFuZCBhZnRlciB0aGUgY2FsbDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKworLi4uCisgIHsKKyAgICBJblNlcXVlbmNlIHNlcTsKKyAgICBFWFBFQ1RfQ0FMTChteV9tb2NrLCBJc0RpcnR5KCkpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4odHJ1ZSkpOworICAgIEVYUEVDVF9DQUxMKG15X21vY2ssIEZsdXNoKCkpOworICAgIEVYUEVDVF9DQUxMKG15X21vY2ssIElzRGlydHkoKSkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihmYWxzZSkpOworICB9CisgIG15X21vY2suRmx1c2hJZkRpcnR5KCk7CitgYGAKKworVGhpcyBtYWtlcyBgbXlfbW9jay5Jc0RpcnR5KClgIHJldHVybiBgdHJ1ZWAgYmVmb3JlIGBteV9tb2NrLkZsdXNoKClgIGlzIGNhbGxlZCBhbmQgcmV0dXJuIGBmYWxzZWAgYWZ0ZXJ3YXJkcy4KKworSWYgdGhlIGJlaGF2aW9yIGNoYW5nZSBpcyBtb3JlIGNvbXBsZXgsIHlvdSBjYW4gc3RvcmUgdGhlIGVmZmVjdHMgaW4gYSB2YXJpYWJsZSBhbmQgbWFrZSBhIG1vY2sgbWV0aG9kIGdldCBpdHMgcmV0dXJuIHZhbHVlIGZyb20gdGhhdCB2YXJpYWJsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKworQUNUSU9OX1AoUmV0dXJuUG9pbnRlZSwgcCkgeyByZXR1cm4gKnA7IH0KKy4uLgorICBpbnQgcHJldmlvdXNfdmFsdWUgPSAwOworICBFWFBFQ1RfQ0FMTChteV9tb2NrLCBHZXRQcmV2VmFsdWUoKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm5Qb2ludGVlKCZwcmV2aW91c192YWx1ZSkpOworICBFWFBFQ1RfQ0FMTChteV9tb2NrLCBVcGRhdGVWYWx1ZShfKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShTYXZlQXJnPDA+KCZwcmV2aW91c192YWx1ZSkpOworICBteV9tb2NrLkRvU29tZXRoaW5nVG9VcGRhdGVWYWx1ZSgpOworYGBgCisKK0hlcmUgYG15X21vY2suR2V0UHJldlZhbHVlKClgIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgYXJndW1lbnQgb2YgdGhlIGxhc3QgYFVwZGF0ZVZhbHVlKClgIGNhbGwuCisKKyMjIFNldHRpbmcgdGhlIERlZmF1bHQgVmFsdWUgZm9yIGEgUmV0dXJuIFR5cGUgIyMKKworSWYgYSBtb2NrIG1ldGhvZCdzIHJldHVybiB0eXBlIGlzIGEgYnVpbHQtaW4gQysrIHR5cGUgb3IgcG9pbnRlciwgYnkKK2RlZmF1bHQgaXQgd2lsbCByZXR1cm4gMCB3aGVuIGludm9rZWQuIEFsc28sIGluIEMrKyAxMSBhbmQgYWJvdmUsIGEgbW9jaworbWV0aG9kIHdob3NlIHJldHVybiB0eXBlIGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3Igd2lsbCByZXR1cm4gYSBkZWZhdWx0LWNvbnN0cnVjdGVkCit2YWx1ZSBieSBkZWZhdWx0LiAgWW91IG9ubHkgbmVlZCB0byBzcGVjaWZ5IGFuCithY3Rpb24gaWYgdGhpcyBkZWZhdWx0IHZhbHVlIGRvZXNuJ3Qgd29yayBmb3IgeW91LgorCitTb21ldGltZXMsIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0IHZhbHVlLCBvciB5b3UgbWF5IHdhbnQKK3RvIHNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlcyBHb29nbGUgTW9jayBkb2Vzbid0IGtub3cKK2Fib3V0LiBZb3UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIGA6OnRlc3Rpbmc6OkRlZmF1bHRWYWx1ZWAgY2xhc3MKK3RlbXBsYXRlOgorCitgYGAKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMChDYWxjdWxhdGVCYXIsIEJhcigpKTsKK307CisuLi4KKworICBCYXIgZGVmYXVsdF9iYXI7CisgIC8vIFNldHMgdGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGZvciB0eXBlIEJhci4KKyAgRGVmYXVsdFZhbHVlPEJhcj46OlNldChkZWZhdWx0X2Jhcik7CisKKyAgTW9ja0ZvbyBmb287CisKKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGFuIGFjdGlvbiBoZXJlLCBhcyB0aGUgZGVmYXVsdAorICAvLyByZXR1cm4gdmFsdWUgd29ya3MgZm9yIHVzLgorICBFWFBFQ1RfQ0FMTChmb28sIENhbGN1bGF0ZUJhcigpKTsKKworICBmb28uQ2FsY3VsYXRlQmFyKCk7ICAvLyBUaGlzIHNob3VsZCByZXR1cm4gZGVmYXVsdF9iYXIuCisKKyAgLy8gVW5zZXRzIHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZS4KKyAgRGVmYXVsdFZhbHVlPEJhcj46OkNsZWFyKCk7CitgYGAKKworUGxlYXNlIG5vdGUgdGhhdCBjaGFuZ2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSB0eXBlIGNhbiBtYWtlIHlvdQordGVzdHMgaGFyZCB0byB1bmRlcnN0YW5kLiBXZSByZWNvbW1lbmQgeW91IHRvIHVzZSB0aGlzIGZlYXR1cmUKK2p1ZGljaW91c2x5LiBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgYFNldCgpYCBhbmQKK2BDbGVhcigpYCBjYWxscyBhcmUgcmlnaHQgbmV4dCB0byB0aGUgY29kZSB0aGF0IHVzZXMgeW91ciBtb2NrLgorCisjIyBTZXR0aW5nIHRoZSBEZWZhdWx0IEFjdGlvbnMgZm9yIGEgTW9jayBNZXRob2QgIyMKKworWW91J3ZlIGxlYXJuZWQgaG93IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGdpdmVuCit0eXBlLiBIb3dldmVyLCB0aGlzIG1heSBiZSB0b28gY29hcnNlIGZvciB5b3VyIHB1cnBvc2U6IHBlcmhhcHMgeW91CitoYXZlIHR3byBtb2NrIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSByZXR1cm4gdHlwZSBhbmQgeW91IHdhbnQgdGhlbSB0bworaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3JzLiBUaGUgYE9OX0NBTEwoKWAgbWFjcm8gYWxsb3dzIHlvdSB0bworY3VzdG9taXplIHlvdXIgbW9jaydzIGJlaGF2aW9yIGF0IHRoZSBtZXRob2QgbGV2ZWw6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Cit1c2luZyA6OnRlc3Rpbmc6Okd0OwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KKyAgT05fQ0FMTChmb28sIFNpZ24oXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oLTEpKTsKKyAgT05fQ0FMTChmb28sIFNpZ24oMCkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMCkpOworICBPTl9DQUxMKGZvbywgU2lnbihHdCgwKSkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworCisgIEVYUEVDVF9DQUxMKGZvbywgU2lnbihfKSkKKyAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CisKKyAgZm9vLlNpZ24oNSk7ICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIDEuCisgIGZvby5TaWduKC05KTsgIC8vIFRoaXMgc2hvdWxkIHJldHVybiAtMS4KKyAgZm9vLlNpZ24oMCk7ICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIDAuCitgYGAKKworQXMgeW91IG1heSBoYXZlIGd1ZXNzZWQsIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgYE9OX0NBTEwoKWAKK3N0YXRlbWVudHMsIHRoZSBuZXdzIG9yZGVyIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBvbGRlciBvbmVzLiBJbgorb3RoZXIgd29yZHMsIHRoZSAqKmxhc3QqKiBvbmUgdGhhdCBtYXRjaGVzIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgd2lsbAorYmUgdXNlZC4gVGhpcyBtYXRjaGluZyBvcmRlciBhbGxvd3MgeW91IHRvIHNldCB1cCB0aGUgY29tbW9uIGJlaGF2aW9yCitpbiBhIG1vY2sgb2JqZWN0J3MgY29uc3RydWN0b3Igb3IgdGhlIHRlc3QgZml4dHVyZSdzIHNldC11cCBwaGFzZSBhbmQKK3NwZWNpYWxpemUgdGhlIG1vY2sncyBiZWhhdmlvciBsYXRlci4KKworIyMgVXNpbmcgRnVuY3Rpb25zL01ldGhvZHMvRnVuY3RvcnMgYXMgQWN0aW9ucyAjIworCitJZiB0aGUgYnVpbHQtaW4gYWN0aW9ucyBkb24ndCBzdWl0IHlvdSwgeW91IGNhbiBlYXNpbHkgdXNlIGFuIGV4aXN0aW5nCitmdW5jdGlvbiwgbWV0aG9kLCBvciBmdW5jdG9yIGFzIGFuIGFjdGlvbjoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKFN1bSwgaW50KGludCB4LCBpbnQgeSkpOworICBNT0NLX01FVEhPRDEoQ29tcGxleEpvYiwgYm9vbChpbnQgeCkpOworfTsKKworaW50IENhbGN1bGF0ZVN1bShpbnQgeCwgaW50IHkpIHsgcmV0dXJuIHggKyB5OyB9CisKK2NsYXNzIEhlbHBlciB7CisgcHVibGljOgorICBib29sIENvbXBsZXhKb2IoaW50IHgpOworfTsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBIZWxwZXIgaGVscGVyOworICBFWFBFQ1RfQ0FMTChmb28sIFN1bShfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoQ2FsY3VsYXRlU3VtKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgQ29tcGxleEpvYihfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoJmhlbHBlciwgJkhlbHBlcjo6Q29tcGxleEpvYikpOworCisgIGZvby5TdW0oNSwgNik7ICAgICAgIC8vIEludm9rZXMgQ2FsY3VsYXRlU3VtKDUsIDYpLgorICBmb28uQ29tcGxleEpvYigxMCk7ICAvLyBJbnZva2VzIGhlbHBlci5Db21wbGV4Sm9iKDEwKTsKK2BgYAorCitUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiwgZXRjIG11c3QgYmUKK19jb21wYXRpYmxlXyB3aXRoIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1vY2sgZnVuY3Rpb24sIG1lYW5pbmcgdGhhdCB0aGUKK2xhdHRlcidzIGFyZ3VtZW50cyBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKK2FyZ3VtZW50cyBvZiB0aGUgZm9ybWVyLCBhbmQgdGhlIGZvcm1lcidzIHJldHVybiB0eXBlIGNhbiBiZQoraW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhhdCBvZiB0aGUgbGF0dGVyLiBTbywgeW91IGNhbiBpbnZva2UKK3NvbWV0aGluZyB3aG9zZSB0eXBlIGlzIF9ub3RfIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIG1vY2sgZnVuY3Rpb24sCithcyBsb25nIGFzIGl0J3Mgc2FmZSB0byBkbyBzbyAtIG5pY2UsIGh1aD8KKworIyMgSW52b2tpbmcgYSBGdW5jdGlvbi9NZXRob2QvRnVuY3RvciBXaXRob3V0IEFyZ3VtZW50cyAjIworCitgSW52b2tlKClgIGlzIHZlcnkgdXNlZnVsIGZvciBkb2luZyBhY3Rpb25zIHRoYXQgYXJlIG1vcmUgY29tcGxleC4gSXQKK3Bhc3NlcyB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24gb3IgZnVuY3RvciBiZWluZworaW52b2tlZCBzdWNoIHRoYXQgdGhlIGNhbGxlZSBoYXMgdGhlIGZ1bGwgY29udGV4dCBvZiB0aGUgY2FsbCB0byB3b3JrCit3aXRoLiBJZiB0aGUgaW52b2tlZCBmdW5jdGlvbiBpcyBub3QgaW50ZXJlc3RlZCBpbiBzb21lIG9yIGFsbCBvZiB0aGUKK2FyZ3VtZW50cywgaXQgY2FuIHNpbXBseSBpZ25vcmUgdGhlbS4KKworWWV0LCBhIGNvbW1vbiBwYXR0ZXJuIGlzIHRoYXQgYSB0ZXN0IGF1dGhvciB3YW50cyB0byBpbnZva2UgYSBmdW5jdGlvbgord2l0aG91dCB0aGUgYXJndW1lbnRzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uLiBgSW52b2tlKClgIGFsbG93cyBoZXIgdG8KK2RvIHRoYXQgdXNpbmcgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgdGhyb3dzIGF3YXkgdGhlIGFyZ3VtZW50cyBiZWZvcmUKK2ludm9raW5nIGFuIHVuZGVybGluaW5nIG51bGxhcnkgZnVuY3Rpb24uIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBjYW4gYmUKK3RlZGlvdXMgYW5kIG9ic2N1cmVzIHRoZSBpbnRlbnQgb2YgdGhlIHRlc3QuCisKK2BJbnZva2VXaXRob3V0QXJncygpYCBzb2x2ZXMgdGhpcyBwcm9ibGVtLiBJdCdzIGxpa2UgYEludm9rZSgpYCBleGNlcHQKK3RoYXQgaXQgZG9lc24ndCBwYXNzIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIHRvIHRoZQorY2FsbGVlLiBIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZVdpdGhvdXRBcmdzOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoQ29tcGxleEpvYiwgYm9vbChpbnQgbikpOworfTsKKworYm9vbCBKb2IxKCkgeyAuLi4gfQorLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgQ29tcGxleEpvYihfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2VXaXRob3V0QXJncyhKb2IxKSk7CisKKyAgZm9vLkNvbXBsZXhKb2IoMTApOyAgLy8gSW52b2tlcyBKb2IxKCkuCitgYGAKKworIyMgSW52b2tpbmcgYW4gQXJndW1lbnQgb2YgdGhlIE1vY2sgRnVuY3Rpb24gIyMKKworU29tZXRpbWVzIGEgbW9jayBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgYSBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3RvcgorKGluIG90aGVyIHdvcmRzLCBhICJjYWxsYWJsZSIpIGFzIGFuIGFyZ3VtZW50LCBlLmcuCisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKERvVGhpcywgYm9vbChpbnQgbiwgYm9vbCAoKmZwKShpbnQpKSk7Cit9OworYGBgCisKK2FuZCB5b3UgbWF5IHdhbnQgdG8gaW52b2tlIHRoaXMgY2FsbGFibGUgYXJndW1lbnQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIE1vY2tGb28gZm9vOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhfLCBfKSkKKyAgICAgIC5XaWxsT25jZSguLi4pOworICAvLyBXaWxsIGV4ZWN1dGUgKCpmcCkoNSksIHdoZXJlIGZwIGlzIHRoZQorICAvLyBzZWNvbmQgYXJndW1lbnQgRG9UaGlzKCkgcmVjZWl2ZXMuCitgYGAKKworQXJnaGgsIHlvdSBuZWVkIHRvIHJlZmVyIHRvIGEgbW9jayBmdW5jdGlvbiBhcmd1bWVudCBidXQgQysrIGhhcyBubworbGFtYmRhICh5ZXQpLCBzbyB5b3UgaGF2ZSB0byBkZWZpbmUgeW91ciBvd24gYWN0aW9uLiA6LSggT3IgZG8geW91CityZWFsbHk/CisKK1dlbGwsIEdvb2dsZSBNb2NrIGhhcyBhbiBhY3Rpb24gdG8gc29sdmUgX2V4YWN0bHlfIHRoaXMgcHJvYmxlbToKKworYGBgCisgIEludm9rZUFyZ3VtZW50PE4+KGFyZ18xLCBhcmdfMiwgLi4uLCBhcmdfbSkKK2BgYAorCit3aWxsIGludm9rZSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0aGUgbW9jayBmdW5jdGlvbiByZWNlaXZlcywKK3dpdGggYGFyZ18xYCwgYGFyZ18yYCwgLi4uLCBhbmQgYGFyZ19tYC4gTm8gbWF0dGVyIGlmIHRoZSBhcmd1bWVudCBpcworYSBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3RvciwgR29vZ2xlIE1vY2sgaGFuZGxlcyB0aGVtIGJvdGguCisKK1dpdGggdGhhdCwgeW91IGNvdWxkIHdyaXRlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlQXJndW1lbnQ7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoXywgXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MT4oNSkpOworICAvLyBXaWxsIGV4ZWN1dGUgKCpmcCkoNSksIHdoZXJlIGZwIGlzIHRoZQorICAvLyBzZWNvbmQgYXJndW1lbnQgRG9UaGlzKCkgcmVjZWl2ZXMuCitgYGAKKworV2hhdCBpZiB0aGUgY2FsbGFibGUgdGFrZXMgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlPyBObyBwcm9ibGVtIC0ganVzdAord3JhcCBpdCBpbnNpZGUgYEJ5UmVmKClgOgorCitgYGAKKy4uLgorICBNT0NLX01FVEhPRDEoQmFyLCBib29sKGJvb2wgKCpmcCkoaW50LCBjb25zdCBIZWxwZXImKSkpOworLi4uCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkJ5UmVmOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VBcmd1bWVudDsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBIZWxwZXIgaGVscGVyOworICAuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MD4oNSwgQnlSZWYoaGVscGVyKSkpOworICAvLyBCeVJlZihoZWxwZXIpIGd1YXJhbnRlZXMgdGhhdCBhIHJlZmVyZW5jZSB0byBoZWxwZXIsIG5vdCBhIGNvcHkgb2YgaXQsCisgIC8vIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYWJsZS4KK2BgYAorCitXaGF0IGlmIHRoZSBjYWxsYWJsZSB0YWtlcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UgYW5kIHdlIGRvICoqbm90KioKK3dyYXAgdGhlIGFyZ3VtZW50IGluIGBCeVJlZigpYD8gVGhlbiBgSW52b2tlQXJndW1lbnQoKWAgd2lsbCBfbWFrZSBhCitjb3B5XyBvZiB0aGUgYXJndW1lbnQsIGFuZCBwYXNzIGEgX3JlZmVyZW5jZSB0byB0aGUgY29weV8sIGluc3RlYWQgb2YKK2EgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSwgdG8gdGhlIGNhbGxhYmxlLiBUaGlzIGlzIGVzcGVjaWFsbHkKK2hhbmR5IHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgdGVtcG9yYXJ5IHZhbHVlOgorCitgYGAKKy4uLgorICBNT0NLX01FVEhPRDEoRG9UaGF0LCBib29sKGJvb2wgKCpmKShjb25zdCBkb3VibGUmIHgsIGNvbnN0IHN0cmluZyYgcykpKTsKKy4uLgordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VBcmd1bWVudDsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICAuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MD4oNS4wLCBzdHJpbmcoIkhpIikpKTsKKyAgLy8gV2lsbCBleGVjdXRlICgqZikoNS4wLCBzdHJpbmcoIkhpIikpLCB3aGVyZSBmIGlzIHRoZSBmdW5jdGlvbiBwb2ludGVyCisgIC8vIERvVGhhdCgpIHJlY2VpdmVzLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZXMgNS4wIGFuZCBzdHJpbmcoIkhpIikgYXJlCisgIC8vIHRlbXBvcmFyeSBhbmQgZGVhZCBvbmNlIHRoZSBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCBmaW5pc2hlcy4gIFlldAorICAvLyBpdCdzIGZpbmUgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbiBsYXRlciwgc2luY2UgYSBjb3B5IG9mIHRoZSB2YWx1ZXMKKyAgLy8gYXJlIGtlcHQgaW5zaWRlIHRoZSBJbnZva2VBcmd1bWVudCBhY3Rpb24uCitgYGAKKworIyMgSWdub3JpbmcgYW4gQWN0aW9uJ3MgUmVzdWx0ICMjCisKK1NvbWV0aW1lcyB5b3UgaGF2ZSBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIF9zb21ldGhpbmdfLCBidXQgeW91IG5lZWQgYW4KK2FjdGlvbiB0aGF0IHJldHVybnMgYHZvaWRgIChwZXJoYXBzIHlvdSB3YW50IHRvIHVzZSBpdCBpbiBhIG1vY2sKK2Z1bmN0aW9uIHRoYXQgcmV0dXJucyBgdm9pZGAsIG9yIHBlcmhhcHMgaXQgbmVlZHMgdG8gYmUgdXNlZCBpbgorYERvQWxsKClgIGFuZCBpdCdzIG5vdCB0aGUgbGFzdCBpbiB0aGUgbGlzdCkuIGBJZ25vcmVSZXN1bHQoKWAgbGV0cworeW91IGRvIHRoYXQuIEZvciBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisKK2ludCBQcm9jZXNzKGNvbnN0IE15RGF0YSYgZGF0YSk7CitzdHJpbmcgRG9Tb21ldGhpbmcoKTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QxKEFiYywgdm9pZChjb25zdCBNeURhdGEmIGRhdGEpKTsKKyAgTU9DS19NRVRIT0QwKFh5eiwgYm9vbCgpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBBYmMoXykpCisgIC8vIC5XaWxsT25jZShJbnZva2UoUHJvY2VzcykpOworICAvLyBUaGUgYWJvdmUgbGluZSB3b24ndCBjb21waWxlIGFzIFByb2Nlc3MoKSByZXR1cm5zIGludCBidXQgQWJjKCkgbmVlZHMKKyAgLy8gdG8gcmV0dXJuIHZvaWQuCisgICAgICAuV2lsbE9uY2UoSWdub3JlUmVzdWx0KEludm9rZShQcm9jZXNzKSkpOworCisgIEVYUEVDVF9DQUxMKGZvbywgWHl6KCkpCisgICAgICAuV2lsbE9uY2UoRG9BbGwoSWdub3JlUmVzdWx0KEludm9rZShEb1NvbWV0aGluZykpLAorICAgICAgLy8gSWdub3JlcyB0aGUgc3RyaW5nIERvU29tZXRoaW5nKCkgcmV0dXJucy4KKyAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4odHJ1ZSkpKTsKK2BgYAorCitOb3RlIHRoYXQgeW91ICoqY2Fubm90KiogdXNlIGBJZ25vcmVSZXN1bHQoKWAgb24gYW4gYWN0aW9uIHRoYXQgYWxyZWFkeQorcmV0dXJucyBgdm9pZGAuIERvaW5nIHNvIHdpbGwgbGVhZCB0byB1Z2x5IGNvbXBpbGVyIGVycm9ycy4KKworIyMgU2VsZWN0aW5nIGFuIEFjdGlvbidzIEFyZ3VtZW50cyAjIworCitTYXkgeW91IGhhdmUgYSBtb2NrIGZ1bmN0aW9uIGBGb28oKWAgdGhhdCB0YWtlcyBzZXZlbiBhcmd1bWVudHMsIGFuZAoreW91IGhhdmUgYSBjdXN0b20gYWN0aW9uIHRoYXQgeW91IHdhbnQgdG8gaW52b2tlIHdoZW4gYEZvbygpYCBpcworY2FsbGVkLiBUcm91YmxlIGlzLCB0aGUgY3VzdG9tIGFjdGlvbiBvbmx5IHdhbnRzIHRocmVlIGFyZ3VtZW50czoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKy4uLgorICBNT0NLX01FVEhPRDcoRm9vLCBib29sKGJvb2wgdmlzaWJsZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHBhaXI8aW50LCBpbnQ+LCBkb3VibGU+JiB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl93ZWlnaHQsIGRvdWJsZSBtYXhfd2lnaHQpKTsKKy4uLgorCitib29sIElzVmlzaWJsZUluUXVhZHJhbnQxKGJvb2wgdmlzaWJsZSwgaW50IHgsIGludCB5KSB7CisgIHJldHVybiB2aXNpYmxlICYmIHggPj0gMCAmJiB5ID49IDA7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oXywgXywgXywgXywgXywgXywgXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlKElzVmlzaWJsZUluUXVhZHJhbnQxKSk7ICAvLyBVaCwgd29uJ3QgY29tcGlsZS4gOi0oCitgYGAKKworVG8gcGxlYXNlIHRoZSBjb21waWxlciBHb2QsIHlvdSBjYW4gdG8gZGVmaW5lIGFuICJhZGFwdG9yIiB0aGF0IGhhcwordGhlIHNhbWUgc2lnbmF0dXJlIGFzIGBGb28oKWAgYW5kIGNhbGxzIHRoZSBjdXN0b20gYWN0aW9uIHdpdGggdGhlCityaWdodCBhcmd1bWVudHM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisKK2Jvb2wgTXlJc1Zpc2libGVJblF1YWRyYW50MShib29sIHZpc2libGUsIGNvbnN0IHN0cmluZyYgbmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxwYWlyPGludCwgaW50PiwgZG91YmxlPiYgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW5fd2VpZ2h0LCBkb3VibGUgbWF4X3dpZ2h0KSB7CisgIHJldHVybiBJc1Zpc2libGVJblF1YWRyYW50MSh2aXNpYmxlLCB4LCB5KTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoTXlJc1Zpc2libGVJblF1YWRyYW50MSkpOyAgLy8gTm93IGl0IHdvcmtzLgorYGBgCisKK0J1dCBpc24ndCB0aGlzIGF3a3dhcmQ/CisKK0dvb2dsZSBNb2NrIHByb3ZpZGVzIGEgZ2VuZXJpYyBfYWN0aW9uIGFkYXB0b3JfLCBzbyB5b3UgY2FuIHNwZW5kIHlvdXIKK3RpbWUgbWluZGluZyBtb3JlIGltcG9ydGFudCBidXNpbmVzcyB0aGFuIHdyaXRpbmcgeW91ciBvd24KK2FkYXB0b3JzLiBIZXJlJ3MgdGhlIHN5bnRheDoKKworYGBgCisgIFdpdGhBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYWN0aW9uKQorYGBgCisKK2NyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGFzc2VzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXQKK3RoZSBnaXZlbiBpbmRpY2VzICgwLWJhc2VkKSB0byB0aGUgaW5uZXIgYGFjdGlvbmAgYW5kIHBlcmZvcm1zCitpdC4gVXNpbmcgYFdpdGhBcmdzYCwgb3VyIG9yaWdpbmFsIGV4YW1wbGUgY2FuIGJlIHdyaXR0ZW4gYXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7Cit1c2luZyA6OnRlc3Rpbmc6OldpdGhBcmdzOworLi4uCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShXaXRoQXJnczwwLCAyLCAzPihJbnZva2UoSXNWaXNpYmxlSW5RdWFkcmFudDEpKSk7CisgICAgICAvLyBObyBuZWVkIHRvIGRlZmluZSB5b3VyIG93biBhZGFwdG9yLgorYGBgCisKK0ZvciBiZXR0ZXIgcmVhZGFiaWxpdHksIEdvb2dsZSBNb2NrIGFsc28gZ2l2ZXMgeW91OgorCisgICogYFdpdGhvdXRBcmdzKGFjdGlvbilgIHdoZW4gdGhlIGlubmVyIGBhY3Rpb25gIHRha2VzIF9ub18gYXJndW1lbnQsIGFuZAorICAqIGBXaXRoQXJnPE4+KGFjdGlvbilgIChubyBgc2AgYWZ0ZXIgYEFyZ2ApIHdoZW4gdGhlIGlubmVyIGBhY3Rpb25gIHRha2VzIF9vbmVfIGFyZ3VtZW50LgorCitBcyB5b3UgbWF5IGhhdmUgcmVhbGl6ZWQsIGBJbnZva2VXaXRob3V0QXJncyguLi4pYCBpcyBqdXN0IHN5bnRhY3RpYworc3VnYXIgZm9yIGBXaXRob3V0QXJncyhJbm92a2UoLi4uKSlgLgorCitIZXJlIGFyZSBtb3JlIHRpcHM6CisKKyAgKiBUaGUgaW5uZXIgYWN0aW9uIHVzZWQgaW4gYFdpdGhBcmdzYCBhbmQgZnJpZW5kcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGBJbnZva2UoKWAgLS0gaXQgY2FuIGJlIGFueXRoaW5nLgorICAqIFlvdSBjYW4gcmVwZWF0IGFuIGFyZ3VtZW50IGluIHRoZSBhcmd1bWVudCBsaXN0IGlmIG5lY2Vzc2FyeSwgZS5nLiBgV2l0aEFyZ3M8MiwgMywgMywgNT4oLi4uKWAuCisgICogWW91IGNhbiBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMsIGUuZy4gYFdpdGhBcmdzPDMsIDIsIDE+KC4uLilgLgorICAqIFRoZSB0eXBlcyBvZiB0aGUgc2VsZWN0ZWQgYXJndW1lbnRzIGRvIF9ub3RfIGhhdmUgdG8gbWF0Y2ggdGhlIHNpZ25hdHVyZSBvZiB0aGUgaW5uZXIgYWN0aW9uIGV4YWN0bHkuIEl0IHdvcmtzIGFzIGxvbmcgYXMgdGhleSBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzIG9mIHRoZSBpbm5lciBhY3Rpb24uIEZvciBleGFtcGxlLCBpZiB0aGUgNC10aCBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBpcyBhbiBgaW50YCBhbmQgYG15X2FjdGlvbmAgdGFrZXMgYSBgZG91YmxlYCwgYFdpdGhBcmc8ND4obXlfYWN0aW9uKWAgd2lsbCB3b3JrLgorCisjIyBJZ25vcmluZyBBcmd1bWVudHMgaW4gQWN0aW9uIEZ1bmN0aW9ucyAjIworCitUaGUgc2VsZWN0aW5nLWFuLWFjdGlvbidzLWFyZ3VtZW50cyByZWNpcGUgc2hvd2VkIHVzIG9uZSB3YXkgdG8gbWFrZSBhCittb2NrIGZ1bmN0aW9uIGFuZCBhbiBhY3Rpb24gd2l0aCBpbmNvbXBhdGlibGUgYXJndW1lbnQgbGlzdHMgZml0Cit0b2dldGhlci4gVGhlIGRvd25zaWRlIGlzIHRoYXQgd3JhcHBpbmcgdGhlIGFjdGlvbiBpbgorYFdpdGhBcmdzPC4uLj4oKWAgY2FuIGdldCB0ZWRpb3VzIGZvciBwZW9wbGUgd3JpdGluZyB0aGUgdGVzdHMuCisKK0lmIHlvdSBhcmUgZGVmaW5pbmcgYSBmdW5jdGlvbiwgbWV0aG9kLCBvciBmdW5jdG9yIHRvIGJlIHVzZWQgd2l0aAorYEludm9rZSooKWAsIGFuZCB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHNvbWUgb2YgaXRzIGFyZ3VtZW50cywgYW4KK2FsdGVybmF0aXZlIHRvIGBXaXRoQXJnc2AgaXMgdG8gZGVjbGFyZSB0aGUgdW5pbnRlcmVzdGluZyBhcmd1bWVudHMgYXMKK2BVbnVzZWRgLiBUaGlzIG1ha2VzIHRoZSBkZWZpbml0aW9uIGxlc3MgY2x1dHRlcmVkIGFuZCBsZXNzIGZyYWdpbGUgaW4KK2Nhc2UgdGhlIHR5cGVzIG9mIHRoZSB1bmludGVyZXN0aW5nIGFyZ3VtZW50cyBjaGFuZ2UuIEl0IGNvdWxkIGFsc28KK2luY3JlYXNlIHRoZSBjaGFuY2UgdGhlIGFjdGlvbiBmdW5jdGlvbiBjYW4gYmUgcmV1c2VkLiBGb3IgZXhhbXBsZSwKK2dpdmVuCisKK2BgYAorICBNT0NLX01FVEhPRDMoRm9vLCBkb3VibGUoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7CisgIE1PQ0tfTUVUSE9EMyhCYXIsIGRvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB4LCBkb3VibGUgeSkpOworYGBgCisKK2luc3RlYWQgb2YKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisKK2RvdWJsZSBEaXN0YW5jZVRvT3JpZ2luV2l0aEluZGV4KGludCBpbmRleCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisuLi4KKworICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luV2l0aExhYmVsKSk7CisgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbldpdGhJbmRleCkpOworYGBgCisKK3lvdSBjb3VsZCB3cml0ZQorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOwordXNpbmcgOjp0ZXN0aW5nOjpVbnVzZWQ7CisKK2RvdWJsZSBEaXN0YW5jZVRvT3JpZ2luKFVudXNlZCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisuLi4KKworICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luKSk7CisgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbikpOworYGBgCisKKyMjIFNoYXJpbmcgQWN0aW9ucyAjIworCitKdXN0IGxpa2UgbWF0Y2hlcnMsIGEgR29vZ2xlIE1vY2sgYWN0aW9uIG9iamVjdCBjb25zaXN0cyBvZiBhIHBvaW50ZXIKK3RvIGEgcmVmLWNvdW50ZWQgaW1wbGVtZW50YXRpb24gb2JqZWN0LiBUaGVyZWZvcmUgY29weWluZyBhY3Rpb25zIGlzCithbHNvIGFsbG93ZWQgYW5kIHZlcnkgZWZmaWNpZW50LiBXaGVuIHRoZSBsYXN0IGFjdGlvbiB0aGF0IHJlZmVyZW5jZXMKK3RoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgZGllcywgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdCB3aWxsIGJlCitkZWxldGVkLgorCitJZiB5b3UgaGF2ZSBzb21lIGNvbXBsZXggYWN0aW9uIHRoYXQgeW91IHdhbnQgdG8gdXNlIGFnYWluIGFuZCBhZ2FpbiwKK3lvdSBtYXkgbm90IGhhdmUgdG8gYnVpbGQgaXQgZnJvbSBzY3JhdGNoIGV2ZXJ5dGltZS4gSWYgdGhlIGFjdGlvbgorZG9lc24ndCBoYXZlIGFuIGludGVybmFsIHN0YXRlIChpLmUuIGlmIGl0IGFsd2F5cyBkb2VzIHRoZSBzYW1lIHRoaW5nCitubyBtYXR0ZXIgaG93IG1hbnkgdGltZXMgaXQgaGFzIGJlZW4gY2FsbGVkKSwgeW91IGNhbiBhc3NpZ24gaXQgdG8gYW4KK2FjdGlvbiB2YXJpYWJsZSBhbmQgdXNlIHRoYXQgdmFyaWFibGUgcmVwZWF0ZWRseS4gRm9yIGV4YW1wbGU6CisKK2BgYAorICBBY3Rpb248Ym9vbChpbnQqKT4gc2V0X2ZsYWcgPSBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4odHJ1ZSkpOworICAuLi4gdXNlIHNldF9mbGFnIGluIC5XaWxsT25jZSgpIGFuZCAuV2lsbFJlcGVhdGVkbHkoKSAuLi4KK2BgYAorCitIb3dldmVyLCBpZiB0aGUgYWN0aW9uIGhhcyBpdHMgb3duIHN0YXRlLCB5b3UgbWF5IGJlIHN1cnByaXNlZCBpZiB5b3UKK3NoYXJlIHRoZSBhY3Rpb24gb2JqZWN0LiBTdXBwb3NlIHlvdSBoYXZlIGFuIGFjdGlvbiBmYWN0b3J5CitgSW5jcmVtZW50Q291bnRlcihpbml0KWAgd2hpY2ggY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbmNyZW1lbnRzIGFuZAorcmV0dXJucyBhIGNvdW50ZXIgd2hvc2UgaW5pdGlhbCB2YWx1ZSBpcyBgaW5pdGAsIHVzaW5nIHR3byBhY3Rpb25zCitjcmVhdGVkIGZyb20gdGhlIHNhbWUgZXhwcmVzc2lvbiBhbmQgdXNpbmcgYSBzaGFyZWQgYWN0aW9uIHdpbGwKK2V4aWhpYml0IGRpZmZlcmVudCBiZWhhdmlvcnMuIEV4YW1wbGU6CisKK2BgYAorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcygpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KEluY3JlbWVudENvdW50ZXIoMCkpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KEluY3JlbWVudENvdW50ZXIoMCkpOworICBmb28uRG9UaGlzKCk7ICAvLyBSZXR1cm5zIDEuCisgIGZvby5Eb1RoaXMoKTsgIC8vIFJldHVybnMgMi4KKyAgZm9vLkRvVGhhdCgpOyAgLy8gUmV0dXJucyAxIC0gQmxhaCgpIHVzZXMgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgLy8gY291bnRlciB0aGFuIEJhcigpJ3MuCitgYGAKKwordmVyc3VzCisKK2BgYAorICBBY3Rpb248aW50KCk+IGluY3JlbWVudCA9IEluY3JlbWVudENvdW50ZXIoMCk7CisKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShpbmNyZW1lbnQpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KGluY3JlbWVudCk7CisgIGZvby5Eb1RoaXMoKTsgIC8vIFJldHVybnMgMS4KKyAgZm9vLkRvVGhpcygpOyAgLy8gUmV0dXJucyAyLgorICBmb28uRG9UaGF0KCk7ICAvLyBSZXR1cm5zIDMgLSB0aGUgY291bnRlciBpcyBzaGFyZWQuCitgYGAKKworIyBNaXNjIFJlY2lwZXMgb24gVXNpbmcgR29vZ2xlIE1vY2sgIworCisjIyBNb2NraW5nIE1ldGhvZHMgVGhhdCBVc2UgTW92ZS1Pbmx5IFR5cGVzICMjCisKK0MrKzExIGludHJvZHVjZWQgPGVtPm1vdmUtb25seSB0eXBlczwvZW0+LiAgQSBtb3ZlLW9ubHktdHlwZWQgdmFsdWUgY2FuIGJlIG1vdmVkIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLCBidXQgY2Fubm90IGJlIGNvcGllZC4gIGBzdGQ6OnVuaXF1ZV9wdHI8VD5gIGlzIHByb2JhYmx5IHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbW92ZS1vbmx5IHR5cGUuCisKK01vY2tpbmcgYSBtZXRob2QgdGhhdCB0YWtlcyBhbmQvb3IgcmV0dXJucyBtb3ZlLW9ubHkgdHlwZXMgcHJlc2VudHMgc29tZSBjaGFsbGVuZ2VzLCBidXQgbm90aGluZyBpbnN1cm1vdW50YWJsZS4gIFRoaXMgcmVjaXBlIHNob3dzIHlvdSBob3cgeW91IGNhbiBkbyBpdC4KKworTGV04oCZcyBzYXkgd2UgYXJlIHdvcmtpbmcgb24gYSBmaWN0aW9uYWwgcHJvamVjdCB0aGF0IGxldHMgb25lIHBvc3QgYW5kIHNoYXJlIHNuaXBwZXRzIGNhbGxlZCDigJxidXp6ZXPigJ0uICBZb3VyIGNvZGUgdXNlcyB0aGVzZSB0eXBlczoKKworYGBgCitlbnVtIGNsYXNzIEFjY2Vzc0xldmVsIHsga0ludGVybmFsLCBrUHVibGljIH07CisKK2NsYXNzIEJ1enogeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQnV6eihBY2Nlc3NMZXZlbCBhY2Nlc3MpIHsg4oCmIH0KKyAgLi4uCit9OworCitjbGFzcyBCdXp6ZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+QnV6emVyKCkge30KKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QnV6ej4gTWFrZUJ1enooY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpID0gMDsKKyAgdmlydHVhbCBib29sIFNoYXJlQnV6eihzdGQ6OnVuaXF1ZV9wdHI8QnV6ej4gYnV6eiwgVGltZSB0aW1lc3RhbXApID0gMDsKKyAgLi4uCit9OworYGBgCisKK0EgYEJ1enpgIG9iamVjdCByZXByZXNlbnRzIGEgc25pcHBldCBiZWluZyBwb3N0ZWQuICBBIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgYEJ1enplcmAgaW50ZXJmYWNlIGlzIGNhcGFibGUgb2YgY3JlYXRpbmcgYW5kIHNoYXJpbmcgYEJ1enpgLiAgTWV0aG9kcyBpbiBgQnV6emVyYCBtYXkgcmV0dXJuIGEgYHVuaXF1ZV9wdHI8QnV6ej5gIG9yIHRha2UgYSBgdW5pcXVlX3B0cjxCdXp6PmAuICBOb3cgd2UgbmVlZCB0byBtb2NrIGBCdXp6ZXJgIGluIG91ciB0ZXN0cy4KKworVG8gbW9jayBhIG1ldGhvZCB0aGF0IHJldHVybnMgYSBtb3ZlLW9ubHkgdHlwZSwgeW91IGp1c3QgdXNlIHRoZSBmYW1pbGlhciBgTU9DS19NRVRIT0RgIHN5bnRheCBhcyB1c3VhbDoKKworYGBgCitjbGFzcyBNb2NrQnV6emVyIDogcHVibGljIEJ1enplciB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoTWFrZUJ1enosIHN0ZDo6dW5pcXVlX3B0cjxCdXp6Pihjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkpOworICDigKYKK307CitgYGAKKworSG93ZXZlciwgaWYgeW91IGF0dGVtcHQgdG8gdXNlIHRoZSBzYW1lIGBNT0NLX01FVEhPRGAgcGF0dGVybiB0byBtb2NrIGEgbWV0aG9kIHRoYXQgdGFrZXMgYSBtb3ZlLW9ubHkgcGFyYW1ldGVyLCB5b3XigJlsbCBnZXQgYSBjb21waWxlciBlcnJvciBjdXJyZW50bHk6CisKK2BgYAorICAvLyBEb2VzIE5PVCBjb21waWxlIQorICBNT0NLX01FVEhPRDIoU2hhcmVCdXp6LCBib29sKHN0ZDo6dW5pcXVlX3B0cjxCdXp6PiBidXp6LCBUaW1lIHRpbWVzdGFtcCkpOworYGBgCisKK1doaWxlIGl04oCZcyBoaWdobHkgZGVzaXJhYmxlIHRvIG1ha2UgdGhpcyBzeW50YXgganVzdCB3b3JrLCBpdOKAmXMgbm90IHRyaXZpYWwgYW5kIHRoZSB3b3JrIGhhc27igJl0IGJlZW4gZG9uZSB5ZXQuICBGb3J0dW5hdGVseSwgdGhlcmUgaXMgYSB0cmljayB5b3UgY2FuIGFwcGx5IHRvZGF5IHRvIGdldCBzb21ldGhpbmcgdGhhdCB3b3JrcyBuZWFybHkgYXMgd2VsbCBhcyB0aGlzLgorCitUaGUgdHJpY2ssIGlzIHRvIGRlbGVnYXRlIHRoZSBgU2hhcmVCdXp6KClgIG1ldGhvZCB0byBhIG1vY2sgbWV0aG9kIChsZXTigJlzIGNhbGwgaXQgYERvU2hhcmVCdXp6KClgKSB0aGF0IGRvZXMgbm90IHRha2UgbW92ZS1vbmx5IHBhcmFtZXRlcnM6CisKK2BgYAorY2xhc3MgTW9ja0J1enplciA6IHB1YmxpYyBCdXp6ZXIgeworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QxKE1ha2VCdXp6LCBzdGQ6OnVuaXF1ZV9wdHI8QnV6ej4oY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpKTsKKyAgTU9DS19NRVRIT0QyKERvU2hhcmVCdXp6LCBib29sKEJ1enoqIGJ1enosIFRpbWUgdGltZXN0YW1wKSk7CisgIGJvb2wgU2hhcmVCdXp6KHN0ZDo6dW5pcXVlX3B0cjxCdXp6PiBidXp6LCBUaW1lIHRpbWVzdGFtcCkgeworICAgIHJldHVybiBEb1NoYXJlQnV6eihidXp6LmdldCgpLCB0aW1lc3RhbXApOworICB9Cit9OworYGBgCisKK05vdGUgdGhhdCB0aGVyZSdzIG5vIG5lZWQgdG8gZGVmaW5lIG9yIGRlY2xhcmUgYERvU2hhcmVCdXp6KClgIGluIGEgYmFzZSBjbGFzcy4gIFlvdSBvbmx5IG5lZWQgdG8gZGVmaW5lIGl0IGFzIGEgYE1PQ0tfTUVUSE9EYCBpbiB0aGUgbW9jayBjbGFzcy4KKworTm93IHRoYXQgd2UgaGF2ZSB0aGUgbW9jayBjbGFzcyBkZWZpbmVkLCB3ZSBjYW4gdXNlIGl0IGluIHRlc3RzLiAgSW4gdGhlIGZvbGxvd2luZyBjb2RlIGV4YW1wbGVzLCB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGRlZmluZWQgYSBgTW9ja0J1enplcmAgb2JqZWN0IG5hbWVkIGBtb2NrX2J1enplcl9gOgorCitgYGAKKyAgTW9ja0J1enplciBtb2NrX2J1enplcl87CitgYGAKKworRmlyc3QgbGV04oCZcyBzZWUgaG93IHdlIGNhbiBzZXQgZXhwZWN0YXRpb25zIG9uIHRoZSBgTWFrZUJ1enooKWAgbWV0aG9kLCB3aGljaCByZXR1cm5zIGEgYHVuaXF1ZV9wdHI8QnV6ej5gLgorCitBcyB1c3VhbCwgaWYgeW91IHNldCBhbiBleHBlY3RhdGlvbiB3aXRob3V0IGFuIGFjdGlvbiAoaS5lLiB0aGUgYC5XaWxsT25jZSgpYCBvciBgLldpbGxSZXBlYXRlZCgpYCBjbGF1c2UpLCB3aGVuIHRoYXQgZXhwZWN0YXRpb24gZmlyZXMsIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhhdCBtZXRob2Qgd2lsbCBiZSB0YWtlbi4gIFNpbmNlIGB1bmlxdWVfcHRyPD5gIGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IgdGhhdCByZXR1cm5zIGEgbnVsbCBgdW5pcXVlX3B0cmAsIHRoYXTigJlzIHdoYXQgeW914oCZbGwgZ2V0IGlmIHlvdSBkb27igJl0IHNwZWNpZnkgYW4gYWN0aW9uOgorCitgYGAKKyAgLy8gVXNlIHRoZSBkZWZhdWx0IGFjdGlvbi4KKyAgRVhQRUNUX0NBTEwobW9ja19idXp6ZXJfLCBNYWtlQnV6eigiaGVsbG8iKSk7CisKKyAgLy8gVHJpZ2dlcnMgdGhlIHByZXZpb3VzIEVYUEVDVF9DQUxMLgorICBFWFBFQ1RfRVEobnVsbHB0ciwgbW9ja19idXp6ZXJfLk1ha2VCdXp6KCJoZWxsbyIpKTsKK2BgYAorCitJZiB5b3UgYXJlIG5vdCBoYXBweSB3aXRoIHRoZSBkZWZhdWx0IGFjdGlvbiwgeW91IGNhbiB0d2VhayBpdC4gIERlcGVuZGluZyBvbiB3aGF0IHlvdSBuZWVkLCB5b3UgbWF5IGVpdGhlciB0d2VhayB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGEgc3BlY2lmaWMgKG1vY2sgb2JqZWN0LCBtb2NrIG1ldGhvZCkgY29tYmluYXRpb24gdXNpbmcgYE9OX0NBTEwoKWAsIG9yIHlvdSBtYXkgdHdlYWsgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciBhbGwgbW9jayBtZXRob2RzIHRoYXQgcmV0dXJuIGEgc3BlY2lmaWMgdHlwZS4gIFRoZSB1c2FnZSBvZiBgT05fQ0FMTCgpYCBpcyBzaW1pbGFyIHRvIGBFWFBFQ1RfQ0FMTCgpYCwgc28gd2XigJlsbCBza2lwIGl0IGFuZCBqdXN0IGV4cGxhaW4gaG93IHRvIGRvIHRoZSBsYXR0ZXIgKHR3ZWFraW5nIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgYSBzcGVjaWZpYyByZXR1cm4gdHlwZSkuICBZb3UgZG8gdGhpcyB2aWEgdGhlIGBEZWZhdWx0VmFsdWU8Pjo6U2V0RmFjdG9yeSgpYCBhbmQgYERlZmF1bHRWYWx1ZTw+OjpDbGVhcigpYCBBUEk6CisKK2BgYAorICAvLyBTZXRzIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgcmV0dXJuIHR5cGUgc3RkOjp1bmlxdWVfcHRyPEJ1eno+IHRvCisgIC8vIGNyZWF0aW5nIGEgbmV3IEJ1enogZXZlcnkgdGltZS4KKyAgRGVmYXVsdFZhbHVlPHN0ZDo6dW5pcXVlX3B0cjxCdXp6Pj46OlNldEZhY3RvcnkoCisgICAgICBbXSB7IHJldHVybiBNYWtlVW5pcXVlPEJ1eno+KEFjY2Vzc0xldmVsOjprSW50ZXJuYWwpOyB9KTsKKworICAvLyBXaGVuIHRoaXMgZmlyZXMsIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiBNYWtlQnV6eigpIHdpbGwgcnVuLCB3aGljaAorICAvLyB3aWxsIHJldHVybiBhIG5ldyBCdXp6IG9iamVjdC4KKyAgRVhQRUNUX0NBTEwobW9ja19idXp6ZXJfLCBNYWtlQnV6eigiaGVsbG8iKSkuVGltZXMoQW55TnVtYmVyKCkpOworCisgIGF1dG8gYnV6ejEgPSBtb2NrX2J1enplcl8uTWFrZUJ1enooImhlbGxvIik7CisgIGF1dG8gYnV6ejIgPSBtb2NrX2J1enplcl8uTWFrZUJ1enooImhlbGxvIik7CisgIEVYUEVDVF9ORShudWxscHRyLCBidXp6MSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBidXp6Mik7CisgIEVYUEVDVF9ORShidXp6MSwgYnV6ejIpOworCisgIC8vIFJlc2V0cyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHJldHVybiB0eXBlIHN0ZDo6dW5pcXVlX3B0cjxCdXp6PiwKKyAgLy8gdG8gYXZvaWQgaW50ZXJmZXJlIHdpdGggb3RoZXIgdGVzdHMuCisgIERlZmF1bHRWYWx1ZTxzdGQ6OnVuaXF1ZV9wdHI8QnV6ej4+OjpDbGVhcigpOworYGBgCisKK1doYXQgaWYgeW91IHdhbnQgdGhlIG1ldGhvZCB0byBkbyBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBhY3Rpb24/ICBJZiB5b3UganVzdCBuZWVkIHRvIHJldHVybiBhIHByZS1kZWZpbmVkIG1vdmUtb25seSB2YWx1ZSwgeW91IGNhbiB1c2UgdGhlIGBSZXR1cm4oQnlNb3ZlKC4uLikpYCBhY3Rpb246CisKK2BgYAorICAvLyBXaGVuIHRoaXMgZmlyZXMsIHRoZSB1bmlxdWVfcHRyPD4gc3BlY2lmaWVkIGJ5IEJ5TW92ZSguLi4pIHdpbGwKKyAgLy8gYmUgcmV0dXJuZWQuCisgIEVYUEVDVF9DQUxMKG1vY2tfYnV6emVyXywgTWFrZUJ1enooIndvcmxkIikpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKEJ5TW92ZShNYWtlVW5pcXVlPEJ1eno+KEFjY2Vzc0xldmVsOjprSW50ZXJuYWwpKSkpOworCisgIEVYUEVDVF9ORShudWxscHRyLCBtb2NrX2J1enplcl8uTWFrZUJ1enooIndvcmxkIikpOworYGBgCisKK05vdGUgdGhhdCBgQnlNb3ZlKClgIGlzIGVzc2VudGlhbCBoZXJlIC0gaWYgeW91IGRyb3AgaXQsIHRoZSBjb2RlIHdvbuKAmXQgY29tcGlsZS4KKworUXVpeiB0aW1lISAgV2hhdCBkbyB5b3UgdGhpbmsgd2lsbCBoYXBwZW4gaWYgYSBgUmV0dXJuKEJ5TW92ZSguLi4pKWAgYWN0aW9uIGlzIHBlcmZvcm1lZCBtb3JlIHRoYW4gb25jZSAoZS5nLiB5b3Ugd3JpdGUgYOKApi5XaWxsUmVwZWF0ZWRseShSZXR1cm4oQnlNb3ZlKC4uLikpKTtgKT8gIENvbWUgdGhpbmsgb2YgaXQsIGFmdGVyIHRoZSBmaXJzdCB0aW1lIHRoZSBhY3Rpb24gcnVucywgdGhlIHNvdXJjZSB2YWx1ZSB3aWxsIGJlIGNvbnN1bWVkIChzaW5jZSBpdOKAmXMgYSBtb3ZlLW9ubHkgdmFsdWUpLCBzbyB0aGUgbmV4dCB0aW1lIGFyb3VuZCwgdGhlcmXigJlzIG5vIHZhbHVlIHRvIG1vdmUgZnJvbSAtLSB5b3XigJlsbCBnZXQgYSBydW4tdGltZSBlcnJvciB0aGF0IGBSZXR1cm4oQnlNb3ZlKC4uLikpYCBjYW4gb25seSBiZSBydW4gb25jZS4KKworSWYgeW91IG5lZWQgeW91ciBtb2NrIG1ldGhvZCB0byBkbyBtb3JlIHRoYW4ganVzdCBtb3ZpbmcgYSBwcmUtZGVmaW5lZCB2YWx1ZSwgcmVtZW1iZXIgdGhhdCB5b3UgY2FuIGFsd2F5cyB1c2UgYEludm9rZSgpYCB0byBjYWxsIGEgbGFtYmRhIG9yIGEgY2FsbGFibGUgb2JqZWN0LCB3aGljaCBjYW4gZG8gcHJldHR5IG11Y2ggYW55dGhpbmcgeW91IHdhbnQ6CisKK2BgYAorICBFWFBFQ1RfQ0FMTChtb2NrX2J1enplcl8sIE1ha2VCdXp6KCJ4IikpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlKFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEJ1eno+KEFjY2Vzc0xldmVsOjprSW50ZXJuYWwpOworICAgICAgfSkpOworCisgIEVYUEVDVF9ORShudWxscHRyLCBtb2NrX2J1enplcl8uTWFrZUJ1enooIngiKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBtb2NrX2J1enplcl8uTWFrZUJ1enooIngiKSk7CitgYGAKKworRXZlcnkgdGltZSB0aGlzIGBFWFBFQ1RfQ0FMTGAgZmlyZXMsIGEgbmV3IGB1bmlxdWVfcHRyPEJ1eno+YCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLiAgWW91IGNhbm5vdCBkbyB0aGlzIHdpdGggYFJldHVybihCeU1vdmUoLi4uKSlgLgorCitOb3cgdGhlcmXigJlzIG9uZSB0b3BpYyB3ZSBoYXZlbuKAmXQgY292ZXJlZDogaG93IGRvIHlvdSBzZXQgZXhwZWN0YXRpb25zIG9uIGBTaGFyZUJ1enooKWAsIHdoaWNoIHRha2VzIGEgbW92ZS1vbmx5LXR5cGVkIHBhcmFtZXRlcj8gIFRoZSBhbnN3ZXIgaXMgeW91IGRvbuKAmXQuICBJbnN0ZWFkLCB5b3Ugc2V0IGV4cGVjdGF0aW9ucyBvbiB0aGUgYERvU2hhcmVCdXp6KClgIG1vY2sgbWV0aG9kIChyZW1lbWJlciB0aGF0IHdlIGRlZmluZWQgYSBgTU9DS19NRVRIT0RgIGZvciBgRG9TaGFyZUJ1enooKWAsIG5vdCBgU2hhcmVCdXp6KClgKToKKworYGBgCisgIEVYUEVDVF9DQUxMKG1vY2tfYnV6emVyXywgRG9TaGFyZUJ1enooTm90TnVsbCgpLCBfKSk7CisKKyAgLy8gV2hlbiBvbmUgY2FsbHMgU2hhcmVCdXp6KCkgb24gdGhlIE1vY2tCdXp6ZXIgbGlrZSB0aGlzLCB0aGUgY2FsbCBpcworICAvLyBmb3J3YXJkZWQgdG8gRG9TaGFyZUJ1enooKSwgd2hpY2ggaXMgbW9ja2VkLiAgVGhlcmVmb3JlIHRoaXMgc3RhdGVtZW50CisgIC8vIHdpbGwgdHJpZ2dlciB0aGUgYWJvdmUgRVhQRUNUX0NBTEwuCisgIG1vY2tfYnV6emVyXy5TaGFyZUJ1enooTWFrZVVuaXF1ZSZsdDtCdXp6Jmd0OyhBY2Nlc3NMZXZlbDo6a0ludGVybmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OmJhc2U6Ok5vdygpKTsKK2BgYAorCitTb21lIG9mIHlvdSBtYXkgaGF2ZSBzcG90dGVkIG9uZSBwcm9ibGVtIHdpdGggdGhpcyBhcHByb2FjaDogdGhlIGBEb1NoYXJlQnV6eigpYCBtb2NrIG1ldGhvZCBkaWZmZXJzIGZyb20gdGhlIHJlYWwgYFNoYXJlQnV6eigpYCBtZXRob2QgaW4gdGhhdCBpdCBjYW5ub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGJ1enogcGFyYW1ldGVyIC0gYFNoYXJlQnV6eigpYCB3aWxsIGFsd2F5cyBkZWxldGUgYnV6eiBhZnRlciBgRG9TaGFyZUJ1enooKWAgcmV0dXJucy4gIFdoYXQgaWYgeW91IG5lZWQgdG8gc2F2ZSB0aGUgYnV6eiBvYmplY3Qgc29tZXdoZXJlIGZvciBsYXRlciB1c2Ugd2hlbiBgU2hhcmVCdXp6KClgIGlzIGNhbGxlZD8gIEluZGVlZCwgeW91J2QgYmUgc3R1Y2suCisKK0Fub3RoZXIgcHJvYmxlbSB3aXRoIHRoZSBgRG9TaGFyZUJ1enooKWAgd2UgaGFkIGlzIHRoYXQgaXQgY2FuIHN1cnByaXNlIHBlb3BsZSByZWFkaW5nIG9yIG1haW50YWluaW5nIHRoZSB0ZXN0LCBhcyBvbmUgd291bGQgZXhwZWN0IHRoYXQgYERvU2hhcmVCdXp6KClgIGhhcyAobG9naWNhbGx5KSB0aGUgc2FtZSBjb250cmFjdCBhcyBgU2hhcmVCdXp6KClgLgorCitGb3J0dW5hdGVseSwgdGhlc2UgcHJvYmxlbXMgY2FuIGJlIGZpeGVkIHdpdGggYSBiaXQgbW9yZSBjb2RlLiAgTGV0J3MgdHJ5IHRvIGdldCBpdCByaWdodCB0aGlzIHRpbWU6CisKK2BgYAorY2xhc3MgTW9ja0J1enplciA6IHB1YmxpYyBCdXp6ZXIgeworIHB1YmxpYzoKKyAgTW9ja0J1enplcigpIHsKKyAgICAvLyBTaW5jZSBEb1NoYXJlQnV6eihidXp6LCB0aW1lKSBpcyBzdXBwb3NlZCB0byB0YWtlIG93bmVyc2hpcCBvZgorICAgIC8vIGJ1enosIGRlZmluZSBhIGRlZmF1bHQgYmVoYXZpb3IgZm9yIERvU2hhcmVCdXp6KGJ1enosIHRpbWUpIHRvCisgICAgLy8gZGVsZXRlIGJ1enouCisgICAgT05fQ0FMTCgqdGhpcywgRG9TaGFyZUJ1enooXywgXykpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZShbXShCdXp6KiBidXp6LCBUaW1lIHRpbWVzdGFtcCkgeworICAgICAgICAgIGRlbGV0ZSBidXp6OworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9KSk7CisgIH0KKworICBNT0NLX01FVEhPRDEoTWFrZUJ1enosIHN0ZDo6dW5pcXVlX3B0cjxCdXp6Pihjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkpOworCisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiBidXp6LgorICBNT0NLX01FVEhPRDIoRG9TaGFyZUJ1enosIGJvb2woQnV6eiogYnV6eiwgVGltZSB0aW1lc3RhbXApKTsKKyAgYm9vbCBTaGFyZUJ1enooc3RkOjp1bmlxdWVfcHRyPEJ1eno+IGJ1enosIFRpbWUgdGltZXN0YW1wKSB7CisgICAgcmV0dXJuIERvU2hhcmVCdXp6KGJ1enoucmVsZWFzZSgpLCB0aW1lc3RhbXApOworICB9Cit9OworYGBgCisKK05vdywgdGhlIG1vY2sgYERvU2hhcmVCdXp6KClgIG1ldGhvZCBpcyBmcmVlIHRvIHNhdmUgdGhlIGJ1enogYXJndW1lbnQgZm9yIGxhdGVyIHVzZSBpZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQ6CisKK2BgYAorICBzdGQ6OnVuaXF1ZV9wdHI8QnV6ej4gaW50ZXJjZXB0ZWRfYnV6ejsKKyAgRVhQRUNUX0NBTEwobW9ja19idXp6ZXJfLCBEb1NoYXJlQnV6eihOb3ROdWxsKCksIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShbJmFtcDtpbnRlcmNlcHRlZF9idXp6XShCdXp6KiBidXp6LCBUaW1lIHRpbWVzdGFtcCkgeworICAgICAgICAvLyBTYXZlIGJ1enogaW4gaW50ZXJjZXB0ZWRfYnV6eiBmb3IgYW5hbHlzaXMgbGF0ZXIuCisgICAgICAgIGludGVyY2VwdGVkX2J1enoucmVzZXQoYnV6eik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0pKTsKKworICBtb2NrX2J1enplcl8uU2hhcmVCdXp6KHN0ZDo6bWFrZV91bmlxdWU8QnV6ej4oQWNjZXNzTGV2ZWw6OmtJbnRlcm5hbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTm93KCkpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgaW50ZXJjZXB0ZWRfYnV6eik7CitgYGAKKworVXNpbmcgdGhlIHRyaWNrcyBjb3ZlcmVkIGluIHRoaXMgcmVjaXBlLCB5b3UgYXJlIG5vdyBhYmxlIHRvIG1vY2sgbWV0aG9kcyB0aGF0IHRha2UgYW5kL29yIHJldHVybiBtb3ZlLW9ubHkgdHlwZXMuICBQdXQgeW91ciBuZXdseS1hY3F1aXJlZCBwb3dlciB0byBnb29kIHVzZSAtIHdoZW4geW91IGRlc2lnbiBhIG5ldyBBUEksIHlvdSBjYW4gbm93IGZlZWwgY29tZm9ydGFibGUgdXNpbmcgYHVuaXF1ZV9wdHJzYCBhcyBhcHByb3ByaWF0ZSwgd2l0aG91dCBmZWFyaW5nIHRoYXQgZG9pbmcgc28gd2lsbCBjb21wcm9taXNlIHlvdXIgdGVzdHMuCisKKyMjIE1ha2luZyB0aGUgQ29tcGlsYXRpb24gRmFzdGVyICMjCisKK0JlbGlldmUgaXQgb3Igbm90LCB0aGUgX3Zhc3QgbWFqb3JpdHlfIG9mIHRoZSB0aW1lIHNwZW50IG9uIGNvbXBpbGluZworYSBtb2NrIGNsYXNzIGlzIGluIGdlbmVyYXRpbmcgaXRzIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yLCBhcyB0aGV5CitwZXJmb3JtIG5vbi10cml2aWFsIHRhc2tzIChlLmcuIHZlcmlmaWNhdGlvbiBvZiB0aGUKK2V4cGVjdGF0aW9ucykuIFdoYXQncyBtb3JlLCBtb2NrIG1ldGhvZHMgd2l0aCBkaWZmZXJlbnQgc2lnbmF0dXJlcworaGF2ZSBkaWZmZXJlbnQgdHlwZXMgYW5kIHRodXMgdGhlaXIgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIG5lZWQgdG8KK2JlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgc2VwYXJhdGVseS4gQXMgYSByZXN1bHQsIGlmIHlvdSBtb2NrIG1hbnkKK2RpZmZlcmVudCB0eXBlcyBvZiBtZXRob2RzLCBjb21waWxpbmcgeW91ciBtb2NrIGNsYXNzIGNhbiBnZXQgcmVhbGx5CitzbG93LgorCitJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBzbG93IGNvbXBpbGF0aW9uLCB5b3UgY2FuIG1vdmUgdGhlIGRlZmluaXRpb24KK29mIHlvdXIgbW9jayBjbGFzcycgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3Igb3V0IG9mIHRoZSBjbGFzcyBib2R5CithbmQgaW50byBhIGAuY3BwYCBmaWxlLiBUaGlzIHdheSwgZXZlbiBpZiB5b3UgYCNpbmNsdWRlYCB5b3VyIG1vY2sKK2NsYXNzIGluIE4gZmlsZXMsIHRoZSBjb21waWxlciBvbmx5IG5lZWRzIHRvIGdlbmVyYXRlIGl0cyBjb25zdHJ1Y3RvcgorYW5kIGRlc3RydWN0b3Igb25jZSwgcmVzdWx0aW5nIGluIGEgbXVjaCBmYXN0ZXIgY29tcGlsYXRpb24uCisKK0xldCdzIGlsbHVzdHJhdGUgdGhlIGlkZWEgdXNpbmcgYW4gZXhhbXBsZS4gSGVyZSdzIHRoZSBkZWZpbml0aW9uIG9mIGEKK21vY2sgY2xhc3MgYmVmb3JlIGFwcGx5aW5nIHRoaXMgcmVjaXBlOgorCitgYGAKKy8vIEZpbGUgbW9ja19mb28uaC4KKy4uLgorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgLy8gU2luY2Ugd2UgZG9uJ3QgZGVjbGFyZSB0aGUgY29uc3RydWN0b3Igb3IgdGhlIGRlc3RydWN0b3IsCisgIC8vIHRoZSBjb21waWxlciB3aWxsIGdlbmVyYXRlIHRoZW0gaW4gZXZlcnkgdHJhbnNsYXRpb24gdW5pdAorICAvLyB3aGVyZSB0aGlzIG1vY2sgY2xhc3MgaXMgdXNlZC4KKworICBNT0NLX01FVEhPRDAoRG9UaGlzLCBpbnQoKSk7CisgIE1PQ0tfTUVUSE9EMShEb1RoYXQsIGJvb2woY29uc3QgY2hhciogc3RyKSk7CisgIC4uLiBtb3JlIG1vY2sgbWV0aG9kcyAuLi4KK307CitgYGAKKworQWZ0ZXIgdGhlIGNoYW5nZSwgaXQgd291bGQgbG9vayBsaWtlOgorCitgYGAKKy8vIEZpbGUgbW9ja19mb28uaC4KKy4uLgorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgLy8gVGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGFyZSBkZWNsYXJlZCwgYnV0IG5vdCBkZWZpbmVkLCBoZXJlLgorICBNb2NrRm9vKCk7CisgIHZpcnR1YWwgfk1vY2tGb28oKTsKKworICBNT0NLX01FVEhPRDAoRG9UaGlzLCBpbnQoKSk7CisgIE1PQ0tfTUVUSE9EMShEb1RoYXQsIGJvb2woY29uc3QgY2hhciogc3RyKSk7CisgIC4uLiBtb3JlIG1vY2sgbWV0aG9kcyAuLi4KK307CitgYGAKK2FuZAorYGBgCisvLyBGaWxlIG1vY2tfZm9vLmNwcC4KKyNpbmNsdWRlICJwYXRoL3RvL21vY2tfZm9vLmgiCisKKy8vIFRoZSBkZWZpbml0aW9ucyBtYXkgYXBwZWFyIHRyaXZpYWwsIGJ1dCB0aGUgZnVuY3Rpb25zIGFjdHVhbGx5IGRvIGEKKy8vIGxvdCBvZiB0aGluZ3MgdGhyb3VnaCB0aGUgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIG9mIHRoZSBtZW1iZXIKKy8vIHZhcmlhYmxlcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgbW9jayBtZXRob2RzLgorTW9ja0Zvbzo6TW9ja0ZvbygpIHt9CitNb2NrRm9vOjp+TW9ja0ZvbygpIHt9CitgYGAKKworIyMgRm9yY2luZyBhIFZlcmlmaWNhdGlvbiAjIworCitXaGVuIGl0J3MgYmVpbmcgZGVzdG95ZWQsIHlvdXIgZnJpZW5kbHkgbW9jayBvYmplY3Qgd2lsbCBhdXRvbWF0aWNhbGx5Cit2ZXJpZnkgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIGl0IGhhdmUgYmVlbiBzYXRpc2ZpZWQsIGFuZCB3aWxsCitnZW5lcmF0ZSBbR29vZ2xlIFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LykgZmFpbHVyZXMKK2lmIG5vdC4gVGhpcyBpcyBjb252ZW5pZW50IGFzIGl0IGxlYXZlcyB5b3Ugd2l0aCBvbmUgbGVzcyB0aGluZyB0bword29ycnkgYWJvdXQuIFRoYXQgaXMsIHVubGVzcyB5b3UgYXJlIG5vdCBzdXJlIGlmIHlvdXIgbW9jayBvYmplY3Qgd2lsbAorYmUgZGVzdG95ZWQuCisKK0hvdyBjb3VsZCBpdCBiZSB0aGF0IHlvdXIgbW9jayBvYmplY3Qgd29uJ3QgZXZlbnR1YWxseSBiZSBkZXN0cm95ZWQ/CitXZWxsLCBpdCBtaWdodCBiZSBjcmVhdGVkIG9uIHRoZSBoZWFwIGFuZCBvd25lZCBieSB0aGUgY29kZSB5b3UgYXJlCit0ZXN0aW5nLiBTdXBwb3NlIHRoZXJlJ3MgYSBidWcgaW4gdGhhdCBjb2RlIGFuZCBpdCBkb2Vzbid0IGRlbGV0ZSB0aGUKK21vY2sgb2JqZWN0IHByb3Blcmx5IC0geW91IGNvdWxkIGVuZCB1cCB3aXRoIGEgcGFzc2luZyB0ZXN0IHdoZW4KK3RoZXJlJ3MgYWN0dWFsbHkgYSBidWcuCisKK1VzaW5nIGEgaGVhcCBjaGVja2VyIGlzIGEgZ29vZCBpZGVhIGFuZCBjYW4gYWxsZXZpYXRlIHRoZSBjb25jZXJuLCBidXQKK2l0cyBpbXBsZW1lbnRhdGlvbiBtYXkgbm90IGJlIDEwMCUgcmVsaWFibGUuIFNvLCBzb21ldGltZXMgeW91IGRvIHdhbnQKK3RvIF9mb3JjZV8gR29vZ2xlIE1vY2sgdG8gdmVyaWZ5IGEgbW9jayBvYmplY3QgYmVmb3JlIGl0IGlzCisoaG9wZWZ1bGx5KSBkZXN0cnVjdGVkLiBZb3UgY2FuIGRvIHRoaXMgd2l0aAorYE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX29iamVjdClgOgorCitgYGAKK1RFU1QoTXlTZXJ2ZXJUZXN0LCBQcm9jZXNzZXNSZXF1ZXN0KSB7CisgIHVzaW5nIDo6dGVzdGluZzo6TW9jazsKKworICBNb2NrRm9vKiBjb25zdCBmb28gPSBuZXcgTW9ja0ZvbzsKKyAgRVhQRUNUX0NBTEwoKmZvbywgLi4uKS4uLjsKKyAgLy8gLi4uIG90aGVyIGV4cGVjdGF0aW9ucyAuLi4KKworICAvLyBzZXJ2ZXIgbm93IG93bnMgZm9vLgorICBNeVNlcnZlciBzZXJ2ZXIoZm9vKTsKKyAgc2VydmVyLlByb2Nlc3NSZXF1ZXN0KC4uLik7CisKKyAgLy8gSW4gY2FzZSB0aGF0IHNlcnZlcidzIGRlc3RydWN0b3Igd2lsbCBmb3JnZXQgdG8gZGVsZXRlIGZvbywKKyAgLy8gdGhpcyB3aWxsIHZlcmlmeSB0aGUgZXhwZWN0YXRpb25zIGFueXdheS4KKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoZm9vKTsKK30gIC8vIHNlcnZlciBpcyBkZXN0cm95ZWQgd2hlbiBpdCBnb2VzIG91dCBvZiBzY29wZSBoZXJlLgorYGBgCisKKyoqVGlwOioqIFRoZSBgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoKWAgZnVuY3Rpb24gcmV0dXJucyBhCitgYm9vbGAgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgdmVyaWZpY2F0aW9uIHdhcyBzdWNjZXNzZnVsIChgdHJ1ZWAgZm9yCit5ZXMpLCBzbyB5b3UgY2FuIHdyYXAgdGhhdCBmdW5jdGlvbiBjYWxsIGluc2lkZSBhIGBBU1NFUlRfVFJVRSgpYCBpZgordGhlcmUgaXMgbm8gcG9pbnQgZ29pbmcgZnVydGhlciB3aGVuIHRoZSB2ZXJpZmljYXRpb24gaGFzIGZhaWxlZC4KKworIyMgVXNpbmcgQ2hlY2sgUG9pbnRzICMjCisKK1NvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdG8gInJlc2V0IiBhIG1vY2sgb2JqZWN0IGF0IHZhcmlvdXMgY2hlY2sKK3BvaW50cyBpbiB5b3VyIHRlc3Q6IGF0IGVhY2ggY2hlY2sgcG9pbnQsIHlvdSB2ZXJpZnkgdGhhdCBhbGwgZXhpc3RpbmcKK2V4cGVjdGF0aW9ucyBvbiB0aGUgbW9jayBvYmplY3QgaGF2ZSBiZWVuIHNhdGlzZmllZCwgYW5kIHRoZW4geW91IHNldAorc29tZSBuZXcgZXhwZWN0YXRpb25zIG9uIGl0IGFzIGlmIGl0J3MgbmV3bHkgY3JlYXRlZC4gVGhpcyBhbGxvd3MgeW91Cit0byB3b3JrIHdpdGggYSBtb2NrIG9iamVjdCBpbiAicGhhc2VzIiB3aG9zZSBzaXplcyBhcmUgZWFjaAorbWFuYWdlYWJsZS4KKworT25lIHN1Y2ggc2NlbmFyaW8gaXMgdGhhdCBpbiB5b3VyIHRlc3QncyBgU2V0VXAoKWAgZnVuY3Rpb24sIHlvdSBtYXkKK3dhbnQgdG8gcHV0IHRoZSBvYmplY3QgeW91IGFyZSB0ZXN0aW5nIGludG8gYSBjZXJ0YWluIHN0YXRlLCB3aXRoIHRoZQoraGVscCBmcm9tIGEgbW9jayBvYmplY3QuIE9uY2UgaW4gdGhlIGRlc2lyZWQgc3RhdGUsIHlvdSB3YW50IHRvIGNsZWFyCithbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBtb2NrLCBzdWNoIHRoYXQgaW4gdGhlIGBURVNUX0ZgIGJvZHkgeW91IGNhbgorc2V0IGZyZXNoIGV4cGVjdGF0aW9ucyBvbiBpdC4KKworQXMgeW91IG1heSBoYXZlIGZpZ3VyZWQgb3V0LCB0aGUgYE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKClgCitmdW5jdGlvbiB3ZSBzYXcgaW4gdGhlIHByZXZpb3VzIHJlY2lwZSBjYW4gaGVscCB5b3UgaGVyZS4gT3IsIGlmIHlvdQorYXJlIHVzaW5nIGBPTl9DQUxMKClgIHRvIHNldCBkZWZhdWx0IGFjdGlvbnMgb24gdGhlIG1vY2sgb2JqZWN0IGFuZAord2FudCB0byBjbGVhciB0aGUgZGVmYXVsdCBhY3Rpb25zIGFzIHdlbGwsIHVzZQorYE1vY2s6OlZlcmlmeUFuZENsZWFyKCZtb2NrX29iamVjdClgIGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gZG9lcyB3aGF0CitgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfb2JqZWN0KWAgZG9lcyBhbmQgcmV0dXJucyB0aGUKK3NhbWUgYGJvb2xgLCAqKnBsdXMqKiBpdCBjbGVhcnMgdGhlIGBPTl9DQUxMKClgIHN0YXRlbWVudHMgb24KK2Btb2NrX29iamVjdGAgdG9vLgorCitBbm90aGVyIHRyaWNrIHlvdSBjYW4gdXNlIHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IGlzIHRvIHB1dCB0aGUKK2V4cGVjdGF0aW9ucyBpbiBzZXF1ZW5jZXMgYW5kIGluc2VydCBjYWxscyB0byBhIGR1bW15ICJjaGVjay1wb2ludCIKK2Z1bmN0aW9uIGF0IHNwZWNpZmljIHBsYWNlcy4gVGhlbiB5b3UgY2FuIHZlcmlmeSB0aGF0IHRoZSBtb2NrCitmdW5jdGlvbiBjYWxscyBkbyBoYXBwZW4gYXQgdGhlIHJpZ2h0IHRpbWUuIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlCitleGVyY2lzaW5nIGNvZGU6CisKK2BgYAorRm9vKDEpOworRm9vKDIpOworRm9vKDMpOworYGBgCisKK2FuZCB3YW50IHRvIHZlcmlmeSB0aGF0IGBGb28oMSlgIGFuZCBgRm9vKDMpYCBib3RoIGludm9rZQorYG1vY2suQmFyKCJhIilgLCBidXQgYEZvbygyKWAgZG9lc24ndCBpbnZva2UgYW55dGhpbmcuIFlvdSBjYW4gd3JpdGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNb2NrRnVuY3Rpb247CisKK1RFU1QoRm9vVGVzdCwgSW52b2tlc0JhckNvcnJlY3RseSkgeworICBNeU1vY2sgbW9jazsKKyAgLy8gQ2xhc3MgTW9ja0Z1bmN0aW9uPEY+IGhhcyBleGFjdGx5IG9uZSBtb2NrIG1ldGhvZC4gIEl0IGlzIG5hbWVkCisgIC8vIENhbGwoKSBhbmQgaGFzIHR5cGUgRi4KKyAgTW9ja0Z1bmN0aW9uPHZvaWQoc3RyaW5nIGNoZWNrX3BvaW50X25hbWUpPiBjaGVjazsKKyAgeworICAgIEluU2VxdWVuY2UgczsKKworICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsKKyAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMSIpKTsKKyAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMiIpKTsKKyAgICBFWFBFQ1RfQ0FMTChtb2NrLCBCYXIoImEiKSk7CisgIH0KKyAgRm9vKDEpOworICBjaGVjay5DYWxsKCIxIik7CisgIEZvbygyKTsKKyAgY2hlY2suQ2FsbCgiMiIpOworICBGb28oMyk7Cit9CitgYGAKKworVGhlIGV4cGVjdGF0aW9uIHNwZWMgc2F5cyB0aGF0IHRoZSBmaXJzdCBgQmFyKCJhIilgIG11c3QgaGFwcGVuIGJlZm9yZQorY2hlY2sgcG9pbnQgIjEiLCB0aGUgc2Vjb25kIGBCYXIoImEiKWAgbXVzdCBoYXBwZW4gYWZ0ZXIgY2hlY2sgcG9pbnQgIjIiLAorYW5kIG5vdGhpbmcgc2hvdWxkIGhhcHBlbiBiZXR3ZWVuIHRoZSB0d28gY2hlY2sgcG9pbnRzLiBUaGUgZXhwbGljaXQKK2NoZWNrIHBvaW50cyBtYWtlIGl0IGVhc3kgdG8gdGVsbCB3aGljaCBgQmFyKCJhIilgIGlzIGNhbGxlZCBieSB3aGljaAorY2FsbCB0byBgRm9vKClgLgorCisjIyBNb2NraW5nIERlc3RydWN0b3JzICMjCisKK1NvbWV0aW1lcyB5b3Ugd2FudCB0byBtYWtlIHN1cmUgYSBtb2NrIG9iamVjdCBpcyBkZXN0cnVjdGVkIGF0IHRoZQorcmlnaHQgdGltZSwgZS5nLiBhZnRlciBgYmFyLT5BKClgIGlzIGNhbGxlZCBidXQgYmVmb3JlIGBiYXItPkIoKWAgaXMKK2NhbGxlZC4gV2UgYWxyZWFkeSBrbm93IHRoYXQgeW91IGNhbiBzcGVjaWZ5IGNvbnN0cmFpbnRzIG9uIHRoZSBvcmRlcgorb2YgbW9jayBmdW5jdGlvbiBjYWxscywgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgdG8gbW9jayB0aGUgZGVzdHJ1Y3Rvcgorb2YgdGhlIG1vY2sgZnVuY3Rpb24uCisKK1RoaXMgc291bmRzIHNpbXBsZSwgZXhjZXB0IGZvciBvbmUgcHJvYmxlbTogYSBkZXN0cnVjdG9yIGlzIGEgc3BlY2lhbAorZnVuY3Rpb24gd2l0aCBzcGVjaWFsIHN5bnRheCBhbmQgc3BlY2lhbCBzZW1hbnRpY3MsIGFuZCB0aGUKK2BNT0NLX01FVEhPRDBgIG1hY3JvIGRvZXNuJ3Qgd29yayBmb3IgaXQ6CisKK2BgYAorICBNT0NLX01FVEhPRDAofk1vY2tGb28sIHZvaWQoKSk7ICAvLyBXb24ndCBjb21waWxlIQorYGBgCisKK1RoZSBnb29kIG5ld3MgaXMgdGhhdCB5b3UgY2FuIHVzZSBhIHNpbXBsZSBwYXR0ZXJuIHRvIGFjaGlldmUgdGhlIHNhbWUKK2VmZmVjdC4gRmlyc3QsIGFkZCBhIG1vY2sgZnVuY3Rpb24gYERpZSgpYCB0byB5b3VyIG1vY2sgY2xhc3MgYW5kIGNhbGwKK2l0IGluIHRoZSBkZXN0cnVjdG9yLCBsaWtlIHRoaXM6CisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgLy8gQWRkIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIHRvIHRoZSBtb2NrIGNsYXNzLgorICBNT0NLX01FVEhPRDAoRGllLCB2b2lkKCkpOworICB2aXJ0dWFsIH5Nb2NrRm9vKCkgeyBEaWUoKTsgfQorfTsKK2BgYAorCisoSWYgdGhlIG5hbWUgYERpZSgpYCBjbGFzaGVzIHdpdGggYW4gZXhpc3Rpbmcgc3ltYm9sLCBjaG9vc2UgYW5vdGhlcgorbmFtZS4pIE5vdywgd2UgaGF2ZSB0cmFuc2xhdGVkIHRoZSBwcm9ibGVtIG9mIHRlc3Rpbmcgd2hlbiBhIGBNb2NrRm9vYAorb2JqZWN0IGRpZXMgdG8gdGVzdGluZyB3aGVuIGl0cyBgRGllKClgIG1ldGhvZCBpcyBjYWxsZWQ6CisKK2BgYAorICBNb2NrRm9vKiBmb28gPSBuZXcgTW9ja0ZvbzsKKyAgTW9ja0JhciogYmFyID0gbmV3IE1vY2tCYXI7CisgIC4uLgorICB7CisgICAgSW5TZXF1ZW5jZSBzOworCisgICAgLy8gRXhwZWN0cyAqZm9vIHRvIGRpZSBhZnRlciBiYXItPkEoKSBhbmQgYmVmb3JlIGJhci0+QigpLgorICAgIEVYUEVDVF9DQUxMKCpiYXIsIEEoKSk7CisgICAgRVhQRUNUX0NBTEwoKmZvbywgRGllKCkpOworICAgIEVYUEVDVF9DQUxMKCpiYXIsIEIoKSk7CisgIH0KK2BgYAorCitBbmQgdGhhdCdzIHRoYXQuCisKKyMjIFVzaW5nIEdvb2dsZSBNb2NrIGFuZCBUaHJlYWRzICMjCisKKyoqSU1QT1JUQU5UIE5PVEU6KiogV2hhdCB3ZSBkZXNjcmliZSBpbiB0aGlzIHJlY2lwZSBpcyAqKk9OTFkqKiB0cnVlIG9uCitwbGF0Zm9ybXMgd2hlcmUgR29vZ2xlIE1vY2sgaXMgdGhyZWFkLXNhZmUuIEN1cnJlbnRseSB0aGVzZSBhcmUgb25seQorcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGUgcHRocmVhZHMgbGlicmFyeSAodGhpcyBpbmNsdWRlcyBMaW51eCBhbmQgTWFjKS4KK1RvIG1ha2UgaXQgdGhyZWFkLXNhZmUgb24gb3RoZXIgcGxhdGZvcm1zIHdlIG9ubHkgbmVlZCB0byBpbXBsZW1lbnQKK3NvbWUgc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnMgaW4gYCJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiYC4KKworSW4gYSAqKnVuaXQqKiB0ZXN0LCBpdCdzIGJlc3QgaWYgeW91IGNvdWxkIGlzb2xhdGUgYW5kIHRlc3QgYSBwaWVjZSBvZgorY29kZSBpbiBhIHNpbmdsZS10aHJlYWRlZCBjb250ZXh0LiBUaGF0IGF2b2lkcyByYWNlIGNvbmRpdGlvbnMgYW5kCitkZWFkIGxvY2tzLCBhbmQgbWFrZXMgZGVidWdnaW5nIHlvdXIgdGVzdCBtdWNoIGVhc2llci4KKworWWV0IG1hbnkgcHJvZ3JhbXMgYXJlIG11bHRpLXRocmVhZGVkLCBhbmQgc29tZXRpbWVzIHRvIHRlc3Qgc29tZXRoaW5nCit3ZSBuZWVkIHRvIHBvdW5kIG9uIGl0IGZyb20gbW9yZSB0aGFuIG9uZSB0aHJlYWQuIEdvb2dsZSBNb2NrIHdvcmtzCitmb3IgdGhpcyBwdXJwb3NlIHRvby4KKworUmVtZW1iZXIgdGhlIHN0ZXBzIGZvciB1c2luZyBhIG1vY2s6CisKKyAgMS4gQ3JlYXRlIGEgbW9jayBvYmplY3QgYGZvb2AuCisgIDEuIFNldCBpdHMgZGVmYXVsdCBhY3Rpb25zIGFuZCBleHBlY3RhdGlvbnMgdXNpbmcgYE9OX0NBTEwoKWAgYW5kIGBFWFBFQ1RfQ0FMTCgpYC4KKyAgMS4gVGhlIGNvZGUgdW5kZXIgdGVzdCBjYWxscyBtZXRob2RzIG9mIGBmb29gLgorICAxLiBPcHRpb25hbGx5LCB2ZXJpZnkgYW5kIHJlc2V0IHRoZSBtb2NrLgorICAxLiBEZXN0cm95IHRoZSBtb2NrIHlvdXJzZWxmLCBvciBsZXQgdGhlIGNvZGUgdW5kZXIgdGVzdCBkZXN0cm95IGl0LiBUaGUgZGVzdHJ1Y3RvciB3aWxsIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IGl0LgorCitJZiB5b3UgZm9sbG93IHRoZSBmb2xsb3dpbmcgc2ltcGxlIHJ1bGVzLCB5b3VyIG1vY2tzIGFuZCB0aHJlYWRzIGNhbgorbGl2ZSBoYXBwaWx5IHRvZ2V0aGVyOgorCisgICogRXhlY3V0ZSB5b3VyIF90ZXN0IGNvZGVfIChhcyBvcHBvc2VkIHRvIHRoZSBjb2RlIGJlaW5nIHRlc3RlZCkgaW4gX29uZV8gdGhyZWFkLiBUaGlzIG1ha2VzIHlvdXIgdGVzdCBlYXN5IHRvIGZvbGxvdy4KKyAgKiBPYnZpb3VzbHksIHlvdSBjYW4gZG8gc3RlcCAjMSB3aXRob3V0IGxvY2tpbmcuCisgICogV2hlbiBkb2luZyBzdGVwICMyIGFuZCAjNSwgbWFrZSBzdXJlIG5vIG90aGVyIHRocmVhZCBpcyBhY2Nlc3NpbmcgYGZvb2AuIE9idmlvdXMgdG9vLCBodWg/CisgICogIzMgYW5kICM0IGNhbiBiZSBkb25lIGVpdGhlciBpbiBvbmUgdGhyZWFkIG9yIGluIG11bHRpcGxlIHRocmVhZHMgLSBhbnl3YXkgeW91IHdhbnQuIEdvb2dsZSBNb2NrIHRha2VzIGNhcmUgb2YgdGhlIGxvY2tpbmcsIHNvIHlvdSBkb24ndCBoYXZlIHRvIGRvIGFueSAtIHVubGVzcyByZXF1aXJlZCBieSB5b3VyIHRlc3QgbG9naWMuCisKK0lmIHlvdSB2aW9sYXRlIHRoZSBydWxlcyAoZm9yIGV4YW1wbGUsIGlmIHlvdSBzZXQgZXhwZWN0YXRpb25zIG9uIGEKK21vY2sgd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgY2FsbGluZyBpdHMgbWV0aG9kcyksIHlvdSBnZXQgdW5kZWZpbmVkCitiZWhhdmlvci4gVGhhdCdzIG5vdCBmdW4sIHNvIGRvbid0IGRvIGl0LgorCitHb29nbGUgTW9jayBndWFyYW50ZWVzIHRoYXQgdGhlIGFjdGlvbiBmb3IgYSBtb2NrIGZ1bmN0aW9uIGlzIGRvbmUgaW4KK3RoZSBzYW1lIHRocmVhZCB0aGF0IGNhbGxlZCB0aGUgbW9jayBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIGluCisKK2BgYAorICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oMSkpCisgICAgICAuV2lsbE9uY2UoYWN0aW9uMSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbygyKSkKKyAgICAgIC5XaWxsT25jZShhY3Rpb24yKTsKK2BgYAorCitpZiBgRm9vKDEpYCBpcyBjYWxsZWQgaW4gdGhyZWFkIDEgYW5kIGBGb28oMilgIGlzIGNhbGxlZCBpbiB0aHJlYWQgMiwKK0dvb2dsZSBNb2NrIHdpbGwgZXhlY3V0ZSBgYWN0aW9uMWAgaW4gdGhyZWFkIDEgYW5kIGBhY3Rpb24yYCBpbiB0aHJlYWQKKzIuCisKK0dvb2dsZSBNb2NrIGRvZXMgX25vdF8gaW1wb3NlIGEgc2VxdWVuY2Ugb24gYWN0aW9ucyBwZXJmb3JtZWQgaW4KK2RpZmZlcmVudCB0aHJlYWRzIChkb2luZyBzbyBtYXkgY3JlYXRlIGRlYWRsb2NrcyBhcyB0aGUgYWN0aW9ucyBtYXkKK25lZWQgdG8gY29vcGVyYXRlKS4gVGhpcyBtZWFucyB0aGF0IHRoZSBleGVjdXRpb24gb2YgYGFjdGlvbjFgIGFuZAorYGFjdGlvbjJgIGluIHRoZSBhYm92ZSBleGFtcGxlIF9tYXlfIGludGVybGVhdmUuIElmIHRoaXMgaXMgYSBwcm9ibGVtLAoreW91IHNob3VsZCBhZGQgcHJvcGVyIHN5bmNocm9uaXphdGlvbiBsb2dpYyB0byBgYWN0aW9uMWAgYW5kIGBhY3Rpb24yYAordG8gbWFrZSB0aGUgdGVzdCB0aHJlYWQtc2FmZS4KKworCitBbHNvLCByZW1lbWJlciB0aGF0IGBEZWZhdWx0VmFsdWU8VD5gIGlzIGEgZ2xvYmFsIHJlc291cmNlIHRoYXQKK3BvdGVudGlhbGx5IGFmZmVjdHMgX2FsbF8gbGl2aW5nIG1vY2sgb2JqZWN0cyBpbiB5b3VyCitwcm9ncmFtLiBOYXR1cmFsbHksIHlvdSB3b24ndCB3YW50IHRvIG1lc3Mgd2l0aCBpdCBmcm9tIG11bHRpcGxlCit0aHJlYWRzIG9yIHdoZW4gdGhlcmUgc3RpbGwgYXJlIG1vY2tzIGluIGFjdGlvbi4KKworIyMgQ29udHJvbGxpbmcgSG93IE11Y2ggSW5mb3JtYXRpb24gR29vZ2xlIE1vY2sgUHJpbnRzICMjCisKK1doZW4gR29vZ2xlIE1vY2sgc2VlcyBzb21ldGhpbmcgdGhhdCBoYXMgdGhlIHBvdGVudGlhbCBvZiBiZWluZyBhbgorZXJyb3IgKGUuZy4gYSBtb2NrIGZ1bmN0aW9uIHdpdGggbm8gZXhwZWN0YXRpb24gaXMgY2FsbGVkLCBhLmsuYS4gYW4KK3VuaW50ZXJlc3RpbmcgY2FsbCwgd2hpY2ggaXMgYWxsb3dlZCBidXQgcGVyaGFwcyB5b3UgZm9yZ290IHRvCitleHBsaWNpdGx5IGJhbiB0aGUgY2FsbCksIGl0IHByaW50cyBzb21lIHdhcm5pbmcgbWVzc2FnZXMsIGluY2x1ZGluZwordGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24gYW5kIHRoZSByZXR1cm4gdmFsdWUuIEhvcGVmdWxseSB0aGlzCit3aWxsIHJlbWluZCB5b3UgdG8gdGFrZSBhIGxvb2sgYW5kIHNlZSBpZiB0aGVyZSBpcyBpbmRlZWQgYSBwcm9ibGVtLgorCitTb21ldGltZXMgeW91IGFyZSBjb25maWRlbnQgdGhhdCB5b3VyIHRlc3RzIGFyZSBjb3JyZWN0IGFuZCBtYXkgbm90CithcHByZWNpYXRlIHN1Y2ggZnJpZW5kbHkgbWVzc2FnZXMuIFNvbWUgb3RoZXIgdGltZXMsIHlvdSBhcmUgZGVidWdnaW5nCit5b3VyIHRlc3RzIG9yIGxlYXJuaW5nIGFib3V0IHRoZSBiZWhhdmlvciBvZiB0aGUgY29kZSB5b3UgYXJlIHRlc3RpbmcsCithbmQgd2lzaCB5b3UgY291bGQgb2JzZXJ2ZSBldmVyeSBtb2NrIGNhbGwgdGhhdCBoYXBwZW5zIChpbmNsdWRpbmcKK2FyZ3VtZW50IHZhbHVlcyBhbmQgdGhlIHJldHVybiB2YWx1ZSkuIENsZWFybHksIG9uZSBzaXplIGRvZXNuJ3QgZml0CithbGwuCisKK1lvdSBjYW4gY29udHJvbCBob3cgbXVjaCBHb29nbGUgTW9jayB0ZWxscyB5b3UgdXNpbmcgdGhlCitgLS1nbW9ja192ZXJib3NlPUxFVkVMYCBjb21tYW5kLWxpbmUgZmxhZywgd2hlcmUgYExFVkVMYCBpcyBhIHN0cmluZword2l0aCB0aHJlZSBwb3NzaWJsZSB2YWx1ZXM6CisKKyAgKiBgaW5mb2A6IEdvb2dsZSBNb2NrIHdpbGwgcHJpbnQgYWxsIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMsIHdhcm5pbmdzLCBhbmQgZXJyb3JzIChtb3N0IHZlcmJvc2UpLiBBdCB0aGlzIHNldHRpbmcsIEdvb2dsZSBNb2NrIHdpbGwgYWxzbyBsb2cgYW55IGNhbGxzIHRvIHRoZSBgT05fQ0FMTC9FWFBFQ1RfQ0FMTGAgbWFjcm9zLgorICAqIGB3YXJuaW5nYDogR29vZ2xlIE1vY2sgd2lsbCBwcmludCBib3RoIHdhcm5pbmdzIGFuZCBlcnJvcnMgKGxlc3MgdmVyYm9zZSkuIFRoaXMgaXMgdGhlIGRlZmF1bHQuCisgICogYGVycm9yYDogR29vZ2xlIE1vY2sgd2lsbCBwcmludCBlcnJvcnMgb25seSAobGVhc3QgdmVyYm9zZSkuCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gYWRqdXN0IHRoZSB2YWx1ZSBvZiB0aGF0IGZsYWcgZnJvbSB3aXRoaW4geW91cgordGVzdHMgbGlrZSBzbzoKKworYGBgCisgIDo6dGVzdGluZzo6RkxBR1NfZ21vY2tfdmVyYm9zZSA9ICJlcnJvciI7CitgYGAKKworTm93LCBqdWRpY2lvdXNseSB1c2UgdGhlIHJpZ2h0IGZsYWcgdG8gZW5hYmxlIEdvb2dsZSBNb2NrIHNlcnZlIHlvdSBiZXR0ZXIhCisKKyMjIEdhaW5pbmcgU3VwZXIgVmlzaW9uIGludG8gTW9jayBDYWxscyAjIworCitZb3UgaGF2ZSBhIHRlc3QgdXNpbmcgR29vZ2xlIE1vY2suIEl0IGZhaWxzOiBHb29nbGUgTW9jayB0ZWxscyB5b3UKK3RoYXQgc29tZSBleHBlY3RhdGlvbnMgYXJlbid0IHNhdGlzZmllZC4gSG93ZXZlciwgeW91IGFyZW4ndCBzdXJlIHdoeToKK0lzIHRoZXJlIGEgdHlwbyBzb21ld2hlcmUgaW4gdGhlIG1hdGNoZXJzPyBEaWQgeW91IG1lc3MgdXAgdGhlIG9yZGVyCitvZiB0aGUgYEVYUEVDVF9DQUxMYHM/IE9yIGlzIHRoZSBjb2RlIHVuZGVyIHRlc3QgZG9pbmcgc29tZXRoaW5nCit3cm9uZz8gIEhvdyBjYW4geW91IGZpbmQgb3V0IHRoZSBjYXVzZT8KKworV29uJ3QgaXQgYmUgbmljZSBpZiB5b3UgaGF2ZSBYLXJheSB2aXNpb24gYW5kIGNhbiBhY3R1YWxseSBzZWUgdGhlCit0cmFjZSBvZiBhbGwgYEVYUEVDVF9DQUxMYHMgYW5kIG1vY2sgbWV0aG9kIGNhbGxzIGFzIHRoZXkgYXJlIG1hZGU/CitGb3IgZWFjaCBjYWxsLCB3b3VsZCB5b3UgbGlrZSB0byBzZWUgaXRzIGFjdHVhbCBhcmd1bWVudCB2YWx1ZXMgYW5kCit3aGljaCBgRVhQRUNUX0NBTExgIEdvb2dsZSBNb2NrIHRoaW5rcyBpdCBtYXRjaGVzPworCitZb3UgY2FuIHVubG9jayB0aGlzIHBvd2VyIGJ5IHJ1bm5pbmcgeW91ciB0ZXN0IHdpdGggdGhlCitgLS1nbW9ja192ZXJib3NlPWluZm9gIGZsYWcuIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgdGVzdCBwcm9ncmFtOgorCitgYGAKK3VzaW5nIHRlc3Rpbmc6Ol87Cit1c2luZyB0ZXN0aW5nOjpIYXNTdWJzdHI7Cit1c2luZyB0ZXN0aW5nOjpSZXR1cm47CisKK2NsYXNzIE1vY2tGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKEYsIHZvaWQoY29uc3Qgc3RyaW5nJiB4LCBjb25zdCBzdHJpbmcmIHkpKTsKK307CisKK1RFU1QoRm9vLCBCYXIpIHsKKyAgTW9ja0ZvbyBtb2NrOworICBFWFBFQ1RfQ0FMTChtb2NrLCBGKF8sIF8pKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIEYoImEiLCAiYiIpKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgRigiYyIsIEhhc1N1YnN0cigiZCIpKSk7CisKKyAgbW9jay5GKCJhIiwgImdvb2QiKTsKKyAgbW9jay5GKCJhIiwgImIiKTsKK30KK2BgYAorCitpZiB5b3UgcnVuIGl0IHdpdGggYC0tZ21vY2tfdmVyYm9zZT1pbmZvYCwgeW91IHdpbGwgc2VlIHRoaXMgb3V0cHV0OgorCitgYGAKK1sgUlVOICAgICAgXSBGb28uQmFyCisKK2Zvb190ZXN0LmNjOjE0OiBFWFBFQ1RfQ0FMTChtb2NrLCBGKF8sIF8pKSBpbnZva2VkCitmb29fdGVzdC5jYzoxNTogRVhQRUNUX0NBTEwobW9jaywgRigiYSIsICJiIikpIGludm9rZWQKK2Zvb190ZXN0LmNjOjE2OiBFWFBFQ1RfQ0FMTChtb2NrLCBGKCJjIiwgSGFzU3Vic3RyKCJkIikpKSBpbnZva2VkCitmb29fdGVzdC5jYzoxNDogTW9jayBmdW5jdGlvbiBjYWxsIG1hdGNoZXMgRVhQRUNUX0NBTEwobW9jaywgRihfLCBfKSkuLi4KKyAgICBGdW5jdGlvbiBjYWxsOiBGKEAweDdmZmY3YzhkYWQ0MCJhIiwgQDB4N2ZmZjdjOGRhZDEwImdvb2QiKQorZm9vX3Rlc3QuY2M6MTU6IE1vY2sgZnVuY3Rpb24gY2FsbCBtYXRjaGVzIEVYUEVDVF9DQUxMKG1vY2ssIEYoImEiLCAiYiIpKS4uLgorICAgIEZ1bmN0aW9uIGNhbGw6IEYoQDB4N2ZmZjdjOGRhZGEwImEiLCBAMHg3ZmZmN2M4ZGFkNzAiYiIpCitmb29fdGVzdC5jYzoxNjogRmFpbHVyZQorQWN0dWFsIGZ1bmN0aW9uIGNhbGwgY291bnQgZG9lc24ndCBtYXRjaCBFWFBFQ1RfQ0FMTChtb2NrLCBGKCJjIiwgSGFzU3Vic3RyKCJkIikpKS4uLgorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEZvby5CYXIKK2BgYAorCitTdXBwb3NlIHRoZSBidWcgaXMgdGhhdCB0aGUgYCJjImAgaW4gdGhlIHRoaXJkIGBFWFBFQ1RfQ0FMTGAgaXMgYSB0eXBvCithbmQgc2hvdWxkIGFjdHVhbGx5IGJlIGAiYSJgLiBXaXRoIHRoZSBhYm92ZSBtZXNzYWdlLCB5b3Ugc2hvdWxkIHNlZQordGhhdCB0aGUgYWN0dWFsIGBGKCJhIiwgImdvb2QiKWAgY2FsbCBpcyBtYXRjaGVkIGJ5IHRoZSBmaXJzdAorYEVYUEVDVF9DQUxMYCwgbm90IHRoZSB0aGlyZCBhcyB5b3UgdGhvdWdodC4gRnJvbSB0aGF0IGl0IHNob3VsZCBiZQorb2J2aW91cyB0aGF0IHRoZSB0aGlyZCBgRVhQRUNUX0NBTExgIGlzIHdyaXR0ZW4gd3JvbmcuIENhc2Ugc29sdmVkLgorCisjIyBSdW5uaW5nIFRlc3RzIGluIEVtYWNzICMjCisKK0lmIHlvdSBidWlsZCBhbmQgcnVuIHlvdXIgdGVzdHMgaW4gRW1hY3MsIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbnMgb2YKK0dvb2dsZSBNb2NrIGFuZCBbR29vZ2xlIFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LykKK2Vycm9ycyB3aWxsIGJlIGhpZ2hsaWdodGVkLiBKdXN0IHByZXNzIGA8RW50ZXI+YCBvbiBvbmUgb2YgdGhlbSBhbmQKK3lvdSdsbCBiZSB0YWtlbiB0byB0aGUgb2ZmZW5kaW5nIGxpbmUuIE9yLCB5b3UgY2FuIGp1c3QgdHlwZSBgQy14IGBgCit0byBqdW1wIHRvIHRoZSBuZXh0IGVycm9yLgorCitUbyBtYWtlIGl0IGV2ZW4gZWFzaWVyLCB5b3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHlvdXIKK2B+Ly5lbWFjc2AgZmlsZToKKworYGBgCisoZ2xvYmFsLXNldC1rZXkgIlxNLW0iICAgJ2NvbXBpbGUpICA7IG0gaXMgZm9yIG1ha2UKKyhnbG9iYWwtc2V0LWtleSBbTS1kb3duXSAnbmV4dC1lcnJvcikKKyhnbG9iYWwtc2V0LWtleSBbTS11cF0gICAnKGxhbWJkYSAoKSAoaW50ZXJhY3RpdmUpIChuZXh0LWVycm9yIC0xKSkpCitgYGAKKworVGhlbiB5b3UgY2FuIHR5cGUgYE0tbWAgdG8gc3RhcnQgYSBidWlsZCwgb3IgYE0tdXBgL2BNLWRvd25gIHRvIG1vdmUKK2JhY2sgYW5kIGZvcnRoIGJldHdlZW4gZXJyb3JzLgorCisjIyBGdXNpbmcgR29vZ2xlIE1vY2sgU291cmNlIEZpbGVzICMjCisKK0dvb2dsZSBNb2NrJ3MgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgZG96ZW5zIG9mIGZpbGVzIChleGNsdWRpbmcKK2l0cyBvd24gdGVzdHMpLiAgU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0aGVtIHRvIGJlIHBhY2thZ2VkIHVwIGluCitmZXdlciBmaWxlcyBpbnN0ZWFkLCBzdWNoIHRoYXQgeW91IGNhbiBlYXNpbHkgY29weSB0aGVtIHRvIGEgbmV3CittYWNoaW5lIGFuZCBzdGFydCBoYWNraW5nIHRoZXJlLiAgRm9yIHRoaXMgd2UgcHJvdmlkZSBhbiBleHBlcmltZW50YWwKK1B5dGhvbiBzY3JpcHQgYGZ1c2VfZ21vY2tfZmlsZXMucHlgIGluIHRoZSBgc2NyaXB0cy9gIGRpcmVjdG9yeQorKHN0YXJ0aW5nIHdpdGggcmVsZWFzZSAxLjIuMCkuICBBc3N1bWluZyB5b3UgaGF2ZSBQeXRob24gMi40IG9yIGFib3ZlCitpbnN0YWxsZWQgb24geW91ciBtYWNoaW5lLCBqdXN0IGdvIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW4KK2BgYAorcHl0aG9uIGZ1c2VfZ21vY2tfZmlsZXMucHkgT1VUUFVUX0RJUgorYGBgCisKK2FuZCB5b3Ugc2hvdWxkIHNlZSBhbiBgT1VUUFVUX0RJUmAgZGlyZWN0b3J5IGJlaW5nIGNyZWF0ZWQgd2l0aCBmaWxlcworYGd0ZXN0L2d0ZXN0LmhgLCBgZ21vY2svZ21vY2suaGAsIGFuZCBgZ21vY2stZ3Rlc3QtYWxsLmNjYCBpbiBpdC4KK1RoZXNlIHRocmVlIGZpbGVzIGNvbnRhaW4gZXZlcnl0aGluZyB5b3UgbmVlZCB0byB1c2UgR29vZ2xlIE1vY2sgKGFuZAorR29vZ2xlIFRlc3QpLiAgSnVzdCBjb3B5IHRoZW0gdG8gYW55d2hlcmUgeW91IHdhbnQgYW5kIHlvdSBhcmUgcmVhZHkKK3RvIHdyaXRlIHRlc3RzIGFuZCB1c2UgbW9ja3MuICBZb3UgY2FuIHVzZSB0aGUKK1tzY3JwdHMvdGVzdC9NYWtlZmlsZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svc291cmNlL2Jyb3dzZS90cnVuay9zY3JpcHRzL3Rlc3QvTWFrZWZpbGUpIGZpbGUgYXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY29tcGlsZSB5b3VyIHRlc3RzCithZ2FpbnN0IHRoZW0uCisKKyMgRXh0ZW5kaW5nIEdvb2dsZSBNb2NrICMKKworIyMgV3JpdGluZyBOZXcgTWF0Y2hlcnMgUXVpY2tseSAjIworCitUaGUgYE1BVENIRVIqYCBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBjdXN0b20gbWF0Y2hlcnMKK2Vhc2lseS4gIFRoZSBzeW50YXg6CisKK2BgYAorTUFUQ0hFUihuYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmdfZXhwcmVzc2lvbikgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKword2lsbCBkZWZpbmUgYSBtYXRjaGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUKK3N0YXRlbWVudHMsIHdoaWNoIG11c3QgcmV0dXJuIGEgYGJvb2xgIHRvIGluZGljYXRlIGlmIHRoZSBtYXRjaAorc3VjY2VlZHMuICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIGJlaW5nCittYXRjaGVkIGJ5IGBhcmdgLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgYGFyZ190eXBlYC4KKworVGhlIGRlc2NyaXB0aW9uIHN0cmluZyBpcyBhIGBzdHJpbmdgLXR5cGVkIGV4cHJlc3Npb24gdGhhdCBkb2N1bWVudHMKK3doYXQgdGhlIG1hdGNoZXIgZG9lcywgYW5kIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGZhaWx1cmUgbWVzc2FnZQord2hlbiB0aGUgbWF0Y2ggZmFpbHMuICBJdCBjYW4gKGFuZCBzaG91bGQpIHJlZmVyZW5jZSB0aGUgc3BlY2lhbAorYGJvb2xgIHZhcmlhYmxlIGBuZWdhdGlvbmAsIGFuZCBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIGRlc2NyaXB0aW9uIG9mCit0aGUgbWF0Y2hlciB3aGVuIGBuZWdhdGlvbmAgaXMgYGZhbHNlYCwgb3IgdGhhdCBvZiB0aGUgbWF0Y2hlcidzCituZWdhdGlvbiB3aGVuIGBuZWdhdGlvbmAgaXMgYHRydWVgLgorCitGb3IgY29udmVuaWVuY2UsIHdlIGFsbG93IHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgdG8gYmUgZW1wdHkgKGAiImApLAoraW4gd2hpY2ggY2FzZSBHb29nbGUgTW9jayB3aWxsIHVzZSB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlCittYXRjaGVyIG5hbWUgYXMgdGhlIGRlc2NyaXB0aW9uLgorCitGb3IgZXhhbXBsZToKK2BgYAorTUFUQ0hFUihJc0RpdmlzaWJsZUJ5NywgIiIpIHsgcmV0dXJuIChhcmcgJSA3KSA9PSAwOyB9CitgYGAKK2FsbG93cyB5b3UgdG8gd3JpdGUKK2BgYAorICAvLyBFeHBlY3RzIG1vY2tfZm9vLkJhcihuKSB0byBiZSBjYWxsZWQgd2hlcmUgbiBpcyBkaXZpc2libGUgYnkgNy4KKyAgRVhQRUNUX0NBTEwobW9ja19mb28sIEJhcihJc0RpdmlzaWJsZUJ5NygpKSk7CitgYGAKK29yLAorYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok5vdDsKKy4uLgorICBFWFBFQ1RfVEhBVChzb21lX2V4cHJlc3Npb24sIElzRGl2aXNpYmxlQnk3KCkpOworICBFWFBFQ1RfVEhBVChzb21lX290aGVyX2V4cHJlc3Npb24sIE5vdChJc0RpdmlzaWJsZUJ5NygpKSk7CitgYGAKK0lmIHRoZSBhYm92ZSBhc3NlcnRpb25zIGZhaWwsIHRoZXkgd2lsbCBwcmludCBzb21ldGhpbmcgbGlrZToKK2BgYAorICBWYWx1ZSBvZjogc29tZV9leHByZXNzaW9uCisgIEV4cGVjdGVkOiBpcyBkaXZpc2libGUgYnkgNworICAgIEFjdHVhbDogMjcKKy4uLgorICBWYWx1ZSBvZjogc29tZV9vdGhlcl9leHByZXNzaW9uCisgIEV4cGVjdGVkOiBub3QgKGlzIGRpdmlzaWJsZSBieSA3KQorICAgIEFjdHVhbDogMjEKK2BgYAord2hlcmUgdGhlIGRlc2NyaXB0aW9ucyBgImlzIGRpdmlzaWJsZSBieSA3ImAgYW5kIGAibm90IChpcyBkaXZpc2libGUKK2J5IDcpImAgYXJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRoZSBtYXRjaGVyIG5hbWUKK2BJc0RpdmlzaWJsZUJ5N2AuCisKK0FzIHlvdSBtYXkgaGF2ZSBub3RpY2VkLCB0aGUgYXV0by1nZW5lcmF0ZWQgZGVzY3JpcHRpb25zIChlc3BlY2lhbGx5Cit0aG9zZSBmb3IgdGhlIG5lZ2F0aW9uKSBtYXkgbm90IGJlIHNvIGdyZWF0LiBZb3UgY2FuIGFsd2F5cyBvdmVycmlkZQordGhlbSB3aXRoIGEgc3RyaW5nIGV4cHJlc3Npb24gb2YgeW91ciBvd246CitgYGAKK01BVENIRVIoSXNEaXZpc2libGVCeTcsIHN0ZDo6c3RyaW5nKG5lZ2F0aW9uID8gImlzbid0IiA6ICJpcyIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZGl2aXNpYmxlIGJ5IDciKSB7CisgIHJldHVybiAoYXJnICUgNykgPT0gMDsKK30KK2BgYAorCitPcHRpb25hbGx5LCB5b3UgY2FuIHN0cmVhbSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGEgaGlkZGVuIGFyZ3VtZW50CituYW1lZCBgcmVzdWx0X2xpc3RlbmVyYCB0byBleHBsYWluIHRoZSBtYXRjaCByZXN1bHQuIEZvciBleGFtcGxlLCBhCitiZXR0ZXIgZGVmaW5pdGlvbiBvZiBgSXNEaXZpc2libGVCeTdgIGlzOgorYGBgCitNQVRDSEVSKElzRGl2aXNpYmxlQnk3LCAiIikgeworICBpZiAoKGFyZyAlIDcpID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgKnJlc3VsdF9saXN0ZW5lciA8PCAidGhlIHJlbWFpbmRlciBpcyAiIDw8IChhcmcgJSA3KTsKKyAgcmV0dXJuIGZhbHNlOworfQorYGBgCisKK1dpdGggdGhpcyBkZWZpbml0aW9uLCB0aGUgYWJvdmUgYXNzZXJ0aW9uIHdpbGwgZ2l2ZSBhIGJldHRlciBtZXNzYWdlOgorYGBgCisgIFZhbHVlIG9mOiBzb21lX2V4cHJlc3Npb24KKyAgRXhwZWN0ZWQ6IGlzIGRpdmlzaWJsZSBieSA3CisgICAgQWN0dWFsOiAyNyAodGhlIHJlbWFpbmRlciBpcyA2KQorYGBgCisKK1lvdSBzaG91bGQgbGV0IGBNYXRjaEFuZEV4cGxhaW4oKWAgcHJpbnQgX2FueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXwordGhhdCBjYW4gaGVscCBhIHVzZXIgdW5kZXJzdGFuZCB0aGUgbWF0Y2ggcmVzdWx0LiBOb3RlIHRoYXQgaXQgc2hvdWxkCitleHBsYWluIHdoeSB0aGUgbWF0Y2ggc3VjY2VlZHMgaW4gY2FzZSBvZiBhIHN1Y2Nlc3MgKHVubGVzcyBpdCdzCitvYnZpb3VzKSAtIHRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIG1hdGNoZXIgaXMgdXNlZCBpbnNpZGUKK2BOb3QoKWAuIFRoZXJlIGlzIG5vIG5lZWQgdG8gcHJpbnQgdGhlIGFyZ3VtZW50IHZhbHVlIGl0c2VsZiwgYXMKK0dvb2dsZSBNb2NrIGFscmVhZHkgcHJpbnRzIGl0IGZvciB5b3UuCisKKyoqTm90ZXM6KioKKworICAxLiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCAoYGFyZ190eXBlYCkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB5b3UgdXNlIHRoZSBtYXRjaGVyIGFuZCBpcyBzdXBwbGllZCB0byB5b3UgYnkgdGhlIGNvbXBpbGVyLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBkZWNsYXJpbmcgaXQgKG5vciBjYW4geW91KS4gIFRoaXMgYWxsb3dzIHRoZSBtYXRjaGVyIHRvIGJlIHBvbHltb3JwaGljLiAgRm9yIGV4YW1wbGUsIGBJc0RpdmlzaWJsZUJ5NygpYCBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbnkgdHlwZSB3aGVyZSB0aGUgdmFsdWUgb2YgYChhcmcgJSA3KSA9PSAwYCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBgYm9vbGAuICBJbiB0aGUgYEJhcihJc0RpdmlzaWJsZUJ5NygpKWAgZXhhbXBsZSBhYm92ZSwgaWYgbWV0aG9kIGBCYXIoKWAgdGFrZXMgYW4gYGludGAsIGBhcmdfdHlwZWAgd2lsbCBiZSBgaW50YDsgaWYgaXQgdGFrZXMgYW4gYHVuc2lnbmVkIGxvbmdgLCBgYXJnX3R5cGVgIHdpbGwgYmUgYHVuc2lnbmVkIGxvbmdgOyBhbmQgc28gb24uCisgIDEuIEdvb2dsZSBNb2NrIGRvZXNuJ3QgZ3VhcmFudGVlIHdoZW4gb3IgaG93IG1hbnkgdGltZXMgYSBtYXRjaGVyIHdpbGwgYmUgaW52b2tlZC4gVGhlcmVmb3JlIHRoZSBtYXRjaGVyIGxvZ2ljIG11c3QgYmUgX3B1cmVseSBmdW5jdGlvbmFsXyAoaS5lLiBpdCBjYW5ub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QsIGFuZCB0aGUgcmVzdWx0IG11c3Qgbm90IGRlcGVuZCBvbiBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZCB0aGUgbWF0Y2hlciBwYXJhbWV0ZXJzKS4gVGhpcyByZXF1aXJlbWVudCBtdXN0IGJlIHNhdGlzZmllZCBubyBtYXR0ZXIgaG93IHlvdSBkZWZpbmUgdGhlIG1hdGNoZXIgKGUuZy4gdXNpbmcgb25lIG9mIHRoZSBtZXRob2RzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHJlY2lwZXMpLiBJbiBwYXJ0aWN1bGFyLCBhIG1hdGNoZXIgY2FuIG5ldmVyIGNhbGwgYSBtb2NrIGZ1bmN0aW9uLCBhcyB0aGF0IHdpbGwgYWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGUgbW9jayBvYmplY3QgYW5kIEdvb2dsZSBNb2NrLgorCisjIyBXcml0aW5nIE5ldyBQYXJhbWV0ZXJpemVkIE1hdGNoZXJzIFF1aWNrbHkgIyMKKworU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIGRlZmluZSBhIG1hdGNoZXIgdGhhdCBoYXMgcGFyYW1ldGVycy4gIEZvciB0aGF0IHlvdQorY2FuIHVzZSB0aGUgbWFjcm86CitgYGAKK01BVENIRVJfUChuYW1lLCBwYXJhbV9uYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQorYGBgCit3aGVyZSB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGNhbiBiZSBlaXRoZXIgYCIiYCBvciBhIHN0cmluZyBleHByZXNzaW9uCit0aGF0IHJlZmVyZW5jZXMgYG5lZ2F0aW9uYCBhbmQgYHBhcmFtX25hbWVgLgorCitGb3IgZXhhbXBsZToKK2BgYAorTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlLCAiIikgeyByZXR1cm4gYWJzKGFyZykgPT0gdmFsdWU7IH0KK2BgYAord2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6CitgYGAKKyAgRVhQRUNUX1RIQVQoQmxhaCgiYSIpLCBIYXNBYnNvbHV0ZVZhbHVlKG4pKTsKK2BgYAord2hpY2ggbWF5IGxlYWQgdG8gdGhpcyBtZXNzYWdlIChhc3N1bWluZyBgbmAgaXMgMTApOgorYGBgCisgIFZhbHVlIG9mOiBCbGFoKCJhIikKKyAgRXhwZWN0ZWQ6IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxMAorICAgIEFjdHVhbDogLTkKK2BgYAorCitOb3RlIHRoYXQgYm90aCB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBhcmUKK3ByaW50ZWQsIG1ha2luZyB0aGUgbWVzc2FnZSBodW1hbi1mcmllbmRseS4KKworSW4gdGhlIG1hdGNoZXIgZGVmaW5pdGlvbiBib2R5LCB5b3UgY2FuIHdyaXRlIGBmb29fdHlwZWAgdG8KK3JlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZCBgZm9vYC4gIEZvciBleGFtcGxlLCBpbiB0aGUKK2JvZHkgb2YgYE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSlgIGFib3ZlLCB5b3UgY2FuIHdyaXRlCitgdmFsdWVfdHlwZWAgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgYHZhbHVlYC4KKworR29vZ2xlIE1vY2sgYWxzbyBwcm92aWRlcyBgTUFUQ0hFUl9QMmAsIGBNQVRDSEVSX1AzYCwgLi4uLCB1cCB0bworYE1BVENIRVJfUDEwYCB0byBzdXBwb3J0IG11bHRpLXBhcmFtZXRlciBtYXRjaGVyczoKK2BgYAorTUFUQ0hFUl9QayhuYW1lLCBwYXJhbV8xLCAuLi4sIHBhcmFtX2ssIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKworUGxlYXNlIG5vdGUgdGhhdCB0aGUgY3VzdG9tIGRlc2NyaXB0aW9uIHN0cmluZyBpcyBmb3IgYSBwYXJ0aWN1bGFyCisqKmluc3RhbmNlKiogb2YgdGhlIG1hdGNoZXIsIHdoZXJlIHRoZSBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBib3VuZCB0bworYWN0dWFsIHZhbHVlcy4gIFRoZXJlZm9yZSB1c3VhbGx5IHlvdSdsbCB3YW50IHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHRvCitiZSBwYXJ0IG9mIHRoZSBkZXNjcmlwdGlvbi4gIEdvb2dsZSBNb2NrIGxldHMgeW91IGRvIHRoYXQgYnkKK3JlZmVyZW5jaW5nIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMgaW4gdGhlIGRlc2NyaXB0aW9uIHN0cmluZworZXhwcmVzc2lvbi4KKworRm9yIGV4YW1wbGUsCitgYGAKKyAgdXNpbmcgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nOworICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksCisgICAgICAgICAgICAgc3RkOjpzdHJpbmcobmVnYXRpb24gPyAiaXNuJ3QiIDogImlzIikgKyAiIGluIHJhbmdlIFsiICsKKyAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGxvdykgKyAiLCAiICsgUHJpbnRUb1N0cmluZyhoaSkgKyAiXSIpIHsKKyAgICByZXR1cm4gbG93IDw9IGFyZyAmJiBhcmcgPD0gaGk7CisgIH0KKyAgLi4uCisgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOworYGBgCit3b3VsZCBnZW5lcmF0ZSBhIGZhaWx1cmUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZToKK2BgYAorICBFeHBlY3RlZDogaXMgaW4gcmFuZ2UgWzQsIDZdCitgYGAKKworSWYgeW91IHNwZWNpZnkgYCIiYCBhcyB0aGUgZGVzY3JpcHRpb24sIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugd2lsbAorY29udGFpbiB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBmb2xsb3dlZCBieSB0aGUKK3BhcmFtZXRlciB2YWx1ZXMgcHJpbnRlZCBhcyBhIHR1cGxlLiAgRm9yIGV4YW1wbGUsCitgYGAKKyAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLCAiIikgeyAuLi4gfQorICAuLi4KKyAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7CitgYGAKK3dvdWxkIGdlbmVyYXRlIGEgZmFpbHVyZSB0aGF0IGNvbnRhaW5zIHRoZSB0ZXh0OgorYGBgCisgIEV4cGVjdGVkOiBpbiBjbG9zZWQgcmFuZ2UgKDQsIDYpCitgYGAKKworRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3CitgYGAKK01BVENIRVJfUGsoRm9vLCBwMSwgLi4uLCBwaywgZGVzY3JpcHRpb25fc3RyaW5nKSB7IC4uLiB9CitgYGAKK2FzIHNob3J0aGFuZCBmb3IKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIHAxX3R5cGUsIC4uLiwgdHlwZW5hbWUgcGtfdHlwZT4KK0Zvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+CitGb28ocDFfdHlwZSBwMSwgLi4uLCBwa190eXBlIHBrKSB7IC4uLiB9CitgYGAKKworV2hlbiB5b3Ugd3JpdGUgYEZvbyh2MSwgLi4uLCB2aylgLCB0aGUgY29tcGlsZXIgaW5mZXJzIHRoZSB0eXBlcyBvZgordGhlIHBhcmFtZXRlcnMgYHYxYCwgLi4uLCBhbmQgYHZrYCBmb3IgeW91LiAgSWYgeW91IGFyZSBub3QgaGFwcHkgd2l0aAordGhlIHJlc3VsdCBvZiB0aGUgdHlwZSBpbmZlcmVuY2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgdHlwZXMgYnkKK2V4cGxpY2l0bHkgaW5zdGFudGlhdGluZyB0aGUgdGVtcGxhdGUsIGFzIGluIGBGb288bG9uZywgYm9vbD4oNSwgZmFsc2UpYC4KK0FzIHNhaWQgZWFybGllciwgeW91IGRvbid0IGdldCB0byAob3IgbmVlZCB0bykgc3BlY2lmeQorYGFyZ190eXBlYCBhcyB0aGF0J3MgZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgbWF0Y2hlcgoraXMgdXNlZC4KKworWW91IGNhbiBhc3NpZ24gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uIGBGb28ocDEsIC4uLiwgcGspYCB0byBhCit2YXJpYWJsZSBvZiB0eXBlIGBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPmAuICBUaGlzIGNhbiBiZQordXNlZnVsIHdoZW4gY29tcG9zaW5nIG1hdGNoZXJzLiAgTWF0Y2hlcnMgdGhhdCBkb24ndCBoYXZlIGEgcGFyYW1ldGVyCitvciBoYXZlIG9ubHkgb25lIHBhcmFtZXRlciBoYXZlIHNwZWNpYWwgdHlwZXM6IHlvdSBjYW4gYXNzaWduIGBGb28oKWAKK3RvIGEgYEZvb01hdGNoZXJgLXR5cGVkIHZhcmlhYmxlLCBhbmQgYXNzaWduIGBGb28ocClgIHRvIGEKK2BGb29NYXRjaGVyUDxwX3R5cGU+YC10eXBlZCB2YXJpYWJsZS4KKworV2hpbGUgeW91IGNhbiBpbnN0YW50aWF0ZSBhIG1hdGNoZXIgdGVtcGxhdGUgd2l0aCByZWZlcmVuY2UgdHlwZXMsCitwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGJ5IHBvaW50ZXIgdXN1YWxseSBtYWtlcyB5b3VyIGNvZGUgbW9yZQorcmVhZGFibGUuICBJZiwgaG93ZXZlciwgeW91IHN0aWxsIHdhbnQgdG8gcGFzcyBhIHBhcmFtZXRlciBieQorcmVmZXJlbmNlLCBiZSBhd2FyZSB0aGF0IGluIHRoZSBmYWlsdXJlIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZQorbWF0Y2hlciB5b3Ugd2lsbCBzZWUgdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdCBidXQgbm90IGl0cworYWRkcmVzcy4KKworWW91IGNhbiBvdmVybG9hZCBtYXRjaGVycyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6CitgYGAKK01BVENIRVJfUChCbGFoLCBhLCBkZXNjcmlwdGlvbl9zdHJpbmdfMSkgeyAuLi4gfQorTUFUQ0hFUl9QMihCbGFoLCBhLCBiLCBkZXNjcmlwdGlvbl9zdHJpbmdfMikgeyAuLi4gfQorYGBgCisKK1doaWxlIGl0J3MgdGVtcHRpbmcgdG8gYWx3YXlzIHVzZSB0aGUgYE1BVENIRVIqYCBtYWNyb3Mgd2hlbiBkZWZpbmluZworYSBuZXcgbWF0Y2hlciwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZworYE1hdGNoZXJJbnRlcmZhY2VgIG9yIHVzaW5nIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgIGluc3RlYWQgKHNlZQordGhlIHJlY2lwZXMgdGhhdCBmb2xsb3cpLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvIHVzZSB0aGUgbWF0Y2hlciBhCitsb3QuICBXaGlsZSB0aGVzZSBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrLCB0aGV5IGdpdmUgeW91IG1vcmUKK2NvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZCB0aGUgbWF0Y2hlcgorcGFyYW1ldGVycywgd2hpY2ggaW4gZ2VuZXJhbCBsZWFkcyB0byBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMKK3RoYXQgcGF5IG9mZiBpbiB0aGUgbG9uZyBydW4uICBUaGV5IGFsc28gYWxsb3cgb3ZlcmxvYWRpbmcgbWF0Y2hlcnMKK2Jhc2VkIG9uIHBhcmFtZXRlciB0eXBlcyAoYXMgb3Bwb3NlZCB0byBqdXN0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YKK3BhcmFtZXRlcnMpLgorCisjIyBXcml0aW5nIE5ldyBNb25vbW9ycGhpYyBNYXRjaGVycyAjIworCitBIG1hdGNoZXIgb2YgYXJndW1lbnQgdHlwZSBgVGAgaW1wbGVtZW50cworYDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxUPmAgYW5kIGRvZXMgdHdvIHRoaW5nczogaXQgdGVzdHMgd2hldGhlciBhCit2YWx1ZSBvZiB0eXBlIGBUYCBtYXRjaGVzIHRoZSBtYXRjaGVyLCBhbmQgY2FuIGRlc2NyaWJlIHdoYXQga2luZCBvZgordmFsdWVzIGl0IG1hdGNoZXMuIFRoZSBsYXR0ZXIgYWJpbGl0eSBpcyB1c2VkIGZvciBnZW5lcmF0aW5nIHJlYWRhYmxlCitlcnJvciBtZXNzYWdlcyB3aGVuIGV4cGVjdGF0aW9ucyBhcmUgdmlvbGF0ZWQuCisKK1RoZSBpbnRlcmZhY2UgbG9va3MgbGlrZSB0aGlzOgorCitgYGAKK2NsYXNzIE1hdGNoUmVzdWx0TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIC8vIFN0cmVhbXMgeCB0byB0aGUgdW5kZXJseWluZyBvc3RyZWFtOyBkb2VzIG5vdGhpbmcgaWYgdGhlIG9zdHJlYW0KKyAgLy8gaXMgTlVMTC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIE1hdGNoUmVzdWx0TGlzdGVuZXImIG9wZXJhdG9yPDwoY29uc3QgVCYgeCk7CisKKyAgLy8gUmV0dXJucyB0aGUgdW5kZXJseWluZyBvc3RyZWFtLgorICA6OnN0ZDo6b3N0cmVhbSogc3RyZWFtKCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIE1hdGNoZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+TWF0Y2hlckludGVyZmFjZSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG1hdGNoZXIgbWF0Y2hlcyB4OyBhbHNvIGV4cGxhaW5zIHRoZSBtYXRjaAorICAvLyByZXN1bHQgdG8gJ2xpc3RlbmVyJy4KKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCA9IDA7CisKKyAgLy8gRGVzY3JpYmVzIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKKworICAvLyBEZXNjcmliZXMgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Cit9OworYGBgCisKK0lmIHlvdSBuZWVkIGEgY3VzdG9tIG1hdGNoZXIgYnV0IGBUcnVseSgpYCBpcyBub3QgYSBnb29kIG9wdGlvbiAoZm9yCitleGFtcGxlLCB5b3UgbWF5IG5vdCBiZSBoYXBweSB3aXRoIHRoZSB3YXkgYFRydWx5KHByZWRpY2F0ZSlgCitkZXNjcmliZXMgaXRzZWxmLCBvciB5b3UgbWF5IHdhbnQgeW91ciBtYXRjaGVyIHRvIGJlIHBvbHltb3JwaGljIGFzCitgRXEodmFsdWUpYCBpcyksIHlvdSBjYW4gZGVmaW5lIGEgbWF0Y2hlciB0byBkbyB3aGF0ZXZlciB5b3Ugd2FudCBpbgordHdvIHN0ZXBzOiBmaXJzdCBpbXBsZW1lbnQgdGhlIG1hdGNoZXIgaW50ZXJmYWNlLCBhbmQgdGhlbiBkZWZpbmUgYQorZmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBtYXRjaGVyIGluc3RhbmNlLiBUaGUgc2Vjb25kIHN0ZXAgaXMgbm90CitzdHJpY3RseSBuZWVkZWQgYnV0IGl0IG1ha2VzIHRoZSBzeW50YXggb2YgdXNpbmcgdGhlIG1hdGNoZXIgbmljZXIuCisKK0ZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBhIG1hdGNoZXIgdG8gdGVzdCB3aGV0aGVyIGFuIGBpbnRgIGlzCitkaXZpc2libGUgYnkgNyBhbmQgdGhlbiB1c2UgaXQgbGlrZSB0aGlzOgorYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VNYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworCitjbGFzcyBEaXZpc2libGVCeTdNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCBuLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIHJldHVybiAobiAlIDcpID09IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImlzIGRpdmlzaWJsZSBieSA3IjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBub3QgZGl2aXNpYmxlIGJ5IDciOworICB9Cit9OworCitpbmxpbmUgTWF0Y2hlcjxpbnQ+IERpdmlzaWJsZUJ5NygpIHsKKyAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBEaXZpc2libGVCeTdNYXRjaGVyKTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKERpdmlzaWJsZUJ5NygpKSk7CitgYGAKKworWW91IG1heSBpbXByb3ZlIHRoZSBtYXRjaGVyIG1lc3NhZ2UgYnkgc3RyZWFtaW5nIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIHRvIHRoZSBgbGlzdGVuZXJgIGFyZ3VtZW50IGluIGBNYXRjaEFuZEV4cGxhaW4oKWA6CisKK2BgYAorY2xhc3MgRGl2aXNpYmxlQnk3TWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPGludD4geworIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGNvbnN0IGludCByZW1haW5kZXIgPSBuICUgNzsKKyAgICBpZiAocmVtYWluZGVyICE9IDApIHsKKyAgICAgICpsaXN0ZW5lciA8PCAidGhlIHJlbWFpbmRlciBpcyAiIDw8IHJlbWFpbmRlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlbWFpbmRlciA9PSAwOworICB9CisgIC4uLgorfTsKK2BgYAorCitUaGVuLCBgRVhQRUNUX1RIQVQoeCwgRGl2aXNpYmxlQnk3KCkpO2AgbWF5IGdlbmVyYWwgYSBtZXNzYWdlIGxpa2UgdGhpczoKK2BgYAorVmFsdWUgb2Y6IHgKK0V4cGVjdGVkOiBpcyBkaXZpc2libGUgYnkgNworICBBY3R1YWw6IDIzICh0aGUgcmVtYWluZGVyIGlzIDIpCitgYGAKKworIyMgV3JpdGluZyBOZXcgUG9seW1vcnBoaWMgTWF0Y2hlcnMgIyMKKworWW91J3ZlIGxlYXJuZWQgaG93IHRvIHdyaXRlIHlvdXIgb3duIG1hdGNoZXJzIGluIHRoZSBwcmV2aW91cworcmVjaXBlLiBKdXN0IG9uZSBwcm9ibGVtOiBhIG1hdGNoZXIgY3JlYXRlZCB1c2luZyBgTWFrZU1hdGNoZXIoKWAgb25seQord29ya3MgZm9yIG9uZSBwYXJ0aWN1bGFyIHR5cGUgb2YgYXJndW1lbnRzLiBJZiB5b3Ugd2FudCBhCitfcG9seW1vcnBoaWNfIG1hdGNoZXIgdGhhdCB3b3JrcyB3aXRoIGFyZ3VtZW50cyBvZiBzZXZlcmFsIHR5cGVzIChmb3IKK2luc3RhbmNlLCBgRXEoeClgIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGEgYHZhbHVlYCBhcyBsb25nIGFzIGB2YWx1ZWAgPT0KK2B4YCBjb21waWxlcyAtLSBgdmFsdWVgIGFuZCBgeGAgZG9uJ3QgaGF2ZSB0byBzaGFyZSB0aGUgc2FtZSB0eXBlKSwKK3lvdSBjYW4gbGVhcm4gdGhlIHRyaWNrIGZyb20gYCJnbW9jay9nbW9jay1tYXRjaGVycy5oImAgYnV0IGl0J3MgYSBiaXQKK2ludm9sdmVkLgorCitGb3J0dW5hdGVseSwgbW9zdCBvZiB0aGUgdGltZSB5b3UgY2FuIGRlZmluZSBhIHBvbHltb3JwaGljIG1hdGNoZXIKK2Vhc2lseSB3aXRoIHRoZSBoZWxwIG9mIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgLiBIZXJlJ3MgaG93IHlvdSBjYW4KK2RlZmluZSBgTm90TnVsbCgpYCBhcyBhbiBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKK3VzaW5nIDo6dGVzdGluZzo6UG9seW1vcnBoaWNNYXRjaGVyOworCitjbGFzcyBOb3ROdWxsTWF0Y2hlciB7CisgcHVibGljOgorICAvLyBUbyBpbXBsZW1lbnQgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLCBmaXJzdCBkZWZpbmUgYSBDT1BZQUJMRSBjbGFzcworICAvLyB0aGF0IGhhcyB0aHJlZSBtZW1iZXJzIE1hdGNoQW5kRXhwbGFpbigpLCBEZXNjcmliZVRvKCksIGFuZAorICAvLyBEZXNjcmliZU5lZ2F0aW9uVG8oKSwgbGlrZSB0aGUgZm9sbG93aW5nLgorCisgIC8vIEluIHRoaXMgZXhhbXBsZSwgd2Ugd2FudCB0byB1c2UgTm90TnVsbCgpIHdpdGggYW55IHBvaW50ZXIsIHNvCisgIC8vIE1hdGNoQW5kRXhwbGFpbigpIGFjY2VwdHMgYSBwb2ludGVyIG9mIGFueSB0eXBlIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4KKyAgLy8gSW4gZ2VuZXJhbCwgeW91IGNhbiBkZWZpbmUgTWF0Y2hBbmRFeHBsYWluKCkgYXMgYW4gb3JkaW5hcnkgbWV0aG9kIG9yCisgIC8vIGEgbWV0aG9kIHRlbXBsYXRlLCBvciBldmVuIG92ZXJsb2FkIGl0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gcCAhPSBOVUxMOworICB9CisKKyAgLy8gRGVzY3JpYmVzIHRoZSBwcm9wZXJ0eSBvZiBhIHZhbHVlIG1hdGNoaW5nIHRoaXMgbWF0Y2hlci4KKyAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImlzIG5vdCBOVUxMIjsgfQorCisgIC8vIERlc2NyaWJlcyB0aGUgcHJvcGVydHkgb2YgYSB2YWx1ZSBOT1QgbWF0Y2hpbmcgdGhpcyBtYXRjaGVyLgorICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpcyBOVUxMIjsgfQorfTsKKworLy8gVG8gY29uc3RydWN0IGEgcG9seW1vcnBoaWMgbWF0Y2hlciwgcGFzcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MKKy8vIHRvIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKS4gIE5vdGUgdGhlIHJldHVybiB0eXBlLgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxOb3ROdWxsTWF0Y2hlcj4gTm90TnVsbCgpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTm90TnVsbE1hdGNoZXIoKSk7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJhcihOb3ROdWxsKCkpKTsgIC8vIFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLU5VTEwgcG9pbnRlci4KK2BgYAorCisqKk5vdGU6KiogWW91ciBwb2x5bW9ycGhpYyBtYXRjaGVyIGNsYXNzIGRvZXMgKipub3QqKiBuZWVkIHRvIGluaGVyaXQgZnJvbQorYE1hdGNoZXJJbnRlcmZhY2VgIG9yIGFueSBvdGhlciBjbGFzcywgYW5kIGl0cyBtZXRob2RzIGRvICoqbm90KiogbmVlZAordG8gYmUgdmlydHVhbC4KKworTGlrZSBpbiBhIG1vbm9tb3JwaGljIG1hdGNoZXIsIHlvdSBtYXkgZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0IGJ5CitzdHJlYW1pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgYGxpc3RlbmVyYCBhcmd1bWVudCBpbgorYE1hdGNoQW5kRXhwbGFpbigpYC4KKworIyMgV3JpdGluZyBOZXcgQ2FyZGluYWxpdGllcyAjIworCitBIGNhcmRpbmFsaXR5IGlzIHVzZWQgaW4gYFRpbWVzKClgIHRvIHRlbGwgR29vZ2xlIE1vY2sgaG93IG1hbnkgdGltZXMKK3lvdSBleHBlY3QgYSBjYWxsIHRvIG9jY3VyLiBJdCBkb2Vzbid0IGhhdmUgdG8gYmUgZXhhY3QuIEZvciBleGFtcGxlLAoreW91IGNhbiBzYXkgYEF0TGVhc3QoNSlgIG9yIGBCZXR3ZWVuKDIsIDQpYC4KKworSWYgdGhlIGJ1aWx0LWluIHNldCBvZiBjYXJkaW5hbGl0aWVzIGRvZXNuJ3Qgc3VpdCB5b3UsIHlvdSBhcmUgZnJlZSB0bworZGVmaW5lIHlvdXIgb3duIGJ5IGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIGludGVyZmFjZSAoaW4gbmFtZXNwYWNlCitgdGVzdGluZ2ApOgorCitgYGAKK2NsYXNzIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNhcmRpbmFsaXR5SW50ZXJmYWNlKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0aXNmeSB0aGlzIGNhcmRpbmFsaXR5LgorICB2aXJ0dWFsIGJvb2wgSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCA9IDA7CisKKyAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbS4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7Cit9OworYGBgCisKK0ZvciBleGFtcGxlLCB0byBzcGVjaWZ5IHRoYXQgYSBjYWxsIG11c3Qgb2NjdXIgZXZlbiBudW1iZXIgb2YgdGltZXMsCit5b3UgY2FuIHdyaXRlCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpDYXJkaW5hbGl0eTsKK3VzaW5nIDo6dGVzdGluZzo6Q2FyZGluYWxpdHlJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VDYXJkaW5hbGl0eTsKKworY2xhc3MgRXZlbk51bWJlckNhcmRpbmFsaXR5IDogcHVibGljIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIChjYWxsX2NvdW50ICUgMikgPT0gMDsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiOworICB9Cit9OworCitDYXJkaW5hbGl0eSBFdmVuTnVtYmVyKCkgeworICByZXR1cm4gTWFrZUNhcmRpbmFsaXR5KG5ldyBFdmVuTnVtYmVyQ2FyZGluYWxpdHkpOworfQorLi4uCisKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMykpCisgICAgICAuVGltZXMoRXZlbk51bWJlcigpKTsKK2BgYAorCisjIyBXcml0aW5nIE5ldyBBY3Rpb25zIFF1aWNrbHkgIyMKKworSWYgdGhlIGJ1aWx0LWluIGFjdGlvbnMgZG9uJ3Qgd29yayBmb3IgeW91LCBhbmQgeW91IGZpbmQgaXQKK2luY29udmVuaWVudCB0byB1c2UgYEludm9rZSgpYCwgeW91IGNhbiB1c2UgYSBtYWNybyBmcm9tIHRoZSBgQUNUSU9OKmAKK2ZhbWlseSB0byBxdWlja2x5IGRlZmluZSBhIG5ldyBhY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB5b3VyIGNvZGUgYXMKK2lmIGl0J3MgYSBidWlsdC1pbiBhY3Rpb24uCisKK0J5IHdyaXRpbmcKK2BgYAorQUNUSU9OKG5hbWUpIHsgc3RhdGVtZW50czsgfQorYGBgCitpbiBhIG5hbWVzcGFjZSBzY29wZSAoaS5lLiBub3QgaW5zaWRlIGEgY2xhc3Mgb3IgZnVuY3Rpb24pLCB5b3Ugd2lsbAorZGVmaW5lIGFuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhlY3V0ZXMgdGhlIHN0YXRlbWVudHMuCitUaGUgdmFsdWUgcmV0dXJuZWQgYnkgYHN0YXRlbWVudHNgIHdpbGwgYmUgdXNlZCBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mCit0aGUgYWN0aW9uLiAgSW5zaWRlIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuIHJlZmVyIHRvIHRoZSBLLXRoCisoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXMgYGFyZ0tgLiAgRm9yIGV4YW1wbGU6CitgYGAKK0FDVElPTihJbmNyZW1lbnRBcmcxKSB7IHJldHVybiArKygqYXJnMSk7IH0KK2BgYAorYWxsb3dzIHlvdSB0byB3cml0ZQorYGBgCisuLi4gV2lsbE9uY2UoSW5jcmVtZW50QXJnMSgpKTsKK2BgYAorCitOb3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KK2FyZ3VtZW50cy4gIFJlc3QgYXNzdXJlZCB0aGF0IHlvdXIgY29kZSBpcyB0eXBlLXNhZmUgdGhvdWdoOgoreW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmIGAqYXJnMWAgZG9lc24ndCBzdXBwb3J0IHRoZSBgKytgCitvcGVyYXRvciwgb3IgaWYgdGhlIHR5cGUgb2YgYCsrKCphcmcxKWAgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZSBtb2NrCitmdW5jdGlvbidzIHJldHVybiB0eXBlLgorCitBbm90aGVyIGV4YW1wbGU6CitgYGAKK0FDVElPTihGb28pIHsKKyAgKCphcmcyKSg1KTsKKyAgQmxhaCgpOworICAqYXJnMSA9IDA7CisgIHJldHVybiBhcmcwOworfQorYGBgCitkZWZpbmVzIGFuIGFjdGlvbiBgRm9vKClgIHRoYXQgaW52b2tlcyBhcmd1bWVudCAjMiAoYSBmdW5jdGlvbiBwb2ludGVyKQord2l0aCA1LCBjYWxscyBmdW5jdGlvbiBgQmxhaCgpYCwgc2V0cyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBhcmd1bWVudAorIzEgdG8gMCwgYW5kIHJldHVybnMgYXJndW1lbnQgIzAuCisKK0ZvciBtb3JlIGNvbnZlbmllbmNlIGFuZCBmbGV4aWJpbGl0eSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgZm9sbG93aW5nCitwcmUtZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBib2R5IG9mIGBBQ1RJT05gOgorCit8IGBhcmdLX3R5cGVgIHwgVGhlIHR5cGUgb2YgdGhlIEstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHwKK3w6LS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgYXJnc2AgICAgICB8IEFsbCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXMgYSB0dXBsZSAgICAgICAgICAgICAgICB8Cit8IGBhcmdzX3R5cGVgIHwgVGhlIHR5cGUgb2YgYWxsIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcyBhIHR1cGxlICAgIHwKK3wgYHJldHVybl90eXBlYCB8IFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbW9jayBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBmdW5jdGlvbl90eXBlYCB8IFRoZSB0eXBlIG9mIHRoZSBtb2NrIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKK0ZvciBleGFtcGxlLCB3aGVuIHVzaW5nIGFuIGBBQ1RJT05gIGFzIGEgc3R1YiBhY3Rpb24gZm9yIG1vY2sgZnVuY3Rpb246CitgYGAKK2ludCBEb1NvbWV0aGluZyhib29sIGZsYWcsIGludCogcHRyKTsKK2BgYAord2UgaGF2ZToKK3wgKipQcmUtZGVmaW5lZCBTeW1ib2wqKiB8ICoqSXMgQm91bmQgVG8qKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tfAorfCBgYXJnMGAgICAgICAgICAgICAgICAgIHwgdGhlIHZhbHVlIG9mIGBmbGFnYCB8Cit8IGBhcmcwX3R5cGVgICAgICAgICAgICAgfCB0aGUgdHlwZSBgYm9vbGAgfAorfCBgYXJnMWAgICAgICAgICAgICAgICAgIHwgdGhlIHZhbHVlIG9mIGBwdHJgIHwKK3wgYGFyZzFfdHlwZWAgICAgICAgICAgICB8IHRoZSB0eXBlIGBpbnQqYCB8Cit8IGBhcmdzYCAgICAgICAgICAgICAgICAgfCB0aGUgdHVwbGUgYChmbGFnLCBwdHIpYCB8Cit8IGBhcmdzX3R5cGVgICAgICAgICAgICAgfCB0aGUgdHlwZSBgOjp0ZXN0aW5nOjp0dXBsZTxib29sLCBpbnQqPmAgfAorfCBgcmV0dXJuX3R5cGVgICAgICAgICAgIHwgdGhlIHR5cGUgYGludGAgIHwKK3wgYGZ1bmN0aW9uX3R5cGVgICAgICAgICB8IHRoZSB0eXBlIGBpbnQoYm9vbCwgaW50KilgIHwKKworIyMgV3JpdGluZyBOZXcgUGFyYW1ldGVyaXplZCBBY3Rpb25zIFF1aWNrbHkgIyMKKworU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHBhcmFtZXRlcml6ZSBhbiBhY3Rpb24geW91IGRlZmluZS4gIEZvciB0aGF0Cit3ZSBoYXZlIGFub3RoZXIgbWFjcm8KK2BgYAorQUNUSU9OX1AobmFtZSwgcGFyYW0pIHsgc3RhdGVtZW50czsgfQorYGBgCisKK0ZvciBleGFtcGxlLAorYGBgCitBQ1RJT05fUChBZGQsIG4pIHsgcmV0dXJuIGFyZzAgKyBuOyB9CitgYGAKK3dpbGwgYWxsb3cgeW91IHRvIHdyaXRlCitgYGAKKy8vIFJldHVybnMgYXJndW1lbnQgIzAgKyA1LgorLi4uIFdpbGxPbmNlKEFkZCg1KSk7CitgYGAKKworRm9yIGNvbnZlbmllbmNlLCB3ZSB1c2UgdGhlIHRlcm0gX2FyZ3VtZW50c18gZm9yIHRoZSB2YWx1ZXMgdXNlZCB0bworaW52b2tlIHRoZSBtb2NrIGZ1bmN0aW9uLCBhbmQgdGhlIHRlcm0gX3BhcmFtZXRlcnNfIGZvciB0aGUgdmFsdWVzCit1c2VkIHRvIGluc3RhbnRpYXRlIGFuIGFjdGlvbi4KKworTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBlaXRoZXIuCitTdXBwb3NlIHRoZSBwYXJhbWV0ZXIgaXMgbmFtZWQgYHBhcmFtYCwgeW91IGNhbiBhbHNvIHVzZSB0aGUKK0dvb2dsZS1Nb2NrLWRlZmluZWQgc3ltYm9sIGBwYXJhbV90eXBlYCB0byByZWZlciB0byB0aGUgdHlwZSBvZiB0aGUKK3BhcmFtZXRlciBhcyBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuICBGb3IgZXhhbXBsZSwgaW4gdGhlIGJvZHkgb2YKK2BBQ1RJT05fUChBZGQsIG4pYCBhYm92ZSwgeW91IGNhbiB3cml0ZSBgbl90eXBlYCBmb3IgdGhlIHR5cGUgb2YgYG5gLgorCitHb29nbGUgTW9jayBhbHNvIHByb3ZpZGVzIGBBQ1RJT05fUDJgLCBgQUNUSU9OX1AzYCwgYW5kIGV0YyB0byBzdXBwb3J0CittdWx0aS1wYXJhbWV0ZXIgYWN0aW9ucy4gIEZvciBleGFtcGxlLAorYGBgCitBQ1RJT05fUDIoUmV0dXJuRGlzdGFuY2VUbywgeCwgeSkgeworICBkb3VibGUgZHggPSBhcmcwIC0geDsKKyAgZG91YmxlIGR5ID0gYXJnMSAtIHk7CisgIHJldHVybiBzcXJ0KGR4KmR4ICsgZHkqZHkpOworfQorYGBgCitsZXRzIHlvdSB3cml0ZQorYGBgCisuLi4gV2lsbE9uY2UoUmV0dXJuRGlzdGFuY2VUbyg1LjAsIDI2LjUpKTsKK2BgYAorCitZb3UgY2FuIHZpZXcgYEFDVElPTmAgYXMgYSBkZWdlbmVyYXRlZCBwYXJhbWV0ZXJpemVkIGFjdGlvbiB3aGVyZSB0aGUKK251bWJlciBvZiBwYXJhbWV0ZXJzIGlzIDAuCisKK1lvdSBjYW4gYWxzbyBlYXNpbHkgZGVmaW5lIGFjdGlvbnMgb3ZlcmxvYWRlZCBvbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnM6CitgYGAKK0FDVElPTl9QKFBsdXMsIGEpIHsgLi4uIH0KK0FDVElPTl9QMihQbHVzLCBhLCBiKSB7IC4uLiB9CitgYGAKKworIyMgUmVzdHJpY3RpbmcgdGhlIFR5cGUgb2YgYW4gQXJndW1lbnQgb3IgUGFyYW1ldGVyIGluIGFuIEFDVElPTiAjIworCitGb3IgbWF4aW11bSBicmV2aXR5IGFuZCByZXVzYWJpbGl0eSwgdGhlIGBBQ1RJT04qYCBtYWNyb3MgZG9uJ3QgYXNrCit5b3UgdG8gcHJvdmlkZSB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCB0aGUgYWN0aW9uCitwYXJhbWV0ZXJzLiAgSW5zdGVhZCwgd2UgbGV0IHRoZSBjb21waWxlciBpbmZlciB0aGUgdHlwZXMgZm9yIHVzLgorCitTb21ldGltZXMsIGhvd2V2ZXIsIHdlIG1heSB3YW50IHRvIGJlIG1vcmUgZXhwbGljaXQgYWJvdXQgdGhlIHR5cGVzLgorVGhlcmUgYXJlIHNldmVyYWwgdHJpY2tzIHRvIGRvIHRoYXQuICBGb3IgZXhhbXBsZToKK2BgYAorQUNUSU9OKEZvbykgeworICAvLyBNYWtlcyBzdXJlIGFyZzAgY2FuIGJlIGNvbnZlcnRlZCB0byBpbnQuCisgIGludCBuID0gYXJnMDsKKyAgLi4uIHVzZSBuIGluc3RlYWQgb2YgYXJnMCBoZXJlIC4uLgorfQorCitBQ1RJT05fUChCYXIsIHBhcmFtKSB7CisgIC8vIE1ha2VzIHN1cmUgdGhlIHR5cGUgb2YgYXJnMSBpcyBjb25zdCBjaGFyKi4KKyAgOjp0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3QgY2hhciosIGFyZzFfdHlwZT4oKTsKKworICAvLyBNYWtlcyBzdXJlIHBhcmFtIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYm9vbC4KKyAgYm9vbCBmbGFnID0gcGFyYW07Cit9CitgYGAKK3doZXJlIGBTdGF0aWNBc3NlcnRUeXBlRXFgIGlzIGEgY29tcGlsZS10aW1lIGFzc2VydGlvbiBpbiBHb29nbGUgVGVzdAordGhhdCB2ZXJpZmllcyB0d28gdHlwZXMgYXJlIHRoZSBzYW1lLgorCisjIyBXcml0aW5nIE5ldyBBY3Rpb24gVGVtcGxhdGVzIFF1aWNrbHkgIyMKKworU29tZXRpbWVzIHlvdSB3YW50IHRvIGdpdmUgYW4gYWN0aW9uIGV4cGxpY2l0IHRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdAorY2Fubm90IGJlIGluZmVycmVkIGZyb20gaXRzIHZhbHVlIHBhcmFtZXRlcnMuICBgQUNUSU9OX1RFTVBMQVRFKClgCitzdXBwb3J0cyB0aGF0IGFuZCBjYW4gYmUgdmlld2VkIGFzIGFuIGV4dGVuc2lvbiB0byBgQUNUSU9OKClgIGFuZAorYEFDVElPTl9QKigpYC4KKworVGhlIHN5bnRheDoKK2BgYAorQUNUSU9OX1RFTVBMQVRFKEFjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgSEFTX21fVEVNUExBVEVfUEFSQU1TKGtpbmQxLCBuYW1lMSwgLi4uLCBraW5kX20sIG5hbWVfbSksCisgICAgICAgICAgICAgICAgQU5EX25fVkFMVUVfUEFSQU1TKHAxLCAuLi4sIHBfbikpIHsgc3RhdGVtZW50czsgfQorYGBgCisKK2RlZmluZXMgYW4gYWN0aW9uIHRlbXBsYXRlIHRoYXQgdGFrZXMgX21fIGV4cGxpY2l0IHRlbXBsYXRlIHBhcmFtZXRlcnMKK2FuZCBfbl8gdmFsdWUgcGFyYW1ldGVycywgd2hlcmUgX21fIGlzIGJldHdlZW4gMSBhbmQgMTAsIGFuZCBfbl8gaXMKK2JldHdlZW4gMCBhbmQgMTAuICBgbmFtZV9pYCBpcyB0aGUgbmFtZSBvZiB0aGUgaS10aCB0ZW1wbGF0ZQorcGFyYW1ldGVyLCBhbmQgYGtpbmRfaWAgc3BlY2lmaWVzIHdoZXRoZXIgaXQncyBhIGB0eXBlbmFtZWAsIGFuCitpbnRlZ3JhbCBjb25zdGFudCwgb3IgYSB0ZW1wbGF0ZS4gIGBwX2lgIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoIHZhbHVlCitwYXJhbWV0ZXIuCisKK0V4YW1wbGU6CitgYGAKKy8vIER1cGxpY2F0ZUFyZzxrLCBUPihvdXRwdXQpIGNvbnZlcnRzIHRoZSBrLXRoIGFyZ3VtZW50IG9mIHRoZSBtb2NrCisvLyBmdW5jdGlvbiB0byB0eXBlIFQgYW5kIGNvcGllcyBpdCB0byAqb3V0cHV0LgorQUNUSU9OX1RFTVBMQVRFKER1cGxpY2F0ZUFyZywKKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoZSBjb21tYSBiZXR3ZWVuIGludCBhbmQgazoKKyAgICAgICAgICAgICAgICBIQVNfMl9URU1QTEFURV9QQVJBTVMoaW50LCBrLCB0eXBlbmFtZSwgVCksCisgICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKG91dHB1dCkpIHsKKyAgKm91dHB1dCA9IFQoOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykpOworfQorYGBgCisKK1RvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGVtcGxhdGUsIHdyaXRlOgorYGBgCisgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tPih2MSwgLi4uLCB2X24pCitgYGAKK3doZXJlIHRoZSBgdGBzIGFyZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0aGUKK2B2YHMgYXJlIHRoZSB2YWx1ZSBhcmd1bWVudHMuICBUaGUgdmFsdWUgYXJndW1lbnQKK3R5cGVzIGFyZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuICBGb3IgZXhhbXBsZToKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIGludCBuOworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oXywgXykpCisgICAgICAuV2lsbE9uY2UoRHVwbGljYXRlQXJnPDEsIHVuc2lnbmVkIGNoYXI+KCZuKSk7CitgYGAKKworSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB2YWx1ZSBhcmd1bWVudCB0eXBlcywgeW91IGNhbgorcHJvdmlkZSBhZGRpdGlvbmFsIHRlbXBsYXRlIGFyZ3VtZW50czoKK2BgYAorICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbSwgdTEsIC4uLiwgdV9rPih2MSwgLi4uLCB2X24pCitgYGAKK3doZXJlIGB1X2lgIGlzIHRoZSBkZXNpcmVkIHR5cGUgb2YgYHZfaWAuCisKK2BBQ1RJT05fVEVNUExBVEVgIGFuZCBgQUNUSU9OYC9gQUNUSU9OX1AqYCBjYW4gYmUgb3ZlcmxvYWRlZCBvbiB0aGUKK251bWJlciBvZiB2YWx1ZSBwYXJhbWV0ZXJzLCBidXQgbm90IG9uIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUKK3BhcmFtZXRlcnMuICBXaXRob3V0IHRoZSByZXN0cmljdGlvbiwgdGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZyBpcwordW5jbGVhcjoKKworYGBgCisgIE92ZXJsb2FkZWRBY3Rpb248aW50LCBib29sPih4KTsKK2BgYAorCitBcmUgd2UgdXNpbmcgYSBzaW5nbGUtdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbiB3aGVyZSBgYm9vbGAgcmVmZXJzIHRvCit0aGUgdHlwZSBvZiBgeGAsIG9yIGEgdHdvLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24gd2hlcmUgdGhlIGNvbXBpbGVyCitpcyBhc2tlZCB0byBpbmZlciB0aGUgdHlwZSBvZiBgeGA/CisKKyMjIFVzaW5nIHRoZSBBQ1RJT04gT2JqZWN0J3MgVHlwZSAjIworCitJZiB5b3UgYXJlIHdyaXRpbmcgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gYEFDVElPTmAgb2JqZWN0LCB5b3UnbGwKK25lZWQgdG8ga25vdyBpdHMgdHlwZS4gIFRoZSB0eXBlIGRlcGVuZHMgb24gdGhlIG1hY3JvIHVzZWQgdG8gZGVmaW5lCit0aGUgYWN0aW9uIGFuZCB0aGUgcGFyYW1ldGVyIHR5cGVzLiAgVGhlIHJ1bGUgaXMgcmVsYXRpdmVseSBzaW1wbGU6Cit8ICoqR2l2ZW4gRGVmaW5pdGlvbioqIHwgKipFeHByZXNzaW9uKiogfCAqKkhhcyBUeXBlKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFDVElPTihGb28pYCAgICAgICAgfCBgRm9vKClgICAgICAgICB8IGBGb29BY3Rpb25gICB8Cit8IGBBQ1RJT05fVEVNUExBVEUoRm9vLCBIQVNfbV9URU1QTEFURV9QQVJBTVMoLi4uKSwgQU5EXzBfVkFMVUVfUEFSQU1TKCkpYCB8CWBGb288dDEsIC4uLiwgdF9tPigpYCB8IGBGb29BY3Rpb248dDEsIC4uLiwgdF9tPmAgfAorfCBgQUNUSU9OX1AoQmFyLCBwYXJhbSlgIHwgYEJhcihpbnRfdmFsdWUpYCB8IGBCYXJBY3Rpb25QPGludD5gIHwKK3wgYEFDVElPTl9URU1QTEFURShCYXIsIEhBU19tX1RFTVBMQVRFX1BBUkFNUyguLi4pLCBBTkRfMV9WQUxVRV9QQVJBTVMocDEpKWAgfCBgQmFyPHQxLCAuLi4sIHRfbT4oaW50X3ZhbHVlKWAgfCBgRm9vQWN0aW9uUDx0MSwgLi4uLCB0X20sIGludD5gIHwKK3wgYEFDVElPTl9QMihCYXosIHAxLCBwMilgIHwgYEJheihib29sX3ZhbHVlLCBpbnRfdmFsdWUpYCB8IGBCYXpBY3Rpb25QMjxib29sLCBpbnQ+YCB8Cit8IGBBQ1RJT05fVEVNUExBVEUoQmF6LCBIQVNfbV9URU1QTEFURV9QQVJBTVMoLi4uKSwgQU5EXzJfVkFMVUVfUEFSQU1TKHAxLCBwMikpYCB8IGBCYXo8dDEsIC4uLiwgdF9tPihib29sX3ZhbHVlLCBpbnRfdmFsdWUpYCB8IGBGb29BY3Rpb25QMjx0MSwgLi4uLCB0X20sIGJvb2wsIGludD5gIHwKK3wgLi4uICAgICAgICAgICAgICAgICAgfCAuLi4gICAgICAgICAgICB8IC4uLiAgICAgICAgICB8CisKK05vdGUgdGhhdCB3ZSBoYXZlIHRvIHBpY2sgZGlmZmVyZW50IHN1ZmZpeGVzIChgQWN0aW9uYCwgYEFjdGlvblBgLAorYEFjdGlvblAyYCwgYW5kIGV0YykgZm9yIGFjdGlvbnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiB2YWx1ZQorcGFyYW1ldGVycywgb3IgdGhlIGFjdGlvbiBkZWZpbml0aW9ucyBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBvbiB0aGUKK251bWJlciBvZiB0aGVtLgorCisjIyBXcml0aW5nIE5ldyBNb25vbW9ycGhpYyBBY3Rpb25zICMjCisKK1doaWxlIHRoZSBgQUNUSU9OKmAgbWFjcm9zIGFyZSB2ZXJ5IGNvbnZlbmllbnQsIHNvbWV0aW1lcyB0aGV5IGFyZQoraW5hcHByb3ByaWF0ZS4gIEZvciBleGFtcGxlLCBkZXNwaXRlIHRoZSB0cmlja3Mgc2hvd24gaW4gdGhlIHByZXZpb3VzCityZWNpcGVzLCB0aGV5IGRvbid0IGxldCB5b3UgZGlyZWN0bHkgc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlIG1vY2sKK2Z1bmN0aW9uIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzCit0byB1bm9wdGltaXplZCBjb21waWxlciBlcnJvciBtZXNzYWdlcyB0aGF0IGNhbiBiYWZmbGUgdW5mYW1pbGlhcgordXNlcnMuICBUaGV5IGFsc28gZG9uJ3QgYWxsb3cgb3ZlcmxvYWRpbmcgYWN0aW9ucyBiYXNlZCBvbiBwYXJhbWV0ZXIKK3R5cGVzIHdpdGhvdXQganVtcGluZyB0aHJvdWdoIHNvbWUgaG9vcHMuCisKK0FuIGFsdGVybmF0aXZlIHRvIHRoZSBgQUNUSU9OKmAgbWFjcm9zIGlzIHRvIGltcGxlbWVudAorYDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+YCwgd2hlcmUgYEZgIGlzIHRoZSB0eXBlIG9mIHRoZSBtb2NrCitmdW5jdGlvbiBpbiB3aGljaCB0aGUgYWN0aW9uIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6CisKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEY+Y2xhc3MgQWN0aW9uSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkFjdGlvbkludGVyZmFjZSgpOworCisgIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24uICBSZXN1bHQgaXMgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uIHR5cGUKKyAgLy8gRiwgYW5kIEFyZ3VtZW50VHVwbGUgaXMgdGhlIHR1cGxlIG9mIGFyZ3VtZW50cyBvZiBGLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgaWYgRiBpcyBpbnQoYm9vbCwgY29uc3Qgc3RyaW5nJiksIHRoZW4gUmVzdWx0IHdvdWxkCisgIC8vIGJlIGludCwgYW5kIEFyZ3VtZW50VHVwbGUgd291bGQgYmUgOjp0ZXN0aW5nOjp0dXBsZTxib29sLCBjb25zdCBzdHJpbmcmPi4KKyAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSA9IDA7Cit9OworCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkFjdGlvbjsKK3VzaW5nIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYWtlQWN0aW9uOworCit0eXBlZGVmIGludCBJbmNyZW1lbnRNZXRob2QoaW50Kik7CisKK2NsYXNzIEluY3JlbWVudEFyZ3VtZW50QWN0aW9uIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxJbmNyZW1lbnRNZXRob2Q+IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgaW50IFBlcmZvcm0oY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxpbnQqPiYgYXJncykgeworICAgIGludCogcCA9IDo6dGVzdGluZzo6Z2V0PDA+KGFyZ3MpOyAgLy8gR3JhYnMgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgIHJldHVybiAqcCsrOworICB9Cit9OworCitBY3Rpb248SW5jcmVtZW50TWV0aG9kPiBJbmNyZW1lbnRBcmd1bWVudCgpIHsKKyAgcmV0dXJuIE1ha2VBY3Rpb24obmV3IEluY3JlbWVudEFyZ3VtZW50QWN0aW9uKTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKGZvbywgQmF6KF8pKQorICAgICAgLldpbGxPbmNlKEluY3JlbWVudEFyZ3VtZW50KCkpOworCisgIGludCBuID0gNTsKKyAgZm9vLkJheigmbik7ICAvLyBTaG91bGQgcmV0dXJuIDUgYW5kIGNoYW5nZSBuIHRvIDYuCitgYGAKKworIyMgV3JpdGluZyBOZXcgUG9seW1vcnBoaWMgQWN0aW9ucyAjIworCitUaGUgcHJldmlvdXMgcmVjaXBlIHNob3dlZCB5b3UgaG93IHRvIGRlZmluZSB5b3VyIG93biBhY3Rpb24uIFRoaXMgaXMKK2FsbCBnb29kLCBleGNlcHQgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpbgord2hpY2ggdGhlIGFjdGlvbiB3aWxsIGJlIHVzZWQuIFNvbWV0aW1lcyB0aGF0IGNhbiBiZSBhIHByb2JsZW0uIEZvcgorZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBhY3Rpb24gaW4gZnVuY3Rpb25zIHdpdGggX2RpZmZlcmVudF8KK3R5cGVzIChlLmcuIGxpa2UgYFJldHVybigpYCBhbmQgYFNldEFyZ1BvaW50ZWUoKWApLgorCitJZiBhbiBhY3Rpb24gY2FuIGJlIHVzZWQgaW4gc2V2ZXJhbCB0eXBlcyBvZiBtb2NrIGZ1bmN0aW9ucywgd2Ugc2F5CitpdCdzIF9wb2x5bW9ycGhpY18uIFRoZSBgTWFrZVBvbHltb3JwaGljQWN0aW9uKClgIGZ1bmN0aW9uIHRlbXBsYXRlCittYWtlcyBpdCBlYXN5IHRvIGRlZmluZSBzdWNoIGFuIGFjdGlvbjoKKworYGBgCituYW1lc3BhY2UgdGVzdGluZyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorUG9seW1vcnBoaWNBY3Rpb248SW1wbD4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGNvbnN0IEltcGwmIGltcGwpOworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworYGBgCisKK0FzIGFuIGV4YW1wbGUsIGxldCdzIGRlZmluZSBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZWNvbmQgYXJndW1lbnQKK2luIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnQgbGlzdC4gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gZGVmaW5lIGFuCitpbXBsZW1lbnRhdGlvbiBjbGFzczoKKworYGBgCitjbGFzcyBSZXR1cm5TZWNvbmRBcmd1bWVudEFjdGlvbiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7CisgICAgLy8gVG8gZ2V0IHRoZSBpLXRoICgwLWJhc2VkKSBhcmd1bWVudCwgdXNlIDo6dGVzdGluZzo6Z2V0PGk+KGFyZ3MpLgorICAgIHJldHVybiA6OnRlc3Rpbmc6OmdldDwxPihhcmdzKTsKKyAgfQorfTsKK2BgYAorCitUaGlzIGltcGxlbWVudGF0aW9uIGNsYXNzIGRvZXMgX25vdF8gbmVlZCB0byBpbmhlcml0IGZyb20gYW55CitwYXJ0aWN1bGFyIGNsYXNzLiBXaGF0IG1hdHRlcnMgaXMgdGhhdCBpdCBtdXN0IGhhdmUgYSBgUGVyZm9ybSgpYAorbWV0aG9kIHRlbXBsYXRlLiBUaGlzIG1ldGhvZCB0ZW1wbGF0ZSB0YWtlcyB0aGUgbW9jayBmdW5jdGlvbidzCithcmd1bWVudHMgYXMgYSB0dXBsZSBpbiBhICoqc2luZ2xlKiogYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKK3RoZSBhY3Rpb24uIEl0IGNhbiBiZSBlaXRoZXIgYGNvbnN0YCBvciBub3QsIGJ1dCBtdXN0IGJlIGludm9rYWJsZQord2l0aCBleGFjdGx5IG9uZSB0ZW1wbGF0ZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIHJlc3VsdCB0eXBlLiBJbiBvdGhlcgord29yZHMsIHlvdSBtdXN0IGJlIGFibGUgdG8gY2FsbCBgUGVyZm9ybTxSPihhcmdzKWAgd2hlcmUgYFJgIGlzIHRoZQorbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlIGFuZCBgYXJnc2AgaXMgaXRzIGFyZ3VtZW50cyBpbiBhIHR1cGxlLgorCitOZXh0LCB3ZSB1c2UgYE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpYCB0byB0dXJuIGFuIGluc3RhbmNlIG9mIHRoZQoraW1wbGVtZW50YXRpb24gY2xhc3MgaW50byB0aGUgcG9seW1vcnBoaWMgYWN0aW9uIHdlIG5lZWQuIEl0IHdpbGwgYmUKK2NvbnZlbmllbnQgdG8gaGF2ZSBhIHdyYXBwZXIgZm9yIHRoaXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNBY3Rpb247Cit1c2luZyA6OnRlc3Rpbmc6OlBvbHltb3JwaGljQWN0aW9uOworCitQb2x5bW9ycGhpY0FjdGlvbjxSZXR1cm5TZWNvbmRBcmd1bWVudEFjdGlvbj4gUmV0dXJuU2Vjb25kQXJndW1lbnQoKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oUmV0dXJuU2Vjb25kQXJndW1lbnRBY3Rpb24oKSk7Cit9CitgYGAKKworTm93LCB5b3UgY2FuIHVzZSB0aGlzIHBvbHltb3JwaGljIGFjdGlvbiB0aGUgc2FtZSB3YXkgeW91IHVzZSB0aGUKK2J1aWx0LWluIG9uZXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoRG9UaGlzLCBpbnQoYm9vbCBmbGFnLCBpbnQgbikpOworICBNT0NLX01FVEhPRDMoRG9UaGF0LCBzdHJpbmcoaW50IHgsIGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoXywgXykpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuU2Vjb25kQXJndW1lbnQoKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGF0KF8sIF8sIF8pKQorICAgICAgLldpbGxPbmNlKFJldHVyblNlY29uZEFyZ3VtZW50KCkpOworICAuLi4KKyAgZm9vLkRvVGhpcyh0cnVlLCA1KTsgICAgICAgICAvLyBXaWxsIHJldHVybiA1LgorICBmb28uRG9UaGF0KDEsICJIaSIsICJCeWUiKTsgIC8vIFdpbGwgcmV0dXJuICJIaSIuCitgYGAKKworIyMgVGVhY2hpbmcgR29vZ2xlIE1vY2sgSG93IHRvIFByaW50IFlvdXIgVmFsdWVzICMjCisKK1doZW4gYW4gdW5pbnRlcmVzdGluZyBvciB1bmV4cGVjdGVkIGNhbGwgb2NjdXJzLCBHb29nbGUgTW9jayBwcmludHMgdGhlCithcmd1bWVudCB2YWx1ZXMgYW5kIHRoZSBzdGFjayB0cmFjZSB0byBoZWxwIHlvdSBkZWJ1Zy4gIEFzc2VydGlvbgorbWFjcm9zIGxpa2UgYEVYUEVDVF9USEFUYCBhbmQgYEVYUEVDVF9FUWAgYWxzbyBwcmludCB0aGUgdmFsdWVzIGluCitxdWVzdGlvbiB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuICBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3QgZG8gdGhpcyB1c2luZworR29vZ2xlIFRlc3QncyB1c2VyLWV4dGVuc2libGUgdmFsdWUgcHJpbnRlci4KKworVGhpcyBwcmludGVyIGtub3dzIGhvdyB0byBwcmludCBidWlsdC1pbiBDKysgdHlwZXMsIG5hdGl2ZSBhcnJheXMsIFNUTAorY29udGFpbmVycywgYW5kIGFueSB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlIGA8PGAgb3BlcmF0b3IuICBGb3Igb3RoZXIKK3R5cGVzLCBpdCBwcmludHMgdGhlIHJhdyBieXRlcyBpbiB0aGUgdmFsdWUgYW5kIGhvcGVzIHRoYXQgeW91IHRoZQordXNlciBjYW4gZmlndXJlIGl0IG91dC4KK1tHb29nbGUgVGVzdCdzIGFkdmFuY2VkIGd1aWRlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0FkdmFuY2VkR3VpZGUjVGVhY2hpbmdfR29vZ2xlX1Rlc3RfSG93X3RvX1ByaW50X1lvdXJfVmFsdWVzKQorZXhwbGFpbnMgaG93IHRvIGV4dGVuZCB0aGUgcHJpbnRlciB0byBkbyBhIGJldHRlciBqb2IgYXQKK3ByaW50aW5nIHlvdXIgcGFydGljdWxhciB0eXBlIHRoYW4gdG8gZHVtcCB0aGUgYnl0ZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvRGVzaWduRG9jLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvRGVzaWduRG9jLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTE1YzMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9EZXNpZ25Eb2MubWQKQEAgLTAsMCArMSwyODAgQEAKK1RoaXMgcGFnZSBkaXNjdXNzZXMgdGhlIGRlc2lnbiBvZiBuZXcgR29vZ2xlIE1vY2sgZmVhdHVyZXMuCisKKworCisjIE1hY3JvcyBmb3IgRGVmaW5pbmcgQWN0aW9ucyAjCisKKyMjIFByb2JsZW0gIyMKKworRHVlIHRvIHRoZSBsYWNrIG9mIGNsb3N1cmVzIGluIEMrKywgaXQgY3VycmVudGx5IHJlcXVpcmVzIHNvbWUKK25vbi10cml2aWFsIGVmZm9ydCB0byBkZWZpbmUgYSBjdXN0b20gYWN0aW9uIGluIEdvb2dsZSBNb2NrLiAgRm9yCitleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50IHRvICJpbmNyZW1lbnQgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgdGhlCitzZWNvbmQgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYW5kIHJldHVybiBpdCIsIHlvdSBjb3VsZCB3cml0ZToKKworYGBgCitpbnQgSW5jcmVtZW50QXJnMShVbnVzZWQsIGludCogcCwgVW51c2VkKSB7CisgIHJldHVybiArKygqcCk7Cit9CisKKy4uLiBXaWxsT25jZShJbnZva2UoSW5jcmVtZW50QXJnMSkpOworYGBgCisKK1RoZXJlIGFyZSBzZXZlcmFsIHRoaW5ncyB1bnNhdGlzZmFjdG9yeSBhYm91dCB0aGlzIGFwcHJvYWNoOgorCisgICogRXZlbiB0aG91Z2ggdGhlIGFjdGlvbiBvbmx5IGNhcmVzIGFib3V0IHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24sIGl0cyBkZWZpbml0aW9uIG5lZWRzIHRvIGxpc3Qgb3RoZXIgYXJndW1lbnRzIGFzIGR1bW1pZXMuICBUaGlzIGlzIHRlZGlvdXMuCisgICogVGhlIGRlZmluZWQgYWN0aW9uIGlzIHVzYWJsZSBvbmx5IGluIG1vY2sgZnVuY3Rpb25zIHRoYXQgdGFrZXMgZXhhY3RseSAzIGFyZ3VtZW50cyAtIGFuIHVubmVjZXNzYXJ5IHJlc3RyaWN0aW9uLgorICAqIFRvIHVzZSB0aGUgYWN0aW9uLCBvbmUgaGFzIHRvIHNheSBgSW52b2tlKEluY3JlbWVudEFyZzEpYCwgd2hpY2ggaXNuJ3QgYXMgbmljZSBhcyBgSW5jcmVtZW50QXJnMSgpYC4KKworVGhlIGxhdHRlciB0d28gcHJvYmxlbXMgY2FuIGJlIG92ZXJjb21lIHVzaW5nIGBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKWAsCitidXQgaXQgcmVxdWlyZXMgbXVjaCBtb3JlIGJvaWxlcnBsYXRlIGNvZGU6CisKK2BgYAorY2xhc3MgSW5jcmVtZW50QXJnMUFjdGlvbiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7CisgICAgcmV0dXJuICsrKCp0cjE6OmdldDwxPihhcmdzKSk7CisgIH0KK307CisKK1BvbHltb3JwaGljQWN0aW9uPEluY3JlbWVudEFyZzFBY3Rpb24+IEluY3JlbWVudEFyZzEoKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oSW5jcmVtZW50QXJnMUFjdGlvbigpKTsKK30KKworLi4uIFdpbGxPbmNlKEluY3JlbWVudEFyZzEoKSk7CitgYGAKKworT3VyIGdvYWwgaXMgdG8gYWxsb3cgZGVmaW5pbmcgY3VzdG9tIGFjdGlvbnMgd2l0aCB0aGUgbGVhc3QgYW1vdW50IG9mCitib2lsZXItcGxhdGUgQysrIHJlcXVpcmVzLgorCisjIyBTb2x1dGlvbiAjIworCitXZSBwcm9wb3NlIHRvIGludHJvZHVjZSBhIG5ldyBtYWNybzoKK2BgYAorQUNUSU9OKG5hbWUpIHsgc3RhdGVtZW50czsgfQorYGBgCisKK1VzaW5nIHRoaXMgaW4gYSBuYW1lc3BhY2Ugc2NvcGUgd2lsbCBkZWZpbmUgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuCituYW1lIHRoYXQgZXhlY3V0ZXMgdGhlIHN0YXRlbWVudHMuICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4KK3JlZmVyIHRvIHRoZSBLLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcyBgYXJnS2AuCitGb3IgZXhhbXBsZToKK2BgYAorQUNUSU9OKEluY3JlbWVudEFyZzEpIHsgcmV0dXJuICsrKCphcmcxKTsgfQorYGBgCithbGxvd3MgeW91IHRvIHdyaXRlCitgYGAKKy4uLiBXaWxsT25jZShJbmNyZW1lbnRBcmcxKCkpOworYGBgCisKK05vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbgorYXJndW1lbnRzLCBhcyBicmV2aXR5IGlzIGEgdG9wIGRlc2lnbiBnb2FsIGhlcmUuICBSZXN0IGFzc3VyZWQgdGhhdAoreW91ciBjb2RlIGlzIHN0aWxsIHR5cGUtc2FmZSB0aG91Z2g6IHlvdSdsbCBnZXQgYSBjb21waWxlciBlcnJvciBpZgorYCphcmcxYCBkb2Vzbid0IHN1cHBvcnQgdGhlIGArK2Agb3BlcmF0b3IsIG9yIGlmIHRoZSB0eXBlIG9mCitgKysoKmFyZzEpYCBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZS4KKworQW5vdGhlciBleGFtcGxlOgorYGBgCitBQ1RJT04oRm9vKSB7CisgICgqYXJnMikoNSk7CisgIEJsYWgoKTsKKyAgKmFyZzEgPSAwOworICByZXR1cm4gYXJnMDsKK30KK2BgYAorZGVmaW5lcyBhbiBhY3Rpb24gYEZvbygpYCB0aGF0IGludm9rZXMgYXJndW1lbnQgIzIgKGEgZnVuY3Rpb24gcG9pbnRlcikKK3dpdGggNSwgY2FsbHMgZnVuY3Rpb24gYEJsYWgoKWAsIHNldHMgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgYXJndW1lbnQKKyMxIHRvIDAsIGFuZCByZXR1cm5zIGFyZ3VtZW50ICMwLgorCitGb3IgbW9yZSBjb252ZW5pZW5jZSBhbmQgZmxleGliaWxpdHksIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGZvbGxvd2luZworcHJlLWRlZmluZWQgc3ltYm9scyBpbiB0aGUgYm9keSBvZiBgQUNUSU9OYDoKKworfCBgYXJnS190eXBlYCB8IFRoZSB0eXBlIG9mIHRoZSBLLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB8Cit8Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYGFyZ3NgICAgICAgfCBBbGwgYXJndW1lbnRzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uIGFzIGEgdHVwbGUgICAgICAgICAgICAgICAgfAorfCBgYXJnc190eXBlYCB8IFRoZSB0eXBlIG9mIGFsbCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXMgYSB0dXBsZSAgICB8Cit8IGByZXR1cm5fdHlwZWAgfCBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1vY2sgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgZnVuY3Rpb25fdHlwZWAgfCBUaGUgdHlwZSBvZiB0aGUgbW9jayBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCitGb3IgZXhhbXBsZSwgd2hlbiB1c2luZyBhbiBgQUNUSU9OYCBhcyBhIHN0dWIgYWN0aW9uIGZvciBtb2NrIGZ1bmN0aW9uOgorYGBgCitpbnQgRG9Tb21ldGhpbmcoYm9vbCBmbGFnLCBpbnQqIHB0cik7CitgYGAKK3dlIGhhdmU6Cit8ICoqUHJlLWRlZmluZWQgU3ltYm9sKiogfCAqKklzIEJvdW5kIFRvKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLXwKK3wgYGFyZzBgICAgICAgICAgICAgICAgICB8IHRoZSB2YWx1ZSBvZiBgZmxhZ2AgfAorfCBgYXJnMF90eXBlYCAgICAgICAgICAgIHwgdGhlIHR5cGUgYGJvb2xgIHwKK3wgYGFyZzFgICAgICAgICAgICAgICAgICB8IHRoZSB2YWx1ZSBvZiBgcHRyYCB8Cit8IGBhcmcxX3R5cGVgICAgICAgICAgICAgfCB0aGUgdHlwZSBgaW50KmAgfAorfCBgYXJnc2AgICAgICAgICAgICAgICAgIHwgdGhlIHR1cGxlIGAoZmxhZywgcHRyKWAgfAorfCBgYXJnc190eXBlYCAgICAgICAgICAgIHwgdGhlIHR5cGUgYHN0ZDo6dHIxOjp0dXBsZTxib29sLCBpbnQqPmAgfAorfCBgcmV0dXJuX3R5cGVgICAgICAgICAgIHwgdGhlIHR5cGUgYGludGAgIHwKK3wgYGZ1bmN0aW9uX3R5cGVgICAgICAgICB8IHRoZSB0eXBlIGBpbnQoYm9vbCwgaW50KilgIHwKKworIyMgUGFyYW1ldGVyaXplZCBhY3Rpb25zICMjCisKK1NvbWV0aW1lcyB5b3UnbGwgd2FudCB0byBwYXJhbWV0ZXJpemUgdGhlIGFjdGlvbi4gICBGb3IgdGhhdCB3ZSBwcm9wb3NlCithbm90aGVyIG1hY3JvCitgYGAKK0FDVElPTl9QKG5hbWUsIHBhcmFtKSB7IHN0YXRlbWVudHM7IH0KK2BgYAorCitGb3IgZXhhbXBsZSwKK2BgYAorQUNUSU9OX1AoQWRkLCBuKSB7IHJldHVybiBhcmcwICsgbjsgfQorYGBgCit3aWxsIGFsbG93IHlvdSB0byB3cml0ZQorYGBgCisvLyBSZXR1cm5zIGFyZ3VtZW50ICMwICsgNS4KKy4uLiBXaWxsT25jZShBZGQoNSkpOworYGBgCisKK0ZvciBjb252ZW5pZW5jZSwgd2UgdXNlIHRoZSB0ZXJtIF9hcmd1bWVudHNfIGZvciB0aGUgdmFsdWVzIHVzZWQgdG8KK2ludm9rZSB0aGUgbW9jayBmdW5jdGlvbiwgYW5kIHRoZSB0ZXJtIF9wYXJhbWV0ZXJzXyBmb3IgdGhlIHZhbHVlcwordXNlZCB0byBpbnN0YW50aWF0ZSBhbiBhY3Rpb24uCisKK05vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBwcm92aWRlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgZWl0aGVyLgorU3VwcG9zZSB0aGUgcGFyYW1ldGVyIGlzIG5hbWVkIGBwYXJhbWAsIHlvdSBjYW4gYWxzbyB1c2UgdGhlCitHb29nbGUtTW9jay1kZWZpbmVkIHN5bWJvbCBgcGFyYW1fdHlwZWAgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgdGhlCitwYXJhbWV0ZXIgYXMgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLgorCitXZSB3aWxsIGFsc28gcHJvdmlkZSBgQUNUSU9OX1AyYCwgYEFDVElPTl9QM2AsIGFuZCBldGMgdG8gc3VwcG9ydAorbXVsdGktcGFyYW1ldGVyIGFjdGlvbnMuICBGb3IgZXhhbXBsZSwKK2BgYAorQUNUSU9OX1AyKFJldHVybkRpc3RhbmNlVG8sIHgsIHkpIHsKKyAgZG91YmxlIGR4ID0gYXJnMCAtIHg7CisgIGRvdWJsZSBkeSA9IGFyZzEgLSB5OworICByZXR1cm4gc3FydChkeCpkeCArIGR5KmR5KTsKK30KK2BgYAorbGV0cyB5b3Ugd3JpdGUKK2BgYAorLi4uIFdpbGxPbmNlKFJldHVybkRpc3RhbmNlVG8oNS4wLCAyNi41KSk7CitgYGAKKworWW91IGNhbiB2aWV3IGBBQ1RJT05gIGFzIGEgZGVnZW5lcmF0ZWQgcGFyYW1ldGVyaXplZCBhY3Rpb24gd2hlcmUgdGhlCitudW1iZXIgb2YgcGFyYW1ldGVycyBpcyAwLgorCisjIyBBZHZhbmNlZCBVc2FnZXMgIyMKKworIyMjIE92ZXJsb2FkaW5nIEFjdGlvbnMgIyMjCisKK1lvdSBjYW4gZWFzaWx5IGRlZmluZSBhY3Rpb25zIG92ZXJsb2FkZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzOgorYGBgCitBQ1RJT05fUChQbHVzLCBhKSB7IC4uLiB9CitBQ1RJT05fUDIoUGx1cywgYSwgYikgeyAuLi4gfQorYGBgCisKKyMjIyBSZXN0cmljdGluZyB0aGUgVHlwZSBvZiBhbiBBcmd1bWVudCBvciBQYXJhbWV0ZXIgIyMjCisKK0ZvciBtYXhpbXVtIGJyZXZpdHkgYW5kIHJldXNhYmlsaXR5LCB0aGUgYEFDVElPTipgIG1hY3JvcyBkb24ndCBsZXQKK3lvdSBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIHRoZSBhY3Rpb24KK3BhcmFtZXRlcnMuICBJbnN0ZWFkLCB3ZSBsZXQgdGhlIGNvbXBpbGVyIGluZmVyIHRoZSB0eXBlcyBmb3IgdXMuCisKK1NvbWV0aW1lcywgaG93ZXZlciwgd2UgbWF5IHdhbnQgdG8gYmUgbW9yZSBleHBsaWNpdCBhYm91dCB0aGUgdHlwZXMuCitUaGVyZSBhcmUgc2V2ZXJhbCB0cmlja3MgdG8gZG8gdGhhdC4gIEZvciBleGFtcGxlOgorYGBgCitBQ1RJT04oRm9vKSB7CisgIC8vIE1ha2VzIHN1cmUgYXJnMCBjYW4gYmUgY29udmVydGVkIHRvIGludC4KKyAgaW50IG4gPSBhcmcwOworICAuLi4gdXNlIG4gaW5zdGVhZCBvZiBhcmcwIGhlcmUgLi4uCit9CisKK0FDVElPTl9QKEJhciwgcGFyYW0pIHsKKyAgLy8gTWFrZXMgc3VyZSB0aGUgdHlwZSBvZiBhcmcxIGlzIGNvbnN0IGNoYXIqLgorICA6OnRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBjaGFyKiwgYXJnMV90eXBlPigpOworCisgIC8vIE1ha2VzIHN1cmUgcGFyYW0gY2FuIGJlIGNvbnZlcnRlZCB0byBib29sLgorICBib29sIGZsYWcgPSBwYXJhbTsKK30KK2BgYAord2hlcmUgYFN0YXRpY0Fzc2VydFR5cGVFcWAgaXMgYSBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHdlIHBsYW4gdG8gYWRkIHRvCitHb29nbGUgVGVzdCAodGhlIG5hbWUgaXMgY2hvc2VuIHRvIG1hdGNoIGBzdGF0aWNfYXNzZXJ0YCBpbiBDKysweCkuCisKKyMjIyBVc2luZyB0aGUgQUNUSU9OIE9iamVjdCdzIFR5cGUgIyMjCisKK0lmIHlvdSBhcmUgd3JpdGluZyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBgQUNUSU9OYCBvYmplY3QsIHlvdSdsbAorbmVlZCB0byBrbm93IGl0cyB0eXBlLiAgVGhlIHR5cGUgZGVwZW5kcyBvbiB0aGUgbWFjcm8gdXNlZCB0byBkZWZpbmUKK3RoZSBhY3Rpb24gYW5kIHRoZSBwYXJhbWV0ZXIgdHlwZXMuICBUaGUgcnVsZSBpcyByZWxhdGl2ZWx5IHNpbXBsZToKK3wgKipHaXZlbiBEZWZpbml0aW9uKiogfCAqKkV4cHJlc3Npb24qKiB8ICoqSGFzIFR5cGUqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQUNUSU9OKEZvbylgICAgICAgICB8IGBGb28oKWAgICAgICAgIHwgYEZvb0FjdGlvbmAgIHwKK3wgYEFDVElPTl9QKEJhciwgcGFyYW0pYCB8IGBCYXIoaW50X3ZhbHVlKWAgfCBgQmFyQWN0aW9uUDxpbnQ+YCB8Cit8IGBBQ1RJT05fUDIoQmF6LCBwMSwgcDIpYCB8IGBCYXooYm9vbF92YWx1ZSwgaW50X3ZhbHVlKWAgfCBgQmF6QWN0aW9uUDI8Ym9vbCwgaW50PmAgfAorfCAuLi4gICAgICAgICAgICAgICAgICB8IC4uLiAgICAgICAgICAgIHwgLi4uICAgICAgICAgIHwKKworTm90ZSB0aGF0IHdlIGhhdmUgdG8gcGljayBkaWZmZXJlbnQgc3VmZml4ZXMgKGBBY3Rpb25gLCBgQWN0aW9uUGAsCitgQWN0aW9uUDJgLCBhbmQgZXRjKSBmb3IgYWN0aW9ucyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnMsCitvciB0aGUgYWN0aW9uIGRlZmluaXRpb25zIGNhbm5vdCBiZSBvdmVybG9hZGVkIG9uIHRoZSBudW1iZXIgb2YKK3BhcmFtZXRlcnMuCisKKyMjIFdoZW4gdG8gVXNlICMjCisKK1doaWxlIHRoZSBuZXcgbWFjcm9zIGFyZSB2ZXJ5IGNvbnZlbmllbnQsIHBsZWFzZSBhbHNvIGNvbnNpZGVyIG90aGVyCittZWFucyBvZiBpbXBsZW1lbnRpbmcgYWN0aW9ucyAoZS5nLiB2aWEgYEFjdGlvbkludGVyZmFjZWAgb3IKK2BNYWtlUG9seW1vcnBoaWNBY3Rpb24oKWApLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvIHVzZSB0aGUgZGVmaW5lZAorYWN0aW9uIGEgbG90LiAgV2hpbGUgdGhlIG90aGVyIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmssIHRoZXkgZ2l2ZQoreW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCB0aGUKK2FjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzIHRvIGJldHRlciBjb21waWxlciBlcnJvcgorbWVzc2FnZXMgdGhhdCBwYXkgb2ZmIGluIHRoZSBsb25nIHJ1bi4gIFRoZXkgYWxzbyBhbGxvdyBvdmVybG9hZGluZworYWN0aW9ucyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMsIGFzIG9wcG9zZWQgdG8ganVzdCB0aGUgbnVtYmVyIG9mCitwYXJhbWV0ZXJzLgorCisjIyBSZWxhdGVkIFdvcmsgIyMKKworQXMgeW91IG1heSBoYXZlIHJlYWxpemVkLCB0aGUgYEFDVElPTipgIG1hY3JvcyByZXNlbWJsZSBjbG9zdXJlcyAoYWxzbwora25vd24gYXMgbGFtYmRhIGV4cHJlc3Npb25zIG9yIGFub255bW91cyBmdW5jdGlvbnMpLiAgSW5kZWVkLCBib3RoIG9mCit0aGVtIHNlZWsgdG8gbG93ZXIgdGhlIHN5bnRhY3RpYyBvdmVyaGVhZCBmb3IgZGVmaW5pbmcgYSBmdW5jdGlvbi4KKworQysrMHggd2lsbCBzdXBwb3J0IGxhbWJkYXMsIGJ1dCB0aGV5IGFyZSBub3QgcGFydCBvZiBDKysgcmlnaHQgbm93LgorU29tZSBub24tc3RhbmRhcmQgbGlicmFyaWVzIChtb3N0IG5vdGFibHkgQkxMIG9yIEJvb3N0IExhbWJkYSBMaWJyYXJ5KQordHJ5IHRvIGFsbGV2aWF0ZSB0aGlzIHByb2JsZW0uICBIb3dldmVyLCB0aGV5IGFyZSBub3QgYSBnb29kIGNob2ljZQorZm9yIGRlZmluaW5nIGFjdGlvbnMgYXM6CisKKyAgKiBUaGV5IGFyZSBub24tc3RhbmRhcmQgYW5kIG5vdCB3aWRlbHkgaW5zdGFsbGVkLiAgR29vZ2xlIE1vY2sgb25seSBkZXBlbmRzIG9uIHN0YW5kYXJkIGxpYnJhcmllcyBhbmQgYHRyMTo6dHVwbGVgLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBuZXcgQysrIHN0YW5kYXJkIGFuZCBjb21lcyB3aXRoIGdjYyA0Ky4gIFdlIHdhbnQgdG8ga2VlcCBpdCB0aGF0IHdheS4KKyAgKiBUaGV5IGFyZSBub3QgdHJpdmlhbCB0byBsZWFybi4KKyAgKiBUaGV5IHdpbGwgYmVjb21lIG9ic29sZXRlIHdoZW4gQysrMHgncyBsYW1iZGEgZmVhdHVyZSBpcyB3aWRlbHkgc3VwcG9ydGVkLiAgV2UgZG9uJ3Qgd2FudCB0byBtYWtlIG91ciB1c2VycyB1c2UgYSBkeWluZyBsaWJyYXJ5LgorICAqIFNpbmNlIHRoZXkgYXJlIGJhc2VkIG9uIG9wZXJhdG9ycywgdGhleSBhcmUgcmF0aGVyIGFkIGhvYzogeW91IGNhbm5vdCB1c2Ugc3RhdGVtZW50cywgYW5kIHlvdSBjYW5ub3QgcGFzcyB0aGUgbGFtYmRhIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZS4KKyAgKiBUaGV5IGhhdmUgc3VidGxlIHNlbWFudGljcyB0aGF0IGVhc2lseSBjb25mdXNlcyBuZXcgdXNlcnMuICBGb3IgZXhhbXBsZSwgaW4gZXhwcmVzc2lvbiBgXzErKyArIGZvbysrYCwgYGZvb2Agd2lsbCBiZSBpbmNyZW1lbnRlZCBvbmx5IG9uY2Ugd2hlcmUgdGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCB3aGlsZSBgXzFgIHdpbGwgYmUgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGUgdW5uYW1lZCBmdW5jdGlvbiBpcyBpbnZva2VkLiAgVGhpcyBpcyBmYXIgZnJvbSBpbnR1aXRpdmUuCisKK2BBQ1RJT04qYCBhdm9pZCBhbGwgdGhlc2UgcHJvYmxlbXMuCisKKyMjIEZ1dHVyZSBJbXByb3ZlbWVudHMgIyMKKworVGhlcmUgbWF5IGJlIGEgbmVlZCBmb3IgY29tcG9zaW5nIGBBQ1RJT04qYCBkZWZpbml0aW9ucyAoaS5lLiBpbnZva2luZworYW5vdGhlciBgQUNUSU9OYCBpbnNpZGUgdGhlIGRlZmluaXRpb24gb2Ygb25lIGBBQ1RJT04qYCkuICBXZSBhcmUgbm90CitzdXJlIHdlIHdhbnQgaXQgeWV0LCBhcyBvbmUgY2FuIGdldCBhIHNpbWlsYXIgZWZmZWN0IGJ5IHB1dHRpbmcKK2BBQ1RJT05gIGRlZmluaXRpb25zIGluIGZ1bmN0aW9uIHRlbXBsYXRlcyBhbmQgY29tcG9zaW5nIHRoZSBmdW5jdGlvbgordGVtcGxhdGVzLiAgV2UnbGwgcmV2aXNpdCB0aGlzIGJhc2VkIG9uIHVzZXIgZmVlZGJhY2suCisKK1RoZSByZWFzb24gd2UgZG9uJ3QgYWxsb3cgYEFDVElPTiooKWAgaW5zaWRlIGEgZnVuY3Rpb24gYm9keSBpcyB0aGF0Cit0aGUgY3VycmVudCBDKysgc3RhbmRhcmQgZG9lc24ndCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkCit0byBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXBjb21pbmcgQysrMHggc3RhbmRhcmQgd2lsbCBsaWZ0IHRoaXMKK3Jlc3RyaWN0aW9uLiAgT25jZSB0aGlzIGZlYXR1cmUgaXMgd2lkZWx5IHN1cHBvcnRlZCBieSBjb21waWxlcnMsIHdlCitjYW4gcmV2aXNpdCB0aGUgaW1wbGVtZW50YXRpb24gYW5kIGFkZCBzdXBwb3J0IGZvciB1c2luZyBgQUNUSU9OKigpYAoraW5zaWRlIGEgZnVuY3Rpb24uCisKK0MrKzB4IHdpbGwgYWxzbyBzdXBwb3J0IGxhbWJkYSBleHByZXNzaW9ucy4gIFdoZW4gdGhleSBiZWNvbWUKK2F2YWlsYWJsZSwgd2UgbWF5IHdhbnQgdG8gc3VwcG9ydCB1c2luZyBsYW1iZGFzIGFzIGFjdGlvbnMuCisKKyMgTWFjcm9zIGZvciBEZWZpbmluZyBNYXRjaGVycyAjCisKK09uY2UgdGhlIG1hY3JvcyBmb3IgZGVmaW5pbmcgYWN0aW9ucyBhcmUgaW1wbGVtZW50ZWQsIHdlIHBsYW4gdG8gZG8KK3RoZSBzYW1lIGZvciBtYXRjaGVyczoKKworYGBgCitNQVRDSEVSKG5hbWUpIHsgc3RhdGVtZW50czsgfQorYGBgCisKK3doZXJlIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYXMgYGFyZ2AuICBGb3IgZXhhbXBsZSwKK2dpdmVuOgorCitgYGAKK01BVENIRVIoSXNQb3NpdGl2ZSkgeyByZXR1cm4gYXJnID4gMDsgfQorYGBgCisKK3lvdSBjYW4gdXNlIGBJc1Bvc2l0aXZlKClgIGFzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSB2YWx1ZSBpZmYgaXQgaXMKK2dyZWF0ZXIgdGhhbiAwLgorCitXZSB3aWxsIGFsc28gYWRkIGBNQVRDSEVSX1BgLCBgTUFUQ0hFUl9QMmAsIGFuZCBldGMgZm9yIHBhcmFtZXRlcml6ZWQKK21hdGNoZXJzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL0Rldkd1aWRlLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvRGV2R3VpZGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5ZTY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL0Rldkd1aWRlLm1kCkBAIC0wLDAgKzEsMTMyIEBACisKKworSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHVuZGVyc3RhbmRpbmcgdGhlIGludGVybmFscyBvZiBHb29nbGUgTW9jaywKK2J1aWxkaW5nIGZyb20gc291cmNlLCBvciBjb250cmlidXRpbmcgaWRlYXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUKK3Byb2plY3QsIHRoZW4gdGhpcyBkb2N1bWVudCBpcyBmb3IgeW91LgorCisjIEludHJvZHVjdGlvbiAjCisKK0ZpcnN0LCBsZXQncyBnaXZlIHlvdSBzb21lIGJhY2tncm91bmQgb2YgdGhlIHByb2plY3QuCisKKyMjIExpY2Vuc2luZyAjIworCitBbGwgR29vZ2xlIE1vY2sgc291cmNlIGFuZCBwcmUtYnVpbHQgcGFja2FnZXMgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSBbTmV3IEJTRCBMaWNlbnNlXShodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkuCisKKyMjIFRoZSBHb29nbGUgTW9jayBDb21tdW5pdHkgIyMKKworVGhlIEdvb2dsZSBNb2NrIGNvbW11bml0eSBleGlzdHMgcHJpbWFyaWx5IHRocm91Z2ggdGhlIFtkaXNjdXNzaW9uIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xlbW9jayksIHRoZQorW2lzc3VlIHRyYWNrZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL2lzc3Vlcy9saXN0KSBhbmQsIHRvIGEgbGVzc2VyIGV4dGVudCwgdGhlIFtzb3VyY2UgY29udHJvbCByZXBvc2l0b3J5XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9zb3VyY2UvY2hlY2tvdXQpLiBZb3UgYXJlIGRlZmluaXRlbHkgZW5jb3VyYWdlZCB0byBjb250cmlidXRlIHRvIHRoZQorZGlzY3Vzc2lvbiBhbmQgeW91IGNhbiBhbHNvIGhlbHAgdXMgdG8ga2VlcCB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUKK2dyb3VwIGhpZ2ggYnkgZm9sbG93aW5nIGFuZCBwcm9tb3RpbmcgdGhlIGd1aWRlbGluZXMgbGlzdGVkIGhlcmUuCisKKyMjIyBQbGVhc2UgQmUgRnJpZW5kbHkgIyMjCisKK1Nob3dpbmcgY291cnRlc3kgYW5kIHJlc3BlY3QgdG8gb3RoZXJzIGlzIGEgdml0YWwgcGFydCBvZiB0aGUgR29vZ2xlCitjdWx0dXJlLCBhbmQgd2Ugc3Ryb25nbHkgZW5jb3VyYWdlIGV2ZXJ5b25lIHBhcnRpY2lwYXRpbmcgaW4gR29vZ2xlCitNb2NrIGRldmVsb3BtZW50IHRvIGpvaW4gdXMgaW4gYWNjZXB0aW5nIG5vdGhpbmcgbGVzcy4gT2YgY291cnNlLAorYmVpbmcgY291cnRlb3VzIGlzIG5vdCB0aGUgc2FtZSBhcyBmYWlsaW5nIHRvIGNvbnN0cnVjdGl2ZWx5IGRpc2FncmVlCit3aXRoIGVhY2ggb3RoZXIsIGJ1dCBpdCBkb2VzIG1lYW4gdGhhdCB3ZSBzaG91bGQgYmUgcmVzcGVjdGZ1bCBvZiBlYWNoCitvdGhlciB3aGVuIGVudW1lcmF0aW5nIHRoZSA0MiB0ZWNobmljYWwgcmVhc29ucyB0aGF0IGEgcGFydGljdWxhcgorcHJvcG9zYWwgbWF5IG5vdCBiZSB0aGUgYmVzdCBjaG9pY2UuIFRoZXJlJ3MgbmV2ZXIgYSByZWFzb24gdG8gYmUKK2FudGFnb25pc3RpYyBvciBkaXNtaXNzaXZlIHRvd2FyZCBhbnlvbmUgd2hvIGlzIHNpbmNlcmVseSB0cnlpbmcgdG8KK2NvbnRyaWJ1dGUgdG8gYSBkaXNjdXNzaW9uLgorCitTdXJlLCBDKysgdGVzdGluZyBpcyBzZXJpb3VzIGJ1c2luZXNzIGFuZCBhbGwgdGhhdCwgYnV0IGl0J3MgYWxzbworYSBsb3Qgb2YgZnVuLiBMZXQncyBrZWVwIGl0IHRoYXQgd2F5LiBMZXQncyBzdHJpdmUgdG8gYmUgb25lIG9mIHRoZQorZnJpZW5kbGllc3QgY29tbXVuaXRpZXMgaW4gYWxsIG9mIG9wZW4gc291cmNlLgorCisjIyMgV2hlcmUgdG8gRGlzY3VzcyBHb29nbGUgTW9jayAjIyMKKworQXMgYWx3YXlzLCBkaXNjdXNzIEdvb2dsZSBNb2NrIGluIHRoZSBvZmZpY2lhbCBbR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yayBkaXNjdXNzaW9uIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xlbW9jaykuICBZb3UgZG9uJ3QgaGF2ZSB0byBhY3R1YWxseSBzdWJtaXQKK2NvZGUgaW4gb3JkZXIgdG8gc2lnbiB1cC4gWW91ciBwYXJ0aWNpcGF0aW9uIGl0c2VsZiBpcyBhIHZhbHVhYmxlCitjb250cmlidXRpb24uCisKKyMgV29ya2luZyB3aXRoIHRoZSBDb2RlICMKKworSWYgeW91IHdhbnQgdG8gZ2V0IHlvdXIgaGFuZHMgZGlydHkgd2l0aCB0aGUgY29kZSBpbnNpZGUgR29vZ2xlIE1vY2ssCit0aGlzIGlzIHRoZSBzZWN0aW9uIGZvciB5b3UuCisKKyMjIENoZWNraW5nIE91dCB0aGUgU291cmNlIGZyb20gU3VidmVyc2lvbiAjIworCitDaGVja2luZyBvdXQgdGhlIEdvb2dsZSBNb2NrIHNvdXJjZSBpcyBtb3N0IHVzZWZ1bCBpZiB5b3UgcGxhbiB0bwordHdlYWsgaXQgeW91cnNlbGYuICBZb3UgY2hlY2sgb3V0IHRoZSBzb3VyY2UgZm9yIEdvb2dsZSBNb2NrIHVzaW5nIGEKK1tTdWJ2ZXJzaW9uXShodHRwOi8vc3VidmVyc2lvbi50aWdyaXMub3JnLykgY2xpZW50IGFzIHlvdSB3b3VsZCBmb3IgYW55CitvdGhlciBwcm9qZWN0IGhvc3RlZCBvbiBHb29nbGUgQ29kZS4gIFBsZWFzZSBzZWUgdGhlIGluc3RydWN0aW9uIG9uCit0aGUgW3NvdXJjZSBjb2RlIGFjY2VzcyBwYWdlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9zb3VyY2UvY2hlY2tvdXQpIGZvciBob3cgdG8gZG8gaXQuCisKKyMjIENvbXBpbGluZyBmcm9tIFNvdXJjZSAjIworCitPbmNlIHlvdSBjaGVjayBvdXQgdGhlIGNvZGUsIHlvdSBjYW4gZmluZCBpbnN0cnVjdGlvbnMgb24gaG93IHRvCitjb21waWxlIGl0IGluIHRoZSBbUkVBRE1FXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9zb3VyY2UvYnJvd3NlL3RydW5rL1JFQURNRSkgZmlsZS4KKworIyMgVGVzdGluZyAjIworCitBIG1vY2tpbmcgZnJhbWV3b3JrIGlzIG9mIG5vIGdvb2QgaWYgaXRzZWxmIGlzIG5vdCB0aG9yb3VnaGx5IHRlc3RlZC4KK1Rlc3RzIHNob3VsZCBiZSB3cml0dGVuIGZvciBhbnkgbmV3IGNvZGUsIGFuZCBjaGFuZ2VzIHNob3VsZCBiZQordmVyaWZpZWQgdG8gbm90IGJyZWFrIGV4aXN0aW5nIHRlc3RzIGJlZm9yZSB0aGV5IGFyZSBzdWJtaXR0ZWQgZm9yCityZXZpZXcuIFRvIHBlcmZvcm0gdGhlIHRlc3RzLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiBbUkVBRE1FXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9zb3VyY2UvYnJvd3NlL3RydW5rL1JFQURNRSkgYW5kCit2ZXJpZnkgdGhhdCB0aGVyZSBhcmUgbm8gZmFpbHVyZXMuCisKKyMgQ29udHJpYnV0aW5nIENvZGUgIworCitXZSBhcmUgZXhjaXRlZCB0aGF0IEdvb2dsZSBNb2NrIGlzIG5vdyBvcGVuIHNvdXJjZSwgYW5kIGhvcGUgdG8gZ2V0CitncmVhdCBwYXRjaGVzIGZyb20gdGhlIGNvbW11bml0eS4gQmVmb3JlIHlvdSBmaXJlIHVwIHlvdXIgZmF2b3JpdGUgSURFCithbmQgYmVnaW4gaGFtbWVyaW5nIGF3YXkgYXQgdGhhdCBuZXcgZmVhdHVyZSwgdGhvdWdoLCBwbGVhc2UgdGFrZSB0aGUKK3RpbWUgdG8gcmVhZCB0aGlzIHNlY3Rpb24gYW5kIHVuZGVyc3RhbmQgdGhlIHByb2Nlc3MuIFdoaWxlIGl0IHNlZW1zCityaWdvcm91cywgd2Ugd2FudCB0byBrZWVwIGEgaGlnaCBzdGFuZGFyZCBvZiBxdWFsaXR5IGluIHRoZSBjb2RlCitiYXNlLgorCisjIyBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudHMgIyMKKworWW91IG11c3Qgc2lnbiBhIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpIGJlZm9yZSB3ZSBjYW4KK2FjY2VwdCBhbnkgY29kZS4gIFRoZSBDTEEgcHJvdGVjdHMgeW91IGFuZCB1cy4KKworICAqIElmIHlvdSBhcmUgYW4gaW5kaXZpZHVhbCB3cml0aW5nIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGFuZCB5b3UncmUgc3VyZSB5b3Ugb3duIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHksIHRoZW4geW91J2xsIG5lZWQgdG8gc2lnbiBhbiBbaW5kaXZpZHVhbCBDTEFdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vbGVnYWwvaW5kaXZpZHVhbC1jbGEtdjEuMC5odG1sKS4KKyAgKiBJZiB5b3Ugd29yayBmb3IgYSBjb21wYW55IHRoYXQgd2FudHMgdG8gYWxsb3cgeW91IHRvIGNvbnRyaWJ1dGUgeW91ciB3b3JrIHRvIEdvb2dsZSBNb2NrLCB0aGVuIHlvdSdsbCBuZWVkIHRvIHNpZ24gYSBbY29ycG9yYXRlIENMQV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9sZWdhbC9jb3Jwb3JhdGUtY2xhLXYxLjAuaHRtbCkuCisKK0ZvbGxvdyBlaXRoZXIgb2YgdGhlIHR3byBsaW5rcyBhYm92ZSB0byBhY2Nlc3MgdGhlIGFwcHJvcHJpYXRlIENMQSBhbmQKK2luc3RydWN0aW9ucyBmb3IgaG93IHRvIHNpZ24gYW5kIHJldHVybiBpdC4KKworIyMgQ29kaW5nIFN0eWxlICMjCisKK1RvIGtlZXAgdGhlIHNvdXJjZSBjb25zaXN0ZW50LCByZWFkYWJsZSwgZGlmZmFibGUgYW5kIGVhc3kgdG8gbWVyZ2UsCit3ZSB1c2UgYSBmYWlybHkgcmlnaWQgY29kaW5nIHN0eWxlLCBhcyBkZWZpbmVkIGJ5IHRoZSBbZ29vZ2xlLXN0eWxlZ3VpZGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtc3R5bGVndWlkZS8pIHByb2plY3QuICBBbGwgcGF0Y2hlcyB3aWxsIGJlIGV4cGVjdGVkCit0byBjb25mb3JtIHRvIHRoZSBzdHlsZSBvdXRsaW5lZCBbaGVyZV0oaHR0cDovL2dvb2dsZS1zdHlsZWd1aWRlLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9jcHBndWlkZS54bWwpLgorCisjIyBTdWJtaXR0aW5nIFBhdGNoZXMgIyMKKworUGxlYXNlIGRvIHN1Ym1pdCBjb2RlLiBIZXJlJ3Mgd2hhdCB5b3UgbmVlZCB0byBkbzoKKworICAxLiBOb3JtYWxseSB5b3Ugc2hvdWxkIG1ha2UgeW91ciBjaGFuZ2UgYWdhaW5zdCB0aGUgU1ZOIHRydW5rIGluc3RlYWQgb2YgYSBicmFuY2ggb3IgYSB0YWcsIGFzIHRoZSBsYXR0ZXIgdHdvIGFyZSBmb3IgcmVsZWFzZSBjb250cm9sIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBtb3N0bHkgYXMgcmVhZC1vbmx5LgorICAxLiBEZWNpZGUgd2hpY2ggY29kZSB5b3Ugd2FudCB0byBzdWJtaXQuIEEgc3VibWlzc2lvbiBzaG91bGQgYmUgYSBzZXQgb2YgY2hhbmdlcyB0aGF0IGFkZHJlc3NlcyBvbmUgaXNzdWUgaW4gdGhlIFtHb29nbGUgTW9jayBpc3N1ZSB0cmFja2VyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9pc3N1ZXMvbGlzdCkuIFBsZWFzZSBkb24ndCBtaXggbW9yZSB0aGFuIG9uZSBsb2dpY2FsIGNoYW5nZSBwZXIgc3VibWl0dGFsLCBiZWNhdXNlIGl0IG1ha2VzIHRoZSBoaXN0b3J5IGhhcmQgdG8gZm9sbG93LiBJZiB5b3Ugd2FudCB0byBtYWtlIGEgY2hhbmdlIHRoYXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBpc3N1ZSBpbiB0aGUgaXNzdWUgdHJhY2tlciwgcGxlYXNlIGNyZWF0ZSBvbmUuCisgIDEuIEFsc28sIGNvb3JkaW5hdGUgd2l0aCB0ZWFtIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIG9uIHRoZSBpc3N1ZSBpbiBxdWVzdGlvbi4gVGhpcyBlbnN1cmVzIHRoYXQgd29yayBpc24ndCBiZWluZyBkdXBsaWNhdGVkIGFuZCBjb21tdW5pY2F0aW5nIHlvdXIgcGxhbiBlYXJseSBhbHNvIGdlbmVyYWxseSBsZWFkcyB0byBiZXR0ZXIgcGF0Y2hlcy4KKyAgMS4gRW5zdXJlIHRoYXQgeW91ciBjb2RlIGFkaGVyZXMgdG8gdGhlIFtHb29nbGUgTW9jayBzb3VyY2UgY29kZSBzdHlsZV0oI0NvZGluZ19TdHlsZS5tZCkuCisgIDEuIEVuc3VyZSB0aGF0IHRoZXJlIGFyZSB1bml0IHRlc3RzIGZvciB5b3VyIGNvZGUuCisgIDEuIFNpZ24gYSBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudC4KKyAgMS4gQ3JlYXRlIGEgcGF0Y2ggZmlsZSB1c2luZyBgc3ZuIGRpZmZgLgorICAxLiBXZSB1c2UgW1JpZXR2ZWxkXShodHRwOi8vY29kZXJldmlldy5hcHBzcG90LmNvbS8pIHRvIGRvIHdlYi1iYXNlZCBjb2RlIHJldmlld3MuICBZb3UgY2FuIHJlYWQgYWJvdXQgdGhlIHRvb2wgW2hlcmVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9yaWV0dmVsZC93aWtpL0NvZGVSZXZpZXdIZWxwKS4gIFdoZW4geW91IGFyZSByZWFkeSwgdXBsb2FkIHlvdXIgcGF0Y2ggdmlhIFJpZXR2ZWxkIGFuZCBub3RpZnkgYGdvb2dsZW1vY2tAZ29vZ2xlZ3JvdXBzLmNvbWAgdG8gcmV2aWV3IGl0LiAgVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byB1cGxvYWQgdGhlIHBhdGNoLiAgV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBbdXBsb2FkXF9nbW9jay5weV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svc291cmNlL2Jyb3dzZS90cnVuay9zY3JpcHRzL3VwbG9hZF9nbW9jay5weSkgc2NyaXB0LCB3aGljaCB5b3UgY2FuIGZpbmQgaW4gdGhlIGBzY3JpcHRzL2AgZm9sZGVyIGluIHRoZSBTVk4gdHJ1bmsuCisKKyMjIEdvb2dsZSBNb2NrIENvbW1pdHRlcnMgIyMKKworVGhlIGN1cnJlbnQgbWVtYmVycyBvZiB0aGUgR29vZ2xlIE1vY2sgZW5naW5lZXJpbmcgdGVhbSBhcmUgdGhlIG9ubHkKK2NvbW1pdHRlcnMgYXQgcHJlc2VudC4gSW4gdGhlIGdyZWF0IHRyYWRpdGlvbiBvZiBlYXRpbmcgb25lJ3Mgb3duCitkb2dmb29kLCB3ZSB3aWxsIGJlIHJlcXVpcmluZyBlYWNoIG5ldyBHb29nbGUgTW9jayBlbmdpbmVlcmluZyB0ZWFtCittZW1iZXIgdG8gZWFybiB0aGUgcmlnaHQgdG8gYmVjb21lIGEgY29tbWl0dGVyIGJ5IGZvbGxvd2luZyB0aGUKK3Byb2NlZHVyZXMgaW4gdGhpcyBkb2N1bWVudCwgd3JpdGluZyBjb25zaXN0ZW50bHkgZ3JlYXQgY29kZSwgYW5kCitkZW1vbnN0cmF0aW5nIHJlcGVhdGVkbHkgdGhhdCBoZSBvciBzaGUgdHJ1bHkgZ2V0cyB0aGUgemVuIG9mIEdvb2dsZQorTW9jay4KKworIyBSZWxlYXNlIFByb2Nlc3MgIworCitXZSBmb2xsb3cgdGhlIHR5cGljYWwgcmVsZWFzZSBwcm9jZXNzIGZvciBTdWJ2ZXJzaW9uLWJhc2VkIHByb2plY3RzOgorCisgIDEuIEEgcmVsZWFzZSBicmFuY2ggbmFtZWQgYHJlbGVhc2UtWC5ZYCBpcyBjcmVhdGVkLgorICAxLiBCdWdzIGFyZSBmaXhlZCBhbmQgZmVhdHVyZXMgYXJlIGFkZGVkIGluIHRydW5rOyB0aG9zZSBpbmRpdmlkdWFsIHBhdGNoZXMgYXJlIG1lcmdlZCBpbnRvIHRoZSByZWxlYXNlIGJyYW5jaCB1bnRpbCBpdCdzIHN0YWJsZS4KKyAgMS4gQW4gaW5kaXZpZHVhbCBwb2ludCByZWxlYXNlICh0aGUgYFpgIGluIGBYLlkuWmApIGlzIG1hZGUgYnkgY3JlYXRpbmcgYSB0YWcgZnJvbSB0aGUgYnJhbmNoLgorICAxLiBSZXBlYXQgc3RlcHMgMiBhbmQgMyB0aHJvdWdob3V0IG9uZSByZWxlYXNlIGN5Y2xlIChhcyBkZXRlcm1pbmVkIGJ5IGZlYXR1cmVzIG9yIHRpbWUpLgorICAxLiBHbyBiYWNrIHRvIHN0ZXAgMSB0byBjcmVhdGUgYW5vdGhlciByZWxlYXNlIGJyYW5jaCBhbmQgc28gb24uCisKKworLS0tCisKK1RoaXMgcGFnZSBpcyBiYXNlZCBvbiB0aGUgW01ha2luZyBHV1QgQmV0dGVyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3dlYnRvb2xraXQvbWFraW5nZ3d0YmV0dGVyLmh0bWwpIGd1aWRlIGZyb20gdGhlIFtHb29nbGUgV2ViIFRvb2xraXRdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vd2VidG9vbGtpdC8pIHByb2plY3QuICBFeGNlcHQgYXMgb3RoZXJ3aXNlIFtub3RlZF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wb2xpY2llcy5odG1sI3Jlc3RyaWN0aW9ucyksIHRoZSBjb250ZW50IG9mIHRoaXMgcGFnZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgW0NyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41IExpY2Vuc2VdKGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8pLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL0RvY3VtZW50YXRpb24ubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9Eb2N1bWVudGF0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMGVkNTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9Eb2N1bWVudGF0aW9uLm1kCkBAIC0wLDAgKzEsMTIgQEAKK1RoaXMgcGFnZSBsaXN0cyBhbGwgZG9jdW1lbnRhdGlvbiB3aWtpIHBhZ2VzIGZvciBHb29nbGUgTW9jayAqKih0aGUgU1ZOIHRydW5rIHZlcnNpb24pKioKKy0gKippZiB5b3UgdXNlIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBHb29nbGUgTW9jaywgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgdmVyc2lvbiBpbnN0ZWFkLioqCisKKyAgKiBbRm9yRHVtbWllc10oRm9yRHVtbWllcy5tZCkgLS0gc3RhcnQgaGVyZSBpZiB5b3UgYXJlIG5ldyB0byBHb29nbGUgTW9jay4KKyAgKiBbQ2hlYXRTaGVldF0oQ2hlYXRTaGVldC5tZCkgLS0gYSBxdWljayByZWZlcmVuY2UuCisgICogW0Nvb2tCb29rXShDb29rQm9vay5tZCkgLS0gcmVjaXBlcyBmb3IgZG9pbmcgdmFyaW91cyB0YXNrcyB1c2luZyBHb29nbGUgTW9jay4KKyAgKiBbRnJlcXVlbnRseUFza2VkUXVlc3Rpb25zXShGcmVxdWVudGx5QXNrZWRRdWVzdGlvbnMubWQpIC0tIGNoZWNrIGhlcmUgYmVmb3JlIGFza2luZyBhIHF1ZXN0aW9uIG9uIHRoZSBtYWlsaW5nIGxpc3QuCisKK1RvIGNvbnRyaWJ1dGUgY29kZSB0byBHb29nbGUgTW9jaywgcmVhZDoKKworICAqIFtEZXZHdWlkZV0oRGV2R3VpZGUubWQpIC0tIHJlYWQgdGhpcyBfYmVmb3JlXyB3cml0aW5nIHlvdXIgZmlyc3QgcGF0Y2guCisgICogW1B1bXAgTWFudWFsXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1B1bXBNYW51YWwpIC0tIGhvdyB3ZSBnZW5lcmF0ZSBzb21lIG9mIEdvb2dsZSBNb2NrJ3Mgc291cmNlIGZpbGVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL0ZvckR1bW1pZXMubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9Gb3JEdW1taWVzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzFiYTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9Gb3JEdW1taWVzLm1kCkBAIC0wLDAgKzEsNDM5IEBACisKKworKCoqTm90ZToqKiBJZiB5b3UgZ2V0IGNvbXBpbGVyIGVycm9ycyB0aGF0IHlvdSBkb24ndCB1bmRlcnN0YW5kLCBiZSBzdXJlIHRvIGNvbnN1bHQgW0dvb2dsZSBNb2NrIERvY3Rvcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9GcmVxdWVudGx5QXNrZWRRdWVzdGlvbnMjSG93X2FtX0lfc3VwcG9zZWRfdG9fbWFrZV9zZW5zZV9vZl90aGVzZV9ob3JyaWJsZV90ZW1wbGF0ZV9lcnJvcikuKQorCisjIFdoYXQgSXMgR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yaz8gIworV2hlbiB5b3Ugd3JpdGUgYSBwcm90b3R5cGUgb3IgdGVzdCwgb2Z0ZW4gaXQncyBub3QgZmVhc2libGUgb3Igd2lzZSB0byByZWx5IG9uIHJlYWwgb2JqZWN0cyBlbnRpcmVseS4gQSAqKm1vY2sgb2JqZWN0KiogaW1wbGVtZW50cyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgYSByZWFsIG9iamVjdCAoc28gaXQgY2FuIGJlIHVzZWQgYXMgb25lKSwgYnV0IGxldHMgeW91IHNwZWNpZnkgYXQgcnVuIHRpbWUgaG93IGl0IHdpbGwgYmUgdXNlZCBhbmQgd2hhdCBpdCBzaG91bGQgZG8gKHdoaWNoIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQ/IGluIHdoaWNoIG9yZGVyPyBob3cgbWFueSB0aW1lcz8gd2l0aCB3aGF0IGFyZ3VtZW50cz8gd2hhdCB3aWxsIHRoZXkgcmV0dXJuPyBldGMpLgorCisqKk5vdGU6KiogSXQgaXMgZWFzeSB0byBjb25mdXNlIHRoZSB0ZXJtIF9mYWtlIG9iamVjdHNfIHdpdGggbW9jayBvYmplY3RzLiBGYWtlcyBhbmQgbW9ja3MgYWN0dWFsbHkgbWVhbiB2ZXJ5IGRpZmZlcmVudCB0aGluZ3MgaW4gdGhlIFRlc3QtRHJpdmVuIERldmVsb3BtZW50IChUREQpIGNvbW11bml0eToKKworICAqICoqRmFrZSoqIG9iamVjdHMgaGF2ZSB3b3JraW5nIGltcGxlbWVudGF0aW9ucywgYnV0IHVzdWFsbHkgdGFrZSBzb21lIHNob3J0Y3V0IChwZXJoYXBzIHRvIG1ha2UgdGhlIG9wZXJhdGlvbnMgbGVzcyBleHBlbnNpdmUpLCB3aGljaCBtYWtlcyB0aGVtIG5vdCBzdWl0YWJsZSBmb3IgcHJvZHVjdGlvbi4gQW4gaW4tbWVtb3J5IGZpbGUgc3lzdGVtIHdvdWxkIGJlIGFuIGV4YW1wbGUgb2YgYSBmYWtlLgorICAqICoqTW9ja3MqKiBhcmUgb2JqZWN0cyBwcmUtcHJvZ3JhbW1lZCB3aXRoIF9leHBlY3RhdGlvbnNfLCB3aGljaCBmb3JtIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgY2FsbHMgdGhleSBhcmUgZXhwZWN0ZWQgdG8gcmVjZWl2ZS4KKworSWYgYWxsIHRoaXMgc2VlbXMgdG9vIGFic3RyYWN0IGZvciB5b3UsIGRvbid0IHdvcnJ5IC0gdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nIHRvIHJlbWVtYmVyIGlzIHRoYXQgYSBtb2NrIGFsbG93cyB5b3UgdG8gY2hlY2sgdGhlIF9pbnRlcmFjdGlvbl8gYmV0d2VlbiBpdHNlbGYgYW5kIGNvZGUgdGhhdCB1c2VzIGl0LiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGZha2VzIGFuZCBtb2NrcyB3aWxsIGJlY29tZSBtdWNoIGNsZWFyZXIgb25jZSB5b3Ugc3RhcnQgdG8gdXNlIG1vY2tzLgorCisqKkdvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcmsqKiAob3IgKipHb29nbGUgTW9jayoqIGZvciBzaG9ydCkgaXMgYSBsaWJyYXJ5IChzb21ldGltZXMgd2UgYWxzbyBjYWxsIGl0IGEgImZyYW1ld29yayIgdG8gbWFrZSBpdCBzb3VuZCBjb29sKSBmb3IgY3JlYXRpbmcgbW9jayBjbGFzc2VzIGFuZCB1c2luZyB0aGVtLiBJdCBkb2VzIHRvIEMrKyB3aGF0IFtqTW9ja10oaHR0cDovL3d3dy5qbW9jay5vcmcvKSBhbmQgW0Vhc3lNb2NrXShodHRwOi8vd3d3LmVhc3ltb2NrLm9yZy8pIGRvIHRvIEphdmEuCisKK1VzaW5nIEdvb2dsZSBNb2NrIGludm9sdmVzIHRocmVlIGJhc2ljIHN0ZXBzOgorCisgIDEuIFVzZSBzb21lIHNpbXBsZSBtYWNyb3MgdG8gZGVzY3JpYmUgdGhlIGludGVyZmFjZSB5b3Ugd2FudCB0byBtb2NrLCBhbmQgdGhleSB3aWxsIGV4cGFuZCB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgeW91ciBtb2NrIGNsYXNzOworICAxLiBDcmVhdGUgc29tZSBtb2NrIG9iamVjdHMgYW5kIHNwZWNpZnkgaXRzIGV4cGVjdGF0aW9ucyBhbmQgYmVoYXZpb3IgdXNpbmcgYW4gaW50dWl0aXZlIHN5bnRheDsKKyAgMS4gRXhlcmNpc2UgY29kZSB0aGF0IHVzZXMgdGhlIG1vY2sgb2JqZWN0cy4gR29vZ2xlIE1vY2sgd2lsbCBjYXRjaCBhbnkgdmlvbGF0aW9uIG9mIHRoZSBleHBlY3RhdGlvbnMgYXMgc29vbiBhcyBpdCBhcmlzZXMuCisKKyMgV2h5IEdvb2dsZSBNb2NrPyAjCitXaGlsZSBtb2NrIG9iamVjdHMgaGVscCB5b3UgcmVtb3ZlIHVubmVjZXNzYXJ5IGRlcGVuZGVuY2llcyBpbiB0ZXN0cyBhbmQgbWFrZSB0aGVtIGZhc3QgYW5kIHJlbGlhYmxlLCB1c2luZyBtb2NrcyBtYW51YWxseSBpbiBDKysgaXMgX2hhcmRfOgorCisgICogU29tZW9uZSBoYXMgdG8gaW1wbGVtZW50IHRoZSBtb2Nrcy4gVGhlIGpvYiBpcyB1c3VhbGx5IHRlZGlvdXMgYW5kIGVycm9yLXByb25lLiBObyB3b25kZXIgcGVvcGxlIGdvIGdyZWF0IGRpc3RhbmNlIHRvIGF2b2lkIGl0LgorICAqIFRoZSBxdWFsaXR5IG9mIHRob3NlIG1hbnVhbGx5IHdyaXR0ZW4gbW9ja3MgaXMgYSBiaXQsIHVoLCB1bnByZWRpY3RhYmxlLiBZb3UgbWF5IHNlZSBzb21lIHJlYWxseSBwb2xpc2hlZCBvbmVzLCBidXQgeW91IG1heSBhbHNvIHNlZSBzb21lIHRoYXQgd2VyZSBoYWNrZWQgdXAgaW4gYSBodXJyeSBhbmQgaGF2ZSBhbGwgc29ydHMgb2YgYWQgaG9jIHJlc3RyaWN0aW9ucy4KKyAgKiBUaGUga25vd2xlZGdlIHlvdSBnYWluZWQgZnJvbSB1c2luZyBvbmUgbW9jayBkb2Vzbid0IHRyYW5zZmVyIHRvIHRoZSBuZXh0LgorCitJbiBjb250cmFzdCwgSmF2YSBhbmQgUHl0aG9uIHByb2dyYW1tZXJzIGhhdmUgc29tZSBmaW5lIG1vY2sgZnJhbWV3b3Jrcywgd2hpY2ggYXV0b21hdGUgdGhlIGNyZWF0aW9uIG9mIG1vY2tzLiBBcyBhIHJlc3VsdCwgbW9ja2luZyBpcyBhIHByb3ZlbiBlZmZlY3RpdmUgdGVjaG5pcXVlIGFuZCB3aWRlbHkgYWRvcHRlZCBwcmFjdGljZSBpbiB0aG9zZSBjb21tdW5pdGllcy4gSGF2aW5nIHRoZSByaWdodCB0b29sIGFic29sdXRlbHkgbWFrZXMgdGhlIGRpZmZlcmVuY2UuCisKK0dvb2dsZSBNb2NrIHdhcyBidWlsdCB0byBoZWxwIEMrKyBwcm9ncmFtbWVycy4gSXQgd2FzIGluc3BpcmVkIGJ5IFtqTW9ja10oaHR0cDovL3d3dy5qbW9jay5vcmcvKSBhbmQgW0Vhc3lNb2NrXShodHRwOi8vd3d3LmVhc3ltb2NrLm9yZy8pLCBidXQgZGVzaWduZWQgd2l0aCBDKysncyBzcGVjaWZpY3MgaW4gbWluZC4gSXQgaXMgeW91ciBmcmllbmQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgcHJvYmxlbXMgaXMgYm90aGVyaW5nIHlvdToKKworICAqIFlvdSBhcmUgc3R1Y2sgd2l0aCBhIHN1Yi1vcHRpbWFsIGRlc2lnbiBhbmQgd2lzaCB5b3UgaGFkIGRvbmUgbW9yZSBwcm90b3R5cGluZyBiZWZvcmUgaXQgd2FzIHRvbyBsYXRlLCBidXQgcHJvdG90eXBpbmcgaW4gQysrIGlzIGJ5IG5vIG1lYW5zICJyYXBpZCIuCisgICogWW91ciB0ZXN0cyBhcmUgc2xvdyBhcyB0aGV5IGRlcGVuZCBvbiB0b28gbWFueSBsaWJyYXJpZXMgb3IgdXNlIGV4cGVuc2l2ZSByZXNvdXJjZXMgKGUuZy4gYSBkYXRhYmFzZSkuCisgICogWW91ciB0ZXN0cyBhcmUgYnJpdHRsZSBhcyBzb21lIHJlc291cmNlcyB0aGV5IHVzZSBhcmUgdW5yZWxpYWJsZSAoZS5nLiB0aGUgbmV0d29yaykuCisgICogWW91IHdhbnQgdG8gdGVzdCBob3cgeW91ciBjb2RlIGhhbmRsZXMgYSBmYWlsdXJlIChlLmcuIGEgZmlsZSBjaGVja3N1bSBlcnJvciksIGJ1dCBpdCdzIG5vdCBlYXN5IHRvIGNhdXNlIG9uZS4KKyAgKiBZb3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB5b3VyIG1vZHVsZSBpbnRlcmFjdHMgd2l0aCBvdGhlciBtb2R1bGVzIGluIHRoZSByaWdodCB3YXksIGJ1dCBpdCdzIGhhcmQgdG8gb2JzZXJ2ZSB0aGUgaW50ZXJhY3Rpb247IHRoZXJlZm9yZSB5b3UgcmVzb3J0IHRvIG9ic2VydmluZyB0aGUgc2lkZSBlZmZlY3RzIGF0IHRoZSBlbmQgb2YgdGhlIGFjdGlvbiwgd2hpY2ggaXMgYXdrd2FyZCBhdCBiZXN0LgorICAqIFlvdSB3YW50IHRvICJtb2NrIG91dCIgeW91ciBkZXBlbmRlbmNpZXMsIGV4Y2VwdCB0aGF0IHRoZXkgZG9uJ3QgaGF2ZSBtb2NrIGltcGxlbWVudGF0aW9ucyB5ZXQ7IGFuZCwgZnJhbmtseSwgeW91IGFyZW4ndCB0aHJpbGxlZCBieSBzb21lIG9mIHRob3NlIGhhbmQtd3JpdHRlbiBtb2Nrcy4KKworV2UgZW5jb3VyYWdlIHlvdSB0byB1c2UgR29vZ2xlIE1vY2sgYXM6CisKKyAgKiBhIF9kZXNpZ25fIHRvb2wsIGZvciBpdCBsZXRzIHlvdSBleHBlcmltZW50IHdpdGggeW91ciBpbnRlcmZhY2UgZGVzaWduIGVhcmx5IGFuZCBvZnRlbi4gTW9yZSBpdGVyYXRpb25zIGxlYWQgdG8gYmV0dGVyIGRlc2lnbnMhCisgICogYSBfdGVzdGluZ18gdG9vbCB0byBjdXQgeW91ciB0ZXN0cycgb3V0Ym91bmQgZGVwZW5kZW5jaWVzIGFuZCBwcm9iZSB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB5b3VyIG1vZHVsZSBhbmQgaXRzIGNvbGxhYm9yYXRvcnMuCisKKyMgR2V0dGluZyBTdGFydGVkICMKK1VzaW5nIEdvb2dsZSBNb2NrIGlzIGVhc3khIEluc2lkZSB5b3VyIEMrKyBzb3VyY2UgZmlsZSwganVzdCAjaW5jbHVkZSBgImd0ZXN0L2d0ZXN0LmgiYCBhbmQgYCJnbW9jay9nbW9jay5oImAsIGFuZCB5b3UgYXJlIHJlYWR5IHRvIGdvLgorCisjIEEgQ2FzZSBmb3IgTW9jayBUdXJ0bGVzICMKK0xldCdzIGxvb2sgYXQgYW4gZXhhbXBsZS4gU3VwcG9zZSB5b3UgYXJlIGRldmVsb3BpbmcgYSBncmFwaGljcyBwcm9ncmFtIHRoYXQgcmVsaWVzIG9uIGEgTE9HTy1saWtlIEFQSSBmb3IgZHJhd2luZy4gSG93IHdvdWxkIHlvdSB0ZXN0IHRoYXQgaXQgZG9lcyB0aGUgcmlnaHQgdGhpbmc/IFdlbGwsIHlvdSBjYW4gcnVuIGl0IGFuZCBjb21wYXJlIHRoZSBzY3JlZW4gd2l0aCBhIGdvbGRlbiBzY3JlZW4gc25hcHNob3QsIGJ1dCBsZXQncyBhZG1pdCBpdDogdGVzdHMgbGlrZSB0aGlzIGFyZSBleHBlbnNpdmUgdG8gcnVuIGFuZCBmcmFnaWxlIChXaGF0IGlmIHlvdSBqdXN0IHVwZ3JhZGVkIHRvIGEgc2hpbnkgbmV3IGdyYXBoaWNzIGNhcmQgdGhhdCBoYXMgYmV0dGVyIGFudGktYWxpYXNpbmc/IFN1ZGRlbmx5IHlvdSBoYXZlIHRvIHVwZGF0ZSBhbGwgeW91ciBnb2xkZW4gaW1hZ2VzLikuIEl0IHdvdWxkIGJlIHRvbyBwYWluZnVsIGlmIGFsbCB5b3VyIHRlc3RzIGFyZSBsaWtlIHRoaXMuIEZvcnR1bmF0ZWx5LCB5b3UgbGVhcm5lZCBhYm91dCBEZXBlbmRlbmN5IEluamVjdGlvbiBhbmQga25vdyB0aGUgcmlnaHQgdGhpbmcgdG8gZG86IGluc3RlYWQgb2YgaGF2aW5nIHlvdXIgYXBwbGljYXRpb24gdGFsayB0byB0aGUgZHJhd2luZyBBUEkgZGlyZWN0bHksIHdyYXAgdGhlIEFQSSBpbiBhbiBpbnRlcmZhY2UgKHNheSwgYFR1cnRsZWApIGFuZCBjb2RlIHRvIHRoYXQgaW50ZXJmYWNlOgorCitgYGAKK2NsYXNzIFR1cnRsZSB7CisgIC4uLgorICB2aXJ0dWFsIH5UdXJ0bGUoKSB7fQorICB2aXJ0dWFsIHZvaWQgUGVuVXAoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBQZW5Eb3duKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgRm9yd2FyZChpbnQgZGlzdGFuY2UpID0gMDsKKyAgdmlydHVhbCB2b2lkIFR1cm4oaW50IGRlZ3JlZXMpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdvVG8oaW50IHgsIGludCB5KSA9IDA7CisgIHZpcnR1YWwgaW50IEdldFgoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50IEdldFkoKSBjb25zdCA9IDA7Cit9OworYGBgCisKKyhOb3RlIHRoYXQgdGhlIGRlc3RydWN0b3Igb2YgYFR1cnRsZWAgKiptdXN0KiogYmUgdmlydHVhbCwgYXMgaXMgdGhlIGNhc2UgZm9yICoqYWxsKiogY2xhc3NlcyB5b3UgaW50ZW5kIHRvIGluaGVyaXQgZnJvbSAtIG90aGVyd2lzZSB0aGUgZGVzdHJ1Y3RvciBvZiB0aGUgZGVyaXZlZCBjbGFzcyB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiB5b3UgZGVsZXRlIGFuIG9iamVjdCB0aHJvdWdoIGEgYmFzZSBwb2ludGVyLCBhbmQgeW91J2xsIGdldCBjb3JydXB0ZWQgcHJvZ3JhbSBzdGF0ZXMgbGlrZSBtZW1vcnkgbGVha3MuKQorCitZb3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgdHVydGxlJ3MgbW92ZW1lbnQgd2lsbCBsZWF2ZSBhIHRyYWNlIHVzaW5nIGBQZW5VcCgpYCBhbmQgYFBlbkRvd24oKWAsIGFuZCBjb250cm9sIGl0cyBtb3ZlbWVudCB1c2luZyBgRm9yd2FyZCgpYCwgYFR1cm4oKWAsIGFuZCBgR29UbygpYC4gRmluYWxseSwgYEdldFgoKWAgYW5kIGBHZXRZKClgIHRlbGwgeW91IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB0dXJ0bGUuCisKK1lvdXIgcHJvZ3JhbSB3aWxsIG5vcm1hbGx5IHVzZSBhIHJlYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuIEluIHRlc3RzLCB5b3UgY2FuIHVzZSBhIG1vY2sgaW1wbGVtZW50YXRpb24gaW5zdGVhZC4gVGhpcyBhbGxvd3MgeW91IHRvIGVhc2lseSBjaGVjayB3aGF0IGRyYXdpbmcgcHJpbWl0aXZlcyB5b3VyIHByb2dyYW0gaXMgY2FsbGluZywgd2l0aCB3aGF0IGFyZ3VtZW50cywgYW5kIGluIHdoaWNoIG9yZGVyLiBUZXN0cyB3cml0dGVuIHRoaXMgd2F5IGFyZSBtdWNoIG1vcmUgcm9idXN0ICh0aGV5IHdvbid0IGJyZWFrIGJlY2F1c2UgeW91ciBuZXcgbWFjaGluZSBkb2VzIGFudGktYWxpYXNpbmcgZGlmZmVyZW50bHkpLCBlYXNpZXIgdG8gcmVhZCBhbmQgbWFpbnRhaW4gKHRoZSBpbnRlbnQgb2YgYSB0ZXN0IGlzIGV4cHJlc3NlZCBpbiB0aGUgY29kZSwgbm90IGluIHNvbWUgYmluYXJ5IGltYWdlcyksIGFuZCBydW4gX211Y2gsIG11Y2ggZmFzdGVyXy4KKworIyBXcml0aW5nIHRoZSBNb2NrIENsYXNzICMKK0lmIHlvdSBhcmUgbHVja3ksIHRoZSBtb2NrcyB5b3UgbmVlZCB0byB1c2UgaGF2ZSBhbHJlYWR5IGJlZW4gaW1wbGVtZW50ZWQgYnkgc29tZSBuaWNlIHBlb3BsZS4gSWYsIGhvd2V2ZXIsIHlvdSBmaW5kIHlvdXJzZWxmIGluIHRoZSBwb3NpdGlvbiB0byB3cml0ZSBhIG1vY2sgY2xhc3MsIHJlbGF4IC0gR29vZ2xlIE1vY2sgdHVybnMgdGhpcyB0YXNrIGludG8gYSBmdW4gZ2FtZSEgKFdlbGwsIGFsbW9zdC4pCisKKyMjIEhvdyB0byBEZWZpbmUgSXQgIyMKK1VzaW5nIHRoZSBgVHVydGxlYCBpbnRlcmZhY2UgYXMgZXhhbXBsZSwgaGVyZSBhcmUgdGhlIHNpbXBsZSBzdGVwcyB5b3UgbmVlZCB0byBmb2xsb3c6CisKKyAgMS4gRGVyaXZlIGEgY2xhc3MgYE1vY2tUdXJ0bGVgIGZyb20gYFR1cnRsZWAuCisgIDEuIFRha2UgYSBfdmlydHVhbF8gZnVuY3Rpb24gb2YgYFR1cnRsZWAgKHdoaWxlIGl0J3MgcG9zc2libGUgdG8gW21vY2sgbm9uLXZpcnR1YWwgbWV0aG9kcyB1c2luZyB0ZW1wbGF0ZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjTW9ja2luZ19Ob252aXJ0dWFsX01ldGhvZHMpLCBpdCdzIG11Y2ggbW9yZSBpbnZvbHZlZCkuIENvdW50IGhvdyBtYW55IGFyZ3VtZW50cyBpdCBoYXMuCisgIDEuIEluIHRoZSBgcHVibGljOmAgc2VjdGlvbiBvZiB0aGUgY2hpbGQgY2xhc3MsIHdyaXRlIGBNT0NLX01FVEhPRG4oKTtgIChvciBgTU9DS19DT05TVF9NRVRIT0RuKCk7YCBpZiB5b3UgYXJlIG1vY2tpbmcgYSBgY29uc3RgIG1ldGhvZCksIHdoZXJlIGBuYCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBhcmd1bWVudHM7IGlmIHlvdSBjb3VudGVkIHdyb25nLCBzaGFtZSBvbiB5b3UsIGFuZCBhIGNvbXBpbGVyIGVycm9yIHdpbGwgdGVsbCB5b3Ugc28uCisgIDEuIE5vdyBjb21lcyB0aGUgZnVuIHBhcnQ6IHlvdSB0YWtlIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUsIGN1dC1hbmQtcGFzdGUgdGhlIF9mdW5jdGlvbiBuYW1lXyBhcyB0aGUgX2ZpcnN0XyBhcmd1bWVudCB0byB0aGUgbWFjcm8sIGFuZCBsZWF2ZSB3aGF0J3MgbGVmdCBhcyB0aGUgX3NlY29uZF8gYXJndW1lbnQgKGluIGNhc2UgeW91J3JlIGN1cmlvdXMsIHRoaXMgaXMgdGhlIF90eXBlIG9mIHRoZSBmdW5jdGlvbl8pLgorICAxLiBSZXBlYXQgdW50aWwgYWxsIHZpcnR1YWwgZnVuY3Rpb25zIHlvdSB3YW50IHRvIG1vY2sgYXJlIGRvbmUuCisKK0FmdGVyIHRoZSBwcm9jZXNzLCB5b3Ugc2hvdWxkIGhhdmUgc29tZXRoaW5nIGxpa2U6CisKK2BgYAorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiICAvLyBCcmluZ3MgaW4gR29vZ2xlIE1vY2suCitjbGFzcyBNb2NrVHVydGxlIDogcHVibGljIFR1cnRsZSB7CisgcHVibGljOgorICAuLi4KKyAgTU9DS19NRVRIT0QwKFBlblVwLCB2b2lkKCkpOworICBNT0NLX01FVEhPRDAoUGVuRG93biwgdm9pZCgpKTsKKyAgTU9DS19NRVRIT0QxKEZvcndhcmQsIHZvaWQoaW50IGRpc3RhbmNlKSk7CisgIE1PQ0tfTUVUSE9EMShUdXJuLCB2b2lkKGludCBkZWdyZWVzKSk7CisgIE1PQ0tfTUVUSE9EMihHb1RvLCB2b2lkKGludCB4LCBpbnQgeSkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0WCwgaW50KCkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0WSwgaW50KCkpOworfTsKK2BgYAorCitZb3UgZG9uJ3QgbmVlZCB0byBkZWZpbmUgdGhlc2UgbW9jayBtZXRob2RzIHNvbWV3aGVyZSBlbHNlIC0gdGhlIGBNT0NLX01FVEhPRCpgIG1hY3JvcyB3aWxsIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBmb3IgeW91LiBJdCdzIHRoYXQgc2ltcGxlISBPbmNlIHlvdSBnZXQgdGhlIGhhbmcgb2YgaXQsIHlvdSBjYW4gcHVtcCBvdXQgbW9jayBjbGFzc2VzIGZhc3RlciB0aGFuIHlvdXIgc291cmNlLWNvbnRyb2wgc3lzdGVtIGNhbiBoYW5kbGUgeW91ciBjaGVjay1pbnMuCisKKyoqVGlwOioqIElmIGV2ZW4gdGhpcyBpcyB0b28gbXVjaCB3b3JrIGZvciB5b3UsIHlvdSdsbCBmaW5kIHRoZQorYGdtb2NrX2dlbi5weWAgdG9vbCBpbiBHb29nbGUgTW9jaydzIGBzY3JpcHRzL2dlbmVyYXRvci9gIGRpcmVjdG9yeSAoY291cnRlc3kgb2YgdGhlIFtjcHBjbGVhbl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NwcGNsZWFuLykgcHJvamVjdCkgdXNlZnVsLiAgVGhpcyBjb21tYW5kLWxpbmUKK3Rvb2wgcmVxdWlyZXMgdGhhdCB5b3UgaGF2ZSBQeXRob24gMi40IGluc3RhbGxlZC4gIFlvdSBnaXZlIGl0IGEgQysrIGZpbGUgYW5kIHRoZSBuYW1lIG9mIGFuIGFic3RyYWN0IGNsYXNzIGRlZmluZWQgaW4gaXQsCithbmQgaXQgd2lsbCBwcmludCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbW9jayBjbGFzcyBmb3IgeW91LiAgRHVlIHRvIHRoZQorY29tcGxleGl0eSBvZiB0aGUgQysrIGxhbmd1YWdlLCB0aGlzIHNjcmlwdCBtYXkgbm90IGFsd2F5cyB3b3JrLCBidXQKK2l0IGNhbiBiZSBxdWl0ZSBoYW5keSB3aGVuIGl0IGRvZXMuICBGb3IgbW9yZSBkZXRhaWxzLCByZWFkIHRoZSBbdXNlciBkb2N1bWVudGF0aW9uXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvZ2VuZXJhdG9yL1JFQURNRSkuCisKKyMjIFdoZXJlIHRvIFB1dCBJdCAjIworV2hlbiB5b3UgZGVmaW5lIGEgbW9jayBjbGFzcywgeW91IG5lZWQgdG8gZGVjaWRlIHdoZXJlIHRvIHB1dCBpdHMgZGVmaW5pdGlvbi4gU29tZSBwZW9wbGUgcHV0IGl0IGluIGEgYCpfdGVzdC5jY2AuIFRoaXMgaXMgZmluZSB3aGVuIHRoZSBpbnRlcmZhY2UgYmVpbmcgbW9ja2VkIChzYXksIGBGb29gKSBpcyBvd25lZCBieSB0aGUgc2FtZSBwZXJzb24gb3IgdGVhbS4gT3RoZXJ3aXNlLCB3aGVuIHRoZSBvd25lciBvZiBgRm9vYCBjaGFuZ2VzIGl0LCB5b3VyIHRlc3QgY291bGQgYnJlYWsuIChZb3UgY2FuJ3QgcmVhbGx5IGV4cGVjdCBgRm9vYCdzIG1haW50YWluZXIgdG8gZml4IGV2ZXJ5IHRlc3QgdGhhdCB1c2VzIGBGb29gLCBjYW4geW91PykKKworU28sIHRoZSBydWxlIG9mIHRodW1iIGlzOiBpZiB5b3UgbmVlZCB0byBtb2NrIGBGb29gIGFuZCBpdCdzIG93bmVkIGJ5IG90aGVycywgZGVmaW5lIHRoZSBtb2NrIGNsYXNzIGluIGBGb29gJ3MgcGFja2FnZSAoYmV0dGVyLCBpbiBhIGB0ZXN0aW5nYCBzdWItcGFja2FnZSBzdWNoIHRoYXQgeW91IGNhbiBjbGVhcmx5IHNlcGFyYXRlIHByb2R1Y3Rpb24gY29kZSBhbmQgdGVzdGluZyB1dGlsaXRpZXMpLCBhbmQgcHV0IGl0IGluIGEgYG1vY2tfZm9vLmhgLiBUaGVuIGV2ZXJ5b25lIGNhbiByZWZlcmVuY2UgYG1vY2tfZm9vLmhgIGZyb20gdGhlaXIgdGVzdHMuIElmIGBGb29gIGV2ZXIgY2hhbmdlcywgdGhlcmUgaXMgb25seSBvbmUgY29weSBvZiBgTW9ja0Zvb2AgdG8gY2hhbmdlLCBhbmQgb25seSB0ZXN0cyB0aGF0IGRlcGVuZCBvbiB0aGUgY2hhbmdlZCBtZXRob2RzIG5lZWQgdG8gYmUgZml4ZWQuCisKK0Fub3RoZXIgd2F5IHRvIGRvIGl0OiB5b3UgY2FuIGludHJvZHVjZSBhIHRoaW4gbGF5ZXIgYEZvb0FkYXB0b3JgIG9uIHRvcCBvZiBgRm9vYCBhbmQgY29kZSB0byB0aGlzIG5ldyBpbnRlcmZhY2UuIFNpbmNlIHlvdSBvd24gYEZvb0FkYXB0b3JgLCB5b3UgY2FuIGFic29yYiBjaGFuZ2VzIGluIGBGb29gIG11Y2ggbW9yZSBlYXNpbHkuIFdoaWxlIHRoaXMgaXMgbW9yZSB3b3JrIGluaXRpYWxseSwgY2FyZWZ1bGx5IGNob29zaW5nIHRoZSBhZGFwdG9yIGludGVyZmFjZSBjYW4gbWFrZSB5b3VyIGNvZGUgZWFzaWVyIHRvIHdyaXRlIGFuZCBtb3JlIHJlYWRhYmxlIChhIG5ldCB3aW4gaW4gdGhlIGxvbmcgcnVuKSwgYXMgeW91IGNhbiBjaG9vc2UgYEZvb0FkYXB0b3JgIHRvIGZpdCB5b3VyIHNwZWNpZmljIGRvbWFpbiBtdWNoIGJldHRlciB0aGFuIGBGb29gIGRvZXMuCisKKyMgVXNpbmcgTW9ja3MgaW4gVGVzdHMgIworT25jZSB5b3UgaGF2ZSBhIG1vY2sgY2xhc3MsIHVzaW5nIGl0IGlzIGVhc3kuIFRoZSB0eXBpY2FsIHdvcmsgZmxvdyBpczoKKworICAxLiBJbXBvcnQgdGhlIEdvb2dsZSBNb2NrIG5hbWVzIGZyb20gdGhlIGB0ZXN0aW5nYCBuYW1lc3BhY2Ugc3VjaCB0aGF0IHlvdSBjYW4gdXNlIHRoZW0gdW5xdWFsaWZpZWQgKFlvdSBvbmx5IGhhdmUgdG8gZG8gaXQgb25jZSBwZXIgZmlsZS4gUmVtZW1iZXIgdGhhdCBuYW1lc3BhY2VzIGFyZSBhIGdvb2QgaWRlYSBhbmQgZ29vZCBmb3IgeW91ciBoZWFsdGguKS4KKyAgMS4gQ3JlYXRlIHNvbWUgbW9jayBvYmplY3RzLgorICAxLiBTcGVjaWZ5IHlvdXIgZXhwZWN0YXRpb25zIG9uIHRoZW0gKEhvdyBtYW55IHRpbWVzIHdpbGwgYSBtZXRob2QgYmUgY2FsbGVkPyBXaXRoIHdoYXQgYXJndW1lbnRzPyBXaGF0IHNob3VsZCBpdCBkbz8gZXRjLikuCisgIDEuIEV4ZXJjaXNlIHNvbWUgY29kZSB0aGF0IHVzZXMgdGhlIG1vY2tzOyBvcHRpb25hbGx5LCBjaGVjayB0aGUgcmVzdWx0IHVzaW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMuIElmIGEgbW9jayBtZXRob2QgaXMgY2FsbGVkIG1vcmUgdGhhbiBleHBlY3RlZCBvciB3aXRoIHdyb25nIGFyZ3VtZW50cywgeW91J2xsIGdldCBhbiBlcnJvciBpbW1lZGlhdGVseS4KKyAgMS4gV2hlbiBhIG1vY2sgaXMgZGVzdHJ1Y3RlZCwgR29vZ2xlIE1vY2sgd2lsbCBhdXRvbWF0aWNhbGx5IGNoZWNrIHdoZXRoZXIgYWxsIGV4cGVjdGF0aW9ucyBvbiBpdCBoYXZlIGJlZW4gc2F0aXNmaWVkLgorCitIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCisjaW5jbHVkZSAicGF0aC90by9tb2NrLXR1cnRsZS5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKK3VzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsgICAgICAgICAgICAgICAgICAgICAvLyAjMQorCitURVNUKFBhaW50ZXJUZXN0LCBDYW5EcmF3U29tZXRoaW5nKSB7CisgIE1vY2tUdXJ0bGUgdHVydGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzIKKyAgRVhQRUNUX0NBTEwodHVydGxlLCBQZW5Eb3duKCkpICAgICAgICAgICAgICAvLyAjMworICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpOworCisgIFBhaW50ZXIgcGFpbnRlcigmdHVydGxlKTsgICAgICAgICAgICAgICAgICAgLy8gIzQKKworICBFWFBFQ1RfVFJVRShwYWludGVyLkRyYXdDaXJjbGUoMCwgMCwgMTApKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjNQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIG11c3QgYmUgZXhlY3V0ZWQgdG8gaW5pdGlhbGl6ZSBHb29nbGUgTW9jaworICAvLyAoYW5kIEdvb2dsZSBUZXN0KSBiZWZvcmUgcnVubmluZyB0aGUgdGVzdHMuCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZU1vY2soJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorYGBgCisKK0FzIHlvdSBtaWdodCBoYXZlIGd1ZXNzZWQsIHRoaXMgdGVzdCBjaGVja3MgdGhhdCBgUGVuRG93bigpYCBpcyBjYWxsZWQgYXQgbGVhc3Qgb25jZS4gSWYgdGhlIGBwYWludGVyYCBvYmplY3QgZGlkbid0IGNhbGwgdGhpcyBtZXRob2QsIHlvdXIgdGVzdCB3aWxsIGZhaWwgd2l0aCBhIG1lc3NhZ2UgbGlrZSB0aGlzOgorCitgYGAKK3BhdGgvdG8vbXlfdGVzdC5jYzoxMTk6IEZhaWx1cmUKK0FjdHVhbCBmdW5jdGlvbiBjYWxsIGNvdW50IGRvZXNuJ3QgbWF0Y2ggdGhpcyBleHBlY3RhdGlvbjoKK0FjdHVhbGx5OiBuZXZlciBjYWxsZWQ7CitFeHBlY3RlZDogY2FsbGVkIGF0IGxlYXN0IG9uY2UuCitgYGAKKworKipUaXAgMToqKiBJZiB5b3UgcnVuIHRoZSB0ZXN0IGZyb20gYW4gRW1hY3MgYnVmZmVyLCB5b3UgY2FuIGhpdCBgPEVudGVyPmAgb24gdGhlIGxpbmUgbnVtYmVyIGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZSB0byBqdW1wIHJpZ2h0IHRvIHRoZSBmYWlsZWQgZXhwZWN0YXRpb24uCisKKyoqVGlwIDI6KiogSWYgeW91ciBtb2NrIG9iamVjdHMgYXJlIG5ldmVyIGRlbGV0ZWQsIHRoZSBmaW5hbCB2ZXJpZmljYXRpb24gd29uJ3QgaGFwcGVuLiBUaGVyZWZvcmUgaXQncyBhIGdvb2QgaWRlYSB0byB1c2UgYSBoZWFwIGxlYWsgY2hlY2tlciBpbiB5b3VyIHRlc3RzIHdoZW4geW91IGFsbG9jYXRlIG1vY2tzIG9uIHRoZSBoZWFwLgorCisqKkltcG9ydGFudCBub3RlOioqIEdvb2dsZSBNb2NrIHJlcXVpcmVzIGV4cGVjdGF0aW9ucyB0byBiZSBzZXQgKipiZWZvcmUqKiB0aGUgbW9jayBmdW5jdGlvbnMgYXJlIGNhbGxlZCwgb3RoZXJ3aXNlIHRoZSBiZWhhdmlvciBpcyAqKnVuZGVmaW5lZCoqLiBJbiBwYXJ0aWN1bGFyLCB5b3UgbXVzdG4ndCBpbnRlcmxlYXZlIGBFWFBFQ1RfQ0FMTCgpYHMgYW5kIGNhbGxzIHRvIHRoZSBtb2NrIGZ1bmN0aW9ucy4KKworVGhpcyBtZWFucyBgRVhQRUNUX0NBTEwoKWAgc2hvdWxkIGJlIHJlYWQgYXMgZXhwZWN0aW5nIHRoYXQgYSBjYWxsIHdpbGwgb2NjdXIgX2luIHRoZSBmdXR1cmVfLCBub3QgdGhhdCBhIGNhbGwgaGFzIG9jY3VycmVkLiBXaHkgZG9lcyBHb29nbGUgTW9jayB3b3JrIGxpa2UgdGhhdD8gV2VsbCwgc3BlY2lmeWluZyB0aGUgZXhwZWN0YXRpb24gYmVmb3JlaGFuZCBhbGxvd3MgR29vZ2xlIE1vY2sgdG8gcmVwb3J0IGEgdmlvbGF0aW9uIGFzIHNvb24gYXMgaXQgYXJpc2VzLCB3aGVuIHRoZSBjb250ZXh0IChzdGFjayB0cmFjZSwgZXRjKSBpcyBzdGlsbCBhdmFpbGFibGUuIFRoaXMgbWFrZXMgZGVidWdnaW5nIG11Y2ggZWFzaWVyLgorCitBZG1pdHRlZGx5LCB0aGlzIHRlc3QgaXMgY29udHJpdmVkIGFuZCBkb2Vzbid0IGRvIG11Y2guIFlvdSBjYW4gZWFzaWx5IGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IHdpdGhvdXQgdXNpbmcgR29vZ2xlIE1vY2suIEhvd2V2ZXIsIGFzIHdlIHNoYWxsIHJldmVhbCBzb29uLCBHb29nbGUgTW9jayBhbGxvd3MgeW91IHRvIGRvIF9tdWNoIG1vcmVfIHdpdGggdGhlIG1vY2tzLgorCisjIyBVc2luZyBHb29nbGUgTW9jayB3aXRoIEFueSBUZXN0aW5nIEZyYW1ld29yayAjIworSWYgeW91IHdhbnQgdG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIEdvb2dsZSBUZXN0IChlLmcuIFtDcHBVbml0XShodHRwOi8vYXBwcy5zb3VyY2Vmb3JnZS5uZXQvbWVkaWF3aWtpL2NwcHVuaXQvaW5kZXgucGhwP3RpdGxlPU1haW5fUGFnZSkgb3IKK1tDeHhUZXN0XShodHRwOi8vY3h4dGVzdC50aWdyaXMub3JnLykpIGFzIHlvdXIgdGVzdGluZyBmcmFtZXdvcmssIGp1c3QgY2hhbmdlIHRoZSBgbWFpbigpYCBmdW5jdGlvbiBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiB0bzoKK2BgYAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBjYXVzZXMgR29vZ2xlIE1vY2sgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUsCisgIC8vIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgeW91ciB0ZXN0aW5nIGZyYW1ld29yayBhcyBhIHRlc3QgZmFpbHVyZS4KKyAgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdHJ1ZTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7CisgIC4uLiB3aGF0ZXZlciB5b3VyIHRlc3RpbmcgZnJhbWV3b3JrIHJlcXVpcmVzIC4uLgorfQorYGBgCisKK1RoaXMgYXBwcm9hY2ggaGFzIGEgY2F0Y2g6IGl0IG1ha2VzIEdvb2dsZSBNb2NrIHRocm93IGFuIGV4Y2VwdGlvbgorZnJvbSBhIG1vY2sgb2JqZWN0J3MgZGVzdHJ1Y3RvciBzb21ldGltZXMuICBXaXRoIHNvbWUgY29tcGlsZXJzLCB0aGlzCitzb21ldGltZXMgY2F1c2VzIHRoZSB0ZXN0IHByb2dyYW0gdG8gY3Jhc2guICBZb3UnbGwgc3RpbGwgYmUgYWJsZSB0bworbm90aWNlIHRoYXQgdGhlIHRlc3QgaGFzIGZhaWxlZCwgYnV0IGl0J3Mgbm90IGEgZ3JhY2VmdWwgZmFpbHVyZS4KKworQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gdXNlIEdvb2dsZSBUZXN0J3MKK1tldmVudCBsaXN0ZW5lciBBUEldKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvQWR2YW5jZWRHdWlkZSNFeHRlbmRpbmdfR29vZ2xlX1Rlc3RfYnlfSGFuZGxpbmdfVGVzdF9FdmVudHMpCit0byByZXBvcnQgYSB0ZXN0IGZhaWx1cmUgdG8geW91ciB0ZXN0aW5nIGZyYW1ld29yayBwcm9wZXJseS4gIFlvdSdsbCBuZWVkIHRvCitpbXBsZW1lbnQgdGhlIGBPblRlc3RQYXJ0UmVzdWx0KClgIG1ldGhvZCBvZiB0aGUgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlLCBidXQgaXQKK3Nob3VsZCBiZSBzdHJhaWdodGZvcndhcmQuCisKK0lmIHRoaXMgdHVybnMgb3V0IHRvIGJlIHRvbyBtdWNoIHdvcmssIHdlIHN1Z2dlc3QgdGhhdCB5b3Ugc3RpY2sgd2l0aAorR29vZ2xlIFRlc3QsIHdoaWNoIHdvcmtzIHdpdGggR29vZ2xlIE1vY2sgc2VhbWxlc3NseSAoaW4gZmFjdCwgaXQgaXMKK3RlY2huaWNhbGx5IHBhcnQgb2YgR29vZ2xlIE1vY2suKS4gIElmIHRoZXJlIGlzIGEgcmVhc29uIHRoYXQgeW91CitjYW5ub3QgdXNlIEdvb2dsZSBUZXN0LCBwbGVhc2UgbGV0IHVzIGtub3cuCisKKyMgU2V0dGluZyBFeHBlY3RhdGlvbnMgIworVGhlIGtleSB0byB1c2luZyBhIG1vY2sgb2JqZWN0IHN1Y2Nlc3NmdWxseSBpcyB0byBzZXQgdGhlIF9yaWdodCBleHBlY3RhdGlvbnNfIG9uIGl0LiBJZiB5b3Ugc2V0IHRoZSBleHBlY3RhdGlvbnMgdG9vIHN0cmljdCwgeW91ciB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgcmVzdWx0IG9mIHVucmVsYXRlZCBjaGFuZ2VzLiBJZiB5b3Ugc2V0IHRoZW0gdG9vIGxvb3NlLCBidWdzIGNhbiBzbGlwIHRocm91Z2guIFlvdSB3YW50IHRvIGRvIGl0IGp1c3QgcmlnaHQgc3VjaCB0aGF0IHlvdXIgdGVzdCBjYW4gY2F0Y2ggZXhhY3RseSB0aGUga2luZCBvZiBidWdzIHlvdSBpbnRlbmQgaXQgdG8gY2F0Y2guIEdvb2dsZSBNb2NrIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgbWVhbnMgZm9yIHlvdSB0byBkbyBpdCAianVzdCByaWdodC4iCisKKyMjIEdlbmVyYWwgU3ludGF4ICMjCitJbiBHb29nbGUgTW9jayB3ZSB1c2UgdGhlIGBFWFBFQ1RfQ0FMTCgpYCBtYWNybyB0byBzZXQgYW4gZXhwZWN0YXRpb24gb24gYSBtb2NrIG1ldGhvZC4gVGhlIGdlbmVyYWwgc3ludGF4IGlzOgorCitgYGAKK0VYUEVDVF9DQUxMKG1vY2tfb2JqZWN0LCBtZXRob2QobWF0Y2hlcnMpKQorICAgIC5UaW1lcyhjYXJkaW5hbGl0eSkKKyAgICAuV2lsbE9uY2UoYWN0aW9uKQorICAgIC5XaWxsUmVwZWF0ZWRseShhY3Rpb24pOworYGBgCisKK1RoZSBtYWNybyBoYXMgdHdvIGFyZ3VtZW50czogZmlyc3QgdGhlIG1vY2sgb2JqZWN0LCBhbmQgdGhlbiB0aGUgbWV0aG9kIGFuZCBpdHMgYXJndW1lbnRzLiBOb3RlIHRoYXQgdGhlIHR3byBhcmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEgKGAsYCksIG5vdCBhIHBlcmlvZCAoYC5gKS4gKFdoeSB1c2luZyBhIGNvbW1hPyBUaGUgYW5zd2VyIGlzIHRoYXQgaXQgd2FzIG5lY2Vzc2FyeSBmb3IgdGVjaG5pY2FsIHJlYXNvbnMuKQorCitUaGUgbWFjcm8gY2FuIGJlIGZvbGxvd2VkIGJ5IHNvbWUgb3B0aW9uYWwgX2NsYXVzZXNfIHRoYXQgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHBlY3RhdGlvbi4gV2UnbGwgZGlzY3VzcyBob3cgZWFjaCBjbGF1c2Ugd29ya3MgaW4gdGhlIGNvbWluZyBzZWN0aW9ucy4KKworVGhpcyBzeW50YXggaXMgZGVzaWduZWQgdG8gbWFrZSBhbiBleHBlY3RhdGlvbiByZWFkIGxpa2UgRW5nbGlzaC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gcHJvYmFibHkgZ3Vlc3MgdGhhdAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgLlRpbWVzKDUpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMTUwKSkKKyAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDIwMCkpOworYGBgCisKK3NheXMgdGhhdCB0aGUgYHR1cnRsZWAgb2JqZWN0J3MgYEdldFgoKWAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZpdmUgdGltZXMsIGl0IHdpbGwgcmV0dXJuIDEwMCB0aGUgZmlyc3QgdGltZSwgMTUwIHRoZSBzZWNvbmQgdGltZSwgYW5kIHRoZW4gMjAwIGV2ZXJ5IHRpbWUuIFNvbWUgcGVvcGxlIGxpa2UgdG8gY2FsbCB0aGlzIHN0eWxlIG9mIHN5bnRheCBhIERvbWFpbi1TcGVjaWZpYyBMYW5ndWFnZSAoRFNMKS4KKworKipOb3RlOioqIFdoeSBkbyB3ZSB1c2UgYSBtYWNybyB0byBkbyB0aGlzPyBJdCBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiBmaXJzdCBpdCBtYWtlcyBleHBlY3RhdGlvbnMgZWFzaWx5IGlkZW50aWZpYWJsZSAoZWl0aGVyIGJ5IGBncmVwYCBvciBieSBhIGh1bWFuIHJlYWRlciksIGFuZCBzZWNvbmQgaXQgYWxsb3dzIEdvb2dsZSBNb2NrIHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uIG9mIGEgZmFpbGVkIGV4cGVjdGF0aW9uIGluIG1lc3NhZ2VzLCBtYWtpbmcgZGVidWdnaW5nIGVhc2llci4KKworIyMgTWF0Y2hlcnM6IFdoYXQgQXJndW1lbnRzIERvIFdlIEV4cGVjdD8gIyMKK1doZW4gYSBtb2NrIGZ1bmN0aW9uIHRha2VzIGFyZ3VtZW50cywgd2UgbXVzdCBzcGVjaWZ5IHdoYXQgYXJndW1lbnRzIHdlIGFyZSBleHBlY3Rpbmc7IGZvciBleGFtcGxlOgorCitgYGAKKy8vIEV4cGVjdHMgdGhlIHR1cnRsZSB0byBtb3ZlIGZvcndhcmQgYnkgMTAwIHVuaXRzLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKDEwMCkpOworYGBgCisKK1NvbWV0aW1lcyB5b3UgbWF5IG5vdCB3YW50IHRvIGJlIHRvbyBzcGVjaWZpYyAoUmVtZW1iZXIgdGhhdCB0YWxrIGFib3V0IHRlc3RzIGJlaW5nIHRvbyByaWdpZD8gT3ZlciBzcGVjaWZpY2F0aW9uIGxlYWRzIHRvIGJyaXR0bGUgdGVzdHMgYW5kIG9ic2N1cmVzIHRoZSBpbnRlbnQgb2YgdGVzdHMuIFRoZXJlZm9yZSB3ZSBlbmNvdXJhZ2UgeW91IHRvIHNwZWNpZnkgb25seSB3aGF0J3MgbmVjZXNzYXJ5IC0gbm8gbW9yZSwgbm8gbGVzcy4pLiBJZiB5b3UgY2FyZSB0byBjaGVjayB0aGF0IGBGb3J3YXJkKClgIHdpbGwgYmUgY2FsbGVkIGJ1dCBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBpdHMgYWN0dWFsIGFyZ3VtZW50LCB3cml0ZSBgX2AgYXMgdGhlIGFyZ3VtZW50LCB3aGljaCBtZWFucyAiYW55dGhpbmcgZ29lcyI6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisvLyBFeHBlY3RzIHRoZSB0dXJ0bGUgdG8gbW92ZSBmb3J3YXJkLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKF8pKTsKK2BgYAorCitgX2AgaXMgYW4gaW5zdGFuY2Ugb2Ygd2hhdCB3ZSBjYWxsICoqbWF0Y2hlcnMqKi4gQSBtYXRjaGVyIGlzIGxpa2UgYSBwcmVkaWNhdGUgYW5kIGNhbiB0ZXN0IHdoZXRoZXIgYW4gYXJndW1lbnQgaXMgd2hhdCB3ZSdkIGV4cGVjdC4gWW91IGNhbiB1c2UgYSBtYXRjaGVyIGluc2lkZSBgRVhQRUNUX0NBTEwoKWAgd2hlcmV2ZXIgYSBmdW5jdGlvbiBhcmd1bWVudCBpcyBleHBlY3RlZC4KKworQSBsaXN0IG9mIGJ1aWx0LWluIG1hdGNoZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgW0NoZWF0U2hlZXRdKENoZWF0U2hlZXQubWQpLiBGb3IgZXhhbXBsZSwgaGVyZSdzIHRoZSBgR2VgIChncmVhdGVyIHRoYW4gb3IgZXF1YWwpIG1hdGNoZXI6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpHZTsuLi4KK0VYUEVDVF9DQUxMKHR1cnRsZSwgRm9yd2FyZChHZSgxMDApKSk7CitgYGAKKworVGhpcyBjaGVja3MgdGhhdCB0aGUgdHVydGxlIHdpbGwgYmUgdG9sZCB0byBnbyBmb3J3YXJkIGJ5IGF0IGxlYXN0IDEwMCB1bml0cy4KKworIyMgQ2FyZGluYWxpdGllczogSG93IE1hbnkgVGltZXMgV2lsbCBJdCBCZSBDYWxsZWQ/ICMjCitUaGUgZmlyc3QgY2xhdXNlIHdlIGNhbiBzcGVjaWZ5IGZvbGxvd2luZyBhbiBgRVhQRUNUX0NBTEwoKWAgaXMgYFRpbWVzKClgLiBXZSBjYWxsIGl0cyBhcmd1bWVudCBhICoqY2FyZGluYWxpdHkqKiBhcyBpdCB0ZWxscyBfaG93IG1hbnkgdGltZXNfIHRoZSBjYWxsIHNob3VsZCBvY2N1ci4gSXQgYWxsb3dzIHVzIHRvIHJlcGVhdCBhbiBleHBlY3RhdGlvbiBtYW55IHRpbWVzIHdpdGhvdXQgYWN0dWFsbHkgd3JpdGluZyBpdCBhcyBtYW55IHRpbWVzLiBNb3JlIGltcG9ydGFudGx5LCBhIGNhcmRpbmFsaXR5IGNhbiBiZSAiZnV6enkiLCBqdXN0IGxpa2UgYSBtYXRjaGVyIGNhbiBiZS4gVGhpcyBhbGxvd3MgYSB1c2VyIHRvIGV4cHJlc3MgdGhlIGludGVudCBvZiBhIHRlc3QgZXhhY3RseS4KKworQW4gaW50ZXJlc3Rpbmcgc3BlY2lhbCBjYXNlIGlzIHdoZW4gd2Ugc2F5IGBUaW1lcygwKWAuIFlvdSBtYXkgaGF2ZSBndWVzc2VkIC0gaXQgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkbid0IGJlIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYXQgYWxsLCBhbmQgR29vZ2xlIE1vY2sgd2lsbCByZXBvcnQgYSBHb29nbGUgVGVzdCBmYWlsdXJlIHdoZW5ldmVyIHRoZSBmdW5jdGlvbiBpcyAod3JvbmdmdWxseSkgY2FsbGVkLgorCitXZSd2ZSBzZWVuIGBBdExlYXN0KG4pYCBhcyBhbiBleGFtcGxlIG9mIGZ1enp5IGNhcmRpbmFsaXRpZXMgZWFybGllci4gRm9yIHRoZSBsaXN0IG9mIGJ1aWx0LWluIGNhcmRpbmFsaXRpZXMgeW91IGNhbiB1c2UsIHNlZSB0aGUgW0NoZWF0U2hlZXRdKENoZWF0U2hlZXQubWQpLgorCitUaGUgYFRpbWVzKClgIGNsYXVzZSBjYW4gYmUgb21pdHRlZC4gKipJZiB5b3Ugb21pdCBgVGltZXMoKWAsIEdvb2dsZSBNb2NrIHdpbGwgaW5mZXIgdGhlIGNhcmRpbmFsaXR5IGZvciB5b3UuKiogVGhlIHJ1bGVzIGFyZSBlYXN5IHRvIHJlbWVtYmVyOgorCisgICogSWYgKipuZWl0aGVyKiogYFdpbGxPbmNlKClgICoqbm9yKiogYFdpbGxSZXBlYXRlZGx5KClgIGlzIGluIHRoZSBgRVhQRUNUX0NBTEwoKWAsIHRoZSBpbmZlcnJlZCBjYXJkaW5hbGl0eSBpcyBgVGltZXMoMSlgLgorICAqIElmIHRoZXJlIGFyZSBgbiBXaWxsT25jZSgpYCdzIGJ1dCAqKm5vKiogYFdpbGxSZXBlYXRlZGx5KClgLCB3aGVyZSBgbmAgPj0gMSwgdGhlIGNhcmRpbmFsaXR5IGlzIGBUaW1lcyhuKWAuCisgICogSWYgdGhlcmUgYXJlIGBuIFdpbGxPbmNlKClgJ3MgYW5kICoqb25lKiogYFdpbGxSZXBlYXRlZGx5KClgLCB3aGVyZSBgbmAgPj0gMCwgdGhlIGNhcmRpbmFsaXR5IGlzIGBUaW1lcyhBdExlYXN0KG4pKWAuCisKKyoqUXVpY2sgcXVpejoqKiB3aGF0IGRvIHlvdSB0aGluayB3aWxsIGhhcHBlbiBpZiBhIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB0d2ljZSBidXQgYWN0dWFsbHkgY2FsbGVkIGZvdXIgdGltZXM/CisKKyMjIEFjdGlvbnM6IFdoYXQgU2hvdWxkIEl0IERvPyAjIworUmVtZW1iZXIgdGhhdCBhIG1vY2sgb2JqZWN0IGRvZXNuJ3QgcmVhbGx5IGhhdmUgYSB3b3JraW5nIGltcGxlbWVudGF0aW9uPyBXZSBhcyB1c2VycyBoYXZlIHRvIHRlbGwgaXQgd2hhdCB0byBkbyB3aGVuIGEgbWV0aG9kIGlzIGludm9rZWQuIFRoaXMgaXMgZWFzeSBpbiBHb29nbGUgTW9jay4KKworRmlyc3QsIGlmIHRoZSByZXR1cm4gdHlwZSBvZiBhIG1vY2sgZnVuY3Rpb24gaXMgYSBidWlsdC1pbiB0eXBlIG9yIGEgcG9pbnRlciwgdGhlIGZ1bmN0aW9uIGhhcyBhICoqZGVmYXVsdCBhY3Rpb24qKiAoYSBgdm9pZGAgZnVuY3Rpb24gd2lsbCBqdXN0IHJldHVybiwgYSBgYm9vbGAgZnVuY3Rpb24gd2lsbCByZXR1cm4gYGZhbHNlYCwgYW5kIG90aGVyIGZ1bmN0aW9ucyB3aWxsIHJldHVybiAwKS4gSW4gYWRkaXRpb24sIGluIEMrKyAxMSBhbmQgYWJvdmUsIGEgbW9jayBmdW5jdGlvbiB3aG9zZSByZXR1cm4gdHlwZSBpcyBkZWZhdWx0LWNvbnN0cnVjdGlibGUgKGkuZS4gaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcikgaGFzIGEgZGVmYXVsdCBhY3Rpb24gb2YgcmV0dXJuaW5nIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCB2YWx1ZS4gIElmIHlvdSBkb24ndCBzYXkgYW55dGhpbmcsIHRoaXMgYmVoYXZpb3Igd2lsbCBiZSB1c2VkLgorCitTZWNvbmQsIGlmIGEgbW9jayBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IGFjdGlvbiwgb3IgdGhlIGRlZmF1bHQgYWN0aW9uIGRvZXNuJ3Qgc3VpdCB5b3UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIGVhY2ggdGltZSB0aGUgZXhwZWN0YXRpb24gbWF0Y2hlcyB1c2luZyBhIHNlcmllcyBvZiBgV2lsbE9uY2UoKWAgY2xhdXNlcyBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBgV2lsbFJlcGVhdGVkbHkoKWAuIEZvciBleGFtcGxlLAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMjAwKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDMwMCkpOworYGBgCisKK1RoaXMgc2F5cyB0aGF0IGB0dXJ0bGUuR2V0WCgpYCB3aWxsIGJlIGNhbGxlZCBfZXhhY3RseSB0aHJlZSB0aW1lc18gKEdvb2dsZSBNb2NrIGluZmVycmVkIHRoaXMgZnJvbSBob3cgbWFueSBgV2lsbE9uY2UoKWAgY2xhdXNlcyB3ZSd2ZSB3cml0dGVuLCBzaW5jZSB3ZSBkaWRuJ3QgZXhwbGljaXRseSB3cml0ZSBgVGltZXMoKWApLCBhbmQgd2lsbCByZXR1cm4gMTAwLCAyMDAsIGFuZCAzMDAgcmVzcGVjdGl2ZWx5LgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRZKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMjAwKSkKKyAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDMwMCkpOworYGBgCisKK3NheXMgdGhhdCBgdHVydGxlLkdldFkoKWAgd2lsbCBiZSBjYWxsZWQgX2F0IGxlYXN0IHR3aWNlXyAoR29vZ2xlIE1vY2sga25vd3MgdGhpcyBhcyB3ZSd2ZSB3cml0dGVuIHR3byBgV2lsbE9uY2UoKWAgY2xhdXNlcyBhbmQgYSBgV2lsbFJlcGVhdGVkbHkoKWAgd2hpbGUgaGF2aW5nIG5vIGV4cGxpY2l0IGBUaW1lcygpYCksIHdpbGwgcmV0dXJuIDEwMCB0aGUgZmlyc3QgdGltZSwgMjAwIHRoZSBzZWNvbmQgdGltZSwgYW5kIDMwMCBmcm9tIHRoZSB0aGlyZCB0aW1lIG9uLgorCitPZiBjb3Vyc2UsIGlmIHlvdSBleHBsaWNpdGx5IHdyaXRlIGEgYFRpbWVzKClgLCBHb29nbGUgTW9jayB3aWxsIG5vdCB0cnkgdG8gaW5mZXIgdGhlIGNhcmRpbmFsaXR5IGl0c2VsZi4gV2hhdCBpZiB0aGUgbnVtYmVyIHlvdSBzcGVjaWZpZWQgaXMgbGFyZ2VyIHRoYW4gdGhlcmUgYXJlIGBXaWxsT25jZSgpYCBjbGF1c2VzPyBXZWxsLCBhZnRlciBhbGwgYFdpbGxPbmNlKClgcyBhcmUgdXNlZCB1cCwgR29vZ2xlIE1vY2sgd2lsbCBkbyB0aGUgX2RlZmF1bHRfIGFjdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUgKHVubGVzcywgb2YgY291cnNlLCB5b3UgaGF2ZSBhIGBXaWxsUmVwZWF0ZWRseSgpYC4pLgorCitXaGF0IGNhbiB3ZSBkbyBpbnNpZGUgYFdpbGxPbmNlKClgIGJlc2lkZXMgYFJldHVybigpYD8gWW91IGNhbiByZXR1cm4gYSByZWZlcmVuY2UgdXNpbmcgYFJldHVyblJlZih2YXJpYWJsZSlgLCBvciBpbnZva2UgYSBwcmUtZGVmaW5lZCBmdW5jdGlvbiwgYW1vbmcgW290aGVyc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9DaGVhdFNoZWV0I0FjdGlvbnMpLgorCisqKkltcG9ydGFudCBub3RlOioqIFRoZSBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50IGV2YWx1YXRlcyB0aGUgYWN0aW9uIGNsYXVzZSBvbmx5IG9uY2UsIGV2ZW4gdGhvdWdoIHRoZSBhY3Rpb24gbWF5IGJlIHBlcmZvcm1lZCBtYW55IHRpbWVzLiBUaGVyZWZvcmUgeW91IG11c3QgYmUgY2FyZWZ1bCBhYm91dCBzaWRlIGVmZmVjdHMuIFRoZSBmb2xsb3dpbmcgbWF5IG5vdCBkbyB3aGF0IHlvdSB3YW50OgorCitgYGAKK2ludCBuID0gMTAwOworRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisuVGltZXMoNCkKKy5XaWxsUmVwZWF0ZWRseShSZXR1cm4obisrKSk7CitgYGAKKworSW5zdGVhZCBvZiByZXR1cm5pbmcgMTAwLCAxMDEsIDEwMiwgLi4uLCBjb25zZWN1dGl2ZWx5LCB0aGlzIG1vY2sgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIDEwMCBhcyBgbisrYCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBTaW1pbGFybHksIGBSZXR1cm4obmV3IEZvbylgIHdpbGwgY3JlYXRlIGEgbmV3IGBGb29gIG9iamVjdCB3aGVuIHRoZSBgRVhQRUNUX0NBTEwoKWAgaXMgZXhlY3V0ZWQsIGFuZCB3aWxsIHJldHVybiB0aGUgc2FtZSBwb2ludGVyIGV2ZXJ5IHRpbWUuIElmIHlvdSB3YW50IHRoZSBzaWRlIGVmZmVjdCB0byBoYXBwZW4gZXZlcnkgdGltZSwgeW91IG5lZWQgdG8gZGVmaW5lIGEgY3VzdG9tIGFjdGlvbiwgd2hpY2ggd2UnbGwgdGVhY2ggaW4gdGhlIFtDb29rQm9va10oQ29va0Jvb2subWQpLgorCitUaW1lIGZvciBhbm90aGVyIHF1aXohIFdoYXQgZG8geW91IHRoaW5rIHRoZSBmb2xsb3dpbmcgbWVhbnM/CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Li4uCitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdldFkoKSkKKy5UaW1lcyg0KQorLldpbGxPbmNlKFJldHVybigxMDApKTsKK2BgYAorCitPYnZpb3VzbHkgYHR1cnRsZS5HZXRZKClgIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBmb3VyIHRpbWVzLiBCdXQgaWYgeW91IHRoaW5rIGl0IHdpbGwgcmV0dXJuIDEwMCBldmVyeSB0aW1lLCB0aGluayB0d2ljZSEgUmVtZW1iZXIgdGhhdCBvbmUgYFdpbGxPbmNlKClgIGNsYXVzZSB3aWxsIGJlIGNvbnN1bWVkIGVhY2ggdGltZSB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZCBhbmQgdGhlIGRlZmF1bHQgYWN0aW9uIHdpbGwgYmUgdGFrZW4gYWZ0ZXJ3YXJkcy4gU28gdGhlIHJpZ2h0IGFuc3dlciBpcyB0aGF0IGB0dXJ0bGUuR2V0WSgpYCB3aWxsIHJldHVybiAxMDAgdGhlIGZpcnN0IHRpbWUsIGJ1dCAqKnJldHVybiAwIGZyb20gdGhlIHNlY29uZCB0aW1lIG9uKiosIGFzIHJldHVybmluZyAwIGlzIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgYGludGAgZnVuY3Rpb25zLgorCisjIyBVc2luZyBNdWx0aXBsZSBFeHBlY3RhdGlvbnMgIyMKK1NvIGZhciB3ZSd2ZSBvbmx5IHNob3duIGV4YW1wbGVzIHdoZXJlIHlvdSBoYXZlIGEgc2luZ2xlIGV4cGVjdGF0aW9uLiBNb3JlIHJlYWxpc3RpY2FsbHksIHlvdSdyZSBnb2luZyB0byBzcGVjaWZ5IGV4cGVjdGF0aW9ucyBvbiBtdWx0aXBsZSBtb2NrIG1ldGhvZHMsIHdoaWNoIG1heSBiZSBmcm9tIG11bHRpcGxlIG1vY2sgb2JqZWN0cy4KKworQnkgZGVmYXVsdCwgd2hlbiBhIG1vY2sgbWV0aG9kIGlzIGludm9rZWQsIEdvb2dsZSBNb2NrIHdpbGwgc2VhcmNoIHRoZSBleHBlY3RhdGlvbnMgaW4gdGhlICoqcmV2ZXJzZSBvcmRlcioqIHRoZXkgYXJlIGRlZmluZWQsIGFuZCBzdG9wIHdoZW4gYW4gYWN0aXZlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgYXJndW1lbnRzIGlzIGZvdW5kICh5b3UgY2FuIHRoaW5rIG9mIGl0IGFzICJuZXdlciBydWxlcyBvdmVycmlkZSBvbGRlciBvbmVzLiIpLiBJZiB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24gY2Fubm90IHRha2UgYW55IG1vcmUgY2FsbHMsIHlvdSB3aWxsIGdldCBhbiB1cHBlci1ib3VuZC12aW9sYXRlZCBmYWlsdXJlLiBIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Li4uCitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEZvcndhcmQoXykpOyAgLy8gIzEKK0VYUEVDVF9DQUxMKHR1cnRsZSwgRm9yd2FyZCgxMCkpICAvLyAjMgorICAgIC5UaW1lcygyKTsKK2BgYAorCitJZiBgRm9yd2FyZCgxMClgIGlzIGNhbGxlZCB0aHJlZSB0aW1lcyBpbiBhIHJvdywgdGhlIHRoaXJkIHRpbWUgaXQgd2lsbCBiZSBhbiBlcnJvciwgYXMgdGhlIGxhc3QgbWF0Y2hpbmcgZXhwZWN0YXRpb24gKCMyKSBoYXMgYmVlbiBzYXR1cmF0ZWQuIElmLCBob3dldmVyLCB0aGUgdGhpcmQgYEZvcndhcmQoMTApYCBjYWxsIGlzIHJlcGxhY2VkIGJ5IGBGb3J3YXJkKDIwKWAsIHRoZW4gaXQgd291bGQgYmUgT0ssIGFzIG5vdyAjMSB3aWxsIGJlIHRoZSBtYXRjaGluZyBleHBlY3RhdGlvbi4KKworKipTaWRlIG5vdGU6KiogV2h5IGRvZXMgR29vZ2xlIE1vY2sgc2VhcmNoIGZvciBhIG1hdGNoIGluIHRoZSBfcmV2ZXJzZV8gb3JkZXIgb2YgdGhlIGV4cGVjdGF0aW9ucz8gVGhlIHJlYXNvbiBpcyB0aGF0IHRoaXMgYWxsb3dzIGEgdXNlciB0byBzZXQgdXAgdGhlIGRlZmF1bHQgZXhwZWN0YXRpb25zIGluIGEgbW9jayBvYmplY3QncyBjb25zdHJ1Y3RvciBvciB0aGUgdGVzdCBmaXh0dXJlJ3Mgc2V0LXVwIHBoYXNlIGFuZCB0aGVuIGN1c3RvbWl6ZSB0aGUgbW9jayBieSB3cml0aW5nIG1vcmUgc3BlY2lmaWMgZXhwZWN0YXRpb25zIGluIHRoZSB0ZXN0IGJvZHkuIFNvLCBpZiB5b3UgaGF2ZSB0d28gZXhwZWN0YXRpb25zIG9uIHRoZSBzYW1lIG1ldGhvZCwgeW91IHdhbnQgdG8gcHV0IHRoZSBvbmUgd2l0aCBtb3JlIHNwZWNpZmljIG1hdGNoZXJzICoqYWZ0ZXIqKiB0aGUgb3RoZXIsIG9yIHRoZSBtb3JlIHNwZWNpZmljIHJ1bGUgd291bGQgYmUgc2hhZG93ZWQgYnkgdGhlIG1vcmUgZ2VuZXJhbCBvbmUgdGhhdCBjb21lcyBhZnRlciBpdC4KKworIyMgT3JkZXJlZCB2cyBVbm9yZGVyZWQgQ2FsbHMgIyMKK0J5IGRlZmF1bHQsIGFuIGV4cGVjdGF0aW9uIGNhbiBtYXRjaCBhIGNhbGwgZXZlbiB0aG91Z2ggYW4gZWFybGllciBleHBlY3RhdGlvbiBoYXNuJ3QgYmVlbiBzYXRpc2ZpZWQuIEluIG90aGVyIHdvcmRzLCB0aGUgY2FsbHMgZG9uJ3QgaGF2ZSB0byBvY2N1ciBpbiB0aGUgb3JkZXIgdGhlIGV4cGVjdGF0aW9ucyBhcmUgc3BlY2lmaWVkLgorCitTb21ldGltZXMsIHlvdSBtYXkgd2FudCBhbGwgdGhlIGV4cGVjdGVkIGNhbGxzIHRvIG9jY3VyIGluIGEgc3RyaWN0IG9yZGVyLiBUbyBzYXkgdGhpcyBpbiBHb29nbGUgTW9jayBpcyBlYXN5OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsuLi4KK1RFU1QoRm9vVGVzdCwgRHJhd3NMaW5lU2VnbWVudCkgeworICAuLi4KKyAgeworICAgIEluU2VxdWVuY2UgZHVtbXk7CisKKyAgICBFWFBFQ1RfQ0FMTCh0dXJ0bGUsIFBlbkRvd24oKSk7CisgICAgRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKDEwMCkpOworICAgIEVYUEVDVF9DQUxMKHR1cnRsZSwgUGVuVXAoKSk7CisgIH0KKyAgRm9vKCk7Cit9CitgYGAKKworQnkgY3JlYXRpbmcgYW4gb2JqZWN0IG9mIHR5cGUgYEluU2VxdWVuY2VgLCBhbGwgZXhwZWN0YXRpb25zIGluIGl0cyBzY29wZSBhcmUgcHV0IGludG8gYSBfc2VxdWVuY2VfIGFuZCBoYXZlIHRvIG9jY3VyIF9zZXF1ZW50aWFsbHlfLiBTaW5jZSB3ZSBhcmUganVzdCByZWx5aW5nIG9uIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBvZiB0aGlzIG9iamVjdCB0byBkbyB0aGUgYWN0dWFsIHdvcmssIGl0cyBuYW1lIGlzIHJlYWxseSBpcnJlbGV2YW50LgorCitJbiB0aGlzIGV4YW1wbGUsIHdlIHRlc3QgdGhhdCBgRm9vKClgIGNhbGxzIHRoZSB0aHJlZSBleHBlY3RlZCBmdW5jdGlvbnMgaW4gdGhlIG9yZGVyIGFzIHdyaXR0ZW4uIElmIGEgY2FsbCBpcyBtYWRlIG91dC1vZi1vcmRlciwgaXQgd2lsbCBiZSBhbiBlcnJvci4KKworKFdoYXQgaWYgeW91IGNhcmUgYWJvdXQgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIHNvbWUgb2YgdGhlIGNhbGxzLCBidXQgbm90IGFsbCBvZiB0aGVtPyBDYW4geW91IHNwZWNpZnkgYW4gYXJiaXRyYXJ5IHBhcnRpYWwgb3JkZXI/IFRoZSBhbnN3ZXIgaXMgLi4uIHllcyEgSWYgeW91IGFyZSBpbXBhdGllbnQsIHRoZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgW0Nvb2tCb29rXShDb29rQm9vayNFeHBlY3RpbmdfUGFydGlhbGx5X09yZGVyZWRfQ2FsbHMubWQpLikKKworIyMgQWxsIEV4cGVjdGF0aW9ucyBBcmUgU3RpY2t5IChVbmxlc3MgU2FpZCBPdGhlcndpc2UpICMjCitOb3cgbGV0J3MgZG8gYSBxdWljayBxdWl6IHRvIHNlZSBob3cgd2VsbCB5b3UgY2FuIHVzZSB0aGlzIG1vY2sgc3R1ZmYgYWxyZWFkeS4gSG93IHdvdWxkIHlvdSB0ZXN0IHRoYXQgdGhlIHR1cnRsZSBpcyBhc2tlZCB0byBnbyB0byB0aGUgb3JpZ2luIF9leGFjdGx5IHR3aWNlXyAoeW91IHdhbnQgdG8gaWdub3JlIGFueSBvdGhlciBpbnN0cnVjdGlvbnMgaXQgcmVjZWl2ZXMpPworCitBZnRlciB5b3UndmUgY29tZSB1cCB3aXRoIHlvdXIgYW5zd2VyLCB0YWtlIGEgbG9vayBhdCBvdXJzIGFuZCBjb21wYXJlIG5vdGVzIChzb2x2ZSBpdCB5b3Vyc2VsZiBmaXJzdCAtIGRvbid0IGNoZWF0ISk6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHb1RvKF8sIF8pKSAgLy8gIzEKKyAgICAuVGltZXMoQW55TnVtYmVyKCkpOworRVhQRUNUX0NBTEwodHVydGxlLCBHb1RvKDAsIDApKSAgLy8gIzIKKyAgICAuVGltZXMoMik7CitgYGAKKworU3VwcG9zZSBgdHVydGxlLkdvVG8oMCwgMClgIGlzIGNhbGxlZCB0aHJlZSB0aW1lcy4gSW4gdGhlIHRoaXJkIHRpbWUsIEdvb2dsZSBNb2NrIHdpbGwgc2VlIHRoYXQgdGhlIGFyZ3VtZW50cyBtYXRjaCBleHBlY3RhdGlvbiAjMiAocmVtZW1iZXIgdGhhdCB3ZSBhbHdheXMgcGljayB0aGUgbGFzdCBtYXRjaGluZyBleHBlY3RhdGlvbikuIE5vdywgc2luY2Ugd2Ugc2FpZCB0aGF0IHRoZXJlIHNob3VsZCBiZSBvbmx5IHR3byBzdWNoIGNhbGxzLCBHb29nbGUgTW9jayB3aWxsIHJlcG9ydCBhbiBlcnJvciBpbW1lZGlhdGVseS4gVGhpcyBpcyBiYXNpY2FsbHkgd2hhdCB3ZSd2ZSB0b2xkIHlvdSBpbiB0aGUgIlVzaW5nIE11bHRpcGxlIEV4cGVjdGF0aW9ucyIgc2VjdGlvbiBhYm92ZS4KKworVGhpcyBleGFtcGxlIHNob3dzIHRoYXQgKipleHBlY3RhdGlvbnMgaW4gR29vZ2xlIE1vY2sgYXJlICJzdGlja3kiIGJ5IGRlZmF1bHQqKiwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSByZW1haW4gYWN0aXZlIGV2ZW4gYWZ0ZXIgd2UgaGF2ZSByZWFjaGVkIHRoZWlyIGludm9jYXRpb24gdXBwZXIgYm91bmRzLiBUaGlzIGlzIGFuIGltcG9ydGFudCBydWxlIHRvIHJlbWVtYmVyLCBhcyBpdCBhZmZlY3RzIHRoZSBtZWFuaW5nIG9mIHRoZSBzcGVjLCBhbmQgaXMgKipkaWZmZXJlbnQqKiB0byBob3cgaXQncyBkb25lIGluIG1hbnkgb3RoZXIgbW9ja2luZyBmcmFtZXdvcmtzIChXaHknZCB3ZSBkbyB0aGF0PyBCZWNhdXNlIHdlIHRoaW5rIG91ciBydWxlIG1ha2VzIHRoZSBjb21tb24gY2FzZXMgZWFzaWVyIHRvIGV4cHJlc3MgYW5kIHVuZGVyc3RhbmQuKS4KKworU2ltcGxlPyBMZXQncyBzZWUgaWYgeW91J3ZlIHJlYWxseSB1bmRlcnN0b29kIGl0OiB3aGF0IGRvZXMgdGhlIGZvbGxvd2luZyBjb2RlIHNheT8KKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKy4uLgorZm9yIChpbnQgaSA9IG47IGkgPiAwOyBpLS0pIHsKKyAgRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEwKmkpKTsKK30KK2BgYAorCitJZiB5b3UgdGhpbmsgaXQgc2F5cyB0aGF0IGB0dXJ0bGUuR2V0WCgpYCB3aWxsIGJlIGNhbGxlZCBgbmAgdGltZXMgYW5kIHdpbGwgcmV0dXJuIDEwLCAyMCwgMzAsIC4uLiwgY29uc2VjdXRpdmVseSwgdGhpbmsgdHdpY2UhIFRoZSBwcm9ibGVtIGlzIHRoYXQsIGFzIHdlIHNhaWQsIGV4cGVjdGF0aW9ucyBhcmUgc3RpY2t5LiBTbywgdGhlIHNlY29uZCB0aW1lIGB0dXJ0bGUuR2V0WCgpYCBpcyBjYWxsZWQsIHRoZSBsYXN0IChsYXRlc3QpIGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnQgd2lsbCBtYXRjaCwgYW5kIHdpbGwgaW1tZWRpYXRlbHkgbGVhZCB0byBhbiAidXBwZXIgYm91bmQgZXhjZWVkZWQiIGVycm9yIC0gdGhpcyBwaWVjZSBvZiBjb2RlIGlzIG5vdCB2ZXJ5IHVzZWZ1bCEKKworT25lIGNvcnJlY3Qgd2F5IG9mIHNheWluZyB0aGF0IGB0dXJ0bGUuR2V0WCgpYCB3aWxsIHJldHVybiAxMCwgMjAsIDMwLCAuLi4sIGlzIHRvIGV4cGxpY2l0bHkgc2F5IHRoYXQgdGhlIGV4cGVjdGF0aW9ucyBhcmUgX25vdF8gc3RpY2t5LiBJbiBvdGhlciB3b3JkcywgdGhleSBzaG91bGQgX3JldGlyZV8gYXMgc29vbiBhcyB0aGV5IGFyZSBzYXR1cmF0ZWQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KK2ZvciAoaW50IGkgPSBuOyBpID4gMDsgaS0tKSB7CisgIEVYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WCgpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMTAqaSkpCisgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK30KK2BgYAorCitBbmQsIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0OiBpbiB0aGlzIGNhc2UsIHdlIGV4cGVjdCB0aGUgY2FsbHMgdG8gb2NjdXIgaW4gYSBzcGVjaWZpYyBvcmRlciwgYW5kIHdlIGxpbmUgdXAgdGhlIGFjdGlvbnMgdG8gbWF0Y2ggdGhlIG9yZGVyLiBTaW5jZSB0aGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHdlIHNob3VsZCBtYWtlIGl0IGV4cGxpY2l0IHVzaW5nIGEgc2VxdWVuY2U6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpJblNlcXVlbmNlOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KK3sKKyAgSW5TZXF1ZW5jZSBzOworCisgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgeworICAgIEVYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WCgpKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEwKmkpKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICB9Cit9CitgYGAKKworQnkgdGhlIHdheSwgdGhlIG90aGVyIHNpdHVhdGlvbiB3aGVyZSBhbiBleHBlY3RhdGlvbiBtYXkgX25vdF8gYmUgc3RpY2t5IGlzIHdoZW4gaXQncyBpbiBhIHNlcXVlbmNlIC0gYXMgc29vbiBhcyBhbm90aGVyIGV4cGVjdGF0aW9uIHRoYXQgY29tZXMgYWZ0ZXIgaXQgaW4gdGhlIHNlcXVlbmNlIGhhcyBiZWVuIHVzZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmV0aXJlcyAoYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCB0byBtYXRjaCBhbnkgY2FsbCkuCisKKyMjIFVuaW50ZXJlc3RpbmcgQ2FsbHMgIyMKK0EgbW9jayBvYmplY3QgbWF5IGhhdmUgbWFueSBtZXRob2RzLCBhbmQgbm90IGFsbCBvZiB0aGVtIGFyZSB0aGF0IGludGVyZXN0aW5nLiBGb3IgZXhhbXBsZSwgaW4gc29tZSB0ZXN0cyB3ZSBtYXkgbm90IGNhcmUgYWJvdXQgaG93IG1hbnkgdGltZXMgYEdldFgoKWAgYW5kIGBHZXRZKClgIGdldCBjYWxsZWQuCisKK0luIEdvb2dsZSBNb2NrLCBpZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGEgbWV0aG9kLCBqdXN0IGRvbid0IHNheSBhbnl0aGluZyBhYm91dCBpdC4gSWYgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIG9jY3VycywgeW91J2xsIHNlZSBhIHdhcm5pbmcgaW4gdGhlIHRlc3Qgb3V0cHV0LCBidXQgaXQgd29uJ3QgYmUgYSBmYWlsdXJlLgorCisjIFdoYXQgTm93PyAjCitDb25ncmF0dWxhdGlvbnMhIFlvdSd2ZSBsZWFybmVkIGVub3VnaCBhYm91dCBHb29nbGUgTW9jayB0byBzdGFydCB1c2luZyBpdC4gTm93LCB5b3UgbWlnaHQgd2FudCB0byBqb2luIHRoZSBbZ29vZ2xlbW9ja10oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZW1vY2spIGRpc2N1c3Npb24gZ3JvdXAgYW5kIGFjdHVhbGx5IHdyaXRlIHNvbWUgdGVzdHMgdXNpbmcgR29vZ2xlIE1vY2sgLSBpdCB3aWxsIGJlIGZ1bi4gSGV5LCBpdCBtYXkgZXZlbiBiZSBhZGRpY3RpdmUgLSB5b3UndmUgYmVlbiB3YXJuZWQuCisKK1RoZW4sIGlmIHlvdSBmZWVsIGxpa2UgaW5jcmVhc2luZyB5b3VyIG1vY2sgcXVvdGllbnQsIHlvdSBzaG91bGQgbW92ZSBvbiB0byB0aGUgW0Nvb2tCb29rXShDb29rQm9vay5tZCkuIFlvdSBjYW4gbGVhcm4gbWFueSBhZHZhbmNlZCBmZWF0dXJlcyBvZiBHb29nbGUgTW9jayB0aGVyZSAtLSBhbmQgYWR2YW5jZSB5b3VyIGxldmVsIG9mIGVuam95bWVudCBhbmQgdGVzdGluZyBibGlzcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9GcmVxdWVudGx5QXNrZWRRdWVzdGlvbnMubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9GcmVxdWVudGx5QXNrZWRRdWVzdGlvbnMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5YTcxZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL0ZyZXF1ZW50bHlBc2tlZFF1ZXN0aW9ucy5tZApAQCAtMCwwICsxLDYyOCBAQAorCisKK1BsZWFzZSBzZW5kIHlvdXIgcXVlc3Rpb25zIHRvIHRoZQorW2dvb2dsZW1vY2tdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGVtb2NrKSBkaXNjdXNzaW9uCitncm91cC4gSWYgeW91IG5lZWQgaGVscCB3aXRoIGNvbXBpbGVyIGVycm9ycywgbWFrZSBzdXJlIHlvdSBoYXZlCit0cmllZCBbR29vZ2xlIE1vY2sgRG9jdG9yXSgjSG93X2FtX0lfc3VwcG9zZWRfdG9fbWFrZV9zZW5zZV9vZl90aGVzZV9ob3JyaWJsZV90ZW1wbGF0ZV9lcnJvci5tZCkgZmlyc3QuCisKKyMjIFdoZW4gSSBjYWxsIGEgbWV0aG9kIG9uIG15IG1vY2sgb2JqZWN0LCB0aGUgbWV0aG9kIGZvciB0aGUgcmVhbCBvYmplY3QgaXMgaW52b2tlZCBpbnN0ZWFkLiAgV2hhdCdzIHRoZSBwcm9ibGVtPyAjIworCitJbiBvcmRlciBmb3IgYSBtZXRob2QgdG8gYmUgbW9ja2VkLCBpdCBtdXN0IGJlIF92aXJ0dWFsXywgdW5sZXNzIHlvdSB1c2UgdGhlIFtoaWdoLXBlcmYgZGVwZW5kZW5jeSBpbmplY3Rpb24gdGVjaG5pcXVlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI01vY2tpbmdfTm9udmlydHVhbF9NZXRob2RzKS4KKworIyMgSSB3cm90ZSBzb21lIG1hdGNoZXJzLiAgQWZ0ZXIgSSB1cGdyYWRlZCB0byBhIG5ldyB2ZXJzaW9uIG9mIEdvb2dsZSBNb2NrLCB0aGV5IG5vIGxvbmdlciBjb21waWxlLiAgV2hhdCdzIGdvaW5nIG9uPyAjIworCitBZnRlciB2ZXJzaW9uIDEuNC4wIG9mIEdvb2dsZSBNb2NrIHdhcyByZWxlYXNlZCwgd2UgaGFkIGFuIGlkZWEgb24gaG93Cit0byBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBtYXRjaGVycyB0aGF0IGNhbiBnZW5lcmF0ZSBpbmZvcm1hdGl2ZQorbWVzc2FnZXMgZWZmaWNpZW50bHkuICBXZSBleHBlcmltZW50ZWQgd2l0aCB0aGlzIGlkZWEgYW5kIGxpa2VkIHdoYXQKK3dlIHNhdy4gIFRoZXJlZm9yZSB3ZSBkZWNpZGVkIHRvIGltcGxlbWVudCBpdC4KKworVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIGRlZmluZWQgeW91ciBvd24gbWF0Y2hlcnMKK2J5IGltcGxlbWVudGluZyBgTWF0Y2hlckludGVyZmFjZWAgb3IgdXNpbmcgYE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKWAsCit5b3VyIGRlZmluaXRpb25zIHdpbGwgbm8gbG9uZ2VyIGNvbXBpbGUuICBNYXRjaGVycyBkZWZpbmVkIHVzaW5nIHRoZQorYE1BVENIRVIqYCBmYW1pbHkgb2YgbWFjcm9zIGFyZSBub3QgYWZmZWN0ZWQuCisKK1NvcnJ5IGZvciB0aGUgaGFzc2xlIGlmIHlvdXIgbWF0Y2hlcnMgYXJlIGFmZmVjdGVkLiAgV2UgYmVsaWV2ZSBpdCdzCitpbiBldmVyeW9uZSdzIGxvbmctdGVybSBpbnRlcmVzdCB0byBtYWtlIHRoaXMgY2hhbmdlIHNvb25lciB0aGFuCitsYXRlci4gIEZvcnR1bmF0ZWx5LCBpdCdzIHVzdWFsbHkgbm90IGhhcmQgdG8gbWlncmF0ZSBhbiBleGlzdGluZworbWF0Y2hlciB0byB0aGUgbmV3IEFQSS4gIEhlcmUncyB3aGF0IHlvdSBuZWVkIHRvIGRvOgorCitJZiB5b3Ugd3JvdGUgeW91ciBtYXRjaGVyIGxpa2UgdGhpczoKK2BgYAorLy8gT2xkIG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBsYXRlc3QKKy8vIEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOworLi4uCitjbGFzcyBNeVdvbmRlcmZ1bE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxNeVR5cGU+IHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hlcyhNeVR5cGUgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0Rm9vKCkgPiA1OworICB9CisgIC4uLgorfTsKK2BgYAorCit5b3UnbGwgbmVlZCB0byBjaGFuZ2UgaXQgdG86CitgYGAKKy8vIE5ldyBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCB3b3JrcyB3aXRoIHRoZSBsYXRlc3QgR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisuLi4KK2NsYXNzIE15V29uZGVyZnVsTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPE15VHlwZT4geworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oTXlUeXBlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEZvbygpID4gNTsKKyAgfQorICAuLi4KK307CitgYGAKKyhpLmUuIHJlbmFtZSBgTWF0Y2hlcygpYCB0byBgTWF0Y2hBbmRFeHBsYWluKClgIGFuZCBnaXZlIGl0IGEgc2Vjb25kCithcmd1bWVudCBvZiB0eXBlIGBNYXRjaFJlc3VsdExpc3RlbmVyKmAuKQorCitJZiB5b3Ugd2VyZSBhbHNvIHVzaW5nIGBFeHBsYWluTWF0Y2hSZXN1bHRUbygpYCB0byBpbXByb3ZlIHRoZSBtYXRjaGVyCittZXNzYWdlOgorYGBgCisvLyBPbGQgbWF0Y2hlciBkZWZpbml0aW9uIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGxhc3Rlc3QKKy8vIEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOworLi4uCitjbGFzcyBNeVdvbmRlcmZ1bE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxNeVR5cGU+IHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hlcyhNeVR5cGUgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0Rm9vKCkgPiA1OworICB9CisKKyAgdmlydHVhbCB2b2lkIEV4cGxhaW5NYXRjaFJlc3VsdFRvKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgIC8vIFByaW50cyBzb21lIGhlbHBmdWwgaW5mb3JtYXRpb24gdG8gb3MgdG8gaGVscAorICAgIC8vIGEgdXNlciB1bmRlcnN0YW5kIHdoeSB2YWx1ZSBtYXRjaGVzIChvciBkb2Vzbid0IG1hdGNoKS4KKyAgICAqb3MgPDwgInRoZSBGb28gcHJvcGVydHkgaXMgIiA8PCB2YWx1ZS5HZXRGb28oKTsKKyAgfQorICAuLi4KK307CitgYGAKKworeW91IHNob3VsZCBtb3ZlIHRoZSBsb2dpYyBvZiBgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKWAgaW50bworYE1hdGNoQW5kRXhwbGFpbigpYCwgdXNpbmcgdGhlIGBNYXRjaFJlc3VsdExpc3RlbmVyYCBhcmd1bWVudCB3aGVyZQordGhlIGA6OnN0ZDo6b3N0cmVhbWAgd2FzIHVzZWQ6CitgYGAKKy8vIE5ldyBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCB3b3JrcyB3aXRoIHRoZSBsYXRlc3QgR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisuLi4KK2NsYXNzIE15V29uZGVyZnVsTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPE15VHlwZT4geworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oTXlUeXBlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgKmxpc3RlbmVyIDw8ICJ0aGUgRm9vIHByb3BlcnR5IGlzICIgPDwgdmFsdWUuR2V0Rm9vKCk7CisgICAgcmV0dXJuIHZhbHVlLkdldEZvbygpID4gNTsKKyAgfQorICAuLi4KK307CitgYGAKKworSWYgeW91ciBtYXRjaGVyIGlzIGRlZmluZWQgdXNpbmcgYE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKWA6CitgYGAKKy8vIE9sZCBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbGF0ZXN0CisvLyBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKKy4uLgorY2xhc3MgTXlHcmVhdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIGJvb2wgTWF0Y2hlcyhNeVR5cGUgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0QmFyKCkgPCA0MjsKKyAgfQorICAuLi4KK307CisuLi4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihNeUdyZWF0TWF0Y2hlcigpKSAuLi4KK2BgYAorCit5b3Ugc2hvdWxkIHJlbmFtZSB0aGUgYE1hdGNoZXMoKWAgbWV0aG9kIHRvIGBNYXRjaEFuZEV4cGxhaW4oKWAgYW5kCithZGQgYSBgTWF0Y2hSZXN1bHRMaXN0ZW5lcipgIGFyZ3VtZW50ICh0aGUgc2FtZSBhcyB3aGF0IHlvdSBuZWVkIHRvIGRvCitmb3IgbWF0Y2hlcnMgZGVmaW5lZCBieSBpbXBsZW1lbnRpbmcgYE1hdGNoZXJJbnRlcmZhY2VgKToKK2BgYAorLy8gTmV3IG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IHdvcmtzIHdpdGggdGhlIGxhdGVzdCBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKKy4uLgorY2xhc3MgTXlHcmVhdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0QmFyKCkgPCA0MjsKKyAgfQorICAuLi4KK307CisuLi4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihNeUdyZWF0TWF0Y2hlcigpKSAuLi4KK2BgYAorCitJZiB5b3VyIHBvbHltb3JwaGljIG1hdGNoZXIgdXNlcyBgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKWAgZm9yIGJldHRlcgorZmFpbHVyZSBtZXNzYWdlczoKK2BgYAorLy8gT2xkIG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBsYXRlc3QKKy8vIEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNNYXRjaGVyOworLi4uCitjbGFzcyBNeUdyZWF0TWF0Y2hlciB7CisgcHVibGljOgorICAuLi4KKyAgYm9vbCBNYXRjaGVzKE15VHlwZSB2YWx1ZSkgY29uc3QgeworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzLgorICAgIHJldHVybiB2YWx1ZS5HZXRCYXIoKSA8IDQyOworICB9CisgIC4uLgorfTsKK3ZvaWQgRXhwbGFpbk1hdGNoUmVzdWx0VG8oY29uc3QgTXlHcmVhdE1hdGNoZXImIG1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIFByaW50cyBzb21lIGhlbHBmdWwgaW5mb3JtYXRpb24gdG8gb3MgdG8gaGVscAorICAvLyBhIHVzZXIgdW5kZXJzdGFuZCB3aHkgdmFsdWUgbWF0Y2hlcyAob3IgZG9lc24ndCBtYXRjaCkuCisgICpvcyA8PCAidGhlIEJhciBwcm9wZXJ0eSBpcyAiIDw8IHZhbHVlLkdldEJhcigpOworfQorLi4uIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTXlHcmVhdE1hdGNoZXIoKSkgLi4uCitgYGAKKworeW91J2xsIG5lZWQgdG8gbW92ZSB0aGUgbG9naWMgaW5zaWRlIGBFeHBsYWluTWF0Y2hSZXN1bHRUbygpYCB0bworYE1hdGNoQW5kRXhwbGFpbigpYDoKK2BgYAorLy8gTmV3IG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IHdvcmtzIHdpdGggdGhlIGxhdGVzdCBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKKy4uLgorY2xhc3MgTXlHcmVhdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICAqbGlzdGVuZXIgPDwgInRoZSBCYXIgcHJvcGVydHkgaXMgIiA8PCB2YWx1ZS5HZXRCYXIoKTsKKyAgICByZXR1cm4gdmFsdWUuR2V0QmFyKCkgPCA0MjsKKyAgfQorICAuLi4KK307CisuLi4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihNeUdyZWF0TWF0Y2hlcigpKSAuLi4KK2BgYAorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgeW91IGNhbiByZWFkIHRoZXNlCitbdHdvXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI1dyaXRpbmdfTmV3X01vbm9tb3JwaGljX01hdGNoZXJzKQorW3JlY2lwZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjV3JpdGluZ19OZXdfUG9seW1vcnBoaWNfTWF0Y2hlcnMpCitmcm9tIHRoZSBjb29rYm9vay4gIEFzIGFsd2F5cywgeW91CithcmUgd2VsY29tZSB0byBwb3N0IHF1ZXN0aW9ucyBvbiBgZ29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tYCBpZiB5b3UKK25lZWQgYW55IGhlbHAuCisKKyMjIFdoZW4gdXNpbmcgR29vZ2xlIE1vY2ssIGRvIEkgaGF2ZSB0byB1c2UgR29vZ2xlIFRlc3QgYXMgdGhlIHRlc3RpbmcgZnJhbWV3b3JrPyAgSSBoYXZlIG15IGZhdm9yaXRlIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCBkb24ndCB3YW50IHRvIHN3aXRjaC4gIyMKKworR29vZ2xlIE1vY2sgd29ya3Mgb3V0IG9mIHRoZSBib3ggd2l0aCBHb29nbGUgVGVzdC4gIEhvd2V2ZXIsIGl0J3MgZWFzeQordG8gY29uZmlndXJlIGl0IHRvIHdvcmsgd2l0aCBhbnkgdGVzdGluZyBmcmFtZXdvcmsgb2YgeW91ciBjaG9pY2UuCitbSGVyZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Gb3JEdW1taWVzI1VzaW5nX0dvb2dsZV9Nb2NrX3dpdGhfQW55X1Rlc3RpbmdfRnJhbWV3b3JrKSBpcyBob3cuCisKKyMjIEhvdyBhbSBJIHN1cHBvc2VkIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlc2UgaG9ycmlibGUgdGVtcGxhdGUgZXJyb3JzPyAjIworCitJZiB5b3UgYXJlIGNvbmZ1c2VkIGJ5IHRoZSBjb21waWxlciBlcnJvcnMgZ2NjIHRocmV3IGF0IHlvdSwKK3RyeSBjb25zdWx0aW5nIHRoZSBfR29vZ2xlIE1vY2sgRG9jdG9yXyB0b29sIGZpcnN0LiAgV2hhdCBpdCBkb2VzIGlzIHRvCitzY2FuIHN0ZGluIGZvciBnY2MgZXJyb3IgbWVzc2FnZXMsIGFuZCBzcGl0IG91dCBkaWFnbm9zZXMgb24gdGhlCitwcm9ibGVtcyAod2UgY2FsbCB0aGVtIGRpc2Vhc2VzKSB5b3VyIGNvZGUgaGFzLgorCitUbyAiaW5zdGFsbCIsIHJ1biBjb21tYW5kOgorYGBgCithbGlhcyBnbWQ9JzxwYXRoIHRvIGdvb2dsZW1vY2s+L3NjcmlwdHMvZ21vY2tfZG9jdG9yLnB5JworYGBgCisKK1RvIHVzZSBpdCwgZG86CitgYGAKKzx5b3VyLWZhdm9yaXRlLWJ1aWxkLWNvbW1hbmQ+IDx5b3VyLXRlc3Q+IDI+JjEgfCBnbWQKK2BgYAorCitGb3IgZXhhbXBsZToKK2BgYAorbWFrZSBteV90ZXN0IDI+JjEgfCBnbWQKK2BgYAorCitPciB5b3UgY2FuIHJ1biBgZ21kYCBhbmQgY29weS1uLXBhc3RlIGdjYydzIGVycm9yIG1lc3NhZ2VzIHRvIGl0LgorCisjIyBDYW4gSSBtb2NrIGEgdmFyaWFkaWMgZnVuY3Rpb24/ICMjCisKK1lvdSBjYW5ub3QgbW9jayBhIHZhcmlhZGljIGZ1bmN0aW9uIChpLmUuIGEgZnVuY3Rpb24gdGFraW5nIGVsbGlwc2lzCisoYC4uLmApIGFyZ3VtZW50cykgZGlyZWN0bHkgaW4gR29vZ2xlIE1vY2suCisKK1RoZSBwcm9ibGVtIGlzIHRoYXQgaW4gZ2VuZXJhbCwgdGhlcmUgaXMgX25vIHdheV8gZm9yIGEgbW9jayBvYmplY3QgdG8KK2tub3cgaG93IG1hbnkgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHZhcmlhZGljIG1ldGhvZCwgYW5kIHdoYXQKK3RoZSBhcmd1bWVudHMnIHR5cGVzIGFyZS4gIE9ubHkgdGhlIF9hdXRob3Igb2YgdGhlIGJhc2UgY2xhc3NfIGtub3dzCit0aGUgcHJvdG9jb2wsIGFuZCB3ZSBjYW5ub3QgbG9vayBpbnRvIGhpcyBoZWFkLgorCitUaGVyZWZvcmUsIHRvIG1vY2sgc3VjaCBhIGZ1bmN0aW9uLCB0aGUgX3VzZXJfIG11c3QgdGVhY2ggdGhlIG1vY2sKK29iamVjdCBob3cgdG8gZmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgdGhlaXIgdHlwZXMuICBPbmUKK3dheSB0byBkbyBpdCBpcyB0byBwcm92aWRlIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uLgorCitFbGxpcHNpcyBhcmd1bWVudHMgYXJlIGluaGVyaXRlZCBmcm9tIEMgYW5kIG5vdCByZWFsbHkgYSBDKysgZmVhdHVyZS4KK1RoZXkgYXJlIHVuc2FmZSB0byB1c2UgYW5kIGRvbid0IHdvcmsgd2l0aCBhcmd1bWVudHMgdGhhdCBoYXZlCitjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMuICBUaGVyZWZvcmUgd2UgcmVjb21tZW5kIHRvIGF2b2lkIHRoZW0gaW4KK0MrKyBhcyBtdWNoIGFzIHBvc3NpYmxlLgorCisjIyBNU1ZDIGdpdmVzIG1lIHdhcm5pbmcgQzQzMDEgb3IgQzQzNzMgd2hlbiBJIGRlZmluZSBhIG1vY2sgbWV0aG9kIHdpdGggYSBjb25zdCBwYXJhbWV0ZXIuICBXaHk/ICMjCisKK0lmIHlvdSBjb21waWxlIHRoaXMgdXNpbmcgTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAwNSBTUDE6CitgYGAKK2NsYXNzIEZvbyB7CisgIC4uLgorICB2aXJ0dWFsIHZvaWQgQmFyKGNvbnN0IGludCBpKSA9IDA7Cit9OworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgIC4uLgorICBNT0NLX01FVEhPRDEoQmFyLCB2b2lkKGNvbnN0IGludCBpKSk7Cit9OworYGBgCitZb3UgbWF5IGdldCB0aGUgZm9sbG93aW5nIHdhcm5pbmc6CitgYGAKK3dhcm5pbmcgQzQzMDE6ICdNb2NrRm9vOjpCYXInOiBvdmVycmlkaW5nIHZpcnR1YWwgZnVuY3Rpb24gb25seSBkaWZmZXJzIGZyb20gJ0Zvbzo6QmFyJyBieSBjb25zdC92b2xhdGlsZSBxdWFsaWZpZXIKK2BgYAorCitUaGlzIGlzIGEgTVNWQyBidWcuICBUaGUgc2FtZSBjb2RlIGNvbXBpbGVzIGZpbmUgd2l0aCBnY2MgLGZvcgorZXhhbXBsZS4gIElmIHlvdSB1c2UgVmlzdWFsIEMrKyAyMDA4IFNQMSwgeW91IHdvdWxkIGdldCB0aGUgd2FybmluZzoKK2BgYAord2FybmluZyBDNDM3MzogJ01vY2tGb286OkJhcic6IHZpcnR1YWwgZnVuY3Rpb24gb3ZlcnJpZGVzICdGb286OkJhcicsIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciBkaWQgbm90IG92ZXJyaWRlIHdoZW4gcGFyYW1ldGVycyBvbmx5IGRpZmZlcmVkIGJ5IGNvbnN0L3ZvbGF0aWxlIHF1YWxpZmllcnMKK2BgYAorCitJbiBDKyssIGlmIHlvdSBfZGVjbGFyZV8gYSBmdW5jdGlvbiB3aXRoIGEgYGNvbnN0YCBwYXJhbWV0ZXIsIHRoZQorYGNvbnN0YCBtb2RpZmllciBpcyBfaWdub3JlZF8uICBUaGVyZWZvcmUsIHRoZSBgRm9vYCBiYXNlIGNsYXNzIGFib3ZlCitpcyBlcXVpdmFsZW50IHRvOgorYGBgCitjbGFzcyBGb28geworICAuLi4KKyAgdmlydHVhbCB2b2lkIEJhcihpbnQgaSkgPSAwOyAgLy8gaW50IG9yIGNvbnN0IGludD8gIE1ha2VzIG5vIGRpZmZlcmVuY2UuCit9OworYGBgCisKK0luIGZhY3QsIHlvdSBjYW4gX2RlY2xhcmVfIEJhcigpIHdpdGggYW4gYGludGAgcGFyYW1ldGVyLCBhbmQgX2RlZmluZV8KK2l0IHdpdGggYSBgY29uc3QgaW50YCBwYXJhbWV0ZXIuICBUaGUgY29tcGlsZXIgd2lsbCBzdGlsbCBtYXRjaCB0aGVtCit1cC4KKworU2luY2UgbWFraW5nIGEgcGFyYW1ldGVyIGBjb25zdGAgaXMgbWVhbmluZ2xlc3MgaW4gdGhlIG1ldGhvZAorX2RlY2xhcmF0aW9uXywgd2UgcmVjb21tZW5kIHRvIHJlbW92ZSBpdCBpbiBib3RoIGBGb29gIGFuZCBgTW9ja0Zvb2AuCitUaGF0IHNob3VsZCB3b3JrYXJvdW5kIHRoZSBWQyBidWcuCisKK05vdGUgdGhhdCB3ZSBhcmUgdGFsa2luZyBhYm91dCB0aGUgX3RvcC1sZXZlbF8gYGNvbnN0YCBtb2RpZmllciBoZXJlLgorSWYgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciBvciByZWZlcmVuY2UsIGRlY2xhcmluZwordGhlIF9wb2ludGVlXyBvciBfcmVmZXJlZV8gYXMgYGNvbnN0YCBpcyBzdGlsbCBtZWFuaW5nZnVsLiAgRm9yCitleGFtcGxlLCB0aGUgZm9sbG93aW5nIHR3byBkZWNsYXJhdGlvbnMgYXJlIF9ub3RfIGVxdWl2YWxlbnQ6CitgYGAKK3ZvaWQgQmFyKGludCogcCk7ICAgICAgICAvLyBOZWl0aGVyIHAgbm9yICpwIGlzIGNvbnN0Lgordm9pZCBCYXIoY29uc3QgaW50KiBwKTsgIC8vIHAgaXMgbm90IGNvbnN0LCBidXQgKnAgaXMuCitgYGAKKworIyMgSSBoYXZlIGEgaHVnZSBtb2NrIGNsYXNzLCBhbmQgTWljcm9zb2Z0IFZpc3VhbCBDKysgcnVucyBvdXQgb2YgbWVtb3J5IHdoZW4gY29tcGlsaW5nIGl0LiAgV2hhdCBjYW4gSSBkbz8gIyMKKworV2UndmUgbm90aWNlZCB0aGF0IHdoZW4gdGhlIGAvY2xyYCBjb21waWxlciBmbGFnIGlzIHVzZWQsIFZpc3VhbCBDKysKK3VzZXMgNX42IHRpbWVzIGFzIG11Y2ggbWVtb3J5IHdoZW4gY29tcGlsaW5nIGEgbW9jayBjbGFzcy4gIFdlIHN1Z2dlc3QKK3RvIGF2b2lkIGAvY2xyYCB3aGVuIGNvbXBpbGluZyBuYXRpdmUgQysrIG1vY2tzLgorCisjIyBJIGNhbid0IGZpZ3VyZSBvdXQgd2h5IEdvb2dsZSBNb2NrIHRoaW5rcyBteSBleHBlY3RhdGlvbnMgYXJlIG5vdCBzYXRpc2ZpZWQuICBXaGF0IHNob3VsZCBJIGRvPyAjIworCitZb3UgbWlnaHQgd2FudCB0byBydW4geW91ciB0ZXN0IHdpdGgKK2AtLWdtb2NrX3ZlcmJvc2U9aW5mb2AuICBUaGlzIGZsYWcgbGV0cyBHb29nbGUgTW9jayBwcmludCBhIHRyYWNlCitvZiBldmVyeSBtb2NrIGZ1bmN0aW9uIGNhbGwgaXQgcmVjZWl2ZXMuICBCeSBzdHVkeWluZyB0aGUgdHJhY2UsCit5b3UnbGwgZ2FpbiBpbnNpZ2h0cyBvbiB3aHkgdGhlIGV4cGVjdGF0aW9ucyB5b3Ugc2V0IGFyZSBub3QgbWV0LgorCisjIyBIb3cgY2FuIEkgYXNzZXJ0IHRoYXQgYSBmdW5jdGlvbiBpcyBORVZFUiBjYWxsZWQ/ICMjCisKK2BgYAorRVhQRUNUX0NBTEwoZm9vLCBCYXIoXykpCisgICAgLlRpbWVzKDApOworYGBgCisKKyMjIEkgaGF2ZSBhIGZhaWxlZCB0ZXN0IHdoZXJlIEdvb2dsZSBNb2NrIHRlbGxzIG1lIFRXSUNFIHRoYXQgYSBwYXJ0aWN1bGFyIGV4cGVjdGF0aW9uIGlzIG5vdCBzYXRpc2ZpZWQuICBJc24ndCB0aGlzIHJlZHVuZGFudD8gIyMKKworV2hlbiBHb29nbGUgTW9jayBkZXRlY3RzIGEgZmFpbHVyZSwgaXQgcHJpbnRzIHJlbGV2YW50IGluZm9ybWF0aW9uCisodGhlIG1vY2sgZnVuY3Rpb24gYXJndW1lbnRzLCB0aGUgc3RhdGUgb2YgcmVsZXZhbnQgZXhwZWN0YXRpb25zLCBhbmQKK2V0YykgdG8gaGVscCB0aGUgdXNlciBkZWJ1Zy4gIElmIGFub3RoZXIgZmFpbHVyZSBpcyBkZXRlY3RlZCwgR29vZ2xlCitNb2NrIHdpbGwgZG8gdGhlIHNhbWUsIGluY2x1ZGluZyBwcmludGluZyB0aGUgc3RhdGUgb2YgcmVsZXZhbnQKK2V4cGVjdGF0aW9ucy4KKworU29tZXRpbWVzIGFuIGV4cGVjdGF0aW9uJ3Mgc3RhdGUgZGlkbid0IGNoYW5nZSBiZXR3ZWVuIHR3byBmYWlsdXJlcywKK2FuZCB5b3UnbGwgc2VlIHRoZSBzYW1lIGRlc2NyaXB0aW9uIG9mIHRoZSBzdGF0ZSB0d2ljZS4gIFRoZXkgYXJlCitob3dldmVyIF9ub3RfIHJlZHVuZGFudCwgYXMgdGhleSByZWZlciB0byBfZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lXy4KK1RoZSBmYWN0IHRoZXkgYXJlIHRoZSBzYW1lIF9pc18gaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24uCisKKyMjIEkgZ2V0IGEgaGVhcCBjaGVjayBmYWlsdXJlIHdoZW4gdXNpbmcgYSBtb2NrIG9iamVjdCwgYnV0IHVzaW5nIGEgcmVhbCBvYmplY3QgaXMgZmluZS4gIFdoYXQgY2FuIGJlIHdyb25nPyAjIworCitEb2VzIHRoZSBjbGFzcyAoaG9wZWZ1bGx5IGEgcHVyZSBpbnRlcmZhY2UpIHlvdSBhcmUgbW9ja2luZyBoYXZlIGEKK3ZpcnR1YWwgZGVzdHJ1Y3Rvcj8KKworV2hlbmV2ZXIgeW91IGRlcml2ZSBmcm9tIGEgYmFzZSBjbGFzcywgbWFrZSBzdXJlIGl0cyBkZXN0cnVjdG9yIGlzCit2aXJ0dWFsLiAgT3RoZXJ3aXNlIEJhZCBUaGluZ3Mgd2lsbCBoYXBwZW4uICBDb25zaWRlciB0aGUgZm9sbG93aW5nCitjb2RlOgorCitgYGAKK2NsYXNzIEJhc2UgeworIHB1YmxpYzoKKyAgLy8gTm90IHZpcnR1YWwsIGJ1dCBzaG91bGQgYmUuCisgIH5CYXNlKCkgeyAuLi4gfQorICAuLi4KK307CisKK2NsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CisgcHVibGljOgorICAuLi4KKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyB2YWx1ZV87Cit9OworCisuLi4KKyAgQmFzZSogcCA9IG5ldyBEZXJpdmVkOworICAuLi4KKyAgZGVsZXRlIHA7ICAvLyBTdXJwcmlzZSEgfkJhc2UoKSB3aWxsIGJlIGNhbGxlZCwgYnV0IH5EZXJpdmVkKCkgd2lsbCBub3QKKyAgICAgICAgICAgICAvLyAtIHZhbHVlXyBpcyBsZWFrZWQuCitgYGAKKworQnkgY2hhbmdpbmcgYH5CYXNlKClgIHRvIHZpcnR1YWwsIGB+RGVyaXZlZCgpYCB3aWxsIGJlIGNvcnJlY3RseQorY2FsbGVkIHdoZW4gYGRlbGV0ZSBwYCBpcyBleGVjdXRlZCwgYW5kIHRoZSBoZWFwIGNoZWNrZXIKK3dpbGwgYmUgaGFwcHkuCisKKyMjIFRoZSAibmV3ZXIgZXhwZWN0YXRpb25zIG92ZXJyaWRlIG9sZGVyIG9uZXMiIHJ1bGUgbWFrZXMgd3JpdGluZyBleHBlY3RhdGlvbnMgYXdrd2FyZC4gIFdoeSBkb2VzIEdvb2dsZSBNb2NrIGRvIHRoYXQ/ICMjCisKK1doZW4gcGVvcGxlIGNvbXBsYWluIGFib3V0IHRoaXMsIG9mdGVuIHRoZXkgYXJlIHJlZmVycmluZyB0byBjb2RlIGxpa2U6CisKK2BgYAorLy8gZm9vLkJhcigpIHNob3VsZCBiZSBjYWxsZWQgdHdpY2UsIHJldHVybiAxIHRoZSBmaXJzdCB0aW1lLCBhbmQgcmV0dXJuCisvLyAyIHRoZSBzZWNvbmQgdGltZS4gIEhvd2V2ZXIsIEkgaGF2ZSB0byB3cml0ZSB0aGUgZXhwZWN0YXRpb25zIGluIHRoZQorLy8gcmV2ZXJzZSBvcmRlci4gIFRoaXMgc3Vja3MgYmlnIHRpbWUhISEKK0VYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgLldpbGxPbmNlKFJldHVybigyKSkKKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CitgYGAKKworVGhlIHByb2JsZW0gaXMgdGhhdCB0aGV5IGRpZG4ndCBwaWNrIHRoZSAqKmJlc3QqKiB3YXkgdG8gZXhwcmVzcyB0aGUgdGVzdCdzCitpbnRlbnQuCisKK0J5IGRlZmF1bHQsIGV4cGVjdGF0aW9ucyBkb24ndCBoYXZlIHRvIGJlIG1hdGNoZWQgaW4gX2FueV8gcGFydGljdWxhcgorb3JkZXIuICBJZiB5b3Ugd2FudCB0aGVtIHRvIG1hdGNoIGluIGEgY2VydGFpbiBvcmRlciwgeW91IG5lZWQgdG8gYmUKK2V4cGxpY2l0LiAgVGhpcyBpcyBHb29nbGUgTW9jaydzIChhbmQgak1vY2sncykgZnVuZGFtZW50YWwgcGhpbG9zb3BoeTogaXQncworZWFzeSB0byBhY2NpZGVudGFsbHkgb3Zlci1zcGVjaWZ5IHlvdXIgdGVzdHMsIGFuZCB3ZSB3YW50IHRvIG1ha2UgaXQKK2hhcmRlciB0byBkbyBzby4KKworVGhlcmUgYXJlIHR3byBiZXR0ZXIgd2F5cyB0byB3cml0ZSB0aGUgdGVzdCBzcGVjLiAgWW91IGNvdWxkIGVpdGhlcgorcHV0IHRoZSBleHBlY3RhdGlvbnMgaW4gc2VxdWVuY2U6CisKK2BgYAorLy8gZm9vLkJhcigpIHNob3VsZCBiZSBjYWxsZWQgdHdpY2UsIHJldHVybiAxIHRoZSBmaXJzdCB0aW1lLCBhbmQgcmV0dXJuCisvLyAyIHRoZSBzZWNvbmQgdGltZS4gIFVzaW5nIGEgc2VxdWVuY2UsIHdlIGNhbiB3cml0ZSB0aGUgZXhwZWN0YXRpb25zCisvLyBpbiB0aGVpciBuYXR1cmFsIG9yZGVyLgoreworICBJblNlcXVlbmNlIHM7CisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworfQorYGBgCisKK29yIHlvdSBjYW4gcHV0IHRoZSBzZXF1ZW5jZSBvZiBhY3Rpb25zIGluIHRoZSBzYW1lIGV4cGVjdGF0aW9uOgorCitgYGAKKy8vIGZvby5CYXIoKSBzaG91bGQgYmUgY2FsbGVkIHR3aWNlLCByZXR1cm4gMSB0aGUgZmlyc3QgdGltZSwgYW5kIHJldHVybgorLy8gMiB0aGUgc2Vjb25kIHRpbWUuCitFWFBFQ1RfQ0FMTChmb28sIEJhcigpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCisgICAgLldpbGxPbmNlKFJldHVybigyKSkKKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworYGBgCisKK0JhY2sgdG8gdGhlIG9yaWdpbmFsIHF1ZXN0aW9uczogd2h5IGRvZXMgR29vZ2xlIE1vY2sgc2VhcmNoIHRoZQorZXhwZWN0YXRpb25zIChhbmQgYE9OX0NBTExgcykgZnJvbSBiYWNrIHRvIGZyb250PyAgQmVjYXVzZSB0aGlzCithbGxvd3MgYSB1c2VyIHRvIHNldCB1cCBhIG1vY2sncyBiZWhhdmlvciBmb3IgdGhlIGNvbW1vbiBjYXNlIGVhcmx5CisoZS5nLiBpbiB0aGUgbW9jaydzIGNvbnN0cnVjdG9yIG9yIHRoZSB0ZXN0IGZpeHR1cmUncyBzZXQtdXAgcGhhc2UpCithbmQgY3VzdG9taXplIGl0IHdpdGggbW9yZSBzcGVjaWZpYyBydWxlcyBsYXRlci4gIElmIEdvb2dsZSBNb2NrCitzZWFyY2hlcyBmcm9tIGZyb250IHRvIGJhY2ssIHRoaXMgdmVyeSB1c2VmdWwgcGF0dGVybiB3b24ndCBiZQorcG9zc2libGUuCisKKyMjIEdvb2dsZSBNb2NrIHByaW50cyBhIHdhcm5pbmcgd2hlbiBhIGZ1bmN0aW9uIHdpdGhvdXQgRVhQRUNUXF9DQUxMIGlzIGNhbGxlZCwgZXZlbiBpZiBJIGhhdmUgc2V0IGl0cyBiZWhhdmlvciB1c2luZyBPTlxfQ0FMTC4gIFdvdWxkIGl0IGJlIHJlYXNvbmFibGUgbm90IHRvIHNob3cgdGhlIHdhcm5pbmcgaW4gdGhpcyBjYXNlPyAjIworCitXaGVuIGNob29zaW5nIGJldHdlZW4gYmVpbmcgbmVhdCBhbmQgYmVpbmcgc2FmZSwgd2UgbGVhbiB0b3dhcmQgdGhlCitsYXR0ZXIuICBTbyB0aGUgYW5zd2VyIGlzIHRoYXQgd2UgdGhpbmsgaXQncyBiZXR0ZXIgdG8gc2hvdyB0aGUKK3dhcm5pbmcuCisKK09mdGVuIHBlb3BsZSB3cml0ZSBgT05fQ0FMTGBzIGluIHRoZSBtb2NrIG9iamVjdCdzCitjb25zdHJ1Y3RvciBvciBgU2V0VXAoKWAsIGFzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHJhcmVseSBjaGFuZ2VzIGZyb20KK3Rlc3QgdG8gdGVzdC4gIFRoZW4gaW4gdGhlIHRlc3QgYm9keSB0aGV5IHNldCB0aGUgZXhwZWN0YXRpb25zLCB3aGljaAorYXJlIG9mdGVuIGRpZmZlcmVudCBmb3IgZWFjaCB0ZXN0LiAgSGF2aW5nIGFuIGBPTl9DQUxMYCBpbiB0aGUgc2V0LXVwCitwYXJ0IG9mIGEgdGVzdCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgY2FsbHMgYXJlIGV4cGVjdGVkLiAgSWYgdGhlcmUncworbm8gYEVYUEVDVF9DQUxMYCBhbmQgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIGl0J3MgcG9zc2libHkgYW4gZXJyb3IuICBJZgord2UgcXVpZXRseSBsZXQgdGhlIGNhbGwgZ28gdGhyb3VnaCB3aXRob3V0IG5vdGlmeWluZyB0aGUgdXNlciwgYnVncworbWF5IGNyZWVwIGluIHVubm90aWNlZC4KKworSWYsIGhvd2V2ZXIsIHlvdSBhcmUgc3VyZSB0aGF0IHRoZSBjYWxscyBhcmUgT0ssIHlvdSBjYW4gd3JpdGUKKworYGBgCitFWFBFQ1RfQ0FMTChmb28sIEJhcihfKSkKKyAgICAuV2lsbFJlcGVhdGVkbHkoLi4uKTsKK2BgYAorCitpbnN0ZWFkIG9mCisKK2BgYAorT05fQ0FMTChmb28sIEJhcihfKSkKKyAgICAuV2lsbEJ5RGVmYXVsdCguLi4pOworYGBgCisKK1RoaXMgdGVsbHMgR29vZ2xlIE1vY2sgdGhhdCB5b3UgZG8gZXhwZWN0IHRoZSBjYWxscyBhbmQgbm8gd2FybmluZyBzaG91bGQgYmUKK3ByaW50ZWQuCisKK0Fsc28sIHlvdSBjYW4gY29udHJvbCB0aGUgdmVyYm9zaXR5IHVzaW5nIHRoZSBgLS1nbW9ja192ZXJib3NlYCBmbGFnLgorSWYgeW91IGZpbmQgdGhlIG91dHB1dCB0b28gbm9pc3kgd2hlbiBkZWJ1Z2dpbmcsIGp1c3QgY2hvb3NlIGEgbGVzcwordmVyYm9zZSBsZXZlbC4KKworIyMgSG93IGNhbiBJIGRlbGV0ZSB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50IGluIGFuIGFjdGlvbj8gIyMKKworSWYgeW91IGZpbmQgeW91cnNlbGYgbmVlZGluZyB0byBwZXJmb3JtIHNvbWUgYWN0aW9uIHRoYXQncyBub3QKK3N1cHBvcnRlZCBieSBHb29nbGUgTW9jayBkaXJlY3RseSwgcmVtZW1iZXIgdGhhdCB5b3UgY2FuIGRlZmluZSB5b3VyIG93bgorYWN0aW9ucyB1c2luZworW01ha2VBY3Rpb24oKV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNXcml0aW5nX05ld19BY3Rpb25zKSBvcgorW01ha2VQb2x5bW9ycGhpY0FjdGlvbigpXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI1dyaXRpbmdfTmV3X1BvbHltb3JwaGljX0FjdGlvbnMpLAorb3IgeW91IGNhbiB3cml0ZSBhIHN0dWIgZnVuY3Rpb24gYW5kIGludm9rZSBpdCB1c2luZworW0ludm9rZSgpXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI1VzaW5nX0Z1bmN0aW9uc19NZXRob2RzX0Z1bmN0b3JzKS4KKworIyMgTU9DS1xfTUVUSE9EbigpJ3Mgc2Vjb25kIGFyZ3VtZW50IGxvb2tzIGZ1bm55LiAgV2h5IGRvbid0IHlvdSB1c2UgdGhlIE1PQ0tcX01FVEhPRG4oTWV0aG9kLCByZXR1cm5cX3R5cGUsIGFyZ1xfMSwgLi4uLCBhcmdcX24pIHN5bnRheD8gIyMKKworV2hhdD8hICBJIHRoaW5rIGl0J3MgYmVhdXRpZnVsLiA6LSkKKworV2hpbGUgd2hpY2ggc3ludGF4IGxvb2tzIG1vcmUgbmF0dXJhbCBpcyBhIHN1YmplY3RpdmUgbWF0dGVyIHRvIHNvbWUKK2V4dGVudCwgR29vZ2xlIE1vY2sncyBzeW50YXggd2FzIGNob3NlbiBmb3Igc2V2ZXJhbCBwcmFjdGljYWwgYWR2YW50YWdlcyBpdAoraGFzLgorCitUcnkgdG8gbW9jayBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBtYXAgYXMgYW4gYXJndW1lbnQ6CitgYGAKK3ZpcnR1YWwgaW50IEdldFNpemUoY29uc3QgbWFwPGludCwgc3RkOjpzdHJpbmc+JiBtKTsKK2BgYAorCitVc2luZyB0aGUgcHJvcG9zZWQgc3ludGF4LCBpdCB3b3VsZCBiZToKK2BgYAorTU9DS19NRVRIT0QxKEdldFNpemUsIGludCwgY29uc3QgbWFwPGludCwgc3RkOjpzdHJpbmc+JiBtKTsKK2BgYAorCitHdWVzcyB3aGF0PyAgWW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGFzIHRoZSBjb21waWxlciB0aGlua3MgdGhhdAorYGNvbnN0IG1hcDxpbnQsIHN0ZDo6c3RyaW5nPiYgbWAgYXJlICoqdHdvKiosIG5vdCBvbmUsIGFyZ3VtZW50cy4gVG8gd29yaworYXJvdW5kIHRoaXMgeW91IGNhbiB1c2UgYHR5cGVkZWZgIHRvIGdpdmUgdGhlIG1hcCB0eXBlIGEgbmFtZSwgYnV0Cit0aGF0IGdldHMgaW4gdGhlIHdheSBvZiB5b3VyIHdvcmsuICBHb29nbGUgTW9jaydzIHN5bnRheCBhdm9pZHMgdGhpcworcHJvYmxlbSBhcyB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudCB0eXBlcyBhcmUgcHJvdGVjdGVkIGluc2lkZSBhIHBhaXIKK29mIHBhcmVudGhlc2VzOgorYGBgCisvLyBUaGlzIGNvbXBpbGVzIGZpbmUuCitNT0NLX01FVEhPRDEoR2V0U2l6ZSwgaW50KGNvbnN0IG1hcDxpbnQsIHN0ZDo6c3RyaW5nPiYgbSkpOworYGBgCisKK1lvdSBzdGlsbCBuZWVkIGEgYHR5cGVkZWZgIGlmIHRoZSByZXR1cm4gdHlwZSBjb250YWlucyBhbiB1bnByb3RlY3RlZAorY29tbWEsIGJ1dCB0aGF0J3MgbXVjaCByYXJlci4KKworT3RoZXIgYWR2YW50YWdlcyBpbmNsdWRlOgorICAxLiBgTU9DS19NRVRIT0QxKEZvbywgaW50LCBib29sKWAgY2FuIGxlYXZlIGEgcmVhZGVyIHdvbmRlciB3aGV0aGVyIHRoZSBtZXRob2QgcmV0dXJucyBgaW50YCBvciBgYm9vbGAsIHdoaWxlIHRoZXJlIHdvbid0IGJlIHN1Y2ggY29uZnVzaW9uIHVzaW5nIEdvb2dsZSBNb2NrJ3Mgc3ludGF4LgorICAxLiBUaGUgd2F5IEdvb2dsZSBNb2NrIGRlc2NyaWJlcyBhIGZ1bmN0aW9uIHR5cGUgaXMgbm90aGluZyBuZXcsIGFsdGhvdWdoIG1hbnkgcGVvcGxlIG1heSBub3QgYmUgZmFtaWxpYXIgd2l0aCBpdC4gIFRoZSBzYW1lIHN5bnRheCB3YXMgdXNlZCBpbiBDLCBhbmQgdGhlIGBmdW5jdGlvbmAgbGlicmFyeSBpbiBgdHIxYCB1c2VzIHRoaXMgc3ludGF4IGV4dGVuc2l2ZWx5LiAgU2luY2UgYHRyMWAgd2lsbCBiZWNvbWUgYSBwYXJ0IG9mIHRoZSBuZXcgdmVyc2lvbiBvZiBTVEwsIHdlIGZlZWwgdmVyeSBjb21mb3J0YWJsZSB0byBiZSBjb25zaXN0ZW50IHdpdGggaXQuCisgIDEuIFRoZSBmdW5jdGlvbiB0eXBlIHN5bnRheCBpcyBhbHNvIHVzZWQgaW4gb3RoZXIgcGFydHMgb2YgR29vZ2xlIE1vY2sncyBBUEkgKGUuZy4gdGhlIGFjdGlvbiBpbnRlcmZhY2UpIGluIG9yZGVyIHRvIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIHRyYWN0YWJsZS4gQSB1c2VyIG5lZWRzIHRvIGxlYXJuIGl0IGFueXdheSBpbiBvcmRlciB0byB1dGlsaXplIEdvb2dsZSBNb2NrJ3MgbW9yZSBhZHZhbmNlZCBmZWF0dXJlcy4gIFdlJ2QgYXMgd2VsbCBzdGljayB0byB0aGUgc2FtZSBzeW50YXggaW4gYE1PQ0tfTUVUSE9EKmAhCisKKyMjIE15IGNvZGUgY2FsbHMgYSBzdGF0aWMvZ2xvYmFsIGZ1bmN0aW9uLiAgQ2FuIEkgbW9jayBpdD8gIyMKKworWW91IGNhbiwgYnV0IHlvdSBuZWVkIHRvIG1ha2Ugc29tZSBjaGFuZ2VzLgorCitJbiBnZW5lcmFsLCBpZiB5b3UgZmluZCB5b3Vyc2VsZiBuZWVkaW5nIHRvIG1vY2sgYSBzdGF0aWMgZnVuY3Rpb24sCitpdCdzIGEgc2lnbiB0aGF0IHlvdXIgbW9kdWxlcyBhcmUgdG9vIHRpZ2h0bHkgY291cGxlZCAoYW5kIGxlc3MKK2ZsZXhpYmxlLCBsZXNzIHJldXNhYmxlLCBsZXNzIHRlc3RhYmxlLCBldGMpLiAgWW91IGFyZSBwcm9iYWJseSBiZXR0ZXIKK29mZiBkZWZpbmluZyBhIHNtYWxsIGludGVyZmFjZSBhbmQgY2FsbCB0aGUgZnVuY3Rpb24gdGhyb3VnaCB0aGF0CitpbnRlcmZhY2UsIHdoaWNoIHRoZW4gY2FuIGJlIGVhc2lseSBtb2NrZWQuICBJdCdzIGEgYml0IG9mIHdvcmsKK2luaXRpYWxseSwgYnV0IHVzdWFsbHkgcGF5cyBmb3IgaXRzZWxmIHF1aWNrbHkuCisKK1RoaXMgR29vZ2xlIFRlc3RpbmcgQmxvZworW3Bvc3RdKGh0dHA6Ly9nb29nbGV0ZXN0aW5nLmJsb2dzcG90LmNvbS8yMDA4LzA2L2RlZmVhdC1zdGF0aWMtY2xpbmcuaHRtbCkKK3NheXMgaXQgZXhjZWxsZW50bHkuICBDaGVjayBpdCBvdXQuCisKKyMjIE15IG1vY2sgb2JqZWN0IG5lZWRzIHRvIGRvIGNvbXBsZXggc3R1ZmYuICBJdCdzIGEgbG90IG9mIHBhaW4gdG8gc3BlY2lmeSB0aGUgYWN0aW9ucy4gIEdvb2dsZSBNb2NrIHN1Y2tzISAjIworCitJIGtub3cgaXQncyBub3QgYSBxdWVzdGlvbiwgYnV0IHlvdSBnZXQgYW4gYW5zd2VyIGZvciBmcmVlIGFueSB3YXkuIDotKQorCitXaXRoIEdvb2dsZSBNb2NrLCB5b3UgY2FuIGNyZWF0ZSBtb2NrcyBpbiBDKysgZWFzaWx5LiAgQW5kIHBlb3BsZSBtaWdodCBiZQordGVtcHRlZCB0byB1c2UgdGhlbSBldmVyeXdoZXJlLiBTb21ldGltZXMgdGhleSB3b3JrIGdyZWF0LCBhbmQKK3NvbWV0aW1lcyB5b3UgbWF5IGZpbmQgdGhlbSwgd2VsbCwgYSBwYWluIHRvIHVzZS4gU28sIHdoYXQncyB3cm9uZyBpbgordGhlIGxhdHRlciBjYXNlPworCitXaGVuIHlvdSB3cml0ZSBhIHRlc3Qgd2l0aG91dCB1c2luZyBtb2NrcywgeW91IGV4ZXJjaXNlIHRoZSBjb2RlIGFuZAorYXNzZXJ0IHRoYXQgaXQgcmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZSBvciB0aGF0IHRoZSBzeXN0ZW0gaXMgaW4gYW4KK2V4cGVjdGVkIHN0YXRlLiAgVGhpcyBpcyBzb21ldGltZXMgY2FsbGVkICJzdGF0ZS1iYXNlZCB0ZXN0aW5nIi4KKworTW9ja3MgYXJlIGdyZWF0IGZvciB3aGF0IHNvbWUgY2FsbCAiaW50ZXJhY3Rpb24tYmFzZWQiIHRlc3Rpbmc6CitpbnN0ZWFkIG9mIGNoZWNraW5nIHRoZSBzeXN0ZW0gc3RhdGUgYXQgdGhlIHZlcnkgZW5kLCBtb2NrIG9iamVjdHMKK3ZlcmlmeSB0aGF0IHRoZXkgYXJlIGludm9rZWQgdGhlIHJpZ2h0IHdheSBhbmQgcmVwb3J0IGFuIGVycm9yIGFzIHNvb24KK2FzIGl0IGFyaXNlcywgZ2l2aW5nIHlvdSBhIGhhbmRsZSBvbiB0aGUgcHJlY2lzZSBjb250ZXh0IGluIHdoaWNoIHRoZQorZXJyb3Igd2FzIHRyaWdnZXJlZC4gIFRoaXMgaXMgb2Z0ZW4gbW9yZSBlZmZlY3RpdmUgYW5kIGVjb25vbWljYWwgdG8KK2RvIHRoYW4gc3RhdGUtYmFzZWQgdGVzdGluZy4KKworSWYgeW91IGFyZSBkb2luZyBzdGF0ZS1iYXNlZCB0ZXN0aW5nIGFuZCB1c2luZyBhIHRlc3QgZG91YmxlIGp1c3QgdG8KK3NpbXVsYXRlIHRoZSByZWFsIG9iamVjdCwgeW91IGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIGEgZmFrZS4KK1VzaW5nIGEgbW9jayBpbiB0aGlzIGNhc2UgY2F1c2VzIHBhaW4sIGFzIGl0J3Mgbm90IGEgc3Ryb25nIHBvaW50IGZvcgorbW9ja3MgdG8gcGVyZm9ybSBjb21wbGV4IGFjdGlvbnMuICBJZiB5b3UgZXhwZXJpZW5jZSB0aGlzIGFuZCB0aGluawordGhhdCBtb2NrcyBzdWNrLCB5b3UgYXJlIGp1c3Qgbm90IHVzaW5nIHRoZSByaWdodCB0b29sIGZvciB5b3VyCitwcm9ibGVtLiBPciwgeW91IG1pZ2h0IGJlIHRyeWluZyB0byBzb2x2ZSB0aGUgd3JvbmcgcHJvYmxlbS4gOi0pCisKKyMjIEkgZ290IGEgd2FybmluZyAiVW5pbnRlcmVzdGluZyBmdW5jdGlvbiBjYWxsIGVuY291bnRlcmVkIC0gZGVmYXVsdCBhY3Rpb24gdGFrZW4uLiIgIFNob3VsZCBJIHBhbmljPyAjIworCitCeSBhbGwgbWVhbnMsIE5PISAgSXQncyBqdXN0IGFuIEZZSS4KKworV2hhdCBpdCBtZWFucyBpcyB0aGF0IHlvdSBoYXZlIGEgbW9jayBmdW5jdGlvbiwgeW91IGhhdmVuJ3Qgc2V0IGFueQorZXhwZWN0YXRpb25zIG9uIGl0IChieSBHb29nbGUgTW9jaydzIHJ1bGUgdGhpcyBtZWFucyB0aGF0IHlvdSBhcmUgbm90CitpbnRlcmVzdGVkIGluIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gYW5kIHRoZXJlZm9yZSBpdCBjYW4gYmUgY2FsbGVkCithbnkgbnVtYmVyIG9mIHRpbWVzKSwgYW5kIGl0IGlzIGNhbGxlZC4gIFRoYXQncyBPSyAtIHlvdSBkaWRuJ3Qgc2F5CitpdCdzIG5vdCBPSyB0byBjYWxsIHRoZSBmdW5jdGlvbiEKKworV2hhdCBpZiB5b3UgYWN0dWFsbHkgbWVhbnQgdG8gZGlzYWxsb3cgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQsIGJ1dAorZm9yZ290IHRvIHdyaXRlIGBFWFBFQ1RfQ0FMTChmb28sIEJhcigpKS5UaW1lcygwKWA/ICBXaGlsZQorb25lIGNhbiBhcmd1ZSB0aGF0IGl0J3MgdGhlIHVzZXIncyBmYXVsdCwgR29vZ2xlIE1vY2sgdHJpZXMgdG8gYmUgbmljZSBhbmQKK3ByaW50cyB5b3UgYSBub3RlLgorCitTbywgd2hlbiB5b3Ugc2VlIHRoZSBtZXNzYWdlIGFuZCBiZWxpZXZlIHRoYXQgdGhlcmUgc2hvdWxkbid0IGJlIGFueQordW5pbnRlcmVzdGluZyBjYWxscywgeW91IHNob3VsZCBpbnZlc3RpZ2F0ZSB3aGF0J3MgZ29pbmcgb24uICBUbyBtYWtlCit5b3VyIGxpZmUgZWFzaWVyLCBHb29nbGUgTW9jayBwcmludHMgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIGFyZ3VtZW50cword2hlbiBhbiB1bmludGVyZXN0aW5nIGNhbGwgaXMgZW5jb3VudGVyZWQuCisKKyMjIEkgd2FudCB0byBkZWZpbmUgYSBjdXN0b20gYWN0aW9uLiAgU2hvdWxkIEkgdXNlIEludm9rZSgpIG9yIGltcGxlbWVudCB0aGUgYWN0aW9uIGludGVyZmFjZT8gIyMKKworRWl0aGVyIHdheSBpcyBmaW5lIC0geW91IHdhbnQgdG8gY2hvb3NlIHRoZSBvbmUgdGhhdCdzIG1vcmUgY29udmVuaWVudAorZm9yIHlvdXIgY2lyY3Vtc3RhbmNlLgorCitVc3VhbGx5LCBpZiB5b3VyIGFjdGlvbiBpcyBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHR5cGUsIGRlZmluaW5nIGl0Cit1c2luZyBgSW52b2tlKClgIHNob3VsZCBiZSBlYXNpZXI7IGlmIHlvdXIgYWN0aW9uIGNhbiBiZSB1c2VkIGluCitmdW5jdGlvbnMgb2YgZGlmZmVyZW50IHR5cGVzIChlLmcuIGlmIHlvdSBhcmUgZGVmaW5pbmcKK2BSZXR1cm4odmFsdWUpYCksIGBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKWAgaXMKK2Vhc2llc3QuICBTb21ldGltZXMgeW91IHdhbnQgcHJlY2lzZSBjb250cm9sIG9uIHdoYXQgdHlwZXMgb2YKK2Z1bmN0aW9ucyB0aGUgYWN0aW9uIGNhbiBiZSB1c2VkIGluLCBhbmQgaW1wbGVtZW50aW5nCitgQWN0aW9uSW50ZXJmYWNlYCBpcyB0aGUgd2F5IHRvIGdvIGhlcmUuIFNlZSB0aGUgaW1wbGVtZW50YXRpb24gb2YKK2BSZXR1cm4oKWAgaW4gYGluY2x1ZGUvZ21vY2svZ21vY2stYWN0aW9ucy5oYCBmb3IgYW4gZXhhbXBsZS4KKworIyMgSSdtIHVzaW5nIHRoZSBzZXQtYXJndW1lbnQtcG9pbnRlZSBhY3Rpb24sIGFuZCB0aGUgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0ICJjb25mbGljdGluZyByZXR1cm4gdHlwZSBzcGVjaWZpZWQiLiAgV2hhdCBkb2VzIGl0IG1lYW4/ICMjCisKK1lvdSBnb3QgdGhpcyBlcnJvciBhcyBHb29nbGUgTW9jayBoYXMgbm8gaWRlYSB3aGF0IHZhbHVlIGl0IHNob3VsZCByZXR1cm4KK3doZW4gdGhlIG1vY2sgbWV0aG9kIGlzIGNhbGxlZC4gIGBTZXRBcmdQb2ludGVlKClgIHNheXMgd2hhdCB0aGUKK3NpZGUgZWZmZWN0IGlzLCBidXQgZG9lc24ndCBzYXkgd2hhdCB0aGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZS4gIFlvdQorbmVlZCBgRG9BbGwoKWAgdG8gY2hhaW4gYSBgU2V0QXJnUG9pbnRlZSgpYCB3aXRoIGEgYFJldHVybigpYC4KKworU2VlIHRoaXMgW3JlY2lwZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNNb2NraW5nX1NpZGVfRWZmZWN0cykgZm9yIG1vcmUgZGV0YWlscyBhbmQgYW4gZXhhbXBsZS4KKworCisjIyBNeSBxdWVzdGlvbiBpcyBub3QgaW4geW91ciBGQVEhICMjCisKK0lmIHlvdSBjYW5ub3QgZmluZCB0aGUgYW5zd2VyIHRvIHlvdXIgcXVlc3Rpb24gaW4gdGhpcyBGQVEsIHRoZXJlIGFyZQorc29tZSBvdGhlciByZXNvdXJjZXMgeW91IGNhbiB1c2U6CisKKyAgMS4gcmVhZCBvdGhlciBbd2lraSBwYWdlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svdy9saXN0KSwKKyAgMS4gc2VhcmNoIHRoZSBtYWlsaW5nIGxpc3QgW2FyY2hpdmVdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGVtb2NrL3RvcGljcyksCisgIDEuIGFzayBpdCBvbiBbZ29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tXShtYWlsdG86Z29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tKSBhbmQgc29tZW9uZSB3aWxsIGFuc3dlciBpdCAodG8gcHJldmVudCBzcGFtLCB3ZSByZXF1aXJlIHlvdSB0byBqb2luIHRoZSBbZGlzY3Vzc2lvbiBncm91cF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZW1vY2spIGJlZm9yZSB5b3UgY2FuIHBvc3QuKS4KKworUGxlYXNlIG5vdGUgdGhhdCBjcmVhdGluZyBhbiBpc3N1ZSBpbiB0aGUKK1tpc3N1ZSB0cmFja2VyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9pc3N1ZXMvbGlzdCkgaXMgX25vdF8KK2EgZ29vZCB3YXkgdG8gZ2V0IHlvdXIgYW5zd2VyLCBhcyBpdCBpcyBtb25pdG9yZWQgaW5mcmVxdWVudGx5IGJ5IGEKK3Zlcnkgc21hbGwgbnVtYmVyIG9mIHBlb3BsZS4KKworV2hlbiBhc2tpbmcgYSBxdWVzdGlvbiwgaXQncyBoZWxwZnVsIHRvIHByb3ZpZGUgYXMgbXVjaCBvZiB0aGUKK2ZvbGxvd2luZyBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSAocGVvcGxlIGNhbm5vdCBoZWxwIHlvdSBpZiB0aGVyZSdzCitub3QgZW5vdWdoIGluZm9ybWF0aW9uIGluIHlvdXIgcXVlc3Rpb24pOgorCisgICogdGhlIHZlcnNpb24gKG9yIHRoZSByZXZpc2lvbiBudW1iZXIgaWYgeW91IGNoZWNrIG91dCBmcm9tIFNWTiBkaXJlY3RseSkgb2YgR29vZ2xlIE1vY2sgeW91IHVzZSAoR29vZ2xlIE1vY2sgaXMgdW5kZXIgYWN0aXZlIGRldmVsb3BtZW50LCBzbyBpdCdzIHBvc3NpYmxlIHRoYXQgeW91ciBwcm9ibGVtIGhhcyBiZWVuIHNvbHZlZCBpbiBhIGxhdGVyIHZlcnNpb24pLAorICAqIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwKKyAgKiB0aGUgbmFtZSBhbmQgdmVyc2lvbiBvZiB5b3VyIGNvbXBpbGVyLAorICAqIHRoZSBjb21wbGV0ZSBjb21tYW5kIGxpbmUgZmxhZ3MgeW91IGdpdmUgdG8geW91ciBjb21waWxlciwKKyAgKiB0aGUgY29tcGxldGUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgKGlmIHRoZSBxdWVzdGlvbiBpcyBhYm91dCBjb21waWxhdGlvbiksCisgICogdGhlIF9hY3R1YWxfIGNvZGUgKGlkZWFsbHksIGEgbWluaW1hbCBidXQgY29tcGxldGUgcHJvZ3JhbSkgdGhhdCBoYXMgdGhlIHByb2JsZW0geW91IGVuY291bnRlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9Lbm93bklzc3Vlcy5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL0tub3duSXNzdWVzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYWRmNTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy9Lbm93bklzc3Vlcy5tZApAQCAtMCwwICsxLDE5IEBACitBcyBhbnkgbm9uLXRyaXZpYWwgc29mdHdhcmUgc3lzdGVtLCBHb29nbGUgTW9jayBoYXMgc29tZSBrbm93biBsaW1pdGF0aW9ucyBhbmQgcHJvYmxlbXMuICBXZSBhcmUgd29ya2luZyBvbiBpbXByb3ZpbmcgaXQsIGFuZCB3ZWxjb21lIHlvdXIgaGVscCEgIFRoZSBmb2xsb3cgaXMgYSBsaXN0IG9mIGlzc3VlcyB3ZSBrbm93IGFib3V0LgorCisKKworIyMgUkVBRE1FIGNvbnRhaW5zIG91dGRhdGVkIGluZm9ybWF0aW9uIG9uIEdvb2dsZSBNb2NrJ3MgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRlc3RpbmcgZnJhbWV3b3JrcyAjIworCitUaGUgYFJFQURNRWAgZmlsZSBpbiByZWxlYXNlIDEuMS4wIHN0aWxsIHNheXMgdGhhdCBHb29nbGUgTW9jayBvbmx5IHdvcmtzIHdpdGggR29vZ2xlIFRlc3QuICBBY3R1YWxseSwgeW91IGNhbiBjb25maWd1cmUgR29vZ2xlIE1vY2sgdG8gd29yayB3aXRoIGFueSB0ZXN0aW5nIGZyYW1ld29yayB5b3UgY2hvb3NlLgorCisjIyBUZXN0cyBmYWlsaW5nIG9uIG1hY2hpbmVzIHVzaW5nIFBvd2VyIFBDIENQVXMgKGUuZy4gc29tZSBNYWNzKSAjIworCitgZ21vY2tfb3V0cHV0X3Rlc3RgIGFuZCBgZ21vY2stcHJpbnRlcnNfdGVzdGAgYXJlIGtub3duIHRvIGZhaWwgd2l0aCBQb3dlciBQQyBDUFVzLiAgVGhpcyBpcyBkdWUgdG8gcG9ydGFiaWxpdHkgaXNzdWVzIHdpdGggdGhlc2UgdGVzdHMsIGFuZCBpcyBub3QgYW4gaW5kaWNhdGlvbiBvZiBwcm9ibGVtcyBpbiBHb29nbGUgTW9jayBpdHNlbGYuICBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlbS4KKworIyMgRmFpbGVkIHRvIHJlc29sdmUgbGliZ3Rlc3Quc28uMCBpbiB0ZXN0cyB3aGVuIGJ1aWx0IGFnYWluc3QgaW5zdGFsbGVkIEdvb2dsZSBUZXN0ICMjCisKK1RoaXMgb25seSBhcHBsaWVzIGlmIHlvdSBtYW51YWxseSBidWlsdCBhbmQgaW5zdGFsbGVkIEdvb2dsZSBUZXN0LCBhbmQgdGhlbiBidWlsdCBhIEdvb2dsZSBNb2NrIGFnYWluc3QgaXQgKGVpdGhlciBleHBsaWNpdGx5LCBvciBiZWNhdXNlIGd0ZXN0LWNvbmZpZyB3YXMgaW4geW91ciBwYXRoIHBvc3QtaW5zdGFsbCkuIEluIHRoaXMgc2l0dWF0aW9uLCBMaWJ0b29sIGhhcyBhIGtub3duIGlzc3VlIHdpdGggY2VydGFpbiBzeXN0ZW1zJyBsZGNvbmZpZyBzZXR1cDoKKworaHR0cDovL2FydGljbGUuZ21hbmUub3JnL2dtYW5lLmNvbXAuc3lzdXRpbHMuYXV0b21ha2UuZ2VuZXJhbC85MDI1CisKK1RoaXMgcmVxdWlyZXMgYSBtYW51YWwgcnVuIG9mICJzdWRvIGxkY29uZmlnIiBhZnRlciB0aGUgInN1ZG8gbWFrZSBpbnN0YWxsIiBmb3IgR29vZ2xlIFRlc3QgYmVmb3JlIGFueSBiaW5hcmllcyB3aGljaCBsaW5rIGFnYWluc3QgaXQgY2FuIGJlIGV4ZWN1dGVkLiBUaGlzIGlzbid0IGEgYnVnIGluIG91ciBpbnN0YWxsLCBidXQgd2Ugc2hvdWxkIGF0IGxlYXN0IGhhdmUgZG9jdW1lbnRlZCBpdCBvciBoYWNrZWQgYSB3b3JrLWFyb3VuZCBpbnRvIG91ciBpbnN0YWxsLiBXZSBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlc2Ugc29sdXRpb25zIGluIG91ciBuZXh0IHJlbGVhc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNS9DaGVhdFNoZWV0Lm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNS9DaGVhdFNoZWV0Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2JlZDQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV81L0NoZWF0U2hlZXQubWQKQEAgLTAsMCArMSw1MjUgQEAKKworCisjIERlZmluaW5nIGEgTW9jayBDbGFzcyAjCisKKyMjIE1vY2tpbmcgYSBOb3JtYWwgQ2xhc3MgIyMKKworR2l2ZW4KK2BgYAorY2xhc3MgRm9vIHsKKyAgLi4uCisgIHZpcnR1YWwgfkZvbygpOworICB2aXJ0dWFsIGludCBHZXRTaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0cmluZyBEZXNjcmliZShjb25zdCBjaGFyKiBuYW1lKSA9IDA7CisgIHZpcnR1YWwgc3RyaW5nIERlc2NyaWJlKGludCB0eXBlKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBQcm9jZXNzKEJhciBlbGVtLCBpbnQgY291bnQpID0gMDsKK307CitgYGAKKyhub3RlIHRoYXQgYH5Gb28oKWAgKiptdXN0KiogYmUgdmlydHVhbCkgd2UgY2FuIGRlZmluZSBpdHMgbW9jayBhcworYGBgCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0U2l6ZSwgaW50KCkpOworICBNT0NLX01FVEhPRDEoRGVzY3JpYmUsIHN0cmluZyhjb25zdCBjaGFyKiBuYW1lKSk7CisgIE1PQ0tfTUVUSE9EMShEZXNjcmliZSwgc3RyaW5nKGludCB0eXBlKSk7CisgIE1PQ0tfTUVUSE9EMihQcm9jZXNzLCBib29sKEJhciBlbGVtLCBpbnQgY291bnQpKTsKK307CitgYGAKKworVG8gY3JlYXRlIGEgIm5pY2UiIG1vY2sgb2JqZWN0IHdoaWNoIGlnbm9yZXMgYWxsIHVuaW50ZXJlc3RpbmcgY2FsbHMsCitvciBhICJzdHJpY3QiIG1vY2sgb2JqZWN0LCB3aGljaCB0cmVhdHMgdGhlbSBhcyBmYWlsdXJlczoKK2BgYAorTmljZU1vY2s8TW9ja0Zvbz4gbmljZV9mb287ICAgICAvLyBUaGUgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28uCitTdHJpY3RNb2NrPE1vY2tGb28+IHN0cmljdF9mb287IC8vIFRoZSB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgTW9ja0Zvby4KK2BgYAorCisjIyBNb2NraW5nIGEgQ2xhc3MgVGVtcGxhdGUgIyMKKworVG8gbW9jaworYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbT4KK2NsYXNzIFN0YWNrSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIH5TdGFja0ludGVyZmFjZSgpOworICB2aXJ0dWFsIGludCBHZXRTaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgUHVzaChjb25zdCBFbGVtJiB4KSA9IDA7Cit9OworYGBgCisobm90ZSB0aGF0IGB+U3RhY2tJbnRlcmZhY2UoKWAgKiptdXN0KiogYmUgdmlydHVhbCkganVzdCBhcHBlbmQgYF9UYCB0byB0aGUgYE1PQ0tfKmAgbWFjcm9zOgorYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbT4KK2NsYXNzIE1vY2tTdGFjayA6IHB1YmxpYyBTdGFja0ludGVyZmFjZTxFbGVtPiB7CisgcHVibGljOgorICAuLi4KKyAgTU9DS19DT05TVF9NRVRIT0QwX1QoR2V0U2l6ZSwgaW50KCkpOworICBNT0NLX01FVEhPRDFfVChQdXNoLCB2b2lkKGNvbnN0IEVsZW0mIHgpKTsKK307CitgYGAKKworIyMgU3BlY2lmeWluZyBDYWxsaW5nIENvbnZlbnRpb25zIGZvciBNb2NrIEZ1bmN0aW9ucyAjIworCitJZiB5b3VyIG1vY2sgZnVuY3Rpb24gZG9lc24ndCB1c2UgdGhlIGRlZmF1bHQgY2FsbGluZyBjb252ZW50aW9uLCB5b3UKK2NhbiBzcGVjaWZ5IGl0IGJ5IGFwcGVuZGluZyBgX1dJVEhfQ0FMTFRZUEVgIHRvIGFueSBvZiB0aGUgbWFjcm9zCitkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHR3byBzZWN0aW9ucyBhbmQgc3VwcGx5aW5nIHRoZSBjYWxsaW5nCitjb252ZW50aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgbWFjcm8uIEZvciBleGFtcGxlLAorYGBgCisgIE1PQ0tfTUVUSE9EXzFfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgRm9vLCBib29sKGludCBuKSk7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMl9XSVRIX0NBTExUWVBFKFNURE1FVEhPRENBTExUWVBFLCBCYXIsIGludChkb3VibGUgeCwgZG91YmxlIHkpKTsKK2BgYAord2hlcmUgYFNURE1FVEhPRENBTExUWVBFYCBpcyBkZWZpbmVkIGJ5IGA8b2JqYmFzZS5oPmAgb24gV2luZG93cy4KKworIyBVc2luZyBNb2NrcyBpbiBUZXN0cyAjCisKK1RoZSB0eXBpY2FsIGZsb3cgaXM6CisgIDEuIEltcG9ydCB0aGUgR29vZ2xlIE1vY2sgbmFtZXMgeW91IG5lZWQgdG8gdXNlLiBBbGwgR29vZ2xlIE1vY2sgbmFtZXMgYXJlIGluIHRoZSBgdGVzdGluZ2AgbmFtZXNwYWNlIHVubGVzcyB0aGV5IGFyZSBtYWNyb3Mgb3Igb3RoZXJ3aXNlIG5vdGVkLgorICAxLiBDcmVhdGUgdGhlIG1vY2sgb2JqZWN0cy4KKyAgMS4gT3B0aW9uYWxseSwgc2V0IHRoZSBkZWZhdWx0IGFjdGlvbnMgb2YgdGhlIG1vY2sgb2JqZWN0cy4KKyAgMS4gU2V0IHlvdXIgZXhwZWN0YXRpb25zIG9uIHRoZSBtb2NrIG9iamVjdHMgKEhvdyB3aWxsIHRoZXkgYmUgY2FsbGVkPyBXaGF0IHdpbCB0aGV5IGRvPykuCisgIDEuIEV4ZXJjaXNlIGNvZGUgdGhhdCB1c2VzIHRoZSBtb2NrIG9iamVjdHM7IGlmIG5lY2Vzc2FyeSwgY2hlY2sgdGhlIHJlc3VsdCB1c2luZyBbR29vZ2xlIFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LykgYXNzZXJ0aW9ucy4KKyAgMS4gV2hlbiBhIG1vY2sgb2JqZWN0cyBpcyBkZXN0cnVjdGVkLCBHb29nbGUgTW9jayBhdXRvbWF0aWNhbGx5IHZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiBpdCBoYXZlIGJlZW4gc2F0aXNmaWVkLgorCitIZXJlIGlzIGFuIGV4YW1wbGU6CitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjMQorCitURVNUKEJhclRlc3QsIERvZXNUaGlzKSB7CisgIE1vY2tGb28gZm9vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICMyCisKKyAgT05fQ0FMTChmb28sIEdldFNpemUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzMKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7CisgIC8vIC4uLiBvdGhlciBkZWZhdWx0IGFjdGlvbnMgLi4uCisKKyAgRVhQRUNUX0NBTEwoZm9vLCBEZXNjcmliZSg1KSkgICAgICAgICAgICAgICAgICAgLy8gIzQKKyAgICAgIC5UaW1lcygzKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigiQ2F0ZWdvcnkgNSIpKTsKKyAgLy8gLi4uIG90aGVyIGV4cGVjdGF0aW9ucyAuLi4KKworICBFWFBFQ1RfRVEoImdvb2QiLCBNeVByb2R1Y3Rpb25GdW5jdGlvbigmZm9vKSk7ICAvLyAjNQorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjNgorYGBgCisKKyMgU2V0dGluZyBEZWZhdWx0IEFjdGlvbnMgIworCitHb29nbGUgTW9jayBoYXMgYSAqKmJ1aWx0LWluIGRlZmF1bHQgYWN0aW9uKiogZm9yIGFueSBmdW5jdGlvbiB0aGF0CityZXR1cm5zIGB2b2lkYCwgYGJvb2xgLCBhIG51bWVyaWMgdmFsdWUsIG9yIGEgcG9pbnRlci4KKworVG8gY3VzdG9taXplIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgZnVuY3Rpb25zIHdpdGggcmV0dXJuIHR5cGUgYFRgIGdsb2JhbGx5OgorYGBgCit1c2luZyA6OnRlc3Rpbmc6OkRlZmF1bHRWYWx1ZTsKKworRGVmYXVsdFZhbHVlPFQ+OjpTZXQodmFsdWUpOyAgLy8gU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSB0byBiZSByZXR1cm5lZC4KKy8vIC4uLiB1c2UgdGhlIG1vY2tzIC4uLgorRGVmYXVsdFZhbHVlPFQ+OjpDbGVhcigpOyAgICAgLy8gUmVzZXRzIHRoZSBkZWZhdWx0IHZhbHVlLgorYGBgCisKK1RvIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBtZXRob2QsIHVzZSBgT05fQ0FMTCgpYDoKK2BgYAorT05fQ0FMTChtb2NrX29iamVjdCwgbWV0aG9kKG1hdGNoZXJzKSkKKyAgICAuV2l0aChtdWx0aV9hcmd1bWVudF9tYXRjaGVyKSAgPworICAgIC5XaWxsQnlEZWZhdWx0KGFjdGlvbik7CitgYGAKKworIyBTZXR0aW5nIEV4cGVjdGF0aW9ucyAjCisKK2BFWFBFQ1RfQ0FMTCgpYCBzZXRzICoqZXhwZWN0YXRpb25zKiogb24gYSBtb2NrIG1ldGhvZCAoSG93IHdpbGwgaXQgYmUKK2NhbGxlZD8gV2hhdCB3aWxsIGl0IGRvPyk6CitgYGAKK0VYUEVDVF9DQUxMKG1vY2tfb2JqZWN0LCBtZXRob2QobWF0Y2hlcnMpKQorICAgIC5XaXRoKG11bHRpX2FyZ3VtZW50X21hdGNoZXIpICA/CisgICAgLlRpbWVzKGNhcmRpbmFsaXR5KSAgICAgICAgICAgID8KKyAgICAuSW5TZXF1ZW5jZShzZXF1ZW5jZXMpICAgICAgICAgKgorICAgIC5BZnRlcihleHBlY3RhdGlvbnMpICAgICAgICAgICAqCisgICAgLldpbGxPbmNlKGFjdGlvbikgICAgICAgICAgICAgICoKKyAgICAuV2lsbFJlcGVhdGVkbHkoYWN0aW9uKSAgICAgICAgPworICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7ICAgICAgICA/CitgYGAKKworSWYgYFRpbWVzKClgIGlzIG9taXR0ZWQsIHRoZSBjYXJkaW5hbGl0eSBpcyBhc3N1bWVkIHRvIGJlOgorCisgICogYFRpbWVzKDEpYCB3aGVuIHRoZXJlIGlzIG5laXRoZXIgYFdpbGxPbmNlKClgIG5vciBgV2lsbFJlcGVhdGVkbHkoKWA7CisgICogYFRpbWVzKG4pYCB3aGVuIHRoZXJlIGFyZSBgbiBXaWxsT25jZSgpYHMgYnV0IG5vIGBXaWxsUmVwZWF0ZWRseSgpYCwgd2hlcmUgYG5gID49IDE7IG9yCisgICogYFRpbWVzKEF0TGVhc3QobikpYCB3aGVuIHRoZXJlIGFyZSBgbiBXaWxsT25jZSgpYHMgYW5kIGEgYFdpbGxSZXBlYXRlZGx5KClgLCB3aGVyZSBgbmAgPj0gMC4KKworQSBtZXRob2Qgd2l0aCBubyBgRVhQRUNUX0NBTEwoKWAgaXMgZnJlZSB0byBiZSBpbnZva2VkIF9hbnkgbnVtYmVyIG9mIHRpbWVzXywgYW5kIHRoZSBkZWZhdWx0IGFjdGlvbiB3aWxsIGJlIHRha2VuIGVhY2ggdGltZS4KKworIyBNYXRjaGVycyAjCisKK0EgKiptYXRjaGVyKiogbWF0Y2hlcyBhIF9zaW5nbGVfIGFyZ3VtZW50LiAgWW91IGNhbiB1c2UgaXQgaW5zaWRlCitgT05fQ0FMTCgpYCBvciBgRVhQRUNUX0NBTEwoKWAsIG9yIHVzZSBpdCB0byB2YWxpZGF0ZSBhIHZhbHVlCitkaXJlY3RseToKKworfCBgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpYCB8IEFzc2VydHMgdGhhdCBgdmFsdWVgIG1hdGNoZXMgYG1hdGNoZXJgLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAgfCBUaGUgc2FtZSBhcyBgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpYCwgZXhjZXB0IHRoYXQgaXQgZ2VuZXJhdGVzIGEgKipmYXRhbCoqIGZhaWx1cmUuIHwKKworQnVpbHQtaW4gbWF0Y2hlcnMgKHdoZXJlIGBhcmd1bWVudGAgaXMgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50KSBhcmUKK2RpdmlkZWQgaW50byBzZXZlcmFsIGNhdGVnb3JpZXM6CisKKyMjIFdpbGRjYXJkICMjCit8YF9gfGBhcmd1bWVudGAgY2FuIGJlIGFueSB2YWx1ZSBvZiB0aGUgY29ycmVjdCB0eXBlLnwKK3w6LS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBPHR5cGU+KClgIG9yIGBBbjx0eXBlPigpYHxgYXJndW1lbnRgIGNhbiBiZSBhbnkgdmFsdWUgb2YgdHlwZSBgdHlwZWAuICAgICB8CisKKyMjIEdlbmVyaWMgQ29tcGFyaXNvbiAjIworCit8YEVxKHZhbHVlKWAgb3IgYHZhbHVlYHxgYXJndW1lbnQgPT0gdmFsdWVgfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgR2UodmFsdWUpYCAgICAgICAgICAgfGBhcmd1bWVudCA+PSB2YWx1ZWB8Cit8YEd0KHZhbHVlKWAgICAgICAgICAgIHxgYXJndW1lbnQgPiB2YWx1ZWAgfAorfGBMZSh2YWx1ZSlgICAgICAgICAgICB8YGFyZ3VtZW50IDw9IHZhbHVlYHwKK3xgTHQodmFsdWUpYCAgICAgICAgICAgfGBhcmd1bWVudCA8IHZhbHVlYCB8Cit8YE5lKHZhbHVlKWAgICAgICAgICAgIHxgYXJndW1lbnQgIT0gdmFsdWVgfAorfGBJc051bGwoKWAgICAgICAgICAgICB8YGFyZ3VtZW50YCBpcyBhIGBOVUxMYCBwb2ludGVyIChyYXcgb3Igc21hcnQpLnwKK3xgTm90TnVsbCgpYCAgICAgICAgICAgfGBhcmd1bWVudGAgaXMgYSBub24tbnVsbCBwb2ludGVyIChyYXcgb3Igc21hcnQpLnwKK3xgUmVmKHZhcmlhYmxlKWAgICAgICAgfGBhcmd1bWVudGAgaXMgYSByZWZlcmVuY2UgdG8gYHZhcmlhYmxlYC58Cit8YFR5cGVkRXE8dHlwZT4odmFsdWUpYHxgYXJndW1lbnRgIGhhcyB0eXBlIGB0eXBlYCBhbmQgaXMgZXF1YWwgdG8gYHZhbHVlYC4gWW91IG1heSBuZWVkIHRvIHVzZSB0aGlzIGluc3RlYWQgb2YgYEVxKHZhbHVlKWAgd2hlbiB0aGUgbW9jayBmdW5jdGlvbiBpcyBvdmVybG9hZGVkLnwKKworRXhjZXB0IGBSZWYoKWAsIHRoZXNlIG1hdGNoZXJzIG1ha2UgYSBfY29weV8gb2YgYHZhbHVlYCBpbiBjYXNlIGl0J3MKK21vZGlmaWVkIG9yIGRlc3RydWN0ZWQgbGF0ZXIuIElmIHRoZSBjb21waWxlciBjb21wbGFpbnMgdGhhdCBgdmFsdWVgCitkb2Vzbid0IGhhdmUgYSBwdWJsaWMgY29weSBjb25zdHJ1Y3RvciwgdHJ5IHdyYXAgaXQgaW4gYEJ5UmVmKClgLAorZS5nLiBgRXEoQnlSZWYobm9uX2NvcHlhYmxlX3ZhbHVlKSlgLiBJZiB5b3UgZG8gdGhhdCwgbWFrZSBzdXJlCitgbm9uX2NvcHlhYmxlX3ZhbHVlYCBpcyBub3QgY2hhbmdlZCBhZnRlcndhcmRzLCBvciB0aGUgbWVhbmluZyBvZiB5b3VyCittYXRjaGVyIHdpbGwgYmUgY2hhbmdlZC4KKworIyMgRmxvYXRpbmctUG9pbnQgTWF0Y2hlcnMgIyMKKworfGBEb3VibGVFcShhX2RvdWJsZSlgfGBhcmd1bWVudGAgaXMgYSBgZG91YmxlYCB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGBhX2RvdWJsZWAsIHRyZWF0aW5nIHR3byBOYU5zIGFzIHVuZXF1YWwufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBGbG9hdEVxKGFfZmxvYXQpYCAgfGBhcmd1bWVudGAgaXMgYSBgZmxvYXRgIHZhbHVlIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gYGFfZmxvYXRgLCB0cmVhdGluZyB0d28gTmFOcyBhcyB1bmVxdWFsLiAgfAorfGBOYW5TZW5zaXRpdmVEb3VibGVFcShhX2RvdWJsZSlgfGBhcmd1bWVudGAgaXMgYSBgZG91YmxlYCB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGBhX2RvdWJsZWAsIHRyZWF0aW5nIHR3byBOYU5zIGFzIGVxdWFsLiAgfAorfGBOYW5TZW5zaXRpdmVGbG9hdEVxKGFfZmxvYXQpYHxgYXJndW1lbnRgIGlzIGEgYGZsb2F0YCB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGBhX2Zsb2F0YCwgdHJlYXRpbmcgdHdvIE5hTnMgYXMgZXF1YWwuICAgIHwKKworVGhlIGFib3ZlIG1hdGNoZXJzIHVzZSBVTFAtYmFzZWQgY29tcGFyaXNvbiAodGhlIHNhbWUgYXMgdXNlZCBpbgorW0dvb2dsZSBUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8pKS4gVGhleQorYXV0b21hdGljYWxseSBwaWNrIGEgcmVhc29uYWJsZSBlcnJvciBib3VuZCBiYXNlZCBvbiB0aGUgYWJzb2x1dGUKK3ZhbHVlIG9mIHRoZSBleHBlY3RlZCB2YWx1ZS4gIGBEb3VibGVFcSgpYCBhbmQgYEZsb2F0RXEoKWAgY29uZm9ybSB0bwordGhlIElFRUUgc3RhbmRhcmQsIHdoaWNoIHJlcXVpcmVzIGNvbXBhcmluZyB0d28gTmFOcyBmb3IgZXF1YWxpdHkgdG8KK3JldHVybiBmYWxzZS4gVGhlIGBOYW5TZW5zaXRpdmUqYCB2ZXJzaW9uIGluc3RlYWQgdHJlYXRzIHR3byBOYU5zIGFzCitlcXVhbCwgd2hpY2ggaXMgb2Z0ZW4gd2hhdCBhIHVzZXIgd2FudHMuCisKKyMjIFN0cmluZyBNYXRjaGVycyAjIworCitUaGUgYGFyZ3VtZW50YCBjYW4gYmUgZWl0aGVyIGEgQyBzdHJpbmcgb3IgYSBDKysgc3RyaW5nIG9iamVjdDoKKworfGBDb250YWluc1JlZ2V4KHN0cmluZylgfGBhcmd1bWVudGAgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEVuZHNXaXRoKHN1ZmZpeClgICAgICB8YGFyZ3VtZW50YCBlbmRzIHdpdGggc3RyaW5nIGBzdWZmaXhgLiAgICAgICAgICAgfAorfGBIYXNTdWJzdHIoc3RyaW5nKWAgICAgfGBhcmd1bWVudGAgY29udGFpbnMgYHN0cmluZ2AgYXMgYSBzdWItc3RyaW5nLiAgIHwKK3xgTWF0Y2hlc1JlZ2V4KHN0cmluZylgIHxgYXJndW1lbnRgIG1hdGNoZXMgdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIHRoZSBtYXRjaCBzdGFydGluZyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBlbmRpbmcgYXQgdGhlIGxhc3QgY2hhcmFjdGVyLnwKK3xgU3RhcnRzV2l0aChwcmVmaXgpYCAgIHxgYXJndW1lbnRgIHN0YXJ0cyB3aXRoIHN0cmluZyBgcHJlZml4YC4gICAgICAgICB8Cit8YFN0ckNhc2VFcShzdHJpbmcpYCAgICB8YGFyZ3VtZW50YCBpcyBlcXVhbCB0byBgc3RyaW5nYCwgaWdub3JpbmcgY2FzZS4gfAorfGBTdHJDYXNlTmUoc3RyaW5nKWAgICAgfGBhcmd1bWVudGAgaXMgbm90IGVxdWFsIHRvIGBzdHJpbmdgLCBpZ25vcmluZyBjYXNlLnwKK3xgU3RyRXEoc3RyaW5nKWAgICAgICAgIHxgYXJndW1lbnRgIGlzIGVxdWFsIHRvIGBzdHJpbmdgLiAgICAgICAgICAgICAgICB8Cit8YFN0ck5lKHN0cmluZylgICAgICAgICB8YGFyZ3VtZW50YCBpcyBub3QgZXF1YWwgdG8gYHN0cmluZ2AuICAgICAgICAgICAgfAorCitgU3RyQ2FzZUVxKClgLCBgU3RyQ2FzZU5lKClgLCBgU3RyRXEoKWAsIGFuZCBgU3RyTmUoKWAgd29yayBmb3Igd2lkZQorc3RyaW5ncyBhcyB3ZWxsLgorCisjIyBDb250YWluZXIgTWF0Y2hlcnMgIyMKKworTW9zdCBTVEwtc3R5bGUgY29udGFpbmVycyBzdXBwb3J0IGA9PWAsIHNvIHlvdSBjYW4gdXNlCitgRXEoZXhwZWN0ZWRfY29udGFpbmVyKWAgb3Igc2ltcGx5IGBleHBlY3RlZF9jb250YWluZXJgIHRvIG1hdGNoIGEKK2NvbnRhaW5lciBleGFjdGx5LiAgIElmIHlvdSB3YW50IHRvIHdyaXRlIHRoZSBlbGVtZW50cyBpbi1saW5lLAorbWF0Y2ggdGhlbSBtb3JlIGZsZXhpYmx5LCBvciBnZXQgbW9yZSBpbmZvcm1hdGl2ZSBtZXNzYWdlcywgeW91IGNhbiB1c2U6CisKK3wgYENvbnRhaW5zKGUpYCB8IGBhcmd1bWVudGAgY29udGFpbnMgYW4gZWxlbWVudCB0aGF0IG1hdGNoZXMgYGVgLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiB8Cit8Oi0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBFbGVtZW50c0FyZShlMCwgZTEsIC4uLiwgZW4pYHxgYXJndW1lbnRgIGhhcyBgbiArIDFgIGVsZW1lbnRzLCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IG1hdGNoZXMgYGVpYCwgd2hpY2ggY2FuIGJlIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAwIHRvIDEwIGFyZ3VtZW50cyBhcmUgYWxsb3dlZC58Cit8YEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpYCBvciBgRWxlbWVudHNBcmVBcnJheShhcnJheSwgY291bnQpYHxUaGUgc2FtZSBhcyBgRWxlbWVudHNBcmUoKWAgZXhjZXB0IHRoYXQgdGhlIGV4cGVjdGVkIGVsZW1lbnQgdmFsdWVzL21hdGNoZXJzIGNvbWUgZnJvbSBhIEMtc3R5bGUgYXJyYXkufAorfCBgQ29udGFpbmVyRXEoY29udGFpbmVyKWAgfCBUaGUgc2FtZSBhcyBgRXEoY29udGFpbmVyKWAgZXhjZXB0IHRoYXQgdGhlIGZhaWx1cmUgbWVzc2FnZSBhbHNvIGluY2x1ZGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBpbiBvbmUgY29udGFpbmVyIGJ1dCBub3QgdGhlIG90aGVyLiB8CisKK1RoZXNlIG1hdGNoZXJzIGNhbiBhbHNvIG1hdGNoOgorCisgIDEuIGEgbmF0aXZlIGFycmF5IHBhc3NlZCBieSByZWZlcmVuY2UgKGUuZy4gaW4gYEZvbyhjb25zdCBpbnQgKCZhKVs1XSlgKSwgYW5kCisgIDEuIGFuIGFycmF5IHBhc3NlZCBhcyBhIHBvaW50ZXIgYW5kIGEgY291bnQgKGUuZy4gaW4gYEJhcihjb25zdCBUKiBidWZmZXIsIGludCBsZW4pYCAtLSBzZWUgW011bHRpLWFyZ3VtZW50IE1hdGNoZXJzXSgjTXVsdGlhcmd1bWVudF9NYXRjaGVycy5tZCkpLgorCit3aGVyZSB0aGUgYXJyYXkgbWF5IGJlIG11bHRpLWRpbWVuc2lvbmFsIChpLmUuIGl0cyBlbGVtZW50cyBjYW4gYmUgYXJyYXlzKS4KKworIyMgTWVtYmVyIE1hdGNoZXJzICMjCisKK3xgRmllbGQoJmNsYXNzOjpmaWVsZCwgbSlgfGBhcmd1bWVudC5maWVsZGAgKG9yIGBhcmd1bWVudC0+ZmllbGRgIHdoZW4gYGFyZ3VtZW50YCBpcyBhIHBsYWluIHBvaW50ZXIpIG1hdGNoZXMgbWF0Y2hlciBgbWAsIHdoZXJlIGBhcmd1bWVudGAgaXMgYW4gb2JqZWN0IG9mIHR5cGUgX2NsYXNzXy58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBLZXkoZSlgICAgICAgICAgICAgICAgICB8YGFyZ3VtZW50LmZpcnN0YCBtYXRjaGVzIGBlYCwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gRS5nLiBgQ29udGFpbnMoS2V5KExlKDUpKSlgIGNhbiB2ZXJpZnkgdGhhdCBhIGBtYXBgIGNvbnRhaW5zIGEga2V5IGA8PSA1YC58Cit8YFBhaXIobTEsIG0yKWAgICAgICAgICAgIHxgYXJndW1lbnRgIGlzIGFuIGBzdGQ6OnBhaXJgIHdob3NlIGBmaXJzdGAgZmllbGQgbWF0Y2hlcyBgbTFgIGFuZCBgc2Vjb25kYCBmaWVsZCBtYXRjaGVzIGBtMmAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfGBQcm9wZXJ0eSgmY2xhc3M6OnByb3BlcnR5LCBtKWB8YGFyZ3VtZW50LnByb3BlcnR5KClgIChvciBgYXJndW1lbnQtPnByb3BlcnR5KClgIHdoZW4gYGFyZ3VtZW50YCBpcyBhIHBsYWluIHBvaW50ZXIpIG1hdGNoZXMgbWF0Y2hlciBgbWAsIHdoZXJlIGBhcmd1bWVudGAgaXMgYW4gb2JqZWN0IG9mIHR5cGUgX2NsYXNzXy58CisKKyMjIE1hdGNoaW5nIHRoZSBSZXN1bHQgb2YgYSBGdW5jdGlvbiBvciBGdW5jdG9yICMjCisKK3xgUmVzdWx0T2YoZiwgbSlgfGBmKGFyZ3VtZW50KWAgbWF0Y2hlcyBtYXRjaGVyIGBtYCwgd2hlcmUgYGZgIGlzIGEgZnVuY3Rpb24gb3IgZnVuY3Rvci58Cit8Oi0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCisjIyBQb2ludGVyIE1hdGNoZXJzICMjCisKK3xgUG9pbnRlZShtKWB8YGFyZ3VtZW50YCAoZWl0aGVyIGEgc21hcnQgcG9pbnRlciBvciBhIHJhdyBwb2ludGVyKSBwb2ludHMgdG8gYSB2YWx1ZSB0aGF0IG1hdGNoZXMgbWF0Y2hlciBgbWAufAorfDotLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKKyMjIE11bHRpYXJndW1lbnQgTWF0Y2hlcnMgIyMKKworVGhlc2UgYXJlIG1hdGNoZXJzIG9uIHR1cGxlIHR5cGVzLiBUaGV5IGNhbiBiZSB1c2VkIGluCitgLldpdGgoKWAuIFRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQgb24gZnVuY3Rpb25zIHdpdGggPGk+dHdvPGJyPgorYXJndW1lbnRzPC9pPiBgeGAgYW5kIGB5YDoKKworfGBFcSgpYHxgeCA9PSB5YHwKK3w6LS0tLS18Oi0tLS0tLS18Cit8YEdlKClgfGB4ID49IHlgfAorfGBHdCgpYHxgeCA+IHlgIHwKK3xgTGUoKWB8YHggPD0geWB8Cit8YEx0KClgfGB4IDwgeWAgfAorfGBOZSgpYHxgeCAhPSB5YHwKKworWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBzZWxlY3RvcnMgdG8gcGljayBhIHN1YnNldCBvZiB0aGUgYXJndW1lbnRzCisob3IgcmVvcmRlciB0aGVtKSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgbWF0Y2hpbmc6CisKK3xgQWxsQXJncyhtKWB8RXF1aXZhbGVudCB0byBgbWAuIFVzZWZ1bCBhcyBzeW50YWN0aWMgc3VnYXIgaW4gYC5XaXRoKEFsbEFyZ3MobSkpYC58Cit8Oi0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBcmdzPE4xLCBOMiwgLi4uLCBOaz4obSlgfFRoZSBga2Agc2VsZWN0ZWQgKHVzaW5nIDAtYmFzZWQgaW5kaWNlcykgYXJndW1lbnRzIG1hdGNoIGBtYCwgZS5nLiBgQXJnczwxLCAyPihDb250YWlucyg1KSlgLnwKKworIyMgQ29tcG9zaXRlIE1hdGNoZXJzICMjCisKK1lvdSBjYW4gbWFrZSBhIG1hdGNoZXIgZnJvbSBvbmUgb3IgbW9yZSBvdGhlciBtYXRjaGVyczoKKworfGBBbGxPZihtMSwgbTIsIC4uLiwgbW4pYHxgYXJndW1lbnRgIG1hdGNoZXMgYWxsIG9mIHRoZSBtYXRjaGVycyBgbTFgIHRvIGBtbmAufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBbnlPZihtMSwgbTIsIC4uLiwgbW4pYHxgYXJndW1lbnRgIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYXRjaGVycyBgbTFgIHRvIGBtbmAufAorfGBOb3QobSlgICAgICAgICAgICAgICAgIHxgYXJndW1lbnRgIGRvZXNuJ3QgbWF0Y2ggbWF0Y2hlciBgbWAuICAgICAgICAgICAgICAgfAorCisjIyBBZGFwdGVycyBmb3IgTWF0Y2hlcnMgIyMKKworfGBNYXRjaGVyQ2FzdDxUPihtKWB8Y2FzdHMgbWF0Y2hlciBgbWAgdG8gdHlwZSBgTWF0Y2hlcjxUPmAufAorfDotLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBTYWZlTWF0Y2hlckNhc3Q8VD4obSlgfCBbc2FmZWx5IGNhc3RzXShWMV81X0Nvb2tCb29rI0Nhc3RpbmdfTWF0Y2hlcnMubWQpIG1hdGNoZXIgYG1gIHRvIHR5cGUgYE1hdGNoZXI8VD5gLiB8Cit8YFRydWx5KHByZWRpY2F0ZSlgIHxgcHJlZGljYXRlKGFyZ3VtZW50KWAgcmV0dXJucyBzb21ldGhpbmcgY29uc2lkZXJlZCBieSBDKysgdG8gYmUgdHJ1ZSwgd2hlcmUgYHByZWRpY2F0ZWAgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yLnwKKworIyMgTWF0Y2hlcnMgYXMgUHJlZGljYXRlcyAjIworCit8YE1hdGNoZXMobSlgfGEgdW5hcnkgZnVuY3RvciB0aGF0IHJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudCBtYXRjaGVzIGBtYC58Cit8Oi0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEV4cGxhaW5NYXRjaFJlc3VsdChtLCB2YWx1ZSwgcmVzdWx0X2xpc3RlbmVyKWB8cmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBtYXRjaGVzIGBtYCwgZXhwbGFpbmluZyB0aGUgcmVzdWx0IHRvIGByZXN1bHRfbGlzdGVuZXJgLnwKK3xgVmFsdWUoeCwgbSlgfHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBvZiBgeGAgbWF0Y2hlcyBgbWAuICAgICAgICAgICAgICAgICB8CisKKyMjIERlZmluaW5nIE1hdGNoZXJzICMjCisKK3wgYE1BVENIRVIoSXNFdmVuLCAiIikgeyByZXR1cm4gKGFyZyAlIDIpID09IDA7IH1gIHwgRGVmaW5lcyBhIG1hdGNoZXIgYElzRXZlbigpYCB0byBtYXRjaCBhbiBldmVuIG51bWJlci4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBNQVRDSEVSX1AoSXNEaXZpc2libGVCeSwgbiwgIiIpIHsgKnJlc3VsdF9saXN0ZW5lciA8PCAid2hlcmUgdGhlIHJlbWFpbmRlciBpcyAiIDw8IChhcmcgJSBuKTsgcmV0dXJuIChhcmcgJSBuKSA9PSAwOyB9YCB8IERlZmluZXMgYSBtYWNoZXIgYElzRGl2aXNpYmxlQnkobilgIHRvIG1hdGNoIGEgbnVtYmVyIGRpdmlzaWJsZSBieSBgbmAuIHwKK3wgYE1BVENIRVJfUDIoSXNCZXR3ZWVuLCBhLCBiLCAiaXMgYmV0d2VlbiAlKGEpcyBhbmQgJShiKXMiKSB7IHJldHVybiBhIDw9IGFyZyAmJiBhcmcgPD0gYjsgfWAgfCBEZWZpbmVzIGEgbWF0Y2hlciBgSXNCZXR3ZWVuKGEsIGIpYCB0byBtYXRjaCBhIHZhbHVlIGluIHRoZSByYW5nZSBbYGFgLCBgYmBdLiB8CisKKyoqTm90ZXM6KioKKworICAxLiBUaGUgYE1BVENIRVIqYCBtYWNyb3MgY2Fubm90IGJlIHVzZWQgaW5zaWRlIGEgZnVuY3Rpb24gb3IgY2xhc3MuCisgIDEuIFRoZSBtYXRjaGVyIGJvZHkgbXVzdCBiZSBfcHVyZWx5IGZ1bmN0aW9uYWxfIChpLmUuIGl0IGNhbm5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdCwgYW5kIHRoZSByZXN1bHQgbXVzdCBub3QgZGVwZW5kIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYW5kIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMpLgorICAxLiBZb3UgY2FuIHVzZSBgUHJpbnRUb1N0cmluZyh4KWAgdG8gY29udmVydCBhIHZhbHVlIGB4YCBvZiBhbnkgdHlwZSB0byBhIHN0cmluZy4KKworIyMgTWF0Y2hlcnMgYXMgVGVzdCBBc3NlcnRpb25zICMjCisKK3xgQVNTRVJUX1RIQVQoZXhwcmVzc2lvbiwgbSlgfEdlbmVyYXRlcyBhIFtmYXRhbCBmYWlsdXJlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3RQcmltZXIjQXNzZXJ0aW9ucykgaWYgdGhlIHZhbHVlIG9mIGBleHByZXNzaW9uYCBkb2Vzbid0IG1hdGNoIG1hdGNoZXIgYG1gLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgRVhQRUNUX1RIQVQoZXhwcmVzc2lvbiwgbSlgfEdlbmVyYXRlcyBhIG5vbi1mYXRhbCBmYWlsdXJlIGlmIHRoZSB2YWx1ZSBvZiBgZXhwcmVzc2lvbmAgZG9lc24ndCBtYXRjaCBtYXRjaGVyIGBtYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworIyBBY3Rpb25zICMKKworKipBY3Rpb25zKiogc3BlY2lmeSB3aGF0IGEgbW9jayBmdW5jdGlvbiBzaG91bGQgZG8gd2hlbiBpbnZva2VkLgorCisjIyBSZXR1cm5pbmcgYSBWYWx1ZSAjIworCit8YFJldHVybigpYHxSZXR1cm4gZnJvbSBhIGB2b2lkYCBtb2NrIGZ1bmN0aW9uLnwKK3w6LS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBSZXR1cm4odmFsdWUpYHxSZXR1cm4gYHZhbHVlYC4gICAgICAgICAgICAgICAgICAgIHwKK3xgUmV0dXJuQXJnPE4+KClgfFJldHVybiB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudC58Cit8YFJldHVybk5ldzxUPihhMSwgLi4uLCBhaylgfFJldHVybiBgbmV3IFQoYTEsIC4uLiwgYWspYDsgYSBkaWZmZXJlbnQgb2JqZWN0IGlzIGNyZWF0ZWQgZWFjaCB0aW1lLnwKK3xgUmV0dXJuTnVsbCgpYHxSZXR1cm4gYSBudWxsIHBvaW50ZXIuICAgICAgICAgICAgIHwKK3xgUmV0dXJuUmVmKHZhcmlhYmxlKWB8UmV0dXJuIGEgcmVmZXJlbmNlIHRvIGB2YXJpYWJsZWAuICB8CisKKyMjIFNpZGUgRWZmZWN0cyAjIworCit8YEFzc2lnbigmdmFyaWFibGUsIHZhbHVlKWB8QXNzaWduIGB2YWx1ZWAgdG8gdmFyaWFibGUufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYERlbGV0ZUFyZzxOPigpYCAgICAgICAgIHwgRGVsZXRlIHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgcG9pbnRlci4gfAorfCBgU2F2ZUFyZzxOPihwb2ludGVyKWAgICAgfCBTYXZlIHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvIGAqcG9pbnRlcmAuIHwKK3wgYFNldEFyZ1JlZmVyZWU8Tj4odmFsdWUpYCB8CUFzc2lnbiB2YWx1ZSB0byB0aGUgdmFyaWFibGUgcmVmZXJlbmNlZCBieSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudC4gfAorfGBTZXRBcmd1bWVudFBvaW50ZWU8Tj4odmFsdWUpYHxBc3NpZ24gYHZhbHVlYCB0byB0aGUgdmFyaWFibGUgcG9pbnRlZCBieSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudC58Cit8YFNldEFycmF5QXJndW1lbnQ8Tj4oZmlyc3QsIGxhc3QpYHxDb3BpZXMgdGhlIGVsZW1lbnRzIGluIHNvdXJjZSByYW5nZSBbYGZpcnN0YCwgYGxhc3RgKSB0byB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHBvaW50ZXIgb3IgYW4gaXRlcmF0b3IuIFRoZSBhY3Rpb24gZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzb3VyY2UgcmFuZ2UufAorfGBTZXRFcnJub0FuZFJldHVybihlcnJvciwgdmFsdWUpYHxTZXQgYGVycm5vYCB0byBgZXJyb3JgIGFuZCByZXR1cm4gYHZhbHVlYC58Cit8YFRocm93KGV4Y2VwdGlvbilgICAgICAgICB8VGhyb3dzIHRoZSBnaXZlbiBleGNlcHRpb24sIHdoaWNoIGNhbiBiZSBhbnkgY29weWFibGUgdmFsdWUuIEF2YWlsYWJsZSBzaW5jZSB2MS4xLjAufAorCisjIyBVc2luZyBhIEZ1bmN0aW9uIG9yIGEgRnVuY3RvciBhcyBhbiBBY3Rpb24gIyMKKworfGBJbnZva2UoZilgfEludm9rZSBgZmAgd2l0aCB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbW9jayBmdW5jdGlvbiwgd2hlcmUgYGZgIGNhbiBiZSBhIGdsb2JhbC9zdGF0aWMgZnVuY3Rpb24gb3IgYSBmdW5jdG9yLnwKK3w6LS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEludm9rZShvYmplY3RfcG9pbnRlciwgJmNsYXNzOjptZXRob2QpYHxJbnZva2UgdGhlIHttZXRob2Qgb24gdGhlIG9iamVjdCB3aXRoIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBtb2NrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8YEludm9rZVdpdGhvdXRBcmdzKGYpYHxJbnZva2UgYGZgLCB3aGljaCBjYW4gYmUgYSBnbG9iYWwvc3RhdGljIGZ1bmN0aW9uIG9yIGEgZnVuY3Rvci4gYGZgIG11c3QgdGFrZSBubyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICB8Cit8YEludm9rZVdpdGhvdXRBcmdzKG9iamVjdF9wb2ludGVyLCAmY2xhc3M6Om1ldGhvZClgfEludm9rZSB0aGUgbWV0aG9kIG9uIHRoZSBvYmplY3QsIHdoaWNoIHRha2VzIG5vIGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgSW52b2tlQXJndW1lbnQ8Tj4oYXJnMSwgYXJnMiwgLi4uLCBhcmdrKWB8SW52b2tlIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGEgZnVuY3Rvciwgd2l0aCB0aGUgYGtgIGFyZ3VtZW50cy58CisKK1RoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGludm9rZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgcmV0dXJuIHZhbHVlCitvZiB0aGUgYWN0aW9uLgorCitXaGVuIGRlZmluaW5nIGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0byBiZSB1c2VkIHdpdGggYEludm9rZSooKWAsIHlvdSBjYW4gZGVjbGFyZSBhbnkgdW51c2VkIHBhcmFtZXRlcnMgYXMgYFVudXNlZGA6CitgYGAKKyAgZG91YmxlIERpc3RhbmNlKFVudXNlZCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiBzcXJ0KHgqeCArIHkqeSk7IH0KKyAgLi4uCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbygiSGkiLCBfLCBfKSkuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlKSk7CitgYGAKKworSW4gYEludm9rZUFyZ3VtZW50PE4+KC4uLilgLCBpZiBhbiBhcmd1bWVudCBuZWVkcyB0byBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlLCB3cmFwIGl0IGluc2lkZSBgQnlSZWYoKWAuIEZvciBleGFtcGxlLAorYGBgCisgIEludm9rZUFyZ3VtZW50PDI+KDUsIHN0cmluZygiSGkiKSwgQnlSZWYoZm9vKSkKK2BgYAorY2FsbHMgdGhlIG1vY2sgZnVuY3Rpb24ncyAjMiBhcmd1bWVudCwgcGFzc2luZyB0byBpdCBgNWAgYW5kIGBzdHJpbmcoIkhpIilgIGJ5IHZhbHVlLCBhbmQgYGZvb2AgYnkgcmVmZXJlbmNlLgorCisjIyBEZWZhdWx0IEFjdGlvbiAjIworCit8YERvRGVmYXVsdCgpYHxEbyB0aGUgZGVmYXVsdCBhY3Rpb24gKHNwZWNpZmllZCBieSBgT05fQ0FMTCgpYCBvciB0aGUgYnVpbHQtaW4gb25lKS58Cit8Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKKyoqTm90ZToqKiBkdWUgdG8gdGVjaG5pY2FsIHJlYXNvbnMsIGBEb0RlZmF1bHQoKWAgY2Fubm90IGJlIHVzZWQgaW5zaWRlICBhIGNvbXBvc2l0ZSBhY3Rpb24gLSB0cnlpbmcgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gYSBydW4tdGltZSBlcnJvci4KKworIyMgQ29tcG9zaXRlIEFjdGlvbnMgIyMKKworfGBEb0FsbChhMSwgYTIsIC4uLiwgYW4pYHxEbyBhbGwgYWN0aW9ucyBgYTFgIHRvIGBhbmAgYW5kIHJldHVybiB0aGUgcmVzdWx0IG9mIGBhbmAgaW4gZWFjaCBpbnZvY2F0aW9uLiBUaGUgZmlyc3QgYG4gLSAxYCBzdWItYWN0aW9ucyBtdXN0IHJldHVybiB2b2lkLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgSWdub3JlUmVzdWx0KGEpYCAgICAgICB8UGVyZm9ybSBhY3Rpb24gYGFgIGFuZCBpZ25vcmUgaXRzIHJlc3VsdC4gYGFgIG11c3Qgbm90IHJldHVybiB2b2lkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfGBXaXRoQXJnPE4+KGEpYCAgICAgICAgIHxQYXNzIHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRvIGFjdGlvbiBgYWAgYW5kIHBlcmZvcm0gaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8YFdpdGhBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYSlgfFBhc3MgdGhlIHNlbGVjdGVkICgwLWJhc2VkKSBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYWN0aW9uIGBhYCBhbmQgcGVyZm9ybSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgV2l0aG91dEFyZ3MoYSlgICAgICAgICB8UGVyZm9ybSBhY3Rpb24gYGFgIHdpdGhvdXQgYW55IGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisjIyBEZWZpbmluZyBBY3Rpb25zICMjCisKK3wgYEFDVElPTihTdW0pIHsgcmV0dXJuIGFyZzAgKyBhcmcxOyB9YCB8IERlZmluZXMgYW4gYWN0aW9uIGBTdW0oKWAgdG8gcmV0dXJuIHRoZSBzdW0gb2YgdGhlIG1vY2sgZnVuY3Rpb24ncyBhcmd1bWVudCAjMCBhbmQgIzEuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYEFDVElPTl9QKFBsdXMsIG4pIHsgcmV0dXJuIGFyZzAgKyBuOyB9YCB8IERlZmluZXMgYW4gYWN0aW9uIGBQbHVzKG4pYCB0byByZXR1cm4gdGhlIHN1bSBvZiB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50ICMwIGFuZCBgbmAuIHwKK3wgYEFDVElPTl9QayhGb28sIHAxLCAuLi4sIHBrKSB7IHN0YXRlbWVudHM7IH1gIHwgRGVmaW5lcyBhIHBhcmFtZXRlcml6ZWQgYWN0aW9uIGBGb28ocDEsIC4uLiwgcGspYCB0byBleGVjdXRlIHRoZSBnaXZlbiBgc3RhdGVtZW50c2AuICAgfAorCitUaGUgYEFDVElPTipgIG1hY3JvcyBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgYSBmdW5jdGlvbiBvciBjbGFzcy4KKworIyBDYXJkaW5hbGl0aWVzICMKKworVGhlc2UgYXJlIHVzZWQgaW4gYFRpbWVzKClgIHRvIHNwZWNpZnkgaG93IG1hbnkgdGltZXMgYSBtb2NrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkOgorCit8YEFueU51bWJlcigpYHxUaGUgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLnwKK3w6LS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBdExlYXN0KG4pYCB8VGhlIGNhbGwgaXMgZXhwZWN0ZWQgYXQgbGVhc3QgYG5gIHRpbWVzLiAgICAgICB8Cit8YEF0TW9zdChuKWAgIHxUaGUgY2FsbCBpcyBleHBlY3RlZCBhdCBtb3N0IGBuYCB0aW1lcy4gICAgICAgIHwKK3xgQmV0d2VlbihtLCBuKWB8VGhlIGNhbGwgaXMgZXhwZWN0ZWQgYmV0d2VlbiBgbWAgYW5kIGBuYCAoaW5jbHVzaXZlKSB0aW1lcy58Cit8YEV4YWN0bHkobikgb3IgbmB8VGhlIGNhbGwgaXMgZXhwZWN0ZWQgZXhhY3RseSBgbmAgdGltZXMuIEluIHBhcnRpY3VsYXIsIHRoZSBjYWxsIHNob3VsZCBuZXZlciBoYXBwZW4gd2hlbiBgbmAgaXMgMC58CisKKyMgRXhwZWN0YXRpb24gT3JkZXIgIworCitCeSBkZWZhdWx0LCB0aGUgZXhwZWN0YXRpb25zIGNhbiBiZSBtYXRjaGVkIGluIF9hbnlfIG9yZGVyLiAgSWYgc29tZQorb3IgYWxsIGV4cGVjdGF0aW9ucyBtdXN0IGJlIG1hdGNoZWQgaW4gYSBnaXZlbiBvcmRlciwgdGhlcmUgYXJlIHR3bword2F5cyB0byBzcGVjaWZ5IGl0LiAgVGhleSBjYW4gYmUgdXNlZCBlaXRoZXIgaW5kZXBlbmRlbnRseSBvcgordG9nZXRoZXIuCisKKyMjIFRoZSBBZnRlciBDbGF1c2UgIyMKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkV4cGVjdGF0aW9uOworLi4uCitFeHBlY3RhdGlvbiBpbml0X3ggPSBFWFBFQ1RfQ0FMTChmb28sIEluaXRYKCkpOworRXhwZWN0YXRpb24gaW5pdF95ID0gRVhQRUNUX0NBTEwoZm9vLCBJbml0WSgpKTsKK0VYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgLkFmdGVyKGluaXRfeCwgaW5pdF95KTsKK2BgYAorc2F5cyB0aGF0IGBCYXIoKWAgY2FuIGJlIGNhbGxlZCBvbmx5IGFmdGVyIGJvdGggYEluaXRYKClgIGFuZAorYEluaXRZKClgIGhhdmUgYmVlbiBjYWxsZWQuCisKK0lmIHlvdSBkb24ndCBrbm93IGhvdyBtYW55IHByZS1yZXF1aXNpdGVzIGFuIGV4cGVjdGF0aW9uIGhhcyB3aGVuIHlvdQord3JpdGUgaXQsIHlvdSBjYW4gdXNlIGFuIGBFeHBlY3RhdGlvblNldGAgdG8gY29sbGVjdCB0aGVtOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RXhwZWN0YXRpb25TZXQ7CisuLi4KK0V4cGVjdGF0aW9uU2V0IGFsbF9pbml0czsKK2ZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudF9jb3VudDsgaSsrKSB7CisgIGFsbF9pbml0cyArPSBFWFBFQ1RfQ0FMTChmb28sIEluaXRFbGVtZW50KGkpKTsKK30KK0VYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgLkFmdGVyKGFsbF9pbml0cyk7CitgYGAKK3NheXMgdGhhdCBgQmFyKClgIGNhbiBiZSBjYWxsZWQgb25seSBhZnRlciBhbGwgZWxlbWVudHMgaGF2ZSBiZWVuCitpbml0aWFsaXplZCAoYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgd2hpY2ggZWxlbWVudHMgZ2V0IGluaXRpYWxpemVkCitiZWZvcmUgdGhlIG90aGVycykuCisKK01vZGlmeWluZyBhbiBgRXhwZWN0YXRpb25TZXRgIGFmdGVyIHVzaW5nIGl0IGluIGFuIGAuQWZ0ZXIoKWAgZG9lc24ndAorYWZmZWN0IHRoZSBtZWFuaW5nIG9mIHRoZSBgLkFmdGVyKClgLgorCisjIyBTZXF1ZW5jZXMgIyMKKworV2hlbiB5b3UgaGF2ZSBhIGxvbmcgY2hhaW4gb2Ygc2VxdWVudGlhbCBleHBlY3RhdGlvbnMsIGl0J3MgZWFzaWVyIHRvCitzcGVjaWZ5IHRoZSBvcmRlciB1c2luZyAqKnNlcXVlbmNlcyoqLCB3aGljaCBkb24ndCByZXF1aXJlIHlvdSB0byBnaXZlbgorZWFjaCBleHBlY3RhdGlvbiBpbiB0aGUgY2hhaW4gYSBkaWZmZXJlbnQgbmFtZS4gIDxpPkFsbCBleHBlY3RlZDxicj4KK2NhbGxzPC9pPiBpbiB0aGUgc2FtZSBzZXF1ZW5jZSBtdXN0IG9jY3VyIGluIHRoZSBvcmRlciB0aGV5IGFyZQorc3BlY2lmaWVkLgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6U2VxdWVuY2U7CitTZXF1ZW5jZSBzMSwgczI7CisuLi4KK0VYUEVDVF9DQUxMKGZvbywgUmVzZXQoKSkKKyAgICAuSW5TZXF1ZW5jZShzMSwgczIpCisgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7CitFWFBFQ1RfQ0FMTChmb28sIEdldFNpemUoKSkKKyAgICAuSW5TZXF1ZW5jZShzMSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKK0VYUEVDVF9DQUxMKGZvbywgRGVzY3JpYmUoQTxjb25zdCBjaGFyKj4oKSkpCisgICAgLkluU2VxdWVuY2UoczIpCisgICAgLldpbGxPbmNlKFJldHVybigiZHVtbXkiKSk7CitgYGAKK3NheXMgdGhhdCBgUmVzZXQoKWAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIF9ib3RoXyBgR2V0U2l6ZSgpYCBfYW5kXworYERlc2NyaWJlKClgLCBhbmQgdGhlIGxhdHRlciB0d28gY2FuIG9jY3VyIGluIGFueSBvcmRlci4KKworVG8gcHV0IG1hbnkgZXhwZWN0YXRpb25zIGluIGEgc2VxdWVuY2UgY29udmVuaWVudGx5OgorYGBgCit1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Cit7CisgIEluU2VxdWVuY2UgZHVtbXk7CisKKyAgRVhQRUNUX0NBTEwoLi4uKS4uLjsKKyAgRVhQRUNUX0NBTEwoLi4uKS4uLjsKKyAgLi4uCisgIEVYUEVDVF9DQUxMKC4uLikuLi47Cit9CitgYGAKK3NheXMgdGhhdCBhbGwgZXhwZWN0ZWQgY2FsbHMgaW4gdGhlIHNjb3BlIG9mIGBkdW1teWAgbXVzdCBvY2N1ciBpbgorc3RyaWN0IG9yZGVyLiBUaGUgbmFtZSBgZHVtbXlgIGlzIGlycmVsZXZhbnQuKQorCisjIFZlcmlmeWluZyBhbmQgUmVzZXR0aW5nIGEgTW9jayAjCisKK0dvb2dsZSBNb2NrIHdpbGwgdmVyaWZ5IHRoZSBleHBlY3RhdGlvbnMgb24gYSBtb2NrIG9iamVjdCB3aGVuIGl0IGlzIGRlc3RydWN0ZWQsIG9yIHlvdSBjYW4gZG8gaXQgZWFybGllcjoKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNb2NrOworLi4uCisvLyBWZXJpZmllcyBhbmQgcmVtb3ZlcyB0aGUgZXhwZWN0YXRpb25zIG9uIG1vY2tfb2JqOworLy8gcmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfb2JqKTsKKy4uLgorLy8gVmVyaWZpZXMgYW5kIHJlbW92ZXMgdGhlIGV4cGVjdGF0aW9ucyBvbiBtb2NrX29iajsKKy8vIGFsc28gcmVtb3ZlcyB0aGUgZGVmYXVsdCBhY3Rpb25zIHNldCBieSBPTl9DQUxMKCk7CisvLyByZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCitNb2NrOjpWZXJpZnlBbmRDbGVhcigmbW9ja19vYmopOworYGBgCisKK1lvdSBjYW4gYWxzbyB0ZWxsIEdvb2dsZSBNb2NrIHRoYXQgYSBtb2NrIG9iamVjdCBjYW4gYmUgbGVha2VkIGFuZCBkb2Vzbid0CituZWVkIHRvIGJlIHZlcmlmaWVkOgorYGBgCitNb2NrOjpBbGxvd0xlYWsoJm1vY2tfb2JqKTsKK2BgYAorCisjIE1vY2sgQ2xhc3NlcyAjCisKK0dvb2dsZSBNb2NrIGRlZmluZXMgYSBjb252ZW5pZW50IG1vY2sgY2xhc3MgdGVtcGxhdGUKK2BgYAorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTEsIC4uLiwgQW4pPiB7CisgcHVibGljOgorICBNT0NLX01FVEhPRG4oQ2FsbCwgUihBMSwgLi4uLCBBbikpOworfTsKK2BgYAorU2VlIHRoaXMgW3JlY2lwZV0oVjFfNV9Db29rQm9vayNVc2luZ19DaGVja19Qb2ludHMubWQpIGZvciBvbmUgYXBwbGljYXRpb24gb2YgaXQuCisKKyMgRmxhZ3MgIworCit8IGAtLWdtb2NrX2NhdGNoX2xlYWtlZF9tb2Nrcz0wYCB8IERvbid0IHJlcG9ydCBsZWFrZWQgbW9jayBvYmplY3RzIGFzIGZhaWx1cmVzLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGAtLWdtb2NrX3ZlcmJvc2U9TEVWRUxgICAgICAgICB8IFNldHMgdGhlIGRlZmF1bHQgdmVyYm9zaXR5IGxldmVsIChgaW5mb2AsIGB3YXJuaW5nYCwgb3IgYGVycm9yYCkgb2YgR29vZ2xlIE1vY2sgbWVzc2FnZXMuIHwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV81L0Nvb2tCb29rLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNS9Db29rQm9vay5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmUxNTNjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNS9Db29rQm9vay5tZApAQCAtMCwwICsxLDMyNTAgQEAKKworCitZb3UgY2FuIGZpbmQgcmVjaXBlcyBmb3IgdXNpbmcgR29vZ2xlIE1vY2sgaGVyZS4gSWYgeW91IGhhdmVuJ3QgeWV0LAorcGxlYXNlIHJlYWQgdGhlIFtGb3JEdW1taWVzXShWMV81X0ZvckR1bW1pZXMubWQpIGRvY3VtZW50IGZpcnN0IHRvIG1ha2Ugc3VyZSB5b3UgdW5kZXJzdGFuZAordGhlIGJhc2ljcy4KKworKipOb3RlOioqIEdvb2dsZSBNb2NrIGxpdmVzIGluIHRoZSBgdGVzdGluZ2AgbmFtZSBzcGFjZS4gRm9yCityZWFkYWJpbGl0eSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gd3JpdGUgYHVzaW5nIDo6dGVzdGluZzo6Rm9vO2Agb25jZSBpbgoreW91ciBmaWxlIGJlZm9yZSB1c2luZyB0aGUgbmFtZSBgRm9vYCBkZWZpbmVkIGJ5IEdvb2dsZSBNb2NrLiBXZSBvbWl0CitzdWNoIGB1c2luZ2Agc3RhdGVtZW50cyBpbiB0aGlzIHBhZ2UgZm9yIGJyZXZpdHksIGJ1dCB5b3Ugc2hvdWxkIGRvIGl0CitpbiB5b3VyIG93biBjb2RlLgorCisjIENyZWF0aW5nIE1vY2sgQ2xhc3NlcyAjCisKKyMjIE1vY2tpbmcgUHJpdmF0ZSBvciBQcm90ZWN0ZWQgTWV0aG9kcyAjIworCitZb3UgbXVzdCBhbHdheXMgcHV0IGEgbW9jayBtZXRob2QgZGVmaW5pdGlvbiAoYE1PQ0tfTUVUSE9EKmApIGluIGEKK2BwdWJsaWM6YCBzZWN0aW9uIG9mIHRoZSBtb2NrIGNsYXNzLCByZWdhcmRsZXNzIG9mIHRoZSBtZXRob2QgYmVpbmcKK21vY2tlZCBiZWluZyBgcHVibGljYCwgYHByb3RlY3RlZGAsIG9yIGBwcml2YXRlYCBpbiB0aGUgYmFzZSBjbGFzcy4KK1RoaXMgYWxsb3dzIGBPTl9DQUxMYCBhbmQgYEVYUEVDVF9DQUxMYCB0byByZWZlcmVuY2UgdGhlIG1vY2sgZnVuY3Rpb24KK2Zyb20gb3V0c2lkZSBvZiB0aGUgbW9jayBjbGFzcy4gIChZZXMsIEMrKyBhbGxvd3MgYSBzdWJjbGFzcyB0byBjaGFuZ2UKK3RoZSBhY2Nlc3MgbGV2ZWwgb2YgYSB2aXJ0dWFsIGZ1bmN0aW9uIGluIHRoZSBiYXNlIGNsYXNzLikgIEV4YW1wbGU6CisKK2BgYAorY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgVHJhbnNmb3JtKEdhZGdldCogZykgPSAwOworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgUmVzdW1lKCk7CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIGludCBHZXRUaW1lT3V0KCk7Cit9OworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICAuLi4KKyAgTU9DS19NRVRIT0QxKFRyYW5zZm9ybSwgYm9vbChHYWRnZXQqIGcpKTsKKworICAvLyBUaGUgZm9sbG93aW5nIG11c3QgYmUgaW4gdGhlIHB1YmxpYyBzZWN0aW9uLCBldmVuIHRob3VnaCB0aGUKKyAgLy8gbWV0aG9kcyBhcmUgcHJvdGVjdGVkIG9yIHByaXZhdGUgaW4gdGhlIGJhc2UgY2xhc3MuCisgIE1PQ0tfTUVUSE9EMChSZXN1bWUsIHZvaWQoKSk7CisgIE1PQ0tfTUVUSE9EMChHZXRUaW1lT3V0LCBpbnQoKSk7Cit9OworYGBgCisKKyMjIE1vY2tpbmcgT3ZlcmxvYWRlZCBNZXRob2RzICMjCisKK1lvdSBjYW4gbW9jayBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhcyB1c3VhbC4gTm8gc3BlY2lhbCBhdHRlbnRpb24gaXMgcmVxdWlyZWQ6CisKK2BgYAorY2xhc3MgRm9vIHsKKyAgLi4uCisKKyAgLy8gTXVzdCBiZSB2aXJ0dWFsIGFzIHdlJ2xsIGluaGVyaXQgZnJvbSBGb28uCisgIHZpcnR1YWwgfkZvbygpOworCisgIC8vIE92ZXJsb2FkZWQgb24gdGhlIHR5cGVzIGFuZC9vciBudW1iZXJzIG9mIGFyZ3VtZW50cy4KKyAgdmlydHVhbCBpbnQgQWRkKEVsZW1lbnQgeCk7CisgIHZpcnR1YWwgaW50IEFkZChpbnQgdGltZXMsIEVsZW1lbnQgeCk7CisKKyAgLy8gT3ZlcmxvYWRlZCBvbiB0aGUgY29uc3QtbmVzcyBvZiB0aGlzIG9iamVjdC4KKyAgdmlydHVhbCBCYXImIEdldEJhcigpOworICB2aXJ0dWFsIGNvbnN0IEJhciYgR2V0QmFyKCkgY29uc3Q7Cit9OworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgIC4uLgorICBNT0NLX01FVEhPRDEoQWRkLCBpbnQoRWxlbWVudCB4KSk7CisgIE1PQ0tfTUVUSE9EMihBZGQsIGludChpbnQgdGltZXMsIEVsZW1lbnQgeCk7CisKKyAgTU9DS19NRVRIT0QwKEdldEJhciwgQmFyJigpKTsKKyAgTU9DS19DT05TVF9NRVRIT0QwKEdldEJhciwgY29uc3QgQmFyJigpKTsKK307CitgYGAKKworKipOb3RlOioqIGlmIHlvdSBkb24ndCBtb2NrIGFsbCB2ZXJzaW9ucyBvZiB0aGUgb3ZlcmxvYWRlZCBtZXRob2QsIHRoZQorY29tcGlsZXIgd2lsbCBnaXZlIHlvdSBhIHdhcm5pbmcgYWJvdXQgc29tZSBtZXRob2RzIGluIHRoZSBiYXNlIGNsYXNzCitiZWluZyBoaWRkZW4uIFRvIGZpeCB0aGF0LCB1c2UgYHVzaW5nYCB0byBicmluZyB0aGVtIGluIHNjb3BlOgorCitgYGAKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgLi4uCisgIHVzaW5nIEZvbzo6QWRkOworICBNT0NLX01FVEhPRDEoQWRkLCBpbnQoRWxlbWVudCB4KSk7CisgIC8vIFdlIGRvbid0IHdhbnQgdG8gbW9jayBpbnQgQWRkKGludCB0aW1lcywgRWxlbWVudCB4KTsKKyAgLi4uCit9OworYGBgCisKKyMjIE1vY2tpbmcgQ2xhc3MgVGVtcGxhdGVzICMjCisKK1RvIG1vY2sgYSBjbGFzcyB0ZW1wbGF0ZSwgYXBwZW5kIGBfVGAgdG8gdGhlIGBNT0NLXypgIG1hY3JvczoKKworYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbT4KK2NsYXNzIFN0YWNrSW50ZXJmYWNlIHsKKyAgLi4uCisgIC8vIE11c3QgYmUgdmlydHVhbCBhcyB3ZSdsbCBpbmhlcml0IGZyb20gU3RhY2tJbnRlcmZhY2UuCisgIHZpcnR1YWwgflN0YWNrSW50ZXJmYWNlKCk7CisKKyAgdmlydHVhbCBpbnQgR2V0U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFB1c2goY29uc3QgRWxlbSYgeCkgPSAwOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW0+CitjbGFzcyBNb2NrU3RhY2sgOiBwdWJsaWMgU3RhY2tJbnRlcmZhY2U8RWxlbT4geworICAuLi4KKyAgTU9DS19DT05TVF9NRVRIT0QwX1QoR2V0U2l6ZSwgaW50KCkpOworICBNT0NLX01FVEhPRDFfVChQdXNoLCB2b2lkKGNvbnN0IEVsZW0mIHgpKTsKK307CitgYGAKKworIyMgTW9ja2luZyBOb252aXJ0dWFsIE1ldGhvZHMgIyMKKworR29vZ2xlIE1vY2sgY2FuIG1vY2sgbm9uLXZpcnR1YWwgZnVuY3Rpb25zIHRvIGJlIHVzZWQgaW4gd2hhdCB3ZSBjYWxsIF9oaS1wZXJmCitkZXBlbmRlbmN5IGluamVjdGlvbl8uCisKK0luIHRoaXMgY2FzZSwgaW5zdGVhZCBvZiBzaGFyaW5nIGEgY29tbW9uIGJhc2UgY2xhc3Mgd2l0aCB0aGUgcmVhbAorY2xhc3MsIHlvdXIgbW9jayBjbGFzcyB3aWxsIGJlIF91bnJlbGF0ZWRfIHRvIHRoZSByZWFsIGNsYXNzLCBidXQKK2NvbnRhaW4gbWV0aG9kcyB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZXMuICBUaGUgc3ludGF4IGZvciBtb2NraW5nCitub24tdmlydHVhbCBtZXRob2RzIGlzIHRoZSBfc2FtZV8gYXMgbW9ja2luZyB2aXJ0dWFsIG1ldGhvZHM6CisKK2BgYAorLy8gQSBzaW1wbGUgcGFja2V0IHN0cmVhbSBjbGFzcy4gIE5vbmUgb2YgaXRzIG1lbWJlcnMgaXMgdmlydHVhbC4KK2NsYXNzIENvbmNyZXRlUGFja2V0U3RyZWFtIHsKKyBwdWJsaWM6CisgIHZvaWQgQXBwZW5kUGFja2V0KFBhY2tldCogbmV3X3BhY2tldCk7CisgIGNvbnN0IFBhY2tldCogR2V0UGFja2V0KHNpemVfdCBwYWNrZXRfbnVtYmVyKSBjb25zdDsKKyAgc2l6ZV90IE51bWJlck9mUGFja2V0cygpIGNvbnN0OworICAuLi4KK307CisKKy8vIEEgbW9jayBwYWNrZXQgc3RyZWFtIGNsYXNzLiAgSXQgaW5oZXJpdHMgZnJvbSBubyBvdGhlciwgYnV0IGRlZmluZXMKKy8vIEdldFBhY2tldCgpIGFuZCBOdW1iZXJPZlBhY2tldHMoKS4KK2NsYXNzIE1vY2tQYWNrZXRTdHJlYW0geworIHB1YmxpYzoKKyAgTU9DS19DT05TVF9NRVRIT0QxKEdldFBhY2tldCwgY29uc3QgUGFja2V0KihzaXplX3QgcGFja2V0X251bWJlcikpOworICBNT0NLX0NPTlNUX01FVEhPRDAoTnVtYmVyT2ZQYWNrZXRzLCBzaXplX3QoKSk7CisgIC4uLgorfTsKK2BgYAorCitOb3RlIHRoYXQgdGhlIG1vY2sgY2xhc3MgZG9lc24ndCBkZWZpbmUgYEFwcGVuZFBhY2tldCgpYCwgdW5saWtlIHRoZQorcmVhbCBjbGFzcy4gVGhhdCdzIGZpbmUgYXMgbG9uZyBhcyB0aGUgdGVzdCBkb2Vzbid0IG5lZWQgdG8gY2FsbCBpdC4KKworTmV4dCwgeW91IG5lZWQgYSB3YXkgdG8gc2F5IHRoYXQgeW91IHdhbnQgdG8gdXNlCitgQ29uY3JldGVQYWNrZXRTdHJlYW1gIGluIHByb2R1Y3Rpb24gY29kZSwgYW5kIHVzZSBgTW9ja1BhY2tldFN0cmVhbWAKK2luIHRlc3RzLiAgU2luY2UgdGhlIGZ1bmN0aW9ucyBhcmUgbm90IHZpcnR1YWwgYW5kIHRoZSB0d28gY2xhc3NlcyBhcmUKK3VucmVsYXRlZCwgeW91IG11c3Qgc3BlY2lmeSB5b3VyIGNob2ljZSBhdCBfY29tcGlsZSB0aW1lXyAoYXMgb3Bwb3NlZAordG8gcnVuIHRpbWUpLgorCitPbmUgd2F5IHRvIGRvIGl0IGlzIHRvIHRlbXBsYXRpemUgeW91ciBjb2RlIHRoYXQgbmVlZHMgdG8gdXNlIGEgcGFja2V0CitzdHJlYW0uICBNb3JlIHNwZWNpZmljYWxseSwgeW91IHdpbGwgZ2l2ZSB5b3VyIGNvZGUgYSB0ZW1wbGF0ZSB0eXBlCithcmd1bWVudCBmb3IgdGhlIHR5cGUgb2YgdGhlIHBhY2tldCBzdHJlYW0uICBJbiBwcm9kdWN0aW9uLCB5b3Ugd2lsbAoraW5zdGFudGlhdGUgeW91ciB0ZW1wbGF0ZSB3aXRoIGBDb25jcmV0ZVBhY2tldFN0cmVhbWAgYXMgdGhlIHR5cGUKK2FyZ3VtZW50LiAgSW4gdGVzdHMsIHlvdSB3aWxsIGluc3RhbnRpYXRlIHRoZSBzYW1lIHRlbXBsYXRlIHdpdGgKK2BNb2NrUGFja2V0U3RyZWFtYC4gIEZvciBleGFtcGxlLCB5b3UgbWF5IHdyaXRlOgorCitgYGAKK3RlbXBsYXRlIDxjbGFzcyBQYWNrZXRTdHJlYW0+Cit2b2lkIENyZWF0ZUNvbm5lY3Rpb24oUGFja2V0U3RyZWFtKiBzdHJlYW0pIHsgLi4uIH0KKwordGVtcGxhdGUgPGNsYXNzIFBhY2tldFN0cmVhbT4KK2NsYXNzIFBhY2tldFJlYWRlciB7CisgcHVibGljOgorICB2b2lkIFJlYWRQYWNrZXRzKFBhY2tldFN0cmVhbSogc3RyZWFtLCBzaXplX3QgcGFja2V0X251bSk7Cit9OworYGBgCisKK1RoZW4geW91IGNhbiB1c2UgYENyZWF0ZUNvbm5lY3Rpb248Q29uY3JldGVQYWNrZXRTdHJlYW0+KClgIGFuZAorYFBhY2tldFJlYWRlcjxDb25jcmV0ZVBhY2tldFN0cmVhbT5gIGluIHByb2R1Y3Rpb24gY29kZSwgYW5kIHVzZQorYENyZWF0ZUNvbm5lY3Rpb248TW9ja1BhY2tldFN0cmVhbT4oKWAgYW5kCitgUGFja2V0UmVhZGVyPE1vY2tQYWNrZXRTdHJlYW0+YCBpbiB0ZXN0cy4KKworYGBgCisgIE1vY2tQYWNrZXRTdHJlYW0gbW9ja19zdHJlYW07CisgIEVYUEVDVF9DQUxMKG1vY2tfc3RyZWFtLCAuLi4pLi4uOworICAuLiBzZXQgbW9yZSBleHBlY3RhdGlvbnMgb24gbW9ja19zdHJlYW0gLi4uCisgIFBhY2tldFJlYWRlcjxNb2NrUGFja2V0U3RyZWFtPiByZWFkZXIoJm1vY2tfc3RyZWFtKTsKKyAgLi4uIGV4ZXJjaXNlIHJlYWRlciAuLi4KK2BgYAorCisjIyBNb2NraW5nIEZyZWUgRnVuY3Rpb25zICMjCisKK0l0J3MgcG9zc2libGUgdG8gdXNlIEdvb2dsZSBNb2NrIHRvIG1vY2sgYSBmcmVlIGZ1bmN0aW9uIChpLmUuIGEKK0Mtc3R5bGUgZnVuY3Rpb24gb3IgYSBzdGF0aWMgbWV0aG9kKS4gIFlvdSBqdXN0IG5lZWQgdG8gcmV3cml0ZSB5b3VyCitjb2RlIHRvIHVzZSBhbiBpbnRlcmZhY2UgKGFic3RyYWN0IGNsYXNzKS4KKworSW5zdGVhZCBvZiBjYWxsaW5nIGEgZnJlZSBmdW5jdGlvbiAoc2F5LCBgT3BlbkZpbGVgKSBkaXJlY3RseSwKK2ludHJvZHVjZSBhbiBpbnRlcmZhY2UgZm9yIGl0IGFuZCBoYXZlIGEgY29uY3JldGUgc3ViY2xhc3MgdGhhdCBjYWxscwordGhlIGZyZWUgZnVuY3Rpb246CisKK2BgYAorY2xhc3MgRmlsZUludGVyZmFjZSB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCBib29sIE9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSkgPSAwOworfTsKKworY2xhc3MgRmlsZSA6IHB1YmxpYyBGaWxlSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgT3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlKSB7CisgICAgcmV0dXJuIE9wZW5GaWxlKHBhdGgsIG1vZGUpOworICB9Cit9OworYGBgCisKK1lvdXIgY29kZSBzaG91bGQgdGFsayB0byBgRmlsZUludGVyZmFjZWAgdG8gb3BlbiBhIGZpbGUuICBOb3cgaXQncworZWFzeSB0byBtb2NrIG91dCB0aGUgZnVuY3Rpb24uCisKK1RoaXMgbWF5IHNlZW0gbXVjaCBoYXNzbGUsIGJ1dCBpbiBwcmFjdGljZSB5b3Ugb2Z0ZW4gaGF2ZSBtdWx0aXBsZQorcmVsYXRlZCBmdW5jdGlvbnMgdGhhdCB5b3UgY2FuIHB1dCBpbiB0aGUgc2FtZSBpbnRlcmZhY2UsIHNvIHRoZQorcGVyLWZ1bmN0aW9uIHN5bnRhY3RpYyBvdmVyaGVhZCB3aWxsIGJlIG11Y2ggbG93ZXIuCisKK0lmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0IHRoZSBwZXJmb3JtYW5jZSBvdmVyaGVhZCBpbmN1cnJlZCBieQordmlydHVhbCBmdW5jdGlvbnMsIGFuZCBwcm9maWxpbmcgY29uZmlybXMgeW91ciBjb25jZXJuLCB5b3UgY2FuCitjb21iaW5lIHRoaXMgd2l0aCB0aGUgcmVjaXBlIGZvciBbbW9ja2luZyBub24tdmlydHVhbCBtZXRob2RzXSgjTW9ja2luZ19Ob252aXJ0dWFsX01ldGhvZHMubWQpLgorCisjIyBOaWNlIE1vY2tzIGFuZCBTdHJpY3QgTW9ja3MgIyMKKworSWYgYSBtb2NrIG1ldGhvZCBoYXMgbm8gYEVYUEVDVF9DQUxMYCBzcGVjIGJ1dCBpcyBjYWxsZWQsIEdvb2dsZSBNb2NrCit3aWxsIHByaW50IGEgd2FybmluZyBhYm91dCB0aGUgInVuaW50ZXJlc3RpbmcgY2FsbCIuIFRoZSByYXRpb25hbGUgaXM6CisKKyAgKiBOZXcgbWV0aG9kcyBtYXkgYmUgYWRkZWQgdG8gYW4gaW50ZXJmYWNlIGFmdGVyIGEgdGVzdCBpcyB3cml0dGVuLiBXZSBzaG91bGRuJ3QgZmFpbCBhIHRlc3QganVzdCBiZWNhdXNlIGEgbWV0aG9kIGl0IGRvZXNuJ3Qga25vdyBhYm91dCBpcyBjYWxsZWQuCisgICogSG93ZXZlciwgdGhpcyBtYXkgYWxzbyBtZWFuIHRoZXJlJ3MgYSBidWcgaW4gdGhlIHRlc3QsIHNvIEdvb2dsZSBNb2NrIHNob3VsZG4ndCBiZSBzaWxlbnQgZWl0aGVyLiBJZiB0aGUgdXNlciBiZWxpZXZlcyB0aGVzZSBjYWxscyBhcmUgaGFybWxlc3MsIGhlIGNhbiBhZGQgYW4gYEVYUEVDVF9DQUxMKClgIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nLgorCitIb3dldmVyLCBzb21ldGltZXMgeW91IG1heSB3YW50IHRvIHN1cHByZXNzIGFsbCAidW5pbnRlcmVzdGluZyBjYWxsIgord2FybmluZ3MsIHdoaWxlIHNvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdGhlIG9wcG9zaXRlLCBpLmUuIHRvIHRyZWF0IGFsbAorb2YgdGhlbSBhcyBlcnJvcnMuIEdvb2dsZSBNb2NrIGxldHMgeW91IG1ha2UgdGhlIGRlY2lzaW9uIG9uIGEKK3Blci1tb2NrLW9iamVjdCBiYXNpcy4KKworU3VwcG9zZSB5b3VyIHRlc3QgdXNlcyBhIG1vY2sgY2xhc3MgYE1vY2tGb29gOgorCitgYGAKK1RFU1QoLi4uKSB7CisgIE1vY2tGb28gbW9ja19mb287CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBEb1RoaXMoKSk7CisgIC4uLiBjb2RlIHRoYXQgdXNlcyBtb2NrX2ZvbyAuLi4KK30KK2BgYAorCitJZiBhIG1ldGhvZCBvZiBgbW9ja19mb29gIG90aGVyIHRoYW4gYERvVGhpcygpYCBpcyBjYWxsZWQsIGl0IHdpbGwgYmUKK3JlcG9ydGVkIGJ5IEdvb2dsZSBNb2NrIGFzIGEgd2FybmluZy4gSG93ZXZlciwgaWYgeW91IHJld3JpdGUgeW91cgordGVzdCB0byB1c2UgYE5pY2VNb2NrPE1vY2tGb28+YCBpbnN0ZWFkLCB0aGUgd2FybmluZyB3aWxsIGJlIGdvbmUsCityZXN1bHRpbmcgaW4gYSBjbGVhbmVyIHRlc3Qgb3V0cHV0OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TmljZU1vY2s7CisKK1RFU1QoLi4uKSB7CisgIE5pY2VNb2NrPE1vY2tGb28+IG1vY2tfZm9vOworICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgRG9UaGlzKCkpOworICAuLi4gY29kZSB0aGF0IHVzZXMgbW9ja19mb28gLi4uCit9CitgYGAKKworYE5pY2VNb2NrPE1vY2tGb28+YCBpcyBhIHN1YmNsYXNzIG9mIGBNb2NrRm9vYCwgc28gaXQgY2FuIGJlIHVzZWQKK3doZXJldmVyIGBNb2NrRm9vYCBpcyBhY2NlcHRlZC4KKworSXQgYWxzbyB3b3JrcyBpZiBgTW9ja0Zvb2AncyBjb25zdHJ1Y3RvciB0YWtlcyBzb21lIGFyZ3VtZW50cywgYXMKK2BOaWNlTW9jazxNb2NrRm9vPmAgImluaGVyaXRzIiBgTW9ja0Zvb2AncyBjb25zdHJ1Y3RvcnM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKKworVEVTVCguLi4pIHsKKyAgTmljZU1vY2s8TW9ja0Zvbz4gbW9ja19mb28oNSwgImhpIik7ICAvLyBDYWxscyBNb2NrRm9vKDUsICJoaSIpLgorICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgRG9UaGlzKCkpOworICAuLi4gY29kZSB0aGF0IHVzZXMgbW9ja19mb28gLi4uCit9CitgYGAKKworVGhlIHVzYWdlIG9mIGBTdHJpY3RNb2NrYCBpcyBzaW1pbGFyLCBleGNlcHQgdGhhdCBpdCBtYWtlcyBhbGwKK3VuaW50ZXJlc3RpbmcgY2FsbHMgZmFpbHVyZXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrOworCitURVNUKC4uLikgeworICBTdHJpY3RNb2NrPE1vY2tGb28+IG1vY2tfZm9vOworICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgRG9UaGlzKCkpOworICAuLi4gY29kZSB0aGF0IHVzZXMgbW9ja19mb28gLi4uCisKKyAgLy8gVGhlIHRlc3Qgd2lsbCBmYWlsIGlmIGEgbWV0aG9kIG9mIG1vY2tfZm9vIG90aGVyIHRoYW4gRG9UaGlzKCkKKyAgLy8gaXMgY2FsbGVkLgorfQorYGBgCisKK1RoZXJlIGFyZSBzb21lIGNhdmVhdHMgdGhvdWdoIChJIGRvbid0IGxpa2UgdGhlbSBqdXN0IGFzIG11Y2ggYXMgdGhlCituZXh0IGd1eSwgYnV0IHNhZGx5IHRoZXkgYXJlIHNpZGUgZWZmZWN0cyBvZiBDKysncyBsaW1pdGF0aW9ucyk6CisKKyAgMS4gYE5pY2VNb2NrPE1vY2tGb28+YCBhbmQgYFN0cmljdE1vY2s8TW9ja0Zvbz5gIG9ubHkgd29yayBmb3IgbW9jayBtZXRob2RzIGRlZmluZWQgdXNpbmcgdGhlIGBNT0NLX01FVEhPRCpgIGZhbWlseSBvZiBtYWNyb3MgKipkaXJlY3RseSoqIGluIHRoZSBgTW9ja0Zvb2AgY2xhc3MuIElmIGEgbW9jayBtZXRob2QgaXMgZGVmaW5lZCBpbiBhICoqYmFzZSBjbGFzcyoqIG9mIGBNb2NrRm9vYCwgdGhlICJuaWNlIiBvciAic3RyaWN0IiBtb2RpZmllciBtYXkgbm90IGFmZmVjdCBpdCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlci4gSW4gcGFydGljdWxhciwgbmVzdGluZyBgTmljZU1vY2tgIGFuZCBgU3RyaWN0TW9ja2AgKGUuZy4gYE5pY2VNb2NrPFN0cmljdE1vY2s8TW9ja0Zvbz4gPmApIGlzICoqbm90Kiogc3VwcG9ydGVkLgorICAxLiBUaGUgY29uc3RydWN0b3JzIG9mIHRoZSBiYXNlIG1vY2sgKGBNb2NrRm9vYCkgY2Fubm90IGhhdmUgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3aGljaCBoYXBwZW5zIHRvIGJlIGJhbm5lZCBieSB0aGUgW0dvb2dsZSBDKysgc3R5bGUgZ3VpZGVdKGh0dHA6Ly9nb29nbGUtc3R5bGVndWlkZS5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvY3BwZ3VpZGUueG1sKS4KKyAgMS4gRHVyaW5nIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG9mIGBNb2NrRm9vYCwgdGhlIG1vY2sgb2JqZWN0IGlzIF9ub3RfIG5pY2Ugb3Igc3RyaWN0LiAgVGhpcyBtYXkgY2F1c2Ugc3VycHJpc2VzIGlmIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGNhbGxzIGEgbW9jayBtZXRob2Qgb24gYHRoaXNgIG9iamVjdC4gKFRoaXMgYmVoYXZpb3IsIGhvd2V2ZXIsIGlzIGNvbnNpc3RlbnQgd2l0aCBDKysncyBnZW5lcmFsIHJ1bGU6IGlmIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBjYWxscyBhIHZpcnR1YWwgbWV0aG9kIG9mIGB0aGlzYCBvYmplY3QsIHRoYXQgbWV0aG9kIGlzIHRyZWF0ZWQgYXMgbm9uLXZpcnR1YWwuICBJbiBvdGhlciB3b3JkcywgdG8gdGhlIGJhc2UgY2xhc3MncyBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLCBgdGhpc2Agb2JqZWN0IGJlaGF2ZXMgbGlrZSBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBjbGFzcywgbm90IHRoZSBkZXJpdmVkIGNsYXNzLiAgVGhpcyBydWxlIGlzIHJlcXVpcmVkIGZvciBzYWZldHkuICBPdGhlcndpc2UgYSBiYXNlIGNvbnN0cnVjdG9yIG1heSB1c2UgbWVtYmVycyBvZiBhIGRlcml2ZWQgY2xhc3MgYmVmb3JlIHRoZXkgYXJlIGluaXRpYWxpemVkLCBvciBhIGJhc2UgZGVzdHJ1Y3RvciBtYXkgdXNlIG1lbWJlcnMgb2YgYSBkZXJpdmVkIGNsYXNzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGRlc3Ryb3llZC4pCisKK0ZpbmFsbHksIHlvdSBzaG91bGQgYmUgKip2ZXJ5IGNhdXRpb3VzKiogd2hlbiB1c2luZyB0aGlzIGZlYXR1cmUsIGFzIHRoZQorZGVjaXNpb24geW91IG1ha2UgYXBwbGllcyB0byAqKmFsbCoqIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtb2NrCitjbGFzcy4gSWYgYW4gaW1wb3J0YW50IGNoYW5nZSBpcyBtYWRlIGluIHRoZSBpbnRlcmZhY2UgeW91IGFyZSBtb2NraW5nCisoYW5kIHRodXMgaW4gdGhlIG1vY2sgY2xhc3MpLCBpdCBjb3VsZCBicmVhayB5b3VyIHRlc3RzIChpZiB5b3UgdXNlCitgU3RyaWN0TW9ja2ApIG9yIGxldCBidWdzIHBhc3MgdGhyb3VnaCB3aXRob3V0IGEgd2FybmluZyAoaWYgeW91IHVzZQorYE5pY2VNb2NrYCkuIFRoZXJlZm9yZSwgdHJ5IHRvIHNwZWNpZnkgdGhlIG1vY2sncyBiZWhhdmlvciB1c2luZworZXhwbGljaXQgYEVYUEVDVF9DQUxMYCBmaXJzdCwgYW5kIG9ubHkgdHVybiB0byBgTmljZU1vY2tgIG9yCitgU3RyaWN0TW9ja2AgYXMgdGhlIGxhc3QgcmVzb3J0LgorCisjIyBTaW1wbGlmeWluZyB0aGUgSW50ZXJmYWNlIHdpdGhvdXQgQnJlYWtpbmcgRXhpc3RpbmcgQ29kZSAjIworCitTb21ldGltZXMgYSBtZXRob2QgaGFzIGEgbG9uZyBsaXN0IG9mIGFyZ3VtZW50cyB0aGF0IGlzIG1vc3RseQordW5pbnRlcmVzdGluZy4gRm9yIGV4YW1wbGUsCisKK2BgYAorY2xhc3MgTG9nU2luayB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCB2b2lkIHNlbmQoTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqIGZ1bGxfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJhc2VfZmlsZW5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdG0qIHRtX3RpbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHNpemVfdCBtZXNzYWdlX2xlbikgPSAwOworfTsKK2BgYAorCitUaGlzIG1ldGhvZCdzIGFyZ3VtZW50IGxpc3QgaXMgbGVuZ3RoeSBhbmQgaGFyZCB0byB3b3JrIHdpdGggKGxldCdzCitzYXkgdGhhdCB0aGUgYG1lc3NhZ2VgIGFyZ3VtZW50IGlzIG5vdCBldmVuIDAtdGVybWluYXRlZCkuIElmIHdlIG1vY2sKK2l0IGFzIGlzLCB1c2luZyB0aGUgbW9jayB3aWxsIGJlIGF3a3dhcmQuIElmLCBob3dldmVyLCB3ZSB0cnkgdG8KK3NpbXBsaWZ5IHRoaXMgaW50ZXJmYWNlLCB3ZSdsbCBuZWVkIHRvIGZpeCBhbGwgY2xpZW50cyBkZXBlbmRpbmcgb24KK2l0LCB3aGljaCBpcyBvZnRlbiBpbmZlYXNpYmxlLgorCitUaGUgdHJpY2sgaXMgdG8gcmUtZGlzcGF0Y2ggdGhlIG1ldGhvZCBpbiB0aGUgbW9jayBjbGFzczoKKworYGBgCitjbGFzcyBTY29wZWRNb2NrTG9nIDogcHVibGljIExvZ1NpbmsgeworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgdm9pZCBzZW5kKExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmdWxsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBiYXNlX2ZpbGVuYW1lLCBpbnQgbGluZSwgY29uc3QgdG0qIHRtX3RpbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHNpemVfdCBtZXNzYWdlX2xlbikgeworICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGxvZyBzZXZlcml0eSwgZnVsbCBmaWxlIG5hbWUsIGFuZAorICAgIC8vIGxvZyBtZXNzYWdlLgorICAgIExvZyhzZXZlcml0eSwgZnVsbF9maWxlbmFtZSwgc3RkOjpzdHJpbmcobWVzc2FnZSwgbWVzc2FnZV9sZW4pKTsKKyAgfQorCisgIC8vIEltcGxlbWVudHMgdGhlIG1vY2sgbWV0aG9kOgorICAvLworICAvLyAgIHZvaWQgTG9nKExvZ1NldmVyaXR5IHNldmVyaXR5LAorICAvLyAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoLAorICAvLyAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSk7CisgIE1PQ0tfTUVUSE9EMyhMb2csIHZvaWQoTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkpOworfTsKK2BgYAorCitCeSBkZWZpbmluZyBhIG5ldyBtb2NrIG1ldGhvZCB3aXRoIGEgdHJpbW1lZCBhcmd1bWVudCBsaXN0LCB3ZSBtYWtlCit0aGUgbW9jayBjbGFzcyBtdWNoIG1vcmUgdXNlci1mcmllbmRseS4KKworIyMgQWx0ZXJuYXRpdmUgdG8gTW9ja2luZyBDb25jcmV0ZSBDbGFzc2VzICMjCisKK09mdGVuIHlvdSBtYXkgZmluZCB5b3Vyc2VsZiB1c2luZyBjbGFzc2VzIHRoYXQgZG9uJ3QgaW1wbGVtZW50CitpbnRlcmZhY2VzLiBJbiBvcmRlciB0byB0ZXN0IHlvdXIgY29kZSB0aGF0IHVzZXMgc3VjaCBhIGNsYXNzIChsZXQncworY2FsbCBpdCBgQ29uY3JldGVgKSwgeW91IG1heSBiZSB0ZW1wdGVkIHRvIG1ha2UgdGhlIG1ldGhvZHMgb2YKK2BDb25jcmV0ZWAgdmlydHVhbCBhbmQgdGhlbiBtb2NrIGl0LgorCitUcnkgbm90IHRvIGRvIHRoYXQuCisKK01ha2luZyBhIG5vbi12aXJ0dWFsIGZ1bmN0aW9uIHZpcnR1YWwgaXMgYSBiaWcgZGVjaXNpb24uIEl0IGNyZWF0ZXMgYW4KK2V4dGVuc2lvbiBwb2ludCB3aGVyZSBzdWJjbGFzc2VzIGNhbiB0d2VhayB5b3VyIGNsYXNzJyBiZWhhdmlvci4gVGhpcword2Vha2VucyB5b3VyIGNvbnRyb2wgb24gdGhlIGNsYXNzIGJlY2F1c2Ugbm93IGl0J3MgaGFyZGVyIHRvIG1haW50YWluCit0aGUgY2xhc3MnIGludmFyaWFudHMuIFlvdSBzaG91bGQgbWFrZSBhIGZ1bmN0aW9uIHZpcnR1YWwgb25seSB3aGVuCit0aGVyZSBpcyBhIHZhbGlkIHJlYXNvbiBmb3IgYSBzdWJjbGFzcyB0byBvdmVycmlkZSBpdC4KKworTW9ja2luZyBjb25jcmV0ZSBjbGFzc2VzIGRpcmVjdGx5IGlzIHByb2JsZW1hdGljIGFzIGl0IGNyZWF0ZXMgYSB0aWdodAorY291cGxpbmcgYmV0d2VlbiB0aGUgY2xhc3MgYW5kIHRoZSB0ZXN0cyAtIGFueSBzbWFsbCBjaGFuZ2UgaW4gdGhlCitjbGFzcyBtYXkgaW52YWxpZGF0ZSB5b3VyIHRlc3RzIGFuZCBtYWtlIHRlc3QgbWFpbnRlbmFuY2UgYSBwYWluLgorCitUbyBhdm9pZCBzdWNoIHByb2JsZW1zLCBtYW55IHByb2dyYW1tZXJzIGhhdmUgYmVlbiBwcmFjdGljaW5nICJjb2RpbmcKK3RvIGludGVyZmFjZXMiOiBpbnN0ZWFkIG9mIHRhbGtpbmcgdG8gdGhlIGBDb25jcmV0ZWAgY2xhc3MsIHlvdXIgY29kZQord291bGQgZGVmaW5lIGFuIGludGVyZmFjZSBhbmQgdGFsayB0byBpdC4gVGhlbiB5b3UgaW1wbGVtZW50IHRoYXQKK2ludGVyZmFjZSBhcyBhbiBhZGFwdG9yIG9uIHRvcCBvZiBgQ29uY3JldGVgLiBJbiB0ZXN0cywgeW91IGNhbiBlYXNpbHkKK21vY2sgdGhhdCBpbnRlcmZhY2UgdG8gb2JzZXJ2ZSBob3cgeW91ciBjb2RlIGlzIGRvaW5nLgorCitUaGlzIHRlY2huaXF1ZSBpbmN1cnMgc29tZSBvdmVyaGVhZDoKKworICAqIFlvdSBwYXkgdGhlIGNvc3Qgb2YgdmlydHVhbCBmdW5jdGlvbiBjYWxscyAodXN1YWxseSBub3QgYSBwcm9ibGVtKS4KKyAgKiBUaGVyZSBpcyBtb3JlIGFic3RyYWN0aW9uIGZvciB0aGUgcHJvZ3JhbW1lcnMgdG8gbGVhcm4uCisKK0hvd2V2ZXIsIGl0IGNhbiBhbHNvIGJyaW5nIHNpZ25pZmljYW50IGJlbmVmaXRzIGluIGFkZGl0aW9uIHRvIGJldHRlcgordGVzdGFiaWxpdHk6CisKKyAgKiBgQ29uY3JldGVgJ3MgQVBJIG1heSBub3QgZml0IHlvdXIgcHJvYmxlbSBkb21haW4gdmVyeSB3ZWxsLCBhcyB5b3UgbWF5IG5vdCBiZSB0aGUgb25seSBjbGllbnQgaXQgdHJpZXMgdG8gc2VydmUuIEJ5IGRlc2lnbmluZyB5b3VyIG93biBpbnRlcmZhY2UsIHlvdSBoYXZlIGEgY2hhbmNlIHRvIHRhaWxvciBpdCB0byB5b3VyIG5lZWQgLSB5b3UgbWF5IGFkZCBoaWdoZXItbGV2ZWwgZnVuY3Rpb25hbGl0aWVzLCByZW5hbWUgc3R1ZmYsIGV0YyBpbnN0ZWFkIG9mIGp1c3QgdHJpbW1pbmcgdGhlIGNsYXNzLiBUaGlzIGFsbG93cyB5b3UgdG8gd3JpdGUgeW91ciBjb2RlICh1c2VyIG9mIHRoZSBpbnRlcmZhY2UpIGluIGEgbW9yZSBuYXR1cmFsIHdheSwgd2hpY2ggbWVhbnMgaXQgd2lsbCBiZSBtb3JlIHJlYWRhYmxlLCBtb3JlIG1haW50YWluYWJsZSwgYW5kIHlvdSdsbCBiZSBtb3JlIHByb2R1Y3RpdmUuCisgICogSWYgYENvbmNyZXRlYCdzIGltcGxlbWVudGF0aW9uIGV2ZXIgaGFzIHRvIGNoYW5nZSwgeW91IGRvbid0IGhhdmUgdG8gcmV3cml0ZSBldmVyeXdoZXJlIGl0IGlzIHVzZWQuIEluc3RlYWQsIHlvdSBjYW4gYWJzb3JiIHRoZSBjaGFuZ2UgaW4geW91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlLCBhbmQgeW91ciBvdGhlciBjb2RlIGFuZCB0ZXN0cyB3aWxsIGJlIGluc3VsYXRlZCBmcm9tIHRoaXMgY2hhbmdlLgorCitTb21lIHBlb3BsZSB3b3JyeSB0aGF0IGlmIGV2ZXJ5b25lIGlzIHByYWN0aWNpbmcgdGhpcyB0ZWNobmlxdWUsIHRoZXkKK3dpbGwgZW5kIHVwIHdyaXRpbmcgbG90cyBvZiByZWR1bmRhbnQgY29kZS4gVGhpcyBjb25jZXJuIGlzIHRvdGFsbHkKK3VuZGVyc3RhbmRhYmxlLiBIb3dldmVyLCB0aGVyZSBhcmUgdHdvIHJlYXNvbnMgd2h5IGl0IG1heSBub3QgYmUgdGhlCitjYXNlOgorCisgICogRGlmZmVyZW50IHByb2plY3RzIG1heSBuZWVkIHRvIHVzZSBgQ29uY3JldGVgIGluIGRpZmZlcmVudCB3YXlzLCBzbyB0aGUgYmVzdCBpbnRlcmZhY2VzIGZvciB0aGVtIHdpbGwgYmUgZGlmZmVyZW50LiBUaGVyZWZvcmUsIGVhY2ggb2YgdGhlbSB3aWxsIGhhdmUgaXRzIG93biBkb21haW4tc3BlY2lmaWMgaW50ZXJmYWNlIG9uIHRvcCBvZiBgQ29uY3JldGVgLCBhbmQgdGhleSB3aWxsIG5vdCBiZSB0aGUgc2FtZSBjb2RlLgorICAqIElmIGVub3VnaCBwcm9qZWN0cyB3YW50IHRvIHVzZSB0aGUgc2FtZSBpbnRlcmZhY2UsIHRoZXkgY2FuIGFsd2F5cyBzaGFyZSBpdCwganVzdCBsaWtlIHRoZXkgaGF2ZSBiZWVuIHNoYXJpbmcgYENvbmNyZXRlYC4gWW91IGNhbiBjaGVjayBpbiB0aGUgaW50ZXJmYWNlIGFuZCB0aGUgYWRhcHRvciBzb21ld2hlcmUgbmVhciBgQ29uY3JldGVgIChwZXJoYXBzIGluIGEgYGNvbnRyaWJgIHN1Yi1kaXJlY3RvcnkpIGFuZCBsZXQgbWFueSBwcm9qZWN0cyB1c2UgaXQuCisKK1lvdSBuZWVkIHRvIHdlaWdoIHRoZSBwcm9zIGFuZCBjb25zIGNhcmVmdWxseSBmb3IgeW91ciBwYXJ0aWN1bGFyCitwcm9ibGVtLCBidXQgSSdkIGxpa2UgdG8gYXNzdXJlIHlvdSB0aGF0IHRoZSBKYXZhIGNvbW11bml0eSBoYXMgYmVlbgorcHJhY3RpY2luZyB0aGlzIGZvciBhIGxvbmcgdGltZSBhbmQgaXQncyBhIHByb3ZlbiBlZmZlY3RpdmUgdGVjaG5pcXVlCithcHBsaWNhYmxlIGluIGEgd2lkZSB2YXJpZXR5IG9mIHNpdHVhdGlvbnMuIDotKQorCisjIyBEZWxlZ2F0aW5nIENhbGxzIHRvIGEgRmFrZSAjIworCitTb21lIHRpbWVzIHlvdSBoYXZlIGEgbm9uLXRyaXZpYWwgZmFrZSBpbXBsZW1lbnRhdGlvbiBvZiBhbgoraW50ZXJmYWNlLiBGb3IgZXhhbXBsZToKKworYGBgCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Rm9vKCkge30KKyAgdmlydHVhbCBjaGFyIERvVGhpcyhpbnQgbikgPSAwOworICB2aXJ0dWFsIHZvaWQgRG9UaGF0KGNvbnN0IGNoYXIqIHMsIGludCogcCkgPSAwOworfTsKKworY2xhc3MgRmFrZUZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCBjaGFyIERvVGhpcyhpbnQgbikgeworICAgIHJldHVybiAobiA+IDApID8gJysnIDoKKyAgICAgICAgKG4gPCAwKSA/ICctJyA6ICcwJzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEb1RoYXQoY29uc3QgY2hhciogcywgaW50KiBwKSB7CisgICAgKnAgPSBzdHJsZW4ocyk7CisgIH0KK307CitgYGAKKworTm93IHlvdSB3YW50IHRvIG1vY2sgdGhpcyBpbnRlcmZhY2Ugc3VjaCB0aGF0IHlvdSBjYW4gc2V0IGV4cGVjdGF0aW9ucworb24gaXQuIEhvd2V2ZXIsIHlvdSBhbHNvIHdhbnQgdG8gdXNlIGBGYWtlRm9vYCBmb3IgdGhlIGRlZmF1bHQKK2JlaGF2aW9yLCBhcyBkdXBsaWNhdGluZyBpdCBpbiB0aGUgbW9jayBvYmplY3QgaXMsIHdlbGwsIGEgbG90IG9mCit3b3JrLgorCitXaGVuIHlvdSBkZWZpbmUgdGhlIG1vY2sgY2xhc3MgdXNpbmcgR29vZ2xlIE1vY2ssIHlvdSBjYW4gaGF2ZSBpdAorZGVsZWdhdGUgaXRzIGRlZmF1bHQgYWN0aW9uIHRvIGEgZmFrZSBjbGFzcyB5b3UgYWxyZWFkeSBoYXZlLCB1c2luZwordGhpcyBwYXR0ZXJuOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICAvLyBOb3JtYWwgbW9jayBtZXRob2QgZGVmaW5pdGlvbnMgdXNpbmcgR29vZ2xlIE1vY2suCisgIE1PQ0tfTUVUSE9EMShEb1RoaXMsIGNoYXIoaW50IG4pKTsKKyAgTU9DS19NRVRIT0QyKERvVGhhdCwgdm9pZChjb25zdCBjaGFyKiBzLCBpbnQqIHApKTsKKworICAvLyBEZWxlZ2F0ZXMgdGhlIGRlZmF1bHQgYWN0aW9ucyBvZiB0aGUgbWV0aG9kcyB0byBhIEZha2VGb28gb2JqZWN0LgorICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBjdXN0b20gT05fQ0FMTCgpIHN0YXRlbWVudHMuCisgIHZvaWQgRGVsZWdhdGVUb0Zha2UoKSB7CisgICAgT05fQ0FMTCgqdGhpcywgRG9UaGlzKF8pKQorICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoJmZha2VfLCAmRmFrZUZvbzo6RG9UaGlzKSk7CisgICAgT05fQ0FMTCgqdGhpcywgRG9UaGF0KF8sIF8pKQorICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoJmZha2VfLCAmRmFrZUZvbzo6RG9UaGF0KSk7CisgIH0KKyBwcml2YXRlOgorICBGYWtlRm9vIGZha2VfOyAgLy8gS2VlcHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZha2UgaW4gdGhlIG1vY2suCit9OworYGBgCisKK1dpdGggdGhhdCwgeW91IGNhbiB1c2UgYE1vY2tGb29gIGluIHlvdXIgdGVzdHMgYXMgdXN1YWwuIEp1c3QgcmVtZW1iZXIKK3RoYXQgaWYgeW91IGRvbid0IGV4cGxpY2l0bHkgc2V0IGFuIGFjdGlvbiBpbiBhbiBgT05fQ0FMTCgpYCBvcgorYEVYUEVDVF9DQUxMKClgLCB0aGUgZmFrZSB3aWxsIGJlIGNhbGxlZCB1cG9uIHRvIGRvIGl0OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKworVEVTVChBYmNUZXN0LCBYeXopIHsKKyAgTW9ja0ZvbyBmb287CisgIGZvby5EZWxlZ2F0ZVRvRmFrZSgpOyAvLyBFbmFibGVzIHRoZSBmYWtlIGZvciBkZWxlZ2F0aW9uLgorCisgIC8vIFB1dCB5b3VyIE9OX0NBTEwoZm9vLCAuLi4pcyBoZXJlLCBpZiBhbnkuCisKKyAgLy8gTm8gYWN0aW9uIHNwZWNpZmllZCwgbWVhbmluZyB0byB1c2UgdGhlIGRlZmF1bHQgYWN0aW9uLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyg1KSk7CisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGF0KF8sIF8pKTsKKworICBpbnQgbiA9IDA7CisgIEVYUEVDVF9FUSgnKycsIGZvby5Eb1RoaXMoNSkpOyAgLy8gRmFrZUZvbzo6RG9UaGlzKCkgaXMgaW52b2tlZC4KKyAgZm9vLkRvVGhhdCgiSGkiLCAmbik7ICAgICAgICAgICAvLyBGYWtlRm9vOjpEb1RoYXQoKSBpcyBpbnZva2VkLgorICBFWFBFQ1RfRVEoMiwgbik7Cit9CitgYGAKKworKipTb21lIHRpcHM6KioKKworICAqIElmIHlvdSB3YW50LCB5b3UgY2FuIHN0aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGFjdGlvbiBieSBwcm92aWRpbmcgeW91ciBvd24gYE9OX0NBTEwoKWAgb3IgdXNpbmcgYC5XaWxsT25jZSgpYCAvIGAuV2lsbFJlcGVhdGVkbHkoKWAgaW4gYEVYUEVDVF9DQUxMKClgLgorICAqIEluIGBEZWxlZ2F0ZVRvRmFrZSgpYCwgeW91IG9ubHkgbmVlZCB0byBkZWxlZ2F0ZSB0aGUgbWV0aG9kcyB3aG9zZSBmYWtlIGltcGxlbWVudGF0aW9uIHlvdSBpbnRlbmQgdG8gdXNlLgorICAqIFRoZSBnZW5lcmFsIHRlY2huaXF1ZSBkaXNjdXNzZWQgaGVyZSB3b3JrcyBmb3Igb3ZlcmxvYWRlZCBtZXRob2RzLCBidXQgeW91J2xsIG5lZWQgdG8gdGVsbCB0aGUgY29tcGlsZXIgd2hpY2ggdmVyc2lvbiB5b3UgbWVhbi4gVG8gZGlzYW1iaWd1YXRlIGEgbW9jayBmdW5jdGlvbiAodGhlIG9uZSB5b3Ugc3BlY2lmeSBpbnNpZGUgdGhlIHBhcmVudGhlc2VzIG9mIGBPTl9DQUxMKClgKSwgc2VlIHRoZSAiU2VsZWN0aW5nIEJldHdlZW4gT3ZlcmxvYWRlZCBGdW5jdGlvbnMiIHNlY3Rpb24gb24gdGhpcyBwYWdlOyB0byBkaXNhbWJpZ3VhdGUgYSBmYWtlIGZ1bmN0aW9uICh0aGUgb25lIHlvdSBwbGFjZSBpbnNpZGUgYEludm9rZSgpYCksIHVzZSBhIGBzdGF0aWNfY2FzdGAgdG8gc3BlY2lmeSB0aGUgZnVuY3Rpb24ncyB0eXBlLgorICAqIEhhdmluZyB0byBtaXggYSBtb2NrIGFuZCBhIGZha2UgaXMgb2Z0ZW4gYSBzaWduIG9mIHNvbWV0aGluZyBnb25lIHdyb25nLiBQZXJoYXBzIHlvdSBoYXZlbid0IGdvdCB1c2VkIHRvIHRoZSBpbnRlcmFjdGlvbi1iYXNlZCB3YXkgb2YgdGVzdGluZyB5ZXQuIE9yIHBlcmhhcHMgeW91ciBpbnRlcmZhY2UgaXMgdGFraW5nIG9uIHRvbyBtYW55IHJvbGVzIGFuZCBzaG91bGQgYmUgc3BsaXQgdXAuIFRoZXJlZm9yZSwgKipkb24ndCBhYnVzZSB0aGlzKiouIFdlIHdvdWxkIG9ubHkgcmVjb21tZW5kIHRvIGRvIGl0IGFzIGFuIGludGVybWVkaWF0ZSBzdGVwIHdoZW4geW91IGFyZSByZWZhY3RvcmluZyB5b3VyIGNvZGUuCisKK1JlZ2FyZGluZyB0aGUgdGlwIG9uIG1peGluZyBhIG1vY2sgYW5kIGEgZmFrZSwgaGVyZSdzIGFuIGV4YW1wbGUgb24KK3doeSBpdCBtYXkgYmUgYSBiYWQgc2lnbjogU3VwcG9zZSB5b3UgaGF2ZSBhIGNsYXNzIGBTeXN0ZW1gIGZvcgorbG93LWxldmVsIHN5c3RlbSBvcGVyYXRpb25zLiBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIGZpbGUgYW5kIEkvTworb3BlcmF0aW9ucy4gQW5kIHN1cHBvc2UgeW91IHdhbnQgdG8gdGVzdCBob3cgeW91ciBjb2RlIHVzZXMgYFN5c3RlbWAKK3RvIGRvIEkvTywgYW5kIHlvdSBqdXN0IHdhbnQgdGhlIGZpbGUgb3BlcmF0aW9ucyB0byB3b3JrIG5vcm1hbGx5LiBJZgoreW91IG1vY2sgb3V0IHRoZSBlbnRpcmUgYFN5c3RlbWAgY2xhc3MsIHlvdSdsbCBoYXZlIHRvIHByb3ZpZGUgYSBmYWtlCitpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGZpbGUgb3BlcmF0aW9uIHBhcnQsIHdoaWNoIHN1Z2dlc3RzIHRoYXQKK2BTeXN0ZW1gIGlzIHRha2luZyBvbiB0b28gbWFueSByb2xlcy4KKworSW5zdGVhZCwgeW91IGNhbiBkZWZpbmUgYSBgRmlsZU9wc2AgaW50ZXJmYWNlIGFuZCBhbiBgSU9PcHNgIGludGVyZmFjZQorYW5kIHNwbGl0IGBTeXN0ZW1gJ3MgZnVuY3Rpb25hbGl0aWVzIGludG8gdGhlIHR3by4gVGhlbiB5b3UgY2FuIG1vY2sKK2BJT09wc2Agd2l0aG91dCBtb2NraW5nIGBGaWxlT3BzYC4KKworIyMgRGVsZWdhdGluZyBDYWxscyB0byBhIFJlYWwgT2JqZWN0ICMjCisKK1doZW4gdXNpbmcgdGVzdGluZyBkb3VibGVzIChtb2NrcywgZmFrZXMsIHN0dWJzLCBhbmQgZXRjKSwgc29tZXRpbWVzCit0aGVpciBiZWhhdmlvcnMgd2lsbCBkaWZmZXIgZnJvbSB0aG9zZSBvZiB0aGUgcmVhbCBvYmplY3RzLiBUaGlzCitkaWZmZXJlbmNlIGNvdWxkIGJlIGVpdGhlciBpbnRlbnRpb25hbCAoYXMgaW4gc2ltdWxhdGluZyBhbiBlcnJvciBzdWNoCit0aGF0IHlvdSBjYW4gdGVzdCB0aGUgZXJyb3IgaGFuZGxpbmcgY29kZSkgb3IgdW5pbnRlbnRpb25hbC4gSWYgeW91cgorbW9ja3MgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3JzIHRoYW4gdGhlIHJlYWwgb2JqZWN0cyBieSBtaXN0YWtlLCB5b3UKK2NvdWxkIGVuZCB1cCB3aXRoIGNvZGUgdGhhdCBwYXNzZXMgdGhlIHRlc3RzIGJ1dCBmYWlscyBpbiBwcm9kdWN0aW9uLgorCitZb3UgY2FuIHVzZSB0aGUgX2RlbGVnYXRpbmctdG8tcmVhbF8gdGVjaG5pcXVlIHRvIGVuc3VyZSB0aGF0IHlvdXIKK21vY2sgaGFzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSByZWFsIG9iamVjdCB3aGlsZSByZXRhaW5pbmcgdGhlCithYmlsaXR5IHRvIHZhbGlkYXRlIGNhbGxzLiBUaGlzIHRlY2huaXF1ZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlCitkZWxlZ2F0aW5nLXRvLWZha2UgdGVjaG5pcXVlLCB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0IHdlIHVzZSBhIHJlYWwKK29iamVjdCBpbnN0ZWFkIG9mIGEgZmFrZS4gSGVyZSdzIGFuIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBdExlYXN0OwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1vY2tGb28oKSB7CisgICAgLy8gQnkgZGVmYXVsdCwgYWxsIGNhbGxzIGFyZSBkZWxlZ2F0ZWQgdG8gdGhlIHJlYWwgb2JqZWN0LgorICAgIE9OX0NBTEwoKnRoaXMsIERvVGhpcygpKQorICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoJnJlYWxfLCAmRm9vOjpEb1RoaXMpKTsKKyAgICBPTl9DQUxMKCp0aGlzLCBEb1RoYXQoXykpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmcmVhbF8sICZGb286OkRvVGhhdCkpOworICAgIC4uLgorICB9CisgIE1PQ0tfTUVUSE9EMChEb1RoaXMsIC4uLik7CisgIE1PQ0tfTUVUSE9EMShEb1RoYXQsIC4uLik7CisgIC4uLgorIHByaXZhdGU6CisgIEZvbyByZWFsXzsKK307CisuLi4KKworICBNb2NrRm9vIG1vY2s7CisKKyAgRVhQRUNUX0NBTEwobW9jaywgRG9UaGlzKCkpCisgICAgICAuVGltZXMoMyk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIERvVGhhdCgiSGkiKSkKKyAgICAgIC5UaW1lcyhBdExlYXN0KDEpKTsKKyAgLi4uIHVzZSBtb2NrIGluIHRlc3QgLi4uCitgYGAKKworV2l0aCB0aGlzLCBHb29nbGUgTW9jayB3aWxsIHZlcmlmeSB0aGF0IHlvdXIgY29kZSBtYWRlIHRoZSByaWdodCBjYWxscworKHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cywgaW4gdGhlIHJpZ2h0IG9yZGVyLCBjYWxsZWQgdGhlIHJpZ2h0IG51bWJlcgorb2YgdGltZXMsIGV0YyksIGFuZCBhIHJlYWwgb2JqZWN0IHdpbGwgYW5zd2VyIHRoZSBjYWxscyAoc28gdGhlCitiZWhhdmlvciB3aWxsIGJlIHRoZSBzYW1lIGFzIGluIHByb2R1Y3Rpb24pLiBUaGlzIGdpdmVzIHlvdSB0aGUgYmVzdAorb2YgYm90aCB3b3JsZHMuCisKKyMjIERlbGVnYXRpbmcgQ2FsbHMgdG8gYSBQYXJlbnQgQ2xhc3MgIyMKKworSWRlYWxseSwgeW91IHNob3VsZCBjb2RlIHRvIGludGVyZmFjZXMsIHdob3NlIG1ldGhvZHMgYXJlIGFsbCBwdXJlCit2aXJ0dWFsLiBJbiByZWFsaXR5LCBzb21ldGltZXMgeW91IGRvIG5lZWQgdG8gbW9jayBhIHZpcnR1YWwgbWV0aG9kCit0aGF0IGlzIG5vdCBwdXJlIChpLmUsIGl0IGFscmVhZHkgaGFzIGFuIGltcGxlbWVudGF0aW9uKS4gRm9yIGV4YW1wbGU6CisKK2BgYAorY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkZvbygpOworCisgIHZpcnR1YWwgdm9pZCBQdXJlKGludCBuKSA9IDA7CisgIHZpcnR1YWwgaW50IENvbmNyZXRlKGNvbnN0IGNoYXIqIHN0cikgeyAuLi4gfQorfTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgLy8gTW9ja2luZyBhIHB1cmUgbWV0aG9kLgorICBNT0NLX01FVEhPRDEoUHVyZSwgdm9pZChpbnQgbikpOworICAvLyBNb2NraW5nIGEgY29uY3JldGUgbWV0aG9kLiAgRm9vOjpDb25jcmV0ZSgpIGlzIHNoYWRvd2VkLgorICBNT0NLX01FVEhPRDEoQ29uY3JldGUsIGludChjb25zdCBjaGFyKiBzdHIpKTsKK307CitgYGAKKworU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0byBjYWxsIGBGb286OkNvbmNyZXRlKClgIGluc3RlYWQgb2YKK2BNb2NrRm9vOjpDb25jcmV0ZSgpYC4gUGVyaGFwcyB5b3Ugd2FudCB0byBkbyBpdCBhcyBwYXJ0IG9mIGEgc3R1YgorYWN0aW9uLCBvciBwZXJoYXBzIHlvdXIgdGVzdCBkb2Vzbid0IG5lZWQgdG8gbW9jayBgQ29uY3JldGUoKWAgYXQgYWxsCisoYnV0IGl0IHdvdWxkIGJlIG9oLXNvIHBhaW5mdWwgdG8gaGF2ZSB0byBkZWZpbmUgYSBuZXcgbW9jayBjbGFzcword2hlbmV2ZXIgeW91IGRvbid0IG5lZWQgdG8gbW9jayBvbmUgb2YgaXRzIG1ldGhvZHMpLgorCitUaGUgdHJpY2sgaXMgdG8gbGVhdmUgYSBiYWNrIGRvb3IgaW4geW91ciBtb2NrIGNsYXNzIGZvciBhY2Nlc3NpbmcgdGhlCityZWFsIG1ldGhvZHMgaW4gdGhlIGJhc2UgY2xhc3M6CisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgLy8gTW9ja2luZyBhIHB1cmUgbWV0aG9kLgorICBNT0NLX01FVEhPRDEoUHVyZSwgdm9pZChpbnQgbikpOworICAvLyBNb2NraW5nIGEgY29uY3JldGUgbWV0aG9kLiAgRm9vOjpDb25jcmV0ZSgpIGlzIHNoYWRvd2VkLgorICBNT0NLX01FVEhPRDEoQ29uY3JldGUsIGludChjb25zdCBjaGFyKiBzdHIpKTsKKworICAvLyBVc2UgdGhpcyB0byBjYWxsIENvbmNyZXRlKCkgZGVmaW5lZCBpbiBGb28uCisgIGludCBGb29Db25jcmV0ZShjb25zdCBjaGFyKiBzdHIpIHsgcmV0dXJuIEZvbzo6Q29uY3JldGUoc3RyKTsgfQorfTsKK2BgYAorCitOb3csIHlvdSBjYW4gY2FsbCBgRm9vOjpDb25jcmV0ZSgpYCBpbnNpZGUgYW4gYWN0aW9uIGJ5OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQ29uY3JldGUoXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlKCZmb28sICZNb2NrRm9vOjpGb29Db25jcmV0ZSkpOworYGBgCisKK29yIHRlbGwgdGhlIG1vY2sgb2JqZWN0IHRoYXQgeW91IGRvbid0IHdhbnQgdG8gbW9jayBgQ29uY3JldGUoKWA6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisuLi4KKyAgT05fQ0FMTChmb28sIENvbmNyZXRlKF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKCZmb28sICZNb2NrRm9vOjpGb29Db25jcmV0ZSkpOworYGBgCisKKyhXaHkgZG9uJ3Qgd2UganVzdCB3cml0ZSBgSW52b2tlKCZmb28sICZGb286OkNvbmNyZXRlKWA/IElmIHlvdSBkbwordGhhdCwgYE1vY2tGb286OkNvbmNyZXRlKClgIHdpbGwgYmUgY2FsbGVkIChhbmQgY2F1c2UgYW4gaW5maW5pdGUKK3JlY3Vyc2lvbikgc2luY2UgYEZvbzo6Q29uY3JldGUoKWAgaXMgdmlydHVhbC4gVGhhdCdzIGp1c3QgaG93IEMrKword29ya3MuKQorCisjIFVzaW5nIE1hdGNoZXJzICMKKworIyMgTWF0Y2hpbmcgQXJndW1lbnQgVmFsdWVzIEV4YWN0bHkgIyMKKworWW91IGNhbiBzcGVjaWZ5IGV4YWN0bHkgd2hpY2ggYXJndW1lbnRzIGEgbW9jayBtZXRob2QgaXMgZXhwZWN0aW5nOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDUpKQorICAgICAgLldpbGxPbmNlKFJldHVybignYScpKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoIkhlbGxvIiwgYmFyKSk7CitgYGAKKworIyMgVXNpbmcgU2ltcGxlIE1hdGNoZXJzICMjCisKK1lvdSBjYW4gdXNlIG1hdGNoZXJzIHRvIG1hdGNoIGFyZ3VtZW50cyB0aGF0IGhhdmUgYSBjZXJ0YWluIHByb3BlcnR5OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6R2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhHZSg1KSkpICAvLyBUaGUgYXJndW1lbnQgbXVzdCBiZSA+PSA1LgorICAgICAgLldpbGxPbmNlKFJldHVybignYScpKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoIkhlbGxvIiwgTm90TnVsbCgpKSk7CisgIC8vIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBub3QgYmUgTlVMTC4KK2BgYAorCitBIGZyZXF1ZW50bHkgdXNlZCBtYXRjaGVyIGlzIGBfYCwgd2hpY2ggbWF0Y2hlcyBhbnl0aGluZzoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoXywgTm90TnVsbCgpKSk7CitgYGAKKworIyMgQ29tYmluaW5nIE1hdGNoZXJzICMjCisKK1lvdSBjYW4gYnVpbGQgY29tcGxleCBtYXRjaGVycyBmcm9tIGV4aXN0aW5nIG9uZXMgdXNpbmcgYEFsbE9mKClgLAorYEFueU9mKClgLCBhbmQgYE5vdCgpYDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkFsbE9mOwordXNpbmcgOjp0ZXN0aW5nOjpHdDsKK3VzaW5nIDo6dGVzdGluZzo6SGFzU3Vic3RyOwordXNpbmcgOjp0ZXN0aW5nOjpOZTsKK3VzaW5nIDo6dGVzdGluZzo6Tm90OworLi4uCisgIC8vIFRoZSBhcmd1bWVudCBtdXN0IGJlID4gNSBhbmQgIT0gMTAuCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKEFsbE9mKEd0KDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZSgxMCkpKSk7CisKKyAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG11c3Qgbm90IGNvbnRhaW4gc3ViLXN0cmluZyAiYmxhaCIuCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGF0KE5vdChIYXNTdWJzdHIoImJsYWgiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKK2BgYAorCisjIyBDYXN0aW5nIE1hdGNoZXJzICMjCisKK0dvb2dsZSBNb2NrIG1hdGNoZXJzIGFyZSBzdGF0aWNhbGx5IHR5cGVkLCBtZWFuaW5nIHRoYXQgdGhlIGNvbXBpbGVyCitjYW4gY2F0Y2ggeW91ciBtaXN0YWtlIGlmIHlvdSB1c2UgYSBtYXRjaGVyIG9mIHRoZSB3cm9uZyB0eXBlIChmb3IKK2V4YW1wbGUsIGlmIHlvdSB1c2UgYEVxKDUpYCB0byBtYXRjaCBhIGBzdHJpbmdgIGFyZ3VtZW50KS4gR29vZCBmb3IKK3lvdSEKKworU29tZXRpbWVzLCBob3dldmVyLCB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZyBhbmQgd2FudCB0aGUgY29tcGlsZXIKK3RvIGdpdmUgeW91IHNvbWUgc2xhY2suIE9uZSBleGFtcGxlIGlzIHRoYXQgeW91IGhhdmUgYSBtYXRjaGVyIGZvcgorYGxvbmdgIGFuZCB0aGUgYXJndW1lbnQgeW91IHdhbnQgdG8gbWF0Y2ggaXMgYGludGAuIFdoaWxlIHRoZSB0d28KK3R5cGVzIGFyZW4ndCBleGFjdGx5IHRoZSBzYW1lLCB0aGVyZSBpcyBub3RoaW5nIHJlYWxseSB3cm9uZyB3aXRoCit1c2luZyBhIGBNYXRjaGVyPGxvbmc+YCB0byBtYXRjaCBhbiBgaW50YCAtIGFmdGVyIGFsbCwgd2UgY2FuIGZpcnN0Citjb252ZXJ0IHRoZSBgaW50YCBhcmd1bWVudCB0byBhIGBsb25nYCBiZWZvcmUgZ2l2aW5nIGl0IHRvIHRoZQorbWF0Y2hlci4KKworVG8gc3VwcG9ydCB0aGlzIG5lZWQsIEdvb2dsZSBNb2NrIGdpdmVzIHlvdSB0aGUKK2BTYWZlTWF0Y2hlckNhc3Q8VD4obSlgIGZ1bmN0aW9uLiBJdCBjYXN0cyBhIG1hdGNoZXIgYG1gIHRvIHR5cGUKK2BNYXRjaGVyPFQ+YC4gVG8gZW5zdXJlIHNhZmV0eSwgR29vZ2xlIE1vY2sgY2hlY2tzIHRoYXQgKGxldCBgVWAgYmUgdGhlCit0eXBlIGBtYCBhY2NlcHRzKToKKworICAxLiBUeXBlIGBUYCBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIHR5cGUgYFVgOworICAxLiBXaGVuIGJvdGggYFRgIGFuZCBgVWAgYXJlIGJ1aWx0LWluIGFyaXRobWV0aWMgdHlwZXMgKGBib29sYCwgaW50ZWdlcnMsIGFuZCBmbG9hdGluZy1wb2ludCBudW1iZXJzKSwgdGhlIGNvbnZlcnNpb24gZnJvbSBgVGAgdG8gYFVgIGlzIG5vdCBsb3NzeSAoaW4gb3RoZXIgd29yZHMsIGFueSB2YWx1ZSByZXByZXNlbnRhYmxlIGJ5IGBUYCBjYW4gYWxzbyBiZSByZXByZXNlbnRlZCBieSBgVWApOyBhbmQKKyAgMS4gV2hlbiBgVWAgaXMgYSByZWZlcmVuY2UsIGBUYCBtdXN0IGFsc28gYmUgYSByZWZlcmVuY2UgKGFzIHRoZSB1bmRlcmx5aW5nIG1hdGNoZXIgbWF5IGJlIGludGVyZXN0ZWQgaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGBVYCB2YWx1ZSkuCisKK1RoZSBjb2RlIHdvbid0IGNvbXBpbGUgaWYgYW55IG9mIHRoZXNlIGNvbmRpdGlvbnMgaXNuJ3QgbWV0LgorCitIZXJlJ3Mgb25lIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpTYWZlTWF0Y2hlckNhc3Q7CisKKy8vIEEgYmFzZSBjbGFzcyBhbmQgYSBjaGlsZCBjbGFzcy4KK2NsYXNzIEJhc2UgeyAuLi4gfTsKK2NsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7IC4uLiB9OworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoRG9UaGlzLCB2b2lkKERlcml2ZWQqIGRlcml2ZWQpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgLy8gbSBpcyBhIE1hdGNoZXI8QmFzZSo+IHdlIGdvdCBmcm9tIHNvbWV3aGVyZS4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoU2FmZU1hdGNoZXJDYXN0PERlcml2ZWQqPihtKSkpOworYGBgCisKK0lmIHlvdSBmaW5kIGBTYWZlTWF0Y2hlckNhc3Q8VD4obSlgIHRvbyBsaW1pdGluZywgeW91IGNhbiB1c2UgYSBzaW1pbGFyCitmdW5jdGlvbiBgTWF0Y2hlckNhc3Q8VD4obSlgLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IGBNYXRjaGVyQ2FzdGAgd29ya3MKK2FzIGxvbmcgYXMgeW91IGNhbiBgc3RhdGljX2Nhc3RgIHR5cGUgYFRgIHRvIHR5cGUgYFVgLgorCitgTWF0Y2hlckNhc3RgIGVzc2VudGlhbGx5IGxldHMgeW91IGJ5cGFzcyBDKysncyB0eXBlIHN5c3RlbQorKGBzdGF0aWNfY2FzdGAgaXNuJ3QgYWx3YXlzIHNhZmUgYXMgaXQgY291bGQgdGhyb3cgYXdheSBpbmZvcm1hdGlvbiwKK2ZvciBleGFtcGxlKSwgc28gYmUgY2FyZWZ1bCBub3QgdG8gbWlzdXNlL2FidXNlIGl0LgorCisjIyBTZWxlY3RpbmcgQmV0d2VlbiBPdmVybG9hZGVkIEZ1bmN0aW9ucyAjIworCitJZiB5b3UgZXhwZWN0IGFuIG92ZXJsb2FkZWQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLCB0aGUgY29tcGlsZXIgbWF5CituZWVkIHNvbWUgaGVscCBvbiB3aGljaCBvdmVybG9hZGVkIHZlcnNpb24gaXQgaXMuCisKK1RvIGRpc2FtYmlndWF0ZSBmdW5jdGlvbnMgb3ZlcmxvYWRlZCBvbiB0aGUgY29uc3QtbmVzcyBvZiB0aGlzIG9iamVjdCwKK3VzZSB0aGUgYENvbnN0KClgIGFyZ3VtZW50IHdyYXBwZXIuCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgLi4uCisgIE1PQ0tfTUVUSE9EMChHZXRCYXIsIEJhciYoKSk7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRCYXIsIGNvbnN0IEJhciYoKSk7Cit9OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEJhciBiYXIxLCBiYXIyOworICBFWFBFQ1RfQ0FMTChmb28sIEdldEJhcigpKSAgICAgICAgIC8vIFRoZSBub24tY29uc3QgR2V0QmFyKCkuCisgICAgICAuV2lsbE9uY2UoUmV0dXJuUmVmKGJhcjEpKTsKKyAgRVhQRUNUX0NBTEwoQ29uc3QoZm9vKSwgR2V0QmFyKCkpICAvLyBUaGUgY29uc3QgR2V0QmFyKCkuCisgICAgICAuV2lsbE9uY2UoUmV0dXJuUmVmKGJhcjIpKTsKK2BgYAorCisoYENvbnN0KClgIGlzIGRlZmluZWQgYnkgR29vZ2xlIE1vY2sgYW5kIHJldHVybnMgYSBgY29uc3RgIHJlZmVyZW5jZQordG8gaXRzIGFyZ3VtZW50LikKKworVG8gZGlzYW1iaWd1YXRlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cworYnV0IGRpZmZlcmVudCBhcmd1bWVudCB0eXBlcywgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgdGhlIGV4YWN0IHR5cGUKK29mIGEgbWF0Y2hlciwgZWl0aGVyIGJ5IHdyYXBwaW5nIHlvdXIgbWF0Y2hlciBpbiBgTWF0Y2hlcjx0eXBlPigpYCwgb3IKK3VzaW5nIGEgbWF0Y2hlciB3aG9zZSB0eXBlIGlzIGZpeGVkIChgVHlwZWRFcTx0eXBlPmAsIGBBbjx0eXBlPigpYCwKK2V0Yyk6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpBbjsKK3VzaW5nIDo6dGVzdGluZzo6THQ7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6OlR5cGVkRXE7CisKK2NsYXNzIE1vY2tQcmludGVyIDogcHVibGljIFByaW50ZXIgeworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QxKFByaW50LCB2b2lkKGludCBuKSk7CisgIE1PQ0tfTUVUSE9EMShQcmludCwgdm9pZChjaGFyIGMpKTsKK307CisKK1RFU1QoUHJpbnRlclRlc3QsIFByaW50KSB7CisgIE1vY2tQcmludGVyIHByaW50ZXI7CisKKyAgRVhQRUNUX0NBTEwocHJpbnRlciwgUHJpbnQoQW48aW50PigpKSk7ICAgICAgICAgICAgLy8gdm9pZCBQcmludChpbnQpOworICBFWFBFQ1RfQ0FMTChwcmludGVyLCBQcmludChNYXRjaGVyPGludD4oTHQoNSkpKSk7ICAvLyB2b2lkIFByaW50KGludCk7CisgIEVYUEVDVF9DQUxMKHByaW50ZXIsIFByaW50KFR5cGVkRXE8Y2hhcj4oJ2EnKSkpOyAgIC8vIHZvaWQgUHJpbnQoY2hhcik7CisKKyAgcHJpbnRlci5QcmludCgzKTsKKyAgcHJpbnRlci5QcmludCg2KTsKKyAgcHJpbnRlci5QcmludCgnYScpOworfQorYGBgCisKKyMjIFBlcmZvcm1pbmcgRGlmZmVyZW50IEFjdGlvbnMgQmFzZWQgb24gdGhlIEFyZ3VtZW50cyAjIworCitXaGVuIGEgbW9jayBtZXRob2QgaXMgY2FsbGVkLCB0aGUgX2xhc3RfIG1hdGNoaW5nIGV4cGVjdGF0aW9uIHRoYXQncworc3RpbGwgYWN0aXZlIHdpbGwgYmUgc2VsZWN0ZWQgKHRoaW5rICJuZXdlciBvdmVycmlkZXMgb2xkZXIiKS4gU28sIHlvdQorY2FuIG1ha2UgYSBtZXRob2QgZG8gZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24gaXRzIGFyZ3VtZW50IHZhbHVlcworbGlrZSB0aGlzOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6THQ7Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKy4uLgorICAvLyBUaGUgZGVmYXVsdCBjYXNlLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhfKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oJ2InKSk7CisKKyAgLy8gVGhlIG1vcmUgc3BlY2lmaWMgY2FzZS4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoTHQoNSkpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybignYScpKTsKK2BgYAorCitOb3csIGlmIGBmb28uRG9UaGlzKClgIGlzIGNhbGxlZCB3aXRoIGEgdmFsdWUgbGVzcyB0aGFuIDUsIGAnYSdgIHdpbGwKK2JlIHJldHVybmVkOyBvdGhlcndpc2UgYCdiJ2Agd2lsbCBiZSByZXR1cm5lZC4KKworIyMgTWF0Y2hpbmcgTXVsdGlwbGUgQXJndW1lbnRzIGFzIGEgV2hvbGUgIyMKKworU29tZXRpbWVzIGl0J3Mgbm90IGVub3VnaCB0byBtYXRjaCB0aGUgYXJndW1lbnRzIGluZGl2aWR1YWxseS4gRm9yCitleGFtcGxlLCB3ZSBtYXkgd2FudCB0byBzYXkgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBsZXNzIHRoYW4KK3RoZSBzZWNvbmQgYXJndW1lbnQuIFRoZSBgV2l0aCgpYCBjbGF1c2UgYWxsb3dzIHVzIHRvIG1hdGNoCithbGwgYXJndW1lbnRzIG9mIGEgbW9jayBmdW5jdGlvbiBhcyBhIHdob2xlLiBGb3IgZXhhbXBsZSwKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okx0OwordXNpbmcgOjp0ZXN0aW5nOjpOZTsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIEluUmFuZ2UoTmUoMCksIF8pKQorICAgICAgLldpdGgoTHQoKSk7CitgYGAKKworc2F5cyB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBvZiBgSW5SYW5nZSgpYCBtdXN0IG5vdCBiZSAwLCBhbmQgbXVzdCBiZQorbGVzcyB0aGFuIHRoZSBzZWNvbmQgYXJndW1lbnQuCisKK1RoZSBleHByZXNzaW9uIGluc2lkZSBgV2l0aCgpYCBtdXN0IGJlIGEgbWF0Y2hlciBvZiB0eXBlCitgTWF0Y2hlcjx0cjE6OnR1cGxlPEExLCAuLi4sIEFuPiA+YCwgd2hlcmUgYEExYCwgLi4uLCBgQW5gIGFyZSB0aGUKK3R5cGVzIG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuCisKK1lvdSBjYW4gYWxzbyB3cml0ZSBgQWxsQXJncyhtKWAgaW5zdGVhZCBvZiBgbWAgaW5zaWRlIGAuV2l0aCgpYC4gVGhlCit0d28gZm9ybXMgYXJlIGVxdWl2YWxlbnQsIGJ1dCBgLldpdGgoQWxsQXJncyhMdCgpKSlgIGlzIG1vcmUgcmVhZGFibGUKK3RoYW4gYC5XaXRoKEx0KCkpYC4KKworWW91IGNhbiB1c2UgYEFyZ3M8azEsIC4uLiwga24+KG0pYCB0byBtYXRjaCB0aGUgYG5gIHNlbGVjdGVkIGFyZ3VtZW50cworYWdhaW5zdCBgbWAuIEZvciBleGFtcGxlLAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6QWxsT2Y7Cit1c2luZyA6OnRlc3Rpbmc6OkFyZ3M7Cit1c2luZyA6OnRlc3Rpbmc6Okx0OworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQmxhaChfLCBfLCBfKSkKKyAgICAgIC5XaXRoKEFsbE9mKEFyZ3M8MCwgMT4oTHQoKSksIEFyZ3M8MSwgMj4oTHQoKSkpKTsKK2BgYAorCitzYXlzIHRoYXQgYEJsYWgoKWAgd2lsbCBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgYHhgLCBgeWAsIGFuZCBgemAgd2hlcmUKK2B4IDwgeSA8IHpgLgorCitBcyBhIGNvbnZlbmllbmNlIGFuZCBleGFtcGxlLCBHb29nbGUgTW9jayBwcm92aWRlcyBzb21lIG1hdGNoZXJzIGZvcgorMi10dXBsZXMsIGluY2x1ZGluZyB0aGUgYEx0KClgIG1hdGNoZXIgYWJvdmUuIFNlZSB0aGUgW0NoZWF0U2hlZXRdKFYxXzVfQ2hlYXRTaGVldC5tZCkgZm9yCit0aGUgY29tcGxldGUgbGlzdC4KKworIyMgVXNpbmcgTWF0Y2hlcnMgYXMgUHJlZGljYXRlcyAjIworCitIYXZlIHlvdSBub3RpY2VkIHRoYXQgYSBtYXRjaGVyIGlzIGp1c3QgYSBmYW5jeSBwcmVkaWNhdGUgdGhhdCBhbHNvCitrbm93cyBob3cgdG8gZGVzY3JpYmUgaXRzZWxmPyBNYW55IGV4aXN0aW5nIGFsZ29yaXRobXMgdGFrZSBwcmVkaWNhdGVzCithcyBhcmd1bWVudHMgKGUuZy4gdGhvc2UgZGVmaW5lZCBpbiBTVEwncyBgPGFsZ29yaXRobT5gIGhlYWRlciksIGFuZAoraXQgd291bGQgYmUgYSBzaGFtZSBpZiBHb29nbGUgTW9jayBtYXRjaGVycyBhcmUgbm90IGFsbG93ZWQgdG8KK3BhcnRpY2lwYXRlLgorCitMdWNraWx5LCB5b3UgY2FuIHVzZSBhIG1hdGNoZXIgd2hlcmUgYSB1bmFyeSBwcmVkaWNhdGUgZnVuY3RvciBpcworZXhwZWN0ZWQgYnkgd3JhcHBpbmcgaXQgaW5zaWRlIHRoZSBgTWF0Y2hlcygpYCBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsCisKK2BgYAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3N0ZDo6dmVjdG9yPGludD4gdjsKKy4uLgorLy8gSG93IG1hbnkgZWxlbWVudHMgaW4gdiBhcmUgPj0gMTA/Citjb25zdCBpbnQgY291bnQgPSBjb3VudF9pZih2LmJlZ2luKCksIHYuZW5kKCksIE1hdGNoZXMoR2UoMTApKSk7CitgYGAKKworU2luY2UgeW91IGNhbiBidWlsZCBjb21wbGV4IG1hdGNoZXJzIGZyb20gc2ltcGxlciBvbmVzIGVhc2lseSB1c2luZworR29vZ2xlIE1vY2ssIHRoaXMgZ2l2ZXMgeW91IGEgd2F5IHRvIGNvbnZlbmllbnRseSBjb25zdHJ1Y3QgY29tcG9zaXRlCitwcmVkaWNhdGVzIChkb2luZyB0aGUgc2FtZSB1c2luZyBTVEwncyBgPGZ1bmN0aW9uYWw+YCBoZWFkZXIgaXMganVzdAorcGFpbmZ1bCkuIEZvciBleGFtcGxlLCBoZXJlJ3MgYSBwcmVkaWNhdGUgdGhhdCdzIHNhdGlzZmllZCBieSBhbnkKK251bWJlciB0aGF0IGlzID49IDAsIDw9IDEwMCwgYW5kICE9IDUwOgorCitgYGAKK01hdGNoZXMoQWxsT2YoR2UoMCksIExlKDEwMCksIE5lKDUwKSkpCitgYGAKKworIyMgVXNpbmcgTWF0Y2hlcnMgaW4gR29vZ2xlIFRlc3QgQXNzZXJ0aW9ucyAjIworCitTaW5jZSBtYXRjaGVycyBhcmUgYmFzaWNhbGx5IHByZWRpY2F0ZXMgdGhhdCBhbHNvIGtub3cgaG93IHRvIGRlc2NyaWJlCit0aGVtc2VsdmVzLCB0aGVyZSBpcyBhIHdheSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGVtIGluCitbR29vZ2xlIFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LykgYXNzZXJ0aW9ucy4gSXQncworY2FsbGVkIGBBU1NFUlRfVEhBVGAgYW5kIGBFWFBFQ1RfVEhBVGA6CisKK2BgYAorICBBU1NFUlRfVEhBVCh2YWx1ZSwgbWF0Y2hlcik7ICAvLyBBc3NlcnRzIHRoYXQgdmFsdWUgbWF0Y2hlcyBtYXRjaGVyLgorICBFWFBFQ1RfVEhBVCh2YWx1ZSwgbWF0Y2hlcik7ICAvLyBUaGUgbm9uLWZhdGFsIHZlcnNpb24uCitgYGAKKworRm9yIGV4YW1wbGUsIGluIGEgR29vZ2xlIFRlc3QgdGVzdCB5b3UgY2FuIHdyaXRlOgorCitgYGAKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorCit1c2luZyA6OnRlc3Rpbmc6OkFsbE9mOwordXNpbmcgOjp0ZXN0aW5nOjpHZTsKK3VzaW5nIDo6dGVzdGluZzo6TGU7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXNSZWdleDsKK3VzaW5nIDo6dGVzdGluZzo6U3RhcnRzV2l0aDsKKy4uLgorCisgIEVYUEVDVF9USEFUKEZvbygpLCBTdGFydHNXaXRoKCJIZWxsbyIpKTsKKyAgRVhQRUNUX1RIQVQoQmFyKCksIE1hdGNoZXNSZWdleCgiTGluZSBcXGQrIikpOworICBBU1NFUlRfVEhBVChCYXooKSwgQWxsT2YoR2UoNSksIExlKDEwKSkpOworYGBgCisKK3doaWNoIChhcyB5b3UgY2FuIHByb2JhYmx5IGd1ZXNzKSBleGVjdXRlcyBgRm9vKClgLCBgQmFyKClgLCBhbmQKK2BCYXooKWAsIGFuZCB2ZXJpZmllcyB0aGF0OgorCisgICogYEZvbygpYCByZXR1cm5zIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggYCJIZWxsbyJgLgorICAqIGBCYXIoKWAgcmV0dXJucyBhIHN0cmluZyB0aGF0IG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9uIGAiTGluZSBcXGQrImAuCisgICogYEJheigpYCByZXR1cm5zIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbNSwgMTBdLgorCitUaGUgbmljZSB0aGluZyBhYm91dCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBfdGhleSByZWFkIGxpa2UKK0VuZ2xpc2hfLiBUaGV5IGdlbmVyYXRlIGluZm9ybWF0aXZlIG1lc3NhZ2VzIHRvby4gRm9yIGV4YW1wbGUsIGlmIHRoZQorZmlyc3QgYEVYUEVDVF9USEFUKClgIGFib3ZlIGZhaWxzLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHNvbWV0aGluZyBsaWtlOgorCitgYGAKK1ZhbHVlIG9mOiBGb28oKQorICBBY3R1YWw6ICJIaSwgd29ybGQhIgorRXhwZWN0ZWQ6IHN0YXJ0cyB3aXRoICJIZWxsbyIKK2BgYAorCisqKkNyZWRpdDoqKiBUaGUgaWRlYSBvZiBgKEFTU0VSVHxFWFBFQ1QpX1RIQVRgIHdhcyBzdG9sZW4gZnJvbSB0aGUKK1tIYW1jcmVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2hhbWNyZXN0LykgcHJvamVjdCwgd2hpY2ggYWRkcworYGFzc2VydFRoYXQoKWAgdG8gSlVuaXQuCisKKyMjIFVzaW5nIFByZWRpY2F0ZXMgYXMgTWF0Y2hlcnMgIyMKKworR29vZ2xlIE1vY2sgcHJvdmlkZXMgYSBidWlsdC1pbiBzZXQgb2YgbWF0Y2hlcnMuIEluIGNhc2UgeW91IGZpbmQgdGhlbQorbGFja2luZywgeW91IGNhbiB1c2UgYW4gYXJiaXRyYXkgdW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIGZ1bmN0b3IKK2FzIGEgbWF0Y2hlciAtIGFzIGxvbmcgYXMgdGhlIHByZWRpY2F0ZSBhY2NlcHRzIGEgdmFsdWUgb2YgdGhlIHR5cGUKK3lvdSB3YW50LiBZb3UgZG8gdGhpcyBieSB3cmFwcGluZyB0aGUgcHJlZGljYXRlIGluc2lkZSB0aGUgYFRydWx5KClgCitmdW5jdGlvbiwgZm9yIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpUcnVseTsKKworaW50IElzRXZlbihpbnQgbikgeyByZXR1cm4gKG4gJSAyKSA9PSAwID8gMSA6IDA7IH0KKy4uLgorCisgIC8vIEJhcigpIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gZXZlbiBudW1iZXIuCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKFRydWx5KElzRXZlbikpKTsKK2BgYAorCitOb3RlIHRoYXQgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiAvIGZ1bmN0b3IgZG9lc24ndCBoYXZlIHRvIHJldHVybgorYGJvb2xgLiBJdCB3b3JrcyBhcyBsb25nIGFzIHRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlCitjb25kaXRpb24gaW4gc3RhdGVtZW50IGBpZiAoY29uZGl0aW9uKSAuLi5gLgorCisjIyBNYXRjaGluZyBBcmd1bWVudHMgdGhhdCBBcmUgTm90IENvcHlhYmxlICMjCisKK1doZW4geW91IGRvIGFuIGBFWFBFQ1RfQ0FMTChtb2NrX29iaiwgRm9vKGJhcikpYCwgR29vZ2xlIE1vY2sgc2F2ZXMKK2F3YXkgYSBjb3B5IG9mIGBiYXJgLiBXaGVuIGBGb28oKWAgaXMgY2FsbGVkIGxhdGVyLCBHb29nbGUgTW9jaworY29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIGBGb28oKWAgd2l0aCB0aGUgc2F2ZWQgY29weSBvZiBgYmFyYC4gVGhpcword2F5LCB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBgYmFyYCBiZWluZyBtb2RpZmllZCBvciBkZXN0cm95ZWQKK2FmdGVyIHRoZSBgRVhQRUNUX0NBTEwoKWAgaXMgZXhlY3V0ZWQuIFRoZSBzYW1lIGlzIHRydWUgd2hlbiB5b3UgdXNlCittYXRjaGVycyBsaWtlIGBFcShiYXIpYCwgYExlKGJhcilgLCBhbmQgc28gb24uCisKK0J1dCB3aGF0IGlmIGBiYXJgIGNhbm5vdCBiZSBjb3BpZWQgKGkuZS4gaGFzIG5vIGNvcHkgY29uc3RydWN0b3IpPyBZb3UKK2NvdWxkIGRlZmluZSB5b3VyIG93biBtYXRjaGVyIGZ1bmN0aW9uIGFuZCB1c2UgaXQgd2l0aCBgVHJ1bHkoKWAsIGFzCit0aGUgcHJldmlvdXMgY291cGxlIG9mIHJlY2lwZXMgaGF2ZSBzaG93bi4gT3IsIHlvdSBtYXkgYmUgYWJsZSB0byBnZXQKK2F3YXkgZnJvbSBpdCBpZiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IGBiYXJgIHdvbid0IGJlIGNoYW5nZWQgYWZ0ZXIKK3RoZSBgRVhQRUNUX0NBTEwoKWAgaXMgZXhlY3V0ZWQuIEp1c3QgdGVsbCBHb29nbGUgTW9jayB0aGF0IGl0IHNob3VsZAorc2F2ZSBhIHJlZmVyZW5jZSB0byBgYmFyYCwgaW5zdGVhZCBvZiBhIGNvcHkgb2YgaXQuIEhlcmUncyBob3c6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpFcTsKK3VzaW5nIDo6dGVzdGluZzo6QnlSZWY7Cit1c2luZyA6OnRlc3Rpbmc6Okx0OworLi4uCisgIC8vIEV4cGVjdHMgdGhhdCBGb28oKSdzIGFyZ3VtZW50ID09IGJhci4KKyAgRVhQRUNUX0NBTEwobW9ja19vYmosIEZvbyhFcShCeVJlZihiYXIpKSkpOworCisgIC8vIEV4cGVjdHMgdGhhdCBGb28oKSdzIGFyZ3VtZW50IDwgYmFyLgorICBFWFBFQ1RfQ0FMTChtb2NrX29iaiwgRm9vKEx0KEJ5UmVmKGJhcikpKSk7CitgYGAKKworUmVtZW1iZXI6IGlmIHlvdSBkbyB0aGlzLCBkb24ndCBjaGFuZ2UgYGJhcmAgYWZ0ZXIgdGhlCitgRVhQRUNUX0NBTEwoKWAsIG9yIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorCisjIyBWYWxpZGF0aW5nIGEgTWVtYmVyIG9mIGFuIE9iamVjdCAjIworCitPZnRlbiBhIG1vY2sgZnVuY3Rpb24gdGFrZXMgYSByZWZlcmVuY2UgdG8gb2JqZWN0IGFzIGFuIGFyZ3VtZW50LiBXaGVuCittYXRjaGluZyB0aGUgYXJndW1lbnQsIHlvdSBtYXkgbm90IHdhbnQgdG8gY29tcGFyZSB0aGUgZW50aXJlIG9iamVjdAorYWdhaW5zdCBhIGZpeGVkIG9iamVjdCwgYXMgdGhhdCBtYXkgYmUgb3Zlci1zcGVjaWZpY2F0aW9uLiBJbnN0ZWFkLAoreW91IG1heSBuZWVkIHRvIHZhbGlkYXRlIGEgY2VydGFpbiBtZW1iZXIgdmFyaWFibGUgb3IgdGhlIHJlc3VsdCBvZiBhCitjZXJ0YWluIGdldHRlciBtZXRob2Qgb2YgdGhlIG9iamVjdC4gWW91IGNhbiBkbyB0aGlzIHdpdGggYEZpZWxkKClgCithbmQgYFByb3BlcnR5KClgLiBNb3JlIHNwZWNpZmljYWxseSwKKworYGBgCitGaWVsZCgmRm9vOjpiYXIsIG0pCitgYGAKKworaXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGBGb29gIG9iamVjdCB3aG9zZSBgYmFyYCBtZW1iZXIgdmFyaWFibGUKK3NhdGlzZmllcyBtYXRjaGVyIGBtYC4KKworYGBgCitQcm9wZXJ0eSgmRm9vOjpiYXosIG0pCitgYGAKKworaXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGBGb29gIG9iamVjdCB3aG9zZSBgYmF6KClgIG1ldGhvZCByZXR1cm5zCithIHZhbHVlIHRoYXQgc2F0aXNmaWVzIG1hdGNoZXIgYG1gLgorCitGb3IgZXhhbXBsZToKKworPiB8IGBGaWVsZCgmRm9vOjpudW1iZXIsIEdlKDMpKWAgfCBNYXRjaGVzIGB4YCB3aGVyZSBgeC5udW1iZXIgPj0gM2AuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorPiB8IGBQcm9wZXJ0eSgmRm9vOjpuYW1lLCBTdGFydHNXaXRoKCJKb2huICIpKWAgfCBNYXRjaGVzIGB4YCB3aGVyZSBgeC5uYW1lKClgIHN0YXJ0cyB3aXRoIGAiSm9obiAiYC4gfAorCitOb3RlIHRoYXQgaW4gYFByb3BlcnR5KCZGb286OmJheiwgLi4uKWAsIG1ldGhvZCBgYmF6KClgIG11c3QgdGFrZSBubworYXJndW1lbnQgYW5kIGJlIGRlY2xhcmVkIGFzIGBjb25zdGAuCisKK0JUVywgYEZpZWxkKClgIGFuZCBgUHJvcGVydHkoKWAgY2FuIGFsc28gbWF0Y2ggcGxhaW4gcG9pbnRlcnMgdG8KK29iamVjdHMuIEZvciBpbnN0YW5jZSwKKworYGBgCitGaWVsZCgmRm9vOjpudW1iZXIsIEdlKDMpKQorYGBgCisKK21hdGNoZXMgYSBwbGFpbiBwb2ludGVyIGBwYCB3aGVyZSBgcC0+bnVtYmVyID49IDNgLiBJZiBgcGAgaXMgYE5VTExgLAordGhlIG1hdGNoIHdpbGwgYWx3YXlzIGZhaWwgcmVnYXJkbGVzcyBvZiB0aGUgaW5uZXIgbWF0Y2hlci4KKworV2hhdCBpZiB5b3Ugd2FudCB0byB2YWxpZGF0ZSBtb3JlIHRoYW4gb25lIG1lbWJlcnMgYXQgdGhlIHNhbWUgdGltZT8KK1JlbWVtYmVyIHRoYXQgdGhlcmUgaXMgYEFsbE9mKClgLgorCisjIyBWYWxpZGF0aW5nIHRoZSBWYWx1ZSBQb2ludGVkIHRvIGJ5IGEgUG9pbnRlciBBcmd1bWVudCAjIworCitDKysgZnVuY3Rpb25zIG9mdGVuIHRha2UgcG9pbnRlcnMgYXMgYXJndW1lbnRzLiBZb3UgY2FuIHVzZSBtYXRjaGVycworbGlrZSBgTlVMTGAsIGBOb3ROdWxsKClgLCBhbmQgb3RoZXIgY29tcGFyaXNvbiBtYXRjaGVycyB0byBtYXRjaCBhCitwb2ludGVyLCBidXQgd2hhdCBpZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIHZhbHVlIF9wb2ludGVkIHRvXyBieQordGhlIHBvaW50ZXIsIGluc3RlYWQgb2YgdGhlIHBvaW50ZXIgaXRzZWxmLCBoYXMgYSBjZXJ0YWluIHByb3BlcnR5PworV2VsbCwgeW91IGNhbiB1c2UgdGhlIGBQb2ludGVlKG0pYCBtYXRjaGVyLgorCitgUG9pbnRlZShtKWAgbWF0Y2hlcyBhIHBvaW50ZXIgaWZmIGBtYCBtYXRjaGVzIHRoZSB2YWx1ZSB0aGUgcG9pbnRlcgorcG9pbnRzIHRvLiBGb3IgZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkdlOwordXNpbmcgOjp0ZXN0aW5nOjpQb2ludGVlOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKFBvaW50ZWUoR2UoMykpKSk7CitgYGAKKworZXhwZWN0cyBgZm9vLkJhcigpYCB0byBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSB2YWx1ZQorZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMuCisKK09uZSBuaWNlIHRoaW5nIGFib3V0IGBQb2ludGVlKClgIGlzIHRoYXQgaXQgdHJlYXRzIGEgYE5VTExgIHBvaW50ZXIgYXMKK2EgbWF0Y2ggZmFpbHVyZSwgc28geW91IGNhbiB3cml0ZSBgUG9pbnRlZShtKWAgaW5zdGVhZCBvZgorCitgYGAKKyAgQWxsT2YoTm90TnVsbCgpLCBQb2ludGVlKG0pKQorYGBgCisKK3dpdGhvdXQgd29ycnlpbmcgdGhhdCBhIGBOVUxMYCBwb2ludGVyIHdpbGwgY3Jhc2ggeW91ciB0ZXN0LgorCitBbHNvLCBkaWQgd2UgdGVsbCB5b3UgdGhhdCBgUG9pbnRlZSgpYCB3b3JrcyB3aXRoIGJvdGggcmF3IHBvaW50ZXJzCisqKmFuZCoqIHNtYXJ0IHBvaW50ZXJzIChgbGlua2VkX3B0cmAsIGBzaGFyZWRfcHRyYCwgYHNjb3BlZF9wdHJgLCBhbmQKK2V0Yyk/CisKK1doYXQgaWYgeW91IGhhdmUgYSBwb2ludGVyIHRvIHBvaW50ZXI/IFlvdSBndWVzc2VkIGl0IC0geW91IGNhbiB1c2UKK25lc3RlZCBgUG9pbnRlZSgpYCB0byBwcm9iZSBkZWVwZXIgaW5zaWRlIHRoZSB2YWx1ZS4gRm9yIGV4YW1wbGUsCitgUG9pbnRlZShQb2ludGVlKEx0KDMpKSlgIG1hdGNoZXMgYSBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgcG9pbnRlcgordGhhdCBwb2ludHMgdG8gYSBudW1iZXIgbGVzcyB0aGFuIDMgKHdoYXQgYSBtb3V0aGZ1bC4uLikuCisKKyMjIFRlc3RpbmcgYSBDZXJ0YWluIFByb3BlcnR5IG9mIGFuIE9iamVjdCAjIworCitTb21ldGltZXMgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGF0IGFuIG9iamVjdCBhcmd1bWVudCBoYXMgYSBjZXJ0YWluCitwcm9wZXJ0eSwgYnV0IHRoZXJlIGlzIG5vIGV4aXN0aW5nIG1hdGNoZXIgdGhhdCBkb2VzIHRoaXMuIElmIHlvdSB3YW50Citnb29kIGVycm9yIG1lc3NhZ2VzLCB5b3Ugc2hvdWxkIGRlZmluZSBhIG1hdGNoZXIuIElmIHlvdSB3YW50IHRvIGRvIGl0CitxdWljayBhbmQgZGlydHksIHlvdSBjb3VsZCBnZXQgYXdheSB3aXRoIHdyaXRpbmcgYW4gb3JkaW5hcnkgZnVuY3Rpb24uCisKK0xldCdzIHNheSB5b3UgaGF2ZSBhIG1vY2sgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBvYmplY3Qgb2YgdHlwZSBgRm9vYCwKK3doaWNoIGhhcyBhbiBgaW50IGJhcigpYCBtZXRob2QgYW5kIGFuIGBpbnQgYmF6KClgIG1ldGhvZCwgYW5kIHlvdQord2FudCB0byBjb25zdHJhaW4gdGhhdCB0aGUgYXJndW1lbnQncyBgYmFyKClgIHZhbHVlIHBsdXMgaXRzIGBiYXooKWAKK3ZhbHVlIGlzIGEgZ2l2ZW4gbnVtYmVyLiBIZXJlJ3MgaG93IHlvdSBjYW4gZGVmaW5lIGEgbWF0Y2hlciB0byBkbyBpdDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisKK2NsYXNzIEJhclBsdXNCYXpFcU1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxjb25zdCBGb28mPiB7CisgcHVibGljOgorICBleHBsaWNpdCBCYXJQbHVzQmF6RXFNYXRjaGVyKGludCBleHBlY3RlZF9zdW0pCisgICAgICA6IGV4cGVjdGVkX3N1bV8oZXhwZWN0ZWRfc3VtKSB7fQorCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgRm9vJiBmb28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gKGZvby5iYXIoKSArIGZvby5iYXooKSkgPT0gZXhwZWN0ZWRfc3VtXzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiYmFyKCkgKyBiYXooKSBlcXVhbHMgIiA8PCBleHBlY3RlZF9zdW1fOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImJhcigpICsgYmF6KCkgZG9lcyBub3QgZXF1YWwgIiA8PCBleHBlY3RlZF9zdW1fOworICB9CisgcHJpdmF0ZToKKyAgY29uc3QgaW50IGV4cGVjdGVkX3N1bV87Cit9OworCitpbmxpbmUgTWF0Y2hlcjxjb25zdCBGb28mPiBCYXJQbHVzQmF6RXEoaW50IGV4cGVjdGVkX3N1bSkgeworICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEJhclBsdXNCYXpFcU1hdGNoZXIoZXhwZWN0ZWRfc3VtKSk7Cit9CisKKy4uLgorCisgIEVYUEVDVF9DQUxMKC4uLiwgRG9UaGlzKEJhclBsdXNCYXpFcSg1KSkpLi4uOworYGBgCisKKyMjIE1hdGNoaW5nIENvbnRhaW5lcnMgIyMKKworU29tZXRpbWVzIGFuIFNUTCBjb250YWluZXIgKGUuZy4gbGlzdCwgdmVjdG9yLCBtYXAsIC4uLikgaXMgcGFzc2VkIHRvCithIG1vY2sgZnVuY3Rpb24gYW5kIHlvdSBtYXkgd2FudCB0byB2YWxpZGF0ZSBpdC4gU2luY2UgbW9zdCBTVEwKK2NvbnRhaW5lcnMgc3VwcG9ydCB0aGUgYD09YCBvcGVyYXRvciwgeW91IGNhbiB3cml0ZQorYEVxKGV4cGVjdGVkX2NvbnRhaW5lcilgIG9yIHNpbXBseSBgZXhwZWN0ZWRfY29udGFpbmVyYCB0byBtYXRjaCBhCitjb250YWluZXIgZXhhY3RseS4KKworU29tZXRpbWVzLCB0aG91Z2gsIHlvdSBtYXkgd2FudCB0byBiZSBtb3JlIGZsZXhpYmxlIChmb3IgZXhhbXBsZSwgdGhlCitmaXJzdCBlbGVtZW50IG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gsIGJ1dCB0aGUgc2Vjb25kIGVsZW1lbnQgY2FuIGJlCithbnkgcG9zaXRpdmUgbnVtYmVyLCBhbmQgc28gb24pLiBBbHNvLCBjb250YWluZXJzIHVzZWQgaW4gdGVzdHMgb2Z0ZW4KK2hhdmUgYSBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMsIGFuZCBoYXZpbmcgdG8gZGVmaW5lIHRoZSBleHBlY3RlZAorY29udGFpbmVyIG91dC1vZi1saW5lIGlzIGEgYml0IG9mIGEgaGFzc2xlLgorCitZb3UgY2FuIHVzZSB0aGUgYEVsZW1lbnRzQXJlKClgIG1hdGNoZXIgaW4gc3VjaCBjYXNlczoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlOwordXNpbmcgOjp0ZXN0aW5nOjpHdDsKKy4uLgorCisgIE1PQ0tfTUVUSE9EMShGb28sIHZvaWQoY29uc3QgdmVjdG9yPGludD4mIG51bWJlcnMpKTsKKy4uLgorCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhFbGVtZW50c0FyZSgxLCBHdCgwKSwgXywgNSkpKTsKK2BgYAorCitUaGUgYWJvdmUgbWF0Y2hlciBzYXlzIHRoYXQgdGhlIGNvbnRhaW5lciBtdXN0IGhhdmUgNCBlbGVtZW50cywgd2hpY2gKK211c3QgYmUgMSwgZ3JlYXRlciB0aGFuIDAsIGFueXRoaW5nLCBhbmQgNSByZXNwZWN0aXZlbHkuCisKK2BFbGVtZW50c0FyZSgpYCBpcyBvdmVybG9hZGVkIHRvIHRha2UgMCB0byAxMCBhcmd1bWVudHMuIElmIG1vcmUgYXJlCituZWVkZWQsIHlvdSBjYW4gcGxhY2UgdGhlbSBpbiBhIEMtc3R5bGUgYXJyYXkgYW5kIHVzZQorYEVsZW1lbnRzQXJlQXJyYXkoKWAgaW5zdGVhZDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXk7CisuLi4KKworICAvLyBFbGVtZW50c0FyZUFycmF5IGFjY2VwdHMgYW4gYXJyYXkgb2YgZWxlbWVudCB2YWx1ZXMuCisgIGNvbnN0IGludCBleHBlY3RlZF92ZWN0b3IxW10gPSB7IDEsIDUsIDIsIDQsIC4uLiB9OworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oRWxlbWVudHNBcmVBcnJheShleHBlY3RlZF92ZWN0b3IxKSkpOworCisgIC8vIE9yLCBhbiBhcnJheSBvZiBlbGVtZW50IG1hdGNoZXJzLgorICBNYXRjaGVyPGludD4gZXhwZWN0ZWRfdmVjdG9yMiA9IHsgMSwgR3QoMiksIF8sIDMsIC4uLiB9OworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oRWxlbWVudHNBcmVBcnJheShleHBlY3RlZF92ZWN0b3IyKSkpOworYGBgCisKK0luIGNhc2UgdGhlIGFycmF5IG5lZWRzIHRvIGJlIGR5bmFtaWNhbGx5IGNyZWF0ZWQgKGFuZCB0aGVyZWZvcmUgdGhlCithcnJheSBzaXplIGNhbm5vdCBiZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIpLCB5b3UgY2FuIGdpdmUKK2BFbGVtZW50c0FyZUFycmF5KClgIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gc3BlY2lmeSB0aGUgYXJyYXkgc2l6ZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXk7CisuLi4KKyAgaW50KiBjb25zdCBleHBlY3RlZF92ZWN0b3IzID0gbmV3IGludFtjb3VudF07CisgIC4uLiBmaWxsIGV4cGVjdGVkX3ZlY3RvcjMgd2l0aCB2YWx1ZXMgLi4uCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkX3ZlY3RvcjMsIGNvdW50KSkpOworYGBgCisKKyoqVGlwczoqKgorCisgICogYEVsZW1lbnRBcmUqKClgIHdvcmtzIHdpdGggX2FueV8gY29udGFpbmVyIHRoYXQgaW1wbGVtZW50cyB0aGUgU1RMIGl0ZXJhdG9yIGNvbmNlcHQgKGkuZS4gaXQgaGFzIGEgYGNvbnN0X2l0ZXJhdG9yYCB0eXBlIGFuZCBzdXBwb3J0cyBgYmVnaW4oKS9lbmQoKWApIGFuZCBzdXBwb3J0cyBgc2l6ZSgpYCwgbm90IGp1c3QgdGhlIG9uZXMgZGVmaW5lZCBpbiBTVEwuIEl0IHdpbGwgZXZlbiB3b3JrIHdpdGggY29udGFpbmVyIHR5cGVzIHlldCB0byBiZSB3cml0dGVuIC0gYXMgbG9uZyBhcyB0aGV5IGZvbGxvd3MgdGhlIGFib3ZlIHBhdHRlcm4uCisgICogWW91IGNhbiB1c2UgbmVzdGVkIGBFbGVtZW50QXJlKigpYCB0byBtYXRjaCBuZXN0ZWQgKG11bHRpLWRpbWVuc2lvbmFsKSBjb250YWluZXJzLgorICAqIElmIHRoZSBjb250YWluZXIgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgaW5zdGVhZCBvZiBieSByZWZlcmVuY2UsIGp1c3Qgd3JpdGUgYFBvaW50ZWUoRWxlbWVudHNBcmUqKC4uLikpYC4KKyAgKiBUaGUgb3JkZXIgb2YgZWxlbWVudHMgX21hdHRlcnNfIGZvciBgRWxlbWVudHNBcmUqKClgLiBUaGVyZWZvcmUgZG9uJ3QgdXNlIGl0IHdpdGggY29udGFpbmVycyB3aG9zZSBlbGVtZW50IG9yZGVyIGlzIHVuZGVmaW5lZCAoZS5nLiBgaGFzaF9tYXBgKS4KKworIyMgU2hhcmluZyBNYXRjaGVycyAjIworCitVbmRlciB0aGUgaG9vZCwgYSBHb29nbGUgTW9jayBtYXRjaGVyIG9iamVjdCBjb25zaXN0cyBvZiBhIHBvaW50ZXIgdG8KK2EgcmVmLWNvdW50ZWQgaW1wbGVtZW50YXRpb24gb2JqZWN0LiBDb3B5aW5nIG1hdGNoZXJzIGlzIGFsbG93ZWQgYW5kCit2ZXJ5IGVmZmljaWVudCwgYXMgb25seSB0aGUgcG9pbnRlciBpcyBjb3BpZWQuIFdoZW4gdGhlIGxhc3QgbWF0Y2hlcgordGhhdCByZWZlcmVuY2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgZGllcywgdGhlIGltcGxlbWVudGF0aW9uCitvYmplY3Qgd2lsbCBiZSBkZWxldGVkLgorCitUaGVyZWZvcmUsIGlmIHlvdSBoYXZlIHNvbWUgY29tcGxleCBtYXRjaGVyIHRoYXQgeW91IHdhbnQgdG8gdXNlIGFnYWluCithbmQgYWdhaW4sIHRoZXJlIGlzIG5vIG5lZWQgdG8gYnVpbGQgaXQgZXZlcnl0aW1lLiBKdXN0IGFzc2lnbiBpdCB0byBhCittYXRjaGVyIHZhcmlhYmxlIGFuZCB1c2UgdGhhdCB2YXJpYWJsZSByZXBlYXRlZGx5ISBGb3IgZXhhbXBsZSwKKworYGBgCisgIE1hdGNoZXI8aW50PiBpbl9yYW5nZSA9IEFsbE9mKEd0KDUpLCBMZSgxMCkpOworICAuLi4gdXNlIGluX3JhbmdlIGFzIGEgbWF0Y2hlciBpbiBtdWx0aXBsZSBFWFBFQ1RfQ0FMTHMgLi4uCitgYGAKKworIyBTZXR0aW5nIEV4cGVjdGF0aW9ucyAjCisKKyMjIElnbm9yaW5nIFVuaW50ZXJlc3RpbmcgQ2FsbHMgIyMKKworSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiBob3cgYSBtb2NrIG1ldGhvZCBpcyBjYWxsZWQsIGp1c3QgZG9uJ3QKK3NheSBhbnl0aGluZyBhYm91dCBpdC4gSW4gdGhpcyBjYXNlLCBpZiB0aGUgbWV0aG9kIGlzIGV2ZXIgY2FsbGVkLAorR29vZ2xlIE1vY2sgd2lsbCBwZXJmb3JtIGl0cyBkZWZhdWx0IGFjdGlvbiB0byBhbGxvdyB0aGUgdGVzdCBwcm9ncmFtCit0byBjb250aW51ZS4gSWYgeW91IGFyZSBub3QgaGFwcHkgd2l0aCB0aGUgZGVmYXVsdCBhY3Rpb24gdGFrZW4gYnkKK0dvb2dsZSBNb2NrLCB5b3UgY2FuIG92ZXJyaWRlIGl0IHVzaW5nIGBEZWZhdWx0VmFsdWU8VD46OlNldCgpYAorKGRlc2NyaWJlZCBsYXRlciBpbiB0aGlzIGRvY3VtZW50KSBvciBgT05fQ0FMTCgpYC4KKworUGxlYXNlIG5vdGUgdGhhdCBvbmNlIHlvdSBleHByZXNzZWQgaW50ZXJlc3QgaW4gYSBwYXJ0aWN1bGFyIG1vY2sKK21ldGhvZCAodmlhIGBFWFBFQ1RfQ0FMTCgpYCksIGFsbCBpbnZvY2F0aW9ucyB0byBpdCBtdXN0IG1hdGNoIHNvbWUKK2V4cGVjdGF0aW9uLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBidXQgdGhlIGFyZ3VtZW50cyBkb24ndCBtYXRjaAorYW55IGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnQsIGl0IHdpbGwgYmUgYW4gZXJyb3IuCisKKyMjIERpc2FsbG93aW5nIFVuZXhwZWN0ZWQgQ2FsbHMgIyMKKworSWYgYSBtb2NrIG1ldGhvZCBzaG91bGRuJ3QgYmUgY2FsbGVkIGF0IGFsbCwgZXhwbGljaXRseSBzYXkgc286CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKF8pKQorICAgICAgLlRpbWVzKDApOworYGBgCisKK0lmIHNvbWUgY2FsbHMgdG8gdGhlIG1ldGhvZCBhcmUgYWxsb3dlZCwgYnV0IHRoZSByZXN0IGFyZSBub3QsIGp1c3QKK2xpc3QgYWxsIHRoZSBleHBlY3RlZCBjYWxsczoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKK3VzaW5nIDo6dGVzdGluZzo6R3Q7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoNSkpOworICBFWFBFQ1RfQ0FMTChmb28sIEJhcihHdCgxMCkpKQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKK2BgYAorCitBIGNhbGwgdG8gYGZvby5CYXIoKWAgdGhhdCBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgYEVYUEVDVF9DQUxMKClgCitzdGF0ZW1lbnRzIHdpbGwgYmUgYW4gZXJyb3IuCisKKyMjIEV4cGVjdGluZyBPcmRlcmVkIENhbGxzICMjCisKK0FsdGhvdWdoIGFuIGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnQgZGVmaW5lZCBlYXJsaWVyIHRha2VzIHByZWNlZGVuY2UKK3doZW4gR29vZ2xlIE1vY2sgdHJpZXMgdG8gbWF0Y2ggYSBmdW5jdGlvbiBjYWxsIHdpdGggYW4gZXhwZWN0YXRpb24sCitieSBkZWZhdWx0IGNhbGxzIGRvbid0IGhhdmUgdG8gaGFwcGVuIGluIHRoZSBvcmRlciBgRVhQRUNUX0NBTEwoKWAKK3N0YXRlbWVudHMgYXJlIHdyaXR0ZW4uIEZvciBleGFtcGxlLCBpZiB0aGUgYXJndW1lbnRzIG1hdGNoIHRoZQorbWF0Y2hlcnMgaW4gdGhlIHRoaXJkIGBFWFBFQ1RfQ0FMTCgpYCwgYnV0IG5vdCB0aG9zZSBpbiB0aGUgZmlyc3QgdHdvLAordGhlbiB0aGUgdGhpcmQgZXhwZWN0YXRpb24gd2lsbCBiZSB1c2VkLgorCitJZiB5b3Ugd291bGQgcmF0aGVyIGhhdmUgYWxsIGNhbGxzIG9jY3VyIGluIHRoZSBvcmRlciBvZiB0aGUKK2V4cGVjdGF0aW9ucywgcHV0IHRoZSBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50cyBpbiBhIGJsb2NrIHdoZXJlIHlvdQorZGVmaW5lIGEgdmFyaWFibGUgb2YgdHlwZSBgSW5TZXF1ZW5jZWA6CisKK2BgYAorICB1c2luZyA6OnRlc3Rpbmc6Ol87CisgIHVzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsKKworICB7CisgICAgSW5TZXF1ZW5jZSBzOworCisgICAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoNSkpOworICAgIEVYUEVDVF9DQUxMKGJhciwgRG9UaGF0KF8pKQorICAgICAgICAuVGltZXMoMik7CisgICAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoNikpOworICB9CitgYGAKKworSW4gdGhpcyBleGFtcGxlLCB3ZSBleHBlY3QgYSBjYWxsIHRvIGBmb28uRG9UaGlzKDUpYCwgZm9sbG93ZWQgYnkgdHdvCitjYWxscyB0byBgYmFyLkRvVGhhdCgpYCB3aGVyZSB0aGUgYXJndW1lbnQgY2FuIGJlIGFueXRoaW5nLCB3aGljaCBhcmUKK2luIHR1cm4gZm9sbG93ZWQgYnkgYSBjYWxsIHRvIGBmb28uRG9UaGlzKDYpYC4gSWYgYSBjYWxsIG9jY3VycmVkCitvdXQtb2Ytb3JkZXIsIEdvb2dsZSBNb2NrIHdpbGwgcmVwb3J0IGFuIGVycm9yLgorCisjIyBFeHBlY3RpbmcgUGFydGlhbGx5IE9yZGVyZWQgQ2FsbHMgIyMKKworU29tZXRpbWVzIHJlcXVpcmluZyBldmVyeXRoaW5nIHRvIG9jY3VyIGluIGEgcHJlZGV0ZXJtaW5lZCBvcmRlciBjYW4KK2xlYWQgdG8gYnJpdHRsZSB0ZXN0cy4gRm9yIGV4YW1wbGUsIHdlIG1heSBjYXJlIGFib3V0IGBBYCBvY2N1cnJpbmcKK2JlZm9yZSBib3RoIGBCYCBhbmQgYENgLCBidXQgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIHJlbGF0aXZlIG9yZGVyCitvZiBgQmAgYW5kIGBDYC4gSW4gdGhpcyBjYXNlLCB0aGUgdGVzdCBzaG91bGQgcmVmbGVjdCBvdXIgcmVhbCBpbnRlbnQsCitpbnN0ZWFkIG9mIGJlaW5nIG92ZXJseSBjb25zdHJhaW5pbmcuCisKK0dvb2dsZSBNb2NrIGFsbG93cyB5b3UgdG8gaW1wb3NlIGFuIGFyYml0cmFyeSBEQUcgKGRpcmVjdGVkIGFjeWNsaWMKK2dyYXBoKSBvbiB0aGUgY2FsbHMuIE9uZSB3YXkgdG8gZXhwcmVzcyB0aGUgREFHIGlzIHRvIHVzZSB0aGUKK1tBZnRlcl0oVjFfNV9DaGVhdFNoZWV0I1RoZV9BZnRlcl9DbGF1c2UubWQpIGNsYXVzZSBvZiBgRVhQRUNUX0NBTExgLgorCitBbm90aGVyIHdheSBpcyB2aWEgdGhlIGBJblNlcXVlbmNlKClgIGNsYXVzZSAobm90IHRoZSBzYW1lIGFzIHRoZQorYEluU2VxdWVuY2VgIGNsYXNzKSwgd2hpY2ggd2UgYm9ycm93ZWQgZnJvbSBqTW9jayAyLiBJdCdzIGxlc3MKK2ZsZXhpYmxlIHRoYW4gYEFmdGVyKClgLCBidXQgbW9yZSBjb252ZW5pZW50IHdoZW4geW91IGhhdmUgbG9uZyBjaGFpbnMKK29mIHNlcXVlbnRpYWwgY2FsbHMsIGFzIGl0IGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8gY29tZSB1cCB3aXRoCitkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSBleHBlY3RhdGlvbnMgaW4gdGhlIGNoYWlucy4gIEhlcmUncyBob3cgaXQKK3dvcmtzOgorCitJZiB3ZSB2aWV3IGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnRzIGFzIG5vZGVzIGluIGEgZ3JhcGgsIGFuZCBhZGQgYW4KK2VkZ2UgZnJvbSBub2RlIEEgdG8gbm9kZSBCIHdoZXJldmVyIEEgbXVzdCBvY2N1ciBiZWZvcmUgQiwgd2UgY2FuIGdldAorYSBEQUcuIFdlIHVzZSB0aGUgdGVybSAic2VxdWVuY2UiIHRvIG1lYW4gYSBkaXJlY3RlZCBwYXRoIGluIHRoaXMKK0RBRy4gTm93LCBpZiB3ZSBkZWNvbXBvc2UgdGhlIERBRyBpbnRvIHNlcXVlbmNlcywgd2UganVzdCBuZWVkIHRvIGtub3cKK3doaWNoIHNlcXVlbmNlcyBlYWNoIGBFWFBFQ1RfQ0FMTCgpYCBiZWxvbmdzIHRvIGluIG9yZGVyIHRvIGJlIGFibGUgdG8KK3JlY29uc3RydWN0IHRoZSBvcmdpbmFsIERBRy4KKworU28sIHRvIHNwZWNpZnkgdGhlIHBhcnRpYWwgb3JkZXIgb24gdGhlIGV4cGVjdGF0aW9ucyB3ZSBuZWVkIHRvIGRvIHR3bwordGhpbmdzOiBmaXJzdCB0byBkZWZpbmUgc29tZSBgU2VxdWVuY2VgIG9iamVjdHMsIGFuZCB0aGVuIGZvciBlYWNoCitgRVhQRUNUX0NBTEwoKWAgc2F5IHdoaWNoIGBTZXF1ZW5jZWAgb2JqZWN0cyBpdCBpcyBwYXJ0CitvZi4gRXhwZWN0YXRpb25zIGluIHRoZSBzYW1lIHNlcXVlbmNlIG11c3Qgb2NjdXIgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCit3cml0dGVuLiBGb3IgZXhhbXBsZSwKKworYGBgCisgIHVzaW5nIDo6dGVzdGluZzo6U2VxdWVuY2U7CisKKyAgU2VxdWVuY2UgczEsIHMyOworCisgIEVYUEVDVF9DQUxMKGZvbywgQSgpKQorICAgICAgLkluU2VxdWVuY2UoczEsIHMyKTsKKyAgRVhQRUNUX0NBTEwoYmFyLCBCKCkpCisgICAgICAuSW5TZXF1ZW5jZShzMSk7CisgIEVYUEVDVF9DQUxMKGJhciwgQygpKQorICAgICAgLkluU2VxdWVuY2UoczIpOworICBFWFBFQ1RfQ0FMTChmb28sIEQoKSkKKyAgICAgIC5JblNlcXVlbmNlKHMyKTsKK2BgYAorCitzcGVjaWZpZXMgdGhlIGZvbGxvd2luZyBEQUcgKHdoZXJlIGBzMWAgaXMgYEEgLT4gQmAsIGFuZCBgczJgIGlzIGBBIC0+CitDIC0+IERgKToKKworYGBgCisgICAgICAgKy0tLT4gQgorICAgICAgIHwKKyAgQSAtLS18CisgICAgICAgfAorICAgICAgICstLS0+IEMgLS0tPiBECitgYGAKKworVGhpcyBtZWFucyB0aGF0IEEgbXVzdCBvY2N1ciBiZWZvcmUgQiBhbmQgQywgYW5kIEMgbXVzdCBvY2N1ciBiZWZvcmUKK0QuIFRoZXJlJ3Mgbm8gcmVzdHJpY3Rpb24gYWJvdXQgdGhlIG9yZGVyIG90aGVyIHRoYW4gdGhlc2UuCisKKyMjIENvbnRyb2xsaW5nIFdoZW4gYW4gRXhwZWN0YXRpb24gUmV0aXJlcyAjIworCitXaGVuIGEgbW9jayBtZXRob2QgaXMgY2FsbGVkLCBHb29nbGUgTW9jayBvbmx5IGNvbnNpZGVyIGV4cGVjdGF0aW9ucwordGhhdCBhcmUgc3RpbGwgYWN0aXZlLiBBbiBleHBlY3RhdGlvbiBpcyBhY3RpdmUgd2hlbiBjcmVhdGVkLCBhbmQKK2JlY29tZXMgaW5hY3RpdmUgKGFrYSBfcmV0aXJlc18pIHdoZW4gYSBjYWxsIHRoYXQgaGFzIHRvIG9jY3VyIGxhdGVyCitoYXMgb2NjdXJyZWQuIEZvciBleGFtcGxlLCBpbgorCitgYGAKKyAgdXNpbmcgOjp0ZXN0aW5nOjpfOworICB1c2luZyA6OnRlc3Rpbmc6OlNlcXVlbmNlOworCisgIFNlcXVlbmNlIHMxLCBzMjsKKworICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCAiRmlsZSB0b28gbGFyZ2UuIikpICAgICAvLyAjMQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKQorICAgICAgLkluU2VxdWVuY2UoczEsIHMyKTsKKyAgRVhQRUNUX0NBTEwobG9nLCBMb2coV0FSTklORywgXywgIkRhdGEgc2V0IGlzIGVtcHR5LiIpKSAgLy8gIzIKKyAgICAgIC5JblNlcXVlbmNlKHMxKTsKKyAgRVhQRUNUX0NBTEwobG9nLCBMb2coV0FSTklORywgXywgIlVzZXIgbm90IGZvdW5kLiIpKSAgICAgLy8gIzMKKyAgICAgIC5JblNlcXVlbmNlKHMyKTsKK2BgYAorCithcyBzb29uIGFzIGVpdGhlciAjMiBvciAjMyBpcyBtYXRjaGVkLCAjMSB3aWxsIHJldGlyZS4gSWYgYSB3YXJuaW5nCitgIkZpbGUgdG9vIGxhcmdlLiJgIGlzIGxvZ2dlZCBhZnRlciB0aGlzLCBpdCB3aWxsIGJlIGFuIGVycm9yLgorCitOb3RlIHRoYXQgYW4gZXhwZWN0YXRpb24gZG9lc24ndCByZXRpcmUgYXV0b21hdGljYWxseSB3aGVuIGl0J3MKK3NhdHVyYXRlZC4gRm9yIGV4YW1wbGUsCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sIF8pKTsgICAgICAgICAgICAgICAgICAvLyAjMQorICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCAiRmlsZSB0b28gbGFyZ2UuIikpOyAgLy8gIzIKK2BgYAorCitzYXlzIHRoYXQgdGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSB3YXJuaW5nIHdpdGggdGhlIG1lc3NhZ2UgYCJGaWxlCit0b28gbGFyZ2UuImAuIElmIHRoZSBzZWNvbmQgd2FybmluZyBjb250YWlucyB0aGlzIG1lc3NhZ2UgdG9vLCAjMiB3aWxsCittYXRjaCBhZ2FpbiBhbmQgcmVzdWx0IGluIGFuIHVwcGVyLWJvdW5kLXZpb2xhdGVkIGVycm9yLgorCitJZiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50LCB5b3UgY2FuIGFzayBhbiBleHBlY3RhdGlvbiB0byByZXRpcmUgYXMKK3Nvb24gYXMgaXQgYmVjb21lcyBzYXR1cmF0ZWQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sIF8pKTsgICAgICAgICAgICAgICAgIC8vICMxCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sICJGaWxlIHRvbyBsYXJnZS4iKSkgIC8vICMyCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworYGBgCisKK0hlcmUgIzIgY2FuIGJlIHVzZWQgb25seSBvbmNlLCBzbyBpZiB5b3UgaGF2ZSB0d28gd2FybmluZ3Mgd2l0aCB0aGUKK21lc3NhZ2UgYCJGaWxlIHRvbyBsYXJnZS4iYCwgdGhlIGZpcnN0IHdpbGwgbWF0Y2ggIzIgYW5kIHRoZSBzZWNvbmQKK3dpbGwgbWF0Y2ggIzEgLSB0aGVyZSB3aWxsIGJlIG5vIGVycm9yLgorCisjIFVzaW5nIEFjdGlvbnMgIworCisjIyBSZXR1cm5pbmcgUmVmZXJlbmNlcyBmcm9tIE1vY2sgTWV0aG9kcyAjIworCitJZiBhIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSBpcyBhIHJlZmVyZW5jZSwgeW91IG5lZWQgdG8gdXNlCitgUmV0dXJuUmVmKClgIGluc3RlYWQgb2YgYFJldHVybigpYCB0byByZXR1cm4gYSByZXN1bHQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMChHZXRCYXIsIEJhciYoKSk7Cit9OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEJhciBiYXI7CisgIEVYUEVDVF9DQUxMKGZvbywgR2V0QmFyKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuUmVmKGJhcikpOworYGBgCisKKyMjIENvbWJpbmluZyBBY3Rpb25zICMjCisKK1dhbnQgdG8gZG8gbW9yZSB0aGFuIG9uZSB0aGluZyB3aGVuIGEgZnVuY3Rpb24gaXMgY2FsbGVkPyBUaGF0J3MKK2ZpbmUuIGBEb0FsbCgpYCBhbGxvdyB5b3UgdG8gZG8gc2VxdWVuY2Ugb2YgYWN0aW9ucyBldmVyeSB0aW1lLiBPbmx5Cit0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYXN0IGFjdGlvbiBpbiB0aGUgc2VxdWVuY2Ugd2lsbCBiZSB1c2VkLgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RG9BbGw7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShCYXIsIGJvb2woaW50IG4pKTsKK307CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfKSkKKyAgICAgIC5XaWxsT25jZShEb0FsbChhY3Rpb25fMSwKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fMiwKKyAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fbikpOworYGBgCisKKyMjIE1vY2tpbmcgU2lkZSBFZmZlY3RzICMjCisKK1NvbWV0aW1lcyBhIG1ldGhvZCBleGhpYml0cyBpdHMgZWZmZWN0IG5vdCB2aWEgcmV0dXJuaW5nIGEgdmFsdWUgYnV0Cit2aWEgc2lkZSBlZmZlY3RzLiBGb3IgZXhhbXBsZSwgaXQgbWF5IGNoYW5nZSBzb21lIGdsb2JhbCBzdGF0ZSBvcgorbW9kaWZ5IGFuIG91dHB1dCBhcmd1bWVudC4gVG8gbW9jayBzaWRlIGVmZmVjdHMsIGluIGdlbmVyYWwgeW91IGNhbgorZGVmaW5lIHlvdXIgb3duIGFjdGlvbiBieSBpbXBsZW1lbnRpbmcgYDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlYC4KKworSWYgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvIGNoYW5nZSBhbiBvdXRwdXQgYXJndW1lbnQsIHRoZSBidWlsdC1pbgorYFNldEFyZ3VtZW50UG9pbnRlZSgpYCBhY3Rpb24gaXMgY29udmVuaWVudDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlNldEFyZ3VtZW50UG9pbnRlZTsKKworY2xhc3MgTW9ja011dGF0b3IgOiBwdWJsaWMgTXV0YXRvciB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoTXV0YXRlLCB2b2lkKGJvb2wgbXV0YXRlLCBpbnQqIHZhbHVlKSk7CisgIC4uLgorfTsKKy4uLgorCisgIE1vY2tNdXRhdG9yIG11dGF0b3I7CisgIEVYUEVDVF9DQUxMKG11dGF0b3IsIE11dGF0ZSh0cnVlLCBfKSkKKyAgICAgIC5XaWxsT25jZShTZXRBcmd1bWVudFBvaW50ZWU8MT4oNSkpOworYGBgCisKK0luIHRoaXMgZXhhbXBsZSwgd2hlbiBgbXV0YXRvci5NdXRhdGUoKWAgaXMgY2FsbGVkLCB3ZSB3aWxsIGFzc2lnbiA1Cit0byB0aGUgYGludGAgdmFyaWFibGUgcG9pbnRlZCB0byBieSBhcmd1bWVudCAjMQorKDAtYmFzZWQpLgorCitgU2V0QXJndW1lbnRQb2ludGVlKClgIGNvbnZlbmllbnRseSBtYWtlcyBhbiBpbnRlcm5hbCBjb3B5IG9mIHRoZQordmFsdWUgeW91IHBhc3MgdG8gaXQsIHJlbW92aW5nIHRoZSBuZWVkIHRvIGtlZXAgdGhlIHZhbHVlIGluIHNjb3BlIGFuZAorYWxpdmUuIFRoZSBpbXBsaWNhdGlvbiBob3dldmVyIGlzIHRoYXQgdGhlIHZhbHVlIG11c3QgaGF2ZSBhIGNvcHkKK2NvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgorCitJZiB0aGUgbW9jayBtZXRob2QgYWxzbyBuZWVkcyB0byByZXR1cm4gYSB2YWx1ZSBhcyB3ZWxsLCB5b3UgY2FuIGNoYWluCitgU2V0QXJndW1lbnRQb2ludGVlKClgIHdpdGggYFJldHVybigpYCB1c2luZyBgRG9BbGwoKWA6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Cit1c2luZyA6OnRlc3Rpbmc6OlNldEFyZ3VtZW50UG9pbnRlZTsKKworY2xhc3MgTW9ja011dGF0b3IgOiBwdWJsaWMgTXV0YXRvciB7CisgcHVibGljOgorICAuLi4KKyAgTU9DS19NRVRIT0QxKE11dGF0ZUludCwgYm9vbChpbnQqIHZhbHVlKSk7Cit9OworLi4uCisKKyAgTW9ja011dGF0b3IgbXV0YXRvcjsKKyAgRVhQRUNUX0NBTEwobXV0YXRvciwgTXV0YXRlSW50KF8pKQorICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPig1KSwKKyAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4odHJ1ZSkpKTsKK2BgYAorCitJZiB0aGUgb3V0cHV0IGFyZ3VtZW50IGlzIGFuIGFycmF5LCB1c2UgdGhlCitgU2V0QXJyYXlBcmd1bWVudDxOPihmaXJzdCwgbGFzdClgIGFjdGlvbiBpbnN0ZWFkLiBJdCBjb3BpZXMgdGhlCitlbGVtZW50cyBpbiBzb3VyY2UgcmFuZ2UgYFtmaXJzdCwgbGFzdClgIHRvIHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5Cit0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok5vdE51bGw7Cit1c2luZyA6OnRlc3Rpbmc6OlNldEFycmF5QXJndW1lbnQ7CisKK2NsYXNzIE1vY2tBcnJheU11dGF0b3IgOiBwdWJsaWMgQXJyYXlNdXRhdG9yIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMihNdXRhdGUsIHZvaWQoaW50KiB2YWx1ZXMsIGludCBudW1fdmFsdWVzKSk7CisgIC4uLgorfTsKKy4uLgorCisgIE1vY2tBcnJheU11dGF0b3IgbXV0YXRvcjsKKyAgaW50IHZhbHVlc1s1XSA9IHsgMSwgMiwgMywgNCwgNSB9OworICBFWFBFQ1RfQ0FMTChtdXRhdG9yLCBNdXRhdGUoTm90TnVsbCgpLCA1KSkKKyAgICAgIC5XaWxsT25jZShTZXRBcnJheUFyZ3VtZW50PDA+KHZhbHVlcywgdmFsdWVzICsgNSkpOworYGBgCisKK1RoaXMgYWxzbyB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhbiBvdXRwdXQgaXRlcmF0b3I6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpTZUFycmF5QXJndW1lbnQ7CisKK2NsYXNzIE1vY2tSb2xvZGV4IDogcHVibGljIFJvbG9kZXggeworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QxKEdldE5hbWVzLCB2b2lkKHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3I8dmVjdG9yPHN0cmluZz4gPikpOworICAuLi4KK307CisuLi4KKworICBNb2NrUm9sb2RleCByb2xvZGV4OworICB2ZWN0b3I8c3RyaW5nPiBuYW1lczsKKyAgbmFtZXMucHVzaF9iYWNrKCJHZW9yZ2UiKTsKKyAgbmFtZXMucHVzaF9iYWNrKCJKb2huIik7CisgIG5hbWVzLnB1c2hfYmFjaygiVGhvbWFzIik7CisgIEVYUEVDVF9DQUxMKHJvbG9kZXgsIEdldE5hbWVzKF8pKQorICAgICAgLldpbGxPbmNlKFNldEFycmF5QXJndW1lbnQ8MD4obmFtZXMuYmVnaW4oKSwgbmFtZXMuZW5kKCkpKTsKK2BgYAorCisjIyBDaGFuZ2luZyBhIE1vY2sgT2JqZWN0J3MgQmVoYXZpb3IgQmFzZWQgb24gdGhlIFN0YXRlICMjCisKK0lmIHlvdSBleHBlY3QgYSBjYWxsIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgYSBtb2NrIG9iamVjdCwgeW91IGNhbiB1c2UgYDo6dGVzdGluZzo6SW5TZXF1ZW5jZWAgdG8gc3BlY2lmeSBkaWZmZXJlbnQgYmVoYXZpb3JzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNhbGw6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpJblNlcXVlbmNlOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisKKy4uLgorICB7CisgICAgSW5TZXF1ZW5jZSBzZXE7CisgICAgRVhQRUNUX0NBTEwobXlfbW9jaywgSXNEaXJ0eSgpKQorICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKKyAgICBFWFBFQ1RfQ0FMTChteV9tb2NrLCBGbHVzaCgpKTsKKyAgICBFWFBFQ1RfQ0FMTChteV9tb2NrLCBJc0RpcnR5KCkpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZmFsc2UpKTsKKyAgfQorICBteV9tb2NrLkZsdXNoSWZEaXJ0eSgpOworYGBgCisKK1RoaXMgbWFrZXMgYG15X21vY2suSXNEaXJ0eSgpYCByZXR1cm4gYHRydWVgIGJlZm9yZSBgbXlfbW9jay5GbHVzaCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybiBgZmFsc2VgIGFmdGVyd2FyZHMuCisKK0lmIHRoZSBiZWhhdmlvciBjaGFuZ2UgaXMgbW9yZSBjb21wbGV4LCB5b3UgY2FuIHN0b3JlIHRoZSBlZmZlY3RzIGluIGEgdmFyaWFibGUgYW5kIG1ha2UgYSBtb2NrIG1ldGhvZCBnZXQgaXRzIHJldHVybiB2YWx1ZSBmcm9tIHRoYXQgdmFyaWFibGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisKK0FDVElPTl9QKFJldHVyblBvaW50ZWUsIHApIHsgcmV0dXJuICpwOyB9CisuLi4KKyAgaW50IHByZXZpb3VzX3ZhbHVlID0gMDsKKyAgRVhQRUNUX0NBTEwobXlfbW9jaywgR2V0UHJldlZhbHVlKCkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuUG9pbnRlZSgmcHJldmlvdXNfdmFsdWUpKTsKKyAgRVhQRUNUX0NBTEwobXlfbW9jaywgVXBkYXRlVmFsdWUoXykpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoU2F2ZUFyZzwwPigmcHJldmlvdXNfdmFsdWUpKTsKKyAgbXlfbW9jay5Eb1NvbWV0aGluZ1RvVXBkYXRlVmFsdWUoKTsKK2BgYAorCitIZXJlIGBteV9tb2NrLkdldFByZXZWYWx1ZSgpYCB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGFyZ3VtZW50IG9mIHRoZSBsYXN0IGBVcGRhdGVWYWx1ZSgpYCBjYWxsLgorCisjIyBTZXR0aW5nIHRoZSBEZWZhdWx0IFZhbHVlIGZvciBhIFJldHVybiBUeXBlICMjCisKK0lmIGEgbW9jayBtZXRob2QncyByZXR1cm4gdHlwZSBpcyBhIGJ1aWx0LWluIEMrKyB0eXBlIG9yIHBvaW50ZXIsIGJ5CitkZWZhdWx0IGl0IHdpbGwgcmV0dXJuIDAgd2hlbiBpbnZva2VkLiBZb3Ugb25seSBuZWVkIHRvIHNwZWNpZnkgYW4KK2FjdGlvbiBpZiB0aGlzIGRlZmF1bHQgdmFsdWUgZG9lc24ndCB3b3JrIGZvciB5b3UuCisKK1NvbWV0aW1lcywgeW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGRlZmF1bHQgdmFsdWUsIG9yIHlvdSBtYXkgd2FudAordG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGVzIEdvb2dsZSBNb2NrIGRvZXNuJ3Qga25vdworYWJvdXQuIFlvdSBjYW4gZG8gdGhpcyB1c2luZyB0aGUgYDo6dGVzdGluZzo6RGVmYXVsdFZhbHVlYCBjbGFzcwordGVtcGxhdGU6CisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QwKENhbGN1bGF0ZUJhciwgQmFyKCkpOworfTsKKy4uLgorCisgIEJhciBkZWZhdWx0X2JhcjsKKyAgLy8gU2V0cyB0aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgZm9yIHR5cGUgQmFyLgorICBEZWZhdWx0VmFsdWU8QmFyPjo6U2V0KGRlZmF1bHRfYmFyKTsKKworICBNb2NrRm9vIGZvbzsKKworICAvLyBXZSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYW4gYWN0aW9uIGhlcmUsIGFzIHRoZSBkZWZhdWx0CisgIC8vIHJldHVybiB2YWx1ZSB3b3JrcyBmb3IgdXMuCisgIEVYUEVDVF9DQUxMKGZvbywgQ2FsY3VsYXRlQmFyKCkpOworCisgIGZvby5DYWxjdWxhdGVCYXIoKTsgIC8vIFRoaXMgc2hvdWxkIHJldHVybiBkZWZhdWx0X2Jhci4KKworICAvLyBVbnNldHMgdGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlLgorICBEZWZhdWx0VmFsdWU8QmFyPjo6Q2xlYXIoKTsKK2BgYAorCitQbGVhc2Ugbm90ZSB0aGF0IGNoYW5naW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIHR5cGUgY2FuIG1ha2UgeW91Cit0ZXN0cyBoYXJkIHRvIHVuZGVyc3RhbmQuIFdlIHJlY29tbWVuZCB5b3UgdG8gdXNlIHRoaXMgZmVhdHVyZQoranVkaWNpb3VzbHkuIEZvciBleGFtcGxlLCB5b3UgbWF5IHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBgU2V0KClgIGFuZAorYENsZWFyKClgIGNhbGxzIGFyZSByaWdodCBuZXh0IHRvIHRoZSBjb2RlIHRoYXQgdXNlcyB5b3VyIG1vY2suCisKKyMjIFNldHRpbmcgdGhlIERlZmF1bHQgQWN0aW9ucyBmb3IgYSBNb2NrIE1ldGhvZCAjIworCitZb3UndmUgbGVhcm5lZCBob3cgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgZ2l2ZW4KK3R5cGUuIEhvd2V2ZXIsIHRoaXMgbWF5IGJlIHRvbyBjb2Fyc2UgZm9yIHlvdXIgcHVycG9zZTogcGVyaGFwcyB5b3UKK2hhdmUgdHdvIG1vY2sgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIHJldHVybiB0eXBlIGFuZCB5b3Ugd2FudCB0aGVtIHRvCitoYXZlIGRpZmZlcmVudCBiZWhhdmlvcnMuIFRoZSBgT05fQ0FMTCgpYCBtYWNybyBhbGxvd3MgeW91IHRvCitjdXN0b21pemUgeW91ciBtb2NrJ3MgYmVoYXZpb3IgYXQgdGhlIG1ldGhvZCBsZXZlbDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKK3VzaW5nIDo6dGVzdGluZzo6R3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKy4uLgorICBPTl9DQUxMKGZvbywgU2lnbihfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigtMSkpOworICBPTl9DQUxMKGZvbywgU2lnbigwKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigwKSk7CisgIE9OX0NBTEwoZm9vLCBTaWduKEd0KDApKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7CisKKyAgRVhQRUNUX0NBTEwoZm9vLCBTaWduKF8pKQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKKworICBmb28uU2lnbig1KTsgICAvLyBUaGlzIHNob3VsZCByZXR1cm4gMS4KKyAgZm9vLlNpZ24oLTkpOyAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIC0xLgorICBmb28uU2lnbigwKTsgICAvLyBUaGlzIHNob3VsZCByZXR1cm4gMC4KK2BgYAorCitBcyB5b3UgbWF5IGhhdmUgZ3Vlc3NlZCwgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBgT05fQ0FMTCgpYAorc3RhdGVtZW50cywgdGhlIG5ld3Mgb3JkZXIgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIG9sZGVyIG9uZXMuIEluCitvdGhlciB3b3JkcywgdGhlICoqbGFzdCoqIG9uZSB0aGF0IG1hdGNoZXMgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyB3aWxsCitiZSB1c2VkLiBUaGlzIG1hdGNoaW5nIG9yZGVyIGFsbG93cyB5b3UgdG8gc2V0IHVwIHRoZSBjb21tb24gYmVoYXZpb3IKK2luIGEgbW9jayBvYmplY3QncyBjb25zdHJ1Y3RvciBvciB0aGUgdGVzdCBmaXh0dXJlJ3Mgc2V0LXVwIHBoYXNlIGFuZAorc3BlY2lhbGl6ZSB0aGUgbW9jaydzIGJlaGF2aW9yIGxhdGVyLgorCisjIyBVc2luZyBGdW5jdGlvbnMvTWV0aG9kcy9GdW5jdG9ycyBhcyBBY3Rpb25zICMjCisKK0lmIHRoZSBidWlsdC1pbiBhY3Rpb25zIGRvbid0IHN1aXQgeW91LCB5b3UgY2FuIGVhc2lseSB1c2UgYW4gZXhpc3RpbmcKK2Z1bmN0aW9uLCBtZXRob2QsIG9yIGZ1bmN0b3IgYXMgYW4gYWN0aW9uOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoU3VtLCBpbnQoaW50IHgsIGludCB5KSk7CisgIE1PQ0tfTUVUSE9EMShDb21wbGV4Sm9iLCBib29sKGludCB4KSk7Cit9OworCitpbnQgQ2FsY3VsYXRlU3VtKGludCB4LCBpbnQgeSkgeyByZXR1cm4geCArIHk7IH0KKworY2xhc3MgSGVscGVyIHsKKyBwdWJsaWM6CisgIGJvb2wgQ29tcGxleEpvYihpbnQgeCk7Cit9OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEhlbHBlciBoZWxwZXI7CisgIEVYUEVDVF9DQUxMKGZvbywgU3VtKF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShDYWxjdWxhdGVTdW0pKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBDb21wbGV4Sm9iKF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZSgmaGVscGVyLCAmSGVscGVyOjpDb21wbGV4Sm9iKSk7CisKKyAgZm9vLlN1bSg1LCA2KTsgICAgICAgLy8gSW52b2tlcyBDYWxjdWxhdGVTdW0oNSwgNikuCisgIGZvby5Db21wbGV4Sm9iKDEwKTsgIC8vIEludm9rZXMgaGVscGVyLkNvbXBsZXhKb2IoMTApOworYGBgCisKK1RoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLCBldGMgbXVzdCBiZQorX2NvbXBhdGlibGVfIHdpdGggdGhlIHNpZ25hdHVyZSBvZiB0aGUgbW9jayBmdW5jdGlvbiwgbWVhbmluZyB0aGF0IHRoZQorbGF0dGVyJ3MgYXJndW1lbnRzIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0aGUgY29ycmVzcG9uZGluZworYXJndW1lbnRzIG9mIHRoZSBmb3JtZXIsIGFuZCB0aGUgZm9ybWVyJ3MgcmV0dXJuIHR5cGUgY2FuIGJlCitpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0aGF0IG9mIHRoZSBsYXR0ZXIuIFNvLCB5b3UgY2FuIGludm9rZQorc29tZXRoaW5nIHdob3NlIHR5cGUgaXMgX25vdF8gZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgbW9jayBmdW5jdGlvbiwKK2FzIGxvbmcgYXMgaXQncyBzYWZlIHRvIGRvIHNvIC0gbmljZSwgaHVoPworCisjIyBJbnZva2luZyBhIEZ1bmN0aW9uL01ldGhvZC9GdW5jdG9yIFdpdGhvdXQgQXJndW1lbnRzICMjCisKK2BJbnZva2UoKWAgaXMgdmVyeSB1c2VmdWwgZm9yIGRvaW5nIGFjdGlvbnMgdGhhdCBhcmUgbW9yZSBjb21wbGV4LiBJdAorcGFzc2VzIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbiBvciBmdW5jdG9yIGJlaW5nCitpbnZva2VkIHN1Y2ggdGhhdCB0aGUgY2FsbGVlIGhhcyB0aGUgZnVsbCBjb250ZXh0IG9mIHRoZSBjYWxsIHRvIHdvcmsKK3dpdGguIElmIHRoZSBpbnZva2VkIGZ1bmN0aW9uIGlzIG5vdCBpbnRlcmVzdGVkIGluIHNvbWUgb3IgYWxsIG9mIHRoZQorYXJndW1lbnRzLCBpdCBjYW4gc2ltcGx5IGlnbm9yZSB0aGVtLgorCitZZXQsIGEgY29tbW9uIHBhdHRlcm4gaXMgdGhhdCBhIHRlc3QgYXV0aG9yIHdhbnRzIHRvIGludm9rZSBhIGZ1bmN0aW9uCit3aXRob3V0IHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24uIGBJbnZva2UoKWAgYWxsb3dzIGhlciB0bworZG8gdGhhdCB1c2luZyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCB0aHJvd3MgYXdheSB0aGUgYXJndW1lbnRzIGJlZm9yZQoraW52b2tpbmcgYW4gdW5kZXJsaW5pbmcgbnVsbGFyeSBmdW5jdGlvbi4gTmVlZGxlc3MgdG8gc2F5LCB0aGlzIGNhbiBiZQordGVkaW91cyBhbmQgb2JzY3VyZXMgdGhlIGludGVudCBvZiB0aGUgdGVzdC4KKworYEludm9rZVdpdGhvdXRBcmdzKClgIHNvbHZlcyB0aGlzIHByb2JsZW0uIEl0J3MgbGlrZSBgSW52b2tlKClgIGV4Y2VwdAordGhhdCBpdCBkb2Vzbid0IHBhc3MgdGhlIG1vY2sgZnVuY3Rpb24ncyBhcmd1bWVudHMgdG8gdGhlCitjYWxsZWUuIEhlcmUncyBhbiBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlV2l0aG91dEFyZ3M7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShDb21wbGV4Sm9iLCBib29sKGludCBuKSk7Cit9OworCitib29sIEpvYjEoKSB7IC4uLiB9CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBDb21wbGV4Sm9iKF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZVdpdGhvdXRBcmdzKEpvYjEpKTsKKworICBmb28uQ29tcGxleEpvYigxMCk7ICAvLyBJbnZva2VzIEpvYjEoKS4KK2BgYAorCisjIyBJbnZva2luZyBhbiBBcmd1bWVudCBvZiB0aGUgTW9jayBGdW5jdGlvbiAjIworCitTb21ldGltZXMgYSBtb2NrIGZ1bmN0aW9uIHdpbGwgcmVjZWl2ZSBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYSBmdW5jdG9yCisoaW4gb3RoZXIgd29yZHMsIGEgImNhbGxhYmxlIikgYXMgYW4gYXJndW1lbnQsIGUuZy4KKworYGBgCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoRG9UaGlzLCBib29sKGludCBuLCBib29sICgqZnApKGludCkpKTsKK307CitgYGAKKworYW5kIHlvdSBtYXkgd2FudCB0byBpbnZva2UgdGhpcyBjYWxsYWJsZSBhcmd1bWVudDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87CisuLi4KKyAgTW9ja0ZvbyBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKF8sIF8pKQorICAgICAgLldpbGxPbmNlKC4uLik7CisgIC8vIFdpbGwgZXhlY3V0ZSAoKmZwKSg1KSwgd2hlcmUgZnAgaXMgdGhlCisgIC8vIHNlY29uZCBhcmd1bWVudCBEb1RoaXMoKSByZWNlaXZlcy4KK2BgYAorCitBcmdoaCwgeW91IG5lZWQgdG8gcmVmZXIgdG8gYSBtb2NrIGZ1bmN0aW9uIGFyZ3VtZW50IGJ1dCBDKysgaGFzIG5vCitsYW1iZGEgKHlldCksIHNvIHlvdSBoYXZlIHRvIGRlZmluZSB5b3VyIG93biBhY3Rpb24uIDotKCBPciBkbyB5b3UKK3JlYWxseT8KKworV2VsbCwgR29vZ2xlIE1vY2sgaGFzIGFuIGFjdGlvbiB0byBzb2x2ZSBfZXhhY3RseV8gdGhpcyBwcm9ibGVtOgorCitgYGAKKyAgSW52b2tlQXJndW1lbnQ8Tj4oYXJnXzEsIGFyZ18yLCAuLi4sIGFyZ19tKQorYGBgCisKK3dpbGwgaW52b2tlIHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRoZSBtb2NrIGZ1bmN0aW9uIHJlY2VpdmVzLAord2l0aCBgYXJnXzFgLCBgYXJnXzJgLCAuLi4sIGFuZCBgYXJnX21gLiBObyBtYXR0ZXIgaWYgdGhlIGFyZ3VtZW50IGlzCithIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYSBmdW5jdG9yLCBHb29nbGUgTW9jayBoYW5kbGVzIHRoZW0gYm90aC4KKworV2l0aCB0aGF0LCB5b3UgY291bGQgd3JpdGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VBcmd1bWVudDsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2VBcmd1bWVudDwxPig1KSk7CisgIC8vIFdpbGwgZXhlY3V0ZSAoKmZwKSg1KSwgd2hlcmUgZnAgaXMgdGhlCisgIC8vIHNlY29uZCBhcmd1bWVudCBEb1RoaXMoKSByZWNlaXZlcy4KK2BgYAorCitXaGF0IGlmIHRoZSBjYWxsYWJsZSB0YWtlcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2U/IE5vIHByb2JsZW0gLSBqdXN0Cit3cmFwIGl0IGluc2lkZSBgQnlSZWYoKWA6CisKK2BgYAorLi4uCisgIE1PQ0tfTUVUSE9EMShCYXIsIGJvb2woYm9vbCAoKmZwKShpbnQsIGNvbnN0IEhlbHBlciYpKSk7CisuLi4KK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6QnlSZWY7Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZUFyZ3VtZW50OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEhlbHBlciBoZWxwZXI7CisgIC4uLgorICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2VBcmd1bWVudDwwPig1LCBCeVJlZihoZWxwZXIpKSk7CisgIC8vIEJ5UmVmKGhlbHBlcikgZ3VhcmFudGVlcyB0aGF0IGEgcmVmZXJlbmNlIHRvIGhlbHBlciwgbm90IGEgY29weSBvZiBpdCwKKyAgLy8gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxhYmxlLgorYGBgCisKK1doYXQgaWYgdGhlIGNhbGxhYmxlIHRha2VzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSBhbmQgd2UgZG8gKipub3QqKgord3JhcCB0aGUgYXJndW1lbnQgaW4gYEJ5UmVmKClgPyBUaGVuIGBJbnZva2VBcmd1bWVudCgpYCB3aWxsIF9tYWtlIGEKK2NvcHlfIG9mIHRoZSBhcmd1bWVudCwgYW5kIHBhc3MgYSBfcmVmZXJlbmNlIHRvIHRoZSBjb3B5XywgaW5zdGVhZCBvZgorYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLCB0byB0aGUgY2FsbGFibGUuIFRoaXMgaXMgZXNwZWNpYWxseQoraGFuZHkgd2hlbiB0aGUgYXJndW1lbnQgaXMgYSB0ZW1wb3JhcnkgdmFsdWU6CisKK2BgYAorLi4uCisgIE1PQ0tfTUVUSE9EMShEb1RoYXQsIGJvb2woYm9vbCAoKmYpKGNvbnN0IGRvdWJsZSYgeCwgY29uc3Qgc3RyaW5nJiBzKSkpOworLi4uCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZUFyZ3VtZW50OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIC4uLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdChfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2VBcmd1bWVudDwwPig1LjAsIHN0cmluZygiSGkiKSkpOworICAvLyBXaWxsIGV4ZWN1dGUgKCpmKSg1LjAsIHN0cmluZygiSGkiKSksIHdoZXJlIGYgaXMgdGhlIGZ1bmN0aW9uIHBvaW50ZXIKKyAgLy8gRG9UaGF0KCkgcmVjZWl2ZXMuICBOb3RlIHRoYXQgdGhlIHZhbHVlcyA1LjAgYW5kIHN0cmluZygiSGkiKSBhcmUKKyAgLy8gdGVtcG9yYXJ5IGFuZCBkZWFkIG9uY2UgdGhlIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50IGZpbmlzaGVzLiAgWWV0CisgIC8vIGl0J3MgZmluZSB0byBwZXJmb3JtIHRoaXMgYWN0aW9uIGxhdGVyLCBzaW5jZSBhIGNvcHkgb2YgdGhlIHZhbHVlcworICAvLyBhcmUga2VwdCBpbnNpZGUgdGhlIEludm9rZUFyZ3VtZW50IGFjdGlvbi4KK2BgYAorCisjIyBJZ25vcmluZyBhbiBBY3Rpb24ncyBSZXN1bHQgIyMKKworU29tZXRpbWVzIHlvdSBoYXZlIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgX3NvbWV0aGluZ18sIGJ1dCB5b3UgbmVlZCBhbgorYWN0aW9uIHRoYXQgcmV0dXJucyBgdm9pZGAgKHBlcmhhcHMgeW91IHdhbnQgdG8gdXNlIGl0IGluIGEgbW9jaworZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2b2lkYCwgb3IgcGVyaGFwcyBpdCBuZWVkcyB0byBiZSB1c2VkIGluCitgRG9BbGwoKWAgYW5kIGl0J3Mgbm90IHRoZSBsYXN0IGluIHRoZSBsaXN0KS4gYElnbm9yZVJlc3VsdCgpYCBsZXRzCit5b3UgZG8gdGhhdC4gRm9yIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKworaW50IFByb2Nlc3MoY29uc3QgTXlEYXRhJiBkYXRhKTsKK3N0cmluZyBEb1NvbWV0aGluZygpOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoQWJjLCB2b2lkKGNvbnN0IE15RGF0YSYgZGF0YSkpOworICBNT0NLX01FVEhPRDAoWHl6LCBib29sKCkpOworfTsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBFWFBFQ1RfQ0FMTChmb28sIEFiYyhfKSkKKyAgLy8gLldpbGxPbmNlKEludm9rZShQcm9jZXNzKSk7CisgIC8vIFRoZSBhYm92ZSBsaW5lIHdvbid0IGNvbXBpbGUgYXMgUHJvY2VzcygpIHJldHVybnMgaW50IGJ1dCBBYmMoKSBuZWVkcworICAvLyB0byByZXR1cm4gdm9pZC4KKyAgICAgIC5XaWxsT25jZShJZ25vcmVSZXN1bHQoSW52b2tlKFByb2Nlc3MpKSk7CisKKyAgRVhQRUNUX0NBTEwoZm9vLCBYeXooKSkKKyAgICAgIC5XaWxsT25jZShEb0FsbChJZ25vcmVSZXN1bHQoSW52b2tlKERvU29tZXRoaW5nKSksCisgICAgICAvLyBJZ25vcmVzIHRoZSBzdHJpbmcgRG9Tb21ldGhpbmcoKSByZXR1cm5zLgorICAgICAgICAgICAgICAgICAgICAgIFJldHVybih0cnVlKSkpOworYGBgCisKK05vdGUgdGhhdCB5b3UgKipjYW5ub3QqKiB1c2UgYElnbm9yZVJlc3VsdCgpYCBvbiBhbiBhY3Rpb24gdGhhdCBhbHJlYWR5CityZXR1cm5zIGB2b2lkYC4gRG9pbmcgc28gd2lsbCBsZWFkIHRvIHVnbHkgY29tcGlsZXIgZXJyb3JzLgorCisjIyBTZWxlY3RpbmcgYW4gQWN0aW9uJ3MgQXJndW1lbnRzICMjCisKK1NheSB5b3UgaGF2ZSBhIG1vY2sgZnVuY3Rpb24gYEZvbygpYCB0aGF0IHRha2VzIHNldmVuIGFyZ3VtZW50cywgYW5kCit5b3UgaGF2ZSBhIGN1c3RvbSBhY3Rpb24gdGhhdCB5b3Ugd2FudCB0byBpbnZva2Ugd2hlbiBgRm9vKClgIGlzCitjYWxsZWQuIFRyb3VibGUgaXMsIHRoZSBjdXN0b20gYWN0aW9uIG9ubHkgd2FudHMgdGhyZWUgYXJndW1lbnRzOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOworLi4uCisgIE1PQ0tfTUVUSE9ENyhGb28sIGJvb2woYm9vbCB2aXNpYmxlLCBjb25zdCBzdHJpbmcmIG5hbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8cGFpcjxpbnQsIGludD4sIGRvdWJsZT4mIHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWluX3dlaWdodCwgZG91YmxlIG1heF93aWdodCkpOworLi4uCisKK2Jvb2wgSXNWaXNpYmxlSW5RdWFkcmFudDEoYm9vbCB2aXNpYmxlLCBpbnQgeCwgaW50IHkpIHsKKyAgcmV0dXJuIHZpc2libGUgJiYgeCA+PSAwICYmIHkgPj0gMDsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoSXNWaXNpYmxlSW5RdWFkcmFudDEpKTsgIC8vIFVoLCB3b24ndCBjb21waWxlLiA6LSgKK2BgYAorCitUbyBwbGVhc2UgdGhlIGNvbXBpbGVyIEdvZCwgeW91IGNhbiB0byBkZWZpbmUgYW4gImFkYXB0b3IiIHRoYXQgaGFzCit0aGUgc2FtZSBzaWduYXR1cmUgYXMgYEZvbygpYCBhbmQgY2FsbHMgdGhlIGN1c3RvbSBhY3Rpb24gd2l0aCB0aGUKK3JpZ2h0IGFyZ3VtZW50czoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworYm9vbCBNeUlzVmlzaWJsZUluUXVhZHJhbnQxKGJvb2wgdmlzaWJsZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHBhaXI8aW50LCBpbnQ+LCBkb3VibGU+JiB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl93ZWlnaHQsIGRvdWJsZSBtYXhfd2lnaHQpIHsKKyAgcmV0dXJuIElzVmlzaWJsZUluUXVhZHJhbnQxKHZpc2libGUsIHgsIHkpOworfQorLi4uCisKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKF8sIF8sIF8sIF8sIF8sIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShNeUlzVmlzaWJsZUluUXVhZHJhbnQxKSk7ICAvLyBOb3cgaXQgd29ya3MuCitgYGAKKworQnV0IGlzbid0IHRoaXMgYXdrd2FyZD8KKworR29vZ2xlIE1vY2sgcHJvdmlkZXMgYSBnZW5lcmljIF9hY3Rpb24gYWRhcHRvcl8sIHNvIHlvdSBjYW4gc3BlbmQgeW91cgordGltZSBtaW5kaW5nIG1vcmUgaW1wb3J0YW50IGJ1c2luZXNzIHRoYW4gd3JpdGluZyB5b3VyIG93bgorYWRhcHRvcnMuIEhlcmUncyB0aGUgc3ludGF4OgorCitgYGAKKyAgV2l0aEFyZ3M8TjEsIE4yLCAuLi4sIE5rPihhY3Rpb24pCitgYGAKKworY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiBhdAordGhlIGdpdmVuIGluZGljZXMgKDAtYmFzZWQpIHRvIHRoZSBpbm5lciBgYWN0aW9uYCBhbmQgcGVyZm9ybXMKK2l0LiBVc2luZyBgV2l0aEFyZ3NgLCBvdXIgb3JpZ2luYWwgZXhhbXBsZSBjYW4gYmUgd3JpdHRlbiBhczoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKK3VzaW5nIDo6dGVzdGluZzo6V2l0aEFyZ3M7CisuLi4KKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKF8sIF8sIF8sIF8sIF8sIF8sIF8pKQorICAgICAgLldpbGxPbmNlKFdpdGhBcmdzPDAsIDIsIDM+KEludm9rZShJc1Zpc2libGVJblF1YWRyYW50MSkpKTsKKyAgICAgIC8vIE5vIG5lZWQgdG8gZGVmaW5lIHlvdXIgb3duIGFkYXB0b3IuCitgYGAKKworRm9yIGJldHRlciByZWFkYWJpbGl0eSwgR29vZ2xlIE1vY2sgYWxzbyBnaXZlcyB5b3U6CisKKyAgKiBgV2l0aG91dEFyZ3MoYWN0aW9uKWAgd2hlbiB0aGUgaW5uZXIgYGFjdGlvbmAgdGFrZXMgX25vXyBhcmd1bWVudCwgYW5kCisgICogYFdpdGhBcmc8Tj4oYWN0aW9uKWAgKG5vIGBzYCBhZnRlciBgQXJnYCkgd2hlbiB0aGUgaW5uZXIgYGFjdGlvbmAgdGFrZXMgX29uZV8gYXJndW1lbnQuCisKK0FzIHlvdSBtYXkgaGF2ZSByZWFsaXplZCwgYEludm9rZVdpdGhvdXRBcmdzKC4uLilgIGlzIGp1c3Qgc3ludGFjdGljCitzdWdhciBmb3IgYFdpdGhvdXRBcmdzKElub3ZrZSguLi4pKWAuCisKK0hlcmUgYXJlIG1vcmUgdGlwczoKKworICAqIFRoZSBpbm5lciBhY3Rpb24gdXNlZCBpbiBgV2l0aEFyZ3NgIGFuZCBmcmllbmRzIGRvZXMgbm90IGhhdmUgdG8gYmUgYEludm9rZSgpYCAtLSBpdCBjYW4gYmUgYW55dGhpbmcuCisgICogWW91IGNhbiByZXBlYXQgYW4gYXJndW1lbnQgaW4gdGhlIGFyZ3VtZW50IGxpc3QgaWYgbmVjZXNzYXJ5LCBlLmcuIGBXaXRoQXJnczwyLCAzLCAzLCA1PiguLi4pYC4KKyAgKiBZb3UgY2FuIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50cywgZS5nLiBgV2l0aEFyZ3M8MywgMiwgMT4oLi4uKWAuCisgICogVGhlIHR5cGVzIG9mIHRoZSBzZWxlY3RlZCBhcmd1bWVudHMgZG8gX25vdF8gaGF2ZSB0byBtYXRjaCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBpbm5lciBhY3Rpb24gZXhhY3RseS4gSXQgd29ya3MgYXMgbG9uZyBhcyB0aGV5IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudHMgb2YgdGhlIGlubmVyIGFjdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHRoZSA0LXRoIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIGlzIGFuIGBpbnRgIGFuZCBgbXlfYWN0aW9uYCB0YWtlcyBhIGBkb3VibGVgLCBgV2l0aEFyZzw0PihteV9hY3Rpb24pYCB3aWxsIHdvcmsuCisKKyMjIElnbm9yaW5nIEFyZ3VtZW50cyBpbiBBY3Rpb24gRnVuY3Rpb25zICMjCisKK1RoZSBzZWxlY3RpbmctYW4tYWN0aW9uJ3MtYXJndW1lbnRzIHJlY2lwZSBzaG93ZWQgdXMgb25lIHdheSB0byBtYWtlIGEKK21vY2sgZnVuY3Rpb24gYW5kIGFuIGFjdGlvbiB3aXRoIGluY29tcGF0aWJsZSBhcmd1bWVudCBsaXN0cyBmaXQKK3RvZ2V0aGVyLiBUaGUgZG93bnNpZGUgaXMgdGhhdCB3cmFwcGluZyB0aGUgYWN0aW9uIGluCitgV2l0aEFyZ3M8Li4uPigpYCBjYW4gZ2V0IHRlZGlvdXMgZm9yIHBlb3BsZSB3cml0aW5nIHRoZSB0ZXN0cy4KKworSWYgeW91IGFyZSBkZWZpbmluZyBhIGZ1bmN0aW9uLCBtZXRob2QsIG9yIGZ1bmN0b3IgdG8gYmUgdXNlZCB3aXRoCitgSW52b2tlKigpYCwgYW5kIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gc29tZSBvZiBpdHMgYXJndW1lbnRzLCBhbgorYWx0ZXJuYXRpdmUgdG8gYFdpdGhBcmdzYCBpcyB0byBkZWNsYXJlIHRoZSB1bmludGVyZXN0aW5nIGFyZ3VtZW50cyBhcworYFVudXNlZGAuIFRoaXMgbWFrZXMgdGhlIGRlZmluaXRpb24gbGVzcyBjbHV0dGVyZWQgYW5kIGxlc3MgZnJhZ2lsZSBpbgorY2FzZSB0aGUgdHlwZXMgb2YgdGhlIHVuaW50ZXJlc3RpbmcgYXJndW1lbnRzIGNoYW5nZS4gSXQgY291bGQgYWxzbworaW5jcmVhc2UgdGhlIGNoYW5jZSB0aGUgYWN0aW9uIGZ1bmN0aW9uIGNhbiBiZSByZXVzZWQuIEZvciBleGFtcGxlLAorZ2l2ZW4KKworYGBgCisgIE1PQ0tfTUVUSE9EMyhGb28sIGRvdWJsZShjb25zdCBzdHJpbmcmIGxhYmVsLCBkb3VibGUgeCwgZG91YmxlIHkpKTsKKyAgTU9DS19NRVRIT0QzKEJhciwgZG91YmxlKGludCBpbmRleCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7CitgYGAKKworaW5zdGVhZCBvZgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOworCitkb3VibGUgRGlzdGFuY2VUb09yaWdpbldpdGhMYWJlbChjb25zdCBzdHJpbmcmIGxhYmVsLCBkb3VibGUgeCwgZG91YmxlIHkpIHsKKyAgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsKK30KKworZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoSW5kZXgoaW50IGluZGV4LCBkb3VibGUgeCwgZG91YmxlIHkpIHsKKyAgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsKK30KKy4uLgorCisgIEVYRVBDVF9DQUxMKG1vY2ssIEZvbygiYWJjIiwgXywgXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwpKTsKKyAgRVhFUENUX0NBTEwobW9jaywgQmFyKDUsIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luV2l0aEluZGV4KSk7CitgYGAKKworeW91IGNvdWxkIHdyaXRlCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7Cit1c2luZyA6OnRlc3Rpbmc6OlVudXNlZDsKKworZG91YmxlIERpc3RhbmNlVG9PcmlnaW4oVW51c2VkLCBkb3VibGUgeCwgZG91YmxlIHkpIHsKKyAgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsKK30KKy4uLgorCisgIEVYRVBDVF9DQUxMKG1vY2ssIEZvbygiYWJjIiwgXywgXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW4pKTsKKyAgRVhFUENUX0NBTEwobW9jaywgQmFyKDUsIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luKSk7CitgYGAKKworIyMgU2hhcmluZyBBY3Rpb25zICMjCisKK0p1c3QgbGlrZSBtYXRjaGVycywgYSBHb29nbGUgTW9jayBhY3Rpb24gb2JqZWN0IGNvbnNpc3RzIG9mIGEgcG9pbnRlcgordG8gYSByZWYtY291bnRlZCBpbXBsZW1lbnRhdGlvbiBvYmplY3QuIFRoZXJlZm9yZSBjb3B5aW5nIGFjdGlvbnMgaXMKK2Fsc28gYWxsb3dlZCBhbmQgdmVyeSBlZmZpY2llbnQuIFdoZW4gdGhlIGxhc3QgYWN0aW9uIHRoYXQgcmVmZXJlbmNlcwordGhlIGltcGxlbWVudGF0aW9uIG9iamVjdCBkaWVzLCB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0IHdpbGwgYmUKK2RlbGV0ZWQuCisKK0lmIHlvdSBoYXZlIHNvbWUgY29tcGxleCBhY3Rpb24gdGhhdCB5b3Ugd2FudCB0byB1c2UgYWdhaW4gYW5kIGFnYWluLAoreW91IG1heSBub3QgaGF2ZSB0byBidWlsZCBpdCBmcm9tIHNjcmF0Y2ggZXZlcnl0aW1lLiBJZiB0aGUgYWN0aW9uCitkb2Vzbid0IGhhdmUgYW4gaW50ZXJuYWwgc3RhdGUgKGkuZS4gaWYgaXQgYWx3YXlzIGRvZXMgdGhlIHNhbWUgdGhpbmcKK25vIG1hdHRlciBob3cgbWFueSB0aW1lcyBpdCBoYXMgYmVlbiBjYWxsZWQpLCB5b3UgY2FuIGFzc2lnbiBpdCB0byBhbgorYWN0aW9uIHZhcmlhYmxlIGFuZCB1c2UgdGhhdCB2YXJpYWJsZSByZXBlYXRlZGx5LiBGb3IgZXhhbXBsZToKKworYGBgCisgIEFjdGlvbjxib29sKGludCopPiBzZXRfZmxhZyA9IERvQWxsKFNldEFyZ3VtZW50UG9pbnRlZTwwPig1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKHRydWUpKTsKKyAgLi4uIHVzZSBzZXRfZmxhZyBpbiAuV2lsbE9uY2UoKSBhbmQgLldpbGxSZXBlYXRlZGx5KCkgLi4uCitgYGAKKworSG93ZXZlciwgaWYgdGhlIGFjdGlvbiBoYXMgaXRzIG93biBzdGF0ZSwgeW91IG1heSBiZSBzdXJwcmlzZWQgaWYgeW91CitzaGFyZSB0aGUgYWN0aW9uIG9iamVjdC4gU3VwcG9zZSB5b3UgaGF2ZSBhbiBhY3Rpb24gZmFjdG9yeQorYEluY3JlbWVudENvdW50ZXIoaW5pdClgIHdoaWNoIGNyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgaW5jcmVtZW50cyBhbmQKK3JldHVybnMgYSBjb3VudGVyIHdob3NlIGluaXRpYWwgdmFsdWUgaXMgYGluaXRgLCB1c2luZyB0d28gYWN0aW9ucworY3JlYXRlZCBmcm9tIHRoZSBzYW1lIGV4cHJlc3Npb24gYW5kIHVzaW5nIGEgc2hhcmVkIGFjdGlvbiB3aWxsCitleGloaWJpdCBkaWZmZXJlbnQgYmVoYXZpb3JzLiBFeGFtcGxlOgorCitgYGAKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShJbmNyZW1lbnRDb3VudGVyKDApKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShJbmNyZW1lbnRDb3VudGVyKDApKTsKKyAgZm9vLkRvVGhpcygpOyAgLy8gUmV0dXJucyAxLgorICBmb28uRG9UaGlzKCk7ICAvLyBSZXR1cm5zIDIuCisgIGZvby5Eb1RoYXQoKTsgIC8vIFJldHVybnMgMSAtIEJsYWgoKSB1c2VzIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgIC8vIGNvdW50ZXIgdGhhbiBCYXIoKSdzLgorYGBgCisKK3ZlcnN1cworCitgYGAKKyAgQWN0aW9uPGludCgpPiBpbmNyZW1lbnQgPSBJbmNyZW1lbnRDb3VudGVyKDApOworCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKCkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoaW5jcmVtZW50KTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShpbmNyZW1lbnQpOworICBmb28uRG9UaGlzKCk7ICAvLyBSZXR1cm5zIDEuCisgIGZvby5Eb1RoaXMoKTsgIC8vIFJldHVybnMgMi4KKyAgZm9vLkRvVGhhdCgpOyAgLy8gUmV0dXJucyAzIC0gdGhlIGNvdW50ZXIgaXMgc2hhcmVkLgorYGBgCisKKyMgTWlzYyBSZWNpcGVzIG9uIFVzaW5nIEdvb2dsZSBNb2NrICMKKworIyMgRm9yY2luZyBhIFZlcmlmaWNhdGlvbiAjIworCitXaGVuIGl0J3MgYmVpbmcgZGVzdG95ZWQsIHlvdXIgZnJpZW5kbHkgbW9jayBvYmplY3Qgd2lsbCBhdXRvbWF0aWNhbGx5Cit2ZXJpZnkgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIGl0IGhhdmUgYmVlbiBzYXRpc2ZpZWQsIGFuZCB3aWxsCitnZW5lcmF0ZSBbR29vZ2xlIFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LykgZmFpbHVyZXMKK2lmIG5vdC4gVGhpcyBpcyBjb252ZW5pZW50IGFzIGl0IGxlYXZlcyB5b3Ugd2l0aCBvbmUgbGVzcyB0aGluZyB0bword29ycnkgYWJvdXQuIFRoYXQgaXMsIHVubGVzcyB5b3UgYXJlIG5vdCBzdXJlIGlmIHlvdXIgbW9jayBvYmplY3Qgd2lsbAorYmUgZGVzdG95ZWQuCisKK0hvdyBjb3VsZCBpdCBiZSB0aGF0IHlvdXIgbW9jayBvYmplY3Qgd29uJ3QgZXZlbnR1YWxseSBiZSBkZXN0cm95ZWQ/CitXZWxsLCBpdCBtaWdodCBiZSBjcmVhdGVkIG9uIHRoZSBoZWFwIGFuZCBvd25lZCBieSB0aGUgY29kZSB5b3UgYXJlCit0ZXN0aW5nLiBTdXBwb3NlIHRoZXJlJ3MgYSBidWcgaW4gdGhhdCBjb2RlIGFuZCBpdCBkb2Vzbid0IGRlbGV0ZSB0aGUKK21vY2sgb2JqZWN0IHByb3Blcmx5IC0geW91IGNvdWxkIGVuZCB1cCB3aXRoIGEgcGFzc2luZyB0ZXN0IHdoZW4KK3RoZXJlJ3MgYWN0dWFsbHkgYSBidWcuCisKK1VzaW5nIGEgaGVhcCBjaGVja2VyIGlzIGEgZ29vZCBpZGVhIGFuZCBjYW4gYWxsZXZpYXRlIHRoZSBjb25jZXJuLCBidXQKK2l0cyBpbXBsZW1lbnRhdGlvbiBtYXkgbm90IGJlIDEwMCUgcmVsaWFibGUuIFNvLCBzb21ldGltZXMgeW91IGRvIHdhbnQKK3RvIF9mb3JjZV8gR29vZ2xlIE1vY2sgdG8gdmVyaWZ5IGEgbW9jayBvYmplY3QgYmVmb3JlIGl0IGlzCisoaG9wZWZ1bGx5KSBkZXN0cnVjdGVkLiBZb3UgY2FuIGRvIHRoaXMgd2l0aAorYE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX29iamVjdClgOgorCitgYGAKK1RFU1QoTXlTZXJ2ZXJUZXN0LCBQcm9jZXNzZXNSZXF1ZXN0KSB7CisgIHVzaW5nIDo6dGVzdGluZzo6TW9jazsKKworICBNb2NrRm9vKiBjb25zdCBmb28gPSBuZXcgTW9ja0ZvbzsKKyAgRVhQRUNUX0NBTEwoKmZvbywgLi4uKS4uLjsKKyAgLy8gLi4uIG90aGVyIGV4cGVjdGF0aW9ucyAuLi4KKworICAvLyBzZXJ2ZXIgbm93IG93bnMgZm9vLgorICBNeVNlcnZlciBzZXJ2ZXIoZm9vKTsKKyAgc2VydmVyLlByb2Nlc3NSZXF1ZXN0KC4uLik7CisKKyAgLy8gSW4gY2FzZSB0aGF0IHNlcnZlcidzIGRlc3RydWN0b3Igd2lsbCBmb3JnZXQgdG8gZGVsZXRlIGZvbywKKyAgLy8gdGhpcyB3aWxsIHZlcmlmeSB0aGUgZXhwZWN0YXRpb25zIGFueXdheS4KKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoZm9vKTsKK30gIC8vIHNlcnZlciBpcyBkZXN0cm95ZWQgd2hlbiBpdCBnb2VzIG91dCBvZiBzY29wZSBoZXJlLgorYGBgCisKKyoqVGlwOioqIFRoZSBgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoKWAgZnVuY3Rpb24gcmV0dXJucyBhCitgYm9vbGAgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgdmVyaWZpY2F0aW9uIHdhcyBzdWNjZXNzZnVsIChgdHJ1ZWAgZm9yCit5ZXMpLCBzbyB5b3UgY2FuIHdyYXAgdGhhdCBmdW5jdGlvbiBjYWxsIGluc2lkZSBhIGBBU1NFUlRfVFJVRSgpYCBpZgordGhlcmUgaXMgbm8gcG9pbnQgZ29pbmcgZnVydGhlciB3aGVuIHRoZSB2ZXJpZmljYXRpb24gaGFzIGZhaWxlZC4KKworIyMgVXNpbmcgQ2hlY2sgUG9pbnRzICMjCisKK1NvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdG8gInJlc2V0IiBhIG1vY2sgb2JqZWN0IGF0IHZhcmlvdXMgY2hlY2sKK3BvaW50cyBpbiB5b3VyIHRlc3Q6IGF0IGVhY2ggY2hlY2sgcG9pbnQsIHlvdSB2ZXJpZnkgdGhhdCBhbGwgZXhpc3RpbmcKK2V4cGVjdGF0aW9ucyBvbiB0aGUgbW9jayBvYmplY3QgaGF2ZSBiZWVuIHNhdGlzZmllZCwgYW5kIHRoZW4geW91IHNldAorc29tZSBuZXcgZXhwZWN0YXRpb25zIG9uIGl0IGFzIGlmIGl0J3MgbmV3bHkgY3JlYXRlZC4gVGhpcyBhbGxvd3MgeW91Cit0byB3b3JrIHdpdGggYSBtb2NrIG9iamVjdCBpbiAicGhhc2VzIiB3aG9zZSBzaXplcyBhcmUgZWFjaAorbWFuYWdlYWJsZS4KKworT25lIHN1Y2ggc2NlbmFyaW8gaXMgdGhhdCBpbiB5b3VyIHRlc3QncyBgU2V0VXAoKWAgZnVuY3Rpb24sIHlvdSBtYXkKK3dhbnQgdG8gcHV0IHRoZSBvYmplY3QgeW91IGFyZSB0ZXN0aW5nIGludG8gYSBjZXJ0YWluIHN0YXRlLCB3aXRoIHRoZQoraGVscCBmcm9tIGEgbW9jayBvYmplY3QuIE9uY2UgaW4gdGhlIGRlc2lyZWQgc3RhdGUsIHlvdSB3YW50IHRvIGNsZWFyCithbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBtb2NrLCBzdWNoIHRoYXQgaW4gdGhlIGBURVNUX0ZgIGJvZHkgeW91IGNhbgorc2V0IGZyZXNoIGV4cGVjdGF0aW9ucyBvbiBpdC4KKworQXMgeW91IG1heSBoYXZlIGZpZ3VyZWQgb3V0LCB0aGUgYE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKClgCitmdW5jdGlvbiB3ZSBzYXcgaW4gdGhlIHByZXZpb3VzIHJlY2lwZSBjYW4gaGVscCB5b3UgaGVyZS4gT3IsIGlmIHlvdQorYXJlIHVzaW5nIGBPTl9DQUxMKClgIHRvIHNldCBkZWZhdWx0IGFjdGlvbnMgb24gdGhlIG1vY2sgb2JqZWN0IGFuZAord2FudCB0byBjbGVhciB0aGUgZGVmYXVsdCBhY3Rpb25zIGFzIHdlbGwsIHVzZQorYE1vY2s6OlZlcmlmeUFuZENsZWFyKCZtb2NrX29iamVjdClgIGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gZG9lcyB3aGF0CitgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfb2JqZWN0KWAgZG9lcyBhbmQgcmV0dXJucyB0aGUKK3NhbWUgYGJvb2xgLCAqKnBsdXMqKiBpdCBjbGVhcnMgdGhlIGBPTl9DQUxMKClgIHN0YXRlbWVudHMgb24KK2Btb2NrX29iamVjdGAgdG9vLgorCitBbm90aGVyIHRyaWNrIHlvdSBjYW4gdXNlIHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IGlzIHRvIHB1dCB0aGUKK2V4cGVjdGF0aW9ucyBpbiBzZXF1ZW5jZXMgYW5kIGluc2VydCBjYWxscyB0byBhIGR1bW15ICJjaGVjay1wb2ludCIKK2Z1bmN0aW9uIGF0IHNwZWNpZmljIHBsYWNlcy4gVGhlbiB5b3UgY2FuIHZlcmlmeSB0aGF0IHRoZSBtb2NrCitmdW5jdGlvbiBjYWxscyBkbyBoYXBwZW4gYXQgdGhlIHJpZ2h0IHRpbWUuIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlCitleGVyY2lzaW5nIGNvZGU6CisKK2BgYAorRm9vKDEpOworRm9vKDIpOworRm9vKDMpOworYGBgCisKK2FuZCB3YW50IHRvIHZlcmlmeSB0aGF0IGBGb28oMSlgIGFuZCBgRm9vKDMpYCBib3RoIGludm9rZQorYG1vY2suQmFyKCJhIilgLCBidXQgYEZvbygyKWAgZG9lc24ndCBpbnZva2UgYW55dGhpbmcuIFlvdSBjYW4gd3JpdGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNb2NrRnVuY3Rpb247CisKK1RFU1QoRm9vVGVzdCwgSW52b2tlc0JhckNvcnJlY3RseSkgeworICBNeU1vY2sgbW9jazsKKyAgLy8gQ2xhc3MgTW9ja0Z1bmN0aW9uPEY+IGhhcyBleGFjdGx5IG9uZSBtb2NrIG1ldGhvZC4gIEl0IGlzIG5hbWVkCisgIC8vIENhbGwoKSBhbmQgaGFzIHR5cGUgRi4KKyAgTW9ja0Z1bmN0aW9uPHZvaWQoc3RyaW5nIGNoZWNrX3BvaW50X25hbWUpPiBjaGVjazsKKyAgeworICAgIEluU2VxdWVuY2UgczsKKworICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsKKyAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMSIpKTsKKyAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMiIpKTsKKyAgICBFWFBFQ1RfQ0FMTChtb2NrLCBCYXIoImEiKSk7CisgIH0KKyAgRm9vKDEpOworICBjaGVjay5DYWxsKCIxIik7CisgIEZvbygyKTsKKyAgY2hlY2suQ2FsbCgiMiIpOworICBGb28oMyk7Cit9CitgYGAKKworVGhlIGV4cGVjdGF0aW9uIHNwZWMgc2F5cyB0aGF0IHRoZSBmaXJzdCBgQmFyKCJhIilgIG11c3QgaGFwcGVuIGJlZm9yZQorY2hlY2sgcG9pbnQgIjEiLCB0aGUgc2Vjb25kIGBCYXIoImEiKWAgbXVzdCBoYXBwZW4gYWZ0ZXIgY2hlY2sgcG9pbnQgIjIiLAorYW5kIG5vdGhpbmcgc2hvdWxkIGhhcHBlbiBiZXR3ZWVuIHRoZSB0d28gY2hlY2sgcG9pbnRzLiBUaGUgZXhwbGljaXQKK2NoZWNrIHBvaW50cyBtYWtlIGl0IGVhc3kgdG8gdGVsbCB3aGljaCBgQmFyKCJhIilgIGlzIGNhbGxlZCBieSB3aGljaAorY2FsbCB0byBgRm9vKClgLgorCisjIyBNb2NraW5nIERlc3RydWN0b3JzICMjCisKK1NvbWV0aW1lcyB5b3Ugd2FudCB0byBtYWtlIHN1cmUgYSBtb2NrIG9iamVjdCBpcyBkZXN0cnVjdGVkIGF0IHRoZQorcmlnaHQgdGltZSwgZS5nLiBhZnRlciBgYmFyLT5BKClgIGlzIGNhbGxlZCBidXQgYmVmb3JlIGBiYXItPkIoKWAgaXMKK2NhbGxlZC4gV2UgYWxyZWFkeSBrbm93IHRoYXQgeW91IGNhbiBzcGVjaWZ5IGNvbnN0cmFpbnRzIG9uIHRoZSBvcmRlcgorb2YgbW9jayBmdW5jdGlvbiBjYWxscywgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgdG8gbW9jayB0aGUgZGVzdHJ1Y3Rvcgorb2YgdGhlIG1vY2sgZnVuY3Rpb24uCisKK1RoaXMgc291bmRzIHNpbXBsZSwgZXhjZXB0IGZvciBvbmUgcHJvYmxlbTogYSBkZXN0cnVjdG9yIGlzIGEgc3BlY2lhbAorZnVuY3Rpb24gd2l0aCBzcGVjaWFsIHN5bnRheCBhbmQgc3BlY2lhbCBzZW1hbnRpY3MsIGFuZCB0aGUKK2BNT0NLX01FVEhPRDBgIG1hY3JvIGRvZXNuJ3Qgd29yayBmb3IgaXQ6CisKK2BgYAorICBNT0NLX01FVEhPRDAofk1vY2tGb28sIHZvaWQoKSk7ICAvLyBXb24ndCBjb21waWxlIQorYGBgCisKK1RoZSBnb29kIG5ld3MgaXMgdGhhdCB5b3UgY2FuIHVzZSBhIHNpbXBsZSBwYXR0ZXJuIHRvIGFjaGlldmUgdGhlIHNhbWUKK2VmZmVjdC4gRmlyc3QsIGFkZCBhIG1vY2sgZnVuY3Rpb24gYERpZSgpYCB0byB5b3VyIG1vY2sgY2xhc3MgYW5kIGNhbGwKK2l0IGluIHRoZSBkZXN0cnVjdG9yLCBsaWtlIHRoaXM6CisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgLy8gQWRkIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIHRvIHRoZSBtb2NrIGNsYXNzLgorICBNT0NLX01FVEhPRDAoRGllLCB2b2lkKCkpOworICB2aXJ0dWFsIH5Nb2NrRm9vKCkgeyBEaWUoKTsgfQorfTsKK2BgYAorCisoSWYgdGhlIG5hbWUgYERpZSgpYCBjbGFzaGVzIHdpdGggYW4gZXhpc3Rpbmcgc3ltYm9sLCBjaG9vc2UgYW5vdGhlcgorbmFtZS4pIE5vdywgd2UgaGF2ZSB0cmFuc2xhdGVkIHRoZSBwcm9ibGVtIG9mIHRlc3Rpbmcgd2hlbiBhIGBNb2NrRm9vYAorb2JqZWN0IGRpZXMgdG8gdGVzdGluZyB3aGVuIGl0cyBgRGllKClgIG1ldGhvZCBpcyBjYWxsZWQ6CisKK2BgYAorICBNb2NrRm9vKiBmb28gPSBuZXcgTW9ja0ZvbzsKKyAgTW9ja0JhciogYmFyID0gbmV3IE1vY2tCYXI7CisgIC4uLgorICB7CisgICAgSW5TZXF1ZW5jZSBzOworCisgICAgLy8gRXhwZWN0cyAqZm9vIHRvIGRpZSBhZnRlciBiYXItPkEoKSBhbmQgYmVmb3JlIGJhci0+QigpLgorICAgIEVYUEVDVF9DQUxMKCpiYXIsIEEoKSk7CisgICAgRVhQRUNUX0NBTEwoKmZvbywgRGllKCkpOworICAgIEVYUEVDVF9DQUxMKCpiYXIsIEIoKSk7CisgIH0KK2BgYAorCitBbmQgdGhhdCdzIHRoYXQuCisKKyMjIFVzaW5nIEdvb2dsZSBNb2NrIGFuZCBUaHJlYWRzICMjCisKKyoqSU1QT1JUQU5UIE5PVEU6KiogV2hhdCB3ZSBkZXNjcmliZSBpbiB0aGlzIHJlY2lwZSBpcyAqKk5PVCoqIHRydWUgeWV0LAorYXMgR29vZ2xlIE1vY2sgaXMgbm90IGN1cnJlbnRseSB0aHJlYWQtc2FmZS4gIEhvd2V2ZXIsIGFsbCB3ZSBuZWVkIHRvCittYWtlIGl0IHRocmVhZC1zYWZlIGlzIHRvIGltcGxlbWVudCBzb21lIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zIGluCitgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaD5gIC0gYW5kIHRoZW4gdGhlIGluZm9ybWF0aW9uIGJlbG93IHdpbGwKK2JlY29tZSB0cnVlLgorCitJbiBhICoqdW5pdCoqIHRlc3QsIGl0J3MgYmVzdCBpZiB5b3UgY291bGQgaXNvbGF0ZSBhbmQgdGVzdCBhIHBpZWNlIG9mCitjb2RlIGluIGEgc2luZ2xlLXRocmVhZGVkIGNvbnRleHQuIFRoYXQgYXZvaWRzIHJhY2UgY29uZGl0aW9ucyBhbmQKK2RlYWQgbG9ja3MsIGFuZCBtYWtlcyBkZWJ1Z2dpbmcgeW91ciB0ZXN0IG11Y2ggZWFzaWVyLgorCitZZXQgbWFueSBwcm9ncmFtcyBhcmUgbXVsdGktdGhyZWFkZWQsIGFuZCBzb21ldGltZXMgdG8gdGVzdCBzb21ldGhpbmcKK3dlIG5lZWQgdG8gcG91bmQgb24gaXQgZnJvbSBtb3JlIHRoYW4gb25lIHRocmVhZC4gR29vZ2xlIE1vY2sgd29ya3MKK2ZvciB0aGlzIHB1cnBvc2UgdG9vLgorCitSZW1lbWJlciB0aGUgc3RlcHMgZm9yIHVzaW5nIGEgbW9jazoKKworICAxLiBDcmVhdGUgYSBtb2NrIG9iamVjdCBgZm9vYC4KKyAgMS4gU2V0IGl0cyBkZWZhdWx0IGFjdGlvbnMgYW5kIGV4cGVjdGF0aW9ucyB1c2luZyBgT05fQ0FMTCgpYCBhbmQgYEVYUEVDVF9DQUxMKClgLgorICAxLiBUaGUgY29kZSB1bmRlciB0ZXN0IGNhbGxzIG1ldGhvZHMgb2YgYGZvb2AuCisgIDEuIE9wdGlvbmFsbHksIHZlcmlmeSBhbmQgcmVzZXQgdGhlIG1vY2suCisgIDEuIERlc3Ryb3kgdGhlIG1vY2sgeW91cnNlbGYsIG9yIGxldCB0aGUgY29kZSB1bmRlciB0ZXN0IGRlc3Ryb3kgaXQuIFRoZSBkZXN0cnVjdG9yIHdpbGwgYXV0b21hdGljYWxseSB2ZXJpZnkgaXQuCisKK0lmIHlvdSBmb2xsb3cgdGhlIGZvbGxvd2luZyBzaW1wbGUgcnVsZXMsIHlvdXIgbW9ja3MgYW5kIHRocmVhZHMgY2FuCitsaXZlIGhhcHBpbHkgdG9nZXRlcjoKKworICAqIEV4ZWN1dGUgeW91ciBfdGVzdCBjb2RlXyAoYXMgb3Bwb3NlZCB0byB0aGUgY29kZSBiZWluZyB0ZXN0ZWQpIGluIF9vbmVfIHRocmVhZC4gVGhpcyBtYWtlcyB5b3VyIHRlc3QgZWFzeSB0byBmb2xsb3cuCisgICogT2J2aW91c2x5LCB5b3UgY2FuIGRvIHN0ZXAgIzEgd2l0aG91dCBsb2NraW5nLgorICAqIFdoZW4gZG9pbmcgc3RlcCAjMiBhbmQgIzUsIG1ha2Ugc3VyZSBubyBvdGhlciB0aHJlYWQgaXMgYWNjZXNzaW5nIGBmb29gLiBPYnZpb3VzIHRvbywgaHVoPworICAqICMzIGFuZCAjNCBjYW4gYmUgZG9uZSBlaXRoZXIgaW4gb25lIHRocmVhZCBvciBpbiBtdWx0aXBsZSB0aHJlYWRzIC0gYW55d2F5IHlvdSB3YW50LiBHb29nbGUgTW9jayB0YWtlcyBjYXJlIG9mIHRoZSBsb2NraW5nLCBzbyB5b3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnkgLSB1bmxlc3MgcmVxdWlyZWQgYnkgeW91ciB0ZXN0IGxvZ2ljLgorCitJZiB5b3UgdmlvbGF0ZSB0aGUgcnVsZXMgKGZvciBleGFtcGxlLCBpZiB5b3Ugc2V0IGV4cGVjdGF0aW9ucyBvbiBhCittb2NrIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGNhbGxpbmcgaXRzIG1ldGhvZHMpLCB5b3UgZ2V0IHVuZGVmaW5lZAorYmVoYXZpb3IuIFRoYXQncyBub3QgZnVuLCBzbyBkb24ndCBkbyBpdC4KKworR29vZ2xlIE1vY2sgZ3VhcmFudGVlcyB0aGF0IHRoZSBhY3Rpb24gZm9yIGEgbW9jayBmdW5jdGlvbiBpcyBkb25lIGluCit0aGUgc2FtZSB0aHJlYWQgdGhhdCBjYWxsZWQgdGhlIG1vY2sgZnVuY3Rpb24uIEZvciBleGFtcGxlLCBpbgorCitgYGAKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKDEpKQorICAgICAgLldpbGxPbmNlKGFjdGlvbjEpOworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oMikpCisgICAgICAuV2lsbE9uY2UoYWN0aW9uMik7CitgYGAKKworaWYgYEZvbygxKWAgaXMgY2FsbGVkIGluIHRocmVhZCAxIGFuZCBgRm9vKDIpYCBpcyBjYWxsZWQgaW4gdGhyZWFkIDIsCitHb29nbGUgTW9jayB3aWxsIGV4ZWN1dGUgYGFjdGlvbjFgIGluIHRocmVhZCAxIGFuZCBgYWN0aW9uMmAgaW4gdGhyZWFkCisyLgorCitHb29nbGUgTW9jayBkb2VzIF9ub3RfIGltcG9zZSBhIHNlcXVlbmNlIG9uIGFjdGlvbnMgcGVyZm9ybWVkIGluCitkaWZmZXJlbnQgdGhyZWFkcyAoZG9pbmcgc28gbWF5IGNyZWF0ZSBkZWFkbG9ja3MgYXMgdGhlIGFjdGlvbnMgbWF5CituZWVkIHRvIGNvb3BlcmF0ZSkuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhlY3V0aW9uIG9mIGBhY3Rpb24xYCBhbmQKK2BhY3Rpb24yYCBpbiB0aGUgYWJvdmUgZXhhbXBsZSBfbWF5XyBpbnRlcmxlYXZlLiBJZiB0aGlzIGlzIGEgcHJvYmxlbSwKK3lvdSBzaG91bGQgYWRkIHByb3BlciBzeW5jaHJvbml6YXRpb24gbG9naWMgdG8gYGFjdGlvbjFgIGFuZCBgYWN0aW9uMmAKK3RvIG1ha2UgdGhlIHRlc3QgdGhyZWFkLXNhZmUuCisKKworQWxzbywgcmVtZW1iZXIgdGhhdCBgRGVmYXVsdFZhbHVlPFQ+YCBpcyBhIGdsb2JhbCByZXNvdXJjZSB0aGF0Citwb3RlbnRpYWxseSBhZmZlY3RzIF9hbGxfIGxpdmluZyBtb2NrIG9iamVjdHMgaW4geW91cgorcHJvZ3JhbS4gTmF0dXJhbGx5LCB5b3Ugd29uJ3Qgd2FudCB0byBtZXNzIHdpdGggaXQgZnJvbSBtdWx0aXBsZQordGhyZWFkcyBvciB3aGVuIHRoZXJlIHN0aWxsIGFyZSBtb2NrcyBpbiBhY3Rpb24uCisKKyMjIENvbnRyb2xsaW5nIEhvdyBNdWNoIEluZm9ybWF0aW9uIEdvb2dsZSBNb2NrIFByaW50cyAjIworCitXaGVuIEdvb2dsZSBNb2NrIHNlZXMgc29tZXRoaW5nIHRoYXQgaGFzIHRoZSBwb3RlbnRpYWwgb2YgYmVpbmcgYW4KK2Vycm9yIChlLmcuIGEgbW9jayBmdW5jdGlvbiB3aXRoIG5vIGV4cGVjdGF0aW9uIGlzIGNhbGxlZCwgYS5rLmEuIGFuCit1bmludGVyZXN0aW5nIGNhbGwsIHdoaWNoIGlzIGFsbG93ZWQgYnV0IHBlcmhhcHMgeW91IGZvcmdvdCB0bworZXhwbGljaXRseSBiYW4gdGhlIGNhbGwpLCBpdCBwcmludHMgc29tZSB3YXJuaW5nIG1lc3NhZ2VzLCBpbmNsdWRpbmcKK3RoZSBhcmd1bWVudHMgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGUgcmV0dXJuIHZhbHVlLiBIb3BlZnVsbHkgdGhpcword2lsbCByZW1pbmQgeW91IHRvIHRha2UgYSBsb29rIGFuZCBzZWUgaWYgdGhlcmUgaXMgaW5kZWVkIGEgcHJvYmxlbS4KKworU29tZXRpbWVzIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgeW91ciB0ZXN0cyBhcmUgY29ycmVjdCBhbmQgbWF5IG5vdAorYXBwcmVjaWF0ZSBzdWNoIGZyaWVuZGx5IG1lc3NhZ2VzLiBTb21lIG90aGVyIHRpbWVzLCB5b3UgYXJlIGRlYnVnZ2luZworeW91ciB0ZXN0cyBvciBsZWFybmluZyBhYm91dCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNvZGUgeW91IGFyZSB0ZXN0aW5nLAorYW5kIHdpc2ggeW91IGNvdWxkIG9ic2VydmUgZXZlcnkgbW9jayBjYWxsIHRoYXQgaGFwcGVucyAoaW5jbHVkaW5nCithcmd1bWVudCB2YWx1ZXMgYW5kIHRoZSByZXR1cm4gdmFsdWUpLiBDbGVhcmx5LCBvbmUgc2l6ZSBkb2Vzbid0IGZpdAorYWxsLgorCitZb3UgY2FuIGNvbnRyb2wgaG93IG11Y2ggR29vZ2xlIE1vY2sgdGVsbHMgeW91IHVzaW5nIHRoZQorYC0tZ21vY2tfdmVyYm9zZT1MRVZFTGAgY29tbWFuZC1saW5lIGZsYWcsIHdoZXJlIGBMRVZFTGAgaXMgYSBzdHJpbmcKK3dpdGggdGhyZWUgcG9zc2libGUgdmFsdWVzOgorCisgICogYGluZm9gOiBHb29nbGUgTW9jayB3aWxsIHByaW50IGFsbCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLCB3YXJuaW5ncywgYW5kIGVycm9ycyAobW9zdCB2ZXJib3NlKS4gQXQgdGhpcyBzZXR0aW5nLCBHb29nbGUgTW9jayB3aWxsIGFsc28gbG9nIGFueSBjYWxscyB0byB0aGUgYE9OX0NBTEwvRVhQRUNUX0NBTExgIG1hY3Jvcy4KKyAgKiBgd2FybmluZ2A6IEdvb2dsZSBNb2NrIHdpbGwgcHJpbnQgYm90aCB3YXJuaW5ncyBhbmQgZXJyb3JzIChsZXNzIHZlcmJvc2UpLiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICAqIGBlcnJvcmA6IEdvb2dsZSBNb2NrIHdpbGwgcHJpbnQgZXJyb3JzIG9ubHkgKGxlYXN0IHZlcmJvc2UpLgorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFkanVzdCB0aGUgdmFsdWUgb2YgdGhhdCBmbGFnIGZyb20gd2l0aGluIHlvdXIKK3Rlc3RzIGxpa2Ugc286CisKK2BgYAorICA6OnRlc3Rpbmc6OkZMQUdTX2dtb2NrX3ZlcmJvc2UgPSAiZXJyb3IiOworYGBgCisKK05vdywganVkaWNpb3VzbHkgdXNlIHRoZSByaWdodCBmbGFnIHRvIGVuYWJsZSBHb29nbGUgTW9jayBzZXJ2ZSB5b3UgYmV0dGVyIQorCisjIyBSdW5uaW5nIFRlc3RzIGluIEVtYWNzICMjCisKK0lmIHlvdSBidWlsZCBhbmQgcnVuIHlvdXIgdGVzdHMgaW4gRW1hY3MsIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbnMgb2YKK0dvb2dsZSBNb2NrIGFuZCBbR29vZ2xlIFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LykKK2Vycm9ycyB3aWxsIGJlIGhpZ2hsaWdodGVkLiBKdXN0IHByZXNzIGA8RW50ZXI+YCBvbiBvbmUgb2YgdGhlbSBhbmQKK3lvdSdsbCBiZSB0YWtlbiB0byB0aGUgb2ZmZW5kaW5nIGxpbmUuIE9yLCB5b3UgY2FuIGp1c3QgdHlwZSBgQy14IGBgCit0byBqdW1wIHRvIHRoZSBuZXh0IGVycm9yLgorCitUbyBtYWtlIGl0IGV2ZW4gZWFzaWVyLCB5b3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHlvdXIKK2B+Ly5lbWFjc2AgZmlsZToKKworYGBgCisoZ2xvYmFsLXNldC1rZXkgIlxNLW0iICAgJ2NvbXBpbGUpICA7IG0gaXMgZm9yIG1ha2UKKyhnbG9iYWwtc2V0LWtleSBbTS1kb3duXSAnbmV4dC1lcnJvcikKKyhnbG9iYWwtc2V0LWtleSBbTS11cF0gICAnKGxhbWJkYSAoKSAoaW50ZXJhY3RpdmUpIChuZXh0LWVycm9yIC0xKSkpCitgYGAKKworVGhlbiB5b3UgY2FuIHR5cGUgYE0tbWAgdG8gc3RhcnQgYSBidWlsZCwgb3IgYE0tdXBgL2BNLWRvd25gIHRvIG1vdmUKK2JhY2sgYW5kIGZvcnRoIGJldHdlZW4gZXJyb3JzLgorCisjIyBGdXNpbmcgR29vZ2xlIE1vY2sgU291cmNlIEZpbGVzICMjCisKK0dvb2dsZSBNb2NrJ3MgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgZG96ZW5zIG9mIGZpbGVzIChleGNsdWRpbmcKK2l0cyBvd24gdGVzdHMpLiAgU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0aGVtIHRvIGJlIHBhY2thZ2VkIHVwIGluCitmZXdlciBmaWxlcyBpbnN0ZWFkLCBzdWNoIHRoYXQgeW91IGNhbiBlYXNpbHkgY29weSB0aGVtIHRvIGEgbmV3CittYWNoaW5lIGFuZCBzdGFydCBoYWNraW5nIHRoZXJlLiAgRm9yIHRoaXMgd2UgcHJvdmlkZSBhbiBleHBlcmltZW50YWwKK1B5dGhvbiBzY3JpcHQgYGZ1c2VfZ21vY2tfZmlsZXMucHlgIGluIHRoZSBgc2NyaXB0cy9gIGRpcmVjdG9yeQorKHN0YXJ0aW5nIHdpdGggcmVsZWFzZSAxLjIuMCkuICBBc3N1bWluZyB5b3UgaGF2ZSBQeXRob24gMi40IG9yIGFib3ZlCitpbnN0YWxsZWQgb24geW91ciBtYWNoaW5lLCBqdXN0IGdvIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW4KK2BgYAorcHl0aG9uIGZ1c2VfZ21vY2tfZmlsZXMucHkgT1VUUFVUX0RJUgorYGBgCisKK2FuZCB5b3Ugc2hvdWxkIHNlZSBhbiBgT1VUUFVUX0RJUmAgZGlyZWN0b3J5IGJlaW5nIGNyZWF0ZWQgd2l0aCBmaWxlcworYGd0ZXN0L2d0ZXN0LmhgLCBgZ21vY2svZ21vY2suaGAsIGFuZCBgZ21vY2stZ3Rlc3QtYWxsLmNjYCBpbiBpdC4KK1RoZXNlIHRocmVlIGZpbGVzIGNvbnRhaW4gZXZlcnl0aGluZyB5b3UgbmVlZCB0byB1c2UgR29vZ2xlIE1vY2sgKGFuZAorR29vZ2xlIFRlc3QpLiAgSnVzdCBjb3B5IHRoZW0gdG8gYW55d2hlcmUgeW91IHdhbnQgYW5kIHlvdSBhcmUgcmVhZHkKK3RvIHdyaXRlIHRlc3RzIGFuZCB1c2UgbW9ja3MuICBZb3UgY2FuIHVzZSB0aGUKK1tzY3JwdHMvdGVzdC9NYWtlZmlsZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svc291cmNlL2Jyb3dzZS90cnVuay9zY3JpcHRzL3Rlc3QvTWFrZWZpbGUpIGZpbGUgYXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY29tcGlsZSB5b3VyIHRlc3RzCithZ2FpbnN0IHRoZW0uCisKKyMgRXh0ZW5kaW5nIEdvb2dsZSBNb2NrICMKKworIyMgV3JpdGluZyBOZXcgTWF0Y2hlcnMgUXVpY2tseSAjIworCitUaGUgYE1BVENIRVIqYCBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBjdXN0b20gbWF0Y2hlcnMKK2Vhc2lseS4gIFRoZSBzeW50YXg6CisKK2BgYAorTUFUQ0hFUihuYW1lLCAiZGVzY3JpcHRpb24gc3RyaW5nIikgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKword2lsbCBkZWZpbmUgYSBtYXRjaGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUKK3N0YXRlbWVudHMsIHdoaWNoIG11c3QgcmV0dXJuIGEgYGJvb2xgIHRvIGluZGljYXRlIGlmIHRoZSBtYXRjaAorc3VjY2VlZHMuICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIGJlaW5nCittYXRjaGVkIGJ5IGBhcmdgLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgYGFyZ190eXBlYC4KKworVGhlIGRlc2NyaXB0aW9uIHN0cmluZyBkb2N1bWVudHMgd2hhdCB0aGUgbWF0Y2hlciBkb2VzLCBhbmQgaXMgdXNlZCB0bworZ2VuZXJhdGUgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aGVuIHRoZSBtYXRjaCBmYWlscy4gIFNpbmNlIGEKK2BNQVRDSEVSKClgIGlzIHVzdWFsbHkgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIHNoYXJlZCBieSBtdWx0aXBsZSBDKysKK3NvdXJjZSBmaWxlcywgd2UgcmVxdWlyZSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgYSBDLXN0cmluZyBfbGl0ZXJhbF8gdG8KK2F2b2lkIHBvc3NpYmxlIHNpZGUgZWZmZWN0cy4gIEl0IGNhbiBiZSBlbXB0eSAoYCIiYCksIGluIHdoaWNoIGNhc2UKK0dvb2dsZSBNb2NrIHdpbGwgdXNlIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUgbWF0Y2hlciBuYW1lIGFzIHRoZQorZGVzY3JpcHRpb24uCisKK0ZvciBleGFtcGxlOgorYGBgCitNQVRDSEVSKElzRGl2aXNpYmxlQnk3LCAiIikgeyByZXR1cm4gKGFyZyAlIDcpID09IDA7IH0KK2BgYAorYWxsb3dzIHlvdSB0byB3cml0ZQorYGBgCisgIC8vIEV4cGVjdHMgbW9ja19mb28uQmFyKG4pIHRvIGJlIGNhbGxlZCB3aGVyZSBuIGlzIGRpdmlzaWJsZSBieSA3LgorICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgQmFyKElzRGl2aXNpYmxlQnk3KCkpKTsKK2BgYAorb3IsCitgYGAKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgb2Ygc29tZV9leHByZXNzaW9uIGlzIGRpdmlzaWJsZSBieSA3LgorICBFWFBFQ1RfVEhBVChzb21lX2V4cHJlc3Npb24sIElzRGl2aXNpYmxlQnk3KCkpOworYGBgCitJZiB0aGUgYWJvdmUgYXNzZXJ0aW9uIGZhaWxzLCBpdCB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlOgorYGBgCisgIFZhbHVlIG9mOiBzb21lX2V4cHJlc3Npb24KKyAgRXhwZWN0ZWQ6IGlzIGRpdmlzaWJsZSBieSA3CisgICAgQWN0dWFsOiAyNworYGBgCit3aGVyZSB0aGUgZGVzY3JpcHRpb24gYCJpcyBkaXZpc2libGUgYnkgNyJgIGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRoZQorbWF0Y2hlciBuYW1lIGBJc0RpdmlzaWJsZUJ5N2AuCisKK09wdGlvbmFsbHksIHlvdSBjYW4gc3RyZWFtIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYSBoaWRkZW4gYXJndW1lbnQKK25hbWVkIGByZXN1bHRfbGlzdGVuZXJgIHRvIGV4cGxhaW4gdGhlIG1hdGNoIHJlc3VsdC4gRm9yIGV4YW1wbGUsIGEKK2JldHRlciBkZWZpbml0aW9uIG9mIGBJc0RpdmlzaWJsZUJ5N2AgaXM6CitgYGAKK01BVENIRVIoSXNEaXZpc2libGVCeTcsICIiKSB7CisgIGlmICgoYXJnICUgNykgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAqcmVzdWx0X2xpc3RlbmVyIDw8ICJ0aGUgcmVtYWluZGVyIGlzICIgPDwgKGFyZyAlIDcpOworICByZXR1cm4gZmFsc2U7Cit9CitgYGAKKworV2l0aCB0aGlzIGRlZmluaXRpb24sIHRoZSBhYm92ZSBhc3NlcnRpb24gd2lsbCBnaXZlIGEgYmV0dGVyIG1lc3NhZ2U6CitgYGAKKyAgVmFsdWUgb2Y6IHNvbWVfZXhwcmVzc2lvbgorICBFeHBlY3RlZDogaXMgZGl2aXNpYmxlIGJ5IDcKKyAgICBBY3R1YWw6IDI3ICh0aGUgcmVtYWluZGVyIGlzIDYpCitgYGAKKworWW91IHNob3VsZCBsZXQgYE1hdGNoQW5kRXhwbGFpbigpYCBwcmludCBfYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb25fCit0aGF0IGNhbiBoZWxwIGEgdXNlciB1bmRlcnN0YW5kIHRoZSBtYXRjaCByZXN1bHQuIE5vdGUgdGhhdCBpdCBzaG91bGQKK2V4cGxhaW4gd2h5IHRoZSBtYXRjaCBzdWNjZWVkcyBpbiBjYXNlIG9mIGEgc3VjY2VzcyAodW5sZXNzIGl0J3MKK29idmlvdXMpIC0gdGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgbWF0Y2hlciBpcyB1c2VkIGluc2lkZQorYE5vdCgpYC4gVGhlcmUgaXMgbm8gbmVlZCB0byBwcmludCB0aGUgYXJndW1lbnQgdmFsdWUgaXRzZWxmLCBhcworR29vZ2xlIE1vY2sgYWxyZWFkeSBwcmludHMgaXQgZm9yIHlvdS4KKworKipOb3RlczoqKgorCisgIDEuIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIChgYXJnX3R5cGVgKSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHlvdSB1c2UgdGhlIG1hdGNoZXIgYW5kIGlzIHN1cHBsaWVkIHRvIHlvdSBieSB0aGUgY29tcGlsZXIsIHNvIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGRlY2xhcmluZyBpdCAobm9yIGNhbiB5b3UpLiAgVGhpcyBhbGxvd3MgdGhlIG1hdGNoZXIgdG8gYmUgcG9seW1vcnBoaWMuICBGb3IgZXhhbXBsZSwgYElzRGl2aXNpYmxlQnk3KClgIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFueSB0eXBlIHdoZXJlIHRoZSB2YWx1ZSBvZiBgKGFyZyAlIDcpID09IDBgIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhIGBib29sYC4gIEluIHRoZSBgQmFyKElzRGl2aXNpYmxlQnk3KCkpYCBleGFtcGxlIGFib3ZlLCBpZiBtZXRob2QgYEJhcigpYCB0YWtlcyBhbiBgaW50YCwgYGFyZ190eXBlYCB3aWxsIGJlIGBpbnRgOyBpZiBpdCB0YWtlcyBhbiBgdW5zaWduZWQgbG9uZ2AsIGBhcmdfdHlwZWAgd2lsbCBiZSBgdW5zaWduZWQgbG9uZ2A7IGFuZCBzbyBvbi4KKyAgMS4gR29vZ2xlIE1vY2sgZG9lc24ndCBndWFyYW50ZWUgd2hlbiBvciBob3cgbWFueSB0aW1lcyBhIG1hdGNoZXIgd2lsbCBiZSBpbnZva2VkLiBUaGVyZWZvcmUgdGhlIG1hdGNoZXIgbG9naWMgbXVzdCBiZSBfcHVyZWx5IGZ1bmN0aW9uYWxfIChpLmUuIGl0IGNhbm5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdCwgYW5kIHRoZSByZXN1bHQgbXVzdCBub3QgZGVwZW5kIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYW5kIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMpLiBUaGlzIHJlcXVpcmVtZW50IG11c3QgYmUgc2F0aXNmaWVkIG5vIG1hdHRlciBob3cgeW91IGRlZmluZSB0aGUgbWF0Y2hlciAoZS5nLiB1c2luZyBvbmUgb2YgdGhlIG1ldGhvZHMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgcmVjaXBlcykuIEluIHBhcnRpY3VsYXIsIGEgbWF0Y2hlciBjYW4gbmV2ZXIgY2FsbCBhIG1vY2sgZnVuY3Rpb24sIGFzIHRoYXQgd2lsbCBhZmZlY3QgdGhlIHN0YXRlIG9mIHRoZSBtb2NrIG9iamVjdCBhbmQgR29vZ2xlIE1vY2suCisKKyMjIFdyaXRpbmcgTmV3IFBhcmFtZXRlcml6ZWQgTWF0Y2hlcnMgUXVpY2tseSAjIworCitTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gZGVmaW5lIGEgbWF0Y2hlciB0aGF0IGhhcyBwYXJhbWV0ZXJzLiAgRm9yIHRoYXQgeW91CitjYW4gdXNlIHRoZSBtYWNybzoKK2BgYAorTUFUQ0hFUl9QKG5hbWUsIHBhcmFtX25hbWUsICJkZXNjcmlwdGlvbiBzdHJpbmciKSB7IHN0YXRlbWVudHM7IH0KK2BgYAorCitGb3IgZXhhbXBsZToKK2BgYAorTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlLCAiIikgeyByZXR1cm4gYWJzKGFyZykgPT0gdmFsdWU7IH0KK2BgYAord2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6CitgYGAKKyAgRVhQRUNUX1RIQVQoQmxhaCgiYSIpLCBIYXNBYnNvbHV0ZVZhbHVlKG4pKTsKK2BgYAord2hpY2ggbWF5IGxlYWQgdG8gdGhpcyBtZXNzYWdlIChhc3N1bWluZyBgbmAgaXMgMTApOgorYGBgCisgIFZhbHVlIG9mOiBCbGFoKCJhIikKKyAgRXhwZWN0ZWQ6IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxMAorICAgIEFjdHVhbDogLTkKK2BgYAorCitOb3RlIHRoYXQgYm90aCB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBhcmUKK3ByaW50ZWQsIG1ha2luZyB0aGUgbWVzc2FnZSBodW1hbi1mcmllbmRseS4KKworSW4gdGhlIG1hdGNoZXIgZGVmaW5pdGlvbiBib2R5LCB5b3UgY2FuIHdyaXRlIGBmb29fdHlwZWAgdG8KK3JlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZCBgZm9vYC4gIEZvciBleGFtcGxlLCBpbiB0aGUKK2JvZHkgb2YgYE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSlgIGFib3ZlLCB5b3UgY2FuIHdyaXRlCitgdmFsdWVfdHlwZWAgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgYHZhbHVlYC4KKworR29vZ2xlIE1vY2sgYWxzbyBwcm92aWRlcyBgTUFUQ0hFUl9QMmAsIGBNQVRDSEVSX1AzYCwgLi4uLCB1cCB0bworYE1BVENIRVJfUDEwYCB0byBzdXBwb3J0IG11bHRpLXBhcmFtZXRlciBtYXRjaGVyczoKK2BgYAorTUFUQ0hFUl9QayhuYW1lLCBwYXJhbV8xLCAuLi4sIHBhcmFtX2ssICJkZXNjcmlwdGlvbiBzdHJpbmciKSB7IHN0YXRlbWVudHM7IH0KK2BgYAorCitQbGVhc2Ugbm90ZSB0aGF0IHRoZSBjdXN0b20gZGVzY3JpcHRpb24gc3RyaW5nIGlzIGZvciBhIHBhcnRpY3VsYXIKKyoqaW5zdGFuY2UqKiBvZiB0aGUgbWF0Y2hlciwgd2hlcmUgdGhlIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGJvdW5kIHRvCithY3R1YWwgdmFsdWVzLiAgVGhlcmVmb3JlIHVzdWFsbHkgeW91J2xsIHdhbnQgdGhlIHBhcmFtZXRlciB2YWx1ZXMgdG8KK2JlIHBhcnQgb2YgdGhlIGRlc2NyaXB0aW9uLiAgR29vZ2xlIE1vY2sgbGV0cyB5b3UgZG8gdGhhdCB1c2luZworUHl0aG9uLXN0eWxlIGludGVycG9sYXRpb25zLiAgVGhlIGZvbGxvd2luZyBzeW50YXhlcyBhcmUgc3VwcG9ydGVkCitjdXJyZW50bHk6CisKK3wgYCUlYCB8IGEgc2luZ2xlIGAlYCBjaGFyYWN0ZXIgfAorfDotLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGAlKCopc2AgfCBhbGwgcGFyYW1ldGVycyBvZiB0aGUgbWF0Y2hlciBwcmludGVkIGFzIGEgdHVwbGUgfAorfCBgJShmb28pc2AgfCB2YWx1ZSBvZiB0aGUgbWF0Y2hlciBwYXJhbWV0ZXIgbmFtZWQgYGZvb2AgfAorCitGb3IgZXhhbXBsZSwKK2BgYAorICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksICJpcyBpbiByYW5nZSBbJShsb3cpcywgJShoaSlzXSIpIHsKKyAgICByZXR1cm4gbG93IDw9IGFyZyAmJiBhcmcgPD0gaGk7CisgIH0KKyAgLi4uCisgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOworYGBgCit3b3VsZCBnZW5lcmF0ZSBhIGZhaWx1cmUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZToKK2BgYAorICBFeHBlY3RlZDogaXMgaW4gcmFuZ2UgWzQsIDZdCitgYGAKKworSWYgeW91IHNwZWNpZnkgYCIiYCBhcyB0aGUgZGVzY3JpcHRpb24sIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugd2lsbAorY29udGFpbiB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBmb2xsb3dlZCBieSB0aGUKK3BhcmFtZXRlciB2YWx1ZXMgcHJpbnRlZCBhcyBhIHR1cGxlLiAgRm9yIGV4YW1wbGUsCitgYGAKKyAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLCAiIikgeyAuLi4gfQorICAuLi4KKyAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7CitgYGAKK3dvdWxkIGdlbmVyYXRlIGEgZmFpbHVyZSB0aGF0IGNvbnRhaW5zIHRoZSB0ZXh0OgorYGBgCisgIEV4cGVjdGVkOiBpbiBjbG9zZWQgcmFuZ2UgKDQsIDYpCitgYGAKKworRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3CitgYGAKK01BVENIRVJfUGsoRm9vLCBwMSwgLi4uLCBwaywgImRlc2NyaXB0aW9uIHN0cmluZyIpIHsgLi4uIH0KK2BgYAorYXMgc2hvcnRoYW5kIGZvcgorYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPgorRm9vTWF0Y2hlclBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4KK0ZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0KK2BgYAorCitXaGVuIHlvdSB3cml0ZSBgRm9vKHYxLCAuLi4sIHZrKWAsIHRoZSBjb21waWxlciBpbmZlcnMgdGhlIHR5cGVzIG9mCit0aGUgcGFyYW1ldGVycyBgdjFgLCAuLi4sIGFuZCBgdmtgIGZvciB5b3UuICBJZiB5b3UgYXJlIG5vdCBoYXBweSB3aXRoCit0aGUgcmVzdWx0IG9mIHRoZSB0eXBlIGluZmVyZW5jZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSB0eXBlcyBieQorZXhwbGljaXRseSBpbnN0YW50aWF0aW5nIHRoZSB0ZW1wbGF0ZSwgYXMgaW4gYEZvbzxsb25nLCBib29sPig1LCBmYWxzZSlgLgorQXMgc2FpZCBlYXJsaWVyLCB5b3UgZG9uJ3QgZ2V0IHRvIChvciBuZWVkIHRvKSBzcGVjaWZ5CitgYXJnX3R5cGVgIGFzIHRoYXQncyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBtYXRjaGVyCitpcyB1c2VkLgorCitZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24gYEZvbyhwMSwgLi4uLCBwaylgIHRvIGEKK3ZhcmlhYmxlIG9mIHR5cGUgYEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+YC4gIFRoaXMgY2FuIGJlCit1c2VmdWwgd2hlbiBjb21wb3NpbmcgbWF0Y2hlcnMuICBNYXRjaGVycyB0aGF0IGRvbid0IGhhdmUgYSBwYXJhbWV0ZXIKK29yIGhhdmUgb25seSBvbmUgcGFyYW1ldGVyIGhhdmUgc3BlY2lhbCB0eXBlczogeW91IGNhbiBhc3NpZ24gYEZvbygpYAordG8gYSBgRm9vTWF0Y2hlcmAtdHlwZWQgdmFyaWFibGUsIGFuZCBhc3NpZ24gYEZvbyhwKWAgdG8gYQorYEZvb01hdGNoZXJQPHBfdHlwZT5gLXR5cGVkIHZhcmlhYmxlLgorCitXaGlsZSB5b3UgY2FuIGluc3RhbnRpYXRlIGEgbWF0Y2hlciB0ZW1wbGF0ZSB3aXRoIHJlZmVyZW5jZSB0eXBlcywKK3Bhc3NpbmcgdGhlIHBhcmFtZXRlcnMgYnkgcG9pbnRlciB1c3VhbGx5IG1ha2VzIHlvdXIgY29kZSBtb3JlCityZWFkYWJsZS4gIElmLCBob3dldmVyLCB5b3Ugc3RpbGwgd2FudCB0byBwYXNzIGEgcGFyYW1ldGVyIGJ5CityZWZlcmVuY2UsIGJlIGF3YXJlIHRoYXQgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlCittYXRjaGVyIHlvdSB3aWxsIHNlZSB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGJ1dCBub3QgaXRzCithZGRyZXNzLgorCitZb3UgY2FuIG92ZXJsb2FkIG1hdGNoZXJzIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgcGFyYW1ldGVyczoKK2BgYAorTUFUQ0hFUl9QKEJsYWgsIGEsICJkZXNjcmlwdGlvbiBzdHJpbmcgMSIpIHsgLi4uIH0KK01BVENIRVJfUDIoQmxhaCwgYSwgYiwgImRlc2NyaXB0aW9uIHN0cmluZyAyIikgeyAuLi4gfQorYGBgCisKK1doaWxlIGl0J3MgdGVtcHRpbmcgdG8gYWx3YXlzIHVzZSB0aGUgYE1BVENIRVIqYCBtYWNyb3Mgd2hlbiBkZWZpbmluZworYSBuZXcgbWF0Y2hlciwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZworYE1hdGNoZXJJbnRlcmZhY2VgIG9yIHVzaW5nIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgIGluc3RlYWQgKHNlZQordGhlIHJlY2lwZXMgdGhhdCBmb2xsb3cpLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvIHVzZSB0aGUgbWF0Y2hlciBhCitsb3QuICBXaGlsZSB0aGVzZSBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrLCB0aGV5IGdpdmUgeW91IG1vcmUKK2NvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZCB0aGUgbWF0Y2hlcgorcGFyYW1ldGVycywgd2hpY2ggaW4gZ2VuZXJhbCBsZWFkcyB0byBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMKK3RoYXQgcGF5IG9mZiBpbiB0aGUgbG9uZyBydW4uICBUaGV5IGFsc28gYWxsb3cgb3ZlcmxvYWRpbmcgbWF0Y2hlcnMKK2Jhc2VkIG9uIHBhcmFtZXRlciB0eXBlcyAoYXMgb3Bwb3NlZCB0byBqdXN0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YKK3BhcmFtZXRlcnMpLgorCisjIyBXcml0aW5nIE5ldyBNb25vbW9ycGhpYyBNYXRjaGVycyAjIworCitBIG1hdGNoZXIgb2YgYXJndW1lbnQgdHlwZSBgVGAgaW1wbGVtZW50cworYDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxUPmAgYW5kIGRvZXMgdHdvIHRoaW5nczogaXQgdGVzdHMgd2hldGhlciBhCit2YWx1ZSBvZiB0eXBlIGBUYCBtYXRjaGVzIHRoZSBtYXRjaGVyLCBhbmQgY2FuIGRlc2NyaWJlIHdoYXQga2luZCBvZgordmFsdWVzIGl0IG1hdGNoZXMuIFRoZSBsYXR0ZXIgYWJpbGl0eSBpcyB1c2VkIGZvciBnZW5lcmF0aW5nIHJlYWRhYmxlCitlcnJvciBtZXNzYWdlcyB3aGVuIGV4cGVjdGF0aW9ucyBhcmUgdmlvbGF0ZWQuCisKK1RoZSBpbnRlcmZhY2UgbG9va3MgbGlrZSB0aGlzOgorCitgYGAKK2NsYXNzIE1hdGNoUmVzdWx0TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIC8vIFN0cmVhbXMgeCB0byB0aGUgdW5kZXJseWluZyBvc3RyZWFtOyBkb2VzIG5vdGhpbmcgaWYgdGhlIG9zdHJlYW0KKyAgLy8gaXMgTlVMTC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIE1hdGNoUmVzdWx0TGlzdGVuZXImIG9wZXJhdG9yPDwoY29uc3QgVCYgeCk7CisKKyAgLy8gUmV0dXJucyB0aGUgdW5kZXJseWluZyBvc3RyZWFtLgorICA6OnN0ZDo6b3N0cmVhbSogc3RyZWFtKCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIE1hdGNoZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+TWF0Y2hlckludGVyZmFjZSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG1hdGNoZXIgbWF0Y2hlcyB4OyBhbHNvIGV4cGxhaW5zIHRoZSBtYXRjaAorICAvLyByZXN1bHQgdG8gJ2xpc3RlbmVyJy4KKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCA9IDA7CisKKyAgLy8gRGVzY3JpYmVzIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKKworICAvLyBEZXNjcmliZXMgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Cit9OworYGBgCisKK0lmIHlvdSBuZWVkIGEgY3VzdG9tIG1hdGNoZXIgYnV0IGBUcnVseSgpYCBpcyBub3QgYSBnb29kIG9wdGlvbiAoZm9yCitleGFtcGxlLCB5b3UgbWF5IG5vdCBiZSBoYXBweSB3aXRoIHRoZSB3YXkgYFRydWx5KHByZWRpY2F0ZSlgCitkZXNjcmliZXMgaXRzZWxmLCBvciB5b3UgbWF5IHdhbnQgeW91ciBtYXRjaGVyIHRvIGJlIHBvbHltb3JwaGljIGFzCitgRXEodmFsdWUpYCBpcyksIHlvdSBjYW4gZGVmaW5lIGEgbWF0Y2hlciB0byBkbyB3aGF0ZXZlciB5b3Ugd2FudCBpbgordHdvIHN0ZXBzOiBmaXJzdCBpbXBsZW1lbnQgdGhlIG1hdGNoZXIgaW50ZXJmYWNlLCBhbmQgdGhlbiBkZWZpbmUgYQorZmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBtYXRjaGVyIGluc3RhbmNlLiBUaGUgc2Vjb25kIHN0ZXAgaXMgbm90CitzdHJpY3RseSBuZWVkZWQgYnV0IGl0IG1ha2VzIHRoZSBzeW50YXggb2YgdXNpbmcgdGhlIG1hdGNoZXIgbmljZXIuCisKK0ZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBhIG1hdGNoZXIgdG8gdGVzdCB3aGV0aGVyIGFuIGBpbnRgIGlzCitkaXZpc2libGUgYnkgNyBhbmQgdGhlbiB1c2UgaXQgbGlrZSB0aGlzOgorYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VNYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworCitjbGFzcyBEaXZpc2libGVCeTdNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCBuLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIHJldHVybiAobiAlIDcpID09IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImlzIGRpdmlzaWJsZSBieSA3IjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBub3QgZGl2aXNpYmxlIGJ5IDciOworICB9Cit9OworCitpbmxpbmUgTWF0Y2hlcjxpbnQ+IERpdmlzaWJsZUJ5NygpIHsKKyAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBEaXZpc2libGVCeTdNYXRjaGVyKTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKERpdmlzaWJsZUJ5NygpKSk7CitgYGAKKworWW91IG1heSBpbXByb3ZlIHRoZSBtYXRjaGVyIG1lc3NhZ2UgYnkgc3RyZWFtaW5nIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIHRvIHRoZSBgbGlzdGVuZXJgIGFyZ3VtZW50IGluIGBNYXRjaEFuZEV4cGxhaW4oKWA6CisKK2BgYAorY2xhc3MgRGl2aXNpYmxlQnk3TWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPGludD4geworIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGNvbnN0IGludCByZW1haW5kZXIgPSBuICUgNzsKKyAgICBpZiAocmVtYWluZGVyICE9IDApIHsKKyAgICAgICpsaXN0ZW5lciA8PCAidGhlIHJlbWFpbmRlciBpcyAiIDw8IHJlbWFpbmRlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlbWFpbmRlciA9PSAwOworICB9CisgIC4uLgorfTsKK2BgYAorCitUaGVuLCBgRVhQRUNUX1RIQVQoeCwgRGl2aXNpYmxlQnk3KCkpO2AgbWF5IGdlbmVyYWwgYSBtZXNzYWdlIGxpa2UgdGhpczoKK2BgYAorVmFsdWUgb2Y6IHgKK0V4cGVjdGVkOiBpcyBkaXZpc2libGUgYnkgNworICBBY3R1YWw6IDIzICh0aGUgcmVtYWluZGVyIGlzIDIpCitgYGAKKworIyMgV3JpdGluZyBOZXcgUG9seW1vcnBoaWMgTWF0Y2hlcnMgIyMKKworWW91J3ZlIGxlYXJuZWQgaG93IHRvIHdyaXRlIHlvdXIgb3duIG1hdGNoZXJzIGluIHRoZSBwcmV2aW91cworcmVjaXBlLiBKdXN0IG9uZSBwcm9ibGVtOiBhIG1hdGNoZXIgY3JlYXRlZCB1c2luZyBgTWFrZU1hdGNoZXIoKWAgb25seQord29ya3MgZm9yIG9uZSBwYXJ0aWN1bGFyIHR5cGUgb2YgYXJndW1lbnRzLiBJZiB5b3Ugd2FudCBhCitfcG9seW1vcnBoaWNfIG1hdGNoZXIgdGhhdCB3b3JrcyB3aXRoIGFyZ3VtZW50cyBvZiBzZXZlcmFsIHR5cGVzIChmb3IKK2luc3RhbmNlLCBgRXEoeClgIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGEgYHZhbHVlYCBhcyBsb25nIGFzIGB2YWx1ZWAgPT0KK2B4YCBjb21waWxlcyAtLSBgdmFsdWVgIGFuZCBgeGAgZG9uJ3QgaGF2ZSB0byBzaGFyZSB0aGUgc2FtZSB0eXBlKSwKK3lvdSBjYW4gbGVhcm4gdGhlIHRyaWNrIGZyb20gYDxnbW9jay9nbW9jay1tYXRjaGVycy5oPmAgYnV0IGl0J3MgYSBiaXQKK2ludm9sdmVkLgorCitGb3J0dW5hdGVseSwgbW9zdCBvZiB0aGUgdGltZSB5b3UgY2FuIGRlZmluZSBhIHBvbHltb3JwaGljIG1hdGNoZXIKK2Vhc2lseSB3aXRoIHRoZSBoZWxwIG9mIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgLiBIZXJlJ3MgaG93IHlvdSBjYW4KK2RlZmluZSBgTm90TnVsbCgpYCBhcyBhbiBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKK3VzaW5nIDo6dGVzdGluZzo6UG9seW1vcnBoaWNNYXRjaGVyOworCitjbGFzcyBOb3ROdWxsTWF0Y2hlciB7CisgcHVibGljOgorICAvLyBUbyBpbXBsZW1lbnQgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLCBmaXJzdCBkZWZpbmUgYSBDT1BZQUJMRSBjbGFzcworICAvLyB0aGF0IGhhcyB0aHJlZSBtZW1iZXJzIE1hdGNoQW5kRXhwbGFpbigpLCBEZXNjcmliZVRvKCksIGFuZAorICAvLyBEZXNjcmliZU5lZ2F0aW9uVG8oKSwgbGlrZSB0aGUgZm9sbG93aW5nLgorCisgIC8vIEluIHRoaXMgZXhhbXBsZSwgd2Ugd2FudCB0byB1c2UgTm90TnVsbCgpIHdpdGggYW55IHBvaW50ZXIsIHNvCisgIC8vIE1hdGNoQW5kRXhwbGFpbigpIGFjY2VwdHMgYSBwb2ludGVyIG9mIGFueSB0eXBlIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4KKyAgLy8gSW4gZ2VuZXJhbCwgeW91IGNhbiBkZWZpbmUgTWF0Y2hBbmRFeHBsYWluKCkgYXMgYW4gb3JkaW5hcnkgbWV0aG9kIG9yCisgIC8vIGEgbWV0aG9kIHRlbXBsYXRlLCBvciBldmVuIG92ZXJsb2FkIGl0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gcCAhPSBOVUxMOworICB9CisKKyAgLy8gRGVzY3JpYmVzIHRoZSBwcm9wZXJ0eSBvZiBhIHZhbHVlIG1hdGNoaW5nIHRoaXMgbWF0Y2hlci4KKyAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImlzIG5vdCBOVUxMIjsgfQorCisgIC8vIERlc2NyaWJlcyB0aGUgcHJvcGVydHkgb2YgYSB2YWx1ZSBOT1QgbWF0Y2hpbmcgdGhpcyBtYXRjaGVyLgorICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpcyBOVUxMIjsgfQorfTsKKworLy8gVG8gY29uc3RydWN0IGEgcG9seW1vcnBoaWMgbWF0Y2hlciwgcGFzcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MKKy8vIHRvIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKS4gIE5vdGUgdGhlIHJldHVybiB0eXBlLgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxOb3ROdWxsTWF0Y2hlcj4gTm90TnVsbCgpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTm90TnVsbE1hdGNoZXIoKSk7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJhcihOb3ROdWxsKCkpKTsgIC8vIFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLU5VTEwgcG9pbnRlci4KK2BgYAorCisqKk5vdGU6KiogWW91ciBwb2x5bW9ycGhpYyBtYXRjaGVyIGNsYXNzIGRvZXMgKipub3QqKiBuZWVkIHRvIGluaGVyaXQgZnJvbQorYE1hdGNoZXJJbnRlcmZhY2VgIG9yIGFueSBvdGhlciBjbGFzcywgYW5kIGl0cyBtZXRob2RzIGRvICoqbm90KiogbmVlZAordG8gYmUgdmlydHVhbC4KKworTGlrZSBpbiBhIG1vbm9tb3JwaGljIG1hdGNoZXIsIHlvdSBtYXkgZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0IGJ5CitzdHJlYW1pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgYGxpc3RlbmVyYCBhcmd1bWVudCBpbgorYE1hdGNoQW5kRXhwbGFpbigpYC4KKworIyMgV3JpdGluZyBOZXcgQ2FyZGluYWxpdGllcyAjIworCitBIGNhcmRpbmFsaXR5IGlzIHVzZWQgaW4gYFRpbWVzKClgIHRvIHRlbGwgR29vZ2xlIE1vY2sgaG93IG1hbnkgdGltZXMKK3lvdSBleHBlY3QgYSBjYWxsIHRvIG9jY3VyLiBJdCBkb2Vzbid0IGhhdmUgdG8gYmUgZXhhY3QuIEZvciBleGFtcGxlLAoreW91IGNhbiBzYXkgYEF0TGVhc3QoNSlgIG9yIGBCZXR3ZWVuKDIsIDQpYC4KKworSWYgdGhlIGJ1aWx0LWluIHNldCBvZiBjYXJkaW5hbGl0aWVzIGRvZXNuJ3Qgc3VpdCB5b3UsIHlvdSBhcmUgZnJlZSB0bworZGVmaW5lIHlvdXIgb3duIGJ5IGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIGludGVyZmFjZSAoaW4gbmFtZXNwYWNlCitgdGVzdGluZ2ApOgorCitgYGAKK2NsYXNzIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNhcmRpbmFsaXR5SW50ZXJmYWNlKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0aXNmeSB0aGlzIGNhcmRpbmFsaXR5LgorICB2aXJ0dWFsIGJvb2wgSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCA9IDA7CisKKyAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbS4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7Cit9OworYGBgCisKK0ZvciBleGFtcGxlLCB0byBzcGVjaWZ5IHRoYXQgYSBjYWxsIG11c3Qgb2NjdXIgZXZlbiBudW1iZXIgb2YgdGltZXMsCit5b3UgY2FuIHdyaXRlCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpDYXJkaW5hbGl0eTsKK3VzaW5nIDo6dGVzdGluZzo6Q2FyZGluYWxpdHlJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VDYXJkaW5hbGl0eTsKKworY2xhc3MgRXZlbk51bWJlckNhcmRpbmFsaXR5IDogcHVibGljIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIChjYWxsX2NvdW50ICUgMikgPT0gMDsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiOworICB9Cit9OworCitDYXJkaW5hbGl0eSBFdmVuTnVtYmVyKCkgeworICByZXR1cm4gTWFrZUNhcmRpbmFsaXR5KG5ldyBFdmVuTnVtYmVyQ2FyZGluYWxpdHkpOworfQorLi4uCisKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMykpCisgICAgICAuVGltZXMoRXZlbk51bWJlcigpKTsKK2BgYAorCisjIyBXcml0aW5nIE5ldyBBY3Rpb25zIFF1aWNrbHkgIyMKKworSWYgdGhlIGJ1aWx0LWluIGFjdGlvbnMgZG9uJ3Qgd29yayBmb3IgeW91LCBhbmQgeW91IGZpbmQgaXQKK2luY29udmVuaWVudCB0byB1c2UgYEludm9rZSgpYCwgeW91IGNhbiB1c2UgYSBtYWNybyBmcm9tIHRoZSBgQUNUSU9OKmAKK2ZhbWlseSB0byBxdWlja2x5IGRlZmluZSBhIG5ldyBhY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB5b3VyIGNvZGUgYXMKK2lmIGl0J3MgYSBidWlsdC1pbiBhY3Rpb24uCisKK0J5IHdyaXRpbmcKK2BgYAorQUNUSU9OKG5hbWUpIHsgc3RhdGVtZW50czsgfQorYGBgCitpbiBhIG5hbWVzcGFjZSBzY29wZSAoaS5lLiBub3QgaW5zaWRlIGEgY2xhc3Mgb3IgZnVuY3Rpb24pLCB5b3Ugd2lsbAorZGVmaW5lIGFuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhlY3V0ZXMgdGhlIHN0YXRlbWVudHMuCitUaGUgdmFsdWUgcmV0dXJuZWQgYnkgYHN0YXRlbWVudHNgIHdpbGwgYmUgdXNlZCBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mCit0aGUgYWN0aW9uLiAgSW5zaWRlIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuIHJlZmVyIHRvIHRoZSBLLXRoCisoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXMgYGFyZ0tgLiAgRm9yIGV4YW1wbGU6CitgYGAKK0FDVElPTihJbmNyZW1lbnRBcmcxKSB7IHJldHVybiArKygqYXJnMSk7IH0KK2BgYAorYWxsb3dzIHlvdSB0byB3cml0ZQorYGBgCisuLi4gV2lsbE9uY2UoSW5jcmVtZW50QXJnMSgpKTsKK2BgYAorCitOb3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KK2FyZ3VtZW50cy4gIFJlc3QgYXNzdXJlZCB0aGF0IHlvdXIgY29kZSBpcyB0eXBlLXNhZmUgdGhvdWdoOgoreW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmIGAqYXJnMWAgZG9lc24ndCBzdXBwb3J0IHRoZSBgKytgCitvcGVyYXRvciwgb3IgaWYgdGhlIHR5cGUgb2YgYCsrKCphcmcxKWAgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZSBtb2NrCitmdW5jdGlvbidzIHJldHVybiB0eXBlLgorCitBbm90aGVyIGV4YW1wbGU6CitgYGAKK0FDVElPTihGb28pIHsKKyAgKCphcmcyKSg1KTsKKyAgQmxhaCgpOworICAqYXJnMSA9IDA7CisgIHJldHVybiBhcmcwOworfQorYGBgCitkZWZpbmVzIGFuIGFjdGlvbiBgRm9vKClgIHRoYXQgaW52b2tlcyBhcmd1bWVudCAjMiAoYSBmdW5jdGlvbiBwb2ludGVyKQord2l0aCA1LCBjYWxscyBmdW5jdGlvbiBgQmxhaCgpYCwgc2V0cyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBhcmd1bWVudAorIzEgdG8gMCwgYW5kIHJldHVybnMgYXJndW1lbnQgIzAuCisKK0ZvciBtb3JlIGNvbnZlbmllbmNlIGFuZCBmbGV4aWJpbGl0eSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgZm9sbG93aW5nCitwcmUtZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBib2R5IG9mIGBBQ1RJT05gOgorCit8IGBhcmdLX3R5cGVgIHwgVGhlIHR5cGUgb2YgdGhlIEstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHwKK3w6LS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgYXJnc2AgICAgICB8IEFsbCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXMgYSB0dXBsZSAgICAgICAgICAgICAgICB8Cit8IGBhcmdzX3R5cGVgIHwgVGhlIHR5cGUgb2YgYWxsIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcyBhIHR1cGxlICAgIHwKK3wgYHJldHVybl90eXBlYCB8IFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbW9jayBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBmdW5jdGlvbl90eXBlYCB8IFRoZSB0eXBlIG9mIHRoZSBtb2NrIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKK0ZvciBleGFtcGxlLCB3aGVuIHVzaW5nIGFuIGBBQ1RJT05gIGFzIGEgc3R1YiBhY3Rpb24gZm9yIG1vY2sgZnVuY3Rpb246CitgYGAKK2ludCBEb1NvbWV0aGluZyhib29sIGZsYWcsIGludCogcHRyKTsKK2BgYAord2UgaGF2ZToKK3wgKipQcmUtZGVmaW5lZCBTeW1ib2wqKiB8ICoqSXMgQm91bmQgVG8qKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tfAorfCBgYXJnMGAgICAgICAgICAgICAgICAgIHwgdGhlIHZhbHVlIG9mIGBmbGFnYCB8Cit8IGBhcmcwX3R5cGVgICAgICAgICAgICAgfCB0aGUgdHlwZSBgYm9vbGAgfAorfCBgYXJnMWAgICAgICAgICAgICAgICAgIHwgdGhlIHZhbHVlIG9mIGBwdHJgIHwKK3wgYGFyZzFfdHlwZWAgICAgICAgICAgICB8IHRoZSB0eXBlIGBpbnQqYCB8Cit8IGBhcmdzYCAgICAgICAgICAgICAgICAgfCB0aGUgdHVwbGUgYChmbGFnLCBwdHIpYCB8Cit8IGBhcmdzX3R5cGVgICAgICAgICAgICAgfCB0aGUgdHlwZSBgc3RkOjp0cjE6OnR1cGxlPGJvb2wsIGludCo+YCB8Cit8IGByZXR1cm5fdHlwZWAgICAgICAgICAgfCB0aGUgdHlwZSBgaW50YCAgfAorfCBgZnVuY3Rpb25fdHlwZWAgICAgICAgIHwgdGhlIHR5cGUgYGludChib29sLCBpbnQqKWAgfAorCisjIyBXcml0aW5nIE5ldyBQYXJhbWV0ZXJpemVkIEFjdGlvbnMgUXVpY2tseSAjIworCitTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIGFuIGFjdGlvbiB5b3UgZGVmaW5lLiAgRm9yIHRoYXQKK3dlIGhhdmUgYW5vdGhlciBtYWNybworYGBgCitBQ1RJT05fUChuYW1lLCBwYXJhbSkgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKworRm9yIGV4YW1wbGUsCitgYGAKK0FDVElPTl9QKEFkZCwgbikgeyByZXR1cm4gYXJnMCArIG47IH0KK2BgYAord2lsbCBhbGxvdyB5b3UgdG8gd3JpdGUKK2BgYAorLy8gUmV0dXJucyBhcmd1bWVudCAjMCArIDUuCisuLi4gV2lsbE9uY2UoQWRkKDUpKTsKK2BgYAorCitGb3IgY29udmVuaWVuY2UsIHdlIHVzZSB0aGUgdGVybSBfYXJndW1lbnRzXyBmb3IgdGhlIHZhbHVlcyB1c2VkIHRvCitpbnZva2UgdGhlIG1vY2sgZnVuY3Rpb24sIGFuZCB0aGUgdGVybSBfcGFyYW1ldGVyc18gZm9yIHRoZSB2YWx1ZXMKK3VzZWQgdG8gaW5zdGFudGlhdGUgYW4gYWN0aW9uLgorCitOb3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gcHJvdmlkZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGVpdGhlci4KK1N1cHBvc2UgdGhlIHBhcmFtZXRlciBpcyBuYW1lZCBgcGFyYW1gLCB5b3UgY2FuIGFsc28gdXNlIHRoZQorR29vZ2xlLU1vY2stZGVmaW5lZCBzeW1ib2wgYHBhcmFtX3R5cGVgIHRvIHJlZmVyIHRvIHRoZSB0eXBlIG9mIHRoZQorcGFyYW1ldGVyIGFzIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIEZvciBleGFtcGxlLCBpbiB0aGUgYm9keSBvZgorYEFDVElPTl9QKEFkZCwgbilgIGFib3ZlLCB5b3UgY2FuIHdyaXRlIGBuX3R5cGVgIGZvciB0aGUgdHlwZSBvZiBgbmAuCisKK0dvb2dsZSBNb2NrIGFsc28gcHJvdmlkZXMgYEFDVElPTl9QMmAsIGBBQ1RJT05fUDNgLCBhbmQgZXRjIHRvIHN1cHBvcnQKK211bHRpLXBhcmFtZXRlciBhY3Rpb25zLiAgRm9yIGV4YW1wbGUsCitgYGAKK0FDVElPTl9QMihSZXR1cm5EaXN0YW5jZVRvLCB4LCB5KSB7CisgIGRvdWJsZSBkeCA9IGFyZzAgLSB4OworICBkb3VibGUgZHkgPSBhcmcxIC0geTsKKyAgcmV0dXJuIHNxcnQoZHgqZHggKyBkeSpkeSk7Cit9CitgYGAKK2xldHMgeW91IHdyaXRlCitgYGAKKy4uLiBXaWxsT25jZShSZXR1cm5EaXN0YW5jZVRvKDUuMCwgMjYuNSkpOworYGBgCisKK1lvdSBjYW4gdmlldyBgQUNUSU9OYCBhcyBhIGRlZ2VuZXJhdGVkIHBhcmFtZXRlcml6ZWQgYWN0aW9uIHdoZXJlIHRoZQorbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgMC4KKworWW91IGNhbiBhbHNvIGVhc2lseSBkZWZpbmUgYWN0aW9ucyBvdmVybG9hZGVkIG9uIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyczoKK2BgYAorQUNUSU9OX1AoUGx1cywgYSkgeyAuLi4gfQorQUNUSU9OX1AyKFBsdXMsIGEsIGIpIHsgLi4uIH0KK2BgYAorCisjIyBSZXN0cmljdGluZyB0aGUgVHlwZSBvZiBhbiBBcmd1bWVudCBvciBQYXJhbWV0ZXIgaW4gYW4gQUNUSU9OICMjCisKK0ZvciBtYXhpbXVtIGJyZXZpdHkgYW5kIHJldXNhYmlsaXR5LCB0aGUgYEFDVElPTipgIG1hY3JvcyBkb24ndCBhc2sKK3lvdSB0byBwcm92aWRlIHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIHRoZSBhY3Rpb24KK3BhcmFtZXRlcnMuICBJbnN0ZWFkLCB3ZSBsZXQgdGhlIGNvbXBpbGVyIGluZmVyIHRoZSB0eXBlcyBmb3IgdXMuCisKK1NvbWV0aW1lcywgaG93ZXZlciwgd2UgbWF5IHdhbnQgdG8gYmUgbW9yZSBleHBsaWNpdCBhYm91dCB0aGUgdHlwZXMuCitUaGVyZSBhcmUgc2V2ZXJhbCB0cmlja3MgdG8gZG8gdGhhdC4gIEZvciBleGFtcGxlOgorYGBgCitBQ1RJT04oRm9vKSB7CisgIC8vIE1ha2VzIHN1cmUgYXJnMCBjYW4gYmUgY29udmVydGVkIHRvIGludC4KKyAgaW50IG4gPSBhcmcwOworICAuLi4gdXNlIG4gaW5zdGVhZCBvZiBhcmcwIGhlcmUgLi4uCit9CisKK0FDVElPTl9QKEJhciwgcGFyYW0pIHsKKyAgLy8gTWFrZXMgc3VyZSB0aGUgdHlwZSBvZiBhcmcxIGlzIGNvbnN0IGNoYXIqLgorICA6OnRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBjaGFyKiwgYXJnMV90eXBlPigpOworCisgIC8vIE1ha2VzIHN1cmUgcGFyYW0gY2FuIGJlIGNvbnZlcnRlZCB0byBib29sLgorICBib29sIGZsYWcgPSBwYXJhbTsKK30KK2BgYAord2hlcmUgYFN0YXRpY0Fzc2VydFR5cGVFcWAgaXMgYSBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIGluIEdvb2dsZSBUZXN0Cit0aGF0IHZlcmlmaWVzIHR3byB0eXBlcyBhcmUgdGhlIHNhbWUuCisKKyMjIFdyaXRpbmcgTmV3IEFjdGlvbiBUZW1wbGF0ZXMgUXVpY2tseSAjIworCitTb21ldGltZXMgeW91IHdhbnQgdG8gZ2l2ZSBhbiBhY3Rpb24gZXhwbGljaXQgdGVtcGxhdGUgcGFyYW1ldGVycyB0aGF0CitjYW5ub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgdmFsdWUgcGFyYW1ldGVycy4gIGBBQ1RJT05fVEVNUExBVEUoKWAKK3N1cHBvcnRzIHRoYXQgYW5kIGNhbiBiZSB2aWV3ZWQgYXMgYW4gZXh0ZW5zaW9uIHRvIGBBQ1RJT04oKWAgYW5kCitgQUNUSU9OX1AqKClgLgorCitUaGUgc3ludGF4OgorYGBgCitBQ1RJT05fVEVNUExBVEUoQWN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICBIQVNfbV9URU1QTEFURV9QQVJBTVMoa2luZDEsIG5hbWUxLCAuLi4sIGtpbmRfbSwgbmFtZV9tKSwKKyAgICAgICAgICAgICAgICBBTkRfbl9WQUxVRV9QQVJBTVMocDEsIC4uLiwgcF9uKSkgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKworZGVmaW5lcyBhbiBhY3Rpb24gdGVtcGxhdGUgdGhhdCB0YWtlcyBfbV8gZXhwbGljaXQgdGVtcGxhdGUgcGFyYW1ldGVycworYW5kIF9uXyB2YWx1ZSBwYXJhbWV0ZXJzLCB3aGVyZSBfbV8gaXMgYmV0d2VlbiAxIGFuZCAxMCwgYW5kIF9uXyBpcworYmV0d2VlbiAwIGFuZCAxMC4gIGBuYW1lX2lgIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoIHRlbXBsYXRlCitwYXJhbWV0ZXIsIGFuZCBga2luZF9pYCBzcGVjaWZpZXMgd2hldGhlciBpdCdzIGEgYHR5cGVuYW1lYCwgYW4KK2ludGVncmFsIGNvbnN0YW50LCBvciBhIHRlbXBsYXRlLiAgYHBfaWAgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGggdmFsdWUKK3BhcmFtZXRlci4KKworRXhhbXBsZToKK2BgYAorLy8gRHVwbGljYXRlQXJnPGssIFQ+KG91dHB1dCkgY29udmVydHMgdGhlIGstdGggYXJndW1lbnQgb2YgdGhlIG1vY2sKKy8vIGZ1bmN0aW9uIHRvIHR5cGUgVCBhbmQgY29waWVzIGl0IHRvICpvdXRwdXQuCitBQ1RJT05fVEVNUExBVEUoRHVwbGljYXRlQXJnLAorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhlIGNvbW1hIGJldHdlZW4gaW50IGFuZCBrOgorICAgICAgICAgICAgICAgIEhBU18yX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGssIHR5cGVuYW1lLCBUKSwKKyAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMob3V0cHV0KSkgeworICAqb3V0cHV0ID0gVChzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpKTsKK30KK2BgYAorCitUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRlbXBsYXRlLCB3cml0ZToKK2BgYAorICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbT4odjEsIC4uLiwgdl9uKQorYGBgCit3aGVyZSB0aGUgYHRgcyBhcmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgdGhlCitgdmBzIGFyZSB0aGUgdmFsdWUgYXJndW1lbnRzLiAgVGhlIHZhbHVlIGFyZ3VtZW50Cit0eXBlcyBhcmUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgRm9yIGV4YW1wbGU6CitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKy4uLgorICBpbnQgbjsKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKF8sIF8pKQorICAgICAgLldpbGxPbmNlKER1cGxpY2F0ZUFyZzwxLCB1bnNpZ25lZCBjaGFyPigmbikpOworYGBgCisKK0lmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdmFsdWUgYXJndW1lbnQgdHlwZXMsIHlvdSBjYW4KK3Byb3ZpZGUgYWRkaXRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudHM6CitgYGAKKyAgQWN0aW9uTmFtZTx0MSwgLi4uLCB0X20sIHUxLCAuLi4sIHVfaz4odjEsIC4uLiwgdl9uKQorYGBgCit3aGVyZSBgdV9pYCBpcyB0aGUgZGVzaXJlZCB0eXBlIG9mIGB2X2lgLgorCitgQUNUSU9OX1RFTVBMQVRFYCBhbmQgYEFDVElPTmAvYEFDVElPTl9QKmAgY2FuIGJlIG92ZXJsb2FkZWQgb24gdGhlCitudW1iZXIgb2YgdmFsdWUgcGFyYW1ldGVycywgYnV0IG5vdCBvbiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlCitwYXJhbWV0ZXJzLiAgV2l0aG91dCB0aGUgcmVzdHJpY3Rpb24sIHRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcgaXMKK3VuY2xlYXI6CisKK2BgYAorICBPdmVybG9hZGVkQWN0aW9uPGludCwgYm9vbD4oeCk7CitgYGAKKworQXJlIHdlIHVzaW5nIGEgc2luZ2xlLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24gd2hlcmUgYGJvb2xgIHJlZmVycyB0bwordGhlIHR5cGUgb2YgYHhgLCBvciBhIHR3by10ZW1wbGF0ZS1wYXJhbWV0ZXIgYWN0aW9uIHdoZXJlIHRoZSBjb21waWxlcgoraXMgYXNrZWQgdG8gaW5mZXIgdGhlIHR5cGUgb2YgYHhgPworCisjIyBVc2luZyB0aGUgQUNUSU9OIE9iamVjdCdzIFR5cGUgIyMKKworSWYgeW91IGFyZSB3cml0aW5nIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGBBQ1RJT05gIG9iamVjdCwgeW91J2xsCituZWVkIHRvIGtub3cgaXRzIHR5cGUuICBUaGUgdHlwZSBkZXBlbmRzIG9uIHRoZSBtYWNybyB1c2VkIHRvIGRlZmluZQordGhlIGFjdGlvbiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlcy4gIFRoZSBydWxlIGlzIHJlbGF0aXZlbHkgc2ltcGxlOgorfCAqKkdpdmVuIERlZmluaXRpb24qKiB8ICoqRXhwcmVzc2lvbioqIHwgKipIYXMgVHlwZSoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBQ1RJT04oRm9vKWAgICAgICAgIHwgYEZvbygpYCAgICAgICAgfCBgRm9vQWN0aW9uYCAgfAorfCBgQUNUSU9OX1RFTVBMQVRFKEZvbywgSEFTX21fVEVNUExBVEVfUEFSQU1TKC4uLiksIEFORF8wX1ZBTFVFX1BBUkFNUygpKWAgfAlgRm9vPHQxLCAuLi4sIHRfbT4oKWAgfCBgRm9vQWN0aW9uPHQxLCAuLi4sIHRfbT5gIHwKK3wgYEFDVElPTl9QKEJhciwgcGFyYW0pYCB8IGBCYXIoaW50X3ZhbHVlKWAgfCBgQmFyQWN0aW9uUDxpbnQ+YCB8Cit8IGBBQ1RJT05fVEVNUExBVEUoQmFyLCBIQVNfbV9URU1QTEFURV9QQVJBTVMoLi4uKSwgQU5EXzFfVkFMVUVfUEFSQU1TKHAxKSlgIHwgYEJhcjx0MSwgLi4uLCB0X20+KGludF92YWx1ZSlgIHwgYEZvb0FjdGlvblA8dDEsIC4uLiwgdF9tLCBpbnQ+YCB8Cit8IGBBQ1RJT05fUDIoQmF6LCBwMSwgcDIpYCB8IGBCYXooYm9vbF92YWx1ZSwgaW50X3ZhbHVlKWAgfCBgQmF6QWN0aW9uUDI8Ym9vbCwgaW50PmAgfAorfCBgQUNUSU9OX1RFTVBMQVRFKEJheiwgSEFTX21fVEVNUExBVEVfUEFSQU1TKC4uLiksIEFORF8yX1ZBTFVFX1BBUkFNUyhwMSwgcDIpKWAgfCBgQmF6PHQxLCAuLi4sIHRfbT4oYm9vbF92YWx1ZSwgaW50X3ZhbHVlKWAgfCBgRm9vQWN0aW9uUDI8dDEsIC4uLiwgdF9tLCBib29sLCBpbnQ+YCB8Cit8IC4uLiAgICAgICAgICAgICAgICAgIHwgLi4uICAgICAgICAgICAgfCAuLi4gICAgICAgICAgfAorCitOb3RlIHRoYXQgd2UgaGF2ZSB0byBwaWNrIGRpZmZlcmVudCBzdWZmaXhlcyAoYEFjdGlvbmAsIGBBY3Rpb25QYCwKK2BBY3Rpb25QMmAsIGFuZCBldGMpIGZvciBhY3Rpb25zIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgdmFsdWUKK3BhcmFtZXRlcnMsIG9yIHRoZSBhY3Rpb24gZGVmaW5pdGlvbnMgY2Fubm90IGJlIG92ZXJsb2FkZWQgb24gdGhlCitudW1iZXIgb2YgdGhlbS4KKworIyMgV3JpdGluZyBOZXcgTW9ub21vcnBoaWMgQWN0aW9ucyAjIworCitXaGlsZSB0aGUgYEFDVElPTipgIG1hY3JvcyBhcmUgdmVyeSBjb252ZW5pZW50LCBzb21ldGltZXMgdGhleSBhcmUKK2luYXBwcm9wcmlhdGUuICBGb3IgZXhhbXBsZSwgZGVzcGl0ZSB0aGUgdHJpY2tzIHNob3duIGluIHRoZSBwcmV2aW91cworcmVjaXBlcywgdGhleSBkb24ndCBsZXQgeW91IGRpcmVjdGx5IHNwZWNpZnkgdGhlIHR5cGVzIG9mIHRoZSBtb2NrCitmdW5jdGlvbiBhcmd1bWVudHMgYW5kIHRoZSBhY3Rpb24gcGFyYW1ldGVycywgd2hpY2ggaW4gZ2VuZXJhbCBsZWFkcwordG8gdW5vcHRpbWl6ZWQgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmFmZmxlIHVuZmFtaWxpYXIKK3VzZXJzLiAgVGhleSBhbHNvIGRvbid0IGFsbG93IG92ZXJsb2FkaW5nIGFjdGlvbnMgYmFzZWQgb24gcGFyYW1ldGVyCit0eXBlcyB3aXRob3V0IGp1bXBpbmcgdGhyb3VnaCBzb21lIGhvb3BzLgorCitBbiBhbHRlcm5hdGl2ZSB0byB0aGUgYEFDVElPTipgIG1hY3JvcyBpcyB0byBpbXBsZW1lbnQKK2A6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPmAsIHdoZXJlIGBGYCBpcyB0aGUgdHlwZSBvZiB0aGUgbW9jaworZnVuY3Rpb24gaW4gd2hpY2ggdGhlIGFjdGlvbiB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOgorCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBGPmNsYXNzIEFjdGlvbkludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5BY3Rpb25JbnRlcmZhY2UoKTsKKworICAvLyBQZXJmb3JtcyB0aGUgYWN0aW9uLiAgUmVzdWx0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbiB0eXBlCisgIC8vIEYsIGFuZCBBcmd1bWVudFR1cGxlIGlzIHRoZSB0dXBsZSBvZiBhcmd1bWVudHMgb2YgRi4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsIGlmIEYgaXMgaW50KGJvb2wsIGNvbnN0IHN0cmluZyYpLCB0aGVuIFJlc3VsdCB3b3VsZAorICAvLyBiZSBpbnQsIGFuZCBBcmd1bWVudFR1cGxlIHdvdWxkIGJlIHRyMTo6dHVwbGU8Ym9vbCwgY29uc3Qgc3RyaW5nJj4uCisgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgPSAwOworfTsKKwordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBY3Rpb247Cit1c2luZyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTsKK3VzaW5nIDo6dGVzdGluZzo6TWFrZUFjdGlvbjsKKwordHlwZWRlZiBpbnQgSW5jcmVtZW50TWV0aG9kKGludCopOworCitjbGFzcyBJbmNyZW1lbnRBcmd1bWVudEFjdGlvbiA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8SW5jcmVtZW50TWV0aG9kPiB7CisgcHVibGljOgorICB2aXJ0dWFsIGludCBQZXJmb3JtKGNvbnN0IHRyMTo6dHVwbGU8aW50Kj4mIGFyZ3MpIHsKKyAgICBpbnQqIHAgPSB0cjE6OmdldDwwPihhcmdzKTsgIC8vIEdyYWJzIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICByZXR1cm4gKnArKzsKKyAgfQorfTsKKworQWN0aW9uPEluY3JlbWVudE1ldGhvZD4gSW5jcmVtZW50QXJndW1lbnQoKSB7CisgIHJldHVybiBNYWtlQWN0aW9uKG5ldyBJbmNyZW1lbnRBcmd1bWVudEFjdGlvbik7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJheihfKSkKKyAgICAgIC5XaWxsT25jZShJbmNyZW1lbnRBcmd1bWVudCgpKTsKKworICBpbnQgbiA9IDU7CisgIGZvby5CYXooJm4pOyAgLy8gU2hvdWxkIHJldHVybiA1IGFuZCBjaGFuZ2UgbiB0byA2LgorYGBgCisKKyMjIFdyaXRpbmcgTmV3IFBvbHltb3JwaGljIEFjdGlvbnMgIyMKKworVGhlIHByZXZpb3VzIHJlY2lwZSBzaG93ZWQgeW91IGhvdyB0byBkZWZpbmUgeW91ciBvd24gYWN0aW9uLiBUaGlzIGlzCithbGwgZ29vZCwgZXhjZXB0IHRoYXQgeW91IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gaW4KK3doaWNoIHRoZSBhY3Rpb24gd2lsbCBiZSB1c2VkLiBTb21ldGltZXMgdGhhdCBjYW4gYmUgYSBwcm9ibGVtLiBGb3IKK2V4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgYWN0aW9uIGluIGZ1bmN0aW9ucyB3aXRoIF9kaWZmZXJlbnRfCit0eXBlcyAoZS5nLiBsaWtlIGBSZXR1cm4oKWAgYW5kIGBTZXRBcmd1bWVudFBvaW50ZWUoKWApLgorCitJZiBhbiBhY3Rpb24gY2FuIGJlIHVzZWQgaW4gc2V2ZXJhbCB0eXBlcyBvZiBtb2NrIGZ1bmN0aW9ucywgd2Ugc2F5CitpdCdzIF9wb2x5bW9ycGhpY18uIFRoZSBgTWFrZVBvbHltb3JwaGljQWN0aW9uKClgIGZ1bmN0aW9uIHRlbXBsYXRlCittYWtlcyBpdCBlYXN5IHRvIGRlZmluZSBzdWNoIGFuIGFjdGlvbjoKKworYGBgCituYW1lc3BhY2UgdGVzdGluZyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorUG9seW1vcnBoaWNBY3Rpb248SW1wbD4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGNvbnN0IEltcGwmIGltcGwpOworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworYGBgCisKK0FzIGFuIGV4YW1wbGUsIGxldCdzIGRlZmluZSBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZWNvbmQgYXJndW1lbnQKK2luIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnQgbGlzdC4gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gZGVmaW5lIGFuCitpbXBsZW1lbnRhdGlvbiBjbGFzczoKKworYGBgCitjbGFzcyBSZXR1cm5TZWNvbmRBcmd1bWVudEFjdGlvbiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7CisgICAgLy8gVG8gZ2V0IHRoZSBpLXRoICgwLWJhc2VkKSBhcmd1bWVudCwgdXNlIHRyMTo6Z2V0PGk+KGFyZ3MpLgorICAgIHJldHVybiB0cjE6OmdldDwxPihhcmdzKTsKKyAgfQorfTsKK2BgYAorCitUaGlzIGltcGxlbWVudGF0aW9uIGNsYXNzIGRvZXMgX25vdF8gbmVlZCB0byBpbmhlcml0IGZyb20gYW55CitwYXJ0aWN1bGFyIGNsYXNzLiBXaGF0IG1hdHRlcnMgaXMgdGhhdCBpdCBtdXN0IGhhdmUgYSBgUGVyZm9ybSgpYAorbWV0aG9kIHRlbXBsYXRlLiBUaGlzIG1ldGhvZCB0ZW1wbGF0ZSB0YWtlcyB0aGUgbW9jayBmdW5jdGlvbidzCithcmd1bWVudHMgYXMgYSB0dXBsZSBpbiBhICoqc2luZ2xlKiogYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKK3RoZSBhY3Rpb24uIEl0IGNhbiBiZSBlaXRoZXIgYGNvbnN0YCBvciBub3QsIGJ1dCBtdXN0IGJlIGludm9rYWJsZQord2l0aCBleGFjdGx5IG9uZSB0ZW1wbGF0ZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIHJlc3VsdCB0eXBlLiBJbiBvdGhlcgord29yZHMsIHlvdSBtdXN0IGJlIGFibGUgdG8gY2FsbCBgUGVyZm9ybTxSPihhcmdzKWAgd2hlcmUgYFJgIGlzIHRoZQorbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlIGFuZCBgYXJnc2AgaXMgaXRzIGFyZ3VtZW50cyBpbiBhIHR1cGxlLgorCitOZXh0LCB3ZSB1c2UgYE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpYCB0byB0dXJuIGFuIGluc3RhbmNlIG9mIHRoZQoraW1wbGVtZW50YXRpb24gY2xhc3MgaW50byB0aGUgcG9seW1vcnBoaWMgYWN0aW9uIHdlIG5lZWQuIEl0IHdpbGwgYmUKK2NvbnZlbmllbnQgdG8gaGF2ZSBhIHdyYXBwZXIgZm9yIHRoaXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNBY3Rpb247Cit1c2luZyA6OnRlc3Rpbmc6OlBvbHltb3JwaGljQWN0aW9uOworCitQb2x5bW9ycGhpY0FjdGlvbjxSZXR1cm5TZWNvbmRBcmd1bWVudEFjdGlvbj4gUmV0dXJuU2Vjb25kQXJndW1lbnQoKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oUmV0dXJuU2Vjb25kQXJndW1lbnRBY3Rpb24oKSk7Cit9CitgYGAKKworTm93LCB5b3UgY2FuIHVzZSB0aGlzIHBvbHltb3JwaGljIGFjdGlvbiB0aGUgc2FtZSB3YXkgeW91IHVzZSB0aGUKK2J1aWx0LWluIG9uZXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoRG9UaGlzLCBpbnQoYm9vbCBmbGFnLCBpbnQgbikpOworICBNT0NLX01FVEhPRDMoRG9UaGF0LCBzdHJpbmcoaW50IHgsIGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoXywgXykpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuU2Vjb25kQXJndW1lbnQoKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGF0KF8sIF8sIF8pKQorICAgICAgLldpbGxPbmNlKFJldHVyblNlY29uZEFyZ3VtZW50KCkpOworICAuLi4KKyAgZm9vLkRvVGhpcyh0cnVlLCA1KTsgICAgICAgICAvLyBXaWxsIHJldHVybiA1LgorICBmb28uRG9UaGF0KDEsICJIaSIsICJCeWUiKTsgIC8vIFdpbGwgcmV0dXJuICJIaSIuCitgYGAKKworIyMgVGVhY2hpbmcgR29vZ2xlIE1vY2sgSG93IHRvIFByaW50IFlvdXIgVmFsdWVzICMjCisKK1doZW4gYW4gdW5pbnRlcmVzdGluZyBvciB1bmV4cGVjdGVkIGNhbGwgb2NjdXJzLCBHb29nbGUgTW9jayBwcmludHMKK3RoZSBhcmd1bWVudCB2YWx1ZXMgdG8gaGVscCB5b3UgZGVidWcuICBUaGUgYEVYUEVDVF9USEFUYCBhbmQKK2BBU1NFUlRfVEhBVGAgYXNzZXJ0aW9ucyBhbHNvIHByaW50IHRoZSB2YWx1ZSBiZWluZyB2YWxpZGF0ZWQgd2hlbiB0aGUKK3Rlc3QgZmFpbHMuICBHb29nbGUgTW9jayBkb2VzIHRoaXMgdXNpbmcgdGhlIHVzZXItZXh0ZW5zaWJsZSB2YWx1ZQorcHJpbnRlciBkZWZpbmVkIGluIGA8Z21vY2svZ21vY2stcHJpbnRlcnMuaD5gLgorCitUaGlzIHByaW50ZXIga25vd3MgaG93IHRvIHByaW50IHRoZSBidWlsdC1pbiBDKysgdHlwZXMsIG5hdGl2ZSBhcnJheXMsCitTVEwgY29udGFpbmVycywgYW5kIGFueSB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlIGA8PGAgb3BlcmF0b3IuIEZvcgorb3RoZXIgdHlwZXMsIGl0IHByaW50cyB0aGUgcmF3IGJ5dGVzIGluIHRoZSB2YWx1ZSBhbmQgaG9wZSB5b3UgdGhlCit1c2VyIGNhbiBmaWd1cmUgaXQgb3V0LgorCitEaWQgSSBzYXkgdGhhdCB0aGUgcHJpbnRlciBpcyBgZXh0ZW5zaWJsZWA/IFRoYXQgbWVhbnMgeW91IGNhbiB0ZWFjaAoraXQgdG8gZG8gYSBiZXR0ZXIgam9iIGF0IHByaW50aW5nIHlvdXIgcGFydGljdWxhciB0eXBlIHRoYW4gdG8gZHVtcAordGhlIGJ5dGVzLiBUbyBkbyB0aGF0LCB5b3UganVzdCBuZWVkIHRvIGRlZmluZSBgPDxgIGZvciB5b3VyIHR5cGU6CisKK2BgYAorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgRm9vIHsgLi4uIH07CisKKy8vIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIDw8IG9wZXJhdG9yIGlzIGRlZmluZWQgaW4gdGhlIFNBTUUKKy8vIG5hbWVzcGFjZSB0aGF0IGRlZmluZXMgRm9vLiAgQysrJ3MgbG9vay11cCBydWxlcyByZWx5IG9uIHRoYXQuCis6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEZvbyYgZm9vKSB7CisgIHJldHVybiBvcyA8PCBmb28uRGVidWdTdHJpbmcoKTsgIC8vIFdoYXRldmVyIG5lZWRlZCB0byBwcmludCBmb28gdG8gb3MuCit9CisKK30gIC8vIG5hbWVzcGFjZSBmb28KK2BgYAorCitTb21ldGltZXMsIHRoaXMgbWlnaHQgbm90IGJlIGFuIG9wdGlvbi4gRm9yIGV4YW1wbGUsIHlvdXIgdGVhbSBtYXkKK2NvbnNpZGVyIGl0IGRhbmdlcm91cyBvciBiYWQgc3R5bGUgdG8gaGF2ZSBhIGA8PGAgb3BlcmF0b3IgZm9yIGBGb29gLAorb3IgYEZvb2AgbWF5IGFscmVhZHkgaGF2ZSBhIGA8PGAgb3BlcmF0b3IgdGhhdCBkb2Vzbid0IGRvIHdoYXQgeW91Cit3YW50IChhbmQgeW91IGNhbm5vdCBjaGFuZ2UgaXQpLiBEb24ndCBkZXNwYWlyIHRob3VnaCAtIEdvb2dsZSBNb2NrCitnaXZlcyB5b3UgYSBzZWNvbmQgY2hhbmNlIHRvIGdldCBpdCByaWdodC4gTmFtZWx5LCB5b3UgY2FuIGRlZmluZSBhCitgUHJpbnRUbygpYCBmdW5jdGlvbiBsaWtlIHRoaXM6CisKK2BgYAorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgRm9vIHsgLi4uIH07CisKKy8vIEl0J3MgaW1wb3J0YW50IHRoYXQgUHJpbnRUbygpIGlzIGRlZmluZWQgaW4gdGhlIFNBTUUKKy8vIG5hbWVzcGFjZSB0aGF0IGRlZmluZXMgRm9vLiAgQysrJ3MgbG9vay11cCBydWxlcyByZWx5IG9uIHRoYXQuCit2b2lkIFByaW50VG8oY29uc3QgRm9vJiBmb28sIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgZm9vLkRlYnVnU3RyaW5nKCk7ICAvLyBXaGF0ZXZlciBuZWVkZWQgdG8gcHJpbnQgZm9vIHRvIG9zLgorfQorCit9ICAvLyBuYW1lc3BhY2UgZm9vCitgYGAKKworV2hhdCBpZiB5b3UgaGF2ZSBib3RoIGA8PGAgYW5kIGBQcmludFRvKClgPyBJbiB0aGlzIGNhc2UsIHRoZSBsYXR0ZXIKK3dpbGwgb3ZlcnJpZGUgdGhlIGZvcm1lciB3aGVuIEdvb2dsZSBNb2NrIGlzIGNvbmNlcm5lZC4gVGhpcyBhbGxvd3MKK3lvdSB0byBjdXN0b21pemUgaG93IHRoZSB2YWx1ZSBzaG91bGQgYXBwZWFyIGluIEdvb2dsZSBNb2NrJ3Mgb3V0cHV0Cit3aXRob3V0IGFmZmVjdGluZyBjb2RlIHRoYXQgcmVsaWVzIG9uIHRoZSBiZWhhdmlvciBvZiBpdHMgYDw8YAorb3BlcmF0b3IuCisKKyoqTm90ZToqKiBXaGVuIHByaW50aW5nIGEgcG9pbnRlciBvZiB0eXBlIGBUKmAsIEdvb2dsZSBNb2NrIGNhbGxzCitgUHJpbnRUbyhUKiwgc3RkOjpvc3RyZWFtKiBvcylgIGluc3RlYWQgb2YgYG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgVCopYC4KK1RoZXJlZm9yZSB0aGUgb25seSB3YXkgdG8gYWZmZWN0IGhvdyBhIHBvaW50ZXIgaXMgcHJpbnRlZCBieSBHb29nbGUKK01vY2sgaXMgdG8gZGVmaW5lIGBQcmludFRvKClgIGZvciBpdC4gQWxzbyBub3RlIHRoYXQgYFQqYCBhbmQgYGNvbnN0IFQqYAorYXJlIGRpZmZlcmVudCB0eXBlcywgc28geW91IG1heSBuZWVkIHRvIGRlZmluZSBgUHJpbnRUbygpYCBmb3IgYm90aC4KKworV2h5IGRvZXMgR29vZ2xlIE1vY2sgdHJlYXQgcG9pbnRlcnMgc3BlY2lhbGx5PyBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zOgorCisgICogV2UgY2Fubm90IHVzZSBgb3BlcmF0b3I8PGAgdG8gcHJpbnQgYSBgc2lnbmVkIGNoYXIqYCBvciBgdW5zaWduZWQgY2hhcipgLCBzaW5jZSBpdCB3aWxsIHByaW50IHRoZSBwb2ludGVyIGFzIGEgTlVMLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIHdoaWNoIGxpa2VseSB3aWxsIGNhdXNlIGFuIGFjY2VzcyB2aW9sYXRpb24uCisgICogV2Ugd2FudCBgTlVMTGAgcG9pbnRlcnMgdG8gYmUgcHJpbnRlZCBhcyBgIk5VTEwiYCwgYnV0IGBvcGVyYXRvcjw8YCBwcmludHMgaXQgYXMgYCIwImAsIGAibnVsbHB0ciJgLCBvciBzb21ldGhpbmcgZWxzZSwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlci4KKyAgKiBXaXRoIHNvbWUgY29tcGlsZXJzLCBwcmludGluZyBhIGBOVUxMYCBgY2hhcipgIHVzaW5nIGBvcGVyYXRvcjw8YCB3aWxsIHNlZ2ZhdWx0LgorICAqIGBvcGVyYXRvcjw8YCBwcmludHMgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGEgYGJvb2xgIChoZW5jZSBpdCBhbHdheXMgcHJpbnRzIGAiMSJgKSwgd2hpY2ggaXMgbm90IHZlcnkgdXNlZnVsLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzUvRG9jdW1lbnRhdGlvbi5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzUvRG9jdW1lbnRhdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTViMGEyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNS9Eb2N1bWVudGF0aW9uLm1kCkBAIC0wLDAgKzEsMTEgQEAKK1RoaXMgcGFnZSBsaXN0cyBhbGwgZG9jdW1lbnRhdGlvbiB3aWtpIHBhZ2VzIGZvciBHb29nbGUgTW9jayAqKnZlcnNpb24gMS41LjAqKiAtLSAqKmlmIHlvdSB1c2UgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBHb29nbGUgTW9jaywgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgdmVyc2lvbiBpbnN0ZWFkLioqCisKKyAgKiBbRm9yRHVtbWllc10oVjFfNV9Gb3JEdW1taWVzLm1kKSAtLSBzdGFydCBoZXJlIGlmIHlvdSBhcmUgbmV3IHRvIEdvb2dsZSBNb2NrLgorICAqIFtDaGVhdFNoZWV0XShWMV81X0NoZWF0U2hlZXQubWQpIC0tIGEgcXVpY2sgcmVmZXJlbmNlLgorICAqIFtDb29rQm9va10oVjFfNV9Db29rQm9vay5tZCkgLS0gcmVjaXBlcyBmb3IgZG9pbmcgdmFyaW91cyB0YXNrcyB1c2luZyBHb29nbGUgTW9jay4KKyAgKiBbRnJlcXVlbnRseUFza2VkUXVlc3Rpb25zXShWMV81X0ZyZXF1ZW50bHlBc2tlZFF1ZXN0aW9ucy5tZCkgLS0gY2hlY2sgaGVyZSBiZWZvcmUgYXNraW5nIGEgcXVlc3Rpb24gb24gdGhlIG1haWxpbmcgbGlzdC4KKworVG8gY29udHJpYnV0ZSBjb2RlIHRvIEdvb2dsZSBNb2NrLCByZWFkOgorCisgICogRGV2R3VpZGUgLS0gcmVhZCB0aGlzIF9iZWZvcmVfIHdyaXRpbmcgeW91ciBmaXJzdCBwYXRjaC4KKyAgKiBbUHVtcCBNYW51YWxdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvUHVtcE1hbnVhbCkgLS0gaG93IHdlIGdlbmVyYXRlIHNvbWUgb2YgR29vZ2xlIE1vY2sncyBzb3VyY2UgZmlsZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNS9Gb3JEdW1taWVzLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNS9Gb3JEdW1taWVzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODk2MDYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV81L0ZvckR1bW1pZXMubWQKQEAgLTAsMCArMSw0MzkgQEAKKworCisoKipOb3RlOioqIElmIHlvdSBnZXQgY29tcGlsZXIgZXJyb3JzIHRoYXQgeW91IGRvbid0IHVuZGVyc3RhbmQsIGJlIHN1cmUgdG8gY29uc3VsdCBbR29vZ2xlIE1vY2sgRG9jdG9yXShWMV81X0ZyZXF1ZW50bHlBc2tlZFF1ZXN0aW9ucyNIb3dfYW1fSV9zdXBwb3NlZF90b19tYWtlX3NlbnNlX29mX3RoZXNlX2hvcnJpYmxlX3RlbXBsYXRlX2Vycm9yLm1kKS4pCisKKyMgV2hhdCBJcyBHb29nbGUgQysrIE1vY2tpbmcgRnJhbWV3b3JrPyAjCitXaGVuIHlvdSB3cml0ZSBhIHByb3RvdHlwZSBvciB0ZXN0LCBvZnRlbiBpdCdzIG5vdCBmZWFzaWJsZSBvciB3aXNlIHRvIHJlbHkgb24gcmVhbCBvYmplY3RzIGVudGlyZWx5LiBBICoqbW9jayBvYmplY3QqKiBpbXBsZW1lbnRzIHRoZSBzYW1lIGludGVyZmFjZSBhcyBhIHJlYWwgb2JqZWN0IChzbyBpdCBjYW4gYmUgdXNlZCBhcyBvbmUpLCBidXQgbGV0cyB5b3Ugc3BlY2lmeSBhdCBydW4gdGltZSBob3cgaXQgd2lsbCBiZSB1c2VkIGFuZCB3aGF0IGl0IHNob3VsZCBkbyAod2hpY2ggbWV0aG9kcyB3aWxsIGJlIGNhbGxlZD8gaW4gd2hpY2ggb3JkZXI/IGhvdyBtYW55IHRpbWVzPyB3aXRoIHdoYXQgYXJndW1lbnRzPyB3aGF0IHdpbGwgdGhleSByZXR1cm4/IGV0YykuCisKKyoqTm90ZToqKiBJdCBpcyBlYXN5IHRvIGNvbmZ1c2UgdGhlIHRlcm0gX2Zha2Ugb2JqZWN0c18gd2l0aCBtb2NrIG9iamVjdHMuIEZha2VzIGFuZCBtb2NrcyBhY3R1YWxseSBtZWFuIHZlcnkgZGlmZmVyZW50IHRoaW5ncyBpbiB0aGUgVGVzdC1Ecml2ZW4gRGV2ZWxvcG1lbnQgKFRERCkgY29tbXVuaXR5OgorCisgICogKipGYWtlKiogb2JqZWN0cyBoYXZlIHdvcmtpbmcgaW1wbGVtZW50YXRpb25zLCBidXQgdXN1YWxseSB0YWtlIHNvbWUgc2hvcnRjdXQgKHBlcmhhcHMgdG8gbWFrZSB0aGUgb3BlcmF0aW9ucyBsZXNzIGV4cGVuc2l2ZSksIHdoaWNoIG1ha2VzIHRoZW0gbm90IHN1aXRhYmxlIGZvciBwcm9kdWN0aW9uLiBBbiBpbi1tZW1vcnkgZmlsZSBzeXN0ZW0gd291bGQgYmUgYW4gZXhhbXBsZSBvZiBhIGZha2UuCisgICogKipNb2NrcyoqIGFyZSBvYmplY3RzIHByZS1wcm9ncmFtbWVkIHdpdGggX2V4cGVjdGF0aW9uc18sIHdoaWNoIGZvcm0gYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBjYWxscyB0aGV5IGFyZSBleHBlY3RlZCB0byByZWNlaXZlLgorCitJZiBhbGwgdGhpcyBzZWVtcyB0b28gYWJzdHJhY3QgZm9yIHlvdSwgZG9uJ3Qgd29ycnkgLSB0aGUgbW9zdCBpbXBvcnRhbnQgdGhpbmcgdG8gcmVtZW1iZXIgaXMgdGhhdCBhIG1vY2sgYWxsb3dzIHlvdSB0byBjaGVjayB0aGUgX2ludGVyYWN0aW9uXyBiZXR3ZWVuIGl0c2VsZiBhbmQgY29kZSB0aGF0IHVzZXMgaXQuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZmFrZXMgYW5kIG1vY2tzIHdpbGwgYmVjb21lIG11Y2ggY2xlYXJlciBvbmNlIHlvdSBzdGFydCB0byB1c2UgbW9ja3MuCisKKyoqR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yayoqIChvciAqKkdvb2dsZSBNb2NrKiogZm9yIHNob3J0KSBpcyBhIGxpYnJhcnkgKHNvbWV0aW1lcyB3ZSBhbHNvIGNhbGwgaXQgYSAiZnJhbWV3b3JrIiB0byBtYWtlIGl0IHNvdW5kIGNvb2wpIGZvciBjcmVhdGluZyBtb2NrIGNsYXNzZXMgYW5kIHVzaW5nIHRoZW0uIEl0IGRvZXMgdG8gQysrIHdoYXQgW2pNb2NrXShodHRwOi8vd3d3Lmptb2NrLm9yZy8pIGFuZCBbRWFzeU1vY2tdKGh0dHA6Ly93d3cuZWFzeW1vY2sub3JnLykgZG8gdG8gSmF2YS4KKworVXNpbmcgR29vZ2xlIE1vY2sgaW52b2x2ZXMgdGhyZWUgYmFzaWMgc3RlcHM6CisKKyAgMS4gVXNlIHNvbWUgc2ltcGxlIG1hY3JvcyB0byBkZXNjcmliZSB0aGUgaW50ZXJmYWNlIHlvdSB3YW50IHRvIG1vY2ssIGFuZCB0aGV5IHdpbGwgZXhwYW5kIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB5b3VyIG1vY2sgY2xhc3M7CisgIDEuIENyZWF0ZSBzb21lIG1vY2sgb2JqZWN0cyBhbmQgc3BlY2lmeSBpdHMgZXhwZWN0YXRpb25zIGFuZCBiZWhhdmlvciB1c2luZyBhbiBpbnR1aXRpdmUgc3ludGF4OworICAxLiBFeGVyY2lzZSBjb2RlIHRoYXQgdXNlcyB0aGUgbW9jayBvYmplY3RzLiBHb29nbGUgTW9jayB3aWxsIGNhdGNoIGFueSB2aW9sYXRpb24gb2YgdGhlIGV4cGVjdGF0aW9ucyBhcyBzb29uIGFzIGl0IGFyaXNlcy4KKworIyBXaHkgR29vZ2xlIE1vY2s/ICMKK1doaWxlIG1vY2sgb2JqZWN0cyBoZWxwIHlvdSByZW1vdmUgdW5uZWNlc3NhcnkgZGVwZW5kZW5jaWVzIGluIHRlc3RzIGFuZCBtYWtlIHRoZW0gZmFzdCBhbmQgcmVsaWFibGUsIHVzaW5nIG1vY2tzIG1hbnVhbGx5IGluIEMrKyBpcyBfaGFyZF86CisKKyAgKiBTb21lb25lIGhhcyB0byBpbXBsZW1lbnQgdGhlIG1vY2tzLiBUaGUgam9iIGlzIHVzdWFsbHkgdGVkaW91cyBhbmQgZXJyb3ItcHJvbmUuIE5vIHdvbmRlciBwZW9wbGUgZ28gZ3JlYXQgZGlzdGFuY2UgdG8gYXZvaWQgaXQuCisgICogVGhlIHF1YWxpdHkgb2YgdGhvc2UgbWFudWFsbHkgd3JpdHRlbiBtb2NrcyBpcyBhIGJpdCwgdWgsIHVucHJlZGljdGFibGUuIFlvdSBtYXkgc2VlIHNvbWUgcmVhbGx5IHBvbGlzaGVkIG9uZXMsIGJ1dCB5b3UgbWF5IGFsc28gc2VlIHNvbWUgdGhhdCB3ZXJlIGhhY2tlZCB1cCBpbiBhIGh1cnJ5IGFuZCBoYXZlIGFsbCBzb3J0cyBvZiBhZCBob2MgcmVzdHJpY3Rpb25zLgorICAqIFRoZSBrbm93bGVkZ2UgeW91IGdhaW5lZCBmcm9tIHVzaW5nIG9uZSBtb2NrIGRvZXNuJ3QgdHJhbnNmZXIgdG8gdGhlIG5leHQuCisKK0luIGNvbnRyYXN0LCBKYXZhIGFuZCBQeXRob24gcHJvZ3JhbW1lcnMgaGF2ZSBzb21lIGZpbmUgbW9jayBmcmFtZXdvcmtzLCB3aGljaCBhdXRvbWF0ZSB0aGUgY3JlYXRpb24gb2YgbW9ja3MuIEFzIGEgcmVzdWx0LCBtb2NraW5nIGlzIGEgcHJvdmVuIGVmZmVjdGl2ZSB0ZWNobmlxdWUgYW5kIHdpZGVseSBhZG9wdGVkIHByYWN0aWNlIGluIHRob3NlIGNvbW11bml0aWVzLiBIYXZpbmcgdGhlIHJpZ2h0IHRvb2wgYWJzb2x1dGVseSBtYWtlcyB0aGUgZGlmZmVyZW5jZS4KKworR29vZ2xlIE1vY2sgd2FzIGJ1aWx0IHRvIGhlbHAgQysrIHByb2dyYW1tZXJzLiBJdCB3YXMgaW5zcGlyZWQgYnkgW2pNb2NrXShodHRwOi8vd3d3Lmptb2NrLm9yZy8pIGFuZCBbRWFzeU1vY2tdKGh0dHA6Ly93d3cuZWFzeW1vY2sub3JnLyksIGJ1dCBkZXNpZ25lZCB3aXRoIEMrKydzIHNwZWNpZmljcyBpbiBtaW5kLiBJdCBpcyB5b3VyIGZyaWVuZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBwcm9ibGVtcyBpcyBib3RoZXJpbmcgeW91OgorCisgICogWW91IGFyZSBzdHVjayB3aXRoIGEgc3ViLW9wdGltYWwgZGVzaWduIGFuZCB3aXNoIHlvdSBoYWQgZG9uZSBtb3JlIHByb3RvdHlwaW5nIGJlZm9yZSBpdCB3YXMgdG9vIGxhdGUsIGJ1dCBwcm90b3R5cGluZyBpbiBDKysgaXMgYnkgbm8gbWVhbnMgInJhcGlkIi4KKyAgKiBZb3VyIHRlc3RzIGFyZSBzbG93IGFzIHRoZXkgZGVwZW5kIG9uIHRvbyBtYW55IGxpYnJhcmllcyBvciB1c2UgZXhwZW5zaXZlIHJlc291cmNlcyAoZS5nLiBhIGRhdGFiYXNlKS4KKyAgKiBZb3VyIHRlc3RzIGFyZSBicml0dGxlIGFzIHNvbWUgcmVzb3VyY2VzIHRoZXkgdXNlIGFyZSB1bnJlbGlhYmxlIChlLmcuIHRoZSBuZXR3b3JrKS4KKyAgKiBZb3Ugd2FudCB0byB0ZXN0IGhvdyB5b3VyIGNvZGUgaGFuZGxlcyBhIGZhaWx1cmUgKGUuZy4gYSBmaWxlIGNoZWNrc3VtIGVycm9yKSwgYnV0IGl0J3Mgbm90IGVhc3kgdG8gY2F1c2Ugb25lLgorICAqIFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdXIgbW9kdWxlIGludGVyYWN0cyB3aXRoIG90aGVyIG1vZHVsZXMgaW4gdGhlIHJpZ2h0IHdheSwgYnV0IGl0J3MgaGFyZCB0byBvYnNlcnZlIHRoZSBpbnRlcmFjdGlvbjsgdGhlcmVmb3JlIHlvdSByZXNvcnQgdG8gb2JzZXJ2aW5nIHRoZSBzaWRlIGVmZmVjdHMgYXQgdGhlIGVuZCBvZiB0aGUgYWN0aW9uLCB3aGljaCBpcyBhd2t3YXJkIGF0IGJlc3QuCisgICogWW91IHdhbnQgdG8gIm1vY2sgb3V0IiB5b3VyIGRlcGVuZGVuY2llcywgZXhjZXB0IHRoYXQgdGhleSBkb24ndCBoYXZlIG1vY2sgaW1wbGVtZW50YXRpb25zIHlldDsgYW5kLCBmcmFua2x5LCB5b3UgYXJlbid0IHRocmlsbGVkIGJ5IHNvbWUgb2YgdGhvc2UgaGFuZC13cml0dGVuIG1vY2tzLgorCitXZSBlbmNvdXJhZ2UgeW91IHRvIHVzZSBHb29nbGUgTW9jayBhczoKKworICAqIGEgX2Rlc2lnbl8gdG9vbCwgZm9yIGl0IGxldHMgeW91IGV4cGVyaW1lbnQgd2l0aCB5b3VyIGludGVyZmFjZSBkZXNpZ24gZWFybHkgYW5kIG9mdGVuLiBNb3JlIGl0ZXJhdGlvbnMgbGVhZCB0byBiZXR0ZXIgZGVzaWducyEKKyAgKiBhIF90ZXN0aW5nXyB0b29sIHRvIGN1dCB5b3VyIHRlc3RzJyBvdXRib3VuZCBkZXBlbmRlbmNpZXMgYW5kIHByb2JlIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHlvdXIgbW9kdWxlIGFuZCBpdHMgY29sbGFib3JhdG9ycy4KKworIyBHZXR0aW5nIFN0YXJ0ZWQgIworVXNpbmcgR29vZ2xlIE1vY2sgaXMgZWFzeSEgSW5zaWRlIHlvdXIgQysrIHNvdXJjZSBmaWxlLCBqdXN0ICNpbmNsdWRlIGA8Z3Rlc3QvZ3Rlc3QuaD5gIGFuZCBgPGdtb2NrL2dtb2NrLmg+YCwgYW5kIHlvdSBhcmUgcmVhZHkgdG8gZ28uCisKKyMgQSBDYXNlIGZvciBNb2NrIFR1cnRsZXMgIworTGV0J3MgbG9vayBhdCBhbiBleGFtcGxlLiBTdXBwb3NlIHlvdSBhcmUgZGV2ZWxvcGluZyBhIGdyYXBoaWNzIHByb2dyYW0gdGhhdCByZWxpZXMgb24gYSBMT0dPLWxpa2UgQVBJIGZvciBkcmF3aW5nLiBIb3cgd291bGQgeW91IHRlc3QgdGhhdCBpdCBkb2VzIHRoZSByaWdodCB0aGluZz8gV2VsbCwgeW91IGNhbiBydW4gaXQgYW5kIGNvbXBhcmUgdGhlIHNjcmVlbiB3aXRoIGEgZ29sZGVuIHNjcmVlbiBzbmFwc2hvdCwgYnV0IGxldCdzIGFkbWl0IGl0OiB0ZXN0cyBsaWtlIHRoaXMgYXJlIGV4cGVuc2l2ZSB0byBydW4gYW5kIGZyYWdpbGUgKFdoYXQgaWYgeW91IGp1c3QgdXBncmFkZWQgdG8gYSBzaGlueSBuZXcgZ3JhcGhpY3MgY2FyZCB0aGF0IGhhcyBiZXR0ZXIgYW50aS1hbGlhc2luZz8gU3VkZGVubHkgeW91IGhhdmUgdG8gdXBkYXRlIGFsbCB5b3VyIGdvbGRlbiBpbWFnZXMuKS4gSXQgd291bGQgYmUgdG9vIHBhaW5mdWwgaWYgYWxsIHlvdXIgdGVzdHMgYXJlIGxpa2UgdGhpcy4gRm9ydHVuYXRlbHksIHlvdSBsZWFybmVkIGFib3V0IERlcGVuZGVuY3kgSW5qZWN0aW9uIGFuZCBrbm93IHRoZSByaWdodCB0aGluZyB0byBkbzogaW5zdGVhZCBvZiBoYXZpbmcgeW91ciBhcHBsaWNhdGlvbiB0YWxrIHRvIHRoZSBkcmF3aW5nIEFQSSBkaXJlY3RseSwgd3JhcCB0aGUgQVBJIGluIGFuIGludGVyZmFjZSAoc2F5LCBgVHVydGxlYCkgYW5kIGNvZGUgdG8gdGhhdCBpbnRlcmZhY2U6CisKK2BgYAorY2xhc3MgVHVydGxlIHsKKyAgLi4uCisgIHZpcnR1YWwgflR1cnRsZSgpIHt9CisgIHZpcnR1YWwgdm9pZCBQZW5VcCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFBlbkRvd24oKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBGb3J3YXJkKGludCBkaXN0YW5jZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgVHVybihpbnQgZGVncmVlcykgPSAwOworICB2aXJ0dWFsIHZvaWQgR29UbyhpbnQgeCwgaW50IHkpID0gMDsKKyAgdmlydHVhbCBpbnQgR2V0WCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQgR2V0WSgpIGNvbnN0ID0gMDsKK307CitgYGAKKworKE5vdGUgdGhhdCB0aGUgZGVzdHJ1Y3RvciBvZiBgVHVydGxlYCAqKm11c3QqKiBiZSB2aXJ0dWFsLCBhcyBpcyB0aGUgY2FzZSBmb3IgKiphbGwqKiBjbGFzc2VzIHlvdSBpbnRlbmQgdG8gaW5oZXJpdCBmcm9tIC0gb3RoZXJ3aXNlIHRoZSBkZXN0cnVjdG9yIG9mIHRoZSBkZXJpdmVkIGNsYXNzIHdpbGwgbm90IGJlIGNhbGxlZCB3aGVuIHlvdSBkZWxldGUgYW4gb2JqZWN0IHRocm91Z2ggYSBiYXNlIHBvaW50ZXIsIGFuZCB5b3UnbGwgZ2V0IGNvcnJ1cHRlZCBwcm9ncmFtIHN0YXRlcyBsaWtlIG1lbW9yeSBsZWFrcy4pCisKK1lvdSBjYW4gY29udHJvbCB3aGV0aGVyIHRoZSB0dXJ0bGUncyBtb3ZlbWVudCB3aWxsIGxlYXZlIGEgdHJhY2UgdXNpbmcgYFBlblVwKClgIGFuZCBgUGVuRG93bigpYCwgYW5kIGNvbnRyb2wgaXRzIG1vdmVtZW50IHVzaW5nIGBGb3J3YXJkKClgLCBgVHVybigpYCwgYW5kIGBHb1RvKClgLiBGaW5hbGx5LCBgR2V0WCgpYCBhbmQgYEdldFkoKWAgdGVsbCB5b3UgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHR1cnRsZS4KKworWW91ciBwcm9ncmFtIHdpbGwgbm9ybWFsbHkgdXNlIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4gSW4gdGVzdHMsIHlvdSBjYW4gdXNlIGEgbW9jayBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IGNoZWNrIHdoYXQgZHJhd2luZyBwcmltaXRpdmVzIHlvdXIgcHJvZ3JhbSBpcyBjYWxsaW5nLCB3aXRoIHdoYXQgYXJndW1lbnRzLCBhbmQgaW4gd2hpY2ggb3JkZXIuIFRlc3RzIHdyaXR0ZW4gdGhpcyB3YXkgYXJlIG11Y2ggbW9yZSByb2J1c3QgKHRoZXkgd29uJ3QgYnJlYWsgYmVjYXVzZSB5b3VyIG5ldyBtYWNoaW5lIGRvZXMgYW50aS1hbGlhc2luZyBkaWZmZXJlbnRseSksIGVhc2llciB0byByZWFkIGFuZCBtYWludGFpbiAodGhlIGludGVudCBvZiBhIHRlc3QgaXMgZXhwcmVzc2VkIGluIHRoZSBjb2RlLCBub3QgaW4gc29tZSBiaW5hcnkgaW1hZ2VzKSwgYW5kIHJ1biBfbXVjaCwgbXVjaCBmYXN0ZXJfLgorCisjIFdyaXRpbmcgdGhlIE1vY2sgQ2xhc3MgIworSWYgeW91IGFyZSBsdWNreSwgdGhlIG1vY2tzIHlvdSBuZWVkIHRvIHVzZSBoYXZlIGFscmVhZHkgYmVlbiBpbXBsZW1lbnRlZCBieSBzb21lIG5pY2UgcGVvcGxlLiBJZiwgaG93ZXZlciwgeW91IGZpbmQgeW91cnNlbGYgaW4gdGhlIHBvc2l0aW9uIHRvIHdyaXRlIGEgbW9jayBjbGFzcywgcmVsYXggLSBHb29nbGUgTW9jayB0dXJucyB0aGlzIHRhc2sgaW50byBhIGZ1biBnYW1lISAoV2VsbCwgYWxtb3N0LikKKworIyMgSG93IHRvIERlZmluZSBJdCAjIworVXNpbmcgdGhlIGBUdXJ0bGVgIGludGVyZmFjZSBhcyBleGFtcGxlLCBoZXJlIGFyZSB0aGUgc2ltcGxlIHN0ZXBzIHlvdSBuZWVkIHRvIGZvbGxvdzoKKworICAxLiBEZXJpdmUgYSBjbGFzcyBgTW9ja1R1cnRsZWAgZnJvbSBgVHVydGxlYC4KKyAgMS4gVGFrZSBhIHZpcnR1YWwgZnVuY3Rpb24gb2YgYFR1cnRsZWAuIENvdW50IGhvdyBtYW55IGFyZ3VtZW50cyBpdCBoYXMuCisgIDEuIEluIHRoZSBgcHVibGljOmAgc2VjdGlvbiBvZiB0aGUgY2hpbGQgY2xhc3MsIHdyaXRlIGBNT0NLX01FVEhPRG4oKTtgIChvciBgTU9DS19DT05TVF9NRVRIT0RuKCk7YCBpZiB5b3UgYXJlIG1vY2tpbmcgYSBgY29uc3RgIG1ldGhvZCksIHdoZXJlIGBuYCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBhcmd1bWVudHM7IGlmIHlvdSBjb3VudGVkIHdyb25nLCBzaGFtZSBvbiB5b3UsIGFuZCBhIGNvbXBpbGVyIGVycm9yIHdpbGwgdGVsbCB5b3Ugc28uCisgIDEuIE5vdyBjb21lcyB0aGUgZnVuIHBhcnQ6IHlvdSB0YWtlIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUsIGN1dC1hbmQtcGFzdGUgdGhlIF9mdW5jdGlvbiBuYW1lXyBhcyB0aGUgX2ZpcnN0XyBhcmd1bWVudCB0byB0aGUgbWFjcm8sIGFuZCBsZWF2ZSB3aGF0J3MgbGVmdCBhcyB0aGUgX3NlY29uZF8gYXJndW1lbnQgKGluIGNhc2UgeW91J3JlIGN1cmlvdXMsIHRoaXMgaXMgdGhlIF90eXBlIG9mIHRoZSBmdW5jdGlvbl8pLgorICAxLiBSZXBlYXQgdW50aWwgYWxsIHZpcnR1YWwgZnVuY3Rpb25zIHlvdSB3YW50IHRvIG1vY2sgYXJlIGRvbmUuCisKK0FmdGVyIHRoZSBwcm9jZXNzLCB5b3Ugc2hvdWxkIGhhdmUgc29tZXRoaW5nIGxpa2U6CisKK2BgYAorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+ICAvLyBCcmluZ3MgaW4gR29vZ2xlIE1vY2suCitjbGFzcyBNb2NrVHVydGxlIDogcHVibGljIFR1cnRsZSB7CisgcHVibGljOgorICAuLi4KKyAgTU9DS19NRVRIT0QwKFBlblVwLCB2b2lkKCkpOworICBNT0NLX01FVEhPRDAoUGVuRG93biwgdm9pZCgpKTsKKyAgTU9DS19NRVRIT0QxKEZvcndhcmQsIHZvaWQoaW50IGRpc3RhbmNlKSk7CisgIE1PQ0tfTUVUSE9EMShUdXJuLCB2b2lkKGludCBkZWdyZWVzKSk7CisgIE1PQ0tfTUVUSE9EMihHb1RvLCB2b2lkKGludCB4LCBpbnQgeSkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0WCwgaW50KCkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0WSwgaW50KCkpOworfTsKK2BgYAorCitZb3UgZG9uJ3QgbmVlZCB0byBkZWZpbmUgdGhlc2UgbW9jayBtZXRob2RzIHNvbWV3aGVyZSBlbHNlIC0gdGhlIGBNT0NLX01FVEhPRCpgIG1hY3JvcyB3aWxsIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBmb3IgeW91LiBJdCdzIHRoYXQgc2ltcGxlISBPbmNlIHlvdSBnZXQgdGhlIGhhbmcgb2YgaXQsIHlvdSBjYW4gcHVtcCBvdXQgbW9jayBjbGFzc2VzIGZhc3RlciB0aGFuIHlvdXIgc291cmNlLWNvbnRyb2wgc3lzdGVtIGNhbiBoYW5kbGUgeW91ciBjaGVjay1pbnMuCisKKyoqVGlwOioqIElmIGV2ZW4gdGhpcyBpcyB0b28gbXVjaCB3b3JrIGZvciB5b3UsIHlvdSdsbCBmaW5kIHRoZQorYGdtb2NrX2dlbi5weWAgdG9vbCBpbiBHb29nbGUgTW9jaydzIGBzY3JpcHRzL2dlbmVyYXRvci9gIGRpcmVjdG9yeSAoY291cnRlc3kgb2YgdGhlIFtjcHBjbGVhbl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NwcGNsZWFuLykgcHJvamVjdCkgdXNlZnVsLiAgVGhpcyBjb21tYW5kLWxpbmUKK3Rvb2wgcmVxdWlyZXMgdGhhdCB5b3UgaGF2ZSBQeXRob24gMi40IGluc3RhbGxlZC4gIFlvdSBnaXZlIGl0IGEgQysrIGZpbGUgYW5kIHRoZSBuYW1lIG9mIGFuIGFic3RyYWN0IGNsYXNzIGRlZmluZWQgaW4gaXQsCithbmQgaXQgd2lsbCBwcmludCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbW9jayBjbGFzcyBmb3IgeW91LiAgRHVlIHRvIHRoZQorY29tcGxleGl0eSBvZiB0aGUgQysrIGxhbmd1YWdlLCB0aGlzIHNjcmlwdCBtYXkgbm90IGFsd2F5cyB3b3JrLCBidXQKK2l0IGNhbiBiZSBxdWl0ZSBoYW5keSB3aGVuIGl0IGRvZXMuICBGb3IgbW9yZSBkZXRhaWxzLCByZWFkIHRoZSBbdXNlciBkb2N1bWVudGF0aW9uXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvZ2VuZXJhdG9yL1JFQURNRSkuCisKKyMjIFdoZXJlIHRvIFB1dCBJdCAjIworV2hlbiB5b3UgZGVmaW5lIGEgbW9jayBjbGFzcywgeW91IG5lZWQgdG8gZGVjaWRlIHdoZXJlIHRvIHB1dCBpdHMgZGVmaW5pdGlvbi4gU29tZSBwZW9wbGUgcHV0IGl0IGluIGEgYCpfdGVzdC5jY2AuIFRoaXMgaXMgZmluZSB3aGVuIHRoZSBpbnRlcmZhY2UgYmVpbmcgbW9ja2VkIChzYXksIGBGb29gKSBpcyBvd25lZCBieSB0aGUgc2FtZSBwZXJzb24gb3IgdGVhbS4gT3RoZXJ3aXNlLCB3aGVuIHRoZSBvd25lciBvZiBgRm9vYCBjaGFuZ2VzIGl0LCB5b3VyIHRlc3QgY291bGQgYnJlYWsuIChZb3UgY2FuJ3QgcmVhbGx5IGV4cGVjdCBgRm9vYCdzIG1haW50YWluZXIgdG8gZml4IGV2ZXJ5IHRlc3QgdGhhdCB1c2VzIGBGb29gLCBjYW4geW91PykKKworU28sIHRoZSBydWxlIG9mIHRodW1iIGlzOiBpZiB5b3UgbmVlZCB0byBtb2NrIGBGb29gIGFuZCBpdCdzIG93bmVkIGJ5IG90aGVycywgZGVmaW5lIHRoZSBtb2NrIGNsYXNzIGluIGBGb29gJ3MgcGFja2FnZSAoYmV0dGVyLCBpbiBhIGB0ZXN0aW5nYCBzdWItcGFja2FnZSBzdWNoIHRoYXQgeW91IGNhbiBjbGVhcmx5IHNlcGFyYXRlIHByb2R1Y3Rpb24gY29kZSBhbmQgdGVzdGluZyB1dGlsaXRpZXMpLCBhbmQgcHV0IGl0IGluIGEgYG1vY2tfZm9vLmhgLiBUaGVuIGV2ZXJ5b25lIGNhbiByZWZlcmVuY2UgYG1vY2tfZm9vLmhgIGZyb20gdGhlaXIgdGVzdHMuIElmIGBGb29gIGV2ZXIgY2hhbmdlcywgdGhlcmUgaXMgb25seSBvbmUgY29weSBvZiBgTW9ja0Zvb2AgdG8gY2hhbmdlLCBhbmQgb25seSB0ZXN0cyB0aGF0IGRlcGVuZCBvbiB0aGUgY2hhbmdlZCBtZXRob2RzIG5lZWQgdG8gYmUgZml4ZWQuCisKK0Fub3RoZXIgd2F5IHRvIGRvIGl0OiB5b3UgY2FuIGludHJvZHVjZSBhIHRoaW4gbGF5ZXIgYEZvb0FkYXB0b3JgIG9uIHRvcCBvZiBgRm9vYCBhbmQgY29kZSB0byB0aGlzIG5ldyBpbnRlcmZhY2UuIFNpbmNlIHlvdSBvd24gYEZvb0FkYXB0b3JgLCB5b3UgY2FuIGFic29yYiBjaGFuZ2VzIGluIGBGb29gIG11Y2ggbW9yZSBlYXNpbHkuIFdoaWxlIHRoaXMgaXMgbW9yZSB3b3JrIGluaXRpYWxseSwgY2FyZWZ1bGx5IGNob29zaW5nIHRoZSBhZGFwdG9yIGludGVyZmFjZSBjYW4gbWFrZSB5b3VyIGNvZGUgZWFzaWVyIHRvIHdyaXRlIGFuZCBtb3JlIHJlYWRhYmxlIChhIG5ldCB3aW4gaW4gdGhlIGxvbmcgcnVuKSwgYXMgeW91IGNhbiBjaG9vc2UgYEZvb0FkYXB0b3JgIHRvIGZpdCB5b3VyIHNwZWNpZmljIGRvbWFpbiBtdWNoIGJldHRlciB0aGFuIGBGb29gIGRvZXMuCisKKyMgVXNpbmcgTW9ja3MgaW4gVGVzdHMgIworT25jZSB5b3UgaGF2ZSBhIG1vY2sgY2xhc3MsIHVzaW5nIGl0IGlzIGVhc3kuIFRoZSB0eXBpY2FsIHdvcmsgZmxvdyBpczoKKworICAxLiBJbXBvcnQgdGhlIEdvb2dsZSBNb2NrIG5hbWVzIGZyb20gdGhlIGB0ZXN0aW5nYCBuYW1lc3BhY2Ugc3VjaCB0aGF0IHlvdSBjYW4gdXNlIHRoZW0gdW5xdWFsaWZpZWQgKFlvdSBvbmx5IGhhdmUgdG8gZG8gaXQgb25jZSBwZXIgZmlsZS4gUmVtZW1iZXIgdGhhdCBuYW1lc3BhY2VzIGFyZSBhIGdvb2QgaWRlYSBhbmQgZ29vZCBmb3IgeW91ciBoZWFsdGguKS4KKyAgMS4gQ3JlYXRlIHNvbWUgbW9jayBvYmplY3RzLgorICAxLiBTcGVjaWZ5IHlvdXIgZXhwZWN0YXRpb25zIG9uIHRoZW0gKEhvdyBtYW55IHRpbWVzIHdpbGwgYSBtZXRob2QgYmUgY2FsbGVkPyBXaXRoIHdoYXQgYXJndW1lbnRzPyBXaGF0IHNob3VsZCBpdCBkbz8gZXRjLikuCisgIDEuIEV4ZXJjaXNlIHNvbWUgY29kZSB0aGF0IHVzZXMgdGhlIG1vY2tzOyBvcHRpb25hbGx5LCBjaGVjayB0aGUgcmVzdWx0IHVzaW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMuIElmIGEgbW9jayBtZXRob2QgaXMgY2FsbGVkIG1vcmUgdGhhbiBleHBlY3RlZCBvciB3aXRoIHdyb25nIGFyZ3VtZW50cywgeW91J2xsIGdldCBhbiBlcnJvciBpbW1lZGlhdGVseS4KKyAgMS4gV2hlbiBhIG1vY2sgaXMgZGVzdHJ1Y3RlZCwgR29vZ2xlIE1vY2sgd2lsbCBhdXRvbWF0aWNhbGx5IGNoZWNrIHdoZXRoZXIgYWxsIGV4cGVjdGF0aW9ucyBvbiBpdCBoYXZlIGJlZW4gc2F0aXNmaWVkLgorCitIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCisjaW5jbHVkZSAicGF0aC90by9tb2NrLXR1cnRsZS5oIgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KK3VzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsgICAgICAgICAgICAgICAgICAgICAvLyAjMQorCitURVNUKFBhaW50ZXJUZXN0LCBDYW5EcmF3U29tZXRoaW5nKSB7CisgIE1vY2tUdXJ0bGUgdHVydGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzIKKyAgRVhQRUNUX0NBTEwodHVydGxlLCBQZW5Eb3duKCkpICAgICAgICAgICAgICAvLyAjMworICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpOworCisgIFBhaW50ZXIgcGFpbnRlcigmdHVydGxlKTsgICAgICAgICAgICAgICAgICAgLy8gIzQKKworICBFWFBFQ1RfVFJVRShwYWludGVyLkRyYXdDaXJjbGUoMCwgMCwgMTApKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjNQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIG11c3QgYmUgZXhlY3V0ZWQgdG8gaW5pdGlhbGl6ZSBHb29nbGUgTW9jaworICAvLyAoYW5kIEdvb2dsZSBUZXN0KSBiZWZvcmUgcnVubmluZyB0aGUgdGVzdHMuCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZU1vY2soJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorYGBgCisKK0FzIHlvdSBtaWdodCBoYXZlIGd1ZXNzZWQsIHRoaXMgdGVzdCBjaGVja3MgdGhhdCBgUGVuRG93bigpYCBpcyBjYWxsZWQgYXQgbGVhc3Qgb25jZS4gSWYgdGhlIGBwYWludGVyYCBvYmplY3QgZGlkbid0IGNhbGwgdGhpcyBtZXRob2QsIHlvdXIgdGVzdCB3aWxsIGZhaWwgd2l0aCBhIG1lc3NhZ2UgbGlrZSB0aGlzOgorCitgYGAKK3BhdGgvdG8vbXlfdGVzdC5jYzoxMTk6IEZhaWx1cmUKK0FjdHVhbCBmdW5jdGlvbiBjYWxsIGNvdW50IGRvZXNuJ3QgbWF0Y2ggdGhpcyBleHBlY3RhdGlvbjoKK0FjdHVhbGx5OiBuZXZlciBjYWxsZWQ7CitFeHBlY3RlZDogY2FsbGVkIGF0IGxlYXN0IG9uY2UuCitgYGAKKworKipUaXAgMToqKiBJZiB5b3UgcnVuIHRoZSB0ZXN0IGZyb20gYW4gRW1hY3MgYnVmZmVyLCB5b3UgY2FuIGhpdCBgPEVudGVyPmAgb24gdGhlIGxpbmUgbnVtYmVyIGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZSB0byBqdW1wIHJpZ2h0IHRvIHRoZSBmYWlsZWQgZXhwZWN0YXRpb24uCisKKyoqVGlwIDI6KiogSWYgeW91ciBtb2NrIG9iamVjdHMgYXJlIG5ldmVyIGRlbGV0ZWQsIHRoZSBmaW5hbCB2ZXJpZmljYXRpb24gd29uJ3QgaGFwcGVuLiBUaGVyZWZvcmUgaXQncyBhIGdvb2QgaWRlYSB0byB1c2UgYSBoZWFwIGxlYWsgY2hlY2tlciBpbiB5b3VyIHRlc3RzIHdoZW4geW91IGFsbG9jYXRlIG1vY2tzIG9uIHRoZSBoZWFwLgorCisqKkltcG9ydGFudCBub3RlOioqIEdvb2dsZSBNb2NrIHJlcXVpcmVzIGV4cGVjdGF0aW9ucyB0byBiZSBzZXQgKipiZWZvcmUqKiB0aGUgbW9jayBmdW5jdGlvbnMgYXJlIGNhbGxlZCwgb3RoZXJ3aXNlIHRoZSBiZWhhdmlvciBpcyAqKnVuZGVmaW5lZCoqLiBJbiBwYXJ0aWN1bGFyLCB5b3UgbXVzdG4ndCBpbnRlcmxlYXZlIGBFWFBFQ1RfQ0FMTCgpYHMgYW5kIGNhbGxzIHRvIHRoZSBtb2NrIGZ1bmN0aW9ucy4KKworVGhpcyBtZWFucyBgRVhQRUNUX0NBTEwoKWAgc2hvdWxkIGJlIHJlYWQgYXMgZXhwZWN0aW5nIHRoYXQgYSBjYWxsIHdpbGwgb2NjdXIgX2luIHRoZSBmdXR1cmVfLCBub3QgdGhhdCBhIGNhbGwgaGFzIG9jY3VycmVkLiBXaHkgZG9lcyBHb29nbGUgTW9jayB3b3JrIGxpa2UgdGhhdD8gV2VsbCwgc3BlY2lmeWluZyB0aGUgZXhwZWN0YXRpb24gYmVmb3JlaGFuZCBhbGxvd3MgR29vZ2xlIE1vY2sgdG8gcmVwb3J0IGEgdmlvbGF0aW9uIGFzIHNvb24gYXMgaXQgYXJpc2VzLCB3aGVuIHRoZSBjb250ZXh0IChzdGFjayB0cmFjZSwgZXRjKSBpcyBzdGlsbCBhdmFpbGFibGUuIFRoaXMgbWFrZXMgZGVidWdnaW5nIG11Y2ggZWFzaWVyLgorCitBZG1pdHRlZGx5LCB0aGlzIHRlc3QgaXMgY29udHJpdmVkIGFuZCBkb2Vzbid0IGRvIG11Y2guIFlvdSBjYW4gZWFzaWx5IGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IHdpdGhvdXQgdXNpbmcgR29vZ2xlIE1vY2suIEhvd2V2ZXIsIGFzIHdlIHNoYWxsIHJldmVhbCBzb29uLCBHb29nbGUgTW9jayBhbGxvd3MgeW91IHRvIGRvIF9tdWNoIG1vcmVfIHdpdGggdGhlIG1vY2tzLgorCisjIyBVc2luZyBHb29nbGUgTW9jayB3aXRoIEFueSBUZXN0aW5nIEZyYW1ld29yayAjIworSWYgeW91IHdhbnQgdG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIEdvb2dsZSBUZXN0IChlLmcuIFtDcHBVbml0XShodHRwOi8vYXBwcy5zb3VyY2Vmb3JnZS5uZXQvbWVkaWF3aWtpL2NwcHVuaXQvaW5kZXgucGhwP3RpdGxlPU1haW5fUGFnZSkgb3IKK1tDeHhUZXN0XShodHRwOi8vY3h4dGVzdC50aWdyaXMub3JnLykpIGFzIHlvdXIgdGVzdGluZyBmcmFtZXdvcmssIGp1c3QgY2hhbmdlIHRoZSBgbWFpbigpYCBmdW5jdGlvbiBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiB0bzoKK2BgYAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBjYXVzZXMgR29vZ2xlIE1vY2sgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUsCisgIC8vIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgeW91ciB0ZXN0aW5nIGZyYW1ld29yayBhcyBhIHRlc3QgZmFpbHVyZS4KKyAgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdHJ1ZTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7CisgIC4uLiB3aGF0ZXZlciB5b3VyIHRlc3RpbmcgZnJhbWV3b3JrIHJlcXVpcmVzIC4uLgorfQorYGBgCisKK1RoaXMgYXBwcm9hY2ggaGFzIGEgY2F0Y2g6IGl0IG1ha2VzIEdvb2dsZSBNb2NrIHRocm93IGFuIGV4Y2VwdGlvbgorZnJvbSBhIG1vY2sgb2JqZWN0J3MgZGVzdHJ1Y3RvciBzb21ldGltZXMuICBXaXRoIHNvbWUgY29tcGlsZXJzLCB0aGlzCitzb21ldGltZXMgY2F1c2VzIHRoZSB0ZXN0IHByb2dyYW0gdG8gY3Jhc2guICBZb3UnbGwgc3RpbGwgYmUgYWJsZSB0bworbm90aWNlIHRoYXQgdGhlIHRlc3QgaGFzIGZhaWxlZCwgYnV0IGl0J3Mgbm90IGEgZ3JhY2VmdWwgZmFpbHVyZS4KKworQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gdXNlIEdvb2dsZSBUZXN0J3MKK1tldmVudCBsaXN0ZW5lciBBUEldKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvR29vZ2xlVGVzdEFkdmFuY2VkR3VpZGUjRXh0ZW5kaW5nX0dvb2dsZV9UZXN0X2J5X0hhbmRsaW5nX1Rlc3RfRXZlbnRzKQordG8gcmVwb3J0IGEgdGVzdCBmYWlsdXJlIHRvIHlvdXIgdGVzdGluZyBmcmFtZXdvcmsgcHJvcGVybHkuICBZb3UnbGwgbmVlZCB0bworaW1wbGVtZW50IHRoZSBgT25UZXN0UGFydFJlc3VsdCgpYCBtZXRob2Qgb2YgdGhlIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZSwgYnV0IGl0CitzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkLgorCitJZiB0aGlzIHR1cm5zIG91dCB0byBiZSB0b28gbXVjaCB3b3JrLCB3ZSBzdWdnZXN0IHRoYXQgeW91IHN0aWNrIHdpdGgKK0dvb2dsZSBUZXN0LCB3aGljaCB3b3JrcyB3aXRoIEdvb2dsZSBNb2NrIHNlYW1sZXNzbHkgKGluIGZhY3QsIGl0IGlzCit0ZWNobmljYWxseSBwYXJ0IG9mIEdvb2dsZSBNb2NrLikuICBJZiB0aGVyZSBpcyBhIHJlYXNvbiB0aGF0IHlvdQorY2Fubm90IHVzZSBHb29nbGUgVGVzdCwgcGxlYXNlIGxldCB1cyBrbm93LgorCisjIFNldHRpbmcgRXhwZWN0YXRpb25zICMKK1RoZSBrZXkgdG8gdXNpbmcgYSBtb2NrIG9iamVjdCBzdWNjZXNzZnVsbHkgaXMgdG8gc2V0IHRoZSBfcmlnaHQgZXhwZWN0YXRpb25zXyBvbiBpdC4gSWYgeW91IHNldCB0aGUgZXhwZWN0YXRpb25zIHRvbyBzdHJpY3QsIHlvdXIgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHJlc3VsdCBvZiB1bnJlbGF0ZWQgY2hhbmdlcy4gSWYgeW91IHNldCB0aGVtIHRvbyBsb29zZSwgYnVncyBjYW4gc2xpcCB0aHJvdWdoLiBZb3Ugd2FudCB0byBkbyBpdCBqdXN0IHJpZ2h0IHN1Y2ggdGhhdCB5b3VyIHRlc3QgY2FuIGNhdGNoIGV4YWN0bHkgdGhlIGtpbmQgb2YgYnVncyB5b3UgaW50ZW5kIGl0IHRvIGNhdGNoLiBHb29nbGUgTW9jayBwcm92aWRlcyB0aGUgbmVjZXNzYXJ5IG1lYW5zIGZvciB5b3UgdG8gZG8gaXQgImp1c3QgcmlnaHQuIgorCisjIyBHZW5lcmFsIFN5bnRheCAjIworSW4gR29vZ2xlIE1vY2sgd2UgdXNlIHRoZSBgRVhQRUNUX0NBTEwoKWAgbWFjcm8gdG8gc2V0IGFuIGV4cGVjdGF0aW9uIG9uIGEgbW9jayBtZXRob2QuIFRoZSBnZW5lcmFsIHN5bnRheCBpczoKKworYGBgCitFWFBFQ1RfQ0FMTChtb2NrX29iamVjdCwgbWV0aG9kKG1hdGNoZXJzKSkKKyAgICAuVGltZXMoY2FyZGluYWxpdHkpCisgICAgLldpbGxPbmNlKGFjdGlvbikKKyAgICAuV2lsbFJlcGVhdGVkbHkoYWN0aW9uKTsKK2BgYAorCitUaGUgbWFjcm8gaGFzIHR3byBhcmd1bWVudHM6IGZpcnN0IHRoZSBtb2NrIG9iamVjdCwgYW5kIHRoZW4gdGhlIG1ldGhvZCBhbmQgaXRzIGFyZ3VtZW50cy4gTm90ZSB0aGF0IHRoZSB0d28gYXJlIHNlcGFyYXRlZCBieSBhIGNvbW1hIChgLGApLCBub3QgYSBwZXJpb2QgKGAuYCkuIChXaHkgdXNpbmcgYSBjb21tYT8gVGhlIGFuc3dlciBpcyB0aGF0IGl0IHdhcyBuZWNlc3NhcnkgZm9yIHRlY2huaWNhbCByZWFzb25zLikKKworVGhlIG1hY3JvIGNhbiBiZSBmb2xsb3dlZCBieSBzb21lIG9wdGlvbmFsIF9jbGF1c2VzXyB0aGF0IHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhwZWN0YXRpb24uIFdlJ2xsIGRpc2N1c3MgaG93IGVhY2ggY2xhdXNlIHdvcmtzIGluIHRoZSBjb21pbmcgc2VjdGlvbnMuCisKK1RoaXMgc3ludGF4IGlzIGRlc2lnbmVkIHRvIG1ha2UgYW4gZXhwZWN0YXRpb24gcmVhZCBsaWtlIEVuZ2xpc2guIEZvciBleGFtcGxlLCB5b3UgY2FuIHByb2JhYmx5IGd1ZXNzIHRoYXQKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsuLi4KK0VYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WCgpKQorICAgIC5UaW1lcyg1KQorICAgIC5XaWxsT25jZShSZXR1cm4oMTAwKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDE1MCkpCisgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigyMDApKTsKK2BgYAorCitzYXlzIHRoYXQgdGhlIGB0dXJ0bGVgIG9iamVjdCdzIGBHZXRYKClgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBmaXZlIHRpbWVzLCBpdCB3aWxsIHJldHVybiAxMDAgdGhlIGZpcnN0IHRpbWUsIDE1MCB0aGUgc2Vjb25kIHRpbWUsIGFuZCB0aGVuIDIwMCBldmVyeSB0aW1lLiBTb21lIHBlb3BsZSBsaWtlIHRvIGNhbGwgdGhpcyBzdHlsZSBvZiBzeW50YXggYSBEb21haW4tU3BlY2lmaWMgTGFuZ3VhZ2UgKERTTCkuCisKKyoqTm90ZToqKiBXaHkgZG8gd2UgdXNlIGEgbWFjcm8gdG8gZG8gdGhpcz8gSXQgc2VydmVzIHR3byBwdXJwb3NlczogZmlyc3QgaXQgbWFrZXMgZXhwZWN0YXRpb25zIGVhc2lseSBpZGVudGlmaWFibGUgKGVpdGhlciBieSBgZ3JlcGAgb3IgYnkgYSBodW1hbiByZWFkZXIpLCBhbmQgc2Vjb25kIGl0IGFsbG93cyBHb29nbGUgTW9jayB0byBpbmNsdWRlIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBvZiBhIGZhaWxlZCBleHBlY3RhdGlvbiBpbiBtZXNzYWdlcywgbWFraW5nIGRlYnVnZ2luZyBlYXNpZXIuCisKKyMjIE1hdGNoZXJzOiBXaGF0IEFyZ3VtZW50cyBEbyBXZSBFeHBlY3Q/ICMjCitXaGVuIGEgbW9jayBmdW5jdGlvbiB0YWtlcyBhcmd1bWVudHMsIHdlIG11c3Qgc3BlY2lmeSB3aGF0IGFyZ3VtZW50cyB3ZSBhcmUgZXhwZWN0aW5nOyBmb3IgZXhhbXBsZToKKworYGBgCisvLyBFeHBlY3RzIHRoZSB0dXJ0bGUgdG8gbW92ZSBmb3J3YXJkIGJ5IDEwMCB1bml0cy4KK0VYUEVDVF9DQUxMKHR1cnRsZSwgRm9yd2FyZCgxMDApKTsKK2BgYAorCitTb21ldGltZXMgeW91IG1heSBub3Qgd2FudCB0byBiZSB0b28gc3BlY2lmaWMgKFJlbWVtYmVyIHRoYXQgdGFsayBhYm91dCB0ZXN0cyBiZWluZyB0b28gcmlnaWQ/IE92ZXIgc3BlY2lmaWNhdGlvbiBsZWFkcyB0byBicml0dGxlIHRlc3RzIGFuZCBvYnNjdXJlcyB0aGUgaW50ZW50IG9mIHRlc3RzLiBUaGVyZWZvcmUgd2UgZW5jb3VyYWdlIHlvdSB0byBzcGVjaWZ5IG9ubHkgd2hhdCdzIG5lY2Vzc2FyeSAtIG5vIG1vcmUsIG5vIGxlc3MuKS4gSWYgeW91IGNhcmUgdG8gY2hlY2sgdGhhdCBgRm9yd2FyZCgpYCB3aWxsIGJlIGNhbGxlZCBidXQgYXJlbid0IGludGVyZXN0ZWQgaW4gaXRzIGFjdHVhbCBhcmd1bWVudCwgd3JpdGUgYF9gIGFzIHRoZSBhcmd1bWVudCwgd2hpY2ggbWVhbnMgImFueXRoaW5nIGdvZXMiOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKy4uLgorLy8gRXhwZWN0cyB0aGUgdHVydGxlIHRvIG1vdmUgZm9yd2FyZC4KK0VYUEVDVF9DQUxMKHR1cnRsZSwgRm9yd2FyZChfKSk7CitgYGAKKworYF9gIGlzIGFuIGluc3RhbmNlIG9mIHdoYXQgd2UgY2FsbCAqKm1hdGNoZXJzKiouIEEgbWF0Y2hlciBpcyBsaWtlIGEgcHJlZGljYXRlIGFuZCBjYW4gdGVzdCB3aGV0aGVyIGFuIGFyZ3VtZW50IGlzIHdoYXQgd2UnZCBleHBlY3QuIFlvdSBjYW4gdXNlIGEgbWF0Y2hlciBpbnNpZGUgYEVYUEVDVF9DQUxMKClgIHdoZXJldmVyIGEgZnVuY3Rpb24gYXJndW1lbnQgaXMgZXhwZWN0ZWQuCisKK0EgbGlzdCBvZiBidWlsdC1pbiBtYXRjaGVycyBjYW4gYmUgZm91bmQgaW4gdGhlIFtDaGVhdFNoZWV0XShWMV81X0NoZWF0U2hlZXQubWQpLiBGb3IgZXhhbXBsZSwgaGVyZSdzIHRoZSBgR2VgIChncmVhdGVyIHRoYW4gb3IgZXF1YWwpIG1hdGNoZXI6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpHZTsuLi4KK0VYUEVDVF9DQUxMKHR1cnRsZSwgRm9yd2FyZChHZSgxMDApKSk7CitgYGAKKworVGhpcyBjaGVja3MgdGhhdCB0aGUgdHVydGxlIHdpbGwgYmUgdG9sZCB0byBnbyBmb3J3YXJkIGJ5IGF0IGxlYXN0IDEwMCB1bml0cy4KKworIyMgQ2FyZGluYWxpdGllczogSG93IE1hbnkgVGltZXMgV2lsbCBJdCBCZSBDYWxsZWQ/ICMjCitUaGUgZmlyc3QgY2xhdXNlIHdlIGNhbiBzcGVjaWZ5IGZvbGxvd2luZyBhbiBgRVhQRUNUX0NBTEwoKWAgaXMgYFRpbWVzKClgLiBXZSBjYWxsIGl0cyBhcmd1bWVudCBhICoqY2FyZGluYWxpdHkqKiBhcyBpdCB0ZWxscyBfaG93IG1hbnkgdGltZXNfIHRoZSBjYWxsIHNob3VsZCBvY2N1ci4gSXQgYWxsb3dzIHVzIHRvIHJlcGVhdCBhbiBleHBlY3RhdGlvbiBtYW55IHRpbWVzIHdpdGhvdXQgYWN0dWFsbHkgd3JpdGluZyBpdCBhcyBtYW55IHRpbWVzLiBNb3JlIGltcG9ydGFudGx5LCBhIGNhcmRpbmFsaXR5IGNhbiBiZSAiZnV6enkiLCBqdXN0IGxpa2UgYSBtYXRjaGVyIGNhbiBiZS4gVGhpcyBhbGxvd3MgYSB1c2VyIHRvIGV4cHJlc3MgdGhlIGludGVudCBvZiBhIHRlc3QgZXhhY3RseS4KKworQW4gaW50ZXJlc3Rpbmcgc3BlY2lhbCBjYXNlIGlzIHdoZW4gd2Ugc2F5IGBUaW1lcygwKWAuIFlvdSBtYXkgaGF2ZSBndWVzc2VkIC0gaXQgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkbid0IGJlIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYXQgYWxsLCBhbmQgR29vZ2xlIE1vY2sgd2lsbCByZXBvcnQgYSBHb29nbGUgVGVzdCBmYWlsdXJlIHdoZW5ldmVyIHRoZSBmdW5jdGlvbiBpcyAod3JvbmdmdWxseSkgY2FsbGVkLgorCitXZSd2ZSBzZWVuIGBBdExlYXN0KG4pYCBhcyBhbiBleGFtcGxlIG9mIGZ1enp5IGNhcmRpbmFsaXRpZXMgZWFybGllci4gRm9yIHRoZSBsaXN0IG9mIGJ1aWx0LWluIGNhcmRpbmFsaXRpZXMgeW91IGNhbiB1c2UsIHNlZSB0aGUgW0NoZWF0U2hlZXRdKFYxXzVfQ2hlYXRTaGVldC5tZCkuCisKK1RoZSBgVGltZXMoKWAgY2xhdXNlIGNhbiBiZSBvbWl0dGVkLiAqKklmIHlvdSBvbWl0IGBUaW1lcygpYCwgR29vZ2xlIE1vY2sgd2lsbCBpbmZlciB0aGUgY2FyZGluYWxpdHkgZm9yIHlvdS4qKiBUaGUgcnVsZXMgYXJlIGVhc3kgdG8gcmVtZW1iZXI6CisKKyAgKiBJZiAqKm5laXRoZXIqKiBgV2lsbE9uY2UoKWAgKipub3IqKiBgV2lsbFJlcGVhdGVkbHkoKWAgaXMgaW4gdGhlIGBFWFBFQ1RfQ0FMTCgpYCwgdGhlIGluZmVycmVkIGNhcmRpbmFsaXR5IGlzIGBUaW1lcygxKWAuCisgICogSWYgdGhlcmUgYXJlIGBuIFdpbGxPbmNlKClgJ3MgYnV0ICoqbm8qKiBgV2lsbFJlcGVhdGVkbHkoKWAsIHdoZXJlIGBuYCA+PSAxLCB0aGUgY2FyZGluYWxpdHkgaXMgYFRpbWVzKG4pYC4KKyAgKiBJZiB0aGVyZSBhcmUgYG4gV2lsbE9uY2UoKWAncyBhbmQgKipvbmUqKiBgV2lsbFJlcGVhdGVkbHkoKWAsIHdoZXJlIGBuYCA+PSAwLCB0aGUgY2FyZGluYWxpdHkgaXMgYFRpbWVzKEF0TGVhc3QobikpYC4KKworKipRdWljayBxdWl6OioqIHdoYXQgZG8geW91IHRoaW5rIHdpbGwgaGFwcGVuIGlmIGEgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIHR3aWNlIGJ1dCBhY3R1YWxseSBjYWxsZWQgZm91ciB0aW1lcz8KKworIyMgQWN0aW9uczogV2hhdCBTaG91bGQgSXQgRG8/ICMjCitSZW1lbWJlciB0aGF0IGEgbW9jayBvYmplY3QgZG9lc24ndCByZWFsbHkgaGF2ZSBhIHdvcmtpbmcgaW1wbGVtZW50YXRpb24/IFdlIGFzIHVzZXJzIGhhdmUgdG8gdGVsbCBpdCB3aGF0IHRvIGRvIHdoZW4gYSBtZXRob2QgaXMgaW52b2tlZC4gVGhpcyBpcyBlYXN5IGluIEdvb2dsZSBNb2NrLgorCitGaXJzdCwgaWYgdGhlIHJldHVybiB0eXBlIG9mIGEgbW9jayBmdW5jdGlvbiBpcyBhIGJ1aWx0LWluIHR5cGUgb3IgYSBwb2ludGVyLCB0aGUgZnVuY3Rpb24gaGFzIGEgKipkZWZhdWx0IGFjdGlvbioqIChhIGB2b2lkYCBmdW5jdGlvbiB3aWxsIGp1c3QgcmV0dXJuLCBhIGBib29sYCBmdW5jdGlvbiB3aWxsIHJldHVybiBgZmFsc2VgLCBhbmQgb3RoZXIgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIDApLiBJZiB5b3UgZG9uJ3Qgc2F5IGFueXRoaW5nLCB0aGlzIGJlaGF2aW9yIHdpbGwgYmUgdXNlZC4KKworU2Vjb25kLCBpZiBhIG1vY2sgZnVuY3Rpb24gZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBhY3Rpb24sIG9yIHRoZSBkZWZhdWx0IGFjdGlvbiBkb2Vzbid0IHN1aXQgeW91LCB5b3UgY2FuIHNwZWNpZnkgdGhlIGFjdGlvbiB0byBiZSB0YWtlbiBlYWNoIHRpbWUgdGhlIGV4cGVjdGF0aW9uIG1hdGNoZXMgdXNpbmcgYSBzZXJpZXMgb2YgYFdpbGxPbmNlKClgIGNsYXVzZXMgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgYFdpbGxSZXBlYXRlZGx5KClgLiBGb3IgZXhhbXBsZSwKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsuLi4KK0VYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WCgpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMTAwKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDIwMCkpCisgICAgLldpbGxPbmNlKFJldHVybigzMDApKTsKK2BgYAorCitUaGlzIHNheXMgdGhhdCBgdHVydGxlLkdldFgoKWAgd2lsbCBiZSBjYWxsZWQgX2V4YWN0bHkgdGhyZWUgdGltZXNfIChHb29nbGUgTW9jayBpbmZlcnJlZCB0aGlzIGZyb20gaG93IG1hbnkgYFdpbGxPbmNlKClgIGNsYXVzZXMgd2UndmUgd3JpdHRlbiwgc2luY2Ugd2UgZGlkbid0IGV4cGxpY2l0bHkgd3JpdGUgYFRpbWVzKClgKSwgYW5kIHdpbGwgcmV0dXJuIDEwMCwgMjAwLCBhbmQgMzAwIHJlc3BlY3RpdmVseS4KKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsuLi4KK0VYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WSgpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMTAwKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDIwMCkpCisgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigzMDApKTsKK2BgYAorCitzYXlzIHRoYXQgYHR1cnRsZS5HZXRZKClgIHdpbGwgYmUgY2FsbGVkIF9hdCBsZWFzdCB0d2ljZV8gKEdvb2dsZSBNb2NrIGtub3dzIHRoaXMgYXMgd2UndmUgd3JpdHRlbiB0d28gYFdpbGxPbmNlKClgIGNsYXVzZXMgYW5kIGEgYFdpbGxSZXBlYXRlZGx5KClgIHdoaWxlIGhhdmluZyBubyBleHBsaWNpdCBgVGltZXMoKWApLCB3aWxsIHJldHVybiAxMDAgdGhlIGZpcnN0IHRpbWUsIDIwMCB0aGUgc2Vjb25kIHRpbWUsIGFuZCAzMDAgZnJvbSB0aGUgdGhpcmQgdGltZSBvbi4KKworT2YgY291cnNlLCBpZiB5b3UgZXhwbGljaXRseSB3cml0ZSBhIGBUaW1lcygpYCwgR29vZ2xlIE1vY2sgd2lsbCBub3QgdHJ5IHRvIGluZmVyIHRoZSBjYXJkaW5hbGl0eSBpdHNlbGYuIFdoYXQgaWYgdGhlIG51bWJlciB5b3Ugc3BlY2lmaWVkIGlzIGxhcmdlciB0aGFuIHRoZXJlIGFyZSBgV2lsbE9uY2UoKWAgY2xhdXNlcz8gV2VsbCwgYWZ0ZXIgYWxsIGBXaWxsT25jZSgpYHMgYXJlIHVzZWQgdXAsIEdvb2dsZSBNb2NrIHdpbGwgZG8gdGhlIF9kZWZhdWx0XyBhY3Rpb24gZm9yIHRoZSBmdW5jdGlvbiBldmVyeSB0aW1lICh1bmxlc3MsIG9mIGNvdXJzZSwgeW91IGhhdmUgYSBgV2lsbFJlcGVhdGVkbHkoKWAuKS4KKworV2hhdCBjYW4gd2UgZG8gaW5zaWRlIGBXaWxsT25jZSgpYCBiZXNpZGVzIGBSZXR1cm4oKWA/IFlvdSBjYW4gcmV0dXJuIGEgcmVmZXJlbmNlIHVzaW5nIGBSZXR1cm5SZWYodmFyaWFibGUpYCwgb3IgaW52b2tlIGEgcHJlLWRlZmluZWQgZnVuY3Rpb24sIGFtb25nIFtvdGhlcnNdKFYxXzVfQ2hlYXRTaGVldCNBY3Rpb25zLm1kKS4KKworKipJbXBvcnRhbnQgbm90ZToqKiBUaGUgYEVYUEVDVF9DQUxMKClgIHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGFjdGlvbiBjbGF1c2Ugb25seSBvbmNlLCBldmVuIHRob3VnaCB0aGUgYWN0aW9uIG1heSBiZSBwZXJmb3JtZWQgbWFueSB0aW1lcy4gVGhlcmVmb3JlIHlvdSBtdXN0IGJlIGNhcmVmdWwgYWJvdXQgc2lkZSBlZmZlY3RzLiBUaGUgZm9sbG93aW5nIG1heSBub3QgZG8gd2hhdCB5b3Ugd2FudDoKKworYGBgCitpbnQgbiA9IDEwMDsKK0VYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WCgpKQorLlRpbWVzKDQpCisuV2lsbE9uY2UoUmV0dXJuKG4rKykpOworYGBgCisKK0luc3RlYWQgb2YgcmV0dXJuaW5nIDEwMCwgMTAxLCAxMDIsIC4uLiwgY29uc2VjdXRpdmVseSwgdGhpcyBtb2NrIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiAxMDAgYXMgYG4rK2AgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gU2ltaWxhcmx5LCBgUmV0dXJuKG5ldyBGb28pYCB3aWxsIGNyZWF0ZSBhIG5ldyBgRm9vYCBvYmplY3Qgd2hlbiB0aGUgYEVYUEVDVF9DQUxMKClgIGlzIGV4ZWN1dGVkLCBhbmQgd2lsbCByZXR1cm4gdGhlIHNhbWUgcG9pbnRlciBldmVyeSB0aW1lLiBJZiB5b3Ugd2FudCB0aGUgc2lkZSBlZmZlY3QgdG8gaGFwcGVuIGV2ZXJ5IHRpbWUsIHlvdSBuZWVkIHRvIGRlZmluZSBhIGN1c3RvbSBhY3Rpb24sIHdoaWNoIHdlJ2xsIHRlYWNoIGluIHRoZSBbQ29va0Jvb2tdKFYxXzVfQ29va0Jvb2subWQpLgorCitUaW1lIGZvciBhbm90aGVyIHF1aXohIFdoYXQgZG8geW91IHRoaW5rIHRoZSBmb2xsb3dpbmcgbWVhbnM/CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Li4uCitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdldFkoKSkKKy5UaW1lcyg0KQorLldpbGxPbmNlKFJldHVybigxMDApKTsKK2BgYAorCitPYnZpb3VzbHkgYHR1cnRsZS5HZXRZKClgIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBmb3VyIHRpbWVzLiBCdXQgaWYgeW91IHRoaW5rIGl0IHdpbGwgcmV0dXJuIDEwMCBldmVyeSB0aW1lLCB0aGluayB0d2ljZSEgUmVtZW1iZXIgdGhhdCBvbmUgYFdpbGxPbmNlKClgIGNsYXVzZSB3aWxsIGJlIGNvbnN1bWVkIGVhY2ggdGltZSB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZCBhbmQgdGhlIGRlZmF1bHQgYWN0aW9uIHdpbGwgYmUgdGFrZW4gYWZ0ZXJ3YXJkcy4gU28gdGhlIHJpZ2h0IGFuc3dlciBpcyB0aGF0IGB0dXJ0bGUuR2V0WSgpYCB3aWxsIHJldHVybiAxMDAgdGhlIGZpcnN0IHRpbWUsIGJ1dCAqKnJldHVybiAwIGZyb20gdGhlIHNlY29uZCB0aW1lIG9uKiosIGFzIHJldHVybmluZyAwIGlzIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgYGludGAgZnVuY3Rpb25zLgorCisjIyBVc2luZyBNdWx0aXBsZSBFeHBlY3RhdGlvbnMgIyMKK1NvIGZhciB3ZSd2ZSBvbmx5IHNob3duIGV4YW1wbGVzIHdoZXJlIHlvdSBoYXZlIGEgc2luZ2xlIGV4cGVjdGF0aW9uLiBNb3JlIHJlYWxpc3RpY2FsbHksIHlvdSdyZSBnb2luZyB0byBzcGVjaWZ5IGV4cGVjdGF0aW9ucyBvbiBtdWx0aXBsZSBtb2NrIG1ldGhvZHMsIHdoaWNoIG1heSBiZSBmcm9tIG11bHRpcGxlIG1vY2sgb2JqZWN0cy4KKworQnkgZGVmYXVsdCwgd2hlbiBhIG1vY2sgbWV0aG9kIGlzIGludm9rZWQsIEdvb2dsZSBNb2NrIHdpbGwgc2VhcmNoIHRoZSBleHBlY3RhdGlvbnMgaW4gdGhlICoqcmV2ZXJzZSBvcmRlcioqIHRoZXkgYXJlIGRlZmluZWQsIGFuZCBzdG9wIHdoZW4gYW4gYWN0aXZlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgYXJndW1lbnRzIGlzIGZvdW5kICh5b3UgY2FuIHRoaW5rIG9mIGl0IGFzICJuZXdlciBydWxlcyBvdmVycmlkZSBvbGRlciBvbmVzLiIpLiBJZiB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24gY2Fubm90IHRha2UgYW55IG1vcmUgY2FsbHMsIHlvdSB3aWxsIGdldCBhbiB1cHBlci1ib3VuZC12aW9sYXRlZCBmYWlsdXJlLiBIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Li4uCitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEZvcndhcmQoXykpOyAgLy8gIzEKK0VYUEVDVF9DQUxMKHR1cnRsZSwgRm9yd2FyZCgxMCkpICAvLyAjMgorICAgIC5UaW1lcygyKTsKK2BgYAorCitJZiBgRm9yd2FyZCgxMClgIGlzIGNhbGxlZCB0aHJlZSB0aW1lcyBpbiBhIHJvdywgdGhlIHRoaXJkIHRpbWUgaXQgd2lsbCBiZSBhbiBlcnJvciwgYXMgdGhlIGxhc3QgbWF0Y2hpbmcgZXhwZWN0YXRpb24gKCMyKSBoYXMgYmVlbiBzYXR1cmF0ZWQuIElmLCBob3dldmVyLCB0aGUgdGhpcmQgYEZvcndhcmQoMTApYCBjYWxsIGlzIHJlcGxhY2VkIGJ5IGBGb3J3YXJkKDIwKWAsIHRoZW4gaXQgd291bGQgYmUgT0ssIGFzIG5vdyAjMSB3aWxsIGJlIHRoZSBtYXRjaGluZyBleHBlY3RhdGlvbi4KKworKipTaWRlIG5vdGU6KiogV2h5IGRvZXMgR29vZ2xlIE1vY2sgc2VhcmNoIGZvciBhIG1hdGNoIGluIHRoZSBfcmV2ZXJzZV8gb3JkZXIgb2YgdGhlIGV4cGVjdGF0aW9ucz8gVGhlIHJlYXNvbiBpcyB0aGF0IHRoaXMgYWxsb3dzIGEgdXNlciB0byBzZXQgdXAgdGhlIGRlZmF1bHQgZXhwZWN0YXRpb25zIGluIGEgbW9jayBvYmplY3QncyBjb25zdHJ1Y3RvciBvciB0aGUgdGVzdCBmaXh0dXJlJ3Mgc2V0LXVwIHBoYXNlIGFuZCB0aGVuIGN1c3RvbWl6ZSB0aGUgbW9jayBieSB3cml0aW5nIG1vcmUgc3BlY2lmaWMgZXhwZWN0YXRpb25zIGluIHRoZSB0ZXN0IGJvZHkuIFNvLCBpZiB5b3UgaGF2ZSB0d28gZXhwZWN0YXRpb25zIG9uIHRoZSBzYW1lIG1ldGhvZCwgeW91IHdhbnQgdG8gcHV0IHRoZSBvbmUgd2l0aCBtb3JlIHNwZWNpZmljIG1hdGNoZXJzICoqYWZ0ZXIqKiB0aGUgb3RoZXIsIG9yIHRoZSBtb3JlIHNwZWNpZmljIHJ1bGUgd291bGQgYmUgc2hhZG93ZWQgYnkgdGhlIG1vcmUgZ2VuZXJhbCBvbmUgdGhhdCBjb21lcyBhZnRlciBpdC4KKworIyMgT3JkZXJlZCB2cyBVbm9yZGVyZWQgQ2FsbHMgIyMKK0J5IGRlZmF1bHQsIGFuIGV4cGVjdGF0aW9uIGNhbiBtYXRjaCBhIGNhbGwgZXZlbiB0aG91Z2ggYW4gZWFybGllciBleHBlY3RhdGlvbiBoYXNuJ3QgYmVlbiBzYXRpc2ZpZWQuIEluIG90aGVyIHdvcmRzLCB0aGUgY2FsbHMgZG9uJ3QgaGF2ZSB0byBvY2N1ciBpbiB0aGUgb3JkZXIgdGhlIGV4cGVjdGF0aW9ucyBhcmUgc3BlY2lmaWVkLgorCitTb21ldGltZXMsIHlvdSBtYXkgd2FudCBhbGwgdGhlIGV4cGVjdGVkIGNhbGxzIHRvIG9jY3VyIGluIGEgc3RyaWN0IG9yZGVyLiBUbyBzYXkgdGhpcyBpbiBHb29nbGUgTW9jayBpcyBlYXN5OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsuLi4KK1RFU1QoRm9vVGVzdCwgRHJhd3NMaW5lU2VnbWVudCkgeworICAuLi4KKyAgeworICAgIEluU2VxdWVuY2UgZHVtbXk7CisKKyAgICBFWFBFQ1RfQ0FMTCh0dXJ0bGUsIFBlbkRvd24oKSk7CisgICAgRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKDEwMCkpOworICAgIEVYUEVDVF9DQUxMKHR1cnRsZSwgUGVuVXAoKSk7CisgIH0KKyAgRm9vKCk7Cit9CitgYGAKKworQnkgY3JlYXRpbmcgYW4gb2JqZWN0IG9mIHR5cGUgYEluU2VxdWVuY2VgLCBhbGwgZXhwZWN0YXRpb25zIGluIGl0cyBzY29wZSBhcmUgcHV0IGludG8gYSBfc2VxdWVuY2VfIGFuZCBoYXZlIHRvIG9jY3VyIF9zZXF1ZW50aWFsbHlfLiBTaW5jZSB3ZSBhcmUganVzdCByZWx5aW5nIG9uIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBvZiB0aGlzIG9iamVjdCB0byBkbyB0aGUgYWN0dWFsIHdvcmssIGl0cyBuYW1lIGlzIHJlYWxseSBpcnJlbGV2YW50LgorCitJbiB0aGlzIGV4YW1wbGUsIHdlIHRlc3QgdGhhdCBgRm9vKClgIGNhbGxzIHRoZSB0aHJlZSBleHBlY3RlZCBmdW5jdGlvbnMgaW4gdGhlIG9yZGVyIGFzIHdyaXR0ZW4uIElmIGEgY2FsbCBpcyBtYWRlIG91dC1vZi1vcmRlciwgaXQgd2lsbCBiZSBhbiBlcnJvci4KKworKFdoYXQgaWYgeW91IGNhcmUgYWJvdXQgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIHNvbWUgb2YgdGhlIGNhbGxzLCBidXQgbm90IGFsbCBvZiB0aGVtPyBDYW4geW91IHNwZWNpZnkgYW4gYXJiaXRyYXJ5IHBhcnRpYWwgb3JkZXI/IFRoZSBhbnN3ZXIgaXMgLi4uIHllcyEgSWYgeW91IGFyZSBpbXBhdGllbnQsIHRoZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgW0Nvb2tCb29rXShWMV81X0Nvb2tCb29rLm1kKS4pCisKKyMjIEFsbCBFeHBlY3RhdGlvbnMgQXJlIFN0aWNreSAoVW5sZXNzIFNhaWQgT3RoZXJ3aXNlKSAjIworTm93IGxldCdzIGRvIGEgcXVpY2sgcXVpeiB0byBzZWUgaG93IHdlbGwgeW91IGNhbiB1c2UgdGhpcyBtb2NrIHN0dWZmIGFscmVhZHkuIEhvdyB3b3VsZCB5b3UgdGVzdCB0aGF0IHRoZSB0dXJ0bGUgaXMgYXNrZWQgdG8gZ28gdG8gdGhlIG9yaWdpbiBfZXhhY3RseSB0d2ljZV8gKHlvdSB3YW50IHRvIGlnbm9yZSBhbnkgb3RoZXIgaW5zdHJ1Y3Rpb25zIGl0IHJlY2VpdmVzKT8KKworQWZ0ZXIgeW91J3ZlIGNvbWUgdXAgd2l0aCB5b3VyIGFuc3dlciwgdGFrZSBhIGxvb2sgYXQgb3VycyBhbmQgY29tcGFyZSBub3RlcyAoc29sdmUgaXQgeW91cnNlbGYgZmlyc3QgLSBkb24ndCBjaGVhdCEpOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsuLi4KK0VYUEVDVF9DQUxMKHR1cnRsZSwgR29UbyhfLCBfKSkgIC8vICMxCisgICAgLlRpbWVzKEFueU51bWJlcigpKTsKK0VYUEVDVF9DQUxMKHR1cnRsZSwgR29UbygwLCAwKSkgIC8vICMyCisgICAgLlRpbWVzKDIpOworYGBgCisKK1N1cHBvc2UgYHR1cnRsZS5Hb1RvKDAsIDApYCBpcyBjYWxsZWQgdGhyZWUgdGltZXMuIEluIHRoZSB0aGlyZCB0aW1lLCBHb29nbGUgTW9jayB3aWxsIHNlZSB0aGF0IHRoZSBhcmd1bWVudHMgbWF0Y2ggZXhwZWN0YXRpb24gIzIgKHJlbWVtYmVyIHRoYXQgd2UgYWx3YXlzIHBpY2sgdGhlIGxhc3QgbWF0Y2hpbmcgZXhwZWN0YXRpb24pLiBOb3csIHNpbmNlIHdlIHNhaWQgdGhhdCB0aGVyZSBzaG91bGQgYmUgb25seSB0d28gc3VjaCBjYWxscywgR29vZ2xlIE1vY2sgd2lsbCByZXBvcnQgYW4gZXJyb3IgaW1tZWRpYXRlbHkuIFRoaXMgaXMgYmFzaWNhbGx5IHdoYXQgd2UndmUgdG9sZCB5b3UgaW4gdGhlICJVc2luZyBNdWx0aXBsZSBFeHBlY3RhdGlvbnMiIHNlY3Rpb24gYWJvdmUuCisKK1RoaXMgZXhhbXBsZSBzaG93cyB0aGF0ICoqZXhwZWN0YXRpb25zIGluIEdvb2dsZSBNb2NrIGFyZSAic3RpY2t5IiBieSBkZWZhdWx0KiosIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgcmVtYWluIGFjdGl2ZSBldmVuIGFmdGVyIHdlIGhhdmUgcmVhY2hlZCB0aGVpciBpbnZvY2F0aW9uIHVwcGVyIGJvdW5kcy4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgcnVsZSB0byByZW1lbWJlciwgYXMgaXQgYWZmZWN0cyB0aGUgbWVhbmluZyBvZiB0aGUgc3BlYywgYW5kIGlzICoqZGlmZmVyZW50KiogdG8gaG93IGl0J3MgZG9uZSBpbiBtYW55IG90aGVyIG1vY2tpbmcgZnJhbWV3b3JrcyAoV2h5J2Qgd2UgZG8gdGhhdD8gQmVjYXVzZSB3ZSB0aGluayBvdXIgcnVsZSBtYWtlcyB0aGUgY29tbW9uIGNhc2VzIGVhc2llciB0byBleHByZXNzIGFuZCB1bmRlcnN0YW5kLikuCisKK1NpbXBsZT8gTGV0J3Mgc2VlIGlmIHlvdSd2ZSByZWFsbHkgdW5kZXJzdG9vZCBpdDogd2hhdCBkb2VzIHRoZSBmb2xsb3dpbmcgY29kZSBzYXk/CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KK2ZvciAoaW50IGkgPSBuOyBpID4gMDsgaS0tKSB7CisgIEVYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WCgpKQorICAgICAgLldpbGxPbmNlKFJldHVybigxMCppKSk7Cit9CitgYGAKKworSWYgeW91IHRoaW5rIGl0IHNheXMgdGhhdCBgdHVydGxlLkdldFgoKWAgd2lsbCBiZSBjYWxsZWQgYG5gIHRpbWVzIGFuZCB3aWxsIHJldHVybiAxMCwgMjAsIDMwLCAuLi4sIGNvbnNlY3V0aXZlbHksIHRoaW5rIHR3aWNlISBUaGUgcHJvYmxlbSBpcyB0aGF0LCBhcyB3ZSBzYWlkLCBleHBlY3RhdGlvbnMgYXJlIHN0aWNreS4gU28sIHRoZSBzZWNvbmQgdGltZSBgdHVydGxlLkdldFgoKWAgaXMgY2FsbGVkLCB0aGUgbGFzdCAobGF0ZXN0KSBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50IHdpbGwgbWF0Y2gsIGFuZCB3aWxsIGltbWVkaWF0ZWx5IGxlYWQgdG8gYW4gInVwcGVyIGJvdW5kIGV4Y2VlZGVkIiBlcnJvciAtIHRoaXMgcGllY2Ugb2YgY29kZSBpcyBub3QgdmVyeSB1c2VmdWwhCisKK09uZSBjb3JyZWN0IHdheSBvZiBzYXlpbmcgdGhhdCBgdHVydGxlLkdldFgoKWAgd2lsbCByZXR1cm4gMTAsIDIwLCAzMCwgLi4uLCBpcyB0byBleHBsaWNpdGx5IHNheSB0aGF0IHRoZSBleHBlY3RhdGlvbnMgYXJlIF9ub3RfIHN0aWNreS4gSW4gb3RoZXIgd29yZHMsIHRoZXkgc2hvdWxkIF9yZXRpcmVfIGFzIHNvb24gYXMgdGhleSBhcmUgc2F0dXJhdGVkOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworLi4uCitmb3IgKGludCBpID0gbjsgaSA+IDA7IGktLSkgeworICBFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdldFgoKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDEwKmkpKQorICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7Cit9CitgYGAKKworQW5kLCB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byBkbyBpdDogaW4gdGhpcyBjYXNlLCB3ZSBleHBlY3QgdGhlIGNhbGxzIHRvIG9jY3VyIGluIGEgc3BlY2lmaWMgb3JkZXIsIGFuZCB3ZSBsaW5lIHVwIHRoZSBhY3Rpb25zIHRvIG1hdGNoIHRoZSBvcmRlci4gU2luY2UgdGhlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCB3ZSBzaG91bGQgbWFrZSBpdCBleHBsaWNpdCB1c2luZyBhIHNlcXVlbmNlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworLi4uCit7CisgIEluU2VxdWVuY2UgczsKKworICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKKyAgICBFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdldFgoKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigxMCppKSkKKyAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKKyAgfQorfQorYGBgCisKK0J5IHRoZSB3YXksIHRoZSBvdGhlciBzaXR1YXRpb24gd2hlcmUgYW4gZXhwZWN0YXRpb24gbWF5IF9ub3RfIGJlIHN0aWNreSBpcyB3aGVuIGl0J3MgaW4gYSBzZXF1ZW5jZSAtIGFzIHNvb24gYXMgYW5vdGhlciBleHBlY3RhdGlvbiB0aGF0IGNvbWVzIGFmdGVyIGl0IGluIHRoZSBzZXF1ZW5jZSBoYXMgYmVlbiB1c2VkLCBpdCBhdXRvbWF0aWNhbGx5IHJldGlyZXMgKGFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgdG8gbWF0Y2ggYW55IGNhbGwpLgorCisjIyBVbmludGVyZXN0aW5nIENhbGxzICMjCitBIG1vY2sgb2JqZWN0IG1heSBoYXZlIG1hbnkgbWV0aG9kcywgYW5kIG5vdCBhbGwgb2YgdGhlbSBhcmUgdGhhdCBpbnRlcmVzdGluZy4gRm9yIGV4YW1wbGUsIGluIHNvbWUgdGVzdHMgd2UgbWF5IG5vdCBjYXJlIGFib3V0IGhvdyBtYW55IHRpbWVzIGBHZXRYKClgIGFuZCBgR2V0WSgpYCBnZXQgY2FsbGVkLgorCitJbiBHb29nbGUgTW9jaywgaWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiBhIG1ldGhvZCwganVzdCBkb24ndCBzYXkgYW55dGhpbmcgYWJvdXQgaXQuIElmIGEgY2FsbCB0byB0aGlzIG1ldGhvZCBvY2N1cnMsIHlvdSdsbCBzZWUgYSB3YXJuaW5nIGluIHRoZSB0ZXN0IG91dHB1dCwgYnV0IGl0IHdvbid0IGJlIGEgZmFpbHVyZS4KKworIyBXaGF0IE5vdz8gIworQ29uZ3JhdHVsYXRpb25zISBZb3UndmUgbGVhcm5lZCBlbm91Z2ggYWJvdXQgR29vZ2xlIE1vY2sgdG8gc3RhcnQgdXNpbmcgaXQuIE5vdywgeW91IG1pZ2h0IHdhbnQgdG8gam9pbiB0aGUgW2dvb2dsZW1vY2tdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGVtb2NrKSBkaXNjdXNzaW9uIGdyb3VwIGFuZCBhY3R1YWxseSB3cml0ZSBzb21lIHRlc3RzIHVzaW5nIEdvb2dsZSBNb2NrIC0gaXQgd2lsbCBiZSBmdW4uIEhleSwgaXQgbWF5IGV2ZW4gYmUgYWRkaWN0aXZlIC0geW91J3ZlIGJlZW4gd2FybmVkLgorCitUaGVuLCBpZiB5b3UgZmVlbCBsaWtlIGluY3JlYXNpbmcgeW91ciBtb2NrIHF1b3RpZW50LCB5b3Ugc2hvdWxkIG1vdmUgb24gdG8gdGhlIFtDb29rQm9va10oVjFfNV9Db29rQm9vay5tZCkuIFlvdSBjYW4gbGVhcm4gbWFueSBhZHZhbmNlZCBmZWF0dXJlcyBvZiBHb29nbGUgTW9jayB0aGVyZSAtLSBhbmQgYWR2YW5jZSB5b3VyIGxldmVsIG9mIGVuam95bWVudCBhbmQgdGVzdGluZyBibGlzcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV81L0ZyZXF1ZW50bHlBc2tlZFF1ZXN0aW9ucy5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzUvRnJlcXVlbnRseUFza2VkUXVlc3Rpb25zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTMyNDMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV81L0ZyZXF1ZW50bHlBc2tlZFF1ZXN0aW9ucy5tZApAQCAtMCwwICsxLDYyNCBAQAorCisKK1BsZWFzZSBzZW5kIHlvdXIgcXVlc3Rpb25zIHRvIHRoZQorW2dvb2dsZW1vY2tdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGVtb2NrKSBkaXNjdXNzaW9uCitncm91cC4gSWYgeW91IG5lZWQgaGVscCB3aXRoIGNvbXBpbGVyIGVycm9ycywgbWFrZSBzdXJlIHlvdSBoYXZlCit0cmllZCBbR29vZ2xlIE1vY2sgRG9jdG9yXSgjSG93X2FtX0lfc3VwcG9zZWRfdG9fbWFrZV9zZW5zZV9vZl90aGVzZV9ob3JyaWJsZV90ZW1wbGF0ZV9lcnJvci5tZCkgZmlyc3QuCisKKyMjIEkgd3JvdGUgc29tZSBtYXRjaGVycy4gIEFmdGVyIEkgdXBncmFkZWQgdG8gYSBuZXcgdmVyc2lvbiBvZiBHb29nbGUgTW9jaywgdGhleSBubyBsb25nZXIgY29tcGlsZS4gIFdoYXQncyBnb2luZyBvbj8gIyMKKworQWZ0ZXIgdmVyc2lvbiAxLjQuMCBvZiBHb29nbGUgTW9jayB3YXMgcmVsZWFzZWQsIHdlIGhhZCBhbiBpZGVhIG9uIGhvdwordG8gbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUgbWF0Y2hlcnMgdGhhdCBjYW4gZ2VuZXJhdGUgaW5mb3JtYXRpdmUKK21lc3NhZ2VzIGVmZmljaWVudGx5LiAgV2UgZXhwZXJpbWVudGVkIHdpdGggdGhpcyBpZGVhIGFuZCBsaWtlZCB3aGF0Cit3ZSBzYXcuICBUaGVyZWZvcmUgd2UgZGVjaWRlZCB0byBpbXBsZW1lbnQgaXQuCisKK1VuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSBkZWZpbmVkIHlvdXIgb3duIG1hdGNoZXJzCitieSBpbXBsZW1lbnRpbmcgYE1hdGNoZXJJbnRlcmZhY2VgIG9yIHVzaW5nIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgLAoreW91ciBkZWZpbml0aW9ucyB3aWxsIG5vIGxvbmdlciBjb21waWxlLiAgTWF0Y2hlcnMgZGVmaW5lZCB1c2luZyB0aGUKK2BNQVRDSEVSKmAgZmFtaWx5IG9mIG1hY3JvcyBhcmUgbm90IGFmZmVjdGVkLgorCitTb3JyeSBmb3IgdGhlIGhhc3NsZSBpZiB5b3VyIG1hdGNoZXJzIGFyZSBhZmZlY3RlZC4gIFdlIGJlbGlldmUgaXQncworaW4gZXZlcnlvbmUncyBsb25nLXRlcm0gaW50ZXJlc3QgdG8gbWFrZSB0aGlzIGNoYW5nZSBzb29uZXIgdGhhbgorbGF0ZXIuICBGb3J0dW5hdGVseSwgaXQncyB1c3VhbGx5IG5vdCBoYXJkIHRvIG1pZ3JhdGUgYW4gZXhpc3RpbmcKK21hdGNoZXIgdG8gdGhlIG5ldyBBUEkuICBIZXJlJ3Mgd2hhdCB5b3UgbmVlZCB0byBkbzoKKworSWYgeW91IHdyb3RlIHlvdXIgbWF0Y2hlciBsaWtlIHRoaXM6CitgYGAKKy8vIE9sZCBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbGF0ZXN0CisvLyBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTsKKy4uLgorY2xhc3MgTXlXb25kZXJmdWxNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8TXlUeXBlPiB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCBib29sIE1hdGNoZXMoTXlUeXBlIHZhbHVlKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEZvbygpID4gNTsKKyAgfQorICAuLi4KK307CitgYGAKKworeW91J2xsIG5lZWQgdG8gY2hhbmdlIGl0IHRvOgorYGBgCisvLyBOZXcgbWF0Y2hlciBkZWZpbml0aW9uIHRoYXQgd29ya3Mgd2l0aCB0aGUgbGF0ZXN0IEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworLi4uCitjbGFzcyBNeVdvbmRlcmZ1bE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxNeVR5cGU+IHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzLgorICAgIHJldHVybiB2YWx1ZS5HZXRGb28oKSA+IDU7CisgIH0KKyAgLi4uCit9OworYGBgCisoaS5lLiByZW5hbWUgYE1hdGNoZXMoKWAgdG8gYE1hdGNoQW5kRXhwbGFpbigpYCBhbmQgZ2l2ZSBpdCBhIHNlY29uZAorYXJndW1lbnQgb2YgdHlwZSBgTWF0Y2hSZXN1bHRMaXN0ZW5lcipgLikKKworSWYgeW91IHdlcmUgYWxzbyB1c2luZyBgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKWAgdG8gaW1wcm92ZSB0aGUgbWF0Y2hlcgorbWVzc2FnZToKK2BgYAorLy8gT2xkIG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBsYXN0ZXN0CisvLyBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTsKKy4uLgorY2xhc3MgTXlXb25kZXJmdWxNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8TXlUeXBlPiB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCBib29sIE1hdGNoZXMoTXlUeXBlIHZhbHVlKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEZvbygpID4gNTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBFeHBsYWluTWF0Y2hSZXN1bHRUbyhNeVR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAvLyBQcmludHMgc29tZSBoZWxwZnVsIGluZm9ybWF0aW9uIHRvIG9zIHRvIGhlbHAKKyAgICAvLyBhIHVzZXIgdW5kZXJzdGFuZCB3aHkgdmFsdWUgbWF0Y2hlcyAob3IgZG9lc24ndCBtYXRjaCkuCisgICAgKm9zIDw8ICJ0aGUgRm9vIHByb3BlcnR5IGlzICIgPDwgdmFsdWUuR2V0Rm9vKCk7CisgIH0KKyAgLi4uCit9OworYGBgCisKK3lvdSBzaG91bGQgbW92ZSB0aGUgbG9naWMgb2YgYEV4cGxhaW5NYXRjaFJlc3VsdFRvKClgIGludG8KK2BNYXRjaEFuZEV4cGxhaW4oKWAsIHVzaW5nIHRoZSBgTWF0Y2hSZXN1bHRMaXN0ZW5lcmAgYXJndW1lbnQgd2hlcmUKK3RoZSBgOjpzdGQ6Om9zdHJlYW1gIHdhcyB1c2VkOgorYGBgCisvLyBOZXcgbWF0Y2hlciBkZWZpbml0aW9uIHRoYXQgd29ya3Mgd2l0aCB0aGUgbGF0ZXN0IEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworLi4uCitjbGFzcyBNeVdvbmRlcmZ1bE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxNeVR5cGU+IHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzLgorICAgICpsaXN0ZW5lciA8PCAidGhlIEZvbyBwcm9wZXJ0eSBpcyAiIDw8IHZhbHVlLkdldEZvbygpOworICAgIHJldHVybiB2YWx1ZS5HZXRGb28oKSA+IDU7CisgIH0KKyAgLi4uCit9OworYGBgCisKK0lmIHlvdXIgbWF0Y2hlciBpcyBkZWZpbmVkIHVzaW5nIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgOgorYGBgCisvLyBPbGQgbWF0Y2hlciBkZWZpbml0aW9uIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGxhdGVzdAorLy8gR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VQb2x5bW9ycGhpY01hdGNoZXI7CisuLi4KK2NsYXNzIE15R3JlYXRNYXRjaGVyIHsKKyBwdWJsaWM6CisgIC4uLgorICBib29sIE1hdGNoZXMoTXlUeXBlIHZhbHVlKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEJhcigpIDwgNDI7CisgIH0KKyAgLi4uCit9OworLi4uIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTXlHcmVhdE1hdGNoZXIoKSkgLi4uCitgYGAKKworeW91IHNob3VsZCByZW5hbWUgdGhlIGBNYXRjaGVzKClgIG1ldGhvZCB0byBgTWF0Y2hBbmRFeHBsYWluKClgIGFuZAorYWRkIGEgYE1hdGNoUmVzdWx0TGlzdGVuZXIqYCBhcmd1bWVudCAodGhlIHNhbWUgYXMgd2hhdCB5b3UgbmVlZCB0byBkbworZm9yIG1hdGNoZXJzIGRlZmluZWQgYnkgaW1wbGVtZW50aW5nIGBNYXRjaGVySW50ZXJmYWNlYCk6CitgYGAKKy8vIE5ldyBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCB3b3JrcyB3aXRoIHRoZSBsYXRlc3QgR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VQb2x5bW9ycGhpY01hdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisuLi4KK2NsYXNzIE15R3JlYXRNYXRjaGVyIHsKKyBwdWJsaWM6CisgIC4uLgorICBib29sIE1hdGNoQW5kRXhwbGFpbihNeVR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEJhcigpIDwgNDI7CisgIH0KKyAgLi4uCit9OworLi4uIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTXlHcmVhdE1hdGNoZXIoKSkgLi4uCitgYGAKKworSWYgeW91ciBwb2x5bW9ycGhpYyBtYXRjaGVyIHVzZXMgYEV4cGxhaW5NYXRjaFJlc3VsdFRvKClgIGZvciBiZXR0ZXIKK2ZhaWx1cmUgbWVzc2FnZXM6CitgYGAKKy8vIE9sZCBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbGF0ZXN0CisvLyBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKKy4uLgorY2xhc3MgTXlHcmVhdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIGJvb2wgTWF0Y2hlcyhNeVR5cGUgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0QmFyKCkgPCA0MjsKKyAgfQorICAuLi4KK307Cit2b2lkIEV4cGxhaW5NYXRjaFJlc3VsdFRvKGNvbnN0IE15R3JlYXRNYXRjaGVyJiBtYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNeVR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBQcmludHMgc29tZSBoZWxwZnVsIGluZm9ybWF0aW9uIHRvIG9zIHRvIGhlbHAKKyAgLy8gYSB1c2VyIHVuZGVyc3RhbmQgd2h5IHZhbHVlIG1hdGNoZXMgKG9yIGRvZXNuJ3QgbWF0Y2gpLgorICAqb3MgPDwgInRoZSBCYXIgcHJvcGVydHkgaXMgIiA8PCB2YWx1ZS5HZXRCYXIoKTsKK30KKy4uLiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKE15R3JlYXRNYXRjaGVyKCkpIC4uLgorYGBgCisKK3lvdSdsbCBuZWVkIHRvIG1vdmUgdGhlIGxvZ2ljIGluc2lkZSBgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKWAgdG8KK2BNYXRjaEFuZEV4cGxhaW4oKWA6CitgYGAKKy8vIE5ldyBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCB3b3JrcyB3aXRoIHRoZSBsYXRlc3QgR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VQb2x5bW9ycGhpY01hdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisuLi4KK2NsYXNzIE15R3JlYXRNYXRjaGVyIHsKKyBwdWJsaWM6CisgIC4uLgorICBib29sIE1hdGNoQW5kRXhwbGFpbihNeVR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgKmxpc3RlbmVyIDw8ICJ0aGUgQmFyIHByb3BlcnR5IGlzICIgPDwgdmFsdWUuR2V0QmFyKCk7CisgICAgcmV0dXJuIHZhbHVlLkdldEJhcigpIDwgNDI7CisgIH0KKyAgLi4uCit9OworLi4uIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTXlHcmVhdE1hdGNoZXIoKSkgLi4uCitgYGAKKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIHlvdSBjYW4gcmVhZCB0aGVzZQorW3R3b10oVjFfNV9Db29rQm9vayNXcml0aW5nX05ld19Nb25vbW9ycGhpY19NYXRjaGVycy5tZCkKK1tyZWNpcGVzXShWMV81X0Nvb2tCb29rI1dyaXRpbmdfTmV3X1BvbHltb3JwaGljX01hdGNoZXJzLm1kKQorZnJvbSB0aGUgY29va2Jvb2suICBBcyBhbHdheXMsIHlvdQorYXJlIHdlbGNvbWUgdG8gcG9zdCBxdWVzdGlvbnMgb24gYGdvb2dsZW1vY2tAZ29vZ2xlZ3JvdXBzLmNvbWAgaWYgeW91CituZWVkIGFueSBoZWxwLgorCisjIyBXaGVuIHVzaW5nIEdvb2dsZSBNb2NrLCBkbyBJIGhhdmUgdG8gdXNlIEdvb2dsZSBUZXN0IGFzIHRoZSB0ZXN0aW5nIGZyYW1ld29yaz8gIEkgaGF2ZSBteSBmYXZvcml0ZSB0ZXN0aW5nIGZyYW1ld29yayBhbmQgZG9uJ3Qgd2FudCB0byBzd2l0Y2guICMjCisKK0dvb2dsZSBNb2NrIHdvcmtzIG91dCBvZiB0aGUgYm94IHdpdGggR29vZ2xlIFRlc3QuICBIb3dldmVyLCBpdCdzIGVhc3kKK3RvIGNvbmZpZ3VyZSBpdCB0byB3b3JrIHdpdGggYW55IHRlc3RpbmcgZnJhbWV3b3JrIG9mIHlvdXIgY2hvaWNlLgorW0hlcmVdKFYxXzVfRm9yRHVtbWllcyNVc2luZ19Hb29nbGVfTW9ja193aXRoX0FueV9UZXN0aW5nX0ZyYW1ld29yay5tZCkgaXMgaG93LgorCisjIyBIb3cgYW0gSSBzdXBwb3NlZCB0byBtYWtlIHNlbnNlIG9mIHRoZXNlIGhvcnJpYmxlIHRlbXBsYXRlIGVycm9ycz8gIyMKKworSWYgeW91IGFyZSBjb25mdXNlZCBieSB0aGUgY29tcGlsZXIgZXJyb3JzIGdjYyB0aHJldyBhdCB5b3UsCit0cnkgY29uc3VsdGluZyB0aGUgX0dvb2dsZSBNb2NrIERvY3Rvcl8gdG9vbCBmaXJzdC4gIFdoYXQgaXQgZG9lcyBpcyB0bworc2NhbiBzdGRpbiBmb3IgZ2NjIGVycm9yIG1lc3NhZ2VzLCBhbmQgc3BpdCBvdXQgZGlhZ25vc2VzIG9uIHRoZQorcHJvYmxlbXMgKHdlIGNhbGwgdGhlbSBkaXNlYXNlcykgeW91ciBjb2RlIGhhcy4KKworVG8gImluc3RhbGwiLCBydW4gY29tbWFuZDoKK2BgYAorYWxpYXMgZ21kPSc8cGF0aCB0byBnb29nbGVtb2NrPi9zY3JpcHRzL2dtb2NrX2RvY3Rvci5weScKK2BgYAorCitUbyB1c2UgaXQsIGRvOgorYGBgCis8eW91ci1mYXZvcml0ZS1idWlsZC1jb21tYW5kPiA8eW91ci10ZXN0PiAyPiYxIHwgZ21kCitgYGAKKworRm9yIGV4YW1wbGU6CitgYGAKK21ha2UgbXlfdGVzdCAyPiYxIHwgZ21kCitgYGAKKworT3IgeW91IGNhbiBydW4gYGdtZGAgYW5kIGNvcHktbi1wYXN0ZSBnY2MncyBlcnJvciBtZXNzYWdlcyB0byBpdC4KKworIyMgQ2FuIEkgbW9jayBhIHZhcmlhZGljIGZ1bmN0aW9uPyAjIworCitZb3UgY2Fubm90IG1vY2sgYSB2YXJpYWRpYyBmdW5jdGlvbiAoaS5lLiBhIGZ1bmN0aW9uIHRha2luZyBlbGxpcHNpcworKGAuLi5gKSBhcmd1bWVudHMpIGRpcmVjdGx5IGluIEdvb2dsZSBNb2NrLgorCitUaGUgcHJvYmxlbSBpcyB0aGF0IGluIGdlbmVyYWwsIHRoZXJlIGlzIF9ubyB3YXlfIGZvciBhIG1vY2sgb2JqZWN0IHRvCitrbm93IGhvdyBtYW55IGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSB2YXJpYWRpYyBtZXRob2QsIGFuZCB3aGF0Cit0aGUgYXJndW1lbnRzJyB0eXBlcyBhcmUuICBPbmx5IHRoZSBfYXV0aG9yIG9mIHRoZSBiYXNlIGNsYXNzXyBrbm93cwordGhlIHByb3RvY29sLCBhbmQgd2UgY2Fubm90IGxvb2sgaW50byBoaXMgaGVhZC4KKworVGhlcmVmb3JlLCB0byBtb2NrIHN1Y2ggYSBmdW5jdGlvbiwgdGhlIF91c2VyXyBtdXN0IHRlYWNoIHRoZSBtb2NrCitvYmplY3QgaG93IHRvIGZpZ3VyZSBvdXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYW5kIHRoZWlyIHR5cGVzLiAgT25lCit3YXkgdG8gZG8gaXQgaXMgdG8gcHJvdmlkZSBvdmVybG9hZGVkIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbi4KKworRWxsaXBzaXMgYXJndW1lbnRzIGFyZSBpbmhlcml0ZWQgZnJvbSBDIGFuZCBub3QgcmVhbGx5IGEgQysrIGZlYXR1cmUuCitUaGV5IGFyZSB1bnNhZmUgdG8gdXNlIGFuZCBkb24ndCB3b3JrIHdpdGggYXJndW1lbnRzIHRoYXQgaGF2ZQorY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzLiAgVGhlcmVmb3JlIHdlIHJlY29tbWVuZCB0byBhdm9pZCB0aGVtIGluCitDKysgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKworIyMgTVNWQyBnaXZlcyBtZSB3YXJuaW5nIEM0MzAxIG9yIEM0MzczIHdoZW4gSSBkZWZpbmUgYSBtb2NrIG1ldGhvZCB3aXRoIGEgY29uc3QgcGFyYW1ldGVyLiAgV2h5PyAjIworCitJZiB5b3UgY29tcGlsZSB0aGlzIHVzaW5nIE1pY3Jvc29mdCBWaXN1YWwgQysrIDIwMDUgU1AxOgorYGBgCitjbGFzcyBGb28geworICAuLi4KKyAgdmlydHVhbCB2b2lkIEJhcihjb25zdCBpbnQgaSkgPSAwOworfTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgTU9DS19NRVRIT0QxKEJhciwgdm9pZChjb25zdCBpbnQgaSkpOworfTsKK2BgYAorWW91IG1heSBnZXQgdGhlIGZvbGxvd2luZyB3YXJuaW5nOgorYGBgCit3YXJuaW5nIEM0MzAxOiAnTW9ja0Zvbzo6QmFyJzogb3ZlcnJpZGluZyB2aXJ0dWFsIGZ1bmN0aW9uIG9ubHkgZGlmZmVycyBmcm9tICdGb286OkJhcicgYnkgY29uc3Qvdm9sYXRpbGUgcXVhbGlmaWVyCitgYGAKKworVGhpcyBpcyBhIE1TVkMgYnVnLiAgVGhlIHNhbWUgY29kZSBjb21waWxlcyBmaW5lIHdpdGggZ2NjICxmb3IKK2V4YW1wbGUuICBJZiB5b3UgdXNlIFZpc3VhbCBDKysgMjAwOCBTUDEsIHlvdSB3b3VsZCBnZXQgdGhlIHdhcm5pbmc6CitgYGAKK3dhcm5pbmcgQzQzNzM6ICdNb2NrRm9vOjpCYXInOiB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlcyAnRm9vOjpCYXInLCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIgZGlkIG5vdCBvdmVycmlkZSB3aGVuIHBhcmFtZXRlcnMgb25seSBkaWZmZXJlZCBieSBjb25zdC92b2xhdGlsZSBxdWFsaWZpZXJzCitgYGAKKworSW4gQysrLCBpZiB5b3UgX2RlY2xhcmVfIGEgZnVuY3Rpb24gd2l0aCBhIGBjb25zdGAgcGFyYW1ldGVyLCB0aGUKK2Bjb25zdGAgbW9kaWZpZXIgaXMgX2lnbm9yZWRfLiAgVGhlcmVmb3JlLCB0aGUgYEZvb2AgYmFzZSBjbGFzcyBhYm92ZQoraXMgZXF1aXZhbGVudCB0bzoKK2BgYAorY2xhc3MgRm9vIHsKKyAgLi4uCisgIHZpcnR1YWwgdm9pZCBCYXIoaW50IGkpID0gMDsgIC8vIGludCBvciBjb25zdCBpbnQ/ICBNYWtlcyBubyBkaWZmZXJlbmNlLgorfTsKK2BgYAorCitJbiBmYWN0LCB5b3UgY2FuIF9kZWNsYXJlXyBCYXIoKSB3aXRoIGFuIGBpbnRgIHBhcmFtZXRlciwgYW5kIF9kZWZpbmVfCitpdCB3aXRoIGEgYGNvbnN0IGludGAgcGFyYW1ldGVyLiAgVGhlIGNvbXBpbGVyIHdpbGwgc3RpbGwgbWF0Y2ggdGhlbQordXAuCisKK1NpbmNlIG1ha2luZyBhIHBhcmFtZXRlciBgY29uc3RgIGlzIG1lYW5pbmdsZXNzIGluIHRoZSBtZXRob2QKK19kZWNsYXJhdGlvbl8sIHdlIHJlY29tbWVuZCB0byByZW1vdmUgaXQgaW4gYm90aCBgRm9vYCBhbmQgYE1vY2tGb29gLgorVGhhdCBzaG91bGQgd29ya2Fyb3VuZCB0aGUgVkMgYnVnLgorCitOb3RlIHRoYXQgd2UgYXJlIHRhbGtpbmcgYWJvdXQgdGhlIF90b3AtbGV2ZWxfIGBjb25zdGAgbW9kaWZpZXIgaGVyZS4KK0lmIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgb3IgcmVmZXJlbmNlLCBkZWNsYXJpbmcKK3RoZSBfcG9pbnRlZV8gb3IgX3JlZmVyZWVfIGFzIGBjb25zdGAgaXMgc3RpbGwgbWVhbmluZ2Z1bC4gIEZvcgorZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0d28gZGVjbGFyYXRpb25zIGFyZSBfbm90XyBlcXVpdmFsZW50OgorYGBgCit2b2lkIEJhcihpbnQqIHApOyAgICAgICAgLy8gTmVpdGhlciBwIG5vciAqcCBpcyBjb25zdC4KK3ZvaWQgQmFyKGNvbnN0IGludCogcCk7ICAvLyBwIGlzIG5vdCBjb25zdCwgYnV0ICpwIGlzLgorYGBgCisKKyMjIEkgaGF2ZSBhIGh1Z2UgbW9jayBjbGFzcywgYW5kIE1pY3Jvc29mdCBWaXN1YWwgQysrIHJ1bnMgb3V0IG9mIG1lbW9yeSB3aGVuIGNvbXBpbGluZyBpdC4gIFdoYXQgY2FuIEkgZG8/ICMjCisKK1dlJ3ZlIG5vdGljZWQgdGhhdCB3aGVuIHRoZSBgL2NscmAgY29tcGlsZXIgZmxhZyBpcyB1c2VkLCBWaXN1YWwgQysrCit1c2VzIDV+NiB0aW1lcyBhcyBtdWNoIG1lbW9yeSB3aGVuIGNvbXBpbGluZyBhIG1vY2sgY2xhc3MuICBXZSBzdWdnZXN0Cit0byBhdm9pZCBgL2NscmAgd2hlbiBjb21waWxpbmcgbmF0aXZlIEMrKyBtb2Nrcy4KKworIyMgSSBjYW4ndCBmaWd1cmUgb3V0IHdoeSBHb29nbGUgTW9jayB0aGlua3MgbXkgZXhwZWN0YXRpb25zIGFyZSBub3Qgc2F0aXNmaWVkLiAgV2hhdCBzaG91bGQgSSBkbz8gIyMKKworWW91IG1pZ2h0IHdhbnQgdG8gcnVuIHlvdXIgdGVzdCB3aXRoCitgLS1nbW9ja192ZXJib3NlPWluZm9gLiAgVGhpcyBmbGFnIGxldHMgR29vZ2xlIE1vY2sgcHJpbnQgYSB0cmFjZQorb2YgZXZlcnkgbW9jayBmdW5jdGlvbiBjYWxsIGl0IHJlY2VpdmVzLiAgQnkgc3R1ZHlpbmcgdGhlIHRyYWNlLAoreW91J2xsIGdhaW4gaW5zaWdodHMgb24gd2h5IHRoZSBleHBlY3RhdGlvbnMgeW91IHNldCBhcmUgbm90IG1ldC4KKworIyMgSG93IGNhbiBJIGFzc2VydCB0aGF0IGEgZnVuY3Rpb24gaXMgTkVWRVIgY2FsbGVkPyAjIworCitgYGAKK0VYUEVDVF9DQUxMKGZvbywgQmFyKF8pKQorICAgIC5UaW1lcygwKTsKK2BgYAorCisjIyBJIGhhdmUgYSBmYWlsZWQgdGVzdCB3aGVyZSBHb29nbGUgTW9jayB0ZWxscyBtZSBUV0lDRSB0aGF0IGEgcGFydGljdWxhciBleHBlY3RhdGlvbiBpcyBub3Qgc2F0aXNmaWVkLiAgSXNuJ3QgdGhpcyByZWR1bmRhbnQ/ICMjCisKK1doZW4gR29vZ2xlIE1vY2sgZGV0ZWN0cyBhIGZhaWx1cmUsIGl0IHByaW50cyByZWxldmFudCBpbmZvcm1hdGlvbgorKHRoZSBtb2NrIGZ1bmN0aW9uIGFyZ3VtZW50cywgdGhlIHN0YXRlIG9mIHJlbGV2YW50IGV4cGVjdGF0aW9ucywgYW5kCitldGMpIHRvIGhlbHAgdGhlIHVzZXIgZGVidWcuICBJZiBhbm90aGVyIGZhaWx1cmUgaXMgZGV0ZWN0ZWQsIEdvb2dsZQorTW9jayB3aWxsIGRvIHRoZSBzYW1lLCBpbmNsdWRpbmcgcHJpbnRpbmcgdGhlIHN0YXRlIG9mIHJlbGV2YW50CitleHBlY3RhdGlvbnMuCisKK1NvbWV0aW1lcyBhbiBleHBlY3RhdGlvbidzIHN0YXRlIGRpZG4ndCBjaGFuZ2UgYmV0d2VlbiB0d28gZmFpbHVyZXMsCithbmQgeW91J2xsIHNlZSB0aGUgc2FtZSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RhdGUgdHdpY2UuICBUaGV5IGFyZQoraG93ZXZlciBfbm90XyByZWR1bmRhbnQsIGFzIHRoZXkgcmVmZXIgdG8gX2RpZmZlcmVudCBwb2ludHMgaW4gdGltZV8uCitUaGUgZmFjdCB0aGV5IGFyZSB0aGUgc2FtZSBfaXNfIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLgorCisjIyBJIGdldCBhIGhlYXAgY2hlY2sgZmFpbHVyZSB3aGVuIHVzaW5nIGEgbW9jayBvYmplY3QsIGJ1dCB1c2luZyBhIHJlYWwgb2JqZWN0IGlzIGZpbmUuICBXaGF0IGNhbiBiZSB3cm9uZz8gIyMKKworRG9lcyB0aGUgY2xhc3MgKGhvcGVmdWxseSBhIHB1cmUgaW50ZXJmYWNlKSB5b3UgYXJlIG1vY2tpbmcgaGF2ZSBhCit2aXJ0dWFsIGRlc3RydWN0b3I/CisKK1doZW5ldmVyIHlvdSBkZXJpdmUgZnJvbSBhIGJhc2UgY2xhc3MsIG1ha2Ugc3VyZSBpdHMgZGVzdHJ1Y3RvciBpcwordmlydHVhbC4gIE90aGVyd2lzZSBCYWQgVGhpbmdzIHdpbGwgaGFwcGVuLiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZworY29kZToKKworYGBgCitjbGFzcyBCYXNlIHsKKyBwdWJsaWM6CisgIC8vIE5vdCB2aXJ0dWFsLCBidXQgc2hvdWxkIGJlLgorICB+QmFzZSgpIHsgLi4uIH0KKyAgLi4uCit9OworCitjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgeworIHB1YmxpYzoKKyAgLi4uCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgdmFsdWVfOworfTsKKworLi4uCisgIEJhc2UqIHAgPSBuZXcgRGVyaXZlZDsKKyAgLi4uCisgIGRlbGV0ZSBwOyAgLy8gU3VycHJpc2UhIH5CYXNlKCkgd2lsbCBiZSBjYWxsZWQsIGJ1dCB+RGVyaXZlZCgpIHdpbGwgbm90CisgICAgICAgICAgICAgLy8gLSB2YWx1ZV8gaXMgbGVha2VkLgorYGBgCisKK0J5IGNoYW5naW5nIGB+QmFzZSgpYCB0byB2aXJ0dWFsLCBgfkRlcml2ZWQoKWAgd2lsbCBiZSBjb3JyZWN0bHkKK2NhbGxlZCB3aGVuIGBkZWxldGUgcGAgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgaGVhcCBjaGVja2VyCit3aWxsIGJlIGhhcHB5LgorCisjIyBUaGUgIm5ld2VyIGV4cGVjdGF0aW9ucyBvdmVycmlkZSBvbGRlciBvbmVzIiBydWxlIG1ha2VzIHdyaXRpbmcgZXhwZWN0YXRpb25zIGF3a3dhcmQuICBXaHkgZG9lcyBHb29nbGUgTW9jayBkbyB0aGF0PyAjIworCitXaGVuIHBlb3BsZSBjb21wbGFpbiBhYm91dCB0aGlzLCBvZnRlbiB0aGV5IGFyZSByZWZlcnJpbmcgdG8gY29kZSBsaWtlOgorCitgYGAKKy8vIGZvby5CYXIoKSBzaG91bGQgYmUgY2FsbGVkIHR3aWNlLCByZXR1cm4gMSB0aGUgZmlyc3QgdGltZSwgYW5kIHJldHVybgorLy8gMiB0aGUgc2Vjb25kIHRpbWUuICBIb3dldmVyLCBJIGhhdmUgdG8gd3JpdGUgdGhlIGV4cGVjdGF0aW9ucyBpbiB0aGUKKy8vIHJldmVyc2Ugb3JkZXIuICBUaGlzIHN1Y2tzIGJpZyB0aW1lISEhCitFWFBFQ1RfQ0FMTChmb28sIEJhcigpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMikpCisgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK0VYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworYGBgCisKK1RoZSBwcm9ibGVtIGlzIHRoYXQgdGhleSBkaWRuJ3QgcGljayB0aGUgKipiZXN0Kiogd2F5IHRvIGV4cHJlc3MgdGhlIHRlc3QncworaW50ZW50LgorCitCeSBkZWZhdWx0LCBleHBlY3RhdGlvbnMgZG9uJ3QgaGF2ZSB0byBiZSBtYXRjaGVkIGluIF9hbnlfIHBhcnRpY3VsYXIKK29yZGVyLiAgSWYgeW91IHdhbnQgdGhlbSB0byBtYXRjaCBpbiBhIGNlcnRhaW4gb3JkZXIsIHlvdSBuZWVkIHRvIGJlCitleHBsaWNpdC4gIFRoaXMgaXMgR29vZ2xlIE1vY2sncyAoYW5kIGpNb2NrJ3MpIGZ1bmRhbWVudGFsIHBoaWxvc29waHk6IGl0J3MKK2Vhc3kgdG8gYWNjaWRlbnRhbGx5IG92ZXItc3BlY2lmeSB5b3VyIHRlc3RzLCBhbmQgd2Ugd2FudCB0byBtYWtlIGl0CitoYXJkZXIgdG8gZG8gc28uCisKK1RoZXJlIGFyZSB0d28gYmV0dGVyIHdheXMgdG8gd3JpdGUgdGhlIHRlc3Qgc3BlYy4gIFlvdSBjb3VsZCBlaXRoZXIKK3B1dCB0aGUgZXhwZWN0YXRpb25zIGluIHNlcXVlbmNlOgorCitgYGAKKy8vIGZvby5CYXIoKSBzaG91bGQgYmUgY2FsbGVkIHR3aWNlLCByZXR1cm4gMSB0aGUgZmlyc3QgdGltZSwgYW5kIHJldHVybgorLy8gMiB0aGUgc2Vjb25kIHRpbWUuICBVc2luZyBhIHNlcXVlbmNlLCB3ZSBjYW4gd3JpdGUgdGhlIGV4cGVjdGF0aW9ucworLy8gaW4gdGhlaXIgbmF0dXJhbCBvcmRlci4KK3sKKyAgSW5TZXF1ZW5jZSBzOworICBFWFBFQ1RfQ0FMTChmb28sIEJhcigpKQorICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKQorICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK30KK2BgYAorCitvciB5b3UgY2FuIHB1dCB0aGUgc2VxdWVuY2Ugb2YgYWN0aW9ucyBpbiB0aGUgc2FtZSBleHBlY3RhdGlvbjoKKworYGBgCisvLyBmb28uQmFyKCkgc2hvdWxkIGJlIGNhbGxlZCB0d2ljZSwgcmV0dXJuIDEgdGhlIGZpcnN0IHRpbWUsIGFuZCByZXR1cm4KKy8vIDIgdGhlIHNlY29uZCB0aW1lLgorRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMikpCisgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK2BgYAorCitCYWNrIHRvIHRoZSBvcmlnaW5hbCBxdWVzdGlvbnM6IHdoeSBkb2VzIEdvb2dsZSBNb2NrIHNlYXJjaCB0aGUKK2V4cGVjdGF0aW9ucyAoYW5kIGBPTl9DQUxMYHMpIGZyb20gYmFjayB0byBmcm9udD8gIEJlY2F1c2UgdGhpcworYWxsb3dzIGEgdXNlciB0byBzZXQgdXAgYSBtb2NrJ3MgYmVoYXZpb3IgZm9yIHRoZSBjb21tb24gY2FzZSBlYXJseQorKGUuZy4gaW4gdGhlIG1vY2sncyBjb25zdHJ1Y3RvciBvciB0aGUgdGVzdCBmaXh0dXJlJ3Mgc2V0LXVwIHBoYXNlKQorYW5kIGN1c3RvbWl6ZSBpdCB3aXRoIG1vcmUgc3BlY2lmaWMgcnVsZXMgbGF0ZXIuICBJZiBHb29nbGUgTW9jaworc2VhcmNoZXMgZnJvbSBmcm9udCB0byBiYWNrLCB0aGlzIHZlcnkgdXNlZnVsIHBhdHRlcm4gd29uJ3QgYmUKK3Bvc3NpYmxlLgorCisjIyBHb29nbGUgTW9jayBwcmludHMgYSB3YXJuaW5nIHdoZW4gYSBmdW5jdGlvbiB3aXRob3V0IEVYUEVDVFxfQ0FMTCBpcyBjYWxsZWQsIGV2ZW4gaWYgSSBoYXZlIHNldCBpdHMgYmVoYXZpb3IgdXNpbmcgT05cX0NBTEwuICBXb3VsZCBpdCBiZSByZWFzb25hYmxlIG5vdCB0byBzaG93IHRoZSB3YXJuaW5nIGluIHRoaXMgY2FzZT8gIyMKKworV2hlbiBjaG9vc2luZyBiZXR3ZWVuIGJlaW5nIG5lYXQgYW5kIGJlaW5nIHNhZmUsIHdlIGxlYW4gdG93YXJkIHRoZQorbGF0dGVyLiAgU28gdGhlIGFuc3dlciBpcyB0aGF0IHdlIHRoaW5rIGl0J3MgYmV0dGVyIHRvIHNob3cgdGhlCit3YXJuaW5nLgorCitPZnRlbiBwZW9wbGUgd3JpdGUgYE9OX0NBTExgcyBpbiB0aGUgbW9jayBvYmplY3QncworY29uc3RydWN0b3Igb3IgYFNldFVwKClgLCBhcyB0aGUgZGVmYXVsdCBiZWhhdmlvciByYXJlbHkgY2hhbmdlcyBmcm9tCit0ZXN0IHRvIHRlc3QuICBUaGVuIGluIHRoZSB0ZXN0IGJvZHkgdGhleSBzZXQgdGhlIGV4cGVjdGF0aW9ucywgd2hpY2gKK2FyZSBvZnRlbiBkaWZmZXJlbnQgZm9yIGVhY2ggdGVzdC4gIEhhdmluZyBhbiBgT05fQ0FMTGAgaW4gdGhlIHNldC11cAorcGFydCBvZiBhIHRlc3QgZG9lc24ndCBtZWFuIHRoYXQgdGhlIGNhbGxzIGFyZSBleHBlY3RlZC4gIElmIHRoZXJlJ3MKK25vIGBFWFBFQ1RfQ0FMTGAgYW5kIHRoZSBtZXRob2QgaXMgY2FsbGVkLCBpdCdzIHBvc3NpYmx5IGFuIGVycm9yLiAgSWYKK3dlIHF1aWV0bHkgbGV0IHRoZSBjYWxsIGdvIHRocm91Z2ggd2l0aG91dCBub3RpZnlpbmcgdGhlIHVzZXIsIGJ1Z3MKK21heSBjcmVlcCBpbiB1bm5vdGljZWQuCisKK0lmLCBob3dldmVyLCB5b3UgYXJlIHN1cmUgdGhhdCB0aGUgY2FsbHMgYXJlIE9LLCB5b3UgY2FuIHdyaXRlCisKK2BgYAorRVhQRUNUX0NBTEwoZm9vLCBCYXIoXykpCisgICAgLldpbGxSZXBlYXRlZGx5KC4uLik7CitgYGAKKworaW5zdGVhZCBvZgorCitgYGAKK09OX0NBTEwoZm9vLCBCYXIoXykpCisgICAgLldpbGxCeURlZmF1bHQoLi4uKTsKK2BgYAorCitUaGlzIHRlbGxzIEdvb2dsZSBNb2NrIHRoYXQgeW91IGRvIGV4cGVjdCB0aGUgY2FsbHMgYW5kIG5vIHdhcm5pbmcgc2hvdWxkIGJlCitwcmludGVkLgorCitBbHNvLCB5b3UgY2FuIGNvbnRyb2wgdGhlIHZlcmJvc2l0eSB1c2luZyB0aGUgYC0tZ21vY2tfdmVyYm9zZWAgZmxhZy4KK0lmIHlvdSBmaW5kIHRoZSBvdXRwdXQgdG9vIG5vaXN5IHdoZW4gZGVidWdnaW5nLCBqdXN0IGNob29zZSBhIGxlc3MKK3ZlcmJvc2UgbGV2ZWwuCisKKyMjIEhvdyBjYW4gSSBkZWxldGUgdGhlIG1vY2sgZnVuY3Rpb24ncyBhcmd1bWVudCBpbiBhbiBhY3Rpb24/ICMjCisKK0lmIHlvdSBmaW5kIHlvdXJzZWxmIG5lZWRpbmcgdG8gcGVyZm9ybSBzb21lIGFjdGlvbiB0aGF0J3Mgbm90CitzdXBwb3J0ZWQgYnkgR29vZ2xlIE1vY2sgZGlyZWN0bHksIHJlbWVtYmVyIHRoYXQgeW91IGNhbiBkZWZpbmUgeW91ciBvd24KK2FjdGlvbnMgdXNpbmcKK1tNYWtlQWN0aW9uKCldKFYxXzVfQ29va0Jvb2sjV3JpdGluZ19OZXdfQWN0aW9ucy5tZCkgb3IKK1tNYWtlUG9seW1vcnBoaWNBY3Rpb24oKV0oVjFfNV9Db29rQm9vayNXcml0aW5nX05ld19Qb2x5bW9ycGhpY19BY3Rpb25zLm1kKSwKK29yIHlvdSBjYW4gd3JpdGUgYSBzdHViIGZ1bmN0aW9uIGFuZCBpbnZva2UgaXQgdXNpbmcKK1tJbnZva2UoKV0oVjFfNV9Db29rQm9vayNVc2luZ19GdW5jdGlvbnNfTWV0aG9kc19GdW5jdG9ycy5tZCkuCisKKyMjIE1PQ0tcX01FVEhPRG4oKSdzIHNlY29uZCBhcmd1bWVudCBsb29rcyBmdW5ueS4gIFdoeSBkb24ndCB5b3UgdXNlIHRoZSBNT0NLXF9NRVRIT0RuKE1ldGhvZCwgcmV0dXJuXF90eXBlLCBhcmdcXzEsIC4uLiwgYXJnXF9uKSBzeW50YXg/ICMjCisKK1doYXQ/ISAgSSB0aGluayBpdCdzIGJlYXV0aWZ1bC4gOi0pCisKK1doaWxlIHdoaWNoIHN5bnRheCBsb29rcyBtb3JlIG5hdHVyYWwgaXMgYSBzdWJqZWN0aXZlIG1hdHRlciB0byBzb21lCitleHRlbnQsIEdvb2dsZSBNb2NrJ3Mgc3ludGF4IHdhcyBjaG9zZW4gZm9yIHNldmVyYWwgcHJhY3RpY2FsIGFkdmFudGFnZXMgaXQKK2hhcy4KKworVHJ5IHRvIG1vY2sgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgbWFwIGFzIGFuIGFyZ3VtZW50OgorYGBgCit2aXJ0dWFsIGludCBHZXRTaXplKGNvbnN0IG1hcDxpbnQsIHN0ZDo6c3RyaW5nPiYgbSk7CitgYGAKKworVXNpbmcgdGhlIHByb3Bvc2VkIHN5bnRheCwgaXQgd291bGQgYmU6CitgYGAKK01PQ0tfTUVUSE9EMShHZXRTaXplLCBpbnQsIGNvbnN0IG1hcDxpbnQsIHN0ZDo6c3RyaW5nPiYgbSk7CitgYGAKKworR3Vlc3Mgd2hhdD8gIFlvdSdsbCBnZXQgYSBjb21waWxlciBlcnJvciBhcyB0aGUgY29tcGlsZXIgdGhpbmtzIHRoYXQKK2Bjb25zdCBtYXA8aW50LCBzdGQ6OnN0cmluZz4mIG1gIGFyZSAqKnR3byoqLCBub3Qgb25lLCBhcmd1bWVudHMuIFRvIHdvcmsKK2Fyb3VuZCB0aGlzIHlvdSBjYW4gdXNlIGB0eXBlZGVmYCB0byBnaXZlIHRoZSBtYXAgdHlwZSBhIG5hbWUsIGJ1dAordGhhdCBnZXRzIGluIHRoZSB3YXkgb2YgeW91ciB3b3JrLiAgR29vZ2xlIE1vY2sncyBzeW50YXggYXZvaWRzIHRoaXMKK3Byb2JsZW0gYXMgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnQgdHlwZXMgYXJlIHByb3RlY3RlZCBpbnNpZGUgYSBwYWlyCitvZiBwYXJlbnRoZXNlczoKK2BgYAorLy8gVGhpcyBjb21waWxlcyBmaW5lLgorTU9DS19NRVRIT0QxKEdldFNpemUsIGludChjb25zdCBtYXA8aW50LCBzdGQ6OnN0cmluZz4mIG0pKTsKK2BgYAorCitZb3Ugc3RpbGwgbmVlZCBhIGB0eXBlZGVmYCBpZiB0aGUgcmV0dXJuIHR5cGUgY29udGFpbnMgYW4gdW5wcm90ZWN0ZWQKK2NvbW1hLCBidXQgdGhhdCdzIG11Y2ggcmFyZXIuCisKK090aGVyIGFkdmFudGFnZXMgaW5jbHVkZToKKyAgMS4gYE1PQ0tfTUVUSE9EMShGb28sIGludCwgYm9vbClgIGNhbiBsZWF2ZSBhIHJlYWRlciB3b25kZXIgd2hldGhlciB0aGUgbWV0aG9kIHJldHVybnMgYGludGAgb3IgYGJvb2xgLCB3aGlsZSB0aGVyZSB3b24ndCBiZSBzdWNoIGNvbmZ1c2lvbiB1c2luZyBHb29nbGUgTW9jaydzIHN5bnRheC4KKyAgMS4gVGhlIHdheSBHb29nbGUgTW9jayBkZXNjcmliZXMgYSBmdW5jdGlvbiB0eXBlIGlzIG5vdGhpbmcgbmV3LCBhbHRob3VnaCBtYW55IHBlb3BsZSBtYXkgbm90IGJlIGZhbWlsaWFyIHdpdGggaXQuICBUaGUgc2FtZSBzeW50YXggd2FzIHVzZWQgaW4gQywgYW5kIHRoZSBgZnVuY3Rpb25gIGxpYnJhcnkgaW4gYHRyMWAgdXNlcyB0aGlzIHN5bnRheCBleHRlbnNpdmVseS4gIFNpbmNlIGB0cjFgIHdpbGwgYmVjb21lIGEgcGFydCBvZiB0aGUgbmV3IHZlcnNpb24gb2YgU1RMLCB3ZSBmZWVsIHZlcnkgY29tZm9ydGFibGUgdG8gYmUgY29uc2lzdGVudCB3aXRoIGl0LgorICAxLiBUaGUgZnVuY3Rpb24gdHlwZSBzeW50YXggaXMgYWxzbyB1c2VkIGluIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBNb2NrJ3MgQVBJIChlLmcuIHRoZSBhY3Rpb24gaW50ZXJmYWNlKSBpbiBvcmRlciB0byBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiB0cmFjdGFibGUuIEEgdXNlciBuZWVkcyB0byBsZWFybiBpdCBhbnl3YXkgaW4gb3JkZXIgdG8gdXRpbGl6ZSBHb29nbGUgTW9jaydzIG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMuICBXZSdkIGFzIHdlbGwgc3RpY2sgdG8gdGhlIHNhbWUgc3ludGF4IGluIGBNT0NLX01FVEhPRCpgIQorCisjIyBNeSBjb2RlIGNhbGxzIGEgc3RhdGljL2dsb2JhbCBmdW5jdGlvbi4gIENhbiBJIG1vY2sgaXQ/ICMjCisKK1lvdSBjYW4sIGJ1dCB5b3UgbmVlZCB0byBtYWtlIHNvbWUgY2hhbmdlcy4KKworSW4gZ2VuZXJhbCwgaWYgeW91IGZpbmQgeW91cnNlbGYgbmVlZGluZyB0byBtb2NrIGEgc3RhdGljIGZ1bmN0aW9uLAoraXQncyBhIHNpZ24gdGhhdCB5b3VyIG1vZHVsZXMgYXJlIHRvbyB0aWdodGx5IGNvdXBsZWQgKGFuZCBsZXNzCitmbGV4aWJsZSwgbGVzcyByZXVzYWJsZSwgbGVzcyB0ZXN0YWJsZSwgZXRjKS4gIFlvdSBhcmUgcHJvYmFibHkgYmV0dGVyCitvZmYgZGVmaW5pbmcgYSBzbWFsbCBpbnRlcmZhY2UgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uIHRocm91Z2ggdGhhdAoraW50ZXJmYWNlLCB3aGljaCB0aGVuIGNhbiBiZSBlYXNpbHkgbW9ja2VkLiAgSXQncyBhIGJpdCBvZiB3b3JrCitpbml0aWFsbHksIGJ1dCB1c3VhbGx5IHBheXMgZm9yIGl0c2VsZiBxdWlja2x5LgorCitUaGlzIEdvb2dsZSBUZXN0aW5nIEJsb2cKK1twb3N0XShodHRwOi8vZ29vZ2xldGVzdGluZy5ibG9nc3BvdC5jb20vMjAwOC8wNi9kZWZlYXQtc3RhdGljLWNsaW5nLmh0bWwpCitzYXlzIGl0IGV4Y2VsbGVudGx5LiAgQ2hlY2sgaXQgb3V0LgorCisjIyBNeSBtb2NrIG9iamVjdCBuZWVkcyB0byBkbyBjb21wbGV4IHN0dWZmLiAgSXQncyBhIGxvdCBvZiBwYWluIHRvIHNwZWNpZnkgdGhlIGFjdGlvbnMuICBHb29nbGUgTW9jayBzdWNrcyEgIyMKKworSSBrbm93IGl0J3Mgbm90IGEgcXVlc3Rpb24sIGJ1dCB5b3UgZ2V0IGFuIGFuc3dlciBmb3IgZnJlZSBhbnkgd2F5LiA6LSkKKworV2l0aCBHb29nbGUgTW9jaywgeW91IGNhbiBjcmVhdGUgbW9ja3MgaW4gQysrIGVhc2lseS4gIEFuZCBwZW9wbGUgbWlnaHQgYmUKK3RlbXB0ZWQgdG8gdXNlIHRoZW0gZXZlcnl3aGVyZS4gU29tZXRpbWVzIHRoZXkgd29yayBncmVhdCwgYW5kCitzb21ldGltZXMgeW91IG1heSBmaW5kIHRoZW0sIHdlbGwsIGEgcGFpbiB0byB1c2UuIFNvLCB3aGF0J3Mgd3JvbmcgaW4KK3RoZSBsYXR0ZXIgY2FzZT8KKworV2hlbiB5b3Ugd3JpdGUgYSB0ZXN0IHdpdGhvdXQgdXNpbmcgbW9ja3MsIHlvdSBleGVyY2lzZSB0aGUgY29kZSBhbmQKK2Fzc2VydCB0aGF0IGl0IHJldHVybnMgdGhlIGNvcnJlY3QgdmFsdWUgb3IgdGhhdCB0aGUgc3lzdGVtIGlzIGluIGFuCitleHBlY3RlZCBzdGF0ZS4gIFRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCAic3RhdGUtYmFzZWQgdGVzdGluZyIuCisKK01vY2tzIGFyZSBncmVhdCBmb3Igd2hhdCBzb21lIGNhbGwgImludGVyYWN0aW9uLWJhc2VkIiB0ZXN0aW5nOgoraW5zdGVhZCBvZiBjaGVja2luZyB0aGUgc3lzdGVtIHN0YXRlIGF0IHRoZSB2ZXJ5IGVuZCwgbW9jayBvYmplY3RzCit2ZXJpZnkgdGhhdCB0aGV5IGFyZSBpbnZva2VkIHRoZSByaWdodCB3YXkgYW5kIHJlcG9ydCBhbiBlcnJvciBhcyBzb29uCithcyBpdCBhcmlzZXMsIGdpdmluZyB5b3UgYSBoYW5kbGUgb24gdGhlIHByZWNpc2UgY29udGV4dCBpbiB3aGljaCB0aGUKK2Vycm9yIHdhcyB0cmlnZ2VyZWQuICBUaGlzIGlzIG9mdGVuIG1vcmUgZWZmZWN0aXZlIGFuZCBlY29ub21pY2FsIHRvCitkbyB0aGFuIHN0YXRlLWJhc2VkIHRlc3RpbmcuCisKK0lmIHlvdSBhcmUgZG9pbmcgc3RhdGUtYmFzZWQgdGVzdGluZyBhbmQgdXNpbmcgYSB0ZXN0IGRvdWJsZSBqdXN0IHRvCitzaW11bGF0ZSB0aGUgcmVhbCBvYmplY3QsIHlvdSBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyBhIGZha2UuCitVc2luZyBhIG1vY2sgaW4gdGhpcyBjYXNlIGNhdXNlcyBwYWluLCBhcyBpdCdzIG5vdCBhIHN0cm9uZyBwb2ludCBmb3IKK21vY2tzIHRvIHBlcmZvcm0gY29tcGxleCBhY3Rpb25zLiAgSWYgeW91IGV4cGVyaWVuY2UgdGhpcyBhbmQgdGhpbmsKK3RoYXQgbW9ja3Mgc3VjaywgeW91IGFyZSBqdXN0IG5vdCB1c2luZyB0aGUgcmlnaHQgdG9vbCBmb3IgeW91cgorcHJvYmxlbS4gT3IsIHlvdSBtaWdodCBiZSB0cnlpbmcgdG8gc29sdmUgdGhlIHdyb25nIHByb2JsZW0uIDotKQorCisjIyBJIGdvdCBhIHdhcm5pbmcgIlVuaW50ZXJlc3RpbmcgZnVuY3Rpb24gY2FsbCBlbmNvdW50ZXJlZCAtIGRlZmF1bHQgYWN0aW9uIHRha2VuLi4iICBTaG91bGQgSSBwYW5pYz8gIyMKKworQnkgYWxsIG1lYW5zLCBOTyEgIEl0J3MganVzdCBhbiBGWUkuCisKK1doYXQgaXQgbWVhbnMgaXMgdGhhdCB5b3UgaGF2ZSBhIG1vY2sgZnVuY3Rpb24sIHlvdSBoYXZlbid0IHNldCBhbnkKK2V4cGVjdGF0aW9ucyBvbiBpdCAoYnkgR29vZ2xlIE1vY2sncyBydWxlIHRoaXMgbWVhbnMgdGhhdCB5b3UgYXJlIG5vdAoraW50ZXJlc3RlZCBpbiBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFuZCB0aGVyZWZvcmUgaXQgY2FuIGJlIGNhbGxlZAorYW55IG51bWJlciBvZiB0aW1lcyksIGFuZCBpdCBpcyBjYWxsZWQuICBUaGF0J3MgT0sgLSB5b3UgZGlkbid0IHNheQoraXQncyBub3QgT0sgdG8gY2FsbCB0aGUgZnVuY3Rpb24hCisKK1doYXQgaWYgeW91IGFjdHVhbGx5IG1lYW50IHRvIGRpc2FsbG93IHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLCBidXQKK2ZvcmdvdCB0byB3cml0ZSBgRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkuVGltZXMoMClgPyAgV2hpbGUKK29uZSBjYW4gYXJndWUgdGhhdCBpdCdzIHRoZSB1c2VyJ3MgZmF1bHQsIEdvb2dsZSBNb2NrIHRyaWVzIHRvIGJlIG5pY2UgYW5kCitwcmludHMgeW91IGEgbm90ZS4KKworU28sIHdoZW4geW91IHNlZSB0aGUgbWVzc2FnZSBhbmQgYmVsaWV2ZSB0aGF0IHRoZXJlIHNob3VsZG4ndCBiZSBhbnkKK3VuaW50ZXJlc3RpbmcgY2FsbHMsIHlvdSBzaG91bGQgaW52ZXN0aWdhdGUgd2hhdCdzIGdvaW5nIG9uLiAgVG8gbWFrZQoreW91ciBsaWZlIGVhc2llciwgR29vZ2xlIE1vY2sgcHJpbnRzIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCBhcmd1bWVudHMKK3doZW4gYW4gdW5pbnRlcmVzdGluZyBjYWxsIGlzIGVuY291bnRlcmVkLgorCisjIyBJIHdhbnQgdG8gZGVmaW5lIGEgY3VzdG9tIGFjdGlvbi4gIFNob3VsZCBJIHVzZSBJbnZva2UoKSBvciBpbXBsZW1lbnQgdGhlIGFjdGlvbiBpbnRlcmZhY2U/ICMjCisKK0VpdGhlciB3YXkgaXMgZmluZSAtIHlvdSB3YW50IHRvIGNob29zZSB0aGUgb25lIHRoYXQncyBtb3JlIGNvbnZlbmllbnQKK2ZvciB5b3VyIGNpcmN1bXN0YW5jZS4KKworVXN1YWxseSwgaWYgeW91ciBhY3Rpb24gaXMgZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlLCBkZWZpbmluZyBpdAordXNpbmcgYEludm9rZSgpYCBzaG91bGQgYmUgZWFzaWVyOyBpZiB5b3VyIGFjdGlvbiBjYW4gYmUgdXNlZCBpbgorZnVuY3Rpb25zIG9mIGRpZmZlcmVudCB0eXBlcyAoZS5nLiBpZiB5b3UgYXJlIGRlZmluaW5nCitgUmV0dXJuKHZhbHVlKWApLCBgTWFrZVBvbHltb3JwaGljQWN0aW9uKClgIGlzCitlYXNpZXN0LiAgU29tZXRpbWVzIHlvdSB3YW50IHByZWNpc2UgY29udHJvbCBvbiB3aGF0IHR5cGVzIG9mCitmdW5jdGlvbnMgdGhlIGFjdGlvbiBjYW4gYmUgdXNlZCBpbiwgYW5kIGltcGxlbWVudGluZworYEFjdGlvbkludGVyZmFjZWAgaXMgdGhlIHdheSB0byBnbyBoZXJlLiBTZWUgdGhlIGltcGxlbWVudGF0aW9uIG9mCitgUmV0dXJuKClgIGluIGBpbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaGAgZm9yIGFuIGV4YW1wbGUuCisKKyMjIEknbSB1c2luZyB0aGUgc2V0LWFyZ3VtZW50LXBvaW50ZWUgYWN0aW9uLCBhbmQgdGhlIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCAiY29uZmxpY3RpbmcgcmV0dXJuIHR5cGUgc3BlY2lmaWVkIi4gIFdoYXQgZG9lcyBpdCBtZWFuPyAjIworCitZb3UgZ290IHRoaXMgZXJyb3IgYXMgR29vZ2xlIE1vY2sgaGFzIG5vIGlkZWEgd2hhdCB2YWx1ZSBpdCBzaG91bGQgcmV0dXJuCit3aGVuIHRoZSBtb2NrIG1ldGhvZCBpcyBjYWxsZWQuICBgU2V0QXJndW1lbnRQb2ludGVlKClgIHNheXMgd2hhdCB0aGUKK3NpZGUgZWZmZWN0IGlzLCBidXQgZG9lc24ndCBzYXkgd2hhdCB0aGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZS4gIFlvdQorbmVlZCBgRG9BbGwoKWAgdG8gY2hhaW4gYSBgU2V0QXJndW1lbnRQb2ludGVlKClgIHdpdGggYSBgUmV0dXJuKClgLgorCitTZWUgdGhpcyBbcmVjaXBlXShWMV81X0Nvb2tCb29rI01vY2tpbmdfU2lkZV9FZmZlY3RzLm1kKSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBhbiBleGFtcGxlLgorCisKKyMjIE15IHF1ZXN0aW9uIGlzIG5vdCBpbiB5b3VyIEZBUSEgIyMKKworSWYgeW91IGNhbm5vdCBmaW5kIHRoZSBhbnN3ZXIgdG8geW91ciBxdWVzdGlvbiBpbiB0aGlzIEZBUSwgdGhlcmUgYXJlCitzb21lIG90aGVyIHJlc291cmNlcyB5b3UgY2FuIHVzZToKKworICAxLiByZWFkIG90aGVyIFt3aWtpIHBhZ2VzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93L2xpc3QpLAorICAxLiBzZWFyY2ggdGhlIG1haWxpbmcgbGlzdCBbYXJjaGl2ZV0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZW1vY2svdG9waWNzKSwKKyAgMS4gYXNrIGl0IG9uIFtnb29nbGVtb2NrQGdvb2dsZWdyb3Vwcy5jb21dKG1haWx0bzpnb29nbGVtb2NrQGdvb2dsZWdyb3Vwcy5jb20pIGFuZCBzb21lb25lIHdpbGwgYW5zd2VyIGl0ICh0byBwcmV2ZW50IHNwYW0sIHdlIHJlcXVpcmUgeW91IHRvIGpvaW4gdGhlIFtkaXNjdXNzaW9uIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xlbW9jaykgYmVmb3JlIHlvdSBjYW4gcG9zdC4pLgorCitQbGVhc2Ugbm90ZSB0aGF0IGNyZWF0aW5nIGFuIGlzc3VlIGluIHRoZQorW2lzc3VlIHRyYWNrZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL2lzc3Vlcy9saXN0KSBpcyBfbm90XworYSBnb29kIHdheSB0byBnZXQgeW91ciBhbnN3ZXIsIGFzIGl0IGlzIG1vbml0b3JlZCBpbmZyZXF1ZW50bHkgYnkgYQordmVyeSBzbWFsbCBudW1iZXIgb2YgcGVvcGxlLgorCitXaGVuIGFza2luZyBhIHF1ZXN0aW9uLCBpdCdzIGhlbHBmdWwgdG8gcHJvdmlkZSBhcyBtdWNoIG9mIHRoZQorZm9sbG93aW5nIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIChwZW9wbGUgY2Fubm90IGhlbHAgeW91IGlmIHRoZXJlJ3MKK25vdCBlbm91Z2ggaW5mb3JtYXRpb24gaW4geW91ciBxdWVzdGlvbik6CisKKyAgKiB0aGUgdmVyc2lvbiAob3IgdGhlIHJldmlzaW9uIG51bWJlciBpZiB5b3UgY2hlY2sgb3V0IGZyb20gU1ZOIGRpcmVjdGx5KSBvZiBHb29nbGUgTW9jayB5b3UgdXNlIChHb29nbGUgTW9jayBpcyB1bmRlciBhY3RpdmUgZGV2ZWxvcG1lbnQsIHNvIGl0J3MgcG9zc2libGUgdGhhdCB5b3VyIHByb2JsZW0gaGFzIGJlZW4gc29sdmVkIGluIGEgbGF0ZXIgdmVyc2lvbiksCisgICogeW91ciBvcGVyYXRpbmcgc3lzdGVtLAorICAqIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHlvdXIgY29tcGlsZXIsCisgICogdGhlIGNvbXBsZXRlIGNvbW1hbmQgbGluZSBmbGFncyB5b3UgZ2l2ZSB0byB5b3VyIGNvbXBpbGVyLAorICAqIHRoZSBjb21wbGV0ZSBjb21waWxlciBlcnJvciBtZXNzYWdlcyAoaWYgdGhlIHF1ZXN0aW9uIGlzIGFib3V0IGNvbXBpbGF0aW9uKSwKKyAgKiB0aGUgX2FjdHVhbF8gY29kZSAoaWRlYWxseSwgYSBtaW5pbWFsIGJ1dCBjb21wbGV0ZSBwcm9ncmFtKSB0aGF0IGhhcyB0aGUgcHJvYmxlbSB5b3UgZW5jb3VudGVyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzYvQ2hlYXRTaGVldC5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzYvQ2hlYXRTaGVldC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWRlMWQyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNi9DaGVhdFNoZWV0Lm1kCkBAIC0wLDAgKzEsNTM0IEBACisKKworIyBEZWZpbmluZyBhIE1vY2sgQ2xhc3MgIworCisjIyBNb2NraW5nIGEgTm9ybWFsIENsYXNzICMjCisKK0dpdmVuCitgYGAKK2NsYXNzIEZvbyB7CisgIC4uLgorICB2aXJ0dWFsIH5Gb28oKTsKKyAgdmlydHVhbCBpbnQgR2V0U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdHJpbmcgRGVzY3JpYmUoY29uc3QgY2hhciogbmFtZSkgPSAwOworICB2aXJ0dWFsIHN0cmluZyBEZXNjcmliZShpbnQgdHlwZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgUHJvY2VzcyhCYXIgZWxlbSwgaW50IGNvdW50KSA9IDA7Cit9OworYGBgCisobm90ZSB0aGF0IGB+Rm9vKClgICoqbXVzdCoqIGJlIHZpcnR1YWwpIHdlIGNhbiBkZWZpbmUgaXRzIG1vY2sgYXMKK2BgYAorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgTU9DS19DT05TVF9NRVRIT0QwKEdldFNpemUsIGludCgpKTsKKyAgTU9DS19NRVRIT0QxKERlc2NyaWJlLCBzdHJpbmcoY29uc3QgY2hhciogbmFtZSkpOworICBNT0NLX01FVEhPRDEoRGVzY3JpYmUsIHN0cmluZyhpbnQgdHlwZSkpOworICBNT0NLX01FVEhPRDIoUHJvY2VzcywgYm9vbChCYXIgZWxlbSwgaW50IGNvdW50KSk7Cit9OworYGBgCisKK1RvIGNyZWF0ZSBhICJuaWNlIiBtb2NrIG9iamVjdCB3aGljaCBpZ25vcmVzIGFsbCB1bmludGVyZXN0aW5nIGNhbGxzLAorb3IgYSAic3RyaWN0IiBtb2NrIG9iamVjdCwgd2hpY2ggdHJlYXRzIHRoZW0gYXMgZmFpbHVyZXM6CitgYGAKK05pY2VNb2NrPE1vY2tGb28+IG5pY2VfZm9vOyAgICAgLy8gVGhlIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vLgorU3RyaWN0TW9jazxNb2NrRm9vPiBzdHJpY3RfZm9vOyAvLyBUaGUgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28uCitgYGAKKworIyMgTW9ja2luZyBhIENsYXNzIFRlbXBsYXRlICMjCisKK1RvIG1vY2sKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW0+CitjbGFzcyBTdGFja0ludGVyZmFjZSB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCB+U3RhY2tJbnRlcmZhY2UoKTsKKyAgdmlydHVhbCBpbnQgR2V0U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFB1c2goY29uc3QgRWxlbSYgeCkgPSAwOworfTsKK2BgYAorKG5vdGUgdGhhdCBgflN0YWNrSW50ZXJmYWNlKClgICoqbXVzdCoqIGJlIHZpcnR1YWwpIGp1c3QgYXBwZW5kIGBfVGAgdG8gdGhlIGBNT0NLXypgIG1hY3JvczoKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW0+CitjbGFzcyBNb2NrU3RhY2sgOiBwdWJsaWMgU3RhY2tJbnRlcmZhY2U8RWxlbT4geworIHB1YmxpYzoKKyAgLi4uCisgIE1PQ0tfQ09OU1RfTUVUSE9EMF9UKEdldFNpemUsIGludCgpKTsKKyAgTU9DS19NRVRIT0QxX1QoUHVzaCwgdm9pZChjb25zdCBFbGVtJiB4KSk7Cit9OworYGBgCisKKyMjIFNwZWNpZnlpbmcgQ2FsbGluZyBDb252ZW50aW9ucyBmb3IgTW9jayBGdW5jdGlvbnMgIyMKKworSWYgeW91ciBtb2NrIGZ1bmN0aW9uIGRvZXNuJ3QgdXNlIHRoZSBkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbiwgeW91CitjYW4gc3BlY2lmeSBpdCBieSBhcHBlbmRpbmcgYF9XSVRIX0NBTExUWVBFYCB0byBhbnkgb2YgdGhlIG1hY3JvcworZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyB0d28gc2VjdGlvbnMgYW5kIHN1cHBseWluZyB0aGUgY2FsbGluZworY29udmVudGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIG1hY3JvLiBGb3IgZXhhbXBsZSwKK2BgYAorICBNT0NLX01FVEhPRF8xX1dJVEhfQ0FMTFRZUEUoU1RETUVUSE9EQ0FMTFRZUEUsIEZvbywgYm9vbChpbnQgbikpOworICBNT0NLX0NPTlNUX01FVEhPRDJfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgQmFyLCBpbnQoZG91YmxlIHgsIGRvdWJsZSB5KSk7CitgYGAKK3doZXJlIGBTVERNRVRIT0RDQUxMVFlQRWAgaXMgZGVmaW5lZCBieSBgPG9iamJhc2UuaD5gIG9uIFdpbmRvd3MuCisKKyMgVXNpbmcgTW9ja3MgaW4gVGVzdHMgIworCitUaGUgdHlwaWNhbCBmbG93IGlzOgorICAxLiBJbXBvcnQgdGhlIEdvb2dsZSBNb2NrIG5hbWVzIHlvdSBuZWVkIHRvIHVzZS4gQWxsIEdvb2dsZSBNb2NrIG5hbWVzIGFyZSBpbiB0aGUgYHRlc3RpbmdgIG5hbWVzcGFjZSB1bmxlc3MgdGhleSBhcmUgbWFjcm9zIG9yIG90aGVyd2lzZSBub3RlZC4KKyAgMS4gQ3JlYXRlIHRoZSBtb2NrIG9iamVjdHMuCisgIDEuIE9wdGlvbmFsbHksIHNldCB0aGUgZGVmYXVsdCBhY3Rpb25zIG9mIHRoZSBtb2NrIG9iamVjdHMuCisgIDEuIFNldCB5b3VyIGV4cGVjdGF0aW9ucyBvbiB0aGUgbW9jayBvYmplY3RzIChIb3cgd2lsbCB0aGV5IGJlIGNhbGxlZD8gV2hhdCB3aWwgdGhleSBkbz8pLgorICAxLiBFeGVyY2lzZSBjb2RlIHRoYXQgdXNlcyB0aGUgbW9jayBvYmplY3RzOyBpZiBuZWNlc3NhcnksIGNoZWNrIHRoZSByZXN1bHQgdXNpbmcgW0dvb2dsZSBUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8pIGFzc2VydGlvbnMuCisgIDEuIFdoZW4gYSBtb2NrIG9iamVjdHMgaXMgZGVzdHJ1Y3RlZCwgR29vZ2xlIE1vY2sgYXV0b21hdGljYWxseSB2ZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gaXQgaGF2ZSBiZWVuIHNhdGlzZmllZC4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzEKKworVEVTVChCYXJUZXN0LCBEb2VzVGhpcykgeworICBNb2NrRm9vIGZvbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjMgorCisgIE9OX0NBTEwoZm9vLCBHZXRTaXplKCkpICAgICAgICAgICAgICAgICAgICAgICAgIC8vICMzCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICAvLyAuLi4gb3RoZXIgZGVmYXVsdCBhY3Rpb25zIC4uLgorCisgIEVYUEVDVF9DQUxMKGZvbywgRGVzY3JpYmUoNSkpICAgICAgICAgICAgICAgICAgIC8vICM0CisgICAgICAuVGltZXMoMykKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oIkNhdGVnb3J5IDUiKSk7CisgIC8vIC4uLiBvdGhlciBleHBlY3RhdGlvbnMgLi4uCisKKyAgRVhQRUNUX0VRKCJnb29kIiwgTXlQcm9kdWN0aW9uRnVuY3Rpb24oJmZvbykpOyAgLy8gIzUKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzYKK2BgYAorCisjIFNldHRpbmcgRGVmYXVsdCBBY3Rpb25zICMKKworR29vZ2xlIE1vY2sgaGFzIGEgKipidWlsdC1pbiBkZWZhdWx0IGFjdGlvbioqIGZvciBhbnkgZnVuY3Rpb24gdGhhdAorcmV0dXJucyBgdm9pZGAsIGBib29sYCwgYSBudW1lcmljIHZhbHVlLCBvciBhIHBvaW50ZXIuCisKK1RvIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGZ1bmN0aW9ucyB3aXRoIHJldHVybiB0eXBlIGBUYCBnbG9iYWxseToKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpEZWZhdWx0VmFsdWU7CisKK0RlZmF1bHRWYWx1ZTxUPjo6U2V0KHZhbHVlKTsgIC8vIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCisvLyAuLi4gdXNlIHRoZSBtb2NrcyAuLi4KK0RlZmF1bHRWYWx1ZTxUPjo6Q2xlYXIoKTsgICAgIC8vIFJlc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZS4KK2BgYAorCitUbyBjdXN0b21pemUgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgbWV0aG9kLCB1c2UgYE9OX0NBTEwoKWA6CitgYGAKK09OX0NBTEwobW9ja19vYmplY3QsIG1ldGhvZChtYXRjaGVycykpCisgICAgLldpdGgobXVsdGlfYXJndW1lbnRfbWF0Y2hlcikgID8KKyAgICAuV2lsbEJ5RGVmYXVsdChhY3Rpb24pOworYGBgCisKKyMgU2V0dGluZyBFeHBlY3RhdGlvbnMgIworCitgRVhQRUNUX0NBTEwoKWAgc2V0cyAqKmV4cGVjdGF0aW9ucyoqIG9uIGEgbW9jayBtZXRob2QgKEhvdyB3aWxsIGl0IGJlCitjYWxsZWQ/IFdoYXQgd2lsbCBpdCBkbz8pOgorYGBgCitFWFBFQ1RfQ0FMTChtb2NrX29iamVjdCwgbWV0aG9kKG1hdGNoZXJzKSkKKyAgICAuV2l0aChtdWx0aV9hcmd1bWVudF9tYXRjaGVyKSAgPworICAgIC5UaW1lcyhjYXJkaW5hbGl0eSkgICAgICAgICAgICA/CisgICAgLkluU2VxdWVuY2Uoc2VxdWVuY2VzKSAgICAgICAgICoKKyAgICAuQWZ0ZXIoZXhwZWN0YXRpb25zKSAgICAgICAgICAgKgorICAgIC5XaWxsT25jZShhY3Rpb24pICAgICAgICAgICAgICAqCisgICAgLldpbGxSZXBlYXRlZGx5KGFjdGlvbikgICAgICAgID8KKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOyAgICAgICAgPworYGBgCisKK0lmIGBUaW1lcygpYCBpcyBvbWl0dGVkLCB0aGUgY2FyZGluYWxpdHkgaXMgYXNzdW1lZCB0byBiZToKKworICAqIGBUaW1lcygxKWAgd2hlbiB0aGVyZSBpcyBuZWl0aGVyIGBXaWxsT25jZSgpYCBub3IgYFdpbGxSZXBlYXRlZGx5KClgOworICAqIGBUaW1lcyhuKWAgd2hlbiB0aGVyZSBhcmUgYG4gV2lsbE9uY2UoKWBzIGJ1dCBubyBgV2lsbFJlcGVhdGVkbHkoKWAsIHdoZXJlIGBuYCA+PSAxOyBvcgorICAqIGBUaW1lcyhBdExlYXN0KG4pKWAgd2hlbiB0aGVyZSBhcmUgYG4gV2lsbE9uY2UoKWBzIGFuZCBhIGBXaWxsUmVwZWF0ZWRseSgpYCwgd2hlcmUgYG5gID49IDAuCisKK0EgbWV0aG9kIHdpdGggbm8gYEVYUEVDVF9DQUxMKClgIGlzIGZyZWUgdG8gYmUgaW52b2tlZCBfYW55IG51bWJlciBvZiB0aW1lc18sIGFuZCB0aGUgZGVmYXVsdCBhY3Rpb24gd2lsbCBiZSB0YWtlbiBlYWNoIHRpbWUuCisKKyMgTWF0Y2hlcnMgIworCitBICoqbWF0Y2hlcioqIG1hdGNoZXMgYSBfc2luZ2xlXyBhcmd1bWVudC4gIFlvdSBjYW4gdXNlIGl0IGluc2lkZQorYE9OX0NBTEwoKWAgb3IgYEVYUEVDVF9DQUxMKClgLCBvciB1c2UgaXQgdG8gdmFsaWRhdGUgYSB2YWx1ZQorZGlyZWN0bHk6CisKK3wgYEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAgfCBBc3NlcnRzIHRoYXQgYHZhbHVlYCBtYXRjaGVzIGBtYXRjaGVyYC4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfVEhBVCh2YWx1ZSwgbWF0Y2hlcilgIHwgVGhlIHNhbWUgYXMgYEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAsIGV4Y2VwdCB0aGF0IGl0IGdlbmVyYXRlcyBhICoqZmF0YWwqKiBmYWlsdXJlLiB8CisKK0J1aWx0LWluIG1hdGNoZXJzICh3aGVyZSBgYXJndW1lbnRgIGlzIHRoZSBmdW5jdGlvbiBhcmd1bWVudCkgYXJlCitkaXZpZGVkIGludG8gc2V2ZXJhbCBjYXRlZ29yaWVzOgorCisjIyBXaWxkY2FyZCAjIworfGBfYHxgYXJndW1lbnRgIGNhbiBiZSBhbnkgdmFsdWUgb2YgdGhlIGNvcnJlY3QgdHlwZS58Cit8Oi0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgQTx0eXBlPigpYCBvciBgQW48dHlwZT4oKWB8YGFyZ3VtZW50YCBjYW4gYmUgYW55IHZhbHVlIG9mIHR5cGUgYHR5cGVgLiAgICAgfAorCisjIyBHZW5lcmljIENvbXBhcmlzb24gIyMKKworfGBFcSh2YWx1ZSlgIG9yIGB2YWx1ZWB8YGFyZ3VtZW50ID09IHZhbHVlYHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS18Cit8YEdlKHZhbHVlKWAgICAgICAgICAgIHxgYXJndW1lbnQgPj0gdmFsdWVgfAorfGBHdCh2YWx1ZSlgICAgICAgICAgICB8YGFyZ3VtZW50ID4gdmFsdWVgIHwKK3xgTGUodmFsdWUpYCAgICAgICAgICAgfGBhcmd1bWVudCA8PSB2YWx1ZWB8Cit8YEx0KHZhbHVlKWAgICAgICAgICAgIHxgYXJndW1lbnQgPCB2YWx1ZWAgfAorfGBOZSh2YWx1ZSlgICAgICAgICAgICB8YGFyZ3VtZW50ICE9IHZhbHVlYHwKK3xgSXNOdWxsKClgICAgICAgICAgICAgfGBhcmd1bWVudGAgaXMgYSBgTlVMTGAgcG9pbnRlciAocmF3IG9yIHNtYXJ0KS58Cit8YE5vdE51bGwoKWAgICAgICAgICAgIHxgYXJndW1lbnRgIGlzIGEgbm9uLW51bGwgcG9pbnRlciAocmF3IG9yIHNtYXJ0KS58Cit8YFJlZih2YXJpYWJsZSlgICAgICAgIHxgYXJndW1lbnRgIGlzIGEgcmVmZXJlbmNlIHRvIGB2YXJpYWJsZWAufAorfGBUeXBlZEVxPHR5cGU+KHZhbHVlKWB8YGFyZ3VtZW50YCBoYXMgdHlwZSBgdHlwZWAgYW5kIGlzIGVxdWFsIHRvIGB2YWx1ZWAuIFlvdSBtYXkgbmVlZCB0byB1c2UgdGhpcyBpbnN0ZWFkIG9mIGBFcSh2YWx1ZSlgIHdoZW4gdGhlIG1vY2sgZnVuY3Rpb24gaXMgb3ZlcmxvYWRlZC58CisKK0V4Y2VwdCBgUmVmKClgLCB0aGVzZSBtYXRjaGVycyBtYWtlIGEgX2NvcHlfIG9mIGB2YWx1ZWAgaW4gY2FzZSBpdCdzCittb2RpZmllZCBvciBkZXN0cnVjdGVkIGxhdGVyLiBJZiB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgYHZhbHVlYAorZG9lc24ndCBoYXZlIGEgcHVibGljIGNvcHkgY29uc3RydWN0b3IsIHRyeSB3cmFwIGl0IGluIGBCeVJlZigpYCwKK2UuZy4gYEVxKEJ5UmVmKG5vbl9jb3B5YWJsZV92YWx1ZSkpYC4gSWYgeW91IGRvIHRoYXQsIG1ha2Ugc3VyZQorYG5vbl9jb3B5YWJsZV92YWx1ZWAgaXMgbm90IGNoYW5nZWQgYWZ0ZXJ3YXJkcywgb3IgdGhlIG1lYW5pbmcgb2YgeW91cgorbWF0Y2hlciB3aWxsIGJlIGNoYW5nZWQuCisKKyMjIEZsb2F0aW5nLVBvaW50IE1hdGNoZXJzICMjCisKK3xgRG91YmxlRXEoYV9kb3VibGUpYHxgYXJndW1lbnRgIGlzIGEgYGRvdWJsZWAgdmFsdWUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgYV9kb3VibGVgLCB0cmVhdGluZyB0d28gTmFOcyBhcyB1bmVxdWFsLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgRmxvYXRFcShhX2Zsb2F0KWAgIHxgYXJndW1lbnRgIGlzIGEgYGZsb2F0YCB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGBhX2Zsb2F0YCwgdHJlYXRpbmcgdHdvIE5hTnMgYXMgdW5lcXVhbC4gIHwKK3xgTmFuU2Vuc2l0aXZlRG91YmxlRXEoYV9kb3VibGUpYHxgYXJndW1lbnRgIGlzIGEgYGRvdWJsZWAgdmFsdWUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgYV9kb3VibGVgLCB0cmVhdGluZyB0d28gTmFOcyBhcyBlcXVhbC4gIHwKK3xgTmFuU2Vuc2l0aXZlRmxvYXRFcShhX2Zsb2F0KWB8YGFyZ3VtZW50YCBpcyBhIGBmbG9hdGAgdmFsdWUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgYV9mbG9hdGAsIHRyZWF0aW5nIHR3byBOYU5zIGFzIGVxdWFsLiAgICB8CisKK1RoZXNlIG1hdGNoZXJzIHVzZSBVTFAtYmFzZWQgY29tcGFyaXNvbiAodGhlIHNhbWUgYXMgdXNlZCBpbgorW0dvb2dsZSBUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8pKS4gVGhleQorYXV0b21hdGljYWxseSBwaWNrIGEgcmVhc29uYWJsZSBlcnJvciBib3VuZCBiYXNlZCBvbiB0aGUgYWJzb2x1dGUKK3ZhbHVlIG9mIHRoZSBleHBlY3RlZCB2YWx1ZS4gIGBEb3VibGVFcSgpYCBhbmQgYEZsb2F0RXEoKWAgY29uZm9ybSB0bwordGhlIElFRUUgc3RhbmRhcmQsIHdoaWNoIHJlcXVpcmVzIGNvbXBhcmluZyB0d28gTmFOcyBmb3IgZXF1YWxpdHkgdG8KK3JldHVybiBmYWxzZS4gVGhlIGBOYW5TZW5zaXRpdmUqYCB2ZXJzaW9uIGluc3RlYWQgdHJlYXRzIHR3byBOYU5zIGFzCitlcXVhbCwgd2hpY2ggaXMgb2Z0ZW4gd2hhdCBhIHVzZXIgd2FudHMuCisKKyMjIFN0cmluZyBNYXRjaGVycyAjIworCitUaGUgYGFyZ3VtZW50YCBjYW4gYmUgZWl0aGVyIGEgQyBzdHJpbmcgb3IgYSBDKysgc3RyaW5nIG9iamVjdDoKKworfGBDb250YWluc1JlZ2V4KHN0cmluZylgfGBhcmd1bWVudGAgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEVuZHNXaXRoKHN1ZmZpeClgICAgICB8YGFyZ3VtZW50YCBlbmRzIHdpdGggc3RyaW5nIGBzdWZmaXhgLiAgICAgICAgICAgfAorfGBIYXNTdWJzdHIoc3RyaW5nKWAgICAgfGBhcmd1bWVudGAgY29udGFpbnMgYHN0cmluZ2AgYXMgYSBzdWItc3RyaW5nLiAgIHwKK3xgTWF0Y2hlc1JlZ2V4KHN0cmluZylgIHxgYXJndW1lbnRgIG1hdGNoZXMgdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIHRoZSBtYXRjaCBzdGFydGluZyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBlbmRpbmcgYXQgdGhlIGxhc3QgY2hhcmFjdGVyLnwKK3xgU3RhcnRzV2l0aChwcmVmaXgpYCAgIHxgYXJndW1lbnRgIHN0YXJ0cyB3aXRoIHN0cmluZyBgcHJlZml4YC4gICAgICAgICB8Cit8YFN0ckNhc2VFcShzdHJpbmcpYCAgICB8YGFyZ3VtZW50YCBpcyBlcXVhbCB0byBgc3RyaW5nYCwgaWdub3JpbmcgY2FzZS4gfAorfGBTdHJDYXNlTmUoc3RyaW5nKWAgICAgfGBhcmd1bWVudGAgaXMgbm90IGVxdWFsIHRvIGBzdHJpbmdgLCBpZ25vcmluZyBjYXNlLnwKK3xgU3RyRXEoc3RyaW5nKWAgICAgICAgIHxgYXJndW1lbnRgIGlzIGVxdWFsIHRvIGBzdHJpbmdgLiAgICAgICAgICAgICAgICB8Cit8YFN0ck5lKHN0cmluZylgICAgICAgICB8YGFyZ3VtZW50YCBpcyBub3QgZXF1YWwgdG8gYHN0cmluZ2AuICAgICAgICAgICAgfAorCitgQ29udGFpbnNSZWdleCgpYCBhbmQgYE1hdGNoZXNSZWdleCgpYCB1c2UgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorc3ludGF4IGRlZmluZWQKK1toZXJlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzZfQWR2YW5jZWRHdWlkZSNSZWd1bGFyX0V4cHJlc3Npb25fU3ludGF4KS4KK2BTdHJDYXNlRXEoKWAsIGBTdHJDYXNlTmUoKWAsIGBTdHJFcSgpYCwgYW5kIGBTdHJOZSgpYCB3b3JrIGZvciB3aWRlCitzdHJpbmdzIGFzIHdlbGwuCisKKyMjIENvbnRhaW5lciBNYXRjaGVycyAjIworCitNb3N0IFNUTC1zdHlsZSBjb250YWluZXJzIHN1cHBvcnQgYD09YCwgc28geW91IGNhbiB1c2UKK2BFcShleHBlY3RlZF9jb250YWluZXIpYCBvciBzaW1wbHkgYGV4cGVjdGVkX2NvbnRhaW5lcmAgdG8gbWF0Y2ggYQorY29udGFpbmVyIGV4YWN0bHkuICAgSWYgeW91IHdhbnQgdG8gd3JpdGUgdGhlIGVsZW1lbnRzIGluLWxpbmUsCittYXRjaCB0aGVtIG1vcmUgZmxleGlibHksIG9yIGdldCBtb3JlIGluZm9ybWF0aXZlIG1lc3NhZ2VzLCB5b3UgY2FuIHVzZToKKworfCBgQ29udGFpbnMoZSlgIHwgYGFyZ3VtZW50YCBjb250YWlucyBhbiBlbGVtZW50IHRoYXQgbWF0Y2hlcyBgZWAsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSB2YWx1ZSBvciBhIG1hdGNoZXIuIHwKK3w6LS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBFYWNoKGUpYCAgICAgfCBgYXJndW1lbnRgIGlzIGEgY29udGFpbmVyIHdoZXJlIF9ldmVyeV8gZWxlbWVudCBtYXRjaGVzIGBlYCwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gfAorfCBgRWxlbWVudHNBcmUoZTAsIGUxLCAuLi4sIGVuKWAgfCBgYXJndW1lbnRgIGhhcyBgbiArIDFgIGVsZW1lbnRzLCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IG1hdGNoZXMgYGVpYCwgd2hpY2ggY2FuIGJlIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAwIHRvIDEwIGFyZ3VtZW50cyBhcmUgYWxsb3dlZC4gfAorfCBgRWxlbWVudHNBcmVBcnJheShhcnJheSlgIG9yIGBFbGVtZW50c0FyZUFycmF5KGFycmF5LCBjb3VudClgIHwgVGhlIHNhbWUgYXMgYEVsZW1lbnRzQXJlKClgIGV4Y2VwdCB0aGF0IHRoZSBleHBlY3RlZCBlbGVtZW50IHZhbHVlcy9tYXRjaGVycyBjb21lIGZyb20gYSBDLXN0eWxlIGFycmF5LiB8Cit8IGBDb250YWluZXJFcShjb250YWluZXIpYCB8IFRoZSBzYW1lIGFzIGBFcShjb250YWluZXIpYCBleGNlcHQgdGhhdCB0aGUgZmFpbHVyZSBtZXNzYWdlIGFsc28gaW5jbHVkZXMgd2hpY2ggZWxlbWVudHMgYXJlIGluIG9uZSBjb250YWluZXIgYnV0IG5vdCB0aGUgb3RoZXIuIHwKK3wgYFBvaW50d2lzZShtLCBjb250YWluZXIpYCB8IGBhcmd1bWVudGAgY29udGFpbnMgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFzIGluIGBjb250YWluZXJgLCBhbmQgZm9yIGFsbCBpLCAodGhlIGktdGggZWxlbWVudCBpbiBgYXJndW1lbnRgLCB0aGUgaS10aCBlbGVtZW50IGluIGBjb250YWluZXJgKSBtYXRjaCBgbWAsIHdoaWNoIGlzIGEgbWF0Y2hlciBvbiAyLXR1cGxlcy4gRS5nLiBgUG9pbnR3aXNlKExlKCksIHVwcGVyX2JvdW5kcylgIHZlcmlmaWVzIHRoYXQgZWFjaCBlbGVtZW50IGluIGBhcmd1bWVudGAgZG9lc24ndCBleGNlZWQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiBgdXBwZXJfYm91bmRzYC4gfAorCitUaGVzZSBtYXRjaGVycyBjYW4gYWxzbyBtYXRjaDoKKworICAxLiBhIG5hdGl2ZSBhcnJheSBwYXNzZWQgYnkgcmVmZXJlbmNlIChlLmcuIGluIGBGb28oY29uc3QgaW50ICgmYSlbNV0pYCksIGFuZAorICAxLiBhbiBhcnJheSBwYXNzZWQgYXMgYSBwb2ludGVyIGFuZCBhIGNvdW50IChlLmcuIGluIGBCYXIoY29uc3QgVCogYnVmZmVyLCBpbnQgbGVuKWAgLS0gc2VlIFtNdWx0aS1hcmd1bWVudCBNYXRjaGVyc10oI011bHRpYXJndW1lbnRfTWF0Y2hlcnMubWQpKS4KKword2hlcmUgdGhlIGFycmF5IG1heSBiZSBtdWx0aS1kaW1lbnNpb25hbCAoaS5lLiBpdHMgZWxlbWVudHMgY2FuIGJlIGFycmF5cykuCisKKyMjIE1lbWJlciBNYXRjaGVycyAjIworCit8YEZpZWxkKCZjbGFzczo6ZmllbGQsIG0pYHxgYXJndW1lbnQuZmllbGRgIChvciBgYXJndW1lbnQtPmZpZWxkYCB3aGVuIGBhcmd1bWVudGAgaXMgYSBwbGFpbiBwb2ludGVyKSBtYXRjaGVzIG1hdGNoZXIgYG1gLCB3aGVyZSBgYXJndW1lbnRgIGlzIGFuIG9iamVjdCBvZiB0eXBlIF9jbGFzc18ufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgS2V5KGUpYCAgICAgICAgICAgICAgICAgfGBhcmd1bWVudC5maXJzdGAgbWF0Y2hlcyBgZWAsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSB2YWx1ZSBvciBhIG1hdGNoZXIuIEUuZy4gYENvbnRhaW5zKEtleShMZSg1KSkpYCBjYW4gdmVyaWZ5IHRoYXQgYSBgbWFwYCBjb250YWlucyBhIGtleSBgPD0gNWAufAorfGBQYWlyKG0xLCBtMilgICAgICAgICAgICB8YGFyZ3VtZW50YCBpcyBhbiBgc3RkOjpwYWlyYCB3aG9zZSBgZmlyc3RgIGZpZWxkIG1hdGNoZXMgYG0xYCBhbmQgYHNlY29uZGAgZmllbGQgbWF0Y2hlcyBgbTJgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgUHJvcGVydHkoJmNsYXNzOjpwcm9wZXJ0eSwgbSlgfGBhcmd1bWVudC5wcm9wZXJ0eSgpYCAob3IgYGFyZ3VtZW50LT5wcm9wZXJ0eSgpYCB3aGVuIGBhcmd1bWVudGAgaXMgYSBwbGFpbiBwb2ludGVyKSBtYXRjaGVzIG1hdGNoZXIgYG1gLCB3aGVyZSBgYXJndW1lbnRgIGlzIGFuIG9iamVjdCBvZiB0eXBlIF9jbGFzc18ufAorCisjIyBNYXRjaGluZyB0aGUgUmVzdWx0IG9mIGEgRnVuY3Rpb24gb3IgRnVuY3RvciAjIworCit8YFJlc3VsdE9mKGYsIG0pYHxgZihhcmd1bWVudClgIG1hdGNoZXMgbWF0Y2hlciBgbWAsIHdoZXJlIGBmYCBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IufAorfDotLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworIyMgUG9pbnRlciBNYXRjaGVycyAjIworCit8YFBvaW50ZWUobSlgfGBhcmd1bWVudGAgKGVpdGhlciBhIHNtYXJ0IHBvaW50ZXIgb3IgYSByYXcgcG9pbnRlcikgcG9pbnRzIHRvIGEgdmFsdWUgdGhhdCBtYXRjaGVzIG1hdGNoZXIgYG1gLnwKK3w6LS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCisjIyBNdWx0aWFyZ3VtZW50IE1hdGNoZXJzICMjCisKK1RlY2huaWNhbGx5LCBhbGwgbWF0Y2hlcnMgbWF0Y2ggYSBfc2luZ2xlXyB2YWx1ZS4gQSAibXVsdGktYXJndW1lbnQiCittYXRjaGVyIGlzIGp1c3Qgb25lIHRoYXQgbWF0Y2hlcyBhIF90dXBsZV8uIFRoZSBmb2xsb3dpbmcgbWF0Y2hlcnMgY2FuCitiZSB1c2VkIHRvIG1hdGNoIGEgdHVwbGUgYCh4LCB5KWA6CisKK3xgRXEoKWB8YHggPT0geWB8Cit8Oi0tLS0tfDotLS0tLS0tfAorfGBHZSgpYHxgeCA+PSB5YHwKK3xgR3QoKWB8YHggPiB5YCB8Cit8YExlKClgfGB4IDw9IHlgfAorfGBMdCgpYHxgeCA8IHlgIHwKK3xgTmUoKWB8YHggIT0geWB8CisKK1lvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgc2VsZWN0b3JzIHRvIHBpY2sgYSBzdWJzZXQgb2YgdGhlIGFyZ3VtZW50cworKG9yIHJlb3JkZXIgdGhlbSkgdG8gcGFydGljaXBhdGUgaW4gdGhlIG1hdGNoaW5nOgorCit8YEFsbEFyZ3MobSlgfEVxdWl2YWxlbnQgdG8gYG1gLiBVc2VmdWwgYXMgc3ludGFjdGljIHN1Z2FyIGluIGAuV2l0aChBbGxBcmdzKG0pKWAufAorfDotLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgQXJnczxOMSwgTjIsIC4uLiwgTms+KG0pYHxUaGUgdHVwbGUgb2YgdGhlIGBrYCBzZWxlY3RlZCAodXNpbmcgMC1iYXNlZCBpbmRpY2VzKSBhcmd1bWVudHMgbWF0Y2hlcyBgbWAsIGUuZy4gYEFyZ3M8MSwgMj4oRXEoKSlgLnwKKworIyMgQ29tcG9zaXRlIE1hdGNoZXJzICMjCisKK1lvdSBjYW4gbWFrZSBhIG1hdGNoZXIgZnJvbSBvbmUgb3IgbW9yZSBvdGhlciBtYXRjaGVyczoKKworfGBBbGxPZihtMSwgbTIsIC4uLiwgbW4pYHxgYXJndW1lbnRgIG1hdGNoZXMgYWxsIG9mIHRoZSBtYXRjaGVycyBgbTFgIHRvIGBtbmAufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBbnlPZihtMSwgbTIsIC4uLiwgbW4pYHxgYXJndW1lbnRgIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYXRjaGVycyBgbTFgIHRvIGBtbmAufAorfGBOb3QobSlgICAgICAgICAgICAgICAgIHxgYXJndW1lbnRgIGRvZXNuJ3QgbWF0Y2ggbWF0Y2hlciBgbWAuICAgICAgICAgICAgICAgfAorCisjIyBBZGFwdGVycyBmb3IgTWF0Y2hlcnMgIyMKKworfGBNYXRjaGVyQ2FzdDxUPihtKWB8Y2FzdHMgbWF0Y2hlciBgbWAgdG8gdHlwZSBgTWF0Y2hlcjxUPmAufAorfDotLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBTYWZlTWF0Y2hlckNhc3Q8VD4obSlgfCBbc2FmZWx5IGNhc3RzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL1YxXzZfQ29va0Jvb2sjQ2FzdGluZ19NYXRjaGVycykgbWF0Y2hlciBgbWAgdG8gdHlwZSBgTWF0Y2hlcjxUPmAuIHwKK3xgVHJ1bHkocHJlZGljYXRlKWAgfGBwcmVkaWNhdGUoYXJndW1lbnQpYCByZXR1cm5zIHNvbWV0aGluZyBjb25zaWRlcmVkIGJ5IEMrKyB0byBiZSB0cnVlLCB3aGVyZSBgcHJlZGljYXRlYCBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IufAorCisjIyBNYXRjaGVycyBhcyBQcmVkaWNhdGVzICMjCisKK3xgTWF0Y2hlcyhtKSh2YWx1ZSlgfGV2YWx1YXRlcyB0byBgdHJ1ZWAgaWYgYHZhbHVlYCBtYXRjaGVzIGBtYC4gWW91IGNhbiB1c2UgYE1hdGNoZXMobSlgIGFsb25lIGFzIGEgdW5hcnkgZnVuY3Rvci58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBFeHBsYWluTWF0Y2hSZXN1bHQobSwgdmFsdWUsIHJlc3VsdF9saXN0ZW5lcilgfGV2YWx1YXRlcyB0byBgdHJ1ZWAgaWYgYHZhbHVlYCBtYXRjaGVzIGBtYCwgZXhwbGFpbmluZyB0aGUgcmVzdWx0IHRvIGByZXN1bHRfbGlzdGVuZXJgLiAgICAgICB8Cit8YFZhbHVlKHZhbHVlLCBtKWAgIHxldmFsdWF0ZXMgdG8gYHRydWVgIGlmIGB2YWx1ZWAgbWF0Y2hlcyBgbWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisjIyBEZWZpbmluZyBNYXRjaGVycyAjIworCit8IGBNQVRDSEVSKElzRXZlbiwgIiIpIHsgcmV0dXJuIChhcmcgJSAyKSA9PSAwOyB9YCB8IERlZmluZXMgYSBtYXRjaGVyIGBJc0V2ZW4oKWAgdG8gbWF0Y2ggYW4gZXZlbiBudW1iZXIuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgTUFUQ0hFUl9QKElzRGl2aXNpYmxlQnksIG4sICIiKSB7ICpyZXN1bHRfbGlzdGVuZXIgPDwgIndoZXJlIHRoZSByZW1haW5kZXIgaXMgIiA8PCAoYXJnICUgbik7IHJldHVybiAoYXJnICUgbikgPT0gMDsgfWAgfCBEZWZpbmVzIGEgbWFjaGVyIGBJc0RpdmlzaWJsZUJ5KG4pYCB0byBtYXRjaCBhIG51bWJlciBkaXZpc2libGUgYnkgYG5gLiB8Cit8IGBNQVRDSEVSX1AyKElzQmV0d2VlbiwgYSwgYiwgc3RkOjpzdHJpbmcobmVnYXRpb24gPyAiaXNuJ3QiIDogImlzIikgKyAiIGJldHdlZW4gIiArIFByaW50VG9TdHJpbmcoYSkgKyAiIGFuZCAiICsgUHJpbnRUb1N0cmluZyhiKSkgeyByZXR1cm4gYSA8PSBhcmcgJiYgYXJnIDw9IGI7IH1gIHwgRGVmaW5lcyBhIG1hdGNoZXIgYElzQmV0d2VlbihhLCBiKWAgdG8gbWF0Y2ggYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgW2BhYCwgYGJgXS4gfAorCisqKk5vdGVzOioqCisKKyAgMS4gVGhlIGBNQVRDSEVSKmAgbWFjcm9zIGNhbm5vdCBiZSB1c2VkIGluc2lkZSBhIGZ1bmN0aW9uIG9yIGNsYXNzLgorICAxLiBUaGUgbWF0Y2hlciBib2R5IG11c3QgYmUgX3B1cmVseSBmdW5jdGlvbmFsXyAoaS5lLiBpdCBjYW5ub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QsIGFuZCB0aGUgcmVzdWx0IG11c3Qgbm90IGRlcGVuZCBvbiBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZCB0aGUgbWF0Y2hlciBwYXJhbWV0ZXJzKS4KKyAgMS4gWW91IGNhbiB1c2UgYFByaW50VG9TdHJpbmcoeClgIHRvIGNvbnZlcnQgYSB2YWx1ZSBgeGAgb2YgYW55IHR5cGUgdG8gYSBzdHJpbmcuCisKKyMjIE1hdGNoZXJzIGFzIFRlc3QgQXNzZXJ0aW9ucyAjIworCit8YEFTU0VSVF9USEFUKGV4cHJlc3Npb24sIG0pYHxHZW5lcmF0ZXMgYSBbZmF0YWwgZmFpbHVyZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV82X1ByaW1lciNBc3NlcnRpb25zKSBpZiB0aGUgdmFsdWUgb2YgYGV4cHJlc3Npb25gIGRvZXNuJ3QgbWF0Y2ggbWF0Y2hlciBgbWAufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgRVhQRUNUX1RIQVQoZXhwcmVzc2lvbiwgbSlgfEdlbmVyYXRlcyBhIG5vbi1mYXRhbCBmYWlsdXJlIGlmIHRoZSB2YWx1ZSBvZiBgZXhwcmVzc2lvbmAgZG9lc24ndCBtYXRjaCBtYXRjaGVyIGBtYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKyMgQWN0aW9ucyAjCisKKyoqQWN0aW9ucyoqIHNwZWNpZnkgd2hhdCBhIG1vY2sgZnVuY3Rpb24gc2hvdWxkIGRvIHdoZW4gaW52b2tlZC4KKworIyMgUmV0dXJuaW5nIGEgVmFsdWUgIyMKKworfGBSZXR1cm4oKWB8UmV0dXJuIGZyb20gYSBgdm9pZGAgbW9jayBmdW5jdGlvbi58Cit8Oi0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgUmV0dXJuKHZhbHVlKWB8UmV0dXJuIGB2YWx1ZWAuIElmIHRoZSB0eXBlIG9mIGB2YWx1ZWAgaXMgZGlmZmVyZW50IHRvIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUsIGB2YWx1ZWAgaXMgY29udmVydGVkIHRvIHRoZSBsYXR0ZXIgdHlwZSA8aT5hdCB0aGUgdGltZSB0aGUgZXhwZWN0YXRpb24gaXMgc2V0PC9pPiwgbm90IHdoZW4gdGhlIGFjdGlvbiBpcyBleGVjdXRlZC58Cit8YFJldHVybkFyZzxOPigpYHxSZXR1cm4gdGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQufAorfGBSZXR1cm5OZXc8VD4oYTEsIC4uLiwgYWspYHxSZXR1cm4gYG5ldyBUKGExLCAuLi4sIGFrKWA7IGEgZGlmZmVyZW50IG9iamVjdCBpcyBjcmVhdGVkIGVhY2ggdGltZS58Cit8YFJldHVybk51bGwoKWB8UmV0dXJuIGEgbnVsbCBwb2ludGVyLiAgICAgICAgICAgICB8Cit8YFJldHVyblBvaW50ZWUocHRyKWB8UmV0dXJuIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IGBwdHJgLnwKK3xgUmV0dXJuUmVmKHZhcmlhYmxlKWB8UmV0dXJuIGEgcmVmZXJlbmNlIHRvIGB2YXJpYWJsZWAuICB8Cit8YFJldHVyblJlZk9mQ29weSh2YWx1ZSlgfFJldHVybiBhIHJlZmVyZW5jZSB0byBhIGNvcHkgb2YgYHZhbHVlYDsgdGhlIGNvcHkgbGl2ZXMgYXMgbG9uZyBhcyB0aGUgYWN0aW9uLnwKKworIyMgU2lkZSBFZmZlY3RzICMjCisKK3xgQXNzaWduKCZ2YXJpYWJsZSwgdmFsdWUpYHxBc3NpZ24gYHZhbHVlYCB0byB2YXJpYWJsZS58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgRGVsZXRlQXJnPE4+KClgICAgICAgICAgfCBEZWxldGUgdGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYSBwb2ludGVyLiB8Cit8IGBTYXZlQXJnPE4+KHBvaW50ZXIpYCAgICB8IFNhdmUgdGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQgdG8gYCpwb2ludGVyYC4gfAorfCBgU2F2ZUFyZ1BvaW50ZWU8Tj4ocG9pbnRlcilgIHwgU2F2ZSB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0byBgKnBvaW50ZXJgLiB8Cit8IGBTZXRBcmdSZWZlcmVlPE4+KHZhbHVlKWAgfAlBc3NpZ24gdmFsdWUgdG8gdGhlIHZhcmlhYmxlIHJlZmVyZW5jZWQgYnkgdGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQuIHwKK3xgU2V0QXJnUG9pbnRlZTxOPih2YWx1ZSlgIHxBc3NpZ24gYHZhbHVlYCB0byB0aGUgdmFyaWFibGUgcG9pbnRlZCBieSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudC58Cit8YFNldEFyZ3VtZW50UG9pbnRlZTxOPih2YWx1ZSlgfFNhbWUgYXMgYFNldEFyZ1BvaW50ZWU8Tj4odmFsdWUpYC4gRGVwcmVjYXRlZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxLjcuMC58Cit8YFNldEFycmF5QXJndW1lbnQ8Tj4oZmlyc3QsIGxhc3QpYHxDb3BpZXMgdGhlIGVsZW1lbnRzIGluIHNvdXJjZSByYW5nZSBbYGZpcnN0YCwgYGxhc3RgKSB0byB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHBvaW50ZXIgb3IgYW4gaXRlcmF0b3IuIFRoZSBhY3Rpb24gZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzb3VyY2UgcmFuZ2UufAorfGBTZXRFcnJub0FuZFJldHVybihlcnJvciwgdmFsdWUpYHxTZXQgYGVycm5vYCB0byBgZXJyb3JgIGFuZCByZXR1cm4gYHZhbHVlYC58Cit8YFRocm93KGV4Y2VwdGlvbilgICAgICAgICB8VGhyb3dzIHRoZSBnaXZlbiBleGNlcHRpb24sIHdoaWNoIGNhbiBiZSBhbnkgY29weWFibGUgdmFsdWUuIEF2YWlsYWJsZSBzaW5jZSB2MS4xLjAufAorCisjIyBVc2luZyBhIEZ1bmN0aW9uIG9yIGEgRnVuY3RvciBhcyBhbiBBY3Rpb24gIyMKKworfGBJbnZva2UoZilgfEludm9rZSBgZmAgd2l0aCB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbW9jayBmdW5jdGlvbiwgd2hlcmUgYGZgIGNhbiBiZSBhIGdsb2JhbC9zdGF0aWMgZnVuY3Rpb24gb3IgYSBmdW5jdG9yLnwKK3w6LS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEludm9rZShvYmplY3RfcG9pbnRlciwgJmNsYXNzOjptZXRob2QpYHxJbnZva2UgdGhlIHttZXRob2Qgb24gdGhlIG9iamVjdCB3aXRoIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBtb2NrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8YEludm9rZVdpdGhvdXRBcmdzKGYpYHxJbnZva2UgYGZgLCB3aGljaCBjYW4gYmUgYSBnbG9iYWwvc3RhdGljIGZ1bmN0aW9uIG9yIGEgZnVuY3Rvci4gYGZgIG11c3QgdGFrZSBubyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICB8Cit8YEludm9rZVdpdGhvdXRBcmdzKG9iamVjdF9wb2ludGVyLCAmY2xhc3M6Om1ldGhvZClgfEludm9rZSB0aGUgbWV0aG9kIG9uIHRoZSBvYmplY3QsIHdoaWNoIHRha2VzIG5vIGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgSW52b2tlQXJndW1lbnQ8Tj4oYXJnMSwgYXJnMiwgLi4uLCBhcmdrKWB8SW52b2tlIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGEgZnVuY3Rvciwgd2l0aCB0aGUgYGtgIGFyZ3VtZW50cy58CisKK1RoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGludm9rZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgcmV0dXJuIHZhbHVlCitvZiB0aGUgYWN0aW9uLgorCitXaGVuIGRlZmluaW5nIGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0byBiZSB1c2VkIHdpdGggYEludm9rZSooKWAsIHlvdSBjYW4gZGVjbGFyZSBhbnkgdW51c2VkIHBhcmFtZXRlcnMgYXMgYFVudXNlZGA6CitgYGAKKyAgZG91YmxlIERpc3RhbmNlKFVudXNlZCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiBzcXJ0KHgqeCArIHkqeSk7IH0KKyAgLi4uCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbygiSGkiLCBfLCBfKSkuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlKSk7CitgYGAKKworSW4gYEludm9rZUFyZ3VtZW50PE4+KC4uLilgLCBpZiBhbiBhcmd1bWVudCBuZWVkcyB0byBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlLCB3cmFwIGl0IGluc2lkZSBgQnlSZWYoKWAuIEZvciBleGFtcGxlLAorYGBgCisgIEludm9rZUFyZ3VtZW50PDI+KDUsIHN0cmluZygiSGkiKSwgQnlSZWYoZm9vKSkKK2BgYAorY2FsbHMgdGhlIG1vY2sgZnVuY3Rpb24ncyAjMiBhcmd1bWVudCwgcGFzc2luZyB0byBpdCBgNWAgYW5kIGBzdHJpbmcoIkhpIilgIGJ5IHZhbHVlLCBhbmQgYGZvb2AgYnkgcmVmZXJlbmNlLgorCisjIyBEZWZhdWx0IEFjdGlvbiAjIworCit8YERvRGVmYXVsdCgpYHxEbyB0aGUgZGVmYXVsdCBhY3Rpb24gKHNwZWNpZmllZCBieSBgT05fQ0FMTCgpYCBvciB0aGUgYnVpbHQtaW4gb25lKS58Cit8Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKKyoqTm90ZToqKiBkdWUgdG8gdGVjaG5pY2FsIHJlYXNvbnMsIGBEb0RlZmF1bHQoKWAgY2Fubm90IGJlIHVzZWQgaW5zaWRlICBhIGNvbXBvc2l0ZSBhY3Rpb24gLSB0cnlpbmcgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gYSBydW4tdGltZSBlcnJvci4KKworIyMgQ29tcG9zaXRlIEFjdGlvbnMgIyMKKworfGBEb0FsbChhMSwgYTIsIC4uLiwgYW4pYHxEbyBhbGwgYWN0aW9ucyBgYTFgIHRvIGBhbmAgYW5kIHJldHVybiB0aGUgcmVzdWx0IG9mIGBhbmAgaW4gZWFjaCBpbnZvY2F0aW9uLiBUaGUgZmlyc3QgYG4gLSAxYCBzdWItYWN0aW9ucyBtdXN0IHJldHVybiB2b2lkLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgSWdub3JlUmVzdWx0KGEpYCAgICAgICB8UGVyZm9ybSBhY3Rpb24gYGFgIGFuZCBpZ25vcmUgaXRzIHJlc3VsdC4gYGFgIG11c3Qgbm90IHJldHVybiB2b2lkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfGBXaXRoQXJnPE4+KGEpYCAgICAgICAgIHxQYXNzIHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRvIGFjdGlvbiBgYWAgYW5kIHBlcmZvcm0gaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8YFdpdGhBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYSlgfFBhc3MgdGhlIHNlbGVjdGVkICgwLWJhc2VkKSBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYWN0aW9uIGBhYCBhbmQgcGVyZm9ybSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgV2l0aG91dEFyZ3MoYSlgICAgICAgICB8UGVyZm9ybSBhY3Rpb24gYGFgIHdpdGhvdXQgYW55IGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisjIyBEZWZpbmluZyBBY3Rpb25zICMjCisKK3wgYEFDVElPTihTdW0pIHsgcmV0dXJuIGFyZzAgKyBhcmcxOyB9YCB8IERlZmluZXMgYW4gYWN0aW9uIGBTdW0oKWAgdG8gcmV0dXJuIHRoZSBzdW0gb2YgdGhlIG1vY2sgZnVuY3Rpb24ncyBhcmd1bWVudCAjMCBhbmQgIzEuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYEFDVElPTl9QKFBsdXMsIG4pIHsgcmV0dXJuIGFyZzAgKyBuOyB9YCB8IERlZmluZXMgYW4gYWN0aW9uIGBQbHVzKG4pYCB0byByZXR1cm4gdGhlIHN1bSBvZiB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50ICMwIGFuZCBgbmAuIHwKK3wgYEFDVElPTl9QayhGb28sIHAxLCAuLi4sIHBrKSB7IHN0YXRlbWVudHM7IH1gIHwgRGVmaW5lcyBhIHBhcmFtZXRlcml6ZWQgYWN0aW9uIGBGb28ocDEsIC4uLiwgcGspYCB0byBleGVjdXRlIHRoZSBnaXZlbiBgc3RhdGVtZW50c2AuICAgfAorCitUaGUgYEFDVElPTipgIG1hY3JvcyBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgYSBmdW5jdGlvbiBvciBjbGFzcy4KKworIyBDYXJkaW5hbGl0aWVzICMKKworVGhlc2UgYXJlIHVzZWQgaW4gYFRpbWVzKClgIHRvIHNwZWNpZnkgaG93IG1hbnkgdGltZXMgYSBtb2NrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkOgorCit8YEFueU51bWJlcigpYHxUaGUgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLnwKK3w6LS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBdExlYXN0KG4pYCB8VGhlIGNhbGwgaXMgZXhwZWN0ZWQgYXQgbGVhc3QgYG5gIHRpbWVzLiAgICAgICB8Cit8YEF0TW9zdChuKWAgIHxUaGUgY2FsbCBpcyBleHBlY3RlZCBhdCBtb3N0IGBuYCB0aW1lcy4gICAgICAgIHwKK3xgQmV0d2VlbihtLCBuKWB8VGhlIGNhbGwgaXMgZXhwZWN0ZWQgYmV0d2VlbiBgbWAgYW5kIGBuYCAoaW5jbHVzaXZlKSB0aW1lcy58Cit8YEV4YWN0bHkobikgb3IgbmB8VGhlIGNhbGwgaXMgZXhwZWN0ZWQgZXhhY3RseSBgbmAgdGltZXMuIEluIHBhcnRpY3VsYXIsIHRoZSBjYWxsIHNob3VsZCBuZXZlciBoYXBwZW4gd2hlbiBgbmAgaXMgMC58CisKKyMgRXhwZWN0YXRpb24gT3JkZXIgIworCitCeSBkZWZhdWx0LCB0aGUgZXhwZWN0YXRpb25zIGNhbiBiZSBtYXRjaGVkIGluIF9hbnlfIG9yZGVyLiAgSWYgc29tZQorb3IgYWxsIGV4cGVjdGF0aW9ucyBtdXN0IGJlIG1hdGNoZWQgaW4gYSBnaXZlbiBvcmRlciwgdGhlcmUgYXJlIHR3bword2F5cyB0byBzcGVjaWZ5IGl0LiAgVGhleSBjYW4gYmUgdXNlZCBlaXRoZXIgaW5kZXBlbmRlbnRseSBvcgordG9nZXRoZXIuCisKKyMjIFRoZSBBZnRlciBDbGF1c2UgIyMKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkV4cGVjdGF0aW9uOworLi4uCitFeHBlY3RhdGlvbiBpbml0X3ggPSBFWFBFQ1RfQ0FMTChmb28sIEluaXRYKCkpOworRXhwZWN0YXRpb24gaW5pdF95ID0gRVhQRUNUX0NBTEwoZm9vLCBJbml0WSgpKTsKK0VYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgLkFmdGVyKGluaXRfeCwgaW5pdF95KTsKK2BgYAorc2F5cyB0aGF0IGBCYXIoKWAgY2FuIGJlIGNhbGxlZCBvbmx5IGFmdGVyIGJvdGggYEluaXRYKClgIGFuZAorYEluaXRZKClgIGhhdmUgYmVlbiBjYWxsZWQuCisKK0lmIHlvdSBkb24ndCBrbm93IGhvdyBtYW55IHByZS1yZXF1aXNpdGVzIGFuIGV4cGVjdGF0aW9uIGhhcyB3aGVuIHlvdQord3JpdGUgaXQsIHlvdSBjYW4gdXNlIGFuIGBFeHBlY3RhdGlvblNldGAgdG8gY29sbGVjdCB0aGVtOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RXhwZWN0YXRpb25TZXQ7CisuLi4KK0V4cGVjdGF0aW9uU2V0IGFsbF9pbml0czsKK2ZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudF9jb3VudDsgaSsrKSB7CisgIGFsbF9pbml0cyArPSBFWFBFQ1RfQ0FMTChmb28sIEluaXRFbGVtZW50KGkpKTsKK30KK0VYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgLkFmdGVyKGFsbF9pbml0cyk7CitgYGAKK3NheXMgdGhhdCBgQmFyKClgIGNhbiBiZSBjYWxsZWQgb25seSBhZnRlciBhbGwgZWxlbWVudHMgaGF2ZSBiZWVuCitpbml0aWFsaXplZCAoYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgd2hpY2ggZWxlbWVudHMgZ2V0IGluaXRpYWxpemVkCitiZWZvcmUgdGhlIG90aGVycykuCisKK01vZGlmeWluZyBhbiBgRXhwZWN0YXRpb25TZXRgIGFmdGVyIHVzaW5nIGl0IGluIGFuIGAuQWZ0ZXIoKWAgZG9lc24ndAorYWZmZWN0IHRoZSBtZWFuaW5nIG9mIHRoZSBgLkFmdGVyKClgLgorCisjIyBTZXF1ZW5jZXMgIyMKKworV2hlbiB5b3UgaGF2ZSBhIGxvbmcgY2hhaW4gb2Ygc2VxdWVudGlhbCBleHBlY3RhdGlvbnMsIGl0J3MgZWFzaWVyIHRvCitzcGVjaWZ5IHRoZSBvcmRlciB1c2luZyAqKnNlcXVlbmNlcyoqLCB3aGljaCBkb24ndCByZXF1aXJlIHlvdSB0byBnaXZlbgorZWFjaCBleHBlY3RhdGlvbiBpbiB0aGUgY2hhaW4gYSBkaWZmZXJlbnQgbmFtZS4gIDxpPkFsbCBleHBlY3RlZDxicj4KK2NhbGxzPC9pPiBpbiB0aGUgc2FtZSBzZXF1ZW5jZSBtdXN0IG9jY3VyIGluIHRoZSBvcmRlciB0aGV5IGFyZQorc3BlY2lmaWVkLgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6U2VxdWVuY2U7CitTZXF1ZW5jZSBzMSwgczI7CisuLi4KK0VYUEVDVF9DQUxMKGZvbywgUmVzZXQoKSkKKyAgICAuSW5TZXF1ZW5jZShzMSwgczIpCisgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7CitFWFBFQ1RfQ0FMTChmb28sIEdldFNpemUoKSkKKyAgICAuSW5TZXF1ZW5jZShzMSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKK0VYUEVDVF9DQUxMKGZvbywgRGVzY3JpYmUoQTxjb25zdCBjaGFyKj4oKSkpCisgICAgLkluU2VxdWVuY2UoczIpCisgICAgLldpbGxPbmNlKFJldHVybigiZHVtbXkiKSk7CitgYGAKK3NheXMgdGhhdCBgUmVzZXQoKWAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIF9ib3RoXyBgR2V0U2l6ZSgpYCBfYW5kXworYERlc2NyaWJlKClgLCBhbmQgdGhlIGxhdHRlciB0d28gY2FuIG9jY3VyIGluIGFueSBvcmRlci4KKworVG8gcHV0IG1hbnkgZXhwZWN0YXRpb25zIGluIGEgc2VxdWVuY2UgY29udmVuaWVudGx5OgorYGBgCit1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Cit7CisgIEluU2VxdWVuY2UgZHVtbXk7CisKKyAgRVhQRUNUX0NBTEwoLi4uKS4uLjsKKyAgRVhQRUNUX0NBTEwoLi4uKS4uLjsKKyAgLi4uCisgIEVYUEVDVF9DQUxMKC4uLikuLi47Cit9CitgYGAKK3NheXMgdGhhdCBhbGwgZXhwZWN0ZWQgY2FsbHMgaW4gdGhlIHNjb3BlIG9mIGBkdW1teWAgbXVzdCBvY2N1ciBpbgorc3RyaWN0IG9yZGVyLiBUaGUgbmFtZSBgZHVtbXlgIGlzIGlycmVsZXZhbnQuKQorCisjIFZlcmlmeWluZyBhbmQgUmVzZXR0aW5nIGEgTW9jayAjCisKK0dvb2dsZSBNb2NrIHdpbGwgdmVyaWZ5IHRoZSBleHBlY3RhdGlvbnMgb24gYSBtb2NrIG9iamVjdCB3aGVuIGl0IGlzIGRlc3RydWN0ZWQsIG9yIHlvdSBjYW4gZG8gaXQgZWFybGllcjoKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNb2NrOworLi4uCisvLyBWZXJpZmllcyBhbmQgcmVtb3ZlcyB0aGUgZXhwZWN0YXRpb25zIG9uIG1vY2tfb2JqOworLy8gcmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfb2JqKTsKKy4uLgorLy8gVmVyaWZpZXMgYW5kIHJlbW92ZXMgdGhlIGV4cGVjdGF0aW9ucyBvbiBtb2NrX29iajsKKy8vIGFsc28gcmVtb3ZlcyB0aGUgZGVmYXVsdCBhY3Rpb25zIHNldCBieSBPTl9DQUxMKCk7CisvLyByZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCitNb2NrOjpWZXJpZnlBbmRDbGVhcigmbW9ja19vYmopOworYGBgCisKK1lvdSBjYW4gYWxzbyB0ZWxsIEdvb2dsZSBNb2NrIHRoYXQgYSBtb2NrIG9iamVjdCBjYW4gYmUgbGVha2VkIGFuZCBkb2Vzbid0CituZWVkIHRvIGJlIHZlcmlmaWVkOgorYGBgCitNb2NrOjpBbGxvd0xlYWsoJm1vY2tfb2JqKTsKK2BgYAorCisjIE1vY2sgQ2xhc3NlcyAjCisKK0dvb2dsZSBNb2NrIGRlZmluZXMgYSBjb252ZW5pZW50IG1vY2sgY2xhc3MgdGVtcGxhdGUKK2BgYAorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTEsIC4uLiwgQW4pPiB7CisgcHVibGljOgorICBNT0NLX01FVEhPRG4oQ2FsbCwgUihBMSwgLi4uLCBBbikpOworfTsKK2BgYAorU2VlIHRoaXMgW3JlY2lwZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0Nvb2tCb29rI1VzaW5nX0NoZWNrX1BvaW50cykgZm9yIG9uZSBhcHBsaWNhdGlvbiBvZiBpdC4KKworIyBGbGFncyAjCisKK3wgYC0tZ21vY2tfY2F0Y2hfbGVha2VkX21vY2tzPTBgIHwgRG9uJ3QgcmVwb3J0IGxlYWtlZCBtb2NrIG9iamVjdHMgYXMgZmFpbHVyZXMuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYC0tZ21vY2tfdmVyYm9zZT1MRVZFTGAgICAgICAgIHwgU2V0cyB0aGUgZGVmYXVsdCB2ZXJib3NpdHkgbGV2ZWwgKGBpbmZvYCwgYHdhcm5pbmdgLCBvciBgZXJyb3JgKSBvZiBHb29nbGUgTW9jayBtZXNzYWdlcy4gfApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzYvQ29va0Jvb2subWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV82L0Nvb2tCb29rLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTc1YTAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV82L0Nvb2tCb29rLm1kCkBAIC0wLDAgKzEsMzM0MiBAQAorCisKK1lvdSBjYW4gZmluZCByZWNpcGVzIGZvciB1c2luZyBHb29nbGUgTW9jayBoZXJlLiBJZiB5b3UgaGF2ZW4ndCB5ZXQsCitwbGVhc2UgcmVhZCB0aGUgW0ZvckR1bW1pZXNdKFYxXzZfRm9yRHVtbWllcy5tZCkgZG9jdW1lbnQgZmlyc3QgdG8gbWFrZSBzdXJlIHlvdSB1bmRlcnN0YW5kCit0aGUgYmFzaWNzLgorCisqKk5vdGU6KiogR29vZ2xlIE1vY2sgbGl2ZXMgaW4gdGhlIGB0ZXN0aW5nYCBuYW1lIHNwYWNlLiBGb3IKK3JlYWRhYmlsaXR5LCBpdCBpcyByZWNvbW1lbmRlZCB0byB3cml0ZSBgdXNpbmcgOjp0ZXN0aW5nOjpGb287YCBvbmNlIGluCit5b3VyIGZpbGUgYmVmb3JlIHVzaW5nIHRoZSBuYW1lIGBGb29gIGRlZmluZWQgYnkgR29vZ2xlIE1vY2suIFdlIG9taXQKK3N1Y2ggYHVzaW5nYCBzdGF0ZW1lbnRzIGluIHRoaXMgcGFnZSBmb3IgYnJldml0eSwgYnV0IHlvdSBzaG91bGQgZG8gaXQKK2luIHlvdXIgb3duIGNvZGUuCisKKyMgQ3JlYXRpbmcgTW9jayBDbGFzc2VzICMKKworIyMgTW9ja2luZyBQcml2YXRlIG9yIFByb3RlY3RlZCBNZXRob2RzICMjCisKK1lvdSBtdXN0IGFsd2F5cyBwdXQgYSBtb2NrIG1ldGhvZCBkZWZpbml0aW9uIChgTU9DS19NRVRIT0QqYCkgaW4gYQorYHB1YmxpYzpgIHNlY3Rpb24gb2YgdGhlIG1vY2sgY2xhc3MsIHJlZ2FyZGxlc3Mgb2YgdGhlIG1ldGhvZCBiZWluZworbW9ja2VkIGJlaW5nIGBwdWJsaWNgLCBgcHJvdGVjdGVkYCwgb3IgYHByaXZhdGVgIGluIHRoZSBiYXNlIGNsYXNzLgorVGhpcyBhbGxvd3MgYE9OX0NBTExgIGFuZCBgRVhQRUNUX0NBTExgIHRvIHJlZmVyZW5jZSB0aGUgbW9jayBmdW5jdGlvbgorZnJvbSBvdXRzaWRlIG9mIHRoZSBtb2NrIGNsYXNzLiAgKFllcywgQysrIGFsbG93cyBhIHN1YmNsYXNzIHRvIGNoYW5nZQordGhlIGFjY2VzcyBsZXZlbCBvZiBhIHZpcnR1YWwgZnVuY3Rpb24gaW4gdGhlIGJhc2UgY2xhc3MuKSAgRXhhbXBsZToKKworYGBgCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBUcmFuc2Zvcm0oR2FkZ2V0KiBnKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBSZXN1bWUoKTsKKworIHByaXZhdGU6CisgIHZpcnR1YWwgaW50IEdldFRpbWVPdXQoKTsKK307CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC4uLgorICBNT0NLX01FVEhPRDEoVHJhbnNmb3JtLCBib29sKEdhZGdldCogZykpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBpbiB0aGUgcHVibGljIHNlY3Rpb24sIGV2ZW4gdGhvdWdoIHRoZQorICAvLyBtZXRob2RzIGFyZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZSBpbiB0aGUgYmFzZSBjbGFzcy4KKyAgTU9DS19NRVRIT0QwKFJlc3VtZSwgdm9pZCgpKTsKKyAgTU9DS19NRVRIT0QwKEdldFRpbWVPdXQsIGludCgpKTsKK307CitgYGAKKworIyMgTW9ja2luZyBPdmVybG9hZGVkIE1ldGhvZHMgIyMKKworWW91IGNhbiBtb2NrIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFzIHVzdWFsLiBObyBzcGVjaWFsIGF0dGVudGlvbiBpcyByZXF1aXJlZDoKKworYGBgCitjbGFzcyBGb28geworICAuLi4KKworICAvLyBNdXN0IGJlIHZpcnR1YWwgYXMgd2UnbGwgaW5oZXJpdCBmcm9tIEZvby4KKyAgdmlydHVhbCB+Rm9vKCk7CisKKyAgLy8gT3ZlcmxvYWRlZCBvbiB0aGUgdHlwZXMgYW5kL29yIG51bWJlcnMgb2YgYXJndW1lbnRzLgorICB2aXJ0dWFsIGludCBBZGQoRWxlbWVudCB4KTsKKyAgdmlydHVhbCBpbnQgQWRkKGludCB0aW1lcywgRWxlbWVudCB4KTsKKworICAvLyBPdmVybG9hZGVkIG9uIHRoZSBjb25zdC1uZXNzIG9mIHRoaXMgb2JqZWN0LgorICB2aXJ0dWFsIEJhciYgR2V0QmFyKCk7CisgIHZpcnR1YWwgY29uc3QgQmFyJiBHZXRCYXIoKSBjb25zdDsKK307CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgLi4uCisgIE1PQ0tfTUVUSE9EMShBZGQsIGludChFbGVtZW50IHgpKTsKKyAgTU9DS19NRVRIT0QyKEFkZCwgaW50KGludCB0aW1lcywgRWxlbWVudCB4KTsKKworICBNT0NLX01FVEhPRDAoR2V0QmFyLCBCYXImKCkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0QmFyLCBjb25zdCBCYXImKCkpOworfTsKK2BgYAorCisqKk5vdGU6KiogaWYgeW91IGRvbid0IG1vY2sgYWxsIHZlcnNpb25zIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZCwgdGhlCitjb21waWxlciB3aWxsIGdpdmUgeW91IGEgd2FybmluZyBhYm91dCBzb21lIG1ldGhvZHMgaW4gdGhlIGJhc2UgY2xhc3MKK2JlaW5nIGhpZGRlbi4gVG8gZml4IHRoYXQsIHVzZSBgdXNpbmdgIHRvIGJyaW5nIHRoZW0gaW4gc2NvcGU6CisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgdXNpbmcgRm9vOjpBZGQ7CisgIE1PQ0tfTUVUSE9EMShBZGQsIGludChFbGVtZW50IHgpKTsKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBtb2NrIGludCBBZGQoaW50IHRpbWVzLCBFbGVtZW50IHgpOworICAuLi4KK307CitgYGAKKworIyMgTW9ja2luZyBDbGFzcyBUZW1wbGF0ZXMgIyMKKworVG8gbW9jayBhIGNsYXNzIHRlbXBsYXRlLCBhcHBlbmQgYF9UYCB0byB0aGUgYE1PQ0tfKmAgbWFjcm9zOgorCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtPgorY2xhc3MgU3RhY2tJbnRlcmZhY2UgeworICAuLi4KKyAgLy8gTXVzdCBiZSB2aXJ0dWFsIGFzIHdlJ2xsIGluaGVyaXQgZnJvbSBTdGFja0ludGVyZmFjZS4KKyAgdmlydHVhbCB+U3RhY2tJbnRlcmZhY2UoKTsKKworICB2aXJ0dWFsIGludCBHZXRTaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgUHVzaChjb25zdCBFbGVtJiB4KSA9IDA7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbT4KK2NsYXNzIE1vY2tTdGFjayA6IHB1YmxpYyBTdGFja0ludGVyZmFjZTxFbGVtPiB7CisgIC4uLgorICBNT0NLX0NPTlNUX01FVEhPRDBfVChHZXRTaXplLCBpbnQoKSk7CisgIE1PQ0tfTUVUSE9EMV9UKFB1c2gsIHZvaWQoY29uc3QgRWxlbSYgeCkpOworfTsKK2BgYAorCisjIyBNb2NraW5nIE5vbnZpcnR1YWwgTWV0aG9kcyAjIworCitHb29nbGUgTW9jayBjYW4gbW9jayBub24tdmlydHVhbCBmdW5jdGlvbnMgdG8gYmUgdXNlZCBpbiB3aGF0IHdlIGNhbGwgX2hpLXBlcmYKK2RlcGVuZGVuY3kgaW5qZWN0aW9uXy4KKworSW4gdGhpcyBjYXNlLCBpbnN0ZWFkIG9mIHNoYXJpbmcgYSBjb21tb24gYmFzZSBjbGFzcyB3aXRoIHRoZSByZWFsCitjbGFzcywgeW91ciBtb2NrIGNsYXNzIHdpbGwgYmUgX3VucmVsYXRlZF8gdG8gdGhlIHJlYWwgY2xhc3MsIGJ1dAorY29udGFpbiBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlcy4gIFRoZSBzeW50YXggZm9yIG1vY2tpbmcKK25vbi12aXJ0dWFsIG1ldGhvZHMgaXMgdGhlIF9zYW1lXyBhcyBtb2NraW5nIHZpcnR1YWwgbWV0aG9kczoKKworYGBgCisvLyBBIHNpbXBsZSBwYWNrZXQgc3RyZWFtIGNsYXNzLiAgTm9uZSBvZiBpdHMgbWVtYmVycyBpcyB2aXJ0dWFsLgorY2xhc3MgQ29uY3JldGVQYWNrZXRTdHJlYW0geworIHB1YmxpYzoKKyAgdm9pZCBBcHBlbmRQYWNrZXQoUGFja2V0KiBuZXdfcGFja2V0KTsKKyAgY29uc3QgUGFja2V0KiBHZXRQYWNrZXQoc2l6ZV90IHBhY2tldF9udW1iZXIpIGNvbnN0OworICBzaXplX3QgTnVtYmVyT2ZQYWNrZXRzKCkgY29uc3Q7CisgIC4uLgorfTsKKworLy8gQSBtb2NrIHBhY2tldCBzdHJlYW0gY2xhc3MuICBJdCBpbmhlcml0cyBmcm9tIG5vIG90aGVyLCBidXQgZGVmaW5lcworLy8gR2V0UGFja2V0KCkgYW5kIE51bWJlck9mUGFja2V0cygpLgorY2xhc3MgTW9ja1BhY2tldFN0cmVhbSB7CisgcHVibGljOgorICBNT0NLX0NPTlNUX01FVEhPRDEoR2V0UGFja2V0LCBjb25zdCBQYWNrZXQqKHNpemVfdCBwYWNrZXRfbnVtYmVyKSk7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMChOdW1iZXJPZlBhY2tldHMsIHNpemVfdCgpKTsKKyAgLi4uCit9OworYGBgCisKK05vdGUgdGhhdCB0aGUgbW9jayBjbGFzcyBkb2Vzbid0IGRlZmluZSBgQXBwZW5kUGFja2V0KClgLCB1bmxpa2UgdGhlCityZWFsIGNsYXNzLiBUaGF0J3MgZmluZSBhcyBsb25nIGFzIHRoZSB0ZXN0IGRvZXNuJ3QgbmVlZCB0byBjYWxsIGl0LgorCitOZXh0LCB5b3UgbmVlZCBhIHdheSB0byBzYXkgdGhhdCB5b3Ugd2FudCB0byB1c2UKK2BDb25jcmV0ZVBhY2tldFN0cmVhbWAgaW4gcHJvZHVjdGlvbiBjb2RlLCBhbmQgdXNlIGBNb2NrUGFja2V0U3RyZWFtYAoraW4gdGVzdHMuICBTaW5jZSB0aGUgZnVuY3Rpb25zIGFyZSBub3QgdmlydHVhbCBhbmQgdGhlIHR3byBjbGFzc2VzIGFyZQordW5yZWxhdGVkLCB5b3UgbXVzdCBzcGVjaWZ5IHlvdXIgY2hvaWNlIGF0IF9jb21waWxlIHRpbWVfIChhcyBvcHBvc2VkCit0byBydW4gdGltZSkuCisKK09uZSB3YXkgdG8gZG8gaXQgaXMgdG8gdGVtcGxhdGl6ZSB5b3VyIGNvZGUgdGhhdCBuZWVkcyB0byB1c2UgYSBwYWNrZXQKK3N0cmVhbS4gIE1vcmUgc3BlY2lmaWNhbGx5LCB5b3Ugd2lsbCBnaXZlIHlvdXIgY29kZSBhIHRlbXBsYXRlIHR5cGUKK2FyZ3VtZW50IGZvciB0aGUgdHlwZSBvZiB0aGUgcGFja2V0IHN0cmVhbS4gIEluIHByb2R1Y3Rpb24sIHlvdSB3aWxsCitpbnN0YW50aWF0ZSB5b3VyIHRlbXBsYXRlIHdpdGggYENvbmNyZXRlUGFja2V0U3RyZWFtYCBhcyB0aGUgdHlwZQorYXJndW1lbnQuICBJbiB0ZXN0cywgeW91IHdpbGwgaW5zdGFudGlhdGUgdGhlIHNhbWUgdGVtcGxhdGUgd2l0aAorYE1vY2tQYWNrZXRTdHJlYW1gLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkgd3JpdGU6CisKK2BgYAordGVtcGxhdGUgPGNsYXNzIFBhY2tldFN0cmVhbT4KK3ZvaWQgQ3JlYXRlQ29ubmVjdGlvbihQYWNrZXRTdHJlYW0qIHN0cmVhbSkgeyAuLi4gfQorCit0ZW1wbGF0ZSA8Y2xhc3MgUGFja2V0U3RyZWFtPgorY2xhc3MgUGFja2V0UmVhZGVyIHsKKyBwdWJsaWM6CisgIHZvaWQgUmVhZFBhY2tldHMoUGFja2V0U3RyZWFtKiBzdHJlYW0sIHNpemVfdCBwYWNrZXRfbnVtKTsKK307CitgYGAKKworVGhlbiB5b3UgY2FuIHVzZSBgQ3JlYXRlQ29ubmVjdGlvbjxDb25jcmV0ZVBhY2tldFN0cmVhbT4oKWAgYW5kCitgUGFja2V0UmVhZGVyPENvbmNyZXRlUGFja2V0U3RyZWFtPmAgaW4gcHJvZHVjdGlvbiBjb2RlLCBhbmQgdXNlCitgQ3JlYXRlQ29ubmVjdGlvbjxNb2NrUGFja2V0U3RyZWFtPigpYCBhbmQKK2BQYWNrZXRSZWFkZXI8TW9ja1BhY2tldFN0cmVhbT5gIGluIHRlc3RzLgorCitgYGAKKyAgTW9ja1BhY2tldFN0cmVhbSBtb2NrX3N0cmVhbTsKKyAgRVhQRUNUX0NBTEwobW9ja19zdHJlYW0sIC4uLikuLi47CisgIC4uIHNldCBtb3JlIGV4cGVjdGF0aW9ucyBvbiBtb2NrX3N0cmVhbSAuLi4KKyAgUGFja2V0UmVhZGVyPE1vY2tQYWNrZXRTdHJlYW0+IHJlYWRlcigmbW9ja19zdHJlYW0pOworICAuLi4gZXhlcmNpc2UgcmVhZGVyIC4uLgorYGBgCisKKyMjIE1vY2tpbmcgRnJlZSBGdW5jdGlvbnMgIyMKKworSXQncyBwb3NzaWJsZSB0byB1c2UgR29vZ2xlIE1vY2sgdG8gbW9jayBhIGZyZWUgZnVuY3Rpb24gKGkuZS4gYQorQy1zdHlsZSBmdW5jdGlvbiBvciBhIHN0YXRpYyBtZXRob2QpLiAgWW91IGp1c3QgbmVlZCB0byByZXdyaXRlIHlvdXIKK2NvZGUgdG8gdXNlIGFuIGludGVyZmFjZSAoYWJzdHJhY3QgY2xhc3MpLgorCitJbnN0ZWFkIG9mIGNhbGxpbmcgYSBmcmVlIGZ1bmN0aW9uIChzYXksIGBPcGVuRmlsZWApIGRpcmVjdGx5LAoraW50cm9kdWNlIGFuIGludGVyZmFjZSBmb3IgaXQgYW5kIGhhdmUgYSBjb25jcmV0ZSBzdWJjbGFzcyB0aGF0IGNhbGxzCit0aGUgZnJlZSBmdW5jdGlvbjoKKworYGBgCitjbGFzcyBGaWxlSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgT3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlKSA9IDA7Cit9OworCitjbGFzcyBGaWxlIDogcHVibGljIEZpbGVJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBPcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsKKyAgICByZXR1cm4gT3BlbkZpbGUocGF0aCwgbW9kZSk7CisgIH0KK307CitgYGAKKworWW91ciBjb2RlIHNob3VsZCB0YWxrIHRvIGBGaWxlSW50ZXJmYWNlYCB0byBvcGVuIGEgZmlsZS4gIE5vdyBpdCdzCitlYXN5IHRvIG1vY2sgb3V0IHRoZSBmdW5jdGlvbi4KKworVGhpcyBtYXkgc2VlbSBtdWNoIGhhc3NsZSwgYnV0IGluIHByYWN0aWNlIHlvdSBvZnRlbiBoYXZlIG11bHRpcGxlCityZWxhdGVkIGZ1bmN0aW9ucyB0aGF0IHlvdSBjYW4gcHV0IGluIHRoZSBzYW1lIGludGVyZmFjZSwgc28gdGhlCitwZXItZnVuY3Rpb24gc3ludGFjdGljIG92ZXJoZWFkIHdpbGwgYmUgbXVjaCBsb3dlci4KKworSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgdGhlIHBlcmZvcm1hbmNlIG92ZXJoZWFkIGluY3VycmVkIGJ5Cit2aXJ0dWFsIGZ1bmN0aW9ucywgYW5kIHByb2ZpbGluZyBjb25maXJtcyB5b3VyIGNvbmNlcm4sIHlvdSBjYW4KK2NvbWJpbmUgdGhpcyB3aXRoIHRoZSByZWNpcGUgZm9yIFttb2NraW5nIG5vbi12aXJ0dWFsIG1ldGhvZHNdKCNNb2NraW5nX05vbnZpcnR1YWxfTWV0aG9kcy5tZCkuCisKKyMjIE5pY2UgTW9ja3MgYW5kIFN0cmljdCBNb2NrcyAjIworCitJZiBhIG1vY2sgbWV0aG9kIGhhcyBubyBgRVhQRUNUX0NBTExgIHNwZWMgYnV0IGlzIGNhbGxlZCwgR29vZ2xlIE1vY2sKK3dpbGwgcHJpbnQgYSB3YXJuaW5nIGFib3V0IHRoZSAidW5pbnRlcmVzdGluZyBjYWxsIi4gVGhlIHJhdGlvbmFsZSBpczoKKworICAqIE5ldyBtZXRob2RzIG1heSBiZSBhZGRlZCB0byBhbiBpbnRlcmZhY2UgYWZ0ZXIgYSB0ZXN0IGlzIHdyaXR0ZW4uIFdlIHNob3VsZG4ndCBmYWlsIGEgdGVzdCBqdXN0IGJlY2F1c2UgYSBtZXRob2QgaXQgZG9lc24ndCBrbm93IGFib3V0IGlzIGNhbGxlZC4KKyAgKiBIb3dldmVyLCB0aGlzIG1heSBhbHNvIG1lYW4gdGhlcmUncyBhIGJ1ZyBpbiB0aGUgdGVzdCwgc28gR29vZ2xlIE1vY2sgc2hvdWxkbid0IGJlIHNpbGVudCBlaXRoZXIuIElmIHRoZSB1c2VyIGJlbGlldmVzIHRoZXNlIGNhbGxzIGFyZSBoYXJtbGVzcywgaGUgY2FuIGFkZCBhbiBgRVhQRUNUX0NBTEwoKWAgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcuCisKK0hvd2V2ZXIsIHNvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdG8gc3VwcHJlc3MgYWxsICJ1bmludGVyZXN0aW5nIGNhbGwiCit3YXJuaW5ncywgd2hpbGUgc29tZXRpbWVzIHlvdSBtYXkgd2FudCB0aGUgb3Bwb3NpdGUsIGkuZS4gdG8gdHJlYXQgYWxsCitvZiB0aGVtIGFzIGVycm9ycy4gR29vZ2xlIE1vY2sgbGV0cyB5b3UgbWFrZSB0aGUgZGVjaXNpb24gb24gYQorcGVyLW1vY2stb2JqZWN0IGJhc2lzLgorCitTdXBwb3NlIHlvdXIgdGVzdCB1c2VzIGEgbW9jayBjbGFzcyBgTW9ja0Zvb2A6CisKK2BgYAorVEVTVCguLi4pIHsKKyAgTW9ja0ZvbyBtb2NrX2ZvbzsKKyAgRVhQRUNUX0NBTEwobW9ja19mb28sIERvVGhpcygpKTsKKyAgLi4uIGNvZGUgdGhhdCB1c2VzIG1vY2tfZm9vIC4uLgorfQorYGBgCisKK0lmIGEgbWV0aG9kIG9mIGBtb2NrX2Zvb2Agb3RoZXIgdGhhbiBgRG9UaGlzKClgIGlzIGNhbGxlZCwgaXQgd2lsbCBiZQorcmVwb3J0ZWQgYnkgR29vZ2xlIE1vY2sgYXMgYSB3YXJuaW5nLiBIb3dldmVyLCBpZiB5b3UgcmV3cml0ZSB5b3VyCit0ZXN0IHRvIHVzZSBgTmljZU1vY2s8TW9ja0Zvbz5gIGluc3RlYWQsIHRoZSB3YXJuaW5nIHdpbGwgYmUgZ29uZSwKK3Jlc3VsdGluZyBpbiBhIGNsZWFuZXIgdGVzdCBvdXRwdXQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKKworVEVTVCguLi4pIHsKKyAgTmljZU1vY2s8TW9ja0Zvbz4gbW9ja19mb287CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBEb1RoaXMoKSk7CisgIC4uLiBjb2RlIHRoYXQgdXNlcyBtb2NrX2ZvbyAuLi4KK30KK2BgYAorCitgTmljZU1vY2s8TW9ja0Zvbz5gIGlzIGEgc3ViY2xhc3Mgb2YgYE1vY2tGb29gLCBzbyBpdCBjYW4gYmUgdXNlZAord2hlcmV2ZXIgYE1vY2tGb29gIGlzIGFjY2VwdGVkLgorCitJdCBhbHNvIHdvcmtzIGlmIGBNb2NrRm9vYCdzIGNvbnN0cnVjdG9yIHRha2VzIHNvbWUgYXJndW1lbnRzLCBhcworYE5pY2VNb2NrPE1vY2tGb28+YCAiaW5oZXJpdHMiIGBNb2NrRm9vYCdzIGNvbnN0cnVjdG9yczoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok5pY2VNb2NrOworCitURVNUKC4uLikgeworICBOaWNlTW9jazxNb2NrRm9vPiBtb2NrX2Zvbyg1LCAiaGkiKTsgIC8vIENhbGxzIE1vY2tGb28oNSwgImhpIikuCisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBEb1RoaXMoKSk7CisgIC4uLiBjb2RlIHRoYXQgdXNlcyBtb2NrX2ZvbyAuLi4KK30KK2BgYAorCitUaGUgdXNhZ2Ugb2YgYFN0cmljdE1vY2tgIGlzIHNpbWlsYXIsIGV4Y2VwdCB0aGF0IGl0IG1ha2VzIGFsbAordW5pbnRlcmVzdGluZyBjYWxscyBmYWlsdXJlczoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7CisKK1RFU1QoLi4uKSB7CisgIFN0cmljdE1vY2s8TW9ja0Zvbz4gbW9ja19mb287CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBEb1RoaXMoKSk7CisgIC4uLiBjb2RlIHRoYXQgdXNlcyBtb2NrX2ZvbyAuLi4KKworICAvLyBUaGUgdGVzdCB3aWxsIGZhaWwgaWYgYSBtZXRob2Qgb2YgbW9ja19mb28gb3RoZXIgdGhhbiBEb1RoaXMoKQorICAvLyBpcyBjYWxsZWQuCit9CitgYGAKKworVGhlcmUgYXJlIHNvbWUgY2F2ZWF0cyB0aG91Z2ggKEkgZG9uJ3QgbGlrZSB0aGVtIGp1c3QgYXMgbXVjaCBhcyB0aGUKK25leHQgZ3V5LCBidXQgc2FkbHkgdGhleSBhcmUgc2lkZSBlZmZlY3RzIG9mIEMrKydzIGxpbWl0YXRpb25zKToKKworICAxLiBgTmljZU1vY2s8TW9ja0Zvbz5gIGFuZCBgU3RyaWN0TW9jazxNb2NrRm9vPmAgb25seSB3b3JrIGZvciBtb2NrIG1ldGhvZHMgZGVmaW5lZCB1c2luZyB0aGUgYE1PQ0tfTUVUSE9EKmAgZmFtaWx5IG9mIG1hY3JvcyAqKmRpcmVjdGx5KiogaW4gdGhlIGBNb2NrRm9vYCBjbGFzcy4gSWYgYSBtb2NrIG1ldGhvZCBpcyBkZWZpbmVkIGluIGEgKipiYXNlIGNsYXNzKiogb2YgYE1vY2tGb29gLCB0aGUgIm5pY2UiIG9yICJzdHJpY3QiIG1vZGlmaWVyIG1heSBub3QgYWZmZWN0IGl0LCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLiBJbiBwYXJ0aWN1bGFyLCBuZXN0aW5nIGBOaWNlTW9ja2AgYW5kIGBTdHJpY3RNb2NrYCAoZS5nLiBgTmljZU1vY2s8U3RyaWN0TW9jazxNb2NrRm9vPiA+YCkgaXMgKipub3QqKiBzdXBwb3J0ZWQuCisgIDEuIFRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIGJhc2UgbW9jayAoYE1vY2tGb29gKSBjYW5ub3QgaGF2ZSBhcmd1bWVudHMgcGFzc2VkIGJ5IG5vbi1jb25zdCByZWZlcmVuY2UsIHdoaWNoIGhhcHBlbnMgdG8gYmUgYmFubmVkIGJ5IHRoZSBbR29vZ2xlIEMrKyBzdHlsZSBndWlkZV0oaHR0cDovL2dvb2dsZS1zdHlsZWd1aWRlLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9jcHBndWlkZS54bWwpLgorICAxLiBEdXJpbmcgdGhlIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3Igb2YgYE1vY2tGb29gLCB0aGUgbW9jayBvYmplY3QgaXMgX25vdF8gbmljZSBvciBzdHJpY3QuICBUaGlzIG1heSBjYXVzZSBzdXJwcmlzZXMgaWYgdGhlIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgY2FsbHMgYSBtb2NrIG1ldGhvZCBvbiBgdGhpc2Agb2JqZWN0LiAoVGhpcyBiZWhhdmlvciwgaG93ZXZlciwgaXMgY29uc2lzdGVudCB3aXRoIEMrKydzIGdlbmVyYWwgcnVsZTogaWYgYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGNhbGxzIGEgdmlydHVhbCBtZXRob2Qgb2YgYHRoaXNgIG9iamVjdCwgdGhhdCBtZXRob2QgaXMgdHJlYXRlZCBhcyBub24tdmlydHVhbC4gIEluIG90aGVyIHdvcmRzLCB0byB0aGUgYmFzZSBjbGFzcydzIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IsIGB0aGlzYCBvYmplY3QgYmVoYXZlcyBsaWtlIGFuIGluc3RhbmNlIG9mIHRoZSBiYXNlIGNsYXNzLCBub3QgdGhlIGRlcml2ZWQgY2xhc3MuICBUaGlzIHJ1bGUgaXMgcmVxdWlyZWQgZm9yIHNhZmV0eS4gIE90aGVyd2lzZSBhIGJhc2UgY29uc3RydWN0b3IgbWF5IHVzZSBtZW1iZXJzIG9mIGEgZGVyaXZlZCBjbGFzcyBiZWZvcmUgdGhleSBhcmUgaW5pdGlhbGl6ZWQsIG9yIGEgYmFzZSBkZXN0cnVjdG9yIG1heSB1c2UgbWVtYmVycyBvZiBhIGRlcml2ZWQgY2xhc3MgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZGVzdHJveWVkLikKKworRmluYWxseSwgeW91IHNob3VsZCBiZSAqKnZlcnkgY2F1dGlvdXMqKiB3aGVuIHVzaW5nIHRoaXMgZmVhdHVyZSwgYXMgdGhlCitkZWNpc2lvbiB5b3UgbWFrZSBhcHBsaWVzIHRvICoqYWxsKiogZnV0dXJlIGNoYW5nZXMgdG8gdGhlIG1vY2sKK2NsYXNzLiBJZiBhbiBpbXBvcnRhbnQgY2hhbmdlIGlzIG1hZGUgaW4gdGhlIGludGVyZmFjZSB5b3UgYXJlIG1vY2tpbmcKKyhhbmQgdGh1cyBpbiB0aGUgbW9jayBjbGFzcyksIGl0IGNvdWxkIGJyZWFrIHlvdXIgdGVzdHMgKGlmIHlvdSB1c2UKK2BTdHJpY3RNb2NrYCkgb3IgbGV0IGJ1Z3MgcGFzcyB0aHJvdWdoIHdpdGhvdXQgYSB3YXJuaW5nIChpZiB5b3UgdXNlCitgTmljZU1vY2tgKS4gVGhlcmVmb3JlLCB0cnkgdG8gc3BlY2lmeSB0aGUgbW9jaydzIGJlaGF2aW9yIHVzaW5nCitleHBsaWNpdCBgRVhQRUNUX0NBTExgIGZpcnN0LCBhbmQgb25seSB0dXJuIHRvIGBOaWNlTW9ja2Agb3IKK2BTdHJpY3RNb2NrYCBhcyB0aGUgbGFzdCByZXNvcnQuCisKKyMjIFNpbXBsaWZ5aW5nIHRoZSBJbnRlcmZhY2Ugd2l0aG91dCBCcmVha2luZyBFeGlzdGluZyBDb2RlICMjCisKK1NvbWV0aW1lcyBhIG1ldGhvZCBoYXMgYSBsb25nIGxpc3Qgb2YgYXJndW1lbnRzIHRoYXQgaXMgbW9zdGx5Cit1bmludGVyZXN0aW5nLiBGb3IgZXhhbXBsZSwKKworYGBgCitjbGFzcyBMb2dTaW5rIHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIHZvaWQgc2VuZChMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZnVsbF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYmFzZV9maWxlbmFtZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0bSogdG1fdGltZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VfbGVuKSA9IDA7Cit9OworYGBgCisKK1RoaXMgbWV0aG9kJ3MgYXJndW1lbnQgbGlzdCBpcyBsZW5ndGh5IGFuZCBoYXJkIHRvIHdvcmsgd2l0aCAobGV0J3MKK3NheSB0aGF0IHRoZSBgbWVzc2FnZWAgYXJndW1lbnQgaXMgbm90IGV2ZW4gMC10ZXJtaW5hdGVkKS4gSWYgd2UgbW9jaworaXQgYXMgaXMsIHVzaW5nIHRoZSBtb2NrIHdpbGwgYmUgYXdrd2FyZC4gSWYsIGhvd2V2ZXIsIHdlIHRyeSB0bworc2ltcGxpZnkgdGhpcyBpbnRlcmZhY2UsIHdlJ2xsIG5lZWQgdG8gZml4IGFsbCBjbGllbnRzIGRlcGVuZGluZyBvbgoraXQsIHdoaWNoIGlzIG9mdGVuIGluZmVhc2libGUuCisKK1RoZSB0cmljayBpcyB0byByZS1kaXNwYXRjaCB0aGUgbWV0aG9kIGluIHRoZSBtb2NrIGNsYXNzOgorCitgYGAKK2NsYXNzIFNjb3BlZE1vY2tMb2cgOiBwdWJsaWMgTG9nU2luayB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCB2b2lkIHNlbmQoTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqIGZ1bGxfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJhc2VfZmlsZW5hbWUsIGludCBsaW5lLCBjb25zdCB0bSogdG1fdGltZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VfbGVuKSB7CisgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgbG9nIHNldmVyaXR5LCBmdWxsIGZpbGUgbmFtZSwgYW5kCisgICAgLy8gbG9nIG1lc3NhZ2UuCisgICAgTG9nKHNldmVyaXR5LCBmdWxsX2ZpbGVuYW1lLCBzdGQ6OnN0cmluZyhtZXNzYWdlLCBtZXNzYWdlX2xlbikpOworICB9CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgbW9jayBtZXRob2Q6CisgIC8vCisgIC8vICAgdm9pZCBMb2coTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgIC8vICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgsCisgIC8vICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKTsKKyAgTU9DS19NRVRIT0QzKExvZywgdm9pZChMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSk7Cit9OworYGBgCisKK0J5IGRlZmluaW5nIGEgbmV3IG1vY2sgbWV0aG9kIHdpdGggYSB0cmltbWVkIGFyZ3VtZW50IGxpc3QsIHdlIG1ha2UKK3RoZSBtb2NrIGNsYXNzIG11Y2ggbW9yZSB1c2VyLWZyaWVuZGx5LgorCisjIyBBbHRlcm5hdGl2ZSB0byBNb2NraW5nIENvbmNyZXRlIENsYXNzZXMgIyMKKworT2Z0ZW4geW91IG1heSBmaW5kIHlvdXJzZWxmIHVzaW5nIGNsYXNzZXMgdGhhdCBkb24ndCBpbXBsZW1lbnQKK2ludGVyZmFjZXMuIEluIG9yZGVyIHRvIHRlc3QgeW91ciBjb2RlIHRoYXQgdXNlcyBzdWNoIGEgY2xhc3MgKGxldCdzCitjYWxsIGl0IGBDb25jcmV0ZWApLCB5b3UgbWF5IGJlIHRlbXB0ZWQgdG8gbWFrZSB0aGUgbWV0aG9kcyBvZgorYENvbmNyZXRlYCB2aXJ0dWFsIGFuZCB0aGVuIG1vY2sgaXQuCisKK1RyeSBub3QgdG8gZG8gdGhhdC4KKworTWFraW5nIGEgbm9uLXZpcnR1YWwgZnVuY3Rpb24gdmlydHVhbCBpcyBhIGJpZyBkZWNpc2lvbi4gSXQgY3JlYXRlcyBhbgorZXh0ZW5zaW9uIHBvaW50IHdoZXJlIHN1YmNsYXNzZXMgY2FuIHR3ZWFrIHlvdXIgY2xhc3MnIGJlaGF2aW9yLiBUaGlzCit3ZWFrZW5zIHlvdXIgY29udHJvbCBvbiB0aGUgY2xhc3MgYmVjYXVzZSBub3cgaXQncyBoYXJkZXIgdG8gbWFpbnRhaW4KK3RoZSBjbGFzcycgaW52YXJpYW50cy4gWW91IHNob3VsZCBtYWtlIGEgZnVuY3Rpb24gdmlydHVhbCBvbmx5IHdoZW4KK3RoZXJlIGlzIGEgdmFsaWQgcmVhc29uIGZvciBhIHN1YmNsYXNzIHRvIG92ZXJyaWRlIGl0LgorCitNb2NraW5nIGNvbmNyZXRlIGNsYXNzZXMgZGlyZWN0bHkgaXMgcHJvYmxlbWF0aWMgYXMgaXQgY3JlYXRlcyBhIHRpZ2h0Citjb3VwbGluZyBiZXR3ZWVuIHRoZSBjbGFzcyBhbmQgdGhlIHRlc3RzIC0gYW55IHNtYWxsIGNoYW5nZSBpbiB0aGUKK2NsYXNzIG1heSBpbnZhbGlkYXRlIHlvdXIgdGVzdHMgYW5kIG1ha2UgdGVzdCBtYWludGVuYW5jZSBhIHBhaW4uCisKK1RvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIG1hbnkgcHJvZ3JhbW1lcnMgaGF2ZSBiZWVuIHByYWN0aWNpbmcgImNvZGluZwordG8gaW50ZXJmYWNlcyI6IGluc3RlYWQgb2YgdGFsa2luZyB0byB0aGUgYENvbmNyZXRlYCBjbGFzcywgeW91ciBjb2RlCit3b3VsZCBkZWZpbmUgYW4gaW50ZXJmYWNlIGFuZCB0YWxrIHRvIGl0LiBUaGVuIHlvdSBpbXBsZW1lbnQgdGhhdAoraW50ZXJmYWNlIGFzIGFuIGFkYXB0b3Igb24gdG9wIG9mIGBDb25jcmV0ZWAuIEluIHRlc3RzLCB5b3UgY2FuIGVhc2lseQorbW9jayB0aGF0IGludGVyZmFjZSB0byBvYnNlcnZlIGhvdyB5b3VyIGNvZGUgaXMgZG9pbmcuCisKK1RoaXMgdGVjaG5pcXVlIGluY3VycyBzb21lIG92ZXJoZWFkOgorCisgICogWW91IHBheSB0aGUgY29zdCBvZiB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzICh1c3VhbGx5IG5vdCBhIHByb2JsZW0pLgorICAqIFRoZXJlIGlzIG1vcmUgYWJzdHJhY3Rpb24gZm9yIHRoZSBwcm9ncmFtbWVycyB0byBsZWFybi4KKworSG93ZXZlciwgaXQgY2FuIGFsc28gYnJpbmcgc2lnbmlmaWNhbnQgYmVuZWZpdHMgaW4gYWRkaXRpb24gdG8gYmV0dGVyCit0ZXN0YWJpbGl0eToKKworICAqIGBDb25jcmV0ZWAncyBBUEkgbWF5IG5vdCBmaXQgeW91ciBwcm9ibGVtIGRvbWFpbiB2ZXJ5IHdlbGwsIGFzIHlvdSBtYXkgbm90IGJlIHRoZSBvbmx5IGNsaWVudCBpdCB0cmllcyB0byBzZXJ2ZS4gQnkgZGVzaWduaW5nIHlvdXIgb3duIGludGVyZmFjZSwgeW91IGhhdmUgYSBjaGFuY2UgdG8gdGFpbG9yIGl0IHRvIHlvdXIgbmVlZCAtIHlvdSBtYXkgYWRkIGhpZ2hlci1sZXZlbCBmdW5jdGlvbmFsaXRpZXMsIHJlbmFtZSBzdHVmZiwgZXRjIGluc3RlYWQgb2YganVzdCB0cmltbWluZyB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSB5b3VyIGNvZGUgKHVzZXIgb2YgdGhlIGludGVyZmFjZSkgaW4gYSBtb3JlIG5hdHVyYWwgd2F5LCB3aGljaCBtZWFucyBpdCB3aWxsIGJlIG1vcmUgcmVhZGFibGUsIG1vcmUgbWFpbnRhaW5hYmxlLCBhbmQgeW91J2xsIGJlIG1vcmUgcHJvZHVjdGl2ZS4KKyAgKiBJZiBgQ29uY3JldGVgJ3MgaW1wbGVtZW50YXRpb24gZXZlciBoYXMgdG8gY2hhbmdlLCB5b3UgZG9uJ3QgaGF2ZSB0byByZXdyaXRlIGV2ZXJ5d2hlcmUgaXQgaXMgdXNlZC4gSW5zdGVhZCwgeW91IGNhbiBhYnNvcmIgdGhlIGNoYW5nZSBpbiB5b3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UsIGFuZCB5b3VyIG90aGVyIGNvZGUgYW5kIHRlc3RzIHdpbGwgYmUgaW5zdWxhdGVkIGZyb20gdGhpcyBjaGFuZ2UuCisKK1NvbWUgcGVvcGxlIHdvcnJ5IHRoYXQgaWYgZXZlcnlvbmUgaXMgcHJhY3RpY2luZyB0aGlzIHRlY2huaXF1ZSwgdGhleQord2lsbCBlbmQgdXAgd3JpdGluZyBsb3RzIG9mIHJlZHVuZGFudCBjb2RlLiBUaGlzIGNvbmNlcm4gaXMgdG90YWxseQordW5kZXJzdGFuZGFibGUuIEhvd2V2ZXIsIHRoZXJlIGFyZSB0d28gcmVhc29ucyB3aHkgaXQgbWF5IG5vdCBiZSB0aGUKK2Nhc2U6CisKKyAgKiBEaWZmZXJlbnQgcHJvamVjdHMgbWF5IG5lZWQgdG8gdXNlIGBDb25jcmV0ZWAgaW4gZGlmZmVyZW50IHdheXMsIHNvIHRoZSBiZXN0IGludGVyZmFjZXMgZm9yIHRoZW0gd2lsbCBiZSBkaWZmZXJlbnQuIFRoZXJlZm9yZSwgZWFjaCBvZiB0aGVtIHdpbGwgaGF2ZSBpdHMgb3duIGRvbWFpbi1zcGVjaWZpYyBpbnRlcmZhY2Ugb24gdG9wIG9mIGBDb25jcmV0ZWAsIGFuZCB0aGV5IHdpbGwgbm90IGJlIHRoZSBzYW1lIGNvZGUuCisgICogSWYgZW5vdWdoIHByb2plY3RzIHdhbnQgdG8gdXNlIHRoZSBzYW1lIGludGVyZmFjZSwgdGhleSBjYW4gYWx3YXlzIHNoYXJlIGl0LCBqdXN0IGxpa2UgdGhleSBoYXZlIGJlZW4gc2hhcmluZyBgQ29uY3JldGVgLiBZb3UgY2FuIGNoZWNrIGluIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBhZGFwdG9yIHNvbWV3aGVyZSBuZWFyIGBDb25jcmV0ZWAgKHBlcmhhcHMgaW4gYSBgY29udHJpYmAgc3ViLWRpcmVjdG9yeSkgYW5kIGxldCBtYW55IHByb2plY3RzIHVzZSBpdC4KKworWW91IG5lZWQgdG8gd2VpZ2ggdGhlIHByb3MgYW5kIGNvbnMgY2FyZWZ1bGx5IGZvciB5b3VyIHBhcnRpY3VsYXIKK3Byb2JsZW0sIGJ1dCBJJ2QgbGlrZSB0byBhc3N1cmUgeW91IHRoYXQgdGhlIEphdmEgY29tbXVuaXR5IGhhcyBiZWVuCitwcmFjdGljaW5nIHRoaXMgZm9yIGEgbG9uZyB0aW1lIGFuZCBpdCdzIGEgcHJvdmVuIGVmZmVjdGl2ZSB0ZWNobmlxdWUKK2FwcGxpY2FibGUgaW4gYSB3aWRlIHZhcmlldHkgb2Ygc2l0dWF0aW9ucy4gOi0pCisKKyMjIERlbGVnYXRpbmcgQ2FsbHMgdG8gYSBGYWtlICMjCisKK1NvbWUgdGltZXMgeW91IGhhdmUgYSBub24tdHJpdmlhbCBmYWtlIGltcGxlbWVudGF0aW9uIG9mIGFuCitpbnRlcmZhY2UuIEZvciBleGFtcGxlOgorCitgYGAKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Gb28oKSB7fQorICB2aXJ0dWFsIGNoYXIgRG9UaGlzKGludCBuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEb1RoYXQoY29uc3QgY2hhciogcywgaW50KiBwKSA9IDA7Cit9OworCitjbGFzcyBGYWtlRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIGNoYXIgRG9UaGlzKGludCBuKSB7CisgICAgcmV0dXJuIChuID4gMCkgPyAnKycgOgorICAgICAgICAobiA8IDApID8gJy0nIDogJzAnOworICB9CisKKyAgdmlydHVhbCB2b2lkIERvVGhhdChjb25zdCBjaGFyKiBzLCBpbnQqIHApIHsKKyAgICAqcCA9IHN0cmxlbihzKTsKKyAgfQorfTsKK2BgYAorCitOb3cgeW91IHdhbnQgdG8gbW9jayB0aGlzIGludGVyZmFjZSBzdWNoIHRoYXQgeW91IGNhbiBzZXQgZXhwZWN0YXRpb25zCitvbiBpdC4gSG93ZXZlciwgeW91IGFsc28gd2FudCB0byB1c2UgYEZha2VGb29gIGZvciB0aGUgZGVmYXVsdAorYmVoYXZpb3IsIGFzIGR1cGxpY2F0aW5nIGl0IGluIHRoZSBtb2NrIG9iamVjdCBpcywgd2VsbCwgYSBsb3Qgb2YKK3dvcmsuCisKK1doZW4geW91IGRlZmluZSB0aGUgbW9jayBjbGFzcyB1c2luZyBHb29nbGUgTW9jaywgeW91IGNhbiBoYXZlIGl0CitkZWxlZ2F0ZSBpdHMgZGVmYXVsdCBhY3Rpb24gdG8gYSBmYWtlIGNsYXNzIHlvdSBhbHJlYWR5IGhhdmUsIHVzaW5nCit0aGlzIHBhdHRlcm46CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC8vIE5vcm1hbCBtb2NrIG1ldGhvZCBkZWZpbml0aW9ucyB1c2luZyBHb29nbGUgTW9jay4KKyAgTU9DS19NRVRIT0QxKERvVGhpcywgY2hhcihpbnQgbikpOworICBNT0NLX01FVEhPRDIoRG9UaGF0LCB2b2lkKGNvbnN0IGNoYXIqIHMsIGludCogcCkpOworCisgIC8vIERlbGVnYXRlcyB0aGUgZGVmYXVsdCBhY3Rpb25zIG9mIHRoZSBtZXRob2RzIHRvIGEgRmFrZUZvbyBvYmplY3QuCisgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGN1c3RvbSBPTl9DQUxMKCkgc3RhdGVtZW50cy4KKyAgdm9pZCBEZWxlZ2F0ZVRvRmFrZSgpIHsKKyAgICBPTl9DQUxMKCp0aGlzLCBEb1RoaXMoXykpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmZmFrZV8sICZGYWtlRm9vOjpEb1RoaXMpKTsKKyAgICBPTl9DQUxMKCp0aGlzLCBEb1RoYXQoXywgXykpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmZmFrZV8sICZGYWtlRm9vOjpEb1RoYXQpKTsKKyAgfQorIHByaXZhdGU6CisgIEZha2VGb28gZmFrZV87ICAvLyBLZWVwcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFrZSBpbiB0aGUgbW9jay4KK307CitgYGAKKworV2l0aCB0aGF0LCB5b3UgY2FuIHVzZSBgTW9ja0Zvb2AgaW4geW91ciB0ZXN0cyBhcyB1c3VhbC4gSnVzdCByZW1lbWJlcgordGhhdCBpZiB5b3UgZG9uJ3QgZXhwbGljaXRseSBzZXQgYW4gYWN0aW9uIGluIGFuIGBPTl9DQUxMKClgIG9yCitgRVhQRUNUX0NBTEwoKWAsIHRoZSBmYWtlIHdpbGwgYmUgY2FsbGVkIHVwb24gdG8gZG8gaXQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworCitURVNUKEFiY1Rlc3QsIFh5eikgeworICBNb2NrRm9vIGZvbzsKKyAgZm9vLkRlbGVnYXRlVG9GYWtlKCk7IC8vIEVuYWJsZXMgdGhlIGZha2UgZm9yIGRlbGVnYXRpb24uCisKKyAgLy8gUHV0IHlvdXIgT05fQ0FMTChmb28sIC4uLilzIGhlcmUsIGlmIGFueS4KKworICAvLyBObyBhY3Rpb24gc3BlY2lmaWVkLCBtZWFuaW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBhY3Rpb24uCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDUpKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoXywgXykpOworCisgIGludCBuID0gMDsKKyAgRVhQRUNUX0VRKCcrJywgZm9vLkRvVGhpcyg1KSk7ICAvLyBGYWtlRm9vOjpEb1RoaXMoKSBpcyBpbnZva2VkLgorICBmb28uRG9UaGF0KCJIaSIsICZuKTsgICAgICAgICAgIC8vIEZha2VGb286OkRvVGhhdCgpIGlzIGludm9rZWQuCisgIEVYUEVDVF9FUSgyLCBuKTsKK30KK2BgYAorCisqKlNvbWUgdGlwczoqKgorCisgICogSWYgeW91IHdhbnQsIHlvdSBjYW4gc3RpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYWN0aW9uIGJ5IHByb3ZpZGluZyB5b3VyIG93biBgT05fQ0FMTCgpYCBvciB1c2luZyBgLldpbGxPbmNlKClgIC8gYC5XaWxsUmVwZWF0ZWRseSgpYCBpbiBgRVhQRUNUX0NBTEwoKWAuCisgICogSW4gYERlbGVnYXRlVG9GYWtlKClgLCB5b3Ugb25seSBuZWVkIHRvIGRlbGVnYXRlIHRoZSBtZXRob2RzIHdob3NlIGZha2UgaW1wbGVtZW50YXRpb24geW91IGludGVuZCB0byB1c2UuCisgICogVGhlIGdlbmVyYWwgdGVjaG5pcXVlIGRpc2N1c3NlZCBoZXJlIHdvcmtzIGZvciBvdmVybG9hZGVkIG1ldGhvZHMsIGJ1dCB5b3UnbGwgbmVlZCB0byB0ZWxsIHRoZSBjb21waWxlciB3aGljaCB2ZXJzaW9uIHlvdSBtZWFuLiBUbyBkaXNhbWJpZ3VhdGUgYSBtb2NrIGZ1bmN0aW9uICh0aGUgb25lIHlvdSBzcGVjaWZ5IGluc2lkZSB0aGUgcGFyZW50aGVzZXMgb2YgYE9OX0NBTEwoKWApLCBzZWUgdGhlICJTZWxlY3RpbmcgQmV0d2VlbiBPdmVybG9hZGVkIEZ1bmN0aW9ucyIgc2VjdGlvbiBvbiB0aGlzIHBhZ2U7IHRvIGRpc2FtYmlndWF0ZSBhIGZha2UgZnVuY3Rpb24gKHRoZSBvbmUgeW91IHBsYWNlIGluc2lkZSBgSW52b2tlKClgKSwgdXNlIGEgYHN0YXRpY19jYXN0YCB0byBzcGVjaWZ5IHRoZSBmdW5jdGlvbidzIHR5cGUuCisgICogSGF2aW5nIHRvIG1peCBhIG1vY2sgYW5kIGEgZmFrZSBpcyBvZnRlbiBhIHNpZ24gb2Ygc29tZXRoaW5nIGdvbmUgd3JvbmcuIFBlcmhhcHMgeW91IGhhdmVuJ3QgZ290IHVzZWQgdG8gdGhlIGludGVyYWN0aW9uLWJhc2VkIHdheSBvZiB0ZXN0aW5nIHlldC4gT3IgcGVyaGFwcyB5b3VyIGludGVyZmFjZSBpcyB0YWtpbmcgb24gdG9vIG1hbnkgcm9sZXMgYW5kIHNob3VsZCBiZSBzcGxpdCB1cC4gVGhlcmVmb3JlLCAqKmRvbid0IGFidXNlIHRoaXMqKi4gV2Ugd291bGQgb25seSByZWNvbW1lbmQgdG8gZG8gaXQgYXMgYW4gaW50ZXJtZWRpYXRlIHN0ZXAgd2hlbiB5b3UgYXJlIHJlZmFjdG9yaW5nIHlvdXIgY29kZS4KKworUmVnYXJkaW5nIHRoZSB0aXAgb24gbWl4aW5nIGEgbW9jayBhbmQgYSBmYWtlLCBoZXJlJ3MgYW4gZXhhbXBsZSBvbgord2h5IGl0IG1heSBiZSBhIGJhZCBzaWduOiBTdXBwb3NlIHlvdSBoYXZlIGEgY2xhc3MgYFN5c3RlbWAgZm9yCitsb3ctbGV2ZWwgc3lzdGVtIG9wZXJhdGlvbnMuIEluIHBhcnRpY3VsYXIsIGl0IGRvZXMgZmlsZSBhbmQgSS9PCitvcGVyYXRpb25zLiBBbmQgc3VwcG9zZSB5b3Ugd2FudCB0byB0ZXN0IGhvdyB5b3VyIGNvZGUgdXNlcyBgU3lzdGVtYAordG8gZG8gSS9PLCBhbmQgeW91IGp1c3Qgd2FudCB0aGUgZmlsZSBvcGVyYXRpb25zIHRvIHdvcmsgbm9ybWFsbHkuIElmCit5b3UgbW9jayBvdXQgdGhlIGVudGlyZSBgU3lzdGVtYCBjbGFzcywgeW91J2xsIGhhdmUgdG8gcHJvdmlkZSBhIGZha2UKK2ltcGxlbWVudGF0aW9uIGZvciB0aGUgZmlsZSBvcGVyYXRpb24gcGFydCwgd2hpY2ggc3VnZ2VzdHMgdGhhdAorYFN5c3RlbWAgaXMgdGFraW5nIG9uIHRvbyBtYW55IHJvbGVzLgorCitJbnN0ZWFkLCB5b3UgY2FuIGRlZmluZSBhIGBGaWxlT3BzYCBpbnRlcmZhY2UgYW5kIGFuIGBJT09wc2AgaW50ZXJmYWNlCithbmQgc3BsaXQgYFN5c3RlbWAncyBmdW5jdGlvbmFsaXRpZXMgaW50byB0aGUgdHdvLiBUaGVuIHlvdSBjYW4gbW9jaworYElPT3BzYCB3aXRob3V0IG1vY2tpbmcgYEZpbGVPcHNgLgorCisjIyBEZWxlZ2F0aW5nIENhbGxzIHRvIGEgUmVhbCBPYmplY3QgIyMKKworV2hlbiB1c2luZyB0ZXN0aW5nIGRvdWJsZXMgKG1vY2tzLCBmYWtlcywgc3R1YnMsIGFuZCBldGMpLCBzb21ldGltZXMKK3RoZWlyIGJlaGF2aW9ycyB3aWxsIGRpZmZlciBmcm9tIHRob3NlIG9mIHRoZSByZWFsIG9iamVjdHMuIFRoaXMKK2RpZmZlcmVuY2UgY291bGQgYmUgZWl0aGVyIGludGVudGlvbmFsIChhcyBpbiBzaW11bGF0aW5nIGFuIGVycm9yIHN1Y2gKK3RoYXQgeW91IGNhbiB0ZXN0IHRoZSBlcnJvciBoYW5kbGluZyBjb2RlKSBvciB1bmludGVudGlvbmFsLiBJZiB5b3VyCittb2NrcyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcnMgdGhhbiB0aGUgcmVhbCBvYmplY3RzIGJ5IG1pc3Rha2UsIHlvdQorY291bGQgZW5kIHVwIHdpdGggY29kZSB0aGF0IHBhc3NlcyB0aGUgdGVzdHMgYnV0IGZhaWxzIGluIHByb2R1Y3Rpb24uCisKK1lvdSBjYW4gdXNlIHRoZSBfZGVsZWdhdGluZy10by1yZWFsXyB0ZWNobmlxdWUgdG8gZW5zdXJlIHRoYXQgeW91cgorbW9jayBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHJlYWwgb2JqZWN0IHdoaWxlIHJldGFpbmluZyB0aGUKK2FiaWxpdHkgdG8gdmFsaWRhdGUgY2FsbHMuIFRoaXMgdGVjaG5pcXVlIGlzIHZlcnkgc2ltaWxhciB0byB0aGUKK2RlbGVnYXRpbmctdG8tZmFrZSB0ZWNobmlxdWUsIHRoZSBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgd2UgdXNlIGEgcmVhbAorb2JqZWN0IGluc3RlYWQgb2YgYSBmYWtlLiBIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkF0TGVhc3Q7Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTW9ja0ZvbygpIHsKKyAgICAvLyBCeSBkZWZhdWx0LCBhbGwgY2FsbHMgYXJlIGRlbGVnYXRlZCB0byB0aGUgcmVhbCBvYmplY3QuCisgICAgT05fQ0FMTCgqdGhpcywgRG9UaGlzKCkpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmcmVhbF8sICZGb286OkRvVGhpcykpOworICAgIE9OX0NBTEwoKnRoaXMsIERvVGhhdChfKSkKKyAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKCZyZWFsXywgJkZvbzo6RG9UaGF0KSk7CisgICAgLi4uCisgIH0KKyAgTU9DS19NRVRIT0QwKERvVGhpcywgLi4uKTsKKyAgTU9DS19NRVRIT0QxKERvVGhhdCwgLi4uKTsKKyAgLi4uCisgcHJpdmF0ZToKKyAgRm9vIHJlYWxfOworfTsKKy4uLgorCisgIE1vY2tGb28gbW9jazsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBEb1RoaXMoKSkKKyAgICAgIC5UaW1lcygzKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgRG9UaGF0KCJIaSIpKQorICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpOworICAuLi4gdXNlIG1vY2sgaW4gdGVzdCAuLi4KK2BgYAorCitXaXRoIHRoaXMsIEdvb2dsZSBNb2NrIHdpbGwgdmVyaWZ5IHRoYXQgeW91ciBjb2RlIG1hZGUgdGhlIHJpZ2h0IGNhbGxzCisod2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzLCBpbiB0aGUgcmlnaHQgb3JkZXIsIGNhbGxlZCB0aGUgcmlnaHQgbnVtYmVyCitvZiB0aW1lcywgZXRjKSwgYW5kIGEgcmVhbCBvYmplY3Qgd2lsbCBhbnN3ZXIgdGhlIGNhbGxzIChzbyB0aGUKK2JlaGF2aW9yIHdpbGwgYmUgdGhlIHNhbWUgYXMgaW4gcHJvZHVjdGlvbikuIFRoaXMgZ2l2ZXMgeW91IHRoZSBiZXN0CitvZiBib3RoIHdvcmxkcy4KKworIyMgRGVsZWdhdGluZyBDYWxscyB0byBhIFBhcmVudCBDbGFzcyAjIworCitJZGVhbGx5LCB5b3Ugc2hvdWxkIGNvZGUgdG8gaW50ZXJmYWNlcywgd2hvc2UgbWV0aG9kcyBhcmUgYWxsIHB1cmUKK3ZpcnR1YWwuIEluIHJlYWxpdHksIHNvbWV0aW1lcyB5b3UgZG8gbmVlZCB0byBtb2NrIGEgdmlydHVhbCBtZXRob2QKK3RoYXQgaXMgbm90IHB1cmUgKGkuZSwgaXQgYWxyZWFkeSBoYXMgYW4gaW1wbGVtZW50YXRpb24pLiBGb3IgZXhhbXBsZToKKworYGBgCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Rm9vKCk7CisKKyAgdmlydHVhbCB2b2lkIFB1cmUoaW50IG4pID0gMDsKKyAgdmlydHVhbCBpbnQgQ29uY3JldGUoY29uc3QgY2hhciogc3RyKSB7IC4uLiB9Cit9OworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICAvLyBNb2NraW5nIGEgcHVyZSBtZXRob2QuCisgIE1PQ0tfTUVUSE9EMShQdXJlLCB2b2lkKGludCBuKSk7CisgIC8vIE1vY2tpbmcgYSBjb25jcmV0ZSBtZXRob2QuICBGb286OkNvbmNyZXRlKCkgaXMgc2hhZG93ZWQuCisgIE1PQ0tfTUVUSE9EMShDb25jcmV0ZSwgaW50KGNvbnN0IGNoYXIqIHN0cikpOworfTsKK2BgYAorCitTb21ldGltZXMgeW91IG1heSB3YW50IHRvIGNhbGwgYEZvbzo6Q29uY3JldGUoKWAgaW5zdGVhZCBvZgorYE1vY2tGb286OkNvbmNyZXRlKClgLiBQZXJoYXBzIHlvdSB3YW50IHRvIGRvIGl0IGFzIHBhcnQgb2YgYSBzdHViCithY3Rpb24sIG9yIHBlcmhhcHMgeW91ciB0ZXN0IGRvZXNuJ3QgbmVlZCB0byBtb2NrIGBDb25jcmV0ZSgpYCBhdCBhbGwKKyhidXQgaXQgd291bGQgYmUgb2gtc28gcGFpbmZ1bCB0byBoYXZlIHRvIGRlZmluZSBhIG5ldyBtb2NrIGNsYXNzCit3aGVuZXZlciB5b3UgZG9uJ3QgbmVlZCB0byBtb2NrIG9uZSBvZiBpdHMgbWV0aG9kcykuCisKK1RoZSB0cmljayBpcyB0byBsZWF2ZSBhIGJhY2sgZG9vciBpbiB5b3VyIG1vY2sgY2xhc3MgZm9yIGFjY2Vzc2luZyB0aGUKK3JlYWwgbWV0aG9kcyBpbiB0aGUgYmFzZSBjbGFzczoKKworYGBgCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICAvLyBNb2NraW5nIGEgcHVyZSBtZXRob2QuCisgIE1PQ0tfTUVUSE9EMShQdXJlLCB2b2lkKGludCBuKSk7CisgIC8vIE1vY2tpbmcgYSBjb25jcmV0ZSBtZXRob2QuICBGb286OkNvbmNyZXRlKCkgaXMgc2hhZG93ZWQuCisgIE1PQ0tfTUVUSE9EMShDb25jcmV0ZSwgaW50KGNvbnN0IGNoYXIqIHN0cikpOworCisgIC8vIFVzZSB0aGlzIHRvIGNhbGwgQ29uY3JldGUoKSBkZWZpbmVkIGluIEZvby4KKyAgaW50IEZvb0NvbmNyZXRlKGNvbnN0IGNoYXIqIHN0cikgeyByZXR1cm4gRm9vOjpDb25jcmV0ZShzdHIpOyB9Cit9OworYGBgCisKK05vdywgeW91IGNhbiBjYWxsIGBGb286OkNvbmNyZXRlKClgIGluc2lkZSBhbiBhY3Rpb24gYnk6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBDb25jcmV0ZShfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoJmZvbywgJk1vY2tGb286OkZvb0NvbmNyZXRlKSk7CitgYGAKKworb3IgdGVsbCB0aGUgbW9jayBvYmplY3QgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byBtb2NrIGBDb25jcmV0ZSgpYDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKy4uLgorICBPTl9DQUxMKGZvbywgQ29uY3JldGUoXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoJmZvbywgJk1vY2tGb286OkZvb0NvbmNyZXRlKSk7CitgYGAKKworKFdoeSBkb24ndCB3ZSBqdXN0IHdyaXRlIGBJbnZva2UoJmZvbywgJkZvbzo6Q29uY3JldGUpYD8gSWYgeW91IGRvCit0aGF0LCBgTW9ja0Zvbzo6Q29uY3JldGUoKWAgd2lsbCBiZSBjYWxsZWQgKGFuZCBjYXVzZSBhbiBpbmZpbml0ZQorcmVjdXJzaW9uKSBzaW5jZSBgRm9vOjpDb25jcmV0ZSgpYCBpcyB2aXJ0dWFsLiBUaGF0J3MganVzdCBob3cgQysrCit3b3Jrcy4pCisKKyMgVXNpbmcgTWF0Y2hlcnMgIworCisjIyBNYXRjaGluZyBBcmd1bWVudCBWYWx1ZXMgRXhhY3RseSAjIworCitZb3UgY2FuIHNwZWNpZnkgZXhhY3RseSB3aGljaCBhcmd1bWVudHMgYSBtb2NrIG1ldGhvZCBpcyBleHBlY3Rpbmc6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoNSkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCdhJykpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgiSGVsbG8iLCBiYXIpKTsKK2BgYAorCisjIyBVc2luZyBTaW1wbGUgTWF0Y2hlcnMgIyMKKworWW91IGNhbiB1c2UgbWF0Y2hlcnMgdG8gbWF0Y2ggYXJndW1lbnRzIHRoYXQgaGF2ZSBhIGNlcnRhaW4gcHJvcGVydHk6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpHZTsKK3VzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKEdlKDUpKSkgIC8vIFRoZSBhcmd1bWVudCBtdXN0IGJlID49IDUuCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCdhJykpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgiSGVsbG8iLCBOb3ROdWxsKCkpKTsKKyAgLy8gVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IG5vdCBiZSBOVUxMLgorYGBgCisKK0EgZnJlcXVlbnRseSB1c2VkIG1hdGNoZXIgaXMgYF9gLCB3aGljaCBtYXRjaGVzIGFueXRoaW5nOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdChfLCBOb3ROdWxsKCkpKTsKK2BgYAorCisjIyBDb21iaW5pbmcgTWF0Y2hlcnMgIyMKKworWW91IGNhbiBidWlsZCBjb21wbGV4IG1hdGNoZXJzIGZyb20gZXhpc3Rpbmcgb25lcyB1c2luZyBgQWxsT2YoKWAsCitgQW55T2YoKWAsIGFuZCBgTm90KClgOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6QWxsT2Y7Cit1c2luZyA6OnRlc3Rpbmc6Okd0OwordXNpbmcgOjp0ZXN0aW5nOjpIYXNTdWJzdHI7Cit1c2luZyA6OnRlc3Rpbmc6Ok5lOwordXNpbmcgOjp0ZXN0aW5nOjpOb3Q7CisuLi4KKyAgLy8gVGhlIGFyZ3VtZW50IG11c3QgYmUgPiA1IGFuZCAhPSAxMC4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoQWxsT2YoR3QoNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lKDEwKSkpKTsKKworICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBub3QgY29udGFpbiBzdWItc3RyaW5nICJibGFoIi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoTm90KEhhc1N1YnN0cigiYmxhaCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworYGBgCisKKyMjIENhc3RpbmcgTWF0Y2hlcnMgIyMKKworR29vZ2xlIE1vY2sgbWF0Y2hlcnMgYXJlIHN0YXRpY2FsbHkgdHlwZWQsIG1lYW5pbmcgdGhhdCB0aGUgY29tcGlsZXIKK2NhbiBjYXRjaCB5b3VyIG1pc3Rha2UgaWYgeW91IHVzZSBhIG1hdGNoZXIgb2YgdGhlIHdyb25nIHR5cGUgKGZvcgorZXhhbXBsZSwgaWYgeW91IHVzZSBgRXEoNSlgIHRvIG1hdGNoIGEgYHN0cmluZ2AgYXJndW1lbnQpLiBHb29kIGZvcgoreW91IQorCitTb21ldGltZXMsIGhvd2V2ZXIsIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nIGFuZCB3YW50IHRoZSBjb21waWxlcgordG8gZ2l2ZSB5b3Ugc29tZSBzbGFjay4gT25lIGV4YW1wbGUgaXMgdGhhdCB5b3UgaGF2ZSBhIG1hdGNoZXIgZm9yCitgbG9uZ2AgYW5kIHRoZSBhcmd1bWVudCB5b3Ugd2FudCB0byBtYXRjaCBpcyBgaW50YC4gV2hpbGUgdGhlIHR3bwordHlwZXMgYXJlbid0IGV4YWN0bHkgdGhlIHNhbWUsIHRoZXJlIGlzIG5vdGhpbmcgcmVhbGx5IHdyb25nIHdpdGgKK3VzaW5nIGEgYE1hdGNoZXI8bG9uZz5gIHRvIG1hdGNoIGFuIGBpbnRgIC0gYWZ0ZXIgYWxsLCB3ZSBjYW4gZmlyc3QKK2NvbnZlcnQgdGhlIGBpbnRgIGFyZ3VtZW50IHRvIGEgYGxvbmdgIGJlZm9yZSBnaXZpbmcgaXQgdG8gdGhlCittYXRjaGVyLgorCitUbyBzdXBwb3J0IHRoaXMgbmVlZCwgR29vZ2xlIE1vY2sgZ2l2ZXMgeW91IHRoZQorYFNhZmVNYXRjaGVyQ2FzdDxUPihtKWAgZnVuY3Rpb24uIEl0IGNhc3RzIGEgbWF0Y2hlciBgbWAgdG8gdHlwZQorYE1hdGNoZXI8VD5gLiBUbyBlbnN1cmUgc2FmZXR5LCBHb29nbGUgTW9jayBjaGVja3MgdGhhdCAobGV0IGBVYCBiZSB0aGUKK3R5cGUgYG1gIGFjY2VwdHMpOgorCisgIDEuIFR5cGUgYFRgIGNhbiBiZSBpbXBsaWNpdGx5IGNhc3QgdG8gdHlwZSBgVWA7CisgIDEuIFdoZW4gYm90aCBgVGAgYW5kIGBVYCBhcmUgYnVpbHQtaW4gYXJpdGhtZXRpYyB0eXBlcyAoYGJvb2xgLCBpbnRlZ2VycywgYW5kIGZsb2F0aW5nLXBvaW50IG51bWJlcnMpLCB0aGUgY29udmVyc2lvbiBmcm9tIGBUYCB0byBgVWAgaXMgbm90IGxvc3N5IChpbiBvdGhlciB3b3JkcywgYW55IHZhbHVlIHJlcHJlc2VudGFibGUgYnkgYFRgIGNhbiBhbHNvIGJlIHJlcHJlc2VudGVkIGJ5IGBVYCk7IGFuZAorICAxLiBXaGVuIGBVYCBpcyBhIHJlZmVyZW5jZSwgYFRgIG11c3QgYWxzbyBiZSBhIHJlZmVyZW5jZSAoYXMgdGhlIHVuZGVybHlpbmcgbWF0Y2hlciBtYXkgYmUgaW50ZXJlc3RlZCBpbiB0aGUgYWRkcmVzcyBvZiB0aGUgYFVgIHZhbHVlKS4KKworVGhlIGNvZGUgd29uJ3QgY29tcGlsZSBpZiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBpc24ndCBtZXQuCisKK0hlcmUncyBvbmUgZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDsKKworLy8gQSBiYXNlIGNsYXNzIGFuZCBhIGNoaWxkIGNsYXNzLgorY2xhc3MgQmFzZSB7IC4uLiB9OworY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsgLi4uIH07CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShEb1RoaXMsIHZvaWQoRGVyaXZlZCogZGVyaXZlZCkpOworfTsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICAvLyBtIGlzIGEgTWF0Y2hlcjxCYXNlKj4gd2UgZ290IGZyb20gc29tZXdoZXJlLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhTYWZlTWF0Y2hlckNhc3Q8RGVyaXZlZCo+KG0pKSk7CitgYGAKKworSWYgeW91IGZpbmQgYFNhZmVNYXRjaGVyQ2FzdDxUPihtKWAgdG9vIGxpbWl0aW5nLCB5b3UgY2FuIHVzZSBhIHNpbWlsYXIKK2Z1bmN0aW9uIGBNYXRjaGVyQ2FzdDxUPihtKWAuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgYE1hdGNoZXJDYXN0YCB3b3JrcworYXMgbG9uZyBhcyB5b3UgY2FuIGBzdGF0aWNfY2FzdGAgdHlwZSBgVGAgdG8gdHlwZSBgVWAuCisKK2BNYXRjaGVyQ2FzdGAgZXNzZW50aWFsbHkgbGV0cyB5b3UgYnlwYXNzIEMrKydzIHR5cGUgc3lzdGVtCisoYHN0YXRpY19jYXN0YCBpc24ndCBhbHdheXMgc2FmZSBhcyBpdCBjb3VsZCB0aHJvdyBhd2F5IGluZm9ybWF0aW9uLAorZm9yIGV4YW1wbGUpLCBzbyBiZSBjYXJlZnVsIG5vdCB0byBtaXN1c2UvYWJ1c2UgaXQuCisKKyMjIFNlbGVjdGluZyBCZXR3ZWVuIE92ZXJsb2FkZWQgRnVuY3Rpb25zICMjCisKK0lmIHlvdSBleHBlY3QgYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbiB0byBiZSBjYWxsZWQsIHRoZSBjb21waWxlciBtYXkKK25lZWQgc29tZSBoZWxwIG9uIHdoaWNoIG92ZXJsb2FkZWQgdmVyc2lvbiBpdCBpcy4KKworVG8gZGlzYW1iaWd1YXRlIGZ1bmN0aW9ucyBvdmVybG9hZGVkIG9uIHRoZSBjb25zdC1uZXNzIG9mIHRoaXMgb2JqZWN0LAordXNlIHRoZSBgQ29uc3QoKWAgYXJndW1lbnQgd3JhcHBlci4KKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVyblJlZjsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgTU9DS19NRVRIT0QwKEdldEJhciwgQmFyJigpKTsKKyAgTU9DS19DT05TVF9NRVRIT0QwKEdldEJhciwgY29uc3QgQmFyJigpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgQmFyIGJhcjEsIGJhcjI7CisgIEVYUEVDVF9DQUxMKGZvbywgR2V0QmFyKCkpICAgICAgICAgLy8gVGhlIG5vbi1jb25zdCBHZXRCYXIoKS4KKyAgICAgIC5XaWxsT25jZShSZXR1cm5SZWYoYmFyMSkpOworICBFWFBFQ1RfQ0FMTChDb25zdChmb28pLCBHZXRCYXIoKSkgIC8vIFRoZSBjb25zdCBHZXRCYXIoKS4KKyAgICAgIC5XaWxsT25jZShSZXR1cm5SZWYoYmFyMikpOworYGBgCisKKyhgQ29uc3QoKWAgaXMgZGVmaW5lZCBieSBHb29nbGUgTW9jayBhbmQgcmV0dXJucyBhIGBjb25zdGAgcmVmZXJlbmNlCit0byBpdHMgYXJndW1lbnQuKQorCitUbyBkaXNhbWJpZ3VhdGUgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzCitidXQgZGlmZmVyZW50IGFyZ3VtZW50IHR5cGVzLCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSB0aGUgZXhhY3QgdHlwZQorb2YgYSBtYXRjaGVyLCBlaXRoZXIgYnkgd3JhcHBpbmcgeW91ciBtYXRjaGVyIGluIGBNYXRjaGVyPHR5cGU+KClgLCBvcgordXNpbmcgYSBtYXRjaGVyIHdob3NlIHR5cGUgaXMgZml4ZWQgKGBUeXBlZEVxPHR5cGU+YCwgYEFuPHR5cGU+KClgLAorZXRjKToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkFuOwordXNpbmcgOjp0ZXN0aW5nOjpMdDsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6VHlwZWRFcTsKKworY2xhc3MgTW9ja1ByaW50ZXIgOiBwdWJsaWMgUHJpbnRlciB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoUHJpbnQsIHZvaWQoaW50IG4pKTsKKyAgTU9DS19NRVRIT0QxKFByaW50LCB2b2lkKGNoYXIgYykpOworfTsKKworVEVTVChQcmludGVyVGVzdCwgUHJpbnQpIHsKKyAgTW9ja1ByaW50ZXIgcHJpbnRlcjsKKworICBFWFBFQ1RfQ0FMTChwcmludGVyLCBQcmludChBbjxpbnQ+KCkpKTsgICAgICAgICAgICAvLyB2b2lkIFByaW50KGludCk7CisgIEVYUEVDVF9DQUxMKHByaW50ZXIsIFByaW50KE1hdGNoZXI8aW50PihMdCg1KSkpKTsgIC8vIHZvaWQgUHJpbnQoaW50KTsKKyAgRVhQRUNUX0NBTEwocHJpbnRlciwgUHJpbnQoVHlwZWRFcTxjaGFyPignYScpKSk7ICAgLy8gdm9pZCBQcmludChjaGFyKTsKKworICBwcmludGVyLlByaW50KDMpOworICBwcmludGVyLlByaW50KDYpOworICBwcmludGVyLlByaW50KCdhJyk7Cit9CitgYGAKKworIyMgUGVyZm9ybWluZyBEaWZmZXJlbnQgQWN0aW9ucyBCYXNlZCBvbiB0aGUgQXJndW1lbnRzICMjCisKK1doZW4gYSBtb2NrIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBfbGFzdF8gbWF0Y2hpbmcgZXhwZWN0YXRpb24gdGhhdCdzCitzdGlsbCBhY3RpdmUgd2lsbCBiZSBzZWxlY3RlZCAodGhpbmsgIm5ld2VyIG92ZXJyaWRlcyBvbGRlciIpLiBTbywgeW91CitjYW4gbWFrZSBhIG1ldGhvZCBkbyBkaWZmZXJlbnQgdGhpbmdzIGRlcGVuZGluZyBvbiBpdHMgYXJndW1lbnQgdmFsdWVzCitsaWtlIHRoaXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpMdDsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworLi4uCisgIC8vIFRoZSBkZWZhdWx0IGNhc2UuCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKF8pKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybignYicpKTsKKworICAvLyBUaGUgbW9yZSBzcGVjaWZpYyBjYXNlLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhMdCg1KSkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCdhJykpOworYGBgCisKK05vdywgaWYgYGZvby5Eb1RoaXMoKWAgaXMgY2FsbGVkIHdpdGggYSB2YWx1ZSBsZXNzIHRoYW4gNSwgYCdhJ2Agd2lsbAorYmUgcmV0dXJuZWQ7IG90aGVyd2lzZSBgJ2InYCB3aWxsIGJlIHJldHVybmVkLgorCisjIyBNYXRjaGluZyBNdWx0aXBsZSBBcmd1bWVudHMgYXMgYSBXaG9sZSAjIworCitTb21ldGltZXMgaXQncyBub3QgZW5vdWdoIHRvIG1hdGNoIHRoZSBhcmd1bWVudHMgaW5kaXZpZHVhbGx5LiBGb3IKK2V4YW1wbGUsIHdlIG1heSB3YW50IHRvIHNheSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGxlc3MgdGhhbgordGhlIHNlY29uZCBhcmd1bWVudC4gVGhlIGBXaXRoKClgIGNsYXVzZSBhbGxvd3MgdXMgdG8gbWF0Y2gKK2FsbCBhcmd1bWVudHMgb2YgYSBtb2NrIGZ1bmN0aW9uIGFzIGEgd2hvbGUuIEZvciBleGFtcGxlLAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6THQ7Cit1c2luZyA6OnRlc3Rpbmc6Ok5lOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgSW5SYW5nZShOZSgwKSwgXykpCisgICAgICAuV2l0aChMdCgpKTsKK2BgYAorCitzYXlzIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGBJblJhbmdlKClgIG11c3Qgbm90IGJlIDAsIGFuZCBtdXN0IGJlCitsZXNzIHRoYW4gdGhlIHNlY29uZCBhcmd1bWVudC4KKworVGhlIGV4cHJlc3Npb24gaW5zaWRlIGBXaXRoKClgIG11c3QgYmUgYSBtYXRjaGVyIG9mIHR5cGUKK2BNYXRjaGVyPHRyMTo6dHVwbGU8QTEsIC4uLiwgQW4+ID5gLCB3aGVyZSBgQTFgLCAuLi4sIGBBbmAgYXJlIHRoZQordHlwZXMgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKworWW91IGNhbiBhbHNvIHdyaXRlIGBBbGxBcmdzKG0pYCBpbnN0ZWFkIG9mIGBtYCBpbnNpZGUgYC5XaXRoKClgLiBUaGUKK3R3byBmb3JtcyBhcmUgZXF1aXZhbGVudCwgYnV0IGAuV2l0aChBbGxBcmdzKEx0KCkpKWAgaXMgbW9yZSByZWFkYWJsZQordGhhbiBgLldpdGgoTHQoKSlgLgorCitZb3UgY2FuIHVzZSBgQXJnczxrMSwgLi4uLCBrbj4obSlgIHRvIG1hdGNoIHRoZSBgbmAgc2VsZWN0ZWQgYXJndW1lbnRzCisoYXMgYSB0dXBsZSkgYWdhaW5zdCBgbWAuIEZvciBleGFtcGxlLAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6QWxsT2Y7Cit1c2luZyA6OnRlc3Rpbmc6OkFyZ3M7Cit1c2luZyA6OnRlc3Rpbmc6Okx0OworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQmxhaChfLCBfLCBfKSkKKyAgICAgIC5XaXRoKEFsbE9mKEFyZ3M8MCwgMT4oTHQoKSksIEFyZ3M8MSwgMj4oTHQoKSkpKTsKK2BgYAorCitzYXlzIHRoYXQgYEJsYWgoKWAgd2lsbCBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgYHhgLCBgeWAsIGFuZCBgemAgd2hlcmUKK2B4IDwgeSA8IHpgLgorCitBcyBhIGNvbnZlbmllbmNlIGFuZCBleGFtcGxlLCBHb29nbGUgTW9jayBwcm92aWRlcyBzb21lIG1hdGNoZXJzIGZvcgorMi10dXBsZXMsIGluY2x1ZGluZyB0aGUgYEx0KClgIG1hdGNoZXIgYWJvdmUuIFNlZSB0aGUgW0NoZWF0U2hlZXRdKFYxXzZfQ2hlYXRTaGVldC5tZCkgZm9yCit0aGUgY29tcGxldGUgbGlzdC4KKworTm90ZSB0aGF0IGlmIHlvdSB3YW50IHRvIHBhc3MgdGhlIGFyZ3VtZW50cyB0byBhIHByZWRpY2F0ZSBvZiB5b3VyIG93bgorKGUuZy4gYC5XaXRoKEFyZ3M8MCwgMT4oVHJ1bHkoJk15UHJlZGljYXRlKSkpYCksIHRoYXQgcHJlZGljYXRlIE1VU1QgYmUKK3dyaXR0ZW4gdG8gdGFrZSBhIGB0cjE6OnR1cGxlYCBhcyBpdHMgYXJndW1lbnQ7IEdvb2dsZSBNb2NrIHdpbGwgcGFzcyB0aGUgYG5gCitzZWxlY3RlZCBhcmd1bWVudHMgYXMgX29uZV8gc2luZ2xlIHR1cGxlIHRvIHRoZSBwcmVkaWNhdGUuCisKKyMjIFVzaW5nIE1hdGNoZXJzIGFzIFByZWRpY2F0ZXMgIyMKKworSGF2ZSB5b3Ugbm90aWNlZCB0aGF0IGEgbWF0Y2hlciBpcyBqdXN0IGEgZmFuY3kgcHJlZGljYXRlIHRoYXQgYWxzbwora25vd3MgaG93IHRvIGRlc2NyaWJlIGl0c2VsZj8gTWFueSBleGlzdGluZyBhbGdvcml0aG1zIHRha2UgcHJlZGljYXRlcworYXMgYXJndW1lbnRzIChlLmcuIHRob3NlIGRlZmluZWQgaW4gU1RMJ3MgYDxhbGdvcml0aG0+YCBoZWFkZXIpLCBhbmQKK2l0IHdvdWxkIGJlIGEgc2hhbWUgaWYgR29vZ2xlIE1vY2sgbWF0Y2hlcnMgYXJlIG5vdCBhbGxvd2VkIHRvCitwYXJ0aWNpcGF0ZS4KKworTHVja2lseSwgeW91IGNhbiB1c2UgYSBtYXRjaGVyIHdoZXJlIGEgdW5hcnkgcHJlZGljYXRlIGZ1bmN0b3IgaXMKK2V4cGVjdGVkIGJ5IHdyYXBwaW5nIGl0IGluc2lkZSB0aGUgYE1hdGNoZXMoKWAgZnVuY3Rpb24uIEZvciBleGFtcGxlLAorCitgYGAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorCitzdGQ6OnZlY3RvcjxpbnQ+IHY7CisuLi4KKy8vIEhvdyBtYW55IGVsZW1lbnRzIGluIHYgYXJlID49IDEwPworY29uc3QgaW50IGNvdW50ID0gY291bnRfaWYodi5iZWdpbigpLCB2LmVuZCgpLCBNYXRjaGVzKEdlKDEwKSkpOworYGBgCisKK1NpbmNlIHlvdSBjYW4gYnVpbGQgY29tcGxleCBtYXRjaGVycyBmcm9tIHNpbXBsZXIgb25lcyBlYXNpbHkgdXNpbmcKK0dvb2dsZSBNb2NrLCB0aGlzIGdpdmVzIHlvdSBhIHdheSB0byBjb252ZW5pZW50bHkgY29uc3RydWN0IGNvbXBvc2l0ZQorcHJlZGljYXRlcyAoZG9pbmcgdGhlIHNhbWUgdXNpbmcgU1RMJ3MgYDxmdW5jdGlvbmFsPmAgaGVhZGVyIGlzIGp1c3QKK3BhaW5mdWwpLiBGb3IgZXhhbXBsZSwgaGVyZSdzIGEgcHJlZGljYXRlIHRoYXQncyBzYXRpc2ZpZWQgYnkgYW55CitudW1iZXIgdGhhdCBpcyA+PSAwLCA8PSAxMDAsIGFuZCAhPSA1MDoKKworYGBgCitNYXRjaGVzKEFsbE9mKEdlKDApLCBMZSgxMDApLCBOZSg1MCkpKQorYGBgCisKKyMjIFVzaW5nIE1hdGNoZXJzIGluIEdvb2dsZSBUZXN0IEFzc2VydGlvbnMgIyMKKworU2luY2UgbWF0Y2hlcnMgYXJlIGJhc2ljYWxseSBwcmVkaWNhdGVzIHRoYXQgYWxzbyBrbm93IGhvdyB0byBkZXNjcmliZQordGhlbXNlbHZlcywgdGhlcmUgaXMgYSB3YXkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlbSBpbgorW0dvb2dsZSBUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8pIGFzc2VydGlvbnMuIEl0J3MKK2NhbGxlZCBgQVNTRVJUX1RIQVRgIGFuZCBgRVhQRUNUX1RIQVRgOgorCitgYGAKKyAgQVNTRVJUX1RIQVQodmFsdWUsIG1hdGNoZXIpOyAgLy8gQXNzZXJ0cyB0aGF0IHZhbHVlIG1hdGNoZXMgbWF0Y2hlci4KKyAgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpOyAgLy8gVGhlIG5vbi1mYXRhbCB2ZXJzaW9uLgorYGBgCisKK0ZvciBleGFtcGxlLCBpbiBhIEdvb2dsZSBUZXN0IHRlc3QgeW91IGNhbiB3cml0ZToKKworYGBgCisjaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKKwordXNpbmcgOjp0ZXN0aW5nOjpBbGxPZjsKK3VzaW5nIDo6dGVzdGluZzo6R2U7Cit1c2luZyA6OnRlc3Rpbmc6OkxlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVzUmVnZXg7Cit1c2luZyA6OnRlc3Rpbmc6OlN0YXJ0c1dpdGg7CisuLi4KKworICBFWFBFQ1RfVEhBVChGb28oKSwgU3RhcnRzV2l0aCgiSGVsbG8iKSk7CisgIEVYUEVDVF9USEFUKEJhcigpLCBNYXRjaGVzUmVnZXgoIkxpbmUgXFxkKyIpKTsKKyAgQVNTRVJUX1RIQVQoQmF6KCksIEFsbE9mKEdlKDUpLCBMZSgxMCkpKTsKK2BgYAorCit3aGljaCAoYXMgeW91IGNhbiBwcm9iYWJseSBndWVzcykgZXhlY3V0ZXMgYEZvbygpYCwgYEJhcigpYCwgYW5kCitgQmF6KClgLCBhbmQgdmVyaWZpZXMgdGhhdDoKKworICAqIGBGb28oKWAgcmV0dXJucyBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIGAiSGVsbG8iYC4KKyAgKiBgQmFyKClgIHJldHVybnMgYSBzdHJpbmcgdGhhdCBtYXRjaGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiBgIkxpbmUgXFxkKyJgLgorICAqIGBCYXooKWAgcmV0dXJucyBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzUsIDEwXS4KKworVGhlIG5pY2UgdGhpbmcgYWJvdXQgdGhlc2UgbWFjcm9zIGlzIHRoYXQgX3RoZXkgcmVhZCBsaWtlCitFbmdsaXNoXy4gVGhleSBnZW5lcmF0ZSBpbmZvcm1hdGl2ZSBtZXNzYWdlcyB0b28uIEZvciBleGFtcGxlLCBpZiB0aGUKK2ZpcnN0IGBFWFBFQ1RfVEhBVCgpYCBhYm92ZSBmYWlscywgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzb21ldGhpbmcgbGlrZToKKworYGBgCitWYWx1ZSBvZjogRm9vKCkKKyAgQWN0dWFsOiAiSGksIHdvcmxkISIKK0V4cGVjdGVkOiBzdGFydHMgd2l0aCAiSGVsbG8iCitgYGAKKworKipDcmVkaXQ6KiogVGhlIGlkZWEgb2YgYChBU1NFUlR8RVhQRUNUKV9USEFUYCB3YXMgc3RvbGVuIGZyb20gdGhlCitbSGFtY3Jlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9oYW1jcmVzdC8pIHByb2plY3QsIHdoaWNoIGFkZHMKK2Bhc3NlcnRUaGF0KClgIHRvIEpVbml0LgorCisjIyBVc2luZyBQcmVkaWNhdGVzIGFzIE1hdGNoZXJzICMjCisKK0dvb2dsZSBNb2NrIHByb3ZpZGVzIGEgYnVpbHQtaW4gc2V0IG9mIG1hdGNoZXJzLiBJbiBjYXNlIHlvdSBmaW5kIHRoZW0KK2xhY2tpbmcsIHlvdSBjYW4gdXNlIGFuIGFyYml0cmF5IHVuYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbiBvciBmdW5jdG9yCithcyBhIG1hdGNoZXIgLSBhcyBsb25nIGFzIHRoZSBwcmVkaWNhdGUgYWNjZXB0cyBhIHZhbHVlIG9mIHRoZSB0eXBlCit5b3Ugd2FudC4gWW91IGRvIHRoaXMgYnkgd3JhcHBpbmcgdGhlIHByZWRpY2F0ZSBpbnNpZGUgdGhlIGBUcnVseSgpYAorZnVuY3Rpb24sIGZvciBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6VHJ1bHk7CisKK2ludCBJc0V2ZW4oaW50IG4pIHsgcmV0dXJuIChuICUgMikgPT0gMCA/IDEgOiAwOyB9CisuLi4KKworICAvLyBCYXIoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGV2ZW4gbnVtYmVyLgorICBFWFBFQ1RfQ0FMTChmb28sIEJhcihUcnVseShJc0V2ZW4pKSk7CitgYGAKKworTm90ZSB0aGF0IHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gLyBmdW5jdG9yIGRvZXNuJ3QgaGF2ZSB0byByZXR1cm4KK2Bib29sYC4gSXQgd29ya3MgYXMgbG9uZyBhcyB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZQorY29uZGl0aW9uIGluIHN0YXRlbWVudCBgaWYgKGNvbmRpdGlvbikgLi4uYC4KKworIyMgTWF0Y2hpbmcgQXJndW1lbnRzIHRoYXQgQXJlIE5vdCBDb3B5YWJsZSAjIworCitXaGVuIHlvdSBkbyBhbiBgRVhQRUNUX0NBTEwobW9ja19vYmosIEZvbyhiYXIpKWAsIEdvb2dsZSBNb2NrIHNhdmVzCithd2F5IGEgY29weSBvZiBgYmFyYC4gV2hlbiBgRm9vKClgIGlzIGNhbGxlZCBsYXRlciwgR29vZ2xlIE1vY2sKK2NvbXBhcmVzIHRoZSBhcmd1bWVudCB0byBgRm9vKClgIHdpdGggdGhlIHNhdmVkIGNvcHkgb2YgYGJhcmAuIFRoaXMKK3dheSwgeW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgYGJhcmAgYmVpbmcgbW9kaWZpZWQgb3IgZGVzdHJveWVkCithZnRlciB0aGUgYEVYUEVDVF9DQUxMKClgIGlzIGV4ZWN1dGVkLiBUaGUgc2FtZSBpcyB0cnVlIHdoZW4geW91IHVzZQorbWF0Y2hlcnMgbGlrZSBgRXEoYmFyKWAsIGBMZShiYXIpYCwgYW5kIHNvIG9uLgorCitCdXQgd2hhdCBpZiBgYmFyYCBjYW5ub3QgYmUgY29waWVkIChpLmUuIGhhcyBubyBjb3B5IGNvbnN0cnVjdG9yKT8gWW91Citjb3VsZCBkZWZpbmUgeW91ciBvd24gbWF0Y2hlciBmdW5jdGlvbiBhbmQgdXNlIGl0IHdpdGggYFRydWx5KClgLCBhcwordGhlIHByZXZpb3VzIGNvdXBsZSBvZiByZWNpcGVzIGhhdmUgc2hvd24uIE9yLCB5b3UgbWF5IGJlIGFibGUgdG8gZ2V0Cithd2F5IGZyb20gaXQgaWYgeW91IGNhbiBndWFyYW50ZWUgdGhhdCBgYmFyYCB3b24ndCBiZSBjaGFuZ2VkIGFmdGVyCit0aGUgYEVYUEVDVF9DQUxMKClgIGlzIGV4ZWN1dGVkLiBKdXN0IHRlbGwgR29vZ2xlIE1vY2sgdGhhdCBpdCBzaG91bGQKK3NhdmUgYSByZWZlcmVuY2UgdG8gYGJhcmAsIGluc3RlYWQgb2YgYSBjb3B5IG9mIGl0LiBIZXJlJ3MgaG93OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RXE7Cit1c2luZyA6OnRlc3Rpbmc6OkJ5UmVmOwordXNpbmcgOjp0ZXN0aW5nOjpMdDsKKy4uLgorICAvLyBFeHBlY3RzIHRoYXQgRm9vKCkncyBhcmd1bWVudCA9PSBiYXIuCisgIEVYUEVDVF9DQUxMKG1vY2tfb2JqLCBGb28oRXEoQnlSZWYoYmFyKSkpKTsKKworICAvLyBFeHBlY3RzIHRoYXQgRm9vKCkncyBhcmd1bWVudCA8IGJhci4KKyAgRVhQRUNUX0NBTEwobW9ja19vYmosIEZvbyhMdChCeVJlZihiYXIpKSkpOworYGBgCisKK1JlbWVtYmVyOiBpZiB5b3UgZG8gdGhpcywgZG9uJ3QgY2hhbmdlIGBiYXJgIGFmdGVyIHRoZQorYEVYUEVDVF9DQUxMKClgLCBvciB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KKworIyMgVmFsaWRhdGluZyBhIE1lbWJlciBvZiBhbiBPYmplY3QgIyMKKworT2Z0ZW4gYSBtb2NrIGZ1bmN0aW9uIHRha2VzIGEgcmVmZXJlbmNlIHRvIG9iamVjdCBhcyBhbiBhcmd1bWVudC4gV2hlbgorbWF0Y2hpbmcgdGhlIGFyZ3VtZW50LCB5b3UgbWF5IG5vdCB3YW50IHRvIGNvbXBhcmUgdGhlIGVudGlyZSBvYmplY3QKK2FnYWluc3QgYSBmaXhlZCBvYmplY3QsIGFzIHRoYXQgbWF5IGJlIG92ZXItc3BlY2lmaWNhdGlvbi4gSW5zdGVhZCwKK3lvdSBtYXkgbmVlZCB0byB2YWxpZGF0ZSBhIGNlcnRhaW4gbWVtYmVyIHZhcmlhYmxlIG9yIHRoZSByZXN1bHQgb2YgYQorY2VydGFpbiBnZXR0ZXIgbWV0aG9kIG9mIHRoZSBvYmplY3QuIFlvdSBjYW4gZG8gdGhpcyB3aXRoIGBGaWVsZCgpYAorYW5kIGBQcm9wZXJ0eSgpYC4gTW9yZSBzcGVjaWZpY2FsbHksCisKK2BgYAorRmllbGQoJkZvbzo6YmFyLCBtKQorYGBgCisKK2lzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBgRm9vYCBvYmplY3Qgd2hvc2UgYGJhcmAgbWVtYmVyIHZhcmlhYmxlCitzYXRpc2ZpZXMgbWF0Y2hlciBgbWAuCisKK2BgYAorUHJvcGVydHkoJkZvbzo6YmF6LCBtKQorYGBgCisKK2lzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBgRm9vYCBvYmplY3Qgd2hvc2UgYGJheigpYCBtZXRob2QgcmV0dXJucworYSB2YWx1ZSB0aGF0IHNhdGlzZmllcyBtYXRjaGVyIGBtYC4KKworRm9yIGV4YW1wbGU6CisKKz4gfCBgRmllbGQoJkZvbzo6bnVtYmVyLCBHZSgzKSlgIHwgTWF0Y2hlcyBgeGAgd2hlcmUgYHgubnVtYmVyID49IDNgLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKz4gfCBgUHJvcGVydHkoJkZvbzo6bmFtZSwgU3RhcnRzV2l0aCgiSm9obiAiKSlgIHwgTWF0Y2hlcyBgeGAgd2hlcmUgYHgubmFtZSgpYCBzdGFydHMgd2l0aCBgIkpvaG4gImAuIHwKKworTm90ZSB0aGF0IGluIGBQcm9wZXJ0eSgmRm9vOjpiYXosIC4uLilgLCBtZXRob2QgYGJheigpYCBtdXN0IHRha2Ugbm8KK2FyZ3VtZW50IGFuZCBiZSBkZWNsYXJlZCBhcyBgY29uc3RgLgorCitCVFcsIGBGaWVsZCgpYCBhbmQgYFByb3BlcnR5KClgIGNhbiBhbHNvIG1hdGNoIHBsYWluIHBvaW50ZXJzIHRvCitvYmplY3RzLiBGb3IgaW5zdGFuY2UsCisKK2BgYAorRmllbGQoJkZvbzo6bnVtYmVyLCBHZSgzKSkKK2BgYAorCittYXRjaGVzIGEgcGxhaW4gcG9pbnRlciBgcGAgd2hlcmUgYHAtPm51bWJlciA+PSAzYC4gSWYgYHBgIGlzIGBOVUxMYCwKK3RoZSBtYXRjaCB3aWxsIGFsd2F5cyBmYWlsIHJlZ2FyZGxlc3Mgb2YgdGhlIGlubmVyIG1hdGNoZXIuCisKK1doYXQgaWYgeW91IHdhbnQgdG8gdmFsaWRhdGUgbW9yZSB0aGFuIG9uZSBtZW1iZXJzIGF0IHRoZSBzYW1lIHRpbWU/CitSZW1lbWJlciB0aGF0IHRoZXJlIGlzIGBBbGxPZigpYC4KKworIyMgVmFsaWRhdGluZyB0aGUgVmFsdWUgUG9pbnRlZCB0byBieSBhIFBvaW50ZXIgQXJndW1lbnQgIyMKKworQysrIGZ1bmN0aW9ucyBvZnRlbiB0YWtlIHBvaW50ZXJzIGFzIGFyZ3VtZW50cy4gWW91IGNhbiB1c2UgbWF0Y2hlcnMKK2xpa2UgYE5VTExgLCBgTm90TnVsbCgpYCwgYW5kIG90aGVyIGNvbXBhcmlzb24gbWF0Y2hlcnMgdG8gbWF0Y2ggYQorcG9pbnRlciwgYnV0IHdoYXQgaWYgeW91IHdhbnQgdG8gbWFrZSBzdXJlIHRoZSB2YWx1ZSBfcG9pbnRlZCB0b18gYnkKK3RoZSBwb2ludGVyLCBpbnN0ZWFkIG9mIHRoZSBwb2ludGVyIGl0c2VsZiwgaGFzIGEgY2VydGFpbiBwcm9wZXJ0eT8KK1dlbGwsIHlvdSBjYW4gdXNlIHRoZSBgUG9pbnRlZShtKWAgbWF0Y2hlci4KKworYFBvaW50ZWUobSlgIG1hdGNoZXMgYSBwb2ludGVyIGlmZiBgbWAgbWF0Y2hlcyB0aGUgdmFsdWUgdGhlIHBvaW50ZXIKK3BvaW50cyB0by4gRm9yIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpHZTsKK3VzaW5nIDo6dGVzdGluZzo6UG9pbnRlZTsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIEJhcihQb2ludGVlKEdlKDMpKSkpOworYGBgCisKK2V4cGVjdHMgYGZvby5CYXIoKWAgdG8gYmUgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgdmFsdWUKK2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAzLgorCitPbmUgbmljZSB0aGluZyBhYm91dCBgUG9pbnRlZSgpYCBpcyB0aGF0IGl0IHRyZWF0cyBhIGBOVUxMYCBwb2ludGVyIGFzCithIG1hdGNoIGZhaWx1cmUsIHNvIHlvdSBjYW4gd3JpdGUgYFBvaW50ZWUobSlgIGluc3RlYWQgb2YKKworYGBgCisgIEFsbE9mKE5vdE51bGwoKSwgUG9pbnRlZShtKSkKK2BgYAorCit3aXRob3V0IHdvcnJ5aW5nIHRoYXQgYSBgTlVMTGAgcG9pbnRlciB3aWxsIGNyYXNoIHlvdXIgdGVzdC4KKworQWxzbywgZGlkIHdlIHRlbGwgeW91IHRoYXQgYFBvaW50ZWUoKWAgd29ya3Mgd2l0aCBib3RoIHJhdyBwb2ludGVycworKiphbmQqKiBzbWFydCBwb2ludGVycyAoYGxpbmtlZF9wdHJgLCBgc2hhcmVkX3B0cmAsIGBzY29wZWRfcHRyYCwgYW5kCitldGMpPworCitXaGF0IGlmIHlvdSBoYXZlIGEgcG9pbnRlciB0byBwb2ludGVyPyBZb3UgZ3Vlc3NlZCBpdCAtIHlvdSBjYW4gdXNlCituZXN0ZWQgYFBvaW50ZWUoKWAgdG8gcHJvYmUgZGVlcGVyIGluc2lkZSB0aGUgdmFsdWUuIEZvciBleGFtcGxlLAorYFBvaW50ZWUoUG9pbnRlZShMdCgzKSkpYCBtYXRjaGVzIGEgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIHBvaW50ZXIKK3RoYXQgcG9pbnRzIHRvIGEgbnVtYmVyIGxlc3MgdGhhbiAzICh3aGF0IGEgbW91dGhmdWwuLi4pLgorCisjIyBUZXN0aW5nIGEgQ2VydGFpbiBQcm9wZXJ0eSBvZiBhbiBPYmplY3QgIyMKKworU29tZXRpbWVzIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhhdCBhbiBvYmplY3QgYXJndW1lbnQgaGFzIGEgY2VydGFpbgorcHJvcGVydHksIGJ1dCB0aGVyZSBpcyBubyBleGlzdGluZyBtYXRjaGVyIHRoYXQgZG9lcyB0aGlzLiBJZiB5b3Ugd2FudAorZ29vZCBlcnJvciBtZXNzYWdlcywgeW91IHNob3VsZCBkZWZpbmUgYSBtYXRjaGVyLiBJZiB5b3Ugd2FudCB0byBkbyBpdAorcXVpY2sgYW5kIGRpcnR5LCB5b3UgY291bGQgZ2V0IGF3YXkgd2l0aCB3cml0aW5nIGFuIG9yZGluYXJ5IGZ1bmN0aW9uLgorCitMZXQncyBzYXkgeW91IGhhdmUgYSBtb2NrIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gb2JqZWN0IG9mIHR5cGUgYEZvb2AsCit3aGljaCBoYXMgYW4gYGludCBiYXIoKWAgbWV0aG9kIGFuZCBhbiBgaW50IGJheigpYCBtZXRob2QsIGFuZCB5b3UKK3dhbnQgdG8gY29uc3RyYWluIHRoYXQgdGhlIGFyZ3VtZW50J3MgYGJhcigpYCB2YWx1ZSBwbHVzIGl0cyBgYmF6KClgCit2YWx1ZSBpcyBhIGdpdmVuIG51bWJlci4gSGVyZSdzIGhvdyB5b3UgY2FuIGRlZmluZSBhIG1hdGNoZXIgdG8gZG8gaXQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworCitjbGFzcyBCYXJQbHVzQmF6RXFNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Y29uc3QgRm9vJj4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQmFyUGx1c0JhekVxTWF0Y2hlcihpbnQgZXhwZWN0ZWRfc3VtKQorICAgICAgOiBleHBlY3RlZF9zdW1fKGV4cGVjdGVkX3N1bSkge30KKworICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IEZvbyYgZm9vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgcmV0dXJuIChmb28uYmFyKCkgKyBmb28uYmF6KCkpID09IGV4cGVjdGVkX3N1bV87CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImJhcigpICsgYmF6KCkgZXF1YWxzICIgPDwgZXhwZWN0ZWRfc3VtXzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJiYXIoKSArIGJheigpIGRvZXMgbm90IGVxdWFsICIgPDwgZXhwZWN0ZWRfc3VtXzsKKyAgfQorIHByaXZhdGU6CisgIGNvbnN0IGludCBleHBlY3RlZF9zdW1fOworfTsKKworaW5saW5lIE1hdGNoZXI8Y29uc3QgRm9vJj4gQmFyUGx1c0JhekVxKGludCBleHBlY3RlZF9zdW0pIHsKKyAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBCYXJQbHVzQmF6RXFNYXRjaGVyKGV4cGVjdGVkX3N1bSkpOworfQorCisuLi4KKworICBFWFBFQ1RfQ0FMTCguLi4sIERvVGhpcyhCYXJQbHVzQmF6RXEoNSkpKS4uLjsKK2BgYAorCisjIyBNYXRjaGluZyBDb250YWluZXJzICMjCisKK1NvbWV0aW1lcyBhbiBTVEwgY29udGFpbmVyIChlLmcuIGxpc3QsIHZlY3RvciwgbWFwLCAuLi4pIGlzIHBhc3NlZCB0bworYSBtb2NrIGZ1bmN0aW9uIGFuZCB5b3UgbWF5IHdhbnQgdG8gdmFsaWRhdGUgaXQuIFNpbmNlIG1vc3QgU1RMCitjb250YWluZXJzIHN1cHBvcnQgdGhlIGA9PWAgb3BlcmF0b3IsIHlvdSBjYW4gd3JpdGUKK2BFcShleHBlY3RlZF9jb250YWluZXIpYCBvciBzaW1wbHkgYGV4cGVjdGVkX2NvbnRhaW5lcmAgdG8gbWF0Y2ggYQorY29udGFpbmVyIGV4YWN0bHkuCisKK1NvbWV0aW1lcywgdGhvdWdoLCB5b3UgbWF5IHdhbnQgdG8gYmUgbW9yZSBmbGV4aWJsZSAoZm9yIGV4YW1wbGUsIHRoZQorZmlyc3QgZWxlbWVudCBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoLCBidXQgdGhlIHNlY29uZCBlbGVtZW50IGNhbiBiZQorYW55IHBvc2l0aXZlIG51bWJlciwgYW5kIHNvIG9uKS4gQWxzbywgY29udGFpbmVycyB1c2VkIGluIHRlc3RzIG9mdGVuCitoYXZlIGEgc21hbGwgbnVtYmVyIG9mIGVsZW1lbnRzLCBhbmQgaGF2aW5nIHRvIGRlZmluZSB0aGUgZXhwZWN0ZWQKK2NvbnRhaW5lciBvdXQtb2YtbGluZSBpcyBhIGJpdCBvZiBhIGhhc3NsZS4KKworWW91IGNhbiB1c2UgdGhlIGBFbGVtZW50c0FyZSgpYCBtYXRjaGVyIGluIHN1Y2ggY2FzZXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpFbGVtZW50c0FyZTsKK3VzaW5nIDo6dGVzdGluZzo6R3Q7CisuLi4KKworICBNT0NLX01FVEhPRDEoRm9vLCB2b2lkKGNvbnN0IHZlY3RvcjxpbnQ+JiBudW1iZXJzKSk7CisuLi4KKworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oRWxlbWVudHNBcmUoMSwgR3QoMCksIF8sIDUpKSk7CitgYGAKKworVGhlIGFib3ZlIG1hdGNoZXIgc2F5cyB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBoYXZlIDQgZWxlbWVudHMsIHdoaWNoCittdXN0IGJlIDEsIGdyZWF0ZXIgdGhhbiAwLCBhbnl0aGluZywgYW5kIDUgcmVzcGVjdGl2ZWx5LgorCitgRWxlbWVudHNBcmUoKWAgaXMgb3ZlcmxvYWRlZCB0byB0YWtlIDAgdG8gMTAgYXJndW1lbnRzLiBJZiBtb3JlIGFyZQorbmVlZGVkLCB5b3UgY2FuIHBsYWNlIHRoZW0gaW4gYSBDLXN0eWxlIGFycmF5IGFuZCB1c2UKK2BFbGVtZW50c0FyZUFycmF5KClgIGluc3RlYWQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpFbGVtZW50c0FyZUFycmF5OworLi4uCisKKyAgLy8gRWxlbWVudHNBcmVBcnJheSBhY2NlcHRzIGFuIGFycmF5IG9mIGVsZW1lbnQgdmFsdWVzLgorICBjb25zdCBpbnQgZXhwZWN0ZWRfdmVjdG9yMVtdID0geyAxLCA1LCAyLCA0LCAuLi4gfTsKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKEVsZW1lbnRzQXJlQXJyYXkoZXhwZWN0ZWRfdmVjdG9yMSkpKTsKKworICAvLyBPciwgYW4gYXJyYXkgb2YgZWxlbWVudCBtYXRjaGVycy4KKyAgTWF0Y2hlcjxpbnQ+IGV4cGVjdGVkX3ZlY3RvcjIgPSB7IDEsIEd0KDIpLCBfLCAzLCAuLi4gfTsKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKEVsZW1lbnRzQXJlQXJyYXkoZXhwZWN0ZWRfdmVjdG9yMikpKTsKK2BgYAorCitJbiBjYXNlIHRoZSBhcnJheSBuZWVkcyB0byBiZSBkeW5hbWljYWxseSBjcmVhdGVkIChhbmQgdGhlcmVmb3JlIHRoZQorYXJyYXkgc2l6ZSBjYW5ub3QgYmUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyKSwgeW91IGNhbiBnaXZlCitgRWxlbWVudHNBcmVBcnJheSgpYCBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHNwZWNpZnkgdGhlIGFycmF5IHNpemU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpFbGVtZW50c0FyZUFycmF5OworLi4uCisgIGludCogY29uc3QgZXhwZWN0ZWRfdmVjdG9yMyA9IG5ldyBpbnRbY291bnRdOworICAuLi4gZmlsbCBleHBlY3RlZF92ZWN0b3IzIHdpdGggdmFsdWVzIC4uLgorICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oRWxlbWVudHNBcmVBcnJheShleHBlY3RlZF92ZWN0b3IzLCBjb3VudCkpKTsKK2BgYAorCisqKlRpcHM6KioKKworICAqIGBFbGVtZW50QXJlKigpYCB3b3JrcyB3aXRoIF9hbnlfIGNvbnRhaW5lciB0aGF0IGltcGxlbWVudHMgdGhlIFNUTCBpdGVyYXRvciBjb25jZXB0IChpLmUuIGl0IGhhcyBhIGBjb25zdF9pdGVyYXRvcmAgdHlwZSBhbmQgc3VwcG9ydHMgYGJlZ2luKCkvZW5kKClgKSBhbmQgc3VwcG9ydHMgYHNpemUoKWAsIG5vdCBqdXN0IHRoZSBvbmVzIGRlZmluZWQgaW4gU1RMLiBJdCB3aWxsIGV2ZW4gd29yayB3aXRoIGNvbnRhaW5lciB0eXBlcyB5ZXQgdG8gYmUgd3JpdHRlbiAtIGFzIGxvbmcgYXMgdGhleSBmb2xsb3dzIHRoZSBhYm92ZSBwYXR0ZXJuLgorICAqIFlvdSBjYW4gdXNlIG5lc3RlZCBgRWxlbWVudEFyZSooKWAgdG8gbWF0Y2ggbmVzdGVkIChtdWx0aS1kaW1lbnNpb25hbCkgY29udGFpbmVycy4KKyAgKiBJZiB0aGUgY29udGFpbmVyIGlzIHBhc3NlZCBieSBwb2ludGVyIGluc3RlYWQgb2YgYnkgcmVmZXJlbmNlLCBqdXN0IHdyaXRlIGBQb2ludGVlKEVsZW1lbnRzQXJlKiguLi4pKWAuCisgICogVGhlIG9yZGVyIG9mIGVsZW1lbnRzIF9tYXR0ZXJzXyBmb3IgYEVsZW1lbnRzQXJlKigpYC4gVGhlcmVmb3JlIGRvbid0IHVzZSBpdCB3aXRoIGNvbnRhaW5lcnMgd2hvc2UgZWxlbWVudCBvcmRlciBpcyB1bmRlZmluZWQgKGUuZy4gYGhhc2hfbWFwYCkuCisKKyMjIFNoYXJpbmcgTWF0Y2hlcnMgIyMKKworVW5kZXIgdGhlIGhvb2QsIGEgR29vZ2xlIE1vY2sgbWF0Y2hlciBvYmplY3QgY29uc2lzdHMgb2YgYSBwb2ludGVyIHRvCithIHJlZi1jb3VudGVkIGltcGxlbWVudGF0aW9uIG9iamVjdC4gQ29weWluZyBtYXRjaGVycyBpcyBhbGxvd2VkIGFuZAordmVyeSBlZmZpY2llbnQsIGFzIG9ubHkgdGhlIHBvaW50ZXIgaXMgY29waWVkLiBXaGVuIHRoZSBsYXN0IG1hdGNoZXIKK3RoYXQgcmVmZXJlbmNlcyB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0IGRpZXMsIHRoZSBpbXBsZW1lbnRhdGlvbgorb2JqZWN0IHdpbGwgYmUgZGVsZXRlZC4KKworVGhlcmVmb3JlLCBpZiB5b3UgaGF2ZSBzb21lIGNvbXBsZXggbWF0Y2hlciB0aGF0IHlvdSB3YW50IHRvIHVzZSBhZ2FpbgorYW5kIGFnYWluLCB0aGVyZSBpcyBubyBuZWVkIHRvIGJ1aWxkIGl0IGV2ZXJ5dGltZS4gSnVzdCBhc3NpZ24gaXQgdG8gYQorbWF0Y2hlciB2YXJpYWJsZSBhbmQgdXNlIHRoYXQgdmFyaWFibGUgcmVwZWF0ZWRseSEgRm9yIGV4YW1wbGUsCisKK2BgYAorICBNYXRjaGVyPGludD4gaW5fcmFuZ2UgPSBBbGxPZihHdCg1KSwgTGUoMTApKTsKKyAgLi4uIHVzZSBpbl9yYW5nZSBhcyBhIG1hdGNoZXIgaW4gbXVsdGlwbGUgRVhQRUNUX0NBTExzIC4uLgorYGBgCisKKyMgU2V0dGluZyBFeHBlY3RhdGlvbnMgIworCisjIyBJZ25vcmluZyBVbmludGVyZXN0aW5nIENhbGxzICMjCisKK0lmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaG93IGEgbW9jayBtZXRob2QgaXMgY2FsbGVkLCBqdXN0IGRvbid0CitzYXkgYW55dGhpbmcgYWJvdXQgaXQuIEluIHRoaXMgY2FzZSwgaWYgdGhlIG1ldGhvZCBpcyBldmVyIGNhbGxlZCwKK0dvb2dsZSBNb2NrIHdpbGwgcGVyZm9ybSBpdHMgZGVmYXVsdCBhY3Rpb24gdG8gYWxsb3cgdGhlIHRlc3QgcHJvZ3JhbQordG8gY29udGludWUuIElmIHlvdSBhcmUgbm90IGhhcHB5IHdpdGggdGhlIGRlZmF1bHQgYWN0aW9uIHRha2VuIGJ5CitHb29nbGUgTW9jaywgeW91IGNhbiBvdmVycmlkZSBpdCB1c2luZyBgRGVmYXVsdFZhbHVlPFQ+OjpTZXQoKWAKKyhkZXNjcmliZWQgbGF0ZXIgaW4gdGhpcyBkb2N1bWVudCkgb3IgYE9OX0NBTEwoKWAuCisKK1BsZWFzZSBub3RlIHRoYXQgb25jZSB5b3UgZXhwcmVzc2VkIGludGVyZXN0IGluIGEgcGFydGljdWxhciBtb2NrCittZXRob2QgKHZpYSBgRVhQRUNUX0NBTEwoKWApLCBhbGwgaW52b2NhdGlvbnMgdG8gaXQgbXVzdCBtYXRjaCBzb21lCitleHBlY3RhdGlvbi4gSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnV0IHRoZSBhcmd1bWVudHMgZG9uJ3QgbWF0Y2gKK2FueSBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50LCBpdCB3aWxsIGJlIGFuIGVycm9yLgorCisjIyBEaXNhbGxvd2luZyBVbmV4cGVjdGVkIENhbGxzICMjCisKK0lmIGEgbW9jayBtZXRob2Qgc2hvdWxkbid0IGJlIGNhbGxlZCBhdCBhbGwsIGV4cGxpY2l0bHkgc2F5IHNvOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfKSkKKyAgICAgIC5UaW1lcygwKTsKK2BgYAorCitJZiBzb21lIGNhbGxzIHRvIHRoZSBtZXRob2QgYXJlIGFsbG93ZWQsIGJ1dCB0aGUgcmVzdCBhcmUgbm90LCBqdXN0CitsaXN0IGFsbCB0aGUgZXhwZWN0ZWQgY2FsbHM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Cit1c2luZyA6OnRlc3Rpbmc6Okd0OworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKDUpKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoR3QoMTApKSkKKyAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CitgYGAKKworQSBjYWxsIHRvIGBmb28uQmFyKClgIHRoYXQgZG9lc24ndCBtYXRjaCBhbnkgb2YgdGhlIGBFWFBFQ1RfQ0FMTCgpYAorc3RhdGVtZW50cyB3aWxsIGJlIGFuIGVycm9yLgorCisjIyBFeHBlY3RpbmcgT3JkZXJlZCBDYWxscyAjIworCitBbHRob3VnaCBhbiBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50IGRlZmluZWQgZWFybGllciB0YWtlcyBwcmVjZWRlbmNlCit3aGVuIEdvb2dsZSBNb2NrIHRyaWVzIHRvIG1hdGNoIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGFuIGV4cGVjdGF0aW9uLAorYnkgZGVmYXVsdCBjYWxscyBkb24ndCBoYXZlIHRvIGhhcHBlbiBpbiB0aGUgb3JkZXIgYEVYUEVDVF9DQUxMKClgCitzdGF0ZW1lbnRzIGFyZSB3cml0dGVuLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFyZ3VtZW50cyBtYXRjaCB0aGUKK21hdGNoZXJzIGluIHRoZSB0aGlyZCBgRVhQRUNUX0NBTEwoKWAsIGJ1dCBub3QgdGhvc2UgaW4gdGhlIGZpcnN0IHR3bywKK3RoZW4gdGhlIHRoaXJkIGV4cGVjdGF0aW9uIHdpbGwgYmUgdXNlZC4KKworSWYgeW91IHdvdWxkIHJhdGhlciBoYXZlIGFsbCBjYWxscyBvY2N1ciBpbiB0aGUgb3JkZXIgb2YgdGhlCitleHBlY3RhdGlvbnMsIHB1dCB0aGUgYEVYUEVDVF9DQUxMKClgIHN0YXRlbWVudHMgaW4gYSBibG9jayB3aGVyZSB5b3UKK2RlZmluZSBhIHZhcmlhYmxlIG9mIHR5cGUgYEluU2VxdWVuY2VgOgorCitgYGAKKyAgdXNpbmcgOjp0ZXN0aW5nOjpfOworICB1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7CisKKyAgeworICAgIEluU2VxdWVuY2UgczsKKworICAgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDUpKTsKKyAgICBFWFBFQ1RfQ0FMTChiYXIsIERvVGhhdChfKSkKKyAgICAgICAgLlRpbWVzKDIpOworICAgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDYpKTsKKyAgfQorYGBgCisKK0luIHRoaXMgZXhhbXBsZSwgd2UgZXhwZWN0IGEgY2FsbCB0byBgZm9vLkRvVGhpcyg1KWAsIGZvbGxvd2VkIGJ5IHR3bworY2FsbHMgdG8gYGJhci5Eb1RoYXQoKWAgd2hlcmUgdGhlIGFyZ3VtZW50IGNhbiBiZSBhbnl0aGluZywgd2hpY2ggYXJlCitpbiB0dXJuIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byBgZm9vLkRvVGhpcyg2KWAuIElmIGEgY2FsbCBvY2N1cnJlZAorb3V0LW9mLW9yZGVyLCBHb29nbGUgTW9jayB3aWxsIHJlcG9ydCBhbiBlcnJvci4KKworIyMgRXhwZWN0aW5nIFBhcnRpYWxseSBPcmRlcmVkIENhbGxzICMjCisKK1NvbWV0aW1lcyByZXF1aXJpbmcgZXZlcnl0aGluZyB0byBvY2N1ciBpbiBhIHByZWRldGVybWluZWQgb3JkZXIgY2FuCitsZWFkIHRvIGJyaXR0bGUgdGVzdHMuIEZvciBleGFtcGxlLCB3ZSBtYXkgY2FyZSBhYm91dCBgQWAgb2NjdXJyaW5nCitiZWZvcmUgYm90aCBgQmAgYW5kIGBDYCwgYnV0IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGl2ZSBvcmRlcgorb2YgYEJgIGFuZCBgQ2AuIEluIHRoaXMgY2FzZSwgdGhlIHRlc3Qgc2hvdWxkIHJlZmxlY3Qgb3VyIHJlYWwgaW50ZW50LAoraW5zdGVhZCBvZiBiZWluZyBvdmVybHkgY29uc3RyYWluaW5nLgorCitHb29nbGUgTW9jayBhbGxvd3MgeW91IHRvIGltcG9zZSBhbiBhcmJpdHJhcnkgREFHIChkaXJlY3RlZCBhY3ljbGljCitncmFwaCkgb24gdGhlIGNhbGxzLiBPbmUgd2F5IHRvIGV4cHJlc3MgdGhlIERBRyBpcyB0byB1c2UgdGhlCitbQWZ0ZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfNl9DaGVhdFNoZWV0I1RoZV9BZnRlcl9DbGF1c2UpIGNsYXVzZSBvZiBgRVhQRUNUX0NBTExgLgorCitBbm90aGVyIHdheSBpcyB2aWEgdGhlIGBJblNlcXVlbmNlKClgIGNsYXVzZSAobm90IHRoZSBzYW1lIGFzIHRoZQorYEluU2VxdWVuY2VgIGNsYXNzKSwgd2hpY2ggd2UgYm9ycm93ZWQgZnJvbSBqTW9jayAyLiBJdCdzIGxlc3MKK2ZsZXhpYmxlIHRoYW4gYEFmdGVyKClgLCBidXQgbW9yZSBjb252ZW5pZW50IHdoZW4geW91IGhhdmUgbG9uZyBjaGFpbnMKK29mIHNlcXVlbnRpYWwgY2FsbHMsIGFzIGl0IGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8gY29tZSB1cCB3aXRoCitkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSBleHBlY3RhdGlvbnMgaW4gdGhlIGNoYWlucy4gIEhlcmUncyBob3cgaXQKK3dvcmtzOgorCitJZiB3ZSB2aWV3IGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnRzIGFzIG5vZGVzIGluIGEgZ3JhcGgsIGFuZCBhZGQgYW4KK2VkZ2UgZnJvbSBub2RlIEEgdG8gbm9kZSBCIHdoZXJldmVyIEEgbXVzdCBvY2N1ciBiZWZvcmUgQiwgd2UgY2FuIGdldAorYSBEQUcuIFdlIHVzZSB0aGUgdGVybSAic2VxdWVuY2UiIHRvIG1lYW4gYSBkaXJlY3RlZCBwYXRoIGluIHRoaXMKK0RBRy4gTm93LCBpZiB3ZSBkZWNvbXBvc2UgdGhlIERBRyBpbnRvIHNlcXVlbmNlcywgd2UganVzdCBuZWVkIHRvIGtub3cKK3doaWNoIHNlcXVlbmNlcyBlYWNoIGBFWFBFQ1RfQ0FMTCgpYCBiZWxvbmdzIHRvIGluIG9yZGVyIHRvIGJlIGFibGUgdG8KK3JlY29uc3RydWN0IHRoZSBvcmdpbmFsIERBRy4KKworU28sIHRvIHNwZWNpZnkgdGhlIHBhcnRpYWwgb3JkZXIgb24gdGhlIGV4cGVjdGF0aW9ucyB3ZSBuZWVkIHRvIGRvIHR3bwordGhpbmdzOiBmaXJzdCB0byBkZWZpbmUgc29tZSBgU2VxdWVuY2VgIG9iamVjdHMsIGFuZCB0aGVuIGZvciBlYWNoCitgRVhQRUNUX0NBTEwoKWAgc2F5IHdoaWNoIGBTZXF1ZW5jZWAgb2JqZWN0cyBpdCBpcyBwYXJ0CitvZi4gRXhwZWN0YXRpb25zIGluIHRoZSBzYW1lIHNlcXVlbmNlIG11c3Qgb2NjdXIgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCit3cml0dGVuLiBGb3IgZXhhbXBsZSwKKworYGBgCisgIHVzaW5nIDo6dGVzdGluZzo6U2VxdWVuY2U7CisKKyAgU2VxdWVuY2UgczEsIHMyOworCisgIEVYUEVDVF9DQUxMKGZvbywgQSgpKQorICAgICAgLkluU2VxdWVuY2UoczEsIHMyKTsKKyAgRVhQRUNUX0NBTEwoYmFyLCBCKCkpCisgICAgICAuSW5TZXF1ZW5jZShzMSk7CisgIEVYUEVDVF9DQUxMKGJhciwgQygpKQorICAgICAgLkluU2VxdWVuY2UoczIpOworICBFWFBFQ1RfQ0FMTChmb28sIEQoKSkKKyAgICAgIC5JblNlcXVlbmNlKHMyKTsKK2BgYAorCitzcGVjaWZpZXMgdGhlIGZvbGxvd2luZyBEQUcgKHdoZXJlIGBzMWAgaXMgYEEgLT4gQmAsIGFuZCBgczJgIGlzIGBBIC0+CitDIC0+IERgKToKKworYGBgCisgICAgICAgKy0tLT4gQgorICAgICAgIHwKKyAgQSAtLS18CisgICAgICAgfAorICAgICAgICstLS0+IEMgLS0tPiBECitgYGAKKworVGhpcyBtZWFucyB0aGF0IEEgbXVzdCBvY2N1ciBiZWZvcmUgQiBhbmQgQywgYW5kIEMgbXVzdCBvY2N1ciBiZWZvcmUKK0QuIFRoZXJlJ3Mgbm8gcmVzdHJpY3Rpb24gYWJvdXQgdGhlIG9yZGVyIG90aGVyIHRoYW4gdGhlc2UuCisKKyMjIENvbnRyb2xsaW5nIFdoZW4gYW4gRXhwZWN0YXRpb24gUmV0aXJlcyAjIworCitXaGVuIGEgbW9jayBtZXRob2QgaXMgY2FsbGVkLCBHb29nbGUgTW9jayBvbmx5IGNvbnNpZGVyIGV4cGVjdGF0aW9ucwordGhhdCBhcmUgc3RpbGwgYWN0aXZlLiBBbiBleHBlY3RhdGlvbiBpcyBhY3RpdmUgd2hlbiBjcmVhdGVkLCBhbmQKK2JlY29tZXMgaW5hY3RpdmUgKGFrYSBfcmV0aXJlc18pIHdoZW4gYSBjYWxsIHRoYXQgaGFzIHRvIG9jY3VyIGxhdGVyCitoYXMgb2NjdXJyZWQuIEZvciBleGFtcGxlLCBpbgorCitgYGAKKyAgdXNpbmcgOjp0ZXN0aW5nOjpfOworICB1c2luZyA6OnRlc3Rpbmc6OlNlcXVlbmNlOworCisgIFNlcXVlbmNlIHMxLCBzMjsKKworICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCAiRmlsZSB0b28gbGFyZ2UuIikpICAgICAvLyAjMQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKQorICAgICAgLkluU2VxdWVuY2UoczEsIHMyKTsKKyAgRVhQRUNUX0NBTEwobG9nLCBMb2coV0FSTklORywgXywgIkRhdGEgc2V0IGlzIGVtcHR5LiIpKSAgLy8gIzIKKyAgICAgIC5JblNlcXVlbmNlKHMxKTsKKyAgRVhQRUNUX0NBTEwobG9nLCBMb2coV0FSTklORywgXywgIlVzZXIgbm90IGZvdW5kLiIpKSAgICAgLy8gIzMKKyAgICAgIC5JblNlcXVlbmNlKHMyKTsKK2BgYAorCithcyBzb29uIGFzIGVpdGhlciAjMiBvciAjMyBpcyBtYXRjaGVkLCAjMSB3aWxsIHJldGlyZS4gSWYgYSB3YXJuaW5nCitgIkZpbGUgdG9vIGxhcmdlLiJgIGlzIGxvZ2dlZCBhZnRlciB0aGlzLCBpdCB3aWxsIGJlIGFuIGVycm9yLgorCitOb3RlIHRoYXQgYW4gZXhwZWN0YXRpb24gZG9lc24ndCByZXRpcmUgYXV0b21hdGljYWxseSB3aGVuIGl0J3MKK3NhdHVyYXRlZC4gRm9yIGV4YW1wbGUsCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sIF8pKTsgICAgICAgICAgICAgICAgICAvLyAjMQorICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCAiRmlsZSB0b28gbGFyZ2UuIikpOyAgLy8gIzIKK2BgYAorCitzYXlzIHRoYXQgdGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSB3YXJuaW5nIHdpdGggdGhlIG1lc3NhZ2UgYCJGaWxlCit0b28gbGFyZ2UuImAuIElmIHRoZSBzZWNvbmQgd2FybmluZyBjb250YWlucyB0aGlzIG1lc3NhZ2UgdG9vLCAjMiB3aWxsCittYXRjaCBhZ2FpbiBhbmQgcmVzdWx0IGluIGFuIHVwcGVyLWJvdW5kLXZpb2xhdGVkIGVycm9yLgorCitJZiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50LCB5b3UgY2FuIGFzayBhbiBleHBlY3RhdGlvbiB0byByZXRpcmUgYXMKK3Nvb24gYXMgaXQgYmVjb21lcyBzYXR1cmF0ZWQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sIF8pKTsgICAgICAgICAgICAgICAgIC8vICMxCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sICJGaWxlIHRvbyBsYXJnZS4iKSkgIC8vICMyCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworYGBgCisKK0hlcmUgIzIgY2FuIGJlIHVzZWQgb25seSBvbmNlLCBzbyBpZiB5b3UgaGF2ZSB0d28gd2FybmluZ3Mgd2l0aCB0aGUKK21lc3NhZ2UgYCJGaWxlIHRvbyBsYXJnZS4iYCwgdGhlIGZpcnN0IHdpbGwgbWF0Y2ggIzIgYW5kIHRoZSBzZWNvbmQKK3dpbGwgbWF0Y2ggIzEgLSB0aGVyZSB3aWxsIGJlIG5vIGVycm9yLgorCisjIFVzaW5nIEFjdGlvbnMgIworCisjIyBSZXR1cm5pbmcgUmVmZXJlbmNlcyBmcm9tIE1vY2sgTWV0aG9kcyAjIworCitJZiBhIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSBpcyBhIHJlZmVyZW5jZSwgeW91IG5lZWQgdG8gdXNlCitgUmV0dXJuUmVmKClgIGluc3RlYWQgb2YgYFJldHVybigpYCB0byByZXR1cm4gYSByZXN1bHQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMChHZXRCYXIsIEJhciYoKSk7Cit9OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEJhciBiYXI7CisgIEVYUEVDVF9DQUxMKGZvbywgR2V0QmFyKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuUmVmKGJhcikpOworYGBgCisKKyMjIFJldHVybmluZyBMaXZlIFZhbHVlcyBmcm9tIE1vY2sgTWV0aG9kcyAjIworCitUaGUgYFJldHVybih4KWAgYWN0aW9uIHNhdmVzIGEgY29weSBvZiBgeGAgd2hlbiB0aGUgYWN0aW9uIGlzCitfY3JlYXRlZF8sIGFuZCBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSB3aGVuZXZlciBpdCdzCitleGVjdXRlZC4gU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0byBpbnN0ZWFkIHJldHVybiB0aGUgX2xpdmVfIHZhbHVlIG9mCitgeGAgKGkuZS4gaXRzIHZhbHVlIGF0IHRoZSB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyBfZXhlY3V0ZWRfLikuCisKK0lmIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UsIHlvdSBjYW4gZG8gaXQgdXNpbmcKK2BSZXR1cm5SZWYoeClgLCBhcyBzaG93biBpbiB0aGUgcHJldmlvdXMgcmVjaXBlICgiUmV0dXJuaW5nIFJlZmVyZW5jZXMKK2Zyb20gTW9jayBNZXRob2RzIikuIEhvd2V2ZXIsIEdvb2dsZSBNb2NrIGRvZXNuJ3QgbGV0IHlvdSB1c2UKK2BSZXR1cm5SZWYoKWAgaW4gYSBtb2NrIGZ1bmN0aW9uIHdob3NlIHJldHVybiB0eXBlIGlzIG5vdCBhIHJlZmVyZW5jZSwKK2FzIGRvaW5nIHRoYXQgdXN1YWxseSBpbmRpY2F0ZXMgYSB1c2VyIGVycm9yLiBTbywgd2hhdCBzaGFsbCB5b3UgZG8/CisKK1lvdSBtYXkgYmUgdGVtcHRlZCB0byB0cnkgYEJ5UmVmKClgOgorCitgYGAKK3VzaW5nIHRlc3Rpbmc6OkJ5UmVmOwordXNpbmcgdGVzdGluZzo6UmV0dXJuOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDAoR2V0VmFsdWUsIGludCgpKTsKK307CisuLi4KKyAgaW50IHggPSAwOworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBHZXRWYWx1ZSgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihCeVJlZih4KSkpOworICB4ID0gNDI7CisgIEVYUEVDVF9FUSg0MiwgZm9vLkdldFZhbHVlKCkpOworYGBgCisKK1VuZm9ydHVuYXRlbHksIGl0IGRvZXNuJ3Qgd29yayBoZXJlLiBUaGUgYWJvdmUgY29kZSB3aWxsIGZhaWwgd2l0aCBlcnJvcjoKKworYGBgCitWYWx1ZSBvZjogZm9vLkdldFZhbHVlKCkKKyAgQWN0dWFsOiAwCitFeHBlY3RlZDogNDIKK2BgYAorCitUaGUgcmVhc29uIGlzIHRoYXQgYFJldHVybih2YWx1ZSlgIGNvbnZlcnRzIGB2YWx1ZWAgdG8gdGhlIGFjdHVhbAorcmV0dXJuIHR5cGUgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXQgdGhlIHRpbWUgd2hlbiB0aGUgYWN0aW9uIGlzCitfY3JlYXRlZF8sIG5vdCB3aGVuIGl0IGlzIF9leGVjdXRlZF8uIChUaGlzIGJlaGF2aW9yIHdhcyBjaG9zZW4gZm9yCit0aGUgYWN0aW9uIHRvIGJlIHNhZmUgd2hlbiBgdmFsdWVgIGlzIGEgcHJveHkgb2JqZWN0IHRoYXQgcmVmZXJlbmNlcworc29tZSB0ZW1wb3Jhcnkgb2JqZWN0cy4pIEFzIGEgcmVzdWx0LCBgQnlSZWYoeClgIGlzIGNvbnZlcnRlZCB0byBhbgorYGludGAgdmFsdWUgKGluc3RlYWQgb2YgYSBgY29uc3QgaW50JmApIHdoZW4gdGhlIGV4cGVjdGF0aW9uIGlzIHNldCwKK2FuZCBgUmV0dXJuKEJ5UmVmKHgpKWAgd2lsbCBhbHdheXMgcmV0dXJuIDAuCisKK2BSZXR1cm5Qb2ludGVlKHBvaW50ZXIpYCB3YXMgcHJvdmlkZWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtCitzcGVjaWZpY2FsbHkuIEl0IHJldHVybnMgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgYHBvaW50ZXJgIGF0IHRoZSB0aW1lCit0aGUgYWN0aW9uIGlzIF9leGVjdXRlZF86CisKK2BgYAordXNpbmcgdGVzdGluZzo6UmV0dXJuUG9pbnRlZTsKKy4uLgorICBpbnQgeCA9IDA7CisgIE1vY2tGb28gZm9vOworICBFWFBFQ1RfQ0FMTChmb28sIEdldFZhbHVlKCkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuUG9pbnRlZSgmeCkpOyAgLy8gTm90ZSB0aGUgJiBoZXJlLgorICB4ID0gNDI7CisgIEVYUEVDVF9FUSg0MiwgZm9vLkdldFZhbHVlKCkpOyAgLy8gVGhpcyB3aWxsIHN1Y2NlZWQgbm93LgorYGBgCisKKyMjIENvbWJpbmluZyBBY3Rpb25zICMjCisKK1dhbnQgdG8gZG8gbW9yZSB0aGFuIG9uZSB0aGluZyB3aGVuIGEgZnVuY3Rpb24gaXMgY2FsbGVkPyBUaGF0J3MKK2ZpbmUuIGBEb0FsbCgpYCBhbGxvdyB5b3UgdG8gZG8gc2VxdWVuY2Ugb2YgYWN0aW9ucyBldmVyeSB0aW1lLiBPbmx5Cit0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYXN0IGFjdGlvbiBpbiB0aGUgc2VxdWVuY2Ugd2lsbCBiZSB1c2VkLgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RG9BbGw7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShCYXIsIGJvb2woaW50IG4pKTsKK307CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfKSkKKyAgICAgIC5XaWxsT25jZShEb0FsbChhY3Rpb25fMSwKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fMiwKKyAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fbikpOworYGBgCisKKyMjIE1vY2tpbmcgU2lkZSBFZmZlY3RzICMjCisKK1NvbWV0aW1lcyBhIG1ldGhvZCBleGhpYml0cyBpdHMgZWZmZWN0IG5vdCB2aWEgcmV0dXJuaW5nIGEgdmFsdWUgYnV0Cit2aWEgc2lkZSBlZmZlY3RzLiBGb3IgZXhhbXBsZSwgaXQgbWF5IGNoYW5nZSBzb21lIGdsb2JhbCBzdGF0ZSBvcgorbW9kaWZ5IGFuIG91dHB1dCBhcmd1bWVudC4gVG8gbW9jayBzaWRlIGVmZmVjdHMsIGluIGdlbmVyYWwgeW91IGNhbgorZGVmaW5lIHlvdXIgb3duIGFjdGlvbiBieSBpbXBsZW1lbnRpbmcgYDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlYC4KKworSWYgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvIGNoYW5nZSBhbiBvdXRwdXQgYXJndW1lbnQsIHRoZSBidWlsdC1pbgorYFNldEFyZ1BvaW50ZWUoKWAgYWN0aW9uIGlzIGNvbnZlbmllbnQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpTZXRBcmdQb2ludGVlOworCitjbGFzcyBNb2NrTXV0YXRvciA6IHB1YmxpYyBNdXRhdG9yIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMihNdXRhdGUsIHZvaWQoYm9vbCBtdXRhdGUsIGludCogdmFsdWUpKTsKKyAgLi4uCit9OworLi4uCisKKyAgTW9ja011dGF0b3IgbXV0YXRvcjsKKyAgRVhQRUNUX0NBTEwobXV0YXRvciwgTXV0YXRlKHRydWUsIF8pKQorICAgICAgLldpbGxPbmNlKFNldEFyZ1BvaW50ZWU8MT4oNSkpOworYGBgCisKK0luIHRoaXMgZXhhbXBsZSwgd2hlbiBgbXV0YXRvci5NdXRhdGUoKWAgaXMgY2FsbGVkLCB3ZSB3aWxsIGFzc2lnbiA1Cit0byB0aGUgYGludGAgdmFyaWFibGUgcG9pbnRlZCB0byBieSBhcmd1bWVudCAjMQorKDAtYmFzZWQpLgorCitgU2V0QXJnUG9pbnRlZSgpYCBjb252ZW5pZW50bHkgbWFrZXMgYW4gaW50ZXJuYWwgY29weSBvZiB0aGUKK3ZhbHVlIHlvdSBwYXNzIHRvIGl0LCByZW1vdmluZyB0aGUgbmVlZCB0byBrZWVwIHRoZSB2YWx1ZSBpbiBzY29wZSBhbmQKK2FsaXZlLiBUaGUgaW1wbGljYXRpb24gaG93ZXZlciBpcyB0aGF0IHRoZSB2YWx1ZSBtdXN0IGhhdmUgYSBjb3B5Citjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4KKworSWYgdGhlIG1vY2sgbWV0aG9kIGFsc28gbmVlZHMgdG8gcmV0dXJuIGEgdmFsdWUgYXMgd2VsbCwgeW91IGNhbiBjaGFpbgorYFNldEFyZ1BvaW50ZWUoKWAgd2l0aCBgUmV0dXJuKClgIHVzaW5nIGBEb0FsbCgpYDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKK3VzaW5nIDo6dGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKKworY2xhc3MgTW9ja011dGF0b3IgOiBwdWJsaWMgTXV0YXRvciB7CisgcHVibGljOgorICAuLi4KKyAgTU9DS19NRVRIT0QxKE11dGF0ZUludCwgYm9vbChpbnQqIHZhbHVlKSk7Cit9OworLi4uCisKKyAgTW9ja011dGF0b3IgbXV0YXRvcjsKKyAgRVhQRUNUX0NBTEwobXV0YXRvciwgTXV0YXRlSW50KF8pKQorICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oNSksCisgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKHRydWUpKSk7CitgYGAKKworSWYgdGhlIG91dHB1dCBhcmd1bWVudCBpcyBhbiBhcnJheSwgdXNlIHRoZQorYFNldEFycmF5QXJndW1lbnQ8Tj4oZmlyc3QsIGxhc3QpYCBhY3Rpb24gaW5zdGVhZC4gSXQgY29waWVzIHRoZQorZWxlbWVudHMgaW4gc291cmNlIHJhbmdlIGBbZmlyc3QsIGxhc3QpYCB0byB0aGUgYXJyYXkgcG9pbnRlZCB0byBieQordGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwordXNpbmcgOjp0ZXN0aW5nOjpTZXRBcnJheUFyZ3VtZW50OworCitjbGFzcyBNb2NrQXJyYXlNdXRhdG9yIDogcHVibGljIEFycmF5TXV0YXRvciB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoTXV0YXRlLCB2b2lkKGludCogdmFsdWVzLCBpbnQgbnVtX3ZhbHVlcykpOworICAuLi4KK307CisuLi4KKworICBNb2NrQXJyYXlNdXRhdG9yIG11dGF0b3I7CisgIGludCB2YWx1ZXNbNV0gPSB7IDEsIDIsIDMsIDQsIDUgfTsKKyAgRVhQRUNUX0NBTEwobXV0YXRvciwgTXV0YXRlKE5vdE51bGwoKSwgNSkpCisgICAgICAuV2lsbE9uY2UoU2V0QXJyYXlBcmd1bWVudDwwPih2YWx1ZXMsIHZhbHVlcyArIDUpKTsKK2BgYAorCitUaGlzIGFsc28gd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQgaXMgYW4gb3V0cHV0IGl0ZXJhdG9yOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6U2VBcnJheUFyZ3VtZW50OworCitjbGFzcyBNb2NrUm9sb2RleCA6IHB1YmxpYyBSb2xvZGV4IHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShHZXROYW1lcywgdm9pZChzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHZlY3RvcjxzdHJpbmc+ID4pKTsKKyAgLi4uCit9OworLi4uCisKKyAgTW9ja1JvbG9kZXggcm9sb2RleDsKKyAgdmVjdG9yPHN0cmluZz4gbmFtZXM7CisgIG5hbWVzLnB1c2hfYmFjaygiR2VvcmdlIik7CisgIG5hbWVzLnB1c2hfYmFjaygiSm9obiIpOworICBuYW1lcy5wdXNoX2JhY2soIlRob21hcyIpOworICBFWFBFQ1RfQ0FMTChyb2xvZGV4LCBHZXROYW1lcyhfKSkKKyAgICAgIC5XaWxsT25jZShTZXRBcnJheUFyZ3VtZW50PDA+KG5hbWVzLmJlZ2luKCksIG5hbWVzLmVuZCgpKSk7CitgYGAKKworIyMgQ2hhbmdpbmcgYSBNb2NrIE9iamVjdCdzIEJlaGF2aW9yIEJhc2VkIG9uIHRoZSBTdGF0ZSAjIworCitJZiB5b3UgZXhwZWN0IGEgY2FsbCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGEgbW9jayBvYmplY3QsIHlvdSBjYW4gdXNlIGA6OnRlc3Rpbmc6OkluU2VxdWVuY2VgIHRvIHNwZWNpZnkgZGlmZmVyZW50IGJlaGF2aW9ycyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjYWxsOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworCisuLi4KKyAgeworICAgIEluU2VxdWVuY2Ugc2VxOworICAgIEVYUEVDVF9DQUxMKG15X21vY2ssIElzRGlydHkoKSkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0cnVlKSk7CisgICAgRVhQRUNUX0NBTEwobXlfbW9jaywgRmx1c2goKSk7CisgICAgRVhQRUNUX0NBTEwobXlfbW9jaywgSXNEaXJ0eSgpKQorICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGZhbHNlKSk7CisgIH0KKyAgbXlfbW9jay5GbHVzaElmRGlydHkoKTsKK2BgYAorCitUaGlzIG1ha2VzIGBteV9tb2NrLklzRGlydHkoKWAgcmV0dXJuIGB0cnVlYCBiZWZvcmUgYG15X21vY2suRmx1c2goKWAgaXMgY2FsbGVkIGFuZCByZXR1cm4gYGZhbHNlYCBhZnRlcndhcmRzLgorCitJZiB0aGUgYmVoYXZpb3IgY2hhbmdlIGlzIG1vcmUgY29tcGxleCwgeW91IGNhbiBzdG9yZSB0aGUgZWZmZWN0cyBpbiBhIHZhcmlhYmxlIGFuZCBtYWtlIGEgbW9jayBtZXRob2QgZ2V0IGl0cyByZXR1cm4gdmFsdWUgZnJvbSB0aGF0IHZhcmlhYmxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6U2F2ZUFyZzsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworCitBQ1RJT05fUChSZXR1cm5Qb2ludGVlLCBwKSB7IHJldHVybiAqcDsgfQorLi4uCisgIGludCBwcmV2aW91c192YWx1ZSA9IDA7CisgIEVYUEVDVF9DQUxMKG15X21vY2ssIEdldFByZXZWYWx1ZSgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblBvaW50ZWUoJnByZXZpb3VzX3ZhbHVlKSk7CisgIEVYUEVDVF9DQUxMKG15X21vY2ssIFVwZGF0ZVZhbHVlKF8pKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFNhdmVBcmc8MD4oJnByZXZpb3VzX3ZhbHVlKSk7CisgIG15X21vY2suRG9Tb21ldGhpbmdUb1VwZGF0ZVZhbHVlKCk7CitgYGAKKworSGVyZSBgbXlfbW9jay5HZXRQcmV2VmFsdWUoKWAgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBhcmd1bWVudCBvZiB0aGUgbGFzdCBgVXBkYXRlVmFsdWUoKWAgY2FsbC4KKworIyMgU2V0dGluZyB0aGUgRGVmYXVsdCBWYWx1ZSBmb3IgYSBSZXR1cm4gVHlwZSAjIworCitJZiBhIG1vY2sgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgaXMgYSBidWlsdC1pbiBDKysgdHlwZSBvciBwb2ludGVyLCBieQorZGVmYXVsdCBpdCB3aWxsIHJldHVybiAwIHdoZW4gaW52b2tlZC4gWW91IG9ubHkgbmVlZCB0byBzcGVjaWZ5IGFuCithY3Rpb24gaWYgdGhpcyBkZWZhdWx0IHZhbHVlIGRvZXNuJ3Qgd29yayBmb3IgeW91LgorCitTb21ldGltZXMsIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0IHZhbHVlLCBvciB5b3UgbWF5IHdhbnQKK3RvIHNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlcyBHb29nbGUgTW9jayBkb2Vzbid0IGtub3cKK2Fib3V0LiBZb3UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIGA6OnRlc3Rpbmc6OkRlZmF1bHRWYWx1ZWAgY2xhc3MKK3RlbXBsYXRlOgorCitgYGAKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMChDYWxjdWxhdGVCYXIsIEJhcigpKTsKK307CisuLi4KKworICBCYXIgZGVmYXVsdF9iYXI7CisgIC8vIFNldHMgdGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGZvciB0eXBlIEJhci4KKyAgRGVmYXVsdFZhbHVlPEJhcj46OlNldChkZWZhdWx0X2Jhcik7CisKKyAgTW9ja0ZvbyBmb287CisKKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGFuIGFjdGlvbiBoZXJlLCBhcyB0aGUgZGVmYXVsdAorICAvLyByZXR1cm4gdmFsdWUgd29ya3MgZm9yIHVzLgorICBFWFBFQ1RfQ0FMTChmb28sIENhbGN1bGF0ZUJhcigpKTsKKworICBmb28uQ2FsY3VsYXRlQmFyKCk7ICAvLyBUaGlzIHNob3VsZCByZXR1cm4gZGVmYXVsdF9iYXIuCisKKyAgLy8gVW5zZXRzIHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZS4KKyAgRGVmYXVsdFZhbHVlPEJhcj46OkNsZWFyKCk7CitgYGAKKworUGxlYXNlIG5vdGUgdGhhdCBjaGFuZ2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSB0eXBlIGNhbiBtYWtlIHlvdQordGVzdHMgaGFyZCB0byB1bmRlcnN0YW5kLiBXZSByZWNvbW1lbmQgeW91IHRvIHVzZSB0aGlzIGZlYXR1cmUKK2p1ZGljaW91c2x5LiBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgYFNldCgpYCBhbmQKK2BDbGVhcigpYCBjYWxscyBhcmUgcmlnaHQgbmV4dCB0byB0aGUgY29kZSB0aGF0IHVzZXMgeW91ciBtb2NrLgorCisjIyBTZXR0aW5nIHRoZSBEZWZhdWx0IEFjdGlvbnMgZm9yIGEgTW9jayBNZXRob2QgIyMKKworWW91J3ZlIGxlYXJuZWQgaG93IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGdpdmVuCit0eXBlLiBIb3dldmVyLCB0aGlzIG1heSBiZSB0b28gY29hcnNlIGZvciB5b3VyIHB1cnBvc2U6IHBlcmhhcHMgeW91CitoYXZlIHR3byBtb2NrIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSByZXR1cm4gdHlwZSBhbmQgeW91IHdhbnQgdGhlbSB0bworaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3JzLiBUaGUgYE9OX0NBTEwoKWAgbWFjcm8gYWxsb3dzIHlvdSB0bworY3VzdG9taXplIHlvdXIgbW9jaydzIGJlaGF2aW9yIGF0IHRoZSBtZXRob2QgbGV2ZWw6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Cit1c2luZyA6OnRlc3Rpbmc6Okd0OwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KKyAgT05fQ0FMTChmb28sIFNpZ24oXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oLTEpKTsKKyAgT05fQ0FMTChmb28sIFNpZ24oMCkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMCkpOworICBPTl9DQUxMKGZvbywgU2lnbihHdCgwKSkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworCisgIEVYUEVDVF9DQUxMKGZvbywgU2lnbihfKSkKKyAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CisKKyAgZm9vLlNpZ24oNSk7ICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIDEuCisgIGZvby5TaWduKC05KTsgIC8vIFRoaXMgc2hvdWxkIHJldHVybiAtMS4KKyAgZm9vLlNpZ24oMCk7ICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIDAuCitgYGAKKworQXMgeW91IG1heSBoYXZlIGd1ZXNzZWQsIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgYE9OX0NBTEwoKWAKK3N0YXRlbWVudHMsIHRoZSBuZXdzIG9yZGVyIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBvbGRlciBvbmVzLiBJbgorb3RoZXIgd29yZHMsIHRoZSAqKmxhc3QqKiBvbmUgdGhhdCBtYXRjaGVzIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgd2lsbAorYmUgdXNlZC4gVGhpcyBtYXRjaGluZyBvcmRlciBhbGxvd3MgeW91IHRvIHNldCB1cCB0aGUgY29tbW9uIGJlaGF2aW9yCitpbiBhIG1vY2sgb2JqZWN0J3MgY29uc3RydWN0b3Igb3IgdGhlIHRlc3QgZml4dHVyZSdzIHNldC11cCBwaGFzZSBhbmQKK3NwZWNpYWxpemUgdGhlIG1vY2sncyBiZWhhdmlvciBsYXRlci4KKworIyMgVXNpbmcgRnVuY3Rpb25zL01ldGhvZHMvRnVuY3RvcnMgYXMgQWN0aW9ucyAjIworCitJZiB0aGUgYnVpbHQtaW4gYWN0aW9ucyBkb24ndCBzdWl0IHlvdSwgeW91IGNhbiBlYXNpbHkgdXNlIGFuIGV4aXN0aW5nCitmdW5jdGlvbiwgbWV0aG9kLCBvciBmdW5jdG9yIGFzIGFuIGFjdGlvbjoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKFN1bSwgaW50KGludCB4LCBpbnQgeSkpOworICBNT0NLX01FVEhPRDEoQ29tcGxleEpvYiwgYm9vbChpbnQgeCkpOworfTsKKworaW50IENhbGN1bGF0ZVN1bShpbnQgeCwgaW50IHkpIHsgcmV0dXJuIHggKyB5OyB9CisKK2NsYXNzIEhlbHBlciB7CisgcHVibGljOgorICBib29sIENvbXBsZXhKb2IoaW50IHgpOworfTsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBIZWxwZXIgaGVscGVyOworICBFWFBFQ1RfQ0FMTChmb28sIFN1bShfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoQ2FsY3VsYXRlU3VtKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgQ29tcGxleEpvYihfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoJmhlbHBlciwgJkhlbHBlcjo6Q29tcGxleEpvYikpOworCisgIGZvby5TdW0oNSwgNik7ICAgICAgIC8vIEludm9rZXMgQ2FsY3VsYXRlU3VtKDUsIDYpLgorICBmb28uQ29tcGxleEpvYigxMCk7ICAvLyBJbnZva2VzIGhlbHBlci5Db21wbGV4Sm9iKDEwKTsKK2BgYAorCitUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiwgZXRjIG11c3QgYmUKK19jb21wYXRpYmxlXyB3aXRoIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1vY2sgZnVuY3Rpb24sIG1lYW5pbmcgdGhhdCB0aGUKK2xhdHRlcidzIGFyZ3VtZW50cyBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKK2FyZ3VtZW50cyBvZiB0aGUgZm9ybWVyLCBhbmQgdGhlIGZvcm1lcidzIHJldHVybiB0eXBlIGNhbiBiZQoraW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhhdCBvZiB0aGUgbGF0dGVyLiBTbywgeW91IGNhbiBpbnZva2UKK3NvbWV0aGluZyB3aG9zZSB0eXBlIGlzIF9ub3RfIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIG1vY2sgZnVuY3Rpb24sCithcyBsb25nIGFzIGl0J3Mgc2FmZSB0byBkbyBzbyAtIG5pY2UsIGh1aD8KKworIyMgSW52b2tpbmcgYSBGdW5jdGlvbi9NZXRob2QvRnVuY3RvciBXaXRob3V0IEFyZ3VtZW50cyAjIworCitgSW52b2tlKClgIGlzIHZlcnkgdXNlZnVsIGZvciBkb2luZyBhY3Rpb25zIHRoYXQgYXJlIG1vcmUgY29tcGxleC4gSXQKK3Bhc3NlcyB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24gb3IgZnVuY3RvciBiZWluZworaW52b2tlZCBzdWNoIHRoYXQgdGhlIGNhbGxlZSBoYXMgdGhlIGZ1bGwgY29udGV4dCBvZiB0aGUgY2FsbCB0byB3b3JrCit3aXRoLiBJZiB0aGUgaW52b2tlZCBmdW5jdGlvbiBpcyBub3QgaW50ZXJlc3RlZCBpbiBzb21lIG9yIGFsbCBvZiB0aGUKK2FyZ3VtZW50cywgaXQgY2FuIHNpbXBseSBpZ25vcmUgdGhlbS4KKworWWV0LCBhIGNvbW1vbiBwYXR0ZXJuIGlzIHRoYXQgYSB0ZXN0IGF1dGhvciB3YW50cyB0byBpbnZva2UgYSBmdW5jdGlvbgord2l0aG91dCB0aGUgYXJndW1lbnRzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uLiBgSW52b2tlKClgIGFsbG93cyBoZXIgdG8KK2RvIHRoYXQgdXNpbmcgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgdGhyb3dzIGF3YXkgdGhlIGFyZ3VtZW50cyBiZWZvcmUKK2ludm9raW5nIGFuIHVuZGVybGluaW5nIG51bGxhcnkgZnVuY3Rpb24uIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBjYW4gYmUKK3RlZGlvdXMgYW5kIG9ic2N1cmVzIHRoZSBpbnRlbnQgb2YgdGhlIHRlc3QuCisKK2BJbnZva2VXaXRob3V0QXJncygpYCBzb2x2ZXMgdGhpcyBwcm9ibGVtLiBJdCdzIGxpa2UgYEludm9rZSgpYCBleGNlcHQKK3RoYXQgaXQgZG9lc24ndCBwYXNzIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIHRvIHRoZQorY2FsbGVlLiBIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZVdpdGhvdXRBcmdzOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoQ29tcGxleEpvYiwgYm9vbChpbnQgbikpOworfTsKKworYm9vbCBKb2IxKCkgeyAuLi4gfQorLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgQ29tcGxleEpvYihfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2VXaXRob3V0QXJncyhKb2IxKSk7CisKKyAgZm9vLkNvbXBsZXhKb2IoMTApOyAgLy8gSW52b2tlcyBKb2IxKCkuCitgYGAKKworIyMgSW52b2tpbmcgYW4gQXJndW1lbnQgb2YgdGhlIE1vY2sgRnVuY3Rpb24gIyMKKworU29tZXRpbWVzIGEgbW9jayBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgYSBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3RvcgorKGluIG90aGVyIHdvcmRzLCBhICJjYWxsYWJsZSIpIGFzIGFuIGFyZ3VtZW50LCBlLmcuCisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKERvVGhpcywgYm9vbChpbnQgbiwgYm9vbCAoKmZwKShpbnQpKSk7Cit9OworYGBgCisKK2FuZCB5b3UgbWF5IHdhbnQgdG8gaW52b2tlIHRoaXMgY2FsbGFibGUgYXJndW1lbnQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIE1vY2tGb28gZm9vOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhfLCBfKSkKKyAgICAgIC5XaWxsT25jZSguLi4pOworICAvLyBXaWxsIGV4ZWN1dGUgKCpmcCkoNSksIHdoZXJlIGZwIGlzIHRoZQorICAvLyBzZWNvbmQgYXJndW1lbnQgRG9UaGlzKCkgcmVjZWl2ZXMuCitgYGAKKworQXJnaGgsIHlvdSBuZWVkIHRvIHJlZmVyIHRvIGEgbW9jayBmdW5jdGlvbiBhcmd1bWVudCBidXQgQysrIGhhcyBubworbGFtYmRhICh5ZXQpLCBzbyB5b3UgaGF2ZSB0byBkZWZpbmUgeW91ciBvd24gYWN0aW9uLiA6LSggT3IgZG8geW91CityZWFsbHk/CisKK1dlbGwsIEdvb2dsZSBNb2NrIGhhcyBhbiBhY3Rpb24gdG8gc29sdmUgX2V4YWN0bHlfIHRoaXMgcHJvYmxlbToKKworYGBgCisgIEludm9rZUFyZ3VtZW50PE4+KGFyZ18xLCBhcmdfMiwgLi4uLCBhcmdfbSkKK2BgYAorCit3aWxsIGludm9rZSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0aGUgbW9jayBmdW5jdGlvbiByZWNlaXZlcywKK3dpdGggYGFyZ18xYCwgYGFyZ18yYCwgLi4uLCBhbmQgYGFyZ19tYC4gTm8gbWF0dGVyIGlmIHRoZSBhcmd1bWVudCBpcworYSBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3RvciwgR29vZ2xlIE1vY2sgaGFuZGxlcyB0aGVtIGJvdGguCisKK1dpdGggdGhhdCwgeW91IGNvdWxkIHdyaXRlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlQXJndW1lbnQ7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoXywgXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MT4oNSkpOworICAvLyBXaWxsIGV4ZWN1dGUgKCpmcCkoNSksIHdoZXJlIGZwIGlzIHRoZQorICAvLyBzZWNvbmQgYXJndW1lbnQgRG9UaGlzKCkgcmVjZWl2ZXMuCitgYGAKKworV2hhdCBpZiB0aGUgY2FsbGFibGUgdGFrZXMgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlPyBObyBwcm9ibGVtIC0ganVzdAord3JhcCBpdCBpbnNpZGUgYEJ5UmVmKClgOgorCitgYGAKKy4uLgorICBNT0NLX01FVEhPRDEoQmFyLCBib29sKGJvb2wgKCpmcCkoaW50LCBjb25zdCBIZWxwZXImKSkpOworLi4uCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkJ5UmVmOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VBcmd1bWVudDsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBIZWxwZXIgaGVscGVyOworICAuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MD4oNSwgQnlSZWYoaGVscGVyKSkpOworICAvLyBCeVJlZihoZWxwZXIpIGd1YXJhbnRlZXMgdGhhdCBhIHJlZmVyZW5jZSB0byBoZWxwZXIsIG5vdCBhIGNvcHkgb2YgaXQsCisgIC8vIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYWJsZS4KK2BgYAorCitXaGF0IGlmIHRoZSBjYWxsYWJsZSB0YWtlcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UgYW5kIHdlIGRvICoqbm90KioKK3dyYXAgdGhlIGFyZ3VtZW50IGluIGBCeVJlZigpYD8gVGhlbiBgSW52b2tlQXJndW1lbnQoKWAgd2lsbCBfbWFrZSBhCitjb3B5XyBvZiB0aGUgYXJndW1lbnQsIGFuZCBwYXNzIGEgX3JlZmVyZW5jZSB0byB0aGUgY29weV8sIGluc3RlYWQgb2YKK2EgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSwgdG8gdGhlIGNhbGxhYmxlLiBUaGlzIGlzIGVzcGVjaWFsbHkKK2hhbmR5IHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgdGVtcG9yYXJ5IHZhbHVlOgorCitgYGAKKy4uLgorICBNT0NLX01FVEhPRDEoRG9UaGF0LCBib29sKGJvb2wgKCpmKShjb25zdCBkb3VibGUmIHgsIGNvbnN0IHN0cmluZyYgcykpKTsKKy4uLgordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VBcmd1bWVudDsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICAuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MD4oNS4wLCBzdHJpbmcoIkhpIikpKTsKKyAgLy8gV2lsbCBleGVjdXRlICgqZikoNS4wLCBzdHJpbmcoIkhpIikpLCB3aGVyZSBmIGlzIHRoZSBmdW5jdGlvbiBwb2ludGVyCisgIC8vIERvVGhhdCgpIHJlY2VpdmVzLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZXMgNS4wIGFuZCBzdHJpbmcoIkhpIikgYXJlCisgIC8vIHRlbXBvcmFyeSBhbmQgZGVhZCBvbmNlIHRoZSBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCBmaW5pc2hlcy4gIFlldAorICAvLyBpdCdzIGZpbmUgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbiBsYXRlciwgc2luY2UgYSBjb3B5IG9mIHRoZSB2YWx1ZXMKKyAgLy8gYXJlIGtlcHQgaW5zaWRlIHRoZSBJbnZva2VBcmd1bWVudCBhY3Rpb24uCitgYGAKKworIyMgSWdub3JpbmcgYW4gQWN0aW9uJ3MgUmVzdWx0ICMjCisKK1NvbWV0aW1lcyB5b3UgaGF2ZSBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIF9zb21ldGhpbmdfLCBidXQgeW91IG5lZWQgYW4KK2FjdGlvbiB0aGF0IHJldHVybnMgYHZvaWRgIChwZXJoYXBzIHlvdSB3YW50IHRvIHVzZSBpdCBpbiBhIG1vY2sKK2Z1bmN0aW9uIHRoYXQgcmV0dXJucyBgdm9pZGAsIG9yIHBlcmhhcHMgaXQgbmVlZHMgdG8gYmUgdXNlZCBpbgorYERvQWxsKClgIGFuZCBpdCdzIG5vdCB0aGUgbGFzdCBpbiB0aGUgbGlzdCkuIGBJZ25vcmVSZXN1bHQoKWAgbGV0cworeW91IGRvIHRoYXQuIEZvciBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisKK2ludCBQcm9jZXNzKGNvbnN0IE15RGF0YSYgZGF0YSk7CitzdHJpbmcgRG9Tb21ldGhpbmcoKTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QxKEFiYywgdm9pZChjb25zdCBNeURhdGEmIGRhdGEpKTsKKyAgTU9DS19NRVRIT0QwKFh5eiwgYm9vbCgpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBBYmMoXykpCisgIC8vIC5XaWxsT25jZShJbnZva2UoUHJvY2VzcykpOworICAvLyBUaGUgYWJvdmUgbGluZSB3b24ndCBjb21waWxlIGFzIFByb2Nlc3MoKSByZXR1cm5zIGludCBidXQgQWJjKCkgbmVlZHMKKyAgLy8gdG8gcmV0dXJuIHZvaWQuCisgICAgICAuV2lsbE9uY2UoSWdub3JlUmVzdWx0KEludm9rZShQcm9jZXNzKSkpOworCisgIEVYUEVDVF9DQUxMKGZvbywgWHl6KCkpCisgICAgICAuV2lsbE9uY2UoRG9BbGwoSWdub3JlUmVzdWx0KEludm9rZShEb1NvbWV0aGluZykpLAorICAgICAgLy8gSWdub3JlcyB0aGUgc3RyaW5nIERvU29tZXRoaW5nKCkgcmV0dXJucy4KKyAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4odHJ1ZSkpKTsKK2BgYAorCitOb3RlIHRoYXQgeW91ICoqY2Fubm90KiogdXNlIGBJZ25vcmVSZXN1bHQoKWAgb24gYW4gYWN0aW9uIHRoYXQgYWxyZWFkeQorcmV0dXJucyBgdm9pZGAuIERvaW5nIHNvIHdpbGwgbGVhZCB0byB1Z2x5IGNvbXBpbGVyIGVycm9ycy4KKworIyMgU2VsZWN0aW5nIGFuIEFjdGlvbidzIEFyZ3VtZW50cyAjIworCitTYXkgeW91IGhhdmUgYSBtb2NrIGZ1bmN0aW9uIGBGb28oKWAgdGhhdCB0YWtlcyBzZXZlbiBhcmd1bWVudHMsIGFuZAoreW91IGhhdmUgYSBjdXN0b20gYWN0aW9uIHRoYXQgeW91IHdhbnQgdG8gaW52b2tlIHdoZW4gYEZvbygpYCBpcworY2FsbGVkLiBUcm91YmxlIGlzLCB0aGUgY3VzdG9tIGFjdGlvbiBvbmx5IHdhbnRzIHRocmVlIGFyZ3VtZW50czoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKy4uLgorICBNT0NLX01FVEhPRDcoRm9vLCBib29sKGJvb2wgdmlzaWJsZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHBhaXI8aW50LCBpbnQ+LCBkb3VibGU+JiB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl93ZWlnaHQsIGRvdWJsZSBtYXhfd2lnaHQpKTsKKy4uLgorCitib29sIElzVmlzaWJsZUluUXVhZHJhbnQxKGJvb2wgdmlzaWJsZSwgaW50IHgsIGludCB5KSB7CisgIHJldHVybiB2aXNpYmxlICYmIHggPj0gMCAmJiB5ID49IDA7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oXywgXywgXywgXywgXywgXywgXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlKElzVmlzaWJsZUluUXVhZHJhbnQxKSk7ICAvLyBVaCwgd29uJ3QgY29tcGlsZS4gOi0oCitgYGAKKworVG8gcGxlYXNlIHRoZSBjb21waWxlciBHb2QsIHlvdSBjYW4gdG8gZGVmaW5lIGFuICJhZGFwdG9yIiB0aGF0IGhhcwordGhlIHNhbWUgc2lnbmF0dXJlIGFzIGBGb28oKWAgYW5kIGNhbGxzIHRoZSBjdXN0b20gYWN0aW9uIHdpdGggdGhlCityaWdodCBhcmd1bWVudHM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisKK2Jvb2wgTXlJc1Zpc2libGVJblF1YWRyYW50MShib29sIHZpc2libGUsIGNvbnN0IHN0cmluZyYgbmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxwYWlyPGludCwgaW50PiwgZG91YmxlPiYgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW5fd2VpZ2h0LCBkb3VibGUgbWF4X3dpZ2h0KSB7CisgIHJldHVybiBJc1Zpc2libGVJblF1YWRyYW50MSh2aXNpYmxlLCB4LCB5KTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoTXlJc1Zpc2libGVJblF1YWRyYW50MSkpOyAgLy8gTm93IGl0IHdvcmtzLgorYGBgCisKK0J1dCBpc24ndCB0aGlzIGF3a3dhcmQ/CisKK0dvb2dsZSBNb2NrIHByb3ZpZGVzIGEgZ2VuZXJpYyBfYWN0aW9uIGFkYXB0b3JfLCBzbyB5b3UgY2FuIHNwZW5kIHlvdXIKK3RpbWUgbWluZGluZyBtb3JlIGltcG9ydGFudCBidXNpbmVzcyB0aGFuIHdyaXRpbmcgeW91ciBvd24KK2FkYXB0b3JzLiBIZXJlJ3MgdGhlIHN5bnRheDoKKworYGBgCisgIFdpdGhBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYWN0aW9uKQorYGBgCisKK2NyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGFzc2VzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXQKK3RoZSBnaXZlbiBpbmRpY2VzICgwLWJhc2VkKSB0byB0aGUgaW5uZXIgYGFjdGlvbmAgYW5kIHBlcmZvcm1zCitpdC4gVXNpbmcgYFdpdGhBcmdzYCwgb3VyIG9yaWdpbmFsIGV4YW1wbGUgY2FuIGJlIHdyaXR0ZW4gYXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7Cit1c2luZyA6OnRlc3Rpbmc6OldpdGhBcmdzOworLi4uCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShXaXRoQXJnczwwLCAyLCAzPihJbnZva2UoSXNWaXNpYmxlSW5RdWFkcmFudDEpKSk7CisgICAgICAvLyBObyBuZWVkIHRvIGRlZmluZSB5b3VyIG93biBhZGFwdG9yLgorYGBgCisKK0ZvciBiZXR0ZXIgcmVhZGFiaWxpdHksIEdvb2dsZSBNb2NrIGFsc28gZ2l2ZXMgeW91OgorCisgICogYFdpdGhvdXRBcmdzKGFjdGlvbilgIHdoZW4gdGhlIGlubmVyIGBhY3Rpb25gIHRha2VzIF9ub18gYXJndW1lbnQsIGFuZAorICAqIGBXaXRoQXJnPE4+KGFjdGlvbilgIChubyBgc2AgYWZ0ZXIgYEFyZ2ApIHdoZW4gdGhlIGlubmVyIGBhY3Rpb25gIHRha2VzIF9vbmVfIGFyZ3VtZW50LgorCitBcyB5b3UgbWF5IGhhdmUgcmVhbGl6ZWQsIGBJbnZva2VXaXRob3V0QXJncyguLi4pYCBpcyBqdXN0IHN5bnRhY3RpYworc3VnYXIgZm9yIGBXaXRob3V0QXJncyhJbm92a2UoLi4uKSlgLgorCitIZXJlIGFyZSBtb3JlIHRpcHM6CisKKyAgKiBUaGUgaW5uZXIgYWN0aW9uIHVzZWQgaW4gYFdpdGhBcmdzYCBhbmQgZnJpZW5kcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGBJbnZva2UoKWAgLS0gaXQgY2FuIGJlIGFueXRoaW5nLgorICAqIFlvdSBjYW4gcmVwZWF0IGFuIGFyZ3VtZW50IGluIHRoZSBhcmd1bWVudCBsaXN0IGlmIG5lY2Vzc2FyeSwgZS5nLiBgV2l0aEFyZ3M8MiwgMywgMywgNT4oLi4uKWAuCisgICogWW91IGNhbiBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMsIGUuZy4gYFdpdGhBcmdzPDMsIDIsIDE+KC4uLilgLgorICAqIFRoZSB0eXBlcyBvZiB0aGUgc2VsZWN0ZWQgYXJndW1lbnRzIGRvIF9ub3RfIGhhdmUgdG8gbWF0Y2ggdGhlIHNpZ25hdHVyZSBvZiB0aGUgaW5uZXIgYWN0aW9uIGV4YWN0bHkuIEl0IHdvcmtzIGFzIGxvbmcgYXMgdGhleSBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzIG9mIHRoZSBpbm5lciBhY3Rpb24uIEZvciBleGFtcGxlLCBpZiB0aGUgNC10aCBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBpcyBhbiBgaW50YCBhbmQgYG15X2FjdGlvbmAgdGFrZXMgYSBgZG91YmxlYCwgYFdpdGhBcmc8ND4obXlfYWN0aW9uKWAgd2lsbCB3b3JrLgorCisjIyBJZ25vcmluZyBBcmd1bWVudHMgaW4gQWN0aW9uIEZ1bmN0aW9ucyAjIworCitUaGUgc2VsZWN0aW5nLWFuLWFjdGlvbidzLWFyZ3VtZW50cyByZWNpcGUgc2hvd2VkIHVzIG9uZSB3YXkgdG8gbWFrZSBhCittb2NrIGZ1bmN0aW9uIGFuZCBhbiBhY3Rpb24gd2l0aCBpbmNvbXBhdGlibGUgYXJndW1lbnQgbGlzdHMgZml0Cit0b2dldGhlci4gVGhlIGRvd25zaWRlIGlzIHRoYXQgd3JhcHBpbmcgdGhlIGFjdGlvbiBpbgorYFdpdGhBcmdzPC4uLj4oKWAgY2FuIGdldCB0ZWRpb3VzIGZvciBwZW9wbGUgd3JpdGluZyB0aGUgdGVzdHMuCisKK0lmIHlvdSBhcmUgZGVmaW5pbmcgYSBmdW5jdGlvbiwgbWV0aG9kLCBvciBmdW5jdG9yIHRvIGJlIHVzZWQgd2l0aAorYEludm9rZSooKWAsIGFuZCB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHNvbWUgb2YgaXRzIGFyZ3VtZW50cywgYW4KK2FsdGVybmF0aXZlIHRvIGBXaXRoQXJnc2AgaXMgdG8gZGVjbGFyZSB0aGUgdW5pbnRlcmVzdGluZyBhcmd1bWVudHMgYXMKK2BVbnVzZWRgLiBUaGlzIG1ha2VzIHRoZSBkZWZpbml0aW9uIGxlc3MgY2x1dHRlcmVkIGFuZCBsZXNzIGZyYWdpbGUgaW4KK2Nhc2UgdGhlIHR5cGVzIG9mIHRoZSB1bmludGVyZXN0aW5nIGFyZ3VtZW50cyBjaGFuZ2UuIEl0IGNvdWxkIGFsc28KK2luY3JlYXNlIHRoZSBjaGFuY2UgdGhlIGFjdGlvbiBmdW5jdGlvbiBjYW4gYmUgcmV1c2VkLiBGb3IgZXhhbXBsZSwKK2dpdmVuCisKK2BgYAorICBNT0NLX01FVEhPRDMoRm9vLCBkb3VibGUoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7CisgIE1PQ0tfTUVUSE9EMyhCYXIsIGRvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB4LCBkb3VibGUgeSkpOworYGBgCisKK2luc3RlYWQgb2YKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisKK2RvdWJsZSBEaXN0YW5jZVRvT3JpZ2luV2l0aEluZGV4KGludCBpbmRleCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisuLi4KKworICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luV2l0aExhYmVsKSk7CisgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbldpdGhJbmRleCkpOworYGBgCisKK3lvdSBjb3VsZCB3cml0ZQorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOwordXNpbmcgOjp0ZXN0aW5nOjpVbnVzZWQ7CisKK2RvdWJsZSBEaXN0YW5jZVRvT3JpZ2luKFVudXNlZCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisuLi4KKworICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luKSk7CisgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbikpOworYGBgCisKKyMjIFNoYXJpbmcgQWN0aW9ucyAjIworCitKdXN0IGxpa2UgbWF0Y2hlcnMsIGEgR29vZ2xlIE1vY2sgYWN0aW9uIG9iamVjdCBjb25zaXN0cyBvZiBhIHBvaW50ZXIKK3RvIGEgcmVmLWNvdW50ZWQgaW1wbGVtZW50YXRpb24gb2JqZWN0LiBUaGVyZWZvcmUgY29weWluZyBhY3Rpb25zIGlzCithbHNvIGFsbG93ZWQgYW5kIHZlcnkgZWZmaWNpZW50LiBXaGVuIHRoZSBsYXN0IGFjdGlvbiB0aGF0IHJlZmVyZW5jZXMKK3RoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgZGllcywgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdCB3aWxsIGJlCitkZWxldGVkLgorCitJZiB5b3UgaGF2ZSBzb21lIGNvbXBsZXggYWN0aW9uIHRoYXQgeW91IHdhbnQgdG8gdXNlIGFnYWluIGFuZCBhZ2FpbiwKK3lvdSBtYXkgbm90IGhhdmUgdG8gYnVpbGQgaXQgZnJvbSBzY3JhdGNoIGV2ZXJ5dGltZS4gSWYgdGhlIGFjdGlvbgorZG9lc24ndCBoYXZlIGFuIGludGVybmFsIHN0YXRlIChpLmUuIGlmIGl0IGFsd2F5cyBkb2VzIHRoZSBzYW1lIHRoaW5nCitubyBtYXR0ZXIgaG93IG1hbnkgdGltZXMgaXQgaGFzIGJlZW4gY2FsbGVkKSwgeW91IGNhbiBhc3NpZ24gaXQgdG8gYW4KK2FjdGlvbiB2YXJpYWJsZSBhbmQgdXNlIHRoYXQgdmFyaWFibGUgcmVwZWF0ZWRseS4gRm9yIGV4YW1wbGU6CisKK2BgYAorICBBY3Rpb248Ym9vbChpbnQqKT4gc2V0X2ZsYWcgPSBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4odHJ1ZSkpOworICAuLi4gdXNlIHNldF9mbGFnIGluIC5XaWxsT25jZSgpIGFuZCAuV2lsbFJlcGVhdGVkbHkoKSAuLi4KK2BgYAorCitIb3dldmVyLCBpZiB0aGUgYWN0aW9uIGhhcyBpdHMgb3duIHN0YXRlLCB5b3UgbWF5IGJlIHN1cnByaXNlZCBpZiB5b3UKK3NoYXJlIHRoZSBhY3Rpb24gb2JqZWN0LiBTdXBwb3NlIHlvdSBoYXZlIGFuIGFjdGlvbiBmYWN0b3J5CitgSW5jcmVtZW50Q291bnRlcihpbml0KWAgd2hpY2ggY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbmNyZW1lbnRzIGFuZAorcmV0dXJucyBhIGNvdW50ZXIgd2hvc2UgaW5pdGlhbCB2YWx1ZSBpcyBgaW5pdGAsIHVzaW5nIHR3byBhY3Rpb25zCitjcmVhdGVkIGZyb20gdGhlIHNhbWUgZXhwcmVzc2lvbiBhbmQgdXNpbmcgYSBzaGFyZWQgYWN0aW9uIHdpbGwKK2V4aWhpYml0IGRpZmZlcmVudCBiZWhhdmlvcnMuIEV4YW1wbGU6CisKK2BgYAorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcygpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KEluY3JlbWVudENvdW50ZXIoMCkpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KEluY3JlbWVudENvdW50ZXIoMCkpOworICBmb28uRG9UaGlzKCk7ICAvLyBSZXR1cm5zIDEuCisgIGZvby5Eb1RoaXMoKTsgIC8vIFJldHVybnMgMi4KKyAgZm9vLkRvVGhhdCgpOyAgLy8gUmV0dXJucyAxIC0gQmxhaCgpIHVzZXMgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgLy8gY291bnRlciB0aGFuIEJhcigpJ3MuCitgYGAKKwordmVyc3VzCisKK2BgYAorICBBY3Rpb248aW50KCk+IGluY3JlbWVudCA9IEluY3JlbWVudENvdW50ZXIoMCk7CisKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShpbmNyZW1lbnQpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KGluY3JlbWVudCk7CisgIGZvby5Eb1RoaXMoKTsgIC8vIFJldHVybnMgMS4KKyAgZm9vLkRvVGhpcygpOyAgLy8gUmV0dXJucyAyLgorICBmb28uRG9UaGF0KCk7ICAvLyBSZXR1cm5zIDMgLSB0aGUgY291bnRlciBpcyBzaGFyZWQuCitgYGAKKworIyBNaXNjIFJlY2lwZXMgb24gVXNpbmcgR29vZ2xlIE1vY2sgIworCisjIyBNYWtpbmcgdGhlIENvbXBpbGF0aW9uIEZhc3RlciAjIworCitCZWxpZXZlIGl0IG9yIG5vdCwgdGhlIF92YXN0IG1ham9yaXR5XyBvZiB0aGUgdGltZSBzcGVudCBvbiBjb21waWxpbmcKK2EgbW9jayBjbGFzcyBpcyBpbiBnZW5lcmF0aW5nIGl0cyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciwgYXMgdGhleQorcGVyZm9ybSBub24tdHJpdmlhbCB0YXNrcyAoZS5nLiB2ZXJpZmljYXRpb24gb2YgdGhlCitleHBlY3RhdGlvbnMpLiBXaGF0J3MgbW9yZSwgbW9jayBtZXRob2RzIHdpdGggZGlmZmVyZW50IHNpZ25hdHVyZXMKK2hhdmUgZGlmZmVyZW50IHR5cGVzIGFuZCB0aHVzIHRoZWlyIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBuZWVkIHRvCitiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIHNlcGFyYXRlbHkuIEFzIGEgcmVzdWx0LCBpZiB5b3UgbW9jayBtYW55CitkaWZmZXJlbnQgdHlwZXMgb2YgbWV0aG9kcywgY29tcGlsaW5nIHlvdXIgbW9jayBjbGFzcyBjYW4gZ2V0IHJlYWxseQorc2xvdy4KKworSWYgeW91IGFyZSBleHBlcmllbmNpbmcgc2xvdyBjb21waWxhdGlvbiwgeW91IGNhbiBtb3ZlIHRoZSBkZWZpbml0aW9uCitvZiB5b3VyIG1vY2sgY2xhc3MnIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG91dCBvZiB0aGUgY2xhc3MgYm9keQorYW5kIGludG8gYSBgLmNwcGAgZmlsZS4gVGhpcyB3YXksIGV2ZW4gaWYgeW91IGAjaW5jbHVkZWAgeW91ciBtb2NrCitjbGFzcyBpbiBOIGZpbGVzLCB0aGUgY29tcGlsZXIgb25seSBuZWVkcyB0byBnZW5lcmF0ZSBpdHMgY29uc3RydWN0b3IKK2FuZCBkZXN0cnVjdG9yIG9uY2UsIHJlc3VsdGluZyBpbiBhIG11Y2ggZmFzdGVyIGNvbXBpbGF0aW9uLgorCitMZXQncyBpbGx1c3RyYXRlIHRoZSBpZGVhIHVzaW5nIGFuIGV4YW1wbGUuIEhlcmUncyB0aGUgZGVmaW5pdGlvbiBvZiBhCittb2NrIGNsYXNzIGJlZm9yZSBhcHBseWluZyB0aGlzIHJlY2lwZToKKworYGBgCisvLyBGaWxlIG1vY2tfZm9vLmguCisuLi4KK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC8vIFNpbmNlIHdlIGRvbid0IGRlY2xhcmUgdGhlIGNvbnN0cnVjdG9yIG9yIHRoZSBkZXN0cnVjdG9yLAorICAvLyB0aGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSB0aGVtIGluIGV2ZXJ5IHRyYW5zbGF0aW9uIHVuaXQKKyAgLy8gd2hlcmUgdGhpcyBtb2NrIGNsYXNzIGlzIHVzZWQuCisKKyAgTU9DS19NRVRIT0QwKERvVGhpcywgaW50KCkpOworICBNT0NLX01FVEhPRDEoRG9UaGF0LCBib29sKGNvbnN0IGNoYXIqIHN0cikpOworICAuLi4gbW9yZSBtb2NrIG1ldGhvZHMgLi4uCit9OworYGBgCisKK0FmdGVyIHRoZSBjaGFuZ2UsIGl0IHdvdWxkIGxvb2sgbGlrZToKKworYGBgCisvLyBGaWxlIG1vY2tfZm9vLmguCisuLi4KK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBhcmUgZGVjbGFyZWQsIGJ1dCBub3QgZGVmaW5lZCwgaGVyZS4KKyAgTW9ja0ZvbygpOworICB2aXJ0dWFsIH5Nb2NrRm9vKCk7CisKKyAgTU9DS19NRVRIT0QwKERvVGhpcywgaW50KCkpOworICBNT0NLX01FVEhPRDEoRG9UaGF0LCBib29sKGNvbnN0IGNoYXIqIHN0cikpOworICAuLi4gbW9yZSBtb2NrIG1ldGhvZHMgLi4uCit9OworYGBgCithbmQKK2BgYAorLy8gRmlsZSBtb2NrX2Zvby5jcHAuCisjaW5jbHVkZSAicGF0aC90by9tb2NrX2Zvby5oIgorCisvLyBUaGUgZGVmaW5pdGlvbnMgbWF5IGFwcGVhciB0cml2aWFsLCBidXQgdGhlIGZ1bmN0aW9ucyBhY3R1YWxseSBkbyBhCisvLyBsb3Qgb2YgdGhpbmdzIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBvZiB0aGUgbWVtYmVyCisvLyB2YXJpYWJsZXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIG1vY2sgbWV0aG9kcy4KK01vY2tGb286Ok1vY2tGb28oKSB7fQorTW9ja0Zvbzo6fk1vY2tGb28oKSB7fQorYGBgCisKKyMjIEZvcmNpbmcgYSBWZXJpZmljYXRpb24gIyMKKworV2hlbiBpdCdzIGJlaW5nIGRlc3RveWVkLCB5b3VyIGZyaWVuZGx5IG1vY2sgb2JqZWN0IHdpbGwgYXV0b21hdGljYWxseQordmVyaWZ5IHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiBpdCBoYXZlIGJlZW4gc2F0aXNmaWVkLCBhbmQgd2lsbAorZ2VuZXJhdGUgW0dvb2dsZSBUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8pIGZhaWx1cmVzCitpZiBub3QuIFRoaXMgaXMgY29udmVuaWVudCBhcyBpdCBsZWF2ZXMgeW91IHdpdGggb25lIGxlc3MgdGhpbmcgdG8KK3dvcnJ5IGFib3V0LiBUaGF0IGlzLCB1bmxlc3MgeW91IGFyZSBub3Qgc3VyZSBpZiB5b3VyIG1vY2sgb2JqZWN0IHdpbGwKK2JlIGRlc3RveWVkLgorCitIb3cgY291bGQgaXQgYmUgdGhhdCB5b3VyIG1vY2sgb2JqZWN0IHdvbid0IGV2ZW50dWFsbHkgYmUgZGVzdHJveWVkPworV2VsbCwgaXQgbWlnaHQgYmUgY3JlYXRlZCBvbiB0aGUgaGVhcCBhbmQgb3duZWQgYnkgdGhlIGNvZGUgeW91IGFyZQordGVzdGluZy4gU3VwcG9zZSB0aGVyZSdzIGEgYnVnIGluIHRoYXQgY29kZSBhbmQgaXQgZG9lc24ndCBkZWxldGUgdGhlCittb2NrIG9iamVjdCBwcm9wZXJseSAtIHlvdSBjb3VsZCBlbmQgdXAgd2l0aCBhIHBhc3NpbmcgdGVzdCB3aGVuCit0aGVyZSdzIGFjdHVhbGx5IGEgYnVnLgorCitVc2luZyBhIGhlYXAgY2hlY2tlciBpcyBhIGdvb2QgaWRlYSBhbmQgY2FuIGFsbGV2aWF0ZSB0aGUgY29uY2VybiwgYnV0CitpdHMgaW1wbGVtZW50YXRpb24gbWF5IG5vdCBiZSAxMDAlIHJlbGlhYmxlLiBTbywgc29tZXRpbWVzIHlvdSBkbyB3YW50Cit0byBfZm9yY2VfIEdvb2dsZSBNb2NrIHRvIHZlcmlmeSBhIG1vY2sgb2JqZWN0IGJlZm9yZSBpdCBpcworKGhvcGVmdWxseSkgZGVzdHJ1Y3RlZC4gWW91IGNhbiBkbyB0aGlzIHdpdGgKK2BNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19vYmplY3QpYDoKKworYGBgCitURVNUKE15U2VydmVyVGVzdCwgUHJvY2Vzc2VzUmVxdWVzdCkgeworICB1c2luZyA6OnRlc3Rpbmc6Ok1vY2s7CisKKyAgTW9ja0ZvbyogY29uc3QgZm9vID0gbmV3IE1vY2tGb287CisgIEVYUEVDVF9DQUxMKCpmb28sIC4uLikuLi47CisgIC8vIC4uLiBvdGhlciBleHBlY3RhdGlvbnMgLi4uCisKKyAgLy8gc2VydmVyIG5vdyBvd25zIGZvby4KKyAgTXlTZXJ2ZXIgc2VydmVyKGZvbyk7CisgIHNlcnZlci5Qcm9jZXNzUmVxdWVzdCguLi4pOworCisgIC8vIEluIGNhc2UgdGhhdCBzZXJ2ZXIncyBkZXN0cnVjdG9yIHdpbGwgZm9yZ2V0IHRvIGRlbGV0ZSBmb28sCisgIC8vIHRoaXMgd2lsbCB2ZXJpZnkgdGhlIGV4cGVjdGF0aW9ucyBhbnl3YXkuCisgIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGZvbyk7Cit9ICAvLyBzZXJ2ZXIgaXMgZGVzdHJveWVkIHdoZW4gaXQgZ29lcyBvdXQgb2Ygc2NvcGUgaGVyZS4KK2BgYAorCisqKlRpcDoqKiBUaGUgYE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKClgIGZ1bmN0aW9uIHJldHVybnMgYQorYGJvb2xgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHZlcmlmaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAoYHRydWVgIGZvcgoreWVzKSwgc28geW91IGNhbiB3cmFwIHRoYXQgZnVuY3Rpb24gY2FsbCBpbnNpZGUgYSBgQVNTRVJUX1RSVUUoKWAgaWYKK3RoZXJlIGlzIG5vIHBvaW50IGdvaW5nIGZ1cnRoZXIgd2hlbiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBmYWlsZWQuCisKKyMjIFVzaW5nIENoZWNrIFBvaW50cyAjIworCitTb21ldGltZXMgeW91IG1heSB3YW50IHRvICJyZXNldCIgYSBtb2NrIG9iamVjdCBhdCB2YXJpb3VzIGNoZWNrCitwb2ludHMgaW4geW91ciB0ZXN0OiBhdCBlYWNoIGNoZWNrIHBvaW50LCB5b3UgdmVyaWZ5IHRoYXQgYWxsIGV4aXN0aW5nCitleHBlY3RhdGlvbnMgb24gdGhlIG1vY2sgb2JqZWN0IGhhdmUgYmVlbiBzYXRpc2ZpZWQsIGFuZCB0aGVuIHlvdSBzZXQKK3NvbWUgbmV3IGV4cGVjdGF0aW9ucyBvbiBpdCBhcyBpZiBpdCdzIG5ld2x5IGNyZWF0ZWQuIFRoaXMgYWxsb3dzIHlvdQordG8gd29yayB3aXRoIGEgbW9jayBvYmplY3QgaW4gInBoYXNlcyIgd2hvc2Ugc2l6ZXMgYXJlIGVhY2gKK21hbmFnZWFibGUuCisKK09uZSBzdWNoIHNjZW5hcmlvIGlzIHRoYXQgaW4geW91ciB0ZXN0J3MgYFNldFVwKClgIGZ1bmN0aW9uLCB5b3UgbWF5Cit3YW50IHRvIHB1dCB0aGUgb2JqZWN0IHlvdSBhcmUgdGVzdGluZyBpbnRvIGEgY2VydGFpbiBzdGF0ZSwgd2l0aCB0aGUKK2hlbHAgZnJvbSBhIG1vY2sgb2JqZWN0LiBPbmNlIGluIHRoZSBkZXNpcmVkIHN0YXRlLCB5b3Ugd2FudCB0byBjbGVhcgorYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgbW9jaywgc3VjaCB0aGF0IGluIHRoZSBgVEVTVF9GYCBib2R5IHlvdSBjYW4KK3NldCBmcmVzaCBleHBlY3RhdGlvbnMgb24gaXQuCisKK0FzIHlvdSBtYXkgaGF2ZSBmaWd1cmVkIG91dCwgdGhlIGBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygpYAorZnVuY3Rpb24gd2Ugc2F3IGluIHRoZSBwcmV2aW91cyByZWNpcGUgY2FuIGhlbHAgeW91IGhlcmUuIE9yLCBpZiB5b3UKK2FyZSB1c2luZyBgT05fQ0FMTCgpYCB0byBzZXQgZGVmYXVsdCBhY3Rpb25zIG9uIHRoZSBtb2NrIG9iamVjdCBhbmQKK3dhbnQgdG8gY2xlYXIgdGhlIGRlZmF1bHQgYWN0aW9ucyBhcyB3ZWxsLCB1c2UKK2BNb2NrOjpWZXJpZnlBbmRDbGVhcigmbW9ja19vYmplY3QpYCBpbnN0ZWFkLiBUaGlzIGZ1bmN0aW9uIGRvZXMgd2hhdAorYE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX29iamVjdClgIGRvZXMgYW5kIHJldHVybnMgdGhlCitzYW1lIGBib29sYCwgKipwbHVzKiogaXQgY2xlYXJzIHRoZSBgT05fQ0FMTCgpYCBzdGF0ZW1lbnRzIG9uCitgbW9ja19vYmplY3RgIHRvby4KKworQW5vdGhlciB0cmljayB5b3UgY2FuIHVzZSB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBpcyB0byBwdXQgdGhlCitleHBlY3RhdGlvbnMgaW4gc2VxdWVuY2VzIGFuZCBpbnNlcnQgY2FsbHMgdG8gYSBkdW1teSAiY2hlY2stcG9pbnQiCitmdW5jdGlvbiBhdCBzcGVjaWZpYyBwbGFjZXMuIFRoZW4geW91IGNhbiB2ZXJpZnkgdGhhdCB0aGUgbW9jaworZnVuY3Rpb24gY2FsbHMgZG8gaGFwcGVuIGF0IHRoZSByaWdodCB0aW1lLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZQorZXhlcmNpc2luZyBjb2RlOgorCitgYGAKK0ZvbygxKTsKK0ZvbygyKTsKK0ZvbygzKTsKK2BgYAorCithbmQgd2FudCB0byB2ZXJpZnkgdGhhdCBgRm9vKDEpYCBhbmQgYEZvbygzKWAgYm90aCBpbnZva2UKK2Btb2NrLkJhcigiYSIpYCwgYnV0IGBGb28oMilgIGRvZXNuJ3QgaW52b2tlIGFueXRoaW5nLiBZb3UgY2FuIHdyaXRlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TW9ja0Z1bmN0aW9uOworCitURVNUKEZvb1Rlc3QsIEludm9rZXNCYXJDb3JyZWN0bHkpIHsKKyAgTXlNb2NrIG1vY2s7CisgIC8vIENsYXNzIE1vY2tGdW5jdGlvbjxGPiBoYXMgZXhhY3RseSBvbmUgbW9jayBtZXRob2QuICBJdCBpcyBuYW1lZAorICAvLyBDYWxsKCkgYW5kIGhhcyB0eXBlIEYuCisgIE1vY2tGdW5jdGlvbjx2b2lkKHN0cmluZyBjaGVja19wb2ludF9uYW1lKT4gY2hlY2s7CisgIHsKKyAgICBJblNlcXVlbmNlIHM7CisKKyAgICBFWFBFQ1RfQ0FMTChtb2NrLCBCYXIoImEiKSk7CisgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjEiKSk7CisgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjIiKSk7CisgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOworICB9CisgIEZvbygxKTsKKyAgY2hlY2suQ2FsbCgiMSIpOworICBGb28oMik7CisgIGNoZWNrLkNhbGwoIjIiKTsKKyAgRm9vKDMpOworfQorYGBgCisKK1RoZSBleHBlY3RhdGlvbiBzcGVjIHNheXMgdGhhdCB0aGUgZmlyc3QgYEJhcigiYSIpYCBtdXN0IGhhcHBlbiBiZWZvcmUKK2NoZWNrIHBvaW50ICIxIiwgdGhlIHNlY29uZCBgQmFyKCJhIilgIG11c3QgaGFwcGVuIGFmdGVyIGNoZWNrIHBvaW50ICIyIiwKK2FuZCBub3RoaW5nIHNob3VsZCBoYXBwZW4gYmV0d2VlbiB0aGUgdHdvIGNoZWNrIHBvaW50cy4gVGhlIGV4cGxpY2l0CitjaGVjayBwb2ludHMgbWFrZSBpdCBlYXN5IHRvIHRlbGwgd2hpY2ggYEJhcigiYSIpYCBpcyBjYWxsZWQgYnkgd2hpY2gKK2NhbGwgdG8gYEZvbygpYC4KKworIyMgTW9ja2luZyBEZXN0cnVjdG9ycyAjIworCitTb21ldGltZXMgeW91IHdhbnQgdG8gbWFrZSBzdXJlIGEgbW9jayBvYmplY3QgaXMgZGVzdHJ1Y3RlZCBhdCB0aGUKK3JpZ2h0IHRpbWUsIGUuZy4gYWZ0ZXIgYGJhci0+QSgpYCBpcyBjYWxsZWQgYnV0IGJlZm9yZSBgYmFyLT5CKClgIGlzCitjYWxsZWQuIFdlIGFscmVhZHkga25vdyB0aGF0IHlvdSBjYW4gc3BlY2lmeSBjb25zdHJhaW50cyBvbiB0aGUgb3JkZXIKK29mIG1vY2sgZnVuY3Rpb24gY2FsbHMsIHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHRvIG1vY2sgdGhlIGRlc3RydWN0b3IKK29mIHRoZSBtb2NrIGZ1bmN0aW9uLgorCitUaGlzIHNvdW5kcyBzaW1wbGUsIGV4Y2VwdCBmb3Igb25lIHByb2JsZW06IGEgZGVzdHJ1Y3RvciBpcyBhIHNwZWNpYWwKK2Z1bmN0aW9uIHdpdGggc3BlY2lhbCBzeW50YXggYW5kIHNwZWNpYWwgc2VtYW50aWNzLCBhbmQgdGhlCitgTU9DS19NRVRIT0QwYCBtYWNybyBkb2Vzbid0IHdvcmsgZm9yIGl0OgorCitgYGAKKyAgTU9DS19NRVRIT0QwKH5Nb2NrRm9vLCB2b2lkKCkpOyAgLy8gV29uJ3QgY29tcGlsZSEKK2BgYAorCitUaGUgZ29vZCBuZXdzIGlzIHRoYXQgeW91IGNhbiB1c2UgYSBzaW1wbGUgcGF0dGVybiB0byBhY2hpZXZlIHRoZSBzYW1lCitlZmZlY3QuIEZpcnN0LCBhZGQgYSBtb2NrIGZ1bmN0aW9uIGBEaWUoKWAgdG8geW91ciBtb2NrIGNsYXNzIGFuZCBjYWxsCitpdCBpbiB0aGUgZGVzdHJ1Y3RvciwgbGlrZSB0aGlzOgorCitgYGAKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgLi4uCisgIC8vIEFkZCB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyB0byB0aGUgbW9jayBjbGFzcy4KKyAgTU9DS19NRVRIT0QwKERpZSwgdm9pZCgpKTsKKyAgdmlydHVhbCB+TW9ja0ZvbygpIHsgRGllKCk7IH0KK307CitgYGAKKworKElmIHRoZSBuYW1lIGBEaWUoKWAgY2xhc2hlcyB3aXRoIGFuIGV4aXN0aW5nIHN5bWJvbCwgY2hvb3NlIGFub3RoZXIKK25hbWUuKSBOb3csIHdlIGhhdmUgdHJhbnNsYXRlZCB0aGUgcHJvYmxlbSBvZiB0ZXN0aW5nIHdoZW4gYSBgTW9ja0Zvb2AKK29iamVjdCBkaWVzIHRvIHRlc3Rpbmcgd2hlbiBpdHMgYERpZSgpYCBtZXRob2QgaXMgY2FsbGVkOgorCitgYGAKKyAgTW9ja0ZvbyogZm9vID0gbmV3IE1vY2tGb287CisgIE1vY2tCYXIqIGJhciA9IG5ldyBNb2NrQmFyOworICAuLi4KKyAgeworICAgIEluU2VxdWVuY2UgczsKKworICAgIC8vIEV4cGVjdHMgKmZvbyB0byBkaWUgYWZ0ZXIgYmFyLT5BKCkgYW5kIGJlZm9yZSBiYXItPkIoKS4KKyAgICBFWFBFQ1RfQ0FMTCgqYmFyLCBBKCkpOworICAgIEVYUEVDVF9DQUxMKCpmb28sIERpZSgpKTsKKyAgICBFWFBFQ1RfQ0FMTCgqYmFyLCBCKCkpOworICB9CitgYGAKKworQW5kIHRoYXQncyB0aGF0LgorCisjIyBVc2luZyBHb29nbGUgTW9jayBhbmQgVGhyZWFkcyAjIworCisqKklNUE9SVEFOVCBOT1RFOioqIFdoYXQgd2UgZGVzY3JpYmUgaW4gdGhpcyByZWNpcGUgaXMgKipPTkxZKiogdHJ1ZSBvbgorcGxhdGZvcm1zIHdoZXJlIEdvb2dsZSBNb2NrIGlzIHRocmVhZC1zYWZlLiBDdXJyZW50bHkgdGhlc2UgYXJlIG9ubHkKK3BsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhlIHB0aHJlYWRzIGxpYnJhcnkgKHRoaXMgaW5jbHVkZXMgTGludXggYW5kIE1hYykuCitUbyBtYWtlIGl0IHRocmVhZC1zYWZlIG9uIG90aGVyIHBsYXRmb3JtcyB3ZSBvbmx5IG5lZWQgdG8gaW1wbGVtZW50Citzb21lIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zIGluIGAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oImAuCisKK0luIGEgKip1bml0KiogdGVzdCwgaXQncyBiZXN0IGlmIHlvdSBjb3VsZCBpc29sYXRlIGFuZCB0ZXN0IGEgcGllY2Ugb2YKK2NvZGUgaW4gYSBzaW5nbGUtdGhyZWFkZWQgY29udGV4dC4gVGhhdCBhdm9pZHMgcmFjZSBjb25kaXRpb25zIGFuZAorZGVhZCBsb2NrcywgYW5kIG1ha2VzIGRlYnVnZ2luZyB5b3VyIHRlc3QgbXVjaCBlYXNpZXIuCisKK1lldCBtYW55IHByb2dyYW1zIGFyZSBtdWx0aS10aHJlYWRlZCwgYW5kIHNvbWV0aW1lcyB0byB0ZXN0IHNvbWV0aGluZword2UgbmVlZCB0byBwb3VuZCBvbiBpdCBmcm9tIG1vcmUgdGhhbiBvbmUgdGhyZWFkLiBHb29nbGUgTW9jayB3b3JrcworZm9yIHRoaXMgcHVycG9zZSB0b28uCisKK1JlbWVtYmVyIHRoZSBzdGVwcyBmb3IgdXNpbmcgYSBtb2NrOgorCisgIDEuIENyZWF0ZSBhIG1vY2sgb2JqZWN0IGBmb29gLgorICAxLiBTZXQgaXRzIGRlZmF1bHQgYWN0aW9ucyBhbmQgZXhwZWN0YXRpb25zIHVzaW5nIGBPTl9DQUxMKClgIGFuZCBgRVhQRUNUX0NBTEwoKWAuCisgIDEuIFRoZSBjb2RlIHVuZGVyIHRlc3QgY2FsbHMgbWV0aG9kcyBvZiBgZm9vYC4KKyAgMS4gT3B0aW9uYWxseSwgdmVyaWZ5IGFuZCByZXNldCB0aGUgbW9jay4KKyAgMS4gRGVzdHJveSB0aGUgbW9jayB5b3Vyc2VsZiwgb3IgbGV0IHRoZSBjb2RlIHVuZGVyIHRlc3QgZGVzdHJveSBpdC4gVGhlIGRlc3RydWN0b3Igd2lsbCBhdXRvbWF0aWNhbGx5IHZlcmlmeSBpdC4KKworSWYgeW91IGZvbGxvdyB0aGUgZm9sbG93aW5nIHNpbXBsZSBydWxlcywgeW91ciBtb2NrcyBhbmQgdGhyZWFkcyBjYW4KK2xpdmUgaGFwcGlseSB0b2dldGVyOgorCisgICogRXhlY3V0ZSB5b3VyIF90ZXN0IGNvZGVfIChhcyBvcHBvc2VkIHRvIHRoZSBjb2RlIGJlaW5nIHRlc3RlZCkgaW4gX29uZV8gdGhyZWFkLiBUaGlzIG1ha2VzIHlvdXIgdGVzdCBlYXN5IHRvIGZvbGxvdy4KKyAgKiBPYnZpb3VzbHksIHlvdSBjYW4gZG8gc3RlcCAjMSB3aXRob3V0IGxvY2tpbmcuCisgICogV2hlbiBkb2luZyBzdGVwICMyIGFuZCAjNSwgbWFrZSBzdXJlIG5vIG90aGVyIHRocmVhZCBpcyBhY2Nlc3NpbmcgYGZvb2AuIE9idmlvdXMgdG9vLCBodWg/CisgICogIzMgYW5kICM0IGNhbiBiZSBkb25lIGVpdGhlciBpbiBvbmUgdGhyZWFkIG9yIGluIG11bHRpcGxlIHRocmVhZHMgLSBhbnl3YXkgeW91IHdhbnQuIEdvb2dsZSBNb2NrIHRha2VzIGNhcmUgb2YgdGhlIGxvY2tpbmcsIHNvIHlvdSBkb24ndCBoYXZlIHRvIGRvIGFueSAtIHVubGVzcyByZXF1aXJlZCBieSB5b3VyIHRlc3QgbG9naWMuCisKK0lmIHlvdSB2aW9sYXRlIHRoZSBydWxlcyAoZm9yIGV4YW1wbGUsIGlmIHlvdSBzZXQgZXhwZWN0YXRpb25zIG9uIGEKK21vY2sgd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgY2FsbGluZyBpdHMgbWV0aG9kcyksIHlvdSBnZXQgdW5kZWZpbmVkCitiZWhhdmlvci4gVGhhdCdzIG5vdCBmdW4sIHNvIGRvbid0IGRvIGl0LgorCitHb29nbGUgTW9jayBndWFyYW50ZWVzIHRoYXQgdGhlIGFjdGlvbiBmb3IgYSBtb2NrIGZ1bmN0aW9uIGlzIGRvbmUgaW4KK3RoZSBzYW1lIHRocmVhZCB0aGF0IGNhbGxlZCB0aGUgbW9jayBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIGluCisKK2BgYAorICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oMSkpCisgICAgICAuV2lsbE9uY2UoYWN0aW9uMSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbygyKSkKKyAgICAgIC5XaWxsT25jZShhY3Rpb24yKTsKK2BgYAorCitpZiBgRm9vKDEpYCBpcyBjYWxsZWQgaW4gdGhyZWFkIDEgYW5kIGBGb28oMilgIGlzIGNhbGxlZCBpbiB0aHJlYWQgMiwKK0dvb2dsZSBNb2NrIHdpbGwgZXhlY3V0ZSBgYWN0aW9uMWAgaW4gdGhyZWFkIDEgYW5kIGBhY3Rpb24yYCBpbiB0aHJlYWQKKzIuCisKK0dvb2dsZSBNb2NrIGRvZXMgX25vdF8gaW1wb3NlIGEgc2VxdWVuY2Ugb24gYWN0aW9ucyBwZXJmb3JtZWQgaW4KK2RpZmZlcmVudCB0aHJlYWRzIChkb2luZyBzbyBtYXkgY3JlYXRlIGRlYWRsb2NrcyBhcyB0aGUgYWN0aW9ucyBtYXkKK25lZWQgdG8gY29vcGVyYXRlKS4gVGhpcyBtZWFucyB0aGF0IHRoZSBleGVjdXRpb24gb2YgYGFjdGlvbjFgIGFuZAorYGFjdGlvbjJgIGluIHRoZSBhYm92ZSBleGFtcGxlIF9tYXlfIGludGVybGVhdmUuIElmIHRoaXMgaXMgYSBwcm9ibGVtLAoreW91IHNob3VsZCBhZGQgcHJvcGVyIHN5bmNocm9uaXphdGlvbiBsb2dpYyB0byBgYWN0aW9uMWAgYW5kIGBhY3Rpb24yYAordG8gbWFrZSB0aGUgdGVzdCB0aHJlYWQtc2FmZS4KKworCitBbHNvLCByZW1lbWJlciB0aGF0IGBEZWZhdWx0VmFsdWU8VD5gIGlzIGEgZ2xvYmFsIHJlc291cmNlIHRoYXQKK3BvdGVudGlhbGx5IGFmZmVjdHMgX2FsbF8gbGl2aW5nIG1vY2sgb2JqZWN0cyBpbiB5b3VyCitwcm9ncmFtLiBOYXR1cmFsbHksIHlvdSB3b24ndCB3YW50IHRvIG1lc3Mgd2l0aCBpdCBmcm9tIG11bHRpcGxlCit0aHJlYWRzIG9yIHdoZW4gdGhlcmUgc3RpbGwgYXJlIG1vY2tzIGluIGFjdGlvbi4KKworIyMgQ29udHJvbGxpbmcgSG93IE11Y2ggSW5mb3JtYXRpb24gR29vZ2xlIE1vY2sgUHJpbnRzICMjCisKK1doZW4gR29vZ2xlIE1vY2sgc2VlcyBzb21ldGhpbmcgdGhhdCBoYXMgdGhlIHBvdGVudGlhbCBvZiBiZWluZyBhbgorZXJyb3IgKGUuZy4gYSBtb2NrIGZ1bmN0aW9uIHdpdGggbm8gZXhwZWN0YXRpb24gaXMgY2FsbGVkLCBhLmsuYS4gYW4KK3VuaW50ZXJlc3RpbmcgY2FsbCwgd2hpY2ggaXMgYWxsb3dlZCBidXQgcGVyaGFwcyB5b3UgZm9yZ290IHRvCitleHBsaWNpdGx5IGJhbiB0aGUgY2FsbCksIGl0IHByaW50cyBzb21lIHdhcm5pbmcgbWVzc2FnZXMsIGluY2x1ZGluZwordGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24gYW5kIHRoZSByZXR1cm4gdmFsdWUuIEhvcGVmdWxseSB0aGlzCit3aWxsIHJlbWluZCB5b3UgdG8gdGFrZSBhIGxvb2sgYW5kIHNlZSBpZiB0aGVyZSBpcyBpbmRlZWQgYSBwcm9ibGVtLgorCitTb21ldGltZXMgeW91IGFyZSBjb25maWRlbnQgdGhhdCB5b3VyIHRlc3RzIGFyZSBjb3JyZWN0IGFuZCBtYXkgbm90CithcHByZWNpYXRlIHN1Y2ggZnJpZW5kbHkgbWVzc2FnZXMuIFNvbWUgb3RoZXIgdGltZXMsIHlvdSBhcmUgZGVidWdnaW5nCit5b3VyIHRlc3RzIG9yIGxlYXJuaW5nIGFib3V0IHRoZSBiZWhhdmlvciBvZiB0aGUgY29kZSB5b3UgYXJlIHRlc3RpbmcsCithbmQgd2lzaCB5b3UgY291bGQgb2JzZXJ2ZSBldmVyeSBtb2NrIGNhbGwgdGhhdCBoYXBwZW5zIChpbmNsdWRpbmcKK2FyZ3VtZW50IHZhbHVlcyBhbmQgdGhlIHJldHVybiB2YWx1ZSkuIENsZWFybHksIG9uZSBzaXplIGRvZXNuJ3QgZml0CithbGwuCisKK1lvdSBjYW4gY29udHJvbCBob3cgbXVjaCBHb29nbGUgTW9jayB0ZWxscyB5b3UgdXNpbmcgdGhlCitgLS1nbW9ja192ZXJib3NlPUxFVkVMYCBjb21tYW5kLWxpbmUgZmxhZywgd2hlcmUgYExFVkVMYCBpcyBhIHN0cmluZword2l0aCB0aHJlZSBwb3NzaWJsZSB2YWx1ZXM6CisKKyAgKiBgaW5mb2A6IEdvb2dsZSBNb2NrIHdpbGwgcHJpbnQgYWxsIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMsIHdhcm5pbmdzLCBhbmQgZXJyb3JzIChtb3N0IHZlcmJvc2UpLiBBdCB0aGlzIHNldHRpbmcsIEdvb2dsZSBNb2NrIHdpbGwgYWxzbyBsb2cgYW55IGNhbGxzIHRvIHRoZSBgT05fQ0FMTC9FWFBFQ1RfQ0FMTGAgbWFjcm9zLgorICAqIGB3YXJuaW5nYDogR29vZ2xlIE1vY2sgd2lsbCBwcmludCBib3RoIHdhcm5pbmdzIGFuZCBlcnJvcnMgKGxlc3MgdmVyYm9zZSkuIFRoaXMgaXMgdGhlIGRlZmF1bHQuCisgICogYGVycm9yYDogR29vZ2xlIE1vY2sgd2lsbCBwcmludCBlcnJvcnMgb25seSAobGVhc3QgdmVyYm9zZSkuCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gYWRqdXN0IHRoZSB2YWx1ZSBvZiB0aGF0IGZsYWcgZnJvbSB3aXRoaW4geW91cgordGVzdHMgbGlrZSBzbzoKKworYGBgCisgIDo6dGVzdGluZzo6RkxBR1NfZ21vY2tfdmVyYm9zZSA9ICJlcnJvciI7CitgYGAKKworTm93LCBqdWRpY2lvdXNseSB1c2UgdGhlIHJpZ2h0IGZsYWcgdG8gZW5hYmxlIEdvb2dsZSBNb2NrIHNlcnZlIHlvdSBiZXR0ZXIhCisKKyMjIFJ1bm5pbmcgVGVzdHMgaW4gRW1hY3MgIyMKKworSWYgeW91IGJ1aWxkIGFuZCBydW4geW91ciB0ZXN0cyBpbiBFbWFjcywgdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9ucyBvZgorR29vZ2xlIE1vY2sgYW5kIFtHb29nbGUgVGVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvKQorZXJyb3JzIHdpbGwgYmUgaGlnaGxpZ2h0ZWQuIEp1c3QgcHJlc3MgYDxFbnRlcj5gIG9uIG9uZSBvZiB0aGVtIGFuZAoreW91J2xsIGJlIHRha2VuIHRvIHRoZSBvZmZlbmRpbmcgbGluZS4gT3IsIHlvdSBjYW4ganVzdCB0eXBlIGBDLXggYGAKK3RvIGp1bXAgdG8gdGhlIG5leHQgZXJyb3IuCisKK1RvIG1ha2UgaXQgZXZlbiBlYXNpZXIsIHlvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8geW91cgorYH4vLmVtYWNzYCBmaWxlOgorCitgYGAKKyhnbG9iYWwtc2V0LWtleSAiXE0tbSIgICAnY29tcGlsZSkgIDsgbSBpcyBmb3IgbWFrZQorKGdsb2JhbC1zZXQta2V5IFtNLWRvd25dICduZXh0LWVycm9yKQorKGdsb2JhbC1zZXQta2V5IFtNLXVwXSAgICcobGFtYmRhICgpIChpbnRlcmFjdGl2ZSkgKG5leHQtZXJyb3IgLTEpKSkKK2BgYAorCitUaGVuIHlvdSBjYW4gdHlwZSBgTS1tYCB0byBzdGFydCBhIGJ1aWxkLCBvciBgTS11cGAvYE0tZG93bmAgdG8gbW92ZQorYmFjayBhbmQgZm9ydGggYmV0d2VlbiBlcnJvcnMuCisKKyMjIEZ1c2luZyBHb29nbGUgTW9jayBTb3VyY2UgRmlsZXMgIyMKKworR29vZ2xlIE1vY2sncyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiBkb3plbnMgb2YgZmlsZXMgKGV4Y2x1ZGluZworaXRzIG93biB0ZXN0cykuICBTb21ldGltZXMgeW91IG1heSB3YW50IHRoZW0gdG8gYmUgcGFja2FnZWQgdXAgaW4KK2Zld2VyIGZpbGVzIGluc3RlYWQsIHN1Y2ggdGhhdCB5b3UgY2FuIGVhc2lseSBjb3B5IHRoZW0gdG8gYSBuZXcKK21hY2hpbmUgYW5kIHN0YXJ0IGhhY2tpbmcgdGhlcmUuICBGb3IgdGhpcyB3ZSBwcm92aWRlIGFuIGV4cGVyaW1lbnRhbAorUHl0aG9uIHNjcmlwdCBgZnVzZV9nbW9ja19maWxlcy5weWAgaW4gdGhlIGBzY3JpcHRzL2AgZGlyZWN0b3J5Cisoc3RhcnRpbmcgd2l0aCByZWxlYXNlIDEuMi4wKS4gIEFzc3VtaW5nIHlvdSBoYXZlIFB5dGhvbiAyLjQgb3IgYWJvdmUKK2luc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUsIGp1c3QgZ28gdG8gdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bgorYGBgCitweXRob24gZnVzZV9nbW9ja19maWxlcy5weSBPVVRQVVRfRElSCitgYGAKKworYW5kIHlvdSBzaG91bGQgc2VlIGFuIGBPVVRQVVRfRElSYCBkaXJlY3RvcnkgYmVpbmcgY3JlYXRlZCB3aXRoIGZpbGVzCitgZ3Rlc3QvZ3Rlc3QuaGAsIGBnbW9jay9nbW9jay5oYCwgYW5kIGBnbW9jay1ndGVzdC1hbGwuY2NgIGluIGl0LgorVGhlc2UgdGhyZWUgZmlsZXMgY29udGFpbiBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIHVzZSBHb29nbGUgTW9jayAoYW5kCitHb29nbGUgVGVzdCkuICBKdXN0IGNvcHkgdGhlbSB0byBhbnl3aGVyZSB5b3Ugd2FudCBhbmQgeW91IGFyZSByZWFkeQordG8gd3JpdGUgdGVzdHMgYW5kIHVzZSBtb2Nrcy4gIFlvdSBjYW4gdXNlIHRoZQorW3NjcnB0cy90ZXN0L01ha2VmaWxlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvdGVzdC9NYWtlZmlsZSkgZmlsZSBhcyBhbiBleGFtcGxlIG9uIGhvdyB0byBjb21waWxlIHlvdXIgdGVzdHMKK2FnYWluc3QgdGhlbS4KKworIyBFeHRlbmRpbmcgR29vZ2xlIE1vY2sgIworCisjIyBXcml0aW5nIE5ldyBNYXRjaGVycyBRdWlja2x5ICMjCisKK1RoZSBgTUFUQ0hFUipgIGZhbWlseSBvZiBtYWNyb3MgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGN1c3RvbSBtYXRjaGVycworZWFzaWx5LiAgVGhlIHN5bnRheDoKKworYGBgCitNQVRDSEVSKG5hbWUsIGRlc2NyaXB0aW9uX3N0cmluZ19leHByZXNzaW9uKSB7IHN0YXRlbWVudHM7IH0KK2BgYAorCit3aWxsIGRlZmluZSBhIG1hdGNoZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0aGF0IGV4ZWN1dGVzIHRoZQorc3RhdGVtZW50cywgd2hpY2ggbXVzdCByZXR1cm4gYSBgYm9vbGAgdG8gaW5kaWNhdGUgaWYgdGhlIG1hdGNoCitzdWNjZWVkcy4gIEluc2lkZSB0aGUgc3RhdGVtZW50cywgeW91IGNhbiByZWZlciB0byB0aGUgdmFsdWUgYmVpbmcKK21hdGNoZWQgYnkgYGFyZ2AsIGFuZCByZWZlciB0byBpdHMgdHlwZSBieSBgYXJnX3R5cGVgLgorCitUaGUgZGVzY3JpcHRpb24gc3RyaW5nIGlzIGEgYHN0cmluZ2AtdHlwZWQgZXhwcmVzc2lvbiB0aGF0IGRvY3VtZW50cword2hhdCB0aGUgbWF0Y2hlciBkb2VzLCBhbmQgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmFpbHVyZSBtZXNzYWdlCit3aGVuIHRoZSBtYXRjaCBmYWlscy4gIEl0IGNhbiAoYW5kIHNob3VsZCkgcmVmZXJlbmNlIHRoZSBzcGVjaWFsCitgYm9vbGAgdmFyaWFibGUgYG5lZ2F0aW9uYCwgYW5kIHNob3VsZCBldmFsdWF0ZSB0byB0aGUgZGVzY3JpcHRpb24gb2YKK3RoZSBtYXRjaGVyIHdoZW4gYG5lZ2F0aW9uYCBpcyBgZmFsc2VgLCBvciB0aGF0IG9mIHRoZSBtYXRjaGVyJ3MKK25lZ2F0aW9uIHdoZW4gYG5lZ2F0aW9uYCBpcyBgdHJ1ZWAuCisKK0ZvciBjb252ZW5pZW5jZSwgd2UgYWxsb3cgdGhlIGRlc2NyaXB0aW9uIHN0cmluZyB0byBiZSBlbXB0eSAoYCIiYCksCitpbiB3aGljaCBjYXNlIEdvb2dsZSBNb2NrIHdpbGwgdXNlIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUKK21hdGNoZXIgbmFtZSBhcyB0aGUgZGVzY3JpcHRpb24uCisKK0ZvciBleGFtcGxlOgorYGBgCitNQVRDSEVSKElzRGl2aXNpYmxlQnk3LCAiIikgeyByZXR1cm4gKGFyZyAlIDcpID09IDA7IH0KK2BgYAorYWxsb3dzIHlvdSB0byB3cml0ZQorYGBgCisgIC8vIEV4cGVjdHMgbW9ja19mb28uQmFyKG4pIHRvIGJlIGNhbGxlZCB3aGVyZSBuIGlzIGRpdmlzaWJsZSBieSA3LgorICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgQmFyKElzRGl2aXNpYmxlQnk3KCkpKTsKK2BgYAorb3IsCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6Tm90OworLi4uCisgIEVYUEVDVF9USEFUKHNvbWVfZXhwcmVzc2lvbiwgSXNEaXZpc2libGVCeTcoKSk7CisgIEVYUEVDVF9USEFUKHNvbWVfb3RoZXJfZXhwcmVzc2lvbiwgTm90KElzRGl2aXNpYmxlQnk3KCkpKTsKK2BgYAorSWYgdGhlIGFib3ZlIGFzc2VydGlvbnMgZmFpbCwgdGhleSB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlOgorYGBgCisgIFZhbHVlIG9mOiBzb21lX2V4cHJlc3Npb24KKyAgRXhwZWN0ZWQ6IGlzIGRpdmlzaWJsZSBieSA3CisgICAgQWN0dWFsOiAyNworLi4uCisgIFZhbHVlIG9mOiBzb21lX290aGVyX2V4cHJlc3Npb24KKyAgRXhwZWN0ZWQ6IG5vdCAoaXMgZGl2aXNpYmxlIGJ5IDcpCisgICAgQWN0dWFsOiAyMQorYGBgCit3aGVyZSB0aGUgZGVzY3JpcHRpb25zIGAiaXMgZGl2aXNpYmxlIGJ5IDciYCBhbmQgYCJub3QgKGlzIGRpdmlzaWJsZQorYnkgNykiYCBhcmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlIG1hdGNoZXIgbmFtZQorYElzRGl2aXNpYmxlQnk3YC4KKworQXMgeW91IG1heSBoYXZlIG5vdGljZWQsIHRoZSBhdXRvLWdlbmVyYXRlZCBkZXNjcmlwdGlvbnMgKGVzcGVjaWFsbHkKK3Rob3NlIGZvciB0aGUgbmVnYXRpb24pIG1heSBub3QgYmUgc28gZ3JlYXQuIFlvdSBjYW4gYWx3YXlzIG92ZXJyaWRlCit0aGVtIHdpdGggYSBzdHJpbmcgZXhwcmVzc2lvbiBvZiB5b3VyIG93bjoKK2BgYAorTUFUQ0hFUihJc0RpdmlzaWJsZUJ5Nywgc3RkOjpzdHJpbmcobmVnYXRpb24gPyAiaXNuJ3QiIDogImlzIikgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBkaXZpc2libGUgYnkgNyIpIHsKKyAgcmV0dXJuIChhcmcgJSA3KSA9PSAwOworfQorYGBgCisKK09wdGlvbmFsbHksIHlvdSBjYW4gc3RyZWFtIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYSBoaWRkZW4gYXJndW1lbnQKK25hbWVkIGByZXN1bHRfbGlzdGVuZXJgIHRvIGV4cGxhaW4gdGhlIG1hdGNoIHJlc3VsdC4gRm9yIGV4YW1wbGUsIGEKK2JldHRlciBkZWZpbml0aW9uIG9mIGBJc0RpdmlzaWJsZUJ5N2AgaXM6CitgYGAKK01BVENIRVIoSXNEaXZpc2libGVCeTcsICIiKSB7CisgIGlmICgoYXJnICUgNykgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAqcmVzdWx0X2xpc3RlbmVyIDw8ICJ0aGUgcmVtYWluZGVyIGlzICIgPDwgKGFyZyAlIDcpOworICByZXR1cm4gZmFsc2U7Cit9CitgYGAKKworV2l0aCB0aGlzIGRlZmluaXRpb24sIHRoZSBhYm92ZSBhc3NlcnRpb24gd2lsbCBnaXZlIGEgYmV0dGVyIG1lc3NhZ2U6CitgYGAKKyAgVmFsdWUgb2Y6IHNvbWVfZXhwcmVzc2lvbgorICBFeHBlY3RlZDogaXMgZGl2aXNpYmxlIGJ5IDcKKyAgICBBY3R1YWw6IDI3ICh0aGUgcmVtYWluZGVyIGlzIDYpCitgYGAKKworWW91IHNob3VsZCBsZXQgYE1hdGNoQW5kRXhwbGFpbigpYCBwcmludCBfYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb25fCit0aGF0IGNhbiBoZWxwIGEgdXNlciB1bmRlcnN0YW5kIHRoZSBtYXRjaCByZXN1bHQuIE5vdGUgdGhhdCBpdCBzaG91bGQKK2V4cGxhaW4gd2h5IHRoZSBtYXRjaCBzdWNjZWVkcyBpbiBjYXNlIG9mIGEgc3VjY2VzcyAodW5sZXNzIGl0J3MKK29idmlvdXMpIC0gdGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgbWF0Y2hlciBpcyB1c2VkIGluc2lkZQorYE5vdCgpYC4gVGhlcmUgaXMgbm8gbmVlZCB0byBwcmludCB0aGUgYXJndW1lbnQgdmFsdWUgaXRzZWxmLCBhcworR29vZ2xlIE1vY2sgYWxyZWFkeSBwcmludHMgaXQgZm9yIHlvdS4KKworKipOb3RlczoqKgorCisgIDEuIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIChgYXJnX3R5cGVgKSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHlvdSB1c2UgdGhlIG1hdGNoZXIgYW5kIGlzIHN1cHBsaWVkIHRvIHlvdSBieSB0aGUgY29tcGlsZXIsIHNvIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGRlY2xhcmluZyBpdCAobm9yIGNhbiB5b3UpLiAgVGhpcyBhbGxvd3MgdGhlIG1hdGNoZXIgdG8gYmUgcG9seW1vcnBoaWMuICBGb3IgZXhhbXBsZSwgYElzRGl2aXNpYmxlQnk3KClgIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFueSB0eXBlIHdoZXJlIHRoZSB2YWx1ZSBvZiBgKGFyZyAlIDcpID09IDBgIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhIGBib29sYC4gIEluIHRoZSBgQmFyKElzRGl2aXNpYmxlQnk3KCkpYCBleGFtcGxlIGFib3ZlLCBpZiBtZXRob2QgYEJhcigpYCB0YWtlcyBhbiBgaW50YCwgYGFyZ190eXBlYCB3aWxsIGJlIGBpbnRgOyBpZiBpdCB0YWtlcyBhbiBgdW5zaWduZWQgbG9uZ2AsIGBhcmdfdHlwZWAgd2lsbCBiZSBgdW5zaWduZWQgbG9uZ2A7IGFuZCBzbyBvbi4KKyAgMS4gR29vZ2xlIE1vY2sgZG9lc24ndCBndWFyYW50ZWUgd2hlbiBvciBob3cgbWFueSB0aW1lcyBhIG1hdGNoZXIgd2lsbCBiZSBpbnZva2VkLiBUaGVyZWZvcmUgdGhlIG1hdGNoZXIgbG9naWMgbXVzdCBiZSBfcHVyZWx5IGZ1bmN0aW9uYWxfIChpLmUuIGl0IGNhbm5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdCwgYW5kIHRoZSByZXN1bHQgbXVzdCBub3QgZGVwZW5kIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYW5kIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMpLiBUaGlzIHJlcXVpcmVtZW50IG11c3QgYmUgc2F0aXNmaWVkIG5vIG1hdHRlciBob3cgeW91IGRlZmluZSB0aGUgbWF0Y2hlciAoZS5nLiB1c2luZyBvbmUgb2YgdGhlIG1ldGhvZHMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgcmVjaXBlcykuIEluIHBhcnRpY3VsYXIsIGEgbWF0Y2hlciBjYW4gbmV2ZXIgY2FsbCBhIG1vY2sgZnVuY3Rpb24sIGFzIHRoYXQgd2lsbCBhZmZlY3QgdGhlIHN0YXRlIG9mIHRoZSBtb2NrIG9iamVjdCBhbmQgR29vZ2xlIE1vY2suCisKKyMjIFdyaXRpbmcgTmV3IFBhcmFtZXRlcml6ZWQgTWF0Y2hlcnMgUXVpY2tseSAjIworCitTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gZGVmaW5lIGEgbWF0Y2hlciB0aGF0IGhhcyBwYXJhbWV0ZXJzLiAgRm9yIHRoYXQgeW91CitjYW4gdXNlIHRoZSBtYWNybzoKK2BgYAorTUFUQ0hFUl9QKG5hbWUsIHBhcmFtX25hbWUsIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9CitgYGAKK3doZXJlIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgY2FuIGJlIGVpdGhlciBgIiJgIG9yIGEgc3RyaW5nIGV4cHJlc3Npb24KK3RoYXQgcmVmZXJlbmNlcyBgbmVnYXRpb25gIGFuZCBgcGFyYW1fbmFtZWAuCisKK0ZvciBleGFtcGxlOgorYGBgCitNQVRDSEVSX1AoSGFzQWJzb2x1dGVWYWx1ZSwgdmFsdWUsICIiKSB7IHJldHVybiBhYnMoYXJnKSA9PSB2YWx1ZTsgfQorYGBgCit3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKK2BgYAorICBFWFBFQ1RfVEhBVChCbGFoKCJhIiksIEhhc0Fic29sdXRlVmFsdWUobikpOworYGBgCit3aGljaCBtYXkgbGVhZCB0byB0aGlzIG1lc3NhZ2UgKGFzc3VtaW5nIGBuYCBpcyAxMCk6CitgYGAKKyAgVmFsdWUgb2Y6IEJsYWgoImEiKQorICBFeHBlY3RlZDogaGFzIGFic29sdXRlIHZhbHVlIDEwCisgICAgQWN0dWFsOiAtOQorYGBgCisKK05vdGUgdGhhdCBib3RoIHRoZSBtYXRjaGVyIGRlc2NyaXB0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIGFyZQorcHJpbnRlZCwgbWFraW5nIHRoZSBtZXNzYWdlIGh1bWFuLWZyaWVuZGx5LgorCitJbiB0aGUgbWF0Y2hlciBkZWZpbml0aW9uIGJvZHksIHlvdSBjYW4gd3JpdGUgYGZvb190eXBlYCB0bworcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkIGBmb29gLiAgRm9yIGV4YW1wbGUsIGluIHRoZQorYm9keSBvZiBgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlKWAgYWJvdmUsIHlvdSBjYW4gd3JpdGUKK2B2YWx1ZV90eXBlYCB0byByZWZlciB0byB0aGUgdHlwZSBvZiBgdmFsdWVgLgorCitHb29nbGUgTW9jayBhbHNvIHByb3ZpZGVzIGBNQVRDSEVSX1AyYCwgYE1BVENIRVJfUDNgLCAuLi4sIHVwIHRvCitgTUFUQ0hFUl9QMTBgIHRvIHN1cHBvcnQgbXVsdGktcGFyYW1ldGVyIG1hdGNoZXJzOgorYGBgCitNQVRDSEVSX1BrKG5hbWUsIHBhcmFtXzEsIC4uLiwgcGFyYW1faywgZGVzY3JpcHRpb25fc3RyaW5nKSB7IHN0YXRlbWVudHM7IH0KK2BgYAorCitQbGVhc2Ugbm90ZSB0aGF0IHRoZSBjdXN0b20gZGVzY3JpcHRpb24gc3RyaW5nIGlzIGZvciBhIHBhcnRpY3VsYXIKKyoqaW5zdGFuY2UqKiBvZiB0aGUgbWF0Y2hlciwgd2hlcmUgdGhlIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGJvdW5kIHRvCithY3R1YWwgdmFsdWVzLiAgVGhlcmVmb3JlIHVzdWFsbHkgeW91J2xsIHdhbnQgdGhlIHBhcmFtZXRlciB2YWx1ZXMgdG8KK2JlIHBhcnQgb2YgdGhlIGRlc2NyaXB0aW9uLiAgR29vZ2xlIE1vY2sgbGV0cyB5b3UgZG8gdGhhdCBieQorcmVmZXJlbmNpbmcgdGhlIG1hdGNoZXIgcGFyYW1ldGVycyBpbiB0aGUgZGVzY3JpcHRpb24gc3RyaW5nCitleHByZXNzaW9uLgorCitGb3IgZXhhbXBsZSwKK2BgYAorICB1c2luZyA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmc7CisgIE1BVENIRVJfUDIoSW5DbG9zZWRSYW5nZSwgbG93LCBoaSwKKyAgICAgICAgICAgICBzdGQ6OnN0cmluZyhuZWdhdGlvbiA/ICJpc24ndCIgOiAiaXMiKSArICIgaW4gcmFuZ2UgWyIgKworICAgICAgICAgICAgIFByaW50VG9TdHJpbmcobG93KSArICIsICIgKyBQcmludFRvU3RyaW5nKGhpKSArICJdIikgeworICAgIHJldHVybiBsb3cgPD0gYXJnICYmIGFyZyA8PSBoaTsKKyAgfQorICAuLi4KKyAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7CitgYGAKK3dvdWxkIGdlbmVyYXRlIGEgZmFpbHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlOgorYGBgCisgIEV4cGVjdGVkOiBpcyBpbiByYW5nZSBbNCwgNl0KK2BgYAorCitJZiB5b3Ugc3BlY2lmeSBgIiJgIGFzIHRoZSBkZXNjcmlwdGlvbiwgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aWxsCitjb250YWluIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUgbWF0Y2hlciBuYW1lIGZvbGxvd2VkIGJ5IHRoZQorcGFyYW1ldGVyIHZhbHVlcyBwcmludGVkIGFzIGEgdHVwbGUuICBGb3IgZXhhbXBsZSwKK2BgYAorICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksICIiKSB7IC4uLiB9CisgIC4uLgorICBFWFBFQ1RfVEhBVCgzLCBJbkNsb3NlZFJhbmdlKDQsIDYpKTsKK2BgYAord291bGQgZ2VuZXJhdGUgYSBmYWlsdXJlIHRoYXQgY29udGFpbnMgdGhlIHRleHQ6CitgYGAKKyAgRXhwZWN0ZWQ6IGluIGNsb3NlZCByYW5nZSAoNCwgNikKK2BgYAorCitGb3IgdGhlIHB1cnBvc2Ugb2YgdHlwaW5nLCB5b3UgY2FuIHZpZXcKK2BgYAorTUFUQ0hFUl9QayhGb28sIHAxLCAuLi4sIHBrLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgLi4uIH0KK2BgYAorYXMgc2hvcnRoYW5kIGZvcgorYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPgorRm9vTWF0Y2hlclBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4KK0ZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0KK2BgYAorCitXaGVuIHlvdSB3cml0ZSBgRm9vKHYxLCAuLi4sIHZrKWAsIHRoZSBjb21waWxlciBpbmZlcnMgdGhlIHR5cGVzIG9mCit0aGUgcGFyYW1ldGVycyBgdjFgLCAuLi4sIGFuZCBgdmtgIGZvciB5b3UuICBJZiB5b3UgYXJlIG5vdCBoYXBweSB3aXRoCit0aGUgcmVzdWx0IG9mIHRoZSB0eXBlIGluZmVyZW5jZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSB0eXBlcyBieQorZXhwbGljaXRseSBpbnN0YW50aWF0aW5nIHRoZSB0ZW1wbGF0ZSwgYXMgaW4gYEZvbzxsb25nLCBib29sPig1LCBmYWxzZSlgLgorQXMgc2FpZCBlYXJsaWVyLCB5b3UgZG9uJ3QgZ2V0IHRvIChvciBuZWVkIHRvKSBzcGVjaWZ5CitgYXJnX3R5cGVgIGFzIHRoYXQncyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBtYXRjaGVyCitpcyB1c2VkLgorCitZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24gYEZvbyhwMSwgLi4uLCBwaylgIHRvIGEKK3ZhcmlhYmxlIG9mIHR5cGUgYEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+YC4gIFRoaXMgY2FuIGJlCit1c2VmdWwgd2hlbiBjb21wb3NpbmcgbWF0Y2hlcnMuICBNYXRjaGVycyB0aGF0IGRvbid0IGhhdmUgYSBwYXJhbWV0ZXIKK29yIGhhdmUgb25seSBvbmUgcGFyYW1ldGVyIGhhdmUgc3BlY2lhbCB0eXBlczogeW91IGNhbiBhc3NpZ24gYEZvbygpYAordG8gYSBgRm9vTWF0Y2hlcmAtdHlwZWQgdmFyaWFibGUsIGFuZCBhc3NpZ24gYEZvbyhwKWAgdG8gYQorYEZvb01hdGNoZXJQPHBfdHlwZT5gLXR5cGVkIHZhcmlhYmxlLgorCitXaGlsZSB5b3UgY2FuIGluc3RhbnRpYXRlIGEgbWF0Y2hlciB0ZW1wbGF0ZSB3aXRoIHJlZmVyZW5jZSB0eXBlcywKK3Bhc3NpbmcgdGhlIHBhcmFtZXRlcnMgYnkgcG9pbnRlciB1c3VhbGx5IG1ha2VzIHlvdXIgY29kZSBtb3JlCityZWFkYWJsZS4gIElmLCBob3dldmVyLCB5b3Ugc3RpbGwgd2FudCB0byBwYXNzIGEgcGFyYW1ldGVyIGJ5CityZWZlcmVuY2UsIGJlIGF3YXJlIHRoYXQgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlCittYXRjaGVyIHlvdSB3aWxsIHNlZSB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGJ1dCBub3QgaXRzCithZGRyZXNzLgorCitZb3UgY2FuIG92ZXJsb2FkIG1hdGNoZXJzIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgcGFyYW1ldGVyczoKK2BgYAorTUFUQ0hFUl9QKEJsYWgsIGEsIGRlc2NyaXB0aW9uX3N0cmluZ18xKSB7IC4uLiB9CitNQVRDSEVSX1AyKEJsYWgsIGEsIGIsIGRlc2NyaXB0aW9uX3N0cmluZ18yKSB7IC4uLiB9CitgYGAKKworV2hpbGUgaXQncyB0ZW1wdGluZyB0byBhbHdheXMgdXNlIHRoZSBgTUFUQ0hFUipgIG1hY3JvcyB3aGVuIGRlZmluaW5nCithIG5ldyBtYXRjaGVyLCB5b3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgaW1wbGVtZW50aW5nCitgTWF0Y2hlckludGVyZmFjZWAgb3IgdXNpbmcgYE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKWAgaW5zdGVhZCAoc2VlCit0aGUgcmVjaXBlcyB0aGF0IGZvbGxvdyksIGVzcGVjaWFsbHkgaWYgeW91IG5lZWQgdG8gdXNlIHRoZSBtYXRjaGVyIGEKK2xvdC4gIFdoaWxlIHRoZXNlIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmssIHRoZXkgZ2l2ZSB5b3UgbW9yZQorY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYW5kIHRoZSBtYXRjaGVyCitwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzIHRvIGJldHRlciBjb21waWxlciBlcnJvciBtZXNzYWdlcwordGhhdCBwYXkgb2ZmIGluIHRoZSBsb25nIHJ1bi4gIFRoZXkgYWxzbyBhbGxvdyBvdmVybG9hZGluZyBtYXRjaGVycworYmFzZWQgb24gcGFyYW1ldGVyIHR5cGVzIChhcyBvcHBvc2VkIHRvIGp1c3QgYmFzZWQgb24gdGhlIG51bWJlciBvZgorcGFyYW1ldGVycykuCisKKyMjIFdyaXRpbmcgTmV3IE1vbm9tb3JwaGljIE1hdGNoZXJzICMjCisKK0EgbWF0Y2hlciBvZiBhcmd1bWVudCB0eXBlIGBUYCBpbXBsZW1lbnRzCitgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPFQ+YCBhbmQgZG9lcyB0d28gdGhpbmdzOiBpdCB0ZXN0cyB3aGV0aGVyIGEKK3ZhbHVlIG9mIHR5cGUgYFRgIG1hdGNoZXMgdGhlIG1hdGNoZXIsIGFuZCBjYW4gZGVzY3JpYmUgd2hhdCBraW5kIG9mCit2YWx1ZXMgaXQgbWF0Y2hlcy4gVGhlIGxhdHRlciBhYmlsaXR5IGlzIHVzZWQgZm9yIGdlbmVyYXRpbmcgcmVhZGFibGUKK2Vycm9yIG1lc3NhZ2VzIHdoZW4gZXhwZWN0YXRpb25zIGFyZSB2aW9sYXRlZC4KKworVGhlIGludGVyZmFjZSBsb29rcyBsaWtlIHRoaXM6CisKK2BgYAorY2xhc3MgTWF0Y2hSZXN1bHRMaXN0ZW5lciB7CisgcHVibGljOgorICAuLi4KKyAgLy8gU3RyZWFtcyB4IHRvIHRoZSB1bmRlcmx5aW5nIG9zdHJlYW07IGRvZXMgbm90aGluZyBpZiB0aGUgb3N0cmVhbQorICAvLyBpcyBOVUxMLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgTWF0Y2hSZXN1bHRMaXN0ZW5lciYgb3BlcmF0b3I8PChjb25zdCBUJiB4KTsKKworICAvLyBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIG9zdHJlYW0uCisgIDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0oKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTWF0Y2hlckludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5NYXRjaGVySW50ZXJmYWNlKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbWF0Y2hlciBtYXRjaGVzIHg7IGFsc28gZXhwbGFpbnMgdGhlIG1hdGNoCisgIC8vIHJlc3VsdCB0byAnbGlzdGVuZXInLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0ID0gMDsKKworICAvLyBEZXNjcmliZXMgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOworCisgIC8vIERlc2NyaWJlcyB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdDsKK307CitgYGAKKworSWYgeW91IG5lZWQgYSBjdXN0b20gbWF0Y2hlciBidXQgYFRydWx5KClgIGlzIG5vdCBhIGdvb2Qgb3B0aW9uIChmb3IKK2V4YW1wbGUsIHlvdSBtYXkgbm90IGJlIGhhcHB5IHdpdGggdGhlIHdheSBgVHJ1bHkocHJlZGljYXRlKWAKK2Rlc2NyaWJlcyBpdHNlbGYsIG9yIHlvdSBtYXkgd2FudCB5b3VyIG1hdGNoZXIgdG8gYmUgcG9seW1vcnBoaWMgYXMKK2BFcSh2YWx1ZSlgIGlzKSwgeW91IGNhbiBkZWZpbmUgYSBtYXRjaGVyIHRvIGRvIHdoYXRldmVyIHlvdSB3YW50IGluCit0d28gc3RlcHM6IGZpcnN0IGltcGxlbWVudCB0aGUgbWF0Y2hlciBpbnRlcmZhY2UsIGFuZCB0aGVuIGRlZmluZSBhCitmYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG1hdGNoZXIgaW5zdGFuY2UuIFRoZSBzZWNvbmQgc3RlcCBpcyBub3QKK3N0cmljdGx5IG5lZWRlZCBidXQgaXQgbWFrZXMgdGhlIHN5bnRheCBvZiB1c2luZyB0aGUgbWF0Y2hlciBuaWNlci4KKworRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVmaW5lIGEgbWF0Y2hlciB0byB0ZXN0IHdoZXRoZXIgYW4gYGludGAgaXMKK2RpdmlzaWJsZSBieSA3IGFuZCB0aGVuIHVzZSBpdCBsaWtlIHRoaXM6CitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TWFrZU1hdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisKK2NsYXNzIERpdmlzaWJsZUJ5N01hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxpbnQ+IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oaW50IG4sIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgcmV0dXJuIChuICUgNykgPT0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiaXMgZGl2aXNpYmxlIGJ5IDciOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImlzIG5vdCBkaXZpc2libGUgYnkgNyI7CisgIH0KK307CisKK2lubGluZSBNYXRjaGVyPGludD4gRGl2aXNpYmxlQnk3KCkgeworICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IERpdmlzaWJsZUJ5N01hdGNoZXIpOworfQorLi4uCisKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoRGl2aXNpYmxlQnk3KCkpKTsKK2BgYAorCitZb3UgbWF5IGltcHJvdmUgdGhlIG1hdGNoZXIgbWVzc2FnZSBieSBzdHJlYW1pbmcgYWRkaXRpb25hbAoraW5mb3JtYXRpb24gdG8gdGhlIGBsaXN0ZW5lcmAgYXJndW1lbnQgaW4gYE1hdGNoQW5kRXhwbGFpbigpYDoKKworYGBgCitjbGFzcyBEaXZpc2libGVCeTdNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgY29uc3QgaW50IHJlbWFpbmRlciA9IG4gJSA3OworICAgIGlmIChyZW1haW5kZXIgIT0gMCkgeworICAgICAgKmxpc3RlbmVyIDw8ICJ0aGUgcmVtYWluZGVyIGlzICIgPDwgcmVtYWluZGVyOworICAgIH0KKyAgICByZXR1cm4gcmVtYWluZGVyID09IDA7CisgIH0KKyAgLi4uCit9OworYGBgCisKK1RoZW4sIGBFWFBFQ1RfVEhBVCh4LCBEaXZpc2libGVCeTcoKSk7YCBtYXkgZ2VuZXJhbCBhIG1lc3NhZ2UgbGlrZSB0aGlzOgorYGBgCitWYWx1ZSBvZjogeAorRXhwZWN0ZWQ6IGlzIGRpdmlzaWJsZSBieSA3CisgIEFjdHVhbDogMjMgKHRoZSByZW1haW5kZXIgaXMgMikKK2BgYAorCisjIyBXcml0aW5nIE5ldyBQb2x5bW9ycGhpYyBNYXRjaGVycyAjIworCitZb3UndmUgbGVhcm5lZCBob3cgdG8gd3JpdGUgeW91ciBvd24gbWF0Y2hlcnMgaW4gdGhlIHByZXZpb3VzCityZWNpcGUuIEp1c3Qgb25lIHByb2JsZW06IGEgbWF0Y2hlciBjcmVhdGVkIHVzaW5nIGBNYWtlTWF0Y2hlcigpYCBvbmx5Cit3b3JrcyBmb3Igb25lIHBhcnRpY3VsYXIgdHlwZSBvZiBhcmd1bWVudHMuIElmIHlvdSB3YW50IGEKK19wb2x5bW9ycGhpY18gbWF0Y2hlciB0aGF0IHdvcmtzIHdpdGggYXJndW1lbnRzIG9mIHNldmVyYWwgdHlwZXMgKGZvcgoraW5zdGFuY2UsIGBFcSh4KWAgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYSBgdmFsdWVgIGFzIGxvbmcgYXMgYHZhbHVlYCA9PQorYHhgIGNvbXBpbGVzIC0tIGB2YWx1ZWAgYW5kIGB4YCBkb24ndCBoYXZlIHRvIHNoYXJlIHRoZSBzYW1lIHR5cGUpLAoreW91IGNhbiBsZWFybiB0aGUgdHJpY2sgZnJvbSBgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiYCBidXQgaXQncyBhIGJpdAoraW52b2x2ZWQuCisKK0ZvcnR1bmF0ZWx5LCBtb3N0IG9mIHRoZSB0aW1lIHlvdSBjYW4gZGVmaW5lIGEgcG9seW1vcnBoaWMgbWF0Y2hlcgorZWFzaWx5IHdpdGggdGhlIGhlbHAgb2YgYE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKWAuIEhlcmUncyBob3cgeW91IGNhbgorZGVmaW5lIGBOb3ROdWxsKClgIGFzIGFuIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNNYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOwordXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwordXNpbmcgOjp0ZXN0aW5nOjpQb2x5bW9ycGhpY01hdGNoZXI7CisKK2NsYXNzIE5vdE51bGxNYXRjaGVyIHsKKyBwdWJsaWM6CisgIC8vIFRvIGltcGxlbWVudCBhIHBvbHltb3JwaGljIG1hdGNoZXIsIGZpcnN0IGRlZmluZSBhIENPUFlBQkxFIGNsYXNzCisgIC8vIHRoYXQgaGFzIHRocmVlIG1lbWJlcnMgTWF0Y2hBbmRFeHBsYWluKCksIERlc2NyaWJlVG8oKSwgYW5kCisgIC8vIERlc2NyaWJlTmVnYXRpb25UbygpLCBsaWtlIHRoZSBmb2xsb3dpbmcuCisKKyAgLy8gSW4gdGhpcyBleGFtcGxlLCB3ZSB3YW50IHRvIHVzZSBOb3ROdWxsKCkgd2l0aCBhbnkgcG9pbnRlciwgc28KKyAgLy8gTWF0Y2hBbmRFeHBsYWluKCkgYWNjZXB0cyBhIHBvaW50ZXIgb2YgYW55IHR5cGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LgorICAvLyBJbiBnZW5lcmFsLCB5b3UgY2FuIGRlZmluZSBNYXRjaEFuZEV4cGxhaW4oKSBhcyBhbiBvcmRpbmFyeSBtZXRob2Qgb3IKKyAgLy8gYSBtZXRob2QgdGVtcGxhdGUsIG9yIGV2ZW4gb3ZlcmxvYWQgaXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIE1hdGNoQW5kRXhwbGFpbihUKiBwLAorICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgeworICAgIHJldHVybiBwICE9IE5VTEw7CisgIH0KKworICAvLyBEZXNjcmliZXMgdGhlIHByb3BlcnR5IG9mIGEgdmFsdWUgbWF0Y2hpbmcgdGhpcyBtYXRjaGVyLgorICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7ICpvcyA8PCAiaXMgbm90IE5VTEwiOyB9CisKKyAgLy8gRGVzY3JpYmVzIHRoZSBwcm9wZXJ0eSBvZiBhIHZhbHVlIE5PVCBtYXRjaGluZyB0aGlzIG1hdGNoZXIuCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImlzIE5VTEwiOyB9Cit9OworCisvLyBUbyBjb25zdHJ1Y3QgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLCBwYXNzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcworLy8gdG8gTWFrZVBvbHltb3JwaGljTWF0Y2hlcigpLiAgTm90ZSB0aGUgcmV0dXJuIHR5cGUuCitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPE5vdE51bGxNYXRjaGVyPiBOb3ROdWxsKCkgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihOb3ROdWxsTWF0Y2hlcigpKTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKE5vdE51bGwoKSkpOyAgLy8gVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBub24tTlVMTCBwb2ludGVyLgorYGBgCisKKyoqTm90ZToqKiBZb3VyIHBvbHltb3JwaGljIG1hdGNoZXIgY2xhc3MgZG9lcyAqKm5vdCoqIG5lZWQgdG8gaW5oZXJpdCBmcm9tCitgTWF0Y2hlckludGVyZmFjZWAgb3IgYW55IG90aGVyIGNsYXNzLCBhbmQgaXRzIG1ldGhvZHMgZG8gKipub3QqKiBuZWVkCit0byBiZSB2aXJ0dWFsLgorCitMaWtlIGluIGEgbW9ub21vcnBoaWMgbWF0Y2hlciwgeW91IG1heSBleHBsYWluIHRoZSBtYXRjaCByZXN1bHQgYnkKK3N0cmVhbWluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBgbGlzdGVuZXJgIGFyZ3VtZW50IGluCitgTWF0Y2hBbmRFeHBsYWluKClgLgorCisjIyBXcml0aW5nIE5ldyBDYXJkaW5hbGl0aWVzICMjCisKK0EgY2FyZGluYWxpdHkgaXMgdXNlZCBpbiBgVGltZXMoKWAgdG8gdGVsbCBHb29nbGUgTW9jayBob3cgbWFueSB0aW1lcworeW91IGV4cGVjdCBhIGNhbGwgdG8gb2NjdXIuIEl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBleGFjdC4gRm9yIGV4YW1wbGUsCit5b3UgY2FuIHNheSBgQXRMZWFzdCg1KWAgb3IgYEJldHdlZW4oMiwgNClgLgorCitJZiB0aGUgYnVpbHQtaW4gc2V0IG9mIGNhcmRpbmFsaXRpZXMgZG9lc24ndCBzdWl0IHlvdSwgeW91IGFyZSBmcmVlIHRvCitkZWZpbmUgeW91ciBvd24gYnkgaW1wbGVtZW50aW5nIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIChpbiBuYW1lc3BhY2UKK2B0ZXN0aW5nYCk6CisKK2BgYAorY2xhc3MgQ2FyZGluYWxpdHlJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q2FyZGluYWxpdHlJbnRlcmZhY2UoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXRpc2Z5IHRoaXMgY2FyZGluYWxpdHkuCisgIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCA9IDA7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0dXJhdGUgdGhpcyBjYXJkaW5hbGl0eS4KKyAgdmlydHVhbCBib29sIElzU2F0dXJhdGVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0ID0gMDsKKworICAvLyBEZXNjcmliZXMgc2VsZiB0byBhbiBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKK307CitgYGAKKworRm9yIGV4YW1wbGUsIHRvIHNwZWNpZnkgdGhhdCBhIGNhbGwgbXVzdCBvY2N1ciBldmVuIG51bWJlciBvZiB0aW1lcywKK3lvdSBjYW4gd3JpdGUKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkNhcmRpbmFsaXR5OwordXNpbmcgOjp0ZXN0aW5nOjpDYXJkaW5hbGl0eUludGVyZmFjZTsKK3VzaW5nIDo6dGVzdGluZzo6TWFrZUNhcmRpbmFsaXR5OworCitjbGFzcyBFdmVuTnVtYmVyQ2FyZGluYWxpdHkgOiBwdWJsaWMgQ2FyZGluYWxpdHlJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKKyAgICByZXR1cm4gKGNhbGxfY291bnQgJSAyKSA9PSAwOworICB9CisKKyAgdmlydHVhbCBib29sIElzU2F0dXJhdGVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImNhbGxlZCBldmVuIG51bWJlciBvZiB0aW1lcyI7CisgIH0KK307CisKK0NhcmRpbmFsaXR5IEV2ZW5OdW1iZXIoKSB7CisgIHJldHVybiBNYWtlQ2FyZGluYWxpdHkobmV3IEV2ZW5OdW1iZXJDYXJkaW5hbGl0eSk7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJhcigzKSkKKyAgICAgIC5UaW1lcyhFdmVuTnVtYmVyKCkpOworYGBgCisKKyMjIFdyaXRpbmcgTmV3IEFjdGlvbnMgUXVpY2tseSAjIworCitJZiB0aGUgYnVpbHQtaW4gYWN0aW9ucyBkb24ndCB3b3JrIGZvciB5b3UsIGFuZCB5b3UgZmluZCBpdAoraW5jb252ZW5pZW50IHRvIHVzZSBgSW52b2tlKClgLCB5b3UgY2FuIHVzZSBhIG1hY3JvIGZyb20gdGhlIGBBQ1RJT04qYAorZmFtaWx5IHRvIHF1aWNrbHkgZGVmaW5lIGEgbmV3IGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHlvdXIgY29kZSBhcworaWYgaXQncyBhIGJ1aWx0LWluIGFjdGlvbi4KKworQnkgd3JpdGluZworYGBgCitBQ1RJT04obmFtZSkgeyBzdGF0ZW1lbnRzOyB9CitgYGAKK2luIGEgbmFtZXNwYWNlIHNjb3BlIChpLmUuIG5vdCBpbnNpZGUgYSBjbGFzcyBvciBmdW5jdGlvbiksIHlvdSB3aWxsCitkZWZpbmUgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUgc3RhdGVtZW50cy4KK1RoZSB2YWx1ZSByZXR1cm5lZCBieSBgc3RhdGVtZW50c2Agd2lsbCBiZSB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUgb2YKK3RoZSBhY3Rpb24uICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIEstdGgKKygwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcyBgYXJnS2AuICBGb3IgZXhhbXBsZToKK2BgYAorQUNUSU9OKEluY3JlbWVudEFyZzEpIHsgcmV0dXJuICsrKCphcmcxKTsgfQorYGBgCithbGxvd3MgeW91IHRvIHdyaXRlCitgYGAKKy4uLiBXaWxsT25jZShJbmNyZW1lbnRBcmcxKCkpOworYGBgCisKK05vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbgorYXJndW1lbnRzLiAgUmVzdCBhc3N1cmVkIHRoYXQgeW91ciBjb2RlIGlzIHR5cGUtc2FmZSB0aG91Z2g6Cit5b3UnbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IgaWYgYCphcmcxYCBkb2Vzbid0IHN1cHBvcnQgdGhlIGArK2AKK29wZXJhdG9yLCBvciBpZiB0aGUgdHlwZSBvZiBgKysoKmFyZzEpYCBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlIG1vY2sKK2Z1bmN0aW9uJ3MgcmV0dXJuIHR5cGUuCisKK0Fub3RoZXIgZXhhbXBsZToKK2BgYAorQUNUSU9OKEZvbykgeworICAoKmFyZzIpKDUpOworICBCbGFoKCk7CisgICphcmcxID0gMDsKKyAgcmV0dXJuIGFyZzA7Cit9CitgYGAKK2RlZmluZXMgYW4gYWN0aW9uIGBGb28oKWAgdGhhdCBpbnZva2VzIGFyZ3VtZW50ICMyIChhIGZ1bmN0aW9uIHBvaW50ZXIpCit3aXRoIDUsIGNhbGxzIGZ1bmN0aW9uIGBCbGFoKClgLCBzZXRzIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IGFyZ3VtZW50CisjMSB0byAwLCBhbmQgcmV0dXJucyBhcmd1bWVudCAjMC4KKworRm9yIG1vcmUgY29udmVuaWVuY2UgYW5kIGZsZXhpYmlsaXR5LCB5b3UgY2FuIGFsc28gdXNlIHRoZSBmb2xsb3dpbmcKK3ByZS1kZWZpbmVkIHN5bWJvbHMgaW4gdGhlIGJvZHkgb2YgYEFDVElPTmA6CisKK3wgYGFyZ0tfdHlwZWAgfCBUaGUgdHlwZSBvZiB0aGUgSy10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gfAorfDotLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBhcmdzYCAgICAgIHwgQWxsIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcyBhIHR1cGxlICAgICAgICAgICAgICAgIHwKK3wgYGFyZ3NfdHlwZWAgfCBUaGUgdHlwZSBvZiBhbGwgYXJndW1lbnRzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uIGFzIGEgdHVwbGUgICAgfAorfCBgcmV0dXJuX3R5cGVgIHwgVGhlIHJldHVybiB0eXBlIG9mIHRoZSBtb2NrIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYGZ1bmN0aW9uX3R5cGVgIHwgVGhlIHR5cGUgb2YgdGhlIG1vY2sgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworRm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcgYW4gYEFDVElPTmAgYXMgYSBzdHViIGFjdGlvbiBmb3IgbW9jayBmdW5jdGlvbjoKK2BgYAoraW50IERvU29tZXRoaW5nKGJvb2wgZmxhZywgaW50KiBwdHIpOworYGBgCit3ZSBoYXZlOgorfCAqKlByZS1kZWZpbmVkIFN5bWJvbCoqIHwgKipJcyBCb3VuZCBUbyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS18Cit8IGBhcmcwYCAgICAgICAgICAgICAgICAgfCB0aGUgdmFsdWUgb2YgYGZsYWdgIHwKK3wgYGFyZzBfdHlwZWAgICAgICAgICAgICB8IHRoZSB0eXBlIGBib29sYCB8Cit8IGBhcmcxYCAgICAgICAgICAgICAgICAgfCB0aGUgdmFsdWUgb2YgYHB0cmAgfAorfCBgYXJnMV90eXBlYCAgICAgICAgICAgIHwgdGhlIHR5cGUgYGludCpgIHwKK3wgYGFyZ3NgICAgICAgICAgICAgICAgICB8IHRoZSB0dXBsZSBgKGZsYWcsIHB0cilgIHwKK3wgYGFyZ3NfdHlwZWAgICAgICAgICAgICB8IHRoZSB0eXBlIGBzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgaW50Kj5gIHwKK3wgYHJldHVybl90eXBlYCAgICAgICAgICB8IHRoZSB0eXBlIGBpbnRgICB8Cit8IGBmdW5jdGlvbl90eXBlYCAgICAgICAgfCB0aGUgdHlwZSBgaW50KGJvb2wsIGludCopYCB8CisKKyMjIFdyaXRpbmcgTmV3IFBhcmFtZXRlcml6ZWQgQWN0aW9ucyBRdWlja2x5ICMjCisKK1NvbWV0aW1lcyB5b3UnbGwgd2FudCB0byBwYXJhbWV0ZXJpemUgYW4gYWN0aW9uIHlvdSBkZWZpbmUuICBGb3IgdGhhdAord2UgaGF2ZSBhbm90aGVyIG1hY3JvCitgYGAKK0FDVElPTl9QKG5hbWUsIHBhcmFtKSB7IHN0YXRlbWVudHM7IH0KK2BgYAorCitGb3IgZXhhbXBsZSwKK2BgYAorQUNUSU9OX1AoQWRkLCBuKSB7IHJldHVybiBhcmcwICsgbjsgfQorYGBgCit3aWxsIGFsbG93IHlvdSB0byB3cml0ZQorYGBgCisvLyBSZXR1cm5zIGFyZ3VtZW50ICMwICsgNS4KKy4uLiBXaWxsT25jZShBZGQoNSkpOworYGBgCisKK0ZvciBjb252ZW5pZW5jZSwgd2UgdXNlIHRoZSB0ZXJtIF9hcmd1bWVudHNfIGZvciB0aGUgdmFsdWVzIHVzZWQgdG8KK2ludm9rZSB0aGUgbW9jayBmdW5jdGlvbiwgYW5kIHRoZSB0ZXJtIF9wYXJhbWV0ZXJzXyBmb3IgdGhlIHZhbHVlcwordXNlZCB0byBpbnN0YW50aWF0ZSBhbiBhY3Rpb24uCisKK05vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBwcm92aWRlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgZWl0aGVyLgorU3VwcG9zZSB0aGUgcGFyYW1ldGVyIGlzIG5hbWVkIGBwYXJhbWAsIHlvdSBjYW4gYWxzbyB1c2UgdGhlCitHb29nbGUtTW9jay1kZWZpbmVkIHN5bWJvbCBgcGFyYW1fdHlwZWAgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgdGhlCitwYXJhbWV0ZXIgYXMgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBib2R5IG9mCitgQUNUSU9OX1AoQWRkLCBuKWAgYWJvdmUsIHlvdSBjYW4gd3JpdGUgYG5fdHlwZWAgZm9yIHRoZSB0eXBlIG9mIGBuYC4KKworR29vZ2xlIE1vY2sgYWxzbyBwcm92aWRlcyBgQUNUSU9OX1AyYCwgYEFDVElPTl9QM2AsIGFuZCBldGMgdG8gc3VwcG9ydAorbXVsdGktcGFyYW1ldGVyIGFjdGlvbnMuICBGb3IgZXhhbXBsZSwKK2BgYAorQUNUSU9OX1AyKFJldHVybkRpc3RhbmNlVG8sIHgsIHkpIHsKKyAgZG91YmxlIGR4ID0gYXJnMCAtIHg7CisgIGRvdWJsZSBkeSA9IGFyZzEgLSB5OworICByZXR1cm4gc3FydChkeCpkeCArIGR5KmR5KTsKK30KK2BgYAorbGV0cyB5b3Ugd3JpdGUKK2BgYAorLi4uIFdpbGxPbmNlKFJldHVybkRpc3RhbmNlVG8oNS4wLCAyNi41KSk7CitgYGAKKworWW91IGNhbiB2aWV3IGBBQ1RJT05gIGFzIGEgZGVnZW5lcmF0ZWQgcGFyYW1ldGVyaXplZCBhY3Rpb24gd2hlcmUgdGhlCitudW1iZXIgb2YgcGFyYW1ldGVycyBpcyAwLgorCitZb3UgY2FuIGFsc28gZWFzaWx5IGRlZmluZSBhY3Rpb25zIG92ZXJsb2FkZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzOgorYGBgCitBQ1RJT05fUChQbHVzLCBhKSB7IC4uLiB9CitBQ1RJT05fUDIoUGx1cywgYSwgYikgeyAuLi4gfQorYGBgCisKKyMjIFJlc3RyaWN0aW5nIHRoZSBUeXBlIG9mIGFuIEFyZ3VtZW50IG9yIFBhcmFtZXRlciBpbiBhbiBBQ1RJT04gIyMKKworRm9yIG1heGltdW0gYnJldml0eSBhbmQgcmV1c2FiaWxpdHksIHRoZSBgQUNUSU9OKmAgbWFjcm9zIGRvbid0IGFzaworeW91IHRvIHByb3ZpZGUgdGhlIHR5cGVzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbgorcGFyYW1ldGVycy4gIEluc3RlYWQsIHdlIGxldCB0aGUgY29tcGlsZXIgaW5mZXIgdGhlIHR5cGVzIGZvciB1cy4KKworU29tZXRpbWVzLCBob3dldmVyLCB3ZSBtYXkgd2FudCB0byBiZSBtb3JlIGV4cGxpY2l0IGFib3V0IHRoZSB0eXBlcy4KK1RoZXJlIGFyZSBzZXZlcmFsIHRyaWNrcyB0byBkbyB0aGF0LiAgRm9yIGV4YW1wbGU6CitgYGAKK0FDVElPTihGb28pIHsKKyAgLy8gTWFrZXMgc3VyZSBhcmcwIGNhbiBiZSBjb252ZXJ0ZWQgdG8gaW50LgorICBpbnQgbiA9IGFyZzA7CisgIC4uLiB1c2UgbiBpbnN0ZWFkIG9mIGFyZzAgaGVyZSAuLi4KK30KKworQUNUSU9OX1AoQmFyLCBwYXJhbSkgeworICAvLyBNYWtlcyBzdXJlIHRoZSB0eXBlIG9mIGFyZzEgaXMgY29uc3QgY2hhciouCisgIDo6dGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IGNoYXIqLCBhcmcxX3R5cGU+KCk7CisKKyAgLy8gTWFrZXMgc3VyZSBwYXJhbSBjYW4gYmUgY29udmVydGVkIHRvIGJvb2wuCisgIGJvb2wgZmxhZyA9IHBhcmFtOworfQorYGBgCit3aGVyZSBgU3RhdGljQXNzZXJ0VHlwZUVxYCBpcyBhIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gaW4gR29vZ2xlIFRlc3QKK3RoYXQgdmVyaWZpZXMgdHdvIHR5cGVzIGFyZSB0aGUgc2FtZS4KKworIyMgV3JpdGluZyBOZXcgQWN0aW9uIFRlbXBsYXRlcyBRdWlja2x5ICMjCisKK1NvbWV0aW1lcyB5b3Ugd2FudCB0byBnaXZlIGFuIGFjdGlvbiBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRoYXQKK2Nhbm5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyB2YWx1ZSBwYXJhbWV0ZXJzLiAgYEFDVElPTl9URU1QTEFURSgpYAorc3VwcG9ydHMgdGhhdCBhbmQgY2FuIGJlIHZpZXdlZCBhcyBhbiBleHRlbnNpb24gdG8gYEFDVElPTigpYCBhbmQKK2BBQ1RJT05fUCooKWAuCisKK1RoZSBzeW50YXg6CitgYGAKK0FDVElPTl9URU1QTEFURShBY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgIEhBU19tX1RFTVBMQVRFX1BBUkFNUyhraW5kMSwgbmFtZTEsIC4uLiwga2luZF9tLCBuYW1lX20pLAorICAgICAgICAgICAgICAgIEFORF9uX1ZBTFVFX1BBUkFNUyhwMSwgLi4uLCBwX24pKSB7IHN0YXRlbWVudHM7IH0KK2BgYAorCitkZWZpbmVzIGFuIGFjdGlvbiB0ZW1wbGF0ZSB0aGF0IHRha2VzIF9tXyBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCithbmQgX25fIHZhbHVlIHBhcmFtZXRlcnMsIHdoZXJlIF9tXyBpcyBiZXR3ZWVuIDEgYW5kIDEwLCBhbmQgX25fIGlzCitiZXR3ZWVuIDAgYW5kIDEwLiAgYG5hbWVfaWAgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGggdGVtcGxhdGUKK3BhcmFtZXRlciwgYW5kIGBraW5kX2lgIHNwZWNpZmllcyB3aGV0aGVyIGl0J3MgYSBgdHlwZW5hbWVgLCBhbgoraW50ZWdyYWwgY29uc3RhbnQsIG9yIGEgdGVtcGxhdGUuICBgcF9pYCBpcyB0aGUgbmFtZSBvZiB0aGUgaS10aCB2YWx1ZQorcGFyYW1ldGVyLgorCitFeGFtcGxlOgorYGBgCisvLyBEdXBsaWNhdGVBcmc8aywgVD4ob3V0cHV0KSBjb252ZXJ0cyB0aGUgay10aCBhcmd1bWVudCBvZiB0aGUgbW9jaworLy8gZnVuY3Rpb24gdG8gdHlwZSBUIGFuZCBjb3BpZXMgaXQgdG8gKm91dHB1dC4KK0FDVElPTl9URU1QTEFURShEdXBsaWNhdGVBcmcsCisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGUgY29tbWEgYmV0d2VlbiBpbnQgYW5kIGs6CisgICAgICAgICAgICAgICAgSEFTXzJfVEVNUExBVEVfUEFSQU1TKGludCwgaywgdHlwZW5hbWUsIFQpLAorICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhvdXRwdXQpKSB7CisgICpvdXRwdXQgPSBUKHN0ZDo6dHIxOjpnZXQ8az4oYXJncykpOworfQorYGBgCisKK1RvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGVtcGxhdGUsIHdyaXRlOgorYGBgCisgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tPih2MSwgLi4uLCB2X24pCitgYGAKK3doZXJlIHRoZSBgdGBzIGFyZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0aGUKK2B2YHMgYXJlIHRoZSB2YWx1ZSBhcmd1bWVudHMuICBUaGUgdmFsdWUgYXJndW1lbnQKK3R5cGVzIGFyZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuICBGb3IgZXhhbXBsZToKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIGludCBuOworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oXywgXykpCisgICAgICAuV2lsbE9uY2UoRHVwbGljYXRlQXJnPDEsIHVuc2lnbmVkIGNoYXI+KCZuKSk7CitgYGAKKworSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB2YWx1ZSBhcmd1bWVudCB0eXBlcywgeW91IGNhbgorcHJvdmlkZSBhZGRpdGlvbmFsIHRlbXBsYXRlIGFyZ3VtZW50czoKK2BgYAorICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbSwgdTEsIC4uLiwgdV9rPih2MSwgLi4uLCB2X24pCitgYGAKK3doZXJlIGB1X2lgIGlzIHRoZSBkZXNpcmVkIHR5cGUgb2YgYHZfaWAuCisKK2BBQ1RJT05fVEVNUExBVEVgIGFuZCBgQUNUSU9OYC9gQUNUSU9OX1AqYCBjYW4gYmUgb3ZlcmxvYWRlZCBvbiB0aGUKK251bWJlciBvZiB2YWx1ZSBwYXJhbWV0ZXJzLCBidXQgbm90IG9uIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUKK3BhcmFtZXRlcnMuICBXaXRob3V0IHRoZSByZXN0cmljdGlvbiwgdGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZyBpcwordW5jbGVhcjoKKworYGBgCisgIE92ZXJsb2FkZWRBY3Rpb248aW50LCBib29sPih4KTsKK2BgYAorCitBcmUgd2UgdXNpbmcgYSBzaW5nbGUtdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbiB3aGVyZSBgYm9vbGAgcmVmZXJzIHRvCit0aGUgdHlwZSBvZiBgeGAsIG9yIGEgdHdvLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24gd2hlcmUgdGhlIGNvbXBpbGVyCitpcyBhc2tlZCB0byBpbmZlciB0aGUgdHlwZSBvZiBgeGA/CisKKyMjIFVzaW5nIHRoZSBBQ1RJT04gT2JqZWN0J3MgVHlwZSAjIworCitJZiB5b3UgYXJlIHdyaXRpbmcgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gYEFDVElPTmAgb2JqZWN0LCB5b3UnbGwKK25lZWQgdG8ga25vdyBpdHMgdHlwZS4gIFRoZSB0eXBlIGRlcGVuZHMgb24gdGhlIG1hY3JvIHVzZWQgdG8gZGVmaW5lCit0aGUgYWN0aW9uIGFuZCB0aGUgcGFyYW1ldGVyIHR5cGVzLiAgVGhlIHJ1bGUgaXMgcmVsYXRpdmVseSBzaW1wbGU6Cit8ICoqR2l2ZW4gRGVmaW5pdGlvbioqIHwgKipFeHByZXNzaW9uKiogfCAqKkhhcyBUeXBlKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFDVElPTihGb28pYCAgICAgICAgfCBgRm9vKClgICAgICAgICB8IGBGb29BY3Rpb25gICB8Cit8IGBBQ1RJT05fVEVNUExBVEUoRm9vLCBIQVNfbV9URU1QTEFURV9QQVJBTVMoLi4uKSwgQU5EXzBfVkFMVUVfUEFSQU1TKCkpYCB8CWBGb288dDEsIC4uLiwgdF9tPigpYCB8IGBGb29BY3Rpb248dDEsIC4uLiwgdF9tPmAgfAorfCBgQUNUSU9OX1AoQmFyLCBwYXJhbSlgIHwgYEJhcihpbnRfdmFsdWUpYCB8IGBCYXJBY3Rpb25QPGludD5gIHwKK3wgYEFDVElPTl9URU1QTEFURShCYXIsIEhBU19tX1RFTVBMQVRFX1BBUkFNUyguLi4pLCBBTkRfMV9WQUxVRV9QQVJBTVMocDEpKWAgfCBgQmFyPHQxLCAuLi4sIHRfbT4oaW50X3ZhbHVlKWAgfCBgRm9vQWN0aW9uUDx0MSwgLi4uLCB0X20sIGludD5gIHwKK3wgYEFDVElPTl9QMihCYXosIHAxLCBwMilgIHwgYEJheihib29sX3ZhbHVlLCBpbnRfdmFsdWUpYCB8IGBCYXpBY3Rpb25QMjxib29sLCBpbnQ+YCB8Cit8IGBBQ1RJT05fVEVNUExBVEUoQmF6LCBIQVNfbV9URU1QTEFURV9QQVJBTVMoLi4uKSwgQU5EXzJfVkFMVUVfUEFSQU1TKHAxLCBwMikpYCB8IGBCYXo8dDEsIC4uLiwgdF9tPihib29sX3ZhbHVlLCBpbnRfdmFsdWUpYCB8IGBGb29BY3Rpb25QMjx0MSwgLi4uLCB0X20sIGJvb2wsIGludD5gIHwKK3wgLi4uICAgICAgICAgICAgICAgICAgfCAuLi4gICAgICAgICAgICB8IC4uLiAgICAgICAgICB8CisKK05vdGUgdGhhdCB3ZSBoYXZlIHRvIHBpY2sgZGlmZmVyZW50IHN1ZmZpeGVzIChgQWN0aW9uYCwgYEFjdGlvblBgLAorYEFjdGlvblAyYCwgYW5kIGV0YykgZm9yIGFjdGlvbnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiB2YWx1ZQorcGFyYW1ldGVycywgb3IgdGhlIGFjdGlvbiBkZWZpbml0aW9ucyBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBvbiB0aGUKK251bWJlciBvZiB0aGVtLgorCisjIyBXcml0aW5nIE5ldyBNb25vbW9ycGhpYyBBY3Rpb25zICMjCisKK1doaWxlIHRoZSBgQUNUSU9OKmAgbWFjcm9zIGFyZSB2ZXJ5IGNvbnZlbmllbnQsIHNvbWV0aW1lcyB0aGV5IGFyZQoraW5hcHByb3ByaWF0ZS4gIEZvciBleGFtcGxlLCBkZXNwaXRlIHRoZSB0cmlja3Mgc2hvd24gaW4gdGhlIHByZXZpb3VzCityZWNpcGVzLCB0aGV5IGRvbid0IGxldCB5b3UgZGlyZWN0bHkgc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlIG1vY2sKK2Z1bmN0aW9uIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzCit0byB1bm9wdGltaXplZCBjb21waWxlciBlcnJvciBtZXNzYWdlcyB0aGF0IGNhbiBiYWZmbGUgdW5mYW1pbGlhcgordXNlcnMuICBUaGV5IGFsc28gZG9uJ3QgYWxsb3cgb3ZlcmxvYWRpbmcgYWN0aW9ucyBiYXNlZCBvbiBwYXJhbWV0ZXIKK3R5cGVzIHdpdGhvdXQganVtcGluZyB0aHJvdWdoIHNvbWUgaG9vcHMuCisKK0FuIGFsdGVybmF0aXZlIHRvIHRoZSBgQUNUSU9OKmAgbWFjcm9zIGlzIHRvIGltcGxlbWVudAorYDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+YCwgd2hlcmUgYEZgIGlzIHRoZSB0eXBlIG9mIHRoZSBtb2NrCitmdW5jdGlvbiBpbiB3aGljaCB0aGUgYWN0aW9uIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6CisKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEY+Y2xhc3MgQWN0aW9uSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkFjdGlvbkludGVyZmFjZSgpOworCisgIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24uICBSZXN1bHQgaXMgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uIHR5cGUKKyAgLy8gRiwgYW5kIEFyZ3VtZW50VHVwbGUgaXMgdGhlIHR1cGxlIG9mIGFyZ3VtZW50cyBvZiBGLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgaWYgRiBpcyBpbnQoYm9vbCwgY29uc3Qgc3RyaW5nJiksIHRoZW4gUmVzdWx0IHdvdWxkCisgIC8vIGJlIGludCwgYW5kIEFyZ3VtZW50VHVwbGUgd291bGQgYmUgdHIxOjp0dXBsZTxib29sLCBjb25zdCBzdHJpbmcmPi4KKyAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSA9IDA7Cit9OworCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkFjdGlvbjsKK3VzaW5nIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYWtlQWN0aW9uOworCit0eXBlZGVmIGludCBJbmNyZW1lbnRNZXRob2QoaW50Kik7CisKK2NsYXNzIEluY3JlbWVudEFyZ3VtZW50QWN0aW9uIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxJbmNyZW1lbnRNZXRob2Q+IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgaW50IFBlcmZvcm0oY29uc3QgdHIxOjp0dXBsZTxpbnQqPiYgYXJncykgeworICAgIGludCogcCA9IHRyMTo6Z2V0PDA+KGFyZ3MpOyAgLy8gR3JhYnMgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgIHJldHVybiAqcCsrOworICB9Cit9OworCitBY3Rpb248SW5jcmVtZW50TWV0aG9kPiBJbmNyZW1lbnRBcmd1bWVudCgpIHsKKyAgcmV0dXJuIE1ha2VBY3Rpb24obmV3IEluY3JlbWVudEFyZ3VtZW50QWN0aW9uKTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKGZvbywgQmF6KF8pKQorICAgICAgLldpbGxPbmNlKEluY3JlbWVudEFyZ3VtZW50KCkpOworCisgIGludCBuID0gNTsKKyAgZm9vLkJheigmbik7ICAvLyBTaG91bGQgcmV0dXJuIDUgYW5kIGNoYW5nZSBuIHRvIDYuCitgYGAKKworIyMgV3JpdGluZyBOZXcgUG9seW1vcnBoaWMgQWN0aW9ucyAjIworCitUaGUgcHJldmlvdXMgcmVjaXBlIHNob3dlZCB5b3UgaG93IHRvIGRlZmluZSB5b3VyIG93biBhY3Rpb24uIFRoaXMgaXMKK2FsbCBnb29kLCBleGNlcHQgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpbgord2hpY2ggdGhlIGFjdGlvbiB3aWxsIGJlIHVzZWQuIFNvbWV0aW1lcyB0aGF0IGNhbiBiZSBhIHByb2JsZW0uIEZvcgorZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBhY3Rpb24gaW4gZnVuY3Rpb25zIHdpdGggX2RpZmZlcmVudF8KK3R5cGVzIChlLmcuIGxpa2UgYFJldHVybigpYCBhbmQgYFNldEFyZ1BvaW50ZWUoKWApLgorCitJZiBhbiBhY3Rpb24gY2FuIGJlIHVzZWQgaW4gc2V2ZXJhbCB0eXBlcyBvZiBtb2NrIGZ1bmN0aW9ucywgd2Ugc2F5CitpdCdzIF9wb2x5bW9ycGhpY18uIFRoZSBgTWFrZVBvbHltb3JwaGljQWN0aW9uKClgIGZ1bmN0aW9uIHRlbXBsYXRlCittYWtlcyBpdCBlYXN5IHRvIGRlZmluZSBzdWNoIGFuIGFjdGlvbjoKKworYGBgCituYW1lc3BhY2UgdGVzdGluZyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorUG9seW1vcnBoaWNBY3Rpb248SW1wbD4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGNvbnN0IEltcGwmIGltcGwpOworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworYGBgCisKK0FzIGFuIGV4YW1wbGUsIGxldCdzIGRlZmluZSBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZWNvbmQgYXJndW1lbnQKK2luIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnQgbGlzdC4gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gZGVmaW5lIGFuCitpbXBsZW1lbnRhdGlvbiBjbGFzczoKKworYGBgCitjbGFzcyBSZXR1cm5TZWNvbmRBcmd1bWVudEFjdGlvbiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7CisgICAgLy8gVG8gZ2V0IHRoZSBpLXRoICgwLWJhc2VkKSBhcmd1bWVudCwgdXNlIHRyMTo6Z2V0PGk+KGFyZ3MpLgorICAgIHJldHVybiB0cjE6OmdldDwxPihhcmdzKTsKKyAgfQorfTsKK2BgYAorCitUaGlzIGltcGxlbWVudGF0aW9uIGNsYXNzIGRvZXMgX25vdF8gbmVlZCB0byBpbmhlcml0IGZyb20gYW55CitwYXJ0aWN1bGFyIGNsYXNzLiBXaGF0IG1hdHRlcnMgaXMgdGhhdCBpdCBtdXN0IGhhdmUgYSBgUGVyZm9ybSgpYAorbWV0aG9kIHRlbXBsYXRlLiBUaGlzIG1ldGhvZCB0ZW1wbGF0ZSB0YWtlcyB0aGUgbW9jayBmdW5jdGlvbidzCithcmd1bWVudHMgYXMgYSB0dXBsZSBpbiBhICoqc2luZ2xlKiogYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKK3RoZSBhY3Rpb24uIEl0IGNhbiBiZSBlaXRoZXIgYGNvbnN0YCBvciBub3QsIGJ1dCBtdXN0IGJlIGludm9rYWJsZQord2l0aCBleGFjdGx5IG9uZSB0ZW1wbGF0ZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIHJlc3VsdCB0eXBlLiBJbiBvdGhlcgord29yZHMsIHlvdSBtdXN0IGJlIGFibGUgdG8gY2FsbCBgUGVyZm9ybTxSPihhcmdzKWAgd2hlcmUgYFJgIGlzIHRoZQorbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlIGFuZCBgYXJnc2AgaXMgaXRzIGFyZ3VtZW50cyBpbiBhIHR1cGxlLgorCitOZXh0LCB3ZSB1c2UgYE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpYCB0byB0dXJuIGFuIGluc3RhbmNlIG9mIHRoZQoraW1wbGVtZW50YXRpb24gY2xhc3MgaW50byB0aGUgcG9seW1vcnBoaWMgYWN0aW9uIHdlIG5lZWQuIEl0IHdpbGwgYmUKK2NvbnZlbmllbnQgdG8gaGF2ZSBhIHdyYXBwZXIgZm9yIHRoaXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNBY3Rpb247Cit1c2luZyA6OnRlc3Rpbmc6OlBvbHltb3JwaGljQWN0aW9uOworCitQb2x5bW9ycGhpY0FjdGlvbjxSZXR1cm5TZWNvbmRBcmd1bWVudEFjdGlvbj4gUmV0dXJuU2Vjb25kQXJndW1lbnQoKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oUmV0dXJuU2Vjb25kQXJndW1lbnRBY3Rpb24oKSk7Cit9CitgYGAKKworTm93LCB5b3UgY2FuIHVzZSB0aGlzIHBvbHltb3JwaGljIGFjdGlvbiB0aGUgc2FtZSB3YXkgeW91IHVzZSB0aGUKK2J1aWx0LWluIG9uZXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoRG9UaGlzLCBpbnQoYm9vbCBmbGFnLCBpbnQgbikpOworICBNT0NLX01FVEhPRDMoRG9UaGF0LCBzdHJpbmcoaW50IHgsIGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoXywgXykpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuU2Vjb25kQXJndW1lbnQoKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGF0KF8sIF8sIF8pKQorICAgICAgLldpbGxPbmNlKFJldHVyblNlY29uZEFyZ3VtZW50KCkpOworICAuLi4KKyAgZm9vLkRvVGhpcyh0cnVlLCA1KTsgICAgICAgICAvLyBXaWxsIHJldHVybiA1LgorICBmb28uRG9UaGF0KDEsICJIaSIsICJCeWUiKTsgIC8vIFdpbGwgcmV0dXJuICJIaSIuCitgYGAKKworIyMgVGVhY2hpbmcgR29vZ2xlIE1vY2sgSG93IHRvIFByaW50IFlvdXIgVmFsdWVzICMjCisKK1doZW4gYW4gdW5pbnRlcmVzdGluZyBvciB1bmV4cGVjdGVkIGNhbGwgb2NjdXJzLCBHb29nbGUgTW9jayBwcmludHMgdGhlCithcmd1bWVudCB2YWx1ZXMgYW5kIHRoZSBzdGFjayB0cmFjZSB0byBoZWxwIHlvdSBkZWJ1Zy4gIEFzc2VydGlvbgorbWFjcm9zIGxpa2UgYEVYUEVDVF9USEFUYCBhbmQgYEVYUEVDVF9FUWAgYWxzbyBwcmludCB0aGUgdmFsdWVzIGluCitxdWVzdGlvbiB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuICBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3QgZG8gdGhpcyB1c2luZworR29vZ2xlIFRlc3QncyB1c2VyLWV4dGVuc2libGUgdmFsdWUgcHJpbnRlci4KKworVGhpcyBwcmludGVyIGtub3dzIGhvdyB0byBwcmludCBidWlsdC1pbiBDKysgdHlwZXMsIG5hdGl2ZSBhcnJheXMsIFNUTAorY29udGFpbmVycywgYW5kIGFueSB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlIGA8PGAgb3BlcmF0b3IuICBGb3Igb3RoZXIKK3R5cGVzLCBpdCBwcmludHMgdGhlIHJhdyBieXRlcyBpbiB0aGUgdmFsdWUgYW5kIGhvcGVzIHRoYXQgeW91IHRoZQordXNlciBjYW4gZmlndXJlIGl0IG91dC4KK1tHb29nbGUgVGVzdCdzIGFkdmFuY2VkIGd1aWRlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzZfQWR2YW5jZWRHdWlkZSNUZWFjaGluZ19Hb29nbGVfVGVzdF9Ib3dfdG9fUHJpbnRfWW91cl9WYWx1ZXMpCitleHBsYWlucyBob3cgdG8gZXh0ZW5kIHRoZSBwcmludGVyIHRvIGRvIGEgYmV0dGVyIGpvYiBhdAorcHJpbnRpbmcgeW91ciBwYXJ0aWN1bGFyIHR5cGUgdGhhbiB0byBkdW1wIHRoZSBieXRlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV82L0RvY3VtZW50YXRpb24ubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV82L0RvY3VtZW50YXRpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjOTE1NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzYvRG9jdW1lbnRhdGlvbi5tZApAQCAtMCwwICsxLDEyIEBACitUaGlzIHBhZ2UgbGlzdHMgYWxsIGRvY3VtZW50YXRpb24gd2lraSBwYWdlcyBmb3IgR29vZ2xlIE1vY2sgKioxLjYqKgorLSAqKmlmIHlvdSB1c2UgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIEdvb2dsZSBNb2NrLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyB2ZXJzaW9uIGluc3RlYWQuKioKKworICAqIFtGb3JEdW1taWVzXShWMV82X0ZvckR1bW1pZXMubWQpIC0tIHN0YXJ0IGhlcmUgaWYgeW91IGFyZSBuZXcgdG8gR29vZ2xlIE1vY2suCisgICogW0NoZWF0U2hlZXRdKFYxXzZfQ2hlYXRTaGVldC5tZCkgLS0gYSBxdWljayByZWZlcmVuY2UuCisgICogW0Nvb2tCb29rXShWMV82X0Nvb2tCb29rLm1kKSAtLSByZWNpcGVzIGZvciBkb2luZyB2YXJpb3VzIHRhc2tzIHVzaW5nIEdvb2dsZSBNb2NrLgorICAqIFtGcmVxdWVudGx5QXNrZWRRdWVzdGlvbnNdKFYxXzZfRnJlcXVlbnRseUFza2VkUXVlc3Rpb25zLm1kKSAtLSBjaGVjayBoZXJlIGJlZm9yZSBhc2tpbmcgYSBxdWVzdGlvbiBvbiB0aGUgbWFpbGluZyBsaXN0LgorCitUbyBjb250cmlidXRlIGNvZGUgdG8gR29vZ2xlIE1vY2ssIHJlYWQ6CisKKyAgKiBbRGV2R3VpZGVdKERldkd1aWRlLm1kKSAtLSByZWFkIHRoaXMgX2JlZm9yZV8gd3JpdGluZyB5b3VyIGZpcnN0IHBhdGNoLgorICAqIFtQdW1wIE1hbnVhbF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV82X1B1bXBNYW51YWwpIC0tIGhvdyB3ZSBnZW5lcmF0ZSBzb21lIG9mIEdvb2dsZSBNb2NrJ3Mgc291cmNlIGZpbGVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzYvRm9yRHVtbWllcy5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzYvRm9yRHVtbWllcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkxYjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNi9Gb3JEdW1taWVzLm1kCkBAIC0wLDAgKzEsNDM5IEBACisKKworKCoqTm90ZToqKiBJZiB5b3UgZ2V0IGNvbXBpbGVyIGVycm9ycyB0aGF0IHlvdSBkb24ndCB1bmRlcnN0YW5kLCBiZSBzdXJlIHRvIGNvbnN1bHQgW0dvb2dsZSBNb2NrIERvY3Rvcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0ZyZXF1ZW50bHlBc2tlZFF1ZXN0aW9ucyNIb3dfYW1fSV9zdXBwb3NlZF90b19tYWtlX3NlbnNlX29mX3RoZXNlX2hvcnJpYmxlX3RlbXBsYXRlX2Vycm9yKS4pCisKKyMgV2hhdCBJcyBHb29nbGUgQysrIE1vY2tpbmcgRnJhbWV3b3JrPyAjCitXaGVuIHlvdSB3cml0ZSBhIHByb3RvdHlwZSBvciB0ZXN0LCBvZnRlbiBpdCdzIG5vdCBmZWFzaWJsZSBvciB3aXNlIHRvIHJlbHkgb24gcmVhbCBvYmplY3RzIGVudGlyZWx5LiBBICoqbW9jayBvYmplY3QqKiBpbXBsZW1lbnRzIHRoZSBzYW1lIGludGVyZmFjZSBhcyBhIHJlYWwgb2JqZWN0IChzbyBpdCBjYW4gYmUgdXNlZCBhcyBvbmUpLCBidXQgbGV0cyB5b3Ugc3BlY2lmeSBhdCBydW4gdGltZSBob3cgaXQgd2lsbCBiZSB1c2VkIGFuZCB3aGF0IGl0IHNob3VsZCBkbyAod2hpY2ggbWV0aG9kcyB3aWxsIGJlIGNhbGxlZD8gaW4gd2hpY2ggb3JkZXI/IGhvdyBtYW55IHRpbWVzPyB3aXRoIHdoYXQgYXJndW1lbnRzPyB3aGF0IHdpbGwgdGhleSByZXR1cm4/IGV0YykuCisKKyoqTm90ZToqKiBJdCBpcyBlYXN5IHRvIGNvbmZ1c2UgdGhlIHRlcm0gX2Zha2Ugb2JqZWN0c18gd2l0aCBtb2NrIG9iamVjdHMuIEZha2VzIGFuZCBtb2NrcyBhY3R1YWxseSBtZWFuIHZlcnkgZGlmZmVyZW50IHRoaW5ncyBpbiB0aGUgVGVzdC1Ecml2ZW4gRGV2ZWxvcG1lbnQgKFRERCkgY29tbXVuaXR5OgorCisgICogKipGYWtlKiogb2JqZWN0cyBoYXZlIHdvcmtpbmcgaW1wbGVtZW50YXRpb25zLCBidXQgdXN1YWxseSB0YWtlIHNvbWUgc2hvcnRjdXQgKHBlcmhhcHMgdG8gbWFrZSB0aGUgb3BlcmF0aW9ucyBsZXNzIGV4cGVuc2l2ZSksIHdoaWNoIG1ha2VzIHRoZW0gbm90IHN1aXRhYmxlIGZvciBwcm9kdWN0aW9uLiBBbiBpbi1tZW1vcnkgZmlsZSBzeXN0ZW0gd291bGQgYmUgYW4gZXhhbXBsZSBvZiBhIGZha2UuCisgICogKipNb2NrcyoqIGFyZSBvYmplY3RzIHByZS1wcm9ncmFtbWVkIHdpdGggX2V4cGVjdGF0aW9uc18sIHdoaWNoIGZvcm0gYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBjYWxscyB0aGV5IGFyZSBleHBlY3RlZCB0byByZWNlaXZlLgorCitJZiBhbGwgdGhpcyBzZWVtcyB0b28gYWJzdHJhY3QgZm9yIHlvdSwgZG9uJ3Qgd29ycnkgLSB0aGUgbW9zdCBpbXBvcnRhbnQgdGhpbmcgdG8gcmVtZW1iZXIgaXMgdGhhdCBhIG1vY2sgYWxsb3dzIHlvdSB0byBjaGVjayB0aGUgX2ludGVyYWN0aW9uXyBiZXR3ZWVuIGl0c2VsZiBhbmQgY29kZSB0aGF0IHVzZXMgaXQuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZmFrZXMgYW5kIG1vY2tzIHdpbGwgYmVjb21lIG11Y2ggY2xlYXJlciBvbmNlIHlvdSBzdGFydCB0byB1c2UgbW9ja3MuCisKKyoqR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yayoqIChvciAqKkdvb2dsZSBNb2NrKiogZm9yIHNob3J0KSBpcyBhIGxpYnJhcnkgKHNvbWV0aW1lcyB3ZSBhbHNvIGNhbGwgaXQgYSAiZnJhbWV3b3JrIiB0byBtYWtlIGl0IHNvdW5kIGNvb2wpIGZvciBjcmVhdGluZyBtb2NrIGNsYXNzZXMgYW5kIHVzaW5nIHRoZW0uIEl0IGRvZXMgdG8gQysrIHdoYXQgW2pNb2NrXShodHRwOi8vd3d3Lmptb2NrLm9yZy8pIGFuZCBbRWFzeU1vY2tdKGh0dHA6Ly93d3cuZWFzeW1vY2sub3JnLykgZG8gdG8gSmF2YS4KKworVXNpbmcgR29vZ2xlIE1vY2sgaW52b2x2ZXMgdGhyZWUgYmFzaWMgc3RlcHM6CisKKyAgMS4gVXNlIHNvbWUgc2ltcGxlIG1hY3JvcyB0byBkZXNjcmliZSB0aGUgaW50ZXJmYWNlIHlvdSB3YW50IHRvIG1vY2ssIGFuZCB0aGV5IHdpbGwgZXhwYW5kIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB5b3VyIG1vY2sgY2xhc3M7CisgIDEuIENyZWF0ZSBzb21lIG1vY2sgb2JqZWN0cyBhbmQgc3BlY2lmeSBpdHMgZXhwZWN0YXRpb25zIGFuZCBiZWhhdmlvciB1c2luZyBhbiBpbnR1aXRpdmUgc3ludGF4OworICAxLiBFeGVyY2lzZSBjb2RlIHRoYXQgdXNlcyB0aGUgbW9jayBvYmplY3RzLiBHb29nbGUgTW9jayB3aWxsIGNhdGNoIGFueSB2aW9sYXRpb24gb2YgdGhlIGV4cGVjdGF0aW9ucyBhcyBzb29uIGFzIGl0IGFyaXNlcy4KKworIyBXaHkgR29vZ2xlIE1vY2s/ICMKK1doaWxlIG1vY2sgb2JqZWN0cyBoZWxwIHlvdSByZW1vdmUgdW5uZWNlc3NhcnkgZGVwZW5kZW5jaWVzIGluIHRlc3RzIGFuZCBtYWtlIHRoZW0gZmFzdCBhbmQgcmVsaWFibGUsIHVzaW5nIG1vY2tzIG1hbnVhbGx5IGluIEMrKyBpcyBfaGFyZF86CisKKyAgKiBTb21lb25lIGhhcyB0byBpbXBsZW1lbnQgdGhlIG1vY2tzLiBUaGUgam9iIGlzIHVzdWFsbHkgdGVkaW91cyBhbmQgZXJyb3ItcHJvbmUuIE5vIHdvbmRlciBwZW9wbGUgZ28gZ3JlYXQgZGlzdGFuY2UgdG8gYXZvaWQgaXQuCisgICogVGhlIHF1YWxpdHkgb2YgdGhvc2UgbWFudWFsbHkgd3JpdHRlbiBtb2NrcyBpcyBhIGJpdCwgdWgsIHVucHJlZGljdGFibGUuIFlvdSBtYXkgc2VlIHNvbWUgcmVhbGx5IHBvbGlzaGVkIG9uZXMsIGJ1dCB5b3UgbWF5IGFsc28gc2VlIHNvbWUgdGhhdCB3ZXJlIGhhY2tlZCB1cCBpbiBhIGh1cnJ5IGFuZCBoYXZlIGFsbCBzb3J0cyBvZiBhZCBob2MgcmVzdHJpY3Rpb25zLgorICAqIFRoZSBrbm93bGVkZ2UgeW91IGdhaW5lZCBmcm9tIHVzaW5nIG9uZSBtb2NrIGRvZXNuJ3QgdHJhbnNmZXIgdG8gdGhlIG5leHQuCisKK0luIGNvbnRyYXN0LCBKYXZhIGFuZCBQeXRob24gcHJvZ3JhbW1lcnMgaGF2ZSBzb21lIGZpbmUgbW9jayBmcmFtZXdvcmtzLCB3aGljaCBhdXRvbWF0ZSB0aGUgY3JlYXRpb24gb2YgbW9ja3MuIEFzIGEgcmVzdWx0LCBtb2NraW5nIGlzIGEgcHJvdmVuIGVmZmVjdGl2ZSB0ZWNobmlxdWUgYW5kIHdpZGVseSBhZG9wdGVkIHByYWN0aWNlIGluIHRob3NlIGNvbW11bml0aWVzLiBIYXZpbmcgdGhlIHJpZ2h0IHRvb2wgYWJzb2x1dGVseSBtYWtlcyB0aGUgZGlmZmVyZW5jZS4KKworR29vZ2xlIE1vY2sgd2FzIGJ1aWx0IHRvIGhlbHAgQysrIHByb2dyYW1tZXJzLiBJdCB3YXMgaW5zcGlyZWQgYnkgW2pNb2NrXShodHRwOi8vd3d3Lmptb2NrLm9yZy8pIGFuZCBbRWFzeU1vY2tdKGh0dHA6Ly93d3cuZWFzeW1vY2sub3JnLyksIGJ1dCBkZXNpZ25lZCB3aXRoIEMrKydzIHNwZWNpZmljcyBpbiBtaW5kLiBJdCBpcyB5b3VyIGZyaWVuZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBwcm9ibGVtcyBpcyBib3RoZXJpbmcgeW91OgorCisgICogWW91IGFyZSBzdHVjayB3aXRoIGEgc3ViLW9wdGltYWwgZGVzaWduIGFuZCB3aXNoIHlvdSBoYWQgZG9uZSBtb3JlIHByb3RvdHlwaW5nIGJlZm9yZSBpdCB3YXMgdG9vIGxhdGUsIGJ1dCBwcm90b3R5cGluZyBpbiBDKysgaXMgYnkgbm8gbWVhbnMgInJhcGlkIi4KKyAgKiBZb3VyIHRlc3RzIGFyZSBzbG93IGFzIHRoZXkgZGVwZW5kIG9uIHRvbyBtYW55IGxpYnJhcmllcyBvciB1c2UgZXhwZW5zaXZlIHJlc291cmNlcyAoZS5nLiBhIGRhdGFiYXNlKS4KKyAgKiBZb3VyIHRlc3RzIGFyZSBicml0dGxlIGFzIHNvbWUgcmVzb3VyY2VzIHRoZXkgdXNlIGFyZSB1bnJlbGlhYmxlIChlLmcuIHRoZSBuZXR3b3JrKS4KKyAgKiBZb3Ugd2FudCB0byB0ZXN0IGhvdyB5b3VyIGNvZGUgaGFuZGxlcyBhIGZhaWx1cmUgKGUuZy4gYSBmaWxlIGNoZWNrc3VtIGVycm9yKSwgYnV0IGl0J3Mgbm90IGVhc3kgdG8gY2F1c2Ugb25lLgorICAqIFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdXIgbW9kdWxlIGludGVyYWN0cyB3aXRoIG90aGVyIG1vZHVsZXMgaW4gdGhlIHJpZ2h0IHdheSwgYnV0IGl0J3MgaGFyZCB0byBvYnNlcnZlIHRoZSBpbnRlcmFjdGlvbjsgdGhlcmVmb3JlIHlvdSByZXNvcnQgdG8gb2JzZXJ2aW5nIHRoZSBzaWRlIGVmZmVjdHMgYXQgdGhlIGVuZCBvZiB0aGUgYWN0aW9uLCB3aGljaCBpcyBhd2t3YXJkIGF0IGJlc3QuCisgICogWW91IHdhbnQgdG8gIm1vY2sgb3V0IiB5b3VyIGRlcGVuZGVuY2llcywgZXhjZXB0IHRoYXQgdGhleSBkb24ndCBoYXZlIG1vY2sgaW1wbGVtZW50YXRpb25zIHlldDsgYW5kLCBmcmFua2x5LCB5b3UgYXJlbid0IHRocmlsbGVkIGJ5IHNvbWUgb2YgdGhvc2UgaGFuZC13cml0dGVuIG1vY2tzLgorCitXZSBlbmNvdXJhZ2UgeW91IHRvIHVzZSBHb29nbGUgTW9jayBhczoKKworICAqIGEgX2Rlc2lnbl8gdG9vbCwgZm9yIGl0IGxldHMgeW91IGV4cGVyaW1lbnQgd2l0aCB5b3VyIGludGVyZmFjZSBkZXNpZ24gZWFybHkgYW5kIG9mdGVuLiBNb3JlIGl0ZXJhdGlvbnMgbGVhZCB0byBiZXR0ZXIgZGVzaWducyEKKyAgKiBhIF90ZXN0aW5nXyB0b29sIHRvIGN1dCB5b3VyIHRlc3RzJyBvdXRib3VuZCBkZXBlbmRlbmNpZXMgYW5kIHByb2JlIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHlvdXIgbW9kdWxlIGFuZCBpdHMgY29sbGFib3JhdG9ycy4KKworIyBHZXR0aW5nIFN0YXJ0ZWQgIworVXNpbmcgR29vZ2xlIE1vY2sgaXMgZWFzeSEgSW5zaWRlIHlvdXIgQysrIHNvdXJjZSBmaWxlLCBqdXN0ICNpbmNsdWRlIGAiZ3Rlc3QvZ3Rlc3QuaCJgIGFuZCBgImdtb2NrL2dtb2NrLmgiYCwgYW5kIHlvdSBhcmUgcmVhZHkgdG8gZ28uCisKKyMgQSBDYXNlIGZvciBNb2NrIFR1cnRsZXMgIworTGV0J3MgbG9vayBhdCBhbiBleGFtcGxlLiBTdXBwb3NlIHlvdSBhcmUgZGV2ZWxvcGluZyBhIGdyYXBoaWNzIHByb2dyYW0gdGhhdCByZWxpZXMgb24gYSBMT0dPLWxpa2UgQVBJIGZvciBkcmF3aW5nLiBIb3cgd291bGQgeW91IHRlc3QgdGhhdCBpdCBkb2VzIHRoZSByaWdodCB0aGluZz8gV2VsbCwgeW91IGNhbiBydW4gaXQgYW5kIGNvbXBhcmUgdGhlIHNjcmVlbiB3aXRoIGEgZ29sZGVuIHNjcmVlbiBzbmFwc2hvdCwgYnV0IGxldCdzIGFkbWl0IGl0OiB0ZXN0cyBsaWtlIHRoaXMgYXJlIGV4cGVuc2l2ZSB0byBydW4gYW5kIGZyYWdpbGUgKFdoYXQgaWYgeW91IGp1c3QgdXBncmFkZWQgdG8gYSBzaGlueSBuZXcgZ3JhcGhpY3MgY2FyZCB0aGF0IGhhcyBiZXR0ZXIgYW50aS1hbGlhc2luZz8gU3VkZGVubHkgeW91IGhhdmUgdG8gdXBkYXRlIGFsbCB5b3VyIGdvbGRlbiBpbWFnZXMuKS4gSXQgd291bGQgYmUgdG9vIHBhaW5mdWwgaWYgYWxsIHlvdXIgdGVzdHMgYXJlIGxpa2UgdGhpcy4gRm9ydHVuYXRlbHksIHlvdSBsZWFybmVkIGFib3V0IERlcGVuZGVuY3kgSW5qZWN0aW9uIGFuZCBrbm93IHRoZSByaWdodCB0aGluZyB0byBkbzogaW5zdGVhZCBvZiBoYXZpbmcgeW91ciBhcHBsaWNhdGlvbiB0YWxrIHRvIHRoZSBkcmF3aW5nIEFQSSBkaXJlY3RseSwgd3JhcCB0aGUgQVBJIGluIGFuIGludGVyZmFjZSAoc2F5LCBgVHVydGxlYCkgYW5kIGNvZGUgdG8gdGhhdCBpbnRlcmZhY2U6CisKK2BgYAorY2xhc3MgVHVydGxlIHsKKyAgLi4uCisgIHZpcnR1YWwgflR1cnRsZSgpIHt9CisgIHZpcnR1YWwgdm9pZCBQZW5VcCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFBlbkRvd24oKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBGb3J3YXJkKGludCBkaXN0YW5jZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgVHVybihpbnQgZGVncmVlcykgPSAwOworICB2aXJ0dWFsIHZvaWQgR29UbyhpbnQgeCwgaW50IHkpID0gMDsKKyAgdmlydHVhbCBpbnQgR2V0WCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQgR2V0WSgpIGNvbnN0ID0gMDsKK307CitgYGAKKworKE5vdGUgdGhhdCB0aGUgZGVzdHJ1Y3RvciBvZiBgVHVydGxlYCAqKm11c3QqKiBiZSB2aXJ0dWFsLCBhcyBpcyB0aGUgY2FzZSBmb3IgKiphbGwqKiBjbGFzc2VzIHlvdSBpbnRlbmQgdG8gaW5oZXJpdCBmcm9tIC0gb3RoZXJ3aXNlIHRoZSBkZXN0cnVjdG9yIG9mIHRoZSBkZXJpdmVkIGNsYXNzIHdpbGwgbm90IGJlIGNhbGxlZCB3aGVuIHlvdSBkZWxldGUgYW4gb2JqZWN0IHRocm91Z2ggYSBiYXNlIHBvaW50ZXIsIGFuZCB5b3UnbGwgZ2V0IGNvcnJ1cHRlZCBwcm9ncmFtIHN0YXRlcyBsaWtlIG1lbW9yeSBsZWFrcy4pCisKK1lvdSBjYW4gY29udHJvbCB3aGV0aGVyIHRoZSB0dXJ0bGUncyBtb3ZlbWVudCB3aWxsIGxlYXZlIGEgdHJhY2UgdXNpbmcgYFBlblVwKClgIGFuZCBgUGVuRG93bigpYCwgYW5kIGNvbnRyb2wgaXRzIG1vdmVtZW50IHVzaW5nIGBGb3J3YXJkKClgLCBgVHVybigpYCwgYW5kIGBHb1RvKClgLiBGaW5hbGx5LCBgR2V0WCgpYCBhbmQgYEdldFkoKWAgdGVsbCB5b3UgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHR1cnRsZS4KKworWW91ciBwcm9ncmFtIHdpbGwgbm9ybWFsbHkgdXNlIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4gSW4gdGVzdHMsIHlvdSBjYW4gdXNlIGEgbW9jayBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IGNoZWNrIHdoYXQgZHJhd2luZyBwcmltaXRpdmVzIHlvdXIgcHJvZ3JhbSBpcyBjYWxsaW5nLCB3aXRoIHdoYXQgYXJndW1lbnRzLCBhbmQgaW4gd2hpY2ggb3JkZXIuIFRlc3RzIHdyaXR0ZW4gdGhpcyB3YXkgYXJlIG11Y2ggbW9yZSByb2J1c3QgKHRoZXkgd29uJ3QgYnJlYWsgYmVjYXVzZSB5b3VyIG5ldyBtYWNoaW5lIGRvZXMgYW50aS1hbGlhc2luZyBkaWZmZXJlbnRseSksIGVhc2llciB0byByZWFkIGFuZCBtYWludGFpbiAodGhlIGludGVudCBvZiBhIHRlc3QgaXMgZXhwcmVzc2VkIGluIHRoZSBjb2RlLCBub3QgaW4gc29tZSBiaW5hcnkgaW1hZ2VzKSwgYW5kIHJ1biBfbXVjaCwgbXVjaCBmYXN0ZXJfLgorCisjIFdyaXRpbmcgdGhlIE1vY2sgQ2xhc3MgIworSWYgeW91IGFyZSBsdWNreSwgdGhlIG1vY2tzIHlvdSBuZWVkIHRvIHVzZSBoYXZlIGFscmVhZHkgYmVlbiBpbXBsZW1lbnRlZCBieSBzb21lIG5pY2UgcGVvcGxlLiBJZiwgaG93ZXZlciwgeW91IGZpbmQgeW91cnNlbGYgaW4gdGhlIHBvc2l0aW9uIHRvIHdyaXRlIGEgbW9jayBjbGFzcywgcmVsYXggLSBHb29nbGUgTW9jayB0dXJucyB0aGlzIHRhc2sgaW50byBhIGZ1biBnYW1lISAoV2VsbCwgYWxtb3N0LikKKworIyMgSG93IHRvIERlZmluZSBJdCAjIworVXNpbmcgdGhlIGBUdXJ0bGVgIGludGVyZmFjZSBhcyBleGFtcGxlLCBoZXJlIGFyZSB0aGUgc2ltcGxlIHN0ZXBzIHlvdSBuZWVkIHRvIGZvbGxvdzoKKworICAxLiBEZXJpdmUgYSBjbGFzcyBgTW9ja1R1cnRsZWAgZnJvbSBgVHVydGxlYC4KKyAgMS4gVGFrZSBhIF92aXJ0dWFsXyBmdW5jdGlvbiBvZiBgVHVydGxlYCAod2hpbGUgaXQncyBwb3NzaWJsZSB0byBbbW9jayBub24tdmlydHVhbCBtZXRob2RzIHVzaW5nIHRlbXBsYXRlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0Nvb2tCb29rI01vY2tpbmdfTm9udmlydHVhbF9NZXRob2RzKSwgaXQncyBtdWNoIG1vcmUgaW52b2x2ZWQpLiBDb3VudCBob3cgbWFueSBhcmd1bWVudHMgaXQgaGFzLgorICAxLiBJbiB0aGUgYHB1YmxpYzpgIHNlY3Rpb24gb2YgdGhlIGNoaWxkIGNsYXNzLCB3cml0ZSBgTU9DS19NRVRIT0RuKCk7YCAob3IgYE1PQ0tfQ09OU1RfTUVUSE9EbigpO2AgaWYgeW91IGFyZSBtb2NraW5nIGEgYGNvbnN0YCBtZXRob2QpLCB3aGVyZSBgbmAgaXMgdGhlIG51bWJlciBvZiB0aGUgYXJndW1lbnRzOyBpZiB5b3UgY291bnRlZCB3cm9uZywgc2hhbWUgb24geW91LCBhbmQgYSBjb21waWxlciBlcnJvciB3aWxsIHRlbGwgeW91IHNvLgorICAxLiBOb3cgY29tZXMgdGhlIGZ1biBwYXJ0OiB5b3UgdGFrZSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLCBjdXQtYW5kLXBhc3RlIHRoZSBfZnVuY3Rpb24gbmFtZV8gYXMgdGhlIF9maXJzdF8gYXJndW1lbnQgdG8gdGhlIG1hY3JvLCBhbmQgbGVhdmUgd2hhdCdzIGxlZnQgYXMgdGhlIF9zZWNvbmRfIGFyZ3VtZW50IChpbiBjYXNlIHlvdSdyZSBjdXJpb3VzLCB0aGlzIGlzIHRoZSBfdHlwZSBvZiB0aGUgZnVuY3Rpb25fKS4KKyAgMS4gUmVwZWF0IHVudGlsIGFsbCB2aXJ0dWFsIGZ1bmN0aW9ucyB5b3Ugd2FudCB0byBtb2NrIGFyZSBkb25lLgorCitBZnRlciB0aGUgcHJvY2VzcywgeW91IHNob3VsZCBoYXZlIHNvbWV0aGluZyBsaWtlOgorCitgYGAKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIiAgLy8gQnJpbmdzIGluIEdvb2dsZSBNb2NrLgorY2xhc3MgTW9ja1R1cnRsZSA6IHB1YmxpYyBUdXJ0bGUgeworIHB1YmxpYzoKKyAgLi4uCisgIE1PQ0tfTUVUSE9EMChQZW5VcCwgdm9pZCgpKTsKKyAgTU9DS19NRVRIT0QwKFBlbkRvd24sIHZvaWQoKSk7CisgIE1PQ0tfTUVUSE9EMShGb3J3YXJkLCB2b2lkKGludCBkaXN0YW5jZSkpOworICBNT0NLX01FVEhPRDEoVHVybiwgdm9pZChpbnQgZGVncmVlcykpOworICBNT0NLX01FVEhPRDIoR29Ubywgdm9pZChpbnQgeCwgaW50IHkpKTsKKyAgTU9DS19DT05TVF9NRVRIT0QwKEdldFgsIGludCgpKTsKKyAgTU9DS19DT05TVF9NRVRIT0QwKEdldFksIGludCgpKTsKK307CitgYGAKKworWW91IGRvbid0IG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1vY2sgbWV0aG9kcyBzb21ld2hlcmUgZWxzZSAtIHRoZSBgTU9DS19NRVRIT0QqYCBtYWNyb3Mgd2lsbCBnZW5lcmF0ZSB0aGUgZGVmaW5pdGlvbnMgZm9yIHlvdS4gSXQncyB0aGF0IHNpbXBsZSEgT25jZSB5b3UgZ2V0IHRoZSBoYW5nIG9mIGl0LCB5b3UgY2FuIHB1bXAgb3V0IG1vY2sgY2xhc3NlcyBmYXN0ZXIgdGhhbiB5b3VyIHNvdXJjZS1jb250cm9sIHN5c3RlbSBjYW4gaGFuZGxlIHlvdXIgY2hlY2staW5zLgorCisqKlRpcDoqKiBJZiBldmVuIHRoaXMgaXMgdG9vIG11Y2ggd29yayBmb3IgeW91LCB5b3UnbGwgZmluZCB0aGUKK2BnbW9ja19nZW4ucHlgIHRvb2wgaW4gR29vZ2xlIE1vY2sncyBgc2NyaXB0cy9nZW5lcmF0b3IvYCBkaXJlY3RvcnkgKGNvdXJ0ZXN5IG9mIHRoZSBbY3BwY2xlYW5dKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jcHBjbGVhbi8pIHByb2plY3QpIHVzZWZ1bC4gIFRoaXMgY29tbWFuZC1saW5lCit0b29sIHJlcXVpcmVzIHRoYXQgeW91IGhhdmUgUHl0aG9uIDIuNCBpbnN0YWxsZWQuICBZb3UgZ2l2ZSBpdCBhIEMrKyBmaWxlIGFuZCB0aGUgbmFtZSBvZiBhbiBhYnN0cmFjdCBjbGFzcyBkZWZpbmVkIGluIGl0LAorYW5kIGl0IHdpbGwgcHJpbnQgdGhlIGRlZmluaXRpb24gb2YgdGhlIG1vY2sgY2xhc3MgZm9yIHlvdS4gIER1ZSB0byB0aGUKK2NvbXBsZXhpdHkgb2YgdGhlIEMrKyBsYW5ndWFnZSwgdGhpcyBzY3JpcHQgbWF5IG5vdCBhbHdheXMgd29yaywgYnV0CitpdCBjYW4gYmUgcXVpdGUgaGFuZHkgd2hlbiBpdCBkb2VzLiAgRm9yIG1vcmUgZGV0YWlscywgcmVhZCB0aGUgW3VzZXIgZG9jdW1lbnRhdGlvbl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svc291cmNlL2Jyb3dzZS90cnVuay9zY3JpcHRzL2dlbmVyYXRvci9SRUFETUUpLgorCisjIyBXaGVyZSB0byBQdXQgSXQgIyMKK1doZW4geW91IGRlZmluZSBhIG1vY2sgY2xhc3MsIHlvdSBuZWVkIHRvIGRlY2lkZSB3aGVyZSB0byBwdXQgaXRzIGRlZmluaXRpb24uIFNvbWUgcGVvcGxlIHB1dCBpdCBpbiBhIGAqX3Rlc3QuY2NgLiBUaGlzIGlzIGZpbmUgd2hlbiB0aGUgaW50ZXJmYWNlIGJlaW5nIG1vY2tlZCAoc2F5LCBgRm9vYCkgaXMgb3duZWQgYnkgdGhlIHNhbWUgcGVyc29uIG9yIHRlYW0uIE90aGVyd2lzZSwgd2hlbiB0aGUgb3duZXIgb2YgYEZvb2AgY2hhbmdlcyBpdCwgeW91ciB0ZXN0IGNvdWxkIGJyZWFrLiAoWW91IGNhbid0IHJlYWxseSBleHBlY3QgYEZvb2AncyBtYWludGFpbmVyIHRvIGZpeCBldmVyeSB0ZXN0IHRoYXQgdXNlcyBgRm9vYCwgY2FuIHlvdT8pCisKK1NvLCB0aGUgcnVsZSBvZiB0aHVtYiBpczogaWYgeW91IG5lZWQgdG8gbW9jayBgRm9vYCBhbmQgaXQncyBvd25lZCBieSBvdGhlcnMsIGRlZmluZSB0aGUgbW9jayBjbGFzcyBpbiBgRm9vYCdzIHBhY2thZ2UgKGJldHRlciwgaW4gYSBgdGVzdGluZ2Agc3ViLXBhY2thZ2Ugc3VjaCB0aGF0IHlvdSBjYW4gY2xlYXJseSBzZXBhcmF0ZSBwcm9kdWN0aW9uIGNvZGUgYW5kIHRlc3RpbmcgdXRpbGl0aWVzKSwgYW5kIHB1dCBpdCBpbiBhIGBtb2NrX2Zvby5oYC4gVGhlbiBldmVyeW9uZSBjYW4gcmVmZXJlbmNlIGBtb2NrX2Zvby5oYCBmcm9tIHRoZWlyIHRlc3RzLiBJZiBgRm9vYCBldmVyIGNoYW5nZXMsIHRoZXJlIGlzIG9ubHkgb25lIGNvcHkgb2YgYE1vY2tGb29gIHRvIGNoYW5nZSwgYW5kIG9ubHkgdGVzdHMgdGhhdCBkZXBlbmQgb24gdGhlIGNoYW5nZWQgbWV0aG9kcyBuZWVkIHRvIGJlIGZpeGVkLgorCitBbm90aGVyIHdheSB0byBkbyBpdDogeW91IGNhbiBpbnRyb2R1Y2UgYSB0aGluIGxheWVyIGBGb29BZGFwdG9yYCBvbiB0b3Agb2YgYEZvb2AgYW5kIGNvZGUgdG8gdGhpcyBuZXcgaW50ZXJmYWNlLiBTaW5jZSB5b3Ugb3duIGBGb29BZGFwdG9yYCwgeW91IGNhbiBhYnNvcmIgY2hhbmdlcyBpbiBgRm9vYCBtdWNoIG1vcmUgZWFzaWx5LiBXaGlsZSB0aGlzIGlzIG1vcmUgd29yayBpbml0aWFsbHksIGNhcmVmdWxseSBjaG9vc2luZyB0aGUgYWRhcHRvciBpbnRlcmZhY2UgY2FuIG1ha2UgeW91ciBjb2RlIGVhc2llciB0byB3cml0ZSBhbmQgbW9yZSByZWFkYWJsZSAoYSBuZXQgd2luIGluIHRoZSBsb25nIHJ1biksIGFzIHlvdSBjYW4gY2hvb3NlIGBGb29BZGFwdG9yYCB0byBmaXQgeW91ciBzcGVjaWZpYyBkb21haW4gbXVjaCBiZXR0ZXIgdGhhbiBgRm9vYCBkb2VzLgorCisjIFVzaW5nIE1vY2tzIGluIFRlc3RzICMKK09uY2UgeW91IGhhdmUgYSBtb2NrIGNsYXNzLCB1c2luZyBpdCBpcyBlYXN5LiBUaGUgdHlwaWNhbCB3b3JrIGZsb3cgaXM6CisKKyAgMS4gSW1wb3J0IHRoZSBHb29nbGUgTW9jayBuYW1lcyBmcm9tIHRoZSBgdGVzdGluZ2AgbmFtZXNwYWNlIHN1Y2ggdGhhdCB5b3UgY2FuIHVzZSB0aGVtIHVucXVhbGlmaWVkIChZb3Ugb25seSBoYXZlIHRvIGRvIGl0IG9uY2UgcGVyIGZpbGUuIFJlbWVtYmVyIHRoYXQgbmFtZXNwYWNlcyBhcmUgYSBnb29kIGlkZWEgYW5kIGdvb2QgZm9yIHlvdXIgaGVhbHRoLikuCisgIDEuIENyZWF0ZSBzb21lIG1vY2sgb2JqZWN0cy4KKyAgMS4gU3BlY2lmeSB5b3VyIGV4cGVjdGF0aW9ucyBvbiB0aGVtIChIb3cgbWFueSB0aW1lcyB3aWxsIGEgbWV0aG9kIGJlIGNhbGxlZD8gV2l0aCB3aGF0IGFyZ3VtZW50cz8gV2hhdCBzaG91bGQgaXQgZG8/IGV0Yy4pLgorICAxLiBFeGVyY2lzZSBzb21lIGNvZGUgdGhhdCB1c2VzIHRoZSBtb2Nrczsgb3B0aW9uYWxseSwgY2hlY2sgdGhlIHJlc3VsdCB1c2luZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zLiBJZiBhIG1vY2sgbWV0aG9kIGlzIGNhbGxlZCBtb3JlIHRoYW4gZXhwZWN0ZWQgb3Igd2l0aCB3cm9uZyBhcmd1bWVudHMsIHlvdSdsbCBnZXQgYW4gZXJyb3IgaW1tZWRpYXRlbHkuCisgIDEuIFdoZW4gYSBtb2NrIGlzIGRlc3RydWN0ZWQsIEdvb2dsZSBNb2NrIHdpbGwgYXV0b21hdGljYWxseSBjaGVjayB3aGV0aGVyIGFsbCBleHBlY3RhdGlvbnMgb24gaXQgaGF2ZSBiZWVuIHNhdGlzZmllZC4KKworSGVyZSdzIGFuIGV4YW1wbGU6CisKK2BgYAorI2luY2x1ZGUgInBhdGgvdG8vbW9jay10dXJ0bGUuaCIKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCit1c2luZyA6OnRlc3Rpbmc6OkF0TGVhc3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gIzEKKworVEVTVChQYWludGVyVGVzdCwgQ2FuRHJhd1NvbWV0aGluZykgeworICBNb2NrVHVydGxlIHR1cnRsZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICMyCisgIEVYUEVDVF9DQUxMKHR1cnRsZSwgUGVuRG93bigpKSAgICAgICAgICAgICAgLy8gIzMKKyAgICAgIC5UaW1lcyhBdExlYXN0KDEpKTsKKworICBQYWludGVyIHBhaW50ZXIoJnR1cnRsZSk7ICAgICAgICAgICAgICAgICAgIC8vICM0CisKKyAgRVhQRUNUX1RSVUUocGFpbnRlci5EcmF3Q2lyY2xlKDAsIDAsIDEwKSk7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzUKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBtdXN0IGJlIGV4ZWN1dGVkIHRvIGluaXRpYWxpemUgR29vZ2xlIE1vY2sKKyAgLy8gKGFuZCBHb29nbGUgVGVzdCkgYmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3RzLgorICA6OnRlc3Rpbmc6OkluaXRHb29nbGVNb2NrKCZhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KK2BgYAorCitBcyB5b3UgbWlnaHQgaGF2ZSBndWVzc2VkLCB0aGlzIHRlc3QgY2hlY2tzIHRoYXQgYFBlbkRvd24oKWAgaXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UuIElmIHRoZSBgcGFpbnRlcmAgb2JqZWN0IGRpZG4ndCBjYWxsIHRoaXMgbWV0aG9kLCB5b3VyIHRlc3Qgd2lsbCBmYWlsIHdpdGggYSBtZXNzYWdlIGxpa2UgdGhpczoKKworYGBgCitwYXRoL3RvL215X3Rlc3QuY2M6MTE5OiBGYWlsdXJlCitBY3R1YWwgZnVuY3Rpb24gY2FsbCBjb3VudCBkb2Vzbid0IG1hdGNoIHRoaXMgZXhwZWN0YXRpb246CitBY3R1YWxseTogbmV2ZXIgY2FsbGVkOworRXhwZWN0ZWQ6IGNhbGxlZCBhdCBsZWFzdCBvbmNlLgorYGBgCisKKyoqVGlwIDE6KiogSWYgeW91IHJ1biB0aGUgdGVzdCBmcm9tIGFuIEVtYWNzIGJ1ZmZlciwgeW91IGNhbiBoaXQgYDxFbnRlcj5gIG9uIHRoZSBsaW5lIG51bWJlciBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgdG8ganVtcCByaWdodCB0byB0aGUgZmFpbGVkIGV4cGVjdGF0aW9uLgorCisqKlRpcCAyOioqIElmIHlvdXIgbW9jayBvYmplY3RzIGFyZSBuZXZlciBkZWxldGVkLCB0aGUgZmluYWwgdmVyaWZpY2F0aW9uIHdvbid0IGhhcHBlbi4gVGhlcmVmb3JlIGl0J3MgYSBnb29kIGlkZWEgdG8gdXNlIGEgaGVhcCBsZWFrIGNoZWNrZXIgaW4geW91ciB0ZXN0cyB3aGVuIHlvdSBhbGxvY2F0ZSBtb2NrcyBvbiB0aGUgaGVhcC4KKworKipJbXBvcnRhbnQgbm90ZToqKiBHb29nbGUgTW9jayByZXF1aXJlcyBleHBlY3RhdGlvbnMgdG8gYmUgc2V0ICoqYmVmb3JlKiogdGhlIG1vY2sgZnVuY3Rpb25zIGFyZSBjYWxsZWQsIG90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgKip1bmRlZmluZWQqKi4gSW4gcGFydGljdWxhciwgeW91IG11c3RuJ3QgaW50ZXJsZWF2ZSBgRVhQRUNUX0NBTEwoKWBzIGFuZCBjYWxscyB0byB0aGUgbW9jayBmdW5jdGlvbnMuCisKK1RoaXMgbWVhbnMgYEVYUEVDVF9DQUxMKClgIHNob3VsZCBiZSByZWFkIGFzIGV4cGVjdGluZyB0aGF0IGEgY2FsbCB3aWxsIG9jY3VyIF9pbiB0aGUgZnV0dXJlXywgbm90IHRoYXQgYSBjYWxsIGhhcyBvY2N1cnJlZC4gV2h5IGRvZXMgR29vZ2xlIE1vY2sgd29yayBsaWtlIHRoYXQ/IFdlbGwsIHNwZWNpZnlpbmcgdGhlIGV4cGVjdGF0aW9uIGJlZm9yZWhhbmQgYWxsb3dzIEdvb2dsZSBNb2NrIHRvIHJlcG9ydCBhIHZpb2xhdGlvbiBhcyBzb29uIGFzIGl0IGFyaXNlcywgd2hlbiB0aGUgY29udGV4dCAoc3RhY2sgdHJhY2UsIGV0YykgaXMgc3RpbGwgYXZhaWxhYmxlLiBUaGlzIG1ha2VzIGRlYnVnZ2luZyBtdWNoIGVhc2llci4KKworQWRtaXR0ZWRseSwgdGhpcyB0ZXN0IGlzIGNvbnRyaXZlZCBhbmQgZG9lc24ndCBkbyBtdWNoLiBZb3UgY2FuIGVhc2lseSBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCB3aXRob3V0IHVzaW5nIEdvb2dsZSBNb2NrLiBIb3dldmVyLCBhcyB3ZSBzaGFsbCByZXZlYWwgc29vbiwgR29vZ2xlIE1vY2sgYWxsb3dzIHlvdSB0byBkbyBfbXVjaCBtb3JlXyB3aXRoIHRoZSBtb2Nrcy4KKworIyMgVXNpbmcgR29vZ2xlIE1vY2sgd2l0aCBBbnkgVGVzdGluZyBGcmFtZXdvcmsgIyMKK0lmIHlvdSB3YW50IHRvIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBHb29nbGUgVGVzdCAoZS5nLiBbQ3BwVW5pdF0oaHR0cDovL2FwcHMuc291cmNlZm9yZ2UubmV0L21lZGlhd2lraS9jcHB1bml0L2luZGV4LnBocD90aXRsZT1NYWluX1BhZ2UpIG9yCitbQ3h4VGVzdF0oaHR0cDovL2N4eHRlc3QudGlncmlzLm9yZy8pKSBhcyB5b3VyIHRlc3RpbmcgZnJhbWV3b3JrLCBqdXN0IGNoYW5nZSB0aGUgYG1haW4oKWAgZnVuY3Rpb24gaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24gdG86CitgYGAKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgY2F1c2VzIEdvb2dsZSBNb2NrIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLAorICAvLyB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGJ5IHlvdXIgdGVzdGluZyBmcmFtZXdvcmsgYXMgYSB0ZXN0IGZhaWx1cmUuCisgIDo6dGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZU1vY2soJmFyZ2MsIGFyZ3YpOworICAuLi4gd2hhdGV2ZXIgeW91ciB0ZXN0aW5nIGZyYW1ld29yayByZXF1aXJlcyAuLi4KK30KK2BgYAorCitUaGlzIGFwcHJvYWNoIGhhcyBhIGNhdGNoOiBpdCBtYWtlcyBHb29nbGUgTW9jayB0aHJvdyBhbiBleGNlcHRpb24KK2Zyb20gYSBtb2NrIG9iamVjdCdzIGRlc3RydWN0b3Igc29tZXRpbWVzLiAgV2l0aCBzb21lIGNvbXBpbGVycywgdGhpcworc29tZXRpbWVzIGNhdXNlcyB0aGUgdGVzdCBwcm9ncmFtIHRvIGNyYXNoLiAgWW91J2xsIHN0aWxsIGJlIGFibGUgdG8KK25vdGljZSB0aGF0IHRoZSB0ZXN0IGhhcyBmYWlsZWQsIGJ1dCBpdCdzIG5vdCBhIGdyYWNlZnVsIGZhaWx1cmUuCisKK0EgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHVzZSBHb29nbGUgVGVzdCdzCitbZXZlbnQgbGlzdGVuZXIgQVBJXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzZfQWR2YW5jZWRHdWlkZSNFeHRlbmRpbmdfR29vZ2xlX1Rlc3RfYnlfSGFuZGxpbmdfVGVzdF9FdmVudHMpCit0byByZXBvcnQgYSB0ZXN0IGZhaWx1cmUgdG8geW91ciB0ZXN0aW5nIGZyYW1ld29yayBwcm9wZXJseS4gIFlvdSdsbCBuZWVkIHRvCitpbXBsZW1lbnQgdGhlIGBPblRlc3RQYXJ0UmVzdWx0KClgIG1ldGhvZCBvZiB0aGUgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlLCBidXQgaXQKK3Nob3VsZCBiZSBzdHJhaWdodGZvcndhcmQuCisKK0lmIHRoaXMgdHVybnMgb3V0IHRvIGJlIHRvbyBtdWNoIHdvcmssIHdlIHN1Z2dlc3QgdGhhdCB5b3Ugc3RpY2sgd2l0aAorR29vZ2xlIFRlc3QsIHdoaWNoIHdvcmtzIHdpdGggR29vZ2xlIE1vY2sgc2VhbWxlc3NseSAoaW4gZmFjdCwgaXQgaXMKK3RlY2huaWNhbGx5IHBhcnQgb2YgR29vZ2xlIE1vY2suKS4gIElmIHRoZXJlIGlzIGEgcmVhc29uIHRoYXQgeW91CitjYW5ub3QgdXNlIEdvb2dsZSBUZXN0LCBwbGVhc2UgbGV0IHVzIGtub3cuCisKKyMgU2V0dGluZyBFeHBlY3RhdGlvbnMgIworVGhlIGtleSB0byB1c2luZyBhIG1vY2sgb2JqZWN0IHN1Y2Nlc3NmdWxseSBpcyB0byBzZXQgdGhlIF9yaWdodCBleHBlY3RhdGlvbnNfIG9uIGl0LiBJZiB5b3Ugc2V0IHRoZSBleHBlY3RhdGlvbnMgdG9vIHN0cmljdCwgeW91ciB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgcmVzdWx0IG9mIHVucmVsYXRlZCBjaGFuZ2VzLiBJZiB5b3Ugc2V0IHRoZW0gdG9vIGxvb3NlLCBidWdzIGNhbiBzbGlwIHRocm91Z2guIFlvdSB3YW50IHRvIGRvIGl0IGp1c3QgcmlnaHQgc3VjaCB0aGF0IHlvdXIgdGVzdCBjYW4gY2F0Y2ggZXhhY3RseSB0aGUga2luZCBvZiBidWdzIHlvdSBpbnRlbmQgaXQgdG8gY2F0Y2guIEdvb2dsZSBNb2NrIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgbWVhbnMgZm9yIHlvdSB0byBkbyBpdCAianVzdCByaWdodC4iCisKKyMjIEdlbmVyYWwgU3ludGF4ICMjCitJbiBHb29nbGUgTW9jayB3ZSB1c2UgdGhlIGBFWFBFQ1RfQ0FMTCgpYCBtYWNybyB0byBzZXQgYW4gZXhwZWN0YXRpb24gb24gYSBtb2NrIG1ldGhvZC4gVGhlIGdlbmVyYWwgc3ludGF4IGlzOgorCitgYGAKK0VYUEVDVF9DQUxMKG1vY2tfb2JqZWN0LCBtZXRob2QobWF0Y2hlcnMpKQorICAgIC5UaW1lcyhjYXJkaW5hbGl0eSkKKyAgICAuV2lsbE9uY2UoYWN0aW9uKQorICAgIC5XaWxsUmVwZWF0ZWRseShhY3Rpb24pOworYGBgCisKK1RoZSBtYWNybyBoYXMgdHdvIGFyZ3VtZW50czogZmlyc3QgdGhlIG1vY2sgb2JqZWN0LCBhbmQgdGhlbiB0aGUgbWV0aG9kIGFuZCBpdHMgYXJndW1lbnRzLiBOb3RlIHRoYXQgdGhlIHR3byBhcmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEgKGAsYCksIG5vdCBhIHBlcmlvZCAoYC5gKS4gKFdoeSB1c2luZyBhIGNvbW1hPyBUaGUgYW5zd2VyIGlzIHRoYXQgaXQgd2FzIG5lY2Vzc2FyeSBmb3IgdGVjaG5pY2FsIHJlYXNvbnMuKQorCitUaGUgbWFjcm8gY2FuIGJlIGZvbGxvd2VkIGJ5IHNvbWUgb3B0aW9uYWwgX2NsYXVzZXNfIHRoYXQgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHBlY3RhdGlvbi4gV2UnbGwgZGlzY3VzcyBob3cgZWFjaCBjbGF1c2Ugd29ya3MgaW4gdGhlIGNvbWluZyBzZWN0aW9ucy4KKworVGhpcyBzeW50YXggaXMgZGVzaWduZWQgdG8gbWFrZSBhbiBleHBlY3RhdGlvbiByZWFkIGxpa2UgRW5nbGlzaC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gcHJvYmFibHkgZ3Vlc3MgdGhhdAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgLlRpbWVzKDUpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMTUwKSkKKyAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDIwMCkpOworYGBgCisKK3NheXMgdGhhdCB0aGUgYHR1cnRsZWAgb2JqZWN0J3MgYEdldFgoKWAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZpdmUgdGltZXMsIGl0IHdpbGwgcmV0dXJuIDEwMCB0aGUgZmlyc3QgdGltZSwgMTUwIHRoZSBzZWNvbmQgdGltZSwgYW5kIHRoZW4gMjAwIGV2ZXJ5IHRpbWUuIFNvbWUgcGVvcGxlIGxpa2UgdG8gY2FsbCB0aGlzIHN0eWxlIG9mIHN5bnRheCBhIERvbWFpbi1TcGVjaWZpYyBMYW5ndWFnZSAoRFNMKS4KKworKipOb3RlOioqIFdoeSBkbyB3ZSB1c2UgYSBtYWNybyB0byBkbyB0aGlzPyBJdCBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiBmaXJzdCBpdCBtYWtlcyBleHBlY3RhdGlvbnMgZWFzaWx5IGlkZW50aWZpYWJsZSAoZWl0aGVyIGJ5IGBncmVwYCBvciBieSBhIGh1bWFuIHJlYWRlciksIGFuZCBzZWNvbmQgaXQgYWxsb3dzIEdvb2dsZSBNb2NrIHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uIG9mIGEgZmFpbGVkIGV4cGVjdGF0aW9uIGluIG1lc3NhZ2VzLCBtYWtpbmcgZGVidWdnaW5nIGVhc2llci4KKworIyMgTWF0Y2hlcnM6IFdoYXQgQXJndW1lbnRzIERvIFdlIEV4cGVjdD8gIyMKK1doZW4gYSBtb2NrIGZ1bmN0aW9uIHRha2VzIGFyZ3VtZW50cywgd2UgbXVzdCBzcGVjaWZ5IHdoYXQgYXJndW1lbnRzIHdlIGFyZSBleHBlY3Rpbmc7IGZvciBleGFtcGxlOgorCitgYGAKKy8vIEV4cGVjdHMgdGhlIHR1cnRsZSB0byBtb3ZlIGZvcndhcmQgYnkgMTAwIHVuaXRzLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKDEwMCkpOworYGBgCisKK1NvbWV0aW1lcyB5b3UgbWF5IG5vdCB3YW50IHRvIGJlIHRvbyBzcGVjaWZpYyAoUmVtZW1iZXIgdGhhdCB0YWxrIGFib3V0IHRlc3RzIGJlaW5nIHRvbyByaWdpZD8gT3ZlciBzcGVjaWZpY2F0aW9uIGxlYWRzIHRvIGJyaXR0bGUgdGVzdHMgYW5kIG9ic2N1cmVzIHRoZSBpbnRlbnQgb2YgdGVzdHMuIFRoZXJlZm9yZSB3ZSBlbmNvdXJhZ2UgeW91IHRvIHNwZWNpZnkgb25seSB3aGF0J3MgbmVjZXNzYXJ5IC0gbm8gbW9yZSwgbm8gbGVzcy4pLiBJZiB5b3UgY2FyZSB0byBjaGVjayB0aGF0IGBGb3J3YXJkKClgIHdpbGwgYmUgY2FsbGVkIGJ1dCBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBpdHMgYWN0dWFsIGFyZ3VtZW50LCB3cml0ZSBgX2AgYXMgdGhlIGFyZ3VtZW50LCB3aGljaCBtZWFucyAiYW55dGhpbmcgZ29lcyI6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisvLyBFeHBlY3RzIHRoZSB0dXJ0bGUgdG8gbW92ZSBmb3J3YXJkLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKF8pKTsKK2BgYAorCitgX2AgaXMgYW4gaW5zdGFuY2Ugb2Ygd2hhdCB3ZSBjYWxsICoqbWF0Y2hlcnMqKi4gQSBtYXRjaGVyIGlzIGxpa2UgYSBwcmVkaWNhdGUgYW5kIGNhbiB0ZXN0IHdoZXRoZXIgYW4gYXJndW1lbnQgaXMgd2hhdCB3ZSdkIGV4cGVjdC4gWW91IGNhbiB1c2UgYSBtYXRjaGVyIGluc2lkZSBgRVhQRUNUX0NBTEwoKWAgd2hlcmV2ZXIgYSBmdW5jdGlvbiBhcmd1bWVudCBpcyBleHBlY3RlZC4KKworQSBsaXN0IG9mIGJ1aWx0LWluIG1hdGNoZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgW0NoZWF0U2hlZXRdKFYxXzZfQ2hlYXRTaGVldC5tZCkuIEZvciBleGFtcGxlLCBoZXJlJ3MgdGhlIGBHZWAgKGdyZWF0ZXIgdGhhbiBvciBlcXVhbCkgbWF0Y2hlcjoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkdlOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKEdlKDEwMCkpKTsKK2BgYAorCitUaGlzIGNoZWNrcyB0aGF0IHRoZSB0dXJ0bGUgd2lsbCBiZSB0b2xkIHRvIGdvIGZvcndhcmQgYnkgYXQgbGVhc3QgMTAwIHVuaXRzLgorCisjIyBDYXJkaW5hbGl0aWVzOiBIb3cgTWFueSBUaW1lcyBXaWxsIEl0IEJlIENhbGxlZD8gIyMKK1RoZSBmaXJzdCBjbGF1c2Ugd2UgY2FuIHNwZWNpZnkgZm9sbG93aW5nIGFuIGBFWFBFQ1RfQ0FMTCgpYCBpcyBgVGltZXMoKWAuIFdlIGNhbGwgaXRzIGFyZ3VtZW50IGEgKipjYXJkaW5hbGl0eSoqIGFzIGl0IHRlbGxzIF9ob3cgbWFueSB0aW1lc18gdGhlIGNhbGwgc2hvdWxkIG9jY3VyLiBJdCBhbGxvd3MgdXMgdG8gcmVwZWF0IGFuIGV4cGVjdGF0aW9uIG1hbnkgdGltZXMgd2l0aG91dCBhY3R1YWxseSB3cml0aW5nIGl0IGFzIG1hbnkgdGltZXMuIE1vcmUgaW1wb3J0YW50bHksIGEgY2FyZGluYWxpdHkgY2FuIGJlICJmdXp6eSIsIGp1c3QgbGlrZSBhIG1hdGNoZXIgY2FuIGJlLiBUaGlzIGFsbG93cyBhIHVzZXIgdG8gZXhwcmVzcyB0aGUgaW50ZW50IG9mIGEgdGVzdCBleGFjdGx5LgorCitBbiBpbnRlcmVzdGluZyBzcGVjaWFsIGNhc2UgaXMgd2hlbiB3ZSBzYXkgYFRpbWVzKDApYC4gWW91IG1heSBoYXZlIGd1ZXNzZWQgLSBpdCBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhdCBhbGwsIGFuZCBHb29nbGUgTW9jayB3aWxsIHJlcG9ydCBhIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2hlbmV2ZXIgdGhlIGZ1bmN0aW9uIGlzICh3cm9uZ2Z1bGx5KSBjYWxsZWQuCisKK1dlJ3ZlIHNlZW4gYEF0TGVhc3QobilgIGFzIGFuIGV4YW1wbGUgb2YgZnV6enkgY2FyZGluYWxpdGllcyBlYXJsaWVyLiBGb3IgdGhlIGxpc3Qgb2YgYnVpbHQtaW4gY2FyZGluYWxpdGllcyB5b3UgY2FuIHVzZSwgc2VlIHRoZSBbQ2hlYXRTaGVldF0oVjFfNl9DaGVhdFNoZWV0Lm1kKS4KKworVGhlIGBUaW1lcygpYCBjbGF1c2UgY2FuIGJlIG9taXR0ZWQuICoqSWYgeW91IG9taXQgYFRpbWVzKClgLCBHb29nbGUgTW9jayB3aWxsIGluZmVyIHRoZSBjYXJkaW5hbGl0eSBmb3IgeW91LioqIFRoZSBydWxlcyBhcmUgZWFzeSB0byByZW1lbWJlcjoKKworICAqIElmICoqbmVpdGhlcioqIGBXaWxsT25jZSgpYCAqKm5vcioqIGBXaWxsUmVwZWF0ZWRseSgpYCBpcyBpbiB0aGUgYEVYUEVDVF9DQUxMKClgLCB0aGUgaW5mZXJyZWQgY2FyZGluYWxpdHkgaXMgYFRpbWVzKDEpYC4KKyAgKiBJZiB0aGVyZSBhcmUgYG4gV2lsbE9uY2UoKWAncyBidXQgKipubyoqIGBXaWxsUmVwZWF0ZWRseSgpYCwgd2hlcmUgYG5gID49IDEsIHRoZSBjYXJkaW5hbGl0eSBpcyBgVGltZXMobilgLgorICAqIElmIHRoZXJlIGFyZSBgbiBXaWxsT25jZSgpYCdzIGFuZCAqKm9uZSoqIGBXaWxsUmVwZWF0ZWRseSgpYCwgd2hlcmUgYG5gID49IDAsIHRoZSBjYXJkaW5hbGl0eSBpcyBgVGltZXMoQXRMZWFzdChuKSlgLgorCisqKlF1aWNrIHF1aXo6Kiogd2hhdCBkbyB5b3UgdGhpbmsgd2lsbCBoYXBwZW4gaWYgYSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgdHdpY2UgYnV0IGFjdHVhbGx5IGNhbGxlZCBmb3VyIHRpbWVzPworCisjIyBBY3Rpb25zOiBXaGF0IFNob3VsZCBJdCBEbz8gIyMKK1JlbWVtYmVyIHRoYXQgYSBtb2NrIG9iamVjdCBkb2Vzbid0IHJlYWxseSBoYXZlIGEgd29ya2luZyBpbXBsZW1lbnRhdGlvbj8gV2UgYXMgdXNlcnMgaGF2ZSB0byB0ZWxsIGl0IHdoYXQgdG8gZG8gd2hlbiBhIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGVhc3kgaW4gR29vZ2xlIE1vY2suCisKK0ZpcnN0LCBpZiB0aGUgcmV0dXJuIHR5cGUgb2YgYSBtb2NrIGZ1bmN0aW9uIGlzIGEgYnVpbHQtaW4gdHlwZSBvciBhIHBvaW50ZXIsIHRoZSBmdW5jdGlvbiBoYXMgYSAqKmRlZmF1bHQgYWN0aW9uKiogKGEgYHZvaWRgIGZ1bmN0aW9uIHdpbGwganVzdCByZXR1cm4sIGEgYGJvb2xgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGBmYWxzZWAsIGFuZCBvdGhlciBmdW5jdGlvbnMgd2lsbCByZXR1cm4gMCkuIElmIHlvdSBkb24ndCBzYXkgYW55dGhpbmcsIHRoaXMgYmVoYXZpb3Igd2lsbCBiZSB1c2VkLgorCitTZWNvbmQsIGlmIGEgbW9jayBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IGFjdGlvbiwgb3IgdGhlIGRlZmF1bHQgYWN0aW9uIGRvZXNuJ3Qgc3VpdCB5b3UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIGVhY2ggdGltZSB0aGUgZXhwZWN0YXRpb24gbWF0Y2hlcyB1c2luZyBhIHNlcmllcyBvZiBgV2lsbE9uY2UoKWAgY2xhdXNlcyBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBgV2lsbFJlcGVhdGVkbHkoKWAuIEZvciBleGFtcGxlLAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMjAwKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDMwMCkpOworYGBgCisKK1RoaXMgc2F5cyB0aGF0IGB0dXJ0bGUuR2V0WCgpYCB3aWxsIGJlIGNhbGxlZCBfZXhhY3RseSB0aHJlZSB0aW1lc18gKEdvb2dsZSBNb2NrIGluZmVycmVkIHRoaXMgZnJvbSBob3cgbWFueSBgV2lsbE9uY2UoKWAgY2xhdXNlcyB3ZSd2ZSB3cml0dGVuLCBzaW5jZSB3ZSBkaWRuJ3QgZXhwbGljaXRseSB3cml0ZSBgVGltZXMoKWApLCBhbmQgd2lsbCByZXR1cm4gMTAwLCAyMDAsIGFuZCAzMDAgcmVzcGVjdGl2ZWx5LgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRZKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMjAwKSkKKyAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDMwMCkpOworYGBgCisKK3NheXMgdGhhdCBgdHVydGxlLkdldFkoKWAgd2lsbCBiZSBjYWxsZWQgX2F0IGxlYXN0IHR3aWNlXyAoR29vZ2xlIE1vY2sga25vd3MgdGhpcyBhcyB3ZSd2ZSB3cml0dGVuIHR3byBgV2lsbE9uY2UoKWAgY2xhdXNlcyBhbmQgYSBgV2lsbFJlcGVhdGVkbHkoKWAgd2hpbGUgaGF2aW5nIG5vIGV4cGxpY2l0IGBUaW1lcygpYCksIHdpbGwgcmV0dXJuIDEwMCB0aGUgZmlyc3QgdGltZSwgMjAwIHRoZSBzZWNvbmQgdGltZSwgYW5kIDMwMCBmcm9tIHRoZSB0aGlyZCB0aW1lIG9uLgorCitPZiBjb3Vyc2UsIGlmIHlvdSBleHBsaWNpdGx5IHdyaXRlIGEgYFRpbWVzKClgLCBHb29nbGUgTW9jayB3aWxsIG5vdCB0cnkgdG8gaW5mZXIgdGhlIGNhcmRpbmFsaXR5IGl0c2VsZi4gV2hhdCBpZiB0aGUgbnVtYmVyIHlvdSBzcGVjaWZpZWQgaXMgbGFyZ2VyIHRoYW4gdGhlcmUgYXJlIGBXaWxsT25jZSgpYCBjbGF1c2VzPyBXZWxsLCBhZnRlciBhbGwgYFdpbGxPbmNlKClgcyBhcmUgdXNlZCB1cCwgR29vZ2xlIE1vY2sgd2lsbCBkbyB0aGUgX2RlZmF1bHRfIGFjdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUgKHVubGVzcywgb2YgY291cnNlLCB5b3UgaGF2ZSBhIGBXaWxsUmVwZWF0ZWRseSgpYC4pLgorCitXaGF0IGNhbiB3ZSBkbyBpbnNpZGUgYFdpbGxPbmNlKClgIGJlc2lkZXMgYFJldHVybigpYD8gWW91IGNhbiByZXR1cm4gYSByZWZlcmVuY2UgdXNpbmcgYFJldHVyblJlZih2YXJpYWJsZSlgLCBvciBpbnZva2UgYSBwcmUtZGVmaW5lZCBmdW5jdGlvbiwgYW1vbmcgW290aGVyc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0NoZWF0U2hlZXQjQWN0aW9ucykuCisKKyoqSW1wb3J0YW50IG5vdGU6KiogVGhlIGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnQgZXZhbHVhdGVzIHRoZSBhY3Rpb24gY2xhdXNlIG9ubHkgb25jZSwgZXZlbiB0aG91Z2ggdGhlIGFjdGlvbiBtYXkgYmUgcGVyZm9ybWVkIG1hbnkgdGltZXMuIFRoZXJlZm9yZSB5b3UgbXVzdCBiZSBjYXJlZnVsIGFib3V0IHNpZGUgZWZmZWN0cy4gVGhlIGZvbGxvd2luZyBtYXkgbm90IGRvIHdoYXQgeW91IHdhbnQ6CisKK2BgYAoraW50IG4gPSAxMDA7CitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdldFgoKSkKKy5UaW1lcyg0KQorLldpbGxSZXBlYXRlZGx5KFJldHVybihuKyspKTsKK2BgYAorCitJbnN0ZWFkIG9mIHJldHVybmluZyAxMDAsIDEwMSwgMTAyLCAuLi4sIGNvbnNlY3V0aXZlbHksIHRoaXMgbW9jayBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gMTAwIGFzIGBuKytgIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIFNpbWlsYXJseSwgYFJldHVybihuZXcgRm9vKWAgd2lsbCBjcmVhdGUgYSBuZXcgYEZvb2Agb2JqZWN0IHdoZW4gdGhlIGBFWFBFQ1RfQ0FMTCgpYCBpcyBleGVjdXRlZCwgYW5kIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHBvaW50ZXIgZXZlcnkgdGltZS4gSWYgeW91IHdhbnQgdGhlIHNpZGUgZWZmZWN0IHRvIGhhcHBlbiBldmVyeSB0aW1lLCB5b3UgbmVlZCB0byBkZWZpbmUgYSBjdXN0b20gYWN0aW9uLCB3aGljaCB3ZSdsbCB0ZWFjaCBpbiB0aGUgW0Nvb2tCb29rXShWMV82X0Nvb2tCb29rLm1kKS4KKworVGltZSBmb3IgYW5vdGhlciBxdWl6ISBXaGF0IGRvIHlvdSB0aGluayB0aGUgZm9sbG93aW5nIG1lYW5zPworCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRZKCkpCisuVGltZXMoNCkKKy5XaWxsT25jZShSZXR1cm4oMTAwKSk7CitgYGAKKworT2J2aW91c2x5IGB0dXJ0bGUuR2V0WSgpYCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgZm91ciB0aW1lcy4gQnV0IGlmIHlvdSB0aGluayBpdCB3aWxsIHJldHVybiAxMDAgZXZlcnkgdGltZSwgdGhpbmsgdHdpY2UhIFJlbWVtYmVyIHRoYXQgb25lIGBXaWxsT25jZSgpYCBjbGF1c2Ugd2lsbCBiZSBjb25zdW1lZCBlYWNoIHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGludm9rZWQgYW5kIHRoZSBkZWZhdWx0IGFjdGlvbiB3aWxsIGJlIHRha2VuIGFmdGVyd2FyZHMuIFNvIHRoZSByaWdodCBhbnN3ZXIgaXMgdGhhdCBgdHVydGxlLkdldFkoKWAgd2lsbCByZXR1cm4gMTAwIHRoZSBmaXJzdCB0aW1lLCBidXQgKipyZXR1cm4gMCBmcm9tIHRoZSBzZWNvbmQgdGltZSBvbioqLCBhcyByZXR1cm5pbmcgMCBpcyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGBpbnRgIGZ1bmN0aW9ucy4KKworIyMgVXNpbmcgTXVsdGlwbGUgRXhwZWN0YXRpb25zICMjCitTbyBmYXIgd2UndmUgb25seSBzaG93biBleGFtcGxlcyB3aGVyZSB5b3UgaGF2ZSBhIHNpbmdsZSBleHBlY3RhdGlvbi4gTW9yZSByZWFsaXN0aWNhbGx5LCB5b3UncmUgZ29pbmcgdG8gc3BlY2lmeSBleHBlY3RhdGlvbnMgb24gbXVsdGlwbGUgbW9jayBtZXRob2RzLCB3aGljaCBtYXkgYmUgZnJvbSBtdWx0aXBsZSBtb2NrIG9iamVjdHMuCisKK0J5IGRlZmF1bHQsIHdoZW4gYSBtb2NrIG1ldGhvZCBpcyBpbnZva2VkLCBHb29nbGUgTW9jayB3aWxsIHNlYXJjaCB0aGUgZXhwZWN0YXRpb25zIGluIHRoZSAqKnJldmVyc2Ugb3JkZXIqKiB0aGV5IGFyZSBkZWZpbmVkLCBhbmQgc3RvcCB3aGVuIGFuIGFjdGl2ZSBleHBlY3RhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGFyZ3VtZW50cyBpcyBmb3VuZCAoeW91IGNhbiB0aGluayBvZiBpdCBhcyAibmV3ZXIgcnVsZXMgb3ZlcnJpZGUgb2xkZXIgb25lcy4iKS4gSWYgdGhlIG1hdGNoaW5nIGV4cGVjdGF0aW9uIGNhbm5vdCB0YWtlIGFueSBtb3JlIGNhbGxzLCB5b3Ugd2lsbCBnZXQgYW4gdXBwZXItYm91bmQtdmlvbGF0ZWQgZmFpbHVyZS4gSGVyZSdzIGFuIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKF8pKTsgIC8vICMxCitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEZvcndhcmQoMTApKSAgLy8gIzIKKyAgICAuVGltZXMoMik7CitgYGAKKworSWYgYEZvcndhcmQoMTApYCBpcyBjYWxsZWQgdGhyZWUgdGltZXMgaW4gYSByb3csIHRoZSB0aGlyZCB0aW1lIGl0IHdpbGwgYmUgYW4gZXJyb3IsIGFzIHRoZSBsYXN0IG1hdGNoaW5nIGV4cGVjdGF0aW9uICgjMikgaGFzIGJlZW4gc2F0dXJhdGVkLiBJZiwgaG93ZXZlciwgdGhlIHRoaXJkIGBGb3J3YXJkKDEwKWAgY2FsbCBpcyByZXBsYWNlZCBieSBgRm9yd2FyZCgyMClgLCB0aGVuIGl0IHdvdWxkIGJlIE9LLCBhcyBub3cgIzEgd2lsbCBiZSB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24uCisKKyoqU2lkZSBub3RlOioqIFdoeSBkb2VzIEdvb2dsZSBNb2NrIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiB0aGUgX3JldmVyc2VfIG9yZGVyIG9mIHRoZSBleHBlY3RhdGlvbnM/IFRoZSByZWFzb24gaXMgdGhhdCB0aGlzIGFsbG93cyBhIHVzZXIgdG8gc2V0IHVwIHRoZSBkZWZhdWx0IGV4cGVjdGF0aW9ucyBpbiBhIG1vY2sgb2JqZWN0J3MgY29uc3RydWN0b3Igb3IgdGhlIHRlc3QgZml4dHVyZSdzIHNldC11cCBwaGFzZSBhbmQgdGhlbiBjdXN0b21pemUgdGhlIG1vY2sgYnkgd3JpdGluZyBtb3JlIHNwZWNpZmljIGV4cGVjdGF0aW9ucyBpbiB0aGUgdGVzdCBib2R5LiBTbywgaWYgeW91IGhhdmUgdHdvIGV4cGVjdGF0aW9ucyBvbiB0aGUgc2FtZSBtZXRob2QsIHlvdSB3YW50IHRvIHB1dCB0aGUgb25lIHdpdGggbW9yZSBzcGVjaWZpYyBtYXRjaGVycyAqKmFmdGVyKiogdGhlIG90aGVyLCBvciB0aGUgbW9yZSBzcGVjaWZpYyBydWxlIHdvdWxkIGJlIHNoYWRvd2VkIGJ5IHRoZSBtb3JlIGdlbmVyYWwgb25lIHRoYXQgY29tZXMgYWZ0ZXIgaXQuCisKKyMjIE9yZGVyZWQgdnMgVW5vcmRlcmVkIENhbGxzICMjCitCeSBkZWZhdWx0LCBhbiBleHBlY3RhdGlvbiBjYW4gbWF0Y2ggYSBjYWxsIGV2ZW4gdGhvdWdoIGFuIGVhcmxpZXIgZXhwZWN0YXRpb24gaGFzbid0IGJlZW4gc2F0aXNmaWVkLiBJbiBvdGhlciB3b3JkcywgdGhlIGNhbGxzIGRvbid0IGhhdmUgdG8gb2NjdXIgaW4gdGhlIG9yZGVyIHRoZSBleHBlY3RhdGlvbnMgYXJlIHNwZWNpZmllZC4KKworU29tZXRpbWVzLCB5b3UgbWF5IHdhbnQgYWxsIHRoZSBleHBlY3RlZCBjYWxscyB0byBvY2N1ciBpbiBhIHN0cmljdCBvcmRlci4gVG8gc2F5IHRoaXMgaW4gR29vZ2xlIE1vY2sgaXMgZWFzeToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Li4uCitURVNUKEZvb1Rlc3QsIERyYXdzTGluZVNlZ21lbnQpIHsKKyAgLi4uCisgIHsKKyAgICBJblNlcXVlbmNlIGR1bW15OworCisgICAgRVhQRUNUX0NBTEwodHVydGxlLCBQZW5Eb3duKCkpOworICAgIEVYUEVDVF9DQUxMKHR1cnRsZSwgRm9yd2FyZCgxMDApKTsKKyAgICBFWFBFQ1RfQ0FMTCh0dXJ0bGUsIFBlblVwKCkpOworICB9CisgIEZvbygpOworfQorYGBgCisKK0J5IGNyZWF0aW5nIGFuIG9iamVjdCBvZiB0eXBlIGBJblNlcXVlbmNlYCwgYWxsIGV4cGVjdGF0aW9ucyBpbiBpdHMgc2NvcGUgYXJlIHB1dCBpbnRvIGEgX3NlcXVlbmNlXyBhbmQgaGF2ZSB0byBvY2N1ciBfc2VxdWVudGlhbGx5Xy4gU2luY2Ugd2UgYXJlIGp1c3QgcmVseWluZyBvbiB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3Igb2YgdGhpcyBvYmplY3QgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLCBpdHMgbmFtZSBpcyByZWFsbHkgaXJyZWxldmFudC4KKworSW4gdGhpcyBleGFtcGxlLCB3ZSB0ZXN0IHRoYXQgYEZvbygpYCBjYWxscyB0aGUgdGhyZWUgZXhwZWN0ZWQgZnVuY3Rpb25zIGluIHRoZSBvcmRlciBhcyB3cml0dGVuLiBJZiBhIGNhbGwgaXMgbWFkZSBvdXQtb2Ytb3JkZXIsIGl0IHdpbGwgYmUgYW4gZXJyb3IuCisKKyhXaGF0IGlmIHlvdSBjYXJlIGFib3V0IHRoZSByZWxhdGl2ZSBvcmRlciBvZiBzb21lIG9mIHRoZSBjYWxscywgYnV0IG5vdCBhbGwgb2YgdGhlbT8gQ2FuIHlvdSBzcGVjaWZ5IGFuIGFyYml0cmFyeSBwYXJ0aWFsIG9yZGVyPyBUaGUgYW5zd2VyIGlzIC4uLiB5ZXMhIElmIHlvdSBhcmUgaW1wYXRpZW50LCB0aGUgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gdGhlIFtDb29rQm9va10oVjFfNl9Db29rQm9vay5tZCkuKQorCisjIyBBbGwgRXhwZWN0YXRpb25zIEFyZSBTdGlja3kgKFVubGVzcyBTYWlkIE90aGVyd2lzZSkgIyMKK05vdyBsZXQncyBkbyBhIHF1aWNrIHF1aXogdG8gc2VlIGhvdyB3ZWxsIHlvdSBjYW4gdXNlIHRoaXMgbW9jayBzdHVmZiBhbHJlYWR5LiBIb3cgd291bGQgeW91IHRlc3QgdGhhdCB0aGUgdHVydGxlIGlzIGFza2VkIHRvIGdvIHRvIHRoZSBvcmlnaW4gX2V4YWN0bHkgdHdpY2VfICh5b3Ugd2FudCB0byBpZ25vcmUgYW55IG90aGVyIGluc3RydWN0aW9ucyBpdCByZWNlaXZlcyk/CisKK0FmdGVyIHlvdSd2ZSBjb21lIHVwIHdpdGggeW91ciBhbnN3ZXIsIHRha2UgYSBsb29rIGF0IG91cnMgYW5kIGNvbXBhcmUgbm90ZXMgKHNvbHZlIGl0IHlvdXJzZWxmIGZpcnN0IC0gZG9uJ3QgY2hlYXQhKToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Li4uCitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdvVG8oXywgXykpICAvLyAjMQorICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdvVG8oMCwgMCkpICAvLyAjMgorICAgIC5UaW1lcygyKTsKK2BgYAorCitTdXBwb3NlIGB0dXJ0bGUuR29UbygwLCAwKWAgaXMgY2FsbGVkIHRocmVlIHRpbWVzLiBJbiB0aGUgdGhpcmQgdGltZSwgR29vZ2xlIE1vY2sgd2lsbCBzZWUgdGhhdCB0aGUgYXJndW1lbnRzIG1hdGNoIGV4cGVjdGF0aW9uICMyIChyZW1lbWJlciB0aGF0IHdlIGFsd2F5cyBwaWNrIHRoZSBsYXN0IG1hdGNoaW5nIGV4cGVjdGF0aW9uKS4gTm93LCBzaW5jZSB3ZSBzYWlkIHRoYXQgdGhlcmUgc2hvdWxkIGJlIG9ubHkgdHdvIHN1Y2ggY2FsbHMsIEdvb2dsZSBNb2NrIHdpbGwgcmVwb3J0IGFuIGVycm9yIGltbWVkaWF0ZWx5LiBUaGlzIGlzIGJhc2ljYWxseSB3aGF0IHdlJ3ZlIHRvbGQgeW91IGluIHRoZSAiVXNpbmcgTXVsdGlwbGUgRXhwZWN0YXRpb25zIiBzZWN0aW9uIGFib3ZlLgorCitUaGlzIGV4YW1wbGUgc2hvd3MgdGhhdCAqKmV4cGVjdGF0aW9ucyBpbiBHb29nbGUgTW9jayBhcmUgInN0aWNreSIgYnkgZGVmYXVsdCoqLCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IHJlbWFpbiBhY3RpdmUgZXZlbiBhZnRlciB3ZSBoYXZlIHJlYWNoZWQgdGhlaXIgaW52b2NhdGlvbiB1cHBlciBib3VuZHMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHJ1bGUgdG8gcmVtZW1iZXIsIGFzIGl0IGFmZmVjdHMgdGhlIG1lYW5pbmcgb2YgdGhlIHNwZWMsIGFuZCBpcyAqKmRpZmZlcmVudCoqIHRvIGhvdyBpdCdzIGRvbmUgaW4gbWFueSBvdGhlciBtb2NraW5nIGZyYW1ld29ya3MgKFdoeSdkIHdlIGRvIHRoYXQ/IEJlY2F1c2Ugd2UgdGhpbmsgb3VyIHJ1bGUgbWFrZXMgdGhlIGNvbW1vbiBjYXNlcyBlYXNpZXIgdG8gZXhwcmVzcyBhbmQgdW5kZXJzdGFuZC4pLgorCitTaW1wbGU/IExldCdzIHNlZSBpZiB5b3UndmUgcmVhbGx5IHVuZGVyc3Rvb2QgaXQ6IHdoYXQgZG9lcyB0aGUgZm9sbG93aW5nIGNvZGUgc2F5PworCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworLi4uCitmb3IgKGludCBpID0gbjsgaSA+IDA7IGktLSkgeworICBFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdldFgoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMTAqaSkpOworfQorYGBgCisKK0lmIHlvdSB0aGluayBpdCBzYXlzIHRoYXQgYHR1cnRsZS5HZXRYKClgIHdpbGwgYmUgY2FsbGVkIGBuYCB0aW1lcyBhbmQgd2lsbCByZXR1cm4gMTAsIDIwLCAzMCwgLi4uLCBjb25zZWN1dGl2ZWx5LCB0aGluayB0d2ljZSEgVGhlIHByb2JsZW0gaXMgdGhhdCwgYXMgd2Ugc2FpZCwgZXhwZWN0YXRpb25zIGFyZSBzdGlja3kuIFNvLCB0aGUgc2Vjb25kIHRpbWUgYHR1cnRsZS5HZXRYKClgIGlzIGNhbGxlZCwgdGhlIGxhc3QgKGxhdGVzdCkgYEVYUEVDVF9DQUxMKClgIHN0YXRlbWVudCB3aWxsIG1hdGNoLCBhbmQgd2lsbCBpbW1lZGlhdGVseSBsZWFkIHRvIGFuICJ1cHBlciBib3VuZCBleGNlZWRlZCIgZXJyb3IgLSB0aGlzIHBpZWNlIG9mIGNvZGUgaXMgbm90IHZlcnkgdXNlZnVsIQorCitPbmUgY29ycmVjdCB3YXkgb2Ygc2F5aW5nIHRoYXQgYHR1cnRsZS5HZXRYKClgIHdpbGwgcmV0dXJuIDEwLCAyMCwgMzAsIC4uLiwgaXMgdG8gZXhwbGljaXRseSBzYXkgdGhhdCB0aGUgZXhwZWN0YXRpb25zIGFyZSBfbm90XyBzdGlja3kuIEluIG90aGVyIHdvcmRzLCB0aGV5IHNob3VsZCBfcmV0aXJlXyBhcyBzb29uIGFzIHRoZXkgYXJlIHNhdHVyYXRlZDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKy4uLgorZm9yIChpbnQgaSA9IG47IGkgPiAwOyBpLS0pIHsKKyAgRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxMCppKSkKKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworfQorYGBgCisKK0FuZCwgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gZG8gaXQ6IGluIHRoaXMgY2FzZSwgd2UgZXhwZWN0IHRoZSBjYWxscyB0byBvY2N1ciBpbiBhIHNwZWNpZmljIG9yZGVyLCBhbmQgd2UgbGluZSB1cCB0aGUgYWN0aW9ucyB0byBtYXRjaCB0aGUgb3JkZXIuIFNpbmNlIHRoZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgd2Ugc2hvdWxkIG1ha2UgaXQgZXhwbGljaXQgdXNpbmcgYSBzZXF1ZW5jZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKy4uLgoreworICBJblNlcXVlbmNlIHM7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CisgICAgRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMTAqaSkpCisgICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisgIH0KK30KK2BgYAorCitCeSB0aGUgd2F5LCB0aGUgb3RoZXIgc2l0dWF0aW9uIHdoZXJlIGFuIGV4cGVjdGF0aW9uIG1heSBfbm90XyBiZSBzdGlja3kgaXMgd2hlbiBpdCdzIGluIGEgc2VxdWVuY2UgLSBhcyBzb29uIGFzIGFub3RoZXIgZXhwZWN0YXRpb24gdGhhdCBjb21lcyBhZnRlciBpdCBpbiB0aGUgc2VxdWVuY2UgaGFzIGJlZW4gdXNlZCwgaXQgYXV0b21hdGljYWxseSByZXRpcmVzIChhbmQgd2lsbCBuZXZlciBiZSB1c2VkIHRvIG1hdGNoIGFueSBjYWxsKS4KKworIyMgVW5pbnRlcmVzdGluZyBDYWxscyAjIworQSBtb2NrIG9iamVjdCBtYXkgaGF2ZSBtYW55IG1ldGhvZHMsIGFuZCBub3QgYWxsIG9mIHRoZW0gYXJlIHRoYXQgaW50ZXJlc3RpbmcuIEZvciBleGFtcGxlLCBpbiBzb21lIHRlc3RzIHdlIG1heSBub3QgY2FyZSBhYm91dCBob3cgbWFueSB0aW1lcyBgR2V0WCgpYCBhbmQgYEdldFkoKWAgZ2V0IGNhbGxlZC4KKworSW4gR29vZ2xlIE1vY2ssIGlmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYSBtZXRob2QsIGp1c3QgZG9uJ3Qgc2F5IGFueXRoaW5nIGFib3V0IGl0LiBJZiBhIGNhbGwgdG8gdGhpcyBtZXRob2Qgb2NjdXJzLCB5b3UnbGwgc2VlIGEgd2FybmluZyBpbiB0aGUgdGVzdCBvdXRwdXQsIGJ1dCBpdCB3b24ndCBiZSBhIGZhaWx1cmUuCisKKyMgV2hhdCBOb3c/ICMKK0NvbmdyYXR1bGF0aW9ucyEgWW91J3ZlIGxlYXJuZWQgZW5vdWdoIGFib3V0IEdvb2dsZSBNb2NrIHRvIHN0YXJ0IHVzaW5nIGl0LiBOb3csIHlvdSBtaWdodCB3YW50IHRvIGpvaW4gdGhlIFtnb29nbGVtb2NrXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xlbW9jaykgZGlzY3Vzc2lvbiBncm91cCBhbmQgYWN0dWFsbHkgd3JpdGUgc29tZSB0ZXN0cyB1c2luZyBHb29nbGUgTW9jayAtIGl0IHdpbGwgYmUgZnVuLiBIZXksIGl0IG1heSBldmVuIGJlIGFkZGljdGl2ZSAtIHlvdSd2ZSBiZWVuIHdhcm5lZC4KKworVGhlbiwgaWYgeW91IGZlZWwgbGlrZSBpbmNyZWFzaW5nIHlvdXIgbW9jayBxdW90aWVudCwgeW91IHNob3VsZCBtb3ZlIG9uIHRvIHRoZSBbQ29va0Jvb2tdKFYxXzZfQ29va0Jvb2subWQpLiBZb3UgY2FuIGxlYXJuIG1hbnkgYWR2YW5jZWQgZmVhdHVyZXMgb2YgR29vZ2xlIE1vY2sgdGhlcmUgLS0gYW5kIGFkdmFuY2UgeW91ciBsZXZlbCBvZiBlbmpveW1lbnQgYW5kIHRlc3RpbmcgYmxpc3MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNi9GcmVxdWVudGx5QXNrZWRRdWVzdGlvbnMubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV82L0ZyZXF1ZW50bHlBc2tlZFF1ZXN0aW9ucy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ3MTVkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNi9GcmVxdWVudGx5QXNrZWRRdWVzdGlvbnMubWQKQEAgLTAsMCArMSw2MjggQEAKKworCitQbGVhc2Ugc2VuZCB5b3VyIHF1ZXN0aW9ucyB0byB0aGUKK1tnb29nbGVtb2NrXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xlbW9jaykgZGlzY3Vzc2lvbgorZ3JvdXAuIElmIHlvdSBuZWVkIGhlbHAgd2l0aCBjb21waWxlciBlcnJvcnMsIG1ha2Ugc3VyZSB5b3UgaGF2ZQordHJpZWQgW0dvb2dsZSBNb2NrIERvY3Rvcl0oI0hvd19hbV9JX3N1cHBvc2VkX3RvX21ha2Vfc2Vuc2Vfb2ZfdGhlc2VfaG9ycmlibGVfdGVtcGxhdGVfZXJyb3IubWQpIGZpcnN0LgorCisjIyBXaGVuIEkgY2FsbCBhIG1ldGhvZCBvbiBteSBtb2NrIG9iamVjdCwgdGhlIG1ldGhvZCBmb3IgdGhlIHJlYWwgb2JqZWN0IGlzIGludm9rZWQgaW5zdGVhZC4gIFdoYXQncyB0aGUgcHJvYmxlbT8gIyMKKworSW4gb3JkZXIgZm9yIGEgbWV0aG9kIHRvIGJlIG1vY2tlZCwgaXQgbXVzdCBiZSBfdmlydHVhbF8sIHVubGVzcyB5b3UgdXNlIHRoZSBbaGlnaC1wZXJmIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHRlY2huaXF1ZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0Nvb2tCb29rI01vY2tpbmdfTm9udmlydHVhbF9NZXRob2RzKS4KKworIyMgSSB3cm90ZSBzb21lIG1hdGNoZXJzLiAgQWZ0ZXIgSSB1cGdyYWRlZCB0byBhIG5ldyB2ZXJzaW9uIG9mIEdvb2dsZSBNb2NrLCB0aGV5IG5vIGxvbmdlciBjb21waWxlLiAgV2hhdCdzIGdvaW5nIG9uPyAjIworCitBZnRlciB2ZXJzaW9uIDEuNC4wIG9mIEdvb2dsZSBNb2NrIHdhcyByZWxlYXNlZCwgd2UgaGFkIGFuIGlkZWEgb24gaG93Cit0byBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBtYXRjaGVycyB0aGF0IGNhbiBnZW5lcmF0ZSBpbmZvcm1hdGl2ZQorbWVzc2FnZXMgZWZmaWNpZW50bHkuICBXZSBleHBlcmltZW50ZWQgd2l0aCB0aGlzIGlkZWEgYW5kIGxpa2VkIHdoYXQKK3dlIHNhdy4gIFRoZXJlZm9yZSB3ZSBkZWNpZGVkIHRvIGltcGxlbWVudCBpdC4KKworVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIGRlZmluZWQgeW91ciBvd24gbWF0Y2hlcnMKK2J5IGltcGxlbWVudGluZyBgTWF0Y2hlckludGVyZmFjZWAgb3IgdXNpbmcgYE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKWAsCit5b3VyIGRlZmluaXRpb25zIHdpbGwgbm8gbG9uZ2VyIGNvbXBpbGUuICBNYXRjaGVycyBkZWZpbmVkIHVzaW5nIHRoZQorYE1BVENIRVIqYCBmYW1pbHkgb2YgbWFjcm9zIGFyZSBub3QgYWZmZWN0ZWQuCisKK1NvcnJ5IGZvciB0aGUgaGFzc2xlIGlmIHlvdXIgbWF0Y2hlcnMgYXJlIGFmZmVjdGVkLiAgV2UgYmVsaWV2ZSBpdCdzCitpbiBldmVyeW9uZSdzIGxvbmctdGVybSBpbnRlcmVzdCB0byBtYWtlIHRoaXMgY2hhbmdlIHNvb25lciB0aGFuCitsYXRlci4gIEZvcnR1bmF0ZWx5LCBpdCdzIHVzdWFsbHkgbm90IGhhcmQgdG8gbWlncmF0ZSBhbiBleGlzdGluZworbWF0Y2hlciB0byB0aGUgbmV3IEFQSS4gIEhlcmUncyB3aGF0IHlvdSBuZWVkIHRvIGRvOgorCitJZiB5b3Ugd3JvdGUgeW91ciBtYXRjaGVyIGxpa2UgdGhpczoKK2BgYAorLy8gT2xkIG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBsYXRlc3QKKy8vIEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOworLi4uCitjbGFzcyBNeVdvbmRlcmZ1bE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxNeVR5cGU+IHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hlcyhNeVR5cGUgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0Rm9vKCkgPiA1OworICB9CisgIC4uLgorfTsKK2BgYAorCit5b3UnbGwgbmVlZCB0byBjaGFuZ2UgaXQgdG86CitgYGAKKy8vIE5ldyBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCB3b3JrcyB3aXRoIHRoZSBsYXRlc3QgR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisuLi4KK2NsYXNzIE15V29uZGVyZnVsTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPE15VHlwZT4geworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oTXlUeXBlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEZvbygpID4gNTsKKyAgfQorICAuLi4KK307CitgYGAKKyhpLmUuIHJlbmFtZSBgTWF0Y2hlcygpYCB0byBgTWF0Y2hBbmRFeHBsYWluKClgIGFuZCBnaXZlIGl0IGEgc2Vjb25kCithcmd1bWVudCBvZiB0eXBlIGBNYXRjaFJlc3VsdExpc3RlbmVyKmAuKQorCitJZiB5b3Ugd2VyZSBhbHNvIHVzaW5nIGBFeHBsYWluTWF0Y2hSZXN1bHRUbygpYCB0byBpbXByb3ZlIHRoZSBtYXRjaGVyCittZXNzYWdlOgorYGBgCisvLyBPbGQgbWF0Y2hlciBkZWZpbml0aW9uIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGxhc3Rlc3QKKy8vIEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOworLi4uCitjbGFzcyBNeVdvbmRlcmZ1bE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxNeVR5cGU+IHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hlcyhNeVR5cGUgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0Rm9vKCkgPiA1OworICB9CisKKyAgdmlydHVhbCB2b2lkIEV4cGxhaW5NYXRjaFJlc3VsdFRvKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgIC8vIFByaW50cyBzb21lIGhlbHBmdWwgaW5mb3JtYXRpb24gdG8gb3MgdG8gaGVscAorICAgIC8vIGEgdXNlciB1bmRlcnN0YW5kIHdoeSB2YWx1ZSBtYXRjaGVzIChvciBkb2Vzbid0IG1hdGNoKS4KKyAgICAqb3MgPDwgInRoZSBGb28gcHJvcGVydHkgaXMgIiA8PCB2YWx1ZS5HZXRGb28oKTsKKyAgfQorICAuLi4KK307CitgYGAKKworeW91IHNob3VsZCBtb3ZlIHRoZSBsb2dpYyBvZiBgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKWAgaW50bworYE1hdGNoQW5kRXhwbGFpbigpYCwgdXNpbmcgdGhlIGBNYXRjaFJlc3VsdExpc3RlbmVyYCBhcmd1bWVudCB3aGVyZQordGhlIGA6OnN0ZDo6b3N0cmVhbWAgd2FzIHVzZWQ6CitgYGAKKy8vIE5ldyBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCB3b3JrcyB3aXRoIHRoZSBsYXRlc3QgR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisuLi4KK2NsYXNzIE15V29uZGVyZnVsTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPE15VHlwZT4geworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oTXlUeXBlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgKmxpc3RlbmVyIDw8ICJ0aGUgRm9vIHByb3BlcnR5IGlzICIgPDwgdmFsdWUuR2V0Rm9vKCk7CisgICAgcmV0dXJuIHZhbHVlLkdldEZvbygpID4gNTsKKyAgfQorICAuLi4KK307CitgYGAKKworSWYgeW91ciBtYXRjaGVyIGlzIGRlZmluZWQgdXNpbmcgYE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKWA6CitgYGAKKy8vIE9sZCBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbGF0ZXN0CisvLyBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKKy4uLgorY2xhc3MgTXlHcmVhdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIGJvb2wgTWF0Y2hlcyhNeVR5cGUgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0QmFyKCkgPCA0MjsKKyAgfQorICAuLi4KK307CisuLi4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihNeUdyZWF0TWF0Y2hlcigpKSAuLi4KK2BgYAorCit5b3Ugc2hvdWxkIHJlbmFtZSB0aGUgYE1hdGNoZXMoKWAgbWV0aG9kIHRvIGBNYXRjaEFuZEV4cGxhaW4oKWAgYW5kCithZGQgYSBgTWF0Y2hSZXN1bHRMaXN0ZW5lcipgIGFyZ3VtZW50ICh0aGUgc2FtZSBhcyB3aGF0IHlvdSBuZWVkIHRvIGRvCitmb3IgbWF0Y2hlcnMgZGVmaW5lZCBieSBpbXBsZW1lbnRpbmcgYE1hdGNoZXJJbnRlcmZhY2VgKToKK2BgYAorLy8gTmV3IG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IHdvcmtzIHdpdGggdGhlIGxhdGVzdCBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKKy4uLgorY2xhc3MgTXlHcmVhdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0QmFyKCkgPCA0MjsKKyAgfQorICAuLi4KK307CisuLi4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihNeUdyZWF0TWF0Y2hlcigpKSAuLi4KK2BgYAorCitJZiB5b3VyIHBvbHltb3JwaGljIG1hdGNoZXIgdXNlcyBgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKWAgZm9yIGJldHRlcgorZmFpbHVyZSBtZXNzYWdlczoKK2BgYAorLy8gT2xkIG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBsYXRlc3QKKy8vIEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNNYXRjaGVyOworLi4uCitjbGFzcyBNeUdyZWF0TWF0Y2hlciB7CisgcHVibGljOgorICAuLi4KKyAgYm9vbCBNYXRjaGVzKE15VHlwZSB2YWx1ZSkgY29uc3QgeworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzLgorICAgIHJldHVybiB2YWx1ZS5HZXRCYXIoKSA8IDQyOworICB9CisgIC4uLgorfTsKK3ZvaWQgRXhwbGFpbk1hdGNoUmVzdWx0VG8oY29uc3QgTXlHcmVhdE1hdGNoZXImIG1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIFByaW50cyBzb21lIGhlbHBmdWwgaW5mb3JtYXRpb24gdG8gb3MgdG8gaGVscAorICAvLyBhIHVzZXIgdW5kZXJzdGFuZCB3aHkgdmFsdWUgbWF0Y2hlcyAob3IgZG9lc24ndCBtYXRjaCkuCisgICpvcyA8PCAidGhlIEJhciBwcm9wZXJ0eSBpcyAiIDw8IHZhbHVlLkdldEJhcigpOworfQorLi4uIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTXlHcmVhdE1hdGNoZXIoKSkgLi4uCitgYGAKKworeW91J2xsIG5lZWQgdG8gbW92ZSB0aGUgbG9naWMgaW5zaWRlIGBFeHBsYWluTWF0Y2hSZXN1bHRUbygpYCB0bworYE1hdGNoQW5kRXhwbGFpbigpYDoKK2BgYAorLy8gTmV3IG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IHdvcmtzIHdpdGggdGhlIGxhdGVzdCBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKKy4uLgorY2xhc3MgTXlHcmVhdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICAqbGlzdGVuZXIgPDwgInRoZSBCYXIgcHJvcGVydHkgaXMgIiA8PCB2YWx1ZS5HZXRCYXIoKTsKKyAgICByZXR1cm4gdmFsdWUuR2V0QmFyKCkgPCA0MjsKKyAgfQorICAuLi4KK307CisuLi4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihNeUdyZWF0TWF0Y2hlcigpKSAuLi4KK2BgYAorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgeW91IGNhbiByZWFkIHRoZXNlCitbdHdvXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL1YxXzZfQ29va0Jvb2sjV3JpdGluZ19OZXdfTW9ub21vcnBoaWNfTWF0Y2hlcnMpCitbcmVjaXBlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0Nvb2tCb29rI1dyaXRpbmdfTmV3X1BvbHltb3JwaGljX01hdGNoZXJzKQorZnJvbSB0aGUgY29va2Jvb2suICBBcyBhbHdheXMsIHlvdQorYXJlIHdlbGNvbWUgdG8gcG9zdCBxdWVzdGlvbnMgb24gYGdvb2dsZW1vY2tAZ29vZ2xlZ3JvdXBzLmNvbWAgaWYgeW91CituZWVkIGFueSBoZWxwLgorCisjIyBXaGVuIHVzaW5nIEdvb2dsZSBNb2NrLCBkbyBJIGhhdmUgdG8gdXNlIEdvb2dsZSBUZXN0IGFzIHRoZSB0ZXN0aW5nIGZyYW1ld29yaz8gIEkgaGF2ZSBteSBmYXZvcml0ZSB0ZXN0aW5nIGZyYW1ld29yayBhbmQgZG9uJ3Qgd2FudCB0byBzd2l0Y2guICMjCisKK0dvb2dsZSBNb2NrIHdvcmtzIG91dCBvZiB0aGUgYm94IHdpdGggR29vZ2xlIFRlc3QuICBIb3dldmVyLCBpdCdzIGVhc3kKK3RvIGNvbmZpZ3VyZSBpdCB0byB3b3JrIHdpdGggYW55IHRlc3RpbmcgZnJhbWV3b3JrIG9mIHlvdXIgY2hvaWNlLgorW0hlcmVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfNl9Gb3JEdW1taWVzI1VzaW5nX0dvb2dsZV9Nb2NrX3dpdGhfQW55X1Rlc3RpbmdfRnJhbWV3b3JrKSBpcyBob3cuCisKKyMjIEhvdyBhbSBJIHN1cHBvc2VkIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlc2UgaG9ycmlibGUgdGVtcGxhdGUgZXJyb3JzPyAjIworCitJZiB5b3UgYXJlIGNvbmZ1c2VkIGJ5IHRoZSBjb21waWxlciBlcnJvcnMgZ2NjIHRocmV3IGF0IHlvdSwKK3RyeSBjb25zdWx0aW5nIHRoZSBfR29vZ2xlIE1vY2sgRG9jdG9yXyB0b29sIGZpcnN0LiAgV2hhdCBpdCBkb2VzIGlzIHRvCitzY2FuIHN0ZGluIGZvciBnY2MgZXJyb3IgbWVzc2FnZXMsIGFuZCBzcGl0IG91dCBkaWFnbm9zZXMgb24gdGhlCitwcm9ibGVtcyAod2UgY2FsbCB0aGVtIGRpc2Vhc2VzKSB5b3VyIGNvZGUgaGFzLgorCitUbyAiaW5zdGFsbCIsIHJ1biBjb21tYW5kOgorYGBgCithbGlhcyBnbWQ9JzxwYXRoIHRvIGdvb2dsZW1vY2s+L3NjcmlwdHMvZ21vY2tfZG9jdG9yLnB5JworYGBgCisKK1RvIHVzZSBpdCwgZG86CitgYGAKKzx5b3VyLWZhdm9yaXRlLWJ1aWxkLWNvbW1hbmQ+IDx5b3VyLXRlc3Q+IDI+JjEgfCBnbWQKK2BgYAorCitGb3IgZXhhbXBsZToKK2BgYAorbWFrZSBteV90ZXN0IDI+JjEgfCBnbWQKK2BgYAorCitPciB5b3UgY2FuIHJ1biBgZ21kYCBhbmQgY29weS1uLXBhc3RlIGdjYydzIGVycm9yIG1lc3NhZ2VzIHRvIGl0LgorCisjIyBDYW4gSSBtb2NrIGEgdmFyaWFkaWMgZnVuY3Rpb24/ICMjCisKK1lvdSBjYW5ub3QgbW9jayBhIHZhcmlhZGljIGZ1bmN0aW9uIChpLmUuIGEgZnVuY3Rpb24gdGFraW5nIGVsbGlwc2lzCisoYC4uLmApIGFyZ3VtZW50cykgZGlyZWN0bHkgaW4gR29vZ2xlIE1vY2suCisKK1RoZSBwcm9ibGVtIGlzIHRoYXQgaW4gZ2VuZXJhbCwgdGhlcmUgaXMgX25vIHdheV8gZm9yIGEgbW9jayBvYmplY3QgdG8KK2tub3cgaG93IG1hbnkgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHZhcmlhZGljIG1ldGhvZCwgYW5kIHdoYXQKK3RoZSBhcmd1bWVudHMnIHR5cGVzIGFyZS4gIE9ubHkgdGhlIF9hdXRob3Igb2YgdGhlIGJhc2UgY2xhc3NfIGtub3dzCit0aGUgcHJvdG9jb2wsIGFuZCB3ZSBjYW5ub3QgbG9vayBpbnRvIGhpcyBoZWFkLgorCitUaGVyZWZvcmUsIHRvIG1vY2sgc3VjaCBhIGZ1bmN0aW9uLCB0aGUgX3VzZXJfIG11c3QgdGVhY2ggdGhlIG1vY2sKK29iamVjdCBob3cgdG8gZmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgdGhlaXIgdHlwZXMuICBPbmUKK3dheSB0byBkbyBpdCBpcyB0byBwcm92aWRlIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uLgorCitFbGxpcHNpcyBhcmd1bWVudHMgYXJlIGluaGVyaXRlZCBmcm9tIEMgYW5kIG5vdCByZWFsbHkgYSBDKysgZmVhdHVyZS4KK1RoZXkgYXJlIHVuc2FmZSB0byB1c2UgYW5kIGRvbid0IHdvcmsgd2l0aCBhcmd1bWVudHMgdGhhdCBoYXZlCitjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMuICBUaGVyZWZvcmUgd2UgcmVjb21tZW5kIHRvIGF2b2lkIHRoZW0gaW4KK0MrKyBhcyBtdWNoIGFzIHBvc3NpYmxlLgorCisjIyBNU1ZDIGdpdmVzIG1lIHdhcm5pbmcgQzQzMDEgb3IgQzQzNzMgd2hlbiBJIGRlZmluZSBhIG1vY2sgbWV0aG9kIHdpdGggYSBjb25zdCBwYXJhbWV0ZXIuICBXaHk/ICMjCisKK0lmIHlvdSBjb21waWxlIHRoaXMgdXNpbmcgTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAwNSBTUDE6CitgYGAKK2NsYXNzIEZvbyB7CisgIC4uLgorICB2aXJ0dWFsIHZvaWQgQmFyKGNvbnN0IGludCBpKSA9IDA7Cit9OworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgIC4uLgorICBNT0NLX01FVEhPRDEoQmFyLCB2b2lkKGNvbnN0IGludCBpKSk7Cit9OworYGBgCitZb3UgbWF5IGdldCB0aGUgZm9sbG93aW5nIHdhcm5pbmc6CitgYGAKK3dhcm5pbmcgQzQzMDE6ICdNb2NrRm9vOjpCYXInOiBvdmVycmlkaW5nIHZpcnR1YWwgZnVuY3Rpb24gb25seSBkaWZmZXJzIGZyb20gJ0Zvbzo6QmFyJyBieSBjb25zdC92b2xhdGlsZSBxdWFsaWZpZXIKK2BgYAorCitUaGlzIGlzIGEgTVNWQyBidWcuICBUaGUgc2FtZSBjb2RlIGNvbXBpbGVzIGZpbmUgd2l0aCBnY2MgLGZvcgorZXhhbXBsZS4gIElmIHlvdSB1c2UgVmlzdWFsIEMrKyAyMDA4IFNQMSwgeW91IHdvdWxkIGdldCB0aGUgd2FybmluZzoKK2BgYAord2FybmluZyBDNDM3MzogJ01vY2tGb286OkJhcic6IHZpcnR1YWwgZnVuY3Rpb24gb3ZlcnJpZGVzICdGb286OkJhcicsIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciBkaWQgbm90IG92ZXJyaWRlIHdoZW4gcGFyYW1ldGVycyBvbmx5IGRpZmZlcmVkIGJ5IGNvbnN0L3ZvbGF0aWxlIHF1YWxpZmllcnMKK2BgYAorCitJbiBDKyssIGlmIHlvdSBfZGVjbGFyZV8gYSBmdW5jdGlvbiB3aXRoIGEgYGNvbnN0YCBwYXJhbWV0ZXIsIHRoZQorYGNvbnN0YCBtb2RpZmllciBpcyBfaWdub3JlZF8uICBUaGVyZWZvcmUsIHRoZSBgRm9vYCBiYXNlIGNsYXNzIGFib3ZlCitpcyBlcXVpdmFsZW50IHRvOgorYGBgCitjbGFzcyBGb28geworICAuLi4KKyAgdmlydHVhbCB2b2lkIEJhcihpbnQgaSkgPSAwOyAgLy8gaW50IG9yIGNvbnN0IGludD8gIE1ha2VzIG5vIGRpZmZlcmVuY2UuCit9OworYGBgCisKK0luIGZhY3QsIHlvdSBjYW4gX2RlY2xhcmVfIEJhcigpIHdpdGggYW4gYGludGAgcGFyYW1ldGVyLCBhbmQgX2RlZmluZV8KK2l0IHdpdGggYSBgY29uc3QgaW50YCBwYXJhbWV0ZXIuICBUaGUgY29tcGlsZXIgd2lsbCBzdGlsbCBtYXRjaCB0aGVtCit1cC4KKworU2luY2UgbWFraW5nIGEgcGFyYW1ldGVyIGBjb25zdGAgaXMgbWVhbmluZ2xlc3MgaW4gdGhlIG1ldGhvZAorX2RlY2xhcmF0aW9uXywgd2UgcmVjb21tZW5kIHRvIHJlbW92ZSBpdCBpbiBib3RoIGBGb29gIGFuZCBgTW9ja0Zvb2AuCitUaGF0IHNob3VsZCB3b3JrYXJvdW5kIHRoZSBWQyBidWcuCisKK05vdGUgdGhhdCB3ZSBhcmUgdGFsa2luZyBhYm91dCB0aGUgX3RvcC1sZXZlbF8gYGNvbnN0YCBtb2RpZmllciBoZXJlLgorSWYgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciBvciByZWZlcmVuY2UsIGRlY2xhcmluZwordGhlIF9wb2ludGVlXyBvciBfcmVmZXJlZV8gYXMgYGNvbnN0YCBpcyBzdGlsbCBtZWFuaW5nZnVsLiAgRm9yCitleGFtcGxlLCB0aGUgZm9sbG93aW5nIHR3byBkZWNsYXJhdGlvbnMgYXJlIF9ub3RfIGVxdWl2YWxlbnQ6CitgYGAKK3ZvaWQgQmFyKGludCogcCk7ICAgICAgICAvLyBOZWl0aGVyIHAgbm9yICpwIGlzIGNvbnN0Lgordm9pZCBCYXIoY29uc3QgaW50KiBwKTsgIC8vIHAgaXMgbm90IGNvbnN0LCBidXQgKnAgaXMuCitgYGAKKworIyMgSSBoYXZlIGEgaHVnZSBtb2NrIGNsYXNzLCBhbmQgTWljcm9zb2Z0IFZpc3VhbCBDKysgcnVucyBvdXQgb2YgbWVtb3J5IHdoZW4gY29tcGlsaW5nIGl0LiAgV2hhdCBjYW4gSSBkbz8gIyMKKworV2UndmUgbm90aWNlZCB0aGF0IHdoZW4gdGhlIGAvY2xyYCBjb21waWxlciBmbGFnIGlzIHVzZWQsIFZpc3VhbCBDKysKK3VzZXMgNX42IHRpbWVzIGFzIG11Y2ggbWVtb3J5IHdoZW4gY29tcGlsaW5nIGEgbW9jayBjbGFzcy4gIFdlIHN1Z2dlc3QKK3RvIGF2b2lkIGAvY2xyYCB3aGVuIGNvbXBpbGluZyBuYXRpdmUgQysrIG1vY2tzLgorCisjIyBJIGNhbid0IGZpZ3VyZSBvdXQgd2h5IEdvb2dsZSBNb2NrIHRoaW5rcyBteSBleHBlY3RhdGlvbnMgYXJlIG5vdCBzYXRpc2ZpZWQuICBXaGF0IHNob3VsZCBJIGRvPyAjIworCitZb3UgbWlnaHQgd2FudCB0byBydW4geW91ciB0ZXN0IHdpdGgKK2AtLWdtb2NrX3ZlcmJvc2U9aW5mb2AuICBUaGlzIGZsYWcgbGV0cyBHb29nbGUgTW9jayBwcmludCBhIHRyYWNlCitvZiBldmVyeSBtb2NrIGZ1bmN0aW9uIGNhbGwgaXQgcmVjZWl2ZXMuICBCeSBzdHVkeWluZyB0aGUgdHJhY2UsCit5b3UnbGwgZ2FpbiBpbnNpZ2h0cyBvbiB3aHkgdGhlIGV4cGVjdGF0aW9ucyB5b3Ugc2V0IGFyZSBub3QgbWV0LgorCisjIyBIb3cgY2FuIEkgYXNzZXJ0IHRoYXQgYSBmdW5jdGlvbiBpcyBORVZFUiBjYWxsZWQ/ICMjCisKK2BgYAorRVhQRUNUX0NBTEwoZm9vLCBCYXIoXykpCisgICAgLlRpbWVzKDApOworYGBgCisKKyMjIEkgaGF2ZSBhIGZhaWxlZCB0ZXN0IHdoZXJlIEdvb2dsZSBNb2NrIHRlbGxzIG1lIFRXSUNFIHRoYXQgYSBwYXJ0aWN1bGFyIGV4cGVjdGF0aW9uIGlzIG5vdCBzYXRpc2ZpZWQuICBJc24ndCB0aGlzIHJlZHVuZGFudD8gIyMKKworV2hlbiBHb29nbGUgTW9jayBkZXRlY3RzIGEgZmFpbHVyZSwgaXQgcHJpbnRzIHJlbGV2YW50IGluZm9ybWF0aW9uCisodGhlIG1vY2sgZnVuY3Rpb24gYXJndW1lbnRzLCB0aGUgc3RhdGUgb2YgcmVsZXZhbnQgZXhwZWN0YXRpb25zLCBhbmQKK2V0YykgdG8gaGVscCB0aGUgdXNlciBkZWJ1Zy4gIElmIGFub3RoZXIgZmFpbHVyZSBpcyBkZXRlY3RlZCwgR29vZ2xlCitNb2NrIHdpbGwgZG8gdGhlIHNhbWUsIGluY2x1ZGluZyBwcmludGluZyB0aGUgc3RhdGUgb2YgcmVsZXZhbnQKK2V4cGVjdGF0aW9ucy4KKworU29tZXRpbWVzIGFuIGV4cGVjdGF0aW9uJ3Mgc3RhdGUgZGlkbid0IGNoYW5nZSBiZXR3ZWVuIHR3byBmYWlsdXJlcywKK2FuZCB5b3UnbGwgc2VlIHRoZSBzYW1lIGRlc2NyaXB0aW9uIG9mIHRoZSBzdGF0ZSB0d2ljZS4gIFRoZXkgYXJlCitob3dldmVyIF9ub3RfIHJlZHVuZGFudCwgYXMgdGhleSByZWZlciB0byBfZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lXy4KK1RoZSBmYWN0IHRoZXkgYXJlIHRoZSBzYW1lIF9pc18gaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24uCisKKyMjIEkgZ2V0IGEgaGVhcCBjaGVjayBmYWlsdXJlIHdoZW4gdXNpbmcgYSBtb2NrIG9iamVjdCwgYnV0IHVzaW5nIGEgcmVhbCBvYmplY3QgaXMgZmluZS4gIFdoYXQgY2FuIGJlIHdyb25nPyAjIworCitEb2VzIHRoZSBjbGFzcyAoaG9wZWZ1bGx5IGEgcHVyZSBpbnRlcmZhY2UpIHlvdSBhcmUgbW9ja2luZyBoYXZlIGEKK3ZpcnR1YWwgZGVzdHJ1Y3Rvcj8KKworV2hlbmV2ZXIgeW91IGRlcml2ZSBmcm9tIGEgYmFzZSBjbGFzcywgbWFrZSBzdXJlIGl0cyBkZXN0cnVjdG9yIGlzCit2aXJ0dWFsLiAgT3RoZXJ3aXNlIEJhZCBUaGluZ3Mgd2lsbCBoYXBwZW4uICBDb25zaWRlciB0aGUgZm9sbG93aW5nCitjb2RlOgorCitgYGAKK2NsYXNzIEJhc2UgeworIHB1YmxpYzoKKyAgLy8gTm90IHZpcnR1YWwsIGJ1dCBzaG91bGQgYmUuCisgIH5CYXNlKCkgeyAuLi4gfQorICAuLi4KK307CisKK2NsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CisgcHVibGljOgorICAuLi4KKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyB2YWx1ZV87Cit9OworCisuLi4KKyAgQmFzZSogcCA9IG5ldyBEZXJpdmVkOworICAuLi4KKyAgZGVsZXRlIHA7ICAvLyBTdXJwcmlzZSEgfkJhc2UoKSB3aWxsIGJlIGNhbGxlZCwgYnV0IH5EZXJpdmVkKCkgd2lsbCBub3QKKyAgICAgICAgICAgICAvLyAtIHZhbHVlXyBpcyBsZWFrZWQuCitgYGAKKworQnkgY2hhbmdpbmcgYH5CYXNlKClgIHRvIHZpcnR1YWwsIGB+RGVyaXZlZCgpYCB3aWxsIGJlIGNvcnJlY3RseQorY2FsbGVkIHdoZW4gYGRlbGV0ZSBwYCBpcyBleGVjdXRlZCwgYW5kIHRoZSBoZWFwIGNoZWNrZXIKK3dpbGwgYmUgaGFwcHkuCisKKyMjIFRoZSAibmV3ZXIgZXhwZWN0YXRpb25zIG92ZXJyaWRlIG9sZGVyIG9uZXMiIHJ1bGUgbWFrZXMgd3JpdGluZyBleHBlY3RhdGlvbnMgYXdrd2FyZC4gIFdoeSBkb2VzIEdvb2dsZSBNb2NrIGRvIHRoYXQ/ICMjCisKK1doZW4gcGVvcGxlIGNvbXBsYWluIGFib3V0IHRoaXMsIG9mdGVuIHRoZXkgYXJlIHJlZmVycmluZyB0byBjb2RlIGxpa2U6CisKK2BgYAorLy8gZm9vLkJhcigpIHNob3VsZCBiZSBjYWxsZWQgdHdpY2UsIHJldHVybiAxIHRoZSBmaXJzdCB0aW1lLCBhbmQgcmV0dXJuCisvLyAyIHRoZSBzZWNvbmQgdGltZS4gIEhvd2V2ZXIsIEkgaGF2ZSB0byB3cml0ZSB0aGUgZXhwZWN0YXRpb25zIGluIHRoZQorLy8gcmV2ZXJzZSBvcmRlci4gIFRoaXMgc3Vja3MgYmlnIHRpbWUhISEKK0VYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgLldpbGxPbmNlKFJldHVybigyKSkKKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CitgYGAKKworVGhlIHByb2JsZW0gaXMgdGhhdCB0aGV5IGRpZG4ndCBwaWNrIHRoZSAqKmJlc3QqKiB3YXkgdG8gZXhwcmVzcyB0aGUgdGVzdCdzCitpbnRlbnQuCisKK0J5IGRlZmF1bHQsIGV4cGVjdGF0aW9ucyBkb24ndCBoYXZlIHRvIGJlIG1hdGNoZWQgaW4gX2FueV8gcGFydGljdWxhcgorb3JkZXIuICBJZiB5b3Ugd2FudCB0aGVtIHRvIG1hdGNoIGluIGEgY2VydGFpbiBvcmRlciwgeW91IG5lZWQgdG8gYmUKK2V4cGxpY2l0LiAgVGhpcyBpcyBHb29nbGUgTW9jaydzIChhbmQgak1vY2sncykgZnVuZGFtZW50YWwgcGhpbG9zb3BoeTogaXQncworZWFzeSB0byBhY2NpZGVudGFsbHkgb3Zlci1zcGVjaWZ5IHlvdXIgdGVzdHMsIGFuZCB3ZSB3YW50IHRvIG1ha2UgaXQKK2hhcmRlciB0byBkbyBzby4KKworVGhlcmUgYXJlIHR3byBiZXR0ZXIgd2F5cyB0byB3cml0ZSB0aGUgdGVzdCBzcGVjLiAgWW91IGNvdWxkIGVpdGhlcgorcHV0IHRoZSBleHBlY3RhdGlvbnMgaW4gc2VxdWVuY2U6CisKK2BgYAorLy8gZm9vLkJhcigpIHNob3VsZCBiZSBjYWxsZWQgdHdpY2UsIHJldHVybiAxIHRoZSBmaXJzdCB0aW1lLCBhbmQgcmV0dXJuCisvLyAyIHRoZSBzZWNvbmQgdGltZS4gIFVzaW5nIGEgc2VxdWVuY2UsIHdlIGNhbiB3cml0ZSB0aGUgZXhwZWN0YXRpb25zCisvLyBpbiB0aGVpciBuYXR1cmFsIG9yZGVyLgoreworICBJblNlcXVlbmNlIHM7CisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworfQorYGBgCisKK29yIHlvdSBjYW4gcHV0IHRoZSBzZXF1ZW5jZSBvZiBhY3Rpb25zIGluIHRoZSBzYW1lIGV4cGVjdGF0aW9uOgorCitgYGAKKy8vIGZvby5CYXIoKSBzaG91bGQgYmUgY2FsbGVkIHR3aWNlLCByZXR1cm4gMSB0aGUgZmlyc3QgdGltZSwgYW5kIHJldHVybgorLy8gMiB0aGUgc2Vjb25kIHRpbWUuCitFWFBFQ1RfQ0FMTChmb28sIEJhcigpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCisgICAgLldpbGxPbmNlKFJldHVybigyKSkKKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworYGBgCisKK0JhY2sgdG8gdGhlIG9yaWdpbmFsIHF1ZXN0aW9uczogd2h5IGRvZXMgR29vZ2xlIE1vY2sgc2VhcmNoIHRoZQorZXhwZWN0YXRpb25zIChhbmQgYE9OX0NBTExgcykgZnJvbSBiYWNrIHRvIGZyb250PyAgQmVjYXVzZSB0aGlzCithbGxvd3MgYSB1c2VyIHRvIHNldCB1cCBhIG1vY2sncyBiZWhhdmlvciBmb3IgdGhlIGNvbW1vbiBjYXNlIGVhcmx5CisoZS5nLiBpbiB0aGUgbW9jaydzIGNvbnN0cnVjdG9yIG9yIHRoZSB0ZXN0IGZpeHR1cmUncyBzZXQtdXAgcGhhc2UpCithbmQgY3VzdG9taXplIGl0IHdpdGggbW9yZSBzcGVjaWZpYyBydWxlcyBsYXRlci4gIElmIEdvb2dsZSBNb2NrCitzZWFyY2hlcyBmcm9tIGZyb250IHRvIGJhY2ssIHRoaXMgdmVyeSB1c2VmdWwgcGF0dGVybiB3b24ndCBiZQorcG9zc2libGUuCisKKyMjIEdvb2dsZSBNb2NrIHByaW50cyBhIHdhcm5pbmcgd2hlbiBhIGZ1bmN0aW9uIHdpdGhvdXQgRVhQRUNUXF9DQUxMIGlzIGNhbGxlZCwgZXZlbiBpZiBJIGhhdmUgc2V0IGl0cyBiZWhhdmlvciB1c2luZyBPTlxfQ0FMTC4gIFdvdWxkIGl0IGJlIHJlYXNvbmFibGUgbm90IHRvIHNob3cgdGhlIHdhcm5pbmcgaW4gdGhpcyBjYXNlPyAjIworCitXaGVuIGNob29zaW5nIGJldHdlZW4gYmVpbmcgbmVhdCBhbmQgYmVpbmcgc2FmZSwgd2UgbGVhbiB0b3dhcmQgdGhlCitsYXR0ZXIuICBTbyB0aGUgYW5zd2VyIGlzIHRoYXQgd2UgdGhpbmsgaXQncyBiZXR0ZXIgdG8gc2hvdyB0aGUKK3dhcm5pbmcuCisKK09mdGVuIHBlb3BsZSB3cml0ZSBgT05fQ0FMTGBzIGluIHRoZSBtb2NrIG9iamVjdCdzCitjb25zdHJ1Y3RvciBvciBgU2V0VXAoKWAsIGFzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHJhcmVseSBjaGFuZ2VzIGZyb20KK3Rlc3QgdG8gdGVzdC4gIFRoZW4gaW4gdGhlIHRlc3QgYm9keSB0aGV5IHNldCB0aGUgZXhwZWN0YXRpb25zLCB3aGljaAorYXJlIG9mdGVuIGRpZmZlcmVudCBmb3IgZWFjaCB0ZXN0LiAgSGF2aW5nIGFuIGBPTl9DQUxMYCBpbiB0aGUgc2V0LXVwCitwYXJ0IG9mIGEgdGVzdCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgY2FsbHMgYXJlIGV4cGVjdGVkLiAgSWYgdGhlcmUncworbm8gYEVYUEVDVF9DQUxMYCBhbmQgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIGl0J3MgcG9zc2libHkgYW4gZXJyb3IuICBJZgord2UgcXVpZXRseSBsZXQgdGhlIGNhbGwgZ28gdGhyb3VnaCB3aXRob3V0IG5vdGlmeWluZyB0aGUgdXNlciwgYnVncworbWF5IGNyZWVwIGluIHVubm90aWNlZC4KKworSWYsIGhvd2V2ZXIsIHlvdSBhcmUgc3VyZSB0aGF0IHRoZSBjYWxscyBhcmUgT0ssIHlvdSBjYW4gd3JpdGUKKworYGBgCitFWFBFQ1RfQ0FMTChmb28sIEJhcihfKSkKKyAgICAuV2lsbFJlcGVhdGVkbHkoLi4uKTsKK2BgYAorCitpbnN0ZWFkIG9mCisKK2BgYAorT05fQ0FMTChmb28sIEJhcihfKSkKKyAgICAuV2lsbEJ5RGVmYXVsdCguLi4pOworYGBgCisKK1RoaXMgdGVsbHMgR29vZ2xlIE1vY2sgdGhhdCB5b3UgZG8gZXhwZWN0IHRoZSBjYWxscyBhbmQgbm8gd2FybmluZyBzaG91bGQgYmUKK3ByaW50ZWQuCisKK0Fsc28sIHlvdSBjYW4gY29udHJvbCB0aGUgdmVyYm9zaXR5IHVzaW5nIHRoZSBgLS1nbW9ja192ZXJib3NlYCBmbGFnLgorSWYgeW91IGZpbmQgdGhlIG91dHB1dCB0b28gbm9pc3kgd2hlbiBkZWJ1Z2dpbmcsIGp1c3QgY2hvb3NlIGEgbGVzcwordmVyYm9zZSBsZXZlbC4KKworIyMgSG93IGNhbiBJIGRlbGV0ZSB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50IGluIGFuIGFjdGlvbj8gIyMKKworSWYgeW91IGZpbmQgeW91cnNlbGYgbmVlZGluZyB0byBwZXJmb3JtIHNvbWUgYWN0aW9uIHRoYXQncyBub3QKK3N1cHBvcnRlZCBieSBHb29nbGUgTW9jayBkaXJlY3RseSwgcmVtZW1iZXIgdGhhdCB5b3UgY2FuIGRlZmluZSB5b3VyIG93bgorYWN0aW9ucyB1c2luZworW01ha2VBY3Rpb24oKV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0Nvb2tCb29rI1dyaXRpbmdfTmV3X0FjdGlvbnMpIG9yCitbTWFrZVBvbHltb3JwaGljQWN0aW9uKCldKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfNl9Db29rQm9vayNXcml0aW5nX05ld19Qb2x5bW9ycGhpY19BY3Rpb25zKSwKK29yIHlvdSBjYW4gd3JpdGUgYSBzdHViIGZ1bmN0aW9uIGFuZCBpbnZva2UgaXQgdXNpbmcKK1tJbnZva2UoKV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0Nvb2tCb29rI1VzaW5nX0Z1bmN0aW9uc19NZXRob2RzX0Z1bmN0b3JzKS4KKworIyMgTU9DS1xfTUVUSE9EbigpJ3Mgc2Vjb25kIGFyZ3VtZW50IGxvb2tzIGZ1bm55LiAgV2h5IGRvbid0IHlvdSB1c2UgdGhlIE1PQ0tcX01FVEhPRG4oTWV0aG9kLCByZXR1cm5cX3R5cGUsIGFyZ1xfMSwgLi4uLCBhcmdcX24pIHN5bnRheD8gIyMKKworV2hhdD8hICBJIHRoaW5rIGl0J3MgYmVhdXRpZnVsLiA6LSkKKworV2hpbGUgd2hpY2ggc3ludGF4IGxvb2tzIG1vcmUgbmF0dXJhbCBpcyBhIHN1YmplY3RpdmUgbWF0dGVyIHRvIHNvbWUKK2V4dGVudCwgR29vZ2xlIE1vY2sncyBzeW50YXggd2FzIGNob3NlbiBmb3Igc2V2ZXJhbCBwcmFjdGljYWwgYWR2YW50YWdlcyBpdAoraGFzLgorCitUcnkgdG8gbW9jayBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBtYXAgYXMgYW4gYXJndW1lbnQ6CitgYGAKK3ZpcnR1YWwgaW50IEdldFNpemUoY29uc3QgbWFwPGludCwgc3RkOjpzdHJpbmc+JiBtKTsKK2BgYAorCitVc2luZyB0aGUgcHJvcG9zZWQgc3ludGF4LCBpdCB3b3VsZCBiZToKK2BgYAorTU9DS19NRVRIT0QxKEdldFNpemUsIGludCwgY29uc3QgbWFwPGludCwgc3RkOjpzdHJpbmc+JiBtKTsKK2BgYAorCitHdWVzcyB3aGF0PyAgWW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGFzIHRoZSBjb21waWxlciB0aGlua3MgdGhhdAorYGNvbnN0IG1hcDxpbnQsIHN0ZDo6c3RyaW5nPiYgbWAgYXJlICoqdHdvKiosIG5vdCBvbmUsIGFyZ3VtZW50cy4gVG8gd29yaworYXJvdW5kIHRoaXMgeW91IGNhbiB1c2UgYHR5cGVkZWZgIHRvIGdpdmUgdGhlIG1hcCB0eXBlIGEgbmFtZSwgYnV0Cit0aGF0IGdldHMgaW4gdGhlIHdheSBvZiB5b3VyIHdvcmsuICBHb29nbGUgTW9jaydzIHN5bnRheCBhdm9pZHMgdGhpcworcHJvYmxlbSBhcyB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudCB0eXBlcyBhcmUgcHJvdGVjdGVkIGluc2lkZSBhIHBhaXIKK29mIHBhcmVudGhlc2VzOgorYGBgCisvLyBUaGlzIGNvbXBpbGVzIGZpbmUuCitNT0NLX01FVEhPRDEoR2V0U2l6ZSwgaW50KGNvbnN0IG1hcDxpbnQsIHN0ZDo6c3RyaW5nPiYgbSkpOworYGBgCisKK1lvdSBzdGlsbCBuZWVkIGEgYHR5cGVkZWZgIGlmIHRoZSByZXR1cm4gdHlwZSBjb250YWlucyBhbiB1bnByb3RlY3RlZAorY29tbWEsIGJ1dCB0aGF0J3MgbXVjaCByYXJlci4KKworT3RoZXIgYWR2YW50YWdlcyBpbmNsdWRlOgorICAxLiBgTU9DS19NRVRIT0QxKEZvbywgaW50LCBib29sKWAgY2FuIGxlYXZlIGEgcmVhZGVyIHdvbmRlciB3aGV0aGVyIHRoZSBtZXRob2QgcmV0dXJucyBgaW50YCBvciBgYm9vbGAsIHdoaWxlIHRoZXJlIHdvbid0IGJlIHN1Y2ggY29uZnVzaW9uIHVzaW5nIEdvb2dsZSBNb2NrJ3Mgc3ludGF4LgorICAxLiBUaGUgd2F5IEdvb2dsZSBNb2NrIGRlc2NyaWJlcyBhIGZ1bmN0aW9uIHR5cGUgaXMgbm90aGluZyBuZXcsIGFsdGhvdWdoIG1hbnkgcGVvcGxlIG1heSBub3QgYmUgZmFtaWxpYXIgd2l0aCBpdC4gIFRoZSBzYW1lIHN5bnRheCB3YXMgdXNlZCBpbiBDLCBhbmQgdGhlIGBmdW5jdGlvbmAgbGlicmFyeSBpbiBgdHIxYCB1c2VzIHRoaXMgc3ludGF4IGV4dGVuc2l2ZWx5LiAgU2luY2UgYHRyMWAgd2lsbCBiZWNvbWUgYSBwYXJ0IG9mIHRoZSBuZXcgdmVyc2lvbiBvZiBTVEwsIHdlIGZlZWwgdmVyeSBjb21mb3J0YWJsZSB0byBiZSBjb25zaXN0ZW50IHdpdGggaXQuCisgIDEuIFRoZSBmdW5jdGlvbiB0eXBlIHN5bnRheCBpcyBhbHNvIHVzZWQgaW4gb3RoZXIgcGFydHMgb2YgR29vZ2xlIE1vY2sncyBBUEkgKGUuZy4gdGhlIGFjdGlvbiBpbnRlcmZhY2UpIGluIG9yZGVyIHRvIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIHRyYWN0YWJsZS4gQSB1c2VyIG5lZWRzIHRvIGxlYXJuIGl0IGFueXdheSBpbiBvcmRlciB0byB1dGlsaXplIEdvb2dsZSBNb2NrJ3MgbW9yZSBhZHZhbmNlZCBmZWF0dXJlcy4gIFdlJ2QgYXMgd2VsbCBzdGljayB0byB0aGUgc2FtZSBzeW50YXggaW4gYE1PQ0tfTUVUSE9EKmAhCisKKyMjIE15IGNvZGUgY2FsbHMgYSBzdGF0aWMvZ2xvYmFsIGZ1bmN0aW9uLiAgQ2FuIEkgbW9jayBpdD8gIyMKKworWW91IGNhbiwgYnV0IHlvdSBuZWVkIHRvIG1ha2Ugc29tZSBjaGFuZ2VzLgorCitJbiBnZW5lcmFsLCBpZiB5b3UgZmluZCB5b3Vyc2VsZiBuZWVkaW5nIHRvIG1vY2sgYSBzdGF0aWMgZnVuY3Rpb24sCitpdCdzIGEgc2lnbiB0aGF0IHlvdXIgbW9kdWxlcyBhcmUgdG9vIHRpZ2h0bHkgY291cGxlZCAoYW5kIGxlc3MKK2ZsZXhpYmxlLCBsZXNzIHJldXNhYmxlLCBsZXNzIHRlc3RhYmxlLCBldGMpLiAgWW91IGFyZSBwcm9iYWJseSBiZXR0ZXIKK29mZiBkZWZpbmluZyBhIHNtYWxsIGludGVyZmFjZSBhbmQgY2FsbCB0aGUgZnVuY3Rpb24gdGhyb3VnaCB0aGF0CitpbnRlcmZhY2UsIHdoaWNoIHRoZW4gY2FuIGJlIGVhc2lseSBtb2NrZWQuICBJdCdzIGEgYml0IG9mIHdvcmsKK2luaXRpYWxseSwgYnV0IHVzdWFsbHkgcGF5cyBmb3IgaXRzZWxmIHF1aWNrbHkuCisKK1RoaXMgR29vZ2xlIFRlc3RpbmcgQmxvZworW3Bvc3RdKGh0dHA6Ly9nb29nbGV0ZXN0aW5nLmJsb2dzcG90LmNvbS8yMDA4LzA2L2RlZmVhdC1zdGF0aWMtY2xpbmcuaHRtbCkKK3NheXMgaXQgZXhjZWxsZW50bHkuICBDaGVjayBpdCBvdXQuCisKKyMjIE15IG1vY2sgb2JqZWN0IG5lZWRzIHRvIGRvIGNvbXBsZXggc3R1ZmYuICBJdCdzIGEgbG90IG9mIHBhaW4gdG8gc3BlY2lmeSB0aGUgYWN0aW9ucy4gIEdvb2dsZSBNb2NrIHN1Y2tzISAjIworCitJIGtub3cgaXQncyBub3QgYSBxdWVzdGlvbiwgYnV0IHlvdSBnZXQgYW4gYW5zd2VyIGZvciBmcmVlIGFueSB3YXkuIDotKQorCitXaXRoIEdvb2dsZSBNb2NrLCB5b3UgY2FuIGNyZWF0ZSBtb2NrcyBpbiBDKysgZWFzaWx5LiAgQW5kIHBlb3BsZSBtaWdodCBiZQordGVtcHRlZCB0byB1c2UgdGhlbSBldmVyeXdoZXJlLiBTb21ldGltZXMgdGhleSB3b3JrIGdyZWF0LCBhbmQKK3NvbWV0aW1lcyB5b3UgbWF5IGZpbmQgdGhlbSwgd2VsbCwgYSBwYWluIHRvIHVzZS4gU28sIHdoYXQncyB3cm9uZyBpbgordGhlIGxhdHRlciBjYXNlPworCitXaGVuIHlvdSB3cml0ZSBhIHRlc3Qgd2l0aG91dCB1c2luZyBtb2NrcywgeW91IGV4ZXJjaXNlIHRoZSBjb2RlIGFuZAorYXNzZXJ0IHRoYXQgaXQgcmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZSBvciB0aGF0IHRoZSBzeXN0ZW0gaXMgaW4gYW4KK2V4cGVjdGVkIHN0YXRlLiAgVGhpcyBpcyBzb21ldGltZXMgY2FsbGVkICJzdGF0ZS1iYXNlZCB0ZXN0aW5nIi4KKworTW9ja3MgYXJlIGdyZWF0IGZvciB3aGF0IHNvbWUgY2FsbCAiaW50ZXJhY3Rpb24tYmFzZWQiIHRlc3Rpbmc6CitpbnN0ZWFkIG9mIGNoZWNraW5nIHRoZSBzeXN0ZW0gc3RhdGUgYXQgdGhlIHZlcnkgZW5kLCBtb2NrIG9iamVjdHMKK3ZlcmlmeSB0aGF0IHRoZXkgYXJlIGludm9rZWQgdGhlIHJpZ2h0IHdheSBhbmQgcmVwb3J0IGFuIGVycm9yIGFzIHNvb24KK2FzIGl0IGFyaXNlcywgZ2l2aW5nIHlvdSBhIGhhbmRsZSBvbiB0aGUgcHJlY2lzZSBjb250ZXh0IGluIHdoaWNoIHRoZQorZXJyb3Igd2FzIHRyaWdnZXJlZC4gIFRoaXMgaXMgb2Z0ZW4gbW9yZSBlZmZlY3RpdmUgYW5kIGVjb25vbWljYWwgdG8KK2RvIHRoYW4gc3RhdGUtYmFzZWQgdGVzdGluZy4KKworSWYgeW91IGFyZSBkb2luZyBzdGF0ZS1iYXNlZCB0ZXN0aW5nIGFuZCB1c2luZyBhIHRlc3QgZG91YmxlIGp1c3QgdG8KK3NpbXVsYXRlIHRoZSByZWFsIG9iamVjdCwgeW91IGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIGEgZmFrZS4KK1VzaW5nIGEgbW9jayBpbiB0aGlzIGNhc2UgY2F1c2VzIHBhaW4sIGFzIGl0J3Mgbm90IGEgc3Ryb25nIHBvaW50IGZvcgorbW9ja3MgdG8gcGVyZm9ybSBjb21wbGV4IGFjdGlvbnMuICBJZiB5b3UgZXhwZXJpZW5jZSB0aGlzIGFuZCB0aGluawordGhhdCBtb2NrcyBzdWNrLCB5b3UgYXJlIGp1c3Qgbm90IHVzaW5nIHRoZSByaWdodCB0b29sIGZvciB5b3VyCitwcm9ibGVtLiBPciwgeW91IG1pZ2h0IGJlIHRyeWluZyB0byBzb2x2ZSB0aGUgd3JvbmcgcHJvYmxlbS4gOi0pCisKKyMjIEkgZ290IGEgd2FybmluZyAiVW5pbnRlcmVzdGluZyBmdW5jdGlvbiBjYWxsIGVuY291bnRlcmVkIC0gZGVmYXVsdCBhY3Rpb24gdGFrZW4uLiIgIFNob3VsZCBJIHBhbmljPyAjIworCitCeSBhbGwgbWVhbnMsIE5PISAgSXQncyBqdXN0IGFuIEZZSS4KKworV2hhdCBpdCBtZWFucyBpcyB0aGF0IHlvdSBoYXZlIGEgbW9jayBmdW5jdGlvbiwgeW91IGhhdmVuJ3Qgc2V0IGFueQorZXhwZWN0YXRpb25zIG9uIGl0IChieSBHb29nbGUgTW9jaydzIHJ1bGUgdGhpcyBtZWFucyB0aGF0IHlvdSBhcmUgbm90CitpbnRlcmVzdGVkIGluIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gYW5kIHRoZXJlZm9yZSBpdCBjYW4gYmUgY2FsbGVkCithbnkgbnVtYmVyIG9mIHRpbWVzKSwgYW5kIGl0IGlzIGNhbGxlZC4gIFRoYXQncyBPSyAtIHlvdSBkaWRuJ3Qgc2F5CitpdCdzIG5vdCBPSyB0byBjYWxsIHRoZSBmdW5jdGlvbiEKKworV2hhdCBpZiB5b3UgYWN0dWFsbHkgbWVhbnQgdG8gZGlzYWxsb3cgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQsIGJ1dAorZm9yZ290IHRvIHdyaXRlIGBFWFBFQ1RfQ0FMTChmb28sIEJhcigpKS5UaW1lcygwKWA/ICBXaGlsZQorb25lIGNhbiBhcmd1ZSB0aGF0IGl0J3MgdGhlIHVzZXIncyBmYXVsdCwgR29vZ2xlIE1vY2sgdHJpZXMgdG8gYmUgbmljZSBhbmQKK3ByaW50cyB5b3UgYSBub3RlLgorCitTbywgd2hlbiB5b3Ugc2VlIHRoZSBtZXNzYWdlIGFuZCBiZWxpZXZlIHRoYXQgdGhlcmUgc2hvdWxkbid0IGJlIGFueQordW5pbnRlcmVzdGluZyBjYWxscywgeW91IHNob3VsZCBpbnZlc3RpZ2F0ZSB3aGF0J3MgZ29pbmcgb24uICBUbyBtYWtlCit5b3VyIGxpZmUgZWFzaWVyLCBHb29nbGUgTW9jayBwcmludHMgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIGFyZ3VtZW50cword2hlbiBhbiB1bmludGVyZXN0aW5nIGNhbGwgaXMgZW5jb3VudGVyZWQuCisKKyMjIEkgd2FudCB0byBkZWZpbmUgYSBjdXN0b20gYWN0aW9uLiAgU2hvdWxkIEkgdXNlIEludm9rZSgpIG9yIGltcGxlbWVudCB0aGUgYWN0aW9uIGludGVyZmFjZT8gIyMKKworRWl0aGVyIHdheSBpcyBmaW5lIC0geW91IHdhbnQgdG8gY2hvb3NlIHRoZSBvbmUgdGhhdCdzIG1vcmUgY29udmVuaWVudAorZm9yIHlvdXIgY2lyY3Vtc3RhbmNlLgorCitVc3VhbGx5LCBpZiB5b3VyIGFjdGlvbiBpcyBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHR5cGUsIGRlZmluaW5nIGl0Cit1c2luZyBgSW52b2tlKClgIHNob3VsZCBiZSBlYXNpZXI7IGlmIHlvdXIgYWN0aW9uIGNhbiBiZSB1c2VkIGluCitmdW5jdGlvbnMgb2YgZGlmZmVyZW50IHR5cGVzIChlLmcuIGlmIHlvdSBhcmUgZGVmaW5pbmcKK2BSZXR1cm4odmFsdWUpYCksIGBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKWAgaXMKK2Vhc2llc3QuICBTb21ldGltZXMgeW91IHdhbnQgcHJlY2lzZSBjb250cm9sIG9uIHdoYXQgdHlwZXMgb2YKK2Z1bmN0aW9ucyB0aGUgYWN0aW9uIGNhbiBiZSB1c2VkIGluLCBhbmQgaW1wbGVtZW50aW5nCitgQWN0aW9uSW50ZXJmYWNlYCBpcyB0aGUgd2F5IHRvIGdvIGhlcmUuIFNlZSB0aGUgaW1wbGVtZW50YXRpb24gb2YKK2BSZXR1cm4oKWAgaW4gYGluY2x1ZGUvZ21vY2svZ21vY2stYWN0aW9ucy5oYCBmb3IgYW4gZXhhbXBsZS4KKworIyMgSSdtIHVzaW5nIHRoZSBzZXQtYXJndW1lbnQtcG9pbnRlZSBhY3Rpb24sIGFuZCB0aGUgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0ICJjb25mbGljdGluZyByZXR1cm4gdHlwZSBzcGVjaWZpZWQiLiAgV2hhdCBkb2VzIGl0IG1lYW4/ICMjCisKK1lvdSBnb3QgdGhpcyBlcnJvciBhcyBHb29nbGUgTW9jayBoYXMgbm8gaWRlYSB3aGF0IHZhbHVlIGl0IHNob3VsZCByZXR1cm4KK3doZW4gdGhlIG1vY2sgbWV0aG9kIGlzIGNhbGxlZC4gIGBTZXRBcmdQb2ludGVlKClgIHNheXMgd2hhdCB0aGUKK3NpZGUgZWZmZWN0IGlzLCBidXQgZG9lc24ndCBzYXkgd2hhdCB0aGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZS4gIFlvdQorbmVlZCBgRG9BbGwoKWAgdG8gY2hhaW4gYSBgU2V0QXJnUG9pbnRlZSgpYCB3aXRoIGEgYFJldHVybigpYC4KKworU2VlIHRoaXMgW3JlY2lwZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV82X0Nvb2tCb29rI01vY2tpbmdfU2lkZV9FZmZlY3RzKSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBhbiBleGFtcGxlLgorCisKKyMjIE15IHF1ZXN0aW9uIGlzIG5vdCBpbiB5b3VyIEZBUSEgIyMKKworSWYgeW91IGNhbm5vdCBmaW5kIHRoZSBhbnN3ZXIgdG8geW91ciBxdWVzdGlvbiBpbiB0aGlzIEZBUSwgdGhlcmUgYXJlCitzb21lIG90aGVyIHJlc291cmNlcyB5b3UgY2FuIHVzZToKKworICAxLiByZWFkIG90aGVyIFt3aWtpIHBhZ2VzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93L2xpc3QpLAorICAxLiBzZWFyY2ggdGhlIG1haWxpbmcgbGlzdCBbYXJjaGl2ZV0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZW1vY2svdG9waWNzKSwKKyAgMS4gYXNrIGl0IG9uIFtnb29nbGVtb2NrQGdvb2dsZWdyb3Vwcy5jb21dKG1haWx0bzpnb29nbGVtb2NrQGdvb2dsZWdyb3Vwcy5jb20pIGFuZCBzb21lb25lIHdpbGwgYW5zd2VyIGl0ICh0byBwcmV2ZW50IHNwYW0sIHdlIHJlcXVpcmUgeW91IHRvIGpvaW4gdGhlIFtkaXNjdXNzaW9uIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xlbW9jaykgYmVmb3JlIHlvdSBjYW4gcG9zdC4pLgorCitQbGVhc2Ugbm90ZSB0aGF0IGNyZWF0aW5nIGFuIGlzc3VlIGluIHRoZQorW2lzc3VlIHRyYWNrZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL2lzc3Vlcy9saXN0KSBpcyBfbm90XworYSBnb29kIHdheSB0byBnZXQgeW91ciBhbnN3ZXIsIGFzIGl0IGlzIG1vbml0b3JlZCBpbmZyZXF1ZW50bHkgYnkgYQordmVyeSBzbWFsbCBudW1iZXIgb2YgcGVvcGxlLgorCitXaGVuIGFza2luZyBhIHF1ZXN0aW9uLCBpdCdzIGhlbHBmdWwgdG8gcHJvdmlkZSBhcyBtdWNoIG9mIHRoZQorZm9sbG93aW5nIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIChwZW9wbGUgY2Fubm90IGhlbHAgeW91IGlmIHRoZXJlJ3MKK25vdCBlbm91Z2ggaW5mb3JtYXRpb24gaW4geW91ciBxdWVzdGlvbik6CisKKyAgKiB0aGUgdmVyc2lvbiAob3IgdGhlIHJldmlzaW9uIG51bWJlciBpZiB5b3UgY2hlY2sgb3V0IGZyb20gU1ZOIGRpcmVjdGx5KSBvZiBHb29nbGUgTW9jayB5b3UgdXNlIChHb29nbGUgTW9jayBpcyB1bmRlciBhY3RpdmUgZGV2ZWxvcG1lbnQsIHNvIGl0J3MgcG9zc2libGUgdGhhdCB5b3VyIHByb2JsZW0gaGFzIGJlZW4gc29sdmVkIGluIGEgbGF0ZXIgdmVyc2lvbiksCisgICogeW91ciBvcGVyYXRpbmcgc3lzdGVtLAorICAqIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHlvdXIgY29tcGlsZXIsCisgICogdGhlIGNvbXBsZXRlIGNvbW1hbmQgbGluZSBmbGFncyB5b3UgZ2l2ZSB0byB5b3VyIGNvbXBpbGVyLAorICAqIHRoZSBjb21wbGV0ZSBjb21waWxlciBlcnJvciBtZXNzYWdlcyAoaWYgdGhlIHF1ZXN0aW9uIGlzIGFib3V0IGNvbXBpbGF0aW9uKSwKKyAgKiB0aGUgX2FjdHVhbF8gY29kZSAoaWRlYWxseSwgYSBtaW5pbWFsIGJ1dCBjb21wbGV0ZSBwcm9ncmFtKSB0aGF0IGhhcyB0aGUgcHJvYmxlbSB5b3UgZW5jb3VudGVyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzcvQ2hlYXRTaGVldC5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzcvQ2hlYXRTaGVldC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQyMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNy9DaGVhdFNoZWV0Lm1kCkBAIC0wLDAgKzEsNTU2IEBACisKKworIyBEZWZpbmluZyBhIE1vY2sgQ2xhc3MgIworCisjIyBNb2NraW5nIGEgTm9ybWFsIENsYXNzICMjCisKK0dpdmVuCitgYGAKK2NsYXNzIEZvbyB7CisgIC4uLgorICB2aXJ0dWFsIH5Gb28oKTsKKyAgdmlydHVhbCBpbnQgR2V0U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdHJpbmcgRGVzY3JpYmUoY29uc3QgY2hhciogbmFtZSkgPSAwOworICB2aXJ0dWFsIHN0cmluZyBEZXNjcmliZShpbnQgdHlwZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgUHJvY2VzcyhCYXIgZWxlbSwgaW50IGNvdW50KSA9IDA7Cit9OworYGBgCisobm90ZSB0aGF0IGB+Rm9vKClgICoqbXVzdCoqIGJlIHZpcnR1YWwpIHdlIGNhbiBkZWZpbmUgaXRzIG1vY2sgYXMKK2BgYAorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgTU9DS19DT05TVF9NRVRIT0QwKEdldFNpemUsIGludCgpKTsKKyAgTU9DS19NRVRIT0QxKERlc2NyaWJlLCBzdHJpbmcoY29uc3QgY2hhciogbmFtZSkpOworICBNT0NLX01FVEhPRDEoRGVzY3JpYmUsIHN0cmluZyhpbnQgdHlwZSkpOworICBNT0NLX01FVEhPRDIoUHJvY2VzcywgYm9vbChCYXIgZWxlbSwgaW50IGNvdW50KSk7Cit9OworYGBgCisKK1RvIGNyZWF0ZSBhICJuaWNlIiBtb2NrIG9iamVjdCB3aGljaCBpZ25vcmVzIGFsbCB1bmludGVyZXN0aW5nIGNhbGxzLAorb3IgYSAic3RyaWN0IiBtb2NrIG9iamVjdCwgd2hpY2ggdHJlYXRzIHRoZW0gYXMgZmFpbHVyZXM6CitgYGAKK05pY2VNb2NrPE1vY2tGb28+IG5pY2VfZm9vOyAgICAgLy8gVGhlIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vLgorU3RyaWN0TW9jazxNb2NrRm9vPiBzdHJpY3RfZm9vOyAvLyBUaGUgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28uCitgYGAKKworIyMgTW9ja2luZyBhIENsYXNzIFRlbXBsYXRlICMjCisKK1RvIG1vY2sKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW0+CitjbGFzcyBTdGFja0ludGVyZmFjZSB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCB+U3RhY2tJbnRlcmZhY2UoKTsKKyAgdmlydHVhbCBpbnQgR2V0U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFB1c2goY29uc3QgRWxlbSYgeCkgPSAwOworfTsKK2BgYAorKG5vdGUgdGhhdCBgflN0YWNrSW50ZXJmYWNlKClgICoqbXVzdCoqIGJlIHZpcnR1YWwpIGp1c3QgYXBwZW5kIGBfVGAgdG8gdGhlIGBNT0NLXypgIG1hY3JvczoKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW0+CitjbGFzcyBNb2NrU3RhY2sgOiBwdWJsaWMgU3RhY2tJbnRlcmZhY2U8RWxlbT4geworIHB1YmxpYzoKKyAgLi4uCisgIE1PQ0tfQ09OU1RfTUVUSE9EMF9UKEdldFNpemUsIGludCgpKTsKKyAgTU9DS19NRVRIT0QxX1QoUHVzaCwgdm9pZChjb25zdCBFbGVtJiB4KSk7Cit9OworYGBgCisKKyMjIFNwZWNpZnlpbmcgQ2FsbGluZyBDb252ZW50aW9ucyBmb3IgTW9jayBGdW5jdGlvbnMgIyMKKworSWYgeW91ciBtb2NrIGZ1bmN0aW9uIGRvZXNuJ3QgdXNlIHRoZSBkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbiwgeW91CitjYW4gc3BlY2lmeSBpdCBieSBhcHBlbmRpbmcgYF9XSVRIX0NBTExUWVBFYCB0byBhbnkgb2YgdGhlIG1hY3JvcworZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyB0d28gc2VjdGlvbnMgYW5kIHN1cHBseWluZyB0aGUgY2FsbGluZworY29udmVudGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIG1hY3JvLiBGb3IgZXhhbXBsZSwKK2BgYAorICBNT0NLX01FVEhPRF8xX1dJVEhfQ0FMTFRZUEUoU1RETUVUSE9EQ0FMTFRZUEUsIEZvbywgYm9vbChpbnQgbikpOworICBNT0NLX0NPTlNUX01FVEhPRDJfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgQmFyLCBpbnQoZG91YmxlIHgsIGRvdWJsZSB5KSk7CitgYGAKK3doZXJlIGBTVERNRVRIT0RDQUxMVFlQRWAgaXMgZGVmaW5lZCBieSBgPG9iamJhc2UuaD5gIG9uIFdpbmRvd3MuCisKKyMgVXNpbmcgTW9ja3MgaW4gVGVzdHMgIworCitUaGUgdHlwaWNhbCBmbG93IGlzOgorICAxLiBJbXBvcnQgdGhlIEdvb2dsZSBNb2NrIG5hbWVzIHlvdSBuZWVkIHRvIHVzZS4gQWxsIEdvb2dsZSBNb2NrIG5hbWVzIGFyZSBpbiB0aGUgYHRlc3RpbmdgIG5hbWVzcGFjZSB1bmxlc3MgdGhleSBhcmUgbWFjcm9zIG9yIG90aGVyd2lzZSBub3RlZC4KKyAgMS4gQ3JlYXRlIHRoZSBtb2NrIG9iamVjdHMuCisgIDEuIE9wdGlvbmFsbHksIHNldCB0aGUgZGVmYXVsdCBhY3Rpb25zIG9mIHRoZSBtb2NrIG9iamVjdHMuCisgIDEuIFNldCB5b3VyIGV4cGVjdGF0aW9ucyBvbiB0aGUgbW9jayBvYmplY3RzIChIb3cgd2lsbCB0aGV5IGJlIGNhbGxlZD8gV2hhdCB3aWwgdGhleSBkbz8pLgorICAxLiBFeGVyY2lzZSBjb2RlIHRoYXQgdXNlcyB0aGUgbW9jayBvYmplY3RzOyBpZiBuZWNlc3NhcnksIGNoZWNrIHRoZSByZXN1bHQgdXNpbmcgW0dvb2dsZSBUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8pIGFzc2VydGlvbnMuCisgIDEuIFdoZW4gYSBtb2NrIG9iamVjdHMgaXMgZGVzdHJ1Y3RlZCwgR29vZ2xlIE1vY2sgYXV0b21hdGljYWxseSB2ZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gaXQgaGF2ZSBiZWVuIHNhdGlzZmllZC4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzEKKworVEVTVChCYXJUZXN0LCBEb2VzVGhpcykgeworICBNb2NrRm9vIGZvbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjMgorCisgIE9OX0NBTEwoZm9vLCBHZXRTaXplKCkpICAgICAgICAgICAgICAgICAgICAgICAgIC8vICMzCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICAvLyAuLi4gb3RoZXIgZGVmYXVsdCBhY3Rpb25zIC4uLgorCisgIEVYUEVDVF9DQUxMKGZvbywgRGVzY3JpYmUoNSkpICAgICAgICAgICAgICAgICAgIC8vICM0CisgICAgICAuVGltZXMoMykKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oIkNhdGVnb3J5IDUiKSk7CisgIC8vIC4uLiBvdGhlciBleHBlY3RhdGlvbnMgLi4uCisKKyAgRVhQRUNUX0VRKCJnb29kIiwgTXlQcm9kdWN0aW9uRnVuY3Rpb24oJmZvbykpOyAgLy8gIzUKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzYKK2BgYAorCisjIFNldHRpbmcgRGVmYXVsdCBBY3Rpb25zICMKKworR29vZ2xlIE1vY2sgaGFzIGEgKipidWlsdC1pbiBkZWZhdWx0IGFjdGlvbioqIGZvciBhbnkgZnVuY3Rpb24gdGhhdAorcmV0dXJucyBgdm9pZGAsIGBib29sYCwgYSBudW1lcmljIHZhbHVlLCBvciBhIHBvaW50ZXIuCisKK1RvIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGZ1bmN0aW9ucyB3aXRoIHJldHVybiB0eXBlIGBUYCBnbG9iYWxseToKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpEZWZhdWx0VmFsdWU7CisKK0RlZmF1bHRWYWx1ZTxUPjo6U2V0KHZhbHVlKTsgIC8vIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCisvLyAuLi4gdXNlIHRoZSBtb2NrcyAuLi4KK0RlZmF1bHRWYWx1ZTxUPjo6Q2xlYXIoKTsgICAgIC8vIFJlc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZS4KK2BgYAorCitUbyBjdXN0b21pemUgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgbWV0aG9kLCB1c2UgYE9OX0NBTEwoKWA6CitgYGAKK09OX0NBTEwobW9ja19vYmplY3QsIG1ldGhvZChtYXRjaGVycykpCisgICAgLldpdGgobXVsdGlfYXJndW1lbnRfbWF0Y2hlcikgID8KKyAgICAuV2lsbEJ5RGVmYXVsdChhY3Rpb24pOworYGBgCisKKyMgU2V0dGluZyBFeHBlY3RhdGlvbnMgIworCitgRVhQRUNUX0NBTEwoKWAgc2V0cyAqKmV4cGVjdGF0aW9ucyoqIG9uIGEgbW9jayBtZXRob2QgKEhvdyB3aWxsIGl0IGJlCitjYWxsZWQ/IFdoYXQgd2lsbCBpdCBkbz8pOgorYGBgCitFWFBFQ1RfQ0FMTChtb2NrX29iamVjdCwgbWV0aG9kKG1hdGNoZXJzKSkKKyAgICAuV2l0aChtdWx0aV9hcmd1bWVudF9tYXRjaGVyKSAgPworICAgIC5UaW1lcyhjYXJkaW5hbGl0eSkgICAgICAgICAgICA/CisgICAgLkluU2VxdWVuY2Uoc2VxdWVuY2VzKSAgICAgICAgICoKKyAgICAuQWZ0ZXIoZXhwZWN0YXRpb25zKSAgICAgICAgICAgKgorICAgIC5XaWxsT25jZShhY3Rpb24pICAgICAgICAgICAgICAqCisgICAgLldpbGxSZXBlYXRlZGx5KGFjdGlvbikgICAgICAgID8KKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOyAgICAgICAgPworYGBgCisKK0lmIGBUaW1lcygpYCBpcyBvbWl0dGVkLCB0aGUgY2FyZGluYWxpdHkgaXMgYXNzdW1lZCB0byBiZToKKworICAqIGBUaW1lcygxKWAgd2hlbiB0aGVyZSBpcyBuZWl0aGVyIGBXaWxsT25jZSgpYCBub3IgYFdpbGxSZXBlYXRlZGx5KClgOworICAqIGBUaW1lcyhuKWAgd2hlbiB0aGVyZSBhcmUgYG4gV2lsbE9uY2UoKWBzIGJ1dCBubyBgV2lsbFJlcGVhdGVkbHkoKWAsIHdoZXJlIGBuYCA+PSAxOyBvcgorICAqIGBUaW1lcyhBdExlYXN0KG4pKWAgd2hlbiB0aGVyZSBhcmUgYG4gV2lsbE9uY2UoKWBzIGFuZCBhIGBXaWxsUmVwZWF0ZWRseSgpYCwgd2hlcmUgYG5gID49IDAuCisKK0EgbWV0aG9kIHdpdGggbm8gYEVYUEVDVF9DQUxMKClgIGlzIGZyZWUgdG8gYmUgaW52b2tlZCBfYW55IG51bWJlciBvZiB0aW1lc18sIGFuZCB0aGUgZGVmYXVsdCBhY3Rpb24gd2lsbCBiZSB0YWtlbiBlYWNoIHRpbWUuCisKKyMgTWF0Y2hlcnMgIworCitBICoqbWF0Y2hlcioqIG1hdGNoZXMgYSBfc2luZ2xlXyBhcmd1bWVudC4gIFlvdSBjYW4gdXNlIGl0IGluc2lkZQorYE9OX0NBTEwoKWAgb3IgYEVYUEVDVF9DQUxMKClgLCBvciB1c2UgaXQgdG8gdmFsaWRhdGUgYSB2YWx1ZQorZGlyZWN0bHk6CisKK3wgYEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAgfCBBc3NlcnRzIHRoYXQgYHZhbHVlYCBtYXRjaGVzIGBtYXRjaGVyYC4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfVEhBVCh2YWx1ZSwgbWF0Y2hlcilgIHwgVGhlIHNhbWUgYXMgYEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAsIGV4Y2VwdCB0aGF0IGl0IGdlbmVyYXRlcyBhICoqZmF0YWwqKiBmYWlsdXJlLiB8CisKK0J1aWx0LWluIG1hdGNoZXJzICh3aGVyZSBgYXJndW1lbnRgIGlzIHRoZSBmdW5jdGlvbiBhcmd1bWVudCkgYXJlCitkaXZpZGVkIGludG8gc2V2ZXJhbCBjYXRlZ29yaWVzOgorCisjIyBXaWxkY2FyZCAjIworfGBfYHxgYXJndW1lbnRgIGNhbiBiZSBhbnkgdmFsdWUgb2YgdGhlIGNvcnJlY3QgdHlwZS58Cit8Oi0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgQTx0eXBlPigpYCBvciBgQW48dHlwZT4oKWB8YGFyZ3VtZW50YCBjYW4gYmUgYW55IHZhbHVlIG9mIHR5cGUgYHR5cGVgLiAgICAgfAorCisjIyBHZW5lcmljIENvbXBhcmlzb24gIyMKKworfGBFcSh2YWx1ZSlgIG9yIGB2YWx1ZWB8YGFyZ3VtZW50ID09IHZhbHVlYHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS18Cit8YEdlKHZhbHVlKWAgICAgICAgICAgIHxgYXJndW1lbnQgPj0gdmFsdWVgfAorfGBHdCh2YWx1ZSlgICAgICAgICAgICB8YGFyZ3VtZW50ID4gdmFsdWVgIHwKK3xgTGUodmFsdWUpYCAgICAgICAgICAgfGBhcmd1bWVudCA8PSB2YWx1ZWB8Cit8YEx0KHZhbHVlKWAgICAgICAgICAgIHxgYXJndW1lbnQgPCB2YWx1ZWAgfAorfGBOZSh2YWx1ZSlgICAgICAgICAgICB8YGFyZ3VtZW50ICE9IHZhbHVlYHwKK3xgSXNOdWxsKClgICAgICAgICAgICAgfGBhcmd1bWVudGAgaXMgYSBgTlVMTGAgcG9pbnRlciAocmF3IG9yIHNtYXJ0KS58Cit8YE5vdE51bGwoKWAgICAgICAgICAgIHxgYXJndW1lbnRgIGlzIGEgbm9uLW51bGwgcG9pbnRlciAocmF3IG9yIHNtYXJ0KS58Cit8YFJlZih2YXJpYWJsZSlgICAgICAgIHxgYXJndW1lbnRgIGlzIGEgcmVmZXJlbmNlIHRvIGB2YXJpYWJsZWAufAorfGBUeXBlZEVxPHR5cGU+KHZhbHVlKWB8YGFyZ3VtZW50YCBoYXMgdHlwZSBgdHlwZWAgYW5kIGlzIGVxdWFsIHRvIGB2YWx1ZWAuIFlvdSBtYXkgbmVlZCB0byB1c2UgdGhpcyBpbnN0ZWFkIG9mIGBFcSh2YWx1ZSlgIHdoZW4gdGhlIG1vY2sgZnVuY3Rpb24gaXMgb3ZlcmxvYWRlZC58CisKK0V4Y2VwdCBgUmVmKClgLCB0aGVzZSBtYXRjaGVycyBtYWtlIGEgX2NvcHlfIG9mIGB2YWx1ZWAgaW4gY2FzZSBpdCdzCittb2RpZmllZCBvciBkZXN0cnVjdGVkIGxhdGVyLiBJZiB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgYHZhbHVlYAorZG9lc24ndCBoYXZlIGEgcHVibGljIGNvcHkgY29uc3RydWN0b3IsIHRyeSB3cmFwIGl0IGluIGBCeVJlZigpYCwKK2UuZy4gYEVxKEJ5UmVmKG5vbl9jb3B5YWJsZV92YWx1ZSkpYC4gSWYgeW91IGRvIHRoYXQsIG1ha2Ugc3VyZQorYG5vbl9jb3B5YWJsZV92YWx1ZWAgaXMgbm90IGNoYW5nZWQgYWZ0ZXJ3YXJkcywgb3IgdGhlIG1lYW5pbmcgb2YgeW91cgorbWF0Y2hlciB3aWxsIGJlIGNoYW5nZWQuCisKKyMjIEZsb2F0aW5nLVBvaW50IE1hdGNoZXJzICMjCisKK3xgRG91YmxlRXEoYV9kb3VibGUpYHxgYXJndW1lbnRgIGlzIGEgYGRvdWJsZWAgdmFsdWUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgYV9kb3VibGVgLCB0cmVhdGluZyB0d28gTmFOcyBhcyB1bmVxdWFsLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgRmxvYXRFcShhX2Zsb2F0KWAgIHxgYXJndW1lbnRgIGlzIGEgYGZsb2F0YCB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGBhX2Zsb2F0YCwgdHJlYXRpbmcgdHdvIE5hTnMgYXMgdW5lcXVhbC4gIHwKK3xgTmFuU2Vuc2l0aXZlRG91YmxlRXEoYV9kb3VibGUpYHxgYXJndW1lbnRgIGlzIGEgYGRvdWJsZWAgdmFsdWUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgYV9kb3VibGVgLCB0cmVhdGluZyB0d28gTmFOcyBhcyBlcXVhbC4gIHwKK3xgTmFuU2Vuc2l0aXZlRmxvYXRFcShhX2Zsb2F0KWB8YGFyZ3VtZW50YCBpcyBhIGBmbG9hdGAgdmFsdWUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgYV9mbG9hdGAsIHRyZWF0aW5nIHR3byBOYU5zIGFzIGVxdWFsLiAgICB8CisKK1RoZSBhYm92ZSBtYXRjaGVycyB1c2UgVUxQLWJhc2VkIGNvbXBhcmlzb24gKHRoZSBzYW1lIGFzIHVzZWQgaW4KK1tHb29nbGUgVGVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvKSkuIFRoZXkKK2F1dG9tYXRpY2FsbHkgcGljayBhIHJlYXNvbmFibGUgZXJyb3IgYm91bmQgYmFzZWQgb24gdGhlIGFic29sdXRlCit2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgdmFsdWUuICBgRG91YmxlRXEoKWAgYW5kIGBGbG9hdEVxKClgIGNvbmZvcm0gdG8KK3RoZSBJRUVFIHN0YW5kYXJkLCB3aGljaCByZXF1aXJlcyBjb21wYXJpbmcgdHdvIE5hTnMgZm9yIGVxdWFsaXR5IHRvCityZXR1cm4gZmFsc2UuIFRoZSBgTmFuU2Vuc2l0aXZlKmAgdmVyc2lvbiBpbnN0ZWFkIHRyZWF0cyB0d28gTmFOcyBhcworZXF1YWwsIHdoaWNoIGlzIG9mdGVuIHdoYXQgYSB1c2VyIHdhbnRzLgorCit8YERvdWJsZU5lYXIoYV9kb3VibGUsIG1heF9hYnNfZXJyb3IpYHxgYXJndW1lbnRgIGlzIGEgYGRvdWJsZWAgdmFsdWUgY2xvc2UgdG8gYGFfZG91YmxlYCAoYWJzb2x1dGUgZXJyb3IgPD0gYG1heF9hYnNfZXJyb3JgKSwgdHJlYXRpbmcgdHdvIE5hTnMgYXMgdW5lcXVhbC58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEZsb2F0TmVhcihhX2Zsb2F0LCBtYXhfYWJzX2Vycm9yKWAgIHxgYXJndW1lbnRgIGlzIGEgYGZsb2F0YCB2YWx1ZSBjbG9zZSB0byBgYV9mbG9hdGAgKGFic29sdXRlIGVycm9yIDw9IGBtYXhfYWJzX2Vycm9yYCksIHRyZWF0aW5nIHR3byBOYU5zIGFzIHVuZXF1YWwuICB8Cit8YE5hblNlbnNpdGl2ZURvdWJsZU5lYXIoYV9kb3VibGUsIG1heF9hYnNfZXJyb3IpYHxgYXJndW1lbnRgIGlzIGEgYGRvdWJsZWAgdmFsdWUgY2xvc2UgdG8gYGFfZG91YmxlYCAoYWJzb2x1dGUgZXJyb3IgPD0gYG1heF9hYnNfZXJyb3JgKSwgdHJlYXRpbmcgdHdvIE5hTnMgYXMgZXF1YWwuICB8Cit8YE5hblNlbnNpdGl2ZUZsb2F0TmVhcihhX2Zsb2F0LCBtYXhfYWJzX2Vycm9yKWB8YGFyZ3VtZW50YCBpcyBhIGBmbG9hdGAgdmFsdWUgY2xvc2UgdG8gYGFfZmxvYXRgIChhYnNvbHV0ZSBlcnJvciA8PSBgbWF4X2Fic19lcnJvcmApLCB0cmVhdGluZyB0d28gTmFOcyBhcyBlcXVhbC4gICAgfAorCisjIyBTdHJpbmcgTWF0Y2hlcnMgIyMKKworVGhlIGBhcmd1bWVudGAgY2FuIGJlIGVpdGhlciBhIEMgc3RyaW5nIG9yIGEgQysrIHN0cmluZyBvYmplY3Q6CisKK3xgQ29udGFpbnNSZWdleChzdHJpbmcpYHxgYXJndW1lbnRgIG1hdGNoZXMgdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBFbmRzV2l0aChzdWZmaXgpYCAgICAgfGBhcmd1bWVudGAgZW5kcyB3aXRoIHN0cmluZyBgc3VmZml4YC4gICAgICAgICAgIHwKK3xgSGFzU3Vic3RyKHN0cmluZylgICAgIHxgYXJndW1lbnRgIGNvbnRhaW5zIGBzdHJpbmdgIGFzIGEgc3ViLXN0cmluZy4gICB8Cit8YE1hdGNoZXNSZWdleChzdHJpbmcpYCB8YGFyZ3VtZW50YCBtYXRjaGVzIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB0aGUgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBhbmQgZW5kaW5nIGF0IHRoZSBsYXN0IGNoYXJhY3Rlci58Cit8YFN0YXJ0c1dpdGgocHJlZml4KWAgICB8YGFyZ3VtZW50YCBzdGFydHMgd2l0aCBzdHJpbmcgYHByZWZpeGAuICAgICAgICAgfAorfGBTdHJDYXNlRXEoc3RyaW5nKWAgICAgfGBhcmd1bWVudGAgaXMgZXF1YWwgdG8gYHN0cmluZ2AsIGlnbm9yaW5nIGNhc2UuIHwKK3xgU3RyQ2FzZU5lKHN0cmluZylgICAgIHxgYXJndW1lbnRgIGlzIG5vdCBlcXVhbCB0byBgc3RyaW5nYCwgaWdub3JpbmcgY2FzZS58Cit8YFN0ckVxKHN0cmluZylgICAgICAgICB8YGFyZ3VtZW50YCBpcyBlcXVhbCB0byBgc3RyaW5nYC4gICAgICAgICAgICAgICAgfAorfGBTdHJOZShzdHJpbmcpYCAgICAgICAgfGBhcmd1bWVudGAgaXMgbm90IGVxdWFsIHRvIGBzdHJpbmdgLiAgICAgICAgICAgIHwKKworYENvbnRhaW5zUmVnZXgoKWAgYW5kIGBNYXRjaGVzUmVnZXgoKWAgdXNlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KK3N5bnRheCBkZWZpbmVkCitbaGVyZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9BZHZhbmNlZEd1aWRlI1JlZ3VsYXJfRXhwcmVzc2lvbl9TeW50YXgpLgorYFN0ckNhc2VFcSgpYCwgYFN0ckNhc2VOZSgpYCwgYFN0ckVxKClgLCBhbmQgYFN0ck5lKClgIHdvcmsgZm9yIHdpZGUKK3N0cmluZ3MgYXMgd2VsbC4KKworIyMgQ29udGFpbmVyIE1hdGNoZXJzICMjCisKK01vc3QgU1RMLXN0eWxlIGNvbnRhaW5lcnMgc3VwcG9ydCBgPT1gLCBzbyB5b3UgY2FuIHVzZQorYEVxKGV4cGVjdGVkX2NvbnRhaW5lcilgIG9yIHNpbXBseSBgZXhwZWN0ZWRfY29udGFpbmVyYCB0byBtYXRjaCBhCitjb250YWluZXIgZXhhY3RseS4gICBJZiB5b3Ugd2FudCB0byB3cml0ZSB0aGUgZWxlbWVudHMgaW4tbGluZSwKK21hdGNoIHRoZW0gbW9yZSBmbGV4aWJseSwgb3IgZ2V0IG1vcmUgaW5mb3JtYXRpdmUgbWVzc2FnZXMsIHlvdSBjYW4gdXNlOgorCit8IGBDb250YWluZXJFcShjb250YWluZXIpYCB8IFRoZSBzYW1lIGFzIGBFcShjb250YWluZXIpYCBleGNlcHQgdGhhdCB0aGUgZmFpbHVyZSBtZXNzYWdlIGFsc28gaW5jbHVkZXMgd2hpY2ggZWxlbWVudHMgYXJlIGluIG9uZSBjb250YWluZXIgYnV0IG5vdCB0aGUgb3RoZXIuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgQ29udGFpbnMoZSlgICAgICAgICAgICAgfCBgYXJndW1lbnRgIGNvbnRhaW5zIGFuIGVsZW1lbnQgdGhhdCBtYXRjaGVzIGBlYCwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBFYWNoKGUpYCAgICAgICAgICAgICAgICB8IGBhcmd1bWVudGAgaXMgYSBjb250YWluZXIgd2hlcmUgX2V2ZXJ5XyBlbGVtZW50IG1hdGNoZXMgYGVgLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYEVsZW1lbnRzQXJlKGUwLCBlMSwgLi4uLCBlbilgIHwgYGFyZ3VtZW50YCBoYXMgYG4gKyAxYCBlbGVtZW50cywgd2hlcmUgdGhlIGktdGggZWxlbWVudCBtYXRjaGVzIGBlaWAsIHdoaWNoIGNhbiBiZSBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gMCB0byAxMCBhcmd1bWVudHMgYXJlIGFsbG93ZWQuIHwKK3wgYEVsZW1lbnRzQXJlQXJyYXkoeyBlMCwgZTEsIC4uLiwgZW4gfSlgLCBgRWxlbWVudHNBcmVBcnJheShhcnJheSlgLCBvciBgRWxlbWVudHNBcmVBcnJheShhcnJheSwgY291bnQpYCB8IFRoZSBzYW1lIGFzIGBFbGVtZW50c0FyZSgpYCBleGNlcHQgdGhhdCB0aGUgZXhwZWN0ZWQgZWxlbWVudCB2YWx1ZXMvbWF0Y2hlcnMgY29tZSBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QsIHZlY3Rvciwgb3IgQy1zdHlsZSBhcnJheS4gfAorfCBgSXNFbXB0eSgpYCAgICAgICAgICAgICAgfCBgYXJndW1lbnRgIGlzIGFuIGVtcHR5IGNvbnRhaW5lciAoYGNvbnRhaW5lci5lbXB0eSgpYCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBQb2ludHdpc2UobSwgY29udGFpbmVyKWAgfCBgYXJndW1lbnRgIGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbiBgY29udGFpbmVyYCwgYW5kIGZvciBhbGwgaSwgKHRoZSBpLXRoIGVsZW1lbnQgaW4gYGFyZ3VtZW50YCwgdGhlIGktdGggZWxlbWVudCBpbiBgY29udGFpbmVyYCkgbWF0Y2ggYG1gLCB3aGljaCBpcyBhIG1hdGNoZXIgb24gMi10dXBsZXMuIEUuZy4gYFBvaW50d2lzZShMZSgpLCB1cHBlcl9ib3VuZHMpYCB2ZXJpZmllcyB0aGF0IGVhY2ggZWxlbWVudCBpbiBgYXJndW1lbnRgIGRvZXNuJ3QgZXhjZWVkIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gYHVwcGVyX2JvdW5kc2AuIFNlZSBtb3JlIGRldGFpbCBiZWxvdy4gfAorfCBgU2l6ZUlzKG0pYCAgICAgICAgICAgICAgfCBgYXJndW1lbnRgIGlzIGEgY29udGFpbmVyIHdob3NlIHNpemUgbWF0Y2hlcyBgbWAuIEUuZy4gYFNpemVJcygyKWAgb3IgYFNpemVJcyhMdCgyKSlgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBVbm9yZGVyZWRFbGVtZW50c0FyZShlMCwgZTEsIC4uLiwgZW4pYCB8IGBhcmd1bWVudGAgaGFzIGBuICsgMWAgZWxlbWVudHMsIGFuZCB1bmRlciBzb21lIHBlcm11dGF0aW9uIGVhY2ggZWxlbWVudCBtYXRjaGVzIGFuIGBlaWAgKGZvciBhIGRpZmZlcmVudCBgaWApLCB3aGljaCBjYW4gYmUgYSB2YWx1ZSBvciBhIG1hdGNoZXIuIDAgdG8gMTAgYXJndW1lbnRzIGFyZSBhbGxvd2VkLiB8Cit8IGBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHsgZTAsIGUxLCAuLi4sIGVuIH0pYCwgYFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpYCwgb3IgYFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoYXJyYXksIGNvdW50KWAgfCBUaGUgc2FtZSBhcyBgVW5vcmRlcmVkRWxlbWVudHNBcmUoKWAgZXhjZXB0IHRoYXQgdGhlIGV4cGVjdGVkIGVsZW1lbnQgdmFsdWVzL21hdGNoZXJzIGNvbWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LCB2ZWN0b3IsIG9yIEMtc3R5bGUgYXJyYXkuIHwKK3wgYFdoZW5Tb3J0ZWQobSlgICAgICAgICAgIHwgV2hlbiBgYXJndW1lbnRgIGlzIHNvcnRlZCB1c2luZyB0aGUgYDxgIG9wZXJhdG9yLCBpdCBtYXRjaGVzIGNvbnRhaW5lciBtYXRjaGVyIGBtYC4gRS5nLiBgV2hlblNvcnRlZChVbm9yZGVyZWRFbGVtZW50c0FyZSgxLCAyLCAzKSlgIHZlcmlmaWVzIHRoYXQgYGFyZ3VtZW50YCBjb250YWlucyBlbGVtZW50cyBgMWAsIGAyYCwgYW5kIGAzYCwgaWdub3Jpbmcgb3JkZXIuIHwKK3wgYFdoZW5Tb3J0ZWRCeShjb21wYXJhdG9yLCBtKWAgfCBUaGUgc2FtZSBhcyBgV2hlblNvcnRlZChtKWAsIGV4Y2VwdCB0aGF0IHRoZSBnaXZlbiBjb21wYXJhdG9yIGluc3RlYWQgb2YgYDxgIGlzIHVzZWQgdG8gc29ydCBgYXJndW1lbnRgLiBFLmcuIGBXaGVuU29ydGVkQnkoc3RkOjpncmVhdGVyPGludD4oKSwgRWxlbWVudHNBcmUoMywgMiwgMSkpYC4gfAorCitOb3RlczoKKworICAqIFRoZXNlIG1hdGNoZXJzIGNhbiBhbHNvIG1hdGNoOgorICAgIDEuIGEgbmF0aXZlIGFycmF5IHBhc3NlZCBieSByZWZlcmVuY2UgKGUuZy4gaW4gYEZvbyhjb25zdCBpbnQgKCZhKVs1XSlgKSwgYW5kCisgICAgMS4gYW4gYXJyYXkgcGFzc2VkIGFzIGEgcG9pbnRlciBhbmQgYSBjb3VudCAoZS5nLiBpbiBgQmFyKGNvbnN0IFQqIGJ1ZmZlciwgaW50IGxlbilgIC0tIHNlZSBbTXVsdGktYXJndW1lbnQgTWF0Y2hlcnNdKCNNdWx0aWFyZ3VtZW50X01hdGNoZXJzLm1kKSkuCisgICogVGhlIGFycmF5IGJlaW5nIG1hdGNoZWQgbWF5IGJlIG11bHRpLWRpbWVuc2lvbmFsIChpLmUuIGl0cyBlbGVtZW50cyBjYW4gYmUgYXJyYXlzKS4KKyAgKiBgbWAgaW4gYFBvaW50d2lzZShtLCAuLi4pYCBzaG91bGQgYmUgYSBtYXRjaGVyIGZvciBgc3RkOjp0cjE6OnR1cGxlPFQsIFU+YCB3aGVyZSBgVGAgYW5kIGBVYCBhcmUgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgYWN0dWFsIGNvbnRhaW5lciBhbmQgdGhlIGV4cGVjdGVkIGNvbnRhaW5lciwgcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZSwgdG8gY29tcGFyZSB0d28gYEZvb2AgY29udGFpbmVycyB3aGVyZSBgRm9vYCBkb2Vzbid0IHN1cHBvcnQgYG9wZXJhdG9yPT1gIGJ1dCBoYXMgYW4gYEVxdWFscygpYCBtZXRob2QsIG9uZSBtaWdodCB3cml0ZToKKworYGBgCit1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7CitNQVRDSEVSKEZvb0VxLCAiIikgeworICByZXR1cm4gZ2V0PDA+KGFyZykuRXF1YWxzKGdldDwxPihhcmcpKTsKK30KKy4uLgorRVhQRUNUX1RIQVQoYWN0dWFsX2Zvb3MsIFBvaW50d2lzZShGb29FcSgpLCBleHBlY3RlZF9mb29zKSk7CitgYGAKKworIyMgTWVtYmVyIE1hdGNoZXJzICMjCisKK3xgRmllbGQoJmNsYXNzOjpmaWVsZCwgbSlgfGBhcmd1bWVudC5maWVsZGAgKG9yIGBhcmd1bWVudC0+ZmllbGRgIHdoZW4gYGFyZ3VtZW50YCBpcyBhIHBsYWluIHBvaW50ZXIpIG1hdGNoZXMgbWF0Y2hlciBgbWAsIHdoZXJlIGBhcmd1bWVudGAgaXMgYW4gb2JqZWN0IG9mIHR5cGUgX2NsYXNzXy58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBLZXkoZSlgICAgICAgICAgICAgICAgICB8YGFyZ3VtZW50LmZpcnN0YCBtYXRjaGVzIGBlYCwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gRS5nLiBgQ29udGFpbnMoS2V5KExlKDUpKSlgIGNhbiB2ZXJpZnkgdGhhdCBhIGBtYXBgIGNvbnRhaW5zIGEga2V5IGA8PSA1YC58Cit8YFBhaXIobTEsIG0yKWAgICAgICAgICAgIHxgYXJndW1lbnRgIGlzIGFuIGBzdGQ6OnBhaXJgIHdob3NlIGBmaXJzdGAgZmllbGQgbWF0Y2hlcyBgbTFgIGFuZCBgc2Vjb25kYCBmaWVsZCBtYXRjaGVzIGBtMmAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfGBQcm9wZXJ0eSgmY2xhc3M6OnByb3BlcnR5LCBtKWB8YGFyZ3VtZW50LnByb3BlcnR5KClgIChvciBgYXJndW1lbnQtPnByb3BlcnR5KClgIHdoZW4gYGFyZ3VtZW50YCBpcyBhIHBsYWluIHBvaW50ZXIpIG1hdGNoZXMgbWF0Y2hlciBgbWAsIHdoZXJlIGBhcmd1bWVudGAgaXMgYW4gb2JqZWN0IG9mIHR5cGUgX2NsYXNzXy58CisKKyMjIE1hdGNoaW5nIHRoZSBSZXN1bHQgb2YgYSBGdW5jdGlvbiBvciBGdW5jdG9yICMjCisKK3xgUmVzdWx0T2YoZiwgbSlgfGBmKGFyZ3VtZW50KWAgbWF0Y2hlcyBtYXRjaGVyIGBtYCwgd2hlcmUgYGZgIGlzIGEgZnVuY3Rpb24gb3IgZnVuY3Rvci58Cit8Oi0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCisjIyBQb2ludGVyIE1hdGNoZXJzICMjCisKK3xgUG9pbnRlZShtKWB8YGFyZ3VtZW50YCAoZWl0aGVyIGEgc21hcnQgcG9pbnRlciBvciBhIHJhdyBwb2ludGVyKSBwb2ludHMgdG8gYSB2YWx1ZSB0aGF0IG1hdGNoZXMgbWF0Y2hlciBgbWAufAorfDotLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKKyMjIE11bHRpYXJndW1lbnQgTWF0Y2hlcnMgIyMKKworVGVjaG5pY2FsbHksIGFsbCBtYXRjaGVycyBtYXRjaCBhIF9zaW5nbGVfIHZhbHVlLiBBICJtdWx0aS1hcmd1bWVudCIKK21hdGNoZXIgaXMganVzdCBvbmUgdGhhdCBtYXRjaGVzIGEgX3R1cGxlXy4gVGhlIGZvbGxvd2luZyBtYXRjaGVycyBjYW4KK2JlIHVzZWQgdG8gbWF0Y2ggYSB0dXBsZSBgKHgsIHkpYDoKKworfGBFcSgpYHxgeCA9PSB5YHwKK3w6LS0tLS18Oi0tLS0tLS18Cit8YEdlKClgfGB4ID49IHlgfAorfGBHdCgpYHxgeCA+IHlgIHwKK3xgTGUoKWB8YHggPD0geWB8Cit8YEx0KClgfGB4IDwgeWAgfAorfGBOZSgpYHxgeCAhPSB5YHwKKworWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBzZWxlY3RvcnMgdG8gcGljayBhIHN1YnNldCBvZiB0aGUgYXJndW1lbnRzCisob3IgcmVvcmRlciB0aGVtKSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgbWF0Y2hpbmc6CisKK3xgQWxsQXJncyhtKWB8RXF1aXZhbGVudCB0byBgbWAuIFVzZWZ1bCBhcyBzeW50YWN0aWMgc3VnYXIgaW4gYC5XaXRoKEFsbEFyZ3MobSkpYC58Cit8Oi0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBBcmdzPE4xLCBOMiwgLi4uLCBOaz4obSlgfFRoZSB0dXBsZSBvZiB0aGUgYGtgIHNlbGVjdGVkICh1c2luZyAwLWJhc2VkIGluZGljZXMpIGFyZ3VtZW50cyBtYXRjaGVzIGBtYCwgZS5nLiBgQXJnczwxLCAyPihFcSgpKWAufAorCisjIyBDb21wb3NpdGUgTWF0Y2hlcnMgIyMKKworWW91IGNhbiBtYWtlIGEgbWF0Y2hlciBmcm9tIG9uZSBvciBtb3JlIG90aGVyIG1hdGNoZXJzOgorCit8YEFsbE9mKG0xLCBtMiwgLi4uLCBtbilgfGBhcmd1bWVudGAgbWF0Y2hlcyBhbGwgb2YgdGhlIG1hdGNoZXJzIGBtMWAgdG8gYG1uYC58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEFueU9mKG0xLCBtMiwgLi4uLCBtbilgfGBhcmd1bWVudGAgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIG1hdGNoZXJzIGBtMWAgdG8gYG1uYC58Cit8YE5vdChtKWAgICAgICAgICAgICAgICAgfGBhcmd1bWVudGAgZG9lc24ndCBtYXRjaCBtYXRjaGVyIGBtYC4gICAgICAgICAgICAgICB8CisKKyMjIEFkYXB0ZXJzIGZvciBNYXRjaGVycyAjIworCit8YE1hdGNoZXJDYXN0PFQ+KG0pYHxjYXN0cyBtYXRjaGVyIGBtYCB0byB0eXBlIGBNYXRjaGVyPFQ+YC58Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YFNhZmVNYXRjaGVyQ2FzdDxUPihtKWB8IFtzYWZlbHkgY2FzdHNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfN19Db29rQm9vayNDYXN0aW5nX01hdGNoZXJzKSBtYXRjaGVyIGBtYCB0byB0eXBlIGBNYXRjaGVyPFQ+YC4gfAorfGBUcnVseShwcmVkaWNhdGUpYCB8YHByZWRpY2F0ZShhcmd1bWVudClgIHJldHVybnMgc29tZXRoaW5nIGNvbnNpZGVyZWQgYnkgQysrIHRvIGJlIHRydWUsIHdoZXJlIGBwcmVkaWNhdGVgIGlzIGEgZnVuY3Rpb24gb3IgZnVuY3Rvci58CisKKyMjIE1hdGNoZXJzIGFzIFByZWRpY2F0ZXMgIyMKKworfGBNYXRjaGVzKG0pKHZhbHVlKWB8ZXZhbHVhdGVzIHRvIGB0cnVlYCBpZiBgdmFsdWVgIG1hdGNoZXMgYG1gLiBZb3UgY2FuIHVzZSBgTWF0Y2hlcyhtKWAgYWxvbmUgYXMgYSB1bmFyeSBmdW5jdG9yLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEV4cGxhaW5NYXRjaFJlc3VsdChtLCB2YWx1ZSwgcmVzdWx0X2xpc3RlbmVyKWB8ZXZhbHVhdGVzIHRvIGB0cnVlYCBpZiBgdmFsdWVgIG1hdGNoZXMgYG1gLCBleHBsYWluaW5nIHRoZSByZXN1bHQgdG8gYHJlc3VsdF9saXN0ZW5lcmAuICAgICAgIHwKK3xgVmFsdWUodmFsdWUsIG0pYCAgfGV2YWx1YXRlcyB0byBgdHJ1ZWAgaWYgYHZhbHVlYCBtYXRjaGVzIGBtYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKyMjIERlZmluaW5nIE1hdGNoZXJzICMjCisKK3wgYE1BVENIRVIoSXNFdmVuLCAiIikgeyByZXR1cm4gKGFyZyAlIDIpID09IDA7IH1gIHwgRGVmaW5lcyBhIG1hdGNoZXIgYElzRXZlbigpYCB0byBtYXRjaCBhbiBldmVuIG51bWJlci4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBNQVRDSEVSX1AoSXNEaXZpc2libGVCeSwgbiwgIiIpIHsgKnJlc3VsdF9saXN0ZW5lciA8PCAid2hlcmUgdGhlIHJlbWFpbmRlciBpcyAiIDw8IChhcmcgJSBuKTsgcmV0dXJuIChhcmcgJSBuKSA9PSAwOyB9YCB8IERlZmluZXMgYSBtYWNoZXIgYElzRGl2aXNpYmxlQnkobilgIHRvIG1hdGNoIGEgbnVtYmVyIGRpdmlzaWJsZSBieSBgbmAuIHwKK3wgYE1BVENIRVJfUDIoSXNCZXR3ZWVuLCBhLCBiLCBzdGQ6OnN0cmluZyhuZWdhdGlvbiA/ICJpc24ndCIgOiAiaXMiKSArICIgYmV0d2VlbiAiICsgUHJpbnRUb1N0cmluZyhhKSArICIgYW5kICIgKyBQcmludFRvU3RyaW5nKGIpKSB7IHJldHVybiBhIDw9IGFyZyAmJiBhcmcgPD0gYjsgfWAgfCBEZWZpbmVzIGEgbWF0Y2hlciBgSXNCZXR3ZWVuKGEsIGIpYCB0byBtYXRjaCBhIHZhbHVlIGluIHRoZSByYW5nZSBbYGFgLCBgYmBdLiB8CisKKyoqTm90ZXM6KioKKworICAxLiBUaGUgYE1BVENIRVIqYCBtYWNyb3MgY2Fubm90IGJlIHVzZWQgaW5zaWRlIGEgZnVuY3Rpb24gb3IgY2xhc3MuCisgIDEuIFRoZSBtYXRjaGVyIGJvZHkgbXVzdCBiZSBfcHVyZWx5IGZ1bmN0aW9uYWxfIChpLmUuIGl0IGNhbm5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdCwgYW5kIHRoZSByZXN1bHQgbXVzdCBub3QgZGVwZW5kIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYW5kIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMpLgorICAxLiBZb3UgY2FuIHVzZSBgUHJpbnRUb1N0cmluZyh4KWAgdG8gY29udmVydCBhIHZhbHVlIGB4YCBvZiBhbnkgdHlwZSB0byBhIHN0cmluZy4KKworIyMgTWF0Y2hlcnMgYXMgVGVzdCBBc3NlcnRpb25zICMjCisKK3xgQVNTRVJUX1RIQVQoZXhwcmVzc2lvbiwgbSlgfEdlbmVyYXRlcyBhIFtmYXRhbCBmYWlsdXJlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1ByaW1lciNBc3NlcnRpb25zKSBpZiB0aGUgdmFsdWUgb2YgYGV4cHJlc3Npb25gIGRvZXNuJ3QgbWF0Y2ggbWF0Y2hlciBgbWAufAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEVYUEVDVF9USEFUKGV4cHJlc3Npb24sIG0pYHxHZW5lcmF0ZXMgYSBub24tZmF0YWwgZmFpbHVyZSBpZiB0aGUgdmFsdWUgb2YgYGV4cHJlc3Npb25gIGRvZXNuJ3QgbWF0Y2ggbWF0Y2hlciBgbWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworIyBBY3Rpb25zICMKKworKipBY3Rpb25zKiogc3BlY2lmeSB3aGF0IGEgbW9jayBmdW5jdGlvbiBzaG91bGQgZG8gd2hlbiBpbnZva2VkLgorCisjIyBSZXR1cm5pbmcgYSBWYWx1ZSAjIworCit8YFJldHVybigpYHxSZXR1cm4gZnJvbSBhIGB2b2lkYCBtb2NrIGZ1bmN0aW9uLnwKK3w6LS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBSZXR1cm4odmFsdWUpYHxSZXR1cm4gYHZhbHVlYC4gSWYgdGhlIHR5cGUgb2YgYHZhbHVlYCBpcyBkaWZmZXJlbnQgdG8gdGhlIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSwgYHZhbHVlYCBpcyBjb252ZXJ0ZWQgdG8gdGhlIGxhdHRlciB0eXBlIDxpPmF0IHRoZSB0aW1lIHRoZSBleHBlY3RhdGlvbiBpcyBzZXQ8L2k+LCBub3Qgd2hlbiB0aGUgYWN0aW9uIGlzIGV4ZWN1dGVkLnwKK3xgUmV0dXJuQXJnPE4+KClgfFJldHVybiB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudC58Cit8YFJldHVybk5ldzxUPihhMSwgLi4uLCBhaylgfFJldHVybiBgbmV3IFQoYTEsIC4uLiwgYWspYDsgYSBkaWZmZXJlbnQgb2JqZWN0IGlzIGNyZWF0ZWQgZWFjaCB0aW1lLnwKK3xgUmV0dXJuTnVsbCgpYHxSZXR1cm4gYSBudWxsIHBvaW50ZXIuICAgICAgICAgICAgIHwKK3xgUmV0dXJuUG9pbnRlZShwdHIpYHxSZXR1cm4gdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgYHB0cmAufAorfGBSZXR1cm5SZWYodmFyaWFibGUpYHxSZXR1cm4gYSByZWZlcmVuY2UgdG8gYHZhcmlhYmxlYC4gIHwKK3xgUmV0dXJuUmVmT2ZDb3B5KHZhbHVlKWB8UmV0dXJuIGEgcmVmZXJlbmNlIHRvIGEgY29weSBvZiBgdmFsdWVgOyB0aGUgY29weSBsaXZlcyBhcyBsb25nIGFzIHRoZSBhY3Rpb24ufAorCisjIyBTaWRlIEVmZmVjdHMgIyMKKworfGBBc3NpZ24oJnZhcmlhYmxlLCB2YWx1ZSlgfEFzc2lnbiBgdmFsdWVgIHRvIHZhcmlhYmxlLnwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBEZWxldGVBcmc8Tj4oKWAgICAgICAgICB8IERlbGV0ZSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhIHBvaW50ZXIuIHwKK3wgYFNhdmVBcmc8Tj4ocG9pbnRlcilgICAgIHwgU2F2ZSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0byBgKnBvaW50ZXJgLiB8Cit8IGBTYXZlQXJnUG9pbnRlZTxOPihwb2ludGVyKWAgfCBTYXZlIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvIGAqcG9pbnRlcmAuIHwKK3wgYFNldEFyZ1JlZmVyZWU8Tj4odmFsdWUpYCB8CUFzc2lnbiB2YWx1ZSB0byB0aGUgdmFyaWFibGUgcmVmZXJlbmNlZCBieSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudC4gfAorfGBTZXRBcmdQb2ludGVlPE4+KHZhbHVlKWAgfEFzc2lnbiBgdmFsdWVgIHRvIHRoZSB2YXJpYWJsZSBwb2ludGVkIGJ5IHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50LnwKK3xgU2V0QXJndW1lbnRQb2ludGVlPE4+KHZhbHVlKWB8U2FtZSBhcyBgU2V0QXJnUG9pbnRlZTxOPih2YWx1ZSlgLiBEZXByZWNhdGVkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjEuNy4wLnwKK3xgU2V0QXJyYXlBcmd1bWVudDxOPihmaXJzdCwgbGFzdClgfENvcGllcyB0aGUgZWxlbWVudHMgaW4gc291cmNlIHJhbmdlIFtgZmlyc3RgLCBgbGFzdGApIHRvIHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5IHRoZSBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgcG9pbnRlciBvciBhbiBpdGVyYXRvci4gVGhlIGFjdGlvbiBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNvdXJjZSByYW5nZS58Cit8YFNldEVycm5vQW5kUmV0dXJuKGVycm9yLCB2YWx1ZSlgfFNldCBgZXJybm9gIHRvIGBlcnJvcmAgYW5kIHJldHVybiBgdmFsdWVgLnwKK3xgVGhyb3coZXhjZXB0aW9uKWAgICAgICAgIHxUaHJvd3MgdGhlIGdpdmVuIGV4Y2VwdGlvbiwgd2hpY2ggY2FuIGJlIGFueSBjb3B5YWJsZSB2YWx1ZS4gQXZhaWxhYmxlIHNpbmNlIHYxLjEuMC58CisKKyMjIFVzaW5nIGEgRnVuY3Rpb24gb3IgYSBGdW5jdG9yIGFzIGFuIEFjdGlvbiAjIworCit8YEludm9rZShmKWB8SW52b2tlIGBmYCB3aXRoIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBtb2NrIGZ1bmN0aW9uLCB3aGVyZSBgZmAgY2FuIGJlIGEgZ2xvYmFsL3N0YXRpYyBmdW5jdGlvbiBvciBhIGZ1bmN0b3IufAorfDotLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgSW52b2tlKG9iamVjdF9wb2ludGVyLCAmY2xhc3M6Om1ldGhvZClgfEludm9rZSB0aGUge21ldGhvZCBvbiB0aGUgb2JqZWN0IHdpdGggdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIG1vY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgSW52b2tlV2l0aG91dEFyZ3MoZilgfEludm9rZSBgZmAsIHdoaWNoIGNhbiBiZSBhIGdsb2JhbC9zdGF0aWMgZnVuY3Rpb24gb3IgYSBmdW5jdG9yLiBgZmAgbXVzdCB0YWtlIG5vIGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgIHwKK3xgSW52b2tlV2l0aG91dEFyZ3Mob2JqZWN0X3BvaW50ZXIsICZjbGFzczo6bWV0aG9kKWB8SW52b2tlIHRoZSBtZXRob2Qgb24gdGhlIG9iamVjdCwgd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfGBJbnZva2VBcmd1bWVudDxOPihhcmcxLCBhcmcyLCAuLi4sIGFyZ2spYHxJbnZva2UgdGhlIG1vY2sgZnVuY3Rpb24ncyBgTmAtdGggKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYSBmdW5jdG9yLCB3aXRoIHRoZSBga2AgYXJndW1lbnRzLnwKKworVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgaW52b2tlZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUKK29mIHRoZSBhY3Rpb24uCisKK1doZW4gZGVmaW5pbmcgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRvIGJlIHVzZWQgd2l0aCBgSW52b2tlKigpYCwgeW91IGNhbiBkZWNsYXJlIGFueSB1bnVzZWQgcGFyYW1ldGVycyBhcyBgVW51c2VkYDoKK2BgYAorICBkb3VibGUgRGlzdGFuY2UoVW51c2VkLCBkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsgfQorICAuLi4KKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKCJIaSIsIF8sIF8pKS5XaWxsT25jZShJbnZva2UoRGlzdGFuY2UpKTsKK2BgYAorCitJbiBgSW52b2tlQXJndW1lbnQ8Tj4oLi4uKWAsIGlmIGFuIGFyZ3VtZW50IG5lZWRzIHRvIGJlIHBhc3NlZCBieSByZWZlcmVuY2UsIHdyYXAgaXQgaW5zaWRlIGBCeVJlZigpYC4gRm9yIGV4YW1wbGUsCitgYGAKKyAgSW52b2tlQXJndW1lbnQ8Mj4oNSwgc3RyaW5nKCJIaSIpLCBCeVJlZihmb28pKQorYGBgCitjYWxscyB0aGUgbW9jayBmdW5jdGlvbidzICMyIGFyZ3VtZW50LCBwYXNzaW5nIHRvIGl0IGA1YCBhbmQgYHN0cmluZygiSGkiKWAgYnkgdmFsdWUsIGFuZCBgZm9vYCBieSByZWZlcmVuY2UuCisKKyMjIERlZmF1bHQgQWN0aW9uICMjCisKK3xgRG9EZWZhdWx0KClgfERvIHRoZSBkZWZhdWx0IGFjdGlvbiAoc3BlY2lmaWVkIGJ5IGBPTl9DQUxMKClgIG9yIHRoZSBidWlsdC1pbiBvbmUpLnwKK3w6LS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworKipOb3RlOioqIGR1ZSB0byB0ZWNobmljYWwgcmVhc29ucywgYERvRGVmYXVsdCgpYCBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgIGEgY29tcG9zaXRlIGFjdGlvbiAtIHRyeWluZyB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBhIHJ1bi10aW1lIGVycm9yLgorCisjIyBDb21wb3NpdGUgQWN0aW9ucyAjIworCit8YERvQWxsKGExLCBhMiwgLi4uLCBhbilgfERvIGFsbCBhY3Rpb25zIGBhMWAgdG8gYGFuYCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2YgYGFuYCBpbiBlYWNoIGludm9jYXRpb24uIFRoZSBmaXJzdCBgbiAtIDFgIHN1Yi1hY3Rpb25zIG11c3QgcmV0dXJuIHZvaWQuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfGBJZ25vcmVSZXN1bHQoYSlgICAgICAgIHxQZXJmb3JtIGFjdGlvbiBgYWAgYW5kIGlnbm9yZSBpdHMgcmVzdWx0LiBgYWAgbXVzdCBub3QgcmV0dXJuIHZvaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8YFdpdGhBcmc8Tj4oYSlgICAgICAgICAgfFBhc3MgdGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYWN0aW9uIGBhYCBhbmQgcGVyZm9ybSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3xgV2l0aEFyZ3M8TjEsIE4yLCAuLi4sIE5rPihhKWB8UGFzcyB0aGUgc2VsZWN0ZWQgKDAtYmFzZWQpIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhY3Rpb24gYGFgIGFuZCBwZXJmb3JtIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfGBXaXRob3V0QXJncyhhKWAgICAgICAgIHxQZXJmb3JtIGFjdGlvbiBgYWAgd2l0aG91dCBhbnkgYXJndW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKyMjIERlZmluaW5nIEFjdGlvbnMgIyMKKworfCBgQUNUSU9OKFN1bSkgeyByZXR1cm4gYXJnMCArIGFyZzE7IH1gIHwgRGVmaW5lcyBhbiBhY3Rpb24gYFN1bSgpYCB0byByZXR1cm4gdGhlIHN1bSBvZiB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50ICMwIGFuZCAjMS4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgQUNUSU9OX1AoUGx1cywgbikgeyByZXR1cm4gYXJnMCArIG47IH1gIHwgRGVmaW5lcyBhbiBhY3Rpb24gYFBsdXMobilgIHRvIHJldHVybiB0aGUgc3VtIG9mIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnQgIzAgYW5kIGBuYC4gfAorfCBgQUNUSU9OX1BrKEZvbywgcDEsIC4uLiwgcGspIHsgc3RhdGVtZW50czsgfWAgfCBEZWZpbmVzIGEgcGFyYW1ldGVyaXplZCBhY3Rpb24gYEZvbyhwMSwgLi4uLCBwaylgIHRvIGV4ZWN1dGUgdGhlIGdpdmVuIGBzdGF0ZW1lbnRzYC4gICB8CisKK1RoZSBgQUNUSU9OKmAgbWFjcm9zIGNhbm5vdCBiZSB1c2VkIGluc2lkZSBhIGZ1bmN0aW9uIG9yIGNsYXNzLgorCisjIENhcmRpbmFsaXRpZXMgIworCitUaGVzZSBhcmUgdXNlZCBpbiBgVGltZXMoKWAgdG8gc3BlY2lmeSBob3cgbWFueSB0aW1lcyBhIG1vY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQ6CisKK3xgQW55TnVtYmVyKClgfFRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMufAorfDotLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8YEF0TGVhc3QobilgIHxUaGUgY2FsbCBpcyBleHBlY3RlZCBhdCBsZWFzdCBgbmAgdGltZXMuICAgICAgIHwKK3xgQXRNb3N0KG4pYCAgfFRoZSBjYWxsIGlzIGV4cGVjdGVkIGF0IG1vc3QgYG5gIHRpbWVzLiAgICAgICAgfAorfGBCZXR3ZWVuKG0sIG4pYHxUaGUgY2FsbCBpcyBleHBlY3RlZCBiZXR3ZWVuIGBtYCBhbmQgYG5gIChpbmNsdXNpdmUpIHRpbWVzLnwKK3xgRXhhY3RseShuKSBvciBuYHxUaGUgY2FsbCBpcyBleHBlY3RlZCBleGFjdGx5IGBuYCB0aW1lcy4gSW4gcGFydGljdWxhciwgdGhlIGNhbGwgc2hvdWxkIG5ldmVyIGhhcHBlbiB3aGVuIGBuYCBpcyAwLnwKKworIyBFeHBlY3RhdGlvbiBPcmRlciAjCisKK0J5IGRlZmF1bHQsIHRoZSBleHBlY3RhdGlvbnMgY2FuIGJlIG1hdGNoZWQgaW4gX2FueV8gb3JkZXIuICBJZiBzb21lCitvciBhbGwgZXhwZWN0YXRpb25zIG11c3QgYmUgbWF0Y2hlZCBpbiBhIGdpdmVuIG9yZGVyLCB0aGVyZSBhcmUgdHdvCit3YXlzIHRvIHNwZWNpZnkgaXQuICBUaGV5IGNhbiBiZSB1c2VkIGVpdGhlciBpbmRlcGVuZGVudGx5IG9yCit0b2dldGhlci4KKworIyMgVGhlIEFmdGVyIENsYXVzZSAjIworCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RXhwZWN0YXRpb247CisuLi4KK0V4cGVjdGF0aW9uIGluaXRfeCA9IEVYUEVDVF9DQUxMKGZvbywgSW5pdFgoKSk7CitFeHBlY3RhdGlvbiBpbml0X3kgPSBFWFBFQ1RfQ0FMTChmb28sIEluaXRZKCkpOworRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkKKyAgICAuQWZ0ZXIoaW5pdF94LCBpbml0X3kpOworYGBgCitzYXlzIHRoYXQgYEJhcigpYCBjYW4gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYm90aCBgSW5pdFgoKWAgYW5kCitgSW5pdFkoKWAgaGF2ZSBiZWVuIGNhbGxlZC4KKworSWYgeW91IGRvbid0IGtub3cgaG93IG1hbnkgcHJlLXJlcXVpc2l0ZXMgYW4gZXhwZWN0YXRpb24gaGFzIHdoZW4geW91Cit3cml0ZSBpdCwgeW91IGNhbiB1c2UgYW4gYEV4cGVjdGF0aW9uU2V0YCB0byBjb2xsZWN0IHRoZW06CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpFeHBlY3RhdGlvblNldDsKKy4uLgorRXhwZWN0YXRpb25TZXQgYWxsX2luaXRzOworZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50X2NvdW50OyBpKyspIHsKKyAgYWxsX2luaXRzICs9IEVYUEVDVF9DQUxMKGZvbywgSW5pdEVsZW1lbnQoaSkpOworfQorRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkKKyAgICAuQWZ0ZXIoYWxsX2luaXRzKTsKK2BgYAorc2F5cyB0aGF0IGBCYXIoKWAgY2FuIGJlIGNhbGxlZCBvbmx5IGFmdGVyIGFsbCBlbGVtZW50cyBoYXZlIGJlZW4KK2luaXRpYWxpemVkIChidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB3aGljaCBlbGVtZW50cyBnZXQgaW5pdGlhbGl6ZWQKK2JlZm9yZSB0aGUgb3RoZXJzKS4KKworTW9kaWZ5aW5nIGFuIGBFeHBlY3RhdGlvblNldGAgYWZ0ZXIgdXNpbmcgaXQgaW4gYW4gYC5BZnRlcigpYCBkb2Vzbid0CithZmZlY3QgdGhlIG1lYW5pbmcgb2YgdGhlIGAuQWZ0ZXIoKWAuCisKKyMjIFNlcXVlbmNlcyAjIworCitXaGVuIHlvdSBoYXZlIGEgbG9uZyBjaGFpbiBvZiBzZXF1ZW50aWFsIGV4cGVjdGF0aW9ucywgaXQncyBlYXNpZXIgdG8KK3NwZWNpZnkgdGhlIG9yZGVyIHVzaW5nICoqc2VxdWVuY2VzKiosIHdoaWNoIGRvbid0IHJlcXVpcmUgeW91IHRvIGdpdmVuCitlYWNoIGV4cGVjdGF0aW9uIGluIHRoZSBjaGFpbiBhIGRpZmZlcmVudCBuYW1lLiAgPGk+QWxsIGV4cGVjdGVkPGJyPgorY2FsbHM8L2k+IGluIHRoZSBzYW1lIHNlcXVlbmNlIG11c3Qgb2NjdXIgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCitzcGVjaWZpZWQuCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpTZXF1ZW5jZTsKK1NlcXVlbmNlIHMxLCBzMjsKKy4uLgorRVhQRUNUX0NBTEwoZm9vLCBSZXNldCgpKQorICAgIC5JblNlcXVlbmNlKHMxLCBzMikKKyAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKK0VYUEVDVF9DQUxMKGZvbywgR2V0U2l6ZSgpKQorICAgIC5JblNlcXVlbmNlKHMxKQorICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOworRVhQRUNUX0NBTEwoZm9vLCBEZXNjcmliZShBPGNvbnN0IGNoYXIqPigpKSkKKyAgICAuSW5TZXF1ZW5jZShzMikKKyAgICAuV2lsbE9uY2UoUmV0dXJuKCJkdW1teSIpKTsKK2BgYAorc2F5cyB0aGF0IGBSZXNldCgpYCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgX2JvdGhfIGBHZXRTaXplKClgIF9hbmRfCitgRGVzY3JpYmUoKWAsIGFuZCB0aGUgbGF0dGVyIHR3byBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLgorCitUbyBwdXQgbWFueSBleHBlY3RhdGlvbnMgaW4gYSBzZXF1ZW5jZSBjb252ZW5pZW50bHk6CitgYGAKK3VzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsKK3sKKyAgSW5TZXF1ZW5jZSBkdW1teTsKKworICBFWFBFQ1RfQ0FMTCguLi4pLi4uOworICBFWFBFQ1RfQ0FMTCguLi4pLi4uOworICAuLi4KKyAgRVhQRUNUX0NBTEwoLi4uKS4uLjsKK30KK2BgYAorc2F5cyB0aGF0IGFsbCBleHBlY3RlZCBjYWxscyBpbiB0aGUgc2NvcGUgb2YgYGR1bW15YCBtdXN0IG9jY3VyIGluCitzdHJpY3Qgb3JkZXIuIFRoZSBuYW1lIGBkdW1teWAgaXMgaXJyZWxldmFudC4pCisKKyMgVmVyaWZ5aW5nIGFuZCBSZXNldHRpbmcgYSBNb2NrICMKKworR29vZ2xlIE1vY2sgd2lsbCB2ZXJpZnkgdGhlIGV4cGVjdGF0aW9ucyBvbiBhIG1vY2sgb2JqZWN0IHdoZW4gaXQgaXMgZGVzdHJ1Y3RlZCwgb3IgeW91IGNhbiBkbyBpdCBlYXJsaWVyOgorYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok1vY2s7CisuLi4KKy8vIFZlcmlmaWVzIGFuZCByZW1vdmVzIHRoZSBleHBlY3RhdGlvbnMgb24gbW9ja19vYmo7CisvLyByZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCitNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19vYmopOworLi4uCisvLyBWZXJpZmllcyBhbmQgcmVtb3ZlcyB0aGUgZXhwZWN0YXRpb25zIG9uIG1vY2tfb2JqOworLy8gYWxzbyByZW1vdmVzIHRoZSBkZWZhdWx0IGFjdGlvbnMgc2V0IGJ5IE9OX0NBTEwoKTsKKy8vIHJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KK01vY2s6OlZlcmlmeUFuZENsZWFyKCZtb2NrX29iaik7CitgYGAKKworWW91IGNhbiBhbHNvIHRlbGwgR29vZ2xlIE1vY2sgdGhhdCBhIG1vY2sgb2JqZWN0IGNhbiBiZSBsZWFrZWQgYW5kIGRvZXNuJ3QKK25lZWQgdG8gYmUgdmVyaWZpZWQ6CitgYGAKK01vY2s6OkFsbG93TGVhaygmbW9ja19vYmopOworYGBgCisKKyMgTW9jayBDbGFzc2VzICMKKworR29vZ2xlIE1vY2sgZGVmaW5lcyBhIGNvbnZlbmllbnQgbW9jayBjbGFzcyB0ZW1wbGF0ZQorYGBgCitjbGFzcyBNb2NrRnVuY3Rpb248UihBMSwgLi4uLCBBbik+IHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EbihDYWxsLCBSKEExLCAuLi4sIEFuKSk7Cit9OworYGBgCitTZWUgdGhpcyBbcmVjaXBlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL1YxXzdfQ29va0Jvb2sjVXNpbmdfQ2hlY2tfUG9pbnRzKSBmb3Igb25lIGFwcGxpY2F0aW9uIG9mIGl0LgorCisjIEZsYWdzICMKKworfCBgLS1nbW9ja19jYXRjaF9sZWFrZWRfbW9ja3M9MGAgfCBEb24ndCByZXBvcnQgbGVha2VkIG1vY2sgb2JqZWN0cyBhcyBmYWlsdXJlcy4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgLS1nbW9ja192ZXJib3NlPUxFVkVMYCAgICAgICAgfCBTZXRzIHRoZSBkZWZhdWx0IHZlcmJvc2l0eSBsZXZlbCAoYGluZm9gLCBgd2FybmluZ2AsIG9yIGBlcnJvcmApIG9mIEdvb2dsZSBNb2NrIG1lc3NhZ2VzLiB8ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNy9Db29rQm9vay5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzcvQ29va0Jvb2subWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5YTAwMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzcvQ29va0Jvb2subWQKQEAgLTAsMCArMSwzNDMyIEBACisKKworWW91IGNhbiBmaW5kIHJlY2lwZXMgZm9yIHVzaW5nIEdvb2dsZSBNb2NrIGhlcmUuIElmIHlvdSBoYXZlbid0IHlldCwKK3BsZWFzZSByZWFkIHRoZSBbRm9yRHVtbWllc10oVjFfN19Gb3JEdW1taWVzLm1kKSBkb2N1bWVudCBmaXJzdCB0byBtYWtlIHN1cmUgeW91IHVuZGVyc3RhbmQKK3RoZSBiYXNpY3MuCisKKyoqTm90ZToqKiBHb29nbGUgTW9jayBsaXZlcyBpbiB0aGUgYHRlc3RpbmdgIG5hbWUgc3BhY2UuIEZvcgorcmVhZGFiaWxpdHksIGl0IGlzIHJlY29tbWVuZGVkIHRvIHdyaXRlIGB1c2luZyA6OnRlc3Rpbmc6OkZvbztgIG9uY2UgaW4KK3lvdXIgZmlsZSBiZWZvcmUgdXNpbmcgdGhlIG5hbWUgYEZvb2AgZGVmaW5lZCBieSBHb29nbGUgTW9jay4gV2Ugb21pdAorc3VjaCBgdXNpbmdgIHN0YXRlbWVudHMgaW4gdGhpcyBwYWdlIGZvciBicmV2aXR5LCBidXQgeW91IHNob3VsZCBkbyBpdAoraW4geW91ciBvd24gY29kZS4KKworIyBDcmVhdGluZyBNb2NrIENsYXNzZXMgIworCisjIyBNb2NraW5nIFByaXZhdGUgb3IgUHJvdGVjdGVkIE1ldGhvZHMgIyMKKworWW91IG11c3QgYWx3YXlzIHB1dCBhIG1vY2sgbWV0aG9kIGRlZmluaXRpb24gKGBNT0NLX01FVEhPRCpgKSBpbiBhCitgcHVibGljOmAgc2VjdGlvbiBvZiB0aGUgbW9jayBjbGFzcywgcmVnYXJkbGVzcyBvZiB0aGUgbWV0aG9kIGJlaW5nCittb2NrZWQgYmVpbmcgYHB1YmxpY2AsIGBwcm90ZWN0ZWRgLCBvciBgcHJpdmF0ZWAgaW4gdGhlIGJhc2UgY2xhc3MuCitUaGlzIGFsbG93cyBgT05fQ0FMTGAgYW5kIGBFWFBFQ1RfQ0FMTGAgdG8gcmVmZXJlbmNlIHRoZSBtb2NrIGZ1bmN0aW9uCitmcm9tIG91dHNpZGUgb2YgdGhlIG1vY2sgY2xhc3MuICAoWWVzLCBDKysgYWxsb3dzIGEgc3ViY2xhc3MgdG8gY2hhbmdlCit0aGUgYWNjZXNzIGxldmVsIG9mIGEgdmlydHVhbCBmdW5jdGlvbiBpbiB0aGUgYmFzZSBjbGFzcy4pICBFeGFtcGxlOgorCitgYGAKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCBib29sIFRyYW5zZm9ybShHYWRnZXQqIGcpID0gMDsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFJlc3VtZSgpOworCisgcHJpdmF0ZToKKyAgdmlydHVhbCBpbnQgR2V0VGltZU91dCgpOworfTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgLi4uCisgIE1PQ0tfTUVUSE9EMShUcmFuc2Zvcm0sIGJvb2woR2FkZ2V0KiBnKSk7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtdXN0IGJlIGluIHRoZSBwdWJsaWMgc2VjdGlvbiwgZXZlbiB0aG91Z2ggdGhlCisgIC8vIG1ldGhvZHMgYXJlIHByb3RlY3RlZCBvciBwcml2YXRlIGluIHRoZSBiYXNlIGNsYXNzLgorICBNT0NLX01FVEhPRDAoUmVzdW1lLCB2b2lkKCkpOworICBNT0NLX01FVEhPRDAoR2V0VGltZU91dCwgaW50KCkpOworfTsKK2BgYAorCisjIyBNb2NraW5nIE92ZXJsb2FkZWQgTWV0aG9kcyAjIworCitZb3UgY2FuIG1vY2sgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgYXMgdXN1YWwuIE5vIHNwZWNpYWwgYXR0ZW50aW9uIGlzIHJlcXVpcmVkOgorCitgYGAKK2NsYXNzIEZvbyB7CisgIC4uLgorCisgIC8vIE11c3QgYmUgdmlydHVhbCBhcyB3ZSdsbCBpbmhlcml0IGZyb20gRm9vLgorICB2aXJ0dWFsIH5Gb28oKTsKKworICAvLyBPdmVybG9hZGVkIG9uIHRoZSB0eXBlcyBhbmQvb3IgbnVtYmVycyBvZiBhcmd1bWVudHMuCisgIHZpcnR1YWwgaW50IEFkZChFbGVtZW50IHgpOworICB2aXJ0dWFsIGludCBBZGQoaW50IHRpbWVzLCBFbGVtZW50IHgpOworCisgIC8vIE92ZXJsb2FkZWQgb24gdGhlIGNvbnN0LW5lc3Mgb2YgdGhpcyBvYmplY3QuCisgIHZpcnR1YWwgQmFyJiBHZXRCYXIoKTsKKyAgdmlydHVhbCBjb25zdCBCYXImIEdldEJhcigpIGNvbnN0OworfTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgTU9DS19NRVRIT0QxKEFkZCwgaW50KEVsZW1lbnQgeCkpOworICBNT0NLX01FVEhPRDIoQWRkLCBpbnQoaW50IHRpbWVzLCBFbGVtZW50IHgpOworCisgIE1PQ0tfTUVUSE9EMChHZXRCYXIsIEJhciYoKSk7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRCYXIsIGNvbnN0IEJhciYoKSk7Cit9OworYGBgCisKKyoqTm90ZToqKiBpZiB5b3UgZG9uJ3QgbW9jayBhbGwgdmVyc2lvbnMgb2YgdGhlIG92ZXJsb2FkZWQgbWV0aG9kLCB0aGUKK2NvbXBpbGVyIHdpbGwgZ2l2ZSB5b3UgYSB3YXJuaW5nIGFib3V0IHNvbWUgbWV0aG9kcyBpbiB0aGUgYmFzZSBjbGFzcworYmVpbmcgaGlkZGVuLiBUbyBmaXggdGhhdCwgdXNlIGB1c2luZ2AgdG8gYnJpbmcgdGhlbSBpbiBzY29wZToKKworYGBgCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgIC4uLgorICB1c2luZyBGb286OkFkZDsKKyAgTU9DS19NRVRIT0QxKEFkZCwgaW50KEVsZW1lbnQgeCkpOworICAvLyBXZSBkb24ndCB3YW50IHRvIG1vY2sgaW50IEFkZChpbnQgdGltZXMsIEVsZW1lbnQgeCk7CisgIC4uLgorfTsKK2BgYAorCisjIyBNb2NraW5nIENsYXNzIFRlbXBsYXRlcyAjIworCitUbyBtb2NrIGEgY2xhc3MgdGVtcGxhdGUsIGFwcGVuZCBgX1RgIHRvIHRoZSBgTU9DS18qYCBtYWNyb3M6CisKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW0+CitjbGFzcyBTdGFja0ludGVyZmFjZSB7CisgIC4uLgorICAvLyBNdXN0IGJlIHZpcnR1YWwgYXMgd2UnbGwgaW5oZXJpdCBmcm9tIFN0YWNrSW50ZXJmYWNlLgorICB2aXJ0dWFsIH5TdGFja0ludGVyZmFjZSgpOworCisgIHZpcnR1YWwgaW50IEdldFNpemUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBQdXNoKGNvbnN0IEVsZW0mIHgpID0gMDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtPgorY2xhc3MgTW9ja1N0YWNrIDogcHVibGljIFN0YWNrSW50ZXJmYWNlPEVsZW0+IHsKKyAgLi4uCisgIE1PQ0tfQ09OU1RfTUVUSE9EMF9UKEdldFNpemUsIGludCgpKTsKKyAgTU9DS19NRVRIT0QxX1QoUHVzaCwgdm9pZChjb25zdCBFbGVtJiB4KSk7Cit9OworYGBgCisKKyMjIE1vY2tpbmcgTm9udmlydHVhbCBNZXRob2RzICMjCisKK0dvb2dsZSBNb2NrIGNhbiBtb2NrIG5vbi12aXJ0dWFsIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGluIHdoYXQgd2UgY2FsbCBfaGktcGVyZgorZGVwZW5kZW5jeSBpbmplY3Rpb25fLgorCitJbiB0aGlzIGNhc2UsIGluc3RlYWQgb2Ygc2hhcmluZyBhIGNvbW1vbiBiYXNlIGNsYXNzIHdpdGggdGhlIHJlYWwKK2NsYXNzLCB5b3VyIG1vY2sgY2xhc3Mgd2lsbCBiZSBfdW5yZWxhdGVkXyB0byB0aGUgcmVhbCBjbGFzcywgYnV0Citjb250YWluIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVzLiAgVGhlIHN5bnRheCBmb3IgbW9ja2luZworbm9uLXZpcnR1YWwgbWV0aG9kcyBpcyB0aGUgX3NhbWVfIGFzIG1vY2tpbmcgdmlydHVhbCBtZXRob2RzOgorCitgYGAKKy8vIEEgc2ltcGxlIHBhY2tldCBzdHJlYW0gY2xhc3MuICBOb25lIG9mIGl0cyBtZW1iZXJzIGlzIHZpcnR1YWwuCitjbGFzcyBDb25jcmV0ZVBhY2tldFN0cmVhbSB7CisgcHVibGljOgorICB2b2lkIEFwcGVuZFBhY2tldChQYWNrZXQqIG5ld19wYWNrZXQpOworICBjb25zdCBQYWNrZXQqIEdldFBhY2tldChzaXplX3QgcGFja2V0X251bWJlcikgY29uc3Q7CisgIHNpemVfdCBOdW1iZXJPZlBhY2tldHMoKSBjb25zdDsKKyAgLi4uCit9OworCisvLyBBIG1vY2sgcGFja2V0IHN0cmVhbSBjbGFzcy4gIEl0IGluaGVyaXRzIGZyb20gbm8gb3RoZXIsIGJ1dCBkZWZpbmVzCisvLyBHZXRQYWNrZXQoKSBhbmQgTnVtYmVyT2ZQYWNrZXRzKCkuCitjbGFzcyBNb2NrUGFja2V0U3RyZWFtIHsKKyBwdWJsaWM6CisgIE1PQ0tfQ09OU1RfTUVUSE9EMShHZXRQYWNrZXQsIGNvbnN0IFBhY2tldCooc2l6ZV90IHBhY2tldF9udW1iZXIpKTsKKyAgTU9DS19DT05TVF9NRVRIT0QwKE51bWJlck9mUGFja2V0cywgc2l6ZV90KCkpOworICAuLi4KK307CitgYGAKKworTm90ZSB0aGF0IHRoZSBtb2NrIGNsYXNzIGRvZXNuJ3QgZGVmaW5lIGBBcHBlbmRQYWNrZXQoKWAsIHVubGlrZSB0aGUKK3JlYWwgY2xhc3MuIFRoYXQncyBmaW5lIGFzIGxvbmcgYXMgdGhlIHRlc3QgZG9lc24ndCBuZWVkIHRvIGNhbGwgaXQuCisKK05leHQsIHlvdSBuZWVkIGEgd2F5IHRvIHNheSB0aGF0IHlvdSB3YW50IHRvIHVzZQorYENvbmNyZXRlUGFja2V0U3RyZWFtYCBpbiBwcm9kdWN0aW9uIGNvZGUsIGFuZCB1c2UgYE1vY2tQYWNrZXRTdHJlYW1gCitpbiB0ZXN0cy4gIFNpbmNlIHRoZSBmdW5jdGlvbnMgYXJlIG5vdCB2aXJ0dWFsIGFuZCB0aGUgdHdvIGNsYXNzZXMgYXJlCit1bnJlbGF0ZWQsIHlvdSBtdXN0IHNwZWNpZnkgeW91ciBjaG9pY2UgYXQgX2NvbXBpbGUgdGltZV8gKGFzIG9wcG9zZWQKK3RvIHJ1biB0aW1lKS4KKworT25lIHdheSB0byBkbyBpdCBpcyB0byB0ZW1wbGF0aXplIHlvdXIgY29kZSB0aGF0IG5lZWRzIHRvIHVzZSBhIHBhY2tldAorc3RyZWFtLiAgTW9yZSBzcGVjaWZpY2FsbHksIHlvdSB3aWxsIGdpdmUgeW91ciBjb2RlIGEgdGVtcGxhdGUgdHlwZQorYXJndW1lbnQgZm9yIHRoZSB0eXBlIG9mIHRoZSBwYWNrZXQgc3RyZWFtLiAgSW4gcHJvZHVjdGlvbiwgeW91IHdpbGwKK2luc3RhbnRpYXRlIHlvdXIgdGVtcGxhdGUgd2l0aCBgQ29uY3JldGVQYWNrZXRTdHJlYW1gIGFzIHRoZSB0eXBlCithcmd1bWVudC4gIEluIHRlc3RzLCB5b3Ugd2lsbCBpbnN0YW50aWF0ZSB0aGUgc2FtZSB0ZW1wbGF0ZSB3aXRoCitgTW9ja1BhY2tldFN0cmVhbWAuICBGb3IgZXhhbXBsZSwgeW91IG1heSB3cml0ZToKKworYGBgCit0ZW1wbGF0ZSA8Y2xhc3MgUGFja2V0U3RyZWFtPgordm9pZCBDcmVhdGVDb25uZWN0aW9uKFBhY2tldFN0cmVhbSogc3RyZWFtKSB7IC4uLiB9CisKK3RlbXBsYXRlIDxjbGFzcyBQYWNrZXRTdHJlYW0+CitjbGFzcyBQYWNrZXRSZWFkZXIgeworIHB1YmxpYzoKKyAgdm9pZCBSZWFkUGFja2V0cyhQYWNrZXRTdHJlYW0qIHN0cmVhbSwgc2l6ZV90IHBhY2tldF9udW0pOworfTsKK2BgYAorCitUaGVuIHlvdSBjYW4gdXNlIGBDcmVhdGVDb25uZWN0aW9uPENvbmNyZXRlUGFja2V0U3RyZWFtPigpYCBhbmQKK2BQYWNrZXRSZWFkZXI8Q29uY3JldGVQYWNrZXRTdHJlYW0+YCBpbiBwcm9kdWN0aW9uIGNvZGUsIGFuZCB1c2UKK2BDcmVhdGVDb25uZWN0aW9uPE1vY2tQYWNrZXRTdHJlYW0+KClgIGFuZAorYFBhY2tldFJlYWRlcjxNb2NrUGFja2V0U3RyZWFtPmAgaW4gdGVzdHMuCisKK2BgYAorICBNb2NrUGFja2V0U3RyZWFtIG1vY2tfc3RyZWFtOworICBFWFBFQ1RfQ0FMTChtb2NrX3N0cmVhbSwgLi4uKS4uLjsKKyAgLi4gc2V0IG1vcmUgZXhwZWN0YXRpb25zIG9uIG1vY2tfc3RyZWFtIC4uLgorICBQYWNrZXRSZWFkZXI8TW9ja1BhY2tldFN0cmVhbT4gcmVhZGVyKCZtb2NrX3N0cmVhbSk7CisgIC4uLiBleGVyY2lzZSByZWFkZXIgLi4uCitgYGAKKworIyMgTW9ja2luZyBGcmVlIEZ1bmN0aW9ucyAjIworCitJdCdzIHBvc3NpYmxlIHRvIHVzZSBHb29nbGUgTW9jayB0byBtb2NrIGEgZnJlZSBmdW5jdGlvbiAoaS5lLiBhCitDLXN0eWxlIGZ1bmN0aW9uIG9yIGEgc3RhdGljIG1ldGhvZCkuICBZb3UganVzdCBuZWVkIHRvIHJld3JpdGUgeW91cgorY29kZSB0byB1c2UgYW4gaW50ZXJmYWNlIChhYnN0cmFjdCBjbGFzcykuCisKK0luc3RlYWQgb2YgY2FsbGluZyBhIGZyZWUgZnVuY3Rpb24gKHNheSwgYE9wZW5GaWxlYCkgZGlyZWN0bHksCitpbnRyb2R1Y2UgYW4gaW50ZXJmYWNlIGZvciBpdCBhbmQgaGF2ZSBhIGNvbmNyZXRlIHN1YmNsYXNzIHRoYXQgY2FsbHMKK3RoZSBmcmVlIGZ1bmN0aW9uOgorCitgYGAKK2NsYXNzIEZpbGVJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgYm9vbCBPcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpID0gMDsKK307CisKK2NsYXNzIEZpbGUgOiBwdWJsaWMgRmlsZUludGVyZmFjZSB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCBib29sIE9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSkgeworICAgIHJldHVybiBPcGVuRmlsZShwYXRoLCBtb2RlKTsKKyAgfQorfTsKK2BgYAorCitZb3VyIGNvZGUgc2hvdWxkIHRhbGsgdG8gYEZpbGVJbnRlcmZhY2VgIHRvIG9wZW4gYSBmaWxlLiAgTm93IGl0J3MKK2Vhc3kgdG8gbW9jayBvdXQgdGhlIGZ1bmN0aW9uLgorCitUaGlzIG1heSBzZWVtIG11Y2ggaGFzc2xlLCBidXQgaW4gcHJhY3RpY2UgeW91IG9mdGVuIGhhdmUgbXVsdGlwbGUKK3JlbGF0ZWQgZnVuY3Rpb25zIHRoYXQgeW91IGNhbiBwdXQgaW4gdGhlIHNhbWUgaW50ZXJmYWNlLCBzbyB0aGUKK3Blci1mdW5jdGlvbiBzeW50YWN0aWMgb3ZlcmhlYWQgd2lsbCBiZSBtdWNoIGxvd2VyLgorCitJZiB5b3UgYXJlIGNvbmNlcm5lZCBhYm91dCB0aGUgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgaW5jdXJyZWQgYnkKK3ZpcnR1YWwgZnVuY3Rpb25zLCBhbmQgcHJvZmlsaW5nIGNvbmZpcm1zIHlvdXIgY29uY2VybiwgeW91IGNhbgorY29tYmluZSB0aGlzIHdpdGggdGhlIHJlY2lwZSBmb3IgW21vY2tpbmcgbm9uLXZpcnR1YWwgbWV0aG9kc10oI01vY2tpbmdfTm9udmlydHVhbF9NZXRob2RzLm1kKS4KKworIyMgVGhlIE5pY2UsIHRoZSBTdHJpY3QsIGFuZCB0aGUgTmFnZ3kgIyMKKworSWYgYSBtb2NrIG1ldGhvZCBoYXMgbm8gYEVYUEVDVF9DQUxMYCBzcGVjIGJ1dCBpcyBjYWxsZWQsIEdvb2dsZSBNb2NrCit3aWxsIHByaW50IGEgd2FybmluZyBhYm91dCB0aGUgInVuaW50ZXJlc3RpbmcgY2FsbCIuIFRoZSByYXRpb25hbGUgaXM6CisKKyAgKiBOZXcgbWV0aG9kcyBtYXkgYmUgYWRkZWQgdG8gYW4gaW50ZXJmYWNlIGFmdGVyIGEgdGVzdCBpcyB3cml0dGVuLiBXZSBzaG91bGRuJ3QgZmFpbCBhIHRlc3QganVzdCBiZWNhdXNlIGEgbWV0aG9kIGl0IGRvZXNuJ3Qga25vdyBhYm91dCBpcyBjYWxsZWQuCisgICogSG93ZXZlciwgdGhpcyBtYXkgYWxzbyBtZWFuIHRoZXJlJ3MgYSBidWcgaW4gdGhlIHRlc3QsIHNvIEdvb2dsZSBNb2NrIHNob3VsZG4ndCBiZSBzaWxlbnQgZWl0aGVyLiBJZiB0aGUgdXNlciBiZWxpZXZlcyB0aGVzZSBjYWxscyBhcmUgaGFybWxlc3MsIGhlIGNhbiBhZGQgYW4gYEVYUEVDVF9DQUxMKClgIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nLgorCitIb3dldmVyLCBzb21ldGltZXMgeW91IG1heSB3YW50IHRvIHN1cHByZXNzIGFsbCAidW5pbnRlcmVzdGluZyBjYWxsIgord2FybmluZ3MsIHdoaWxlIHNvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdGhlIG9wcG9zaXRlLCBpLmUuIHRvIHRyZWF0IGFsbAorb2YgdGhlbSBhcyBlcnJvcnMuIEdvb2dsZSBNb2NrIGxldHMgeW91IG1ha2UgdGhlIGRlY2lzaW9uIG9uIGEKK3Blci1tb2NrLW9iamVjdCBiYXNpcy4KKworU3VwcG9zZSB5b3VyIHRlc3QgdXNlcyBhIG1vY2sgY2xhc3MgYE1vY2tGb29gOgorCitgYGAKK1RFU1QoLi4uKSB7CisgIE1vY2tGb28gbW9ja19mb287CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBEb1RoaXMoKSk7CisgIC4uLiBjb2RlIHRoYXQgdXNlcyBtb2NrX2ZvbyAuLi4KK30KK2BgYAorCitJZiBhIG1ldGhvZCBvZiBgbW9ja19mb29gIG90aGVyIHRoYW4gYERvVGhpcygpYCBpcyBjYWxsZWQsIGl0IHdpbGwgYmUKK3JlcG9ydGVkIGJ5IEdvb2dsZSBNb2NrIGFzIGEgd2FybmluZy4gSG93ZXZlciwgaWYgeW91IHJld3JpdGUgeW91cgordGVzdCB0byB1c2UgYE5pY2VNb2NrPE1vY2tGb28+YCBpbnN0ZWFkLCB0aGUgd2FybmluZyB3aWxsIGJlIGdvbmUsCityZXN1bHRpbmcgaW4gYSBjbGVhbmVyIHRlc3Qgb3V0cHV0OgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TmljZU1vY2s7CisKK1RFU1QoLi4uKSB7CisgIE5pY2VNb2NrPE1vY2tGb28+IG1vY2tfZm9vOworICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgRG9UaGlzKCkpOworICAuLi4gY29kZSB0aGF0IHVzZXMgbW9ja19mb28gLi4uCit9CitgYGAKKworYE5pY2VNb2NrPE1vY2tGb28+YCBpcyBhIHN1YmNsYXNzIG9mIGBNb2NrRm9vYCwgc28gaXQgY2FuIGJlIHVzZWQKK3doZXJldmVyIGBNb2NrRm9vYCBpcyBhY2NlcHRlZC4KKworSXQgYWxzbyB3b3JrcyBpZiBgTW9ja0Zvb2AncyBjb25zdHJ1Y3RvciB0YWtlcyBzb21lIGFyZ3VtZW50cywgYXMKK2BOaWNlTW9jazxNb2NrRm9vPmAgImluaGVyaXRzIiBgTW9ja0Zvb2AncyBjb25zdHJ1Y3RvcnM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKKworVEVTVCguLi4pIHsKKyAgTmljZU1vY2s8TW9ja0Zvbz4gbW9ja19mb28oNSwgImhpIik7ICAvLyBDYWxscyBNb2NrRm9vKDUsICJoaSIpLgorICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgRG9UaGlzKCkpOworICAuLi4gY29kZSB0aGF0IHVzZXMgbW9ja19mb28gLi4uCit9CitgYGAKKworVGhlIHVzYWdlIG9mIGBTdHJpY3RNb2NrYCBpcyBzaW1pbGFyLCBleGNlcHQgdGhhdCBpdCBtYWtlcyBhbGwKK3VuaW50ZXJlc3RpbmcgY2FsbHMgZmFpbHVyZXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrOworCitURVNUKC4uLikgeworICBTdHJpY3RNb2NrPE1vY2tGb28+IG1vY2tfZm9vOworICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgRG9UaGlzKCkpOworICAuLi4gY29kZSB0aGF0IHVzZXMgbW9ja19mb28gLi4uCisKKyAgLy8gVGhlIHRlc3Qgd2lsbCBmYWlsIGlmIGEgbWV0aG9kIG9mIG1vY2tfZm9vIG90aGVyIHRoYW4gRG9UaGlzKCkKKyAgLy8gaXMgY2FsbGVkLgorfQorYGBgCisKK1RoZXJlIGFyZSBzb21lIGNhdmVhdHMgdGhvdWdoIChJIGRvbid0IGxpa2UgdGhlbSBqdXN0IGFzIG11Y2ggYXMgdGhlCituZXh0IGd1eSwgYnV0IHNhZGx5IHRoZXkgYXJlIHNpZGUgZWZmZWN0cyBvZiBDKysncyBsaW1pdGF0aW9ucyk6CisKKyAgMS4gYE5pY2VNb2NrPE1vY2tGb28+YCBhbmQgYFN0cmljdE1vY2s8TW9ja0Zvbz5gIG9ubHkgd29yayBmb3IgbW9jayBtZXRob2RzIGRlZmluZWQgdXNpbmcgdGhlIGBNT0NLX01FVEhPRCpgIGZhbWlseSBvZiBtYWNyb3MgKipkaXJlY3RseSoqIGluIHRoZSBgTW9ja0Zvb2AgY2xhc3MuIElmIGEgbW9jayBtZXRob2QgaXMgZGVmaW5lZCBpbiBhICoqYmFzZSBjbGFzcyoqIG9mIGBNb2NrRm9vYCwgdGhlICJuaWNlIiBvciAic3RyaWN0IiBtb2RpZmllciBtYXkgbm90IGFmZmVjdCBpdCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlci4gSW4gcGFydGljdWxhciwgbmVzdGluZyBgTmljZU1vY2tgIGFuZCBgU3RyaWN0TW9ja2AgKGUuZy4gYE5pY2VNb2NrPFN0cmljdE1vY2s8TW9ja0Zvbz4gPmApIGlzICoqbm90Kiogc3VwcG9ydGVkLgorICAxLiBUaGUgY29uc3RydWN0b3JzIG9mIHRoZSBiYXNlIG1vY2sgKGBNb2NrRm9vYCkgY2Fubm90IGhhdmUgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3aGljaCBoYXBwZW5zIHRvIGJlIGJhbm5lZCBieSB0aGUgW0dvb2dsZSBDKysgc3R5bGUgZ3VpZGVdKGh0dHA6Ly9nb29nbGUtc3R5bGVndWlkZS5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvY3BwZ3VpZGUueG1sKS4KKyAgMS4gRHVyaW5nIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG9mIGBNb2NrRm9vYCwgdGhlIG1vY2sgb2JqZWN0IGlzIF9ub3RfIG5pY2Ugb3Igc3RyaWN0LiAgVGhpcyBtYXkgY2F1c2Ugc3VycHJpc2VzIGlmIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGNhbGxzIGEgbW9jayBtZXRob2Qgb24gYHRoaXNgIG9iamVjdC4gKFRoaXMgYmVoYXZpb3IsIGhvd2V2ZXIsIGlzIGNvbnNpc3RlbnQgd2l0aCBDKysncyBnZW5lcmFsIHJ1bGU6IGlmIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBjYWxscyBhIHZpcnR1YWwgbWV0aG9kIG9mIGB0aGlzYCBvYmplY3QsIHRoYXQgbWV0aG9kIGlzIHRyZWF0ZWQgYXMgbm9uLXZpcnR1YWwuICBJbiBvdGhlciB3b3JkcywgdG8gdGhlIGJhc2UgY2xhc3MncyBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLCBgdGhpc2Agb2JqZWN0IGJlaGF2ZXMgbGlrZSBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBjbGFzcywgbm90IHRoZSBkZXJpdmVkIGNsYXNzLiAgVGhpcyBydWxlIGlzIHJlcXVpcmVkIGZvciBzYWZldHkuICBPdGhlcndpc2UgYSBiYXNlIGNvbnN0cnVjdG9yIG1heSB1c2UgbWVtYmVycyBvZiBhIGRlcml2ZWQgY2xhc3MgYmVmb3JlIHRoZXkgYXJlIGluaXRpYWxpemVkLCBvciBhIGJhc2UgZGVzdHJ1Y3RvciBtYXkgdXNlIG1lbWJlcnMgb2YgYSBkZXJpdmVkIGNsYXNzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGRlc3Ryb3llZC4pCisKK0ZpbmFsbHksIHlvdSBzaG91bGQgYmUgKip2ZXJ5IGNhdXRpb3VzKiogYWJvdXQgd2hlbiB0byB1c2UgbmFnZ3kgb3Igc3RyaWN0IG1vY2tzLCBhcyB0aGV5IHRlbmQgdG8gbWFrZSB0ZXN0cyBtb3JlIGJyaXR0bGUgYW5kIGhhcmRlciB0byBtYWludGFpbi4gV2hlbiB5b3UgcmVmYWN0b3IgeW91ciBjb2RlIHdpdGhvdXQgY2hhbmdpbmcgaXRzIGV4dGVybmFsbHkgdmlzaWJsZSBiZWhhdmlvciwgaWRlYWxseSB5b3Ugc2hvdWxkJ3QgbmVlZCB0byB1cGRhdGUgYW55IHRlc3RzLiBJZiB5b3VyIGNvZGUgaW50ZXJhY3RzIHdpdGggYSBuYWdneSBtb2NrLCBob3dldmVyLCB5b3UgbWF5IHN0YXJ0IHRvIGdldCBzcGFtbWVkIHdpdGggd2FybmluZ3MgYXMgdGhlIHJlc3VsdCBvZiB5b3VyIGNoYW5nZS4gV29yc2UsIGlmIHlvdXIgY29kZSBpbnRlcmFjdHMgd2l0aCBhIHN0cmljdCBtb2NrLCB5b3VyIHRlc3RzIG1heSBzdGFydCB0byBmYWlsIGFuZCB5b3UnbGwgYmUgZm9yY2VkIHRvIGZpeCB0aGVtLiBPdXIgZ2VuZXJhbCByZWNvbW1lbmRhdGlvbiBpcyB0byB1c2UgbmljZSBtb2NrcyAobm90IHlldCB0aGUgZGVmYXVsdCkgbW9zdCBvZiB0aGUgdGltZSwgdXNlIG5hZ2d5IG1vY2tzICh0aGUgY3VycmVudCBkZWZhdWx0KSB3aGVuIGRldmVsb3Bpbmcgb3IgZGVidWdnaW5nIHRlc3RzLCBhbmQgdXNlIHN0cmljdCBtb2NrcyBvbmx5IGFzIHRoZSBsYXN0IHJlc29ydC4KKworIyMgU2ltcGxpZnlpbmcgdGhlIEludGVyZmFjZSB3aXRob3V0IEJyZWFraW5nIEV4aXN0aW5nIENvZGUgIyMKKworU29tZXRpbWVzIGEgbWV0aG9kIGhhcyBhIGxvbmcgbGlzdCBvZiBhcmd1bWVudHMgdGhhdCBpcyBtb3N0bHkKK3VuaW50ZXJlc3RpbmcuIEZvciBleGFtcGxlLAorCitgYGAKK2NsYXNzIExvZ1NpbmsgeworIHB1YmxpYzoKKyAgLi4uCisgIHZpcnR1YWwgdm9pZCBzZW5kKExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmdWxsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBiYXNlX2ZpbGVuYW1lLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRtKiB0bV90aW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlLCBzaXplX3QgbWVzc2FnZV9sZW4pID0gMDsKK307CitgYGAKKworVGhpcyBtZXRob2QncyBhcmd1bWVudCBsaXN0IGlzIGxlbmd0aHkgYW5kIGhhcmQgdG8gd29yayB3aXRoIChsZXQncworc2F5IHRoYXQgdGhlIGBtZXNzYWdlYCBhcmd1bWVudCBpcyBub3QgZXZlbiAwLXRlcm1pbmF0ZWQpLiBJZiB3ZSBtb2NrCitpdCBhcyBpcywgdXNpbmcgdGhlIG1vY2sgd2lsbCBiZSBhd2t3YXJkLiBJZiwgaG93ZXZlciwgd2UgdHJ5IHRvCitzaW1wbGlmeSB0aGlzIGludGVyZmFjZSwgd2UnbGwgbmVlZCB0byBmaXggYWxsIGNsaWVudHMgZGVwZW5kaW5nIG9uCitpdCwgd2hpY2ggaXMgb2Z0ZW4gaW5mZWFzaWJsZS4KKworVGhlIHRyaWNrIGlzIHRvIHJlLWRpc3BhdGNoIHRoZSBtZXRob2QgaW4gdGhlIG1vY2sgY2xhc3M6CisKK2BgYAorY2xhc3MgU2NvcGVkTW9ja0xvZyA6IHB1YmxpYyBMb2dTaW5rIHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIHZvaWQgc2VuZChMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZnVsbF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYmFzZV9maWxlbmFtZSwgaW50IGxpbmUsIGNvbnN0IHRtKiB0bV90aW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlLCBzaXplX3QgbWVzc2FnZV9sZW4pIHsKKyAgICAvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBsb2cgc2V2ZXJpdHksIGZ1bGwgZmlsZSBuYW1lLCBhbmQKKyAgICAvLyBsb2cgbWVzc2FnZS4KKyAgICBMb2coc2V2ZXJpdHksIGZ1bGxfZmlsZW5hbWUsIHN0ZDo6c3RyaW5nKG1lc3NhZ2UsIG1lc3NhZ2VfbGVuKSk7CisgIH0KKworICAvLyBJbXBsZW1lbnRzIHRoZSBtb2NrIG1ldGhvZDoKKyAgLy8KKyAgLy8gICB2b2lkIExvZyhMb2dTZXZlcml0eSBzZXZlcml0eSwKKyAgLy8gICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCwKKyAgLy8gICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpOworICBNT0NLX01FVEhPRDMoTG9nLCB2b2lkKExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpKTsKK307CitgYGAKKworQnkgZGVmaW5pbmcgYSBuZXcgbW9jayBtZXRob2Qgd2l0aCBhIHRyaW1tZWQgYXJndW1lbnQgbGlzdCwgd2UgbWFrZQordGhlIG1vY2sgY2xhc3MgbXVjaCBtb3JlIHVzZXItZnJpZW5kbHkuCisKKyMjIEFsdGVybmF0aXZlIHRvIE1vY2tpbmcgQ29uY3JldGUgQ2xhc3NlcyAjIworCitPZnRlbiB5b3UgbWF5IGZpbmQgeW91cnNlbGYgdXNpbmcgY2xhc3NlcyB0aGF0IGRvbid0IGltcGxlbWVudAoraW50ZXJmYWNlcy4gSW4gb3JkZXIgdG8gdGVzdCB5b3VyIGNvZGUgdGhhdCB1c2VzIHN1Y2ggYSBjbGFzcyAobGV0J3MKK2NhbGwgaXQgYENvbmNyZXRlYCksIHlvdSBtYXkgYmUgdGVtcHRlZCB0byBtYWtlIHRoZSBtZXRob2RzIG9mCitgQ29uY3JldGVgIHZpcnR1YWwgYW5kIHRoZW4gbW9jayBpdC4KKworVHJ5IG5vdCB0byBkbyB0aGF0LgorCitNYWtpbmcgYSBub24tdmlydHVhbCBmdW5jdGlvbiB2aXJ0dWFsIGlzIGEgYmlnIGRlY2lzaW9uLiBJdCBjcmVhdGVzIGFuCitleHRlbnNpb24gcG9pbnQgd2hlcmUgc3ViY2xhc3NlcyBjYW4gdHdlYWsgeW91ciBjbGFzcycgYmVoYXZpb3IuIFRoaXMKK3dlYWtlbnMgeW91ciBjb250cm9sIG9uIHRoZSBjbGFzcyBiZWNhdXNlIG5vdyBpdCdzIGhhcmRlciB0byBtYWludGFpbgordGhlIGNsYXNzJyBpbnZhcmlhbnRzLiBZb3Ugc2hvdWxkIG1ha2UgYSBmdW5jdGlvbiB2aXJ0dWFsIG9ubHkgd2hlbgordGhlcmUgaXMgYSB2YWxpZCByZWFzb24gZm9yIGEgc3ViY2xhc3MgdG8gb3ZlcnJpZGUgaXQuCisKK01vY2tpbmcgY29uY3JldGUgY2xhc3NlcyBkaXJlY3RseSBpcyBwcm9ibGVtYXRpYyBhcyBpdCBjcmVhdGVzIGEgdGlnaHQKK2NvdXBsaW5nIGJldHdlZW4gdGhlIGNsYXNzIGFuZCB0aGUgdGVzdHMgLSBhbnkgc21hbGwgY2hhbmdlIGluIHRoZQorY2xhc3MgbWF5IGludmFsaWRhdGUgeW91ciB0ZXN0cyBhbmQgbWFrZSB0ZXN0IG1haW50ZW5hbmNlIGEgcGFpbi4KKworVG8gYXZvaWQgc3VjaCBwcm9ibGVtcywgbWFueSBwcm9ncmFtbWVycyBoYXZlIGJlZW4gcHJhY3RpY2luZyAiY29kaW5nCit0byBpbnRlcmZhY2VzIjogaW5zdGVhZCBvZiB0YWxraW5nIHRvIHRoZSBgQ29uY3JldGVgIGNsYXNzLCB5b3VyIGNvZGUKK3dvdWxkIGRlZmluZSBhbiBpbnRlcmZhY2UgYW5kIHRhbGsgdG8gaXQuIFRoZW4geW91IGltcGxlbWVudCB0aGF0CitpbnRlcmZhY2UgYXMgYW4gYWRhcHRvciBvbiB0b3Agb2YgYENvbmNyZXRlYC4gSW4gdGVzdHMsIHlvdSBjYW4gZWFzaWx5Cittb2NrIHRoYXQgaW50ZXJmYWNlIHRvIG9ic2VydmUgaG93IHlvdXIgY29kZSBpcyBkb2luZy4KKworVGhpcyB0ZWNobmlxdWUgaW5jdXJzIHNvbWUgb3ZlcmhlYWQ6CisKKyAgKiBZb3UgcGF5IHRoZSBjb3N0IG9mIHZpcnR1YWwgZnVuY3Rpb24gY2FsbHMgKHVzdWFsbHkgbm90IGEgcHJvYmxlbSkuCisgICogVGhlcmUgaXMgbW9yZSBhYnN0cmFjdGlvbiBmb3IgdGhlIHByb2dyYW1tZXJzIHRvIGxlYXJuLgorCitIb3dldmVyLCBpdCBjYW4gYWxzbyBicmluZyBzaWduaWZpY2FudCBiZW5lZml0cyBpbiBhZGRpdGlvbiB0byBiZXR0ZXIKK3Rlc3RhYmlsaXR5OgorCisgICogYENvbmNyZXRlYCdzIEFQSSBtYXkgbm90IGZpdCB5b3VyIHByb2JsZW0gZG9tYWluIHZlcnkgd2VsbCwgYXMgeW91IG1heSBub3QgYmUgdGhlIG9ubHkgY2xpZW50IGl0IHRyaWVzIHRvIHNlcnZlLiBCeSBkZXNpZ25pbmcgeW91ciBvd24gaW50ZXJmYWNlLCB5b3UgaGF2ZSBhIGNoYW5jZSB0byB0YWlsb3IgaXQgdG8geW91ciBuZWVkIC0geW91IG1heSBhZGQgaGlnaGVyLWxldmVsIGZ1bmN0aW9uYWxpdGllcywgcmVuYW1lIHN0dWZmLCBldGMgaW5zdGVhZCBvZiBqdXN0IHRyaW1taW5nIHRoZSBjbGFzcy4gVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIHlvdXIgY29kZSAodXNlciBvZiB0aGUgaW50ZXJmYWNlKSBpbiBhIG1vcmUgbmF0dXJhbCB3YXksIHdoaWNoIG1lYW5zIGl0IHdpbGwgYmUgbW9yZSByZWFkYWJsZSwgbW9yZSBtYWludGFpbmFibGUsIGFuZCB5b3UnbGwgYmUgbW9yZSBwcm9kdWN0aXZlLgorICAqIElmIGBDb25jcmV0ZWAncyBpbXBsZW1lbnRhdGlvbiBldmVyIGhhcyB0byBjaGFuZ2UsIHlvdSBkb24ndCBoYXZlIHRvIHJld3JpdGUgZXZlcnl3aGVyZSBpdCBpcyB1c2VkLiBJbnN0ZWFkLCB5b3UgY2FuIGFic29yYiB0aGUgY2hhbmdlIGluIHlvdXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZSwgYW5kIHlvdXIgb3RoZXIgY29kZSBhbmQgdGVzdHMgd2lsbCBiZSBpbnN1bGF0ZWQgZnJvbSB0aGlzIGNoYW5nZS4KKworU29tZSBwZW9wbGUgd29ycnkgdGhhdCBpZiBldmVyeW9uZSBpcyBwcmFjdGljaW5nIHRoaXMgdGVjaG5pcXVlLCB0aGV5Cit3aWxsIGVuZCB1cCB3cml0aW5nIGxvdHMgb2YgcmVkdW5kYW50IGNvZGUuIFRoaXMgY29uY2VybiBpcyB0b3RhbGx5Cit1bmRlcnN0YW5kYWJsZS4gSG93ZXZlciwgdGhlcmUgYXJlIHR3byByZWFzb25zIHdoeSBpdCBtYXkgbm90IGJlIHRoZQorY2FzZToKKworICAqIERpZmZlcmVudCBwcm9qZWN0cyBtYXkgbmVlZCB0byB1c2UgYENvbmNyZXRlYCBpbiBkaWZmZXJlbnQgd2F5cywgc28gdGhlIGJlc3QgaW50ZXJmYWNlcyBmb3IgdGhlbSB3aWxsIGJlIGRpZmZlcmVudC4gVGhlcmVmb3JlLCBlYWNoIG9mIHRoZW0gd2lsbCBoYXZlIGl0cyBvd24gZG9tYWluLXNwZWNpZmljIGludGVyZmFjZSBvbiB0b3Agb2YgYENvbmNyZXRlYCwgYW5kIHRoZXkgd2lsbCBub3QgYmUgdGhlIHNhbWUgY29kZS4KKyAgKiBJZiBlbm91Z2ggcHJvamVjdHMgd2FudCB0byB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlLCB0aGV5IGNhbiBhbHdheXMgc2hhcmUgaXQsIGp1c3QgbGlrZSB0aGV5IGhhdmUgYmVlbiBzaGFyaW5nIGBDb25jcmV0ZWAuIFlvdSBjYW4gY2hlY2sgaW4gdGhlIGludGVyZmFjZSBhbmQgdGhlIGFkYXB0b3Igc29tZXdoZXJlIG5lYXIgYENvbmNyZXRlYCAocGVyaGFwcyBpbiBhIGBjb250cmliYCBzdWItZGlyZWN0b3J5KSBhbmQgbGV0IG1hbnkgcHJvamVjdHMgdXNlIGl0LgorCitZb3UgbmVlZCB0byB3ZWlnaCB0aGUgcHJvcyBhbmQgY29ucyBjYXJlZnVsbHkgZm9yIHlvdXIgcGFydGljdWxhcgorcHJvYmxlbSwgYnV0IEknZCBsaWtlIHRvIGFzc3VyZSB5b3UgdGhhdCB0aGUgSmF2YSBjb21tdW5pdHkgaGFzIGJlZW4KK3ByYWN0aWNpbmcgdGhpcyBmb3IgYSBsb25nIHRpbWUgYW5kIGl0J3MgYSBwcm92ZW4gZWZmZWN0aXZlIHRlY2huaXF1ZQorYXBwbGljYWJsZSBpbiBhIHdpZGUgdmFyaWV0eSBvZiBzaXR1YXRpb25zLiA6LSkKKworIyMgRGVsZWdhdGluZyBDYWxscyB0byBhIEZha2UgIyMKKworU29tZSB0aW1lcyB5b3UgaGF2ZSBhIG5vbi10cml2aWFsIGZha2UgaW1wbGVtZW50YXRpb24gb2YgYW4KK2ludGVyZmFjZS4gRm9yIGV4YW1wbGU6CisKK2BgYAorY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkZvbygpIHt9CisgIHZpcnR1YWwgY2hhciBEb1RoaXMoaW50IG4pID0gMDsKKyAgdmlydHVhbCB2b2lkIERvVGhhdChjb25zdCBjaGFyKiBzLCBpbnQqIHApID0gMDsKK307CisKK2NsYXNzIEZha2VGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgY2hhciBEb1RoaXMoaW50IG4pIHsKKyAgICByZXR1cm4gKG4gPiAwKSA/ICcrJyA6CisgICAgICAgIChuIDwgMCkgPyAnLScgOiAnMCc7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRG9UaGF0KGNvbnN0IGNoYXIqIHMsIGludCogcCkgeworICAgICpwID0gc3RybGVuKHMpOworICB9Cit9OworYGBgCisKK05vdyB5b3Ugd2FudCB0byBtb2NrIHRoaXMgaW50ZXJmYWNlIHN1Y2ggdGhhdCB5b3UgY2FuIHNldCBleHBlY3RhdGlvbnMKK29uIGl0LiBIb3dldmVyLCB5b3UgYWxzbyB3YW50IHRvIHVzZSBgRmFrZUZvb2AgZm9yIHRoZSBkZWZhdWx0CitiZWhhdmlvciwgYXMgZHVwbGljYXRpbmcgaXQgaW4gdGhlIG1vY2sgb2JqZWN0IGlzLCB3ZWxsLCBhIGxvdCBvZgord29yay4KKworV2hlbiB5b3UgZGVmaW5lIHRoZSBtb2NrIGNsYXNzIHVzaW5nIEdvb2dsZSBNb2NrLCB5b3UgY2FuIGhhdmUgaXQKK2RlbGVnYXRlIGl0cyBkZWZhdWx0IGFjdGlvbiB0byBhIGZha2UgY2xhc3MgeW91IGFscmVhZHkgaGF2ZSwgdXNpbmcKK3RoaXMgcGF0dGVybjoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgLy8gTm9ybWFsIG1vY2sgbWV0aG9kIGRlZmluaXRpb25zIHVzaW5nIEdvb2dsZSBNb2NrLgorICBNT0NLX01FVEhPRDEoRG9UaGlzLCBjaGFyKGludCBuKSk7CisgIE1PQ0tfTUVUSE9EMihEb1RoYXQsIHZvaWQoY29uc3QgY2hhciogcywgaW50KiBwKSk7CisKKyAgLy8gRGVsZWdhdGVzIHRoZSBkZWZhdWx0IGFjdGlvbnMgb2YgdGhlIG1ldGhvZHMgdG8gYSBGYWtlRm9vIG9iamVjdC4KKyAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCAqYmVmb3JlKiB0aGUgY3VzdG9tIE9OX0NBTEwoKSBzdGF0ZW1lbnRzLgorICB2b2lkIERlbGVnYXRlVG9GYWtlKCkgeworICAgIE9OX0NBTEwoKnRoaXMsIERvVGhpcyhfKSkKKyAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKCZmYWtlXywgJkZha2VGb286OkRvVGhpcykpOworICAgIE9OX0NBTEwoKnRoaXMsIERvVGhhdChfLCBfKSkKKyAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKCZmYWtlXywgJkZha2VGb286OkRvVGhhdCkpOworICB9CisgcHJpdmF0ZToKKyAgRmFrZUZvbyBmYWtlXzsgIC8vIEtlZXBzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWtlIGluIHRoZSBtb2NrLgorfTsKK2BgYAorCitXaXRoIHRoYXQsIHlvdSBjYW4gdXNlIGBNb2NrRm9vYCBpbiB5b3VyIHRlc3RzIGFzIHVzdWFsLiBKdXN0IHJlbWVtYmVyCit0aGF0IGlmIHlvdSBkb24ndCBleHBsaWNpdGx5IHNldCBhbiBhY3Rpb24gaW4gYW4gYE9OX0NBTEwoKWAgb3IKK2BFWFBFQ1RfQ0FMTCgpYCwgdGhlIGZha2Ugd2lsbCBiZSBjYWxsZWQgdXBvbiB0byBkbyBpdDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87CisKK1RFU1QoQWJjVGVzdCwgWHl6KSB7CisgIE1vY2tGb28gZm9vOworICBmb28uRGVsZWdhdGVUb0Zha2UoKTsgLy8gRW5hYmxlcyB0aGUgZmFrZSBmb3IgZGVsZWdhdGlvbi4KKworICAvLyBQdXQgeW91ciBPTl9DQUxMKGZvbywgLi4uKXMgaGVyZSwgaWYgYW55LgorCisgIC8vIE5vIGFjdGlvbiBzcGVjaWZpZWQsIG1lYW5pbmcgdG8gdXNlIHRoZSBkZWZhdWx0IGFjdGlvbi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoNSkpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdChfLCBfKSk7CisKKyAgaW50IG4gPSAwOworICBFWFBFQ1RfRVEoJysnLCBmb28uRG9UaGlzKDUpKTsgIC8vIEZha2VGb286OkRvVGhpcygpIGlzIGludm9rZWQuCisgIGZvby5Eb1RoYXQoIkhpIiwgJm4pOyAgICAgICAgICAgLy8gRmFrZUZvbzo6RG9UaGF0KCkgaXMgaW52b2tlZC4KKyAgRVhQRUNUX0VRKDIsIG4pOworfQorYGBgCisKKyoqU29tZSB0aXBzOioqCisKKyAgKiBJZiB5b3Ugd2FudCwgeW91IGNhbiBzdGlsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBhY3Rpb24gYnkgcHJvdmlkaW5nIHlvdXIgb3duIGBPTl9DQUxMKClgIG9yIHVzaW5nIGAuV2lsbE9uY2UoKWAgLyBgLldpbGxSZXBlYXRlZGx5KClgIGluIGBFWFBFQ1RfQ0FMTCgpYC4KKyAgKiBJbiBgRGVsZWdhdGVUb0Zha2UoKWAsIHlvdSBvbmx5IG5lZWQgdG8gZGVsZWdhdGUgdGhlIG1ldGhvZHMgd2hvc2UgZmFrZSBpbXBsZW1lbnRhdGlvbiB5b3UgaW50ZW5kIHRvIHVzZS4KKyAgKiBUaGUgZ2VuZXJhbCB0ZWNobmlxdWUgZGlzY3Vzc2VkIGhlcmUgd29ya3MgZm9yIG92ZXJsb2FkZWQgbWV0aG9kcywgYnV0IHlvdSdsbCBuZWVkIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoaWNoIHZlcnNpb24geW91IG1lYW4uIFRvIGRpc2FtYmlndWF0ZSBhIG1vY2sgZnVuY3Rpb24gKHRoZSBvbmUgeW91IHNwZWNpZnkgaW5zaWRlIHRoZSBwYXJlbnRoZXNlcyBvZiBgT05fQ0FMTCgpYCksIHNlZSB0aGUgIlNlbGVjdGluZyBCZXR3ZWVuIE92ZXJsb2FkZWQgRnVuY3Rpb25zIiBzZWN0aW9uIG9uIHRoaXMgcGFnZTsgdG8gZGlzYW1iaWd1YXRlIGEgZmFrZSBmdW5jdGlvbiAodGhlIG9uZSB5b3UgcGxhY2UgaW5zaWRlIGBJbnZva2UoKWApLCB1c2UgYSBgc3RhdGljX2Nhc3RgIHRvIHNwZWNpZnkgdGhlIGZ1bmN0aW9uJ3MgdHlwZS4gRm9yIGluc3RhbmNlLCBpZiBjbGFzcyBgRm9vYCBoYXMgbWV0aG9kcyBgY2hhciBEb1RoaXMoaW50IG4pYCBhbmQgYGJvb2wgRG9UaGlzKGRvdWJsZSB4KSBjb25zdGAsIGFuZCB5b3Ugd2FudCB0byBpbnZva2UgdGhlIGxhdHRlciwgeW91IG5lZWQgdG8gd3JpdGUgYEludm9rZSgmZmFrZV8sIHN0YXRpY19jYXN0PGJvb2wgKEZha2VGb286OiopKGRvdWJsZSkgY29uc3Q+KCZGYWtlRm9vOjpEb1RoaXMpKWAgaW5zdGVhZCBvZiBgSW52b2tlKCZmYWtlXywgJkZha2VGb286OkRvVGhpcylgIChUaGUgc3RyYW5nZS1sb29raW5nIHRoaW5nIGluc2lkZSB0aGUgYW5nbGVkIGJyYWNrZXRzIG9mIGBzdGF0aWNfY2FzdGAgaXMgdGhlIHR5cGUgb2YgYSBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBzZWNvbmQgYERvVGhpcygpYCBtZXRob2QuKS4KKyAgKiBIYXZpbmcgdG8gbWl4IGEgbW9jayBhbmQgYSBmYWtlIGlzIG9mdGVuIGEgc2lnbiBvZiBzb21ldGhpbmcgZ29uZSB3cm9uZy4gUGVyaGFwcyB5b3UgaGF2ZW4ndCBnb3QgdXNlZCB0byB0aGUgaW50ZXJhY3Rpb24tYmFzZWQgd2F5IG9mIHRlc3RpbmcgeWV0LiBPciBwZXJoYXBzIHlvdXIgaW50ZXJmYWNlIGlzIHRha2luZyBvbiB0b28gbWFueSByb2xlcyBhbmQgc2hvdWxkIGJlIHNwbGl0IHVwLiBUaGVyZWZvcmUsICoqZG9uJ3QgYWJ1c2UgdGhpcyoqLiBXZSB3b3VsZCBvbmx5IHJlY29tbWVuZCB0byBkbyBpdCBhcyBhbiBpbnRlcm1lZGlhdGUgc3RlcCB3aGVuIHlvdSBhcmUgcmVmYWN0b3JpbmcgeW91ciBjb2RlLgorCitSZWdhcmRpbmcgdGhlIHRpcCBvbiBtaXhpbmcgYSBtb2NrIGFuZCBhIGZha2UsIGhlcmUncyBhbiBleGFtcGxlIG9uCit3aHkgaXQgbWF5IGJlIGEgYmFkIHNpZ246IFN1cHBvc2UgeW91IGhhdmUgYSBjbGFzcyBgU3lzdGVtYCBmb3IKK2xvdy1sZXZlbCBzeXN0ZW0gb3BlcmF0aW9ucy4gSW4gcGFydGljdWxhciwgaXQgZG9lcyBmaWxlIGFuZCBJL08KK29wZXJhdGlvbnMuIEFuZCBzdXBwb3NlIHlvdSB3YW50IHRvIHRlc3QgaG93IHlvdXIgY29kZSB1c2VzIGBTeXN0ZW1gCit0byBkbyBJL08sIGFuZCB5b3UganVzdCB3YW50IHRoZSBmaWxlIG9wZXJhdGlvbnMgdG8gd29yayBub3JtYWxseS4gSWYKK3lvdSBtb2NrIG91dCB0aGUgZW50aXJlIGBTeXN0ZW1gIGNsYXNzLCB5b3UnbGwgaGF2ZSB0byBwcm92aWRlIGEgZmFrZQoraW1wbGVtZW50YXRpb24gZm9yIHRoZSBmaWxlIG9wZXJhdGlvbiBwYXJ0LCB3aGljaCBzdWdnZXN0cyB0aGF0CitgU3lzdGVtYCBpcyB0YWtpbmcgb24gdG9vIG1hbnkgcm9sZXMuCisKK0luc3RlYWQsIHlvdSBjYW4gZGVmaW5lIGEgYEZpbGVPcHNgIGludGVyZmFjZSBhbmQgYW4gYElPT3BzYCBpbnRlcmZhY2UKK2FuZCBzcGxpdCBgU3lzdGVtYCdzIGZ1bmN0aW9uYWxpdGllcyBpbnRvIHRoZSB0d28uIFRoZW4geW91IGNhbiBtb2NrCitgSU9PcHNgIHdpdGhvdXQgbW9ja2luZyBgRmlsZU9wc2AuCisKKyMjIERlbGVnYXRpbmcgQ2FsbHMgdG8gYSBSZWFsIE9iamVjdCAjIworCitXaGVuIHVzaW5nIHRlc3RpbmcgZG91YmxlcyAobW9ja3MsIGZha2VzLCBzdHVicywgYW5kIGV0YyksIHNvbWV0aW1lcwordGhlaXIgYmVoYXZpb3JzIHdpbGwgZGlmZmVyIGZyb20gdGhvc2Ugb2YgdGhlIHJlYWwgb2JqZWN0cy4gVGhpcworZGlmZmVyZW5jZSBjb3VsZCBiZSBlaXRoZXIgaW50ZW50aW9uYWwgKGFzIGluIHNpbXVsYXRpbmcgYW4gZXJyb3Igc3VjaAordGhhdCB5b3UgY2FuIHRlc3QgdGhlIGVycm9yIGhhbmRsaW5nIGNvZGUpIG9yIHVuaW50ZW50aW9uYWwuIElmIHlvdXIKK21vY2tzIGhhdmUgZGlmZmVyZW50IGJlaGF2aW9ycyB0aGFuIHRoZSByZWFsIG9iamVjdHMgYnkgbWlzdGFrZSwgeW91Citjb3VsZCBlbmQgdXAgd2l0aCBjb2RlIHRoYXQgcGFzc2VzIHRoZSB0ZXN0cyBidXQgZmFpbHMgaW4gcHJvZHVjdGlvbi4KKworWW91IGNhbiB1c2UgdGhlIF9kZWxlZ2F0aW5nLXRvLXJlYWxfIHRlY2huaXF1ZSB0byBlbnN1cmUgdGhhdCB5b3VyCittb2NrIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgcmVhbCBvYmplY3Qgd2hpbGUgcmV0YWluaW5nIHRoZQorYWJpbGl0eSB0byB2YWxpZGF0ZSBjYWxscy4gVGhpcyB0ZWNobmlxdWUgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZQorZGVsZWdhdGluZy10by1mYWtlIHRlY2huaXF1ZSwgdGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCB3ZSB1c2UgYSByZWFsCitvYmplY3QgaW5zdGVhZCBvZiBhIGZha2UuIEhlcmUncyBhbiBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNb2NrRm9vKCkgeworICAgIC8vIEJ5IGRlZmF1bHQsIGFsbCBjYWxscyBhcmUgZGVsZWdhdGVkIHRvIHRoZSByZWFsIG9iamVjdC4KKyAgICBPTl9DQUxMKCp0aGlzLCBEb1RoaXMoKSkKKyAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKCZyZWFsXywgJkZvbzo6RG9UaGlzKSk7CisgICAgT05fQ0FMTCgqdGhpcywgRG9UaGF0KF8pKQorICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoJnJlYWxfLCAmRm9vOjpEb1RoYXQpKTsKKyAgICAuLi4KKyAgfQorICBNT0NLX01FVEhPRDAoRG9UaGlzLCAuLi4pOworICBNT0NLX01FVEhPRDEoRG9UaGF0LCAuLi4pOworICAuLi4KKyBwcml2YXRlOgorICBGb28gcmVhbF87Cit9OworLi4uCisKKyAgTW9ja0ZvbyBtb2NrOworCisgIEVYUEVDVF9DQUxMKG1vY2ssIERvVGhpcygpKQorICAgICAgLlRpbWVzKDMpOworICBFWFBFQ1RfQ0FMTChtb2NrLCBEb1RoYXQoIkhpIikpCisgICAgICAuVGltZXMoQXRMZWFzdCgxKSk7CisgIC4uLiB1c2UgbW9jayBpbiB0ZXN0IC4uLgorYGBgCisKK1dpdGggdGhpcywgR29vZ2xlIE1vY2sgd2lsbCB2ZXJpZnkgdGhhdCB5b3VyIGNvZGUgbWFkZSB0aGUgcmlnaHQgY2FsbHMKKyh3aXRoIHRoZSByaWdodCBhcmd1bWVudHMsIGluIHRoZSByaWdodCBvcmRlciwgY2FsbGVkIHRoZSByaWdodCBudW1iZXIKK29mIHRpbWVzLCBldGMpLCBhbmQgYSByZWFsIG9iamVjdCB3aWxsIGFuc3dlciB0aGUgY2FsbHMgKHNvIHRoZQorYmVoYXZpb3Igd2lsbCBiZSB0aGUgc2FtZSBhcyBpbiBwcm9kdWN0aW9uKS4gVGhpcyBnaXZlcyB5b3UgdGhlIGJlc3QKK29mIGJvdGggd29ybGRzLgorCisjIyBEZWxlZ2F0aW5nIENhbGxzIHRvIGEgUGFyZW50IENsYXNzICMjCisKK0lkZWFsbHksIHlvdSBzaG91bGQgY29kZSB0byBpbnRlcmZhY2VzLCB3aG9zZSBtZXRob2RzIGFyZSBhbGwgcHVyZQordmlydHVhbC4gSW4gcmVhbGl0eSwgc29tZXRpbWVzIHlvdSBkbyBuZWVkIHRvIG1vY2sgYSB2aXJ0dWFsIG1ldGhvZAordGhhdCBpcyBub3QgcHVyZSAoaS5lLCBpdCBhbHJlYWR5IGhhcyBhbiBpbXBsZW1lbnRhdGlvbikuIEZvciBleGFtcGxlOgorCitgYGAKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Gb28oKTsKKworICB2aXJ0dWFsIHZvaWQgUHVyZShpbnQgbikgPSAwOworICB2aXJ0dWFsIGludCBDb25jcmV0ZShjb25zdCBjaGFyKiBzdHIpIHsgLi4uIH0KK307CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC8vIE1vY2tpbmcgYSBwdXJlIG1ldGhvZC4KKyAgTU9DS19NRVRIT0QxKFB1cmUsIHZvaWQoaW50IG4pKTsKKyAgLy8gTW9ja2luZyBhIGNvbmNyZXRlIG1ldGhvZC4gIEZvbzo6Q29uY3JldGUoKSBpcyBzaGFkb3dlZC4KKyAgTU9DS19NRVRIT0QxKENvbmNyZXRlLCBpbnQoY29uc3QgY2hhciogc3RyKSk7Cit9OworYGBgCisKK1NvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdG8gY2FsbCBgRm9vOjpDb25jcmV0ZSgpYCBpbnN0ZWFkIG9mCitgTW9ja0Zvbzo6Q29uY3JldGUoKWAuIFBlcmhhcHMgeW91IHdhbnQgdG8gZG8gaXQgYXMgcGFydCBvZiBhIHN0dWIKK2FjdGlvbiwgb3IgcGVyaGFwcyB5b3VyIHRlc3QgZG9lc24ndCBuZWVkIHRvIG1vY2sgYENvbmNyZXRlKClgIGF0IGFsbAorKGJ1dCBpdCB3b3VsZCBiZSBvaC1zbyBwYWluZnVsIHRvIGhhdmUgdG8gZGVmaW5lIGEgbmV3IG1vY2sgY2xhc3MKK3doZW5ldmVyIHlvdSBkb24ndCBuZWVkIHRvIG1vY2sgb25lIG9mIGl0cyBtZXRob2RzKS4KKworVGhlIHRyaWNrIGlzIHRvIGxlYXZlIGEgYmFjayBkb29yIGluIHlvdXIgbW9jayBjbGFzcyBmb3IgYWNjZXNzaW5nIHRoZQorcmVhbCBtZXRob2RzIGluIHRoZSBiYXNlIGNsYXNzOgorCitgYGAKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC8vIE1vY2tpbmcgYSBwdXJlIG1ldGhvZC4KKyAgTU9DS19NRVRIT0QxKFB1cmUsIHZvaWQoaW50IG4pKTsKKyAgLy8gTW9ja2luZyBhIGNvbmNyZXRlIG1ldGhvZC4gIEZvbzo6Q29uY3JldGUoKSBpcyBzaGFkb3dlZC4KKyAgTU9DS19NRVRIT0QxKENvbmNyZXRlLCBpbnQoY29uc3QgY2hhciogc3RyKSk7CisKKyAgLy8gVXNlIHRoaXMgdG8gY2FsbCBDb25jcmV0ZSgpIGRlZmluZWQgaW4gRm9vLgorICBpbnQgRm9vQ29uY3JldGUoY29uc3QgY2hhciogc3RyKSB7IHJldHVybiBGb286OkNvbmNyZXRlKHN0cik7IH0KK307CitgYGAKKworTm93LCB5b3UgY2FuIGNhbGwgYEZvbzo6Q29uY3JldGUoKWAgaW5zaWRlIGFuIGFjdGlvbiBieToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIENvbmNyZXRlKF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZSgmZm9vLCAmTW9ja0Zvbzo6Rm9vQ29uY3JldGUpKTsKK2BgYAorCitvciB0ZWxsIHRoZSBtb2NrIG9iamVjdCB0aGF0IHlvdSBkb24ndCB3YW50IHRvIG1vY2sgYENvbmNyZXRlKClgOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOworLi4uCisgIE9OX0NBTEwoZm9vLCBDb25jcmV0ZShfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgmZm9vLCAmTW9ja0Zvbzo6Rm9vQ29uY3JldGUpKTsKK2BgYAorCisoV2h5IGRvbid0IHdlIGp1c3Qgd3JpdGUgYEludm9rZSgmZm9vLCAmRm9vOjpDb25jcmV0ZSlgPyBJZiB5b3UgZG8KK3RoYXQsIGBNb2NrRm9vOjpDb25jcmV0ZSgpYCB3aWxsIGJlIGNhbGxlZCAoYW5kIGNhdXNlIGFuIGluZmluaXRlCityZWN1cnNpb24pIHNpbmNlIGBGb286OkNvbmNyZXRlKClgIGlzIHZpcnR1YWwuIFRoYXQncyBqdXN0IGhvdyBDKysKK3dvcmtzLikKKworIyBVc2luZyBNYXRjaGVycyAjCisKKyMjIE1hdGNoaW5nIEFyZ3VtZW50IFZhbHVlcyBFeGFjdGx5ICMjCisKK1lvdSBjYW4gc3BlY2lmeSBleGFjdGx5IHdoaWNoIGFyZ3VtZW50cyBhIG1vY2sgbWV0aG9kIGlzIGV4cGVjdGluZzoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyg1KSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oJ2EnKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGF0KCJIZWxsbyIsIGJhcikpOworYGBgCisKKyMjIFVzaW5nIFNpbXBsZSBNYXRjaGVycyAjIworCitZb3UgY2FuIHVzZSBtYXRjaGVycyB0byBtYXRjaCBhcmd1bWVudHMgdGhhdCBoYXZlIGEgY2VydGFpbiBwcm9wZXJ0eToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkdlOwordXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoR2UoNSkpKSAgLy8gVGhlIGFyZ3VtZW50IG11c3QgYmUgPj0gNS4KKyAgICAgIC5XaWxsT25jZShSZXR1cm4oJ2EnKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGF0KCJIZWxsbyIsIE5vdE51bGwoKSkpOworICAvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3Qgbm90IGJlIE5VTEwuCitgYGAKKworQSBmcmVxdWVudGx5IHVzZWQgbWF0Y2hlciBpcyBgX2AsIHdoaWNoIG1hdGNoZXMgYW55dGhpbmc6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGF0KF8sIE5vdE51bGwoKSkpOworYGBgCisKKyMjIENvbWJpbmluZyBNYXRjaGVycyAjIworCitZb3UgY2FuIGJ1aWxkIGNvbXBsZXggbWF0Y2hlcnMgZnJvbSBleGlzdGluZyBvbmVzIHVzaW5nIGBBbGxPZigpYCwKK2BBbnlPZigpYCwgYW5kIGBOb3QoKWA6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpBbGxPZjsKK3VzaW5nIDo6dGVzdGluZzo6R3Q7Cit1c2luZyA6OnRlc3Rpbmc6Okhhc1N1YnN0cjsKK3VzaW5nIDo6dGVzdGluZzo6TmU7Cit1c2luZyA6OnRlc3Rpbmc6Ok5vdDsKKy4uLgorICAvLyBUaGUgYXJndW1lbnQgbXVzdCBiZSA+IDUgYW5kICE9IDEwLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhBbGxPZihHdCg1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmUoMTApKSkpOworCisgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IG5vdCBjb250YWluIHN1Yi1zdHJpbmcgImJsYWgiLgorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdChOb3QoSGFzU3Vic3RyKCJibGFoIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CitgYGAKKworIyMgQ2FzdGluZyBNYXRjaGVycyAjIworCitHb29nbGUgTW9jayBtYXRjaGVycyBhcmUgc3RhdGljYWxseSB0eXBlZCwgbWVhbmluZyB0aGF0IHRoZSBjb21waWxlcgorY2FuIGNhdGNoIHlvdXIgbWlzdGFrZSBpZiB5b3UgdXNlIGEgbWF0Y2hlciBvZiB0aGUgd3JvbmcgdHlwZSAoZm9yCitleGFtcGxlLCBpZiB5b3UgdXNlIGBFcSg1KWAgdG8gbWF0Y2ggYSBgc3RyaW5nYCBhcmd1bWVudCkuIEdvb2QgZm9yCit5b3UhCisKK1NvbWV0aW1lcywgaG93ZXZlciwgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgYW5kIHdhbnQgdGhlIGNvbXBpbGVyCit0byBnaXZlIHlvdSBzb21lIHNsYWNrLiBPbmUgZXhhbXBsZSBpcyB0aGF0IHlvdSBoYXZlIGEgbWF0Y2hlciBmb3IKK2Bsb25nYCBhbmQgdGhlIGFyZ3VtZW50IHlvdSB3YW50IHRvIG1hdGNoIGlzIGBpbnRgLiBXaGlsZSB0aGUgdHdvCit0eXBlcyBhcmVuJ3QgZXhhY3RseSB0aGUgc2FtZSwgdGhlcmUgaXMgbm90aGluZyByZWFsbHkgd3Jvbmcgd2l0aAordXNpbmcgYSBgTWF0Y2hlcjxsb25nPmAgdG8gbWF0Y2ggYW4gYGludGAgLSBhZnRlciBhbGwsIHdlIGNhbiBmaXJzdAorY29udmVydCB0aGUgYGludGAgYXJndW1lbnQgdG8gYSBgbG9uZ2AgYmVmb3JlIGdpdmluZyBpdCB0byB0aGUKK21hdGNoZXIuCisKK1RvIHN1cHBvcnQgdGhpcyBuZWVkLCBHb29nbGUgTW9jayBnaXZlcyB5b3UgdGhlCitgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pYCBmdW5jdGlvbi4gSXQgY2FzdHMgYSBtYXRjaGVyIGBtYCB0byB0eXBlCitgTWF0Y2hlcjxUPmAuIFRvIGVuc3VyZSBzYWZldHksIEdvb2dsZSBNb2NrIGNoZWNrcyB0aGF0IChsZXQgYFVgIGJlIHRoZQordHlwZSBgbWAgYWNjZXB0cyk6CisKKyAgMS4gVHlwZSBgVGAgY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byB0eXBlIGBVYDsKKyAgMS4gV2hlbiBib3RoIGBUYCBhbmQgYFVgIGFyZSBidWlsdC1pbiBhcml0aG1ldGljIHR5cGVzIChgYm9vbGAsIGludGVnZXJzLCBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycyksIHRoZSBjb252ZXJzaW9uIGZyb20gYFRgIHRvIGBVYCBpcyBub3QgbG9zc3kgKGluIG90aGVyIHdvcmRzLCBhbnkgdmFsdWUgcmVwcmVzZW50YWJsZSBieSBgVGAgY2FuIGFsc28gYmUgcmVwcmVzZW50ZWQgYnkgYFVgKTsgYW5kCisgIDEuIFdoZW4gYFVgIGlzIGEgcmVmZXJlbmNlLCBgVGAgbXVzdCBhbHNvIGJlIGEgcmVmZXJlbmNlIChhcyB0aGUgdW5kZXJseWluZyBtYXRjaGVyIG1heSBiZSBpbnRlcmVzdGVkIGluIHRoZSBhZGRyZXNzIG9mIHRoZSBgVWAgdmFsdWUpLgorCitUaGUgY29kZSB3b24ndCBjb21waWxlIGlmIGFueSBvZiB0aGVzZSBjb25kaXRpb25zIGlzbid0IG1ldC4KKworSGVyZSdzIG9uZSBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0OworCisvLyBBIGJhc2UgY2xhc3MgYW5kIGEgY2hpbGQgY2xhc3MuCitjbGFzcyBCYXNlIHsgLi4uIH07CitjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgeyAuLi4gfTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QxKERvVGhpcywgdm9pZChEZXJpdmVkKiBkZXJpdmVkKSk7Cit9OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIC8vIG0gaXMgYSBNYXRjaGVyPEJhc2UqPiB3ZSBnb3QgZnJvbSBzb21ld2hlcmUuCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKFNhZmVNYXRjaGVyQ2FzdDxEZXJpdmVkKj4obSkpKTsKK2BgYAorCitJZiB5b3UgZmluZCBgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pYCB0b28gbGltaXRpbmcsIHlvdSBjYW4gdXNlIGEgc2ltaWxhcgorZnVuY3Rpb24gYE1hdGNoZXJDYXN0PFQ+KG0pYC4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBgTWF0Y2hlckNhc3RgIHdvcmtzCithcyBsb25nIGFzIHlvdSBjYW4gYHN0YXRpY19jYXN0YCB0eXBlIGBUYCB0byB0eXBlIGBVYC4KKworYE1hdGNoZXJDYXN0YCBlc3NlbnRpYWxseSBsZXRzIHlvdSBieXBhc3MgQysrJ3MgdHlwZSBzeXN0ZW0KKyhgc3RhdGljX2Nhc3RgIGlzbid0IGFsd2F5cyBzYWZlIGFzIGl0IGNvdWxkIHRocm93IGF3YXkgaW5mb3JtYXRpb24sCitmb3IgZXhhbXBsZSksIHNvIGJlIGNhcmVmdWwgbm90IHRvIG1pc3VzZS9hYnVzZSBpdC4KKworIyMgU2VsZWN0aW5nIEJldHdlZW4gT3ZlcmxvYWRlZCBGdW5jdGlvbnMgIyMKKworSWYgeW91IGV4cGVjdCBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCwgdGhlIGNvbXBpbGVyIG1heQorbmVlZCBzb21lIGhlbHAgb24gd2hpY2ggb3ZlcmxvYWRlZCB2ZXJzaW9uIGl0IGlzLgorCitUbyBkaXNhbWJpZ3VhdGUgZnVuY3Rpb25zIG92ZXJsb2FkZWQgb24gdGhlIGNvbnN0LW5lc3Mgb2YgdGhpcyBvYmplY3QsCit1c2UgdGhlIGBDb25zdCgpYCBhcmd1bWVudCB3cmFwcGVyLgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuUmVmOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgIC4uLgorICBNT0NLX01FVEhPRDAoR2V0QmFyLCBCYXImKCkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0QmFyLCBjb25zdCBCYXImKCkpOworfTsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBCYXIgYmFyMSwgYmFyMjsKKyAgRVhQRUNUX0NBTEwoZm9vLCBHZXRCYXIoKSkgICAgICAgICAvLyBUaGUgbm9uLWNvbnN0IEdldEJhcigpLgorICAgICAgLldpbGxPbmNlKFJldHVyblJlZihiYXIxKSk7CisgIEVYUEVDVF9DQUxMKENvbnN0KGZvbyksIEdldEJhcigpKSAgLy8gVGhlIGNvbnN0IEdldEJhcigpLgorICAgICAgLldpbGxPbmNlKFJldHVyblJlZihiYXIyKSk7CitgYGAKKworKGBDb25zdCgpYCBpcyBkZWZpbmVkIGJ5IEdvb2dsZSBNb2NrIGFuZCByZXR1cm5zIGEgYGNvbnN0YCByZWZlcmVuY2UKK3RvIGl0cyBhcmd1bWVudC4pCisKK1RvIGRpc2FtYmlndWF0ZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMKK2J1dCBkaWZmZXJlbnQgYXJndW1lbnQgdHlwZXMsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBleGFjdCB0eXBlCitvZiBhIG1hdGNoZXIsIGVpdGhlciBieSB3cmFwcGluZyB5b3VyIG1hdGNoZXIgaW4gYE1hdGNoZXI8dHlwZT4oKWAsIG9yCit1c2luZyBhIG1hdGNoZXIgd2hvc2UgdHlwZSBpcyBmaXhlZCAoYFR5cGVkRXE8dHlwZT5gLCBgQW48dHlwZT4oKWAsCitldGMpOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6QW47Cit1c2luZyA6OnRlc3Rpbmc6Okx0OwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpUeXBlZEVxOworCitjbGFzcyBNb2NrUHJpbnRlciA6IHB1YmxpYyBQcmludGVyIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShQcmludCwgdm9pZChpbnQgbikpOworICBNT0NLX01FVEhPRDEoUHJpbnQsIHZvaWQoY2hhciBjKSk7Cit9OworCitURVNUKFByaW50ZXJUZXN0LCBQcmludCkgeworICBNb2NrUHJpbnRlciBwcmludGVyOworCisgIEVYUEVDVF9DQUxMKHByaW50ZXIsIFByaW50KEFuPGludD4oKSkpOyAgICAgICAgICAgIC8vIHZvaWQgUHJpbnQoaW50KTsKKyAgRVhQRUNUX0NBTEwocHJpbnRlciwgUHJpbnQoTWF0Y2hlcjxpbnQ+KEx0KDUpKSkpOyAgLy8gdm9pZCBQcmludChpbnQpOworICBFWFBFQ1RfQ0FMTChwcmludGVyLCBQcmludChUeXBlZEVxPGNoYXI+KCdhJykpKTsgICAvLyB2b2lkIFByaW50KGNoYXIpOworCisgIHByaW50ZXIuUHJpbnQoMyk7CisgIHByaW50ZXIuUHJpbnQoNik7CisgIHByaW50ZXIuUHJpbnQoJ2EnKTsKK30KK2BgYAorCisjIyBQZXJmb3JtaW5nIERpZmZlcmVudCBBY3Rpb25zIEJhc2VkIG9uIHRoZSBBcmd1bWVudHMgIyMKKworV2hlbiBhIG1vY2sgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIF9sYXN0XyBtYXRjaGluZyBleHBlY3RhdGlvbiB0aGF0J3MKK3N0aWxsIGFjdGl2ZSB3aWxsIGJlIHNlbGVjdGVkICh0aGluayAibmV3ZXIgb3ZlcnJpZGVzIG9sZGVyIikuIFNvLCB5b3UKK2NhbiBtYWtlIGEgbWV0aG9kIGRvIGRpZmZlcmVudCB0aGluZ3MgZGVwZW5kaW5nIG9uIGl0cyBhcmd1bWVudCB2YWx1ZXMKK2xpa2UgdGhpczoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okx0OwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KKyAgLy8gVGhlIGRlZmF1bHQgY2FzZS4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoXykpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCdiJykpOworCisgIC8vIFRoZSBtb3JlIHNwZWNpZmljIGNhc2UuCisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKEx0KDUpKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oJ2EnKSk7CitgYGAKKworTm93LCBpZiBgZm9vLkRvVGhpcygpYCBpcyBjYWxsZWQgd2l0aCBhIHZhbHVlIGxlc3MgdGhhbiA1LCBgJ2EnYCB3aWxsCitiZSByZXR1cm5lZDsgb3RoZXJ3aXNlIGAnYidgIHdpbGwgYmUgcmV0dXJuZWQuCisKKyMjIE1hdGNoaW5nIE11bHRpcGxlIEFyZ3VtZW50cyBhcyBhIFdob2xlICMjCisKK1NvbWV0aW1lcyBpdCdzIG5vdCBlbm91Z2ggdG8gbWF0Y2ggdGhlIGFyZ3VtZW50cyBpbmRpdmlkdWFsbHkuIEZvcgorZXhhbXBsZSwgd2UgbWF5IHdhbnQgdG8gc2F5IHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgbGVzcyB0aGFuCit0aGUgc2Vjb25kIGFyZ3VtZW50LiBUaGUgYFdpdGgoKWAgY2xhdXNlIGFsbG93cyB1cyB0byBtYXRjaAorYWxsIGFyZ3VtZW50cyBvZiBhIG1vY2sgZnVuY3Rpb24gYXMgYSB3aG9sZS4gRm9yIGV4YW1wbGUsCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpMdDsKK3VzaW5nIDo6dGVzdGluZzo6TmU7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBJblJhbmdlKE5lKDApLCBfKSkKKyAgICAgIC5XaXRoKEx0KCkpOworYGBgCisKK3NheXMgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgb2YgYEluUmFuZ2UoKWAgbXVzdCBub3QgYmUgMCwgYW5kIG11c3QgYmUKK2xlc3MgdGhhbiB0aGUgc2Vjb25kIGFyZ3VtZW50LgorCitUaGUgZXhwcmVzc2lvbiBpbnNpZGUgYFdpdGgoKWAgbXVzdCBiZSBhIG1hdGNoZXIgb2YgdHlwZQorYE1hdGNoZXI8dHIxOjp0dXBsZTxBMSwgLi4uLCBBbj4gPmAsIHdoZXJlIGBBMWAsIC4uLiwgYEFuYCBhcmUgdGhlCit0eXBlcyBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLgorCitZb3UgY2FuIGFsc28gd3JpdGUgYEFsbEFyZ3MobSlgIGluc3RlYWQgb2YgYG1gIGluc2lkZSBgLldpdGgoKWAuIFRoZQordHdvIGZvcm1zIGFyZSBlcXVpdmFsZW50LCBidXQgYC5XaXRoKEFsbEFyZ3MoTHQoKSkpYCBpcyBtb3JlIHJlYWRhYmxlCit0aGFuIGAuV2l0aChMdCgpKWAuCisKK1lvdSBjYW4gdXNlIGBBcmdzPGsxLCAuLi4sIGtuPihtKWAgdG8gbWF0Y2ggdGhlIGBuYCBzZWxlY3RlZCBhcmd1bWVudHMKKyhhcyBhIHR1cGxlKSBhZ2FpbnN0IGBtYC4gRm9yIGV4YW1wbGUsCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBbGxPZjsKK3VzaW5nIDo6dGVzdGluZzo6QXJnczsKK3VzaW5nIDo6dGVzdGluZzo6THQ7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBCbGFoKF8sIF8sIF8pKQorICAgICAgLldpdGgoQWxsT2YoQXJnczwwLCAxPihMdCgpKSwgQXJnczwxLCAyPihMdCgpKSkpOworYGBgCisKK3NheXMgdGhhdCBgQmxhaCgpYCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyBgeGAsIGB5YCwgYW5kIGB6YCB3aGVyZQorYHggPCB5IDwgemAuCisKK0FzIGEgY29udmVuaWVuY2UgYW5kIGV4YW1wbGUsIEdvb2dsZSBNb2NrIHByb3ZpZGVzIHNvbWUgbWF0Y2hlcnMgZm9yCisyLXR1cGxlcywgaW5jbHVkaW5nIHRoZSBgTHQoKWAgbWF0Y2hlciBhYm92ZS4gU2VlIHRoZSBbQ2hlYXRTaGVldF0oVjFfN19DaGVhdFNoZWV0Lm1kKSBmb3IKK3RoZSBjb21wbGV0ZSBsaXN0LgorCitOb3RlIHRoYXQgaWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgYXJndW1lbnRzIHRvIGEgcHJlZGljYXRlIG9mIHlvdXIgb3duCisoZS5nLiBgLldpdGgoQXJnczwwLCAxPihUcnVseSgmTXlQcmVkaWNhdGUpKSlgKSwgdGhhdCBwcmVkaWNhdGUgTVVTVCBiZQord3JpdHRlbiB0byB0YWtlIGEgYHRyMTo6dHVwbGVgIGFzIGl0cyBhcmd1bWVudDsgR29vZ2xlIE1vY2sgd2lsbCBwYXNzIHRoZSBgbmAKK3NlbGVjdGVkIGFyZ3VtZW50cyBhcyBfb25lXyBzaW5nbGUgdHVwbGUgdG8gdGhlIHByZWRpY2F0ZS4KKworIyMgVXNpbmcgTWF0Y2hlcnMgYXMgUHJlZGljYXRlcyAjIworCitIYXZlIHlvdSBub3RpY2VkIHRoYXQgYSBtYXRjaGVyIGlzIGp1c3QgYSBmYW5jeSBwcmVkaWNhdGUgdGhhdCBhbHNvCitrbm93cyBob3cgdG8gZGVzY3JpYmUgaXRzZWxmPyBNYW55IGV4aXN0aW5nIGFsZ29yaXRobXMgdGFrZSBwcmVkaWNhdGVzCithcyBhcmd1bWVudHMgKGUuZy4gdGhvc2UgZGVmaW5lZCBpbiBTVEwncyBgPGFsZ29yaXRobT5gIGhlYWRlciksIGFuZAoraXQgd291bGQgYmUgYSBzaGFtZSBpZiBHb29nbGUgTW9jayBtYXRjaGVycyBhcmUgbm90IGFsbG93ZWQgdG8KK3BhcnRpY2lwYXRlLgorCitMdWNraWx5LCB5b3UgY2FuIHVzZSBhIG1hdGNoZXIgd2hlcmUgYSB1bmFyeSBwcmVkaWNhdGUgZnVuY3RvciBpcworZXhwZWN0ZWQgYnkgd3JhcHBpbmcgaXQgaW5zaWRlIHRoZSBgTWF0Y2hlcygpYCBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsCisKK2BgYAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3N0ZDo6dmVjdG9yPGludD4gdjsKKy4uLgorLy8gSG93IG1hbnkgZWxlbWVudHMgaW4gdiBhcmUgPj0gMTA/Citjb25zdCBpbnQgY291bnQgPSBjb3VudF9pZih2LmJlZ2luKCksIHYuZW5kKCksIE1hdGNoZXMoR2UoMTApKSk7CitgYGAKKworU2luY2UgeW91IGNhbiBidWlsZCBjb21wbGV4IG1hdGNoZXJzIGZyb20gc2ltcGxlciBvbmVzIGVhc2lseSB1c2luZworR29vZ2xlIE1vY2ssIHRoaXMgZ2l2ZXMgeW91IGEgd2F5IHRvIGNvbnZlbmllbnRseSBjb25zdHJ1Y3QgY29tcG9zaXRlCitwcmVkaWNhdGVzIChkb2luZyB0aGUgc2FtZSB1c2luZyBTVEwncyBgPGZ1bmN0aW9uYWw+YCBoZWFkZXIgaXMganVzdAorcGFpbmZ1bCkuIEZvciBleGFtcGxlLCBoZXJlJ3MgYSBwcmVkaWNhdGUgdGhhdCdzIHNhdGlzZmllZCBieSBhbnkKK251bWJlciB0aGF0IGlzID49IDAsIDw9IDEwMCwgYW5kICE9IDUwOgorCitgYGAKK01hdGNoZXMoQWxsT2YoR2UoMCksIExlKDEwMCksIE5lKDUwKSkpCitgYGAKKworIyMgVXNpbmcgTWF0Y2hlcnMgaW4gR29vZ2xlIFRlc3QgQXNzZXJ0aW9ucyAjIworCitTaW5jZSBtYXRjaGVycyBhcmUgYmFzaWNhbGx5IHByZWRpY2F0ZXMgdGhhdCBhbHNvIGtub3cgaG93IHRvIGRlc2NyaWJlCit0aGVtc2VsdmVzLCB0aGVyZSBpcyBhIHdheSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGVtIGluCitbR29vZ2xlIFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LykgYXNzZXJ0aW9ucy4gSXQncworY2FsbGVkIGBBU1NFUlRfVEhBVGAgYW5kIGBFWFBFQ1RfVEhBVGA6CisKK2BgYAorICBBU1NFUlRfVEhBVCh2YWx1ZSwgbWF0Y2hlcik7ICAvLyBBc3NlcnRzIHRoYXQgdmFsdWUgbWF0Y2hlcyBtYXRjaGVyLgorICBFWFBFQ1RfVEhBVCh2YWx1ZSwgbWF0Y2hlcik7ICAvLyBUaGUgbm9uLWZhdGFsIHZlcnNpb24uCitgYGAKKworRm9yIGV4YW1wbGUsIGluIGEgR29vZ2xlIFRlc3QgdGVzdCB5b3UgY2FuIHdyaXRlOgorCitgYGAKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorCit1c2luZyA6OnRlc3Rpbmc6OkFsbE9mOwordXNpbmcgOjp0ZXN0aW5nOjpHZTsKK3VzaW5nIDo6dGVzdGluZzo6TGU7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXNSZWdleDsKK3VzaW5nIDo6dGVzdGluZzo6U3RhcnRzV2l0aDsKKy4uLgorCisgIEVYUEVDVF9USEFUKEZvbygpLCBTdGFydHNXaXRoKCJIZWxsbyIpKTsKKyAgRVhQRUNUX1RIQVQoQmFyKCksIE1hdGNoZXNSZWdleCgiTGluZSBcXGQrIikpOworICBBU1NFUlRfVEhBVChCYXooKSwgQWxsT2YoR2UoNSksIExlKDEwKSkpOworYGBgCisKK3doaWNoIChhcyB5b3UgY2FuIHByb2JhYmx5IGd1ZXNzKSBleGVjdXRlcyBgRm9vKClgLCBgQmFyKClgLCBhbmQKK2BCYXooKWAsIGFuZCB2ZXJpZmllcyB0aGF0OgorCisgICogYEZvbygpYCByZXR1cm5zIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggYCJIZWxsbyJgLgorICAqIGBCYXIoKWAgcmV0dXJucyBhIHN0cmluZyB0aGF0IG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9uIGAiTGluZSBcXGQrImAuCisgICogYEJheigpYCByZXR1cm5zIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbNSwgMTBdLgorCitUaGUgbmljZSB0aGluZyBhYm91dCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBfdGhleSByZWFkIGxpa2UKK0VuZ2xpc2hfLiBUaGV5IGdlbmVyYXRlIGluZm9ybWF0aXZlIG1lc3NhZ2VzIHRvby4gRm9yIGV4YW1wbGUsIGlmIHRoZQorZmlyc3QgYEVYUEVDVF9USEFUKClgIGFib3ZlIGZhaWxzLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHNvbWV0aGluZyBsaWtlOgorCitgYGAKK1ZhbHVlIG9mOiBGb28oKQorICBBY3R1YWw6ICJIaSwgd29ybGQhIgorRXhwZWN0ZWQ6IHN0YXJ0cyB3aXRoICJIZWxsbyIKK2BgYAorCisqKkNyZWRpdDoqKiBUaGUgaWRlYSBvZiBgKEFTU0VSVHxFWFBFQ1QpX1RIQVRgIHdhcyBzdG9sZW4gZnJvbSB0aGUKK1tIYW1jcmVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2hhbWNyZXN0LykgcHJvamVjdCwgd2hpY2ggYWRkcworYGFzc2VydFRoYXQoKWAgdG8gSlVuaXQuCisKKyMjIFVzaW5nIFByZWRpY2F0ZXMgYXMgTWF0Y2hlcnMgIyMKKworR29vZ2xlIE1vY2sgcHJvdmlkZXMgYSBidWlsdC1pbiBzZXQgb2YgbWF0Y2hlcnMuIEluIGNhc2UgeW91IGZpbmQgdGhlbQorbGFja2luZywgeW91IGNhbiB1c2UgYW4gYXJiaXRyYXkgdW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIGZ1bmN0b3IKK2FzIGEgbWF0Y2hlciAtIGFzIGxvbmcgYXMgdGhlIHByZWRpY2F0ZSBhY2NlcHRzIGEgdmFsdWUgb2YgdGhlIHR5cGUKK3lvdSB3YW50LiBZb3UgZG8gdGhpcyBieSB3cmFwcGluZyB0aGUgcHJlZGljYXRlIGluc2lkZSB0aGUgYFRydWx5KClgCitmdW5jdGlvbiwgZm9yIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpUcnVseTsKKworaW50IElzRXZlbihpbnQgbikgeyByZXR1cm4gKG4gJSAyKSA9PSAwID8gMSA6IDA7IH0KKy4uLgorCisgIC8vIEJhcigpIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gZXZlbiBudW1iZXIuCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKFRydWx5KElzRXZlbikpKTsKK2BgYAorCitOb3RlIHRoYXQgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiAvIGZ1bmN0b3IgZG9lc24ndCBoYXZlIHRvIHJldHVybgorYGJvb2xgLiBJdCB3b3JrcyBhcyBsb25nIGFzIHRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlCitjb25kaXRpb24gaW4gc3RhdGVtZW50IGBpZiAoY29uZGl0aW9uKSAuLi5gLgorCisjIyBNYXRjaGluZyBBcmd1bWVudHMgdGhhdCBBcmUgTm90IENvcHlhYmxlICMjCisKK1doZW4geW91IGRvIGFuIGBFWFBFQ1RfQ0FMTChtb2NrX29iaiwgRm9vKGJhcikpYCwgR29vZ2xlIE1vY2sgc2F2ZXMKK2F3YXkgYSBjb3B5IG9mIGBiYXJgLiBXaGVuIGBGb28oKWAgaXMgY2FsbGVkIGxhdGVyLCBHb29nbGUgTW9jaworY29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIGBGb28oKWAgd2l0aCB0aGUgc2F2ZWQgY29weSBvZiBgYmFyYC4gVGhpcword2F5LCB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBgYmFyYCBiZWluZyBtb2RpZmllZCBvciBkZXN0cm95ZWQKK2FmdGVyIHRoZSBgRVhQRUNUX0NBTEwoKWAgaXMgZXhlY3V0ZWQuIFRoZSBzYW1lIGlzIHRydWUgd2hlbiB5b3UgdXNlCittYXRjaGVycyBsaWtlIGBFcShiYXIpYCwgYExlKGJhcilgLCBhbmQgc28gb24uCisKK0J1dCB3aGF0IGlmIGBiYXJgIGNhbm5vdCBiZSBjb3BpZWQgKGkuZS4gaGFzIG5vIGNvcHkgY29uc3RydWN0b3IpPyBZb3UKK2NvdWxkIGRlZmluZSB5b3VyIG93biBtYXRjaGVyIGZ1bmN0aW9uIGFuZCB1c2UgaXQgd2l0aCBgVHJ1bHkoKWAsIGFzCit0aGUgcHJldmlvdXMgY291cGxlIG9mIHJlY2lwZXMgaGF2ZSBzaG93bi4gT3IsIHlvdSBtYXkgYmUgYWJsZSB0byBnZXQKK2F3YXkgZnJvbSBpdCBpZiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IGBiYXJgIHdvbid0IGJlIGNoYW5nZWQgYWZ0ZXIKK3RoZSBgRVhQRUNUX0NBTEwoKWAgaXMgZXhlY3V0ZWQuIEp1c3QgdGVsbCBHb29nbGUgTW9jayB0aGF0IGl0IHNob3VsZAorc2F2ZSBhIHJlZmVyZW5jZSB0byBgYmFyYCwgaW5zdGVhZCBvZiBhIGNvcHkgb2YgaXQuIEhlcmUncyBob3c6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpFcTsKK3VzaW5nIDo6dGVzdGluZzo6QnlSZWY7Cit1c2luZyA6OnRlc3Rpbmc6Okx0OworLi4uCisgIC8vIEV4cGVjdHMgdGhhdCBGb28oKSdzIGFyZ3VtZW50ID09IGJhci4KKyAgRVhQRUNUX0NBTEwobW9ja19vYmosIEZvbyhFcShCeVJlZihiYXIpKSkpOworCisgIC8vIEV4cGVjdHMgdGhhdCBGb28oKSdzIGFyZ3VtZW50IDwgYmFyLgorICBFWFBFQ1RfQ0FMTChtb2NrX29iaiwgRm9vKEx0KEJ5UmVmKGJhcikpKSk7CitgYGAKKworUmVtZW1iZXI6IGlmIHlvdSBkbyB0aGlzLCBkb24ndCBjaGFuZ2UgYGJhcmAgYWZ0ZXIgdGhlCitgRVhQRUNUX0NBTEwoKWAsIG9yIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorCisjIyBWYWxpZGF0aW5nIGEgTWVtYmVyIG9mIGFuIE9iamVjdCAjIworCitPZnRlbiBhIG1vY2sgZnVuY3Rpb24gdGFrZXMgYSByZWZlcmVuY2UgdG8gb2JqZWN0IGFzIGFuIGFyZ3VtZW50LiBXaGVuCittYXRjaGluZyB0aGUgYXJndW1lbnQsIHlvdSBtYXkgbm90IHdhbnQgdG8gY29tcGFyZSB0aGUgZW50aXJlIG9iamVjdAorYWdhaW5zdCBhIGZpeGVkIG9iamVjdCwgYXMgdGhhdCBtYXkgYmUgb3Zlci1zcGVjaWZpY2F0aW9uLiBJbnN0ZWFkLAoreW91IG1heSBuZWVkIHRvIHZhbGlkYXRlIGEgY2VydGFpbiBtZW1iZXIgdmFyaWFibGUgb3IgdGhlIHJlc3VsdCBvZiBhCitjZXJ0YWluIGdldHRlciBtZXRob2Qgb2YgdGhlIG9iamVjdC4gWW91IGNhbiBkbyB0aGlzIHdpdGggYEZpZWxkKClgCithbmQgYFByb3BlcnR5KClgLiBNb3JlIHNwZWNpZmljYWxseSwKKworYGBgCitGaWVsZCgmRm9vOjpiYXIsIG0pCitgYGAKKworaXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGBGb29gIG9iamVjdCB3aG9zZSBgYmFyYCBtZW1iZXIgdmFyaWFibGUKK3NhdGlzZmllcyBtYXRjaGVyIGBtYC4KKworYGBgCitQcm9wZXJ0eSgmRm9vOjpiYXosIG0pCitgYGAKKworaXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGBGb29gIG9iamVjdCB3aG9zZSBgYmF6KClgIG1ldGhvZCByZXR1cm5zCithIHZhbHVlIHRoYXQgc2F0aXNmaWVzIG1hdGNoZXIgYG1gLgorCitGb3IgZXhhbXBsZToKKworPiB8IGBGaWVsZCgmRm9vOjpudW1iZXIsIEdlKDMpKWAgfCBNYXRjaGVzIGB4YCB3aGVyZSBgeC5udW1iZXIgPj0gM2AuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorPiB8IGBQcm9wZXJ0eSgmRm9vOjpuYW1lLCBTdGFydHNXaXRoKCJKb2huICIpKWAgfCBNYXRjaGVzIGB4YCB3aGVyZSBgeC5uYW1lKClgIHN0YXJ0cyB3aXRoIGAiSm9obiAiYC4gfAorCitOb3RlIHRoYXQgaW4gYFByb3BlcnR5KCZGb286OmJheiwgLi4uKWAsIG1ldGhvZCBgYmF6KClgIG11c3QgdGFrZSBubworYXJndW1lbnQgYW5kIGJlIGRlY2xhcmVkIGFzIGBjb25zdGAuCisKK0JUVywgYEZpZWxkKClgIGFuZCBgUHJvcGVydHkoKWAgY2FuIGFsc28gbWF0Y2ggcGxhaW4gcG9pbnRlcnMgdG8KK29iamVjdHMuIEZvciBpbnN0YW5jZSwKKworYGBgCitGaWVsZCgmRm9vOjpudW1iZXIsIEdlKDMpKQorYGBgCisKK21hdGNoZXMgYSBwbGFpbiBwb2ludGVyIGBwYCB3aGVyZSBgcC0+bnVtYmVyID49IDNgLiBJZiBgcGAgaXMgYE5VTExgLAordGhlIG1hdGNoIHdpbGwgYWx3YXlzIGZhaWwgcmVnYXJkbGVzcyBvZiB0aGUgaW5uZXIgbWF0Y2hlci4KKworV2hhdCBpZiB5b3Ugd2FudCB0byB2YWxpZGF0ZSBtb3JlIHRoYW4gb25lIG1lbWJlcnMgYXQgdGhlIHNhbWUgdGltZT8KK1JlbWVtYmVyIHRoYXQgdGhlcmUgaXMgYEFsbE9mKClgLgorCisjIyBWYWxpZGF0aW5nIHRoZSBWYWx1ZSBQb2ludGVkIHRvIGJ5IGEgUG9pbnRlciBBcmd1bWVudCAjIworCitDKysgZnVuY3Rpb25zIG9mdGVuIHRha2UgcG9pbnRlcnMgYXMgYXJndW1lbnRzLiBZb3UgY2FuIHVzZSBtYXRjaGVycworbGlrZSBgSXNOdWxsKClgLCBgTm90TnVsbCgpYCwgYW5kIG90aGVyIGNvbXBhcmlzb24gbWF0Y2hlcnMgdG8gbWF0Y2ggYQorcG9pbnRlciwgYnV0IHdoYXQgaWYgeW91IHdhbnQgdG8gbWFrZSBzdXJlIHRoZSB2YWx1ZSBfcG9pbnRlZCB0b18gYnkKK3RoZSBwb2ludGVyLCBpbnN0ZWFkIG9mIHRoZSBwb2ludGVyIGl0c2VsZiwgaGFzIGEgY2VydGFpbiBwcm9wZXJ0eT8KK1dlbGwsIHlvdSBjYW4gdXNlIHRoZSBgUG9pbnRlZShtKWAgbWF0Y2hlci4KKworYFBvaW50ZWUobSlgIG1hdGNoZXMgYSBwb2ludGVyIGlmZiBgbWAgbWF0Y2hlcyB0aGUgdmFsdWUgdGhlIHBvaW50ZXIKK3BvaW50cyB0by4gRm9yIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpHZTsKK3VzaW5nIDo6dGVzdGluZzo6UG9pbnRlZTsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIEJhcihQb2ludGVlKEdlKDMpKSkpOworYGBgCisKK2V4cGVjdHMgYGZvby5CYXIoKWAgdG8gYmUgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgdmFsdWUKK2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAzLgorCitPbmUgbmljZSB0aGluZyBhYm91dCBgUG9pbnRlZSgpYCBpcyB0aGF0IGl0IHRyZWF0cyBhIGBOVUxMYCBwb2ludGVyIGFzCithIG1hdGNoIGZhaWx1cmUsIHNvIHlvdSBjYW4gd3JpdGUgYFBvaW50ZWUobSlgIGluc3RlYWQgb2YKKworYGBgCisgIEFsbE9mKE5vdE51bGwoKSwgUG9pbnRlZShtKSkKK2BgYAorCit3aXRob3V0IHdvcnJ5aW5nIHRoYXQgYSBgTlVMTGAgcG9pbnRlciB3aWxsIGNyYXNoIHlvdXIgdGVzdC4KKworQWxzbywgZGlkIHdlIHRlbGwgeW91IHRoYXQgYFBvaW50ZWUoKWAgd29ya3Mgd2l0aCBib3RoIHJhdyBwb2ludGVycworKiphbmQqKiBzbWFydCBwb2ludGVycyAoYGxpbmtlZF9wdHJgLCBgc2hhcmVkX3B0cmAsIGBzY29wZWRfcHRyYCwgYW5kCitldGMpPworCitXaGF0IGlmIHlvdSBoYXZlIGEgcG9pbnRlciB0byBwb2ludGVyPyBZb3UgZ3Vlc3NlZCBpdCAtIHlvdSBjYW4gdXNlCituZXN0ZWQgYFBvaW50ZWUoKWAgdG8gcHJvYmUgZGVlcGVyIGluc2lkZSB0aGUgdmFsdWUuIEZvciBleGFtcGxlLAorYFBvaW50ZWUoUG9pbnRlZShMdCgzKSkpYCBtYXRjaGVzIGEgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIHBvaW50ZXIKK3RoYXQgcG9pbnRzIHRvIGEgbnVtYmVyIGxlc3MgdGhhbiAzICh3aGF0IGEgbW91dGhmdWwuLi4pLgorCisjIyBUZXN0aW5nIGEgQ2VydGFpbiBQcm9wZXJ0eSBvZiBhbiBPYmplY3QgIyMKKworU29tZXRpbWVzIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhhdCBhbiBvYmplY3QgYXJndW1lbnQgaGFzIGEgY2VydGFpbgorcHJvcGVydHksIGJ1dCB0aGVyZSBpcyBubyBleGlzdGluZyBtYXRjaGVyIHRoYXQgZG9lcyB0aGlzLiBJZiB5b3Ugd2FudAorZ29vZCBlcnJvciBtZXNzYWdlcywgeW91IHNob3VsZCBkZWZpbmUgYSBtYXRjaGVyLiBJZiB5b3Ugd2FudCB0byBkbyBpdAorcXVpY2sgYW5kIGRpcnR5LCB5b3UgY291bGQgZ2V0IGF3YXkgd2l0aCB3cml0aW5nIGFuIG9yZGluYXJ5IGZ1bmN0aW9uLgorCitMZXQncyBzYXkgeW91IGhhdmUgYSBtb2NrIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gb2JqZWN0IG9mIHR5cGUgYEZvb2AsCit3aGljaCBoYXMgYW4gYGludCBiYXIoKWAgbWV0aG9kIGFuZCBhbiBgaW50IGJheigpYCBtZXRob2QsIGFuZCB5b3UKK3dhbnQgdG8gY29uc3RyYWluIHRoYXQgdGhlIGFyZ3VtZW50J3MgYGJhcigpYCB2YWx1ZSBwbHVzIGl0cyBgYmF6KClgCit2YWx1ZSBpcyBhIGdpdmVuIG51bWJlci4gSGVyZSdzIGhvdyB5b3UgY2FuIGRlZmluZSBhIG1hdGNoZXIgdG8gZG8gaXQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworCitjbGFzcyBCYXJQbHVzQmF6RXFNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Y29uc3QgRm9vJj4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQmFyUGx1c0JhekVxTWF0Y2hlcihpbnQgZXhwZWN0ZWRfc3VtKQorICAgICAgOiBleHBlY3RlZF9zdW1fKGV4cGVjdGVkX3N1bSkge30KKworICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IEZvbyYgZm9vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgcmV0dXJuIChmb28uYmFyKCkgKyBmb28uYmF6KCkpID09IGV4cGVjdGVkX3N1bV87CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImJhcigpICsgYmF6KCkgZXF1YWxzICIgPDwgZXhwZWN0ZWRfc3VtXzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJiYXIoKSArIGJheigpIGRvZXMgbm90IGVxdWFsICIgPDwgZXhwZWN0ZWRfc3VtXzsKKyAgfQorIHByaXZhdGU6CisgIGNvbnN0IGludCBleHBlY3RlZF9zdW1fOworfTsKKworaW5saW5lIE1hdGNoZXI8Y29uc3QgRm9vJj4gQmFyUGx1c0JhekVxKGludCBleHBlY3RlZF9zdW0pIHsKKyAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBCYXJQbHVzQmF6RXFNYXRjaGVyKGV4cGVjdGVkX3N1bSkpOworfQorCisuLi4KKworICBFWFBFQ1RfQ0FMTCguLi4sIERvVGhpcyhCYXJQbHVzQmF6RXEoNSkpKS4uLjsKK2BgYAorCisjIyBNYXRjaGluZyBDb250YWluZXJzICMjCisKK1NvbWV0aW1lcyBhbiBTVEwgY29udGFpbmVyIChlLmcuIGxpc3QsIHZlY3RvciwgbWFwLCAuLi4pIGlzIHBhc3NlZCB0bworYSBtb2NrIGZ1bmN0aW9uIGFuZCB5b3UgbWF5IHdhbnQgdG8gdmFsaWRhdGUgaXQuIFNpbmNlIG1vc3QgU1RMCitjb250YWluZXJzIHN1cHBvcnQgdGhlIGA9PWAgb3BlcmF0b3IsIHlvdSBjYW4gd3JpdGUKK2BFcShleHBlY3RlZF9jb250YWluZXIpYCBvciBzaW1wbHkgYGV4cGVjdGVkX2NvbnRhaW5lcmAgdG8gbWF0Y2ggYQorY29udGFpbmVyIGV4YWN0bHkuCisKK1NvbWV0aW1lcywgdGhvdWdoLCB5b3UgbWF5IHdhbnQgdG8gYmUgbW9yZSBmbGV4aWJsZSAoZm9yIGV4YW1wbGUsIHRoZQorZmlyc3QgZWxlbWVudCBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoLCBidXQgdGhlIHNlY29uZCBlbGVtZW50IGNhbiBiZQorYW55IHBvc2l0aXZlIG51bWJlciwgYW5kIHNvIG9uKS4gQWxzbywgY29udGFpbmVycyB1c2VkIGluIHRlc3RzIG9mdGVuCitoYXZlIGEgc21hbGwgbnVtYmVyIG9mIGVsZW1lbnRzLCBhbmQgaGF2aW5nIHRvIGRlZmluZSB0aGUgZXhwZWN0ZWQKK2NvbnRhaW5lciBvdXQtb2YtbGluZSBpcyBhIGJpdCBvZiBhIGhhc3NsZS4KKworWW91IGNhbiB1c2UgdGhlIGBFbGVtZW50c0FyZSgpYCBvciBgVW5vcmRlcmVkRWxlbWVudHNBcmUoKWAgbWF0Y2hlciBpbgorc3VjaCBjYXNlczoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlOwordXNpbmcgOjp0ZXN0aW5nOjpHdDsKKy4uLgorCisgIE1PQ0tfTUVUSE9EMShGb28sIHZvaWQoY29uc3QgdmVjdG9yPGludD4mIG51bWJlcnMpKTsKKy4uLgorCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhFbGVtZW50c0FyZSgxLCBHdCgwKSwgXywgNSkpKTsKK2BgYAorCitUaGUgYWJvdmUgbWF0Y2hlciBzYXlzIHRoYXQgdGhlIGNvbnRhaW5lciBtdXN0IGhhdmUgNCBlbGVtZW50cywgd2hpY2gKK211c3QgYmUgMSwgZ3JlYXRlciB0aGFuIDAsIGFueXRoaW5nLCBhbmQgNSByZXNwZWN0aXZlbHkuCisKK0lmIHlvdSBpbnN0ZWFkIHdyaXRlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6R3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlVub3JkZXJlZEVsZW1lbnRzQXJlOworLi4uCisKKyAgTU9DS19NRVRIT0QxKEZvbywgdm9pZChjb25zdCB2ZWN0b3I8aW50PiYgbnVtYmVycykpOworLi4uCisKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKFVub3JkZXJlZEVsZW1lbnRzQXJlKDEsIEd0KDApLCBfLCA1KSkpOworYGBgCisKK0l0IG1lYW5zIHRoYXQgdGhlIGNvbnRhaW5lciBtdXN0IGhhdmUgNCBlbGVtZW50cywgd2hpY2ggdW5kZXIgc29tZQorcGVybXV0YXRpb24gbXVzdCBiZSAxLCBncmVhdGVyIHRoYW4gMCwgYW55dGhpbmcsIGFuZCA1IHJlc3BlY3RpdmVseS4KKworYEVsZW1lbnRzQXJlKClgIGFuZCBgVW5vcmRlcmVkRWxlbWVudHNBcmUoKWAgYXJlIG92ZXJsb2FkZWQgdG8gdGFrZSAwCit0byAxMCBhcmd1bWVudHMuIElmIG1vcmUgYXJlIG5lZWRlZCwgeW91IGNhbiBwbGFjZSB0aGVtIGluIGEgQy1zdHlsZQorYXJyYXkgYW5kIHVzZSBgRWxlbWVudHNBcmVBcnJheSgpYCBvciBgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpYAoraW5zdGVhZDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXk7CisuLi4KKworICAvLyBFbGVtZW50c0FyZUFycmF5IGFjY2VwdHMgYW4gYXJyYXkgb2YgZWxlbWVudCB2YWx1ZXMuCisgIGNvbnN0IGludCBleHBlY3RlZF92ZWN0b3IxW10gPSB7IDEsIDUsIDIsIDQsIC4uLiB9OworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oRWxlbWVudHNBcmVBcnJheShleHBlY3RlZF92ZWN0b3IxKSkpOworCisgIC8vIE9yLCBhbiBhcnJheSBvZiBlbGVtZW50IG1hdGNoZXJzLgorICBNYXRjaGVyPGludD4gZXhwZWN0ZWRfdmVjdG9yMiA9IHsgMSwgR3QoMiksIF8sIDMsIC4uLiB9OworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oRWxlbWVudHNBcmVBcnJheShleHBlY3RlZF92ZWN0b3IyKSkpOworYGBgCisKK0luIGNhc2UgdGhlIGFycmF5IG5lZWRzIHRvIGJlIGR5bmFtaWNhbGx5IGNyZWF0ZWQgKGFuZCB0aGVyZWZvcmUgdGhlCithcnJheSBzaXplIGNhbm5vdCBiZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIpLCB5b3UgY2FuIGdpdmUKK2BFbGVtZW50c0FyZUFycmF5KClgIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gc3BlY2lmeSB0aGUgYXJyYXkgc2l6ZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXk7CisuLi4KKyAgaW50KiBjb25zdCBleHBlY3RlZF92ZWN0b3IzID0gbmV3IGludFtjb3VudF07CisgIC4uLiBmaWxsIGV4cGVjdGVkX3ZlY3RvcjMgd2l0aCB2YWx1ZXMgLi4uCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkX3ZlY3RvcjMsIGNvdW50KSkpOworYGBgCisKKyoqVGlwczoqKgorCisgICogYEVsZW1lbnRzQXJlKigpYCBjYW4gYmUgdXNlZCB0byBtYXRjaCBfYW55XyBjb250YWluZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBTVEwgaXRlcmF0b3IgcGF0dGVybiAoaS5lLiBpdCBoYXMgYSBgY29uc3RfaXRlcmF0b3JgIHR5cGUgYW5kIHN1cHBvcnRzIGBiZWdpbigpL2VuZCgpYCksIG5vdCBqdXN0IHRoZSBvbmVzIGRlZmluZWQgaW4gU1RMLiBJdCB3aWxsIGV2ZW4gd29yayB3aXRoIGNvbnRhaW5lciB0eXBlcyB5ZXQgdG8gYmUgd3JpdHRlbiAtIGFzIGxvbmcgYXMgdGhleSBmb2xsb3dzIHRoZSBhYm92ZSBwYXR0ZXJuLgorICAqIFlvdSBjYW4gdXNlIG5lc3RlZCBgRWxlbWVudHNBcmUqKClgIHRvIG1hdGNoIG5lc3RlZCAobXVsdGktZGltZW5zaW9uYWwpIGNvbnRhaW5lcnMuCisgICogSWYgdGhlIGNvbnRhaW5lciBpcyBwYXNzZWQgYnkgcG9pbnRlciBpbnN0ZWFkIG9mIGJ5IHJlZmVyZW5jZSwganVzdCB3cml0ZSBgUG9pbnRlZShFbGVtZW50c0FyZSooLi4uKSlgLgorICAqIFRoZSBvcmRlciBvZiBlbGVtZW50cyBfbWF0dGVyc18gZm9yIGBFbGVtZW50c0FyZSooKWAuIFRoZXJlZm9yZSBkb24ndCB1c2UgaXQgd2l0aCBjb250YWluZXJzIHdob3NlIGVsZW1lbnQgb3JkZXIgaXMgdW5kZWZpbmVkIChlLmcuIGBoYXNoX21hcGApLgorCisjIyBTaGFyaW5nIE1hdGNoZXJzICMjCisKK1VuZGVyIHRoZSBob29kLCBhIEdvb2dsZSBNb2NrIG1hdGNoZXIgb2JqZWN0IGNvbnNpc3RzIG9mIGEgcG9pbnRlciB0bworYSByZWYtY291bnRlZCBpbXBsZW1lbnRhdGlvbiBvYmplY3QuIENvcHlpbmcgbWF0Y2hlcnMgaXMgYWxsb3dlZCBhbmQKK3ZlcnkgZWZmaWNpZW50LCBhcyBvbmx5IHRoZSBwb2ludGVyIGlzIGNvcGllZC4gV2hlbiB0aGUgbGFzdCBtYXRjaGVyCit0aGF0IHJlZmVyZW5jZXMgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdCBkaWVzLCB0aGUgaW1wbGVtZW50YXRpb24KK29iamVjdCB3aWxsIGJlIGRlbGV0ZWQuCisKK1RoZXJlZm9yZSwgaWYgeW91IGhhdmUgc29tZSBjb21wbGV4IG1hdGNoZXIgdGhhdCB5b3Ugd2FudCB0byB1c2UgYWdhaW4KK2FuZCBhZ2FpbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBidWlsZCBpdCBldmVyeXRpbWUuIEp1c3QgYXNzaWduIGl0IHRvIGEKK21hdGNoZXIgdmFyaWFibGUgYW5kIHVzZSB0aGF0IHZhcmlhYmxlIHJlcGVhdGVkbHkhIEZvciBleGFtcGxlLAorCitgYGAKKyAgTWF0Y2hlcjxpbnQ+IGluX3JhbmdlID0gQWxsT2YoR3QoNSksIExlKDEwKSk7CisgIC4uLiB1c2UgaW5fcmFuZ2UgYXMgYSBtYXRjaGVyIGluIG11bHRpcGxlIEVYUEVDVF9DQUxMcyAuLi4KK2BgYAorCisjIFNldHRpbmcgRXhwZWN0YXRpb25zICMKKworIyMgS25vd2luZyBXaGVuIHRvIEV4cGVjdCAjIworCitgT05fQ0FMTGAgaXMgbGlrZWx5IHRoZSBzaW5nbGUgbW9zdCB1bmRlci11dGlsaXplZCBjb25zdHJ1Y3QgaW4gR29vZ2xlIE1vY2suCisKK1RoZXJlIGFyZSBiYXNpY2FsbHkgdHdvIGNvbnN0cnVjdHMgZm9yIGRlZmluaW5nIHRoZSBiZWhhdmlvciBvZiBhIG1vY2sgb2JqZWN0OiBgT05fQ0FMTGAgYW5kIGBFWFBFQ1RfQ0FMTGAuIFRoZSBkaWZmZXJlbmNlPyBgT05fQ0FMTGAgZGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiBhIG1vY2sgbWV0aG9kIGlzIGNhbGxlZCwgYnV0IF9kb2Vzbid0IGltcGx5IGFueSBleHBlY3RhdGlvbiBvbiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC5fIGBFWFBFQ1RfQ0FMTGAgbm90IG9ubHkgZGVmaW5lcyB0aGUgYmVoYXZpb3IsIGJ1dCBhbHNvIHNldHMgYW4gZXhwZWN0YXRpb24gdGhhdCBfdGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMsIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHRpbWVzXyAoYW5kIF9pbiB0aGUgZ2l2ZW4gb3JkZXJfIHdoZW4geW91IHNwZWNpZnkgdGhlIG9yZGVyIHRvbykuCisKK1NpbmNlIGBFWFBFQ1RfQ0FMTGAgZG9lcyBtb3JlLCBpc24ndCBpdCBiZXR0ZXIgdGhhbiBgT05fQ0FMTGA/IE5vdCByZWFsbHkuIEV2ZXJ5IGBFWFBFQ1RfQ0FMTGAgYWRkcyBhIGNvbnN0cmFpbnQgb24gdGhlIGJlaGF2aW9yIG9mIHRoZSBjb2RlIHVuZGVyIHRlc3QuIEhhdmluZyBtb3JlIGNvbnN0cmFpbnRzIHRoYW4gbmVjZXNzYXJ5IGlzIF9iYWFhZF8gLSBldmVuIHdvcnNlIHRoYW4gbm90IGhhdmluZyBlbm91Z2ggY29uc3RyYWludHMuCisKK1RoaXMgbWF5IGJlIGNvdW50ZXItaW50dWl0aXZlLiBIb3cgY291bGQgdGVzdHMgdGhhdCB2ZXJpZnkgbW9yZSBiZSB3b3JzZSB0aGFuIHRlc3RzIHRoYXQgdmVyaWZ5IGxlc3M/IElzbid0IHZlcmlmaWNhdGlvbiB0aGUgd2hvbGUgcG9pbnQgb2YgdGVzdHM/CisKK1RoZSBhbnN3ZXIsIGxpZXMgaW4gX3doYXRfIGEgdGVzdCBzaG91bGQgdmVyaWZ5LiAqKkEgZ29vZCB0ZXN0IHZlcmlmaWVzIHRoZSBjb250cmFjdCBvZiB0aGUgY29kZS4qKiBJZiBhIHRlc3Qgb3Zlci1zcGVjaWZpZXMsIGl0IGRvZXNuJ3QgbGVhdmUgZW5vdWdoIGZyZWVkb20gdG8gdGhlIGltcGxlbWVudGF0aW9uLiBBcyBhIHJlc3VsdCwgY2hhbmdpbmcgdGhlIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGNvbnRyYWN0IChlLmcuIHJlZmFjdG9yaW5nIGFuZCBvcHRpbWl6YXRpb24pLCB3aGljaCBzaG91bGQgYmUgcGVyZmVjdGx5IGZpbmUgdG8gZG8sIGNhbiBicmVhayBzdWNoIHRlc3RzLiBUaGVuIHlvdSBoYXZlIHRvIHNwZW5kIHRpbWUgZml4aW5nIHRoZW0sIG9ubHkgdG8gc2VlIHRoZW0gYnJva2VuIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhlIGltcGxlbWVudGF0aW9uIGlzIGNoYW5nZWQuCisKK0tlZXAgaW4gbWluZCB0aGF0IG9uZSBkb2Vzbid0IGhhdmUgdG8gdmVyaWZ5IG1vcmUgdGhhbiBvbmUgcHJvcGVydHkgaW4gb25lIHRlc3QuIEluIGZhY3QsICoqaXQncyBhIGdvb2Qgc3R5bGUgdG8gdmVyaWZ5IG9ubHkgb25lIHRoaW5nIGluIG9uZSB0ZXN0LioqIElmIHlvdSBkbyB0aGF0LCBhIGJ1ZyB3aWxsIGxpa2VseSBicmVhayBvbmx5IG9uZSBvciB0d28gdGVzdHMgaW5zdGVhZCBvZiBkb3plbnMgKHdoaWNoIGNhc2Ugd291bGQgeW91IHJhdGhlciBkZWJ1Zz8pLiBJZiB5b3UgYXJlIGFsc28gaW4gdGhlIGhhYml0IG9mIGdpdmluZyB0ZXN0cyBkZXNjcmlwdGl2ZSBuYW1lcyB0aGF0IHRlbGwgd2hhdCB0aGV5IHZlcmlmeSwgeW91IGNhbiBvZnRlbiBlYXNpbHkgZ3Vlc3Mgd2hhdCdzIHdyb25nIGp1c3QgZnJvbSB0aGUgdGVzdCBsb2cgaXRzZWxmLgorCitTbyB1c2UgYE9OX0NBTExgIGJ5IGRlZmF1bHQsIGFuZCBvbmx5IHVzZSBgRVhQRUNUX0NBTExgIHdoZW4geW91IGFjdHVhbGx5IGludGVuZCB0byB2ZXJpZnkgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLiBGb3IgZXhhbXBsZSwgeW91IG1heSBoYXZlIGEgYnVuY2ggb2YgYE9OX0NBTExgcyBpbiB5b3VyIHRlc3QgZml4dHVyZSB0byBzZXQgdGhlIGNvbW1vbiBtb2NrIGJlaGF2aW9yIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhlIHNhbWUgZ3JvdXAsIGFuZCB3cml0ZSAoc2NhcmNlbHkpIGRpZmZlcmVudCBgRVhQRUNUX0NBTExgcyBpbiBkaWZmZXJlbnQgYFRFU1RfRmBzIHRvIHZlcmlmeSBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgY29kZSdzIGJlaGF2aW9yLiBDb21wYXJlZCB3aXRoIHRoZSBzdHlsZSB3aGVyZSBlYWNoIGBURVNUYCBoYXMgbWFueSBgRVhQRUNUX0NBTExgcywgdGhpcyBsZWFkcyB0byB0ZXN0cyB0aGF0IGFyZSBtb3JlIHJlc2lsaWVudCB0byBpbXBsZW1lbnRhdGlvbmFsIGNoYW5nZXMgKGFuZCB0aHVzIGxlc3MgbGlrZWx5IHRvIHJlcXVpcmUgbWFpbnRlbmFuY2UpIGFuZCBtYWtlcyB0aGUgaW50ZW50IG9mIHRoZSB0ZXN0cyBtb3JlIG9idmlvdXMgKHNvIHRoZXkgYXJlIGVhc2llciB0byBtYWludGFpbiB3aGVuIHlvdSBkbyBuZWVkIHRvIG1haW50YWluIHRoZW0pLgorCisjIyBJZ25vcmluZyBVbmludGVyZXN0aW5nIENhbGxzICMjCisKK0lmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaG93IGEgbW9jayBtZXRob2QgaXMgY2FsbGVkLCBqdXN0IGRvbid0CitzYXkgYW55dGhpbmcgYWJvdXQgaXQuIEluIHRoaXMgY2FzZSwgaWYgdGhlIG1ldGhvZCBpcyBldmVyIGNhbGxlZCwKK0dvb2dsZSBNb2NrIHdpbGwgcGVyZm9ybSBpdHMgZGVmYXVsdCBhY3Rpb24gdG8gYWxsb3cgdGhlIHRlc3QgcHJvZ3JhbQordG8gY29udGludWUuIElmIHlvdSBhcmUgbm90IGhhcHB5IHdpdGggdGhlIGRlZmF1bHQgYWN0aW9uIHRha2VuIGJ5CitHb29nbGUgTW9jaywgeW91IGNhbiBvdmVycmlkZSBpdCB1c2luZyBgRGVmYXVsdFZhbHVlPFQ+OjpTZXQoKWAKKyhkZXNjcmliZWQgbGF0ZXIgaW4gdGhpcyBkb2N1bWVudCkgb3IgYE9OX0NBTEwoKWAuCisKK1BsZWFzZSBub3RlIHRoYXQgb25jZSB5b3UgZXhwcmVzc2VkIGludGVyZXN0IGluIGEgcGFydGljdWxhciBtb2NrCittZXRob2QgKHZpYSBgRVhQRUNUX0NBTEwoKWApLCBhbGwgaW52b2NhdGlvbnMgdG8gaXQgbXVzdCBtYXRjaCBzb21lCitleHBlY3RhdGlvbi4gSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnV0IHRoZSBhcmd1bWVudHMgZG9uJ3QgbWF0Y2gKK2FueSBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50LCBpdCB3aWxsIGJlIGFuIGVycm9yLgorCisjIyBEaXNhbGxvd2luZyBVbmV4cGVjdGVkIENhbGxzICMjCisKK0lmIGEgbW9jayBtZXRob2Qgc2hvdWxkbid0IGJlIGNhbGxlZCBhdCBhbGwsIGV4cGxpY2l0bHkgc2F5IHNvOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKy4uLgorICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfKSkKKyAgICAgIC5UaW1lcygwKTsKK2BgYAorCitJZiBzb21lIGNhbGxzIHRvIHRoZSBtZXRob2QgYXJlIGFsbG93ZWQsIGJ1dCB0aGUgcmVzdCBhcmUgbm90LCBqdXN0CitsaXN0IGFsbCB0aGUgZXhwZWN0ZWQgY2FsbHM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Cit1c2luZyA6OnRlc3Rpbmc6Okd0OworLi4uCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKDUpKTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoR3QoMTApKSkKKyAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CitgYGAKKworQSBjYWxsIHRvIGBmb28uQmFyKClgIHRoYXQgZG9lc24ndCBtYXRjaCBhbnkgb2YgdGhlIGBFWFBFQ1RfQ0FMTCgpYAorc3RhdGVtZW50cyB3aWxsIGJlIGFuIGVycm9yLgorCisjIyBFeHBlY3RpbmcgT3JkZXJlZCBDYWxscyAjIworCitBbHRob3VnaCBhbiBgRVhQRUNUX0NBTEwoKWAgc3RhdGVtZW50IGRlZmluZWQgZWFybGllciB0YWtlcyBwcmVjZWRlbmNlCit3aGVuIEdvb2dsZSBNb2NrIHRyaWVzIHRvIG1hdGNoIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGFuIGV4cGVjdGF0aW9uLAorYnkgZGVmYXVsdCBjYWxscyBkb24ndCBoYXZlIHRvIGhhcHBlbiBpbiB0aGUgb3JkZXIgYEVYUEVDVF9DQUxMKClgCitzdGF0ZW1lbnRzIGFyZSB3cml0dGVuLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFyZ3VtZW50cyBtYXRjaCB0aGUKK21hdGNoZXJzIGluIHRoZSB0aGlyZCBgRVhQRUNUX0NBTEwoKWAsIGJ1dCBub3QgdGhvc2UgaW4gdGhlIGZpcnN0IHR3bywKK3RoZW4gdGhlIHRoaXJkIGV4cGVjdGF0aW9uIHdpbGwgYmUgdXNlZC4KKworSWYgeW91IHdvdWxkIHJhdGhlciBoYXZlIGFsbCBjYWxscyBvY2N1ciBpbiB0aGUgb3JkZXIgb2YgdGhlCitleHBlY3RhdGlvbnMsIHB1dCB0aGUgYEVYUEVDVF9DQUxMKClgIHN0YXRlbWVudHMgaW4gYSBibG9jayB3aGVyZSB5b3UKK2RlZmluZSBhIHZhcmlhYmxlIG9mIHR5cGUgYEluU2VxdWVuY2VgOgorCitgYGAKKyAgdXNpbmcgOjp0ZXN0aW5nOjpfOworICB1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7CisKKyAgeworICAgIEluU2VxdWVuY2UgczsKKworICAgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDUpKTsKKyAgICBFWFBFQ1RfQ0FMTChiYXIsIERvVGhhdChfKSkKKyAgICAgICAgLlRpbWVzKDIpOworICAgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKDYpKTsKKyAgfQorYGBgCisKK0luIHRoaXMgZXhhbXBsZSwgd2UgZXhwZWN0IGEgY2FsbCB0byBgZm9vLkRvVGhpcyg1KWAsIGZvbGxvd2VkIGJ5IHR3bworY2FsbHMgdG8gYGJhci5Eb1RoYXQoKWAgd2hlcmUgdGhlIGFyZ3VtZW50IGNhbiBiZSBhbnl0aGluZywgd2hpY2ggYXJlCitpbiB0dXJuIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byBgZm9vLkRvVGhpcyg2KWAuIElmIGEgY2FsbCBvY2N1cnJlZAorb3V0LW9mLW9yZGVyLCBHb29nbGUgTW9jayB3aWxsIHJlcG9ydCBhbiBlcnJvci4KKworIyMgRXhwZWN0aW5nIFBhcnRpYWxseSBPcmRlcmVkIENhbGxzICMjCisKK1NvbWV0aW1lcyByZXF1aXJpbmcgZXZlcnl0aGluZyB0byBvY2N1ciBpbiBhIHByZWRldGVybWluZWQgb3JkZXIgY2FuCitsZWFkIHRvIGJyaXR0bGUgdGVzdHMuIEZvciBleGFtcGxlLCB3ZSBtYXkgY2FyZSBhYm91dCBgQWAgb2NjdXJyaW5nCitiZWZvcmUgYm90aCBgQmAgYW5kIGBDYCwgYnV0IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGl2ZSBvcmRlcgorb2YgYEJgIGFuZCBgQ2AuIEluIHRoaXMgY2FzZSwgdGhlIHRlc3Qgc2hvdWxkIHJlZmxlY3Qgb3VyIHJlYWwgaW50ZW50LAoraW5zdGVhZCBvZiBiZWluZyBvdmVybHkgY29uc3RyYWluaW5nLgorCitHb29nbGUgTW9jayBhbGxvd3MgeW91IHRvIGltcG9zZSBhbiBhcmJpdHJhcnkgREFHIChkaXJlY3RlZCBhY3ljbGljCitncmFwaCkgb24gdGhlIGNhbGxzLiBPbmUgd2F5IHRvIGV4cHJlc3MgdGhlIERBRyBpcyB0byB1c2UgdGhlCitbQWZ0ZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfN19DaGVhdFNoZWV0I1RoZV9BZnRlcl9DbGF1c2UpIGNsYXVzZSBvZiBgRVhQRUNUX0NBTExgLgorCitBbm90aGVyIHdheSBpcyB2aWEgdGhlIGBJblNlcXVlbmNlKClgIGNsYXVzZSAobm90IHRoZSBzYW1lIGFzIHRoZQorYEluU2VxdWVuY2VgIGNsYXNzKSwgd2hpY2ggd2UgYm9ycm93ZWQgZnJvbSBqTW9jayAyLiBJdCdzIGxlc3MKK2ZsZXhpYmxlIHRoYW4gYEFmdGVyKClgLCBidXQgbW9yZSBjb252ZW5pZW50IHdoZW4geW91IGhhdmUgbG9uZyBjaGFpbnMKK29mIHNlcXVlbnRpYWwgY2FsbHMsIGFzIGl0IGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8gY29tZSB1cCB3aXRoCitkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSBleHBlY3RhdGlvbnMgaW4gdGhlIGNoYWlucy4gIEhlcmUncyBob3cgaXQKK3dvcmtzOgorCitJZiB3ZSB2aWV3IGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnRzIGFzIG5vZGVzIGluIGEgZ3JhcGgsIGFuZCBhZGQgYW4KK2VkZ2UgZnJvbSBub2RlIEEgdG8gbm9kZSBCIHdoZXJldmVyIEEgbXVzdCBvY2N1ciBiZWZvcmUgQiwgd2UgY2FuIGdldAorYSBEQUcuIFdlIHVzZSB0aGUgdGVybSAic2VxdWVuY2UiIHRvIG1lYW4gYSBkaXJlY3RlZCBwYXRoIGluIHRoaXMKK0RBRy4gTm93LCBpZiB3ZSBkZWNvbXBvc2UgdGhlIERBRyBpbnRvIHNlcXVlbmNlcywgd2UganVzdCBuZWVkIHRvIGtub3cKK3doaWNoIHNlcXVlbmNlcyBlYWNoIGBFWFBFQ1RfQ0FMTCgpYCBiZWxvbmdzIHRvIGluIG9yZGVyIHRvIGJlIGFibGUgdG8KK3JlY29uc3RydWN0IHRoZSBvcmdpbmFsIERBRy4KKworU28sIHRvIHNwZWNpZnkgdGhlIHBhcnRpYWwgb3JkZXIgb24gdGhlIGV4cGVjdGF0aW9ucyB3ZSBuZWVkIHRvIGRvIHR3bwordGhpbmdzOiBmaXJzdCB0byBkZWZpbmUgc29tZSBgU2VxdWVuY2VgIG9iamVjdHMsIGFuZCB0aGVuIGZvciBlYWNoCitgRVhQRUNUX0NBTEwoKWAgc2F5IHdoaWNoIGBTZXF1ZW5jZWAgb2JqZWN0cyBpdCBpcyBwYXJ0CitvZi4gRXhwZWN0YXRpb25zIGluIHRoZSBzYW1lIHNlcXVlbmNlIG11c3Qgb2NjdXIgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCit3cml0dGVuLiBGb3IgZXhhbXBsZSwKKworYGBgCisgIHVzaW5nIDo6dGVzdGluZzo6U2VxdWVuY2U7CisKKyAgU2VxdWVuY2UgczEsIHMyOworCisgIEVYUEVDVF9DQUxMKGZvbywgQSgpKQorICAgICAgLkluU2VxdWVuY2UoczEsIHMyKTsKKyAgRVhQRUNUX0NBTEwoYmFyLCBCKCkpCisgICAgICAuSW5TZXF1ZW5jZShzMSk7CisgIEVYUEVDVF9DQUxMKGJhciwgQygpKQorICAgICAgLkluU2VxdWVuY2UoczIpOworICBFWFBFQ1RfQ0FMTChmb28sIEQoKSkKKyAgICAgIC5JblNlcXVlbmNlKHMyKTsKK2BgYAorCitzcGVjaWZpZXMgdGhlIGZvbGxvd2luZyBEQUcgKHdoZXJlIGBzMWAgaXMgYEEgLT4gQmAsIGFuZCBgczJgIGlzIGBBIC0+CitDIC0+IERgKToKKworYGBgCisgICAgICAgKy0tLT4gQgorICAgICAgIHwKKyAgQSAtLS18CisgICAgICAgfAorICAgICAgICstLS0+IEMgLS0tPiBECitgYGAKKworVGhpcyBtZWFucyB0aGF0IEEgbXVzdCBvY2N1ciBiZWZvcmUgQiBhbmQgQywgYW5kIEMgbXVzdCBvY2N1ciBiZWZvcmUKK0QuIFRoZXJlJ3Mgbm8gcmVzdHJpY3Rpb24gYWJvdXQgdGhlIG9yZGVyIG90aGVyIHRoYW4gdGhlc2UuCisKKyMjIENvbnRyb2xsaW5nIFdoZW4gYW4gRXhwZWN0YXRpb24gUmV0aXJlcyAjIworCitXaGVuIGEgbW9jayBtZXRob2QgaXMgY2FsbGVkLCBHb29nbGUgTW9jayBvbmx5IGNvbnNpZGVyIGV4cGVjdGF0aW9ucwordGhhdCBhcmUgc3RpbGwgYWN0aXZlLiBBbiBleHBlY3RhdGlvbiBpcyBhY3RpdmUgd2hlbiBjcmVhdGVkLCBhbmQKK2JlY29tZXMgaW5hY3RpdmUgKGFrYSBfcmV0aXJlc18pIHdoZW4gYSBjYWxsIHRoYXQgaGFzIHRvIG9jY3VyIGxhdGVyCitoYXMgb2NjdXJyZWQuIEZvciBleGFtcGxlLCBpbgorCitgYGAKKyAgdXNpbmcgOjp0ZXN0aW5nOjpfOworICB1c2luZyA6OnRlc3Rpbmc6OlNlcXVlbmNlOworCisgIFNlcXVlbmNlIHMxLCBzMjsKKworICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCAiRmlsZSB0b28gbGFyZ2UuIikpICAgICAvLyAjMQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKQorICAgICAgLkluU2VxdWVuY2UoczEsIHMyKTsKKyAgRVhQRUNUX0NBTEwobG9nLCBMb2coV0FSTklORywgXywgIkRhdGEgc2V0IGlzIGVtcHR5LiIpKSAgLy8gIzIKKyAgICAgIC5JblNlcXVlbmNlKHMxKTsKKyAgRVhQRUNUX0NBTEwobG9nLCBMb2coV0FSTklORywgXywgIlVzZXIgbm90IGZvdW5kLiIpKSAgICAgLy8gIzMKKyAgICAgIC5JblNlcXVlbmNlKHMyKTsKK2BgYAorCithcyBzb29uIGFzIGVpdGhlciAjMiBvciAjMyBpcyBtYXRjaGVkLCAjMSB3aWxsIHJldGlyZS4gSWYgYSB3YXJuaW5nCitgIkZpbGUgdG9vIGxhcmdlLiJgIGlzIGxvZ2dlZCBhZnRlciB0aGlzLCBpdCB3aWxsIGJlIGFuIGVycm9yLgorCitOb3RlIHRoYXQgYW4gZXhwZWN0YXRpb24gZG9lc24ndCByZXRpcmUgYXV0b21hdGljYWxseSB3aGVuIGl0J3MKK3NhdHVyYXRlZC4gRm9yIGV4YW1wbGUsCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sIF8pKTsgICAgICAgICAgICAgICAgICAvLyAjMQorICBFWFBFQ1RfQ0FMTChsb2csIExvZyhXQVJOSU5HLCBfLCAiRmlsZSB0b28gbGFyZ2UuIikpOyAgLy8gIzIKK2BgYAorCitzYXlzIHRoYXQgdGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSB3YXJuaW5nIHdpdGggdGhlIG1lc3NhZ2UgYCJGaWxlCit0b28gbGFyZ2UuImAuIElmIHRoZSBzZWNvbmQgd2FybmluZyBjb250YWlucyB0aGlzIG1lc3NhZ2UgdG9vLCAjMiB3aWxsCittYXRjaCBhZ2FpbiBhbmQgcmVzdWx0IGluIGFuIHVwcGVyLWJvdW5kLXZpb2xhdGVkIGVycm9yLgorCitJZiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50LCB5b3UgY2FuIGFzayBhbiBleHBlY3RhdGlvbiB0byByZXRpcmUgYXMKK3Nvb24gYXMgaXQgYmVjb21lcyBzYXR1cmF0ZWQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sIF8pKTsgICAgICAgICAgICAgICAgIC8vICMxCisgIEVYUEVDVF9DQUxMKGxvZywgTG9nKFdBUk5JTkcsIF8sICJGaWxlIHRvbyBsYXJnZS4iKSkgIC8vICMyCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworYGBgCisKK0hlcmUgIzIgY2FuIGJlIHVzZWQgb25seSBvbmNlLCBzbyBpZiB5b3UgaGF2ZSB0d28gd2FybmluZ3Mgd2l0aCB0aGUKK21lc3NhZ2UgYCJGaWxlIHRvbyBsYXJnZS4iYCwgdGhlIGZpcnN0IHdpbGwgbWF0Y2ggIzIgYW5kIHRoZSBzZWNvbmQKK3dpbGwgbWF0Y2ggIzEgLSB0aGVyZSB3aWxsIGJlIG5vIGVycm9yLgorCisjIFVzaW5nIEFjdGlvbnMgIworCisjIyBSZXR1cm5pbmcgUmVmZXJlbmNlcyBmcm9tIE1vY2sgTWV0aG9kcyAjIworCitJZiBhIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSBpcyBhIHJlZmVyZW5jZSwgeW91IG5lZWQgdG8gdXNlCitgUmV0dXJuUmVmKClgIGluc3RlYWQgb2YgYFJldHVybigpYCB0byByZXR1cm4gYSByZXN1bHQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm5SZWY7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMChHZXRCYXIsIEJhciYoKSk7Cit9OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEJhciBiYXI7CisgIEVYUEVDVF9DQUxMKGZvbywgR2V0QmFyKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuUmVmKGJhcikpOworYGBgCisKKyMjIFJldHVybmluZyBMaXZlIFZhbHVlcyBmcm9tIE1vY2sgTWV0aG9kcyAjIworCitUaGUgYFJldHVybih4KWAgYWN0aW9uIHNhdmVzIGEgY29weSBvZiBgeGAgd2hlbiB0aGUgYWN0aW9uIGlzCitfY3JlYXRlZF8sIGFuZCBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSB3aGVuZXZlciBpdCdzCitleGVjdXRlZC4gU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0byBpbnN0ZWFkIHJldHVybiB0aGUgX2xpdmVfIHZhbHVlIG9mCitgeGAgKGkuZS4gaXRzIHZhbHVlIGF0IHRoZSB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyBfZXhlY3V0ZWRfLikuCisKK0lmIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UsIHlvdSBjYW4gZG8gaXQgdXNpbmcKK2BSZXR1cm5SZWYoeClgLCBhcyBzaG93biBpbiB0aGUgcHJldmlvdXMgcmVjaXBlICgiUmV0dXJuaW5nIFJlZmVyZW5jZXMKK2Zyb20gTW9jayBNZXRob2RzIikuIEhvd2V2ZXIsIEdvb2dsZSBNb2NrIGRvZXNuJ3QgbGV0IHlvdSB1c2UKK2BSZXR1cm5SZWYoKWAgaW4gYSBtb2NrIGZ1bmN0aW9uIHdob3NlIHJldHVybiB0eXBlIGlzIG5vdCBhIHJlZmVyZW5jZSwKK2FzIGRvaW5nIHRoYXQgdXN1YWxseSBpbmRpY2F0ZXMgYSB1c2VyIGVycm9yLiBTbywgd2hhdCBzaGFsbCB5b3UgZG8/CisKK1lvdSBtYXkgYmUgdGVtcHRlZCB0byB0cnkgYEJ5UmVmKClgOgorCitgYGAKK3VzaW5nIHRlc3Rpbmc6OkJ5UmVmOwordXNpbmcgdGVzdGluZzo6UmV0dXJuOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDAoR2V0VmFsdWUsIGludCgpKTsKK307CisuLi4KKyAgaW50IHggPSAwOworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBHZXRWYWx1ZSgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihCeVJlZih4KSkpOworICB4ID0gNDI7CisgIEVYUEVDVF9FUSg0MiwgZm9vLkdldFZhbHVlKCkpOworYGBgCisKK1VuZm9ydHVuYXRlbHksIGl0IGRvZXNuJ3Qgd29yayBoZXJlLiBUaGUgYWJvdmUgY29kZSB3aWxsIGZhaWwgd2l0aCBlcnJvcjoKKworYGBgCitWYWx1ZSBvZjogZm9vLkdldFZhbHVlKCkKKyAgQWN0dWFsOiAwCitFeHBlY3RlZDogNDIKK2BgYAorCitUaGUgcmVhc29uIGlzIHRoYXQgYFJldHVybih2YWx1ZSlgIGNvbnZlcnRzIGB2YWx1ZWAgdG8gdGhlIGFjdHVhbAorcmV0dXJuIHR5cGUgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXQgdGhlIHRpbWUgd2hlbiB0aGUgYWN0aW9uIGlzCitfY3JlYXRlZF8sIG5vdCB3aGVuIGl0IGlzIF9leGVjdXRlZF8uIChUaGlzIGJlaGF2aW9yIHdhcyBjaG9zZW4gZm9yCit0aGUgYWN0aW9uIHRvIGJlIHNhZmUgd2hlbiBgdmFsdWVgIGlzIGEgcHJveHkgb2JqZWN0IHRoYXQgcmVmZXJlbmNlcworc29tZSB0ZW1wb3Jhcnkgb2JqZWN0cy4pIEFzIGEgcmVzdWx0LCBgQnlSZWYoeClgIGlzIGNvbnZlcnRlZCB0byBhbgorYGludGAgdmFsdWUgKGluc3RlYWQgb2YgYSBgY29uc3QgaW50JmApIHdoZW4gdGhlIGV4cGVjdGF0aW9uIGlzIHNldCwKK2FuZCBgUmV0dXJuKEJ5UmVmKHgpKWAgd2lsbCBhbHdheXMgcmV0dXJuIDAuCisKK2BSZXR1cm5Qb2ludGVlKHBvaW50ZXIpYCB3YXMgcHJvdmlkZWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtCitzcGVjaWZpY2FsbHkuIEl0IHJldHVybnMgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgYHBvaW50ZXJgIGF0IHRoZSB0aW1lCit0aGUgYWN0aW9uIGlzIF9leGVjdXRlZF86CisKK2BgYAordXNpbmcgdGVzdGluZzo6UmV0dXJuUG9pbnRlZTsKKy4uLgorICBpbnQgeCA9IDA7CisgIE1vY2tGb28gZm9vOworICBFWFBFQ1RfQ0FMTChmb28sIEdldFZhbHVlKCkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuUG9pbnRlZSgmeCkpOyAgLy8gTm90ZSB0aGUgJiBoZXJlLgorICB4ID0gNDI7CisgIEVYUEVDVF9FUSg0MiwgZm9vLkdldFZhbHVlKCkpOyAgLy8gVGhpcyB3aWxsIHN1Y2NlZWQgbm93LgorYGBgCisKKyMjIENvbWJpbmluZyBBY3Rpb25zICMjCisKK1dhbnQgdG8gZG8gbW9yZSB0aGFuIG9uZSB0aGluZyB3aGVuIGEgZnVuY3Rpb24gaXMgY2FsbGVkPyBUaGF0J3MKK2ZpbmUuIGBEb0FsbCgpYCBhbGxvdyB5b3UgdG8gZG8gc2VxdWVuY2Ugb2YgYWN0aW9ucyBldmVyeSB0aW1lLiBPbmx5Cit0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYXN0IGFjdGlvbiBpbiB0aGUgc2VxdWVuY2Ugd2lsbCBiZSB1c2VkLgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6RG9BbGw7CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShCYXIsIGJvb2woaW50IG4pKTsKK307CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfKSkKKyAgICAgIC5XaWxsT25jZShEb0FsbChhY3Rpb25fMSwKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fMiwKKyAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fbikpOworYGBgCisKKyMjIE1vY2tpbmcgU2lkZSBFZmZlY3RzICMjCisKK1NvbWV0aW1lcyBhIG1ldGhvZCBleGhpYml0cyBpdHMgZWZmZWN0IG5vdCB2aWEgcmV0dXJuaW5nIGEgdmFsdWUgYnV0Cit2aWEgc2lkZSBlZmZlY3RzLiBGb3IgZXhhbXBsZSwgaXQgbWF5IGNoYW5nZSBzb21lIGdsb2JhbCBzdGF0ZSBvcgorbW9kaWZ5IGFuIG91dHB1dCBhcmd1bWVudC4gVG8gbW9jayBzaWRlIGVmZmVjdHMsIGluIGdlbmVyYWwgeW91IGNhbgorZGVmaW5lIHlvdXIgb3duIGFjdGlvbiBieSBpbXBsZW1lbnRpbmcgYDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlYC4KKworSWYgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvIGNoYW5nZSBhbiBvdXRwdXQgYXJndW1lbnQsIHRoZSBidWlsdC1pbgorYFNldEFyZ1BvaW50ZWUoKWAgYWN0aW9uIGlzIGNvbnZlbmllbnQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpTZXRBcmdQb2ludGVlOworCitjbGFzcyBNb2NrTXV0YXRvciA6IHB1YmxpYyBNdXRhdG9yIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMihNdXRhdGUsIHZvaWQoYm9vbCBtdXRhdGUsIGludCogdmFsdWUpKTsKKyAgLi4uCit9OworLi4uCisKKyAgTW9ja011dGF0b3IgbXV0YXRvcjsKKyAgRVhQRUNUX0NBTEwobXV0YXRvciwgTXV0YXRlKHRydWUsIF8pKQorICAgICAgLldpbGxPbmNlKFNldEFyZ1BvaW50ZWU8MT4oNSkpOworYGBgCisKK0luIHRoaXMgZXhhbXBsZSwgd2hlbiBgbXV0YXRvci5NdXRhdGUoKWAgaXMgY2FsbGVkLCB3ZSB3aWxsIGFzc2lnbiA1Cit0byB0aGUgYGludGAgdmFyaWFibGUgcG9pbnRlZCB0byBieSBhcmd1bWVudCAjMQorKDAtYmFzZWQpLgorCitgU2V0QXJnUG9pbnRlZSgpYCBjb252ZW5pZW50bHkgbWFrZXMgYW4gaW50ZXJuYWwgY29weSBvZiB0aGUKK3ZhbHVlIHlvdSBwYXNzIHRvIGl0LCByZW1vdmluZyB0aGUgbmVlZCB0byBrZWVwIHRoZSB2YWx1ZSBpbiBzY29wZSBhbmQKK2FsaXZlLiBUaGUgaW1wbGljYXRpb24gaG93ZXZlciBpcyB0aGF0IHRoZSB2YWx1ZSBtdXN0IGhhdmUgYSBjb3B5Citjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4KKworSWYgdGhlIG1vY2sgbWV0aG9kIGFsc28gbmVlZHMgdG8gcmV0dXJuIGEgdmFsdWUgYXMgd2VsbCwgeW91IGNhbiBjaGFpbgorYFNldEFyZ1BvaW50ZWUoKWAgd2l0aCBgUmV0dXJuKClgIHVzaW5nIGBEb0FsbCgpYDoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKK3VzaW5nIDo6dGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKKworY2xhc3MgTW9ja011dGF0b3IgOiBwdWJsaWMgTXV0YXRvciB7CisgcHVibGljOgorICAuLi4KKyAgTU9DS19NRVRIT0QxKE11dGF0ZUludCwgYm9vbChpbnQqIHZhbHVlKSk7Cit9OworLi4uCisKKyAgTW9ja011dGF0b3IgbXV0YXRvcjsKKyAgRVhQRUNUX0NBTEwobXV0YXRvciwgTXV0YXRlSW50KF8pKQorICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oNSksCisgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKHRydWUpKSk7CitgYGAKKworSWYgdGhlIG91dHB1dCBhcmd1bWVudCBpcyBhbiBhcnJheSwgdXNlIHRoZQorYFNldEFycmF5QXJndW1lbnQ8Tj4oZmlyc3QsIGxhc3QpYCBhY3Rpb24gaW5zdGVhZC4gSXQgY29waWVzIHRoZQorZWxlbWVudHMgaW4gc291cmNlIHJhbmdlIGBbZmlyc3QsIGxhc3QpYCB0byB0aGUgYXJyYXkgcG9pbnRlZCB0byBieQordGhlIGBOYC10aCAoMC1iYXNlZCkgYXJndW1lbnQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpOb3ROdWxsOwordXNpbmcgOjp0ZXN0aW5nOjpTZXRBcnJheUFyZ3VtZW50OworCitjbGFzcyBNb2NrQXJyYXlNdXRhdG9yIDogcHVibGljIEFycmF5TXV0YXRvciB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDIoTXV0YXRlLCB2b2lkKGludCogdmFsdWVzLCBpbnQgbnVtX3ZhbHVlcykpOworICAuLi4KK307CisuLi4KKworICBNb2NrQXJyYXlNdXRhdG9yIG11dGF0b3I7CisgIGludCB2YWx1ZXNbNV0gPSB7IDEsIDIsIDMsIDQsIDUgfTsKKyAgRVhQRUNUX0NBTEwobXV0YXRvciwgTXV0YXRlKE5vdE51bGwoKSwgNSkpCisgICAgICAuV2lsbE9uY2UoU2V0QXJyYXlBcmd1bWVudDwwPih2YWx1ZXMsIHZhbHVlcyArIDUpKTsKK2BgYAorCitUaGlzIGFsc28gd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQgaXMgYW4gb3V0cHV0IGl0ZXJhdG9yOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6U2VBcnJheUFyZ3VtZW50OworCitjbGFzcyBNb2NrUm9sb2RleCA6IHB1YmxpYyBSb2xvZGV4IHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShHZXROYW1lcywgdm9pZChzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHZlY3RvcjxzdHJpbmc+ID4pKTsKKyAgLi4uCit9OworLi4uCisKKyAgTW9ja1JvbG9kZXggcm9sb2RleDsKKyAgdmVjdG9yPHN0cmluZz4gbmFtZXM7CisgIG5hbWVzLnB1c2hfYmFjaygiR2VvcmdlIik7CisgIG5hbWVzLnB1c2hfYmFjaygiSm9obiIpOworICBuYW1lcy5wdXNoX2JhY2soIlRob21hcyIpOworICBFWFBFQ1RfQ0FMTChyb2xvZGV4LCBHZXROYW1lcyhfKSkKKyAgICAgIC5XaWxsT25jZShTZXRBcnJheUFyZ3VtZW50PDA+KG5hbWVzLmJlZ2luKCksIG5hbWVzLmVuZCgpKSk7CitgYGAKKworIyMgQ2hhbmdpbmcgYSBNb2NrIE9iamVjdCdzIEJlaGF2aW9yIEJhc2VkIG9uIHRoZSBTdGF0ZSAjIworCitJZiB5b3UgZXhwZWN0IGEgY2FsbCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGEgbW9jayBvYmplY3QsIHlvdSBjYW4gdXNlIGA6OnRlc3Rpbmc6OkluU2VxdWVuY2VgIHRvIHNwZWNpZnkgZGlmZmVyZW50IGJlaGF2aW9ycyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjYWxsOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6SW5TZXF1ZW5jZTsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworCisuLi4KKyAgeworICAgIEluU2VxdWVuY2Ugc2VxOworICAgIEVYUEVDVF9DQUxMKG15X21vY2ssIElzRGlydHkoKSkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0cnVlKSk7CisgICAgRVhQRUNUX0NBTEwobXlfbW9jaywgRmx1c2goKSk7CisgICAgRVhQRUNUX0NBTEwobXlfbW9jaywgSXNEaXJ0eSgpKQorICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGZhbHNlKSk7CisgIH0KKyAgbXlfbW9jay5GbHVzaElmRGlydHkoKTsKK2BgYAorCitUaGlzIG1ha2VzIGBteV9tb2NrLklzRGlydHkoKWAgcmV0dXJuIGB0cnVlYCBiZWZvcmUgYG15X21vY2suRmx1c2goKWAgaXMgY2FsbGVkIGFuZCByZXR1cm4gYGZhbHNlYCBhZnRlcndhcmRzLgorCitJZiB0aGUgYmVoYXZpb3IgY2hhbmdlIGlzIG1vcmUgY29tcGxleCwgeW91IGNhbiBzdG9yZSB0aGUgZWZmZWN0cyBpbiBhIHZhcmlhYmxlIGFuZCBtYWtlIGEgbW9jayBtZXRob2QgZ2V0IGl0cyByZXR1cm4gdmFsdWUgZnJvbSB0aGF0IHZhcmlhYmxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6U2F2ZUFyZzsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworCitBQ1RJT05fUChSZXR1cm5Qb2ludGVlLCBwKSB7IHJldHVybiAqcDsgfQorLi4uCisgIGludCBwcmV2aW91c192YWx1ZSA9IDA7CisgIEVYUEVDVF9DQUxMKG15X21vY2ssIEdldFByZXZWYWx1ZSgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVyblBvaW50ZWUoJnByZXZpb3VzX3ZhbHVlKSk7CisgIEVYUEVDVF9DQUxMKG15X21vY2ssIFVwZGF0ZVZhbHVlKF8pKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFNhdmVBcmc8MD4oJnByZXZpb3VzX3ZhbHVlKSk7CisgIG15X21vY2suRG9Tb21ldGhpbmdUb1VwZGF0ZVZhbHVlKCk7CitgYGAKKworSGVyZSBgbXlfbW9jay5HZXRQcmV2VmFsdWUoKWAgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBhcmd1bWVudCBvZiB0aGUgbGFzdCBgVXBkYXRlVmFsdWUoKWAgY2FsbC4KKworIyMgU2V0dGluZyB0aGUgRGVmYXVsdCBWYWx1ZSBmb3IgYSBSZXR1cm4gVHlwZSAjIworCitJZiBhIG1vY2sgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgaXMgYSBidWlsdC1pbiBDKysgdHlwZSBvciBwb2ludGVyLCBieQorZGVmYXVsdCBpdCB3aWxsIHJldHVybiAwIHdoZW4gaW52b2tlZC4gWW91IG9ubHkgbmVlZCB0byBzcGVjaWZ5IGFuCithY3Rpb24gaWYgdGhpcyBkZWZhdWx0IHZhbHVlIGRvZXNuJ3Qgd29yayBmb3IgeW91LgorCitTb21ldGltZXMsIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0IHZhbHVlLCBvciB5b3UgbWF5IHdhbnQKK3RvIHNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlcyBHb29nbGUgTW9jayBkb2Vzbid0IGtub3cKK2Fib3V0LiBZb3UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIGA6OnRlc3Rpbmc6OkRlZmF1bHRWYWx1ZWAgY2xhc3MKK3RlbXBsYXRlOgorCitgYGAKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMChDYWxjdWxhdGVCYXIsIEJhcigpKTsKK307CisuLi4KKworICBCYXIgZGVmYXVsdF9iYXI7CisgIC8vIFNldHMgdGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGZvciB0eXBlIEJhci4KKyAgRGVmYXVsdFZhbHVlPEJhcj46OlNldChkZWZhdWx0X2Jhcik7CisKKyAgTW9ja0ZvbyBmb287CisKKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGFuIGFjdGlvbiBoZXJlLCBhcyB0aGUgZGVmYXVsdAorICAvLyByZXR1cm4gdmFsdWUgd29ya3MgZm9yIHVzLgorICBFWFBFQ1RfQ0FMTChmb28sIENhbGN1bGF0ZUJhcigpKTsKKworICBmb28uQ2FsY3VsYXRlQmFyKCk7ICAvLyBUaGlzIHNob3VsZCByZXR1cm4gZGVmYXVsdF9iYXIuCisKKyAgLy8gVW5zZXRzIHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZS4KKyAgRGVmYXVsdFZhbHVlPEJhcj46OkNsZWFyKCk7CitgYGAKKworUGxlYXNlIG5vdGUgdGhhdCBjaGFuZ2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSB0eXBlIGNhbiBtYWtlIHlvdQordGVzdHMgaGFyZCB0byB1bmRlcnN0YW5kLiBXZSByZWNvbW1lbmQgeW91IHRvIHVzZSB0aGlzIGZlYXR1cmUKK2p1ZGljaW91c2x5LiBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgYFNldCgpYCBhbmQKK2BDbGVhcigpYCBjYWxscyBhcmUgcmlnaHQgbmV4dCB0byB0aGUgY29kZSB0aGF0IHVzZXMgeW91ciBtb2NrLgorCisjIyBTZXR0aW5nIHRoZSBEZWZhdWx0IEFjdGlvbnMgZm9yIGEgTW9jayBNZXRob2QgIyMKKworWW91J3ZlIGxlYXJuZWQgaG93IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGdpdmVuCit0eXBlLiBIb3dldmVyLCB0aGlzIG1heSBiZSB0b28gY29hcnNlIGZvciB5b3VyIHB1cnBvc2U6IHBlcmhhcHMgeW91CitoYXZlIHR3byBtb2NrIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSByZXR1cm4gdHlwZSBhbmQgeW91IHdhbnQgdGhlbSB0bworaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3JzLiBUaGUgYE9OX0NBTEwoKWAgbWFjcm8gYWxsb3dzIHlvdSB0bworY3VzdG9taXplIHlvdXIgbW9jaydzIGJlaGF2aW9yIGF0IHRoZSBtZXRob2QgbGV2ZWw6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Cit1c2luZyA6OnRlc3Rpbmc6Okd0OwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KKyAgT05fQ0FMTChmb28sIFNpZ24oXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oLTEpKTsKKyAgT05fQ0FMTChmb28sIFNpZ24oMCkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMCkpOworICBPTl9DQUxMKGZvbywgU2lnbihHdCgwKSkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworCisgIEVYUEVDVF9DQUxMKGZvbywgU2lnbihfKSkKKyAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CisKKyAgZm9vLlNpZ24oNSk7ICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIDEuCisgIGZvby5TaWduKC05KTsgIC8vIFRoaXMgc2hvdWxkIHJldHVybiAtMS4KKyAgZm9vLlNpZ24oMCk7ICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIDAuCitgYGAKKworQXMgeW91IG1heSBoYXZlIGd1ZXNzZWQsIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgYE9OX0NBTEwoKWAKK3N0YXRlbWVudHMsIHRoZSBuZXdzIG9yZGVyIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBvbGRlciBvbmVzLiBJbgorb3RoZXIgd29yZHMsIHRoZSAqKmxhc3QqKiBvbmUgdGhhdCBtYXRjaGVzIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgd2lsbAorYmUgdXNlZC4gVGhpcyBtYXRjaGluZyBvcmRlciBhbGxvd3MgeW91IHRvIHNldCB1cCB0aGUgY29tbW9uIGJlaGF2aW9yCitpbiBhIG1vY2sgb2JqZWN0J3MgY29uc3RydWN0b3Igb3IgdGhlIHRlc3QgZml4dHVyZSdzIHNldC11cCBwaGFzZSBhbmQKK3NwZWNpYWxpemUgdGhlIG1vY2sncyBiZWhhdmlvciBsYXRlci4KKworIyMgVXNpbmcgRnVuY3Rpb25zL01ldGhvZHMvRnVuY3RvcnMgYXMgQWN0aW9ucyAjIworCitJZiB0aGUgYnVpbHQtaW4gYWN0aW9ucyBkb24ndCBzdWl0IHlvdSwgeW91IGNhbiBlYXNpbHkgdXNlIGFuIGV4aXN0aW5nCitmdW5jdGlvbiwgbWV0aG9kLCBvciBmdW5jdG9yIGFzIGFuIGFjdGlvbjoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKFN1bSwgaW50KGludCB4LCBpbnQgeSkpOworICBNT0NLX01FVEhPRDEoQ29tcGxleEpvYiwgYm9vbChpbnQgeCkpOworfTsKKworaW50IENhbGN1bGF0ZVN1bShpbnQgeCwgaW50IHkpIHsgcmV0dXJuIHggKyB5OyB9CisKK2NsYXNzIEhlbHBlciB7CisgcHVibGljOgorICBib29sIENvbXBsZXhKb2IoaW50IHgpOworfTsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBIZWxwZXIgaGVscGVyOworICBFWFBFQ1RfQ0FMTChmb28sIFN1bShfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoQ2FsY3VsYXRlU3VtKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgQ29tcGxleEpvYihfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoJmhlbHBlciwgJkhlbHBlcjo6Q29tcGxleEpvYikpOworCisgIGZvby5TdW0oNSwgNik7ICAgICAgIC8vIEludm9rZXMgQ2FsY3VsYXRlU3VtKDUsIDYpLgorICBmb28uQ29tcGxleEpvYigxMCk7ICAvLyBJbnZva2VzIGhlbHBlci5Db21wbGV4Sm9iKDEwKTsKK2BgYAorCitUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiwgZXRjIG11c3QgYmUKK19jb21wYXRpYmxlXyB3aXRoIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1vY2sgZnVuY3Rpb24sIG1lYW5pbmcgdGhhdCB0aGUKK2xhdHRlcidzIGFyZ3VtZW50cyBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKK2FyZ3VtZW50cyBvZiB0aGUgZm9ybWVyLCBhbmQgdGhlIGZvcm1lcidzIHJldHVybiB0eXBlIGNhbiBiZQoraW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhhdCBvZiB0aGUgbGF0dGVyLiBTbywgeW91IGNhbiBpbnZva2UKK3NvbWV0aGluZyB3aG9zZSB0eXBlIGlzIF9ub3RfIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIG1vY2sgZnVuY3Rpb24sCithcyBsb25nIGFzIGl0J3Mgc2FmZSB0byBkbyBzbyAtIG5pY2UsIGh1aD8KKworIyMgSW52b2tpbmcgYSBGdW5jdGlvbi9NZXRob2QvRnVuY3RvciBXaXRob3V0IEFyZ3VtZW50cyAjIworCitgSW52b2tlKClgIGlzIHZlcnkgdXNlZnVsIGZvciBkb2luZyBhY3Rpb25zIHRoYXQgYXJlIG1vcmUgY29tcGxleC4gSXQKK3Bhc3NlcyB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24gb3IgZnVuY3RvciBiZWluZworaW52b2tlZCBzdWNoIHRoYXQgdGhlIGNhbGxlZSBoYXMgdGhlIGZ1bGwgY29udGV4dCBvZiB0aGUgY2FsbCB0byB3b3JrCit3aXRoLiBJZiB0aGUgaW52b2tlZCBmdW5jdGlvbiBpcyBub3QgaW50ZXJlc3RlZCBpbiBzb21lIG9yIGFsbCBvZiB0aGUKK2FyZ3VtZW50cywgaXQgY2FuIHNpbXBseSBpZ25vcmUgdGhlbS4KKworWWV0LCBhIGNvbW1vbiBwYXR0ZXJuIGlzIHRoYXQgYSB0ZXN0IGF1dGhvciB3YW50cyB0byBpbnZva2UgYSBmdW5jdGlvbgord2l0aG91dCB0aGUgYXJndW1lbnRzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uLiBgSW52b2tlKClgIGFsbG93cyBoZXIgdG8KK2RvIHRoYXQgdXNpbmcgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgdGhyb3dzIGF3YXkgdGhlIGFyZ3VtZW50cyBiZWZvcmUKK2ludm9raW5nIGFuIHVuZGVybGluaW5nIG51bGxhcnkgZnVuY3Rpb24uIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBjYW4gYmUKK3RlZGlvdXMgYW5kIG9ic2N1cmVzIHRoZSBpbnRlbnQgb2YgdGhlIHRlc3QuCisKK2BJbnZva2VXaXRob3V0QXJncygpYCBzb2x2ZXMgdGhpcyBwcm9ibGVtLiBJdCdzIGxpa2UgYEludm9rZSgpYCBleGNlcHQKK3RoYXQgaXQgZG9lc24ndCBwYXNzIHRoZSBtb2NrIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIHRvIHRoZQorY2FsbGVlLiBIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZVdpdGhvdXRBcmdzOworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDEoQ29tcGxleEpvYiwgYm9vbChpbnQgbikpOworfTsKKworYm9vbCBKb2IxKCkgeyAuLi4gfQorLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgQ29tcGxleEpvYihfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2VXaXRob3V0QXJncyhKb2IxKSk7CisKKyAgZm9vLkNvbXBsZXhKb2IoMTApOyAgLy8gSW52b2tlcyBKb2IxKCkuCitgYGAKKworIyMgSW52b2tpbmcgYW4gQXJndW1lbnQgb2YgdGhlIE1vY2sgRnVuY3Rpb24gIyMKKworU29tZXRpbWVzIGEgbW9jayBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgYSBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3RvcgorKGluIG90aGVyIHdvcmRzLCBhICJjYWxsYWJsZSIpIGFzIGFuIGFyZ3VtZW50LCBlLmcuCisKK2BgYAorY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKERvVGhpcywgYm9vbChpbnQgbiwgYm9vbCAoKmZwKShpbnQpKSk7Cit9OworYGBgCisKK2FuZCB5b3UgbWF5IHdhbnQgdG8gaW52b2tlIHRoaXMgY2FsbGFibGUgYXJndW1lbnQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisgIE1vY2tGb28gZm9vOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcyhfLCBfKSkKKyAgICAgIC5XaWxsT25jZSguLi4pOworICAvLyBXaWxsIGV4ZWN1dGUgKCpmcCkoNSksIHdoZXJlIGZwIGlzIHRoZQorICAvLyBzZWNvbmQgYXJndW1lbnQgRG9UaGlzKCkgcmVjZWl2ZXMuCitgYGAKKworQXJnaGgsIHlvdSBuZWVkIHRvIHJlZmVyIHRvIGEgbW9jayBmdW5jdGlvbiBhcmd1bWVudCBidXQgQysrIGhhcyBubworbGFtYmRhICh5ZXQpLCBzbyB5b3UgaGF2ZSB0byBkZWZpbmUgeW91ciBvd24gYWN0aW9uLiA6LSggT3IgZG8geW91CityZWFsbHk/CisKK1dlbGwsIEdvb2dsZSBNb2NrIGhhcyBhbiBhY3Rpb24gdG8gc29sdmUgX2V4YWN0bHlfIHRoaXMgcHJvYmxlbToKKworYGBgCisgIEludm9rZUFyZ3VtZW50PE4+KGFyZ18xLCBhcmdfMiwgLi4uLCBhcmdfbSkKK2BgYAorCit3aWxsIGludm9rZSB0aGUgYE5gLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0aGUgbW9jayBmdW5jdGlvbiByZWNlaXZlcywKK3dpdGggYGFyZ18xYCwgYGFyZ18yYCwgLi4uLCBhbmQgYGFyZ19tYC4gTm8gbWF0dGVyIGlmIHRoZSBhcmd1bWVudCBpcworYSBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3RvciwgR29vZ2xlIE1vY2sgaGFuZGxlcyB0aGVtIGJvdGguCisKK1dpdGggdGhhdCwgeW91IGNvdWxkIHdyaXRlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlQXJndW1lbnQ7CisuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoXywgXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MT4oNSkpOworICAvLyBXaWxsIGV4ZWN1dGUgKCpmcCkoNSksIHdoZXJlIGZwIGlzIHRoZQorICAvLyBzZWNvbmQgYXJndW1lbnQgRG9UaGlzKCkgcmVjZWl2ZXMuCitgYGAKKworV2hhdCBpZiB0aGUgY2FsbGFibGUgdGFrZXMgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlPyBObyBwcm9ibGVtIC0ganVzdAord3JhcCBpdCBpbnNpZGUgYEJ5UmVmKClgOgorCitgYGAKKy4uLgorICBNT0NLX01FVEhPRDEoQmFyLCBib29sKGJvb2wgKCpmcCkoaW50LCBjb25zdCBIZWxwZXImKSkpOworLi4uCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkJ5UmVmOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VBcmd1bWVudDsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICBIZWxwZXIgaGVscGVyOworICAuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MD4oNSwgQnlSZWYoaGVscGVyKSkpOworICAvLyBCeVJlZihoZWxwZXIpIGd1YXJhbnRlZXMgdGhhdCBhIHJlZmVyZW5jZSB0byBoZWxwZXIsIG5vdCBhIGNvcHkgb2YgaXQsCisgIC8vIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYWJsZS4KK2BgYAorCitXaGF0IGlmIHRoZSBjYWxsYWJsZSB0YWtlcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UgYW5kIHdlIGRvICoqbm90KioKK3dyYXAgdGhlIGFyZ3VtZW50IGluIGBCeVJlZigpYD8gVGhlbiBgSW52b2tlQXJndW1lbnQoKWAgd2lsbCBfbWFrZSBhCitjb3B5XyBvZiB0aGUgYXJndW1lbnQsIGFuZCBwYXNzIGEgX3JlZmVyZW5jZSB0byB0aGUgY29weV8sIGluc3RlYWQgb2YKK2EgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSwgdG8gdGhlIGNhbGxhYmxlLiBUaGlzIGlzIGVzcGVjaWFsbHkKK2hhbmR5IHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgdGVtcG9yYXJ5IHZhbHVlOgorCitgYGAKKy4uLgorICBNT0NLX01FVEhPRDEoRG9UaGF0LCBib29sKGJvb2wgKCpmKShjb25zdCBkb3VibGUmIHgsIGNvbnN0IHN0cmluZyYgcykpKTsKKy4uLgordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2VBcmd1bWVudDsKKy4uLgorCisgIE1vY2tGb28gZm9vOworICAuLi4KKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoYXQoXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlQXJndW1lbnQ8MD4oNS4wLCBzdHJpbmcoIkhpIikpKTsKKyAgLy8gV2lsbCBleGVjdXRlICgqZikoNS4wLCBzdHJpbmcoIkhpIikpLCB3aGVyZSBmIGlzIHRoZSBmdW5jdGlvbiBwb2ludGVyCisgIC8vIERvVGhhdCgpIHJlY2VpdmVzLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZXMgNS4wIGFuZCBzdHJpbmcoIkhpIikgYXJlCisgIC8vIHRlbXBvcmFyeSBhbmQgZGVhZCBvbmNlIHRoZSBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCBmaW5pc2hlcy4gIFlldAorICAvLyBpdCdzIGZpbmUgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbiBsYXRlciwgc2luY2UgYSBjb3B5IG9mIHRoZSB2YWx1ZXMKKyAgLy8gYXJlIGtlcHQgaW5zaWRlIHRoZSBJbnZva2VBcmd1bWVudCBhY3Rpb24uCitgYGAKKworIyMgSWdub3JpbmcgYW4gQWN0aW9uJ3MgUmVzdWx0ICMjCisKK1NvbWV0aW1lcyB5b3UgaGF2ZSBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIF9zb21ldGhpbmdfLCBidXQgeW91IG5lZWQgYW4KK2FjdGlvbiB0aGF0IHJldHVybnMgYHZvaWRgIChwZXJoYXBzIHlvdSB3YW50IHRvIHVzZSBpdCBpbiBhIG1vY2sKK2Z1bmN0aW9uIHRoYXQgcmV0dXJucyBgdm9pZGAsIG9yIHBlcmhhcHMgaXQgbmVlZHMgdG8gYmUgdXNlZCBpbgorYERvQWxsKClgIGFuZCBpdCdzIG5vdCB0aGUgbGFzdCBpbiB0aGUgbGlzdCkuIGBJZ25vcmVSZXN1bHQoKWAgbGV0cworeW91IGRvIHRoYXQuIEZvciBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisKK2ludCBQcm9jZXNzKGNvbnN0IE15RGF0YSYgZGF0YSk7CitzdHJpbmcgRG9Tb21ldGhpbmcoKTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QxKEFiYywgdm9pZChjb25zdCBNeURhdGEmIGRhdGEpKTsKKyAgTU9DS19NRVRIT0QwKFh5eiwgYm9vbCgpKTsKK307CisuLi4KKworICBNb2NrRm9vIGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBBYmMoXykpCisgIC8vIC5XaWxsT25jZShJbnZva2UoUHJvY2VzcykpOworICAvLyBUaGUgYWJvdmUgbGluZSB3b24ndCBjb21waWxlIGFzIFByb2Nlc3MoKSByZXR1cm5zIGludCBidXQgQWJjKCkgbmVlZHMKKyAgLy8gdG8gcmV0dXJuIHZvaWQuCisgICAgICAuV2lsbE9uY2UoSWdub3JlUmVzdWx0KEludm9rZShQcm9jZXNzKSkpOworCisgIEVYUEVDVF9DQUxMKGZvbywgWHl6KCkpCisgICAgICAuV2lsbE9uY2UoRG9BbGwoSWdub3JlUmVzdWx0KEludm9rZShEb1NvbWV0aGluZykpLAorICAgICAgLy8gSWdub3JlcyB0aGUgc3RyaW5nIERvU29tZXRoaW5nKCkgcmV0dXJucy4KKyAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4odHJ1ZSkpKTsKK2BgYAorCitOb3RlIHRoYXQgeW91ICoqY2Fubm90KiogdXNlIGBJZ25vcmVSZXN1bHQoKWAgb24gYW4gYWN0aW9uIHRoYXQgYWxyZWFkeQorcmV0dXJucyBgdm9pZGAuIERvaW5nIHNvIHdpbGwgbGVhZCB0byB1Z2x5IGNvbXBpbGVyIGVycm9ycy4KKworIyMgU2VsZWN0aW5nIGFuIEFjdGlvbidzIEFyZ3VtZW50cyAjIworCitTYXkgeW91IGhhdmUgYSBtb2NrIGZ1bmN0aW9uIGBGb28oKWAgdGhhdCB0YWtlcyBzZXZlbiBhcmd1bWVudHMsIGFuZAoreW91IGhhdmUgYSBjdXN0b20gYWN0aW9uIHRoYXQgeW91IHdhbnQgdG8gaW52b2tlIHdoZW4gYEZvbygpYCBpcworY2FsbGVkLiBUcm91YmxlIGlzLCB0aGUgY3VzdG9tIGFjdGlvbiBvbmx5IHdhbnRzIHRocmVlIGFyZ3VtZW50czoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKy4uLgorICBNT0NLX01FVEhPRDcoRm9vLCBib29sKGJvb2wgdmlzaWJsZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHBhaXI8aW50LCBpbnQ+LCBkb3VibGU+JiB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl93ZWlnaHQsIGRvdWJsZSBtYXhfd2lnaHQpKTsKKy4uLgorCitib29sIElzVmlzaWJsZUluUXVhZHJhbnQxKGJvb2wgdmlzaWJsZSwgaW50IHgsIGludCB5KSB7CisgIHJldHVybiB2aXNpYmxlICYmIHggPj0gMCAmJiB5ID49IDA7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oXywgXywgXywgXywgXywgXywgXykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlKElzVmlzaWJsZUluUXVhZHJhbnQxKSk7ICAvLyBVaCwgd29uJ3QgY29tcGlsZS4gOi0oCitgYGAKKworVG8gcGxlYXNlIHRoZSBjb21waWxlciBHb2QsIHlvdSBjYW4gdG8gZGVmaW5lIGFuICJhZGFwdG9yIiB0aGF0IGhhcwordGhlIHNhbWUgc2lnbmF0dXJlIGFzIGBGb28oKWAgYW5kIGNhbGxzIHRoZSBjdXN0b20gYWN0aW9uIHdpdGggdGhlCityaWdodCBhcmd1bWVudHM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7CisKK2Jvb2wgTXlJc1Zpc2libGVJblF1YWRyYW50MShib29sIHZpc2libGUsIGNvbnN0IHN0cmluZyYgbmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxwYWlyPGludCwgaW50PiwgZG91YmxlPiYgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW5fd2VpZ2h0LCBkb3VibGUgbWF4X3dpZ2h0KSB7CisgIHJldHVybiBJc1Zpc2libGVJblF1YWRyYW50MSh2aXNpYmxlLCB4LCB5KTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoTXlJc1Zpc2libGVJblF1YWRyYW50MSkpOyAgLy8gTm93IGl0IHdvcmtzLgorYGBgCisKK0J1dCBpc24ndCB0aGlzIGF3a3dhcmQ/CisKK0dvb2dsZSBNb2NrIHByb3ZpZGVzIGEgZ2VuZXJpYyBfYWN0aW9uIGFkYXB0b3JfLCBzbyB5b3UgY2FuIHNwZW5kIHlvdXIKK3RpbWUgbWluZGluZyBtb3JlIGltcG9ydGFudCBidXNpbmVzcyB0aGFuIHdyaXRpbmcgeW91ciBvd24KK2FkYXB0b3JzLiBIZXJlJ3MgdGhlIHN5bnRheDoKKworYGBgCisgIFdpdGhBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYWN0aW9uKQorYGBgCisKK2NyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGFzc2VzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXQKK3RoZSBnaXZlbiBpbmRpY2VzICgwLWJhc2VkKSB0byB0aGUgaW5uZXIgYGFjdGlvbmAgYW5kIHBlcmZvcm1zCitpdC4gVXNpbmcgYFdpdGhBcmdzYCwgb3VyIG9yaWdpbmFsIGV4YW1wbGUgY2FuIGJlIHdyaXR0ZW4gYXM6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpJbnZva2U7Cit1c2luZyA6OnRlc3Rpbmc6OldpdGhBcmdzOworLi4uCisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShXaXRoQXJnczwwLCAyLCAzPihJbnZva2UoSXNWaXNpYmxlSW5RdWFkcmFudDEpKSk7CisgICAgICAvLyBObyBuZWVkIHRvIGRlZmluZSB5b3VyIG93biBhZGFwdG9yLgorYGBgCisKK0ZvciBiZXR0ZXIgcmVhZGFiaWxpdHksIEdvb2dsZSBNb2NrIGFsc28gZ2l2ZXMgeW91OgorCisgICogYFdpdGhvdXRBcmdzKGFjdGlvbilgIHdoZW4gdGhlIGlubmVyIGBhY3Rpb25gIHRha2VzIF9ub18gYXJndW1lbnQsIGFuZAorICAqIGBXaXRoQXJnPE4+KGFjdGlvbilgIChubyBgc2AgYWZ0ZXIgYEFyZ2ApIHdoZW4gdGhlIGlubmVyIGBhY3Rpb25gIHRha2VzIF9vbmVfIGFyZ3VtZW50LgorCitBcyB5b3UgbWF5IGhhdmUgcmVhbGl6ZWQsIGBJbnZva2VXaXRob3V0QXJncyguLi4pYCBpcyBqdXN0IHN5bnRhY3RpYworc3VnYXIgZm9yIGBXaXRob3V0QXJncyhJbm92a2UoLi4uKSlgLgorCitIZXJlIGFyZSBtb3JlIHRpcHM6CisKKyAgKiBUaGUgaW5uZXIgYWN0aW9uIHVzZWQgaW4gYFdpdGhBcmdzYCBhbmQgZnJpZW5kcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGBJbnZva2UoKWAgLS0gaXQgY2FuIGJlIGFueXRoaW5nLgorICAqIFlvdSBjYW4gcmVwZWF0IGFuIGFyZ3VtZW50IGluIHRoZSBhcmd1bWVudCBsaXN0IGlmIG5lY2Vzc2FyeSwgZS5nLiBgV2l0aEFyZ3M8MiwgMywgMywgNT4oLi4uKWAuCisgICogWW91IGNhbiBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMsIGUuZy4gYFdpdGhBcmdzPDMsIDIsIDE+KC4uLilgLgorICAqIFRoZSB0eXBlcyBvZiB0aGUgc2VsZWN0ZWQgYXJndW1lbnRzIGRvIF9ub3RfIGhhdmUgdG8gbWF0Y2ggdGhlIHNpZ25hdHVyZSBvZiB0aGUgaW5uZXIgYWN0aW9uIGV4YWN0bHkuIEl0IHdvcmtzIGFzIGxvbmcgYXMgdGhleSBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzIG9mIHRoZSBpbm5lciBhY3Rpb24uIEZvciBleGFtcGxlLCBpZiB0aGUgNC10aCBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBpcyBhbiBgaW50YCBhbmQgYG15X2FjdGlvbmAgdGFrZXMgYSBgZG91YmxlYCwgYFdpdGhBcmc8ND4obXlfYWN0aW9uKWAgd2lsbCB3b3JrLgorCisjIyBJZ25vcmluZyBBcmd1bWVudHMgaW4gQWN0aW9uIEZ1bmN0aW9ucyAjIworCitUaGUgc2VsZWN0aW5nLWFuLWFjdGlvbidzLWFyZ3VtZW50cyByZWNpcGUgc2hvd2VkIHVzIG9uZSB3YXkgdG8gbWFrZSBhCittb2NrIGZ1bmN0aW9uIGFuZCBhbiBhY3Rpb24gd2l0aCBpbmNvbXBhdGlibGUgYXJndW1lbnQgbGlzdHMgZml0Cit0b2dldGhlci4gVGhlIGRvd25zaWRlIGlzIHRoYXQgd3JhcHBpbmcgdGhlIGFjdGlvbiBpbgorYFdpdGhBcmdzPC4uLj4oKWAgY2FuIGdldCB0ZWRpb3VzIGZvciBwZW9wbGUgd3JpdGluZyB0aGUgdGVzdHMuCisKK0lmIHlvdSBhcmUgZGVmaW5pbmcgYSBmdW5jdGlvbiwgbWV0aG9kLCBvciBmdW5jdG9yIHRvIGJlIHVzZWQgd2l0aAorYEludm9rZSooKWAsIGFuZCB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHNvbWUgb2YgaXRzIGFyZ3VtZW50cywgYW4KK2FsdGVybmF0aXZlIHRvIGBXaXRoQXJnc2AgaXMgdG8gZGVjbGFyZSB0aGUgdW5pbnRlcmVzdGluZyBhcmd1bWVudHMgYXMKK2BVbnVzZWRgLiBUaGlzIG1ha2VzIHRoZSBkZWZpbml0aW9uIGxlc3MgY2x1dHRlcmVkIGFuZCBsZXNzIGZyYWdpbGUgaW4KK2Nhc2UgdGhlIHR5cGVzIG9mIHRoZSB1bmludGVyZXN0aW5nIGFyZ3VtZW50cyBjaGFuZ2UuIEl0IGNvdWxkIGFsc28KK2luY3JlYXNlIHRoZSBjaGFuY2UgdGhlIGFjdGlvbiBmdW5jdGlvbiBjYW4gYmUgcmV1c2VkLiBGb3IgZXhhbXBsZSwKK2dpdmVuCisKK2BgYAorICBNT0NLX01FVEhPRDMoRm9vLCBkb3VibGUoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7CisgIE1PQ0tfTUVUSE9EMyhCYXIsIGRvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB4LCBkb3VibGUgeSkpOworYGBgCisKK2luc3RlYWQgb2YKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKKworZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisKK2RvdWJsZSBEaXN0YW5jZVRvT3JpZ2luV2l0aEluZGV4KGludCBpbmRleCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisuLi4KKworICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luV2l0aExhYmVsKSk7CisgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbldpdGhJbmRleCkpOworYGBgCisKK3lvdSBjb3VsZCB3cml0ZQorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOwordXNpbmcgOjp0ZXN0aW5nOjpVbnVzZWQ7CisKK2RvdWJsZSBEaXN0YW5jZVRvT3JpZ2luKFVudXNlZCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Cit9CisuLi4KKworICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luKSk7CisgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbikpOworYGBgCisKKyMjIFNoYXJpbmcgQWN0aW9ucyAjIworCitKdXN0IGxpa2UgbWF0Y2hlcnMsIGEgR29vZ2xlIE1vY2sgYWN0aW9uIG9iamVjdCBjb25zaXN0cyBvZiBhIHBvaW50ZXIKK3RvIGEgcmVmLWNvdW50ZWQgaW1wbGVtZW50YXRpb24gb2JqZWN0LiBUaGVyZWZvcmUgY29weWluZyBhY3Rpb25zIGlzCithbHNvIGFsbG93ZWQgYW5kIHZlcnkgZWZmaWNpZW50LiBXaGVuIHRoZSBsYXN0IGFjdGlvbiB0aGF0IHJlZmVyZW5jZXMKK3RoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgZGllcywgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdCB3aWxsIGJlCitkZWxldGVkLgorCitJZiB5b3UgaGF2ZSBzb21lIGNvbXBsZXggYWN0aW9uIHRoYXQgeW91IHdhbnQgdG8gdXNlIGFnYWluIGFuZCBhZ2FpbiwKK3lvdSBtYXkgbm90IGhhdmUgdG8gYnVpbGQgaXQgZnJvbSBzY3JhdGNoIGV2ZXJ5dGltZS4gSWYgdGhlIGFjdGlvbgorZG9lc24ndCBoYXZlIGFuIGludGVybmFsIHN0YXRlIChpLmUuIGlmIGl0IGFsd2F5cyBkb2VzIHRoZSBzYW1lIHRoaW5nCitubyBtYXR0ZXIgaG93IG1hbnkgdGltZXMgaXQgaGFzIGJlZW4gY2FsbGVkKSwgeW91IGNhbiBhc3NpZ24gaXQgdG8gYW4KK2FjdGlvbiB2YXJpYWJsZSBhbmQgdXNlIHRoYXQgdmFyaWFibGUgcmVwZWF0ZWRseS4gRm9yIGV4YW1wbGU6CisKK2BgYAorICBBY3Rpb248Ym9vbChpbnQqKT4gc2V0X2ZsYWcgPSBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4odHJ1ZSkpOworICAuLi4gdXNlIHNldF9mbGFnIGluIC5XaWxsT25jZSgpIGFuZCAuV2lsbFJlcGVhdGVkbHkoKSAuLi4KK2BgYAorCitIb3dldmVyLCBpZiB0aGUgYWN0aW9uIGhhcyBpdHMgb3duIHN0YXRlLCB5b3UgbWF5IGJlIHN1cnByaXNlZCBpZiB5b3UKK3NoYXJlIHRoZSBhY3Rpb24gb2JqZWN0LiBTdXBwb3NlIHlvdSBoYXZlIGFuIGFjdGlvbiBmYWN0b3J5CitgSW5jcmVtZW50Q291bnRlcihpbml0KWAgd2hpY2ggY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbmNyZW1lbnRzIGFuZAorcmV0dXJucyBhIGNvdW50ZXIgd2hvc2UgaW5pdGlhbCB2YWx1ZSBpcyBgaW5pdGAsIHVzaW5nIHR3byBhY3Rpb25zCitjcmVhdGVkIGZyb20gdGhlIHNhbWUgZXhwcmVzc2lvbiBhbmQgdXNpbmcgYSBzaGFyZWQgYWN0aW9uIHdpbGwKK2V4aWhpYml0IGRpZmZlcmVudCBiZWhhdmlvcnMuIEV4YW1wbGU6CisKK2BgYAorICBFWFBFQ1RfQ0FMTChmb28sIERvVGhpcygpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KEluY3JlbWVudENvdW50ZXIoMCkpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KEluY3JlbWVudENvdW50ZXIoMCkpOworICBmb28uRG9UaGlzKCk7ICAvLyBSZXR1cm5zIDEuCisgIGZvby5Eb1RoaXMoKTsgIC8vIFJldHVybnMgMi4KKyAgZm9vLkRvVGhhdCgpOyAgLy8gUmV0dXJucyAxIC0gQmxhaCgpIHVzZXMgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgLy8gY291bnRlciB0aGFuIEJhcigpJ3MuCitgYGAKKwordmVyc3VzCisKK2BgYAorICBBY3Rpb248aW50KCk+IGluY3JlbWVudCA9IEluY3JlbWVudENvdW50ZXIoMCk7CisKKyAgRVhQRUNUX0NBTEwoZm9vLCBEb1RoaXMoKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShpbmNyZW1lbnQpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdCgpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KGluY3JlbWVudCk7CisgIGZvby5Eb1RoaXMoKTsgIC8vIFJldHVybnMgMS4KKyAgZm9vLkRvVGhpcygpOyAgLy8gUmV0dXJucyAyLgorICBmb28uRG9UaGF0KCk7ICAvLyBSZXR1cm5zIDMgLSB0aGUgY291bnRlciBpcyBzaGFyZWQuCitgYGAKKworIyBNaXNjIFJlY2lwZXMgb24gVXNpbmcgR29vZ2xlIE1vY2sgIworCisjIyBNYWtpbmcgdGhlIENvbXBpbGF0aW9uIEZhc3RlciAjIworCitCZWxpZXZlIGl0IG9yIG5vdCwgdGhlIF92YXN0IG1ham9yaXR5XyBvZiB0aGUgdGltZSBzcGVudCBvbiBjb21waWxpbmcKK2EgbW9jayBjbGFzcyBpcyBpbiBnZW5lcmF0aW5nIGl0cyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciwgYXMgdGhleQorcGVyZm9ybSBub24tdHJpdmlhbCB0YXNrcyAoZS5nLiB2ZXJpZmljYXRpb24gb2YgdGhlCitleHBlY3RhdGlvbnMpLiBXaGF0J3MgbW9yZSwgbW9jayBtZXRob2RzIHdpdGggZGlmZmVyZW50IHNpZ25hdHVyZXMKK2hhdmUgZGlmZmVyZW50IHR5cGVzIGFuZCB0aHVzIHRoZWlyIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBuZWVkIHRvCitiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIHNlcGFyYXRlbHkuIEFzIGEgcmVzdWx0LCBpZiB5b3UgbW9jayBtYW55CitkaWZmZXJlbnQgdHlwZXMgb2YgbWV0aG9kcywgY29tcGlsaW5nIHlvdXIgbW9jayBjbGFzcyBjYW4gZ2V0IHJlYWxseQorc2xvdy4KKworSWYgeW91IGFyZSBleHBlcmllbmNpbmcgc2xvdyBjb21waWxhdGlvbiwgeW91IGNhbiBtb3ZlIHRoZSBkZWZpbml0aW9uCitvZiB5b3VyIG1vY2sgY2xhc3MnIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG91dCBvZiB0aGUgY2xhc3MgYm9keQorYW5kIGludG8gYSBgLmNwcGAgZmlsZS4gVGhpcyB3YXksIGV2ZW4gaWYgeW91IGAjaW5jbHVkZWAgeW91ciBtb2NrCitjbGFzcyBpbiBOIGZpbGVzLCB0aGUgY29tcGlsZXIgb25seSBuZWVkcyB0byBnZW5lcmF0ZSBpdHMgY29uc3RydWN0b3IKK2FuZCBkZXN0cnVjdG9yIG9uY2UsIHJlc3VsdGluZyBpbiBhIG11Y2ggZmFzdGVyIGNvbXBpbGF0aW9uLgorCitMZXQncyBpbGx1c3RyYXRlIHRoZSBpZGVhIHVzaW5nIGFuIGV4YW1wbGUuIEhlcmUncyB0aGUgZGVmaW5pdGlvbiBvZiBhCittb2NrIGNsYXNzIGJlZm9yZSBhcHBseWluZyB0aGlzIHJlY2lwZToKKworYGBgCisvLyBGaWxlIG1vY2tfZm9vLmguCisuLi4KK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC8vIFNpbmNlIHdlIGRvbid0IGRlY2xhcmUgdGhlIGNvbnN0cnVjdG9yIG9yIHRoZSBkZXN0cnVjdG9yLAorICAvLyB0aGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSB0aGVtIGluIGV2ZXJ5IHRyYW5zbGF0aW9uIHVuaXQKKyAgLy8gd2hlcmUgdGhpcyBtb2NrIGNsYXNzIGlzIHVzZWQuCisKKyAgTU9DS19NRVRIT0QwKERvVGhpcywgaW50KCkpOworICBNT0NLX01FVEhPRDEoRG9UaGF0LCBib29sKGNvbnN0IGNoYXIqIHN0cikpOworICAuLi4gbW9yZSBtb2NrIG1ldGhvZHMgLi4uCit9OworYGBgCisKK0FmdGVyIHRoZSBjaGFuZ2UsIGl0IHdvdWxkIGxvb2sgbGlrZToKKworYGBgCisvLyBGaWxlIG1vY2tfZm9vLmguCisuLi4KK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBhcmUgZGVjbGFyZWQsIGJ1dCBub3QgZGVmaW5lZCwgaGVyZS4KKyAgTW9ja0ZvbygpOworICB2aXJ0dWFsIH5Nb2NrRm9vKCk7CisKKyAgTU9DS19NRVRIT0QwKERvVGhpcywgaW50KCkpOworICBNT0NLX01FVEhPRDEoRG9UaGF0LCBib29sKGNvbnN0IGNoYXIqIHN0cikpOworICAuLi4gbW9yZSBtb2NrIG1ldGhvZHMgLi4uCit9OworYGBgCithbmQKK2BgYAorLy8gRmlsZSBtb2NrX2Zvby5jcHAuCisjaW5jbHVkZSAicGF0aC90by9tb2NrX2Zvby5oIgorCisvLyBUaGUgZGVmaW5pdGlvbnMgbWF5IGFwcGVhciB0cml2aWFsLCBidXQgdGhlIGZ1bmN0aW9ucyBhY3R1YWxseSBkbyBhCisvLyBsb3Qgb2YgdGhpbmdzIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBvZiB0aGUgbWVtYmVyCisvLyB2YXJpYWJsZXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIG1vY2sgbWV0aG9kcy4KK01vY2tGb286Ok1vY2tGb28oKSB7fQorTW9ja0Zvbzo6fk1vY2tGb28oKSB7fQorYGBgCisKKyMjIEZvcmNpbmcgYSBWZXJpZmljYXRpb24gIyMKKworV2hlbiBpdCdzIGJlaW5nIGRlc3RveWVkLCB5b3VyIGZyaWVuZGx5IG1vY2sgb2JqZWN0IHdpbGwgYXV0b21hdGljYWxseQordmVyaWZ5IHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiBpdCBoYXZlIGJlZW4gc2F0aXNmaWVkLCBhbmQgd2lsbAorZ2VuZXJhdGUgW0dvb2dsZSBUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8pIGZhaWx1cmVzCitpZiBub3QuIFRoaXMgaXMgY29udmVuaWVudCBhcyBpdCBsZWF2ZXMgeW91IHdpdGggb25lIGxlc3MgdGhpbmcgdG8KK3dvcnJ5IGFib3V0LiBUaGF0IGlzLCB1bmxlc3MgeW91IGFyZSBub3Qgc3VyZSBpZiB5b3VyIG1vY2sgb2JqZWN0IHdpbGwKK2JlIGRlc3RveWVkLgorCitIb3cgY291bGQgaXQgYmUgdGhhdCB5b3VyIG1vY2sgb2JqZWN0IHdvbid0IGV2ZW50dWFsbHkgYmUgZGVzdHJveWVkPworV2VsbCwgaXQgbWlnaHQgYmUgY3JlYXRlZCBvbiB0aGUgaGVhcCBhbmQgb3duZWQgYnkgdGhlIGNvZGUgeW91IGFyZQordGVzdGluZy4gU3VwcG9zZSB0aGVyZSdzIGEgYnVnIGluIHRoYXQgY29kZSBhbmQgaXQgZG9lc24ndCBkZWxldGUgdGhlCittb2NrIG9iamVjdCBwcm9wZXJseSAtIHlvdSBjb3VsZCBlbmQgdXAgd2l0aCBhIHBhc3NpbmcgdGVzdCB3aGVuCit0aGVyZSdzIGFjdHVhbGx5IGEgYnVnLgorCitVc2luZyBhIGhlYXAgY2hlY2tlciBpcyBhIGdvb2QgaWRlYSBhbmQgY2FuIGFsbGV2aWF0ZSB0aGUgY29uY2VybiwgYnV0CitpdHMgaW1wbGVtZW50YXRpb24gbWF5IG5vdCBiZSAxMDAlIHJlbGlhYmxlLiBTbywgc29tZXRpbWVzIHlvdSBkbyB3YW50Cit0byBfZm9yY2VfIEdvb2dsZSBNb2NrIHRvIHZlcmlmeSBhIG1vY2sgb2JqZWN0IGJlZm9yZSBpdCBpcworKGhvcGVmdWxseSkgZGVzdHJ1Y3RlZC4gWW91IGNhbiBkbyB0aGlzIHdpdGgKK2BNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19vYmplY3QpYDoKKworYGBgCitURVNUKE15U2VydmVyVGVzdCwgUHJvY2Vzc2VzUmVxdWVzdCkgeworICB1c2luZyA6OnRlc3Rpbmc6Ok1vY2s7CisKKyAgTW9ja0ZvbyogY29uc3QgZm9vID0gbmV3IE1vY2tGb287CisgIEVYUEVDVF9DQUxMKCpmb28sIC4uLikuLi47CisgIC8vIC4uLiBvdGhlciBleHBlY3RhdGlvbnMgLi4uCisKKyAgLy8gc2VydmVyIG5vdyBvd25zIGZvby4KKyAgTXlTZXJ2ZXIgc2VydmVyKGZvbyk7CisgIHNlcnZlci5Qcm9jZXNzUmVxdWVzdCguLi4pOworCisgIC8vIEluIGNhc2UgdGhhdCBzZXJ2ZXIncyBkZXN0cnVjdG9yIHdpbGwgZm9yZ2V0IHRvIGRlbGV0ZSBmb28sCisgIC8vIHRoaXMgd2lsbCB2ZXJpZnkgdGhlIGV4cGVjdGF0aW9ucyBhbnl3YXkuCisgIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGZvbyk7Cit9ICAvLyBzZXJ2ZXIgaXMgZGVzdHJveWVkIHdoZW4gaXQgZ29lcyBvdXQgb2Ygc2NvcGUgaGVyZS4KK2BgYAorCisqKlRpcDoqKiBUaGUgYE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKClgIGZ1bmN0aW9uIHJldHVybnMgYQorYGJvb2xgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHZlcmlmaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAoYHRydWVgIGZvcgoreWVzKSwgc28geW91IGNhbiB3cmFwIHRoYXQgZnVuY3Rpb24gY2FsbCBpbnNpZGUgYSBgQVNTRVJUX1RSVUUoKWAgaWYKK3RoZXJlIGlzIG5vIHBvaW50IGdvaW5nIGZ1cnRoZXIgd2hlbiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBmYWlsZWQuCisKKyMjIFVzaW5nIENoZWNrIFBvaW50cyAjIworCitTb21ldGltZXMgeW91IG1heSB3YW50IHRvICJyZXNldCIgYSBtb2NrIG9iamVjdCBhdCB2YXJpb3VzIGNoZWNrCitwb2ludHMgaW4geW91ciB0ZXN0OiBhdCBlYWNoIGNoZWNrIHBvaW50LCB5b3UgdmVyaWZ5IHRoYXQgYWxsIGV4aXN0aW5nCitleHBlY3RhdGlvbnMgb24gdGhlIG1vY2sgb2JqZWN0IGhhdmUgYmVlbiBzYXRpc2ZpZWQsIGFuZCB0aGVuIHlvdSBzZXQKK3NvbWUgbmV3IGV4cGVjdGF0aW9ucyBvbiBpdCBhcyBpZiBpdCdzIG5ld2x5IGNyZWF0ZWQuIFRoaXMgYWxsb3dzIHlvdQordG8gd29yayB3aXRoIGEgbW9jayBvYmplY3QgaW4gInBoYXNlcyIgd2hvc2Ugc2l6ZXMgYXJlIGVhY2gKK21hbmFnZWFibGUuCisKK09uZSBzdWNoIHNjZW5hcmlvIGlzIHRoYXQgaW4geW91ciB0ZXN0J3MgYFNldFVwKClgIGZ1bmN0aW9uLCB5b3UgbWF5Cit3YW50IHRvIHB1dCB0aGUgb2JqZWN0IHlvdSBhcmUgdGVzdGluZyBpbnRvIGEgY2VydGFpbiBzdGF0ZSwgd2l0aCB0aGUKK2hlbHAgZnJvbSBhIG1vY2sgb2JqZWN0LiBPbmNlIGluIHRoZSBkZXNpcmVkIHN0YXRlLCB5b3Ugd2FudCB0byBjbGVhcgorYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgbW9jaywgc3VjaCB0aGF0IGluIHRoZSBgVEVTVF9GYCBib2R5IHlvdSBjYW4KK3NldCBmcmVzaCBleHBlY3RhdGlvbnMgb24gaXQuCisKK0FzIHlvdSBtYXkgaGF2ZSBmaWd1cmVkIG91dCwgdGhlIGBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygpYAorZnVuY3Rpb24gd2Ugc2F3IGluIHRoZSBwcmV2aW91cyByZWNpcGUgY2FuIGhlbHAgeW91IGhlcmUuIE9yLCBpZiB5b3UKK2FyZSB1c2luZyBgT05fQ0FMTCgpYCB0byBzZXQgZGVmYXVsdCBhY3Rpb25zIG9uIHRoZSBtb2NrIG9iamVjdCBhbmQKK3dhbnQgdG8gY2xlYXIgdGhlIGRlZmF1bHQgYWN0aW9ucyBhcyB3ZWxsLCB1c2UKK2BNb2NrOjpWZXJpZnlBbmRDbGVhcigmbW9ja19vYmplY3QpYCBpbnN0ZWFkLiBUaGlzIGZ1bmN0aW9uIGRvZXMgd2hhdAorYE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX29iamVjdClgIGRvZXMgYW5kIHJldHVybnMgdGhlCitzYW1lIGBib29sYCwgKipwbHVzKiogaXQgY2xlYXJzIHRoZSBgT05fQ0FMTCgpYCBzdGF0ZW1lbnRzIG9uCitgbW9ja19vYmplY3RgIHRvby4KKworQW5vdGhlciB0cmljayB5b3UgY2FuIHVzZSB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBpcyB0byBwdXQgdGhlCitleHBlY3RhdGlvbnMgaW4gc2VxdWVuY2VzIGFuZCBpbnNlcnQgY2FsbHMgdG8gYSBkdW1teSAiY2hlY2stcG9pbnQiCitmdW5jdGlvbiBhdCBzcGVjaWZpYyBwbGFjZXMuIFRoZW4geW91IGNhbiB2ZXJpZnkgdGhhdCB0aGUgbW9jaworZnVuY3Rpb24gY2FsbHMgZG8gaGFwcGVuIGF0IHRoZSByaWdodCB0aW1lLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZQorZXhlcmNpc2luZyBjb2RlOgorCitgYGAKK0ZvbygxKTsKK0ZvbygyKTsKK0ZvbygzKTsKK2BgYAorCithbmQgd2FudCB0byB2ZXJpZnkgdGhhdCBgRm9vKDEpYCBhbmQgYEZvbygzKWAgYm90aCBpbnZva2UKK2Btb2NrLkJhcigiYSIpYCwgYnV0IGBGb28oMilgIGRvZXNuJ3QgaW52b2tlIGFueXRoaW5nLiBZb3UgY2FuIHdyaXRlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TW9ja0Z1bmN0aW9uOworCitURVNUKEZvb1Rlc3QsIEludm9rZXNCYXJDb3JyZWN0bHkpIHsKKyAgTXlNb2NrIG1vY2s7CisgIC8vIENsYXNzIE1vY2tGdW5jdGlvbjxGPiBoYXMgZXhhY3RseSBvbmUgbW9jayBtZXRob2QuICBJdCBpcyBuYW1lZAorICAvLyBDYWxsKCkgYW5kIGhhcyB0eXBlIEYuCisgIE1vY2tGdW5jdGlvbjx2b2lkKHN0cmluZyBjaGVja19wb2ludF9uYW1lKT4gY2hlY2s7CisgIHsKKyAgICBJblNlcXVlbmNlIHM7CisKKyAgICBFWFBFQ1RfQ0FMTChtb2NrLCBCYXIoImEiKSk7CisgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjEiKSk7CisgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjIiKSk7CisgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOworICB9CisgIEZvbygxKTsKKyAgY2hlY2suQ2FsbCgiMSIpOworICBGb28oMik7CisgIGNoZWNrLkNhbGwoIjIiKTsKKyAgRm9vKDMpOworfQorYGBgCisKK1RoZSBleHBlY3RhdGlvbiBzcGVjIHNheXMgdGhhdCB0aGUgZmlyc3QgYEJhcigiYSIpYCBtdXN0IGhhcHBlbiBiZWZvcmUKK2NoZWNrIHBvaW50ICIxIiwgdGhlIHNlY29uZCBgQmFyKCJhIilgIG11c3QgaGFwcGVuIGFmdGVyIGNoZWNrIHBvaW50ICIyIiwKK2FuZCBub3RoaW5nIHNob3VsZCBoYXBwZW4gYmV0d2VlbiB0aGUgdHdvIGNoZWNrIHBvaW50cy4gVGhlIGV4cGxpY2l0CitjaGVjayBwb2ludHMgbWFrZSBpdCBlYXN5IHRvIHRlbGwgd2hpY2ggYEJhcigiYSIpYCBpcyBjYWxsZWQgYnkgd2hpY2gKK2NhbGwgdG8gYEZvbygpYC4KKworIyMgTW9ja2luZyBEZXN0cnVjdG9ycyAjIworCitTb21ldGltZXMgeW91IHdhbnQgdG8gbWFrZSBzdXJlIGEgbW9jayBvYmplY3QgaXMgZGVzdHJ1Y3RlZCBhdCB0aGUKK3JpZ2h0IHRpbWUsIGUuZy4gYWZ0ZXIgYGJhci0+QSgpYCBpcyBjYWxsZWQgYnV0IGJlZm9yZSBgYmFyLT5CKClgIGlzCitjYWxsZWQuIFdlIGFscmVhZHkga25vdyB0aGF0IHlvdSBjYW4gc3BlY2lmeSBjb25zdHJhaW50cyBvbiB0aGUgb3JkZXIKK29mIG1vY2sgZnVuY3Rpb24gY2FsbHMsIHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHRvIG1vY2sgdGhlIGRlc3RydWN0b3IKK29mIHRoZSBtb2NrIGZ1bmN0aW9uLgorCitUaGlzIHNvdW5kcyBzaW1wbGUsIGV4Y2VwdCBmb3Igb25lIHByb2JsZW06IGEgZGVzdHJ1Y3RvciBpcyBhIHNwZWNpYWwKK2Z1bmN0aW9uIHdpdGggc3BlY2lhbCBzeW50YXggYW5kIHNwZWNpYWwgc2VtYW50aWNzLCBhbmQgdGhlCitgTU9DS19NRVRIT0QwYCBtYWNybyBkb2Vzbid0IHdvcmsgZm9yIGl0OgorCitgYGAKKyAgTU9DS19NRVRIT0QwKH5Nb2NrRm9vLCB2b2lkKCkpOyAgLy8gV29uJ3QgY29tcGlsZSEKK2BgYAorCitUaGUgZ29vZCBuZXdzIGlzIHRoYXQgeW91IGNhbiB1c2UgYSBzaW1wbGUgcGF0dGVybiB0byBhY2hpZXZlIHRoZSBzYW1lCitlZmZlY3QuIEZpcnN0LCBhZGQgYSBtb2NrIGZ1bmN0aW9uIGBEaWUoKWAgdG8geW91ciBtb2NrIGNsYXNzIGFuZCBjYWxsCitpdCBpbiB0aGUgZGVzdHJ1Y3RvciwgbGlrZSB0aGlzOgorCitgYGAKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgLi4uCisgIC8vIEFkZCB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyB0byB0aGUgbW9jayBjbGFzcy4KKyAgTU9DS19NRVRIT0QwKERpZSwgdm9pZCgpKTsKKyAgdmlydHVhbCB+TW9ja0ZvbygpIHsgRGllKCk7IH0KK307CitgYGAKKworKElmIHRoZSBuYW1lIGBEaWUoKWAgY2xhc2hlcyB3aXRoIGFuIGV4aXN0aW5nIHN5bWJvbCwgY2hvb3NlIGFub3RoZXIKK25hbWUuKSBOb3csIHdlIGhhdmUgdHJhbnNsYXRlZCB0aGUgcHJvYmxlbSBvZiB0ZXN0aW5nIHdoZW4gYSBgTW9ja0Zvb2AKK29iamVjdCBkaWVzIHRvIHRlc3Rpbmcgd2hlbiBpdHMgYERpZSgpYCBtZXRob2QgaXMgY2FsbGVkOgorCitgYGAKKyAgTW9ja0ZvbyogZm9vID0gbmV3IE1vY2tGb287CisgIE1vY2tCYXIqIGJhciA9IG5ldyBNb2NrQmFyOworICAuLi4KKyAgeworICAgIEluU2VxdWVuY2UgczsKKworICAgIC8vIEV4cGVjdHMgKmZvbyB0byBkaWUgYWZ0ZXIgYmFyLT5BKCkgYW5kIGJlZm9yZSBiYXItPkIoKS4KKyAgICBFWFBFQ1RfQ0FMTCgqYmFyLCBBKCkpOworICAgIEVYUEVDVF9DQUxMKCpmb28sIERpZSgpKTsKKyAgICBFWFBFQ1RfQ0FMTCgqYmFyLCBCKCkpOworICB9CitgYGAKKworQW5kIHRoYXQncyB0aGF0LgorCisjIyBVc2luZyBHb29nbGUgTW9jayBhbmQgVGhyZWFkcyAjIworCisqKklNUE9SVEFOVCBOT1RFOioqIFdoYXQgd2UgZGVzY3JpYmUgaW4gdGhpcyByZWNpcGUgaXMgKipPTkxZKiogdHJ1ZSBvbgorcGxhdGZvcm1zIHdoZXJlIEdvb2dsZSBNb2NrIGlzIHRocmVhZC1zYWZlLiBDdXJyZW50bHkgdGhlc2UgYXJlIG9ubHkKK3BsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhlIHB0aHJlYWRzIGxpYnJhcnkgKHRoaXMgaW5jbHVkZXMgTGludXggYW5kIE1hYykuCitUbyBtYWtlIGl0IHRocmVhZC1zYWZlIG9uIG90aGVyIHBsYXRmb3JtcyB3ZSBvbmx5IG5lZWQgdG8gaW1wbGVtZW50Citzb21lIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zIGluIGAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oImAuCisKK0luIGEgKip1bml0KiogdGVzdCwgaXQncyBiZXN0IGlmIHlvdSBjb3VsZCBpc29sYXRlIGFuZCB0ZXN0IGEgcGllY2Ugb2YKK2NvZGUgaW4gYSBzaW5nbGUtdGhyZWFkZWQgY29udGV4dC4gVGhhdCBhdm9pZHMgcmFjZSBjb25kaXRpb25zIGFuZAorZGVhZCBsb2NrcywgYW5kIG1ha2VzIGRlYnVnZ2luZyB5b3VyIHRlc3QgbXVjaCBlYXNpZXIuCisKK1lldCBtYW55IHByb2dyYW1zIGFyZSBtdWx0aS10aHJlYWRlZCwgYW5kIHNvbWV0aW1lcyB0byB0ZXN0IHNvbWV0aGluZword2UgbmVlZCB0byBwb3VuZCBvbiBpdCBmcm9tIG1vcmUgdGhhbiBvbmUgdGhyZWFkLiBHb29nbGUgTW9jayB3b3JrcworZm9yIHRoaXMgcHVycG9zZSB0b28uCisKK1JlbWVtYmVyIHRoZSBzdGVwcyBmb3IgdXNpbmcgYSBtb2NrOgorCisgIDEuIENyZWF0ZSBhIG1vY2sgb2JqZWN0IGBmb29gLgorICAxLiBTZXQgaXRzIGRlZmF1bHQgYWN0aW9ucyBhbmQgZXhwZWN0YXRpb25zIHVzaW5nIGBPTl9DQUxMKClgIGFuZCBgRVhQRUNUX0NBTEwoKWAuCisgIDEuIFRoZSBjb2RlIHVuZGVyIHRlc3QgY2FsbHMgbWV0aG9kcyBvZiBgZm9vYC4KKyAgMS4gT3B0aW9uYWxseSwgdmVyaWZ5IGFuZCByZXNldCB0aGUgbW9jay4KKyAgMS4gRGVzdHJveSB0aGUgbW9jayB5b3Vyc2VsZiwgb3IgbGV0IHRoZSBjb2RlIHVuZGVyIHRlc3QgZGVzdHJveSBpdC4gVGhlIGRlc3RydWN0b3Igd2lsbCBhdXRvbWF0aWNhbGx5IHZlcmlmeSBpdC4KKworSWYgeW91IGZvbGxvdyB0aGUgZm9sbG93aW5nIHNpbXBsZSBydWxlcywgeW91ciBtb2NrcyBhbmQgdGhyZWFkcyBjYW4KK2xpdmUgaGFwcGlseSB0b2dldGVyOgorCisgICogRXhlY3V0ZSB5b3VyIF90ZXN0IGNvZGVfIChhcyBvcHBvc2VkIHRvIHRoZSBjb2RlIGJlaW5nIHRlc3RlZCkgaW4gX29uZV8gdGhyZWFkLiBUaGlzIG1ha2VzIHlvdXIgdGVzdCBlYXN5IHRvIGZvbGxvdy4KKyAgKiBPYnZpb3VzbHksIHlvdSBjYW4gZG8gc3RlcCAjMSB3aXRob3V0IGxvY2tpbmcuCisgICogV2hlbiBkb2luZyBzdGVwICMyIGFuZCAjNSwgbWFrZSBzdXJlIG5vIG90aGVyIHRocmVhZCBpcyBhY2Nlc3NpbmcgYGZvb2AuIE9idmlvdXMgdG9vLCBodWg/CisgICogIzMgYW5kICM0IGNhbiBiZSBkb25lIGVpdGhlciBpbiBvbmUgdGhyZWFkIG9yIGluIG11bHRpcGxlIHRocmVhZHMgLSBhbnl3YXkgeW91IHdhbnQuIEdvb2dsZSBNb2NrIHRha2VzIGNhcmUgb2YgdGhlIGxvY2tpbmcsIHNvIHlvdSBkb24ndCBoYXZlIHRvIGRvIGFueSAtIHVubGVzcyByZXF1aXJlZCBieSB5b3VyIHRlc3QgbG9naWMuCisKK0lmIHlvdSB2aW9sYXRlIHRoZSBydWxlcyAoZm9yIGV4YW1wbGUsIGlmIHlvdSBzZXQgZXhwZWN0YXRpb25zIG9uIGEKK21vY2sgd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgY2FsbGluZyBpdHMgbWV0aG9kcyksIHlvdSBnZXQgdW5kZWZpbmVkCitiZWhhdmlvci4gVGhhdCdzIG5vdCBmdW4sIHNvIGRvbid0IGRvIGl0LgorCitHb29nbGUgTW9jayBndWFyYW50ZWVzIHRoYXQgdGhlIGFjdGlvbiBmb3IgYSBtb2NrIGZ1bmN0aW9uIGlzIGRvbmUgaW4KK3RoZSBzYW1lIHRocmVhZCB0aGF0IGNhbGxlZCB0aGUgbW9jayBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIGluCisKK2BgYAorICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oMSkpCisgICAgICAuV2lsbE9uY2UoYWN0aW9uMSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbygyKSkKKyAgICAgIC5XaWxsT25jZShhY3Rpb24yKTsKK2BgYAorCitpZiBgRm9vKDEpYCBpcyBjYWxsZWQgaW4gdGhyZWFkIDEgYW5kIGBGb28oMilgIGlzIGNhbGxlZCBpbiB0aHJlYWQgMiwKK0dvb2dsZSBNb2NrIHdpbGwgZXhlY3V0ZSBgYWN0aW9uMWAgaW4gdGhyZWFkIDEgYW5kIGBhY3Rpb24yYCBpbiB0aHJlYWQKKzIuCisKK0dvb2dsZSBNb2NrIGRvZXMgX25vdF8gaW1wb3NlIGEgc2VxdWVuY2Ugb24gYWN0aW9ucyBwZXJmb3JtZWQgaW4KK2RpZmZlcmVudCB0aHJlYWRzIChkb2luZyBzbyBtYXkgY3JlYXRlIGRlYWRsb2NrcyBhcyB0aGUgYWN0aW9ucyBtYXkKK25lZWQgdG8gY29vcGVyYXRlKS4gVGhpcyBtZWFucyB0aGF0IHRoZSBleGVjdXRpb24gb2YgYGFjdGlvbjFgIGFuZAorYGFjdGlvbjJgIGluIHRoZSBhYm92ZSBleGFtcGxlIF9tYXlfIGludGVybGVhdmUuIElmIHRoaXMgaXMgYSBwcm9ibGVtLAoreW91IHNob3VsZCBhZGQgcHJvcGVyIHN5bmNocm9uaXphdGlvbiBsb2dpYyB0byBgYWN0aW9uMWAgYW5kIGBhY3Rpb24yYAordG8gbWFrZSB0aGUgdGVzdCB0aHJlYWQtc2FmZS4KKworCitBbHNvLCByZW1lbWJlciB0aGF0IGBEZWZhdWx0VmFsdWU8VD5gIGlzIGEgZ2xvYmFsIHJlc291cmNlIHRoYXQKK3BvdGVudGlhbGx5IGFmZmVjdHMgX2FsbF8gbGl2aW5nIG1vY2sgb2JqZWN0cyBpbiB5b3VyCitwcm9ncmFtLiBOYXR1cmFsbHksIHlvdSB3b24ndCB3YW50IHRvIG1lc3Mgd2l0aCBpdCBmcm9tIG11bHRpcGxlCit0aHJlYWRzIG9yIHdoZW4gdGhlcmUgc3RpbGwgYXJlIG1vY2tzIGluIGFjdGlvbi4KKworIyMgQ29udHJvbGxpbmcgSG93IE11Y2ggSW5mb3JtYXRpb24gR29vZ2xlIE1vY2sgUHJpbnRzICMjCisKK1doZW4gR29vZ2xlIE1vY2sgc2VlcyBzb21ldGhpbmcgdGhhdCBoYXMgdGhlIHBvdGVudGlhbCBvZiBiZWluZyBhbgorZXJyb3IgKGUuZy4gYSBtb2NrIGZ1bmN0aW9uIHdpdGggbm8gZXhwZWN0YXRpb24gaXMgY2FsbGVkLCBhLmsuYS4gYW4KK3VuaW50ZXJlc3RpbmcgY2FsbCwgd2hpY2ggaXMgYWxsb3dlZCBidXQgcGVyaGFwcyB5b3UgZm9yZ290IHRvCitleHBsaWNpdGx5IGJhbiB0aGUgY2FsbCksIGl0IHByaW50cyBzb21lIHdhcm5pbmcgbWVzc2FnZXMsIGluY2x1ZGluZwordGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24gYW5kIHRoZSByZXR1cm4gdmFsdWUuIEhvcGVmdWxseSB0aGlzCit3aWxsIHJlbWluZCB5b3UgdG8gdGFrZSBhIGxvb2sgYW5kIHNlZSBpZiB0aGVyZSBpcyBpbmRlZWQgYSBwcm9ibGVtLgorCitTb21ldGltZXMgeW91IGFyZSBjb25maWRlbnQgdGhhdCB5b3VyIHRlc3RzIGFyZSBjb3JyZWN0IGFuZCBtYXkgbm90CithcHByZWNpYXRlIHN1Y2ggZnJpZW5kbHkgbWVzc2FnZXMuIFNvbWUgb3RoZXIgdGltZXMsIHlvdSBhcmUgZGVidWdnaW5nCit5b3VyIHRlc3RzIG9yIGxlYXJuaW5nIGFib3V0IHRoZSBiZWhhdmlvciBvZiB0aGUgY29kZSB5b3UgYXJlIHRlc3RpbmcsCithbmQgd2lzaCB5b3UgY291bGQgb2JzZXJ2ZSBldmVyeSBtb2NrIGNhbGwgdGhhdCBoYXBwZW5zIChpbmNsdWRpbmcKK2FyZ3VtZW50IHZhbHVlcyBhbmQgdGhlIHJldHVybiB2YWx1ZSkuIENsZWFybHksIG9uZSBzaXplIGRvZXNuJ3QgZml0CithbGwuCisKK1lvdSBjYW4gY29udHJvbCBob3cgbXVjaCBHb29nbGUgTW9jayB0ZWxscyB5b3UgdXNpbmcgdGhlCitgLS1nbW9ja192ZXJib3NlPUxFVkVMYCBjb21tYW5kLWxpbmUgZmxhZywgd2hlcmUgYExFVkVMYCBpcyBhIHN0cmluZword2l0aCB0aHJlZSBwb3NzaWJsZSB2YWx1ZXM6CisKKyAgKiBgaW5mb2A6IEdvb2dsZSBNb2NrIHdpbGwgcHJpbnQgYWxsIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMsIHdhcm5pbmdzLCBhbmQgZXJyb3JzIChtb3N0IHZlcmJvc2UpLiBBdCB0aGlzIHNldHRpbmcsIEdvb2dsZSBNb2NrIHdpbGwgYWxzbyBsb2cgYW55IGNhbGxzIHRvIHRoZSBgT05fQ0FMTC9FWFBFQ1RfQ0FMTGAgbWFjcm9zLgorICAqIGB3YXJuaW5nYDogR29vZ2xlIE1vY2sgd2lsbCBwcmludCBib3RoIHdhcm5pbmdzIGFuZCBlcnJvcnMgKGxlc3MgdmVyYm9zZSkuIFRoaXMgaXMgdGhlIGRlZmF1bHQuCisgICogYGVycm9yYDogR29vZ2xlIE1vY2sgd2lsbCBwcmludCBlcnJvcnMgb25seSAobGVhc3QgdmVyYm9zZSkuCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gYWRqdXN0IHRoZSB2YWx1ZSBvZiB0aGF0IGZsYWcgZnJvbSB3aXRoaW4geW91cgordGVzdHMgbGlrZSBzbzoKKworYGBgCisgIDo6dGVzdGluZzo6RkxBR1NfZ21vY2tfdmVyYm9zZSA9ICJlcnJvciI7CitgYGAKKworTm93LCBqdWRpY2lvdXNseSB1c2UgdGhlIHJpZ2h0IGZsYWcgdG8gZW5hYmxlIEdvb2dsZSBNb2NrIHNlcnZlIHlvdSBiZXR0ZXIhCisKKyMjIEdhaW5pbmcgU3VwZXIgVmlzaW9uIGludG8gTW9jayBDYWxscyAjIworCitZb3UgaGF2ZSBhIHRlc3QgdXNpbmcgR29vZ2xlIE1vY2suIEl0IGZhaWxzOiBHb29nbGUgTW9jayB0ZWxscyB5b3UKK3RoYXQgc29tZSBleHBlY3RhdGlvbnMgYXJlbid0IHNhdGlzZmllZC4gSG93ZXZlciwgeW91IGFyZW4ndCBzdXJlIHdoeToKK0lzIHRoZXJlIGEgdHlwbyBzb21ld2hlcmUgaW4gdGhlIG1hdGNoZXJzPyBEaWQgeW91IG1lc3MgdXAgdGhlIG9yZGVyCitvZiB0aGUgYEVYUEVDVF9DQUxMYHM/IE9yIGlzIHRoZSBjb2RlIHVuZGVyIHRlc3QgZG9pbmcgc29tZXRoaW5nCit3cm9uZz8gIEhvdyBjYW4geW91IGZpbmQgb3V0IHRoZSBjYXVzZT8KKworV29uJ3QgaXQgYmUgbmljZSBpZiB5b3UgaGF2ZSBYLXJheSB2aXNpb24gYW5kIGNhbiBhY3R1YWxseSBzZWUgdGhlCit0cmFjZSBvZiBhbGwgYEVYUEVDVF9DQUxMYHMgYW5kIG1vY2sgbWV0aG9kIGNhbGxzIGFzIHRoZXkgYXJlIG1hZGU/CitGb3IgZWFjaCBjYWxsLCB3b3VsZCB5b3UgbGlrZSB0byBzZWUgaXRzIGFjdHVhbCBhcmd1bWVudCB2YWx1ZXMgYW5kCit3aGljaCBgRVhQRUNUX0NBTExgIEdvb2dsZSBNb2NrIHRoaW5rcyBpdCBtYXRjaGVzPworCitZb3UgY2FuIHVubG9jayB0aGlzIHBvd2VyIGJ5IHJ1bm5pbmcgeW91ciB0ZXN0IHdpdGggdGhlCitgLS1nbW9ja192ZXJib3NlPWluZm9gIGZsYWcuIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgdGVzdCBwcm9ncmFtOgorCitgYGAKK3VzaW5nIHRlc3Rpbmc6Ol87Cit1c2luZyB0ZXN0aW5nOjpIYXNTdWJzdHI7Cit1c2luZyB0ZXN0aW5nOjpSZXR1cm47CisKK2NsYXNzIE1vY2tGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKEYsIHZvaWQoY29uc3Qgc3RyaW5nJiB4LCBjb25zdCBzdHJpbmcmIHkpKTsKK307CisKK1RFU1QoRm9vLCBCYXIpIHsKKyAgTW9ja0ZvbyBtb2NrOworICBFWFBFQ1RfQ0FMTChtb2NrLCBGKF8sIF8pKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIEYoImEiLCAiYiIpKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgRigiYyIsIEhhc1N1YnN0cigiZCIpKSk7CisKKyAgbW9jay5GKCJhIiwgImdvb2QiKTsKKyAgbW9jay5GKCJhIiwgImIiKTsKK30KK2BgYAorCitpZiB5b3UgcnVuIGl0IHdpdGggYC0tZ21vY2tfdmVyYm9zZT1pbmZvYCwgeW91IHdpbGwgc2VlIHRoaXMgb3V0cHV0OgorCitgYGAKK1sgUlVOICAgICAgXSBGb28uQmFyCisKK2Zvb190ZXN0LmNjOjE0OiBFWFBFQ1RfQ0FMTChtb2NrLCBGKF8sIF8pKSBpbnZva2VkCitmb29fdGVzdC5jYzoxNTogRVhQRUNUX0NBTEwobW9jaywgRigiYSIsICJiIikpIGludm9rZWQKK2Zvb190ZXN0LmNjOjE2OiBFWFBFQ1RfQ0FMTChtb2NrLCBGKCJjIiwgSGFzU3Vic3RyKCJkIikpKSBpbnZva2VkCitmb29fdGVzdC5jYzoxNDogTW9jayBmdW5jdGlvbiBjYWxsIG1hdGNoZXMgRVhQRUNUX0NBTEwobW9jaywgRihfLCBfKSkuLi4KKyAgICBGdW5jdGlvbiBjYWxsOiBGKEAweDdmZmY3YzhkYWQ0MCJhIiwgQDB4N2ZmZjdjOGRhZDEwImdvb2QiKQorZm9vX3Rlc3QuY2M6MTU6IE1vY2sgZnVuY3Rpb24gY2FsbCBtYXRjaGVzIEVYUEVDVF9DQUxMKG1vY2ssIEYoImEiLCAiYiIpKS4uLgorICAgIEZ1bmN0aW9uIGNhbGw6IEYoQDB4N2ZmZjdjOGRhZGEwImEiLCBAMHg3ZmZmN2M4ZGFkNzAiYiIpCitmb29fdGVzdC5jYzoxNjogRmFpbHVyZQorQWN0dWFsIGZ1bmN0aW9uIGNhbGwgY291bnQgZG9lc24ndCBtYXRjaCBFWFBFQ1RfQ0FMTChtb2NrLCBGKCJjIiwgSGFzU3Vic3RyKCJkIikpKS4uLgorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEZvby5CYXIKK2BgYAorCitTdXBwb3NlIHRoZSBidWcgaXMgdGhhdCB0aGUgYCJjImAgaW4gdGhlIHRoaXJkIGBFWFBFQ1RfQ0FMTGAgaXMgYSB0eXBvCithbmQgc2hvdWxkIGFjdHVhbGx5IGJlIGAiYSJgLiBXaXRoIHRoZSBhYm92ZSBtZXNzYWdlLCB5b3Ugc2hvdWxkIHNlZQordGhhdCB0aGUgYWN0dWFsIGBGKCJhIiwgImdvb2QiKWAgY2FsbCBpcyBtYXRjaGVkIGJ5IHRoZSBmaXJzdAorYEVYUEVDVF9DQUxMYCwgbm90IHRoZSB0aGlyZCBhcyB5b3UgdGhvdWdodC4gRnJvbSB0aGF0IGl0IHNob3VsZCBiZQorb2J2aW91cyB0aGF0IHRoZSB0aGlyZCBgRVhQRUNUX0NBTExgIGlzIHdyaXR0ZW4gd3JvbmcuIENhc2Ugc29sdmVkLgorCisjIyBSdW5uaW5nIFRlc3RzIGluIEVtYWNzICMjCisKK0lmIHlvdSBidWlsZCBhbmQgcnVuIHlvdXIgdGVzdHMgaW4gRW1hY3MsIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbnMgb2YKK0dvb2dsZSBNb2NrIGFuZCBbR29vZ2xlIFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LykKK2Vycm9ycyB3aWxsIGJlIGhpZ2hsaWdodGVkLiBKdXN0IHByZXNzIGA8RW50ZXI+YCBvbiBvbmUgb2YgdGhlbSBhbmQKK3lvdSdsbCBiZSB0YWtlbiB0byB0aGUgb2ZmZW5kaW5nIGxpbmUuIE9yLCB5b3UgY2FuIGp1c3QgdHlwZSBgQy14IGBgCit0byBqdW1wIHRvIHRoZSBuZXh0IGVycm9yLgorCitUbyBtYWtlIGl0IGV2ZW4gZWFzaWVyLCB5b3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHlvdXIKK2B+Ly5lbWFjc2AgZmlsZToKKworYGBgCisoZ2xvYmFsLXNldC1rZXkgIlxNLW0iICAgJ2NvbXBpbGUpICA7IG0gaXMgZm9yIG1ha2UKKyhnbG9iYWwtc2V0LWtleSBbTS1kb3duXSAnbmV4dC1lcnJvcikKKyhnbG9iYWwtc2V0LWtleSBbTS11cF0gICAnKGxhbWJkYSAoKSAoaW50ZXJhY3RpdmUpIChuZXh0LWVycm9yIC0xKSkpCitgYGAKKworVGhlbiB5b3UgY2FuIHR5cGUgYE0tbWAgdG8gc3RhcnQgYSBidWlsZCwgb3IgYE0tdXBgL2BNLWRvd25gIHRvIG1vdmUKK2JhY2sgYW5kIGZvcnRoIGJldHdlZW4gZXJyb3JzLgorCisjIyBGdXNpbmcgR29vZ2xlIE1vY2sgU291cmNlIEZpbGVzICMjCisKK0dvb2dsZSBNb2NrJ3MgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgZG96ZW5zIG9mIGZpbGVzIChleGNsdWRpbmcKK2l0cyBvd24gdGVzdHMpLiAgU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0aGVtIHRvIGJlIHBhY2thZ2VkIHVwIGluCitmZXdlciBmaWxlcyBpbnN0ZWFkLCBzdWNoIHRoYXQgeW91IGNhbiBlYXNpbHkgY29weSB0aGVtIHRvIGEgbmV3CittYWNoaW5lIGFuZCBzdGFydCBoYWNraW5nIHRoZXJlLiAgRm9yIHRoaXMgd2UgcHJvdmlkZSBhbiBleHBlcmltZW50YWwKK1B5dGhvbiBzY3JpcHQgYGZ1c2VfZ21vY2tfZmlsZXMucHlgIGluIHRoZSBgc2NyaXB0cy9gIGRpcmVjdG9yeQorKHN0YXJ0aW5nIHdpdGggcmVsZWFzZSAxLjIuMCkuICBBc3N1bWluZyB5b3UgaGF2ZSBQeXRob24gMi40IG9yIGFib3ZlCitpbnN0YWxsZWQgb24geW91ciBtYWNoaW5lLCBqdXN0IGdvIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW4KK2BgYAorcHl0aG9uIGZ1c2VfZ21vY2tfZmlsZXMucHkgT1VUUFVUX0RJUgorYGBgCisKK2FuZCB5b3Ugc2hvdWxkIHNlZSBhbiBgT1VUUFVUX0RJUmAgZGlyZWN0b3J5IGJlaW5nIGNyZWF0ZWQgd2l0aCBmaWxlcworYGd0ZXN0L2d0ZXN0LmhgLCBgZ21vY2svZ21vY2suaGAsIGFuZCBgZ21vY2stZ3Rlc3QtYWxsLmNjYCBpbiBpdC4KK1RoZXNlIHRocmVlIGZpbGVzIGNvbnRhaW4gZXZlcnl0aGluZyB5b3UgbmVlZCB0byB1c2UgR29vZ2xlIE1vY2sgKGFuZAorR29vZ2xlIFRlc3QpLiAgSnVzdCBjb3B5IHRoZW0gdG8gYW55d2hlcmUgeW91IHdhbnQgYW5kIHlvdSBhcmUgcmVhZHkKK3RvIHdyaXRlIHRlc3RzIGFuZCB1c2UgbW9ja3MuICBZb3UgY2FuIHVzZSB0aGUKK1tzY3JwdHMvdGVzdC9NYWtlZmlsZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svc291cmNlL2Jyb3dzZS90cnVuay9zY3JpcHRzL3Rlc3QvTWFrZWZpbGUpIGZpbGUgYXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY29tcGlsZSB5b3VyIHRlc3RzCithZ2FpbnN0IHRoZW0uCisKKyMgRXh0ZW5kaW5nIEdvb2dsZSBNb2NrICMKKworIyMgV3JpdGluZyBOZXcgTWF0Y2hlcnMgUXVpY2tseSAjIworCitUaGUgYE1BVENIRVIqYCBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBjdXN0b20gbWF0Y2hlcnMKK2Vhc2lseS4gIFRoZSBzeW50YXg6CisKK2BgYAorTUFUQ0hFUihuYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmdfZXhwcmVzc2lvbikgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKword2lsbCBkZWZpbmUgYSBtYXRjaGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUKK3N0YXRlbWVudHMsIHdoaWNoIG11c3QgcmV0dXJuIGEgYGJvb2xgIHRvIGluZGljYXRlIGlmIHRoZSBtYXRjaAorc3VjY2VlZHMuICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIGJlaW5nCittYXRjaGVkIGJ5IGBhcmdgLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgYGFyZ190eXBlYC4KKworVGhlIGRlc2NyaXB0aW9uIHN0cmluZyBpcyBhIGBzdHJpbmdgLXR5cGVkIGV4cHJlc3Npb24gdGhhdCBkb2N1bWVudHMKK3doYXQgdGhlIG1hdGNoZXIgZG9lcywgYW5kIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGZhaWx1cmUgbWVzc2FnZQord2hlbiB0aGUgbWF0Y2ggZmFpbHMuICBJdCBjYW4gKGFuZCBzaG91bGQpIHJlZmVyZW5jZSB0aGUgc3BlY2lhbAorYGJvb2xgIHZhcmlhYmxlIGBuZWdhdGlvbmAsIGFuZCBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIGRlc2NyaXB0aW9uIG9mCit0aGUgbWF0Y2hlciB3aGVuIGBuZWdhdGlvbmAgaXMgYGZhbHNlYCwgb3IgdGhhdCBvZiB0aGUgbWF0Y2hlcidzCituZWdhdGlvbiB3aGVuIGBuZWdhdGlvbmAgaXMgYHRydWVgLgorCitGb3IgY29udmVuaWVuY2UsIHdlIGFsbG93IHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgdG8gYmUgZW1wdHkgKGAiImApLAoraW4gd2hpY2ggY2FzZSBHb29nbGUgTW9jayB3aWxsIHVzZSB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlCittYXRjaGVyIG5hbWUgYXMgdGhlIGRlc2NyaXB0aW9uLgorCitGb3IgZXhhbXBsZToKK2BgYAorTUFUQ0hFUihJc0RpdmlzaWJsZUJ5NywgIiIpIHsgcmV0dXJuIChhcmcgJSA3KSA9PSAwOyB9CitgYGAKK2FsbG93cyB5b3UgdG8gd3JpdGUKK2BgYAorICAvLyBFeHBlY3RzIG1vY2tfZm9vLkJhcihuKSB0byBiZSBjYWxsZWQgd2hlcmUgbiBpcyBkaXZpc2libGUgYnkgNy4KKyAgRVhQRUNUX0NBTEwobW9ja19mb28sIEJhcihJc0RpdmlzaWJsZUJ5NygpKSk7CitgYGAKK29yLAorYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok5vdDsKKy4uLgorICBFWFBFQ1RfVEhBVChzb21lX2V4cHJlc3Npb24sIElzRGl2aXNpYmxlQnk3KCkpOworICBFWFBFQ1RfVEhBVChzb21lX290aGVyX2V4cHJlc3Npb24sIE5vdChJc0RpdmlzaWJsZUJ5NygpKSk7CitgYGAKK0lmIHRoZSBhYm92ZSBhc3NlcnRpb25zIGZhaWwsIHRoZXkgd2lsbCBwcmludCBzb21ldGhpbmcgbGlrZToKK2BgYAorICBWYWx1ZSBvZjogc29tZV9leHByZXNzaW9uCisgIEV4cGVjdGVkOiBpcyBkaXZpc2libGUgYnkgNworICAgIEFjdHVhbDogMjcKKy4uLgorICBWYWx1ZSBvZjogc29tZV9vdGhlcl9leHByZXNzaW9uCisgIEV4cGVjdGVkOiBub3QgKGlzIGRpdmlzaWJsZSBieSA3KQorICAgIEFjdHVhbDogMjEKK2BgYAord2hlcmUgdGhlIGRlc2NyaXB0aW9ucyBgImlzIGRpdmlzaWJsZSBieSA3ImAgYW5kIGAibm90IChpcyBkaXZpc2libGUKK2J5IDcpImAgYXJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRoZSBtYXRjaGVyIG5hbWUKK2BJc0RpdmlzaWJsZUJ5N2AuCisKK0FzIHlvdSBtYXkgaGF2ZSBub3RpY2VkLCB0aGUgYXV0by1nZW5lcmF0ZWQgZGVzY3JpcHRpb25zIChlc3BlY2lhbGx5Cit0aG9zZSBmb3IgdGhlIG5lZ2F0aW9uKSBtYXkgbm90IGJlIHNvIGdyZWF0LiBZb3UgY2FuIGFsd2F5cyBvdmVycmlkZQordGhlbSB3aXRoIGEgc3RyaW5nIGV4cHJlc3Npb24gb2YgeW91ciBvd246CitgYGAKK01BVENIRVIoSXNEaXZpc2libGVCeTcsIHN0ZDo6c3RyaW5nKG5lZ2F0aW9uID8gImlzbid0IiA6ICJpcyIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZGl2aXNpYmxlIGJ5IDciKSB7CisgIHJldHVybiAoYXJnICUgNykgPT0gMDsKK30KK2BgYAorCitPcHRpb25hbGx5LCB5b3UgY2FuIHN0cmVhbSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGEgaGlkZGVuIGFyZ3VtZW50CituYW1lZCBgcmVzdWx0X2xpc3RlbmVyYCB0byBleHBsYWluIHRoZSBtYXRjaCByZXN1bHQuIEZvciBleGFtcGxlLCBhCitiZXR0ZXIgZGVmaW5pdGlvbiBvZiBgSXNEaXZpc2libGVCeTdgIGlzOgorYGBgCitNQVRDSEVSKElzRGl2aXNpYmxlQnk3LCAiIikgeworICBpZiAoKGFyZyAlIDcpID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgKnJlc3VsdF9saXN0ZW5lciA8PCAidGhlIHJlbWFpbmRlciBpcyAiIDw8IChhcmcgJSA3KTsKKyAgcmV0dXJuIGZhbHNlOworfQorYGBgCisKK1dpdGggdGhpcyBkZWZpbml0aW9uLCB0aGUgYWJvdmUgYXNzZXJ0aW9uIHdpbGwgZ2l2ZSBhIGJldHRlciBtZXNzYWdlOgorYGBgCisgIFZhbHVlIG9mOiBzb21lX2V4cHJlc3Npb24KKyAgRXhwZWN0ZWQ6IGlzIGRpdmlzaWJsZSBieSA3CisgICAgQWN0dWFsOiAyNyAodGhlIHJlbWFpbmRlciBpcyA2KQorYGBgCisKK1lvdSBzaG91bGQgbGV0IGBNYXRjaEFuZEV4cGxhaW4oKWAgcHJpbnQgX2FueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXwordGhhdCBjYW4gaGVscCBhIHVzZXIgdW5kZXJzdGFuZCB0aGUgbWF0Y2ggcmVzdWx0LiBOb3RlIHRoYXQgaXQgc2hvdWxkCitleHBsYWluIHdoeSB0aGUgbWF0Y2ggc3VjY2VlZHMgaW4gY2FzZSBvZiBhIHN1Y2Nlc3MgKHVubGVzcyBpdCdzCitvYnZpb3VzKSAtIHRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIG1hdGNoZXIgaXMgdXNlZCBpbnNpZGUKK2BOb3QoKWAuIFRoZXJlIGlzIG5vIG5lZWQgdG8gcHJpbnQgdGhlIGFyZ3VtZW50IHZhbHVlIGl0c2VsZiwgYXMKK0dvb2dsZSBNb2NrIGFscmVhZHkgcHJpbnRzIGl0IGZvciB5b3UuCisKKyoqTm90ZXM6KioKKworICAxLiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCAoYGFyZ190eXBlYCkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB5b3UgdXNlIHRoZSBtYXRjaGVyIGFuZCBpcyBzdXBwbGllZCB0byB5b3UgYnkgdGhlIGNvbXBpbGVyLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBkZWNsYXJpbmcgaXQgKG5vciBjYW4geW91KS4gIFRoaXMgYWxsb3dzIHRoZSBtYXRjaGVyIHRvIGJlIHBvbHltb3JwaGljLiAgRm9yIGV4YW1wbGUsIGBJc0RpdmlzaWJsZUJ5NygpYCBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbnkgdHlwZSB3aGVyZSB0aGUgdmFsdWUgb2YgYChhcmcgJSA3KSA9PSAwYCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBgYm9vbGAuICBJbiB0aGUgYEJhcihJc0RpdmlzaWJsZUJ5NygpKWAgZXhhbXBsZSBhYm92ZSwgaWYgbWV0aG9kIGBCYXIoKWAgdGFrZXMgYW4gYGludGAsIGBhcmdfdHlwZWAgd2lsbCBiZSBgaW50YDsgaWYgaXQgdGFrZXMgYW4gYHVuc2lnbmVkIGxvbmdgLCBgYXJnX3R5cGVgIHdpbGwgYmUgYHVuc2lnbmVkIGxvbmdgOyBhbmQgc28gb24uCisgIDEuIEdvb2dsZSBNb2NrIGRvZXNuJ3QgZ3VhcmFudGVlIHdoZW4gb3IgaG93IG1hbnkgdGltZXMgYSBtYXRjaGVyIHdpbGwgYmUgaW52b2tlZC4gVGhlcmVmb3JlIHRoZSBtYXRjaGVyIGxvZ2ljIG11c3QgYmUgX3B1cmVseSBmdW5jdGlvbmFsXyAoaS5lLiBpdCBjYW5ub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QsIGFuZCB0aGUgcmVzdWx0IG11c3Qgbm90IGRlcGVuZCBvbiBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZCB0aGUgbWF0Y2hlciBwYXJhbWV0ZXJzKS4gVGhpcyByZXF1aXJlbWVudCBtdXN0IGJlIHNhdGlzZmllZCBubyBtYXR0ZXIgaG93IHlvdSBkZWZpbmUgdGhlIG1hdGNoZXIgKGUuZy4gdXNpbmcgb25lIG9mIHRoZSBtZXRob2RzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHJlY2lwZXMpLiBJbiBwYXJ0aWN1bGFyLCBhIG1hdGNoZXIgY2FuIG5ldmVyIGNhbGwgYSBtb2NrIGZ1bmN0aW9uLCBhcyB0aGF0IHdpbGwgYWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGUgbW9jayBvYmplY3QgYW5kIEdvb2dsZSBNb2NrLgorCisjIyBXcml0aW5nIE5ldyBQYXJhbWV0ZXJpemVkIE1hdGNoZXJzIFF1aWNrbHkgIyMKKworU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIGRlZmluZSBhIG1hdGNoZXIgdGhhdCBoYXMgcGFyYW1ldGVycy4gIEZvciB0aGF0IHlvdQorY2FuIHVzZSB0aGUgbWFjcm86CitgYGAKK01BVENIRVJfUChuYW1lLCBwYXJhbV9uYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQorYGBgCit3aGVyZSB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGNhbiBiZSBlaXRoZXIgYCIiYCBvciBhIHN0cmluZyBleHByZXNzaW9uCit0aGF0IHJlZmVyZW5jZXMgYG5lZ2F0aW9uYCBhbmQgYHBhcmFtX25hbWVgLgorCitGb3IgZXhhbXBsZToKK2BgYAorTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlLCAiIikgeyByZXR1cm4gYWJzKGFyZykgPT0gdmFsdWU7IH0KK2BgYAord2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6CitgYGAKKyAgRVhQRUNUX1RIQVQoQmxhaCgiYSIpLCBIYXNBYnNvbHV0ZVZhbHVlKG4pKTsKK2BgYAord2hpY2ggbWF5IGxlYWQgdG8gdGhpcyBtZXNzYWdlIChhc3N1bWluZyBgbmAgaXMgMTApOgorYGBgCisgIFZhbHVlIG9mOiBCbGFoKCJhIikKKyAgRXhwZWN0ZWQ6IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxMAorICAgIEFjdHVhbDogLTkKK2BgYAorCitOb3RlIHRoYXQgYm90aCB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBhcmUKK3ByaW50ZWQsIG1ha2luZyB0aGUgbWVzc2FnZSBodW1hbi1mcmllbmRseS4KKworSW4gdGhlIG1hdGNoZXIgZGVmaW5pdGlvbiBib2R5LCB5b3UgY2FuIHdyaXRlIGBmb29fdHlwZWAgdG8KK3JlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZCBgZm9vYC4gIEZvciBleGFtcGxlLCBpbiB0aGUKK2JvZHkgb2YgYE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSlgIGFib3ZlLCB5b3UgY2FuIHdyaXRlCitgdmFsdWVfdHlwZWAgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgYHZhbHVlYC4KKworR29vZ2xlIE1vY2sgYWxzbyBwcm92aWRlcyBgTUFUQ0hFUl9QMmAsIGBNQVRDSEVSX1AzYCwgLi4uLCB1cCB0bworYE1BVENIRVJfUDEwYCB0byBzdXBwb3J0IG11bHRpLXBhcmFtZXRlciBtYXRjaGVyczoKK2BgYAorTUFUQ0hFUl9QayhuYW1lLCBwYXJhbV8xLCAuLi4sIHBhcmFtX2ssIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKworUGxlYXNlIG5vdGUgdGhhdCB0aGUgY3VzdG9tIGRlc2NyaXB0aW9uIHN0cmluZyBpcyBmb3IgYSBwYXJ0aWN1bGFyCisqKmluc3RhbmNlKiogb2YgdGhlIG1hdGNoZXIsIHdoZXJlIHRoZSBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBib3VuZCB0bworYWN0dWFsIHZhbHVlcy4gIFRoZXJlZm9yZSB1c3VhbGx5IHlvdSdsbCB3YW50IHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHRvCitiZSBwYXJ0IG9mIHRoZSBkZXNjcmlwdGlvbi4gIEdvb2dsZSBNb2NrIGxldHMgeW91IGRvIHRoYXQgYnkKK3JlZmVyZW5jaW5nIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMgaW4gdGhlIGRlc2NyaXB0aW9uIHN0cmluZworZXhwcmVzc2lvbi4KKworRm9yIGV4YW1wbGUsCitgYGAKKyAgdXNpbmcgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nOworICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksCisgICAgICAgICAgICAgc3RkOjpzdHJpbmcobmVnYXRpb24gPyAiaXNuJ3QiIDogImlzIikgKyAiIGluIHJhbmdlIFsiICsKKyAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGxvdykgKyAiLCAiICsgUHJpbnRUb1N0cmluZyhoaSkgKyAiXSIpIHsKKyAgICByZXR1cm4gbG93IDw9IGFyZyAmJiBhcmcgPD0gaGk7CisgIH0KKyAgLi4uCisgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOworYGBgCit3b3VsZCBnZW5lcmF0ZSBhIGZhaWx1cmUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZToKK2BgYAorICBFeHBlY3RlZDogaXMgaW4gcmFuZ2UgWzQsIDZdCitgYGAKKworSWYgeW91IHNwZWNpZnkgYCIiYCBhcyB0aGUgZGVzY3JpcHRpb24sIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugd2lsbAorY29udGFpbiB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBmb2xsb3dlZCBieSB0aGUKK3BhcmFtZXRlciB2YWx1ZXMgcHJpbnRlZCBhcyBhIHR1cGxlLiAgRm9yIGV4YW1wbGUsCitgYGAKKyAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLCAiIikgeyAuLi4gfQorICAuLi4KKyAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7CitgYGAKK3dvdWxkIGdlbmVyYXRlIGEgZmFpbHVyZSB0aGF0IGNvbnRhaW5zIHRoZSB0ZXh0OgorYGBgCisgIEV4cGVjdGVkOiBpbiBjbG9zZWQgcmFuZ2UgKDQsIDYpCitgYGAKKworRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3CitgYGAKK01BVENIRVJfUGsoRm9vLCBwMSwgLi4uLCBwaywgZGVzY3JpcHRpb25fc3RyaW5nKSB7IC4uLiB9CitgYGAKK2FzIHNob3J0aGFuZCBmb3IKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIHAxX3R5cGUsIC4uLiwgdHlwZW5hbWUgcGtfdHlwZT4KK0Zvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+CitGb28ocDFfdHlwZSBwMSwgLi4uLCBwa190eXBlIHBrKSB7IC4uLiB9CitgYGAKKworV2hlbiB5b3Ugd3JpdGUgYEZvbyh2MSwgLi4uLCB2aylgLCB0aGUgY29tcGlsZXIgaW5mZXJzIHRoZSB0eXBlcyBvZgordGhlIHBhcmFtZXRlcnMgYHYxYCwgLi4uLCBhbmQgYHZrYCBmb3IgeW91LiAgSWYgeW91IGFyZSBub3QgaGFwcHkgd2l0aAordGhlIHJlc3VsdCBvZiB0aGUgdHlwZSBpbmZlcmVuY2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgdHlwZXMgYnkKK2V4cGxpY2l0bHkgaW5zdGFudGlhdGluZyB0aGUgdGVtcGxhdGUsIGFzIGluIGBGb288bG9uZywgYm9vbD4oNSwgZmFsc2UpYC4KK0FzIHNhaWQgZWFybGllciwgeW91IGRvbid0IGdldCB0byAob3IgbmVlZCB0bykgc3BlY2lmeQorYGFyZ190eXBlYCBhcyB0aGF0J3MgZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgbWF0Y2hlcgoraXMgdXNlZC4KKworWW91IGNhbiBhc3NpZ24gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uIGBGb28ocDEsIC4uLiwgcGspYCB0byBhCit2YXJpYWJsZSBvZiB0eXBlIGBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPmAuICBUaGlzIGNhbiBiZQordXNlZnVsIHdoZW4gY29tcG9zaW5nIG1hdGNoZXJzLiAgTWF0Y2hlcnMgdGhhdCBkb24ndCBoYXZlIGEgcGFyYW1ldGVyCitvciBoYXZlIG9ubHkgb25lIHBhcmFtZXRlciBoYXZlIHNwZWNpYWwgdHlwZXM6IHlvdSBjYW4gYXNzaWduIGBGb28oKWAKK3RvIGEgYEZvb01hdGNoZXJgLXR5cGVkIHZhcmlhYmxlLCBhbmQgYXNzaWduIGBGb28ocClgIHRvIGEKK2BGb29NYXRjaGVyUDxwX3R5cGU+YC10eXBlZCB2YXJpYWJsZS4KKworV2hpbGUgeW91IGNhbiBpbnN0YW50aWF0ZSBhIG1hdGNoZXIgdGVtcGxhdGUgd2l0aCByZWZlcmVuY2UgdHlwZXMsCitwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGJ5IHBvaW50ZXIgdXN1YWxseSBtYWtlcyB5b3VyIGNvZGUgbW9yZQorcmVhZGFibGUuICBJZiwgaG93ZXZlciwgeW91IHN0aWxsIHdhbnQgdG8gcGFzcyBhIHBhcmFtZXRlciBieQorcmVmZXJlbmNlLCBiZSBhd2FyZSB0aGF0IGluIHRoZSBmYWlsdXJlIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZQorbWF0Y2hlciB5b3Ugd2lsbCBzZWUgdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdCBidXQgbm90IGl0cworYWRkcmVzcy4KKworWW91IGNhbiBvdmVybG9hZCBtYXRjaGVycyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6CitgYGAKK01BVENIRVJfUChCbGFoLCBhLCBkZXNjcmlwdGlvbl9zdHJpbmdfMSkgeyAuLi4gfQorTUFUQ0hFUl9QMihCbGFoLCBhLCBiLCBkZXNjcmlwdGlvbl9zdHJpbmdfMikgeyAuLi4gfQorYGBgCisKK1doaWxlIGl0J3MgdGVtcHRpbmcgdG8gYWx3YXlzIHVzZSB0aGUgYE1BVENIRVIqYCBtYWNyb3Mgd2hlbiBkZWZpbmluZworYSBuZXcgbWF0Y2hlciwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZworYE1hdGNoZXJJbnRlcmZhY2VgIG9yIHVzaW5nIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgIGluc3RlYWQgKHNlZQordGhlIHJlY2lwZXMgdGhhdCBmb2xsb3cpLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvIHVzZSB0aGUgbWF0Y2hlciBhCitsb3QuICBXaGlsZSB0aGVzZSBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrLCB0aGV5IGdpdmUgeW91IG1vcmUKK2NvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZCB0aGUgbWF0Y2hlcgorcGFyYW1ldGVycywgd2hpY2ggaW4gZ2VuZXJhbCBsZWFkcyB0byBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMKK3RoYXQgcGF5IG9mZiBpbiB0aGUgbG9uZyBydW4uICBUaGV5IGFsc28gYWxsb3cgb3ZlcmxvYWRpbmcgbWF0Y2hlcnMKK2Jhc2VkIG9uIHBhcmFtZXRlciB0eXBlcyAoYXMgb3Bwb3NlZCB0byBqdXN0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YKK3BhcmFtZXRlcnMpLgorCisjIyBXcml0aW5nIE5ldyBNb25vbW9ycGhpYyBNYXRjaGVycyAjIworCitBIG1hdGNoZXIgb2YgYXJndW1lbnQgdHlwZSBgVGAgaW1wbGVtZW50cworYDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxUPmAgYW5kIGRvZXMgdHdvIHRoaW5nczogaXQgdGVzdHMgd2hldGhlciBhCit2YWx1ZSBvZiB0eXBlIGBUYCBtYXRjaGVzIHRoZSBtYXRjaGVyLCBhbmQgY2FuIGRlc2NyaWJlIHdoYXQga2luZCBvZgordmFsdWVzIGl0IG1hdGNoZXMuIFRoZSBsYXR0ZXIgYWJpbGl0eSBpcyB1c2VkIGZvciBnZW5lcmF0aW5nIHJlYWRhYmxlCitlcnJvciBtZXNzYWdlcyB3aGVuIGV4cGVjdGF0aW9ucyBhcmUgdmlvbGF0ZWQuCisKK1RoZSBpbnRlcmZhY2UgbG9va3MgbGlrZSB0aGlzOgorCitgYGAKK2NsYXNzIE1hdGNoUmVzdWx0TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIC8vIFN0cmVhbXMgeCB0byB0aGUgdW5kZXJseWluZyBvc3RyZWFtOyBkb2VzIG5vdGhpbmcgaWYgdGhlIG9zdHJlYW0KKyAgLy8gaXMgTlVMTC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIE1hdGNoUmVzdWx0TGlzdGVuZXImIG9wZXJhdG9yPDwoY29uc3QgVCYgeCk7CisKKyAgLy8gUmV0dXJucyB0aGUgdW5kZXJseWluZyBvc3RyZWFtLgorICA6OnN0ZDo6b3N0cmVhbSogc3RyZWFtKCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIE1hdGNoZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+TWF0Y2hlckludGVyZmFjZSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG1hdGNoZXIgbWF0Y2hlcyB4OyBhbHNvIGV4cGxhaW5zIHRoZSBtYXRjaAorICAvLyByZXN1bHQgdG8gJ2xpc3RlbmVyJy4KKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCA9IDA7CisKKyAgLy8gRGVzY3JpYmVzIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKKworICAvLyBEZXNjcmliZXMgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Cit9OworYGBgCisKK0lmIHlvdSBuZWVkIGEgY3VzdG9tIG1hdGNoZXIgYnV0IGBUcnVseSgpYCBpcyBub3QgYSBnb29kIG9wdGlvbiAoZm9yCitleGFtcGxlLCB5b3UgbWF5IG5vdCBiZSBoYXBweSB3aXRoIHRoZSB3YXkgYFRydWx5KHByZWRpY2F0ZSlgCitkZXNjcmliZXMgaXRzZWxmLCBvciB5b3UgbWF5IHdhbnQgeW91ciBtYXRjaGVyIHRvIGJlIHBvbHltb3JwaGljIGFzCitgRXEodmFsdWUpYCBpcyksIHlvdSBjYW4gZGVmaW5lIGEgbWF0Y2hlciB0byBkbyB3aGF0ZXZlciB5b3Ugd2FudCBpbgordHdvIHN0ZXBzOiBmaXJzdCBpbXBsZW1lbnQgdGhlIG1hdGNoZXIgaW50ZXJmYWNlLCBhbmQgdGhlbiBkZWZpbmUgYQorZmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBtYXRjaGVyIGluc3RhbmNlLiBUaGUgc2Vjb25kIHN0ZXAgaXMgbm90CitzdHJpY3RseSBuZWVkZWQgYnV0IGl0IG1ha2VzIHRoZSBzeW50YXggb2YgdXNpbmcgdGhlIG1hdGNoZXIgbmljZXIuCisKK0ZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBhIG1hdGNoZXIgdG8gdGVzdCB3aGV0aGVyIGFuIGBpbnRgIGlzCitkaXZpc2libGUgYnkgNyBhbmQgdGhlbiB1c2UgaXQgbGlrZSB0aGlzOgorYGBgCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VNYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworCitjbGFzcyBEaXZpc2libGVCeTdNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCBuLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIHJldHVybiAobiAlIDcpID09IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImlzIGRpdmlzaWJsZSBieSA3IjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBub3QgZGl2aXNpYmxlIGJ5IDciOworICB9Cit9OworCitpbmxpbmUgTWF0Y2hlcjxpbnQ+IERpdmlzaWJsZUJ5NygpIHsKKyAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBEaXZpc2libGVCeTdNYXRjaGVyKTsKK30KKy4uLgorCisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKERpdmlzaWJsZUJ5NygpKSk7CitgYGAKKworWW91IG1heSBpbXByb3ZlIHRoZSBtYXRjaGVyIG1lc3NhZ2UgYnkgc3RyZWFtaW5nIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIHRvIHRoZSBgbGlzdGVuZXJgIGFyZ3VtZW50IGluIGBNYXRjaEFuZEV4cGxhaW4oKWA6CisKK2BgYAorY2xhc3MgRGl2aXNpYmxlQnk3TWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPGludD4geworIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGNvbnN0IGludCByZW1haW5kZXIgPSBuICUgNzsKKyAgICBpZiAocmVtYWluZGVyICE9IDApIHsKKyAgICAgICpsaXN0ZW5lciA8PCAidGhlIHJlbWFpbmRlciBpcyAiIDw8IHJlbWFpbmRlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlbWFpbmRlciA9PSAwOworICB9CisgIC4uLgorfTsKK2BgYAorCitUaGVuLCBgRVhQRUNUX1RIQVQoeCwgRGl2aXNpYmxlQnk3KCkpO2AgbWF5IGdlbmVyYWwgYSBtZXNzYWdlIGxpa2UgdGhpczoKK2BgYAorVmFsdWUgb2Y6IHgKK0V4cGVjdGVkOiBpcyBkaXZpc2libGUgYnkgNworICBBY3R1YWw6IDIzICh0aGUgcmVtYWluZGVyIGlzIDIpCitgYGAKKworIyMgV3JpdGluZyBOZXcgUG9seW1vcnBoaWMgTWF0Y2hlcnMgIyMKKworWW91J3ZlIGxlYXJuZWQgaG93IHRvIHdyaXRlIHlvdXIgb3duIG1hdGNoZXJzIGluIHRoZSBwcmV2aW91cworcmVjaXBlLiBKdXN0IG9uZSBwcm9ibGVtOiBhIG1hdGNoZXIgY3JlYXRlZCB1c2luZyBgTWFrZU1hdGNoZXIoKWAgb25seQord29ya3MgZm9yIG9uZSBwYXJ0aWN1bGFyIHR5cGUgb2YgYXJndW1lbnRzLiBJZiB5b3Ugd2FudCBhCitfcG9seW1vcnBoaWNfIG1hdGNoZXIgdGhhdCB3b3JrcyB3aXRoIGFyZ3VtZW50cyBvZiBzZXZlcmFsIHR5cGVzIChmb3IKK2luc3RhbmNlLCBgRXEoeClgIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGEgYHZhbHVlYCBhcyBsb25nIGFzIGB2YWx1ZWAgPT0KK2B4YCBjb21waWxlcyAtLSBgdmFsdWVgIGFuZCBgeGAgZG9uJ3QgaGF2ZSB0byBzaGFyZSB0aGUgc2FtZSB0eXBlKSwKK3lvdSBjYW4gbGVhcm4gdGhlIHRyaWNrIGZyb20gYCJnbW9jay9nbW9jay1tYXRjaGVycy5oImAgYnV0IGl0J3MgYSBiaXQKK2ludm9sdmVkLgorCitGb3J0dW5hdGVseSwgbW9zdCBvZiB0aGUgdGltZSB5b3UgY2FuIGRlZmluZSBhIHBvbHltb3JwaGljIG1hdGNoZXIKK2Vhc2lseSB3aXRoIHRoZSBoZWxwIG9mIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgLiBIZXJlJ3MgaG93IHlvdSBjYW4KK2RlZmluZSBgTm90TnVsbCgpYCBhcyBhbiBleGFtcGxlOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6Tm90TnVsbDsKK3VzaW5nIDo6dGVzdGluZzo6UG9seW1vcnBoaWNNYXRjaGVyOworCitjbGFzcyBOb3ROdWxsTWF0Y2hlciB7CisgcHVibGljOgorICAvLyBUbyBpbXBsZW1lbnQgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLCBmaXJzdCBkZWZpbmUgYSBDT1BZQUJMRSBjbGFzcworICAvLyB0aGF0IGhhcyB0aHJlZSBtZW1iZXJzIE1hdGNoQW5kRXhwbGFpbigpLCBEZXNjcmliZVRvKCksIGFuZAorICAvLyBEZXNjcmliZU5lZ2F0aW9uVG8oKSwgbGlrZSB0aGUgZm9sbG93aW5nLgorCisgIC8vIEluIHRoaXMgZXhhbXBsZSwgd2Ugd2FudCB0byB1c2UgTm90TnVsbCgpIHdpdGggYW55IHBvaW50ZXIsIHNvCisgIC8vIE1hdGNoQW5kRXhwbGFpbigpIGFjY2VwdHMgYSBwb2ludGVyIG9mIGFueSB0eXBlIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4KKyAgLy8gSW4gZ2VuZXJhbCwgeW91IGNhbiBkZWZpbmUgTWF0Y2hBbmRFeHBsYWluKCkgYXMgYW4gb3JkaW5hcnkgbWV0aG9kIG9yCisgIC8vIGEgbWV0aG9kIHRlbXBsYXRlLCBvciBldmVuIG92ZXJsb2FkIGl0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gcCAhPSBOVUxMOworICB9CisKKyAgLy8gRGVzY3JpYmVzIHRoZSBwcm9wZXJ0eSBvZiBhIHZhbHVlIG1hdGNoaW5nIHRoaXMgbWF0Y2hlci4KKyAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImlzIG5vdCBOVUxMIjsgfQorCisgIC8vIERlc2NyaWJlcyB0aGUgcHJvcGVydHkgb2YgYSB2YWx1ZSBOT1QgbWF0Y2hpbmcgdGhpcyBtYXRjaGVyLgorICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpcyBOVUxMIjsgfQorfTsKKworLy8gVG8gY29uc3RydWN0IGEgcG9seW1vcnBoaWMgbWF0Y2hlciwgcGFzcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MKKy8vIHRvIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKS4gIE5vdGUgdGhlIHJldHVybiB0eXBlLgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxOb3ROdWxsTWF0Y2hlcj4gTm90TnVsbCgpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTm90TnVsbE1hdGNoZXIoKSk7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJhcihOb3ROdWxsKCkpKTsgIC8vIFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLU5VTEwgcG9pbnRlci4KK2BgYAorCisqKk5vdGU6KiogWW91ciBwb2x5bW9ycGhpYyBtYXRjaGVyIGNsYXNzIGRvZXMgKipub3QqKiBuZWVkIHRvIGluaGVyaXQgZnJvbQorYE1hdGNoZXJJbnRlcmZhY2VgIG9yIGFueSBvdGhlciBjbGFzcywgYW5kIGl0cyBtZXRob2RzIGRvICoqbm90KiogbmVlZAordG8gYmUgdmlydHVhbC4KKworTGlrZSBpbiBhIG1vbm9tb3JwaGljIG1hdGNoZXIsIHlvdSBtYXkgZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0IGJ5CitzdHJlYW1pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgYGxpc3RlbmVyYCBhcmd1bWVudCBpbgorYE1hdGNoQW5kRXhwbGFpbigpYC4KKworIyMgV3JpdGluZyBOZXcgQ2FyZGluYWxpdGllcyAjIworCitBIGNhcmRpbmFsaXR5IGlzIHVzZWQgaW4gYFRpbWVzKClgIHRvIHRlbGwgR29vZ2xlIE1vY2sgaG93IG1hbnkgdGltZXMKK3lvdSBleHBlY3QgYSBjYWxsIHRvIG9jY3VyLiBJdCBkb2Vzbid0IGhhdmUgdG8gYmUgZXhhY3QuIEZvciBleGFtcGxlLAoreW91IGNhbiBzYXkgYEF0TGVhc3QoNSlgIG9yIGBCZXR3ZWVuKDIsIDQpYC4KKworSWYgdGhlIGJ1aWx0LWluIHNldCBvZiBjYXJkaW5hbGl0aWVzIGRvZXNuJ3Qgc3VpdCB5b3UsIHlvdSBhcmUgZnJlZSB0bworZGVmaW5lIHlvdXIgb3duIGJ5IGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIGludGVyZmFjZSAoaW4gbmFtZXNwYWNlCitgdGVzdGluZ2ApOgorCitgYGAKK2NsYXNzIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNhcmRpbmFsaXR5SW50ZXJmYWNlKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0aXNmeSB0aGlzIGNhcmRpbmFsaXR5LgorICB2aXJ0dWFsIGJvb2wgSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCA9IDA7CisKKyAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbS4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7Cit9OworYGBgCisKK0ZvciBleGFtcGxlLCB0byBzcGVjaWZ5IHRoYXQgYSBjYWxsIG11c3Qgb2NjdXIgZXZlbiBudW1iZXIgb2YgdGltZXMsCit5b3UgY2FuIHdyaXRlCisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpDYXJkaW5hbGl0eTsKK3VzaW5nIDo6dGVzdGluZzo6Q2FyZGluYWxpdHlJbnRlcmZhY2U7Cit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VDYXJkaW5hbGl0eTsKKworY2xhc3MgRXZlbk51bWJlckNhcmRpbmFsaXR5IDogcHVibGljIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIChjYWxsX2NvdW50ICUgMikgPT0gMDsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiOworICB9Cit9OworCitDYXJkaW5hbGl0eSBFdmVuTnVtYmVyKCkgeworICByZXR1cm4gTWFrZUNhcmRpbmFsaXR5KG5ldyBFdmVuTnVtYmVyQ2FyZGluYWxpdHkpOworfQorLi4uCisKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMykpCisgICAgICAuVGltZXMoRXZlbk51bWJlcigpKTsKK2BgYAorCisjIyBXcml0aW5nIE5ldyBBY3Rpb25zIFF1aWNrbHkgIyMKKworSWYgdGhlIGJ1aWx0LWluIGFjdGlvbnMgZG9uJ3Qgd29yayBmb3IgeW91LCBhbmQgeW91IGZpbmQgaXQKK2luY29udmVuaWVudCB0byB1c2UgYEludm9rZSgpYCwgeW91IGNhbiB1c2UgYSBtYWNybyBmcm9tIHRoZSBgQUNUSU9OKmAKK2ZhbWlseSB0byBxdWlja2x5IGRlZmluZSBhIG5ldyBhY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB5b3VyIGNvZGUgYXMKK2lmIGl0J3MgYSBidWlsdC1pbiBhY3Rpb24uCisKK0J5IHdyaXRpbmcKK2BgYAorQUNUSU9OKG5hbWUpIHsgc3RhdGVtZW50czsgfQorYGBgCitpbiBhIG5hbWVzcGFjZSBzY29wZSAoaS5lLiBub3QgaW5zaWRlIGEgY2xhc3Mgb3IgZnVuY3Rpb24pLCB5b3Ugd2lsbAorZGVmaW5lIGFuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhlY3V0ZXMgdGhlIHN0YXRlbWVudHMuCitUaGUgdmFsdWUgcmV0dXJuZWQgYnkgYHN0YXRlbWVudHNgIHdpbGwgYmUgdXNlZCBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mCit0aGUgYWN0aW9uLiAgSW5zaWRlIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuIHJlZmVyIHRvIHRoZSBLLXRoCisoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXMgYGFyZ0tgLiAgRm9yIGV4YW1wbGU6CitgYGAKK0FDVElPTihJbmNyZW1lbnRBcmcxKSB7IHJldHVybiArKygqYXJnMSk7IH0KK2BgYAorYWxsb3dzIHlvdSB0byB3cml0ZQorYGBgCisuLi4gV2lsbE9uY2UoSW5jcmVtZW50QXJnMSgpKTsKK2BgYAorCitOb3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KK2FyZ3VtZW50cy4gIFJlc3QgYXNzdXJlZCB0aGF0IHlvdXIgY29kZSBpcyB0eXBlLXNhZmUgdGhvdWdoOgoreW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmIGAqYXJnMWAgZG9lc24ndCBzdXBwb3J0IHRoZSBgKytgCitvcGVyYXRvciwgb3IgaWYgdGhlIHR5cGUgb2YgYCsrKCphcmcxKWAgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZSBtb2NrCitmdW5jdGlvbidzIHJldHVybiB0eXBlLgorCitBbm90aGVyIGV4YW1wbGU6CitgYGAKK0FDVElPTihGb28pIHsKKyAgKCphcmcyKSg1KTsKKyAgQmxhaCgpOworICAqYXJnMSA9IDA7CisgIHJldHVybiBhcmcwOworfQorYGBgCitkZWZpbmVzIGFuIGFjdGlvbiBgRm9vKClgIHRoYXQgaW52b2tlcyBhcmd1bWVudCAjMiAoYSBmdW5jdGlvbiBwb2ludGVyKQord2l0aCA1LCBjYWxscyBmdW5jdGlvbiBgQmxhaCgpYCwgc2V0cyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBhcmd1bWVudAorIzEgdG8gMCwgYW5kIHJldHVybnMgYXJndW1lbnQgIzAuCisKK0ZvciBtb3JlIGNvbnZlbmllbmNlIGFuZCBmbGV4aWJpbGl0eSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgZm9sbG93aW5nCitwcmUtZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBib2R5IG9mIGBBQ1RJT05gOgorCit8IGBhcmdLX3R5cGVgIHwgVGhlIHR5cGUgb2YgdGhlIEstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHwKK3w6LS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgYXJnc2AgICAgICB8IEFsbCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYXMgYSB0dXBsZSAgICAgICAgICAgICAgICB8Cit8IGBhcmdzX3R5cGVgIHwgVGhlIHR5cGUgb2YgYWxsIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcyBhIHR1cGxlICAgIHwKK3wgYHJldHVybl90eXBlYCB8IFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbW9jayBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBmdW5jdGlvbl90eXBlYCB8IFRoZSB0eXBlIG9mIHRoZSBtb2NrIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKK0ZvciBleGFtcGxlLCB3aGVuIHVzaW5nIGFuIGBBQ1RJT05gIGFzIGEgc3R1YiBhY3Rpb24gZm9yIG1vY2sgZnVuY3Rpb246CitgYGAKK2ludCBEb1NvbWV0aGluZyhib29sIGZsYWcsIGludCogcHRyKTsKK2BgYAord2UgaGF2ZToKK3wgKipQcmUtZGVmaW5lZCBTeW1ib2wqKiB8ICoqSXMgQm91bmQgVG8qKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tfAorfCBgYXJnMGAgICAgICAgICAgICAgICAgIHwgdGhlIHZhbHVlIG9mIGBmbGFnYCB8Cit8IGBhcmcwX3R5cGVgICAgICAgICAgICAgfCB0aGUgdHlwZSBgYm9vbGAgfAorfCBgYXJnMWAgICAgICAgICAgICAgICAgIHwgdGhlIHZhbHVlIG9mIGBwdHJgIHwKK3wgYGFyZzFfdHlwZWAgICAgICAgICAgICB8IHRoZSB0eXBlIGBpbnQqYCB8Cit8IGBhcmdzYCAgICAgICAgICAgICAgICAgfCB0aGUgdHVwbGUgYChmbGFnLCBwdHIpYCB8Cit8IGBhcmdzX3R5cGVgICAgICAgICAgICAgfCB0aGUgdHlwZSBgc3RkOjp0cjE6OnR1cGxlPGJvb2wsIGludCo+YCB8Cit8IGByZXR1cm5fdHlwZWAgICAgICAgICAgfCB0aGUgdHlwZSBgaW50YCAgfAorfCBgZnVuY3Rpb25fdHlwZWAgICAgICAgIHwgdGhlIHR5cGUgYGludChib29sLCBpbnQqKWAgfAorCisjIyBXcml0aW5nIE5ldyBQYXJhbWV0ZXJpemVkIEFjdGlvbnMgUXVpY2tseSAjIworCitTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIGFuIGFjdGlvbiB5b3UgZGVmaW5lLiAgRm9yIHRoYXQKK3dlIGhhdmUgYW5vdGhlciBtYWNybworYGBgCitBQ1RJT05fUChuYW1lLCBwYXJhbSkgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKworRm9yIGV4YW1wbGUsCitgYGAKK0FDVElPTl9QKEFkZCwgbikgeyByZXR1cm4gYXJnMCArIG47IH0KK2BgYAord2lsbCBhbGxvdyB5b3UgdG8gd3JpdGUKK2BgYAorLy8gUmV0dXJucyBhcmd1bWVudCAjMCArIDUuCisuLi4gV2lsbE9uY2UoQWRkKDUpKTsKK2BgYAorCitGb3IgY29udmVuaWVuY2UsIHdlIHVzZSB0aGUgdGVybSBfYXJndW1lbnRzXyBmb3IgdGhlIHZhbHVlcyB1c2VkIHRvCitpbnZva2UgdGhlIG1vY2sgZnVuY3Rpb24sIGFuZCB0aGUgdGVybSBfcGFyYW1ldGVyc18gZm9yIHRoZSB2YWx1ZXMKK3VzZWQgdG8gaW5zdGFudGlhdGUgYW4gYWN0aW9uLgorCitOb3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gcHJvdmlkZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGVpdGhlci4KK1N1cHBvc2UgdGhlIHBhcmFtZXRlciBpcyBuYW1lZCBgcGFyYW1gLCB5b3UgY2FuIGFsc28gdXNlIHRoZQorR29vZ2xlLU1vY2stZGVmaW5lZCBzeW1ib2wgYHBhcmFtX3R5cGVgIHRvIHJlZmVyIHRvIHRoZSB0eXBlIG9mIHRoZQorcGFyYW1ldGVyIGFzIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIEZvciBleGFtcGxlLCBpbiB0aGUgYm9keSBvZgorYEFDVElPTl9QKEFkZCwgbilgIGFib3ZlLCB5b3UgY2FuIHdyaXRlIGBuX3R5cGVgIGZvciB0aGUgdHlwZSBvZiBgbmAuCisKK0dvb2dsZSBNb2NrIGFsc28gcHJvdmlkZXMgYEFDVElPTl9QMmAsIGBBQ1RJT05fUDNgLCBhbmQgZXRjIHRvIHN1cHBvcnQKK211bHRpLXBhcmFtZXRlciBhY3Rpb25zLiAgRm9yIGV4YW1wbGUsCitgYGAKK0FDVElPTl9QMihSZXR1cm5EaXN0YW5jZVRvLCB4LCB5KSB7CisgIGRvdWJsZSBkeCA9IGFyZzAgLSB4OworICBkb3VibGUgZHkgPSBhcmcxIC0geTsKKyAgcmV0dXJuIHNxcnQoZHgqZHggKyBkeSpkeSk7Cit9CitgYGAKK2xldHMgeW91IHdyaXRlCitgYGAKKy4uLiBXaWxsT25jZShSZXR1cm5EaXN0YW5jZVRvKDUuMCwgMjYuNSkpOworYGBgCisKK1lvdSBjYW4gdmlldyBgQUNUSU9OYCBhcyBhIGRlZ2VuZXJhdGVkIHBhcmFtZXRlcml6ZWQgYWN0aW9uIHdoZXJlIHRoZQorbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgMC4KKworWW91IGNhbiBhbHNvIGVhc2lseSBkZWZpbmUgYWN0aW9ucyBvdmVybG9hZGVkIG9uIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyczoKK2BgYAorQUNUSU9OX1AoUGx1cywgYSkgeyAuLi4gfQorQUNUSU9OX1AyKFBsdXMsIGEsIGIpIHsgLi4uIH0KK2BgYAorCisjIyBSZXN0cmljdGluZyB0aGUgVHlwZSBvZiBhbiBBcmd1bWVudCBvciBQYXJhbWV0ZXIgaW4gYW4gQUNUSU9OICMjCisKK0ZvciBtYXhpbXVtIGJyZXZpdHkgYW5kIHJldXNhYmlsaXR5LCB0aGUgYEFDVElPTipgIG1hY3JvcyBkb24ndCBhc2sKK3lvdSB0byBwcm92aWRlIHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIHRoZSBhY3Rpb24KK3BhcmFtZXRlcnMuICBJbnN0ZWFkLCB3ZSBsZXQgdGhlIGNvbXBpbGVyIGluZmVyIHRoZSB0eXBlcyBmb3IgdXMuCisKK1NvbWV0aW1lcywgaG93ZXZlciwgd2UgbWF5IHdhbnQgdG8gYmUgbW9yZSBleHBsaWNpdCBhYm91dCB0aGUgdHlwZXMuCitUaGVyZSBhcmUgc2V2ZXJhbCB0cmlja3MgdG8gZG8gdGhhdC4gIEZvciBleGFtcGxlOgorYGBgCitBQ1RJT04oRm9vKSB7CisgIC8vIE1ha2VzIHN1cmUgYXJnMCBjYW4gYmUgY29udmVydGVkIHRvIGludC4KKyAgaW50IG4gPSBhcmcwOworICAuLi4gdXNlIG4gaW5zdGVhZCBvZiBhcmcwIGhlcmUgLi4uCit9CisKK0FDVElPTl9QKEJhciwgcGFyYW0pIHsKKyAgLy8gTWFrZXMgc3VyZSB0aGUgdHlwZSBvZiBhcmcxIGlzIGNvbnN0IGNoYXIqLgorICA6OnRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBjaGFyKiwgYXJnMV90eXBlPigpOworCisgIC8vIE1ha2VzIHN1cmUgcGFyYW0gY2FuIGJlIGNvbnZlcnRlZCB0byBib29sLgorICBib29sIGZsYWcgPSBwYXJhbTsKK30KK2BgYAord2hlcmUgYFN0YXRpY0Fzc2VydFR5cGVFcWAgaXMgYSBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIGluIEdvb2dsZSBUZXN0Cit0aGF0IHZlcmlmaWVzIHR3byB0eXBlcyBhcmUgdGhlIHNhbWUuCisKKyMjIFdyaXRpbmcgTmV3IEFjdGlvbiBUZW1wbGF0ZXMgUXVpY2tseSAjIworCitTb21ldGltZXMgeW91IHdhbnQgdG8gZ2l2ZSBhbiBhY3Rpb24gZXhwbGljaXQgdGVtcGxhdGUgcGFyYW1ldGVycyB0aGF0CitjYW5ub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgdmFsdWUgcGFyYW1ldGVycy4gIGBBQ1RJT05fVEVNUExBVEUoKWAKK3N1cHBvcnRzIHRoYXQgYW5kIGNhbiBiZSB2aWV3ZWQgYXMgYW4gZXh0ZW5zaW9uIHRvIGBBQ1RJT04oKWAgYW5kCitgQUNUSU9OX1AqKClgLgorCitUaGUgc3ludGF4OgorYGBgCitBQ1RJT05fVEVNUExBVEUoQWN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICBIQVNfbV9URU1QTEFURV9QQVJBTVMoa2luZDEsIG5hbWUxLCAuLi4sIGtpbmRfbSwgbmFtZV9tKSwKKyAgICAgICAgICAgICAgICBBTkRfbl9WQUxVRV9QQVJBTVMocDEsIC4uLiwgcF9uKSkgeyBzdGF0ZW1lbnRzOyB9CitgYGAKKworZGVmaW5lcyBhbiBhY3Rpb24gdGVtcGxhdGUgdGhhdCB0YWtlcyBfbV8gZXhwbGljaXQgdGVtcGxhdGUgcGFyYW1ldGVycworYW5kIF9uXyB2YWx1ZSBwYXJhbWV0ZXJzLCB3aGVyZSBfbV8gaXMgYmV0d2VlbiAxIGFuZCAxMCwgYW5kIF9uXyBpcworYmV0d2VlbiAwIGFuZCAxMC4gIGBuYW1lX2lgIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoIHRlbXBsYXRlCitwYXJhbWV0ZXIsIGFuZCBga2luZF9pYCBzcGVjaWZpZXMgd2hldGhlciBpdCdzIGEgYHR5cGVuYW1lYCwgYW4KK2ludGVncmFsIGNvbnN0YW50LCBvciBhIHRlbXBsYXRlLiAgYHBfaWAgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGggdmFsdWUKK3BhcmFtZXRlci4KKworRXhhbXBsZToKK2BgYAorLy8gRHVwbGljYXRlQXJnPGssIFQ+KG91dHB1dCkgY29udmVydHMgdGhlIGstdGggYXJndW1lbnQgb2YgdGhlIG1vY2sKKy8vIGZ1bmN0aW9uIHRvIHR5cGUgVCBhbmQgY29waWVzIGl0IHRvICpvdXRwdXQuCitBQ1RJT05fVEVNUExBVEUoRHVwbGljYXRlQXJnLAorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhlIGNvbW1hIGJldHdlZW4gaW50IGFuZCBrOgorICAgICAgICAgICAgICAgIEhBU18yX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGssIHR5cGVuYW1lLCBUKSwKKyAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMob3V0cHV0KSkgeworICAqb3V0cHV0ID0gVChzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpKTsKK30KK2BgYAorCitUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRlbXBsYXRlLCB3cml0ZToKK2BgYAorICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbT4odjEsIC4uLiwgdl9uKQorYGBgCit3aGVyZSB0aGUgYHRgcyBhcmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgdGhlCitgdmBzIGFyZSB0aGUgdmFsdWUgYXJndW1lbnRzLiAgVGhlIHZhbHVlIGFyZ3VtZW50Cit0eXBlcyBhcmUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgRm9yIGV4YW1wbGU6CitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKy4uLgorICBpbnQgbjsKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKF8sIF8pKQorICAgICAgLldpbGxPbmNlKER1cGxpY2F0ZUFyZzwxLCB1bnNpZ25lZCBjaGFyPigmbikpOworYGBgCisKK0lmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdmFsdWUgYXJndW1lbnQgdHlwZXMsIHlvdSBjYW4KK3Byb3ZpZGUgYWRkaXRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudHM6CitgYGAKKyAgQWN0aW9uTmFtZTx0MSwgLi4uLCB0X20sIHUxLCAuLi4sIHVfaz4odjEsIC4uLiwgdl9uKQorYGBgCit3aGVyZSBgdV9pYCBpcyB0aGUgZGVzaXJlZCB0eXBlIG9mIGB2X2lgLgorCitgQUNUSU9OX1RFTVBMQVRFYCBhbmQgYEFDVElPTmAvYEFDVElPTl9QKmAgY2FuIGJlIG92ZXJsb2FkZWQgb24gdGhlCitudW1iZXIgb2YgdmFsdWUgcGFyYW1ldGVycywgYnV0IG5vdCBvbiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlCitwYXJhbWV0ZXJzLiAgV2l0aG91dCB0aGUgcmVzdHJpY3Rpb24sIHRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcgaXMKK3VuY2xlYXI6CisKK2BgYAorICBPdmVybG9hZGVkQWN0aW9uPGludCwgYm9vbD4oeCk7CitgYGAKKworQXJlIHdlIHVzaW5nIGEgc2luZ2xlLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24gd2hlcmUgYGJvb2xgIHJlZmVycyB0bwordGhlIHR5cGUgb2YgYHhgLCBvciBhIHR3by10ZW1wbGF0ZS1wYXJhbWV0ZXIgYWN0aW9uIHdoZXJlIHRoZSBjb21waWxlcgoraXMgYXNrZWQgdG8gaW5mZXIgdGhlIHR5cGUgb2YgYHhgPworCisjIyBVc2luZyB0aGUgQUNUSU9OIE9iamVjdCdzIFR5cGUgIyMKKworSWYgeW91IGFyZSB3cml0aW5nIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGBBQ1RJT05gIG9iamVjdCwgeW91J2xsCituZWVkIHRvIGtub3cgaXRzIHR5cGUuICBUaGUgdHlwZSBkZXBlbmRzIG9uIHRoZSBtYWNybyB1c2VkIHRvIGRlZmluZQordGhlIGFjdGlvbiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlcy4gIFRoZSBydWxlIGlzIHJlbGF0aXZlbHkgc2ltcGxlOgorfCAqKkdpdmVuIERlZmluaXRpb24qKiB8ICoqRXhwcmVzc2lvbioqIHwgKipIYXMgVHlwZSoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBQ1RJT04oRm9vKWAgICAgICAgIHwgYEZvbygpYCAgICAgICAgfCBgRm9vQWN0aW9uYCAgfAorfCBgQUNUSU9OX1RFTVBMQVRFKEZvbywgSEFTX21fVEVNUExBVEVfUEFSQU1TKC4uLiksIEFORF8wX1ZBTFVFX1BBUkFNUygpKWAgfAlgRm9vPHQxLCAuLi4sIHRfbT4oKWAgfCBgRm9vQWN0aW9uPHQxLCAuLi4sIHRfbT5gIHwKK3wgYEFDVElPTl9QKEJhciwgcGFyYW0pYCB8IGBCYXIoaW50X3ZhbHVlKWAgfCBgQmFyQWN0aW9uUDxpbnQ+YCB8Cit8IGBBQ1RJT05fVEVNUExBVEUoQmFyLCBIQVNfbV9URU1QTEFURV9QQVJBTVMoLi4uKSwgQU5EXzFfVkFMVUVfUEFSQU1TKHAxKSlgIHwgYEJhcjx0MSwgLi4uLCB0X20+KGludF92YWx1ZSlgIHwgYEZvb0FjdGlvblA8dDEsIC4uLiwgdF9tLCBpbnQ+YCB8Cit8IGBBQ1RJT05fUDIoQmF6LCBwMSwgcDIpYCB8IGBCYXooYm9vbF92YWx1ZSwgaW50X3ZhbHVlKWAgfCBgQmF6QWN0aW9uUDI8Ym9vbCwgaW50PmAgfAorfCBgQUNUSU9OX1RFTVBMQVRFKEJheiwgSEFTX21fVEVNUExBVEVfUEFSQU1TKC4uLiksIEFORF8yX1ZBTFVFX1BBUkFNUyhwMSwgcDIpKWAgfCBgQmF6PHQxLCAuLi4sIHRfbT4oYm9vbF92YWx1ZSwgaW50X3ZhbHVlKWAgfCBgRm9vQWN0aW9uUDI8dDEsIC4uLiwgdF9tLCBib29sLCBpbnQ+YCB8Cit8IC4uLiAgICAgICAgICAgICAgICAgIHwgLi4uICAgICAgICAgICAgfCAuLi4gICAgICAgICAgfAorCitOb3RlIHRoYXQgd2UgaGF2ZSB0byBwaWNrIGRpZmZlcmVudCBzdWZmaXhlcyAoYEFjdGlvbmAsIGBBY3Rpb25QYCwKK2BBY3Rpb25QMmAsIGFuZCBldGMpIGZvciBhY3Rpb25zIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgdmFsdWUKK3BhcmFtZXRlcnMsIG9yIHRoZSBhY3Rpb24gZGVmaW5pdGlvbnMgY2Fubm90IGJlIG92ZXJsb2FkZWQgb24gdGhlCitudW1iZXIgb2YgdGhlbS4KKworIyMgV3JpdGluZyBOZXcgTW9ub21vcnBoaWMgQWN0aW9ucyAjIworCitXaGlsZSB0aGUgYEFDVElPTipgIG1hY3JvcyBhcmUgdmVyeSBjb252ZW5pZW50LCBzb21ldGltZXMgdGhleSBhcmUKK2luYXBwcm9wcmlhdGUuICBGb3IgZXhhbXBsZSwgZGVzcGl0ZSB0aGUgdHJpY2tzIHNob3duIGluIHRoZSBwcmV2aW91cworcmVjaXBlcywgdGhleSBkb24ndCBsZXQgeW91IGRpcmVjdGx5IHNwZWNpZnkgdGhlIHR5cGVzIG9mIHRoZSBtb2NrCitmdW5jdGlvbiBhcmd1bWVudHMgYW5kIHRoZSBhY3Rpb24gcGFyYW1ldGVycywgd2hpY2ggaW4gZ2VuZXJhbCBsZWFkcwordG8gdW5vcHRpbWl6ZWQgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmFmZmxlIHVuZmFtaWxpYXIKK3VzZXJzLiAgVGhleSBhbHNvIGRvbid0IGFsbG93IG92ZXJsb2FkaW5nIGFjdGlvbnMgYmFzZWQgb24gcGFyYW1ldGVyCit0eXBlcyB3aXRob3V0IGp1bXBpbmcgdGhyb3VnaCBzb21lIGhvb3BzLgorCitBbiBhbHRlcm5hdGl2ZSB0byB0aGUgYEFDVElPTipgIG1hY3JvcyBpcyB0byBpbXBsZW1lbnQKK2A6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPmAsIHdoZXJlIGBGYCBpcyB0aGUgdHlwZSBvZiB0aGUgbW9jaworZnVuY3Rpb24gaW4gd2hpY2ggdGhlIGFjdGlvbiB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOgorCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBGPmNsYXNzIEFjdGlvbkludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5BY3Rpb25JbnRlcmZhY2UoKTsKKworICAvLyBQZXJmb3JtcyB0aGUgYWN0aW9uLiAgUmVzdWx0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbiB0eXBlCisgIC8vIEYsIGFuZCBBcmd1bWVudFR1cGxlIGlzIHRoZSB0dXBsZSBvZiBhcmd1bWVudHMgb2YgRi4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsIGlmIEYgaXMgaW50KGJvb2wsIGNvbnN0IHN0cmluZyYpLCB0aGVuIFJlc3VsdCB3b3VsZAorICAvLyBiZSBpbnQsIGFuZCBBcmd1bWVudFR1cGxlIHdvdWxkIGJlIHRyMTo6dHVwbGU8Ym9vbCwgY29uc3Qgc3RyaW5nJj4uCisgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgPSAwOworfTsKKwordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBY3Rpb247Cit1c2luZyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTsKK3VzaW5nIDo6dGVzdGluZzo6TWFrZUFjdGlvbjsKKwordHlwZWRlZiBpbnQgSW5jcmVtZW50TWV0aG9kKGludCopOworCitjbGFzcyBJbmNyZW1lbnRBcmd1bWVudEFjdGlvbiA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8SW5jcmVtZW50TWV0aG9kPiB7CisgcHVibGljOgorICB2aXJ0dWFsIGludCBQZXJmb3JtKGNvbnN0IHRyMTo6dHVwbGU8aW50Kj4mIGFyZ3MpIHsKKyAgICBpbnQqIHAgPSB0cjE6OmdldDwwPihhcmdzKTsgIC8vIEdyYWJzIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICByZXR1cm4gKnArKzsKKyAgfQorfTsKKworQWN0aW9uPEluY3JlbWVudE1ldGhvZD4gSW5jcmVtZW50QXJndW1lbnQoKSB7CisgIHJldHVybiBNYWtlQWN0aW9uKG5ldyBJbmNyZW1lbnRBcmd1bWVudEFjdGlvbik7Cit9CisuLi4KKworICBFWFBFQ1RfQ0FMTChmb28sIEJheihfKSkKKyAgICAgIC5XaWxsT25jZShJbmNyZW1lbnRBcmd1bWVudCgpKTsKKworICBpbnQgbiA9IDU7CisgIGZvby5CYXooJm4pOyAgLy8gU2hvdWxkIHJldHVybiA1IGFuZCBjaGFuZ2UgbiB0byA2LgorYGBgCisKKyMjIFdyaXRpbmcgTmV3IFBvbHltb3JwaGljIEFjdGlvbnMgIyMKKworVGhlIHByZXZpb3VzIHJlY2lwZSBzaG93ZWQgeW91IGhvdyB0byBkZWZpbmUgeW91ciBvd24gYWN0aW9uLiBUaGlzIGlzCithbGwgZ29vZCwgZXhjZXB0IHRoYXQgeW91IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gaW4KK3doaWNoIHRoZSBhY3Rpb24gd2lsbCBiZSB1c2VkLiBTb21ldGltZXMgdGhhdCBjYW4gYmUgYSBwcm9ibGVtLiBGb3IKK2V4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgYWN0aW9uIGluIGZ1bmN0aW9ucyB3aXRoIF9kaWZmZXJlbnRfCit0eXBlcyAoZS5nLiBsaWtlIGBSZXR1cm4oKWAgYW5kIGBTZXRBcmdQb2ludGVlKClgKS4KKworSWYgYW4gYWN0aW9uIGNhbiBiZSB1c2VkIGluIHNldmVyYWwgdHlwZXMgb2YgbW9jayBmdW5jdGlvbnMsIHdlIHNheQoraXQncyBfcG9seW1vcnBoaWNfLiBUaGUgYE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpYCBmdW5jdGlvbiB0ZW1wbGF0ZQorbWFrZXMgaXQgZWFzeSB0byBkZWZpbmUgc3VjaCBhbiBhY3Rpb246CisKK2BgYAorbmFtZXNwYWNlIHRlc3RpbmcgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1BvbHltb3JwaGljQWN0aW9uPEltcGw+IE1ha2VQb2x5bW9ycGhpY0FjdGlvbihjb25zdCBJbXBsJiBpbXBsKTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK2BgYAorCitBcyBhbiBleGFtcGxlLCBsZXQncyBkZWZpbmUgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB0aGUgc2Vjb25kIGFyZ3VtZW50CitpbiB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50IGxpc3QuIFRoZSBmaXJzdCBzdGVwIGlzIHRvIGRlZmluZSBhbgoraW1wbGVtZW50YXRpb24gY2xhc3M6CisKK2BgYAorY2xhc3MgUmV0dXJuU2Vjb25kQXJndW1lbnRBY3Rpb24geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KKyAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgeworICAgIC8vIFRvIGdldCB0aGUgaS10aCAoMC1iYXNlZCkgYXJndW1lbnQsIHVzZSB0cjE6OmdldDxpPihhcmdzKS4KKyAgICByZXR1cm4gdHIxOjpnZXQ8MT4oYXJncyk7CisgIH0KK307CitgYGAKKworVGhpcyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBkb2VzIF9ub3RfIG5lZWQgdG8gaW5oZXJpdCBmcm9tIGFueQorcGFydGljdWxhciBjbGFzcy4gV2hhdCBtYXR0ZXJzIGlzIHRoYXQgaXQgbXVzdCBoYXZlIGEgYFBlcmZvcm0oKWAKK21ldGhvZCB0ZW1wbGF0ZS4gVGhpcyBtZXRob2QgdGVtcGxhdGUgdGFrZXMgdGhlIG1vY2sgZnVuY3Rpb24ncworYXJndW1lbnRzIGFzIGEgdHVwbGUgaW4gYSAqKnNpbmdsZSoqIGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mCit0aGUgYWN0aW9uLiBJdCBjYW4gYmUgZWl0aGVyIGBjb25zdGAgb3Igbm90LCBidXQgbXVzdCBiZSBpbnZva2FibGUKK3dpdGggZXhhY3RseSBvbmUgdGVtcGxhdGUgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSByZXN1bHQgdHlwZS4gSW4gb3RoZXIKK3dvcmRzLCB5b3UgbXVzdCBiZSBhYmxlIHRvIGNhbGwgYFBlcmZvcm08Uj4oYXJncylgIHdoZXJlIGBSYCBpcyB0aGUKK21vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSBhbmQgYGFyZ3NgIGlzIGl0cyBhcmd1bWVudHMgaW4gYSB0dXBsZS4KKworTmV4dCwgd2UgdXNlIGBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKWAgdG8gdHVybiBhbiBpbnN0YW5jZSBvZiB0aGUKK2ltcGxlbWVudGF0aW9uIGNsYXNzIGludG8gdGhlIHBvbHltb3JwaGljIGFjdGlvbiB3ZSBuZWVkLiBJdCB3aWxsIGJlCitjb252ZW5pZW50IHRvIGhhdmUgYSB3cmFwcGVyIGZvciB0aGlzOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljQWN0aW9uOwordXNpbmcgOjp0ZXN0aW5nOjpQb2x5bW9ycGhpY0FjdGlvbjsKKworUG9seW1vcnBoaWNBY3Rpb248UmV0dXJuU2Vjb25kQXJndW1lbnRBY3Rpb24+IFJldHVyblNlY29uZEFyZ3VtZW50KCkgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKFJldHVyblNlY29uZEFyZ3VtZW50QWN0aW9uKCkpOworfQorYGBgCisKK05vdywgeW91IGNhbiB1c2UgdGhpcyBwb2x5bW9ycGhpYyBhY3Rpb24gdGhlIHNhbWUgd2F5IHlvdSB1c2UgdGhlCitidWlsdC1pbiBvbmVzOgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6XzsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QyKERvVGhpcywgaW50KGJvb2wgZmxhZywgaW50IG4pKTsKKyAgTU9DS19NRVRIT0QzKERvVGhhdCwgc3RyaW5nKGludCB4LCBjb25zdCBjaGFyKiBzdHIxLCBjb25zdCBjaGFyKiBzdHIyKSk7Cit9OworLi4uCisKKyAgTW9ja0ZvbyBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgRG9UaGlzKF8sIF8pKQorICAgICAgLldpbGxPbmNlKFJldHVyblNlY29uZEFyZ3VtZW50KCkpOworICBFWFBFQ1RfQ0FMTChmb28sIERvVGhhdChfLCBfLCBfKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm5TZWNvbmRBcmd1bWVudCgpKTsKKyAgLi4uCisgIGZvby5Eb1RoaXModHJ1ZSwgNSk7ICAgICAgICAgLy8gV2lsbCByZXR1cm4gNS4KKyAgZm9vLkRvVGhhdCgxLCAiSGkiLCAiQnllIik7ICAvLyBXaWxsIHJldHVybiAiSGkiLgorYGBgCisKKyMjIFRlYWNoaW5nIEdvb2dsZSBNb2NrIEhvdyB0byBQcmludCBZb3VyIFZhbHVlcyAjIworCitXaGVuIGFuIHVuaW50ZXJlc3Rpbmcgb3IgdW5leHBlY3RlZCBjYWxsIG9jY3VycywgR29vZ2xlIE1vY2sgcHJpbnRzIHRoZQorYXJndW1lbnQgdmFsdWVzIGFuZCB0aGUgc3RhY2sgdHJhY2UgdG8gaGVscCB5b3UgZGVidWcuICBBc3NlcnRpb24KK21hY3JvcyBsaWtlIGBFWFBFQ1RfVEhBVGAgYW5kIGBFWFBFQ1RfRVFgIGFsc28gcHJpbnQgdGhlIHZhbHVlcyBpbgorcXVlc3Rpb24gd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiAgR29vZ2xlIE1vY2sgYW5kIEdvb2dsZSBUZXN0IGRvIHRoaXMgdXNpbmcKK0dvb2dsZSBUZXN0J3MgdXNlci1leHRlbnNpYmxlIHZhbHVlIHByaW50ZXIuCisKK1RoaXMgcHJpbnRlciBrbm93cyBob3cgdG8gcHJpbnQgYnVpbHQtaW4gQysrIHR5cGVzLCBuYXRpdmUgYXJyYXlzLCBTVEwKK2NvbnRhaW5lcnMsIGFuZCBhbnkgdHlwZSB0aGF0IHN1cHBvcnRzIHRoZSBgPDxgIG9wZXJhdG9yLiAgRm9yIG90aGVyCit0eXBlcywgaXQgcHJpbnRzIHRoZSByYXcgYnl0ZXMgaW4gdGhlIHZhbHVlIGFuZCBob3BlcyB0aGF0IHlvdSB0aGUKK3VzZXIgY2FuIGZpZ3VyZSBpdCBvdXQuCitbR29vZ2xlIFRlc3QncyBhZHZhbmNlZCBndWlkZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9BZHZhbmNlZEd1aWRlI1RlYWNoaW5nX0dvb2dsZV9UZXN0X0hvd190b19QcmludF9Zb3VyX1ZhbHVlcykKK2V4cGxhaW5zIGhvdyB0byBleHRlbmQgdGhlIHByaW50ZXIgdG8gZG8gYSBiZXR0ZXIgam9iIGF0CitwcmludGluZyB5b3VyIHBhcnRpY3VsYXIgdHlwZSB0aGFuIHRvIGR1bXAgdGhlIGJ5dGVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzcvRG9jdW1lbnRhdGlvbi5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzcvRG9jdW1lbnRhdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTE4MWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNy9Eb2N1bWVudGF0aW9uLm1kCkBAIC0wLDAgKzEsMTIgQEAKK1RoaXMgcGFnZSBsaXN0cyBhbGwgZG9jdW1lbnRhdGlvbiB3aWtpIHBhZ2VzIGZvciBHb29nbGUgTW9jayAqKih0aGUgU1ZOIHRydW5rIHZlcnNpb24pKioKKy0gKippZiB5b3UgdXNlIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBHb29nbGUgTW9jaywgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgdmVyc2lvbiBpbnN0ZWFkLioqCisKKyAgKiBbRm9yRHVtbWllc10oVjFfN19Gb3JEdW1taWVzLm1kKSAtLSBzdGFydCBoZXJlIGlmIHlvdSBhcmUgbmV3IHRvIEdvb2dsZSBNb2NrLgorICAqIFtDaGVhdFNoZWV0XShWMV83X0NoZWF0U2hlZXQubWQpIC0tIGEgcXVpY2sgcmVmZXJlbmNlLgorICAqIFtDb29rQm9va10oVjFfN19Db29rQm9vay5tZCkgLS0gcmVjaXBlcyBmb3IgZG9pbmcgdmFyaW91cyB0YXNrcyB1c2luZyBHb29nbGUgTW9jay4KKyAgKiBbRnJlcXVlbnRseUFza2VkUXVlc3Rpb25zXShWMV83X0ZyZXF1ZW50bHlBc2tlZFF1ZXN0aW9ucy5tZCkgLS0gY2hlY2sgaGVyZSBiZWZvcmUgYXNraW5nIGEgcXVlc3Rpb24gb24gdGhlIG1haWxpbmcgbGlzdC4KKworVG8gY29udHJpYnV0ZSBjb2RlIHRvIEdvb2dsZSBNb2NrLCByZWFkOgorCisgICogW0Rldkd1aWRlXShEZXZHdWlkZS5tZCkgLS0gcmVhZCB0aGlzIF9iZWZvcmVfIHdyaXRpbmcgeW91ciBmaXJzdCBwYXRjaC4KKyAgKiBbUHVtcCBNYW51YWxdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvUHVtcE1hbnVhbCkgLS0gaG93IHdlIGdlbmVyYXRlIHNvbWUgb2YgR29vZ2xlIE1vY2sncyBzb3VyY2UgZmlsZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNy9Gb3JEdW1taWVzLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNy9Gb3JEdW1taWVzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDQzMDAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svZG9jcy92MV83L0ZvckR1bW1pZXMubWQKQEAgLTAsMCArMSw0MzkgQEAKKworCisoKipOb3RlOioqIElmIHlvdSBnZXQgY29tcGlsZXIgZXJyb3JzIHRoYXQgeW91IGRvbid0IHVuZGVyc3RhbmQsIGJlIHN1cmUgdG8gY29uc3VsdCBbR29vZ2xlIE1vY2sgRG9jdG9yXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL1YxXzdfRnJlcXVlbnRseUFza2VkUXVlc3Rpb25zI0hvd19hbV9JX3N1cHBvc2VkX3RvX21ha2Vfc2Vuc2Vfb2ZfdGhlc2VfaG9ycmlibGVfdGVtcGxhdGVfZXJyb3IpLikKKworIyBXaGF0IElzIEdvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcms/ICMKK1doZW4geW91IHdyaXRlIGEgcHJvdG90eXBlIG9yIHRlc3QsIG9mdGVuIGl0J3Mgbm90IGZlYXNpYmxlIG9yIHdpc2UgdG8gcmVseSBvbiByZWFsIG9iamVjdHMgZW50aXJlbHkuIEEgKiptb2NrIG9iamVjdCoqIGltcGxlbWVudHMgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIGEgcmVhbCBvYmplY3QgKHNvIGl0IGNhbiBiZSB1c2VkIGFzIG9uZSksIGJ1dCBsZXRzIHlvdSBzcGVjaWZ5IGF0IHJ1biB0aW1lIGhvdyBpdCB3aWxsIGJlIHVzZWQgYW5kIHdoYXQgaXQgc2hvdWxkIGRvICh3aGljaCBtZXRob2RzIHdpbGwgYmUgY2FsbGVkPyBpbiB3aGljaCBvcmRlcj8gaG93IG1hbnkgdGltZXM/IHdpdGggd2hhdCBhcmd1bWVudHM/IHdoYXQgd2lsbCB0aGV5IHJldHVybj8gZXRjKS4KKworKipOb3RlOioqIEl0IGlzIGVhc3kgdG8gY29uZnVzZSB0aGUgdGVybSBfZmFrZSBvYmplY3RzXyB3aXRoIG1vY2sgb2JqZWN0cy4gRmFrZXMgYW5kIG1vY2tzIGFjdHVhbGx5IG1lYW4gdmVyeSBkaWZmZXJlbnQgdGhpbmdzIGluIHRoZSBUZXN0LURyaXZlbiBEZXZlbG9wbWVudCAoVEREKSBjb21tdW5pdHk6CisKKyAgKiAqKkZha2UqKiBvYmplY3RzIGhhdmUgd29ya2luZyBpbXBsZW1lbnRhdGlvbnMsIGJ1dCB1c3VhbGx5IHRha2Ugc29tZSBzaG9ydGN1dCAocGVyaGFwcyB0byBtYWtlIHRoZSBvcGVyYXRpb25zIGxlc3MgZXhwZW5zaXZlKSwgd2hpY2ggbWFrZXMgdGhlbSBub3Qgc3VpdGFibGUgZm9yIHByb2R1Y3Rpb24uIEFuIGluLW1lbW9yeSBmaWxlIHN5c3RlbSB3b3VsZCBiZSBhbiBleGFtcGxlIG9mIGEgZmFrZS4KKyAgKiAqKk1vY2tzKiogYXJlIG9iamVjdHMgcHJlLXByb2dyYW1tZWQgd2l0aCBfZXhwZWN0YXRpb25zXywgd2hpY2ggZm9ybSBhIHNwZWNpZmljYXRpb24gb2YgdGhlIGNhbGxzIHRoZXkgYXJlIGV4cGVjdGVkIHRvIHJlY2VpdmUuCisKK0lmIGFsbCB0aGlzIHNlZW1zIHRvbyBhYnN0cmFjdCBmb3IgeW91LCBkb24ndCB3b3JyeSAtIHRoZSBtb3N0IGltcG9ydGFudCB0aGluZyB0byByZW1lbWJlciBpcyB0aGF0IGEgbW9jayBhbGxvd3MgeW91IHRvIGNoZWNrIHRoZSBfaW50ZXJhY3Rpb25fIGJldHdlZW4gaXRzZWxmIGFuZCBjb2RlIHRoYXQgdXNlcyBpdC4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBmYWtlcyBhbmQgbW9ja3Mgd2lsbCBiZWNvbWUgbXVjaCBjbGVhcmVyIG9uY2UgeW91IHN0YXJ0IHRvIHVzZSBtb2Nrcy4KKworKipHb29nbGUgQysrIE1vY2tpbmcgRnJhbWV3b3JrKiogKG9yICoqR29vZ2xlIE1vY2sqKiBmb3Igc2hvcnQpIGlzIGEgbGlicmFyeSAoc29tZXRpbWVzIHdlIGFsc28gY2FsbCBpdCBhICJmcmFtZXdvcmsiIHRvIG1ha2UgaXQgc291bmQgY29vbCkgZm9yIGNyZWF0aW5nIG1vY2sgY2xhc3NlcyBhbmQgdXNpbmcgdGhlbS4gSXQgZG9lcyB0byBDKysgd2hhdCBbak1vY2tdKGh0dHA6Ly93d3cuam1vY2sub3JnLykgYW5kIFtFYXN5TW9ja10oaHR0cDovL3d3dy5lYXN5bW9jay5vcmcvKSBkbyB0byBKYXZhLgorCitVc2luZyBHb29nbGUgTW9jayBpbnZvbHZlcyB0aHJlZSBiYXNpYyBzdGVwczoKKworICAxLiBVc2Ugc29tZSBzaW1wbGUgbWFjcm9zIHRvIGRlc2NyaWJlIHRoZSBpbnRlcmZhY2UgeW91IHdhbnQgdG8gbW9jaywgYW5kIHRoZXkgd2lsbCBleHBhbmQgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHlvdXIgbW9jayBjbGFzczsKKyAgMS4gQ3JlYXRlIHNvbWUgbW9jayBvYmplY3RzIGFuZCBzcGVjaWZ5IGl0cyBleHBlY3RhdGlvbnMgYW5kIGJlaGF2aW9yIHVzaW5nIGFuIGludHVpdGl2ZSBzeW50YXg7CisgIDEuIEV4ZXJjaXNlIGNvZGUgdGhhdCB1c2VzIHRoZSBtb2NrIG9iamVjdHMuIEdvb2dsZSBNb2NrIHdpbGwgY2F0Y2ggYW55IHZpb2xhdGlvbiBvZiB0aGUgZXhwZWN0YXRpb25zIGFzIHNvb24gYXMgaXQgYXJpc2VzLgorCisjIFdoeSBHb29nbGUgTW9jaz8gIworV2hpbGUgbW9jayBvYmplY3RzIGhlbHAgeW91IHJlbW92ZSB1bm5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMgaW4gdGVzdHMgYW5kIG1ha2UgdGhlbSBmYXN0IGFuZCByZWxpYWJsZSwgdXNpbmcgbW9ja3MgbWFudWFsbHkgaW4gQysrIGlzIF9oYXJkXzoKKworICAqIFNvbWVvbmUgaGFzIHRvIGltcGxlbWVudCB0aGUgbW9ja3MuIFRoZSBqb2IgaXMgdXN1YWxseSB0ZWRpb3VzIGFuZCBlcnJvci1wcm9uZS4gTm8gd29uZGVyIHBlb3BsZSBnbyBncmVhdCBkaXN0YW5jZSB0byBhdm9pZCBpdC4KKyAgKiBUaGUgcXVhbGl0eSBvZiB0aG9zZSBtYW51YWxseSB3cml0dGVuIG1vY2tzIGlzIGEgYml0LCB1aCwgdW5wcmVkaWN0YWJsZS4gWW91IG1heSBzZWUgc29tZSByZWFsbHkgcG9saXNoZWQgb25lcywgYnV0IHlvdSBtYXkgYWxzbyBzZWUgc29tZSB0aGF0IHdlcmUgaGFja2VkIHVwIGluIGEgaHVycnkgYW5kIGhhdmUgYWxsIHNvcnRzIG9mIGFkIGhvYyByZXN0cmljdGlvbnMuCisgICogVGhlIGtub3dsZWRnZSB5b3UgZ2FpbmVkIGZyb20gdXNpbmcgb25lIG1vY2sgZG9lc24ndCB0cmFuc2ZlciB0byB0aGUgbmV4dC4KKworSW4gY29udHJhc3QsIEphdmEgYW5kIFB5dGhvbiBwcm9ncmFtbWVycyBoYXZlIHNvbWUgZmluZSBtb2NrIGZyYW1ld29ya3MsIHdoaWNoIGF1dG9tYXRlIHRoZSBjcmVhdGlvbiBvZiBtb2Nrcy4gQXMgYSByZXN1bHQsIG1vY2tpbmcgaXMgYSBwcm92ZW4gZWZmZWN0aXZlIHRlY2huaXF1ZSBhbmQgd2lkZWx5IGFkb3B0ZWQgcHJhY3RpY2UgaW4gdGhvc2UgY29tbXVuaXRpZXMuIEhhdmluZyB0aGUgcmlnaHQgdG9vbCBhYnNvbHV0ZWx5IG1ha2VzIHRoZSBkaWZmZXJlbmNlLgorCitHb29nbGUgTW9jayB3YXMgYnVpbHQgdG8gaGVscCBDKysgcHJvZ3JhbW1lcnMuIEl0IHdhcyBpbnNwaXJlZCBieSBbak1vY2tdKGh0dHA6Ly93d3cuam1vY2sub3JnLykgYW5kIFtFYXN5TW9ja10oaHR0cDovL3d3dy5lYXN5bW9jay5vcmcvKSwgYnV0IGRlc2lnbmVkIHdpdGggQysrJ3Mgc3BlY2lmaWNzIGluIG1pbmQuIEl0IGlzIHlvdXIgZnJpZW5kIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIHByb2JsZW1zIGlzIGJvdGhlcmluZyB5b3U6CisKKyAgKiBZb3UgYXJlIHN0dWNrIHdpdGggYSBzdWItb3B0aW1hbCBkZXNpZ24gYW5kIHdpc2ggeW91IGhhZCBkb25lIG1vcmUgcHJvdG90eXBpbmcgYmVmb3JlIGl0IHdhcyB0b28gbGF0ZSwgYnV0IHByb3RvdHlwaW5nIGluIEMrKyBpcyBieSBubyBtZWFucyAicmFwaWQiLgorICAqIFlvdXIgdGVzdHMgYXJlIHNsb3cgYXMgdGhleSBkZXBlbmQgb24gdG9vIG1hbnkgbGlicmFyaWVzIG9yIHVzZSBleHBlbnNpdmUgcmVzb3VyY2VzIChlLmcuIGEgZGF0YWJhc2UpLgorICAqIFlvdXIgdGVzdHMgYXJlIGJyaXR0bGUgYXMgc29tZSByZXNvdXJjZXMgdGhleSB1c2UgYXJlIHVucmVsaWFibGUgKGUuZy4gdGhlIG5ldHdvcmspLgorICAqIFlvdSB3YW50IHRvIHRlc3QgaG93IHlvdXIgY29kZSBoYW5kbGVzIGEgZmFpbHVyZSAoZS5nLiBhIGZpbGUgY2hlY2tzdW0gZXJyb3IpLCBidXQgaXQncyBub3QgZWFzeSB0byBjYXVzZSBvbmUuCisgICogWW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91ciBtb2R1bGUgaW50ZXJhY3RzIHdpdGggb3RoZXIgbW9kdWxlcyBpbiB0aGUgcmlnaHQgd2F5LCBidXQgaXQncyBoYXJkIHRvIG9ic2VydmUgdGhlIGludGVyYWN0aW9uOyB0aGVyZWZvcmUgeW91IHJlc29ydCB0byBvYnNlcnZpbmcgdGhlIHNpZGUgZWZmZWN0cyBhdCB0aGUgZW5kIG9mIHRoZSBhY3Rpb24sIHdoaWNoIGlzIGF3a3dhcmQgYXQgYmVzdC4KKyAgKiBZb3Ugd2FudCB0byAibW9jayBvdXQiIHlvdXIgZGVwZW5kZW5jaWVzLCBleGNlcHQgdGhhdCB0aGV5IGRvbid0IGhhdmUgbW9jayBpbXBsZW1lbnRhdGlvbnMgeWV0OyBhbmQsIGZyYW5rbHksIHlvdSBhcmVuJ3QgdGhyaWxsZWQgYnkgc29tZSBvZiB0aG9zZSBoYW5kLXdyaXR0ZW4gbW9ja3MuCisKK1dlIGVuY291cmFnZSB5b3UgdG8gdXNlIEdvb2dsZSBNb2NrIGFzOgorCisgICogYSBfZGVzaWduXyB0b29sLCBmb3IgaXQgbGV0cyB5b3UgZXhwZXJpbWVudCB3aXRoIHlvdXIgaW50ZXJmYWNlIGRlc2lnbiBlYXJseSBhbmQgb2Z0ZW4uIE1vcmUgaXRlcmF0aW9ucyBsZWFkIHRvIGJldHRlciBkZXNpZ25zIQorICAqIGEgX3Rlc3RpbmdfIHRvb2wgdG8gY3V0IHlvdXIgdGVzdHMnIG91dGJvdW5kIGRlcGVuZGVuY2llcyBhbmQgcHJvYmUgdGhlIGludGVyYWN0aW9uIGJldHdlZW4geW91ciBtb2R1bGUgYW5kIGl0cyBjb2xsYWJvcmF0b3JzLgorCisjIEdldHRpbmcgU3RhcnRlZCAjCitVc2luZyBHb29nbGUgTW9jayBpcyBlYXN5ISBJbnNpZGUgeW91ciBDKysgc291cmNlIGZpbGUsIGp1c3QgI2luY2x1ZGUgYCJndGVzdC9ndGVzdC5oImAgYW5kIGAiZ21vY2svZ21vY2suaCJgLCBhbmQgeW91IGFyZSByZWFkeSB0byBnby4KKworIyBBIENhc2UgZm9yIE1vY2sgVHVydGxlcyAjCitMZXQncyBsb29rIGF0IGFuIGV4YW1wbGUuIFN1cHBvc2UgeW91IGFyZSBkZXZlbG9waW5nIGEgZ3JhcGhpY3MgcHJvZ3JhbSB0aGF0IHJlbGllcyBvbiBhIExPR08tbGlrZSBBUEkgZm9yIGRyYXdpbmcuIEhvdyB3b3VsZCB5b3UgdGVzdCB0aGF0IGl0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nPyBXZWxsLCB5b3UgY2FuIHJ1biBpdCBhbmQgY29tcGFyZSB0aGUgc2NyZWVuIHdpdGggYSBnb2xkZW4gc2NyZWVuIHNuYXBzaG90LCBidXQgbGV0J3MgYWRtaXQgaXQ6IHRlc3RzIGxpa2UgdGhpcyBhcmUgZXhwZW5zaXZlIHRvIHJ1biBhbmQgZnJhZ2lsZSAoV2hhdCBpZiB5b3UganVzdCB1cGdyYWRlZCB0byBhIHNoaW55IG5ldyBncmFwaGljcyBjYXJkIHRoYXQgaGFzIGJldHRlciBhbnRpLWFsaWFzaW5nPyBTdWRkZW5seSB5b3UgaGF2ZSB0byB1cGRhdGUgYWxsIHlvdXIgZ29sZGVuIGltYWdlcy4pLiBJdCB3b3VsZCBiZSB0b28gcGFpbmZ1bCBpZiBhbGwgeW91ciB0ZXN0cyBhcmUgbGlrZSB0aGlzLiBGb3J0dW5hdGVseSwgeW91IGxlYXJuZWQgYWJvdXQgRGVwZW5kZW5jeSBJbmplY3Rpb24gYW5kIGtub3cgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvOiBpbnN0ZWFkIG9mIGhhdmluZyB5b3VyIGFwcGxpY2F0aW9uIHRhbGsgdG8gdGhlIGRyYXdpbmcgQVBJIGRpcmVjdGx5LCB3cmFwIHRoZSBBUEkgaW4gYW4gaW50ZXJmYWNlIChzYXksIGBUdXJ0bGVgKSBhbmQgY29kZSB0byB0aGF0IGludGVyZmFjZToKKworYGBgCitjbGFzcyBUdXJ0bGUgeworICAuLi4KKyAgdmlydHVhbCB+VHVydGxlKCkge30KKyAgdmlydHVhbCB2b2lkIFBlblVwKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUGVuRG93bigpID0gMDsKKyAgdmlydHVhbCB2b2lkIEZvcndhcmQoaW50IGRpc3RhbmNlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBUdXJuKGludCBkZWdyZWVzKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBHb1RvKGludCB4LCBpbnQgeSkgPSAwOworICB2aXJ0dWFsIGludCBHZXRYKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBHZXRZKCkgY29uc3QgPSAwOworfTsKK2BgYAorCisoTm90ZSB0aGF0IHRoZSBkZXN0cnVjdG9yIG9mIGBUdXJ0bGVgICoqbXVzdCoqIGJlIHZpcnR1YWwsIGFzIGlzIHRoZSBjYXNlIGZvciAqKmFsbCoqIGNsYXNzZXMgeW91IGludGVuZCB0byBpbmhlcml0IGZyb20gLSBvdGhlcndpc2UgdGhlIGRlc3RydWN0b3Igb2YgdGhlIGRlcml2ZWQgY2xhc3Mgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4geW91IGRlbGV0ZSBhbiBvYmplY3QgdGhyb3VnaCBhIGJhc2UgcG9pbnRlciwgYW5kIHlvdSdsbCBnZXQgY29ycnVwdGVkIHByb2dyYW0gc3RhdGVzIGxpa2UgbWVtb3J5IGxlYWtzLikKKworWW91IGNhbiBjb250cm9sIHdoZXRoZXIgdGhlIHR1cnRsZSdzIG1vdmVtZW50IHdpbGwgbGVhdmUgYSB0cmFjZSB1c2luZyBgUGVuVXAoKWAgYW5kIGBQZW5Eb3duKClgLCBhbmQgY29udHJvbCBpdHMgbW92ZW1lbnQgdXNpbmcgYEZvcndhcmQoKWAsIGBUdXJuKClgLCBhbmQgYEdvVG8oKWAuIEZpbmFsbHksIGBHZXRYKClgIGFuZCBgR2V0WSgpYCB0ZWxsIHlvdSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdHVydGxlLgorCitZb3VyIHByb2dyYW0gd2lsbCBub3JtYWxseSB1c2UgYSByZWFsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLiBJbiB0ZXN0cywgeW91IGNhbiB1c2UgYSBtb2NrIGltcGxlbWVudGF0aW9uIGluc3RlYWQuIFRoaXMgYWxsb3dzIHlvdSB0byBlYXNpbHkgY2hlY2sgd2hhdCBkcmF3aW5nIHByaW1pdGl2ZXMgeW91ciBwcm9ncmFtIGlzIGNhbGxpbmcsIHdpdGggd2hhdCBhcmd1bWVudHMsIGFuZCBpbiB3aGljaCBvcmRlci4gVGVzdHMgd3JpdHRlbiB0aGlzIHdheSBhcmUgbXVjaCBtb3JlIHJvYnVzdCAodGhleSB3b24ndCBicmVhayBiZWNhdXNlIHlvdXIgbmV3IG1hY2hpbmUgZG9lcyBhbnRpLWFsaWFzaW5nIGRpZmZlcmVudGx5KSwgZWFzaWVyIHRvIHJlYWQgYW5kIG1haW50YWluICh0aGUgaW50ZW50IG9mIGEgdGVzdCBpcyBleHByZXNzZWQgaW4gdGhlIGNvZGUsIG5vdCBpbiBzb21lIGJpbmFyeSBpbWFnZXMpLCBhbmQgcnVuIF9tdWNoLCBtdWNoIGZhc3Rlcl8uCisKKyMgV3JpdGluZyB0aGUgTW9jayBDbGFzcyAjCitJZiB5b3UgYXJlIGx1Y2t5LCB0aGUgbW9ja3MgeW91IG5lZWQgdG8gdXNlIGhhdmUgYWxyZWFkeSBiZWVuIGltcGxlbWVudGVkIGJ5IHNvbWUgbmljZSBwZW9wbGUuIElmLCBob3dldmVyLCB5b3UgZmluZCB5b3Vyc2VsZiBpbiB0aGUgcG9zaXRpb24gdG8gd3JpdGUgYSBtb2NrIGNsYXNzLCByZWxheCAtIEdvb2dsZSBNb2NrIHR1cm5zIHRoaXMgdGFzayBpbnRvIGEgZnVuIGdhbWUhIChXZWxsLCBhbG1vc3QuKQorCisjIyBIb3cgdG8gRGVmaW5lIEl0ICMjCitVc2luZyB0aGUgYFR1cnRsZWAgaW50ZXJmYWNlIGFzIGV4YW1wbGUsIGhlcmUgYXJlIHRoZSBzaW1wbGUgc3RlcHMgeW91IG5lZWQgdG8gZm9sbG93OgorCisgIDEuIERlcml2ZSBhIGNsYXNzIGBNb2NrVHVydGxlYCBmcm9tIGBUdXJ0bGVgLgorICAxLiBUYWtlIGEgX3ZpcnR1YWxfIGZ1bmN0aW9uIG9mIGBUdXJ0bGVgICh3aGlsZSBpdCdzIHBvc3NpYmxlIHRvIFttb2NrIG5vbi12aXJ0dWFsIG1ldGhvZHMgdXNpbmcgdGVtcGxhdGVzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL1YxXzdfQ29va0Jvb2sjTW9ja2luZ19Ob252aXJ0dWFsX01ldGhvZHMpLCBpdCdzIG11Y2ggbW9yZSBpbnZvbHZlZCkuIENvdW50IGhvdyBtYW55IGFyZ3VtZW50cyBpdCBoYXMuCisgIDEuIEluIHRoZSBgcHVibGljOmAgc2VjdGlvbiBvZiB0aGUgY2hpbGQgY2xhc3MsIHdyaXRlIGBNT0NLX01FVEhPRG4oKTtgIChvciBgTU9DS19DT05TVF9NRVRIT0RuKCk7YCBpZiB5b3UgYXJlIG1vY2tpbmcgYSBgY29uc3RgIG1ldGhvZCksIHdoZXJlIGBuYCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBhcmd1bWVudHM7IGlmIHlvdSBjb3VudGVkIHdyb25nLCBzaGFtZSBvbiB5b3UsIGFuZCBhIGNvbXBpbGVyIGVycm9yIHdpbGwgdGVsbCB5b3Ugc28uCisgIDEuIE5vdyBjb21lcyB0aGUgZnVuIHBhcnQ6IHlvdSB0YWtlIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUsIGN1dC1hbmQtcGFzdGUgdGhlIF9mdW5jdGlvbiBuYW1lXyBhcyB0aGUgX2ZpcnN0XyBhcmd1bWVudCB0byB0aGUgbWFjcm8sIGFuZCBsZWF2ZSB3aGF0J3MgbGVmdCBhcyB0aGUgX3NlY29uZF8gYXJndW1lbnQgKGluIGNhc2UgeW91J3JlIGN1cmlvdXMsIHRoaXMgaXMgdGhlIF90eXBlIG9mIHRoZSBmdW5jdGlvbl8pLgorICAxLiBSZXBlYXQgdW50aWwgYWxsIHZpcnR1YWwgZnVuY3Rpb25zIHlvdSB3YW50IHRvIG1vY2sgYXJlIGRvbmUuCisKK0FmdGVyIHRoZSBwcm9jZXNzLCB5b3Ugc2hvdWxkIGhhdmUgc29tZXRoaW5nIGxpa2U6CisKK2BgYAorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiICAvLyBCcmluZ3MgaW4gR29vZ2xlIE1vY2suCitjbGFzcyBNb2NrVHVydGxlIDogcHVibGljIFR1cnRsZSB7CisgcHVibGljOgorICAuLi4KKyAgTU9DS19NRVRIT0QwKFBlblVwLCB2b2lkKCkpOworICBNT0NLX01FVEhPRDAoUGVuRG93biwgdm9pZCgpKTsKKyAgTU9DS19NRVRIT0QxKEZvcndhcmQsIHZvaWQoaW50IGRpc3RhbmNlKSk7CisgIE1PQ0tfTUVUSE9EMShUdXJuLCB2b2lkKGludCBkZWdyZWVzKSk7CisgIE1PQ0tfTUVUSE9EMihHb1RvLCB2b2lkKGludCB4LCBpbnQgeSkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0WCwgaW50KCkpOworICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0WSwgaW50KCkpOworfTsKK2BgYAorCitZb3UgZG9uJ3QgbmVlZCB0byBkZWZpbmUgdGhlc2UgbW9jayBtZXRob2RzIHNvbWV3aGVyZSBlbHNlIC0gdGhlIGBNT0NLX01FVEhPRCpgIG1hY3JvcyB3aWxsIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBmb3IgeW91LiBJdCdzIHRoYXQgc2ltcGxlISBPbmNlIHlvdSBnZXQgdGhlIGhhbmcgb2YgaXQsIHlvdSBjYW4gcHVtcCBvdXQgbW9jayBjbGFzc2VzIGZhc3RlciB0aGFuIHlvdXIgc291cmNlLWNvbnRyb2wgc3lzdGVtIGNhbiBoYW5kbGUgeW91ciBjaGVjay1pbnMuCisKKyoqVGlwOioqIElmIGV2ZW4gdGhpcyBpcyB0b28gbXVjaCB3b3JrIGZvciB5b3UsIHlvdSdsbCBmaW5kIHRoZQorYGdtb2NrX2dlbi5weWAgdG9vbCBpbiBHb29nbGUgTW9jaydzIGBzY3JpcHRzL2dlbmVyYXRvci9gIGRpcmVjdG9yeSAoY291cnRlc3kgb2YgdGhlIFtjcHBjbGVhbl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NwcGNsZWFuLykgcHJvamVjdCkgdXNlZnVsLiAgVGhpcyBjb21tYW5kLWxpbmUKK3Rvb2wgcmVxdWlyZXMgdGhhdCB5b3UgaGF2ZSBQeXRob24gMi40IGluc3RhbGxlZC4gIFlvdSBnaXZlIGl0IGEgQysrIGZpbGUgYW5kIHRoZSBuYW1lIG9mIGFuIGFic3RyYWN0IGNsYXNzIGRlZmluZWQgaW4gaXQsCithbmQgaXQgd2lsbCBwcmludCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbW9jayBjbGFzcyBmb3IgeW91LiAgRHVlIHRvIHRoZQorY29tcGxleGl0eSBvZiB0aGUgQysrIGxhbmd1YWdlLCB0aGlzIHNjcmlwdCBtYXkgbm90IGFsd2F5cyB3b3JrLCBidXQKK2l0IGNhbiBiZSBxdWl0ZSBoYW5keSB3aGVuIGl0IGRvZXMuICBGb3IgbW9yZSBkZXRhaWxzLCByZWFkIHRoZSBbdXNlciBkb2N1bWVudGF0aW9uXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvZ2VuZXJhdG9yL1JFQURNRSkuCisKKyMjIFdoZXJlIHRvIFB1dCBJdCAjIworV2hlbiB5b3UgZGVmaW5lIGEgbW9jayBjbGFzcywgeW91IG5lZWQgdG8gZGVjaWRlIHdoZXJlIHRvIHB1dCBpdHMgZGVmaW5pdGlvbi4gU29tZSBwZW9wbGUgcHV0IGl0IGluIGEgYCpfdGVzdC5jY2AuIFRoaXMgaXMgZmluZSB3aGVuIHRoZSBpbnRlcmZhY2UgYmVpbmcgbW9ja2VkIChzYXksIGBGb29gKSBpcyBvd25lZCBieSB0aGUgc2FtZSBwZXJzb24gb3IgdGVhbS4gT3RoZXJ3aXNlLCB3aGVuIHRoZSBvd25lciBvZiBgRm9vYCBjaGFuZ2VzIGl0LCB5b3VyIHRlc3QgY291bGQgYnJlYWsuIChZb3UgY2FuJ3QgcmVhbGx5IGV4cGVjdCBgRm9vYCdzIG1haW50YWluZXIgdG8gZml4IGV2ZXJ5IHRlc3QgdGhhdCB1c2VzIGBGb29gLCBjYW4geW91PykKKworU28sIHRoZSBydWxlIG9mIHRodW1iIGlzOiBpZiB5b3UgbmVlZCB0byBtb2NrIGBGb29gIGFuZCBpdCdzIG93bmVkIGJ5IG90aGVycywgZGVmaW5lIHRoZSBtb2NrIGNsYXNzIGluIGBGb29gJ3MgcGFja2FnZSAoYmV0dGVyLCBpbiBhIGB0ZXN0aW5nYCBzdWItcGFja2FnZSBzdWNoIHRoYXQgeW91IGNhbiBjbGVhcmx5IHNlcGFyYXRlIHByb2R1Y3Rpb24gY29kZSBhbmQgdGVzdGluZyB1dGlsaXRpZXMpLCBhbmQgcHV0IGl0IGluIGEgYG1vY2tfZm9vLmhgLiBUaGVuIGV2ZXJ5b25lIGNhbiByZWZlcmVuY2UgYG1vY2tfZm9vLmhgIGZyb20gdGhlaXIgdGVzdHMuIElmIGBGb29gIGV2ZXIgY2hhbmdlcywgdGhlcmUgaXMgb25seSBvbmUgY29weSBvZiBgTW9ja0Zvb2AgdG8gY2hhbmdlLCBhbmQgb25seSB0ZXN0cyB0aGF0IGRlcGVuZCBvbiB0aGUgY2hhbmdlZCBtZXRob2RzIG5lZWQgdG8gYmUgZml4ZWQuCisKK0Fub3RoZXIgd2F5IHRvIGRvIGl0OiB5b3UgY2FuIGludHJvZHVjZSBhIHRoaW4gbGF5ZXIgYEZvb0FkYXB0b3JgIG9uIHRvcCBvZiBgRm9vYCBhbmQgY29kZSB0byB0aGlzIG5ldyBpbnRlcmZhY2UuIFNpbmNlIHlvdSBvd24gYEZvb0FkYXB0b3JgLCB5b3UgY2FuIGFic29yYiBjaGFuZ2VzIGluIGBGb29gIG11Y2ggbW9yZSBlYXNpbHkuIFdoaWxlIHRoaXMgaXMgbW9yZSB3b3JrIGluaXRpYWxseSwgY2FyZWZ1bGx5IGNob29zaW5nIHRoZSBhZGFwdG9yIGludGVyZmFjZSBjYW4gbWFrZSB5b3VyIGNvZGUgZWFzaWVyIHRvIHdyaXRlIGFuZCBtb3JlIHJlYWRhYmxlIChhIG5ldCB3aW4gaW4gdGhlIGxvbmcgcnVuKSwgYXMgeW91IGNhbiBjaG9vc2UgYEZvb0FkYXB0b3JgIHRvIGZpdCB5b3VyIHNwZWNpZmljIGRvbWFpbiBtdWNoIGJldHRlciB0aGFuIGBGb29gIGRvZXMuCisKKyMgVXNpbmcgTW9ja3MgaW4gVGVzdHMgIworT25jZSB5b3UgaGF2ZSBhIG1vY2sgY2xhc3MsIHVzaW5nIGl0IGlzIGVhc3kuIFRoZSB0eXBpY2FsIHdvcmsgZmxvdyBpczoKKworICAxLiBJbXBvcnQgdGhlIEdvb2dsZSBNb2NrIG5hbWVzIGZyb20gdGhlIGB0ZXN0aW5nYCBuYW1lc3BhY2Ugc3VjaCB0aGF0IHlvdSBjYW4gdXNlIHRoZW0gdW5xdWFsaWZpZWQgKFlvdSBvbmx5IGhhdmUgdG8gZG8gaXQgb25jZSBwZXIgZmlsZS4gUmVtZW1iZXIgdGhhdCBuYW1lc3BhY2VzIGFyZSBhIGdvb2QgaWRlYSBhbmQgZ29vZCBmb3IgeW91ciBoZWFsdGguKS4KKyAgMS4gQ3JlYXRlIHNvbWUgbW9jayBvYmplY3RzLgorICAxLiBTcGVjaWZ5IHlvdXIgZXhwZWN0YXRpb25zIG9uIHRoZW0gKEhvdyBtYW55IHRpbWVzIHdpbGwgYSBtZXRob2QgYmUgY2FsbGVkPyBXaXRoIHdoYXQgYXJndW1lbnRzPyBXaGF0IHNob3VsZCBpdCBkbz8gZXRjLikuCisgIDEuIEV4ZXJjaXNlIHNvbWUgY29kZSB0aGF0IHVzZXMgdGhlIG1vY2tzOyBvcHRpb25hbGx5LCBjaGVjayB0aGUgcmVzdWx0IHVzaW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMuIElmIGEgbW9jayBtZXRob2QgaXMgY2FsbGVkIG1vcmUgdGhhbiBleHBlY3RlZCBvciB3aXRoIHdyb25nIGFyZ3VtZW50cywgeW91J2xsIGdldCBhbiBlcnJvciBpbW1lZGlhdGVseS4KKyAgMS4gV2hlbiBhIG1vY2sgaXMgZGVzdHJ1Y3RlZCwgR29vZ2xlIE1vY2sgd2lsbCBhdXRvbWF0aWNhbGx5IGNoZWNrIHdoZXRoZXIgYWxsIGV4cGVjdGF0aW9ucyBvbiBpdCBoYXZlIGJlZW4gc2F0aXNmaWVkLgorCitIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCisjaW5jbHVkZSAicGF0aC90by9tb2NrLXR1cnRsZS5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKK3VzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsgICAgICAgICAgICAgICAgICAgICAvLyAjMQorCitURVNUKFBhaW50ZXJUZXN0LCBDYW5EcmF3U29tZXRoaW5nKSB7CisgIE1vY2tUdXJ0bGUgdHVydGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIzIKKyAgRVhQRUNUX0NBTEwodHVydGxlLCBQZW5Eb3duKCkpICAgICAgICAgICAgICAvLyAjMworICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpOworCisgIFBhaW50ZXIgcGFpbnRlcigmdHVydGxlKTsgICAgICAgICAgICAgICAgICAgLy8gIzQKKworICBFWFBFQ1RfVFJVRShwYWludGVyLkRyYXdDaXJjbGUoMCwgMCwgMTApKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjNQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIG11c3QgYmUgZXhlY3V0ZWQgdG8gaW5pdGlhbGl6ZSBHb29nbGUgTW9jaworICAvLyAoYW5kIEdvb2dsZSBUZXN0KSBiZWZvcmUgcnVubmluZyB0aGUgdGVzdHMuCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZU1vY2soJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorYGBgCisKK0FzIHlvdSBtaWdodCBoYXZlIGd1ZXNzZWQsIHRoaXMgdGVzdCBjaGVja3MgdGhhdCBgUGVuRG93bigpYCBpcyBjYWxsZWQgYXQgbGVhc3Qgb25jZS4gSWYgdGhlIGBwYWludGVyYCBvYmplY3QgZGlkbid0IGNhbGwgdGhpcyBtZXRob2QsIHlvdXIgdGVzdCB3aWxsIGZhaWwgd2l0aCBhIG1lc3NhZ2UgbGlrZSB0aGlzOgorCitgYGAKK3BhdGgvdG8vbXlfdGVzdC5jYzoxMTk6IEZhaWx1cmUKK0FjdHVhbCBmdW5jdGlvbiBjYWxsIGNvdW50IGRvZXNuJ3QgbWF0Y2ggdGhpcyBleHBlY3RhdGlvbjoKK0FjdHVhbGx5OiBuZXZlciBjYWxsZWQ7CitFeHBlY3RlZDogY2FsbGVkIGF0IGxlYXN0IG9uY2UuCitgYGAKKworKipUaXAgMToqKiBJZiB5b3UgcnVuIHRoZSB0ZXN0IGZyb20gYW4gRW1hY3MgYnVmZmVyLCB5b3UgY2FuIGhpdCBgPEVudGVyPmAgb24gdGhlIGxpbmUgbnVtYmVyIGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZSB0byBqdW1wIHJpZ2h0IHRvIHRoZSBmYWlsZWQgZXhwZWN0YXRpb24uCisKKyoqVGlwIDI6KiogSWYgeW91ciBtb2NrIG9iamVjdHMgYXJlIG5ldmVyIGRlbGV0ZWQsIHRoZSBmaW5hbCB2ZXJpZmljYXRpb24gd29uJ3QgaGFwcGVuLiBUaGVyZWZvcmUgaXQncyBhIGdvb2QgaWRlYSB0byB1c2UgYSBoZWFwIGxlYWsgY2hlY2tlciBpbiB5b3VyIHRlc3RzIHdoZW4geW91IGFsbG9jYXRlIG1vY2tzIG9uIHRoZSBoZWFwLgorCisqKkltcG9ydGFudCBub3RlOioqIEdvb2dsZSBNb2NrIHJlcXVpcmVzIGV4cGVjdGF0aW9ucyB0byBiZSBzZXQgKipiZWZvcmUqKiB0aGUgbW9jayBmdW5jdGlvbnMgYXJlIGNhbGxlZCwgb3RoZXJ3aXNlIHRoZSBiZWhhdmlvciBpcyAqKnVuZGVmaW5lZCoqLiBJbiBwYXJ0aWN1bGFyLCB5b3UgbXVzdG4ndCBpbnRlcmxlYXZlIGBFWFBFQ1RfQ0FMTCgpYHMgYW5kIGNhbGxzIHRvIHRoZSBtb2NrIGZ1bmN0aW9ucy4KKworVGhpcyBtZWFucyBgRVhQRUNUX0NBTEwoKWAgc2hvdWxkIGJlIHJlYWQgYXMgZXhwZWN0aW5nIHRoYXQgYSBjYWxsIHdpbGwgb2NjdXIgX2luIHRoZSBmdXR1cmVfLCBub3QgdGhhdCBhIGNhbGwgaGFzIG9jY3VycmVkLiBXaHkgZG9lcyBHb29nbGUgTW9jayB3b3JrIGxpa2UgdGhhdD8gV2VsbCwgc3BlY2lmeWluZyB0aGUgZXhwZWN0YXRpb24gYmVmb3JlaGFuZCBhbGxvd3MgR29vZ2xlIE1vY2sgdG8gcmVwb3J0IGEgdmlvbGF0aW9uIGFzIHNvb24gYXMgaXQgYXJpc2VzLCB3aGVuIHRoZSBjb250ZXh0IChzdGFjayB0cmFjZSwgZXRjKSBpcyBzdGlsbCBhdmFpbGFibGUuIFRoaXMgbWFrZXMgZGVidWdnaW5nIG11Y2ggZWFzaWVyLgorCitBZG1pdHRlZGx5LCB0aGlzIHRlc3QgaXMgY29udHJpdmVkIGFuZCBkb2Vzbid0IGRvIG11Y2guIFlvdSBjYW4gZWFzaWx5IGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IHdpdGhvdXQgdXNpbmcgR29vZ2xlIE1vY2suIEhvd2V2ZXIsIGFzIHdlIHNoYWxsIHJldmVhbCBzb29uLCBHb29nbGUgTW9jayBhbGxvd3MgeW91IHRvIGRvIF9tdWNoIG1vcmVfIHdpdGggdGhlIG1vY2tzLgorCisjIyBVc2luZyBHb29nbGUgTW9jayB3aXRoIEFueSBUZXN0aW5nIEZyYW1ld29yayAjIworSWYgeW91IHdhbnQgdG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIEdvb2dsZSBUZXN0IChlLmcuIFtDcHBVbml0XShodHRwOi8vYXBwcy5zb3VyY2Vmb3JnZS5uZXQvbWVkaWF3aWtpL2NwcHVuaXQvaW5kZXgucGhwP3RpdGxlPU1haW5fUGFnZSkgb3IKK1tDeHhUZXN0XShodHRwOi8vY3h4dGVzdC50aWdyaXMub3JnLykpIGFzIHlvdXIgdGVzdGluZyBmcmFtZXdvcmssIGp1c3QgY2hhbmdlIHRoZSBgbWFpbigpYCBmdW5jdGlvbiBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiB0bzoKK2BgYAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBjYXVzZXMgR29vZ2xlIE1vY2sgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUsCisgIC8vIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgeW91ciB0ZXN0aW5nIGZyYW1ld29yayBhcyBhIHRlc3QgZmFpbHVyZS4KKyAgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdHJ1ZTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7CisgIC4uLiB3aGF0ZXZlciB5b3VyIHRlc3RpbmcgZnJhbWV3b3JrIHJlcXVpcmVzIC4uLgorfQorYGBgCisKK1RoaXMgYXBwcm9hY2ggaGFzIGEgY2F0Y2g6IGl0IG1ha2VzIEdvb2dsZSBNb2NrIHRocm93IGFuIGV4Y2VwdGlvbgorZnJvbSBhIG1vY2sgb2JqZWN0J3MgZGVzdHJ1Y3RvciBzb21ldGltZXMuICBXaXRoIHNvbWUgY29tcGlsZXJzLCB0aGlzCitzb21ldGltZXMgY2F1c2VzIHRoZSB0ZXN0IHByb2dyYW0gdG8gY3Jhc2guICBZb3UnbGwgc3RpbGwgYmUgYWJsZSB0bworbm90aWNlIHRoYXQgdGhlIHRlc3QgaGFzIGZhaWxlZCwgYnV0IGl0J3Mgbm90IGEgZ3JhY2VmdWwgZmFpbHVyZS4KKworQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gdXNlIEdvb2dsZSBUZXN0J3MKK1tldmVudCBsaXN0ZW5lciBBUEldKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvQWR2YW5jZWRHdWlkZSNFeHRlbmRpbmdfR29vZ2xlX1Rlc3RfYnlfSGFuZGxpbmdfVGVzdF9FdmVudHMpCit0byByZXBvcnQgYSB0ZXN0IGZhaWx1cmUgdG8geW91ciB0ZXN0aW5nIGZyYW1ld29yayBwcm9wZXJseS4gIFlvdSdsbCBuZWVkIHRvCitpbXBsZW1lbnQgdGhlIGBPblRlc3RQYXJ0UmVzdWx0KClgIG1ldGhvZCBvZiB0aGUgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlLCBidXQgaXQKK3Nob3VsZCBiZSBzdHJhaWdodGZvcndhcmQuCisKK0lmIHRoaXMgdHVybnMgb3V0IHRvIGJlIHRvbyBtdWNoIHdvcmssIHdlIHN1Z2dlc3QgdGhhdCB5b3Ugc3RpY2sgd2l0aAorR29vZ2xlIFRlc3QsIHdoaWNoIHdvcmtzIHdpdGggR29vZ2xlIE1vY2sgc2VhbWxlc3NseSAoaW4gZmFjdCwgaXQgaXMKK3RlY2huaWNhbGx5IHBhcnQgb2YgR29vZ2xlIE1vY2suKS4gIElmIHRoZXJlIGlzIGEgcmVhc29uIHRoYXQgeW91CitjYW5ub3QgdXNlIEdvb2dsZSBUZXN0LCBwbGVhc2UgbGV0IHVzIGtub3cuCisKKyMgU2V0dGluZyBFeHBlY3RhdGlvbnMgIworVGhlIGtleSB0byB1c2luZyBhIG1vY2sgb2JqZWN0IHN1Y2Nlc3NmdWxseSBpcyB0byBzZXQgdGhlIF9yaWdodCBleHBlY3RhdGlvbnNfIG9uIGl0LiBJZiB5b3Ugc2V0IHRoZSBleHBlY3RhdGlvbnMgdG9vIHN0cmljdCwgeW91ciB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgcmVzdWx0IG9mIHVucmVsYXRlZCBjaGFuZ2VzLiBJZiB5b3Ugc2V0IHRoZW0gdG9vIGxvb3NlLCBidWdzIGNhbiBzbGlwIHRocm91Z2guIFlvdSB3YW50IHRvIGRvIGl0IGp1c3QgcmlnaHQgc3VjaCB0aGF0IHlvdXIgdGVzdCBjYW4gY2F0Y2ggZXhhY3RseSB0aGUga2luZCBvZiBidWdzIHlvdSBpbnRlbmQgaXQgdG8gY2F0Y2guIEdvb2dsZSBNb2NrIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgbWVhbnMgZm9yIHlvdSB0byBkbyBpdCAianVzdCByaWdodC4iCisKKyMjIEdlbmVyYWwgU3ludGF4ICMjCitJbiBHb29nbGUgTW9jayB3ZSB1c2UgdGhlIGBFWFBFQ1RfQ0FMTCgpYCBtYWNybyB0byBzZXQgYW4gZXhwZWN0YXRpb24gb24gYSBtb2NrIG1ldGhvZC4gVGhlIGdlbmVyYWwgc3ludGF4IGlzOgorCitgYGAKK0VYUEVDVF9DQUxMKG1vY2tfb2JqZWN0LCBtZXRob2QobWF0Y2hlcnMpKQorICAgIC5UaW1lcyhjYXJkaW5hbGl0eSkKKyAgICAuV2lsbE9uY2UoYWN0aW9uKQorICAgIC5XaWxsUmVwZWF0ZWRseShhY3Rpb24pOworYGBgCisKK1RoZSBtYWNybyBoYXMgdHdvIGFyZ3VtZW50czogZmlyc3QgdGhlIG1vY2sgb2JqZWN0LCBhbmQgdGhlbiB0aGUgbWV0aG9kIGFuZCBpdHMgYXJndW1lbnRzLiBOb3RlIHRoYXQgdGhlIHR3byBhcmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEgKGAsYCksIG5vdCBhIHBlcmlvZCAoYC5gKS4gKFdoeSB1c2luZyBhIGNvbW1hPyBUaGUgYW5zd2VyIGlzIHRoYXQgaXQgd2FzIG5lY2Vzc2FyeSBmb3IgdGVjaG5pY2FsIHJlYXNvbnMuKQorCitUaGUgbWFjcm8gY2FuIGJlIGZvbGxvd2VkIGJ5IHNvbWUgb3B0aW9uYWwgX2NsYXVzZXNfIHRoYXQgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHBlY3RhdGlvbi4gV2UnbGwgZGlzY3VzcyBob3cgZWFjaCBjbGF1c2Ugd29ya3MgaW4gdGhlIGNvbWluZyBzZWN0aW9ucy4KKworVGhpcyBzeW50YXggaXMgZGVzaWduZWQgdG8gbWFrZSBhbiBleHBlY3RhdGlvbiByZWFkIGxpa2UgRW5nbGlzaC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gcHJvYmFibHkgZ3Vlc3MgdGhhdAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgLlRpbWVzKDUpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMTUwKSkKKyAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDIwMCkpOworYGBgCisKK3NheXMgdGhhdCB0aGUgYHR1cnRsZWAgb2JqZWN0J3MgYEdldFgoKWAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZpdmUgdGltZXMsIGl0IHdpbGwgcmV0dXJuIDEwMCB0aGUgZmlyc3QgdGltZSwgMTUwIHRoZSBzZWNvbmQgdGltZSwgYW5kIHRoZW4gMjAwIGV2ZXJ5IHRpbWUuIFNvbWUgcGVvcGxlIGxpa2UgdG8gY2FsbCB0aGlzIHN0eWxlIG9mIHN5bnRheCBhIERvbWFpbi1TcGVjaWZpYyBMYW5ndWFnZSAoRFNMKS4KKworKipOb3RlOioqIFdoeSBkbyB3ZSB1c2UgYSBtYWNybyB0byBkbyB0aGlzPyBJdCBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiBmaXJzdCBpdCBtYWtlcyBleHBlY3RhdGlvbnMgZWFzaWx5IGlkZW50aWZpYWJsZSAoZWl0aGVyIGJ5IGBncmVwYCBvciBieSBhIGh1bWFuIHJlYWRlciksIGFuZCBzZWNvbmQgaXQgYWxsb3dzIEdvb2dsZSBNb2NrIHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uIG9mIGEgZmFpbGVkIGV4cGVjdGF0aW9uIGluIG1lc3NhZ2VzLCBtYWtpbmcgZGVidWdnaW5nIGVhc2llci4KKworIyMgTWF0Y2hlcnM6IFdoYXQgQXJndW1lbnRzIERvIFdlIEV4cGVjdD8gIyMKK1doZW4gYSBtb2NrIGZ1bmN0aW9uIHRha2VzIGFyZ3VtZW50cywgd2UgbXVzdCBzcGVjaWZ5IHdoYXQgYXJndW1lbnRzIHdlIGFyZSBleHBlY3Rpbmc7IGZvciBleGFtcGxlOgorCitgYGAKKy8vIEV4cGVjdHMgdGhlIHR1cnRsZSB0byBtb3ZlIGZvcndhcmQgYnkgMTAwIHVuaXRzLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKDEwMCkpOworYGBgCisKK1NvbWV0aW1lcyB5b3UgbWF5IG5vdCB3YW50IHRvIGJlIHRvbyBzcGVjaWZpYyAoUmVtZW1iZXIgdGhhdCB0YWxrIGFib3V0IHRlc3RzIGJlaW5nIHRvbyByaWdpZD8gT3ZlciBzcGVjaWZpY2F0aW9uIGxlYWRzIHRvIGJyaXR0bGUgdGVzdHMgYW5kIG9ic2N1cmVzIHRoZSBpbnRlbnQgb2YgdGVzdHMuIFRoZXJlZm9yZSB3ZSBlbmNvdXJhZ2UgeW91IHRvIHNwZWNpZnkgb25seSB3aGF0J3MgbmVjZXNzYXJ5IC0gbm8gbW9yZSwgbm8gbGVzcy4pLiBJZiB5b3UgY2FyZSB0byBjaGVjayB0aGF0IGBGb3J3YXJkKClgIHdpbGwgYmUgY2FsbGVkIGJ1dCBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBpdHMgYWN0dWFsIGFyZ3VtZW50LCB3cml0ZSBgX2AgYXMgdGhlIGFyZ3VtZW50LCB3aGljaCBtZWFucyAiYW55dGhpbmcgZ29lcyI6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOworLi4uCisvLyBFeHBlY3RzIHRoZSB0dXJ0bGUgdG8gbW92ZSBmb3J3YXJkLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKF8pKTsKK2BgYAorCitgX2AgaXMgYW4gaW5zdGFuY2Ugb2Ygd2hhdCB3ZSBjYWxsICoqbWF0Y2hlcnMqKi4gQSBtYXRjaGVyIGlzIGxpa2UgYSBwcmVkaWNhdGUgYW5kIGNhbiB0ZXN0IHdoZXRoZXIgYW4gYXJndW1lbnQgaXMgd2hhdCB3ZSdkIGV4cGVjdC4gWW91IGNhbiB1c2UgYSBtYXRjaGVyIGluc2lkZSBgRVhQRUNUX0NBTEwoKWAgd2hlcmV2ZXIgYSBmdW5jdGlvbiBhcmd1bWVudCBpcyBleHBlY3RlZC4KKworQSBsaXN0IG9mIGJ1aWx0LWluIG1hdGNoZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgW0NoZWF0U2hlZXRdKFYxXzdfQ2hlYXRTaGVldC5tZCkuIEZvciBleGFtcGxlLCBoZXJlJ3MgdGhlIGBHZWAgKGdyZWF0ZXIgdGhhbiBvciBlcXVhbCkgbWF0Y2hlcjoKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkdlOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKEdlKDEwMCkpKTsKK2BgYAorCitUaGlzIGNoZWNrcyB0aGF0IHRoZSB0dXJ0bGUgd2lsbCBiZSB0b2xkIHRvIGdvIGZvcndhcmQgYnkgYXQgbGVhc3QgMTAwIHVuaXRzLgorCisjIyBDYXJkaW5hbGl0aWVzOiBIb3cgTWFueSBUaW1lcyBXaWxsIEl0IEJlIENhbGxlZD8gIyMKK1RoZSBmaXJzdCBjbGF1c2Ugd2UgY2FuIHNwZWNpZnkgZm9sbG93aW5nIGFuIGBFWFBFQ1RfQ0FMTCgpYCBpcyBgVGltZXMoKWAuIFdlIGNhbGwgaXRzIGFyZ3VtZW50IGEgKipjYXJkaW5hbGl0eSoqIGFzIGl0IHRlbGxzIF9ob3cgbWFueSB0aW1lc18gdGhlIGNhbGwgc2hvdWxkIG9jY3VyLiBJdCBhbGxvd3MgdXMgdG8gcmVwZWF0IGFuIGV4cGVjdGF0aW9uIG1hbnkgdGltZXMgd2l0aG91dCBhY3R1YWxseSB3cml0aW5nIGl0IGFzIG1hbnkgdGltZXMuIE1vcmUgaW1wb3J0YW50bHksIGEgY2FyZGluYWxpdHkgY2FuIGJlICJmdXp6eSIsIGp1c3QgbGlrZSBhIG1hdGNoZXIgY2FuIGJlLiBUaGlzIGFsbG93cyBhIHVzZXIgdG8gZXhwcmVzcyB0aGUgaW50ZW50IG9mIGEgdGVzdCBleGFjdGx5LgorCitBbiBpbnRlcmVzdGluZyBzcGVjaWFsIGNhc2UgaXMgd2hlbiB3ZSBzYXkgYFRpbWVzKDApYC4gWW91IG1heSBoYXZlIGd1ZXNzZWQgLSBpdCBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhdCBhbGwsIGFuZCBHb29nbGUgTW9jayB3aWxsIHJlcG9ydCBhIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2hlbmV2ZXIgdGhlIGZ1bmN0aW9uIGlzICh3cm9uZ2Z1bGx5KSBjYWxsZWQuCisKK1dlJ3ZlIHNlZW4gYEF0TGVhc3QobilgIGFzIGFuIGV4YW1wbGUgb2YgZnV6enkgY2FyZGluYWxpdGllcyBlYXJsaWVyLiBGb3IgdGhlIGxpc3Qgb2YgYnVpbHQtaW4gY2FyZGluYWxpdGllcyB5b3UgY2FuIHVzZSwgc2VlIHRoZSBbQ2hlYXRTaGVldF0oVjFfN19DaGVhdFNoZWV0Lm1kKS4KKworVGhlIGBUaW1lcygpYCBjbGF1c2UgY2FuIGJlIG9taXR0ZWQuICoqSWYgeW91IG9taXQgYFRpbWVzKClgLCBHb29nbGUgTW9jayB3aWxsIGluZmVyIHRoZSBjYXJkaW5hbGl0eSBmb3IgeW91LioqIFRoZSBydWxlcyBhcmUgZWFzeSB0byByZW1lbWJlcjoKKworICAqIElmICoqbmVpdGhlcioqIGBXaWxsT25jZSgpYCAqKm5vcioqIGBXaWxsUmVwZWF0ZWRseSgpYCBpcyBpbiB0aGUgYEVYUEVDVF9DQUxMKClgLCB0aGUgaW5mZXJyZWQgY2FyZGluYWxpdHkgaXMgYFRpbWVzKDEpYC4KKyAgKiBJZiB0aGVyZSBhcmUgYG4gV2lsbE9uY2UoKWAncyBidXQgKipubyoqIGBXaWxsUmVwZWF0ZWRseSgpYCwgd2hlcmUgYG5gID49IDEsIHRoZSBjYXJkaW5hbGl0eSBpcyBgVGltZXMobilgLgorICAqIElmIHRoZXJlIGFyZSBgbiBXaWxsT25jZSgpYCdzIGFuZCAqKm9uZSoqIGBXaWxsUmVwZWF0ZWRseSgpYCwgd2hlcmUgYG5gID49IDAsIHRoZSBjYXJkaW5hbGl0eSBpcyBgVGltZXMoQXRMZWFzdChuKSlgLgorCisqKlF1aWNrIHF1aXo6Kiogd2hhdCBkbyB5b3UgdGhpbmsgd2lsbCBoYXBwZW4gaWYgYSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgdHdpY2UgYnV0IGFjdHVhbGx5IGNhbGxlZCBmb3VyIHRpbWVzPworCisjIyBBY3Rpb25zOiBXaGF0IFNob3VsZCBJdCBEbz8gIyMKK1JlbWVtYmVyIHRoYXQgYSBtb2NrIG9iamVjdCBkb2Vzbid0IHJlYWxseSBoYXZlIGEgd29ya2luZyBpbXBsZW1lbnRhdGlvbj8gV2UgYXMgdXNlcnMgaGF2ZSB0byB0ZWxsIGl0IHdoYXQgdG8gZG8gd2hlbiBhIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGVhc3kgaW4gR29vZ2xlIE1vY2suCisKK0ZpcnN0LCBpZiB0aGUgcmV0dXJuIHR5cGUgb2YgYSBtb2NrIGZ1bmN0aW9uIGlzIGEgYnVpbHQtaW4gdHlwZSBvciBhIHBvaW50ZXIsIHRoZSBmdW5jdGlvbiBoYXMgYSAqKmRlZmF1bHQgYWN0aW9uKiogKGEgYHZvaWRgIGZ1bmN0aW9uIHdpbGwganVzdCByZXR1cm4sIGEgYGJvb2xgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGBmYWxzZWAsIGFuZCBvdGhlciBmdW5jdGlvbnMgd2lsbCByZXR1cm4gMCkuIElmIHlvdSBkb24ndCBzYXkgYW55dGhpbmcsIHRoaXMgYmVoYXZpb3Igd2lsbCBiZSB1c2VkLgorCitTZWNvbmQsIGlmIGEgbW9jayBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IGFjdGlvbiwgb3IgdGhlIGRlZmF1bHQgYWN0aW9uIGRvZXNuJ3Qgc3VpdCB5b3UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIGVhY2ggdGltZSB0aGUgZXhwZWN0YXRpb24gbWF0Y2hlcyB1c2luZyBhIHNlcmllcyBvZiBgV2lsbE9uY2UoKWAgY2xhdXNlcyBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBgV2lsbFJlcGVhdGVkbHkoKWAuIEZvciBleGFtcGxlLAorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMjAwKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDMwMCkpOworYGBgCisKK1RoaXMgc2F5cyB0aGF0IGB0dXJ0bGUuR2V0WCgpYCB3aWxsIGJlIGNhbGxlZCBfZXhhY3RseSB0aHJlZSB0aW1lc18gKEdvb2dsZSBNb2NrIGluZmVycmVkIHRoaXMgZnJvbSBob3cgbWFueSBgV2lsbE9uY2UoKWAgY2xhdXNlcyB3ZSd2ZSB3cml0dGVuLCBzaW5jZSB3ZSBkaWRuJ3QgZXhwbGljaXRseSB3cml0ZSBgVGltZXMoKWApLCBhbmQgd2lsbCByZXR1cm4gMTAwLCAyMDAsIGFuZCAzMDAgcmVzcGVjdGl2ZWx5LgorCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRZKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxMDApKQorICAgIC5XaWxsT25jZShSZXR1cm4oMjAwKSkKKyAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDMwMCkpOworYGBgCisKK3NheXMgdGhhdCBgdHVydGxlLkdldFkoKWAgd2lsbCBiZSBjYWxsZWQgX2F0IGxlYXN0IHR3aWNlXyAoR29vZ2xlIE1vY2sga25vd3MgdGhpcyBhcyB3ZSd2ZSB3cml0dGVuIHR3byBgV2lsbE9uY2UoKWAgY2xhdXNlcyBhbmQgYSBgV2lsbFJlcGVhdGVkbHkoKWAgd2hpbGUgaGF2aW5nIG5vIGV4cGxpY2l0IGBUaW1lcygpYCksIHdpbGwgcmV0dXJuIDEwMCB0aGUgZmlyc3QgdGltZSwgMjAwIHRoZSBzZWNvbmQgdGltZSwgYW5kIDMwMCBmcm9tIHRoZSB0aGlyZCB0aW1lIG9uLgorCitPZiBjb3Vyc2UsIGlmIHlvdSBleHBsaWNpdGx5IHdyaXRlIGEgYFRpbWVzKClgLCBHb29nbGUgTW9jayB3aWxsIG5vdCB0cnkgdG8gaW5mZXIgdGhlIGNhcmRpbmFsaXR5IGl0c2VsZi4gV2hhdCBpZiB0aGUgbnVtYmVyIHlvdSBzcGVjaWZpZWQgaXMgbGFyZ2VyIHRoYW4gdGhlcmUgYXJlIGBXaWxsT25jZSgpYCBjbGF1c2VzPyBXZWxsLCBhZnRlciBhbGwgYFdpbGxPbmNlKClgcyBhcmUgdXNlZCB1cCwgR29vZ2xlIE1vY2sgd2lsbCBkbyB0aGUgX2RlZmF1bHRfIGFjdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUgKHVubGVzcywgb2YgY291cnNlLCB5b3UgaGF2ZSBhIGBXaWxsUmVwZWF0ZWRseSgpYC4pLgorCitXaGF0IGNhbiB3ZSBkbyBpbnNpZGUgYFdpbGxPbmNlKClgIGJlc2lkZXMgYFJldHVybigpYD8gWW91IGNhbiByZXR1cm4gYSByZWZlcmVuY2UgdXNpbmcgYFJldHVyblJlZih2YXJpYWJsZSlgLCBvciBpbnZva2UgYSBwcmUtZGVmaW5lZCBmdW5jdGlvbiwgYW1vbmcgW290aGVyc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV83X0NoZWF0U2hlZXQjQWN0aW9ucykuCisKKyoqSW1wb3J0YW50IG5vdGU6KiogVGhlIGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnQgZXZhbHVhdGVzIHRoZSBhY3Rpb24gY2xhdXNlIG9ubHkgb25jZSwgZXZlbiB0aG91Z2ggdGhlIGFjdGlvbiBtYXkgYmUgcGVyZm9ybWVkIG1hbnkgdGltZXMuIFRoZXJlZm9yZSB5b3UgbXVzdCBiZSBjYXJlZnVsIGFib3V0IHNpZGUgZWZmZWN0cy4gVGhlIGZvbGxvd2luZyBtYXkgbm90IGRvIHdoYXQgeW91IHdhbnQ6CisKK2BgYAoraW50IG4gPSAxMDA7CitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEdldFgoKSkKKy5UaW1lcyg0KQorLldpbGxSZXBlYXRlZGx5KFJldHVybihuKyspKTsKK2BgYAorCitJbnN0ZWFkIG9mIHJldHVybmluZyAxMDAsIDEwMSwgMTAyLCAuLi4sIGNvbnNlY3V0aXZlbHksIHRoaXMgbW9jayBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gMTAwIGFzIGBuKytgIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIFNpbWlsYXJseSwgYFJldHVybihuZXcgRm9vKWAgd2lsbCBjcmVhdGUgYSBuZXcgYEZvb2Agb2JqZWN0IHdoZW4gdGhlIGBFWFBFQ1RfQ0FMTCgpYCBpcyBleGVjdXRlZCwgYW5kIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHBvaW50ZXIgZXZlcnkgdGltZS4gSWYgeW91IHdhbnQgdGhlIHNpZGUgZWZmZWN0IHRvIGhhcHBlbiBldmVyeSB0aW1lLCB5b3UgbmVlZCB0byBkZWZpbmUgYSBjdXN0b20gYWN0aW9uLCB3aGljaCB3ZSdsbCB0ZWFjaCBpbiB0aGUgW0Nvb2tCb29rXShWMV83X0Nvb2tCb29rLm1kKS4KKworVGltZSBmb3IgYW5vdGhlciBxdWl6ISBXaGF0IGRvIHlvdSB0aGluayB0aGUgZm9sbG93aW5nIG1lYW5zPworCitgYGAKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHZXRZKCkpCisuVGltZXMoNCkKKy5XaWxsT25jZShSZXR1cm4oMTAwKSk7CitgYGAKKworT2J2aW91c2x5IGB0dXJ0bGUuR2V0WSgpYCBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQgZm91ciB0aW1lcy4gQnV0IGlmIHlvdSB0aGluayBpdCB3aWxsIHJldHVybiAxMDAgZXZlcnkgdGltZSwgdGhpbmsgdHdpY2UhIFJlbWVtYmVyIHRoYXQgb25lIGBXaWxsT25jZSgpYCBjbGF1c2Ugd2lsbCBiZSBjb25zdW1lZCBlYWNoIHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGludm9rZWQgYW5kIHRoZSBkZWZhdWx0IGFjdGlvbiB3aWxsIGJlIHRha2VuIGFmdGVyd2FyZHMuIFNvIHRoZSByaWdodCBhbnN3ZXIgaXMgdGhhdCBgdHVydGxlLkdldFkoKWAgd2lsbCByZXR1cm4gMTAwIHRoZSBmaXJzdCB0aW1lLCBidXQgKipyZXR1cm4gMCBmcm9tIHRoZSBzZWNvbmQgdGltZSBvbioqLCBhcyByZXR1cm5pbmcgMCBpcyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGBpbnRgIGZ1bmN0aW9ucy4KKworIyMgVXNpbmcgTXVsdGlwbGUgRXhwZWN0YXRpb25zICMjCitTbyBmYXIgd2UndmUgb25seSBzaG93biBleGFtcGxlcyB3aGVyZSB5b3UgaGF2ZSBhIHNpbmdsZSBleHBlY3RhdGlvbi4gTW9yZSByZWFsaXN0aWNhbGx5LCB5b3UncmUgZ29pbmcgdG8gc3BlY2lmeSBleHBlY3RhdGlvbnMgb24gbXVsdGlwbGUgbW9jayBtZXRob2RzLCB3aGljaCBtYXkgYmUgZnJvbSBtdWx0aXBsZSBtb2NrIG9iamVjdHMuCisKK0J5IGRlZmF1bHQsIHdoZW4gYSBtb2NrIG1ldGhvZCBpcyBpbnZva2VkLCBHb29nbGUgTW9jayB3aWxsIHNlYXJjaCB0aGUgZXhwZWN0YXRpb25zIGluIHRoZSAqKnJldmVyc2Ugb3JkZXIqKiB0aGV5IGFyZSBkZWZpbmVkLCBhbmQgc3RvcCB3aGVuIGFuIGFjdGl2ZSBleHBlY3RhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGFyZ3VtZW50cyBpcyBmb3VuZCAoeW91IGNhbiB0aGluayBvZiBpdCBhcyAibmV3ZXIgcnVsZXMgb3ZlcnJpZGUgb2xkZXIgb25lcy4iKS4gSWYgdGhlIG1hdGNoaW5nIGV4cGVjdGF0aW9uIGNhbm5vdCB0YWtlIGFueSBtb3JlIGNhbGxzLCB5b3Ugd2lsbCBnZXQgYW4gdXBwZXItYm91bmQtdmlvbGF0ZWQgZmFpbHVyZS4gSGVyZSdzIGFuIGV4YW1wbGU6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBGb3J3YXJkKF8pKTsgIC8vICMxCitFWFBFQ1RfQ0FMTCh0dXJ0bGUsIEZvcndhcmQoMTApKSAgLy8gIzIKKyAgICAuVGltZXMoMik7CitgYGAKKworSWYgYEZvcndhcmQoMTApYCBpcyBjYWxsZWQgdGhyZWUgdGltZXMgaW4gYSByb3csIHRoZSB0aGlyZCB0aW1lIGl0IHdpbGwgYmUgYW4gZXJyb3IsIGFzIHRoZSBsYXN0IG1hdGNoaW5nIGV4cGVjdGF0aW9uICgjMikgaGFzIGJlZW4gc2F0dXJhdGVkLiBJZiwgaG93ZXZlciwgdGhlIHRoaXJkIGBGb3J3YXJkKDEwKWAgY2FsbCBpcyByZXBsYWNlZCBieSBgRm9yd2FyZCgyMClgLCB0aGVuIGl0IHdvdWxkIGJlIE9LLCBhcyBub3cgIzEgd2lsbCBiZSB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24uCisKKyoqU2lkZSBub3RlOioqIFdoeSBkb2VzIEdvb2dsZSBNb2NrIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiB0aGUgX3JldmVyc2VfIG9yZGVyIG9mIHRoZSBleHBlY3RhdGlvbnM/IFRoZSByZWFzb24gaXMgdGhhdCB0aGlzIGFsbG93cyBhIHVzZXIgdG8gc2V0IHVwIHRoZSBkZWZhdWx0IGV4cGVjdGF0aW9ucyBpbiBhIG1vY2sgb2JqZWN0J3MgY29uc3RydWN0b3Igb3IgdGhlIHRlc3QgZml4dHVyZSdzIHNldC11cCBwaGFzZSBhbmQgdGhlbiBjdXN0b21pemUgdGhlIG1vY2sgYnkgd3JpdGluZyBtb3JlIHNwZWNpZmljIGV4cGVjdGF0aW9ucyBpbiB0aGUgdGVzdCBib2R5LiBTbywgaWYgeW91IGhhdmUgdHdvIGV4cGVjdGF0aW9ucyBvbiB0aGUgc2FtZSBtZXRob2QsIHlvdSB3YW50IHRvIHB1dCB0aGUgb25lIHdpdGggbW9yZSBzcGVjaWZpYyBtYXRjaGVycyAqKmFmdGVyKiogdGhlIG90aGVyLCBvciB0aGUgbW9yZSBzcGVjaWZpYyBydWxlIHdvdWxkIGJlIHNoYWRvd2VkIGJ5IHRoZSBtb3JlIGdlbmVyYWwgb25lIHRoYXQgY29tZXMgYWZ0ZXIgaXQuCisKKyMjIE9yZGVyZWQgdnMgVW5vcmRlcmVkIENhbGxzICMjCitCeSBkZWZhdWx0LCBhbiBleHBlY3RhdGlvbiBjYW4gbWF0Y2ggYSBjYWxsIGV2ZW4gdGhvdWdoIGFuIGVhcmxpZXIgZXhwZWN0YXRpb24gaGFzbid0IGJlZW4gc2F0aXNmaWVkLiBJbiBvdGhlciB3b3JkcywgdGhlIGNhbGxzIGRvbid0IGhhdmUgdG8gb2NjdXIgaW4gdGhlIG9yZGVyIHRoZSBleHBlY3RhdGlvbnMgYXJlIHNwZWNpZmllZC4KKworU29tZXRpbWVzLCB5b3UgbWF5IHdhbnQgYWxsIHRoZSBleHBlY3RlZCBjYWxscyB0byBvY2N1ciBpbiBhIHN0cmljdCBvcmRlci4gVG8gc2F5IHRoaXMgaW4gR29vZ2xlIE1vY2sgaXMgZWFzeToKKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OkluU2VxdWVuY2U7Li4uCitURVNUKEZvb1Rlc3QsIERyYXdzTGluZVNlZ21lbnQpIHsKKyAgLi4uCisgIHsKKyAgICBJblNlcXVlbmNlIGR1bW15OworCisgICAgRVhQRUNUX0NBTEwodHVydGxlLCBQZW5Eb3duKCkpOworICAgIEVYUEVDVF9DQUxMKHR1cnRsZSwgRm9yd2FyZCgxMDApKTsKKyAgICBFWFBFQ1RfQ0FMTCh0dXJ0bGUsIFBlblVwKCkpOworICB9CisgIEZvbygpOworfQorYGBgCisKK0J5IGNyZWF0aW5nIGFuIG9iamVjdCBvZiB0eXBlIGBJblNlcXVlbmNlYCwgYWxsIGV4cGVjdGF0aW9ucyBpbiBpdHMgc2NvcGUgYXJlIHB1dCBpbnRvIGEgX3NlcXVlbmNlXyBhbmQgaGF2ZSB0byBvY2N1ciBfc2VxdWVudGlhbGx5Xy4gU2luY2Ugd2UgYXJlIGp1c3QgcmVseWluZyBvbiB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3Igb2YgdGhpcyBvYmplY3QgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLCBpdHMgbmFtZSBpcyByZWFsbHkgaXJyZWxldmFudC4KKworSW4gdGhpcyBleGFtcGxlLCB3ZSB0ZXN0IHRoYXQgYEZvbygpYCBjYWxscyB0aGUgdGhyZWUgZXhwZWN0ZWQgZnVuY3Rpb25zIGluIHRoZSBvcmRlciBhcyB3cml0dGVuLiBJZiBhIGNhbGwgaXMgbWFkZSBvdXQtb2Ytb3JkZXIsIGl0IHdpbGwgYmUgYW4gZXJyb3IuCisKKyhXaGF0IGlmIHlvdSBjYXJlIGFib3V0IHRoZSByZWxhdGl2ZSBvcmRlciBvZiBzb21lIG9mIHRoZSBjYWxscywgYnV0IG5vdCBhbGwgb2YgdGhlbT8gQ2FuIHlvdSBzcGVjaWZ5IGFuIGFyYml0cmFyeSBwYXJ0aWFsIG9yZGVyPyBUaGUgYW5zd2VyIGlzIC4uLiB5ZXMhIElmIHlvdSBhcmUgaW1wYXRpZW50LCB0aGUgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gdGhlIFtDb29rQm9va10oVjFfN19Db29rQm9vayNFeHBlY3RpbmdfUGFydGlhbGx5X09yZGVyZWRfQ2FsbHMubWQpLikKKworIyMgQWxsIEV4cGVjdGF0aW9ucyBBcmUgU3RpY2t5IChVbmxlc3MgU2FpZCBPdGhlcndpc2UpICMjCitOb3cgbGV0J3MgZG8gYSBxdWljayBxdWl6IHRvIHNlZSBob3cgd2VsbCB5b3UgY2FuIHVzZSB0aGlzIG1vY2sgc3R1ZmYgYWxyZWFkeS4gSG93IHdvdWxkIHlvdSB0ZXN0IHRoYXQgdGhlIHR1cnRsZSBpcyBhc2tlZCB0byBnbyB0byB0aGUgb3JpZ2luIF9leGFjdGx5IHR3aWNlXyAoeW91IHdhbnQgdG8gaWdub3JlIGFueSBvdGhlciBpbnN0cnVjdGlvbnMgaXQgcmVjZWl2ZXMpPworCitBZnRlciB5b3UndmUgY29tZSB1cCB3aXRoIHlvdXIgYW5zd2VyLCB0YWtlIGEgbG9vayBhdCBvdXJzIGFuZCBjb21wYXJlIG5vdGVzIChzb2x2ZSBpdCB5b3Vyc2VsZiBmaXJzdCAtIGRvbid0IGNoZWF0ISk6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpfOy4uLgorRVhQRUNUX0NBTEwodHVydGxlLCBHb1RvKF8sIF8pKSAgLy8gIzEKKyAgICAuVGltZXMoQW55TnVtYmVyKCkpOworRVhQRUNUX0NBTEwodHVydGxlLCBHb1RvKDAsIDApKSAgLy8gIzIKKyAgICAuVGltZXMoMik7CitgYGAKKworU3VwcG9zZSBgdHVydGxlLkdvVG8oMCwgMClgIGlzIGNhbGxlZCB0aHJlZSB0aW1lcy4gSW4gdGhlIHRoaXJkIHRpbWUsIEdvb2dsZSBNb2NrIHdpbGwgc2VlIHRoYXQgdGhlIGFyZ3VtZW50cyBtYXRjaCBleHBlY3RhdGlvbiAjMiAocmVtZW1iZXIgdGhhdCB3ZSBhbHdheXMgcGljayB0aGUgbGFzdCBtYXRjaGluZyBleHBlY3RhdGlvbikuIE5vdywgc2luY2Ugd2Ugc2FpZCB0aGF0IHRoZXJlIHNob3VsZCBiZSBvbmx5IHR3byBzdWNoIGNhbGxzLCBHb29nbGUgTW9jayB3aWxsIHJlcG9ydCBhbiBlcnJvciBpbW1lZGlhdGVseS4gVGhpcyBpcyBiYXNpY2FsbHkgd2hhdCB3ZSd2ZSB0b2xkIHlvdSBpbiB0aGUgIlVzaW5nIE11bHRpcGxlIEV4cGVjdGF0aW9ucyIgc2VjdGlvbiBhYm92ZS4KKworVGhpcyBleGFtcGxlIHNob3dzIHRoYXQgKipleHBlY3RhdGlvbnMgaW4gR29vZ2xlIE1vY2sgYXJlICJzdGlja3kiIGJ5IGRlZmF1bHQqKiwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSByZW1haW4gYWN0aXZlIGV2ZW4gYWZ0ZXIgd2UgaGF2ZSByZWFjaGVkIHRoZWlyIGludm9jYXRpb24gdXBwZXIgYm91bmRzLiBUaGlzIGlzIGFuIGltcG9ydGFudCBydWxlIHRvIHJlbWVtYmVyLCBhcyBpdCBhZmZlY3RzIHRoZSBtZWFuaW5nIG9mIHRoZSBzcGVjLCBhbmQgaXMgKipkaWZmZXJlbnQqKiB0byBob3cgaXQncyBkb25lIGluIG1hbnkgb3RoZXIgbW9ja2luZyBmcmFtZXdvcmtzIChXaHknZCB3ZSBkbyB0aGF0PyBCZWNhdXNlIHdlIHRoaW5rIG91ciBydWxlIG1ha2VzIHRoZSBjb21tb24gY2FzZXMgZWFzaWVyIHRvIGV4cHJlc3MgYW5kIHVuZGVyc3RhbmQuKS4KKworU2ltcGxlPyBMZXQncyBzZWUgaWYgeW91J3ZlIHJlYWxseSB1bmRlcnN0b29kIGl0OiB3aGF0IGRvZXMgdGhlIGZvbGxvd2luZyBjb2RlIHNheT8KKworYGBgCit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKKy4uLgorZm9yIChpbnQgaSA9IG47IGkgPiAwOyBpLS0pIHsKKyAgRVhQRUNUX0NBTEwodHVydGxlLCBHZXRYKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEwKmkpKTsKK30KK2BgYAorCitJZiB5b3UgdGhpbmsgaXQgc2F5cyB0aGF0IGB0dXJ0bGUuR2V0WCgpYCB3aWxsIGJlIGNhbGxlZCBgbmAgdGltZXMgYW5kIHdpbGwgcmV0dXJuIDEwLCAyMCwgMzAsIC4uLiwgY29uc2VjdXRpdmVseSwgdGhpbmsgdHdpY2UhIFRoZSBwcm9ibGVtIGlzIHRoYXQsIGFzIHdlIHNhaWQsIGV4cGVjdGF0aW9ucyBhcmUgc3RpY2t5LiBTbywgdGhlIHNlY29uZCB0aW1lIGB0dXJ0bGUuR2V0WCgpYCBpcyBjYWxsZWQsIHRoZSBsYXN0IChsYXRlc3QpIGBFWFBFQ1RfQ0FMTCgpYCBzdGF0ZW1lbnQgd2lsbCBtYXRjaCwgYW5kIHdpbGwgaW1tZWRpYXRlbHkgbGVhZCB0byBhbiAidXBwZXIgYm91bmQgZXhjZWVkZWQiIGVycm9yIC0gdGhpcyBwaWVjZSBvZiBjb2RlIGlzIG5vdCB2ZXJ5IHVzZWZ1bCEKKworT25lIGNvcnJlY3Qgd2F5IG9mIHNheWluZyB0aGF0IGB0dXJ0bGUuR2V0WCgpYCB3aWxsIHJldHVybiAxMCwgMjAsIDMwLCAuLi4sIGlzIHRvIGV4cGxpY2l0bHkgc2F5IHRoYXQgdGhlIGV4cGVjdGF0aW9ucyBhcmUgX25vdF8gc3RpY2t5LiBJbiBvdGhlciB3b3JkcywgdGhleSBzaG91bGQgX3JldGlyZV8gYXMgc29vbiBhcyB0aGV5IGFyZSBzYXR1cmF0ZWQ6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KK2ZvciAoaW50IGkgPSBuOyBpID4gMDsgaS0tKSB7CisgIEVYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WCgpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMTAqaSkpCisgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK30KK2BgYAorCitBbmQsIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0OiBpbiB0aGlzIGNhc2UsIHdlIGV4cGVjdCB0aGUgY2FsbHMgdG8gb2NjdXIgaW4gYSBzcGVjaWZpYyBvcmRlciwgYW5kIHdlIGxpbmUgdXAgdGhlIGFjdGlvbnMgdG8gbWF0Y2ggdGhlIG9yZGVyLiBTaW5jZSB0aGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHdlIHNob3VsZCBtYWtlIGl0IGV4cGxpY2l0IHVzaW5nIGEgc2VxdWVuY2U6CisKK2BgYAordXNpbmcgOjp0ZXN0aW5nOjpJblNlcXVlbmNlOwordXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CisuLi4KK3sKKyAgSW5TZXF1ZW5jZSBzOworCisgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgeworICAgIEVYUEVDVF9DQUxMKHR1cnRsZSwgR2V0WCgpKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEwKmkpKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICB9Cit9CitgYGAKKworQnkgdGhlIHdheSwgdGhlIG90aGVyIHNpdHVhdGlvbiB3aGVyZSBhbiBleHBlY3RhdGlvbiBtYXkgX25vdF8gYmUgc3RpY2t5IGlzIHdoZW4gaXQncyBpbiBhIHNlcXVlbmNlIC0gYXMgc29vbiBhcyBhbm90aGVyIGV4cGVjdGF0aW9uIHRoYXQgY29tZXMgYWZ0ZXIgaXQgaW4gdGhlIHNlcXVlbmNlIGhhcyBiZWVuIHVzZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmV0aXJlcyAoYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCB0byBtYXRjaCBhbnkgY2FsbCkuCisKKyMjIFVuaW50ZXJlc3RpbmcgQ2FsbHMgIyMKK0EgbW9jayBvYmplY3QgbWF5IGhhdmUgbWFueSBtZXRob2RzLCBhbmQgbm90IGFsbCBvZiB0aGVtIGFyZSB0aGF0IGludGVyZXN0aW5nLiBGb3IgZXhhbXBsZSwgaW4gc29tZSB0ZXN0cyB3ZSBtYXkgbm90IGNhcmUgYWJvdXQgaG93IG1hbnkgdGltZXMgYEdldFgoKWAgYW5kIGBHZXRZKClgIGdldCBjYWxsZWQuCisKK0luIEdvb2dsZSBNb2NrLCBpZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGEgbWV0aG9kLCBqdXN0IGRvbid0IHNheSBhbnl0aGluZyBhYm91dCBpdC4gSWYgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIG9jY3VycywgeW91J2xsIHNlZSBhIHdhcm5pbmcgaW4gdGhlIHRlc3Qgb3V0cHV0LCBidXQgaXQgd29uJ3QgYmUgYSBmYWlsdXJlLgorCisjIFdoYXQgTm93PyAjCitDb25ncmF0dWxhdGlvbnMhIFlvdSd2ZSBsZWFybmVkIGVub3VnaCBhYm91dCBHb29nbGUgTW9jayB0byBzdGFydCB1c2luZyBpdC4gTm93LCB5b3UgbWlnaHQgd2FudCB0byBqb2luIHRoZSBbZ29vZ2xlbW9ja10oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZW1vY2spIGRpc2N1c3Npb24gZ3JvdXAgYW5kIGFjdHVhbGx5IHdyaXRlIHNvbWUgdGVzdHMgdXNpbmcgR29vZ2xlIE1vY2sgLSBpdCB3aWxsIGJlIGZ1bi4gSGV5LCBpdCBtYXkgZXZlbiBiZSBhZGRpY3RpdmUgLSB5b3UndmUgYmVlbiB3YXJuZWQuCisKK1RoZW4sIGlmIHlvdSBmZWVsIGxpa2UgaW5jcmVhc2luZyB5b3VyIG1vY2sgcXVvdGllbnQsIHlvdSBzaG91bGQgbW92ZSBvbiB0byB0aGUgW0Nvb2tCb29rXShWMV83X0Nvb2tCb29rLm1kKS4gWW91IGNhbiBsZWFybiBtYW55IGFkdmFuY2VkIGZlYXR1cmVzIG9mIEdvb2dsZSBNb2NrIHRoZXJlIC0tIGFuZCBhZHZhbmNlIHlvdXIgbGV2ZWwgb2YgZW5qb3ltZW50IGFuZCB0ZXN0aW5nIGJsaXNzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzcvRnJlcXVlbnRseUFza2VkUXVlc3Rpb25zLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2RvY3MvdjFfNy9GcmVxdWVudGx5QXNrZWRRdWVzdGlvbnMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyMTIzMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9kb2NzL3YxXzcvRnJlcXVlbnRseUFza2VkUXVlc3Rpb25zLm1kCkBAIC0wLDAgKzEsNjI4IEBACisKKworUGxlYXNlIHNlbmQgeW91ciBxdWVzdGlvbnMgdG8gdGhlCitbZ29vZ2xlbW9ja10oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZW1vY2spIGRpc2N1c3Npb24KK2dyb3VwLiBJZiB5b3UgbmVlZCBoZWxwIHdpdGggY29tcGlsZXIgZXJyb3JzLCBtYWtlIHN1cmUgeW91IGhhdmUKK3RyaWVkIFtHb29nbGUgTW9jayBEb2N0b3JdKCNIb3dfYW1fSV9zdXBwb3NlZF90b19tYWtlX3NlbnNlX29mX3RoZXNlX2hvcnJpYmxlX3RlbXBsYXRlX2Vycm9yLm1kKSBmaXJzdC4KKworIyMgV2hlbiBJIGNhbGwgYSBtZXRob2Qgb24gbXkgbW9jayBvYmplY3QsIHRoZSBtZXRob2QgZm9yIHRoZSByZWFsIG9iamVjdCBpcyBpbnZva2VkIGluc3RlYWQuICBXaGF0J3MgdGhlIHByb2JsZW0/ICMjCisKK0luIG9yZGVyIGZvciBhIG1ldGhvZCB0byBiZSBtb2NrZWQsIGl0IG11c3QgYmUgX3ZpcnR1YWxfLCB1bmxlc3MgeW91IHVzZSB0aGUgW2hpZ2gtcGVyZiBkZXBlbmRlbmN5IGluamVjdGlvbiB0ZWNobmlxdWVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfN19Db29rQm9vayNNb2NraW5nX05vbnZpcnR1YWxfTWV0aG9kcykuCisKKyMjIEkgd3JvdGUgc29tZSBtYXRjaGVycy4gIEFmdGVyIEkgdXBncmFkZWQgdG8gYSBuZXcgdmVyc2lvbiBvZiBHb29nbGUgTW9jaywgdGhleSBubyBsb25nZXIgY29tcGlsZS4gIFdoYXQncyBnb2luZyBvbj8gIyMKKworQWZ0ZXIgdmVyc2lvbiAxLjQuMCBvZiBHb29nbGUgTW9jayB3YXMgcmVsZWFzZWQsIHdlIGhhZCBhbiBpZGVhIG9uIGhvdwordG8gbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUgbWF0Y2hlcnMgdGhhdCBjYW4gZ2VuZXJhdGUgaW5mb3JtYXRpdmUKK21lc3NhZ2VzIGVmZmljaWVudGx5LiAgV2UgZXhwZXJpbWVudGVkIHdpdGggdGhpcyBpZGVhIGFuZCBsaWtlZCB3aGF0Cit3ZSBzYXcuICBUaGVyZWZvcmUgd2UgZGVjaWRlZCB0byBpbXBsZW1lbnQgaXQuCisKK1VuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSBkZWZpbmVkIHlvdXIgb3duIG1hdGNoZXJzCitieSBpbXBsZW1lbnRpbmcgYE1hdGNoZXJJbnRlcmZhY2VgIG9yIHVzaW5nIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgLAoreW91ciBkZWZpbml0aW9ucyB3aWxsIG5vIGxvbmdlciBjb21waWxlLiAgTWF0Y2hlcnMgZGVmaW5lZCB1c2luZyB0aGUKK2BNQVRDSEVSKmAgZmFtaWx5IG9mIG1hY3JvcyBhcmUgbm90IGFmZmVjdGVkLgorCitTb3JyeSBmb3IgdGhlIGhhc3NsZSBpZiB5b3VyIG1hdGNoZXJzIGFyZSBhZmZlY3RlZC4gIFdlIGJlbGlldmUgaXQncworaW4gZXZlcnlvbmUncyBsb25nLXRlcm0gaW50ZXJlc3QgdG8gbWFrZSB0aGlzIGNoYW5nZSBzb29uZXIgdGhhbgorbGF0ZXIuICBGb3J0dW5hdGVseSwgaXQncyB1c3VhbGx5IG5vdCBoYXJkIHRvIG1pZ3JhdGUgYW4gZXhpc3RpbmcKK21hdGNoZXIgdG8gdGhlIG5ldyBBUEkuICBIZXJlJ3Mgd2hhdCB5b3UgbmVlZCB0byBkbzoKKworSWYgeW91IHdyb3RlIHlvdXIgbWF0Y2hlciBsaWtlIHRoaXM6CitgYGAKKy8vIE9sZCBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbGF0ZXN0CisvLyBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTsKKy4uLgorY2xhc3MgTXlXb25kZXJmdWxNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8TXlUeXBlPiB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCBib29sIE1hdGNoZXMoTXlUeXBlIHZhbHVlKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEZvbygpID4gNTsKKyAgfQorICAuLi4KK307CitgYGAKKworeW91J2xsIG5lZWQgdG8gY2hhbmdlIGl0IHRvOgorYGBgCisvLyBOZXcgbWF0Y2hlciBkZWZpbml0aW9uIHRoYXQgd29ya3Mgd2l0aCB0aGUgbGF0ZXN0IEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworLi4uCitjbGFzcyBNeVdvbmRlcmZ1bE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxNeVR5cGU+IHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzLgorICAgIHJldHVybiB2YWx1ZS5HZXRGb28oKSA+IDU7CisgIH0KKyAgLi4uCit9OworYGBgCisoaS5lLiByZW5hbWUgYE1hdGNoZXMoKWAgdG8gYE1hdGNoQW5kRXhwbGFpbigpYCBhbmQgZ2l2ZSBpdCBhIHNlY29uZAorYXJndW1lbnQgb2YgdHlwZSBgTWF0Y2hSZXN1bHRMaXN0ZW5lcipgLikKKworSWYgeW91IHdlcmUgYWxzbyB1c2luZyBgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKWAgdG8gaW1wcm92ZSB0aGUgbWF0Y2hlcgorbWVzc2FnZToKK2BgYAorLy8gT2xkIG1hdGNoZXIgZGVmaW5pdGlvbiB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBsYXN0ZXN0CisvLyBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTsKKy4uLgorY2xhc3MgTXlXb25kZXJmdWxNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8TXlUeXBlPiB7CisgcHVibGljOgorICAuLi4KKyAgdmlydHVhbCBib29sIE1hdGNoZXMoTXlUeXBlIHZhbHVlKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEZvbygpID4gNTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBFeHBsYWluTWF0Y2hSZXN1bHRUbyhNeVR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAvLyBQcmludHMgc29tZSBoZWxwZnVsIGluZm9ybWF0aW9uIHRvIG9zIHRvIGhlbHAKKyAgICAvLyBhIHVzZXIgdW5kZXJzdGFuZCB3aHkgdmFsdWUgbWF0Y2hlcyAob3IgZG9lc24ndCBtYXRjaCkuCisgICAgKm9zIDw8ICJ0aGUgRm9vIHByb3BlcnR5IGlzICIgPDwgdmFsdWUuR2V0Rm9vKCk7CisgIH0KKyAgLi4uCit9OworYGBgCisKK3lvdSBzaG91bGQgbW92ZSB0aGUgbG9naWMgb2YgYEV4cGxhaW5NYXRjaFJlc3VsdFRvKClgIGludG8KK2BNYXRjaEFuZEV4cGxhaW4oKWAsIHVzaW5nIHRoZSBgTWF0Y2hSZXN1bHRMaXN0ZW5lcmAgYXJndW1lbnQgd2hlcmUKK3RoZSBgOjpzdGQ6Om9zdHJlYW1gIHdhcyB1c2VkOgorYGBgCisvLyBOZXcgbWF0Y2hlciBkZWZpbml0aW9uIHRoYXQgd29ya3Mgd2l0aCB0aGUgbGF0ZXN0IEdvb2dsZSBNb2NrLgordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlOwordXNpbmcgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyOworLi4uCitjbGFzcyBNeVdvbmRlcmZ1bE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxNeVR5cGU+IHsKKyBwdWJsaWM6CisgIC4uLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKE15VHlwZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzLgorICAgICpsaXN0ZW5lciA8PCAidGhlIEZvbyBwcm9wZXJ0eSBpcyAiIDw8IHZhbHVlLkdldEZvbygpOworICAgIHJldHVybiB2YWx1ZS5HZXRGb28oKSA+IDU7CisgIH0KKyAgLi4uCit9OworYGBgCisKK0lmIHlvdXIgbWF0Y2hlciBpcyBkZWZpbmVkIHVzaW5nIGBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKClgOgorYGBgCisvLyBPbGQgbWF0Y2hlciBkZWZpbml0aW9uIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGxhdGVzdAorLy8gR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VQb2x5bW9ycGhpY01hdGNoZXI7CisuLi4KK2NsYXNzIE15R3JlYXRNYXRjaGVyIHsKKyBwdWJsaWM6CisgIC4uLgorICBib29sIE1hdGNoZXMoTXlUeXBlIHZhbHVlKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEJhcigpIDwgNDI7CisgIH0KKyAgLi4uCit9OworLi4uIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTXlHcmVhdE1hdGNoZXIoKSkgLi4uCitgYGAKKworeW91IHNob3VsZCByZW5hbWUgdGhlIGBNYXRjaGVzKClgIG1ldGhvZCB0byBgTWF0Y2hBbmRFeHBsYWluKClgIGFuZAorYWRkIGEgYE1hdGNoUmVzdWx0TGlzdGVuZXIqYCBhcmd1bWVudCAodGhlIHNhbWUgYXMgd2hhdCB5b3UgbmVlZCB0byBkbworZm9yIG1hdGNoZXJzIGRlZmluZWQgYnkgaW1wbGVtZW50aW5nIGBNYXRjaGVySW50ZXJmYWNlYCk6CitgYGAKKy8vIE5ldyBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCB3b3JrcyB3aXRoIHRoZSBsYXRlc3QgR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VQb2x5bW9ycGhpY01hdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisuLi4KK2NsYXNzIE15R3JlYXRNYXRjaGVyIHsKKyBwdWJsaWM6CisgIC4uLgorICBib29sIE1hdGNoQW5kRXhwbGFpbihNeVR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgcmV0dXJuIHZhbHVlLkdldEJhcigpIDwgNDI7CisgIH0KKyAgLi4uCit9OworLi4uIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTXlHcmVhdE1hdGNoZXIoKSkgLi4uCitgYGAKKworSWYgeW91ciBwb2x5bW9ycGhpYyBtYXRjaGVyIHVzZXMgYEV4cGxhaW5NYXRjaFJlc3VsdFRvKClgIGZvciBiZXR0ZXIKK2ZhaWx1cmUgbWVzc2FnZXM6CitgYGAKKy8vIE9sZCBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbGF0ZXN0CisvLyBHb29nbGUgTW9jay4KK3VzaW5nIDo6dGVzdGluZzo6TWFrZVBvbHltb3JwaGljTWF0Y2hlcjsKKy4uLgorY2xhc3MgTXlHcmVhdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgLi4uCisgIGJvb2wgTWF0Y2hlcyhNeVR5cGUgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcy4KKyAgICByZXR1cm4gdmFsdWUuR2V0QmFyKCkgPCA0MjsKKyAgfQorICAuLi4KK307Cit2b2lkIEV4cGxhaW5NYXRjaFJlc3VsdFRvKGNvbnN0IE15R3JlYXRNYXRjaGVyJiBtYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNeVR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBQcmludHMgc29tZSBoZWxwZnVsIGluZm9ybWF0aW9uIHRvIG9zIHRvIGhlbHAKKyAgLy8gYSB1c2VyIHVuZGVyc3RhbmQgd2h5IHZhbHVlIG1hdGNoZXMgKG9yIGRvZXNuJ3QgbWF0Y2gpLgorICAqb3MgPDwgInRoZSBCYXIgcHJvcGVydHkgaXMgIiA8PCB2YWx1ZS5HZXRCYXIoKTsKK30KKy4uLiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKE15R3JlYXRNYXRjaGVyKCkpIC4uLgorYGBgCisKK3lvdSdsbCBuZWVkIHRvIG1vdmUgdGhlIGxvZ2ljIGluc2lkZSBgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKWAgdG8KK2BNYXRjaEFuZEV4cGxhaW4oKWA6CitgYGAKKy8vIE5ldyBtYXRjaGVyIGRlZmluaXRpb24gdGhhdCB3b3JrcyB3aXRoIHRoZSBsYXRlc3QgR29vZ2xlIE1vY2suCit1c2luZyA6OnRlc3Rpbmc6Ok1ha2VQb2x5bW9ycGhpY01hdGNoZXI7Cit1c2luZyA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7CisuLi4KK2NsYXNzIE15R3JlYXRNYXRjaGVyIHsKKyBwdWJsaWM6CisgIC4uLgorICBib29sIE1hdGNoQW5kRXhwbGFpbihNeVR5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMuCisgICAgKmxpc3RlbmVyIDw8ICJ0aGUgQmFyIHByb3BlcnR5IGlzICIgPDwgdmFsdWUuR2V0QmFyKCk7CisgICAgcmV0dXJuIHZhbHVlLkdldEJhcigpIDwgNDI7CisgIH0KKyAgLi4uCit9OworLi4uIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoTXlHcmVhdE1hdGNoZXIoKSkgLi4uCitgYGAKKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIHlvdSBjYW4gcmVhZCB0aGVzZQorW3R3b10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9WMV83X0Nvb2tCb29rI1dyaXRpbmdfTmV3X01vbm9tb3JwaGljX01hdGNoZXJzKQorW3JlY2lwZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfN19Db29rQm9vayNXcml0aW5nX05ld19Qb2x5bW9ycGhpY19NYXRjaGVycykKK2Zyb20gdGhlIGNvb2tib29rLiAgQXMgYWx3YXlzLCB5b3UKK2FyZSB3ZWxjb21lIHRvIHBvc3QgcXVlc3Rpb25zIG9uIGBnb29nbGVtb2NrQGdvb2dsZWdyb3Vwcy5jb21gIGlmIHlvdQorbmVlZCBhbnkgaGVscC4KKworIyMgV2hlbiB1c2luZyBHb29nbGUgTW9jaywgZG8gSSBoYXZlIHRvIHVzZSBHb29nbGUgVGVzdCBhcyB0aGUgdGVzdGluZyBmcmFtZXdvcms/ICBJIGhhdmUgbXkgZmF2b3JpdGUgdGVzdGluZyBmcmFtZXdvcmsgYW5kIGRvbid0IHdhbnQgdG8gc3dpdGNoLiAjIworCitHb29nbGUgTW9jayB3b3JrcyBvdXQgb2YgdGhlIGJveCB3aXRoIEdvb2dsZSBUZXN0LiAgSG93ZXZlciwgaXQncyBlYXN5Cit0byBjb25maWd1cmUgaXQgdG8gd29yayB3aXRoIGFueSB0ZXN0aW5nIGZyYW1ld29yayBvZiB5b3VyIGNob2ljZS4KK1tIZXJlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL1YxXzdfRm9yRHVtbWllcyNVc2luZ19Hb29nbGVfTW9ja193aXRoX0FueV9UZXN0aW5nX0ZyYW1ld29yaykgaXMgaG93LgorCisjIyBIb3cgYW0gSSBzdXBwb3NlZCB0byBtYWtlIHNlbnNlIG9mIHRoZXNlIGhvcnJpYmxlIHRlbXBsYXRlIGVycm9ycz8gIyMKKworSWYgeW91IGFyZSBjb25mdXNlZCBieSB0aGUgY29tcGlsZXIgZXJyb3JzIGdjYyB0aHJldyBhdCB5b3UsCit0cnkgY29uc3VsdGluZyB0aGUgX0dvb2dsZSBNb2NrIERvY3Rvcl8gdG9vbCBmaXJzdC4gIFdoYXQgaXQgZG9lcyBpcyB0bworc2NhbiBzdGRpbiBmb3IgZ2NjIGVycm9yIG1lc3NhZ2VzLCBhbmQgc3BpdCBvdXQgZGlhZ25vc2VzIG9uIHRoZQorcHJvYmxlbXMgKHdlIGNhbGwgdGhlbSBkaXNlYXNlcykgeW91ciBjb2RlIGhhcy4KKworVG8gImluc3RhbGwiLCBydW4gY29tbWFuZDoKK2BgYAorYWxpYXMgZ21kPSc8cGF0aCB0byBnb29nbGVtb2NrPi9zY3JpcHRzL2dtb2NrX2RvY3Rvci5weScKK2BgYAorCitUbyB1c2UgaXQsIGRvOgorYGBgCis8eW91ci1mYXZvcml0ZS1idWlsZC1jb21tYW5kPiA8eW91ci10ZXN0PiAyPiYxIHwgZ21kCitgYGAKKworRm9yIGV4YW1wbGU6CitgYGAKK21ha2UgbXlfdGVzdCAyPiYxIHwgZ21kCitgYGAKKworT3IgeW91IGNhbiBydW4gYGdtZGAgYW5kIGNvcHktbi1wYXN0ZSBnY2MncyBlcnJvciBtZXNzYWdlcyB0byBpdC4KKworIyMgQ2FuIEkgbW9jayBhIHZhcmlhZGljIGZ1bmN0aW9uPyAjIworCitZb3UgY2Fubm90IG1vY2sgYSB2YXJpYWRpYyBmdW5jdGlvbiAoaS5lLiBhIGZ1bmN0aW9uIHRha2luZyBlbGxpcHNpcworKGAuLi5gKSBhcmd1bWVudHMpIGRpcmVjdGx5IGluIEdvb2dsZSBNb2NrLgorCitUaGUgcHJvYmxlbSBpcyB0aGF0IGluIGdlbmVyYWwsIHRoZXJlIGlzIF9ubyB3YXlfIGZvciBhIG1vY2sgb2JqZWN0IHRvCitrbm93IGhvdyBtYW55IGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSB2YXJpYWRpYyBtZXRob2QsIGFuZCB3aGF0Cit0aGUgYXJndW1lbnRzJyB0eXBlcyBhcmUuICBPbmx5IHRoZSBfYXV0aG9yIG9mIHRoZSBiYXNlIGNsYXNzXyBrbm93cwordGhlIHByb3RvY29sLCBhbmQgd2UgY2Fubm90IGxvb2sgaW50byBoaXMgaGVhZC4KKworVGhlcmVmb3JlLCB0byBtb2NrIHN1Y2ggYSBmdW5jdGlvbiwgdGhlIF91c2VyXyBtdXN0IHRlYWNoIHRoZSBtb2NrCitvYmplY3QgaG93IHRvIGZpZ3VyZSBvdXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYW5kIHRoZWlyIHR5cGVzLiAgT25lCit3YXkgdG8gZG8gaXQgaXMgdG8gcHJvdmlkZSBvdmVybG9hZGVkIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbi4KKworRWxsaXBzaXMgYXJndW1lbnRzIGFyZSBpbmhlcml0ZWQgZnJvbSBDIGFuZCBub3QgcmVhbGx5IGEgQysrIGZlYXR1cmUuCitUaGV5IGFyZSB1bnNhZmUgdG8gdXNlIGFuZCBkb24ndCB3b3JrIHdpdGggYXJndW1lbnRzIHRoYXQgaGF2ZQorY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzLiAgVGhlcmVmb3JlIHdlIHJlY29tbWVuZCB0byBhdm9pZCB0aGVtIGluCitDKysgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKworIyMgTVNWQyBnaXZlcyBtZSB3YXJuaW5nIEM0MzAxIG9yIEM0MzczIHdoZW4gSSBkZWZpbmUgYSBtb2NrIG1ldGhvZCB3aXRoIGEgY29uc3QgcGFyYW1ldGVyLiAgV2h5PyAjIworCitJZiB5b3UgY29tcGlsZSB0aGlzIHVzaW5nIE1pY3Jvc29mdCBWaXN1YWwgQysrIDIwMDUgU1AxOgorYGBgCitjbGFzcyBGb28geworICAuLi4KKyAgdmlydHVhbCB2b2lkIEJhcihjb25zdCBpbnQgaSkgPSAwOworfTsKKworY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28geworICAuLi4KKyAgTU9DS19NRVRIT0QxKEJhciwgdm9pZChjb25zdCBpbnQgaSkpOworfTsKK2BgYAorWW91IG1heSBnZXQgdGhlIGZvbGxvd2luZyB3YXJuaW5nOgorYGBgCit3YXJuaW5nIEM0MzAxOiAnTW9ja0Zvbzo6QmFyJzogb3ZlcnJpZGluZyB2aXJ0dWFsIGZ1bmN0aW9uIG9ubHkgZGlmZmVycyBmcm9tICdGb286OkJhcicgYnkgY29uc3Qvdm9sYXRpbGUgcXVhbGlmaWVyCitgYGAKKworVGhpcyBpcyBhIE1TVkMgYnVnLiAgVGhlIHNhbWUgY29kZSBjb21waWxlcyBmaW5lIHdpdGggZ2NjICxmb3IKK2V4YW1wbGUuICBJZiB5b3UgdXNlIFZpc3VhbCBDKysgMjAwOCBTUDEsIHlvdSB3b3VsZCBnZXQgdGhlIHdhcm5pbmc6CitgYGAKK3dhcm5pbmcgQzQzNzM6ICdNb2NrRm9vOjpCYXInOiB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRlcyAnRm9vOjpCYXInLCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIgZGlkIG5vdCBvdmVycmlkZSB3aGVuIHBhcmFtZXRlcnMgb25seSBkaWZmZXJlZCBieSBjb25zdC92b2xhdGlsZSBxdWFsaWZpZXJzCitgYGAKKworSW4gQysrLCBpZiB5b3UgX2RlY2xhcmVfIGEgZnVuY3Rpb24gd2l0aCBhIGBjb25zdGAgcGFyYW1ldGVyLCB0aGUKK2Bjb25zdGAgbW9kaWZpZXIgaXMgX2lnbm9yZWRfLiAgVGhlcmVmb3JlLCB0aGUgYEZvb2AgYmFzZSBjbGFzcyBhYm92ZQoraXMgZXF1aXZhbGVudCB0bzoKK2BgYAorY2xhc3MgRm9vIHsKKyAgLi4uCisgIHZpcnR1YWwgdm9pZCBCYXIoaW50IGkpID0gMDsgIC8vIGludCBvciBjb25zdCBpbnQ/ICBNYWtlcyBubyBkaWZmZXJlbmNlLgorfTsKK2BgYAorCitJbiBmYWN0LCB5b3UgY2FuIF9kZWNsYXJlXyBCYXIoKSB3aXRoIGFuIGBpbnRgIHBhcmFtZXRlciwgYW5kIF9kZWZpbmVfCitpdCB3aXRoIGEgYGNvbnN0IGludGAgcGFyYW1ldGVyLiAgVGhlIGNvbXBpbGVyIHdpbGwgc3RpbGwgbWF0Y2ggdGhlbQordXAuCisKK1NpbmNlIG1ha2luZyBhIHBhcmFtZXRlciBgY29uc3RgIGlzIG1lYW5pbmdsZXNzIGluIHRoZSBtZXRob2QKK19kZWNsYXJhdGlvbl8sIHdlIHJlY29tbWVuZCB0byByZW1vdmUgaXQgaW4gYm90aCBgRm9vYCBhbmQgYE1vY2tGb29gLgorVGhhdCBzaG91bGQgd29ya2Fyb3VuZCB0aGUgVkMgYnVnLgorCitOb3RlIHRoYXQgd2UgYXJlIHRhbGtpbmcgYWJvdXQgdGhlIF90b3AtbGV2ZWxfIGBjb25zdGAgbW9kaWZpZXIgaGVyZS4KK0lmIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgb3IgcmVmZXJlbmNlLCBkZWNsYXJpbmcKK3RoZSBfcG9pbnRlZV8gb3IgX3JlZmVyZWVfIGFzIGBjb25zdGAgaXMgc3RpbGwgbWVhbmluZ2Z1bC4gIEZvcgorZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0d28gZGVjbGFyYXRpb25zIGFyZSBfbm90XyBlcXVpdmFsZW50OgorYGBgCit2b2lkIEJhcihpbnQqIHApOyAgICAgICAgLy8gTmVpdGhlciBwIG5vciAqcCBpcyBjb25zdC4KK3ZvaWQgQmFyKGNvbnN0IGludCogcCk7ICAvLyBwIGlzIG5vdCBjb25zdCwgYnV0ICpwIGlzLgorYGBgCisKKyMjIEkgaGF2ZSBhIGh1Z2UgbW9jayBjbGFzcywgYW5kIE1pY3Jvc29mdCBWaXN1YWwgQysrIHJ1bnMgb3V0IG9mIG1lbW9yeSB3aGVuIGNvbXBpbGluZyBpdC4gIFdoYXQgY2FuIEkgZG8/ICMjCisKK1dlJ3ZlIG5vdGljZWQgdGhhdCB3aGVuIHRoZSBgL2NscmAgY29tcGlsZXIgZmxhZyBpcyB1c2VkLCBWaXN1YWwgQysrCit1c2VzIDV+NiB0aW1lcyBhcyBtdWNoIG1lbW9yeSB3aGVuIGNvbXBpbGluZyBhIG1vY2sgY2xhc3MuICBXZSBzdWdnZXN0Cit0byBhdm9pZCBgL2NscmAgd2hlbiBjb21waWxpbmcgbmF0aXZlIEMrKyBtb2Nrcy4KKworIyMgSSBjYW4ndCBmaWd1cmUgb3V0IHdoeSBHb29nbGUgTW9jayB0aGlua3MgbXkgZXhwZWN0YXRpb25zIGFyZSBub3Qgc2F0aXNmaWVkLiAgV2hhdCBzaG91bGQgSSBkbz8gIyMKKworWW91IG1pZ2h0IHdhbnQgdG8gcnVuIHlvdXIgdGVzdCB3aXRoCitgLS1nbW9ja192ZXJib3NlPWluZm9gLiAgVGhpcyBmbGFnIGxldHMgR29vZ2xlIE1vY2sgcHJpbnQgYSB0cmFjZQorb2YgZXZlcnkgbW9jayBmdW5jdGlvbiBjYWxsIGl0IHJlY2VpdmVzLiAgQnkgc3R1ZHlpbmcgdGhlIHRyYWNlLAoreW91J2xsIGdhaW4gaW5zaWdodHMgb24gd2h5IHRoZSBleHBlY3RhdGlvbnMgeW91IHNldCBhcmUgbm90IG1ldC4KKworIyMgSG93IGNhbiBJIGFzc2VydCB0aGF0IGEgZnVuY3Rpb24gaXMgTkVWRVIgY2FsbGVkPyAjIworCitgYGAKK0VYUEVDVF9DQUxMKGZvbywgQmFyKF8pKQorICAgIC5UaW1lcygwKTsKK2BgYAorCisjIyBJIGhhdmUgYSBmYWlsZWQgdGVzdCB3aGVyZSBHb29nbGUgTW9jayB0ZWxscyBtZSBUV0lDRSB0aGF0IGEgcGFydGljdWxhciBleHBlY3RhdGlvbiBpcyBub3Qgc2F0aXNmaWVkLiAgSXNuJ3QgdGhpcyByZWR1bmRhbnQ/ICMjCisKK1doZW4gR29vZ2xlIE1vY2sgZGV0ZWN0cyBhIGZhaWx1cmUsIGl0IHByaW50cyByZWxldmFudCBpbmZvcm1hdGlvbgorKHRoZSBtb2NrIGZ1bmN0aW9uIGFyZ3VtZW50cywgdGhlIHN0YXRlIG9mIHJlbGV2YW50IGV4cGVjdGF0aW9ucywgYW5kCitldGMpIHRvIGhlbHAgdGhlIHVzZXIgZGVidWcuICBJZiBhbm90aGVyIGZhaWx1cmUgaXMgZGV0ZWN0ZWQsIEdvb2dsZQorTW9jayB3aWxsIGRvIHRoZSBzYW1lLCBpbmNsdWRpbmcgcHJpbnRpbmcgdGhlIHN0YXRlIG9mIHJlbGV2YW50CitleHBlY3RhdGlvbnMuCisKK1NvbWV0aW1lcyBhbiBleHBlY3RhdGlvbidzIHN0YXRlIGRpZG4ndCBjaGFuZ2UgYmV0d2VlbiB0d28gZmFpbHVyZXMsCithbmQgeW91J2xsIHNlZSB0aGUgc2FtZSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RhdGUgdHdpY2UuICBUaGV5IGFyZQoraG93ZXZlciBfbm90XyByZWR1bmRhbnQsIGFzIHRoZXkgcmVmZXIgdG8gX2RpZmZlcmVudCBwb2ludHMgaW4gdGltZV8uCitUaGUgZmFjdCB0aGV5IGFyZSB0aGUgc2FtZSBfaXNfIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLgorCisjIyBJIGdldCBhIGhlYXAgY2hlY2sgZmFpbHVyZSB3aGVuIHVzaW5nIGEgbW9jayBvYmplY3QsIGJ1dCB1c2luZyBhIHJlYWwgb2JqZWN0IGlzIGZpbmUuICBXaGF0IGNhbiBiZSB3cm9uZz8gIyMKKworRG9lcyB0aGUgY2xhc3MgKGhvcGVmdWxseSBhIHB1cmUgaW50ZXJmYWNlKSB5b3UgYXJlIG1vY2tpbmcgaGF2ZSBhCit2aXJ0dWFsIGRlc3RydWN0b3I/CisKK1doZW5ldmVyIHlvdSBkZXJpdmUgZnJvbSBhIGJhc2UgY2xhc3MsIG1ha2Ugc3VyZSBpdHMgZGVzdHJ1Y3RvciBpcwordmlydHVhbC4gIE90aGVyd2lzZSBCYWQgVGhpbmdzIHdpbGwgaGFwcGVuLiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZworY29kZToKKworYGBgCitjbGFzcyBCYXNlIHsKKyBwdWJsaWM6CisgIC8vIE5vdCB2aXJ0dWFsLCBidXQgc2hvdWxkIGJlLgorICB+QmFzZSgpIHsgLi4uIH0KKyAgLi4uCit9OworCitjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgeworIHB1YmxpYzoKKyAgLi4uCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgdmFsdWVfOworfTsKKworLi4uCisgIEJhc2UqIHAgPSBuZXcgRGVyaXZlZDsKKyAgLi4uCisgIGRlbGV0ZSBwOyAgLy8gU3VycHJpc2UhIH5CYXNlKCkgd2lsbCBiZSBjYWxsZWQsIGJ1dCB+RGVyaXZlZCgpIHdpbGwgbm90CisgICAgICAgICAgICAgLy8gLSB2YWx1ZV8gaXMgbGVha2VkLgorYGBgCisKK0J5IGNoYW5naW5nIGB+QmFzZSgpYCB0byB2aXJ0dWFsLCBgfkRlcml2ZWQoKWAgd2lsbCBiZSBjb3JyZWN0bHkKK2NhbGxlZCB3aGVuIGBkZWxldGUgcGAgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgaGVhcCBjaGVja2VyCit3aWxsIGJlIGhhcHB5LgorCisjIyBUaGUgIm5ld2VyIGV4cGVjdGF0aW9ucyBvdmVycmlkZSBvbGRlciBvbmVzIiBydWxlIG1ha2VzIHdyaXRpbmcgZXhwZWN0YXRpb25zIGF3a3dhcmQuICBXaHkgZG9lcyBHb29nbGUgTW9jayBkbyB0aGF0PyAjIworCitXaGVuIHBlb3BsZSBjb21wbGFpbiBhYm91dCB0aGlzLCBvZnRlbiB0aGV5IGFyZSByZWZlcnJpbmcgdG8gY29kZSBsaWtlOgorCitgYGAKKy8vIGZvby5CYXIoKSBzaG91bGQgYmUgY2FsbGVkIHR3aWNlLCByZXR1cm4gMSB0aGUgZmlyc3QgdGltZSwgYW5kIHJldHVybgorLy8gMiB0aGUgc2Vjb25kIHRpbWUuICBIb3dldmVyLCBJIGhhdmUgdG8gd3JpdGUgdGhlIGV4cGVjdGF0aW9ucyBpbiB0aGUKKy8vIHJldmVyc2Ugb3JkZXIuICBUaGlzIHN1Y2tzIGJpZyB0aW1lISEhCitFWFBFQ1RfQ0FMTChmb28sIEJhcigpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMikpCisgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK0VYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworYGBgCisKK1RoZSBwcm9ibGVtIGlzIHRoYXQgdGhleSBkaWRuJ3QgcGljayB0aGUgKipiZXN0Kiogd2F5IHRvIGV4cHJlc3MgdGhlIHRlc3QncworaW50ZW50LgorCitCeSBkZWZhdWx0LCBleHBlY3RhdGlvbnMgZG9uJ3QgaGF2ZSB0byBiZSBtYXRjaGVkIGluIF9hbnlfIHBhcnRpY3VsYXIKK29yZGVyLiAgSWYgeW91IHdhbnQgdGhlbSB0byBtYXRjaCBpbiBhIGNlcnRhaW4gb3JkZXIsIHlvdSBuZWVkIHRvIGJlCitleHBsaWNpdC4gIFRoaXMgaXMgR29vZ2xlIE1vY2sncyAoYW5kIGpNb2NrJ3MpIGZ1bmRhbWVudGFsIHBoaWxvc29waHk6IGl0J3MKK2Vhc3kgdG8gYWNjaWRlbnRhbGx5IG92ZXItc3BlY2lmeSB5b3VyIHRlc3RzLCBhbmQgd2Ugd2FudCB0byBtYWtlIGl0CitoYXJkZXIgdG8gZG8gc28uCisKK1RoZXJlIGFyZSB0d28gYmV0dGVyIHdheXMgdG8gd3JpdGUgdGhlIHRlc3Qgc3BlYy4gIFlvdSBjb3VsZCBlaXRoZXIKK3B1dCB0aGUgZXhwZWN0YXRpb25zIGluIHNlcXVlbmNlOgorCitgYGAKKy8vIGZvby5CYXIoKSBzaG91bGQgYmUgY2FsbGVkIHR3aWNlLCByZXR1cm4gMSB0aGUgZmlyc3QgdGltZSwgYW5kIHJldHVybgorLy8gMiB0aGUgc2Vjb25kIHRpbWUuICBVc2luZyBhIHNlcXVlbmNlLCB3ZSBjYW4gd3JpdGUgdGhlIGV4cGVjdGF0aW9ucworLy8gaW4gdGhlaXIgbmF0dXJhbCBvcmRlci4KK3sKKyAgSW5TZXF1ZW5jZSBzOworICBFWFBFQ1RfQ0FMTChmb28sIEJhcigpKQorICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisgIEVYUEVDVF9DQUxMKGZvbywgQmFyKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKQorICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK30KK2BgYAorCitvciB5b3UgY2FuIHB1dCB0aGUgc2VxdWVuY2Ugb2YgYWN0aW9ucyBpbiB0aGUgc2FtZSBleHBlY3RhdGlvbjoKKworYGBgCisvLyBmb28uQmFyKCkgc2hvdWxkIGJlIGNhbGxlZCB0d2ljZSwgcmV0dXJuIDEgdGhlIGZpcnN0IHRpbWUsIGFuZCByZXR1cm4KKy8vIDIgdGhlIHNlY29uZCB0aW1lLgorRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkKKyAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgIC5XaWxsT25jZShSZXR1cm4oMikpCisgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKK2BgYAorCitCYWNrIHRvIHRoZSBvcmlnaW5hbCBxdWVzdGlvbnM6IHdoeSBkb2VzIEdvb2dsZSBNb2NrIHNlYXJjaCB0aGUKK2V4cGVjdGF0aW9ucyAoYW5kIGBPTl9DQUxMYHMpIGZyb20gYmFjayB0byBmcm9udD8gIEJlY2F1c2UgdGhpcworYWxsb3dzIGEgdXNlciB0byBzZXQgdXAgYSBtb2NrJ3MgYmVoYXZpb3IgZm9yIHRoZSBjb21tb24gY2FzZSBlYXJseQorKGUuZy4gaW4gdGhlIG1vY2sncyBjb25zdHJ1Y3RvciBvciB0aGUgdGVzdCBmaXh0dXJlJ3Mgc2V0LXVwIHBoYXNlKQorYW5kIGN1c3RvbWl6ZSBpdCB3aXRoIG1vcmUgc3BlY2lmaWMgcnVsZXMgbGF0ZXIuICBJZiBHb29nbGUgTW9jaworc2VhcmNoZXMgZnJvbSBmcm9udCB0byBiYWNrLCB0aGlzIHZlcnkgdXNlZnVsIHBhdHRlcm4gd29uJ3QgYmUKK3Bvc3NpYmxlLgorCisjIyBHb29nbGUgTW9jayBwcmludHMgYSB3YXJuaW5nIHdoZW4gYSBmdW5jdGlvbiB3aXRob3V0IEVYUEVDVFxfQ0FMTCBpcyBjYWxsZWQsIGV2ZW4gaWYgSSBoYXZlIHNldCBpdHMgYmVoYXZpb3IgdXNpbmcgT05cX0NBTEwuICBXb3VsZCBpdCBiZSByZWFzb25hYmxlIG5vdCB0byBzaG93IHRoZSB3YXJuaW5nIGluIHRoaXMgY2FzZT8gIyMKKworV2hlbiBjaG9vc2luZyBiZXR3ZWVuIGJlaW5nIG5lYXQgYW5kIGJlaW5nIHNhZmUsIHdlIGxlYW4gdG93YXJkIHRoZQorbGF0dGVyLiAgU28gdGhlIGFuc3dlciBpcyB0aGF0IHdlIHRoaW5rIGl0J3MgYmV0dGVyIHRvIHNob3cgdGhlCit3YXJuaW5nLgorCitPZnRlbiBwZW9wbGUgd3JpdGUgYE9OX0NBTExgcyBpbiB0aGUgbW9jayBvYmplY3QncworY29uc3RydWN0b3Igb3IgYFNldFVwKClgLCBhcyB0aGUgZGVmYXVsdCBiZWhhdmlvciByYXJlbHkgY2hhbmdlcyBmcm9tCit0ZXN0IHRvIHRlc3QuICBUaGVuIGluIHRoZSB0ZXN0IGJvZHkgdGhleSBzZXQgdGhlIGV4cGVjdGF0aW9ucywgd2hpY2gKK2FyZSBvZnRlbiBkaWZmZXJlbnQgZm9yIGVhY2ggdGVzdC4gIEhhdmluZyBhbiBgT05fQ0FMTGAgaW4gdGhlIHNldC11cAorcGFydCBvZiBhIHRlc3QgZG9lc24ndCBtZWFuIHRoYXQgdGhlIGNhbGxzIGFyZSBleHBlY3RlZC4gIElmIHRoZXJlJ3MKK25vIGBFWFBFQ1RfQ0FMTGAgYW5kIHRoZSBtZXRob2QgaXMgY2FsbGVkLCBpdCdzIHBvc3NpYmx5IGFuIGVycm9yLiAgSWYKK3dlIHF1aWV0bHkgbGV0IHRoZSBjYWxsIGdvIHRocm91Z2ggd2l0aG91dCBub3RpZnlpbmcgdGhlIHVzZXIsIGJ1Z3MKK21heSBjcmVlcCBpbiB1bm5vdGljZWQuCisKK0lmLCBob3dldmVyLCB5b3UgYXJlIHN1cmUgdGhhdCB0aGUgY2FsbHMgYXJlIE9LLCB5b3UgY2FuIHdyaXRlCisKK2BgYAorRVhQRUNUX0NBTEwoZm9vLCBCYXIoXykpCisgICAgLldpbGxSZXBlYXRlZGx5KC4uLik7CitgYGAKKworaW5zdGVhZCBvZgorCitgYGAKK09OX0NBTEwoZm9vLCBCYXIoXykpCisgICAgLldpbGxCeURlZmF1bHQoLi4uKTsKK2BgYAorCitUaGlzIHRlbGxzIEdvb2dsZSBNb2NrIHRoYXQgeW91IGRvIGV4cGVjdCB0aGUgY2FsbHMgYW5kIG5vIHdhcm5pbmcgc2hvdWxkIGJlCitwcmludGVkLgorCitBbHNvLCB5b3UgY2FuIGNvbnRyb2wgdGhlIHZlcmJvc2l0eSB1c2luZyB0aGUgYC0tZ21vY2tfdmVyYm9zZWAgZmxhZy4KK0lmIHlvdSBmaW5kIHRoZSBvdXRwdXQgdG9vIG5vaXN5IHdoZW4gZGVidWdnaW5nLCBqdXN0IGNob29zZSBhIGxlc3MKK3ZlcmJvc2UgbGV2ZWwuCisKKyMjIEhvdyBjYW4gSSBkZWxldGUgdGhlIG1vY2sgZnVuY3Rpb24ncyBhcmd1bWVudCBpbiBhbiBhY3Rpb24/ICMjCisKK0lmIHlvdSBmaW5kIHlvdXJzZWxmIG5lZWRpbmcgdG8gcGVyZm9ybSBzb21lIGFjdGlvbiB0aGF0J3Mgbm90CitzdXBwb3J0ZWQgYnkgR29vZ2xlIE1vY2sgZGlyZWN0bHksIHJlbWVtYmVyIHRoYXQgeW91IGNhbiBkZWZpbmUgeW91ciBvd24KK2FjdGlvbnMgdXNpbmcKK1tNYWtlQWN0aW9uKCldKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfN19Db29rQm9vayNXcml0aW5nX05ld19BY3Rpb25zKSBvcgorW01ha2VQb2x5bW9ycGhpY0FjdGlvbigpXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL1YxXzdfQ29va0Jvb2sjV3JpdGluZ19OZXdfUG9seW1vcnBoaWNfQWN0aW9ucyksCitvciB5b3UgY2FuIHdyaXRlIGEgc3R1YiBmdW5jdGlvbiBhbmQgaW52b2tlIGl0IHVzaW5nCitbSW52b2tlKCldKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfN19Db29rQm9vayNVc2luZ19GdW5jdGlvbnNfTWV0aG9kc19GdW5jdG9ycykuCisKKyMjIE1PQ0tcX01FVEhPRG4oKSdzIHNlY29uZCBhcmd1bWVudCBsb29rcyBmdW5ueS4gIFdoeSBkb24ndCB5b3UgdXNlIHRoZSBNT0NLXF9NRVRIT0RuKE1ldGhvZCwgcmV0dXJuXF90eXBlLCBhcmdcXzEsIC4uLiwgYXJnXF9uKSBzeW50YXg/ICMjCisKK1doYXQ/ISAgSSB0aGluayBpdCdzIGJlYXV0aWZ1bC4gOi0pCisKK1doaWxlIHdoaWNoIHN5bnRheCBsb29rcyBtb3JlIG5hdHVyYWwgaXMgYSBzdWJqZWN0aXZlIG1hdHRlciB0byBzb21lCitleHRlbnQsIEdvb2dsZSBNb2NrJ3Mgc3ludGF4IHdhcyBjaG9zZW4gZm9yIHNldmVyYWwgcHJhY3RpY2FsIGFkdmFudGFnZXMgaXQKK2hhcy4KKworVHJ5IHRvIG1vY2sgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgbWFwIGFzIGFuIGFyZ3VtZW50OgorYGBgCit2aXJ0dWFsIGludCBHZXRTaXplKGNvbnN0IG1hcDxpbnQsIHN0ZDo6c3RyaW5nPiYgbSk7CitgYGAKKworVXNpbmcgdGhlIHByb3Bvc2VkIHN5bnRheCwgaXQgd291bGQgYmU6CitgYGAKK01PQ0tfTUVUSE9EMShHZXRTaXplLCBpbnQsIGNvbnN0IG1hcDxpbnQsIHN0ZDo6c3RyaW5nPiYgbSk7CitgYGAKKworR3Vlc3Mgd2hhdD8gIFlvdSdsbCBnZXQgYSBjb21waWxlciBlcnJvciBhcyB0aGUgY29tcGlsZXIgdGhpbmtzIHRoYXQKK2Bjb25zdCBtYXA8aW50LCBzdGQ6OnN0cmluZz4mIG1gIGFyZSAqKnR3byoqLCBub3Qgb25lLCBhcmd1bWVudHMuIFRvIHdvcmsKK2Fyb3VuZCB0aGlzIHlvdSBjYW4gdXNlIGB0eXBlZGVmYCB0byBnaXZlIHRoZSBtYXAgdHlwZSBhIG5hbWUsIGJ1dAordGhhdCBnZXRzIGluIHRoZSB3YXkgb2YgeW91ciB3b3JrLiAgR29vZ2xlIE1vY2sncyBzeW50YXggYXZvaWRzIHRoaXMKK3Byb2JsZW0gYXMgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnQgdHlwZXMgYXJlIHByb3RlY3RlZCBpbnNpZGUgYSBwYWlyCitvZiBwYXJlbnRoZXNlczoKK2BgYAorLy8gVGhpcyBjb21waWxlcyBmaW5lLgorTU9DS19NRVRIT0QxKEdldFNpemUsIGludChjb25zdCBtYXA8aW50LCBzdGQ6OnN0cmluZz4mIG0pKTsKK2BgYAorCitZb3Ugc3RpbGwgbmVlZCBhIGB0eXBlZGVmYCBpZiB0aGUgcmV0dXJuIHR5cGUgY29udGFpbnMgYW4gdW5wcm90ZWN0ZWQKK2NvbW1hLCBidXQgdGhhdCdzIG11Y2ggcmFyZXIuCisKK090aGVyIGFkdmFudGFnZXMgaW5jbHVkZToKKyAgMS4gYE1PQ0tfTUVUSE9EMShGb28sIGludCwgYm9vbClgIGNhbiBsZWF2ZSBhIHJlYWRlciB3b25kZXIgd2hldGhlciB0aGUgbWV0aG9kIHJldHVybnMgYGludGAgb3IgYGJvb2xgLCB3aGlsZSB0aGVyZSB3b24ndCBiZSBzdWNoIGNvbmZ1c2lvbiB1c2luZyBHb29nbGUgTW9jaydzIHN5bnRheC4KKyAgMS4gVGhlIHdheSBHb29nbGUgTW9jayBkZXNjcmliZXMgYSBmdW5jdGlvbiB0eXBlIGlzIG5vdGhpbmcgbmV3LCBhbHRob3VnaCBtYW55IHBlb3BsZSBtYXkgbm90IGJlIGZhbWlsaWFyIHdpdGggaXQuICBUaGUgc2FtZSBzeW50YXggd2FzIHVzZWQgaW4gQywgYW5kIHRoZSBgZnVuY3Rpb25gIGxpYnJhcnkgaW4gYHRyMWAgdXNlcyB0aGlzIHN5bnRheCBleHRlbnNpdmVseS4gIFNpbmNlIGB0cjFgIHdpbGwgYmVjb21lIGEgcGFydCBvZiB0aGUgbmV3IHZlcnNpb24gb2YgU1RMLCB3ZSBmZWVsIHZlcnkgY29tZm9ydGFibGUgdG8gYmUgY29uc2lzdGVudCB3aXRoIGl0LgorICAxLiBUaGUgZnVuY3Rpb24gdHlwZSBzeW50YXggaXMgYWxzbyB1c2VkIGluIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBNb2NrJ3MgQVBJIChlLmcuIHRoZSBhY3Rpb24gaW50ZXJmYWNlKSBpbiBvcmRlciB0byBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiB0cmFjdGFibGUuIEEgdXNlciBuZWVkcyB0byBsZWFybiBpdCBhbnl3YXkgaW4gb3JkZXIgdG8gdXRpbGl6ZSBHb29nbGUgTW9jaydzIG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMuICBXZSdkIGFzIHdlbGwgc3RpY2sgdG8gdGhlIHNhbWUgc3ludGF4IGluIGBNT0NLX01FVEhPRCpgIQorCisjIyBNeSBjb2RlIGNhbGxzIGEgc3RhdGljL2dsb2JhbCBmdW5jdGlvbi4gIENhbiBJIG1vY2sgaXQ/ICMjCisKK1lvdSBjYW4sIGJ1dCB5b3UgbmVlZCB0byBtYWtlIHNvbWUgY2hhbmdlcy4KKworSW4gZ2VuZXJhbCwgaWYgeW91IGZpbmQgeW91cnNlbGYgbmVlZGluZyB0byBtb2NrIGEgc3RhdGljIGZ1bmN0aW9uLAoraXQncyBhIHNpZ24gdGhhdCB5b3VyIG1vZHVsZXMgYXJlIHRvbyB0aWdodGx5IGNvdXBsZWQgKGFuZCBsZXNzCitmbGV4aWJsZSwgbGVzcyByZXVzYWJsZSwgbGVzcyB0ZXN0YWJsZSwgZXRjKS4gIFlvdSBhcmUgcHJvYmFibHkgYmV0dGVyCitvZmYgZGVmaW5pbmcgYSBzbWFsbCBpbnRlcmZhY2UgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uIHRocm91Z2ggdGhhdAoraW50ZXJmYWNlLCB3aGljaCB0aGVuIGNhbiBiZSBlYXNpbHkgbW9ja2VkLiAgSXQncyBhIGJpdCBvZiB3b3JrCitpbml0aWFsbHksIGJ1dCB1c3VhbGx5IHBheXMgZm9yIGl0c2VsZiBxdWlja2x5LgorCitUaGlzIEdvb2dsZSBUZXN0aW5nIEJsb2cKK1twb3N0XShodHRwOi8vZ29vZ2xldGVzdGluZy5ibG9nc3BvdC5jb20vMjAwOC8wNi9kZWZlYXQtc3RhdGljLWNsaW5nLmh0bWwpCitzYXlzIGl0IGV4Y2VsbGVudGx5LiAgQ2hlY2sgaXQgb3V0LgorCisjIyBNeSBtb2NrIG9iamVjdCBuZWVkcyB0byBkbyBjb21wbGV4IHN0dWZmLiAgSXQncyBhIGxvdCBvZiBwYWluIHRvIHNwZWNpZnkgdGhlIGFjdGlvbnMuICBHb29nbGUgTW9jayBzdWNrcyEgIyMKKworSSBrbm93IGl0J3Mgbm90IGEgcXVlc3Rpb24sIGJ1dCB5b3UgZ2V0IGFuIGFuc3dlciBmb3IgZnJlZSBhbnkgd2F5LiA6LSkKKworV2l0aCBHb29nbGUgTW9jaywgeW91IGNhbiBjcmVhdGUgbW9ja3MgaW4gQysrIGVhc2lseS4gIEFuZCBwZW9wbGUgbWlnaHQgYmUKK3RlbXB0ZWQgdG8gdXNlIHRoZW0gZXZlcnl3aGVyZS4gU29tZXRpbWVzIHRoZXkgd29yayBncmVhdCwgYW5kCitzb21ldGltZXMgeW91IG1heSBmaW5kIHRoZW0sIHdlbGwsIGEgcGFpbiB0byB1c2UuIFNvLCB3aGF0J3Mgd3JvbmcgaW4KK3RoZSBsYXR0ZXIgY2FzZT8KKworV2hlbiB5b3Ugd3JpdGUgYSB0ZXN0IHdpdGhvdXQgdXNpbmcgbW9ja3MsIHlvdSBleGVyY2lzZSB0aGUgY29kZSBhbmQKK2Fzc2VydCB0aGF0IGl0IHJldHVybnMgdGhlIGNvcnJlY3QgdmFsdWUgb3IgdGhhdCB0aGUgc3lzdGVtIGlzIGluIGFuCitleHBlY3RlZCBzdGF0ZS4gIFRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCAic3RhdGUtYmFzZWQgdGVzdGluZyIuCisKK01vY2tzIGFyZSBncmVhdCBmb3Igd2hhdCBzb21lIGNhbGwgImludGVyYWN0aW9uLWJhc2VkIiB0ZXN0aW5nOgoraW5zdGVhZCBvZiBjaGVja2luZyB0aGUgc3lzdGVtIHN0YXRlIGF0IHRoZSB2ZXJ5IGVuZCwgbW9jayBvYmplY3RzCit2ZXJpZnkgdGhhdCB0aGV5IGFyZSBpbnZva2VkIHRoZSByaWdodCB3YXkgYW5kIHJlcG9ydCBhbiBlcnJvciBhcyBzb29uCithcyBpdCBhcmlzZXMsIGdpdmluZyB5b3UgYSBoYW5kbGUgb24gdGhlIHByZWNpc2UgY29udGV4dCBpbiB3aGljaCB0aGUKK2Vycm9yIHdhcyB0cmlnZ2VyZWQuICBUaGlzIGlzIG9mdGVuIG1vcmUgZWZmZWN0aXZlIGFuZCBlY29ub21pY2FsIHRvCitkbyB0aGFuIHN0YXRlLWJhc2VkIHRlc3RpbmcuCisKK0lmIHlvdSBhcmUgZG9pbmcgc3RhdGUtYmFzZWQgdGVzdGluZyBhbmQgdXNpbmcgYSB0ZXN0IGRvdWJsZSBqdXN0IHRvCitzaW11bGF0ZSB0aGUgcmVhbCBvYmplY3QsIHlvdSBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyBhIGZha2UuCitVc2luZyBhIG1vY2sgaW4gdGhpcyBjYXNlIGNhdXNlcyBwYWluLCBhcyBpdCdzIG5vdCBhIHN0cm9uZyBwb2ludCBmb3IKK21vY2tzIHRvIHBlcmZvcm0gY29tcGxleCBhY3Rpb25zLiAgSWYgeW91IGV4cGVyaWVuY2UgdGhpcyBhbmQgdGhpbmsKK3RoYXQgbW9ja3Mgc3VjaywgeW91IGFyZSBqdXN0IG5vdCB1c2luZyB0aGUgcmlnaHQgdG9vbCBmb3IgeW91cgorcHJvYmxlbS4gT3IsIHlvdSBtaWdodCBiZSB0cnlpbmcgdG8gc29sdmUgdGhlIHdyb25nIHByb2JsZW0uIDotKQorCisjIyBJIGdvdCBhIHdhcm5pbmcgIlVuaW50ZXJlc3RpbmcgZnVuY3Rpb24gY2FsbCBlbmNvdW50ZXJlZCAtIGRlZmF1bHQgYWN0aW9uIHRha2VuLi4iICBTaG91bGQgSSBwYW5pYz8gIyMKKworQnkgYWxsIG1lYW5zLCBOTyEgIEl0J3MganVzdCBhbiBGWUkuCisKK1doYXQgaXQgbWVhbnMgaXMgdGhhdCB5b3UgaGF2ZSBhIG1vY2sgZnVuY3Rpb24sIHlvdSBoYXZlbid0IHNldCBhbnkKK2V4cGVjdGF0aW9ucyBvbiBpdCAoYnkgR29vZ2xlIE1vY2sncyBydWxlIHRoaXMgbWVhbnMgdGhhdCB5b3UgYXJlIG5vdAoraW50ZXJlc3RlZCBpbiBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFuZCB0aGVyZWZvcmUgaXQgY2FuIGJlIGNhbGxlZAorYW55IG51bWJlciBvZiB0aW1lcyksIGFuZCBpdCBpcyBjYWxsZWQuICBUaGF0J3MgT0sgLSB5b3UgZGlkbid0IHNheQoraXQncyBub3QgT0sgdG8gY2FsbCB0aGUgZnVuY3Rpb24hCisKK1doYXQgaWYgeW91IGFjdHVhbGx5IG1lYW50IHRvIGRpc2FsbG93IHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLCBidXQKK2ZvcmdvdCB0byB3cml0ZSBgRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSkuVGltZXMoMClgPyAgV2hpbGUKK29uZSBjYW4gYXJndWUgdGhhdCBpdCdzIHRoZSB1c2VyJ3MgZmF1bHQsIEdvb2dsZSBNb2NrIHRyaWVzIHRvIGJlIG5pY2UgYW5kCitwcmludHMgeW91IGEgbm90ZS4KKworU28sIHdoZW4geW91IHNlZSB0aGUgbWVzc2FnZSBhbmQgYmVsaWV2ZSB0aGF0IHRoZXJlIHNob3VsZG4ndCBiZSBhbnkKK3VuaW50ZXJlc3RpbmcgY2FsbHMsIHlvdSBzaG91bGQgaW52ZXN0aWdhdGUgd2hhdCdzIGdvaW5nIG9uLiAgVG8gbWFrZQoreW91ciBsaWZlIGVhc2llciwgR29vZ2xlIE1vY2sgcHJpbnRzIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCBhcmd1bWVudHMKK3doZW4gYW4gdW5pbnRlcmVzdGluZyBjYWxsIGlzIGVuY291bnRlcmVkLgorCisjIyBJIHdhbnQgdG8gZGVmaW5lIGEgY3VzdG9tIGFjdGlvbi4gIFNob3VsZCBJIHVzZSBJbnZva2UoKSBvciBpbXBsZW1lbnQgdGhlIGFjdGlvbiBpbnRlcmZhY2U/ICMjCisKK0VpdGhlciB3YXkgaXMgZmluZSAtIHlvdSB3YW50IHRvIGNob29zZSB0aGUgb25lIHRoYXQncyBtb3JlIGNvbnZlbmllbnQKK2ZvciB5b3VyIGNpcmN1bXN0YW5jZS4KKworVXN1YWxseSwgaWYgeW91ciBhY3Rpb24gaXMgZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlLCBkZWZpbmluZyBpdAordXNpbmcgYEludm9rZSgpYCBzaG91bGQgYmUgZWFzaWVyOyBpZiB5b3VyIGFjdGlvbiBjYW4gYmUgdXNlZCBpbgorZnVuY3Rpb25zIG9mIGRpZmZlcmVudCB0eXBlcyAoZS5nLiBpZiB5b3UgYXJlIGRlZmluaW5nCitgUmV0dXJuKHZhbHVlKWApLCBgTWFrZVBvbHltb3JwaGljQWN0aW9uKClgIGlzCitlYXNpZXN0LiAgU29tZXRpbWVzIHlvdSB3YW50IHByZWNpc2UgY29udHJvbCBvbiB3aGF0IHR5cGVzIG9mCitmdW5jdGlvbnMgdGhlIGFjdGlvbiBjYW4gYmUgdXNlZCBpbiwgYW5kIGltcGxlbWVudGluZworYEFjdGlvbkludGVyZmFjZWAgaXMgdGhlIHdheSB0byBnbyBoZXJlLiBTZWUgdGhlIGltcGxlbWVudGF0aW9uIG9mCitgUmV0dXJuKClgIGluIGBpbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaGAgZm9yIGFuIGV4YW1wbGUuCisKKyMjIEknbSB1c2luZyB0aGUgc2V0LWFyZ3VtZW50LXBvaW50ZWUgYWN0aW9uLCBhbmQgdGhlIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCAiY29uZmxpY3RpbmcgcmV0dXJuIHR5cGUgc3BlY2lmaWVkIi4gIFdoYXQgZG9lcyBpdCBtZWFuPyAjIworCitZb3UgZ290IHRoaXMgZXJyb3IgYXMgR29vZ2xlIE1vY2sgaGFzIG5vIGlkZWEgd2hhdCB2YWx1ZSBpdCBzaG91bGQgcmV0dXJuCit3aGVuIHRoZSBtb2NrIG1ldGhvZCBpcyBjYWxsZWQuICBgU2V0QXJnUG9pbnRlZSgpYCBzYXlzIHdoYXQgdGhlCitzaWRlIGVmZmVjdCBpcywgYnV0IGRvZXNuJ3Qgc2F5IHdoYXQgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUuICBZb3UKK25lZWQgYERvQWxsKClgIHRvIGNoYWluIGEgYFNldEFyZ1BvaW50ZWUoKWAgd2l0aCBhIGBSZXR1cm4oKWAuCisKK1NlZSB0aGlzIFtyZWNpcGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvVjFfN19Db29rQm9vayNNb2NraW5nX1NpZGVfRWZmZWN0cykgZm9yIG1vcmUgZGV0YWlscyBhbmQgYW4gZXhhbXBsZS4KKworCisjIyBNeSBxdWVzdGlvbiBpcyBub3QgaW4geW91ciBGQVEhICMjCisKK0lmIHlvdSBjYW5ub3QgZmluZCB0aGUgYW5zd2VyIHRvIHlvdXIgcXVlc3Rpb24gaW4gdGhpcyBGQVEsIHRoZXJlIGFyZQorc29tZSBvdGhlciByZXNvdXJjZXMgeW91IGNhbiB1c2U6CisKKyAgMS4gcmVhZCBvdGhlciBbd2lraSBwYWdlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svdy9saXN0KSwKKyAgMS4gc2VhcmNoIHRoZSBtYWlsaW5nIGxpc3QgW2FyY2hpdmVdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGVtb2NrL3RvcGljcyksCisgIDEuIGFzayBpdCBvbiBbZ29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tXShtYWlsdG86Z29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tKSBhbmQgc29tZW9uZSB3aWxsIGFuc3dlciBpdCAodG8gcHJldmVudCBzcGFtLCB3ZSByZXF1aXJlIHlvdSB0byBqb2luIHRoZSBbZGlzY3Vzc2lvbiBncm91cF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZW1vY2spIGJlZm9yZSB5b3UgY2FuIHBvc3QuKS4KKworUGxlYXNlIG5vdGUgdGhhdCBjcmVhdGluZyBhbiBpc3N1ZSBpbiB0aGUKK1tpc3N1ZSB0cmFja2VyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay9pc3N1ZXMvbGlzdCkgaXMgX25vdF8KK2EgZ29vZCB3YXkgdG8gZ2V0IHlvdXIgYW5zd2VyLCBhcyBpdCBpcyBtb25pdG9yZWQgaW5mcmVxdWVudGx5IGJ5IGEKK3Zlcnkgc21hbGwgbnVtYmVyIG9mIHBlb3BsZS4KKworV2hlbiBhc2tpbmcgYSBxdWVzdGlvbiwgaXQncyBoZWxwZnVsIHRvIHByb3ZpZGUgYXMgbXVjaCBvZiB0aGUKK2ZvbGxvd2luZyBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSAocGVvcGxlIGNhbm5vdCBoZWxwIHlvdSBpZiB0aGVyZSdzCitub3QgZW5vdWdoIGluZm9ybWF0aW9uIGluIHlvdXIgcXVlc3Rpb24pOgorCisgICogdGhlIHZlcnNpb24gKG9yIHRoZSByZXZpc2lvbiBudW1iZXIgaWYgeW91IGNoZWNrIG91dCBmcm9tIFNWTiBkaXJlY3RseSkgb2YgR29vZ2xlIE1vY2sgeW91IHVzZSAoR29vZ2xlIE1vY2sgaXMgdW5kZXIgYWN0aXZlIGRldmVsb3BtZW50LCBzbyBpdCdzIHBvc3NpYmxlIHRoYXQgeW91ciBwcm9ibGVtIGhhcyBiZWVuIHNvbHZlZCBpbiBhIGxhdGVyIHZlcnNpb24pLAorICAqIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwKKyAgKiB0aGUgbmFtZSBhbmQgdmVyc2lvbiBvZiB5b3VyIGNvbXBpbGVyLAorICAqIHRoZSBjb21wbGV0ZSBjb21tYW5kIGxpbmUgZmxhZ3MgeW91IGdpdmUgdG8geW91ciBjb21waWxlciwKKyAgKiB0aGUgY29tcGxldGUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgKGlmIHRoZSBxdWVzdGlvbiBpcyBhYm91dCBjb21waWxhdGlvbiksCisgICogdGhlIF9hY3R1YWxfIGNvZGUgKGlkZWFsbHksIGEgbWluaW1hbCBidXQgY29tcGxldGUgcHJvZ3JhbSkgdGhhdCBoYXMgdGhlIHByb2JsZW0geW91IGVuY291bnRlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1hY3Rpb25zLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1hY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5YzRkNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaApAQCAtMCwwICsxLDEyMDUgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgYWN0aW9ucy4KKworI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19BQ1RJT05TX0hfCisKKyNpZm5kZWYgX1dJTjMyX1dDRQorIyBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisKKyNpZiBHVEVTVF9MQU5HX0NYWDExICAvLyBEZWZpbmVkIGJ5IGd0ZXN0LXBvcnQuaCB2aWEgZ21vY2stcG9ydC5oLgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVG8gaW1wbGVtZW50IGFuIGFjdGlvbiBGb28sIGRlZmluZToKKy8vICAgMS4gYSBjbGFzcyBGb29BY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBBY3Rpb25JbnRlcmZhY2UgaW50ZXJmYWNlLCBhbmQKKy8vICAgMi4gYSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBBY3Rpb24gb2JqZWN0IGZyb20gYQorLy8gICAgICBjb25zdCBGb29BY3Rpb24qLgorLy8KKy8vIFRoZSB0d28tbGV2ZWwgZGVsZWdhdGlvbiBkZXNpZ24gZm9sbG93cyB0aGF0IG9mIE1hdGNoZXIsIHByb3ZpZGluZworLy8gY29uc2lzdGVuY3kgZm9yIGV4dGVuc2lvbiBkZXZlbG9wZXJzLiAgSXQgYWxzbyBlYXNlcyBvd25lcnNoaXAKKy8vIG1hbmFnZW1lbnQgYXMgQWN0aW9uIG9iamVjdHMgY2FuIG5vdyBiZSBjb3BpZWQgbGlrZSBwbGFpbiB2YWx1ZXMuCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGMSwgdHlwZW5hbWUgRjI+CitjbGFzcyBBY3Rpb25BZGFwdG9yOworCisvLyBCdWlsdEluRGVmYXVsdFZhbHVlR2V0dGVyPFQsIHRydWU+OjpHZXQoKSByZXR1cm5zIGEKKy8vIGRlZmF1bHQtY29uc3RydWN0ZWQgVCB2YWx1ZS4gIEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXI8VCwKKy8vIGZhbHNlPjo6R2V0KCkgY3Jhc2hlcyB3aXRoIGFuIGVycm9yLgorLy8KKy8vIFRoaXMgcHJpbWFyeSB0ZW1wbGF0ZSBpcyB1c2VkIHdoZW4ga0RlZmF1bHRDb25zdHJ1Y3RpYmxlIGlzIHRydWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCBrRGVmYXVsdENvbnN0cnVjdGlibGU+CitzdHJ1Y3QgQnVpbHRJbkRlZmF1bHRWYWx1ZUdldHRlciB7CisgIHN0YXRpYyBUIEdldCgpIHsgcmV0dXJuIFQoKTsgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXI8VCwgZmFsc2U+IHsKKyAgc3RhdGljIFQgR2V0KCkgeworICAgIEFzc2VydChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAiRGVmYXVsdCBhY3Rpb24gdW5kZWZpbmVkIGZvciB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUuIik7CisgICAgcmV0dXJuIGludGVybmFsOjpJbnZhbGlkPFQ+KCk7CisgICAgLy8gVGhlIGFib3ZlIHN0YXRlbWVudCB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsIGJ1dCBpcyByZXF1aXJlZCBpbgorICAgIC8vIG9yZGVyIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGNvbXBpbGUuCisgIH0KK307CisKKy8vIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpIHJldHVybnMgdGhlICJidWlsdC1pbiIgZGVmYXVsdCB2YWx1ZQorLy8gZm9yIHR5cGUgVCwgd2hpY2ggaXMgTlVMTCB3aGVuIFQgaXMgYSByYXcgcG9pbnRlciB0eXBlLCAwIHdoZW4gVCBpcworLy8gYSBudW1lcmljIHR5cGUsIGZhbHNlIHdoZW4gVCBpcyBib29sLCBvciAiIiB3aGVuIFQgaXMgc3RyaW5nIG9yCisvLyBzdGQ6OnN0cmluZy4gIEluIGFkZGl0aW9uLCBpbiBDKysxMSBhbmQgYWJvdmUsIGl0IHR1cm5zIGEKKy8vIGRlZmF1bHQtY29uc3RydWN0ZWQgVCB2YWx1ZSBpZiBUIGlzIGRlZmF1bHQgY29uc3RydWN0aWJsZS4gIEZvciBhbnkKKy8vIG90aGVyIHR5cGUgVCwgdGhlIGJ1aWx0LWluIGRlZmF1bHQgVCB2YWx1ZSBpcyB1bmRlZmluZWQsIGFuZCB0aGUKKy8vIGZ1bmN0aW9uIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEJ1aWx0SW5EZWZhdWx0VmFsdWUgeworIHB1YmxpYzoKKyNpZiBHVEVTVF9MQU5HX0NYWDExCisgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB0eXBlIFQgaGFzIGEgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZS4KKyAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeworICAgIHJldHVybiA6OnN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZTsKKyAgfQorCisgIHN0YXRpYyBUIEdldCgpIHsKKyAgICByZXR1cm4gQnVpbHRJbkRlZmF1bHRWYWx1ZUdldHRlcjwKKyAgICAgICAgVCwgOjpzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxUPjo6dmFsdWU+OjpHZXQoKTsKKyAgfQorCisjZWxzZSAgLy8gR1RFU1RfTEFOR19DWFgxMQorICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdHlwZSBUIGhhcyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuCisgIHN0YXRpYyBib29sIEV4aXN0cygpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgVCBHZXQoKSB7CisgICAgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXI8VCwgZmFsc2U+OjpHZXQoKTsKKyAgfQorCisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKK307CisKKy8vIFRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBzYXlzIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGJ1aWx0LWluCisvLyBkZWZhdWx0IHZhbHVlIGZvciBUIGFuZCBjb25zdCBULgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlPGNvbnN0IFQ+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIEV4aXN0cygpIHsgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkV4aXN0cygpOyB9CisgIHN0YXRpYyBUIEdldCgpIHsgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpOyB9Cit9OworCisvLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHBvaW50ZXIKKy8vIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlPFQqPiB7CisgcHVibGljOgorICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBUKiBHZXQoKSB7IHJldHVybiBOVUxMOyB9Cit9OworCisvLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9ucyBkZWZpbmUgdGhlIGRlZmF1bHQgdmFsdWVzIGZvcgorLy8gc3BlY2lmaWMgdHlwZXMgd2UgY2FyZSBhYm91dC4KKyNkZWZpbmUgR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8odHlwZSwgdmFsdWUpIFwKKyAgdGVtcGxhdGUgPD4gXAorICBjbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlPHR5cGU+IHsgXAorICAgcHVibGljOiBcCisgICAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeyByZXR1cm4gdHJ1ZTsgfSBcCisgICAgc3RhdGljIHR5cGUgR2V0KCkgeyByZXR1cm4gdmFsdWU7IH0gXAorICB9CisKK0dNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHZvaWQsICk7ICAvLyBOT0xJTlQKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oOjpzdHJpbmcsICIiKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK0dNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKDo6c3RkOjpzdHJpbmcsICIiKTsKK0dNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKGJvb2wsIGZhbHNlKTsKK0dNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHVuc2lnbmVkIGNoYXIsICdcMCcpOworR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oc2lnbmVkIGNoYXIsICdcMCcpOworR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oY2hhciwgJ1wwJyk7CisKKy8vIFRoZXJlJ3Mgbm8gbmVlZCBmb3IgYSBkZWZhdWx0IGFjdGlvbiBmb3Igc2lnbmVkIHdjaGFyX3QsIGFzIHRoYXQKKy8vIHR5cGUgaXMgdGhlIHNhbWUgYXMgd2NoYXJfdCBmb3IgZ2NjLCBhbmQgaW52YWxpZCBmb3IgTVNWQy4KKy8vCisvLyBUaGVyZSdzIGFsc28gbm8gbmVlZCBmb3IgYSBkZWZhdWx0IGFjdGlvbiBmb3IgdW5zaWduZWQgd2NoYXJfdCwgYXMKKy8vIHRoYXQgdHlwZSBpcyB0aGUgc2FtZSBhcyB1bnNpZ25lZCBpbnQgZm9yIGdjYywgYW5kIGludmFsaWQgZm9yCisvLyBNU1ZDLgorI2lmIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXworR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8od2NoYXJfdCwgMFUpOyAgLy8gTk9MSU5UCisjZW5kaWYKKworR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8odW5zaWduZWQgc2hvcnQsIDBVKTsgIC8vIE5PTElOVAorR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oc2lnbmVkIHNob3J0LCAwKTsgICAgIC8vIE5PTElOVAorR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8odW5zaWduZWQgaW50LCAwVSk7CitHTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhzaWduZWQgaW50LCAwKTsKK0dNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHVuc2lnbmVkIGxvbmcsIDBVTCk7ICAvLyBOT0xJTlQKK0dNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHNpZ25lZCBsb25nLCAwTCk7ICAgICAvLyBOT0xJTlQKK0dNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKFVJbnQ2NCwgMCk7CitHTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhJbnQ2NCwgMCk7CitHTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhmbG9hdCwgMCk7CitHTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhkb3VibGUsIDApOworCisjdW5kZWYgR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdoZW4gYW4gdW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsIGlzIGVuY291bnRlcmVkLCBHb29nbGUgTW9jayB3aWxsCisvLyBsZXQgaXQgcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIG9uZSBmb3IgaXRzCisvLyByZXR1cm4gdHlwZSwgb3IgaWYgdGhlIHJldHVybiB0eXBlIGhhcyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWU7CisvLyBvdGhlcndpc2UgR29vZ2xlIE1vY2sgd29uJ3Qga25vdyB3aGF0IHZhbHVlIHRvIHJldHVybiBhbmQgd2lsbCBoYXZlCisvLyB0byBhYm9ydCB0aGUgcHJvY2Vzcy4KKy8vCisvLyBUaGUgRGVmYXVsdFZhbHVlPFQ+IGNsYXNzIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGUKKy8vIGRlZmF1bHQgdmFsdWUgZm9yIGEgdHlwZSBUIHRoYXQgaXMgYm90aCBjb3B5YWJsZSBhbmQgcHVibGljbHkKKy8vIGRlc3RydWN0aWJsZSAoaS5lLiBhbnl0aGluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZnVuY3Rpb24gcmV0dXJuCisvLyB0eXBlKS4gIFRoZSB1c2FnZSBpczoKKy8vCisvLyAgIC8vIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCB0byBiZSBmb28uCisvLyAgIERlZmF1bHRWYWx1ZTxUPjo6U2V0KGZvbyk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERlZmF1bHRWYWx1ZSB7CisgcHVibGljOgorICAvLyBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQ7IHJlcXVpcmVzIFQgdG8gYmUKKyAgLy8gY29weS1jb25zdHJ1Y3RhYmxlIGFuZCBoYXZlIGEgcHVibGljIGRlc3RydWN0b3IuCisgIHN0YXRpYyB2b2lkIFNldChUIHgpIHsKKyAgICBkZWxldGUgcHJvZHVjZXJfOworICAgIHByb2R1Y2VyXyA9IG5ldyBGaXhlZFZhbHVlUHJvZHVjZXIoeCk7CisgIH0KKworICAvLyBQcm92aWRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IHZhbHVlLgorICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBldmVuIGlmIFQgaXMgb25seSBtb3ZlLWNvbnN0cnVjdGlibGUsIGJ1dCBpdCBpcyBub3QKKyAgLy8gbGltaXRlZCB0byB0aGF0IGNhc2UuCisgIHR5cGVkZWYgVCAoKkZhY3RvcnlGdW5jdGlvbikoKTsKKyAgc3RhdGljIHZvaWQgU2V0RmFjdG9yeShGYWN0b3J5RnVuY3Rpb24gZmFjdG9yeSkgeworICAgIGRlbGV0ZSBwcm9kdWNlcl87CisgICAgcHJvZHVjZXJfID0gbmV3IEZhY3RvcnlWYWx1ZVByb2R1Y2VyKGZhY3RvcnkpOworICB9CisKKyAgLy8gVW5zZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQuCisgIHN0YXRpYyB2b2lkIENsZWFyKCkgeworICAgIGRlbGV0ZSBwcm9kdWNlcl87CisgICAgcHJvZHVjZXJfID0gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgaGFzIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBULgorICBzdGF0aWMgYm9vbCBJc1NldCgpIHsgcmV0dXJuIHByb2R1Y2VyXyAhPSBOVUxMOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIFQgaGFzIGEgZGVmYXVsdCByZXR1cm4gdmFsdWUgc2V0IGJ5IHRoZSB1c2VyIG9yIHRoZXJlCisgIC8vIGV4aXN0cyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuCisgIHN0YXRpYyBib29sIEV4aXN0cygpIHsKKyAgICByZXR1cm4gSXNTZXQoKSB8fCBpbnRlcm5hbDo6QnVpbHRJbkRlZmF1bHRWYWx1ZTxUPjo6RXhpc3RzKCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQgaWYgdGhlIHVzZXIgaGFzIHNldCBvbmU7CisgIC8vIG90aGVyd2lzZSByZXR1cm5zIHRoZSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLiBSZXF1aXJlcyB0aGF0IEV4aXN0cygpCisgIC8vIGlzIHRydWUsIHdoaWNoIGVuc3VyZXMgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHdlbGwtZGVmaW5lZC4KKyAgc3RhdGljIFQgR2V0KCkgeworICAgIHJldHVybiBwcm9kdWNlcl8gPT0gTlVMTCA/CisgICAgICAgIGludGVybmFsOjpCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKSA6IHByb2R1Y2VyXy0+UHJvZHVjZSgpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBWYWx1ZVByb2R1Y2VyIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5WYWx1ZVByb2R1Y2VyKCkge30KKyAgICB2aXJ0dWFsIFQgUHJvZHVjZSgpID0gMDsKKyAgfTsKKworICBjbGFzcyBGaXhlZFZhbHVlUHJvZHVjZXIgOiBwdWJsaWMgVmFsdWVQcm9kdWNlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgRml4ZWRWYWx1ZVByb2R1Y2VyKFQgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQorICAgIHZpcnR1YWwgVCBQcm9kdWNlKCkgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgVCB2YWx1ZV87CisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhGaXhlZFZhbHVlUHJvZHVjZXIpOworICB9OworCisgIGNsYXNzIEZhY3RvcnlWYWx1ZVByb2R1Y2VyIDogcHVibGljIFZhbHVlUHJvZHVjZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEZhY3RvcnlWYWx1ZVByb2R1Y2VyKEZhY3RvcnlGdW5jdGlvbiBmYWN0b3J5KQorICAgICAgICA6IGZhY3RvcnlfKGZhY3RvcnkpIHt9CisgICAgdmlydHVhbCBUIFByb2R1Y2UoKSB7IHJldHVybiBmYWN0b3J5XygpOyB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgRmFjdG9yeUZ1bmN0aW9uIGZhY3RvcnlfOworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRmFjdG9yeVZhbHVlUHJvZHVjZXIpOworICB9OworCisgIHN0YXRpYyBWYWx1ZVByb2R1Y2VyKiBwcm9kdWNlcl87Cit9OworCisvLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYWxsb3dzIGEgdXNlciB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yCisvLyByZWZlcmVuY2UgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERlZmF1bHRWYWx1ZTxUJj4geworIHB1YmxpYzoKKyAgLy8gU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUJi4KKyAgc3RhdGljIHZvaWQgU2V0KFQmIHgpIHsgIC8vIE5PTElOVAorICAgIGFkZHJlc3NfID0gJng7CisgIH0KKworICAvLyBVbnNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuCisgIHN0YXRpYyB2b2lkIENsZWFyKCkgeworICAgIGFkZHJlc3NfID0gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgaGFzIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUJi4KKyAgc3RhdGljIGJvb2wgSXNTZXQoKSB7IHJldHVybiBhZGRyZXNzXyAhPSBOVUxMOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIFQgaGFzIGEgZGVmYXVsdCByZXR1cm4gdmFsdWUgc2V0IGJ5IHRoZSB1c2VyIG9yIHRoZXJlCisgIC8vIGV4aXN0cyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuCisgIHN0YXRpYyBib29sIEV4aXN0cygpIHsKKyAgICByZXR1cm4gSXNTZXQoKSB8fCBpbnRlcm5hbDo6QnVpbHRJbkRlZmF1bHRWYWx1ZTxUJj46OkV4aXN0cygpOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUJiBpZiB0aGUgdXNlciBoYXMgc2V0IG9uZTsKKyAgLy8gb3RoZXJ3aXNlIHJldHVybnMgdGhlIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUgaWYgdGhlcmUgaXMgb25lOworICAvLyBvdGhlcndpc2UgYWJvcnRzIHRoZSBwcm9jZXNzLgorICBzdGF0aWMgVCYgR2V0KCkgeworICAgIHJldHVybiBhZGRyZXNzXyA9PSBOVUxMID8KKyAgICAgICAgaW50ZXJuYWw6OkJ1aWx0SW5EZWZhdWx0VmFsdWU8VCY+OjpHZXQoKSA6ICphZGRyZXNzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIFQqIGFkZHJlc3NfOworfTsKKworLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBhbGxvd3MgRGVmYXVsdFZhbHVlPHZvaWQ+OjpHZXQoKSB0bworLy8gY29tcGlsZS4KK3RlbXBsYXRlIDw+CitjbGFzcyBEZWZhdWx0VmFsdWU8dm9pZD4geworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGF0aWMgdm9pZCBHZXQoKSB7fQorfTsKKworLy8gUG9pbnRzIHRvIHRoZSB1c2VyLXNldCBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIERlZmF1bHRWYWx1ZTxUPjo6VmFsdWVQcm9kdWNlciogRGVmYXVsdFZhbHVlPFQ+Ojpwcm9kdWNlcl8gPSBOVUxMOworCisvLyBQb2ludHMgdG8gdGhlIHVzZXItc2V0IGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIERlZmF1bHRWYWx1ZTxUJj46OmFkZHJlc3NfID0gTlVMTDsKKworLy8gSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGRlZmluZSBhbiBhY3Rpb24gZm9yIGZ1bmN0aW9uIHR5cGUgRi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgorY2xhc3MgQWN0aW9uSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOworCisgIEFjdGlvbkludGVyZmFjZSgpIHt9CisgIHZpcnR1YWwgfkFjdGlvbkludGVyZmFjZSgpIHt9CisKKyAgLy8gUGVyZm9ybXMgdGhlIGFjdGlvbi4gIFRoaXMgbWV0aG9kIGlzIG5vdCBjb25zdCwgYXMgaW4gZ2VuZXJhbCBhbgorICAvLyBhY3Rpb24gY2FuIGhhdmUgc2lkZSBlZmZlY3RzIGFuZCBiZSBzdGF0ZWZ1bC4gIEZvciBleGFtcGxlLCBhCisgIC8vIGdldC10aGUtbmV4dC1lbGVtZW50LWZyb20tdGhlLWNvbGxlY3Rpb24gYWN0aW9uIHdpbGwgbmVlZCB0bworICAvLyByZW1lbWJlciB0aGUgY3VycmVudCBlbGVtZW50LgorICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpID0gMDsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQWN0aW9uSW50ZXJmYWNlKTsKK307CisKKy8vIEFuIEFjdGlvbjxGPiBpcyBhIGNvcHlhYmxlIGFuZCBJTU1VVEFCTEUgKGV4Y2VwdCBieSBhc3NpZ25tZW50KQorLy8gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhbiBhY3Rpb24gdG8gYmUgdGFrZW4gd2hlbiBhIG1vY2sgZnVuY3Rpb24KKy8vIG9mIHR5cGUgRiBpcyBjYWxsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgQWN0aW9uPFQ+IGlzIGp1c3QgYQorLy8gbGlua2VkX3B0ciB0byBjb25zdCBBY3Rpb25JbnRlcmZhY2U8VD4sIHNvIGNvcHlpbmcgaXMgZmFpcmx5IGNoZWFwLgorLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIEFjdGlvbiEKKy8vCisvLyBZb3UgY2FuIHZpZXcgYW4gb2JqZWN0IGltcGxlbWVudGluZyBBY3Rpb25JbnRlcmZhY2U8Rj4gYXMgYQorLy8gY29uY3JldGUgYWN0aW9uIChpbmNsdWRpbmcgaXRzIGN1cnJlbnQgc3RhdGUpLCBhbmQgYW4gQWN0aW9uPEY+CisvLyBvYmplY3QgYXMgYSBoYW5kbGUgdG8gaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KK2NsYXNzIEFjdGlvbiB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICAvLyBDb25zdHJ1Y3RzIGEgbnVsbCBBY3Rpb24uICBOZWVkZWQgZm9yIHN0b3JpbmcgQWN0aW9uIG9iamVjdHMgaW4KKyAgLy8gU1RMIGNvbnRhaW5lcnMuCisgIEFjdGlvbigpIDogaW1wbF8oTlVMTCkge30KKworICAvLyBDb25zdHJ1Y3RzIGFuIEFjdGlvbiBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4gIEEgTlVMTCBpbXBsIGlzCisgIC8vIHVzZWQgdG8gcmVwcmVzZW50IHRoZSAiZG8tZGVmYXVsdCIgYWN0aW9uLgorICBleHBsaWNpdCBBY3Rpb24oQWN0aW9uSW50ZXJmYWNlPEY+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgQWN0aW9uKGNvbnN0IEFjdGlvbiYgYWN0aW9uKSA6IGltcGxfKGFjdGlvbi5pbXBsXykge30KKworICAvLyBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB1cyB0byB0dXJuIGFuIEFjdGlvbjxGdW5jPiBvYmplY3QgaW50byBhbgorICAvLyBBY3Rpb248Rj4sIGFzIGxvbmcgYXMgRidzIGFyZ3VtZW50cyBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQKKyAgLy8gdG8gRnVuYydzIGFuZCBGdW5jJ3MgcmV0dXJuIHR5cGUgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCisgIC8vIEYncy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+CisgIGV4cGxpY2l0IEFjdGlvbihjb25zdCBBY3Rpb248RnVuYz4mIGFjdGlvbik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIHRoZSBEb0RlZmF1bHQoKSBhY3Rpb24uCisgIGJvb2wgSXNEb0RlZmF1bHQoKSBjb25zdCB7IHJldHVybiBpbXBsXy5nZXQoKSA9PSBOVUxMOyB9CisKKyAgLy8gUGVyZm9ybXMgdGhlIGFjdGlvbi4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBjb25zdCBldmVuIHRob3VnaAorICAvLyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgaW4gQWN0aW9uSW50ZXJmYWNlIGlzIG5vdC4gIFRoZSByZWFzb24KKyAgLy8gaXMgdGhhdCBhIGNvbnN0IEFjdGlvbjxGPiBtZWFucyB0aGF0IGl0IGNhbm5vdCBiZSByZS1ib3VuZCB0bworICAvLyBhbm90aGVyIGNvbmNyZXRlIGFjdGlvbiwgbm90IHRoYXQgdGhlIGNvbmNyZXRlIGFjdGlvbiBpdCBiaW5kcyB0bworICAvLyBjYW5ub3QgY2hhbmdlIHN0YXRlLiAgKFRoaW5rIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBjb25zdAorICAvLyBwb2ludGVyIGFuZCBhIHBvaW50ZXIgdG8gY29uc3QuKQorICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7CisgICAgaW50ZXJuYWw6OkFzc2VydCgKKyAgICAgICAgIUlzRG9EZWZhdWx0KCksIF9fRklMRV9fLCBfX0xJTkVfXywKKyAgICAgICAgIllvdSBhcmUgdXNpbmcgRG9EZWZhdWx0KCkgaW5zaWRlIGEgY29tcG9zaXRlIGFjdGlvbiBsaWtlICIKKyAgICAgICAgIkRvQWxsKCkgb3IgV2l0aEFyZ3MoKS4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGVjaG5pY2FsICIKKyAgICAgICAgInJlYXNvbnMuICBQbGVhc2UgaW5zdGVhZCBzcGVsbCBvdXQgdGhlIGRlZmF1bHQgYWN0aW9uLCBvciAiCisgICAgICAgICJhc3NpZ24gdGhlIGRlZmF1bHQgYWN0aW9uIHRvIGFuIEFjdGlvbiB2YXJpYWJsZSBhbmQgdXNlICIKKyAgICAgICAgInRoZSB2YXJpYWJsZSBpbiB2YXJpb3VzIHBsYWNlcy4iKTsKKyAgICByZXR1cm4gaW1wbF8tPlBlcmZvcm0oYXJncyk7CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGMSwgdHlwZW5hbWUgRjI+CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6QWN0aW9uQWRhcHRvcjsKKworICBpbnRlcm5hbDo6bGlua2VkX3B0cjxBY3Rpb25JbnRlcmZhY2U8Rj4gPiBpbXBsXzsKK307CisKKy8vIFRoZSBQb2x5bW9ycGhpY0FjdGlvbiBjbGFzcyB0ZW1wbGF0ZSBtYWtlcyBpdCBlYXN5IHRvIGltcGxlbWVudCBhCisvLyBwb2x5bW9ycGhpYyBhY3Rpb24gKGkuZS4gYW4gYWN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gbW9jaworLy8gZnVuY3Rpb25zIG9mIHRoYW4gb25lIHR5cGUsIGUuZy4gUmV0dXJuKCkpLgorLy8KKy8vIFRvIGRlZmluZSBhIHBvbHltb3JwaGljIGFjdGlvbiwgYSB1c2VyIGZpcnN0IHByb3ZpZGVzIGEgQ09QWUFCTEUKKy8vIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgaGFzIGEgUGVyZm9ybSgpIG1ldGhvZCB0ZW1wbGF0ZToKKy8vCisvLyAgIGNsYXNzIEZvb0FjdGlvbiB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KKy8vICAgICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7CisvLyAgICAgICAvLyBQcm9jZXNzZXMgdGhlIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIHJlc3VsdCwgdXNpbmcKKy8vICAgICAgIC8vIHRyMTo6Z2V0PE4+KGFyZ3MpIHRvIGdldCB0aGUgTi10aCAoMC1iYXNlZCkgYXJndW1lbnQgaW4gdGhlIHR1cGxlLgorLy8gICAgIH0KKy8vICAgICAuLi4KKy8vICAgfTsKKy8vCisvLyBUaGVuIHRoZSB1c2VyIGNyZWF0ZXMgdGhlIHBvbHltb3JwaGljIGFjdGlvbiB1c2luZworLy8gTWFrZVBvbHltb3JwaGljQWN0aW9uKG9iamVjdCkgd2hlcmUgb2JqZWN0IGhhcyB0eXBlIEZvb0FjdGlvbi4gIFNlZQorLy8gdGhlIGRlZmluaXRpb24gb2YgUmV0dXJuKHZvaWQpIGFuZCBTZXRBcmd1bWVudFBvaW50ZWU8Tj4odmFsdWUpIGZvcgorLy8gY29tcGxldGUgZXhhbXBsZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2NsYXNzIFBvbHltb3JwaGljQWN0aW9uIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFBvbHltb3JwaGljQWN0aW9uKGNvbnN0IEltcGwmIGltcGwpIDogaW1wbF8oaW1wbCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeworICAgIHJldHVybiBBY3Rpb248Rj4obmV3IE1vbm9tb3JwaGljSW1wbDxGPihpbXBsXykpOworICB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgY2xhc3MgTW9ub21vcnBoaWNJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICAgIGV4cGxpY2l0IE1vbm9tb3JwaGljSW1wbChjb25zdCBJbXBsJiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisKKyAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICAgIHJldHVybiBpbXBsXy50ZW1wbGF0ZSBQZXJmb3JtPFJlc3VsdD4oYXJncyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEltcGwgaW1wbF87CisKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1vbm9tb3JwaGljSW1wbCk7CisgIH07CisKKyAgSW1wbCBpbXBsXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBvbHltb3JwaGljQWN0aW9uKTsKK307CisKKy8vIENyZWF0ZXMgYW4gQWN0aW9uIGZyb20gaXRzIGltcGxlbWVudGF0aW9uIGFuZCByZXR1cm5zIGl0LiAgVGhlCisvLyBjcmVhdGVkIEFjdGlvbiBvYmplY3Qgb3ducyB0aGUgaW1wbGVtZW50YXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KK0FjdGlvbjxGPiBNYWtlQWN0aW9uKEFjdGlvbkludGVyZmFjZTxGPiogaW1wbCkgeworICByZXR1cm4gQWN0aW9uPEY+KGltcGwpOworfQorCisvLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgYWN0aW9uIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcworLy8gZWFzaWVyIHRvIHVzZSB0aGFuIHRoZSBQb2x5bW9ycGhpY0FjdGlvbjxJbXBsPiBjb25zdHJ1Y3RvciBhcyBpdAorLy8gZG9lc24ndCByZXF1aXJlIHlvdSB0byBleHBsaWNpdGx5IHdyaXRlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCwgZS5nLgorLy8KKy8vICAgTWFrZVBvbHltb3JwaGljQWN0aW9uKGZvbyk7CisvLyB2cworLy8gICBQb2x5bW9ycGhpY0FjdGlvbjxUeXBlT2ZGb28+KGZvbyk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQb2x5bW9ycGhpY0FjdGlvbjxJbXBsPiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oY29uc3QgSW1wbCYgaW1wbCkgeworICByZXR1cm4gUG9seW1vcnBoaWNBY3Rpb248SW1wbD4oaW1wbCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEFsbG93cyBhbiBBY3Rpb248RjI+IG9iamVjdCB0byBwb3NlIGFzIGFuIEFjdGlvbjxGMT4sIGFzIGxvbmcgYXMgRjIKKy8vIGFuZCBGMSBhcmUgY29tcGF0aWJsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGMSwgdHlwZW5hbWUgRjI+CitjbGFzcyBBY3Rpb25BZGFwdG9yIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGMT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248RjE+OjpSZXN1bHQgUmVzdWx0OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGMT46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICBleHBsaWNpdCBBY3Rpb25BZGFwdG9yKGNvbnN0IEFjdGlvbjxGMj4mIGZyb20pIDogaW1wbF8oZnJvbS5pbXBsXykge30KKworICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICByZXR1cm4gaW1wbF8tPlBlcmZvcm0oYXJncyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPEFjdGlvbkludGVyZmFjZTxGMj4gPiBpbXBsXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFjdGlvbkFkYXB0b3IpOworfTsKKworLy8gSGVscGVyIHN0cnVjdCB0byBzcGVjaWFsaXplIFJldHVybkFjdGlvbiB0byBleGVjdXRlIGEgbW92ZSBpbnN0ZWFkIG9mIGEgY29weQorLy8gb24gcmV0dXJuLiBVc2VmdWwgZm9yIG1vdmUtb25seSB0eXBlcywgYnV0IGNvdWxkIGJlIHVzZWQgb24gYW55IHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCeU1vdmVXcmFwcGVyIHsKKyAgZXhwbGljaXQgQnlNb3ZlV3JhcHBlcihUIHZhbHVlKSA6IHBheWxvYWQoaW50ZXJuYWw6Om1vdmUodmFsdWUpKSB7fQorICBUIHBheWxvYWQ7Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBSZXR1cm4oeCkgYWN0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCBpbgorLy8gYW55IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdHlwZSBvZiB4LCByZWdhcmRsZXNzIG9mIHRoZSBhcmd1bWVudAorLy8gdHlwZXMuCisvLworLy8gTm90ZTogVGhlIHZhbHVlIHBhc3NlZCBpbnRvIFJldHVybiBtdXN0IGJlIGNvbnZlcnRlZCBpbnRvCisvLyBGdW5jdGlvbjxGPjo6UmVzdWx0IHdoZW4gdGhpcyBhY3Rpb24gaXMgY2FzdCB0byBBY3Rpb248Rj4gcmF0aGVyIHRoYW4KKy8vIHdoZW4gdGhhdCBhY3Rpb24gaXMgcGVyZm9ybWVkLiBUaGlzIGlzIGltcG9ydGFudCBpbiBzY2VuYXJpb3MgbGlrZQorLy8KKy8vIE1PQ0tfTUVUSE9EMShNZXRob2QsIFQoVSkpOworLy8gLi4uCisvLyB7CisvLyAgIEZvbyBmb287CisvLyAgIFggeCgmZm9vKTsKKy8vICAgRVhQRUNUX0NBTEwobW9jaywgTWV0aG9kKF8pKS5XaWxsT25jZShSZXR1cm4oeCkpOworLy8gfQorLy8KKy8vIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSB2YXJpYWJsZSB4IGhvbGRzIHJlZmVyZW5jZSB0byBmb28gd2hpY2ggbGVhdmVzCisvLyBzY29wZSBhbmQgZ2V0cyBkZXN0cm95ZWQuICBJZiBjb3B5aW5nIFgganVzdCBjb3BpZXMgYSByZWZlcmVuY2UgdG8gZm9vLAorLy8gdGhhdCBjb3B5IHdpbGwgYmUgbGVmdCB3aXRoIGEgaGFuZ2luZyByZWZlcmVuY2UuICBJZiBjb252ZXJzaW9uIHRvIFQKKy8vIG1ha2VzIGEgY29weSBvZiBmb28sIHRoZSBhYm92ZSBjb2RlIGlzIHNhZmUuIFRvIHN1cHBvcnQgdGhhdCBzY2VuYXJpbywgd2UKKy8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHR5cGUgY29udmVyc2lvbiBoYXBwZW5zIGluc2lkZSB0aGUgRVhQRUNUX0NBTEwKKy8vIHN0YXRlbWVudCwgYW5kIGNvbnZlcnNpb24gb2YgdGhlIHJlc3VsdCBvZiBSZXR1cm4gdG8gQWN0aW9uPFQoVSk+IGlzIGEKKy8vIGdvb2QgcGxhY2UgZm9yIHRoYXQuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFI+CitjbGFzcyBSZXR1cm5BY3Rpb24geworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIFJldHVybkFjdGlvbiBvYmplY3QgZnJvbSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCisgIC8vICd2YWx1ZScgaXMgcGFzc2VkIGJ5IHZhbHVlIGluc3RlYWQgb2YgYnkgY29uc3QgcmVmZXJlbmNlIGluIG9yZGVyCisgIC8vIHRvIGFsbG93IFJldHVybigic3RyaW5nIGxpdGVyYWwiKSB0byBjb21waWxlLgorICBleHBsaWNpdCBSZXR1cm5BY3Rpb24oUiB2YWx1ZSkgOiB2YWx1ZV8obmV3IFIoaW50ZXJuYWw6Om1vdmUodmFsdWUpKSkge30KKworICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgUmV0dXJuKHgpIHRvIGJlCisgIC8vIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB4J3MgdHlwZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+CisgIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsKKyAgICAvLyBBc3NlcnQgc3RhdGVtZW50IGJlbG9uZ3MgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UgdG8gdmVyaWZ5CisgICAgLy8gY29uZGl0aW9ucyBvbiBGLiBJdCBwcm9kdWNlcyB0aGUgY2xlYXJlc3QgZXJyb3IgbWVzc2FnZXMKKyAgICAvLyBpbiBtb3N0IGNvbXBpbGVycy4KKyAgICAvLyBJbXBsIHJlYWxseSBiZWxvbmdzIGluIHRoaXMgc2NvcGUgYXMgYSBsb2NhbCBjbGFzcyBidXQgY2FuJ3QKKyAgICAvLyBiZWNhdXNlIE1TVkMgcHJvZHVjZXMgZHVwbGljYXRlIHN5bWJvbHMgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzCisgICAgLy8gaW4gdGhpcyBjYXNlLiBVbnRpbCBNUyBmaXhlcyB0aGF0IGJ1ZyB3ZSBwdXQgSW1wbCBpbnRvIHRoZSBjbGFzcyBzY29wZQorICAgIC8vIGFuZCBwdXQgdGhlIHR5cGVkZWYgYm90aCBoZXJlIChmb3IgdXNlIGluIGFzc2VydCBzdGF0ZW1lbnQpIGFuZAorICAgIC8vIGluIHRoZSBJbXBsIGNsYXNzLiBCdXQgYm90aCBkZWZpbml0aW9ucyBtdXN0IGJlIHRoZSBzYW1lLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7CisgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKAorICAgICAgICAhaXNfcmVmZXJlbmNlPFJlc3VsdD46OnZhbHVlLAorICAgICAgICB1c2VfUmV0dXJuUmVmX2luc3RlYWRfb2ZfUmV0dXJuX3RvX3JldHVybl9hX3JlZmVyZW5jZSk7CisgICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgSW1wbDxSLCBGPih2YWx1ZV8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuKHgpIGFjdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHR5cGUgRi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJfLCB0eXBlbmFtZSBGPgorICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisKKyAgICAvLyBUaGUgaW1wbGljaXQgY2FzdCBpcyBuZWNlc3Nhcnkgd2hlbiBSZXN1bHQgaGFzIG1vcmUgdGhhbiBvbmUKKyAgICAvLyBzaW5nbGUtYXJndW1lbnQgY29uc3RydWN0b3IgKGUuZy4gUmVzdWx0IGlzIHN0ZDo6dmVjdG9yPGludD4pIGFuZCBSCisgICAgLy8gaGFzIGEgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIHRlbXBsYXRlLiAgSW4gdGhhdCBjYXNlLCB2YWx1ZV8odmFsdWUpCisgICAgLy8gd29uJ3QgY29tcGlsZSBhcyB0aGUgY29tcGlsZXIgZG9lc24ndCBrbm93biB3aGljaCBjb25zdHJ1Y3RvciBvZgorICAgIC8vIFJlc3VsdCB0byBjYWxsLiAgSW1wbGljaXRDYXN0XyBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIGNvbnZlcnQgUiB0bworICAgIC8vIFJlc3VsdCB3aXRob3V0IGNvbnNpZGVyaW5nIGV4cGxpY2l0IGNvbnN0cnVjdG9ycywgdGh1cyByZXNvbHZpbmcgdGhlCisgICAgLy8gYW1iaWd1aXR5LiB2YWx1ZV8gaXMgdGhlbiBpbml0aWFsaXplZCB1c2luZyBpdHMgY29weSBjb25zdHJ1Y3Rvci4KKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IGxpbmtlZF9wdHI8Uj4mIHZhbHVlKQorICAgICAgICA6IHZhbHVlX2JlZm9yZV9jYXN0XygqdmFsdWUpLAorICAgICAgICAgIHZhbHVlXyhJbXBsaWNpdENhc3RfPFJlc3VsdD4odmFsdWVfYmVmb3JlX2Nhc3RfKSkge30KKworICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsgcmV0dXJuIHZhbHVlXzsgfQorCisgICBwcml2YXRlOgorICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyghaXNfcmVmZXJlbmNlPFJlc3VsdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRfY2Fubm90X2JlX2FfcmVmZXJlbmNlX3R5cGUpOworICAgIC8vIFdlIHNhdmUgdGhlIHZhbHVlIGJlZm9yZSBjYXN0aW5nIGp1c3QgaW4gY2FzZSBpdCBpcyBiZWluZyBjYXN0IHRvIGEKKyAgICAvLyB3cmFwcGVyIHR5cGUuCisgICAgUiB2YWx1ZV9iZWZvcmVfY2FzdF87CisgICAgUmVzdWx0IHZhbHVlXzsKKworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW1wbCk7CisgIH07CisKKyAgLy8gUGFydGlhbGx5IHNwZWNpYWxpemUgZm9yIEJ5TW92ZVdyYXBwZXIuIFRoaXMgdmVyc2lvbiBvZiBSZXR1cm5BY3Rpb24gd2lsbAorICAvLyBtb3ZlIGl0cyBjb250ZW50cyBpbnN0ZWFkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUl8sIHR5cGVuYW1lIEY+CisgIGNsYXNzIEltcGw8QnlNb3ZlV3JhcHBlcjxSXz4sIEY+IDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IGxpbmtlZF9wdHI8Uj4mIHdyYXBwZXIpCisgICAgICAgIDogcGVyZm9ybWVkXyhmYWxzZSksIHdyYXBwZXJfKHdyYXBwZXIpIHt9CisKKyAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7CisgICAgICBHVEVTVF9DSEVDS18oIXBlcmZvcm1lZF8pCisgICAgICAgICAgPDwgIkEgQnlNb3ZlKCkgYWN0aW9uIHNob3VsZCBvbmx5IGJlIHBlcmZvcm1lZCBvbmNlLiI7CisgICAgICBwZXJmb3JtZWRfID0gdHJ1ZTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6bW92ZSh3cmFwcGVyXy0+cGF5bG9hZCk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGJvb2wgcGVyZm9ybWVkXzsKKyAgICBjb25zdCBsaW5rZWRfcHRyPFI+IHdyYXBwZXJfOworCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKKyAgfTsKKworICBjb25zdCBsaW5rZWRfcHRyPFI+IHZhbHVlXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJldHVybkFjdGlvbik7Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBSZXR1cm5OdWxsKCkgYWN0aW9uLgorY2xhc3MgUmV0dXJuTnVsbEFjdGlvbiB7CisgcHVibGljOgorICAvLyBBbGxvd3MgUmV0dXJuTnVsbCgpIHRvIGJlIHVzZWQgaW4gYW55IHBvaW50ZXItcmV0dXJuaW5nIGZ1bmN0aW9uLiBJbiBDKysxMQorICAvLyB0aGlzIGlzIGVuZm9yY2VkIGJ5IHJldHVybmluZyBudWxscHRyLCBhbmQgaW4gbm9uLUMrKzExIGJ5IGFzc2VydGluZyBhCisgIC8vIHBvaW50ZXIgdHlwZSBvbiBjb21waWxlIHRpbWUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+CisgIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgeworI2lmIEdURVNUX0xBTkdfQ1hYMTEKKyAgICByZXR1cm4gbnVsbHB0cjsKKyNlbHNlCisgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGludGVybmFsOjppc19wb2ludGVyPFJlc3VsdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5OdWxsX2Nhbl9iZV91c2VkX3RvX3JldHVybl9hX3BvaW50ZXJfb25seSk7CisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKKyAgfQorfTsKKworLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuKCkgYWN0aW9uLgorY2xhc3MgUmV0dXJuVm9pZEFjdGlvbiB7CisgcHVibGljOgorICAvLyBBbGxvd3MgUmV0dXJuKCkgdG8gYmUgdXNlZCBpbiBhbnkgdm9pZC1yZXR1cm5pbmcgZnVuY3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+CisgIHN0YXRpYyB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsKKyAgICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkLCBSZXN1bHQ+KCk7CisgIH0KK307CisKKy8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIFJldHVyblJlZih4KSBhY3Rpb24sIHdoaWNoIGNhbiBiZSB1c2VkCisvLyBpbiBhbnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIG9mIHgsCisvLyByZWdhcmRsZXNzIG9mIHRoZSBhcmd1bWVudCB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmV0dXJuUmVmQWN0aW9uIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYSBSZXR1cm5SZWZBY3Rpb24gb2JqZWN0IGZyb20gdGhlIHJlZmVyZW5jZSB0byBiZSByZXR1cm5lZC4KKyAgZXhwbGljaXQgUmV0dXJuUmVmQWN0aW9uKFQmIHJlZikgOiByZWZfKHJlZikge30gIC8vIE5PTElOVAorCisgIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBSZXR1cm5SZWYoeCkgdG8gYmUKKyAgLy8gdXNlZCBpbiBBTlkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHgncyB0eXBlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7CisgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZSBpcyBhIHJlZmVyZW5jZS4gIFRoaXMKKyAgICAvLyBjYXRjaGVzIHRoZSB1c2VyIGVycm9yIG9mIHVzaW5nIFJldHVyblJlZih4KSB3aGVuIFJldHVybih4KQorICAgIC8vIHNob3VsZCBiZSB1c2VkLCBhbmQgZ2VuZXJhdGVzIHNvbWUgaGVscGZ1bCBlcnJvciBtZXNzYWdlLgorICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPFJlc3VsdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfUmV0dXJuX2luc3RlYWRfb2ZfUmV0dXJuUmVmX3RvX3JldHVybl9hX3ZhbHVlKTsKKyAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBJbXBsPEY+KHJlZl8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuUmVmKHgpIGFjdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHR5cGUgRi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+CisgIGNsYXNzIEltcGwgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPEY+IHsKKyAgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OworICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICAgIGV4cGxpY2l0IEltcGwoVCYgcmVmKSA6IHJlZl8ocmVmKSB7fSAgLy8gTk9MSU5UCisKKyAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7CisgICAgICByZXR1cm4gcmVmXzsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgVCYgcmVmXzsKKworICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7CisgIH07CisKKyAgVCYgcmVmXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJldHVyblJlZkFjdGlvbik7Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBSZXR1cm5SZWZPZkNvcHkoeCkgYWN0aW9uLCB3aGljaCBjYW4gYmUKKy8vIHVzZWQgaW4gYW55IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBvZiB4LAorLy8gcmVnYXJkbGVzcyBvZiB0aGUgYXJndW1lbnQgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJldHVyblJlZk9mQ29weUFjdGlvbiB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgUmV0dXJuUmVmT2ZDb3B5QWN0aW9uIG9iamVjdCBmcm9tIHRoZSByZWZlcmVuY2UgdG8KKyAgLy8gYmUgcmV0dXJuZWQuCisgIGV4cGxpY2l0IFJldHVyblJlZk9mQ29weUFjdGlvbihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9ICAvLyBOT0xJTlQKKworICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgUmV0dXJuUmVmT2ZDb3B5KHgpIHRvIGJlCisgIC8vIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB4J3MgdHlwZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+CisgIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OworICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UuICBUaGlzCisgICAgLy8gY2F0Y2hlcyB0aGUgdXNlciBlcnJvciBvZiB1c2luZyBSZXR1cm5SZWZPZkNvcHkoeCkgd2hlbiBSZXR1cm4oeCkKKyAgICAvLyBzaG91bGQgYmUgdXNlZCwgYW5kIGdlbmVyYXRlcyBzb21lIGhlbHBmdWwgZXJyb3IgbWVzc2FnZS4KKyAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oCisgICAgICAgIGludGVybmFsOjppc19yZWZlcmVuY2U8UmVzdWx0Pjo6dmFsdWUsCisgICAgICAgIHVzZV9SZXR1cm5faW5zdGVhZF9vZl9SZXR1cm5SZWZPZkNvcHlfdG9fcmV0dXJuX2FfdmFsdWUpOworICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8Rj4odmFsdWVfKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIEltcGxlbWVudHMgdGhlIFJldHVyblJlZk9mQ29weSh4KSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30gIC8vIE5PTElOVAorCisgICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgeworICAgICAgcmV0dXJuIHZhbHVlXzsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgVCB2YWx1ZV87CisKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOworICB9OworCisgIGNvbnN0IFQgdmFsdWVfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUmV0dXJuUmVmT2ZDb3B5QWN0aW9uKTsKK307CisKKy8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIERvRGVmYXVsdCgpIGFjdGlvbi4KK2NsYXNzIERvRGVmYXVsdEFjdGlvbiB7CisgcHVibGljOgorICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgRG9EZWZhdWx0KCkgdG8gYmUKKyAgLy8gdXNlZCBpbiBhbnkgZnVuY3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7IHJldHVybiBBY3Rpb248Rj4oTlVMTCk7IH0KK307CisKKy8vIEltcGxlbWVudHMgdGhlIEFzc2lnbiBhY3Rpb24gdG8gc2V0IGEgZ2l2ZW4gcG9pbnRlciByZWZlcmVudCB0byBhCisvLyBwYXJ0aWN1bGFyIHZhbHVlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIEFzc2lnbkFjdGlvbiB7CisgcHVibGljOgorICBBc3NpZ25BY3Rpb24oVDEqIHB0ciwgVDIgdmFsdWUpIDogcHRyXyhwdHIpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KKyAgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIC8qIGFyZ3MgKi8pIGNvbnN0IHsKKyAgICAqcHRyXyA9IHZhbHVlXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgVDEqIGNvbnN0IHB0cl87CisgIGNvbnN0IFQyIHZhbHVlXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFzc2lnbkFjdGlvbik7Cit9OworCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIEltcGxlbWVudHMgdGhlIFNldEVycm5vQW5kUmV0dXJuIGFjdGlvbiB0byBzaW11bGF0ZSByZXR1cm4gZnJvbQorLy8gdmFyaW91cyBzeXN0ZW0gY2FsbHMgYW5kIGxpYmMgZnVuY3Rpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTZXRFcnJub0FuZFJldHVybkFjdGlvbiB7CisgcHVibGljOgorICBTZXRFcnJub0FuZFJldHVybkFjdGlvbihpbnQgZXJybm9fdmFsdWUsIFQgcmVzdWx0KQorICAgICAgOiBlcnJub18oZXJybm9fdmFsdWUpLAorICAgICAgICByZXN1bHRfKHJlc3VsdCkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KKyAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgLyogYXJncyAqLykgY29uc3QgeworICAgIGVycm5vID0gZXJybm9fOworICAgIHJldHVybiByZXN1bHRfOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBpbnQgZXJybm9fOworICBjb25zdCBUIHJlc3VsdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTZXRFcnJub0FuZFJldHVybkFjdGlvbik7Cit9OworCisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBJbXBsZW1lbnRzIHRoZSBTZXRBcmd1bWVudFBvaW50ZWU8Tj4oeCkgYWN0aW9uIGZvciBhbnkgZnVuY3Rpb24KKy8vIHdob3NlIE4tdGggYXJndW1lbnQgKDAtYmFzZWQpIGlzIGEgcG9pbnRlciB0byB4J3MgdHlwZS4gIFRoZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGtJc1Byb3RvIGlzIHRydWUgaWZmIHR5cGUgQSBpcyBQcm90b2NvbE1lc3NhZ2UsCisvLyBwcm90bzI6Ok1lc3NhZ2UsIG9yIGEgc3ViLWNsYXNzIG9mIHRob3NlLgordGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBBLCBib29sIGtJc1Byb3RvPgorY2xhc3MgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUKKyAgLy8gTi10aCBmdW5jdGlvbiBhcmd1bWVudCB0byAndmFsdWUnLgorICBleHBsaWNpdCBTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb24oY29uc3QgQSYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+CisgIHZvaWQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7CisgICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOworICAgICo6OnRlc3Rpbmc6OmdldDxOPihhcmdzKSA9IHZhbHVlXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgQSB2YWx1ZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb24pOworfTsKKwordGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBQcm90bz4KK2NsYXNzIFNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjxOLCBQcm90bywgdHJ1ZT4geworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhbiBhY3Rpb24gdGhhdCBzZXRzIHRoZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IHRoZQorICAvLyBOLXRoIGZ1bmN0aW9uIGFyZ3VtZW50IHRvICdwcm90bycuICBCb3RoIFByb3RvY29sTWVzc2FnZSBhbmQKKyAgLy8gcHJvdG8yOjpNZXNzYWdlIGhhdmUgdGhlIENvcHlGcm9tKCkgbWV0aG9kLCBzbyB0aGUgc2FtZQorICAvLyBpbXBsZW1lbnRhdGlvbiB3b3JrcyBmb3IgYm90aC4KKyAgZXhwbGljaXQgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKGNvbnN0IFByb3RvJiBwcm90bykgOiBwcm90b18obmV3IFByb3RvKSB7CisgICAgcHJvdG9fLT5Db3B5RnJvbShwcm90byk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorICB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgeworICAgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIFJlc3VsdD4oKTsKKyAgICA6OnRlc3Rpbmc6OmdldDxOPihhcmdzKS0+Q29weUZyb20oKnByb3RvXyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPFByb3RvPiBwcm90b187CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb24pOworfTsKKworLy8gSW1wbGVtZW50cyB0aGUgSW52b2tlV2l0aG91dEFyZ3MoZikgYWN0aW9uLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50CisvLyBGdW5jdGlvbkltcGwgaXMgdGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgZiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhCisvLyBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3Rvci4gIEludm9rZVdpdGhvdXRBcmdzKGYpIGNhbiBiZSB1c2VkIGFzIGFuCisvLyBBY3Rpb248Rj4gYXMgbG9uZyBhcyBmJ3MgdHlwZSBpcyBjb21wYXRpYmxlIHdpdGggRiAoaS5lLiBmIGNhbiBiZQorLy8gYXNzaWduZWQgdG8gYSB0cjE6OmZ1bmN0aW9uPEY+KS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbkltcGw+CitjbGFzcyBJbnZva2VXaXRob3V0QXJnc0FjdGlvbiB7CisgcHVibGljOgorICAvLyBUaGUgYyd0b3IgbWFrZXMgYSBjb3B5IG9mIGZ1bmN0aW9uX2ltcGwgKGVpdGhlciBhIGZ1bmN0aW9uCisgIC8vIHBvaW50ZXIgb3IgYSBmdW5jdG9yKS4KKyAgZXhwbGljaXQgSW52b2tlV2l0aG91dEFyZ3NBY3Rpb24oRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpCisgICAgICA6IGZ1bmN0aW9uX2ltcGxfKGZ1bmN0aW9uX2ltcGwpIHt9CisKKyAgLy8gQWxsb3dzIEludm9rZVdpdGhvdXRBcmdzKGYpIHRvIGJlIHVzZWQgYXMgYW55IGFjdGlvbiB3aG9zZSB0eXBlIGlzCisgIC8vIGNvbXBhdGlibGUgd2l0aCBmLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgeyByZXR1cm4gZnVuY3Rpb25faW1wbF8oKTsgfQorCisgcHJpdmF0ZToKKyAgRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGxfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW52b2tlV2l0aG91dEFyZ3NBY3Rpb24pOworfTsKKworLy8gSW1wbGVtZW50cyB0aGUgSW52b2tlV2l0aG91dEFyZ3Mob2JqZWN0X3B0ciwgJkNsYXNzOjpNZXRob2QpIGFjdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgorY2xhc3MgSW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb24geworIHB1YmxpYzoKKyAgSW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb24oQ2xhc3MqIG9ial9wdHIsIE1ldGhvZFB0ciBtZXRob2RfcHRyKQorICAgICAgOiBvYmpfcHRyXyhvYmpfcHRyKSwgbWV0aG9kX3B0cl8obWV0aG9kX3B0cikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgY29uc3QgeworICAgIHJldHVybiAob2JqX3B0cl8tPiptZXRob2RfcHRyXykoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgQ2xhc3MqIGNvbnN0IG9ial9wdHJfOworICBjb25zdCBNZXRob2RQdHIgbWV0aG9kX3B0cl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbnZva2VNZXRob2RXaXRob3V0QXJnc0FjdGlvbik7Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBJZ25vcmVSZXN1bHQoYWN0aW9uKSBhY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQT4KK2NsYXNzIElnbm9yZVJlc3VsdEFjdGlvbiB7CisgcHVibGljOgorICBleHBsaWNpdCBJZ25vcmVSZXN1bHRBY3Rpb24oY29uc3QgQSYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7CisgICAgLy8gQXNzZXJ0IHN0YXRlbWVudCBiZWxvbmdzIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBiZXN0IHBsYWNlIHRvIHZlcmlmeQorICAgIC8vIGNvbmRpdGlvbnMgb24gRi4gSXQgcHJvZHVjZXMgdGhlIGNsZWFyZXN0IGVycm9yIG1lc3NhZ2VzCisgICAgLy8gaW4gbW9zdCBjb21waWxlcnMuCisgICAgLy8gSW1wbCByZWFsbHkgYmVsb25ncyBpbiB0aGlzIHNjb3BlIGFzIGEgbG9jYWwgY2xhc3MgYnV0IGNhbid0CisgICAgLy8gYmVjYXVzZSBNU1ZDIHByb2R1Y2VzIGR1cGxpY2F0ZSBzeW1ib2xzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cworICAgIC8vIGluIHRoaXMgY2FzZS4gVW50aWwgTVMgZml4ZXMgdGhhdCBidWcgd2UgcHV0IEltcGwgaW50byB0aGUgY2xhc3Mgc2NvcGUKKyAgICAvLyBhbmQgcHV0IHRoZSB0eXBlZGVmIGJvdGggaGVyZSAoZm9yIHVzZSBpbiBhc3NlcnQgc3RhdGVtZW50KSBhbmQKKyAgICAvLyBpbiB0aGUgSW1wbCBjbGFzcy4gQnV0IGJvdGggZGVmaW5pdGlvbnMgbXVzdCBiZSB0aGUgc2FtZS4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKKworICAgIC8vIEFzc2VydHMgYXQgY29tcGlsZSB0aW1lIHRoYXQgRiByZXR1cm5zIHZvaWQuCisgICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOworCisgICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgSW1wbDxGPihhY3Rpb25fKSk7CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3QgQSYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQorCisgICAgdmlydHVhbCB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeworICAgICAgLy8gUGVyZm9ybXMgdGhlIGFjdGlvbiBhbmQgaWdub3JlcyBpdHMgcmVzdWx0LgorICAgICAgYWN0aW9uXy5QZXJmb3JtKGFyZ3MpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICAvLyBUeXBlIE9yaWdpbmFsRnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgRiBleGNlcHQgdGhhdCBpdHMgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBJZ25vcmVkVmFsdWUuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46Ok1ha2VSZXN1bHRJZ25vcmVkVmFsdWUKKyAgICAgICAgT3JpZ2luYWxGdW5jdGlvbjsKKworICAgIGNvbnN0IEFjdGlvbjxPcmlnaW5hbEZ1bmN0aW9uPiBhY3Rpb25fOworCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKKyAgfTsKKworICBjb25zdCBBIGFjdGlvbl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJZ25vcmVSZXN1bHRBY3Rpb24pOworfTsKKworLy8gQSBSZWZlcmVuY2VXcmFwcGVyPFQ+IG9iamVjdCByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIHR5cGUgVCwKKy8vIHdoaWNoIGNhbiBiZSBlaXRoZXIgY29uc3Qgb3Igbm90LiAgSXQgY2FuIGJlIGV4cGxpY2l0bHkgY29udmVydGVkCisvLyBmcm9tLCBhbmQgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8sIGEgVCYuICBVbmxpa2UgYSByZWZlcmVuY2UsCisvLyBSZWZlcmVuY2VXcmFwcGVyPFQ+IGNhbiBiZSBjb3BpZWQgYW5kIGNhbiBzdXJ2aXZlIHRlbXBsYXRlIHR5cGUKKy8vIGluZmVyZW5jZS4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IGJ5LXJlZmVyZW5jZSBhcmd1bWVudHMgaW4gdGhlCisvLyBJbnZva2VBcmd1bWVudDxOPiguLi4pIGFjdGlvbi4gIFRoZSBpZGVhIHdhcyBmcm9tICJyZWZlcmVuY2UKKy8vIHdyYXBwZXJzIiBpbiB0cjEsIHdoaWNoIHdlIGRvbid0IGhhdmUgaW4gb3VyIHNvdXJjZSB0cmVlIHlldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVmZXJlbmNlV3JhcHBlciB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgUmVmZXJlbmNlV3JhcHBlcjxUPiBvYmplY3QgZnJvbSBhIFQmLgorICBleHBsaWNpdCBSZWZlcmVuY2VXcmFwcGVyKFQmIGxfdmFsdWUpIDogcG9pbnRlcl8oJmxfdmFsdWUpIHt9ICAvLyBOT0xJTlQKKworICAvLyBBbGxvd3MgYSBSZWZlcmVuY2VXcmFwcGVyPFQ+IG9iamVjdCB0byBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bworICAvLyBhIFQmLgorICBvcGVyYXRvciBUJigpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyXzsgfQorIHByaXZhdGU6CisgIFQqIHBvaW50ZXJfOworfTsKKworLy8gQWxsb3dzIHRoZSBleHByZXNzaW9uIEJ5UmVmKHgpIHRvIGJlIHByaW50ZWQgYXMgYSByZWZlcmVuY2UgdG8geC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBQcmludFRvKGNvbnN0IFJlZmVyZW5jZVdyYXBwZXI8VD4mIHJlZiwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFQmIHZhbHVlID0gcmVmOworICBVbml2ZXJzYWxQcmludGVyPFQmPjo6UHJpbnQodmFsdWUsIG9zKTsKK30KKworLy8gRG9lcyB0d28gYWN0aW9ucyBzZXF1ZW50aWFsbHkuICBVc2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIERvQWxsKGExLAorLy8gYTIsIC4uLikgYWN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjI+CitjbGFzcyBEb0JvdGhBY3Rpb24geworIHB1YmxpYzoKKyAgRG9Cb3RoQWN0aW9uKEFjdGlvbjEgYWN0aW9uMSwgQWN0aW9uMiBhY3Rpb24yKQorICAgICAgOiBhY3Rpb24xXyhhY3Rpb24xKSwgYWN0aW9uMl8oYWN0aW9uMikge30KKworICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgRG9BbGwoYTEsIC4uLiwgYV9uKQorICAvLyB0byBiZSB1c2VkIGluIEFOWSBmdW5jdGlvbiBvZiBjb21wYXRpYmxlIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7CisgICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgSW1wbDxGPihhY3Rpb24xXywgYWN0aW9uMl8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gSW1wbGVtZW50cyB0aGUgRG9BbGwoLi4uKSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6TWFrZVJlc3VsdFZvaWQgVm9pZFJlc3VsdDsKKworICAgIEltcGwoY29uc3QgQWN0aW9uPFZvaWRSZXN1bHQ+JiBhY3Rpb24xLCBjb25zdCBBY3Rpb248Rj4mIGFjdGlvbjIpCisgICAgICAgIDogYWN0aW9uMV8oYWN0aW9uMSksIGFjdGlvbjJfKGFjdGlvbjIpIHt9CisKKyAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICAgIGFjdGlvbjFfLlBlcmZvcm0oYXJncyk7CisgICAgICByZXR1cm4gYWN0aW9uMl8uUGVyZm9ybShhcmdzKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgQWN0aW9uPFZvaWRSZXN1bHQ+IGFjdGlvbjFfOworICAgIGNvbnN0IEFjdGlvbjxGPiBhY3Rpb24yXzsKKworICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7CisgIH07CisKKyAgQWN0aW9uMSBhY3Rpb24xXzsKKyAgQWN0aW9uMiBhY3Rpb24yXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKERvQm90aEFjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQW4gVW51c2VkIG9iamVjdCBjYW4gYmUgaW1wbGljaXRseSBjb25zdHJ1Y3RlZCBmcm9tIEFOWSB2YWx1ZS4KKy8vIFRoaXMgaXMgaGFuZHkgd2hlbiBkZWZpbmluZyBhY3Rpb25zIHRoYXQgaWdub3JlIHNvbWUgb3IgYWxsIG9mIHRoZQorLy8gbW9jayBmdW5jdGlvbiBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSwgZ2l2ZW4KKy8vCisvLyAgIE1PQ0tfTUVUSE9EMyhGb28sIGRvdWJsZShjb25zdCBzdHJpbmcmIGxhYmVsLCBkb3VibGUgeCwgZG91YmxlIHkpKTsKKy8vICAgTU9DS19NRVRIT0QzKEJhciwgZG91YmxlKGludCBpbmRleCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7CisvLworLy8gaW5zdGVhZCBvZgorLy8KKy8vICAgZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisvLyAgICAgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsKKy8vICAgfQorLy8gICBkb3VibGUgRGlzdGFuY2VUb09yaWdpbldpdGhJbmRleChpbnQgaW5kZXgsIGRvdWJsZSB4LCBkb3VibGUgeSkgeworLy8gICAgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7CisvLyAgIH0KKy8vICAgLi4uCisvLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEZvbygiYWJjIiwgXywgXykpCisvLyAgICAgICAuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwpKTsKKy8vICAgRVhFUENUX0NBTEwobW9jaywgQmFyKDUsIF8sIF8pKQorLy8gICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luV2l0aEluZGV4KSk7CisvLworLy8geW91IGNvdWxkIHdyaXRlCisvLworLy8gICAvLyBXZSBjYW4gZGVjbGFyZSBhbnkgdW5pbnRlcmVzdGluZyBhcmd1bWVudCBhcyBVbnVzZWQuCisvLyAgIGRvdWJsZSBEaXN0YW5jZVRvT3JpZ2luKFVudXNlZCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisvLyAgICAgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsKKy8vICAgfQorLy8gICAuLi4KKy8vICAgRVhFUENUX0NBTEwobW9jaywgRm9vKCJhYmMiLCBfLCBfKSkuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW4pKTsKKy8vICAgRVhFUENUX0NBTEwobW9jaywgQmFyKDUsIF8sIF8pKS5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbikpOwordHlwZWRlZiBpbnRlcm5hbDo6SWdub3JlZFZhbHVlIFVudXNlZDsKKworLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgdXMgdG8gdHVybiBhbiBBY3Rpb248RnJvbT4gb2JqZWN0IGludG8gYW4KKy8vIEFjdGlvbjxUbz4sIGFzIGxvbmcgYXMgVG8ncyBhcmd1bWVudHMgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkCisvLyB0byBGcm9tJ3MgYW5kIEZyb20ncyByZXR1cm4gdHlwZSBjYW5uIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCisvLyBUbydzLgordGVtcGxhdGUgPHR5cGVuYW1lIFRvPgordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+CitBY3Rpb248VG8+OjpBY3Rpb24oY29uc3QgQWN0aW9uPEZyb20+JiBmcm9tKQorICAgIDogaW1wbF8obmV3IGludGVybmFsOjpBY3Rpb25BZGFwdG9yPFRvLCBGcm9tPihmcm9tKSkge30KKworLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zICd2YWx1ZScuICAndmFsdWUnIGlzIHBhc3NlZCBieSB2YWx1ZQorLy8gaW5zdGVhZCBvZiBjb25zdCByZWZlcmVuY2UgLSBvdGhlcndpc2UgUmV0dXJuKCJzdHJpbmcgbGl0ZXJhbCIpCisvLyB3aWxsIHRyaWdnZXIgYSBjb21waWxlciBlcnJvciBhYm91dCB1c2luZyBhcnJheSBhcyBpbml0aWFsaXplci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSPgoraW50ZXJuYWw6OlJldHVybkFjdGlvbjxSPiBSZXR1cm4oUiB2YWx1ZSkgeworICByZXR1cm4gaW50ZXJuYWw6OlJldHVybkFjdGlvbjxSPihpbnRlcm5hbDo6bW92ZSh2YWx1ZSkpOworfQorCisvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgTlVMTC4KK2lubGluZSBQb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6UmV0dXJuTnVsbEFjdGlvbj4gUmV0dXJuTnVsbCgpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6UmV0dXJuTnVsbEFjdGlvbigpKTsKK30KKworLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIGZyb20gYSB2b2lkIGZ1bmN0aW9uLgoraW5saW5lIFBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpSZXR1cm5Wb2lkQWN0aW9uPiBSZXR1cm4oKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oaW50ZXJuYWw6OlJldHVyblZvaWRBY3Rpb24oKSk7Cit9CisKKy8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIGEgdmFyaWFibGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KK2lubGluZSBpbnRlcm5hbDo6UmV0dXJuUmVmQWN0aW9uPFI+IFJldHVyblJlZihSJiB4KSB7ICAvLyBOT0xJTlQKKyAgcmV0dXJuIGludGVybmFsOjpSZXR1cm5SZWZBY3Rpb248Uj4oeCk7Cit9CisKKy8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIGEgY29weSBvZiB0aGUKKy8vIGFyZ3VtZW50LiAgVGhlIGNvcHkgaXMgY3JlYXRlZCB3aGVuIHRoZSBhY3Rpb24gaXMgY29uc3RydWN0ZWQgYW5kCisvLyBsaXZlcyBhcyBsb25nIGFzIHRoZSBhY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KK2lubGluZSBpbnRlcm5hbDo6UmV0dXJuUmVmT2ZDb3B5QWN0aW9uPFI+IFJldHVyblJlZk9mQ29weShjb25zdCBSJiB4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6UmV0dXJuUmVmT2ZDb3B5QWN0aW9uPFI+KHgpOworfQorCisvLyBNb2RpZmllcyB0aGUgcGFyZW50IGFjdGlvbiAoYSBSZXR1cm4oKSBhY3Rpb24pIHRvIHBlcmZvcm0gYSBtb3ZlIG9mIHRoZQorLy8gYXJndW1lbnQgaW5zdGVhZCBvZiBhIGNvcHkuCisvLyBSZXR1cm4oQnlNb3ZlKCkpIGFjdGlvbnMgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgb25jZSBhbmQgd2lsbCBhc3NlcnQgdGhpcworLy8gaW52YXJpYW50LgordGVtcGxhdGUgPHR5cGVuYW1lIFI+CitpbnRlcm5hbDo6QnlNb3ZlV3JhcHBlcjxSPiBCeU1vdmUoUiB4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6QnlNb3ZlV3JhcHBlcjxSPihpbnRlcm5hbDo6bW92ZSh4KSk7Cit9CisKKy8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgZG9lcyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBnaXZlIG1vY2sgZnVuY3Rpb24uCitpbmxpbmUgaW50ZXJuYWw6OkRvRGVmYXVsdEFjdGlvbiBEb0RlZmF1bHQoKSB7CisgIHJldHVybiBpbnRlcm5hbDo6RG9EZWZhdWx0QWN0aW9uKCk7Cit9CisKKy8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgdmFyaWFibGUgcG9pbnRlZCBieSB0aGUgTi10aAorLy8gKDAtYmFzZWQpIGZ1bmN0aW9uIGFyZ3VtZW50IHRvICd2YWx1ZScuCit0ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIFQ+CitQb2x5bW9ycGhpY0FjdGlvbjwKKyAgaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjwKKyAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4gPgorU2V0QXJnUG9pbnRlZShjb25zdCBUJiB4KSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjwKKyAgICAgIE4sIFQsIGludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlPih4KSk7Cit9CisKKyNpZiAhKChHVEVTVF9HQ0NfVkVSXyAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMDAwKSB8fCBHVEVTVF9PU19TWU1CSUFOKQorLy8gVGhpcyBvdmVybG9hZCBhbGxvd3MgU2V0QXJnUG9pbnRlZSgpIHRvIGFjY2VwdCBhIHN0cmluZyBsaXRlcmFsLgorLy8gR0NDIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDQuMCBhbmQgU3ltYmlhbiBDKysgY29tcGlsZXIgY2Fubm90IGRpc3Rpbmd1aXNoCisvLyB0aGlzIG92ZXJsb2FkIGZyb20gdGhlIHRlbXBsYXRlZCB2ZXJzaW9uIGFuZCBlbWl0IGEgY29tcGlsZSBlcnJvci4KK3RlbXBsYXRlIDxzaXplX3QgTj4KK1BvbHltb3JwaGljQWN0aW9uPAorICBpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPE4sIGNvbnN0IGNoYXIqLCBmYWxzZT4gPgorU2V0QXJnUG9pbnRlZShjb25zdCBjaGFyKiBwKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjwKKyAgICAgIE4sIGNvbnN0IGNoYXIqLCBmYWxzZT4ocCkpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IE4+CitQb2x5bW9ycGhpY0FjdGlvbjwKKyAgaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjxOLCBjb25zdCB3Y2hhcl90KiwgZmFsc2U+ID4KK1NldEFyZ1BvaW50ZWUoY29uc3Qgd2NoYXJfdCogcCkgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248CisgICAgICBOLCBjb25zdCB3Y2hhcl90KiwgZmFsc2U+KHApKTsKK30KKyNlbmRpZgorCisvLyBUaGUgZm9sbG93aW5nIHZlcnNpb24gaXMgREVQUkVDQVRFRC4KK3RlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgVD4KK1BvbHltb3JwaGljQWN0aW9uPAorICBpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPAorICAgIE4sIFQsIGludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlPiA+CitTZXRBcmd1bWVudFBvaW50ZWUoY29uc3QgVCYgeCkgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248CisgICAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4oeCkpOworfQorCisvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHNldHMgYSBwb2ludGVyIHJlZmVyZW50IHRvIGEgZ2l2ZW4gdmFsdWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6OkFzc2lnbkFjdGlvbjxUMSwgVDI+ID4gQXNzaWduKFQxKiBwdHIsIFQyIHZhbCkgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpBc3NpZ25BY3Rpb248VDEsIFQyPihwdHIsIHZhbCkpOworfQorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgc2V0cyBlcnJubyBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1BvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpTZXRFcnJub0FuZFJldHVybkFjdGlvbjxUPiA+CitTZXRFcnJub0FuZFJldHVybihpbnQgZXJydmFsLCBUIHJlc3VsdCkgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKAorICAgICAgaW50ZXJuYWw6OlNldEVycm5vQW5kUmV0dXJuQWN0aW9uPFQ+KGVycnZhbCwgcmVzdWx0KSk7Cit9CisKKyNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2VXaXRob3V0QXJncygpLgorCisvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGludm9rZXMgJ2Z1bmN0aW9uX2ltcGwnIHdpdGggbm8gYXJndW1lbnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25JbXBsPgorUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6Okludm9rZVdpdGhvdXRBcmdzQWN0aW9uPEZ1bmN0aW9uSW1wbD4gPgorSW52b2tlV2l0aG91dEFyZ3MoRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKKyAgICAgIGludGVybmFsOjpJbnZva2VXaXRob3V0QXJnc0FjdGlvbjxGdW5jdGlvbkltcGw+KGZ1bmN0aW9uX2ltcGwpKTsKK30KKworLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBnaXZlbiBtZXRob2Qgb24gdGhlIGdpdmVuIG9iamVjdAorLy8gd2l0aCBubyBhcmd1bWVudC4KK3RlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgorUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6Okludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uPENsYXNzLCBNZXRob2RQdHI+ID4KK0ludm9rZVdpdGhvdXRBcmdzKENsYXNzKiBvYmpfcHRyLCBNZXRob2RQdHIgbWV0aG9kX3B0cikgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKAorICAgICAgaW50ZXJuYWw6Okludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uPENsYXNzLCBNZXRob2RQdHI+KAorICAgICAgICAgIG9ial9wdHIsIG1ldGhvZF9wdHIpKTsKK30KKworLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwZXJmb3JtcyBhbl9hY3Rpb24gYW5kIHRocm93cyBhd2F5IGl0cworLy8gcmVzdWx0LiAgSW4gb3RoZXIgd29yZHMsIGl0IGNoYW5nZXMgdGhlIHJldHVybiB0eXBlIG9mIGFuX2FjdGlvbiB0bworLy8gdm9pZC4gIGFuX2FjdGlvbiBNVVNUIE5PVCByZXR1cm4gdm9pZCwgb3IgdGhlIGNvZGUgd29uJ3QgY29tcGlsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBPgoraW5saW5lIGludGVybmFsOjpJZ25vcmVSZXN1bHRBY3Rpb248QT4gSWdub3JlUmVzdWx0KGNvbnN0IEEmIGFuX2FjdGlvbikgeworICByZXR1cm4gaW50ZXJuYWw6Oklnbm9yZVJlc3VsdEFjdGlvbjxBPihhbl9hY3Rpb24pOworfQorCisvLyBDcmVhdGVzIGEgcmVmZXJlbmNlIHdyYXBwZXIgZm9yIHRoZSBnaXZlbiBMLXZhbHVlLiAgSWYgbmVjZXNzYXJ5LAorLy8geW91IGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHR5cGUgb2YgdGhlIHJlZmVyZW5jZS4gIEZvciBleGFtcGxlLAorLy8gc3VwcG9zZSAnZGVyaXZlZCcgaXMgYW4gb2JqZWN0IG9mIHR5cGUgRGVyaXZlZCwgQnlSZWYoZGVyaXZlZCkKKy8vIHdvdWxkIHdyYXAgYSBEZXJpdmVkJi4gIElmIHlvdSB3YW50IHRvIHdyYXAgYSBjb25zdCBCYXNlJiBpbnN0ZWFkLAorLy8gd2hlcmUgQmFzZSBpcyBhIGJhc2UgY2xhc3Mgb2YgRGVyaXZlZCwganVzdCB3cml0ZToKKy8vCisvLyAgIEJ5UmVmPGNvbnN0IEJhc2U+KGRlcml2ZWQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBpbnRlcm5hbDo6UmVmZXJlbmNlV3JhcHBlcjxUPiBCeVJlZihUJiBsX3ZhbHVlKSB7ICAvLyBOT0xJTlQKKyAgcmV0dXJuIGludGVybmFsOjpSZWZlcmVuY2VXcmFwcGVyPFQ+KGxfdmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzE1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1jYXJkaW5hbGl0aWVzLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgY2FyZGluYWxpdGllcy4gIE1vcmUKKy8vIGNhcmRpbmFsaXRpZXMgY2FuIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgaW1wbGVtZW50aW5nIHRoZQorLy8gQ2FyZGluYWxpdHlJbnRlcmZhY2UgaW50ZXJmYWNlIGlmIG5lY2Vzc2FyeS4KKworI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0NBUkRJTkFMSVRJRVNfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19DQVJESU5BTElUSUVTX0hfCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVG8gaW1wbGVtZW50IGEgY2FyZGluYWxpdHkgRm9vLCBkZWZpbmU6CisvLyAgIDEuIGEgY2xhc3MgRm9vQ2FyZGluYWxpdHkgdGhhdCBpbXBsZW1lbnRzIHRoZQorLy8gICAgICBDYXJkaW5hbGl0eUludGVyZmFjZSBpbnRlcmZhY2UsIGFuZAorLy8gICAyLiBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgQ2FyZGluYWxpdHkgb2JqZWN0IGZyb20gYQorLy8gICAgICBjb25zdCBGb29DYXJkaW5hbGl0eSouCisvLworLy8gVGhlIHR3by1sZXZlbCBkZWxlZ2F0aW9uIGRlc2lnbiBmb2xsb3dzIHRoYXQgb2YgTWF0Y2hlciwgcHJvdmlkaW5nCisvLyBjb25zaXN0ZW5jeSBmb3IgZXh0ZW5zaW9uIGRldmVsb3BlcnMuICBJdCBhbHNvIGVhc2VzIG93bmVyc2hpcAorLy8gbWFuYWdlbWVudCBhcyBDYXJkaW5hbGl0eSBvYmplY3RzIGNhbiBub3cgYmUgY29waWVkIGxpa2UgcGxhaW4gdmFsdWVzLgorCisvLyBUaGUgaW1wbGVtZW50YXRpb24gb2YgYSBjYXJkaW5hbGl0eS4KK2NsYXNzIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNhcmRpbmFsaXR5SW50ZXJmYWNlKCkge30KKworICAvLyBDb25zZXJ2YXRpdmUgZXN0aW1hdGUgb24gdGhlIGxvd2VyL3VwcGVyIGJvdW5kIG9mIHRoZSBudW1iZXIgb2YKKyAgLy8gY2FsbHMgYWxsb3dlZC4KKyAgdmlydHVhbCBpbnQgQ29uc2VydmF0aXZlTG93ZXJCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBpbnQgQ29uc2VydmF0aXZlVXBwZXJCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIElOVF9NQVg7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXRpc2Z5IHRoaXMgY2FyZGluYWxpdHkuCisgIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCA9IDA7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0dXJhdGUgdGhpcyBjYXJkaW5hbGl0eS4KKyAgdmlydHVhbCBib29sIElzU2F0dXJhdGVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0ID0gMDsKKworICAvLyBEZXNjcmliZXMgc2VsZiB0byBhbiBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKK307CisKKy8vIEEgQ2FyZGluYWxpdHkgaXMgYSBjb3B5YWJsZSBhbmQgSU1NVVRBQkxFIChleGNlcHQgYnkgYXNzaWdubWVudCkKKy8vIG9iamVjdCB0aGF0IHNwZWNpZmllcyBob3cgbWFueSB0aW1lcyBhIG1vY2sgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8KKy8vIGJlIGNhbGxlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBDYXJkaW5hbGl0eSBpcyBqdXN0IGEgbGlua2VkX3B0cgorLy8gdG8gY29uc3QgQ2FyZGluYWxpdHlJbnRlcmZhY2UsIHNvIGNvcHlpbmcgaXMgZmFpcmx5IGNoZWFwLgorLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIENhcmRpbmFsaXR5IQorY2xhc3MgR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgbnVsbCBjYXJkaW5hbGl0eS4gIE5lZWRlZCBmb3Igc3RvcmluZyBDYXJkaW5hbGl0eQorICAvLyBvYmplY3RzIGluIFNUTCBjb250YWluZXJzLgorICBDYXJkaW5hbGl0eSgpIHt9CisKKyAgLy8gQ29uc3RydWN0cyBhIENhcmRpbmFsaXR5IGZyb20gaXRzIGltcGxlbWVudGF0aW9uLgorICBleHBsaWNpdCBDYXJkaW5hbGl0eShjb25zdCBDYXJkaW5hbGl0eUludGVyZmFjZSogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQorCisgIC8vIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvbiB0aGUgbG93ZXIvdXBwZXIgYm91bmQgb2YgdGhlIG51bWJlciBvZgorICAvLyBjYWxscyBhbGxvd2VkLgorICBpbnQgQ29uc2VydmF0aXZlTG93ZXJCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5Db25zZXJ2YXRpdmVMb3dlckJvdW5kKCk7IH0KKyAgaW50IENvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Q29uc2VydmF0aXZlVXBwZXJCb3VuZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0aXNmeSB0aGlzIGNhcmRpbmFsaXR5LgorICBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbF8tPklzU2F0aXNmaWVkQnlDYWxsQ291bnQoY2FsbF9jb3VudCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXR1cmF0ZSB0aGlzIGNhcmRpbmFsaXR5LgorICBib29sIElzU2F0dXJhdGVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbF8tPklzU2F0dXJhdGVkQnlDYWxsQ291bnQoY2FsbF9jb3VudCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBvdmVyLXNhdHVyYXRlIHRoaXMKKyAgLy8gY2FyZGluYWxpdHksIGkuZS4gZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGNhbGxzLgorICBib29sIElzT3ZlclNhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIGltcGxfLT5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGNhbGxfY291bnQpICYmCisgICAgICAgICFpbXBsXy0+SXNTYXRpc2ZpZWRCeUNhbGxDb3VudChjYWxsX2NvdW50KTsKKyAgfQorCisgIC8vIERlc2NyaWJlcyBzZWxmIHRvIGFuIG9zdHJlYW0KKyAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyBpbXBsXy0+RGVzY3JpYmVUbyhvcyk7IH0KKworICAvLyBEZXNjcmliZXMgdGhlIGdpdmVuIGFjdHVhbCBjYWxsIGNvdW50IHRvIGFuIG9zdHJlYW0uCisgIHN0YXRpYyB2b2lkIERlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oaW50IGFjdHVhbF9jYWxsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKyBwcml2YXRlOgorICBpbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBDYXJkaW5hbGl0eUludGVyZmFjZT4gaW1wbF87Cit9OworCisvLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYXQgbGVhc3QgbiBjYWxscy4KK0dURVNUX0FQSV8gQ2FyZGluYWxpdHkgQXRMZWFzdChpbnQgbik7CisKKy8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBtb3N0IG4gY2FsbHMuCitHVEVTVF9BUElfIENhcmRpbmFsaXR5IEF0TW9zdChpbnQgbik7CisKKy8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhbnkgbnVtYmVyIG9mIGNhbGxzLgorR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBbnlOdW1iZXIoKTsKKworLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGJldHdlZW4gbWluIGFuZCBtYXggY2FsbHMuCitHVEVTVF9BUElfIENhcmRpbmFsaXR5IEJldHdlZW4oaW50IG1pbiwgaW50IG1heCk7CisKKy8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBleGFjdGx5IG4gY2FsbHMuCitHVEVTVF9BUElfIENhcmRpbmFsaXR5IEV4YWN0bHkoaW50IG4pOworCisvLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uCitpbmxpbmUgQ2FyZGluYWxpdHkgTWFrZUNhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5SW50ZXJmYWNlKiBjKSB7CisgIHJldHVybiBDYXJkaW5hbGl0eShjKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0NBUkRJTkFMSVRJRVNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTg4OWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oCkBAIC0wLDAgKzEsMjM3NyBAQAorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgYSBzY3JpcHQuICBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgdmFyaWFkaWMgYWN0aW9ucy4KKworI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCisjZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEludm9rZUhlbHBlcjxGPiBrbm93cyBob3cgdG8gdW5wYWNrIGFuIE4tdHVwbGUgYW5kIGludm9rZSBhbiBOLWFyeQorLy8gZnVuY3Rpb24gb3IgbWV0aG9kIHdpdGggdGhlIHVucGFja2VkIHZhbHVlcywgd2hlcmUgRiBpcyBhIGZ1bmN0aW9uCisvLyB0eXBlIHRoYXQgdGFrZXMgTiBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorY2xhc3MgSW52b2tlSGVscGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KK2NsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPD4gPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTw+JikgeworICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgorICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8PiYpIHsKKyAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPgorY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTE+ID4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgorICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTE+JiBhcmdzKSB7CisgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncykpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+CisgIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMT4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KK2NsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4gPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTI+JiBhcmdzKSB7CisgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KKyAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncykpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KK2NsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTM+ID4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgorICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMz4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncykpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+CisgIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzPiYgYXJncykgeworICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KK2NsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0PiA+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsCisgICAgICBBND4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCisgICAgICAgICAgICAgICBnZXQ8Mz4oYXJncykpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+CisgIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBND4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksCisgICAgICAgICAgICAgICBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICB0eXBlbmFtZSBBNT4KK2NsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNT4gPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwKKyAgICAgIEE1PiYgYXJncykgeworICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgorICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1PiYgYXJncykgeworICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncykpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgorY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4gPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsCisgICAgICBBNj4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCisgICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgorICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksCisgICAgICAgICAgICAgICBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncykpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KK2NsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3PiA+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwKKyAgICAgIEE2LCBBNz4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCisgICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncykpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+CisgIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE3PiYgYXJncykgeworICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDw2PihhcmdzKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KK2NsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOD4gPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsCisgICAgICBBNiwgQTcsIEE4PiYgYXJncykgeworICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDw3PihhcmdzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KKyAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE4PiYgYXJncykgeworICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwKKyAgICAgICAgICAgICAgIGdldDw2PihhcmdzKSwgZ2V0PDc+KGFyZ3MpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KK2NsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTk+ID4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgorICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LAorICAgICAgQTYsIEE3LCBBOCwgQTk+JiBhcmdzKSB7CisgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLAorICAgICAgICAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLAorICAgICAgICAgICAgICAgZ2V0PDc+KGFyZ3MpLCBnZXQ8OD4oYXJncykpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+CisgIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTk+JiBhcmdzKSB7CisgICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAorICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLAorICAgICAgICAgICAgICAgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksCisgICAgdHlwZW5hbWUgQTEwPgorY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwKKyAgICBBMTA+ID4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgorICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LAorICAgICAgQTYsIEE3LCBBOCwgQTksIEExMD4mIGFyZ3MpIHsKKyAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCisgICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksCisgICAgICAgICAgICAgICBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSwgZ2V0PDk+KGFyZ3MpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgorICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE5LCBBMTA+JiBhcmdzKSB7CisgICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAorICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLAorICAgICAgICAgICAgICAgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSwgZ2V0PDk+KGFyZ3MpKTsKKyAgfQorfTsKKworLy8gQW4gSU5URVJOQUwgbWFjcm8gZm9yIGV4dHJhY3RpbmcgdGhlIHR5cGUgb2YgYSB0dXBsZSBmaWVsZC4gIEl0J3MKKy8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUhCisjZGVmaW5lIEdNT0NLX0ZJRUxEXyhUdXBsZSwgTikgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxOLCBUdXBsZT46OnR5cGUKKworLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+Ojp0eXBlIGlzIHRoZQorLy8gdHlwZSBvZiBhbiBuLWFyeSBmdW5jdGlvbiB3aG9zZSBpLXRoICgxLWJhc2VkKSBhcmd1bWVudCB0eXBlIGlzIHRoZQorLy8ga3tpfS10aCAoMC1iYXNlZCkgZmllbGQgb2YgQXJndW1lbnRUdXBsZSwgd2hpY2ggbXVzdCBiZSBhIHR1cGxlCisvLyB0eXBlLCBhbmQgd2hvc2UgcmV0dXJuIHR5cGUgaXMgUmVzdWx0LiAgRm9yIGV4YW1wbGUsCisvLyAgIFNlbGVjdEFyZ3M8aW50LCA6OnRlc3Rpbmc6OnR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZSwgbG9uZz4sIDAsIDM+Ojp0eXBlCisvLyBpcyBpbnQoYm9vbCwgbG9uZykuCisvLworLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+OjpTZWxlY3QoYXJncykKKy8vIHJldHVybnMgdGhlIHNlbGVjdGVkIGZpZWxkcyAoazEsIGsyLCAuLi4sIGtfbikgb2YgYXJncyBhcyBhIHR1cGxlLgorLy8gRm9yIGV4YW1wbGUsCisvLyAgIFNlbGVjdEFyZ3M8aW50LCB0dXBsZTxib29sLCBjaGFyLCBkb3VibGU+LCAyLCAwPjo6U2VsZWN0KAorLy8gICAgICAgOjp0ZXN0aW5nOjptYWtlX3R1cGxlKHRydWUsICdhJywgMi41KSkKKy8vIHJldHVybnMgdHVwbGUgKDIuNSwgdHJ1ZSkuCisvLworLy8gVGhlIG51bWJlcnMgaW4gbGlzdCBrMSwgazIsIC4uLiwga19uIG11c3QgYmUgPj0gMCwgd2hlcmUgbiBjYW4gYmUKKy8vIGluIHRoZSByYW5nZSBbMCwgMTBdLiAgRHVwbGljYXRlcyBhcmUgYWxsb3dlZCBhbmQgdGhleSBkb24ndCBoYXZlCisvLyB0byBiZSBpbiBhbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywKKyAgICBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwgaW50IGs5LCBpbnQgazEwPgorY2xhc3MgU2VsZWN0QXJncyB7CisgcHVibGljOgorICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCisgICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAorICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNyksCisgICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazgpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazkpLAorICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxMCkpOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKKyAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeworICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKKyAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSwKKyAgICAgICAgZ2V0PGs4PihhcmdzKSwgZ2V0PGs5PihhcmdzKSwgZ2V0PGsxMD4oYXJncykpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCisgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7CisgcHVibGljOgorICB0eXBlZGVmIFJlc3VsdCB0eXBlKCk7CisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOworICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiAvKiBhcmdzICovKSB7CisgICAgcmV0dXJuIFNlbGVjdGVkQXJncygpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazE+CitjbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKKyAgICAgICAgICAgICAgICAgazEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOworICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7CisgICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazI+CitjbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKKyAgICAgICAgICAgICAgICAgazEsIGsyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMikpOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKKyAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeworICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazM+CitjbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKKyAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMykpOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKKyAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeworICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCisgICAgaW50IGs0PgorY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCisgICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7CisgcHVibGljOgorICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCisgICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAorICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOworICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7CisgICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpLCBnZXQ8azM+KGFyZ3MpLAorICAgICAgICBnZXQ8azQ+KGFyZ3MpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywKKyAgICBpbnQgazQsIGludCBrNT4KK2NsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAorICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIC0xLCAtMSwgLTEsIC0xLCAtMT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAorICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSkpOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKKyAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeworICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKKyAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCisgICAgaW50IGs0LCBpbnQgazUsIGludCBrNj4KK2NsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAorICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCAtMSwgLTEsIC0xLCAtMT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAorICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksCisgICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazYpKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7CisgIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCisgICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncykpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAorICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNz4KK2NsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAorICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgLTEsIC0xLCAtMT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAorICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksCisgICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazYpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazcpKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7CisgIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCisgICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncyksIGdldDxrNz4oYXJncykpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAorICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4PgorY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCisgICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgLTEsIC0xPiB7CisgcHVibGljOgorICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCisgICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAorICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNyksCisgICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazgpKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7CisgIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCisgICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncyksIGdldDxrNz4oYXJncyksCisgICAgICAgIGdldDxrOD4oYXJncykpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAorICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LCBpbnQgazk+CitjbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKKyAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMyksCisgICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazUpLAorICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs2KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs3KSwKKyAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOSkpOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKKyAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeworICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKKyAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSwKKyAgICAgICAgZ2V0PGs4PihhcmdzKSwgZ2V0PGs5PihhcmdzKSk7CisgIH0KK307CisKKyN1bmRlZiBHTU9DS19GSUVMRF8KKworLy8gSW1wbGVtZW50cyB0aGUgV2l0aEFyZ3MgYWN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIElubmVyQWN0aW9uLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLAorICAgIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLCBpbnQgazggPSAtMSwKKyAgICBpbnQgazkgPSAtMSwgaW50IGsxMCA9IC0xPgorY2xhc3MgV2l0aEFyZ3NBY3Rpb24geworIHB1YmxpYzoKKyAgZXhwbGljaXQgV2l0aEFyZ3NBY3Rpb24oY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeyByZXR1cm4gTWFrZUFjdGlvbihuZXcgSW1wbDxGPihhY3Rpb25fKSk7IH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIDogYWN0aW9uXyhhY3Rpb24pIHt9CisKKyAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICAgIHJldHVybiBhY3Rpb25fLlBlcmZvcm0oU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgazMsIGs0LAorICAgICAgICAgIGs1LCBrNiwgazcsIGs4LCBrOSwgazEwPjo6U2VsZWN0KGFyZ3MpKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKKyAgICAgICAgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwgazEwPjo6dHlwZSBJbm5lckZ1bmN0aW9uVHlwZTsKKworICAgIEFjdGlvbjxJbm5lckZ1bmN0aW9uVHlwZT4gYWN0aW9uXzsKKyAgfTsKKworICBjb25zdCBJbm5lckFjdGlvbiBhY3Rpb25fOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2l0aEFyZ3NBY3Rpb24pOworfTsKKworLy8gQSBtYWNybyBmcm9tIHRoZSBBQ1RJT04qIGZhbWlseSAoZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUpCisvLyBkZWZpbmVzIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbi4gIFR5cGljYWxseSwKKy8vIHRoZXNlIGFjdGlvbnMgb25seSBjYXJlIGFib3V0IGEgc3Vic2V0IG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sKKy8vIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIHN1Y2ggYW4gYWN0aW9uIG9ubHkgdXNlcyB0aGUgc2Vjb25kCisvLyBhcmd1bWVudCwgaXQgY2FuIGJlIHVzZWQgaW4gYW55IG1vY2sgZnVuY3Rpb24gdGhhdCB0YWtlcyA+PSAyCisvLyBhcmd1bWVudHMgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBjb21wYXRpYmxlLgorLy8KKy8vIFRoZXJlZm9yZSwgdGhlIGFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHByZXBhcmVkIHRvIHRha2UgbW9yZQorLy8gYXJndW1lbnRzIHRoYW4gaXQgbmVlZHMuICBUaGUgRXhjZXNzaXZlQXJnIHR5cGUgaXMgdXNlZCB0bworLy8gcmVwcmVzZW50IHRob3NlIGV4Y2Vzc2l2ZSBhcmd1bWVudHMuICBJbiBvcmRlciB0byBrZWVwIHRoZSBjb21waWxlcgorLy8gZXJyb3IgbWVzc2FnZXMgdHJhY3RhYmxlLCB3ZSBkZWZpbmUgaXQgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlCisvLyBpbnN0ZWFkIG9mIHRlc3Rpbmc6OmludGVybmFsLiAgSG93ZXZlciwgdGhpcyBpcyBhbiBJTlRFUk5BTCBUWVBFCisvLyBhbmQgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIHNvIGEgdXNlciBNVVNUIE5PVCBVU0UgVEhJUworLy8gVFlQRSBESVJFQ1RMWS4KK3N0cnVjdCBFeGNlc3NpdmVBcmcge307CisKKy8vIEEgaGVscGVyIGNsYXNzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBQ1RJT04qIG1hY3Jvcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIGNsYXNzIEltcGw+CitjbGFzcyBBY3Rpb25IZWxwZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8PiYgYXJncykgeworICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDw+KGFyZ3MsIEV4Y2Vzc2l2ZUFyZygpLAorICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKKyAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCisgICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMD4KKyAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTA+JiBhcmdzKSB7CisgICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwPihhcmdzLCBnZXQ8MD4oYXJncyksCisgICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAorICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKKyAgICAgICAgRXhjZXNzaXZlQXJnKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMT4KKyAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExPiYgYXJncykgeworICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTE+KGFyZ3MsIGdldDwwPihhcmdzKSwKKyAgICAgICAgZ2V0PDE+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAorICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKKyAgICAgICAgRXhjZXNzaXZlQXJnKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+CisgIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTI+JiBhcmdzKSB7CisgICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTI+KGFyZ3MsIGdldDwwPihhcmdzKSwKKyAgICAgICAgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKKyAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCisgICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KKyAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExLCBBMiwKKyAgICAgIEEzPiYgYXJncykgeworICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMz4oYXJncywgZ2V0PDA+KGFyZ3MpLAorICAgICAgICBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwKKyAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCisgICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+CisgIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLAorICAgICAgQTQ+JiBhcmdzKSB7CisgICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBND4oYXJncywKKyAgICAgICAgZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksCisgICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAorICAgICAgICBFeGNlc3NpdmVBcmcoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgICAgdHlwZW5hbWUgQTU+CisgIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKKyAgICAgIEE1PiYgYXJncykgeworICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMywgQTQsIEE1PihhcmdzLAorICAgICAgICBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwKKyAgICAgICAgZ2V0PDU+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAorICAgICAgICBFeGNlc3NpdmVBcmcoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgorICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMCwgQTEsIEEyLCBBMywgQTQsCisgICAgICBBNSwgQTY+JiBhcmdzKSB7CisgICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PihhcmdzLAorICAgICAgICBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwKKyAgICAgICAgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKKyAgICAgICAgRXhjZXNzaXZlQXJnKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+CisgIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKKyAgICAgIEE1LCBBNiwgQTc+JiBhcmdzKSB7CisgICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LAorICAgICAgICBBNz4oYXJncywgZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLAorICAgICAgICBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLAorICAgICAgICBFeGNlc3NpdmVBcmcoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+CisgIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKKyAgICAgIEE1LCBBNiwgQTcsIEE4PiYgYXJncykgeworICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsCisgICAgICAgIEE4PihhcmdzLCBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksCisgICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLAorICAgICAgICBFeGNlc3NpdmVBcmcoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgorICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMCwgQTEsIEEyLCBBMywgQTQsCisgICAgICBBNSwgQTYsIEE3LCBBOCwgQTk+JiBhcmdzKSB7CisgICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCisgICAgICAgIEE5PihhcmdzLCBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksCisgICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLAorICAgICAgICBnZXQ8OT4oYXJncykpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZSgpLgorCisvLyBXaXRoQXJnczxOMSwgTjIsIC4uLiwgTms+KGFuX2FjdGlvbikgY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMKKy8vIHRoZSBzZWxlY3RlZCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYW5fYWN0aW9uIGFuZAorLy8gcGVyZm9ybXMgaXQuICBJdCBzZXJ2ZXMgYXMgYW4gYWRhcHRvciBiZXR3ZWVuIGFjdGlvbnMgd2l0aAorLy8gZGlmZmVyZW50IGFyZ3VtZW50IGxpc3RzLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0IGFyZ3VtZW50cyBmb3IKKy8vIGZ1bmN0aW9uIHRlbXBsYXRlcywgc28gd2UgaGF2ZSB0byBvdmVybG9hZCBpdC4KK3RlbXBsYXRlIDxpbnQgazEsIHR5cGVuYW1lIElubmVyQWN0aW9uPgoraW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazE+CitXaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxPihhY3Rpb24pOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIHR5cGVuYW1lIElubmVyQWN0aW9uPgoraW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyPgorV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgeworICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazI+KGFjdGlvbik7Cit9CisKK3RlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCB0eXBlbmFtZSBJbm5lckFjdGlvbj4KK2lubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazM+CitXaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazM+KGFjdGlvbik7Cit9CisKK3RlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIHR5cGVuYW1lIElubmVyQWN0aW9uPgoraW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQ+CitXaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0PihhY3Rpb24pOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIHR5cGVuYW1lIElubmVyQWN0aW9uPgoraW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1PgorV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgeworICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazU+KGFjdGlvbik7Cit9CisKK3RlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCB0eXBlbmFtZSBJbm5lckFjdGlvbj4KK2lubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+CitXaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+KGFjdGlvbik7Cit9CisKK3RlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsCisgICAgdHlwZW5hbWUgSW5uZXJBY3Rpb24+CitpbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNz4KK1dpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKKyAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwKKyAgICAgIGs3PihhY3Rpb24pOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsCisgICAgdHlwZW5hbWUgSW5uZXJBY3Rpb24+CitpbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazg+CitXaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LAorICAgICAgazg+KGFjdGlvbik7Cit9CisKK3RlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKKyAgICBpbnQgazksIHR5cGVuYW1lIElubmVyQWN0aW9uPgoraW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOT4KK1dpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKKyAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAorICAgICAgazk+KGFjdGlvbik7Cit9CisKK3RlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKKyAgICBpbnQgazksIGludCBrMTAsIHR5cGVuYW1lIElubmVyQWN0aW9uPgoraW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAorICAgIGs5LCBrMTA+CitXaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKKyAgICAgIGs5LCBrMTA+KGFjdGlvbik7Cit9CisKKy8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgZG9lcyBhY3Rpb25zIGExLCBhMiwgLi4uLCBzZXF1ZW50aWFsbHkgaW4KKy8vIGVhY2ggaW52b2NhdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yPgoraW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4KK0RvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4oYTEsIGEyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjM+CitpbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsCisgICAgQWN0aW9uMz4gPgorRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMykgeworICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMykpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKKyAgICB0eXBlbmFtZSBBY3Rpb240PgoraW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAorICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgQWN0aW9uND4gPiA+CitEb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0KSB7CisgIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKKyAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241PgoraW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAorICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAorICAgIEFjdGlvbjU+ID4gPiA+CitEb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1KSB7CisgIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCisgICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNj4KK2lubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIEFjdGlvbjY+ID4gPiA+ID4KK0RvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYpIHsKKyAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCisgICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNz4KK2lubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKKyAgICBBY3Rpb243PiA+ID4gPiA+ID4KK0RvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCisgICAgQWN0aW9uNyBhNykgeworICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCisgICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywKKyAgICB0eXBlbmFtZSBBY3Rpb244PgoraW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAorICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAorICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb242LAorICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNywgQWN0aW9uOD4gPiA+ID4gPiA+ID4KK0RvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCisgICAgQWN0aW9uNyBhNywgQWN0aW9uOCBhOCkgeworICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yLCB0eXBlbmFtZSBBY3Rpb24zLAorICAgIHR5cGVuYW1lIEFjdGlvbjQsIHR5cGVuYW1lIEFjdGlvbjUsIHR5cGVuYW1lIEFjdGlvbjYsIHR5cGVuYW1lIEFjdGlvbjcsCisgICAgdHlwZW5hbWUgQWN0aW9uOCwgdHlwZW5hbWUgQWN0aW9uOT4KK2lubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjcsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uOCwKKyAgICBBY3Rpb245PiA+ID4gPiA+ID4gPiA+CitEb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1LCBBY3Rpb242IGE2LAorICAgIEFjdGlvbjcgYTcsIEFjdGlvbjggYTgsIEFjdGlvbjkgYTkpIHsKKyAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCisgICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywKKyAgICB0eXBlbmFtZSBBY3Rpb244LCB0eXBlbmFtZSBBY3Rpb245LCB0eXBlbmFtZSBBY3Rpb24xMD4KK2lubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjcsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uOCwKKyAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjksIEFjdGlvbjEwPiA+ID4gPiA+ID4gPiA+ID4KK0RvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCisgICAgQWN0aW9uNyBhNywgQWN0aW9uOCBhOCwgQWN0aW9uOSBhOSwgQWN0aW9uMTAgYTEwKSB7CisgIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gVGhlIEFDVElPTiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bworLy8gZGVmaW5lIGN1c3RvbSBhY3Rpb25zIGVhc2lseS4gIFRoZSBzeW50YXg6CisvLworLy8gICBBQ1RJT04obmFtZSkgeyBzdGF0ZW1lbnRzOyB9CisvLworLy8gd2lsbCBkZWZpbmUgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUKKy8vIHN0YXRlbWVudHMuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSB1c2VkIGFzCisvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24uICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4KKy8vIHJlZmVyIHRvIHRoZSBLLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBieQorLy8gJ2FyZ0snLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ0tfdHlwZScuICBGb3IgZXhhbXBsZToKKy8vCisvLyAgIEFDVElPTihJbmNyZW1lbnRBcmcxKSB7CisvLyAgICAgYXJnMV90eXBlIHRlbXAgPSBhcmcxOworLy8gICAgIHJldHVybiArKygqdGVtcCk7CisvLyAgIH0KKy8vCisvLyBhbGxvd3MgeW91IHRvIHdyaXRlCisvLworLy8gICAuLi5XaWxsT25jZShJbmNyZW1lbnRBcmcxKCkpOworLy8KKy8vIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgZW50aXJlIGFyZ3VtZW50IHR1cGxlIGFuZCBpdHMgdHlwZSBieQorLy8gJ2FyZ3MnIGFuZCAnYXJnc190eXBlJywgYW5kIHJlZmVyIHRvIHRoZSBtb2NrIGZ1bmN0aW9uIHR5cGUgYW5kIGl0cworLy8gcmV0dXJuIHR5cGUgYnkgJ2Z1bmN0aW9uX3R5cGUnIGFuZCAncmV0dXJuX3R5cGUnLgorLy8KKy8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbgorLy8gYXJndW1lbnRzLiAgSG93ZXZlciByZXN0IGFzc3VyZWQgdGhhdCB5b3VyIGNvZGUgaXMgc3RpbGwgdHlwZS1zYWZlOgorLy8geW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmICphcmcxIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgKysKKy8vIG9wZXJhdG9yLCBvciBpZiB0aGUgdHlwZSBvZiArKygqYXJnMSkgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorLy8gbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlLCBmb3IgZXhhbXBsZS4KKy8vCisvLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBhY3Rpb24uICAgRm9yIHRoYXQgeW91IGNhbiB1c2UKKy8vIGFub3RoZXIgbWFjcm86CisvLworLy8gICBBQ1RJT05fUChuYW1lLCBwYXJhbV9uYW1lKSB7IHN0YXRlbWVudHM7IH0KKy8vCisvLyBGb3IgZXhhbXBsZToKKy8vCisvLyAgIEFDVElPTl9QKEFkZCwgbikgeyByZXR1cm4gYXJnMCArIG47IH0KKy8vCisvLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKKy8vCisvLyAgIC4uLldpbGxPbmNlKEFkZCg1KSk7CisvLworLy8gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgorLy8gZWl0aGVyLiAgSWYgeW91IG5lZWQgdG8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkCisvLyAnZm9vJywgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBib2R5IG9mCisvLyBBQ1RJT05fUChBZGQsIG4pIGFib3ZlLCB5b3UgY2FuIHdyaXRlICduX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlCisvLyBvZiAnbicuCisvLworLy8gV2UgYWxzbyBwcm92aWRlIEFDVElPTl9QMiwgQUNUSU9OX1AzLCAuLi4sIHVwIHRvIEFDVElPTl9QMTAgdG8gc3VwcG9ydAorLy8gbXVsdGktcGFyYW1ldGVyIGFjdGlvbnMuCisvLworLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3CisvLworLy8gICBBQ1RJT05fUGsoRm9vLCBwMSwgLi4uLCBwaykgeyAuLi4gfQorLy8KKy8vIGFzIHNob3J0aGFuZCBmb3IKKy8vCisvLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+CisvLyAgIEZvb0FjdGlvblBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4gRm9vKHAxX3R5cGUgcDEsIC4uLiwgcGtfdHlwZSBwaykgeyAuLi4gfQorLy8KKy8vIEluIHBhcnRpY3VsYXIsIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMKKy8vIGV4cGxpY2l0bHkgd2hlbiBpbnZva2luZyBGb28oKSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsIGZhbHNlKTsKKy8vIGFsdGhvdWdoIHVzdWFsbHkgeW91IGNhbiByZWx5IG9uIHRoZSBjb21waWxlciB0byBpbmZlciB0aGUgdHlwZXMKKy8vIGZvciB5b3UgYXV0b21hdGljYWxseS4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbgorLy8gRm9vKHAxLCAuLi4sIHBrKSB0byBhIHZhcmlhYmxlIG9mIHR5cGUgRm9vQWN0aW9uUGs8cDFfdHlwZSwgLi4uLAorLy8gcGtfdHlwZT4uICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgYWN0aW9ucy4KKy8vCisvLyBZb3UgY2FuIGFsc28gb3ZlcmxvYWQgYWN0aW9ucyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6CisvLworLy8gICBBQ1RJT05fUChQbHVzLCBhKSB7IC4uLiB9CisvLyAgIEFDVElPTl9QMihQbHVzLCBhLCBiKSB7IC4uLiB9CisvLworLy8gV2hpbGUgaXQncyB0ZW1wdGluZyB0byBhbHdheXMgdXNlIHRoZSBBQ1RJT04qIG1hY3JvcyB3aGVuIGRlZmluaW5nCisvLyBhIG5ldyBhY3Rpb24sIHlvdSBzaG91bGQgYWxzbyBjb25zaWRlciBpbXBsZW1lbnRpbmcgQWN0aW9uSW50ZXJmYWNlCisvLyBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSBpbnN0ZWFkLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvCisvLyB1c2UgdGhlIGFjdGlvbiBhIGxvdC4gIFdoaWxlIHRoZXNlIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmssCisvLyB0aGV5IGdpdmUgeW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KKy8vIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzIHRvCisvLyBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgdGhhdCBwYXkgb2ZmIGluIHRoZSBsb25nIHJ1bi4gIFRoZXkKKy8vIGFsc28gYWxsb3cgb3ZlcmxvYWRpbmcgYWN0aW9ucyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQKKy8vIHRvIGp1c3QgYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4KKy8vCisvLyBDQVZFQVQ6CisvLworLy8gQUNUSU9OKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzCisvLyB0aGF0IEMrKyBkb2Vzbid0IHlldCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkIHRvCisvLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuCisvLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIEFDVElPTiooKSBpbnNpZGUKKy8vIGEgZnVuY3Rpb24uCisvLworLy8gTU9SRSBJTkZPUk1BVElPTjoKKy8vCisvLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ0FDVElPTicKKy8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suCisKKy8vIEFuIGludGVybmFsIG1hY3JvIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIEFDVElPTiooKS4KKyNkZWZpbmUgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEX1wKKyAgICBjb25zdCBhcmdzX3R5cGUmIGFyZ3MgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKKyAgICBhcmcwX3R5cGUgYXJnMCBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAorICAgIGFyZzFfdHlwZSBhcmcxIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCisgICAgYXJnMl90eXBlIGFyZzIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKKyAgICBhcmczX3R5cGUgYXJnMyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAorICAgIGFyZzRfdHlwZSBhcmc0IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCisgICAgYXJnNV90eXBlIGFyZzUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKKyAgICBhcmc2X3R5cGUgYXJnNiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAorICAgIGFyZzdfdHlwZSBhcmc3IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCisgICAgYXJnOF90eXBlIGFyZzggR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKKyAgICBhcmc5X3R5cGUgYXJnOSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXworCisvLyBTb21ldGltZXMgeW91IHdhbnQgdG8gZ2l2ZSBhbiBhY3Rpb24gZXhwbGljaXQgdGVtcGxhdGUgcGFyYW1ldGVycworLy8gdGhhdCBjYW5ub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgdmFsdWUgcGFyYW1ldGVycy4gIEFDVElPTigpIGFuZAorLy8gQUNUSU9OX1AqKCkgZG9uJ3Qgc3VwcG9ydCB0aGF0LiAgQUNUSU9OX1RFTVBMQVRFKCkgcmVtZWRpZXMgdGhhdAorLy8gYW5kIGNhbiBiZSB2aWV3ZWQgYXMgYW4gZXh0ZW5zaW9uIHRvIEFDVElPTigpIGFuZCBBQ1RJT05fUCooKS4KKy8vCisvLyBUaGUgc3ludGF4OgorLy8KKy8vICAgQUNUSU9OX1RFTVBMQVRFKEFjdGlvbk5hbWUsCisvLyAgICAgICAgICAgICAgICAgICBIQVNfbV9URU1QTEFURV9QQVJBTVMoa2luZDEsIG5hbWUxLCAuLi4sIGtpbmRfbSwgbmFtZV9tKSwKKy8vICAgICAgICAgICAgICAgICAgIEFORF9uX1ZBTFVFX1BBUkFNUyhwMSwgLi4uLCBwX24pKSB7IHN0YXRlbWVudHM7IH0KKy8vCisvLyBkZWZpbmVzIGFuIGFjdGlvbiB0ZW1wbGF0ZSB0aGF0IHRha2VzIG0gZXhwbGljaXQgdGVtcGxhdGUKKy8vIHBhcmFtZXRlcnMgYW5kIG4gdmFsdWUgcGFyYW1ldGVycy4gIG5hbWVfaSBpcyB0aGUgbmFtZSBvZiB0aGUgaS10aAorLy8gdGVtcGxhdGUgcGFyYW1ldGVyLCBhbmQga2luZF9pIHNwZWNpZmllcyB3aGV0aGVyIGl0J3MgYSB0eXBlbmFtZSwKKy8vIGFuIGludGVncmFsIGNvbnN0YW50LCBvciBhIHRlbXBsYXRlLiAgcF9pIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoCisvLyB2YWx1ZSBwYXJhbWV0ZXIuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyAgIC8vIER1cGxpY2F0ZUFyZzxrLCBUPihvdXRwdXQpIGNvbnZlcnRzIHRoZSBrLXRoIGFyZ3VtZW50IG9mIHRoZSBtb2NrCisvLyAgIC8vIGZ1bmN0aW9uIHRvIHR5cGUgVCBhbmQgY29waWVzIGl0IHRvICpvdXRwdXQuCisvLyAgIEFDVElPTl9URU1QTEFURShEdXBsaWNhdGVBcmcsCisvLyAgICAgICAgICAgICAgICAgICBIQVNfMl9URU1QTEFURV9QQVJBTVMoaW50LCBrLCB0eXBlbmFtZSwgVCksCisvLyAgICAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMob3V0cHV0KSkgeworLy8gICAgICpvdXRwdXQgPSBUKDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKKy8vICAgfQorLy8gICAuLi4KKy8vICAgICBpbnQgbjsKKy8vICAgICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oXywgXykpCisvLyAgICAgICAgIC5XaWxsT25jZShEdXBsaWNhdGVBcmc8MSwgdW5zaWduZWQgY2hhcj4oJm4pKTsKKy8vCisvLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRlbXBsYXRlLCB3cml0ZToKKy8vCisvLyAgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tPih2MSwgLi4uLCB2X24pCisvLworLy8gd2hlcmUgdGhlIHRzIGFyZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0aGUgdnMgYXJlIHRoZSB2YWx1ZQorLy8gYXJndW1lbnRzLiAgVGhlIHZhbHVlIGFyZ3VtZW50IHR5cGVzIGFyZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuCisvLyBJZiB5b3Ugd2FudCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHZhbHVlIGFyZ3VtZW50IHR5cGVzLCB5b3UgY2FuCisvLyBwcm92aWRlIGFkZGl0aW9uYWwgdGVtcGxhdGUgYXJndW1lbnRzOgorLy8KKy8vICAgQWN0aW9uTmFtZTx0MSwgLi4uLCB0X20sIHUxLCAuLi4sIHVfaz4odjEsIC4uLiwgdl9uKQorLy8KKy8vIHdoZXJlIHVfaSBpcyB0aGUgZGVzaXJlZCB0eXBlIG9mIHZfaS4KKy8vCisvLyBBQ1RJT05fVEVNUExBVEUgYW5kIEFDVElPTi9BQ1RJT05fUCogY2FuIGJlIG92ZXJsb2FkZWQgb24gdGhlCisvLyBudW1iZXIgb2YgdmFsdWUgcGFyYW1ldGVycywgYnV0IG5vdCBvbiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlCisvLyBwYXJhbWV0ZXJzLiAgV2l0aG91dCB0aGUgcmVzdHJpY3Rpb24sIHRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcKKy8vIGlzIHVuY2xlYXI6CisvLworLy8gICBPdmVybG9hZGVkQWN0aW9uPGludCwgYm9vbD4oeCk7CisvLworLy8gQXJlIHdlIHVzaW5nIGEgc2luZ2xlLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24gd2hlcmUgJ2Jvb2wnIHJlZmVycworLy8gdG8gdGhlIHR5cGUgb2YgeCwgb3IgYXJlIHdlIHVzaW5nIGEgdHdvLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24KKy8vIHdoZXJlIHRoZSBjb21waWxlciBpcyBhc2tlZCB0byBpbmZlciB0aGUgdHlwZSBvZiB4PworLy8KKy8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgorLy8KKy8vIEdNT0NLX0lOVEVSTkFMXypfSEFTX21fVEVNUExBVEVfUEFSQU1TIGFuZAorLy8gR01PQ0tfSU5URVJOQUxfKl9BTkRfbl9WQUxVRV9QQVJBTVMgYXJlIGludGVybmFsIG1hY3JvcyBmb3IKKy8vIGltcGxlbWVudGluZyBBQ1RJT05fVEVNUExBVEUuICBUaGUgbWFpbiB0cmljayB3ZSB1c2UgaXMgdG8gY3JlYXRlCisvLyBuZXcgbWFjcm8gaW52b2NhdGlvbnMgd2hlbiBleHBhbmRpbmcgYSBtYWNyby4gIEZvciBleGFtcGxlLCB3ZSBoYXZlCisvLworLy8gICAjZGVmaW5lIEFDVElPTl9URU1QTEFURShuYW1lLCB0ZW1wbGF0ZV9wYXJhbXMsIHZhbHVlX3BhcmFtcykKKy8vICAgICAgIC4uLiBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zIC4uLgorLy8KKy8vIHdoaWNoIGNhdXNlcyBBQ1RJT05fVEVNUExBVEUoLi4uLCBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLCAuLi4pCisvLyB0byBleHBhbmQgdG8KKy8vCisvLyAgICAgICAuLi4gR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpIC4uLgorLy8KKy8vIFNpbmNlIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzFfVEVNUExBVEVfUEFSQU1TIGlzIGEgbWFjcm8sIHRoZQorLy8gcHJlcHJvY2Vzc29yIHdpbGwgY29udGludWUgdG8gZXhwYW5kIGl0IHRvCisvLworLy8gICAgICAgLi4uIHR5cGVuYW1lIFQgLi4uCisvLworLy8gVGhpcyB0ZWNobmlxdWUgY29uZm9ybXMgdG8gdGhlIEMrKyBzdGFuZGFyZCBhbmQgaXMgcG9ydGFibGUuICBJdAorLy8gYWxsb3dzIHVzIHRvIGltcGxlbWVudCBhY3Rpb24gdGVtcGxhdGVzIHVzaW5nIE8oTikgY29kZSwgd2hlcmUgTiBpcworLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHRlbXBsYXRlL3ZhbHVlIHBhcmFtZXRlcnMgc3VwcG9ydGVkLiAgV2l0aG91dAorLy8gdXNpbmcgaXQsIHdlJ2QgaGF2ZSB0byBkZXZvdGUgTyhOXjIpIGFtb3VudCBvZiBjb2RlIHRvIGltcGxlbWVudCBhbGwKKy8vIGNvbWJpbmF0aW9ucyBvZiBtIGFuZCBuLgorCisvLyBEZWNsYXJlcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwKSBraW5kMCBuYW1lMAorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18yX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBcCisgICAgbmFtZTEpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18zX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAorICAgIGtpbmQyLCBuYW1lMikga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMgorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU180X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAorICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzKSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBcCisgICAga2luZDMgbmFtZTMKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfNV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKKyAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0KSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIFwKKyAgICBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0CisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzZfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCisgICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1KSBraW5kMCBuYW1lMCwgXAorICAgIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU183X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAorICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIFwKKyAgICBuYW1lNikga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBcCisgICAga2luZDUgbmFtZTUsIGtpbmQ2IG5hbWU2CisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzhfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCisgICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgbmFtZTYsIFwKKyAgICBraW5kNywgbmFtZTcpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMSwga2luZDIgbmFtZTIsIGtpbmQzIG5hbWUzLCBcCisgICAga2luZDQgbmFtZTQsIGtpbmQ1IG5hbWU1LCBraW5kNiBuYW1lNiwga2luZDcgbmFtZTcKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfOV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKKyAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBuYW1lNiwgXAorICAgIGtpbmQ3LCBuYW1lNywga2luZDgsIG5hbWU4KSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBcCisgICAga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNSwga2luZDYgbmFtZTYsIGtpbmQ3IG5hbWU3LCBcCisgICAga2luZDggbmFtZTgKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMTBfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwKKyAgICBuYW1lMSwga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgXAorICAgIG5hbWU2LCBraW5kNywgbmFtZTcsIGtpbmQ4LCBuYW1lOCwga2luZDksIG5hbWU5KSBraW5kMCBuYW1lMCwgXAorICAgIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNSwgXAorICAgIGtpbmQ2IG5hbWU2LCBraW5kNyBuYW1lNywga2luZDggbmFtZTgsIGtpbmQ5IG5hbWU5CisKKy8vIExpc3RzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU18xX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTApIG5hbWUwCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzJfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwKKyAgICBuYW1lMSkgbmFtZTAsIG5hbWUxCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzNfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCisgICAga2luZDIsIG5hbWUyKSBuYW1lMCwgbmFtZTEsIG5hbWUyCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzRfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCisgICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzVfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCisgICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIFwKKyAgICBuYW1lNAorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU182X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAorICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSkgbmFtZTAsIG5hbWUxLCBcCisgICAgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfN19URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKKyAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBcCisgICAgbmFtZTYpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2CisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzhfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCisgICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgbmFtZTYsIFwKKyAgICBraW5kNywgbmFtZTcpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2LCBuYW1lNworI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU185X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAorICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIG5hbWU2LCBcCisgICAga2luZDcsIG5hbWU3LCBraW5kOCwgbmFtZTgpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIFwKKyAgICBuYW1lNiwgbmFtZTcsIG5hbWU4CisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzEwX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBcCisgICAgbmFtZTEsIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIFwKKyAgICBuYW1lNiwga2luZDcsIG5hbWU3LCBraW5kOCwgbmFtZTgsIGtpbmQ5LCBuYW1lOSkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgXAorICAgIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2LCBuYW1lNywgbmFtZTgsIG5hbWU5CisKKy8vIERlY2xhcmVzIHRoZSB0eXBlcyBvZiB2YWx1ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzBfVkFMVUVfUEFSQU1TKCkKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgLCB0eXBlbmFtZSBwMCMjX3R5cGUKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpICwgXAorICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgLCBcCisgICAgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSAsIFwKKyAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgdHlwZW5hbWUgcDMjI190eXBlCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSAsIFwKKyAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1KSAsIFwKKyAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKKyAgICBwNikgLCB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAorICAgIHR5cGVuYW1lIHA2IyNfdHlwZQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKKyAgICBwNiwgcDcpICwgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKKyAgICBwNiwgcDcsIHA4KSAsIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCisgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCisgICAgcDYsIHA3LCBwOCwgcDkpICwgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIFwKKyAgICB0eXBlbmFtZSBwMiMjX3R5cGUsIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCBcCisgICAgdHlwZW5hbWUgcDUjI190eXBlLCB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgXAorICAgIHR5cGVuYW1lIHA4IyNfdHlwZSwgdHlwZW5hbWUgcDkjI190eXBlCisKKy8vIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8wX1ZBTFVFX1BBUkFNUygpXAorICAgICgpCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKVwKKyAgICAocDAjI190eXBlIGdtb2NrX3AwKSA6IHAwKGdtb2NrX3AwKQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpXAorICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKVwKKyAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKKyAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMikKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpXAorICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCisgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCisgICAgICAgIHAzKGdtb2NrX3AzKQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpXAorICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCisgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCisgICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCkKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSlcCisgICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKKyAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKKyAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKKyAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNilcCisgICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKKyAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAorICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAorICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNikKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KVwKKyAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAorICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCisgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCisgICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcCisgICAgICAgIHA3KGdtb2NrX3A3KQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAorICAgIHA3LCBwOClcCisgICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKKyAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAorICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXAorICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAorICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXAorICAgICAgICBwOChnbW9ja19wOCkKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCisgICAgcDcsIHA4LCBwOSlcCisgICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKKyAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAorICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcCisgICAgICAgIHA5IyNfdHlwZSBnbW9ja19wOSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCisgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpLCBcCisgICAgICAgIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpCisKKy8vIERlY2xhcmVzIHRoZSBmaWVsZHMgZm9yIHN0b3JpbmcgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzBfVkFMVUVfUEFSQU1TKCkKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMV9WQUxVRV9QQVJBTVMocDApIHAwIyNfdHlwZSBwMDsKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSBwMCMjX3R5cGUgcDA7IFwKKyAgICBwMSMjX3R5cGUgcDE7CisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpIHAwIyNfdHlwZSBwMDsgXAorICAgIHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOworI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgcDAjI190eXBlIHAwOyBcCisgICAgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIFwKKyAgICBwNCkgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBwNCMjX3R5cGUgcDQ7CisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgXAorICAgIHA1KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAorICAgIHA1IyNfdHlwZSBwNTsKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAorICAgIHA2KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAorICAgIHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OworI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAorICAgIHA3KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAorICAgIHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OyBwNyMjX3R5cGUgcDc7CisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCisgICAgcDcsIHA4KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IFwKKyAgICBwNCMjX3R5cGUgcDQ7IHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OyBwNyMjX3R5cGUgcDc7IHA4IyNfdHlwZSBwODsKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCisgICAgcDcsIHA4LCBwOSkgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBcCisgICAgcDQjI190eXBlIHA0OyBwNSMjX3R5cGUgcDU7IHA2IyNfdHlwZSBwNjsgcDcjI190eXBlIHA3OyBwOCMjX3R5cGUgcDg7IFwKKyAgICBwOSMjX3R5cGUgcDk7CisKKy8vIExpc3RzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8wX1ZBTFVFX1BBUkFNUygpCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSBwMAorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpIHAwLCBwMQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSBwMCwgcDEsIHAyCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBwMCwgcDEsIHAyLCBwMworI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpIHAwLCBwMSwgXAorICAgIHAyLCBwMywgcDQKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgcDAsIFwKKyAgICBwMSwgcDIsIHAzLCBwNCwgcDUKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAorICAgIHA2KSBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNgorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAorICAgIHA3KSBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKKyAgICBwNywgcDgpIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCisgICAgcDcsIHA4LCBwOSkgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkKKworLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlciB0eXBlcy4KKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8wX1ZBTFVFX1BBUkFNUygpCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMV9WQUxVRV9QQVJBTVMocDApICwgcDAjI190eXBlCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSAsIHAwIyNfdHlwZSwgXAorICAgIHAxIyNfdHlwZQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpICwgcDAjI190eXBlLCBcCisgICAgcDEjI190eXBlLCBwMiMjX3R5cGUKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgLCBcCisgICAgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSAsIFwKKyAgICBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpICwgXAorICAgIHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBwNSMjX3R5cGUKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCisgICAgcDYpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgXAorICAgIHA2IyNfdHlwZQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKKyAgICBwNiwgcDcpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKKyAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAorICAgIHA2LCBwNywgcDgpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKKyAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAorICAgIHA2LCBwNywgcDgsIHA5KSAsIHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCisgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGUKKworLy8gRGVjbGFyZXMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzBfVkFMVUVfUEFSQU1TKCkKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfMV9WQUxVRV9QQVJBTVMocDApIHAwIyNfdHlwZSBwMAorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpIHAwIyNfdHlwZSBwMCwgXAorICAgIHAxIyNfdHlwZSBwMQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSBwMCMjX3R5cGUgcDAsIFwKKyAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMgorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgcDAjI190eXBlIHAwLCBcCisgICAgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMworI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgXAorICAgIHA0KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNAorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIFwKKyAgICBwNSkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIFwKKyAgICBwNSMjX3R5cGUgcDUKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAorICAgIHA2KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgXAorICAgIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2CisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCisgICAgcDcpIHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBcCisgICAgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNworI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAorICAgIHA3LCBwOCkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCisgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCisgICAgcDcsIHA4LCBwOSkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCisgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgsIFwKKyAgICBwOSMjX3R5cGUgcDkKKworLy8gVGhlIHN1ZmZpeCBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8wX1ZBTFVFX1BBUkFNUygpCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgUAorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSBQMgorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgUDMKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBQNAorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSBQNQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgUDYKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSBQNworI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKKyAgICBwNykgUDgKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCisgICAgcDcsIHA4KSBQOQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCisgICAgcDcsIHA4LCBwOSkgUDEwCisKKy8vIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbiB0ZW1wbGF0ZS4KKyNkZWZpbmUgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8obmFtZSMjQWN0aW9uLCBHTU9DS19JTlRFUk5BTF9DT1VOVF8jI3ZhbHVlX3BhcmFtcykKKworI2RlZmluZSBBQ1RJT05fVEVNUExBVEUobmFtZSwgdGVtcGxhdGVfcGFyYW1zLCB2YWx1ZV9wYXJhbXMpXAorICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wKKyAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cCisgIGNsYXNzIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKSB7XAorICAgcHVibGljOlwKKyAgICBleHBsaWNpdCBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcCisgICAgICAgIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAorICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAorICAgICAgICAgIGFyZ3NfdHlwZTtcCisgICAgICBleHBsaWNpdCBnbW9ja19JbXBsIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCisgICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAorICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAorICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCisgICAgICB9XAorICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCisgICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCisgICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKKyAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAorICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCisgICAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAorICAgICBwcml2YXRlOlwKKyAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAorICAgIH07XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4oXAorICAgICAgICAgIG5ldyBnbW9ja19JbXBsPEY+KEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpKTtcCisgICAgfVwKKyAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcykpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKKyAgaW5saW5lIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcCisgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPiBuYW1lKFwKKyAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdmFsdWVfcGFyYW1zKSB7XAorICAgIHJldHVybiBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XAorICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfIyN2YWx1ZV9wYXJhbXM+KFwKKyAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpO1wKKyAgfVwKKyAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcCisgICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfIyN2YWx1ZV9wYXJhbXM+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAorICAgICAgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwKKyAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV8jI3ZhbHVlX3BhcmFtcz46Omdtb2NrX0ltcGw8Rj46OlwKKyAgICAgICAgICAgICAgZ21vY2tfUGVyZm9ybUltcGwoXAorICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0CisKKyNkZWZpbmUgQUNUSU9OKG5hbWUpXAorICBjbGFzcyBuYW1lIyNBY3Rpb24ge1wKKyAgIHB1YmxpYzpcCisgICAgbmFtZSMjQWN0aW9uKCkge31cCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAorICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAorICAgICAgICAgIGFyZ3NfdHlwZTtcCisgICAgICBnbW9ja19JbXBsKCkge31cCisgICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAorICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAorICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCisgICAgICB9XAorICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCisgICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCisgICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKKyAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAorICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCisgICAgIHByaXZhdGU6XAorICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCisgICAgfTtcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPigpKTtcCisgICAgfVwKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uKTtcCisgIH07XAorICBpbmxpbmUgbmFtZSMjQWN0aW9uIG5hbWUoKSB7XAorICAgIHJldHVybiBuYW1lIyNBY3Rpb24oKTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCisgICAgICBuYW1lIyNBY3Rpb246Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKKyAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAorCisjZGVmaW5lIEFDVElPTl9QKG5hbWUsIHAwKVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI0FjdGlvblAge1wKKyAgIHB1YmxpYzpcCisgICAgZXhwbGljaXQgbmFtZSMjQWN0aW9uUChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHt9XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCisgICAgIHB1YmxpYzpcCisgICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKKyAgICAgICAgICBhcmdzX3R5cGU7XAorICAgICAgZXhwbGljaXQgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHt9XAorICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKKyAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKKyAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAorICAgICAgfVwKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAorICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCisgICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKKyAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgcHJpdmF0ZTpcCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwKSk7XAorICAgIH1cCisgICAgcDAjI190eXBlIHAwO1wKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUCk7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNBY3Rpb25QPHAwIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDApIHtcCisgICAgcmV0dXJuIG5hbWUjI0FjdGlvblA8cDAjI190eXBlPihwMCk7XAorICB9XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKKyAgICAgIG5hbWUjI0FjdGlvblA8cDAjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAorICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0CisKKyNkZWZpbmUgQUNUSU9OX1AyKG5hbWUsIHAwLCBwMSlcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI0FjdGlvblAyIHtcCisgICBwdWJsaWM6XAorICAgIG5hbWUjI0FjdGlvblAyKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXAorICAgICAgICBwMShnbW9ja19wMSkge31cCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAorICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAorICAgICAgICAgIGFyZ3NfdHlwZTtcCisgICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXAorICAgICAgICAgIHAxKGdtb2NrX3AxKSB7fVwKKyAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCisgICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKKyAgICAgIH1cCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKKyAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAorICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCisgICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKKyAgICAgIHAwIyNfdHlwZSBwMDtcCisgICAgICBwMSMjX3R5cGUgcDE7XAorICAgICBwcml2YXRlOlwKKyAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAorICAgIH07XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxKSk7XAorICAgIH1cCisgICAgcDAjI190eXBlIHAwO1wKKyAgICBwMSMjX3R5cGUgcDE7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QMik7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwKKyAgaW5saW5lIG5hbWUjI0FjdGlvblAyPHAwIyNfdHlwZSwgcDEjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAorICAgICAgcDEjI190eXBlIHAxKSB7XAorICAgIHJldHVybiBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCisgICAgICBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKKyAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAorCisjZGVmaW5lIEFDVElPTl9QMyhuYW1lLCBwMCwgcDEsIHAyKVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAorICBjbGFzcyBuYW1lIyNBY3Rpb25QMyB7XAorICAgcHVibGljOlwKKyAgICBuYW1lIyNBY3Rpb25QMyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7fVwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCisgICAgICAgICAgYXJnc190eXBlO1wKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKKyAgICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7fVwKKyAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCisgICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKKyAgICAgIH1cCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKKyAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAorICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCisgICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKKyAgICAgIHAwIyNfdHlwZSBwMDtcCisgICAgICBwMSMjX3R5cGUgcDE7XAorICAgICAgcDIjI190eXBlIHAyO1wKKyAgICAgcHJpdmF0ZTpcCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIpKTtcCisgICAgfVwKKyAgICBwMCMjX3R5cGUgcDA7XAorICAgIHAxIyNfdHlwZSBwMTtcCisgICAgcDIjI190eXBlIHAyO1wKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDMpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlPlwKKyAgaW5saW5lIG5hbWUjI0FjdGlvblAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCisgICAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMikge1wKKyAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBwMik7XAorICB9XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCisgICAgICBuYW1lIyNBY3Rpb25QMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgXAorICAgICAgICAgIHAyIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKKyAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAorCisjZGVmaW5lIEFDVElPTl9QNChuYW1lLCBwMCwgcDEsIHAyLCBwMylcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAorICBjbGFzcyBuYW1lIyNBY3Rpb25QNCB7XAorICAgcHVibGljOlwKKyAgICBuYW1lIyNBY3Rpb25QNChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAorICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7fVwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCisgICAgICAgICAgYXJnc190eXBlO1wKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAorICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCisgICAgICAgICAgcDMoZ21vY2tfcDMpIHt9XAorICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKKyAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKKyAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAorICAgICAgfVwKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAorICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCisgICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKKyAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgIHAxIyNfdHlwZSBwMTtcCisgICAgICBwMiMjX3R5cGUgcDI7XAorICAgICAgcDMjI190eXBlIHAzO1wKKyAgICAgcHJpdmF0ZTpcCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzKSk7XAorICAgIH1cCisgICAgcDAjI190eXBlIHAwO1wKKyAgICBwMSMjX3R5cGUgcDE7XAorICAgIHAyIyNfdHlwZSBwMjtcCisgICAgcDMjI190eXBlIHAzO1wKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDQpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAorICBpbmxpbmUgbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXAorICAgICAgcDMjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIFwKKyAgICAgIHAzIyNfdHlwZSBwMykge1wKKyAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlPihwMCwgcDEsIFwKKyAgICAgICAgcDIsIHAzKTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAorICAgICAgbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXAorICAgICAgICAgIHAzIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKKyAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAorCisjZGVmaW5lIEFDVElPTl9QNShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQpXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAorICBjbGFzcyBuYW1lIyNBY3Rpb25QNSB7XAorICAgcHVibGljOlwKKyAgICBuYW1lIyNBY3Rpb25QNShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgXAorICAgICAgICBwNCMjX3R5cGUgZ21vY2tfcDQpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAorICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSB7fVwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCisgICAgICAgICAgYXJnc190eXBlO1wKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAorICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KSA6IHAwKGdtb2NrX3AwKSwgXAorICAgICAgICAgIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSB7fVwKKyAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCisgICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKKyAgICAgIH1cCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKKyAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAorICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCisgICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKKyAgICAgIHAwIyNfdHlwZSBwMDtcCisgICAgICBwMSMjX3R5cGUgcDE7XAorICAgICAgcDIjI190eXBlIHAyO1wKKyAgICAgIHAzIyNfdHlwZSBwMztcCisgICAgICBwNCMjX3R5cGUgcDQ7XAorICAgICBwcml2YXRlOlwKKyAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAorICAgIH07XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0KSk7XAorICAgIH1cCisgICAgcDAjI190eXBlIHAwO1wKKyAgICBwMSMjX3R5cGUgcDE7XAorICAgIHAyIyNfdHlwZSBwMjtcCisgICAgcDMjI190eXBlIHAzO1wKKyAgICBwNCMjX3R5cGUgcDQ7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNSk7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKKyAgaW5saW5lIG5hbWUjI0FjdGlvblA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgcDQjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAorICAgICAgcDQjI190eXBlIHA0KSB7XAorICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgICAgcDQjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQpO1wKKyAgfVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKKyAgICAgIG5hbWUjI0FjdGlvblA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgICAgIHA0IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKKyAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAorCisjZGVmaW5lIEFDVElPTl9QNihuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1KVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAorICBjbGFzcyBuYW1lIyNBY3Rpb25QNiB7XAorICAgcHVibGljOlwKKyAgICBuYW1lIyNBY3Rpb25QNihwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCisgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCisgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge31cCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAorICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAorICAgICAgICAgIGFyZ3NfdHlwZTtcCisgICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKKyAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAorICAgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCisgICAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSB7fVwKKyAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCisgICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKKyAgICAgIH1cCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKKyAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAorICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCisgICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKKyAgICAgIHAwIyNfdHlwZSBwMDtcCisgICAgICBwMSMjX3R5cGUgcDE7XAorICAgICAgcDIjI190eXBlIHAyO1wKKyAgICAgIHAzIyNfdHlwZSBwMztcCisgICAgICBwNCMjX3R5cGUgcDQ7XAorICAgICAgcDUjI190eXBlIHA1O1wKKyAgICAgcHJpdmF0ZTpcCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKTtcCisgICAgfVwKKyAgICBwMCMjX3R5cGUgcDA7XAorICAgIHAxIyNfdHlwZSBwMTtcCisgICAgcDIjI190eXBlIHAyO1wKKyAgICBwMyMjX3R5cGUgcDM7XAorICAgIHA0IyNfdHlwZSBwNDtcCisgICAgcDUjI190eXBlIHA1O1wKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDYpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKKyAgaW5saW5lIG5hbWUjI0FjdGlvblA2PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgXAorICAgICAgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSkge1wKKyAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKKyAgICAgIG5hbWUjI0FjdGlvblA2PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCisgICAgICAgICAgcDUjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAorICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0CisKKyNkZWZpbmUgQUNUSU9OX1A3KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI0FjdGlvblA3IHtcCisgICBwdWJsaWM6XAorICAgIG5hbWUjI0FjdGlvblA3KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCisgICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKKyAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKKyAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBcCisgICAgICAgIHA2KGdtb2NrX3A2KSB7fVwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCisgICAgICAgICAgYXJnc190eXBlO1wKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAorICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKKyAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAorICAgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSB7fVwKKyAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCisgICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKKyAgICAgIH1cCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKKyAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAorICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCisgICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKKyAgICAgIHAwIyNfdHlwZSBwMDtcCisgICAgICBwMSMjX3R5cGUgcDE7XAorICAgICAgcDIjI190eXBlIHAyO1wKKyAgICAgIHAzIyNfdHlwZSBwMztcCisgICAgICBwNCMjX3R5cGUgcDQ7XAorICAgICAgcDUjI190eXBlIHA1O1wKKyAgICAgIHA2IyNfdHlwZSBwNjtcCisgICAgIHByaXZhdGU6XAorICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCisgICAgfTtcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCisgICAgICAgICAgcDYpKTtcCisgICAgfVwKKyAgICBwMCMjX3R5cGUgcDA7XAorICAgIHAxIyNfdHlwZSBwMTtcCisgICAgcDIjI190eXBlIHAyO1wKKyAgICBwMyMjX3R5cGUgcDM7XAorICAgIHA0IyNfdHlwZSBwNDtcCisgICAgcDUjI190eXBlIHA1O1wKKyAgICBwNiMjX3R5cGUgcDY7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNyk7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIFwKKyAgICAgIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgXAorICAgICAgcDYjI190eXBlIHA2KSB7XAorICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpO1wKKyAgfVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCisgICAgICBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAorICAgICAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAorICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0CisKKyNkZWZpbmUgQUNUSU9OX1A4KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNylcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI0FjdGlvblA4IHtcCisgICBwdWJsaWM6XAorICAgIG5hbWUjI0FjdGlvblA4KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCisgICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKKyAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIFwKKyAgICAgICAgcDcjI190eXBlIGdtb2NrX3A3KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKKyAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcCisgICAgICAgIHA3KGdtb2NrX3A3KSB7fVwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCisgICAgICAgICAgYXJnc190eXBlO1wKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAorICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKKyAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNykgOiBwMChnbW9ja19wMCksIFwKKyAgICAgICAgICBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIFwKKyAgICAgICAgICBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpIHt9XAorICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKKyAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKKyAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAorICAgICAgfVwKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAorICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCisgICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKKyAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgIHAxIyNfdHlwZSBwMTtcCisgICAgICBwMiMjX3R5cGUgcDI7XAorICAgICAgcDMjI190eXBlIHAzO1wKKyAgICAgIHA0IyNfdHlwZSBwNDtcCisgICAgICBwNSMjX3R5cGUgcDU7XAorICAgICAgcDYjI190eXBlIHA2O1wKKyAgICAgIHA3IyNfdHlwZSBwNztcCisgICAgIHByaXZhdGU6XAorICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCisgICAgfTtcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCisgICAgICAgICAgcDYsIHA3KSk7XAorICAgIH1cCisgICAgcDAjI190eXBlIHAwO1wKKyAgICBwMSMjX3R5cGUgcDE7XAorICAgIHAyIyNfdHlwZSBwMjtcCisgICAgcDMjI190eXBlIHAzO1wKKyAgICBwNCMjX3R5cGUgcDQ7XAorICAgIHA1IyNfdHlwZSBwNTtcCisgICAgcDYjI190eXBlIHA2O1wKKyAgICBwNyMjX3R5cGUgcDc7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QOCk7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwKKyAgaW5saW5lIG5hbWUjI0FjdGlvblA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAorICAgICAgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIFwKKyAgICAgIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3KSB7XAorICAgIHJldHVybiBuYW1lIyNBY3Rpb25QODxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCisgICAgICAgIHA2LCBwNyk7XAorICB9XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAorICAgICAgbmFtZSMjQWN0aW9uUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKKyAgICAgICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgXAorICAgICAgICAgIHA3IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKKyAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAorCisjZGVmaW5lIEFDVElPTl9QOShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGU+XAorICBjbGFzcyBuYW1lIyNBY3Rpb25QOSB7XAorICAgcHVibGljOlwKKyAgICBuYW1lIyNBY3Rpb25QOShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCisgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKKyAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKKyAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKKyAgICAgICAgcDgoZ21vY2tfcDgpIHt9XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCisgICAgIHB1YmxpYzpcCisgICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKKyAgICAgICAgICBhcmdzX3R5cGU7XAorICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCisgICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAorICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBcCisgICAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKKyAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKKyAgICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSB7fVwKKyAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCisgICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKKyAgICAgIH1cCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKKyAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAorICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCisgICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKKyAgICAgIHAwIyNfdHlwZSBwMDtcCisgICAgICBwMSMjX3R5cGUgcDE7XAorICAgICAgcDIjI190eXBlIHAyO1wKKyAgICAgIHAzIyNfdHlwZSBwMztcCisgICAgICBwNCMjX3R5cGUgcDQ7XAorICAgICAgcDUjI190eXBlIHA1O1wKKyAgICAgIHA2IyNfdHlwZSBwNjtcCisgICAgICBwNyMjX3R5cGUgcDc7XAorICAgICAgcDgjI190eXBlIHA4O1wKKyAgICAgcHJpdmF0ZTpcCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKKyAgICAgICAgICBwNiwgcDcsIHA4KSk7XAorICAgIH1cCisgICAgcDAjI190eXBlIHAwO1wKKyAgICBwMSMjX3R5cGUgcDE7XAorICAgIHAyIyNfdHlwZSBwMjtcCisgICAgcDMjI190eXBlIHAzO1wKKyAgICBwNCMjX3R5cGUgcDQ7XAorICAgIHA1IyNfdHlwZSBwNTtcCisgICAgcDYjI190eXBlIHA2O1wKKyAgICBwNyMjX3R5cGUgcDc7XAorICAgIHA4IyNfdHlwZSBwODtcCisgICBwcml2YXRlOlwKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblA5KTtcCisgIH07XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNBY3Rpb25QOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAorICAgICAgcDgjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAorICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBcCisgICAgICBwOCMjX3R5cGUgcDgpIHtcCisgICAgcmV0dXJuIG5hbWUjI0FjdGlvblA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZT4ocDAsIHAxLCBwMiwgXAorICAgICAgICBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKKyAgICAgIG5hbWUjI0FjdGlvblA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCisgICAgICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAorICAgICAgICAgIHA4IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKKyAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAorCisjZGVmaW5lIEFDVElPTl9QMTAobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDkjI190eXBlPlwKKyAgY2xhc3MgbmFtZSMjQWN0aW9uUDEwIHtcCisgICBwdWJsaWM6XAorICAgIG5hbWUjI0FjdGlvblAxMChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCisgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKKyAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4LCBwOSMjX3R5cGUgZ21vY2tfcDkpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKKyAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKKyAgICAgICAgcDcoZ21vY2tfcDcpLCBwOChnbW9ja19wOCksIHA5KGdtb2NrX3A5KSB7fVwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCisgICAgICAgICAgYXJnc190eXBlO1wKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAorICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKKyAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcCisgICAgICAgICAgcDkjI190eXBlIGdtb2NrX3A5KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKKyAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKKyAgICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHt9XAorICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKKyAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKKyAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAorICAgICAgfVwKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAorICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKKyAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAorICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCisgICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKKyAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgIHAxIyNfdHlwZSBwMTtcCisgICAgICBwMiMjX3R5cGUgcDI7XAorICAgICAgcDMjI190eXBlIHAzO1wKKyAgICAgIHA0IyNfdHlwZSBwNDtcCisgICAgICBwNSMjX3R5cGUgcDU7XAorICAgICAgcDYjI190eXBlIHA2O1wKKyAgICAgIHA3IyNfdHlwZSBwNztcCisgICAgICBwOCMjX3R5cGUgcDg7XAorICAgICAgcDkjI190eXBlIHA5O1wKKyAgICAgcHJpdmF0ZTpcCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKKyAgICAgICAgICBwNiwgcDcsIHA4LCBwOSkpO1wKKyAgICB9XAorICAgIHAwIyNfdHlwZSBwMDtcCisgICAgcDEjI190eXBlIHAxO1wKKyAgICBwMiMjX3R5cGUgcDI7XAorICAgIHAzIyNfdHlwZSBwMztcCisgICAgcDQjI190eXBlIHA0O1wKKyAgICBwNSMjX3R5cGUgcDU7XAorICAgIHA2IyNfdHlwZSBwNjtcCisgICAgcDcjI190eXBlIHA3O1wKKyAgICBwOCMjX3R5cGUgcDg7XAorICAgIHA5IyNfdHlwZSBwOTtcCisgICBwcml2YXRlOlwKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblAxMCk7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNBY3Rpb25QMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXAorICAgICAgcDkjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAorICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgsIFwKKyAgICAgIHA5IyNfdHlwZSBwOSkge1wKKyAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgcDkjI190eXBlPihwMCwgXAorICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAorICAgICAgbmFtZSMjQWN0aW9uUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCisgICAgICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCisgICAgICAgICAgcDkjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAorICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworCisvLyBUaGUgQUNUSU9OKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwKKy8vIHBhcmFtZXRlcikgaW4gTVNWQyB3aXRoIC1XNC4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW5ub3QgYmUgZml4ZWQgaW4KKy8vIHRoZSBtYWNybyBkZWZpbml0aW9uLCBhcyB0aGUgd2FybmluZ3MgYXJlIGdlbmVyYXRlZCB3aGVuIHRoZSBtYWNybworLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlCisvLyB3ZSBzdXBwcmVzcyB0aGVtIGhlcmUuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQorI2VuZGlmCisKKy8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2VBcmd1bWVudDxOPigpLgorLy8KKy8vIFRoZSBJbnZva2VBcmd1bWVudDxOPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gaW52b2tlcyB0aGUgTi10aAorLy8gKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgay1hcnkgY2FsbGFibGUsIG9mIHRoZSBtb2NrCisvLyBmdW5jdGlvbiwgd2l0aCBhcmd1bWVudHMgYTEsIGEyLCAuLi4sIGFfay4KKy8vCisvLyBOb3RlczoKKy8vCisvLyAgIDEuIFRoZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBieSB2YWx1ZSBieSBkZWZhdWx0LiAgSWYgeW91IG5lZWQgdG8KKy8vICAgcGFzcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UsIHdyYXAgaXQgaW5zaWRlIEJ5UmVmKCkuICBGb3IKKy8vICAgZXhhbXBsZSwKKy8vCisvLyAgICAgSW52b2tlQXJndW1lbnQ8MT4oNSwgc3RyaW5nKCJIZWxsbyIpLCBCeVJlZihmb28pKQorLy8KKy8vICAgcGFzc2VzIDUgYW5kIHN0cmluZygiSGVsbG8iKSBieSB2YWx1ZSwgYW5kIHBhc3NlcyBmb28gYnkKKy8vICAgcmVmZXJlbmNlLgorLy8KKy8vICAgMi4gSWYgdGhlIGNhbGxhYmxlIHRha2VzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSBidXQgQnlSZWYoKSBpcworLy8gICBub3QgdXNlZCwgaXQgd2lsbCByZWNlaXZlIHRoZSByZWZlcmVuY2UgdG8gYSBjb3B5IG9mIHRoZSB2YWx1ZSwKKy8vICAgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuICBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgMC10aAorLy8gICBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0YWtlcyBhIGNvbnN0IHN0cmluZyYsIHRoZSBhY3Rpb24KKy8vCisvLyAgICAgSW52b2tlQXJndW1lbnQ8MD4oc3RyaW5nKCJIZWxsbyIpKQorLy8KKy8vICAgbWFrZXMgYSBjb3B5IG9mIHRoZSB0ZW1wb3Jhcnkgc3RyaW5nKCJIZWxsbyIpIG9iamVjdCBhbmQgcGFzc2VzIGEKKy8vICAgcmVmZXJlbmNlIG9mIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB0ZW1wb3Jhcnkgb2JqZWN0LAorLy8gICB0byB0aGUgY2FsbGFibGUuICBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciB0byBkZWZpbmUgYW4KKy8vICAgSW52b2tlQXJndW1lbnQgYWN0aW9uIGZyb20gdGVtcG9yYXJ5IHZhbHVlcyBhbmQgaGF2ZSBpdCBwZXJmb3JtZWQKKy8vICAgbGF0ZXIuCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CituYW1lc3BhY2UgaW52b2tlX2FyZ3VtZW50IHsKKworLy8gQXBwZWFycyBpbiBJbnZva2VBcmd1bWVudEFkbCdzIGFyZ3VtZW50IGxpc3QgdG8gaGVscCBhdm9pZAorLy8gYWNjaWRlbnRhbCBjYWxscyB0byB1c2VyIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgorc3RydWN0IEFkbFRhZyB7fTsKKworLy8gSW52b2tlQXJndW1lbnRBZGwgLSBhIGhlbHBlciBmb3IgSW52b2tlQXJndW1lbnQuCisvLyBUaGUgYmFzaWMgb3ZlcmxvYWRzIGFyZSBwcm92aWRlZCBoZXJlIGZvciBnZW5lcmljIGZ1bmN0b3JzLgorLy8gT3ZlcmxvYWRzIGZvciBvdGhlciBjdXN0b20tY2FsbGFibGVzIGFyZSBwcm92aWRlZCBpbiB0aGUKKy8vIGludGVybmFsL2N1c3RvbS9jYWxsYmFjay1hY3Rpb25zLmggaGVhZGVyLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRj4KK1IgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYpIHsKKyAgcmV0dXJuIGYoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMT4KK1IgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYsIEExIGExKSB7CisgIHJldHVybiBmKGExKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+CitSIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIpIHsKKyAgcmV0dXJuIGYoYTEsIGEyKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgorUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMykgeworICByZXR1cm4gZihhMSwgYTIsIGEzKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAorICAgIHR5cGVuYW1lIEE0PgorUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQpIHsKKyAgcmV0dXJuIGYoYTEsIGEyLCBhMywgYTQpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCisgICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgorUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1KSB7CisgIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKKyAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgorUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNikgeworICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAorICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgorUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwKKyAgICBBNyBhNykgeworICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKKyAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+CitSIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LAorICAgIEE3IGE3LCBBOCBhOCkgeworICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCisgICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LAorICAgIHR5cGVuYW1lIEE5PgorUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwKKyAgICBBNyBhNywgQTggYTgsIEE5IGE5KSB7CisgIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCisgICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LAorICAgIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+CitSIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LAorICAgIEE3IGE3LCBBOCBhOCwgQTkgYTksIEExMCBhMTApIHsKKyAgcmV0dXJuIGYoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTsKK30KK30gIC8vIG5hbWVzcGFjZSBpbnZva2VfYXJndW1lbnQKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitBQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCisgICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKKyAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7CisgIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCisgICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKKyAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKK30KKworQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwMCkpIHsKKyAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7CisgIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCisgICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKKyAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCk7Cit9CisKK0FDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKKyAgICAgICAgICAgICAgICBBTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSkgeworICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKKyAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKKyAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAorICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSk7Cit9CisKK0FDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKKyAgICAgICAgICAgICAgICBBTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikpIHsKKyAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7CisgIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCisgICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKKyAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyKTsKK30KKworQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorICAgICAgICAgICAgICAgIEFORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykpIHsKKyAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7CisgIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCisgICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKKyAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMyk7Cit9CisKK0FDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKKyAgICAgICAgICAgICAgICBBTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSkgeworICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKKyAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKKyAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAorICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCk7Cit9CisKK0FDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKKyAgICAgICAgICAgICAgICBBTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpIHsKKyAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7CisgIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCisgICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKKyAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTsKK30KKworQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorICAgICAgICAgICAgICAgIEFORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpIHsKKyAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7CisgIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCisgICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKKyAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNik7Cit9CisKK0FDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKKyAgICAgICAgICAgICAgICBBTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KSkgeworICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKKyAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKKyAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAorICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNyk7Cit9CisKK0FDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKKyAgICAgICAgICAgICAgICBBTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkpIHsKKyAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7CisgIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCisgICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKKyAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTsKK30KKworQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorICAgICAgICAgICAgICAgIEFORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSB7CisgIHVzaW5nIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6Okludm9rZUFyZ3VtZW50QWRsOworICByZXR1cm4gSW52b2tlQXJndW1lbnRBZGw8cmV0dXJuX3R5cGU+KAorICAgICAgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6QWRsVGFnKCksCisgICAgICA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpOworfQorCisvLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgUmV0dXJuTmV3PFQ+KCkuCisvLworLy8gVGhlIFJldHVybk5ldzxUPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcKKy8vIGluc3RhbmNlIG9mIHR5cGUgVCwgY29uc3RydWN0ZWQgb24gdGhlIGhlYXAgd2l0aCBjb25zdHJ1Y3RvciBhcmd1bWVudHMKKy8vIGExLCBhMiwgLi4uLCBhbmQgYV9rLiBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KK0FDVElPTl9URU1QTEFURShSZXR1cm5OZXcsCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKKyAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgeworICByZXR1cm4gbmV3IFQoKTsKK30KKworQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAorICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwMCkpIHsKKyAgcmV0dXJuIG5ldyBUKHAwKTsKK30KKworQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAorICAgICAgICAgICAgICAgIEFORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpKSB7CisgIHJldHVybiBuZXcgVChwMCwgcDEpOworfQorCitBQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCisgICAgICAgICAgICAgICAgQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpKSB7CisgIHJldHVybiBuZXcgVChwMCwgcDEsIHAyKTsKK30KKworQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAorICAgICAgICAgICAgICAgIEFORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykpIHsKKyAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzKTsKK30KKworQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAorICAgICAgICAgICAgICAgIEFORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpKSB7CisgIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQpOworfQorCitBQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCisgICAgICAgICAgICAgICAgQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKSB7CisgIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTsKK30KKworQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAorICAgICAgICAgICAgICAgIEFORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpIHsKKyAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KTsKK30KKworQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAorICAgICAgICAgICAgICAgIEFORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpKSB7CisgIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpOworfQorCitBQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCisgICAgICAgICAgICAgICAgQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpKSB7CisgIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTsKK30KKworQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAorICAgICAgICAgICAgICAgIEFORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSB7CisgIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSk7Cit9CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gSW5jbHVkZSBhbnkgY3VzdG9tIGFjdGlvbnMgYWRkZWQgYnkgdGhlIGxvY2FsIGluc3RhbGxhdGlvbi4KKy8vIFdlIG11c3QgaW5jbHVkZSB0aGlzIGhlYWRlciBhdCB0aGUgZW5kIHRvIG1ha2Ugc3VyZSBpdCBjYW4gdXNlIHRoZQorLy8gZGVjbGFyYXRpb25zIGZyb20gdGhpcyBmaWxlLgorI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIgorCisjZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ5ZjlkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wCkBAIC0wLDAgKzEsNzk0IEBACiskJCAtKi0gbW9kZTogYysrOyAtKi0KKyQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlLiAgUGxlYXNlIHVzZSBQdW1wIHRvIGNvbnZlcnQgaXQgdG8KKyQkIGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmguCiskJAorJHZhciBuID0gMTAgICQkIFRoZSBtYXhpbXVtIGFyaXR5IHdlIHN1cHBvcnQuCiskJH19IFRoaXMgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gZWRpdG9ycy4KKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgdmFyaWFkaWMgYWN0aW9ucy4KKworI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCisjZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEludm9rZUhlbHBlcjxGPiBrbm93cyBob3cgdG8gdW5wYWNrIGFuIE4tdHVwbGUgYW5kIGludm9rZSBhbiBOLWFyeQorLy8gZnVuY3Rpb24gb3IgbWV0aG9kIHdpdGggdGhlIHVucGFja2VkIHZhbHVlcywgd2hlcmUgRiBpcyBhIGZ1bmN0aW9uCisvLyB0eXBlIHRoYXQgdGFrZXMgTiBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgorY2xhc3MgSW52b2tlSGVscGVyOworCisKKyRyYW5nZSBpIDAuLm4KKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHZhciB0eXBlcyA9IFtbJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXV1dCiskdmFyIGFzID0gW1skZm9yIGosIFtbQSRqXV1dXQorJHZhciBhcmdzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbIGFyZ3NdXV1dCiskdmFyIGdldHMgPSBbWyRmb3IgaiwgW1tnZXQ8JChqIC0gMSk+KGFyZ3MpXV1dXQordGVtcGxhdGUgPHR5cGVuYW1lIFIkdHlwZXM+CitjbGFzcyBJbnZva2VIZWxwZXI8UiwgOjp0ZXN0aW5nOjp0dXBsZTwkYXM+ID4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgorICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8JGFzPiYkYXJncykgeworICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oJGdldHMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+CisgIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTwkYXM+JiRhcmdzKSB7CisgICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKCRnZXRzKTsKKyAgfQorfTsKKworCitdXQorLy8gQW4gSU5URVJOQUwgbWFjcm8gZm9yIGV4dHJhY3RpbmcgdGhlIHR5cGUgb2YgYSB0dXBsZSBmaWVsZC4gIEl0J3MKKy8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUhCisjZGVmaW5lIEdNT0NLX0ZJRUxEXyhUdXBsZSwgTikgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxOLCBUdXBsZT46OnR5cGUKKworJHJhbmdlIGkgMS4ubgorCisvLyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCAuLi4sIGtfbj46OnR5cGUgaXMgdGhlCisvLyB0eXBlIG9mIGFuIG4tYXJ5IGZ1bmN0aW9uIHdob3NlIGktdGggKDEtYmFzZWQpIGFyZ3VtZW50IHR5cGUgaXMgdGhlCisvLyBre2l9LXRoICgwLWJhc2VkKSBmaWVsZCBvZiBBcmd1bWVudFR1cGxlLCB3aGljaCBtdXN0IGJlIGEgdHVwbGUKKy8vIHR5cGUsIGFuZCB3aG9zZSByZXR1cm4gdHlwZSBpcyBSZXN1bHQuICBGb3IgZXhhbXBsZSwKKy8vICAgU2VsZWN0QXJnczxpbnQsIDo6dGVzdGluZzo6dHVwbGU8Ym9vbCwgY2hhciwgZG91YmxlLCBsb25nPiwgMCwgMz46OnR5cGUKKy8vIGlzIGludChib29sLCBsb25nKS4KKy8vCisvLyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCAuLi4sIGtfbj46OlNlbGVjdChhcmdzKQorLy8gcmV0dXJucyB0aGUgc2VsZWN0ZWQgZmllbGRzIChrMSwgazIsIC4uLiwga19uKSBvZiBhcmdzIGFzIGEgdHVwbGUuCisvLyBGb3IgZXhhbXBsZSwKKy8vICAgU2VsZWN0QXJnczxpbnQsIHR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZT4sIDIsIDA+OjpTZWxlY3QoCisvLyAgICAgICA6OnRlc3Rpbmc6Om1ha2VfdHVwbGUodHJ1ZSwgJ2EnLCAyLjUpKQorLy8gcmV0dXJucyB0dXBsZSAoMi41LCB0cnVlKS4KKy8vCisvLyBUaGUgbnVtYmVycyBpbiBsaXN0IGsxLCBrMiwgLi4uLCBrX24gbXVzdCBiZSA+PSAwLCB3aGVyZSBuIGNhbiBiZQorLy8gaW4gdGhlIHJhbmdlIFswLCAkbl0uICBEdXBsaWNhdGVzIGFyZSBhbGxvd2VkIGFuZCB0aGV5IGRvbid0IGhhdmUKKy8vIHRvIGJlIGluIGFuIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIG9yZGVyLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCAkZm9yIGksIFtbaW50IGskaV1dPgorY2xhc3MgU2VsZWN0QXJncyB7CisgcHVibGljOgorICB0eXBlZGVmIFJlc3VsdCB0eXBlKCRmb3IgaSwgW1tHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgayRpKV1dKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7CisgIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKCRmb3IgaSwgW1tnZXQ8ayRpPihhcmdzKV1dKTsKKyAgfQorfTsKKworCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLm4KKyRyYW5nZSBqMSAxLi5pLTEKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUkZm9yIGoxW1ssIGludCBrJGoxXV0+CitjbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKKyAgICAgICAgICAgICAgICAgJGZvciBqLCBbWyRpZiBqIDw9IGktMSBbW2skal1dICRlbHNlIFtbLTFdXV1dPiB7CisgcHVibGljOgorICB0eXBlZGVmIFJlc3VsdCB0eXBlKCRmb3IgajEsIFtbR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGskajEpXV0pOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKKyAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgW1tdXQorJGlmIGkgPT0gMSBbWy8qIGFyZ3MgKi9dXSAkZWxzZSBbW2FyZ3NdXSkgeworICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoJGZvciBqMSwgW1tnZXQ8ayRqMT4oYXJncyldXSk7CisgIH0KK307CisKKworXV0KKyN1bmRlZiBHTU9DS19GSUVMRF8KKworJHZhciBrcyA9IFtbJGZvciBpLCBbW2skaV1dXV0KKworLy8gSW1wbGVtZW50cyB0aGUgV2l0aEFyZ3MgYWN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIElubmVyQWN0aW9uLCAkZm9yIGksIFtbaW50IGskaSA9IC0xXV0+CitjbGFzcyBXaXRoQXJnc0FjdGlvbiB7CisgcHVibGljOgorICBleHBsaWNpdCBXaXRoQXJnc0FjdGlvbihjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7IHJldHVybiBNYWtlQWN0aW9uKG5ldyBJbXBsPEY+KGFjdGlvbl8pKTsgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+CisgIGNsYXNzIEltcGwgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPEY+IHsKKyAgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OworICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KKworICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeworICAgICAgcmV0dXJuIGFjdGlvbl8uUGVyZm9ybShTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgJGtzPjo6U2VsZWN0KGFyZ3MpKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKKyAgICAgICAgJGtzPjo6dHlwZSBJbm5lckZ1bmN0aW9uVHlwZTsKKworICAgIEFjdGlvbjxJbm5lckZ1bmN0aW9uVHlwZT4gYWN0aW9uXzsKKyAgfTsKKworICBjb25zdCBJbm5lckFjdGlvbiBhY3Rpb25fOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2l0aEFyZ3NBY3Rpb24pOworfTsKKworLy8gQSBtYWNybyBmcm9tIHRoZSBBQ1RJT04qIGZhbWlseSAoZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUpCisvLyBkZWZpbmVzIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbi4gIFR5cGljYWxseSwKKy8vIHRoZXNlIGFjdGlvbnMgb25seSBjYXJlIGFib3V0IGEgc3Vic2V0IG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sKKy8vIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIHN1Y2ggYW4gYWN0aW9uIG9ubHkgdXNlcyB0aGUgc2Vjb25kCisvLyBhcmd1bWVudCwgaXQgY2FuIGJlIHVzZWQgaW4gYW55IG1vY2sgZnVuY3Rpb24gdGhhdCB0YWtlcyA+PSAyCisvLyBhcmd1bWVudHMgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBjb21wYXRpYmxlLgorLy8KKy8vIFRoZXJlZm9yZSwgdGhlIGFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHByZXBhcmVkIHRvIHRha2UgbW9yZQorLy8gYXJndW1lbnRzIHRoYW4gaXQgbmVlZHMuICBUaGUgRXhjZXNzaXZlQXJnIHR5cGUgaXMgdXNlZCB0bworLy8gcmVwcmVzZW50IHRob3NlIGV4Y2Vzc2l2ZSBhcmd1bWVudHMuICBJbiBvcmRlciB0byBrZWVwIHRoZSBjb21waWxlcgorLy8gZXJyb3IgbWVzc2FnZXMgdHJhY3RhYmxlLCB3ZSBkZWZpbmUgaXQgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlCisvLyBpbnN0ZWFkIG9mIHRlc3Rpbmc6OmludGVybmFsLiAgSG93ZXZlciwgdGhpcyBpcyBhbiBJTlRFUk5BTCBUWVBFCisvLyBhbmQgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIHNvIGEgdXNlciBNVVNUIE5PVCBVU0UgVEhJUworLy8gVFlQRSBESVJFQ1RMWS4KK3N0cnVjdCBFeGNlc3NpdmVBcmcge307CisKKy8vIEEgaGVscGVyIGNsYXNzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBQ1RJT04qIG1hY3Jvcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIGNsYXNzIEltcGw+CitjbGFzcyBBY3Rpb25IZWxwZXIgeworIHB1YmxpYzoKKyRyYW5nZSBpIDAuLm4KKyRmb3IgaQorCitbWworJHZhciB0ZW1wbGF0ZSA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWworJHJhbmdlIGogMC4uaS0xCisgIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgQSRqXV0+CitdXV1dCiskcmFuZ2UgaiAwLi5pLTEKKyR2YXIgQXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dCiskdmFyIGFzID0gW1skZm9yIGosIFtbZ2V0PCRqPihhcmdzKV1dXV0KKyRyYW5nZSBrIDEuLm4taQorJHZhciBlYXMgPSBbWyRmb3IgaywgW1tFeGNlc3NpdmVBcmcoKV1dXV0KKyR2YXIgYXJnX2xpc3QgPSBbWyRpZiAoaT09MCkgfCAoaT09bikgW1skYXMkZWFzXV0gJGVsc2UgW1skYXMsICRlYXNdXV1dCiskdGVtcGxhdGUKKyAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8JEFzPiYgYXJncykgeworICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDwkQXM+KGFyZ3MsICRhcmdfbGlzdCk7CisgIH0KKworXV0KK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlKCkuCisKKy8vIFdpdGhBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYW5fYWN0aW9uKSBjcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHBhc3NlcworLy8gdGhlIHNlbGVjdGVkIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhbl9hY3Rpb24gYW5kCisvLyBwZXJmb3JtcyBpdC4gIEl0IHNlcnZlcyBhcyBhbiBhZGFwdG9yIGJldHdlZW4gYWN0aW9ucyB3aXRoCisvLyBkaWZmZXJlbnQgYXJndW1lbnQgbGlzdHMuICBDKysgZG9lc24ndCBzdXBwb3J0IGRlZmF1bHQgYXJndW1lbnRzIGZvcgorLy8gZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0LgorCiskcmFuZ2UgaSAxLi5uCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKK3RlbXBsYXRlIDwkZm9yIGogW1tpbnQgayRqLCBdXXR5cGVuYW1lIElubmVyQWN0aW9uPgoraW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiRmb3IgaiBbWywgayRqXV0+CitXaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24kZm9yIGogW1ssIGskal1dPihhY3Rpb24pOworfQorCisKK11dCisvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRvZXMgYWN0aW9ucyBhMSwgYTIsIC4uLiwgc2VxdWVudGlhbGx5IGluCisvLyBlYWNoIGludm9jYXRpb24uCiskcmFuZ2UgaSAyLi5uCiskZm9yIGkgW1sKKyRyYW5nZSBqIDIuLmkKKyR2YXIgdHlwZXMgPSBbWyRmb3IgaiwgW1t0eXBlbmFtZSBBY3Rpb24kal1dXV0KKyR2YXIgQWFzID0gW1skZm9yIGogW1ssIEFjdGlvbiRqIGEkal1dXV0KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsICR0eXBlcz4KKyRyYW5nZSBrIDEuLmktMQorCitpbmxpbmUgJGZvciBrIFtbaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24kaywgXV1BY3Rpb24kaSRmb3IgayAgW1s+XV0KKworRG9BbGwoQWN0aW9uMSBhMSRBYXMpIHsKKyRpZiBpPT0yIFtbCisKKyAgcmV0dXJuIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4oYTEsIGEyKTsKK11dICRlbHNlIFtbCiskcmFuZ2UgajIgMi4uaQorCisgIHJldHVybiBEb0FsbChhMSwgRG9BbGwoJGZvciBqMiwgW1thJGoyXV0pKTsKK11dCisKK30KKworXV0KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gVGhlIEFDVElPTiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bworLy8gZGVmaW5lIGN1c3RvbSBhY3Rpb25zIGVhc2lseS4gIFRoZSBzeW50YXg6CisvLworLy8gICBBQ1RJT04obmFtZSkgeyBzdGF0ZW1lbnRzOyB9CisvLworLy8gd2lsbCBkZWZpbmUgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUKKy8vIHN0YXRlbWVudHMuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSB1c2VkIGFzCisvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24uICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4KKy8vIHJlZmVyIHRvIHRoZSBLLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBieQorLy8gJ2FyZ0snLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ0tfdHlwZScuICBGb3IgZXhhbXBsZToKKy8vCisvLyAgIEFDVElPTihJbmNyZW1lbnRBcmcxKSB7CisvLyAgICAgYXJnMV90eXBlIHRlbXAgPSBhcmcxOworLy8gICAgIHJldHVybiArKygqdGVtcCk7CisvLyAgIH0KKy8vCisvLyBhbGxvd3MgeW91IHRvIHdyaXRlCisvLworLy8gICAuLi5XaWxsT25jZShJbmNyZW1lbnRBcmcxKCkpOworLy8KKy8vIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgZW50aXJlIGFyZ3VtZW50IHR1cGxlIGFuZCBpdHMgdHlwZSBieQorLy8gJ2FyZ3MnIGFuZCAnYXJnc190eXBlJywgYW5kIHJlZmVyIHRvIHRoZSBtb2NrIGZ1bmN0aW9uIHR5cGUgYW5kIGl0cworLy8gcmV0dXJuIHR5cGUgYnkgJ2Z1bmN0aW9uX3R5cGUnIGFuZCAncmV0dXJuX3R5cGUnLgorLy8KKy8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbgorLy8gYXJndW1lbnRzLiAgSG93ZXZlciByZXN0IGFzc3VyZWQgdGhhdCB5b3VyIGNvZGUgaXMgc3RpbGwgdHlwZS1zYWZlOgorLy8geW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmICphcmcxIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgKysKKy8vIG9wZXJhdG9yLCBvciBpZiB0aGUgdHlwZSBvZiArKygqYXJnMSkgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorLy8gbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlLCBmb3IgZXhhbXBsZS4KKy8vCisvLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBhY3Rpb24uICAgRm9yIHRoYXQgeW91IGNhbiB1c2UKKy8vIGFub3RoZXIgbWFjcm86CisvLworLy8gICBBQ1RJT05fUChuYW1lLCBwYXJhbV9uYW1lKSB7IHN0YXRlbWVudHM7IH0KKy8vCisvLyBGb3IgZXhhbXBsZToKKy8vCisvLyAgIEFDVElPTl9QKEFkZCwgbikgeyByZXR1cm4gYXJnMCArIG47IH0KKy8vCisvLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKKy8vCisvLyAgIC4uLldpbGxPbmNlKEFkZCg1KSk7CisvLworLy8gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgorLy8gZWl0aGVyLiAgSWYgeW91IG5lZWQgdG8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkCisvLyAnZm9vJywgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBib2R5IG9mCisvLyBBQ1RJT05fUChBZGQsIG4pIGFib3ZlLCB5b3UgY2FuIHdyaXRlICduX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlCisvLyBvZiAnbicuCisvLworLy8gV2UgYWxzbyBwcm92aWRlIEFDVElPTl9QMiwgQUNUSU9OX1AzLCAuLi4sIHVwIHRvIEFDVElPTl9QJG4gdG8gc3VwcG9ydAorLy8gbXVsdGktcGFyYW1ldGVyIGFjdGlvbnMuCisvLworLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3CisvLworLy8gICBBQ1RJT05fUGsoRm9vLCBwMSwgLi4uLCBwaykgeyAuLi4gfQorLy8KKy8vIGFzIHNob3J0aGFuZCBmb3IKKy8vCisvLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+CisvLyAgIEZvb0FjdGlvblBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4gRm9vKHAxX3R5cGUgcDEsIC4uLiwgcGtfdHlwZSBwaykgeyAuLi4gfQorLy8KKy8vIEluIHBhcnRpY3VsYXIsIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMKKy8vIGV4cGxpY2l0bHkgd2hlbiBpbnZva2luZyBGb28oKSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsIGZhbHNlKTsKKy8vIGFsdGhvdWdoIHVzdWFsbHkgeW91IGNhbiByZWx5IG9uIHRoZSBjb21waWxlciB0byBpbmZlciB0aGUgdHlwZXMKKy8vIGZvciB5b3UgYXV0b21hdGljYWxseS4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbgorLy8gRm9vKHAxLCAuLi4sIHBrKSB0byBhIHZhcmlhYmxlIG9mIHR5cGUgRm9vQWN0aW9uUGs8cDFfdHlwZSwgLi4uLAorLy8gcGtfdHlwZT4uICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgYWN0aW9ucy4KKy8vCisvLyBZb3UgY2FuIGFsc28gb3ZlcmxvYWQgYWN0aW9ucyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6CisvLworLy8gICBBQ1RJT05fUChQbHVzLCBhKSB7IC4uLiB9CisvLyAgIEFDVElPTl9QMihQbHVzLCBhLCBiKSB7IC4uLiB9CisvLworLy8gV2hpbGUgaXQncyB0ZW1wdGluZyB0byBhbHdheXMgdXNlIHRoZSBBQ1RJT04qIG1hY3JvcyB3aGVuIGRlZmluaW5nCisvLyBhIG5ldyBhY3Rpb24sIHlvdSBzaG91bGQgYWxzbyBjb25zaWRlciBpbXBsZW1lbnRpbmcgQWN0aW9uSW50ZXJmYWNlCisvLyBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSBpbnN0ZWFkLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvCisvLyB1c2UgdGhlIGFjdGlvbiBhIGxvdC4gIFdoaWxlIHRoZXNlIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmssCisvLyB0aGV5IGdpdmUgeW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KKy8vIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzIHRvCisvLyBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgdGhhdCBwYXkgb2ZmIGluIHRoZSBsb25nIHJ1bi4gIFRoZXkKKy8vIGFsc28gYWxsb3cgb3ZlcmxvYWRpbmcgYWN0aW9ucyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQKKy8vIHRvIGp1c3QgYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4KKy8vCisvLyBDQVZFQVQ6CisvLworLy8gQUNUSU9OKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzCisvLyB0aGF0IEMrKyBkb2Vzbid0IHlldCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkIHRvCisvLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuCisvLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIEFDVElPTiooKSBpbnNpZGUKKy8vIGEgZnVuY3Rpb24uCisvLworLy8gTU9SRSBJTkZPUk1BVElPTjoKKy8vCisvLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ0FDVElPTicKKy8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suCisKKyRyYW5nZSBpIDAuLm4KKyRyYW5nZSBrIDAuLm4tMQorCisvLyBBbiBpbnRlcm5hbCBtYWNybyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBBQ1RJT04qKCkuCisjZGVmaW5lIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF9cCisgICAgY29uc3QgYXJnc190eXBlJiBhcmdzIEdURVNUX0FUVFJJQlVURV9VTlVTRURfCiskZm9yIGsgW1ssIFwKKyAgICBhcmcka1tbXV1fdHlwZSBhcmckayBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEX11dCisKKworLy8gU29tZXRpbWVzIHlvdSB3YW50IHRvIGdpdmUgYW4gYWN0aW9uIGV4cGxpY2l0IHRlbXBsYXRlIHBhcmFtZXRlcnMKKy8vIHRoYXQgY2Fubm90IGJlIGluZmVycmVkIGZyb20gaXRzIHZhbHVlIHBhcmFtZXRlcnMuICBBQ1RJT04oKSBhbmQKKy8vIEFDVElPTl9QKigpIGRvbid0IHN1cHBvcnQgdGhhdC4gIEFDVElPTl9URU1QTEFURSgpIHJlbWVkaWVzIHRoYXQKKy8vIGFuZCBjYW4gYmUgdmlld2VkIGFzIGFuIGV4dGVuc2lvbiB0byBBQ1RJT04oKSBhbmQgQUNUSU9OX1AqKCkuCisvLworLy8gVGhlIHN5bnRheDoKKy8vCisvLyAgIEFDVElPTl9URU1QTEFURShBY3Rpb25OYW1lLAorLy8gICAgICAgICAgICAgICAgICAgSEFTX21fVEVNUExBVEVfUEFSQU1TKGtpbmQxLCBuYW1lMSwgLi4uLCBraW5kX20sIG5hbWVfbSksCisvLyAgICAgICAgICAgICAgICAgICBBTkRfbl9WQUxVRV9QQVJBTVMocDEsIC4uLiwgcF9uKSkgeyBzdGF0ZW1lbnRzOyB9CisvLworLy8gZGVmaW5lcyBhbiBhY3Rpb24gdGVtcGxhdGUgdGhhdCB0YWtlcyBtIGV4cGxpY2l0IHRlbXBsYXRlCisvLyBwYXJhbWV0ZXJzIGFuZCBuIHZhbHVlIHBhcmFtZXRlcnMuICBuYW1lX2kgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGgKKy8vIHRlbXBsYXRlIHBhcmFtZXRlciwgYW5kIGtpbmRfaSBzcGVjaWZpZXMgd2hldGhlciBpdCdzIGEgdHlwZW5hbWUsCisvLyBhbiBpbnRlZ3JhbCBjb25zdGFudCwgb3IgYSB0ZW1wbGF0ZS4gIHBfaSBpcyB0aGUgbmFtZSBvZiB0aGUgaS10aAorLy8gdmFsdWUgcGFyYW1ldGVyLgorLy8KKy8vIEV4YW1wbGU6CisvLworLy8gICAvLyBEdXBsaWNhdGVBcmc8aywgVD4ob3V0cHV0KSBjb252ZXJ0cyB0aGUgay10aCBhcmd1bWVudCBvZiB0aGUgbW9jaworLy8gICAvLyBmdW5jdGlvbiB0byB0eXBlIFQgYW5kIGNvcGllcyBpdCB0byAqb3V0cHV0LgorLy8gICBBQ1RJT05fVEVNUExBVEUoRHVwbGljYXRlQXJnLAorLy8gICAgICAgICAgICAgICAgICAgSEFTXzJfVEVNUExBVEVfUEFSQU1TKGludCwgaywgdHlwZW5hbWUsIFQpLAorLy8gICAgICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKG91dHB1dCkpIHsKKy8vICAgICAqb3V0cHV0ID0gVCg6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSk7CisvLyAgIH0KKy8vICAgLi4uCisvLyAgICAgaW50IG47CisvLyAgICAgRVhQRUNUX0NBTEwobW9jaywgRm9vKF8sIF8pKQorLy8gICAgICAgICAuV2lsbE9uY2UoRHVwbGljYXRlQXJnPDEsIHVuc2lnbmVkIGNoYXI+KCZuKSk7CisvLworLy8gVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIGFjdGlvbiB0ZW1wbGF0ZSwgd3JpdGU6CisvLworLy8gICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbT4odjEsIC4uLiwgdl9uKQorLy8KKy8vIHdoZXJlIHRoZSB0cyBhcmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgdGhlIHZzIGFyZSB0aGUgdmFsdWUKKy8vIGFyZ3VtZW50cy4gIFRoZSB2YWx1ZSBhcmd1bWVudCB0eXBlcyBhcmUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLgorLy8gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB2YWx1ZSBhcmd1bWVudCB0eXBlcywgeW91IGNhbgorLy8gcHJvdmlkZSBhZGRpdGlvbmFsIHRlbXBsYXRlIGFyZ3VtZW50czoKKy8vCisvLyAgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tLCB1MSwgLi4uLCB1X2s+KHYxLCAuLi4sIHZfbikKKy8vCisvLyB3aGVyZSB1X2kgaXMgdGhlIGRlc2lyZWQgdHlwZSBvZiB2X2kuCisvLworLy8gQUNUSU9OX1RFTVBMQVRFIGFuZCBBQ1RJT04vQUNUSU9OX1AqIGNhbiBiZSBvdmVybG9hZGVkIG9uIHRoZQorLy8gbnVtYmVyIG9mIHZhbHVlIHBhcmFtZXRlcnMsIGJ1dCBub3Qgb24gdGhlIG51bWJlciBvZiB0ZW1wbGF0ZQorLy8gcGFyYW1ldGVycy4gIFdpdGhvdXQgdGhlIHJlc3RyaWN0aW9uLCB0aGUgbWVhbmluZyBvZiB0aGUgZm9sbG93aW5nCisvLyBpcyB1bmNsZWFyOgorLy8KKy8vICAgT3ZlcmxvYWRlZEFjdGlvbjxpbnQsIGJvb2w+KHgpOworLy8KKy8vIEFyZSB3ZSB1c2luZyBhIHNpbmdsZS10ZW1wbGF0ZS1wYXJhbWV0ZXIgYWN0aW9uIHdoZXJlICdib29sJyByZWZlcnMKKy8vIHRvIHRoZSB0eXBlIG9mIHgsIG9yIGFyZSB3ZSB1c2luZyBhIHR3by10ZW1wbGF0ZS1wYXJhbWV0ZXIgYWN0aW9uCisvLyB3aGVyZSB0aGUgY29tcGlsZXIgaXMgYXNrZWQgdG8gaW5mZXIgdGhlIHR5cGUgb2YgeD8KKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKKy8vCisvLyBHTU9DS19JTlRFUk5BTF8qX0hBU19tX1RFTVBMQVRFX1BBUkFNUyBhbmQKKy8vIEdNT0NLX0lOVEVSTkFMXypfQU5EX25fVkFMVUVfUEFSQU1TIGFyZSBpbnRlcm5hbCBtYWNyb3MgZm9yCisvLyBpbXBsZW1lbnRpbmcgQUNUSU9OX1RFTVBMQVRFLiAgVGhlIG1haW4gdHJpY2sgd2UgdXNlIGlzIHRvIGNyZWF0ZQorLy8gbmV3IG1hY3JvIGludm9jYXRpb25zIHdoZW4gZXhwYW5kaW5nIGEgbWFjcm8uICBGb3IgZXhhbXBsZSwgd2UgaGF2ZQorLy8KKy8vICAgI2RlZmluZSBBQ1RJT05fVEVNUExBVEUobmFtZSwgdGVtcGxhdGVfcGFyYW1zLCB2YWx1ZV9wYXJhbXMpCisvLyAgICAgICAuLi4gR01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtcyAuLi4KKy8vCisvLyB3aGljaCBjYXVzZXMgQUNUSU9OX1RFTVBMQVRFKC4uLiwgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwgLi4uKQorLy8gdG8gZXhwYW5kIHRvCisvLworLy8gICAgICAgLi4uIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSAuLi4KKy8vCisvLyBTaW5jZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xX1RFTVBMQVRFX1BBUkFNUyBpcyBhIG1hY3JvLCB0aGUKKy8vIHByZXByb2Nlc3NvciB3aWxsIGNvbnRpbnVlIHRvIGV4cGFuZCBpdCB0bworLy8KKy8vICAgICAgIC4uLiB0eXBlbmFtZSBUIC4uLgorLy8KKy8vIFRoaXMgdGVjaG5pcXVlIGNvbmZvcm1zIHRvIHRoZSBDKysgc3RhbmRhcmQgYW5kIGlzIHBvcnRhYmxlLiAgSXQKKy8vIGFsbG93cyB1cyB0byBpbXBsZW1lbnQgYWN0aW9uIHRlbXBsYXRlcyB1c2luZyBPKE4pIGNvZGUsIHdoZXJlIE4gaXMKKy8vIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZW1wbGF0ZS92YWx1ZSBwYXJhbWV0ZXJzIHN1cHBvcnRlZC4gIFdpdGhvdXQKKy8vIHVzaW5nIGl0LCB3ZSdkIGhhdmUgdG8gZGV2b3RlIE8oTl4yKSBhbW91bnQgb2YgY29kZSB0byBpbXBsZW1lbnQgYWxsCisvLyBjb21iaW5hdGlvbnMgb2YgbSBhbmQgbi4KKworLy8gRGVjbGFyZXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisKKyRyYW5nZSBqIDEuLm4KKyRmb3IgaiBbWworJHJhbmdlIG0gMC4uai0xCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXyRqW1tdXQorX1RFTVBMQVRFX1BBUkFNUygkZm9yIG0sIFtba2luZCRtLCBuYW1lJG1dXSkgJGZvciBtLCBbW2tpbmQkbSBuYW1lJG1dXQorCisKK11dCisKKy8vIExpc3RzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorCiskZm9yIGogW1sKKyRyYW5nZSBtIDAuLmotMQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU18kaltbXV0KK19URU1QTEFURV9QQVJBTVMoJGZvciBtLCBbW2tpbmQkbSwgbmFtZSRtXV0pICRmb3IgbSwgW1tuYW1lJG1dXQorCisKK11dCisKKy8vIERlY2xhcmVzIHRoZSB0eXBlcyBvZiB2YWx1ZSBwYXJhbWV0ZXJzLgorCiskZm9yIGkgW1sKKyRyYW5nZSBqIDAuLmktMQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXyRpW1tdXQorX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pICRmb3IgaiBbWywgdHlwZW5hbWUgcCRqIyNfdHlwZV1dCisKKworXV0KKworLy8gSW5pdGlhbGl6ZXMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCisKKyRmb3IgaSBbWworJHJhbmdlIGogMC4uaS0xCisjZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXyRpW1tdXV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKVwKKyAgICAoJGZvciBqLCBbW3AkaiMjX3R5cGUgZ21vY2tfcCRqXV0pJGlmIGk+MCBbWyA6IF1dJGZvciBqLCBbW3AkaihnbW9ja19wJGopXV0KKworCitdXQorCisvLyBEZWNsYXJlcyB0aGUgZmllbGRzIGZvciBzdG9yaW5nIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgorCiskZm9yIGkgW1sKKyRyYW5nZSBqIDAuLmktMQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF8kaVtbXV0KK19WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSAkZm9yIGogW1twJGojI190eXBlIHAkajsgXV0KKworCitdXQorCisvLyBMaXN0cyB0aGUgdmFsdWUgcGFyYW1ldGVycy4KKworJGZvciBpIFtbCiskcmFuZ2UgaiAwLi5pLTEKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfJGlbW11dCitfVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgJGZvciBqLCBbW3Akal1dCisKKworXV0KKworLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlciB0eXBlcy4KKworJGZvciBpIFtbCiskcmFuZ2UgaiAwLi5pLTEKKyNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8kaVtbXV0KK19WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSAkZm9yIGogW1ssIHAkaiMjX3R5cGVdXQorCisKK11dCisKKy8vIERlY2xhcmVzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgorCiskZm9yIGkgW1sKKyRyYW5nZSBqIDAuLmktMQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgW1tdXQorJGZvciBqLCBbW3AkaiMjX3R5cGUgcCRqXV0KKworCitdXQorCisvLyBUaGUgc3VmZml4IG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbiB0ZW1wbGF0ZS4KKyRmb3IgaSBbWworCisKKyRyYW5nZSBqIDAuLmktMQorI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pIFtbXV0KKyRpZiBpPT0xIFtbUF1dICRlbGlmIGk+PTIgW1tQJGldXQorXV0KKworCisvLyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuCisjZGVmaW5lIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKVwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKG5hbWUjI0FjdGlvbiwgR01PQ0tfSU5URVJOQUxfQ09VTlRfIyN2YWx1ZV9wYXJhbXMpCisKKyRyYW5nZSBrIDAuLm4tMQorCisjZGVmaW5lIEFDVElPTl9URU1QTEFURShuYW1lLCB0ZW1wbGF0ZV9wYXJhbXMsIHZhbHVlX3BhcmFtcylcCisgIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKKyAgY2xhc3MgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpIHtcCisgICBwdWJsaWM6XAorICAgIGV4cGxpY2l0IEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKVwKKyAgICAgICAgR01PQ0tfSU5URVJOQUxfSU5JVF8jI3ZhbHVlX3BhcmFtcyB7fVwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCisgICAgICAgICAgYXJnc190eXBlO1wKKyAgICAgIGV4cGxpY2l0IGdtb2NrX0ltcGwgR01PQ0tfSU5URVJOQUxfSU5JVF8jI3ZhbHVlX3BhcmFtcyB7fVwKKyAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCisgICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKKyAgICAgIH1cCisgICAgICB0ZW1wbGF0ZSA8JGZvciBrLCBbW3R5cGVuYW1lIGFyZyRrW1tdXV90eXBlXV0+XAorICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzW1tdXQorJGZvciBrIFtbLCBhcmcka1tbXV1fdHlwZSBhcmcka11dKSBjb25zdDtcCisgICAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAorICAgICBwcml2YXRlOlwKKyAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAorICAgIH07XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4oXAorICAgICAgICAgIG5ldyBnbW9ja19JbXBsPEY+KEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpKTtcCisgICAgfVwKKyAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcykpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKKyAgaW5saW5lIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcCisgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPiBuYW1lKFwKKyAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdmFsdWVfcGFyYW1zKSB7XAorICAgIHJldHVybiBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XAorICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfIyN2YWx1ZV9wYXJhbXM+KFwKKyAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpO1wKKyAgfVwKKyAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcCisgICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfIyN2YWx1ZV9wYXJhbXM+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCisgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAorICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAorICAgICAgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwKKyAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAorICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV8jI3ZhbHVlX3BhcmFtcz46Omdtb2NrX0ltcGw8Rj46OlwKKyAgICAgICAgICAgICAgZ21vY2tfUGVyZm9ybUltcGwoXAorICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0CisKKyRmb3IgaQorCitbWworJHZhciB0ZW1wbGF0ZSA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWworJHJhbmdlIGogMC4uaS0xCisKKyAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBwJGojI190eXBlXV0+XAorXV1dXQorJHZhciBjbGFzc19uYW1lID0gW1tuYW1lIyNBY3Rpb25bWyRpZiBpPT0wIFtbXV0gJGVsaWYgaT09MSBbW1BdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgW1tQJGldXV1dXV0KKyRyYW5nZSBqIDAuLmktMQorJHZhciBjdG9yX3BhcmFtX2xpc3QgPSBbWyRmb3IgaiwgW1twJGojI190eXBlIGdtb2NrX3Akal1dXV0KKyR2YXIgcGFyYW1fdHlwZXNfYW5kX25hbWVzID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBwJGpdXV1dCiskdmFyIGluaXRzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbIDogJGZvciBqLCBbW3AkaihnbW9ja19wJGopXV1dXV1dCiskdmFyIHBhcmFtX2ZpZWxkX2RlY2xzID0gW1skZm9yIGoKK1tbCisKKyAgICAgIHAkaiMjX3R5cGUgcCRqO1wKK11dXV0KKyR2YXIgcGFyYW1fZmllbGRfZGVjbHMyID0gW1skZm9yIGoKK1tbCisKKyAgICBwJGojI190eXBlIHAkajtcCitdXV1dCiskdmFyIHBhcmFtcyA9IFtbJGZvciBqLCBbW3Akal1dXV0KKyR2YXIgcGFyYW1fdHlwZXMgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1s8JGZvciBqLCBbW3AkaiMjX3R5cGVdXT5dXV1dCiskdmFyIHR5cGVuYW1lX2FyZ190eXBlcyA9IFtbJGZvciBrLCBbW3R5cGVuYW1lIGFyZyRrW1tdXV90eXBlXV1dXQorJHZhciBhcmdfdHlwZXNfYW5kX25hbWVzID0gW1skZm9yIGssIFtbYXJnJGtbW11dX3R5cGUgYXJnJGtdXV1dCiskdmFyIG1hY3JvX25hbWUgPSBbWyRpZiBpPT0wIFtbQUNUSU9OXV0gJGVsaWYgaT09MSBbW0FDVElPTl9QXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZWxzZSBbW0FDVElPTl9QJGldXV1dCisKKyNkZWZpbmUgJG1hY3JvX25hbWUobmFtZSRmb3IgaiBbWywgcCRqXV0pXCR0ZW1wbGF0ZQorICBjbGFzcyAkY2xhc3NfbmFtZSB7XAorICAgcHVibGljOlwKKyAgICBbWyRpZiBpPT0xIFtbZXhwbGljaXQgXV1dXSRjbGFzc19uYW1lKCRjdG9yX3BhcmFtX2xpc3QpJGluaXRzIHt9XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCisgICAgIHB1YmxpYzpcCisgICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKKyAgICAgICAgICBhcmdzX3R5cGU7XAorICAgICAgW1skaWYgaT09MSBbW2V4cGxpY2l0IF1dXV1nbW9ja19JbXBsKCRjdG9yX3BhcmFtX2xpc3QpJGluaXRzIHt9XAorICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKKyAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKKyAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAorICAgICAgfVwKKyAgICAgIHRlbXBsYXRlIDwkdHlwZW5hbWVfYXJnX3R5cGVzPlwKKyAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgW1tdXQorJGFyZ190eXBlc19hbmRfbmFtZXMpIGNvbnN0O1wkcGFyYW1fZmllbGRfZGVjbHMKKyAgICAgcHJpdmF0ZTpcCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KCRwYXJhbXMpKTtcCisgICAgfVwkcGFyYW1fZmllbGRfZGVjbHMyCisgICBwcml2YXRlOlwKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKCRjbGFzc19uYW1lKTtcCisgIH07XCR0ZW1wbGF0ZQorICBpbmxpbmUgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMgbmFtZSgkcGFyYW1fdHlwZXNfYW5kX25hbWVzKSB7XAorICAgIHJldHVybiAkY2xhc3NfbmFtZSRwYXJhbV90eXBlcygkcGFyYW1zKTtcCisgIH1cJHRlbXBsYXRlCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKKyAgdGVtcGxhdGUgPCR0eXBlbmFtZV9hcmdfdHlwZXM+XAorICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAorICAgICAgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXM6Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKKyAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAorXV0KKyQkIH0gIC8vIFRoaXMgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gRW1hY3MuICBJdCB3b24ndAorJCQgICAgLy8gc2hvdyB1cCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisKKy8vIFRoZSBBQ1RJT04qKCkgbWFjcm9zIHRyaWdnZXIgd2FybmluZyBDNDEwMCAodW5yZWZlcmVuY2VkIGZvcm1hbAorLy8gcGFyYW1ldGVyKSBpbiBNU1ZDIHdpdGggLVc0LiAgVW5mb3J0dW5hdGVseSB0aGV5IGNhbm5vdCBiZSBmaXhlZCBpbgorLy8gdGhlIG1hY3JvIGRlZmluaXRpb24sIGFzIHRoZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1hY3JvCisvLyBpcyBleHBhbmRlZCBhbmQgbWFjcm8gZXhwYW5zaW9uIGNhbm5vdCBjb250YWluICNwcmFnbWEuICBUaGVyZWZvcmUKKy8vIHdlIHN1cHByZXNzIHRoZW0gaGVyZS4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKQorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxMDApCisjZW5kaWYKKworLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZUFyZ3VtZW50PE4+KCkuCisvLworLy8gVGhlIEludm9rZUFyZ3VtZW50PE4+KGExLCBhMiwgLi4uLCBhX2spIGFjdGlvbiBpbnZva2VzIHRoZSBOLXRoCisvLyAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYSBrLWFyeSBjYWxsYWJsZSwgb2YgdGhlIG1vY2sKKy8vIGZ1bmN0aW9uLCB3aXRoIGFyZ3VtZW50cyBhMSwgYTIsIC4uLiwgYV9rLgorLy8KKy8vIE5vdGVzOgorLy8KKy8vICAgMS4gVGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ5IHZhbHVlIGJ5IGRlZmF1bHQuICBJZiB5b3UgbmVlZCB0bworLy8gICBwYXNzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSwgd3JhcCBpdCBpbnNpZGUgQnlSZWYoKS4gIEZvcgorLy8gICBleGFtcGxlLAorLy8KKy8vICAgICBJbnZva2VBcmd1bWVudDwxPig1LCBzdHJpbmcoIkhlbGxvIiksIEJ5UmVmKGZvbykpCisvLworLy8gICBwYXNzZXMgNSBhbmQgc3RyaW5nKCJIZWxsbyIpIGJ5IHZhbHVlLCBhbmQgcGFzc2VzIGZvbyBieQorLy8gICByZWZlcmVuY2UuCisvLworLy8gICAyLiBJZiB0aGUgY2FsbGFibGUgdGFrZXMgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlIGJ1dCBCeVJlZigpIGlzCisvLyAgIG5vdCB1c2VkLCBpdCB3aWxsIHJlY2VpdmUgdGhlIHJlZmVyZW5jZSB0byBhIGNvcHkgb2YgdGhlIHZhbHVlLAorLy8gICBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIEZvciBleGFtcGxlLCB3aGVuIHRoZSAwLXRoCisvLyAgIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRha2VzIGEgY29uc3Qgc3RyaW5nJiwgdGhlIGFjdGlvbgorLy8KKy8vICAgICBJbnZva2VBcmd1bWVudDwwPihzdHJpbmcoIkhlbGxvIikpCisvLworLy8gICBtYWtlcyBhIGNvcHkgb2YgdGhlIHRlbXBvcmFyeSBzdHJpbmcoIkhlbGxvIikgb2JqZWN0IGFuZCBwYXNzZXMgYQorLy8gICByZWZlcmVuY2Ugb2YgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHRlbXBvcmFyeSBvYmplY3QsCisvLyAgIHRvIHRoZSBjYWxsYWJsZS4gIFRoaXMgbWFrZXMgaXQgZWFzeSBmb3IgYSB1c2VyIHRvIGRlZmluZSBhbgorLy8gICBJbnZva2VBcmd1bWVudCBhY3Rpb24gZnJvbSB0ZW1wb3JhcnkgdmFsdWVzIGFuZCBoYXZlIGl0IHBlcmZvcm1lZAorLy8gICBsYXRlci4KKworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSBpbnZva2VfYXJndW1lbnQgeworCisvLyBBcHBlYXJzIGluIEludm9rZUFyZ3VtZW50QWRsJ3MgYXJndW1lbnQgbGlzdCB0byBoZWxwIGF2b2lkCisvLyBhY2NpZGVudGFsIGNhbGxzIHRvIHVzZXIgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUuCitzdHJ1Y3QgQWRsVGFnIHt9OworCisvLyBJbnZva2VBcmd1bWVudEFkbCAtIGEgaGVscGVyIGZvciBJbnZva2VBcmd1bWVudC4KKy8vIFRoZSBiYXNpYyBvdmVybG9hZHMgYXJlIHByb3ZpZGVkIGhlcmUgZm9yIGdlbmVyaWMgZnVuY3RvcnMuCisvLyBPdmVybG9hZHMgZm9yIG90aGVyIGN1c3RvbS1jYWxsYWJsZXMgYXJlIHByb3ZpZGVkIGluIHRoZQorLy8gaW50ZXJuYWwvY3VzdG9tL2NhbGxiYWNrLWFjdGlvbnMuaCBoZWFkZXIuCisKKyRyYW5nZSBpIDAuLm4KKyRmb3IgaQorW1sKKyRyYW5nZSBqIDEuLmkKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEZbWyRmb3IgaiBbWywgdHlwZW5hbWUgQSRqXV1dXT4KK1IgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGZbWyRmb3IgaiBbWywgQSRqIGEkal1dXV0pIHsKKyAgcmV0dXJuIGYoW1skZm9yIGosIFtbYSRqXV1dXSk7Cit9CitdXQorCit9ICAvLyBuYW1lc3BhY2UgaW52b2tlX2FyZ3VtZW50Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworJHJhbmdlIGkgMC4ubgorJGZvciBpIFtbCiskcmFuZ2UgaiAwLi5pLTEKKworQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorICAgICAgICAgICAgICAgIEFORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkpIHsKKyAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7CisgIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCisgICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKKyAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpJGZvciBqIFtbLCBwJGpdXSk7Cit9CisKK11dCisKKy8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBSZXR1cm5OZXc8VD4oKS4KKy8vCisvLyBUaGUgUmV0dXJuTmV3PFQ+KGExLCBhMiwgLi4uLCBhX2spIGFjdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ldworLy8gaW5zdGFuY2Ugb2YgdHlwZSBULCBjb25zdHJ1Y3RlZCBvbiB0aGUgaGVhcCB3aXRoIGNvbnN0cnVjdG9yIGFyZ3VtZW50cworLy8gYTEsIGEyLCAuLi4sIGFuZCBhX2suIFRoZSBjYWxsZXIgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIHZhbHVlLgorJHJhbmdlIGkgMC4ubgorJGZvciBpIFtbCiskcmFuZ2UgaiAwLi5pLTEKKyR2YXIgcHMgPSBbWyRmb3IgaiwgW1twJGpdXV1dCisKK0FDVElPTl9URU1QTEFURShSZXR1cm5OZXcsCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKKyAgICAgICAgICAgICAgICBBTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkcHMpKSB7CisgIHJldHVybiBuZXcgVCgkcHMpOworfQorCitdXQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKy8vIEluY2x1ZGUgYW55IGN1c3RvbSBjYWxsYmFjayBhY3Rpb25zIGFkZGVkIGJ5IHRoZSBsb2NhbCBpbnN0YWxsYXRpb24uCisvLyBXZSBtdXN0IGluY2x1ZGUgdGhpcyBoZWFkZXIgYXQgdGhlIGVuZCB0byBtYWtlIHN1cmUgaXQgY2FuIHVzZSB0aGUKKy8vIGRlY2xhcmF0aW9ucyBmcm9tIHRoaXMgZmlsZS4KKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaCIKKworI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE1Y2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaApAQCAtMCwwICsxLDEwOTUgQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBnbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9uIG1vY2tlcnMgb2YgdmFyaW91cyBhcml0aWVzLgorCisjaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXworCisjaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIgorI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCisKKyNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworIyBpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2VuZGlmCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgorY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlOworCisvLyBOb3RlOiBjbGFzcyBGdW5jdGlvbk1vY2tlciByZWFsbHkgYmVsb25ncyB0byB0aGUgOjp0ZXN0aW5nCisvLyBuYW1lc3BhY2UuICBIb3dldmVyIGlmIHdlIGRlZmluZSBpdCBpbiA6OnRlc3RpbmcsIE1TVkMgd2lsbAorLy8gY29tcGxhaW4gd2hlbiBjbGFzc2VzIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgZGVjbGFyZSBpdCBhcyBhCisvLyBmcmllbmQgY2xhc3MgdGVtcGxhdGUuICBUbyB3b3JrYXJvdW5kIHRoaXMgY29tcGlsZXIgYnVnLCB3ZSBkZWZpbmUKKy8vIEZ1bmN0aW9uTW9ja2VyIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgYW5kIGltcG9ydCBpdCBpbnRvIDo6dGVzdGluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgorY2xhc3MgRnVuY3Rpb25Nb2NrZXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSPgorY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UigpPiA6IHB1YmxpYworICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UigpPiB7CisgcHVibGljOgorICB0eXBlZGVmIFIgRigpOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOworCisgIE1vY2tTcGVjPEY+JiBXaXRoKCkgeworICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKKyAgfQorCisgIFIgSW52b2tlKCkgeworICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAorICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcworICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQorICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgorICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMT4KK2NsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEpPiA6IHB1YmxpYworICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSk+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUiBGKEExKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEpIHsKKyAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEpKTsKKyAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7CisgIH0KKworICBSIEludm9rZShBMSBhMSkgeworICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAorICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcworICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQorICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgorICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KK2NsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyKT4gOiBwdWJsaWMKKyAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyKT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSIEYoQTEsIEEyKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMikgeworICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIpKTsKKyAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7CisgIH0KKworICBSIEludm9rZShBMSBhMSwgQTIgYTIpIHsKKyAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKKyAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKKyAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKKyAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KKyAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KK2NsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMyk+IDogcHVibGljCisgICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMpPiB7CisgcHVibGljOgorICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKKyAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMykgeworICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIsIG0zKSk7CisgICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOworICB9CisKKyAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMykgeworICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAorICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcworICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQorICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgorICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMykpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+CitjbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMsIEE0KT4gOiBwdWJsaWMKKyAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQpPiB7CisgcHVibGljOgorICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCk7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisKKyAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCisgICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCkgeworICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCkpOworICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKKyAgfQorCisgIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0KSB7CisgICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCisgICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCisgICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCisgICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCisgICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgdHlwZW5hbWUgQTU+CitjbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMsIEE0LCBBNSk+IDogcHVibGljCisgICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSk+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0LCBBNSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisKKyAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCisgICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01KSB7CisgICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSkpOworICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKKyAgfQorCisgIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSkgeworICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAorICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcworICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQorICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgorICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQsIGE1KSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+CitjbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiA6IHB1YmxpYworICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisKKyAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCisgICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LAorICAgICAgY29uc3QgTWF0Y2hlcjxBNj4mIG02KSB7CisgICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwKKyAgICAgICAgbTYpKTsKKyAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7CisgIH0KKworICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2KSB7CisgICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCisgICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCisgICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCisgICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCisgICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgorY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk+IDogcHVibGljCisgICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOworCisgIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAorICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQsIGNvbnN0IE1hdGNoZXI8QTU+JiBtNSwKKyAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03KSB7CisgICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwKKyAgICAgICAgbTYsIG03KSk7CisgICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOworICB9CisKKyAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcpIHsKKyAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKKyAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKKyAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKKyAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KKyAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KK2NsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4gOiBwdWJsaWMKKyAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKKyAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUsCisgICAgICBjb25zdCBNYXRjaGVyPEE2PiYgbTYsIGNvbnN0IE1hdGNoZXI8QTc+JiBtNywgY29uc3QgTWF0Y2hlcjxBOD4mIG04KSB7CisgICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwKKyAgICAgICAgbTYsIG03LCBtOCkpOworICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKKyAgfQorCisgIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3LCBBOCBhOCkgeworICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAorICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcworICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQorICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgorICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+CitjbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpPiA6IHB1YmxpYworICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisKKyAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCisgICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LAorICAgICAgY29uc3QgTWF0Y2hlcjxBNj4mIG02LCBjb25zdCBNYXRjaGVyPEE3PiYgbTcsIGNvbnN0IE1hdGNoZXI8QTg+JiBtOCwKKyAgICAgIGNvbnN0IE1hdGNoZXI8QTk+JiBtOSkgeworICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCwgbTUsCisgICAgICAgIG02LCBtNywgbTgsIG05KSk7CisgICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOworICB9CisKKyAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcsIEE4IGE4LCBBOSBhOSkgeworICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAorICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcworICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQorICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgorICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5LAorICAgIHR5cGVuYW1lIEExMD4KK2NsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKT4gOiBwdWJsaWMKKyAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKworICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKKyAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUsCisgICAgICBjb25zdCBNYXRjaGVyPEE2PiYgbTYsIGNvbnN0IE1hdGNoZXI8QTc+JiBtNywgY29uc3QgTWF0Y2hlcjxBOD4mIG04LAorICAgICAgY29uc3QgTWF0Y2hlcjxBOT4mIG05LCBjb25zdCBNYXRjaGVyPEExMD4mIG0xMCkgeworICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCwgbTUsCisgICAgICAgIG02LCBtNywgbTgsIG05LCBtMTApKTsKKyAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7CisgIH0KKworICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNywgQTggYTgsIEE5IGE5LAorICAgICAgQTEwIGExMCkgeworICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAorICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcworICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQorICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgorICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwKKyAgICAgICAgYTEwKSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBUaGUgc3R5bGUgZ3VpZGUgcHJvaGliaXRzICJ1c2luZyIgc3RhdGVtZW50cyBpbiBhIG5hbWVzcGFjZSBzY29wZQorLy8gaW5zaWRlIGEgaGVhZGVyIGZpbGUuICBIb3dldmVyLCB0aGUgRnVuY3Rpb25Nb2NrZXIgY2xhc3MgdGVtcGxhdGUKKy8vIGlzIG1lYW50IHRvIGJlIGRlZmluZWQgaW4gdGhlIDo6dGVzdGluZyBuYW1lc3BhY2UuICBUaGUgZm9sbG93aW5nCisvLyBsaW5lIGlzIGp1c3QgYSB0cmljayBmb3Igd29ya2luZyBhcm91bmQgYSBidWcgaW4gTVNWQyA4LjAsIHdoaWNoCisvLyBjYW5ub3QgaGFuZGxlIGl0IGlmIHdlIGRlZmluZSBGdW5jdGlvbk1vY2tlciBpbiA6OnRlc3RpbmcuCit1c2luZyBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXI7CisKKy8vIEdNT0NLX1JFU1VMVF8odG4sIEYpIGV4cGFuZHMgdG8gdGhlIHJlc3VsdCB0eXBlIG9mIGZ1bmN0aW9uIHR5cGUgRi4KKy8vIFdlIGRlZmluZSB0aGlzIGFzIGEgdmFyaWFkaWMgbWFjcm8gaW4gY2FzZSBGIGNvbnRhaW5zIHVucHJvdGVjdGVkCisvLyBjb21tYXMgKHRoZSBzYW1lIHJlYXNvbiB0aGF0IHdlIHVzZSB2YXJpYWRpYyBtYWNyb3MgaW4gb3RoZXIgcGxhY2VzCisvLyBpbiB0aGlzIGZpbGUpLgorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX1JFU1VMVF8odG4sIC4uLikgXAorICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6UmVzdWx0CisKKy8vIFRoZSB0eXBlIG9mIGFyZ3VtZW50IE4gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uIHR5cGUuCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKKyNkZWZpbmUgR01PQ0tfQVJHXyh0biwgTiwgLi4uKSBcCisgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudCMjTgorCisvLyBUaGUgbWF0Y2hlciB0eXBlIGZvciBhcmd1bWVudCBOIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX01BVENIRVJfKHRuLCBOLCAuLi4pIFwKKyAgICBjb25zdCA6OnRlc3Rpbmc6Ok1hdGNoZXI8R01PQ0tfQVJHXyh0biwgTiwgX19WQV9BUkdTX18pPiYKKworLy8gVGhlIHZhcmlhYmxlIGZvciBtb2NraW5nIHRoZSBnaXZlbiBtZXRob2QuCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKKyNkZWZpbmUgR01PQ0tfTU9DS0VSXyhhcml0eSwgY29uc3RuZXNzLCBNZXRob2QpIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGdtb2NrIyNjb25zdG5lc3MjI2FyaXR5IyNfIyNNZXRob2QjI18sIF9fTElORV9fKQorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKKyNkZWZpbmUgR01PQ0tfTUVUSE9EMF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCisgIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKKyAgICAgICkgY29uc3RuZXNzIHsgXAorICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCisgICAgICAgICAgICA9PSAwKSwgXAorICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzBfYXJndW1lbnRzKTsgXAorICAgIEdNT0NLX01PQ0tFUl8oMCwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAorICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoKTsgXAorICB9IFwKKyAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKKyAgICAgIGdtb2NrXyMjTWV0aG9kKCkgY29uc3RuZXNzIHsgXAorICAgIEdNT0NLX01PQ0tFUl8oMCwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKKyAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aCgpOyBcCisgIH0gXAorICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMCwgY29uc3RuZXNzLCBcCisgICAgICBNZXRob2QpCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQorI2RlZmluZSBHTU9DS19NRVRIT0QxXyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKKyAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAorICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExKSBjb25zdG5lc3MgeyBcCisgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKKyAgICAgICAgICAgID09IDEpLCBcCisgICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfMV9hcmd1bWVudCk7IFwKKyAgICBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKKyAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygxLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExKTsgXAorICB9IFwKKyAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKKyAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEpIGNvbnN0bmVzcyB7IFwKKyAgICBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMSwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEpOyBcCisgIH0gXAorICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMSwgY29uc3RuZXNzLCBcCisgICAgICBNZXRob2QpCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQorI2RlZmluZSBHTU9DS19NRVRIT0QyXyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKKyAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAorICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIpIGNvbnN0bmVzcyB7IFwKKyAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAorICAgICAgICAgICAgPT0gMiksIFwKKyAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8yX2FyZ3VtZW50cyk7IFwKKyAgICBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKKyAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygyLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMik7IFwKKyAgfSBcCisgIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCisgICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyKSBjb25zdG5lc3MgeyBcCisgICAgR01PQ0tfTU9DS0VSXygyLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAorICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMik7IFwKKyAgfSBcCisgIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygyLCBjb25zdG5lc3MsIFwKKyAgICAgIE1ldGhvZCkKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX01FVEhPRDNfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAorICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzKSBjb25zdG5lc3MgeyBcCisgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKKyAgICAgICAgICAgID09IDMpLCBcCisgICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfM19hcmd1bWVudHMpOyBcCisgICAgR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMywgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMpOyBcCisgIH0gXAorICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAorICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMykgY29uc3RuZXNzIHsgXAorICAgIEdNT0NLX01PQ0tFUl8oMywgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKKyAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMpOyBcCisgIH0gXAorICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMywgY29uc3RuZXNzLCBcCisgICAgICBNZXRob2QpCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQorI2RlZmluZSBHTU9DS19NRVRIT0Q0Xyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKKyAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAorICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAorICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0KSBjb25zdG5lc3MgeyBcCisgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKKyAgICAgICAgICAgID09IDQpLCBcCisgICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfNF9hcmd1bWVudHMpOyBcCisgICAgR01PQ0tfTU9DS0VSXyg0LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNCwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0KTsgXAorICB9IFwKKyAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKKyAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQpIGNvbnN0bmVzcyB7IFwKKyAgICBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNCwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCisgICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCk7IFwKKyAgfSBcCisgIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXyg0LCBjb25zdG5lc3MsIFwKKyAgICAgIE1ldGhvZCkKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX01FVEhPRDVfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAorICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSkgY29uc3RuZXNzIHsgXAorICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCisgICAgICAgICAgICA9PSA1KSwgXAorICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzVfYXJndW1lbnRzKTsgXAorICAgIEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAorICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDUsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCisgICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUpOyBcCisgIH0gXAorICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAorICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSkgY29uc3RuZXNzIHsgXAorICAgIEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKKyAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg1LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSk7IFwKKyAgfSBcCisgIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXyg1LCBjb25zdG5lc3MsIFwKKyAgICAgIE1ldGhvZCkKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX01FVEhPRDZfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAorICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2KSBjb25zdG5lc3MgeyBcCisgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKKyAgICAgICAgICAgID09IDYpLCBcCisgICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfNl9hcmd1bWVudHMpOyBcCisgICAgR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNiwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYpOyBcCisgIH0gXAorICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAorICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNikgY29uc3RuZXNzIHsgXAorICAgIEdNT0NLX01PQ0tFUl8oNiwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKKyAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYpOyBcCisgIH0gXAorICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oNiwgY29uc3RuZXNzLCBcCisgICAgICBNZXRob2QpCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQorI2RlZmluZSBHTU9DS19NRVRIT0Q3Xyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKKyAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAorICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAorICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3KSBjb25zdG5lc3MgeyBcCisgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKKyAgICAgICAgICAgID09IDcpLCBcCisgICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfN19hcmd1bWVudHMpOyBcCisgICAgR01PQ0tfTU9DS0VSXyg3LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNywgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3KTsgXAorICB9IFwKKyAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKKyAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKKyAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcpIGNvbnN0bmVzcyB7IFwKKyAgICBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNywgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCisgICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNyk7IFwKKyAgfSBcCisgIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXyg3LCBjb25zdG5lc3MsIFwKKyAgICAgIE1ldGhvZCkKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX01FVEhPRDhfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAorICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCkgY29uc3RuZXNzIHsgXAorICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCisgICAgICAgICAgICA9PSA4KSwgXAorICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzhfYXJndW1lbnRzKTsgXAorICAgIEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAorICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDgsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCisgICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgpOyBcCisgIH0gXAorICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAorICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCkgY29uc3RuZXNzIHsgXAorICAgIEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKKyAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg4LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3LCBnbW9ja19hOCk7IFwKKyAgfSBcCisgIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXyg4LCBjb25zdG5lc3MsIFwKKyAgICAgIE1ldGhvZCkKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX01FVEhPRDlfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAorICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgOSwgX19WQV9BUkdTX18pIGdtb2NrX2E5KSBjb25zdG5lc3MgeyBcCisgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKKyAgICAgICAgICAgID09IDkpLCBcCisgICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfOV9hcmd1bWVudHMpOyBcCisgICAgR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oOSwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKKyAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3LCBnbW9ja19hOCwgXAorICAgICAgICBnbW9ja19hOSk7IFwKKyAgfSBcCisgIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCisgICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4LCBcCisgICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOSwgX19WQV9BUkdTX18pIGdtb2NrX2E5KSBjb25zdG5lc3MgeyBcCisgICAgR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAorICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDksIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAorICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4LCBcCisgICAgICAgIGdtb2NrX2E5KTsgXAorICB9IFwKKyAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDksIGNvbnN0bmVzcywgXAorICAgICAgTWV0aG9kKQorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKKyNkZWZpbmUgR01PQ0tfTUVUSE9EMTBfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAorICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCisgICAgICBHTU9DS19BUkdfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcsIFwKKyAgICAgIEdNT0NLX0FSR18odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCwgXAorICAgICAgR01PQ0tfQVJHXyh0biwgOSwgX19WQV9BUkdTX18pIGdtb2NrX2E5LCBcCisgICAgICBHTU9DS19BUkdfKHRuLCAxMCwgX19WQV9BUkdTX18pIGdtb2NrX2ExMCkgY29uc3RuZXNzIHsgXAorICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCisgICAgICAgICAgICA9PSAxMCksIFwKKyAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8xMF9hcmd1bWVudHMpOyBcCisgICAgR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAorICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAorICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4LCBnbW9ja19hOSwgXAorICAgICAgICBnbW9ja19hMTApOyBcCisgIH0gXAorICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAorICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDksIF9fVkFfQVJHU19fKSBnbW9ja19hOSwgXAorICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDEwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX19WQV9BUkdTX18pIGdtb2NrX2ExMCkgY29uc3RuZXNzIHsgXAorICAgIEdNT0NLX01PQ0tFUl8oMTAsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMTAsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAorICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4LCBnbW9ja19hOSwgXAorICAgICAgICBnbW9ja19hMTApOyBcCisgIH0gXAorICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMTAsIGNvbnN0bmVzcywgXAorICAgICAgTWV0aG9kKQorCisjZGVmaW5lIE1PQ0tfTUVUSE9EMChtLCAuLi4pIEdNT0NLX01FVEhPRDBfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDEobSwgLi4uKSBHTU9DS19NRVRIT0QxXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0QyKG0sIC4uLikgR01PQ0tfTUVUSE9EMl8oLCAsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EMyhtLCAuLi4pIEdNT0NLX01FVEhPRDNfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDQobSwgLi4uKSBHTU9DS19NRVRIT0Q0XygsICwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0Q1KG0sIC4uLikgR01PQ0tfTUVUSE9ENV8oLCAsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9ENihtLCAuLi4pIEdNT0NLX01FVEhPRDZfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDcobSwgLi4uKSBHTU9DS19NRVRIT0Q3XygsICwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0Q4KG0sIC4uLikgR01PQ0tfTUVUSE9EOF8oLCAsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EOShtLCAuLi4pIEdNT0NLX01FVEhPRDlfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDEwKG0sIC4uLikgR01PQ0tfTUVUSE9EMTBfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMChtLCAuLi4pIEdNT0NLX01FVEhPRDBfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMShtLCAuLi4pIEdNT0NLX01FVEhPRDFfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMihtLCAuLi4pIEdNT0NLX01FVEhPRDJfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMyhtLCAuLi4pIEdNT0NLX01FVEhPRDNfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENChtLCAuLi4pIEdNT0NLX01FVEhPRDRfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENShtLCAuLi4pIEdNT0NLX01FVEhPRDVfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENihtLCAuLi4pIEdNT0NLX01FVEhPRDZfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENyhtLCAuLi4pIEdNT0NLX01FVEhPRDdfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOChtLCAuLi4pIEdNT0NLX01FVEhPRDhfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOShtLCAuLi4pIEdNT0NLX01FVEhPRDlfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMTAobSwgLi4uKSBHTU9DS19NRVRIT0QxMF8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBNT0NLX01FVEhPRDBfVChtLCAuLi4pIEdNT0NLX01FVEhPRDBfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EMV9UKG0sIC4uLikgR01PQ0tfTUVUSE9EMV8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0QyX1QobSwgLi4uKSBHTU9DS19NRVRIT0QyXyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDNfVChtLCAuLi4pIEdNT0NLX01FVEhPRDNfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9ENF9UKG0sIC4uLikgR01PQ0tfTUVUSE9ENF8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0Q1X1QobSwgLi4uKSBHTU9DS19NRVRIT0Q1Xyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDZfVChtLCAuLi4pIEdNT0NLX01FVEhPRDZfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EN19UKG0sIC4uLikgR01PQ0tfTUVUSE9EN18odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0Q4X1QobSwgLi4uKSBHTU9DS19NRVRIT0Q4Xyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDlfVChtLCAuLi4pIEdNT0NLX01FVEhPRDlfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EMTBfVChtLCAuLi4pIEdNT0NLX01FVEhPRDEwXyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMF9UKG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDBfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxX1QobSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EMV8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDJfVChtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QyXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EM19UKG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDNfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q0X1QobSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9ENF8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDVfVChtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0Q1Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENl9UKG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDZfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q3X1QobSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EN18odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDhfVChtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0Q4Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOV9UKG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDlfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxMF9UKG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDEwXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTU9DS19NRVRIT0QwX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDBfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EMV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QxXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDJfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EMl8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0QzX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDNfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9ENF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0Q0XygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDVfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9ENV8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0Q2X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDZfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EN19XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0Q3XygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDhfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EOF8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0Q5X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDlfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EMTBfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EMTBfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QwX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDBfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDFfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QyX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDJfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QzX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDNfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q0X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDRfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q1X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDVfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q2X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDZfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q3X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDdfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q4X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDhfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q5X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDlfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxMF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QxMF8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIE1PQ0tfTUVUSE9EMF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDBfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0QxX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EMV8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDJfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QyXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EM19UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDNfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0Q0X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9ENF8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDVfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0Q1Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9ENl9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDZfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0Q3X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EN18odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX01FVEhPRDhfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0Q4Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfTUVUSE9EOV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDlfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19NRVRIT0QxMF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDEwXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QwX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EMF8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDFfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDJfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QyXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QzX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EM18odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDRfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDVfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0Q1Xyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q2X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9ENl8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EN19UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAorICAgIEdNT0NLX01FVEhPRDdfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQorI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDhfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0Q4Xyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q5X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EOV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCisjZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMTBfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QxMF8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCisKKy8vIEEgTW9ja0Z1bmN0aW9uPEY+IGNsYXNzIGhhcyBvbmUgbW9jayBtZXRob2Qgd2hvc2UgdHlwZSBpcyBGLiAgSXQgaXMKKy8vIHVzZWZ1bCB3aGVuIHlvdSBqdXN0IHdhbnQgeW91ciB0ZXN0IGNvZGUgdG8gZW1pdCBzb21lIG1lc3NhZ2VzIGFuZAorLy8gaGF2ZSBHb29nbGUgTW9jayB2ZXJpZnkgdGhlIHJpZ2h0IG1lc3NhZ2VzIGFyZSBzZW50IChhbmQgcGVyaGFwcyBhdAorLy8gdGhlIHJpZ2h0IHRpbWVzKS4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGV4ZXJjaXNpbmcgY29kZToKKy8vCisvLyAgIEZvbygxKTsKKy8vICAgRm9vKDIpOworLy8gICBGb28oMyk7CisvLworLy8gYW5kIHdhbnQgdG8gdmVyaWZ5IHRoYXQgRm9vKDEpIGFuZCBGb28oMykgYm90aCBpbnZva2UKKy8vIG1vY2suQmFyKCJhIiksIGJ1dCBGb28oMikgZG9lc24ndCBpbnZva2UgYW55dGhpbmcsIHlvdSBjYW4gd3JpdGU6CisvLworLy8gVEVTVChGb29UZXN0LCBJbnZva2VzQmFyQ29ycmVjdGx5KSB7CisvLyAgIE15TW9jayBtb2NrOworLy8gICBNb2NrRnVuY3Rpb248dm9pZChzdHJpbmcgY2hlY2tfcG9pbnRfbmFtZSk+IGNoZWNrOworLy8gICB7CisvLyAgICAgSW5TZXF1ZW5jZSBzOworLy8KKy8vICAgICBFWFBFQ1RfQ0FMTChtb2NrLCBCYXIoImEiKSk7CisvLyAgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjEiKSk7CisvLyAgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjIiKSk7CisvLyAgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOworLy8gICB9CisvLyAgIEZvbygxKTsKKy8vICAgY2hlY2suQ2FsbCgiMSIpOworLy8gICBGb28oMik7CisvLyAgIGNoZWNrLkNhbGwoIjIiKTsKKy8vICAgRm9vKDMpOworLy8gfQorLy8KKy8vIFRoZSBleHBlY3RhdGlvbiBzcGVjIHNheXMgdGhhdCB0aGUgZmlyc3QgQmFyKCJhIikgbXVzdCBoYXBwZW4KKy8vIGJlZm9yZSBjaGVjayBwb2ludCAiMSIsIHRoZSBzZWNvbmQgQmFyKCJhIikgbXVzdCBoYXBwZW4gYWZ0ZXIgY2hlY2sKKy8vIHBvaW50ICIyIiwgYW5kIG5vdGhpbmcgc2hvdWxkIGhhcHBlbiBiZXR3ZWVuIHRoZSB0d28gY2hlY2sKKy8vIHBvaW50cy4gVGhlIGV4cGxpY2l0IGNoZWNrIHBvaW50cyBtYWtlIGl0IGVhc3kgdG8gdGVsbCB3aGljaAorLy8gQmFyKCJhIikgaXMgY2FsbGVkIGJ5IHdoaWNoIGNhbGwgdG8gRm9vKCkuCisvLworLy8gTW9ja0Z1bmN0aW9uPEY+IGNhbiBhbHNvIGJlIHVzZWQgdG8gZXhlcmNpc2UgY29kZSB0aGF0IGFjY2VwdHMKKy8vIHN0ZDo6ZnVuY3Rpb248Rj4gY2FsbGJhY2tzLiBUbyBkbyBzbywgdXNlIEFzU3RkRnVuY3Rpb24oKSBtZXRob2QKKy8vIHRvIGNyZWF0ZSBzdGQ6OmZ1bmN0aW9uIHByb3h5IGZvcndhcmRpbmcgdG8gb3JpZ2luYWwgb2JqZWN0J3MgQ2FsbC4KKy8vIEV4YW1wbGU6CisvLworLy8gVEVTVChGb29UZXN0LCBSdW5zQ2FsbGJhY2tXaXRoQmFyQXJndW1lbnQpIHsKKy8vICAgTW9ja0Z1bmN0aW9uPGludChzdHJpbmcpPiBjYWxsYmFjazsKKy8vICAgRVhQRUNUX0NBTEwoY2FsbGJhY2ssIENhbGwoImJhciIpKS5XaWxsT25jZShSZXR1cm4oMSkpOworLy8gICBGb28oY2FsbGJhY2suQXNTdGRGdW5jdGlvbigpKTsKKy8vIH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgorY2xhc3MgTW9ja0Z1bmN0aW9uOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KK2NsYXNzIE1vY2tGdW5jdGlvbjxSKCk+IHsKKyBwdWJsaWM6CisgIE1vY2tGdW5jdGlvbigpIHt9CisKKyAgTU9DS19NRVRIT0QwX1QoQ2FsbCwgUigpKTsKKworI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisgIHN0ZDo6ZnVuY3Rpb248UigpPiBBc1N0ZEZ1bmN0aW9uKCkgeworICAgIHJldHVybiBbdGhpc10oKSAtPiBSIHsKKyAgICAgIHJldHVybiB0aGlzLT5DYWxsKCk7CisgICAgfTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwPgorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTApPiB7CisgcHVibGljOgorICBNb2NrRnVuY3Rpb24oKSB7fQorCisgIE1PQ0tfTUVUSE9EMV9UKENhbGwsIFIoQTApKTsKKworI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisgIHN0ZDo6ZnVuY3Rpb248UihBMCk+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXShBMCBhMCkgLT4gUiB7CisgICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCk7CisgICAgfTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMT4KK2NsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSk+IHsKKyBwdWJsaWM6CisgIE1vY2tGdW5jdGlvbigpIHt9CisKKyAgTU9DS19NRVRIT0QyX1QoQ2FsbCwgUihBMCwgQTEpKTsKKworI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisgIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEpPiBBc1N0ZEZ1bmN0aW9uKCkgeworICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExKSAtPiBSIHsKKyAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSk7CisgICAgfTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+CitjbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyKT4geworIHB1YmxpYzoKKyAgTW9ja0Z1bmN0aW9uKCkge30KKworICBNT0NLX01FVEhPRDNfVChDYWxsLCBSKEEwLCBBMSwgQTIpKTsKKworI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisgIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyKT4gQXNTdGRGdW5jdGlvbigpIHsKKyAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIpIC0+IFIgeworICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMik7CisgICAgfTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMpPiB7CisgcHVibGljOgorICBNb2NrRnVuY3Rpb24oKSB7fQorCisgIE1PQ0tfTUVUSE9ENF9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMpKTsKKworI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisgIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMyk+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEsIEEyIGEyLCBBMyBhMykgLT4gUiB7CisgICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMyk7CisgICAgfTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAorICAgIHR5cGVuYW1lIEE0PgorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0KT4geworIHB1YmxpYzoKKyAgTW9ja0Z1bmN0aW9uKCkge30KKworICBNT0NLX01FVEhPRDVfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCkpOworCisjaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KKyAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCk+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQpIC0+IFIgeworICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMsIGE0KTsKKyAgICB9OworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCisgICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSk+IHsKKyBwdWJsaWM6CisgIE1vY2tGdW5jdGlvbigpIHt9CisKKyAgTU9DS19NRVRIT0Q2X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQsIEE1KSk7CisKKyNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSk+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1KSAtPiBSIHsKKyAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOworICAgIH07CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKKyAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiB7CisgcHVibGljOgorICBNb2NrRnVuY3Rpb24oKSB7fQorCisgIE1PQ0tfTUVUSE9EN19UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpKTsKKworI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisgIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNikgLT4gUiB7CisgICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7CisgICAgfTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAorICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4geworIHB1YmxpYzoKKyAgTW9ja0Z1bmN0aW9uKCkge30KKworICBNT0NLX01FVEhPRDhfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNykpOworCisjaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KKyAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcpIC0+IFIgeworICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTsKKyAgICB9OworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCisgICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4PgorY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+IHsKKyBwdWJsaWM6CisgIE1vY2tGdW5jdGlvbigpIHt9CisKKyAgTU9DS19NRVRIT0Q5X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KSk7CisKKyNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcsCisgICAgICAgIEE4IGE4KSAtPiBSIHsKKyAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOworICAgIH07CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKKyAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsCisgICAgdHlwZW5hbWUgQTk+CitjbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IHsKKyBwdWJsaWM6CisgIE1vY2tGdW5jdGlvbigpIHt9CisKKyAgTU9DS19NRVRIT0QxMF9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpKTsKKworI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisgIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcsCisgICAgICAgIEE4IGE4LCBBOSBhOSkgLT4gUiB7CisgICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7CisgICAgfTsKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExNTAyZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcApAQCAtMCwwICsxLDI5MSBAQAorJCQgLSotIG1vZGU6IGMrKzsgLSotCiskJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCiskJCBnbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLgorJCQKKyR2YXIgbiA9IDEwICAkJCBUaGUgbWF4aW11bSBhcml0eSB3ZSBzdXBwb3J0LgorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9uIG1vY2tlcnMgb2YgdmFyaW91cyBhcml0aWVzLgorCisjaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXworCisjaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIgorI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCisKKyNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXworIyBpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2VuZGlmCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgorY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlOworCisvLyBOb3RlOiBjbGFzcyBGdW5jdGlvbk1vY2tlciByZWFsbHkgYmVsb25ncyB0byB0aGUgOjp0ZXN0aW5nCisvLyBuYW1lc3BhY2UuICBIb3dldmVyIGlmIHdlIGRlZmluZSBpdCBpbiA6OnRlc3RpbmcsIE1TVkMgd2lsbAorLy8gY29tcGxhaW4gd2hlbiBjbGFzc2VzIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgZGVjbGFyZSBpdCBhcyBhCisvLyBmcmllbmQgY2xhc3MgdGVtcGxhdGUuICBUbyB3b3JrYXJvdW5kIHRoaXMgY29tcGlsZXIgYnVnLCB3ZSBkZWZpbmUKKy8vIEZ1bmN0aW9uTW9ja2VyIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgYW5kIGltcG9ydCBpdCBpbnRvIDo6dGVzdGluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgorY2xhc3MgRnVuY3Rpb25Nb2NrZXI7CisKKworJHJhbmdlIGkgMC4ubgorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCiskdmFyIHR5cGVuYW1lX0FzID0gW1skZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dXV0KKyR2YXIgQXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dCiskdmFyIGFzID0gW1skZm9yIGosIFtbYSRqXV1dXQorJHZhciBBYXMgPSBbWyRmb3IgaiwgW1tBJGogYSRqXV1dXQorJHZhciBtcyA9IFtbJGZvciBqLCBbW20kal1dXV0KKyR2YXIgbWF0Y2hlcnMgPSBbWyRmb3IgaiwgW1tjb25zdCBNYXRjaGVyPEEkaj4mIG0kal1dXV0KK3RlbXBsYXRlIDx0eXBlbmFtZSBSJHR5cGVuYW1lX0FzPgorY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UigkQXMpPiA6IHB1YmxpYworICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UigkQXMpPiB7CisgcHVibGljOgorICB0eXBlZGVmIFIgRigkQXMpOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOworCisgIE1vY2tTcGVjPEY+JiBXaXRoKCRtYXRjaGVycykgeworCiskaWYgaSA+PSAxIFtbCisgICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKCRtcykpOworCitdXQorICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKKyAgfQorCisgIFIgSW52b2tlKCRBYXMpIHsKKyAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKKyAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKKyAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKKyAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KKyAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKCRhcykpOworICB9Cit9OworCisKK11dCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gVGhlIHN0eWxlIGd1aWRlIHByb2hpYml0cyAidXNpbmciIHN0YXRlbWVudHMgaW4gYSBuYW1lc3BhY2Ugc2NvcGUKKy8vIGluc2lkZSBhIGhlYWRlciBmaWxlLiAgSG93ZXZlciwgdGhlIEZ1bmN0aW9uTW9ja2VyIGNsYXNzIHRlbXBsYXRlCisvLyBpcyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZworLy8gbGluZSBpcyBqdXN0IGEgdHJpY2sgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLCB3aGljaAorLy8gY2Fubm90IGhhbmRsZSBpdCBpZiB3ZSBkZWZpbmUgRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nLgordXNpbmcgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyOworCisvLyBHTU9DS19SRVNVTFRfKHRuLCBGKSBleHBhbmRzIHRvIHRoZSByZXN1bHQgdHlwZSBvZiBmdW5jdGlvbiB0eXBlIEYuCisvLyBXZSBkZWZpbmUgdGhpcyBhcyBhIHZhcmlhZGljIG1hY3JvIGluIGNhc2UgRiBjb250YWlucyB1bnByb3RlY3RlZAorLy8gY29tbWFzICh0aGUgc2FtZSByZWFzb24gdGhhdCB3ZSB1c2UgdmFyaWFkaWMgbWFjcm9zIGluIG90aGVyIHBsYWNlcworLy8gaW4gdGhpcyBmaWxlKS4KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQorI2RlZmluZSBHTU9DS19SRVNVTFRfKHRuLCAuLi4pIFwKKyAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OlJlc3VsdAorCisvLyBUaGUgdHlwZSBvZiBhcmd1bWVudCBOIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX0FSR18odG4sIE4sIC4uLikgXAorICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnQjI04KKworLy8gVGhlIG1hdGNoZXIgdHlwZSBmb3IgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQorI2RlZmluZSBHTU9DS19NQVRDSEVSXyh0biwgTiwgLi4uKSBcCisgICAgY29uc3QgOjp0ZXN0aW5nOjpNYXRjaGVyPEdNT0NLX0FSR18odG4sIE4sIF9fVkFfQVJHU19fKT4mCisKKy8vIFRoZSB2YXJpYWJsZSBmb3IgbW9ja2luZyB0aGUgZ2l2ZW4gbWV0aG9kLgorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX01PQ0tFUl8oYXJpdHksIGNvbnN0bmVzcywgTWV0aG9kKSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhnbW9jayMjY29uc3RuZXNzIyNhcml0eSMjXyMjTWV0aG9kIyNfLCBfX0xJTkVfXykKKworCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKyR2YXIgYXJnX2FzID0gW1skZm9yIGosIFwKKyAgICAgIFtbR01PQ0tfQVJHXyh0biwgJGosIF9fVkFfQVJHU19fKSBnbW9ja19hJGpdXV1dCiskdmFyIGFzID0gW1skZm9yIGosIFtbZ21vY2tfYSRqXV1dXQorJHZhciBtYXRjaGVyX2FzID0gW1skZm9yIGosIFwKKyAgICAgICAgICAgICAgICAgICAgIFtbR01PQ0tfTUFUQ0hFUl8odG4sICRqLCBfX1ZBX0FSR1NfXykgZ21vY2tfYSRqXV1dXQorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCisjZGVmaW5lIEdNT0NLX01FVEhPRCRpW1tdXV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCisgIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKKyAgICAgICRhcmdfYXMpIGNvbnN0bmVzcyB7IFwKKyAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgPT0gJGkpLCBcCisgICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfJGlbW11dX2FyZ3VtZW50W1skaWYgaSAhPSAxIFtbc11dXV0pOyBcCisgICAgR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAorICAgIHJldHVybiBHTU9DS19NT0NLRVJfKCRpLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKCRhcyk7IFwKKyAgfSBcCisgIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCisgICAgICBnbW9ja18jI01ldGhvZCgkbWF0Y2hlcl9hcykgY29uc3RuZXNzIHsgXAorICAgIEdNT0NLX01PQ0tFUl8oJGksIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCisgICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oJGksIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKCRhcyk7IFwKKyAgfSBcCisgIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpCisKKworXV0KKyRmb3IgaSBbWworI2RlZmluZSBNT0NLX01FVEhPRCRpKG0sIC4uLikgR01PQ0tfTUVUSE9EJGlbW11dXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKKworXV0KKworCiskZm9yIGkgW1sKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaShtLCAuLi4pIEdNT0NLX01FVEhPRCRpW1tdXV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKKworXV0KKworCiskZm9yIGkgW1sKKyNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fVChtLCAuLi4pIEdNT0NLX01FVEhPRCRpW1tdXV8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKKworXV0KKworCiskZm9yIGkgW1sKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaVtbXV1fVChtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKKworXV0KKworCiskZm9yIGkgW1sKKyNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCisgICAgR01PQ0tfTUVUSE9EJGlbW11dXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQorCitdXQorCisKKyRmb3IgaSBbWworI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRCRpW1tdXV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QkaVtbXV1fKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKworXV0KKworCiskZm9yIGkgW1sKKyNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKKworXV0KKworCiskZm9yIGkgW1sKKyNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaVtbXV1fVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKKyAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQorCitdXQorCisvLyBBIE1vY2tGdW5jdGlvbjxGPiBjbGFzcyBoYXMgb25lIG1vY2sgbWV0aG9kIHdob3NlIHR5cGUgaXMgRi4gIEl0IGlzCisvLyB1c2VmdWwgd2hlbiB5b3UganVzdCB3YW50IHlvdXIgdGVzdCBjb2RlIHRvIGVtaXQgc29tZSBtZXNzYWdlcyBhbmQKKy8vIGhhdmUgR29vZ2xlIE1vY2sgdmVyaWZ5IHRoZSByaWdodCBtZXNzYWdlcyBhcmUgc2VudCAoYW5kIHBlcmhhcHMgYXQKKy8vIHRoZSByaWdodCB0aW1lcykuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBleGVyY2lzaW5nIGNvZGU6CisvLworLy8gICBGb28oMSk7CisvLyAgIEZvbygyKTsKKy8vICAgRm9vKDMpOworLy8KKy8vIGFuZCB3YW50IHRvIHZlcmlmeSB0aGF0IEZvbygxKSBhbmQgRm9vKDMpIGJvdGggaW52b2tlCisvLyBtb2NrLkJhcigiYSIpLCBidXQgRm9vKDIpIGRvZXNuJ3QgaW52b2tlIGFueXRoaW5nLCB5b3UgY2FuIHdyaXRlOgorLy8KKy8vIFRFU1QoRm9vVGVzdCwgSW52b2tlc0JhckNvcnJlY3RseSkgeworLy8gICBNeU1vY2sgbW9jazsKKy8vICAgTW9ja0Z1bmN0aW9uPHZvaWQoc3RyaW5nIGNoZWNrX3BvaW50X25hbWUpPiBjaGVjazsKKy8vICAgeworLy8gICAgIEluU2VxdWVuY2UgczsKKy8vCisvLyAgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOworLy8gICAgIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKCIxIikpOworLy8gICAgIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKCIyIikpOworLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsKKy8vICAgfQorLy8gICBGb28oMSk7CisvLyAgIGNoZWNrLkNhbGwoIjEiKTsKKy8vICAgRm9vKDIpOworLy8gICBjaGVjay5DYWxsKCIyIik7CisvLyAgIEZvbygzKTsKKy8vIH0KKy8vCisvLyBUaGUgZXhwZWN0YXRpb24gc3BlYyBzYXlzIHRoYXQgdGhlIGZpcnN0IEJhcigiYSIpIG11c3QgaGFwcGVuCisvLyBiZWZvcmUgY2hlY2sgcG9pbnQgIjEiLCB0aGUgc2Vjb25kIEJhcigiYSIpIG11c3QgaGFwcGVuIGFmdGVyIGNoZWNrCisvLyBwb2ludCAiMiIsIGFuZCBub3RoaW5nIHNob3VsZCBoYXBwZW4gYmV0d2VlbiB0aGUgdHdvIGNoZWNrCisvLyBwb2ludHMuIFRoZSBleHBsaWNpdCBjaGVjayBwb2ludHMgbWFrZSBpdCBlYXN5IHRvIHRlbGwgd2hpY2gKKy8vIEJhcigiYSIpIGlzIGNhbGxlZCBieSB3aGljaCBjYWxsIHRvIEZvbygpLgorLy8KKy8vIE1vY2tGdW5jdGlvbjxGPiBjYW4gYWxzbyBiZSB1c2VkIHRvIGV4ZXJjaXNlIGNvZGUgdGhhdCBhY2NlcHRzCisvLyBzdGQ6OmZ1bmN0aW9uPEY+IGNhbGxiYWNrcy4gVG8gZG8gc28sIHVzZSBBc1N0ZEZ1bmN0aW9uKCkgbWV0aG9kCisvLyB0byBjcmVhdGUgc3RkOjpmdW5jdGlvbiBwcm94eSBmb3J3YXJkaW5nIHRvIG9yaWdpbmFsIG9iamVjdCdzIENhbGwuCisvLyBFeGFtcGxlOgorLy8KKy8vIFRFU1QoRm9vVGVzdCwgUnVuc0NhbGxiYWNrV2l0aEJhckFyZ3VtZW50KSB7CisvLyAgIE1vY2tGdW5jdGlvbjxpbnQoc3RyaW5nKT4gY2FsbGJhY2s7CisvLyAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrLCBDYWxsKCJiYXIiKSkuV2lsbE9uY2UoUmV0dXJuKDEpKTsKKy8vICAgRm9vKGNhbGxiYWNrLkFzU3RkRnVuY3Rpb24oKSk7CisvLyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KK2NsYXNzIE1vY2tGdW5jdGlvbjsKKworCiskZm9yIGkgW1sKKyRyYW5nZSBqIDAuLmktMQorJHZhciBBcmdUeXBlcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KKyR2YXIgQXJnTmFtZXMgPSBbWyRmb3IgaiwgW1thJGpdXV1dCiskdmFyIEFyZ0RlY2xzID0gW1skZm9yIGosIFtbQSRqIGEkal1dXV0KK3RlbXBsYXRlIDx0eXBlbmFtZSBSJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXT4KK2NsYXNzIE1vY2tGdW5jdGlvbjxSKCRBcmdUeXBlcyk+IHsKKyBwdWJsaWM6CisgIE1vY2tGdW5jdGlvbigpIHt9CisKKyAgTU9DS19NRVRIT0QkaVtbXV1fVChDYWxsLCBSKCRBcmdUeXBlcykpOworCisjaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KKyAgc3RkOjpmdW5jdGlvbjxSKCRBcmdUeXBlcyk+IEFzU3RkRnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFt0aGlzXSgkQXJnRGVjbHMpIC0+IFIgeworICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoJEFyZ05hbWVzKTsKKyAgICB9OworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Cit9OworCisKK11dCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNTZmZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oCkBAIC0wLDAgKzEsMjE3OSBAQAorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKKy8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIHZhcmlhZGljIG1hdGNoZXJzLgorCisjaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCisjZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIHR5cGUgb2YgdGhlIGktdGggKDAtYmFzZWQpIGZpZWxkIG9mIFR1cGxlLgorI2RlZmluZSBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgaSkgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxpLCBUdXBsZT46OnR5cGUKKworLy8gVHVwbGVGaWVsZHM8VHVwbGUsIGswLCAuLi4sIGtuPiBpcyBmb3Igc2VsZWN0aW5nIGZpZWxkcyBmcm9tIGEKKy8vIHR1cGxlIG9mIHR5cGUgVHVwbGUuICBJdCBoYXMgdHdvIG1lbWJlcnM6CisvLworLy8gICB0eXBlOiBhIHR1cGxlIHR5cGUgd2hvc2UgaS10aCBmaWVsZCBpcyB0aGUga2ktdGggZmllbGQgb2YgVHVwbGUuCisvLyAgIEdldFNlbGVjdGVkRmllbGRzKHQpOiByZXR1cm5zIGZpZWxkcyBrMCwgLi4uLCBhbmQga24gb2YgdCBhcyBhIHR1cGxlLgorLy8KKy8vIEZvciBleGFtcGxlLCBpbiBjbGFzcyBUdXBsZUZpZWxkczx0dXBsZTxib29sLCBjaGFyLCBpbnQ+LCAyLCAwPiwgd2UgaGF2ZToKKy8vCisvLyAgIHR5cGUgaXMgdHVwbGU8aW50LCBib29sPiwgYW5kCisvLyAgIEdldFNlbGVjdGVkRmllbGRzKG1ha2VfdHVwbGUodHJ1ZSwgJ2EnLCA0MikpIGlzICg0MiwgdHJ1ZSkuCisKK3RlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswID0gLTEsIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwgaW50IGszID0gLTEsCisgICAgaW50IGs0ID0gLTEsIGludCBrNSA9IC0xLCBpbnQgazYgPSAtMSwgaW50IGs3ID0gLTEsIGludCBrOCA9IC0xLAorICAgIGludCBrOSA9IC0xPgorY2xhc3MgVHVwbGVGaWVsZHM7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiB0aGVyZSBhcmUgMTAgc2VsZWN0b3JzLgordGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsCisgICAgaW50IGs3LCBpbnQgazgsIGludCBrOT4KK2NsYXNzIFR1cGxlRmllbGRzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKKyAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCksCisgICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs3KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs4KSwKKyAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrOSk+IHR5cGU7CisgIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7CisgICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwKKyAgICAgICAgZ2V0PGs1Pih0KSwgZ2V0PGs2Pih0KSwgZ2V0PGs3Pih0KSwgZ2V0PGs4Pih0KSwgZ2V0PGs5Pih0KSk7CisgIH0KK307CisKKy8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCBmb3IgMCB+IDkgc2VsZWN0b3JzLgorCit0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CitjbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTw+IHR5cGU7CisgIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiAvKiB0ICovKSB7CisgICAgcmV0dXJuIHR5cGUoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazA+CitjbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApPiB0eXBlOworICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgeworICAgIHJldHVybiB0eXBlKGdldDxrMD4odCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxPgorY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKKyAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSk+IHR5cGU7CisgIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7CisgICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMj4KK2NsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCisgICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazIpPiB0eXBlOworICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgeworICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCksIGdldDxrMj4odCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazIsIGludCBrMz4KK2NsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCisgICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazIpLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKT4gdHlwZTsKKyAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKKyAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrND4KK2NsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIC0xLCAtMSwgLTEsIC0xLCAtMT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCisgICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazIpLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs0KT4gdHlwZTsKKyAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKKyAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1PgorY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIC0xLCAtMSwgLTEsIC0xPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKKyAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCisgICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KT4gdHlwZTsKKyAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKKyAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLAorICAgICAgICBnZXQ8azU+KHQpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazY+CitjbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIC0xLCAtMSwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKKyAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCksCisgICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpPiB0eXBlOworICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgeworICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCksIGdldDxrMj4odCksIGdldDxrMz4odCksIGdldDxrND4odCksCisgICAgICAgIGdldDxrNT4odCksIGdldDxrNj4odCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwKKyAgICBpbnQgazc+CitjbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCAtMSwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKKyAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCksCisgICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs3KT4gdHlwZTsKKyAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKKyAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLAorICAgICAgICBnZXQ8azU+KHQpLCBnZXQ8azY+KHQpLCBnZXQ8azc+KHQpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsCisgICAgaW50IGs3LCBpbnQgazg+CitjbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgLTE+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKKyAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCksCisgICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpLAorICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs3KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs4KT4gdHlwZTsKKyAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKKyAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLAorICAgICAgICBnZXQ8azU+KHQpLCBnZXQ8azY+KHQpLCBnZXQ8azc+KHQpLCBnZXQ8azg+KHQpKTsKKyAgfQorfTsKKworI3VuZGVmIEdNT0NLX0ZJRUxEX1RZUEVfCisKKy8vIEltcGxlbWVudHMgdGhlIEFyZ3MoKSBtYXRjaGVyLgordGVtcGxhdGUgPGNsYXNzIEFyZ3NUdXBsZSwgaW50IGswID0gLTEsIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwgaW50IGszID0gLTEsCisgICAgaW50IGs0ID0gLTEsIGludCBrNSA9IC0xLCBpbnQgazYgPSAtMSwgaW50IGs3ID0gLTEsIGludCBrOCA9IC0xLAorICAgIGludCBrOSA9IC0xPgorY2xhc3MgQXJnc01hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8QXJnc1R1cGxlPiB7CisgcHVibGljOgorICAvLyBBcmdzVHVwbGUgbWF5IGhhdmUgdG9wLWxldmVsIGNvbnN0IG9yIHJlZmVyZW5jZSBtb2RpZmllcnMuCisgIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKEFyZ3NUdXBsZSkgUmF3QXJnc1R1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpUdXBsZUZpZWxkczxSYXdBcmdzVHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsCisgICAgICBrNiwgazcsIGs4LCBrOT46OnR5cGUgU2VsZWN0ZWRBcmdzOworICB0eXBlZGVmIE1hdGNoZXI8Y29uc3QgU2VsZWN0ZWRBcmdzJj4gTW9ub21vcnBoaWNJbm5lck1hdGNoZXI7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KKyAgZXhwbGljaXQgQXJnc01hdGNoZXJJbXBsKGNvbnN0IElubmVyTWF0Y2hlciYgaW5uZXJfbWF0Y2hlcikKKyAgICAgIDogaW5uZXJfbWF0Y2hlcl8oU2FmZU1hdGNoZXJDYXN0PGNvbnN0IFNlbGVjdGVkQXJncyY+KGlubmVyX21hdGNoZXIpKSB7fQorCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQXJnc1R1cGxlIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICBjb25zdCBTZWxlY3RlZEFyZ3MmIHNlbGVjdGVkX2FyZ3MgPSBHZXRTZWxlY3RlZEFyZ3MoYXJncyk7CisgICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpCisgICAgICByZXR1cm4gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hlcyhzZWxlY3RlZF9hcmdzKTsKKworICAgIFByaW50SW5kaWNlcyhsaXN0ZW5lci0+c3RyZWFtKCkpOworICAgICpsaXN0ZW5lciA8PCAiYXJlICIgPDwgUHJpbnRUb1N0cmluZyhzZWxlY3RlZF9hcmdzKTsKKworICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7CisgICAgY29uc3QgYm9vbCBtYXRjaCA9IGlubmVyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzZWxlY3RlZF9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlubmVyX2xpc3RlbmVyKTsKKyAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7CisgICAgcmV0dXJuIG1hdGNoOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJhcmUgYSB0dXBsZSAiOworICAgIFByaW50SW5kaWNlcyhvcyk7CisgICAgaW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiYXJlIGEgdHVwbGUgIjsKKyAgICBQcmludEluZGljZXMob3MpOworICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBTZWxlY3RlZEFyZ3MgR2V0U2VsZWN0ZWRBcmdzKEFyZ3NUdXBsZSBhcmdzKSB7CisgICAgcmV0dXJuIFR1cGxlRmllbGRzPFJhd0FyZ3NUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKKyAgICAgICAgazk+OjpHZXRTZWxlY3RlZEZpZWxkcyhhcmdzKTsKKyAgfQorCisgIC8vIFByaW50cyB0aGUgaW5kaWNlcyBvZiB0aGUgc2VsZWN0ZWQgZmllbGRzLgorICBzdGF0aWMgdm9pZCBQcmludEluZGljZXMoOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJ3aG9zZSBmaWVsZHMgKCI7CisgICAgY29uc3QgaW50IGluZGljZXNbMTBdID0geyBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSB9OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgaWYgKGluZGljZXNbaV0gPCAwKQorICAgICAgICBicmVhazsKKworICAgICAgaWYgKGkgPj0gMSkKKyAgICAgICAgKm9zIDw8ICIsICI7CisKKyAgICAgICpvcyA8PCAiIyIgPDwgaW5kaWNlc1tpXTsKKyAgICB9CisgICAgKm9zIDw8ICIpICI7CisgIH0KKworICBjb25zdCBNb25vbW9ycGhpY0lubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFyZ3NNYXRjaGVySW1wbCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5uZXJNYXRjaGVyLCBpbnQgazAgPSAtMSwgaW50IGsxID0gLTEsIGludCBrMiA9IC0xLAorICAgIGludCBrMyA9IC0xLCBpbnQgazQgPSAtMSwgaW50IGs1ID0gLTEsIGludCBrNiA9IC0xLCBpbnQgazcgPSAtMSwKKyAgICBpbnQgazggPSAtMSwgaW50IGs5ID0gLTE+CitjbGFzcyBBcmdzTWF0Y2hlciB7CisgcHVibGljOgorICBleHBsaWNpdCBBcmdzTWF0Y2hlcihjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpCisgICAgICA6IGlubmVyX21hdGNoZXJfKGlubmVyX21hdGNoZXIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ3NUdXBsZT4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxBcmdzVHVwbGU+KCkgY29uc3QgeworICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgQXJnc01hdGNoZXJJbXBsPEFyZ3NUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwKKyAgICAgICAgazYsIGs3LCBrOCwgazk+KGlubmVyX21hdGNoZXJfKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFyZ3NNYXRjaGVyKTsKK307CisKKy8vIEEgc2V0IG9mIG1ldGFmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IHR5cGUgb2YgQWxsT2YuCisvLyBBbGxPZihtMSwgLi4uLCBtTikgcmV0dXJucworLy8gQWxsT2ZSZXN1bHROPGRlY2x0eXBlKG0xKSwgLi4uLCBkZWNsdHlwZShtTik+Ojp0eXBlLgorCisvLyBBbHRob3VnaCBBbGxPZiBpc24ndCBkZWZpbmVkIGZvciBvbmUgYXJndW1lbnQsIEFsbE9mUmVzdWx0MSBpcyBkZWZpbmVkCisvLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+CitzdHJ1Y3QgQWxsT2ZSZXN1bHQxIHsKKyAgdHlwZWRlZiBNMSB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMj4KK3N0cnVjdCBBbGxPZlJlc3VsdDIgeworICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDE8TTE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQxPE0yPjo6dHlwZQorICA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMz4KK3N0cnVjdCBBbGxPZlJlc3VsdDMgeworICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDE8TTE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQyPE0yLCBNMz46OnR5cGUKKyAgPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00Pgorc3RydWN0IEFsbE9mUmVzdWx0NCB7CisgIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQyPE0zLCBNND46OnR5cGUKKyAgPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNT4KK3N0cnVjdCBBbGxPZlJlc3VsdDUgeworICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNMywgTTQsIE01Pjo6dHlwZQorICA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAorICAgIHR5cGVuYW1lIE02Pgorc3RydWN0IEFsbE9mUmVzdWx0NiB7CisgIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNMSwgTTIsIE0zPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNNCwgTTUsIE02Pjo6dHlwZQorICA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAorICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNz4KK3N0cnVjdCBBbGxPZlJlc3VsdDcgeworICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDQ8TTQsIE01LCBNNiwgTTc+Ojp0eXBlCisgID4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOD4KK3N0cnVjdCBBbGxPZlJlc3VsdDggeworICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ0PE01LCBNNiwgTTcsIE04Pjo6dHlwZQorICA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAorICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05Pgorc3RydWN0IEFsbE9mUmVzdWx0OSB7CisgIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUsCisgICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDU8TTUsIE02LCBNNywgTTgsIE05Pjo6dHlwZQorICA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAorICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05LCB0eXBlbmFtZSBNMTA+CitzdHJ1Y3QgQWxsT2ZSZXN1bHQxMCB7CisgIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ1PE02LCBNNywgTTgsIE05LCBNMTA+Ojp0eXBlCisgID4gdHlwZTsKK307CisKKy8vIEEgc2V0IG9mIG1ldGFmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IHR5cGUgb2YgQW55T2YuCisvLyBBbnlPZihtMSwgLi4uLCBtTikgcmV0dXJucworLy8gQW55T2ZSZXN1bHROPGRlY2x0eXBlKG0xKSwgLi4uLCBkZWNsdHlwZShtTik+Ojp0eXBlLgorCisvLyBBbHRob3VnaCBBbnlPZiBpc24ndCBkZWZpbmVkIGZvciBvbmUgYXJndW1lbnQsIEFueU9mUmVzdWx0MSBpcyBkZWZpbmVkCisvLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+CitzdHJ1Y3QgQW55T2ZSZXN1bHQxIHsKKyAgdHlwZWRlZiBNMSB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMj4KK3N0cnVjdCBBbnlPZlJlc3VsdDIgeworICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MTxNMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDE8TTI+Ojp0eXBlCisgID4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zPgorc3RydWN0IEFueU9mUmVzdWx0MyB7CisgIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAorICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQxPE0xPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMiwgTTM+Ojp0eXBlCisgID4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNND4KK3N0cnVjdCBBbnlPZlJlc3VsdDQgeworICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQyPE0zLCBNND46OnR5cGUKKyAgPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNT4KK3N0cnVjdCBBbnlPZlJlc3VsdDUgeworICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE0zLCBNNCwgTTU+Ojp0eXBlCisgID4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTY+CitzdHJ1Y3QgQW55T2ZSZXN1bHQ2IHsKKyAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDM8TTQsIE01LCBNNj46OnR5cGUKKyAgPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKKyAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTc+CitzdHJ1Y3QgQW55T2ZSZXN1bHQ3IHsKKyAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTQsIE01LCBNNiwgTTc+Ojp0eXBlCisgID4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOD4KK3N0cnVjdCBBbnlPZlJlc3VsdDggeworICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUsCisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTUsIE02LCBNNywgTTg+Ojp0eXBlCisgID4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTk+CitzdHJ1Y3QgQW55T2ZSZXN1bHQ5IHsKKyAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ1PE01LCBNNiwgTTcsIE04LCBNOT46OnR5cGUKKyAgPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKKyAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPgorc3RydWN0IEFueU9mUmVzdWx0MTAgeworICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ1PE02LCBNNywgTTgsIE05LCBNMTA+Ojp0eXBlCisgID4gdHlwZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYV9tYXRjaGVyKSBtYXRjaGVzIGEgdHVwbGUgaWYgdGhlIHNlbGVjdGVkCisvLyBmaWVsZHMgb2YgaXQgbWF0Y2hlcyBhX21hdGNoZXIuICBDKysgZG9lc24ndCBzdXBwb3J0IGRlZmF1bHQKKy8vIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyPgorQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXI+KG1hdGNoZXIpOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+CitpbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazE+CitBcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazE+KG1hdGNoZXIpOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazI+CitBcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyPihtYXRjaGVyKTsKK30KKwordGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszPgorQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazM+KG1hdGNoZXIpOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+CitpbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQ+CitBcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQ+KG1hdGNoZXIpOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazU+CitBcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1PihtYXRjaGVyKTsKK30KKwordGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2PgorQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+KG1hdGNoZXIpOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LAorICAgIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNz4KK0FyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LAorICAgICAgazc+KG1hdGNoZXIpOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsCisgICAgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgoraW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOD4KK0FyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywKKyAgICAgIGs4PihtYXRjaGVyKTsKK30KKwordGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LAorICAgIGludCBrOSwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgoraW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgazk+CitBcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAorICAgICAgazk+KG1hdGNoZXIpOworfQorCit0ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsCisgICAgaW50IGs5LCBpbnQgazEwLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+CitpbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwKKyAgICBrMTA+CitBcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAorICAgICAgazksIGsxMD4obWF0Y2hlcik7Cit9CisKKy8vIEVsZW1lbnRzQXJlKGVfMSwgZV8yLCAuLi4gZV9uKSBtYXRjaGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgd2l0aAorLy8gbiBlbGVtZW50cywgd2hlcmUgdGhlIGktdGggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyIG11c3QKKy8vIG1hdGNoIHRoZSBpLXRoIGFyZ3VtZW50IGluIHRoZSBsaXN0LiAgRWFjaCBhcmd1bWVudCBvZgorLy8gRWxlbWVudHNBcmUoKSBjYW4gYmUgZWl0aGVyIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAgV2Ugc3VwcG9ydCB1cCB0bworLy8gMTAgYXJndW1lbnRzLgorLy8KKy8vIFRoZSB1c2Ugb2YgRGVjYXlBcnJheSBpbiB0aGUgaW1wbGVtZW50YXRpb24gYWxsb3dzIEVsZW1lbnRzQXJlKCkKKy8vIHRvIGFjY2VwdCBzdHJpbmcgbGl0ZXJhbHMsIHdob3NlIHR5cGUgaXMgY29uc3QgY2hhcltOXSwgYnV0IHdlCisvLyB3YW50IHRvIHRyZWF0IHRoZW0gYXMgY29uc3QgY2hhciouCisvLworLy8gTk9URTogU2luY2UgRWxlbWVudHNBcmUoKSBjYXJlcyBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLCBpdAorLy8gbXVzdCBub3QgYmUgdXNlZCB3aXRoIGNvbnRhaW5lcnMgd2hvc2UgZWxlbWVudHMncyBvcmRlciBpcworLy8gdW5kZWZpbmVkIChlLmcuIGhhc2hfbWFwKS4KKworaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8CisgICAgOjp0ZXN0aW5nOjp0dXBsZTw+ID4KK0VsZW1lbnRzQXJlKCkgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8PiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitpbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKKyAgICA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGU+ID4KK0VsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSkgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGU+IEFyZ3M7CisgIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlPiA+CitFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMikgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGU+IEFyZ3M7CisgIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgoraW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8CisgICAgOjp0ZXN0aW5nOjp0dXBsZTwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZT4gPgorRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMykgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGU+IEFyZ3M7CisgIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMykpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitpbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKKyAgICA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGU+ID4KK0VsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCkgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGU+IEFyZ3M7CisgIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlPiA+CitFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCisgICAgY29uc3QgVDUmIGU1KSB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZT4gQXJnczsKKyAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGU+ID4KK0VsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKKyAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNikgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGU+IEFyZ3M7CisgIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1LCBlNikpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZT4gPgorRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAorICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlPiA+CitFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCisgICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4KSB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gQXJnczsKKyAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNywKKyAgICAgIGU4KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitpbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKKyAgICA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiA+CitFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCisgICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4LCBjb25zdCBUOSYgZTkpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3LAorICAgICAgZTgsIGU5KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxMD46OnR5cGU+ID4KK0VsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKKyAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3LCBjb25zdCBUOCYgZTgsIGNvbnN0IFQ5JiBlOSwKKyAgICBjb25zdCBUMTAmIGUxMCkgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3LAorICAgICAgZTgsIGU5LCBlMTApKTsKK30KKworLy8gVW5vcmRlcmVkRWxlbWVudHNBcmUoZV8xLCBlXzIsIC4uLiwgZV9uKSBpcyBhbiBFbGVtZW50c0FyZSBleHRlbnNpb24KKy8vIHRoYXQgbWF0Y2hlcyBuIGVsZW1lbnRzIGluIGFueSBvcmRlci4gIFdlIHN1cHBvcnQgdXAgdG8gbj0xMCBhcmd1bWVudHMuCisKK2lubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8PiA+CitVbm9yZGVyZWRFbGVtZW50c0FyZSgpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPD4gQXJnczsKKyAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgoraW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8CisgICAgOjp0ZXN0aW5nOjp0dXBsZTwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiA+CitVbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKKyAgICA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZT4gPgorVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMikpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK2lubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGU+ID4KK1Vub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgoraW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8CisgICAgOjp0ZXN0aW5nOjp0dXBsZTwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiA+CitVbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKKyAgICA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZT4gPgorVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAorICAgIGNvbnN0IFQ1JiBlNSkgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGU+IEFyZ3M7CisgIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKKyAgICA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiA+CitVbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCisgICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwKKyAgICAgIGU2KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgoraW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8CisgICAgOjp0ZXN0aW5nOjp0dXBsZTwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlPiA+CitVbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCisgICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNykgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGU+IEFyZ3M7CisgIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1LAorICAgICAgZTYsIGU3KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK2lubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlPiA+CitVbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCisgICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4KSB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gQXJnczsKKyAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsCisgICAgICBlNiwgZTcsIGU4KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKKyAgICA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiA+CitVbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCisgICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4LCBjb25zdCBUOSYgZTkpIHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwKKyAgICAgIGU2LCBlNywgZTgsIGU5KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2lubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAorICAgIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxMD46OnR5cGU+ID4KK1Vub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKKyAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3LCBjb25zdCBUOCYgZTgsIGNvbnN0IFQ5JiBlOSwKKyAgICBjb25zdCBUMTAmIGUxMCkgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiBBcmdzOworICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwKKyAgICAgIGU2LCBlNywgZTgsIGU5LCBlMTApKTsKK30KKworLy8gQWxsT2YobTEsIG0yLCAuLi4sIG1rKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYWxsIG9mIHRoZSBnaXZlbgorLy8gc3ViLW1hdGNoZXJzLiAgQWxsT2YgaXMgY2FsbGVkIGZ1bGx5IHF1YWxpZmllZCB0byBwcmV2ZW50IEFETCBmcm9tIGZpcmluZy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMj4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQyPE0xLCBNMj46OnR5cGUKK0FsbE9mKE0xIG0xLCBNMiBtMikgeworICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlKAorICAgICAgbTEsCisgICAgICBtMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zPgoraW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUKK0FsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMpIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUoCisgICAgICBtMSwKKyAgICAgIDo6dGVzdGluZzo6QWxsT2YobTIsIG0zKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNND4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZQorQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQpIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlKAorICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIpLAorICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMywgbTQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNT4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ1PE0xLCBNMiwgTTMsIE00LCBNNT46OnR5cGUKK0FsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSkgeworICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlKAorICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIpLAorICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMywgbTQsIG01KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTY+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NjxNMSwgTTIsIE0zLCBNNCwgTTUsIE02Pjo6dHlwZQorQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNikgeworICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NjxNMSwgTTIsIE0zLCBNNCwgTTUsIE02Pjo6dHlwZSgKKyAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yLCBtMyksCisgICAgICA6OnRlc3Rpbmc6OkFsbE9mKG00LCBtNSwgbTYpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKKyAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTc+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NzxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNz46OnR5cGUKK0FsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03KSB7CisgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ3PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03Pjo6dHlwZSgKKyAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yLCBtMyksCisgICAgICA6OnRlc3Rpbmc6OkFsbE9mKG00LCBtNSwgbTYsIG03KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOD4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ4PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOD46OnR5cGUKK0FsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCkgeworICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0ODxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTg+Ojp0eXBlKAorICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIsIG0zLCBtNCksCisgICAgICA6OnRlc3Rpbmc6OkFsbE9mKG01LCBtNiwgbTcsIG04KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTk+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0OTxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05Pjo6dHlwZQorQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04LCBNOSBtOSkgeworICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0OTxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsCisgICAgICBNOT46OnR5cGUoCisgICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMsIG00KSwKKyAgICAgIDo6dGVzdGluZzo6QWxsT2YobTUsIG02LCBtNywgbTgsIG05KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTksIHR5cGVuYW1lIE0xMD4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQxMDxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05LAorICAgIE0xMD46OnR5cGUKK0FsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCwgTTkgbTksIE0xMCBtMTApIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDEwPE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTksCisgICAgICBNMTA+Ojp0eXBlKAorICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIsIG0zLCBtNCwgbTUpLAorICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNiwgbTcsIG04LCBtOSwgbTEwKSk7Cit9CisKKy8vIEFueU9mKG0xLCBtMiwgLi4uLCBtaykgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4KKy8vIHN1Yi1tYXRjaGVycy4gIEFueU9mIGlzIGNhbGxlZCBmdWxseSBxdWFsaWZpZWQgdG8gcHJldmVudCBBREwgZnJvbSBmaXJpbmcuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlCitBbnlPZihNMSBtMSwgTTIgbTIpIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSgKKyAgICAgIG0xLAorICAgICAgbTIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMz4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlCitBbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zKSB7CisgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlKAorICAgICAgbTEsCisgICAgICA6OnRlc3Rpbmc6OkFueU9mKG0yLCBtMykpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQ+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUKK0FueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00KSB7CisgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSgKKyAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yKSwKKyAgICAgIDo6dGVzdGluZzo6QW55T2YobTMsIG00KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlCitBbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUpIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSgKKyAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yKSwKKyAgICAgIDo6dGVzdGluZzo6QW55T2YobTMsIG00LCBtNSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAorICAgIHR5cGVuYW1lIE02PgoraW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUKK0FueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYpIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUoCisgICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMpLAorICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNCwgbTUsIG02KSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCisgICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03PgoraW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDc8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTc+Ojp0eXBlCitBbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNykgeworICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NzxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNz46OnR5cGUoCisgICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMpLAorICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNCwgbTUsIG02LCBtNykpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAorICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0ODxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTg+Ojp0eXBlCitBbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgpIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZSgKKyAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yLCBtMywgbTQpLAorICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNSwgbTYsIG03LCBtOCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAorICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05PgoraW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOT46OnR5cGUKK0FueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCwgTTkgbTkpIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LAorICAgICAgTTk+Ojp0eXBlKAorICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIsIG0zLCBtNCksCisgICAgICA6OnRlc3Rpbmc6OkFueU9mKG01LCBtNiwgbTcsIG04LCBtOSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAorICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05LCB0eXBlbmFtZSBNMTA+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MTA8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOSwKKyAgICBNMTA+Ojp0eXBlCitBbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgsIE05IG05LCBNMTAgbTEwKSB7CisgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQxMDxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05LAorICAgICAgTTEwPjo6dHlwZSgKKyAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yLCBtMywgbTQsIG01KSwKKyAgICAgIDo6dGVzdGluZzo6QW55T2YobTYsIG03LCBtOCwgbTksIG0xMCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisKKy8vIFRoZSBNQVRDSEVSKiBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlIHRvCisvLyBkZWZpbmUgY3VzdG9tIG1hdGNoZXJzIGVhc2lseS4KKy8vCisvLyBCYXNpYyBVc2FnZQorLy8gPT09PT09PT09PT0KKy8vCisvLyBUaGUgc3ludGF4CisvLworLy8gICBNQVRDSEVSKG5hbWUsIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9CisvLworLy8gZGVmaW5lcyBhIG1hdGNoZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0aGF0IGV4ZWN1dGVzIHRoZSBzdGF0ZW1lbnRzLAorLy8gd2hpY2ggbXVzdCByZXR1cm4gYSBib29sIHRvIGluZGljYXRlIGlmIHRoZSBtYXRjaCBzdWNjZWVkcy4gIEluc2lkZQorLy8gdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYnkgJ2FyZycsCisvLyBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ190eXBlJy4KKy8vCisvLyBUaGUgZGVzY3JpcHRpb24gc3RyaW5nIGRvY3VtZW50cyB3aGF0IHRoZSBtYXRjaGVyIGRvZXMsIGFuZCBpcyB1c2VkCisvLyB0byBnZW5lcmF0ZSB0aGUgZmFpbHVyZSBtZXNzYWdlIHdoZW4gdGhlIG1hdGNoIGZhaWxzLiAgU2luY2UgYQorLy8gTUFUQ0hFUigpIGlzIHVzdWFsbHkgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIHNoYXJlZCBieSBtdWx0aXBsZQorLy8gQysrIHNvdXJjZSBmaWxlcywgd2UgcmVxdWlyZSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgYSBDLXN0cmluZworLy8gbGl0ZXJhbCB0byBhdm9pZCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMuICBJdCBjYW4gYmUgZW1wdHksIGluIHdoaWNoCisvLyBjYXNlIHdlJ2xsIHVzZSB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBhcyB0aGUKKy8vIGRlc2NyaXB0aW9uLgorLy8KKy8vIEZvciBleGFtcGxlOgorLy8KKy8vICAgTUFUQ0hFUihJc0V2ZW4sICIiKSB7IHJldHVybiAoYXJnICUgMikgPT0gMDsgfQorLy8KKy8vIGFsbG93cyB5b3UgdG8gd3JpdGUKKy8vCisvLyAgIC8vIEV4cGVjdHMgbW9ja19mb28uQmFyKG4pIHRvIGJlIGNhbGxlZCB3aGVyZSBuIGlzIGV2ZW4uCisvLyAgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBCYXIoSXNFdmVuKCkpKTsKKy8vCisvLyBvciwKKy8vCisvLyAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHZhbHVlIG9mIHNvbWVfZXhwcmVzc2lvbiBpcyBldmVuLgorLy8gICBFWFBFQ1RfVEhBVChzb21lX2V4cHJlc3Npb24sIElzRXZlbigpKTsKKy8vCisvLyBJZiB0aGUgYWJvdmUgYXNzZXJ0aW9uIGZhaWxzLCBpdCB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlOgorLy8KKy8vICAgVmFsdWUgb2Y6IHNvbWVfZXhwcmVzc2lvbgorLy8gICBFeHBlY3RlZDogaXMgZXZlbgorLy8gICAgIEFjdHVhbDogNworLy8KKy8vIHdoZXJlIHRoZSBkZXNjcmlwdGlvbiAiaXMgZXZlbiIgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlCisvLyBtYXRjaGVyIG5hbWUgSXNFdmVuLgorLy8KKy8vIEFyZ3VtZW50IFR5cGUKKy8vID09PT09PT09PT09PT0KKy8vCisvLyBOb3RlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgKGFyZ190eXBlKSBpcworLy8gZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB5b3UgdXNlIHRoZSBtYXRjaGVyIGFuZCBpcworLy8gc3VwcGxpZWQgdG8geW91IGJ5IHRoZSBjb21waWxlciwgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQKKy8vIGRlY2xhcmluZyBpdCAobm9yIGNhbiB5b3UpLiAgVGhpcyBhbGxvd3MgdGhlIG1hdGNoZXIgdG8gYmUKKy8vIHBvbHltb3JwaGljLiAgRm9yIGV4YW1wbGUsIElzRXZlbigpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFueSB0eXBlCisvLyB3aGVyZSB0aGUgdmFsdWUgb2YgIihhcmcgJSAyKSA9PSAwIiBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8KKy8vIGEgYm9vbC4gIEluIHRoZSAiQmFyKElzRXZlbigpKSIgZXhhbXBsZSBhYm92ZSwgaWYgbWV0aG9kIEJhcigpCisvLyB0YWtlcyBhbiBpbnQsICdhcmdfdHlwZScgd2lsbCBiZSBpbnQ7IGlmIGl0IHRha2VzIGFuIHVuc2lnbmVkIGxvbmcsCisvLyAnYXJnX3R5cGUnIHdpbGwgYmUgdW5zaWduZWQgbG9uZzsgYW5kIHNvIG9uLgorLy8KKy8vIFBhcmFtZXRlcml6aW5nIE1hdGNoZXJzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFNvbWV0aW1lcyB5b3UnbGwgd2FudCB0byBwYXJhbWV0ZXJpemUgdGhlIG1hdGNoZXIuICBGb3IgdGhhdCB5b3UKKy8vIGNhbiB1c2UgYW5vdGhlciBtYWNybzoKKy8vCisvLyAgIE1BVENIRVJfUChuYW1lLCBwYXJhbV9uYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQorLy8KKy8vIEZvciBleGFtcGxlOgorLy8KKy8vICAgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlLCAiIikgeyByZXR1cm4gYWJzKGFyZykgPT0gdmFsdWU7IH0KKy8vCisvLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKKy8vCisvLyAgIEVYUEVDVF9USEFUKEJsYWgoImEiKSwgSGFzQWJzb2x1dGVWYWx1ZShuKSk7CisvLworLy8gd2hpY2ggbWF5IGxlYWQgdG8gdGhpcyBtZXNzYWdlIChhc3N1bWluZyBuIGlzIDEwKToKKy8vCisvLyAgIFZhbHVlIG9mOiBCbGFoKCJhIikKKy8vICAgRXhwZWN0ZWQ6IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxMAorLy8gICAgIEFjdHVhbDogLTkKKy8vCisvLyBOb3RlIHRoYXQgYm90aCB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBhcmUKKy8vIHByaW50ZWQsIG1ha2luZyB0aGUgbWVzc2FnZSBodW1hbi1mcmllbmRseS4KKy8vCisvLyBJbiB0aGUgbWF0Y2hlciBkZWZpbml0aW9uIGJvZHksIHlvdSBjYW4gd3JpdGUgJ2Zvb190eXBlJyB0bworLy8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkICdmb28nLiAgRm9yIGV4YW1wbGUsIGluIHRoZQorLy8gYm9keSBvZiBNQVRDSEVSX1AoSGFzQWJzb2x1dGVWYWx1ZSwgdmFsdWUpIGFib3ZlLCB5b3UgY2FuIHdyaXRlCisvLyAndmFsdWVfdHlwZScgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgJ3ZhbHVlJy4KKy8vCisvLyBXZSBhbHNvIHByb3ZpZGUgTUFUQ0hFUl9QMiwgTUFUQ0hFUl9QMywgLi4uLCB1cCB0byBNQVRDSEVSX1AxMCB0bworLy8gc3VwcG9ydCBtdWx0aS1wYXJhbWV0ZXIgbWF0Y2hlcnMuCisvLworLy8gRGVzY3JpYmluZyBQYXJhbWV0ZXJpemVkIE1hdGNoZXJzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGUgbGFzdCBhcmd1bWVudCB0byBNQVRDSEVSKigpIGlzIGEgc3RyaW5nLXR5cGVkIGV4cHJlc3Npb24uICBUaGUKKy8vIGV4cHJlc3Npb24gY2FuIHJlZmVyZW5jZSBhbGwgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzIGFuZCBhCisvLyBzcGVjaWFsIGJvb2wtdHlwZWQgdmFyaWFibGUgbmFtZWQgJ25lZ2F0aW9uJy4gIFdoZW4gJ25lZ2F0aW9uJyBpcworLy8gZmFsc2UsIHRoZSBleHByZXNzaW9uIHNob3VsZCBldmFsdWF0ZSB0byB0aGUgbWF0Y2hlcidzIGRlc2NyaXB0aW9uOworLy8gb3RoZXJ3aXNlIGl0IHNob3VsZCBldmFsdWF0ZSB0byB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG5lZ2F0aW9uIG9mCisvLyB0aGUgbWF0Y2hlci4gIEZvciBleGFtcGxlLAorLy8KKy8vICAgdXNpbmcgdGVzdGluZzo6UHJpbnRUb1N0cmluZzsKKy8vCisvLyAgIE1BVENIRVJfUDIoSW5DbG9zZWRSYW5nZSwgbG93LCBoaSwKKy8vICAgICAgIHN0cmluZyhuZWdhdGlvbiA/ICJpcyBub3QiIDogImlzIikgKyAiIGluIHJhbmdlIFsiICsKKy8vICAgICAgIFByaW50VG9TdHJpbmcobG93KSArICIsICIgKyBQcmludFRvU3RyaW5nKGhpKSArICJdIikgeworLy8gICAgIHJldHVybiBsb3cgPD0gYXJnICYmIGFyZyA8PSBoaTsKKy8vICAgfQorLy8gICAuLi4KKy8vICAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7CisvLyAgIEVYUEVDVF9USEFUKDMsIE5vdChJbkNsb3NlZFJhbmdlKDIsIDQpKSk7CisvLworLy8gd291bGQgZ2VuZXJhdGUgdHdvIGZhaWx1cmVzIHRoYXQgY29udGFpbiB0aGUgdGV4dDoKKy8vCisvLyAgIEV4cGVjdGVkOiBpcyBpbiByYW5nZSBbNCwgNl0KKy8vICAgLi4uCisvLyAgIEV4cGVjdGVkOiBpcyBub3QgaW4gcmFuZ2UgWzIsIDRdCisvLworLy8gSWYgeW91IHNwZWNpZnkgIiIgYXMgdGhlIGRlc2NyaXB0aW9uLCB0aGUgZmFpbHVyZSBtZXNzYWdlIHdpbGwKKy8vIGNvbnRhaW4gdGhlIHNlcXVlbmNlIG9mIHdvcmRzIGluIHRoZSBtYXRjaGVyIG5hbWUgZm9sbG93ZWQgYnkgdGhlCisvLyBwYXJhbWV0ZXIgdmFsdWVzIHByaW50ZWQgYXMgYSB0dXBsZS4gIEZvciBleGFtcGxlLAorLy8KKy8vICAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLCAiIikgeyAuLi4gfQorLy8gICAuLi4KKy8vICAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7CisvLyAgIEVYUEVDVF9USEFUKDMsIE5vdChJbkNsb3NlZFJhbmdlKDIsIDQpKSk7CisvLworLy8gd291bGQgZ2VuZXJhdGUgdHdvIGZhaWx1cmVzIHRoYXQgY29udGFpbiB0aGUgdGV4dDoKKy8vCisvLyAgIEV4cGVjdGVkOiBpbiBjbG9zZWQgcmFuZ2UgKDQsIDYpCisvLyAgIC4uLgorLy8gICBFeHBlY3RlZDogbm90IChpbiBjbG9zZWQgcmFuZ2UgKDIsIDQpKQorLy8KKy8vIFR5cGVzIG9mIE1hdGNoZXIgUGFyYW1ldGVycworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3CisvLworLy8gICBNQVRDSEVSX1BrKEZvbywgcDEsIC4uLiwgcGssIGRlc2NyaXB0aW9uX3N0cmluZykgeyAuLi4gfQorLy8KKy8vIGFzIHNob3J0aGFuZCBmb3IKKy8vCisvLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+CisvLyAgIEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+CisvLyAgIEZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0KKy8vCisvLyBXaGVuIHlvdSB3cml0ZSBGb28odjEsIC4uLiwgdmspLCB0aGUgY29tcGlsZXIgaW5mZXJzIHRoZSB0eXBlcyBvZgorLy8gdGhlIHBhcmFtZXRlcnMgdjEsIC4uLiwgYW5kIHZrIGZvciB5b3UuICBJZiB5b3UgYXJlIG5vdCBoYXBweSB3aXRoCisvLyB0aGUgcmVzdWx0IG9mIHRoZSB0eXBlIGluZmVyZW5jZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSB0eXBlcyBieQorLy8gZXhwbGljaXRseSBpbnN0YW50aWF0aW5nIHRoZSB0ZW1wbGF0ZSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsCisvLyBmYWxzZSkuICBBcyBzYWlkIGVhcmxpZXIsIHlvdSBkb24ndCBnZXQgdG8gKG9yIG5lZWQgdG8pIHNwZWNpZnkKKy8vICdhcmdfdHlwZScgYXMgdGhhdCdzIGRldGVybWluZWQgYnkgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIG1hdGNoZXIKKy8vIGlzIHVzZWQuICBZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24gRm9vKHAxLCAuLi4sIHBrKQorLy8gdG8gYSB2YXJpYWJsZSBvZiB0eXBlIEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+LiAgVGhpcworLy8gY2FuIGJlIHVzZWZ1bCB3aGVuIGNvbXBvc2luZyBtYXRjaGVycy4KKy8vCisvLyBXaGlsZSB5b3UgY2FuIGluc3RhbnRpYXRlIGEgbWF0Y2hlciB0ZW1wbGF0ZSB3aXRoIHJlZmVyZW5jZSB0eXBlcywKKy8vIHBhc3NpbmcgdGhlIHBhcmFtZXRlcnMgYnkgcG9pbnRlciB1c3VhbGx5IG1ha2VzIHlvdXIgY29kZSBtb3JlCisvLyByZWFkYWJsZS4gIElmLCBob3dldmVyLCB5b3Ugc3RpbGwgd2FudCB0byBwYXNzIGEgcGFyYW1ldGVyIGJ5CisvLyByZWZlcmVuY2UsIGJlIGF3YXJlIHRoYXQgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlCisvLyBtYXRjaGVyIHlvdSB3aWxsIHNlZSB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGJ1dCBub3QgaXRzCisvLyBhZGRyZXNzLgorLy8KKy8vIEV4cGxhaW5pbmcgTWF0Y2ggUmVzdWx0cworLy8gPT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gU29tZXRpbWVzIHRoZSBtYXRjaGVyIGRlc2NyaXB0aW9uIGFsb25lIGlzbid0IGVub3VnaCB0byBleHBsYWluIHdoeQorLy8gdGhlIG1hdGNoIGhhcyBmYWlsZWQgb3Igc3VjY2VlZGVkLiAgRm9yIGV4YW1wbGUsIHdoZW4gZXhwZWN0aW5nIGEKKy8vIGxvbmcgc3RyaW5nLCBpdCBjYW4gYmUgdmVyeSBoZWxwZnVsIHRvIGFsc28gcHJpbnQgdGhlIGRpZmYgYmV0d2VlbgorLy8gdGhlIGV4cGVjdGVkIHN0cmluZyBhbmQgdGhlIGFjdHVhbCBvbmUuICBUbyBhY2hpZXZlIHRoYXQsIHlvdSBjYW4KKy8vIG9wdGlvbmFsbHkgc3RyZWFtIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYSBzcGVjaWFsIHZhcmlhYmxlCisvLyBuYW1lZCByZXN1bHRfbGlzdGVuZXIsIHdob3NlIHR5cGUgaXMgYSBwb2ludGVyIHRvIGNsYXNzCisvLyBNYXRjaFJlc3VsdExpc3RlbmVyOgorLy8KKy8vICAgTUFUQ0hFUl9QKEVxdWFsc0xvbmdTdHJpbmcsIHN0ciwgIiIpIHsKKy8vICAgICBpZiAoYXJnID09IHN0cikgcmV0dXJuIHRydWU7CisvLworLy8gICAgICpyZXN1bHRfbGlzdGVuZXIgPDwgInRoZSBkaWZmZXJlbmNlOiAiCisvLy8gICAgICAgICAgICAgICAgICAgICA8PCBEaWZmU3RyaW5ncyhzdHIsIGFyZyk7CisvLyAgICAgcmV0dXJuIGZhbHNlOworLy8gICB9CisvLworLy8gT3ZlcmxvYWRpbmcgTWF0Y2hlcnMKKy8vID09PT09PT09PT09PT09PT09PT09CisvLworLy8gWW91IGNhbiBvdmVybG9hZCBtYXRjaGVycyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6CisvLworLy8gICBNQVRDSEVSX1AoQmxhaCwgYSwgZGVzY3JpcHRpb25fc3RyaW5nMSkgeyAuLi4gfQorLy8gICBNQVRDSEVSX1AyKEJsYWgsIGEsIGIsIGRlc2NyaXB0aW9uX3N0cmluZzIpIHsgLi4uIH0KKy8vCisvLyBDYXZlYXRzCisvLyA9PT09PT09CisvLworLy8gV2hlbiBkZWZpbmluZyBhIG5ldyBtYXRjaGVyLCB5b3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgaW1wbGVtZW50aW5nCisvLyBNYXRjaGVySW50ZXJmYWNlIG9yIHVzaW5nIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKS4gIFRoZXNlCisvLyBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrIHRoYW4gdGhlIE1BVENIRVIqIG1hY3JvcywgYnV0IGFsc28KKy8vIGdpdmUgeW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYW5kCisvLyB0aGUgbWF0Y2hlciBwYXJhbWV0ZXJzLCB3aGljaCBtYXkgbGVhZHMgdG8gYmV0dGVyIGNvbXBpbGVyIGVycm9yCisvLyBtZXNzYWdlcyB3aGVuIHRoZSBtYXRjaGVyIGlzIHVzZWQgd3JvbmcuICBUaGV5IGFsc28gYWxsb3cKKy8vIG92ZXJsb2FkaW5nIG1hdGNoZXJzIGJhc2VkIG9uIHBhcmFtZXRlciB0eXBlcyAoYXMgb3Bwb3NlZCB0byBqdXN0CisvLyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMpLgorLy8KKy8vIE1BVENIRVIqKCkgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZS4gIFRoZSByZWFzb24gaXMKKy8vIHRoYXQgQysrIGRvZXNuJ3QgeWV0IGFsbG93IGZ1bmN0aW9uLWxvY2FsIHR5cGVzIHRvIGJlIHVzZWQgdG8KKy8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcy4gIFRoZSB1cC1jb21pbmcgQysrMHggc3RhbmRhcmQgd2lsbCBmaXggdGhpcy4KKy8vIE9uY2UgdGhhdCdzIGRvbmUsIHdlJ2xsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdXNpbmcgTUFUQ0hFUiooKSBpbnNpZGUKKy8vIGEgZnVuY3Rpb24uCisvLworLy8gTW9yZSBJbmZvcm1hdGlvbgorLy8gPT09PT09PT09PT09PT09PQorLy8KKy8vIFRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgdGhlc2UgbWFjcm9zLCBwbGVhc2Ugc2VhcmNoIGZvciAnTUFUQ0hFUicKKy8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suCisKKyNkZWZpbmUgTUFUQ0hFUihuYW1lLCBkZXNjcmlwdGlvbilcCisgIGNsYXNzIG5hbWUjI01hdGNoZXIge1wKKyAgIHB1YmxpYzpcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIGdtb2NrX0ltcGwoKVwKKyAgICAgICAgICAge31cCisgICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKKyAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCisgICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCisgICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAorICAgICAgfVwKKyAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAorICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAorICAgICAgfVwKKyAgICAgcHJpdmF0ZTpcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKKyAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCisgICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCisgICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKKyAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCisgICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKKyAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCisgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTw+KCkpKTtcCisgICAgICB9XAorICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCisgICAgfTtcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKKyAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4oKSk7XAorICAgIH1cCisgICAgbmFtZSMjTWF0Y2hlcigpIHtcCisgICAgfVwKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlcik7XAorICB9O1wKKyAgaW5saW5lIG5hbWUjI01hdGNoZXIgbmFtZSgpIHtcCisgICAgcmV0dXJuIG5hbWUjI01hdGNoZXIoKTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgIGJvb2wgbmFtZSMjTWF0Y2hlcjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCisgICAgICBhcmdfdHlwZSBhcmcsIFwKKyAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKKyAgICAgICAgICBjb25zdAorCisjZGVmaW5lIE1BVENIRVJfUChuYW1lLCBwMCwgZGVzY3JpcHRpb24pXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKKyAgY2xhc3MgbmFtZSMjTWF0Y2hlclAge1wKKyAgIHB1YmxpYzpcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIGV4cGxpY2l0IGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwKVwKKyAgICAgICAgICAgOiBwMChnbW9ja19wMCkge31cCisgICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKKyAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCisgICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCisgICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAorICAgICAgfVwKKyAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAorICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAorICAgICAgfVwKKyAgICAgIHAwIyNfdHlwZSBwMDtcCisgICAgIHByaXZhdGU6XAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCisgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAorICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAorICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAorICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCisgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAorICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlPihwMCkpKTtcCisgICAgICB9XAorICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCisgICAgfTtcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKKyAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDApKTtcCisgICAgfVwKKyAgICBleHBsaWNpdCBuYW1lIyNNYXRjaGVyUChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHtcCisgICAgfVwKKyAgICBwMCMjX3R5cGUgcDA7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUCk7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNNYXRjaGVyUDxwMCMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwKSB7XAorICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDxwMCMjX3R5cGU+KHAwKTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGU+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICBib29sIG5hbWUjI01hdGNoZXJQPHAwIyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAorICAgICAgYXJnX3R5cGUgYXJnLCBcCisgICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCisgICAgICAgICAgY29uc3QKKworI2RlZmluZSBNQVRDSEVSX1AyKG5hbWUsIHAwLCBwMSwgZGVzY3JpcHRpb24pXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGU+XAorICBjbGFzcyBuYW1lIyNNYXRjaGVyUDIge1wKKyAgIHB1YmxpYzpcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEpXAorICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpIHt9XAorICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCisgICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAorICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKKyAgICAgIH1cCisgICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKKyAgICAgIH1cCisgICAgICBwMCMjX3R5cGUgcDA7XAorICAgICAgcDEjI190eXBlIHAxO1wKKyAgICAgcHJpdmF0ZTpcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKKyAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCisgICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCisgICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKKyAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCisgICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKKyAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCisgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKSkpO1wKKyAgICAgIH1cCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAorICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEpKTtcCisgICAgfVwKKyAgICBuYW1lIyNNYXRjaGVyUDIocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEpIDogcDAoZ21vY2tfcDApLCBcCisgICAgICAgIHAxKGdtb2NrX3AxKSB7XAorICAgIH1cCisgICAgcDAjI190eXBlIHAwO1wKKyAgICBwMSMjX3R5cGUgcDE7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDIpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNNYXRjaGVyUDI8cDAjI190eXBlLCBwMSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCisgICAgICBwMSMjX3R5cGUgcDEpIHtcCisgICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgIGJvb2wgbmFtZSMjTWF0Y2hlclAyPHAwIyNfdHlwZSwgXAorICAgICAgcDEjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCisgICAgICBhcmdfdHlwZSBhcmcsIFwKKyAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKKyAgICAgICAgICBjb25zdAorCisjZGVmaW5lIE1BVENIRVJfUDMobmFtZSwgcDAsIHAxLCBwMiwgZGVzY3JpcHRpb24pXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI01hdGNoZXJQMyB7XAorICAgcHVibGljOlwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyKVwKKyAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHt9XAorICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCisgICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAorICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKKyAgICAgIH1cCisgICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKKyAgICAgIH1cCisgICAgICBwMCMjX3R5cGUgcDA7XAorICAgICAgcDEjI190eXBlIHAxO1wKKyAgICAgIHAyIyNfdHlwZSBwMjtcCisgICAgIHByaXZhdGU6XAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCisgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAorICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAorICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAorICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCisgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAorICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBcCisgICAgICAgICAgICAgICAgICAgIHAyKSkpO1wKKyAgICAgIH1cCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAorICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyKSk7XAorICAgIH1cCisgICAgbmFtZSMjTWF0Y2hlclAzKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCisgICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHtcCisgICAgfVwKKyAgICBwMCMjX3R5cGUgcDA7XAorICAgIHAxIyNfdHlwZSBwMTtcCisgICAgcDIjI190eXBlIHAyO1wKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclAzKTtcCisgIH07XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNNYXRjaGVyUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIFwKKyAgICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyKSB7XAorICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBwMik7XAorICB9XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgIGJvb2wgbmFtZSMjTWF0Y2hlclAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBcCisgICAgICBwMiMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKKyAgICAgIGFyZ190eXBlIGFyZywgXAorICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAorICAgICAgICAgIGNvbnN0CisKKyNkZWZpbmUgTUFUQ0hFUl9QNChuYW1lLCBwMCwgcDEsIHAyLCBwMywgZGVzY3JpcHRpb24pXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlPlwKKyAgY2xhc3MgbmFtZSMjTWF0Y2hlclA0IHtcCisgICBwdWJsaWM6XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCisgICAgIHB1YmxpYzpcCisgICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKKyAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMpXAorICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7fVwKKyAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAorICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKKyAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCisgICAgICB9XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCisgICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCisgICAgICB9XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgIHAxIyNfdHlwZSBwMTtcCisgICAgICBwMiMjX3R5cGUgcDI7XAorICAgICAgcDMjI190eXBlIHAzO1wKKyAgICAgcHJpdmF0ZTpcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKKyAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCisgICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCisgICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKKyAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCisgICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKKyAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCisgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcCisgICAgICAgICAgICAgICAgICAgIHAzIyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMpKSk7XAorICAgICAgfVwKKyAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAorICAgIH07XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCisgICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzKSk7XAorICAgIH1cCisgICAgbmFtZSMjTWF0Y2hlclA0KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCisgICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCisgICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpIHtcCisgICAgfVwKKyAgICBwMCMjX3R5cGUgcDA7XAorICAgIHAxIyNfdHlwZSBwMTtcCisgICAgcDIjI190eXBlIHAyO1wKKyAgICBwMyMjX3R5cGUgcDM7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDQpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAorICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA0PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIFwKKyAgICAgIHAzIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBcCisgICAgICBwMyMjX3R5cGUgcDMpIHtcCisgICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGU+KHAwLCBcCisgICAgICAgIHAxLCBwMiwgcDMpO1wKKyAgfVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgIGJvb2wgbmFtZSMjTWF0Y2hlclA0PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIFwKKyAgICAgIHAzIyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAorICAgICAgYXJnX3R5cGUgYXJnLCBcCisgICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCisgICAgICAgICAgY29uc3QKKworI2RlZmluZSBNQVRDSEVSX1A1KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgZGVzY3JpcHRpb24pXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAorICBjbGFzcyBuYW1lIyNNYXRjaGVyUDUge1wKKyAgIHB1YmxpYzpcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAorICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KVwKKyAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIFwKKyAgICAgICAgICAgICAgIHA0KGdtb2NrX3A0KSB7fVwKKyAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAorICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKKyAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCisgICAgICB9XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCisgICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCisgICAgICB9XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgIHAxIyNfdHlwZSBwMTtcCisgICAgICBwMiMjX3R5cGUgcDI7XAorICAgICAgcDMjI190eXBlIHAzO1wKKyAgICAgIHA0IyNfdHlwZSBwNDtcCisgICAgIHByaXZhdGU6XAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCisgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAorICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAorICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAorICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCisgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAorICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICAgICAgICAgICAgICAgIHA0IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0KSkpO1wKKyAgICAgIH1cCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAorICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQpKTtcCisgICAgfVwKKyAgICBuYW1lIyNNYXRjaGVyUDUocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKKyAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIFwKKyAgICAgICAgcDQjI190eXBlIGdtb2NrX3A0KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKKyAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCkge1wKKyAgICB9XAorICAgIHAwIyNfdHlwZSBwMDtcCisgICAgcDEjI190eXBlIHAxO1wKKyAgICBwMiMjX3R5cGUgcDI7XAorICAgIHAzIyNfdHlwZSBwMztcCisgICAgcDQjI190eXBlIHA0O1wKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA1KTtcCisgIH07XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAorICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgcDQjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAorICAgICAgcDQjI190eXBlIHA0KSB7XAorICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICAgIHA0IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0KTtcCisgIH1cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgIGJvb2wgbmFtZSMjTWF0Y2hlclA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgcDQjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCisgICAgICBhcmdfdHlwZSBhcmcsIFwKKyAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKKyAgICAgICAgICBjb25zdAorCisjZGVmaW5lIE1BVENIRVJfUDYobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgZGVzY3JpcHRpb24pXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI01hdGNoZXJQNiB7XAorICAgcHVibGljOlwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCisgICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSlcCisgICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCisgICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSB7fVwKKyAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAorICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKKyAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCisgICAgICB9XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCisgICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCisgICAgICB9XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgIHAxIyNfdHlwZSBwMTtcCisgICAgICBwMiMjX3R5cGUgcDI7XAorICAgICAgcDMjI190eXBlIHAzO1wKKyAgICAgIHA0IyNfdHlwZSBwNDtcCisgICAgICBwNSMjX3R5cGUgcDU7XAorICAgICBwcml2YXRlOlwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAorICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKKyAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKKyAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAorICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKKyAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAorICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKKyAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpKTtcCisgICAgICB9XAorICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCisgICAgfTtcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKKyAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpO1wKKyAgICB9XAorICAgIG5hbWUjI01hdGNoZXJQNihwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCisgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCisgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge1wKKyAgICB9XAorICAgIHAwIyNfdHlwZSBwMDtcCisgICAgcDEjI190eXBlIHAxO1wKKyAgICBwMiMjX3R5cGUgcDI7XAorICAgIHAzIyNfdHlwZSBwMztcCisgICAgcDQjI190eXBlIHA0O1wKKyAgICBwNSMjX3R5cGUgcDU7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDYpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKKyAgaW5saW5lIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIFwKKyAgICAgIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUpIHtcCisgICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpO1wKKyAgfVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICBib29sIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAorICAgICAgcDUjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCisgICAgICBhcmdfdHlwZSBhcmcsIFwKKyAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKKyAgICAgICAgICBjb25zdAorCisjZGVmaW5lIE1BVENIRVJfUDcobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIGRlc2NyaXB0aW9uKVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI01hdGNoZXJQNyB7XAorICAgcHVibGljOlwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCisgICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAorICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNilcCisgICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCisgICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpIHt9XAorICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCisgICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAorICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKKyAgICAgIH1cCisgICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKKyAgICAgIH1cCisgICAgICBwMCMjX3R5cGUgcDA7XAorICAgICAgcDEjI190eXBlIHAxO1wKKyAgICAgIHAyIyNfdHlwZSBwMjtcCisgICAgICBwMyMjX3R5cGUgcDM7XAorICAgICAgcDQjI190eXBlIHA0O1wKKyAgICAgIHA1IyNfdHlwZSBwNTtcCisgICAgICBwNiMjX3R5cGUgcDY7XAorICAgICBwcml2YXRlOlwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAorICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKKyAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKKyAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAorICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKKyAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAorICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKKyAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCisgICAgICAgICAgICAgICAgICAgIHA2KSkpO1wKKyAgICAgIH1cCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAorICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpO1wKKyAgICB9XAorICAgIG5hbWUjI01hdGNoZXJQNyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCisgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCisgICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgXAorICAgICAgICBwNihnbW9ja19wNikge1wKKyAgICB9XAorICAgIHAwIyNfdHlwZSBwMDtcCisgICAgcDEjI190eXBlIHAxO1wKKyAgICBwMiMjX3R5cGUgcDI7XAorICAgIHAzIyNfdHlwZSBwMztcCisgICAgcDQjI190eXBlIHA0O1wKKyAgICBwNSMjX3R5cGUgcDU7XAorICAgIHA2IyNfdHlwZSBwNjtcCisgICBwcml2YXRlOlwKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQNyk7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNNYXRjaGVyUDc8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBcCisgICAgICBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIFwKKyAgICAgIHA2IyNfdHlwZSBwNikge1wKKyAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNik7XAorICB9XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDYjI190eXBlPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgYm9vbCBuYW1lIyNNYXRjaGVyUDc8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKKyAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCisgICAgICBhcmdfdHlwZSBhcmcsIFwKKyAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKKyAgICAgICAgICBjb25zdAorCisjZGVmaW5lIE1BVENIRVJfUDgobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBkZXNjcmlwdGlvbilcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI01hdGNoZXJQOCB7XAorICAgcHVibGljOlwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAorICAgICBwdWJsaWM6XAorICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCisgICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAorICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3KVwKKyAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIFwKKyAgICAgICAgICAgICAgIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSB7fVwKKyAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAorICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKKyAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCisgICAgICB9XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCisgICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCisgICAgICB9XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgIHAxIyNfdHlwZSBwMTtcCisgICAgICBwMiMjX3R5cGUgcDI7XAorICAgICAgcDMjI190eXBlIHAzO1wKKyAgICAgIHA0IyNfdHlwZSBwNDtcCisgICAgICBwNSMjX3R5cGUgcDU7XAorICAgICAgcDYjI190eXBlIHA2O1wKKyAgICAgIHA3IyNfdHlwZSBwNztcCisgICAgIHByaXZhdGU6XAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCisgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAorICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAorICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAorICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCisgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAorICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICAgICAgICAgICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZT4ocDAsIHAxLCBwMiwgXAorICAgICAgICAgICAgICAgICAgICBwMywgcDQsIHA1LCBwNiwgcDcpKSk7XAorICAgICAgfVwKKyAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAorICAgIH07XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCisgICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNykpO1wKKyAgICB9XAorICAgIG5hbWUjI01hdGNoZXJQOChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCisgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBcCisgICAgICAgIHA3IyNfdHlwZSBnbW9ja19wNykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCisgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgXAorICAgICAgICBwNyhnbW9ja19wNykge1wKKyAgICB9XAorICAgIHAwIyNfdHlwZSBwMDtcCisgICAgcDEjI190eXBlIHAxO1wKKyAgICBwMiMjX3R5cGUgcDI7XAorICAgIHAzIyNfdHlwZSBwMztcCisgICAgcDQjI190eXBlIHA0O1wKKyAgICBwNSMjX3R5cGUgcDU7XAorICAgIHA2IyNfdHlwZSBwNjtcCisgICAgcDcjI190eXBlIHA3O1wKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA4KTtcCisgIH07XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XAorICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAorICAgICAgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIFwKKyAgICAgIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3KSB7XAorICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAorICAgICAgICBwNiwgcDcpO1wKKyAgfVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgYm9vbCBuYW1lIyNNYXRjaGVyUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKKyAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlLCBcCisgICAgICBwNyMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKKyAgICAgIGFyZ190eXBlIGFyZywgXAorICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAorICAgICAgICAgIGNvbnN0CisKKyNkZWZpbmUgTUFUQ0hFUl9QOShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBkZXNjcmlwdGlvbilcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwKKyAgY2xhc3MgbmFtZSMjTWF0Y2hlclA5IHtcCisgICBwdWJsaWM6XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCisgICAgIHB1YmxpYzpcCisgICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKKyAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCisgICAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIHA4IyNfdHlwZSBnbW9ja19wOClcCisgICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCisgICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKKyAgICAgICAgICAgICAgIHA4KGdtb2NrX3A4KSB7fVwKKyAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAorICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKKyAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCisgICAgICB9XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCisgICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCisgICAgICB9XAorICAgICAgcDAjI190eXBlIHAwO1wKKyAgICAgIHAxIyNfdHlwZSBwMTtcCisgICAgICBwMiMjX3R5cGUgcDI7XAorICAgICAgcDMjI190eXBlIHAzO1wKKyAgICAgIHA0IyNfdHlwZSBwNDtcCisgICAgICBwNSMjX3R5cGUgcDU7XAorICAgICAgcDYjI190eXBlIHA2O1wKKyAgICAgIHA3IyNfdHlwZSBwNztcCisgICAgICBwOCMjX3R5cGUgcDg7XAorICAgICBwcml2YXRlOlwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAorICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKKyAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKKyAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAorICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKKyAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAorICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKKyAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIFwKKyAgICAgICAgICAgICAgICAgICAgcDgjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSkpO1wKKyAgICAgIH1cCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAorICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSk7XAorICAgIH1cCisgICAgbmFtZSMjTWF0Y2hlclA5KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCisgICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKKyAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXAorICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAorICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXAorICAgICAgICBwOChnbW9ja19wOCkge1wKKyAgICB9XAorICAgIHAwIyNfdHlwZSBwMDtcCisgICAgcDEjI190eXBlIHAxO1wKKyAgICBwMiMjX3R5cGUgcDI7XAorICAgIHAzIyNfdHlwZSBwMztcCisgICAgcDQjI190eXBlIHA0O1wKKyAgICBwNSMjX3R5cGUgcDU7XAorICAgIHA2IyNfdHlwZSBwNjtcCisgICAgcDcjI190eXBlIHA3O1wKKyAgICBwOCMjX3R5cGUgcDg7XAorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDkpO1wKKyAgfTtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCisgICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwKKyAgaW5saW5lIG5hbWUjI01hdGNoZXJQOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAorICAgICAgcDgjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAorICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBcCisgICAgICBwOCMjX3R5cGUgcDgpIHtcCisgICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGU+KHAwLCBwMSwgcDIsIFwKKyAgICAgICAgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCk7XAorICB9XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAorICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgIGJvb2wgbmFtZSMjTWF0Y2hlclA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCisgICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBcCisgICAgICBwOCMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKKyAgICAgIGFyZ190eXBlIGFyZywgXAorICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAorICAgICAgICAgIGNvbnN0CisKKyNkZWZpbmUgTUFUQ0hFUl9QMTAobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDksIGRlc2NyaXB0aW9uKVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCisgIGNsYXNzIG5hbWUjI01hdGNoZXJQMTAge1wKKyAgIHB1YmxpYzpcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAorICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKKyAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcCisgICAgICAgICAgcDkjI190eXBlIGdtb2NrX3A5KVwKKyAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIFwKKyAgICAgICAgICAgICAgIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXAorICAgICAgICAgICAgICAgcDgoZ21vY2tfcDgpLCBwOShnbW9ja19wOSkge31cCisgICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKKyAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCisgICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCisgICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAorICAgICAgfVwKKyAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAorICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAorICAgICAgfVwKKyAgICAgIHAwIyNfdHlwZSBwMDtcCisgICAgICBwMSMjX3R5cGUgcDE7XAorICAgICAgcDIjI190eXBlIHAyO1wKKyAgICAgIHAzIyNfdHlwZSBwMztcCisgICAgICBwNCMjX3R5cGUgcDQ7XAorICAgICAgcDUjI190eXBlIHA1O1wKKyAgICAgIHA2IyNfdHlwZSBwNjtcCisgICAgICBwNyMjX3R5cGUgcDc7XAorICAgICAgcDgjI190eXBlIHA4O1wKKyAgICAgIHA5IyNfdHlwZSBwOTtcCisgICAgIHByaXZhdGU6XAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCisgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAorICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAorICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAorICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCisgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAorICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICAgICAgICAgICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCisgICAgICAgICAgICAgICAgICAgIHA5IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSk7XAorICAgICAgfVwKKyAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAorICAgIH07XAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCisgICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KSk7XAorICAgIH1cCisgICAgbmFtZSMjTWF0Y2hlclAxMChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAorICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCisgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKKyAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4LCBwOSMjX3R5cGUgZ21vY2tfcDkpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKKyAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKKyAgICAgICAgcDcoZ21vY2tfcDcpLCBwOChnbW9ja19wOCksIHA5KGdtb2NrX3A5KSB7XAorICAgIH1cCisgICAgcDAjI190eXBlIHAwO1wKKyAgICBwMSMjX3R5cGUgcDE7XAorICAgIHAyIyNfdHlwZSBwMjtcCisgICAgcDMjI190eXBlIHAzO1wKKyAgICBwNCMjX3R5cGUgcDQ7XAorICAgIHA1IyNfdHlwZSBwNTtcCisgICAgcDYjI190eXBlIHA2O1wKKyAgICBwNyMjX3R5cGUgcDc7XAorICAgIHA4IyNfdHlwZSBwODtcCisgICAgcDkjI190eXBlIHA5O1wKKyAgIHByaXZhdGU6XAorICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclAxMCk7XAorICB9O1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCisgIGlubGluZSBuYW1lIyNNYXRjaGVyUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAorICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUsIFwKKyAgICAgIHA5IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwKKyAgICAgIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNywgcDgjI190eXBlIHA4LCBcCisgICAgICBwOSMjX3R5cGUgcDkpIHtcCisgICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCisgICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGU+KHAwLCBcCisgICAgICAgIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpO1wKKyAgfVwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKKyAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCisgIGJvb2wgbmFtZSMjTWF0Y2hlclAxMDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKKyAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCisgICAgICBwOSMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKKyAgICAgIGFyZ190eXBlIGFyZywgXAorICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAorICAgICAgICAgIGNvbnN0CisKKyNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTUFUQ0hFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oLnB1bXAgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzBjMmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wCkBAIC0wLDAgKzEsNjcyIEBACiskJCAtKi0gbW9kZTogYysrOyAtKi0KKyQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlLiAgUGxlYXNlIHVzZSBQdW1wIHRvIGNvbnZlcnQgaXQgdG8KKyQkIGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmguCiskJAorJHZhciBuID0gMTAgICQkIFRoZSBtYXhpbXVtIGFyaXR5IHdlIHN1cHBvcnQuCiskJCB9fSBUaGlzIGxpbmUgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGNvZGUgaW4gRW1hY3MuCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgdmFyaWFkaWMgbWF0Y2hlcnMuCisKKyNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTUFUQ0hFUlNfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTUFUQ0hFUlNfSF8KKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJnbW9jay9nbW9jay1tYXRjaGVycy5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCiskcmFuZ2UgaSAwLi5uLTEKKworLy8gVGhlIHR5cGUgb2YgdGhlIGktdGggKDAtYmFzZWQpIGZpZWxkIG9mIFR1cGxlLgorI2RlZmluZSBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgaSkgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxpLCBUdXBsZT46OnR5cGUKKworLy8gVHVwbGVGaWVsZHM8VHVwbGUsIGswLCAuLi4sIGtuPiBpcyBmb3Igc2VsZWN0aW5nIGZpZWxkcyBmcm9tIGEKKy8vIHR1cGxlIG9mIHR5cGUgVHVwbGUuICBJdCBoYXMgdHdvIG1lbWJlcnM6CisvLworLy8gICB0eXBlOiBhIHR1cGxlIHR5cGUgd2hvc2UgaS10aCBmaWVsZCBpcyB0aGUga2ktdGggZmllbGQgb2YgVHVwbGUuCisvLyAgIEdldFNlbGVjdGVkRmllbGRzKHQpOiByZXR1cm5zIGZpZWxkcyBrMCwgLi4uLCBhbmQga24gb2YgdCBhcyBhIHR1cGxlLgorLy8KKy8vIEZvciBleGFtcGxlLCBpbiBjbGFzcyBUdXBsZUZpZWxkczx0dXBsZTxib29sLCBjaGFyLCBpbnQ+LCAyLCAwPiwgd2UgaGF2ZToKKy8vCisvLyAgIHR5cGUgaXMgdHVwbGU8aW50LCBib29sPiwgYW5kCisvLyAgIEdldFNlbGVjdGVkRmllbGRzKG1ha2VfdHVwbGUodHJ1ZSwgJ2EnLCA0MikpIGlzICg0MiwgdHJ1ZSkuCisKK3RlbXBsYXRlIDxjbGFzcyBUdXBsZSRmb3IgaSBbWywgaW50IGskaSA9IC0xXV0+CitjbGFzcyBUdXBsZUZpZWxkczsKKworLy8gVGhpcyBnZW5lcmljIHZlcnNpb24gaXMgdXNlZCB3aGVuIHRoZXJlIGFyZSAkbiBzZWxlY3RvcnMuCit0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUkZm9yIGkgW1ssIGludCBrJGldXT4KK2NsYXNzIFR1cGxlRmllbGRzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGksIFtbR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGskaSldXT4gdHlwZTsKKyAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKKyAgICByZXR1cm4gdHlwZSgkZm9yIGksIFtbZ2V0PGskaT4odCldXSk7CisgIH0KK307CisKKy8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCBmb3IgMCB+ICQobi0xKSBzZWxlY3RvcnMuCisKKyRmb3IgaSBbWworJCQgfX19CiskcmFuZ2UgaiAwLi5pLTEKKyRyYW5nZSBrIDAuLm4tMQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUkZm9yIGogW1ssIGludCBrJGpdXT4KK2NsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCAkZm9yIGssIFtbJGlmIGsgPCBpIFtbayRrXV0gJGVsc2UgW1stMV1dXV0+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGosIFtbR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGskaildXT4gdHlwZTsKKyAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmICRpZiBpPT0wIFtbLyogdCAqL11dICRlbHNlIFtbdF1dKSB7CisgICAgcmV0dXJuIHR5cGUoJGZvciBqLCBbW2dldDxrJGo+KHQpXV0pOworICB9Cit9OworCitdXQorCisjdW5kZWYgR01PQ0tfRklFTERfVFlQRV8KKworLy8gSW1wbGVtZW50cyB0aGUgQXJncygpIG1hdGNoZXIuCisKKyR2YXIga3MgPSBbWyRmb3IgaSwgW1trJGldXV1dCit0ZW1wbGF0ZSA8Y2xhc3MgQXJnc1R1cGxlJGZvciBpIFtbLCBpbnQgayRpID0gLTFdXT4KK2NsYXNzIEFyZ3NNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPEFyZ3NUdXBsZT4geworIHB1YmxpYzoKKyAgLy8gQXJnc1R1cGxlIG1heSBoYXZlIHRvcC1sZXZlbCBjb25zdCBvciByZWZlcmVuY2UgbW9kaWZpZXJzLgorICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhBcmdzVHVwbGUpIFJhd0FyZ3NUdXBsZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6VHVwbGVGaWVsZHM8UmF3QXJnc1R1cGxlLCAka3M+Ojp0eXBlIFNlbGVjdGVkQXJnczsKKyAgdHlwZWRlZiBNYXRjaGVyPGNvbnN0IFNlbGVjdGVkQXJncyY+IE1vbm9tb3JwaGljSW5uZXJNYXRjaGVyOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+CisgIGV4cGxpY2l0IEFyZ3NNYXRjaGVySW1wbChjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpCisgICAgICA6IGlubmVyX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBTZWxlY3RlZEFyZ3MmPihpbm5lcl9tYXRjaGVyKSkge30KKworICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKEFyZ3NUdXBsZSBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgY29uc3QgU2VsZWN0ZWRBcmdzJiBzZWxlY3RlZF9hcmdzID0gR2V0U2VsZWN0ZWRBcmdzKGFyZ3MpOworICAgIGlmICghbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKQorICAgICAgcmV0dXJuIGlubmVyX21hdGNoZXJfLk1hdGNoZXMoc2VsZWN0ZWRfYXJncyk7CisKKyAgICBQcmludEluZGljZXMobGlzdGVuZXItPnN0cmVhbSgpKTsKKyAgICAqbGlzdGVuZXIgPDwgImFyZSAiIDw8IFByaW50VG9TdHJpbmcoc2VsZWN0ZWRfYXJncyk7CisKKyAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOworICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBpbm5lcl9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc2VsZWN0ZWRfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm5lcl9saXN0ZW5lcik7CisgICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOworICAgIHJldHVybiBtYXRjaDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiYXJlIGEgdHVwbGUgIjsKKyAgICBQcmludEluZGljZXMob3MpOworICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImFyZSBhIHR1cGxlICI7CisgICAgUHJpbnRJbmRpY2VzKG9zKTsKKyAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgU2VsZWN0ZWRBcmdzIEdldFNlbGVjdGVkQXJncyhBcmdzVHVwbGUgYXJncykgeworICAgIHJldHVybiBUdXBsZUZpZWxkczxSYXdBcmdzVHVwbGUsICRrcz46OkdldFNlbGVjdGVkRmllbGRzKGFyZ3MpOworICB9CisKKyAgLy8gUHJpbnRzIHRoZSBpbmRpY2VzIG9mIHRoZSBzZWxlY3RlZCBmaWVsZHMuCisgIHN0YXRpYyB2b2lkIFByaW50SW5kaWNlcyg6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAqb3MgPDwgIndob3NlIGZpZWxkcyAoIjsKKyAgICBjb25zdCBpbnQgaW5kaWNlc1skbl0gPSB7ICRrcyB9OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJG47IGkrKykgeworICAgICAgaWYgKGluZGljZXNbaV0gPCAwKQorICAgICAgICBicmVhazsKKworICAgICAgaWYgKGkgPj0gMSkKKyAgICAgICAgKm9zIDw8ICIsICI7CisKKyAgICAgICpvcyA8PCAiIyIgPDwgaW5kaWNlc1tpXTsKKyAgICB9CisgICAgKm9zIDw8ICIpICI7CisgIH0KKworICBjb25zdCBNb25vbW9ycGhpY0lubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFyZ3NNYXRjaGVySW1wbCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW5uZXJNYXRjaGVyJGZvciBpIFtbLCBpbnQgayRpID0gLTFdXT4KK2NsYXNzIEFyZ3NNYXRjaGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEFyZ3NNYXRjaGVyKGNvbnN0IElubmVyTWF0Y2hlciYgaW5uZXJfbWF0Y2hlcikKKyAgICAgIDogaW5uZXJfbWF0Y2hlcl8oaW5uZXJfbWF0Y2hlcikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnc1R1cGxlPgorICBvcGVyYXRvciBNYXRjaGVyPEFyZ3NUdXBsZT4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBBcmdzTWF0Y2hlckltcGw8QXJnc1R1cGxlLCAka3M+KGlubmVyX21hdGNoZXJfKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFyZ3NNYXRjaGVyKTsKK307CisKKy8vIEEgc2V0IG9mIG1ldGFmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IHR5cGUgb2YgQWxsT2YuCisvLyBBbGxPZihtMSwgLi4uLCBtTikgcmV0dXJucworLy8gQWxsT2ZSZXN1bHROPGRlY2x0eXBlKG0xKSwgLi4uLCBkZWNsdHlwZShtTik+Ojp0eXBlLgorCisvLyBBbHRob3VnaCBBbGxPZiBpc24ndCBkZWZpbmVkIGZvciBvbmUgYXJndW1lbnQsIEFsbE9mUmVzdWx0MSBpcyBkZWZpbmVkCisvLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+CitzdHJ1Y3QgQWxsT2ZSZXN1bHQxIHsKKyAgdHlwZWRlZiBNMSB0eXBlOworfTsKKworJHJhbmdlIGkgMS4ubgorCiskcmFuZ2UgaSAyLi5uCiskZm9yIGkgW1sKKyRyYW5nZSBqIDIuLmkKKyR2YXIgbSA9IGkvMgorJHJhbmdlIGsgMS4ubQorJHJhbmdlIHQgbSsxLi5pCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNMSRmb3IgaiBbWywgdHlwZW5hbWUgTSRqXV0+CitzdHJ1Y3QgQWxsT2ZSZXN1bHQkaSB7CisgIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKKyAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0JG08JGZvciBrLCBbW00ka11dPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0JChpLW0pPCRmb3IgdCwgW1tNJHRdXT46OnR5cGUKKyAgPiB0eXBlOworfTsKKworXV0KKworLy8gQSBzZXQgb2YgbWV0YWZ1bmN0aW9ucyBmb3IgY29tcHV0aW5nIHRoZSByZXN1bHQgdHlwZSBvZiBBbnlPZi4KKy8vIEFueU9mKG0xLCAuLi4sIG1OKSByZXR1cm5zCisvLyBBbnlPZlJlc3VsdE48ZGVjbHR5cGUobTEpLCAuLi4sIGRlY2x0eXBlKG1OKT46OnR5cGUuCisKKy8vIEFsdGhvdWdoIEFueU9mIGlzbid0IGRlZmluZWQgZm9yIG9uZSBhcmd1bWVudCwgQW55T2ZSZXN1bHQxIGlzIGRlZmluZWQKKy8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNMT4KK3N0cnVjdCBBbnlPZlJlc3VsdDEgeworICB0eXBlZGVmIE0xIHR5cGU7Cit9OworCiskcmFuZ2UgaSAxLi5uCisKKyRyYW5nZSBpIDIuLm4KKyRmb3IgaSBbWworJHJhbmdlIGogMi4uaQorJHZhciBtID0gaS8yCiskcmFuZ2UgayAxLi5tCiskcmFuZ2UgdCBtKzEuLmkKKwordGVtcGxhdGUgPHR5cGVuYW1lIE0xJGZvciBqIFtbLCB0eXBlbmFtZSBNJGpdXT4KK3N0cnVjdCBBbnlPZlJlc3VsdCRpIHsKKyAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8CisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdCRtPCRmb3IgaywgW1tNJGtdXT46OnR5cGUsCisgICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdCQoaS1tKTwkZm9yIHQsIFtbTSR0XV0+Ojp0eXBlCisgID4gdHlwZTsKK307CisKK11dCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYV9tYXRjaGVyKSBtYXRjaGVzIGEgdHVwbGUgaWYgdGhlIHNlbGVjdGVkCisvLyBmaWVsZHMgb2YgaXQgbWF0Y2hlcyBhX21hdGNoZXIuICBDKysgZG9lc24ndCBzdXBwb3J0IGRlZmF1bHQKKy8vIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0LgorCiskcmFuZ2UgaSAwLi5uCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKK3RlbXBsYXRlIDwkZm9yIGogW1tpbnQgayRqLCBdXXR5cGVuYW1lIElubmVyTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyJGZvciBqIFtbLCBrJGpdXT4KK0FyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyJGZvciBqIFtbLCBrJGpdXT4obWF0Y2hlcik7Cit9CisKKworXV0KKy8vIEVsZW1lbnRzQXJlKGVfMSwgZV8yLCAuLi4gZV9uKSBtYXRjaGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgd2l0aAorLy8gbiBlbGVtZW50cywgd2hlcmUgdGhlIGktdGggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyIG11c3QKKy8vIG1hdGNoIHRoZSBpLXRoIGFyZ3VtZW50IGluIHRoZSBsaXN0LiAgRWFjaCBhcmd1bWVudCBvZgorLy8gRWxlbWVudHNBcmUoKSBjYW4gYmUgZWl0aGVyIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAgV2Ugc3VwcG9ydCB1cCB0bworLy8gJG4gYXJndW1lbnRzLgorLy8KKy8vIFRoZSB1c2Ugb2YgRGVjYXlBcnJheSBpbiB0aGUgaW1wbGVtZW50YXRpb24gYWxsb3dzIEVsZW1lbnRzQXJlKCkKKy8vIHRvIGFjY2VwdCBzdHJpbmcgbGl0ZXJhbHMsIHdob3NlIHR5cGUgaXMgY29uc3QgY2hhcltOXSwgYnV0IHdlCisvLyB3YW50IHRvIHRyZWF0IHRoZW0gYXMgY29uc3QgY2hhciouCisvLworLy8gTk9URTogU2luY2UgRWxlbWVudHNBcmUoKSBjYXJlcyBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLCBpdAorLy8gbXVzdCBub3QgYmUgdXNlZCB3aXRoIGNvbnRhaW5lcnMgd2hvc2UgZWxlbWVudHMncyBvcmRlciBpcworLy8gdW5kZWZpbmVkIChlLmcuIGhhc2hfbWFwKS4KKworJHJhbmdlIGkgMC4ubgorJGZvciBpIFtbCisKKyRyYW5nZSBqIDEuLmkKKworJGlmIGk+MCBbWworCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgorXV0KKworaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8CisgICAgOjp0ZXN0aW5nOjp0dXBsZTwKKyRmb3IgaiwgW1sKKworICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUJGpbW11dPjo6dHlwZV1dPiA+CitFbGVtZW50c0FyZSgkZm9yIGosIFtbY29uc3QgVCRqJiBlJGpdXSkgeworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8CiskZm9yIGosIFtbCisKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQkaltbXV0+Ojp0eXBlXV0+IEFyZ3M7CisgIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoJGZvciBqLCBbW2Ukal1dKSk7Cit9CisKK11dCisKKy8vIFVub3JkZXJlZEVsZW1lbnRzQXJlKGVfMSwgZV8yLCAuLi4sIGVfbikgaXMgYW4gRWxlbWVudHNBcmUgZXh0ZW5zaW9uCisvLyB0aGF0IG1hdGNoZXMgbiBlbGVtZW50cyBpbiBhbnkgb3JkZXIuICBXZSBzdXBwb3J0IHVwIHRvIG49JG4gYXJndW1lbnRzLgorCiskcmFuZ2UgaSAwLi5uCiskZm9yIGkgW1sKKworJHJhbmdlIGogMS4uaQorCiskaWYgaT4wIFtbCisKK3RlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+CitdXQorCitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKKyAgICA6OnRlc3Rpbmc6OnR1cGxlPAorJGZvciBqLCBbWworCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQkaltbXV0+Ojp0eXBlXV0+ID4KK1Vub3JkZXJlZEVsZW1lbnRzQXJlKCRmb3IgaiwgW1tjb25zdCBUJGomIGUkal1dKSB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKKyRmb3IgaiwgW1sKKworICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VCRqW1tdXT46OnR5cGVdXT4gQXJnczsKKyAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygkZm9yIGosIFtbZSRqXV0pKTsKK30KKworXV0KKworLy8gQWxsT2YobTEsIG0yLCAuLi4sIG1rKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYWxsIG9mIHRoZSBnaXZlbgorLy8gc3ViLW1hdGNoZXJzLiAgQWxsT2YgaXMgY2FsbGVkIGZ1bGx5IHF1YWxpZmllZCB0byBwcmV2ZW50IEFETCBmcm9tIGZpcmluZy4KKworJHJhbmdlIGkgMi4ubgorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCiskdmFyIG0gPSBpLzIKKyRyYW5nZSBrIDEuLm0KKyRyYW5nZSB0IG0rMS4uaQorCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIE0kal1dPgoraW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdCRpPCRmb3IgaiwgW1tNJGpdXT46OnR5cGUKK0FsbE9mKCRmb3IgaiwgW1tNJGogbSRqXV0pIHsKKyAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdCRpPCRmb3IgaiwgW1tNJGpdXT46OnR5cGUoCisgICAgICAkaWYgbSA9PSAxIFtbbTFdXSAkZWxzZSBbWzo6dGVzdGluZzo6QWxsT2YoJGZvciBrLCBbW20ka11dKV1dLAorICAgICAgJGlmIG0rMSA9PSBpIFtbbSRpXV0gJGVsc2UgW1s6OnRlc3Rpbmc6OkFsbE9mKCRmb3IgdCwgW1ttJHRdXSldXSk7Cit9CisKK11dCisKKy8vIEFueU9mKG0xLCBtMiwgLi4uLCBtaykgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4KKy8vIHN1Yi1tYXRjaGVycy4gIEFueU9mIGlzIGNhbGxlZCBmdWxseSBxdWFsaWZpZWQgdG8gcHJldmVudCBBREwgZnJvbSBmaXJpbmcuCisKKyRyYW5nZSBpIDIuLm4KKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHZhciBtID0gaS8yCiskcmFuZ2UgayAxLi5tCiskcmFuZ2UgdCBtKzEuLmkKKwordGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBNJGpdXT4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQkaTwkZm9yIGosIFtbTSRqXV0+Ojp0eXBlCitBbnlPZigkZm9yIGosIFtbTSRqIG0kal1dKSB7CisgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQkaTwkZm9yIGosIFtbTSRqXV0+Ojp0eXBlKAorICAgICAgJGlmIG0gPT0gMSBbW20xXV0gJGVsc2UgW1s6OnRlc3Rpbmc6OkFueU9mKCRmb3IgaywgW1ttJGtdXSldXSwKKyAgICAgICRpZiBtKzEgPT0gaSBbW20kaV1dICRlbHNlIFtbOjp0ZXN0aW5nOjpBbnlPZigkZm9yIHQsIFtbbSR0XV0pXV0pOworfQorCitdXQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworJCQgfSAvLyBUaGlzIFB1bXAgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gRW1hY3MuIEl0IHdpbGwgbm90CiskJCAgIC8vIHNob3cgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgorCisKKy8vIFRoZSBNQVRDSEVSKiBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlIHRvCisvLyBkZWZpbmUgY3VzdG9tIG1hdGNoZXJzIGVhc2lseS4KKy8vCisvLyBCYXNpYyBVc2FnZQorLy8gPT09PT09PT09PT0KKy8vCisvLyBUaGUgc3ludGF4CisvLworLy8gICBNQVRDSEVSKG5hbWUsIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9CisvLworLy8gZGVmaW5lcyBhIG1hdGNoZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0aGF0IGV4ZWN1dGVzIHRoZSBzdGF0ZW1lbnRzLAorLy8gd2hpY2ggbXVzdCByZXR1cm4gYSBib29sIHRvIGluZGljYXRlIGlmIHRoZSBtYXRjaCBzdWNjZWVkcy4gIEluc2lkZQorLy8gdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYnkgJ2FyZycsCisvLyBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ190eXBlJy4KKy8vCisvLyBUaGUgZGVzY3JpcHRpb24gc3RyaW5nIGRvY3VtZW50cyB3aGF0IHRoZSBtYXRjaGVyIGRvZXMsIGFuZCBpcyB1c2VkCisvLyB0byBnZW5lcmF0ZSB0aGUgZmFpbHVyZSBtZXNzYWdlIHdoZW4gdGhlIG1hdGNoIGZhaWxzLiAgU2luY2UgYQorLy8gTUFUQ0hFUigpIGlzIHVzdWFsbHkgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIHNoYXJlZCBieSBtdWx0aXBsZQorLy8gQysrIHNvdXJjZSBmaWxlcywgd2UgcmVxdWlyZSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgYSBDLXN0cmluZworLy8gbGl0ZXJhbCB0byBhdm9pZCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMuICBJdCBjYW4gYmUgZW1wdHksIGluIHdoaWNoCisvLyBjYXNlIHdlJ2xsIHVzZSB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBhcyB0aGUKKy8vIGRlc2NyaXB0aW9uLgorLy8KKy8vIEZvciBleGFtcGxlOgorLy8KKy8vICAgTUFUQ0hFUihJc0V2ZW4sICIiKSB7IHJldHVybiAoYXJnICUgMikgPT0gMDsgfQorLy8KKy8vIGFsbG93cyB5b3UgdG8gd3JpdGUKKy8vCisvLyAgIC8vIEV4cGVjdHMgbW9ja19mb28uQmFyKG4pIHRvIGJlIGNhbGxlZCB3aGVyZSBuIGlzIGV2ZW4uCisvLyAgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBCYXIoSXNFdmVuKCkpKTsKKy8vCisvLyBvciwKKy8vCisvLyAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHZhbHVlIG9mIHNvbWVfZXhwcmVzc2lvbiBpcyBldmVuLgorLy8gICBFWFBFQ1RfVEhBVChzb21lX2V4cHJlc3Npb24sIElzRXZlbigpKTsKKy8vCisvLyBJZiB0aGUgYWJvdmUgYXNzZXJ0aW9uIGZhaWxzLCBpdCB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlOgorLy8KKy8vICAgVmFsdWUgb2Y6IHNvbWVfZXhwcmVzc2lvbgorLy8gICBFeHBlY3RlZDogaXMgZXZlbgorLy8gICAgIEFjdHVhbDogNworLy8KKy8vIHdoZXJlIHRoZSBkZXNjcmlwdGlvbiAiaXMgZXZlbiIgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlCisvLyBtYXRjaGVyIG5hbWUgSXNFdmVuLgorLy8KKy8vIEFyZ3VtZW50IFR5cGUKKy8vID09PT09PT09PT09PT0KKy8vCisvLyBOb3RlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgKGFyZ190eXBlKSBpcworLy8gZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB5b3UgdXNlIHRoZSBtYXRjaGVyIGFuZCBpcworLy8gc3VwcGxpZWQgdG8geW91IGJ5IHRoZSBjb21waWxlciwgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQKKy8vIGRlY2xhcmluZyBpdCAobm9yIGNhbiB5b3UpLiAgVGhpcyBhbGxvd3MgdGhlIG1hdGNoZXIgdG8gYmUKKy8vIHBvbHltb3JwaGljLiAgRm9yIGV4YW1wbGUsIElzRXZlbigpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFueSB0eXBlCisvLyB3aGVyZSB0aGUgdmFsdWUgb2YgIihhcmcgJSAyKSA9PSAwIiBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8KKy8vIGEgYm9vbC4gIEluIHRoZSAiQmFyKElzRXZlbigpKSIgZXhhbXBsZSBhYm92ZSwgaWYgbWV0aG9kIEJhcigpCisvLyB0YWtlcyBhbiBpbnQsICdhcmdfdHlwZScgd2lsbCBiZSBpbnQ7IGlmIGl0IHRha2VzIGFuIHVuc2lnbmVkIGxvbmcsCisvLyAnYXJnX3R5cGUnIHdpbGwgYmUgdW5zaWduZWQgbG9uZzsgYW5kIHNvIG9uLgorLy8KKy8vIFBhcmFtZXRlcml6aW5nIE1hdGNoZXJzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFNvbWV0aW1lcyB5b3UnbGwgd2FudCB0byBwYXJhbWV0ZXJpemUgdGhlIG1hdGNoZXIuICBGb3IgdGhhdCB5b3UKKy8vIGNhbiB1c2UgYW5vdGhlciBtYWNybzoKKy8vCisvLyAgIE1BVENIRVJfUChuYW1lLCBwYXJhbV9uYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQorLy8KKy8vIEZvciBleGFtcGxlOgorLy8KKy8vICAgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlLCAiIikgeyByZXR1cm4gYWJzKGFyZykgPT0gdmFsdWU7IH0KKy8vCisvLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKKy8vCisvLyAgIEVYUEVDVF9USEFUKEJsYWgoImEiKSwgSGFzQWJzb2x1dGVWYWx1ZShuKSk7CisvLworLy8gd2hpY2ggbWF5IGxlYWQgdG8gdGhpcyBtZXNzYWdlIChhc3N1bWluZyBuIGlzIDEwKToKKy8vCisvLyAgIFZhbHVlIG9mOiBCbGFoKCJhIikKKy8vICAgRXhwZWN0ZWQ6IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxMAorLy8gICAgIEFjdHVhbDogLTkKKy8vCisvLyBOb3RlIHRoYXQgYm90aCB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBhcmUKKy8vIHByaW50ZWQsIG1ha2luZyB0aGUgbWVzc2FnZSBodW1hbi1mcmllbmRseS4KKy8vCisvLyBJbiB0aGUgbWF0Y2hlciBkZWZpbml0aW9uIGJvZHksIHlvdSBjYW4gd3JpdGUgJ2Zvb190eXBlJyB0bworLy8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkICdmb28nLiAgRm9yIGV4YW1wbGUsIGluIHRoZQorLy8gYm9keSBvZiBNQVRDSEVSX1AoSGFzQWJzb2x1dGVWYWx1ZSwgdmFsdWUpIGFib3ZlLCB5b3UgY2FuIHdyaXRlCisvLyAndmFsdWVfdHlwZScgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgJ3ZhbHVlJy4KKy8vCisvLyBXZSBhbHNvIHByb3ZpZGUgTUFUQ0hFUl9QMiwgTUFUQ0hFUl9QMywgLi4uLCB1cCB0byBNQVRDSEVSX1AkbiB0bworLy8gc3VwcG9ydCBtdWx0aS1wYXJhbWV0ZXIgbWF0Y2hlcnMuCisvLworLy8gRGVzY3JpYmluZyBQYXJhbWV0ZXJpemVkIE1hdGNoZXJzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGUgbGFzdCBhcmd1bWVudCB0byBNQVRDSEVSKigpIGlzIGEgc3RyaW5nLXR5cGVkIGV4cHJlc3Npb24uICBUaGUKKy8vIGV4cHJlc3Npb24gY2FuIHJlZmVyZW5jZSBhbGwgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzIGFuZCBhCisvLyBzcGVjaWFsIGJvb2wtdHlwZWQgdmFyaWFibGUgbmFtZWQgJ25lZ2F0aW9uJy4gIFdoZW4gJ25lZ2F0aW9uJyBpcworLy8gZmFsc2UsIHRoZSBleHByZXNzaW9uIHNob3VsZCBldmFsdWF0ZSB0byB0aGUgbWF0Y2hlcidzIGRlc2NyaXB0aW9uOworLy8gb3RoZXJ3aXNlIGl0IHNob3VsZCBldmFsdWF0ZSB0byB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG5lZ2F0aW9uIG9mCisvLyB0aGUgbWF0Y2hlci4gIEZvciBleGFtcGxlLAorLy8KKy8vICAgdXNpbmcgdGVzdGluZzo6UHJpbnRUb1N0cmluZzsKKy8vCisvLyAgIE1BVENIRVJfUDIoSW5DbG9zZWRSYW5nZSwgbG93LCBoaSwKKy8vICAgICAgIHN0cmluZyhuZWdhdGlvbiA/ICJpcyBub3QiIDogImlzIikgKyAiIGluIHJhbmdlIFsiICsKKy8vICAgICAgIFByaW50VG9TdHJpbmcobG93KSArICIsICIgKyBQcmludFRvU3RyaW5nKGhpKSArICJdIikgeworLy8gICAgIHJldHVybiBsb3cgPD0gYXJnICYmIGFyZyA8PSBoaTsKKy8vICAgfQorLy8gICAuLi4KKy8vICAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7CisvLyAgIEVYUEVDVF9USEFUKDMsIE5vdChJbkNsb3NlZFJhbmdlKDIsIDQpKSk7CisvLworLy8gd291bGQgZ2VuZXJhdGUgdHdvIGZhaWx1cmVzIHRoYXQgY29udGFpbiB0aGUgdGV4dDoKKy8vCisvLyAgIEV4cGVjdGVkOiBpcyBpbiByYW5nZSBbNCwgNl0KKy8vICAgLi4uCisvLyAgIEV4cGVjdGVkOiBpcyBub3QgaW4gcmFuZ2UgWzIsIDRdCisvLworLy8gSWYgeW91IHNwZWNpZnkgIiIgYXMgdGhlIGRlc2NyaXB0aW9uLCB0aGUgZmFpbHVyZSBtZXNzYWdlIHdpbGwKKy8vIGNvbnRhaW4gdGhlIHNlcXVlbmNlIG9mIHdvcmRzIGluIHRoZSBtYXRjaGVyIG5hbWUgZm9sbG93ZWQgYnkgdGhlCisvLyBwYXJhbWV0ZXIgdmFsdWVzIHByaW50ZWQgYXMgYSB0dXBsZS4gIEZvciBleGFtcGxlLAorLy8KKy8vICAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLCAiIikgeyAuLi4gfQorLy8gICAuLi4KKy8vICAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7CisvLyAgIEVYUEVDVF9USEFUKDMsIE5vdChJbkNsb3NlZFJhbmdlKDIsIDQpKSk7CisvLworLy8gd291bGQgZ2VuZXJhdGUgdHdvIGZhaWx1cmVzIHRoYXQgY29udGFpbiB0aGUgdGV4dDoKKy8vCisvLyAgIEV4cGVjdGVkOiBpbiBjbG9zZWQgcmFuZ2UgKDQsIDYpCisvLyAgIC4uLgorLy8gICBFeHBlY3RlZDogbm90IChpbiBjbG9zZWQgcmFuZ2UgKDIsIDQpKQorLy8KKy8vIFR5cGVzIG9mIE1hdGNoZXIgUGFyYW1ldGVycworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3CisvLworLy8gICBNQVRDSEVSX1BrKEZvbywgcDEsIC4uLiwgcGssIGRlc2NyaXB0aW9uX3N0cmluZykgeyAuLi4gfQorLy8KKy8vIGFzIHNob3J0aGFuZCBmb3IKKy8vCisvLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+CisvLyAgIEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+CisvLyAgIEZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0KKy8vCisvLyBXaGVuIHlvdSB3cml0ZSBGb28odjEsIC4uLiwgdmspLCB0aGUgY29tcGlsZXIgaW5mZXJzIHRoZSB0eXBlcyBvZgorLy8gdGhlIHBhcmFtZXRlcnMgdjEsIC4uLiwgYW5kIHZrIGZvciB5b3UuICBJZiB5b3UgYXJlIG5vdCBoYXBweSB3aXRoCisvLyB0aGUgcmVzdWx0IG9mIHRoZSB0eXBlIGluZmVyZW5jZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSB0eXBlcyBieQorLy8gZXhwbGljaXRseSBpbnN0YW50aWF0aW5nIHRoZSB0ZW1wbGF0ZSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsCisvLyBmYWxzZSkuICBBcyBzYWlkIGVhcmxpZXIsIHlvdSBkb24ndCBnZXQgdG8gKG9yIG5lZWQgdG8pIHNwZWNpZnkKKy8vICdhcmdfdHlwZScgYXMgdGhhdCdzIGRldGVybWluZWQgYnkgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIG1hdGNoZXIKKy8vIGlzIHVzZWQuICBZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24gRm9vKHAxLCAuLi4sIHBrKQorLy8gdG8gYSB2YXJpYWJsZSBvZiB0eXBlIEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+LiAgVGhpcworLy8gY2FuIGJlIHVzZWZ1bCB3aGVuIGNvbXBvc2luZyBtYXRjaGVycy4KKy8vCisvLyBXaGlsZSB5b3UgY2FuIGluc3RhbnRpYXRlIGEgbWF0Y2hlciB0ZW1wbGF0ZSB3aXRoIHJlZmVyZW5jZSB0eXBlcywKKy8vIHBhc3NpbmcgdGhlIHBhcmFtZXRlcnMgYnkgcG9pbnRlciB1c3VhbGx5IG1ha2VzIHlvdXIgY29kZSBtb3JlCisvLyByZWFkYWJsZS4gIElmLCBob3dldmVyLCB5b3Ugc3RpbGwgd2FudCB0byBwYXNzIGEgcGFyYW1ldGVyIGJ5CisvLyByZWZlcmVuY2UsIGJlIGF3YXJlIHRoYXQgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlCisvLyBtYXRjaGVyIHlvdSB3aWxsIHNlZSB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGJ1dCBub3QgaXRzCisvLyBhZGRyZXNzLgorLy8KKy8vIEV4cGxhaW5pbmcgTWF0Y2ggUmVzdWx0cworLy8gPT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gU29tZXRpbWVzIHRoZSBtYXRjaGVyIGRlc2NyaXB0aW9uIGFsb25lIGlzbid0IGVub3VnaCB0byBleHBsYWluIHdoeQorLy8gdGhlIG1hdGNoIGhhcyBmYWlsZWQgb3Igc3VjY2VlZGVkLiAgRm9yIGV4YW1wbGUsIHdoZW4gZXhwZWN0aW5nIGEKKy8vIGxvbmcgc3RyaW5nLCBpdCBjYW4gYmUgdmVyeSBoZWxwZnVsIHRvIGFsc28gcHJpbnQgdGhlIGRpZmYgYmV0d2VlbgorLy8gdGhlIGV4cGVjdGVkIHN0cmluZyBhbmQgdGhlIGFjdHVhbCBvbmUuICBUbyBhY2hpZXZlIHRoYXQsIHlvdSBjYW4KKy8vIG9wdGlvbmFsbHkgc3RyZWFtIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYSBzcGVjaWFsIHZhcmlhYmxlCisvLyBuYW1lZCByZXN1bHRfbGlzdGVuZXIsIHdob3NlIHR5cGUgaXMgYSBwb2ludGVyIHRvIGNsYXNzCisvLyBNYXRjaFJlc3VsdExpc3RlbmVyOgorLy8KKy8vICAgTUFUQ0hFUl9QKEVxdWFsc0xvbmdTdHJpbmcsIHN0ciwgIiIpIHsKKy8vICAgICBpZiAoYXJnID09IHN0cikgcmV0dXJuIHRydWU7CisvLworLy8gICAgICpyZXN1bHRfbGlzdGVuZXIgPDwgInRoZSBkaWZmZXJlbmNlOiAiCisvLy8gICAgICAgICAgICAgICAgICAgICA8PCBEaWZmU3RyaW5ncyhzdHIsIGFyZyk7CisvLyAgICAgcmV0dXJuIGZhbHNlOworLy8gICB9CisvLworLy8gT3ZlcmxvYWRpbmcgTWF0Y2hlcnMKKy8vID09PT09PT09PT09PT09PT09PT09CisvLworLy8gWW91IGNhbiBvdmVybG9hZCBtYXRjaGVycyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6CisvLworLy8gICBNQVRDSEVSX1AoQmxhaCwgYSwgZGVzY3JpcHRpb25fc3RyaW5nMSkgeyAuLi4gfQorLy8gICBNQVRDSEVSX1AyKEJsYWgsIGEsIGIsIGRlc2NyaXB0aW9uX3N0cmluZzIpIHsgLi4uIH0KKy8vCisvLyBDYXZlYXRzCisvLyA9PT09PT09CisvLworLy8gV2hlbiBkZWZpbmluZyBhIG5ldyBtYXRjaGVyLCB5b3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgaW1wbGVtZW50aW5nCisvLyBNYXRjaGVySW50ZXJmYWNlIG9yIHVzaW5nIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKS4gIFRoZXNlCisvLyBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrIHRoYW4gdGhlIE1BVENIRVIqIG1hY3JvcywgYnV0IGFsc28KKy8vIGdpdmUgeW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYW5kCisvLyB0aGUgbWF0Y2hlciBwYXJhbWV0ZXJzLCB3aGljaCBtYXkgbGVhZHMgdG8gYmV0dGVyIGNvbXBpbGVyIGVycm9yCisvLyBtZXNzYWdlcyB3aGVuIHRoZSBtYXRjaGVyIGlzIHVzZWQgd3JvbmcuICBUaGV5IGFsc28gYWxsb3cKKy8vIG92ZXJsb2FkaW5nIG1hdGNoZXJzIGJhc2VkIG9uIHBhcmFtZXRlciB0eXBlcyAoYXMgb3Bwb3NlZCB0byBqdXN0CisvLyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMpLgorLy8KKy8vIE1BVENIRVIqKCkgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZS4gIFRoZSByZWFzb24gaXMKKy8vIHRoYXQgQysrIGRvZXNuJ3QgeWV0IGFsbG93IGZ1bmN0aW9uLWxvY2FsIHR5cGVzIHRvIGJlIHVzZWQgdG8KKy8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcy4gIFRoZSB1cC1jb21pbmcgQysrMHggc3RhbmRhcmQgd2lsbCBmaXggdGhpcy4KKy8vIE9uY2UgdGhhdCdzIGRvbmUsIHdlJ2xsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdXNpbmcgTUFUQ0hFUiooKSBpbnNpZGUKKy8vIGEgZnVuY3Rpb24uCisvLworLy8gTW9yZSBJbmZvcm1hdGlvbgorLy8gPT09PT09PT09PT09PT09PQorLy8KKy8vIFRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgdGhlc2UgbWFjcm9zLCBwbGVhc2Ugc2VhcmNoIGZvciAnTUFUQ0hFUicKKy8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suCisKKyRyYW5nZSBpIDAuLm4KKyRmb3IgaQorCitbWworJHZhciBtYWNyb19uYW1lID0gW1skaWYgaT09MCBbW01BVENIRVJdXSAkZWxpZiBpPT0xIFtbTUFUQ0hFUl9QXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgW1tNQVRDSEVSX1AkaV1dXV0KKyR2YXIgY2xhc3NfbmFtZSA9IFtbbmFtZSMjTWF0Y2hlcltbJGlmIGk9PTAgW1tdXSAkZWxpZiBpPT0xIFtbUF1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgW1tQJGldXV1dXV0KKyRyYW5nZSBqIDAuLmktMQorJHZhciB0ZW1wbGF0ZSA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWworCisgIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgcCRqIyNfdHlwZV1dPlwKK11dXV0KKyR2YXIgY3Rvcl9wYXJhbV9saXN0ID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBnbW9ja19wJGpdXV1dCiskdmFyIGltcGxfY3Rvcl9wYXJhbV9saXN0ID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBnbW9ja19wJGpdXV1dCiskdmFyIGltcGxfaW5pdHMgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sgOiAkZm9yIGosIFtbcCRqKGdtb2NrX3AkaildXV1dXV0KKyR2YXIgaW5pdHMgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sgOiAkZm9yIGosIFtbcCRqKGdtb2NrX3AkaildXV1dXV0KKyR2YXIgcGFyYW1zID0gW1skZm9yIGosIFtbcCRqXV1dXQorJHZhciBwYXJhbV90eXBlcyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWzwkZm9yIGosIFtbcCRqIyNfdHlwZV1dPl1dXV0KKyR2YXIgcGFyYW1fdHlwZXNfYW5kX25hbWVzID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBwJGpdXV1dCiskdmFyIHBhcmFtX2ZpZWxkX2RlY2xzID0gW1skZm9yIGoKK1tbCisKKyAgICAgIHAkaiMjX3R5cGUgcCRqO1wKK11dXV0KKyR2YXIgcGFyYW1fZmllbGRfZGVjbHMyID0gW1skZm9yIGoKK1tbCisKKyAgICBwJGojI190eXBlIHAkajtcCitdXV1dCisKKyNkZWZpbmUgJG1hY3JvX25hbWUobmFtZSRmb3IgaiBbWywgcCRqXV0sIGRlc2NyaXB0aW9uKVwkdGVtcGxhdGUKKyAgY2xhc3MgJGNsYXNzX25hbWUge1wKKyAgIHB1YmxpYzpcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKKyAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKKyAgICAgcHVibGljOlwKKyAgICAgIFtbJGlmIGk9PTEgW1tleHBsaWNpdCBdXV1dZ21vY2tfSW1wbCgkaW1wbF9jdG9yX3BhcmFtX2xpc3QpXAorICAgICAgICAgICRpbXBsX2luaXRzIHt9XAorICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCisgICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAorICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAorICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKKyAgICAgIH1cCisgICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKKyAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKKyAgICAgIH1cJHBhcmFtX2ZpZWxkX2RlY2xzCisgICAgIHByaXZhdGU6XAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCisgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAorICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAorICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAorICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCisgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAorICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8JGZvciBqLCBbW3AkaiMjX3R5cGVdXT4oJGZvciBqLCBbW3Akal1dKSkpO1wKKyAgICAgIH1cCisgICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKKyAgICB9O1wKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAorICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAorICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPigkcGFyYW1zKSk7XAorICAgIH1cCisgICAgW1skaWYgaT09MSBbW2V4cGxpY2l0IF1dXV0kY2xhc3NfbmFtZSgkY3Rvcl9wYXJhbV9saXN0KSRpbml0cyB7XAorICAgIH1cJHBhcmFtX2ZpZWxkX2RlY2xzMgorICAgcHJpdmF0ZTpcCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXygkY2xhc3NfbmFtZSk7XAorICB9O1wkdGVtcGxhdGUKKyAgaW5saW5lICRjbGFzc19uYW1lJHBhcmFtX3R5cGVzIG5hbWUoJHBhcmFtX3R5cGVzX2FuZF9uYW1lcykge1wKKyAgICByZXR1cm4gJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMoJHBhcmFtcyk7XAorICB9XCR0ZW1wbGF0ZQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAorICBib29sICRjbGFzc19uYW1lJHBhcmFtX3R5cGVzOjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKKyAgICAgIGFyZ190eXBlIGFyZywgXAorICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAorICAgICAgICAgIGNvbnN0CitdXQorCisKKyNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTUFUQ0hFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5NWY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oCkBAIC0wLDAgKzEsMzk3IEBACisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBJbXBsZW1lbnRzIGNsYXNzIHRlbXBsYXRlcyBOaWNlTW9jaywgTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jay4KKy8vCisvLyBHaXZlbiBhIG1vY2sgY2xhc3MgTW9ja0ZvbyB0aGF0IGlzIGNyZWF0ZWQgdXNpbmcgR29vZ2xlIE1vY2ssCisvLyBOaWNlTW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCBhbGxvd3MKKy8vIHVuaW50ZXJlc3RpbmcgY2FsbHMgKGkuZS4gY2FsbHMgdG8gbW9jayBtZXRob2RzIHRoYXQgaGF2ZSBubworLy8gRVhQRUNUX0NBTEwgc3BlY3MpLCBOYWdneU1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vCisvLyB0aGF0IHByaW50cyBhIHdhcm5pbmcgd2hlbiBhbiB1bmludGVyZXN0aW5nIGNhbGwgb2NjdXJzLCBhbmQKKy8vIFN0cmljdE1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vIHRoYXQgdHJlYXRzIGFsbAorLy8gdW5pbnRlcmVzdGluZyBjYWxscyBhcyBlcnJvcnMuCisvLworLy8gQ3VycmVudGx5IGEgbW9jayBpcyBuYWdneSBieSBkZWZhdWx0LCBzbyBNb2NrRm9vIGFuZAorLy8gTmFnZ3lNb2NrPE1vY2tGb28+IGJlaGF2ZSBsaWtlIHRoZSBzYW1lLiAgSG93ZXZlciwgd2Ugd2lsbCBzb29uCisvLyBzd2l0Y2ggdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgbW9ja3MgdG8gYmUgbmljZSwgYXMgdGhhdCBpbiBnZW5lcmFsCisvLyBsZWFkcyB0byBtb3JlIG1haW50YWluYWJsZSB0ZXN0cy4gIFdoZW4gdGhhdCBoYXBwZW5zLCBNb2NrRm9vIHdpbGwKKy8vIHN0b3AgYmVoYXZpbmcgbGlrZSBOYWdneU1vY2s8TW9ja0Zvbz4gYW5kIHN0YXJ0IGJlaGF2aW5nIGxpa2UKKy8vIE5pY2VNb2NrPE1vY2tGb28+LgorLy8KKy8vIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrICJpbmhlcml0IiB0aGUgY29uc3RydWN0b3JzIG9mCisvLyB0aGVpciByZXNwZWN0aXZlIGJhc2UgY2xhc3MsIHdpdGggdXAtdG8gMTAgYXJndW1lbnRzLiAgVGhlcmVmb3JlCisvLyB5b3UgY2FuIHdyaXRlIE5pY2VNb2NrPE1vY2tGb28+KDUsICJhIikgdG8gY29uc3RydWN0IGEgbmljZSBtb2NrCisvLyB3aGVyZSBNb2NrRm9vIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyAoaW50LCBjb25zdCBjaGFyKiksCisvLyBmb3IgZXhhbXBsZS4KKy8vCisvLyBBIGtub3duIGxpbWl0YXRpb24gaXMgdGhhdCBOaWNlTW9jazxNb2NrRm9vPiwgTmFnZ3lNb2NrPE1vY2tGb28+LAorLy8gYW5kIFN0cmljdE1vY2s8TW9ja0Zvbz4gb25seSB3b3JrcyBmb3IgbW9jayBtZXRob2RzIGRlZmluZWQgdXNpbmcKKy8vIHRoZSBNT0NLX01FVEhPRCogZmFtaWx5IG9mIG1hY3JvcyBESVJFQ1RMWSBpbiB0aGUgTW9ja0ZvbyBjbGFzcy4KKy8vIElmIGEgbW9jayBtZXRob2QgaXMgZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3Mgb2YgTW9ja0ZvbywgdGhlICJuaWNlIgorLy8gb3IgInN0cmljdCIgbW9kaWZpZXIgbWF5IG5vdCBhZmZlY3QgaXQsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIuCisvLyBJbiBwYXJ0aWN1bGFyLCBuZXN0aW5nIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGlzIE5PVAorLy8gc3VwcG9ydGVkLgorLy8KKy8vIEFub3RoZXIga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIGJhc2UgbW9jaworLy8gY2Fubm90IGhhdmUgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3aGljaCBhcmUKKy8vIGJhbm5lZCBieSB0aGUgR29vZ2xlIEMrKyBzdHlsZSBndWlkZSBhbnl3YXkuCisKKyNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordGVtcGxhdGUgPGNsYXNzIE1vY2tDbGFzcz4KK2NsYXNzIE5pY2VNb2NrIDogcHVibGljIE1vY2tDbGFzcyB7CisgcHVibGljOgorICAvLyBXZSBkb24ndCBmYWN0b3Igb3V0IHRoZSBjb25zdHJ1Y3RvciBib2R5IHRvIGEgY29tbW9uIG1ldGhvZCwgYXMKKyAgLy8gd2UgaGF2ZSB0byBhdm9pZCBhIHBvc3NpYmxlIGNsYXNoIHdpdGggbWVtYmVycyBvZiBNb2NrQ2xhc3MuCisgIE5pY2VNb2NrKCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIC8vIEMrKyBkb2Vzbid0ICh5ZXQpIGFsbG93IGluaGVyaXRhbmNlIG9mIGNvbnN0cnVjdG9ycywgc28gd2UgaGF2ZQorICAvLyB0byBkZWZpbmUgaXQgZm9yIGVhY2ggYXJpdHkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMT4KKyAgZXhwbGljaXQgTmljZU1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgeworICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgorICBOaWNlTW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMikgOiBNb2NrQ2xhc3MoYTEsIGEyKSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+CisgIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+CisgIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsCisgICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KKyAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAorICAgICAgY29uc3QgQTUmIGE1KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgICAgdHlwZW5hbWUgQTY+CisgIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKKyAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KKyAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAorICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LAorICAgICAgYTYsIGE3KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+CisgIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKKyAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCkgOiBNb2NrQ2xhc3MoYTEsCisgICAgICBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCisgICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KKyAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAorICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAorICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+CisgIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKKyAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCwgY29uc3QgQTkmIGE5LAorICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIHZpcnR1YWwgfk5pY2VNb2NrKCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbigKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5pY2VNb2NrKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBNb2NrQ2xhc3M+CitjbGFzcyBOYWdneU1vY2sgOiBwdWJsaWMgTW9ja0NsYXNzIHsKKyBwdWJsaWM6CisgIC8vIFdlIGRvbid0IGZhY3RvciBvdXQgdGhlIGNvbnN0cnVjdG9yIGJvZHkgdG8gYSBjb21tb24gbWV0aG9kLCBhcworICAvLyB3ZSBoYXZlIHRvIGF2b2lkIGEgcG9zc2libGUgY2xhc2ggd2l0aCBtZW1iZXJzIG9mIE1vY2tDbGFzcy4KKyAgTmFnZ3lNb2NrKCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlCisgIC8vIHRvIGRlZmluZSBpdCBmb3IgZWFjaCBhcml0eS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPgorICBleHBsaWNpdCBOYWdneU1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgeworICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+CisgIE5hZ2d5TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMikgOiBNb2NrQ2xhc3MoYTEsIGEyKSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KKyAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KKyAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsCisgICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgorICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAorICAgICAgY29uc3QgQTUmIGE1KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCisgICAgICB0eXBlbmFtZSBBNj4KKyAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKKyAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgorICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAorICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LAorICAgICAgYTYsIGE3KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KKyAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKKyAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCkgOiBNb2NrQ2xhc3MoYTEsCisgICAgICBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgorICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAorICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAorICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KKyAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKKyAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCwgY29uc3QgQTkmIGE5LAorICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdmlydHVhbCB+TmFnZ3lNb2NrKCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbigKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5hZ2d5TW9jayk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgTW9ja0NsYXNzPgorY2xhc3MgU3RyaWN0TW9jayA6IHB1YmxpYyBNb2NrQ2xhc3MgeworIHB1YmxpYzoKKyAgLy8gV2UgZG9uJ3QgZmFjdG9yIG91dCB0aGUgY29uc3RydWN0b3IgYm9keSB0byBhIGNvbW1vbiBtZXRob2QsIGFzCisgIC8vIHdlIGhhdmUgdG8gYXZvaWQgYSBwb3NzaWJsZSBjbGFzaCB3aXRoIG1lbWJlcnMgb2YgTW9ja0NsYXNzLgorICBTdHJpY3RNb2NrKCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlCisgIC8vIHRvIGRlZmluZSBpdCBmb3IgZWFjaCBhcml0eS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPgorICBleHBsaWNpdCBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSkgOiBNb2NrQ2xhc3MoYTEpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgorICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKSA6IE1vY2tDbGFzcyhhMSwgYTIpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgorICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KKyAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLAorICAgICAgY29uc3QgQTQmIGE0KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCkgeworICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KKyAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCisgICAgICBjb25zdCBBNSYgYTUpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSkgeworICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICAgIHR5cGVuYW1lIEE2PgorICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKKyAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgorICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKKyAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwKKyAgICAgIGE2LCBhNykgeworICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+CisgIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAorICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4KSA6IE1vY2tDbGFzcyhhMSwKKyAgICAgIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+CisgIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAorICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAorICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KKyAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCisgICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsIGNvbnN0IEE5JiBhOSwKKyAgICAgIGNvbnN0IEExMCYgYTEwKSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIHZpcnR1YWwgflN0cmljdE1vY2soKSB7CisgICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKAorICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7CisgIH0KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyaWN0TW9jayk7Cit9OworCisvLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9ucyBjYXRjaCBzb21lIChyZWxhdGl2ZWx5IG1vcmUgY29tbW9uKQorLy8gdXNlciBlcnJvcnMgb2YgbmVzdGluZyBuaWNlIGFuZCBzdHJpY3QgbW9ja3MuICBUaGV5IGRvIE5PVCBjYXRjaAorLy8gYWxsIHBvc3NpYmxlIGVycm9ycy4KKworLy8gVGhlc2Ugc3BlY2lhbGl6YXRpb25zIGFyZSBkZWNsYXJlZCBidXQgbm90IGRlZmluZWQsIGFzIE5pY2VNb2NrLAorLy8gTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jayBjYW5ub3QgYmUgbmVzdGVkLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgorY2xhc3MgTmljZU1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwordGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KK2NsYXNzIE5pY2VNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgorY2xhc3MgTmljZU1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+CitjbGFzcyBOYWdneU1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwordGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KK2NsYXNzIE5hZ2d5TW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+OwordGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KK2NsYXNzIE5hZ2d5TW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KK2NsYXNzIFN0cmljdE1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwordGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KK2NsYXNzIFN0cmljdE1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+CitjbGFzcyBTdHJpY3RNb2NrPFN0cmljdE1vY2s8TW9ja0NsYXNzPiA+OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX05JQ0VfU1RSSUNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC5wdW1wIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWUxY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcApAQCAtMCwwICsxLDE2MSBAQAorJCQgLSotIG1vZGU6IGMrKzsgLSotCiskJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCiskJCBnbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC4KKyQkCiskdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4KKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEltcGxlbWVudHMgY2xhc3MgdGVtcGxhdGVzIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrLgorLy8KKy8vIEdpdmVuIGEgbW9jayBjbGFzcyBNb2NrRm9vIHRoYXQgaXMgY3JlYXRlZCB1c2luZyBHb29nbGUgTW9jaywKKy8vIE5pY2VNb2NrPE1vY2tGb28+IGlzIGEgc3ViY2xhc3Mgb2YgTW9ja0ZvbyB0aGF0IGFsbG93cworLy8gdW5pbnRlcmVzdGluZyBjYWxscyAoaS5lLiBjYWxscyB0byBtb2NrIG1ldGhvZHMgdGhhdCBoYXZlIG5vCisvLyBFWFBFQ1RfQ0FMTCBzcGVjcyksIE5hZ2d5TW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28KKy8vIHRoYXQgcHJpbnRzIGEgd2FybmluZyB3aGVuIGFuIHVuaW50ZXJlc3RpbmcgY2FsbCBvY2N1cnMsIGFuZAorLy8gU3RyaWN0TW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCB0cmVhdHMgYWxsCisvLyB1bmludGVyZXN0aW5nIGNhbGxzIGFzIGVycm9ycy4KKy8vCisvLyBDdXJyZW50bHkgYSBtb2NrIGlzIG5hZ2d5IGJ5IGRlZmF1bHQsIHNvIE1vY2tGb28gYW5kCisvLyBOYWdneU1vY2s8TW9ja0Zvbz4gYmVoYXZlIGxpa2UgdGhlIHNhbWUuICBIb3dldmVyLCB3ZSB3aWxsIHNvb24KKy8vIHN3aXRjaCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBtb2NrcyB0byBiZSBuaWNlLCBhcyB0aGF0IGluIGdlbmVyYWwKKy8vIGxlYWRzIHRvIG1vcmUgbWFpbnRhaW5hYmxlIHRlc3RzLiAgV2hlbiB0aGF0IGhhcHBlbnMsIE1vY2tGb28gd2lsbAorLy8gc3RvcCBiZWhhdmluZyBsaWtlIE5hZ2d5TW9jazxNb2NrRm9vPiBhbmQgc3RhcnQgYmVoYXZpbmcgbGlrZQorLy8gTmljZU1vY2s8TW9ja0Zvbz4uCisvLworLy8gTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgImluaGVyaXQiIHRoZSBjb25zdHJ1Y3RvcnMgb2YKKy8vIHRoZWlyIHJlc3BlY3RpdmUgYmFzZSBjbGFzcywgd2l0aCB1cC10byAkbiBhcmd1bWVudHMuICBUaGVyZWZvcmUKKy8vIHlvdSBjYW4gd3JpdGUgTmljZU1vY2s8TW9ja0Zvbz4oNSwgImEiKSB0byBjb25zdHJ1Y3QgYSBuaWNlIG1vY2sKKy8vIHdoZXJlIE1vY2tGb28gaGFzIGEgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIChpbnQsIGNvbnN0IGNoYXIqKSwKKy8vIGZvciBleGFtcGxlLgorLy8KKy8vIEEga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IE5pY2VNb2NrPE1vY2tGb28+LCBOYWdneU1vY2s8TW9ja0Zvbz4sCisvLyBhbmQgU3RyaWN0TW9jazxNb2NrRm9vPiBvbmx5IHdvcmtzIGZvciBtb2NrIG1ldGhvZHMgZGVmaW5lZCB1c2luZworLy8gdGhlIE1PQ0tfTUVUSE9EKiBmYW1pbHkgb2YgbWFjcm9zIERJUkVDVExZIGluIHRoZSBNb2NrRm9vIGNsYXNzLgorLy8gSWYgYSBtb2NrIG1ldGhvZCBpcyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcyBvZiBNb2NrRm9vLCB0aGUgIm5pY2UiCisvLyBvciAic3RyaWN0IiBtb2RpZmllciBtYXkgbm90IGFmZmVjdCBpdCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlci4KKy8vIEluIHBhcnRpY3VsYXIsIG5lc3RpbmcgTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgaXMgTk9UCisvLyBzdXBwb3J0ZWQuCisvLworLy8gQW5vdGhlciBrbm93biBsaW1pdGF0aW9uIGlzIHRoYXQgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgYmFzZSBtb2NrCisvLyBjYW5ub3QgaGF2ZSBhcmd1bWVudHMgcGFzc2VkIGJ5IG5vbi1jb25zdCByZWZlcmVuY2UsIHdoaWNoIGFyZQorLy8gYmFubmVkIGJ5IHRoZSBHb29nbGUgQysrIHN0eWxlIGd1aWRlIGFueXdheS4KKworI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXworI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXworCisjaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIgorI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCiskcmFuZ2Uga2luZCAwLi4yCiskZm9yIGtpbmQgW1sKKworJHZhciBjbGF6ej1bWyRpZiBraW5kPT0wIFtbTmljZU1vY2tdXQorICAgICAgICAgICAgICRlbGlmIGtpbmQ9PTEgW1tOYWdneU1vY2tdXQorICAgICAgICAgICAgICRlbHNlIFtbU3RyaWN0TW9ja11dXV0KKworJHZhciBtZXRob2Q9W1skaWYga2luZD09MCBbW0FsbG93VW5pbnRlcmVzdGluZ0NhbGxzXV0KKyAgICAgICAgICAgICAkZWxpZiBraW5kPT0xIFtbV2FyblVuaW50ZXJlc3RpbmdDYWxsc11dCisgICAgICAgICAgICAgJGVsc2UgW1tGYWlsVW5pbnRlcmVzdGluZ0NhbGxzXV1dXQorCit0ZW1wbGF0ZSA8Y2xhc3MgTW9ja0NsYXNzPgorY2xhc3MgJGNsYXp6IDogcHVibGljIE1vY2tDbGFzcyB7CisgcHVibGljOgorICAvLyBXZSBkb24ndCBmYWN0b3Igb3V0IHRoZSBjb25zdHJ1Y3RvciBib2R5IHRvIGEgY29tbW9uIG1ldGhvZCwgYXMKKyAgLy8gd2UgaGF2ZSB0byBhdm9pZCBhIHBvc3NpYmxlIGNsYXNoIHdpdGggbWVtYmVycyBvZiBNb2NrQ2xhc3MuCisgICRjbGF6eigpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OiRtZXRob2QoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgIC8vIEMrKyBkb2Vzbid0ICh5ZXQpIGFsbG93IGluaGVyaXRhbmNlIG9mIGNvbnN0cnVjdG9ycywgc28gd2UgaGF2ZQorICAvLyB0byBkZWZpbmUgaXQgZm9yIGVhY2ggYXJpdHkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMT4KKyAgZXhwbGljaXQgJGNsYXp6KGNvbnN0IEExJiBhMSkgOiBNb2NrQ2xhc3MoYTEpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OiRtZXRob2QoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCiskcmFuZ2UgaSAyLi5uCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKyAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBBJGpdXT4KKyAgJGNsYXp6KCRmb3IgaiwgW1tjb25zdCBBJGomIGEkal1dKSA6IE1vY2tDbGFzcygkZm9yIGosIFtbYSRqXV0pIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OiRtZXRob2QoCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisKK11dCisgIHZpcnR1YWwgfiRjbGF6eigpIHsKKyAgICA6OnRlc3Rpbmc6Ok1vY2s6OlVucmVnaXN0ZXJDYWxsUmVhY3Rpb24oCisgICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXygkY2xhenopOworfTsKKworXV0KKworLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbnMgY2F0Y2ggc29tZSAocmVsYXRpdmVseSBtb3JlIGNvbW1vbikKKy8vIHVzZXIgZXJyb3JzIG9mIG5lc3RpbmcgbmljZSBhbmQgc3RyaWN0IG1vY2tzLiAgVGhleSBkbyBOT1QgY2F0Y2gKKy8vIGFsbCBwb3NzaWJsZSBlcnJvcnMuCisKKy8vIFRoZXNlIHNwZWNpYWxpemF0aW9ucyBhcmUgZGVjbGFyZWQgYnV0IG5vdCBkZWZpbmVkLCBhcyBOaWNlTW9jaywKKy8vIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgY2Fubm90IGJlIG5lc3RlZC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KK2NsYXNzIE5pY2VNb2NrPE5pY2VNb2NrPE1vY2tDbGFzcz4gPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+CitjbGFzcyBOaWNlTW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+OwordGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KK2NsYXNzIE5pY2VNb2NrPFN0cmljdE1vY2s8TW9ja0NsYXNzPiA+OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgorY2xhc3MgTmFnZ3lNb2NrPE5pY2VNb2NrPE1vY2tDbGFzcz4gPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+CitjbGFzcyBOYWdneU1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+CitjbGFzcyBOYWdneU1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+CitjbGFzcyBTdHJpY3RNb2NrPE5pY2VNb2NrPE1vY2tDbGFzcz4gPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+CitjbGFzcyBTdHJpY3RNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgorY2xhc3MgU3RyaWN0TW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbWF0Y2hlcnMuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiMzdhNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgKQEAgLTAsMCArMSw0Mzk5IEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIGFyZ3VtZW50IG1hdGNoZXJzLiAgTW9yZQorLy8gbWF0Y2hlcnMgY2FuIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgaW1wbGVtZW50aW5nIHRoZQorLy8gTWF0Y2hlckludGVyZmFjZTxUPiBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5LgorCisjaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTUFUQ0hFUlNfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NQVRDSEVSU19IXworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8KKyMgaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4gIC8vIE5PTElOVCAtLSBtdXN0IGJlIGFmdGVyIGd0ZXN0LmgKKyNlbmRpZgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRvIGltcGxlbWVudCBhIG1hdGNoZXIgRm9vIGZvciB0eXBlIFQsIGRlZmluZToKKy8vICAgMS4gYSBjbGFzcyBGb29NYXRjaGVySW1wbCB0aGF0IGltcGxlbWVudHMgdGhlCisvLyAgICAgIE1hdGNoZXJJbnRlcmZhY2U8VD4gaW50ZXJmYWNlLCBhbmQKKy8vICAgMi4gYSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIE1hdGNoZXI8VD4gb2JqZWN0IGZyb20gYQorLy8gICAgICBGb29NYXRjaGVySW1wbCouCisvLworLy8gVGhlIHR3by1sZXZlbCBkZWxlZ2F0aW9uIGRlc2lnbiBtYWtlcyBpdCBwb3NzaWJsZSB0byBhbGxvdyBhIHVzZXIKKy8vIHRvIHdyaXRlICJ2IiBpbnN0ZWFkIG9mICJFcSh2KSIgd2hlcmUgYSBNYXRjaGVyIGlzIGV4cGVjdGVkLCB3aGljaAorLy8gaXMgaW1wb3NzaWJsZSBpZiB3ZSBwYXNzIG1hdGNoZXJzIGJ5IHBvaW50ZXJzLiAgSXQgYWxzbyBlYXNlcworLy8gb3duZXJzaGlwIG1hbmFnZW1lbnQgYXMgTWF0Y2hlciBvYmplY3RzIGNhbiBub3cgYmUgY29waWVkIGxpa2UKKy8vIHBsYWluIHZhbHVlcy4KKworLy8gTWF0Y2hSZXN1bHRMaXN0ZW5lciBpcyBhbiBhYnN0cmFjdCBjbGFzcy4gIEl0cyA8PCBvcGVyYXRvciBjYW4gYmUKKy8vIHVzZWQgYnkgYSBtYXRjaGVyIHRvIGV4cGxhaW4gd2h5IGEgdmFsdWUgbWF0Y2hlcyBvciBkb2Vzbid0IG1hdGNoLgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBhZGQgbWV0aG9kCisvLyAgIGJvb2wgSW50ZXJlc3RlZEluV2h5KGJvb2wgcmVzdWx0KSBjb25zdDsKKy8vIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGxpc3RlbmVyIGlzIGludGVyZXN0ZWQgaW4gd2h5IHRoZSBtYXRjaAorLy8gcmVzdWx0IGlzICdyZXN1bHQnLgorY2xhc3MgTWF0Y2hSZXN1bHRMaXN0ZW5lciB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgbGlzdGVuZXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHVuZGVybHlpbmcgb3N0cmVhbS4gIFRoZQorICAvLyBsaXN0ZW5lciBkb2VzIG5vdCBvd24gdGhlIG9zdHJlYW0sIGFuZCBkb2VzIG5vdCBkZXJlZmVyZW5jZSBpdAorICAvLyBpbiB0aGUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4KKyAgZXhwbGljaXQgTWF0Y2hSZXN1bHRMaXN0ZW5lcig6OnN0ZDo6b3N0cmVhbSogb3MpIDogc3RyZWFtXyhvcykge30KKyAgdmlydHVhbCB+TWF0Y2hSZXN1bHRMaXN0ZW5lcigpID0gMDsgIC8vIE1ha2VzIHRoaXMgY2xhc3MgYWJzdHJhY3QuCisKKyAgLy8gU3RyZWFtcyB4IHRvIHRoZSB1bmRlcmx5aW5nIG9zdHJlYW07IGRvZXMgbm90aGluZyBpZiB0aGUgb3N0cmVhbQorICAvLyBpcyBOVUxMLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgTWF0Y2hSZXN1bHRMaXN0ZW5lciYgb3BlcmF0b3I8PChjb25zdCBUJiB4KSB7CisgICAgaWYgKHN0cmVhbV8gIT0gTlVMTCkKKyAgICAgICpzdHJlYW1fIDw8IHg7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgdW5kZXJseWluZyBvc3RyZWFtLgorICA6OnN0ZDo6b3N0cmVhbSogc3RyZWFtKCkgeyByZXR1cm4gc3RyZWFtXzsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGxpc3RlbmVyIGlzIGludGVyZXN0ZWQgaW4gYW4gZXhwbGFuYXRpb24gb2YKKyAgLy8gdGhlIG1hdGNoIHJlc3VsdC4gIEEgbWF0Y2hlcidzIE1hdGNoQW5kRXhwbGFpbigpIG1ldGhvZCBjYW4gdXNlCisgIC8vIHRoaXMgaW5mb3JtYXRpb24gdG8gYXZvaWQgZ2VuZXJhdGluZyB0aGUgZXhwbGFuYXRpb24gd2hlbiBubyBvbmUKKyAgLy8gaW50ZW5kcyB0byBoZWFyIGl0LgorICBib29sIElzSW50ZXJlc3RlZCgpIGNvbnN0IHsgcmV0dXJuIHN0cmVhbV8gIT0gTlVMTDsgfQorCisgcHJpdmF0ZToKKyAgOjpzdGQ6Om9zdHJlYW0qIGNvbnN0IHN0cmVhbV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNYXRjaFJlc3VsdExpc3RlbmVyKTsKK307CisKK2lubGluZSBNYXRjaFJlc3VsdExpc3RlbmVyOjp+TWF0Y2hSZXN1bHRMaXN0ZW5lcigpIHsKK30KKworLy8gQW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGlzIGtub3dzIGhvdyB0byBkZXNjcmliZSBpdHNlbGYgYXMgYQorLy8gbWF0Y2hlci4KK2NsYXNzIE1hdGNoZXJEZXNjcmliZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+TWF0Y2hlckRlc2NyaWJlckludGVyZmFjZSgpIHt9CisKKyAgLy8gRGVzY3JpYmVzIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLiAgVGhlIGZ1bmN0aW9uIHNob3VsZCBwcmludAorICAvLyBhIHZlcmIgcGhyYXNlIHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0eSBhIHZhbHVlIG1hdGNoaW5nIHRoaXMKKyAgLy8gbWF0Y2hlciBzaG91bGQgaGF2ZS4gIFRoZSBzdWJqZWN0IG9mIHRoZSB2ZXJiIHBocmFzZSBpcyB0aGUgdmFsdWUKKyAgLy8gYmVpbmcgbWF0Y2hlZC4gIEZvciBleGFtcGxlLCB0aGUgRGVzY3JpYmVUbygpIG1ldGhvZCBvZiB0aGUgR3QoNykKKyAgLy8gbWF0Y2hlciBwcmludHMgImlzIGdyZWF0ZXIgdGhhbiA3Ii4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7CisKKyAgLy8gRGVzY3JpYmVzIHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgdG8gYW4gb3N0cmVhbS4gIEZvcgorICAvLyBleGFtcGxlLCBpZiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBtYXRjaGVyIGlzICJpcyBncmVhdGVyIHRoYW4KKyAgLy8gNyIsIHRoZSBuZWdhdGVkIGRlc2NyaXB0aW9uIGNvdWxkIGJlICJpcyBub3QgZ3JlYXRlciB0aGFuIDciLgorICAvLyBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBvdmVycmlkZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nCisgIC8vIE1hdGNoZXJJbnRlcmZhY2UsIGJ1dCBpdCBpcyBoaWdobHkgYWR2aXNlZCBzbyB0aGF0IHlvdXIgbWF0Y2hlcgorICAvLyBjYW4gcHJvZHVjZSBnb29kIGVycm9yIG1lc3NhZ2VzLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAibm90ICgiOworICAgIERlc2NyaWJlVG8ob3MpOworICAgICpvcyA8PCAiKSI7CisgIH0KK307CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1hdGNoZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIE1hdGNoZXJJbnRlcmZhY2UgOiBwdWJsaWMgTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZSB7CisgcHVibGljOgorICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBtYXRjaGVyIG1hdGNoZXMgeDsgYWxzbyBleHBsYWlucyB0aGUgbWF0Y2gKKyAgLy8gcmVzdWx0IHRvICdsaXN0ZW5lcicgaWYgbmVjZXNzYXJ5IChzZWUgdGhlIG5leHQgcGFyYWdyYXBoKSwgaW4KKyAgLy8gdGhlIGZvcm0gb2YgYSBub24tcmVzdHJpY3RpdmUgcmVsYXRpdmUgY2xhdXNlICgid2hpY2ggLi4uIiwKKyAgLy8gIndob3NlIC4uLiIsIGV0YykgdGhhdCBkZXNjcmliZXMgeC4gIEZvciBleGFtcGxlLCB0aGUKKyAgLy8gTWF0Y2hBbmRFeHBsYWluKCkgbWV0aG9kIG9mIHRoZSBQb2ludGVlKC4uLikgbWF0Y2hlciBzaG91bGQKKyAgLy8gZ2VuZXJhdGUgYW4gZXhwbGFuYXRpb24gbGlrZSAid2hpY2ggcG9pbnRzIHRvIC4uLiIuCisgIC8vCisgIC8vIEltcGxlbWVudGF0aW9ucyBvZiBNYXRjaEFuZEV4cGxhaW4oKSBzaG91bGQgYWRkIGFuIGV4cGxhbmF0aW9uIG9mCisgIC8vIHRoZSBtYXRjaCByZXN1bHQgKmlmIGFuZCBvbmx5IGlmKiB0aGV5IGNhbiBwcm92aWRlIGFkZGl0aW9uYWwKKyAgLy8gaW5mb3JtYXRpb24gdGhhdCdzIG5vdCBhbHJlYWR5IHByZXNlbnQgKG9yIG5vdCBvYnZpb3VzKSBpbiB0aGUKKyAgLy8gcHJpbnQtb3V0IG9mIHggYW5kIHRoZSBtYXRjaGVyJ3MgZGVzY3JpcHRpb24uICBXaGV0aGVyIHRoZSBtYXRjaAorICAvLyBzdWNjZWVkcyBpcyBub3QgYSBmYWN0b3IgaW4gZGVjaWRpbmcgd2hldGhlciBhbiBleHBsYW5hdGlvbiBpcworICAvLyBuZWVkZWQsIGFzIHNvbWV0aW1lcyB0aGUgY2FsbGVyIG5lZWRzIHRvIHByaW50IGEgZmFpbHVyZSBtZXNzYWdlCisgIC8vIHdoZW4gdGhlIG1hdGNoIHN1Y2NlZWRzIChlLmcuIHdoZW4gdGhlIG1hdGNoZXIgaXMgdXNlZCBpbnNpZGUKKyAgLy8gTm90KCkpLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgYSAiaGFzIGF0IGxlYXN0IDEwIGVsZW1lbnRzIiBtYXRjaGVyIHNob3VsZCBleHBsYWluCisgIC8vIHdoYXQgdGhlIGFjdHVhbCBlbGVtZW50IGNvdW50IGlzLCByZWdhcmRsZXNzIG9mIHRoZSBtYXRjaCByZXN1bHQsCisgIC8vIGFzIGl0IGlzIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB0aGUgcmVhZGVyOyBvbiB0aGUgb3RoZXIgaGFuZCwgYW4KKyAgLy8gImlzIGVtcHR5IiBtYXRjaGVyIHByb2JhYmx5IG9ubHkgbmVlZHMgdG8gZXhwbGFpbiB3aGF0IHRoZSBhY3R1YWwKKyAgLy8gc2l6ZSBpcyB3aGVuIHRoZSBtYXRjaCBmYWlscywgYXMgaXQncyByZWR1bmRhbnQgdG8gc2F5IHRoYXQgdGhlCisgIC8vIHNpemUgaXMgMCB3aGVuIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGtub3duIHRvIGJlIGVtcHR5LgorICAvLworICAvLyBZb3Ugc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdoZW4gZGVmaW5pbmcgYSBuZXcgbWF0Y2hlci4KKyAgLy8KKyAgLy8gSXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciAoR29vZ2xlIE1vY2spIHRvIGd1YXJhbnRlZQorICAvLyB0aGF0ICdsaXN0ZW5lcicgaXMgbm90IE5VTEwuICBUaGlzIGhlbHBzIHRvIHNpbXBsaWZ5IGEgbWF0Y2hlcidzCisgIC8vIGltcGxlbWVudGF0aW9uIHdoZW4gaXQgZG9lc24ndCBjYXJlIGFib3V0IHRoZSBwZXJmb3JtYW5jZSwgYXMgaXQKKyAgLy8gY2FuIHRhbGsgdG8gJ2xpc3RlbmVyJyB3aXRob3V0IGNoZWNraW5nIGl0cyB2YWxpZGl0eSBmaXJzdC4KKyAgLy8gSG93ZXZlciwgaW4gb3JkZXIgdG8gaW1wbGVtZW50IGR1bW15IGxpc3RlbmVycyBlZmZpY2llbnRseSwKKyAgLy8gbGlzdGVuZXItPnN0cmVhbSgpIG1heSBiZSBOVUxMLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0ID0gMDsKKworICAvLyBJbmhlcml0cyB0aGVzZSBtZXRob2RzIGZyb20gTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZToKKyAgLy8gICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKKyAgLy8gICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Cit9OworCisvLyBBIG1hdGNoIHJlc3VsdCBsaXN0ZW5lciB0aGF0IHN0b3JlcyB0aGUgZXhwbGFuYXRpb24gaW4gYSBzdHJpbmcuCitjbGFzcyBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIDogcHVibGljIE1hdGNoUmVzdWx0TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lcigpIDogTWF0Y2hSZXN1bHRMaXN0ZW5lcigmc3NfKSB7fQorCisgIC8vIFJldHVybnMgdGhlIGV4cGxhbmF0aW9uIGFjY3VtdWxhdGVkIHNvIGZhci4KKyAgaW50ZXJuYWw6OnN0cmluZyBzdHIoKSBjb25zdCB7IHJldHVybiBzc18uc3RyKCk7IH0KKworICAvLyBDbGVhcnMgdGhlIGV4cGxhbmF0aW9uIGFjY3VtdWxhdGVkIHNvIGZhci4KKyAgdm9pZCBDbGVhcigpIHsgc3NfLnN0cigiIik7IH0KKworIHByaXZhdGU6CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3NfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lcik7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgQW55RXEgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEEmIGEsIGNvbnN0IEImIGIpIGNvbnN0IHsgcmV0dXJuIGEgPT0gYjsgfQorfTsKK3N0cnVjdCBBbnlOZSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgY29uc3QgeyByZXR1cm4gYSAhPSBiOyB9Cit9Oworc3RydWN0IEFueUx0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhIDwgYjsgfQorfTsKK3N0cnVjdCBBbnlHdCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgY29uc3QgeyByZXR1cm4gYSA+IGI7IH0KK307CitzdHJ1Y3QgQW55TGUgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEEmIGEsIGNvbnN0IEImIGIpIGNvbnN0IHsgcmV0dXJuIGEgPD0gYjsgfQorfTsKK3N0cnVjdCBBbnlHZSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgY29uc3QgeyByZXR1cm4gYSA+PSBiOyB9Cit9OworCisvLyBBIG1hdGNoIHJlc3VsdCBsaXN0ZW5lciB0aGF0IGlnbm9yZXMgdGhlIGV4cGxhbmF0aW9uLgorY2xhc3MgRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyIDogcHVibGljIE1hdGNoUmVzdWx0TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyKCkgOiBNYXRjaFJlc3VsdExpc3RlbmVyKE5VTEwpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKER1bW15TWF0Y2hSZXN1bHRMaXN0ZW5lcik7Cit9OworCisvLyBBIG1hdGNoIHJlc3VsdCBsaXN0ZW5lciB0aGF0IGZvcndhcmRzIHRoZSBleHBsYW5hdGlvbiB0byBhIGdpdmVuCisvLyBvc3RyZWFtLiAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBNYXRjaFJlc3VsdExpc3RlbmVyIGlzCisvLyB0aGF0IHRoZSBmb3JtZXIgaXMgY29uY3JldGUuCitjbGFzcyBTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyIDogcHVibGljIE1hdGNoUmVzdWx0TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RyZWFtTWF0Y2hSZXN1bHRMaXN0ZW5lcig6OnN0ZDo6b3N0cmVhbSogb3MpCisgICAgICA6IE1hdGNoUmVzdWx0TGlzdGVuZXIob3MpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIpOworfTsKKworLy8gQW4gaW50ZXJuYWwgY2xhc3MgZm9yIGltcGxlbWVudGluZyBNYXRjaGVyPFQ+LCB3aGljaCB3aWxsIGRlcml2ZQorLy8gZnJvbSBpdC4gIFdlIHB1dCBmdW5jdGlvbmFsaXRpZXMgY29tbW9uIHRvIGFsbCBNYXRjaGVyPFQ+CisvLyBzcGVjaWFsaXphdGlvbnMgaGVyZSB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBNYXRjaGVyQmFzZSB7CisgcHVibGljOgorICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBtYXRjaGVyIG1hdGNoZXMgeDsgYWxzbyBleHBsYWlucyB0aGUgbWF0Y2gKKyAgLy8gcmVzdWx0IHRvICdsaXN0ZW5lcicuCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbF8tPk1hdGNoQW5kRXhwbGFpbih4LCBsaXN0ZW5lcik7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgbWF0Y2hlciBtYXRjaGVzIHguCisgIGJvb2wgTWF0Y2hlcyhUIHgpIGNvbnN0IHsKKyAgICBEdW1teU1hdGNoUmVzdWx0TGlzdGVuZXIgZHVtbXk7CisgICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbih4LCAmZHVtbXkpOworICB9CisKKyAgLy8gRGVzY3JpYmVzIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLgorICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7IGltcGxfLT5EZXNjcmliZVRvKG9zKTsgfQorCisgIC8vIERlc2NyaWJlcyB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgIGltcGxfLT5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICB9CisKKyAgLy8gRXhwbGFpbnMgd2h5IHggbWF0Y2hlcywgb3IgZG9lc24ndCBtYXRjaCwgdGhlIG1hdGNoZXIuCisgIHZvaWQgRXhwbGFpbk1hdGNoUmVzdWx0VG8oVCB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICBTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyKG9zKTsKKyAgICBNYXRjaEFuZEV4cGxhaW4oeCwgJmxpc3RlbmVyKTsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGRlc2NyaWJlciBmb3IgdGhpcyBtYXRjaGVyIG9iamVjdDsgcmV0YWlucyBvd25lcnNoaXAKKyAgLy8gb2YgdGhlIGRlc2NyaWJlciwgd2hpY2ggaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIGFsaXZlIHdoZW4KKyAgLy8gdGhpcyBtYXRjaGVyIG9iamVjdCBpcyBhbGl2ZS4KKyAgY29uc3QgTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZSogR2V0RGVzY3JpYmVyKCkgY29uc3QgeworICAgIHJldHVybiBpbXBsXy5nZXQoKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBNYXRjaGVyQmFzZSgpIHt9CisKKyAgLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uCisgIGV4cGxpY2l0IE1hdGNoZXJCYXNlKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8VD4qIGltcGwpCisgICAgICA6IGltcGxfKGltcGwpIHt9CisKKyAgdmlydHVhbCB+TWF0Y2hlckJhc2UoKSB7fQorCisgcHJpdmF0ZToKKyAgLy8gc2hhcmVkX3B0ciAodXRpbC9ndGwvc2hhcmVkX3B0ci5oKSBhbmQgbGlua2VkX3B0ciBoYXZlIHNpbWlsYXIKKyAgLy8gaW50ZXJmYWNlcy4gIFRoZSBmb3JtZXIgZHluYW1pY2FsbHkgYWxsb2NhdGVzIGEgY2h1bmsgb2YgbWVtb3J5CisgIC8vIHRvIGhvbGQgdGhlIHJlZmVyZW5jZSBjb3VudCwgd2hpbGUgdGhlIGxhdHRlciB0cmFja3MgYWxsCisgIC8vIHJlZmVyZW5jZXMgdXNpbmcgYSBjaXJjdWxhciBsaW5rZWQgbGlzdCB3aXRob3V0IGFsbG9jYXRpbmcKKyAgLy8gbWVtb3J5LiAgSXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCBsaW5rZWRfcHRyIHBlcmZvcm1zIGJldHRlciBpbgorICAvLyB0eXBpY2FsIHNjZW5hcmlvcy4gIEhvd2V2ZXIsIHNoYXJlZF9wdHIgY2FuIG91dC1wZXJmb3JtCisgIC8vIGxpbmtlZF9wdHIgd2hlbiB0aGVyZSBhcmUgbWFueSBtb3JlIHVzZXMgb2YgdGhlIGNvcHkgY29uc3RydWN0b3IKKyAgLy8gdGhhbiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgLy8KKyAgLy8gSWYgcGVyZm9ybWFuY2UgYmVjb21lcyBhIHByb2JsZW0sIHdlIHNob3VsZCBzZWUgaWYgdXNpbmcKKyAgLy8gc2hhcmVkX3B0ciBoZWxwcy4KKyAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBNYXRjaGVySW50ZXJmYWNlPFQ+ID4gaW1wbF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQSBNYXRjaGVyPFQ+IGlzIGEgY29weWFibGUgYW5kIElNTVVUQUJMRSAoZXhjZXB0IGJ5IGFzc2lnbm1lbnQpCisvLyBvYmplY3QgdGhhdCBjYW4gY2hlY2sgd2hldGhlciBhIHZhbHVlIG9mIHR5cGUgVCBtYXRjaGVzLiAgVGhlCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBNYXRjaGVyPFQ+IGlzIGp1c3QgYSBsaW5rZWRfcHRyIHRvIGNvbnN0CisvLyBNYXRjaGVySW50ZXJmYWNlPFQ+LCBzbyBjb3B5aW5nIGlzIGZhaXJseSBjaGVhcC4gIERvbid0IGluaGVyaXQKKy8vIGZyb20gTWF0Y2hlciEKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTWF0Y2hlciA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8VD4geworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIG51bGwgbWF0Y2hlci4gIE5lZWRlZCBmb3Igc3RvcmluZyBNYXRjaGVyIG9iamVjdHMgaW4gU1RMCisgIC8vIGNvbnRhaW5lcnMuICBBIGRlZmF1bHQtY29uc3RydWN0ZWQgbWF0Y2hlciBpcyBub3QgeWV0IGluaXRpYWxpemVkLiAgWW91CisgIC8vIGNhbm5vdCB1c2UgaXQgdW50aWwgYSB2YWxpZCB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBpdC4KKyAgZXhwbGljaXQgTWF0Y2hlcigpIHt9ICAvLyBOT0xJTlQKKworICAvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4KKyAgZXhwbGljaXQgTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPFQ+KiBpbXBsKQorICAgICAgOiBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8VD4oaW1wbCkge30KKworICAvLyBJbXBsaWNpdCBjb25zdHJ1Y3RvciBoZXJlIGFsbG93cyBwZW9wbGUgdG8gd3JpdGUKKyAgLy8gRVhQRUNUX0NBTEwoZm9vLCBCYXIoNSkpIGluc3RlYWQgb2YgRVhQRUNUX0NBTEwoZm9vLCBCYXIoRXEoNSkpKSBzb21ldGltZXMKKyAgTWF0Y2hlcihUIHZhbHVlKTsgIC8vIE5PTElOVAorfTsKKworLy8gVGhlIGZvbGxvd2luZyB0d28gc3BlY2lhbGl6YXRpb25zIGFsbG93IHRoZSB1c2VyIHRvIHdyaXRlIHN0cgorLy8gaW5zdGVhZCBvZiBFcShzdHIpIGFuZCAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSB3aGVuIGEgc3RyaW5nCisvLyBtYXRjaGVyIGlzIGV4cGVjdGVkLgordGVtcGxhdGUgPD4KK2NsYXNzIEdURVNUX0FQSV8gTWF0Y2hlcjxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj4KKyAgICA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8Y29uc3QgaW50ZXJuYWw6OnN0cmluZyY+IHsKKyBwdWJsaWM6CisgIE1hdGNoZXIoKSB7fQorCisgIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj4qIGltcGwpCisgICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj4oaW1wbCkge30KKworICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgc3RyIGluc3RlYWQgb2YgRXEoc3RyKSBzb21ldGltZXMsIHdoZXJlCisgIC8vIHN0ciBpcyBhIHN0cmluZyBvYmplY3QuCisgIE1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyk7ICAvLyBOT0xJTlQKKworICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgc29tZXRpbWVzLgorICBNYXRjaGVyKGNvbnN0IGNoYXIqIHMpOyAgLy8gTk9MSU5UCit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR1RFU1RfQVBJXyBNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+CisgICAgOiBwdWJsaWMgaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGludGVybmFsOjpzdHJpbmc+IHsKKyBwdWJsaWM6CisgIE1hdGNoZXIoKSB7fQorCisgIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxpbnRlcm5hbDo6c3RyaW5nPiogaW1wbCkKKyAgICAgIDogaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGludGVybmFsOjpzdHJpbmc+KGltcGwpIHt9CisKKyAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlIHN0ciBpbnN0ZWFkIG9mIEVxKHN0cikgc29tZXRpbWVzLCB3aGVyZQorICAvLyBzdHIgaXMgYSBzdHJpbmcgb2JqZWN0LgorICBNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpOyAgLy8gTk9MSU5UCisKKyAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHNvbWV0aW1lcy4KKyAgTWF0Y2hlcihjb25zdCBjaGFyKiBzKTsgIC8vIE5PTElOVAorfTsKKworI2lmIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCisvLyBUaGUgZm9sbG93aW5nIHR3byBzcGVjaWFsaXphdGlvbnMgYWxsb3cgdGhlIHVzZXIgdG8gd3JpdGUgc3RyCisvLyBpbnN0ZWFkIG9mIEVxKHN0cikgYW5kICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHdoZW4gYSBTdHJpbmdQaWVjZQorLy8gbWF0Y2hlciBpcyBleHBlY3RlZC4KK3RlbXBsYXRlIDw+CitjbGFzcyBHVEVTVF9BUElfIE1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPgorICAgIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxjb25zdCBTdHJpbmdQaWVjZSY+IHsKKyBwdWJsaWM6CisgIE1hdGNoZXIoKSB7fQorCisgIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxjb25zdCBTdHJpbmdQaWVjZSY+KiBpbXBsKQorICAgICAgOiBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8Y29uc3QgU3RyaW5nUGllY2UmPihpbXBsKSB7fQorCisgIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSBzdHIgaW5zdGVhZCBvZiBFcShzdHIpIHNvbWV0aW1lcywgd2hlcmUKKyAgLy8gc3RyIGlzIGEgc3RyaW5nIG9iamVjdC4KKyAgTWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKTsgIC8vIE5PTElOVAorCisgIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSBzb21ldGltZXMuCisgIE1hdGNoZXIoY29uc3QgY2hhciogcyk7ICAvLyBOT0xJTlQKKworICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gcGFzcyBTdHJpbmdQaWVjZXMgZGlyZWN0bHkuCisgIE1hdGNoZXIoU3RyaW5nUGllY2Ugcyk7ICAvLyBOT0xJTlQKK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHVEVTVF9BUElfIE1hdGNoZXI8U3RyaW5nUGllY2U+CisgICAgOiBwdWJsaWMgaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPFN0cmluZ1BpZWNlPiB7CisgcHVibGljOgorICBNYXRjaGVyKCkge30KKworICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8U3RyaW5nUGllY2U+KiBpbXBsKQorICAgICAgOiBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8U3RyaW5nUGllY2U+KGltcGwpIHt9CisKKyAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlIHN0ciBpbnN0ZWFkIG9mIEVxKHN0cikgc29tZXRpbWVzLCB3aGVyZQorICAvLyBzdHIgaXMgYSBzdHJpbmcgb2JqZWN0LgorICBNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpOyAgLy8gTk9MSU5UCisKKyAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHNvbWV0aW1lcy4KKyAgTWF0Y2hlcihjb25zdCBjaGFyKiBzKTsgIC8vIE5PTElOVAorCisgIC8vIEFsbG93cyB0aGUgdXNlciB0byBwYXNzIFN0cmluZ1BpZWNlcyBkaXJlY3RseS4KKyAgTWF0Y2hlcihTdHJpbmdQaWVjZSBzKTsgIC8vIE5PTElOVAorfTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KKworLy8gVGhlIFBvbHltb3JwaGljTWF0Y2hlciBjbGFzcyB0ZW1wbGF0ZSBtYWtlcyBpdCBlYXN5IHRvIGltcGxlbWVudCBhCisvLyBwb2x5bW9ycGhpYyBtYXRjaGVyIChpLmUuIGEgbWF0Y2hlciB0aGF0IGNhbiBtYXRjaCB2YWx1ZXMgb2YgbW9yZQorLy8gdGhhbiBvbmUgdHlwZSwgZS5nLiBFcShuKSBhbmQgTm90TnVsbCgpKS4KKy8vCisvLyBUbyBkZWZpbmUgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLCBhIHVzZXIgc2hvdWxkIHByb3ZpZGUgYW4gSW1wbAorLy8gY2xhc3MgdGhhdCBoYXMgYSBEZXNjcmliZVRvKCkgbWV0aG9kIGFuZCBhIERlc2NyaWJlTmVnYXRpb25UbygpCisvLyBtZXRob2QsIGFuZCBkZWZpbmUgYSBtZW1iZXIgZnVuY3Rpb24gKG9yIG1lbWJlciBmdW5jdGlvbiB0ZW1wbGF0ZSkKKy8vCisvLyAgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFZhbHVlJiB2YWx1ZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0OworLy8KKy8vIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBOb3ROdWxsKCkgZm9yIGEgY29tcGxldGUgZXhhbXBsZS4KK3RlbXBsYXRlIDxjbGFzcyBJbXBsPgorY2xhc3MgUG9seW1vcnBoaWNNYXRjaGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFBvbHltb3JwaGljTWF0Y2hlcihjb25zdCBJbXBsJiBhbl9pbXBsKSA6IGltcGxfKGFuX2ltcGwpIHt9CisKKyAgLy8gUmV0dXJucyBhIG11dGFibGUgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIG1hdGNoZXIKKyAgLy8gaW1wbGVtZW50YXRpb24gb2JqZWN0LgorICBJbXBsJiBtdXRhYmxlX2ltcGwoKSB7IHJldHVybiBpbXBsXzsgfQorCisgIC8vIFJldHVybnMgYW4gaW1tdXRhYmxlIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBtYXRjaGVyCisgIC8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgY29uc3QgSW1wbCYgaW1wbCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IE1vbm9tb3JwaGljSW1wbDxUPihpbXBsXykpOworICB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY2xhc3MgTW9ub21vcnBoaWNJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4geworICAgcHVibGljOgorICAgIGV4cGxpY2l0IE1vbm9tb3JwaGljSW1wbChjb25zdCBJbXBsJiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAgIGltcGxfLkRlc2NyaWJlVG8ob3MpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICBpbXBsXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgICAgcmV0dXJuIGltcGxfLk1hdGNoQW5kRXhwbGFpbih4LCBsaXN0ZW5lcik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IEltcGwgaW1wbF87CisKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1vbm9tb3JwaGljSW1wbCk7CisgIH07CisKKyAgSW1wbCBpbXBsXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBvbHltb3JwaGljTWF0Y2hlcik7Cit9OworCisvLyBDcmVhdGVzIGEgbWF0Y2hlciBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMgZWFzaWVyIHRvIHVzZQorLy8gdGhhbiB0aGUgTWF0Y2hlcjxUPiBjb25zdHJ1Y3RvciBhcyBpdCBkb2Vzbid0IHJlcXVpcmUgeW91IHRvCisvLyBleHBsaWNpdGx5IHdyaXRlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCwgZS5nLgorLy8KKy8vICAgTWFrZU1hdGNoZXIoZm9vKTsKKy8vIHZzCisvLyAgIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4oZm9vKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIE1hdGNoZXI8VD4gTWFrZU1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxUPiogaW1wbCkgeworICByZXR1cm4gTWF0Y2hlcjxUPihpbXBsKTsKK30KKworLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uICBUaGlzIGlzCisvLyBlYXNpZXIgdG8gdXNlIHRoYW4gdGhlIFBvbHltb3JwaGljTWF0Y2hlcjxJbXBsPiBjb25zdHJ1Y3RvciBhcyBpdAorLy8gZG9lc24ndCByZXF1aXJlIHlvdSB0byBleHBsaWNpdGx5IHdyaXRlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCwgZS5nLgorLy8KKy8vICAgTWFrZVBvbHltb3JwaGljTWF0Y2hlcihmb28pOworLy8gdnMKKy8vICAgUG9seW1vcnBoaWNNYXRjaGVyPFR5cGVPZkZvbz4oZm9vKTsKK3RlbXBsYXRlIDxjbGFzcyBJbXBsPgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxJbXBsPiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGNvbnN0IEltcGwmIGltcGwpIHsKKyAgcmV0dXJuIFBvbHltb3JwaGljTWF0Y2hlcjxJbXBsPihpbXBsKTsKK30KKworLy8gQW55dGhpbmcgaW5zaWRlIHRoZSAnaW50ZXJuYWwnIG5hbWVzcGFjZSBJUyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTgorLy8gYW5kIE1VU1QgTk9UIEJFIFVTRUQgSU4gVVNFUiBDT0RFISEhCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgTWF0Y2hlckNhc3RJbXBsIGNsYXNzIHRlbXBsYXRlIGlzIGEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcKKy8vIE1hdGNoZXJDYXN0KCkuICBXZSBuZWVkIHRoaXMgaGVscGVyIGluIG9yZGVyIHRvIHBhcnRpYWxseQorLy8gc3BlY2lhbGl6ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgTWF0Y2hlckNhc3QoKSAoQysrIGFsbG93cworLy8gY2xhc3Mvc3RydWN0IHRlbXBsYXRlcyB0byBiZSBwYXJ0aWFsbHkgc3BlY2lhbGl6ZWQsIGJ1dCBub3QKKy8vIGZ1bmN0aW9uIHRlbXBsYXRlcy4pLgorCisvLyBUaGlzIGdlbmVyYWwgdmVyc2lvbiBpcyB1c2VkIHdoZW4gTWF0Y2hlckNhc3QoKSdzIGFyZ3VtZW50IGlzIGEKKy8vIHBvbHltb3JwaGljIG1hdGNoZXIgKGkuZS4gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhCisvLyBNYXRjaGVyIGJ1dCBpcyBub3Qgb25lIHlldDsgZm9yIGV4YW1wbGUsIEVxKHZhbHVlKSkgb3IgYSB2YWx1ZSAoZm9yCisvLyBleGFtcGxlLCAiaGVsbG8iKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPgorY2xhc3MgTWF0Y2hlckNhc3RJbXBsIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTSYgcG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSkgeworICAgIC8vIE0gY2FuIGJlIGEgcG9seW1vcmhpYyBtYXRjaGVyLCBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdG8gdXNlCisgICAgLy8gaXRzIGNvbnZlcnNpb24gb3BlcmF0b3IgdG8gY3JlYXRlIE1hdGNoZXI8VD4uICBPciBpdCBjYW4gYmUgYSB2YWx1ZQorICAgIC8vIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgTWF0Y2hlcjxUPidzIGNvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gV2UgY2FuJ3QgY2FsbCBNYXRjaGVyPFQ+KHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUpIHdoZW4gTSBpcyBhCisgICAgLy8gcG9seW1vcnBoaWMgbWF0Y2hlciBiZWNhdXNlIGl0J2xsIGJlIGFtYmlndW91cyBpZiBUIGhhcyBhbiBpbXBsaWNpdAorICAgIC8vIGNvbnN0cnVjdG9yIGZyb20gTSAodGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBUIGhhcyBhbiBpbXBsaWNpdAorICAgIC8vIGNvbnN0cnVjdG9yIGZyb20gYW55IHR5cGUpLgorICAgIC8vCisgICAgLy8gSXQgd29uJ3Qgd29yayB0byB1bmNvbmRpdGlvbmFsbHkgaW1wbGljdF9jYXN0CisgICAgLy8gcG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSB0byBNYXRjaGVyPFQ+IGJlY2F1c2UgaXQgd29uJ3QgdHJpZ2dlcgorICAgIC8vIGEgdXNlci1kZWZpbmVkIGNvbnZlcnNpb24gZnJvbSBNIHRvIFQgaWYgb25lIGV4aXN0cyAoYXNzdW1pbmcgTSBpcworICAgIC8vIGEgdmFsdWUpLgorICAgIHJldHVybiBDYXN0SW1wbCgKKyAgICAgICAgcG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSwKKyAgICAgICAgQm9vbGVhbkNvbnN0YW50PAorICAgICAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxNLCBNYXRjaGVyPFQ+ID46OnZhbHVlPigpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdEltcGwoY29uc3QgTSYgdmFsdWUsIEJvb2xlYW5Db25zdGFudDxmYWxzZT4pIHsKKyAgICAvLyBNIGNhbid0IGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIE1hdGNoZXI8VD4sIHNvIE0gaXNuJ3QgYSBwb2x5bW9ycGhpYworICAgIC8vIG1hdGNoZXIuICBJdCBtdXN0IGJlIGEgdmFsdWUgdGhlbi4gIFVzZSBkaXJlY3QgaW5pdGlhbGl6YXRpb24gdG8gY3JlYXRlCisgICAgLy8gYSBtYXRjaGVyLgorICAgIHJldHVybiBNYXRjaGVyPFQ+KEltcGxpY2l0Q2FzdF88VD4odmFsdWUpKTsKKyAgfQorCisgIHN0YXRpYyBNYXRjaGVyPFQ+IENhc3RJbXBsKGNvbnN0IE0mIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW5Db25zdGFudDx0cnVlPikgeworICAgIC8vIE0gaXMgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBNYXRjaGVyPFQ+LCB3aGljaCBtZWFucyB0aGF0IGVpdGhlcgorICAgIC8vIE0gaXMgYSBwb2x5bW9yaHBpYyBtYXRjaGVyIG9yIE1hdGNoZXI8VD4gaGFzIGFuIGltcGxpY2l0IGNvbnN0cnVjdG9yCisgICAgLy8gZnJvbSBNLiAgSW4gYm90aCBjYXNlcyB1c2luZyB0aGUgaW1wbGljaXQgY29udmVyc2lvbiB3aWxsIHByb2R1Y2UgYQorICAgIC8vIG1hdGNoZXIuCisgICAgLy8KKyAgICAvLyBFdmVuIGlmIFQgaGFzIGFuIGltcGxpY2l0IGNvbnN0cnVjdG9yIGZyb20gTSwgaXQgd29uJ3QgYmUgY2FsbGVkIGJlY2F1c2UKKyAgICAvLyBjcmVhdGluZyBNYXRjaGVyPFQ+IHdvdWxkIHJlcXVpcmUgYSBjaGFpbiBvZiB0d28gdXNlci1kZWZpbmVkIGNvbnZlcnNpb25zCisgICAgLy8gKGZpcnN0IHRvIGNyZWF0ZSBUIGZyb20gTSBhbmQgdGhlbiB0byBjcmVhdGUgTWF0Y2hlcjxUPiBmcm9tIFQpLgorICAgIHJldHVybiBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlOworICB9Cit9OworCisvLyBUaGlzIG1vcmUgc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyB1c2VkIHdoZW4gTWF0Y2hlckNhc3QoKSdzIGFyZ3VtZW50CisvLyBpcyBhbHJlYWR5IGEgTWF0Y2hlci4gIFRoaXMgb25seSBjb21waWxlcyB3aGVuIHR5cGUgVCBjYW4gYmUKKy8vIHN0YXRpY2FsbHkgY29udmVydGVkIHRvIHR5cGUgVS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorY2xhc3MgTWF0Y2hlckNhc3RJbXBsPFQsIE1hdGNoZXI8VT4gPiB7CisgcHVibGljOgorICBzdGF0aWMgTWF0Y2hlcjxUPiBDYXN0KGNvbnN0IE1hdGNoZXI8VT4mIHNvdXJjZV9tYXRjaGVyKSB7CisgICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IEltcGwoc291cmNlX21hdGNoZXIpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IE1hdGNoZXI8VT4mIHNvdXJjZV9tYXRjaGVyKQorICAgICAgICA6IHNvdXJjZV9tYXRjaGVyXyhzb3VyY2VfbWF0Y2hlcikge30KKworICAgIC8vIFdlIGRlbGVnYXRlIHRoZSBtYXRjaGluZyBsb2dpYyB0byB0aGUgc291cmNlIG1hdGNoZXIuCisgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgICByZXR1cm4gc291cmNlX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzdGF0aWNfY2FzdDxVPih4KSwgbGlzdGVuZXIpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICAgc291cmNlX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICBzb3VyY2VfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgTWF0Y2hlcjxVPiBzb3VyY2VfbWF0Y2hlcl87CisKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOworICB9OworfTsKKworLy8gVGhpcyBldmVuIG1vcmUgc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyB1c2VkIGZvciBlZmZpY2llbnRseSBjYXN0aW5nCisvLyBhIG1hdGNoZXIgdG8gaXRzIG93biB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBNYXRjaGVyQ2FzdEltcGw8VCwgTWF0Y2hlcjxUPiA+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcikgeyByZXR1cm4gbWF0Y2hlcjsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEluIG9yZGVyIHRvIGJlIHNhZmUgYW5kIGNsZWFyLCBjYXN0aW5nIGJldHdlZW4gZGlmZmVyZW50IG1hdGNoZXIKKy8vIHR5cGVzIGlzIGRvbmUgZXhwbGljaXRseSB2aWEgTWF0Y2hlckNhc3Q8VD4obSksIHdoaWNoIHRha2VzIGEKKy8vIG1hdGNoZXIgbSBhbmQgcmV0dXJucyBhIE1hdGNoZXI8VD4uICBJdCBjb21waWxlcyBvbmx5IHdoZW4gVCBjYW4gYmUKKy8vIHN0YXRpY2FsbHkgY29udmVydGVkIHRvIHRoZSBhcmd1bWVudCB0eXBlIG9mIG0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTT4KK2lubGluZSBNYXRjaGVyPFQ+IE1hdGNoZXJDYXN0KGNvbnN0IE0mIG1hdGNoZXIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpNYXRjaGVyQ2FzdEltcGw8VCwgTT46OkNhc3QobWF0Y2hlcik7Cit9CisKKy8vIEltcGxlbWVudHMgU2FmZU1hdGNoZXJDYXN0KCkuCisvLworLy8gV2UgdXNlIGFuIGludGVybWVkaWF0ZSBjbGFzcyB0byBkbyB0aGUgYWN0dWFsIHNhZmUgY2FzdGluZyBhcyBOb2tpYSdzCisvLyBTeW1iaWFuIGNvbXBpbGVyIGNhbm5vdCBkZWNpZGUgYmV0d2VlbgorLy8gdGVtcGxhdGUgPFQsIE0+IC4uLiAoTSkgYW5kCisvLyB0ZW1wbGF0ZSA8VCwgVT4gLi4uIChjb25zdCBNYXRjaGVyPFU+JikKKy8vIGZvciBmdW5jdGlvbiB0ZW1wbGF0ZXMgYnV0IGNhbiBmb3IgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU2FmZU1hdGNoZXJDYXN0SW1wbCB7CisgcHVibGljOgorICAvLyBUaGlzIG92ZXJsb2FkIGhhbmRsZXMgcG9seW1vcnBoaWMgbWF0Y2hlcnMgYW5kIHZhbHVlcyBvbmx5IHNpbmNlCisgIC8vIG1vbm9tb3JwaGljIG1hdGNoZXJzIGFyZSBoYW5kbGVkIGJ5IHRoZSBuZXh0IG9uZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE0+CisgIHN0YXRpYyBpbmxpbmUgTWF0Y2hlcjxUPiBDYXN0KGNvbnN0IE0mIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUpIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6Ok1hdGNoZXJDYXN0SW1wbDxULCBNPjo6Q2FzdChwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlKTsKKyAgfQorCisgIC8vIFRoaXMgb3ZlcmxvYWQgaGFuZGxlcyBtb25vbW9ycGhpYyBtYXRjaGVycy4KKyAgLy8KKyAgLy8gSW4gZ2VuZXJhbCwgaWYgdHlwZSBUIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFUsIHdlIGNhbgorICAvLyBzYWZlbHkgY29udmVydCBhIE1hdGNoZXI8VT4gdG8gYSBNYXRjaGVyPFQ+IChpLmUuIE1hdGNoZXIgaXMKKyAgLy8gY29udHJhdmFyaWFudCk6IGp1c3Qga2VlcCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIE1hdGNoZXI8VT4sIGNvbnZlcnQgdGhlCisgIC8vIGFyZ3VtZW50IGZyb20gdHlwZSBUIHRvIFUsIGFuZCB0aGVuIHBhc3MgaXQgdG8gdGhlIHVuZGVybHlpbmcgTWF0Y2hlcjxVPi4KKyAgLy8gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHdoZW4gVSBpcyBhIHJlZmVyZW5jZSBhbmQgVCBpcyBub3QsIGFzIHRoZQorICAvLyB1bmRlcmx5aW5nIE1hdGNoZXI8VT4gbWF5IGJlIGludGVyZXN0ZWQgaW4gdGhlIGFyZ3VtZW50J3MgYWRkcmVzcywgd2hpY2gKKyAgLy8gaXMgbm90IHByZXNlcnZlZCBpbiB0aGUgY29udmVyc2lvbiBmcm9tIFQgdG8gVS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBpbmxpbmUgTWF0Y2hlcjxUPiBDYXN0KGNvbnN0IE1hdGNoZXI8VT4mIG1hdGNoZXIpIHsKKyAgICAvLyBFbmZvcmNlIHRoYXQgVCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gVS4KKyAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKGludGVybmFsOjpJbXBsaWNpdGx5Q29udmVydGlibGU8VCwgVT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVF9tdXN0X2JlX2ltcGxpY2l0bHlfY29udmVydGlibGVfdG9fVSk7CisgICAgLy8gRW5mb3JjZSB0aGF0IHdlIGFyZSBub3QgY29udmVydGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIHRvIGEgcmVmZXJlbmNlCisgICAgLy8gdHlwZSBVLgorICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygKKyAgICAgICAgaW50ZXJuYWw6OmlzX3JlZmVyZW5jZTxUPjo6dmFsdWUgfHwgIWludGVybmFsOjppc19yZWZlcmVuY2U8VT46OnZhbHVlLAorICAgICAgICBjYW5ub3RfY29udmVydF9ub25fcmVmZXJlbnRjZV9hcmdfdG9fcmVmZXJlbmNlKTsKKyAgICAvLyBJbiBjYXNlIGJvdGggVCBhbmQgVSBhcmUgYXJpdGhtZXRpYyB0eXBlcywgZW5mb3JjZSB0aGF0IHRoZQorICAgIC8vIGNvbnZlcnNpb24gaXMgbm90IGxvc3N5LgorICAgIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFQpIFJhd1Q7CisgICAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVSkgUmF3VTsKKyAgICBjb25zdCBib29sIGtUSXNPdGhlciA9IEdNT0NLX0tJTkRfT0ZfKFJhd1QpID09IGludGVybmFsOjprT3RoZXI7CisgICAgY29uc3QgYm9vbCBrVUlzT3RoZXIgPSBHTU9DS19LSU5EX09GXyhSYXdVKSA9PSBpbnRlcm5hbDo6a090aGVyOworICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygKKyAgICAgICAga1RJc090aGVyIHx8IGtVSXNPdGhlciB8fAorICAgICAgICAoaW50ZXJuYWw6Okxvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPFJhd1QsIFJhd1U+Ojp2YWx1ZSksCisgICAgICAgIGNvbnZlcnNpb25fb2ZfYXJpdGhtZXRpY190eXBlc19tdXN0X2JlX2xvc3NsZXNzKTsKKyAgICByZXR1cm4gTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcik7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPgoraW5saW5lIE1hdGNoZXI8VD4gU2FmZU1hdGNoZXJDYXN0KGNvbnN0IE0mIHBvbHltb3JwaGljX21hdGNoZXIpIHsKKyAgcmV0dXJuIFNhZmVNYXRjaGVyQ2FzdEltcGw8VD46OkNhc3QocG9seW1vcnBoaWNfbWF0Y2hlcik7Cit9CisKKy8vIEE8VD4oKSByZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIHR5cGUgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorTWF0Y2hlcjxUPiBBKCk7CisKKy8vIEFueXRoaW5nIGluc2lkZSB0aGUgJ2ludGVybmFsJyBuYW1lc3BhY2UgSVMgSU5URVJOQUwgSU1QTEVNRU5UQVRJT04KKy8vIGFuZCBNVVNUIE5PVCBCRSBVU0VEIElOIFVTRVIgQ09ERSEhIQorbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gSWYgdGhlIGV4cGxhbmF0aW9uIGlzIG5vdCBlbXB0eSwgcHJpbnRzIGl0IHRvIHRoZSBvc3RyZWFtLgoraW5saW5lIHZvaWQgUHJpbnRJZk5vdEVtcHR5KGNvbnN0IGludGVybmFsOjpzdHJpbmcmIGV4cGxhbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBpZiAoZXhwbGFuYXRpb24gIT0gIiIgJiYgb3MgIT0gTlVMTCkgeworICAgICpvcyA8PCAiLCAiIDw8IGV4cGxhbmF0aW9uOworICB9Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBuYW1lIGlzIGVhc3kgdG8gcmVhZCBieSBhIGh1bWFuLgorLy8gVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHByaW50aW5nIHRoZSB0eXBlIG9mIGEgdmFsdWUgbWlnaHQKKy8vIGJlIGhlbHBmdWwuCitpbmxpbmUgYm9vbCBJc1JlYWRhYmxlVHlwZU5hbWUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIHsKKyAgLy8gV2UgY29uc2lkZXIgYSB0eXBlIG5hbWUgcmVhZGFibGUgaWYgaXQncyBzaG9ydCBvciBkb2Vzbid0IGNvbnRhaW4KKyAgLy8gYSB0ZW1wbGF0ZSBvciBmdW5jdGlvbiB0eXBlLgorICByZXR1cm4gKHR5cGVfbmFtZS5sZW5ndGgoKSA8PSAyMCB8fAorICAgICAgICAgIHR5cGVfbmFtZS5maW5kX2ZpcnN0X29mKCI8KCIpID09IHN0cmluZzo6bnBvcyk7Cit9CisKKy8vIE1hdGNoZXMgdGhlIHZhbHVlIGFnYWluc3QgdGhlIGdpdmVuIG1hdGNoZXIsIHByaW50cyB0aGUgdmFsdWUgYW5kIGV4cGxhaW5zCisvLyB0aGUgbWF0Y2ggcmVzdWx0IHRvIHRoZSBsaXN0ZW5lci4gUmV0dXJucyB0aGUgbWF0Y2ggcmVzdWx0LgorLy8gJ2xpc3RlbmVyJyBtdXN0IG5vdCBiZSBOVUxMLgorLy8gVmFsdWUgY2Fubm90IGJlIHBhc3NlZCBieSBjb25zdCByZWZlcmVuY2UsIGJlY2F1c2Ugc29tZSBtYXRjaGVycyB0YWtlIGEKKy8vIG5vbi1jb25zdCBhcmd1bWVudC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgVD4KK2Jvb2wgTWF0Y2hQcmludEFuZEV4cGxhaW4oVmFsdWUmIHZhbHVlLCBjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoIWxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgeworICAgIC8vIElmIHRoZSBsaXN0ZW5lciBpcyBub3QgaW50ZXJlc3RlZCwgd2UgZG8gbm90IG5lZWQgdG8gY29uc3RydWN0IHRoZQorICAgIC8vIGlubmVyIGV4cGxhbmF0aW9uLgorICAgIHJldHVybiBtYXRjaGVyLk1hdGNoZXModmFsdWUpOworICB9CisKKyAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBpbm5lcl9saXN0ZW5lcjsKKyAgY29uc3QgYm9vbCBtYXRjaCA9IG1hdGNoZXIuTWF0Y2hBbmRFeHBsYWluKHZhbHVlLCAmaW5uZXJfbGlzdGVuZXIpOworCisgIFVuaXZlcnNhbFByaW50KHZhbHVlLCBsaXN0ZW5lci0+c3RyZWFtKCkpOworI2lmIEdURVNUX0hBU19SVFRJCisgIGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lID0gR2V0VHlwZU5hbWU8VmFsdWU+KCk7CisgIGlmIChJc1JlYWRhYmxlVHlwZU5hbWUodHlwZV9uYW1lKSkKKyAgICAqbGlzdGVuZXItPnN0cmVhbSgpIDw8ICIgKG9mIHR5cGUgIiA8PCB0eXBlX25hbWUgPDwgIikiOworI2VuZGlmCisgIFByaW50SWZOb3RFbXB0eShpbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKKworICByZXR1cm4gbWF0Y2g7Cit9CisKKy8vIEFuIGludGVybmFsIGhlbHBlciBjbGFzcyBmb3IgZG9pbmcgY29tcGlsZS10aW1lIGxvb3Agb24gYSB0dXBsZSdzCisvLyBmaWVsZHMuCit0ZW1wbGF0ZSA8c2l6ZV90IE4+CitjbGFzcyBUdXBsZVByZWZpeCB7CisgcHVibGljOgorICAvLyBUdXBsZVByZWZpeDxOPjo6TWF0Y2hlcyhtYXRjaGVyX3R1cGxlLCB2YWx1ZV90dXBsZSkgcmV0dXJucyB0cnVlCisgIC8vIGlmZiB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgbWF0Y2hlcl90dXBsZSBtYXRjaGVzIHRoZSBmaXJzdCBOCisgIC8vIGZpZWxkcyBvZiB2YWx1ZV90dXBsZSwgcmVzcGVjdGl2ZWx5LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPgorICBzdGF0aWMgYm9vbCBNYXRjaGVzKGNvbnN0IE1hdGNoZXJUdXBsZSYgbWF0Y2hlcl90dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVR1cGxlJiB2YWx1ZV90dXBsZSkgeworICAgIHJldHVybiBUdXBsZVByZWZpeDxOIC0gMT46Ok1hdGNoZXMobWF0Y2hlcl90dXBsZSwgdmFsdWVfdHVwbGUpCisgICAgICAgICYmIGdldDxOIC0gMT4obWF0Y2hlcl90dXBsZSkuTWF0Y2hlcyhnZXQ8TiAtIDE+KHZhbHVlX3R1cGxlKSk7CisgIH0KKworICAvLyBUdXBsZVByZWZpeDxOPjo6RXhwbGFpbk1hdGNoRmFpbHVyZXNUbyhtYXRjaGVycywgdmFsdWVzLCBvcykKKyAgLy8gZGVzY3JpYmVzIGZhaWx1cmVzIGluIG1hdGNoaW5nIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBtYXRjaGVycworICAvLyBhZ2FpbnN0IHRoZSBmaXJzdCBOIGZpZWxkcyBvZiB2YWx1ZXMuICBJZiB0aGVyZSBpcyBubyBmYWlsdXJlLAorICAvLyBub3RoaW5nIHdpbGwgYmUgc3RyZWFtZWQgdG8gb3MuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+CisgIHN0YXRpYyB2b2lkIEV4cGxhaW5NYXRjaEZhaWx1cmVzVG8oY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVR1cGxlJiB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgLy8gRmlyc3QsIGRlc2NyaWJlcyBmYWlsdXJlcyBpbiB0aGUgZmlyc3QgTiAtIDEgZmllbGRzLgorICAgIFR1cGxlUHJlZml4PE4gLSAxPjo6RXhwbGFpbk1hdGNoRmFpbHVyZXNUbyhtYXRjaGVycywgdmFsdWVzLCBvcyk7CisKKyAgICAvLyBUaGVuIGRlc2NyaWJlcyB0aGUgZmFpbHVyZSAoaWYgYW55KSBpbiB0aGUgKE4gLSAxKS10aCAoMC1iYXNlZCkKKyAgICAvLyBmaWVsZC4KKyAgICB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PE4gLSAxLCBNYXRjaGVyVHVwbGU+Ojp0eXBlIG1hdGNoZXIgPQorICAgICAgICBnZXQ8TiAtIDE+KG1hdGNoZXJzKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8TiAtIDEsIFZhbHVlVHVwbGU+Ojp0eXBlIFZhbHVlOworICAgIFZhbHVlIHZhbHVlID0gZ2V0PE4gLSAxPih2YWx1ZXMpOworICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7CisgICAgaWYgKCFtYXRjaGVyLk1hdGNoQW5kRXhwbGFpbih2YWx1ZSwgJmxpc3RlbmVyKSkgeworICAgICAgLy8gVE9ETyh3YW4pOiBpbmNsdWRlIGluIHRoZSBtZXNzYWdlIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgIC8vIGFzIHVzZWQgaW4gTU9DS19NRVRIT0QqKCkgd2hlbiBwb3NzaWJsZS4KKyAgICAgICpvcyA8PCAiICBFeHBlY3RlZCBhcmcgIyIgPDwgTiAtIDEgPDwgIjogIjsKKyAgICAgIGdldDxOIC0gMT4obWF0Y2hlcnMpLkRlc2NyaWJlVG8ob3MpOworICAgICAgKm9zIDw8ICJcbiAgICAgICAgICAgQWN0dWFsOiAiOworICAgICAgLy8gV2UgcmVtb3ZlIHRoZSByZWZlcmVuY2UgaW4gdHlwZSBWYWx1ZSB0byBwcmV2ZW50IHRoZQorICAgICAgLy8gdW5pdmVyc2FsIHByaW50ZXIgZnJvbSBwcmludGluZyB0aGUgYWRkcmVzcyBvZiB2YWx1ZSwgd2hpY2gKKyAgICAgIC8vIGlzbid0IGludGVyZXN0aW5nIHRvIHRoZSB1c2VyIG1vc3Qgb2YgdGhlIHRpbWUuICBUaGUKKyAgICAgIC8vIG1hdGNoZXIncyBNYXRjaEFuZEV4cGxhaW4oKSBtZXRob2QgaGFuZGxlcyB0aGUgY2FzZSB3aGVuCisgICAgICAvLyB0aGUgYWRkcmVzcyBpcyBpbnRlcmVzdGluZy4KKyAgICAgIGludGVybmFsOjpVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworICAgICAgUHJpbnRJZk5vdEVtcHR5KGxpc3RlbmVyLnN0cigpLCBvcyk7CisgICAgICAqb3MgPDwgIlxuIjsKKyAgICB9CisgIH0KK307CisKKy8vIFRoZSBiYXNlIGNhc2UuCit0ZW1wbGF0ZSA8PgorY2xhc3MgVHVwbGVQcmVmaXg8MD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KKyAgc3RhdGljIGJvb2wgTWF0Y2hlcyhjb25zdCBNYXRjaGVyVHVwbGUmIC8qIG1hdGNoZXJfdHVwbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgLyogdmFsdWVfdHVwbGUgKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+CisgIHN0YXRpYyB2b2lkIEV4cGxhaW5NYXRjaEZhaWx1cmVzVG8oY29uc3QgTWF0Y2hlclR1cGxlJiAvKiBtYXRjaGVycyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVR1cGxlJiAvKiB2YWx1ZXMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIC8qIG9zICovKSB7fQorfTsKKworLy8gVHVwbGVNYXRjaGVzKG1hdGNoZXJfdHVwbGUsIHZhbHVlX3R1cGxlKSByZXR1cm5zIHRydWUgaWZmIGFsbAorLy8gbWF0Y2hlcnMgaW4gbWF0Y2hlcl90dXBsZSBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgaW4KKy8vIHZhbHVlX3R1cGxlLiAgSXQgaXMgYSBjb21waWxlciBlcnJvciBpZiBtYXRjaGVyX3R1cGxlIGFuZAorLy8gdmFsdWVfdHVwbGUgaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mIGZpZWxkcyBvciBpbmNvbXBhdGlibGUgZmllbGQKKy8vIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KK2Jvb2wgVHVwbGVNYXRjaGVzKGNvbnN0IE1hdGNoZXJUdXBsZSYgbWF0Y2hlcl90dXBsZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlX3R1cGxlKSB7CisgIC8vIE1ha2VzIHN1cmUgdGhhdCBtYXRjaGVyX3R1cGxlIGFuZCB2YWx1ZV90dXBsZSBoYXZlIHRoZSBzYW1lCisgIC8vIG51bWJlciBvZiBmaWVsZHMuCisgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyh0dXBsZV9zaXplPE1hdGNoZXJUdXBsZT46OnZhbHVlID09CisgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZV9zaXplPFZhbHVlVHVwbGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXJfYW5kX3ZhbHVlX2hhdmVfZGlmZmVyZW50X251bWJlcnNfb2ZfZmllbGRzKTsKKyAgcmV0dXJuIFR1cGxlUHJlZml4PHR1cGxlX3NpemU8VmFsdWVUdXBsZT46OnZhbHVlPjo6CisgICAgICBNYXRjaGVzKG1hdGNoZXJfdHVwbGUsIHZhbHVlX3R1cGxlKTsKK30KKworLy8gRGVzY3JpYmVzIGZhaWx1cmVzIGluIG1hdGNoaW5nIG1hdGNoZXJzIGFnYWluc3QgdmFsdWVzLiAgSWYgdGhlcmUKKy8vIGlzIG5vIGZhaWx1cmUsIG5vdGhpbmcgd2lsbCBiZSBzdHJlYW1lZCB0byBvcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+Cit2b2lkIEV4cGxhaW5NYXRjaEZhaWx1cmVUdXBsZVRvKGNvbnN0IE1hdGNoZXJUdXBsZSYgbWF0Y2hlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFR1cGxlUHJlZml4PHR1cGxlX3NpemU8TWF0Y2hlclR1cGxlPjo6dmFsdWU+OjpFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKAorICAgICAgbWF0Y2hlcnMsIHZhbHVlcywgb3MpOworfQorCisvLyBUcmFuc2Zvcm1UdXBsZVZhbHVlcyBhbmQgaXRzIGhlbHBlci4KKy8vCisvLyBUcmFuc2Zvcm1UdXBsZVZhbHVlc0hlbHBlciBoaWRlcyB0aGUgaW50ZXJuYWwgbWFjaGluZXJ5IHRoYXQKKy8vIFRyYW5zZm9ybVR1cGxlVmFsdWVzIHVzZXMgdG8gaW1wbGVtZW50IGEgdHVwbGUgdHJhdmVyc2FsLgordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlLCB0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBPdXRJdGVyPgorY2xhc3MgVHJhbnNmb3JtVHVwbGVWYWx1ZXNIZWxwZXIgeworIHByaXZhdGU6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZV9zaXplPFR1cGxlPiBUdXBsZVNpemU7CisKKyBwdWJsaWM6CisgIC8vIEZvciBlYWNoIG1lbWJlciBvZiB0dXBsZSAndCcsIHRha2VuIGluIG9yZGVyLCBldmFsdWF0ZXMgJypvdXQrKyA9IGYodCknLgorICAvLyBSZXR1cm5zIHRoZSBmaW5hbCB2YWx1ZSBvZiAnb3V0JyBpbiBjYXNlIHRoZSBjYWxsZXIgbmVlZHMgaXQuCisgIHN0YXRpYyBPdXRJdGVyIFJ1bihGdW5jIGYsIGNvbnN0IFR1cGxlJiB0LCBPdXRJdGVyIG91dCkgeworICAgIHJldHVybiBJdGVyYXRlT3ZlclR1cGxlPFR1cGxlLCBUdXBsZVNpemU6OnZhbHVlPigpKGYsIHQsIG91dCk7CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXAsIHNpemVfdCBrUmVtYWluaW5nU2l6ZT4KKyAgc3RydWN0IEl0ZXJhdGVPdmVyVHVwbGUgeworICAgIE91dEl0ZXIgb3BlcmF0b3IoKSAoRnVuYyBmLCBjb25zdCBUdXAmIHQsIE91dEl0ZXIgb3V0KSBjb25zdCB7CisgICAgICAqb3V0KysgPSBmKDo6dGVzdGluZzo6Z2V0PFR1cGxlU2l6ZTo6dmFsdWUgLSBrUmVtYWluaW5nU2l6ZT4odCkpOworICAgICAgcmV0dXJuIEl0ZXJhdGVPdmVyVHVwbGU8VHVwLCBrUmVtYWluaW5nU2l6ZSAtIDE+KCkoZiwgdCwgb3V0KTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXA+CisgIHN0cnVjdCBJdGVyYXRlT3ZlclR1cGxlPFR1cCwgMD4geworICAgIE91dEl0ZXIgb3BlcmF0b3IoKSAoRnVuYyAvKiBmICovLCBjb25zdCBUdXAmIC8qIHQgKi8sIE91dEl0ZXIgb3V0KSBjb25zdCB7CisgICAgICByZXR1cm4gb3V0OworICAgIH0KKyAgfTsKK307CisKKy8vIFN1Y2Nlc3NpdmVseSBpbnZva2VzICdmKGVsZW1lbnQpJyBvbiBlYWNoIGVsZW1lbnQgb2YgdGhlIHR1cGxlICd0JywKKy8vIGFwcGVuZGluZyBlYWNoIHJlc3VsdCB0byB0aGUgJ291dCcgaXRlcmF0b3IuIFJldHVybnMgdGhlIGZpbmFsIHZhbHVlCisvLyBvZiAnb3V0Jy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZSwgdHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgT3V0SXRlcj4KK091dEl0ZXIgVHJhbnNmb3JtVHVwbGVWYWx1ZXMoRnVuYyBmLCBjb25zdCBUdXBsZSYgdCwgT3V0SXRlciBvdXQpIHsKKyAgcmV0dXJuIFRyYW5zZm9ybVR1cGxlVmFsdWVzSGVscGVyPFR1cGxlLCBGdW5jLCBPdXRJdGVyPjo6UnVuKGYsIHQsIG91dCk7Cit9CisKKy8vIEltcGxlbWVudHMgQTxUPigpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBBbnlNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oCisgICAgICBUIC8qIHggKi8sIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImlzIGFueXRoaW5nIjsgfQorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgIC8vIFRoaXMgaXMgbW9zdGx5IGZvciBjb21wbGV0ZW5lc3MnIHNhZmUsIGFzIGl0J3Mgbm90IHZlcnkgdXNlZnVsCisgICAgLy8gdG8gd3JpdGUgTm90KEE8Ym9vbD4oKSkuICBIb3dldmVyIHdlIGNhbm5vdCBjb21wbGV0ZWx5IHJ1bGUgb3V0CisgICAgLy8gc3VjaCBhIHBvc3NpYmlsaXR5LCBhbmQgaXQgZG9lc24ndCBodXJ0IHRvIGJlIHByZXBhcmVkLgorICAgICpvcyA8PCAibmV2ZXIgbWF0Y2hlcyI7CisgIH0KK307CisKKy8vIEltcGxlbWVudHMgXywgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgYW55CisvLyB0eXBlLiAgVGhpcyBpcyBhIHBvbHltb3JwaGljIG1hdGNoZXIsIHNvIHdlIG5lZWQgYSB0ZW1wbGF0ZSB0eXBlCisvLyBjb252ZXJzaW9uIG9wZXJhdG9yIHRvIG1ha2UgaXQgYXBwZWFyaW5nIGFzIGEgTWF0Y2hlcjxUPiBmb3IgYW55CisvLyB0eXBlIFQuCitjbGFzcyBBbnl0aGluZ01hdGNoZXIgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7IHJldHVybiBBPFQ+KCk7IH0KK307CisKKy8vIEltcGxlbWVudHMgYSBtYXRjaGVyIHRoYXQgY29tcGFyZXMgYSBnaXZlbiB2YWx1ZSB3aXRoIGEKKy8vIHByZS1zdXBwbGllZCB2YWx1ZSB1c2luZyBvbmUgb2YgdGhlID09LCA8PSwgPCwgZXRjLCBvcGVyYXRvcnMuICBUaGUKKy8vIHR3byB2YWx1ZXMgYmVpbmcgY29tcGFyZWQgZG9uJ3QgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIHR5cGUuCisvLworLy8gVGhlIG1hdGNoZXIgZGVmaW5lZCBoZXJlIGlzIHBvbHltb3JwaGljIChmb3IgZXhhbXBsZSwgRXEoNSkgY2FuIGJlCisvLyB1c2VkIHRvIG1hdGNoIGFuIGludCwgYSBzaG9ydCwgYSBkb3VibGUsIGV0YykuICBUaGVyZWZvcmUgd2UgdXNlCisvLyBhIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBpbiB0aGUgaW1wbGVtZW50YXRpb24uCisvLworLy8gVGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSBkZWZpbml0aW9uIGFzc3VtZXMgdGhhdCB0aGUgUmhzIHBhcmFtZXRlciBpcworLy8gYSAiYmFyZSIgdHlwZSAoaS5lLiBuZWl0aGVyICdjb25zdCBUJyBub3IgJ1QmJykuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRCwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBPcD4KK2NsYXNzIENvbXBhcmlzb25CYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENvbXBhcmlzb25CYXNlKGNvbnN0IFJocyYgcmhzKSA6IHJoc18ocmhzKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzPgorICBvcGVyYXRvciBNYXRjaGVyPExocz4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPExocz4ocmhzXykpOworICB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzPgorICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8TGhzPiB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBSaHMmIHJocykgOiByaHNfKHJocykge30KKyAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKAorICAgICAgICBMaHMgbGhzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgeworICAgICAgcmV0dXJuIE9wKCkobGhzLCByaHNfKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICAqb3MgPDwgRDo6RGVzYygpIDw8ICIgIjsKKyAgICAgIFVuaXZlcnNhbFByaW50KHJoc18sIG9zKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAgICpvcyA8PCBEOjpOZWdhdGVkRGVzYygpIDw8ICAiICI7CisgICAgICBVbml2ZXJzYWxQcmludChyaHNfLCBvcyk7CisgICAgfQorICAgcHJpdmF0ZToKKyAgICBSaHMgcmhzXzsKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOworICB9OworICBSaHMgcmhzXzsKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhDb21wYXJpc29uQmFzZSk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgorY2xhc3MgRXFNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPEVxTWF0Y2hlcjxSaHM+LCBSaHMsIEFueUVxPiB7CisgcHVibGljOgorICBleHBsaWNpdCBFcU1hdGNoZXIoY29uc3QgUmhzJiByaHMpCisgICAgICA6IENvbXBhcmlzb25CYXNlPEVxTWF0Y2hlcjxSaHM+LCBSaHMsIEFueUVxPihyaHMpIHsgfQorICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpcyBlcXVhbCB0byI7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIE5lZ2F0ZWREZXNjKCkgeyByZXR1cm4gImlzbid0IGVxdWFsIHRvIjsgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBSaHM+CitjbGFzcyBOZU1hdGNoZXIgOiBwdWJsaWMgQ29tcGFyaXNvbkJhc2U8TmVNYXRjaGVyPFJocz4sIFJocywgQW55TmU+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE5lTWF0Y2hlcihjb25zdCBSaHMmIHJocykKKyAgICAgIDogQ29tcGFyaXNvbkJhc2U8TmVNYXRjaGVyPFJocz4sIFJocywgQW55TmU+KHJocykgeyB9CisgIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImlzbid0IGVxdWFsIHRvIjsgfQorICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXMgZXF1YWwgdG8iOyB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KK2NsYXNzIEx0TWF0Y2hlciA6IHB1YmxpYyBDb21wYXJpc29uQmFzZTxMdE1hdGNoZXI8UmhzPiwgUmhzLCBBbnlMdD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgTHRNYXRjaGVyKGNvbnN0IFJocyYgcmhzKQorICAgICAgOiBDb21wYXJpc29uQmFzZTxMdE1hdGNoZXI8UmhzPiwgUmhzLCBBbnlMdD4ocmhzKSB7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiaXMgPCI7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIE5lZ2F0ZWREZXNjKCkgeyByZXR1cm4gImlzbid0IDwiOyB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KK2NsYXNzIEd0TWF0Y2hlciA6IHB1YmxpYyBDb21wYXJpc29uQmFzZTxHdE1hdGNoZXI8UmhzPiwgUmhzLCBBbnlHdD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgR3RNYXRjaGVyKGNvbnN0IFJocyYgcmhzKQorICAgICAgOiBDb21wYXJpc29uQmFzZTxHdE1hdGNoZXI8UmhzPiwgUmhzLCBBbnlHdD4ocmhzKSB7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiaXMgPiI7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIE5lZ2F0ZWREZXNjKCkgeyByZXR1cm4gImlzbid0ID4iOyB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KK2NsYXNzIExlTWF0Y2hlciA6IHB1YmxpYyBDb21wYXJpc29uQmFzZTxMZU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlMZT4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgTGVNYXRjaGVyKGNvbnN0IFJocyYgcmhzKQorICAgICAgOiBDb21wYXJpc29uQmFzZTxMZU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlMZT4ocmhzKSB7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiaXMgPD0iOyB9CisgIHN0YXRpYyBjb25zdCBjaGFyKiBOZWdhdGVkRGVzYygpIHsgcmV0dXJuICJpc24ndCA8PSI7IH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgorY2xhc3MgR2VNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPEdlTWF0Y2hlcjxSaHM+LCBSaHMsIEFueUdlPiB7CisgcHVibGljOgorICBleHBsaWNpdCBHZU1hdGNoZXIoY29uc3QgUmhzJiByaHMpCisgICAgICA6IENvbXBhcmlzb25CYXNlPEdlTWF0Y2hlcjxSaHM+LCBSaHMsIEFueUdlPihyaHMpIHsgfQorICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpcyA+PSI7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIE5lZ2F0ZWREZXNjKCkgeyByZXR1cm4gImlzbid0ID49IjsgfQorfTsKKworLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgSXNOdWxsKCkgbWF0Y2hlciwgd2hpY2ggbWF0Y2hlcyBhbnkgcmF3IG9yIHNtYXJ0CisvLyBwb2ludGVyIHRoYXQgaXMgTlVMTC4KK2NsYXNzIElzTnVsbE1hdGNoZXIgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXI+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFBvaW50ZXImIHAsCisgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7CisjaWYgR1RFU1RfTEFOR19DWFgxMQorICAgIHJldHVybiBwID09IG51bGxwdHI7CisjZWxzZSAgLy8gR1RFU1RfTEFOR19DWFgxMQorICAgIHJldHVybiBHZXRSYXdQb2ludGVyKHApID09IE5VTEw7CisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpcyBOVUxMIjsgfQorICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImlzbid0IE5VTEwiOworICB9Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBOb3ROdWxsKCkgbWF0Y2hlciwgd2hpY2ggbWF0Y2hlcyBhbnkgcmF3IG9yIHNtYXJ0CisvLyBwb2ludGVyIHRoYXQgaXMgbm90IE5VTEwuCitjbGFzcyBOb3ROdWxsTWF0Y2hlciB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgUG9pbnRlciYgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKKyNpZiBHVEVTVF9MQU5HX0NYWDExCisgICAgcmV0dXJuIHAgIT0gbnVsbHB0cjsKKyNlbHNlICAvLyBHVEVTVF9MQU5HX0NYWDExCisgICAgcmV0dXJuIEdldFJhd1BvaW50ZXIocCkgIT0gTlVMTDsKKyNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQorICB9CisKKyAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImlzbid0IE5VTEwiOyB9CisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiaXMgTlVMTCI7CisgIH0KK307CisKKy8vIFJlZih2YXJpYWJsZSkgbWF0Y2hlcyBhbnkgYXJndW1lbnQgdGhhdCBpcyBhIHJlZmVyZW5jZSB0bworLy8gJ3ZhcmlhYmxlJy4gIFRoaXMgbWF0Y2hlciBpcyBwb2x5bW9ycGhpYyBhcyBpdCBjYW4gbWF0Y2ggYW55CisvLyBzdXBlciB0eXBlIG9mIHRoZSB0eXBlIG9mICd2YXJpYWJsZScuCisvLworLy8gVGhlIFJlZk1hdGNoZXIgdGVtcGxhdGUgY2xhc3MgaW1wbGVtZW50cyBSZWYodmFyaWFibGUpLiAgSXQgY2FuCisvLyBvbmx5IGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgcmVmZXJlbmNlIHR5cGUuICBUaGlzIHByZXZlbnRzIGEgdXNlcgorLy8gZnJvbSBtaXN0YWtlbmx5IHVzaW5nIFJlZih4KSB0byBtYXRjaCBhIG5vbi1yZWZlcmVuY2UgZnVuY3Rpb24KKy8vIGFyZ3VtZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd2lsbCByaWdodGVvdXNseSBjYXVzZSBhCisvLyBjb21waWxlciBlcnJvcjoKKy8vCisvLyAgIGludCBuOworLy8gICBNYXRjaGVyPGludD4gbTEgPSBSZWYobik7ICAgLy8gVGhpcyB3b24ndCBjb21waWxlLgorLy8gICBNYXRjaGVyPGludCY+IG0yID0gUmVmKG4pOyAgLy8gVGhpcyB3aWxsIGNvbXBpbGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlZk1hdGNoZXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVmTWF0Y2hlcjxUJj4geworICAvLyBHb29nbGUgTW9jayBpcyBhIGdlbmVyaWMgZnJhbWV3b3JrIGFuZCB0aHVzIG5lZWRzIHRvIHN1cHBvcnQKKyAgLy8gbW9ja2luZyBhbnkgZnVuY3Rpb24gdHlwZXMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IHRha2Ugbm9uLWNvbnN0CisgIC8vIHJlZmVyZW5jZSBhcmd1bWVudHMuICBUaGVyZWZvcmUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBUIChhbmQKKyAgLy8gU3VwZXIgYmVsb3cpIGNhbiBiZSBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGEgY29uc3QgdHlwZSBvciBhCisgIC8vIG5vbi1jb25zdCB0eXBlLgorIHB1YmxpYzoKKyAgLy8gUmVmTWF0Y2hlcigpIHRha2VzIGEgVCYgaW5zdGVhZCBvZiBjb25zdCBUJiwgYXMgd2Ugd2FudCB0aGUKKyAgLy8gY29tcGlsZXIgdG8gY2F0Y2ggdXNpbmcgUmVmKGNvbnN0X3ZhbHVlKSBhcyBhIG1hdGNoZXIgZm9yIGEKKyAgLy8gbm9uLWNvbnN0IHJlZmVyZW5jZS4KKyAgZXhwbGljaXQgUmVmTWF0Y2hlcihUJiB4KSA6IG9iamVjdF8oeCkge30gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdXBlcj4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxTdXBlciY+KCkgY29uc3QgeworICAgIC8vIEJ5IHBhc3Npbmcgb2JqZWN0XyAodHlwZSBUJikgdG8gSW1wbCgpLCB3aGljaCBleHBlY3RzIGEgU3VwZXImLAorICAgIC8vIHdlIG1ha2Ugc3VyZSB0aGF0IFN1cGVyIGlzIGEgc3VwZXIgdHlwZSBvZiBULiAgSW4gcGFydGljdWxhciwKKyAgICAvLyB0aGlzIGNhdGNoZXMgdXNpbmcgUmVmKGNvbnN0X3ZhbHVlKSBhcyBhIG1hdGNoZXIgZm9yIGEKKyAgICAvLyBub24tY29uc3QgcmVmZXJlbmNlLCBhcyB5b3UgY2Fubm90IGltcGxpY2l0bHkgY29udmVydCBhIGNvbnN0CisgICAgLy8gcmVmZXJlbmNlIHRvIGEgbm9uLWNvbnN0IHJlZmVyZW5jZS4KKyAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8U3VwZXI+KG9iamVjdF8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN1cGVyPgorICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8U3VwZXImPiB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChTdXBlciYgeCkgOiBvYmplY3RfKHgpIHt9ICAvLyBOT0xJTlQKKworICAgIC8vIE1hdGNoQW5kRXhwbGFpbigpIHRha2VzIGEgU3VwZXImIChhcyBvcHBvc2VkIHRvIGNvbnN0IFN1cGVyJikKKyAgICAvLyBpbiBvcmRlciB0byBtYXRjaCB0aGUgaW50ZXJmYWNlIE1hdGNoZXJJbnRlcmZhY2U8U3VwZXImPi4KKyAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKAorICAgICAgICBTdXBlciYgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgbG9jYXRlZCBAIiA8PCBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oJngpOworICAgICAgcmV0dXJuICZ4ID09ICZvYmplY3RfOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICAgKm9zIDw8ICJyZWZlcmVuY2VzIHRoZSB2YXJpYWJsZSAiOworICAgICAgVW5pdmVyc2FsUHJpbnRlcjxTdXBlciY+OjpQcmludChvYmplY3RfLCBvcyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAgICpvcyA8PCAiZG9lcyBub3QgcmVmZXJlbmNlIHRoZSB2YXJpYWJsZSAiOworICAgICAgVW5pdmVyc2FsUHJpbnRlcjxTdXBlciY+OjpQcmludChvYmplY3RfLCBvcyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IFN1cGVyJiBvYmplY3RfOworCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKKyAgfTsKKworICBUJiBvYmplY3RfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUmVmTWF0Y2hlcik7Cit9OworCisvLyBQb2x5bW9ycGhpYyBoZWxwZXIgZnVuY3Rpb25zIGZvciBuYXJyb3cgYW5kIHdpZGUgc3RyaW5nIG1hdGNoZXJzLgoraW5saW5lIGJvb2wgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyKiBsaHMsIGNvbnN0IGNoYXIqIHJocykgeworICByZXR1cm4gU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGxocywgcmhzKTsKK30KKworaW5saW5lIGJvb2wgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocykgeworICByZXR1cm4gU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhsaHMsIHJocyk7Cit9CisKKy8vIFN0cmluZyBjb21wYXJpc29uIGZvciBuYXJyb3cgb3Igd2lkZSBzdHJpbmdzIHRoYXQgY2FuIGhhdmUgZW1iZWRkZWQgTlVMCisvLyBjaGFyYWN0ZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Citib29sIENhc2VJbnNlbnNpdGl2ZVN0cmluZ0VxdWFscyhjb25zdCBTdHJpbmdUeXBlJiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1R5cGUmIHMyKSB7CisgIC8vIEFyZSB0aGUgaGVhZHMgZXF1YWw/CisgIGlmICghQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhzMS5jX3N0cigpLCBzMi5jX3N0cigpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFNraXAgdGhlIGVxdWFsIGhlYWRzLgorICBjb25zdCB0eXBlbmFtZSBTdHJpbmdUeXBlOjp2YWx1ZV90eXBlIG51bCA9IDA7CisgIGNvbnN0IHNpemVfdCBpMSA9IHMxLmZpbmQobnVsKSwgaTIgPSBzMi5maW5kKG51bCk7CisKKyAgLy8gQXJlIHdlIGF0IHRoZSBlbmQgb2YgZWl0aGVyIHMxIG9yIHMyPworICBpZiAoaTEgPT0gU3RyaW5nVHlwZTo6bnBvcyB8fCBpMiA9PSBTdHJpbmdUeXBlOjpucG9zKSB7CisgICAgcmV0dXJuIGkxID09IGkyOworICB9CisKKyAgLy8gQXJlIHRoZSB0YWlscyBlcXVhbD8KKyAgcmV0dXJuIENhc2VJbnNlbnNpdGl2ZVN0cmluZ0VxdWFscyhzMS5zdWJzdHIoaTEgKyAxKSwgczIuc3Vic3RyKGkyICsgMSkpOworfQorCisvLyBTdHJpbmcgbWF0Y2hlcnMuCisKKy8vIEltcGxlbWVudHMgZXF1YWxpdHktYmFzZWQgc3RyaW5nIG1hdGNoZXJzIGxpa2UgU3RyRXEsIFN0ckNhc2VOZSwgYW5kIGV0Yy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorY2xhc3MgU3RyRXF1YWxpdHlNYXRjaGVyIHsKKyBwdWJsaWM6CisgIFN0ckVxdWFsaXR5TWF0Y2hlcihjb25zdCBTdHJpbmdUeXBlJiBzdHIsIGJvb2wgZXhwZWN0X2VxLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXNlX3NlbnNpdGl2ZSkKKyAgICAgIDogc3RyaW5nXyhzdHIpLCBleHBlY3RfZXFfKGV4cGVjdF9lcSksIGNhc2Vfc2Vuc2l0aXZlXyhjYXNlX3NlbnNpdGl2ZSkge30KKworICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToKKyAgLy8gICBjb25zdCBjaGFyKgorICAvLyAgIGNoYXIqCisgIC8vICAgY29uc3Qgd2NoYXJfdCoKKyAgLy8gICB3Y2hhcl90KgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAhZXhwZWN0X2VxXzsKKyAgICB9CisgICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbihTdHJpbmdUeXBlKHMpLCBsaXN0ZW5lcik7CisgIH0KKworICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gU3RyaW5nVHlwZS4KKyAgLy8KKyAgLy8gVGhpcyBpcyBhIHRlbXBsYXRlLCBub3QganVzdCBhIHBsYWluIGZ1bmN0aW9uIHdpdGggY29uc3QgU3RyaW5nVHlwZSYsCisgIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZWVTdHJpbmdUeXBlPgorICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBNYXRjaGVlU3RyaW5nVHlwZSYgcywKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKKyAgICBjb25zdCBTdHJpbmdUeXBlJiBzMihzKTsKKyAgICBjb25zdCBib29sIGVxID0gY2FzZV9zZW5zaXRpdmVfID8gczIgPT0gc3RyaW5nXyA6CisgICAgICAgIENhc2VJbnNlbnNpdGl2ZVN0cmluZ0VxdWFscyhzMiwgc3RyaW5nXyk7CisgICAgcmV0dXJuIGV4cGVjdF9lcV8gPT0gZXE7CisgIH0KKworICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgRGVzY3JpYmVUb0hlbHBlcihleHBlY3RfZXFfLCBvcyk7CisgIH0KKworICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICBEZXNjcmliZVRvSGVscGVyKCFleHBlY3RfZXFfLCBvcyk7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgRGVzY3JpYmVUb0hlbHBlcihib29sIGV4cGVjdF9lcSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8IChleHBlY3RfZXEgPyAiaXMgIiA6ICJpc24ndCAiKTsKKyAgICAqb3MgPDwgImVxdWFsIHRvICI7CisgICAgaWYgKCFjYXNlX3NlbnNpdGl2ZV8pIHsKKyAgICAgICpvcyA8PCAiKGlnbm9yaW5nIGNhc2UpICI7CisgICAgfQorICAgIFVuaXZlcnNhbFByaW50KHN0cmluZ18sIG9zKTsKKyAgfQorCisgIGNvbnN0IFN0cmluZ1R5cGUgc3RyaW5nXzsKKyAgY29uc3QgYm9vbCBleHBlY3RfZXFfOworICBjb25zdCBib29sIGNhc2Vfc2Vuc2l0aXZlXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFN0ckVxdWFsaXR5TWF0Y2hlcik7Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBIYXNTdWJzdHIoc3Vic3RyaW5nKSBtYXRjaGVyLCB3aGljaAorLy8gY2FuIGJlIHVzZWQgYXMgYSBNYXRjaGVyPFQ+IGFzIGxvbmcgYXMgVCBjYW4gYmUgY29udmVydGVkIHRvIGEKKy8vIHN0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorY2xhc3MgSGFzU3Vic3RyTWF0Y2hlciB7CisgcHVibGljOgorICBleHBsaWNpdCBIYXNTdWJzdHJNYXRjaGVyKGNvbnN0IFN0cmluZ1R5cGUmIHN1YnN0cmluZykKKyAgICAgIDogc3Vic3RyaW5nXyhzdWJzdHJpbmcpIHt9CisKKyAgLy8gQWNjZXB0cyBwb2ludGVyIHR5cGVzLCBwYXJ0aWN1bGFybHk6CisgIC8vICAgY29uc3QgY2hhcioKKyAgLy8gICBjaGFyKgorICAvLyAgIGNvbnN0IHdjaGFyX3QqCisgIC8vICAgd2NoYXJfdCoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgorICBib29sIE1hdGNoQW5kRXhwbGFpbihDaGFyVHlwZSogcywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gcyAhPSBOVUxMICYmIE1hdGNoQW5kRXhwbGFpbihTdHJpbmdUeXBlKHMpLCBsaXN0ZW5lcik7CisgIH0KKworICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gU3RyaW5nVHlwZS4KKyAgLy8KKyAgLy8gVGhpcyBpcyBhIHRlbXBsYXRlLCBub3QganVzdCBhIHBsYWluIGZ1bmN0aW9uIHdpdGggY29uc3QgU3RyaW5nVHlwZSYsCisgIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZWVTdHJpbmdUeXBlPgorICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBNYXRjaGVlU3RyaW5nVHlwZSYgcywKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKKyAgICBjb25zdCBTdHJpbmdUeXBlJiBzMihzKTsKKyAgICByZXR1cm4gczIuZmluZChzdWJzdHJpbmdfKSAhPSBTdHJpbmdUeXBlOjpucG9zOworICB9CisKKyAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIG1hdGNoZXMuCisgIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImhhcyBzdWJzdHJpbmcgIjsKKyAgICBVbml2ZXJzYWxQcmludChzdWJzdHJpbmdfLCBvcyk7CisgIH0KKworICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImhhcyBubyBzdWJzdHJpbmcgIjsKKyAgICBVbml2ZXJzYWxQcmludChzdWJzdHJpbmdfLCBvcyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFN0cmluZ1R5cGUgc3Vic3RyaW5nXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEhhc1N1YnN0ck1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgU3RhcnRzV2l0aChzdWJzdHJpbmcpIG1hdGNoZXIsIHdoaWNoCisvLyBjYW4gYmUgdXNlZCBhcyBhIE1hdGNoZXI8VD4gYXMgbG9uZyBhcyBUIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQorLy8gc3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+CitjbGFzcyBTdGFydHNXaXRoTWF0Y2hlciB7CisgcHVibGljOgorICBleHBsaWNpdCBTdGFydHNXaXRoTWF0Y2hlcihjb25zdCBTdHJpbmdUeXBlJiBwcmVmaXgpIDogcHJlZml4XyhwcmVmaXgpIHsKKyAgfQorCisgIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5OgorICAvLyAgIGNvbnN0IGNoYXIqCisgIC8vICAgY2hhcioKKyAgLy8gICBjb25zdCB3Y2hhcl90KgorICAvLyAgIHdjaGFyX3QqCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgcmV0dXJuIHMgIT0gTlVMTCAmJiBNYXRjaEFuZEV4cGxhaW4oU3RyaW5nVHlwZShzKSwgbGlzdGVuZXIpOworICB9CisKKyAgLy8gTWF0Y2hlcyBhbnl0aGluZyB0aGF0IGNhbiBjb252ZXJ0IHRvIFN0cmluZ1R5cGUuCisgIC8vCisgIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSwgbm90IGp1c3QgYSBwbGFpbiBmdW5jdGlvbiB3aXRoIGNvbnN0IFN0cmluZ1R5cGUmLAorICAvLyBiZWNhdXNlIFN0cmluZ1BpZWNlIGhhcyBzb21lIGludGVyZmVyaW5nIG5vbi1leHBsaWNpdCBjb25zdHJ1Y3RvcnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVlU3RyaW5nVHlwZT4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTWF0Y2hlZVN0cmluZ1R5cGUmIHMsCisgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7CisgICAgY29uc3QgU3RyaW5nVHlwZSYgczIocyk7CisgICAgcmV0dXJuIHMyLmxlbmd0aCgpID49IHByZWZpeF8ubGVuZ3RoKCkgJiYKKyAgICAgICAgczIuc3Vic3RyKDAsIHByZWZpeF8ubGVuZ3RoKCkpID09IHByZWZpeF87CisgIH0KKworICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJzdGFydHMgd2l0aCAiOworICAgIFVuaXZlcnNhbFByaW50KHByZWZpeF8sIG9zKTsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiZG9lc24ndCBzdGFydCB3aXRoICI7CisgICAgVW5pdmVyc2FsUHJpbnQocHJlZml4Xywgb3MpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBTdHJpbmdUeXBlIHByZWZpeF87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTdGFydHNXaXRoTWF0Y2hlcik7Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBFbmRzV2l0aChzdWJzdHJpbmcpIG1hdGNoZXIsIHdoaWNoCisvLyBjYW4gYmUgdXNlZCBhcyBhIE1hdGNoZXI8VD4gYXMgbG9uZyBhcyBUIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQorLy8gc3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+CitjbGFzcyBFbmRzV2l0aE1hdGNoZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRW5kc1dpdGhNYXRjaGVyKGNvbnN0IFN0cmluZ1R5cGUmIHN1ZmZpeCkgOiBzdWZmaXhfKHN1ZmZpeCkge30KKworICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToKKyAgLy8gICBjb25zdCBjaGFyKgorICAvLyAgIGNoYXIqCisgIC8vICAgY29uc3Qgd2NoYXJfdCoKKyAgLy8gICB3Y2hhcl90KgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIHJldHVybiBzICE9IE5VTEwgJiYgTWF0Y2hBbmRFeHBsYWluKFN0cmluZ1R5cGUocyksIGxpc3RlbmVyKTsKKyAgfQorCisgIC8vIE1hdGNoZXMgYW55dGhpbmcgdGhhdCBjYW4gY29udmVydCB0byBTdHJpbmdUeXBlLgorICAvLworICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwKKyAgLy8gYmVjYXVzZSBTdHJpbmdQaWVjZSBoYXMgc29tZSBpbnRlcmZlcmluZyBub24tZXhwbGljaXQgY29uc3RydWN0b3JzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlZVN0cmluZ1R5cGU+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLAorICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgeworICAgIGNvbnN0IFN0cmluZ1R5cGUmIHMyKHMpOworICAgIHJldHVybiBzMi5sZW5ndGgoKSA+PSBzdWZmaXhfLmxlbmd0aCgpICYmCisgICAgICAgIHMyLnN1YnN0cihzMi5sZW5ndGgoKSAtIHN1ZmZpeF8ubGVuZ3RoKCkpID09IHN1ZmZpeF87CisgIH0KKworICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJlbmRzIHdpdGggIjsKKyAgICBVbml2ZXJzYWxQcmludChzdWZmaXhfLCBvcyk7CisgIH0KKworICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImRvZXNuJ3QgZW5kIHdpdGggIjsKKyAgICBVbml2ZXJzYWxQcmludChzdWZmaXhfLCBvcyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFN0cmluZ1R5cGUgc3VmZml4XzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVuZHNXaXRoTWF0Y2hlcik7Cit9OworCisvLyBJbXBsZW1lbnRzIHBvbHltb3JwaGljIG1hdGNoZXJzIE1hdGNoZXNSZWdleChyZWdleCkgYW5kCisvLyBDb250YWluc1JlZ2V4KHJlZ2V4KSwgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSBNYXRjaGVyPFQ+IGFzIGxvbmcgYXMKKy8vIFQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZy4KK2NsYXNzIE1hdGNoZXNSZWdleE1hdGNoZXIgeworIHB1YmxpYzoKKyAgTWF0Y2hlc1JlZ2V4TWF0Y2hlcihjb25zdCBSRSogcmVnZXgsIGJvb2wgZnVsbF9tYXRjaCkKKyAgICAgIDogcmVnZXhfKHJlZ2V4KSwgZnVsbF9tYXRjaF8oZnVsbF9tYXRjaCkge30KKworICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToKKyAgLy8gICBjb25zdCBjaGFyKgorICAvLyAgIGNoYXIqCisgIC8vICAgY29uc3Qgd2NoYXJfdCoKKyAgLy8gICB3Y2hhcl90KgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIHJldHVybiBzICE9IE5VTEwgJiYgTWF0Y2hBbmRFeHBsYWluKGludGVybmFsOjpzdHJpbmcocyksIGxpc3RlbmVyKTsKKyAgfQorCisgIC8vIE1hdGNoZXMgYW55dGhpbmcgdGhhdCBjYW4gY29udmVydCB0byBpbnRlcm5hbDo6c3RyaW5nLgorICAvLworICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiwKKyAgLy8gYmVjYXVzZSBTdHJpbmdQaWVjZSBoYXMgc29tZSBpbnRlcmZlcmluZyBub24tZXhwbGljaXQgY29uc3RydWN0b3JzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgTWF0Y2hlZVN0cmluZ1R5cGU+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLAorICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgeworICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMyKHMpOworICAgIHJldHVybiBmdWxsX21hdGNoXyA/IFJFOjpGdWxsTWF0Y2goczIsICpyZWdleF8pIDoKKyAgICAgICAgUkU6OlBhcnRpYWxNYXRjaChzMiwgKnJlZ2V4Xyk7CisgIH0KKworICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8IChmdWxsX21hdGNoXyA/ICJtYXRjaGVzIiA6ICJjb250YWlucyIpCisgICAgICAgIDw8ICIgcmVndWxhciBleHByZXNzaW9uICI7CisgICAgVW5pdmVyc2FsUHJpbnRlcjxpbnRlcm5hbDo6c3RyaW5nPjo6UHJpbnQocmVnZXhfLT5wYXR0ZXJuKCksIG9zKTsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiZG9lc24ndCAiIDw8IChmdWxsX21hdGNoXyA/ICJtYXRjaCIgOiAiY29udGFpbiIpCisgICAgICAgIDw8ICIgcmVndWxhciBleHByZXNzaW9uICI7CisgICAgVW5pdmVyc2FsUHJpbnRlcjxpbnRlcm5hbDo6c3RyaW5nPjo6UHJpbnQocmVnZXhfLT5wYXR0ZXJuKCksIG9zKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8Y29uc3QgUkU+IHJlZ2V4XzsKKyAgY29uc3QgYm9vbCBmdWxsX21hdGNoXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1hdGNoZXNSZWdleE1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyBhIG1hdGNoZXIgdGhhdCBjb21wYXJlcyB0aGUgdHdvIGZpZWxkcyBvZiBhIDItdHVwbGUKKy8vIHVzaW5nIG9uZSBvZiB0aGUgPT0sIDw9LCA8LCBldGMsIG9wZXJhdG9ycy4gIFRoZSB0d28gZmllbGRzIGJlaW5nCisvLyBjb21wYXJlZCBkb24ndCBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgdHlwZS4KKy8vCisvLyBUaGUgbWF0Y2hlciBkZWZpbmVkIGhlcmUgaXMgcG9seW1vcnBoaWMgKGZvciBleGFtcGxlLCBFcSgpIGNhbiBiZQorLy8gdXNlZCB0byBtYXRjaCBhIHR1cGxlPGludCwgc2hvcnQ+LCBhIHR1cGxlPGNvbnN0IGxvbmcmLCBkb3VibGU+LAorLy8gZXRjKS4gIFRoZXJlZm9yZSB3ZSB1c2UgYSB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgaW4gdGhlCisvLyBpbXBsZW1lbnRhdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBELCB0eXBlbmFtZSBPcD4KK2NsYXNzIFBhaXJNYXRjaEJhc2UgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgb3BlcmF0b3IgTWF0Y2hlcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gPik7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4mPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8Y29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+Jj4pOworICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgOjpzdGQ6Om9zdHJlYW0mIEdldERlc2MoOjpzdGQ6Om9zdHJlYW0mIG9zKSB7ICAvLyBOT0xJTlQKKyAgICByZXR1cm4gb3MgPDwgRDo6RGVzYygpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VHVwbGU+IHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKAorICAgICAgICBUdXBsZSBhcmdzLAorICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgeworICAgICAgcmV0dXJuIE9wKCkoOjp0ZXN0aW5nOjpnZXQ8MD4oYXJncyksIDo6dGVzdGluZzo6Z2V0PDE+KGFyZ3MpKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICAqb3MgPDwgImFyZSAiIDw8IEdldERlc2M7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICAqb3MgPDwgImFyZW4ndCAiIDw8IEdldERlc2M7CisgICAgfQorICB9OworfTsKKworY2xhc3MgRXEyTWF0Y2hlciA6IHB1YmxpYyBQYWlyTWF0Y2hCYXNlPEVxMk1hdGNoZXIsIEFueUVxPiB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJhbiBlcXVhbCBwYWlyIjsgfQorfTsKK2NsYXNzIE5lMk1hdGNoZXIgOiBwdWJsaWMgUGFpck1hdGNoQmFzZTxOZTJNYXRjaGVyLCBBbnlOZT4geworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiYW4gdW5lcXVhbCBwYWlyIjsgfQorfTsKK2NsYXNzIEx0Mk1hdGNoZXIgOiBwdWJsaWMgUGFpck1hdGNoQmFzZTxMdDJNYXRjaGVyLCBBbnlMdD4geworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA8IHRoZSBzZWNvbmQiOyB9Cit9OworY2xhc3MgR3QyTWF0Y2hlciA6IHB1YmxpYyBQYWlyTWF0Y2hCYXNlPEd0Mk1hdGNoZXIsIEFueUd0PiB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJhIHBhaXIgd2hlcmUgdGhlIGZpcnN0ID4gdGhlIHNlY29uZCI7IH0KK307CitjbGFzcyBMZTJNYXRjaGVyIDogcHVibGljIFBhaXJNYXRjaEJhc2U8TGUyTWF0Y2hlciwgQW55TGU+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPD0gdGhlIHNlY29uZCI7IH0KK307CitjbGFzcyBHZTJNYXRjaGVyIDogcHVibGljIFBhaXJNYXRjaEJhc2U8R2UyTWF0Y2hlciwgQW55R2U+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPj0gdGhlIHNlY29uZCI7IH0KK307CisKKy8vIEltcGxlbWVudHMgdGhlIE5vdCguLi4pIG1hdGNoZXIgZm9yIGEgcGFydGljdWxhciBhcmd1bWVudCB0eXBlIFQuCisvLyBXZSBkbyBub3QgbmVzdCBpdCBpbnNpZGUgdGhlIE5vdE1hdGNoZXIgY2xhc3MgdGVtcGxhdGUsIGFzIHRoYXQKKy8vIHdpbGwgcHJldmVudCBkaWZmZXJlbnQgaW5zdGFudGlhdGlvbnMgb2YgTm90TWF0Y2hlciBmcm9tIHNoYXJpbmcKKy8vIHRoZSBzYW1lIE5vdE1hdGNoZXJJbXBsPFQ+IGNsYXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBOb3RNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE5vdE1hdGNoZXJJbXBsKGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIpCisgICAgICA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9CisKKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgcmV0dXJuICFtYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oeCwgbGlzdGVuZXIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhOb3RNYXRjaGVySW1wbCk7Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBOb3QobSkgbWF0Y2hlciwgd2hpY2ggbWF0Y2hlcyBhIHZhbHVlIHRoYXQgZG9lc24ndAorLy8gbWF0Y2ggbWF0Y2hlciBtLgordGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KK2NsYXNzIE5vdE1hdGNoZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTm90TWF0Y2hlcihJbm5lck1hdGNoZXIgbWF0Y2hlcikgOiBtYXRjaGVyXyhtYXRjaGVyKSB7fQorCisgIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBOb3QobSkgdG8gYmUgdXNlZAorICAvLyB0byBtYXRjaCBhbnkgdHlwZSBtIGNhbiBtYXRjaC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IE5vdE1hdGNoZXJJbXBsPFQ+KFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVyXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgSW5uZXJNYXRjaGVyIG1hdGNoZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTm90TWF0Y2hlcik7Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBBbGxPZihtMSwgbTIpIG1hdGNoZXIgZm9yIGEgcGFydGljdWxhciBhcmd1bWVudCB0eXBlCisvLyBULiBXZSBkbyBub3QgbmVzdCBpdCBpbnNpZGUgdGhlIEJvdGhPZk1hdGNoZXIgY2xhc3MgdGVtcGxhdGUsIGFzCisvLyB0aGF0IHdpbGwgcHJldmVudCBkaWZmZXJlbnQgaW5zdGFudGlhdGlvbnMgb2YgQm90aE9mTWF0Y2hlciBmcm9tCisvLyBzaGFyaW5nIHRoZSBzYW1lIEJvdGhPZk1hdGNoZXJJbXBsPFQ+IGNsYXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBCb3RoT2ZNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyBwdWJsaWM6CisgIEJvdGhPZk1hdGNoZXJJbXBsKGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIxLCBjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyMikKKyAgICAgIDogbWF0Y2hlcjFfKG1hdGNoZXIxKSwgbWF0Y2hlcjJfKG1hdGNoZXIyKSB7fQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiKCI7CisgICAgbWF0Y2hlcjFfLkRlc2NyaWJlVG8ob3MpOworICAgICpvcyA8PCAiKSBhbmQgKCI7CisgICAgbWF0Y2hlcjJfLkRlc2NyaWJlVG8ob3MpOworICAgICpvcyA8PCAiKSI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiKCI7CisgICAgbWF0Y2hlcjFfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7CisgICAgKm9zIDw8ICIpIG9yICgiOworICAgIG1hdGNoZXIyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICAgICpvcyA8PCAiKSI7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAvLyBJZiBlaXRoZXIgbWF0Y2hlcjFfIG9yIG1hdGNoZXIyXyBkb2Vzbid0IG1hdGNoIHgsIHdlIG9ubHkgbmVlZAorICAgIC8vIHRvIGV4cGxhaW4gd2h5IG9uZSBvZiB0aGVtIGZhaWxzLgorICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIxOworICAgIGlmICghbWF0Y2hlcjFfLk1hdGNoQW5kRXhwbGFpbih4LCAmbGlzdGVuZXIxKSkgeworICAgICAgKmxpc3RlbmVyIDw8IGxpc3RlbmVyMS5zdHIoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMjsKKyAgICBpZiAoIW1hdGNoZXIyXy5NYXRjaEFuZEV4cGxhaW4oeCwgJmxpc3RlbmVyMikpIHsKKyAgICAgICpsaXN0ZW5lciA8PCBsaXN0ZW5lcjIuc3RyKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gZXhwbGFpbiB3aHkgKmJvdGgqIG9mIHRoZW0gbWF0Y2guCisgICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyBzMSA9IGxpc3RlbmVyMS5zdHIoKTsKKyAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nIHMyID0gbGlzdGVuZXIyLnN0cigpOworCisgICAgaWYgKHMxID09ICIiKSB7CisgICAgICAqbGlzdGVuZXIgPDwgczI7CisgICAgfSBlbHNlIHsKKyAgICAgICpsaXN0ZW5lciA8PCBzMTsKKyAgICAgIGlmIChzMiAhPSAiIikgeworICAgICAgICAqbGlzdGVuZXIgPDwgIiwgYW5kICIgPDwgczI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBNYXRjaGVyPFQ+IG1hdGNoZXIxXzsKKyAgY29uc3QgTWF0Y2hlcjxUPiBtYXRjaGVyMl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhCb3RoT2ZNYXRjaGVySW1wbCk7Cit9OworCisjaWYgR1RFU1RfTEFOR19DWFgxMQorLy8gTWF0Y2hlckxpc3QgcHJvdmlkZXMgbWVjaGFuaXNtcyBmb3Igc3RvcmluZyBhIHZhcmlhYmxlIG51bWJlciBvZiBtYXRjaGVycyBpbgorLy8gYSBsaXN0IHN0cnVjdHVyZSAoTGlzdFR5cGUpIGFuZCBjcmVhdGluZyBhIGNvbWJpbmluZyBtYXRjaGVyIGZyb20gc3VjaCBhCisvLyBsaXN0LgorLy8gVGhlIHRlbXBsYXRlIGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgdXNpbmcgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSBwYXJhbXRlcnM6CisvLyAgICoga1NpemUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgTWF0Y2hlckxpc3QuCisvLyAgICogSGVhZCBpcyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgbWF0Y2hlciBvZiB0aGUgbGlzdC4KKy8vICAgKiBUYWlsIGRlbm90ZXMgdGhlIHR5cGVzIG9mIHRoZSByZW1haW5pbmcgbWF0Y2hlcnMgb2YgdGhlIGxpc3QuCit0ZW1wbGF0ZSA8aW50IGtTaXplLCB0eXBlbmFtZSBIZWFkLCB0eXBlbmFtZS4uLiBUYWlsPgorc3RydWN0IE1hdGNoZXJMaXN0IHsKKyAgdHlwZWRlZiBNYXRjaGVyTGlzdDxrU2l6ZSAtIDEsIFRhaWwuLi4+IE1hdGNoZXJMaXN0VGFpbDsKKyAgdHlwZWRlZiA6OnN0ZDo6cGFpcjxIZWFkLCB0eXBlbmFtZSBNYXRjaGVyTGlzdFRhaWw6Okxpc3RUeXBlPiBMaXN0VHlwZTsKKworICAvLyBCdWlsZExpc3Qgc3RvcmVzIHZhcmlhZGljIHR5cGUgdmFsdWVzIGluIGEgbmVzdGVkIHBhaXIgc3RydWN0dXJlLgorICAvLyBFeGFtcGxlOgorICAvLyBNYXRjaGVyTGlzdDwzLCBpbnQsIHN0cmluZywgZmxvYXQ+OjpCdWlsZExpc3QoNSwgImZvbyIsIDIuMCkgd2lsbCByZXR1cm4KKyAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgcmVzdWx0IG9mIHR5cGUgcGFpcjxpbnQsIHBhaXI8c3RyaW5nLCBmbG9hdD4+LgorICBzdGF0aWMgTGlzdFR5cGUgQnVpbGRMaXN0KGNvbnN0IEhlYWQmIG1hdGNoZXIsIGNvbnN0IFRhaWwmLi4uIHRhaWwpIHsKKyAgICByZXR1cm4gTGlzdFR5cGUobWF0Y2hlciwgTWF0Y2hlckxpc3RUYWlsOjpCdWlsZExpc3QodGFpbC4uLikpOworICB9CisKKyAgLy8gQ3JlYXRlTWF0Y2hlcjxUPiBjcmVhdGVzIGEgTWF0Y2hlcjxUPiBmcm9tIGEgZ2l2ZW4gbGlzdCBvZiBtYXRjaGVycyAoYnVpbHQKKyAgLy8gYnkgQnVpbGRMaXN0KCkpLiBDb21iaW5pbmdNYXRjaGVyPFQ+IGlzIHVzZWQgdG8gY29tYmluZSB0aGUgbWF0Y2hlcnMgb2YgdGhlCisgIC8vIGxpc3QuIENvbWJpbmluZ01hdGNoZXI8VD4gbXVzdCBpbXBsZW1lbnQgTWF0Y2hlckludGVyZmFjZTxUPiBhbmQgaGF2ZSBhCisgIC8vIGNvbnN0cnVjdG9yIHRha2luZyB0d28gTWF0Y2hlcjxUPnMgYXMgaW5wdXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0ZW1wbGF0ZSA8dHlwZW5hbWUgLyogVCAqLz4gY2xhc3MgQ29tYmluaW5nTWF0Y2hlcj4KKyAgc3RhdGljIE1hdGNoZXI8VD4gQ3JlYXRlTWF0Y2hlcihjb25zdCBMaXN0VHlwZSYgbWF0Y2hlcnMpIHsKKyAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgQ29tYmluaW5nTWF0Y2hlcjxUPigKKyAgICAgICAgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXJzLmZpcnN0KSwKKyAgICAgICAgTWF0Y2hlckxpc3RUYWlsOjp0ZW1wbGF0ZSBDcmVhdGVNYXRjaGVyPFQsIENvbWJpbmluZ01hdGNoZXI+KAorICAgICAgICAgICAgbWF0Y2hlcnMuc2Vjb25kKSkpOworICB9Cit9OworCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgdGhlIGJhc2UgY2FzZSBmb3IgdGhlIHJlY3Vyc2l2ZSBkZWZpbml0aW9uIG9mCisvLyBNYXRjaGVyTGlzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyMSwgdHlwZW5hbWUgTWF0Y2hlcjI+CitzdHJ1Y3QgTWF0Y2hlckxpc3Q8MiwgTWF0Y2hlcjEsIE1hdGNoZXIyPiB7CisgIHR5cGVkZWYgOjpzdGQ6OnBhaXI8TWF0Y2hlcjEsIE1hdGNoZXIyPiBMaXN0VHlwZTsKKworICBzdGF0aWMgTGlzdFR5cGUgQnVpbGRMaXN0KGNvbnN0IE1hdGNoZXIxJiBtYXRjaGVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXRjaGVyMiYgbWF0Y2hlcjIpIHsKKyAgICByZXR1cm4gOjpzdGQ6OnBhaXI8TWF0Y2hlcjEsIE1hdGNoZXIyPihtYXRjaGVyMSwgbWF0Y2hlcjIpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHRlbXBsYXRlIDx0eXBlbmFtZSAvKiBUICovPiBjbGFzcyBDb21iaW5pbmdNYXRjaGVyPgorICBzdGF0aWMgTWF0Y2hlcjxUPiBDcmVhdGVNYXRjaGVyKGNvbnN0IExpc3RUeXBlJiBtYXRjaGVycykgeworICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBDb21iaW5pbmdNYXRjaGVyPFQ+KAorICAgICAgICBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcnMuZmlyc3QpLAorICAgICAgICBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcnMuc2Vjb25kKSkpOworICB9Cit9OworCisvLyBWYXJpYWRpY01hdGNoZXIgaXMgdXNlZCBmb3IgdGhlIHZhcmlhZGljIGltcGxlbWVudGF0aW9uIG9mCisvLyBBbGxPZihtXzEsIG1fMiwgLi4uKSBhbmQgQW55T2YobV8xLCBtXzIsIC4uLikuCisvLyBDb21iaW5pbmdNYXRjaGVyPFQ+IGlzIHVzZWQgdG8gcmVjdXJzaXZlbHkgY29tYmluZSB0aGUgcHJvdmlkZWQgbWF0Y2hlcnMKKy8vIChvZiB0eXBlIEFyZ3MuLi4pLgordGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBDb21iaW5pbmdNYXRjaGVyLCB0eXBlbmFtZS4uLiBBcmdzPgorY2xhc3MgVmFyaWFkaWNNYXRjaGVyIHsKKyBwdWJsaWM6CisgIFZhcmlhZGljTWF0Y2hlcihjb25zdCBBcmdzJi4uLiBtYXRjaGVycykgIC8vIE5PTElOVAorICAgICAgOiBtYXRjaGVyc18oTWF0Y2hlckxpc3RUeXBlOjpCdWlsZExpc3QobWF0Y2hlcnMuLi4pKSB7fQorCisgIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBhbgorICAvLyBWYXJpYWRpY01hdGNoZXI8TWF0Y2hlcjEsIE1hdGNoZXIyLi4uPiBvYmplY3QgdG8gbWF0Y2ggYW55IHR5cGUgdGhhdAorICAvLyBhbGwgb2YgdGhlIHByb3ZpZGVkIG1hdGNoZXJzIChNYXRjaGVyMSwgTWF0Y2hlcjIsIC4uLikgY2FuIG1hdGNoLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWF0Y2hlckxpc3RUeXBlOjp0ZW1wbGF0ZSBDcmVhdGVNYXRjaGVyPFQsIENvbWJpbmluZ01hdGNoZXI+KAorICAgICAgICBtYXRjaGVyc18pOworICB9CisKKyBwcml2YXRlOgorICB0eXBlZGVmIE1hdGNoZXJMaXN0PHNpemVvZi4uLihBcmdzKSwgQXJncy4uLj4gTWF0Y2hlckxpc3RUeXBlOworCisgIGNvbnN0IHR5cGVuYW1lIE1hdGNoZXJMaXN0VHlwZTo6TGlzdFR5cGUgbWF0Y2hlcnNfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVmFyaWFkaWNNYXRjaGVyKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgordXNpbmcgQWxsT2ZNYXRjaGVyID0gVmFyaWFkaWNNYXRjaGVyPEJvdGhPZk1hdGNoZXJJbXBsLCBBcmdzLi4uPjsKKworI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCisKKy8vIFVzZWQgZm9yIGltcGxlbWVudGluZyB0aGUgQWxsT2YobV8xLCAuLi4sIG1fbikgbWF0Y2hlciwgd2hpY2gKKy8vIG1hdGNoZXMgYSB2YWx1ZSB0aGF0IG1hdGNoZXMgYWxsIG9mIHRoZSBtYXRjaGVycyBtXzEsIC4uLiwgYW5kIG1fbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyMSwgdHlwZW5hbWUgTWF0Y2hlcjI+CitjbGFzcyBCb3RoT2ZNYXRjaGVyIHsKKyBwdWJsaWM6CisgIEJvdGhPZk1hdGNoZXIoTWF0Y2hlcjEgbWF0Y2hlcjEsIE1hdGNoZXIyIG1hdGNoZXIyKQorICAgICAgOiBtYXRjaGVyMV8obWF0Y2hlcjEpLCBtYXRjaGVyMl8obWF0Y2hlcjIpIHt9CisKKyAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIGEKKyAgLy8gQm90aE9mTWF0Y2hlcjxNYXRjaGVyMSwgTWF0Y2hlcjI+IG9iamVjdCB0byBtYXRjaCBhbnkgdHlwZSB0aGF0CisgIC8vIGJvdGggTWF0Y2hlcjEgYW5kIE1hdGNoZXIyIGNhbiBtYXRjaC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IEJvdGhPZk1hdGNoZXJJbXBsPFQ+KFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVyMV8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcjJfKSkpOworICB9CisKKyBwcml2YXRlOgorICBNYXRjaGVyMSBtYXRjaGVyMV87CisgIE1hdGNoZXIyIG1hdGNoZXIyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEJvdGhPZk1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyB0aGUgQW55T2YobTEsIG0yKSBtYXRjaGVyIGZvciBhIHBhcnRpY3VsYXIgYXJndW1lbnQgdHlwZQorLy8gVC4gIFdlIGRvIG5vdCBuZXN0IGl0IGluc2lkZSB0aGUgQW55T2ZNYXRjaGVyIGNsYXNzIHRlbXBsYXRlLCBhcworLy8gdGhhdCB3aWxsIHByZXZlbnQgZGlmZmVyZW50IGluc3RhbnRpYXRpb25zIG9mIEFueU9mTWF0Y2hlciBmcm9tCisvLyBzaGFyaW5nIHRoZSBzYW1lIEVpdGhlck9mTWF0Y2hlckltcGw8VD4gY2xhc3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEVpdGhlck9mTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7CisgcHVibGljOgorICBFaXRoZXJPZk1hdGNoZXJJbXBsKGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIxLCBjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyMikKKyAgICAgIDogbWF0Y2hlcjFfKG1hdGNoZXIxKSwgbWF0Y2hlcjJfKG1hdGNoZXIyKSB7fQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiKCI7CisgICAgbWF0Y2hlcjFfLkRlc2NyaWJlVG8ob3MpOworICAgICpvcyA8PCAiKSBvciAoIjsKKyAgICBtYXRjaGVyMl8uRGVzY3JpYmVUbyhvcyk7CisgICAgKm9zIDw8ICIpIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICIoIjsKKyAgICBtYXRjaGVyMV8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKKyAgICAqb3MgPDwgIikgYW5kICgiOworICAgIG1hdGNoZXIyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICAgICpvcyA8PCAiKSI7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAvLyBJZiBlaXRoZXIgbWF0Y2hlcjFfIG9yIG1hdGNoZXIyXyBtYXRjaGVzIHgsIHdlIGp1c3QgbmVlZCB0bworICAgIC8vIGV4cGxhaW4gd2h5ICpvbmUqIG9mIHRoZW0gbWF0Y2hlcy4KKyAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMTsKKyAgICBpZiAobWF0Y2hlcjFfLk1hdGNoQW5kRXhwbGFpbih4LCAmbGlzdGVuZXIxKSkgeworICAgICAgKmxpc3RlbmVyIDw8IGxpc3RlbmVyMS5zdHIoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIyOworICAgIGlmIChtYXRjaGVyMl8uTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcjIpKSB7CisgICAgICAqbGlzdGVuZXIgPDwgbGlzdGVuZXIyLnN0cigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gZXhwbGFpbiB3aHkgKmJvdGgqIG9mIHRoZW0gZmFpbC4KKyAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nIHMxID0gbGlzdGVuZXIxLnN0cigpOworICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczIgPSBsaXN0ZW5lcjIuc3RyKCk7CisKKyAgICBpZiAoczEgPT0gIiIpIHsKKyAgICAgICpsaXN0ZW5lciA8PCBzMjsKKyAgICB9IGVsc2UgeworICAgICAgKmxpc3RlbmVyIDw8IHMxOworICAgICAgaWYgKHMyICE9ICIiKSB7CisgICAgICAgICpsaXN0ZW5lciA8PCAiLCBhbmQgIiA8PCBzMjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBNYXRjaGVyPFQ+IG1hdGNoZXIxXzsKKyAgY29uc3QgTWF0Y2hlcjxUPiBtYXRjaGVyMl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFaXRoZXJPZk1hdGNoZXJJbXBsKTsKK307CisKKyNpZiBHVEVTVF9MQU5HX0NYWDExCisvLyBBbnlPZk1hdGNoZXIgaXMgdXNlZCBmb3IgdGhlIHZhcmlhZGljIGltcGxlbWVudGF0aW9uIG9mIEFueU9mKG1fMSwgbV8yLCAuLi4pLgordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Cit1c2luZyBBbnlPZk1hdGNoZXIgPSBWYXJpYWRpY01hdGNoZXI8RWl0aGVyT2ZNYXRjaGVySW1wbCwgQXJncy4uLj47CisKKyNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQorCisvLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIEFueU9mKG1fMSwgLi4uLCBtX24pIG1hdGNoZXIsIHdoaWNoCisvLyBtYXRjaGVzIGEgdmFsdWUgdGhhdCBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgbWF0Y2hlcnMgbV8xLCAuLi4sCisvLyBhbmQgbV9uLgordGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXIxLCB0eXBlbmFtZSBNYXRjaGVyMj4KK2NsYXNzIEVpdGhlck9mTWF0Y2hlciB7CisgcHVibGljOgorICBFaXRoZXJPZk1hdGNoZXIoTWF0Y2hlcjEgbWF0Y2hlcjEsIE1hdGNoZXIyIG1hdGNoZXIyKQorICAgICAgOiBtYXRjaGVyMV8obWF0Y2hlcjEpLCBtYXRjaGVyMl8obWF0Y2hlcjIpIHt9CisKKyAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIGEKKyAgLy8gRWl0aGVyT2ZNYXRjaGVyPE1hdGNoZXIxLCBNYXRjaGVyMj4gb2JqZWN0IHRvIG1hdGNoIGFueSB0eXBlIHRoYXQKKyAgLy8gYm90aCBNYXRjaGVyMSBhbmQgTWF0Y2hlcjIgY2FuIG1hdGNoLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgRWl0aGVyT2ZNYXRjaGVySW1wbDxUPigKKyAgICAgICAgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIxXyksIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVyMl8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIE1hdGNoZXIxIG1hdGNoZXIxXzsKKyAgTWF0Y2hlcjIgbWF0Y2hlcjJfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWl0aGVyT2ZNYXRjaGVyKTsKK307CisKKy8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBUcnVseShwcmVkKSwgd2hpY2ggdHVybnMgYSBwcmVkaWNhdGUgaW50byBhCisvLyBtYXRjaGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWRpY2F0ZT4KK2NsYXNzIFRydWx5TWF0Y2hlciB7CisgcHVibGljOgorICBleHBsaWNpdCBUcnVseU1hdGNoZXIoUHJlZGljYXRlIHByZWQpIDogcHJlZGljYXRlXyhwcmVkKSB7fQorCisgIC8vIFRoaXMgbWV0aG9kIHRlbXBsYXRlIGFsbG93cyBUcnVseShwcmVkKSB0byBiZSB1c2VkIGFzIGEgbWF0Y2hlcgorICAvLyBmb3IgdHlwZSBUIHdoZXJlIFQgaXMgdGhlIGFyZ3VtZW50IHR5cGUgb2YgcHJlZGljYXRlICdwcmVkJy4gIFRoZQorICAvLyBhcmd1bWVudCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIGFzIHRoZSBwcmVkaWNhdGUgbWF5IGJlCisgIC8vIGludGVyZXN0ZWQgaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGFyZ3VtZW50LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCYgeCwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgeworICAgIC8vIFdpdGhvdXQgdGhlIGlmLXN0YXRlbWVudCwgTVNWQyBzb21ldGltZXMgd2FybnMgYWJvdXQgY29udmVydGluZworICAgIC8vIGEgdmFsdWUgdG8gYm9vbCAod2FybmluZyA0ODAwKS4KKyAgICAvLworICAgIC8vIFdlIGNhbm5vdCB3cml0ZSAncmV0dXJuICEhcHJlZGljYXRlXyh4KTsnIGFzIHRoYXQgZG9lc24ndCB3b3JrCisgICAgLy8gd2hlbiBwcmVkaWNhdGVfKHgpIHJldHVybnMgYSBjbGFzcyBjb252ZXJ0aWJsZSB0byBib29sIGJ1dAorICAgIC8vIGhhdmluZyBubyBvcGVyYXRvciEoKS4KKyAgICBpZiAocHJlZGljYXRlXyh4KSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgInNhdGlzZmllcyB0aGUgZ2l2ZW4gcHJlZGljYXRlIjsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiZG9lc24ndCBzYXRpc2Z5IHRoZSBnaXZlbiBwcmVkaWNhdGUiOworICB9CisKKyBwcml2YXRlOgorICBQcmVkaWNhdGUgcHJlZGljYXRlXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFRydWx5TWF0Y2hlcik7Cit9OworCisvLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgTWF0Y2hlcyhtYXRjaGVyKSwgd2hpY2ggdHVybnMgYSBtYXRjaGVyIGludG8KKy8vIGEgcHJlZGljYXRlLgordGVtcGxhdGUgPHR5cGVuYW1lIE0+CitjbGFzcyBNYXRjaGVyQXNQcmVkaWNhdGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWF0Y2hlckFzUHJlZGljYXRlKE0gbWF0Y2hlcikgOiBtYXRjaGVyXyhtYXRjaGVyKSB7fQorCisgIC8vIFRoaXMgdGVtcGxhdGUgb3BlcmF0b3IoKSBhbGxvd3MgTWF0Y2hlcyhtKSB0byBiZSB1c2VkIGFzIGEKKyAgLy8gcHJlZGljYXRlIG9uIHR5cGUgVCB3aGVyZSBtIGlzIGEgbWF0Y2hlciBvbiB0eXBlIFQuCisgIC8vCisgIC8vIFRoZSBhcmd1bWVudCB4IGlzIHBhc3NlZCBieSByZWZlcmVuY2UgaW5zdGVhZCBvZiBieSB2YWx1ZSwgYXMKKyAgLy8gc29tZSBtYXRjaGVyIG1heSBiZSBpbnRlcmVzdGVkIGluIGl0cyBhZGRyZXNzIChlLmcuIGFzIGluCisgIC8vIE1hdGNoZXMoUmVmKG4pKSh4KSkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgeCkgY29uc3QgeworICAgIC8vIFdlIGxldCBtYXRjaGVyXyBjb21taXQgdG8gYSBwYXJ0aWN1bGFyIHR5cGUgaGVyZSBpbnN0ZWFkIG9mCisgICAgLy8gd2hlbiB0aGUgTWF0Y2hlckFzUHJlZGljYXRlIG9iamVjdCB3YXMgY29uc3RydWN0ZWQuICBUaGlzCisgICAgLy8gYWxsb3dzIHVzIHRvIHdyaXRlIE1hdGNoZXMobSkgd2hlcmUgbSBpcyBhIHBvbHltb3JwaGljIG1hdGNoZXIKKyAgICAvLyAoZS5nLiBFcSg1KSkuCisgICAgLy8KKyAgICAvLyBJZiB3ZSB3cml0ZSBNYXRjaGVyPFQ+KG1hdGNoZXJfKS5NYXRjaGVzKHgpIGhlcmUsIGl0IHdvbid0CisgICAgLy8gY29tcGlsZSB3aGVuIG1hdGNoZXJfIGhhcyB0eXBlIE1hdGNoZXI8Y29uc3QgVCY+OyBpZiB3ZSB3cml0ZQorICAgIC8vIE1hdGNoZXI8Y29uc3QgVCY+KG1hdGNoZXJfKS5NYXRjaGVzKHgpIGhlcmUsIGl0IHdvbid0IGNvbXBpbGUKKyAgICAvLyB3aGVuIG1hdGNoZXJfIGhhcyB0eXBlIE1hdGNoZXI8VD47IGlmIHdlIGp1c3Qgd3JpdGUKKyAgICAvLyBtYXRjaGVyXy5NYXRjaGVzKHgpLCBpdCB3b24ndCBjb21waWxlIHdoZW4gbWF0Y2hlcl8gaXMKKyAgICAvLyBwb2x5bW9ycGhpYywgZS5nLiBFcSg1KS4KKyAgICAvLworICAgIC8vIE1hdGNoZXJDYXN0PGNvbnN0IFQmPigpIGlzIG5lY2Vzc2FyeSBmb3IgbWFraW5nIHRoZSBjb2RlIHdvcmsKKyAgICAvLyBpbiBhbGwgb2YgdGhlIGFib3ZlIHNpdHVhdGlvbnMuCisgICAgcmV0dXJuIE1hdGNoZXJDYXN0PGNvbnN0IFQmPihtYXRjaGVyXykuTWF0Y2hlcyh4KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgTSBtYXRjaGVyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1hdGNoZXJBc1ByZWRpY2F0ZSk7Cit9OworCisvLyBGb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9USEFUKCkgYW5kIEVYUEVDVF9USEFUKCkuICBUaGUgdGVtcGxhdGUKKy8vIGFyZ3VtZW50IE0gbXVzdCBiZSBhIHR5cGUgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEgbWF0Y2hlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNPgorY2xhc3MgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIoTSBtKSA6IG1hdGNoZXJfKGludGVybmFsOjptb3ZlKG0pKSB7fQorCisgIC8vIFRoaXMgdGVtcGxhdGUgKCkgb3BlcmF0b3IgYWxsb3dzIGEgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIKKyAgLy8gb2JqZWN0IHRvIGFjdCBhcyBhIHByZWRpY2F0ZS1mb3JtYXR0ZXIgc3VpdGFibGUgZm9yIHVzaW5nIHdpdGgKKyAgLy8gR29vZ2xlIFRlc3QncyBFWFBFQ1RfUFJFRF9GT1JNQVQxKCkgbWFjcm8uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiB2YWx1ZV90ZXh0LCBjb25zdCBUJiB4KSBjb25zdCB7CisgICAgLy8gV2UgY29udmVydCBtYXRjaGVyXyB0byBhIE1hdGNoZXI8Y29uc3QgVCY+ICpub3cqIGluc3RlYWQgb2YKKyAgICAvLyB3aGVuIHRoZSBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlciBvYmplY3Qgd2FzIGNvbnN0cnVjdGVkLAorICAgIC8vIGFzIG1hdGNoZXJfIG1heSBiZSBwb2x5bW9ycGhpYyAoZS5nLiBOb3ROdWxsKCkpIGFuZCB3ZSB3b24ndAorICAgIC8vIGtub3cgd2hpY2ggdHlwZSB0byBpbnN0YW50aWF0ZSBpdCB0byB1bnRpbCB3ZSBhY3R1YWxseSBzZWUgdGhlCisgICAgLy8gdHlwZSBvZiB4IGhlcmUuCisgICAgLy8KKyAgICAvLyBXZSB3cml0ZSBTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXJfKSBpbnN0ZWFkIG9mCisgICAgLy8gTWF0Y2hlcjxjb25zdCBUJj4obWF0Y2hlcl8pLCBhcyB0aGUgbGF0dGVyIHdvbid0IGNvbXBpbGUgd2hlbgorICAgIC8vIG1hdGNoZXJfIGhhcyB0eXBlIE1hdGNoZXI8VD4gKGUuZy4gQW48aW50PigpKS4KKyAgICAvLyBXZSBkb24ndCB3cml0ZSBNYXRjaGVyQ2FzdDxjb25zdCBUJj4gZWl0aGVyLCBhcyB0aGF0IGFsbG93cworICAgIC8vIHBvdGVudGlhbGx5IHVuc2FmZSBkb3duY2FzdGluZyBvZiB0aGUgbWF0Y2hlciBhcmd1bWVudC4KKyAgICBjb25zdCBNYXRjaGVyPGNvbnN0IFQmPiBtYXRjaGVyID0gU2FmZU1hdGNoZXJDYXN0PGNvbnN0IFQmPihtYXRjaGVyXyk7CisgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsKKyAgICBpZiAoTWF0Y2hQcmludEFuZEV4cGxhaW4oeCwgbWF0Y2hlciwgJmxpc3RlbmVyKSkKKyAgICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8ICJWYWx1ZSBvZjogIiA8PCB2YWx1ZV90ZXh0IDw8ICJcbiIKKyAgICAgICA8PCAiRXhwZWN0ZWQ6ICI7CisgICAgbWF0Y2hlci5EZXNjcmliZVRvKCZzcyk7CisgICAgc3MgPDwgIlxuICBBY3R1YWw6ICIgPDwgbGlzdGVuZXIuc3RyKCk7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBzcy5zdHIoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgTSBtYXRjaGVyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyKTsKK307CisKKy8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIGEgbWF0Y2hlciB0byBhIHByZWRpY2F0ZS1mb3JtYXR0ZXIKKy8vIHdpdGhvdXQgdGhlIHVzZXIgbmVlZGluZyB0byBleHBsaWNpdGx5IHdyaXRlIHRoZSB0eXBlLiAgVGhpcyBpcworLy8gdXNlZCBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9USEFUKCkgYW5kIEVYUEVDVF9USEFUKCkuCisvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWw6ICdtYXRjaGVyJyBpcyByZWNlaXZlZCBieS12YWx1ZSB0byBmb3JjZSBkZWNheWluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNPgoraW5saW5lIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyPE0+CitNYWtlUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIoTSBtYXRjaGVyKSB7CisgIHJldHVybiBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcjxNPihpbnRlcm5hbDo6bW92ZShtYXRjaGVyKSk7Cit9CisKKy8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIGZsb2F0aW5nIHBvaW50IGVxdWFsaXR5IG1hdGNoZXIsIHdoaWNoIG1hdGNoZXMKKy8vIHR3byBmbG9hdCB2YWx1ZXMgdXNpbmcgVUxQLWJhc2VkIGFwcHJveGltYXRpb24gb3IsIG9wdGlvbmFsbHksIGEKKy8vIHVzZXItc3BlY2lmaWVkIGVwc2lsb24uICBUaGUgdGVtcGxhdGUgaXMgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIHdpdGgKKy8vIEZsb2F0VHlwZSBiZWluZyBlaXRoZXIgZmxvYXQgb3IgZG91YmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIEZsb2F0VHlwZT4KK2NsYXNzIEZsb2F0aW5nRXFNYXRjaGVyIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yIGZvciBGbG9hdGluZ0VxTWF0Y2hlci4KKyAgLy8gVGhlIG1hdGNoZXIncyBpbnB1dCB3aWxsIGJlIGNvbXBhcmVkIHdpdGggZXhwZWN0ZWQuICBUaGUgbWF0Y2hlciB0cmVhdHMgdHdvCisgIC8vIE5BTnMgYXMgZXF1YWwgaWYgbmFuX2VxX25hbiBpcyB0cnVlLiAgT3RoZXJ3aXNlLCB1bmRlciBJRUVFIHN0YW5kYXJkcywKKyAgLy8gZXF1YWxpdHkgY29tcGFyaXNvbnMgYmV0d2VlbiBOQU5zIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS4gIFdlIHNwZWNpZnkgYQorICAvLyBuZWdhdGl2ZSBtYXhfYWJzX2Vycm9yXyB0ZXJtIHRvIGluZGljYXRlIHRoYXQgVUxQLWJhc2VkIGFwcHJveGltYXRpb24gd2lsbAorICAvLyBiZSB1c2VkIGZvciBjb21wYXJpc29uLgorICBGbG9hdGluZ0VxTWF0Y2hlcihGbG9hdFR5cGUgZXhwZWN0ZWQsIGJvb2wgbmFuX2VxX25hbikgOgorICAgIGV4cGVjdGVkXyhleHBlY3RlZCksIG5hbl9lcV9uYW5fKG5hbl9lcV9uYW4pLCBtYXhfYWJzX2Vycm9yXygtMSkgeworICB9CisKKyAgLy8gQ29uc3RydWN0b3IgdGhhdCBzdXBwb3J0cyBhIHVzZXItc3BlY2lmaWVkIG1heF9hYnNfZXJyb3IgdGhhdCB3aWxsIGJlIHVzZWQKKyAgLy8gZm9yIGNvbXBhcmlzb24gaW5zdGVhZCBvZiBVTFAtYmFzZWQgYXBwcm94aW1hdGlvbi4gIFRoZSBtYXggYWJzb2x1dGUKKyAgLy8gc2hvdWxkIGJlIG5vbi1uZWdhdGl2ZS4KKyAgRmxvYXRpbmdFcU1hdGNoZXIoRmxvYXRUeXBlIGV4cGVjdGVkLCBib29sIG5hbl9lcV9uYW4sCisgICAgICAgICAgICAgICAgICAgIEZsb2F0VHlwZSBtYXhfYWJzX2Vycm9yKQorICAgICAgOiBleHBlY3RlZF8oZXhwZWN0ZWQpLAorICAgICAgICBuYW5fZXFfbmFuXyhuYW5fZXFfbmFuKSwKKyAgICAgICAgbWF4X2Fic19lcnJvcl8obWF4X2Fic19lcnJvcikgeworICAgIEdURVNUX0NIRUNLXyhtYXhfYWJzX2Vycm9yID49IDApCisgICAgICAgIDw8ICIsIHdoZXJlIG1heF9hYnNfZXJyb3IgaXMiIDw8IG1heF9hYnNfZXJyb3I7CisgIH0KKworICAvLyBJbXBsZW1lbnRzIGZsb2F0aW5nIHBvaW50IGVxdWFsaXR5IG1hdGNoZXIgYXMgYSBNYXRjaGVyPFQ+LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKKyAgIHB1YmxpYzoKKyAgICBJbXBsKEZsb2F0VHlwZSBleHBlY3RlZCwgYm9vbCBuYW5fZXFfbmFuLCBGbG9hdFR5cGUgbWF4X2Fic19lcnJvcikKKyAgICAgICAgOiBleHBlY3RlZF8oZXhwZWN0ZWQpLAorICAgICAgICAgIG5hbl9lcV9uYW5fKG5hbl9lcV9uYW4pLAorICAgICAgICAgIG1heF9hYnNfZXJyb3JfKG1heF9hYnNfZXJyb3IpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgICAgY29uc3QgRmxvYXRpbmdQb2ludDxGbG9hdFR5cGU+IGFjdHVhbCh2YWx1ZSksIGV4cGVjdGVkKGV4cGVjdGVkXyk7CisKKyAgICAgIC8vIENvbXBhcmVzIE5hTnMgZmlyc3QsIGlmIG5hbl9lcV9uYW5fIGlzIHRydWUuCisgICAgICBpZiAoYWN0dWFsLmlzX25hbigpIHx8IGV4cGVjdGVkLmlzX25hbigpKSB7CisgICAgICAgIGlmIChhY3R1YWwuaXNfbmFuKCkgJiYgZXhwZWN0ZWQuaXNfbmFuKCkpIHsKKyAgICAgICAgICByZXR1cm4gbmFuX2VxX25hbl87CisgICAgICAgIH0KKyAgICAgICAgLy8gT25lIGlzIG5hbjsgdGhlIG90aGVyIGlzIG5vdCBuYW4uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChIYXNNYXhBYnNFcnJvcigpKSB7CisgICAgICAgIC8vIFdlIHBlcmZvcm0gYW4gZXF1YWxpdHkgY2hlY2sgc28gdGhhdCBpbmYgd2lsbCBtYXRjaCBpbmYsIHJlZ2FyZGxlc3MKKyAgICAgICAgLy8gb2YgZXJyb3IgYm91bmRzLiAgSWYgdGhlIHJlc3VsdCBvZiB2YWx1ZSAtIGV4cGVjdGVkXyB3b3VsZCByZXN1bHQgaW4KKyAgICAgICAgLy8gb3ZlcmZsb3cgb3IgaWYgZWl0aGVyIHZhbHVlIGlzIGluZiwgdGhlIGRlZmF1bHQgcmVzdWx0IGlzIGluZmluaXR5LAorICAgICAgICAvLyB3aGljaCBzaG91bGQgb25seSBtYXRjaCBpZiBtYXhfYWJzX2Vycm9yXyBpcyBhbHNvIGluZmluaXR5LgorICAgICAgICBpZiAodmFsdWUgPT0gZXhwZWN0ZWRfKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBGbG9hdFR5cGUgZGlmZiA9IHZhbHVlIC0gZXhwZWN0ZWRfOworICAgICAgICBpZiAoZmFicyhkaWZmKSA8PSBtYXhfYWJzX2Vycm9yXykgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgeworICAgICAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgIiA8PCBkaWZmIDw8ICIgZnJvbSAiIDw8IGV4cGVjdGVkXzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYWN0dWFsLkFsbW9zdEVxdWFscyhleHBlY3RlZCk7CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICAvLyBvcy0+cHJlY2lzaW9uKCkgcmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgcHJlY2lzaW9uLCB3aGljaCB3ZQorICAgICAgLy8gc3RvcmUgdG8gcmVzdG9yZSB0aGUgb3N0cmVhbSB0byBpdHMgb3JpZ2luYWwgY29uZmlndXJhdGlvbgorICAgICAgLy8gYWZ0ZXIgb3V0cHV0dGluZy4KKyAgICAgIGNvbnN0IDo6c3RkOjpzdHJlYW1zaXplIG9sZF9wcmVjaXNpb24gPSBvcy0+cHJlY2lzaW9uKAorICAgICAgICAgIDo6c3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjpkaWdpdHMxMCArIDIpOworICAgICAgaWYgKEZsb2F0aW5nUG9pbnQ8RmxvYXRUeXBlPihleHBlY3RlZF8pLmlzX25hbigpKSB7CisgICAgICAgIGlmIChuYW5fZXFfbmFuXykgeworICAgICAgICAgICpvcyA8PCAiaXMgTmFOIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqb3MgPDwgIm5ldmVyIG1hdGNoZXMiOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAqb3MgPDwgImlzIGFwcHJveGltYXRlbHkgIiA8PCBleHBlY3RlZF87CisgICAgICAgIGlmIChIYXNNYXhBYnNFcnJvcigpKSB7CisgICAgICAgICAgKm9zIDw8ICIgKGFic29sdXRlIGVycm9yIDw9ICIgPDwgbWF4X2Fic19lcnJvcl8gPDwgIikiOworICAgICAgICB9CisgICAgICB9CisgICAgICBvcy0+cHJlY2lzaW9uKG9sZF9wcmVjaXNpb24pOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICAvLyBBcyBiZWZvcmUsIGdldCBvcmlnaW5hbCBwcmVjaXNpb24uCisgICAgICBjb25zdCA6OnN0ZDo6c3RyZWFtc2l6ZSBvbGRfcHJlY2lzaW9uID0gb3MtPnByZWNpc2lvbigKKyAgICAgICAgICA6OnN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6ZGlnaXRzMTAgKyAyKTsKKyAgICAgIGlmIChGbG9hdGluZ1BvaW50PEZsb2F0VHlwZT4oZXhwZWN0ZWRfKS5pc19uYW4oKSkgeworICAgICAgICBpZiAobmFuX2VxX25hbl8pIHsKKyAgICAgICAgICAqb3MgPDwgImlzbid0IE5hTiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKm9zIDw8ICJpcyBhbnl0aGluZyI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpvcyA8PCAiaXNuJ3QgYXBwcm94aW1hdGVseSAiIDw8IGV4cGVjdGVkXzsKKyAgICAgICAgaWYgKEhhc01heEFic0Vycm9yKCkpIHsKKyAgICAgICAgICAqb3MgPDwgIiAoYWJzb2x1dGUgZXJyb3IgPiAiIDw8IG1heF9hYnNfZXJyb3JfIDw8ICIpIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBwcmVjaXNpb24uCisgICAgICBvcy0+cHJlY2lzaW9uKG9sZF9wcmVjaXNpb24pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBib29sIEhhc01heEFic0Vycm9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1heF9hYnNfZXJyb3JfID49IDA7CisgICAgfQorCisgICAgY29uc3QgRmxvYXRUeXBlIGV4cGVjdGVkXzsKKyAgICBjb25zdCBib29sIG5hbl9lcV9uYW5fOworICAgIC8vIG1heF9hYnNfZXJyb3Igd2lsbCBiZSB1c2VkIGZvciB2YWx1ZSBjb21wYXJpc29uIHdoZW4gPj0gMC4KKyAgICBjb25zdCBGbG9hdFR5cGUgbWF4X2Fic19lcnJvcl87CisKKyAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOworICB9OworCisgIC8vIFRoZSBmb2xsb3dpbmcgMyB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFsbG93IEZsb2F0RXEoZXhwZWN0ZWQpIGFuZAorICAvLyBOYW5TZW5zaXRpdmVGbG9hdEVxKGV4cGVjdGVkKSB0byBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxmbG9hdD4sIGEKKyAgLy8gTWF0Y2hlcjxjb25zdCBmbG9hdCY+LCBvciBhIE1hdGNoZXI8ZmxvYXQmPiwgYnV0IG5vdGhpbmcgZWxzZS4KKyAgLy8gKFdoaWxlIEdvb2dsZSdzIEMrKyBjb2Rpbmcgc3R5bGUgZG9lc24ndCBhbGxvdyBhcmd1bWVudHMgcGFzc2VkCisgIC8vIGJ5IG5vbi1jb25zdCByZWZlcmVuY2UsIHdlIG1heSBzZWUgdGhlbSBpbiBjb2RlIG5vdCBjb25mb3JtaW5nIHRvCisgIC8vIHRoZSBzdHlsZS4gIFRoZXJlZm9yZSBHb29nbGUgTW9jayBuZWVkcyB0byBzdXBwb3J0IHRoZW0uKQorICBvcGVyYXRvciBNYXRjaGVyPEZsb2F0VHlwZT4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKAorICAgICAgICBuZXcgSW1wbDxGbG9hdFR5cGU+KGV4cGVjdGVkXywgbmFuX2VxX25hbl8sIG1heF9hYnNfZXJyb3JfKSk7CisgIH0KKworICBvcGVyYXRvciBNYXRjaGVyPGNvbnN0IEZsb2F0VHlwZSY+KCkgY29uc3QgeworICAgIHJldHVybiBNYWtlTWF0Y2hlcigKKyAgICAgICAgbmV3IEltcGw8Y29uc3QgRmxvYXRUeXBlJj4oZXhwZWN0ZWRfLCBuYW5fZXFfbmFuXywgbWF4X2Fic19lcnJvcl8pKTsKKyAgfQorCisgIG9wZXJhdG9yIE1hdGNoZXI8RmxvYXRUeXBlJj4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKAorICAgICAgICBuZXcgSW1wbDxGbG9hdFR5cGUmPihleHBlY3RlZF8sIG5hbl9lcV9uYW5fLCBtYXhfYWJzX2Vycm9yXykpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBGbG9hdFR5cGUgZXhwZWN0ZWRfOworICBjb25zdCBib29sIG5hbl9lcV9uYW5fOworICAvLyBtYXhfYWJzX2Vycm9yIHdpbGwgYmUgdXNlZCBmb3IgdmFsdWUgY29tcGFyaXNvbiB3aGVuID49IDAuCisgIGNvbnN0IEZsb2F0VHlwZSBtYXhfYWJzX2Vycm9yXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEZsb2F0aW5nRXFNYXRjaGVyKTsKK307CisKKy8vIEltcGxlbWVudHMgdGhlIFBvaW50ZWUobSkgbWF0Y2hlciBmb3IgbWF0Y2hpbmcgYSBwb2ludGVyIHdob3NlCisvLyBwb2ludGVlIG1hdGNoZXMgbWF0Y2hlciBtLiAgVGhlIHBvaW50ZXIgY2FuIGJlIGVpdGhlciByYXcgb3Igc21hcnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgorY2xhc3MgUG9pbnRlZU1hdGNoZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUG9pbnRlZU1hdGNoZXIoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9CisKKyAgLy8gVGhpcyB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgdGVtcGxhdGUgYWxsb3dzIFBvaW50ZWUobSkgdG8gYmUKKyAgLy8gdXNlZCBhcyBhIG1hdGNoZXIgZm9yIGFueSBwb2ludGVyIHR5cGUgd2hvc2UgcG9pbnRlZSB0eXBlIGlzCisgIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgaW5uZXIgbWF0Y2hlciwgd2hlcmUgdHlwZSBQb2ludGVyIGNhbiBiZQorICAvLyBlaXRoZXIgYSByYXcgcG9pbnRlciBvciBhIHNtYXJ0IHBvaW50ZXIuCisgIC8vCisgIC8vIFRoZSByZWFzb24gd2UgZG8gdGhpcyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24KKyAgLy8gTWFrZVBvbHltb3JwaGljTWF0Y2hlcigpIGlzIHRoYXQgdGhlIGxhdHRlciBpcyBub3QgZmxleGlibGUKKyAgLy8gZW5vdWdoIGZvciBpbXBsZW1lbnRpbmcgdGhlIERlc2NyaWJlVG8oKSBtZXRob2Qgb2YgUG9pbnRlZSgpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxQb2ludGVyPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8UG9pbnRlcj4obWF0Y2hlcl8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVGhlIG1vbm9tb3JwaGljIGltcGxlbWVudGF0aW9uIHRoYXQgd29ya3MgZm9yIGEgcGFydGljdWxhciBwb2ludGVyIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPgorICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8UG9pbnRlcj4geworICAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgUG9pbnRlZU9mPEdURVNUX1JFTU9WRV9DT05TVF8oICAvLyBOT0xJTlQKKyAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oUG9pbnRlcikpPjo6dHlwZSBQb2ludGVlOworCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpCisgICAgICAgIDogbWF0Y2hlcl8oTWF0Y2hlckNhc3Q8Y29uc3QgUG9pbnRlZSY+KG1hdGNoZXIpKSB7fQorCisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICAqb3MgPDwgInBvaW50cyB0byBhIHZhbHVlIHRoYXQgIjsKKyAgICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICAqb3MgPDwgImRvZXMgbm90IHBvaW50IHRvIGEgdmFsdWUgdGhhdCAiOworICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihQb2ludGVyIHBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgICAgaWYgKEdldFJhd1BvaW50ZXIocG9pbnRlcikgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIHBvaW50cyB0byAiOworICAgICAgcmV0dXJuIE1hdGNoUHJpbnRBbmRFeHBsYWluKCpwb2ludGVyLCBtYXRjaGVyXywgbGlzdGVuZXIpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBjb25zdCBNYXRjaGVyPGNvbnN0IFBvaW50ZWUmPiBtYXRjaGVyXzsKKworICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7CisgIH07CisKKyAgY29uc3QgSW5uZXJNYXRjaGVyIG1hdGNoZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUG9pbnRlZU1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyB0aGUgV2hlbkR5bmFtaWNDYXN0VG88VD4obSkgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBwb2ludGVyIG9yCisvLyByZWZlcmVuY2UgdGhhdCBtYXRjaGVzIGlubmVyX21hdGNoZXIgd2hlbiBkeW5hbWljX2Nhc3Q8VD4gaXMgYXBwbGllZC4KKy8vIFRoZSByZXN1bHQgb2YgZHluYW1pY19jYXN0PFRvPiBpcyBmb3J3YXJkZWQgdG8gdGhlIGlubmVyIG1hdGNoZXIuCisvLyBJZiBUbyBpcyBhIHBvaW50ZXIgYW5kIHRoZSBjYXN0IGZhaWxzLCB0aGUgaW5uZXIgbWF0Y2hlciB3aWxsIHJlY2VpdmUgTlVMTC4KKy8vIElmIFRvIGlzIGEgcmVmZXJlbmNlIGFuZCB0aGUgY2FzdCBmYWlscywgdGhpcyBtYXRjaGVyIHJldHVybnMgZmFsc2UKKy8vIGltbWVkaWF0ZWx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFRvPgorY2xhc3MgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlKGNvbnN0IE1hdGNoZXI8VG8+JiBtYXRjaGVyKQorICAgICAgOiBtYXRjaGVyXyhtYXRjaGVyKSB7fQorCisgIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICBHZXRDYXN0VHlwZURlc2NyaXB0aW9uKG9zKTsKKyAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgIEdldENhc3RUeXBlRGVzY3JpcHRpb24ob3MpOworICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgY29uc3QgTWF0Y2hlcjxUbz4gbWF0Y2hlcl87CisKKyAgc3RhdGljIHN0cmluZyBHZXRUb05hbWUoKSB7CisjaWYgR1RFU1RfSEFTX1JUVEkKKyAgICByZXR1cm4gR2V0VHlwZU5hbWU8VG8+KCk7CisjZWxzZSAgLy8gR1RFU1RfSEFTX1JUVEkKKyAgICByZXR1cm4gInRoZSB0YXJnZXQgdHlwZSI7CisjZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJCisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIEdldENhc3RUeXBlRGVzY3JpcHRpb24oOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJ3aGVuIGR5bmFtaWNfY2FzdCB0byAiIDw8IEdldFRvTmFtZSgpIDw8ICIsICI7CisgIH0KKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2UpOworfTsKKworLy8gUHJpbWFyeSB0ZW1wbGF0ZS4KKy8vIFRvIGlzIGEgcG9pbnRlci4gQ2FzdCBhbmQgZm9yd2FyZCB0aGUgcmVzdWx0LgordGVtcGxhdGUgPHR5cGVuYW1lIFRvPgorY2xhc3MgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyIDogcHVibGljIFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2U8VG8+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlcihjb25zdCBNYXRjaGVyPFRvPiYgbWF0Y2hlcikKKyAgICAgIDogV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZTxUbz4obWF0Y2hlcikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oRnJvbSBmcm9tLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIC8vIFRPRE8oc2JlbnphKTogQWRkIG1vcmUgZGV0YWlsIG9uIGZhaWx1cmVzLiBpZSBkaWQgdGhlIGR5bl9jYXN0IGZhaWw/CisgICAgVG8gdG8gPSBkeW5hbWljX2Nhc3Q8VG8+KGZyb20pOworICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbih0bywgdGhpcy0+bWF0Y2hlcl8sIGxpc3RlbmVyKTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6ZSBmb3IgcmVmZXJlbmNlcy4KKy8vIEluIHRoaXMgY2FzZSB3ZSByZXR1cm4gZmFsc2UgaWYgdGhlIGR5bmFtaWNfY2FzdCBmYWlscy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUbz4KK2NsYXNzIFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlcjxUbyY+IDogcHVibGljIFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2U8VG8mPiB7CisgcHVibGljOgorICBleHBsaWNpdCBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXIoY29uc3QgTWF0Y2hlcjxUbyY+JiBtYXRjaGVyKQorICAgICAgOiBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlPFRvJj4obWF0Y2hlcikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oRnJvbSYgZnJvbSwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAvLyBXZSBkb24ndCB3YW50IGFuIHN0ZDo6YmFkX2Nhc3QgaGVyZSwgc28gZG8gdGhlIGNhc3Qgd2l0aCBwb2ludGVycy4KKyAgICBUbyogdG8gPSBkeW5hbWljX2Nhc3Q8VG8qPigmZnJvbSk7CisgICAgaWYgKHRvID09IE5VTEwpIHsKKyAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggY2Fubm90IGJlIGR5bmFtaWNfY2FzdCB0byAiIDw8IHRoaXMtPkdldFRvTmFtZSgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4oKnRvLCB0aGlzLT5tYXRjaGVyXywgbGlzdGVuZXIpOworICB9Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBGaWVsZCgpIG1hdGNoZXIgZm9yIG1hdGNoaW5nIGEgZmllbGQgKGkuZS4gbWVtYmVyCisvLyB2YXJpYWJsZSkgb2YgYW4gb2JqZWN0LgordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBGaWVsZFR5cGU+CitjbGFzcyBGaWVsZE1hdGNoZXIgeworIHB1YmxpYzoKKyAgRmllbGRNYXRjaGVyKEZpZWxkVHlwZSBDbGFzczo6KmZpZWxkLAorICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hlcjxjb25zdCBGaWVsZFR5cGUmPiYgbWF0Y2hlcikKKyAgICAgIDogZmllbGRfKGZpZWxkKSwgbWF0Y2hlcl8obWF0Y2hlcikge30KKworICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgIjsKKyAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIGZpZWxkICI7CisgICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBUJiB2YWx1ZSwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluSW1wbCgKKyAgICAgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6CisgICAgICAgICAgICBpc19wb2ludGVyPEdURVNUX1JFTU9WRV9DT05TVF8oVCk+Ojp0eXBlKCksCisgICAgICAgIHZhbHVlLCBsaXN0ZW5lcik7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBNYXRjaEFuZEV4cGxhaW5JbXBsKCkgaXMgbmVlZGVkIHRvIGhlbHAKKyAgLy8gU3ltYmlhbidzIEMrKyBjb21waWxlciBjaG9vc2Ugd2hpY2ggb3ZlcmxvYWQgdG8gdXNlLiAgSXRzIHR5cGUgaXMKKyAgLy8gdHJ1ZV90eXBlIGlmZiB0aGUgRmllbGQoKSBtYXRjaGVyIGlzIHVzZWQgdG8gbWF0Y2ggYSBwb2ludGVyLgorICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2VfdHlwZSAvKiBpc19ub3RfcG9pbnRlciAqLywgY29uc3QgQ2xhc3MmIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBnaXZlbiBmaWVsZCBpcyAiOworICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbihvYmouKmZpZWxkXywgbWF0Y2hlcl8sIGxpc3RlbmVyKTsKKyAgfQorCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluSW1wbCh0cnVlX3R5cGUgLyogaXNfcG9pbnRlciAqLywgY29uc3QgQ2xhc3MqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGlmIChwID09IE5VTEwpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAqbGlzdGVuZXIgPDwgIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3QgIjsKKyAgICAvLyBTaW5jZSAqcCBoYXMgYSBmaWVsZCwgaXQgbXVzdCBiZSBhIGNsYXNzL3N0cnVjdC91bmlvbiB0eXBlIGFuZAorICAgIC8vIHRodXMgY2Fubm90IGJlIGEgcG9pbnRlci4gIFRoZXJlZm9yZSB3ZSBwYXNzIGZhbHNlX3R5cGUoKSBhcworICAgIC8vIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluSW1wbChmYWxzZV90eXBlKCksICpwLCBsaXN0ZW5lcik7CisgIH0KKworICBjb25zdCBGaWVsZFR5cGUgQ2xhc3M6OipmaWVsZF87CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgRmllbGRUeXBlJj4gbWF0Y2hlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhGaWVsZE1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyB0aGUgUHJvcGVydHkoKSBtYXRjaGVyIGZvciBtYXRjaGluZyBhIHByb3BlcnR5CisvLyAoaS5lLiByZXR1cm4gdmFsdWUgb2YgYSBnZXR0ZXIgbWV0aG9kKSBvZiBhbiBvYmplY3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIFByb3BlcnR5VHlwZT4KK2NsYXNzIFByb3BlcnR5TWF0Y2hlciB7CisgcHVibGljOgorICAvLyBUaGUgcHJvcGVydHkgbWF5IGhhdmUgYSByZWZlcmVuY2UgdHlwZSwgc28gJ2NvbnN0IFByb3BlcnR5VHlwZSYnCisgIC8vIG1heSBjYXVzZSBkb3VibGUgcmVmZXJlbmNlcyBhbmQgZmFpbCB0byBjb21waWxlLiAgVGhhdCdzIHdoeSB3ZQorICAvLyBuZWVkIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVCwgd2hpY2ggd29ya3MgcmVnYXJkbGVzcyBvZgorICAvLyBQcm9wZXJ0eVR5cGUgYmVpbmcgYSByZWZlcmVuY2Ugb3Igbm90LgorICB0eXBlZGVmIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oUHJvcGVydHlUeXBlKSBSZWZUb0NvbnN0UHJvcGVydHk7CisKKyAgUHJvcGVydHlNYXRjaGVyKFByb3BlcnR5VHlwZSAoQ2xhc3M6Oipwcm9wZXJ0eSkoKSBjb25zdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdGNoZXI8UmVmVG9Db25zdFByb3BlcnR5PiYgbWF0Y2hlcikKKyAgICAgIDogcHJvcGVydHlfKHByb3BlcnR5KSwgbWF0Y2hlcl8obWF0Y2hlcikge30KKworICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgIjsKKyAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5ICI7CisgICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBUJnZhbHVlLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKAorICAgICAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjoKKyAgICAgICAgICAgIGlzX3BvaW50ZXI8R1RFU1RfUkVNT1ZFX0NPTlNUXyhUKT46OnR5cGUoKSwKKyAgICAgICAgdmFsdWUsIGxpc3RlbmVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIE1hdGNoQW5kRXhwbGFpbkltcGwoKSBpcyBuZWVkZWQgdG8gaGVscAorICAvLyBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIGNob29zZSB3aGljaCBvdmVybG9hZCB0byB1c2UuICBJdHMgdHlwZSBpcworICAvLyB0cnVlX3R5cGUgaWZmIHRoZSBQcm9wZXJ0eSgpIG1hdGNoZXIgaXMgdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluSW1wbChmYWxzZV90eXBlIC8qIGlzX25vdF9wb2ludGVyICovLCBjb25zdCBDbGFzcyYgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAqbGlzdGVuZXIgPDwgIndob3NlIGdpdmVuIHByb3BlcnR5IGlzICI7CisgICAgLy8gQ2Fubm90IHBhc3MgdGhlIHJldHVybiB2YWx1ZSAoZm9yIGV4YW1wbGUsIGludCkgdG8gTWF0Y2hQcmludEFuZEV4cGxhaW4sCisgICAgLy8gd2hpY2ggdGFrZXMgYSBub24tY29uc3QgcmVmZXJlbmNlIGFzIGFyZ3VtZW50LgorI2lmIGRlZmluZWQoX1BSRUZBU1RfICkgJiYgX01TQ19WRVIgPT0gMTgwMAorICAgIC8vIFdvcmthcm91bmQgYnVnIGluIFZDKysgMjAxMydzIC9hbmFseXplIHBhcnNlci4KKyAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9WaXN1YWxTdHVkaW8vZmVlZGJhY2svZGV0YWlscy8xMTA2MzYzL2ludGVybmFsLWNvbXBpbGVyLWVycm9yLXdpdGgtYW5hbHl6ZS1kdWUtdG8tZmFpbHVyZS10by1pbmZlci1tb3ZlCisgICAgcG9zaXg6OkFib3J0KCk7ICAvLyBUbyBtYWtlIHN1cmUgaXQgaXMgbmV2ZXIgcnVuLgorICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgUmVmVG9Db25zdFByb3BlcnR5IHJlc3VsdCA9IChvYmouKnByb3BlcnR5XykoKTsKKyAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4ocmVzdWx0LCBtYXRjaGVyXywgbGlzdGVuZXIpOworI2VuZGlmCisgIH0KKworICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwodHJ1ZV90eXBlIC8qIGlzX3BvaW50ZXIgKi8sIGNvbnN0IENsYXNzKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBwb2ludHMgdG8gYW4gb2JqZWN0ICI7CisgICAgLy8gU2luY2UgKnAgaGFzIGEgcHJvcGVydHkgbWV0aG9kLCBpdCBtdXN0IGJlIGEgY2xhc3Mvc3RydWN0L3VuaW9uCisgICAgLy8gdHlwZSBhbmQgdGh1cyBjYW5ub3QgYmUgYSBwb2ludGVyLiAgVGhlcmVmb3JlIHdlIHBhc3MKKyAgICAvLyBmYWxzZV90eXBlKCkgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKGZhbHNlX3R5cGUoKSwgKnAsIGxpc3RlbmVyKTsKKyAgfQorCisgIFByb3BlcnR5VHlwZSAoQ2xhc3M6Oipwcm9wZXJ0eV8pKCkgY29uc3Q7CisgIGNvbnN0IE1hdGNoZXI8UmVmVG9Db25zdFByb3BlcnR5PiBtYXRjaGVyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFByb3BlcnR5TWF0Y2hlcik7Cit9OworCisvLyBUeXBlIHRyYWl0cyBzcGVjaWZ5aW5nIHZhcmlvdXMgZmVhdHVyZXMgb2YgZGlmZmVyZW50IGZ1bmN0b3JzIGZvciBSZXN1bHRPZi4KKy8vIFRoZSBkZWZhdWx0IHRlbXBsYXRlIHNwZWNpZmllcyBmZWF0dXJlcyBmb3IgZnVuY3RvciBvYmplY3RzLgorLy8gRnVuY3RvciBjbGFzc2VzIGhhdmUgdG8gdHlwZWRlZiBhcmd1bWVudF90eXBlIGFuZCByZXN1bHRfdHlwZQorLy8gdG8gYmUgY29tcGF0aWJsZSB3aXRoIFJlc3VsdE9mLgordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+CitzdHJ1Y3QgQ2FsbGFibGVUcmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OnJlc3VsdF90eXBlIFJlc3VsdFR5cGU7CisgIHR5cGVkZWYgRnVuY3RvciBTdG9yYWdlVHlwZTsKKworICBzdGF0aWMgdm9pZCBDaGVja0lzVmFsaWQoRnVuY3RvciAvKiBmdW5jdG9yICovKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIFJlc3VsdFR5cGUgSW52b2tlKEZ1bmN0b3IgZiwgVCBhcmcpIHsgcmV0dXJuIGYoYXJnKTsgfQorfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIFJlc1R5cGU+CitzdHJ1Y3QgQ2FsbGFibGVUcmFpdHM8UmVzVHlwZSgqKShBcmdUeXBlKT4geworICB0eXBlZGVmIFJlc1R5cGUgUmVzdWx0VHlwZTsKKyAgdHlwZWRlZiBSZXNUeXBlKCpTdG9yYWdlVHlwZSkoQXJnVHlwZSk7CisKKyAgc3RhdGljIHZvaWQgQ2hlY2tJc1ZhbGlkKFJlc1R5cGUoKmYpKEFyZ1R5cGUpKSB7CisgICAgR1RFU1RfQ0hFQ0tfKGYgIT0gTlVMTCkKKyAgICAgICAgPDwgIk5VTEwgZnVuY3Rpb24gcG9pbnRlciBpcyBwYXNzZWQgaW50byBSZXN1bHRPZigpLiI7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBSZXNUeXBlIEludm9rZShSZXNUeXBlKCpmKShBcmdUeXBlKSwgVCBhcmcpIHsKKyAgICByZXR1cm4gKCpmKShhcmcpOworICB9Cit9OworCisvLyBJbXBsZW1lbnRzIHRoZSBSZXN1bHRPZigpIG1hdGNoZXIgZm9yIG1hdGNoaW5nIGEgcmV0dXJuIHZhbHVlIG9mIGEKKy8vIHVuYXJ5IGZ1bmN0aW9uIG9mIGFuIG9iamVjdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYWJsZT4KK2NsYXNzIFJlc3VsdE9mTWF0Y2hlciB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIENhbGxhYmxlVHJhaXRzPENhbGxhYmxlPjo6UmVzdWx0VHlwZSBSZXN1bHRUeXBlOworCisgIFJlc3VsdE9mTWF0Y2hlcihDYWxsYWJsZSBjYWxsYWJsZSwgY29uc3QgTWF0Y2hlcjxSZXN1bHRUeXBlPiYgbWF0Y2hlcikKKyAgICAgIDogY2FsbGFibGVfKGNhbGxhYmxlKSwgbWF0Y2hlcl8obWF0Y2hlcikgeworICAgIENhbGxhYmxlVHJhaXRzPENhbGxhYmxlPjo6Q2hlY2tJc1ZhbGlkKGNhbGxhYmxlXyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgSW1wbDxUPihjYWxsYWJsZV8sIG1hdGNoZXJfKSk7CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgQ2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpTdG9yYWdlVHlwZSBDYWxsYWJsZVN0b3JhZ2VUeXBlOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4geworICAgcHVibGljOgorICAgIEltcGwoQ2FsbGFibGVTdG9yYWdlVHlwZSBjYWxsYWJsZSwgY29uc3QgTWF0Y2hlcjxSZXN1bHRUeXBlPiYgbWF0Y2hlcikKKyAgICAgICAgOiBjYWxsYWJsZV8oY2FsbGFibGUpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQorCisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgICAqb3MgPDwgImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICI7CisgICAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICAgKm9zIDw8ICJpcyBtYXBwZWQgYnkgdGhlIGdpdmVuIGNhbGxhYmxlIHRvIGEgdmFsdWUgdGhhdCAiOworICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgb2JqLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBpcyBtYXBwZWQgYnkgdGhlIGdpdmVuIGNhbGxhYmxlIHRvICI7CisgICAgICAvLyBDYW5ub3QgcGFzcyB0aGUgcmV0dXJuIHZhbHVlIChmb3IgZXhhbXBsZSwgaW50KSB0bworICAgICAgLy8gTWF0Y2hQcmludEFuZEV4cGxhaW4sIHdoaWNoIHRha2VzIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSBhcyBhcmd1bWVudC4KKyAgICAgIFJlc3VsdFR5cGUgcmVzdWx0ID0KKyAgICAgICAgICBDYWxsYWJsZVRyYWl0czxDYWxsYWJsZT46OnRlbXBsYXRlIEludm9rZTxUPihjYWxsYWJsZV8sIG9iaik7CisgICAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4ocmVzdWx0LCBtYXRjaGVyXywgbGlzdGVuZXIpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICAvLyBGdW5jdG9ycyBvZnRlbiBkZWZpbmUgb3BlcmF0b3IoKSBhcyBub24tY29uc3QgbWV0aG9kIGV2ZW4gdGhvdWdoCisgICAgLy8gdGhleSBhcmUgYWN0dWFseSBzdGF0ZWxlc3MuIEJ1dCB3ZSBuZWVkIHRvIHVzZSB0aGVtIGV2ZW4gd2hlbgorICAgIC8vICd0aGlzJyBpcyBhIGNvbnN0IHBvaW50ZXIuIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSBub3QgdG8KKyAgICAvLyB1c2Ugc3RhdGVmdWwgY2FsbGFibGVzIHdpdGggUmVzdWx0T2YoKSwgd2hpY2ggZG9lcyd0IGd1YXJhbnRlZQorICAgIC8vIGhvdyBtYW55IHRpbWVzIHRoZSBjYWxsYWJsZSB3aWxsIGJlIGludm9rZWQuCisgICAgbXV0YWJsZSBDYWxsYWJsZVN0b3JhZ2VUeXBlIGNhbGxhYmxlXzsKKyAgICBjb25zdCBNYXRjaGVyPFJlc3VsdFR5cGU+IG1hdGNoZXJfOworCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKKyAgfTsgIC8vIGNsYXNzIEltcGwKKworICBjb25zdCBDYWxsYWJsZVN0b3JhZ2VUeXBlIGNhbGxhYmxlXzsKKyAgY29uc3QgTWF0Y2hlcjxSZXN1bHRUeXBlPiBtYXRjaGVyXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJlc3VsdE9mTWF0Y2hlcik7Cit9OworCisvLyBJbXBsZW1lbnRzIGEgbWF0Y2hlciB0aGF0IGNoZWNrcyB0aGUgc2l6ZSBvZiBhbiBTVEwtc3R5bGUgY29udGFpbmVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFNpemVNYXRjaGVyPgorY2xhc3MgU2l6ZUlzTWF0Y2hlciB7CisgcHVibGljOgorICBleHBsaWNpdCBTaXplSXNNYXRjaGVyKGNvbnN0IFNpemVNYXRjaGVyJiBzaXplX21hdGNoZXIpCisgICAgICAgOiBzaXplX21hdGNoZXJfKHNpemVfbWF0Y2hlcikgeworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgeworICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxDb250YWluZXI+KHNpemVfbWF0Y2hlcl8pKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxDb250YWluZXI+IHsKKyAgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PAorICAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcik+IENvbnRhaW5lclZpZXc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDb250YWluZXJWaWV3Ojp0eXBlOjpzaXplX3R5cGUgU2l6ZVR5cGU7CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBTaXplTWF0Y2hlciYgc2l6ZV9tYXRjaGVyKQorICAgICAgICA6IHNpemVfbWF0Y2hlcl8oTWF0Y2hlckNhc3Q8U2l6ZVR5cGU+KHNpemVfbWF0Y2hlcikpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAgICpvcyA8PCAic2l6ZSAiOworICAgICAgc2l6ZV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAgICpvcyA8PCAic2l6ZSAiOworICAgICAgc2l6ZV9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ29udGFpbmVyIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgICBTaXplVHlwZSBzaXplID0gY29udGFpbmVyLnNpemUoKTsKKyAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgc2l6ZV9saXN0ZW5lcjsKKyAgICAgIGNvbnN0IGJvb2wgcmVzdWx0ID0gc2l6ZV9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc2l6ZSwgJnNpemVfbGlzdGVuZXIpOworICAgICAgKmxpc3RlbmVyCisgICAgICAgICAgPDwgIndob3NlIHNpemUgIiA8PCBzaXplIDw8IChyZXN1bHQgPyAiIG1hdGNoZXMiIDogIiBkb2Vzbid0IG1hdGNoIik7CisgICAgICBQcmludElmTm90RW1wdHkoc2l6ZV9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IE1hdGNoZXI8U2l6ZVR5cGU+IHNpemVfbWF0Y2hlcl87CisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKKyAgfTsKKworIHByaXZhdGU6CisgIGNvbnN0IFNpemVNYXRjaGVyIHNpemVfbWF0Y2hlcl87CisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2l6ZUlzTWF0Y2hlcik7Cit9OworCisvLyBJbXBsZW1lbnRzIGEgbWF0Y2hlciB0aGF0IGNoZWNrcyB0aGUgYmVnaW4oKS4uZW5kKCkgZGlzdGFuY2Ugb2YgYW4gU1RMLXN0eWxlCisvLyBjb250YWluZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzdGFuY2VNYXRjaGVyPgorY2xhc3MgQmVnaW5FbmREaXN0YW5jZUlzTWF0Y2hlciB7CisgcHVibGljOgorICBleHBsaWNpdCBCZWdpbkVuZERpc3RhbmNlSXNNYXRjaGVyKGNvbnN0IERpc3RhbmNlTWF0Y2hlciYgZGlzdGFuY2VfbWF0Y2hlcikKKyAgICAgIDogZGlzdGFuY2VfbWF0Y2hlcl8oZGlzdGFuY2VfbWF0Y2hlcikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPENvbnRhaW5lcj4oZGlzdGFuY2VfbWF0Y2hlcl8pKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxDb250YWluZXI+IHsKKyAgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PAorICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKT4gQ29udGFpbmVyVmlldzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorICAgICAgICB0eXBlbmFtZSBDb250YWluZXJWaWV3Ojp0eXBlOjpjb25zdF9pdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICBEaXN0YW5jZVR5cGU7CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBEaXN0YW5jZU1hdGNoZXImIGRpc3RhbmNlX21hdGNoZXIpCisgICAgICAgIDogZGlzdGFuY2VfbWF0Y2hlcl8oTWF0Y2hlckNhc3Q8RGlzdGFuY2VUeXBlPihkaXN0YW5jZV9tYXRjaGVyKSkge30KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICAgKm9zIDw8ICJkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpICI7CisgICAgICBkaXN0YW5jZV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAgICpvcyA8PCAiZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAiOworICAgICAgZGlzdGFuY2VfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworI2lmIEdURVNUX0hBU19TVERfQkVHSU5fQU5EX0VORF8KKyAgICAgIHVzaW5nIHN0ZDo6YmVnaW47CisgICAgICB1c2luZyBzdGQ6OmVuZDsKKyAgICAgIERpc3RhbmNlVHlwZSBkaXN0YW5jZSA9IHN0ZDo6ZGlzdGFuY2UoYmVnaW4oY29udGFpbmVyKSwgZW5kKGNvbnRhaW5lcikpOworI2Vsc2UKKyAgICAgIERpc3RhbmNlVHlwZSBkaXN0YW5jZSA9IHN0ZDo6ZGlzdGFuY2UoY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7CisjZW5kaWYKKyAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgZGlzdGFuY2VfbGlzdGVuZXI7CisgICAgICBjb25zdCBib29sIHJlc3VsdCA9CisgICAgICAgICAgZGlzdGFuY2VfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKGRpc3RhbmNlLCAmZGlzdGFuY2VfbGlzdGVuZXIpOworICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpICIgPDwgZGlzdGFuY2UKKyAgICAgICAgICAgICAgICA8PCAocmVzdWx0ID8gIiBtYXRjaGVzIiA6ICIgZG9lc24ndCBtYXRjaCIpOworICAgICAgUHJpbnRJZk5vdEVtcHR5KGRpc3RhbmNlX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgTWF0Y2hlcjxEaXN0YW5jZVR5cGU+IGRpc3RhbmNlX21hdGNoZXJfOworICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7CisgIH07CisKKyBwcml2YXRlOgorICBjb25zdCBEaXN0YW5jZU1hdGNoZXIgZGlzdGFuY2VfbWF0Y2hlcl87CisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQmVnaW5FbmREaXN0YW5jZUlzTWF0Y2hlcik7Cit9OworCisvLyBJbXBsZW1lbnRzIGFuIGVxdWFsaXR5IG1hdGNoZXIgZm9yIGFueSBTVEwtc3R5bGUgY29udGFpbmVyIHdob3NlIGVsZW1lbnRzCisvLyBzdXBwb3J0ID09LiBUaGlzIG1hdGNoZXIgaXMgbGlrZSBFcSgpLCBidXQgaXRzIGZhaWx1cmUgZXhwbGFuYXRpb25zIHByb3ZpZGUKKy8vIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VmdWwgd2hlbiB0aGUgY29udGFpbmVyIGlzIHVzZWQgYXMgYSBzZXQuCisvLyBUaGUgZmFpbHVyZSBtZXNzYWdlIHJlcG9ydHMgZWxlbWVudHMgdGhhdCBhcmUgaW4gb25lIG9mIHRoZSBvcGVyYW5kcyBidXQgbm90CisvLyB0aGUgb3RoZXIuIFRoZSBmYWlsdXJlIG1lc3NhZ2VzIGRvIG5vdCByZXBvcnQgZHVwbGljYXRlIG9yIG91dC1vZi1vcmRlcgorLy8gZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lcnMgKHdoaWNoIGRvbid0IHByb3Blcmx5IG1hdHRlciB0byBzZXRzLCBidXQgY2FuCisvLyBvY2N1ciBpZiB0aGUgY29udGFpbmVycyBhcmUgdmVjdG9ycyBvciBsaXN0cywgZm9yIGV4YW1wbGUpLgorLy8KKy8vIFVzZXMgdGhlIGNvbnRhaW5lcidzIGNvbnN0X2l0ZXJhdG9yLCB2YWx1ZV90eXBlLCBvcGVyYXRvciA9PSwKKy8vIGJlZ2luKCksIGFuZCBlbmQoKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CitjbGFzcyBDb250YWluZXJFcU1hdGNoZXIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxDb250YWluZXI+IFZpZXc7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dHlwZSBTdGxDb250YWluZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6Y29uc3RfcmVmZXJlbmNlIFN0bENvbnRhaW5lclJlZmVyZW5jZTsKKworICAvLyBXZSBtYWtlIGEgY29weSBvZiBleHBlY3RlZCBpbiBjYXNlIHRoZSBlbGVtZW50cyBpbiBpdCBhcmUgbW9kaWZpZWQKKyAgLy8gYWZ0ZXIgdGhpcyBtYXRjaGVyIGlzIGNyZWF0ZWQuCisgIGV4cGxpY2l0IENvbnRhaW5lckVxTWF0Y2hlcihjb25zdCBDb250YWluZXImIGV4cGVjdGVkKQorICAgICAgOiBleHBlY3RlZF8oVmlldzo6Q29weShleHBlY3RlZCkpIHsKKyAgICAvLyBNYWtlcyBzdXJlIHRoZSB1c2VyIGRvZXNuJ3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyB0ZW1wbGF0ZQorICAgIC8vIHdpdGggYSBjb25zdCBvciByZWZlcmVuY2UgdHlwZS4KKyAgICAodm9pZCl0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8Q29udGFpbmVyLAorICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKT4oKTsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImVxdWFscyAiOworICAgIFVuaXZlcnNhbFByaW50KGV4cGVjdGVkXywgb3MpOworICB9CisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiZG9lcyBub3QgZXF1YWwgIjsKKyAgICBVbml2ZXJzYWxQcmludChleHBlY3RlZF8sIG9zKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IExoc0NvbnRhaW5lciYgbGhzLAorICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIC8vIEdURVNUX1JFTU9WRV9DT05TVF8oKSBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYW4gTVNWQyA4LjAgYnVnCisgICAgLy8gdGhhdCBjYXVzZXMgTGhzQ29udGFpbmVyIHRvIGJlIGEgY29uc3QgdHlwZSBzb21ldGltZXMuCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxHVEVTVF9SRU1PVkVfQ09OU1RfKExoc0NvbnRhaW5lcik+CisgICAgICAgIExoc1ZpZXc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojp0eXBlIExoc1N0bENvbnRhaW5lcjsKKyAgICBTdGxDb250YWluZXJSZWZlcmVuY2UgbGhzX3N0bF9jb250YWluZXIgPSBMaHNWaWV3OjpDb25zdFJlZmVyZW5jZShsaHMpOworICAgIGlmIChsaHNfc3RsX2NvbnRhaW5lciA9PSBleHBlY3RlZF8pCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIDo6c3RkOjpvc3RyZWFtKiBjb25zdCBvcyA9IGxpc3RlbmVyLT5zdHJlYW0oKTsKKyAgICBpZiAob3MgIT0gTlVMTCkgeworICAgICAgLy8gU29tZXRoaW5nIGlzIGRpZmZlcmVudC4gQ2hlY2sgZm9yIGV4dHJhIHZhbHVlcyBmaXJzdC4KKyAgICAgIGJvb2wgcHJpbnRlZF9oZWFkZXIgPSBmYWxzZTsKKyAgICAgIGZvciAodHlwZW5hbWUgTGhzU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICBsaHNfc3RsX2NvbnRhaW5lci5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBsaHNfc3RsX2NvbnRhaW5lci5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaW50ZXJuYWw6OkFycmF5QXdhcmVGaW5kKGV4cGVjdGVkXy5iZWdpbigpLCBleHBlY3RlZF8uZW5kKCksICppdCkgPT0KKyAgICAgICAgICAgIGV4cGVjdGVkXy5lbmQoKSkgeworICAgICAgICAgIGlmIChwcmludGVkX2hlYWRlcikgeworICAgICAgICAgICAgKm9zIDw8ICIsICI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvcyA8PCAid2hpY2ggaGFzIHRoZXNlIHVuZXhwZWN0ZWQgZWxlbWVudHM6ICI7CisgICAgICAgICAgICBwcmludGVkX2hlYWRlciA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIFVuaXZlcnNhbFByaW50KCppdCwgb3MpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE5vdyBjaGVjayBmb3IgbWlzc2luZyB2YWx1ZXMuCisgICAgICBib29sIHByaW50ZWRfaGVhZGVyMiA9IGZhbHNlOworICAgICAgZm9yICh0eXBlbmFtZSBTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZXhwZWN0ZWRfLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IGV4cGVjdGVkXy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaW50ZXJuYWw6OkFycmF5QXdhcmVGaW5kKAorICAgICAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmJlZ2luKCksIGxoc19zdGxfY29udGFpbmVyLmVuZCgpLCAqaXQpID09CisgICAgICAgICAgICBsaHNfc3RsX2NvbnRhaW5lci5lbmQoKSkgeworICAgICAgICAgIGlmIChwcmludGVkX2hlYWRlcjIpIHsKKyAgICAgICAgICAgICpvcyA8PCAiLCAiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3MgPDwgKHByaW50ZWRfaGVhZGVyID8gIixcbmFuZCIgOiAid2hpY2giKQorICAgICAgICAgICAgICAgIDw8ICIgZG9lc24ndCBoYXZlIHRoZXNlIGV4cGVjdGVkIGVsZW1lbnRzOiAiOworICAgICAgICAgICAgcHJpbnRlZF9oZWFkZXIyID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgVW5pdmVyc2FsUHJpbnQoKml0LCBvcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFN0bENvbnRhaW5lciBleHBlY3RlZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhDb250YWluZXJFcU1hdGNoZXIpOworfTsKKworLy8gQSBjb21wYXJhdG9yIGZ1bmN0b3IgdGhhdCB1c2VzIHRoZSA8IG9wZXJhdG9yIHRvIGNvbXBhcmUgdHdvIHZhbHVlcy4KK3N0cnVjdCBMZXNzQ29tcGFyYXRvciB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMpIGNvbnN0IHsgcmV0dXJuIGxocyA8IHJoczsgfQorfTsKKworLy8gSW1wbGVtZW50cyBXaGVuU29ydGVkQnkoY29tcGFyYXRvciwgY29udGFpbmVyX21hdGNoZXIpLgordGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhcmF0b3IsIHR5cGVuYW1lIENvbnRhaW5lck1hdGNoZXI+CitjbGFzcyBXaGVuU29ydGVkQnlNYXRjaGVyIHsKKyBwdWJsaWM6CisgIFdoZW5Tb3J0ZWRCeU1hdGNoZXIoY29uc3QgQ29tcGFyYXRvciYgY29tcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250YWluZXJNYXRjaGVyJiBtYXRjaGVyKQorICAgICAgOiBjb21wYXJhdG9yXyhjb21wYXJhdG9yKSwgbWF0Y2hlcl8obWF0Y2hlcikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzQ29udGFpbmVyPgorICBvcGVyYXRvciBNYXRjaGVyPExoc0NvbnRhaW5lcj4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPExoc0NvbnRhaW5lcj4oY29tcGFyYXRvcl8sIG1hdGNoZXJfKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzQ29udGFpbmVyPgorICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8TGhzQ29udGFpbmVyPiB7CisgICBwdWJsaWM6CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzwKKyAgICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhMaHNDb250YWluZXIpPiBMaHNWaWV3OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzVmlldzo6dHlwZSBMaHNTdGxDb250YWluZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojpjb25zdF9yZWZlcmVuY2UgTGhzU3RsQ29udGFpbmVyUmVmZXJlbmNlOworICAgIC8vIFRyYW5zZm9ybXMgc3RkOjpwYWlyPGNvbnN0IEtleSwgVmFsdWU+IGludG8gc3RkOjpwYWlyPEtleSwgVmFsdWU+CisgICAgLy8gc28gdGhhdCB3ZSBjYW4gbWF0Y2ggYXNzb2NpYXRpdmUgY29udGFpbmVycy4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJlbW92ZUNvbnN0RnJvbUtleTwKKyAgICAgICAgdHlwZW5hbWUgTGhzU3RsQ29udGFpbmVyOjp2YWx1ZV90eXBlPjo6dHlwZSBMaHNWYWx1ZTsKKworICAgIEltcGwoY29uc3QgQ29tcGFyYXRvciYgY29tcGFyYXRvciwgY29uc3QgQ29udGFpbmVyTWF0Y2hlciYgbWF0Y2hlcikKKyAgICAgICAgOiBjb21wYXJhdG9yXyhjb21wYXJhdG9yKSwgbWF0Y2hlcl8obWF0Y2hlcikge30KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICAgKm9zIDw8ICIod2hlbiBzb3J0ZWQpICI7CisgICAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICAgKm9zIDw8ICIod2hlbiBzb3J0ZWQpICI7CisgICAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oTGhzQ29udGFpbmVyIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgICBMaHNTdGxDb250YWluZXJSZWZlcmVuY2UgbGhzX3N0bF9jb250YWluZXIgPSBMaHNWaWV3OjpDb25zdFJlZmVyZW5jZShsaHMpOworICAgICAgOjpzdGQ6OnZlY3RvcjxMaHNWYWx1ZT4gc29ydGVkX2NvbnRhaW5lcihsaHNfc3RsX2NvbnRhaW5lci5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaHNfc3RsX2NvbnRhaW5lci5lbmQoKSk7CisgICAgICA6OnN0ZDo6c29ydCgKKyAgICAgICAgICAgc29ydGVkX2NvbnRhaW5lci5iZWdpbigpLCBzb3J0ZWRfY29udGFpbmVyLmVuZCgpLCBjb21wYXJhdG9yXyk7CisKKyAgICAgIGlmICghbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7CisgICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBpcyBub3QgaW50ZXJlc3RlZCwgd2UgZG8gbm90IG5lZWQgdG8KKyAgICAgICAgLy8gY29uc3RydWN0IHRoZSBpbm5lciBleHBsYW5hdGlvbi4KKyAgICAgICAgcmV0dXJuIG1hdGNoZXJfLk1hdGNoZXMoc29ydGVkX2NvbnRhaW5lcik7CisgICAgICB9CisKKyAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgIjsKKyAgICAgIFVuaXZlcnNhbFByaW50KHNvcnRlZF9jb250YWluZXIsIGxpc3RlbmVyLT5zdHJlYW0oKSk7CisgICAgICAqbGlzdGVuZXIgPDwgIiB3aGVuIHNvcnRlZCI7CisKKyAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7CisgICAgICBjb25zdCBib29sIG1hdGNoID0gbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKHNvcnRlZF9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm5lcl9saXN0ZW5lcik7CisgICAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7CisgICAgICByZXR1cm4gbWF0Y2g7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IENvbXBhcmF0b3IgY29tcGFyYXRvcl87CisgICAgY29uc3QgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6dmVjdG9yPExoc1ZhbHVlPiY+IG1hdGNoZXJfOworCisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbXBsKTsKKyAgfTsKKworIHByaXZhdGU6CisgIGNvbnN0IENvbXBhcmF0b3IgY29tcGFyYXRvcl87CisgIGNvbnN0IENvbnRhaW5lck1hdGNoZXIgbWF0Y2hlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhXaGVuU29ydGVkQnlNYXRjaGVyKTsKK307CisKKy8vIEltcGxlbWVudHMgUG9pbnR3aXNlKHR1cGxlX21hdGNoZXIsIHJoc19jb250YWluZXIpLiAgdHVwbGVfbWF0Y2hlcgorLy8gbXVzdCBiZSBhYmxlIHRvIGJlIHNhZmVseSBjYXN0IHRvIE1hdGNoZXI8dHVwbGU8Y29uc3QgVDEmLCBjb25zdAorLy8gVDImPiA+LCB3aGVyZSBUMSBhbmQgVDIgYXJlIHRoZSB0eXBlcyBvZiBlbGVtZW50cyBpbiB0aGUgTEhTCisvLyBjb250YWluZXIgYW5kIHRoZSBSSFMgY29udGFpbmVyIHJlc3BlY3RpdmVseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZU1hdGNoZXIsIHR5cGVuYW1lIFJoc0NvbnRhaW5lcj4KK2NsYXNzIFBvaW50d2lzZU1hdGNoZXIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxSaHNDb250YWluZXI+IFJoc1ZpZXc7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzVmlldzo6dHlwZSBSaHNTdGxDb250YWluZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzU3RsQ29udGFpbmVyOjp2YWx1ZV90eXBlIFJoc1ZhbHVlOworCisgIC8vIExpa2UgQ29udGFpbmVyRXEsIHdlIG1ha2UgYSBjb3B5IG9mIHJocyBpbiBjYXNlIHRoZSBlbGVtZW50cyBpbgorICAvLyBpdCBhcmUgbW9kaWZpZWQgYWZ0ZXIgdGhpcyBtYXRjaGVyIGlzIGNyZWF0ZWQuCisgIFBvaW50d2lzZU1hdGNoZXIoY29uc3QgVHVwbGVNYXRjaGVyJiB0dXBsZV9tYXRjaGVyLCBjb25zdCBSaHNDb250YWluZXImIHJocykKKyAgICAgIDogdHVwbGVfbWF0Y2hlcl8odHVwbGVfbWF0Y2hlciksIHJoc18oUmhzVmlldzo6Q29weShyaHMpKSB7CisgICAgLy8gTWFrZXMgc3VyZSB0aGUgdXNlciBkb2Vzbid0IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgdGVtcGxhdGUKKyAgICAvLyB3aXRoIGEgY29uc3Qgb3IgcmVmZXJlbmNlIHR5cGUuCisgICAgKHZvaWQpdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPFJoc0NvbnRhaW5lciwKKyAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFJoc0NvbnRhaW5lcik+KCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzQ29udGFpbmVyPgorICBvcGVyYXRvciBNYXRjaGVyPExoc0NvbnRhaW5lcj4oKSBjb25zdCB7CisgICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPExoc0NvbnRhaW5lcj4odHVwbGVfbWF0Y2hlcl8sIHJoc18pKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+CisgIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxMaHNDb250YWluZXI+IHsKKyAgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PAorICAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKExoc0NvbnRhaW5lcik+IExoc1ZpZXc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojp0eXBlIExoc1N0bENvbnRhaW5lcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OmNvbnN0X3JlZmVyZW5jZSBMaHNTdGxDb250YWluZXJSZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgTGhzVmFsdWU7CisgICAgLy8gV2UgcGFzcyB0aGUgTEhTIHZhbHVlIGFuZCB0aGUgUkhTIHZhbHVlIHRvIHRoZSBpbm5lciBtYXRjaGVyIGJ5CisgICAgLy8gcmVmZXJlbmNlLCBhcyB0aGV5IG1heSBiZSBleHBlbnNpdmUgdG8gY29weS4gIFdlIG11c3QgdXNlIHR1cGxlCisgICAgLy8gaW5zdGVhZCBvZiBwYWlyIGhlcmUsIGFzIGEgcGFpciBjYW5ub3QgaG9sZCByZWZlcmVuY2VzIChDKysgOTgsCisgICAgLy8gMjAuMi4yIFtsaWIucGFpcnNdKS4KKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Y29uc3QgTGhzVmFsdWUmLCBjb25zdCBSaHNWYWx1ZSY+IElubmVyTWF0Y2hlckFyZzsKKworICAgIEltcGwoY29uc3QgVHVwbGVNYXRjaGVyJiB0dXBsZV9tYXRjaGVyLCBjb25zdCBSaHNTdGxDb250YWluZXImIHJocykKKyAgICAgICAgLy8gbW9ub190dXBsZV9tYXRjaGVyXyBob2xkcyBhIG1vbm9tb3JwaGljIHZlcnNpb24gb2YgdGhlIHR1cGxlIG1hdGNoZXIuCisgICAgICAgIDogbW9ub190dXBsZV9tYXRjaGVyXyhTYWZlTWF0Y2hlckNhc3Q8SW5uZXJNYXRjaGVyQXJnPih0dXBsZV9tYXRjaGVyKSksCisgICAgICAgICAgcmhzXyhyaHMpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAgICpvcyA8PCAiY29udGFpbnMgIiA8PCByaHNfLnNpemUoKQorICAgICAgICAgIDw8ICIgdmFsdWVzLCB3aGVyZSBlYWNoIHZhbHVlIGFuZCBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiAiOworICAgICAgVW5pdmVyc2FsUHJpbnRlcjxSaHNTdGxDb250YWluZXI+OjpQcmludChyaHNfLCBvcyk7CisgICAgICAqb3MgPDwgIiAiOworICAgICAgbW9ub190dXBsZV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAgICpvcyA8PCAiZG9lc24ndCBjb250YWluIGV4YWN0bHkgIiA8PCByaHNfLnNpemUoKQorICAgICAgICAgIDw8ICIgdmFsdWVzLCBvciBjb250YWlucyBhIHZhbHVlIHggYXQgc29tZSBpbmRleCBpIgorICAgICAgICAgIDw8ICIgd2hlcmUgeCBhbmQgdGhlIGktdGggdmFsdWUgb2YgIjsKKyAgICAgIFVuaXZlcnNhbFByaW50KHJoc18sIG9zKTsKKyAgICAgICpvcyA8PCAiICI7CisgICAgICBtb25vX3R1cGxlX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihMaHNDb250YWluZXIgbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAgIExoc1N0bENvbnRhaW5lclJlZmVyZW5jZSBsaHNfc3RsX2NvbnRhaW5lciA9IExoc1ZpZXc6OkNvbnN0UmVmZXJlbmNlKGxocyk7CisgICAgICBjb25zdCBzaXplX3QgYWN0dWFsX3NpemUgPSBsaHNfc3RsX2NvbnRhaW5lci5zaXplKCk7CisgICAgICBpZiAoYWN0dWFsX3NpemUgIT0gcmhzXy5zaXplKCkpIHsKKyAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBjb250YWlucyAiIDw8IGFjdHVhbF9zaXplIDw8ICIgdmFsdWVzIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICB0eXBlbmFtZSBMaHNTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGxlZnQgPSBsaHNfc3RsX2NvbnRhaW5lci5iZWdpbigpOworICAgICAgdHlwZW5hbWUgUmhzU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciByaWdodCA9IHJoc18uYmVnaW4oKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGFjdHVhbF9zaXplOyArK2ksICsrbGVmdCwgKytyaWdodCkgeworICAgICAgICBjb25zdCBJbm5lck1hdGNoZXJBcmcgdmFsdWVfcGFpcigqbGVmdCwgKnJpZ2h0KTsKKworICAgICAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7CisgICAgICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBpbm5lcl9saXN0ZW5lcjsKKyAgICAgICAgICBpZiAoIW1vbm9fdHVwbGVfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKAorICAgICAgICAgICAgICAgICAgdmFsdWVfcGFpciwgJmlubmVyX2xpc3RlbmVyKSkgeworICAgICAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSB0aGUgdmFsdWUgcGFpciAoIjsKKyAgICAgICAgICAgIFVuaXZlcnNhbFByaW50KCpsZWZ0LCBsaXN0ZW5lci0+c3RyZWFtKCkpOworICAgICAgICAgICAgKmxpc3RlbmVyIDw8ICIsICI7CisgICAgICAgICAgICBVbml2ZXJzYWxQcmludCgqcmlnaHQsIGxpc3RlbmVyLT5zdHJlYW0oKSk7CisgICAgICAgICAgICAqbGlzdGVuZXIgPDwgIikgYXQgaW5kZXggIyIgPDwgaSA8PCAiIGRvbid0IG1hdGNoIjsKKyAgICAgICAgICAgIFByaW50SWZOb3RFbXB0eShpbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFtb25vX3R1cGxlX21hdGNoZXJfLk1hdGNoZXModmFsdWVfcGFpcikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGNvbnN0IE1hdGNoZXI8SW5uZXJNYXRjaGVyQXJnPiBtb25vX3R1cGxlX21hdGNoZXJfOworICAgIGNvbnN0IFJoc1N0bENvbnRhaW5lciByaHNfOworCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKKyAgfTsKKworIHByaXZhdGU6CisgIGNvbnN0IFR1cGxlTWF0Y2hlciB0dXBsZV9tYXRjaGVyXzsKKyAgY29uc3QgUmhzU3RsQ29udGFpbmVyIHJoc187CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQb2ludHdpc2VNYXRjaGVyKTsKK307CisKKy8vIEhvbGRzIHRoZSBsb2dpYyBjb21tb24gdG8gQ29udGFpbnNNYXRjaGVySW1wbCBhbmQgRWFjaE1hdGNoZXJJbXBsLgordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KK2NsYXNzIFF1YW50aWZpZXJNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7CisgIHR5cGVkZWYgU3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IFZpZXc7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dHlwZSBTdGxDb250YWluZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6Y29uc3RfcmVmZXJlbmNlIFN0bENvbnRhaW5lclJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgRWxlbWVudDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgorICBleHBsaWNpdCBRdWFudGlmaWVyTWF0Y2hlckltcGwoSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXIpCisgICAgICA6IGlubmVyX21hdGNoZXJfKAorICAgICAgICAgICB0ZXN0aW5nOjpTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgRWxlbWVudCY+KGlubmVyX21hdGNoZXIpKSB7fQorCisgIC8vIENoZWNrcyB3aGV0aGVyOgorICAvLyAqIEFsbCBlbGVtZW50cyBpbiB0aGUgY29udGFpbmVyIG1hdGNoLCBpZiBhbGxfZWxlbWVudHNfc2hvdWxkX21hdGNoLgorICAvLyAqIEFueSBlbGVtZW50IGluIHRoZSBjb250YWluZXIgbWF0Y2hlcywgaWYgIWFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2guCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluSW1wbChib29sIGFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICBTdGxDb250YWluZXJSZWZlcmVuY2Ugc3RsX2NvbnRhaW5lciA9IFZpZXc6OkNvbnN0UmVmZXJlbmNlKGNvbnRhaW5lcik7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAodHlwZW5hbWUgU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0bF9jb250YWluZXIuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHN0bF9jb250YWluZXIuZW5kKCk7ICsraXQsICsraSkgeworICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBpbm5lcl9saXN0ZW5lcjsKKyAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlcyA9IGlubmVyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbigqaXQsICZpbm5lcl9saXN0ZW5lcik7CisKKyAgICAgIGlmIChtYXRjaGVzICE9IGFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2gpIHsKKyAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBlbGVtZW50ICMiIDw8IGkKKyAgICAgICAgICAgICAgICAgIDw8IChtYXRjaGVzID8gIiBtYXRjaGVzIiA6ICIgZG9lc24ndCBtYXRjaCIpOworICAgICAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7CisgICAgICAgIHJldHVybiAhYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2g7CisgIH0KKworIHByb3RlY3RlZDoKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBFbGVtZW50Jj4gaW5uZXJfbWF0Y2hlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhRdWFudGlmaWVyTWF0Y2hlckltcGwpOworfTsKKworLy8gSW1wbGVtZW50cyBDb250YWlucyhlbGVtZW50X21hdGNoZXIpIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgdHlwZSBDb250YWluZXIuCisvLyBTeW1tZXRyaWMgdG8gRWFjaE1hdGNoZXJJbXBsLgordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KK2NsYXNzIENvbnRhaW5zTWF0Y2hlckltcGwgOiBwdWJsaWMgUXVhbnRpZmllck1hdGNoZXJJbXBsPENvbnRhaW5lcj4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KKyAgZXhwbGljaXQgQ29udGFpbnNNYXRjaGVySW1wbChJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcikKKyAgICAgIDogUXVhbnRpZmllck1hdGNoZXJJbXBsPENvbnRhaW5lcj4oaW5uZXJfbWF0Y2hlcikge30KKworICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCB0aGF0ICI7CisgICAgdGhpcy0+aW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiZG9lc24ndCBjb250YWluIGFueSBlbGVtZW50IHRoYXQgIjsKKyAgICB0aGlzLT5pbm5lcl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ29udGFpbmVyIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5NYXRjaEFuZEV4cGxhaW5JbXBsKGZhbHNlLCBjb250YWluZXIsIGxpc3RlbmVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhDb250YWluc01hdGNoZXJJbXBsKTsKK307CisKKy8vIEltcGxlbWVudHMgRWFjaChlbGVtZW50X21hdGNoZXIpIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgdHlwZSBDb250YWluZXIuCisvLyBTeW1tZXRyaWMgdG8gQ29udGFpbnNNYXRjaGVySW1wbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CitjbGFzcyBFYWNoTWF0Y2hlckltcGwgOiBwdWJsaWMgUXVhbnRpZmllck1hdGNoZXJJbXBsPENvbnRhaW5lcj4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KKyAgZXhwbGljaXQgRWFjaE1hdGNoZXJJbXBsKElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyKQorICAgICAgOiBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPihpbm5lcl9tYXRjaGVyKSB7fQorCisgIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgIm9ubHkgY29udGFpbnMgZWxlbWVudHMgdGhhdCAiOworICAgIHRoaXMtPmlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOworICB9CisKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImNvbnRhaW5zIHNvbWUgZWxlbWVudCB0aGF0ICI7CisgICAgdGhpcy0+aW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ29udGFpbmVyIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIHJldHVybiB0aGlzLT5NYXRjaEFuZEV4cGxhaW5JbXBsKHRydWUsIGNvbnRhaW5lciwgbGlzdGVuZXIpOworICB9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVhY2hNYXRjaGVySW1wbCk7Cit9OworCisvLyBJbXBsZW1lbnRzIHBvbHltb3JwaGljIENvbnRhaW5zKGVsZW1lbnRfbWF0Y2hlcikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KK2NsYXNzIENvbnRhaW5zTWF0Y2hlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDb250YWluc01hdGNoZXIoTSBtKSA6IGlubmVyX21hdGNoZXJfKG0pIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgeworICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgQ29udGFpbnNNYXRjaGVySW1wbDxDb250YWluZXI+KGlubmVyX21hdGNoZXJfKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IE0gaW5uZXJfbWF0Y2hlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhDb250YWluc01hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBFYWNoKGVsZW1lbnRfbWF0Y2hlcikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KK2NsYXNzIEVhY2hNYXRjaGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEVhY2hNYXRjaGVyKE0gbSkgOiBpbm5lcl9tYXRjaGVyXyhtKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEVhY2hNYXRjaGVySW1wbDxDb250YWluZXI+KGlubmVyX21hdGNoZXJfKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IE0gaW5uZXJfbWF0Y2hlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFYWNoTWF0Y2hlcik7Cit9OworCisvLyBJbXBsZW1lbnRzIEtleShpbm5lcl9tYXRjaGVyKSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50IHBhaXIgdHlwZS4KKy8vIEtleShpbm5lcl9tYXRjaGVyKSBtYXRjaGVzIGFuIHN0ZDo6cGFpciB3aG9zZSAnZmlyc3QnIGZpZWxkIG1hdGNoZXMKKy8vIGlubmVyX21hdGNoZXIuICBGb3IgZXhhbXBsZSwgQ29udGFpbnMoS2V5KEdlKDUpKSkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYW4KKy8vIHN0ZDo6bWFwIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgd2hvc2Uga2V5IGlzID49IDUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+CitjbGFzcyBLZXlNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFBhaXJUeXBlPiB7CisgcHVibGljOgorICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhQYWlyVHlwZSkgUmF3UGFpclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmF3UGFpclR5cGU6OmZpcnN0X3R5cGUgS2V5VHlwZTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgorICBleHBsaWNpdCBLZXlNYXRjaGVySW1wbChJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcikKKyAgICAgIDogaW5uZXJfbWF0Y2hlcl8oCisgICAgICAgICAgdGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0PGNvbnN0IEtleVR5cGUmPihpbm5lcl9tYXRjaGVyKSkgeworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiAna2V5X3ZhbHVlLmZpcnN0JyAodGhlIGtleSkgbWF0Y2hlcyB0aGUgaW5uZXIgbWF0Y2hlci4KKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihQYWlyVHlwZSBrZXlfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOworICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBpbm5lcl9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oa2V5X3ZhbHVlLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlubmVyX2xpc3RlbmVyKTsKKyAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nIGV4cGxhbmF0aW9uID0gaW5uZXJfbGlzdGVuZXIuc3RyKCk7CisgICAgaWYgKGV4cGxhbmF0aW9uICE9ICIiKSB7CisgICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGZpcnN0IGZpZWxkIGlzIGEgdmFsdWUgIiA8PCBleHBsYW5hdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIG1hdGNoOworICB9CisKKyAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiaGFzIGEga2V5IHRoYXQgIjsKKyAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgfQorCisgIC8vIERlc2NyaWJlcyB3aGF0IHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgZG9lcy4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImRvZXNuJ3QgaGF2ZSBhIGtleSB0aGF0ICI7CisgICAgaW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgS2V5VHlwZSY+IGlubmVyX21hdGNoZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oS2V5TWF0Y2hlckltcGwpOworfTsKKworLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBLZXkobWF0Y2hlcl9mb3Jfa2V5KS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNPgorY2xhc3MgS2V5TWF0Y2hlciB7CisgcHVibGljOgorICBleHBsaWNpdCBLZXlNYXRjaGVyKE0gbSkgOiBtYXRjaGVyX2Zvcl9rZXlfKG0pIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhaXJUeXBlPgorICBvcGVyYXRvciBNYXRjaGVyPFBhaXJUeXBlPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEtleU1hdGNoZXJJbXBsPFBhaXJUeXBlPihtYXRjaGVyX2Zvcl9rZXlfKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IE0gbWF0Y2hlcl9mb3Jfa2V5XzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEtleU1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyBQYWlyKGZpcnN0X21hdGNoZXIsIHNlY29uZF9tYXRjaGVyKSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50IHBhaXIKKy8vIHR5cGUgd2l0aCBpdHMgdHdvIG1hdGNoZXJzLiBTZWUgUGFpcigpIGZ1bmN0aW9uIGJlbG93LgordGVtcGxhdGUgPHR5cGVuYW1lIFBhaXJUeXBlPgorY2xhc3MgUGFpck1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8UGFpclR5cGU+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFBhaXJUeXBlKSBSYXdQYWlyVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSYXdQYWlyVHlwZTo6Zmlyc3RfdHlwZSBGaXJzdFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmF3UGFpclR5cGU6OnNlY29uZF90eXBlIFNlY29uZFR5cGU7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0TWF0Y2hlciwgdHlwZW5hbWUgU2Vjb25kTWF0Y2hlcj4KKyAgUGFpck1hdGNoZXJJbXBsKEZpcnN0TWF0Y2hlciBmaXJzdF9tYXRjaGVyLCBTZWNvbmRNYXRjaGVyIHNlY29uZF9tYXRjaGVyKQorICAgICAgOiBmaXJzdF9tYXRjaGVyXygKKyAgICAgICAgICAgIHRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDxjb25zdCBGaXJzdFR5cGUmPihmaXJzdF9tYXRjaGVyKSksCisgICAgICAgIHNlY29uZF9tYXRjaGVyXygKKyAgICAgICAgICAgIHRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDxjb25zdCBTZWNvbmRUeXBlJj4oc2Vjb25kX21hdGNoZXIpKSB7CisgIH0KKworICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJoYXMgYSBmaXJzdCBmaWVsZCB0aGF0ICI7CisgICAgZmlyc3RfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7CisgICAgKm9zIDw8ICIsIGFuZCBoYXMgYSBzZWNvbmQgZmllbGQgdGhhdCAiOworICAgIHNlY29uZF9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgfQorCisgIC8vIERlc2NyaWJlcyB3aGF0IHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgZG9lcy4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImhhcyBhIGZpcnN0IGZpZWxkIHRoYXQgIjsKKyAgICBmaXJzdF9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICAgICpvcyA8PCAiLCBvciBoYXMgYSBzZWNvbmQgZmllbGQgdGhhdCAiOworICAgIHNlY29uZF9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiAnYV9wYWlyLmZpcnN0JyBtYXRjaGVzIGZpcnN0X21hdGNoZXIgYW5kICdhX3BhaXIuc2Vjb25kJworICAvLyBtYXRjaGVzIHNlY29uZF9tYXRjaGVyLgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFBhaXJUeXBlIGFfcGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGlmICghbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7CisgICAgICAvLyBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IGludGVyZXN0ZWQsIHdlIGRvbid0IG5lZWQgdG8gY29uc3RydWN0IHRoZQorICAgICAgLy8gZXhwbGFuYXRpb24uCisgICAgICByZXR1cm4gZmlyc3RfbWF0Y2hlcl8uTWF0Y2hlcyhhX3BhaXIuZmlyc3QpICYmCisgICAgICAgICAgICAgc2Vjb25kX21hdGNoZXJfLk1hdGNoZXMoYV9wYWlyLnNlY29uZCk7CisgICAgfQorICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgZmlyc3RfaW5uZXJfbGlzdGVuZXI7CisgICAgaWYgKCFmaXJzdF9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oYV9wYWlyLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9pbm5lcl9saXN0ZW5lcikpIHsKKyAgICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZmlyc3QgZmllbGQgZG9lcyBub3QgbWF0Y2giOworICAgICAgUHJpbnRJZk5vdEVtcHR5KGZpcnN0X2lubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIHNlY29uZF9pbm5lcl9saXN0ZW5lcjsKKyAgICBpZiAoIXNlY29uZF9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oYV9wYWlyLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZF9pbm5lcl9saXN0ZW5lcikpIHsKKyAgICAgICpsaXN0ZW5lciA8PCAid2hvc2Ugc2Vjb25kIGZpZWxkIGRvZXMgbm90IG1hdGNoIjsKKyAgICAgIFByaW50SWZOb3RFbXB0eShzZWNvbmRfaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEV4cGxhaW5TdWNjZXNzKGZpcnN0X2lubmVyX2xpc3RlbmVyLnN0cigpLCBzZWNvbmRfaW5uZXJfbGlzdGVuZXIuc3RyKCksCisgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIEV4cGxhaW5TdWNjZXNzKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIGZpcnN0X2V4cGxhbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHNlY29uZF9leHBsYW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgICpsaXN0ZW5lciA8PCAid2hvc2UgYm90aCBmaWVsZHMgbWF0Y2giOworICAgIGlmIChmaXJzdF9leHBsYW5hdGlvbiAhPSAiIikgeworICAgICAgKmxpc3RlbmVyIDw8ICIsIHdoZXJlIHRoZSBmaXJzdCBmaWVsZCBpcyBhIHZhbHVlICIgPDwgZmlyc3RfZXhwbGFuYXRpb247CisgICAgfQorICAgIGlmIChzZWNvbmRfZXhwbGFuYXRpb24gIT0gIiIpIHsKKyAgICAgICpsaXN0ZW5lciA8PCAiLCAiOworICAgICAgaWYgKGZpcnN0X2V4cGxhbmF0aW9uICE9ICIiKSB7CisgICAgICAgICpsaXN0ZW5lciA8PCAiYW5kICI7CisgICAgICB9IGVsc2UgeworICAgICAgICAqbGlzdGVuZXIgPDwgIndoZXJlICI7CisgICAgICB9CisgICAgICAqbGlzdGVuZXIgPDwgInRoZSBzZWNvbmQgZmllbGQgaXMgYSB2YWx1ZSAiIDw8IHNlY29uZF9leHBsYW5hdGlvbjsKKyAgICB9CisgIH0KKworICBjb25zdCBNYXRjaGVyPGNvbnN0IEZpcnN0VHlwZSY+IGZpcnN0X21hdGNoZXJfOworICBjb25zdCBNYXRjaGVyPGNvbnN0IFNlY29uZFR5cGUmPiBzZWNvbmRfbWF0Y2hlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQYWlyTWF0Y2hlckltcGwpOworfTsKKworLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBQYWlyKGZpcnN0X21hdGNoZXIsIHNlY29uZF9tYXRjaGVyKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdE1hdGNoZXIsIHR5cGVuYW1lIFNlY29uZE1hdGNoZXI+CitjbGFzcyBQYWlyTWF0Y2hlciB7CisgcHVibGljOgorICBQYWlyTWF0Y2hlcihGaXJzdE1hdGNoZXIgZmlyc3RfbWF0Y2hlciwgU2Vjb25kTWF0Y2hlciBzZWNvbmRfbWF0Y2hlcikKKyAgICAgIDogZmlyc3RfbWF0Y2hlcl8oZmlyc3RfbWF0Y2hlciksIHNlY29uZF9tYXRjaGVyXyhzZWNvbmRfbWF0Y2hlcikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+CisgIG9wZXJhdG9yIE1hdGNoZXI8UGFpclR5cGU+ICgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIoCisgICAgICAgIG5ldyBQYWlyTWF0Y2hlckltcGw8UGFpclR5cGU+KAorICAgICAgICAgICAgZmlyc3RfbWF0Y2hlcl8sIHNlY29uZF9tYXRjaGVyXykpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBGaXJzdE1hdGNoZXIgZmlyc3RfbWF0Y2hlcl87CisgIGNvbnN0IFNlY29uZE1hdGNoZXIgc2Vjb25kX21hdGNoZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUGFpck1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyBFbGVtZW50c0FyZSgpIGFuZCBFbGVtZW50c0FyZUFycmF5KCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorY2xhc3MgRWxlbWVudHNBcmVNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPiBWaWV3OworICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnR5cGUgU3RsQ29udGFpbmVyOworICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OmNvbnN0X3JlZmVyZW5jZSBTdGxDb250YWluZXJSZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3RsQ29udGFpbmVyOjp2YWx1ZV90eXBlIEVsZW1lbnQ7CisKKyAgLy8gQ29uc3RydWN0cyB0aGUgbWF0Y2hlciBmcm9tIGEgc2VxdWVuY2Ugb2YgZWxlbWVudCB2YWx1ZXMgb3IKKyAgLy8gZWxlbWVudCBtYXRjaGVycy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcj4KKyAgRWxlbWVudHNBcmVNYXRjaGVySW1wbChJbnB1dEl0ZXIgZmlyc3QsIElucHV0SXRlciBsYXN0KSB7CisgICAgd2hpbGUgKGZpcnN0ICE9IGxhc3QpIHsKKyAgICAgIG1hdGNoZXJzXy5wdXNoX2JhY2soTWF0Y2hlckNhc3Q8Y29uc3QgRWxlbWVudCY+KCpmaXJzdCsrKSk7CisgICAgfQorICB9CisKKyAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgIGlmIChjb3VudCgpID09IDApIHsKKyAgICAgICpvcyA8PCAiaXMgZW1wdHkiOworICAgIH0gZWxzZSBpZiAoY291bnQoKSA9PSAxKSB7CisgICAgICAqb3MgPDwgImhhcyAxIGVsZW1lbnQgdGhhdCAiOworICAgICAgbWF0Y2hlcnNfWzBdLkRlc2NyaWJlVG8ob3MpOworICAgIH0gZWxzZSB7CisgICAgICAqb3MgPDwgImhhcyAiIDw8IEVsZW1lbnRzKGNvdW50KCkpIDw8ICIgd2hlcmVcbiI7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBjb3VudCgpOyArK2kpIHsKKyAgICAgICAgKm9zIDw8ICJlbGVtZW50ICMiIDw8IGkgPDwgIiAiOworICAgICAgICBtYXRjaGVyc19baV0uRGVzY3JpYmVUbyhvcyk7CisgICAgICAgIGlmIChpICsgMSA8IGNvdW50KCkpIHsKKyAgICAgICAgICAqb3MgPDwgIixcbiI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBEZXNjcmliZXMgd2hhdCB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIGRvZXMuCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgaWYgKGNvdW50KCkgPT0gMCkgeworICAgICAgKm9zIDw8ICJpc24ndCBlbXB0eSI7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgKm9zIDw8ICJkb2Vzbid0IGhhdmUgIiA8PCBFbGVtZW50cyhjb3VudCgpKSA8PCAiLCBvclxuIjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBjb3VudCgpOyArK2kpIHsKKyAgICAgICpvcyA8PCAiZWxlbWVudCAjIiA8PCBpIDw8ICIgIjsKKyAgICAgIG1hdGNoZXJzX1tpXS5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICAgICAgaWYgKGkgKyAxIDwgY291bnQoKSkgeworICAgICAgICAqb3MgPDwgIiwgb3JcbiI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gVG8gd29yayB3aXRoIHN0cmVhbS1saWtlICJjb250YWluZXJzIiwgd2UgbXVzdCBvbmx5IHdhbGsKKyAgICAvLyB0aHJvdWdoIHRoZSBlbGVtZW50cyBpbiBvbmUgcGFzcy4KKworICAgIGNvbnN0IGJvb2wgbGlzdGVuZXJfaW50ZXJlc3RlZCA9IGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKTsKKworICAgIC8vIGV4cGxhbmF0aW9uc1tpXSBpcyB0aGUgZXhwbGFuYXRpb24gb2YgdGhlIGVsZW1lbnQgYXQgaW5kZXggaS4KKyAgICA6OnN0ZDo6dmVjdG9yPGludGVybmFsOjpzdHJpbmc+IGV4cGxhbmF0aW9ucyhjb3VudCgpKTsKKyAgICBTdGxDb250YWluZXJSZWZlcmVuY2Ugc3RsX2NvbnRhaW5lciA9IFZpZXc6OkNvbnN0UmVmZXJlbmNlKGNvbnRhaW5lcik7CisgICAgdHlwZW5hbWUgU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0bF9jb250YWluZXIuYmVnaW4oKTsKKyAgICBzaXplX3QgZXhhbV9wb3MgPSAwOworICAgIGJvb2wgbWlzbWF0Y2hfZm91bmQgPSBmYWxzZTsgIC8vIEhhdmUgd2UgZm91bmQgYSBtaXNtYXRjaGVkIGVsZW1lbnQgeWV0PworCisgICAgLy8gR28gdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIG1hdGNoZXJzIGluIHBhaXJzLCB1bnRpbCB3ZSByZWFjaAorICAgIC8vIHRoZSBlbmQgb2YgZWl0aGVyIHRoZSBlbGVtZW50cyBvciB0aGUgbWF0Y2hlcnMsIG9yIHVudGlsIHdlIGZpbmQgYQorICAgIC8vIG1pc21hdGNoLgorICAgIGZvciAoOyBpdCAhPSBzdGxfY29udGFpbmVyLmVuZCgpICYmIGV4YW1fcG9zICE9IGNvdW50KCk7ICsraXQsICsrZXhhbV9wb3MpIHsKKyAgICAgIGJvb2wgbWF0Y2g7ICAvLyBEb2VzIHRoZSBjdXJyZW50IGVsZW1lbnQgbWF0Y2ggdGhlIGN1cnJlbnQgbWF0Y2hlcj8KKyAgICAgIGlmIChsaXN0ZW5lcl9pbnRlcmVzdGVkKSB7CisgICAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgczsKKyAgICAgICAgbWF0Y2ggPSBtYXRjaGVyc19bZXhhbV9wb3NdLk1hdGNoQW5kRXhwbGFpbigqaXQsICZzKTsKKyAgICAgICAgZXhwbGFuYXRpb25zW2V4YW1fcG9zXSA9IHMuc3RyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXRjaCA9IG1hdGNoZXJzX1tleGFtX3Bvc10uTWF0Y2hlcygqaXQpOworICAgICAgfQorCisgICAgICBpZiAoIW1hdGNoKSB7CisgICAgICAgIG1pc21hdGNoX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIC8vIElmIG1pc21hdGNoX2ZvdW5kIGlzIHRydWUsICdleGFtX3BvcycgaXMgdGhlIGluZGV4IG9mIHRoZSBtaXNtYXRjaC4KKworICAgIC8vIEZpbmQgaG93IG1hbnkgZWxlbWVudHMgdGhlIGFjdHVhbCBjb250YWluZXIgaGFzLiAgV2UgYXZvaWQKKyAgICAvLyBjYWxsaW5nIHNpemUoKSBzLnQuIHRoaXMgY29kZSB3b3JrcyBmb3Igc3RyZWFtLWxpa2UgImNvbnRhaW5lcnMiCisgICAgLy8gdGhhdCBkb24ndCBkZWZpbmUgc2l6ZSgpLgorICAgIHNpemVfdCBhY3R1YWxfY291bnQgPSBleGFtX3BvczsKKyAgICBmb3IgKDsgaXQgIT0gc3RsX2NvbnRhaW5lci5lbmQoKTsgKytpdCkgeworICAgICAgKythY3R1YWxfY291bnQ7CisgICAgfQorCisgICAgaWYgKGFjdHVhbF9jb3VudCAhPSBjb3VudCgpKSB7CisgICAgICAvLyBUaGUgZWxlbWVudCBjb3VudCBkb2Vzbid0IG1hdGNoLiAgSWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eSwKKyAgICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byBleHBsYWluIGFueXRoaW5nIGFzIEdvb2dsZSBNb2NrIGFscmVhZHkKKyAgICAgIC8vIHByaW50cyB0aGUgZW1wdHkgY29udGFpbmVyLiAgT3RoZXJ3aXNlIHdlIGp1c3QgbmVlZCB0byBzaG93CisgICAgICAvLyBob3cgbWFueSBlbGVtZW50cyB0aGVyZSBhY3R1YWxseSBhcmUuCisgICAgICBpZiAobGlzdGVuZXJfaW50ZXJlc3RlZCAmJiAoYWN0dWFsX2NvdW50ICE9IDApKSB7CisgICAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaGFzICIgPDwgRWxlbWVudHMoYWN0dWFsX2NvdW50KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobWlzbWF0Y2hfZm91bmQpIHsKKyAgICAgIC8vIFRoZSBlbGVtZW50IGNvdW50IG1hdGNoZXMsIGJ1dCB0aGUgZXhhbV9wb3MtdGggZWxlbWVudCBkb2Vzbid0IG1hdGNoLgorICAgICAgaWYgKGxpc3RlbmVyX2ludGVyZXN0ZWQpIHsKKyAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBlbGVtZW50ICMiIDw8IGV4YW1fcG9zIDw8ICIgZG9lc24ndCBtYXRjaCI7CisgICAgICAgIFByaW50SWZOb3RFbXB0eShleHBsYW5hdGlvbnNbZXhhbV9wb3NdLCBsaXN0ZW5lci0+c3RyZWFtKCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEV2ZXJ5IGVsZW1lbnQgbWF0Y2hlcyBpdHMgZXhwZWN0YXRpb24uICBXZSBuZWVkIHRvIGV4cGxhaW4gd2h5CisgICAgLy8gKHRoZSBvYnZpb3VzIG9uZXMgY2FuIGJlIHNraXBwZWQpLgorICAgIGlmIChsaXN0ZW5lcl9pbnRlcmVzdGVkKSB7CisgICAgICBib29sIHJlYXNvbl9wcmludGVkID0gZmFsc2U7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBjb3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyA9IGV4cGxhbmF0aW9uc1tpXTsKKyAgICAgICAgaWYgKCFzLmVtcHR5KCkpIHsKKyAgICAgICAgICBpZiAocmVhc29uX3ByaW50ZWQpIHsKKyAgICAgICAgICAgICpsaXN0ZW5lciA8PCAiLFxuYW5kICI7CisgICAgICAgICAgfQorICAgICAgICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZWxlbWVudCAjIiA8PCBpIDw8ICIgbWF0Y2hlcywgIiA8PCBzOworICAgICAgICAgIHJlYXNvbl9wcmludGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE1lc3NhZ2UgRWxlbWVudHMoc2l6ZV90IGNvdW50KSB7CisgICAgcmV0dXJuIE1lc3NhZ2UoKSA8PCBjb3VudCA8PCAoY291bnQgPT0gMSA/ICIgZWxlbWVudCIgOiAiIGVsZW1lbnRzIik7CisgIH0KKworICBzaXplX3QgY291bnQoKSBjb25zdCB7IHJldHVybiBtYXRjaGVyc18uc2l6ZSgpOyB9CisKKyAgOjpzdGQ6OnZlY3RvcjxNYXRjaGVyPGNvbnN0IEVsZW1lbnQmPiA+IG1hdGNoZXJzXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVsZW1lbnRzQXJlTWF0Y2hlckltcGwpOworfTsKKworLy8gQ29ubmVjdGl2aXR5IG1hdHJpeCBvZiAoZWxlbWVudHMgWCBtYXRjaGVycyksIGluIGVsZW1lbnQtbWFqb3Igb3JkZXIuCisvLyBJbml0aWFsbHksIHRoZXJlIGFyZSBubyBlZGdlcy4KKy8vIFVzZSBOZXh0R3JhcGgoKSB0byBpdGVyYXRlIG92ZXIgYWxsIHBvc3NpYmxlIGVkZ2UgY29uZmlndXJhdGlvbnMuCisvLyBVc2UgUmFuZG9taXplKCkgdG8gZ2VuZXJhdGUgYSByYW5kb20gZWRnZSBjb25maWd1cmF0aW9uLgorY2xhc3MgR1RFU1RfQVBJXyBNYXRjaE1hdHJpeCB7CisgcHVibGljOgorICBNYXRjaE1hdHJpeChzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgbnVtX21hdGNoZXJzKQorICAgICAgOiBudW1fZWxlbWVudHNfKG51bV9lbGVtZW50cyksCisgICAgICAgIG51bV9tYXRjaGVyc18obnVtX21hdGNoZXJzKSwKKyAgICAgICAgbWF0Y2hlZF8obnVtX2VsZW1lbnRzXyogbnVtX21hdGNoZXJzXywgMCkgeworICB9CisKKyAgc2l6ZV90IExoc1NpemUoKSBjb25zdCB7IHJldHVybiBudW1fZWxlbWVudHNfOyB9CisgIHNpemVfdCBSaHNTaXplKCkgY29uc3QgeyByZXR1cm4gbnVtX21hdGNoZXJzXzsgfQorICBib29sIEhhc0VkZ2Uoc2l6ZV90IGlsaHMsIHNpemVfdCBpcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIG1hdGNoZWRfW1NwYWNlSW5kZXgoaWxocywgaXJocyldID09IDE7CisgIH0KKyAgdm9pZCBTZXRFZGdlKHNpemVfdCBpbGhzLCBzaXplX3QgaXJocywgYm9vbCBiKSB7CisgICAgbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV0gPSBiID8gMSA6IDA7CisgIH0KKworICAvLyBUcmVhdGluZyB0aGUgY29ubmVjdGl2aXR5IG1hdHJpeCBhcyBhIChMaHNTaXplKCkqUmhzU2l6ZSgpKS1iaXQgbnVtYmVyLAorICAvLyBhZGRzIDEgdG8gdGhhdCBudW1iZXI7IHJldHVybnMgZmFsc2UgaWYgaW5jcmVtZW50aW5nIHRoZSBncmFwaCBsZWZ0IGl0CisgIC8vIGVtcHR5LgorICBib29sIE5leHRHcmFwaCgpOworCisgIHZvaWQgUmFuZG9taXplKCk7CisKKyAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBzaXplX3QgU3BhY2VJbmRleChzaXplX3QgaWxocywgc2l6ZV90IGlyaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gaWxocyAqIG51bV9tYXRjaGVyc18gKyBpcmhzOworICB9CisKKyAgc2l6ZV90IG51bV9lbGVtZW50c187CisgIHNpemVfdCBudW1fbWF0Y2hlcnNfOworCisgIC8vIEVhY2ggZWxlbWVudCBpcyBhIGNoYXIgaW50ZXJwcmV0ZWQgYXMgYm9vbC4gVGhleSBhcmUgc3RvcmVkIGFzIGEKKyAgLy8gZmxhdHRlbmVkIGFycmF5IGluIGxocy1tYWpvciBvcmRlciwgdXNlICdTcGFjZUluZGV4KCknIHRvIHRyYW5zbGF0ZQorICAvLyBhIChpbGhzLCBpcmhzKSBtYXRyaXggY29vcmRpbmF0ZSBpbnRvIGFuIG9mZnNldC4KKyAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBtYXRjaGVkXzsKK307CisKK3R5cGVkZWYgOjpzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+IEVsZW1lbnRNYXRjaGVyUGFpcjsKK3R5cGVkZWYgOjpzdGQ6OnZlY3RvcjxFbGVtZW50TWF0Y2hlclBhaXI+IEVsZW1lbnRNYXRjaGVyUGFpcnM7CisKKy8vIFJldHVybnMgYSBtYXhpbXVtIGJpcGFydGl0ZSBtYXRjaGluZyBmb3IgdGhlIHNwZWNpZmllZCBncmFwaCAnZycuCisvLyBUaGUgbWF0Y2hpbmcgaXMgcmVwcmVzZW50ZWQgYXMgYSB2ZWN0b3Igb2Yge2VsZW1lbnQsIG1hdGNoZXJ9IHBhaXJzLgorR1RFU1RfQVBJXyBFbGVtZW50TWF0Y2hlclBhaXJzCitGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcoY29uc3QgTWF0Y2hNYXRyaXgmIGcpOworCitHVEVTVF9BUElfIGJvb2wgRmluZFBhaXJpbmcoY29uc3QgTWF0Y2hNYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKy8vIFVudHlwZWQgYmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIFVub3JkZXJlZEVsZW1lbnRzQXJlLiAgQnkKKy8vIHB1dHRpbmcgbG9naWMgdGhhdCdzIG5vdCBzcGVjaWZpYyB0byB0aGUgZWxlbWVudCB0eXBlIGhlcmUsIHdlCisvLyByZWR1Y2UgYmluYXJ5IGJsb2F0IGFuZCBpbmNyZWFzZSBjb21waWxhdGlvbiBzcGVlZC4KK2NsYXNzIEdURVNUX0FQSV8gVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2UgeworIHByb3RlY3RlZDoKKyAgLy8gQSB2ZWN0b3Igb2YgbWF0Y2hlciBkZXNjcmliZXJzLCBvbmUgZm9yIGVhY2ggZWxlbWVudCBtYXRjaGVyLgorICAvLyBEb2VzIG5vdCBvd24gdGhlIGRlc2NyaWJlcnMgKGFuZCB0aHVzIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiB0aGUKKyAgLy8gZWxlbWVudCBtYXRjaGVycyBhcmUgYWxpdmUpLgorICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8Y29uc3QgTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZSo+IE1hdGNoZXJEZXNjcmliZXJWZWM7CisKKyAgLy8gRGVzY3JpYmVzIHRoaXMgVW5vcmRlcmVkRWxlbWVudHNBcmUgbWF0Y2hlci4KKyAgdm9pZCBEZXNjcmliZVRvSW1wbCg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0OworCisgIC8vIERlc2NyaWJlcyB0aGUgbmVnYXRpb24gb2YgdGhpcyBVbm9yZGVyZWRFbGVtZW50c0FyZSBtYXRjaGVyLgorICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ub0ltcGwoOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdDsKKworICBib29sIFZlcmlmeUFsbEVsZW1lbnRzQW5kTWF0Y2hlcnNBcmVNYXRjaGVkKAorICAgICAgY29uc3QgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+JiBlbGVtZW50X3ByaW50b3V0cywKKyAgICAgIGNvbnN0IE1hdGNoTWF0cml4JiBtYXRyaXgsCisgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Q7CisKKyAgTWF0Y2hlckRlc2NyaWJlclZlYyYgbWF0Y2hlcl9kZXNjcmliZXJzKCkgeworICAgIHJldHVybiBtYXRjaGVyX2Rlc2NyaWJlcnNfOworICB9CisKKyAgc3RhdGljIE1lc3NhZ2UgRWxlbWVudHMoc2l6ZV90IG4pIHsKKyAgICByZXR1cm4gTWVzc2FnZSgpIDw8IG4gPDwgIiBlbGVtZW50IiA8PCAobiA9PSAxID8gIiIgOiAicyIpOworICB9CisKKyBwcml2YXRlOgorICBNYXRjaGVyRGVzY3JpYmVyVmVjIG1hdGNoZXJfZGVzY3JpYmVyc187CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZSk7Cit9OworCisvLyBJbXBsZW1lbnRzIHVub3JkZXJlZCBFbGVtZW50c0FyZSBhbmQgdW5vcmRlcmVkIEVsZW1lbnRzQXJlQXJyYXkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorY2xhc3MgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbAorICAgIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiwKKyAgICAgIHB1YmxpYyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IFZpZXc7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dHlwZSBTdGxDb250YWluZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6Y29uc3RfcmVmZXJlbmNlIFN0bENvbnRhaW5lclJlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIFN0bENvbnRhaW5lckNvbnN0SXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3RsQ29udGFpbmVyOjp2YWx1ZV90eXBlIEVsZW1lbnQ7CisKKyAgLy8gQ29uc3RydWN0cyB0aGUgbWF0Y2hlciBmcm9tIGEgc2VxdWVuY2Ugb2YgZWxlbWVudCB2YWx1ZXMgb3IKKyAgLy8gZWxlbWVudCBtYXRjaGVycy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcj4KKyAgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbChJbnB1dEl0ZXIgZmlyc3QsIElucHV0SXRlciBsYXN0KSB7CisgICAgZm9yICg7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QpIHsKKyAgICAgIG1hdGNoZXJzXy5wdXNoX2JhY2soTWF0Y2hlckNhc3Q8Y29uc3QgRWxlbWVudCY+KCpmaXJzdCkpOworICAgICAgbWF0Y2hlcl9kZXNjcmliZXJzKCkucHVzaF9iYWNrKG1hdGNoZXJzXy5iYWNrKCkuR2V0RGVzY3JpYmVyKCkpOworICAgIH0KKyAgfQorCisgIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLgorICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2U6OkRlc2NyaWJlVG9JbXBsKG9zKTsKKyAgfQorCisgIC8vIERlc2NyaWJlcyB3aGF0IHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgZG9lcy4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2U6OkRlc2NyaWJlTmVnYXRpb25Ub0ltcGwob3MpOworICB9CisKKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgU3RsQ29udGFpbmVyUmVmZXJlbmNlIHN0bF9jb250YWluZXIgPSBWaWV3OjpDb25zdFJlZmVyZW5jZShjb250YWluZXIpOworICAgIDo6c3RkOjp2ZWN0b3I8c3RyaW5nPiBlbGVtZW50X3ByaW50b3V0czsKKyAgICBNYXRjaE1hdHJpeCBtYXRyaXggPSBBbmFseXplRWxlbWVudHMoc3RsX2NvbnRhaW5lci5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGxfY29udGFpbmVyLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudF9wcmludG91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKworICAgIGNvbnN0IHNpemVfdCBhY3R1YWxfY291bnQgPSBtYXRyaXguTGhzU2l6ZSgpOworICAgIGlmIChhY3R1YWxfY291bnQgPT0gMCAmJiBtYXRjaGVyc18uZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChhY3R1YWxfY291bnQgIT0gbWF0Y2hlcnNfLnNpemUoKSkgeworICAgICAgLy8gVGhlIGVsZW1lbnQgY291bnQgZG9lc24ndCBtYXRjaC4gIElmIHRoZSBjb250YWluZXIgaXMgZW1wdHksCisgICAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gZXhwbGFpbiBhbnl0aGluZyBhcyBHb29nbGUgTW9jayBhbHJlYWR5CisgICAgICAvLyBwcmludHMgdGhlIGVtcHR5IGNvbnRhaW5lci4gT3RoZXJ3aXNlIHdlIGp1c3QgbmVlZCB0byBzaG93CisgICAgICAvLyBob3cgbWFueSBlbGVtZW50cyB0aGVyZSBhY3R1YWxseSBhcmUuCisgICAgICBpZiAoYWN0dWFsX2NvdW50ICE9IDAgJiYgbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7CisgICAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaGFzICIgPDwgRWxlbWVudHMoYWN0dWFsX2NvdW50KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gVmVyaWZ5QWxsRWxlbWVudHNBbmRNYXRjaGVyc0FyZU1hdGNoZWQoZWxlbWVudF9wcmludG91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeCwgbGlzdGVuZXIpICYmCisgICAgICAgICAgIEZpbmRQYWlyaW5nKG1hdHJpeCwgbGlzdGVuZXIpOworICB9CisKKyBwcml2YXRlOgorICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8TWF0Y2hlcjxjb25zdCBFbGVtZW50Jj4gPiBNYXRjaGVyVmVjOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50SXRlcj4KKyAgTWF0Y2hNYXRyaXggQW5hbHl6ZUVsZW1lbnRzKEVsZW1lbnRJdGVyIGVsZW1fZmlyc3QsIEVsZW1lbnRJdGVyIGVsZW1fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjp2ZWN0b3I8c3RyaW5nPiogZWxlbWVudF9wcmludG91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGVsZW1lbnRfcHJpbnRvdXRzLT5jbGVhcigpOworICAgIDo6c3RkOjp2ZWN0b3I8Y2hhcj4gZGlkX21hdGNoOworICAgIHNpemVfdCBudW1fZWxlbWVudHMgPSAwOworICAgIGZvciAoOyBlbGVtX2ZpcnN0ICE9IGVsZW1fbGFzdDsgKytudW1fZWxlbWVudHMsICsrZWxlbV9maXJzdCkgeworICAgICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgeworICAgICAgICBlbGVtZW50X3ByaW50b3V0cy0+cHVzaF9iYWNrKFByaW50VG9TdHJpbmcoKmVsZW1fZmlyc3QpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzICE9IG1hdGNoZXJzXy5zaXplKCk7ICsraXJocykgeworICAgICAgICBkaWRfbWF0Y2gucHVzaF9iYWNrKE1hdGNoZXMobWF0Y2hlcnNfW2lyaHNdKSgqZWxlbV9maXJzdCkpOworICAgICAgfQorICAgIH0KKworICAgIE1hdGNoTWF0cml4IG1hdHJpeChudW1fZWxlbWVudHMsIG1hdGNoZXJzXy5zaXplKCkpOworICAgIDo6c3RkOjp2ZWN0b3I8Y2hhcj46OmNvbnN0X2l0ZXJhdG9yIGRpZF9tYXRjaF9pdGVyID0gZGlkX21hdGNoLmJlZ2luKCk7CisgICAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgIT0gbnVtX2VsZW1lbnRzOyArK2lsaHMpIHsKKyAgICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzICE9IG1hdGNoZXJzXy5zaXplKCk7ICsraXJocykgeworICAgICAgICBtYXRyaXguU2V0RWRnZShpbGhzLCBpcmhzLCAqZGlkX21hdGNoX2l0ZXIrKyAhPSAwKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1hdHJpeDsKKyAgfQorCisgIE1hdGNoZXJWZWMgbWF0Y2hlcnNfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbCk7Cit9OworCisvLyBGdW5jdG9yIGZvciB1c2UgaW4gVHJhbnNmb3JtVHVwbGUuCisvLyBQZXJmb3JtcyBNYXRjaGVyQ2FzdDxUYXJnZXQ+IG9uIGFuIGlucHV0IGFyZ3VtZW50IG9mIGFueSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFRhcmdldD4KK3N0cnVjdCBDYXN0QW5kQXBwZW5kVHJhbnNmb3JtIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZz4KKyAgTWF0Y2hlcjxUYXJnZXQ+IG9wZXJhdG9yKCkoY29uc3QgQXJnJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIE1hdGNoZXJDYXN0PFRhcmdldD4oYSk7CisgIH0KK307CisKKy8vIEltcGxlbWVudHMgVW5vcmRlcmVkRWxlbWVudHNBcmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlPgorY2xhc3MgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcihjb25zdCBNYXRjaGVyVHVwbGUmIGFyZ3MpCisgICAgICA6IG1hdGNoZXJzXyhhcmdzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKKyAgICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj46OnR5cGUgVmlldzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnZhbHVlX3R5cGUgRWxlbWVudDsKKyAgICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8TWF0Y2hlcjxjb25zdCBFbGVtZW50Jj4gPiBNYXRjaGVyVmVjOworICAgIE1hdGNoZXJWZWMgbWF0Y2hlcnM7CisgICAgbWF0Y2hlcnMucmVzZXJ2ZSg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8TWF0Y2hlclR1cGxlPjo6dmFsdWUpOworICAgIFRyYW5zZm9ybVR1cGxlVmFsdWVzKENhc3RBbmRBcHBlbmRUcmFuc2Zvcm08Y29uc3QgRWxlbWVudCY+KCksIG1hdGNoZXJzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6YmFja19pbnNlcnRlcihtYXRjaGVycykpOworICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbDxDb250YWluZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcnMuYmVnaW4oKSwgbWF0Y2hlcnMuZW5kKCkpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgTWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyBFbGVtZW50c0FyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGU+CitjbGFzcyBFbGVtZW50c0FyZU1hdGNoZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRWxlbWVudHNBcmVNYXRjaGVyKGNvbnN0IE1hdGNoZXJUdXBsZSYgYXJncykgOiBtYXRjaGVyc18oYXJncykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7CisgICAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+Ojp0eXBlIFZpZXc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp2YWx1ZV90eXBlIEVsZW1lbnQ7CisgICAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+ID4gTWF0Y2hlclZlYzsKKyAgICBNYXRjaGVyVmVjIG1hdGNoZXJzOworICAgIG1hdGNoZXJzLnJlc2VydmUoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPE1hdGNoZXJUdXBsZT46OnZhbHVlKTsKKyAgICBUcmFuc2Zvcm1UdXBsZVZhbHVlcyhDYXN0QW5kQXBwZW5kVHJhbnNmb3JtPGNvbnN0IEVsZW1lbnQmPigpLCBtYXRjaGVyc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OmJhY2tfaW5zZXJ0ZXIobWF0Y2hlcnMpKTsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEVsZW1lbnRzQXJlTWF0Y2hlckltcGw8Q29udGFpbmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXJzLmJlZ2luKCksIG1hdGNoZXJzLmVuZCgpKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IE1hdGNoZXJUdXBsZSBtYXRjaGVyc187CisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWxlbWVudHNBcmVNYXRjaGVyKTsKK307CisKKy8vIEltcGxlbWVudHMgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlciB7CisgcHVibGljOgorICBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcigpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CisgIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyKEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCkKKyAgICAgIDogbWF0Y2hlcnNfKGZpcnN0LCBsYXN0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIoCisgICAgICAgIG5ldyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsPENvbnRhaW5lcj4obWF0Y2hlcnNfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcnNfLmVuZCgpKSk7CisgIH0KKworIHByaXZhdGU6CisgIDo6c3RkOjp2ZWN0b3I8VD4gbWF0Y2hlcnNfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXIpOworfTsKKworLy8gSW1wbGVtZW50cyBFbGVtZW50c0FyZUFycmF5KCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgorICBFbGVtZW50c0FyZUFycmF5TWF0Y2hlcihJdGVyIGZpcnN0LCBJdGVyIGxhc3QpIDogbWF0Y2hlcnNfKGZpcnN0LCBsYXN0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEVsZW1lbnRzQXJlTWF0Y2hlckltcGw8Q29udGFpbmVyPigKKyAgICAgICAgbWF0Y2hlcnNfLmJlZ2luKCksIG1hdGNoZXJzXy5lbmQoKSkpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCA6OnN0ZDo6dmVjdG9yPFQ+IG1hdGNoZXJzXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyKTsKK307CisKKy8vIEdpdmVuIGEgMi10dXBsZSBtYXRjaGVyIHRtIG9mIHR5cGUgVHVwbGUyTWF0Y2hlciBhbmQgYSB2YWx1ZSBzZWNvbmQKKy8vIG9mIHR5cGUgU2Vjb25kLCBCb3VuZFNlY29uZE1hdGNoZXI8VHVwbGUyTWF0Y2hlciwgU2Vjb25kPih0bSwKKy8vIHNlY29uZCkgaXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHZhbHVlIHggaWZmIHRtCisvLyBtYXRjaGVzIHR1cGxlICh4LCBzZWNvbmQpLiAgVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKKy8vIFVub3JkZXJlZFBvaW50d2lzZSgpIGluIHRlcm1zIG9mIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoKS4KKy8vCisvLyBCb3VuZFNlY29uZE1hdGNoZXIgaXMgY29weWFibGUgYW5kIGFzc2lnbmFibGUsIGFzIHdlIG5lZWQgdG8gcHV0CisvLyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBpbiBhIHZlY3RvciB3aGVuIGltcGxlbWVudGluZworLy8gVW5vcmRlcmVkUG9pbnR3aXNlKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUyTWF0Y2hlciwgdHlwZW5hbWUgU2Vjb25kPgorY2xhc3MgQm91bmRTZWNvbmRNYXRjaGVyIHsKKyBwdWJsaWM6CisgIEJvdW5kU2Vjb25kTWF0Y2hlcihjb25zdCBUdXBsZTJNYXRjaGVyJiB0bSwgY29uc3QgU2Vjb25kJiBzZWNvbmQpCisgICAgICA6IHR1cGxlMl9tYXRjaGVyXyh0bSksIHNlY29uZF92YWx1ZV8oc2Vjb25kKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgeworICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxUPih0dXBsZTJfbWF0Y2hlcl8sIHNlY29uZF92YWx1ZV8pKTsKKyAgfQorCisgIC8vIFdlIGhhdmUgdG8gZGVmaW5lIHRoaXMgZm9yIFVub3JkZXJlZFBvaW50d2lzZSgpIHRvIGNvbXBpbGUgaW4KKyAgLy8gQysrOTggbW9kZSwgYXMgaXQgcHV0cyBCb3VuZFNlY29uZE1hdGNoZXIgaW5zdGFuY2VzIGluIGEgdmVjdG9yLAorICAvLyB3aGljaCByZXF1aXJlcyB0aGUgZWxlbWVudHMgdG8gYmUgYXNzaWduYWJsZSBpbiBDKys5OC4gIFRoZQorICAvLyBjb21waWxlciBjYW5ub3QgZ2VuZXJhdGUgdGhlIG9wZXJhdG9yPSBmb3IgdXMsIGFzIFR1cGxlMk1hdGNoZXIKKyAgLy8gYW5kIFNlY29uZCBtYXkgbm90IGJlIGFzc2lnbmFibGUuCisgIC8vCisgIC8vIEhvd2V2ZXIsIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCwgc28gdGhlIGltcGxlbWVudGF0aW9uIGp1c3QKKyAgLy8gbmVlZCB0byBhc3NlcnQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEJvdW5kU2Vjb25kTWF0Y2hlciYgLypyaHMqLykgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJCb3VuZFNlY29uZE1hdGNoZXIgc2hvdWxkIG5ldmVyIGJlIGFzc2lnbmVkLiI7CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4geworICAgcHVibGljOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxULCBTZWNvbmQ+IEFyZ1R1cGxlOworCisgICAgSW1wbChjb25zdCBUdXBsZTJNYXRjaGVyJiB0bSwgY29uc3QgU2Vjb25kJiBzZWNvbmQpCisgICAgICAgIDogbW9ub190dXBsZTJfbWF0Y2hlcl8oU2FmZU1hdGNoZXJDYXN0PGNvbnN0IEFyZ1R1cGxlJj4odG0pKSwKKyAgICAgICAgICBzZWNvbmRfdmFsdWVfKHNlY29uZCkge30KKworICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICAgKm9zIDw8ICJhbmQgIjsKKyAgICAgIFVuaXZlcnNhbFByaW50KHNlY29uZF92YWx1ZV8sIG9zKTsKKyAgICAgICpvcyA8PCAiICI7CisgICAgICBtb25vX3R1cGxlMl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtb25vX3R1cGxlMl9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oQXJnVHVwbGUoeCwgc2Vjb25kX3ZhbHVlXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgTWF0Y2hlcjxjb25zdCBBcmdUdXBsZSY+IG1vbm9fdHVwbGUyX21hdGNoZXJfOworICAgIGNvbnN0IFNlY29uZCBzZWNvbmRfdmFsdWVfOworCisgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKKyAgfTsKKworICBjb25zdCBUdXBsZTJNYXRjaGVyIHR1cGxlMl9tYXRjaGVyXzsKKyAgY29uc3QgU2Vjb25kIHNlY29uZF92YWx1ZV87Cit9OworCisvLyBHaXZlbiBhIDItdHVwbGUgbWF0Y2hlciB0bSBhbmQgYSB2YWx1ZSBzZWNvbmQsCisvLyBNYXRjaGVyQmluZFNlY29uZCh0bSwgc2Vjb25kKSByZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYQorLy8gdmFsdWUgeCBpZmYgdG0gbWF0Y2hlcyB0dXBsZSAoeCwgc2Vjb25kKS4gIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCisvLyBVbm9yZGVyZWRQb2ludHdpc2UoKSBpbiB0ZXJtcyBvZiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUyTWF0Y2hlciwgdHlwZW5hbWUgU2Vjb25kPgorQm91bmRTZWNvbmRNYXRjaGVyPFR1cGxlMk1hdGNoZXIsIFNlY29uZD4gTWF0Y2hlckJpbmRTZWNvbmQoCisgICAgY29uc3QgVHVwbGUyTWF0Y2hlciYgdG0sIGNvbnN0IFNlY29uZCYgc2Vjb25kKSB7CisgIHJldHVybiBCb3VuZFNlY29uZE1hdGNoZXI8VHVwbGUyTWF0Y2hlciwgU2Vjb25kPih0bSwgc2Vjb25kKTsKK30KKworLy8gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gZm9yIGEgbWF0Y2hlciBkZWZpbmVkIHVzaW5nIHRoZSBNQVRDSEVSKigpCisvLyBtYWNybyB3aGVyZSB0aGUgdXNlci1zdXBwbGllZCBkZXNjcmlwdGlvbiBzdHJpbmcgaXMgIiIsIGlmCisvLyAnbmVnYXRpb24nIGlzIGZhbHNlOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCisvLyBuZWdhdGlvbiBvZiB0aGUgbWF0Y2hlci4gICdwYXJhbV92YWx1ZXMnIGNvbnRhaW5zIGEgbGlzdCBvZiBzdHJpbmdzCisvLyB0aGF0IGFyZSB0aGUgcHJpbnQtb3V0IG9mIHRoZSBtYXRjaGVyJ3MgcGFyYW1ldGVycy4KK0dURVNUX0FQSV8gc3RyaW5nIEZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1hdGNoZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzJiBwYXJhbV92YWx1ZXMpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gRWxlbWVudHNBcmVBcnJheShmaXJzdCwgbGFzdCkKKy8vIEVsZW1lbnRzQXJlQXJyYXkocG9pbnRlciwgY291bnQpCisvLyBFbGVtZW50c0FyZUFycmF5KGFycmF5KQorLy8gRWxlbWVudHNBcmVBcnJheShjb250YWluZXIpCisvLyBFbGVtZW50c0FyZUFycmF5KHsgZTEsIGUyLCAuLi4sIGVuIH0pCisvLworLy8gVGhlIEVsZW1lbnRzQXJlQXJyYXkoKSBmdW5jdGlvbnMgYXJlIGxpa2UgRWxlbWVudHNBcmUoLi4uKSwgZXhjZXB0CisvLyB0aGF0IHRoZXkgYXJlIGdpdmVuIGEgaG9tb2dlbmVvdXMgc2VxdWVuY2UgcmF0aGVyIHRoYW4gdGFraW5nIGVhY2gKKy8vIGVsZW1lbnQgYXMgYSBmdW5jdGlvbiBhcmd1bWVudC4gVGhlIHNlcXVlbmNlIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4KKy8vIGFycmF5LCBhIHBvaW50ZXIgYW5kIGNvdW50LCBhIHZlY3RvciwgYW4gaW5pdGlhbGl6ZXIgbGlzdCwgb3IgYW4KKy8vIFNUTCBpdGVyYXRvciByYW5nZS4gSW4gZWFjaCBvZiB0aGVzZSBjYXNlcywgdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UKKy8vIGNhbiBiZSBlaXRoZXIgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgb3IgYSBzZXF1ZW5jZSBvZiBtYXRjaGVycy4KKy8vCisvLyBBbGwgZm9ybXMgb2YgRWxlbWVudHNBcmVBcnJheSgpIG1ha2UgYSBjb3B5IG9mIHRoZSBpbnB1dCBtYXRjaGVyIHNlcXVlbmNlLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8CisgICAgdHlwZW5hbWUgOjpzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZT4KK0VsZW1lbnRzQXJlQXJyYXkoSXRlciBmaXJzdCwgSXRlciBsYXN0KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZSBUOworICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+KGZpcnN0LCBsYXN0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+IEVsZW1lbnRzQXJlQXJyYXkoCisgICAgY29uc3QgVCogcG9pbnRlciwgc2l6ZV90IGNvdW50KSB7CisgIHJldHVybiBFbGVtZW50c0FyZUFycmF5KHBvaW50ZXIsIHBvaW50ZXIgKyBjb3VudCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4gRWxlbWVudHNBcmVBcnJheSgKKyAgICBjb25zdCBUICgmYXJyYXkpW05dKSB7CisgIHJldHVybiBFbGVtZW50c0FyZUFycmF5KGFycmF5LCBOKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KK2lubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPgorRWxlbWVudHNBcmVBcnJheShjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgeworICByZXR1cm4gRWxlbWVudHNBcmVBcnJheShjb250YWluZXIuYmVnaW4oKSwgY29udGFpbmVyLmVuZCgpKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPgorRWxlbWVudHNBcmVBcnJheSg6OnN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB4cykgeworICByZXR1cm4gRWxlbWVudHNBcmVBcnJheSh4cy5iZWdpbigpLCB4cy5lbmQoKSk7Cit9CisjZW5kaWYKKworLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShmaXJzdCwgbGFzdCkKKy8vIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkocG9pbnRlciwgY291bnQpCisvLyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGFycmF5KQorLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShjb250YWluZXIpCisvLyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHsgZTEsIGUyLCAuLi4sIGVuIH0pCisvLworLy8gVGhlIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoKSBmdW5jdGlvbnMgYXJlIGxpa2UKKy8vIEVsZW1lbnRzQXJlQXJyYXkoLi4uKSwgYnV0IGFsbG93IG1hdGNoaW5nIHRoZSBlbGVtZW50cyBpbiBhbnkgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK2lubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8CisgICAgdHlwZW5hbWUgOjpzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZT4KK1Vub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoSXRlciBmaXJzdCwgSXRlciBsYXN0KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZSBUOworICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+KGZpcnN0LCBsYXN0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+CitVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGNvbnN0IFQqIHBvaW50ZXIsIHNpemVfdCBjb3VudCkgeworICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShwb2ludGVyLCBwb2ludGVyICsgY291bnQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+CitVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKKyAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoYXJyYXksIE4pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgoraW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjwKKyAgICB0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+CitVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKSB7CisgIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+CitVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KDo6c3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHhzKSB7CisgIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHhzLmJlZ2luKCksIHhzLmVuZCgpKTsKK30KKyNlbmRpZgorCisvLyBfIGlzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgb2YgYW55IHR5cGUuCisvLworLy8gVGhpcyBkZWZpbml0aW9uIGlzIGZpbmUgYXM6CisvLworLy8gICAxLiBUaGUgQysrIHN0YW5kYXJkIHBlcm1pdHMgdXNpbmcgdGhlIG5hbWUgXyBpbiBhIG5hbWVzcGFjZSB0aGF0CisvLyAgICAgIGlzIG5vdCB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBvciA6OnN0ZC4KKy8vICAgMi4gVGhlIEFueXRoaW5nTWF0Y2hlciBjbGFzcyBoYXMgbm8gZGF0YSBtZW1iZXIgb3IgY29uc3RydWN0b3IsCisvLyAgICAgIHNvIGl0J3MgT0sgdG8gY3JlYXRlIGdsb2JhbCB2YXJpYWJsZXMgb2YgdGhpcyB0eXBlLgorLy8gICAzLiBjLXN0eWxlIGhhcyBhcHByb3ZlZCBvZiB1c2luZyBfIGluIHRoaXMgY2FzZS4KK2NvbnN0IGludGVybmFsOjpBbnl0aGluZ01hdGNoZXIgXyA9IHt9OworLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZSBULgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgTWF0Y2hlcjxUPiBBKCkgeyByZXR1cm4gTWFrZU1hdGNoZXIobmV3IGludGVybmFsOjpBbnlNYXRjaGVySW1wbDxUPigpKTsgfQorCisvLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIHRoZSBnaXZlbiB0eXBlIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBNYXRjaGVyPFQ+IEFuKCkgeyByZXR1cm4gQTxUPigpOyB9CisKKy8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyBlcXVhbCB0byB4LgorLy8gTm90ZTogaWYgdGhlIHBhcmFtZXRlciBvZiBFcSgpIHdlcmUgZGVjbGFyZWQgYXMgY29uc3QgVCYsIEVxKCJmb28iKQorLy8gd291bGRuJ3QgY29tcGlsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIGludGVybmFsOjpFcU1hdGNoZXI8VD4gRXEoVCB4KSB7IHJldHVybiBpbnRlcm5hbDo6RXFNYXRjaGVyPFQ+KHgpOyB9CisKKy8vIENvbnN0cnVjdHMgYSBNYXRjaGVyPFQ+IGZyb20gYSAndmFsdWUnIG9mIHR5cGUgVC4gIFRoZSBjb25zdHJ1Y3RlZAorLy8gbWF0Y2hlciBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0J3MgZXF1YWwgdG8gJ3ZhbHVlJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorTWF0Y2hlcjxUPjo6TWF0Y2hlcihUIHZhbHVlKSB7ICp0aGlzID0gRXEodmFsdWUpOyB9CisKKy8vIENyZWF0ZXMgYSBtb25vbW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyB3aXRoIHR5cGUgTGhzCisvLyBhbmQgZXF1YWwgdG8gcmhzLiAgQSB1c2VyIG1heSBuZWVkIHRvIHVzZSB0aGlzIGluc3RlYWQgb2YgRXEoLi4uKQorLy8gaW4gb3JkZXIgdG8gcmVzb2x2ZSBhbiBvdmVybG9hZGluZyBhbWJpZ3VpdHkuCisvLworLy8gVHlwZWRFcTxUPih4KSBpcyBqdXN0IGEgY29udmVuaWVudCBzaG9ydC1oYW5kIGZvciBNYXRjaGVyPFQ+KEVxKHgpKQorLy8gb3IgTWF0Y2hlcjxUPih4KSwgYnV0IG1vcmUgcmVhZGFibGUgdGhhbiB0aGUgbGF0dGVyLgorLy8KKy8vIFdlIGNvdWxkIGRlZmluZSBzaW1pbGFyIG1vbm9tb3JwaGljIG1hdGNoZXJzIGZvciBvdGhlciBjb21wYXJpc29uCisvLyBvcGVyYXRpb25zIChlLmcuIFR5cGVkTHQsIFR5cGVkR2UsIGFuZCBldGMpLCBidXQgZGVjaWRlZCBub3QgdG8gZG8KKy8vIGl0IHlldCBhcyB0aG9zZSBhcmUgdXNlZCBtdWNoIGxlc3MgdGhhbiBFcSgpIGluIHByYWN0aWNlLiAgQSB1c2VyCisvLyBjYW4gYWx3YXlzIHdyaXRlIE1hdGNoZXI8VD4oTHQoNSkpIHRvIGJlIGV4cGxpY2l0IGFib3V0IHRoZSB0eXBlLAorLy8gZm9yIGV4YW1wbGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitpbmxpbmUgTWF0Y2hlcjxMaHM+IFR5cGVkRXEoY29uc3QgUmhzJiByaHMpIHsgcmV0dXJuIEVxKHJocyk7IH0KKworLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nID49IHguCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgoraW5saW5lIGludGVybmFsOjpHZU1hdGNoZXI8UmhzPiBHZShSaHMgeCkgeworICByZXR1cm4gaW50ZXJuYWw6OkdlTWF0Y2hlcjxSaHM+KHgpOworfQorCisvLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgPiB4LgordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KK2lubGluZSBpbnRlcm5hbDo6R3RNYXRjaGVyPFJocz4gR3QoUmhzIHgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpHdE1hdGNoZXI8UmhzPih4KTsKK30KKworLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIDw9IHguCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgoraW5saW5lIGludGVybmFsOjpMZU1hdGNoZXI8UmhzPiBMZShSaHMgeCkgeworICByZXR1cm4gaW50ZXJuYWw6OkxlTWF0Y2hlcjxSaHM+KHgpOworfQorCisvLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgPCB4LgordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KK2lubGluZSBpbnRlcm5hbDo6THRNYXRjaGVyPFJocz4gTHQoUmhzIHgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpMdE1hdGNoZXI8UmhzPih4KTsKK30KKworLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nICE9IHguCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgoraW5saW5lIGludGVybmFsOjpOZU1hdGNoZXI8UmhzPiBOZShSaHMgeCkgeworICByZXR1cm4gaW50ZXJuYWw6Ok5lTWF0Y2hlcjxSaHM+KHgpOworfQorCisvLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IE5VTEwgcG9pbnRlci4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OklzTnVsbE1hdGNoZXIgPiBJc051bGwoKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpJc051bGxNYXRjaGVyKCkpOworfQorCisvLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IG5vbi1OVUxMIHBvaW50ZXIuCisvLyBUaGlzIGlzIGNvbnZlbmllbnQgYXMgTm90KE5VTEwpIGRvZXNuJ3QgY29tcGlsZSAodGhlIGNvbXBpbGVyCisvLyB0aGlua3MgdGhhdCB0aGF0IGV4cHJlc3Npb24gaXMgY29tcGFyaW5nIGEgcG9pbnRlciB3aXRoIGFuIGludGVnZXIpLgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6Tm90TnVsbE1hdGNoZXIgPiBOb3ROdWxsKCkgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6Tm90TnVsbE1hdGNoZXIoKSk7Cit9CisKKy8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgYXJndW1lbnQgdGhhdAorLy8gcmVmZXJlbmNlcyB2YXJpYWJsZSB4LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgaW50ZXJuYWw6OlJlZk1hdGNoZXI8VCY+IFJlZihUJiB4KSB7ICAvLyBOT0xJTlQKKyAgcmV0dXJuIGludGVybmFsOjpSZWZNYXRjaGVyPFQmPih4KTsKK30KKworLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBkb3VibGUgYXJndW1lbnQgYXBwcm94aW1hdGVseQorLy8gZXF1YWwgdG8gcmhzLCB3aGVyZSB0d28gTkFOcyBhcmUgY29uc2lkZXJlZCB1bmVxdWFsLgoraW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+IERvdWJsZUVxKGRvdWJsZSByaHMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+KHJocywgZmFsc2UpOworfQorCisvLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGRvdWJsZSBhcmd1bWVudCBhcHByb3hpbWF0ZWx5CisvLyBlcXVhbCB0byByaHMsIGluY2x1ZGluZyBOYU4gdmFsdWVzIHdoZW4gcmhzIGlzIE5hTi4KK2lubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPiBOYW5TZW5zaXRpdmVEb3VibGVFcShkb3VibGUgcmhzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPihyaHMsIHRydWUpOworfQorCisvLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGRvdWJsZSBhcmd1bWVudCBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvCisvLyByaHMsIHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kLCB3aGVyZSB0d28gTkFOcyBhcmUKKy8vIGNvbnNpZGVyZWQgdW5lcXVhbC4gIFRoZSBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQgbXVzdCBiZSBub24tbmVnYXRpdmUuCitpbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gRG91YmxlTmVhcigKKyAgICBkb3VibGUgcmhzLCBkb3VibGUgbWF4X2Fic19lcnJvcikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4ocmhzLCBmYWxzZSwgbWF4X2Fic19lcnJvcik7Cit9CisKKy8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZG91YmxlIGFyZ3VtZW50IGFwcHJveGltYXRlbHkgZXF1YWwgdG8KKy8vIHJocywgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQsIGluY2x1ZGluZyBOYU4gdmFsdWVzIHdoZW4KKy8vIHJocyBpcyBOYU4uICBUaGUgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgoraW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+IE5hblNlbnNpdGl2ZURvdWJsZU5lYXIoCisgICAgZG91YmxlIHJocywgZG91YmxlIG1heF9hYnNfZXJyb3IpIHsKKyAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+KHJocywgdHJ1ZSwgbWF4X2Fic19lcnJvcik7Cit9CisKKy8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZmxvYXQgYXJndW1lbnQgYXBwcm94aW1hdGVseQorLy8gZXF1YWwgdG8gcmhzLCB3aGVyZSB0d28gTkFOcyBhcmUgY29uc2lkZXJlZCB1bmVxdWFsLgoraW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4gRmxvYXRFcShmbG9hdCByaHMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4ocmhzLCBmYWxzZSk7Cit9CisKKy8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZmxvYXQgYXJndW1lbnQgYXBwcm94aW1hdGVseQorLy8gZXF1YWwgdG8gcmhzLCBpbmNsdWRpbmcgTmFOIHZhbHVlcyB3aGVuIHJocyBpcyBOYU4uCitpbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PiBOYW5TZW5zaXRpdmVGbG9hdEVxKGZsb2F0IHJocykgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PihyaHMsIHRydWUpOworfQorCisvLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGZsb2F0IGFyZ3VtZW50IGFwcHJveGltYXRlbHkgZXF1YWwgdG8KKy8vIHJocywgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQsIHdoZXJlIHR3byBOQU5zIGFyZQorLy8gY29uc2lkZXJlZCB1bmVxdWFsLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KK2lubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+IEZsb2F0TmVhcigKKyAgICBmbG9hdCByaHMsIGZsb2F0IG1heF9hYnNfZXJyb3IpIHsKKyAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4ocmhzLCBmYWxzZSwgbWF4X2Fic19lcnJvcik7Cit9CisKKy8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZmxvYXQgYXJndW1lbnQgYXBwcm94aW1hdGVseSBlcXVhbCB0bworLy8gcmhzLCB1cCB0byB0aGUgc3BlY2lmaWVkIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCwgaW5jbHVkaW5nIE5hTiB2YWx1ZXMgd2hlbgorLy8gcmhzIGlzIE5hTi4gIFRoZSBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQgbXVzdCBiZSBub24tbmVnYXRpdmUuCitpbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PiBOYW5TZW5zaXRpdmVGbG9hdE5lYXIoCisgICAgZmxvYXQgcmhzLCBmbG9hdCBtYXhfYWJzX2Vycm9yKSB7CisgIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+KHJocywgdHJ1ZSwgbWF4X2Fic19lcnJvcik7Cit9CisKKy8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHBvaW50ZXIgKHJhdyBvciBzbWFydCkgdGhhdCBwb2ludHMKKy8vIHRvIGEgdmFsdWUgdGhhdCBtYXRjaGVzIGlubmVyX21hdGNoZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgoraW5saW5lIGludGVybmFsOjpQb2ludGVlTWF0Y2hlcjxJbm5lck1hdGNoZXI+IFBvaW50ZWUoCisgICAgY29uc3QgSW5uZXJNYXRjaGVyJiBpbm5lcl9tYXRjaGVyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UG9pbnRlZU1hdGNoZXI8SW5uZXJNYXRjaGVyPihpbm5lcl9tYXRjaGVyKTsKK30KKworLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgcG9pbnRlciBvciByZWZlcmVuY2UgdGhhdCBtYXRjaGVzCisvLyBpbm5lcl9tYXRjaGVyIHdoZW4gZHluYW1pY19jYXN0PFRvPiBpcyBhcHBsaWVkLgorLy8gVGhlIHJlc3VsdCBvZiBkeW5hbWljX2Nhc3Q8VG8+IGlzIGZvcndhcmRlZCB0byB0aGUgaW5uZXIgbWF0Y2hlci4KKy8vIElmIFRvIGlzIGEgcG9pbnRlciBhbmQgdGhlIGNhc3QgZmFpbHMsIHRoZSBpbm5lciBtYXRjaGVyIHdpbGwgcmVjZWl2ZSBOVUxMLgorLy8gSWYgVG8gaXMgYSByZWZlcmVuY2UgYW5kIHRoZSBjYXN0IGZhaWxzLCB0aGlzIG1hdGNoZXIgcmV0dXJucyBmYWxzZQorLy8gaW1tZWRpYXRlbHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+CitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXI8VG8+ID4KK1doZW5EeW5hbWljQ2FzdFRvKGNvbnN0IE1hdGNoZXI8VG8+JiBpbm5lcl9tYXRjaGVyKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKAorICAgICAgaW50ZXJuYWw6OldoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlcjxUbz4oaW5uZXJfbWF0Y2hlcikpOworfQorCisvLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIGZpZWxkIG1hdGNoZXMKKy8vICdtYXRjaGVyJy4gIEZvciBleGFtcGxlLAorLy8gICBGaWVsZCgmRm9vOjpudW1iZXIsIEdlKDUpKQorLy8gbWF0Y2hlcyBhIEZvbyBvYmplY3QgeCBpZmYgeC5udW1iZXIgPj0gNS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgRmllbGRUeXBlLCB0eXBlbmFtZSBGaWVsZE1hdGNoZXI+CitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPAorICBpbnRlcm5hbDo6RmllbGRNYXRjaGVyPENsYXNzLCBGaWVsZFR5cGU+ID4gRmllbGQoCisgICAgRmllbGRUeXBlIENsYXNzOjoqZmllbGQsIGNvbnN0IEZpZWxkTWF0Y2hlciYgbWF0Y2hlcikgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcigKKyAgICAgIGludGVybmFsOjpGaWVsZE1hdGNoZXI8Q2xhc3MsIEZpZWxkVHlwZT4oCisgICAgICAgICAgZmllbGQsIE1hdGNoZXJDYXN0PGNvbnN0IEZpZWxkVHlwZSY+KG1hdGNoZXIpKSk7CisgIC8vIFRoZSBjYWxsIHRvIE1hdGNoZXJDYXN0KCkgaXMgcmVxdWlyZWQgZm9yIHN1cHBvcnRpbmcgaW5uZXIKKyAgLy8gbWF0Y2hlcnMgb2YgY29tcGF0aWJsZSB0eXBlcy4gIEZvciBleGFtcGxlLCBpdCBhbGxvd3MKKyAgLy8gICBGaWVsZCgmRm9vOjpiYXIsIG0pCisgIC8vIHRvIGNvbXBpbGUgd2hlcmUgYmFyIGlzIGFuIGludDMyIGFuZCBtIGlzIGEgbWF0Y2hlciBmb3IgaW50NjQuCit9CisKKy8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkKKy8vIG1hdGNoZXMgJ21hdGNoZXInLiAgRm9yIGV4YW1wbGUsCisvLyAgIFByb3BlcnR5KCZGb286OnN0ciwgU3RhcnRzV2l0aCgiaGkiKSkKKy8vIG1hdGNoZXMgYSBGb28gb2JqZWN0IHggaWZmIHguc3RyKCkgc3RhcnRzIHdpdGggImhpIi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgUHJvcGVydHlUeXBlLCB0eXBlbmFtZSBQcm9wZXJ0eU1hdGNoZXI+CitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPAorICBpbnRlcm5hbDo6UHJvcGVydHlNYXRjaGVyPENsYXNzLCBQcm9wZXJ0eVR5cGU+ID4gUHJvcGVydHkoCisgICAgUHJvcGVydHlUeXBlIChDbGFzczo6KnByb3BlcnR5KSgpIGNvbnN0LCBjb25zdCBQcm9wZXJ0eU1hdGNoZXImIG1hdGNoZXIpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoCisgICAgICBpbnRlcm5hbDo6UHJvcGVydHlNYXRjaGVyPENsYXNzLCBQcm9wZXJ0eVR5cGU+KAorICAgICAgICAgIHByb3BlcnR5LAorICAgICAgICAgIE1hdGNoZXJDYXN0PEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oUHJvcGVydHlUeXBlKT4obWF0Y2hlcikpKTsKKyAgLy8gVGhlIGNhbGwgdG8gTWF0Y2hlckNhc3QoKSBpcyByZXF1aXJlZCBmb3Igc3VwcG9ydGluZyBpbm5lcgorICAvLyBtYXRjaGVycyBvZiBjb21wYXRpYmxlIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGl0IGFsbG93cworICAvLyAgIFByb3BlcnR5KCZGb286OmJhciwgbSkKKyAgLy8gdG8gY29tcGlsZSB3aGVyZSBiYXIoKSByZXR1cm5zIGFuIGludDMyIGFuZCBtIGlzIGEgbWF0Y2hlciBmb3IgaW50NjQuCit9CisKKy8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbiBvYmplY3QgaWZmIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcKKy8vIGEgY2FsbGFibGUgdG8geCBtYXRjaGVzICdtYXRjaGVyJy4KKy8vIEZvciBleGFtcGxlLAorLy8gICBSZXN1bHRPZihmLCBTdGFydHNXaXRoKCJoaSIpKQorLy8gbWF0Y2hlcyBhIEZvbyBvYmplY3QgeCBpZmYgZih4KSBzdGFydHMgd2l0aCAiaGkiLgorLy8gY2FsbGFibGUgcGFyYW1ldGVyIGNhbiBiZSBhIGZ1bmN0aW9uLCBmdW5jdGlvbiBwb2ludGVyLCBvciBhIGZ1bmN0b3IuCisvLyBDYWxsYWJsZSBoYXMgdG8gc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLyAgICogSXQgaXMgcmVxdWlyZWQgdG8ga2VlcCBubyBzdGF0ZSBhZmZlY3RpbmcgdGhlIHJlc3VsdHMgb2YKKy8vICAgICB0aGUgY2FsbHMgb24gaXQgYW5kIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgaG93IG1hbnkgY2FsbHMKKy8vICAgICB3aWxsIGJlIG1hZGUuIEFueSBzdGF0ZSBpdCBrZWVwcyBtdXN0IGJlIHByb3RlY3RlZCBmcm9tIHRoZQorLy8gICAgIGNvbmN1cnJlbnQgYWNjZXNzLgorLy8gICAqIElmIGl0IGlzIGEgZnVuY3Rpb24gb2JqZWN0LCBpdCBoYXMgdG8gZGVmaW5lIHR5cGUgcmVzdWx0X3R5cGUuCisvLyAgICAgV2UgcmVjb21tZW5kIGRlcml2aW5nIHlvdXIgZnVuY3RvciBjbGFzc2VzIGZyb20gc3RkOjp1bmFyeV9mdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYWJsZSwgdHlwZW5hbWUgUmVzdWx0T2ZNYXRjaGVyPgoraW50ZXJuYWw6OlJlc3VsdE9mTWF0Y2hlcjxDYWxsYWJsZT4gUmVzdWx0T2YoCisgICAgQ2FsbGFibGUgY2FsbGFibGUsIGNvbnN0IFJlc3VsdE9mTWF0Y2hlciYgbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OlJlc3VsdE9mTWF0Y2hlcjxDYWxsYWJsZT4oCisgICAgICAgICAgY2FsbGFibGUsCisgICAgICAgICAgTWF0Y2hlckNhc3Q8dHlwZW5hbWUgaW50ZXJuYWw6OkNhbGxhYmxlVHJhaXRzPENhbGxhYmxlPjo6UmVzdWx0VHlwZT4oCisgICAgICAgICAgICAgIG1hdGNoZXIpKTsKKyAgLy8gVGhlIGNhbGwgdG8gTWF0Y2hlckNhc3QoKSBpcyByZXF1aXJlZCBmb3Igc3VwcG9ydGluZyBpbm5lcgorICAvLyBtYXRjaGVycyBvZiBjb21wYXRpYmxlIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGl0IGFsbG93cworICAvLyAgIFJlc3VsdE9mKEZ1bmN0aW9uLCBtKQorICAvLyB0byBjb21waWxlIHdoZXJlIEZ1bmN0aW9uKCkgcmV0dXJucyBhbiBpbnQzMiBhbmQgbSBpcyBhIG1hdGNoZXIgZm9yIGludDY0LgorfQorCisvLyBTdHJpbmcgbWF0Y2hlcnMuCisKKy8vIE1hdGNoZXMgYSBzdHJpbmcgZXF1YWwgdG8gc3RyLgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KKyAgICBTdHJFcShjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKKyAgICAgIHN0ciwgdHJ1ZSwgdHJ1ZSkpOworfQorCisvLyBNYXRjaGVzIGEgc3RyaW5nIG5vdCBlcXVhbCB0byBzdHIuCitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPgorICAgIFN0ck5lKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAorICAgICAgc3RyLCBmYWxzZSwgdHJ1ZSkpOworfQorCisvLyBNYXRjaGVzIGEgc3RyaW5nIGVxdWFsIHRvIHN0ciwgaWdub3JpbmcgY2FzZS4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+CisgICAgU3RyQ2FzZUVxKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAorICAgICAgc3RyLCB0cnVlLCBmYWxzZSkpOworfQorCisvLyBNYXRjaGVzIGEgc3RyaW5nIG5vdCBlcXVhbCB0byBzdHIsIGlnbm9yaW5nIGNhc2UuCitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPgorICAgIFN0ckNhc2VOZShjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKKyAgICAgIHN0ciwgZmFsc2UsIGZhbHNlKSk7Cit9CisKKy8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgc3RyaW5nLCBzdGQ6OnN0cmluZywgb3IgQyBzdHJpbmcKKy8vIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Okhhc1N1YnN0ck1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPgorICAgIEhhc1N1YnN0cihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdWJzdHJpbmcpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Okhhc1N1YnN0ck1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCisgICAgICBzdWJzdHJpbmcpKTsKK30KKworLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdwcmVmaXgnIChjYXNlLXNlbnNpdGl2ZSkuCitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdGFydHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+CisgICAgU3RhcnRzV2l0aChjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBwcmVmaXgpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0YXJ0c1dpdGhNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAorICAgICAgcHJlZml4KSk7Cit9CisKKy8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBlbmRzIHdpdGggJ3N1ZmZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OkVuZHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+CisgICAgRW5kc1dpdGgoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3VmZml4KSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpFbmRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCisgICAgICBzdWZmaXgpKTsKK30KKworLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IGZ1bGx5IG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9uICdyZWdleCcuCisvLyBUaGUgbWF0Y2hlciB0YWtlcyBvd25lcnNoaXAgb2YgJ3JlZ2V4Jy4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXI+IE1hdGNoZXNSZWdleCgKKyAgICBjb25zdCBpbnRlcm5hbDo6UkUqIHJlZ2V4KSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyKHJlZ2V4LCB0cnVlKSk7Cit9CitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyPiBNYXRjaGVzUmVnZXgoCisgICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcmVnZXgpIHsKKyAgcmV0dXJuIE1hdGNoZXNSZWdleChuZXcgaW50ZXJuYWw6OlJFKHJlZ2V4KSk7Cit9CisKKy8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBjb250YWlucyByZWd1bGFyIGV4cHJlc3Npb24gJ3JlZ2V4Jy4KKy8vIFRoZSBtYXRjaGVyIHRha2VzIG93bmVyc2hpcCBvZiAncmVnZXgnLgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcj4gQ29udGFpbnNSZWdleCgKKyAgICBjb25zdCBpbnRlcm5hbDo6UkUqIHJlZ2V4KSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyKHJlZ2V4LCBmYWxzZSkpOworfQoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcj4gQ29udGFpbnNSZWdleCgKKyAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiByZWdleCkgeworICByZXR1cm4gQ29udGFpbnNSZWdleChuZXcgaW50ZXJuYWw6OlJFKHJlZ2V4KSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgfHwgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBXaWRlIHN0cmluZyBtYXRjaGVycy4KKworLy8gTWF0Y2hlcyBhIHN0cmluZyBlcXVhbCB0byBzdHIuCitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4KKyAgICBTdHJFcShjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgc3RyKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KAorICAgICAgc3RyLCB0cnVlLCB0cnVlKSk7Cit9CisKKy8vIE1hdGNoZXMgYSBzdHJpbmcgbm90IGVxdWFsIHRvIHN0ci4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgorICAgIFN0ck5lKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCisgICAgICBzdHIsIGZhbHNlLCB0cnVlKSk7Cit9CisKKy8vIE1hdGNoZXMgYSBzdHJpbmcgZXF1YWwgdG8gc3RyLCBpZ25vcmluZyBjYXNlLgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+CisgICAgU3RyQ2FzZUVxKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCisgICAgICBzdHIsIHRydWUsIGZhbHNlKSk7Cit9CisKKy8vIE1hdGNoZXMgYSBzdHJpbmcgbm90IGVxdWFsIHRvIHN0ciwgaWdub3JpbmcgY2FzZS4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgorICAgIFN0ckNhc2VOZShjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgc3RyKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KAorICAgICAgc3RyLCBmYWxzZSwgZmFsc2UpKTsKK30KKworLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSB3c3RyaW5nLCBzdGQ6OndzdHJpbmcsIG9yIEMgd2lkZSBzdHJpbmcKKy8vIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Okhhc1N1YnN0ck1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4KKyAgICBIYXNTdWJzdHIoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN1YnN0cmluZykgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCisgICAgICBzdWJzdHJpbmcpKTsKK30KKworLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdwcmVmaXgnIChjYXNlLXNlbnNpdGl2ZSkuCitpbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdGFydHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgorICAgIFN0YXJ0c1dpdGgoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHByZWZpeCkgeworICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RhcnRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KAorICAgICAgcHJlZml4KSk7Cit9CisKKy8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBlbmRzIHdpdGggJ3N1ZmZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4KK2lubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OkVuZHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgorICAgIEVuZHNXaXRoKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdWZmaXgpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OkVuZHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCisgICAgICBzdWZmaXgpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgfHwgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlCisvLyBmaXJzdCBmaWVsZCA9PSB0aGUgc2Vjb25kIGZpZWxkLgoraW5saW5lIGludGVybmFsOjpFcTJNYXRjaGVyIEVxKCkgeyByZXR1cm4gaW50ZXJuYWw6OkVxMk1hdGNoZXIoKTsgfQorCisvLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQorLy8gZmlyc3QgZmllbGQgPj0gdGhlIHNlY29uZCBmaWVsZC4KK2lubGluZSBpbnRlcm5hbDo6R2UyTWF0Y2hlciBHZSgpIHsgcmV0dXJuIGludGVybmFsOjpHZTJNYXRjaGVyKCk7IH0KKworLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKKy8vIGZpcnN0IGZpZWxkID4gdGhlIHNlY29uZCBmaWVsZC4KK2lubGluZSBpbnRlcm5hbDo6R3QyTWF0Y2hlciBHdCgpIHsgcmV0dXJuIGludGVybmFsOjpHdDJNYXRjaGVyKCk7IH0KKworLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKKy8vIGZpcnN0IGZpZWxkIDw9IHRoZSBzZWNvbmQgZmllbGQuCitpbmxpbmUgaW50ZXJuYWw6OkxlMk1hdGNoZXIgTGUoKSB7IHJldHVybiBpbnRlcm5hbDo6TGUyTWF0Y2hlcigpOyB9CisKKy8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlCisvLyBmaXJzdCBmaWVsZCA8IHRoZSBzZWNvbmQgZmllbGQuCitpbmxpbmUgaW50ZXJuYWw6Okx0Mk1hdGNoZXIgTHQoKSB7IHJldHVybiBpbnRlcm5hbDo6THQyTWF0Y2hlcigpOyB9CisKKy8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlCisvLyBmaXJzdCBmaWVsZCAhPSB0aGUgc2Vjb25kIGZpZWxkLgoraW5saW5lIGludGVybmFsOjpOZTJNYXRjaGVyIE5lKCkgeyByZXR1cm4gaW50ZXJuYWw6Ok5lMk1hdGNoZXIoKTsgfQorCisvLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIHR5cGUgVCB0aGF0IG0gZG9lc24ndAorLy8gbWF0Y2guCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgoraW5saW5lIGludGVybmFsOjpOb3RNYXRjaGVyPElubmVyTWF0Y2hlcj4gTm90KElubmVyTWF0Y2hlciBtKSB7CisgIHJldHVybiBpbnRlcm5hbDo6Tm90TWF0Y2hlcjxJbm5lck1hdGNoZXI+KG0pOworfQorCisvLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgdGhhdCBzYXRpc2ZpZXMgdGhlIGdpdmVuCisvLyBwcmVkaWNhdGUuICBUaGUgcHJlZGljYXRlIGNhbiBiZSBhbnkgdW5hcnkgZnVuY3Rpb24gb3IgZnVuY3RvcgorLy8gd2hvc2UgcmV0dXJuIHR5cGUgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGJvb2wuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZGljYXRlPgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6VHJ1bHlNYXRjaGVyPFByZWRpY2F0ZT4gPgorVHJ1bHkoUHJlZGljYXRlIHByZWQpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlRydWx5TWF0Y2hlcjxQcmVkaWNhdGU+KHByZWQpKTsKK30KKworLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIHRoZSBjb250YWluZXIgc2l6ZS4gVGhlIGNvbnRhaW5lciBtdXN0CisvLyBzdXBwb3J0IGJvdGggc2l6ZSgpIGFuZCBzaXplX3R5cGUgd2hpY2ggYWxsIFNUTC1saWtlIGNvbnRhaW5lcnMgcHJvdmlkZS4KKy8vIE5vdGUgdGhhdCB0aGUgcGFyYW1ldGVyICdzaXplJyBjYW4gYmUgYSB2YWx1ZSBvZiB0eXBlIHNpemVfdHlwZSBhcyB3ZWxsIGFzCisvLyBtYXRjaGVyLiBGb3IgaW5zdGFuY2U6CisvLyAgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKDIpKTsgICAgIC8vIENoZWNrcyBjb250YWluZXIgaGFzIDIgZWxlbWVudHMuCisvLyAgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKExlKDIpKTsgIC8vIENoZWNrcyBjb250YWluZXIgaGFzIGF0IG1vc3QgMi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTaXplTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6U2l6ZUlzTWF0Y2hlcjxTaXplTWF0Y2hlcj4KK1NpemVJcyhjb25zdCBTaXplTWF0Y2hlciYgc2l6ZV9tYXRjaGVyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6U2l6ZUlzTWF0Y2hlcjxTaXplTWF0Y2hlcj4oc2l6ZV9tYXRjaGVyKTsKK30KKworLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjb250YWluZXIncyBiZWdpbigpCisvLyBpdGVyYXRvciBhbmQgaXRzIGVuZCgpIGl0ZXJhdG9yLCBpLmUuIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuIFRoaXMgbWF0Y2hlcgorLy8gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBTaXplSXMgd2l0aCBjb250YWluZXJzIHN1Y2ggYXMgc3RkOjpmb3J3YXJkX2xpc3Qgd2hpY2gKKy8vIGRvIG5vdCBpbXBsZW1lbnQgc2l6ZSgpLiBUaGUgY29udGFpbmVyIG11c3QgcHJvdmlkZSBjb25zdF9pdGVyYXRvciAod2l0aAorLy8gdmFsaWQgaXRlcmF0b3JfdHJhaXRzKSwgYmVnaW4oKSBhbmQgZW5kKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGlzdGFuY2VNYXRjaGVyPgoraW5saW5lIGludGVybmFsOjpCZWdpbkVuZERpc3RhbmNlSXNNYXRjaGVyPERpc3RhbmNlTWF0Y2hlcj4KK0JlZ2luRW5kRGlzdGFuY2VJcyhjb25zdCBEaXN0YW5jZU1hdGNoZXImIGRpc3RhbmNlX21hdGNoZXIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpCZWdpbkVuZERpc3RhbmNlSXNNYXRjaGVyPERpc3RhbmNlTWF0Y2hlcj4oZGlzdGFuY2VfbWF0Y2hlcik7Cit9CisKKy8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbiBlcXVhbCBjb250YWluZXIuCisvLyBUaGlzIG1hdGNoZXIgYmVoYXZlcyBsaWtlIEVxKCksIGJ1dCBpbiB0aGUgZXZlbnQgb2YgbWlzbWF0Y2ggbGlzdHMgdGhlCisvLyB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gb25lIGNvbnRhaW5lciBidXQgbm90IHRoZSBvdGhlci4gKER1cGxpY2F0ZQorLy8gdmFsdWVzIGFuZCBvcmRlciBkaWZmZXJlbmNlcyBhcmUgbm90IGV4cGxhaW5lZC4pCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgoraW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6Q29udGFpbmVyRXFNYXRjaGVyPCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhDb250YWluZXIpPiA+CisgICAgQ29udGFpbmVyRXEoY29uc3QgQ29udGFpbmVyJiByaHMpIHsKKyAgLy8gVGhpcyBmb2xsb3dpbmcgbGluZSBpcyBmb3Igd29ya2luZyBhcm91bmQgYSBidWcgaW4gTVNWQyA4LjAsCisgIC8vIHdoaWNoIGNhdXNlcyBDb250YWluZXIgdG8gYmUgYSBjb25zdCB0eXBlIHNvbWV0aW1lcy4KKyAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOworICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcigKKyAgICAgIGludGVybmFsOjpDb250YWluZXJFcU1hdGNoZXI8UmF3Q29udGFpbmVyPihyaHMpKTsKK30KKworLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29udGFpbmVyIHRoYXQsIHdoZW4gc29ydGVkIHVzaW5nCisvLyB0aGUgZ2l2ZW4gY29tcGFyYXRvciwgbWF0Y2hlcyBjb250YWluZXJfbWF0Y2hlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDb21wYXJhdG9yLCB0eXBlbmFtZSBDb250YWluZXJNYXRjaGVyPgoraW5saW5lIGludGVybmFsOjpXaGVuU29ydGVkQnlNYXRjaGVyPENvbXBhcmF0b3IsIENvbnRhaW5lck1hdGNoZXI+CitXaGVuU29ydGVkQnkoY29uc3QgQ29tcGFyYXRvciYgY29tcGFyYXRvciwKKyAgICAgICAgICAgICBjb25zdCBDb250YWluZXJNYXRjaGVyJiBjb250YWluZXJfbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OldoZW5Tb3J0ZWRCeU1hdGNoZXI8Q29tcGFyYXRvciwgQ29udGFpbmVyTWF0Y2hlcj4oCisgICAgICBjb21wYXJhdG9yLCBjb250YWluZXJfbWF0Y2hlcik7Cit9CisKKy8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGNvbnRhaW5lciB0aGF0LCB3aGVuIHNvcnRlZCB1c2luZworLy8gdGhlIDwgb3BlcmF0b3IsIG1hdGNoZXMgY29udGFpbmVyX21hdGNoZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyTWF0Y2hlcj4KK2lubGluZSBpbnRlcm5hbDo6V2hlblNvcnRlZEJ5TWF0Y2hlcjxpbnRlcm5hbDo6TGVzc0NvbXBhcmF0b3IsIENvbnRhaW5lck1hdGNoZXI+CitXaGVuU29ydGVkKGNvbnN0IENvbnRhaW5lck1hdGNoZXImIGNvbnRhaW5lcl9tYXRjaGVyKSB7CisgIHJldHVybgorICAgICAgaW50ZXJuYWw6OldoZW5Tb3J0ZWRCeU1hdGNoZXI8aW50ZXJuYWw6Okxlc3NDb21wYXJhdG9yLCBDb250YWluZXJNYXRjaGVyPigKKyAgICAgICAgICBpbnRlcm5hbDo6TGVzc0NvbXBhcmF0b3IoKSwgY29udGFpbmVyX21hdGNoZXIpOworfQorCisvLyBNYXRjaGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgb3IgYSBuYXRpdmUgYXJyYXkgdGhhdCBjb250YWlucyB0aGUKKy8vIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFzIGluIHJocywgd2hlcmUgaXRzIGktdGggZWxlbWVudCBhbmQgcmhzJ3MKKy8vIGktdGggZWxlbWVudCAoYXMgYSBwYWlyKSBzYXRpc2Z5IHRoZSBnaXZlbiBwYWlyIG1hdGNoZXIsIGZvciBhbGwgaS4KKy8vIFR1cGxlTWF0Y2hlciBtdXN0IGJlIGFibGUgdG8gYmUgc2FmZWx5IGNhc3QgdG8gTWF0Y2hlcjx0dXBsZTxjb25zdAorLy8gVDEmLCBjb25zdCBUMiY+ID4sIHdoZXJlIFQxIGFuZCBUMiBhcmUgdGhlIHR5cGVzIG9mIGVsZW1lbnRzIGluIHRoZQorLy8gTEhTIGNvbnRhaW5lciBhbmQgdGhlIFJIUyBjb250YWluZXIgcmVzcGVjdGl2ZWx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlTWF0Y2hlciwgdHlwZW5hbWUgQ29udGFpbmVyPgoraW5saW5lIGludGVybmFsOjpQb2ludHdpc2VNYXRjaGVyPFR1cGxlTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9SRU1PVkVfQ09OU1RfKENvbnRhaW5lcik+CitQb2ludHdpc2UoY29uc3QgVHVwbGVNYXRjaGVyJiB0dXBsZV9tYXRjaGVyLCBjb25zdCBDb250YWluZXImIHJocykgeworICAvLyBUaGlzIGZvbGxvd2luZyBsaW5lIGlzIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwKKyAgLy8gd2hpY2ggY2F1c2VzIENvbnRhaW5lciB0byBiZSBhIGNvbnN0IHR5cGUgc29tZXRpbWVzIChlLmcuIHdoZW4KKyAgLy8gcmhzIGlzIGEgY29uc3QgaW50W10pLi4KKyAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOworICByZXR1cm4gaW50ZXJuYWw6OlBvaW50d2lzZU1hdGNoZXI8VHVwbGVNYXRjaGVyLCBSYXdDb250YWluZXI+KAorICAgICAgdHVwbGVfbWF0Y2hlciwgcmhzKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8KKworLy8gU3VwcG9ydHMgdGhlIFBvaW50d2lzZShtLCB7YSwgYiwgY30pIHN5bnRheC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZU1hdGNoZXIsIHR5cGVuYW1lIFQ+CitpbmxpbmUgaW50ZXJuYWw6OlBvaW50d2lzZU1hdGNoZXI8VHVwbGVNYXRjaGVyLCBzdGQ6OnZlY3RvcjxUPiA+IFBvaW50d2lzZSgKKyAgICBjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiByaHMpIHsKKyAgcmV0dXJuIFBvaW50d2lzZSh0dXBsZV9tYXRjaGVyLCBzdGQ6OnZlY3RvcjxUPihyaHMpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCisKKy8vIFVub3JkZXJlZFBvaW50d2lzZShwYWlyX21hdGNoZXIsIHJocykgbWF0Y2hlcyBhbiBTVEwtc3R5bGUKKy8vIGNvbnRhaW5lciBvciBhIG5hdGl2ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZgorLy8gZWxlbWVudHMgYXMgaW4gcmhzLCB3aGVyZSBpbiBzb21lIHBlcm11dGF0aW9uIG9mIHRoZSBjb250YWluZXIsIGl0cworLy8gaS10aCBlbGVtZW50IGFuZCByaHMncyBpLXRoIGVsZW1lbnQgKGFzIGEgcGFpcikgc2F0aXNmeSB0aGUgZ2l2ZW4KKy8vIHBhaXIgbWF0Y2hlciwgZm9yIGFsbCBpLiAgVHVwbGUyTWF0Y2hlciBtdXN0IGJlIGFibGUgdG8gYmUgc2FmZWx5CisvLyBjYXN0IHRvIE1hdGNoZXI8dHVwbGU8Y29uc3QgVDEmLCBjb25zdCBUMiY+ID4sIHdoZXJlIFQxIGFuZCBUMiBhcmUKKy8vIHRoZSB0eXBlcyBvZiBlbGVtZW50cyBpbiB0aGUgTEhTIGNvbnRhaW5lciBhbmQgdGhlIFJIUyBjb250YWluZXIKKy8vIHJlc3BlY3RpdmVseS4KKy8vCisvLyBUaGlzIGlzIGxpa2UgUG9pbnR3aXNlKHBhaXJfbWF0Y2hlciwgcmhzKSwgZXhjZXB0IHRoYXQgdGhlIGVsZW1lbnQKKy8vIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlMk1hdGNoZXIsIHR5cGVuYW1lIFJoc0NvbnRhaW5lcj4KK2lubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkJvdW5kU2Vjb25kTWF0Y2hlcjwKKyAgICAgICAgVHVwbGUyTWF0Y2hlciwgdHlwZW5hbWUgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8R1RFU1RfUkVNT1ZFX0NPTlNUXygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJoc0NvbnRhaW5lcik+Ojp0eXBlOjp2YWx1ZV90eXBlPiA+CitVbm9yZGVyZWRQb2ludHdpc2UoY29uc3QgVHVwbGUyTWF0Y2hlciYgdHVwbGUyX21hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUmhzQ29udGFpbmVyJiByaHNfY29udGFpbmVyKSB7CisgIC8vIFRoaXMgZm9sbG93aW5nIGxpbmUgaXMgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLAorICAvLyB3aGljaCBjYXVzZXMgUmhzQ29udGFpbmVyIHRvIGJlIGEgY29uc3QgdHlwZSBzb21ldGltZXMgKGUuZy4gd2hlbgorICAvLyByaHNfY29udGFpbmVyIGlzIGEgY29uc3QgaW50W10pLgorICB0eXBlZGVmIEdURVNUX1JFTU9WRV9DT05TVF8oUmhzQ29udGFpbmVyKSBSYXdSaHNDb250YWluZXI7CisKKyAgLy8gUmhzVmlldyBhbGxvd3MgdGhlIHNhbWUgY29kZSB0byBoYW5kbGUgUmhzQ29udGFpbmVyIGJlaW5nIGEKKyAgLy8gU1RMLXN0eWxlIGNvbnRhaW5lciBhbmQgaXQgYmVpbmcgYSBuYXRpdmUgQy1zdHlsZSBhcnJheS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxSYXdSaHNDb250YWluZXI+IFJoc1ZpZXc7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzVmlldzo6dHlwZSBSaHNTdGxDb250YWluZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzU3RsQ29udGFpbmVyOjp2YWx1ZV90eXBlIFNlY29uZDsKKyAgY29uc3QgUmhzU3RsQ29udGFpbmVyJiByaHNfc3RsX2NvbnRhaW5lciA9CisgICAgICBSaHNWaWV3OjpDb25zdFJlZmVyZW5jZShyaHNfY29udGFpbmVyKTsKKworICAvLyBDcmVhdGUgYSBtYXRjaGVyIGZvciBlYWNoIGVsZW1lbnQgaW4gcmhzX2NvbnRhaW5lci4KKyAgOjpzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6Qm91bmRTZWNvbmRNYXRjaGVyPFR1cGxlMk1hdGNoZXIsIFNlY29uZD4gPiBtYXRjaGVyczsKKyAgZm9yICh0eXBlbmFtZSBSaHNTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmhzX3N0bF9jb250YWluZXIuYmVnaW4oKTsKKyAgICAgICBpdCAhPSByaHNfc3RsX2NvbnRhaW5lci5lbmQoKTsgKytpdCkgeworICAgIG1hdGNoZXJzLnB1c2hfYmFjaygKKyAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXJCaW5kU2Vjb25kKHR1cGxlMl9tYXRjaGVyLCAqaXQpKTsKKyAgfQorCisgIC8vIERlbGVnYXRlIHRoZSB3b3JrIHRvIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoKS4KKyAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkobWF0Y2hlcnMpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXworCisvLyBTdXBwb3J0cyB0aGUgVW5vcmRlcmVkUG9pbnR3aXNlKG0sIHthLCBiLCBjfSkgc3ludGF4LgordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlMk1hdGNoZXIsIHR5cGVuYW1lIFQ+CitpbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPAorICAgIHR5cGVuYW1lIGludGVybmFsOjpCb3VuZFNlY29uZE1hdGNoZXI8VHVwbGUyTWF0Y2hlciwgVD4gPgorVW5vcmRlcmVkUG9pbnR3aXNlKGNvbnN0IFR1cGxlMk1hdGNoZXImIHR1cGxlMl9tYXRjaGVyLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiByaHMpIHsKKyAgcmV0dXJuIFVub3JkZXJlZFBvaW50d2lzZSh0dXBsZTJfbWF0Y2hlciwgc3RkOjp2ZWN0b3I8VD4ocmhzKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXworCisvLyBNYXRjaGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgb3IgYSBuYXRpdmUgYXJyYXkgdGhhdCBjb250YWlucyBhdAorLy8gbGVhc3Qgb25lIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHZhbHVlIG9yIG1hdGNoZXIuCisvLworLy8gRXhhbXBsZXM6CisvLyAgIDo6c3RkOjpzZXQ8aW50PiBwYWdlX2lkczsKKy8vICAgcGFnZV9pZHMuaW5zZXJ0KDMpOworLy8gICBwYWdlX2lkcy5pbnNlcnQoMSk7CisvLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBDb250YWlucygxKSk7CisvLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBDb250YWlucyhHdCgyKSkpOworLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgTm90KENvbnRhaW5zKDQpKSk7CisvLworLy8gICA6OnN0ZDo6bWFwPGludCwgc2l6ZV90PiBwYWdlX2xlbmd0aHM7CisvLyAgIHBhZ2VfbGVuZ3Roc1sxXSA9IDEwMDsKKy8vICAgRVhQRUNUX1RIQVQocGFnZV9sZW5ndGhzLAorLy8gICAgICAgICAgICAgICBDb250YWlucyg6OnN0ZDo6cGFpcjxjb25zdCBpbnQsIHNpemVfdD4oMSwgMTAwKSkpOworLy8KKy8vICAgY29uc3QgY2hhciogdXNlcl9pZHNbXSA9IHsgImpvZSIsICJtaWtlIiwgInRvbSIgfTsKKy8vICAgRVhQRUNUX1RIQVQodXNlcl9pZHMsIENvbnRhaW5zKEVxKDo6c3RkOjpzdHJpbmcoInRvbSIpKSkpOwordGVtcGxhdGUgPHR5cGVuYW1lIE0+CitpbmxpbmUgaW50ZXJuYWw6OkNvbnRhaW5zTWF0Y2hlcjxNPiBDb250YWlucyhNIG1hdGNoZXIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDb250YWluc01hdGNoZXI8TT4obWF0Y2hlcik7Cit9CisKKy8vIE1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhIG5hdGl2ZSBhcnJheSB0aGF0IGNvbnRhaW5zIG9ubHkKKy8vIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiB2YWx1ZSBvciBtYXRjaGVyLgorLy8KKy8vIEVhY2gobSkgaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gTm90KENvbnRhaW5zKE5vdChtKSkpLiBPbmx5CisvLyB0aGUgbWVzc2FnZXMgYXJlIGRpZmZlcmVudC4KKy8vCisvLyBFeGFtcGxlczoKKy8vICAgOjpzdGQ6OnNldDxpbnQ+IHBhZ2VfaWRzOworLy8gICAvLyBFYWNoKG0pIG1hdGNoZXMgYW4gZW1wdHkgY29udGFpbmVyLCByZWdhcmRsZXNzIG9mIHdoYXQgbSBpcy4KKy8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIEVhY2goRXEoMSkpKTsKKy8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIEVhY2goRXEoNzcpKSk7CisvLworLy8gICBwYWdlX2lkcy5pbnNlcnQoMyk7CisvLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBFYWNoKEd0KDApKSk7CisvLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBOb3QoRWFjaChHdCg0KSkpKTsKKy8vICAgcGFnZV9pZHMuaW5zZXJ0KDEpOworLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgTm90KEVhY2goTHQoMikpKSk7CisvLworLy8gICA6OnN0ZDo6bWFwPGludCwgc2l6ZV90PiBwYWdlX2xlbmd0aHM7CisvLyAgIHBhZ2VfbGVuZ3Roc1sxXSA9IDEwMDsKKy8vICAgcGFnZV9sZW5ndGhzWzJdID0gMjAwOworLy8gICBwYWdlX2xlbmd0aHNbM10gPSAzMDA7CisvLyAgIEVYUEVDVF9USEFUKHBhZ2VfbGVuZ3RocywgTm90KEVhY2goUGFpcigxLCAxMDApKSkpOworLy8gICBFWFBFQ1RfVEhBVChwYWdlX2xlbmd0aHMsIEVhY2goS2V5KExlKDMpKSkpOworLy8KKy8vICAgY29uc3QgY2hhciogdXNlcl9pZHNbXSA9IHsgImpvZSIsICJtaWtlIiwgInRvbSIgfTsKKy8vICAgRVhQRUNUX1RIQVQodXNlcl9pZHMsIE5vdChFYWNoKEVxKDo6c3RkOjpzdHJpbmcoInRvbSIpKSkpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNPgoraW5saW5lIGludGVybmFsOjpFYWNoTWF0Y2hlcjxNPiBFYWNoKE0gbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OkVhY2hNYXRjaGVyPE0+KG1hdGNoZXIpOworfQorCisvLyBLZXkoaW5uZXJfbWF0Y2hlcikgbWF0Y2hlcyBhbiBzdGQ6OnBhaXIgd2hvc2UgJ2ZpcnN0JyBmaWVsZCBtYXRjaGVzCisvLyBpbm5lcl9tYXRjaGVyLiAgRm9yIGV4YW1wbGUsIENvbnRhaW5zKEtleShHZSg1KSkpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFuCisvLyBzdGQ6Om1hcCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IHdob3NlIGtleSBpcyA+PSA1LgordGVtcGxhdGUgPHR5cGVuYW1lIE0+CitpbmxpbmUgaW50ZXJuYWw6OktleU1hdGNoZXI8TT4gS2V5KE0gaW5uZXJfbWF0Y2hlcikgeworICByZXR1cm4gaW50ZXJuYWw6OktleU1hdGNoZXI8TT4oaW5uZXJfbWF0Y2hlcik7Cit9CisKKy8vIFBhaXIoZmlyc3RfbWF0Y2hlciwgc2Vjb25kX21hdGNoZXIpIG1hdGNoZXMgYSBzdGQ6OnBhaXIgd2hvc2UgJ2ZpcnN0JyBmaWVsZAorLy8gbWF0Y2hlcyBmaXJzdF9tYXRjaGVyIGFuZCB3aG9zZSAnc2Vjb25kJyBmaWVsZCBtYXRjaGVzIHNlY29uZF9tYXRjaGVyLiAgRm9yCisvLyBleGFtcGxlLCBFWFBFQ1RfVEhBVChtYXBfdHlwZSwgRWxlbWVudHNBcmUoUGFpcihHZSg1KSwgImZvbyIpKSkgY2FuIGJlIHVzZWQKKy8vIHRvIG1hdGNoIGEgc3RkOjptYXA8aW50LCBzdHJpbmc+IHRoYXQgY29udGFpbnMgZXhhY3RseSBvbmUgZWxlbWVudCB3aG9zZSBrZXkKKy8vIGlzID49IDUgYW5kIHdob3NlIHZhbHVlIGVxdWFscyAiZm9vIi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdE1hdGNoZXIsIHR5cGVuYW1lIFNlY29uZE1hdGNoZXI+CitpbmxpbmUgaW50ZXJuYWw6OlBhaXJNYXRjaGVyPEZpcnN0TWF0Y2hlciwgU2Vjb25kTWF0Y2hlcj4KK1BhaXIoRmlyc3RNYXRjaGVyIGZpcnN0X21hdGNoZXIsIFNlY29uZE1hdGNoZXIgc2Vjb25kX21hdGNoZXIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpQYWlyTWF0Y2hlcjxGaXJzdE1hdGNoZXIsIFNlY29uZE1hdGNoZXI+KAorICAgICAgZmlyc3RfbWF0Y2hlciwgc2Vjb25kX21hdGNoZXIpOworfQorCisvLyBSZXR1cm5zIGEgcHJlZGljYXRlIHRoYXQgaXMgc2F0aXNmaWVkIGJ5IGFueXRoaW5nIHRoYXQgbWF0Y2hlcyB0aGUKKy8vIGdpdmVuIG1hdGNoZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KK2lubGluZSBpbnRlcm5hbDo6TWF0Y2hlckFzUHJlZGljYXRlPE0+IE1hdGNoZXMoTSBtYXRjaGVyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6TWF0Y2hlckFzUHJlZGljYXRlPE0+KG1hdGNoZXIpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBtYXRjaGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+CitpbmxpbmUgYm9vbCBWYWx1ZShjb25zdCBUJiB2YWx1ZSwgTSBtYXRjaGVyKSB7CisgIHJldHVybiB0ZXN0aW5nOjpNYXRjaGVzKG1hdGNoZXIpKHZhbHVlKTsKK30KKworLy8gTWF0Y2hlcyB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgZ2l2ZW4gbWF0Y2hlciBhbmQgZXhwbGFpbnMgdGhlIG1hdGNoCisvLyByZXN1bHQgdG8gbGlzdGVuZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTT4KK2lubGluZSBib29sIEV4cGxhaW5NYXRjaFJlc3VsdCgKKyAgICBNIG1hdGNoZXIsIGNvbnN0IFQmIHZhbHVlLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgeworICByZXR1cm4gU2FmZU1hdGNoZXJDYXN0PGNvbnN0IFQmPihtYXRjaGVyKS5NYXRjaEFuZEV4cGxhaW4odmFsdWUsIGxpc3RlbmVyKTsKK30KKworI2lmIEdURVNUX0xBTkdfQ1hYMTEKKy8vIERlZmluZSB2YXJpYWRpYyBtYXRjaGVyIHZlcnNpb25zLiBUaGV5IGFyZSBvdmVybG9hZGVkIGluCisvLyBnbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCBmb3IgdGhlIGNhc2VzIHN1cHBvcnRlZCBieSBwcmUgQysrMTEgY29tcGlsZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CitpbmxpbmUgaW50ZXJuYWw6OkFsbE9mTWF0Y2hlcjxBcmdzLi4uPiBBbGxPZihjb25zdCBBcmdzJi4uLiBtYXRjaGVycykgeworICByZXR1cm4gaW50ZXJuYWw6OkFsbE9mTWF0Y2hlcjxBcmdzLi4uPihtYXRjaGVycy4uLik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgoraW5saW5lIGludGVybmFsOjpBbnlPZk1hdGNoZXI8QXJncy4uLj4gQW55T2YoY29uc3QgQXJncyYuLi4gbWF0Y2hlcnMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpBbnlPZk1hdGNoZXI8QXJncy4uLj4obWF0Y2hlcnMuLi4pOworfQorCisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKKworLy8gQWxsQXJncyhtKSBpcyBhIHN5bm9ueW0gb2YgbS4gIFRoaXMgaXMgdXNlZnVsIGluCisvLworLy8gICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfLCBfKSkuV2l0aChBbGxBcmdzKEVxKCkpKTsKKy8vCisvLyB3aGljaCBpcyBlYXNpZXIgdG8gcmVhZCB0aGFuCisvLworLy8gICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfLCBfKSkuV2l0aChFcSgpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+CitpbmxpbmUgSW5uZXJNYXRjaGVyIEFsbEFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7IHJldHVybiBtYXRjaGVyOyB9CisKKy8vIFRoZXNlIG1hY3JvcyBhbGxvdyB1c2luZyBtYXRjaGVycyB0byBjaGVjayB2YWx1ZXMgaW4gR29vZ2xlIFRlc3QKKy8vIHRlc3RzLiAgQVNTRVJUX1RIQVQodmFsdWUsIG1hdGNoZXIpIGFuZCBFWFBFQ1RfVEhBVCh2YWx1ZSwgbWF0Y2hlcikKKy8vIHN1Y2NlZWQgaWZmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBtYXRjaGVyLiAgSWYgdGhlIGFzc2VydGlvbiBmYWlscywKKy8vIHRoZSB2YWx1ZSBhbmQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtYXRjaGVyIHdpbGwgYmUgcHJpbnRlZC4KKyNkZWZpbmUgQVNTRVJUX1RIQVQodmFsdWUsIG1hdGNoZXIpIEFTU0VSVF9QUkVEX0ZPUk1BVDEoXAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok1ha2VQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcihtYXRjaGVyKSwgdmFsdWUpCisjZGVmaW5lIEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKSBFWFBFQ1RfUFJFRF9GT1JNQVQxKFwKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNYWtlUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIobWF0Y2hlciksIHZhbHVlKQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBJbmNsdWRlIGFueSBjdXN0b20gY2FsbGJhY2sgbWF0Y2hlcnMgYWRkZWQgYnkgdGhlIGxvY2FsIGluc3RhbGxhdGlvbi4KKy8vIFdlIG11c3QgaW5jbHVkZSB0aGlzIGhlYWRlciBhdCB0aGUgZW5kIHRvIG1ha2Ugc3VyZSBpdCBjYW4gdXNlIHRoZQorLy8gZGVjbGFyYXRpb25zIGZyb20gdGhpcyBmaWxlLgorI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1tYXRjaGVycy5oIgorI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01BVENIRVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1vcmUtYWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzg3YjYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaApAQCAtMCwwICsxLDI0NiBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgYWN0aW9ucyB0aGF0IGRlcGVuZCBvbiBnbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLgorCisjaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTU9SRV9BQ1RJT05TX0hfCisjZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTU9SRV9BQ1RJT05TX0hfCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBJbXBsZW1lbnRzIHRoZSBJbnZva2UoZikgYWN0aW9uLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50CisvLyBGdW5jdGlvbkltcGwgaXMgdGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgZiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhCisvLyBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3Rvci4gIEludm9rZShmKSBjYW4gYmUgdXNlZCBhcyBhbgorLy8gQWN0aW9uPEY+IGFzIGxvbmcgYXMgZidzIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEYgKGkuZS4gZiBjYW4gYmUKKy8vIGFzc2lnbmVkIHRvIGEgdHIxOjpmdW5jdGlvbjxGPikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25JbXBsPgorY2xhc3MgSW52b2tlQWN0aW9uIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjJ3RvciBtYWtlcyBhIGNvcHkgb2YgZnVuY3Rpb25faW1wbCAoZWl0aGVyIGEgZnVuY3Rpb24KKyAgLy8gcG9pbnRlciBvciBhIGZ1bmN0b3IpLgorICBleHBsaWNpdCBJbnZva2VBY3Rpb24oRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpCisgICAgICA6IGZ1bmN0aW9uX2ltcGxfKGZ1bmN0aW9uX2ltcGwpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KKyAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgeworICAgIHJldHVybiBJbnZva2VIZWxwZXI8UmVzdWx0LCBBcmd1bWVudFR1cGxlPjo6SW52b2tlKGZ1bmN0aW9uX2ltcGxfLCBhcmdzKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGxfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW52b2tlQWN0aW9uKTsKK307CisKKy8vIEltcGxlbWVudHMgdGhlIEludm9rZShvYmplY3RfcHRyLCAmQ2xhc3M6Ok1ldGhvZCkgYWN0aW9uLgordGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+CitjbGFzcyBJbnZva2VNZXRob2RBY3Rpb24geworIHB1YmxpYzoKKyAgSW52b2tlTWV0aG9kQWN0aW9uKENsYXNzKiBvYmpfcHRyLCBNZXRob2RQdHIgbWV0aG9kX3B0cikKKyAgICAgIDogbWV0aG9kX3B0cl8obWV0aG9kX3B0ciksIG9ial9wdHJfKG9ial9wdHIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KKyAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgeworICAgIHJldHVybiBJbnZva2VIZWxwZXI8UmVzdWx0LCBBcmd1bWVudFR1cGxlPjo6SW52b2tlTWV0aG9kKAorICAgICAgICBvYmpfcHRyXywgbWV0aG9kX3B0cl8sIGFyZ3MpOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUgb3JkZXIgb2YgdGhlc2UgbWVtYmVycyBtYXR0ZXJzLiAgUmV2ZXJzaW5nIHRoZSBvcmRlciBjYW4gdHJpZ2dlcgorICAvLyB3YXJuaW5nIEM0MTIxIGluIE1TVkMgKHNlZQorICAvLyBodHRwOi8vY29tcHV0ZXItcHJvZ3JhbW1pbmctZm9ydW0uY29tLzctdmMubmV0LzZmYmMzMDI2NWY4NjBhZDEuaHRtICkuCisgIGNvbnN0IE1ldGhvZFB0ciBtZXRob2RfcHRyXzsKKyAgQ2xhc3MqIGNvbnN0IG9ial9wdHJfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW52b2tlTWV0aG9kQWN0aW9uKTsKK307CisKKy8vIEFuIGludGVybmFsIHJlcGxhY2VtZW50IGZvciBzdGQ6OmNvcHkgd2hpY2ggbWltaWNzIGl0cyBiZWhhdmlvci4gVGhpcyBpcworLy8gbmVjZXNzYXJ5IGJlY2F1c2UgVmlzdWFsIFN0dWRpbyBkZXByZWNhdGVzIDo6c3RkOjpjb3B5LCBpc3N1aW5nIHdhcm5pbmcgNDk5Ni4KKy8vIEhvd2V2ZXIgVmlzdWFsIFN0dWRpbyAyMDEwIGFuZCBsYXRlciBkbyBub3QgaG9ub3IgI3ByYWdtYXMgd2hpY2ggZGlzYWJsZSB0aGF0CisvLyB3YXJuaW5nLgordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgT3V0cHV0SXRlcmF0b3I+CitpbmxpbmUgT3V0cHV0SXRlcmF0b3IgQ29weUVsZW1lbnRzKElucHV0SXRlcmF0b3IgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0SXRlcmF0b3Igb3V0cHV0KSB7CisgIGZvciAoOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0LCArK291dHB1dCkgeworICAgICpvdXRwdXQgPSAqZmlyc3Q7CisgIH0KKyAgcmV0dXJuIG91dHB1dDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2UoKS4KKworLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbnZva2VzICdmdW5jdGlvbl9pbXBsJyB3aXRoIHRoZSBtb2NrCisvLyBmdW5jdGlvbidzIGFyZ3VtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbkltcGw+CitQb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6SW52b2tlQWN0aW9uPEZ1bmN0aW9uSW1wbD4gPiBJbnZva2UoCisgICAgRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKKyAgICAgIGludGVybmFsOjpJbnZva2VBY3Rpb248RnVuY3Rpb25JbXBsPihmdW5jdGlvbl9pbXBsKSk7Cit9CisKKy8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgaW52b2tlcyB0aGUgZ2l2ZW4gbWV0aG9kIG9uIHRoZSBnaXZlbiBvYmplY3QKKy8vIHdpdGggdGhlIG1vY2sgZnVuY3Rpb24ncyBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KK1BvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpJbnZva2VNZXRob2RBY3Rpb248Q2xhc3MsIE1ldGhvZFB0cj4gPiBJbnZva2UoCisgICAgQ2xhc3MqIG9ial9wdHIsIE1ldGhvZFB0ciBtZXRob2RfcHRyKSB7CisgIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oCisgICAgICBpbnRlcm5hbDo6SW52b2tlTWV0aG9kQWN0aW9uPENsYXNzLCBNZXRob2RQdHI+KG9ial9wdHIsIG1ldGhvZF9wdHIpKTsKK30KKworLy8gV2l0aG91dEFyZ3MoaW5uZXJfYWN0aW9uKSBjYW4gYmUgdXNlZCBpbiBhIG1vY2sgZnVuY3Rpb24gd2l0aCBhCisvLyBub24tZW1wdHkgYXJndW1lbnQgbGlzdCB0byBwZXJmb3JtIGlubmVyX2FjdGlvbiwgd2hpY2ggdGFrZXMgbm8KKy8vIGFyZ3VtZW50LiAgSW4gb3RoZXIgd29yZHMsIGl0IGFkYXB0cyBhbiBhY3Rpb24gYWNjZXB0aW5nIG5vCisvLyBhcmd1bWVudCB0byBvbmUgdGhhdCBhY2NlcHRzIChhbmQgaWdub3JlcykgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIElubmVyQWN0aW9uPgoraW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbj4KK1dpdGhvdXRBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKKyAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbj4oYWN0aW9uKTsKK30KKworLy8gV2l0aEFyZzxrPihhbl9hY3Rpb24pIGNyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGFzc2VzIHRoZSBrLXRoCisvLyAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYW5fYWN0aW9uIGFuZCBwZXJmb3JtcworLy8gaXQuICBJdCBhZGFwdHMgYW4gYWN0aW9uIGFjY2VwdGluZyBvbmUgYXJndW1lbnQgdG8gb25lIHRoYXQgYWNjZXB0cworLy8gbXVsdGlwbGUgYXJndW1lbnRzLiAgRm9yIGNvbnZlbmllbmNlLCB3ZSBhbHNvIHByb3ZpZGUKKy8vIFdpdGhBcmdzPGs+KGFuX2FjdGlvbikgKGRlZmluZWQgYmVsb3cpIGFzIGEgc3lub255bS4KK3RlbXBsYXRlIDxpbnQgaywgdHlwZW5hbWUgSW5uZXJBY3Rpb24+CitpbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrPgorV2l0aEFyZyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGs+KGFjdGlvbik7Cit9CisKKy8vIFRoZSBBQ1RJT04qKCkgbWFjcm9zIHRyaWdnZXIgd2FybmluZyBDNDEwMCAodW5yZWZlcmVuY2VkIGZvcm1hbAorLy8gcGFyYW1ldGVyKSBpbiBNU1ZDIHdpdGggLVc0LiAgVW5mb3J0dW5hdGVseSB0aGV5IGNhbm5vdCBiZSBmaXhlZCBpbgorLy8gdGhlIG1hY3JvIGRlZmluaXRpb24sIGFzIHRoZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1hY3JvCisvLyBpcyBleHBhbmRlZCBhbmQgbWFjcm8gZXhwYW5zaW9uIGNhbm5vdCBjb250YWluICNwcmFnbWEuICBUaGVyZWZvcmUKKy8vIHdlIHN1cHByZXNzIHRoZW0gaGVyZS4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKQorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxMDApCisjZW5kaWYKKworLy8gQWN0aW9uIFJldHVybkFyZzxrPigpIHJldHVybnMgdGhlIGstdGggYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24uCitBQ1RJT05fVEVNUExBVEUoUmV0dXJuQXJnLAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorICAgICAgICAgICAgICAgIEFORF8wX1ZBTFVFX1BBUkFNUygpKSB7CisgIHJldHVybiA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKTsKK30KKworLy8gQWN0aW9uIFNhdmVBcmc8az4ocG9pbnRlcikgc2F2ZXMgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZQorLy8gbW9jayBmdW5jdGlvbiB0byAqcG9pbnRlci4KK0FDVElPTl9URU1QTEFURShTYXZlQXJnLAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwb2ludGVyKSkgeworICAqcG9pbnRlciA9IDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpOworfQorCisvLyBBY3Rpb24gU2F2ZUFyZ1BvaW50ZWU8az4ocG9pbnRlcikgc2F2ZXMgdGhlIHZhbHVlIHBvaW50ZWQgdG8KKy8vIGJ5IHRoZSBrLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byAqcG9pbnRlci4KK0FDVElPTl9URU1QTEFURShTYXZlQXJnUG9pbnRlZSwKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKKyAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMocG9pbnRlcikpIHsKKyAgKnBvaW50ZXIgPSAqOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyk7Cit9CisKKy8vIEFjdGlvbiBTZXRBcmdSZWZlcmVlPGs+KHZhbHVlKSBhc3NpZ25zICd2YWx1ZScgdG8gdGhlIHZhcmlhYmxlCisvLyByZWZlcmVuY2VkIGJ5IHRoZSBrLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbi4KK0FDVElPTl9URU1QTEFURShTZXRBcmdSZWZlcmVlLAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyh2YWx1ZSkpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OnR1cGxlX2VsZW1lbnQ8aywgYXJnc190eXBlPjo6dHlwZSBhcmdrX3R5cGU7CisgIC8vIEVuc3VyZXMgdGhhdCBhcmd1bWVudCAjayBpcyBhIHJlZmVyZW5jZS4gIElmIHlvdSBnZXQgYSBjb21waWxlcgorICAvLyBlcnJvciBvbiB0aGUgbmV4dCBsaW5lLCB5b3UgYXJlIHVzaW5nIFNldEFyZ1JlZmVyZWU8az4odmFsdWUpIGluCisgIC8vIGEgbW9jayBmdW5jdGlvbiB3aG9zZSBrLXRoICgwLWJhc2VkKSBhcmd1bWVudCBpcyBub3QgYSByZWZlcmVuY2UuCisgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPGFyZ2tfdHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0QXJnUmVmZXJlZV9tdXN0X2JlX3VzZWRfd2l0aF9hX3JlZmVyZW5jZV9hcmd1bWVudCk7CisgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpID0gdmFsdWU7Cit9CisKKy8vIEFjdGlvbiBTZXRBcnJheUFyZ3VtZW50PGs+KGZpcnN0LCBsYXN0KSBjb3BpZXMgdGhlIGVsZW1lbnRzIGluCisvLyBzb3VyY2UgcmFuZ2UgW2ZpcnN0LCBsYXN0KSB0byB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSB0aGUgay10aAorLy8gKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgcG9pbnRlciBvciBhbgorLy8gaXRlcmF0b3IuIFRoZSBhY3Rpb24gZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorLy8gc291cmNlIHJhbmdlLgorQUNUSU9OX1RFTVBMQVRFKFNldEFycmF5QXJndW1lbnQsCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCisgICAgICAgICAgICAgICAgQU5EXzJfVkFMVUVfUEFSQU1TKGZpcnN0LCBsYXN0KSkgeworICAvLyBWaXN1YWwgU3R1ZGlvIGRlcHJlY2F0ZXMgOjpzdGQ6OmNvcHksIHNvIHdlIHVzZSBvdXIgb3duIGNvcHkgaW4gdGhhdCBjYXNlLgorI2lmZGVmIF9NU0NfVkVSCisgIGludGVybmFsOjpDb3B5RWxlbWVudHMoZmlyc3QsIGxhc3QsIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKKyNlbHNlCisgIDo6c3RkOjpjb3B5KGZpcnN0LCBsYXN0LCA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSk7CisjZW5kaWYKK30KKworLy8gQWN0aW9uIERlbGV0ZUFyZzxrPigpIGRlbGV0ZXMgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrCisvLyBmdW5jdGlvbi4KK0FDVElPTl9URU1QTEFURShEZWxldGVBcmcsCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCisgICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKKyAgZGVsZXRlIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpOworfQorCisvLyBUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwb2ludGVyJy4KK0FDVElPTl9QKFJldHVyblBvaW50ZWUsIHBvaW50ZXIpIHsgcmV0dXJuICpwb2ludGVyOyB9CisKKy8vIEFjdGlvbiBUaHJvdyhleGNlcHRpb24pIGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbiBvZiBhbnkgdHlwZQorLy8gdG8gdGhyb3cgdGhlIGdpdmVuIGV4Y2VwdGlvbi4gIEFueSBjb3B5YWJsZSB2YWx1ZSBjYW4gYmUgdGhyb3duLgorI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFN1cHByZXNzZXMgdGhlICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIHRoYXQgVkMgZ2VuZXJhdGVzIGluIG9wdCBtb2Rlcy4KKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3MDIpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ3MDIuCisjIGVuZGlmCitBQ1RJT05fUChUaHJvdywgZXhjZXB0aW9uKSB7IHRocm93IGV4Y2VwdGlvbjsgfQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjIGVuZGlmCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTU9SRV9BQ1RJT05TX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiODk5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1vcmUtbWF0Y2hlcnMuaApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgMjAxMywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiBtYXJjdXMuYm9lcmdlckBnb29nbGUuY29tIChNYXJjdXMgQm9lcmdlcikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgbWF0Y2hlcnMgdGhhdCBkZXBlbmQgb24gZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmguCisvLworLy8gTm90ZSB0aGF0IHRlc3RzIGFyZSBpbXBsZW1lbnRlZCBpbiBnbW9jay1tYXRjaGVyc190ZXN0LmNjIHJhdGhlciB0aGFuCisvLyBnbW9jay1tb3JlLW1hdGNoZXJzLXRlc3QuY2MuCisKKyNpZm5kZWYgR01PQ0tfR01PQ0tfTU9SRV9NQVRDSEVSU19IXworI2RlZmluZSBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBEZWZpbmVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gZW1wdHkgY29udGFpbmVyLiBUaGUgY29udGFpbmVyIG11c3QKKy8vIHN1cHBvcnQgYm90aCBzaXplKCkgYW5kIGVtcHR5KCksIHdoaWNoIGFsbCBTVEwtbGlrZSBjb250YWluZXJzIHByb3ZpZGUuCitNQVRDSEVSKElzRW1wdHksIG5lZ2F0aW9uID8gImlzbid0IGVtcHR5IiA6ICJpcyBlbXB0eSIpIHsKKyAgaWYgKGFyZy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgKnJlc3VsdF9saXN0ZW5lciA8PCAid2hvc2Ugc2l6ZSBpcyAiIDw8IGFyZy5zaXplKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkN2RlNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaApAQCAtMCwwICsxLDE4NDcgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgT05fQ0FMTCgpIGFuZCBFWFBFQ1RfQ0FMTCgpIG1hY3Jvcy4KKy8vCisvLyBBIHVzZXIgY2FuIHVzZSB0aGUgT05fQ0FMTCgpIG1hY3JvIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgYWN0aW9uIG9mCisvLyBhIG1vY2sgbWV0aG9kLiAgVGhlIHN5bnRheCBpczoKKy8vCisvLyAgIE9OX0NBTEwobW9ja19vYmplY3QsIE1ldGhvZChhcmd1bWVudC1tYXRjaGVycykpCisvLyAgICAgICAuV2l0aChtdWx0aS1hcmd1bWVudC1tYXRjaGVyKQorLy8gICAgICAgLldpbGxCeURlZmF1bHQoYWN0aW9uKTsKKy8vCisvLyAgd2hlcmUgdGhlIC5XaXRoKCkgY2xhdXNlIGlzIG9wdGlvbmFsLgorLy8KKy8vIEEgdXNlciBjYW4gdXNlIHRoZSBFWFBFQ1RfQ0FMTCgpIG1hY3JvIHRvIHNwZWNpZnkgYW4gZXhwZWN0YXRpb24gb24KKy8vIGEgbW9jayBtZXRob2QuICBUaGUgc3ludGF4IGlzOgorLy8KKy8vICAgRVhQRUNUX0NBTEwobW9ja19vYmplY3QsIE1ldGhvZChhcmd1bWVudC1tYXRjaGVycykpCisvLyAgICAgICAuV2l0aChtdWx0aS1hcmd1bWVudC1tYXRjaGVycykKKy8vICAgICAgIC5UaW1lcyhjYXJkaW5hbGl0eSkKKy8vICAgICAgIC5JblNlcXVlbmNlKHNlcXVlbmNlcykKKy8vICAgICAgIC5BZnRlcihleHBlY3RhdGlvbnMpCisvLyAgICAgICAuV2lsbE9uY2UoYWN0aW9uKQorLy8gICAgICAgLldpbGxSZXBlYXRlZGx5KGFjdGlvbikKKy8vICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisvLworLy8gd2hlcmUgYWxsIGNsYXVzZXMgYXJlIG9wdGlvbmFsLCBhbmQgLkluU2VxdWVuY2UoKS8uQWZ0ZXIoKS8KKy8vIC5XaWxsT25jZSgpIGNhbiBhcHBlYXIgYW55IG51bWJlciBvZiB0aW1lcy4KKworI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX1NQRUNfQlVJTERFUlNfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19TUEVDX0JVSUxERVJTX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisjIGluY2x1ZGUgPHN0ZGV4Y2VwdD4gIC8vIE5PTElOVAorI2VuZGlmCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay1hY3Rpb25zLmgiCisjaW5jbHVkZSAiZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCisjaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBBbiBhYnN0cmFjdCBoYW5kbGUgb2YgYW4gZXhwZWN0YXRpb24uCitjbGFzcyBFeHBlY3RhdGlvbjsKKworLy8gQSBzZXQgb2YgZXhwZWN0YXRpb24gaGFuZGxlcy4KK2NsYXNzIEV4cGVjdGF0aW9uU2V0OworCisvLyBBbnl0aGluZyBpbnNpZGUgdGhlICdpbnRlcm5hbCcgbmFtZXNwYWNlIElTIElOVEVSTkFMIElNUExFTUVOVEFUSU9OCisvLyBhbmQgTVVTVCBOT1QgQkUgVVNFRCBJTiBVU0VSIENPREUhISEKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEltcGxlbWVudHMgYSBtb2NrIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEY+IGNsYXNzIEZ1bmN0aW9uTW9ja2VyOworCisvLyBCYXNlIGNsYXNzIGZvciBleHBlY3RhdGlvbnMuCitjbGFzcyBFeHBlY3RhdGlvbkJhc2U7CisKKy8vIEltcGxlbWVudHMgYW4gZXhwZWN0YXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gY2xhc3MgVHlwZWRFeHBlY3RhdGlvbjsKKworLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIHRoZSBFeHBlY3RhdGlvbiBjbGFzcyB0ZW1wbGF0ZS4KK2NsYXNzIEV4cGVjdGF0aW9uVGVzdGVyOworCisvLyBCYXNlIGNsYXNzIGZvciBmdW5jdGlvbiBtb2NrZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIEY+IGNsYXNzIEZ1bmN0aW9uTW9ja2VyQmFzZTsKKworLy8gUHJvdGVjdHMgdGhlIG1vY2sgb2JqZWN0IHJlZ2lzdHJ5IChpbiBjbGFzcyBNb2NrKSwgYWxsIGZ1bmN0aW9uCisvLyBtb2NrZXJzLCBhbmQgYWxsIGV4cGVjdGF0aW9ucy4KKy8vCisvLyBUaGUgcmVhc29uIHdlIGRvbid0IHVzZSBtb3JlIGZpbmUtZ3JhaW5lZCBwcm90ZWN0aW9uIGlzOiB3aGVuIGEKKy8vIG1vY2sgZnVuY3Rpb24gRm9vKCkgaXMgY2FsbGVkLCBpdCBuZWVkcyB0byBjb25zdWx0IGl0cyBleHBlY3RhdGlvbnMKKy8vIHRvIHNlZSB3aGljaCBvbmUgc2hvdWxkIGJlIHBpY2tlZC4gIElmIGFub3RoZXIgdGhyZWFkIGlzIGFsbG93ZWQgdG8KKy8vIGNhbGwgYSBtb2NrIGZ1bmN0aW9uIChlaXRoZXIgRm9vKCkgb3IgYSBkaWZmZXJlbnQgb25lKSBhdCB0aGUgc2FtZQorLy8gdGltZSwgaXQgY291bGQgYWZmZWN0IHRoZSAicmV0aXJlZCIgYXR0cmlidXRlcyBvZiBGb28oKSdzCisvLyBleHBlY3RhdGlvbnMgd2hlbiBJblNlcXVlbmNlKCkgaXMgdXNlZCwgYW5kIHRodXMgYWZmZWN0IHdoaWNoCisvLyBleHBlY3RhdGlvbiBnZXRzIHBpY2tlZC4gIFRoZXJlZm9yZSwgd2Ugc2VxdWVuY2UgYWxsIG1vY2sgZnVuY3Rpb24KKy8vIGNhbGxzIHRvIGVuc3VyZSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBtb2NrIG9iamVjdHMnIHN0YXRlcy4KK0dURVNUX0FQSV8gR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKGdfZ21vY2tfbXV0ZXgpOworCisvLyBVbnR5cGVkIGJhc2UgY2xhc3MgZm9yIEFjdGlvblJlc3VsdEhvbGRlcjxSPi4KK2NsYXNzIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlOworCisvLyBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIEZ1bmN0aW9uTW9ja2VyQmFzZS4gIFRoaXMgaXMgdGhlCisvLyB0eXBlLWFnbm9zdGljIHBhcnQgb2YgdGhlIGZ1bmN0aW9uIG1vY2tlciBpbnRlcmZhY2UuICBJdHMgcHVyZQorLy8gdmlydHVhbCBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBieSBGdW5jdGlvbk1vY2tlckJhc2UuCitjbGFzcyBHVEVTVF9BUElfIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UgeworIHB1YmxpYzoKKyAgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpOworICB2aXJ0dWFsIH5VbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKCk7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoaXMgbW9jayBmdW5jdGlvbiBoYXZlIGJlZW4KKyAgLy8gc2F0aXNmaWVkLiAgUmVwb3J0cyBvbmUgb3IgbW9yZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMKKyAgLy8gYW5kIHJldHVybnMgZmFsc2UgaWYgbm90LgorICBib29sIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkKKyAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KTsKKworICAvLyBDbGVhcnMgdGhlIE9OX0NBTEwoKXMgc2V0IG9uIHRoaXMgbW9jayBmdW5jdGlvbi4KKyAgdmlydHVhbCB2b2lkIENsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKQorICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpID0gMDsKKworICAvLyBJbiBhbGwgb2YgdGhlIGZvbGxvd2luZyBVbnR5cGVkKiBmdW5jdGlvbnMsIGl0J3MgdGhlIGNhbGxlcidzCisgIC8vIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGFyZ3VtZW50cycKKyAgLy8gdHlwZXMuCisKKyAgLy8gUGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucworICAvLyB0aGUgYWN0aW9uJ3MgcmVzdWx0LiAgVGhlIGNhbGwgZGVzY3JpcHRpb24gc3RyaW5nIHdpbGwgYmUgdXNlZCBpbgorICAvLyB0aGUgZXJyb3IgbWVzc2FnZSB0byBkZXNjcmliZSB0aGUgY2FsbCBpbiB0aGUgY2FzZSB0aGUgZGVmYXVsdAorICAvLyBhY3Rpb24gZmFpbHMuCisgIC8vIEwgPSAqCisgIHZpcnR1YWwgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIFVudHlwZWRQZXJmb3JtRGVmYXVsdEFjdGlvbigKKyAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywKKyAgICAgIGNvbnN0IHN0cmluZyYgY2FsbF9kZXNjcmlwdGlvbikgY29uc3QgPSAwOworCisgIC8vIFBlcmZvcm1zIHRoZSBnaXZlbiBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCByZXR1cm5zCisgIC8vIHRoZSBhY3Rpb24ncyByZXN1bHQuCisgIC8vIEwgPSAqCisgIHZpcnR1YWwgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIFVudHlwZWRQZXJmb3JtQWN0aW9uKAorICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hY3Rpb24sCisgICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MpIGNvbnN0ID0gMDsKKworICAvLyBXcml0ZXMgYSBtZXNzYWdlIHRoYXQgdGhlIGNhbGwgaXMgdW5pbnRlcmVzdGluZyAoaS5lLiBuZWl0aGVyCisgIC8vIGV4cGxpY2l0bHkgZXhwZWN0ZWQgbm9yIGV4cGxpY2l0bHkgdW5leHBlY3RlZCkgdG8gdGhlIGdpdmVuCisgIC8vIG9zdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBVbnR5cGVkRGVzY3JpYmVVbmludGVyZXN0aW5nQ2FsbCgKKyAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywKKyAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QKKyAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgZXhwZWN0YXRpb24gdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcmd1bWVudHMKKyAgLy8gKG9yIE5VTEwgaXMgdGhlcmUncyBubyBtYXRjaCk7IHdoZW4gYSBtYXRjaCBpcyBmb3VuZCwKKyAgLy8gdW50eXBlZF9hY3Rpb24gaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUKKyAgLy8gcGVyZm9ybWVkIChvciBOVUxMIGlmIHRoZSBhY3Rpb24gaXMgImRvIGRlZmF1bHQiKSwgYW5kCisgIC8vIGlzX2V4Y2Vzc2l2ZSBpcyBtb2RpZmllZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBjYWxsIGV4Y2VlZHMgdGhlCisgIC8vIGV4cGVjdGVkIG51bWJlci4KKyAgdmlydHVhbCBjb25zdCBFeHBlY3RhdGlvbkJhc2UqIFVudHlwZWRGaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbigKKyAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywKKyAgICAgIGNvbnN0IHZvaWQqKiB1bnR5cGVkX2FjdGlvbiwgYm9vbCogaXNfZXhjZXNzaXZlLAorICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoYXQsIDo6c3RkOjpvc3RyZWFtKiB3aHkpCisgICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgPSAwOworCisgIC8vIFByaW50cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXJndW1lbnRzIHRvIHRoZSBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgVW50eXBlZFByaW50QXJncyhjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOworCisgIC8vIFNldHMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0bywgYW5kIHJlZ2lzdGVycworICAvLyB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBnbG9iYWwgbW9jayByZWdpc3RyeS4gIFdpbGwgYmUgY2FsbGVkCisgIC8vIHdoZW5ldmVyIGFuIEVYUEVDVF9DQUxMKCkgb3IgT05fQ0FMTCgpIGlzIGV4ZWN1dGVkIG9uIHRoaXMgbW9jaworICAvLyBtZXRob2QuCisgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZW5hbWUgdG8gU2V0QW5kUmVnaXN0ZXJPd25lcigpLgorICB2b2lkIFJlZ2lzdGVyT3duZXIoY29uc3Qgdm9pZCogbW9ja19vYmopCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsKKworICAvLyBTZXRzIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8sIGFuZCBzZXRzIHRoZQorICAvLyBuYW1lIG9mIHRoZSBtb2NrIGZ1bmN0aW9uLiAgV2lsbCBiZSBjYWxsZWQgdXBvbiBlYWNoIGludm9jYXRpb24KKyAgLy8gb2YgdGhpcyBtb2NrIGZ1bmN0aW9uLgorICB2b2lkIFNldE93bmVyQW5kTmFtZShjb25zdCB2b2lkKiBtb2NrX29iaiwgY29uc3QgY2hhciogbmFtZSkKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpOworCisgIC8vIFJldHVybnMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0by4gIE11c3QgYmUKKyAgLy8gY2FsbGVkIGFmdGVyIFJlZ2lzdGVyT3duZXIoKSBvciBTZXRPd25lckFuZE5hbWUoKSBoYXMgYmVlbgorICAvLyBjYWxsZWQuCisgIGNvbnN0IHZvaWQqIE1vY2tPYmplY3QoKSBjb25zdAorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCk7CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG1vY2sgbWV0aG9kLiAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgLy8gU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4gY2FsbGVkLgorICBjb25zdCBjaGFyKiBOYW1lKCkgY29uc3QKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpOworCisgIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGlzIG1vY2sgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4KKyAgLy8gYXJndW1lbnRzLiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgc2FmZWx5IGNhbGxlZCBmcm9tIG11bHRpcGxlCisgIC8vIHRocmVhZHMgY29uY3VycmVudGx5LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlCisgIC8vIHJlc3VsdC4KKyAgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIFVudHlwZWRJbnZva2VXaXRoKAorICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzKQorICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpOworCisgcHJvdGVjdGVkOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0IHZvaWQqPiBVbnR5cGVkT25DYWxsU3BlY3M7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6bGlua2VkX3B0cjxFeHBlY3RhdGlvbkJhc2U+ID4KKyAgVW50eXBlZEV4cGVjdGF0aW9uczsKKworICAvLyBSZXR1cm5zIGFuIEV4cGVjdGF0aW9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW5kIGNvLW93bnMgZXhwLAorICAvLyB3aGljaCBtdXN0IGJlIGFuIGV4cGVjdGF0aW9uIG9uIHRoaXMgbW9jayBmdW5jdGlvbi4KKyAgRXhwZWN0YXRpb24gR2V0SGFuZGxlT2YoRXhwZWN0YXRpb25CYXNlKiBleHApOworCisgIC8vIEFkZHJlc3Mgb2YgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0by4gIE9ubHkKKyAgLy8gdmFsaWQgYWZ0ZXIgdGhpcyBtb2NrIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgb3IKKyAgLy8gT05fQ0FMTC9FWFBFQ1RfQ0FMTCBoYXMgYmVlbiBpbnZva2VkIG9uIGl0LgorICBjb25zdCB2b2lkKiBtb2NrX29ial87ICAvLyBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4KKworICAvLyBOYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBtb2NrZWQuICBPbmx5IHZhbGlkIGFmdGVyIHRoaXMgbW9jaworICAvLyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgorICBjb25zdCBjaGFyKiBuYW1lXzsgIC8vIFByb3RlY3RlZCBieSBnX2dtb2NrX211dGV4LgorCisgIC8vIEFsbCBkZWZhdWx0IGFjdGlvbiBzcGVjcyBmb3IgdGhpcyBmdW5jdGlvbiBtb2NrZXIuCisgIFVudHlwZWRPbkNhbGxTcGVjcyB1bnR5cGVkX29uX2NhbGxfc3BlY3NfOworCisgIC8vIEFsbCBleHBlY3RhdGlvbnMgZm9yIHRoaXMgZnVuY3Rpb24gbW9ja2VyLgorICBVbnR5cGVkRXhwZWN0YXRpb25zIHVudHlwZWRfZXhwZWN0YXRpb25zXzsKK307ICAvLyBjbGFzcyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlCisKKy8vIFVudHlwZWQgYmFzZSBjbGFzcyBmb3IgT25DYWxsU3BlYzxGPi4KK2NsYXNzIFVudHlwZWRPbkNhbGxTcGVjQmFzZSB7CisgcHVibGljOgorICAvLyBUaGUgYXJndW1lbnRzIGFyZSB0aGUgbG9jYXRpb24gb2YgdGhlIE9OX0NBTEwoKSBzdGF0ZW1lbnQuCisgIFVudHlwZWRPbkNhbGxTcGVjQmFzZShjb25zdCBjaGFyKiBhX2ZpbGUsIGludCBhX2xpbmUpCisgICAgICA6IGZpbGVfKGFfZmlsZSksIGxpbmVfKGFfbGluZSksIGxhc3RfY2xhdXNlXyhrTm9uZSkge30KKworICAvLyBXaGVyZSBpbiB0aGUgc291cmNlIGZpbGUgd2FzIHRoZSBkZWZhdWx0IGFjdGlvbiBzcGVjIGRlZmluZWQ/CisgIGNvbnN0IGNoYXIqIGZpbGUoKSBjb25zdCB7IHJldHVybiBmaWxlXzsgfQorICBpbnQgbGluZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVfOyB9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIEdpdmVzIGVhY2ggY2xhdXNlIGluIHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50IGEgbmFtZS4KKyAgZW51bSBDbGF1c2UgeworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBlbnVtIG1lbWJlcnMhICBUaGUgcnVuLXRpbWUKKyAgICAvLyBzeW50YXggY2hlY2tpbmcgcmVsaWVzIG9uIGl0LgorICAgIGtOb25lLAorICAgIGtXaXRoLAorICAgIGtXaWxsQnlEZWZhdWx0CisgIH07CisKKyAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50IGhhcyBhIGNlcnRhaW4gcHJvcGVydHkuCisgIHZvaWQgQXNzZXJ0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7CisgICAgQXNzZXJ0KHByb3BlcnR5LCBmaWxlXywgbGluZV8sIGZhaWx1cmVfbWVzc2FnZSk7CisgIH0KKworICAvLyBFeHBlY3RzIHRoYXQgdGhlIE9OX0NBTEwoKSBzdGF0ZW1lbnQgaGFzIGEgY2VydGFpbiBwcm9wZXJ0eS4KKyAgdm9pZCBFeHBlY3RTcGVjUHJvcGVydHkoYm9vbCBwcm9wZXJ0eSwgY29uc3Qgc3RyaW5nJiBmYWlsdXJlX21lc3NhZ2UpIGNvbnN0IHsKKyAgICBFeHBlY3QocHJvcGVydHksIGZpbGVfLCBsaW5lXywgZmFpbHVyZV9tZXNzYWdlKTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIGZpbGVfOworICBpbnQgbGluZV87CisKKyAgLy8gVGhlIGxhc3QgY2xhdXNlIGluIHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50IGFzIHNlZW4gc28gZmFyLgorICAvLyBJbml0aWFsbHkga05vbmUgYW5kIGNoYW5nZXMgYXMgdGhlIHN0YXRlbWVudCBpcyBwYXJzZWQuCisgIENsYXVzZSBsYXN0X2NsYXVzZV87Cit9OyAgLy8gY2xhc3MgVW50eXBlZE9uQ2FsbFNwZWNCYXNlCisKKy8vIFRoaXMgdGVtcGxhdGUgY2xhc3MgaW1wbGVtZW50cyBhbiBPTl9DQUxMIHNwZWMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KK2NsYXNzIE9uQ2FsbFNwZWMgOiBwdWJsaWMgVW50eXBlZE9uQ2FsbFNwZWNCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRNYXRjaGVyVHVwbGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7CisKKyAgLy8gQ29uc3RydWN0cyBhbiBPbkNhbGxTcGVjIG9iamVjdCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbnNpZGUKKyAgLy8gdGhlIHBhcmVudGhlc2lzIG9mIGFuIE9OX0NBTEwoKSBzdGF0ZW1lbnQuCisgIE9uQ2FsbFNwZWMoY29uc3QgY2hhciogYV9maWxlLCBpbnQgYV9saW5lLAorICAgICAgICAgICAgIGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtYXRjaGVycykKKyAgICAgIDogVW50eXBlZE9uQ2FsbFNwZWNCYXNlKGFfZmlsZSwgYV9saW5lKSwKKyAgICAgICAgbWF0Y2hlcnNfKG1hdGNoZXJzKSwKKyAgICAgICAgLy8gQnkgZGVmYXVsdCwgZXh0cmFfbWF0Y2hlcl8gc2hvdWxkIG1hdGNoIGFueXRoaW5nLiAgSG93ZXZlciwKKyAgICAgICAgLy8gd2UgY2Fubm90IGluaXRpYWxpemUgaXQgd2l0aCBfIGFzIHRoYXQgdHJpZ2dlcnMgYSBjb21waWxlcgorICAgICAgICAvLyBidWcgaW4gU3ltYmlhbidzIEMrKyBjb21waWxlciAoY2Fubm90IGRlY2lkZSBiZXR3ZWVuIHR3bworICAgICAgICAvLyBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyBvZiBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPikuCisgICAgICAgIGV4dHJhX21hdGNoZXJfKEE8Y29uc3QgQXJndW1lbnRUdXBsZSY+KCkpIHsKKyAgfQorCisgIC8vIEltcGxlbWVudHMgdGhlIC5XaXRoKCkgY2xhdXNlLgorICBPbkNhbGxTcGVjJiBXaXRoKGNvbnN0IE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+JiBtKSB7CisgICAgLy8gTWFrZXMgc3VyZSB0aGlzIGlzIGNhbGxlZCBhdCBtb3N0IG9uY2UuCisgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtXaXRoLAorICAgICAgICAgICAgICAgICAgICAgICAiLldpdGgoKSBjYW5ub3QgYXBwZWFyICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIE9OX0NBTEwoKS4iKTsKKyAgICBsYXN0X2NsYXVzZV8gPSBrV2l0aDsKKworICAgIGV4dHJhX21hdGNoZXJfID0gbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBJbXBsZW1lbnRzIHRoZSAuV2lsbEJ5RGVmYXVsdCgpIGNsYXVzZS4KKyAgT25DYWxsU3BlYyYgV2lsbEJ5RGVmYXVsdChjb25zdCBBY3Rpb248Rj4mIGFjdGlvbikgeworICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrV2lsbEJ5RGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsQnlEZWZhdWx0KCkgbXVzdCBhcHBlYXIgIgorICAgICAgICAgICAgICAgICAgICAgICAiZXhhY3RseSBvbmNlIGluIGFuIE9OX0NBTEwoKS4iKTsKKyAgICBsYXN0X2NsYXVzZV8gPSBrV2lsbEJ5RGVmYXVsdDsKKworICAgIEV4cGVjdFNwZWNQcm9wZXJ0eSghYWN0aW9uLklzRG9EZWZhdWx0KCksCisgICAgICAgICAgICAgICAgICAgICAgICJEb0RlZmF1bHQoKSBjYW5ub3QgYmUgdXNlZCBpbiBPTl9DQUxMKCkuIik7CisgICAgYWN0aW9uXyA9IGFjdGlvbjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBhcmd1bWVudHMgbWF0Y2ggdGhlIG1hdGNoZXJzLgorICBib29sIE1hdGNoZXMoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgeworICAgIHJldHVybiBUdXBsZU1hdGNoZXMobWF0Y2hlcnNfLCBhcmdzKSAmJiBleHRyYV9tYXRjaGVyXy5NYXRjaGVzKGFyZ3MpOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgYWN0aW9uIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAgY29uc3QgQWN0aW9uPEY+JiBHZXRBY3Rpb24oKSBjb25zdCB7CisgICAgQXNzZXJ0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA9PSBrV2lsbEJ5RGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsQnlEZWZhdWx0KCkgbXVzdCBhcHBlYXIgZXhhY3RseSAiCisgICAgICAgICAgICAgICAgICAgICAgICJvbmNlIGluIGFuIE9OX0NBTEwoKS4iKTsKKyAgICByZXR1cm4gYWN0aW9uXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVGhlIGluZm9ybWF0aW9uIGluIHN0YXRlbWVudAorICAvLworICAvLyAgIE9OX0NBTEwobW9ja19vYmplY3QsIE1ldGhvZChtYXRjaGVycykpCisgIC8vICAgICAgIC5XaXRoKG11bHRpLWFyZ3VtZW50LW1hdGNoZXIpCisgIC8vICAgICAgIC5XaWxsQnlEZWZhdWx0KGFjdGlvbik7CisgIC8vCisgIC8vIGlzIHJlY29yZGVkIGluIHRoZSBkYXRhIG1lbWJlcnMgbGlrZSB0aGlzOgorICAvLworICAvLyAgIHNvdXJjZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHN0YXRlbWVudCA9PiBmaWxlXworICAvLyAgIGxpbmUgbnVtYmVyIG9mIHRoZSBzdGF0ZW1lbnQgICAgICAgICAgICA9PiBsaW5lXworICAvLyAgIG1hdGNoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBtYXRjaGVyc18KKyAgLy8gICBtdWx0aS1hcmd1bWVudC1tYXRjaGVyICAgICAgICAgICAgICAgICAgPT4gZXh0cmFfbWF0Y2hlcl8KKyAgLy8gICBhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gYWN0aW9uXworICBBcmd1bWVudE1hdGNoZXJUdXBsZSBtYXRjaGVyc187CisgIE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+IGV4dHJhX21hdGNoZXJfOworICBBY3Rpb248Rj4gYWN0aW9uXzsKK307ICAvLyBjbGFzcyBPbkNhbGxTcGVjCisKKy8vIFBvc3NpYmxlIHJlYWN0aW9ucyBvbiB1bmludGVyZXN0aW5nIGNhbGxzLgorZW51bSBDYWxsUmVhY3Rpb24geworICBrQWxsb3csCisgIGtXYXJuLAorICBrRmFpbCwKKyAga0RlZmF1bHQgPSBrV2FybiAgLy8gQnkgZGVmYXVsdCwgd2FybiBhYm91dCB1bmludGVyZXN0aW5nIGNhbGxzLgorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIG1vY2sgb2JqZWN0cy4KK2NsYXNzIEdURVNUX0FQSV8gTW9jayB7CisgcHVibGljOgorICAvLyBUaGUgZm9sbG93aW5nIHB1YmxpYyBtZXRob2RzIGNhbiBiZSBjYWxsZWQgY29uY3VycmVudGx5LgorCisgIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGlnbm9yZSBtb2NrX29iaiB3aGVuIGNoZWNraW5nIGZvciBsZWFrZWQKKyAgLy8gbW9jayBvYmplY3RzLgorICBzdGF0aWMgdm9pZCBBbGxvd0xlYWsoY29uc3Qgdm9pZCogbW9ja19vYmopCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7CisKKyAgLy8gVmVyaWZpZXMgYW5kIGNsZWFycyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4KKyAgLy8gSWYgdGhlIGV4cGVjdGF0aW9ucyBhcmVuJ3Qgc2F0aXNmaWVkLCBnZW5lcmF0ZXMgb25lIG9yIG1vcmUKKyAgLy8gR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzIGFuZCByZXR1cm5zIGZhbHNlLgorICBzdGF0aWMgYm9vbCBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyh2b2lkKiBtb2NrX29iaikKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKKworICAvLyBWZXJpZmllcyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBhbmQgY2xlYXJzIGl0cworICAvLyBkZWZhdWx0IGFjdGlvbnMgYW5kIGV4cGVjdGF0aW9ucy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhlCisgIC8vIHZlcmlmaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgc3RhdGljIGJvb2wgVmVyaWZ5QW5kQ2xlYXIodm9pZCogbW9ja19vYmopCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U7CisKKyAgLy8gTmVlZGVkIGZvciBhIGZ1bmN0aW9uIG1vY2tlciB0byByZWdpc3RlciBpdHNlbGYgKHNvIHRoYXQgd2Uga25vdworICAvLyBob3cgdG8gY2xlYXIgYSBtb2NrIG9iamVjdCkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KKyAgZnJpZW5kIGNsYXNzIE5pY2VNb2NrOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNPgorICBmcmllbmQgY2xhc3MgTmFnZ3lNb2NrOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNPgorICBmcmllbmQgY2xhc3MgU3RyaWN0TW9jazsKKworICAvLyBUZWxscyBHb29nbGUgTW9jayB0byBhbGxvdyB1bmludGVyZXN0aW5nIGNhbGxzIG9uIHRoZSBnaXZlbiBtb2NrCisgIC8vIG9iamVjdC4KKyAgc3RhdGljIHZvaWQgQWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7CisKKyAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gd2FybiB0aGUgdXNlciBhYm91dCB1bmludGVyZXN0aW5nIGNhbGxzIG9uCisgIC8vIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4KKyAgc3RhdGljIHZvaWQgV2FyblVuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaikKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKKworICAvLyBUZWxscyBHb29nbGUgTW9jayB0byBmYWlsIHVuaW50ZXJlc3RpbmcgY2FsbHMgb24gdGhlIGdpdmVuIG1vY2sKKyAgLy8gb2JqZWN0LgorICBzdGF0aWMgdm9pZCBGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOworCisgIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBpcyBiZWluZyBkZXN0cm95ZWQgYW5kCisgIC8vIGl0cyBlbnRyeSBpbiB0aGUgY2FsbC1yZWFjdGlvbiB0YWJsZSBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgc3RhdGljIHZvaWQgVW5yZWdpc3RlckNhbGxSZWFjdGlvbihjb25zdCB2b2lkKiBtb2NrX29iaikKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKKworICAvLyBSZXR1cm5zIHRoZSByZWFjdGlvbiBHb29nbGUgTW9jayB3aWxsIGhhdmUgb24gdW5pbnRlcmVzdGluZyBjYWxscworICAvLyBtYWRlIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4KKyAgc3RhdGljIGludGVybmFsOjpDYWxsUmVhY3Rpb24gR2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscygKKyAgICAgIGNvbnN0IHZvaWQqIG1vY2tfb2JqKQorICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKKworICAvLyBWZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGhhdmUgYmVlbgorICAvLyBzYXRpc2ZpZWQuICBSZXBvcnRzIG9uZSBvciBtb3JlIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcworICAvLyBhbmQgcmV0dXJucyBmYWxzZSBpZiBub3QuCisgIHN0YXRpYyBib29sIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKHZvaWQqIG1vY2tfb2JqKQorICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKKworICAvLyBDbGVhcnMgYWxsIE9OX0NBTEwoKXMgc2V0IG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4KKyAgc3RhdGljIHZvaWQgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikKKyAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7CisKKyAgLy8gUmVnaXN0ZXJzIGEgbW9jayBvYmplY3QgYW5kIGEgbW9jayBtZXRob2QgaXQgb3ducy4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXIoCisgICAgICBjb25zdCB2b2lkKiBtb2NrX29iaiwKKyAgICAgIGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKiBtb2NrZXIpCisgICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOworCisgIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHdoZXJlIGluIHRoZSBzb3VyY2UgY29kZSBtb2NrX29iaiBpcyB1c2VkIGluIGFuCisgIC8vIE9OX0NBTEwgb3IgRVhQRUNUX0NBTEwuICBJbiBjYXNlIG1vY2tfb2JqIGlzIGxlYWtlZCwgdGhpcworICAvLyBpbmZvcm1hdGlvbiBoZWxwcyB0aGUgdXNlciBpZGVudGlmeSB3aGljaCBvYmplY3QgaXQgaXMuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyVXNlQnlPbkNhbGxPckV4cGVjdENhbGwoCisgICAgICBjb25zdCB2b2lkKiBtb2NrX29iaiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCisgICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOworCisgIC8vIFVucmVnaXN0ZXJzIGEgbW9jayBtZXRob2Q7IHJlbW92ZXMgdGhlIG93bmluZyBtb2NrIG9iamVjdCBmcm9tCisgIC8vIHRoZSByZWdpc3RyeSB3aGVuIHRoZSBsYXN0IG1vY2sgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBpdCBoYXMKKyAgLy8gYmVlbiB1bnJlZ2lzdGVyZWQuICBUaGlzIGlzIGNhbGxlZCBvbmx5IGluIHRoZSBkZXN0cnVjdG9yIG9mCisgIC8vIEZ1bmN0aW9uTW9ja2VyQmFzZS4KKyAgc3RhdGljIHZvaWQgVW5yZWdpc3RlckxvY2tlZChpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSogbW9ja2VyKQorICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKK307ICAvLyBjbGFzcyBNb2NrCisKKy8vIEFuIGFic3RyYWN0IGhhbmRsZSBvZiBhbiBleHBlY3RhdGlvbi4gIFVzZWZ1bCBpbiB0aGUgLkFmdGVyKCkKKy8vIGNsYXVzZSBvZiBFWFBFQ1RfQ0FMTCgpIGZvciBzZXR0aW5nIHRoZSAocGFydGlhbCkgb3JkZXIgb2YKKy8vIGV4cGVjdGF0aW9ucy4gIFRoZSBzeW50YXg6CisvLworLy8gICBFeHBlY3RhdGlvbiBlMSA9IEVYUEVDVF9DQUxMKC4uLikuLi47CisvLyAgIEVYUEVDVF9DQUxMKC4uLikuQWZ0ZXIoZTEpLi4uOworLy8KKy8vIHNldHMgdHdvIGV4cGVjdGF0aW9ucyB3aGVyZSB0aGUgbGF0dGVyIGNhbiBvbmx5IGJlIG1hdGNoZWQgYWZ0ZXIKKy8vIHRoZSBmb3JtZXIgaGFzIGJlZW4gc2F0aXNmaWVkLgorLy8KKy8vIE5vdGVzOgorLy8gICAtIFRoaXMgY2xhc3MgaXMgY29weWFibGUgYW5kIGhhcyB2YWx1ZSBzZW1hbnRpY3MuCisvLyAgIC0gQ29uc3RuZXNzIGlzIHNoYWxsb3c6IGEgY29uc3QgRXhwZWN0YXRpb24gb2JqZWN0IGl0c2VsZiBjYW5ub3QKKy8vICAgICBiZSBtb2RpZmllZCwgYnV0IHRoZSBtdXRhYmxlIG1ldGhvZHMgb2YgdGhlIEV4cGVjdGF0aW9uQmFzZQorLy8gICAgIG9iamVjdCBpdCByZWZlcmVuY2VzIGNhbiBiZSBjYWxsZWQgdmlhIGV4cGVjdGF0aW9uX2Jhc2UoKS4KKy8vICAgLSBUaGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yIGFyZSBkZWZpbmVkIG91dC1vZi1saW5lIGJlY2F1c2UKKy8vICAgICB0aGUgU3ltYmlhbiBXSU5TQ1cgY29tcGlsZXIgd2FudHMgdG8gb3RoZXJ3aXNlIGluc3RhbnRpYXRlIHRoZW0KKy8vICAgICB3aGVuIGl0IHNlZXMgdGhpcyBjbGFzcyBkZWZpbml0aW9uLCBhdCB3aGljaCBwb2ludCBpdCBkb2Vzbid0IGhhdmUKKy8vICAgICBFeHBlY3RhdGlvbkJhc2UgYXZhaWxhYmxlIHlldCwgbGVhZGluZyB0byBpbmNvcnJlY3QgZGVzdHJ1Y3Rpb24KKy8vICAgICBpbiB0aGUgbGlua2VkX3B0ciAob3IgY29tcGlsYXRpb24gZXJyb3JzIGlmIHVzaW5nIGEgY2hlY2tpbmcKKy8vICAgICBsaW5rZWRfcHRyKS4KK2NsYXNzIEdURVNUX0FQSV8gRXhwZWN0YXRpb24geworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIG51bGwgb2JqZWN0IHRoYXQgZG9lc24ndCByZWZlcmVuY2UgYW55IGV4cGVjdGF0aW9uLgorICBFeHBlY3RhdGlvbigpOworCisgIH5FeHBlY3RhdGlvbigpOworCisgIC8vIFRoaXMgc2luZ2xlLWFyZ3VtZW50IGN0b3IgbXVzdCBub3QgYmUgZXhwbGljaXQsIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlCisgIC8vICAgRXhwZWN0YXRpb24gZSA9IEVYUEVDVF9DQUxMKC4uLik7CisgIC8vIHN5bnRheC4KKyAgLy8KKyAgLy8gQSBUeXBlZEV4cGVjdGF0aW9uIG9iamVjdCBzdG9yZXMgaXRzIHByZS1yZXF1aXNpdGVzIGFzCisgIC8vIEV4cGVjdGF0aW9uIG9iamVjdHMsIGFuZCBuZWVkcyB0byBjYWxsIHRoZSBub24tY29uc3QgUmV0aXJlKCkKKyAgLy8gbWV0aG9kIG9uIHRoZSBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0cyB0aGV5IHJlZmVyZW5jZS4gIFRoZXJlZm9yZQorICAvLyBFeHBlY3RhdGlvbiBtdXN0IHJlY2VpdmUgYSAqbm9uLWNvbnN0KiByZWZlcmVuY2UgdG8gdGhlCisgIC8vIEV4cGVjdGF0aW9uQmFzZSBvYmplY3QuCisgIEV4cGVjdGF0aW9uKGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2UmIGV4cCk7ICAvLyBOT0xJTlQKKworICAvLyBUaGUgY29tcGlsZXItZ2VuZXJhdGVkIGNvcHkgY3RvciBhbmQgb3BlcmF0b3I9IHdvcmsgZXhhY3RseSBhcworICAvLyBpbnRlbmRlZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBkZWZpbmUgb3VyIG93bi4KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHJocyByZWZlcmVuY2VzIHRoZSBzYW1lIGV4cGVjdGF0aW9uIGFzIHRoaXMgb2JqZWN0IGRvZXMuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHBlY3RhdGlvbiYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGV4cGVjdGF0aW9uX2Jhc2VfID09IHJocy5leHBlY3RhdGlvbl9iYXNlXzsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFeHBlY3RhdGlvbiYgcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHJocyk7IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBFeHBlY3RhdGlvblNldDsKKyAgZnJpZW5kIGNsYXNzIFNlcXVlbmNlOworICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlOworICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVkRXhwZWN0YXRpb247CisKKyAgLy8gVGhpcyBjb21wYXJhdG9yIGlzIG5lZWRlZCBmb3IgcHV0dGluZyBFeHBlY3RhdGlvbiBvYmplY3RzIGludG8gYSBzZXQuCisgIGNsYXNzIExlc3MgeworICAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBFeHBlY3RhdGlvbiYgbGhzLCBjb25zdCBFeHBlY3RhdGlvbiYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gbGhzLmV4cGVjdGF0aW9uX2Jhc2VfLmdldCgpIDwgcmhzLmV4cGVjdGF0aW9uX2Jhc2VfLmdldCgpOworICAgIH0KKyAgfTsKKworICB0eXBlZGVmIDo6c3RkOjpzZXQ8RXhwZWN0YXRpb24sIExlc3M+IFNldDsKKworICBFeHBlY3RhdGlvbigKKyAgICAgIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2U+JiBleHBlY3RhdGlvbl9iYXNlKTsKKworICAvLyBSZXR1cm5zIHRoZSBleHBlY3RhdGlvbiB0aGlzIG9iamVjdCByZWZlcmVuY2VzLgorICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlPiYKKyAgZXhwZWN0YXRpb25fYmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZXhwZWN0YXRpb25fYmFzZV87CisgIH0KKworICAvLyBBIGxpbmtlZF9wdHIgdGhhdCBjby1vd25zIHRoZSBleHBlY3RhdGlvbiB0aGlzIGhhbmRsZSByZWZlcmVuY2VzLgorICBpbnRlcm5hbDo6bGlua2VkX3B0cjxpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlPiBleHBlY3RhdGlvbl9iYXNlXzsKK307CisKKy8vIEEgc2V0IG9mIGV4cGVjdGF0aW9uIGhhbmRsZXMuICBVc2VmdWwgaW4gdGhlIC5BZnRlcigpIGNsYXVzZSBvZgorLy8gRVhQRUNUX0NBTEwoKSBmb3Igc2V0dGluZyB0aGUgKHBhcnRpYWwpIG9yZGVyIG9mIGV4cGVjdGF0aW9ucy4gIFRoZQorLy8gc3ludGF4OgorLy8KKy8vICAgRXhwZWN0YXRpb25TZXQgZXM7CisvLyAgIGVzICs9IEVYUEVDVF9DQUxMKC4uLikuLi47CisvLyAgIGVzICs9IEVYUEVDVF9DQUxMKC4uLikuLi47CisvLyAgIEVYUEVDVF9DQUxMKC4uLikuQWZ0ZXIoZXMpLi4uOworLy8KKy8vIHNldHMgdGhyZWUgZXhwZWN0YXRpb25zIHdoZXJlIHRoZSBsYXN0IG9uZSBjYW4gb25seSBiZSBtYXRjaGVkCisvLyBhZnRlciB0aGUgZmlyc3QgdHdvIGhhdmUgYm90aCBiZWVuIHNhdGlzZmllZC4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIGNvcHlhYmxlIGFuZCBoYXMgdmFsdWUgc2VtYW50aWNzLgorY2xhc3MgRXhwZWN0YXRpb25TZXQgeworIHB1YmxpYzoKKyAgLy8gQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yIHRoYXQgY2FuIHJlYWQgYSBjb25zdCBlbGVtZW50IGluIHRoZSBzZXQuCisgIHR5cGVkZWYgRXhwZWN0YXRpb246OlNldDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgLy8gQW4gb2JqZWN0IHN0b3JlZCBpbiB0aGUgc2V0LiAgVGhpcyBpcyBhbiBhbGlhcyBvZiBFeHBlY3RhdGlvbi4KKyAgdHlwZWRlZiBFeHBlY3RhdGlvbjo6U2V0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBzZXQuCisgIEV4cGVjdGF0aW9uU2V0KCkge30KKworICAvLyBUaGlzIHNpbmdsZS1hcmd1bWVudCBjdG9yIG11c3Qgbm90IGJlIGV4cGxpY2l0LCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZQorICAvLyAgIEV4cGVjdGF0aW9uU2V0IGVzID0gRVhQRUNUX0NBTEwoLi4uKTsKKyAgLy8gc3ludGF4LgorICBFeHBlY3RhdGlvblNldChpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlJiBleHApIHsgIC8vIE5PTElOVAorICAgICp0aGlzICs9IEV4cGVjdGF0aW9uKGV4cCk7CisgIH0KKworICAvLyBUaGlzIHNpbmdsZS1hcmd1bWVudCBjdG9yIGltcGxlbWVudHMgaW1wbGljaXQgY29udmVyc2lvbiBmcm9tCisgIC8vIEV4cGVjdGF0aW9uIGFuZCB0aHVzIG11c3Qgbm90IGJlIGV4cGxpY2l0LiAgVGhpcyBhbGxvd3MgZWl0aGVyIGFuCisgIC8vIEV4cGVjdGF0aW9uIG9yIGFuIEV4cGVjdGF0aW9uU2V0IHRvIGJlIHVzZWQgaW4gLkFmdGVyKCkuCisgIEV4cGVjdGF0aW9uU2V0KGNvbnN0IEV4cGVjdGF0aW9uJiBlKSB7ICAvLyBOT0xJTlQKKyAgICAqdGhpcyArPSBlOworICB9CisKKyAgLy8gVGhlIGNvbXBpbGVyLWdlbmVyYXRvciBjdG9yIGFuZCBvcGVyYXRvcj0gd29ya3MgZXhhY3RseSBhcworICAvLyBpbnRlbmRlZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBkZWZpbmUgb3VyIG93bi4KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHJocyBjb250YWlucyB0aGUgc2FtZSBzZXQgb2YgRXhwZWN0YXRpb24gb2JqZWN0cworICAvLyBhcyB0aGlzIGRvZXMuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHBlY3RhdGlvblNldCYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGV4cGVjdGF0aW9uc18gPT0gcmhzLmV4cGVjdGF0aW9uc187CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRXhwZWN0YXRpb25TZXQmIHJocykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByaHMpOyB9CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgc3ludGF4CisgIC8vICAgZXhwZWN0YXRpb25fc2V0ICs9IEVYUEVDVF9DQUxMKC4uLik7CisgIEV4cGVjdGF0aW9uU2V0JiBvcGVyYXRvcis9KGNvbnN0IEV4cGVjdGF0aW9uJiBlKSB7CisgICAgZXhwZWN0YXRpb25zXy5pbnNlcnQoZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGV4cGVjdGF0aW9uc18uc2l6ZSgpKTsgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZXhwZWN0YXRpb25zXy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGV4cGVjdGF0aW9uc18uZW5kKCk7IH0KKworIHByaXZhdGU6CisgIEV4cGVjdGF0aW9uOjpTZXQgZXhwZWN0YXRpb25zXzsKK307CisKKworLy8gU2VxdWVuY2Ugb2JqZWN0cyBhcmUgdXNlZCBieSBhIHVzZXIgdG8gc3BlY2lmeSB0aGUgcmVsYXRpdmUgb3JkZXIKKy8vIGluIHdoaWNoIHRoZSBleHBlY3RhdGlvbnMgc2hvdWxkIG1hdGNoLiAgVGhleSBhcmUgY29weWFibGUgKHdlIHJlbHkKKy8vIG9uIHRoZSBjb21waWxlci1kZWZpbmVkIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IpLgorY2xhc3MgR1RFU1RfQVBJXyBTZXF1ZW5jZSB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IHNlcXVlbmNlLgorICBTZXF1ZW5jZSgpIDogbGFzdF9leHBlY3RhdGlvbl8obmV3IEV4cGVjdGF0aW9uKSB7fQorCisgIC8vIEFkZHMgYW4gZXhwZWN0YXRpb24gdG8gdGhpcyBzZXF1ZW5jZS4gIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUKKyAgLy8gdGhhdCBubyBvdGhlciB0aHJlYWQgaXMgYWNjZXNzaW5nIHRoaXMgU2VxdWVuY2Ugb2JqZWN0LgorICB2b2lkIEFkZEV4cGVjdGF0aW9uKGNvbnN0IEV4cGVjdGF0aW9uJiBleHBlY3RhdGlvbikgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBUaGUgbGFzdCBleHBlY3RhdGlvbiBpbiB0aGlzIHNlcXVlbmNlLiAgV2UgdXNlIGEgbGlua2VkX3B0ciBoZXJlCisgIC8vIGJlY2F1c2UgU2VxdWVuY2Ugb2JqZWN0cyBhcmUgY29weWFibGUgYW5kIHdlIHdhbnQgdGhlIGNvcGllcyB0bworICAvLyBiZSBhbGlhc2VzLiAgVGhlIGxpbmtlZF9wdHIgYWxsb3dzIHRoZSBjb3BpZXMgdG8gY28tb3duIGFuZCBzaGFyZQorICAvLyB0aGUgc2FtZSBFeHBlY3RhdGlvbiBvYmplY3QuCisgIGludGVybmFsOjpsaW5rZWRfcHRyPEV4cGVjdGF0aW9uPiBsYXN0X2V4cGVjdGF0aW9uXzsKK307ICAvLyBjbGFzcyBTZXF1ZW5jZQorCisvLyBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhdXNlcyBhbGwgRVhQRUNUX0NBTEwoKSBzdGF0ZW1lbnRzCisvLyBlbmNvdW50ZXJlZCBpbiBpdHMgc2NvcGUgdG8gYmUgcHV0IGluIGFuIGFub255bW91cyBzZXF1ZW5jZS4gIFRoZQorLy8gd29yayBpcyBkb25lIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3Rvci4gIFlvdSBzaG91bGQgb25seQorLy8gY3JlYXRlIGFuIEluU2VxdWVuY2Ugb2JqZWN0IG9uIHRoZSBzdGFjay4KKy8vCisvLyBUaGUgc29sZSBwdXJwb3NlIGZvciB0aGlzIGNsYXNzIGlzIHRvIHN1cHBvcnQgZWFzeSBkZWZpbml0aW9uIG9mCisvLyBzZXF1ZW50aWFsIGV4cGVjdGF0aW9ucywgZS5nLgorLy8KKy8vICAgeworLy8gICAgIEluU2VxdWVuY2UgZHVtbXk7ICAvLyBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0IGRvZXNuJ3QgbWF0dGVyLgorLy8KKy8vICAgICAvLyBUaGUgZm9sbG93aW5nIGV4cGVjdGF0aW9ucyBtdXN0IG1hdGNoIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhci4KKy8vICAgICBFWFBFQ1RfQ0FMTChhLCBCYXIoKSkuLi47CisvLyAgICAgRVhQRUNUX0NBTEwoYSwgQmF6KCkpLi4uOworLy8gICAgIC4uLgorLy8gICAgIEVYUEVDVF9DQUxMKGIsIFh5eigpKS4uLjsKKy8vICAgfQorLy8KKy8vIFlvdSBjYW4gY3JlYXRlIEluU2VxdWVuY2Ugb2JqZWN0cyBpbiBtdWx0aXBsZSB0aHJlYWRzLCBhcyBsb25nIGFzCisvLyB0aGV5IGFyZSB1c2VkIHRvIGFmZmVjdCBkaWZmZXJlbnQgbW9jayBvYmplY3RzLiAgVGhlIGlkZWEgaXMgdGhhdAorLy8gZWFjaCB0aHJlYWQgY2FuIGNyZWF0ZSBhbmQgc2V0IHVwIGl0cyBvd24gbW9ja3MgYXMgaWYgaXQncyB0aGUgb25seQorLy8gdGhyZWFkLiAgSG93ZXZlciwgZm9yIGNsYXJpdHkgb2YgeW91ciB0ZXN0cyB3ZSByZWNvbW1lbmQgeW91IHRvIHNldAorLy8gdXAgbW9ja3MgaW4gdGhlIG1haW4gdGhyZWFkIHVubGVzcyB5b3UgaGF2ZSBhIGdvb2QgcmVhc29uIG5vdCB0byBkbworLy8gc28uCitjbGFzcyBHVEVTVF9BUElfIEluU2VxdWVuY2UgeworIHB1YmxpYzoKKyAgSW5TZXF1ZW5jZSgpOworICB+SW5TZXF1ZW5jZSgpOworIHByaXZhdGU6CisgIGJvb2wgc2VxdWVuY2VfY3JlYXRlZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJblNlcXVlbmNlKTsgIC8vIE5PTElOVAorfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUG9pbnRzIHRvIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpbnRyb2R1Y2VkIGJ5IGEgbGl2aW5nIEluU2VxdWVuY2UKKy8vIG9iamVjdCAoaWYgYW55KSBpbiB0aGUgY3VycmVudCB0aHJlYWQgb3IgTlVMTC4KK0dURVNUX0FQSV8gZXh0ZXJuIFRocmVhZExvY2FsPFNlcXVlbmNlKj4gZ19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZTsKKworLy8gQmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIGV4cGVjdGF0aW9ucy4KKy8vCisvLyBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgZm9yIGhhdmluZyBhIHR5cGUtYWdub3N0aWMgYmFzZSBjbGFzcyBmb3IKKy8vIEV4cGVjdGF0aW9uOgorLy8KKy8vICAgMS4gV2UgbmVlZCB0byBzdG9yZSBjb2xsZWN0aW9ucyBvZiBleHBlY3RhdGlvbnMgb2YgZGlmZmVyZW50CisvLyAgIHR5cGVzIChlLmcuIGFsbCBwcmUtcmVxdWlzaXRlcyBvZiBhIHBhcnRpY3VsYXIgZXhwZWN0YXRpb24sIGFsbAorLy8gICBleHBlY3RhdGlvbnMgaW4gYSBzZXF1ZW5jZSkuICBUaGVyZWZvcmUgdGhlc2UgZXhwZWN0YXRpb24gb2JqZWN0cworLy8gICBtdXN0IHNoYXJlIGEgY29tbW9uIGJhc2UgY2xhc3MuCisvLworLy8gICAyLiBXZSBjYW4gYXZvaWQgYmluYXJ5IGNvZGUgYmxvYXQgYnkgbW92aW5nIG1ldGhvZHMgbm90IGRlcGVuZGluZworLy8gICBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgb2YgRXhwZWN0YXRpb24gdG8gdGhlIGJhc2UgY2xhc3MuCisvLworLy8gVGhpcyBjbGFzcyBpcyBpbnRlcm5hbCBhbmQgbXVzdG4ndCBiZSB1c2VkIGJ5IHVzZXIgY29kZSBkaXJlY3RseS4KK2NsYXNzIEdURVNUX0FQSV8gRXhwZWN0YXRpb25CYXNlIHsKKyBwdWJsaWM6CisgIC8vIHNvdXJjZV90ZXh0IGlzIHRoZSBFWFBFQ1RfQ0FMTCguLi4pIHNvdXJjZSB0aGF0IGNyZWF0ZWQgdGhpcyBFeHBlY3RhdGlvbi4KKyAgRXhwZWN0YXRpb25CYXNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBzdHJpbmcmIHNvdXJjZV90ZXh0KTsKKworICB2aXJ0dWFsIH5FeHBlY3RhdGlvbkJhc2UoKTsKKworICAvLyBXaGVyZSBpbiB0aGUgc291cmNlIGZpbGUgd2FzIHRoZSBleHBlY3RhdGlvbiBzcGVjIGRlZmluZWQ/CisgIGNvbnN0IGNoYXIqIGZpbGUoKSBjb25zdCB7IHJldHVybiBmaWxlXzsgfQorICBpbnQgbGluZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVfOyB9CisgIGNvbnN0IGNoYXIqIHNvdXJjZV90ZXh0KCkgY29uc3QgeyByZXR1cm4gc291cmNlX3RleHRfLmNfc3RyKCk7IH0KKyAgLy8gUmV0dXJucyB0aGUgY2FyZGluYWxpdHkgc3BlY2lmaWVkIGluIHRoZSBleHBlY3RhdGlvbiBzcGVjLgorICBjb25zdCBDYXJkaW5hbGl0eSYgY2FyZGluYWxpdHkoKSBjb25zdCB7IHJldHVybiBjYXJkaW5hbGl0eV87IH0KKworICAvLyBEZXNjcmliZXMgdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uIG9mIHRoaXMgZXhwZWN0YXRpb24uCisgIHZvaWQgRGVzY3JpYmVMb2NhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSgpLCBsaW5lKCkpIDw8ICIgIjsKKyAgfQorCisgIC8vIERlc2NyaWJlcyBob3cgbWFueSB0aW1lcyBhIGZ1bmN0aW9uIGNhbGwgbWF0Y2hpbmcgdGhpcworICAvLyBleHBlY3RhdGlvbiBoYXMgb2NjdXJyZWQuCisgIHZvaWQgRGVzY3JpYmVDYWxsQ291bnRUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0CisgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7CisKKyAgLy8gSWYgdGhpcyBtb2NrIG1ldGhvZCBoYXMgYW4gZXh0cmEgbWF0Y2hlciAoaS5lLiAuV2l0aChtYXRjaGVyKSksCisgIC8vIGRlc2NyaWJlcyBpdCB0byB0aGUgb3N0cmVhbS4KKyAgdmlydHVhbCB2b2lkIE1heWJlRGVzY3JpYmVFeHRyYU1hdGNoZXJUbyg6OnN0ZDo6b3N0cmVhbSogb3MpID0gMDsKKworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6RXhwZWN0YXRpb247CisgIGZyaWVuZCBjbGFzcyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOworCisgIGVudW0gQ2xhdXNlIHsKKyAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBlbnVtIG1lbWJlcnMhCisgICAga05vbmUsCisgICAga1dpdGgsCisgICAga1RpbWVzLAorICAgIGtJblNlcXVlbmNlLAorICAgIGtBZnRlciwKKyAgICBrV2lsbE9uY2UsCisgICAga1dpbGxSZXBlYXRlZGx5LAorICAgIGtSZXRpcmVzT25TYXR1cmF0aW9uCisgIH07CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCB2b2lkKj4gVW50eXBlZEFjdGlvbnM7CisKKyAgLy8gUmV0dXJucyBhbiBFeHBlY3RhdGlvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFuZCBjby1vd25zIHRoaXMKKyAgLy8gZXhwZWN0YXRpb24uCisgIHZpcnR1YWwgRXhwZWN0YXRpb24gR2V0SGFuZGxlKCkgPSAwOworCisgIC8vIEFzc2VydHMgdGhhdCB0aGUgRVhQRUNUX0NBTEwoKSBzdGF0ZW1lbnQgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKyAgdm9pZCBBc3NlcnRTcGVjUHJvcGVydHkoYm9vbCBwcm9wZXJ0eSwgY29uc3Qgc3RyaW5nJiBmYWlsdXJlX21lc3NhZ2UpIGNvbnN0IHsKKyAgICBBc3NlcnQocHJvcGVydHksIGZpbGVfLCBsaW5lXywgZmFpbHVyZV9tZXNzYWdlKTsKKyAgfQorCisgIC8vIEV4cGVjdHMgdGhhdCB0aGUgRVhQRUNUX0NBTEwoKSBzdGF0ZW1lbnQgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKyAgdm9pZCBFeHBlY3RTcGVjUHJvcGVydHkoYm9vbCBwcm9wZXJ0eSwgY29uc3Qgc3RyaW5nJiBmYWlsdXJlX21lc3NhZ2UpIGNvbnN0IHsKKyAgICBFeHBlY3QocHJvcGVydHksIGZpbGVfLCBsaW5lXywgZmFpbHVyZV9tZXNzYWdlKTsKKyAgfQorCisgIC8vIEV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBjYXJkaW5hbGl0eSBvZiB0aGlzIGV4cGVjdGF0aW9uLiAgVXNlZAorICAvLyBieSB0aGUgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgdGhlIC5UaW1lcygpIGNsYXVzZS4KKyAgdm9pZCBTcGVjaWZ5Q2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHkmIGNhcmRpbmFsaXR5KTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgY2FyZGluYWxpdHkgZXhwbGljaXRseQorICAvLyB1c2luZyBhIC5UaW1lcygpLgorICBib29sIGNhcmRpbmFsaXR5X3NwZWNpZmllZCgpIGNvbnN0IHsgcmV0dXJuIGNhcmRpbmFsaXR5X3NwZWNpZmllZF87IH0KKworICAvLyBTZXRzIHRoZSBjYXJkaW5hbGl0eSBvZiB0aGlzIGV4cGVjdGF0aW9uIHNwZWMuCisgIHZvaWQgc2V0X2NhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5JiBhX2NhcmRpbmFsaXR5KSB7CisgICAgY2FyZGluYWxpdHlfID0gYV9jYXJkaW5hbGl0eTsKKyAgfQorCisgIC8vIFRoZSBmb2xsb3dpbmcgZ3JvdXAgb2YgbWV0aG9kcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlCisgIC8vIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50LCBhbmQgb25seSB3aGVuIGdfZ21vY2tfbXV0ZXggaXMgaGVsZCBieQorICAvLyB0aGUgY3VycmVudCB0aHJlYWQuCisKKyAgLy8gUmV0aXJlcyBhbGwgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbi4KKyAgdm9pZCBSZXRpcmVBbGxQcmVSZXF1aXNpdGVzKCkKKyAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaXMgcmV0aXJlZC4KKyAgYm9vbCBpc19yZXRpcmVkKCkgY29uc3QKKyAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7CisgICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7CisgICAgcmV0dXJuIHJldGlyZWRfOworICB9CisKKyAgLy8gUmV0aXJlcyB0aGlzIGV4cGVjdGF0aW9uLgorICB2b2lkIFJldGlyZSgpCisgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgeworICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOworICAgIHJldGlyZWRfID0gdHJ1ZTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBpcyBzYXRpc2ZpZWQuCisgIGJvb2wgSXNTYXRpc2ZpZWQoKSBjb25zdAorICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKyAgICByZXR1cm4gY2FyZGluYWxpdHkoKS5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KGNhbGxfY291bnRfKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBpcyBzYXR1cmF0ZWQuCisgIGJvb2wgSXNTYXR1cmF0ZWQoKSBjb25zdAorICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKyAgICByZXR1cm4gY2FyZGluYWxpdHkoKS5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGNhbGxfY291bnRfKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBpcyBvdmVyLXNhdHVyYXRlZC4KKyAgYm9vbCBJc092ZXJTYXR1cmF0ZWQoKSBjb25zdAorICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKyAgICByZXR1cm4gY2FyZGluYWxpdHkoKS5Jc092ZXJTYXR1cmF0ZWRCeUNhbGxDb3VudChjYWxsX2NvdW50Xyk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIGFsbCBwcmUtcmVxdWlzaXRlcyBvZiB0aGlzIGV4cGVjdGF0aW9uIGFyZSBzYXRpc2ZpZWQuCisgIGJvb2wgQWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZCgpIGNvbnN0CisgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7CisKKyAgLy8gQWRkcyB1bnNhdGlzZmllZCBwcmUtcmVxdWlzaXRlcyBvZiB0aGlzIGV4cGVjdGF0aW9uIHRvICdyZXN1bHQnLgorICB2b2lkIEZpbmRVbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMoRXhwZWN0YXRpb25TZXQqIHJlc3VsdCkgY29uc3QKKyAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KTsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgdGhpcyBleHBlY3RhdGlvbiBoYXMgYmVlbiBpbnZva2VkLgorICBpbnQgY2FsbF9jb3VudCgpIGNvbnN0CisgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgeworICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOworICAgIHJldHVybiBjYWxsX2NvdW50XzsKKyAgfQorCisgIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciB0aGlzIGV4cGVjdGF0aW9uIGhhcyBiZWVuIGludm9rZWQuCisgIHZvaWQgSW5jcmVtZW50Q2FsbENvdW50KCkKKyAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7CisgICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7CisgICAgY2FsbF9jb3VudF8rKzsKKyAgfQorCisgIC8vIENoZWNrcyB0aGUgYWN0aW9uIGNvdW50IChpLmUuIHRoZSBudW1iZXIgb2YgV2lsbE9uY2UoKSBhbmQKKyAgLy8gV2lsbFJlcGVhdGVkbHkoKSBjbGF1c2VzKSBhZ2FpbnN0IHRoZSBjYXJkaW5hbGl0eSBpZiB0aGlzIGhhc24ndAorICAvLyBiZWVuIGRvbmUgYmVmb3JlLiAgUHJpbnRzIGEgd2FybmluZyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgb3IgdG9vCisgIC8vIGZldyBhY3Rpb25zLgorICB2b2lkIENoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKSBjb25zdAorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjpTZXF1ZW5jZTsKKyAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4cGVjdGF0aW9uVGVzdGVyOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgZnJpZW5kIGNsYXNzIFR5cGVkRXhwZWN0YXRpb247CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgLlRpbWVzKCkgY2xhdXNlLgorICB2b2lkIFVudHlwZWRUaW1lcyhjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSk7CisKKyAgLy8gVGhpcyBncm91cCBvZiBmaWVsZHMgYXJlIHBhcnQgb2YgdGhlIHNwZWMgYW5kIHdvbid0IGNoYW5nZSBhZnRlcgorICAvLyBhbiBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCBmaW5pc2hlcy4KKyAgY29uc3QgY2hhciogZmlsZV87ICAgICAgICAgIC8vIFRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGV4cGVjdGF0aW9uLgorICBpbnQgbGluZV87ICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleHBlY3RhdGlvbi4KKyAgY29uc3Qgc3RyaW5nIHNvdXJjZV90ZXh0XzsgIC8vIFRoZSBFWFBFQ1RfQ0FMTCguLi4pIHNvdXJjZSB0ZXh0LgorICAvLyBUcnVlIGlmZiB0aGUgY2FyZGluYWxpdHkgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisgIGJvb2wgY2FyZGluYWxpdHlfc3BlY2lmaWVkXzsKKyAgQ2FyZGluYWxpdHkgY2FyZGluYWxpdHlfOyAgICAgICAgICAgIC8vIFRoZSBjYXJkaW5hbGl0eSBvZiB0aGUgZXhwZWN0YXRpb24uCisgIC8vIFRoZSBpbW1lZGlhdGUgcHJlLXJlcXVpc2l0ZXMgKGkuZS4gZXhwZWN0YXRpb25zIHRoYXQgbXVzdCBiZQorICAvLyBzYXRpc2ZpZWQgYmVmb3JlIHRoaXMgZXhwZWN0YXRpb24gY2FuIGJlIG1hdGNoZWQpIG9mIHRoaXMKKyAgLy8gZXhwZWN0YXRpb24uICBXZSB1c2UgbGlua2VkX3B0ciBpbiB0aGUgc2V0IGJlY2F1c2Ugd2Ugd2FudCBhbgorICAvLyBFeHBlY3RhdGlvbiBvYmplY3QgdG8gYmUgY28tb3duZWQgYnkgaXRzIEZ1bmN0aW9uTW9ja2VyIGFuZCBpdHMKKyAgLy8gc3VjY2Vzc29ycy4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIG1vY2sgb2JqZWN0cyB0byBiZSBkZWxldGVkIGF0CisgIC8vIGRpZmZlcmVudCB0aW1lcy4KKyAgRXhwZWN0YXRpb25TZXQgaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfOworCisgIC8vIFRoaXMgZ3JvdXAgb2YgZmllbGRzIGFyZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZXhwZWN0YXRpb24sCisgIC8vIGFuZCBjYW4gY2hhbmdlIGFzIHRoZSBtb2NrIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAgaW50IGNhbGxfY291bnRfOyAgLy8gSG93IG1hbnkgdGltZXMgdGhpcyBleHBlY3RhdGlvbiBoYXMgYmVlbiBpbnZva2VkLgorICBib29sIHJldGlyZWRfOyAgICAvLyBUcnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGhhcyByZXRpcmVkLgorICBVbnR5cGVkQWN0aW9ucyB1bnR5cGVkX2FjdGlvbnNfOworICBib29sIGV4dHJhX21hdGNoZXJfc3BlY2lmaWVkXzsKKyAgYm9vbCByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXzsgIC8vIFRydWUgaWYgYSBXaWxsUmVwZWF0ZWRseSgpIHdhcyBzcGVjaWZpZWQuCisgIGJvb2wgcmV0aXJlc19vbl9zYXR1cmF0aW9uXzsKKyAgQ2xhdXNlIGxhc3RfY2xhdXNlXzsKKyAgbXV0YWJsZSBib29sIGFjdGlvbl9jb3VudF9jaGVja2VkXzsgIC8vIFVuZGVyIG11dGV4Xy4KKyAgbXV0YWJsZSBNdXRleCBtdXRleF87ICAvLyBQcm90ZWN0cyBhY3Rpb25fY291bnRfY2hlY2tlZF8uCisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFeHBlY3RhdGlvbkJhc2UpOworfTsgIC8vIGNsYXNzIEV4cGVjdGF0aW9uQmFzZQorCisvLyBJbXBlbWVudHMgYW4gZXhwZWN0YXRpb24gZm9yIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIEY+CitjbGFzcyBUeXBlZEV4cGVjdGF0aW9uIDogcHVibGljIEV4cGVjdGF0aW9uQmFzZSB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50TWF0Y2hlclR1cGxlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OworCisgIFR5cGVkRXhwZWN0YXRpb24oRnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBvd25lciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX2ZpbGUsIGludCBhX2xpbmUsIGNvbnN0IHN0cmluZyYgYV9zb3VyY2VfdGV4dCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbSkKKyAgICAgIDogRXhwZWN0YXRpb25CYXNlKGFfZmlsZSwgYV9saW5lLCBhX3NvdXJjZV90ZXh0KSwKKyAgICAgICAgb3duZXJfKG93bmVyKSwKKyAgICAgICAgbWF0Y2hlcnNfKG0pLAorICAgICAgICAvLyBCeSBkZWZhdWx0LCBleHRyYV9tYXRjaGVyXyBzaG91bGQgbWF0Y2ggYW55dGhpbmcuICBIb3dldmVyLAorICAgICAgICAvLyB3ZSBjYW5ub3QgaW5pdGlhbGl6ZSBpdCB3aXRoIF8gYXMgdGhhdCB0cmlnZ2VycyBhIGNvbXBpbGVyCisgICAgICAgIC8vIGJ1ZyBpbiBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIChjYW5ub3QgZGVjaWRlIGJldHdlZW4gdHdvCisgICAgICAgIC8vIG92ZXJsb2FkZWQgY29uc3RydWN0b3JzIG9mIE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+KS4KKyAgICAgICAgZXh0cmFfbWF0Y2hlcl8oQTxjb25zdCBBcmd1bWVudFR1cGxlJj4oKSksCisgICAgICAgIHJlcGVhdGVkX2FjdGlvbl8oRG9EZWZhdWx0KCkpIHt9CisKKyAgdmlydHVhbCB+VHlwZWRFeHBlY3RhdGlvbigpIHsKKyAgICAvLyBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGFjdGlvbiBjb3VudCBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lCisgICAgLy8geWV0IChmb3IgZXhhbXBsZSwgaWYgdGhlIGV4cGVjdGF0aW9uIHdhcyBuZXZlciB1c2VkKS4KKyAgICBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCk7CisgICAgZm9yIChVbnR5cGVkQWN0aW9uczo6Y29uc3RfaXRlcmF0b3IgaXQgPSB1bnR5cGVkX2FjdGlvbnNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB1bnR5cGVkX2FjdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgQWN0aW9uPEY+Kj4oKml0KTsKKyAgICB9CisgIH0KKworICAvLyBJbXBsZW1lbnRzIHRoZSAuV2l0aCgpIGNsYXVzZS4KKyAgVHlwZWRFeHBlY3RhdGlvbiYgV2l0aChjb25zdCBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPiYgbSkgeworICAgIGlmIChsYXN0X2NsYXVzZV8gPT0ga1dpdGgpIHsKKyAgICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiLldpdGgoKSBjYW5ub3QgYXBwZWFyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UgaW4gYW4gRVhQRUNUX0NBTEwoKS4iKTsKKyAgICB9IGVsc2UgeworICAgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtXaXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICIuV2l0aCgpIG11c3QgYmUgdGhlIGZpcnN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhdXNlIGluIGFuIEVYUEVDVF9DQUxMKCkuIik7CisgICAgfQorICAgIGxhc3RfY2xhdXNlXyA9IGtXaXRoOworCisgICAgZXh0cmFfbWF0Y2hlcl8gPSBtOworICAgIGV4dHJhX21hdGNoZXJfc3BlY2lmaWVkXyA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgLlRpbWVzKCkgY2xhdXNlLgorICBUeXBlZEV4cGVjdGF0aW9uJiBUaW1lcyhjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSkgeworICAgIEV4cGVjdGF0aW9uQmFzZTo6VW50eXBlZFRpbWVzKGFfY2FyZGluYWxpdHkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEltcGxlbWVudHMgdGhlIC5UaW1lcygpIGNsYXVzZS4KKyAgVHlwZWRFeHBlY3RhdGlvbiYgVGltZXMoaW50IG4pIHsKKyAgICByZXR1cm4gVGltZXMoRXhhY3RseShuKSk7CisgIH0KKworICAvLyBJbXBsZW1lbnRzIHRoZSAuSW5TZXF1ZW5jZSgpIGNsYXVzZS4KKyAgVHlwZWRFeHBlY3RhdGlvbiYgSW5TZXF1ZW5jZShjb25zdCBTZXF1ZW5jZSYgcykgeworICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPD0ga0luU2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICIuSW5TZXF1ZW5jZSgpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgLkFmdGVyKCksIgorICAgICAgICAgICAgICAgICAgICAgICAiIC5XaWxsT25jZSgpLCAuV2lsbFJlcGVhdGVkbHkoKSwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAiLlJldGlyZXNPblNhdHVyYXRpb24oKS4iKTsKKyAgICBsYXN0X2NsYXVzZV8gPSBrSW5TZXF1ZW5jZTsKKworICAgIHMuQWRkRXhwZWN0YXRpb24oR2V0SGFuZGxlKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBUeXBlZEV4cGVjdGF0aW9uJiBJblNlcXVlbmNlKGNvbnN0IFNlcXVlbmNlJiBzMSwgY29uc3QgU2VxdWVuY2UmIHMyKSB7CisgICAgcmV0dXJuIEluU2VxdWVuY2UoczEpLkluU2VxdWVuY2UoczIpOworICB9CisgIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMxLCBjb25zdCBTZXF1ZW5jZSYgczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UmIHMzKSB7CisgICAgcmV0dXJuIEluU2VxdWVuY2UoczEsIHMyKS5JblNlcXVlbmNlKHMzKTsKKyAgfQorICBUeXBlZEV4cGVjdGF0aW9uJiBJblNlcXVlbmNlKGNvbnN0IFNlcXVlbmNlJiBzMSwgY29uc3QgU2VxdWVuY2UmIHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcXVlbmNlJiBzMywgY29uc3QgU2VxdWVuY2UmIHM0KSB7CisgICAgcmV0dXJuIEluU2VxdWVuY2UoczEsIHMyLCBzMykuSW5TZXF1ZW5jZShzNCk7CisgIH0KKyAgVHlwZWRFeHBlY3RhdGlvbiYgSW5TZXF1ZW5jZShjb25zdCBTZXF1ZW5jZSYgczEsIGNvbnN0IFNlcXVlbmNlJiBzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSYgczMsIGNvbnN0IFNlcXVlbmNlJiBzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSYgczUpIHsKKyAgICByZXR1cm4gSW5TZXF1ZW5jZShzMSwgczIsIHMzLCBzNCkuSW5TZXF1ZW5jZShzNSk7CisgIH0KKworICAvLyBJbXBsZW1lbnRzIHRoYXQgLkFmdGVyKCkgY2xhdXNlLgorICBUeXBlZEV4cGVjdGF0aW9uJiBBZnRlcihjb25zdCBFeHBlY3RhdGlvblNldCYgcykgeworICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPD0ga0FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAiLkFmdGVyKCkgY2Fubm90IGFwcGVhciBhZnRlciAuV2lsbE9uY2UoKSwiCisgICAgICAgICAgICAgICAgICAgICAgICIgLldpbGxSZXBlYXRlZGx5KCksIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgIi5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7CisgICAgbGFzdF9jbGF1c2VfID0ga0FmdGVyOworCisgICAgZm9yIChFeHBlY3RhdGlvblNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzLmJlZ2luKCk7IGl0ICE9IHMuZW5kKCk7ICsraXQpIHsKKyAgICAgIGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXyArPSAqaXQ7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorICBUeXBlZEV4cGVjdGF0aW9uJiBBZnRlcihjb25zdCBFeHBlY3RhdGlvblNldCYgczEsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMikgeworICAgIHJldHVybiBBZnRlcihzMSkuQWZ0ZXIoczIpOworICB9CisgIFR5cGVkRXhwZWN0YXRpb24mIEFmdGVyKGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMSwgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczMpIHsKKyAgICByZXR1cm4gQWZ0ZXIoczEsIHMyKS5BZnRlcihzMyk7CisgIH0KKyAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMywgY29uc3QgRXhwZWN0YXRpb25TZXQmIHM0KSB7CisgICAgcmV0dXJuIEFmdGVyKHMxLCBzMiwgczMpLkFmdGVyKHM0KTsKKyAgfQorICBUeXBlZEV4cGVjdGF0aW9uJiBBZnRlcihjb25zdCBFeHBlY3RhdGlvblNldCYgczEsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMzLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzNSkgeworICAgIHJldHVybiBBZnRlcihzMSwgczIsIHMzLCBzNCkuQWZ0ZXIoczUpOworICB9CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgLldpbGxPbmNlKCkgY2xhdXNlLgorICBUeXBlZEV4cGVjdGF0aW9uJiBXaWxsT25jZShjb25zdCBBY3Rpb248Rj4mIGFjdGlvbikgeworICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPD0ga1dpbGxPbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAiLldpbGxPbmNlKCkgY2Fubm90IGFwcGVhciBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICIuV2lsbFJlcGVhdGVkbHkoKSBvciAuUmV0aXJlc09uU2F0dXJhdGlvbigpLiIpOworICAgIGxhc3RfY2xhdXNlXyA9IGtXaWxsT25jZTsKKworICAgIHVudHlwZWRfYWN0aW9uc18ucHVzaF9iYWNrKG5ldyBBY3Rpb248Rj4oYWN0aW9uKSk7CisgICAgaWYgKCFjYXJkaW5hbGl0eV9zcGVjaWZpZWQoKSkgeworICAgICAgc2V0X2NhcmRpbmFsaXR5KEV4YWN0bHkoc3RhdGljX2Nhc3Q8aW50Pih1bnR5cGVkX2FjdGlvbnNfLnNpemUoKSkpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgLldpbGxSZXBlYXRlZGx5KCkgY2xhdXNlLgorICBUeXBlZEV4cGVjdGF0aW9uJiBXaWxsUmVwZWF0ZWRseShjb25zdCBBY3Rpb248Rj4mIGFjdGlvbikgeworICAgIGlmIChsYXN0X2NsYXVzZV8gPT0ga1dpbGxSZXBlYXRlZGx5KSB7CisgICAgICBFeHBlY3RTcGVjUHJvcGVydHkoZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsUmVwZWF0ZWRseSgpIGNhbm5vdCBhcHBlYXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gb25jZSBpbiBhbiBFWFBFQ1RfQ0FMTCgpLiIpOworICAgIH0gZWxzZSB7CisgICAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1dpbGxSZXBlYXRlZGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICIuV2lsbFJlcGVhdGVkbHkoKSBjYW5ub3QgYXBwZWFyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgLlJldGlyZXNPblNhdHVyYXRpb24oKS4iKTsKKyAgICB9CisgICAgbGFzdF9jbGF1c2VfID0ga1dpbGxSZXBlYXRlZGx5OworICAgIHJlcGVhdGVkX2FjdGlvbl9zcGVjaWZpZWRfID0gdHJ1ZTsKKworICAgIHJlcGVhdGVkX2FjdGlvbl8gPSBhY3Rpb247CisgICAgaWYgKCFjYXJkaW5hbGl0eV9zcGVjaWZpZWQoKSkgeworICAgICAgc2V0X2NhcmRpbmFsaXR5KEF0TGVhc3Qoc3RhdGljX2Nhc3Q8aW50Pih1bnR5cGVkX2FjdGlvbnNfLnNpemUoKSkpKTsKKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCBubyBtb3JlIGFjdGlvbiBjbGF1c2VzIGNhbiBiZSBzcGVjaWZpZWQsIHdlIGNoZWNrCisgICAgLy8gd2hldGhlciB0aGVpciBjb3VudCBtYWtlcyBzZW5zZS4KKyAgICBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW1wbGVtZW50cyB0aGUgLlJldGlyZXNPblNhdHVyYXRpb24oKSBjbGF1c2UuCisgIFR5cGVkRXhwZWN0YXRpb24mIFJldGlyZXNPblNhdHVyYXRpb24oKSB7CisgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtSZXRpcmVzT25TYXR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAiLlJldGlyZXNPblNhdHVyYXRpb24oKSBjYW5ub3QgYXBwZWFyICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlLiIpOworICAgIGxhc3RfY2xhdXNlXyA9IGtSZXRpcmVzT25TYXR1cmF0aW9uOworICAgIHJldGlyZXNfb25fc2F0dXJhdGlvbl8gPSB0cnVlOworCisgICAgLy8gTm93IHRoYXQgbm8gbW9yZSBhY3Rpb24gY2xhdXNlcyBjYW4gYmUgc3BlY2lmaWVkLCB3ZSBjaGVjaworICAgIC8vIHdoZXRoZXIgdGhlaXIgY291bnQgbWFrZXMgc2Vuc2UuCisgICAgQ2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIG1hdGNoZXJzIGZvciB0aGUgYXJndW1lbnRzIGFzIHNwZWNpZmllZCBpbnNpZGUgdGhlCisgIC8vIEVYUEVDVF9DQUxMKCkgbWFjcm8uCisgIGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtYXRjaGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF0Y2hlcnNfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgbWF0Y2hlciBzcGVjaWZpZWQgYnkgdGhlIC5XaXRoKCkgY2xhdXNlLgorICBjb25zdCBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPiYgZXh0cmFfbWF0Y2hlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZXh0cmFfbWF0Y2hlcl87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBhY3Rpb24gc3BlY2lmaWVkIGJ5IHRoZSAuV2lsbFJlcGVhdGVkbHkoKSBjbGF1c2UuCisgIGNvbnN0IEFjdGlvbjxGPiYgcmVwZWF0ZWRfYWN0aW9uKCkgY29uc3QgeyByZXR1cm4gcmVwZWF0ZWRfYWN0aW9uXzsgfQorCisgIC8vIElmIHRoaXMgbW9jayBtZXRob2QgaGFzIGFuIGV4dHJhIG1hdGNoZXIgKGkuZS4gLldpdGgobWF0Y2hlcikpLAorICAvLyBkZXNjcmliZXMgaXQgdG8gdGhlIG9zdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBNYXliZURlc2NyaWJlRXh0cmFNYXRjaGVyVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgaWYgKGV4dHJhX21hdGNoZXJfc3BlY2lmaWVkXykgeworICAgICAgKm9zIDw8ICIgICAgRXhwZWN0ZWQgYXJnczogIjsKKyAgICAgIGV4dHJhX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOworICAgICAgKm9zIDw8ICJcbiI7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgIGZyaWVuZCBjbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7CisKKyAgLy8gUmV0dXJucyBhbiBFeHBlY3RhdGlvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFuZCBjby1vd25zIHRoaXMKKyAgLy8gZXhwZWN0YXRpb24uCisgIHZpcnR1YWwgRXhwZWN0YXRpb24gR2V0SGFuZGxlKCkgeworICAgIHJldHVybiBvd25lcl8tPkdldEhhbmRsZU9mKHRoaXMpOworICB9CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIHdpbGwgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgdGhlIEVYUEVDVF9DQUxMKCkKKyAgLy8gc3RhdGVtZW50IGZpbmlzaGVzIGFuZCB3aGVuIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcworICAvLyBnX2dtb2NrX211dGV4LgorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBtYXRjaGVzIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgIGJvb2wgTWF0Y2hlcyhjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdAorICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKyAgICByZXR1cm4gVHVwbGVNYXRjaGVzKG1hdGNoZXJzXywgYXJncykgJiYgZXh0cmFfbWF0Y2hlcl8uTWF0Y2hlcyhhcmdzKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBzaG91bGQgaGFuZGxlIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgIGJvb2wgU2hvdWxkSGFuZGxlQXJndW1lbnRzKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0CisgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgeworICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOworCisgICAgLy8gSW4gY2FzZSB0aGUgYWN0aW9uIGNvdW50IHdhc24ndCBjaGVja2VkIHdoZW4gdGhlIGV4cGVjdGF0aW9uCisgICAgLy8gd2FzIGRlZmluZWQgKGUuZy4gaWYgdGhpcyBleHBlY3RhdGlvbiBoYXMgbm8gV2lsbFJlcGVhdGVkbHkoKQorICAgIC8vIG9yIFJldGlyZXNPblNhdHVyYXRpb24oKSBjbGF1c2UpLCB3ZSBjaGVjayBpdCB3aGVuIHRoZQorICAgIC8vIGV4cGVjdGF0aW9uIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgIENoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKTsKKyAgICByZXR1cm4gIWlzX3JldGlyZWQoKSAmJiBBbGxQcmVyZXF1aXNpdGVzQXJlU2F0aXNmaWVkKCkgJiYgTWF0Y2hlcyhhcmdzKTsKKyAgfQorCisgIC8vIERlc2NyaWJlcyB0aGUgcmVzdWx0IG9mIG1hdGNoaW5nIHRoZSBhcmd1bWVudHMgYWdhaW5zdCB0aGlzCisgIC8vIGV4cGVjdGF0aW9uIHRvIHRoZSBnaXZlbiBvc3RyZWFtLgorICB2b2lkIEV4cGxhaW5NYXRjaFJlc3VsdFRvKAorICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywKKyAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QKKyAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgeworICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOworCisgICAgaWYgKGlzX3JldGlyZWQoKSkgeworICAgICAgKm9zIDw8ICIgICAgICAgICBFeHBlY3RlZDogdGhlIGV4cGVjdGF0aW9uIGlzIGFjdGl2ZVxuIgorICAgICAgICAgIDw8ICIgICAgICAgICAgIEFjdHVhbDogaXQgaXMgcmV0aXJlZFxuIjsKKyAgICB9IGVsc2UgaWYgKCFNYXRjaGVzKGFyZ3MpKSB7CisgICAgICBpZiAoIVR1cGxlTWF0Y2hlcyhtYXRjaGVyc18sIGFyZ3MpKSB7CisgICAgICAgIEV4cGxhaW5NYXRjaEZhaWx1cmVUdXBsZVRvKG1hdGNoZXJzXywgYXJncywgb3MpOworICAgICAgfQorICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsKKyAgICAgIGlmICghZXh0cmFfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKGFyZ3MsICZsaXN0ZW5lcikpIHsKKyAgICAgICAgKm9zIDw8ICIgICAgRXhwZWN0ZWQgYXJnczogIjsKKyAgICAgICAgZXh0cmFfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7CisgICAgICAgICpvcyA8PCAiXG4gICAgICAgICAgIEFjdHVhbDogZG9uJ3QgbWF0Y2giOworCisgICAgICAgIGludGVybmFsOjpQcmludElmTm90RW1wdHkobGlzdGVuZXIuc3RyKCksIG9zKTsKKyAgICAgICAgKm9zIDw8ICJcbiI7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghQWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZCgpKSB7CisgICAgICAqb3MgPDwgIiAgICAgICAgIEV4cGVjdGVkOiBhbGwgcHJlLXJlcXVpc2l0ZXMgYXJlIHNhdGlzZmllZFxuIgorICAgICAgICAgIDw8ICIgICAgICAgICAgIEFjdHVhbDogdGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcHJlLXJlcXVpc2l0ZXMgIgorICAgICAgICAgIDw8ICJhcmUgbm90IHNhdGlzZmllZDpcbiI7CisgICAgICBFeHBlY3RhdGlvblNldCB1bnNhdGlzZmllZF9wcmVyZXFzOworICAgICAgRmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcygmdW5zYXRpc2ZpZWRfcHJlcmVxcyk7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBmb3IgKEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IHVuc2F0aXNmaWVkX3ByZXJlcXMuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gdW5zYXRpc2ZpZWRfcHJlcmVxcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5EZXNjcmliZUxvY2F0aW9uVG8ob3MpOworICAgICAgICAqb3MgPDwgInByZS1yZXF1aXNpdGUgIyIgPDwgaSsrIDw8ICJcbiI7CisgICAgICB9CisgICAgICAqb3MgPDwgIiAgICAgICAgICAgICAgICAgICAoZW5kIG9mIHByZS1yZXF1aXNpdGVzKVxuIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhpcyBsaW5lIGlzIGhlcmUganVzdCBmb3IgY29tcGxldGVuZXNzJyBzYWtlLiAgSXQgd2lsbCBuZXZlcgorICAgICAgLy8gYmUgZXhlY3V0ZWQgYXMgY3VycmVudGx5IHRoZSBFeHBsYWluTWF0Y2hSZXN1bHRUbygpIGZ1bmN0aW9uCisgICAgICAvLyBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBtb2NrIGZ1bmN0aW9uIGNhbGwgZG9lcyBOT1QgbWF0Y2ggdGhlCisgICAgICAvLyBleHBlY3RhdGlvbi4KKyAgICAgICpvcyA8PCAiVGhlIGNhbGwgbWF0Y2hlcyB0aGUgZXhwZWN0YXRpb24uXG4iOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSB0YWtlbiBmb3IgdGhlIGN1cnJlbnQgaW52b2NhdGlvbi4KKyAgY29uc3QgQWN0aW9uPEY+JiBHZXRDdXJyZW50QWN0aW9uKAorICAgICAgY29uc3QgRnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBtb2NrZXIsCisgICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdAorICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7CisgICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7CisgICAgY29uc3QgaW50IGNvdW50ID0gY2FsbF9jb3VudCgpOworICAgIEFzc2VydChjb3VudCA+PSAxLCBfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgICAgICJjYWxsX2NvdW50KCkgaXMgPD0gMCB3aGVuIEdldEN1cnJlbnRBY3Rpb24oKSBpcyAiCisgICAgICAgICAgICJjYWxsZWQgLSB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIik7CisKKyAgICBjb25zdCBpbnQgYWN0aW9uX2NvdW50ID0gc3RhdGljX2Nhc3Q8aW50Pih1bnR5cGVkX2FjdGlvbnNfLnNpemUoKSk7CisgICAgaWYgKGFjdGlvbl9jb3VudCA+IDAgJiYgIXJlcGVhdGVkX2FjdGlvbl9zcGVjaWZpZWRfICYmCisgICAgICAgIGNvdW50ID4gYWN0aW9uX2NvdW50KSB7CisgICAgICAvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgV2lsbE9uY2UoKSBhbmQgbm8gV2lsbFJlcGVhdGVkbHkoKSwKKyAgICAgIC8vIHdlIHdhcm4gdGhlIHVzZXIgd2hlbiB0aGUgV2lsbE9uY2UoKSBjbGF1c2VzIHJhbiBvdXQuCisgICAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgRGVzY3JpYmVMb2NhdGlvblRvKCZzcyk7CisgICAgICBzcyA8PCAiQWN0aW9ucyByYW4gb3V0IGluICIgPDwgc291cmNlX3RleHQoKSA8PCAiLi4uXG4iCisgICAgICAgICA8PCAiQ2FsbGVkICIgPDwgY291bnQgPDwgIiB0aW1lcywgYnV0IG9ubHkgIgorICAgICAgICAgPDwgYWN0aW9uX2NvdW50IDw8ICIgV2lsbE9uY2UoKSIKKyAgICAgICAgIDw8IChhY3Rpb25fY291bnQgPT0gMSA/ICIgaXMiIDogInMgYXJlIikgPDwgIiBzcGVjaWZpZWQgLSAiOworICAgICAgbW9ja2VyLT5EZXNjcmliZURlZmF1bHRBY3Rpb25UbyhhcmdzLCAmc3MpOworICAgICAgTG9nKGtXYXJuaW5nLCBzcy5zdHIoKSwgMSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50IDw9IGFjdGlvbl9jb3VudCA/CisgICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBY3Rpb248Rj4qPih1bnR5cGVkX2FjdGlvbnNfW2NvdW50IC0gMV0pIDoKKyAgICAgICAgcmVwZWF0ZWRfYWN0aW9uKCk7CisgIH0KKworICAvLyBHaXZlbiB0aGUgYXJndW1lbnRzIG9mIGEgbW9jayBmdW5jdGlvbiBjYWxsLCBpZiB0aGUgY2FsbCB3aWxsCisgIC8vIG92ZXItc2F0dXJhdGUgdGhpcyBleHBlY3RhdGlvbiwgcmV0dXJucyB0aGUgZGVmYXVsdCBhY3Rpb247CisgIC8vIG90aGVyd2lzZSwgcmV0dXJucyB0aGUgbmV4dCBhY3Rpb24gaW4gdGhpcyBleHBlY3RhdGlvbi4gIEFsc28KKyAgLy8gZGVzY3JpYmVzICp3aGF0KiBoYXBwZW5lZCB0byAnd2hhdCcsIGFuZCBleHBsYWlucyAqd2h5KiBHb29nbGUKKyAgLy8gTW9jayBkb2VzIGl0IHRvICd3aHknLiAgVGhpcyBtZXRob2QgaXMgbm90IGNvbnN0IGFzIGl0IGNhbGxzCisgIC8vIEluY3JlbWVudENhbGxDb3VudCgpLiAgQSByZXR1cm4gdmFsdWUgb2YgTlVMTCBtZWFucyB0aGUgZGVmYXVsdAorICAvLyBhY3Rpb24uCisgIGNvbnN0IEFjdGlvbjxGPiogR2V0QWN0aW9uRm9yQXJndW1lbnRzKAorICAgICAgY29uc3QgRnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBtb2NrZXIsCisgICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAorICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoYXQsCisgICAgICA6OnN0ZDo6b3N0cmVhbSogd2h5KQorICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7CisgICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7CisgICAgaWYgKElzU2F0dXJhdGVkKCkpIHsKKyAgICAgIC8vIFdlIGhhdmUgYW4gZXhjZXNzaXZlIGNhbGwuCisgICAgICBJbmNyZW1lbnRDYWxsQ291bnQoKTsKKyAgICAgICp3aGF0IDw8ICJNb2NrIGZ1bmN0aW9uIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gZXhwZWN0ZWQgLSAiOworICAgICAgbW9ja2VyLT5EZXNjcmliZURlZmF1bHRBY3Rpb25UbyhhcmdzLCB3aGF0KTsKKyAgICAgIERlc2NyaWJlQ2FsbENvdW50VG8od2h5KTsKKworICAgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGFsbG93IHRoZSB1c2VyIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAgLy8gdW5leHBlY3RlZCBjYWxscyBzaG91bGQgZmFpbCBpbW1lZGlhdGVseSBvciBjb250aW51ZSB1c2luZyBhCisgICAgICAvLyBmbGFnIC0tZ21vY2tfdW5leHBlY3RlZF9jYWxsc19hcmVfZmF0YWwuCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBJbmNyZW1lbnRDYWxsQ291bnQoKTsKKyAgICBSZXRpcmVBbGxQcmVSZXF1aXNpdGVzKCk7CisKKyAgICBpZiAocmV0aXJlc19vbl9zYXR1cmF0aW9uXyAmJiBJc1NhdHVyYXRlZCgpKSB7CisgICAgICBSZXRpcmUoKTsKKyAgICB9CisKKyAgICAvLyBNdXN0IGJlIGRvbmUgYWZ0ZXIgSW5jcmVtZW50Q291bnQoKSEKKyAgICAqd2hhdCA8PCAiTW9jayBmdW5jdGlvbiBjYWxsIG1hdGNoZXMgIiA8PCBzb3VyY2VfdGV4dCgpIDw8Ii4uLlxuIjsKKyAgICByZXR1cm4gJihHZXRDdXJyZW50QWN0aW9uKG1vY2tlciwgYXJncykpOworICB9CisKKyAgLy8gQWxsIHRoZSBmaWVsZHMgYmVsb3cgd29uJ3QgY2hhbmdlIG9uY2UgdGhlIEVYUEVDVF9DQUxMKCkKKyAgLy8gc3RhdGVtZW50IGZpbmlzaGVzLgorICBGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIGNvbnN0IG93bmVyXzsKKyAgQXJndW1lbnRNYXRjaGVyVHVwbGUgbWF0Y2hlcnNfOworICBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPiBleHRyYV9tYXRjaGVyXzsKKyAgQWN0aW9uPEY+IHJlcGVhdGVkX2FjdGlvbl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUeXBlZEV4cGVjdGF0aW9uKTsKK307ICAvLyBjbGFzcyBUeXBlZEV4cGVjdGF0aW9uCisKKy8vIEEgTW9ja1NwZWMgb2JqZWN0IGlzIHVzZWQgYnkgT05fQ0FMTCgpIG9yIEVYUEVDVF9DQUxMKCkgZm9yCisvLyBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mLCBvciBleHBlY3RhdGlvbiBvbiwgYSBtb2NrCisvLyBmdW5jdGlvbi4KKworLy8gTm90ZTogY2xhc3MgTW9ja1NwZWMgcmVhbGx5IGJlbG9uZ3MgdG8gdGhlIDo6dGVzdGluZyBuYW1lc3BhY2UuCisvLyBIb3dldmVyIGlmIHdlIGRlZmluZSBpdCBpbiA6OnRlc3RpbmcsIE1TVkMgd2lsbCBjb21wbGFpbiB3aGVuCisvLyBjbGFzc2VzIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgZGVjbGFyZSBpdCBhcyBhIGZyaWVuZCBjbGFzcworLy8gdGVtcGxhdGUuICBUbyB3b3JrYXJvdW5kIHRoaXMgY29tcGlsZXIgYnVnLCB3ZSBkZWZpbmUgTW9ja1NwZWMgaW4KKy8vIDo6dGVzdGluZzo6aW50ZXJuYWwgYW5kIGltcG9ydCBpdCBpbnRvIDo6dGVzdGluZy4KKworLy8gTG9ncyBhIG1lc3NhZ2UgaW5jbHVkaW5nIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgorR1RFU1RfQVBJXyB2b2lkIExvZ1dpdGhMb2NhdGlvbih0ZXN0aW5nOjppbnRlcm5hbDo6TG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KK2NsYXNzIE1vY2tTcGVjIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudE1hdGNoZXJUdXBsZQorICAgICAgQXJndW1lbnRNYXRjaGVyVHVwbGU7CisKKyAgLy8gQ29uc3RydWN0cyBhIE1vY2tTcGVjIG9iamVjdCwgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG1vY2tlciBvYmplY3QKKyAgLy8gdGhhdCB0aGUgc3BlYyBpcyBhc3NvY2lhdGVkIHdpdGguCisgIGV4cGxpY2l0IE1vY2tTcGVjKGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIGZ1bmN0aW9uX21vY2tlcikKKyAgICAgIDogZnVuY3Rpb25fbW9ja2VyXyhmdW5jdGlvbl9tb2NrZXIpIHt9CisKKyAgLy8gQWRkcyBhIG5ldyBkZWZhdWx0IGFjdGlvbiBzcGVjIHRvIHRoZSBmdW5jdGlvbiBtb2NrZXIgYW5kIHJldHVybnMKKyAgLy8gdGhlIG5ld2x5IGNyZWF0ZWQgc3BlYy4KKyAgaW50ZXJuYWw6Ok9uQ2FsbFNwZWM8Rj4mIEludGVybmFsRGVmYXVsdEFjdGlvblNldEF0KAorICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIG9iaiwgY29uc3QgY2hhciogY2FsbCkgeworICAgIExvZ1dpdGhMb2NhdGlvbihpbnRlcm5hbDo6a0luZm8sIGZpbGUsIGxpbmUsCisgICAgICAgIHN0cmluZygiT05fQ0FMTCgiKSArIG9iaiArICIsICIgKyBjYWxsICsgIikgaW52b2tlZCIpOworICAgIHJldHVybiBmdW5jdGlvbl9tb2NrZXJfLT5BZGROZXdPbkNhbGxTcGVjKGZpbGUsIGxpbmUsIG1hdGNoZXJzXyk7CisgIH0KKworICAvLyBBZGRzIGEgbmV3IGV4cGVjdGF0aW9uIHNwZWMgdG8gdGhlIGZ1bmN0aW9uIG1vY2tlciBhbmQgcmV0dXJucworICAvLyB0aGUgbmV3bHkgY3JlYXRlZCBzcGVjLgorICBpbnRlcm5hbDo6VHlwZWRFeHBlY3RhdGlvbjxGPiYgSW50ZXJuYWxFeHBlY3RlZEF0KAorICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIG9iaiwgY29uc3QgY2hhciogY2FsbCkgeworICAgIGNvbnN0IHN0cmluZyBzb3VyY2VfdGV4dChzdHJpbmcoIkVYUEVDVF9DQUxMKCIpICsgb2JqICsgIiwgIiArIGNhbGwgKyAiKSIpOworICAgIExvZ1dpdGhMb2NhdGlvbihpbnRlcm5hbDo6a0luZm8sIGZpbGUsIGxpbmUsIHNvdXJjZV90ZXh0ICsgIiBpbnZva2VkIik7CisgICAgcmV0dXJuIGZ1bmN0aW9uX21vY2tlcl8tPkFkZE5ld0V4cGVjdGF0aW9uKAorICAgICAgICBmaWxlLCBsaW5lLCBzb3VyY2VfdGV4dCwgbWF0Y2hlcnNfKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgorICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyOworCisgIHZvaWQgU2V0TWF0Y2hlcnMoY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG1hdGNoZXJzKSB7CisgICAgbWF0Y2hlcnNfID0gbWF0Y2hlcnM7CisgIH0KKworICAvLyBUaGUgZnVuY3Rpb24gbW9ja2VyIHRoYXQgb3ducyB0aGlzIHNwZWMuCisgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIGNvbnN0IGZ1bmN0aW9uX21vY2tlcl87CisgIC8vIFRoZSBhcmd1bWVudCBtYXRjaGVycyBzcGVjaWZpZWQgaW4gdGhlIHNwZWMuCisgIEFyZ3VtZW50TWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1vY2tTcGVjKTsKK307ICAvLyBjbGFzcyBNb2NrU3BlYworCisvLyBXcmFwcGVyIHR5cGUgZm9yIGdlbmVyaWNhbGx5IGhvbGRpbmcgYW4gb3JkaW5hcnkgdmFsdWUgb3IgbHZhbHVlIHJlZmVyZW5jZS4KKy8vIElmIFQgaXMgbm90IGEgcmVmZXJlbmNlIHR5cGUsIGl0IG11c3QgYmUgY29weWFibGUgb3IgbW92YWJsZS4KKy8vIFJlZmVyZW5jZU9yVmFsdWVXcmFwcGVyPFQ+IGlzIG1vdmFibGUsIGFuZCB3aWxsIGFsc28gYmUgY29weWFibGUgdW5sZXNzCisvLyBUIGlzIGEgbW92ZS1vbmx5IHZhbHVlIHR5cGUgKHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgY29weWFibGUKKy8vIGlmIHRoZSBjdXJyZW50IHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgbW92ZSBzZW1hbnRpY3MpLgorLy8KKy8vIFRoZSBwcmltYXJ5IHRlbXBsYXRlIGRlZmluZXMgaGFuZGxpbmcgZm9yIHZhbHVlcywgYnV0IGZ1bmN0aW9uIGhlYWRlcgorLy8gY29tbWVudHMgZGVzY3JpYmUgdGhlIGNvbnRyYWN0IGZvciB0aGUgd2hvbGUgdGVtcGxhdGUgKGluY2x1ZGluZworLy8gc3BlY2lhbGl6YXRpb25zKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVmZXJlbmNlT3JWYWx1ZVdyYXBwZXIgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIHdyYXBwZXIgZnJvbSB0aGUgZ2l2ZW4gdmFsdWUvcmVmZXJlbmNlLgorICBleHBsaWNpdCBSZWZlcmVuY2VPclZhbHVlV3JhcHBlcihUIHZhbHVlKQorICAgICAgOiB2YWx1ZV8oOjp0ZXN0aW5nOjppbnRlcm5hbDo6bW92ZSh2YWx1ZSkpIHsKKyAgfQorCisgIC8vIFVud3JhcHMgYW5kIHJldHVybnMgdGhlIHVuZGVybHlpbmcgdmFsdWUvcmVmZXJlbmNlLCBleGFjdGx5IGFzCisgIC8vIG9yaWdpbmFsbHkgcGFzc2VkLiBUaGUgYmVoYXZpb3Igb2YgY2FsbGluZyB0aGlzIG1vcmUgdGhhbiBvbmNlIG9uCisgIC8vIHRoZSBzYW1lIG9iamVjdCBpcyB1bnNwZWNpZmllZC4KKyAgVCBVbndyYXAoKSB7IHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjptb3ZlKHZhbHVlXyk7IH0KKworICAvLyBQcm92aWRlcyBub25kZXN0cnVjdGl2ZSBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUvcmVmZXJlbmNlLgorICAvLyBBbHdheXMgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSAobW9yZSBwcmVjaXNlbHksCisgIC8vIGNvbnN0IFJlbW92ZVJlZmVyZW5jZTxUPiYpLiBUaGUgYmVoYXZpb3Igb2YgY2FsbGluZyB0aGlzIGFmdGVyCisgIC8vIGNhbGxpbmcgVW53cmFwIG9uIHRoZSBzYW1lIG9iamVjdCBpcyB1bnNwZWNpZmllZC4KKyAgY29uc3QgVCYgUGVlaygpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfOworICB9CisKKyBwcml2YXRlOgorICBUIHZhbHVlXzsKK307CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciBsdmFsdWUgcmVmZXJlbmNlIHR5cGVzLiBTZWUgcHJpbWFyeSB0ZW1wbGF0ZQorLy8gZm9yIGRvY3VtZW50YXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJlZmVyZW5jZU9yVmFsdWVXcmFwcGVyPFQmPiB7CisgcHVibGljOgorICAvLyBXb3JrYXJvdW5kIGZvciBkZWJhdGFibGUgcGFzcy1ieS1yZWZlcmVuY2UgbGludCB3YXJuaW5nIChjLWxpYnJhcnktdGVhbQorICAvLyBwb2xpY3kgcHJlY2x1ZGVzIE5PTElOVCBpbiB0aGlzIGNvbnRleHQpCisgIHR5cGVkZWYgVCYgcmVmZXJlbmNlOworICBleHBsaWNpdCBSZWZlcmVuY2VPclZhbHVlV3JhcHBlcihyZWZlcmVuY2UgcmVmKQorICAgICAgOiB2YWx1ZV9wdHJfKCZyZWYpIHt9CisgIFQmIFVud3JhcCgpIHsgcmV0dXJuICp2YWx1ZV9wdHJfOyB9CisgIGNvbnN0IFQmIFBlZWsoKSBjb25zdCB7IHJldHVybiAqdmFsdWVfcHRyXzsgfQorCisgcHJpdmF0ZToKKyAgVCogdmFsdWVfcHRyXzsKK307CisKKy8vIE1TVkMgd2FybnMgYWJvdXQgdXNpbmcgJ3RoaXMnIGluIGJhc2UgbWVtYmVyIGluaXRpYWxpemVyIGxpc3QsIHNvCisvLyB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIHdhcm5pbmcuICBXZSBoYXZlIHRvIGRvIGl0IGZvcgorLy8gdGhlIGVudGlyZSBjbGFzcyB0byBzdXBwcmVzcyB0aGUgd2FybmluZywgZXZlbiB0aG91Z2ggaXQncyBhYm91dAorLy8gdGhlIGNvbnN0cnVjdG9yIG9ubHkuCisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzNTUpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQzNTUuCisjZW5kaWYgIC8vIF9NU1ZfVkVSCisKKy8vIEMrKyB0cmVhdHMgdGhlIHZvaWQgdHlwZSBzcGVjaWFsbHkuICBGb3IgZXhhbXBsZSwgeW91IGNhbm5vdCBkZWZpbmUKKy8vIGEgdm9pZC10eXBlZCB2YXJpYWJsZSBvciBwYXNzIGEgdm9pZCB2YWx1ZSB0byBhIGZ1bmN0aW9uLgorLy8gQWN0aW9uUmVzdWx0SG9sZGVyPFQ+IGhvbGRzIGEgdmFsdWUgb2YgdHlwZSBULCB3aGVyZSBUIG11c3QgYmUgYQorLy8gY29weWFibGUgdHlwZSBvciB2b2lkIChUIGRvZXNuJ3QgbmVlZCB0byBiZSBkZWZhdWx0LWNvbnN0cnVjdGFibGUpLgorLy8gSXQgaGlkZXMgdGhlIHN5bnRhY3RpYyBkaWZmZXJlbmNlIGJldHdlZW4gdm9pZCBhbmQgb3RoZXIgdHlwZXMsIGFuZAorLy8gaXMgdXNlZCB0byB1bmlmeSB0aGUgY29kZSBmb3IgaW52b2tpbmcgYm90aCB2b2lkLXJldHVybmluZyBhbmQKKy8vIG5vbi12b2lkLXJldHVybmluZyBtb2NrIGZ1bmN0aW9ucy4KKworLy8gVW50eXBlZCBiYXNlIGNsYXNzIGZvciBBY3Rpb25SZXN1bHRIb2xkZXI8VD4uCitjbGFzcyBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5VbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSgpIHt9CisKKyAgLy8gUHJpbnRzIHRoZSBoZWxkIHZhbHVlIGFzIGFuIGFjdGlvbidzIHJlc3VsdCB0byBvcy4KKyAgdmlydHVhbCB2b2lkIFByaW50QXNBY3Rpb25SZXN1bHQoOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7Cit9OworCisvLyBUaGlzIGdlbmVyaWMgZGVmaW5pdGlvbiBpcyB1c2VkIHdoZW4gVCBpcyBub3Qgdm9pZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQWN0aW9uUmVzdWx0SG9sZGVyIDogcHVibGljIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlIHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgdGhlIGhlbGQgdmFsdWUuIE11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4KKyAgVCBVbndyYXAoKSB7CisgICAgcmV0dXJuIHJlc3VsdF8uVW53cmFwKCk7CisgIH0KKworICAvLyBQcmludHMgdGhlIGhlbGQgdmFsdWUgYXMgYW4gYWN0aW9uJ3MgcmVzdWx0IHRvIG9zLgorICB2aXJ0dWFsIHZvaWQgUHJpbnRBc0FjdGlvblJlc3VsdCg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgIlxuICAgICAgICAgIFJldHVybnM6ICI7CisgICAgLy8gVCBtYXkgYmUgYSByZWZlcmVuY2UgdHlwZSwgc28gd2UgZG9uJ3QgdXNlIFVuaXZlcnNhbFByaW50KCkuCisgICAgVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQocmVzdWx0Xy5QZWVrKCksIG9zKTsKKyAgfQorCisgIC8vIFBlcmZvcm1zIHRoZSBnaXZlbiBtb2NrIGZ1bmN0aW9uJ3MgZGVmYXVsdCBhY3Rpb24gYW5kIHJldHVybnMgdGhlCisgIC8vIHJlc3VsdCBpbiBhIG5ldy1lZCBBY3Rpb25SZXN1bHRIb2xkZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBzdGF0aWMgQWN0aW9uUmVzdWx0SG9sZGVyKiBQZXJmb3JtRGVmYXVsdEFjdGlvbigKKyAgICAgIGNvbnN0IEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogZnVuY19tb2NrZXIsCisgICAgICBjb25zdCB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSYgYXJncywKKyAgICAgIGNvbnN0IHN0cmluZyYgY2FsbF9kZXNjcmlwdGlvbikgeworICAgIHJldHVybiBuZXcgQWN0aW9uUmVzdWx0SG9sZGVyKFdyYXBwZXIoCisgICAgICAgIGZ1bmNfbW9ja2VyLT5QZXJmb3JtRGVmYXVsdEFjdGlvbihhcmdzLCBjYWxsX2Rlc2NyaXB0aW9uKSkpOworICB9CisKKyAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIGFjdGlvbiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIGEgbmV3LWVkCisgIC8vIEFjdGlvblJlc3VsdEhvbGRlci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+CisgIHN0YXRpYyBBY3Rpb25SZXN1bHRIb2xkZXIqCisgIFBlcmZvcm1BY3Rpb24oY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24sCisgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICByZXR1cm4gbmV3IEFjdGlvblJlc3VsdEhvbGRlcihXcmFwcGVyKGFjdGlvbi5QZXJmb3JtKGFyZ3MpKSk7CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgUmVmZXJlbmNlT3JWYWx1ZVdyYXBwZXI8VD4gV3JhcHBlcjsKKworICBleHBsaWNpdCBBY3Rpb25SZXN1bHRIb2xkZXIoV3JhcHBlciByZXN1bHQpCisgICAgICA6IHJlc3VsdF8oOjp0ZXN0aW5nOjppbnRlcm5hbDo6bW92ZShyZXN1bHQpKSB7CisgIH0KKworICBXcmFwcGVyIHJlc3VsdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBY3Rpb25SZXN1bHRIb2xkZXIpOworfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIFQgPSB2b2lkLgordGVtcGxhdGUgPD4KK2NsYXNzIEFjdGlvblJlc3VsdEhvbGRlcjx2b2lkPiA6IHB1YmxpYyBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSB7CisgcHVibGljOgorICB2b2lkIFVud3JhcCgpIHsgfQorCisgIHZpcnR1YWwgdm9pZCBQcmludEFzQWN0aW9uUmVzdWx0KDo6c3RkOjpvc3RyZWFtKiAvKiBvcyAqLykgY29uc3Qge30KKworICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gbW9jayBmdW5jdGlvbidzIGRlZmF1bHQgYWN0aW9uIGFuZCByZXR1cm5zIG93bmVyc2hpcAorICAvLyBvZiBhbiBlbXB0eSBBY3Rpb25SZXN1bHRIb2xkZXIqLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgc3RhdGljIEFjdGlvblJlc3VsdEhvbGRlciogUGVyZm9ybURlZmF1bHRBY3Rpb24oCisgICAgICBjb25zdCBGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIGZ1bmNfbW9ja2VyLAorICAgICAgY29uc3QgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUmIGFyZ3MsCisgICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIHsKKyAgICBmdW5jX21vY2tlci0+UGVyZm9ybURlZmF1bHRBY3Rpb24oYXJncywgY2FsbF9kZXNjcmlwdGlvbik7CisgICAgcmV0dXJuIG5ldyBBY3Rpb25SZXN1bHRIb2xkZXI7CisgIH0KKworICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gYWN0aW9uIGFuZCByZXR1cm5zIG93bmVyc2hpcCBvZiBhbiBlbXB0eQorICAvLyBBY3Rpb25SZXN1bHRIb2xkZXIqLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgc3RhdGljIEFjdGlvblJlc3VsdEhvbGRlciogUGVyZm9ybUFjdGlvbigKKyAgICAgIGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uLAorICAgICAgY29uc3QgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKKyAgICBhY3Rpb24uUGVyZm9ybShhcmdzKTsKKyAgICByZXR1cm4gbmV3IEFjdGlvblJlc3VsdEhvbGRlcjsKKyAgfQorCisgcHJpdmF0ZToKKyAgQWN0aW9uUmVzdWx0SG9sZGVyKCkge30KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBY3Rpb25SZXN1bHRIb2xkZXIpOworfTsKKworLy8gVGhlIGJhc2Ugb2YgdGhlIGZ1bmN0aW9uIG1vY2tlciBjbGFzcyBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uIHR5cGUuCisvLyBXZSBwdXQgdGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBpbnN0ZWFkIG9mIGl0cyBjaGlsZCB0byBhdm9pZCBjb2RlCisvLyBibG9hdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgorY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlIDogcHVibGljIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudE1hdGNoZXJUdXBsZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKworICBGdW5jdGlvbk1vY2tlckJhc2UoKSA6IGN1cnJlbnRfc3BlY18odGhpcykge30KKworICAvLyBUaGUgZGVzdHJ1Y3RvciB2ZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gdGhpcyBtb2NrCisgIC8vIGZ1bmN0aW9uIGhhdmUgYmVlbiBzYXRpc2ZpZWQuICBJZiBub3QsIGl0IHdpbGwgcmVwb3J0IEdvb2dsZSBUZXN0CisgIC8vIG5vbi1mYXRhbCBmYWlsdXJlcyBmb3IgdGhlIHZpb2xhdGlvbnMuCisgIHZpcnR1YWwgfkZ1bmN0aW9uTW9ja2VyQmFzZSgpCisgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7CisgICAgVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNMb2NrZWQoKTsKKyAgICBNb2NrOjpVbnJlZ2lzdGVyTG9ja2VkKHRoaXMpOworICAgIENsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKTsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIE9OX0NBTEwgc3BlYyB0aGF0IG1hdGNoZXMgdGhpcyBtb2NrIGZ1bmN0aW9uIHdpdGggdGhlCisgIC8vIGdpdmVuIGFyZ3VtZW50czsgcmV0dXJucyBOVUxMIGlmIG5vIG1hdGNoaW5nIE9OX0NBTEwgaXMgZm91bmQuCisgIC8vIEwgPSAqCisgIGNvbnN0IE9uQ2FsbFNwZWM8Rj4qIEZpbmRPbkNhbGxTcGVjKAorICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgeworICAgIGZvciAoVW50eXBlZE9uQ2FsbFNwZWNzOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0CisgICAgICAgICAgICAgPSB1bnR5cGVkX29uX2NhbGxfc3BlY3NfLnJiZWdpbigpOworICAgICAgICAgaXQgIT0gdW50eXBlZF9vbl9jYWxsX3NwZWNzXy5yZW5kKCk7ICsraXQpIHsKKyAgICAgIGNvbnN0IE9uQ2FsbFNwZWM8Rj4qIHNwZWMgPSBzdGF0aWNfY2FzdDxjb25zdCBPbkNhbGxTcGVjPEY+Kj4oKml0KTsKKyAgICAgIGlmIChzcGVjLT5NYXRjaGVzKGFyZ3MpKQorICAgICAgICByZXR1cm4gc3BlYzsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGlzIG1vY2sgZnVuY3Rpb24gb24gdGhlIGdpdmVuCisgIC8vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LiBBc3NlcnRzIChvciB0aHJvd3MgaWYKKyAgLy8gZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCkgd2l0aCBhIGhlbHBmdWwgY2FsbCBkZXNjcnB0aW9uIGlmIHRoZXJlCisgIC8vIGlzIG5vIHZhbGlkIHJldHVybiB2YWx1ZS4gVGhpcyBtZXRob2QgZG9lc24ndCBkZXBlbmQgb24gdGhlCisgIC8vIG11dGFibGUgc3RhdGUgb2YgdGhpcyBvYmplY3QsIGFuZCB0aHVzIGNhbiBiZSBjYWxsZWQgY29uY3VycmVudGx5CisgIC8vIHdpdGhvdXQgbG9ja2luZy4KKyAgLy8gTCA9ICoKKyAgUmVzdWx0IFBlcmZvcm1EZWZhdWx0QWN0aW9uKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIGNvbnN0IHsKKyAgICBjb25zdCBPbkNhbGxTcGVjPEY+KiBjb25zdCBzcGVjID0KKyAgICAgICAgdGhpcy0+RmluZE9uQ2FsbFNwZWMoYXJncyk7CisgICAgaWYgKHNwZWMgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIHNwZWMtPkdldEFjdGlvbigpLlBlcmZvcm0oYXJncyk7CisgICAgfQorICAgIGNvbnN0IHN0cmluZyBtZXNzYWdlID0gY2FsbF9kZXNjcmlwdGlvbiArCisgICAgICAgICJcbiAgICBUaGUgbW9jayBmdW5jdGlvbiBoYXMgbm8gZGVmYXVsdCBhY3Rpb24gIgorICAgICAgICAic2V0LCBhbmQgaXRzIHJldHVybiB0eXBlIGhhcyBubyBkZWZhdWx0IHZhbHVlIHNldC4iOworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgICAgaWYgKCFEZWZhdWx0VmFsdWU8UmVzdWx0Pjo6RXhpc3RzKCkpIHsKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihtZXNzYWdlKTsKKyAgICB9CisjZWxzZQorICAgIEFzc2VydChEZWZhdWx0VmFsdWU8UmVzdWx0Pjo6RXhpc3RzKCksICIiLCAtMSwgbWVzc2FnZSk7CisjZW5kaWYKKyAgICByZXR1cm4gRGVmYXVsdFZhbHVlPFJlc3VsdD46OkdldCgpOworICB9CisKKyAgLy8gUGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucworICAvLyB0aGUgYWN0aW9uJ3MgcmVzdWx0LiAgVGhlIGNhbGwgZGVzY3JpcHRpb24gc3RyaW5nIHdpbGwgYmUgdXNlZCBpbgorICAvLyB0aGUgZXJyb3IgbWVzc2FnZSB0byBkZXNjcmliZSB0aGUgY2FsbCBpbiB0aGUgY2FzZSB0aGUgZGVmYXVsdAorICAvLyBhY3Rpb24gZmFpbHMuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmVzdWx0LgorICAvLyBMID0gKgorICB2aXJ0dWFsIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24oCisgICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsICAvLyBtdXN0IHBvaW50IHRvIGFuIEFyZ3VtZW50VHVwbGUKKyAgICAgIGNvbnN0IHN0cmluZyYgY2FsbF9kZXNjcmlwdGlvbikgY29uc3QgeworICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MgPQorICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7CisgICAgcmV0dXJuIFJlc3VsdEhvbGRlcjo6UGVyZm9ybURlZmF1bHRBY3Rpb24odGhpcywgYXJncywgY2FsbF9kZXNjcmlwdGlvbik7CisgIH0KKworICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucworICAvLyB0aGUgYWN0aW9uJ3MgcmVzdWx0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlCisgIC8vIHJlc3VsdC4KKyAgLy8gTCA9ICoKKyAgdmlydHVhbCBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogVW50eXBlZFBlcmZvcm1BY3Rpb24oCisgICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FjdGlvbiwgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzKSBjb25zdCB7CisgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGFjdGlvbiBiZWZvcmUgcGVyZm9ybWluZyBpdCwgaW4gY2FzZSB0aGUKKyAgICAvLyBhY3Rpb24gZGVsZXRlcyB0aGUgbW9jayBvYmplY3QgKGFuZCB0aHVzIGRlbGV0ZXMgaXRzZWxmKS4KKyAgICBjb25zdCBBY3Rpb248Rj4gYWN0aW9uID0gKnN0YXRpY19jYXN0PGNvbnN0IEFjdGlvbjxGPio+KHVudHlwZWRfYWN0aW9uKTsKKyAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzID0KKyAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFyZ3VtZW50VHVwbGUqPih1bnR5cGVkX2FyZ3MpOworICAgIHJldHVybiBSZXN1bHRIb2xkZXI6OlBlcmZvcm1BY3Rpb24oYWN0aW9uLCBhcmdzKTsKKyAgfQorCisgIC8vIEltcGxlbWVudHMgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6Q2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpOgorICAvLyBjbGVhcnMgdGhlIE9OX0NBTEwoKXMgc2V0IG9uIHRoaXMgbW9jayBmdW5jdGlvbi4KKyAgdmlydHVhbCB2b2lkIENsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKQorICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKworICAgIC8vIERlbGV0aW5nIG91ciBkZWZhdWx0IGFjdGlvbnMgbWF5IHRyaWdnZXIgb3RoZXIgbW9jayBvYmplY3RzIHRvIGJlCisgICAgLy8gZGVsZXRlZCwgZm9yIGV4YW1wbGUgaWYgYW4gYWN0aW9uIGNvbnRhaW5zIGEgcmVmZXJlbmNlIGNvdW50ZWQgc21hcnQKKyAgICAvLyBwb2ludGVyIHRvIHRoYXQgbW9jayBvYmplY3QsIGFuZCB0aGF0IGlzIHRoZSBsYXN0IHJlZmVyZW5jZS4gU28gaWYgd2UKKyAgICAvLyBkZWxldGUgb3VyIGFjdGlvbnMgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBnbG9iYWwgbXV0ZXggd2UgbWF5IGRlYWRsb2NrCisgICAgLy8gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWdhaW4uIEluc3RlYWQsIG1ha2UgYSBjb3B5IG9mIHRoZSBzZXQgb2YKKyAgICAvLyBhY3Rpb25zIHRvIGRlbGV0ZSwgY2xlYXIgb3VyIHNldCB3aXRoaW4gdGhlIG11dGV4LCBhbmQgdGhlbiBkZWxldGUgdGhlCisgICAgLy8gYWN0aW9ucyBvdXRzaWRlIG9mIHRoZSBtdXRleC4KKyAgICBVbnR5cGVkT25DYWxsU3BlY3Mgc3BlY3NfdG9fZGVsZXRlOworICAgIHVudHlwZWRfb25fY2FsbF9zcGVjc18uc3dhcChzcGVjc190b19kZWxldGUpOworCisgICAgZ19nbW9ja19tdXRleC5VbmxvY2soKTsKKyAgICBmb3IgKFVudHlwZWRPbkNhbGxTcGVjczo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgIHNwZWNzX3RvX2RlbGV0ZS5iZWdpbigpOworICAgICAgICAgaXQgIT0gc3BlY3NfdG9fZGVsZXRlLmVuZCgpOyArK2l0KSB7CisgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgT25DYWxsU3BlYzxGPio+KCppdCk7CisgICAgfQorCisgICAgLy8gTG9jayB0aGUgbXV0ZXggYWdhaW4sIHNpbmNlIHRoZSBjYWxsZXIgZXhwZWN0cyBpdCB0byBiZSBsb2NrZWQgd2hlbiB3ZQorICAgIC8vIHJldHVybi4KKyAgICBnX2dtb2NrX211dGV4LkxvY2soKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgIGZyaWVuZCBjbGFzcyBNb2NrU3BlYzsKKworICB0eXBlZGVmIEFjdGlvblJlc3VsdEhvbGRlcjxSZXN1bHQ+IFJlc3VsdEhvbGRlcjsKKworICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhpcyBtb2NrIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuCisgIC8vIGFyZ3VtZW50cy4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHNhZmVseSBjYWxsZWQgZnJvbSBtdWx0aXBsZQorICAvLyB0aHJlYWRzIGNvbmN1cnJlbnRseS4KKyAgUmVzdWx0IEludm9rZVdpdGgoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykKKyAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgeworICAgIHNjb3BlZF9wdHI8UmVzdWx0SG9sZGVyPiBob2xkZXIoCisgICAgICAgIERvd25DYXN0XzxSZXN1bHRIb2xkZXIqPih0aGlzLT5VbnR5cGVkSW52b2tlV2l0aCgmYXJncykpKTsKKyAgICByZXR1cm4gaG9sZGVyLT5VbndyYXAoKTsKKyAgfQorCisgIC8vIEFkZHMgYW5kIHJldHVybnMgYSBkZWZhdWx0IGFjdGlvbiBzcGVjIGZvciB0aGlzIG1vY2sgZnVuY3Rpb24uCisgIE9uQ2FsbFNwZWM8Rj4mIEFkZE5ld09uQ2FsbFNwZWMoCisgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKKyAgICAgIGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtKQorICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBNb2NrOjpSZWdpc3RlclVzZUJ5T25DYWxsT3JFeHBlY3RDYWxsKE1vY2tPYmplY3QoKSwgZmlsZSwgbGluZSk7CisgICAgT25DYWxsU3BlYzxGPiogY29uc3Qgb25fY2FsbF9zcGVjID0gbmV3IE9uQ2FsbFNwZWM8Rj4oZmlsZSwgbGluZSwgbSk7CisgICAgdW50eXBlZF9vbl9jYWxsX3NwZWNzXy5wdXNoX2JhY2sob25fY2FsbF9zcGVjKTsKKyAgICByZXR1cm4gKm9uX2NhbGxfc3BlYzsKKyAgfQorCisgIC8vIEFkZHMgYW5kIHJldHVybnMgYW4gZXhwZWN0YXRpb24gc3BlYyBmb3IgdGhpcyBtb2NrIGZ1bmN0aW9uLgorICBUeXBlZEV4cGVjdGF0aW9uPEY+JiBBZGROZXdFeHBlY3RhdGlvbigKKyAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICBpbnQgbGluZSwKKyAgICAgIGNvbnN0IHN0cmluZyYgc291cmNlX3RleHQsCisgICAgICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbSkKKyAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7CisgICAgTW9jazo6UmVnaXN0ZXJVc2VCeU9uQ2FsbE9yRXhwZWN0Q2FsbChNb2NrT2JqZWN0KCksIGZpbGUsIGxpbmUpOworICAgIFR5cGVkRXhwZWN0YXRpb248Rj4qIGNvbnN0IGV4cGVjdGF0aW9uID0KKyAgICAgICAgbmV3IFR5cGVkRXhwZWN0YXRpb248Rj4odGhpcywgZmlsZSwgbGluZSwgc291cmNlX3RleHQsIG0pOworICAgIGNvbnN0IGxpbmtlZF9wdHI8RXhwZWN0YXRpb25CYXNlPiB1bnR5cGVkX2V4cGVjdGF0aW9uKGV4cGVjdGF0aW9uKTsKKyAgICB1bnR5cGVkX2V4cGVjdGF0aW9uc18ucHVzaF9iYWNrKHVudHlwZWRfZXhwZWN0YXRpb24pOworCisgICAgLy8gQWRkcyB0aGlzIGV4cGVjdGF0aW9uIGludG8gdGhlIGltcGxpY2l0IHNlcXVlbmNlIGlmIHRoZXJlIGlzIG9uZS4KKyAgICBTZXF1ZW5jZSogY29uc3QgaW1wbGljaXRfc2VxdWVuY2UgPSBnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLmdldCgpOworICAgIGlmIChpbXBsaWNpdF9zZXF1ZW5jZSAhPSBOVUxMKSB7CisgICAgICBpbXBsaWNpdF9zZXF1ZW5jZS0+QWRkRXhwZWN0YXRpb24oRXhwZWN0YXRpb24odW50eXBlZF9leHBlY3RhdGlvbikpOworICAgIH0KKworICAgIHJldHVybiAqZXhwZWN0YXRpb247CisgIH0KKworICAvLyBUaGUgY3VycmVudCBzcGVjIChlaXRoZXIgZGVmYXVsdCBhY3Rpb24gc3BlYyBvciBleHBlY3RhdGlvbiBzcGVjKQorICAvLyBiZWluZyBkZXNjcmliZWQgb24gdGhpcyBmdW5jdGlvbiBtb2NrZXIuCisgIE1vY2tTcGVjPEY+JiBjdXJyZW50X3NwZWMoKSB7IHJldHVybiBjdXJyZW50X3NwZWNfOyB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4gZnJpZW5kIGNsYXNzIFR5cGVkRXhwZWN0YXRpb247CisKKyAgLy8gU29tZSB1dGlsaXRpZXMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgVW50eXBlZEludm9rZVdpdGgoKS4KKworICAvLyBEZXNjcmliZXMgd2hhdCBkZWZhdWx0IGFjdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBmb3IgdGhlIGdpdmVuCisgIC8vIGFyZ3VtZW50cy4KKyAgLy8gTCA9ICoKKyAgdm9pZCBEZXNjcmliZURlZmF1bHRBY3Rpb25Ubyhjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgIGNvbnN0IE9uQ2FsbFNwZWM8Rj4qIGNvbnN0IHNwZWMgPSBGaW5kT25DYWxsU3BlYyhhcmdzKTsKKworICAgIGlmIChzcGVjID09IE5VTEwpIHsKKyAgICAgICpvcyA8PCAoaW50ZXJuYWw6OnR5cGVfZXF1YWxzPFJlc3VsdCwgdm9pZD46OnZhbHVlID8KKyAgICAgICAgICAgICAgInJldHVybmluZyBkaXJlY3RseS5cbiIgOgorICAgICAgICAgICAgICAicmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgKm9zIDw8ICJ0YWtpbmcgZGVmYXVsdCBhY3Rpb24gc3BlY2lmaWVkIGF0OlxuIgorICAgICAgICAgIDw8IEZvcm1hdEZpbGVMb2NhdGlvbihzcGVjLT5maWxlKCksIHNwZWMtPmxpbmUoKSkgPDwgIlxuIjsKKyAgICB9CisgIH0KKworICAvLyBXcml0ZXMgYSBtZXNzYWdlIHRoYXQgdGhlIGNhbGwgaXMgdW5pbnRlcmVzdGluZyAoaS5lLiBuZWl0aGVyCisgIC8vIGV4cGxpY2l0bHkgZXhwZWN0ZWQgbm9yIGV4cGxpY2l0bHkgdW5leHBlY3RlZCkgdG8gdGhlIGdpdmVuCisgIC8vIG9zdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBVbnR5cGVkRGVzY3JpYmVVbmludGVyZXN0aW5nQ2FsbCgKKyAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywKKyAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QKKyAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7CisgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9CisgICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBcmd1bWVudFR1cGxlKj4odW50eXBlZF9hcmdzKTsKKyAgICAqb3MgPDwgIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gIjsKKyAgICBEZXNjcmliZURlZmF1bHRBY3Rpb25UbyhhcmdzLCBvcyk7CisgICAgKm9zIDw8ICIgICAgRnVuY3Rpb24gY2FsbDogIiA8PCBOYW1lKCk7CisgICAgVW5pdmVyc2FsUHJpbnQoYXJncywgb3MpOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgZXhwZWN0YXRpb24gdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcmd1bWVudHMKKyAgLy8gKG9yIE5VTEwgaXMgdGhlcmUncyBubyBtYXRjaCk7IHdoZW4gYSBtYXRjaCBpcyBmb3VuZCwKKyAgLy8gdW50eXBlZF9hY3Rpb24gaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUKKyAgLy8gcGVyZm9ybWVkIChvciBOVUxMIGlmIHRoZSBhY3Rpb24gaXMgImRvIGRlZmF1bHQiKSwgYW5kCisgIC8vIGlzX2V4Y2Vzc2l2ZSBpcyBtb2RpZmllZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBjYWxsIGV4Y2VlZHMgdGhlCisgIC8vIGV4cGVjdGVkIG51bWJlci4KKyAgLy8KKyAgLy8gQ3JpdGljYWwgc2VjdGlvbjogV2UgbXVzdCBmaW5kIHRoZSBtYXRjaGluZyBleHBlY3RhdGlvbiBhbmQgdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgYWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgdGFrZW4gaW4gYW4gQVRPTUlDCisgIC8vIHRyYW5zYWN0aW9uLiAgT3RoZXJ3aXNlIGFub3RoZXIgdGhyZWFkIG1heSBjYWxsIHRoaXMgbW9jaworICAvLyBtZXRob2QgaW4gdGhlIG1pZGRsZSBhbmQgbWVzcyB1cCB0aGUgc3RhdGUuCisgIC8vCisgIC8vIEhvd2V2ZXIsIHBlcmZvcm1pbmcgdGhlIGFjdGlvbiBoYXMgdG8gYmUgbGVmdCBvdXQgb2YgdGhlIGNyaXRpY2FsCisgIC8vIHNlY3Rpb24uICBUaGUgcmVhc29uIGlzIHRoYXQgd2UgaGF2ZSBubyBjb250cm9sIG9uIHdoYXQgdGhlCisgIC8vIGFjdGlvbiBkb2VzIChpdCBjYW4gaW52b2tlIGFuIGFyYml0cmFyeSB1c2VyIGZ1bmN0aW9uIG9yIGV2ZW4gYQorICAvLyBtb2NrIGZ1bmN0aW9uKSBhbmQgZXhjZXNzaXZlIGxvY2tpbmcgY291bGQgY2F1c2UgYSBkZWFkIGxvY2suCisgIHZpcnR1YWwgY29uc3QgRXhwZWN0YXRpb25CYXNlKiBVbnR5cGVkRmluZE1hdGNoaW5nRXhwZWN0YXRpb24oCisgICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCisgICAgICBjb25zdCB2b2lkKiogdW50eXBlZF9hY3Rpb24sIGJvb2wqIGlzX2V4Y2Vzc2l2ZSwKKyAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aGF0LCA6OnN0ZDo6b3N0cmVhbSogd2h5KQorICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzID0KKyAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFyZ3VtZW50VHVwbGUqPih1bnR5cGVkX2FyZ3MpOworICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKKyAgICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBleHAgPSB0aGlzLT5GaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbkxvY2tlZChhcmdzKTsKKyAgICBpZiAoZXhwID09IE5VTEwpIHsgIC8vIEEgbWF0Y2ggd2Fzbid0IGZvdW5kLgorICAgICAgdGhpcy0+Rm9ybWF0VW5leHBlY3RlZENhbGxNZXNzYWdlTG9ja2VkKGFyZ3MsIHdoYXQsIHdoeSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGxpbmUgbXVzdCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIEdldEFjdGlvbkZvckFyZ3VtZW50cygpLAorICAgIC8vIHdoaWNoIHdpbGwgaW5jcmVtZW50IHRoZSBjYWxsIGNvdW50IGZvciAqZXhwIGFuZCB0aHVzIGFmZmVjdAorICAgIC8vIGl0cyBzYXR1cmF0aW9uIHN0YXR1cy4KKyAgICAqaXNfZXhjZXNzaXZlID0gZXhwLT5Jc1NhdHVyYXRlZCgpOworICAgIGNvbnN0IEFjdGlvbjxGPiogYWN0aW9uID0gZXhwLT5HZXRBY3Rpb25Gb3JBcmd1bWVudHModGhpcywgYXJncywgd2hhdCwgd2h5KTsKKyAgICBpZiAoYWN0aW9uICE9IE5VTEwgJiYgYWN0aW9uLT5Jc0RvRGVmYXVsdCgpKQorICAgICAgYWN0aW9uID0gTlVMTDsgIC8vIE5vcm1hbGl6ZSAiZG8gZGVmYXVsdCIgdG8gTlVMTC4KKyAgICAqdW50eXBlZF9hY3Rpb24gPSBhY3Rpb247CisgICAgcmV0dXJuIGV4cDsKKyAgfQorCisgIC8vIFByaW50cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXJndW1lbnRzIHRvIHRoZSBvc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgVW50eXBlZFByaW50QXJncyhjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MgPQorICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7CisgICAgVW5pdmVyc2FsUHJpbnQoYXJncywgb3MpOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgZXhwZWN0YXRpb24gdGhhdCBtYXRjaGVzIHRoZSBhcmd1bWVudHMsIG9yIE5VTEwgaWYgbm8KKyAgLy8gZXhwZWN0YXRpb24gbWF0Y2hlcyB0aGVtLgorICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBGaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbkxvY2tlZCgKKyAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0CisgICAgICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKyAgICBmb3IgKHR5cGVuYW1lIFVudHlwZWRFeHBlY3RhdGlvbnM6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5yYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHVudHlwZWRfZXhwZWN0YXRpb25zXy5yZW5kKCk7ICsraXQpIHsKKyAgICAgIFR5cGVkRXhwZWN0YXRpb248Rj4qIGNvbnN0IGV4cCA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8VHlwZWRFeHBlY3RhdGlvbjxGPio+KGl0LT5nZXQoKSk7CisgICAgICBpZiAoZXhwLT5TaG91bGRIYW5kbGVBcmd1bWVudHMoYXJncykpIHsKKyAgICAgICAgcmV0dXJuIGV4cDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBSZXR1cm5zIGEgbWVzc2FnZSB0aGF0IHRoZSBhcmd1bWVudHMgZG9uJ3QgbWF0Y2ggYW55IGV4cGVjdGF0aW9uLgorICB2b2lkIEZvcm1hdFVuZXhwZWN0ZWRDYWxsTWVzc2FnZUxvY2tlZCgKKyAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsCisgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MsCisgICAgICA6OnN0ZDo6b3N0cmVhbSogd2h5KSBjb25zdAorICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7CisgICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7CisgICAgKm9zIDw8ICJcblVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gIjsKKyAgICBEZXNjcmliZURlZmF1bHRBY3Rpb25UbyhhcmdzLCBvcyk7CisgICAgUHJpbnRUcmllZEV4cGVjdGF0aW9uc0xvY2tlZChhcmdzLCB3aHkpOworICB9CisKKyAgLy8gUHJpbnRzIGEgbGlzdCBvZiBleHBlY3RhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdHJpZWQgYWdhaW5zdCB0aGUKKyAgLy8gY3VycmVudCBtb2NrIGZ1bmN0aW9uIGNhbGwuCisgIHZvaWQgUHJpbnRUcmllZEV4cGVjdGF0aW9uc0xvY2tlZCgKKyAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsCisgICAgICA6OnN0ZDo6b3N0cmVhbSogd2h5KSBjb25zdAorICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7CisgICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7CisgICAgY29uc3QgaW50IGNvdW50ID0gc3RhdGljX2Nhc3Q8aW50Pih1bnR5cGVkX2V4cGVjdGF0aW9uc18uc2l6ZSgpKTsKKyAgICAqd2h5IDw8ICJHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nICIgPDwgY291bnQgPDwgIiAiCisgICAgICAgICA8PCAoY291bnQgPT0gMSA/ICJleHBlY3RhdGlvbiwgYnV0IGl0IGRpZG4ndCBtYXRjaCIgOgorICAgICAgICAgICAgICJleHBlY3RhdGlvbnMsIGJ1dCBub25lIG1hdGNoZWQiKQorICAgICAgICAgPDwgIjpcbiI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBjb25zdCBleHBlY3RhdGlvbiA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8VHlwZWRFeHBlY3RhdGlvbjxGPio+KHVudHlwZWRfZXhwZWN0YXRpb25zX1tpXS5nZXQoKSk7CisgICAgICAqd2h5IDw8ICJcbiI7CisgICAgICBleHBlY3RhdGlvbi0+RGVzY3JpYmVMb2NhdGlvblRvKHdoeSk7CisgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICp3aHkgPDwgInRyaWVkIGV4cGVjdGF0aW9uICMiIDw8IGkgPDwgIjogIjsKKyAgICAgIH0KKyAgICAgICp3aHkgPDwgZXhwZWN0YXRpb24tPnNvdXJjZV90ZXh0KCkgPDwgIi4uLlxuIjsKKyAgICAgIGV4cGVjdGF0aW9uLT5FeHBsYWluTWF0Y2hSZXN1bHRUbyhhcmdzLCB3aHkpOworICAgICAgZXhwZWN0YXRpb24tPkRlc2NyaWJlQ2FsbENvdW50VG8od2h5KTsKKyAgICB9CisgIH0KKworICAvLyBUaGUgY3VycmVudCBzcGVjIChlaXRoZXIgZGVmYXVsdCBhY3Rpb24gc3BlYyBvciBleHBlY3RhdGlvbiBzcGVjKQorICAvLyBiZWluZyBkZXNjcmliZWQgb24gdGhpcyBmdW5jdGlvbiBtb2NrZXIuCisgIE1vY2tTcGVjPEY+IGN1cnJlbnRfc3BlY187CisKKyAgLy8gVGhlcmUgaXMgbm8gZ2VuZXJhbGx5IHVzZWZ1bCBhbmQgaW1wbGVtZW50YWJsZSBzZW1hbnRpY3Mgb2YKKyAgLy8gY29weWluZyBhIG1vY2sgb2JqZWN0LCBzbyBjb3B5aW5nIGEgbW9jayBpcyB1c3VhbGx5IGEgdXNlciBlcnJvci4KKyAgLy8gVGh1cyB3ZSBkaXNhbGxvdyBjb3B5aW5nIGZ1bmN0aW9uIG1vY2tlcnMuICBJZiB0aGUgdXNlciByZWFsbHkKKyAgLy8gd2FudHMgdG8gY29weSBhIG1vY2sgb2JqZWN0LCBoZSBzaG91bGQgaW1wbGVtZW50IGhpcyBvd24gY29weQorICAvLyBvcGVyYXRpb24sIGZvciBleGFtcGxlOgorICAvLworICAvLyAgIGNsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vIHsKKyAgLy8gICAgcHVibGljOgorICAvLyAgICAgLy8gRGVmaW5lcyBhIGNvcHkgY29uc3RydWN0b3IgZXhwbGljaXRseS4KKyAgLy8gICAgIE1vY2tGb28oY29uc3QgTW9ja0ZvbyYgc3JjKSB7fQorICAvLyAgICAgLi4uCisgIC8vICAgfTsKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhGdW5jdGlvbk1vY2tlckJhc2UpOworfTsgIC8vIGNsYXNzIEZ1bmN0aW9uTW9ja2VyQmFzZQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZW5kaWYgIC8vIF9NU1ZfVkVSCisKKy8vIEltcGxlbWVudHMgbWV0aG9kcyBvZiBGdW5jdGlvbk1vY2tlckJhc2UuCisKKy8vIFZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGlzIG1vY2sgZnVuY3Rpb24gaGF2ZSBiZWVuCisvLyBzYXRpc2ZpZWQuICBSZXBvcnRzIG9uZSBvciBtb3JlIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQKKy8vIHJldHVybnMgZmFsc2UgaWYgbm90LgorCisvLyBSZXBvcnRzIGFuIHVuaW50ZXJlc3RpbmcgY2FsbCAod2hvc2UgZGVzY3JpcHRpb24gaXMgaW4gbXNnKSBpbiB0aGUKKy8vIG1hbm5lciBzcGVjaWZpZWQgYnkgJ3JlYWN0aW9uJy4KK3ZvaWQgUmVwb3J0VW5pbnRlcmVzdGluZ0NhbGwoQ2FsbFJlYWN0aW9uIHJlYWN0aW9uLCBjb25zdCBzdHJpbmcmIG1zZyk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBUaGUgc3R5bGUgZ3VpZGUgcHJvaGliaXRzICJ1c2luZyIgc3RhdGVtZW50cyBpbiBhIG5hbWVzcGFjZSBzY29wZQorLy8gaW5zaWRlIGEgaGVhZGVyIGZpbGUuICBIb3dldmVyLCB0aGUgTW9ja1NwZWMgY2xhc3MgdGVtcGxhdGUgaXMKKy8vIG1lYW50IHRvIGJlIGRlZmluZWQgaW4gdGhlIDo6dGVzdGluZyBuYW1lc3BhY2UuICBUaGUgZm9sbG93aW5nIGxpbmUKKy8vIGlzIGp1c3QgYSB0cmljayBmb3Igd29ya2luZyBhcm91bmQgYSBidWcgaW4gTVNWQyA4LjAsIHdoaWNoIGNhbm5vdAorLy8gaGFuZGxlIGl0IGlmIHdlIGRlZmluZSBNb2NrU3BlYyBpbiA6OnRlc3RpbmcuCit1c2luZyBpbnRlcm5hbDo6TW9ja1NwZWM7CisKKy8vIENvbnN0KHgpIGlzIGEgY29udmVuaWVudCBmdW5jdGlvbiBmb3Igb2J0YWluaW5nIGEgY29uc3QgcmVmZXJlbmNlCisvLyB0byB4LiAgVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgZXhwZWN0YXRpb25zIG9uIGFuIG92ZXJsb2FkZWQKKy8vIGNvbnN0IG1vY2sgbWV0aG9kLCBlLmcuCisvLworLy8gICBjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvb0ludGVyZmFjZSB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgTU9DS19NRVRIT0QwKEJhciwgaW50KCkpOworLy8gICAgIE1PQ0tfQ09OU1RfTUVUSE9EMChCYXIsIGludCYoKSk7CisvLyAgIH07CisvLworLy8gICBNb2NrRm9vIGZvbzsKKy8vICAgLy8gRXhwZWN0cyBhIGNhbGwgdG8gbm9uLWNvbnN0IE1vY2tGb286OkJhcigpLgorLy8gICBFWFBFQ1RfQ0FMTChmb28sIEJhcigpKTsKKy8vICAgLy8gRXhwZWN0cyBhIGNhbGwgdG8gY29uc3QgTW9ja0Zvbzo6QmFyKCkuCisvLyAgIEVYUEVDVF9DQUxMKENvbnN0KGZvbyksIEJhcigpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIGNvbnN0IFQmIENvbnN0KGNvbnN0IFQmIHgpIHsgcmV0dXJuIHg7IH0KKworLy8gQ29uc3RydWN0cyBhbiBFeHBlY3RhdGlvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFuZCBjby1vd25zIGV4cC4KK2lubGluZSBFeHBlY3RhdGlvbjo6RXhwZWN0YXRpb24oaW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZSYgZXhwKSAgLy8gTk9MSU5UCisgICAgOiBleHBlY3RhdGlvbl9iYXNlXyhleHAuR2V0SGFuZGxlKCkuZXhwZWN0YXRpb25fYmFzZSgpKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBBIHNlcGFyYXRlIG1hY3JvIGlzIHJlcXVpcmVkIHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzIHdoZW4gdGhlIG5hbWUKKy8vIG9mIHRoZSBtZXRob2QgdXNlZCBpbiBjYWxsIGlzIGEgcmVzdWx0IG9mIG1hY3JvIGV4cGFuc2lvbi4KKy8vIFNlZSBDb21waWxlc1dpdGhNZXRob2ROYW1lRXhwYW5kZWRGcm9tTWFjcm8gdGVzdHMgaW4KKy8vIGludGVybmFsL2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYyBmb3IgbW9yZSBkZXRhaWxzLgorI2RlZmluZSBHTU9DS19PTl9DQUxMX0lNUExfKG9iaiwgY2FsbCkgXAorICAgICgob2JqKS5nbW9ja18jI2NhbGwpLkludGVybmFsRGVmYXVsdEFjdGlvblNldEF0KF9fRklMRV9fLCBfX0xJTkVfXywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNvYmosICNjYWxsKQorI2RlZmluZSBPTl9DQUxMKG9iaiwgY2FsbCkgR01PQ0tfT05fQ0FMTF9JTVBMXyhvYmosIGNhbGwpCisKKyNkZWZpbmUgR01PQ0tfRVhQRUNUX0NBTExfSU1QTF8ob2JqLCBjYWxsKSBcCisgICAgKChvYmopLmdtb2NrXyMjY2FsbCkuSW50ZXJuYWxFeHBlY3RlZEF0KF9fRklMRV9fLCBfX0xJTkVfXywgI29iaiwgI2NhbGwpCisjZGVmaW5lIEVYUEVDVF9DQUxMKG9iaiwgY2FsbCkgR01PQ0tfRVhQRUNUX0NBTExfSU1QTF8ob2JqLCBjYWxsKQorCisjZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfU1BFQ19CVUlMREVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczNWM3MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgKQEAgLTAsMCArMSw5NCBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgaXMgdGhlIG1haW4gaGVhZGVyIGZpbGUgYSB1c2VyIHNob3VsZCBpbmNsdWRlLgorCisjaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXworCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIHN5bnRheDoKKy8vCisvLyAgIE9OX0NBTEwobW9ja19vYmplY3QuTWV0aG9kKC4uLikpCisvLyAgICAgLldpdGgoLi4uKSA/CisvLyAgICAgLldpbGxCeURlZmF1bHQoLi4uKTsKKy8vCisvLyB3aGVyZSBXaXRoKCkgaXMgb3B0aW9uYWwgYW5kIFdpbGxCeURlZmF1bHQoKSBtdXN0IGFwcGVhciBleGFjdGx5CisvLyBvbmNlLgorLy8KKy8vICAgRVhQRUNUX0NBTEwobW9ja19vYmplY3QuTWV0aG9kKC4uLikpCisvLyAgICAgLldpdGgoLi4uKSA/CisvLyAgICAgLlRpbWVzKC4uLikgPworLy8gICAgIC5JblNlcXVlbmNlKC4uLikgKgorLy8gICAgIC5XaWxsT25jZSguLi4pICoKKy8vICAgICAuV2lsbFJlcGVhdGVkbHkoLi4uKSA/CisvLyAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKSA/IDsKKy8vCisvLyB3aGVyZSBhbGwgY2xhdXNlcyBhcmUgb3B0aW9uYWwgYW5kIFdpbGxPbmNlKCkgY2FuIGJlIHJlcGVhdGVkLgorCisjaW5jbHVkZSAiZ21vY2svZ21vY2stYWN0aW9ucy5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaCIKKyNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgiCisjaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgiCisjaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgiCisjaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKKyNpbmNsdWRlICJnbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaCIKKyNpbmNsdWRlICJnbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgiCisjaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBEZWNsYXJlcyBHb29nbGUgTW9jayBmbGFncyB0aGF0IHdlIHdhbnQgYSB1c2VyIHRvIHVzZSBwcm9ncmFtbWF0aWNhbGx5LgorR01PQ0tfREVDTEFSRV9ib29sXyhjYXRjaF9sZWFrZWRfbW9ja3MpOworR01PQ0tfREVDTEFSRV9zdHJpbmdfKHZlcmJvc2UpOworCisvLyBJbml0aWFsaXplcyBHb29nbGUgTW9jay4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlCisvLyB0ZXN0cy4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciB0aGUgZmxhZ3MKKy8vIHRoYXQgR29vZ2xlIE1vY2sgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIE1vY2sgZmxhZyBpcyBzZWVuLAorLy8gaXQgaXMgcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KKy8vCisvLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgTW9jayBmbGFnIHZhcmlhYmxlcyBhcmUKKy8vIHVwZGF0ZWQuCisvLworLy8gU2luY2UgR29vZ2xlIFRlc3QgaXMgbmVlZGVkIGZvciBHb29nbGUgTW9jayB0byB3b3JrLCB0aGlzIGZ1bmN0aW9uCisvLyBhbHNvIGluaXRpYWxpemVzIEdvb2dsZSBUZXN0IGFuZCBwYXJzZXMgaXRzIGZsYWdzLCBpZiB0aGF0IGhhc24ndAorLy8gYmVlbiBkb25lLgorR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVNb2NrKGludCogYXJnYywgY2hhcioqIGFyZ3YpOworCisvLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluCisvLyBVTklDT0RFIG1vZGUuCitHVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZU1vY2soaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGMzYjFhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgKQEAgLTAsMCArMSw4IEBACisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wCisvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKyNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KKworI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2YzhhMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKQEAgLTAsMCArMSwxMCBAQAorJCQgLSotIG1vZGU6IGMrKzsgLSotCiskJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZSAoaHR0cDovL2dvL3B1bXApLiAgUGxlYXNlIHVzZSBQdW1wIHRvIGNvbnZlcnQKKyQkIGl0IHRvIGNhbGxiYWNrLWFjdGlvbnMuaC4KKyQkCiskdmFyIG1heF9jYWxsYmFja19hcml0eSA9IDUKKyQkfX0gVGhpcyBtZXRhIGNvbW1lbnQgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBpbiBlZGl0b3JzLgorI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXworI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXworCisjZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stbWF0Y2hlcnMuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1tYXRjaGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZWZlZjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stbWF0Y2hlcnMuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBBbiBpbnN0YWxsYXRpb24tc3BlY2lmaWMgZXh0ZW5zaW9uIHBvaW50IGZvciBnbW9jay1tYXRjaGVycy5oLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gQWRkcyBnb29nbGUzIGNhbGxiYWNrIHN1cHBvcnQgdG8gQ2FsbGFibGVUcmFpdHMuCisvLworI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXworI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXworCisjZW5kaWYgIC8vICBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLXBvcnQuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlOGJmZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1wb3J0LmgKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEluamVjdGlvbiBwb2ludCBmb3IgY3VzdG9tIHVzZXIgY29uZmlndXJhdGlvbnMuCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgZGVmaW5lZDoKKy8vCisvLyAgIEZsYWcgcmVsYXRlZCBtYWNyb3M6CisvLyAgICAgR01PQ0tfREVDTEFSRV9ib29sXyhuYW1lKQorLy8gICAgIEdNT0NLX0RFQ0xBUkVfaW50MzJfKG5hbWUpCisvLyAgICAgR01PQ0tfREVDTEFSRV9zdHJpbmdfKG5hbWUpCisvLyAgICAgR01PQ0tfREVGSU5FX2Jvb2xfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpCisvLyAgICAgR01PQ0tfREVGSU5FX2ludDMyXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQorLy8gICAgIEdNT0NLX0RFRklORV9zdHJpbmdfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpCisvLworLy8gKiogQ3VzdG9tIGltcGxlbWVudGF0aW9uIHN0YXJ0cyBoZXJlICoqCisKKyNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfUE9SVF9IXworI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9HTU9DS19QT1JUX0hfCisKKyNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfUE9SVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODExZTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBnbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaC5wdW1wCisvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGVtcGxhdGUgbWV0YS1wcm9ncmFtbWluZyB1dGlsaXR5IGNsYXNzZXMgbmVlZGVkCisvLyBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZSBNb2NrLgorCisjaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCisjZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCisKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBNYXRjaGVyOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBbiBJZ25vcmVkVmFsdWUgb2JqZWN0IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnN0cnVjdGVkIGZyb20gQU5ZIHZhbHVlLgorLy8gVGhpcyBpcyB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgSWdub3JlUmVzdWx0KGEpIGFjdGlvbi4KK2NsYXNzIElnbm9yZWRWYWx1ZSB7CisgcHVibGljOgorICAvLyBUaGlzIGNvbnN0cnVjdG9yIHRlbXBsYXRlIGFsbG93cyBhbnkgdmFsdWUgdG8gYmUgaW1wbGljaXRseQorICAvLyBjb252ZXJ0ZWQgdG8gSWdub3JlZFZhbHVlLiAgVGhlIG9iamVjdCBoYXMgbm8gZGF0YSBtZW1iZXIgYW5kCisgIC8vIGRvZXNuJ3QgdHJ5IHRvIHJlbWVtYmVyIGFueXRoaW5nIGFib3V0IHRoZSBhcmd1bWVudC4gIFdlCisgIC8vIGRlbGliZXJhdGVseSBvbWl0IHRoZSAnZXhwbGljaXQnIGtleXdvcmQgaW4gb3JkZXIgdG8gYWxsb3cgdGhlCisgIC8vIGNvbnZlcnNpb24gdG8gYmUgaW1wbGljaXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBJZ25vcmVkVmFsdWUoY29uc3QgVCYgLyogaWdub3JlZCAqLykge30gIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQorfTsKKworLy8gTWF0Y2hlclR1cGxlPFQ+Ojp0eXBlIGlzIGEgdHVwbGUgdHlwZSB3aGVyZSBlYWNoIGZpZWxkIGlzIGEgTWF0Y2hlcgorLy8gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHR1cGxlIHR5cGUgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KK3N0cnVjdCBNYXRjaGVyVHVwbGU7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPD4gPiB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwgPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEExPgorc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMT4gPiB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgorc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTI+ID4geworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+ID4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgorc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzPiA+IHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4gPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0Pgorc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBND4gPiB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LAorICAgICAgTWF0Y2hlcjxBND4gPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KK3N0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1PiA+IHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LAorICAgICAgTWF0Y2hlcjxBNT4gPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICB0eXBlbmFtZSBBNj4KK3N0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4gPiB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwKKyAgICAgIE1hdGNoZXI8QTU+LCBNYXRjaGVyPEE2PiA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KK3N0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTc+ID4geworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCisgICAgICBNYXRjaGVyPEE1PiwgTWF0Y2hlcjxBNj4sIE1hdGNoZXI8QTc+ID4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCisgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KK3N0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4PiA+IHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LAorICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+LCBNYXRjaGVyPEE3PiwgTWF0Y2hlcjxBOD4gPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KK3N0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOT4gPiB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwKKyAgICAgIE1hdGNoZXI8QTU+LCBNYXRjaGVyPEE2PiwgTWF0Y2hlcjxBNz4sIE1hdGNoZXI8QTg+LCBNYXRjaGVyPEE5PiA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAorICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+CitzdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksCisgICAgQTEwPiA+IHsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LAorICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+LCBNYXRjaGVyPEE3PiwgTWF0Y2hlcjxBOD4sIE1hdGNoZXI8QTk+LAorICAgICAgTWF0Y2hlcjxBMTA+ID4gdHlwZTsKK307CisKKy8vIFRlbXBsYXRlIHN0cnVjdCBGdW5jdGlvbjxGPiwgd2hlcmUgRiBtdXN0IGJlIGEgZnVuY3Rpb24gdHlwZSwgY29udGFpbnMKKy8vIHRoZSBmb2xsb3dpbmcgdHlwZWRlZnM6CisvLworLy8gICBSZXN1bHQ6ICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUuCisvLyAgIEFyZ3VtZW50TjogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgTi10aCBhcmd1bWVudCwgd2hlcmUgTiBzdGFydHMgd2l0aCAxLgorLy8gICBBcmd1bWVudFR1cGxlOiAgICAgICAgdGhlIHR1cGxlIHR5cGUgY29uc2lzdGluZyBvZiBhbGwgcGFyYW1ldGVycyBvZiBGLgorLy8gICBBcmd1bWVudE1hdGNoZXJUdXBsZTogdGhlIHR1cGxlIHR5cGUgY29uc2lzdGluZyBvZiBNYXRjaGVycyBmb3IgYWxsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIG9mIEYuCisvLyAgIE1ha2VSZXN1bHRWb2lkOiAgICAgICB0aGUgZnVuY3Rpb24gdHlwZSBvYnRhaW5lZCBieSBzdWJzdGl0dXRpbmcgdm9pZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiBGLgorLy8gICBNYWtlUmVzdWx0SWdub3JlZFZhbHVlOgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHR5cGUgb2J0YWluZWQgYnkgc3Vic3RpdHV0aW5nIFNvbWV0aGluZworLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiBGLgordGVtcGxhdGUgPHR5cGVuYW1lIEY+CitzdHJ1Y3QgRnVuY3Rpb247CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSPgorc3RydWN0IEZ1bmN0aW9uPFIoKT4geworICB0eXBlZGVmIFIgUmVzdWx0OworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8PiBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKyAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKCk7CisgIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMT4KK3N0cnVjdCBGdW5jdGlvbjxSKEExKT4KKyAgICA6IEZ1bmN0aW9uPFIoKT4geworICB0eXBlZGVmIEExIEFyZ3VtZW50MTsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExPiBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKyAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExKTsKKyAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgorc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyKT4KKyAgICA6IEZ1bmN0aW9uPFIoQTEpPiB7CisgIHR5cGVkZWYgQTIgQXJndW1lbnQyOworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyPiBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKyAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMik7CisgIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgorc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMyk+CisgICAgOiBGdW5jdGlvbjxSKEExLCBBMik+IHsKKyAgdHlwZWRlZiBBMyBBcmd1bWVudDM7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzPiBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKyAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMpOworICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0Pgorc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQpPgorICAgIDogRnVuY3Rpb248UihBMSwgQTIsIEEzKT4geworICB0eXBlZGVmIEE0IEFyZ3VtZW50NDsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0PiBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKyAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0KTsKKyAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgdHlwZW5hbWUgQTU+CitzdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUpPgorICAgIDogRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCk+IHsKKyAgdHlwZWRlZiBBNSBBcmd1bWVudDU7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTU+IEFyZ3VtZW50VHVwbGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOworICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1KTsKKyAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCwgQTUpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNj4KK3N0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPgorICAgIDogRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUpPiB7CisgIHR5cGVkZWYgQTYgQXJndW1lbnQ2OworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4gQXJndW1lbnRUdXBsZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7CisgIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KTsKKyAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3Pgorc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPgorICAgIDogRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4geworICB0eXBlZGVmIEE3IEFyZ3VtZW50NzsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3PiBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKyAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KTsKKyAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+CitzdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPgorICAgIDogRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk+IHsKKyAgdHlwZWRlZiBBOCBBcmd1bWVudDg7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTg+IEFyZ3VtZW50VHVwbGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOworICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KTsKKyAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KK3N0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpPgorICAgIDogRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPiB7CisgIHR5cGVkZWYgQTkgQXJndW1lbnQ5OworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOT4gQXJndW1lbnRUdXBsZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7CisgIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KTsKKyAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCisgICAgICBBOSk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5LAorICAgIHR5cGVuYW1lIEExMD4KK3N0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksIEExMCk+CisgICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpPiB7CisgIHR5cGVkZWYgQTEwIEFyZ3VtZW50MTA7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LAorICAgICAgQTEwPiBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKyAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksIEExMCk7CisgIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LAorICAgICAgQTksIEExMCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX0dFTkVSQVRFRF9JTlRFUk5BTF9VVElMU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgucHVtcCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oLnB1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwYWYxNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oLnB1bXAKQEAgLTAsMCArMSwxMzYgQEAKKyQkIC0qLSBtb2RlOiBjKys7IC0qLQorJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bworJCQgZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaC4KKyQkCiskdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4KKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGVtcGxhdGUgbWV0YS1wcm9ncmFtbWluZyB1dGlsaXR5IGNsYXNzZXMgbmVlZGVkCisvLyBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZSBNb2NrLgorCisjaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCisjZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCisKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBNYXRjaGVyOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBbiBJZ25vcmVkVmFsdWUgb2JqZWN0IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnN0cnVjdGVkIGZyb20gQU5ZIHZhbHVlLgorLy8gVGhpcyBpcyB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgSWdub3JlUmVzdWx0KGEpIGFjdGlvbi4KK2NsYXNzIElnbm9yZWRWYWx1ZSB7CisgcHVibGljOgorICAvLyBUaGlzIGNvbnN0cnVjdG9yIHRlbXBsYXRlIGFsbG93cyBhbnkgdmFsdWUgdG8gYmUgaW1wbGljaXRseQorICAvLyBjb252ZXJ0ZWQgdG8gSWdub3JlZFZhbHVlLiAgVGhlIG9iamVjdCBoYXMgbm8gZGF0YSBtZW1iZXIgYW5kCisgIC8vIGRvZXNuJ3QgdHJ5IHRvIHJlbWVtYmVyIGFueXRoaW5nIGFib3V0IHRoZSBhcmd1bWVudC4gIFdlCisgIC8vIGRlbGliZXJhdGVseSBvbWl0IHRoZSAnZXhwbGljaXQnIGtleXdvcmQgaW4gb3JkZXIgdG8gYWxsb3cgdGhlCisgIC8vIGNvbnZlcnNpb24gdG8gYmUgaW1wbGljaXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBJZ25vcmVkVmFsdWUoY29uc3QgVCYgLyogaWdub3JlZCAqLykge30gIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQorfTsKKworLy8gTWF0Y2hlclR1cGxlPFQ+Ojp0eXBlIGlzIGEgdHVwbGUgdHlwZSB3aGVyZSBlYWNoIGZpZWxkIGlzIGEgTWF0Y2hlcgorLy8gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHR1cGxlIHR5cGUgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KK3N0cnVjdCBNYXRjaGVyVHVwbGU7CisKKworJHJhbmdlIGkgMC4ubgorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCiskdmFyIHR5cGVuYW1lX0FzID0gW1skZm9yIGosIFtbdHlwZW5hbWUgQSRqXV1dXQorJHZhciBBcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KKyR2YXIgbWF0Y2hlcl9BcyA9IFtbJGZvciBqLCBbW01hdGNoZXI8QSRqPl1dXV0KK3RlbXBsYXRlIDwkdHlwZW5hbWVfQXM+CitzdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPCRBcz4gPiB7CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwkbWF0Y2hlcl9BcyA+IHR5cGU7Cit9OworCisKK11dCisvLyBUZW1wbGF0ZSBzdHJ1Y3QgRnVuY3Rpb248Rj4sIHdoZXJlIEYgbXVzdCBiZSBhIGZ1bmN0aW9uIHR5cGUsIGNvbnRhaW5zCisvLyB0aGUgZm9sbG93aW5nIHR5cGVkZWZzOgorLy8KKy8vICAgUmVzdWx0OiAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlLgorLy8gICBBcmd1bWVudE46ICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIE4tdGggYXJndW1lbnQsIHdoZXJlIE4gc3RhcnRzIHdpdGggMS4KKy8vICAgQXJndW1lbnRUdXBsZTogICAgICAgIHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgYWxsIHBhcmFtZXRlcnMgb2YgRi4KKy8vICAgQXJndW1lbnRNYXRjaGVyVHVwbGU6IHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgTWF0Y2hlcnMgZm9yIGFsbAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBvZiBGLgorLy8gICBNYWtlUmVzdWx0Vm9pZDogICAgICAgdGhlIGZ1bmN0aW9uIHR5cGUgb2J0YWluZWQgYnkgc3Vic3RpdHV0aW5nIHZvaWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4KKy8vICAgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZToKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB0eXBlIG9idGFpbmVkIGJ5IHN1YnN0aXR1dGluZyBTb21ldGhpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGPgorc3RydWN0IEZ1bmN0aW9uOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KK3N0cnVjdCBGdW5jdGlvbjxSKCk+IHsKKyAgdHlwZWRlZiBSIFJlc3VsdDsKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPD4gQXJndW1lbnRUdXBsZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7CisgIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZCgpOworICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKCk7Cit9OworCisKKyRyYW5nZSBpIDEuLm4KKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHZhciB0eXBlbmFtZV9BcyA9IFtbJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXV1dCiskdmFyIEFzID0gW1skZm9yIGosIFtbQSRqXV1dXQorJHZhciBtYXRjaGVyX0FzID0gW1skZm9yIGosIFtbTWF0Y2hlcjxBJGo+XV1dXQorJHJhbmdlIGsgMS4uaS0xCiskdmFyIHByZXZfQXMgPSBbWyRmb3IgaywgW1tBJGtdXV1dCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiR0eXBlbmFtZV9Bcz4KK3N0cnVjdCBGdW5jdGlvbjxSKCRBcyk+CisgICAgOiBGdW5jdGlvbjxSKCRwcmV2X0FzKT4geworICB0eXBlZGVmIEEkaSBBcmd1bWVudCRpOworICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8JEFzPiBBcmd1bWVudFR1cGxlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKKyAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKCRBcyk7CisgIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoJEFzKTsKK307CisKKworXV0KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRkYjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaApAQCAtMCwwICsxLDUxMSBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgdXRpbGl0aWVzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZQorLy8gTW9jay4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBzbyBwbGVhc2UgRE8gTk9UCisvLyBVU0UgVEhFTSBJTiBVU0VSIENPREUuCisKKyNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19JTlRFUk5BTF9VVElMU19IXworI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX0lOVEVSTkFMX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQ29udmVydHMgYW4gaWRlbnRpZmllciBuYW1lIHRvIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbG93ZXItY2FzZQorLy8gd29yZHMuICBFYWNoIG1heGltdW0gc3Vic3RyaW5nIG9mIHRoZSBmb3JtIFtBLVphLXpdW2Etel0qfFxkKyBpcworLy8gdHJlYXRlZCBhcyBvbmUgd29yZC4gIEZvciBleGFtcGxlLCBib3RoICJGb29CYXIxMjMiIGFuZAorLy8gImZvb19iYXJfMTIzIiBhcmUgY29udmVydGVkIHRvICJmb28gYmFyIDEyMyIuCitHVEVTVF9BUElfIHN0cmluZyBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKGNvbnN0IGNoYXIqIGlkX25hbWUpOworCisvLyBQb2ludGVlT2Y8UG9pbnRlcj46OnR5cGUgaXMgdGhlIHR5cGUgb2YgYSB2YWx1ZSBwb2ludGVkIHRvIGJ5IGEKKy8vIFBvaW50ZXIsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBzbWFydCBwb2ludGVyIG9yIGEgcmF3IHBvaW50ZXIuICBUaGUKKy8vIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgY2FzZSB3aGVyZSBQb2ludGVyIGlzIGEKKy8vIHNtYXJ0IHBvaW50ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KK3N0cnVjdCBQb2ludGVlT2YgeworICAvLyBTbWFydCBwb2ludGVyIGNsYXNzZXMgZGVmaW5lIHR5cGUgZWxlbWVudF90eXBlIGFzIHRoZSB0eXBlIG9mCisgIC8vIHRoZWlyIHBvaW50ZWVzLgorICB0eXBlZGVmIHR5cGVuYW1lIFBvaW50ZXI6OmVsZW1lbnRfdHlwZSB0eXBlOworfTsKKy8vIFRoaXMgc3BlY2lhbGl6YXRpb24gaXMgZm9yIHRoZSByYXcgcG9pbnRlciBjYXNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUG9pbnRlZU9mPFQqPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEdldFJhd1BvaW50ZXIocCkgcmV0dXJucyB0aGUgcmF3IHBvaW50ZXIgdW5kZXJseWluZyBwIHdoZW4gcCBpcyBhCisvLyBzbWFydCBwb2ludGVyLCBvciByZXR1cm5zIHAgaXRzZWxmIHdoZW4gcCBpcyBhbHJlYWR5IGEgcmF3IHBvaW50ZXIuCisvLyBUaGUgZm9sbG93aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZm9yIHRoZSBzbWFydCBwb2ludGVyIGNhc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBQb2ludGVyOjplbGVtZW50X3R5cGUqIEdldFJhd1BvaW50ZXIoY29uc3QgUG9pbnRlciYgcCkgeworICByZXR1cm4gcC5nZXQoKTsKK30KKy8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGlzIGZvciB0aGUgcmF3IHBvaW50ZXIgY2FzZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIEdldFJhd1BvaW50ZXIoRWxlbWVudCogcCkgeyByZXR1cm4gcDsgfQorCisvLyBUaGlzIGNvbXBhcmF0b3IgYWxsb3dzIGxpbmtlZF9wdHIgdG8gYmUgc3RvcmVkIGluIHNldHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBMaW5rZWRQdHJMZXNzVGhhbiB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyPFQ+JiBsaHMsCisgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyPFQ+JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gbGhzLmdldCgpIDwgcmhzLmdldCgpOworICB9Cit9OworCisvLyBTeW1iaWFuIGNvbXBpbGF0aW9uIGNhbiBiZSBkb25lIHdpdGggd2NoYXJfdCBiZWluZyBlaXRoZXIgYSBuYXRpdmUKKy8vIHR5cGUgb3IgYSB0eXBlZGVmLiAgVXNpbmcgR29vZ2xlIE1vY2sgd2l0aCBPcGVuQyB3aXRob3V0IHdjaGFyX3QKKy8vIHNob3VsZCByZXF1aXJlIHRoZSBkZWZpbml0aW9uIG9mIF9TVExQX05PX1dDSEFSX1QuCisvLworLy8gTVNWQyB0cmVhdHMgd2NoYXJfdCBhcyBhIG5hdGl2ZSB0eXBlIHVzdWFsbHksIGJ1dCB0cmVhdHMgaXQgYXMgdGhlCisvLyBzYW1lIGFzIHVuc2lnbmVkIHNob3J0IHdoZW4gdGhlIGNvbXBpbGVyIG9wdGlvbiAvWmM6d2NoYXJfdC0gaXMKKy8vIHNwZWNpZmllZC4gIEl0IGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgc3ltYm9sIHdoZW4gd2NoYXJfdAorLy8gaXMgYSBuYXRpdmUgdHlwZS4KKyNpZiAoR1RFU1RfT1NfU1lNQklBTiAmJiBkZWZpbmVkKF9TVExQX05PX1dDSEFSX1QpKSB8fCBcCisgICAgKGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKSkKKy8vIHdjaGFyX3QgaXMgYSB0eXBlZGVmLgorI2Vsc2UKKyMgZGVmaW5lIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXyAxCisjZW5kaWYKKworLy8gc2lnbmVkIHdjaGFyX3QgYW5kIHVuc2lnbmVkIHdjaGFyX3QgYXJlIE5PVCBpbiB0aGUgQysrIHN0YW5kYXJkLgorLy8gVXNpbmcgdGhlbSBpcyBhIGJhZCBwcmFjdGljZSBhbmQgbm90IHBvcnRhYmxlLiAgU28gRE9OJ1QgdXNlIHRoZW0uCisvLworLy8gU3RpbGwsIEdvb2dsZSBNb2NrIGlzIGRlc2lnbmVkIHRvIHdvcmsgZXZlbiBpZiB0aGUgdXNlciB1c2VzIHNpZ25lZAorLy8gd2NoYXJfdCBvciB1bnNpZ25lZCB3Y2hhcl90IChvYnZpb3VzbHksIGFzc3VtaW5nIHRoZSBjb21waWxlcgorLy8gc3VwcG9ydHMgdGhlbSkuCisvLworLy8gVG8gZ2NjLAorLy8gICB3Y2hhcl90ID09IHNpZ25lZCB3Y2hhcl90ICE9IHVuc2lnbmVkIHdjaGFyX3QgPT0gdW5zaWduZWQgaW50CisjaWZkZWYgX19HTlVDX18KKy8vIHNpZ25lZC91bnNpZ25lZCB3Y2hhcl90IGFyZSB2YWxpZCB0eXBlcy4KKyMgZGVmaW5lIEdNT0NLX0hBU19TSUdORURfV0NIQVJfVF8gMQorI2VuZGlmCisKKy8vIEluIHdoYXQgZm9sbG93cywgd2UgdXNlIHRoZSB0ZXJtICJraW5kIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgdHlwZQorLy8gaXMgYm9vbCwgYW4gaW50ZWdlciB0eXBlIChleGNsdWRpbmcgYm9vbCksIGEgZmxvYXRpbmctcG9pbnQgdHlwZSwKKy8vIG9yIG5vbmUgb2YgdGhlbS4gIFRoaXMgY2F0ZWdvcml6YXRpb24gaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZworLy8gd2hlbiBhIG1hdGNoZXIgYXJndW1lbnQgdHlwZSBjYW4gYmUgc2FmZWx5IGNvbnZlcnRlZCB0byBhbm90aGVyCisvLyB0eXBlIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTYWZlTWF0Y2hlckNhc3QuCitlbnVtIFR5cGVLaW5kIHsKKyAga0Jvb2wsIGtJbnRlZ2VyLCBrRmxvYXRpbmdQb2ludCwga090aGVyCit9OworCisvLyBLaW5kT2Y8VD46OnZhbHVlIGlzIHRoZSBraW5kIG9mIHR5cGUgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgS2luZE9mIHsKKyAgZW51bSB7IHZhbHVlID0ga090aGVyIH07ICAvLyBUaGUgZGVmYXVsdCBraW5kLgorfTsKKworLy8gVGhpcyBtYWNybyBkZWNsYXJlcyB0aGF0IHRoZSBraW5kIG9mICd0eXBlJyBpcyAna2luZCcuCisjZGVmaW5lIEdNT0NLX0RFQ0xBUkVfS0lORF8odHlwZSwga2luZCkgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgS2luZE9mPHR5cGU+IHsgZW51bSB7IHZhbHVlID0ga2luZCB9OyB9CisKK0dNT0NLX0RFQ0xBUkVfS0lORF8oYm9vbCwga0Jvb2wpOworCisvLyBBbGwgc3RhbmRhcmQgaW50ZWdlciB0eXBlcy4KK0dNT0NLX0RFQ0xBUkVfS0lORF8oY2hhciwga0ludGVnZXIpOworR01PQ0tfREVDTEFSRV9LSU5EXyhzaWduZWQgY2hhciwga0ludGVnZXIpOworR01PQ0tfREVDTEFSRV9LSU5EXyh1bnNpZ25lZCBjaGFyLCBrSW50ZWdlcik7CitHTU9DS19ERUNMQVJFX0tJTkRfKHNob3J0LCBrSW50ZWdlcik7ICAvLyBOT0xJTlQKK0dNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgc2hvcnQsIGtJbnRlZ2VyKTsgIC8vIE5PTElOVAorR01PQ0tfREVDTEFSRV9LSU5EXyhpbnQsIGtJbnRlZ2VyKTsKK0dNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgaW50LCBrSW50ZWdlcik7CitHTU9DS19ERUNMQVJFX0tJTkRfKGxvbmcsIGtJbnRlZ2VyKTsgIC8vIE5PTElOVAorR01PQ0tfREVDTEFSRV9LSU5EXyh1bnNpZ25lZCBsb25nLCBrSW50ZWdlcik7ICAvLyBOT0xJTlQKKworI2lmIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXworR01PQ0tfREVDTEFSRV9LSU5EXyh3Y2hhcl90LCBrSW50ZWdlcik7CisjZW5kaWYKKworLy8gTm9uLXN0YW5kYXJkIGludGVnZXIgdHlwZXMuCitHTU9DS19ERUNMQVJFX0tJTkRfKEludDY0LCBrSW50ZWdlcik7CitHTU9DS19ERUNMQVJFX0tJTkRfKFVJbnQ2NCwga0ludGVnZXIpOworCisvLyBBbGwgc3RhbmRhcmQgZmxvYXRpbmctcG9pbnQgdHlwZXMuCitHTU9DS19ERUNMQVJFX0tJTkRfKGZsb2F0LCBrRmxvYXRpbmdQb2ludCk7CitHTU9DS19ERUNMQVJFX0tJTkRfKGRvdWJsZSwga0Zsb2F0aW5nUG9pbnQpOworR01PQ0tfREVDTEFSRV9LSU5EXyhsb25nIGRvdWJsZSwga0Zsb2F0aW5nUG9pbnQpOworCisjdW5kZWYgR01PQ0tfREVDTEFSRV9LSU5EXworCisvLyBFdmFsdWF0ZXMgdG8gdGhlIGtpbmQgb2YgJ3R5cGUnLgorI2RlZmluZSBHTU9DS19LSU5EX09GXyh0eXBlKSBcCisgIHN0YXRpY19jYXN0PCA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlS2luZD4oIFwKKyAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OktpbmRPZjx0eXBlPjo6dmFsdWUpCisKKy8vIEV2YWx1YXRlcyB0byB0cnVlIGlmZiBpbnRlZ2VyIHR5cGUgVCBpcyBzaWduZWQuCisjZGVmaW5lIEdNT0NLX0lTX1NJR05FRF8oVCkgKHN0YXRpY19jYXN0PFQ+KC0xKSA8IDApCisKKy8vIExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrRnJvbUtpbmQsIEZyb20sIGtUb0tpbmQsIFRvPjo6dmFsdWUKKy8vIGlzIHRydWUgaWZmIGFyaXRobWV0aWMgdHlwZSBGcm9tIGNhbiBiZSBsb3NzbGVzc2x5IGNvbnZlcnRlZCB0bworLy8gYXJpdGhtZXRpYyB0eXBlIFRvLgorLy8KKy8vIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBib3RoIEZyb20gYW5kIFRvIGFyZQorLy8gcmF3IChpLmUuIGhhcyBubyBDViBtb2RpZmllciwgaXMgbm90IGEgcG9pbnRlciwgYW5kIGlzIG5vdCBhCisvLyByZWZlcmVuY2UpIGJ1aWx0LWluIGFyaXRobWV0aWMgdHlwZXMsIGtGcm9tS2luZCBpcyB0aGUga2luZCBvZgorLy8gRnJvbSwgYW5kIGtUb0tpbmQgaXMgdGhlIGtpbmQgb2YgVG87IHRoZSB2YWx1ZSBpcworLy8gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGVuIHRoZSBhYm92ZSBwcmUtY29uZGl0aW9uIGlzIHZpb2xhdGVkLgordGVtcGxhdGUgPFR5cGVLaW5kIGtGcm9tS2luZCwgdHlwZW5hbWUgRnJvbSwgVHlwZUtpbmQga1RvS2luZCwgdHlwZW5hbWUgVG8+CitzdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsIDogcHVibGljIGZhbHNlX3R5cGUge307CisKKy8vIENvbnZlcnRpbmcgYm9vbCB0byBib29sIGlzIGxvc3NsZXNzLgordGVtcGxhdGUgPD4KK3N0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Jvb2wsIGJvb2wsIGtCb29sLCBib29sPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsgIC8vIE5PTElOVAorCisvLyBDb252ZXJ0aW5nIGJvb2wgdG8gYW55IGludGVnZXIgdHlwZSBpcyBsb3NzbGVzcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUbz4KK3N0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Jvb2wsIGJvb2wsIGtJbnRlZ2VyLCBUbz4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307ICAvLyBOT0xJTlQKKworLy8gQ29udmVydGluZyBib29sIHRvIGFueSBmbG9hdGluZy1wb2ludCB0eXBlIGlzIGxvc3NsZXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIFRvPgorc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrQm9vbCwgYm9vbCwga0Zsb2F0aW5nUG9pbnQsIFRvPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsgIC8vIE5PTElOVAorCisvLyBDb252ZXJ0aW5nIGFuIGludGVnZXIgdG8gYm9vbCBpcyBsb3NzeS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgorc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrSW50ZWdlciwgRnJvbSwga0Jvb2wsIGJvb2w+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAorCisvLyBDb252ZXJ0aW5nIGFuIGludGVnZXIgdG8gYW5vdGhlciBub24tYm9vbCBpbnRlZ2VyIGlzIGxvc3NsZXNzIGlmZgorLy8gdGhlIHRhcmdldCB0eXBlJ3MgcmFuZ2UgZW5jbG9zZXMgdGhlIHNvdXJjZSB0eXBlJ3MgcmFuZ2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CitzdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtJbnRlZ2VyLCBGcm9tLCBrSW50ZWdlciwgVG8+CisgICAgOiBwdWJsaWMgYm9vbF9jb25zdGFudDwKKyAgICAgIC8vIFdoZW4gY29udmVydGluZyBmcm9tIGEgc21hbGxlciBzaXplIHRvIGEgbGFyZ2VyIHNpemUsIHdlIGFyZQorICAgICAgLy8gZmluZSBhcyBsb25nIGFzIHdlIGFyZSBub3QgY29udmVydGluZyBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZC4KKyAgICAgICgoc2l6ZW9mKEZyb20pIDwgc2l6ZW9mKFRvKSkgJiYKKyAgICAgICAoIUdNT0NLX0lTX1NJR05FRF8oRnJvbSkgfHwgR01PQ0tfSVNfU0lHTkVEXyhUbykpKSB8fAorICAgICAgLy8gV2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIHNhbWUgc2l6ZSwgdGhlIHNpZ25lZG5lc3MgbXVzdCBtYXRjaC4KKyAgICAgICgoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbykpICYmCisgICAgICAgKEdNT0NLX0lTX1NJR05FRF8oRnJvbSkgPT0gR01PQ0tfSVNfU0lHTkVEXyhUbykpKT4ge307ICAvLyBOT0xJTlQKKworI3VuZGVmIEdNT0NLX0lTX1NJR05FRF8KKworLy8gQ29udmVydGluZyBhbiBpbnRlZ2VyIHRvIGEgZmxvYXRpbmctcG9pbnQgdHlwZSBtYXkgYmUgbG9zc3ksIHNpbmNlCisvLyB0aGUgZm9ybWF0IG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CitzdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtJbnRlZ2VyLCBGcm9tLCBrRmxvYXRpbmdQb2ludCwgVG8+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAorCisvLyBDb252ZXJ0aW5nIGEgZmxvYXRpbmctcG9pbnQgdG8gYm9vbCBpcyBsb3NzeS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgorc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrRmxvYXRpbmdQb2ludCwgRnJvbSwga0Jvb2wsIGJvb2w+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAorCisvLyBDb252ZXJ0aW5nIGEgZmxvYXRpbmctcG9pbnQgdG8gYW4gaW50ZWdlciBpcyBsb3NzeS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3N0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Zsb2F0aW5nUG9pbnQsIEZyb20sIGtJbnRlZ2VyLCBUbz4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OyAgLy8gTk9MSU5UCisKKy8vIENvbnZlcnRpbmcgYSBmbG9hdGluZy1wb2ludCB0byBhbm90aGVyIGZsb2F0aW5nLXBvaW50IGlzIGxvc3NsZXNzCisvLyBpZmYgdGhlIHRhcmdldCB0eXBlIGlzIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgc291cmNlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CitzdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPAorICBrRmxvYXRpbmdQb2ludCwgRnJvbSwga0Zsb2F0aW5nUG9pbnQsIFRvPgorICAgIDogcHVibGljIGJvb2xfY29uc3RhbnQ8c2l6ZW9mKEZyb20pIDw9IHNpemVvZihUbyk+IHt9OyAgLy8gTk9MSU5UCisKKy8vIExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWUgaXMgdHJ1ZSBpZmYgYXJpdGhtZXRpYworLy8gdHlwZSBGcm9tIGNhbiBiZSBsb3NzbGVzc2x5IGNvbnZlcnRlZCB0byBhcml0aG1ldGljIHR5cGUgVG8uCisvLworLy8gSXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IGJvdGggRnJvbSBhbmQgVG8gYXJlCisvLyByYXcgKGkuZS4gaGFzIG5vIENWIG1vZGlmaWVyLCBpcyBub3QgYSBwb2ludGVyLCBhbmQgaXMgbm90IGEKKy8vIHJlZmVyZW5jZSkgYnVpbHQtaW4gYXJpdGhtZXRpYyB0eXBlczsgdGhlIHZhbHVlIGlzCisvLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHdoZW4gdGhlIGFib3ZlIHByZS1jb25kaXRpb24gaXMgdmlvbGF0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CitzdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGUKKyAgICA6IHB1YmxpYyBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8CisgIEdNT0NLX0tJTkRfT0ZfKEZyb20pLCBGcm9tLCBHTU9DS19LSU5EX09GXyhUbyksIFRvPiB7fTsgIC8vIE5PTElOVAorCisvLyBUaGlzIGludGVyZmFjZSBrbm93cyBob3cgdG8gcmVwb3J0IGEgR29vZ2xlIE1vY2sgZmFpbHVyZSAoZWl0aGVyCisvLyBub24tZmF0YWwgb3IgZmF0YWwpLgorY2xhc3MgRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSB0eXBlIG9mIGEgZmFpbHVyZSAoZWl0aGVyIG5vbi1mYXRhbCBvciBmYXRhbCkuCisgIGVudW0gRmFpbHVyZVR5cGUgeworICAgIGtOb25mYXRhbCwga0ZhdGFsCisgIH07CisKKyAgdmlydHVhbCB+RmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlKCkge30KKworICAvLyBSZXBvcnRzIGEgZmFpbHVyZSB0aGF0IG9jY3VycmVkIGF0IHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbi4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydEZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgPSAwOworfTsKKworLy8gUmV0dXJucyB0aGUgZmFpbHVyZSByZXBvcnRlciB1c2VkIGJ5IEdvb2dsZSBNb2NrLgorR1RFU1RfQVBJXyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UqIEdldEZhaWx1cmVSZXBvcnRlcigpOworCisvLyBBc3NlcnRzIHRoYXQgY29uZGl0aW9uIGlzIHRydWU7IGFib3J0cyB0aGUgcHJvY2VzcyB3aXRoIHRoZSBnaXZlbgorLy8gbWVzc2FnZSBpZiBjb25kaXRpb24gaXMgZmFsc2UuICBXZSBjYW5ub3QgdXNlIExPRyhGQVRBTCkgb3IgQ0hFQ0soKQorLy8gYXMgR29vZ2xlIE1vY2sgbWlnaHQgYmUgdXNlZCB0byBtb2NrIHRoZSBsb2cgc2luayBpdHNlbGYuICBXZQorLy8gaW5saW5lIHRoaXMgZnVuY3Rpb24gdG8gcHJldmVudCBpdCBmcm9tIHNob3dpbmcgdXAgaW4gdGhlIHN0YWNrCisvLyB0cmFjZS4KK2lubGluZSB2b2lkIEFzc2VydChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtc2cpIHsKKyAgaWYgKCFjb25kaXRpb24pIHsKKyAgICBHZXRGYWlsdXJlUmVwb3J0ZXIoKS0+UmVwb3J0RmFpbHVyZShGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2U6OmtGYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBsaW5lLCBtc2cpOworICB9Cit9CitpbmxpbmUgdm9pZCBBc3NlcnQoYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7CisgIEFzc2VydChjb25kaXRpb24sIGZpbGUsIGxpbmUsICJBc3NlcnRpb24gZmFpbGVkLiIpOworfQorCisvLyBWZXJpZmllcyB0aGF0IGNvbmRpdGlvbiBpcyB0cnVlOyBnZW5lcmF0ZXMgYSBub24tZmF0YWwgZmFpbHVyZSBpZgorLy8gY29uZGl0aW9uIGlzIGZhbHNlLgoraW5saW5lIHZvaWQgRXhwZWN0KGJvb2wgY29uZGl0aW9uLCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1zZykgeworICBpZiAoIWNvbmRpdGlvbikgeworICAgIEdldEZhaWx1cmVSZXBvcnRlcigpLT5SZXBvcnRGYWlsdXJlKEZhaWx1cmVSZXBvcnRlckludGVyZmFjZTo6a05vbmZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIG1zZyk7CisgIH0KK30KK2lubGluZSB2b2lkIEV4cGVjdChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgRXhwZWN0KGNvbmRpdGlvbiwgZmlsZSwgbGluZSwgIkV4cGVjdGF0aW9uIGZhaWxlZC4iKTsKK30KKworLy8gU2V2ZXJpdHkgbGV2ZWwgb2YgYSBsb2cuCitlbnVtIExvZ1NldmVyaXR5IHsKKyAga0luZm8gPSAwLAorICBrV2FybmluZyA9IDEKK307CisKKy8vIFZhbGlkIHZhbHVlcyBmb3IgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLgorCisvLyBBbGwgbG9ncyAoaW5mb3JtYXRpb25hbCBhbmQgd2FybmluZ3MpIGFyZSBwcmludGVkLgorY29uc3QgY2hhciBrSW5mb1ZlcmJvc2l0eVtdID0gImluZm8iOworLy8gT25seSB3YXJuaW5ncyBhcmUgcHJpbnRlZC4KK2NvbnN0IGNoYXIga1dhcm5pbmdWZXJib3NpdHlbXSA9ICJ3YXJuaW5nIjsKKy8vIE5vIGxvZ3MgYXJlIHByaW50ZWQuCitjb25zdCBjaGFyIGtFcnJvclZlcmJvc2l0eVtdID0gImVycm9yIjsKKworLy8gUmV0dXJucyB0cnVlIGlmZiBhIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBpcyB2aXNpYmxlIGFjY29yZGluZworLy8gdG8gdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLgorR1RFU1RfQVBJXyBib29sIExvZ0lzVmlzaWJsZShMb2dTZXZlcml0eSBzZXZlcml0eSk7CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBzdGRvdXQgaWZmICdzZXZlcml0eScgPj0gdGhlIGxldmVsCisvLyBzcGVjaWZpZWQgYnkgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLiAgSWYgc3RhY2tfZnJhbWVzX3RvX3NraXAgPj0KKy8vIDAsIGFsc28gcHJpbnRzIHRoZSBzdGFjayB0cmFjZSBleGNsdWRpbmcgdGhlIHRvcAorLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgZnJhbWVzLiAgSW4gb3B0IG1vZGUsIGFueSBwb3NpdGl2ZQorLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgaXMgdHJlYXRlZCBhcyAwLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoaWNoCisvLyBmdW5jdGlvbiBjYWxscyB3aWxsIGJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBuZWVkIHRvIGJlCisvLyBjb25zZXJ2YXRpdmUuCitHVEVTVF9BUElfIHZvaWQgTG9nKExvZ1NldmVyaXR5IHNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIGludCBzdGFja19mcmFtZXNfdG9fc2tpcCk7CisKKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBncm91cCBhbGwgdHlwZSB1dGlsaXRpZXMgdG9nZXRoZXIuCisKKy8vIFR5cGUgdHJhaXRzLgorCisvLyBpc19yZWZlcmVuY2U8VD46OnZhbHVlIGlzIG5vbi16ZXJvIGlmZiBUIGlzIGEgcmVmZXJlbmNlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzX3JlZmVyZW5jZSA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19yZWZlcmVuY2U8VCY+IDogcHVibGljIHRydWVfdHlwZSB7fTsKKworLy8gdHlwZV9lcXVhbHM8VDEsIFQyPjo6dmFsdWUgaXMgbm9uLXplcm8gaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IHN0cnVjdCB0eXBlX2VxdWFscyA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0eXBlX2VxdWFsczxULCBUPiA6IHB1YmxpYyB0cnVlX3R5cGUge307CisKKy8vIHJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgcmVtb3ZlcyB0aGUgcmVmZXJlbmNlIGZyb20gdHlwZSBULCBpZiBhbnkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9yZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAvLyBOT0xJTlQKKworLy8gRGVjYXlBcnJheTxUPjo6dHlwZSB0dXJucyBhbiBhcnJheSB0eXBlIFVbTl0gdG8gY29uc3QgVSogYW5kIHByZXNlcnZlcworLy8gb3RoZXIgdHlwZXMuICBVc2VmdWwgZm9yIHNhdmluZyBhIGNvcHkgb2YgYSBmdW5jdGlvbiBhcmd1bWVudC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVjYXlBcnJheSB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+IHN0cnVjdCBEZWNheUFycmF5PFRbTl0+IHsKKyAgdHlwZWRlZiBjb25zdCBUKiB0eXBlOworfTsKKy8vIFNvbWV0aW1lcyBwZW9wbGUgdXNlIGFycmF5cyB3aG9zZSBzaXplIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHVzZSBzaXRlCisvLyAoZS5nLiBleHRlcm4gY29uc3QgY2hhciBrTmFtZVByZWZpeFtdKS4gIFRoaXMgc3BlY2lhbGl6YXRpb24gY292ZXJzIHRoYXQKKy8vIGNhc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlY2F5QXJyYXk8VFtdPiB7CisgIHR5cGVkZWYgY29uc3QgVCogdHlwZTsKK307CisKKy8vIERpc2FibGUgTVNWQyB3YXJuaW5ncyBmb3IgaW5maW5pdGUgcmVjdXJzaW9uLCBzaW5jZSBpbiB0aGlzIGNhc2UgdGhlCisvLyB0aGUgcmVjdXJzaW9uIGlzIHVucmVhY2hhYmxlLgorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDcxNykKKyNlbmRpZgorCisvLyBJbnZhbGlkPFQ+KCkgaXMgdXNhYmxlIGFzIGFuIGV4cHJlc3Npb24gb2YgdHlwZSBULCBidXQgd2lsbCB0ZXJtaW5hdGUKKy8vIHRoZSBwcm9ncmFtIHdpdGggYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaWYgYWN0dWFsbHkgcnVuLiAgVGhpcyBpcyB1c2VmdWwKKy8vIHdoZW4gYSB2YWx1ZSBvZiB0eXBlIFQgaXMgbmVlZGVkIGZvciBjb21waWxhdGlvbiwgYnV0IHRoZSBzdGF0ZW1lbnQKKy8vIHdpbGwgbm90IHJlYWxseSBiZSBleGVjdXRlZCAob3Igd2UgZG9uJ3QgY2FyZSBpZiB0aGUgc3RhdGVtZW50CisvLyBjcmFzaGVzKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIFQgSW52YWxpZCgpIHsKKyAgQXNzZXJ0KGZhbHNlLCAiIiwgLTEsICJJbnRlcm5hbCBlcnJvcjogYXR0ZW1wdCB0byByZXR1cm4gaW52YWxpZCB2YWx1ZSIpOworICAvLyBUaGlzIHN0YXRlbWVudCBpcyB1bnJlYWNoYWJsZSwgYW5kIHdvdWxkIG5ldmVyIHRlcm1pbmF0ZSBldmVuIGlmIGl0CisgIC8vIGNvdWxkIGJlIHJlYWNoZWQuIEl0IGlzIHByb3ZpZGVkIG9ubHkgdG8gcGxhY2F0ZSBjb21waWxlciB3YXJuaW5ncworICAvLyBhYm91dCBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnRzLgorICByZXR1cm4gSW52YWxpZDxUPigpOworfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKy8vIEdpdmVuIGEgcmF3IHR5cGUgKGkuZS4gaGF2aW5nIG5vIHRvcC1sZXZlbCByZWZlcmVuY2Ugb3IgY29uc3QKKy8vIG1vZGlmaWVyKSBSYXdDb250YWluZXIgdGhhdCdzIGVpdGhlciBhbiBTVEwtc3R5bGUgY29udGFpbmVyIG9yIGEKKy8vIG5hdGl2ZSBhcnJheSwgY2xhc3MgU3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IGhhcyB0aGUKKy8vIGZvbGxvd2luZyBtZW1iZXJzOgorLy8KKy8vICAgLSB0eXBlIGlzIGEgdHlwZSB0aGF0IHByb3ZpZGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgdmlldyB0bworLy8gICAgIChpLmUuIGltcGxlbWVudHMgdGhlIFNUTCBjb250YWluZXIgY29uY2VwdCBmb3IpIFJhd0NvbnRhaW5lcjsKKy8vICAgLSBjb25zdF9yZWZlcmVuY2UgaXMgYSB0eXBlIHRoYXQgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBjb25zdAorLy8gICAgIFJhd0NvbnRhaW5lcjsKKy8vICAgLSBDb25zdFJlZmVyZW5jZShyYXdfY29udGFpbmVyKSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIGFuIFNUTC1zdHlsZQorLy8gICAgIGNvbnRhaW5lciB2aWV3IHRvIHJhd19jb250YWluZXIsIHdoaWNoIGlzIGEgUmF3Q29udGFpbmVyLgorLy8gICAtIENvcHkocmF3X2NvbnRhaW5lcikgcmV0dXJucyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHZpZXcgb2YgYQorLy8gICAgIGNvcHkgb2YgcmF3X2NvbnRhaW5lciwgd2hpY2ggaXMgYSBSYXdDb250YWluZXIuCisvLworLy8gVGhpcyBnZW5lcmljIHZlcnNpb24gaXMgdXNlZCB3aGVuIFJhd0NvbnRhaW5lciBpdHNlbGYgaXMgYWxyZWFkeSBhbgorLy8gU1RMLXN0eWxlIGNvbnRhaW5lci4KK3RlbXBsYXRlIDxjbGFzcyBSYXdDb250YWluZXI+CitjbGFzcyBTdGxDb250YWluZXJWaWV3IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUmF3Q29udGFpbmVyIHR5cGU7CisgIHR5cGVkZWYgY29uc3QgdHlwZSYgY29uc3RfcmVmZXJlbmNlOworCisgIHN0YXRpYyBjb25zdF9yZWZlcmVuY2UgQ29uc3RSZWZlcmVuY2UoY29uc3QgUmF3Q29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgICAvLyBFbnN1cmVzIHRoYXQgUmF3Q29udGFpbmVyIGlzIG5vdCBhIGNvbnN0IHR5cGUuCisgICAgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPFJhd0NvbnRhaW5lciwKKyAgICAgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhSYXdDb250YWluZXIpPigpOworICAgIHJldHVybiBjb250YWluZXI7CisgIH0KKyAgc3RhdGljIHR5cGUgQ29weShjb25zdCBSYXdDb250YWluZXImIGNvbnRhaW5lcikgeyByZXR1cm4gY29udGFpbmVyOyB9Cit9OworCisvLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgd2hlbiBSYXdDb250YWluZXIgaXMgYSBuYXRpdmUgYXJyYXkgdHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50LCBzaXplX3QgTj4KK2NsYXNzIFN0bENvbnRhaW5lclZpZXc8RWxlbWVudFtOXT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKEVsZW1lbnQpIFJhd0VsZW1lbnQ7CisgIHR5cGVkZWYgaW50ZXJuYWw6Ok5hdGl2ZUFycmF5PFJhd0VsZW1lbnQ+IHR5cGU7CisgIC8vIE5hdGl2ZUFycmF5PFQ+IGNhbiByZXByZXNlbnQgYSBuYXRpdmUgYXJyYXkgZWl0aGVyIGJ5IHZhbHVlIG9yIGJ5CisgIC8vIHJlZmVyZW5jZSAoc2VsZWN0ZWQgYnkgYSBjb25zdHJ1Y3RvciBhcmd1bWVudCksIHNvICdjb25zdCB0eXBlJworICAvLyBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYSBjb25zdCBuYXRpdmUgYXJyYXkuICBXZSBjYW5ub3QKKyAgLy8gJ3R5cGVkZWYgY29uc3QgdHlwZSYgY29uc3RfcmVmZXJlbmNlJyBoZXJlLCBhcyB0aGF0IHdvdWxkIG1lYW4KKyAgLy8gQ29uc3RSZWZlcmVuY2UoKSBoYXMgdG8gcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGEgbG9jYWwgdmFyaWFibGUuCisgIHR5cGVkZWYgY29uc3QgdHlwZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgc3RhdGljIGNvbnN0X3JlZmVyZW5jZSBDb25zdFJlZmVyZW5jZShjb25zdCBFbGVtZW50ICgmYXJyYXkpW05dKSB7CisgICAgLy8gRW5zdXJlcyB0aGF0IEVsZW1lbnQgaXMgbm90IGEgY29uc3QgdHlwZS4KKyAgICB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8RWxlbWVudCwgUmF3RWxlbWVudD4oKTsKKyNpZiBHVEVTVF9PU19TWU1CSUFOCisgICAgLy8gVGhlIE5va2lhIFN5bWJpYW4gY29tcGlsZXIgY29uZnVzZXMgaXRzZWxmIGluIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgICAvLyBmb3IgdGhpcyBjYWxsIHdpdGhvdXQgdGhlIGNhc3QgdG8gRWxlbWVudCo6CisgICAgLy8gZnVuY3Rpb24gY2FsbCAnW3Rlc3Rpbmc6OmludGVybmFsOjpOYXRpdmVBcnJheTxjaGFyICo+XS5OYXRpdmVBcnJheSgKKyAgICAvLyAgICAge2x2YWx9IGNvbnN0IGNoYXIgKls0XSwgbG9uZywgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2UpJworICAgIC8vICAgICBkb2VzIG5vdCBtYXRjaAorICAgIC8vICd0ZXN0aW5nOjppbnRlcm5hbDo6TmF0aXZlQXJyYXk8Y2hhciAqPjo6TmF0aXZlQXJyYXkoCisgICAgLy8gICAgIGNoYXIgKmNvbnN0ICosIHVuc2lnbmVkIGludCwgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2UpJworICAgIC8vIChpbnN0YW50aWF0aW5nOiAndGVzdGluZzo6aW50ZXJuYWw6OkNvbnRhaW5zTWF0Y2hlckltcGwKKyAgICAvLyAgICAgPGNvbnN0IGNoYXIgKiAoJilbNF0+OjpNYXRjaGVzKGNvbnN0IGNoYXIgKiAoJilbNF0pIGNvbnN0JykKKyAgICAvLyAoaW5zdGFudGlhdGluZzogJ3Rlc3Rpbmc6OmludGVybmFsOjpTdGxDb250YWluZXJWaWV3PGNoYXIgKls0XT46OgorICAgIC8vICAgICBDb25zdFJlZmVyZW5jZShjb25zdCBjaGFyICogKCYpWzRdKScpCisgICAgLy8gKGFuZCB0aG91Z2ggdGhlIE4gcGFyYW1ldGVyIHR5cGUgaXMgbWlzbWF0Y2hlZCBpbiB0aGUgYWJvdmUgZXhwbGljaXQKKyAgICAvLyBjb252ZXJzaW9uIG9mIGl0IGRvZXNuJ3QgaGVscCAtIG9ubHkgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGFycmF5KS4KKyAgICByZXR1cm4gdHlwZShjb25zdF9jYXN0PEVsZW1lbnQqPigmYXJyYXlbMF0pLCBOLAorICAgICAgICAgICAgICAgIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7CisjZWxzZQorICAgIHJldHVybiB0eXBlKGFycmF5LCBOLCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCisgIH0KKyAgc3RhdGljIHR5cGUgQ29weShjb25zdCBFbGVtZW50ICgmYXJyYXkpW05dKSB7CisjaWYgR1RFU1RfT1NfU1lNQklBTgorICAgIHJldHVybiB0eXBlKGNvbnN0X2Nhc3Q8RWxlbWVudCo+KCZhcnJheVswXSksIE4sIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KCkpOworI2Vsc2UKKyAgICByZXR1cm4gdHlwZShhcnJheSwgTiwgUmVsYXRpb25Ub1NvdXJjZUNvcHkoKSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKyAgfQorfTsKKworLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIHdoZW4gUmF3Q29udGFpbmVyIGlzIGEgbmF0aXZlIGFycmF5CisvLyByZXByZXNlbnRlZCBhcyBhIChwb2ludGVyLCBzaXplKSB0dXBsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50UG9pbnRlciwgdHlwZW5hbWUgU2l6ZT4KK2NsYXNzIFN0bENvbnRhaW5lclZpZXc8IDo6dGVzdGluZzo6dHVwbGU8RWxlbWVudFBvaW50ZXIsIFNpemU+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OlBvaW50ZWVPZjxFbGVtZW50UG9pbnRlcj46OnR5cGUpIFJhd0VsZW1lbnQ7CisgIHR5cGVkZWYgaW50ZXJuYWw6Ok5hdGl2ZUFycmF5PFJhd0VsZW1lbnQ+IHR5cGU7CisgIHR5cGVkZWYgY29uc3QgdHlwZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgc3RhdGljIGNvbnN0X3JlZmVyZW5jZSBDb25zdFJlZmVyZW5jZSgKKyAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8RWxlbWVudFBvaW50ZXIsIFNpemU+JiBhcnJheSkgeworICAgIHJldHVybiB0eXBlKGdldDwwPihhcnJheSksIGdldDwxPihhcnJheSksIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7CisgIH0KKyAgc3RhdGljIHR5cGUgQ29weShjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEVsZW1lbnRQb2ludGVyLCBTaXplPiYgYXJyYXkpIHsKKyAgICByZXR1cm4gdHlwZShnZXQ8MD4oYXJyYXkpLCBnZXQ8MT4oYXJyYXkpLCBSZWxhdGlvblRvU291cmNlQ29weSgpKTsKKyAgfQorfTsKKworLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIGluc3RhbnRpYXRpbmcKKy8vIFN0bENvbnRhaW5lciB3aXRoIGEgcmVmZXJlbmNlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU3RsQ29udGFpbmVyVmlldzxUJj47CisKKy8vIEEgdHlwZSB0cmFuc2Zvcm0gdG8gcmVtb3ZlIGNvbnN0bmVzcyBmcm9tIHRoZSBmaXJzdCBwYXJ0IG9mIGEgcGFpci4KKy8vIFBhaXJzIGxpa2UgdGhhdCBhcmUgdXNlZCBhcyB0aGUgdmFsdWVfdHlwZSBvZiBhc3NvY2lhdGl2ZSBjb250YWluZXJzLAorLy8gYW5kIHRoaXMgdHJhbnNmb3JtIHByb2R1Y2VzIGEgc2ltaWxhciBidXQgYXNzaWduYWJsZSBwYWlyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlQ29uc3RGcm9tS2V5IHsKKyAgdHlwZWRlZiBUIHR5cGU7Cit9OworCisvLyBQYXJ0aWFsbHkgc3BlY2lhbGl6ZWQgdG8gcmVtb3ZlIGNvbnN0bmVzcyBmcm9tIHN0ZDo6cGFpcjxjb25zdCBLLCBWPi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorc3RydWN0IFJlbW92ZUNvbnN0RnJvbUtleTxzdGQ6OnBhaXI8Y29uc3QgSywgVj4gPiB7CisgIHR5cGVkZWYgc3RkOjpwYWlyPEssIFY+IHR5cGU7Cit9OworCisvLyBNYXBwaW5nIGZyb20gYm9vbGVhbnMgdG8gdHlwZXMuIFNpbWlsYXIgdG8gYm9vc3Q6OmJvb2xfPGtWYWx1ZT4gYW5kCisvLyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGtWYWx1ZT4uCit0ZW1wbGF0ZSA8Ym9vbCBrVmFsdWU+CitzdHJ1Y3QgQm9vbGVhbkNvbnN0YW50IHt9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19JTlRFUk5BTF9VVElMU19IXworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmNGE2OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaApAQCAtMCwwICsxLDkxIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2YWRpbWJAZ29vZ2xlLmNvbSAoVmFkaW0gQmVybWFuKQorLy8KKy8vIExvdy1sZXZlbCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBwb3J0aW5nIEdvb2dsZSBNb2NrIHRvIHZhcmlvdXMKKy8vIHBsYXRmb3Jtcy4gIEFsbCBtYWNyb3MgZW5kaW5nIHdpdGggXyBhbmQgc3ltYm9scyBkZWZpbmVkIGluIGFuCisvLyBpbnRlcm5hbCBuYW1lc3BhY2UgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiAgQ29kZQorLy8gb3V0c2lkZSBHb29nbGUgTW9jayBNVVNUIE5PVCBVU0UgVEhFTSBESVJFQ1RMWS4gIE1hY3JvcyB0aGF0IGRvbid0CisvLyBlbmQgd2l0aCBfIGFyZSBwYXJ0IG9mIEdvb2dsZSBNb2NrJ3MgcHVibGljIEFQSSBhbmQgY2FuIGJlIHVzZWQgYnkKKy8vIGNvZGUgb3V0c2lkZSBHb29nbGUgTW9jay4KKworI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX1BPUlRfSF8KKyNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19QT1JUX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLy8gTW9zdCBvZiB0aGUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgcG9ydGluZyBHb29nbGUgTW9jayBhcmUgYWxzbworLy8gcmVxdWlyZWQgZm9yIEdvb2dsZSBUZXN0IGFuZCBhcmUgZGVmaW5lZCBpbiBndGVzdC1wb3J0LmguCisvLworLy8gTm90ZSB0byBtYWludGFpbmVyczogdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24sIHByZWZlciBhZGRpbmcKKy8vIHBvcnRhYmlsaXR5IHV0aWxpdGllcyB0byBHb29nbGUgVGVzdCdzIGd0ZXN0LXBvcnQuaCBpbnN0ZWFkIG9mCisvLyBoZXJlLCBhcyBHb29nbGUgTW9jayBkZXBlbmRzIG9uIEdvb2dsZSBUZXN0LiAgT25seSBhZGQgYSB1dGlsaXR5CisvLyBoZXJlIGlmIGl0J3MgdHJ1bHkgc3BlY2lmaWMgdG8gR29vZ2xlIE1vY2suCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stcG9ydC5oIgorCisvLyBUbyBhdm9pZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBldmVyeXdoZXJlLCB3ZSBtYWtlIGl0CisvLyBnbW9jay1wb3J0LmgncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSB0aGUgaGVhZGVyIGltcGxlbWVudGluZworLy8gdHIxL3R1cGxlLiAgZ21vY2stcG9ydC5oIGRvZXMgdGhpcyB2aWEgZ3Rlc3QtcG9ydC5oLCB3aGljaCBpcworLy8gZ3VhcmFudGVlZCB0byBwdWxsIGluIHRoZSB0dXBsZSBoZWFkZXIuCisKKy8vIEZvciBNUyBWaXN1YWwgQysrLCBjaGVjayB0aGUgY29tcGlsZXIgdmVyc2lvbi4gQXQgbGVhc3QgVlMgMjAwMyBpcworLy8gcmVxdWlyZWQgdG8gY29tcGlsZSBHb29nbGUgTW9jay4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDEzMTAKKyMgZXJyb3IgIkF0IGxlYXN0IFZpc3VhbCBDKysgMjAwMyAoNy4xKSBpcyByZXF1aXJlZCB0byBjb21waWxlIEdvb2dsZSBNb2NrLiIKKyNlbmRpZgorCisvLyBNYWNybyBmb3IgcmVmZXJlbmNpbmcgZmxhZ3MuICBUaGlzIGlzIHB1YmxpYyBhcyB3ZSB3YW50IHRoZSB1c2VyIHRvCisvLyB1c2UgdGhpcyBzeW50YXggdG8gcmVmZXJlbmNlIEdvb2dsZSBNb2NrIGZsYWdzLgorI2RlZmluZSBHTU9DS19GTEFHKG5hbWUpIEZMQUdTX2dtb2NrXyMjbmFtZQorCisjaWYgIWRlZmluZWQoR01PQ0tfREVDTEFSRV9ib29sXykKKworLy8gTWFjcm9zIGZvciBkZWNsYXJpbmcgZmxhZ3MuCisjZGVmaW5lIEdNT0NLX0RFQ0xBUkVfYm9vbF8obmFtZSkgZXh0ZXJuIEdURVNUX0FQSV8gYm9vbCBHTU9DS19GTEFHKG5hbWUpCisjZGVmaW5lIEdNT0NLX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwKKyAgICBleHRlcm4gR1RFU1RfQVBJXyA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHTU9DS19GTEFHKG5hbWUpCisjZGVmaW5lIEdNT0NLX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcCisgICAgZXh0ZXJuIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHTU9DS19GTEFHKG5hbWUpCisKKy8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuCisjZGVmaW5lIEdNT0NLX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyBib29sIEdNT0NLX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIEdNT0NLX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR01PQ0tfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKKyNkZWZpbmUgR01PQ0tfREVGSU5FX3N0cmluZ18obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHTU9DS19GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorCisjZW5kaWYgIC8vICFkZWZpbmVkKEdNT0NLX0RFQ0xBUkVfYm9vbF8pCisKKyNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19QT1JUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbWFrZS9NYWtlZmlsZSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9tYWtlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxY2MwZTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbWFrZS9NYWtlZmlsZQpAQCAtMCwwICsxLDEwMSBAQAorIyBBIHNhbXBsZSBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgYm90aCBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3QgYW5kCisjIHVzaW5nIHRoZW0gaW4gdXNlciB0ZXN0cy4gIFRoaXMgZmlsZSBpcyBzZWxmLWNvbnRhaW5lZCwgc28geW91IGRvbid0CisjIG5lZWQgdG8gdXNlIHRoZSBNYWtlZmlsZSBpbiBHb29nbGUgVGVzdCdzIHNvdXJjZSB0cmVlLiAgUGxlYXNlIHR3ZWFrCisjIGl0IHRvIHN1aXQgeW91ciBlbnZpcm9ubWVudCBhbmQgcHJvamVjdC4gIFlvdSBtYXkgd2FudCB0byBtb3ZlIGl0IHRvCisjIHlvdXIgcHJvamVjdCdzIHJvb3QgZGlyZWN0b3J5LgorIworIyBTWU5PUFNJUzoKKyMKKyMgICBtYWtlIFthbGxdICAtIG1ha2VzIGV2ZXJ5dGhpbmcuCisjICAgbWFrZSBUQVJHRVQgLSBtYWtlcyB0aGUgZ2l2ZW4gdGFyZ2V0LgorIyAgIG1ha2UgY2xlYW4gIC0gcmVtb3ZlcyBhbGwgZmlsZXMgZ2VuZXJhdGVkIGJ5IG1ha2UuCisKKyMgUGxlYXNlIHR3ZWFrIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMgYXMgbmVlZGVkIGJ5IHlvdXIKKyMgcHJvamVjdCwgZXhjZXB0IEdNT0NLX0hFQURFUlMgYW5kIEdURVNUX0hFQURFUlMsIHdoaWNoIHlvdSBjYW4gdXNlCisjIGluIHlvdXIgb3duIHRhcmdldHMgYnV0IHNob3VsZG4ndCBtb2RpZnkuCisKKyMgUG9pbnRzIHRvIHRoZSByb290IG9mIEdvb2dsZSBUZXN0LCByZWxhdGl2ZSB0byB3aGVyZSB0aGlzIGZpbGUgaXMuCisjIFJlbWVtYmVyIHRvIHR3ZWFrIHRoaXMgaWYgeW91IG1vdmUgdGhpcyBmaWxlLCBvciBpZiB5b3Ugd2FudCB0byB1c2UKKyMgYSBjb3B5IG9mIEdvb2dsZSBUZXN0IGF0IGEgZGlmZmVyZW50IGxvY2F0aW9uLgorR1RFU1RfRElSID0gLi4vZ3Rlc3QKKworIyBQb2ludHMgdG8gdGhlIHJvb3Qgb2YgR29vZ2xlIE1vY2ssIHJlbGF0aXZlIHRvIHdoZXJlIHRoaXMgZmlsZSBpcy4KKyMgUmVtZW1iZXIgdG8gdHdlYWsgdGhpcyBpZiB5b3UgbW92ZSB0aGlzIGZpbGUuCitHTU9DS19ESVIgPSAuLgorCisjIFdoZXJlIHRvIGZpbmQgdXNlciBjb2RlLgorVVNFUl9ESVIgPSAuLi90ZXN0CisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBwcmVwcm9jZXNzb3IuCisjIFNldCBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2sncyBoZWFkZXIgZGlyZWN0b3JpZXMgYXMgc3lzdGVtCisjIGRpcmVjdG9yaWVzLCBzdWNoIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgZ2VuZXJhdGUgd2FybmluZ3MgaW4KKyMgdGhlc2UgaGVhZGVycy4KK0NQUEZMQUdTICs9IC1pc3lzdGVtICQoR1RFU1RfRElSKS9pbmNsdWRlIC1pc3lzdGVtICQoR01PQ0tfRElSKS9pbmNsdWRlCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBDKysgY29tcGlsZXIuCitDWFhGTEFHUyArPSAtZyAtV2FsbCAtV2V4dHJhIC1wdGhyZWFkCisKKyMgQWxsIHRlc3RzIHByb2R1Y2VkIGJ5IHRoaXMgTWFrZWZpbGUuICBSZW1lbWJlciB0byBhZGQgbmV3IHRlc3RzIHlvdQorIyBjcmVhdGVkIHRvIHRoZSBsaXN0LgorVEVTVFMgPSBnbW9ja190ZXN0CisKKyMgQWxsIEdvb2dsZSBUZXN0IGhlYWRlcnMuICBVc3VhbGx5IHlvdSBzaG91bGRuJ3QgY2hhbmdlIHRoaXMKKyMgZGVmaW5pdGlvbi4KK0dURVNUX0hFQURFUlMgPSAkKEdURVNUX0RJUikvaW5jbHVkZS9ndGVzdC8qLmggXAorICAgICAgICAgICAgICAgICQoR1RFU1RfRElSKS9pbmNsdWRlL2d0ZXN0L2ludGVybmFsLyouaAorCisjIEFsbCBHb29nbGUgTW9jayBoZWFkZXJzLiBOb3RlIHRoYXQgYWxsIEdvb2dsZSBUZXN0IGhlYWRlcnMgYXJlCisjIGluY2x1ZGVkIGhlcmUgdG9vLCBhcyB0aGV5IGFyZSAjaW5jbHVkZWQgYnkgR29vZ2xlIE1vY2sgaGVhZGVycy4KKyMgVXN1YWxseSB5b3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24uCQorR01PQ0tfSEVBREVSUyA9ICQoR01PQ0tfRElSKS9pbmNsdWRlL2dtb2NrLyouaCBcCisgICAgICAgICAgICAgICAgJChHTU9DS19ESVIpL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvKi5oIFwKKyAgICAgICAgICAgICAgICAkKEdURVNUX0hFQURFUlMpCisKKyMgSG91c2Uta2VlcGluZyBidWlsZCB0YXJnZXRzLgorCithbGwgOiAkKFRFU1RTKQorCitjbGVhbiA6CisJcm0gLWYgJChURVNUUykgZ21vY2suYSBnbW9ja19tYWluLmEgKi5vCisKKyMgQnVpbGRzIGdtb2NrLmEgYW5kIGdtb2NrX21haW4uYS4gIFRoZXNlIGxpYnJhcmllcyBjb250YWluIGJvdGgKKyMgR29vZ2xlIE1vY2sgYW5kIEdvb2dsZSBUZXN0LiAgQSB0ZXN0IHNob3VsZCBsaW5rIHdpdGggZWl0aGVyIGdtb2NrLmEKKyMgb3IgZ21vY2tfbWFpbi5hLCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBkZWZpbmVzIGl0cyBvd24gbWFpbigpCisjIGZ1bmN0aW9uLiAgSXQncyBmaW5lIGlmIHlvdXIgdGVzdCBvbmx5IHVzZXMgZmVhdHVyZXMgZnJvbSBHb29nbGUKKyMgVGVzdCAoYW5kIG5vdCBHb29nbGUgTW9jaykuCisKKyMgVXN1YWxseSB5b3Ugc2hvdWxkbid0IHR3ZWFrIHN1Y2ggaW50ZXJuYWwgdmFyaWFibGVzLCBpbmRpY2F0ZWQgYnkgYQorIyB0cmFpbGluZyBfLgorR1RFU1RfU1JDU18gPSAkKEdURVNUX0RJUikvc3JjLyouY2MgJChHVEVTVF9ESVIpL3NyYy8qLmggJChHVEVTVF9IRUFERVJTKQorR01PQ0tfU1JDU18gPSAkKEdNT0NLX0RJUikvc3JjLyouY2MgJChHTU9DS19IRUFERVJTKQorCisjIEZvciBzaW1wbGljaXR5IGFuZCB0byBhdm9pZCBkZXBlbmRpbmcgb24gaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZgorIyBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3QsIHRoZSBkZXBlbmRlbmNpZXMgc3BlY2lmaWVkIGJlbG93IGFyZQorIyBjb25zZXJ2YXRpdmUgYW5kIG5vdCBvcHRpbWl6ZWQuICBUaGlzIGlzIGZpbmUgYXMgR29vZ2xlIE1vY2sgYW5kCisjIEdvb2dsZSBUZXN0IGNvbXBpbGUgZmFzdCBhbmQgZm9yIG9yZGluYXJ5IHVzZXJzIHRoZWlyIHNvdXJjZSByYXJlbHkKKyMgY2hhbmdlcy4KK2d0ZXN0LWFsbC5vIDogJChHVEVTVF9TUkNTXykKKwkkKENYWCkgJChDUFBGTEFHUykgLUkkKEdURVNUX0RJUikgLUkkKEdNT0NLX0RJUikgJChDWFhGTEFHUykgXAorICAgICAgICAgICAgLWMgJChHVEVTVF9ESVIpL3NyYy9ndGVzdC1hbGwuY2MKKworZ21vY2stYWxsLm8gOiAkKEdNT0NLX1NSQ1NfKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAtSSQoR1RFU1RfRElSKSAtSSQoR01PQ0tfRElSKSAkKENYWEZMQUdTKSBcCisgICAgICAgICAgICAtYyAkKEdNT0NLX0RJUikvc3JjL2dtb2NrLWFsbC5jYworCitnbW9ja19tYWluLm8gOiAkKEdNT0NLX1NSQ1NfKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAtSSQoR1RFU1RfRElSKSAtSSQoR01PQ0tfRElSKSAkKENYWEZMQUdTKSBcCisgICAgICAgICAgICAtYyAkKEdNT0NLX0RJUikvc3JjL2dtb2NrX21haW4uY2MKKworZ21vY2suYSA6IGdtb2NrLWFsbC5vIGd0ZXN0LWFsbC5vCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitnbW9ja19tYWluLmEgOiBnbW9jay1hbGwubyBndGVzdC1hbGwubyBnbW9ja19tYWluLm8KKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKKyMgQnVpbGRzIGEgc2FtcGxlIHRlc3QuCisKK2dtb2NrX3Rlc3QubyA6ICQoVVNFUl9ESVIpL2dtb2NrX3Rlc3QuY2MgJChHTU9DS19IRUFERVJTKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKFVTRVJfRElSKS9nbW9ja190ZXN0LmNjCisKK2dtb2NrX3Rlc3QgOiBnbW9ja190ZXN0Lm8gZ21vY2tfbWFpbi5hCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1scHRocmVhZCAkXiAtbyAkQApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAwNS9nbW9jay5zbG4gYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDA1L2dtb2NrLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzUyZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAwNS9nbW9jay5zbG4KQEAgLTAsMCArMSwzMiBAQAor77u/DQorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDA1DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnbW9jayIsICJnbW9jay52Y3Byb2oiLCAiezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ21vY2tfdGVzdCIsICJnbW9ja190ZXN0LnZjcHJvaiIsICJ7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnbW9ja19tYWluIiwgImdtb2NrX21haW4udmNwcm9qIiwgIntFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MzQ2ODFGMEQtQ0U0NS00MTVELUI1RjItNUM2NjJERkUzQkQ1fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0YxMEQyMkY4LUFDN0ItNDIxMy04NzIwLTYwOEU3RDg3OENEMn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtGMTBEMjJGOC1BQzdCLTQyMTMtODcyMC02MDhFN0Q4NzhDRDJ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0YxMEQyMkY4LUFDN0ItNDIxMy04NzIwLTYwOEU3RDg3OENEMn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7RTRFRjYxNEItMzBERi00OTU0LThDNTMtNTgwQTBCRjZCNTg5fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7RTRFRjYxNEItMzBERi00OTU0LThDNTMtNTgwQTBCRjZCNTg5fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDA1L2dtb2NrLnZjcHJvaiBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9tc3ZjLzIwMDUvZ21vY2sudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYmZlOTgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDA1L2dtb2NrLnZjcHJvagpAQCAtMCwwICsxLDE5MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjguMDAiDQorCU5hbWU9Imdtb2NrIg0KKwlQcm9qZWN0R1VJRD0iezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0iDQorCVJvb3ROYW1lc3BhY2U9Imdtb2NrIg0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKVwkKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlxnbW9ja19jb25maWcudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxpbmNsdWRlOy4uXC4uIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKVwkKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlxnbW9ja19jb25maWcudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGU7Li5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZ21vY2stYWxsLmNjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iJChHVGVzdERpcilcc3JjXGd0ZXN0LWFsbC5jYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoR1Rlc3REaXIpIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoR1Rlc3REaXIpIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJQdWJsaWMgSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ig0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlByaXZhdGUgSGVhZGVyIEZpbGVzIg0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDA1L2dtb2NrX2NvbmZpZy52c3Byb3BzIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAwNS9nbW9ja19jb25maWcudnNwcm9wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjY1Y2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAwNS9nbW9ja19jb25maWcudnNwcm9wcwpAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvcGVydHlTaGVldA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0iZ21vY2tfY29uZmlnIg0KKwk+DQorCTxUb29sDQorCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7JChHVGVzdERpcikvaW5jbHVkZSZxdW90OyINCisJLz4NCisJPFVzZXJNYWNybw0KKwkJTmFtZT0iR1Rlc3REaXIiDQorCQlWYWx1ZT0iLi4vLi4vZ3Rlc3QiDQorCS8+DQorPC9WaXN1YWxTdHVkaW9Qcm9wZXJ0eVNoZWV0Pg0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9tc3ZjLzIwMDUvZ21vY2tfbWFpbi52Y3Byb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDA1L2dtb2NrX21haW4udmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTA1YTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDA1L2dtb2NrX21haW4udmNwcm9qCkBAIC0wLDAgKzEsMTg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0iZ21vY2tfbWFpbiINCisJUHJvamVjdEdVSUQ9IntFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9Ig0KKwlSb290TmFtZXNwYWNlPSJnbW9ja19tYWluIg0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKVwkKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlxnbW9ja19jb25maWcudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKVwkKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLlxnbW9ja19jb25maWcudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwkJPFByb2plY3RSZWZlcmVuY2UNCisJCQlSZWZlcmVuY2VkUHJvamVjdElkZW50aWZpZXI9InszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9Ig0KKwkJCVJlbGF0aXZlUGF0aFRvUHJvamVjdD0iLlxnbW9jay52Y3Byb2oiDQorCQkvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcZ21vY2tfbWFpbi5jYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL2luY2x1ZGUiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vaW5jbHVkZSINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ig0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDA1L2dtb2NrX3Rlc3QudmNwcm9qIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAwNS9nbW9ja190ZXN0LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWUwMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAwNS9nbW9ja190ZXN0LnZjcHJvagpAQCAtMCwwICsxLDIwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjguMDAiDQorCU5hbWU9Imdtb2NrX3Rlc3QiDQorCVByb2plY3RHVUlEPSJ7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfSINCisJUm9vdE5hbWVzcGFjZT0iZ21vY2tfdGVzdCINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcilcJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii5cZ21vY2tfY29uZmlnLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvYmlnb2JqIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGU7Li5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpXCQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuXGdtb2NrX2NvbmZpZy52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9iaWdvYmoiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGluY2x1ZGU7Li5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0iDQorCQkJUmVsYXRpdmVQYXRoVG9Qcm9qZWN0PSIuXGdtb2NrX21haW4udmNwcm9qIg0KKwkJLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cdGVzdFxnbW9ja19hbGxfdGVzdC5jYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAxMC9nbW9jay5zbG4gYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDEwL2dtb2NrLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQ5NjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAxMC9nbW9jay5zbG4KQEAgLTAsMCArMSwzMiBAQAor77u/DQorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDANCisjIFZpc3VhbCBDKysgRXhwcmVzcyAyMDEwDQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJnbW9jayIsICJnbW9jay52Y3hwcm9qIiwgInszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImdtb2NrX3Rlc3QiLCAiZ21vY2tfdGVzdC52Y3hwcm9qIiwgIntGMTBEMjJGOC1BQzdCLTQyMTMtODcyMC02MDhFN0Q4NzhDRDJ9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImdtb2NrX21haW4iLCAiZ21vY2tfbWFpbi52Y3hwcm9qIiwgIntFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MzQ2ODFGMEQtQ0U0NS00MTVELUI1RjItNUM2NjJERkUzQkQ1fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXszNDY4MUYwRC1DRTQ1LTQxNUQtQjVGMi01QzY2MkRGRTNCRDV9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezM0NjgxRjBELUNFNDUtNDE1RC1CNUYyLTVDNjYyREZFM0JENX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0YxMEQyMkY4LUFDN0ItNDIxMy04NzIwLTYwOEU3RDg3OENEMn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtGMTBEMjJGOC1BQzdCLTQyMTMtODcyMC02MDhFN0Q4NzhDRDJ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0YxMEQyMkY4LUFDN0ItNDIxMy04NzIwLTYwOEU3RDg3OENEMn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7RjEwRDIyRjgtQUM3Qi00MjEzLTg3MjAtNjA4RTdEODc4Q0QyfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7RTRFRjYxNEItMzBERi00OTU0LThDNTMtNTgwQTBCRjZCNTg5fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0U0RUY2MTRCLTMwREYtNDk1NC04QzUzLTU4MEEwQkY2QjU4OX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7RTRFRjYxNEItMzBERi00OTU0LThDNTMtNTgwQTBCRjZCNTg5fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDEwL2dtb2NrLnZjeHByb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDEwL2dtb2NrLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhODVlZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9tc3ZjLzIwMTAvZ21vY2sudmN4cHJvagpAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57MzQ2ODFGMEQtQ0U0NS00MTVELUI1RjItNUM2NjJERkUzQkQ1fTwvUHJvamVjdEd1aWQ+DQorICAgIDxSb290TmFtZXNwYWNlPmdtb2NrPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iZ21vY2tfY29uZmlnLnByb3BzIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9Imdtb2NrX2NvbmZpZy5wcm9wcyIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChPdXREaXIpJChQcm9qZWN0TmFtZSlcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpXDwvSW50RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlxpbmNsdWRlOy4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cc3JjXGdtb2NrLWFsbC5jYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKEdUZXN0RGlyKVxzcmNcZ3Rlc3QtYWxsLmNjIj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChHVGVzdERpcik7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKEdUZXN0RGlyKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDEwL2dtb2NrX2NvbmZpZy5wcm9wcyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9tc3ZjLzIwMTAvZ21vY2tfY29uZmlnLnByb3BzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNDk3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDEwL2dtb2NrX2NvbmZpZy5wcm9wcwpAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiPg0KKyAgICA8R1Rlc3REaXI+Li4vLi4vZ3Rlc3Q8L0dUZXN0RGlyPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoR1Rlc3REaXIpL2luY2x1ZGU7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8QnVpbGRNYWNybyBJbmNsdWRlPSJHVGVzdERpciI+DQorICAgICAgPFZhbHVlPiQoR1Rlc3REaXIpPC9WYWx1ZT4NCisgICAgPC9CdWlsZE1hY3JvPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9tc3ZjLzIwMTAvZ21vY2tfbWFpbi52Y3hwcm9qIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAxMC9nbW9ja19tYWluLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmZWNkNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9tc3ZjLzIwMTAvZ21vY2tfbWFpbi52Y3hwcm9qCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPntFNEVGNjE0Qi0zMERGLTQ5NTQtOEM1My01ODBBMEJGNkI1ODl9PC9Qcm9qZWN0R3VpZD4NCisgICAgPFJvb3ROYW1lc3BhY2U+Z21vY2tfbWFpbjwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9Imdtb2NrX2NvbmZpZy5wcm9wcyIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgICAgPEltcG9ydCBQcm9qZWN0PSJnbW9ja19jb25maWcucHJvcHMiIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDMxOS4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoT3V0RGlyKSQoUHJvamVjdE5hbWUpXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKE91dERpcikkKFByb2plY3ROYW1lKVw8L0ludERpcj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li4vLi4vaW5jbHVkZTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLy4uL2luY2x1ZGU7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSJnbW9jay52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57MzQ2ODFmMGQtY2U0NS00MTVkLWI1ZjItNWM2NjJkZmUzYmQ1fTwvUHJvamVjdD4NCisgICAgICA8Q29weUxvY2FsU2F0ZWxsaXRlQXNzZW1ibGllcz50cnVlPC9Db3B5TG9jYWxTYXRlbGxpdGVBc3NlbWJsaWVzPg0KKyAgICAgIDxSZWZlcmVuY2VPdXRwdXRBc3NlbWJseT50cnVlPC9SZWZlcmVuY2VPdXRwdXRBc3NlbWJseT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHNyY1xnbW9ja19tYWluLmNjIj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Li4vLi4vaW5jbHVkZTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPi4uLy4uL2luY2x1ZGU7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgPC9DbENvbXBpbGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAxMC9nbW9ja190ZXN0LnZjeHByb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svbXN2Yy8yMDEwL2dtb2NrX3Rlc3QudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU0MzllCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL21zdmMvMjAxMC9nbW9ja190ZXN0LnZjeHByb2oKQEAgLTAsMCArMSwxMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPntGMTBEMjJGOC1BQzdCLTQyMTMtODcyMC02MDhFN0Q4NzhDRDJ9PC9Qcm9qZWN0R3VpZD4NCisgICAgPFJvb3ROYW1lc3BhY2U+Z21vY2tfdGVzdDwvUm9vdE5hbWVzcGFjZT4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iZ21vY2tfY29uZmlnLnByb3BzIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9Imdtb2NrX2NvbmZpZy5wcm9wcyIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMzE5LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChPdXREaXIpJChQcm9qZWN0TmFtZSlcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChPdXREaXIpJChQcm9qZWN0TmFtZSlcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L2JpZ29iaiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXGluY2x1ZGU7Li5cLi47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L2JpZ29iaiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5caW5jbHVkZTsuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iZ21vY2tfbWFpbi52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57ZTRlZjYxNGItMzBkZi00OTU0LThjNTMtNTgwYTBiZjZiNTg5fTwvUHJvamVjdD4NCisgICAgICA8Q29weUxvY2FsU2F0ZWxsaXRlQXNzZW1ibGllcz50cnVlPC9Db3B5TG9jYWxTYXRlbGxpdGVBc3NlbWJsaWVzPg0KKyAgICAgIDxSZWZlcmVuY2VPdXRwdXRBc3NlbWJseT50cnVlPC9SZWZlcmVuY2VPdXRwdXRBc3NlbWJseT4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHRlc3RcZ21vY2tfYWxsX3Rlc3QuY2MiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZnVzZV9nbW9ja19maWxlcy5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2Z1c2VfZ21vY2tfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmMwYmFmNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2Z1c2VfZ21vY2tfZmlsZXMucHkKQEAgLTAsMCArMSwyNDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiImZ1c2VfZ21vY2tfZmlsZXMucHkgdjAuMS4wCitGdXNlcyBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3Qgc291cmNlIGNvZGUgaW50byB0d28gLmggZmlsZXMgYW5kIGEgLmNjIGZpbGUuCisKK1NZTk9QU0lTCisgICAgICAgZnVzZV9nbW9ja19maWxlcy5weSBbR01PQ0tfUk9PVF9ESVJdIE9VVFBVVF9ESVIKKworICAgICAgIFNjYW5zIEdNT0NLX1JPT1RfRElSIGZvciBHb29nbGUgTW9jayBhbmQgR29vZ2xlIFRlc3Qgc291cmNlCisgICAgICAgY29kZSwgYXNzdW1pbmcgR29vZ2xlIFRlc3QgaXMgaW4gdGhlIEdNT0NLX1JPT1RfRElSL2d0ZXN0CisgICAgICAgc3ViLWRpcmVjdG9yeSwgYW5kIGdlbmVyYXRlcyB0aHJlZSBmaWxlczoKKyAgICAgICBPVVRQVVRfRElSL2d0ZXN0L2d0ZXN0LmgsIE9VVFBVVF9ESVIvZ21vY2svZ21vY2suaCwgYW5kCisgICAgICAgT1VUUFVUX0RJUi9nbW9jay1ndGVzdC1hbGwuY2MuICBUaGVuIHlvdSBjYW4gYnVpbGQgeW91ciB0ZXN0cworICAgICAgIGJ5IGFkZGluZyBPVVRQVVRfRElSIHRvIHRoZSBpbmNsdWRlIHNlYXJjaCBwYXRoIGFuZCBsaW5raW5nCisgICAgICAgd2l0aCBPVVRQVVRfRElSL2dtb2NrLWd0ZXN0LWFsbC5jYy4gIFRoZXNlIHRocmVlIGZpbGVzIGNvbnRhaW4KKyAgICAgICBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIHVzZSBHb29nbGUgTW9jay4gIEhlbmNlIHlvdSBjYW4KKyAgICAgICAiaW5zdGFsbCIgR29vZ2xlIE1vY2sgYnkgY29weWluZyB0aGVtIHRvIHdoZXJldmVyIHlvdSB3YW50LgorCisgICAgICAgR01PQ0tfUk9PVF9ESVIgY2FuIGJlIG9taXR0ZWQgYW5kIGRlZmF1bHRzIHRvIHRoZSBwYXJlbnQKKyAgICAgICBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoaXMgc2NyaXB0LgorCitFWEFNUExFUworICAgICAgIC4vZnVzZV9nbW9ja19maWxlcy5weSBmdXNlZF9nbW9jaworICAgICAgIC4vZnVzZV9nbW9ja19maWxlcy5weSBwYXRoL3RvL3VucGFja2VkL2dtb2NrIGZ1c2VkX2dtb2NrCisKK1RoaXMgdG9vbCBpcyBleHBlcmltZW50YWwuICBJbiBwYXJ0aWN1bGFyLCBpdCBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgbm8KK2NvbmRpdGlvbmFsIGluY2x1c2lvbiBvZiBHb29nbGUgTW9jayBvciBHb29nbGUgVGVzdCBoZWFkZXJzLiAgUGxlYXNlCityZXBvcnQgYW55IHByb2JsZW1zIHRvIGdvb2dsZW1vY2tAZ29vZ2xlZ3JvdXBzLmNvbS4gIFlvdSBjYW4gcmVhZAoraHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzZXRzCitpbXBvcnQgc3lzCisKKyMgV2UgYXNzdW1lIHRoYXQgdGhpcyBmaWxlIGlzIGluIHRoZSBzY3JpcHRzLyBkaXJlY3RvcnkgaW4gdGhlIEdvb2dsZQorIyBNb2NrIHJvb3QgZGlyZWN0b3J5LgorREVGQVVMVF9HTU9DS19ST09UX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnLi4nKQorCisjIFdlIG5lZWQgdG8gY2FsbCBpbnRvIGd0ZXN0L3NjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weS4KK3N5cy5wYXRoLmFwcGVuZChvcy5wYXRoLmpvaW4oREVGQVVMVF9HTU9DS19ST09UX0RJUiwgJ2d0ZXN0L3NjcmlwdHMnKSkKK2ltcG9ydCBmdXNlX2d0ZXN0X2ZpbGVzCitndGVzdCA9IGZ1c2VfZ3Rlc3RfZmlsZXMKKworIyBSZWdleCBmb3IgbWF0Y2hpbmcgJyNpbmNsdWRlICJnbW9jay8uLi4iJy4KK0lOQ0xVREVfR01PQ0tfRklMRV9SRUdFWCA9IHJlLmNvbXBpbGUocideXHMqI1xzKmluY2x1ZGVccyoiKGdtb2NrLy4rKSInKQorCisjIFdoZXJlIHRvIGZpbmQgdGhlIHNvdXJjZSBzZWVkIGZpbGVzLgorR01PQ0tfSF9TRUVEID0gJ2luY2x1ZGUvZ21vY2svZ21vY2suaCcKK0dNT0NLX0FMTF9DQ19TRUVEID0gJ3NyYy9nbW9jay1hbGwuY2MnCisKKyMgV2hlcmUgdG8gcHV0IHRoZSBnZW5lcmF0ZWQgZmlsZXMuCitHVEVTVF9IX09VVFBVVCA9ICdndGVzdC9ndGVzdC5oJworR01PQ0tfSF9PVVRQVVQgPSAnZ21vY2svZ21vY2suaCcKK0dNT0NLX0dURVNUX0FMTF9DQ19PVVRQVVQgPSAnZ21vY2stZ3Rlc3QtYWxsLmNjJworCisKK2RlZiBHZXRHVGVzdFJvb3REaXIoZ21vY2tfcm9vdCk6CisgICIiIlJldHVybnMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIEdvb2dsZSBUZXN0LiIiIgorCisgIHJldHVybiBvcy5wYXRoLmpvaW4oZ21vY2tfcm9vdCwgJ2d0ZXN0JykKKworCitkZWYgVmFsaWRhdGVHTW9ja1Jvb3REaXIoZ21vY2tfcm9vdCk6CisgICIiIk1ha2VzIHN1cmUgZ21vY2tfcm9vdCBwb2ludHMgdG8gYSB2YWxpZCBnbW9jayByb290IGRpcmVjdG9yeS4KKworICBUaGUgZnVuY3Rpb24gYWJvcnRzIHRoZSBwcm9ncmFtIG9uIGZhaWx1cmUuCisgICIiIgorCisgIGd0ZXN0LlZhbGlkYXRlR1Rlc3RSb290RGlyKEdldEdUZXN0Um9vdERpcihnbW9ja19yb290KSkKKyAgZ3Rlc3QuVmVyaWZ5RmlsZUV4aXN0cyhnbW9ja19yb290LCBHTU9DS19IX1NFRUQpCisgIGd0ZXN0LlZlcmlmeUZpbGVFeGlzdHMoZ21vY2tfcm9vdCwgR01PQ0tfQUxMX0NDX1NFRUQpCisKKworZGVmIFZhbGlkYXRlT3V0cHV0RGlyKG91dHB1dF9kaXIpOgorICAiIiJNYWtlcyBzdXJlIG91dHB1dF9kaXIgcG9pbnRzIHRvIGEgdmFsaWQgb3V0cHV0IGRpcmVjdG9yeS4KKworICBUaGUgZnVuY3Rpb24gYWJvcnRzIHRoZSBwcm9ncmFtIG9uIGZhaWx1cmUuCisgICIiIgorCisgIGd0ZXN0LlZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgZ3Rlc3QuR1RFU1RfSF9PVVRQVVQpCisgIGd0ZXN0LlZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgR01PQ0tfSF9PVVRQVVQpCisgIGd0ZXN0LlZlcmlmeU91dHB1dEZpbGUob3V0cHV0X2RpciwgR01PQ0tfR1RFU1RfQUxMX0NDX09VVFBVVCkKKworCitkZWYgRnVzZUdNb2NrSChnbW9ja19yb290LCBvdXRwdXRfZGlyKToKKyAgIiIiU2NhbnMgZm9sZGVyIGdtb2NrX3Jvb3QgdG8gZ2VuZXJhdGUgZ21vY2svZ21vY2suaCBpbiBvdXRwdXRfZGlyLiIiIgorCisgIG91dHB1dF9maWxlID0gZmlsZShvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgR01PQ0tfSF9PVVRQVVQpLCAndycpCisgIHByb2Nlc3NlZF9maWxlcyA9IHNldHMuU2V0KCkgICMgSG9sZHMgYWxsIGdtb2NrIGhlYWRlcnMgd2UndmUgcHJvY2Vzc2VkLgorCisgIGRlZiBQcm9jZXNzRmlsZShnbW9ja19oZWFkZXJfcGF0aCk6CisgICAgIiIiUHJvY2Vzc2VzIHRoZSBnaXZlbiBnbW9jayBoZWFkZXIgZmlsZS4iIiIKKworICAgICMgV2UgZG9uJ3QgcHJvY2VzcyB0aGUgc2FtZSBoZWFkZXIgdHdpY2UuCisgICAgaWYgZ21vY2tfaGVhZGVyX3BhdGggaW4gcHJvY2Vzc2VkX2ZpbGVzOgorICAgICAgcmV0dXJuCisKKyAgICBwcm9jZXNzZWRfZmlsZXMuYWRkKGdtb2NrX2hlYWRlcl9wYXRoKQorCisgICAgIyBSZWFkcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGdtb2NrIGhlYWRlci4KKyAgICBmb3IgbGluZSBpbiBmaWxlKG9zLnBhdGguam9pbihnbW9ja19yb290LCBnbW9ja19oZWFkZXJfcGF0aCksICdyJyk6CisgICAgICBtID0gSU5DTFVERV9HTU9DS19GSUxFX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgICBpZiBtOgorICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJnbW9jay8uLi4iJyAtIGxldCdzIHByb2Nlc3MgaXQgcmVjdXJzaXZlbHkuCisgICAgICAgIFByb2Nlc3NGaWxlKCdpbmNsdWRlLycgKyBtLmdyb3VwKDEpKQorICAgICAgZWxzZToKKyAgICAgICAgbSA9IGd0ZXN0LklOQ0xVREVfR1RFU1RfRklMRV9SRUdFWC5tYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICMgSXQncyAnI2luY2x1ZGUgImd0ZXN0L2Zvby5oIicuICBXZSB0cmFuc2xhdGUgaXQgdG8KKyAgICAgICAgICAjICJndGVzdC9ndGVzdC5oIiwgcmVnYXJkbGVzcyBvZiB3aGF0IGZvbyBpcywgc2luY2UgYWxsCisgICAgICAgICAgIyBndGVzdCBoZWFkZXJzIGFyZSBmdXNlZCBpbnRvIGd0ZXN0L2d0ZXN0LmguCisKKyAgICAgICAgICAjIFRoZXJlIGlzIG5vIG5lZWQgdG8gI2luY2x1ZGUgZ3Rlc3QuaCB0d2ljZS4KKyAgICAgICAgICBpZiBub3QgZ3Rlc3QuR1RFU1RfSF9TRUVEIGluIHByb2Nlc3NlZF9maWxlczoKKyAgICAgICAgICAgIHByb2Nlc3NlZF9maWxlcy5hZGQoZ3Rlc3QuR1RFU1RfSF9TRUVEKQorICAgICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoJyNpbmNsdWRlICIlcyJcbicgJSAoZ3Rlc3QuR1RFU1RfSF9PVVRQVVQsKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAjIE90aGVyd2lzZSB3ZSBjb3B5IHRoZSBsaW5lIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0IGZpbGUuCisgICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUobGluZSkKKworICBQcm9jZXNzRmlsZShHTU9DS19IX1NFRUQpCisgIG91dHB1dF9maWxlLmNsb3NlKCkKKworCitkZWYgRnVzZUdNb2NrQWxsQ2NUb0ZpbGUoZ21vY2tfcm9vdCwgb3V0cHV0X2ZpbGUpOgorICAiIiJTY2FucyBmb2xkZXIgZ21vY2tfcm9vdCB0byBmdXNlIGdtb2NrLWFsbC5jYyBpbnRvIG91dHB1dF9maWxlLiIiIgorCisgIHByb2Nlc3NlZF9maWxlcyA9IHNldHMuU2V0KCkKKworICBkZWYgUHJvY2Vzc0ZpbGUoZ21vY2tfc291cmNlX2ZpbGUpOgorICAgICIiIlByb2Nlc3NlcyB0aGUgZ2l2ZW4gZ21vY2sgc291cmNlIGZpbGUuIiIiCisKKyAgICAjIFdlIGRvbid0IHByb2Nlc3MgdGhlIHNhbWUgI2luY2x1ZGVkIGZpbGUgdHdpY2UuCisgICAgaWYgZ21vY2tfc291cmNlX2ZpbGUgaW4gcHJvY2Vzc2VkX2ZpbGVzOgorICAgICAgcmV0dXJuCisKKyAgICBwcm9jZXNzZWRfZmlsZXMuYWRkKGdtb2NrX3NvdXJjZV9maWxlKQorCisgICAgIyBSZWFkcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGdtb2NrIHNvdXJjZSBmaWxlLgorICAgIGZvciBsaW5lIGluIGZpbGUob3MucGF0aC5qb2luKGdtb2NrX3Jvb3QsIGdtb2NrX3NvdXJjZV9maWxlKSwgJ3InKToKKyAgICAgIG0gPSBJTkNMVURFX0dNT0NLX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgIGlmIG06CisgICAgICAgICMgSXQncyAnI2luY2x1ZGUgImdtb2NrL2Zvby5oIicuICBXZSB0cmVhdCBpdCBhcyAnI2luY2x1ZGUKKyAgICAgICAgIyAiZ21vY2svZ21vY2suaCInLCBhcyBhbGwgb3RoZXIgZ21vY2sgaGVhZGVycyBhcmUgYmVpbmcgZnVzZWQKKyAgICAgICAgIyBpbnRvIGdtb2NrLmggYW5kIGNhbm5vdCBiZSAjaW5jbHVkZWQgZGlyZWN0bHkuCisKKyAgICAgICAgIyBUaGVyZSBpcyBubyBuZWVkIHRvICNpbmNsdWRlICJnbW9jay9nbW9jay5oIiBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgaWYgbm90IEdNT0NLX0hfU0VFRCBpbiBwcm9jZXNzZWRfZmlsZXM6CisgICAgICAgICAgcHJvY2Vzc2VkX2ZpbGVzLmFkZChHTU9DS19IX1NFRUQpCisgICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoJyNpbmNsdWRlICIlcyJcbicgJSAoR01PQ0tfSF9PVVRQVVQsKSkKKyAgICAgIGVsc2U6CisgICAgICAgIG0gPSBndGVzdC5JTkNMVURFX0dURVNUX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJndGVzdC8uLi4iJy4KKyAgICAgICAgICAjIFRoZXJlIGlzIG5vIG5lZWQgdG8gI2luY2x1ZGUgZ3Rlc3QuaCBhcyBpdCBoYXMgYmVlbgorICAgICAgICAgICMgI2luY2x1ZGVkIGJ5IGd0ZXN0LWFsbC5jYy4KKyAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgbSA9IGd0ZXN0LklOQ0xVREVfU1JDX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAic3JjL2ZvbyInIC0gbGV0J3MgcHJvY2VzcyBpdCByZWN1cnNpdmVseS4KKyAgICAgICAgICAgIFByb2Nlc3NGaWxlKG0uZ3JvdXAoMSkpCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgT3RoZXJ3aXNlIHdlIGNvcHkgdGhlIGxpbmUgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgICAgICAgIG91dHB1dF9maWxlLndyaXRlKGxpbmUpCisKKyAgUHJvY2Vzc0ZpbGUoR01PQ0tfQUxMX0NDX1NFRUQpCisKKworZGVmIEZ1c2VHTW9ja0dUZXN0QWxsQ2MoZ21vY2tfcm9vdCwgb3V0cHV0X2Rpcik6CisgICIiIlNjYW5zIGZvbGRlciBnbW9ja19yb290IHRvIGdlbmVyYXRlIGdtb2NrLWd0ZXN0LWFsbC5jYyBpbiBvdXRwdXRfZGlyLiIiIgorCisgIG91dHB1dF9maWxlID0gZmlsZShvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgR01PQ0tfR1RFU1RfQUxMX0NDX09VVFBVVCksICd3JykKKyAgIyBGaXJzdCwgZnVzZSBndGVzdC1hbGwuY2MgaW50byBnbW9jay1ndGVzdC1hbGwuY2MuCisgIGd0ZXN0LkZ1c2VHVGVzdEFsbENjVG9GaWxlKEdldEdUZXN0Um9vdERpcihnbW9ja19yb290KSwgb3V0cHV0X2ZpbGUpCisgICMgTmV4dCwgYXBwZW5kIGZ1c2VkIGdtb2NrLWFsbC5jYyB0byBnbW9jay1ndGVzdC1hbGwuY2MuCisgIEZ1c2VHTW9ja0FsbENjVG9GaWxlKGdtb2NrX3Jvb3QsIG91dHB1dF9maWxlKQorICBvdXRwdXRfZmlsZS5jbG9zZSgpCisKKworZGVmIEZ1c2VHTW9jayhnbW9ja19yb290LCBvdXRwdXRfZGlyKToKKyAgIiIiRnVzZXMgZ3Rlc3QuaCwgZ21vY2suaCwgYW5kIGdtb2NrLWd0ZXN0LWFsbC5oLiIiIgorCisgIFZhbGlkYXRlR01vY2tSb290RGlyKGdtb2NrX3Jvb3QpCisgIFZhbGlkYXRlT3V0cHV0RGlyKG91dHB1dF9kaXIpCisKKyAgZ3Rlc3QuRnVzZUdUZXN0SChHZXRHVGVzdFJvb3REaXIoZ21vY2tfcm9vdCksIG91dHB1dF9kaXIpCisgIEZ1c2VHTW9ja0goZ21vY2tfcm9vdCwgb3V0cHV0X2RpcikKKyAgRnVzZUdNb2NrR1Rlc3RBbGxDYyhnbW9ja19yb290LCBvdXRwdXRfZGlyKQorCisKK2RlZiBtYWluKCk6CisgIGFyZ2MgPSBsZW4oc3lzLmFyZ3YpCisgIGlmIGFyZ2MgPT0gMjoKKyAgICAjIGZ1c2VfZ21vY2tfZmlsZXMucHkgT1VUUFVUX0RJUgorICAgIEZ1c2VHTW9jayhERUZBVUxUX0dNT0NLX1JPT1RfRElSLCBzeXMuYXJndlsxXSkKKyAgZWxpZiBhcmdjID09IDM6CisgICAgIyBmdXNlX2dtb2NrX2ZpbGVzLnB5IEdNT0NLX1JPT1RfRElSIE9VVFBVVF9ESVIKKyAgICBGdXNlR01vY2soc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdKQorICBlbHNlOgorICAgIHByaW50IF9fZG9jX18KKyAgICBzeXMuZXhpdCgxKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL0xJQ0VOU0UgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2VhMDYzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL0xJQ0VOU0UKQEAgLTAsMCArMSwyMDMgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFsyMDA3XSBOZWFsIE5vcndpdHoKKyAgIFBvcnRpb25zIENvcHlyaWdodCBbMjAwN10gR29vZ2xlIEluYy4KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2dlbmVyYXRvci9SRUFETUUgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Zjk1OTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvUkVBRE1FCkBAIC0wLDAgKzEsMzUgQEAKKworVGhlIEdvb2dsZSBNb2NrIGNsYXNzIGdlbmVyYXRvciBpcyBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIHBhcnQgb2YgY3BwY2xlYW4uCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjcHBjbGVhbiwgc2VlIHRoZSBSRUFETUUuY3BwY2xlYW4gZmlsZSBvcgordmlzaXQgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NwcGNsZWFuLworCitjcHBjbGVhbiByZXF1aXJlcyBQeXRob24gMi4zLjUgb3IgbGF0ZXIuICBJZiB5b3UgZG9uJ3QgaGF2ZSBQeXRob24gaW5zdGFsbGVkCitvbiB5b3VyIHN5c3RlbSwgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGluc3RhbGwgaXQuICBZb3UgY2FuIGRvd25sb2FkIFB5dGhvbgorZnJvbTogIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9yZWxlYXNlcy8KKworVG8gdXNlIHRoZSBHb29nbGUgTW9jayBjbGFzcyBnZW5lcmF0b3IsIHlvdSBuZWVkIHRvIGNhbGwgaXQKK29uIHRoZSBjb21tYW5kIGxpbmUgcGFzc2luZyB0aGUgaGVhZGVyIGZpbGUgYW5kIGNsYXNzIGZvciB3aGljaCB5b3Ugd2FudAordG8gZ2VuZXJhdGUgYSBHb29nbGUgTW9jayBjbGFzcy4KKworTWFrZSBzdXJlIHRvIGluc3RhbGwgdGhlIHNjcmlwdHMgc29tZXdoZXJlIGluIHlvdXIgcGF0aC4gIFRoZW4geW91IGNhbgorcnVuIHRoZSBwcm9ncmFtLgorCisgIGdtb2NrX2dlbi5weSBoZWFkZXItZmlsZS5oIFtDbGFzc05hbWVdLi4uCisKK0lmIG5vIENsYXNzTmFtZXMgYXJlIHNwZWNpZmllZCwgYWxsIGNsYXNzZXMgaW4gdGhlIGZpbGUgYXJlIGVtaXR0ZWQuCisKK1RvIGNoYW5nZSB0aGUgaW5kZW50YXRpb24gZnJvbSB0aGUgZGVmYXVsdCBvZiAyLCBzZXQgSU5ERU5UIGluCit0aGUgZW52aXJvbm1lbnQuICBGb3IgZXhhbXBsZSB0byB1c2UgYW4gaW5kZW50IG9mIDQgc3BhY2VzOgorCitJTkRFTlQ9NCBnbW9ja19nZW4ucHkgaGVhZGVyLWZpbGUuaCBDbGFzc05hbWUKKworVGhpcyB2ZXJzaW9uIHdhcyBtYWRlIGZyb20gU1ZOIHJldmlzaW9uIDI4MSBpbiB0aGUgY3BwY2xlYW4gcmVwb3NpdG9yeS4KKworS25vd24gTGltaXRhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tCitOb3QgYWxsIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgcHJvcGVybHkuICBGb3IgZXhhbXBsZSwgd2hlbiBtb2NraW5nIHRlbXBsYXRlZAorY2xhc3NlcywgdGhlIHRlbXBsYXRlIGluZm9ybWF0aW9uIGlzIGxvc3QuICBZb3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgdGVtcGxhdGUKK2luZm9ybWF0aW9uIG1hbnVhbGx5LgorCitOb3QgYWxsIHBlcm11dGF0aW9ucyBvZiB1c2luZyBtdWx0aXBsZSBwb2ludGVycy9yZWZlcmVuY2VzIHdpbGwgYmUgcmVuZGVyZWQKK3Byb3Blcmx5LiAgVGhlc2Ugd2lsbCBhbHNvIGhhdmUgdG8gYmUgZml4ZWQgbWFudWFsbHkuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvUkVBRE1FLmNwcGNsZWFuIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL1JFQURNRS5jcHBjbGVhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTQzMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL1JFQURNRS5jcHBjbGVhbgpAQCAtMCwwICsxLDExNSBAQAorR29hbDoKKy0tLS0tCisgIENwcENsZWFuIGF0dGVtcHRzIHRvIGZpbmQgcHJvYmxlbXMgaW4gQysrIHNvdXJjZSB0aGF0IHNsb3cgZGV2ZWxvcG1lbnQKKyAgaW4gbGFyZ2UgY29kZSBiYXNlcywgZm9yIGV4YW1wbGUgdmFyaW91cyBmb3JtcyBvZiB1bnVzZWQgY29kZS4KKyAgVW51c2VkIGNvZGUgY2FuIGJlIHVudXNlZCBmdW5jdGlvbnMsIG1ldGhvZHMsIGRhdGEgbWVtYmVycywgdHlwZXMsIGV0YworICB0byB1bm5lY2Vzc2FyeSAjaW5jbHVkZSBkaXJlY3RpdmVzLiAgVW5uZWNlc3NhcnkgI2luY2x1ZGVzIGNhbiBjYXVzZQorICBjb25zaWRlcmFibGUgZXh0cmEgY29tcGlsZXMgaW5jcmVhc2luZyB0aGUgZWRpdC1jb21waWxlLXJ1biBjeWNsZS4KKworICBUaGUgcHJvamVjdCBob21lIHBhZ2UgaXM6ICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NwcGNsZWFuLworCisKK0ZlYXR1cmVzOgorLS0tLS0tLS0tCisgKiBGaW5kIGFuZCBwcmludCBDKysgbGFuZ3VhZ2UgY29uc3RydWN0czogY2xhc3NlcywgbWV0aG9kcywgZnVuY3Rpb25zLCBldGMuCisgKiBGaW5kIGNsYXNzZXMgd2l0aCB2aXJ0dWFsIG1ldGhvZHMsIG5vIHZpcnR1YWwgZGVzdHJ1Y3RvciwgYW5kIG5vIGJhc2VzCisgKiBGaW5kIGdsb2JhbC9zdGF0aWMgZGF0YSB0aGF0IGFyZSBwb3RlbnRpYWwgcHJvYmxlbXMgd2hlbiB1c2luZyB0aHJlYWRzCisgKiBVbm5lY2Vzc2FyeSBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucworICogVW5uZWNlc3NhcnkgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKiBVbmRlY2xhcmVkIGZ1bmN0aW9uIGRlZmluaXRpb25zCisgKiAocGxhbm5lZCkgRmluZCB1bm5lY2Vzc2FyeSBoZWFkZXIgZmlsZXMgI2luY2x1ZGVkCisgICAtIE5vIGRpcmVjdCByZWZlcmVuY2UgdG8gYW55dGhpbmcgaW4gdGhlIGhlYWRlcgorICAgLSBIZWFkZXIgaXMgdW5uZWNlc3NhcnkgaWYgY2xhc3NlcyB3ZXJlIGZvcndhcmQgZGVjbGFyZWQgaW5zdGVhZAorICogKHBsYW5uZWQpIFNvdXJjZSBmaWxlcyB0aGF0IHJlZmVyZW5jZSBoZWFkZXJzIG5vdCBkaXJlY3RseSAjaW5jbHVkZWQsCisgICBpZSwgZmlsZXMgdGhhdCByZWx5IG9uIGEgdHJhbnNpdGl2ZSAjaW5jbHVkZSBmcm9tIGFub3RoZXIgaGVhZGVyCisgKiAocGxhbm5lZCkgVW51c2VkIG1lbWJlcnMgKHByaXZhdGUsIHByb3RlY3RlZCwgJiBwdWJsaWMpIG1ldGhvZHMgYW5kIGRhdGEKKyAqIChwbGFubmVkKSBTdG9yZSBBU1QgaW4gYSBTUUwgZGF0YWJhc2Ugc28gcmVsYXRpb25zaGlwcyBjYW4gYmUgcXVlcmllZAorCitBU1QgaXMgQWJzdHJhY3QgU3ludGF4IFRyZWUsIGEgcmVwcmVzZW50YXRpb24gb2YgcGFyc2VkIHNvdXJjZSBjb2RlLgoraHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BYnN0cmFjdF9zeW50YXhfdHJlZQorCisKK1N5c3RlbSBSZXF1aXJlbWVudHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHl0aG9uIDIuNCBvciBsYXRlciAoMi4zIHByb2JhYmx5IHdvcmtzIHRvbykKKyAqIFdvcmtzIG9uIFdpbmRvd3MgKHVudGVzdGVkKSwgTWFjIE9TIFgsIGFuZCBVbml4CisKKworSG93IHRvIFJ1bjoKKy0tLS0tLS0tLS0tCisgIEZvciBhbGwgZXhhbXBsZXMsIGl0IGlzIGFzc3VtZWQgdGhhdCBjcHBjbGVhbiByZXNpZGVzIGluIGEgZGlyZWN0b3J5IGNhbGxlZAorICAvY3BwY2xlYW4uCisKKyAgVG8gcHJpbnQgd2FybmluZ3MgZm9yIGNsYXNzZXMgd2l0aCB2aXJ0dWFsIG1ldGhvZHMsIG5vIHZpcnR1YWwgZGVzdHJ1Y3RvciBhbmQKKyAgbm8gYmFzZSBjbGFzc2VzOgorCisgICAgICAvY3BwY2xlYW4vcnVuLnNoIG5vbnZpcnR1YWxfZHRvcnMucHkgZmlsZTEuaCBmaWxlMi5oIGZpbGUzLmNjIC4uLgorCisgIFRvIHByaW50IGFsbCB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gaGVhZGVyIGZpbGUocyk6CisKKyAgICAgIC9jcHBjbGVhbi9ydW4uc2ggZnVuY3Rpb25zLnB5IGZpbGUxLmggZmlsZTIuaCAuLi4KKworICBBbGwgdGhlIGNvbW1hbmRzIHRha2UgbXVsdGlwbGUgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZS4gIE90aGVyIHByb2dyYW1zCisgIGluY2x1ZGU6IGZpbmRfd2FybmluZ3MsIGhlYWRlcnMsIG1ldGhvZHMsIGFuZCB0eXBlcy4gIFNvbWUgb3RoZXIgcHJvZ3JhbXMKKyAgYXJlIGF2YWlsYWJsZSwgYnV0IHVzZWQgcHJpbWFyaWx5IGZvciBkZWJ1Z2dpbmcuCisKKyAgcnVuLnNoIGlzIGEgc2ltcGxlIHdyYXBwZXIgdGhhdCBzZXRzIFBZVEhPTlBBVEggdG8gL2NwcGNsZWFuIGFuZCB0aGVuCisgIHJ1bnMgdGhlIHByb2dyYW0gaW4gL2NwcGNsZWFuL2NwcC9QUk9HUkFNLnB5LiAgVGhlcmUgaXMgY3VycmVudGx5CisgIG5vIGVxdWl2YWxlbnQgZm9yIFdpbmRvd3MuICBDb250cmlidXRpb25zIGZvciBhIHJ1bi5iYXQgZmlsZQorICB3b3VsZCBiZSBncmVhdGx5IGFwcHJlY2lhdGVkLgorCisKK0hvdyB0byBDb25maWd1cmU6CistLS0tLS0tLS0tLS0tLS0tLQorICBZb3UgY2FuIGFkZCBhIHNpdGVoZWFkZXJzLnB5IGZpbGUgaW4gL2NwcGNsZWFuL2NwcCB0byBjb25maWd1cmUgd2hlcmUKKyAgdG8gbG9vayBmb3Igb3RoZXIgaGVhZGVycyAodHlwaWNhbGx5IC1JIG9wdGlvbnMgcGFzc2VkIHRvIGEgY29tcGlsZXIpLgorICBDdXJyZW50bHkgdHdvIHZhbHVlcyBhcmUgc3VwcG9ydGVkOiAgX1RSQU5TSVRJVkUgYW5kIEdldEluY2x1ZGVEaXJzLgorICBfVFJBTlNJVElWRSBzaG91bGQgYmUgc2V0IHRvIGEgYm9vbGVhbiB2YWx1ZSAoVHJ1ZSBvciBGYWxzZSkgaW5kaWNhdGluZworICB3aGV0aGVyIHRvIHRyYW5zaXRpdmVseSBwcm9jZXNzIGFsbCBoZWFkZXIgZmlsZXMuICBUaGUgZGVmYXVsdCBpcyBGYWxzZS4KKworICBHZXRJbmNsdWRlRGlycyBpcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgYW5kIHJldHVybnMKKyAgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcmllcyB0byBpbmNsdWRlLiAgVGhpcyBjYW4gYmUgYSBnZW5lcmF0b3Igb3IKKyAgcmV0dXJuIGEgc3RhdGljIGxpc3QuCisKKyAgICAgIGRlZiBHZXRJbmNsdWRlRGlycyhmaWxlbmFtZSk6CisgICAgICAgICAgcmV0dXJuIFsnL3NvbWUvcGF0aC93aXRoL290aGVyL2hlYWRlcnMnXQorCisgICAgICAjIEhlcmUgaXMgYSBtb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGUuCisgICAgICBkZWYgR2V0SW5jbHVkZURpcnMoZmlsZW5hbWUpOgorICAgICAgICAgIHlpZWxkICcvcGF0aDEnCisgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKCcvcGF0aDInLCBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpKQorICAgICAgICAgIHlpZWxkICcvcGF0aDMnCisKKworSG93IHRvIFRlc3Q6CistLS0tLS0tLS0tLS0KKyAgRm9yIGFsbCBleGFtcGxlcywgaXQgaXMgYXNzdW1lZCB0aGF0IGNwcGNsZWFuIHJlc2lkZXMgaW4gYSBkaXJlY3RvcnkgY2FsbGVkCisgIC9jcHBjbGVhbi4gIFRoZSB0ZXN0cyByZXF1aXJlCisKKyAgY2QgL2NwcGNsZWFuCisgIG1ha2UgdGVzdAorICAjIFRvIGdlbmVyYXRlIGV4cGVjdGVkIHJlc3VsdHMgYWZ0ZXIgYSBjaGFuZ2U6CisgIG1ha2UgZXhwZWN0ZWQKKworCitDdXJyZW50IFN0YXR1czoKKy0tLS0tLS0tLS0tLS0tLQorICBUaGUgcGFyc2VyIHdvcmtzIHByZXR0eSB3ZWxsIGZvciBoZWFkZXIgZmlsZXMsIHBhcnNpbmcgYWJvdXQgOTklIG9mIEdvb2dsZSdzCisgIGhlYWRlciBmaWxlcy4gIEFueXRoaW5nIHdoaWNoIGluc3BlY3RzIHN0cnVjdHVyZSBvZiBDKysgc291cmNlIGZpbGVzIHNob3VsZAorICB3b3JrIHJlYXNvbmFibHkgd2VsbC4gIEZ1bmN0aW9uIGJvZGllcyBhcmUgbm90IHRyYW5zZm9ybWVkIHRvIGFuIEFTVCwKKyAgYnV0IGxlZnQgYXMgdG9rZW5zLiAgTXVjaCB3b3JrIGlzIHN0aWxsIG5lZWRlZCBvbiBmaW5kaW5nIHVudXNlZCBoZWFkZXIgZmlsZXMKKyAgYW5kIHN0b3JpbmcgYW4gQVNUIGluIGEgZGF0YWJhc2UuCisKKworTm9uLWdvYWxzOgorLS0tLS0tLS0tLQorICogUGFyc2luZyBhbGwgdmFsaWQgQysrIHNvdXJjZQorICogSGFuZGxpbmcgaW52YWxpZCBDKysgc291cmNlIGdyYWNlZnVsbHkKKyAqIENvbXBpbGluZyB0byBtYWNoaW5lIGNvZGUgKG9yIGFueXRoaW5nIGJleW9uZCBhbiBBU1QpCisKKworQ29udGFjdDoKKy0tLS0tLS0tCisgIElmIHlvdSB1c2VkIGNwcGNsZWFuLCBJIHdvdWxkIGxvdmUgdG8gaGVhciBhYm91dCB5b3VyIGV4cGVyaWVuY2VzCisgIGNwcGNsZWFuQGdvb2dsZWdyb3Vwcy5jb20uICBFdmVuIGlmIHlvdSBkb24ndCB1c2UgY3BwY2xlYW4sIEknZCBsaWtlIHRvCisgIGhlYXIgZnJvbSB5b3UuICA6LSkgIChZb3UgY2FuIGNvbnRhY3QgbWUgZGlyZWN0bHkgYXQ6ICBubm9yd2l0ekBnbWFpbC5jb20pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL19faW5pdF9fLnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9hc3QucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2FzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMWNiZTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9hc3QucHkKQEAgLTAsMCArMSwxNzMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDcgTmVhbCBOb3J3aXR6CisjIFBvcnRpb25zIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJHZW5lcmF0ZSBhbiBBYnN0cmFjdCBTeW50YXggVHJlZSAoQVNUKSBmb3IgQysrLiIiIgorCitfX2F1dGhvcl9fID0gJ25ub3J3aXR6QGdvb2dsZS5jb20gKE5lYWwgTm9yd2l0eiknCisKKworIyBUT0RPOgorIyAgKiBUb2tlbnMgc2hvdWxkIG5ldmVyIGJlIGV4cG9ydGVkLCBuZWVkIHRvIGNvbnZlcnQgdG8gTm9kZXMKKyMgICAgKHJldHVybiB0eXBlcywgcGFyYW1ldGVycywgZXRjLikKKyMgICogSGFuZGxlIHN0YXRpYyBjbGFzcyBkYXRhIGZvciB0ZW1wbGF0aXplZCBjbGFzc2VzCisjICAqIEhhbmRsZSBjYXN0cyAoYm90aCBDKysgYW5kIEMtc3R5bGUpCisjICAqIEhhbmRsZSBjb25kaXRpb25zIGFuZCBsb29wcyAoaWYvZWxzZSwgc3dpdGNoLCBmb3IsIHdoaWxlL2RvKQorIworIyBUT0RPIG11Y2gsIG11Y2ggbGF0ZXI6CisjICAqIEhhbmRsZSAjZGVmaW5lCisjICAqIGV4Y2VwdGlvbnMKKworCit0cnk6CisgICAgIyBQeXRob24gMy54CisgICAgaW1wb3J0IGJ1aWx0aW5zCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBQeXRob24gMi54CisgICAgaW1wb3J0IF9fYnVpbHRpbl9fIGFzIGJ1aWx0aW5zCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB0cmFjZWJhY2sKKworZnJvbSBjcHAgaW1wb3J0IGtleXdvcmRzCitmcm9tIGNwcCBpbXBvcnQgdG9rZW5pemUKK2Zyb20gY3BwIGltcG9ydCB1dGlscworCisKK2lmIG5vdCBoYXNhdHRyKGJ1aWx0aW5zLCAncmV2ZXJzZWQnKToKKyAgICAjIFN1cHBvcnQgUHl0aG9uIDIuMyBhbmQgZWFybGllci4KKyAgICBkZWYgcmV2ZXJzZWQoc2VxKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlcSktMSwgLTEsIC0xKToKKyAgICAgICAgICAgIHlpZWxkIHNlcVtpXQorCitpZiBub3QgaGFzYXR0cihidWlsdGlucywgJ25leHQnKToKKyAgICAjIFN1cHBvcnQgUHl0aG9uIDIuNSBhbmQgZWFybGllci4KKyAgICBkZWYgbmV4dChvYmopOgorICAgICAgICByZXR1cm4gb2JqLm5leHQoKQorCisKK1ZJU0lCSUxJVFlfUFVCTElDLCBWSVNJQklMSVRZX1BST1RFQ1RFRCwgVklTSUJJTElUWV9QUklWQVRFID0gcmFuZ2UoMykKKworRlVOQ1RJT05fTk9ORSA9IDB4MDAKK0ZVTkNUSU9OX0NPTlNUID0gMHgwMQorRlVOQ1RJT05fVklSVFVBTCA9IDB4MDIKK0ZVTkNUSU9OX1BVUkVfVklSVFVBTCA9IDB4MDQKK0ZVTkNUSU9OX0NUT1IgPSAweDA4CitGVU5DVElPTl9EVE9SID0gMHgxMAorRlVOQ1RJT05fQVRUUklCVVRFID0gMHgyMAorRlVOQ1RJT05fVU5LTk9XTl9BTk5PVEFUSU9OID0gMHg0MAorRlVOQ1RJT05fVEhST1cgPSAweDgwCitGVU5DVElPTl9PVkVSUklERSA9IDB4MTAwCisKKyIiIgorVGhlc2UgYXJlIGN1cnJlbnRseSB1bnVzZWQuICBTaG91bGQgcmVhbGx5IGhhbmRsZSB0aGVzZSBwcm9wZXJseSBhdCBzb21lIHBvaW50LgorCitUWVBFX01PRElGSUVSX0lOTElORSAgID0gMHgwMTAwMDAKK1RZUEVfTU9ESUZJRVJfRVhURVJOICAgPSAweDAyMDAwMAorVFlQRV9NT0RJRklFUl9TVEFUSUMgICA9IDB4MDQwMDAwCitUWVBFX01PRElGSUVSX0NPTlNUICAgID0gMHgwODAwMDAKK1RZUEVfTU9ESUZJRVJfUkVHSVNURVIgPSAweDEwMDAwMAorVFlQRV9NT0RJRklFUl9WT0xBVElMRSA9IDB4MjAwMDAwCitUWVBFX01PRElGSUVSX01VVEFCTEUgID0gMHg0MDAwMDAKKworVFlQRV9NT0RJRklFUl9NQVAgPSB7CisgICAgJ2lubGluZSc6IFRZUEVfTU9ESUZJRVJfSU5MSU5FLAorICAgICdleHRlcm4nOiBUWVBFX01PRElGSUVSX0VYVEVSTiwKKyAgICAnc3RhdGljJzogVFlQRV9NT0RJRklFUl9TVEFUSUMsCisgICAgJ2NvbnN0JzogVFlQRV9NT0RJRklFUl9DT05TVCwKKyAgICAncmVnaXN0ZXInOiBUWVBFX01PRElGSUVSX1JFR0lTVEVSLAorICAgICd2b2xhdGlsZSc6IFRZUEVfTU9ESUZJRVJfVk9MQVRJTEUsCisgICAgJ211dGFibGUnOiBUWVBFX01PRElGSUVSX01VVEFCTEUsCisgICAgfQorIiIiCisKK19JTlRFUk5BTF9UT0tFTiA9ICdpbnRlcm5hbCcKK19OQU1FU1BBQ0VfUE9QID0gJ25zLXBvcCcKKworCisjIFRPRE8obm5vcndpdHopOiB1c2UgdGhpcyBhcyBhIHNpbmdsZXRvbiBmb3IgdGVtcGxhdGVkX3R5cGVzLCBldGMKKyMgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBuZXcgZW1wdHkgZGljdCBlYWNoIHRpbWUuICBJdCBpcyBhbHNvIGNvbnN0LgorY2xhc3MgX051bGxEaWN0KG9iamVjdCk6CisgICAgX19jb250YWluc19fID0gbGFtYmRhIHNlbGY6IEZhbHNlCisgICAga2V5cyA9IHZhbHVlcyA9IGl0ZW1zID0gaXRlcmtleXMgPSBpdGVydmFsdWVzID0gaXRlcml0ZW1zID0gbGFtYmRhIHNlbGY6ICgpCisKKworIyBUT0RPKG5ub3J3aXR6KTogbW92ZSBBU1Qgbm9kZXMgaW50byBhIHNlcGFyYXRlIG1vZHVsZS4KK2NsYXNzIE5vZGUob2JqZWN0KToKKyAgICAiIiJCYXNlIEFTVCBub2RlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQpOgorICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKKyAgICAgICAgc2VsZi5lbmQgPSBlbmQKKworICAgIGRlZiBJc0RlY2xhcmF0aW9uKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGJvb2wgaWYgdGhpcyBub2RlIGlzIGEgZGVjbGFyYXRpb24uIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIElzRGVmaW5pdGlvbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBib29sIGlmIHRoaXMgbm9kZSBpcyBhIGRlZmluaXRpb24uIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIElzRXhwb3J0YWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBib29sIGlmIHRoaXMgbm9kZSBleHBvcnRhYmxlIGZyb20gYSBoZWFkZXIgZmlsZS4iIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgUmVxdWlyZXMoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkRvZXMgdGhpcyBBU1Qgbm9kZSByZXF1aXJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBub2RlIHBhc3NlZCBpbj8iIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgWFhYX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX1N0cmluZ0hlbHBlcihzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJycpCisKKyAgICBkZWYgX1N0cmluZ0hlbHBlcihzZWxmLCBuYW1lLCBzdWZmaXgpOgorICAgICAgICBpZiBub3QgdXRpbHMuREVCVUc6CisgICAgICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAobmFtZSwgc3VmZml4KQorICAgICAgICByZXR1cm4gJyVzKCVkLCAlZCwgJXMpJyAlIChuYW1lLCBzZWxmLnN0YXJ0LCBzZWxmLmVuZCwgc3VmZml4KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYpCisKKworY2xhc3MgRGVmaW5lKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBkZWZpbml0aW9uKToKKyAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZGVmaW5pdGlvbiA9IGRlZmluaXRpb24KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICB2YWx1ZSA9ICclcyAlcycgJSAoc2VsZi5uYW1lLCBzZWxmLmRlZmluaXRpb24pCisgICAgICAgIHJldHVybiBzZWxmLl9TdHJpbmdIZWxwZXIoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHZhbHVlKQorCisKK2NsYXNzIEluY2x1ZGUoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIGZpbGVuYW1lLCBzeXN0ZW0pOgorICAgICAgICBOb2RlLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQpCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLnN5c3RlbSA9IHN5c3RlbQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGZtdCA9ICciJXMiJworICAgICAgICBpZiBzZWxmLnN5c3RlbToKKyAgICAgICAgICAgIGZtdCA9ICc8JXM+JworICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBmbXQgJSBzZWxmLmZpbGVuYW1lKQorCisKK2NsYXNzIEdvdG8oTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIGxhYmVsKToKKyAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kKQorICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5sYWJlbCkpCisKKworY2xhc3MgRXhwcihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCwgZXhwcik6CisgICAgICAgIE5vZGUuX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCkKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorCisgICAgZGVmIFJlcXVpcmVzKHNlbGYsIG5vZGUpOgorICAgICAgICAjIFRPRE8obm5vcndpdHopOiBpbXBsLgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5leHByKSkKKworCitjbGFzcyBSZXR1cm4oRXhwcik6CisgICAgcGFzcworCisKK2NsYXNzIERlbGV0ZShFeHByKToKKyAgICBwYXNzCisKKworY2xhc3MgRnJpZW5kKEV4cHIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBleHByLCBuYW1lc3BhY2UpOgorICAgICAgICBFeHByLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIGV4cHIpCisgICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlWzpdCisKKworY2xhc3MgVXNpbmcoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWVzKToKKyAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kKQorICAgICAgICBzZWxmLm5hbWVzID0gbmFtZXMKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5uYW1lcykpCisKKworY2xhc3MgUGFyYW1ldGVyKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBwYXJhbWV0ZXJfdHlwZSwgZGVmYXVsdCk6CisgICAgICAgIE5vZGUuX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCkKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnR5cGUgPSBwYXJhbWV0ZXJfdHlwZQorICAgICAgICBzZWxmLmRlZmF1bHQgPSBkZWZhdWx0CisKKyAgICBkZWYgUmVxdWlyZXMoc2VsZiwgbm9kZSk6CisgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSBuYW1lc3BhY2VzLCBldGMuCisgICAgICAgIHJldHVybiBzZWxmLnR5cGUubmFtZSA9PSBub2RlLm5hbWUKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBuYW1lID0gc3RyKHNlbGYudHlwZSkKKyAgICAgICAgc3VmZml4ID0gJyVzICVzJyAlIChuYW1lLCBzZWxmLm5hbWUpCisgICAgICAgIGlmIHNlbGYuZGVmYXVsdDoKKyAgICAgICAgICAgIHN1ZmZpeCArPSAnID0gJyArICcnLmpvaW4oW2QubmFtZSBmb3IgZCBpbiBzZWxmLmRlZmF1bHRdKQorICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdWZmaXgpCisKKworY2xhc3MgX0dlbmVyaWNEZWNsYXJhdGlvbihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCwgbmFtZSwgbmFtZXNwYWNlKToKKyAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlWzpdCisKKyAgICBkZWYgRnVsbE5hbWUoc2VsZik6CisgICAgICAgIHByZWZpeCA9ICcnCisgICAgICAgIGlmIHNlbGYubmFtZXNwYWNlIGFuZCBzZWxmLm5hbWVzcGFjZVstMV06CisgICAgICAgICAgICBwcmVmaXggPSAnOjonLmpvaW4oc2VsZi5uYW1lc3BhY2UpICsgJzo6JworICAgICAgICByZXR1cm4gcHJlZml4ICsgc2VsZi5uYW1lCisKKyAgICBkZWYgX1R5cGVTdHJpbmdIZWxwZXIoc2VsZiwgc3VmZml4KToKKyAgICAgICAgaWYgc2VsZi5uYW1lc3BhY2U6CisgICAgICAgICAgICBuYW1lcyA9IFtuIG9yICc8YW5vbnltb3VzPicgZm9yIG4gaW4gc2VsZi5uYW1lc3BhY2VdCisgICAgICAgICAgICBzdWZmaXggKz0gJyBpbiAnICsgJzo6Jy5qb2luKG5hbWVzKQorICAgICAgICByZXR1cm4gc2VsZi5fU3RyaW5nSGVscGVyKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdWZmaXgpCisKKworIyBUT0RPKG5ub3J3aXR6KTogbWVyZ2Ugd2l0aCBQYXJhbWV0ZXIgaW4gc29tZSB3YXk/CitjbGFzcyBWYXJpYWJsZURlY2xhcmF0aW9uKF9HZW5lcmljRGVjbGFyYXRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCB2YXJfdHlwZSwgaW5pdGlhbF92YWx1ZSwgbmFtZXNwYWNlKToKKyAgICAgICAgX0dlbmVyaWNEZWNsYXJhdGlvbi5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBuYW1lc3BhY2UpCisgICAgICAgIHNlbGYudHlwZSA9IHZhcl90eXBlCisgICAgICAgIHNlbGYuaW5pdGlhbF92YWx1ZSA9IGluaXRpYWxfdmFsdWUKKworICAgIGRlZiBSZXF1aXJlcyhzZWxmLCBub2RlKToKKyAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIG5hbWVzcGFjZXMsIGV0Yy4KKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZS5uYW1lID09IG5vZGUubmFtZQorCisgICAgZGVmIFRvU3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgdGhhdCB0cmllcyB0byByZWNvbnN0aXR1dGUgdGhlIHZhcmlhYmxlIGRlY2wuIiIiCisgICAgICAgIHN1ZmZpeCA9ICclcyAlcycgJSAoc2VsZi50eXBlLCBzZWxmLm5hbWUpCisgICAgICAgIGlmIHNlbGYuaW5pdGlhbF92YWx1ZToKKyAgICAgICAgICAgIHN1ZmZpeCArPSAnID0gJyArIHNlbGYuaW5pdGlhbF92YWx1ZQorICAgICAgICByZXR1cm4gc3VmZml4CisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX1N0cmluZ0hlbHBlcihzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5Ub1N0cmluZygpKQorCisKK2NsYXNzIFR5cGVkZWYoX0dlbmVyaWNEZWNsYXJhdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIGFsaWFzLCBuYW1lc3BhY2UpOgorICAgICAgICBfR2VuZXJpY0RlY2xhcmF0aW9uLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIG5hbWVzcGFjZSkKKyAgICAgICAgc2VsZi5hbGlhcyA9IGFsaWFzCisKKyAgICBkZWYgSXNEZWZpbml0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIElzRXhwb3J0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBSZXF1aXJlcyhzZWxmLCBub2RlKToKKyAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIG5hbWVzcGFjZXMsIGV0Yy4KKyAgICAgICAgbmFtZSA9IG5vZGUubmFtZQorICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5hbGlhczoKKyAgICAgICAgICAgIGlmIHRva2VuIGlzIG5vdCBOb25lIGFuZCBuYW1lID09IHRva2VuLm5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgc3VmZml4ID0gJyVzLCAlcycgJSAoc2VsZi5uYW1lLCBzZWxmLmFsaWFzKQorICAgICAgICByZXR1cm4gc2VsZi5fVHlwZVN0cmluZ0hlbHBlcihzdWZmaXgpCisKKworY2xhc3MgX05lc3RlZFR5cGUoX0dlbmVyaWNEZWNsYXJhdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIGZpZWxkcywgbmFtZXNwYWNlKToKKyAgICAgICAgX0dlbmVyaWNEZWNsYXJhdGlvbi5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBuYW1lc3BhY2UpCisgICAgICAgIHNlbGYuZmllbGRzID0gZmllbGRzCisKKyAgICBkZWYgSXNEZWZpbml0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIElzRXhwb3J0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBzdWZmaXggPSAnJXMsIHslc30nICUgKHNlbGYubmFtZSwgc2VsZi5maWVsZHMpCisgICAgICAgIHJldHVybiBzZWxmLl9UeXBlU3RyaW5nSGVscGVyKHN1ZmZpeCkKKworCitjbGFzcyBVbmlvbihfTmVzdGVkVHlwZSk6CisgICAgcGFzcworCisKK2NsYXNzIEVudW0oX05lc3RlZFR5cGUpOgorICAgIHBhc3MKKworCitjbGFzcyBDbGFzcyhfR2VuZXJpY0RlY2xhcmF0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCwgbmFtZSwgYmFzZXMsIHRlbXBsYXRlZF90eXBlcywgYm9keSwgbmFtZXNwYWNlKToKKyAgICAgICAgX0dlbmVyaWNEZWNsYXJhdGlvbi5fX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCBuYW1lc3BhY2UpCisgICAgICAgIHNlbGYuYmFzZXMgPSBiYXNlcworICAgICAgICBzZWxmLmJvZHkgPSBib2R5CisgICAgICAgIHNlbGYudGVtcGxhdGVkX3R5cGVzID0gdGVtcGxhdGVkX3R5cGVzCisKKyAgICBkZWYgSXNEZWNsYXJhdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzZXMgaXMgTm9uZSBhbmQgc2VsZi5ib2R5IGlzIE5vbmUKKworICAgIGRlZiBJc0RlZmluaXRpb24oc2VsZik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5Jc0RlY2xhcmF0aW9uKCkKKworICAgIGRlZiBJc0V4cG9ydGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5Jc0RlY2xhcmF0aW9uKCkKKworICAgIGRlZiBSZXF1aXJlcyhzZWxmLCBub2RlKToKKyAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIG5hbWVzcGFjZXMsIGV0Yy4KKyAgICAgICAgaWYgc2VsZi5iYXNlczoKKyAgICAgICAgICAgIGZvciB0b2tlbl9saXN0IGluIHNlbGYuYmFzZXM6CisgICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogYmFzZXMgYXJlIHRva2VucywgZG8gbmFtZSBjb21wYXJpc2lvbi4KKyAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5fbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSBub2RlLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAjIFRPRE8obm5vcndpdHopOiBzZWFyY2ggaW4gYm9keSB0b28uCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUKKyAgICAgICAgaWYgc2VsZi50ZW1wbGF0ZWRfdHlwZXM6CisgICAgICAgICAgICBuYW1lICs9ICc8JXM+JyAlIHNlbGYudGVtcGxhdGVkX3R5cGVzCisgICAgICAgIHN1ZmZpeCA9ICclcywgJXMsICVzJyAlIChuYW1lLCBzZWxmLmJhc2VzLCBzZWxmLmJvZHkpCisgICAgICAgIHJldHVybiBzZWxmLl9UeXBlU3RyaW5nSGVscGVyKHN1ZmZpeCkKKworCitjbGFzcyBTdHJ1Y3QoQ2xhc3MpOgorICAgIHBhc3MKKworCitjbGFzcyBGdW5jdGlvbihfR2VuZXJpY0RlY2xhcmF0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCwgbmFtZSwgcmV0dXJuX3R5cGUsIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgIG1vZGlmaWVycywgdGVtcGxhdGVkX3R5cGVzLCBib2R5LCBuYW1lc3BhY2UpOgorICAgICAgICBfR2VuZXJpY0RlY2xhcmF0aW9uLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIG5hbWVzcGFjZSkKKyAgICAgICAgY29udmVydGVyID0gVHlwZUNvbnZlcnRlcihuYW1lc3BhY2UpCisgICAgICAgIHNlbGYucmV0dXJuX3R5cGUgPSBjb252ZXJ0ZXIuQ3JlYXRlUmV0dXJuVHlwZShyZXR1cm5fdHlwZSkKKyAgICAgICAgc2VsZi5wYXJhbWV0ZXJzID0gY29udmVydGVyLlRvUGFyYW1ldGVycyhwYXJhbWV0ZXJzKQorICAgICAgICBzZWxmLm1vZGlmaWVycyA9IG1vZGlmaWVycworICAgICAgICBzZWxmLmJvZHkgPSBib2R5CisgICAgICAgIHNlbGYudGVtcGxhdGVkX3R5cGVzID0gdGVtcGxhdGVkX3R5cGVzCisKKyAgICBkZWYgSXNEZWNsYXJhdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYm9keSBpcyBOb25lCisKKyAgICBkZWYgSXNEZWZpbml0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ib2R5IGlzIG5vdCBOb25lCisKKyAgICBkZWYgSXNFeHBvcnRhYmxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJldHVybl90eXBlIGFuZCAnc3RhdGljJyBpbiBzZWxmLnJldHVybl90eXBlLm1vZGlmaWVyczoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gTm9uZSBub3QgaW4gc2VsZi5uYW1lc3BhY2UKKworICAgIGRlZiBSZXF1aXJlcyhzZWxmLCBub2RlKToKKyAgICAgICAgaWYgc2VsZi5wYXJhbWV0ZXJzOgorICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogcGFyYW1ldGVycyBhcmUgdG9rZW5zLCBkbyBuYW1lIGNvbXBhcmlzaW9uLgorICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbWV0ZXJzOgorICAgICAgICAgICAgICAgIGlmIHAubmFtZSA9PSBub2RlLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgVE9ETyhubm9yd2l0eik6IHNlYXJjaCBpbiBib2R5IHRvby4KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogYWRkIHRlbXBsYXRlZF90eXBlcy4KKyAgICAgICAgc3VmZml4ID0gKCclcyAlcyglcyksIDB4JTAyeCwgJXMnICUKKyAgICAgICAgICAgICAgICAgIChzZWxmLnJldHVybl90eXBlLCBzZWxmLm5hbWUsIHNlbGYucGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICBzZWxmLm1vZGlmaWVycywgc2VsZi5ib2R5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX1R5cGVTdHJpbmdIZWxwZXIoc3VmZml4KQorCisKK2NsYXNzIE1ldGhvZChGdW5jdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIGluX2NsYXNzLCByZXR1cm5fdHlwZSwgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLCB0ZW1wbGF0ZWRfdHlwZXMsIGJvZHksIG5hbWVzcGFjZSk6CisgICAgICAgIEZ1bmN0aW9uLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIHJldHVybl90eXBlLCBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsIHRlbXBsYXRlZF90eXBlcywgYm9keSwgbmFtZXNwYWNlKQorICAgICAgICAjIFRPRE8obm5vcndpdHopOiBpbl9jbGFzcyBjb3VsZCBhbHNvIGJlIGEgbmFtZXNwYWNlIHdoaWNoIGNhbgorICAgICAgICAjIG1lc3MgdXAgZmluZGluZyBmdW5jdGlvbnMgcHJvcGVybHkuCisgICAgICAgIHNlbGYuaW5fY2xhc3MgPSBpbl9jbGFzcworCisKK2NsYXNzIFR5cGUoX0dlbmVyaWNEZWNsYXJhdGlvbik6CisgICAgIiIiVHlwZSB1c2VkIGZvciBhbnkgdmFyaWFibGUgKGVnIGNsYXNzLCBwcmltaXRpdmUsIHN0cnVjdCwgZXRjKS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZW5kLCBuYW1lLCB0ZW1wbGF0ZWRfdHlwZXMsIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLCBwb2ludGVyLCBhcnJheSk6CisgICAgICAgICIiIgorICAgICAgICBBcmdzOgorICAgICAgICAgIG5hbWU6IHN0ciBuYW1lIG9mIG1haW4gdHlwZQorICAgICAgICAgIHRlbXBsYXRlZF90eXBlczogW0NsYXNzIChUeXBlPyldIHRlbXBsYXRlIHR5cGUgaW5mbyBiZXR3ZWVuIDw+CisgICAgICAgICAgbW9kaWZpZXJzOiBbc3RyXSB0eXBlIG1vZGlmaWVycyAoa2V5d29yZHMpIGVnLCBjb25zdCwgbXV0YWJsZSwgZXRjLgorICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciwgYXJyYXk6IGJvb2xzCisgICAgICAgICIiIgorICAgICAgICBfR2VuZXJpY0RlY2xhcmF0aW9uLl9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQsIG5hbWUsIFtdKQorICAgICAgICBzZWxmLnRlbXBsYXRlZF90eXBlcyA9IHRlbXBsYXRlZF90eXBlcworICAgICAgICBpZiBub3QgbmFtZSBhbmQgbW9kaWZpZXJzOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbW9kaWZpZXJzLnBvcCgpCisgICAgICAgIHNlbGYubW9kaWZpZXJzID0gbW9kaWZpZXJzCisgICAgICAgIHNlbGYucmVmZXJlbmNlID0gcmVmZXJlbmNlCisgICAgICAgIHNlbGYucG9pbnRlciA9IHBvaW50ZXIKKyAgICAgICAgc2VsZi5hcnJheSA9IGFycmF5CisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcHJlZml4ID0gJycKKyAgICAgICAgaWYgc2VsZi5tb2RpZmllcnM6CisgICAgICAgICAgICBwcmVmaXggPSAnICcuam9pbihzZWxmLm1vZGlmaWVycykgKyAnICcKKyAgICAgICAgbmFtZSA9IHN0cihzZWxmLm5hbWUpCisgICAgICAgIGlmIHNlbGYudGVtcGxhdGVkX3R5cGVzOgorICAgICAgICAgICAgbmFtZSArPSAnPCVzPicgJSBzZWxmLnRlbXBsYXRlZF90eXBlcworICAgICAgICBzdWZmaXggPSBwcmVmaXggKyBuYW1lCisgICAgICAgIGlmIHNlbGYucmVmZXJlbmNlOgorICAgICAgICAgICAgc3VmZml4ICs9ICcmJworICAgICAgICBpZiBzZWxmLnBvaW50ZXI6CisgICAgICAgICAgICBzdWZmaXggKz0gJyonCisgICAgICAgIGlmIHNlbGYuYXJyYXk6CisgICAgICAgICAgICBzdWZmaXggKz0gJ1tdJworICAgICAgICByZXR1cm4gc2VsZi5fVHlwZVN0cmluZ0hlbHBlcihzdWZmaXgpCisKKyAgICAjIEJ5IGRlZmluaXRpb24sIElzKiBhcmUgYWx3YXlzIEZhbHNlLiAgQSBUeXBlIGNhbiBvbmx5IGV4aXN0IGluCisgICAgIyBzb21lIHNvcnQgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24sIHBhcmFtZXRlciwgb3IgcmV0dXJuIHZhbHVlLgorICAgIGRlZiBJc0RlY2xhcmF0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBJc0RlZmluaXRpb24oc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIElzRXhwb3J0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgVHlwZUNvbnZlcnRlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZV9zdGFjayk6CisgICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrID0gbmFtZXNwYWNlX3N0YWNrCisKKyAgICBkZWYgX0dldFRlbXBsYXRlRW5kKHNlbGYsIHRva2Vucywgc3RhcnQpOgorICAgICAgICBjb3VudCA9IDEKKyAgICAgICAgZW5kID0gc3RhcnQKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2VuZF0KKyAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc8JzoKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gJz4nOgorICAgICAgICAgICAgICAgIGNvdW50IC09IDEKKyAgICAgICAgICAgICAgICBpZiBjb3VudCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gdG9rZW5zW3N0YXJ0OmVuZC0xXSwgZW5kCisKKyAgICBkZWYgVG9UeXBlKHNlbGYsIHRva2Vucyk6CisgICAgICAgICIiIkNvbnZlcnQgW1Rva2VuLC4uLl0gdG8gW0NsYXNzKC4uLiksIF0gdXNlZnVsIGZvciBiYXNlIGNsYXNzZXMuCisgICAgICAgIEZvciBleGFtcGxlLCBjb2RlIGxpa2UgY2xhc3MgRm9vIDogcHVibGljIEJhcjx4LCB5PiB7IC4uLiB9OworICAgICAgICB0aGUgIkJhcjx4LCB5PiIgcG9ydGlvbiBnZXRzIGNvbnZlcnRlZCB0byBhbiBBU1QuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBbQ2xhc3MoLi4uKSwgLi4uXQorICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgbmFtZV90b2tlbnMgPSBbXQorICAgICAgICByZWZlcmVuY2UgPSBwb2ludGVyID0gYXJyYXkgPSBGYWxzZQorCisgICAgICAgIGRlZiBBZGRUeXBlKHRlbXBsYXRlZF90eXBlcyk6CisgICAgICAgICAgICAjIFBhcnRpdGlvbiB0b2tlbnMgaW50byBuYW1lIGFuZCBtb2RpZmllciB0b2tlbnMuCisgICAgICAgICAgICBuYW1lcyA9IFtdCisgICAgICAgICAgICBtb2RpZmllcnMgPSBbXQorICAgICAgICAgICAgZm9yIHQgaW4gbmFtZV90b2tlbnM6CisgICAgICAgICAgICAgICAgaWYga2V5d29yZHMuSXNLZXl3b3JkKHQubmFtZSk6CisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycy5hcHBlbmQodC5uYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZCh0Lm5hbWUpCisgICAgICAgICAgICBuYW1lID0gJycuam9pbihuYW1lcykKKyAgICAgICAgICAgIGlmIG5hbWVfdG9rZW5zOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVHlwZShuYW1lX3Rva2Vuc1swXS5zdGFydCwgbmFtZV90b2tlbnNbLTFdLmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGVtcGxhdGVkX3R5cGVzLCBtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciwgYXJyYXkpKQorICAgICAgICAgICAgZGVsIG5hbWVfdG9rZW5zWzpdCisKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZW5kID0gbGVuKHRva2VucykKKyAgICAgICAgd2hpbGUgaSA8IGVuZDoKKyAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldCisgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc8JzoKKyAgICAgICAgICAgICAgICBuZXdfdG9rZW5zLCBuZXdfZW5kID0gc2VsZi5fR2V0VGVtcGxhdGVFbmQodG9rZW5zLCBpKzEpCisgICAgICAgICAgICAgICAgQWRkVHlwZShzZWxmLlRvVHlwZShuZXdfdG9rZW5zKSkKKyAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIGEgY29tbWEgYWZ0ZXIgdGhlIHRlbXBsYXRlLCB3ZSBuZWVkIHRvIGNvbnN1bWUKKyAgICAgICAgICAgICAgICAjIHRoYXQgaGVyZSBvdGhlcndpc2UgaXQgYmVjb21lcyBwYXJ0IG9mIHRoZSBuYW1lLgorICAgICAgICAgICAgICAgIGkgPSBuZXdfZW5kCisgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcG9pbnRlciA9IGFycmF5ID0gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgdG9rZW4ubmFtZSA9PSAnLCc6CisgICAgICAgICAgICAgICAgQWRkVHlwZShbXSkKKyAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBwb2ludGVyID0gYXJyYXkgPSBGYWxzZQorICAgICAgICAgICAgZWxpZiB0b2tlbi5uYW1lID09ICcqJzoKKyAgICAgICAgICAgICAgICBwb2ludGVyID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiB0b2tlbi5uYW1lID09ICcmJzoKKyAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBUcnVlCisgICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gJ1snOgorICAgICAgICAgICAgICAgcG9pbnRlciA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgdG9rZW4ubmFtZSA9PSAnXSc6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lX3Rva2Vucy5hcHBlbmQodG9rZW4pCisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICBpZiBuYW1lX3Rva2VuczoKKyAgICAgICAgICAgICMgTm8gJzwnIGluIHRoZSB0b2tlbnMsIGp1c3QgYSBzaW1wbGUgbmFtZSBhbmQgbm8gdGVtcGxhdGUuCisgICAgICAgICAgICBBZGRUeXBlKFtdKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgRGVjbGFyYXRpb25Ub1BhcnRzKHNlbGYsIHBhcnRzLCBuZWVkc19uYW1lX3JlbW92ZWQpOgorICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICBkZWZhdWx0ID0gW10KKyAgICAgICAgaWYgbmVlZHNfbmFtZV9yZW1vdmVkOgorICAgICAgICAgICAgIyBIYW5kbGUgZGVmYXVsdCAoaW5pdGlhbCkgdmFsdWVzIHByb3Blcmx5LgorICAgICAgICAgICAgZm9yIGksIHQgaW4gZW51bWVyYXRlKHBhcnRzKToKKyAgICAgICAgICAgICAgICBpZiB0Lm5hbWUgPT0gJz0nOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gcGFydHNbaSsxOl0KKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhcnRzW2ktMV0ubmFtZQorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lID09ICddJyBhbmQgcGFydHNbaS0yXS5uYW1lID09ICdbJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJ0c1tpLTNdLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgLT0gMQorICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhcnRzWzppLTFdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHBhcnRzWy0xXS50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUU6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJ0cy5wb3AoKS5uYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogdGhpcyBpcyBhIGhhY2sgdGhhdCBoYXBwZW5zIGZvciBjb2RlIGxpa2UKKyAgICAgICAgICAgICAgICAgICAgIyBSZWdpc3RlcihGb288VD4pOyB3aGVyZSBpdCB0aGlua3MgdGhpcyBpcyBhIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgIyBidXQgaXQncyBhY3R1YWxseSBhIGRlY2xhcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gJz8/PycKKyAgICAgICAgbW9kaWZpZXJzID0gW10KKyAgICAgICAgdHlwZV9uYW1lID0gW10KKyAgICAgICAgb3RoZXJfdG9rZW5zID0gW10KKyAgICAgICAgdGVtcGxhdGVkX3R5cGVzID0gW10KKyAgICAgICAgaSA9IDAKKyAgICAgICAgZW5kID0gbGVuKHBhcnRzKQorICAgICAgICB3aGlsZSBpIDwgZW5kOgorICAgICAgICAgICAgcCA9IHBhcnRzW2ldCisgICAgICAgICAgICBpZiBrZXl3b3Jkcy5Jc0tleXdvcmQocC5uYW1lKToKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMuYXBwZW5kKHAubmFtZSkKKyAgICAgICAgICAgIGVsaWYgcC5uYW1lID09ICc8JzoKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZWRfdG9rZW5zLCBuZXdfZW5kID0gc2VsZi5fR2V0VGVtcGxhdGVFbmQocGFydHMsIGkrMSkKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZWRfdHlwZXMgPSBzZWxmLlRvVHlwZSh0ZW1wbGF0ZWRfdG9rZW5zKQorICAgICAgICAgICAgICAgIGkgPSBuZXdfZW5kIC0gMQorICAgICAgICAgICAgICAgICMgRG9uJ3QgYWRkIGEgc3B1cmlvdXMgOjogdG8gZGF0YSBtZW1iZXJzIGJlaW5nIGluaXRpYWxpemVkLgorICAgICAgICAgICAgICAgIG5leHRfaW5kZXggPSBpICsgMQorICAgICAgICAgICAgICAgIGlmIG5leHRfaW5kZXggPCBlbmQgYW5kIHBhcnRzW25leHRfaW5kZXhdLm5hbWUgPT0gJzo6JzoKKyAgICAgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBlbGlmIHAubmFtZSBpbiAoJ1snLCAnXScsICc9Jyk6CisgICAgICAgICAgICAgICAgIyBUaGVzZSBhcmUgaGFuZGxlZCBlbHNld2hlcmUuCisgICAgICAgICAgICAgICAgb3RoZXJfdG9rZW5zLmFwcGVuZChwKQorICAgICAgICAgICAgZWxpZiBwLm5hbWUgbm90IGluICgnKicsICcmJywgJz4nKToKKyAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IG5hbWVzIGhhdmUgYSBzcGFjZSBiZXR3ZWVuIHRoZW0uCisgICAgICAgICAgICAgICAgaWYgKHR5cGVfbmFtZSBhbmQgdHlwZV9uYW1lWy0xXS50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUUgYW5kCisgICAgICAgICAgICAgICAgICAgIHAudG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FKToKKyAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lLmFwcGVuZCh0b2tlbml6ZS5Ub2tlbih0b2tlbml6ZS5TWU5UQVgsICcgJywgMCwgMCkpCisgICAgICAgICAgICAgICAgdHlwZV9uYW1lLmFwcGVuZChwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdGhlcl90b2tlbnMuYXBwZW5kKHApCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgdHlwZV9uYW1lID0gJycuam9pbihbdC5uYW1lIGZvciB0IGluIHR5cGVfbmFtZV0pCisgICAgICAgIHJldHVybiBuYW1lLCB0eXBlX25hbWUsIHRlbXBsYXRlZF90eXBlcywgbW9kaWZpZXJzLCBkZWZhdWx0LCBvdGhlcl90b2tlbnMKKworICAgIGRlZiBUb1BhcmFtZXRlcnMoc2VsZiwgdG9rZW5zKToKKyAgICAgICAgaWYgbm90IHRva2VuczoKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIG5hbWUgPSB0eXBlX25hbWUgPSAnJworICAgICAgICB0eXBlX21vZGlmaWVycyA9IFtdCisgICAgICAgIHBvaW50ZXIgPSByZWZlcmVuY2UgPSBhcnJheSA9IEZhbHNlCisgICAgICAgIGZpcnN0X3Rva2VuID0gTm9uZQorICAgICAgICBkZWZhdWx0ID0gW10KKworICAgICAgICBkZWYgQWRkUGFyYW1ldGVyKGVuZCk6CisgICAgICAgICAgICBpZiBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGRlbCBkZWZhdWx0WzBdICAjIFJlbW92ZSBmbGFnLgorICAgICAgICAgICAgcGFydHMgPSBzZWxmLkRlY2xhcmF0aW9uVG9QYXJ0cyh0eXBlX21vZGlmaWVycywgVHJ1ZSkKKyAgICAgICAgICAgIChuYW1lLCB0eXBlX25hbWUsIHRlbXBsYXRlZF90eXBlcywgbW9kaWZpZXJzLAorICAgICAgICAgICAgIHVudXNlZF9kZWZhdWx0LCB1bnVzZWRfb3RoZXJfdG9rZW5zKSA9IHBhcnRzCisgICAgICAgICAgICBwYXJhbWV0ZXJfdHlwZSA9IFR5cGUoZmlyc3RfdG9rZW4uc3RhcnQsIGZpcnN0X3Rva2VuLmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsIHRlbXBsYXRlZF90eXBlcywgbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciwgYXJyYXkpCisgICAgICAgICAgICBwID0gUGFyYW1ldGVyKGZpcnN0X3Rva2VuLnN0YXJ0LCBlbmQsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl90eXBlLCBkZWZhdWx0KQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwKQorCisgICAgICAgIHRlbXBsYXRlX2NvdW50ID0gMAorICAgICAgICBmb3IgcyBpbiB0b2tlbnM6CisgICAgICAgICAgICBpZiBub3QgZmlyc3RfdG9rZW46CisgICAgICAgICAgICAgICAgZmlyc3RfdG9rZW4gPSBzCisgICAgICAgICAgICBpZiBzLm5hbWUgPT0gJzwnOgorICAgICAgICAgICAgICAgIHRlbXBsYXRlX2NvdW50ICs9IDEKKyAgICAgICAgICAgIGVsaWYgcy5uYW1lID09ICc+JzoKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jb3VudCAtPSAxCisgICAgICAgICAgICBpZiB0ZW1wbGF0ZV9jb3VudCA+IDA6CisgICAgICAgICAgICAgICAgdHlwZV9tb2RpZmllcnMuYXBwZW5kKHMpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgcy5uYW1lID09ICcsJzoKKyAgICAgICAgICAgICAgICBBZGRQYXJhbWV0ZXIocy5zdGFydCkKKyAgICAgICAgICAgICAgICBuYW1lID0gdHlwZV9uYW1lID0gJycKKyAgICAgICAgICAgICAgICB0eXBlX21vZGlmaWVycyA9IFtdCisgICAgICAgICAgICAgICAgcG9pbnRlciA9IHJlZmVyZW5jZSA9IGFycmF5ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBmaXJzdF90b2tlbiA9IE5vbmUKKyAgICAgICAgICAgICAgICBkZWZhdWx0ID0gW10KKyAgICAgICAgICAgIGVsaWYgcy5uYW1lID09ICcqJzoKKyAgICAgICAgICAgICAgICBwb2ludGVyID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBzLm5hbWUgPT0gJyYnOgorICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgcy5uYW1lID09ICdbJzoKKyAgICAgICAgICAgICAgICBhcnJheSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgcy5uYW1lID09ICddJzoKKyAgICAgICAgICAgICAgICBwYXNzICAjIEp1c3QgZG9uJ3QgYWRkIHRvIHR5cGVfbW9kaWZpZXJzLgorICAgICAgICAgICAgZWxpZiBzLm5hbWUgPT0gJz0nOgorICAgICAgICAgICAgICAgICMgR290IGEgZGVmYXVsdCB2YWx1ZS4gIEFkZCBhbnkgdmFsdWUgKE5vbmUpIGFzIGEgZmxhZy4KKyAgICAgICAgICAgICAgICBkZWZhdWx0LmFwcGVuZChOb25lKQorICAgICAgICAgICAgZWxpZiBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGRlZmF1bHQuYXBwZW5kKHMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHR5cGVfbW9kaWZpZXJzLmFwcGVuZChzKQorICAgICAgICBBZGRQYXJhbWV0ZXIodG9rZW5zWy0xXS5lbmQpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBDcmVhdGVSZXR1cm5UeXBlKHNlbGYsIHJldHVybl90eXBlX3NlcSk6CisgICAgICAgIGlmIG5vdCByZXR1cm5fdHlwZV9zZXE6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBzdGFydCA9IHJldHVybl90eXBlX3NlcVswXS5zdGFydAorICAgICAgICBlbmQgPSByZXR1cm5fdHlwZV9zZXFbLTFdLmVuZAorICAgICAgICBfLCBuYW1lLCB0ZW1wbGF0ZWRfdHlwZXMsIG1vZGlmaWVycywgZGVmYXVsdCwgb3RoZXJfdG9rZW5zID0gXAorICAgICAgICAgICBzZWxmLkRlY2xhcmF0aW9uVG9QYXJ0cyhyZXR1cm5fdHlwZV9zZXEsIEZhbHNlKQorICAgICAgICBuYW1lcyA9IFtuLm5hbWUgZm9yIG4gaW4gb3RoZXJfdG9rZW5zXQorICAgICAgICByZWZlcmVuY2UgPSAnJicgaW4gbmFtZXMKKyAgICAgICAgcG9pbnRlciA9ICcqJyBpbiBuYW1lcworICAgICAgICBhcnJheSA9ICdbJyBpbiBuYW1lcworICAgICAgICByZXR1cm4gVHlwZShzdGFydCwgZW5kLCBuYW1lLCB0ZW1wbGF0ZWRfdHlwZXMsIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLCBwb2ludGVyLCBhcnJheSkKKworICAgIGRlZiBHZXRUZW1wbGF0ZUluZGljZXMoc2VsZiwgbmFtZXMpOgorICAgICAgICAjIG5hbWVzIGlzIGEgbGlzdCBvZiBzdHJpbmdzLgorICAgICAgICBzdGFydCA9IG5hbWVzLmluZGV4KCc8JykKKyAgICAgICAgZW5kID0gbGVuKG5hbWVzKSAtIDEKKyAgICAgICAgd2hpbGUgZW5kID4gMDoKKyAgICAgICAgICAgIGlmIG5hbWVzW2VuZF0gPT0gJz4nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbmQgLT0gMQorICAgICAgICByZXR1cm4gc3RhcnQsIGVuZCsxCisKK2NsYXNzIEFzdEJ1aWxkZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW5fc3RyZWFtLCBmaWxlbmFtZSwgaW5fY2xhc3M9JycsIHZpc2liaWxpdHk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbmFtZXNwYWNlX3N0YWNrPVtdKToKKyAgICAgICAgc2VsZi50b2tlbnMgPSB0b2tlbl9zdHJlYW0KKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgICMgVE9ETyhubm9yd2l0eik6IHVzZSBhIGJldHRlciBkYXRhIHN0cnVjdHVyZSAoZGVxdWUpIGZvciB0aGUgcXVldWUuCisgICAgICAgICMgU3dpdGNoaW5nIGRpcmVjdGlvbnMgb2YgdGhlICJxdWV1ZSIgaW1wcm92ZWQgcGVyZiBieSBhYm91dCAyNSUuCisgICAgICAgICMgVXNpbmcgYSBkZXF1ZSBzaG91bGQgYmUgZXZlbiBiZXR0ZXIgc2luY2Ugd2UgYWNjZXNzIGZyb20gYm90aCBzaWRlcy4KKyAgICAgICAgc2VsZi50b2tlbl9xdWV1ZSA9IFtdCisgICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrID0gbmFtZXNwYWNlX3N0YWNrWzpdCisgICAgICAgIHNlbGYuaW5fY2xhc3MgPSBpbl9jbGFzcworICAgICAgICBpZiBpbl9jbGFzcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5pbl9jbGFzc19uYW1lX29ubHkgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmluX2NsYXNzX25hbWVfb25seSA9IGluX2NsYXNzLnNwbGl0KCc6OicpWy0xXQorICAgICAgICBzZWxmLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5CisgICAgICAgIHNlbGYuaW5fZnVuY3Rpb24gPSBGYWxzZQorICAgICAgICBzZWxmLmN1cnJlbnRfdG9rZW4gPSBOb25lCisgICAgICAgICMgS2VlcCB0aGUgc3RhdGUgd2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGhhbmRsaW5nIGEgdHlwZWRlZiBvciBub3QuCisgICAgICAgIHNlbGYuX2hhbmRsaW5nX3R5cGVkZWYgPSBGYWxzZQorCisgICAgICAgIHNlbGYuY29udmVydGVyID0gVHlwZUNvbnZlcnRlcihzZWxmLm5hbWVzcGFjZV9zdGFjaykKKworICAgIGRlZiBIYW5kbGVFcnJvcihzZWxmLCBtc2csIHRva2VuKToKKyAgICAgICAgcHJpbnRhYmxlX3F1ZXVlID0gbGlzdChyZXZlcnNlZChzZWxmLnRva2VuX3F1ZXVlWy0yMDpdKSkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnR290ICVzIGluICVzIEAgJXMgJXNcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChtc2csIHNlbGYuZmlsZW5hbWUsIHRva2VuLCBwcmludGFibGVfcXVldWUpKQorCisgICAgZGVmIEdlbmVyYXRlKHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgaWYgbm90IHRva2VuOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgR2V0IHRoZSBuZXh0IHRva2VuLgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rva2VuID0gdG9rZW4KKworICAgICAgICAgICAgIyBEaXNwYXRjaCBvbiB0aGUgbmV4dCB0b2tlbiB0eXBlLgorICAgICAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSBfSU5URVJOQUxfVE9LRU46CisgICAgICAgICAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSBfTkFNRVNQQUNFX1BPUDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2Vfc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fR2VuZXJhdGVPbmUodG9rZW4pCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXN1bHQKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLkhhbmRsZUVycm9yKCdleGNlcHRpb24nLCB0b2tlbikKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIF9DcmVhdGVWYXJpYWJsZShzZWxmLCBwb3NfdG9rZW4sIG5hbWUsIHR5cGVfbmFtZSwgdHlwZV9tb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICByZWZfcG9pbnRlcl9uYW1lX3NlcSwgdGVtcGxhdGVkX3R5cGVzLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgcmVmZXJlbmNlID0gJyYnIGluIHJlZl9wb2ludGVyX25hbWVfc2VxCisgICAgICAgIHBvaW50ZXIgPSAnKicgaW4gcmVmX3BvaW50ZXJfbmFtZV9zZXEKKyAgICAgICAgYXJyYXkgPSAnWycgaW4gcmVmX3BvaW50ZXJfbmFtZV9zZXEKKyAgICAgICAgdmFyX3R5cGUgPSBUeXBlKHBvc190b2tlbi5zdGFydCwgcG9zX3Rva2VuLmVuZCwgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVkX3R5cGVzLCB0eXBlX21vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciwgYXJyYXkpCisgICAgICAgIHJldHVybiBWYXJpYWJsZURlY2xhcmF0aW9uKHBvc190b2tlbi5zdGFydCwgcG9zX3Rva2VuLmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFyX3R5cGUsIHZhbHVlLCBzZWxmLm5hbWVzcGFjZV9zdGFjaykKKworICAgIGRlZiBfR2VuZXJhdGVPbmUoc2VsZiwgdG9rZW4pOgorICAgICAgICBpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUU6CisgICAgICAgICAgICBpZiAoa2V5d29yZHMuSXNLZXl3b3JkKHRva2VuLm5hbWUpIGFuZAorICAgICAgICAgICAgICAgIG5vdCBrZXl3b3Jkcy5Jc0J1aWx0aW5UeXBlKHRva2VuLm5hbWUpKToKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdoYW5kbGVfJyArIHRva2VuLm5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgpCisgICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gc2VsZi5pbl9jbGFzc19uYW1lX29ubHk6CisgICAgICAgICAgICAgICAgIyBUaGUgdG9rZW4gbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgY2xhc3MsIG11c3QgYmUgYSBjdG9yIGlmCisgICAgICAgICAgICAgICAgIyB0aGVyZSBpcyBhIHBhcmVuLiAgT3RoZXJ3aXNlLCBpdCdzIHRoZSByZXR1cm4gdHlwZS4KKyAgICAgICAgICAgICAgICAjIFBlZWsgYWhlYWQgdG8gZ2V0IHRoZSBuZXh0IHRva2VuIHRvIGZpZ3VyZSBvdXQgd2hpY2guCisgICAgICAgICAgICAgICAgbmV4dCA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKG5leHQpCisgICAgICAgICAgICAgICAgaWYgbmV4dC50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCBhbmQgbmV4dC5uYW1lID09ICcoJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX0dldE1ldGhvZChbdG9rZW5dLCBGVU5DVElPTl9DVE9SLCBOb25lLCBUcnVlKQorICAgICAgICAgICAgICAgICMgRmFsbCB0aHJvdWdoLS1oYW5kbGUgbGlrZSBhbnkgb3RoZXIgbWV0aG9kLgorCisgICAgICAgICAgICAjIEhhbmRsZSBkYXRhIG9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9uL2RlZmluaXRpb24uCisgICAgICAgICAgICBzeW50YXggPSB0b2tlbml6ZS5TWU5UQVgKKyAgICAgICAgICAgIHRlbXBfdG9rZW5zLCBsYXN0X3Rva2VuID0gXAorICAgICAgICAgICAgICAgIHNlbGYuX0dldFZhclRva2Vuc1VwVG8oc3ludGF4LCAnKCcsICc7JywgJ3snLCAnWycpCisgICAgICAgICAgICB0ZW1wX3Rva2Vucy5pbnNlcnQoMCwgdG9rZW4pCisgICAgICAgICAgICBpZiBsYXN0X3Rva2VuLm5hbWUgPT0gJygnOgorICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgYW4gYXNzaWdubWVudCBiZWZvcmUgdGhlIHBhcmVuLAorICAgICAgICAgICAgICAgICMgdGhpcyBpcyBhbiBleHByZXNzaW9uLCBub3QgYSBtZXRob2QuCisgICAgICAgICAgICAgICAgZXhwciA9IGJvb2woW2UgZm9yIGUgaW4gdGVtcF90b2tlbnMgaWYgZS5uYW1lID09ICc9J10pCisgICAgICAgICAgICAgICAgaWYgZXhwcjoKKyAgICAgICAgICAgICAgICAgICAgbmV3X3RlbXAgPSBzZWxmLl9HZXRUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJzsnKQorICAgICAgICAgICAgICAgICAgICB0ZW1wX3Rva2Vucy5hcHBlbmQobGFzdF90b2tlbikKKyAgICAgICAgICAgICAgICAgICAgdGVtcF90b2tlbnMuZXh0ZW5kKG5ld190ZW1wKQorICAgICAgICAgICAgICAgICAgICBsYXN0X3Rva2VuID0gdG9rZW5pemUuVG9rZW4odG9rZW5pemUuU1lOVEFYLCAnOycsIDAsIDApCisKKyAgICAgICAgICAgIGlmIGxhc3RfdG9rZW4ubmFtZSA9PSAnWyc6CisgICAgICAgICAgICAgICAgIyBIYW5kbGUgYXJyYXksIHRoaXMgaXNuJ3QgYSBtZXRob2QsIHVubGVzcyBpdCdzIGFuIG9wZXJhdG9yLgorICAgICAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGtlZXAgdGhlIHNpemUgc29tZXdoZXJlLgorICAgICAgICAgICAgICAgICMgdW51c2VkX3NpemUgPSBzZWxmLl9HZXRUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJ10nKQorICAgICAgICAgICAgICAgIHRlbXBfdG9rZW5zLmFwcGVuZChsYXN0X3Rva2VuKQorICAgICAgICAgICAgICAgIGlmIHRlbXBfdG9rZW5zWy0yXS5uYW1lID09ICdvcGVyYXRvcic6CisgICAgICAgICAgICAgICAgICAgIHRlbXBfdG9rZW5zLmFwcGVuZChzZWxmLl9HZXROZXh0VG9rZW4oKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0ZW1wX3Rva2VuczIsIGxhc3RfdG9rZW4gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9HZXRWYXJUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJzsnKQorICAgICAgICAgICAgICAgICAgICB0ZW1wX3Rva2Vucy5leHRlbmQodGVtcF90b2tlbnMyKQorCisgICAgICAgICAgICBpZiBsYXN0X3Rva2VuLm5hbWUgPT0gJzsnOgorICAgICAgICAgICAgICAgICMgSGFuZGxlIGRhdGEsIHRoaXMgaXNuJ3QgYSBtZXRob2QuCisgICAgICAgICAgICAgICAgcGFydHMgPSBzZWxmLmNvbnZlcnRlci5EZWNsYXJhdGlvblRvUGFydHModGVtcF90b2tlbnMsIFRydWUpCisgICAgICAgICAgICAgICAgKG5hbWUsIHR5cGVfbmFtZSwgdGVtcGxhdGVkX3R5cGVzLCBtb2RpZmllcnMsIGRlZmF1bHQsCisgICAgICAgICAgICAgICAgIHVudXNlZF9vdGhlcl90b2tlbnMpID0gcGFydHMKKworICAgICAgICAgICAgICAgIHQwID0gdGVtcF90b2tlbnNbMF0KKyAgICAgICAgICAgICAgICBuYW1lcyA9IFt0Lm5hbWUgZm9yIHQgaW4gdGVtcF90b2tlbnNdCisgICAgICAgICAgICAgICAgaWYgdGVtcGxhdGVkX3R5cGVzOgorICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gc2VsZi5jb252ZXJ0ZXIuR2V0VGVtcGxhdGVJbmRpY2VzKG5hbWVzKQorICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IG5hbWVzWzpzdGFydF0gKyBuYW1lc1tlbmQ6XQorICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAnJy5qb2luKFt0Lm5hbWUgZm9yIHQgaW4gZGVmYXVsdF0pCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZVZhcmlhYmxlKHQwLCBuYW1lLCB0eXBlX25hbWUsIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMsIHRlbXBsYXRlZF90eXBlcywgZGVmYXVsdCkKKyAgICAgICAgICAgIGlmIGxhc3RfdG9rZW4ubmFtZSA9PSAneyc6CisgICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2Vucyh0ZW1wX3Rva2Vuc1sxOl0pCisgICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKGxhc3RfdG9rZW4pCisgICAgICAgICAgICAgICAgbWV0aG9kX25hbWUgPSB0ZW1wX3Rva2Vuc1swXS5uYW1lCisgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCAnaGFuZGxlXycgKyBtZXRob2RfbmFtZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgbWV0aG9kOgorICAgICAgICAgICAgICAgICAgICAjIE11c3QgYmUgZGVjbGFyaW5nIGEgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSB0aGUgZGVjbGFyYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fR2V0TWV0aG9kKHRlbXBfdG9rZW5zLCAwLCBOb25lLCBGYWxzZSkKKyAgICAgICAgZWxpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWDoKKyAgICAgICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJ34nIGFuZCBzZWxmLmluX2NsYXNzOgorICAgICAgICAgICAgICAgICMgTXVzdCBiZSBhIGR0b3IgKHByb2JhYmx5IG5vdCBpbiBtZXRob2QgYm9keSkuCisgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgICMgc2VsZi5pbl9jbGFzcyBjYW4gY29udGFpbiBBOjpOYW1lLCBidXQgdGhlIGR0b3Igd2lsbCBvbmx5CisgICAgICAgICAgICAgICAgIyBiZSBOYW1lLiAgTWFrZSBzdXJlIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcmlnaHQgdmFsdWUuCisgICAgICAgICAgICAgICAgaWYgKHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRSBhbmQKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4ubmFtZSA9PSBzZWxmLmluX2NsYXNzX25hbWVfb25seSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9HZXRNZXRob2QoW3Rva2VuXSwgRlVOQ1RJT05fRFRPUiwgTm9uZSwgVHJ1ZSkKKyAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSBhIGxvdCBtb3JlIHN5bnRheC4KKyAgICAgICAgZWxpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlBSRVBST0NFU1NPUjoKKyAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGhhbmRsZSBtb3JlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgorICAgICAgICAgICAgIyB0b2tlbiBzdGFydHMgd2l0aCBhICMsIHNvIHJlbW92ZSBpdCBhbmQgc3RyaXAgd2hpdGVzcGFjZS4KKyAgICAgICAgICAgIG5hbWUgPSB0b2tlbi5uYW1lWzE6XS5sc3RyaXAoKQorICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdpbmNsdWRlJyk6CisgICAgICAgICAgICAgICAgIyBSZW1vdmUgImluY2x1ZGUiLgorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzc6XS5zdHJpcCgpCisgICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUKKyAgICAgICAgICAgICAgICAjIEhhbmRsZSAjaW5jbHVkZSBcPG5ld2xpbmU+ICJoZWFkZXItb24tc2Vjb25kLWxpbmUuaCIuCisgICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdcXCcpOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVsxOl0uc3RyaXAoKQorICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lWzBdIGluICc8IicsIHRva2VuCisgICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVbLTFdIGluICc+IicsIHRva2VuCisgICAgICAgICAgICAgICAgc3lzdGVtID0gbmFtZVswXSA9PSAnPCcKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5hbWVbMTotMV0KKyAgICAgICAgICAgICAgICByZXR1cm4gSW5jbHVkZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kLCBmaWxlbmFtZSwgc3lzdGVtKQorICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdkZWZpbmUnKToKKyAgICAgICAgICAgICAgICAjIFJlbW92ZSAiZGVmaW5lIi4KKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs2Ol0uc3RyaXAoKQorICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lCisgICAgICAgICAgICAgICAgdmFsdWUgPSAnJworICAgICAgICAgICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgaWYgYy5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5hbWVbaTpdLmxzdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6aV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcmV0dXJuIERlZmluZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kLCBuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnaWYnKSBhbmQgbmFtZVsyOjNdLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBuYW1lWzM6XS5zdHJpcCgpCisgICAgICAgICAgICAgICAgaWYgY29uZGl0aW9uLnN0YXJ0c3dpdGgoJzAnKSBvciBjb25kaXRpb24uc3RhcnRzd2l0aCgnKDApJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX1NraXBJZjBCbG9ja3MoKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9HZXRUb2tlbnNVcFRvKHNlbGYsIGV4cGVjdGVkX3Rva2VuX3R5cGUsIGV4cGVjdGVkX3Rva2VuKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX0dldFZhclRva2Vuc1VwVG8oZXhwZWN0ZWRfdG9rZW5fdHlwZSwgZXhwZWN0ZWRfdG9rZW4pWzBdCisKKyAgICBkZWYgX0dldFZhclRva2Vuc1VwVG8oc2VsZiwgZXhwZWN0ZWRfdG9rZW5fdHlwZSwgKmV4cGVjdGVkX3Rva2Vucyk6CisgICAgICAgIGxhc3RfdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICB0b2tlbnMgPSBbXQorICAgICAgICB3aGlsZSAobGFzdF90b2tlbi50b2tlbl90eXBlICE9IGV4cGVjdGVkX3Rva2VuX3R5cGUgb3IKKyAgICAgICAgICAgICAgIGxhc3RfdG9rZW4ubmFtZSBub3QgaW4gZXhwZWN0ZWRfdG9rZW5zKToKKyAgICAgICAgICAgIHRva2Vucy5hcHBlbmQobGFzdF90b2tlbikKKyAgICAgICAgICAgIGxhc3RfdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICByZXR1cm4gdG9rZW5zLCBsYXN0X3Rva2VuCisKKyAgICAjIFRPRE8obm5vcndpdHopOiByZW1vdmUgX0lnbm9yZVVwVG8oKSBpdCBzaG91bGRuJ3QgYmUgbmVjZXNhcnkuCisgICAgZGVmIF9JZ25vcmVVcFRvKHNlbGYsIHRva2VuX3R5cGUsIHRva2VuKToKKyAgICAgICAgdW51c2VkX3Rva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5fdHlwZSwgdG9rZW4pCisKKyAgICBkZWYgX1NraXBJZjBCbG9ja3Moc2VsZik6CisgICAgICAgIGNvdW50ID0gMQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSAhPSB0b2tlbml6ZS5QUkVQUk9DRVNTT1I6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgbmFtZSA9IHRva2VuLm5hbWVbMTpdLmxzdHJpcCgpCisgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ2VuZGlmJyk6CisgICAgICAgICAgICAgICAgY291bnQgLT0gMQorICAgICAgICAgICAgICAgIGlmIGNvdW50ID09IDA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIG5hbWUuc3RhcnRzd2l0aCgnaWYnKToKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisKKyAgICBkZWYgX0dldE1hdGNoaW5nQ2hhcihzZWxmLCBvcGVuX3BhcmVuLCBjbG9zZV9wYXJlbiwgR2V0TmV4dFRva2VuPU5vbmUpOgorICAgICAgICBpZiBHZXROZXh0VG9rZW4gaXMgTm9uZToKKyAgICAgICAgICAgIEdldE5leHRUb2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbgorICAgICAgICAjIEFzc3VtZXMgdGhlIGN1cnJlbnQgdG9rZW4gaXMgb3Blbl9wYXJlbiBhbmQgd2Ugd2lsbCBjb25zdW1lCisgICAgICAgICMgYW5kIHJldHVybiB1cCB0byB0aGUgY2xvc2VfcGFyZW4uCisgICAgICAgIGNvdW50ID0gMQorICAgICAgICB0b2tlbiA9IEdldE5leHRUb2tlbigpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWDoKKyAgICAgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09IG9wZW5fcGFyZW46CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gY2xvc2VfcGFyZW46CisgICAgICAgICAgICAgICAgICAgIGNvdW50IC09IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB5aWVsZCB0b2tlbgorICAgICAgICAgICAgdG9rZW4gPSBHZXROZXh0VG9rZW4oKQorICAgICAgICB5aWVsZCB0b2tlbgorCisgICAgZGVmIF9HZXRQYXJhbWV0ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCcoJywgJyknKQorCisgICAgZGVmIEdldFNjb3BlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCd7JywgJ30nKQorCisgICAgZGVmIF9HZXROZXh0VG9rZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYudG9rZW5fcXVldWU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbl9xdWV1ZS5wb3AoKQorICAgICAgICByZXR1cm4gbmV4dChzZWxmLnRva2VucykKKworICAgIGRlZiBfQWRkQmFja1Rva2VuKHNlbGYsIHRva2VuKToKKyAgICAgICAgaWYgdG9rZW4ud2hlbmNlID09IHRva2VuaXplLldIRU5DRV9TVFJFQU06CisgICAgICAgICAgICB0b2tlbi53aGVuY2UgPSB0b2tlbml6ZS5XSEVOQ0VfUVVFVUUKKyAgICAgICAgICAgIHNlbGYudG9rZW5fcXVldWUuaW5zZXJ0KDAsIHRva2VuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IHRva2VuLndoZW5jZSA9PSB0b2tlbml6ZS5XSEVOQ0VfUVVFVUUsIHRva2VuCisgICAgICAgICAgICBzZWxmLnRva2VuX3F1ZXVlLmFwcGVuZCh0b2tlbikKKworICAgIGRlZiBfQWRkQmFja1Rva2VucyhzZWxmLCB0b2tlbnMpOgorICAgICAgICBpZiB0b2tlbnM6CisgICAgICAgICAgICBpZiB0b2tlbnNbLTFdLndoZW5jZSA9PSB0b2tlbml6ZS5XSEVOQ0VfU1RSRUFNOgorICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CisgICAgICAgICAgICAgICAgICAgIHRva2VuLndoZW5jZSA9IHRva2VuaXplLldIRU5DRV9RVUVVRQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5fcXVldWVbOjBdID0gcmV2ZXJzZWQodG9rZW5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW5zWy0xXS53aGVuY2UgPT0gdG9rZW5pemUuV0hFTkNFX1FVRVVFLCB0b2tlbnMKKyAgICAgICAgICAgICAgICBzZWxmLnRva2VuX3F1ZXVlLmV4dGVuZChyZXZlcnNlZCh0b2tlbnMpKQorCisgICAgZGVmIEdldE5hbWUoc2VsZiwgc2VxPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIChbdG9rZW5zXSwgbmV4dF90b2tlbl9pbmZvKS4iIiIKKyAgICAgICAgR2V0TmV4dFRva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuCisgICAgICAgIGlmIHNlcSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGl0ID0gaXRlcihzZXEpCisgICAgICAgICAgICBHZXROZXh0VG9rZW4gPSBsYW1iZGE6IG5leHQoaXQpCisgICAgICAgIG5leHRfdG9rZW4gPSBHZXROZXh0VG9rZW4oKQorICAgICAgICB0b2tlbnMgPSBbXQorICAgICAgICBsYXN0X3Rva2VuX3dhc19uYW1lID0gRmFsc2UKKyAgICAgICAgd2hpbGUgKG5leHRfdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FIG9yCisgICAgICAgICAgICAgICAobmV4dF90b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCBhbmQKKyAgICAgICAgICAgICAgICBuZXh0X3Rva2VuLm5hbWUgaW4gKCc6OicsICc8JykpKToKKyAgICAgICAgICAgICMgVHdvIE5BTUVzIGluIGEgcm93IG1lYW5zIHRoZSBpZGVudGlmaWVyIHNob3VsZCB0ZXJtaW5hdGUuCisgICAgICAgICAgICAjIEl0J3MgcHJvYmFibHkgc29tZSBzb3J0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgICAgICAgICAgaWYgbGFzdF90b2tlbl93YXNfbmFtZSBhbmQgbmV4dF90b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxhc3RfdG9rZW5fd2FzX25hbWUgPSBuZXh0X3Rva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRQorICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChuZXh0X3Rva2VuKQorICAgICAgICAgICAgIyBIYW5kbGUgdGVtcGxhdGVkIG5hbWVzLgorICAgICAgICAgICAgaWYgbmV4dF90b2tlbi5uYW1lID09ICc8JzoKKyAgICAgICAgICAgICAgICB0b2tlbnMuZXh0ZW5kKHNlbGYuX0dldE1hdGNoaW5nQ2hhcignPCcsICc+JywgR2V0TmV4dFRva2VuKSkKKyAgICAgICAgICAgICAgICBsYXN0X3Rva2VuX3dhc19uYW1lID0gVHJ1ZQorICAgICAgICAgICAgbmV4dF90b2tlbiA9IEdldE5leHRUb2tlbigpCisgICAgICAgIHJldHVybiB0b2tlbnMsIG5leHRfdG9rZW4KKworICAgIGRlZiBHZXRNZXRob2Qoc2VsZiwgbW9kaWZpZXJzLCB0ZW1wbGF0ZWRfdHlwZXMpOgorICAgICAgICByZXR1cm5fdHlwZV9hbmRfbmFtZSA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnKCcpCisgICAgICAgIGFzc2VydCBsZW4ocmV0dXJuX3R5cGVfYW5kX25hbWUpID49IDEKKyAgICAgICAgcmV0dXJuIHNlbGYuX0dldE1ldGhvZChyZXR1cm5fdHlwZV9hbmRfbmFtZSwgbW9kaWZpZXJzLCB0ZW1wbGF0ZWRfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpCisKKyAgICBkZWYgX0dldE1ldGhvZChzZWxmLCByZXR1cm5fdHlwZV9hbmRfbmFtZSwgbW9kaWZpZXJzLCB0ZW1wbGF0ZWRfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgZ2V0X3BhcmVuKToKKyAgICAgICAgdGVtcGxhdGVfcG9ydGlvbiA9IE5vbmUKKyAgICAgICAgaWYgZ2V0X3BhcmVuOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgYXNzZXJ0IHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuU1lOVEFYLCB0b2tlbgorICAgICAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSAnPCc6CisgICAgICAgICAgICAgICAgIyBIYW5kbGUgdGVtcGxhdGl6ZWQgZHRvcnMuCisgICAgICAgICAgICAgICAgdGVtcGxhdGVfcG9ydGlvbiA9IFt0b2tlbl0KKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9wb3J0aW9uLmV4dGVuZChzZWxmLl9HZXRNYXRjaGluZ0NoYXIoJzwnLCAnPicpKQorICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuKCkKKyAgICAgICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgdG9rZW4KKyAgICAgICAgICAgIGFzc2VydCB0b2tlbi5uYW1lID09ICcoJywgdG9rZW4KKworICAgICAgICBuYW1lID0gcmV0dXJuX3R5cGVfYW5kX25hbWUucG9wKCkKKyAgICAgICAgIyBIYW5kbGUgdGVtcGxhdGl6ZWQgY3RvcnMuCisgICAgICAgIGlmIG5hbWUubmFtZSA9PSAnPic6CisgICAgICAgICAgICBpbmRleCA9IDEKKyAgICAgICAgICAgIHdoaWxlIHJldHVybl90eXBlX2FuZF9uYW1lW2luZGV4XS5uYW1lICE9ICc8JzoKKyAgICAgICAgICAgICAgICBpbmRleCArPSAxCisgICAgICAgICAgICB0ZW1wbGF0ZV9wb3J0aW9uID0gcmV0dXJuX3R5cGVfYW5kX25hbWVbaW5kZXg6XSArIFtuYW1lXQorICAgICAgICAgICAgZGVsIHJldHVybl90eXBlX2FuZF9uYW1lW2luZGV4Ol0KKyAgICAgICAgICAgIG5hbWUgPSByZXR1cm5fdHlwZV9hbmRfbmFtZS5wb3AoKQorICAgICAgICBlbGlmIG5hbWUubmFtZSA9PSAnXSc6CisgICAgICAgICAgICBydCA9IHJldHVybl90eXBlX2FuZF9uYW1lCisgICAgICAgICAgICBhc3NlcnQgcnRbLTFdLm5hbWUgPT0gJ1snLCByZXR1cm5fdHlwZV9hbmRfbmFtZQorICAgICAgICAgICAgYXNzZXJ0IHJ0Wy0yXS5uYW1lID09ICdvcGVyYXRvcicsIHJldHVybl90eXBlX2FuZF9uYW1lCisgICAgICAgICAgICBuYW1lX3NlcSA9IHJldHVybl90eXBlX2FuZF9uYW1lWy0yOl0KKyAgICAgICAgICAgIGRlbCByZXR1cm5fdHlwZV9hbmRfbmFtZVstMjpdCisgICAgICAgICAgICBuYW1lID0gdG9rZW5pemUuVG9rZW4odG9rZW5pemUuTkFNRSwgJ29wZXJhdG9yW10nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc2VxWzBdLnN0YXJ0LCBuYW1lLmVuZCkKKyAgICAgICAgICAgICMgR2V0IHRoZSBvcGVuIHBhcmVuIHNvIF9HZXRQYXJhbWV0ZXJzKCkgYmVsb3cgd29ya3MuCisgICAgICAgICAgICB1bnVzZWRfb3Blbl9wYXJlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisKKyAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogc3RvcmUgdGVtcGxhdGVfcG9ydGlvbi4KKyAgICAgICAgcmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZV9hbmRfbmFtZQorICAgICAgICBpbmRpY2VzID0gbmFtZQorICAgICAgICBpZiByZXR1cm5fdHlwZToKKyAgICAgICAgICAgIGluZGljZXMgPSByZXR1cm5fdHlwZVswXQorCisgICAgICAgICMgRm9yY2UgY3RvciBmb3IgdGVtcGxhdGl6ZWQgY3RvcnMuCisgICAgICAgIGlmIG5hbWUubmFtZSA9PSBzZWxmLmluX2NsYXNzIGFuZCBub3QgbW9kaWZpZXJzOgorICAgICAgICAgICAgbW9kaWZpZXJzIHw9IEZVTkNUSU9OX0NUT1IKKyAgICAgICAgcGFyYW1ldGVycyA9IGxpc3Qoc2VsZi5fR2V0UGFyYW1ldGVycygpKQorICAgICAgICBkZWwgcGFyYW1ldGVyc1stMV0gICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nICcpJy4KKworICAgICAgICAjIEhhbmRsaW5nIG9wZXJhdG9yKCkgaXMgZXNwZWNpYWxseSB3ZWlyZC4KKyAgICAgICAgaWYgbmFtZS5uYW1lID09ICdvcGVyYXRvcicgYW5kIG5vdCBwYXJhbWV0ZXJzOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgYXNzZXJ0IHRva2VuLm5hbWUgPT0gJygnLCB0b2tlbgorICAgICAgICAgICAgcGFyYW1ldGVycyA9IGxpc3Qoc2VsZi5fR2V0UGFyYW1ldGVycygpKQorICAgICAgICAgICAgZGVsIHBhcmFtZXRlcnNbLTFdICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nICcpJy4KKworICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgIHdoaWxlIHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRToKKyAgICAgICAgICAgIG1vZGlmaWVyX3Rva2VuID0gdG9rZW4KKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuKCkKKyAgICAgICAgICAgIGlmIG1vZGlmaWVyX3Rva2VuLm5hbWUgPT0gJ2NvbnN0JzoKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMgfD0gRlVOQ1RJT05fQ09OU1QKKyAgICAgICAgICAgIGVsaWYgbW9kaWZpZXJfdG9rZW4ubmFtZSA9PSAnX19hdHRyaWJ1dGVfXyc6CisgICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIG1vcmUgX19hdHRyaWJ1dGVfXyBkZXRhaWxzLgorICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBGVU5DVElPTl9BVFRSSUJVVEUKKyAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnKCcsIHRva2VuCisgICAgICAgICAgICAgICAgIyBDb25zdW1lIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgKHBhcmVucykuCisgICAgICAgICAgICAgICAgdW51c2VkX3Rva2VucyA9IGxpc3Qoc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCcoJywgJyknKSkKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgICAgICBlbGlmIG1vZGlmaWVyX3Rva2VuLm5hbWUgPT0gJ3Rocm93JzoKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMgfD0gRlVOQ1RJT05fVEhST1cKKyAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnKCcsIHRva2VuCisgICAgICAgICAgICAgICAgIyBDb25zdW1lIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgKHBhcmVucykuCisgICAgICAgICAgICAgICAgdW51c2VkX3Rva2VucyA9IGxpc3Qoc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCcoJywgJyknKSkKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgICAgICBlbGlmIG1vZGlmaWVyX3Rva2VuLm5hbWUgPT0gJ292ZXJyaWRlJzoKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMgfD0gRlVOQ1RJT05fT1ZFUlJJREUKKyAgICAgICAgICAgIGVsaWYgbW9kaWZpZXJfdG9rZW4ubmFtZSA9PSBtb2RpZmllcl90b2tlbi5uYW1lLnVwcGVyKCk6CisgICAgICAgICAgICAgICAgIyBIQUNLKG5ub3J3aXR6KTogIGFzc3VtZSB0aGF0IGFsbCB1cHBlci1jYXNlIG5hbWVzCisgICAgICAgICAgICAgICAgIyBhcmUgc29tZSBtYWNybyB3ZSBhcmVuJ3QgZXhwYW5kaW5nLgorICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBGVU5DVElPTl9VTktOT1dOX0FOTk9UQVRJT04KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5IYW5kbGVFcnJvcigndW5leHBlY3RlZCB0b2tlbicsIG1vZGlmaWVyX3Rva2VuKQorCisgICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgdG9rZW4KKyAgICAgICAgIyBIYW5kbGUgY3RvciBpbml0aWFsaXplcnMuCisgICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJzonOgorICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogYW55dGhpbmcgZWxzZSB0byBoYW5kbGUgZm9yIGluaXRpYWxpemVyIGxpc3Q/CisgICAgICAgICAgICB3aGlsZSB0b2tlbi5uYW1lICE9ICc7JyBhbmQgdG9rZW4ubmFtZSAhPSAneyc6CisgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorCisgICAgICAgICMgSGFuZGxlIHBvaW50ZXIgdG8gZnVuY3Rpb25zIHRoYXQgYXJlIHJlYWxseSBkYXRhIGJ1dCBsb29rCisgICAgICAgICMgbGlrZSBtZXRob2QgZGVjbGFyYXRpb25zLgorICAgICAgICBpZiB0b2tlbi5uYW1lID09ICcoJzoKKyAgICAgICAgICAgIGlmIHBhcmFtZXRlcnNbMF0ubmFtZSA9PSAnKic6CisgICAgICAgICAgICAgICAgIyBuYW1lIGNvbnRhaW5zIHRoZSByZXR1cm4gdHlwZS4KKyAgICAgICAgICAgICAgICBuYW1lID0gcGFyYW1ldGVycy5wb3AoKQorICAgICAgICAgICAgICAgICMgcGFyYW1ldGVycyBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZGF0YS4KKyAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBbcC5uYW1lIGZvciBwIGluIHBhcmFtZXRlcnNdCisgICAgICAgICAgICAgICAgIyBBbHJlYWR5IGF0IHRoZSAoIHRvIG9wZW4gdGhlIHBhcmFtZXRlciBsaXN0LgorICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3BhcmFtZXRlcnMgPSBsaXN0KHNlbGYuX0dldE1hdGNoaW5nQ2hhcignKCcsICcpJykpCisgICAgICAgICAgICAgICAgZGVsIGZ1bmN0aW9uX3BhcmFtZXRlcnNbLTFdICAjIFJlbW92ZSB0cmFpbGluZyAnKScuCisgICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogc3RvcmUgdGhlIGZ1bmN0aW9uX3BhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgdG9rZW4KKyAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnOycsIHRva2VuCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZVZhcmlhYmxlKGluZGljZXMsIG5hbWUubmFtZSwgaW5kaWNlcy5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsICcnLCBOb25lKQorICAgICAgICAgICAgIyBBdCB0aGlzIHBvaW50LCB3ZSBnb3Qgc29tZXRoaW5nIGxpa2U6CisgICAgICAgICAgICAjICByZXR1cm5fdHlwZSAodHlwZTo6Km5hbWVfKShwYXJhbXMpOworICAgICAgICAgICAgIyBUaGlzIGlzIGEgZGF0YSBtZW1iZXIgY2FsbGVkIG5hbWVfIHRoYXQgaXMgYSBmdW5jdGlvbiBwb2ludGVyLgorICAgICAgICAgICAgIyBXaXRoIHRoaXMgY29kZTogdm9pZCAoc3FfdHlwZTo6KmZpZWxkXykoc3RyaW5nJik7CisgICAgICAgICAgICAjIFdlIGdldDogbmFtZT12b2lkIHJldHVybl90eXBlPVtdIHBhcmFtZXRlcnM9c3FfdHlwZSAuLi4gZmllbGRfCisgICAgICAgICAgICAjIFRPRE8obm5vcndpdHopOiBpcyByZXR1cm5fdHlwZSBhbHdheXMgZW1wdHk/CisgICAgICAgICAgICAjIFRPRE8obm5vcndpdHopOiB0aGlzIGlzbid0IGV2ZW4gY2xvc2UgdG8gYmVpbmcgY29ycmVjdC4KKyAgICAgICAgICAgICMgSnVzdCBwdXQgaW4gc29tZXRoaW5nIHNvIHdlIGRvbid0IGNyYXNoIGFuZCBjYW4gbW92ZSBvbi4KKyAgICAgICAgICAgIHJlYWxfbmFtZSA9IHBhcmFtZXRlcnNbLTFdCisgICAgICAgICAgICBtb2RpZmllcnMgPSBbcC5uYW1lIGZvciBwIGluIHNlbGYuX0dldFBhcmFtZXRlcnMoKV0KKyAgICAgICAgICAgIGRlbCBtb2RpZmllcnNbLTFdICAgICAgICAgICAjIFJlbW92ZSB0cmFpbGluZyAnKScuCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fQ3JlYXRlVmFyaWFibGUoaW5kaWNlcywgcmVhbF9uYW1lLm5hbWUsIGluZGljZXMubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsICcnLCBOb25lKQorCisgICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJ3snOgorICAgICAgICAgICAgYm9keSA9IGxpc3Qoc2VsZi5HZXRTY29wZSgpKQorICAgICAgICAgICAgZGVsIGJvZHlbLTFdICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nICd9Jy4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJvZHkgPSBOb25lCisgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc9JzoKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisKKyAgICAgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICdkZWZhdWx0JyBvciB0b2tlbi5uYW1lID09ICdkZWxldGUnOgorICAgICAgICAgICAgICAgICAgICAjIElnbm9yZSBleHBsaWNpdGx5IGRlZmF1bHRlZCBhbmQgZGVsZXRlZCBzcGVjaWFsIG1lbWJlcnMKKyAgICAgICAgICAgICAgICAgICAgIyBpbiBDKysxMS4KKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIHB1cmUtdmlydHVhbCBkZWNsYXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLkNPTlNUQU5ULCB0b2tlbgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnMCcsIHRva2VuCisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyB8PSBGVU5DVElPTl9QVVJFX1ZJUlRVQUwKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorCisgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICdbJzoKKyAgICAgICAgICAgICAgICAjIFRPRE8obm5vcndpdHopOiBzdG9yZSB0b2tlbnMgYW5kIGltcHJvdmUgcGFyc2luZy4KKyAgICAgICAgICAgICAgICAjIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4gY2hhciAoJkFTSChUICgmc2VxKVtOXSkpW05dOworICAgICAgICAgICAgICAgIHRva2VucyA9IGxpc3Qoc2VsZi5fR2V0TWF0Y2hpbmdDaGFyKCdbJywgJ10nKSkKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisKKyAgICAgICAgICAgIGFzc2VydCB0b2tlbi5uYW1lID09ICc7JywgKHRva2VuLCByZXR1cm5fdHlwZV9hbmRfbmFtZSwgcGFyYW1ldGVycykKKworICAgICAgICAjIExvb2tzIGxpa2Ugd2UgZ290IGEgbWV0aG9kLCBub3QgYSBmdW5jdGlvbi4KKyAgICAgICAgaWYgbGVuKHJldHVybl90eXBlKSA+IDIgYW5kIHJldHVybl90eXBlWy0xXS5uYW1lID09ICc6Oic6CisgICAgICAgICAgICByZXR1cm5fdHlwZSwgaW5fY2xhc3MgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fR2V0UmV0dXJuVHlwZUFuZENsYXNzTmFtZShyZXR1cm5fdHlwZSkKKyAgICAgICAgICAgIHJldHVybiBNZXRob2QoaW5kaWNlcy5zdGFydCwgaW5kaWNlcy5lbmQsIG5hbWUubmFtZSwgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl90eXBlLCBwYXJhbWV0ZXJzLCBtb2RpZmllcnMsIHRlbXBsYXRlZF90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCisgICAgICAgIHJldHVybiBGdW5jdGlvbihpbmRpY2VzLnN0YXJ0LCBpbmRpY2VzLmVuZCwgbmFtZS5uYW1lLCByZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIG1vZGlmaWVycywgdGVtcGxhdGVkX3R5cGVzLCBib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCisKKyAgICBkZWYgX0dldFJldHVyblR5cGVBbmRDbGFzc05hbWUoc2VsZiwgdG9rZW5fc2VxKToKKyAgICAgICAgIyBTcGxpdHRpbmcgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGNsYXNzIG5hbWUgaW4gYSBtZXRob2QKKyAgICAgICAgIyBjYW4gYmUgdHJpY2t5LiAgRm9yIGV4YW1wbGUsIFJldHVybjo6VHlwZTo6SXM6OkhhcmQ6OlRvOjpGaW5kKCkuCisgICAgICAgICMgV2hlcmUgaXMgdGhlIHJldHVybiB0eXBlIGFuZCB3aGVyZSBpcyB0aGUgY2xhc3MgbmFtZT8KKyAgICAgICAgIyBUaGUgaGV1cmlzdGljIHVzZWQgaXMgdG8gcHVsbCB0aGUgbGFzdCBuYW1lIGFzIHRoZSBjbGFzcyBuYW1lLgorICAgICAgICAjIFRoaXMgaW5jbHVkZXMgYWxsIHRoZSB0ZW1wbGF0ZWQgdHlwZSBpbmZvLgorICAgICAgICAjIFRPRE8obm5vcndpdHopOiBpZiB0aGVyZSBpcyBvbmx5IE9uZSBuYW1lIGxpa2UgaW4gdGhlCisgICAgICAgICMgZXhhbXBsZSBhYm92ZSwgcHVudCBhbmQgYXNzdW1lIHRoZSBsYXN0IGJpdCBpcyB0aGUgY2xhc3MgbmFtZS4KKworICAgICAgICAjIElnbm9yZSBhIDo6IHByZWZpeCwgaWYgZXhpc3RzIHNvIHdlIGNhbiBmaW5kIHRoZSBmaXJzdCByZWFsIG5hbWUuCisgICAgICAgIGkgPSAwCisgICAgICAgIGlmIHRva2VuX3NlcVswXS5uYW1lID09ICc6Oic6CisgICAgICAgICAgICBpID0gMQorICAgICAgICAjIElnbm9yZSBhIDo6IHN1ZmZpeCwgaWYgZXhpc3RzLgorICAgICAgICBlbmQgPSBsZW4odG9rZW5fc2VxKSAtIDEKKyAgICAgICAgaWYgdG9rZW5fc2VxW2VuZC0xXS5uYW1lID09ICc6Oic6CisgICAgICAgICAgICBlbmQgLT0gMQorCisgICAgICAgICMgTWFrZSBhIGNvcHkgb2YgdGhlIHNlcXVlbmNlIHNvIHdlIGNhbiBhcHBlbmQgYSBzZW50aW5lbAorICAgICAgICAjIHZhbHVlLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBHZXROYW1lIHdpbGwgaGFzIHRvIGhhdmUgc29tZQorICAgICAgICAjIHRlcm1pbmF0aW5nIGNvbmRpdGlvbiBiZXlvbmQgdGhlIGxhc3QgbmFtZS4KKyAgICAgICAgc2VxX2NvcHkgPSB0b2tlbl9zZXFbaTplbmRdCisgICAgICAgIHNlcV9jb3B5LmFwcGVuZCh0b2tlbml6ZS5Ub2tlbih0b2tlbml6ZS5TWU5UQVgsICcnLCAwLCAwKSkKKyAgICAgICAgbmFtZXMgPSBbXQorICAgICAgICB3aGlsZSBpIDwgZW5kOgorICAgICAgICAgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIHNlcXVlbmNlIHBhcnNpbmcgb3V0IGVhY2ggbmFtZS4KKyAgICAgICAgICAgIG5ld19uYW1lLCBuZXh0ID0gc2VsZi5HZXROYW1lKHNlcV9jb3B5W2k6XSkKKyAgICAgICAgICAgIGFzc2VydCBuZXdfbmFtZSwgJ0dvdCBlbXB0eSBuZXdfbmFtZSwgbmV4dD0lcycgJSBuZXh0CisgICAgICAgICAgICAjIFdlIGdvdCBhIHBvaW50ZXIgb3IgcmVmLiAgQWRkIGl0IHRvIHRoZSBuYW1lLgorICAgICAgICAgICAgaWYgbmV4dCBhbmQgbmV4dC50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWDoKKyAgICAgICAgICAgICAgICBuZXdfbmFtZS5hcHBlbmQobmV4dCkKKyAgICAgICAgICAgIG5hbWVzLmFwcGVuZChuZXdfbmFtZSkKKyAgICAgICAgICAgIGkgKz0gbGVuKG5ld19uYW1lKQorCisgICAgICAgICMgTm93IHRoYXQgd2UgaGF2ZSB0aGUgbmFtZXMsIGl0J3MgdGltZSB0byB1bmRvIHdoYXQgd2UgZGlkLgorCisgICAgICAgICMgUmVtb3ZlIHRoZSBzZW50aW5lbCB2YWx1ZS4KKyAgICAgICAgbmFtZXNbLTFdLnBvcCgpCisgICAgICAgICMgRmxhdHRlbiB0aGUgdG9rZW4gc2VxdWVuY2UgZm9yIHRoZSByZXR1cm4gdHlwZS4KKyAgICAgICAgcmV0dXJuX3R5cGUgPSBbZSBmb3Igc2VxIGluIG5hbWVzWzotMV0gZm9yIGUgaW4gc2VxXQorICAgICAgICAjIFRoZSBjbGFzcyBuYW1lIGlzIHRoZSBsYXN0IG5hbWUuCisgICAgICAgIGNsYXNzX25hbWUgPSBuYW1lc1stMV0KKyAgICAgICAgcmV0dXJuIHJldHVybl90eXBlLCBjbGFzc19uYW1lCisKKyAgICBkZWYgaGFuZGxlX2Jvb2woc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfY2hhcihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9pbnQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfbG9uZyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9zaG9ydChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9kb3VibGUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfZmxvYXQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfdm9pZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV93Y2hhcl90KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX3Vuc2lnbmVkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX3NpZ25lZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIF9HZXROZXN0ZWRUeXBlKHNlbGYsIGN0b3IpOgorICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICBuYW1lX3Rva2VucywgdG9rZW4gPSBzZWxmLkdldE5hbWUoKQorICAgICAgICBpZiBuYW1lX3Rva2VuczoKKyAgICAgICAgICAgIG5hbWUgPSAnJy5qb2luKFt0Lm5hbWUgZm9yIHQgaW4gbmFtZV90b2tlbnNdKQorCisgICAgICAgICMgSGFuZGxlIGZvcndhcmQgZGVjbGFyYXRpb25zLgorICAgICAgICBpZiB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCBhbmQgdG9rZW4ubmFtZSA9PSAnOyc6CisgICAgICAgICAgICByZXR1cm4gY3Rvcih0b2tlbi5zdGFydCwgdG9rZW4uZW5kLCBuYW1lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCisKKyAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FIGFuZCBzZWxmLl9oYW5kbGluZ190eXBlZGVmOgorICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKHRva2VuKQorICAgICAgICAgICAgcmV0dXJuIGN0b3IodG9rZW4uc3RhcnQsIHRva2VuLmVuZCwgbmFtZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrKQorCisgICAgICAgICMgTXVzdCBiZSB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KKyAgICAgICAgZmllbGRzID0gbGlzdChzZWxmLl9HZXRNYXRjaGluZ0NoYXIoJ3snLCAnfScpKQorICAgICAgICBkZWwgZmllbGRzWy0xXSAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nICd9Jy4KKyAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVggYW5kIHRva2VuLm5hbWUgPT0gJ3snOgorICAgICAgICAgICAgbmV4dCA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgICAgICBuZXdfdHlwZSA9IGN0b3IodG9rZW4uc3RhcnQsIHRva2VuLmVuZCwgbmFtZSwgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrKQorICAgICAgICAgICAgIyBBIG5hbWUgbWVhbnMgdGhpcyBpcyBhbiBhbm9ueW1vdXMgdHlwZSBhbmQgdGhlIG5hbWUKKyAgICAgICAgICAgICMgaXMgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgICAgICAgICAgaWYgbmV4dC50b2tlbl90eXBlICE9IHRva2VuaXplLk5BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld190eXBlCisgICAgICAgICAgICBuYW1lID0gbmV3X3R5cGUKKyAgICAgICAgICAgIHRva2VuID0gbmV4dAorCisgICAgICAgICMgTXVzdCBiZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiB1c2luZyB0aGUgdHlwZSBwcmVmaXhlZCB3aXRoIGtleXdvcmQuCisgICAgICAgIGFzc2VydCB0b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUUsIHRva2VuCisgICAgICAgIHJldHVybiBzZWxmLl9DcmVhdGVWYXJpYWJsZSh0b2tlbiwgdG9rZW4ubmFtZSwgbmFtZSwgW10sICcnLCBOb25lKQorCisgICAgZGVmIGhhbmRsZV9zdHJ1Y3Qoc2VsZik6CisgICAgICAgICMgU3BlY2lhbCBjYXNlIHRoZSBoYW5kbGluZyB0eXBlZGVmL2FsaWFzaW5nIG9mIHN0cnVjdHMgaGVyZS4KKyAgICAgICAgIyBJdCB3b3VsZCBiZSBhIHBhaW4gdG8gaGFuZGxlIGluIHRoZSBjbGFzcyBjb2RlLgorICAgICAgICBuYW1lX3Rva2VucywgdmFyX3Rva2VuID0gc2VsZi5HZXROYW1lKCkKKyAgICAgICAgaWYgbmFtZV90b2tlbnM6CisgICAgICAgICAgICBuZXh0X3Rva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuKCkKKyAgICAgICAgICAgIGlzX3N5bnRheCA9ICh2YXJfdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVggYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3Rva2VuLm5hbWVbMF0gaW4gJyomJykKKyAgICAgICAgICAgIGlzX3ZhcmlhYmxlID0gKHZhcl90b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLk5BTUUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3Rva2VuLm5hbWUgPT0gJzsnKQorICAgICAgICAgICAgdmFyaWFibGUgPSB2YXJfdG9rZW4KKyAgICAgICAgICAgIGlmIGlzX3N5bnRheCBhbmQgbm90IGlzX3ZhcmlhYmxlOgorICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gbmV4dF90b2tlbgorICAgICAgICAgICAgICAgIHRlbXAgPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgIGlmIHRlbXAudG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVggYW5kIHRlbXAubmFtZSA9PSAnKCc6CisgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIG1ldGhvZHMgZGVjbGFyZWQgdG8gcmV0dXJuIGEgc3RydWN0LgorICAgICAgICAgICAgICAgICAgICB0MCA9IG5hbWVfdG9rZW5zWzBdCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCA9IHRva2VuaXplLlRva2VuKHRva2VuaXplLk5BTUUsICdzdHJ1Y3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MC5zdGFydC03LCB0MC5zdGFydC0yKQorICAgICAgICAgICAgICAgICAgICB0eXBlX2FuZF9uYW1lID0gW3N0cnVjdF0KKyAgICAgICAgICAgICAgICAgICAgdHlwZV9hbmRfbmFtZS5leHRlbmQobmFtZV90b2tlbnMpCisgICAgICAgICAgICAgICAgICAgIHR5cGVfYW5kX25hbWUuZXh0ZW5kKCh2YXJfdG9rZW4sIG5leHRfdG9rZW4pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fR2V0TWV0aG9kKHR5cGVfYW5kX25hbWUsIDAsIE5vbmUsIEZhbHNlKQorICAgICAgICAgICAgICAgIGFzc2VydCB0ZW1wLm5hbWUgPT0gJzsnLCAodGVtcCwgbmFtZV90b2tlbnMsIHZhcl90b2tlbikKKyAgICAgICAgICAgIGlmIGlzX3N5bnRheCBvciAoaXNfdmFyaWFibGUgYW5kIG5vdCBzZWxmLl9oYW5kbGluZ190eXBlZGVmKToKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBbJ3N0cnVjdCddCisgICAgICAgICAgICAgICAgdHlwZV9uYW1lID0gJycuam9pbihbdC5uYW1lIGZvciB0IGluIG5hbWVfdG9rZW5zXSkKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG5hbWVfdG9rZW5zWzBdCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZVZhcmlhYmxlKHBvc2l0aW9uLCB2YXJpYWJsZS5uYW1lLCB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywgdmFyX3Rva2VuLm5hbWUsIE5vbmUpCisgICAgICAgICAgICBuYW1lX3Rva2Vucy5leHRlbmQoKHZhcl90b2tlbiwgbmV4dF90b2tlbikpCisgICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW5zKG5hbWVfdG9rZW5zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKHZhcl90b2tlbikKKyAgICAgICAgcmV0dXJuIHNlbGYuX0dldENsYXNzKFN0cnVjdCwgVklTSUJJTElUWV9QVUJMSUMsIE5vbmUpCisKKyAgICBkZWYgaGFuZGxlX3VuaW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fR2V0TmVzdGVkVHlwZShVbmlvbikKKworICAgIGRlZiBoYW5kbGVfZW51bShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX0dldE5lc3RlZFR5cGUoRW51bSkKKworICAgIGRlZiBoYW5kbGVfYXV0byhzZWxmKToKKyAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogd2FybiBhYm91dCB1c2luZyBhdXRvPyAgUHJvYmFibHkgbm90IHNpbmNlIGl0CisgICAgICAgICMgd2lsbCBiZSByZWNsYWltZWQgYW5kIHVzZWZ1bCBmb3IgQysrMHguCisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfcmVnaXN0ZXIoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfY29uc3Qoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfaW5saW5lKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX2V4dGVybihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9zdGF0aWMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfdmlydHVhbChzZWxmKToKKyAgICAgICAgIyBXaGF0IGZvbGxvd3MgbXVzdCBiZSBhIG1ldGhvZC4KKyAgICAgICAgdG9rZW4gPSB0b2tlbjIgPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICBpZiB0b2tlbi5uYW1lID09ICdpbmxpbmUnOgorICAgICAgICAgICAgIyBIQUNLKG5ub3J3aXR6KTogaGFuZGxlIGlubGluZSBkdG9ycyBieSBpZ25vcmluZyAnaW5saW5lJy4KKyAgICAgICAgICAgIHRva2VuMiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgIGlmIHRva2VuMi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCBhbmQgdG9rZW4yLm5hbWUgPT0gJ34nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2V0TWV0aG9kKEZVTkNUSU9OX1ZJUlRVQUwgKyBGVU5DVElPTl9EVE9SLCBOb25lKQorICAgICAgICBhc3NlcnQgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FIG9yIHRva2VuLm5hbWUgPT0gJzo6JywgdG9rZW4KKyAgICAgICAgcmV0dXJuX3R5cGVfYW5kX25hbWUgPSBzZWxmLl9HZXRUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJygnKSAgIyApCisgICAgICAgIHJldHVybl90eXBlX2FuZF9uYW1lLmluc2VydCgwLCB0b2tlbikKKyAgICAgICAgaWYgdG9rZW4yIGlzIG5vdCB0b2tlbjoKKyAgICAgICAgICAgIHJldHVybl90eXBlX2FuZF9uYW1lLmluc2VydCgxLCB0b2tlbjIpCisgICAgICAgIHJldHVybiBzZWxmLl9HZXRNZXRob2QocmV0dXJuX3R5cGVfYW5kX25hbWUsIEZVTkNUSU9OX1ZJUlRVQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgRmFsc2UpCisKKyAgICBkZWYgaGFuZGxlX3ZvbGF0aWxlKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX211dGFibGUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfcHVibGljKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5pbl9jbGFzcworICAgICAgICBzZWxmLnZpc2liaWxpdHkgPSBWSVNJQklMSVRZX1BVQkxJQworCisgICAgZGVmIGhhbmRsZV9wcm90ZWN0ZWQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLmluX2NsYXNzCisgICAgICAgIHNlbGYudmlzaWJpbGl0eSA9IFZJU0lCSUxJVFlfUFJPVEVDVEVECisKKyAgICBkZWYgaGFuZGxlX3ByaXZhdGUoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLmluX2NsYXNzCisgICAgICAgIHNlbGYudmlzaWJpbGl0eSA9IFZJU0lCSUxJVFlfUFJJVkFURQorCisgICAgZGVmIGhhbmRsZV9mcmllbmQoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpCisgICAgICAgIGFzc2VydCB0b2tlbnMKKyAgICAgICAgdDAgPSB0b2tlbnNbMF0KKyAgICAgICAgcmV0dXJuIEZyaWVuZCh0MC5zdGFydCwgdDAuZW5kLCB0b2tlbnMsIHNlbGYubmFtZXNwYWNlX3N0YWNrKQorCisgICAgZGVmIGhhbmRsZV9zdGF0aWNfY2FzdChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9jb25zdF9jYXN0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX2R5bmFtaWNfY2FzdChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9yZWludGVycHJldF9jYXN0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX25ldyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9kZWxldGUoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpCisgICAgICAgIGFzc2VydCB0b2tlbnMKKyAgICAgICAgcmV0dXJuIERlbGV0ZSh0b2tlbnNbMF0uc3RhcnQsIHRva2Vuc1swXS5lbmQsIHRva2VucykKKworICAgIGRlZiBoYW5kbGVfdHlwZWRlZihzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICBpZiAodG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5OQU1FIGFuZAorICAgICAgICAgICAga2V5d29yZHMuSXNLZXl3b3JkKHRva2VuLm5hbWUpKToKKyAgICAgICAgICAgICMgVG9rZW4gbXVzdCBiZSBzdHJ1Y3QvZW51bS91bmlvbi9jbGFzcy4KKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ2hhbmRsZV8nICsgdG9rZW4ubmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2hhbmRsaW5nX3R5cGVkZWYgPSBUcnVlCisgICAgICAgICAgICB0b2tlbnMgPSBbbWV0aG9kKCldCisgICAgICAgICAgICBzZWxmLl9oYW5kbGluZ190eXBlZGVmID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRva2VucyA9IFt0b2tlbl0KKworICAgICAgICAjIEdldCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0eXBlZGVmIHVwIHRvIHRoZSBzZW1pLWNvbG9uLgorICAgICAgICB0b2tlbnMuZXh0ZW5kKHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpKQorCisgICAgICAgICMgVE9ETyhubm9yd2l0eik6IGNsZWFuIGFsbCB0aGlzIHVwLgorICAgICAgICBhc3NlcnQgdG9rZW5zCisgICAgICAgIG5hbWUgPSB0b2tlbnMucG9wKCkKKyAgICAgICAgaW5kaWNlcyA9IG5hbWUKKyAgICAgICAgaWYgdG9rZW5zOgorICAgICAgICAgICAgaW5kaWNlcyA9IHRva2Vuc1swXQorICAgICAgICBpZiBub3QgaW5kaWNlczoKKyAgICAgICAgICAgIGluZGljZXMgPSB0b2tlbgorICAgICAgICBpZiBuYW1lLm5hbWUgPT0gJyknOgorICAgICAgICAgICAgIyBIQUNLKG5ub3J3aXR6KTogSGFuZGxlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyAicHJvcGVybHkiLgorICAgICAgICAgICAgaWYgKGxlbih0b2tlbnMpID49IDQgYW5kCisgICAgICAgICAgICAgICAgdG9rZW5zWzFdLm5hbWUgPT0gJygnIGFuZCB0b2tlbnNbMl0ubmFtZSA9PSAnKicpOgorICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5zWzNdCisgICAgICAgIGVsaWYgbmFtZS5uYW1lID09ICddJzoKKyAgICAgICAgICAgICMgSEFDSyhubm9yd2l0eik6IEhhbmRsZSBhcnJheXMgcHJvcGVybHkuCisgICAgICAgICAgICBpZiBsZW4odG9rZW5zKSA+PSAyOgorICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5zWzFdCisgICAgICAgIG5ld190eXBlID0gdG9rZW5zCisgICAgICAgIGlmIHRva2VucyBhbmQgaXNpbnN0YW5jZSh0b2tlbnNbMF0sIHRva2VuaXplLlRva2VuKToKKyAgICAgICAgICAgIG5ld190eXBlID0gc2VsZi5jb252ZXJ0ZXIuVG9UeXBlKHRva2VucylbMF0KKyAgICAgICAgcmV0dXJuIFR5cGVkZWYoaW5kaWNlcy5zdGFydCwgaW5kaWNlcy5lbmQsIG5hbWUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3X3R5cGUsIHNlbGYubmFtZXNwYWNlX3N0YWNrKQorCisgICAgZGVmIGhhbmRsZV90eXBlaWQoc2VsZik6CisgICAgICAgIHBhc3MgICMgTm90IG5lZWRlZCB5ZXQuCisKKyAgICBkZWYgaGFuZGxlX3R5cGVuYW1lKHNlbGYpOgorICAgICAgICBwYXNzICAjIE5vdCBuZWVkZWQgeWV0LgorCisgICAgZGVmIF9HZXRUZW1wbGF0ZWRUeXBlcyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0ge30KKyAgICAgICAgdG9rZW5zID0gbGlzdChzZWxmLl9HZXRNYXRjaGluZ0NoYXIoJzwnLCAnPicpKQorICAgICAgICBsZW5fdG9rZW5zID0gbGVuKHRva2VucykgLSAxICAgICMgSWdub3JlIHRyYWlsaW5nICc+Jy4KKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgaSA8IGxlbl90b2tlbnM6CisgICAgICAgICAgICBrZXkgPSB0b2tlbnNbaV0ubmFtZQorICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBpZiBrZXl3b3Jkcy5Jc0tleXdvcmQoa2V5KSBvciBrZXkgPT0gJywnOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0eXBlX25hbWUgPSBkZWZhdWx0ID0gTm9uZQorICAgICAgICAgICAgaWYgaSA8IGxlbl90b2tlbnM6CisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgaWYgdG9rZW5zW2ktMV0ubmFtZSA9PSAnPSc6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgbGVuX3Rva2VucywgJyVzICVzJyAlIChpLCB0b2tlbnMpCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQsIHVudXNlZF9uZXh0X3Rva2VuID0gc2VsZi5HZXROYW1lKHRva2Vuc1tpOl0pCisgICAgICAgICAgICAgICAgICAgIGkgKz0gbGVuKGRlZmF1bHQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zW2ktMV0ubmFtZSAhPSAnLCc6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGdvdCBzb21ldGhpbmcgbGlrZTogVHlwZSB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgUmUtYWRqdXN0IHRoZSBrZXkgKHZhcmlhYmxlKSBhbmQgdHlwZV9uYW1lIChUeXBlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHRva2Vuc1tpLTFdLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSA9IHRva2Vuc1tpLTJdCisKKyAgICAgICAgICAgIHJlc3VsdFtrZXldID0gKHR5cGVfbmFtZSwgZGVmYXVsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGhhbmRsZV90ZW1wbGF0ZShzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVgsIHRva2VuCisgICAgICAgIGFzc2VydCB0b2tlbi5uYW1lID09ICc8JywgdG9rZW4KKyAgICAgICAgdGVtcGxhdGVkX3R5cGVzID0gc2VsZi5fR2V0VGVtcGxhdGVkVHlwZXMoKQorICAgICAgICAjIFRPRE8obm5vcndpdHopOiBmb3Igbm93LCBqdXN0IGlnbm9yZSB0aGUgdGVtcGxhdGUgcGFyYW1zLgorICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgIGlmIHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRToKKyAgICAgICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJ2NsYXNzJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fR2V0Q2xhc3MoQ2xhc3MsIFZJU0lCSUxJVFlfUFJJVkFURSwgdGVtcGxhdGVkX3R5cGVzKQorICAgICAgICAgICAgZWxpZiB0b2tlbi5uYW1lID09ICdzdHJ1Y3QnOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9HZXRDbGFzcyhTdHJ1Y3QsIFZJU0lCSUxJVFlfUFVCTElDLCB0ZW1wbGF0ZWRfdHlwZXMpCisgICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gJ2ZyaWVuZCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX2ZyaWVuZCgpCisgICAgICAgIHNlbGYuX0FkZEJhY2tUb2tlbih0b2tlbikKKyAgICAgICAgdG9rZW5zLCBsYXN0ID0gc2VsZi5fR2V0VmFyVG9rZW5zVXBUbyh0b2tlbml6ZS5TWU5UQVgsICcoJywgJzsnKQorICAgICAgICB0b2tlbnMuYXBwZW5kKGxhc3QpCisgICAgICAgIHNlbGYuX0FkZEJhY2tUb2tlbnModG9rZW5zKQorICAgICAgICBpZiBsYXN0Lm5hbWUgPT0gJygnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2V0TWV0aG9kKEZVTkNUSU9OX05PTkUsIHRlbXBsYXRlZF90eXBlcykKKyAgICAgICAgIyBNdXN0IGJlIGEgdmFyaWFibGUgZGVmaW5pdGlvbi4KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBoYW5kbGVfdHJ1ZShzZWxmKToKKyAgICAgICAgcGFzcyAgIyBOb3RoaW5nIHRvIGRvLgorCisgICAgZGVmIGhhbmRsZV9mYWxzZShzZWxmKToKKyAgICAgICAgcGFzcyAgIyBOb3RoaW5nIHRvIGRvLgorCisgICAgZGVmIGhhbmRsZV9hc20oc2VsZik6CisgICAgICAgIHBhc3MgICMgTm90IG5lZWRlZCB5ZXQuCisKKyAgICBkZWYgaGFuZGxlX2NsYXNzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fR2V0Q2xhc3MoQ2xhc3MsIFZJU0lCSUxJVFlfUFJJVkFURSwgTm9uZSkKKworICAgIGRlZiBfR2V0QmFzZXMoc2VsZik6CisgICAgICAgICMgR2V0IGJhc2UgY2xhc3Nlcy4KKyAgICAgICAgYmFzZXMgPSBbXQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgYXNzZXJ0IHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRSwgdG9rZW4KKyAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IHN0b3JlIGtpbmQgb2YgaW5oZXJpdGFuY2UuLi5tYXliZS4KKyAgICAgICAgICAgIGlmIHRva2VuLm5hbWUgbm90IGluICgncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJyk6CisgICAgICAgICAgICAgICAgIyBJZiBpbmhlcml0YW5jZSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIHByaXZhdGUuCisgICAgICAgICAgICAgICAgIyBKdXN0IHB1dCB0aGUgdG9rZW4gYmFjayBzbyB3ZSBjYW4gZm9ybSBhIG5hbWUuCisgICAgICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaXQgd291bGQgYmUgZ29vZCB0byB3YXJuIGFib3V0IHRoaXMuCisgICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKHRva2VuKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIENoZWNrIGZvciB2aXJ0dWFsIGluaGVyaXRhbmNlLgorICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5fR2V0TmV4dFRva2VuKCkKKyAgICAgICAgICAgICAgICBpZiB0b2tlbi5uYW1lICE9ICd2aXJ0dWFsJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VuKHRva2VuKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgVE9ETyhubm9yd2l0eik6IHN0b3JlIHRoYXQgd2UgZ290IHZpcnR1YWwgZm9yIHRoaXMgYmFzZS4KKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgYmFzZSwgbmV4dF90b2tlbiA9IHNlbGYuR2V0TmFtZSgpCisgICAgICAgICAgICBiYXNlc19hc3QgPSBzZWxmLmNvbnZlcnRlci5Ub1R5cGUoYmFzZSkKKyAgICAgICAgICAgIGFzc2VydCBsZW4oYmFzZXNfYXN0KSA9PSAxLCBiYXNlc19hc3QKKyAgICAgICAgICAgIGJhc2VzLmFwcGVuZChiYXNlc19hc3RbMF0pCisgICAgICAgICAgICBhc3NlcnQgbmV4dF90b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgbmV4dF90b2tlbgorICAgICAgICAgICAgaWYgbmV4dF90b2tlbi5uYW1lID09ICd7JzoKKyAgICAgICAgICAgICAgICB0b2tlbiA9IG5leHRfdG9rZW4KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBTdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlLgorICAgICAgICAgICAgYXNzZXJ0IG5leHRfdG9rZW4ubmFtZSA9PSAnLCcsIG5leHRfdG9rZW4KKyAgICAgICAgcmV0dXJuIGJhc2VzLCB0b2tlbgorCisgICAgZGVmIF9HZXRDbGFzcyhzZWxmLCBjbGFzc190eXBlLCB2aXNpYmlsaXR5LCB0ZW1wbGF0ZWRfdHlwZXMpOgorICAgICAgICBjbGFzc19uYW1lID0gTm9uZQorICAgICAgICBjbGFzc190b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgIGlmIGNsYXNzX3Rva2VuLnRva2VuX3R5cGUgIT0gdG9rZW5pemUuTkFNRToKKyAgICAgICAgICAgIGFzc2VydCBjbGFzc190b2tlbi50b2tlbl90eXBlID09IHRva2VuaXplLlNZTlRBWCwgY2xhc3NfdG9rZW4KKyAgICAgICAgICAgIHRva2VuID0gY2xhc3NfdG9rZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgU2tpcCBhbnkgbWFjcm8gKGUuZy4gc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXJzKSBhZnRlciB0aGUKKyAgICAgICAgICAgICMgJ2NsYXNzJyBrZXl3b3JkLgorICAgICAgICAgICAgbmV4dF90b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgICAgICBpZiBuZXh0X3Rva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRToKKyAgICAgICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW4obmV4dF90b2tlbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fQWRkQmFja1Rva2VucyhbY2xhc3NfdG9rZW4sIG5leHRfdG9rZW5dKQorICAgICAgICAgICAgbmFtZV90b2tlbnMsIHRva2VuID0gc2VsZi5HZXROYW1lKCkKKyAgICAgICAgICAgIGNsYXNzX25hbWUgPSAnJy5qb2luKFt0Lm5hbWUgZm9yIHQgaW4gbmFtZV90b2tlbnNdKQorICAgICAgICBiYXNlcyA9IE5vbmUKKyAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVg6CisgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc7JzoKKyAgICAgICAgICAgICAgICAjIEZvcndhcmQgZGVjbGFyYXRpb24uCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzX3R5cGUoY2xhc3NfdG9rZW4uc3RhcnQsIGNsYXNzX3Rva2VuLmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lLCBOb25lLCB0ZW1wbGF0ZWRfdHlwZXMsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCisgICAgICAgICAgICBpZiB0b2tlbi5uYW1lIGluICcqJic6CisgICAgICAgICAgICAgICAgIyBJbmxpbmUgZm9yd2FyZCBkZWNsYXJhdGlvbi4gIENvdWxkIGJlIG1ldGhvZCBvciBkYXRhLgorICAgICAgICAgICAgICAgIG5hbWVfdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgIG5leHRfdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgIGlmIG5leHRfdG9rZW4ubmFtZSA9PSAnOyc6CisgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzID0gWydjbGFzcyddCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9DcmVhdGVWYXJpYWJsZShjbGFzc190b2tlbiwgbmFtZV90b2tlbi5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywgdG9rZW4ubmFtZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEFzc3VtZSB0aGlzIGlzIGEgbWV0aG9kLgorICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSAoY2xhc3NfdG9rZW4sIHRva2VuLCBuYW1lX3Rva2VuLCBuZXh0X3Rva2VuKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW5zKHRva2VucykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuR2V0TWV0aG9kKEZVTkNUSU9OX05PTkUsIE5vbmUpCisgICAgICAgICAgICBpZiB0b2tlbi5uYW1lID09ICc6JzoKKyAgICAgICAgICAgICAgICBiYXNlcywgdG9rZW4gPSBzZWxmLl9HZXRCYXNlcygpCisKKyAgICAgICAgYm9keSA9IE5vbmUKKyAgICAgICAgaWYgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVggYW5kIHRva2VuLm5hbWUgPT0gJ3snOgorICAgICAgICAgICAgYXNzZXJ0IHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuU1lOVEFYLCB0b2tlbgorICAgICAgICAgICAgYXNzZXJ0IHRva2VuLm5hbWUgPT0gJ3snLCB0b2tlbgorCisgICAgICAgICAgICBhc3QgPSBBc3RCdWlsZGVyKHNlbGYuR2V0U2NvcGUoKSwgc2VsZi5maWxlbmFtZSwgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eSwgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCisgICAgICAgICAgICBib2R5ID0gbGlzdChhc3QuR2VuZXJhdGUoKSkKKworICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhbmRsaW5nX3R5cGVkZWY6CisgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgIGlmIHRva2VuLnRva2VuX3R5cGUgIT0gdG9rZW5pemUuTkFNRToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuU1lOVEFYLCB0b2tlbgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW4ubmFtZSA9PSAnOycsIHRva2VuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbmV3X2NsYXNzID0gY2xhc3NfdHlwZShjbGFzc190b2tlbi5zdGFydCwgY2xhc3NfdG9rZW4uZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWUsIGJhc2VzLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksIHNlbGYubmFtZXNwYWNlX3N0YWNrKQorCisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IFtdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9DcmVhdGVWYXJpYWJsZShjbGFzc190b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLm5hbWUsIG5ld19jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywgdG9rZW4ubmFtZSwgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9oYW5kbGluZ190eXBlZGVmOgorICAgICAgICAgICAgICAgIHNlbGYuSGFuZGxlRXJyb3IoJ25vbi10eXBlZGVmIHRva2VuJywgdG9rZW4pCisgICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW4odG9rZW4pCisKKyAgICAgICAgcmV0dXJuIGNsYXNzX3R5cGUoY2xhc3NfdG9rZW4uc3RhcnQsIGNsYXNzX3Rva2VuLmVuZCwgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZXMsIHRlbXBsYXRlZF90eXBlcywgYm9keSwgc2VsZi5uYW1lc3BhY2Vfc3RhY2spCisKKyAgICBkZWYgaGFuZGxlX25hbWVzcGFjZShzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICAjIFN1cHBvcnQgYW5vbnltb3VzIG5hbWVzcGFjZXMuCisgICAgICAgIG5hbWUgPSBOb25lCisgICAgICAgIGlmIHRva2VuLnRva2VuX3R5cGUgPT0gdG9rZW5pemUuTkFNRToKKyAgICAgICAgICAgIG5hbWUgPSB0b2tlbi5uYW1lCisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuX0dldE5leHRUb2tlbigpCisgICAgICAgIHNlbGYubmFtZXNwYWNlX3N0YWNrLmFwcGVuZChuYW1lKQorICAgICAgICBhc3NlcnQgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVgsIHRva2VuCisgICAgICAgICMgQ3JlYXRlIGFuIGludGVybmFsIHRva2VuIHRoYXQgZGVub3RlcyB3aGVuIHRoZSBuYW1lc3BhY2UgaXMgY29tcGxldGUuCisgICAgICAgIGludGVybmFsX3Rva2VuID0gdG9rZW5pemUuVG9rZW4oX0lOVEVSTkFMX1RPS0VOLCBfTkFNRVNQQUNFX1BPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorICAgICAgICBpbnRlcm5hbF90b2tlbi53aGVuY2UgPSB0b2tlbi53aGVuY2UKKyAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSAnPSc6CisgICAgICAgICAgICAjIFRPRE8obm5vcndpdHopOiBoYW5kbGUgYWxpYXNpbmcgbmFtZXNwYWNlcy4KKyAgICAgICAgICAgIG5hbWUsIG5leHRfdG9rZW4gPSBzZWxmLkdldE5hbWUoKQorICAgICAgICAgICAgYXNzZXJ0IG5leHRfdG9rZW4ubmFtZSA9PSAnOycsIG5leHRfdG9rZW4KKyAgICAgICAgICAgIHNlbGYuX0FkZEJhY2tUb2tlbihpbnRlcm5hbF90b2tlbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCB0b2tlbi5uYW1lID09ICd7JywgdG9rZW4KKyAgICAgICAgICAgIHRva2VucyA9IGxpc3Qoc2VsZi5HZXRTY29wZSgpKQorICAgICAgICAgICAgIyBSZXBsYWNlIHRoZSB0cmFpbGluZyB9IHdpdGggdGhlIGludGVybmFsIG5hbWVzcGFjZSBwb3AgdG9rZW4uCisgICAgICAgICAgICB0b2tlbnNbLTFdID0gaW50ZXJuYWxfdG9rZW4KKyAgICAgICAgICAgICMgSGFuZGxlIG5hbWVzcGFjZSB3aXRoIG5vdGhpbmcgaW4gaXQuCisgICAgICAgICAgICBzZWxmLl9BZGRCYWNrVG9rZW5zKHRva2VucykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBoYW5kbGVfdXNpbmcoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpCisgICAgICAgIGFzc2VydCB0b2tlbnMKKyAgICAgICAgcmV0dXJuIFVzaW5nKHRva2Vuc1swXS5zdGFydCwgdG9rZW5zWzBdLmVuZCwgdG9rZW5zKQorCisgICAgZGVmIGhhbmRsZV9leHBsaWNpdChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuaW5fY2xhc3MKKyAgICAgICAgIyBOb3RoaW5nIG11Y2ggdG8gZG8uCisgICAgICAgICMgVE9ETyhubm9yd2l0eik6IG1heWJlIHZlcmlmeSB0aGUgbWV0aG9kIG5hbWUgPT0gY2xhc3MgbmFtZS4KKyAgICAgICAgIyBUaGlzIG11c3QgYmUgYSBjdG9yLgorICAgICAgICByZXR1cm4gc2VsZi5HZXRNZXRob2QoRlVOQ1RJT05fQ1RPUiwgTm9uZSkKKworICAgIGRlZiBoYW5kbGVfdGhpcyhzZWxmKToKKyAgICAgICAgcGFzcyAgIyBOb3RoaW5nIHRvIGRvLgorCisgICAgZGVmIGhhbmRsZV9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgIyBQdWxsIG9mZiB0aGUgbmV4dCB0b2tlbihzPykgYW5kIG1ha2UgdGhhdCBwYXJ0IG9mIHRoZSBtZXRob2QgbmFtZS4KKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9zaXplb2Yoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfY2FzZShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9zd2l0Y2goc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfZGVmYXVsdChzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLl9HZXROZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udG9rZW5fdHlwZSA9PSB0b2tlbml6ZS5TWU5UQVgKKyAgICAgICAgYXNzZXJ0IHRva2VuLm5hbWUgPT0gJzonCisKKyAgICBkZWYgaGFuZGxlX2lmKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX2Vsc2Uoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfcmV0dXJuKHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9HZXRUb2tlbnNVcFRvKHRva2VuaXplLlNZTlRBWCwgJzsnKQorICAgICAgICBpZiBub3QgdG9rZW5zOgorICAgICAgICAgICAgcmV0dXJuIFJldHVybihzZWxmLmN1cnJlbnRfdG9rZW4uc3RhcnQsIHNlbGYuY3VycmVudF90b2tlbi5lbmQsIE5vbmUpCisgICAgICAgIHJldHVybiBSZXR1cm4odG9rZW5zWzBdLnN0YXJ0LCB0b2tlbnNbMF0uZW5kLCB0b2tlbnMpCisKKyAgICBkZWYgaGFuZGxlX2dvdG8oc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX0dldFRva2Vuc1VwVG8odG9rZW5pemUuU1lOVEFYLCAnOycpCisgICAgICAgIGFzc2VydCBsZW4odG9rZW5zKSA9PSAxLCBzdHIodG9rZW5zKQorICAgICAgICByZXR1cm4gR290byh0b2tlbnNbMF0uc3RhcnQsIHRva2Vuc1swXS5lbmQsIHRva2Vuc1swXS5uYW1lKQorCisgICAgZGVmIGhhbmRsZV90cnkoc2VsZik6CisgICAgICAgIHBhc3MgICMgTm90IG5lZWRlZCB5ZXQuCisKKyAgICBkZWYgaGFuZGxlX2NhdGNoKHNlbGYpOgorICAgICAgICBwYXNzICAjIE5vdCBuZWVkZWQgeWV0LgorCisgICAgZGVmIGhhbmRsZV90aHJvdyhzZWxmKToKKyAgICAgICAgcGFzcyAgIyBOb3QgbmVlZGVkIHlldC4KKworICAgIGRlZiBoYW5kbGVfd2hpbGUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfZG8oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfZm9yKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX2JyZWFrKHNlbGYpOgorICAgICAgICBzZWxmLl9JZ25vcmVVcFRvKHRva2VuaXplLlNZTlRBWCwgJzsnKQorCisgICAgZGVmIGhhbmRsZV9jb250aW51ZShzZWxmKToKKyAgICAgICAgc2VsZi5fSWdub3JlVXBUbyh0b2tlbml6ZS5TWU5UQVgsICc7JykKKworCitkZWYgQnVpbGRlckZyb21Tb3VyY2Uoc291cmNlLCBmaWxlbmFtZSk6CisgICAgIiIiVXRpbGl0eSBtZXRob2QgdGhhdCByZXR1cm5zIGFuIEFzdEJ1aWxkZXIgZnJvbSBzb3VyY2UgY29kZS4KKworICAgIEFyZ3M6CisgICAgICBzb3VyY2U6ICdDKysgc291cmNlIGNvZGUnCisgICAgICBmaWxlbmFtZTogJ2ZpbGUxJworCisgICAgUmV0dXJuczoKKyAgICAgIEFzdEJ1aWxkZXIKKyAgICAiIiIKKyAgICByZXR1cm4gQXN0QnVpbGRlcih0b2tlbml6ZS5HZXRUb2tlbnMoc291cmNlKSwgZmlsZW5hbWUpCisKKworZGVmIFByaW50SW5kZW50aWZpZXJzKGZpbGVuYW1lLCBzaG91bGRfcHJpbnQpOgorICAgICIiIlByaW50cyBhbGwgaWRlbnRpZmllcnMgZm9yIGEgQysrIHNvdXJjZSBmaWxlLgorCisgICAgQXJnczoKKyAgICAgIGZpbGVuYW1lOiAnZmlsZTEnCisgICAgICBzaG91bGRfcHJpbnQ6IHByZWRpY2F0ZSB3aXRoIHNpZ25hdHVyZTogYm9vbCBGdW5jdGlvbih0b2tlbikKKyAgICAiIiIKKyAgICBzb3VyY2UgPSB1dGlscy5SZWFkRmlsZShmaWxlbmFtZSwgRmFsc2UpCisgICAgaWYgc291cmNlIGlzIE5vbmU6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1VuYWJsZSB0byBmaW5kOiAlc1xuJyAlIGZpbGVuYW1lKQorICAgICAgICByZXR1cm4KKworICAgICNwcmludCgnUHJvY2Vzc2luZyAlcycgJSBhY3R1YWxfZmlsZW5hbWUpCisgICAgYnVpbGRlciA9IEJ1aWxkZXJGcm9tU291cmNlKHNvdXJjZSwgZmlsZW5hbWUpCisgICAgdHJ5OgorICAgICAgICBmb3Igbm9kZSBpbiBidWlsZGVyLkdlbmVyYXRlKCk6CisgICAgICAgICAgICBpZiBzaG91bGRfcHJpbnQobm9kZSk6CisgICAgICAgICAgICAgICAgcHJpbnQobm9kZS5uYW1lKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcmV0dXJuCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisKKworZGVmIFByaW50QWxsSW5kZW50aWZpZXJzKGZpbGVuYW1lcywgc2hvdWxkX3ByaW50KToKKyAgICAiIiJQcmludHMgYWxsIGlkZW50aWZpZXJzIGZvciBlYWNoIEMrKyBzb3VyY2UgZmlsZSBpbiBmaWxlbmFtZXMuCisKKyAgICBBcmdzOgorICAgICAgZmlsZW5hbWVzOiBbJ2ZpbGUxJywgJ2ZpbGUyJywgLi4uXQorICAgICAgc2hvdWxkX3ByaW50OiBwcmVkaWNhdGUgd2l0aCBzaWduYXR1cmU6IGJvb2wgRnVuY3Rpb24odG9rZW4pCisgICAgIiIiCisgICAgZm9yIHBhdGggaW4gZmlsZW5hbWVzOgorICAgICAgICBQcmludEluZGVudGlmaWVycyhwYXRoLCBzaG91bGRfcHJpbnQpCisKKworZGVmIG1haW4oYXJndik6CisgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3ZbMTpdOgorICAgICAgICBzb3VyY2UgPSB1dGlscy5SZWFkRmlsZShmaWxlbmFtZSkKKyAgICAgICAgaWYgc291cmNlIGlzIE5vbmU6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHByaW50KCdQcm9jZXNzaW5nICVzJyAlIGZpbGVuYW1lKQorICAgICAgICBidWlsZGVyID0gQnVpbGRlckZyb21Tb3VyY2Uoc291cmNlLCBmaWxlbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW50aXJlX2FzdCA9IGZpbHRlcihOb25lLCBidWlsZGVyLkdlbmVyYXRlKCkpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAjIEFscmVhZHkgcHJpbnRlZCBhIHdhcm5pbmcsIHByaW50IHRoZSB0cmFjZWJhY2sgYW5kIGNvbnRpbnVlLgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB1dGlscy5ERUJVRzoKKyAgICAgICAgICAgICAgICBmb3IgYXN0IGluIGVudGlyZV9hc3Q6CisgICAgICAgICAgICAgICAgICAgIHByaW50KGFzdCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2dtb2NrX2NsYXNzLnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9nbW9ja19jbGFzcy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOTk2NmNiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9nbW9ja19jbGFzcy5weQpAQCAtMCwwICsxLDIyNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiR2VuZXJhdGUgR29vZ2xlIE1vY2sgY2xhc3NlcyBmcm9tIGJhc2UgY2xhc3Nlcy4KKworVGhpcyBwcm9ncmFtIHdpbGwgcmVhZCBpbiBhIEMrKyBzb3VyY2UgZmlsZSBhbmQgb3V0cHV0IHRoZSBHb29nbGUgTW9jaworY2xhc3NlcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzc2VzLiAgSWYgbm8gY2xhc3MgaXMgc3BlY2lmaWVkLCBhbGwKK2NsYXNzZXMgaW4gdGhlIHNvdXJjZSBmaWxlIGFyZSBlbWl0dGVkLgorCitVc2FnZToKKyAgZ21vY2tfY2xhc3MucHkgaGVhZGVyLWZpbGUuaCBbQ2xhc3NOYW1lXS4uLgorCitPdXRwdXQgaXMgc2VudCB0byBzdGRvdXQuCisiIiIKKworX19hdXRob3JfXyA9ICdubm9yd2l0ekBnb29nbGUuY29tIChOZWFsIE5vcndpdHopJworCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK2Zyb20gY3BwIGltcG9ydCBhc3QKK2Zyb20gY3BwIGltcG9ydCB1dGlscworCisjIFByZXNlcnZlIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4zLgordHJ5OgorICBfZHVtbXkgPSBzZXQKK2V4Y2VwdCBOYW1lRXJyb3I6CisgIGltcG9ydCBzZXRzCisgIHNldCA9IHNldHMuU2V0CisKK19WRVJTSU9OID0gKDEsIDAsIDEpICAjIFRoZSB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0LgorIyBIb3cgbWFueSBzcGFjZXMgdG8gaW5kZW50LiAgQ2FuIHNldCBtZSB3aXRoIHRoZSBJTkRFTlQgZW52aXJvbm1lbnQgdmFyaWFibGUuCitfSU5ERU5UID0gMgorCisKK2RlZiBfR2VuZXJhdGVNZXRob2RzKG91dHB1dF9saW5lcywgc291cmNlLCBjbGFzc19ub2RlKToKKyAgZnVuY3Rpb25fdHlwZSA9IChhc3QuRlVOQ1RJT05fVklSVFVBTCB8IGFzdC5GVU5DVElPTl9QVVJFX1ZJUlRVQUwgfAorICAgICAgICAgICAgICAgICAgIGFzdC5GVU5DVElPTl9PVkVSUklERSkKKyAgY3Rvcl9vcl9kdG9yID0gYXN0LkZVTkNUSU9OX0NUT1IgfCBhc3QuRlVOQ1RJT05fRFRPUgorICBpbmRlbnQgPSAnICcgKiBfSU5ERU5UCisKKyAgZm9yIG5vZGUgaW4gY2xhc3Nfbm9kZS5ib2R5OgorICAgICMgV2Ugb25seSBjYXJlIGFib3V0IHZpcnR1YWwgZnVuY3Rpb25zLgorICAgIGlmIChpc2luc3RhbmNlKG5vZGUsIGFzdC5GdW5jdGlvbikgYW5kCisgICAgICAgIG5vZGUubW9kaWZpZXJzICYgZnVuY3Rpb25fdHlwZSBhbmQKKyAgICAgICAgbm90IG5vZGUubW9kaWZpZXJzICYgY3Rvcl9vcl9kdG9yKToKKyAgICAgICMgUGljayBvdXQgYWxsIHRoZSBlbGVtZW50cyB3ZSBuZWVkIGZyb20gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLgorICAgICAgY29uc3QgPSAnJworICAgICAgaWYgbm9kZS5tb2RpZmllcnMgJiBhc3QuRlVOQ1RJT05fQ09OU1Q6CisgICAgICAgIGNvbnN0ID0gJ0NPTlNUXycKKyAgICAgIHJldHVybl90eXBlID0gJ3ZvaWQnCisgICAgICBpZiBub2RlLnJldHVybl90eXBlOgorICAgICAgICAjIEFkZCBtb2RpZmllcnMgbGlrZSAnY29uc3QnLgorICAgICAgICBtb2RpZmllcnMgPSAnJworICAgICAgICBpZiBub2RlLnJldHVybl90eXBlLm1vZGlmaWVyczoKKyAgICAgICAgICBtb2RpZmllcnMgPSAnICcuam9pbihub2RlLnJldHVybl90eXBlLm1vZGlmaWVycykgKyAnICcKKyAgICAgICAgcmV0dXJuX3R5cGUgPSBtb2RpZmllcnMgKyBub2RlLnJldHVybl90eXBlLm5hbWUKKyAgICAgICAgdGVtcGxhdGVfYXJncyA9IFthcmcubmFtZSBmb3IgYXJnIGluIG5vZGUucmV0dXJuX3R5cGUudGVtcGxhdGVkX3R5cGVzXQorICAgICAgICBpZiB0ZW1wbGF0ZV9hcmdzOgorICAgICAgICAgIHJldHVybl90eXBlICs9ICc8JyArICcsICcuam9pbih0ZW1wbGF0ZV9hcmdzKSArICc+JworICAgICAgICAgIGlmIGxlbih0ZW1wbGF0ZV9hcmdzKSA+IDE6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBbCisgICAgICAgICAgICAgICAgJy8vIFRoZSBmb2xsb3dpbmcgbGluZSB3b25cJ3QgcmVhbGx5IGNvbXBpbGUsIGFzIHRoZSByZXR1cm4nLAorICAgICAgICAgICAgICAgICcvLyB0eXBlIGhhcyBtdWx0aXBsZSB0ZW1wbGF0ZSBhcmd1bWVudHMuICBUbyBmaXggaXQsIHVzZSBhJywKKyAgICAgICAgICAgICAgICAnLy8gdHlwZWRlZiBmb3IgdGhlIHJldHVybiB0eXBlLiddOgorICAgICAgICAgICAgICBvdXRwdXRfbGluZXMuYXBwZW5kKGluZGVudCArIGxpbmUpCisgICAgICAgIGlmIG5vZGUucmV0dXJuX3R5cGUucG9pbnRlcjoKKyAgICAgICAgICByZXR1cm5fdHlwZSArPSAnKicKKyAgICAgICAgaWYgbm9kZS5yZXR1cm5fdHlwZS5yZWZlcmVuY2U6CisgICAgICAgICAgcmV0dXJuX3R5cGUgKz0gJyYnCisgICAgICAgIG51bV9wYXJhbWV0ZXJzID0gbGVuKG5vZGUucGFyYW1ldGVycykKKyAgICAgICAgaWYgbGVuKG5vZGUucGFyYW1ldGVycykgPT0gMToKKyAgICAgICAgICBmaXJzdF9wYXJhbSA9IG5vZGUucGFyYW1ldGVyc1swXQorICAgICAgICAgIGlmIHNvdXJjZVtmaXJzdF9wYXJhbS5zdGFydDpmaXJzdF9wYXJhbS5lbmRdLnN0cmlwKCkgPT0gJ3ZvaWQnOgorICAgICAgICAgICAgIyBXZSBtdXN0IHRyZWF0IFQodm9pZCkgYXMgYSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMuCisgICAgICAgICAgICBudW1fcGFyYW1ldGVycyA9IDAKKyAgICAgIHRtcGwgPSAnJworICAgICAgaWYgY2xhc3Nfbm9kZS50ZW1wbGF0ZWRfdHlwZXM6CisgICAgICAgIHRtcGwgPSAnX1QnCisgICAgICBtb2NrX21ldGhvZF9tYWNybyA9ICdNT0NLXyVzTUVUSE9EJWQlcycgJSAoY29uc3QsIG51bV9wYXJhbWV0ZXJzLCB0bXBsKQorCisgICAgICBhcmdzID0gJycKKyAgICAgIGlmIG5vZGUucGFyYW1ldGVyczoKKyAgICAgICAgIyBEdWUgdG8gdGhlIHBhcnNlciBsaW1pdGF0aW9ucywgaXQgaXMgaW1wb3NzaWJsZSB0byBrZWVwIGNvbW1lbnRzCisgICAgICAgICMgd2hpbGUgc3RyaXBwaW5nIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuICBXaGVuIGRlZmF1bHRzIGFyZQorICAgICAgICAjIHByZXNlbnQsIHdlIGNob29zZSB0byBzdHJpcCB0aGVtIGFuZCBjb21tZW50cyAoYW5kIHByb2R1Y2UKKyAgICAgICAgIyBjb21waWxhYmxlIGNvZGUpLgorICAgICAgICAjIFRPRE8obm5vcndpdHpAZ29vZ2xlLmNvbSk6IEludmVzdGlnYXRlIHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8KKyAgICAgICAgIyBwcmVzZXJ2ZSBwYXJhbWV0ZXIgbmFtZSB3aGVuIHJlY29uc3RydWN0aW5nIHBhcmFtZXRlciB0ZXh0IGZyb20KKyAgICAgICAgIyB0aGUgQVNULgorICAgICAgICBpZiBsZW4oW3BhcmFtIGZvciBwYXJhbSBpbiBub2RlLnBhcmFtZXRlcnMgaWYgcGFyYW0uZGVmYXVsdF0pID4gMDoKKyAgICAgICAgICBhcmdzID0gJywgJy5qb2luKHBhcmFtLnR5cGUubmFtZSBmb3IgcGFyYW0gaW4gbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICMgR2V0IHRoZSBmdWxsIHRleHQgb2YgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3RhcnQKKyAgICAgICAgICAjIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGFzdCBwYXJhbWV0ZXIuCisgICAgICAgICAgc3RhcnQgPSBub2RlLnBhcmFtZXRlcnNbMF0uc3RhcnQKKyAgICAgICAgICBlbmQgPSBub2RlLnBhcmFtZXRlcnNbLTFdLmVuZAorICAgICAgICAgICMgUmVtb3ZlIC8vIGNvbW1lbnRzLgorICAgICAgICAgIGFyZ3Nfc3RyaW5ncyA9IHJlLnN1YihyJy8vLionLCAnJywgc291cmNlW3N0YXJ0OmVuZF0pCisgICAgICAgICAgIyBDb25kZW5zZSBtdWx0aXBsZSBzcGFjZXMgYW5kIGVsaW1pbmF0ZSBuZXdsaW5lcyBwdXR0aW5nIHRoZQorICAgICAgICAgICMgcGFyYW1ldGVycyB0b2dldGhlciBvbiBhIHNpbmdsZSBsaW5lLiAgRW5zdXJlIHRoZXJlIGlzIGEKKyAgICAgICAgICAjIHNwYWNlIGluIGFuIGFyZ3VtZW50IHdoaWNoIGlzIHNwbGl0IGJ5IGEgbmV3bGluZSB3aXRob3V0CisgICAgICAgICAgIyBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlLCBlLmcuOiBpbnRcbkJhcgorICAgICAgICAgIGFyZ3MgPSByZS5zdWIoJyAgKycsICcgJywgYXJnc19zdHJpbmdzLnJlcGxhY2UoJ1xuJywgJyAnKSkKKworICAgICAgIyBDcmVhdGUgdGhlIG1vY2sgbWV0aG9kIGRlZmluaXRpb24uCisgICAgICBvdXRwdXRfbGluZXMuZXh0ZW5kKFsnJXMlcyglcywnICUgKGluZGVudCwgbW9ja19tZXRob2RfbWFjcm8sIG5vZGUubmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMlcyglcykpOycgJSAoaW5kZW50KjMsIHJldHVybl90eXBlLCBhcmdzKV0pCisKKworZGVmIF9HZW5lcmF0ZU1vY2tzKGZpbGVuYW1lLCBzb3VyY2UsIGFzdF9saXN0LCBkZXNpcmVkX2NsYXNzX25hbWVzKToKKyAgcHJvY2Vzc2VkX2NsYXNzX25hbWVzID0gc2V0KCkKKyAgbGluZXMgPSBbXQorICBmb3Igbm9kZSBpbiBhc3RfbGlzdDoKKyAgICBpZiAoaXNpbnN0YW5jZShub2RlLCBhc3QuQ2xhc3MpIGFuZCBub2RlLmJvZHkgYW5kCisgICAgICAgICMgZGVzaXJlZF9jbGFzc19uYW1lcyBiZWluZyBOb25lIG1lYW5zIHRoYXQgYWxsIGNsYXNzZXMgYXJlIHNlbGVjdGVkLgorICAgICAgICAobm90IGRlc2lyZWRfY2xhc3NfbmFtZXMgb3Igbm9kZS5uYW1lIGluIGRlc2lyZWRfY2xhc3NfbmFtZXMpKToKKyAgICAgIGNsYXNzX25hbWUgPSBub2RlLm5hbWUKKyAgICAgIHBhcmVudF9uYW1lID0gY2xhc3NfbmFtZQorICAgICAgcHJvY2Vzc2VkX2NsYXNzX25hbWVzLmFkZChjbGFzc19uYW1lKQorICAgICAgY2xhc3Nfbm9kZSA9IG5vZGUKKyAgICAgICMgQWRkIG5hbWVzcGFjZSBiZWZvcmUgdGhlIGNsYXNzLgorICAgICAgaWYgY2xhc3Nfbm9kZS5uYW1lc3BhY2U6CisgICAgICAgIGxpbmVzLmV4dGVuZChbJ25hbWVzcGFjZSAlcyB7JyAlIG4gZm9yIG4gaW4gY2xhc3Nfbm9kZS5uYW1lc3BhY2VdKSAgIyB9CisgICAgICAgIGxpbmVzLmFwcGVuZCgnJykKKworICAgICAgIyBBZGQgdGVtcGxhdGUgYXJncyBmb3IgdGVtcGxhdGVkIGNsYXNzZXMuCisgICAgICBpZiBjbGFzc19ub2RlLnRlbXBsYXRlZF90eXBlczoKKyAgICAgICAgIyBUT0RPKHBhdWxjaGFuZyk6IFRoZSBBU1QgZG9lc24ndCBwcmVzZXJ2ZSB0ZW1wbGF0ZSBhcmd1bWVudCBvcmRlciwKKyAgICAgICAgIyBzbyB3ZSBoYXZlIHRvIG1ha2UgdXAgbmFtZXMgaGVyZS4KKyAgICAgICAgIyBUT0RPKHBhdWxjaGFuZyk6IEhhbmRsZSBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudHMgKGUuZy4KKyAgICAgICAgIyB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgTj4pLgorICAgICAgICB0ZW1wbGF0ZV9hcmdfY291bnQgPSBsZW4oY2xhc3Nfbm9kZS50ZW1wbGF0ZWRfdHlwZXMua2V5cygpKQorICAgICAgICB0ZW1wbGF0ZV9hcmdzID0gWydUJWQnICUgbiBmb3IgbiBpbiByYW5nZSh0ZW1wbGF0ZV9hcmdfY291bnQpXQorICAgICAgICB0ZW1wbGF0ZV9kZWNscyA9IFsndHlwZW5hbWUgJyArIGFyZyBmb3IgYXJnIGluIHRlbXBsYXRlX2FyZ3NdCisgICAgICAgIGxpbmVzLmFwcGVuZCgndGVtcGxhdGUgPCcgKyAnLCAnLmpvaW4odGVtcGxhdGVfZGVjbHMpICsgJz4nKQorICAgICAgICBwYXJlbnRfbmFtZSArPSAnPCcgKyAnLCAnLmpvaW4odGVtcGxhdGVfYXJncykgKyAnPicKKworICAgICAgIyBBZGQgdGhlIGNsYXNzIHByb2xvZy4KKyAgICAgIGxpbmVzLmFwcGVuZCgnY2xhc3MgTW9jayVzIDogcHVibGljICVzIHsnICAjIH0KKyAgICAgICAgICAgICAgICAgICAlIChjbGFzc19uYW1lLCBwYXJlbnRfbmFtZSkpCisgICAgICBsaW5lcy5hcHBlbmQoJyVzcHVibGljOicgJSAoJyAnICogKF9JTkRFTlQgLy8gMikpKQorCisgICAgICAjIEFkZCBhbGwgdGhlIG1ldGhvZHMuCisgICAgICBfR2VuZXJhdGVNZXRob2RzKGxpbmVzLCBzb3VyY2UsIGNsYXNzX25vZGUpCisKKyAgICAgICMgQ2xvc2UgdGhlIGNsYXNzLgorICAgICAgaWYgbGluZXM6CisgICAgICAgICMgSWYgdGhlcmUgYXJlIG5vIHZpcnR1YWwgbWV0aG9kcywgbm8gbmVlZCBmb3IgYSBwdWJsaWMgbGFiZWwuCisgICAgICAgIGlmIGxlbihsaW5lcykgPT0gMjoKKyAgICAgICAgICBkZWwgbGluZXNbLTFdCisKKyAgICAgICAgIyBPbmx5IGNsb3NlIHRoZSBjbGFzcyBpZiB0aGVyZSByZWFsbHkgaXMgYSBjbGFzcy4KKyAgICAgICAgbGluZXMuYXBwZW5kKCd9OycpCisgICAgICAgIGxpbmVzLmFwcGVuZCgnJykgICMgQWRkIGFuIGV4dHJhIG5ld2xpbmUuCisKKyAgICAgICMgQ2xvc2UgdGhlIG5hbWVzcGFjZS4KKyAgICAgIGlmIGNsYXNzX25vZGUubmFtZXNwYWNlOgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oY2xhc3Nfbm9kZS5uYW1lc3BhY2UpLTEsIC0xLCAtMSk6CisgICAgICAgICAgbGluZXMuYXBwZW5kKCd9ICAvLyBuYW1lc3BhY2UgJXMnICUgY2xhc3Nfbm9kZS5uYW1lc3BhY2VbaV0pCisgICAgICAgIGxpbmVzLmFwcGVuZCgnJykgICMgQWRkIGFuIGV4dHJhIG5ld2xpbmUuCisKKyAgaWYgZGVzaXJlZF9jbGFzc19uYW1lczoKKyAgICBtaXNzaW5nX2NsYXNzX25hbWVfbGlzdCA9IGxpc3QoZGVzaXJlZF9jbGFzc19uYW1lcyAtIHByb2Nlc3NlZF9jbGFzc19uYW1lcykKKyAgICBpZiBtaXNzaW5nX2NsYXNzX25hbWVfbGlzdDoKKyAgICAgIG1pc3NpbmdfY2xhc3NfbmFtZV9saXN0LnNvcnQoKQorICAgICAgc3lzLnN0ZGVyci53cml0ZSgnQ2xhc3MoZXMpIG5vdCBmb3VuZCBpbiAlczogJXNcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWUsICcsICcuam9pbihtaXNzaW5nX2NsYXNzX25hbWVfbGlzdCkpKQorICBlbGlmIG5vdCBwcm9jZXNzZWRfY2xhc3NfbmFtZXM6CisgICAgc3lzLnN0ZGVyci53cml0ZSgnTm8gY2xhc3MgZm91bmQgaW4gJXNcbicgJSBmaWxlbmFtZSkKKworICByZXR1cm4gbGluZXMKKworCitkZWYgbWFpbihhcmd2PXN5cy5hcmd2KToKKyAgaWYgbGVuKGFyZ3YpIDwgMjoKKyAgICBzeXMuc3RkZXJyLndyaXRlKCdHb29nbGUgTW9jayBDbGFzcyBHZW5lcmF0b3IgdiVzXG5cbicgJQorICAgICAgICAgICAgICAgICAgICAgJy4nLmpvaW4obWFwKHN0ciwgX1ZFUlNJT04pKSkKKyAgICBzeXMuc3RkZXJyLndyaXRlKF9fZG9jX18pCisgICAgcmV0dXJuIDEKKworICBnbG9iYWwgX0lOREVOVAorICB0cnk6CisgICAgX0lOREVOVCA9IGludChvcy5lbnZpcm9uWydJTkRFTlQnXSkKKyAgZXhjZXB0IEtleUVycm9yOgorICAgIHBhc3MKKyAgZXhjZXB0OgorICAgIHN5cy5zdGRlcnIud3JpdGUoJ1VuYWJsZSB0byB1c2UgaW5kZW50IG9mICVzXG4nICUgb3MuZW52aXJvbi5nZXQoJ0lOREVOVCcpKQorCisgIGZpbGVuYW1lID0gYXJndlsxXQorICBkZXNpcmVkX2NsYXNzX25hbWVzID0gTm9uZSAgIyBOb25lIG1lYW5zIGFsbCBjbGFzc2VzIGluIHRoZSBzb3VyY2UgZmlsZS4KKyAgaWYgbGVuKGFyZ3YpID49IDM6CisgICAgZGVzaXJlZF9jbGFzc19uYW1lcyA9IHNldChhcmd2WzI6XSkKKyAgc291cmNlID0gdXRpbHMuUmVhZEZpbGUoZmlsZW5hbWUpCisgIGlmIHNvdXJjZSBpcyBOb25lOgorICAgIHJldHVybiAxCisKKyAgYnVpbGRlciA9IGFzdC5CdWlsZGVyRnJvbVNvdXJjZShzb3VyY2UsIGZpbGVuYW1lKQorICB0cnk6CisgICAgZW50aXJlX2FzdCA9IGZpbHRlcihOb25lLCBidWlsZGVyLkdlbmVyYXRlKCkpCisgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICByZXR1cm4KKyAgZXhjZXB0OgorICAgICMgQW4gZXJyb3IgbWVzc2FnZSB3YXMgYWxyZWFkeSBwcmludGVkIHNpbmNlIHdlIGNvdWxkbid0IHBhcnNlLgorICAgIHN5cy5leGl0KDEpCisgIGVsc2U6CisgICAgbGluZXMgPSBfR2VuZXJhdGVNb2NrcyhmaWxlbmFtZSwgc291cmNlLCBlbnRpcmVfYXN0LCBkZXNpcmVkX2NsYXNzX25hbWVzKQorICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJy5qb2luKGxpbmVzKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9nbW9ja19jbGFzc190ZXN0LnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9nbW9ja19jbGFzc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAxOGY5MGEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL2dtb2NrX2NsYXNzX3Rlc3QucHkKQEAgLTAsMCArMSw0NDggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOSBOZWFsIE5vcndpdHogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlRlc3RzIGZvciBnbW9jay5zY3JpcHRzLmdlbmVyYXRvci5jcHAuZ21vY2tfY2xhc3MuIiIiCisKK19fYXV0aG9yX18gPSAnbm5vcndpdHpAZ29vZ2xlLmNvbSAoTmVhbCBOb3J3aXR6KScKKworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCisjIEFsbG93IHRoZSBjcHAgaW1wb3J0cyBiZWxvdyB0byB3b3JrIHdoZW4gcnVuIGFzIGEgc3RhbmRhbG9uZSBzY3JpcHQuCitzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicpKQorCitmcm9tIGNwcCBpbXBvcnQgYXN0Citmcm9tIGNwcCBpbXBvcnQgZ21vY2tfY2xhc3MKKworCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICIiIkhlbHBlciBjbGFzcyB0aGF0IGFkZHMgYXNzZXJ0IG1ldGhvZHMuIiIiCisKKyAgZGVmIFN0cmlwTGVhZGluZ1doaXRlc3BhY2Uoc2VsZiwgbGluZXMpOgorICAgICIiIlN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSBpbiBlYWNoIGxpbmUgaW4gJ2xpbmVzJy4iIiIKKyAgICByZXR1cm4gJ1xuJy5qb2luKFtzLmxzdHJpcCgpIGZvciBzIGluIGxpbmVzLnNwbGl0KCdcbicpXSkKKworICBkZWYgYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZShzZWxmLCBleHBlY3RlZF9saW5lcywgbGluZXMpOgorICAgICIiIlNwZWNpYWxpemVkIGFzc2VydCB0aGF0IGlnbm9yZXMgdGhlIGluZGVudCBsZXZlbC4iIiIKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2xpbmVzLCBzZWxmLlN0cmlwTGVhZGluZ1doaXRlc3BhY2UobGluZXMpKQorCisKK2NsYXNzIEdlbmVyYXRlTWV0aG9kc1Rlc3QoVGVzdENhc2UpOgorCisgIGRlZiBHZW5lcmF0ZU1ldGhvZFNvdXJjZShzZWxmLCBjcHBfc291cmNlKToKKyAgICAiIiJDb252ZXJ0IEMrKyBzb3VyY2UgdG8gR29vZ2xlIE1vY2sgb3V0cHV0IHNvdXJjZSBsaW5lcy4iIiIKKyAgICBtZXRob2Rfc291cmNlX2xpbmVzID0gW10KKyAgICAjIDx0ZXN0PiBpcyBhIHBzZXVkby1maWxlbmFtZSwgaXQgaXMgbm90IHJlYWQgb3Igd3JpdHRlbi4KKyAgICBidWlsZGVyID0gYXN0LkJ1aWxkZXJGcm9tU291cmNlKGNwcF9zb3VyY2UsICc8dGVzdD4nKQorICAgIGFzdF9saXN0ID0gbGlzdChidWlsZGVyLkdlbmVyYXRlKCkpCisgICAgZ21vY2tfY2xhc3MuX0dlbmVyYXRlTWV0aG9kcyhtZXRob2Rfc291cmNlX2xpbmVzLCBjcHBfc291cmNlLCBhc3RfbGlzdFswXSkKKyAgICByZXR1cm4gJ1xuJy5qb2luKG1ldGhvZF9zb3VyY2VfbGluZXMpCisKKyAgZGVmIHRlc3RTaW1wbGVNZXRob2Qoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCBpbnQgQmFyKCk7Cit9OworIiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19NRVRIT0QwKEJhcixcbmludCgpKTsnLAorICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCisKKyAgZGVmIHRlc3RTaW1wbGVDb25zdHJ1Y3RvcnNBbmREZXN0cnVjdG9yKHNlbGYpOgorICAgIHNvdXJjZSA9ICIiIgorY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIEZvbygpOworICBGb28oaW50IHgpOworICBGb28oY29uc3QgRm9vJiBmKTsKKyAgRm9vKEZvbyYmIGYpOworICB+Rm9vKCk7CisgIHZpcnR1YWwgaW50IEJhcigpID0gMDsKK307CisiIiIKKyAgICAjIFRoZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3Igc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19NRVRIT0QwKEJhcixcbmludCgpKTsnLAorICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCisKKyAgZGVmIHRlc3RWaXJ0dWFsRGVzdHJ1Y3RvcihzZWxmKToKKyAgICBzb3VyY2UgPSAiIiIKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Gb28oKTsKKyAgdmlydHVhbCBpbnQgQmFyKCkgPSAwOworfTsKKyIiIgorICAgICMgVGhlIGRlc3RydWN0b3Igc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19NRVRIT0QwKEJhcixcbmludCgpKTsnLAorICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCisKKyAgZGVmIHRlc3RFeHBsaWNpdGx5RGVmYXVsdGVkQ29uc3RydWN0b3JzQW5kRGVzdHJ1Y3RvcihzZWxmKToKKyAgICBzb3VyY2UgPSAiIiIKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICBGb28oKSA9IGRlZmF1bHQ7CisgIEZvbyhjb25zdCBGb28mIGYpID0gZGVmYXVsdDsKKyAgRm9vKEZvbyYmIGYpID0gZGVmYXVsdDsKKyAgfkZvbygpID0gZGVmYXVsdDsKKyAgdmlydHVhbCBpbnQgQmFyKCkgPSAwOworfTsKKyIiIgorICAgICMgVGhlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvciBzaG91bGQgYmUgaWdub3JlZC4KKyAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCisgICAgICAgICdNT0NLX01FVEhPRDAoQmFyLFxuaW50KCkpOycsCisgICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKKworICBkZWYgdGVzdEV4cGxpY2l0bHlEZWxldGVkQ29uc3RydWN0b3JzQW5kRGVzdHJ1Y3RvcihzZWxmKToKKyAgICBzb3VyY2UgPSAiIiIKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICBGb28oKSA9IGRlbGV0ZTsKKyAgRm9vKGNvbnN0IEZvbyYgZikgPSBkZWxldGU7CisgIEZvbyhGb28mJiBmKSA9IGRlbGV0ZTsKKyAgfkZvbygpID0gZGVsZXRlOworICB2aXJ0dWFsIGludCBCYXIoKSA9IDA7Cit9OworIiIiCisgICAgIyBUaGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yIHNob3VsZCBiZSBpZ25vcmVkLgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgJ01PQ0tfTUVUSE9EMChCYXIsXG5pbnQoKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0U2ltcGxlT3ZlcnJpZGVNZXRob2Qoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgaW50IEJhcigpIG92ZXJyaWRlOworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgJ01PQ0tfTUVUSE9EMChCYXIsXG5pbnQoKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0U2ltcGxlQ29uc3RNZXRob2Qoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEJhcihib29sIGZsYWcpIGNvbnN0OworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgJ01PQ0tfQ09OU1RfTUVUSE9EMShCYXIsXG52b2lkKGJvb2wgZmxhZykpOycsCisgICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKKworICBkZWYgdGVzdEV4cGxpY2l0Vm9pZChzZWxmKToKKyAgICBzb3VyY2UgPSAiIiIKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIGludCBCYXIodm9pZCk7Cit9OworIiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19NRVRIT0QwKEJhcixcbmludCh2b2lkKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0U3RyYW5nZU5ld2xpbmVJblBhcmFtZXRlcihzZWxmKToKKyAgICBzb3VyY2UgPSAiIiIKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgQmFyKGludAorYSkgPSAwOworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgJ01PQ0tfTUVUSE9EMShCYXIsXG52b2lkKGludCBhKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0RGVmYXVsdFBhcmFtZXRlcnMoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEJhcihpbnQgYSwgY2hhciBjID0gJ3gnKSA9IDA7Cit9OworIiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19NRVRIT0QyKEJhcixcbnZvaWQoaW50LCBjaGFyKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0TXVsdGlwbGVEZWZhdWx0UGFyYW1ldGVycyhzZWxmKToKKyAgICBzb3VyY2UgPSAiIiIKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgQmFyKGludCBhID0gNDIsIGNoYXIgYyA9ICd4JykgPSAwOworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgJ01PQ0tfTUVUSE9EMihCYXIsXG52b2lkKGludCwgY2hhcikpOycsCisgICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKKworICBkZWYgdGVzdFJlbW92ZXNDb21tZW50c1doZW5EZWZhdWx0c0FyZVByZXNlbnQoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEJhcihpbnQgYSA9IDQyIC8qIGEgY29tbWVudCAqLywKKyAgICAgICAgICAgICAgICAgICBjaGFyIC8qIG90aGVyIGNvbW1lbnQgKi8gYz0gJ3gnKSA9IDA7Cit9OworIiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19NRVRIT0QyKEJhcixcbnZvaWQoaW50LCBjaGFyKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0RG91YmxlU2xhc2hDb21tZW50c0luUGFyYW1ldGVyTGlzdEFyZVJlbW92ZWQoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEJhcihpbnQgYSwgIC8vIGlubGluZSBjb21tZW50cyBzaG91bGQgYmUgZWxpZGVkLgorICAgICAgICAgICAgICAgICAgIGludCBiICAgLy8gaW5saW5lIGNvbW1lbnRzIHNob3VsZCBiZSBlbGlkZWQuCisgICAgICAgICAgICAgICAgICAgKSBjb25zdCA9IDA7Cit9OworIiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19DT05TVF9NRVRIT0QyKEJhcixcbnZvaWQoaW50IGEsIGludCBiKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0Q1N0eWxlQ29tbWVudHNJblBhcmFtZXRlckxpc3RBcmVOb3RSZW1vdmVkKHNlbGYpOgorICAgICMgTk9URShubm9yd2l0eik6IEknbSBub3Qgc3VyZSBpZiBpdCdzIHRoZSBiZXN0IGJlaGF2aW9yIHRvIGtlZXAgdGhlc2UKKyAgICAjIGNvbW1lbnRzLiAgQWxzbyBub3RlIHRoYXQgQyBzdHlsZSBjb21tZW50cyBhZnRlciB0aGUgbGFzdCBwYXJhbWV0ZXIKKyAgICAjIGFyZSBzdGlsbCBlbGlkZWQuCisgICAgc291cmNlID0gIiIiCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEJhcihpbnQgLyoga2VlcGVyICovLCBpbnQgYik7Cit9OworIiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19NRVRIT0QyKEJhcixcbmNvbnN0IHN0cmluZyYoaW50IC8qIGtlZXBlciAqLywgaW50IGIpKTsnLAorICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCisKKyAgZGVmIHRlc3RBcmdzT2ZUZW1wbGF0ZVR5cGVzKHNlbGYpOgorICAgIHNvdXJjZSA9ICIiIgorY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgaW50IEJhcihjb25zdCB2ZWN0b3I8aW50PiYgdiwgbWFwPGludCwgc3RyaW5nPiogb3V0cHV0KTsKK307IiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICAnTU9DS19NRVRIT0QyKEJhcixcbicKKyAgICAgICAgJ2ludChjb25zdCB2ZWN0b3I8aW50PiYgdiwgbWFwPGludCwgc3RyaW5nPiogb3V0cHV0KSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0UmV0dXJuVHlwZVdpdGhPbmVUZW1wbGF0ZUFyZyhzZWxmKToKKyAgICBzb3VyY2UgPSAiIiIKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICB2aXJ0dWFsIHZlY3RvcjxpbnQ+KiBCYXIoaW50IG4pOworfTsiIiIKKyAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCisgICAgICAgICdNT0NLX01FVEhPRDEoQmFyLFxudmVjdG9yPGludD4qKGludCBuKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0UmV0dXJuVHlwZVdpdGhNYW55VGVtcGxhdGVBcmdzKHNlbGYpOgorICAgIHNvdXJjZSA9ICIiIgorY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgbWFwPGludCwgc3RyaW5nPiBCYXIoKTsKK307IiIiCisgICAgIyBDb21wYXJpbmcgdGhlIGNvbW1lbnQgdGV4dCBpcyBicml0dGxlIC0gd2UnbGwgdGhpbmsgb2Ygc29tZXRoaW5nCisgICAgIyBiZXR0ZXIgaW4gY2FzZSB0aGlzIGdldHMgYW5ub3lpbmcsIGJ1dCBmb3Igbm93IGxldCdzIGtlZXAgaXQgc2ltcGxlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgJy8vIFRoZSBmb2xsb3dpbmcgbGluZSB3b25cJ3QgcmVhbGx5IGNvbXBpbGUsIGFzIHRoZSByZXR1cm5cbicKKyAgICAgICAgJy8vIHR5cGUgaGFzIG11bHRpcGxlIHRlbXBsYXRlIGFyZ3VtZW50cy4gIFRvIGZpeCBpdCwgdXNlIGFcbicKKyAgICAgICAgJy8vIHR5cGVkZWYgZm9yIHRoZSByZXR1cm4gdHlwZS5cbicKKyAgICAgICAgJ01PQ0tfTUVUSE9EMChCYXIsXG5tYXA8aW50LCBzdHJpbmc+KCkpOycsCisgICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKKworICBkZWYgdGVzdFNpbXBsZU1ldGhvZEluVGVtcGxhdGVkQ2xhc3Moc2VsZik6CisgICAgc291cmNlID0gIiIiCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgaW50IEJhcigpOworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgJ01PQ0tfTUVUSE9EMF9UKEJhcixcbmludCgpKTsnLAorICAgICAgICBzZWxmLkdlbmVyYXRlTWV0aG9kU291cmNlKHNvdXJjZSkpCisKKyAgZGVmIHRlc3RQb2ludGVyQXJnV2l0aG91dE5hbWVzKHNlbGYpOgorICAgIHNvdXJjZSA9ICIiIgorY2xhc3MgRm9vIHsKKyAgdmlydHVhbCBpbnQgQmFyKEMqKTsKK307CisiIiIKKyAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCisgICAgICAgICdNT0NLX01FVEhPRDEoQmFyLFxuaW50KEMqKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0UmVmZXJlbmNlQXJnV2l0aG91dE5hbWVzKHNlbGYpOgorICAgIHNvdXJjZSA9ICIiIgorY2xhc3MgRm9vIHsKKyAgdmlydHVhbCBpbnQgQmFyKEMmKTsKK307CisiIiIKKyAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCisgICAgICAgICdNT0NLX01FVEhPRDEoQmFyLFxuaW50KEMmKSk7JywKKyAgICAgICAgc2VsZi5HZW5lcmF0ZU1ldGhvZFNvdXJjZShzb3VyY2UpKQorCisgIGRlZiB0ZXN0QXJyYXlBcmdXaXRob3V0TmFtZXMoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBGb28geworICB2aXJ0dWFsIGludCBCYXIoQ1tdKTsKK307CisiIiIKKyAgICBzZWxmLmFzc2VydEVxdWFsSWdub3JlTGVhZGluZ1doaXRlc3BhY2UoCisgICAgICAgICdNT0NLX01FVEhPRDEoQmFyLFxuaW50KENbXSkpOycsCisgICAgICAgIHNlbGYuR2VuZXJhdGVNZXRob2RTb3VyY2Uoc291cmNlKSkKKworCitjbGFzcyBHZW5lcmF0ZU1vY2tzVGVzdChUZXN0Q2FzZSk6CisKKyAgZGVmIEdlbmVyYXRlTW9ja3Moc2VsZiwgY3BwX3NvdXJjZSk6CisgICAgIiIiQ29udmVydCBDKysgc291cmNlIHRvIGNvbXBsZXRlIEdvb2dsZSBNb2NrIG91dHB1dCBzb3VyY2UuIiIiCisgICAgIyA8dGVzdD4gaXMgYSBwc2V1ZG8tZmlsZW5hbWUsIGl0IGlzIG5vdCByZWFkIG9yIHdyaXR0ZW4uCisgICAgZmlsZW5hbWUgPSAnPHRlc3Q+JworICAgIGJ1aWxkZXIgPSBhc3QuQnVpbGRlckZyb21Tb3VyY2UoY3BwX3NvdXJjZSwgZmlsZW5hbWUpCisgICAgYXN0X2xpc3QgPSBsaXN0KGJ1aWxkZXIuR2VuZXJhdGUoKSkKKyAgICBsaW5lcyA9IGdtb2NrX2NsYXNzLl9HZW5lcmF0ZU1vY2tzKGZpbGVuYW1lLCBjcHBfc291cmNlLCBhc3RfbGlzdCwgTm9uZSkKKyAgICByZXR1cm4gJ1xuJy5qb2luKGxpbmVzKQorCisgIGRlZiB0ZXN0TmFtZXNwYWNlcyhzZWxmKToKKyAgICBzb3VyY2UgPSAiIiIKK25hbWVzcGFjZSBGb28geworbmFtZXNwYWNlIEJhciB7IGNsYXNzIEZvcndhcmQ7IH0KK25hbWVzcGFjZSBCYXogeworCitjbGFzcyBUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBGb28oKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBCYXoKK30gIC8vIG5hbWVzcGFjZSBGb28KKyIiIgorICAgIGV4cGVjdGVkID0gIiIiXAorbmFtZXNwYWNlIEZvbyB7CituYW1lc3BhY2UgQmF6IHsKKworY2xhc3MgTW9ja1Rlc3QgOiBwdWJsaWMgVGVzdCB7CitwdWJsaWM6CitNT0NLX01FVEhPRDAoRm9vLAordm9pZCgpKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBCYXoKK30gIC8vIG5hbWVzcGFjZSBGb28KKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgZXhwZWN0ZWQsIHNlbGYuR2VuZXJhdGVNb2Nrcyhzb3VyY2UpKQorCisgIGRlZiB0ZXN0Q2xhc3NXaXRoU3RvcmFnZVNwZWNpZmllck1hY3JvKHNlbGYpOgorICAgIHNvdXJjZSA9ICIiIgorY2xhc3MgU1RPUkFHRV9TUEVDSUZJRVIgVGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgRm9vKCk7Cit9OworIiIiCisgICAgZXhwZWN0ZWQgPSAiIiJcCitjbGFzcyBNb2NrVGVzdCA6IHB1YmxpYyBUZXN0IHsKK3B1YmxpYzoKK01PQ0tfTUVUSE9EMChGb28sCit2b2lkKCkpOworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgZXhwZWN0ZWQsIHNlbGYuR2VuZXJhdGVNb2Nrcyhzb3VyY2UpKQorCisgIGRlZiB0ZXN0VGVtcGxhdGVkRm9yd2FyZERlY2xhcmF0aW9uKHNlbGYpOgorICAgIHNvdXJjZSA9ICIiIgordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEZvcndhcmQ7ICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIHNob3VsZCBiZSBpZ25vcmVkLgorY2xhc3MgVGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgRm9vKCk7Cit9OworIiIiCisgICAgZXhwZWN0ZWQgPSAiIiJcCitjbGFzcyBNb2NrVGVzdCA6IHB1YmxpYyBUZXN0IHsKK3B1YmxpYzoKK01PQ0tfTUVUSE9EMChGb28sCit2b2lkKCkpOworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgZXhwZWN0ZWQsIHNlbGYuR2VuZXJhdGVNb2Nrcyhzb3VyY2UpKQorCisgIGRlZiB0ZXN0VGVtcGxhdGVkQ2xhc3Moc2VsZik6CisgICAgc291cmNlID0gIiIiCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KK2NsYXNzIFRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEZvbygpOworfTsKKyIiIgorICAgIGV4cGVjdGVkID0gIiIiXAordGVtcGxhdGUgPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4KK2NsYXNzIE1vY2tUZXN0IDogcHVibGljIFRlc3Q8VDAsIFQxPiB7CitwdWJsaWM6CitNT0NLX01FVEhPRDBfVChGb28sCit2b2lkKCkpOworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgZXhwZWN0ZWQsIHNlbGYuR2VuZXJhdGVNb2Nrcyhzb3VyY2UpKQorCisgIGRlZiB0ZXN0VGVtcGxhdGVJbkFUZW1wbGF0ZVR5cGVkZWYoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBUZXN0IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpsaXN0PGludD4+IEZvb1R5cGU7CisgIHZpcnR1YWwgdm9pZCBCYXIoY29uc3QgRm9vVHlwZSYgdGVzdF9hcmcpOworfTsKKyIiIgorICAgIGV4cGVjdGVkID0gIiIiXAorY2xhc3MgTW9ja1Rlc3QgOiBwdWJsaWMgVGVzdCB7CitwdWJsaWM6CitNT0NLX01FVEhPRDEoQmFyLAordm9pZChjb25zdCBGb29UeXBlJiB0ZXN0X2FyZykpOworfTsKKyIiIgorICAgIHNlbGYuYXNzZXJ0RXF1YWxJZ25vcmVMZWFkaW5nV2hpdGVzcGFjZSgKKyAgICAgICAgZXhwZWN0ZWQsIHNlbGYuR2VuZXJhdGVNb2Nrcyhzb3VyY2UpKQorCisgIGRlZiB0ZXN0VGVtcGxhdGVJbkFUZW1wbGF0ZVR5cGVkZWZXaXRoQ29tbWEoc2VsZik6CisgICAgc291cmNlID0gIiIiCitjbGFzcyBUZXN0IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKAorICAgICAgY29uc3QgdmVjdG9yPHN0ZDo6bGlzdDxpbnQ+PiYsIGludD4gRm9vVHlwZTsKKyAgdmlydHVhbCB2b2lkIEJhcihjb25zdCBGb29UeXBlJiB0ZXN0X2FyZyk7Cit9OworIiIiCisgICAgZXhwZWN0ZWQgPSAiIiJcCitjbGFzcyBNb2NrVGVzdCA6IHB1YmxpYyBUZXN0IHsKK3B1YmxpYzoKK01PQ0tfTUVUSE9EMShCYXIsCit2b2lkKGNvbnN0IEZvb1R5cGUmIHRlc3RfYXJnKSk7Cit9OworIiIiCisgICAgc2VsZi5hc3NlcnRFcXVhbElnbm9yZUxlYWRpbmdXaGl0ZXNwYWNlKAorICAgICAgICBleHBlY3RlZCwgc2VsZi5HZW5lcmF0ZU1vY2tzKHNvdXJjZSkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC9rZXl3b3Jkcy5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2dlbmVyYXRvci9jcHAva2V5d29yZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjY5NDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2dlbmVyYXRvci9jcHAva2V5d29yZHMucHkKQEAgLTAsMCArMSw1OSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA3IE5lYWwgTm9yd2l0egorIyBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiQysrIGtleXdvcmRzIGFuZCBoZWxwZXIgdXRpbGl0aWVzIGZvciBkZXRlcm1pbmluZyBrZXl3b3Jkcy4iIiIKKworX19hdXRob3JfXyA9ICdubm9yd2l0ekBnb29nbGUuY29tIChOZWFsIE5vcndpdHopJworCisKK3RyeToKKyAgICAjIFB5dGhvbiAzLngKKyAgICBpbXBvcnQgYnVpbHRpbnMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIFB5dGhvbiAyLngKKyAgICBpbXBvcnQgX19idWlsdGluX18gYXMgYnVpbHRpbnMKKworCitpZiBub3QgaGFzYXR0cihidWlsdGlucywgJ3NldCcpOgorICAgICMgTm9taW5hbCBzdXBwb3J0IGZvciBQeXRob24gMi4zLgorICAgIGZyb20gc2V0cyBpbXBvcnQgU2V0IGFzIHNldAorCisKK1RZUEVTID0gc2V0KCdib29sIGNoYXIgaW50IGxvbmcgc2hvcnQgZG91YmxlIGZsb2F0IHZvaWQgd2NoYXJfdCB1bnNpZ25lZCBzaWduZWQnLnNwbGl0KCkpCitUWVBFX01PRElGSUVSUyA9IHNldCgnYXV0byByZWdpc3RlciBjb25zdCBpbmxpbmUgZXh0ZXJuIHN0YXRpYyB2aXJ0dWFsIHZvbGF0aWxlIG11dGFibGUnLnNwbGl0KCkpCitBQ0NFU1MgPSBzZXQoJ3B1YmxpYyBwcm90ZWN0ZWQgcHJpdmF0ZSBmcmllbmQnLnNwbGl0KCkpCisKK0NBU1RTID0gc2V0KCdzdGF0aWNfY2FzdCBjb25zdF9jYXN0IGR5bmFtaWNfY2FzdCByZWludGVycHJldF9jYXN0Jy5zcGxpdCgpKQorCitPVEhFUlMgPSBzZXQoJ3RydWUgZmFsc2UgYXNtIGNsYXNzIG5hbWVzcGFjZSB1c2luZyBleHBsaWNpdCB0aGlzIG9wZXJhdG9yIHNpemVvZicuc3BsaXQoKSkKK09USEVSX1RZUEVTID0gc2V0KCduZXcgZGVsZXRlIHR5cGVkZWYgc3RydWN0IHVuaW9uIGVudW0gdHlwZWlkIHR5cGVuYW1lIHRlbXBsYXRlJy5zcGxpdCgpKQorCitDT05UUk9MID0gc2V0KCdjYXNlIHN3aXRjaCBkZWZhdWx0IGlmIGVsc2UgcmV0dXJuIGdvdG8nLnNwbGl0KCkpCitFWENFUFRJT04gPSBzZXQoJ3RyeSBjYXRjaCB0aHJvdycuc3BsaXQoKSkKK0xPT1AgPSBzZXQoJ3doaWxlIGRvIGZvciBicmVhayBjb250aW51ZScuc3BsaXQoKSkKKworQUxMID0gVFlQRVMgfCBUWVBFX01PRElGSUVSUyB8IEFDQ0VTUyB8IENBU1RTIHwgT1RIRVJTIHwgT1RIRVJfVFlQRVMgfCBDT05UUk9MIHwgRVhDRVBUSU9OIHwgTE9PUAorCisKK2RlZiBJc0tleXdvcmQodG9rZW4pOgorICAgIHJldHVybiB0b2tlbiBpbiBBTEwKKworZGVmIElzQnVpbHRpblR5cGUodG9rZW4pOgorICAgIGlmIHRva2VuIGluICgndmlydHVhbCcsICdpbmxpbmUnKToKKyAgICAgICAgIyBUaGVzZSBvbmx5IGFwcGx5IHRvIG1ldGhvZHMsIHRoZXkgY2FuJ3QgYmUgdHlwZXMgYnkgdGhlbXNlbHZlcy4KKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIHRva2VuIGluIFRZUEVTIG9yIHRva2VuIGluIFRZUEVfTU9ESUZJRVJTCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3Rva2VuaXplLnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC90b2tlbml6ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNTlkNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ2VuZXJhdG9yL2NwcC90b2tlbml6ZS5weQpAQCAtMCwwICsxLDI4NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA3IE5lYWwgTm9yd2l0egorIyBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiVG9rZW5pemUgQysrIHNvdXJjZSBjb2RlLiIiIgorCitfX2F1dGhvcl9fID0gJ25ub3J3aXR6QGdvb2dsZS5jb20gKE5lYWwgTm9yd2l0eiknCisKKwordHJ5OgorICAgICMgUHl0aG9uIDMueAorICAgIGltcG9ydCBidWlsdGlucworZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgUHl0aG9uIDIueAorICAgIGltcG9ydCBfX2J1aWx0aW5fXyBhcyBidWlsdGlucworCisKK2ltcG9ydCBzeXMKKworZnJvbSBjcHAgaW1wb3J0IHV0aWxzCisKKworaWYgbm90IGhhc2F0dHIoYnVpbHRpbnMsICdzZXQnKToKKyAgICAjIE5vbWluYWwgc3VwcG9ydCBmb3IgUHl0aG9uIDIuMy4KKyAgICBmcm9tIHNldHMgaW1wb3J0IFNldCBhcyBzZXQKKworCisjIEFkZCAkIGFzIGEgdmFsaWQgaWRlbnRpZmllciBjaGFyIHNpbmNlIHNvIG11Y2ggY29kZSB1c2VzIGl0LgorX2xldHRlcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCitWQUxJRF9JREVOVElGSUVSX0NIQVJTID0gc2V0KF9sZXR0ZXJzICsgX2xldHRlcnMudXBwZXIoKSArICdfMDEyMzQ1Njc4OSQnKQorSEVYX0RJR0lUUyA9IHNldCgnMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRicpCitJTlRfT1JfRkxPQVRfRElHSVRTID0gc2V0KCcwMTIzNDU2Nzg5MGVFLSsnKQorCisKKyMgQysrMHggc3RyaW5nIHByZWZmaXhlcy4KK19TVFJfUFJFRklYRVMgPSBzZXQoKCdSJywgJ3U4JywgJ3U4UicsICd1JywgJ3VSJywgJ1UnLCAnVVInLCAnTCcsICdMUicpKQorCisKKyMgVG9rZW4gdHlwZXMuCitVTktOT1dOID0gJ1VOS05PV04nCitTWU5UQVggPSAnU1lOVEFYJworQ09OU1RBTlQgPSAnQ09OU1RBTlQnCitOQU1FID0gJ05BTUUnCitQUkVQUk9DRVNTT1IgPSAnUFJFUFJPQ0VTU09SJworCisjIFdoZXJlIHRoZSB0b2tlbiBvcmlnaW5hdGVkIGZyb20uICBUaGlzIGNhbiBiZSB1c2VkIGZvciBiYWNrdHJhY2tpbmcuCisjIEl0IGlzIGFsd2F5cyBzZXQgdG8gV0hFTkNFX1NUUkVBTSBpbiB0aGlzIGNvZGUuCitXSEVOQ0VfU1RSRUFNLCBXSEVOQ0VfUVVFVUUgPSByYW5nZSgyKQorCisKK2NsYXNzIFRva2VuKG9iamVjdCk6CisgICAgIiIiRGF0YSBjb250YWluZXIgdG8gcmVwcmVzZW50IGEgQysrIHRva2VuLgorCisgICAgVG9rZW5zIGNhbiBiZSBpZGVudGlmaWVycywgc3ludGF4IGNoYXIocyksIGNvbnN0YW50cywgb3IKKyAgICBwcmUtcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCisKKyAgICBzdGFydCBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIHRva2VuIGluIHRoZSBzb3VyY2UKKyAgICBlbmQgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXIgb2YgdGhlIHRva2VuIGluIHRoZSBzb3VyY2UKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlbl90eXBlLCBuYW1lLCBzdGFydCwgZW5kKToKKyAgICAgICAgc2VsZi50b2tlbl90eXBlID0gdG9rZW5fdHlwZQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorICAgICAgICBzZWxmLmVuZCA9IGVuZAorICAgICAgICBzZWxmLndoZW5jZSA9IFdIRU5DRV9TVFJFQU0KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBub3QgdXRpbHMuREVCVUc6CisgICAgICAgICAgICByZXR1cm4gJ1Rva2VuKCVyKScgJSBzZWxmLm5hbWUKKyAgICAgICAgcmV0dXJuICdUb2tlbiglciwgJXMsICVzKScgJSAoc2VsZi5uYW1lLCBzZWxmLnN0YXJ0LCBzZWxmLmVuZCkKKworICAgIF9fcmVwcl9fID0gX19zdHJfXworCisKK2RlZiBfR2V0U3RyaW5nKHNvdXJjZSwgc3RhcnQsIGkpOgorICAgIGkgPSBzb3VyY2UuZmluZCgnIicsIGkrMSkKKyAgICB3aGlsZSBzb3VyY2VbaS0xXSA9PSAnXFwnOgorICAgICAgICAjIENvdW50IHRoZSB0cmFpbGluZyBiYWNrc2xhc2hlcy4KKyAgICAgICAgYmFja3NsYXNoX2NvdW50ID0gMQorICAgICAgICBqID0gaSAtIDIKKyAgICAgICAgd2hpbGUgc291cmNlW2pdID09ICdcXCc6CisgICAgICAgICAgICBiYWNrc2xhc2hfY291bnQgKz0gMQorICAgICAgICAgICAgaiAtPSAxCisgICAgICAgICMgV2hlbiB0cmFpbGluZyBiYWNrc2xhc2hlcyBhcmUgZXZlbiwgdGhleSBlc2NhcGUgZWFjaCBvdGhlci4KKyAgICAgICAgaWYgKGJhY2tzbGFzaF9jb3VudCAlIDIpID09IDA6CisgICAgICAgICAgICBicmVhaworICAgICAgICBpID0gc291cmNlLmZpbmQoJyInLCBpKzEpCisgICAgcmV0dXJuIGkgKyAxCisKKworZGVmIF9HZXRDaGFyKHNvdXJjZSwgc3RhcnQsIGkpOgorICAgICMgTk9URShubm9yd2l0eik6IG1heSBub3QgYmUgcXVpdGUgY29ycmVjdCwgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLgorICAgIGkgPSBzb3VyY2UuZmluZCgiJyIsIGkrMSkKKyAgICB3aGlsZSBzb3VyY2VbaS0xXSA9PSAnXFwnOgorICAgICAgICAjIE5lZWQgdG8gc3BlY2lhbCBjYXNlICdcXCcuCisgICAgICAgIGlmIChpIC0gMikgPiBzdGFydCBhbmQgc291cmNlW2ktMl0gPT0gJ1xcJzoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGkgPSBzb3VyY2UuZmluZCgiJyIsIGkrMSkKKyAgICAjIFRyeSB0byBoYW5kbGUgdW50ZXJtaW5hdGVkIHNpbmdsZSBxdW90ZXMgKGluIGEgI2lmIDAgYmxvY2spLgorICAgIGlmIGkgPCAwOgorICAgICAgICBpID0gc3RhcnQKKyAgICByZXR1cm4gaSArIDEKKworCitkZWYgR2V0VG9rZW5zKHNvdXJjZSk6CisgICAgIiIiUmV0dXJucyBhIHNlcXVlbmNlIG9mIFRva2Vucy4KKworICAgIEFyZ3M6CisgICAgICBzb3VyY2U6IHN0cmluZyBvZiBDKysgc291cmNlIGNvZGUuCisKKyAgICBZaWVsZHM6CisgICAgICBUb2tlbiB0aGF0IHJlcHJlc2VudHMgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHNvdXJjZS4KKyAgICAiIiIKKyAgICAjIENhY2hlIHZhcmlvdXMgdmFsaWQgY2hhcmFjdGVyIHNldHMgZm9yIHNwZWVkLgorICAgIHZhbGlkX2lkZW50aWZpZXJfY2hhcnMgPSBWQUxJRF9JREVOVElGSUVSX0NIQVJTCisgICAgaGV4X2RpZ2l0cyA9IEhFWF9ESUdJVFMKKyAgICBpbnRfb3JfZmxvYXRfZGlnaXRzID0gSU5UX09SX0ZMT0FUX0RJR0lUUworICAgIGludF9vcl9mbG9hdF9kaWdpdHMyID0gaW50X29yX2Zsb2F0X2RpZ2l0cyB8IHNldCgnLicpCisKKyAgICAjIE9ubHkgaWdub3JlIGVycm9ycyB3aGlsZSBpbiBhICNpZiAwIGJsb2NrLgorICAgIGlnbm9yZV9lcnJvcnMgPSBGYWxzZQorICAgIGNvdW50X2lmcyA9IDAKKworICAgIGkgPSAwCisgICAgZW5kID0gbGVuKHNvdXJjZSkKKyAgICB3aGlsZSBpIDwgZW5kOgorICAgICAgICAjIFNraXAgd2hpdGVzcGFjZS4KKyAgICAgICAgd2hpbGUgaSA8IGVuZCBhbmQgc291cmNlW2ldLmlzc3BhY2UoKToKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBpZiBpID49IGVuZDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRva2VuX3R5cGUgPSBVTktOT1dOCisgICAgICAgIHN0YXJ0ID0gaQorICAgICAgICBjID0gc291cmNlW2ldCisgICAgICAgIGlmIGMuaXNhbHBoYSgpIG9yIGMgPT0gJ18nOiAgICAgICAgICAgICAgIyBGaW5kIGEgc3RyaW5nIHRva2VuLgorICAgICAgICAgICAgdG9rZW5fdHlwZSA9IE5BTUUKKyAgICAgICAgICAgIHdoaWxlIHNvdXJjZVtpXSBpbiB2YWxpZF9pZGVudGlmaWVyX2NoYXJzOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgIyBTdHJpbmcgYW5kIGNoYXJhY3RlciBjb25zdGFudHMgY2FuIGxvb2sgbGlrZSBhIG5hbWUgaWYKKyAgICAgICAgICAgICMgdGhleSBhcmUgc29tZXRoaW5nIGxpa2UgTCIiLgorICAgICAgICAgICAgaWYgKHNvdXJjZVtpXSA9PSAiJyIgYW5kIChpIC0gc3RhcnQpID09IDEgYW5kCisgICAgICAgICAgICAgICAgc291cmNlW3N0YXJ0OmldIGluICd1VUwnKToKKyAgICAgICAgICAgICAgICAjIHUsIFUsIGFuZCBMIGFyZSB2YWxpZCBDKysweCBjaGFyYWN0ZXIgcHJlZmZpeGVzLgorICAgICAgICAgICAgICAgIHRva2VuX3R5cGUgPSBDT05TVEFOVAorICAgICAgICAgICAgICAgIGkgPSBfR2V0Q2hhcihzb3VyY2UsIHN0YXJ0LCBpKQorICAgICAgICAgICAgZWxpZiBzb3VyY2VbaV0gPT0gIiciIGFuZCBzb3VyY2Vbc3RhcnQ6aV0gaW4gX1NUUl9QUkVGSVhFUzoKKyAgICAgICAgICAgICAgICB0b2tlbl90eXBlID0gQ09OU1RBTlQKKyAgICAgICAgICAgICAgICBpID0gX0dldFN0cmluZyhzb3VyY2UsIHN0YXJ0LCBpKQorICAgICAgICBlbGlmIGMgPT0gJy8nIGFuZCBzb3VyY2VbaSsxXSA9PSAnLyc6ICAgICMgRmluZCAvLyBjb21tZW50cy4KKyAgICAgICAgICAgIGkgPSBzb3VyY2UuZmluZCgnXG4nLCBpKQorICAgICAgICAgICAgaWYgaSA9PSAtMTogICMgSGFuZGxlIEVPRi4KKyAgICAgICAgICAgICAgICBpID0gZW5kCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbGlmIGMgPT0gJy8nIGFuZCBzb3VyY2VbaSsxXSA9PSAnKic6ICAgICMgRmluZCAvKiBjb21tZW50cy4gKi8KKyAgICAgICAgICAgIGkgPSBzb3VyY2UuZmluZCgnKi8nLCBpKSArIDIKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsaWYgYyBpbiAnOistPD4mfCo9JzogICAgICAgICAgICAgICAgICAgIyA6IG9yIDo6IChwbHVzIG90aGVyIGNoYXJzKS4KKyAgICAgICAgICAgIHRva2VuX3R5cGUgPSBTWU5UQVgKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgbmV3X2NoID0gc291cmNlW2ldCisgICAgICAgICAgICBpZiBuZXdfY2ggPT0gYyBhbmQgYyAhPSAnPic6ICAgICAgICAgIyBUcmVhdCAiPj4iIGFzIHR3byB0b2tlbnMuCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBlbGlmIGMgPT0gJy0nIGFuZCBuZXdfY2ggPT0gJz4nOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgZWxpZiBuZXdfY2ggPT0gJz0nOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBlbGlmIGMgaW4gJygpW117fX4hP14lOy8uLCc6ICAgICAgICAgICAgICMgSGFuZGxlIHNpbmdsZSBjaGFyIHRva2Vucy4KKyAgICAgICAgICAgIHRva2VuX3R5cGUgPSBTWU5UQVgKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgaWYgYyA9PSAnLicgYW5kIHNvdXJjZVtpXS5pc2RpZ2l0KCk6CisgICAgICAgICAgICAgICAgdG9rZW5fdHlwZSA9IENPTlNUQU5UCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgd2hpbGUgc291cmNlW2ldIGluIGludF9vcl9mbG9hdF9kaWdpdHM6CisgICAgICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgICMgSGFuZGxlIGZsb2F0IHN1ZmZpeGVzLgorICAgICAgICAgICAgICAgIGZvciBzdWZmaXggaW4gKCdsJywgJ2YnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc3VmZml4ID09IHNvdXJjZVtpOmkrMV0ubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBjLmlzZGlnaXQoKTogICAgICAgICAgICAgICAgICAgICAgICAjIEZpbmQgaW50ZWdlci4KKyAgICAgICAgICAgIHRva2VuX3R5cGUgPSBDT05TVEFOVAorICAgICAgICAgICAgaWYgYyA9PSAnMCcgYW5kIHNvdXJjZVtpKzFdIGluICd4WCc6CisgICAgICAgICAgICAgICAgIyBIYW5kbGUgaGV4IGRpZ2l0cy4KKyAgICAgICAgICAgICAgICBpICs9IDIKKyAgICAgICAgICAgICAgICB3aGlsZSBzb3VyY2VbaV0gaW4gaGV4X2RpZ2l0czoKKyAgICAgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdoaWxlIHNvdXJjZVtpXSBpbiBpbnRfb3JfZmxvYXRfZGlnaXRzMjoKKyAgICAgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAjIEhhbmRsZSBpbnRlZ2VyIChhbmQgZmxvYXQpIHN1ZmZpeGVzLgorICAgICAgICAgICAgZm9yIHN1ZmZpeCBpbiAoJ3VsbCcsICdsbCcsICd1bCcsICdsJywgJ2YnLCAndScpOgorICAgICAgICAgICAgICAgIHNpemUgPSBsZW4oc3VmZml4KQorICAgICAgICAgICAgICAgIGlmIHN1ZmZpeCA9PSBzb3VyY2VbaTppK3NpemVdLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgICAgIGkgKz0gc2l6ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbGlmIGMgPT0gJyInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRmluZCBzdHJpbmcuCisgICAgICAgICAgICB0b2tlbl90eXBlID0gQ09OU1RBTlQKKyAgICAgICAgICAgIGkgPSBfR2V0U3RyaW5nKHNvdXJjZSwgc3RhcnQsIGkpCisgICAgICAgIGVsaWYgYyA9PSAiJyI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGaW5kIGNoYXIuCisgICAgICAgICAgICB0b2tlbl90eXBlID0gQ09OU1RBTlQKKyAgICAgICAgICAgIGkgPSBfR2V0Q2hhcihzb3VyY2UsIHN0YXJ0LCBpKQorICAgICAgICBlbGlmIGMgPT0gJyMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRmluZCBwcmUtcHJvY2Vzc29yIGNvbW1hbmQuCisgICAgICAgICAgICB0b2tlbl90eXBlID0gUFJFUFJPQ0VTU09SCisgICAgICAgICAgICBnb3RfaWYgPSBzb3VyY2VbaTppKzNdID09ICcjaWYnIGFuZCBzb3VyY2VbaSszOmkrNF0uaXNzcGFjZSgpCisgICAgICAgICAgICBpZiBnb3RfaWY6CisgICAgICAgICAgICAgICAgY291bnRfaWZzICs9IDEKKyAgICAgICAgICAgIGVsaWYgc291cmNlW2k6aSs2XSA9PSAnI2VuZGlmJzoKKyAgICAgICAgICAgICAgICBjb3VudF9pZnMgLT0gMQorICAgICAgICAgICAgICAgIGlmIGNvdW50X2lmcyA9PSAwOgorICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZXJyb3JzID0gRmFsc2UKKworICAgICAgICAgICAgIyBUT0RPKG5ub3J3aXR6KTogaGFuZGxlIHByZXByb2Nlc3NvciBzdGF0ZW1lbnRzIChcIGNvbnRpbnVhdGlvbnMpLgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBpMSA9IHNvdXJjZS5maW5kKCdcbicsIGkpCisgICAgICAgICAgICAgICAgaTIgPSBzb3VyY2UuZmluZCgnLy8nLCBpKQorICAgICAgICAgICAgICAgIGkzID0gc291cmNlLmZpbmQoJy8qJywgaSkKKyAgICAgICAgICAgICAgICBpNCA9IHNvdXJjZS5maW5kKCciJywgaSkKKyAgICAgICAgICAgICAgICAjIE5PVEUobm5vcndpdHopOiBkb2Vzbid0IGhhbmRsZSBjb21tZW50cyBpbiAjZGVmaW5lIG1hY3Jvcy4KKyAgICAgICAgICAgICAgICAjIEdldCB0aGUgZmlyc3QgaW1wb3J0YW50IHN5bWJvbCAobmV3bGluZSwgY29tbWVudCwgRU9GL2VuZCkuCisgICAgICAgICAgICAgICAgaSA9IG1pbihbeCBmb3IgeCBpbiAoaTEsIGkyLCBpMywgaTQsIGVuZCkgaWYgeCAhPSAtMV0pCisKKyAgICAgICAgICAgICAgICAjIEhhbmRsZSAjaW5jbHVkZSAiZGlyLy9mb28uaCIgcHJvcGVybHkuCisgICAgICAgICAgICAgICAgaWYgc291cmNlW2ldID09ICciJzoKKyAgICAgICAgICAgICAgICAgICAgaSA9IHNvdXJjZS5maW5kKCciJywgaSsxKSArIDEKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGkgPiAwCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgIyBLZWVwIGdvaW5nIGlmIGVuZCBvZiB0aGUgbGluZSBhbmQgdGhlIGxpbmUgZW5kcyB3aXRoIFwuCisgICAgICAgICAgICAgICAgaWYgbm90IChpID09IGkxIGFuZCBzb3VyY2VbaS0xXSA9PSAnXFwnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZ290X2lmOgorICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gc291cmNlW3N0YXJ0KzQ6aV0ubHN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24uc3RhcnRzd2l0aCgnMCcpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLnN0YXJ0c3dpdGgoJygwKScpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZXJyb3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBlbGlmIGMgPT0gJ1xcJzogICAgICAgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIFwgaW4gY29kZS4KKyAgICAgICAgICAgICMgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcHJlLXByb2Nlc3NvciBcIGhhbmRsaW5nLgorICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbGlmIGlnbm9yZV9lcnJvcnM6CisgICAgICAgICAgICAjIFRoZSB0b2tlbml6ZXIgc2VlbXMgdG8gYmUgaW4gcHJldHR5IGdvb2Qgc2hhcGUuICBUaGlzCisgICAgICAgICAgICAjIHJhaXNlIGlzIGNvbmRpdGlvbmFsbHkgZGlzYWJsZWQgc28gdGhhdCBib2d1cyBjb2RlCisgICAgICAgICAgICAjIGluIGFuICNpZiAwIGJsb2NrIGNhbiBiZSBoYW5kbGVkLiAgU2luY2Ugd2Ugd2lsbCBpZ25vcmUKKyAgICAgICAgICAgICMgaXQgYW55d2F5cywgdGhpcyBpcyBwcm9iYWJseSBmaW5lLiAgU28gZGlzYWJsZSB0aGUKKyAgICAgICAgICAgICMgZXhjZXB0aW9uIGFuZCAgcmV0dXJuIHRoZSBib2d1cyBjaGFyLgorICAgICAgICAgICAgaSArPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdHb3QgaW52YWxpZCB0b2tlbiBpbiAlcyBAICVkIHRva2VuOiVzOiAlclxuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnPycsIGksIGMsIHNvdXJjZVtpLTEwOmkrMTBdKSkKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigndW5leHBlY3RlZCB0b2tlbicpCisKKyAgICAgICAgaWYgaSA8PSAwOgorICAgICAgICAgICAgcHJpbnQoJ0ludmFsaWQgaW5kZXgsIGV4aXRpbmcgbm93LicpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgeWllbGQgVG9rZW4odG9rZW5fdHlwZSwgc291cmNlW3N0YXJ0OmldLCBzdGFydCwgaSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGRlZiBtYWluKGFyZ3YpOgorICAgICAgICAiIiJEcml2ZXIgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiIiIgorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gYXJndlsxOl06CisgICAgICAgICAgICBzb3VyY2UgPSB1dGlscy5SZWFkRmlsZShmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIHNvdXJjZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZvciB0b2tlbiBpbiBHZXRUb2tlbnMoc291cmNlKToKKyAgICAgICAgICAgICAgICBwcmludCgnJS0xMnM6ICVzJyAlICh0b2tlbi50b2tlbl90eXBlLCB0b2tlbi5uYW1lKSkKKyAgICAgICAgICAgICAgICAjIHByaW50KCdcciU2LjJmJSUnICUgKDEwMC4wICogaW5kZXggLyB0b2tlbi5lbmQpLCkKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKKworCisgICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2dlbmVyYXRvci9jcHAvdXRpbHMucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhYjM2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvY3BwL3V0aWxzLnB5CkBAIC0wLDAgKzEsNDEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNyBOZWFsIE5vcndpdHoKKyMgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIkdlbmVyaWMgdXRpbGl0aWVzIGZvciBDKysgcGFyc2luZy4iIiIKKworX19hdXRob3JfXyA9ICdubm9yd2l0ekBnb29nbGUuY29tIChOZWFsIE5vcndpdHopJworCisKK2ltcG9ydCBzeXMKKworCisjIFNldCB0byBUcnVlIHRvIHNlZSB0aGUgc3RhcnQvZW5kIHRva2VuIGluZGljZXMuCitERUJVRyA9IFRydWUKKworCitkZWYgUmVhZEZpbGUoZmlsZW5hbWUsIHByaW50X2Vycm9yPVRydWUpOgorICAgICIiIlJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4iIiIKKyAgICB0cnk6CisgICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBpZiBwcmludF9lcnJvcjoKKyAgICAgICAgICAgIHByaW50KCdFcnJvciByZWFkaW5nICVzOiAlcycgJSAoZmlsZW5hbWUsIHN5cy5leGNfaW5mbygpWzFdKSkKKyAgICAgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2dlbmVyYXRvci9nbW9ja19nZW4ucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvZ21vY2tfZ2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjYzBkMTMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nZW5lcmF0b3IvZ21vY2tfZ2VuLnB5CkBAIC0wLDAgKzEsMzEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiRHJpdmVyIGZvciBzdGFydGluZyB1cCBHb29nbGUgTW9jayBjbGFzcyBnZW5lcmF0b3IuIiIiCisKK19fYXV0aG9yX18gPSAnbm5vcndpdHpAZ29vZ2xlLmNvbSAoTmVhbCBOb3J3aXR6KScKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICMgQWRkIHRoZSBkaXJlY3Rvcnkgb2YgdGhpcyBzY3JpcHQgdG8gdGhlIHBhdGggc28gd2UgY2FuIGltcG9ydCBnbW9ja19jbGFzcy4KKyAgc3lzLnBhdGguYXBwZW5kKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisKKyAgZnJvbSBjcHAgaW1wb3J0IGdtb2NrX2NsYXNzCisgICMgRml4IHRoZSBkb2NzdHJpbmcgaW4gY2FzZSB0aGV5IHJlcXVpcmUgdGhlIHVzYWdlLgorICBnbW9ja19jbGFzcy5fX2RvY19fID0gZ21vY2tfY2xhc3MuX19kb2NfXy5yZXBsYWNlKCdnbW9ja19jbGFzcy5weScsIF9fZmlsZV9fKQorICBnbW9ja19jbGFzcy5tYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2dtb2NrLWNvbmZpZy5pbiBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL2dtb2NrLWNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYmFlZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ21vY2stY29uZmlnLmluCkBAIC0wLDAgKzEsMzAzIEBACisjIS9iaW4vc2gKKworIyBUaGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZmlsbGVkIGluIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LgorbmFtZT0iQFBBQ0tBR0VfVEFSTkFNRUAiCit2ZXJzaW9uPSJAUEFDS0FHRV9WRVJTSU9OQCIKKworc2hvd191c2FnZSgpCit7CisgIGVjaG8gIlVzYWdlOiBnbW9jay1jb25maWcgW09QVElPTlMuLi5dIgorfQorCitzaG93X2hlbHAoKQoreworICBzaG93X3VzYWdlCisgIGNhdCA8PFxFT0YKKworVGhlIGBnbW9jay1jb25maWcnIHNjcmlwdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG5lY2Vzc2FyeSBjb21waWxlIGFuZCBsaW5raW5nCitmbGFncyB0byBjb25uZWN0IHdpdGggR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yaywgYm90aCBpbiBhIGJ1aWxkIHByaW9yIHRvCitpbnN0YWxsYXRpb24sIGFuZCBvbiB0aGUgc3lzdGVtIHByb3BlciBhZnRlciBpbnN0YWxsYXRpb24uIFRoZSBpbnN0YWxsYXRpb24KK292ZXJyaWRlcyBtYXkgYmUgaXNzdWVkIGluIGNvbWJpbmF0aW9uIHdpdGggYW55IG90aGVyIHF1ZXJpZXMsIGJ1dCB3aWxsIG9ubHkKK2FmZmVjdCBpbnN0YWxsYXRpb24gcXVlcmllcyBpZiBjYWxsZWQgb24gYSBidWlsdCBidXQgbm90IGluc3RhbGxlZCBnbW9jay4gVGhlCitpbnN0YWxsYXRpb24gcXVlcmllcyBtYXkgbm90IGJlIGlzc3VlZCB3aXRoIGFueSBvdGhlciB0eXBlcyBvZiBxdWVyaWVzLCBhbmQKK29ubHkgb25lIGluc3RhbGxhdGlvbiBxdWVyeSBtYXkgYmUgbWFkZSBhdCBhIHRpbWUuIFRoZSB2ZXJzaW9uIHF1ZXJpZXMgYW5kCitjb21waWxlciBmbGFnIHF1ZXJpZXMgbWF5IGJlIGNvbWJpbmVkIGFzIGRlc2lyZWQgYnV0IG5vdCBtaXhlZC4gRGlmZmVyZW50Cit2ZXJzaW9uIHF1ZXJpZXMgYXJlIGFsd2F5cyBjb21iaW5lZCB3aXRoIGxvZ2ljYWwgImFuZCIgc2VtYW50aWNzLCBhbmQgb25seSB0aGUKK2xhc3Qgb2YgYW55IHBhcnRpY3VsYXIgcXVlcnkgaXMgdXNlZCB3aGlsZSBhbGwgcHJldmlvdXMgb25lcyBpZ25vcmVkLiBBbGwKK3ZlcnNpb25zIG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgc2VxdWVuY2Ugb2YgbnVtYmVycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcy4KK0NvbXBpbGVyIGZsYWcgcXVlcmllcyBvdXRwdXQgdGhlIHVuaW9uIG9mIHRoZSBzZXRzIG9mIGZsYWdzIHdoZW4gY29tYmluZWQuCisKKyBFeGFtcGxlczoKKyAgZ21vY2stY29uZmlnIC0tbWluLXZlcnNpb249MS4wIHx8IGVjaG8gIkluc3VmZmljaWVudCBHb29nbGUgTW9jayB2ZXJzaW9uLiIKKworICBnKysgJChnbW9jay1jb25maWcgLS1jcHBmbGFncyAtLWN4eGZsYWdzKSAtbyBmb28ubyAtYyBmb28uY3BwCisgIGcrKyAkKGdtb2NrLWNvbmZpZyAtLWxkZmxhZ3MgLS1saWJzKSAtbyBmb28gZm9vLm8KKworICAjIFdoZW4gdXNpbmcgYSBidWlsdCBidXQgbm90IGluc3RhbGxlZCBHb29nbGUgTW9jazoKKyAgZysrICQoLi4vLi4vbXlfZ21vY2tfYnVpbGQvc2NyaXB0cy9nbW9jay1jb25maWcgLi4uKSAuLi4KKworICAjIFdoZW4gdXNpbmcgYW4gaW5zdGFsbGVkIEdvb2dsZSBNb2NrLCBidXQgd2l0aCBpbnN0YWxsYXRpb24gb3ZlcnJpZGVzOgorICBleHBvcnQgR01PQ0tfUFJFRklYPSIvb3B0IgorICBnKysgJChnbW9jay1jb25maWcgLS1saWJkaXI9Ii9vcHQvbGliNjQiIC4uLikgLi4uCisKKyBIZWxwOgorICAtLXVzYWdlICAgICAgICAgICAgICAgICAgICBicmllZiB1c2FnZSBpbmZvcm1hdGlvbgorICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlCisKKyBJbnN0YWxsYXRpb24gT3ZlcnJpZGVzOgorICAtLXByZWZpeD08ZGlyPiAgICAgICAgICAgICBvdmVycmlkZXMgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgLS1leGVjLXByZWZpeD08ZGlyPiAgICAgICAgb3ZlcnJpZGVzIHRoZSBleGVjdXRhYmxlIGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgLS1saWJkaXI9PGRpcj4gICAgICAgICAgICAgb3ZlcnJpZGVzIHRoZSBsaWJyYXJ5IGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgLS1pbmNsdWRlZGlyPTxkaXI+ICAgICAgICAgb3ZlcnJpZGVzIHRoZSBoZWFkZXIgZmlsZSBpbnN0YWxsYXRpb24gcHJlZml4CisKKyBJbnN0YWxsYXRpb24gUXVlcmllczoKKyAgLS1wcmVmaXggICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWV4ZWMtcHJlZml4ICAgICAgICAgICAgICBleGVjdXRhYmxlIGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgLS1saWJkaXIgICAgICAgICAgICAgICAgICAgbGlicmFyeSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5CisgIC0taW5jbHVkZWRpciAgICAgICAgICAgICAgIGhlYWRlciBmaWxlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgdGhlIHZlcnNpb24gb2YgdGhlIEdvb2dsZSBNb2NrIGluc3RhbGxhdGlvbgorCisgVmVyc2lvbiBRdWVyaWVzOgorICAtLW1pbi12ZXJzaW9uPVZFUlNJT04gICAgICByZXR1cm4gMCBpZiB0aGUgdmVyc2lvbiBpcyBhdCBsZWFzdCBWRVJTSU9OCisgIC0tZXhhY3QtdmVyc2lvbj1WRVJTSU9OICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGV4YWN0bHkgVkVSU0lPTgorICAtLW1heC12ZXJzaW9uPVZFUlNJT04gICAgICByZXR1cm4gMCBpZiB0aGUgdmVyc2lvbiBpcyBhdCBtb3N0IFZFUlNJT04KKworIENvbXBpbGF0aW9uIEZsYWcgUXVlcmllczoKKyAgLS1jcHBmbGFncyAgICAgICAgICAgICAgICAgY29tcGlsZSBmbGFncyBzcGVjaWZpYyB0byB0aGUgQy1saWtlIHByZXByb2Nlc3NvcnMKKyAgLS1jeHhmbGFncyAgICAgICAgICAgICAgICAgY29tcGlsZSBmbGFncyBhcHByb3ByaWF0ZSBmb3IgQysrIHByb2dyYW1zCisgIC0tbGRmbGFncyAgICAgICAgICAgICAgICAgIGxpbmtlciBmbGFncworICAtLWxpYnMgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgZm9yIGxpbmtpbmcKKworRU9GCit9CisKKyMgVGhpcyBmdW5jdGlvbiBib3VuZHMgb3VyIHZlcnNpb24gd2l0aCBhIG1pbiBhbmQgYSBtYXguIEl0IHVzZXMgc29tZSBjbGV2ZXIKKyMgUE9TSVgtY29tcGxpYW50IHZhcmlhYmxlIGV4cGFuc2lvbiB0byBwb3J0YWJseSBkbyBhbGwgdGhlIHdvcmsgaW4gdGhlIHNoZWxsCisjIGFuZCBhdm9pZCBhbnkgZGVwZW5kZW5jeSBvbiBhIHBhcnRpY3VsYXIgInNlZCIgb3IgImF3ayIgaW1wbGVtZW50YXRpb24uCisjIE5vdGFibGUgaXMgdGhhdCBpdCB3aWxsIG9ubHkgZXZlciBjb21wYXJlIHRoZSBmaXJzdCAzIGNvbXBvbmVudHMgb2YgdmVyc2lvbnMuCisjIEZ1cnRoZXIgY29tcG9uZW50cyB3aWxsIGJlIGNsZWFubHkgc3RyaXBwZWQgb2ZmLiBBbGwgdmVyc2lvbnMgbXVzdCBiZQorIyB1bmFkb3JuZWQsIHNvICJ2MS4wIiB3aWxsICpub3QqIHdvcmsuIFRoZSBtaW5pbXVtIHZlcnNpb24gbXVzdCBiZSBpbiAkMSwgYW5kCisjIHRoZSBtYXggaW4gJDIuIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pOiBJZiB0aGlzIGV2ZXIgYnJlYWtzLCB3ZSBzaG91bGQKKyMgaW52ZXN0aWdhdGUgZXhwYW5kaW5nIHRoaXMgdmlhIGF1dG9tNHRlIGZyb20gQVNfVkVSU0lPTl9DT01QQVJFIHJhdGhlciB0aGFuCisjIGNvbnRpbnVpbmcgdG8gbWFpbnRhaW4gb3VyIG93biBzaGVsbCB2ZXJzaW9uLgorY2hlY2tfdmVyc2lvbnMoKQoreworICBtYWpvcl92ZXJzaW9uPSR7dmVyc2lvbiUlLip9CisgIG1pbm9yX3ZlcnNpb249IjAiCisgIHBvaW50X3ZlcnNpb249IjAiCisgIGlmIHRlc3QgIiR7dmVyc2lvbiMqLn0iICE9ICIke3ZlcnNpb259IjsgdGhlbgorICAgIG1pbm9yX3ZlcnNpb249JHt2ZXJzaW9uIyoufQorICAgIG1pbm9yX3ZlcnNpb249JHttaW5vcl92ZXJzaW9uJSUuKn0KKyAgZmkKKyAgaWYgdGVzdCAiJHt2ZXJzaW9uIyouKi59IiAhPSAiJHt2ZXJzaW9ufSI7IHRoZW4KKyAgICBwb2ludF92ZXJzaW9uPSR7dmVyc2lvbiMqLioufQorICAgIHBvaW50X3ZlcnNpb249JHtwb2ludF92ZXJzaW9uJSUuKn0KKyAgZmkKKworICBtaW5fdmVyc2lvbj0iJDEiCisgIG1pbl9tYWpvcl92ZXJzaW9uPSR7bWluX3ZlcnNpb24lJS4qfQorICBtaW5fbWlub3JfdmVyc2lvbj0iMCIKKyAgbWluX3BvaW50X3ZlcnNpb249IjAiCisgIGlmIHRlc3QgIiR7bWluX3ZlcnNpb24jKi59IiAhPSAiJHttaW5fdmVyc2lvbn0iOyB0aGVuCisgICAgbWluX21pbm9yX3ZlcnNpb249JHttaW5fdmVyc2lvbiMqLn0KKyAgICBtaW5fbWlub3JfdmVyc2lvbj0ke21pbl9taW5vcl92ZXJzaW9uJSUuKn0KKyAgZmkKKyAgaWYgdGVzdCAiJHttaW5fdmVyc2lvbiMqLioufSIgIT0gIiR7bWluX3ZlcnNpb259IjsgdGhlbgorICAgIG1pbl9wb2ludF92ZXJzaW9uPSR7bWluX3ZlcnNpb24jKi4qLn0KKyAgICBtaW5fcG9pbnRfdmVyc2lvbj0ke21pbl9wb2ludF92ZXJzaW9uJSUuKn0KKyAgZmkKKworICBtYXhfdmVyc2lvbj0iJDIiCisgIG1heF9tYWpvcl92ZXJzaW9uPSR7bWF4X3ZlcnNpb24lJS4qfQorICBtYXhfbWlub3JfdmVyc2lvbj0iMCIKKyAgbWF4X3BvaW50X3ZlcnNpb249IjAiCisgIGlmIHRlc3QgIiR7bWF4X3ZlcnNpb24jKi59IiAhPSAiJHttYXhfdmVyc2lvbn0iOyB0aGVuCisgICAgbWF4X21pbm9yX3ZlcnNpb249JHttYXhfdmVyc2lvbiMqLn0KKyAgICBtYXhfbWlub3JfdmVyc2lvbj0ke21heF9taW5vcl92ZXJzaW9uJSUuKn0KKyAgZmkKKyAgaWYgdGVzdCAiJHttYXhfdmVyc2lvbiMqLioufSIgIT0gIiR7bWF4X3ZlcnNpb259IjsgdGhlbgorICAgIG1heF9wb2ludF92ZXJzaW9uPSR7bWF4X3ZlcnNpb24jKi4qLn0KKyAgICBtYXhfcG9pbnRfdmVyc2lvbj0ke21heF9wb2ludF92ZXJzaW9uJSUuKn0KKyAgZmkKKworICB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWx0ICQoKCRtaW5fbWFqb3JfdmVyc2lvbikpICYmIGV4aXQgMQorICBpZiB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWVxICQoKCRtaW5fbWFqb3JfdmVyc2lvbikpOyB0aGVuCisgICAgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1sdCAkKCgkbWluX21pbm9yX3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgICBpZiB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWVxICQoKCRtaW5fbWlub3JfdmVyc2lvbikpOyB0aGVuCisgICAgICB0ZXN0ICQoKCRwb2ludF92ZXJzaW9uKSkgLWx0ICQoKCRtaW5fcG9pbnRfdmVyc2lvbikpICYmIGV4aXQgMQorICAgIGZpCisgIGZpCisKKyAgdGVzdCAkKCgkbWFqb3JfdmVyc2lvbikpIC1ndCAkKCgkbWF4X21ham9yX3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgaWYgdGVzdCAkKCgkbWFqb3JfdmVyc2lvbikpIC1lcSAkKCgkbWF4X21ham9yX3ZlcnNpb24pKTsgdGhlbgorICAgIHRlc3QgJCgoJG1pbm9yX3ZlcnNpb24pKSAtZ3QgJCgoJG1heF9taW5vcl92ZXJzaW9uKSkgJiYgZXhpdCAxCisgICAgaWYgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1lcSAkKCgkbWF4X21pbm9yX3ZlcnNpb24pKTsgdGhlbgorICAgICAgdGVzdCAkKCgkcG9pbnRfdmVyc2lvbikpIC1ndCAkKCgkbWF4X3BvaW50X3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgICBmaQorICBmaQorCisgIGV4aXQgMAorfQorCisjIFNob3cgdGhlIHVzYWdlIGxpbmUgd2hlbiBubyBhcmd1bWVudHMgYXJlIHNwZWNpZmllZC4KK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgc2hvd191c2FnZQorICBleGl0IDEKK2ZpCisKK3doaWxlIHRlc3QgJCMgLWd0IDA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXVzYWdlKSAgICAgICAgICBzaG93X3VzYWdlOyAgICAgICAgIGV4aXQgMDs7CisgICAgLS1oZWxwKSAgICAgICAgICAgc2hvd19oZWxwOyAgICAgICAgICBleGl0IDA7OworCisgICAgIyBJbnN0YWxsYXRpb24gb3ZlcnJpZGVzCisgICAgLS1wcmVmaXg9KikgICAgICAgR01PQ0tfUFJFRklYPSR7MSMtLXByZWZpeD19OzsKKyAgICAtLWV4ZWMtcHJlZml4PSopICBHTU9DS19FWEVDX1BSRUZJWD0kezEjLS1leGVjLXByZWZpeD19OzsKKyAgICAtLWxpYmRpcj0qKSAgICAgICBHTU9DS19MSUJESVI9JHsxIy0tbGliZGlyPX07OworICAgIC0taW5jbHVkZWRpcj0qKSAgIEdNT0NLX0lOQ0xVREVESVI9JHsxIy0taW5jbHVkZWRpcj19OzsKKworICAgICMgSW5zdGFsbGF0aW9uIHF1ZXJpZXMKKyAgICAtLXByZWZpeHwtLWV4ZWMtcHJlZml4fC0tbGliZGlyfC0taW5jbHVkZWRpcnwtLXZlcnNpb24pCisgICAgICBpZiB0ZXN0IC1uICIke2RvX3F1ZXJ5fSI7IHRoZW4KKyAgICAgICAgc2hvd191c2FnZQorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisgICAgICBkb19xdWVyeT0kezEjLS19CisgICAgICA7OworCisgICAgIyBWZXJzaW9uIGNoZWNraW5nCisgICAgLS1taW4tdmVyc2lvbj0qKQorICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCisgICAgICBtaW5fdmVyc2lvbj0kezEjLS1taW4tdmVyc2lvbj19CisgICAgICA7OworICAgIC0tbWF4LXZlcnNpb249KikKKyAgICAgIGRvX2NoZWNrX3ZlcnNpb25zPXllcworICAgICAgbWF4X3ZlcnNpb249JHsxIy0tbWF4LXZlcnNpb249fQorICAgICAgOzsKKyAgICAtLWV4YWN0LXZlcnNpb249KikKKyAgICAgIGRvX2NoZWNrX3ZlcnNpb25zPXllcworICAgICAgZXhhY3RfdmVyc2lvbj0kezEjLS1leGFjdC12ZXJzaW9uPX0KKyAgICAgIDs7CisKKyAgICAjIENvbXBpbGVyIGZsYWcgb3V0cHV0CisgICAgLS1jcHBmbGFncykgICAgICAgZWNob19jcHBmbGFncz15ZXM7OworICAgIC0tY3h4ZmxhZ3MpICAgICAgIGVjaG9fY3h4ZmxhZ3M9eWVzOzsKKyAgICAtLWxkZmxhZ3MpICAgICAgICBlY2hvX2xkZmxhZ3M9eWVzOzsKKyAgICAtLWxpYnMpICAgICAgICAgICBlY2hvX2xpYnM9eWVzOzsKKworICAgICMgRXZlcnl0aGluZyBlbHNlIGlzIGFuIGVycm9yCisgICAgKikgICAgICAgICAgICAgICAgc2hvd191c2FnZTsgICAgICAgICBleGl0IDE7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKKyMgVGhlc2UgaGF2ZSBkZWZhdWx0cyBmaWxsZWQgaW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYnV0IGNhbiBhbHNvIGJlCisjIG92ZXJyaWRkZW4gYnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgorcHJlZml4PSIke0dNT0NLX1BSRUZJWDotQHByZWZpeEB9IgorZXhlY19wcmVmaXg9IiR7R01PQ0tfRVhFQ19QUkVGSVg6LUBleGVjX3ByZWZpeEB9IgorbGliZGlyPSIke0dNT0NLX0xJQkRJUjotQGxpYmRpckB9IgoraW5jbHVkZWRpcj0iJHtHTU9DS19JTkNMVURFRElSOi1AaW5jbHVkZWRpckB9IgorCisjIFdlIHRyeSBhbmQgZGV0ZWN0IGlmIG91ciBiaW5hcnkgaXMgbm90IGxvY2F0ZWQgYXQgaXRzIGluc3RhbGxlZCBsb2NhdGlvbi4gSWYKKyMgaXQncyBub3QsIHdlIHByb3ZpZGUgdmFyaWFibGVzIHBvaW50aW5nIHRvIHRoZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWUgcmF0aGVyCisjIHRoYW4gdG8gdGhlIGluc3RhbGwgdHJlZS4gV2UgYWxzbyBsb2NhdGUgR29vZ2xlIFRlc3QgdXNpbmcgdGhlIGNvbmZpZ3VyZWQKKyMgZ3Rlc3QtY29uZmlnIHNjcmlwdCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdGhlIFBBVEggYW5kIG91ciBiaW5kaXIgZm9yIG9uZS4KKyMgVGhpcyBhbGxvd3MgYnVpbGRpbmcgYWdhaW5zdCBhIGp1c3QtYnVpbHQgZ21vY2sgcmF0aGVyIHRoYW4gYW4gaW5zdGFsbGVkCisjIGdtb2NrLgorYmluZGlyPSJAYmluZGlyQCIKK3RoaXNfcmVsYXRpdmVfYmluZGlyPWBkaXJuYW1lICQwYAordGhpc19iaW5kaXI9YGNkICR7dGhpc19yZWxhdGl2ZV9iaW5kaXJ9OyBwd2QgLVBgCitpZiB0ZXN0ICIke3RoaXNfYmluZGlyfSIgPSAiJHt0aGlzX2JpbmRpciUke2JpbmRpcn19IjsgdGhlbgorICAjIFRoZSBwYXRoIHRvIHRoZSBzY3JpcHQgZG9lc24ndCBlbmQgaW4gdGhlIGJpbmRpciBzZXF1ZW5jZSBmcm9tIEF1dG9jb25mLAorICAjIGFzc3VtZSB0aGF0IHdlIGFyZSBpbiBhIGJ1aWxkIHRyZWUuCisgIGJ1aWxkX2Rpcj1gZGlybmFtZSAke3RoaXNfYmluZGlyfWAKKyAgc3JjX2Rpcj1gY2QgJHt0aGlzX2JpbmRpcn0vQHRvcF9zcmNkaXJAOyBwd2QgLVBgCisKKyAgIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKTogVGhpcyBpcyBhIGRhbmdlcm91cyBkZXBlbmRlbmN5IG9uIGxpYnRvb2wsIHdlCisgICMgc2hvdWxkIHdvcmsgdG8gcmVtb3ZlIGl0LCBhbmQvb3IgcmVtb3ZlIGxpYnRvb2wgYWx0b2dldGhlciwgcmVwbGFjaW5nIGl0CisgICMgd2l0aCBkaXJlY3QgcmVmZXJlbmNlcyB0byB0aGUgbGlicmFyeSBhbmQgYSBsaW5rIHBhdGguCisgIGdtb2NrX2xpYnM9IiR7YnVpbGRfZGlyfS9saWIvbGliZ21vY2subGEiCisgIGdtb2NrX2xkZmxhZ3M9IiIKKworICAjIFdlIHByb3ZpZGUgaG9va3MgdG8gaW5jbHVkZSBmcm9tIGVpdGhlciB0aGUgc291cmNlIG9yIGJ1aWxkIGRpciwgd2hlcmUgdGhlCisgICMgYnVpbGQgZGlyIGlzIGFsd2F5cyBwcmVmZXJyZWQuIFRoaXMgd2lsbCBwb3RlbnRpYWxseSBhbGxvdyB1cyB0byB3cml0ZQorICAjIGJ1aWxkIHJ1bGVzIGZvciBnZW5lcmF0ZWQgaGVhZGVycyBhbmQgaGF2ZSB0aGVtIGF1dG9tYXRpY2FsbHkgYmUgcHJlZmVycmVkCisgICMgb3ZlciBwcm92aWRlZCB2ZXJzaW9ucy4KKyAgZ21vY2tfY3BwZmxhZ3M9Ii1JJHtidWlsZF9kaXJ9L2luY2x1ZGUgLUkke3NyY19kaXJ9L2luY2x1ZGUiCisgIGdtb2NrX2N4eGZsYWdzPSIiCisKKyAgIyBEaXJlY3RseSBpbnZva2UgdGhlIGd0ZXN0LWNvbmZpZyBzY3JpcHQgdXNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuCisgIGd0ZXN0X2NvbmZpZz0iQEdURVNUX0NPTkZJR0AiCitlbHNlCisgICMgV2UncmUgdXNpbmcgYW4gaW5zdGFsbGVkIGdtb2NrLCBhbHRob3VnaCBpdCBtYXkgYmUgc3RhZ2VkIHVuZGVyIHNvbWUKKyAgIyBwcmVmaXguIEFzc3VtZSAoYXMgb3VyIG93biBsaWJyYXJpZXMgZG8pIHRoYXQgd2UgY2FuIHJlc29sdmUgdGhlIHByZWZpeCwKKyAgIyBhbmQgYXJlIHByZXNlbnQgaW4gdGhlIGR5bmFtaWMgbGluayBwYXRocy4KKyAgZ21vY2tfbGRmbGFncz0iLUwke2xpYmRpcn0iCisgIGdtb2NrX2xpYnM9Ii1sJHtuYW1lfSIKKyAgZ21vY2tfY3BwZmxhZ3M9Ii1JJHtpbmNsdWRlZGlyfSIKKyAgZ21vY2tfY3h4ZmxhZ3M9IiIKKworICAjIFdlIGFsc28gcHJlZmVyIGFueSBndGVzdC1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBpbiBvdXIgcHJlZml4LiBMYWNraW5nCisgICMgb25lLCB3ZSBsb29rIGluIHRoZSBQQVRIIGZvciBvbmUuCisgIGd0ZXN0X2NvbmZpZz0iJHtiaW5kaXJ9L2d0ZXN0LWNvbmZpZyIKKyAgaWYgdGVzdCAhIC14ICIke2d0ZXN0X2NvbmZpZ30iOyB0aGVuCisgICAgZ3Rlc3RfY29uZmlnPWB3aGljaCBndGVzdC1jb25maWdgCisgIGZpCitmaQorCisjIEVuc3VyZSB0aGF0IHdlIGhhdmUgbG9jYXRlZCBhIEdvb2dsZSBUZXN0IHRvIGxpbmsgYWdhaW5zdC4KK2lmICEgdGVzdCAteCAiJHtndGVzdF9jb25maWd9IjsgdGhlbgorICBlY2hvICJVbmFibGUgdG8gbG9jYXRlIEdvb2dsZSBUZXN0LCBjaGVjayB5b3VyIEdvb2dsZSBNb2NrIGNvbmZpZ3VyYXRpb24iIFwKKyAgICAgICAiYW5kIGluc3RhbGxhdGlvbiIgPiYyCisgIGV4aXQgMQorZWxpZiAhICIke2d0ZXN0X2NvbmZpZ30iICItLWV4YWN0LXZlcnNpb249QEdURVNUX1ZFUlNJT05AIjsgdGhlbgorICBlY2hvICJUaGUgR29vZ2xlIFRlc3QgZm91bmQgaXMgbm90IHRoZSBzYW1lIHZlcnNpb24gYXMgR29vZ2xlIE1vY2sgd2FzICIgXAorICAgICAgICJidWlsdCBhZ2FpbnN0IiA+JjIKKyAgZXhpdCAxCitmaQorCisjIEFkZCB0aGUgbmVjZXNzYXJ5IEdvb2dsZSBUZXN0IGJpdHMgaW50byB0aGUgdmFyaW91cyBmbGFnIHZhcmlhYmxlcworZ21vY2tfY3BwZmxhZ3M9IiR7Z21vY2tfY3BwZmxhZ3N9IGAke2d0ZXN0X2NvbmZpZ30gLS1jcHBmbGFnc2AiCitnbW9ja19jeHhmbGFncz0iJHtnbW9ja19jeHhmbGFnc30gYCR7Z3Rlc3RfY29uZmlnfSAtLWN4eGZsYWdzYCIKK2dtb2NrX2xkZmxhZ3M9IiR7Z21vY2tfbGRmbGFnc30gYCR7Z3Rlc3RfY29uZmlnfSAtLWxkZmxhZ3NgIgorZ21vY2tfbGlicz0iJHtnbW9ja19saWJzfSBgJHtndGVzdF9jb25maWd9IC0tbGlic2AiCisKKyMgRG8gYW4gaW5zdGFsbGF0aW9uIHF1ZXJ5IGlmIHJlcXVlc3RlZC4KK2lmIHRlc3QgLW4gIiRkb19xdWVyeSI7IHRoZW4KKyAgY2FzZSAkZG9fcXVlcnkgaW4KKyAgICBwcmVmaXgpICAgICAgICAgICBlY2hvICRwcmVmaXg7ICAgICAgIGV4aXQgMDs7CisgICAgZXhlYy1wcmVmaXgpICAgICAgZWNobyAkZXhlY19wcmVmaXg7ICBleGl0IDA7OworICAgIGxpYmRpcikgICAgICAgICAgIGVjaG8gJGxpYmRpcjsgICAgICAgZXhpdCAwOzsKKyAgICBpbmNsdWRlZGlyKSAgICAgICBlY2hvICRpbmNsdWRlZGlyOyAgIGV4aXQgMDs7CisgICAgdmVyc2lvbikgICAgICAgICAgZWNobyAkdmVyc2lvbjsgICAgICBleGl0IDA7OworICAgICopICAgICAgICAgICAgICAgIHNob3dfdXNhZ2U7ICAgICAgICAgZXhpdCAxOzsKKyAgZXNhYworZmkKKworIyBEbyBhIHZlcnNpb24gY2hlY2sgaWYgcmVxdWVzdGVkLgoraWYgdGVzdCAiJGRvX2NoZWNrX3ZlcnNpb25zIiA9ICJ5ZXMiOyB0aGVuCisgICMgTWFrZSBzdXJlIHdlIGRpZG4ndCByZWNlaXZlIGEgYmFkIGNvbWJpbmF0aW9uIG9mIHBhcmFtZXRlcnMuCisgIHRlc3QgIiRlY2hvX2NwcGZsYWdzIiA9ICJ5ZXMiICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCisgIHRlc3QgIiRlY2hvX2N4eGZsYWdzIiA9ICJ5ZXMiICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCisgIHRlc3QgIiRlY2hvX2xkZmxhZ3MiID0gInllcyIgICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCisgIHRlc3QgIiRlY2hvX2xpYnMiID0gInllcyIgICAgICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCisKKyAgaWYgdGVzdCAiJGV4YWN0X3ZlcnNpb24iICE9ICIiOyB0aGVuCisgICAgY2hlY2tfdmVyc2lvbnMgJGV4YWN0X3ZlcnNpb24gJGV4YWN0X3ZlcnNpb24KKyAgICAjIHVucmVhY2hhYmxlCisgIGVsc2UKKyAgICBjaGVja192ZXJzaW9ucyAke21pbl92ZXJzaW9uOi0wLjAuMH0gJHttYXhfdmVyc2lvbjotOTk5OS45OTk5Ljk5OTl9CisgICAgIyB1bnJlYWNoYWJsZQorICBmaQorZmkKKworIyBEbyB0aGUgb3V0cHV0IGluIHRoZSBjb3JyZWN0IG9yZGVyIHNvIHRoYXQgdGhlc2UgY2FuIGJlIHVzZWQgaW4tbGluZSBvZgorIyBhIGNvbXBpbGVyIGludm9jYXRpb24uCitvdXRwdXQ9IiIKK3Rlc3QgIiRlY2hvX2NwcGZsYWdzIiA9ICJ5ZXMiICYmIG91dHB1dD0iJG91dHB1dCAkZ21vY2tfY3BwZmxhZ3MiCit0ZXN0ICIkZWNob19jeHhmbGFncyIgPSAieWVzIiAmJiBvdXRwdXQ9IiRvdXRwdXQgJGdtb2NrX2N4eGZsYWdzIgordGVzdCAiJGVjaG9fbGRmbGFncyIgPSAieWVzIiAgJiYgb3V0cHV0PSIkb3V0cHV0ICRnbW9ja19sZGZsYWdzIgordGVzdCAiJGVjaG9fbGlicyIgPSAieWVzIiAgICAgJiYgb3V0cHV0PSIkb3V0cHV0ICRnbW9ja19saWJzIgorZWNobyAkb3V0cHV0CisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ21vY2tfZG9jdG9yLnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvZ21vY2tfZG9jdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0OTkyYmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc2NyaXB0cy9nbW9ja19kb2N0b3IucHkKQEAgLTAsMCArMSw2NDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnZlcnRzIGNvbXBpbGVyJ3MgZXJyb3JzIGluIGNvZGUgdXNpbmcgR29vZ2xlIE1vY2sgdG8gcGxhaW4gRW5nbGlzaC4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK19WRVJTSU9OID0gJzEuMC4zJworCitfRU1BSUwgPSAnZ29vZ2xlbW9ja0Bnb29nbGVncm91cHMuY29tJworCitfQ09NTU9OX0dNT0NLX1NZTUJPTFMgPSBbCisgICAgIyBNYXRjaGVycworICAgICdfJywKKyAgICAnQScsCisgICAgJ0FkZHJlc3NTYXRpc2ZpZXMnLAorICAgICdBbGxPZicsCisgICAgJ0FuJywKKyAgICAnQW55T2YnLAorICAgICdDb250YWluZXJFcScsCisgICAgJ0NvbnRhaW5zJywKKyAgICAnQ29udGFpbnNSZWdleCcsCisgICAgJ0RvdWJsZUVxJywKKyAgICAnRWxlbWVudHNBcmUnLAorICAgICdFbGVtZW50c0FyZUFycmF5JywKKyAgICAnRW5kc1dpdGgnLAorICAgICdFcScsCisgICAgJ0ZpZWxkJywKKyAgICAnRmxvYXRFcScsCisgICAgJ0dlJywKKyAgICAnR3QnLAorICAgICdIYXNTdWJzdHInLAorICAgICdJc0luaXRpYWxpemVkUHJvdG8nLAorICAgICdMZScsCisgICAgJ0x0JywKKyAgICAnTWF0Y2hlckNhc3QnLAorICAgICdNYXRjaGVzJywKKyAgICAnTWF0Y2hlc1JlZ2V4JywKKyAgICAnTmFuU2Vuc2l0aXZlRG91YmxlRXEnLAorICAgICdOYW5TZW5zaXRpdmVGbG9hdEVxJywKKyAgICAnTmUnLAorICAgICdOb3QnLAorICAgICdOb3ROdWxsJywKKyAgICAnUG9pbnRlZScsCisgICAgJ1Byb3BlcnR5JywKKyAgICAnUmVmJywKKyAgICAnUmVzdWx0T2YnLAorICAgICdTYWZlTWF0Y2hlckNhc3QnLAorICAgICdTdGFydHNXaXRoJywKKyAgICAnU3RyQ2FzZUVxJywKKyAgICAnU3RyQ2FzZU5lJywKKyAgICAnU3RyRXEnLAorICAgICdTdHJOZScsCisgICAgJ1RydWx5JywKKyAgICAnVHlwZWRFcScsCisgICAgJ1ZhbHVlJywKKworICAgICMgQWN0aW9ucworICAgICdBc3NpZ24nLAorICAgICdCeVJlZicsCisgICAgJ0RlbGV0ZUFyZycsCisgICAgJ0RvQWxsJywKKyAgICAnRG9EZWZhdWx0JywKKyAgICAnSWdub3JlUmVzdWx0JywKKyAgICAnSW52b2tlJywKKyAgICAnSW52b2tlQXJndW1lbnQnLAorICAgICdJbnZva2VXaXRob3V0QXJncycsCisgICAgJ1JldHVybicsCisgICAgJ1JldHVybk5ldycsCisgICAgJ1JldHVybk51bGwnLAorICAgICdSZXR1cm5SZWYnLAorICAgICdTYXZlQXJnJywKKyAgICAnU2V0QXJnUmVmZXJlZScsCisgICAgJ1NldEFyZ1BvaW50ZWUnLAorICAgICdTZXRBcmd1bWVudFBvaW50ZWUnLAorICAgICdTZXRBcnJheUFyZ3VtZW50JywKKyAgICAnU2V0RXJybm9BbmRSZXR1cm4nLAorICAgICdUaHJvdycsCisgICAgJ1dpdGhBcmcnLAorICAgICdXaXRoQXJncycsCisgICAgJ1dpdGhvdXRBcmdzJywKKworICAgICMgQ2FyZGluYWxpdGllcworICAgICdBbnlOdW1iZXInLAorICAgICdBdExlYXN0JywKKyAgICAnQXRNb3N0JywKKyAgICAnQmV0d2VlbicsCisgICAgJ0V4YWN0bHknLAorCisgICAgIyBTZXF1ZW5jZXMKKyAgICAnSW5TZXF1ZW5jZScsCisgICAgJ1NlcXVlbmNlJywKKworICAgICMgTWlzYworICAgICdEZWZhdWx0VmFsdWUnLAorICAgICdNb2NrJywKKyAgICBdCisKKyMgUmVnZXggZm9yIG1hdGNoaW5nIHNvdXJjZSBmaWxlIHBhdGggYW5kIGxpbmUgbnVtYmVyIGluIHRoZSBjb21waWxlcidzIGVycm9ycy4KK19HQ0NfRklMRV9MSU5FX1JFID0gcicoP1A8ZmlsZT4uKik6KD9QPGxpbmU+XGQrKTooXGQrOik/XHMrJworX0NMQU5HX0ZJTEVfTElORV9SRSA9IHInKD9QPGZpbGU+LiopOig/UDxsaW5lPlxkKyk6KD9QPGNvbHVtbj5cZCspOlxzKycKK19DTEFOR19OT05fR01PQ0tfRklMRV9MSU5FX1JFID0gKAorICAgIHInKD9QPGZpbGU+LipbL1xcXl0oPyFnbW9jay0pW14vXFxdKyk6KD9QPGxpbmU+XGQrKTooP1A8Y29sdW1uPlxkKyk6XHMrJykKKworCitkZWYgX0ZpbmRBbGxNYXRjaGVzKHJlZ2V4LCBzKToKKyAgIiIiR2VuZXJhdGVzIGFsbCBtYXRjaGVzIG9mIHJlZ2V4IGluIHN0cmluZyBzLiIiIgorCisgIHIgPSByZS5jb21waWxlKHJlZ2V4KQorICByZXR1cm4gci5maW5kaXRlcihzKQorCisKK2RlZiBfR2VuZXJpY0RpYWdub3NlcihzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRpYWdub3NlcywgbXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBnaXZlbiBkaXNlYXNlIGJ5IHBhdHRlcm4gbWF0Y2hpbmcuCisKKyAgQ2FuIHByb3ZpZGUgZGlmZmVyZW50IGRpYWdub3NlcyBmb3IgZGlmZmVyZW50IHBhdHRlcm5zLgorCisgIEFyZ3M6CisgICAgc2hvcnRfbmFtZTogU2hvcnQgbmFtZSBvZiB0aGUgZGlzZWFzZS4KKyAgICBsb25nX25hbWU6ICBMb25nIG5hbWUgb2YgdGhlIGRpc2Vhc2UuCisgICAgZGlhZ25vc2VzOiAgQSBsaXN0IG9mIHBhaXJzIChyZWdleCwgcGF0dGVybiBmb3IgZm9ybWF0dGluZyB0aGUgZGlhZ25vc2lzCisgICAgICAgICAgICAgICAgZm9yIG1hdGNoaW5nIHJlZ2V4KS4KKyAgICBtc2c6ICAgICAgICBDb21waWxlcidzIGVycm9yIG1lc3NhZ2VzLgorICBZaWVsZHM6CisgICAgVHVwbGVzIG9mIHRoZSBmb3JtCisgICAgICAoc2hvcnQgbmFtZSBvZiBkaXNlYXNlLCBsb25nIG5hbWUgb2YgZGlzZWFzZSwgZGlhZ25vc2lzKS4KKyAgIiIiCisgIGZvciByZWdleCwgZGlhZ25vc2lzIGluIGRpYWdub3NlczoKKyAgICBpZiByZS5zZWFyY2gocmVnZXgsIG1zZyk6CisgICAgICBkaWFnbm9zaXMgPSAnJShmaWxlKXM6JShsaW5lKXM6JyArIGRpYWdub3NpcworICAgICAgZm9yIG0gaW4gX0ZpbmRBbGxNYXRjaGVzKHJlZ2V4LCBtc2cpOgorICAgICAgICB5aWVsZCAoc2hvcnRfbmFtZSwgbG9uZ19uYW1lLCBkaWFnbm9zaXMgJSBtLmdyb3VwZGljdCgpKQorCisKK2RlZiBfTmVlZFRvUmV0dXJuUmVmZXJlbmNlRGlhZ25vc2VyKG1zZyk6CisgICIiIkRpYWdub3NlcyB0aGUgTlJSIGRpc2Vhc2UsIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlcyBieSB0aGUgY29tcGlsZXIuIiIiCisKKyAgZ2NjX3JlZ2V4ID0gKHInSW4gbWVtYmVyIGZ1bmN0aW9uIFwndGVzdGluZzo6aW50ZXJuYWw6OlJldHVybkFjdGlvbjxSPi4qXG4nCisgICAgICAgICAgICAgICArIF9HQ0NfRklMRV9MSU5FX1JFICsgcidpbnN0YW50aWF0ZWQgZnJvbSBoZXJlXG4nCisgICAgICAgICAgICAgICByJy4qZ21vY2stYWN0aW9uc1wuaC4qZXJyb3I6IGNyZWF0aW5nIGFycmF5IHdpdGggbmVnYXRpdmUgc2l6ZScpCisgIGNsYW5nX3JlZ2V4ID0gKHInZXJyb3I6LiphcnJheS4qbmVnYXRpdmUuKlxyP1xuJworICAgICAgICAgICAgICAgICByJyguKlxuKSo/JyArCisgICAgICAgICAgICAgICAgIF9DTEFOR19OT05fR01PQ0tfRklMRV9MSU5FX1JFICsKKyAgICAgICAgICAgICAgICAgcidub3RlOiBpbiBpbnN0YW50aWF0aW9uIG9mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICcKKyAgICAgICAgICAgICAgICAgcidcJ3Rlc3Rpbmc6OmludGVybmFsOjpSZXR1cm5BY3Rpb248KD9QPHR5cGU+LiopPicKKyAgICAgICAgICAgICAgICAgcic6Om9wZXJhdG9yIEFjdGlvbjwuKj5cJyByZXF1ZXN0ZWQgaGVyZScpCisgIGNsYW5nMTFfcmUgPSAocid1c2VfUmV0dXJuUmVmX2luc3RlYWRfb2ZfUmV0dXJuX3RvX3JldHVybl9hX3JlZmVyZW5jZS4qJworICAgICAgICAgICAgICAgIHInKC4qXG4pKj8nICsgX0NMQU5HX05PTl9HTU9DS19GSUxFX0xJTkVfUkUpCisKKyAgZGlhZ25vc2lzID0gIiIiCitZb3UgYXJlIHVzaW5nIGEgUmV0dXJuKCkgYWN0aW9uIGluIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvCislKHR5cGUpcy4gIFBsZWFzZSB1c2UgUmV0dXJuUmVmKCkgaW5zdGVhZC4iIiIKKyAgcmV0dXJuIF9HZW5lcmljRGlhZ25vc2VyKCdOUlInLCAnTmVlZCB0byBSZXR1cm4gUmVmZXJlbmNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2xhbmdfcmVnZXgsIGRpYWdub3NpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYW5nMTFfcmUsIGRpYWdub3NpcyAlIHsndHlwZSc6ICdhIHR5cGUnfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjY19yZWdleCwgZGlhZ25vc2lzICUgeyd0eXBlJzogJ2EgdHlwZSd9KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpCisKKworZGVmIF9OZWVkVG9SZXR1cm5Tb21ldGhpbmdEaWFnbm9zZXIobXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBOUlMgZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKKworICBnY2NfcmVnZXggPSAoX0dDQ19GSUxFX0xJTkVfUkUgKyByJyhpbnN0YW50aWF0ZWQgZnJvbSBoZXJlXG4uJworICAgICAgICAgICAgICAgcicqZ21vY2suKmFjdGlvbnNcLmguKmVycm9yOiB2b2lkIHZhbHVlIG5vdCBpZ25vcmVkKScKKyAgICAgICAgICAgICAgIHInfChlcnJvcjogY29udHJvbCByZWFjaGVzIGVuZCBvZiBub24tdm9pZCBmdW5jdGlvbiknKQorICBjbGFuZ19yZWdleDEgPSAoX0NMQU5HX0ZJTEVfTElORV9SRSArCisgICAgICAgICAgICAgICAgICByJ2Vycm9yOiBjYW5ub3QgaW5pdGlhbGl6ZSByZXR1cm4gb2JqZWN0ICcKKyAgICAgICAgICAgICAgICAgIHInb2YgdHlwZSBcJ1Jlc3VsdFwnIFwoYWthIFwnKD9QPHJldHVybl90eXBlPi4qKVwnXCkgJworICAgICAgICAgICAgICAgICAgcid3aXRoIGFuIHJ2YWx1ZSBvZiB0eXBlIFwndm9pZFwnJykKKyAgY2xhbmdfcmVnZXgyID0gKF9DTEFOR19GSUxFX0xJTkVfUkUgKworICAgICAgICAgICAgICAgICAgcidlcnJvcjogY2Fubm90IGluaXRpYWxpemUgcmV0dXJuIG9iamVjdCAnCisgICAgICAgICAgICAgICAgICByJ29mIHR5cGUgXCcoP1A8cmV0dXJuX3R5cGU+LiopXCcgJworICAgICAgICAgICAgICAgICAgcid3aXRoIGFuIHJ2YWx1ZSBvZiB0eXBlIFwndm9pZFwnJykKKyAgZGlhZ25vc2lzID0gIiIiCitZb3UgYXJlIHVzaW5nIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgdm9pZCwgYnV0IGl0IG5lZWRzIHRvIHJldHVybgorJShyZXR1cm5fdHlwZSlzLiAgUGxlYXNlIHRlbGwgaXQgKndoYXQqIHRvIHJldHVybi4gIFBlcmhhcHMgeW91IGNhbiB1c2UKK3RoZSBwYXR0ZXJuIERvQWxsKHNvbWVfYWN0aW9uLCBSZXR1cm4oc29tZV92YWx1ZSkpPyIiIgorICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoCisgICAgICAnTlJTJywKKyAgICAgICdOZWVkIHRvIFJldHVybiBTb21ldGhpbmcnLAorICAgICAgWyhnY2NfcmVnZXgsIGRpYWdub3NpcyAlIHsncmV0dXJuX3R5cGUnOiAnKnNvbWV0aGluZyonfSksCisgICAgICAgKGNsYW5nX3JlZ2V4MSwgZGlhZ25vc2lzKSwKKyAgICAgICAoY2xhbmdfcmVnZXgyLCBkaWFnbm9zaXMpXSwKKyAgICAgIG1zZykKKworCitkZWYgX05lZWRUb1JldHVybk5vdGhpbmdEaWFnbm9zZXIobXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBOUk4gZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKKworICBnY2NfcmVnZXggPSAoX0dDQ19GSUxFX0xJTkVfUkUgKyByJ2luc3RhbnRpYXRlZCBmcm9tIGhlcmVcbicKKyAgICAgICAgICAgICAgIHInLipnbW9jay1hY3Rpb25zXC5oLiplcnJvcjogaW5zdGFudGlhdGlvbiBvZiAnCisgICAgICAgICAgICAgICByJ1wndGVzdGluZzo6aW50ZXJuYWw6OlJldHVybkFjdGlvbjxSPjo6SW1wbDxGPjo6dmFsdWVfXCcgJworICAgICAgICAgICAgICAgcidhcyB0eXBlIFwndm9pZFwnJykKKyAgY2xhbmdfcmVnZXgxID0gKHInZXJyb3I6IGZpZWxkIGhhcyBpbmNvbXBsZXRlIHR5cGUgJworICAgICAgICAgICAgICAgICAgcidcJ1Jlc3VsdFwnIFwoYWthIFwndm9pZFwnXCkoXHIpP1xuJworICAgICAgICAgICAgICAgICAgcicoLipcbikqPycgKworICAgICAgICAgICAgICAgICAgX0NMQU5HX05PTl9HTU9DS19GSUxFX0xJTkVfUkUgKyByJ25vdGU6IGluIGluc3RhbnRpYXRpb24gJworICAgICAgICAgICAgICAgICAgcidvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAnCisgICAgICAgICAgICAgICAgICByJ1wndGVzdGluZzo6aW50ZXJuYWw6OlJldHVybkFjdGlvbjwoP1A8cmV0dXJuX3R5cGU+LiopPicKKyAgICAgICAgICAgICAgICAgIHInOjpvcGVyYXRvciBBY3Rpb248dm9pZCBcKC4qXCk+XCcgcmVxdWVzdGVkIGhlcmUnKQorICBjbGFuZ19yZWdleDIgPSAocidlcnJvcjogZmllbGQgaGFzIGluY29tcGxldGUgdHlwZSAnCisgICAgICAgICAgICAgICAgICByJ1wnUmVzdWx0XCcgXChha2EgXCd2b2lkXCdcKShccik/XG4nCisgICAgICAgICAgICAgICAgICByJyguKlxuKSo/JyArCisgICAgICAgICAgICAgICAgICBfQ0xBTkdfTk9OX0dNT0NLX0ZJTEVfTElORV9SRSArIHInbm90ZTogaW4gaW5zdGFudGlhdGlvbiAnCisgICAgICAgICAgICAgICAgICByJ29mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICcKKyAgICAgICAgICAgICAgICAgIHInXCd0ZXN0aW5nOjppbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPC4qPicKKyAgICAgICAgICAgICAgICAgIHInOjpvcGVyYXRvciBBY3Rpb248KD9QPHJldHVybl90eXBlPi4qKSBcKC4qXCk+XCcgJworICAgICAgICAgICAgICAgICAgcidyZXF1ZXN0ZWQgaGVyZScpCisgIGRpYWdub3NpcyA9ICIiIgorWW91IGFyZSB1c2luZyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zICUocmV0dXJuX3R5cGUpcywgYnV0IGl0IG5lZWRzIHRvIHJldHVybgordm9pZC4gIFBsZWFzZSB1c2UgYSB2b2lkLXJldHVybmluZyBhY3Rpb24gaW5zdGVhZC4KKworQWxsIGFjdGlvbnMgYnV0IHRoZSBsYXN0IGluIERvQWxsKC4uLikgbXVzdCByZXR1cm4gdm9pZC4gIFBlcmhhcHMgeW91IG5lZWQKK3RvIHJlLWFycmFuZ2UgdGhlIG9yZGVyIG9mIGFjdGlvbnMgaW4gYSBEb0FsbCgpLCBpZiB5b3UgYXJlIHVzaW5nIG9uZT8iIiIKKyAgcmV0dXJuIF9HZW5lcmljRGlhZ25vc2VyKAorICAgICAgJ05STicsCisgICAgICAnTmVlZCB0byBSZXR1cm4gTm90aGluZycsCisgICAgICBbKGdjY19yZWdleCwgZGlhZ25vc2lzICUgeydyZXR1cm5fdHlwZSc6ICcqc29tZXRoaW5nKid9KSwKKyAgICAgICAoY2xhbmdfcmVnZXgxLCBkaWFnbm9zaXMpLAorICAgICAgIChjbGFuZ19yZWdleDIsIGRpYWdub3NpcyldLAorICAgICAgbXNnKQorCisKK2RlZiBfSW5jb21wbGV0ZUJ5UmVmZXJlbmNlQXJndW1lbnREaWFnbm9zZXIobXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBJQlJBIGRpc2Vhc2UsIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlcyBieSB0aGUgY29tcGlsZXIuIiIiCisKKyAgZ2NjX3JlZ2V4ID0gKF9HQ0NfRklMRV9MSU5FX1JFICsgcidpbnN0YW50aWF0ZWQgZnJvbSBoZXJlXG4nCisgICAgICAgICAgICAgICByJy4qZ3Rlc3QtcHJpbnRlcnNcLmguKmVycm9yOiBpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICcKKyAgICAgICAgICAgICAgIHInXCdzaXplb2ZcJyB0byBpbmNvbXBsZXRlIHR5cGUgXCcoP1A8dHlwZT4uKilcJycpCisKKyAgY2xhbmdfcmVnZXggPSAocicuKmd0ZXN0LXByaW50ZXJzXC5oLiplcnJvcjogaW52YWxpZCBhcHBsaWNhdGlvbiBvZiAnCisgICAgICAgICAgICAgICAgIHInXCdzaXplb2ZcJyB0byBhbiBpbmNvbXBsZXRlIHR5cGUgJworICAgICAgICAgICAgICAgICByJ1wnKD9QPHR5cGU+LiopKCBjb25zdCk/XCdccj9cbicKKyAgICAgICAgICAgICAgICAgcicoLipcbikqPycgKworICAgICAgICAgICAgICAgICBfQ0xBTkdfTk9OX0dNT0NLX0ZJTEVfTElORV9SRSArCisgICAgICAgICAgICAgICAgIHInbm90ZTogaW4gaW5zdGFudGlhdGlvbiBvZiBtZW1iZXIgZnVuY3Rpb24gJworICAgICAgICAgICAgICAgICByJ1wndGVzdGluZzo6aW50ZXJuYWwyOjpUeXBlV2l0aG91dEZvcm1hdHRlcjwuKj46OicKKyAgICAgICAgICAgICAgICAgcidQcmludFZhbHVlXCcgcmVxdWVzdGVkIGhlcmUnKQorICBkaWFnbm9zaXMgPSAiIiIKK0luIG9yZGVyIHRvIG1vY2sgdGhpcyBmdW5jdGlvbiwgR29vZ2xlIE1vY2sgbmVlZHMgdG8gc2VlIHRoZSBkZWZpbml0aW9uCitvZiB0eXBlICIlKHR5cGUpcyIgLSBkZWNsYXJhdGlvbiBhbG9uZSBpcyBub3QgZW5vdWdoLiAgRWl0aGVyICNpbmNsdWRlCit0aGUgaGVhZGVyIHRoYXQgZGVmaW5lcyBpdCwgb3IgY2hhbmdlIHRoZSBhcmd1bWVudCB0byBiZSBwYXNzZWQKK2J5IHBvaW50ZXIuIiIiCisKKyAgcmV0dXJuIF9HZW5lcmljRGlhZ25vc2VyKCdJQlJBJywgJ0luY29tcGxldGUgQnktUmVmZXJlbmNlIEFyZ3VtZW50IFR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhnY2NfcmVnZXgsIGRpYWdub3NpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYW5nX3JlZ2V4LCBkaWFnbm9zaXMpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZykKKworCitkZWYgX092ZXJsb2FkZWRGdW5jdGlvbk1hdGNoZXJEaWFnbm9zZXIobXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBPRk0gZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKKworICBnY2NfcmVnZXggPSAoX0dDQ19GSUxFX0xJTkVfUkUgKyByJ2Vycm9yOiBubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgJworICAgICAgICAgICAgICAgcidjYWxsIHRvIFwnVHJ1bHlcKDx1bnJlc29sdmVkIG92ZXJsb2FkZWQgZnVuY3Rpb24gdHlwZT5cKScpCisgIGNsYW5nX3JlZ2V4ID0gKF9DTEFOR19GSUxFX0xJTkVfUkUgKyByJ2Vycm9yOiBubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgJworICAgICAgICAgICAgICAgICByJ2NhbGwgdG8gXCdUcnVseScpCisgIGRpYWdub3NpcyA9ICIiIgorVGhlIGFyZ3VtZW50IHlvdSBnYXZlIHRvIFRydWx5KCkgaXMgYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbi4gIFBsZWFzZSB0ZWxsCit5b3VyIGNvbXBpbGVyIHdoaWNoIG92ZXJsb2FkZWQgdmVyc2lvbiB5b3Ugd2FudCB0byB1c2UuCisKK0ZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHZlcnNpb24gd2hvc2Ugc2lnbmF0dXJlIGlzCisgIGJvb2wgRm9vKGludCBuKTsKK3lvdSBzaG91bGQgd3JpdGUKKyAgVHJ1bHkoc3RhdGljX2Nhc3Q8Ym9vbCAoKikoaW50IG4pPihGb28pKSIiIgorICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoJ09GTScsICdPdmVybG9hZGVkIEZ1bmN0aW9uIE1hdGNoZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhnY2NfcmVnZXgsIGRpYWdub3NpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYW5nX3JlZ2V4LCBkaWFnbm9zaXMpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZykKKworCitkZWYgX092ZXJsb2FkZWRGdW5jdGlvbkFjdGlvbkRpYWdub3Nlcihtc2cpOgorICAiIiJEaWFnbm9zZXMgdGhlIE9GQSBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgorCisgIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IG5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBjYWxsIHRvICcKKyAgICAgICAgICAgICAgIHInXCdJbnZva2VcKDx1bnJlc29sdmVkIG92ZXJsb2FkZWQgZnVuY3Rpb24gdHlwZT4nKQorICBjbGFuZ19yZWdleCA9IChfQ0xBTkdfRklMRV9MSU5FX1JFICsgcidlcnJvcjogbm8gbWF0Y2hpbmcgJworICAgICAgICAgICAgICAgICByJ2Z1bmN0aW9uIGZvciBjYWxsIHRvIFwnSW52b2tlXCdccj9cbicKKyAgICAgICAgICAgICAgICAgcicoLipcbikqPycKKyAgICAgICAgICAgICAgICAgcicuKlxiZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnNcLmg6XGQrOlxkKzpccysnCisgICAgICAgICAgICAgICAgIHInbm90ZTogY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6XHMrJworICAgICAgICAgICAgICAgICByJ2NvdWxkblwndCBpbmZlciB0ZW1wbGF0ZSBhcmd1bWVudCBcJ0Z1bmN0aW9uSW1wbFwnJykKKyAgZGlhZ25vc2lzID0gIiIiCitGdW5jdGlvbiB5b3UgYXJlIHBhc3NpbmcgdG8gSW52b2tlIGlzIG92ZXJsb2FkZWQuICBQbGVhc2UgdGVsbCB5b3VyIGNvbXBpbGVyCit3aGljaCBvdmVybG9hZGVkIHZlcnNpb24geW91IHdhbnQgdG8gdXNlLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSB2ZXJzaW9uIHdob3NlIHNpZ25hdHVyZSBpcworICBib29sIE15RnVuY3Rpb24oaW50IG4sIGRvdWJsZSB4KTsKK3lvdSBzaG91bGQgd3JpdGUgc29tZXRoaW5nIGxpa2UKKyAgSW52b2tlKHN0YXRpY19jYXN0PGJvb2wgKCopKGludCBuLCBkb3VibGUgeCk+KE15RnVuY3Rpb24pKSIiIgorICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoJ09GQScsICdPdmVybG9hZGVkIEZ1bmN0aW9uIEFjdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGdjY19yZWdleCwgZGlhZ25vc2lzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhbmdfcmVnZXgsIGRpYWdub3NpcyldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKQorCisKK2RlZiBfT3ZlcmxvYWRlZE1ldGhvZEFjdGlvbkRpYWdub3Nlcihtc2cpOgorICAiIiJEaWFnbm9zZXMgdGhlIE9NQSBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgorCisgIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IG5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciAnCisgICAgICAgICAgICAgICByJ2NhbGwgdG8gXCdJbnZva2VcKC4rLCA8dW5yZXNvbHZlZCBvdmVybG9hZGVkIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAgIHIndHlwZT5cKScpCisgIGNsYW5nX3JlZ2V4ID0gKF9DTEFOR19GSUxFX0xJTkVfUkUgKyByJ2Vycm9yOiBubyBtYXRjaGluZyBmdW5jdGlvbiAnCisgICAgICAgICAgICAgICAgIHInZm9yIGNhbGwgdG8gXCdJbnZva2VcJ1xyP1xuJworICAgICAgICAgICAgICAgICByJyguKlxuKSo/JworICAgICAgICAgICAgICAgICByJy4qXGJnbW9jay1nZW5lcmF0ZWQtYWN0aW9uc1wuaDpcZCs6XGQrOiAnCisgICAgICAgICAgICAgICAgIHInbm90ZTogY2FuZGlkYXRlIGZ1bmN0aW9uIHRlbXBsYXRlIG5vdCB2aWFibGU6ICcKKyAgICAgICAgICAgICAgICAgcidyZXF1aXJlcyAuKiwgYnV0IDIgKGFyZ3VtZW50cyApP3dlcmUgcHJvdmlkZWQnKQorICBkaWFnbm9zaXMgPSAiIiIKK1RoZSBzZWNvbmQgYXJndW1lbnQgeW91IGdhdmUgdG8gSW52b2tlKCkgaXMgYW4gb3ZlcmxvYWRlZCBtZXRob2QuICBQbGVhc2UKK3RlbGwgeW91ciBjb21waWxlciB3aGljaCBvdmVybG9hZGVkIHZlcnNpb24geW91IHdhbnQgdG8gdXNlLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSB2ZXJzaW9uIHdob3NlIHNpZ25hdHVyZSBpcworICBjbGFzcyBGb28geworICAgIC4uLgorICAgIGJvb2wgQmFyKGludCBuLCBkb3VibGUgeCk7CisgIH07Cit5b3Ugc2hvdWxkIHdyaXRlIHNvbWV0aGluZyBsaWtlCisgIEludm9rZShmb28sIHN0YXRpY19jYXN0PGJvb2wgKEZvbzo6KikoaW50IG4sIGRvdWJsZSB4KT4oJkZvbzo6QmFyKSkiIiIKKyAgcmV0dXJuIF9HZW5lcmljRGlhZ25vc2VyKCdPTUEnLCAnT3ZlcmxvYWRlZCBNZXRob2QgQWN0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZ2NjX3JlZ2V4LCBkaWFnbm9zaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFuZ19yZWdleCwgZGlhZ25vc2lzKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpCisKKworZGVmIF9Nb2NrT2JqZWN0UG9pbnRlckRpYWdub3Nlcihtc2cpOgorICAiIiJEaWFnbm9zZXMgdGhlIE1PUCBkaXNlYXNlLCBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYnkgdGhlIGNvbXBpbGVyLiIiIgorCisgIGdjY19yZWdleCA9IChfR0NDX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IHJlcXVlc3QgZm9yIG1lbWJlciAnCisgICAgICAgICAgICAgICByJ1wnZ21vY2tfKD9QPG1ldGhvZD4uKylcJyBpbiBcJyg/UDxtb2NrX29iamVjdD4uKylcJywgJworICAgICAgICAgICAgICAgcid3aGljaCBpcyBvZiBub24tY2xhc3MgdHlwZSBcJyguKjo6KSooP1A8Y2xhc3NfbmFtZT4uKylcKlwnJykKKyAgY2xhbmdfcmVnZXggPSAoX0NMQU5HX0ZJTEVfTElORV9SRSArIHInZXJyb3I6IG1lbWJlciByZWZlcmVuY2UgdHlwZSAnCisgICAgICAgICAgICAgICAgIHInXCcoP1A8Y2xhc3NfbmFtZT4uKj8pICpcJyBpcyBhIHBvaW50ZXI7ICcKKyAgICAgICAgICAgICAgICAgcicoZGlkIHlvdSBtZWFufG1heWJlIHlvdSBtZWFudCkgdG8gdXNlIFwnLT5cJ1w/JykKKyAgZGlhZ25vc2lzID0gIiIiCitUaGUgZmlyc3QgYXJndW1lbnQgdG8gT05fQ0FMTCgpIGFuZCBFWFBFQ1RfQ0FMTCgpIG11c3QgYmUgYSBtb2NrICpvYmplY3QqLAorbm90IGEgKnBvaW50ZXIqIHRvIGl0LiAgUGxlYXNlIHdyaXRlICcqKCUobW9ja19vYmplY3QpcyknIGluc3RlYWQgb2YKKyclKG1vY2tfb2JqZWN0KXMnIGFzIHlvdXIgZmlyc3QgYXJndW1lbnQuCisKK0ZvciBleGFtcGxlLCBnaXZlbiB0aGUgbW9jayBjbGFzczoKKworICBjbGFzcyAlKGNsYXNzX25hbWUpcyA6IHB1YmxpYyAuLi4geworICAgIC4uLgorICAgIE1PQ0tfTUVUSE9EMCglKG1ldGhvZClzLCAuLi4pOworICB9OworCithbmQgdGhlIGZvbGxvd2luZyBtb2NrIGluc3RhbmNlOgorCisgICUoY2xhc3NfbmFtZSlzKiBtb2NrX3B0ciA9IC4uLgorCit5b3Ugc2hvdWxkIHVzZSB0aGUgRVhQRUNUX0NBTEwgbGlrZSB0aGlzOgorCisgIEVYUEVDVF9DQUxMKCptb2NrX3B0ciwgJShtZXRob2QpcyguLi4pKTsiIiIKKworICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoCisgICAgICAnTU9QJywKKyAgICAgICdNb2NrIE9iamVjdCBQb2ludGVyJywKKyAgICAgIFsoZ2NjX3JlZ2V4LCBkaWFnbm9zaXMpLAorICAgICAgIChjbGFuZ19yZWdleCwgZGlhZ25vc2lzICUgeydtb2NrX29iamVjdCc6ICdtb2NrX29iamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21ldGhvZCc6ICdtZXRob2QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGFzc19uYW1lJzogJyUoY2xhc3NfbmFtZSlzJ30pXSwKKyAgICAgICBtc2cpCisKKworZGVmIF9OZWVkVG9Vc2VTeW1ib2xEaWFnbm9zZXIobXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBOVVMgZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKKworICBnY2NfcmVnZXggPSAoX0dDQ19GSUxFX0xJTkVfUkUgKyByJ2Vycm9yOiBcJyg/UDxzeW1ib2w+LispXCcgJworICAgICAgICAgICAgICAgcicod2FzIG5vdCBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlfGhhcyBub3QgYmVlbiBkZWNsYXJlZCknKQorICBjbGFuZ19yZWdleCA9IChfQ0xBTkdfRklMRV9MSU5FX1JFICsKKyAgICAgICAgICAgICAgICAgcidlcnJvcjogKHVzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXJ8dW5rbm93biB0eXBlIG5hbWV8JworICAgICAgICAgICAgICAgICByJ25vIHRlbXBsYXRlIG5hbWVkKSBcJyg/UDxzeW1ib2w+W15cJ10rKVwnJykKKyAgZGlhZ25vc2lzID0gIiIiCisnJShzeW1ib2wpcycgaXMgZGVmaW5lZCBieSBHb29nbGUgTW9jayBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2UuCitEaWQgeW91IGZvcmdldCB0byB3cml0ZQorICB1c2luZyB0ZXN0aW5nOjolKHN5bWJvbClzOworPyIiIgorICBmb3IgbSBpbiAobGlzdChfRmluZEFsbE1hdGNoZXMoZ2NjX3JlZ2V4LCBtc2cpKSArCisgICAgICAgICAgICBsaXN0KF9GaW5kQWxsTWF0Y2hlcyhjbGFuZ19yZWdleCwgbXNnKSkpOgorICAgIHN5bWJvbCA9IG0uZ3JvdXBkaWN0KClbJ3N5bWJvbCddCisgICAgaWYgc3ltYm9sIGluIF9DT01NT05fR01PQ0tfU1lNQk9MUzoKKyAgICAgIHlpZWxkICgnTlVTJywgJ05lZWQgdG8gVXNlIFN5bWJvbCcsIGRpYWdub3NpcyAlIG0uZ3JvdXBkaWN0KCkpCisKKworZGVmIF9OZWVkVG9Vc2VSZXR1cm5OdWxsRGlhZ25vc2VyKG1zZyk6CisgICIiIkRpYWdub3NlcyB0aGUgTlJOVUxMIGRpc2Vhc2UsIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlcyBieSB0aGUgY29tcGlsZXIuIiIiCisKKyAgZ2NjX3JlZ2V4ID0gKCdpbnN0YW50aWF0ZWQgZnJvbSBcJ3Rlc3Rpbmc6OmludGVybmFsOjpSZXR1cm5BY3Rpb248Uj4nCisgICAgICAgICAgICAgICAnOjpvcGVyYXRvciB0ZXN0aW5nOjpBY3Rpb248RnVuYz5cKFwpIGNvbnN0LipcbicgKworICAgICAgICAgICAgICAgX0dDQ19GSUxFX0xJTkVfUkUgKyByJ2luc3RhbnRpYXRlZCBmcm9tIGhlcmVcbicKKyAgICAgICAgICAgICAgIHInLiplcnJvcjogbm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGNhbGwgdG8gXCdJbXBsaWNpdENhc3RfXCgnCisgICAgICAgICAgICAgICByJyg6P2xvbmcgKT9pbnQmXCknKQorICBjbGFuZ19yZWdleCA9IChyJ1xiZ21vY2stYWN0aW9ucy5oOi4qIGVycm9yOiBubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgJworICAgICAgICAgICAgICAgICByJ2NhbGwgdG8gXCdJbXBsaWNpdENhc3RfXCdccj9cbicKKyAgICAgICAgICAgICAgICAgcicoLipcbikqPycgKworICAgICAgICAgICAgICAgICBfQ0xBTkdfTk9OX0dNT0NLX0ZJTEVfTElORV9SRSArIHInbm90ZTogaW4gaW5zdGFudGlhdGlvbiAnCisgICAgICAgICAgICAgICAgIHInb2YgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gJworICAgICAgICAgICAgICAgICByJ1wndGVzdGluZzo6aW50ZXJuYWw6OlJldHVybkFjdGlvbjwoaW50fGxvbmcpPjo6b3BlcmF0b3IgJworICAgICAgICAgICAgICAgICByJ0FjdGlvbjwoP1A8dHlwZT4uKilcKFwpPlwnIHJlcXVlc3RlZCBoZXJlJykKKyAgZGlhZ25vc2lzID0gIiIiCitZb3UgYXJlIHByb2JhYmx5IGNhbGxpbmcgUmV0dXJuKE5VTEwpIGFuZCB0aGUgY29tcGlsZXIgaXNuJ3Qgc3VyZSBob3cgdG8gdHVybgorTlVMTCBpbnRvICUodHlwZSlzLiBVc2UgUmV0dXJuTnVsbCgpIGluc3RlYWQuCitOb3RlOiB0aGUgbGluZSBudW1iZXIgbWF5IGJlIG9mZjsgcGxlYXNlIGZpeCBhbGwgaW5zdGFuY2VzIG9mIFJldHVybihOVUxMKS4iIiIKKyAgcmV0dXJuIF9HZW5lcmljRGlhZ25vc2VyKAorICAgICAgJ05STlVMTCcsICdOZWVkIHRvIHVzZSBSZXR1cm5OdWxsJywKKyAgICAgIFsoY2xhbmdfcmVnZXgsIGRpYWdub3NpcyksCisgICAgICAgKGdjY19yZWdleCwgZGlhZ25vc2lzICUgeyd0eXBlJzogJ3RoZSByaWdodCB0eXBlJ30pXSwKKyAgICAgIG1zZykKKworCitkZWYgX1R5cGVJblRlbXBsYXRlZEJhc2VEaWFnbm9zZXIobXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBUVEIgZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKKworICAjIFRoaXMgdmVyc2lvbiB3b3JrcyB3aGVuIHRoZSB0eXBlIGlzIHVzZWQgYXMgdGhlIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4KKyAgIyB0eXBlLgorICBnY2NfNF8zXzFfcmVnZXhfdHlwZV9pbl9yZXR2YWwgPSAoCisgICAgICByJ0luIG1lbWJlciBmdW5jdGlvbiBcJ2ludCAuKlxuJyArIF9HQ0NfRklMRV9MSU5FX1JFICsKKyAgICAgIHInZXJyb3I6IGEgZnVuY3Rpb24gY2FsbCBjYW5ub3QgYXBwZWFyIGluIGEgY29uc3RhbnQtZXhwcmVzc2lvbicpCisgIGdjY180XzRfMF9yZWdleF90eXBlX2luX3JldHZhbCA9ICgKKyAgICAgIHInZXJyb3I6IGEgZnVuY3Rpb24gY2FsbCBjYW5ub3QgYXBwZWFyIGluIGEgY29uc3RhbnQtZXhwcmVzc2lvbicKKyAgICAgICsgX0dDQ19GSUxFX0xJTkVfUkUgKyByJ2Vycm9yOiB0ZW1wbGF0ZSBhcmd1bWVudCAxIGlzIGludmFsaWRcbicpCisgICMgVGhpcyB2ZXJzaW9uIHdvcmtzIHdoZW4gdGhlIHR5cGUgaXMgdXNlZCBhcyB0aGUgbW9jayBmdW5jdGlvbidzIHNvbGUKKyAgIyBwYXJhbWV0ZXIgdHlwZS4KKyAgZ2NjX3JlZ2V4X3R5cGVfb2Zfc29sZV9wYXJhbSA9ICgKKyAgICAgIF9HQ0NfRklMRV9MSU5FX1JFICsKKyAgICAgIHInZXJyb3I6IFwnKD9QPHR5cGU+LispXCcgd2FzIG5vdCBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlXG4nCisgICAgICByJy4qZXJyb3I6IHRlbXBsYXRlIGFyZ3VtZW50IDEgaXMgaW52YWxpZFxuJykKKyAgIyBUaGlzIHZlcnNpb24gd29ya3Mgd2hlbiB0aGUgdHlwZSBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIG9mIGEgbW9jaworICAjIGZ1bmN0aW9uIHRoYXQgaGFzIG11bHRpcGxlIHBhcmFtZXRlcnMuCisgIGdjY19yZWdleF90eXBlX29mX2FfcGFyYW0gPSAoCisgICAgICByJ2Vycm9yOiBleHBlY3RlZCBgO1wnIGJlZm9yZSBcJzo6XCcgdG9rZW5cbicKKyAgICAgICsgX0dDQ19GSUxFX0xJTkVfUkUgKworICAgICAgcidlcnJvcjogXCcoP1A8dHlwZT4uKylcJyB3YXMgbm90IGRlY2xhcmVkIGluIHRoaXMgc2NvcGVcbicKKyAgICAgIHInLiplcnJvcjogdGVtcGxhdGUgYXJndW1lbnQgMSBpcyBpbnZhbGlkXG4nCisgICAgICByJy4qZXJyb3I6IFwnLitcJyB3YXMgbm90IGRlY2xhcmVkIGluIHRoaXMgc2NvcGUnKQorICBjbGFuZ19yZWdleF90eXBlX29mX3JldHZhbF9vcl9zb2xlX3BhcmFtID0gKAorICAgICAgX0NMQU5HX0ZJTEVfTElORV9SRSArCisgICAgICByJ2Vycm9yOiB1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyIFwnKD9QPHR5cGU+LiopXCdcbicKKyAgICAgIHInKC4qXG4pKj8nCisgICAgICByJyg/UD1maWxlKTooP1A9bGluZSk6XGQrOiBlcnJvcjogJworICAgICAgcidub24tZnJpZW5kIGNsYXNzIG1lbWJlciBcJ1Jlc3VsdFwnIGNhbm5vdCBoYXZlIGEgcXVhbGlmaWVkIG5hbWUnCisgICAgICApCisgIGNsYW5nX3JlZ2V4X3R5cGVfb2ZfYV9wYXJhbSA9ICgKKyAgICAgIF9DTEFOR19GSUxFX0xJTkVfUkUgKworICAgICAgcidlcnJvcjogQ1wrXCsgcmVxdWlyZXMgYSB0eXBlIHNwZWNpZmllciBmb3IgYWxsIGRlY2xhcmF0aW9uc1xuJworICAgICAgcicoLipcbikqPycKKyAgICAgIHInKD9QPWZpbGUpOig/UD1saW5lKTooP1A9Y29sdW1uKTogZXJyb3I6ICcKKyAgICAgIHInQ1wrXCsgcmVxdWlyZXMgYSB0eXBlIHNwZWNpZmllciBmb3IgYWxsIGRlY2xhcmF0aW9ucycKKyAgICAgICkKKyAgY2xhbmdfcmVnZXhfdW5rbm93bl90eXBlID0gKAorICAgICAgX0NMQU5HX0ZJTEVfTElORV9SRSArCisgICAgICByJ2Vycm9yOiB1bmtub3duIHR5cGUgbmFtZSBcJyg/UDx0eXBlPlteXCddKylcJycKKyAgICAgICkKKworICBkaWFnbm9zaXMgPSAiIiIKK0luIGEgbW9jayBjbGFzcyB0ZW1wbGF0ZSwgdHlwZXMgb3IgdHlwZWRlZnMgZGVmaW5lZCBpbiB0aGUgYmFzZSBjbGFzcwordGVtcGxhdGUgYXJlICpub3QqIGF1dG9tYXRpY2FsbHkgdmlzaWJsZS4gIFRoaXMgaXMgaG93IEMrKyB3b3Jrcy4gIEJlZm9yZQoreW91IGNhbiB1c2UgYSB0eXBlIG9yIHR5cGVkZWYgbmFtZWQgJSh0eXBlKXMgZGVmaW5lZCBpbiBiYXNlIGNsYXNzIEJhc2U8VD4sIHlvdQorbmVlZCB0byBtYWtlIGl0IHZpc2libGUuICBPbmUgd2F5IHRvIGRvIGl0IGlzOgorCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTxUPjo6JSh0eXBlKXMgJSh0eXBlKXM7IiIiCisKKyAgZm9yIGRpYWcgaW4gX0dlbmVyaWNEaWFnbm9zZXIoCisgICAgICAnVFRCJywgJ1R5cGUgaW4gVGVtcGxhdGUgQmFzZScsCisgICAgICBbKGdjY180XzNfMV9yZWdleF90eXBlX2luX3JldHZhbCwgZGlhZ25vc2lzICUgeyd0eXBlJzogJ0Zvbyd9KSwKKyAgICAgICAoZ2NjXzRfNF8wX3JlZ2V4X3R5cGVfaW5fcmV0dmFsLCBkaWFnbm9zaXMgJSB7J3R5cGUnOiAnRm9vJ30pLAorICAgICAgIChnY2NfcmVnZXhfdHlwZV9vZl9zb2xlX3BhcmFtLCBkaWFnbm9zaXMpLAorICAgICAgIChnY2NfcmVnZXhfdHlwZV9vZl9hX3BhcmFtLCBkaWFnbm9zaXMpLAorICAgICAgIChjbGFuZ19yZWdleF90eXBlX29mX3JldHZhbF9vcl9zb2xlX3BhcmFtLCBkaWFnbm9zaXMpLAorICAgICAgIChjbGFuZ19yZWdleF90eXBlX29mX2FfcGFyYW0sIGRpYWdub3NpcyAlIHsndHlwZSc6ICdGb28nfSldLAorICAgICAgbXNnKToKKyAgICB5aWVsZCBkaWFnCisgICMgQXZvaWQgb3ZlcmxhcCB3aXRoIHRoZSBOVVMgcGF0dGVybi4KKyAgZm9yIG0gaW4gX0ZpbmRBbGxNYXRjaGVzKGNsYW5nX3JlZ2V4X3Vua25vd25fdHlwZSwgbXNnKToKKyAgICB0eXBlXyA9IG0uZ3JvdXBkaWN0KClbJ3R5cGUnXQorICAgIGlmIHR5cGVfIG5vdCBpbiBfQ09NTU9OX0dNT0NLX1NZTUJPTFM6CisgICAgICB5aWVsZCAoJ1RUQicsICdUeXBlIGluIFRlbXBsYXRlIEJhc2UnLCBkaWFnbm9zaXMgJSBtLmdyb3VwZGljdCgpKQorCisKK2RlZiBfV3JvbmdNb2NrTWV0aG9kTWFjcm9EaWFnbm9zZXIobXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBXTU0gZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKKworICBnY2NfcmVnZXggPSAoX0dDQ19GSUxFX0xJTkVfUkUgKworICAgICAgICAgICAgICAgcicuKnRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfKD9QPHdyb25nX2FyZ3M+XGQrKV9hcmd1bWVudC4qXG4nCisgICAgICAgICAgICAgICByJy4qXG4nCisgICAgICAgICAgICAgICByJy4qY2FuZGlkYXRlcyBhcmUuKkZ1bmN0aW9uTW9ja2VyPFtePl0rQSg/UDxhcmdzPlxkKylcKT4nKQorICBjbGFuZ19yZWdleCA9IChfQ0xBTkdfTk9OX0dNT0NLX0ZJTEVfTElORV9SRSArCisgICAgICAgICAgICAgICAgIHInZXJyb3I6LiphcnJheS4qbmVnYXRpdmUuKnI/XG4nCisgICAgICAgICAgICAgICAgIHInKC4qXG4pKj8nCisgICAgICAgICAgICAgICAgIHInKD9QPWZpbGUpOig/UD1saW5lKTooP1A9Y29sdW1uKTogZXJyb3I6IHRvbyBmZXcgYXJndW1lbnRzICcKKyAgICAgICAgICAgICAgICAgcid0byBmdW5jdGlvbiBjYWxsLCBleHBlY3RlZCAoP1A8YXJncz5cZCspLCAnCisgICAgICAgICAgICAgICAgIHInaGF2ZSAoP1A8d3JvbmdfYXJncz5cZCspJykKKyAgY2xhbmcxMV9yZSA9IChfQ0xBTkdfTk9OX0dNT0NLX0ZJTEVfTElORV9SRSArCisgICAgICAgICAgICAgICAgcicuKnRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfJworICAgICAgICAgICAgICAgIHInKD9QPHdyb25nX2FyZ3M+XGQrKV9hcmd1bWVudC4qJykKKyAgZGlhZ25vc2lzID0gIiIiCitZb3UgYXJlIHVzaW5nIE1PQ0tfTUVUSE9EJSh3cm9uZ19hcmdzKXMgdG8gZGVmaW5lIGEgbW9jayBtZXRob2QgdGhhdCBoYXMKKyUoYXJncylzIGFyZ3VtZW50cy4gVXNlIE1PQ0tfTUVUSE9EJShhcmdzKXMgKG9yIE1PQ0tfQ09OU1RfTUVUSE9EJShhcmdzKXMsCitNT0NLX01FVEhPRCUoYXJncylzX1QsIE1PQ0tfQ09OU1RfTUVUSE9EJShhcmdzKXNfVCBhcyBhcHByb3ByaWF0ZSkgaW5zdGVhZC4iIiIKKyAgcmV0dXJuIF9HZW5lcmljRGlhZ25vc2VyKCdXTU0nLCAnV3JvbmcgTU9DS19NRVRIT0RuIE1hY3JvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoZ2NjX3JlZ2V4LCBkaWFnbm9zaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFuZzExX3JlLCBkaWFnbm9zaXMgJSB7J3dyb25nX2FyZ3MnOiAnbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJncyc6ICduJ30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFuZ19yZWdleCwgZGlhZ25vc2lzKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpCisKKworZGVmIF9Xcm9uZ1BhcmVuUG9zaXRpb25EaWFnbm9zZXIobXNnKToKKyAgIiIiRGlhZ25vc2VzIHRoZSBXUFAgZGlzZWFzZSwgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci4iIiIKKworICBnY2NfcmVnZXggPSAoX0dDQ19GSUxFX0xJTkVfUkUgKworICAgICAgICAgICAgICAgcidlcnJvcjouKnRlc3Rpbmc6OmludGVybmFsOjpNb2NrU3BlYzwuKiBoYXMgbm8gbWVtYmVyIG5hbWVkIFwnJworICAgICAgICAgICAgICAgcicoP1A8bWV0aG9kPlx3KylcJycpCisgIGNsYW5nX3JlZ2V4ID0gKF9DTEFOR19OT05fR01PQ0tfRklMRV9MSU5FX1JFICsKKyAgICAgICAgICAgICAgICAgcidlcnJvcjogbm8gbWVtYmVyIG5hbWVkIFwnKD9QPG1ldGhvZD5cdyspXCcgaW4gJworICAgICAgICAgICAgICAgICByJ1wndGVzdGluZzo6aW50ZXJuYWw6Ok1vY2tTcGVjPC4qPlwnJykKKyAgZGlhZ25vc2lzID0gIiIiCitUaGUgY2xvc2luZyBwYXJlbnRoZXNpcyBvZiBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMIHNob3VsZCBiZSAqYmVmb3JlKgorIi4lKG1ldGhvZClzIi4gIEZvciBleGFtcGxlLCB5b3Ugc2hvdWxkIHdyaXRlOgorICBFWFBFQ1RfQ0FMTChteV9tb2NrLCBGb28oXykpLiUobWV0aG9kKXMoLi4uKTsKK2luc3RlYWQgb2Y6CisgIEVYUEVDVF9DQUxMKG15X21vY2ssIEZvbyhfKS4lKG1ldGhvZClzKC4uLikpOyIiIgorICByZXR1cm4gX0dlbmVyaWNEaWFnbm9zZXIoJ1dQUCcsICdXcm9uZyBQYXJlbnRoZXNpcyBQb3NpdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGdjY19yZWdleCwgZGlhZ25vc2lzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhbmdfcmVnZXgsIGRpYWdub3NpcyldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKQorCisKK19ESUFHTk9TRVJTID0gWworICAgIF9JbmNvbXBsZXRlQnlSZWZlcmVuY2VBcmd1bWVudERpYWdub3NlciwKKyAgICBfTW9ja09iamVjdFBvaW50ZXJEaWFnbm9zZXIsCisgICAgX05lZWRUb1JldHVybk5vdGhpbmdEaWFnbm9zZXIsCisgICAgX05lZWRUb1JldHVyblJlZmVyZW5jZURpYWdub3NlciwKKyAgICBfTmVlZFRvUmV0dXJuU29tZXRoaW5nRGlhZ25vc2VyLAorICAgIF9OZWVkVG9Vc2VSZXR1cm5OdWxsRGlhZ25vc2VyLAorICAgIF9OZWVkVG9Vc2VTeW1ib2xEaWFnbm9zZXIsCisgICAgX092ZXJsb2FkZWRGdW5jdGlvbkFjdGlvbkRpYWdub3NlciwKKyAgICBfT3ZlcmxvYWRlZEZ1bmN0aW9uTWF0Y2hlckRpYWdub3NlciwKKyAgICBfT3ZlcmxvYWRlZE1ldGhvZEFjdGlvbkRpYWdub3NlciwKKyAgICBfVHlwZUluVGVtcGxhdGVkQmFzZURpYWdub3NlciwKKyAgICBfV3JvbmdNb2NrTWV0aG9kTWFjcm9EaWFnbm9zZXIsCisgICAgX1dyb25nUGFyZW5Qb3NpdGlvbkRpYWdub3NlciwKKyAgICBdCisKKworZGVmIERpYWdub3NlKG1zZyk6CisgICIiIkdlbmVyYXRlcyBhbGwgcG9zc2libGUgZGlhZ25vc2VzIGdpdmVuIHRoZSBjb21waWxlciBlcnJvciBtZXNzYWdlLiIiIgorCisgIG1zZyA9IHJlLnN1YihyJ1x4MWJcW1tebV0qbScsICcnLCBtc2cpICAjIFN0cmlwcyBhbGwgY29sb3IgZm9ybWF0dGluZy4KKyAgIyBBc3N1bWluZyB0aGUgc3RyaW5nIGlzIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZywgcmVwbGFjZXMgdGhlIGxlZnQgYW5kCisgICMgdGhlIHJpZ2h0IHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggYXBvc3Ryb3BoZXMuCisgIG1zZyA9IHJlLnN1YihyJyhceGUyXHg4MFx4OTh8XHhlMlx4ODBceDk5KScsICInIiwgbXNnKQorCisgIGRpYWdub3NlcyA9IFtdCisgIGZvciBkaWFnbm9zZXIgaW4gX0RJQUdOT1NFUlM6CisgICAgZm9yIGRpYWcgaW4gZGlhZ25vc2VyKG1zZyk6CisgICAgICBkaWFnbm9zaXMgPSAnWyVzIC0gJXNdXG4lcycgJSBkaWFnCisgICAgICBpZiBub3QgZGlhZ25vc2lzIGluIGRpYWdub3NlczoKKyAgICAgICAgZGlhZ25vc2VzLmFwcGVuZChkaWFnbm9zaXMpCisgIHJldHVybiBkaWFnbm9zZXMKKworCitkZWYgbWFpbigpOgorICBwcmludCAoJ0dvb2dsZSBNb2NrIERvY3RvciB2JXMgLSAnCisgICAgICAgICAnZGlhZ25vc2VzIHByb2JsZW1zIGluIGNvZGUgdXNpbmcgR29vZ2xlIE1vY2suJyAlIF9WRVJTSU9OKQorCisgIGlmIHN5cy5zdGRpbi5pc2F0dHkoKToKKyAgICBwcmludCAoJ1BsZWFzZSBjb3B5IGFuZCBwYXN0ZSB0aGUgY29tcGlsZXIgZXJyb3JzIGhlcmUuICBQcmVzcyBjLUQgd2hlbiAnCisgICAgICAgICAgICd5b3UgYXJlIGRvbmU6JykKKyAgZWxzZToKKyAgICBwcmludCAoJ1dhaXRpbmcgZm9yIGNvbXBpbGVyIGVycm9ycyBvbiBzdGRpbiAuIC4gLicpCisKKyAgbXNnID0gc3lzLnN0ZGluLnJlYWQoKS5zdHJpcCgpCisgIGRpYWdub3NlcyA9IERpYWdub3NlKG1zZykKKyAgY291bnQgPSBsZW4oZGlhZ25vc2VzKQorICBpZiBub3QgY291bnQ6CisgICAgcHJpbnQgKCIiIgorWW91ciBjb21waWxlciBjb21wbGFpbmVkOgorODwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+OAorCitVaC1vaCwgSSdtIG5vdCBzbWFydCBlbm91Z2ggdG8gZmlndXJlIG91dCB3aGF0IHRoZSBwcm9ibGVtIGlzLiA6LSgKK0hvd2V2ZXIuLi4KK0lmIHlvdSBzZW5kIHlvdXIgc291cmNlIGNvZGUgYW5kIHRoZSBjb21waWxlcidzIGVycm9yIG1lc3NhZ2VzIHRvCislcywgeW91IGNhbiBiZSBoZWxwZWQgYW5kIEkgY2FuIGdldCBzbWFydGVyIC0tCit3aW4td2luIGZvciB1cyEiIiIgJSAobXNnLCBfRU1BSUwpKQorICBlbHNlOgorICAgIHByaW50ICgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKKyAgICBwcmludCAoJ1lvdXIgY29kZSBhcHBlYXJzIHRvIGhhdmUgdGhlIGZvbGxvd2luZycsKQorICAgIGlmIGNvdW50ID4gMToKKyAgICAgIHByaW50ICgnJXMgZGlzZWFzZXM6JyAlIChjb3VudCwpKQorICAgIGVsc2U6CisgICAgICBwcmludCAoJ2Rpc2Vhc2U6JykKKyAgICBpID0gMAorICAgIGZvciBkIGluIGRpYWdub3NlczoKKyAgICAgIGkgKz0gMQorICAgICAgaWYgY291bnQgPiAxOgorICAgICAgICBwcmludCAoJ1xuIyVzOicgJSAoaSwpKQorICAgICAgcHJpbnQgKGQpCisgICAgcHJpbnQgKCIiIgorSG93IGRpZCBJIGRvPyAgSWYgeW91IHRoaW5rIEknbSB3cm9uZyBvciB1bmhlbHBmdWwsIHBsZWFzZSBzZW5kIHlvdXIKK3NvdXJjZSBjb2RlIGFuZCB0aGUgY29tcGlsZXIncyBlcnJvciBtZXNzYWdlcyB0byAlcy4KK1RoZW4geW91IGNhbiBiZSBoZWxwZWQgYW5kIEkgY2FuIGdldCBzbWFydGVyIC0tIEkgcHJvbWlzZSBJIHdvbid0IGJlIHVwc2V0ISIiIiAlCisgICAgICAgICAgIF9FTUFJTCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL3VwbG9hZC5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL3VwbG9hZC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZTZmOWExCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvdXBsb2FkLnB5CkBAIC0wLDAgKzEsMTM4NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlRvb2wgZm9yIHVwbG9hZGluZyBkaWZmcyBmcm9tIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbSB0byB0aGUgY29kZXJldmlldyBhcHAuCisKK1VzYWdlIHN1bW1hcnk6IHVwbG9hZC5weSBbb3B0aW9uc10gWy0tIGRpZmZfb3B0aW9uc10KKworRGlmZiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIGRpZmYgY29tbWFuZCBvZiB0aGUgdW5kZXJseWluZyBzeXN0ZW0uCisKK1N1cHBvcnRlZCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtczoKKyAgR2l0CisgIE1lcmN1cmlhbAorICBTdWJ2ZXJzaW9uCisKK0l0IGlzIGltcG9ydGFudCBmb3IgR2l0L01lcmN1cmlhbCB1c2VycyB0byBzcGVjaWZ5IGEgdHJlZS9ub2RlL2JyYW5jaCB0byBkaWZmCithZ2FpbnN0IGJ5IHVzaW5nIHRoZSAnLS1yZXYnIG9wdGlvbi4KKyIiIgorIyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIGFwcGNmZy5weSBpbiB0aGUgQXBwIEVuZ2luZSBTREsgKG9wZW4gc291cmNlKSwKKyMgYW5kIGZyb20gQVNQTiByZWNpcGUgIzE0NjMwNi4KKworaW1wb3J0IGNvb2tpZWxpYgoraW1wb3J0IGdldHBhc3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbWQ1CitpbXBvcnQgbWltZXR5cGVzCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHVybGxpYgoraW1wb3J0IHVybGxpYjIKK2ltcG9ydCB1cmxwYXJzZQorCit0cnk6CisgIGltcG9ydCByZWFkbGluZQorZXhjZXB0IEltcG9ydEVycm9yOgorICBwYXNzCisKKyMgVGhlIGxvZ2dpbmcgdmVyYm9zaXR5OgorIyAgMDogRXJyb3JzIG9ubHkuCisjICAxOiBTdGF0dXMgbWVzc2FnZXMuCisjICAyOiBJbmZvIGxvZ3MuCisjICAzOiBEZWJ1ZyBsb2dzLgordmVyYm9zaXR5ID0gMQorCisjIE1heCBzaXplIG9mIHBhdGNoIG9yIGJhc2UgZmlsZS4KK01BWF9VUExPQURfU0laRSA9IDkwMCAqIDEwMjQKKworCitkZWYgR2V0RW1haWwocHJvbXB0KToKKyAgIiIiUHJvbXB0cyB0aGUgdXNlciBmb3IgdGhlaXIgZW1haWwgYWRkcmVzcyBhbmQgcmV0dXJucyBpdC4KKworICBUaGUgbGFzdCB1c2VkIGVtYWlsIGFkZHJlc3MgaXMgc2F2ZWQgdG8gYSBmaWxlIGFuZCBvZmZlcmVkIHVwIGFzIGEgc3VnZ2VzdGlvbgorICB0byB0aGUgdXNlci4gSWYgdGhlIHVzZXIgcHJlc3NlcyBlbnRlciB3aXRob3V0IHR5cGluZyBpbiBhbnl0aGluZyB0aGUgbGFzdAorICB1c2VkIGVtYWlsIGFkZHJlc3MgaXMgdXNlZC4gSWYgdGhlIHVzZXIgZW50ZXJzIGEgbmV3IGFkZHJlc3MsIGl0IGlzIHNhdmVkCisgIGZvciBuZXh0IHRpbWUgd2UgcHJvbXB0LgorCisgICIiIgorICBsYXN0X2VtYWlsX2ZpbGVfbmFtZSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8ubGFzdF9jb2RlcmV2aWV3X2VtYWlsX2FkZHJlc3MiKQorICBsYXN0X2VtYWlsID0gIiIKKyAgaWYgb3MucGF0aC5leGlzdHMobGFzdF9lbWFpbF9maWxlX25hbWUpOgorICAgIHRyeToKKyAgICAgIGxhc3RfZW1haWxfZmlsZSA9IG9wZW4obGFzdF9lbWFpbF9maWxlX25hbWUsICJyIikKKyAgICAgIGxhc3RfZW1haWwgPSBsYXN0X2VtYWlsX2ZpbGUucmVhZGxpbmUoKS5zdHJpcCgiXG4iKQorICAgICAgbGFzdF9lbWFpbF9maWxlLmNsb3NlKCkKKyAgICAgIHByb21wdCArPSAiIFslc10iICUgbGFzdF9lbWFpbAorICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgcGFzcworICBlbWFpbCA9IHJhd19pbnB1dChwcm9tcHQgKyAiOiAiKS5zdHJpcCgpCisgIGlmIGVtYWlsOgorICAgIHRyeToKKyAgICAgIGxhc3RfZW1haWxfZmlsZSA9IG9wZW4obGFzdF9lbWFpbF9maWxlX25hbWUsICJ3IikKKyAgICAgIGxhc3RfZW1haWxfZmlsZS53cml0ZShlbWFpbCkKKyAgICAgIGxhc3RfZW1haWxfZmlsZS5jbG9zZSgpCisgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICBwYXNzCisgIGVsc2U6CisgICAgZW1haWwgPSBsYXN0X2VtYWlsCisgIHJldHVybiBlbWFpbAorCisKK2RlZiBTdGF0dXNVcGRhdGUobXNnKToKKyAgIiIiUHJpbnQgYSBzdGF0dXMgbWVzc2FnZSB0byBzdGRvdXQuCisKKyAgSWYgJ3ZlcmJvc2l0eScgaXMgZ3JlYXRlciB0aGFuIDAsIHByaW50IHRoZSBtZXNzYWdlLgorCisgIEFyZ3M6CisgICAgbXNnOiBUaGUgc3RyaW5nIHRvIHByaW50LgorICAiIiIKKyAgaWYgdmVyYm9zaXR5ID4gMDoKKyAgICBwcmludCBtc2cKKworCitkZWYgRXJyb3JFeGl0KG1zZyk6CisgICIiIlByaW50IGFuIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZCBleGl0LiIiIgorICBwcmludCA+PnN5cy5zdGRlcnIsIG1zZworICBzeXMuZXhpdCgxKQorCisKK2NsYXNzIENsaWVudExvZ2luRXJyb3IodXJsbGliMi5IVFRQRXJyb3IpOgorICAiIiJSYWlzZWQgdG8gaW5kaWNhdGUgdGhlcmUgd2FzIGFuIGVycm9yIGF1dGhlbnRpY2F0aW5nIHdpdGggQ2xpZW50TG9naW4uIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgY29kZSwgbXNnLCBoZWFkZXJzLCBhcmdzKToKKyAgICB1cmxsaWIyLkhUVFBFcnJvci5fX2luaXRfXyhzZWxmLCB1cmwsIGNvZGUsIG1zZywgaGVhZGVycywgTm9uZSkKKyAgICBzZWxmLmFyZ3MgPSBhcmdzCisgICAgc2VsZi5yZWFzb24gPSBhcmdzWyJFcnJvciJdCisKKworY2xhc3MgQWJzdHJhY3RScGNTZXJ2ZXIob2JqZWN0KToKKyAgIiIiUHJvdmlkZXMgYSBjb21tb24gaW50ZXJmYWNlIGZvciBhIHNpbXBsZSBSUEMgc2VydmVyLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBhdXRoX2Z1bmN0aW9uLCBob3N0X292ZXJyaWRlPU5vbmUsIGV4dHJhX2hlYWRlcnM9e30sCisgICAgICAgICAgICAgICBzYXZlX2Nvb2tpZXM9RmFsc2UpOgorICAgICIiIkNyZWF0ZXMgYSBuZXcgSHR0cFJwY1NlcnZlci4KKworICAgIEFyZ3M6CisgICAgICBob3N0OiBUaGUgaG9zdCB0byBzZW5kIHJlcXVlc3RzIHRvLgorICAgICAgYXV0aF9mdW5jdGlvbjogQSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhbgorICAgICAgICAoZW1haWwsIHBhc3N3b3JkKSB0dXBsZSB3aGVuIGNhbGxlZC4gV2lsbCBiZSBjYWxsZWQgaWYgYXV0aGVudGljYXRpb24KKyAgICAgICAgaXMgcmVxdWlyZWQuCisgICAgICBob3N0X292ZXJyaWRlOiBUaGUgaG9zdCBoZWFkZXIgdG8gc2VuZCB0byB0aGUgc2VydmVyIChkZWZhdWx0cyB0byBob3N0KS4KKyAgICAgIGV4dHJhX2hlYWRlcnM6IEEgZGljdCBvZiBleHRyYSBoZWFkZXJzIHRvIGFwcGVuZCB0byBldmVyeSByZXF1ZXN0LgorICAgICAgc2F2ZV9jb29raWVzOiBJZiBUcnVlLCBzYXZlIHRoZSBhdXRoZW50aWNhdGlvbiBjb29raWVzIHRvIGxvY2FsIGRpc2suCisgICAgICAgIElmIEZhbHNlLCB1c2UgYW4gaW4tbWVtb3J5IGNvb2tpZWphciBpbnN0ZWFkLiAgU3ViY2xhc3NlcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkuICBEZWZhdWx0cyB0byBGYWxzZS4KKyAgICAiIiIKKyAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgc2VsZi5ob3N0X292ZXJyaWRlID0gaG9zdF9vdmVycmlkZQorICAgIHNlbGYuYXV0aF9mdW5jdGlvbiA9IGF1dGhfZnVuY3Rpb24KKyAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBGYWxzZQorICAgIHNlbGYuZXh0cmFfaGVhZGVycyA9IGV4dHJhX2hlYWRlcnMKKyAgICBzZWxmLnNhdmVfY29va2llcyA9IHNhdmVfY29va2llcworICAgIHNlbGYub3BlbmVyID0gc2VsZi5fR2V0T3BlbmVyKCkKKyAgICBpZiBzZWxmLmhvc3Rfb3ZlcnJpZGU6CisgICAgICBsb2dnaW5nLmluZm8oIlNlcnZlcjogJXM7IEhvc3Q6ICVzIiwgc2VsZi5ob3N0LCBzZWxmLmhvc3Rfb3ZlcnJpZGUpCisgICAgZWxzZToKKyAgICAgIGxvZ2dpbmcuaW5mbygiU2VydmVyOiAlcyIsIHNlbGYuaG9zdCkKKworICBkZWYgX0dldE9wZW5lcihzZWxmKToKKyAgICAiIiJSZXR1cm5zIGFuIE9wZW5lckRpcmVjdG9yIGZvciBtYWtpbmcgSFRUUCByZXF1ZXN0cy4KKworICAgIFJldHVybnM6CisgICAgICBBIHVybGxpYjIuT3BlbmVyRGlyZWN0b3Igb2JqZWN0LgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgIGRlZiBfQ3JlYXRlUmVxdWVzdChzZWxmLCB1cmwsIGRhdGE9Tm9uZSk6CisgICAgIiIiQ3JlYXRlcyBhIG5ldyB1cmxsaWIgcmVxdWVzdC4iIiIKKyAgICBsb2dnaW5nLmRlYnVnKCJDcmVhdGluZyByZXF1ZXN0IGZvcjogJyVzJyB3aXRoIHBheWxvYWQ6XG4lcyIsIHVybCwgZGF0YSkKKyAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QodXJsLCBkYXRhPWRhdGEpCisgICAgaWYgc2VsZi5ob3N0X292ZXJyaWRlOgorICAgICAgcmVxLmFkZF9oZWFkZXIoIkhvc3QiLCBzZWxmLmhvc3Rfb3ZlcnJpZGUpCisgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5leHRyYV9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgcmVxLmFkZF9oZWFkZXIoa2V5LCB2YWx1ZSkKKyAgICByZXR1cm4gcmVxCisKKyAgZGVmIF9HZXRBdXRoVG9rZW4oc2VsZiwgZW1haWwsIHBhc3N3b3JkKToKKyAgICAiIiJVc2VzIENsaWVudExvZ2luIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciwgcmV0dXJuaW5nIGFuIGF1dGggdG9rZW4uCisKKyAgICBBcmdzOgorICAgICAgZW1haWw6ICAgIFRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcworICAgICAgcGFzc3dvcmQ6IFRoZSB1c2VyJ3MgcGFzc3dvcmQKKworICAgIFJhaXNlczoKKyAgICAgIENsaWVudExvZ2luRXJyb3I6IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhdXRoZW50aWNhdGluZyB3aXRoIENsaWVudExvZ2luLgorICAgICAgSFRUUEVycm9yOiBJZiB0aGVyZSB3YXMgc29tZSBvdGhlciBmb3JtIG9mIEhUVFAgZXJyb3IuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHJldHVybmVkIGJ5IENsaWVudExvZ2luLgorICAgICIiIgorICAgIGFjY291bnRfdHlwZSA9ICJHT09HTEUiCisgICAgaWYgc2VsZi5ob3N0LmVuZHN3aXRoKCIuZ29vZ2xlLmNvbSIpOgorICAgICAgIyBOZWVkZWQgZm9yIHVzZSBpbnNpZGUgR29vZ2xlLgorICAgICAgYWNjb3VudF90eXBlID0gIkhPU1RFRCIKKyAgICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KAorICAgICAgICB1cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvQ2xpZW50TG9naW4iLAorICAgICAgICBkYXRhPXVybGxpYi51cmxlbmNvZGUoeworICAgICAgICAgICAgIkVtYWlsIjogZW1haWwsCisgICAgICAgICAgICAiUGFzc3dkIjogcGFzc3dvcmQsCisgICAgICAgICAgICAic2VydmljZSI6ICJhaCIsCisgICAgICAgICAgICAic291cmNlIjogInJpZXR2ZWxkLWNvZGVyZXZpZXctdXBsb2FkIiwKKyAgICAgICAgICAgICJhY2NvdW50VHlwZSI6IGFjY291bnRfdHlwZSwKKyAgICAgICAgfSksCisgICAgKQorICAgIHRyeToKKyAgICAgIHJlc3BvbnNlID0gc2VsZi5vcGVuZXIub3BlbihyZXEpCisgICAgICByZXNwb25zZV9ib2R5ID0gcmVzcG9uc2UucmVhZCgpCisgICAgICByZXNwb25zZV9kaWN0ID0gZGljdCh4LnNwbGl0KCI9IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIHJlc3BvbnNlX2JvZHkuc3BsaXQoIlxuIikgaWYgeCkKKyAgICAgIHJldHVybiByZXNwb25zZV9kaWN0WyJBdXRoIl0KKyAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIGU6CisgICAgICBpZiBlLmNvZGUgPT0gNDAzOgorICAgICAgICBib2R5ID0gZS5yZWFkKCkKKyAgICAgICAgcmVzcG9uc2VfZGljdCA9IGRpY3QoeC5zcGxpdCgiPSIsIDEpIGZvciB4IGluIGJvZHkuc3BsaXQoIlxuIikgaWYgeCkKKyAgICAgICAgcmFpc2UgQ2xpZW50TG9naW5FcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIGUuY29kZSwgZS5tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oZWFkZXJzLCByZXNwb25zZV9kaWN0KQorICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UKKworICBkZWYgX0dldEF1dGhDb29raWUoc2VsZiwgYXV0aF90b2tlbik6CisgICAgIiIiRmV0Y2hlcyBhdXRoZW50aWNhdGlvbiBjb29raWVzIGZvciBhbiBhdXRoZW50aWNhdGlvbiB0b2tlbi4KKworICAgIEFyZ3M6CisgICAgICBhdXRoX3Rva2VuOiBUaGUgYXV0aGVudGljYXRpb24gdG9rZW4gcmV0dXJuZWQgYnkgQ2xpZW50TG9naW4uCisKKyAgICBSYWlzZXM6CisgICAgICBIVFRQRXJyb3I6IElmIHRoZXJlIHdhcyBhbiBlcnJvciBmZXRjaGluZyB0aGUgYXV0aGVudGljYXRpb24gY29va2llcy4KKyAgICAiIiIKKyAgICAjIFRoaXMgaXMgYSBkdW1teSB2YWx1ZSB0byBhbGxvdyB1cyB0byBpZGVudGlmeSB3aGVuIHdlJ3JlIHN1Y2Nlc3NmdWwuCisgICAgY29udGludWVfbG9jYXRpb24gPSAiaHR0cDovL2xvY2FsaG9zdC8iCisgICAgYXJncyA9IHsiY29udGludWUiOiBjb250aW51ZV9sb2NhdGlvbiwgImF1dGgiOiBhdXRoX3Rva2VufQorICAgIHJlcSA9IHNlbGYuX0NyZWF0ZVJlcXVlc3QoImh0dHA6Ly8lcy9fYWgvbG9naW4/JXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmhvc3QsIHVybGxpYi51cmxlbmNvZGUoYXJncykpKQorICAgIHRyeToKKyAgICAgIHJlc3BvbnNlID0gc2VsZi5vcGVuZXIub3BlbihyZXEpCisgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCBlOgorICAgICAgcmVzcG9uc2UgPSBlCisgICAgaWYgKHJlc3BvbnNlLmNvZGUgIT0gMzAyIG9yCisgICAgICAgIHJlc3BvbnNlLmluZm8oKVsibG9jYXRpb24iXSAhPSBjb250aW51ZV9sb2NhdGlvbik6CisgICAgICByYWlzZSB1cmxsaWIyLkhUVFBFcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIHJlc3BvbnNlLmNvZGUsIHJlc3BvbnNlLm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLmZwKQorICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IFRydWUKKworICBkZWYgX0F1dGhlbnRpY2F0ZShzZWxmKToKKyAgICAiIiJBdXRoZW50aWNhdGVzIHRoZSB1c2VyLgorCisgICAgVGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3Mgd29ya3MgYXMgZm9sbG93czoKKyAgICAgMSkgV2UgZ2V0IGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZyb20gdGhlIHVzZXIKKyAgICAgMikgV2UgdXNlIENsaWVudExvZ2luIHRvIG9idGFpbiBhbiBBVVRIIHRva2VuIGZvciB0aGUgdXNlcgorICAgICAgICAoc2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9hY2NvdW50cy9BdXRoRm9ySW5zdGFsbGVkQXBwcy5odG1sKS4KKyAgICAgMykgV2UgcGFzcyB0aGUgYXV0aCB0b2tlbiB0byAvX2FoL2xvZ2luIG9uIHRoZSBzZXJ2ZXIgdG8gb2J0YWluIGFuCisgICAgICAgIGF1dGhlbnRpY2F0aW9uIGNvb2tpZS4gSWYgbG9naW4gd2FzIHN1Y2Nlc3NmdWwsIGl0IHRyaWVzIHRvIHJlZGlyZWN0CisgICAgICAgIHVzIHRvIHRoZSBVUkwgd2UgcHJvdmlkZWQuCisKKyAgICBJZiB3ZSBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgdXBsb2FkIEFQSSB3aXRob3V0IGZpcnN0IG9idGFpbmluZyBhbgorICAgIGF1dGhlbnRpY2F0aW9uIGNvb2tpZSwgaXQgcmV0dXJucyBhIDQwMSByZXNwb25zZSBhbmQgZGlyZWN0cyB1cyB0bworICAgIGF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgd2l0aCBDbGllbnRMb2dpbi4KKyAgICAiIiIKKyAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgIGNyZWRlbnRpYWxzID0gc2VsZi5hdXRoX2Z1bmN0aW9uKCkKKyAgICAgIHRyeToKKyAgICAgICAgYXV0aF90b2tlbiA9IHNlbGYuX0dldEF1dGhUb2tlbihjcmVkZW50aWFsc1swXSwgY3JlZGVudGlhbHNbMV0pCisgICAgICBleGNlcHQgQ2xpZW50TG9naW5FcnJvciwgZToKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIkJhZEF1dGhlbnRpY2F0aW9uIjoKKyAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJJbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkLiIKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBlLnJlYXNvbiA9PSAiQ2FwdGNoYVJlcXVpcmVkIjoKKyAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgKKyAgICAgICAgICAgICAgIlBsZWFzZSBnbyB0b1xuIgorICAgICAgICAgICAgICAiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9hY2NvdW50cy9EaXNwbGF5VW5sb2NrQ2FwdGNoYVxuIgorICAgICAgICAgICAgICAiYW5kIHZlcmlmeSB5b3UgYXJlIGEgaHVtYW4uICBUaGVuIHRyeSBhZ2Fpbi4iKQorICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGUucmVhc29uID09ICJOb3RWZXJpZmllZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiQWNjb3VudCBub3QgdmVyaWZpZWQuIgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGUucmVhc29uID09ICJUZXJtc05vdEFncmVlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVXNlciBoYXMgbm90IGFncmVlZCB0byBUT1MuIgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGUucmVhc29uID09ICJBY2NvdW50RGVsZXRlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVGhlIHVzZXIgYWNjb3VudCBoYXMgYmVlbiBkZWxldGVkLiIKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiQWNjb3VudERpc2FibGVkIjoKKyAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJUaGUgdXNlciBhY2NvdW50IGhhcyBiZWVuIGRpc2FibGVkLiIKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiU2VydmljZURpc2FibGVkIjoKKyAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgiVGhlIHVzZXIncyBhY2Nlc3MgdG8gdGhlIHNlcnZpY2UgaGFzIGJlZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZC4iKQorICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGUucmVhc29uID09ICJTZXJ2aWNlVW5hdmFpbGFibGUiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlRoZSBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGU7IHRyeSBhZ2FpbiBsYXRlci4iCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmFpc2UKKyAgICAgIHNlbGYuX0dldEF1dGhDb29raWUoYXV0aF90b2tlbikKKyAgICAgIHJldHVybgorCisgIGRlZiBTZW5kKHNlbGYsIHJlcXVlc3RfcGF0aCwgcGF5bG9hZD1Ob25lLAorICAgICAgICAgICBjb250ZW50X3R5cGU9ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsCisgICAgICAgICAgIHRpbWVvdXQ9Tm9uZSwKKyAgICAgICAgICAgKiprd2FyZ3MpOgorICAgICIiIlNlbmRzIGFuIFJQQyBhbmQgcmV0dXJucyB0aGUgcmVzcG9uc2UuCisKKyAgICBBcmdzOgorICAgICAgcmVxdWVzdF9wYXRoOiBUaGUgcGF0aCB0byBzZW5kIHRoZSByZXF1ZXN0IHRvLCBlZyAvYXBpL2FwcHZlcnNpb24vY3JlYXRlLgorICAgICAgcGF5bG9hZDogVGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QsIG9yIE5vbmUgdG8gc2VuZCBhbiBlbXB0eSByZXF1ZXN0LgorICAgICAgY29udGVudF90eXBlOiBUaGUgQ29udGVudC1UeXBlIGhlYWRlciB0byB1c2UuCisgICAgICB0aW1lb3V0OiB0aW1lb3V0IGluIHNlY29uZHM7IGRlZmF1bHQgTm9uZSBpLmUuIG5vIHRpbWVvdXQuCisgICAgICAgIChOb3RlOiBmb3IgbGFyZ2UgcmVxdWVzdHMgb24gT1MgWCwgdGhlIHRpbWVvdXQgZG9lc24ndCB3b3JrIHJpZ2h0LikKKyAgICAgIGt3YXJnczogQW55IGtleXdvcmQgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgaW50byBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycy4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgcmVzcG9uc2UgYm9keSwgYXMgYSBzdHJpbmcuCisgICAgIiIiCisgICAgIyBUT0RPOiBEb24ndCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgTGV0IHRoZSBzZXJ2ZXIgc2F5CisgICAgIyB3aGV0aGVyIGl0IGlzIG5lY2Vzc2FyeS4KKyAgICBpZiBub3Qgc2VsZi5hdXRoZW50aWNhdGVkOgorICAgICAgc2VsZi5fQXV0aGVudGljYXRlKCkKKworICAgIG9sZF90aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKKyAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQodGltZW91dCkKKyAgICB0cnk6CisgICAgICB0cmllcyA9IDAKKyAgICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyaWVzICs9IDEKKyAgICAgICAgYXJncyA9IGRpY3Qoa3dhcmdzKQorICAgICAgICB1cmwgPSAiaHR0cDovLyVzJXMiICUgKHNlbGYuaG9zdCwgcmVxdWVzdF9wYXRoKQorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgIHVybCArPSAiPyIgKyB1cmxsaWIudXJsZW5jb2RlKGFyZ3MpCisgICAgICAgIHJlcSA9IHNlbGYuX0NyZWF0ZVJlcXVlc3QodXJsPXVybCwgZGF0YT1wYXlsb2FkKQorICAgICAgICByZXEuYWRkX2hlYWRlcigiQ29udGVudC1UeXBlIiwgY29udGVudF90eXBlKQorICAgICAgICB0cnk6CisgICAgICAgICAgZiA9IHNlbGYub3BlbmVyLm9wZW4ocmVxKQorICAgICAgICAgIHJlc3BvbnNlID0gZi5yZWFkKCkKKyAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKKyAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCBlOgorICAgICAgICAgIGlmIHRyaWVzID4gMzoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgZWxpZiBlLmNvZGUgPT0gNDAxOgorICAgICAgICAgICAgc2VsZi5fQXV0aGVudGljYXRlKCkKKyMjICAgICAgICAgICBlbGlmIGUuY29kZSA+PSA1MDAgYW5kIGUuY29kZSA8IDYwMDoKKyMjICAgICAgICAgICAgICMgU2VydmVyIEVycm9yIC0gdHJ5IGFnYWluLgorIyMgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UKKyAgICBmaW5hbGx5OgorICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9sZF90aW1lb3V0KQorCisKK2NsYXNzIEh0dHBScGNTZXJ2ZXIoQWJzdHJhY3RScGNTZXJ2ZXIpOgorICAiIiJQcm92aWRlcyBhIHNpbXBsaWZpZWQgUlBDLXN0eWxlIGludGVyZmFjZSBmb3IgSFRUUCByZXF1ZXN0cy4iIiIKKworICBkZWYgX0F1dGhlbnRpY2F0ZShzZWxmKToKKyAgICAiIiJTYXZlIHRoZSBjb29raWUgamFyIGFmdGVyIGF1dGhlbnRpY2F0aW9uLiIiIgorICAgIHN1cGVyKEh0dHBScGNTZXJ2ZXIsIHNlbGYpLl9BdXRoZW50aWNhdGUoKQorICAgIGlmIHNlbGYuc2F2ZV9jb29raWVzOgorICAgICAgU3RhdHVzVXBkYXRlKCJTYXZpbmcgYXV0aGVudGljYXRpb24gY29va2llcyB0byAlcyIgJSBzZWxmLmNvb2tpZV9maWxlKQorICAgICAgc2VsZi5jb29raWVfamFyLnNhdmUoKQorCisgIGRlZiBfR2V0T3BlbmVyKHNlbGYpOgorICAgICIiIlJldHVybnMgYW4gT3BlbmVyRGlyZWN0b3IgdGhhdCBzdXBwb3J0cyBjb29raWVzIGFuZCBpZ25vcmVzIHJlZGlyZWN0cy4KKworICAgIFJldHVybnM6CisgICAgICBBIHVybGxpYjIuT3BlbmVyRGlyZWN0b3Igb2JqZWN0LgorICAgICIiIgorICAgIG9wZW5lciA9IHVybGxpYjIuT3BlbmVyRGlyZWN0b3IoKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLlByb3h5SGFuZGxlcigpKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLlVua25vd25IYW5kbGVyKCkpCisgICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUEhhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQRGVmYXVsdEVycm9ySGFuZGxlcigpKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLkhUVFBTSGFuZGxlcigpKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLkhUVFBFcnJvclByb2Nlc3NvcigpKQorICAgIGlmIHNlbGYuc2F2ZV9jb29raWVzOgorICAgICAgc2VsZi5jb29raWVfZmlsZSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8uY29kZXJldmlld191cGxvYWRfY29va2llcyIpCisgICAgICBzZWxmLmNvb2tpZV9qYXIgPSBjb29raWVsaWIuTW96aWxsYUNvb2tpZUphcihzZWxmLmNvb2tpZV9maWxlKQorICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5jb29raWVfZmlsZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICBzZWxmLmNvb2tpZV9qYXIubG9hZCgpCisgICAgICAgICAgc2VsZi5hdXRoZW50aWNhdGVkID0gVHJ1ZQorICAgICAgICAgIFN0YXR1c1VwZGF0ZSgiTG9hZGVkIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgZnJvbSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvb2tpZV9maWxlKQorICAgICAgICBleGNlcHQgKGNvb2tpZWxpYi5Mb2FkRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICMgRmFpbGVkIHRvIGxvYWQgY29va2llcyAtIGp1c3QgaWdub3JlIHRoZW0uCisgICAgICAgICAgcGFzcworICAgICAgZWxzZToKKyAgICAgICAgIyBDcmVhdGUgYW4gZW1wdHkgY29va2llIGZpbGUgd2l0aCBtb2RlIDYwMAorICAgICAgICBmZCA9IG9zLm9wZW4oc2VsZi5jb29raWVfZmlsZSwgb3MuT19DUkVBVCwgMDYwMCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAjIEFsd2F5cyBjaG1vZCB0aGUgY29va2llIGZpbGUKKyAgICAgIG9zLmNobW9kKHNlbGYuY29va2llX2ZpbGUsIDA2MDApCisgICAgZWxzZToKKyAgICAgICMgRG9uJ3Qgc2F2ZSBjb29raWVzIGFjcm9zcyBydW5zIG9mIHVwZGF0ZS5weS4KKyAgICAgIHNlbGYuY29va2llX2phciA9IGNvb2tpZWxpYi5Db29raWVKYXIoKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3Ioc2VsZi5jb29raWVfamFyKSkKKyAgICByZXR1cm4gb3BlbmVyCisKKworcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSIlcHJvZyBbb3B0aW9uc10gWy0tIGRpZmZfb3B0aW9uc10iKQorcGFyc2VyLmFkZF9vcHRpb24oIi15IiwgIi0tYXNzdW1lX3llcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICBkZXN0PSJhc3N1bWVfeWVzIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgIGhlbHA9IkFzc3VtZSB0aGF0IHRoZSBhbnN3ZXIgdG8geWVzL25vIHF1ZXN0aW9ucyBpcyAneWVzJy4iKQorIyBMb2dnaW5nCitncm91cCA9IHBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKCJMb2dnaW5nIG9wdGlvbnMiKQorZ3JvdXAuYWRkX29wdGlvbigiLXEiLCAiLS1xdWlldCIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgaGVscD0iUHJpbnQgZXJyb3JzIG9ubHkuIikKK2dyb3VwLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgZGVmYXVsdD0xLAorICAgICAgICAgICAgICAgICBoZWxwPSJQcmludCBpbmZvIGxldmVsIGxvZ3MgKGRlZmF1bHQpLiIpCitncm91cC5hZGRfb3B0aW9uKCItLW5vaXN5IiwgYWN0aW9uPSJzdG9yZV9jb25zdCIsIGNvbnN0PTMsCisgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBoZWxwPSJQcmludCBhbGwgbG9ncy4iKQorIyBSZXZpZXcgc2VydmVyCitncm91cCA9IHBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKCJSZXZpZXcgc2VydmVyIG9wdGlvbnMiKQorZ3JvdXAuYWRkX29wdGlvbigiLXMiLCAiLS1zZXJ2ZXIiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0ic2VydmVyIiwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD0iY29kZXJldmlldy5hcHBzcG90LmNvbSIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IlNFUlZFUiIsCisgICAgICAgICAgICAgICAgIGhlbHA9KCJUaGUgc2VydmVyIHRvIHVwbG9hZCB0by4gVGhlIGZvcm1hdCBpcyBob3N0Wzpwb3J0XS4gIgorICAgICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdHMgdG8gJ2NvZGVyZXZpZXcuYXBwc3BvdC5jb20nLiIpKQorZ3JvdXAuYWRkX29wdGlvbigiLWUiLCAiLS1lbWFpbCIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJlbWFpbCIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkVNQUlMIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJUaGUgdXNlcm5hbWUgdG8gdXNlLiBXaWxsIHByb21wdCBpZiBvbWl0dGVkLiIpCitncm91cC5hZGRfb3B0aW9uKCItSCIsICItLWhvc3QiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iaG9zdCIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkhPU1QiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9Ik92ZXJyaWRlcyB0aGUgSG9zdCBoZWFkZXIgc2VudCB3aXRoIGFsbCBSUENzLiIpCitncm91cC5hZGRfb3B0aW9uKCItLW5vX2Nvb2tpZXMiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwKKyAgICAgICAgICAgICAgICAgZGVzdD0ic2F2ZV9jb29raWVzIiwgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICBoZWxwPSJEbyBub3Qgc2F2ZSBhdXRoZW50aWNhdGlvbiBjb29raWVzIHRvIGxvY2FsIGRpc2suIikKKyMgSXNzdWUKK2dyb3VwID0gcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoIklzc3VlIG9wdGlvbnMiKQorZ3JvdXAuYWRkX29wdGlvbigiLWQiLCAiLS1kZXNjcmlwdGlvbiIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkRFU0NSSVBUSU9OIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJPcHRpb25hbCBkZXNjcmlwdGlvbiB3aGVuIGNyZWF0aW5nIGFuIGlzc3VlLiIpCitncm91cC5hZGRfb3B0aW9uKCItZiIsICItLWRlc2NyaXB0aW9uX2ZpbGUiLCBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgICAgICAgZGVzdD0iZGVzY3JpcHRpb25fZmlsZSIsIG1ldGF2YXI9IkRFU0NSSVBUSU9OX0ZJTEUiLAorICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9Ik9wdGlvbmFsIHBhdGggb2YgYSBmaWxlIHRoYXQgY29udGFpbnMgIgorICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZGVzY3JpcHRpb24gd2hlbiBjcmVhdGluZyBhbiBpc3N1ZS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLXIiLCAiLS1yZXZpZXdlcnMiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0icmV2aWV3ZXJzIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iUkVWSUVXRVJTIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJBZGQgcmV2aWV3ZXJzIChjb21tYSBzZXBhcmF0ZWQgZW1haWwgYWRkcmVzc2VzKS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1jYyIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJjYyIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkNDIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJBZGQgQ0MgKGNvbW1hIHNlcGFyYXRlZCBlbWFpbCBhZGRyZXNzZXMpLiIpCisjIFVwbG9hZCBvcHRpb25zCitncm91cCA9IHBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKCJQYXRjaCBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1tIiwgIi0tbWVzc2FnZSIsIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iTUVTU0FHRSIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQSBtZXNzYWdlIHRvIGlkZW50aWZ5IHRoZSBwYXRjaC4gIgorICAgICAgICAgICAgICAgICAgICAgICJXaWxsIHByb21wdCBpZiBvbWl0dGVkLiIpCitncm91cC5hZGRfb3B0aW9uKCItaSIsICItLWlzc3VlIiwgdHlwZT0iaW50IiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IklTU1VFIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJJc3N1ZSBudW1iZXIgdG8gd2hpY2ggdG8gYWRkLiBEZWZhdWx0cyB0byBuZXcgaXNzdWUuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tZG93bmxvYWRfYmFzZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgIGRlc3Q9ImRvd25sb2FkX2Jhc2UiLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPSJCYXNlIGZpbGVzIHdpbGwgYmUgZG93bmxvYWRlZCBieSB0aGUgc2VydmVyICIKKyAgICAgICAgICAgICAgICAgIihzaWRlLWJ5LXNpZGUgZGlmZnMgbWF5IG5vdCB3b3JrIG9uIGZpbGVzIHdpdGggQ1JzKS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1yZXYiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0icmV2aXNpb24iLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJSRVYiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9IkJyYW5jaC90cmVlL3JldmlzaW9uIHRvIGRpZmYgYWdhaW5zdCAodXNlZCBieSBEVkNTKS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1zZW5kX21haWwiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICBkZXN0PSJzZW5kX21haWwiLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPSJTZW5kIG5vdGlmaWNhdGlvbiBlbWFpbCB0byByZXZpZXdlcnMuIikKKworCitkZWYgR2V0UnBjU2VydmVyKG9wdGlvbnMpOgorICAiIiJSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGFuIEFic3RyYWN0UnBjU2VydmVyLgorCisgIFJldHVybnM6CisgICAgQSBuZXcgQWJzdHJhY3RScGNTZXJ2ZXIsIG9uIHdoaWNoIFJQQyBjYWxscyBjYW4gYmUgbWFkZS4KKyAgIiIiCisKKyAgcnBjX3NlcnZlcl9jbGFzcyA9IEh0dHBScGNTZXJ2ZXIKKworICBkZWYgR2V0VXNlckNyZWRlbnRpYWxzKCk6CisgICAgIiIiUHJvbXB0cyB0aGUgdXNlciBmb3IgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuIiIiCisgICAgZW1haWwgPSBvcHRpb25zLmVtYWlsCisgICAgaWYgZW1haWwgaXMgTm9uZToKKyAgICAgIGVtYWlsID0gR2V0RW1haWwoIkVtYWlsIChsb2dpbiBmb3IgdXBsb2FkaW5nIHRvICVzKSIgJSBvcHRpb25zLnNlcnZlcikKKyAgICBwYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygiUGFzc3dvcmQgZm9yICVzOiAiICUgZW1haWwpCisgICAgcmV0dXJuIChlbWFpbCwgcGFzc3dvcmQpCisKKyAgIyBJZiB0aGlzIGlzIHRoZSBkZXZfYXBwc2VydmVyLCB1c2UgZmFrZSBhdXRoZW50aWNhdGlvbi4KKyAgaG9zdCA9IChvcHRpb25zLmhvc3Qgb3Igb3B0aW9ucy5zZXJ2ZXIpLmxvd2VyKCkKKyAgaWYgaG9zdCA9PSAibG9jYWxob3N0IiBvciBob3N0LnN0YXJ0c3dpdGgoImxvY2FsaG9zdDoiKToKKyAgICBlbWFpbCA9IG9wdGlvbnMuZW1haWwKKyAgICBpZiBlbWFpbCBpcyBOb25lOgorICAgICAgZW1haWwgPSAidGVzdEBleGFtcGxlLmNvbSIKKyAgICAgIGxvZ2dpbmcuaW5mbygiVXNpbmcgZGVidWcgdXNlciAlcy4gIE92ZXJyaWRlIHdpdGggLS1lbWFpbCIgJSBlbWFpbCkKKyAgICBzZXJ2ZXIgPSBycGNfc2VydmVyX2NsYXNzKAorICAgICAgICBvcHRpb25zLnNlcnZlciwKKyAgICAgICAgbGFtYmRhOiAoZW1haWwsICJwYXNzd29yZCIpLAorICAgICAgICBob3N0X292ZXJyaWRlPW9wdGlvbnMuaG9zdCwKKyAgICAgICAgZXh0cmFfaGVhZGVycz17IkNvb2tpZSI6CisgICAgICAgICAgICAgICAgICAgICAgICdkZXZfYXBwc2VydmVyX2xvZ2luPSIlczpGYWxzZSInICUgZW1haWx9LAorICAgICAgICBzYXZlX2Nvb2tpZXM9b3B0aW9ucy5zYXZlX2Nvb2tpZXMpCisgICAgIyBEb24ndCB0cnkgdG8gdGFsayB0byBDbGllbnRMb2dpbi4KKyAgICBzZXJ2ZXIuYXV0aGVudGljYXRlZCA9IFRydWUKKyAgICByZXR1cm4gc2VydmVyCisKKyAgcmV0dXJuIHJwY19zZXJ2ZXJfY2xhc3Mob3B0aW9ucy5zZXJ2ZXIsIEdldFVzZXJDcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9vdmVycmlkZT1vcHRpb25zLmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfY29va2llcz1vcHRpb25zLnNhdmVfY29va2llcykKKworCitkZWYgRW5jb2RlTXVsdGlwYXJ0Rm9ybURhdGEoZmllbGRzLCBmaWxlcyk6CisgICIiIkVuY29kZSBmb3JtIGZpZWxkcyBmb3IgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KKworICBBcmdzOgorICAgIGZpZWxkczogQSBzZXF1ZW5jZSBvZiAobmFtZSwgdmFsdWUpIGVsZW1lbnRzIGZvciByZWd1bGFyIGZvcm0gZmllbGRzLgorICAgIGZpbGVzOiBBIHNlcXVlbmNlIG9mIChuYW1lLCBmaWxlbmFtZSwgdmFsdWUpIGVsZW1lbnRzIGZvciBkYXRhIHRvIGJlCisgICAgICAgICAgIHVwbG9hZGVkIGFzIGZpbGVzLgorICBSZXR1cm5zOgorICAgIChjb250ZW50X3R5cGUsIGJvZHkpIHJlYWR5IGZvciBodHRwbGliLkhUVFAgaW5zdGFuY2UuCisKKyAgU291cmNlOgorICAgIGh0dHA6Ly9hc3BuLmFjdGl2ZXN0YXRlLmNvbS9BU1BOL0Nvb2tib29rL1B5dGhvbi9SZWNpcGUvMTQ2MzA2CisgICIiIgorICBCT1VOREFSWSA9ICctTS1BLUctSS1DLS0tQi1PLVUtTi1ELUEtUi1ZLScKKyAgQ1JMRiA9ICdcclxuJworICBsaW5lcyA9IFtdCisgIGZvciAoa2V5LCB2YWx1ZSkgaW4gZmllbGRzOgorICAgIGxpbmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkpCisgICAgbGluZXMuYXBwZW5kKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicgJSBrZXkpCisgICAgbGluZXMuYXBwZW5kKCcnKQorICAgIGxpbmVzLmFwcGVuZCh2YWx1ZSkKKyAgZm9yIChrZXksIGZpbGVuYW1lLCB2YWx1ZSkgaW4gZmlsZXM6CisgICAgbGluZXMuYXBwZW5kKCctLScgKyBCT1VOREFSWSkKKyAgICBsaW5lcy5hcHBlbmQoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiOyBmaWxlbmFtZT0iJXMiJyAlCisgICAgICAgICAgICAgKGtleSwgZmlsZW5hbWUpKQorICAgIGxpbmVzLmFwcGVuZCgnQ29udGVudC1UeXBlOiAlcycgJSBHZXRDb250ZW50VHlwZShmaWxlbmFtZSkpCisgICAgbGluZXMuYXBwZW5kKCcnKQorICAgIGxpbmVzLmFwcGVuZCh2YWx1ZSkKKyAgbGluZXMuYXBwZW5kKCctLScgKyBCT1VOREFSWSArICctLScpCisgIGxpbmVzLmFwcGVuZCgnJykKKyAgYm9keSA9IENSTEYuam9pbihsaW5lcykKKyAgY29udGVudF90eXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyAlIEJPVU5EQVJZCisgIHJldHVybiBjb250ZW50X3R5cGUsIGJvZHkKKworCitkZWYgR2V0Q29udGVudFR5cGUoZmlsZW5hbWUpOgorICAiIiJIZWxwZXIgdG8gZ3Vlc3MgdGhlIGNvbnRlbnQtdHlwZSBmcm9tIHRoZSBmaWxlbmFtZS4iIiIKKyAgcmV0dXJuIG1pbWV0eXBlcy5ndWVzc190eXBlKGZpbGVuYW1lKVswXSBvciAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJworCisKKyMgVXNlIGEgc2hlbGwgZm9yIHN1YmNvbW1hbmRzIG9uIFdpbmRvd3MgdG8gZ2V0IGEgUEFUSCBzZWFyY2guCit1c2Vfc2hlbGwgPSBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIikKKworZGVmIFJ1blNoZWxsV2l0aFJldHVybkNvZGUoY29tbWFuZCwgcHJpbnRfb3V0cHV0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpOgorICAiIiJFeGVjdXRlcyBhIGNvbW1hbmQgYW5kIHJldHVybnMgdGhlIG91dHB1dCBmcm9tIHN0ZG91dCBhbmQgdGhlIHJldHVybiBjb2RlLgorCisgIEFyZ3M6CisgICAgY29tbWFuZDogQ29tbWFuZCB0byBleGVjdXRlLgorICAgIHByaW50X291dHB1dDogSWYgVHJ1ZSwgdGhlIG91dHB1dCBpcyBwcmludGVkIHRvIHN0ZG91dC4KKyAgICAgICAgICAgICAgICAgIElmIEZhbHNlLCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIGFyZSBpZ25vcmVkLgorICAgIHVuaXZlcnNhbF9uZXdsaW5lczogVXNlIHVuaXZlcnNhbF9uZXdsaW5lcyBmbGFnIChkZWZhdWx0OiBUcnVlKS4KKworICBSZXR1cm5zOgorICAgIFR1cGxlIChvdXRwdXQsIHJldHVybiBjb2RlKQorICAiIiIKKyAgbG9nZ2luZy5pbmZvKCJSdW5uaW5nICVzIiwgY29tbWFuZCkKKyAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hlbGw9dXNlX3NoZWxsLCB1bml2ZXJzYWxfbmV3bGluZXM9dW5pdmVyc2FsX25ld2xpbmVzKQorICBpZiBwcmludF9vdXRwdXQ6CisgICAgb3V0cHV0X2FycmF5ID0gW10KKyAgICB3aGlsZSBUcnVlOgorICAgICAgbGluZSA9IHAuc3Rkb3V0LnJlYWRsaW5lKCkKKyAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICBicmVhaworICAgICAgcHJpbnQgbGluZS5zdHJpcCgiXG4iKQorICAgICAgb3V0cHV0X2FycmF5LmFwcGVuZChsaW5lKQorICAgIG91dHB1dCA9ICIiLmpvaW4ob3V0cHV0X2FycmF5KQorICBlbHNlOgorICAgIG91dHB1dCA9IHAuc3Rkb3V0LnJlYWQoKQorICBwLndhaXQoKQorICBlcnJvdXQgPSBwLnN0ZGVyci5yZWFkKCkKKyAgaWYgcHJpbnRfb3V0cHV0IGFuZCBlcnJvdXQ6CisgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCBlcnJvdXQKKyAgcC5zdGRvdXQuY2xvc2UoKQorICBwLnN0ZGVyci5jbG9zZSgpCisgIHJldHVybiBvdXRwdXQsIHAucmV0dXJuY29kZQorCisKK2RlZiBSdW5TaGVsbChjb21tYW5kLCBzaWxlbnRfb2s9RmFsc2UsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgIHByaW50X291dHB1dD1GYWxzZSk6CisgIGRhdGEsIHJldGNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNvbW1hbmQsIHByaW50X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzKQorICBpZiByZXRjb2RlOgorICAgIEVycm9yRXhpdCgiR290IGVycm9yIHN0YXR1cyBmcm9tICVzOlxuJXMiICUgKGNvbW1hbmQsIGRhdGEpKQorICBpZiBub3Qgc2lsZW50X29rIGFuZCBub3QgZGF0YToKKyAgICBFcnJvckV4aXQoIk5vIG91dHB1dCBmcm9tICVzIiAlIGNvbW1hbmQpCisgIHJldHVybiBkYXRhCisKKworY2xhc3MgVmVyc2lvbkNvbnRyb2xTeXN0ZW0ob2JqZWN0KToKKyAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBWQ1MuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMpOgorICAgICIiIkNvbnN0cnVjdG9yLgorCisgICAgQXJnczoKKyAgICAgIG9wdGlvbnM6IENvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICIiIgorICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKKworICBkZWYgR2VuZXJhdGVEaWZmKHNlbGYsIGFyZ3MpOgorICAgICIiIlJldHVybiB0aGUgY3VycmVudCBkaWZmIGFzIGEgc3RyaW5nLgorCisgICAgQXJnczoKKyAgICAgIGFyZ3M6IEV4dHJhIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBkaWZmIGNvbW1hbmQuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgImFic3RyYWN0IG1ldGhvZCAtLSBzdWJjbGFzcyAlcyBtdXN0IG92ZXJyaWRlIiAlIHNlbGYuX19jbGFzc19fKQorCisgIGRlZiBHZXRVbmtub3duRmlsZXMoc2VsZik6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBmaWxlcyB1bmtub3duIHRvIHRoZSBWQ1MuIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgImFic3RyYWN0IG1ldGhvZCAtLSBzdWJjbGFzcyAlcyBtdXN0IG92ZXJyaWRlIiAlIHNlbGYuX19jbGFzc19fKQorCisgIGRlZiBDaGVja0ZvclVua25vd25GaWxlcyhzZWxmKToKKyAgICAiIiJTaG93IGFuICJhcmUgeW91IHN1cmU/IiBwcm9tcHQgaWYgdGhlcmUgYXJlIHVua25vd24gZmlsZXMuIiIiCisgICAgdW5rbm93bl9maWxlcyA9IHNlbGYuR2V0VW5rbm93bkZpbGVzKCkKKyAgICBpZiB1bmtub3duX2ZpbGVzOgorICAgICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIG5vdCBhZGRlZCB0byB2ZXJzaW9uIGNvbnRyb2w6IgorICAgICAgZm9yIGxpbmUgaW4gdW5rbm93bl9maWxlczoKKyAgICAgICAgcHJpbnQgbGluZQorICAgICAgcHJvbXB0ID0gIkFyZSB5b3Ugc3VyZSB0byBjb250aW51ZT8oeS9OKSAiCisgICAgICBhbnN3ZXIgPSByYXdfaW5wdXQocHJvbXB0KS5zdHJpcCgpCisgICAgICBpZiBhbnN3ZXIgIT0gInkiOgorICAgICAgICBFcnJvckV4aXQoIlVzZXIgYWJvcnRlZCIpCisKKyAgZGVmIEdldEJhc2VGaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAiIiJHZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHVwc3RyZWFtIHZlcnNpb24gb2YgYSBmaWxlLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgdHVwbGUgKGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzKQorICAgICAgICBiYXNlX2NvbnRlbnQ6IFRoZSBjb250ZW50cyBvZiB0aGUgYmFzZSBmaWxlLgorICAgICAgICBuZXdfY29udGVudDogRm9yIHRleHQgZmlsZXMsIHRoaXMgaXMgZW1wdHkuICBGb3IgYmluYXJ5IGZpbGVzLCB0aGlzIGlzCisgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcgZmlsZSwgc2luY2UgdGhlIGRpZmYgb3V0cHV0IHdvbid0IGNvbnRhaW4KKyAgICAgICAgICBpbmZvcm1hdGlvbiB0byByZWNvbnN0cnVjdCB0aGUgY3VycmVudCBmaWxlLgorICAgICAgICBpc19iaW5hcnk6IFRydWUgaWZmIHRoZSBmaWxlIGlzIGJpbmFyeS4KKyAgICAgICAgc3RhdHVzOiBUaGUgc3RhdHVzIG9mIHRoZSBmaWxlLgorICAgICIiIgorCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgImFic3RyYWN0IG1ldGhvZCAtLSBzdWJjbGFzcyAlcyBtdXN0IG92ZXJyaWRlIiAlIHNlbGYuX19jbGFzc19fKQorCisKKyAgZGVmIEdldEJhc2VGaWxlcyhzZWxmLCBkaWZmKToKKyAgICAiIiJIZWxwZXIgdGhhdCBjYWxscyBHZXRCYXNlIGZpbGUgZm9yIGVhY2ggZmlsZSBpbiB0aGUgcGF0Y2guCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBmcm9tIGZpbGVuYW1lIHRvIEdldEJhc2VGaWxlJ3MgdHVwbGUuICBGaWxlbmFtZXMKKyAgICAgIGFyZSByZXRyaWV2ZWQgYmFzZWQgb24gbGluZXMgdGhhdCBzdGFydCB3aXRoICJJbmRleDoiIG9yCisgICAgICAiUHJvcGVydHkgY2hhbmdlcyBvbjoiLgorICAgICIiIgorICAgIGZpbGVzID0ge30KKyAgICBmb3IgbGluZSBpbiBkaWZmLnNwbGl0bGluZXMoVHJ1ZSk6CisgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0luZGV4OicpIG9yIGxpbmUuc3RhcnRzd2l0aCgnUHJvcGVydHkgY2hhbmdlcyBvbjonKToKKyAgICAgICAgdW51c2VkLCBmaWxlbmFtZSA9IGxpbmUuc3BsaXQoJzonLCAxKQorICAgICAgICAjIE9uIFdpbmRvd3MgaWYgYSBmaWxlIGhhcyBwcm9wZXJ0eSBjaGFuZ2VzIGl0cyBmaWxlbmFtZSB1c2VzICdcJworICAgICAgICAjIGluc3RlYWQgb2YgJy8nLgorICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN0cmlwKCkucmVwbGFjZSgnXFwnLCAnLycpCisgICAgICAgIGZpbGVzW2ZpbGVuYW1lXSA9IHNlbGYuR2V0QmFzZUZpbGUoZmlsZW5hbWUpCisgICAgcmV0dXJuIGZpbGVzCisKKworICBkZWYgVXBsb2FkQmFzZUZpbGVzKHNlbGYsIGlzc3VlLCBycGNfc2VydmVyLCBwYXRjaF9saXN0LCBwYXRjaHNldCwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlcyk6CisgICAgIiIiVXBsb2FkcyB0aGUgYmFzZSBmaWxlcyAoYW5kIGlmIG5lY2Vzc2FyeSwgdGhlIGN1cnJlbnQgb25lcyBhcyB3ZWxsKS4iIiIKKworICAgIGRlZiBVcGxvYWRGaWxlKGZpbGVuYW1lLCBmaWxlX2lkLCBjb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgaXNfYmFzZSk6CisgICAgICAiIiJVcGxvYWRzIGEgZmlsZSB0byB0aGUgc2VydmVyLiIiIgorICAgICAgZmlsZV90b29fbGFyZ2UgPSBGYWxzZQorICAgICAgaWYgaXNfYmFzZToKKyAgICAgICAgdHlwZSA9ICJiYXNlIgorICAgICAgZWxzZToKKyAgICAgICAgdHlwZSA9ICJjdXJyZW50IgorICAgICAgaWYgbGVuKGNvbnRlbnQpID4gTUFYX1VQTE9BRF9TSVpFOgorICAgICAgICBwcmludCAoIk5vdCB1cGxvYWRpbmcgdGhlICVzIGZpbGUgZm9yICVzIGJlY2F1c2UgaXQncyB0b28gbGFyZ2UuIiAlCisgICAgICAgICAgICAgICAodHlwZSwgZmlsZW5hbWUpKQorICAgICAgICBmaWxlX3Rvb19sYXJnZSA9IFRydWUKKyAgICAgICAgY29udGVudCA9ICIiCisgICAgICBjaGVja3N1bSA9IG1kNS5uZXcoY29udGVudCkuaGV4ZGlnZXN0KCkKKyAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDAgYW5kIG5vdCBmaWxlX3Rvb19sYXJnZToKKyAgICAgICAgcHJpbnQgIlVwbG9hZGluZyAlcyBmaWxlIGZvciAlcyIgJSAodHlwZSwgZmlsZW5hbWUpCisgICAgICB1cmwgPSAiLyVkL3VwbG9hZF9jb250ZW50LyVkLyVkIiAlIChpbnQoaXNzdWUpLCBpbnQocGF0Y2hzZXQpLCBmaWxlX2lkKQorICAgICAgZm9ybV9maWVsZHMgPSBbKCJmaWxlbmFtZSIsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICgic3RhdHVzIiwgc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICgiY2hlY2tzdW0iLCBjaGVja3N1bSksCisgICAgICAgICAgICAgICAgICAgICAoImlzX2JpbmFyeSIsIHN0cihpc19iaW5hcnkpKSwKKyAgICAgICAgICAgICAgICAgICAgICgiaXNfY3VycmVudCIsIHN0cihub3QgaXNfYmFzZSkpLAorICAgICAgICAgICAgICAgICAgICBdCisgICAgICBpZiBmaWxlX3Rvb19sYXJnZToKKyAgICAgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiZmlsZV90b29fbGFyZ2UiLCAiMSIpKQorICAgICAgaWYgb3B0aW9ucy5lbWFpbDoKKyAgICAgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgidXNlciIsIG9wdGlvbnMuZW1haWwpKQorICAgICAgY3R5cGUsIGJvZHkgPSBFbmNvZGVNdWx0aXBhcnRGb3JtRGF0YShmb3JtX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygiZGF0YSIsIGZpbGVuYW1lLCBjb250ZW50KV0pCisgICAgICByZXNwb25zZV9ib2R5ID0gcnBjX3NlcnZlci5TZW5kKHVybCwgYm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlPWN0eXBlKQorICAgICAgaWYgbm90IHJlc3BvbnNlX2JvZHkuc3RhcnRzd2l0aCgiT0siKToKKyAgICAgICAgU3RhdHVzVXBkYXRlKCIgIC0tPiAlcyIgJSByZXNwb25zZV9ib2R5KQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgcGF0Y2hlcyA9IGRpY3QoKQorICAgIFtwYXRjaGVzLnNldGRlZmF1bHQodiwgaykgZm9yIGssIHYgaW4gcGF0Y2hfbGlzdF0KKyAgICBmb3IgZmlsZW5hbWUgaW4gcGF0Y2hlcy5rZXlzKCk6CisgICAgICBiYXNlX2NvbnRlbnQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cyA9IGZpbGVzW2ZpbGVuYW1lXQorICAgICAgZmlsZV9pZF9zdHIgPSBwYXRjaGVzLmdldChmaWxlbmFtZSkKKyAgICAgIGlmIGZpbGVfaWRfc3RyLmZpbmQoIm5vYmFzZSIpICE9IC0xOgorICAgICAgICBiYXNlX2NvbnRlbnQgPSBOb25lCisgICAgICAgIGZpbGVfaWRfc3RyID0gZmlsZV9pZF9zdHJbZmlsZV9pZF9zdHIucmZpbmQoIl8iKSArIDE6XQorICAgICAgZmlsZV9pZCA9IGludChmaWxlX2lkX3N0cikKKyAgICAgIGlmIGJhc2VfY29udGVudCAhPSBOb25lOgorICAgICAgICBVcGxvYWRGaWxlKGZpbGVuYW1lLCBmaWxlX2lkLCBiYXNlX2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzLCBUcnVlKQorICAgICAgaWYgbmV3X2NvbnRlbnQgIT0gTm9uZToKKyAgICAgICAgVXBsb2FkRmlsZShmaWxlbmFtZSwgZmlsZV9pZCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzLCBGYWxzZSkKKworICBkZWYgSXNJbWFnZShzZWxmLCBmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlbmFtZSBoYXMgYW4gaW1hZ2UgZXh0ZW5zaW9uLiIiIgorICAgIG1pbWV0eXBlID0gIG1pbWV0eXBlcy5ndWVzc190eXBlKGZpbGVuYW1lKVswXQorICAgIGlmIG5vdCBtaW1ldHlwZToKKyAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBtaW1ldHlwZS5zdGFydHN3aXRoKCJpbWFnZS8iKQorCisKK2NsYXNzIFN1YnZlcnNpb25WQ1MoVmVyc2lvbkNvbnRyb2xTeXN0ZW0pOgorICAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVmVyc2lvbkNvbnRyb2xTeXN0ZW0gaW50ZXJmYWNlIGZvciBTdWJ2ZXJzaW9uLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zKToKKyAgICBzdXBlcihTdWJ2ZXJzaW9uVkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQorICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAgIG1hdGNoID0gcmUubWF0Y2gociIoXGQrKSg6KFxkKykpPyIsIHNlbGYub3B0aW9ucy5yZXZpc2lvbikKKyAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgRXJyb3JFeGl0KCJJbnZhbGlkIFN1YnZlcnNpb24gcmV2aXNpb24gJXMuIiAlIHNlbGYub3B0aW9ucy5yZXZpc2lvbikKKyAgICAgIHNlbGYucmV2X3N0YXJ0ID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgIHNlbGYucmV2X2VuZCA9IG1hdGNoLmdyb3VwKDMpCisgICAgZWxzZToKKyAgICAgIHNlbGYucmV2X3N0YXJ0ID0gc2VsZi5yZXZfZW5kID0gTm9uZQorICAgICMgQ2FjaGUgb3V0cHV0IGZyb20gInN2biBsaXN0IC1yIFJFVk5PIGRpcm5hbWUiLgorICAgICMgS2V5czogZGlybmFtZSwgVmFsdWVzOiAyLXR1cGxlIChvdXB1dCBmb3Igc3RhcnQgcmV2IGFuZCBlbmQgcmV2KS4KKyAgICBzZWxmLnN2bmxzX2NhY2hlID0ge30KKyAgICAjIFNWTiBiYXNlIFVSTCBpcyByZXF1aXJlZCB0byBmZXRjaCBmaWxlcyBkZWxldGVkIGluIGFuIG9sZGVyIHJldmlzaW9uLgorICAgICMgUmVzdWx0IGlzIGNhY2hlZCB0byBub3QgZ3Vlc3MgaXQgb3ZlciBhbmQgb3ZlciBhZ2FpbiBpbiBHZXRCYXNlRmlsZSgpLgorICAgIHJlcXVpcmVkID0gc2VsZi5vcHRpb25zLmRvd25sb2FkX2Jhc2Ugb3Igc2VsZi5vcHRpb25zLnJldmlzaW9uIGlzIG5vdCBOb25lCisgICAgc2VsZi5zdm5fYmFzZSA9IHNlbGYuX0d1ZXNzQmFzZShyZXF1aXJlZCkKKworICBkZWYgR3Vlc3NCYXNlKHNlbGYsIHJlcXVpcmVkKToKKyAgICAiIiJXcmFwcGVyIGZvciBfR3Vlc3NCYXNlLiIiIgorICAgIHJldHVybiBzZWxmLnN2bl9iYXNlCisKKyAgZGVmIF9HdWVzc0Jhc2Uoc2VsZiwgcmVxdWlyZWQpOgorICAgICIiIlJldHVybnMgdGhlIFNWTiBiYXNlIFVSTC4KKworICAgIEFyZ3M6CisgICAgICByZXF1aXJlZDogSWYgdHJ1ZSwgZXhpdHMgaWYgdGhlIHVybCBjYW4ndCBiZSBndWVzc2VkLCBvdGhlcndpc2UgTm9uZSBpcworICAgICAgICByZXR1cm5lZC4KKyAgICAiIiIKKyAgICBpbmZvID0gUnVuU2hlbGwoWyJzdm4iLCAiaW5mbyJdKQorICAgIGZvciBsaW5lIGluIGluZm8uc3BsaXRsaW5lcygpOgorICAgICAgd29yZHMgPSBsaW5lLnNwbGl0KCkKKyAgICAgIGlmIGxlbih3b3JkcykgPT0gMiBhbmQgd29yZHNbMF0gPT0gIlVSTDoiOgorICAgICAgICB1cmwgPSB3b3Jkc1sxXQorICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgICAgIHVzZXJuYW1lLCBuZXRsb2MgPSB1cmxsaWIuc3BsaXR1c2VyKG5ldGxvYykKKyAgICAgICAgaWYgdXNlcm5hbWU6CisgICAgICAgICAgbG9nZ2luZy5pbmZvKCJSZW1vdmVkIHVzZXJuYW1lIGZyb20gYmFzZSBVUkwiKQorICAgICAgICBpZiBuZXRsb2MuZW5kc3dpdGgoInN2bi5weXRob24ub3JnIik6CisgICAgICAgICAgaWYgbmV0bG9jID09ICJzdm4ucHl0aG9uLm9yZyI6CisgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoIi9wcm9qZWN0cy8iKToKKyAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbOTpdCisgICAgICAgICAgZWxpZiBuZXRsb2MgIT0gInB5dGhvbmRldkBzdm4ucHl0aG9uLm9yZyI6CisgICAgICAgICAgICBFcnJvckV4aXQoIlVucmVjb2duaXplZCBQeXRob24gVVJMOiAlcyIgJSB1cmwpCisgICAgICAgICAgYmFzZSA9ICJodHRwOi8vc3ZuLnB5dGhvbi5vcmcvdmlldy8qY2hlY2tvdXQqJXMvIiAlIHBhdGgKKyAgICAgICAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgUHl0aG9uIGJhc2UgPSAlcyIsIGJhc2UpCisgICAgICAgIGVsaWYgbmV0bG9jLmVuZHN3aXRoKCJzdm4uY29sbGFiLm5ldCIpOgorICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgiL3JlcG9zLyIpOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbNjpdCisgICAgICAgICAgYmFzZSA9ICJodHRwOi8vc3ZuLmNvbGxhYi5uZXQvdmlld3ZjLypjaGVja291dColcy8iICUgcGF0aAorICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBDb2xsYWJOZXQgYmFzZSA9ICVzIiwgYmFzZSkKKyAgICAgICAgZWxpZiBuZXRsb2MuZW5kc3dpdGgoIi5nb29nbGVjb2RlLmNvbSIpOgorICAgICAgICAgIHBhdGggPSBwYXRoICsgIi8iCisgICAgICAgICAgYmFzZSA9IHVybHBhcnNlLnVybHVucGFyc2UoKCJodHRwIiwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBmcmFnbWVudCkpCisgICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIEdvb2dsZSBDb2RlIGJhc2UgPSAlcyIsIGJhc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcGF0aCA9IHBhdGggKyAiLyIKKyAgICAgICAgICBiYXNlID0gdXJscGFyc2UudXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksIGZyYWdtZW50KSkKKyAgICAgICAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgYmFzZSA9ICVzIiwgYmFzZSkKKyAgICAgICAgcmV0dXJuIGJhc2UKKyAgICBpZiByZXF1aXJlZDoKKyAgICAgIEVycm9yRXhpdCgiQ2FuJ3QgZmluZCBVUkwgaW4gb3V0cHV0IGZyb20gc3ZuIGluZm8iKQorICAgIHJldHVybiBOb25lCisKKyAgZGVmIEdlbmVyYXRlRGlmZihzZWxmLCBhcmdzKToKKyAgICBjbWQgPSBbInN2biIsICJkaWZmIl0KKyAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICBjbWQgKz0gWyItciIsIHNlbGYub3B0aW9ucy5yZXZpc2lvbl0KKyAgICBjbWQuZXh0ZW5kKGFyZ3MpCisgICAgZGF0YSA9IFJ1blNoZWxsKGNtZCkKKyAgICBjb3VudCA9IDAKKyAgICBmb3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMoKToKKyAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiSW5kZXg6Iikgb3IgbGluZS5zdGFydHN3aXRoKCJQcm9wZXJ0eSBjaGFuZ2VzIG9uOiIpOgorICAgICAgICBjb3VudCArPSAxCisgICAgICAgIGxvZ2dpbmcuaW5mbyhsaW5lKQorICAgIGlmIG5vdCBjb3VudDoKKyAgICAgIEVycm9yRXhpdCgiTm8gdmFsaWQgcGF0Y2hlcyBmb3VuZCBpbiBvdXRwdXQgZnJvbSBzdm4gZGlmZiIpCisgICAgcmV0dXJuIGRhdGEKKworICBkZWYgX0NvbGxhcHNlS2V5d29yZHMoc2VsZiwgY29udGVudCwga2V5d29yZF9zdHIpOgorICAgICIiIkNvbGxhcHNlcyBTVk4ga2V5d29yZHMuIiIiCisgICAgIyBzdm4gY2F0IHRyYW5zbGF0ZXMga2V5d29yZHMgYnV0IHN2biBkaWZmIGRvZXNuJ3QuIEFzIGEgcmVzdWx0IG9mIHRoaXMKKyAgICAjIGJlaGF2aW9yIHBhdGNoaW5nLlBhdGNoQ2h1bmtzKCkgZmFpbHMgd2l0aCBhIGNodW5rIG1pc21hdGNoIGVycm9yLgorICAgICMgVGhpcyBwYXJ0IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgdGhlIFJldmlldyBCb2FyZCBkZXZlbG9wbWVudCB0ZWFtCisgICAgIyB3aG8gaGFkIHRoZSBzYW1lIHByb2JsZW0gKGh0dHA6Ly9yZXZpZXdzLnJldmlldy1ib2FyZC5vcmcvci8yNzYvKS4KKyAgICAjIE1hcHBpbmcgb2Yga2V5d29yZHMgdG8ga25vd24gYWxpYXNlcworICAgIHN2bl9rZXl3b3JkcyA9IHsKKyAgICAgICMgU3RhbmRhcmQga2V5d29yZHMKKyAgICAgICdEYXRlJzogICAgICAgICAgICAgICAgWydEYXRlJywgJ0xhc3RDaGFuZ2VkRGF0ZSddLAorICAgICAgJ1JldmlzaW9uJzogICAgICAgICAgICBbJ1JldmlzaW9uJywgJ0xhc3RDaGFuZ2VkUmV2aXNpb24nLCAnUmV2J10sCisgICAgICAnQXV0aG9yJzogICAgICAgICAgICAgIFsnQXV0aG9yJywgJ0xhc3RDaGFuZ2VkQnknXSwKKyAgICAgICdIZWFkVVJMJzogICAgICAgICAgICAgWydIZWFkVVJMJywgJ1VSTCddLAorICAgICAgJ0lkJzogICAgICAgICAgICAgICAgICBbJ0lkJ10sCisKKyAgICAgICMgQWxpYXNlcworICAgICAgJ0xhc3RDaGFuZ2VkRGF0ZSc6ICAgICBbJ0xhc3RDaGFuZ2VkRGF0ZScsICdEYXRlJ10sCisgICAgICAnTGFzdENoYW5nZWRSZXZpc2lvbic6IFsnTGFzdENoYW5nZWRSZXZpc2lvbicsICdSZXYnLCAnUmV2aXNpb24nXSwKKyAgICAgICdMYXN0Q2hhbmdlZEJ5JzogICAgICAgWydMYXN0Q2hhbmdlZEJ5JywgJ0F1dGhvciddLAorICAgICAgJ1VSTCc6ICAgICAgICAgICAgICAgICBbJ1VSTCcsICdIZWFkVVJMJ10sCisgICAgfQorCisgICAgZGVmIHJlcGwobSk6CisgICAgICAgaWYgbS5ncm91cCgyKToKKyAgICAgICAgIHJldHVybiAiJCVzOjolcyQiICUgKG0uZ3JvdXAoMSksICIgIiAqIGxlbihtLmdyb3VwKDMpKSkKKyAgICAgICByZXR1cm4gIiQlcyQiICUgbS5ncm91cCgxKQorICAgIGtleXdvcmRzID0gW2tleXdvcmQKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBrZXl3b3JkX3N0ci5zcGxpdCgiICIpCisgICAgICAgICAgICAgICAgZm9yIGtleXdvcmQgaW4gc3ZuX2tleXdvcmRzLmdldChuYW1lLCBbXSldCisgICAgcmV0dXJuIHJlLnN1YihyIlwkKCVzKTooOj8pKFteXCRdKylcJCIgJSAnfCcuam9pbihrZXl3b3JkcyksIHJlcGwsIGNvbnRlbnQpCisKKyAgZGVmIEdldFVua25vd25GaWxlcyhzZWxmKToKKyAgICBzdGF0dXMgPSBSdW5TaGVsbChbInN2biIsICJzdGF0dXMiLCAiLS1pZ25vcmUtZXh0ZXJuYWxzIl0sIHNpbGVudF9vaz1UcnVlKQorICAgIHVua25vd25fZmlsZXMgPSBbXQorICAgIGZvciBsaW5lIGluIHN0YXR1cy5zcGxpdCgiXG4iKToKKyAgICAgIGlmIGxpbmUgYW5kIGxpbmVbMF0gPT0gIj8iOgorICAgICAgICB1bmtub3duX2ZpbGVzLmFwcGVuZChsaW5lKQorICAgIHJldHVybiB1bmtub3duX2ZpbGVzCisKKyAgZGVmIFJlYWRGaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhIGZpbGUuIiIiCisgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUsICdyYicpCisgICAgcmVzdWx0ID0gIiIKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBmaWxlLnJlYWQoKQorICAgIGZpbmFsbHk6CisgICAgICBmaWxlLmNsb3NlKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIEdldFN0YXR1cyhzZWxmLCBmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJucyB0aGUgc3RhdHVzIG9mIGEgZmlsZS4iIiIKKyAgICBpZiBub3Qgc2VsZi5vcHRpb25zLnJldmlzaW9uOgorICAgICAgc3RhdHVzID0gUnVuU2hlbGwoWyJzdm4iLCAic3RhdHVzIiwgIi0taWdub3JlLWV4dGVybmFscyIsIGZpbGVuYW1lXSkKKyAgICAgIGlmIG5vdCBzdGF0dXM6CisgICAgICAgIEVycm9yRXhpdCgic3ZuIHN0YXR1cyByZXR1cm5lZCBubyBvdXRwdXQgZm9yICVzIiAlIGZpbGVuYW1lKQorICAgICAgc3RhdHVzX2xpbmVzID0gc3RhdHVzLnNwbGl0bGluZXMoKQorICAgICAgIyBJZiBmaWxlIGlzIGluIGEgY2wsIHRoZSBvdXRwdXQgd2lsbCBiZWdpbiB3aXRoCisgICAgICAjICJcbi0tLSBDaGFuZ2VsaXN0ICdjbF9uYW1lJzpcbiIuICBTZWUKKyAgICAgICMgaHR0cDovL3N2bi5jb2xsYWIubmV0L3JlcG9zL3N2bi90cnVuay9ub3Rlcy9jaGFuZ2VsaXN0LWRlc2lnbi50eHQKKyAgICAgIGlmIChsZW4oc3RhdHVzX2xpbmVzKSA9PSAzIGFuZAorICAgICAgICAgIG5vdCBzdGF0dXNfbGluZXNbMF0gYW5kCisgICAgICAgICAgc3RhdHVzX2xpbmVzWzFdLnN0YXJ0c3dpdGgoIi0tLSBDaGFuZ2VsaXN0IikpOgorICAgICAgICBzdGF0dXMgPSBzdGF0dXNfbGluZXNbMl0KKyAgICAgIGVsc2U6CisgICAgICAgIHN0YXR1cyA9IHN0YXR1c19saW5lc1swXQorICAgICMgSWYgd2UgaGF2ZSBhIHJldmlzaW9uIHRvIGRpZmYgYWdhaW5zdCB3ZSBuZWVkIHRvIHJ1biAic3ZuIGxpc3QiCisgICAgIyBmb3IgdGhlIG9sZCBhbmQgdGhlIG5ldyByZXZpc2lvbiBhbmQgY29tcGFyZSB0aGUgcmVzdWx0cyB0byBnZXQKKyAgICAjIHRoZSBjb3JyZWN0IHN0YXR1cyBmb3IgYSBmaWxlLgorICAgIGVsc2U6CisgICAgICBkaXJuYW1lLCByZWxmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCisgICAgICBpZiBkaXJuYW1lIG5vdCBpbiBzZWxmLnN2bmxzX2NhY2hlOgorICAgICAgICBjbWQgPSBbInN2biIsICJsaXN0IiwgIi1yIiwgc2VsZi5yZXZfc3RhcnQsIGRpcm5hbWUgb3IgIi4iXQorICAgICAgICBvdXQsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNtZCkKKyAgICAgICAgaWYgcmV0dXJuY29kZToKKyAgICAgICAgICBFcnJvckV4aXQoIkZhaWxlZCB0byBnZXQgc3RhdHVzIGZvciAlcy4iICUgZmlsZW5hbWUpCisgICAgICAgIG9sZF9maWxlcyA9IG91dC5zcGxpdGxpbmVzKCkKKyAgICAgICAgYXJncyA9IFsic3ZuIiwgImxpc3QiXQorICAgICAgICBpZiBzZWxmLnJldl9lbmQ6CisgICAgICAgICAgYXJncyArPSBbIi1yIiwgc2VsZi5yZXZfZW5kXQorICAgICAgICBjbWQgPSBhcmdzICsgW2Rpcm5hbWUgb3IgIi4iXQorICAgICAgICBvdXQsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNtZCkKKyAgICAgICAgaWYgcmV0dXJuY29kZToKKyAgICAgICAgICBFcnJvckV4aXQoIkZhaWxlZCB0byBydW4gY29tbWFuZCAlcyIgJSBjbWQpCisgICAgICAgIHNlbGYuc3ZubHNfY2FjaGVbZGlybmFtZV0gPSAob2xkX2ZpbGVzLCBvdXQuc3BsaXRsaW5lcygpKQorICAgICAgb2xkX2ZpbGVzLCBuZXdfZmlsZXMgPSBzZWxmLnN2bmxzX2NhY2hlW2Rpcm5hbWVdCisgICAgICBpZiByZWxmaWxlbmFtZSBpbiBvbGRfZmlsZXMgYW5kIHJlbGZpbGVuYW1lIG5vdCBpbiBuZXdfZmlsZXM6CisgICAgICAgIHN0YXR1cyA9ICJEICAgIgorICAgICAgZWxpZiByZWxmaWxlbmFtZSBpbiBvbGRfZmlsZXMgYW5kIHJlbGZpbGVuYW1lIGluIG5ld19maWxlczoKKyAgICAgICAgc3RhdHVzID0gIk0gICAiCisgICAgICBlbHNlOgorICAgICAgICBzdGF0dXMgPSAiQSAgICIKKyAgICByZXR1cm4gc3RhdHVzCisKKyAgZGVmIEdldEJhc2VGaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICBzdGF0dXMgPSBzZWxmLkdldFN0YXR1cyhmaWxlbmFtZSkKKyAgICBiYXNlX2NvbnRlbnQgPSBOb25lCisgICAgbmV3X2NvbnRlbnQgPSBOb25lCisKKyAgICAjIElmIGEgZmlsZSBpcyBjb3BpZWQgaXRzIHN0YXR1cyB3aWxsIGJlICJBICArIiwgd2hpY2ggc2lnbmlmaWVzCisgICAgIyAiYWRkaXRpb24td2l0aC1oaXN0b3J5Ii4gIFNlZSAic3ZuIHN0IiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIFdlIG5lZWQgdG8KKyAgICAjIHVwbG9hZCB0aGUgb3JpZ2luYWwgZmlsZSBvciBlbHNlIGRpZmYgcGFyc2luZyB3aWxsIGZhaWwgaWYgdGhlIGZpbGUgd2FzCisgICAgIyBlZGl0ZWQuCisgICAgaWYgc3RhdHVzWzBdID09ICJBIiBhbmQgc3RhdHVzWzNdICE9ICIrIjoKKyAgICAgICMgV2UnbGwgbmVlZCB0byB1cGxvYWQgdGhlIG5ldyBjb250ZW50IGlmIHdlJ3JlIGFkZGluZyBhIGJpbmFyeSBmaWxlCisgICAgICAjIHNpbmNlIGRpZmYncyBvdXRwdXQgd29uJ3QgY29udGFpbiBpdC4KKyAgICAgIG1pbWV0eXBlID0gUnVuU2hlbGwoWyJzdm4iLCAicHJvcGdldCIsICJzdm46bWltZS10eXBlIiwgZmlsZW5hbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICAgIGJhc2VfY29udGVudCA9ICIiCisgICAgICBpc19iaW5hcnkgPSBtaW1ldHlwZSBhbmQgbm90IG1pbWV0eXBlLnN0YXJ0c3dpdGgoInRleHQvIikKKyAgICAgIGlmIGlzX2JpbmFyeSBhbmQgc2VsZi5Jc0ltYWdlKGZpbGVuYW1lKToKKyAgICAgICAgbmV3X2NvbnRlbnQgPSBzZWxmLlJlYWRGaWxlKGZpbGVuYW1lKQorICAgIGVsaWYgKHN0YXR1c1swXSBpbiAoIk0iLCAiRCIsICJSIikgb3IKKyAgICAgICAgICAoc3RhdHVzWzBdID09ICJBIiBhbmQgc3RhdHVzWzNdID09ICIrIikgb3IgICMgQ29waWVkIGZpbGUuCisgICAgICAgICAgKHN0YXR1c1swXSA9PSAiICIgYW5kIHN0YXR1c1sxXSA9PSAiTSIpKTogICMgUHJvcGVydHkgY2hhbmdlLgorICAgICAgYXJncyA9IFtdCisgICAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICAgIHVybCA9ICIlcy8lc0AlcyIgJSAoc2VsZi5zdm5fYmFzZSwgZmlsZW5hbWUsIHNlbGYucmV2X3N0YXJ0KQorICAgICAgZWxzZToKKyAgICAgICAgIyBEb24ndCBjaGFuZ2UgZmlsZW5hbWUsIGl0J3MgbmVlZGVkIGxhdGVyLgorICAgICAgICB1cmwgPSBmaWxlbmFtZQorICAgICAgICBhcmdzICs9IFsiLXIiLCAiQkFTRSJdCisgICAgICBjbWQgPSBbInN2biJdICsgYXJncyArIFsicHJvcGdldCIsICJzdm46bWltZS10eXBlIiwgdXJsXQorICAgICAgbWltZXR5cGUsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNtZCkKKyAgICAgIGlmIHJldHVybmNvZGU6CisgICAgICAgICMgRmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcmVxdWVzdGVkIHJldmlzaW9uLgorICAgICAgICAjIFJlc2V0IG1pbWV0eXBlLCBpdCBjb250YWlucyBhbiBlcnJvciBtZXNzYWdlLgorICAgICAgICBtaW1ldHlwZSA9ICIiCisgICAgICBnZXRfYmFzZSA9IEZhbHNlCisgICAgICBpc19iaW5hcnkgPSBtaW1ldHlwZSBhbmQgbm90IG1pbWV0eXBlLnN0YXJ0c3dpdGgoInRleHQvIikKKyAgICAgIGlmIHN0YXR1c1swXSA9PSAiICI6CisgICAgICAgICMgRW1wdHkgYmFzZSBjb250ZW50IGp1c3QgdG8gZm9yY2UgYW4gdXBsb2FkLgorICAgICAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgICAgZWxpZiBpc19iaW5hcnk6CisgICAgICAgIGlmIHNlbGYuSXNJbWFnZShmaWxlbmFtZSk6CisgICAgICAgICAgZ2V0X2Jhc2UgPSBUcnVlCisgICAgICAgICAgaWYgc3RhdHVzWzBdID09ICJNIjoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJldl9lbmQ6CisgICAgICAgICAgICAgIG5ld19jb250ZW50ID0gc2VsZi5SZWFkRmlsZShmaWxlbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgIHVybCA9ICIlcy8lc0AlcyIgJSAoc2VsZi5zdm5fYmFzZSwgZmlsZW5hbWUsIHNlbGYucmV2X2VuZCkKKyAgICAgICAgICAgICAgbmV3X2NvbnRlbnQgPSBSdW5TaGVsbChbInN2biIsICJjYXQiLCB1cmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLCBzaWxlbnRfb2s9VHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgICAgZWxzZToKKyAgICAgICAgZ2V0X2Jhc2UgPSBUcnVlCisKKyAgICAgIGlmIGdldF9iYXNlOgorICAgICAgICBpZiBpc19iaW5hcnk6CisgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXMgPSBUcnVlCisgICAgICAgIGlmIHNlbGYucmV2X3N0YXJ0OgorICAgICAgICAgICMgInN2biBjYXQgLXIgUkVWIGRlbGV0ZV9maWxlLnR4dCIgZG9lc24ndCB3b3JrLiBjYXQgcmVxdWlyZXMKKyAgICAgICAgICAjIHRoZSBmdWxsIFVSTCB3aXRoICJAUkVWIiBhcHBlbmRlZCBpbnN0ZWFkIG9mIHVzaW5nICItciIgb3B0aW9uLgorICAgICAgICAgIHVybCA9ICIlcy8lc0AlcyIgJSAoc2VsZi5zdm5fYmFzZSwgZmlsZW5hbWUsIHNlbGYucmV2X3N0YXJ0KQorICAgICAgICAgIGJhc2VfY29udGVudCA9IFJ1blNoZWxsKFsic3ZuIiwgImNhdCIsIHVybF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPXVuaXZlcnNhbF9uZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbInN2biIsICJjYXQiLCBmaWxlbmFtZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPXVuaXZlcnNhbF9uZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICAgICAgaWYgbm90IGlzX2JpbmFyeToKKyAgICAgICAgICBhcmdzID0gW10KKyAgICAgICAgICBpZiBzZWxmLnJldl9zdGFydDoKKyAgICAgICAgICAgIHVybCA9ICIlcy8lc0AlcyIgJSAoc2VsZi5zdm5fYmFzZSwgZmlsZW5hbWUsIHNlbGYucmV2X3N0YXJ0KQorICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1cmwgPSBmaWxlbmFtZQorICAgICAgICAgICAgYXJncyArPSBbIi1yIiwgIkJBU0UiXQorICAgICAgICAgIGNtZCA9IFsic3ZuIl0gKyBhcmdzICsgWyJwcm9wZ2V0IiwgInN2bjprZXl3b3JkcyIsIHVybF0KKyAgICAgICAgICBrZXl3b3JkcywgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoY21kKQorICAgICAgICAgIGlmIGtleXdvcmRzIGFuZCBub3QgcmV0dXJuY29kZToKKyAgICAgICAgICAgIGJhc2VfY29udGVudCA9IHNlbGYuX0NvbGxhcHNlS2V5d29yZHMoYmFzZV9jb250ZW50LCBrZXl3b3JkcykKKyAgICBlbHNlOgorICAgICAgU3RhdHVzVXBkYXRlKCJzdm4gc3RhdHVzIHJldHVybmVkIHVuZXhwZWN0ZWQgb3V0cHV0OiAlcyIgJSBzdGF0dXMpCisgICAgICBzeXMuZXhpdCgxKQorICAgIHJldHVybiBiYXNlX2NvbnRlbnQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1c1swOjVdCisKKworY2xhc3MgR2l0VkNTKFZlcnNpb25Db250cm9sU3lzdGVtKToKKyAgIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIFZlcnNpb25Db250cm9sU3lzdGVtIGludGVyZmFjZSBmb3IgR2l0LiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zKToKKyAgICBzdXBlcihHaXRWQ1MsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMpCisgICAgIyBNYXAgb2YgZmlsZW5hbWUgLT4gaGFzaCBvZiBiYXNlIGZpbGUuCisgICAgc2VsZi5iYXNlX2hhc2hlcyA9IHt9CisKKyAgZGVmIEdlbmVyYXRlRGlmZihzZWxmLCBleHRyYV9hcmdzKToKKyAgICAjIFRoaXMgaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIHN2bidzIEdlbmVyYXRlRGlmZiBiZWNhdXNlIHdlIG11c3QgY29udmVydAorICAgICMgdGhlIGRpZmYgb3V0cHV0IHRvIGluY2x1ZGUgYW4gc3ZuLXN0eWxlICJJbmRleDoiIGxpbmUgYXMgd2VsbCBhcyByZWNvcmQKKyAgICAjIHRoZSBoYXNoZXMgb2YgdGhlIGJhc2UgZmlsZXMsIHNvIHdlIGNhbiB1cGxvYWQgdGhlbSBhbG9uZyB3aXRoIG91ciBkaWZmLgorICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAgIGV4dHJhX2FyZ3MgPSBbc2VsZi5vcHRpb25zLnJldmlzaW9uXSArIGV4dHJhX2FyZ3MKKyAgICBnaXRkaWZmID0gUnVuU2hlbGwoWyJnaXQiLCAiZGlmZiIsICItLWZ1bGwtaW5kZXgiXSArIGV4dHJhX2FyZ3MpCisgICAgc3ZuZGlmZiA9IFtdCisgICAgZmlsZWNvdW50ID0gMAorICAgIGZpbGVuYW1lID0gTm9uZQorICAgIGZvciBsaW5lIGluIGdpdGRpZmYuc3BsaXRsaW5lcygpOgorICAgICAgbWF0Y2ggPSByZS5tYXRjaChyImRpZmYgLS1naXQgYS8oLiopIGIvLiokIiwgbGluZSkKKyAgICAgIGlmIG1hdGNoOgorICAgICAgICBmaWxlY291bnQgKz0gMQorICAgICAgICBmaWxlbmFtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIHN2bmRpZmYuYXBwZW5kKCJJbmRleDogJXNcbiIgJSBmaWxlbmFtZSkKKyAgICAgIGVsc2U6CisgICAgICAgICMgVGhlICJpbmRleCIgbGluZSBpbiBhIGdpdCBkaWZmIGxvb2tzIGxpa2UgdGhpcyAobG9uZyBoYXNoZXMgZWxpZGVkKToKKyAgICAgICAgIyAgIGluZGV4IDgyYzBkNDQuLmIyY2VlM2YgMTAwNzU1CisgICAgICAgICMgV2Ugd2FudCB0byBzYXZlIHRoZSBsZWZ0IGhhc2gsIGFzIHRoYXQgaWRlbnRpZmllcyB0aGUgYmFzZSBmaWxlLgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiaW5kZXggKFx3KylcLlwuIiwgbGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgc2VsZi5iYXNlX2hhc2hlc1tmaWxlbmFtZV0gPSBtYXRjaC5ncm91cCgxKQorICAgICAgc3ZuZGlmZi5hcHBlbmQobGluZSArICJcbiIpCisgICAgaWYgbm90IGZpbGVjb3VudDoKKyAgICAgIEVycm9yRXhpdCgiTm8gdmFsaWQgcGF0Y2hlcyBmb3VuZCBpbiBvdXRwdXQgZnJvbSBnaXQgZGlmZiIpCisgICAgcmV0dXJuICIiLmpvaW4oc3ZuZGlmZikKKworICBkZWYgR2V0VW5rbm93bkZpbGVzKHNlbGYpOgorICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsiZ2l0IiwgImxzLWZpbGVzIiwgIi0tZXhjbHVkZS1zdGFuZGFyZCIsICItLW90aGVycyJdLAorICAgICAgICAgICAgICAgICAgICAgIHNpbGVudF9vaz1UcnVlKQorICAgIHJldHVybiBzdGF0dXMuc3BsaXRsaW5lcygpCisKKyAgZGVmIEdldEJhc2VGaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICBoYXNoID0gc2VsZi5iYXNlX2hhc2hlc1tmaWxlbmFtZV0KKyAgICBiYXNlX2NvbnRlbnQgPSBOb25lCisgICAgbmV3X2NvbnRlbnQgPSBOb25lCisgICAgaXNfYmluYXJ5ID0gRmFsc2UKKyAgICBpZiBoYXNoID09ICIwIiAqIDQwOiAgIyBBbGwtemVybyBoYXNoIGluZGljYXRlcyBubyBiYXNlIGZpbGUuCisgICAgICBzdGF0dXMgPSAiQSIKKyAgICAgIGJhc2VfY29udGVudCA9ICIiCisgICAgZWxzZToKKyAgICAgIHN0YXR1cyA9ICJNIgorICAgICAgYmFzZV9jb250ZW50LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShbImdpdCIsICJzaG93IiwgaGFzaF0pCisgICAgICBpZiByZXR1cm5jb2RlOgorICAgICAgICBFcnJvckV4aXQoIkdvdCBlcnJvciBzdGF0dXMgZnJvbSAnZ2l0IHNob3cgJXMnIiAlIGhhc2gpCisgICAgcmV0dXJuIChiYXNlX2NvbnRlbnQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cykKKworCitjbGFzcyBNZXJjdXJpYWxWQ1MoVmVyc2lvbkNvbnRyb2xTeXN0ZW0pOgorICAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVmVyc2lvbkNvbnRyb2xTeXN0ZW0gaW50ZXJmYWNlIGZvciBNZXJjdXJpYWwuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMsIHJlcG9fZGlyKToKKyAgICBzdXBlcihNZXJjdXJpYWxWQ1MsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMpCisgICAgIyBBYnNvbHV0ZSBwYXRoIHRvIHJlcG9zaXRvcnkgKHdlIGNhbiBiZSBpbiBhIHN1YmRpcikKKyAgICBzZWxmLnJlcG9fZGlyID0gb3MucGF0aC5ub3JtcGF0aChyZXBvX2RpcikKKyAgICAjIENvbXB1dGUgdGhlIHN1YmRpcgorICAgIGN3ZCA9IG9zLnBhdGgubm9ybXBhdGgob3MuZ2V0Y3dkKCkpCisgICAgYXNzZXJ0IGN3ZC5zdGFydHN3aXRoKHNlbGYucmVwb19kaXIpCisgICAgc2VsZi5zdWJkaXIgPSBjd2RbbGVuKHNlbGYucmVwb19kaXIpOl0ubHN0cmlwKHIiXC8iKQorICAgIGlmIHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAgIHNlbGYuYmFzZV9yZXYgPSBzZWxmLm9wdGlvbnMucmV2aXNpb24KKyAgICBlbHNlOgorICAgICAgc2VsZi5iYXNlX3JldiA9IFJ1blNoZWxsKFsiaGciLCAicGFyZW50IiwgIi1xIl0pLnNwbGl0KCc6JylbMV0uc3RyaXAoKQorCisgIGRlZiBfR2V0UmVsUGF0aChzZWxmLCBmaWxlbmFtZSk6CisgICAgIiIiR2V0IHJlbGF0aXZlIHBhdGggb2YgYSBmaWxlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksCisgICAgZ2l2ZW4gaXRzIGxvZ2ljYWwgcGF0aCBpbiB0aGUgcmVwby4iIiIKKyAgICBhc3NlcnQgZmlsZW5hbWUuc3RhcnRzd2l0aChzZWxmLnN1YmRpciksIGZpbGVuYW1lCisgICAgcmV0dXJuIGZpbGVuYW1lW2xlbihzZWxmLnN1YmRpcik6XS5sc3RyaXAociJcLyIpCisKKyAgZGVmIEdlbmVyYXRlRGlmZihzZWxmLCBleHRyYV9hcmdzKToKKyAgICAjIElmIG5vIGZpbGUgc3BlY2lmaWVkLCByZXN0cmljdCB0byB0aGUgY3VycmVudCBzdWJkaXIKKyAgICBleHRyYV9hcmdzID0gZXh0cmFfYXJncyBvciBbIi4iXQorICAgIGNtZCA9IFsiaGciLCAiZGlmZiIsICItLWdpdCIsICItciIsIHNlbGYuYmFzZV9yZXZdICsgZXh0cmFfYXJncworICAgIGRhdGEgPSBSdW5TaGVsbChjbWQsIHNpbGVudF9vaz1UcnVlKQorICAgIHN2bmRpZmYgPSBbXQorICAgIGZpbGVjb3VudCA9IDAKKyAgICBmb3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMoKToKKyAgICAgIG0gPSByZS5tYXRjaCgiZGlmZiAtLWdpdCBhLyhcUyspIGIvKFxTKykiLCBsaW5lKQorICAgICAgaWYgbToKKyAgICAgICAgIyBNb2RpZnkgbGluZSB0byBtYWtlIGl0IGxvb2sgbGlrZSBhcyBpdCBjb21lcyBmcm9tIHN2biBkaWZmLgorICAgICAgICAjIFdpdGggdGhpcyBtb2RpZmljYXRpb24gbm8gY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUgYXJlIHJlcXVpcmVkCisgICAgICAgICMgdG8gbWFrZSB1cGxvYWQucHkgd29yayB3aXRoIE1lcmN1cmlhbCByZXBvcy4KKyAgICAgICAgIyBOT1RFOiBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mIG1vdmVkL2NvcGllZCBmaWxlcywgd2UgaGF2ZSB0byB1c2UKKyAgICAgICAgIyB0aGUgc2Vjb25kIGZpbGVuYW1lLgorICAgICAgICBmaWxlbmFtZSA9IG0uZ3JvdXAoMikKKyAgICAgICAgc3ZuZGlmZi5hcHBlbmQoIkluZGV4OiAlcyIgJSBmaWxlbmFtZSkKKyAgICAgICAgc3ZuZGlmZi5hcHBlbmQoIj0iICogNjcpCisgICAgICAgIGZpbGVjb3VudCArPSAxCisgICAgICAgIGxvZ2dpbmcuaW5mbyhsaW5lKQorICAgICAgZWxzZToKKyAgICAgICAgc3ZuZGlmZi5hcHBlbmQobGluZSkKKyAgICBpZiBub3QgZmlsZWNvdW50OgorICAgICAgRXJyb3JFeGl0KCJObyB2YWxpZCBwYXRjaGVzIGZvdW5kIGluIG91dHB1dCBmcm9tIGhnIGRpZmYiKQorICAgIHJldHVybiAiXG4iLmpvaW4oc3ZuZGlmZikgKyAiXG4iCisKKyAgZGVmIEdldFVua25vd25GaWxlcyhzZWxmKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGZpbGVzIHVua25vd24gdG8gdGhlIFZDUy4iIiIKKyAgICBhcmdzID0gW10KKyAgICBzdGF0dXMgPSBSdW5TaGVsbChbImhnIiwgInN0YXR1cyIsICItLXJldiIsIHNlbGYuYmFzZV9yZXYsICItdSIsICIuIl0sCisgICAgICAgIHNpbGVudF9vaz1UcnVlKQorICAgIHVua25vd25fZmlsZXMgPSBbXQorICAgIGZvciBsaW5lIGluIHN0YXR1cy5zcGxpdGxpbmVzKCk6CisgICAgICBzdCwgZm4gPSBsaW5lLnNwbGl0KCIgIiwgMSkKKyAgICAgIGlmIHN0ID09ICI/IjoKKyAgICAgICAgdW5rbm93bl9maWxlcy5hcHBlbmQoZm4pCisgICAgcmV0dXJuIHVua25vd25fZmlsZXMKKworICBkZWYgR2V0QmFzZUZpbGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICMgImhnIHN0YXR1cyIgYW5kICJoZyBjYXQiIGJvdGggdGFrZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc3ViZGlyCisgICAgIyByYXRoZXIgdGhhbiB0byB0aGUgcmVwbyByb290LCBidXQgImhnIGRpZmYiIGhhcyBnaXZlbiB1cyB0aGUgZnVsbCBwYXRoCisgICAgIyB0byB0aGUgcmVwbyByb290LgorICAgIGJhc2VfY29udGVudCA9ICIiCisgICAgbmV3X2NvbnRlbnQgPSBOb25lCisgICAgaXNfYmluYXJ5ID0gRmFsc2UKKyAgICBvbGRyZWxwYXRoID0gcmVscGF0aCA9IHNlbGYuX0dldFJlbFBhdGgoZmlsZW5hbWUpCisgICAgIyAiaGcgc3RhdHVzIC1DIiByZXR1cm5zIHR3byBsaW5lcyBmb3IgbW92ZWQvY29waWVkIGZpbGVzLCBvbmUgb3RoZXJ3aXNlCisgICAgb3V0ID0gUnVuU2hlbGwoWyJoZyIsICJzdGF0dXMiLCAiLUMiLCAiLS1yZXYiLCBzZWxmLmJhc2VfcmV2LCByZWxwYXRoXSkKKyAgICBvdXQgPSBvdXQuc3BsaXRsaW5lcygpCisgICAgIyBIQUNLOiBzdHJpcCBlcnJvciBtZXNzYWdlIGFib3V0IG1pc3NpbmcgZmlsZS9kaXJlY3RvcnkgaWYgaXQgaXNuJ3QgaW4KKyAgICAjIHRoZSB3b3JraW5nIGNvcHkKKyAgICBpZiBvdXRbMF0uc3RhcnRzd2l0aCgnJXM6ICcgJSByZWxwYXRoKToKKyAgICAgIG91dCA9IG91dFsxOl0KKyAgICBpZiBsZW4ob3V0KSA+IDE6CisgICAgICAjIE1vdmVkL2NvcGllZCA9PiBjb25zaWRlcmVkIGFzIG1vZGlmaWVkLCB1c2Ugb2xkIGZpbGVuYW1lIHRvCisgICAgICAjIHJldHJpZXZlIGJhc2UgY29udGVudHMKKyAgICAgIG9sZHJlbHBhdGggPSBvdXRbMV0uc3RyaXAoKQorICAgICAgc3RhdHVzID0gIk0iCisgICAgZWxzZToKKyAgICAgIHN0YXR1cywgXyA9IG91dFswXS5zcGxpdCgnICcsIDEpCisgICAgaWYgc3RhdHVzICE9ICJBIjoKKyAgICAgIGJhc2VfY29udGVudCA9IFJ1blNoZWxsKFsiaGciLCAiY2F0IiwgIi1yIiwgc2VsZi5iYXNlX3Jldiwgb2xkcmVscGF0aF0sCisgICAgICAgIHNpbGVudF9vaz1UcnVlKQorICAgICAgaXNfYmluYXJ5ID0gIlwwIiBpbiBiYXNlX2NvbnRlbnQgICMgTWVyY3VyaWFsJ3MgaGV1cmlzdGljCisgICAgaWYgc3RhdHVzICE9ICJSIjoKKyAgICAgIG5ld19jb250ZW50ID0gb3BlbihyZWxwYXRoLCAicmIiKS5yZWFkKCkKKyAgICAgIGlzX2JpbmFyeSA9IGlzX2JpbmFyeSBvciAiXDAiIGluIG5ld19jb250ZW50CisgICAgaWYgaXNfYmluYXJ5IGFuZCBiYXNlX2NvbnRlbnQ6CisgICAgICAjIEZldGNoIGFnYWluIHdpdGhvdXQgY29udmVydGluZyBuZXdsaW5lcworICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hlbGwoWyJoZyIsICJjYXQiLCAiLXIiLCBzZWxmLmJhc2VfcmV2LCBvbGRyZWxwYXRoXSwKKyAgICAgICAgc2lsZW50X29rPVRydWUsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSkKKyAgICBpZiBub3QgaXNfYmluYXJ5IG9yIG5vdCBzZWxmLklzSW1hZ2UocmVscGF0aCk6CisgICAgICBuZXdfY29udGVudCA9IE5vbmUKKyAgICByZXR1cm4gYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMKKworCisjIE5PVEU6IFRoZSBTcGxpdFBhdGNoIGZ1bmN0aW9uIGlzIGR1cGxpY2F0ZWQgaW4gZW5naW5lLnB5LCBrZWVwIHRoZW0gaW4gc3luYy4KK2RlZiBTcGxpdFBhdGNoKGRhdGEpOgorICAiIiJTcGxpdHMgYSBwYXRjaCBpbnRvIHNlcGFyYXRlIHBpZWNlcyBmb3IgZWFjaCBmaWxlLgorCisgIEFyZ3M6CisgICAgZGF0YTogQSBzdHJpbmcgY29udGFpbmluZyB0aGUgb3V0cHV0IG9mIHN2biBkaWZmLgorCisgIFJldHVybnM6CisgICAgQSBsaXN0IG9mIDItdHVwbGUgKGZpbGVuYW1lLCB0ZXh0KSB3aGVyZSB0ZXh0IGlzIHRoZSBzdm4gZGlmZiBvdXRwdXQKKyAgICAgIHBlcnRhaW5pbmcgdG8gZmlsZW5hbWUuCisgICIiIgorICBwYXRjaGVzID0gW10KKyAgZmlsZW5hbWUgPSBOb25lCisgIGRpZmYgPSBbXQorICBmb3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMoVHJ1ZSk6CisgICAgbmV3X2ZpbGVuYW1lID0gTm9uZQorICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnSW5kZXg6Jyk6CisgICAgICB1bnVzZWQsIG5ld19maWxlbmFtZSA9IGxpbmUuc3BsaXQoJzonLCAxKQorICAgICAgbmV3X2ZpbGVuYW1lID0gbmV3X2ZpbGVuYW1lLnN0cmlwKCkKKyAgICBlbGlmIGxpbmUuc3RhcnRzd2l0aCgnUHJvcGVydHkgY2hhbmdlcyBvbjonKToKKyAgICAgIHVudXNlZCwgdGVtcF9maWxlbmFtZSA9IGxpbmUuc3BsaXQoJzonLCAxKQorICAgICAgIyBXaGVuIGEgZmlsZSBpcyBtb2RpZmllZCwgcGF0aHMgdXNlICcvJyBiZXR3ZWVuIGRpcmVjdG9yaWVzLCBob3dldmVyCisgICAgICAjIHdoZW4gYSBwcm9wZXJ0eSBpcyBtb2RpZmllZCAnXCcgaXMgdXNlZCBvbiBXaW5kb3dzLiAgTWFrZSB0aGVtIHRoZSBzYW1lCisgICAgICAjIG90aGVyd2lzZSB0aGUgZmlsZSBzaG93cyB1cCB0d2ljZS4KKyAgICAgIHRlbXBfZmlsZW5hbWUgPSB0ZW1wX2ZpbGVuYW1lLnN0cmlwKCkucmVwbGFjZSgnXFwnLCAnLycpCisgICAgICBpZiB0ZW1wX2ZpbGVuYW1lICE9IGZpbGVuYW1lOgorICAgICAgICAjIEZpbGUgaGFzIHByb3BlcnR5IGNoYW5nZXMgYnV0IG5vIG1vZGlmaWNhdGlvbnMsIGNyZWF0ZSBhIG5ldyBkaWZmLgorICAgICAgICBuZXdfZmlsZW5hbWUgPSB0ZW1wX2ZpbGVuYW1lCisgICAgaWYgbmV3X2ZpbGVuYW1lOgorICAgICAgaWYgZmlsZW5hbWUgYW5kIGRpZmY6CisgICAgICAgIHBhdGNoZXMuYXBwZW5kKChmaWxlbmFtZSwgJycuam9pbihkaWZmKSkpCisgICAgICBmaWxlbmFtZSA9IG5ld19maWxlbmFtZQorICAgICAgZGlmZiA9IFtsaW5lXQorICAgICAgY29udGludWUKKyAgICBpZiBkaWZmIGlzIG5vdCBOb25lOgorICAgICAgZGlmZi5hcHBlbmQobGluZSkKKyAgaWYgZmlsZW5hbWUgYW5kIGRpZmY6CisgICAgcGF0Y2hlcy5hcHBlbmQoKGZpbGVuYW1lLCAnJy5qb2luKGRpZmYpKSkKKyAgcmV0dXJuIHBhdGNoZXMKKworCitkZWYgVXBsb2FkU2VwYXJhdGVQYXRjaGVzKGlzc3VlLCBycGNfc2VydmVyLCBwYXRjaHNldCwgZGF0YSwgb3B0aW9ucyk6CisgICIiIlVwbG9hZHMgYSBzZXBhcmF0ZSBwYXRjaCBmb3IgZWFjaCBmaWxlIGluIHRoZSBkaWZmIG91dHB1dC4KKworICBSZXR1cm5zIGEgbGlzdCBvZiBbcGF0Y2hfa2V5LCBmaWxlbmFtZV0gZm9yIGVhY2ggZmlsZS4KKyAgIiIiCisgIHBhdGNoZXMgPSBTcGxpdFBhdGNoKGRhdGEpCisgIHJ2ID0gW10KKyAgZm9yIHBhdGNoIGluIHBhdGNoZXM6CisgICAgaWYgbGVuKHBhdGNoWzFdKSA+IE1BWF9VUExPQURfU0laRToKKyAgICAgIHByaW50ICgiTm90IHVwbG9hZGluZyB0aGUgcGF0Y2ggZm9yICIgKyBwYXRjaFswXSArCisgICAgICAgICAgICAgIiBiZWNhdXNlIHRoZSBmaWxlIGlzIHRvbyBsYXJnZS4iKQorICAgICAgY29udGludWUKKyAgICBmb3JtX2ZpZWxkcyA9IFsoImZpbGVuYW1lIiwgcGF0Y2hbMF0pXQorICAgIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJjb250ZW50X3VwbG9hZCIsICIxIikpCisgICAgZmlsZXMgPSBbKCJkYXRhIiwgImRhdGEuZGlmZiIsIHBhdGNoWzFdKV0KKyAgICBjdHlwZSwgYm9keSA9IEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZvcm1fZmllbGRzLCBmaWxlcykKKyAgICB1cmwgPSAiLyVkL3VwbG9hZF9wYXRjaC8lZCIgJSAoaW50KGlzc3VlKSwgaW50KHBhdGNoc2V0KSkKKyAgICBwcmludCAiVXBsb2FkaW5nIHBhdGNoIGZvciAiICsgcGF0Y2hbMF0KKyAgICByZXNwb25zZV9ib2R5ID0gcnBjX3NlcnZlci5TZW5kKHVybCwgYm9keSwgY29udGVudF90eXBlPWN0eXBlKQorICAgIGxpbmVzID0gcmVzcG9uc2VfYm9keS5zcGxpdGxpbmVzKCkKKyAgICBpZiBub3QgbGluZXMgb3IgbGluZXNbMF0gIT0gIk9LIjoKKyAgICAgIFN0YXR1c1VwZGF0ZSgiICAtLT4gJXMiICUgcmVzcG9uc2VfYm9keSkKKyAgICAgIHN5cy5leGl0KDEpCisgICAgcnYuYXBwZW5kKFtsaW5lc1sxXSwgcGF0Y2hbMF1dKQorICByZXR1cm4gcnYKKworCitkZWYgR3Vlc3NWQ1Mob3B0aW9ucyk6CisgICIiIkhlbHBlciB0byBndWVzcyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbS4KKworICBUaGlzIGV4YW1pbmVzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgZ3Vlc3NlcyB3aGljaCBWZXJzaW9uQ29udHJvbFN5c3RlbQorICB3ZSdyZSB1c2luZywgYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGNsYXNzLiAgRXhpdCB3aXRoIGFuCisgIGVycm9yIGlmIHdlIGNhbid0IGZpZ3VyZSBpdCBvdXQuCisKKyAgUmV0dXJuczoKKyAgICBBIFZlcnNpb25Db250cm9sU3lzdGVtIGluc3RhbmNlLiBFeGl0cyBpZiB0aGUgVkNTIGNhbid0IGJlIGd1ZXNzZWQuCisgICIiIgorICAjIE1lcmN1cmlhbCBoYXMgYSBjb21tYW5kIHRvIGdldCB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgYSByZXBvc2l0b3J5CisgICMgVHJ5IHJ1bm5pbmcgaXQsIGJ1dCBkb24ndCBkaWUgaWYgd2UgZG9uJ3QgaGF2ZSBoZyBpbnN0YWxsZWQuCisgICMgTk9URTogd2UgdHJ5IE1lcmN1cmlhbCBmaXJzdCBhcyBpdCBjYW4gc2l0IG9uIHRvcCBvZiBhbiBTVk4gd29ya2luZyBjb3B5LgorICB0cnk6CisgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShbImhnIiwgInJvb3QiXSkKKyAgICBpZiByZXR1cm5jb2RlID09IDA6CisgICAgICByZXR1cm4gTWVyY3VyaWFsVkNTKG9wdGlvbnMsIG91dC5zdHJpcCgpKQorICBleGNlcHQgT1NFcnJvciwgKGVycm5vLCBtZXNzYWdlKToKKyAgICBpZiBlcnJubyAhPSAyOiAgIyBFTk9FTlQgLS0gdGhleSBkb24ndCBoYXZlIGhnIGluc3RhbGxlZC4KKyAgICAgIHJhaXNlCisKKyAgIyBTdWJ2ZXJzaW9uIGhhcyBhIC5zdm4gaW4gYWxsIHdvcmtpbmcgZGlyZWN0b3JpZXMuCisgIGlmIG9zLnBhdGguaXNkaXIoJy5zdm4nKToKKyAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgVkNTID0gU3VidmVyc2lvbiIpCisgICAgcmV0dXJuIFN1YnZlcnNpb25WQ1Mob3B0aW9ucykKKworICAjIEdpdCBoYXMgYSBjb21tYW5kIHRvIHRlc3QgaWYgeW91J3JlIGluIGEgZ2l0IHRyZWUuCisgICMgVHJ5IHJ1bm5pbmcgaXQsIGJ1dCBkb24ndCBkaWUgaWYgd2UgZG9uJ3QgaGF2ZSBnaXQgaW5zdGFsbGVkLgorICB0cnk6CisgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShbImdpdCIsICJyZXYtcGFyc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWlzLWluc2lkZS13b3JrLXRyZWUiXSkKKyAgICBpZiByZXR1cm5jb2RlID09IDA6CisgICAgICByZXR1cm4gR2l0VkNTKG9wdGlvbnMpCisgIGV4Y2VwdCBPU0Vycm9yLCAoZXJybm8sIG1lc3NhZ2UpOgorICAgIGlmIGVycm5vICE9IDI6ICAjIEVOT0VOVCAtLSB0aGV5IGRvbid0IGhhdmUgZ2l0IGluc3RhbGxlZC4KKyAgICAgIHJhaXNlCisKKyAgRXJyb3JFeGl0KCgiQ291bGQgbm90IGd1ZXNzIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uICIKKyAgICAgICAgICAgICAiQXJlIHlvdSBpbiBhIHdvcmtpbmcgY29weSBkaXJlY3Rvcnk/IikpCisKKworZGVmIFJlYWxNYWluKGFyZ3YsIGRhdGE9Tm9uZSk6CisgICIiIlRoZSByZWFsIG1haW4gZnVuY3Rpb24uCisKKyAgQXJnczoKKyAgICBhcmd2OiBDb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgIGRhdGE6IERpZmYgY29udGVudHMuIElmIE5vbmUgKGRlZmF1bHQpIHRoZSBkaWZmIGlzIGdlbmVyYXRlZCBieQorICAgICAgdGhlIFZlcnNpb25Db250cm9sU3lzdGVtIGltcGxlbWVudGF0aW9uIHJldHVybmVkIGJ5IEd1ZXNzVkNTKCkuCisKKyAgUmV0dXJuczoKKyAgICBBIDItdHVwbGUgKGlzc3VlIGlkLCBwYXRjaHNldCBpZCkuCisgICAgVGhlIHBhdGNoc2V0IGlkIGlzIE5vbmUgaWYgdGhlIGJhc2UgZmlsZXMgYXJlIG5vdCB1cGxvYWRlZCBieSB0aGlzCisgICAgc2NyaXB0IChhcHBsaWVzIG9ubHkgdG8gU1ZOIGNoZWNrb3V0cykuCisgICIiIgorICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZvcm1hdD0oIiUoYXNjdGltZSkuMTlzICUobGV2ZWxuYW1lKXMgJShmaWxlbmFtZSlzOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlKGxpbmVubylzICUobWVzc2FnZSlzICIpKQorICBvcy5lbnZpcm9uWydMQ19BTEwnXSA9ICdDJworICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndlsxOl0pCisgIGdsb2JhbCB2ZXJib3NpdHkKKyAgdmVyYm9zaXR5ID0gb3B0aW9ucy52ZXJib3NlCisgIGlmIHZlcmJvc2l0eSA+PSAzOgorICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCkuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKKyAgZWxpZiB2ZXJib3NpdHkgPj0gMjoKKyAgICBsb2dnaW5nLmdldExvZ2dlcigpLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgdmNzID0gR3Vlc3NWQ1Mob3B0aW9ucykKKyAgaWYgaXNpbnN0YW5jZSh2Y3MsIFN1YnZlcnNpb25WQ1MpOgorICAgICMgYmFzZSBmaWVsZCBpcyBvbmx5IGFsbG93ZWQgZm9yIFN1YnZlcnNpb24uCisgICAgIyBOb3RlOiBGZXRjaGluZyBiYXNlIGZpbGVzIG1heSBiZWNvbWUgZGVwcmVjYXRlZCBpbiBmdXR1cmUgcmVsZWFzZXMuCisgICAgYmFzZSA9IHZjcy5HdWVzc0Jhc2Uob3B0aW9ucy5kb3dubG9hZF9iYXNlKQorICBlbHNlOgorICAgIGJhc2UgPSBOb25lCisgIGlmIG5vdCBiYXNlIGFuZCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgb3B0aW9ucy5kb3dubG9hZF9iYXNlID0gVHJ1ZQorICAgIGxvZ2dpbmcuaW5mbygiRW5hYmxlZCB1cGxvYWQgb2YgYmFzZSBmaWxlIikKKyAgaWYgbm90IG9wdGlvbnMuYXNzdW1lX3llczoKKyAgICB2Y3MuQ2hlY2tGb3JVbmtub3duRmlsZXMoKQorICBpZiBkYXRhIGlzIE5vbmU6CisgICAgZGF0YSA9IHZjcy5HZW5lcmF0ZURpZmYoYXJncykKKyAgZmlsZXMgPSB2Y3MuR2V0QmFzZUZpbGVzKGRhdGEpCisgIGlmIHZlcmJvc2l0eSA+PSAxOgorICAgIHByaW50ICJVcGxvYWQgc2VydmVyOiIsIG9wdGlvbnMuc2VydmVyLCAiKGNoYW5nZSB3aXRoIC1zLy0tc2VydmVyKSIKKyAgaWYgb3B0aW9ucy5pc3N1ZToKKyAgICBwcm9tcHQgPSAiTWVzc2FnZSBkZXNjcmliaW5nIHRoaXMgcGF0Y2ggc2V0OiAiCisgIGVsc2U6CisgICAgcHJvbXB0ID0gIk5ldyBpc3N1ZSBzdWJqZWN0OiAiCisgIG1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2Ugb3IgcmF3X2lucHV0KHByb21wdCkuc3RyaXAoKQorICBpZiBub3QgbWVzc2FnZToKKyAgICBFcnJvckV4aXQoIkEgbm9uLWVtcHR5IG1lc3NhZ2UgaXMgcmVxdWlyZWQiKQorICBycGNfc2VydmVyID0gR2V0UnBjU2VydmVyKG9wdGlvbnMpCisgIGZvcm1fZmllbGRzID0gWygic3ViamVjdCIsIG1lc3NhZ2UpXQorICBpZiBiYXNlOgorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImJhc2UiLCBiYXNlKSkKKyAgaWYgb3B0aW9ucy5pc3N1ZToKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJpc3N1ZSIsIHN0cihvcHRpb25zLmlzc3VlKSkpCisgIGlmIG9wdGlvbnMuZW1haWw6CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgidXNlciIsIG9wdGlvbnMuZW1haWwpKQorICBpZiBvcHRpb25zLnJldmlld2VyczoKKyAgICBmb3IgcmV2aWV3ZXIgaW4gb3B0aW9ucy5yZXZpZXdlcnMuc3BsaXQoJywnKToKKyAgICAgIGlmICJAIiBpbiByZXZpZXdlciBhbmQgbm90IHJldmlld2VyLnNwbGl0KCJAIilbMV0uY291bnQoIi4iKSA9PSAxOgorICAgICAgICBFcnJvckV4aXQoIkludmFsaWQgZW1haWwgYWRkcmVzczogJXMiICUgcmV2aWV3ZXIpCisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgicmV2aWV3ZXJzIiwgb3B0aW9ucy5yZXZpZXdlcnMpKQorICBpZiBvcHRpb25zLmNjOgorICAgIGZvciBjYyBpbiBvcHRpb25zLmNjLnNwbGl0KCcsJyk6CisgICAgICBpZiAiQCIgaW4gY2MgYW5kIG5vdCBjYy5zcGxpdCgiQCIpWzFdLmNvdW50KCIuIikgPT0gMToKKyAgICAgICAgRXJyb3JFeGl0KCJJbnZhbGlkIGVtYWlsIGFkZHJlc3M6ICVzIiAlIGNjKQorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImNjIiwgb3B0aW9ucy5jYykpCisgIGRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbgorICBpZiBvcHRpb25zLmRlc2NyaXB0aW9uX2ZpbGU6CisgICAgaWYgb3B0aW9ucy5kZXNjcmlwdGlvbjoKKyAgICAgIEVycm9yRXhpdCgiQ2FuJ3Qgc3BlY2lmeSBkZXNjcmlwdGlvbiBhbmQgZGVzY3JpcHRpb25fZmlsZSIpCisgICAgZmlsZSA9IG9wZW4ob3B0aW9ucy5kZXNjcmlwdGlvbl9maWxlLCAncicpCisgICAgZGVzY3JpcHRpb24gPSBmaWxlLnJlYWQoKQorICAgIGZpbGUuY2xvc2UoKQorICBpZiBkZXNjcmlwdGlvbjoKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKSkKKyAgIyBTZW5kIGEgaGFzaCBvZiBhbGwgdGhlIGJhc2UgZmlsZSBzbyB0aGUgc2VydmVyIGNhbiBkZXRlcm1pbmUgaWYgYSBjb3B5CisgICMgYWxyZWFkeSBleGlzdHMgaW4gYW4gZWFybGllciBwYXRjaHNldC4KKyAgYmFzZV9oYXNoZXMgPSAiIgorICBmb3IgZmlsZSwgaW5mbyBpbiBmaWxlcy5pdGVyaXRlbXMoKToKKyAgICBpZiBub3QgaW5mb1swXSBpcyBOb25lOgorICAgICAgY2hlY2tzdW0gPSBtZDUubmV3KGluZm9bMF0pLmhleGRpZ2VzdCgpCisgICAgICBpZiBiYXNlX2hhc2hlczoKKyAgICAgICAgYmFzZV9oYXNoZXMgKz0gInwiCisgICAgICBiYXNlX2hhc2hlcyArPSBjaGVja3N1bSArICI6IiArIGZpbGUKKyAgZm9ybV9maWVsZHMuYXBwZW5kKCgiYmFzZV9oYXNoZXMiLCBiYXNlX2hhc2hlcykpCisgICMgSWYgd2UncmUgdXBsb2FkaW5nIGJhc2UgZmlsZXMsIGRvbid0IHNlbmQgdGhlIGVtYWlsIGJlZm9yZSB0aGUgdXBsb2Fkcywgc28KKyAgIyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBmaWxlIHN0YXR1cy4KKyAgaWYgb3B0aW9ucy5zZW5kX21haWwgYW5kIG9wdGlvbnMuZG93bmxvYWRfYmFzZToKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJzZW5kX21haWwiLCAiMSIpKQorICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImNvbnRlbnRfdXBsb2FkIiwgIjEiKSkKKyAgaWYgbGVuKGRhdGEpID4gTUFYX1VQTE9BRF9TSVpFOgorICAgIHByaW50ICJQYXRjaCBpcyBsYXJnZSwgc28gdXBsb2FkaW5nIGZpbGUgcGF0Y2hlcyBzZXBhcmF0ZWx5LiIKKyAgICB1cGxvYWRlZF9kaWZmX2ZpbGUgPSBbXQorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInNlcGFyYXRlX3BhdGNoZXMiLCAiMSIpKQorICBlbHNlOgorICAgIHVwbG9hZGVkX2RpZmZfZmlsZSA9IFsoImRhdGEiLCAiZGF0YS5kaWZmIiwgZGF0YSldCisgIGN0eXBlLCBib2R5ID0gRW5jb2RlTXVsdGlwYXJ0Rm9ybURhdGEoZm9ybV9maWVsZHMsIHVwbG9hZGVkX2RpZmZfZmlsZSkKKyAgcmVzcG9uc2VfYm9keSA9IHJwY19zZXJ2ZXIuU2VuZCgiL3VwbG9hZCIsIGJvZHksIGNvbnRlbnRfdHlwZT1jdHlwZSkKKyAgcGF0Y2hzZXQgPSBOb25lCisgIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2Ugb3Igbm90IHVwbG9hZGVkX2RpZmZfZmlsZToKKyAgICBsaW5lcyA9IHJlc3BvbnNlX2JvZHkuc3BsaXRsaW5lcygpCisgICAgaWYgbGVuKGxpbmVzKSA+PSAyOgorICAgICAgbXNnID0gbGluZXNbMF0KKyAgICAgIHBhdGNoc2V0ID0gbGluZXNbMV0uc3RyaXAoKQorICAgICAgcGF0Y2hlcyA9IFt4LnNwbGl0KCIgIiwgMSkgZm9yIHggaW4gbGluZXNbMjpdXQorICAgIGVsc2U6CisgICAgICBtc2cgPSByZXNwb25zZV9ib2R5CisgIGVsc2U6CisgICAgbXNnID0gcmVzcG9uc2VfYm9keQorICBTdGF0dXNVcGRhdGUobXNnKQorICBpZiBub3QgcmVzcG9uc2VfYm9keS5zdGFydHN3aXRoKCJJc3N1ZSBjcmVhdGVkLiIpIGFuZCBcCisgIG5vdCByZXNwb25zZV9ib2R5LnN0YXJ0c3dpdGgoIklzc3VlIHVwZGF0ZWQuIik6CisgICAgc3lzLmV4aXQoMCkKKyAgaXNzdWUgPSBtc2dbbXNnLnJmaW5kKCIvIikrMTpdCisKKyAgaWYgbm90IHVwbG9hZGVkX2RpZmZfZmlsZToKKyAgICByZXN1bHQgPSBVcGxvYWRTZXBhcmF0ZVBhdGNoZXMoaXNzdWUsIHJwY19zZXJ2ZXIsIHBhdGNoc2V0LCBkYXRhLCBvcHRpb25zKQorICAgIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgICBwYXRjaGVzID0gcmVzdWx0CisKKyAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZToKKyAgICB2Y3MuVXBsb2FkQmFzZUZpbGVzKGlzc3VlLCBycGNfc2VydmVyLCBwYXRjaGVzLCBwYXRjaHNldCwgb3B0aW9ucywgZmlsZXMpCisgICAgaWYgb3B0aW9ucy5zZW5kX21haWw6CisgICAgICBycGNfc2VydmVyLlNlbmQoIi8iICsgaXNzdWUgKyAiL21haWwiLCBwYXlsb2FkPSIiKQorICByZXR1cm4gaXNzdWUsIHBhdGNoc2V0CisKKworZGVmIG1haW4oKToKKyAgdHJ5OgorICAgIFJlYWxNYWluKHN5cy5hcmd2KQorICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgcHJpbnQKKyAgICBTdGF0dXNVcGRhdGUoIkludGVycnVwdGVkLiIpCisgICAgc3lzLmV4aXQoMSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL3VwbG9hZF9nbW9jay5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zY3JpcHRzL3VwbG9hZF9nbW9jay5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZGM0ODRiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NjcmlwdHMvdXBsb2FkX2dtb2NrLnB5CkBAIC0wLDAgKzEsNzggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiInVwbG9hZF9nbW9jay5weSB2MC4xLjAgLS0gdXBsb2FkcyBhIEdvb2dsZSBNb2NrIHBhdGNoIGZvciByZXZpZXcuCisKK1RoaXMgc2ltcGxlIHdyYXBwZXIgcGFzc2VzIGFsbCBjb21tYW5kIGxpbmUgZmxhZ3MgYW5kCistLWNjPWdvb2dsZW1vY2tAZ29vZ2xlZ3JvdXBzLmNvbSB0byB1cGxvYWQucHkuCisKK1VTQUdFOiB1cGxvYWRfZ21vY2sucHkgW29wdGlvbnMgZm9yIHVwbG9hZC5weV0KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworQ0NfRkxBRyA9ICctLWNjPScKK0dNT0NLX0dST1VQID0gJ2dvb2dsZW1vY2tAZ29vZ2xlZ3JvdXBzLmNvbScKKworCitkZWYgbWFpbigpOgorICAjIEZpbmRzIHRoZSBwYXRoIHRvIHVwbG9hZC5weSwgYXNzdW1pbmcgaXQgaXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CisgICMgYXMgdGhpcyBmaWxlLgorICBteV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKKyAgdXBsb2FkX3B5X3BhdGggPSBvcy5wYXRoLmpvaW4obXlfZGlyLCAndXBsb2FkLnB5JykKKworICAjIEFkZHMgR29vZ2xlIE1vY2sgZGlzY3Vzc2lvbiBncm91cCB0byB0aGUgY2MgbGluZSBpZiBpdCdzIG5vdCB0aGVyZQorICAjIGFscmVhZHkuCisgIHVwbG9hZF9weV9hcmd2ID0gW3VwbG9hZF9weV9wYXRoXQorICBmb3VuZF9jY19mbGFnID0gRmFsc2UKKyAgZm9yIGFyZyBpbiBzeXMuYXJndlsxOl06CisgICAgaWYgYXJnLnN0YXJ0c3dpdGgoQ0NfRkxBRyk6CisgICAgICBmb3VuZF9jY19mbGFnID0gVHJ1ZQorICAgICAgY2NfbGluZSA9IGFyZ1tsZW4oQ0NfRkxBRyk6XQorICAgICAgY2NfbGlzdCA9IFthZGRyIGZvciBhZGRyIGluIGNjX2xpbmUuc3BsaXQoJywnKSBpZiBhZGRyXQorICAgICAgaWYgR01PQ0tfR1JPVVAgbm90IGluIGNjX2xpc3Q6CisgICAgICAgIGNjX2xpc3QuYXBwZW5kKEdNT0NLX0dST1VQKQorICAgICAgdXBsb2FkX3B5X2FyZ3YuYXBwZW5kKENDX0ZMQUcgKyAnLCcuam9pbihjY19saXN0KSkKKyAgICBlbHNlOgorICAgICAgdXBsb2FkX3B5X2FyZ3YuYXBwZW5kKGFyZykKKworICBpZiBub3QgZm91bmRfY2NfZmxhZzoKKyAgICB1cGxvYWRfcHlfYXJndi5hcHBlbmQoQ0NfRkxBRyArIEdNT0NLX0dST1VQKQorCisgICMgSW52b2tlcyB1cGxvYWQucHkgd2l0aCB0aGUgbW9kaWZpZWQgY29tbWFuZCBsaW5lIGZsYWdzLgorICBvcy5leGVjdih1cGxvYWRfcHlfcGF0aCwgdXBsb2FkX3B5X2FyZ3YpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc3JjL2dtb2NrLWFsbC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2stYWxsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZWJjZTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc3JjL2dtb2NrLWFsbC5jYwpAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIEdvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcmsgKEdvb2dsZSBNb2NrKQorLy8KKy8vIFRoaXMgZmlsZSAjaW5jbHVkZXMgYWxsIEdvb2dsZSBNb2NrIGltcGxlbWVudGF0aW9uIC5jYyBmaWxlcy4gIFRoZQorLy8gcHVycG9zZSBpcyB0byBhbGxvdyBhIHVzZXIgdG8gYnVpbGQgR29vZ2xlIE1vY2sgYnkgY29tcGlsaW5nIHRoaXMKKy8vIGZpbGUgYWxvbmUuCisKKy8vIFRoaXMgbGluZSBlbnN1cmVzIHRoYXQgZ21vY2suaCBjYW4gYmUgY29tcGlsZWQgb24gaXRzIG93biwgZXZlbgorLy8gd2hlbiBpdCdzIGZ1c2VkLgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKKy8vIFRoZSBmb2xsb3dpbmcgbGluZXMgcHVsbCBpbiB0aGUgcmVhbCBnbW9jayAqLmNjIGZpbGVzLgorI2luY2x1ZGUgInNyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjIgorI2luY2x1ZGUgInNyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYyIKKyNpbmNsdWRlICJzcmMvZ21vY2stbWF0Y2hlcnMuY2MiCisjaW5jbHVkZSAic3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MiCisjaW5jbHVkZSAic3JjL2dtb2NrLmNjIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZWM3MjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc3JjL2dtb2NrLWNhcmRpbmFsaXRpZXMuY2MKQEAgLTAsMCArMSwxNTYgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBjYXJkaW5hbGl0aWVzLgorCisjaW5jbHVkZSAiZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCisvLyBJbXBsZW1lbnRzIHRoZSBCZXR3ZWVuKG0sIG4pIGNhcmRpbmFsaXR5LgorY2xhc3MgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbCA6IHB1YmxpYyBDYXJkaW5hbGl0eUludGVyZmFjZSB7CisgcHVibGljOgorICBCZXR3ZWVuQ2FyZGluYWxpdHlJbXBsKGludCBtaW4sIGludCBtYXgpCisgICAgICA6IG1pbl8obWluID49IDAgPyBtaW4gOiAwKSwKKyAgICAgICAgbWF4XyhtYXggPj0gbWluXyA/IG1heCA6IG1pbl8pIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBpZiAobWluIDwgMCkgeworICAgICAgc3MgPDwgIlRoZSBpbnZvY2F0aW9uIGxvd2VyIGJvdW5kIG11c3QgYmUgPj0gMCwgIgorICAgICAgICAgPDwgImJ1dCBpcyBhY3R1YWxseSAiIDw8IG1pbiA8PCAiLiI7CisgICAgICBpbnRlcm5hbDo6RXhwZWN0KGZhbHNlLCBfX0ZJTEVfXywgX19MSU5FX18sIHNzLnN0cigpKTsKKyAgICB9IGVsc2UgaWYgKG1heCA8IDApIHsKKyAgICAgIHNzIDw8ICJUaGUgaW52b2NhdGlvbiB1cHBlciBib3VuZCBtdXN0IGJlID49IDAsICIKKyAgICAgICAgIDw8ICJidXQgaXMgYWN0dWFsbHkgIiA8PCBtYXggPDwgIi4iOworICAgICAgaW50ZXJuYWw6OkV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCBzcy5zdHIoKSk7CisgICAgfSBlbHNlIGlmIChtaW4gPiBtYXgpIHsKKyAgICAgIHNzIDw8ICJUaGUgaW52b2NhdGlvbiB1cHBlciBib3VuZCAoIiA8PCBtYXgKKyAgICAgICAgIDw8ICIpIG11c3QgYmUgPj0gdGhlIGludm9jYXRpb24gbG93ZXIgYm91bmQgKCIgPDwgbWluCisgICAgICAgICA8PCAiKS4iOworICAgICAgaW50ZXJuYWw6OkV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCBzcy5zdHIoKSk7CisgICAgfQorICB9CisKKyAgLy8gQ29uc2VydmF0aXZlIGVzdGltYXRlIG9uIHRoZSBsb3dlci91cHBlciBib3VuZCBvZiB0aGUgbnVtYmVyIG9mCisgIC8vIGNhbGxzIGFsbG93ZWQuCisgIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSBjb25zdCB7IHJldHVybiBtaW5fOyB9CisgIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSBjb25zdCB7IHJldHVybiBtYXhfOyB9CisKKyAgdmlydHVhbCBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKKyAgICByZXR1cm4gbWluXyA8PSBjYWxsX2NvdW50ICYmIGNhbGxfY291bnQgPD0gbWF4XzsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIGNhbGxfY291bnQgPj0gbWF4XzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBpbnQgbWluXzsKKyAgY29uc3QgaW50IG1heF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhCZXR3ZWVuQ2FyZGluYWxpdHlJbXBsKTsKK307CisKKy8vIEZvcm1hdHMgIm4gdGltZXMiIGluIGEgaHVtYW4tZnJpZW5kbHkgd2F5LgoraW5saW5lIGludGVybmFsOjpzdHJpbmcgRm9ybWF0VGltZXMoaW50IG4pIHsKKyAgaWYgKG4gPT0gMSkgeworICAgIHJldHVybiAib25jZSI7CisgIH0gZWxzZSBpZiAobiA9PSAyKSB7CisgICAgcmV0dXJuICJ0d2ljZSI7CisgIH0gZWxzZSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgbiA8PCAiIHRpbWVzIjsKKyAgICByZXR1cm4gc3Muc3RyKCk7CisgIH0KK30KKworLy8gRGVzY3JpYmVzIHRoZSBCZXR3ZWVuKG0sIG4pIGNhcmRpbmFsaXR5IGluIGh1bWFuLWZyaWVuZGx5IHRleHQuCit2b2lkIEJldHdlZW5DYXJkaW5hbGl0eUltcGw6OkRlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgIGlmIChtaW5fID09IDApIHsKKyAgICBpZiAobWF4XyA9PSAwKSB7CisgICAgICAqb3MgPDwgIm5ldmVyIGNhbGxlZCI7CisgICAgfSBlbHNlIGlmIChtYXhfID09IElOVF9NQVgpIHsKKyAgICAgICpvcyA8PCAiY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMiOworICAgIH0gZWxzZSB7CisgICAgICAqb3MgPDwgImNhbGxlZCBhdCBtb3N0ICIgPDwgRm9ybWF0VGltZXMobWF4Xyk7CisgICAgfQorICB9IGVsc2UgaWYgKG1pbl8gPT0gbWF4XykgeworICAgICpvcyA8PCAiY2FsbGVkICIgPDwgRm9ybWF0VGltZXMobWluXyk7CisgIH0gZWxzZSBpZiAobWF4XyA9PSBJTlRfTUFYKSB7CisgICAgKm9zIDw8ICJjYWxsZWQgYXQgbGVhc3QgIiA8PCBGb3JtYXRUaW1lcyhtaW5fKTsKKyAgfSBlbHNlIHsKKyAgICAvLyAwIDwgbWluXyA8IG1heF8gPCBJTlRfTUFYCisgICAgKm9zIDw8ICJjYWxsZWQgYmV0d2VlbiAiIDw8IG1pbl8gPDwgIiBhbmQgIiA8PCBtYXhfIDw8ICIgdGltZXMiOworICB9Cit9CisKK30gIC8vIFVubmFtZWQgbmFtZXNwYWNlCisKKy8vIERlc2NyaWJlcyB0aGUgZ2l2ZW4gY2FsbCBjb3VudCB0byBhbiBvc3RyZWFtLgordm9pZCBDYXJkaW5hbGl0eTo6RGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbyhpbnQgYWN0dWFsX2NhbGxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBpZiAoYWN0dWFsX2NhbGxfY291bnQgPiAwKSB7CisgICAgKm9zIDw8ICJjYWxsZWQgIiA8PCBGb3JtYXRUaW1lcyhhY3R1YWxfY2FsbF9jb3VudCk7CisgIH0gZWxzZSB7CisgICAgKm9zIDw8ICJuZXZlciBjYWxsZWQiOworICB9Cit9CisKKy8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBsZWFzdCBuIGNhbGxzLgorR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBdExlYXN0KGludCBuKSB7IHJldHVybiBCZXR3ZWVuKG4sIElOVF9NQVgpOyB9CisKKy8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBtb3N0IG4gY2FsbHMuCitHVEVTVF9BUElfIENhcmRpbmFsaXR5IEF0TW9zdChpbnQgbikgeyByZXR1cm4gQmV0d2VlbigwLCBuKTsgfQorCisvLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYW55IG51bWJlciBvZiBjYWxscy4KK0dURVNUX0FQSV8gQ2FyZGluYWxpdHkgQW55TnVtYmVyKCkgeyByZXR1cm4gQXRMZWFzdCgwKTsgfQorCisvLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYmV0d2VlbiBtaW4gYW5kIG1heCBjYWxscy4KK0dURVNUX0FQSV8gQ2FyZGluYWxpdHkgQmV0d2VlbihpbnQgbWluLCBpbnQgbWF4KSB7CisgIHJldHVybiBDYXJkaW5hbGl0eShuZXcgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbChtaW4sIG1heCkpOworfQorCisvLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgZXhhY3RseSBuIGNhbGxzLgorR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBFeGFjdGx5KGludCBuKSB7IHJldHVybiBCZXR3ZWVuKG4sIG4pOyB9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svc3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjUzMDgwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYwpAQCAtMCwwICsxLDE3NCBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgdXRpbGl0aWVzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZQorLy8gTW9jay4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBzbyBwbGVhc2UgRE8gTk9UCisvLyBVU0UgVEhFTSBJTiBVU0VSIENPREUuCisKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIENvbnZlcnRzIGFuIGlkZW50aWZpZXIgbmFtZSB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxvd2VyLWNhc2UKKy8vIHdvcmRzLiAgRWFjaCBtYXhpbXVtIHN1YnN0cmluZyBvZiB0aGUgZm9ybSBbQS1aYS16XVthLXpdKnxcZCsgaXMKKy8vIHRyZWF0ZWQgYXMgb25lIHdvcmQuICBGb3IgZXhhbXBsZSwgYm90aCAiRm9vQmFyMTIzIiBhbmQKKy8vICJmb29fYmFyXzEyMyIgYXJlIGNvbnZlcnRlZCB0byAiZm9vIGJhciAxMjMiLgorR1RFU1RfQVBJXyBzdHJpbmcgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3Jkcyhjb25zdCBjaGFyKiBpZF9uYW1lKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIGNoYXIgcHJldl9jaGFyID0gJ1wwJzsKKyAgZm9yIChjb25zdCBjaGFyKiBwID0gaWRfbmFtZTsgKnAgIT0gJ1wwJzsgcHJldl9jaGFyID0gKihwKyspKSB7CisgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgY3VycmVudCBsb2NhbGUgYXMgdGhlIGlucHV0IGlzCisgICAgLy8gZ3VhcmFudGVlZCB0byBiZSBhIHZhbGlkIEMrKyBpZGVudGlmaWVyIG5hbWUuCisgICAgY29uc3QgYm9vbCBzdGFydHNfbmV3X3dvcmQgPSBJc1VwcGVyKCpwKSB8fAorICAgICAgICAoIUlzQWxwaGEocHJldl9jaGFyKSAmJiBJc0xvd2VyKCpwKSkgfHwKKyAgICAgICAgKCFJc0RpZ2l0KHByZXZfY2hhcikgJiYgSXNEaWdpdCgqcCkpOworCisgICAgaWYgKElzQWxOdW0oKnApKSB7CisgICAgICBpZiAoc3RhcnRzX25ld193b3JkICYmIHJlc3VsdCAhPSAiIikKKyAgICAgICAgcmVzdWx0ICs9ICcgJzsKKyAgICAgIHJlc3VsdCArPSBUb0xvd2VyKCpwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVGhpcyBjbGFzcyByZXBvcnRzIEdvb2dsZSBNb2NrIGZhaWx1cmVzIGFzIEdvb2dsZSBUZXN0IGZhaWx1cmVzLiAgQQorLy8gdXNlciBjYW4gZGVmaW5lIGFub3RoZXIgY2xhc3MgaW4gYSBzaW1pbGFyIGZhc2hpb24gaWYgaGUgaW50ZW5kcyB0bworLy8gdXNlIEdvb2dsZSBNb2NrIHdpdGggYSB0ZXN0aW5nIGZyYW1ld29yayBvdGhlciB0aGFuIEdvb2dsZSBUZXN0LgorY2xhc3MgR29vZ2xlVGVzdEZhaWx1cmVSZXBvcnRlciA6IHB1YmxpYyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFJlcG9ydEZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIEFzc2VydEhlbHBlcih0eXBlID09IGtGYXRhbCA/CisgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlIDoKKyAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgIGZpbGUsCisgICAgICAgICAgICAgICAgIGxpbmUsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY19zdHIoKSkgPSBNZXNzYWdlKCk7CisgICAgaWYgKHR5cGUgPT0ga0ZhdGFsKSB7CisgICAgICBwb3NpeDo6QWJvcnQoKTsKKyAgICB9CisgIH0KK307CisKKy8vIFJldHVybnMgdGhlIGdsb2JhbCBmYWlsdXJlIHJlcG9ydGVyLiAgV2lsbCBjcmVhdGUgYQorLy8gR29vZ2xlVGVzdEZhaWx1cmVSZXBvcnRlciBhbmQgcmV0dXJuIGl0IHRoZSBmaXJzdCB0aW1lIGNhbGxlZC4KK0dURVNUX0FQSV8gRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlKiBHZXRGYWlsdXJlUmVwb3J0ZXIoKSB7CisgIC8vIFBvaW50cyB0byB0aGUgZ2xvYmFsIGZhaWx1cmUgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgTW9jay4gIGdjYworICAvLyBndWFyYW50ZWVzIHRoYXQgdGhlIGZvbGxvd2luZyB1c2Ugb2YgZmFpbHVyZV9yZXBvcnRlciBpcworICAvLyB0aHJlYWQtc2FmZS4gIFdlIG1heSBuZWVkIHRvIGFkZCBhZGRpdGlvbmFsIHN5bmNocm9uaXphdGlvbiB0bworICAvLyBwcm90ZWN0IGZhaWx1cmVfcmVwb3J0ZXIgaWYgd2UgcG9ydCBHb29nbGUgTW9jayB0byBvdGhlcgorICAvLyBjb21waWxlcnMuCisgIHN0YXRpYyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UqIGNvbnN0IGZhaWx1cmVfcmVwb3J0ZXIgPQorICAgICAgbmV3IEdvb2dsZVRlc3RGYWlsdXJlUmVwb3J0ZXIoKTsKKyAgcmV0dXJuIGZhaWx1cmVfcmVwb3J0ZXI7Cit9CisKKy8vIFByb3RlY3RzIGdsb2JhbCByZXNvdXJjZXMgKHN0ZG91dCBpbiBwYXJ0aWN1bGFyKSB1c2VkIGJ5IExvZygpLgorc3RhdGljIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKGdfbG9nX211dGV4KTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiBhIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBpcyB2aXNpYmxlIGFjY29yZGluZworLy8gdG8gdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLgorR1RFU1RfQVBJXyBib29sIExvZ0lzVmlzaWJsZShMb2dTZXZlcml0eSBzZXZlcml0eSkgeworICBpZiAoR01PQ0tfRkxBRyh2ZXJib3NlKSA9PSBrSW5mb1ZlcmJvc2l0eSkgeworICAgIC8vIEFsd2F5cyBzaG93IHRoZSBsb2cgaWYgLS1nbW9ja192ZXJib3NlPWluZm8uCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoR01PQ0tfRkxBRyh2ZXJib3NlKSA9PSBrRXJyb3JWZXJib3NpdHkpIHsKKyAgICAvLyBBbHdheXMgaGlkZSBpdCBpZiAtLWdtb2NrX3ZlcmJvc2U9ZXJyb3IuCisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIC8vIElmIC0tZ21vY2tfdmVyYm9zZSBpcyBuZWl0aGVyICJpbmZvIiBub3IgImVycm9yIiwgd2UgdHJlYXQgaXQKKyAgICAvLyBhcyAid2FybmluZyIgKGl0cyBkZWZhdWx0IHZhbHVlKS4KKyAgICByZXR1cm4gc2V2ZXJpdHkgPT0ga1dhcm5pbmc7CisgIH0KK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHN0ZG91dCBpZmYgJ3NldmVyaXR5JyA+PSB0aGUgbGV2ZWwKKy8vIHNwZWNpZmllZCBieSB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcuICBJZiBzdGFja19mcmFtZXNfdG9fc2tpcCA+PQorLy8gMCwgYWxzbyBwcmludHMgdGhlIHN0YWNrIHRyYWNlIGV4Y2x1ZGluZyB0aGUgdG9wCisvLyBzdGFja19mcmFtZXNfdG9fc2tpcCBmcmFtZXMuICBJbiBvcHQgbW9kZSwgYW55IHBvc2l0aXZlCisvLyBzdGFja19mcmFtZXNfdG9fc2tpcCBpcyB0cmVhdGVkIGFzIDAsIHNpbmNlIHdlIGRvbid0IGtub3cgd2hpY2gKKy8vIGZ1bmN0aW9uIGNhbGxzIHdpbGwgYmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIG5lZWQgdG8gYmUKKy8vIGNvbnNlcnZhdGl2ZS4KK0dURVNUX0FQSV8gdm9pZCBMb2coTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YWNrX2ZyYW1lc190b19za2lwKSB7CisgIGlmICghTG9nSXNWaXNpYmxlKHNldmVyaXR5KSkKKyAgICByZXR1cm47CisKKyAgLy8gRW5zdXJlcyB0aGF0IGxvZ3MgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBkb24ndCBpbnRlcmxlYXZlLgorICBNdXRleExvY2sgbCgmZ19sb2dfbXV0ZXgpOworCisgIC8vICJ1c2luZyA6OnN0ZDo6Y291dDsiIGRvZXNuJ3Qgd29yayB3aXRoIFN5bWJpYW4ncyBTVExwb3J0LCB3aGVyZSBjb3V0IGlzIGEKKyAgLy8gbWFjcm8uCisKKyAgaWYgKHNldmVyaXR5ID09IGtXYXJuaW5nKSB7CisgICAgLy8gUHJpbnRzIGEgR01PQ0sgV0FSTklORyBtYXJrZXIgdG8gbWFrZSB0aGUgd2FybmluZ3MgZWFzaWx5IHNlYXJjaGFibGUuCisgICAgc3RkOjpjb3V0IDw8ICJcbkdNT0NLIFdBUk5JTkc6IjsKKyAgfQorICAvLyBQcmUtcGVuZHMgYSBuZXctbGluZSB0byBtZXNzYWdlIGlmIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBvbmUuCisgIGlmIChtZXNzYWdlLmVtcHR5KCkgfHwgbWVzc2FnZVswXSAhPSAnXG4nKSB7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIH0KKyAgc3RkOjpjb3V0IDw8IG1lc3NhZ2U7CisgIGlmIChzdGFja19mcmFtZXNfdG9fc2tpcCA+PSAwKSB7CisjaWZkZWYgTkRFQlVHCisgICAgLy8gSW4gb3B0IG1vZGUsIHdlIGhhdmUgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBza2lwIG5vIHN0YWNrIGZyYW1lLgorICAgIGNvbnN0IGludCBhY3R1YWxfdG9fc2tpcCA9IDA7CisjZWxzZQorICAgIC8vIEluIGRiZyBtb2RlLCB3ZSBjYW4gZG8gd2hhdCB0aGUgY2FsbGVyIHRlbGwgdXMgdG8gZG8gKHBsdXMgb25lCisgICAgLy8gZm9yIHNraXBwaW5nIHRoaXMgZnVuY3Rpb24ncyBzdGFjayBmcmFtZSkuCisgICAgY29uc3QgaW50IGFjdHVhbF90b19za2lwID0gc3RhY2tfZnJhbWVzX3RvX3NraXAgKyAxOworI2VuZGlmICAvLyBOREVCVUcKKworICAgIC8vIEFwcGVuZHMgYSBuZXctbGluZSB0byBtZXNzYWdlIGlmIGl0IGRvZXNuJ3QgZW5kIHdpdGggb25lLgorICAgIGlmICghbWVzc2FnZS5lbXB0eSgpICYmICptZXNzYWdlLnJiZWdpbigpICE9ICdcbicpIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgIH0KKyAgICBzdGQ6OmNvdXQgPDwgIlN0YWNrIHRyYWNlOlxuIgorICAgICAgICAgPDwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgKKyAgICAgICAgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLCBhY3R1YWxfdG9fc2tpcCk7CisgIH0KKyAgc3RkOjpjb3V0IDw8IDo6c3RkOjpmbHVzaDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NyYy9nbW9jay1tYXRjaGVycy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2stbWF0Y2hlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MjQ1MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2stbWF0Y2hlcnMuY2MKQEAgLTAsMCArMSw0OTggQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBNYXRjaGVyPGNvbnN0IHN0cmluZyY+LCBNYXRjaGVyPHN0cmluZz4sIGFuZAorLy8gdXRpbGl0aWVzIGZvciBkZWZpbmluZyBtYXRjaGVycy4KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCisjaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBzdHJpbmcmIHdob3NlIHZhbHVlIGlzCisvLyBlcXVhbCB0byBzLgorTWF0Y2hlcjxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj46Ok1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcykgeworICAqdGhpcyA9IEVxKHMpOworfQorCisvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBzdHJpbmcmIHdob3NlIHZhbHVlIGlzCisvLyBlcXVhbCB0byBzLgorTWF0Y2hlcjxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgeworICAqdGhpcyA9IEVxKGludGVybmFsOjpzdHJpbmcocykpOworfQorCisvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gcy4KK01hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz46Ok1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcykgeyAqdGhpcyA9IEVxKHMpOyB9CisKKy8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgorTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPjo6TWF0Y2hlcihjb25zdCBjaGFyKiBzKSB7CisgICp0aGlzID0gRXEoaW50ZXJuYWw6OnN0cmluZyhzKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXworLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzCisvLyBlcXVhbCB0byBzLgorTWF0Y2hlcjxjb25zdCBTdHJpbmdQaWVjZSY+OjpNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpIHsKKyAgKnRoaXMgPSBFcShzKTsKK30KKworLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzCisvLyBlcXVhbCB0byBzLgorTWF0Y2hlcjxjb25zdCBTdHJpbmdQaWVjZSY+OjpNYXRjaGVyKGNvbnN0IGNoYXIqIHMpIHsKKyAgKnRoaXMgPSBFcShpbnRlcm5hbDo6c3RyaW5nKHMpKTsKK30KKworLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzCisvLyBlcXVhbCB0byBzLgorTWF0Y2hlcjxjb25zdCBTdHJpbmdQaWVjZSY+OjpNYXRjaGVyKFN0cmluZ1BpZWNlIHMpIHsKKyAgKnRoaXMgPSBFcShzLlRvU3RyaW5nKCkpOworfQorCisvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBTdHJpbmdQaWVjZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgorTWF0Y2hlcjxTdHJpbmdQaWVjZT46Ok1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcykgeworICAqdGhpcyA9IEVxKHMpOworfQorCisvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBTdHJpbmdQaWVjZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgorTWF0Y2hlcjxTdHJpbmdQaWVjZT46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgeworICAqdGhpcyA9IEVxKGludGVybmFsOjpzdHJpbmcocykpOworfQorCisvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBTdHJpbmdQaWVjZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgorTWF0Y2hlcjxTdHJpbmdQaWVjZT46Ok1hdGNoZXIoU3RyaW5nUGllY2UgcykgeworICAqdGhpcyA9IEVxKHMuVG9TdHJpbmcoKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEpvaW5zIGEgdmVjdG9yIG9mIHN0cmluZ3MgYXMgaWYgdGhleSBhcmUgZmllbGRzIG9mIGEgdHVwbGU7IHJldHVybnMKKy8vIHRoZSBqb2luZWQgc3RyaW5nLgorR1RFU1RfQVBJXyBzdHJpbmcgSm9pbkFzVHVwbGUoY29uc3QgU3RyaW5ncyYgZmllbGRzKSB7CisgIHN3aXRjaCAoZmllbGRzLnNpemUoKSkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAiIjsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gZmllbGRzWzBdOworICAgIGRlZmF1bHQ6CisgICAgICBzdHJpbmcgcmVzdWx0ID0gIigiICsgZmllbGRzWzBdOworICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgICAgIHJlc3VsdCArPSBmaWVsZHNbaV07CisgICAgICB9CisgICAgICByZXN1bHQgKz0gIikiOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgYSBtYXRjaGVyIGRlZmluZWQgdXNpbmcgdGhlIE1BVENIRVIqKCkKKy8vIG1hY3JvIHdoZXJlIHRoZSB1c2VyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIHN0cmluZyBpcyAiIiwgaWYKKy8vICduZWdhdGlvbicgaXMgZmFsc2U7IG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKKy8vIG5lZ2F0aW9uIG9mIHRoZSBtYXRjaGVyLiAgJ3BhcmFtX3ZhbHVlcycgY29udGFpbnMgYSBsaXN0IG9mIHN0cmluZ3MKKy8vIHRoYXQgYXJlIHRoZSBwcmludC1vdXQgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzLgorR1RFU1RfQVBJXyBzdHJpbmcgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWF0Y2hlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3MmIHBhcmFtX3ZhbHVlcykgeworICBzdHJpbmcgcmVzdWx0ID0gQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcyhtYXRjaGVyX25hbWUpOworICBpZiAocGFyYW1fdmFsdWVzLnNpemUoKSA+PSAxKQorICAgIHJlc3VsdCArPSAiICIgKyBKb2luQXNUdXBsZShwYXJhbV92YWx1ZXMpOworICByZXR1cm4gbmVnYXRpb24gPyAibm90ICgiICsgcmVzdWx0ICsgIikiIDogcmVzdWx0OworfQorCisvLyBGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcgYW5kIGl0cyBoZWxwZXIgY2xhc3MuCisvLworLy8gVXNlcyB0aGUgd2VsbC1rbm93biBGb3JkLUZ1bGtlcnNvbiBtYXggZmxvdyBtZXRob2QgdG8gZmluZCBhIG1heGltdW0KKy8vIGJpcGFydGl0ZSBtYXRjaGluZy4gRmxvdyBpcyBjb25zaWRlcmVkIHRvIGJlIGZyb20gbGVmdCB0byByaWdodC4KKy8vIFRoZXJlIGlzIGFuIGltcGxpY2l0IHNvdXJjZSBub2RlIHRoYXQgaXMgY29ubmVjdGVkIHRvIGFsbCBvZiB0aGUgbGVmdAorLy8gbm9kZXMsIGFuZCBhbiBpbXBsaWNpdCBzaW5rIG5vZGUgdGhhdCBpcyBjb25uZWN0ZWQgdG8gYWxsIG9mIHRoZQorLy8gcmlnaHQgbm9kZXMuIEFsbCBlZGdlcyBoYXZlIHVuaXQgY2FwYWNpdHkuCisvLworLy8gTmVpdGhlciB0aGUgZmxvdyBncmFwaCBub3IgdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGggYXJlIHJlcHJlc2VudGVkCisvLyBleHBsaWNpdGx5LiBJbnN0ZWFkLCB0aGV5IGFyZSBpbXBsaWVkIGJ5IHRoZSBpbmZvcm1hdGlvbiBpbiAnZ3JhcGgnIGFuZAorLy8gYSB2ZWN0b3I8aW50PiBjYWxsZWQgJ2xlZnRfJyB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlCisvLyB2YWx1ZSBrVW51c2VkLiBUaGlzIHJlcHJlc2VudHMgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGFsZ29yaXRobSwKKy8vIHdoZXJlIHRoZSBmbG93IGdyYXBoIGlzIGVtcHR5LCBhbmQgdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGggaGFzIHRoZQorLy8gZm9sbG93aW5nIGVkZ2VzOgorLy8gICAtIEFuIGVkZ2UgZnJvbSBzb3VyY2UgdG8gZWFjaCBsZWZ0XyBub2RlCisvLyAgIC0gQW4gZWRnZSBmcm9tIGVhY2ggcmlnaHRfIG5vZGUgdG8gc2luaworLy8gICAtIEFuIGVkZ2UgZnJvbSBlYWNoIGxlZnRfIG5vZGUgdG8gZWFjaCByaWdodF8gbm9kZSwgaWYgdGhlCisvLyAgICAgY29ycmVzcG9uZGluZyBlZGdlIGV4aXN0cyBpbiAnZ3JhcGgnLgorLy8KKy8vIFdoZW4gdGhlIFRyeUF1Z21lbnQoKSBtZXRob2QgYWRkcyBhIGZsb3csIGl0IHNldHMgbGVmdF9bbF0gPSByIGZvciBzb21lCisvLyBub2RlcyBsIGFuZCByLiBUaGlzIGluZHVjZXMgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgorLy8gICAtIFRoZSBlZGdlcyAoc291cmNlLCBsKSwgKGwsIHIpLCBhbmQgKHIsIHNpbmspIGFyZSBhZGRlZCB0byB0aGUKKy8vICAgICBmbG93IGdyYXBoLgorLy8gICAtIFRoZSBzYW1lIHRocmVlIGVkZ2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGguCisvLyAgIC0gVGhlIHJldmVyc2UgZWRnZXMgKGwsIHNvdXJjZSksIChyLCBsKSwgYW5kIChzaW5rLCByKSBhcmUgYWRkZWQKKy8vICAgICB0byB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaCwgd2hpY2ggaXMgYSBkaXJlY3Rpb25hbCBncmFwaAorLy8gICAgIHJlcHJlc2VudGluZyB1bnVzZWQgZmxvdyBjYXBhY2l0eS4KKy8vCisvLyBXaGVuIHRoZSBtZXRob2QgYXVnbWVudHMgYSBmbG93IChtb3ZpbmcgbGVmdF9bbF0gZnJvbSBzb21lIHIxIHRvIHNvbWUKKy8vIG90aGVyIHIyKSwgdGhpcyBjYW4gYmUgdGhvdWdodCBvZiBhcyAidW5kb2luZyIgdGhlIGFib3ZlIHN0ZXBzIHdpdGgKKy8vIHJlc3BlY3QgdG8gcjEgYW5kICJyZWRvaW5nIiB0aGVtIHdpdGggcmVzcGVjdCB0byByMi4KKy8vCisvLyBJdCBiZWFycyByZXBlYXRpbmcgdGhhdCB0aGUgZmxvdyBncmFwaCBhbmQgcmVzaWR1YWwgZmxvdyBncmFwaCBhcmUKKy8vIG5ldmVyIHJlcHJlc2VudGVkIGV4cGxpY2l0bHksIGJ1dCBjYW4gYmUgZGVyaXZlZCBieSBsb29raW5nIGF0IHRoZQorLy8gaW5mb3JtYXRpb24gaW4gJ2dyYXBoJyBhbmQgaW4gbGVmdF8uCisvLworLy8gQXMgYW4gb3B0aW1pemF0aW9uLCB0aGVyZSBpcyBhIHNlY29uZCB2ZWN0b3I8aW50PiBjYWxsZWQgcmlnaHRfIHdoaWNoCisvLyBkb2VzIG5vdCBwcm92aWRlIGFueSBuZXcgaW5mb3JtYXRpb24uIEluc3RlYWQsIGl0IGVuYWJsZXMgbW9yZQorLy8gZWZmaWNpZW50IHF1ZXJpZXMgYWJvdXQgZWRnZXMgZW50ZXJpbmcgb3IgbGVhdmluZyB0aGUgcmlnaHQtc2lkZSBub2RlcworLy8gb2YgdGhlIGZsb3cgb3IgcmVzaWR1YWwgZmxvdyBncmFwaHMuIFRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyBhcmUKKy8vIG1haW50YWluZWQ6CisvLworLy8gbGVmdFtsXSA9PSBrVW51c2VkIG9yIHJpZ2h0W2xlZnRbbF1dID09IGwKKy8vIHJpZ2h0W3JdID09IGtVbnVzZWQgb3IgbGVmdFtyaWdodFtyXV0gPT0gcgorLy8KKy8vIC4gWyBzb3VyY2UgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisvLyAuICAgfHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorLy8gLiAgIHx8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKy8vIC4gICB8fFwtLT4gbGVmdFswXT0xICAtLS1cICAgIHJpZ2h0WzBdPS0xIC0tLS1cICAgICAuCisvLyAuICAgfHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgLgorLy8gLiAgIHxcLS0tPiBsZWZ0WzFdPS0xICAgIFwtLT4gcmlnaHRbMV09MCAgLS0tXHwgICAgIC4KKy8vIC4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAuCisvLyAuICAgXC0tLS0+IGxlZnRbMl09MiAgLS0tLS0tPiByaWdodFsyXT0yICAtLVx8fCAgICAgLgorLy8gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fHwgICAgIC4KKy8vIC4gICAgICAgICBlbGVtZW50cyAgICAgICAgICAgbWF0Y2hlcnMgICAgICAgdnZ2ICAgICAuCisvLyAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIHNpbmsgXSAgLgorLy8KKy8vIFNlZSBBbHNvOgorLy8gICBbMV0gQ29ybWVuLCBldCBhbCAoMjAwMSkuICJTZWN0aW9uIDI2LjI6IFRoZSBGb3JkLUZ1bGtlcnNvbiBtZXRob2QiLgorLy8gICAgICAgIkludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zIChTZWNvbmQgZWQuKSIsIHBwLiA2NTEtNjY0LgorLy8gICBbMl0gIkZvcmQtRnVsa2Vyc29uIGFsZ29yaXRobSIsIFdpa2lwZWRpYSwKKy8vICAgICAgICdodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZvcmQlRTIlODAlOTNGdWxrZXJzb25fYWxnb3JpdGhtJworY2xhc3MgTWF4QmlwYXJ0aXRlTWF0Y2hTdGF0ZSB7CisgcHVibGljOgorICBleHBsaWNpdCBNYXhCaXBhcnRpdGVNYXRjaFN0YXRlKGNvbnN0IE1hdGNoTWF0cml4JiBncmFwaCkKKyAgICAgIDogZ3JhcGhfKCZncmFwaCksCisgICAgICAgIGxlZnRfKGdyYXBoXy0+TGhzU2l6ZSgpLCBrVW51c2VkKSwKKyAgICAgICAgcmlnaHRfKGdyYXBoXy0+UmhzU2l6ZSgpLCBrVW51c2VkKSB7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBlZGdlcyBvZiBhIG1heGltYWwgbWF0Y2gsIGVhY2ggaW4gdGhlIGZvcm0ge2xlZnQsIHJpZ2h0fS4KKyAgRWxlbWVudE1hdGNoZXJQYWlycyBDb21wdXRlKCkgeworICAgIC8vICdzZWVuJyBpcyB1c2VkIGZvciBwYXRoIGZpbmRpbmcgeyAwOiB1bnNlZW4sIDE6IHNlZW4gfS4KKyAgICA6OnN0ZDo6dmVjdG9yPGNoYXI+IHNlZW47CisgICAgLy8gU2VhcmNoZXMgdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGggZm9yIGEgcGF0aCBmcm9tIGVhY2ggbGVmdCBub2RlIHRvCisgICAgLy8gdGhlIHNpbmsgaW4gdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGgsIGFuZCBpZiBvbmUgaXMgZm91bmQsIGFkZCBmbG93CisgICAgLy8gdG8gdGhlIGdyYXBoLiBJdCdzIG9rYXkgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGxlZnQgbm9kZXMgb25jZS4gVGhlCisgICAgLy8gZWRnZSBmcm9tIHRoZSBpbXBsaWNpdCBzb3VyY2Ugbm9kZSB0byBlYWNoIHByZXZpb3VzbHktdmlzaXRlZCBsZWZ0CisgICAgLy8gbm9kZSB3aWxsIGhhdmUgZmxvdyBpZiB0aGF0IGxlZnQgbm9kZSBoYXMgYW55IHBhdGggdG8gdGhlIHNpbmsKKyAgICAvLyB3aGF0c29ldmVyLiBTdWJzZXF1ZW50IGF1Z21lbnRhdGlvbnMgY2FuIG9ubHkgYWRkIGZsb3cgdG8gdGhlCisgICAgLy8gbmV0d29yaywgYW5kIGNhbm5vdCB0YWtlIGF3YXkgdGhhdCBwcmV2aW91cyBmbG93IHVuaXQgZnJvbSB0aGUgc291cmNlLgorICAgIC8vIFNpbmNlIHRoZSBzb3VyY2UtdG8tbGVmdCBlZGdlIGNhbiBvbmx5IGNhcnJ5IG9uZSBmbG93IHVuaXQgKG9yLAorICAgIC8vIGVhY2ggZWxlbWVudCBjYW4gYmUgbWF0Y2hlZCB0byBvbmx5IG9uZSBtYXRjaGVyKSwgdGhlcmUgaXMgbm8gbmVlZAorICAgIC8vIHRvIHZpc2l0IHRoZSBsZWZ0IG5vZGVzIG1vcmUgdGhhbiBvbmNlIGxvb2tpbmcgZm9yIGF1Z21lbnRlZCBwYXRocy4KKyAgICAvLyBUaGUgZmxvdyBpcyBrbm93biB0byBiZSBwb3NzaWJsZSBvciBpbXBvc3NpYmxlIGJ5IGxvb2tpbmcgYXQgdGhlCisgICAgLy8gbm9kZSBvbmNlLgorICAgIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzIDwgZ3JhcGhfLT5MaHNTaXplKCk7ICsraWxocykgeworICAgICAgLy8gUmVzZXQgdGhlIHBhdGgtbWFya2luZyB2ZWN0b3IgYW5kIHRyeSB0byBmaW5kIGEgcGF0aCBmcm9tCisgICAgICAvLyBzb3VyY2UgdG8gc2luayBzdGFydGluZyBhdCB0aGUgbGVmdF9baWxoc10gbm9kZS4KKyAgICAgIEdURVNUX0NIRUNLXyhsZWZ0X1tpbGhzXSA9PSBrVW51c2VkKQorICAgICAgICAgIDw8ICJpbGhzOiAiIDw8IGlsaHMgPDwgIiwgbGVmdF9baWxoc106ICIgPDwgbGVmdF9baWxoc107CisgICAgICAvLyAnc2VlbicgaW5pdGlhbGl6ZWQgdG8gJ2dyYXBoXy0+UmhzU2l6ZSgpJyBjb3BpZXMgb2YgMC4KKyAgICAgIHNlZW4uYXNzaWduKGdyYXBoXy0+UmhzU2l6ZSgpLCAwKTsKKyAgICAgIFRyeUF1Z21lbnQoaWxocywgJnNlZW4pOworICAgIH0KKyAgICBFbGVtZW50TWF0Y2hlclBhaXJzIHJlc3VsdDsKKyAgICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IGxlZnRfLnNpemUoKTsgKytpbGhzKSB7CisgICAgICBzaXplX3QgaXJocyA9IGxlZnRfW2lsaHNdOworICAgICAgaWYgKGlyaHMgPT0ga1VudXNlZCkgY29udGludWU7CisgICAgICByZXN1bHQucHVzaF9iYWNrKEVsZW1lbnRNYXRjaGVyUGFpcihpbGhzLCBpcmhzKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga1VudXNlZCA9IHN0YXRpY19jYXN0PHNpemVfdD4oLTEpOworCisgIC8vIFBlcmZvcm0gYSBkZXB0aC1maXJzdCBzZWFyY2ggZnJvbSBsZWZ0IG5vZGUgaWxocyB0byB0aGUgc2luay4gIElmIGEKKyAgLy8gcGF0aCBpcyBmb3VuZCwgZmxvdyBpcyBhZGRlZCB0byB0aGUgbmV0d29yayBieSBsaW5raW5nIHRoZSBsZWZ0IGFuZAorICAvLyByaWdodCB2ZWN0b3IgZWxlbWVudHMgY29ycmVzcG9uZGluZyBlYWNoIHNlZ21lbnQgb2YgdGhlIHBhdGguCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhIHBhdGggdG8gc2luayB3YXMgZm91bmQsIHdoaWNoIG1lYW5zIHRoYXQgYSB1bml0IG9mCisgIC8vIGZsb3cgd2FzIGFkZGVkIHRvIHRoZSBuZXR3b3JrLiBUaGUgJ3NlZW4nIHZlY3RvciBlbGVtZW50cyBjb3JyZXNwb25kCisgIC8vIHRvIHJpZ2h0IG5vZGVzIGFuZCBhcmUgbWFya2VkIHRvIGVsaW1pbmF0ZSBjeWNsZXMgZnJvbSB0aGUgc2VhcmNoLgorICAvLworICAvLyBMZWZ0IG5vZGVzIHdpbGwgb25seSBiZSBleHBsb3JlZCBhdCBtb3N0IG9uY2UgYmVjYXVzZSB0aGV5CisgIC8vIGFyZSBhY2Nlc3NpYmxlIGZyb20gYXQgbW9zdCBvbmUgcmlnaHQgbm9kZSBpbiB0aGUgcmVzaWR1YWwgZmxvdworICAvLyBncmFwaC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGxlZnRfW2lsaHNdIGlzIHRoZSBvbmx5IGVsZW1lbnQgb2YgbGVmdF8gdGhhdCBUcnlBdWdtZW50IHdpbGwKKyAgLy8gcG90ZW50aWFsbHkgdHJhbnNpdGlvbiBmcm9tIGtVbnVzZWQgdG8gYW5vdGhlciB2YWx1ZS4gQW55IG90aGVyCisgIC8vIGxlZnRfIGVsZW1lbnQgaG9sZGluZyBrVW51c2VkIGJlZm9yZSBUcnlBdWdtZW50IHdpbGwgYmUgaG9sZGluZyBpdAorICAvLyB3aGVuIFRyeUF1Z21lbnQgcmV0dXJucy4KKyAgLy8KKyAgYm9vbCBUcnlBdWdtZW50KHNpemVfdCBpbGhzLCA6OnN0ZDo6dmVjdG9yPGNoYXI+KiBzZWVuKSB7CisgICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgPCBncmFwaF8tPlJoc1NpemUoKTsgKytpcmhzKSB7CisgICAgICBpZiAoKCpzZWVuKVtpcmhzXSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoIWdyYXBoXy0+SGFzRWRnZShpbGhzLCBpcmhzKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBUaGVyZSdzIGFuIGF2YWlsYWJsZSBlZGdlIGZyb20gaWxocyB0byBpcmhzLgorICAgICAgKCpzZWVuKVtpcmhzXSA9IDE7CisgICAgICAvLyBOZXh0IGEgc2VhcmNoIGlzIHBlcmZvcm1lZCB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgICAgLy8gdGhpcyBlZGdlIGlzIGEgZGVhZCBlbmQgb3IgbGVhZHMgdG8gdGhlIHNpbmsuCisgICAgICAvLworICAgICAgLy8gcmlnaHRfW2lyaHNdID09IGtVbnVzZWQgbWVhbnMgdGhhdCB0aGVyZSBpcyByZXNpZHVhbCBmbG93IGZyb20KKyAgICAgIC8vIHJpZ2h0IG5vZGUgaXJocyB0byB0aGUgc2luaywgc28gd2UgY2FuIHVzZSB0aGF0IHRvIGZpbmlzaCB0aGlzCisgICAgICAvLyBmbG93IHBhdGggYW5kIHJldHVybiBzdWNjZXNzLgorICAgICAgLy8KKyAgICAgIC8vIE90aGVyd2lzZSB0aGVyZSBpcyByZXNpZHVhbCBmbG93IHRvIHNvbWUgaWxocy4gV2UgcHVzaCBmbG93CisgICAgICAvLyBhbG9uZyB0aGF0IHBhdGggYW5kIGNhbGwgb3Vyc2VsdmVzIHJlY3Vyc2l2ZWx5IHRvIHNlZSBpZiB0aGlzCisgICAgICAvLyB1bHRpbWF0ZWx5IGxlYWRzIHRvIHNpbmsuCisgICAgICBpZiAocmlnaHRfW2lyaHNdID09IGtVbnVzZWQgfHwgVHJ5QXVnbWVudChyaWdodF9baXJoc10sIHNlZW4pKSB7CisgICAgICAgIC8vIEFkZCBmbG93IGZyb20gbGVmdF9baWxoc10gdG8gcmlnaHRfW2lyaHNdLgorICAgICAgICBsZWZ0X1tpbGhzXSA9IGlyaHM7CisgICAgICAgIHJpZ2h0X1tpcmhzXSA9IGlsaHM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBNYXRjaE1hdHJpeCogZ3JhcGhfOyAgLy8gbm90IG93bmVkCisgIC8vIEVhY2ggZWxlbWVudCBvZiB0aGUgbGVmdF8gdmVjdG9yIHJlcHJlc2VudHMgYSBsZWZ0IGhhbmQgc2lkZSBub2RlCisgIC8vIChpLmUuIGFuIGVsZW1lbnQpIGFuZCBlYWNoIGVsZW1lbnQgb2YgcmlnaHRfIGlzIGEgcmlnaHQgaGFuZCBzaWRlCisgIC8vIG5vZGUgKGkuZS4gYSBtYXRjaGVyKS4gVGhlIHZhbHVlcyBpbiB0aGUgbGVmdF8gdmVjdG9yIGluZGljYXRlCisgIC8vIG91dGZsb3cgZnJvbSB0aGF0IG5vZGUgdG8gYSBub2RlIG9uIHRoZSB0aGUgcmlnaHRfIHNpZGUuIFRoZSB2YWx1ZXMKKyAgLy8gaW4gdGhlIHJpZ2h0XyBpbmRpY2F0ZSBpbmZsb3csIGFuZCBzcGVjaWZ5IHdoaWNoIGxlZnRfIG5vZGUgaXMKKyAgLy8gZmVlZGluZyB0aGF0IHJpZ2h0XyBub2RlLCBpZiBhbnkuIEZvciBleGFtcGxlLCBsZWZ0X1szXSA9PSAxIG1lYW5zCisgIC8vIHRoZXJlJ3MgYSBmbG93IGZyb20gZWxlbWVudCAjMyB0byBtYXRjaGVyICMxLiBTdWNoIGEgZmxvdyB3b3VsZCBhbHNvCisgIC8vIGJlIHJlZHVuZGFudGx5IHJlcHJlc2VudGVkIGluIHRoZSByaWdodF8gdmVjdG9yIGFzIHJpZ2h0X1sxXSA9PSAzLgorICAvLyBFbGVtZW50cyBvZiBsZWZ0XyBhbmQgcmlnaHRfIGFyZSBlaXRoZXIga1VudXNlZCBvciBtdXR1YWxseQorICAvLyByZWZlcmVudC4gTXV0dWFsbHkgcmVmZXJlbnQgbWVhbnMgdGhhdCBsZWZ0X1tyaWdodF9baV1dID0gaSBhbmQKKyAgLy8gcmlnaHRfW2xlZnRfW2ldXSA9IGkuCisgIDo6c3RkOjp2ZWN0b3I8c2l6ZV90PiBsZWZ0XzsKKyAgOjpzdGQ6OnZlY3RvcjxzaXplX3Q+IHJpZ2h0XzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1heEJpcGFydGl0ZU1hdGNoU3RhdGUpOworfTsKKworY29uc3Qgc2l6ZV90IE1heEJpcGFydGl0ZU1hdGNoU3RhdGU6OmtVbnVzZWQ7CisKK0dURVNUX0FQSV8gRWxlbWVudE1hdGNoZXJQYWlycworRmluZE1heEJpcGFydGl0ZU1hdGNoaW5nKGNvbnN0IE1hdGNoTWF0cml4JiBnKSB7CisgIHJldHVybiBNYXhCaXBhcnRpdGVNYXRjaFN0YXRlKGcpLkNvbXB1dGUoKTsKK30KKworc3RhdGljIHZvaWQgTG9nRWxlbWVudE1hdGNoZXJQYWlyVmVjKGNvbnN0IEVsZW1lbnRNYXRjaGVyUGFpcnMmIHBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0pIHsKKyAgdHlwZWRlZiBFbGVtZW50TWF0Y2hlclBhaXJzOjpjb25zdF9pdGVyYXRvciBJdGVyOworICA6OnN0ZDo6b3N0cmVhbSYgb3MgPSAqc3RyZWFtOworICBvcyA8PCAieyI7CisgIGNvbnN0IGNoYXIgKnNlcCA9ICIiOworICBmb3IgKEl0ZXIgaXQgPSBwYWlycy5iZWdpbigpOyBpdCAhPSBwYWlycy5lbmQoKTsgKytpdCkgeworICAgIG9zIDw8IHNlcCA8PCAiXG4gICgiCisgICAgICAgPDwgImVsZW1lbnQgIyIgPDwgaXQtPmZpcnN0IDw8ICIsICIKKyAgICAgICA8PCAibWF0Y2hlciAjIiA8PCBpdC0+c2Vjb25kIDw8ICIpIjsKKyAgICBzZXAgPSAiLCI7CisgIH0KKyAgb3MgPDwgIlxufSI7Cit9CisKKy8vIFRyaWVzIHRvIGZpbmQgYSBwYWlyaW5nLCBhbmQgZXhwbGFpbnMgdGhlIHJlc3VsdC4KK0dURVNUX0FQSV8gYm9vbCBGaW5kUGFpcmluZyhjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIEVsZW1lbnRNYXRjaGVyUGFpcnMgbWF0Y2hlcyA9IEZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhtYXRyaXgpOworCisgIHNpemVfdCBtYXhfZmxvdyA9IG1hdGNoZXMuc2l6ZSgpOworICBib29sIHJlc3VsdCA9IChtYXhfZmxvdyA9PSBtYXRyaXguUmhzU2l6ZSgpKTsKKworICBpZiAoIXJlc3VsdCkgeworICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKKyAgICAgICpsaXN0ZW5lciA8PCAid2hlcmUgbm8gcGVybXV0YXRpb24gb2YgdGhlIGVsZW1lbnRzIGNhbiAiCisgICAgICAgICAgICAgICAgICAgInNhdGlzZnkgYWxsIG1hdGNoZXJzLCBhbmQgdGhlIGNsb3Nlc3QgbWF0Y2ggaXMgIgorICAgICAgICAgICAgICAgIDw8IG1heF9mbG93IDw8ICIgb2YgIiA8PCBtYXRyaXguUmhzU2l6ZSgpCisgICAgICAgICAgICAgICAgPDwgIiBtYXRjaGVycyB3aXRoIHRoZSBwYWlyaW5nczpcbiI7CisgICAgICBMb2dFbGVtZW50TWF0Y2hlclBhaXJWZWMobWF0Y2hlcywgbGlzdGVuZXItPnN0cmVhbSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKG1hdGNoZXMuc2l6ZSgpID4gMSkgeworICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcCA9ICJ3aGVyZTpcbiI7CisgICAgICBmb3IgKHNpemVfdCBtaSA9IDA7IG1pIDwgbWF0Y2hlcy5zaXplKCk7ICsrbWkpIHsKKyAgICAgICAgKmxpc3RlbmVyIDw8IHNlcCA8PCAiIC0gZWxlbWVudCAjIiA8PCBtYXRjaGVzW21pXS5maXJzdAorICAgICAgICAgICAgICAgICAgPDwgIiBpcyBtYXRjaGVkIGJ5IG1hdGNoZXIgIyIgPDwgbWF0Y2hlc1ttaV0uc2Vjb25kOworICAgICAgICBzZXAgPSAiLFxuIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWF0Y2hNYXRyaXg6Ok5leHRHcmFwaCgpIHsKKyAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBMaHNTaXplKCk7ICsraWxocykgeworICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgUmhzU2l6ZSgpOyArK2lyaHMpIHsKKyAgICAgIGNoYXImIGIgPSBtYXRjaGVkX1tTcGFjZUluZGV4KGlsaHMsIGlyaHMpXTsKKyAgICAgIGlmICghYikgeworICAgICAgICBiID0gMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBiID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1hdGNoTWF0cml4OjpSYW5kb21pemUoKSB7CisgIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzIDwgTGhzU2l6ZSgpOyArK2lsaHMpIHsKKyAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyA8IFJoc1NpemUoKTsgKytpcmhzKSB7CisgICAgICBjaGFyJiBiID0gbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV07CisgICAgICBiID0gc3RhdGljX2Nhc3Q8Y2hhcj4ocmFuZCgpICYgMSk7ICAvLyBOT0xJTlQKKyAgICB9CisgIH0KK30KKworc3RyaW5nIE1hdGNoTWF0cml4OjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgY29uc3QgY2hhciAqc2VwID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTGhzU2l6ZSgpOyArK2kpIHsKKyAgICBzcyA8PCBzZXA7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBSaHNTaXplKCk7ICsraikgeworICAgICAgc3MgPDwgSGFzRWRnZShpLCBqKTsKKyAgICB9CisgICAgc2VwID0gIjsiOworICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6RGVzY3JpYmVUb0ltcGwoCisgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgIGlmIChtYXRjaGVyX2Rlc2NyaWJlcnNfLmVtcHR5KCkpIHsKKyAgICAqb3MgPDwgImlzIGVtcHR5IjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpID09IDEpIHsKKyAgICAqb3MgPDwgImhhcyAiIDw8IEVsZW1lbnRzKDEpIDw8ICIgYW5kIHRoYXQgZWxlbWVudCAiOworICAgIG1hdGNoZXJfZGVzY3JpYmVyc19bMF0tPkRlc2NyaWJlVG8ob3MpOworICAgIHJldHVybjsKKyAgfQorICAqb3MgPDwgImhhcyAiIDw8IEVsZW1lbnRzKG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpKQorICAgICAgPDwgIiBhbmQgdGhlcmUgZXhpc3RzIHNvbWUgcGVybXV0YXRpb24gb2YgZWxlbWVudHMgc3VjaCB0aGF0OlxuIjsKKyAgY29uc3QgY2hhciogc2VwID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpOyArK2kpIHsKKyAgICAqb3MgPDwgc2VwIDw8ICIgLSBlbGVtZW50ICMiIDw8IGkgPDwgIiAiOworICAgIG1hdGNoZXJfZGVzY3JpYmVyc19baV0tPkRlc2NyaWJlVG8ob3MpOworICAgIHNlcCA9ICIsIGFuZFxuIjsKKyAgfQorfQorCit2b2lkIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlOjpEZXNjcmliZU5lZ2F0aW9uVG9JbXBsKAorICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICBpZiAobWF0Y2hlcl9kZXNjcmliZXJzXy5lbXB0eSgpKSB7CisgICAgKm9zIDw8ICJpc24ndCBlbXB0eSI7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKSA9PSAxKSB7CisgICAgKm9zIDw8ICJkb2Vzbid0IGhhdmUgIiA8PCBFbGVtZW50cygxKQorICAgICAgICA8PCAiLCBvciBoYXMgIiA8PCBFbGVtZW50cygxKSA8PCAiIHRoYXQgIjsKKyAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfWzBdLT5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOworICAgIHJldHVybjsKKyAgfQorICAqb3MgPDwgImRvZXNuJ3QgaGF2ZSAiIDw8IEVsZW1lbnRzKG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpKQorICAgICAgPDwgIiwgb3IgdGhlcmUgZXhpc3RzIG5vIHBlcm11dGF0aW9uIG9mIGVsZW1lbnRzIHN1Y2ggdGhhdDpcbiI7CisgIGNvbnN0IGNoYXIqIHNlcCA9ICIiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKTsgKytpKSB7CisgICAgKm9zIDw8IHNlcCA8PCAiIC0gZWxlbWVudCAjIiA8PCBpIDw8ICIgIjsKKyAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfW2ldLT5EZXNjcmliZVRvKG9zKTsKKyAgICBzZXAgPSAiLCBhbmRcbiI7CisgIH0KK30KKworLy8gQ2hlY2tzIHRoYXQgYWxsIG1hdGNoZXJzIG1hdGNoIGF0IGxlYXN0IG9uZSBlbGVtZW50LCBhbmQgdGhhdCBhbGwKKy8vIGVsZW1lbnRzIG1hdGNoIGF0IGxlYXN0IG9uZSBtYXRjaGVyLiBUaGlzIGVuYWJsZXMgZmFzdGVyIG1hdGNoaW5nCisvLyBhbmQgYmV0dGVyIGVycm9yIHJlcG9ydGluZy4KKy8vIFJldHVybnMgZmFsc2UsIHdyaXRpbmcgYW4gZXhwbGFuYXRpb24gdG8gJ2xpc3RlbmVyJywgaWYgYW5kIG9ubHkKKy8vIGlmIHRoZSBzdWNjZXNzIGNyaXRlcmlhIGFyZSBub3QgbWV0LgorYm9vbCBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6CitWZXJpZnlBbGxFbGVtZW50c0FuZE1hdGNoZXJzQXJlTWF0Y2hlZCgKKyAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHN0cmluZz4mIGVsZW1lbnRfcHJpbnRvdXRzLAorICAgIGNvbnN0IE1hdGNoTWF0cml4JiBtYXRyaXgsCisgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgYm9vbCByZXN1bHQgPSB0cnVlOworICA6OnN0ZDo6dmVjdG9yPGNoYXI+IGVsZW1lbnRfbWF0Y2hlZChtYXRyaXguTGhzU2l6ZSgpLCAwKTsKKyAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBtYXRjaGVyX21hdGNoZWQobWF0cml4LlJoc1NpemUoKSwgMCk7CisKKyAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBtYXRyaXguTGhzU2l6ZSgpOyBpbGhzKyspIHsKKyAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyA8IG1hdHJpeC5SaHNTaXplKCk7IGlyaHMrKykgeworICAgICAgY2hhciBtYXRjaGVkID0gbWF0cml4Lkhhc0VkZ2UoaWxocywgaXJocyk7CisgICAgICBlbGVtZW50X21hdGNoZWRbaWxoc10gfD0gbWF0Y2hlZDsKKyAgICAgIG1hdGNoZXJfbWF0Y2hlZFtpcmhzXSB8PSBtYXRjaGVkOworICAgIH0KKyAgfQorCisgIHsKKyAgICBjb25zdCBjaGFyKiBzZXAgPQorICAgICAgICAid2hlcmUgdGhlIGZvbGxvd2luZyBtYXRjaGVycyBkb24ndCBtYXRjaCBhbnkgZWxlbWVudHM6XG4iOworICAgIGZvciAoc2l6ZV90IG1pID0gMDsgbWkgPCBtYXRjaGVyX21hdGNoZWQuc2l6ZSgpOyArK21pKSB7CisgICAgICBpZiAobWF0Y2hlcl9tYXRjaGVkW21pXSkKKyAgICAgICAgY29udGludWU7CisgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKKyAgICAgICAgKmxpc3RlbmVyIDw8IHNlcCA8PCAibWF0Y2hlciAjIiA8PCBtaSA8PCAiOiAiOworICAgICAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfW21pXS0+RGVzY3JpYmVUbyhsaXN0ZW5lci0+c3RyZWFtKCkpOworICAgICAgICBzZXAgPSAiLFxuIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB7CisgICAgY29uc3QgY2hhciogc2VwID0KKyAgICAgICAgIndoZXJlIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMgZG9uJ3QgbWF0Y2ggYW55IG1hdGNoZXJzOlxuIjsKKyAgICBjb25zdCBjaGFyKiBvdXRlcl9zZXAgPSAiIjsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgb3V0ZXJfc2VwID0gIlxuYW5kICI7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGVpID0gMDsgZWkgPCBlbGVtZW50X21hdGNoZWQuc2l6ZSgpOyArK2VpKSB7CisgICAgICBpZiAoZWxlbWVudF9tYXRjaGVkW2VpXSkKKyAgICAgICAgY29udGludWU7CisgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKKyAgICAgICAgKmxpc3RlbmVyIDw8IG91dGVyX3NlcCA8PCBzZXAgPDwgImVsZW1lbnQgIyIgPDwgZWkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgPDwgZWxlbWVudF9wcmludG91dHNbZWldOworICAgICAgICBzZXAgPSAiLFxuIjsKKyAgICAgICAgb3V0ZXJfc2VwID0gIiI7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQ4YWYxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NyYy9nbW9jay1zcGVjLWJ1aWxkZXJzLmNjCkBAIC0wLDAgKzEsODIzIEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHNwZWMgYnVpbGRlciBzeW50YXggKE9OX0NBTEwgYW5kCisvLyBFWFBFQ1RfQ0FMTCkuCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcm90ZWN0cyB0aGUgbW9jayBvYmplY3QgcmVnaXN0cnkgKGluIGNsYXNzIE1vY2spLCBhbGwgZnVuY3Rpb24KKy8vIG1vY2tlcnMsIGFuZCBhbGwgZXhwZWN0YXRpb25zLgorR1RFU1RfQVBJXyBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX2dtb2NrX211dGV4KTsKKworLy8gTG9ncyBhIG1lc3NhZ2UgaW5jbHVkaW5nIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgorR1RFU1RfQVBJXyB2b2lkIExvZ1dpdGhMb2NhdGlvbih0ZXN0aW5nOjppbnRlcm5hbDo6TG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gczsKKyAgcyA8PCBmaWxlIDw8ICI6IiA8PCBsaW5lIDw8ICI6ICIgPDwgbWVzc2FnZSA8PCA6OnN0ZDo6ZW5kbDsKKyAgTG9nKHNldmVyaXR5LCBzLnN0cigpLCAwKTsKK30KKworLy8gQ29uc3RydWN0cyBhbiBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0LgorRXhwZWN0YXRpb25CYXNlOjpFeHBlY3RhdGlvbkJhc2UoY29uc3QgY2hhciogYV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgYV9zb3VyY2VfdGV4dCkKKyAgICA6IGZpbGVfKGFfZmlsZSksCisgICAgICBsaW5lXyhhX2xpbmUpLAorICAgICAgc291cmNlX3RleHRfKGFfc291cmNlX3RleHQpLAorICAgICAgY2FyZGluYWxpdHlfc3BlY2lmaWVkXyhmYWxzZSksCisgICAgICBjYXJkaW5hbGl0eV8oRXhhY3RseSgxKSksCisgICAgICBjYWxsX2NvdW50XygwKSwKKyAgICAgIHJldGlyZWRfKGZhbHNlKSwKKyAgICAgIGV4dHJhX21hdGNoZXJfc3BlY2lmaWVkXyhmYWxzZSksCisgICAgICByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXyhmYWxzZSksCisgICAgICByZXRpcmVzX29uX3NhdHVyYXRpb25fKGZhbHNlKSwKKyAgICAgIGxhc3RfY2xhdXNlXyhrTm9uZSksCisgICAgICBhY3Rpb25fY291bnRfY2hlY2tlZF8oZmFsc2UpIHt9CisKKy8vIERlc3RydWN0cyBhbiBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0LgorRXhwZWN0YXRpb25CYXNlOjp+RXhwZWN0YXRpb25CYXNlKCkge30KKworLy8gRXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGNhcmRpbmFsaXR5IG9mIHRoaXMgZXhwZWN0YXRpb24uICBVc2VkIGJ5CisvLyB0aGUgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgdGhlIC5UaW1lcygpIGNsYXVzZS4KK3ZvaWQgRXhwZWN0YXRpb25CYXNlOjpTcGVjaWZ5Q2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpIHsKKyAgY2FyZGluYWxpdHlfc3BlY2lmaWVkXyA9IHRydWU7CisgIGNhcmRpbmFsaXR5XyA9IGFfY2FyZGluYWxpdHk7Cit9CisKKy8vIFJldGlyZXMgYWxsIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24uCit2b2lkIEV4cGVjdGF0aW9uQmFzZTo6UmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpCisgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgaWYgKGlzX3JldGlyZWQoKSkgeworICAgIC8vIFdlIGNhbiB0YWtlIHRoaXMgc2hvcnQtY3V0IGFzIHdlIG5ldmVyIHJldGlyZSBhbiBleHBlY3RhdGlvbgorICAgIC8vIHVudGlsIHdlIGhhdmUgcmV0aXJlZCBhbGwgaXRzIHByZS1yZXF1aXNpdGVzLgorICAgIHJldHVybjsKKyAgfQorCisgIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmJlZ2luKCk7CisgICAgICAgaXQgIT0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmVuZCgpOyArK2l0KSB7CisgICAgRXhwZWN0YXRpb25CYXNlKiBjb25zdCBwcmVyZXF1aXNpdGUgPSBpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLmdldCgpOworICAgIGlmICghcHJlcmVxdWlzaXRlLT5pc19yZXRpcmVkKCkpIHsKKyAgICAgIHByZXJlcXVpc2l0ZS0+UmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpOworICAgICAgcHJlcmVxdWlzaXRlLT5SZXRpcmUoKTsKKyAgICB9CisgIH0KK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiBoYXZlIGJlZW4KKy8vIHNhdGlzZmllZC4KK2Jvb2wgRXhwZWN0YXRpb25CYXNlOjpBbGxQcmVyZXF1aXNpdGVzQXJlU2F0aXNmaWVkKCkgY29uc3QKKyAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgeworICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKyAgZm9yIChFeHBlY3RhdGlvblNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18uYmVnaW4oKTsKKyAgICAgICBpdCAhPSBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18uZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoIShpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5Jc1NhdGlzZmllZCgpKSB8fAorICAgICAgICAhKGl0LT5leHBlY3RhdGlvbl9iYXNlKCktPkFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEFkZHMgdW5zYXRpc2ZpZWQgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiB0byAncmVzdWx0Jy4KK3ZvaWQgRXhwZWN0YXRpb25CYXNlOjpGaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKEV4cGVjdGF0aW9uU2V0KiByZXN1bHQpIGNvbnN0CisgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7CisgIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmJlZ2luKCk7CisgICAgICAgaXQgIT0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKGl0LT5leHBlY3RhdGlvbl9iYXNlKCktPklzU2F0aXNmaWVkKCkpIHsKKyAgICAgIC8vIElmICppdCBpcyBzYXRpc2ZpZWQgYW5kIGhhcyBhIGNhbGwgY291bnQgb2YgMCwgc29tZSBvZiBpdHMKKyAgICAgIC8vIHByZS1yZXF1aXNpdGVzIG1heSBub3QgYmUgc2F0aXNmaWVkIHlldC4KKyAgICAgIGlmIChpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5jYWxsX2NvdW50XyA9PSAwKSB7CisgICAgICAgIGl0LT5leHBlY3RhdGlvbl9iYXNlKCktPkZpbmRVbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMocmVzdWx0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyAqaXQgaXMgdW5zYXRpc2ZpZWQsIHdlIGFyZSBub3Qgc28gaW50ZXJlc3RlZAorICAgICAgLy8gaW4gd2hldGhlciBpdHMgcHJlLXJlcXVpc2l0ZXMgYXJlIHNhdGlzZmllZC4gIFRoZXJlZm9yZSB3ZQorICAgICAgLy8gZG9uJ3QgcmVjdXJzaXZlbHkgY2FsbCBGaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKCkgaGVyZS4KKyAgICAgICpyZXN1bHQgKz0gKml0OworICAgIH0KKyAgfQorfQorCisvLyBEZXNjcmliZXMgaG93IG1hbnkgdGltZXMgYSBmdW5jdGlvbiBjYWxsIG1hdGNoaW5nIHRoaXMKKy8vIGV4cGVjdGF0aW9uIGhhcyBvY2N1cnJlZC4KK3ZvaWQgRXhwZWN0YXRpb25CYXNlOjpEZXNjcmliZUNhbGxDb3VudFRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QKKyAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgeworICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKworICAvLyBEZXNjcmliZXMgaG93IG1hbnkgdGltZXMgdGhlIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZC4KKyAgKm9zIDw8ICIgICAgICAgICBFeHBlY3RlZDogdG8gYmUgIjsKKyAgY2FyZGluYWxpdHkoKS5EZXNjcmliZVRvKG9zKTsKKyAgKm9zIDw8ICJcbiAgICAgICAgICAgQWN0dWFsOiAiOworICBDYXJkaW5hbGl0eTo6RGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbyhjYWxsX2NvdW50KCksIG9zKTsKKworICAvLyBEZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBleHBlY3RhdGlvbiAoZS5nLiBpcyBpdCBzYXRpc2ZpZWQ/CisgIC8vIGlzIGl0IGFjdGl2ZT8pLgorICAqb3MgPDwgIiAtICIgPDwgKElzT3ZlclNhdHVyYXRlZCgpID8gIm92ZXItc2F0dXJhdGVkIiA6CisgICAgICAgICAgICAgICAgICAgSXNTYXR1cmF0ZWQoKSA/ICJzYXR1cmF0ZWQiIDoKKyAgICAgICAgICAgICAgICAgICBJc1NhdGlzZmllZCgpID8gInNhdGlzZmllZCIgOiAidW5zYXRpc2ZpZWQiKQorICAgICAgPDwgIiBhbmQgIgorICAgICAgPDwgKGlzX3JldGlyZWQoKSA/ICJyZXRpcmVkIiA6ICJhY3RpdmUiKTsKK30KKworLy8gQ2hlY2tzIHRoZSBhY3Rpb24gY291bnQgKGkuZS4gdGhlIG51bWJlciBvZiBXaWxsT25jZSgpIGFuZAorLy8gV2lsbFJlcGVhdGVkbHkoKSBjbGF1c2VzKSBhZ2FpbnN0IHRoZSBjYXJkaW5hbGl0eSBpZiB0aGlzIGhhc24ndAorLy8gYmVlbiBkb25lIGJlZm9yZS4gIFByaW50cyBhIHdhcm5pbmcgaWYgdGhlcmUgYXJlIHRvbyBtYW55IG9yIHRvbworLy8gZmV3IGFjdGlvbnMuCit2b2lkIEV4cGVjdGF0aW9uQmFzZTo6Q2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpIGNvbnN0CisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGJvb2wgc2hvdWxkX2NoZWNrID0gZmFsc2U7CisgIHsKKyAgICBNdXRleExvY2sgbCgmbXV0ZXhfKTsKKyAgICBpZiAoIWFjdGlvbl9jb3VudF9jaGVja2VkXykgeworICAgICAgYWN0aW9uX2NvdW50X2NoZWNrZWRfID0gdHJ1ZTsKKyAgICAgIHNob3VsZF9jaGVjayA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKHNob3VsZF9jaGVjaykgeworICAgIGlmICghY2FyZGluYWxpdHlfc3BlY2lmaWVkXykgeworICAgICAgLy8gVGhlIGNhcmRpbmFsaXR5IHdhcyBpbmZlcnJlZCAtIG5vIG5lZWQgdG8gY2hlY2sgdGhlIGFjdGlvbgorICAgICAgLy8gY291bnQgYWdhaW5zdCBpdC4KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUaGUgY2FyZGluYWxpdHkgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICAgIGNvbnN0IGludCBhY3Rpb25fY291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHVudHlwZWRfYWN0aW9uc18uc2l6ZSgpKTsKKyAgICBjb25zdCBpbnQgdXBwZXJfYm91bmQgPSBjYXJkaW5hbGl0eSgpLkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKTsKKyAgICBjb25zdCBpbnQgbG93ZXJfYm91bmQgPSBjYXJkaW5hbGl0eSgpLkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKTsKKyAgICBib29sIHRvb19tYW55OyAgLy8gVHJ1ZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYWN0aW9ucywgb3IgZmFsc2UKKyAgICAvLyBpZiB0aGVyZSBhcmUgdG9vIGZldy4KKyAgICBpZiAoYWN0aW9uX2NvdW50ID4gdXBwZXJfYm91bmQgfHwKKyAgICAgICAgKGFjdGlvbl9jb3VudCA9PSB1cHBlcl9ib3VuZCAmJiByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykpIHsKKyAgICAgIHRvb19tYW55ID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKDAgPCBhY3Rpb25fY291bnQgJiYgYWN0aW9uX2NvdW50IDwgbG93ZXJfYm91bmQgJiYKKyAgICAgICAgICAgICAgICFyZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykgeworICAgICAgdG9vX21hbnkgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgRGVzY3JpYmVMb2NhdGlvblRvKCZzcyk7CisgICAgc3MgPDwgIlRvbyAiIDw8ICh0b29fbWFueSA/ICJtYW55IiA6ICJmZXciKQorICAgICAgIDw8ICIgYWN0aW9ucyBzcGVjaWZpZWQgaW4gIiA8PCBzb3VyY2VfdGV4dCgpIDw8ICIuLi5cbiIKKyAgICAgICA8PCAiRXhwZWN0ZWQgdG8gYmUgIjsKKyAgICBjYXJkaW5hbGl0eSgpLkRlc2NyaWJlVG8oJnNzKTsKKyAgICBzcyA8PCAiLCBidXQgaGFzICIgPDwgKHRvb19tYW55ID8gIiIgOiAib25seSAiKQorICAgICAgIDw8IGFjdGlvbl9jb3VudCA8PCAiIFdpbGxPbmNlKCkiCisgICAgICAgPDwgKGFjdGlvbl9jb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIGlmIChyZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykgeworICAgICAgc3MgPDwgIiBhbmQgYSBXaWxsUmVwZWF0ZWRseSgpIjsKKyAgICB9CisgICAgc3MgPDwgIi4iOworICAgIExvZyhrV2FybmluZywgc3Muc3RyKCksIC0xKTsgIC8vIC0xIG1lYW5zICJkb24ndCBwcmludCBzdGFjayB0cmFjZSIuCisgIH0KK30KKworLy8gSW1wbGVtZW50cyB0aGUgLlRpbWVzKCkgY2xhdXNlLgordm9pZCBFeHBlY3RhdGlvbkJhc2U6OlVudHlwZWRUaW1lcyhjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSkgeworICBpZiAobGFzdF9jbGF1c2VfID09IGtUaW1lcykgeworICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIi5UaW1lcygpIGNhbm5vdCBhcHBlYXIgIgorICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UgaW4gYW4gRVhQRUNUX0NBTEwoKS4iKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1RpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAiLlRpbWVzKCkgY2Fubm90IGFwcGVhciBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICIuSW5TZXF1ZW5jZSgpLCAuV2lsbE9uY2UoKSwgLldpbGxSZXBlYXRlZGx5KCksICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm9yIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7CisgIH0KKyAgbGFzdF9jbGF1c2VfID0ga1RpbWVzOworCisgIFNwZWNpZnlDYXJkaW5hbGl0eShhX2NhcmRpbmFsaXR5KTsKK30KKworLy8gUG9pbnRzIHRvIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpbnRyb2R1Y2VkIGJ5IGEgbGl2aW5nIEluU2VxdWVuY2UKKy8vIG9iamVjdCAoaWYgYW55KSBpbiB0aGUgY3VycmVudCB0aHJlYWQgb3IgTlVMTC4KK0dURVNUX0FQSV8gVGhyZWFkTG9jYWw8U2VxdWVuY2UqPiBnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlOworCisvLyBSZXBvcnRzIGFuIHVuaW50ZXJlc3RpbmcgY2FsbCAod2hvc2UgZGVzY3JpcHRpb24gaXMgaW4gbXNnKSBpbiB0aGUKKy8vIG1hbm5lciBzcGVjaWZpZWQgYnkgJ3JlYWN0aW9uJy4KK3ZvaWQgUmVwb3J0VW5pbnRlcmVzdGluZ0NhbGwoQ2FsbFJlYWN0aW9uIHJlYWN0aW9uLCBjb25zdCBzdHJpbmcmIG1zZykgeworICAvLyBJbmNsdWRlIGEgc3RhY2sgdHJhY2Ugb25seSBpZiAtLWdtb2NrX3ZlcmJvc2U9aW5mbyBpcyBzcGVjaWZpZWQuCisgIGNvbnN0IGludCBzdGFja19mcmFtZXNfdG9fc2tpcCA9CisgICAgICBHTU9DS19GTEFHKHZlcmJvc2UpID09IGtJbmZvVmVyYm9zaXR5ID8gMyA6IC0xOworICBzd2l0Y2ggKHJlYWN0aW9uKSB7CisgICAgY2FzZSBrQWxsb3c6CisgICAgICBMb2coa0luZm8sIG1zZywgc3RhY2tfZnJhbWVzX3RvX3NraXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrV2FybjoKKyAgICAgIExvZyhrV2FybmluZywKKyAgICAgICAgICBtc2cgKworICAgICAgICAgICJcbk5PVEU6IFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgYWJvdmUgd2FybmluZyB1bmxlc3MgdGhpcyAiCisgICAgICAgICAgImNhbGwgc2hvdWxkIG5vdCBoYXBwZW4uICBEbyBub3Qgc3VwcHJlc3MgaXQgYnkgYmxpbmRseSBhZGRpbmcgIgorICAgICAgICAgICJhbiBFWFBFQ1RfQ0FMTCgpIGlmIHlvdSBkb24ndCBtZWFuIHRvIGVuZm9yY2UgdGhlIGNhbGwuICAiCisgICAgICAgICAgIlNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rIyIKKyAgICAgICAgICAiS25vd2luZ19XaGVuX3RvX0V4cGVjdCBmb3IgZGV0YWlscy5cbiIsCisgICAgICAgICAgc3RhY2tfZnJhbWVzX3RvX3NraXApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogIC8vIEZBSUwKKyAgICAgIEV4cGVjdChmYWxzZSwgTlVMTCwgLTEsIG1zZyk7CisgIH0KK30KKworVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpCisgICAgOiBtb2NrX29ial8oTlVMTCksIG5hbWVfKCIiKSB7fQorCitVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjp+VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpIHt9CisKKy8vIFNldHMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0bywgYW5kIHJlZ2lzdGVycworLy8gdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgZ2xvYmFsIG1vY2sgcmVnaXN0cnkuICBXaWxsIGJlIGNhbGxlZAorLy8gd2hlbmV2ZXIgYW4gRVhQRUNUX0NBTEwoKSBvciBPTl9DQUxMKCkgaXMgZXhlY3V0ZWQgb24gdGhpcyBtb2NrCisvLyBtZXRob2QuCit2b2lkIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlJlZ2lzdGVyT3duZXIoY29uc3Qgdm9pZCogbW9ja19vYmopCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgeworICB7CisgICAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOworICAgIG1vY2tfb2JqXyA9IG1vY2tfb2JqOworICB9CisgIE1vY2s6OlJlZ2lzdGVyKG1vY2tfb2JqLCB0aGlzKTsKK30KKworLy8gU2V0cyB0aGUgbW9jayBvYmplY3QgdGhpcyBtb2NrIG1ldGhvZCBiZWxvbmdzIHRvLCBhbmQgc2V0cyB0aGUgbmFtZQorLy8gb2YgdGhlIG1vY2sgZnVuY3Rpb24uICBXaWxsIGJlIGNhbGxlZCB1cG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGlzCisvLyBtb2NrIGZ1bmN0aW9uLgordm9pZCBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpTZXRPd25lckFuZE5hbWUoY29uc3Qgdm9pZCogbW9ja19vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgLy8gV2UgcHJvdGVjdCBuYW1lXyB1bmRlciBnX2dtb2NrX211dGV4IGluIGNhc2UgdGhpcyBtb2NrIGZ1bmN0aW9uCisgIC8vIGlzIGNhbGxlZCBmcm9tIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseS4KKyAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOworICBtb2NrX29ial8gPSBtb2NrX29iajsKKyAgbmFtZV8gPSBuYW1lOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBtb2NrZWQuICBNdXN0IGJlIGNhbGxlZAorLy8gYWZ0ZXIgUmVnaXN0ZXJPd25lcigpIG9yIFNldE93bmVyQW5kTmFtZSgpIGhhcyBiZWVuIGNhbGxlZC4KK2NvbnN0IHZvaWQqIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6Ok1vY2tPYmplY3QoKSBjb25zdAorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKKyAgY29uc3Qgdm9pZCogbW9ja19vYmo7CisgIHsKKyAgICAvLyBXZSBwcm90ZWN0IG1vY2tfb2JqXyB1bmRlciBnX2dtb2NrX211dGV4IGluIGNhc2UgdGhpcyBtb2NrCisgICAgLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdHdvIHRocmVhZHMgY29uY3VycmVudGx5LgorICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKKyAgICBBc3NlcnQobW9ja19vYmpfICE9IE5VTEwsIF9fRklMRV9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgIk1vY2tPYmplY3QoKSBtdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIFJlZ2lzdGVyT3duZXIoKSBvciAiCisgICAgICAgICAgICJTZXRPd25lckFuZE5hbWUoKSBoYXMgYmVlbiBjYWxsZWQuIik7CisgICAgbW9ja19vYmogPSBtb2NrX29ial87CisgIH0KKyAgcmV0dXJuIG1vY2tfb2JqOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbW9jayBtZXRob2QuICBNdXN0IGJlIGNhbGxlZCBhZnRlcgorLy8gU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4gY2FsbGVkLgorY29uc3QgY2hhciogVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6TmFtZSgpIGNvbnN0CisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgeworICBjb25zdCBjaGFyKiBuYW1lOworICB7CisgICAgLy8gV2UgcHJvdGVjdCBuYW1lXyB1bmRlciBnX2dtb2NrX211dGV4IGluIGNhc2UgdGhpcyBtb2NrCisgICAgLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdHdvIHRocmVhZHMgY29uY3VycmVudGx5LgorICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKKyAgICBBc3NlcnQobmFtZV8gIT0gTlVMTCwgX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAiTmFtZSgpIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgU2V0T3duZXJBbmROYW1lKCkgaGFzICIKKyAgICAgICAgICAgImJlZW4gY2FsbGVkLiIpOworICAgIG5hbWUgPSBuYW1lXzsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworLy8gQ2FsY3VsYXRlcyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoaXMgbW9jayBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbgorLy8gYXJndW1lbnRzLCBwcmludHMgaXQsIGFuZCByZXR1cm5zIGl0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorLy8gZm9yIGRlbGV0aW5nIHRoZSByZXN1bHQuCitVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSoKK1VudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlVudHlwZWRJbnZva2VXaXRoKGNvbnN0IHZvaWQqIGNvbnN0IHVudHlwZWRfYXJncykKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7CisgIGlmICh1bnR5cGVkX2V4cGVjdGF0aW9uc18uc2l6ZSgpID09IDApIHsKKyAgICAvLyBObyBleHBlY3RhdGlvbiBpcyBzZXQgb24gdGhpcyBtb2NrIG1ldGhvZCAtIHdlIGhhdmUgYW4KKyAgICAvLyB1bmludGVyZXN0aW5nIGNhbGwuCisKKyAgICAvLyBXZSBtdXN0IGdldCBHb29nbGUgTW9jaydzIHJlYWN0aW9uIG9uIHVuaW50ZXJlc3RpbmcgY2FsbHMKKyAgICAvLyBtYWRlIG9uIHRoaXMgbW9jayBvYmplY3QgQkVGT1JFIHBlcmZvcm1pbmcgdGhlIGFjdGlvbiwKKyAgICAvLyBiZWNhdXNlIHRoZSBhY3Rpb24gbWF5IERFTEVURSB0aGUgbW9jayBvYmplY3QgYW5kIG1ha2UgdGhlCisgICAgLy8gZm9sbG93aW5nIGV4cHJlc3Npb24gbWVhbmluZ2xlc3MuCisgICAgY29uc3QgQ2FsbFJlYWN0aW9uIHJlYWN0aW9uID0KKyAgICAgICAgTW9jazo6R2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhNb2NrT2JqZWN0KCkpOworCisgICAgLy8gVHJ1ZSBpZmYgd2UgbmVlZCB0byBwcmludCB0aGlzIGNhbGwncyBhcmd1bWVudHMgYW5kIHJldHVybgorICAgIC8vIHZhbHVlLiAgVGhpcyBkZWZpbml0aW9uIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGgKKyAgICAvLyB0aGUgYmVoYXZpb3Igb2YgUmVwb3J0VW5pbnRlcmVzdGluZ0NhbGwoKS4KKyAgICBjb25zdCBib29sIG5lZWRfdG9fcmVwb3J0X3VuaW50ZXJlc3RpbmdfY2FsbCA9CisgICAgICAgIC8vIElmIHRoZSB1c2VyIGFsbG93cyB0aGlzIHVuaW50ZXJlc3RpbmcgY2FsbCwgd2UgcHJpbnQgaXQKKyAgICAgICAgLy8gb25seSB3aGVuIGhlIHdhbnRzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisgICAgICAgIHJlYWN0aW9uID09IGtBbGxvdyA/IExvZ0lzVmlzaWJsZShrSW5mbykgOgorICAgICAgICAvLyBJZiB0aGUgdXNlciB3YW50cyB0aGlzIHRvIGJlIGEgd2FybmluZywgd2UgcHJpbnQgaXQgb25seQorICAgICAgICAvLyB3aGVuIGhlIHdhbnRzIHRvIHNlZSB3YXJuaW5ncy4KKyAgICAgICAgcmVhY3Rpb24gPT0ga1dhcm4gPyBMb2dJc1Zpc2libGUoa1dhcm5pbmcpIDoKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdXNlciB3YW50cyB0aGlzIHRvIGJlIGFuIGVycm9yLCBhbmQgd2UKKyAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyBwcmludCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpbiB0aGUgZXJyb3IuCisgICAgICAgIHRydWU7CisKKyAgICBpZiAoIW5lZWRfdG9fcmVwb3J0X3VuaW50ZXJlc3RpbmdfY2FsbCkgeworICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0aW9uIHdpdGhvdXQgcHJpbnRpbmcgdGhlIGNhbGwgaW5mb3JtYXRpb24uCisgICAgICByZXR1cm4gdGhpcy0+VW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKHVudHlwZWRfYXJncywgIiIpOworICAgIH0KKworICAgIC8vIFdhcm5zIGFib3V0IHRoZSB1bmludGVyZXN0aW5nIGNhbGwuCisgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICB0aGlzLT5VbnR5cGVkRGVzY3JpYmVVbmludGVyZXN0aW5nQ2FsbCh1bnR5cGVkX2FyZ3MsICZzcyk7CisKKyAgICAvLyBDYWxjdWxhdGVzIHRoZSBmdW5jdGlvbiByZXN1bHQuCisgICAgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIGNvbnN0IHJlc3VsdCA9CisgICAgICAgIHRoaXMtPlVudHlwZWRQZXJmb3JtRGVmYXVsdEFjdGlvbih1bnR5cGVkX2FyZ3MsIHNzLnN0cigpKTsKKworICAgIC8vIFByaW50cyB0aGUgZnVuY3Rpb24gcmVzdWx0LgorICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICAgIHJlc3VsdC0+UHJpbnRBc0FjdGlvblJlc3VsdCgmc3MpOworCisgICAgUmVwb3J0VW5pbnRlcmVzdGluZ0NhbGwocmVhY3Rpb24sIHNzLnN0cigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgYm9vbCBpc19leGNlc3NpdmUgPSBmYWxzZTsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB3aHk7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gbG9jOworICBjb25zdCB2b2lkKiB1bnR5cGVkX2FjdGlvbiA9IE5VTEw7CisKKyAgLy8gVGhlIFVudHlwZWRGaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbigpIGZ1bmN0aW9uIGFjcXVpcmVzIGFuZAorICAvLyByZWxlYXNlcyBnX2dtb2NrX211dGV4LgorICBjb25zdCBFeHBlY3RhdGlvbkJhc2UqIGNvbnN0IHVudHlwZWRfZXhwZWN0YXRpb24gPQorICAgICAgdGhpcy0+VW50eXBlZEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uKAorICAgICAgICAgIHVudHlwZWRfYXJncywgJnVudHlwZWRfYWN0aW9uLCAmaXNfZXhjZXNzaXZlLAorICAgICAgICAgICZzcywgJndoeSk7CisgIGNvbnN0IGJvb2wgZm91bmQgPSB1bnR5cGVkX2V4cGVjdGF0aW9uICE9IE5VTEw7CisKKyAgLy8gVHJ1ZSBpZmYgd2UgbmVlZCB0byBwcmludCB0aGUgY2FsbCdzIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlLgorICAvLyBUaGlzIGRlZmluaXRpb24gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdXNlcyBvZiBFeHBlY3QoKQorICAvLyBhbmQgTG9nKCkgaW4gdGhpcyBmdW5jdGlvbi4KKyAgY29uc3QgYm9vbCBuZWVkX3RvX3JlcG9ydF9jYWxsID0KKyAgICAgICFmb3VuZCB8fCBpc19leGNlc3NpdmUgfHwgTG9nSXNWaXNpYmxlKGtJbmZvKTsKKyAgaWYgKCFuZWVkX3RvX3JlcG9ydF9jYWxsKSB7CisgICAgLy8gUGVyZm9ybSB0aGUgYWN0aW9uIHdpdGhvdXQgcHJpbnRpbmcgdGhlIGNhbGwgaW5mb3JtYXRpb24uCisgICAgcmV0dXJuCisgICAgICAgIHVudHlwZWRfYWN0aW9uID09IE5VTEwgPworICAgICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24odW50eXBlZF9hcmdzLCAiIikgOgorICAgICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybUFjdGlvbih1bnR5cGVkX2FjdGlvbiwgdW50eXBlZF9hcmdzKTsKKyAgfQorCisgIHNzIDw8ICIgICAgRnVuY3Rpb24gY2FsbDogIiA8PCBOYW1lKCk7CisgIHRoaXMtPlVudHlwZWRQcmludEFyZ3ModW50eXBlZF9hcmdzLCAmc3MpOworCisgIC8vIEluIGNhc2UgdGhlIGFjdGlvbiBkZWxldGVzIGEgcGllY2Ugb2YgdGhlIGV4cGVjdGF0aW9uLCB3ZQorICAvLyBnZW5lcmF0ZSB0aGUgbWVzc2FnZSBiZWZvcmVoYW5kLgorICBpZiAoZm91bmQgJiYgIWlzX2V4Y2Vzc2l2ZSkgeworICAgIHVudHlwZWRfZXhwZWN0YXRpb24tPkRlc2NyaWJlTG9jYXRpb25UbygmbG9jKTsKKyAgfQorCisgIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBjb25zdCByZXN1bHQgPQorICAgICAgdW50eXBlZF9hY3Rpb24gPT0gTlVMTCA/CisgICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24odW50eXBlZF9hcmdzLCBzcy5zdHIoKSkgOgorICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1BY3Rpb24odW50eXBlZF9hY3Rpb24sIHVudHlwZWRfYXJncyk7CisgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICByZXN1bHQtPlByaW50QXNBY3Rpb25SZXN1bHQoJnNzKTsKKyAgc3MgPDwgIlxuIiA8PCB3aHkuc3RyKCk7CisKKyAgaWYgKCFmb3VuZCkgeworICAgIC8vIE5vIGV4cGVjdGF0aW9uIG1hdGNoZXMgdGhpcyBjYWxsIC0gcmVwb3J0cyBhIGZhaWx1cmUuCisgICAgRXhwZWN0KGZhbHNlLCBOVUxMLCAtMSwgc3Muc3RyKCkpOworICB9IGVsc2UgaWYgKGlzX2V4Y2Vzc2l2ZSkgeworICAgIC8vIFdlIGhhZCBhbiB1cHBlci1ib3VuZCB2aW9sYXRpb24gYW5kIHRoZSBmYWlsdXJlIG1lc3NhZ2UgaXMgaW4gc3MuCisgICAgRXhwZWN0KGZhbHNlLCB1bnR5cGVkX2V4cGVjdGF0aW9uLT5maWxlKCksCisgICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb24tPmxpbmUoKSwgc3Muc3RyKCkpOworICB9IGVsc2UgeworICAgIC8vIFdlIGhhZCBhbiBleHBlY3RlZCBjYWxsIGFuZCB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24gaXMKKyAgICAvLyBkZXNjcmliZWQgaW4gc3MuCisgICAgTG9nKGtJbmZvLCBsb2Muc3RyKCkgKyBzcy5zdHIoKSwgMik7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZXR1cm5zIGFuIEV4cGVjdGF0aW9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW5kIGNvLW93bnMgZXhwLAorLy8gd2hpY2ggbXVzdCBiZSBhbiBleHBlY3RhdGlvbiBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uCitFeHBlY3RhdGlvbiBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpHZXRIYW5kbGVPZihFeHBlY3RhdGlvbkJhc2UqIGV4cCkgeworICBmb3IgKFVudHlwZWRFeHBlY3RhdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgdW50eXBlZF9leHBlY3RhdGlvbnNfLmJlZ2luKCk7CisgICAgICAgaXQgIT0gdW50eXBlZF9leHBlY3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKGl0LT5nZXQoKSA9PSBleHApIHsKKyAgICAgIHJldHVybiBFeHBlY3RhdGlvbigqaXQpOworICAgIH0KKyAgfQorCisgIEFzc2VydChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCAiQ2Fubm90IGZpbmQgZXhwZWN0YXRpb24uIik7CisgIHJldHVybiBFeHBlY3RhdGlvbigpOworICAvLyBUaGUgYWJvdmUgc3RhdGVtZW50IGlzIGp1c3QgdG8gbWFrZSB0aGUgY29kZSBjb21waWxlLCBhbmQgd2lsbAorICAvLyBuZXZlciBiZSBleGVjdXRlZC4KK30KKworLy8gVmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoaXMgbW9jayBmdW5jdGlvbiBoYXZlIGJlZW4KKy8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzCisvLyBhbmQgcmV0dXJucyBmYWxzZSBpZiBub3QuCitib29sIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkKKyAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgeworICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKyAgYm9vbCBleHBlY3RhdGlvbnNfbWV0ID0gdHJ1ZTsKKyAgZm9yIChVbnR5cGVkRXhwZWN0YXRpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5iZWdpbigpOworICAgICAgIGl0ICE9IHVudHlwZWRfZXhwZWN0YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgIEV4cGVjdGF0aW9uQmFzZSogY29uc3QgdW50eXBlZF9leHBlY3RhdGlvbiA9IGl0LT5nZXQoKTsKKyAgICBpZiAodW50eXBlZF9leHBlY3RhdGlvbi0+SXNPdmVyU2F0dXJhdGVkKCkpIHsKKyAgICAgIC8vIFRoZXJlIHdhcyBhbiB1cHBlci1ib3VuZCB2aW9sYXRpb24uICBTaW5jZSB0aGUgZXJyb3Igd2FzCisgICAgICAvLyBhbHJlYWR5IHJlcG9ydGVkIHdoZW4gaXQgb2NjdXJyZWQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8KKyAgICAgIC8vIGFueXRoaW5nIGhlcmUuCisgICAgICBleHBlY3RhdGlvbnNfbWV0ID0gZmFsc2U7CisgICAgfSBlbHNlIGlmICghdW50eXBlZF9leHBlY3RhdGlvbi0+SXNTYXRpc2ZpZWQoKSkgeworICAgICAgZXhwZWN0YXRpb25zX21ldCA9IGZhbHNlOworICAgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgIHNzICA8PCAiQWN0dWFsIGZ1bmN0aW9uIGNhbGwgY291bnQgZG9lc24ndCBtYXRjaCAiCisgICAgICAgICAgPDwgdW50eXBlZF9leHBlY3RhdGlvbi0+c291cmNlX3RleHQoKSA8PCAiLi4uXG4iOworICAgICAgLy8gTm8gbmVlZCB0byBzaG93IHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBvZiB0aGUgZXhwZWN0YXRpb24KKyAgICAgIC8vIGluIHRoZSBkZXNjcmlwdGlvbiwgYXMgdGhlIEV4cGVjdCgpIGNhbGwgdGhhdCBmb2xsb3dzIGFscmVhZHkKKyAgICAgIC8vIHRha2VzIGNhcmUgb2YgaXQuCisgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5NYXliZURlc2NyaWJlRXh0cmFNYXRjaGVyVG8oJnNzKTsKKyAgICAgIHVudHlwZWRfZXhwZWN0YXRpb24tPkRlc2NyaWJlQ2FsbENvdW50VG8oJnNzKTsKKyAgICAgIEV4cGVjdChmYWxzZSwgdW50eXBlZF9leHBlY3RhdGlvbi0+ZmlsZSgpLAorICAgICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb24tPmxpbmUoKSwgc3Muc3RyKCkpOworICAgIH0KKyAgfQorCisgIC8vIERlbGV0aW5nIG91ciBleHBlY3RhdGlvbnMgbWF5IHRyaWdnZXIgb3RoZXIgbW9jayBvYmplY3RzIHRvIGJlIGRlbGV0ZWQsIGZvcgorICAvLyBleGFtcGxlIGlmIGFuIGFjdGlvbiBjb250YWlucyBhIHJlZmVyZW5jZSBjb3VudGVkIHNtYXJ0IHBvaW50ZXIgdG8gdGhhdAorICAvLyBtb2NrIG9iamVjdCwgYW5kIHRoYXQgaXMgdGhlIGxhc3QgcmVmZXJlbmNlLiBTbyBpZiB3ZSBkZWxldGUgb3VyCisgIC8vIGV4cGVjdGF0aW9ucyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdsb2JhbCBtdXRleCB3ZSBtYXkgZGVhZGxvY2sgd2hlbgorICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWdhaW4uIEluc3RlYWQsIG1ha2UgYSBjb3B5IG9mIHRoZSBzZXQgb2YKKyAgLy8gZXhwZWN0YXRpb25zIHRvIGRlbGV0ZSwgY2xlYXIgb3VyIHNldCB3aXRoaW4gdGhlIG11dGV4LCBhbmQgdGhlbiBjbGVhciB0aGUKKyAgLy8gY29waWVkIHNldCBvdXRzaWRlIG9mIGl0LgorICBVbnR5cGVkRXhwZWN0YXRpb25zIGV4cGVjdGF0aW9uc190b19kZWxldGU7CisgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5zd2FwKGV4cGVjdGF0aW9uc190b19kZWxldGUpOworCisgIGdfZ21vY2tfbXV0ZXguVW5sb2NrKCk7CisgIGV4cGVjdGF0aW9uc190b19kZWxldGUuY2xlYXIoKTsKKyAgZ19nbW9ja19tdXRleC5Mb2NrKCk7CisKKyAgcmV0dXJuIGV4cGVjdGF0aW9uc19tZXQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBDbGFzcyBNb2NrLgorCituYW1lc3BhY2UgeworCit0eXBlZGVmIHN0ZDo6c2V0PGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKj4gRnVuY3Rpb25Nb2NrZXJzOworCisvLyBUaGUgY3VycmVudCBzdGF0ZSBvZiBhIG1vY2sgb2JqZWN0LiAgU3VjaCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgZm9yCisvLyBkZXRlY3RpbmcgbGVha2VkIG1vY2sgb2JqZWN0cyBhbmQgZXhwbGljaXRseSB2ZXJpZnlpbmcgYSBtb2NrJ3MKKy8vIGV4cGVjdGF0aW9ucy4KK3N0cnVjdCBNb2NrT2JqZWN0U3RhdGUgeworICBNb2NrT2JqZWN0U3RhdGUoKQorICAgICAgOiBmaXJzdF91c2VkX2ZpbGUoTlVMTCksIGZpcnN0X3VzZWRfbGluZSgtMSksIGxlYWthYmxlKGZhbHNlKSB7fQorCisgIC8vIFdoZXJlIGluIHRoZSBzb3VyY2UgZmlsZSBhbiBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMIGlzIGZpcnN0CisgIC8vIGludm9rZWQgb24gdGhpcyBtb2NrIG9iamVjdC4KKyAgY29uc3QgY2hhciogZmlyc3RfdXNlZF9maWxlOworICBpbnQgZmlyc3RfdXNlZF9saW5lOworICA6OnN0ZDo6c3RyaW5nIGZpcnN0X3VzZWRfdGVzdF9jYXNlOworICA6OnN0ZDo6c3RyaW5nIGZpcnN0X3VzZWRfdGVzdDsKKyAgYm9vbCBsZWFrYWJsZTsgIC8vIHRydWUgaWZmIGl0J3MgT0sgdG8gbGVhayB0aGUgb2JqZWN0LgorICBGdW5jdGlvbk1vY2tlcnMgZnVuY3Rpb25fbW9ja2VyczsgIC8vIEFsbCByZWdpc3RlcmVkIG1ldGhvZHMgb2YgdGhlIG9iamVjdC4KK307CisKKy8vIEEgZ2xvYmFsIHJlZ2lzdHJ5IGhvbGRpbmcgdGhlIHN0YXRlIG9mIGFsbCBtb2NrIG9iamVjdHMgdGhhdCBhcmUKKy8vIGFsaXZlLiAgQSBtb2NrIG9iamVjdCBpcyBhZGRlZCB0byB0aGlzIHJlZ2lzdHJ5IHRoZSBmaXJzdCB0aW1lCisvLyBNb2NrOjpBbGxvd0xlYWsoKSwgT05fQ0FMTCgpLCBvciBFWFBFQ1RfQ0FMTCgpIGlzIGNhbGxlZCBvbiBpdC4gIEl0CisvLyBpcyByZW1vdmVkIGZyb20gdGhlIHJlZ2lzdHJ5IGluIHRoZSBtb2NrIG9iamVjdCdzIGRlc3RydWN0b3IuCitjbGFzcyBNb2NrT2JqZWN0UmVnaXN0cnkgeworIHB1YmxpYzoKKyAgLy8gTWFwcyBhIG1vY2sgb2JqZWN0IChpZGVudGlmaWVkIGJ5IGl0cyBhZGRyZXNzKSB0byBpdHMgc3RhdGUuCisgIHR5cGVkZWYgc3RkOjptYXA8Y29uc3Qgdm9pZCosIE1vY2tPYmplY3RTdGF0ZT4gU3RhdGVNYXA7CisKKyAgLy8gVGhpcyBkZXN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBwcm9ncmFtIGV4aXRzLCBhZnRlciBhbGwKKyAgLy8gdGVzdHMgaW4gaXQgaGF2ZSBiZWVuIHJ1bi4gIEJ5IHRoZW4sIHRoZXJlIHNob3VsZCBiZSBubyBtb2NrCisgIC8vIG9iamVjdCBhbGl2ZS4gIFRoZXJlZm9yZSB3ZSByZXBvcnQgYW55IGxpdmluZyBvYmplY3QgYXMgdGVzdAorICAvLyBmYWlsdXJlLCB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tlZCB1cyB0byBpZ25vcmUgaXQuCisgIH5Nb2NrT2JqZWN0UmVnaXN0cnkoKSB7CisgICAgLy8gInVzaW5nIDo6c3RkOjpjb3V0OyIgZG9lc24ndCB3b3JrIHdpdGggU3ltYmlhbidzIFNUTHBvcnQsIHdoZXJlIGNvdXQgaXMKKyAgICAvLyBhIG1hY3JvLgorCisgICAgaWYgKCFHTU9DS19GTEFHKGNhdGNoX2xlYWtlZF9tb2NrcykpCisgICAgICByZXR1cm47CisKKyAgICBpbnQgbGVha2VkX2NvdW50ID0gMDsKKyAgICBmb3IgKFN0YXRlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0YXRlc18uYmVnaW4oKTsgaXQgIT0gc3RhdGVzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmIChpdC0+c2Vjb25kLmxlYWthYmxlKSAgLy8gVGhlIHVzZXIgc2FpZCBpdCdzIGZpbmUgdG8gbGVhayB0aGlzIG9iamVjdC4KKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBQcmludCB0aGUgdHlwZSBvZiB0aGUgbGVha2VkIG9iamVjdC4KKyAgICAgIC8vIFRoaXMgY2FuIGhlbHAgdGhlIHVzZXIgaWRlbnRpZnkgdGhlIGxlYWtlZCBvYmplY3QuCisgICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICAgIGNvbnN0IE1vY2tPYmplY3RTdGF0ZSYgc3RhdGUgPSBpdC0+c2Vjb25kOworICAgICAgc3RkOjpjb3V0IDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24oc3RhdGUuZmlyc3RfdXNlZF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmlyc3RfdXNlZF9saW5lKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiIEVSUk9SOiB0aGlzIG1vY2sgb2JqZWN0IjsKKyAgICAgIGlmIChzdGF0ZS5maXJzdF91c2VkX3Rlc3QgIT0gIiIpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgKHVzZWQgaW4gdGVzdCAiIDw8IHN0YXRlLmZpcnN0X3VzZWRfdGVzdF9jYXNlIDw8ICIuIgorICAgICAgICAgICAgIDw8IHN0YXRlLmZpcnN0X3VzZWRfdGVzdCA8PCAiKSI7CisgICAgICB9CisgICAgICBzdGQ6OmNvdXQgPDwgIiBzaG91bGQgYmUgZGVsZXRlZCBidXQgbmV2ZXIgaXMuIEl0cyBhZGRyZXNzIGlzIEAiCisgICAgICAgICAgIDw8IGl0LT5maXJzdCA8PCAiLiI7CisgICAgICBsZWFrZWRfY291bnQrKzsKKyAgICB9CisgICAgaWYgKGxlYWtlZF9jb3VudCA+IDApIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXG5FUlJPUjogIiA8PCBsZWFrZWRfY291bnQKKyAgICAgICAgICAgPDwgIiBsZWFrZWQgbW9jayAiIDw8IChsZWFrZWRfY291bnQgPT0gMSA/ICJvYmplY3QiIDogIm9iamVjdHMiKQorICAgICAgICAgICA8PCAiIGZvdW5kIGF0IHByb2dyYW0gZXhpdC5cbiI7CisgICAgICBzdGQ6OmNvdXQuZmx1c2goKTsKKyAgICAgIDo6c3RkOjpjZXJyLmZsdXNoKCk7CisgICAgICAvLyBSVU5fQUxMX1RFU1RTKCkgaGFzIGFscmVhZHkgcmV0dXJuZWQgd2hlbiB0aGlzIGRlc3RydWN0b3IgaXMKKyAgICAgIC8vIGNhbGxlZC4gIFRoZXJlZm9yZSB3ZSBjYW5ub3QgdXNlIHRoZSBub3JtYWwgR29vZ2xlIFRlc3QKKyAgICAgIC8vIGZhaWx1cmUgcmVwb3J0aW5nIG1lY2hhbmlzbS4KKyAgICAgIF9leGl0KDEpOyAgLy8gV2UgY2Fubm90IGNhbGwgZXhpdCgpIGFzIGl0IGlzIG5vdCByZWVudHJhbnQgYW5kCisgICAgICAgICAgICAgICAgIC8vIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYWxsZWQuCisgICAgfQorICB9CisKKyAgU3RhdGVNYXAmIHN0YXRlcygpIHsgcmV0dXJuIHN0YXRlc187IH0KKworIHByaXZhdGU6CisgIFN0YXRlTWFwIHN0YXRlc187Cit9OworCisvLyBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4KK01vY2tPYmplY3RSZWdpc3RyeSBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5OworCisvLyBNYXBzIGEgbW9jayBvYmplY3QgdG8gdGhlIHJlYWN0aW9uIEdvb2dsZSBNb2NrIHNob3VsZCBoYXZlIHdoZW4gYW4KKy8vIHVuaW50ZXJlc3RpbmcgbWV0aG9kIGlzIGNhbGxlZC4gIFByb3RlY3RlZCBieSBnX2dtb2NrX211dGV4Lgorc3RkOjptYXA8Y29uc3Qgdm9pZCosIGludGVybmFsOjpDYWxsUmVhY3Rpb24+IGdfdW5pbnRlcmVzdGluZ19jYWxsX3JlYWN0aW9uOworCisvLyBTZXRzIHRoZSByZWFjdGlvbiBHb29nbGUgTW9jayBzaG91bGQgaGF2ZSB3aGVuIGFuIHVuaW50ZXJlc3RpbmcKKy8vIG1ldGhvZCBvZiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QgaXMgY2FsbGVkLgordm9pZCBTZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpDYWxsUmVhY3Rpb24gcmVhY3Rpb24pCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7CisgIGdfdW5pbnRlcmVzdGluZ19jYWxsX3JlYWN0aW9uW21vY2tfb2JqXSA9IHJlYWN0aW9uOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gYWxsb3cgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUgZ2l2ZW4gbW9jaworLy8gb2JqZWN0Lgordm9pZCBNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaikKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgeworICBTZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKG1vY2tfb2JqLCBpbnRlcm5hbDo6a0FsbG93KTsKK30KKworLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gd2FybiB0aGUgdXNlciBhYm91dCB1bmludGVyZXN0aW5nIGNhbGxzIG9uIHRoZQorLy8gZ2l2ZW4gbW9jayBvYmplY3QuCit2b2lkIE1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKKyAgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhtb2NrX29iaiwgaW50ZXJuYWw6OmtXYXJuKTsKK30KKworLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gZmFpbCB1bmludGVyZXN0aW5nIGNhbGxzIG9uIHRoZSBnaXZlbiBtb2NrCisvLyBvYmplY3QuCit2b2lkIE1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKKyAgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhtb2NrX29iaiwgaW50ZXJuYWw6OmtGYWlsKTsKK30KKworLy8gVGVsbHMgR29vZ2xlIE1vY2sgdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQgaXRzCisvLyBlbnRyeSBpbiB0aGUgY2FsbC1yZWFjdGlvbiB0YWJsZSBzaG91bGQgYmUgcmVtb3ZlZC4KK3ZvaWQgTW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbihjb25zdCB2b2lkKiBtb2NrX29iaikKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKKyAgZ191bmludGVyZXN0aW5nX2NhbGxfcmVhY3Rpb24uZXJhc2UobW9ja19vYmopOworfQorCisvLyBSZXR1cm5zIHRoZSByZWFjdGlvbiBHb29nbGUgTW9jayB3aWxsIGhhdmUgb24gdW5pbnRlcmVzdGluZyBjYWxscworLy8gbWFkZSBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCitpbnRlcm5hbDo6Q2FsbFJlYWN0aW9uIE1vY2s6OkdldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMoCisgICAgY29uc3Qgdm9pZCogbW9ja19vYmopCisgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOworICByZXR1cm4gKGdfdW5pbnRlcmVzdGluZ19jYWxsX3JlYWN0aW9uLmNvdW50KG1vY2tfb2JqKSA9PSAwKSA/CisgICAgICBpbnRlcm5hbDo6a0RlZmF1bHQgOiBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvblttb2NrX29ial07Cit9CisKKy8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGlnbm9yZSBtb2NrX29iaiB3aGVuIGNoZWNraW5nIGZvciBsZWFrZWQgbW9jaworLy8gb2JqZWN0cy4KK3ZvaWQgTW9jazo6QWxsb3dMZWFrKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOworICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXS5sZWFrYWJsZSA9IHRydWU7Cit9CisKKy8vIFZlcmlmaWVzIGFuZCBjbGVhcnMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuICBJZgorLy8gdGhlIGV4cGVjdGF0aW9ucyBhcmVuJ3Qgc2F0aXNmaWVkLCBnZW5lcmF0ZXMgb25lIG9yIG1vcmUgR29vZ2xlCisvLyBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZS4KK2Jvb2wgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnModm9pZCogbW9ja19vYmopCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7CisgIHJldHVybiBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZChtb2NrX29iaik7Cit9CisKKy8vIFZlcmlmaWVzIGFsbCBleHBlY3RhdGlvbnMgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGFuZCBjbGVhcnMgaXRzCisvLyBkZWZhdWx0IGFjdGlvbnMgYW5kIGV4cGVjdGF0aW9ucy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhlCisvLyB2ZXJpZmljYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCitib29sIE1vY2s6OlZlcmlmeUFuZENsZWFyKHZvaWQqIG1vY2tfb2JqKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOworICBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKG1vY2tfb2JqKTsKKyAgcmV0dXJuIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKG1vY2tfb2JqKTsKK30KKworLy8gVmVyaWZpZXMgYW5kIGNsZWFycyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4gIElmCisvLyB0aGUgZXhwZWN0YXRpb25zIGFyZW4ndCBzYXRpc2ZpZWQsIGdlbmVyYXRlcyBvbmUgb3IgbW9yZSBHb29nbGUKKy8vIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzIGFuZCByZXR1cm5zIGZhbHNlLgorYm9vbCBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikKKyAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKKyAgaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOworICBpZiAoZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKS5jb3VudChtb2NrX29iaikgPT0gMCkgeworICAgIC8vIE5vIEVYUEVDVF9DQUxMKCkgd2FzIHNldCBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBWZXJpZmllcyBhbmQgY2xlYXJzIHRoZSBleHBlY3RhdGlvbnMgb24gZWFjaCBtb2NrIG1ldGhvZCBpbiB0aGUKKyAgLy8gZ2l2ZW4gbW9jayBvYmplY3QuCisgIGJvb2wgZXhwZWN0YXRpb25zX21ldCA9IHRydWU7CisgIEZ1bmN0aW9uTW9ja2VycyYgbW9ja2VycyA9CisgICAgICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXS5mdW5jdGlvbl9tb2NrZXJzOworICBmb3IgKEZ1bmN0aW9uTW9ja2Vyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtb2NrZXJzLmJlZ2luKCk7CisgICAgICAgaXQgIT0gbW9ja2Vycy5lbmQoKTsgKytpdCkgeworICAgIGlmICghKCppdCktPlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkpIHsKKyAgICAgIGV4cGVjdGF0aW9uc19tZXQgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBXZSBkb24ndCBjbGVhciB0aGUgY29udGVudCBvZiBtb2NrZXJzLCBhcyB0aGV5IG1heSBzdGlsbCBiZQorICAvLyBuZWVkZWQgYnkgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpLgorICByZXR1cm4gZXhwZWN0YXRpb25zX21ldDsKK30KKworLy8gUmVnaXN0ZXJzIGEgbW9jayBvYmplY3QgYW5kIGEgbW9jayBtZXRob2QgaXQgb3ducy4KK3ZvaWQgTW9jazo6UmVnaXN0ZXIoY29uc3Qgdm9pZCogbW9ja19vYmosCisgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKiBtb2NrZXIpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7CisgIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKClbbW9ja19vYmpdLmZ1bmN0aW9uX21vY2tlcnMuaW5zZXJ0KG1vY2tlcik7Cit9CisKKy8vIFRlbGxzIEdvb2dsZSBNb2NrIHdoZXJlIGluIHRoZSBzb3VyY2UgY29kZSBtb2NrX29iaiBpcyB1c2VkIGluIGFuCisvLyBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMLiAgSW4gY2FzZSBtb2NrX29iaiBpcyBsZWFrZWQsIHRoaXMKKy8vIGluZm9ybWF0aW9uIGhlbHBzIHRoZSB1c2VyIGlkZW50aWZ5IHdoaWNoIG9iamVjdCBpdCBpcy4KK3ZvaWQgTW9jazo6UmVnaXN0ZXJVc2VCeU9uQ2FsbE9yRXhwZWN0Q2FsbChjb25zdCB2b2lkKiBtb2NrX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkKKyAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKKyAgTW9ja09iamVjdFN0YXRlJiBzdGF0ZSA9IGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKClbbW9ja19vYmpdOworICBpZiAoc3RhdGUuZmlyc3RfdXNlZF9maWxlID09IE5VTEwpIHsKKyAgICBzdGF0ZS5maXJzdF91c2VkX2ZpbGUgPSBmaWxlOworICAgIHN0YXRlLmZpcnN0X3VzZWRfbGluZSA9IGxpbmU7CisgICAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICAgIGlmICh0ZXN0X2luZm8gIT0gTlVMTCkgeworICAgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlY29yZCB0aGUgdGVzdCBjYXNlIG5hbWUgd2hlbiB0aGUKKyAgICAgIC8vIE9OX0NBTEwgb3IgRVhQRUNUX0NBTEwgaXMgaW52b2tlZCBmcm9tIFNldFVwVGVzdENhc2UoKSBvcgorICAgICAgLy8gVGVhckRvd25UZXN0Q2FzZSgpLgorICAgICAgc3RhdGUuZmlyc3RfdXNlZF90ZXN0X2Nhc2UgPSB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCk7CisgICAgICBzdGF0ZS5maXJzdF91c2VkX3Rlc3QgPSB0ZXN0X2luZm8tPm5hbWUoKTsKKyAgICB9CisgIH0KK30KKworLy8gVW5yZWdpc3RlcnMgYSBtb2NrIG1ldGhvZDsgcmVtb3ZlcyB0aGUgb3duaW5nIG1vY2sgb2JqZWN0IGZyb20gdGhlCisvLyByZWdpc3RyeSB3aGVuIHRoZSBsYXN0IG1vY2sgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBpdCBoYXMgYmVlbgorLy8gdW5yZWdpc3RlcmVkLiAgVGhpcyBpcyBjYWxsZWQgb25seSBpbiB0aGUgZGVzdHJ1Y3RvciBvZgorLy8gRnVuY3Rpb25Nb2NrZXJCYXNlLgordm9pZCBNb2NrOjpVbnJlZ2lzdGVyTG9ja2VkKGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKiBtb2NrZXIpCisgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7CisgIGludGVybmFsOjpnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKKyAgZm9yIChNb2NrT2JqZWN0UmVnaXN0cnk6OlN0YXRlTWFwOjppdGVyYXRvciBpdCA9CisgICAgICAgICAgIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpLmVuZCgpOyArK2l0KSB7CisgICAgRnVuY3Rpb25Nb2NrZXJzJiBtb2NrZXJzID0gaXQtPnNlY29uZC5mdW5jdGlvbl9tb2NrZXJzOworICAgIGlmIChtb2NrZXJzLmVyYXNlKG1vY2tlcikgPiAwKSB7CisgICAgICAvLyBtb2NrZXIgd2FzIGluIG1vY2tlcnMgYW5kIGhhcyBiZWVuIGp1c3QgcmVtb3ZlZC4KKyAgICAgIGlmIChtb2NrZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKS5lcmFzZShpdCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKKy8vIENsZWFycyBhbGwgT05fQ0FMTCgpcyBzZXQgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0Lgordm9pZCBNb2NrOjpDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKHZvaWQqIG1vY2tfb2JqKQorICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgeworICBpbnRlcm5hbDo6Z19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7CisKKyAgaWYgKGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuY291bnQobW9ja19vYmopID09IDApIHsKKyAgICAvLyBObyBPTl9DQUxMKCkgd2FzIHNldCBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQ2xlYXJzIHRoZSBkZWZhdWx0IGFjdGlvbnMgZm9yIGVhY2ggbW9jayBtZXRob2QgaW4gdGhlIGdpdmVuIG1vY2sKKyAgLy8gb2JqZWN0LgorICBGdW5jdGlvbk1vY2tlcnMmIG1vY2tlcnMgPQorICAgICAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKVttb2NrX29ial0uZnVuY3Rpb25fbW9ja2VyczsKKyAgZm9yIChGdW5jdGlvbk1vY2tlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbW9ja2Vycy5iZWdpbigpOworICAgICAgIGl0ICE9IG1vY2tlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAoKml0KS0+Q2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpOworICB9CisKKyAgLy8gV2UgZG9uJ3QgY2xlYXIgdGhlIGNvbnRlbnQgb2YgbW9ja2VycywgYXMgdGhleSBtYXkgc3RpbGwgYmUKKyAgLy8gbmVlZGVkIGJ5IFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkuCit9CisKK0V4cGVjdGF0aW9uOjpFeHBlY3RhdGlvbigpIHt9CisKK0V4cGVjdGF0aW9uOjpFeHBlY3RhdGlvbigKKyAgICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlPiYgYW5fZXhwZWN0YXRpb25fYmFzZSkKKyAgICA6IGV4cGVjdGF0aW9uX2Jhc2VfKGFuX2V4cGVjdGF0aW9uX2Jhc2UpIHt9CisKK0V4cGVjdGF0aW9uOjp+RXhwZWN0YXRpb24oKSB7fQorCisvLyBBZGRzIGFuIGV4cGVjdGF0aW9uIHRvIGEgc2VxdWVuY2UuCit2b2lkIFNlcXVlbmNlOjpBZGRFeHBlY3RhdGlvbihjb25zdCBFeHBlY3RhdGlvbiYgZXhwZWN0YXRpb24pIGNvbnN0IHsKKyAgaWYgKCpsYXN0X2V4cGVjdGF0aW9uXyAhPSBleHBlY3RhdGlvbikgeworICAgIGlmIChsYXN0X2V4cGVjdGF0aW9uXy0+ZXhwZWN0YXRpb25fYmFzZSgpICE9IE5VTEwpIHsKKyAgICAgIGV4cGVjdGF0aW9uLmV4cGVjdGF0aW9uX2Jhc2UoKS0+aW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfCisgICAgICAgICAgKz0gKmxhc3RfZXhwZWN0YXRpb25fOworICAgIH0KKyAgICAqbGFzdF9leHBlY3RhdGlvbl8gPSBleHBlY3RhdGlvbjsKKyAgfQorfQorCisvLyBDcmVhdGVzIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpZiB0aGVyZSBpc24ndCBvbmUuCitJblNlcXVlbmNlOjpJblNlcXVlbmNlKCkgeworICBpZiAoaW50ZXJuYWw6OmdfZ21vY2tfaW1wbGljaXRfc2VxdWVuY2UuZ2V0KCkgPT0gTlVMTCkgeworICAgIGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLnNldChuZXcgU2VxdWVuY2UpOworICAgIHNlcXVlbmNlX2NyZWF0ZWRfID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBzZXF1ZW5jZV9jcmVhdGVkXyA9IGZhbHNlOworICB9Cit9CisKKy8vIERlbGV0ZXMgdGhlIGltcGxpY2l0IHNlcXVlbmNlIGlmIGl0IHdhcyBjcmVhdGVkIGJ5IHRoZSBjb25zdHJ1Y3RvcgorLy8gb2YgdGhpcyBvYmplY3QuCitJblNlcXVlbmNlOjp+SW5TZXF1ZW5jZSgpIHsKKyAgaWYgKHNlcXVlbmNlX2NyZWF0ZWRfKSB7CisgICAgZGVsZXRlIGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLmdldCgpOworICAgIGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLnNldChOVUxMKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NyYy9nbW9jay5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2suY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjM2Q4NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2suY2MKQEAgLTAsMCArMSwxODMgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogc3VwcG9ydCB1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8KKy8vIGNvbnRyb2wgdGhlIGZsYWcgdmFsdWVzLCBsaWtlIHdoYXQgR29vZ2xlIFRlc3QgZG9lcy4KKworR01PQ0tfREVGSU5FX2Jvb2xfKGNhdGNoX2xlYWtlZF9tb2NrcywgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAidHJ1ZSBpZmYgR29vZ2xlIE1vY2sgc2hvdWxkIHJlcG9ydCBsZWFrZWQgbW9jayBvYmplY3RzICIKKyAgICAgICAgICAgICAgICAgICAiYXMgZmFpbHVyZXMuIik7CisKK0dNT0NLX0RFRklORV9zdHJpbmdfKHZlcmJvc2UsIGludGVybmFsOjprV2FybmluZ1ZlcmJvc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICJDb250cm9scyBob3cgdmVyYm9zZSBHb29nbGUgTW9jaydzIG91dHB1dCBpcy4iCisgICAgICAgICAgICAgICAgICAgICAiICBWYWxpZCB2YWx1ZXM6XG4iCisgICAgICAgICAgICAgICAgICAgICAiICBpbmZvICAgIC0gcHJpbnRzIGFsbCBtZXNzYWdlcy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIHdhcm5pbmcgLSBwcmludHMgd2FybmluZ3MgYW5kIGVycm9ycy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIGVycm9yICAgLSBwcmludHMgZXJyb3JzIG9ubHkuIik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFBhcnNlcyBhIHN0cmluZyBhcyBhIGNvbW1hbmQgbGluZSBmbGFnLiAgVGhlIHN0cmluZyBzaG91bGQgaGF2ZSB0aGUKKy8vIGZvcm1hdCAiLS1nbW9ja19mbGFnPXZhbHVlIi4gIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIHRoZQorLy8gIj12YWx1ZSIgcGFydCBjYW4gYmUgb21pdHRlZC4KKy8vCisvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZywgb3IgTlVMTCBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCitzdGF0aWMgY29uc3QgY2hhciogUGFyc2VHb29nbGVNb2NrRmxhZ1ZhbHVlKGNvbnN0IGNoYXIqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZfb3B0aW9uYWwpIHsKKyAgLy8gc3RyIGFuZCBmbGFnIG11c3Qgbm90IGJlIE5VTEwuCisgIGlmIChzdHIgPT0gTlVMTCB8fCBmbGFnID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIC8vIFRoZSBmbGFnIG11c3Qgc3RhcnQgd2l0aCAiLS1nbW9ja18iLgorICBjb25zdCBzdGQ6OnN0cmluZyBmbGFnX3N0ciA9IHN0ZDo6c3RyaW5nKCItLWdtb2NrXyIpICsgZmxhZzsKKyAgY29uc3Qgc2l6ZV90IGZsYWdfbGVuID0gZmxhZ19zdHIubGVuZ3RoKCk7CisgIGlmIChzdHJuY21wKHN0ciwgZmxhZ19zdHIuY19zdHIoKSwgZmxhZ19sZW4pICE9IDApIHJldHVybiBOVUxMOworCisgIC8vIFNraXBzIHRoZSBmbGFnIG5hbWUuCisgIGNvbnN0IGNoYXIqIGZsYWdfZW5kID0gc3RyICsgZmxhZ19sZW47CisKKyAgLy8gV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgaXQncyBPSyB0byBub3QgaGF2ZSBhICI9dmFsdWUiIHBhcnQuCisgIGlmIChkZWZfb3B0aW9uYWwgJiYgKGZsYWdfZW5kWzBdID09ICdcMCcpKSB7CisgICAgcmV0dXJuIGZsYWdfZW5kOworICB9CisKKyAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlCisgIC8vIGZsYWcgbmFtZSwgb3IgaWYgZGVmX29wdGlvbmFsIGlzIGZhbHNlLCB0aGVyZSBtdXN0IGJlIGEgJz0nIGFmdGVyCisgIC8vIHRoZSBmbGFnIG5hbWUuCisgIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOworCisgIC8vIFJldHVybnMgdGhlIHN0cmluZyBhZnRlciAiPSIuCisgIHJldHVybiBmbGFnX2VuZCArIDE7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBHb29nbGUgTW9jayBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mCisvLyAiLS1nbW9ja19mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorc3RhdGljIGJvb2wgUGFyc2VHb29nbGVNb2NrQm9vbEZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlR29vZ2xlTW9ja0ZsYWdWYWx1ZShzdHIsIGZsYWcsIHRydWUpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdmFsdWUgdG8gYSBib29sLgorICAqdmFsdWUgPSAhKCp2YWx1ZV9zdHIgPT0gJzAnIHx8ICp2YWx1ZV9zdHIgPT0gJ2YnIHx8ICp2YWx1ZV9zdHIgPT0gJ0YnKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBHb29nbGUgTW9jayBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YKKy8vICItLWdtb2NrX2ZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nPgorc3RhdGljIGJvb2wgUGFyc2VHb29nbGVNb2NrU3RyaW5nRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlR29vZ2xlTW9ja0ZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCisgICp2YWx1ZSA9IHZhbHVlX3N0cjsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBJbml0R29vZ2xlTW9jaygpLgorLy8KKy8vIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yCisvLyB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBJbml0R29vZ2xlTW9ja0ltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsKKyAgLy8gTWFrZXMgc3VyZSBHb29nbGUgVGVzdCBpcyBpbml0aWFsaXplZC4gIEluaXRHb29nbGVUZXN0KCkgaXMKKyAgLy8gaWRlbXBvdGVudCwgc28gaXQncyBmaW5lIGlmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGNhbGxlZCBpdC4KKyAgSW5pdEdvb2dsZVRlc3QoYXJnYywgYXJndik7CisgIGlmICgqYXJnYyA8PSAwKSByZXR1cm47CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgIT0gKmFyZ2M7IGkrKykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFyZ19zdHJpbmcgPSBTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSk7CisgICAgY29uc3QgY2hhciogY29uc3QgYXJnID0gYXJnX3N0cmluZy5jX3N0cigpOworCisgICAgLy8gRG8gd2Ugc2VlIGEgR29vZ2xlIE1vY2sgZmxhZz8KKyAgICBpZiAoUGFyc2VHb29nbGVNb2NrQm9vbEZsYWcoYXJnLCAiY2F0Y2hfbGVha2VkX21vY2tzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkdNT0NLX0ZMQUcoY2F0Y2hfbGVha2VkX21vY2tzKSkgfHwKKyAgICAgICAgUGFyc2VHb29nbGVNb2NrU3RyaW5nRmxhZyhhcmcsICJ2ZXJib3NlIiwgJkdNT0NLX0ZMQUcodmVyYm9zZSkpKSB7CisgICAgICAvLyBZZXMuICBTaGlmdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcmd2IGxpc3QgbGVmdCBieSBvbmUuICBOb3RlCisgICAgICAvLyB0aGF0IGFyZ3YgaGFzICgqYXJnYyArIDEpIGVsZW1lbnRzLCB0aGUgbGFzdCBvbmUgYWx3YXlzIGJlaW5nCisgICAgICAvLyBOVUxMLiAgVGhlIGZvbGxvd2luZyBsb29wIG1vdmVzIHRoZSB0cmFpbGluZyBOVUxMIGVsZW1lbnQgYXMKKyAgICAgIC8vIHdlbGwuCisgICAgICBmb3IgKGludCBqID0gaTsgaiAhPSAqYXJnYzsgaisrKSB7CisgICAgICAgIGFyZ3Zbal0gPSBhcmd2W2ogKyAxXTsKKyAgICAgIH0KKworICAgICAgLy8gRGVjcmVtZW50cyB0aGUgYXJndW1lbnQgY291bnQuCisgICAgICAoKmFyZ2MpLS07CisKKyAgICAgIC8vIFdlIGFsc28gbmVlZCB0byBkZWNyZW1lbnQgdGhlIGl0ZXJhdG9yIGFzIHdlIGp1c3QgcmVtb3ZlZAorICAgICAgLy8gYW4gZWxlbWVudC4KKyAgICAgIGktLTsKKyAgICB9CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEluaXRpYWxpemVzIEdvb2dsZSBNb2NrLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVubmluZyB0aGUKKy8vIHRlc3RzLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIGEgY29tbWFuZCBsaW5lIGZvciB0aGUgZmxhZ3MgdGhhdAorLy8gR29vZ2xlIE1vY2sgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIE1vY2sgZmxhZyBpcyBzZWVuLCBpdCBpcworLy8gcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KKy8vCisvLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgTW9jayBmbGFnIHZhcmlhYmxlcyBhcmUKKy8vIHVwZGF0ZWQuCisvLworLy8gU2luY2UgR29vZ2xlIFRlc3QgaXMgbmVlZGVkIGZvciBHb29nbGUgTW9jayB0byB3b3JrLCB0aGlzIGZ1bmN0aW9uCisvLyBhbHNvIGluaXRpYWxpemVzIEdvb2dsZSBUZXN0IGFuZCBwYXJzZXMgaXRzIGZsYWdzLCBpZiB0aGF0IGhhc24ndAorLy8gYmVlbiBkb25lLgorR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVNb2NrKGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgaW50ZXJuYWw6OkluaXRHb29nbGVNb2NrSW1wbChhcmdjLCBhcmd2KTsKK30KKworLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgorLy8gVU5JQ09ERSBtb2RlLgorR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVNb2NrKGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsKKyAgaW50ZXJuYWw6OkluaXRHb29nbGVNb2NrSW1wbChhcmdjLCBhcmd2KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2tfbWFpbi5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay9zcmMvZ21vY2tfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDViZTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3NyYy9nbW9ja19tYWluLmNjCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIE1TIEMrKyBjb21waWxlci9saW5rZXIgaGFzIGEgYnVnIG9uIFdpbmRvd3MgKG5vdCBvbiBXaW5kb3dzIENFKSwgd2hpY2gKKy8vIGNhdXNlcyBhIGxpbmsgZXJyb3Igd2hlbiBfdG1haW4gaXMgZGVmaW5lZCBpbiBhIHN0YXRpYyBsaWJyYXJ5IGFuZCBVTklDT0RFCisvLyBpcyBlbmFibGVkLiBGb3IgdGhpcyByZWFzb24gaW5zdGVhZCBvZiBfdG1haW4sIG1haW4gZnVuY3Rpb24gaXMgdXNlZCBvbgorLy8gV2luZG93cy4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayB0byB0cmFjayB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhpcyBidWc6CisvLyBodHRwOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby9mZWVkYmFjay9WaWV3RmVlZGJhY2suYXNweD9GZWVkYmFja0lEPTM5NDQ2NCAgLy8gTk9MSU5UCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8dGNoYXIuaD4gIC8vIE5PTElOVAorCitHVEVTVF9BUElfIGludCBfdG1haW4oaW50IGFyZ2MsIFRDSEFSKiogYXJndikgeworI2Vsc2UKK0dURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIHN0ZDo6Y291dCA8PCAiUnVubmluZyBtYWluKCkgZnJvbSBnbW9ja19tYWluLmNjXG4iOworICAvLyBTaW5jZSBHb29nbGUgTW9jayBkZXBlbmRzIG9uIEdvb2dsZSBUZXN0LCBJbml0R29vZ2xlTW9jaygpIGlzCisgIC8vIGFsc28gcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyBHb29nbGUgVGVzdC4gIFRoZXJlZm9yZSB0aGVyZSdzCisgIC8vIG5vIG5lZWQgZm9yIGNhbGxpbmcgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKSBzZXBhcmF0ZWx5LgorICB0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1hY3Rpb25zX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1hY3Rpb25zX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2NWZjNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLWFjdGlvbnNfdGVzdC5jYwpAQCAtMCwwICsxLDE0MTEgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGJ1aWx0LWluIGFjdGlvbnMuCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay1hY3Rpb25zLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworbmFtZXNwYWNlIHsKKworLy8gVGhpcyBsaXN0IHNob3VsZCBiZSBrZXB0IHNvcnRlZC4KK3VzaW5nIHRlc3Rpbmc6OkFjdGlvbjsKK3VzaW5nIHRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTsKK3VzaW5nIHRlc3Rpbmc6OkFzc2lnbjsKK3VzaW5nIHRlc3Rpbmc6OkJ5TW92ZTsKK3VzaW5nIHRlc3Rpbmc6OkJ5UmVmOwordXNpbmcgdGVzdGluZzo6RGVmYXVsdFZhbHVlOwordXNpbmcgdGVzdGluZzo6RG9EZWZhdWx0OwordXNpbmcgdGVzdGluZzo6SWdub3JlUmVzdWx0OwordXNpbmcgdGVzdGluZzo6SW52b2tlOwordXNpbmcgdGVzdGluZzo6SW52b2tlV2l0aG91dEFyZ3M7Cit1c2luZyB0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNBY3Rpb247Cit1c2luZyB0ZXN0aW5nOjpOZTsKK3VzaW5nIHRlc3Rpbmc6OlBvbHltb3JwaGljQWN0aW9uOwordXNpbmcgdGVzdGluZzo6UmV0dXJuOwordXNpbmcgdGVzdGluZzo6UmV0dXJuTnVsbDsKK3VzaW5nIHRlc3Rpbmc6OlJldHVyblJlZjsKK3VzaW5nIHRlc3Rpbmc6OlJldHVyblJlZk9mQ29weTsKK3VzaW5nIHRlc3Rpbmc6OlNldEFyZ1BvaW50ZWU7Cit1c2luZyB0ZXN0aW5nOjpTZXRBcmd1bWVudFBvaW50ZWU7Cit1c2luZyB0ZXN0aW5nOjpfOwordXNpbmcgdGVzdGluZzo6Z2V0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkJ1aWx0SW5EZWZhdWx0VmFsdWU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SW50NjQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VUludDY0OwordXNpbmcgdGVzdGluZzo6bWFrZV90dXBsZTsKK3VzaW5nIHRlc3Rpbmc6OnR1cGxlOwordXNpbmcgdGVzdGluZzo6dHVwbGVfZWxlbWVudDsKKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQordXNpbmcgdGVzdGluZzo6U2V0RXJybm9BbmRSZXR1cm47CisjZW5kaWYKKworI2lmIEdURVNUX0hBU19QUk9UT0JVRl8KK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUZXN0TWVzc2FnZTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BST1RPQlVGXworCisvLyBUZXN0cyB0aGF0IEJ1aWx0SW5EZWZhdWx0VmFsdWU8VCo+OjpHZXQoKSByZXR1cm5zIE5VTEwuCitURVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVUZXN0LCBJc051bGxGb3JQb2ludGVyVHlwZXMpIHsKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxpbnQqPjo6R2V0KCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8Y29uc3QgY2hhcio+OjpHZXQoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTx2b2lkKj46OkdldCgpID09IE5VTEwpOworfQorCisvLyBUZXN0cyB0aGF0IEJ1aWx0SW5EZWZhdWx0VmFsdWU8VCo+OjpFeGlzdHMoKSByZXR1cm4gdHJ1ZS4KK1RFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIEV4aXN0c0ZvclBvaW50ZXJUeXBlcykgeworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPGludCo+OjpFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8Y29uc3QgY2hhcio+OjpFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8dm9pZCo+OjpFeGlzdHMoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQnVpbHRJbkRlZmF1bHRWYWx1ZTxUPjo6R2V0KCkgcmV0dXJucyAwIHdoZW4gVCBpcyBhCisvLyBidWlsdC1pbiBudW1lcmljIHR5cGUuCitURVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVUZXN0LCBJc1plcm9Gb3JOdW1lcmljVHlwZXMpIHsKKyAgRVhQRUNUX0VRKDBVLCBCdWlsdEluRGVmYXVsdFZhbHVlPHVuc2lnbmVkIGNoYXI+OjpHZXQoKSk7CisgIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPHNpZ25lZCBjaGFyPjo6R2V0KCkpOworICBFWFBFQ1RfRVEoMCwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxjaGFyPjo6R2V0KCkpOworI2lmIEdNT0NLX0hBU19TSUdORURfV0NIQVJfVF8KKyAgRVhQRUNUX0VRKDBVLCBCdWlsdEluRGVmYXVsdFZhbHVlPHVuc2lnbmVkIHdjaGFyX3Q+OjpHZXQoKSk7CisgIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPHNpZ25lZCB3Y2hhcl90Pjo6R2V0KCkpOworI2VuZGlmCisjaWYgR01PQ0tfV0NIQVJfVF9JU19OQVRJVkVfCisgIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPHdjaGFyX3Q+OjpHZXQoKSk7CisjZW5kaWYKKyAgRVhQRUNUX0VRKDBVLCBCdWlsdEluRGVmYXVsdFZhbHVlPHVuc2lnbmVkIHNob3J0Pjo6R2V0KCkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPHNpZ25lZCBzaG9ydD46OkdldCgpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoMCwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxzaG9ydD46OkdldCgpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoMFUsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8dW5zaWduZWQgaW50Pjo6R2V0KCkpOworICBFWFBFQ1RfRVEoMCwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxzaWduZWQgaW50Pjo6R2V0KCkpOworICBFWFBFQ1RfRVEoMCwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxpbnQ+OjpHZXQoKSk7CisgIEVYUEVDVF9FUSgwVSwgQnVpbHRJbkRlZmF1bHRWYWx1ZTx1bnNpZ25lZCBsb25nPjo6R2V0KCkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPHNpZ25lZCBsb25nPjo6R2V0KCkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPGxvbmc+OjpHZXQoKSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDBVLCBCdWlsdEluRGVmYXVsdFZhbHVlPFVJbnQ2ND46OkdldCgpKTsKKyAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8SW50NjQ+OjpHZXQoKSk7CisgIEVYUEVDVF9FUSgwLCBCdWlsdEluRGVmYXVsdFZhbHVlPGZsb2F0Pjo6R2V0KCkpOworICBFWFBFQ1RfRVEoMCwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxkb3VibGU+OjpHZXQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQnVpbHRJbkRlZmF1bHRWYWx1ZTxUPjo6RXhpc3RzKCkgcmV0dXJucyB0cnVlIHdoZW4gVCBpcyBhCisvLyBidWlsdC1pbiBudW1lcmljIHR5cGUuCitURVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVUZXN0LCBFeGlzdHNGb3JOdW1lcmljVHlwZXMpIHsKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTx1bnNpZ25lZCBjaGFyPjo6RXhpc3RzKCkpOworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHNpZ25lZCBjaGFyPjo6RXhpc3RzKCkpOworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPGNoYXI+OjpFeGlzdHMoKSk7CisjaWYgR01PQ0tfSEFTX1NJR05FRF9XQ0hBUl9UXworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHVuc2lnbmVkIHdjaGFyX3Q+OjpFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8c2lnbmVkIHdjaGFyX3Q+OjpFeGlzdHMoKSk7CisjZW5kaWYKKyNpZiBHTU9DS19XQ0hBUl9UX0lTX05BVElWRV8KKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTx3Y2hhcl90Pjo6RXhpc3RzKCkpOworI2VuZGlmCisgIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8dW5zaWduZWQgc2hvcnQ+OjpFeGlzdHMoKSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxzaWduZWQgc2hvcnQ+OjpFeGlzdHMoKSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxzaG9ydD46OkV4aXN0cygpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPHVuc2lnbmVkIGludD46OkV4aXN0cygpKTsKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxzaWduZWQgaW50Pjo6RXhpc3RzKCkpOworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPGludD46OkV4aXN0cygpKTsKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTx1bnNpZ25lZCBsb25nPjo6RXhpc3RzKCkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8c2lnbmVkIGxvbmc+OjpFeGlzdHMoKSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTxsb25nPjo6RXhpc3RzKCkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8VUludDY0Pjo6RXhpc3RzKCkpOworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPEludDY0Pjo6RXhpc3RzKCkpOworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPGZsb2F0Pjo6RXhpc3RzKCkpOworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPGRvdWJsZT46OkV4aXN0cygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBCdWlsdEluRGVmYXVsdFZhbHVlPGJvb2w+OjpHZXQoKSByZXR1cm5zIGZhbHNlLgorVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlVGVzdCwgSXNGYWxzZUZvckJvb2wpIHsKKyAgRVhQRUNUX0ZBTFNFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8Ym9vbD46OkdldCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBCdWlsdEluRGVmYXVsdFZhbHVlPGJvb2w+OjpFeGlzdHMoKSByZXR1cm5zIHRydWUuCitURVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVUZXN0LCBCb29sRXhpc3RzKSB7CisgIEVYUEVDVF9UUlVFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8Ym9vbD46OkV4aXN0cygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKSByZXR1cm5zICIiIHdoZW4gVCBpcyBhCisvLyBzdHJpbmcgdHlwZS4KK1RFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIElzRW1wdHlTdHJpbmdGb3JTdHJpbmcpIHsKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworICBFWFBFQ1RfRVEoIiIsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8IDo6c3RyaW5nPjo6R2V0KCkpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIEVYUEVDVF9FUSgiIiwgQnVpbHRJbkRlZmF1bHRWYWx1ZTwgOjpzdGQ6OnN0cmluZz46OkdldCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpFeGlzdHMoKSByZXR1cm5zIHRydWUgd2hlbiBUIGlzIGEKKy8vIHN0cmluZyB0eXBlLgorVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlVGVzdCwgRXhpc3RzRm9yU3RyaW5nKSB7CisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTwgOjpzdHJpbmc+OjpFeGlzdHMoKSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgRVhQRUNUX1RSVUUoQnVpbHRJbkRlZmF1bHRWYWx1ZTwgOjpzdGQ6OnN0cmluZz46OkV4aXN0cygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBCdWlsdEluRGVmYXVsdFZhbHVlPGNvbnN0IFQ+OjpHZXQoKSByZXR1cm5zIHRoZSBzYW1lCisvLyB2YWx1ZSBhcyBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKSBkb2VzLgorVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlVGVzdCwgV29ya3NGb3JDb25zdFR5cGVzKSB7CisgIEVYUEVDVF9FUSgiIiwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxjb25zdCBzdGQ6OnN0cmluZz46OkdldCgpKTsKKyAgRVhQRUNUX0VRKDAsIEJ1aWx0SW5EZWZhdWx0VmFsdWU8Y29uc3QgaW50Pjo6R2V0KCkpOworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPGNoYXIqIGNvbnN0Pjo6R2V0KCkgPT0gTlVMTCk7CisgIEVYUEVDVF9GQUxTRShCdWlsdEluRGVmYXVsdFZhbHVlPGNvbnN0IGJvb2w+OjpHZXQoKSk7Cit9CisKKy8vIEEgdHlwZSB0aGF0J3MgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlLgorY2xhc3MgTXlEZWZhdWx0Q29uc3RydWN0aWJsZSB7CisgcHVibGljOgorICBNeURlZmF1bHRDb25zdHJ1Y3RpYmxlKCkgOiB2YWx1ZV8oNDIpIHt9CisKKyAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICBpbnQgdmFsdWVfOworfTsKKworLy8gQSB0eXBlIHRoYXQncyBub3QgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlLgorY2xhc3MgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSB7CisgcHVibGljOgorICAvLyBEb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBjdG9yLgorICBleHBsaWNpdCBNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKGludCBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorCisgIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgcHJpdmF0ZToKKyAgaW50IHZhbHVlXzsKK307CisKKyNpZiBHVEVTVF9MQU5HX0NYWDExCisKK1RFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIEV4aXN0c0ZvckRlZmF1bHRDb25zdHJ1Y3RpYmxlVHlwZSkgeworICBFWFBFQ1RfVFJVRShCdWlsdEluRGVmYXVsdFZhbHVlPE15RGVmYXVsdENvbnN0cnVjdGlibGU+OjpFeGlzdHMoKSk7Cit9CisKK1RFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZVRlc3QsIElzRGVmYXVsdENvbnN0cnVjdGVkRm9yRGVmYXVsdENvbnN0cnVjdGlibGVUeXBlKSB7CisgIEVYUEVDVF9FUSg0MiwgQnVpbHRJbkRlZmF1bHRWYWx1ZTxNeURlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6R2V0KCkudmFsdWUoKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQorCitURVNUKEJ1aWx0SW5EZWZhdWx0VmFsdWVUZXN0LCBEb2VzTm90RXhpc3RGb3JOb25EZWZhdWx0Q29uc3RydWN0aWJsZVR5cGUpIHsKKyAgRVhQRUNUX0ZBTFNFKEJ1aWx0SW5EZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OkV4aXN0cygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBCdWlsdEluRGVmYXVsdFZhbHVlPFQmPjo6R2V0KCkgYWJvcnRzIHRoZSBwcm9ncmFtLgorVEVTVChCdWlsdEluRGVmYXVsdFZhbHVlRGVhdGhUZXN0LCBJc1VuZGVmaW5lZEZvclJlZmVyZW5jZXMpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7CisgICAgQnVpbHRJbkRlZmF1bHRWYWx1ZTxpbnQmPjo6R2V0KCk7CisgIH0sICIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7CisgICAgQnVpbHRJbkRlZmF1bHRWYWx1ZTxjb25zdCBjaGFyJj46OkdldCgpOworICB9LCAiIik7Cit9CisKK1RFU1QoQnVpbHRJbkRlZmF1bHRWYWx1ZURlYXRoVGVzdCwgSXNVbmRlZmluZWRGb3JOb25EZWZhdWx0Q29uc3RydWN0aWJsZVR5cGUpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7CisgICAgQnVpbHRJbkRlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6R2V0KCk7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgdGhhdCBEZWZhdWx0VmFsdWU8VD46OklzU2V0KCkgaXMgZmFsc2UgaW5pdGlhbGx5LgorVEVTVChEZWZhdWx0VmFsdWVUZXN0LCBJc0luaXRpYWxseVVuc2V0KSB7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8aW50Pjo6SXNTZXQoKSk7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8TXlEZWZhdWx0Q29uc3RydWN0aWJsZT46OklzU2V0KCkpOworICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPGNvbnN0IE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGU+OjpJc1NldCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBEZWZhdWx0VmFsdWU8VD4gY2FuIGJlIHNldCBhbmQgdGhlbiB1bnNldC4KK1RFU1QoRGVmYXVsdFZhbHVlVGVzdCwgQ2FuQmVTZXRBbmRVbnNldCkgeworICBFWFBFQ1RfVFJVRShEZWZhdWx0VmFsdWU8aW50Pjo6RXhpc3RzKCkpOworICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPGNvbnN0IE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGU+OjpFeGlzdHMoKSk7CisKKyAgRGVmYXVsdFZhbHVlPGludD46OlNldCgxKTsKKyAgRGVmYXVsdFZhbHVlPGNvbnN0IE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGU+OjpTZXQoCisgICAgICBNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKDQyKSk7CisKKyAgRVhQRUNUX0VRKDEsIERlZmF1bHRWYWx1ZTxpbnQ+OjpHZXQoKSk7CisgIEVYUEVDVF9FUSg0MiwgRGVmYXVsdFZhbHVlPGNvbnN0IE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGU+OjpHZXQoKS52YWx1ZSgpKTsKKworICBFWFBFQ1RfVFJVRShEZWZhdWx0VmFsdWU8aW50Pjo6RXhpc3RzKCkpOworICBFWFBFQ1RfVFJVRShEZWZhdWx0VmFsdWU8Y29uc3QgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OkV4aXN0cygpKTsKKworICBEZWZhdWx0VmFsdWU8aW50Pjo6Q2xlYXIoKTsKKyAgRGVmYXVsdFZhbHVlPGNvbnN0IE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGU+OjpDbGVhcigpOworCisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8aW50Pjo6SXNTZXQoKSk7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8Y29uc3QgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OklzU2V0KCkpOworCisgIEVYUEVDVF9UUlVFKERlZmF1bHRWYWx1ZTxpbnQ+OjpFeGlzdHMoKSk7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8Y29uc3QgTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OkV4aXN0cygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBEZWZhdWx0VmFsdWU8VD46OkdldCgpIHJldHVybnMgdGhlCisvLyBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKSB3aGVuIERlZmF1bHRWYWx1ZTxUPjo6SXNTZXQoKSBpcworLy8gZmFsc2UuCitURVNUKERlZmF1bHRWYWx1ZURlYXRoVGVzdCwgR2V0UmV0dXJuc0J1aWx0SW5EZWZhdWx0VmFsdWVXaGVuVW5zZXQpIHsKKyAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxpbnQ+OjpJc1NldCgpKTsKKyAgRVhQRUNUX1RSVUUoRGVmYXVsdFZhbHVlPGludD46OkV4aXN0cygpKTsKKyAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6SXNTZXQoKSk7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OkV4aXN0cygpKTsKKworICBFWFBFQ1RfRVEoMCwgRGVmYXVsdFZhbHVlPGludD46OkdldCgpKTsKKworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKKyAgICBEZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZT46OkdldCgpOworICB9LCAiIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCitURVNUKERlZmF1bHRWYWx1ZVRlc3QsIEdldFdvcmtzRm9yTW92ZU9ubHlJZlNldCkgeworICBFWFBFQ1RfVFJVRShEZWZhdWx0VmFsdWU8c3RkOjp1bmlxdWVfcHRyPGludD4+OjpFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKERlZmF1bHRWYWx1ZTxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj46OkdldCgpID09IE5VTEwpOworICBEZWZhdWx0VmFsdWU8c3RkOjp1bmlxdWVfcHRyPGludD4+OjpTZXRGYWN0b3J5KFtdIHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPGludD4obmV3IGludCg0MikpOworICB9KTsKKyAgRVhQRUNUX1RSVUUoRGVmYXVsdFZhbHVlPHN0ZDo6dW5pcXVlX3B0cjxpbnQ+Pjo6RXhpc3RzKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiBpID0gRGVmYXVsdFZhbHVlPHN0ZDo6dW5pcXVlX3B0cjxpbnQ+Pjo6R2V0KCk7CisgIEVYUEVDVF9FUSg0MiwgKmkpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCisKKy8vIFRlc3RzIHRoYXQgRGVmYXVsdFZhbHVlPHZvaWQ+OjpHZXQoKSByZXR1cm5zIHZvaWQuCitURVNUKERlZmF1bHRWYWx1ZVRlc3QsIEdldFdvcmtzRm9yVm9pZCkgeworICByZXR1cm4gRGVmYXVsdFZhbHVlPHZvaWQ+OjpHZXQoKTsKK30KKworLy8gVGVzdHMgdXNpbmcgRGVmYXVsdFZhbHVlIHdpdGggYSByZWZlcmVuY2UgdHlwZS4KKworLy8gVGVzdHMgdGhhdCBEZWZhdWx0VmFsdWU8VCY+OjpJc1NldCgpIGlzIGZhbHNlIGluaXRpYWxseS4KK1RFU1QoRGVmYXVsdFZhbHVlT2ZSZWZlcmVuY2VUZXN0LCBJc0luaXRpYWxseVVuc2V0KSB7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8aW50Jj46OklzU2V0KCkpOworICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPE15RGVmYXVsdENvbnN0cnVjdGlibGUmPjo6SXNTZXQoKSk7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSY+OjpJc1NldCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBEZWZhdWx0VmFsdWU8VCY+OjpFeGlzdHMgaXMgZmFsc2UgaW5pdGlhbGxseS4KK1RFU1QoRGVmYXVsdFZhbHVlT2ZSZWZlcmVuY2VUZXN0LCBJc0luaXRpYWxseU5vdEV4aXN0aW5nKSB7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8aW50Jj46OkV4aXN0cygpKTsKKyAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxNeURlZmF1bHRDb25zdHJ1Y3RpYmxlJj46OkV4aXN0cygpKTsKKyAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlJj46OkV4aXN0cygpKTsKK30KKworLy8gVGVzdHMgdGhhdCBEZWZhdWx0VmFsdWU8VCY+IGNhbiBiZSBzZXQgYW5kIHRoZW4gdW5zZXQuCitURVNUKERlZmF1bHRWYWx1ZU9mUmVmZXJlbmNlVGVzdCwgQ2FuQmVTZXRBbmRVbnNldCkgeworICBpbnQgbiA9IDE7CisgIERlZmF1bHRWYWx1ZTxjb25zdCBpbnQmPjo6U2V0KG4pOworICBNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlIHgoNDIpOworICBEZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSY+OjpTZXQoeCk7CisKKyAgRVhQRUNUX1RSVUUoRGVmYXVsdFZhbHVlPGNvbnN0IGludCY+OjpFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlJj46OkV4aXN0cygpKTsKKworICBFWFBFQ1RfRVEoJm4sICYoRGVmYXVsdFZhbHVlPGNvbnN0IGludCY+OjpHZXQoKSkpOworICBFWFBFQ1RfRVEoJngsICYoRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUmPjo6R2V0KCkpKTsKKworICBEZWZhdWx0VmFsdWU8Y29uc3QgaW50Jj46OkNsZWFyKCk7CisgIERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlJj46OkNsZWFyKCk7CisKKyAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxjb25zdCBpbnQmPjo6RXhpc3RzKCkpOworICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUmPjo6RXhpc3RzKCkpOworCisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8Y29uc3QgaW50Jj46OklzU2V0KCkpOworICBFWFBFQ1RfRkFMU0UoRGVmYXVsdFZhbHVlPE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUmPjo6SXNTZXQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRGVmYXVsdFZhbHVlPFQmPjo6R2V0KCkgcmV0dXJucyB0aGUKKy8vIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VCY+OjpHZXQoKSB3aGVuIERlZmF1bHRWYWx1ZTxUJj46OklzU2V0KCkgaXMKKy8vIGZhbHNlLgorVEVTVChEZWZhdWx0VmFsdWVPZlJlZmVyZW5jZURlYXRoVGVzdCwgR2V0UmV0dXJuc0J1aWx0SW5EZWZhdWx0VmFsdWVXaGVuVW5zZXQpIHsKKyAgRVhQRUNUX0ZBTFNFKERlZmF1bHRWYWx1ZTxpbnQmPjo6SXNTZXQoKSk7CisgIEVYUEVDVF9GQUxTRShEZWZhdWx0VmFsdWU8TXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSY+OjpJc1NldCgpKTsKKworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKKyAgICBEZWZhdWx0VmFsdWU8aW50Jj46OkdldCgpOworICB9LCAiIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoeworICAgIERlZmF1bHRWYWx1ZTxNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlPjo6R2V0KCk7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgdGhhdCBBY3Rpb25JbnRlcmZhY2UgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGRlZmluaW5nIHRoZQorLy8gUGVyZm9ybSBtZXRob2QuCisKK3R5cGVkZWYgaW50IE15R2xvYmFsRnVuY3Rpb24oYm9vbCwgaW50KTsKKworY2xhc3MgTXlBY3Rpb25JbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxNeUdsb2JhbEZ1bmN0aW9uPiB7CisgcHVibGljOgorICB2aXJ0dWFsIGludCBQZXJmb3JtKGNvbnN0IHR1cGxlPGJvb2wsIGludD4mIGFyZ3MpIHsKKyAgICByZXR1cm4gZ2V0PDA+KGFyZ3MpID8gZ2V0PDE+KGFyZ3MpIDogMDsKKyAgfQorfTsKKworVEVTVChBY3Rpb25JbnRlcmZhY2VUZXN0LCBDYW5CZUltcGxlbWVudGVkQnlEZWZpbmluZ1BlcmZvcm0pIHsKKyAgTXlBY3Rpb25JbXBsIG15X2FjdGlvbl9pbXBsOworICAodm9pZClteV9hY3Rpb25faW1wbDsKK30KKworVEVTVChBY3Rpb25JbnRlcmZhY2VUZXN0LCBNYWtlQWN0aW9uKSB7CisgIEFjdGlvbjxNeUdsb2JhbEZ1bmN0aW9uPiBhY3Rpb24gPSBNYWtlQWN0aW9uKG5ldyBNeUFjdGlvbkltcGwpOworCisgIC8vIFdoZW4gZXhlcmNpc2luZyB0aGUgUGVyZm9ybSgpIG1ldGhvZCBvZiBBY3Rpb248Rj4sIHdlIG11c3QgcGFzcworICAvLyBpdCBhIHR1cGxlIHdob3NlIHNpemUgYW5kIHR5cGUgYXJlIGNvbXBhdGlibGUgd2l0aCBGJ3MgYXJndW1lbnQKKyAgLy8gdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgRiBpcyBpbnQoKSwgdGhlbiBQZXJmb3JtKCkgdGFrZXMgYQorICAvLyAwLXR1cGxlOyBpZiBGIGlzIHZvaWQoYm9vbCwgaW50KSwgdGhlbiBQZXJmb3JtKCkgdGFrZXMgYQorICAvLyB0dXBsZTxib29sLCBpbnQ+LCBhbmQgc28gb24uCisgIEVYUEVDVF9FUSg1LCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIDUpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQWN0aW9uPEY+IGNhbiBiZSBjb250cnVjdGVkIGZyb20gYSBwb2ludGVyIHRvCisvLyBBY3Rpb25JbnRlcmZhY2U8Rj4uCitURVNUKEFjdGlvblRlc3QsIENhbkJlQ29uc3RydWN0ZWRGcm9tQWN0aW9uSW50ZXJmYWNlKSB7CisgIEFjdGlvbjxNeUdsb2JhbEZ1bmN0aW9uPiBhY3Rpb24obmV3IE15QWN0aW9uSW1wbCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQWN0aW9uPEY+IGRlbGVnYXRlcyBhY3R1YWwgd29yayB0byBBY3Rpb25JbnRlcmZhY2U8Rj4uCitURVNUKEFjdGlvblRlc3QsIERlbGVnYXRlc1dvcmtUb0FjdGlvbkludGVyZmFjZSkgeworICBjb25zdCBBY3Rpb248TXlHbG9iYWxGdW5jdGlvbj4gYWN0aW9uKG5ldyBNeUFjdGlvbkltcGwpOworCisgIEVYUEVDVF9FUSg1LCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIDUpKSk7CisgIEVYUEVDVF9FUSgwLCBhY3Rpb24uUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlLCAxKSkpOworfQorCisvLyBUZXN0cyB0aGF0IEFjdGlvbjxGPiBjYW4gYmUgY29waWVkLgorVEVTVChBY3Rpb25UZXN0LCBJc0NvcHlhYmxlKSB7CisgIEFjdGlvbjxNeUdsb2JhbEZ1bmN0aW9uPiBhMShuZXcgTXlBY3Rpb25JbXBsKTsKKyAgQWN0aW9uPE15R2xvYmFsRnVuY3Rpb24+IGEyKGExKTsgIC8vIFRlc3RzIHRoZSBjb3B5IGNvbnN0cnVjdG9yLgorCisgIC8vIGExIHNob3VsZCBjb250aW51ZSB0byB3b3JrIGFmdGVyIGJlaW5nIGNvcGllZCBmcm9tLgorICBFWFBFQ1RfRVEoNSwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIDUpKSk7CisgIEVYUEVDVF9FUSgwLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoZmFsc2UsIDEpKSk7CisKKyAgLy8gYTIgc2hvdWxkIHdvcmsgbGlrZSB0aGUgYWN0aW9uIGl0IHdhcyBjb3BpZWQgZnJvbS4KKyAgRVhQRUNUX0VRKDUsIGEyLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCA1KSkpOworICBFWFBFQ1RfRVEoMCwgYTIuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlLCAxKSkpOworCisgIGEyID0gYTE7ICAvLyBUZXN0cyB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KKworICAvLyBhMSBzaG91bGQgY29udGludWUgdG8gd29yayBhZnRlciBiZWluZyBjb3BpZWQgZnJvbS4KKyAgRVhQRUNUX0VRKDUsIGExLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCA1KSkpOworICBFWFBFQ1RfRVEoMCwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlLCAxKSkpOworCisgIC8vIGEyIHNob3VsZCB3b3JrIGxpa2UgdGhlIGFjdGlvbiBpdCB3YXMgY29waWVkIGZyb20uCisgIEVYUEVDVF9FUSg1LCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgNSkpKTsKKyAgRVhQRUNUX0VRKDAsIGEyLlBlcmZvcm0obWFrZV90dXBsZShmYWxzZSwgMSkpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbiBBY3Rpb248RnJvbT4gb2JqZWN0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQorLy8gY29tcGF0aWJsZSBBY3Rpb248VG8+IG9iamVjdC4KKworY2xhc3MgSXNOb3RaZXJvIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxib29sKGludCk+IHsgIC8vIE5PTElOVAorIHB1YmxpYzoKKyAgdmlydHVhbCBib29sIFBlcmZvcm0oY29uc3QgdHVwbGU8aW50PiYgYXJnKSB7CisgICAgcmV0dXJuIGdldDwwPihhcmcpICE9IDA7CisgIH0KK307CisKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorLy8gQ29tcGlsaW5nIHRoaXMgdGVzdCBvbiBOb2tpYSdzIFN5bWJpYW4gY29tcGlsZXIgZmFpbHMgd2l0aDoKKy8vICAnUmVzdWx0JyBpcyBub3QgYSBtZW1iZXIgb2YgY2xhc3MgJ3Rlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxpbnQ+JworLy8gIChwb2ludCBvZiBpbnN0YW50aWF0aW9uOiAnQHVubmFtZWRAZ21vY2tfYWN0aW9uc190ZXN0X2NjQDo6CisvLyAgICAgIEFjdGlvblRlc3RfQ2FuQmVDb252ZXJ0ZWRUb090aGVyQWN0aW9uVHlwZV9UZXN0OjpUZXN0Qm9keSgpJykKKy8vIHdpdGggbm8gb2J2aW91cyBmaXguCitURVNUKEFjdGlvblRlc3QsIENhbkJlQ29udmVydGVkVG9PdGhlckFjdGlvblR5cGUpIHsKKyAgY29uc3QgQWN0aW9uPGJvb2woaW50KT4gYTEobmV3IElzTm90WmVybyk7ICAvLyBOT0xJTlQKKyAgY29uc3QgQWN0aW9uPGludChjaGFyKT4gYTIgPSBBY3Rpb248aW50KGNoYXIpPihhMSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEsIGEyLlBlcmZvcm0obWFrZV90dXBsZSgnYScpKSk7CisgIEVYUEVDVF9FUSgwLCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoJ1wwJykpKTsKK30KKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4KKworLy8gVGhlIGZvbGxvd2luZyB0d28gY2xhc3NlcyBhcmUgZm9yIHRlc3RpbmcgTWFrZVBvbHltb3JwaGljQWN0aW9uKCkuCisKKy8vIEltcGxlbWVudHMgYSBwb2x5bW9ycGhpYyBhY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZWNvbmQgb2YgdGhlCisvLyBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuCitjbGFzcyBSZXR1cm5TZWNvbmRBcmd1bWVudEFjdGlvbiB7CisgcHVibGljOgorICAvLyBXZSB3YW50IHRvIHZlcmlmeSB0aGF0IE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpIGNhbiB3b3JrIHdpdGggYQorICAvLyBwb2x5bW9ycGhpYyBhY3Rpb24gd2hvc2UgUGVyZm9ybSgpIG1ldGhvZCB0ZW1wbGF0ZSBpcyBlaXRoZXIKKyAgLy8gY29uc3Qgb3Igbm90LiAgVGhpcyBsZXRzIHVzIHZlcmlmeSB0aGUgbm9uLWNvbnN0IGNhc2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+CisgIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsgcmV0dXJuIGdldDwxPihhcmdzKTsgfQorfTsKKworLy8gSW1wbGVtZW50cyBhIHBvbHltb3JwaGljIGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGEgbnVsbGFyeQorLy8gZnVuY3Rpb24gdG8gcmV0dXJuIDAuCitjbGFzcyBSZXR1cm5aZXJvRnJvbU51bGxhcnlGdW5jdGlvbkFjdGlvbiB7CisgcHVibGljOgorICAvLyBGb3IgdGVzdGluZyB0aGF0IE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpIHdvcmtzIHdoZW4gdGhlCisgIC8vIGltcGxlbWVudGF0aW9uIGNsYXNzJyBQZXJmb3JtKCkgbWV0aG9kIHRlbXBsYXRlIHRha2VzIG9ubHkgb25lCisgIC8vIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgLy8KKyAgLy8gV2Ugd2FudCB0byB2ZXJpZnkgdGhhdCBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSBjYW4gd29yayB3aXRoIGEKKyAgLy8gcG9seW1vcnBoaWMgYWN0aW9uIHdob3NlIFBlcmZvcm0oKSBtZXRob2QgdGVtcGxhdGUgaXMgZWl0aGVyCisgIC8vIGNvbnN0IG9yIG5vdC4gIFRoaXMgbGV0cyB1cyB2ZXJpZnkgdGhlIGNvbnN0IGNhc2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQ+CisgIFJlc3VsdCBQZXJmb3JtKGNvbnN0IHR1cGxlPD4mKSBjb25zdCB7IHJldHVybiAwOyB9Cit9OworCisvLyBUaGVzZSBmdW5jdGlvbnMgdmVyaWZ5IHRoYXQgTWFrZVBvbHltb3JwaGljQWN0aW9uKCkgcmV0dXJucyBhCisvLyBQb2x5bW9ycGhpY0FjdGlvbjxUPiB3aGVyZSBUIGlzIHRoZSBhcmd1bWVudCdzIHR5cGUuCisKK1BvbHltb3JwaGljQWN0aW9uPFJldHVyblNlY29uZEFyZ3VtZW50QWN0aW9uPiBSZXR1cm5TZWNvbmRBcmd1bWVudCgpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihSZXR1cm5TZWNvbmRBcmd1bWVudEFjdGlvbigpKTsKK30KKworUG9seW1vcnBoaWNBY3Rpb248UmV0dXJuWmVyb0Zyb21OdWxsYXJ5RnVuY3Rpb25BY3Rpb24+CitSZXR1cm5aZXJvRnJvbU51bGxhcnlGdW5jdGlvbigpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihSZXR1cm5aZXJvRnJvbU51bGxhcnlGdW5jdGlvbkFjdGlvbigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSB0dXJucyBhIHBvbHltb3JwaGljIGFjdGlvbgorLy8gaW1wbGVtZW50YXRpb24gY2xhc3MgaW50byBhIHBvbHltb3JwaGljIGFjdGlvbi4KK1RFU1QoTWFrZVBvbHltb3JwaGljQWN0aW9uVGVzdCwgQ29uc3RydWN0c0FjdGlvbkZyb21JbXBsKSB7CisgIEFjdGlvbjxpbnQoYm9vbCwgaW50LCBkb3VibGUpPiBhMSA9IFJldHVyblNlY29uZEFyZ3VtZW50KCk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDUsIGExLlBlcmZvcm0obWFrZV90dXBsZShmYWxzZSwgNSwgMi4wKSkpOworfQorCisvLyBUZXN0cyB0aGF0IE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpIHdvcmtzIHdoZW4gdGhlIGltcGxlbWVudGF0aW9uCisvLyBjbGFzcycgUGVyZm9ybSgpIG1ldGhvZCB0ZW1wbGF0ZSBoYXMgb25seSBvbmUgdGVtcGxhdGUgcGFyYW1ldGVyLgorVEVTVChNYWtlUG9seW1vcnBoaWNBY3Rpb25UZXN0LCBXb3Jrc1doZW5QZXJmb3JtSGFzT25lVGVtcGxhdGVQYXJhbWV0ZXIpIHsKKyAgQWN0aW9uPGludCgpPiBhMSA9IFJldHVyblplcm9Gcm9tTnVsbGFyeUZ1bmN0aW9uKCk7CisgIEVYUEVDVF9FUSgwLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworCisgIEFjdGlvbjx2b2lkKigpPiBhMiA9IFJldHVyblplcm9Gcm9tTnVsbGFyeUZ1bmN0aW9uKCk7CisgIEVYUEVDVF9UUlVFKGEyLlBlcmZvcm0obWFrZV90dXBsZSgpKSA9PSBOVUxMKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZXR1cm4oKSB3b3JrcyBhcyBhbiBhY3Rpb24gZm9yIHZvaWQtcmV0dXJuaW5nCisvLyBmdW5jdGlvbnMuCitURVNUKFJldHVyblRlc3QsIFdvcmtzRm9yVm9pZCkgeworICBjb25zdCBBY3Rpb248dm9pZChpbnQpPiByZXQgPSBSZXR1cm4oKTsgIC8vIE5PTElOVAorICByZXR1cm4gcmV0LlBlcmZvcm0obWFrZV90dXBsZSgxKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmV0dXJuKHYpIHJldHVybnMgdi4KK1RFU1QoUmV0dXJuVGVzdCwgUmV0dXJuc0dpdmVuVmFsdWUpIHsKKyAgQWN0aW9uPGludCgpPiByZXQgPSBSZXR1cm4oMSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEsIHJldC5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworCisgIHJldCA9IFJldHVybigtNSk7CisgIEVYUEVDVF9FUSgtNSwgcmV0LlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmV0dXJuKCJzdHJpbmcgbGl0ZXJhbCIpIHdvcmtzLgorVEVTVChSZXR1cm5UZXN0LCBBY2NlcHRzU3RyaW5nTGl0ZXJhbCkgeworICBBY3Rpb248Y29uc3QgY2hhciooKT4gYTEgPSBSZXR1cm4oIkhlbGxvIik7CisgIEVYUEVDVF9TVFJFUSgiSGVsbG8iLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworCisgIEFjdGlvbjxzdGQ6OnN0cmluZygpPiBhMiA9IFJldHVybigid29ybGQiKTsKKyAgRVhQRUNUX0VRKCJ3b3JsZCIsIGEyLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Cit9CisKKy8vIFRlc3Qgc3RydWN0IHdoaWNoIHdyYXBzIGEgdmVjdG9yIG9mIGludGVnZXJzLiBVc2VkIGluCisvLyAnU3VwcG9ydHNXcmFwcGVyUmV0dXJuVHlwZScgdGVzdC4KK3N0cnVjdCBJbnRlZ2VyVmVjdG9yV3JhcHBlciB7CisgIHN0ZDo6dmVjdG9yPGludD4gKiB2OworICBJbnRlZ2VyVmVjdG9yV3JhcHBlcihzdGQ6OnZlY3RvcjxpbnQ+JiBfdikgOiB2KCZfdikge30gIC8vIE5PTElOVAorfTsKKworLy8gVGVzdHMgdGhhdCBSZXR1cm4oKSB3b3JrcyB3aGVuIHJldHVybiB0eXBlIGlzIGEgd3JhcHBlciB0eXBlLgorVEVTVChSZXR1cm5UZXN0LCBTdXBwb3J0c1dyYXBwZXJSZXR1cm5UeXBlKSB7CisgIC8vIEluaXRpYWxpemUgdmVjdG9yIG9mIGludGVnZXJzLgorICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB2LnB1c2hfYmFjayhpKTsKKworICAvLyBSZXR1cm4oKSBjYWxsZWQgd2l0aCAndicgYXMgYXJndW1lbnQuIFRoZSBBY3Rpb24gd2lsbCByZXR1cm4gdGhlIHNhbWUgZGF0YQorICAvLyBhcyAndicgKGNvcHkpIGJ1dCBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gYW4gSW50ZWdlclZlY3RvcldyYXBwZXIuCisgIEFjdGlvbjxJbnRlZ2VyVmVjdG9yV3JhcHBlcigpPiBhID0gUmV0dXJuKHYpOworICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiByZXN1bHQgPSAqKGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpLnYpOworICBFWFBFQ1RfVEhBVChyZXN1bHQsIDo6dGVzdGluZzo6RWxlbWVudHNBcmUoMCwgMSwgMiwgMywgNCkpOworfQorCisvLyBUZXN0cyB0aGF0IFJldHVybih2KSBpcyBjb3ZhcmFpbnQuCisKK3N0cnVjdCBCYXNlIHsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJhc2UmKSB7IHJldHVybiB0cnVlOyB9Cit9OworCitzdHJ1Y3QgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlcml2ZWQmKSB7IHJldHVybiB0cnVlOyB9Cit9OworCitURVNUKFJldHVyblRlc3QsIElzQ292YXJpYW50KSB7CisgIEJhc2UgYmFzZTsKKyAgRGVyaXZlZCBkZXJpdmVkOworICBBY3Rpb248QmFzZSooKT4gcmV0ID0gUmV0dXJuKCZiYXNlKTsKKyAgRVhQRUNUX0VRKCZiYXNlLCByZXQuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKworICByZXQgPSBSZXR1cm4oJmRlcml2ZWQpOworICBFWFBFQ1RfRVEoJmRlcml2ZWQsIHJldC5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBwYXNzZWQgaW50byBSZXR1cm4gaXMgY29udmVydGVkIGludG8gVAorLy8gd2hlbiB0aGUgYWN0aW9uIGlzIGNhc3QgdG8gQWN0aW9uPFQoLi4uKT4gcmF0aGVyIHRoYW4gd2hlbiB0aGUgYWN0aW9uIGlzCisvLyBwZXJmb3JtZWQuIFNlZSBjb21tZW50cyBvbiB0ZXN0aW5nOjppbnRlcm5hbDo6UmV0dXJuQWN0aW9uIGluCisvLyBnbW9jay1hY3Rpb25zLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uCitjbGFzcyBGcm9tVHlwZSB7CisgcHVibGljOgorICBleHBsaWNpdCBGcm9tVHlwZShib29sKiBpc19jb252ZXJ0ZWQpIDogY29udmVydGVkXyhpc19jb252ZXJ0ZWQpIHt9CisgIGJvb2wqIGNvbnZlcnRlZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnZlcnRlZF87IH0KKworIHByaXZhdGU6CisgIGJvb2wqIGNvbnN0IGNvbnZlcnRlZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhGcm9tVHlwZSk7Cit9OworCitjbGFzcyBUb1R5cGUgeworIHB1YmxpYzoKKyAgLy8gTXVzdCBhbGxvdyBpbXBsaWNpdCBjb252ZXJzaW9uIGR1ZSB0byB1c2UgaW4gSW1wbGljaXRDYXN0XzxUPi4KKyAgVG9UeXBlKGNvbnN0IEZyb21UeXBlJiB4KSB7ICp4LmNvbnZlcnRlZCgpID0gdHJ1ZTsgfSAgLy8gTk9MSU5UCit9OworCitURVNUKFJldHVyblRlc3QsIENvbnZlcnRzQXJndW1lbnRXaGVuQ29udmVydGVkKSB7CisgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgIEZyb21UeXBlIHgoJmNvbnZlcnRlZCk7CisgIEFjdGlvbjxUb1R5cGUoKT4gYWN0aW9uKFJldHVybih4KSk7CisgIEVYUEVDVF9UUlVFKGNvbnZlcnRlZCkgPDwgIlJldHVybiBtdXN0IGNvbnZlcnQgaXRzIGFyZ3VtZW50IGluIGl0cyBvd24gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJjb252ZXJzaW9uIG9wZXJhdG9yLiI7CisgIGNvbnZlcnRlZCA9IGZhbHNlOworICBhY3Rpb24uUGVyZm9ybSh0dXBsZTw+KCkpOworICBFWFBFQ1RfRkFMU0UoY29udmVydGVkKSA8PCAiQWN0aW9uIG11c3QgTk9UIGNvbnZlcnQgaXRzIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIndoZW4gcGVyZm9ybWVkLiI7Cit9CisKK2NsYXNzIERlc3RpbmF0aW9uVHlwZSB7fTsKKworY2xhc3MgU291cmNlVHlwZSB7CisgcHVibGljOgorICAvLyBOb3RlOiBhIG5vbi1jb25zdCB0eXBlY2FzdCBvcGVyYXRvci4KKyAgb3BlcmF0b3IgRGVzdGluYXRpb25UeXBlKCkgeyByZXR1cm4gRGVzdGluYXRpb25UeXBlKCk7IH0KK307CisKK1RFU1QoUmV0dXJuVGVzdCwgQ2FuQ29udmVydEFyZ3VtZW50VXNpbmdOb25Db25zdFR5cGVDYXN0T3BlcmF0b3IpIHsKKyAgU291cmNlVHlwZSBzOworICBBY3Rpb248RGVzdGluYXRpb25UeXBlKCk+IGFjdGlvbihSZXR1cm4ocykpOworfQorCisvLyBUZXN0cyB0aGF0IFJldHVybk51bGwoKSByZXR1cm5zIE5VTEwgaW4gYSBwb2ludGVyLXJldHVybmluZyBmdW5jdGlvbi4KK1RFU1QoUmV0dXJuTnVsbFRlc3QsIFdvcmtzSW5Qb2ludGVyUmV0dXJuaW5nRnVuY3Rpb24pIHsKKyAgY29uc3QgQWN0aW9uPGludCooKT4gYTEgPSBSZXR1cm5OdWxsKCk7CisgIEVYUEVDVF9UUlVFKGExLlBlcmZvcm0obWFrZV90dXBsZSgpKSA9PSBOVUxMKTsKKworICBjb25zdCBBY3Rpb248Y29uc3QgY2hhciooYm9vbCk+IGEyID0gUmV0dXJuTnVsbCgpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKGEyLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlKSkgPT0gTlVMTCk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCisvLyBUZXN0cyB0aGF0IFJldHVybk51bGwoKSByZXR1cm5zIE5VTEwgZm9yIHNoYXJlZF9wdHIgYW5kIHVuaXF1ZV9wdHIgcmV0dXJuaW5nCisvLyBmdW5jdGlvbnMuCitURVNUKFJldHVybk51bGxUZXN0LCBXb3Jrc0luU21hcnRQb2ludGVyUmV0dXJuaW5nRnVuY3Rpb24pIHsKKyAgY29uc3QgQWN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBpbnQ+KCk+IGExID0gUmV0dXJuTnVsbCgpOworICBFWFBFQ1RfVFJVRShhMS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkgPT0gbnVsbHB0cik7CisKKyAgY29uc3QgQWN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxpbnQ+KHN0ZDo6c3RyaW5nKT4gYTIgPSBSZXR1cm5OdWxsKCk7CisgIEVYUEVDVF9UUlVFKGEyLlBlcmZvcm0obWFrZV90dXBsZSgiZm9vIikpID09IG51bGxwdHIpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCisKKy8vIFRlc3RzIHRoYXQgUmV0dXJuUmVmKHYpIHdvcmtzIGZvciByZWZlcmVuY2UgdHlwZXMuCitURVNUKFJldHVyblJlZlRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlKSB7CisgIGNvbnN0IGludCBuID0gMDsKKyAgY29uc3QgQWN0aW9uPGNvbnN0IGludCYoYm9vbCk+IHJldCA9IFJldHVyblJlZihuKTsgIC8vIE5PTElOVAorCisgIEVYUEVDVF9FUSgmbiwgJnJldC5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSkpKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZXR1cm5SZWYodikgaXMgY292YXJpYW50LgorVEVTVChSZXR1cm5SZWZUZXN0LCBJc0NvdmFyaWFudCkgeworICBCYXNlIGJhc2U7CisgIERlcml2ZWQgZGVyaXZlZDsKKyAgQWN0aW9uPEJhc2UmKCk+IGEgPSBSZXR1cm5SZWYoYmFzZSk7CisgIEVYUEVDVF9FUSgmYmFzZSwgJmEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKworICBhID0gUmV0dXJuUmVmKGRlcml2ZWQpOworICBFWFBFQ1RfRVEoJmRlcml2ZWQsICZhLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmV0dXJuUmVmT2ZDb3B5KHYpIHdvcmtzIGZvciByZWZlcmVuY2UgdHlwZXMuCitURVNUKFJldHVyblJlZk9mQ29weVRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlKSB7CisgIGludCBuID0gNDI7CisgIGNvbnN0IEFjdGlvbjxjb25zdCBpbnQmKCk+IHJldCA9IFJldHVyblJlZk9mQ29weShuKTsKKworICBFWFBFQ1RfTkUoJm4sICZyZXQuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKyAgRVhQRUNUX0VRKDQyLCByZXQuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKworICBuID0gNDM7CisgIEVYUEVDVF9ORSgmbiwgJnJldC5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworICBFWFBFQ1RfRVEoNDIsIHJldC5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworfQorCisvLyBUZXN0cyB0aGF0IFJldHVyblJlZk9mQ29weSh2KSBpcyBjb3ZhcmlhbnQuCitURVNUKFJldHVyblJlZk9mQ29weVRlc3QsIElzQ292YXJpYW50KSB7CisgIEJhc2UgYmFzZTsKKyAgRGVyaXZlZCBkZXJpdmVkOworICBBY3Rpb248QmFzZSYoKT4gYSA9IFJldHVyblJlZk9mQ29weShiYXNlKTsKKyAgRVhQRUNUX05FKCZiYXNlLCAmYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworCisgIGEgPSBSZXR1cm5SZWZPZkNvcHkoZGVyaXZlZCk7CisgIEVYUEVDVF9ORSgmZGVyaXZlZCwgJmEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKK30KKworLy8gVGVzdHMgdGhhdCBEb0RlZmF1bHQoKSBkb2VzIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIG1vY2sgbWV0aG9kLgorCitjbGFzcyBNb2NrQ2xhc3MgeworIHB1YmxpYzoKKyAgTW9ja0NsYXNzKCkge30KKworICBNT0NLX01FVEhPRDEoSW50RnVuYywgaW50KGJvb2wgZmxhZykpOyAgLy8gTk9MSU5UCisgIE1PQ0tfTUVUSE9EMChGb28sIE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUoKSk7CisjaWYgR1RFU1RfSEFTX1NURF9VTklRVUVfUFRSXworICBNT0NLX01FVEhPRDAoTWFrZVVuaXF1ZSwgc3RkOjp1bmlxdWVfcHRyPGludD4oKSk7CisgIE1PQ0tfTUVUSE9EMChNYWtlVW5pcXVlQmFzZSwgc3RkOjp1bmlxdWVfcHRyPEJhc2U+KCkpOworICBNT0NLX01FVEhPRDAoTWFrZVZlY3RvclVuaXF1ZSwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGludD4+KCkpOworI2VuZGlmCisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tDbGFzcyk7Cit9OworCisvLyBUZXN0cyB0aGF0IERvRGVmYXVsdCgpIHJldHVybnMgdGhlIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQorLy8gcmV0dXJuIHR5cGUgYnkgZGVmYXVsdC4KK1RFU1QoRG9EZWZhdWx0VGVzdCwgUmV0dXJuc0J1aWx0SW5EZWZhdWx0VmFsdWVCeURlZmF1bHQpIHsKKyAgTW9ja0NsYXNzIG1vY2s7CisgIEVYUEVDVF9DQUxMKG1vY2ssIEludEZ1bmMoXykpCisgICAgICAuV2lsbE9uY2UoRG9EZWZhdWx0KCkpOworICBFWFBFQ1RfRVEoMCwgbW9jay5JbnRGdW5jKHRydWUpKTsKK30KKworLy8gVGVzdHMgdGhhdCBEb0RlZmF1bHQoKSB0aHJvd3MgKHdoZW4gZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCkgb3IgYWJvcnRzCisvLyB0aGUgcHJvY2VzcyB3aGVuIHRoZXJlIGlzIG5vIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSByZXR1cm4gdHlwZS4KK1RFU1QoRG9EZWZhdWx0RGVhdGhUZXN0LCBEaWVzRm9yVW5rbm93VHlwZSkgeworICBNb2NrQ2xhc3MgbW9jazsKKyAgRVhQRUNUX0NBTEwobW9jaywgRm9vKCkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoRG9EZWZhdWx0KCkpOworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgIEVYUEVDVF9BTllfVEhST1cobW9jay5Gb28oKSk7CisjZWxzZQorICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKKyAgICBtb2NrLkZvbygpOworICB9LCAiIik7CisjZW5kaWYKK30KKworLy8gVGVzdHMgdGhhdCB1c2luZyBEb0RlZmF1bHQoKSBpbnNpZGUgYSBjb21wb3NpdGUgYWN0aW9uIGxlYWRzIHRvIGEKKy8vIHJ1bi10aW1lIGVycm9yLgorCit2b2lkIFZvaWRGdW5jKGJvb2wgLyogZmxhZyAqLykge30KKworVEVTVChEb0RlZmF1bHREZWF0aFRlc3QsIERpZXNJZlVzZWRJbkNvbXBvc2l0ZUFjdGlvbikgeworICBNb2NrQ2xhc3MgbW9jazsKKyAgRVhQRUNUX0NBTEwobW9jaywgSW50RnVuYyhfKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShEb0FsbChJbnZva2UoVm9pZEZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvRGVmYXVsdCgpKSk7CisKKyAgLy8gSWRlYWxseSB3ZSBzaG91bGQgdmVyaWZ5IHRoZSBlcnJvciBtZXNzYWdlIGFzIHdlbGwuICBTYWRseSwKKyAgLy8gRVhQRUNUX0RFQVRIKCkgY2FuIG9ubHkgY2FwdHVyZSBzdGRlcnIsIHdoaWxlIEdvb2dsZSBNb2NrJ3MKKyAgLy8gZXJyb3JzIGFyZSBwcmludGVkIG9uIHN0ZG91dC4gIFRoZXJlZm9yZSB3ZSBoYXZlIHRvIHNldHRsZSBmb3IKKyAgLy8gbm90IHZlcmlmeWluZyB0aGUgbWVzc2FnZS4KKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCh7CisgICAgbW9jay5JbnRGdW5jKHRydWUpOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRG9EZWZhdWx0KCkgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBzZXQgYnkKKy8vIERlZmF1bHRWYWx1ZTxUPjo6U2V0KCkgd2hlbiBpdCdzIG5vdCBvdmVycmlkZW4gYnkgYW4gT05fQ0FMTCgpLgorVEVTVChEb0RlZmF1bHRUZXN0LCBSZXR1cm5zVXNlclNwZWNpZmllZFBlclR5cGVEZWZhdWx0VmFsdWVXaGVuVGhlcmVJc09uZSkgeworICBEZWZhdWx0VmFsdWU8aW50Pjo6U2V0KDEpOworICBNb2NrQ2xhc3MgbW9jazsKKyAgRVhQRUNUX0NBTEwobW9jaywgSW50RnVuYyhfKSkKKyAgICAgIC5XaWxsT25jZShEb0RlZmF1bHQoKSk7CisgIEVYUEVDVF9FUSgxLCBtb2NrLkludEZ1bmMoZmFsc2UpKTsKKyAgRGVmYXVsdFZhbHVlPGludD46OkNsZWFyKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRG9EZWZhdWx0KCkgZG9lcyB0aGUgYWN0aW9uIHNwZWNpZmllZCBieSBPTl9DQUxMKCkuCitURVNUKERvRGVmYXVsdFRlc3QsIERvZXNXaGF0T25DYWxsU3BlY2lmaWVzKSB7CisgIE1vY2tDbGFzcyBtb2NrOworICBPTl9DQUxMKG1vY2ssIEludEZ1bmMoXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMikpOworICBFWFBFQ1RfQ0FMTChtb2NrLCBJbnRGdW5jKF8pKQorICAgICAgLldpbGxPbmNlKERvRGVmYXVsdCgpKTsKKyAgRVhQRUNUX0VRKDIsIG1vY2suSW50RnVuYyhmYWxzZSkpOworfQorCisvLyBUZXN0cyB0aGF0IHVzaW5nIERvRGVmYXVsdCgpIGluIE9OX0NBTEwoKSBsZWFkcyB0byBhIHJ1bi10aW1lIGZhaWx1cmUuCitURVNUKERvRGVmYXVsdFRlc3QsIENhbm5vdEJlVXNlZEluT25DYWxsKSB7CisgIE1vY2tDbGFzcyBtb2NrOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBPTl9DQUxMKG1vY2ssIEludEZ1bmMoXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChEb0RlZmF1bHQoKSk7CisgIH0sICJEb0RlZmF1bHQoKSBjYW5ub3QgYmUgdXNlZCBpbiBPTl9DQUxMKCkiKTsKK30KKworLy8gVGVzdHMgdGhhdCBTZXRBcmdQb2ludGVlPE4+KHYpIHNldHMgdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkKKy8vIHRoZSBOLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0byB2LgorVEVTVChTZXRBcmdQb2ludGVlVGVzdCwgU2V0c1RoZU50aFBvaW50ZWUpIHsKKyAgdHlwZWRlZiB2b2lkIE15RnVuY3Rpb24oYm9vbCwgaW50KiwgY2hhciopOworICBBY3Rpb248TXlGdW5jdGlvbj4gYSA9IFNldEFyZ1BvaW50ZWU8MT4oMik7CisKKyAgaW50IG4gPSAwOworICBjaGFyIGNoID0gJ1wwJzsKKyAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJm4sICZjaCkpOworICBFWFBFQ1RfRVEoMiwgbik7CisgIEVYUEVDVF9FUSgnXDAnLCBjaCk7CisKKyAgYSA9IFNldEFyZ1BvaW50ZWU8Mj4oJ2EnKTsKKyAgbiA9IDA7CisgIGNoID0gJ1wwJzsKKyAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJm4sICZjaCkpOworICBFWFBFQ1RfRVEoMCwgbik7CisgIEVYUEVDVF9FUSgnYScsIGNoKTsKK30KKworI2lmICEoKEdURVNUX0dDQ19WRVJfICYmIEdURVNUX0dDQ19WRVJfIDwgNDAwMDApIHx8IEdURVNUX09TX1NZTUJJQU4pCisvLyBUZXN0cyB0aGF0IFNldEFyZ1BvaW50ZWU8Tj4oKSBhY2NlcHRzIGEgc3RyaW5nIGxpdGVyYWwuCisvLyBHQ0MgcHJpb3IgdG8gdjQuMCBhbmQgdGhlIFN5bWJpYW4gY29tcGlsZXIgZG8gbm90IHN1cHBvcnQgdGhpcy4KK1RFU1QoU2V0QXJnUG9pbnRlZVRlc3QsIEFjY2VwdHNTdHJpbmdMaXRlcmFsKSB7CisgIHR5cGVkZWYgdm9pZCBNeUZ1bmN0aW9uKHN0ZDo6c3RyaW5nKiwgY29uc3QgY2hhcioqKTsKKyAgQWN0aW9uPE15RnVuY3Rpb24+IGEgPSBTZXRBcmdQb2ludGVlPDA+KCJoaSIpOworICBzdGQ6OnN0cmluZyBzdHI7CisgIGNvbnN0IGNoYXIqIHB0ciA9IE5VTEw7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZzdHIsICZwdHIpKTsKKyAgRVhQRUNUX0VRKCJoaSIsIHN0cik7CisgIEVYUEVDVF9UUlVFKHB0ciA9PSBOVUxMKTsKKworICBhID0gU2V0QXJnUG9pbnRlZTwxPigid29ybGQiKTsKKyAgc3RyID0gIiI7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZzdHIsICZwdHIpKTsKKyAgRVhQRUNUX0VRKCIiLCBzdHIpOworICBFWFBFQ1RfU1RSRVEoIndvcmxkIiwgcHRyKTsKK30KKworVEVTVChTZXRBcmdQb2ludGVlVGVzdCwgQWNjZXB0c1dpZGVTdHJpbmdMaXRlcmFsKSB7CisgIHR5cGVkZWYgdm9pZCBNeUZ1bmN0aW9uKGNvbnN0IHdjaGFyX3QqKik7CisgIEFjdGlvbjxNeUZ1bmN0aW9uPiBhID0gU2V0QXJnUG9pbnRlZTwwPihMIndvcmxkIik7CisgIGNvbnN0IHdjaGFyX3QqIHB0ciA9IE5VTEw7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZwdHIpKTsKKyAgRVhQRUNUX1NUUkVRKEwid29ybGQiLCBwdHIpOworCisjIGlmIEdURVNUX0hBU19TVERfV1NUUklORworCisgIHR5cGVkZWYgdm9pZCBNeVN0cmluZ0Z1bmN0aW9uKHN0ZDo6d3N0cmluZyopOworICBBY3Rpb248TXlTdHJpbmdGdW5jdGlvbj4gYTIgPSBTZXRBcmdQb2ludGVlPDA+KEwid29ybGQiKTsKKyAgc3RkOjp3c3RyaW5nIHN0ciA9IEwiIjsKKyAgYTIuUGVyZm9ybShtYWtlX3R1cGxlKCZzdHIpKTsKKyAgRVhQRUNUX0VRKEwid29ybGQiLCBzdHIpOworCisjIGVuZGlmCit9CisjZW5kaWYKKworLy8gVGVzdHMgdGhhdCBTZXRBcmdQb2ludGVlPE4+KCkgYWNjZXB0cyBhIGNoYXIgcG9pbnRlci4KK1RFU1QoU2V0QXJnUG9pbnRlZVRlc3QsIEFjY2VwdHNDaGFyUG9pbnRlcikgeworICB0eXBlZGVmIHZvaWQgTXlGdW5jdGlvbihib29sLCBzdGQ6OnN0cmluZyosIGNvbnN0IGNoYXIqKik7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGhpID0gImhpIjsKKyAgQWN0aW9uPE15RnVuY3Rpb24+IGEgPSBTZXRBcmdQb2ludGVlPDE+KGhpKTsKKyAgc3RkOjpzdHJpbmcgc3RyOworICBjb25zdCBjaGFyKiBwdHIgPSBOVUxMOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmc3RyLCAmcHRyKSk7CisgIEVYUEVDVF9FUSgiaGkiLCBzdHIpOworICBFWFBFQ1RfVFJVRShwdHIgPT0gTlVMTCk7CisKKyAgY2hhciB3b3JsZF9hcnJheVtdID0gIndvcmxkIjsKKyAgY2hhciogY29uc3Qgd29ybGQgPSB3b3JsZF9hcnJheTsKKyAgYSA9IFNldEFyZ1BvaW50ZWU8Mj4od29ybGQpOworICBzdHIgPSAiIjsKKyAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJnN0ciwgJnB0cikpOworICBFWFBFQ1RfRVEoIiIsIHN0cik7CisgIEVYUEVDVF9FUSh3b3JsZCwgcHRyKTsKK30KKworVEVTVChTZXRBcmdQb2ludGVlVGVzdCwgQWNjZXB0c1dpZGVDaGFyUG9pbnRlcikgeworICB0eXBlZGVmIHZvaWQgTXlGdW5jdGlvbihib29sLCBjb25zdCB3Y2hhcl90KiopOworICBjb25zdCB3Y2hhcl90KiBjb25zdCBoaSA9IEwiaGkiOworICBBY3Rpb248TXlGdW5jdGlvbj4gYSA9IFNldEFyZ1BvaW50ZWU8MT4oaGkpOworICBjb25zdCB3Y2hhcl90KiBwdHIgPSBOVUxMOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmcHRyKSk7CisgIEVYUEVDVF9FUShoaSwgcHRyKTsKKworIyBpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworICB0eXBlZGVmIHZvaWQgTXlTdHJpbmdGdW5jdGlvbihib29sLCBzdGQ6OndzdHJpbmcqKTsKKyAgd2NoYXJfdCB3b3JsZF9hcnJheVtdID0gTCJ3b3JsZCI7CisgIHdjaGFyX3QqIGNvbnN0IHdvcmxkID0gd29ybGRfYXJyYXk7CisgIEFjdGlvbjxNeVN0cmluZ0Z1bmN0aW9uPiBhMiA9IFNldEFyZ1BvaW50ZWU8MT4od29ybGQpOworICBzdGQ6OndzdHJpbmcgc3RyOworICBhMi5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJnN0cikpOworICBFWFBFQ1RfRVEod29ybGRfYXJyYXksIHN0cik7CisjIGVuZGlmCit9CisKKyNpZiBHVEVTVF9IQVNfUFJPVE9CVUZfCisKKy8vIFRlc3RzIHRoYXQgU2V0QXJnUG9pbnRlZTxOPihwcm90b19idWZmZXIpIHNldHMgdGhlIHYxIHByb3RvYnVmCisvLyB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IHRoZSBOLXRoICgwLWJhc2VkKSBhcmd1bWVudCB0byBwcm90b19idWZmZXIuCitURVNUKFNldEFyZ1BvaW50ZWVUZXN0LCBTZXRzVGhlTnRoUG9pbnRlZU9mUHJvdG9CdWZmZXJUeXBlKSB7CisgIFRlc3RNZXNzYWdlKiBjb25zdCBtc2cgPSBuZXcgVGVzdE1lc3NhZ2U7CisgIG1zZy0+c2V0X21lbWJlcigieWVzIik7CisgIFRlc3RNZXNzYWdlIG9yaWdfbXNnOworICBvcmlnX21zZy5Db3B5RnJvbSgqbXNnKTsKKworICBBY3Rpb248dm9pZChib29sLCBUZXN0TWVzc2FnZSopPiBhID0gU2V0QXJnUG9pbnRlZTwxPigqbXNnKTsKKyAgLy8gU2V0QXJnUG9pbnRlZTxOPihwcm90b19idWZmZXIpIG1ha2VzIGEgY29weSBvZiBwcm90b19idWZmZXIKKyAgLy8gcy50LiB0aGUgYWN0aW9uIHdvcmtzIGV2ZW4gd2hlbiB0aGUgb3JpZ2luYWwgcHJvdG9fYnVmZmVyIGhhcworICAvLyBkaWVkLiAgV2UgZW5zdXJlIHRoaXMgYmVoYXZpb3IgYnkgZGVsZXRpbmcgbXNnIGJlZm9yZSB1c2luZyB0aGUKKyAgLy8gYWN0aW9uLgorICBkZWxldGUgbXNnOworCisgIFRlc3RNZXNzYWdlIGRlc3Q7CisgIEVYUEVDVF9GQUxTRShvcmlnX21zZy5FcXVhbHMoZGVzdCkpOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmZGVzdCkpOworICBFWFBFQ1RfVFJVRShvcmlnX21zZy5FcXVhbHMoZGVzdCkpOworfQorCisvLyBUZXN0cyB0aGF0IFNldEFyZ1BvaW50ZWU8Tj4ocHJvdG9fYnVmZmVyKSBzZXRzIHRoZQorLy8gOjpQcm90b2NvbE1lc3NhZ2UgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUgTi10aCAoMC1iYXNlZCkKKy8vIGFyZ3VtZW50IHRvIHByb3RvX2J1ZmZlci4KK1RFU1QoU2V0QXJnUG9pbnRlZVRlc3QsIFNldHNUaGVOdGhQb2ludGVlT2ZQcm90b0J1ZmZlckJhc2VUeXBlKSB7CisgIFRlc3RNZXNzYWdlKiBjb25zdCBtc2cgPSBuZXcgVGVzdE1lc3NhZ2U7CisgIG1zZy0+c2V0X21lbWJlcigieWVzIik7CisgIFRlc3RNZXNzYWdlIG9yaWdfbXNnOworICBvcmlnX21zZy5Db3B5RnJvbSgqbXNnKTsKKworICBBY3Rpb248dm9pZChib29sLCA6OlByb3RvY29sTWVzc2FnZSopPiBhID0gU2V0QXJnUG9pbnRlZTwxPigqbXNnKTsKKyAgLy8gU2V0QXJnUG9pbnRlZTxOPihwcm90b19idWZmZXIpIG1ha2VzIGEgY29weSBvZiBwcm90b19idWZmZXIKKyAgLy8gcy50LiB0aGUgYWN0aW9uIHdvcmtzIGV2ZW4gd2hlbiB0aGUgb3JpZ2luYWwgcHJvdG9fYnVmZmVyIGhhcworICAvLyBkaWVkLiAgV2UgZW5zdXJlIHRoaXMgYmVoYXZpb3IgYnkgZGVsZXRpbmcgbXNnIGJlZm9yZSB1c2luZyB0aGUKKyAgLy8gYWN0aW9uLgorICBkZWxldGUgbXNnOworCisgIFRlc3RNZXNzYWdlIGRlc3Q7CisgIDo6UHJvdG9jb2xNZXNzYWdlKiBjb25zdCBkZXN0X2Jhc2UgPSAmZGVzdDsKKyAgRVhQRUNUX0ZBTFNFKG9yaWdfbXNnLkVxdWFscyhkZXN0KSk7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIGRlc3RfYmFzZSkpOworICBFWFBFQ1RfVFJVRShvcmlnX21zZy5FcXVhbHMoZGVzdCkpOworfQorCisvLyBUZXN0cyB0aGF0IFNldEFyZ1BvaW50ZWU8Tj4ocHJvdG8yX2J1ZmZlcikgc2V0cyB0aGUgdjIKKy8vIHByb3RvYnVmIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvCisvLyBwcm90bzJfYnVmZmVyLgorVEVTVChTZXRBcmdQb2ludGVlVGVzdCwgU2V0c1RoZU50aFBvaW50ZWVPZlByb3RvMkJ1ZmZlclR5cGUpIHsKKyAgdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvb01lc3NhZ2U7CisgIEZvb01lc3NhZ2UqIGNvbnN0IG1zZyA9IG5ldyBGb29NZXNzYWdlOworICBtc2ctPnNldF9pbnRfZmllbGQoMik7CisgIG1zZy0+c2V0X3N0cmluZ19maWVsZCgiaGkiKTsKKyAgRm9vTWVzc2FnZSBvcmlnX21zZzsKKyAgb3JpZ19tc2cuQ29weUZyb20oKm1zZyk7CisKKyAgQWN0aW9uPHZvaWQoYm9vbCwgRm9vTWVzc2FnZSopPiBhID0gU2V0QXJnUG9pbnRlZTwxPigqbXNnKTsKKyAgLy8gU2V0QXJnUG9pbnRlZTxOPihwcm90bzJfYnVmZmVyKSBtYWtlcyBhIGNvcHkgb2YKKyAgLy8gcHJvdG8yX2J1ZmZlciBzLnQuIHRoZSBhY3Rpb24gd29ya3MgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbAorICAvLyBwcm90bzJfYnVmZmVyIGhhcyBkaWVkLiAgV2UgZW5zdXJlIHRoaXMgYmVoYXZpb3IgYnkgZGVsZXRpbmcgbXNnCisgIC8vIGJlZm9yZSB1c2luZyB0aGUgYWN0aW9uLgorICBkZWxldGUgbXNnOworCisgIEZvb01lc3NhZ2UgZGVzdDsKKyAgZGVzdC5zZXRfaW50X2ZpZWxkKDApOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmZGVzdCkpOworICBFWFBFQ1RfRVEoMiwgZGVzdC5pbnRfZmllbGQoKSk7CisgIEVYUEVDVF9FUSgiaGkiLCBkZXN0LnN0cmluZ19maWVsZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBTZXRBcmdQb2ludGVlPE4+KHByb3RvMl9idWZmZXIpIHNldHMgdGhlCisvLyBwcm90bzI6Ok1lc3NhZ2UgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUgTi10aCAoMC1iYXNlZCkgYXJndW1lbnQKKy8vIHRvIHByb3RvMl9idWZmZXIuCitURVNUKFNldEFyZ1BvaW50ZWVUZXN0LCBTZXRzVGhlTnRoUG9pbnRlZU9mUHJvdG8yQnVmZmVyQmFzZVR5cGUpIHsKKyAgdXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvb01lc3NhZ2U7CisgIEZvb01lc3NhZ2UqIGNvbnN0IG1zZyA9IG5ldyBGb29NZXNzYWdlOworICBtc2ctPnNldF9pbnRfZmllbGQoMik7CisgIG1zZy0+c2V0X3N0cmluZ19maWVsZCgiaGkiKTsKKyAgRm9vTWVzc2FnZSBvcmlnX21zZzsKKyAgb3JpZ19tc2cuQ29weUZyb20oKm1zZyk7CisKKyAgQWN0aW9uPHZvaWQoYm9vbCwgOjpwcm90bzI6Ok1lc3NhZ2UqKT4gYSA9IFNldEFyZ1BvaW50ZWU8MT4oKm1zZyk7CisgIC8vIFNldEFyZ1BvaW50ZWU8Tj4ocHJvdG8yX2J1ZmZlcikgbWFrZXMgYSBjb3B5IG9mCisgIC8vIHByb3RvMl9idWZmZXIgcy50LiB0aGUgYWN0aW9uIHdvcmtzIGV2ZW4gd2hlbiB0aGUgb3JpZ2luYWwKKyAgLy8gcHJvdG8yX2J1ZmZlciBoYXMgZGllZC4gIFdlIGVuc3VyZSB0aGlzIGJlaGF2aW9yIGJ5IGRlbGV0aW5nIG1zZworICAvLyBiZWZvcmUgdXNpbmcgdGhlIGFjdGlvbi4KKyAgZGVsZXRlIG1zZzsKKworICBGb29NZXNzYWdlIGRlc3Q7CisgIGRlc3Quc2V0X2ludF9maWVsZCgwKTsKKyAgOjpwcm90bzI6Ok1lc3NhZ2UqIGNvbnN0IGRlc3RfYmFzZSA9ICZkZXN0OworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCBkZXN0X2Jhc2UpKTsKKyAgRVhQRUNUX0VRKDIsIGRlc3QuaW50X2ZpZWxkKCkpOworICBFWFBFQ1RfRVEoImhpIiwgZGVzdC5zdHJpbmdfZmllbGQoKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BST1RPQlVGXworCisvLyBUZXN0cyB0aGF0IFNldEFyZ3VtZW50UG9pbnRlZTxOPih2KSBzZXRzIHRoZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5CisvLyB0aGUgTi10aCAoMC1iYXNlZCkgYXJndW1lbnQgdG8gdi4KK1RFU1QoU2V0QXJndW1lbnRQb2ludGVlVGVzdCwgU2V0c1RoZU50aFBvaW50ZWUpIHsKKyAgdHlwZWRlZiB2b2lkIE15RnVuY3Rpb24oYm9vbCwgaW50KiwgY2hhciopOworICBBY3Rpb248TXlGdW5jdGlvbj4gYSA9IFNldEFyZ3VtZW50UG9pbnRlZTwxPigyKTsKKworICBpbnQgbiA9IDA7CisgIGNoYXIgY2ggPSAnXDAnOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmbiwgJmNoKSk7CisgIEVYUEVDVF9FUSgyLCBuKTsKKyAgRVhQRUNUX0VRKCdcMCcsIGNoKTsKKworICBhID0gU2V0QXJndW1lbnRQb2ludGVlPDI+KCdhJyk7CisgIG4gPSAwOworICBjaCA9ICdcMCc7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZuLCAmY2gpKTsKKyAgRVhQRUNUX0VRKDAsIG4pOworICBFWFBFQ1RfRVEoJ2EnLCBjaCk7Cit9CisKKyNpZiBHVEVTVF9IQVNfUFJPVE9CVUZfCisKKy8vIFRlc3RzIHRoYXQgU2V0QXJndW1lbnRQb2ludGVlPE4+KHByb3RvX2J1ZmZlcikgc2V0cyB0aGUgdjEgcHJvdG9idWYKKy8vIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvIHByb3RvX2J1ZmZlci4KK1RFU1QoU2V0QXJndW1lbnRQb2ludGVlVGVzdCwgU2V0c1RoZU50aFBvaW50ZWVPZlByb3RvQnVmZmVyVHlwZSkgeworICBUZXN0TWVzc2FnZSogY29uc3QgbXNnID0gbmV3IFRlc3RNZXNzYWdlOworICBtc2ctPnNldF9tZW1iZXIoInllcyIpOworICBUZXN0TWVzc2FnZSBvcmlnX21zZzsKKyAgb3JpZ19tc2cuQ29weUZyb20oKm1zZyk7CisKKyAgQWN0aW9uPHZvaWQoYm9vbCwgVGVzdE1lc3NhZ2UqKT4gYSA9IFNldEFyZ3VtZW50UG9pbnRlZTwxPigqbXNnKTsKKyAgLy8gU2V0QXJndW1lbnRQb2ludGVlPE4+KHByb3RvX2J1ZmZlcikgbWFrZXMgYSBjb3B5IG9mIHByb3RvX2J1ZmZlcgorICAvLyBzLnQuIHRoZSBhY3Rpb24gd29ya3MgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBwcm90b19idWZmZXIgaGFzCisgIC8vIGRpZWQuICBXZSBlbnN1cmUgdGhpcyBiZWhhdmlvciBieSBkZWxldGluZyBtc2cgYmVmb3JlIHVzaW5nIHRoZQorICAvLyBhY3Rpb24uCisgIGRlbGV0ZSBtc2c7CisKKyAgVGVzdE1lc3NhZ2UgZGVzdDsKKyAgRVhQRUNUX0ZBTFNFKG9yaWdfbXNnLkVxdWFscyhkZXN0KSk7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsICZkZXN0KSk7CisgIEVYUEVDVF9UUlVFKG9yaWdfbXNnLkVxdWFscyhkZXN0KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgU2V0QXJndW1lbnRQb2ludGVlPE4+KHByb3RvX2J1ZmZlcikgc2V0cyB0aGUKKy8vIDo6UHJvdG9jb2xNZXNzYWdlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdGhlIE4tdGggKDAtYmFzZWQpCisvLyBhcmd1bWVudCB0byBwcm90b19idWZmZXIuCitURVNUKFNldEFyZ3VtZW50UG9pbnRlZVRlc3QsIFNldHNUaGVOdGhQb2ludGVlT2ZQcm90b0J1ZmZlckJhc2VUeXBlKSB7CisgIFRlc3RNZXNzYWdlKiBjb25zdCBtc2cgPSBuZXcgVGVzdE1lc3NhZ2U7CisgIG1zZy0+c2V0X21lbWJlcigieWVzIik7CisgIFRlc3RNZXNzYWdlIG9yaWdfbXNnOworICBvcmlnX21zZy5Db3B5RnJvbSgqbXNnKTsKKworICBBY3Rpb248dm9pZChib29sLCA6OlByb3RvY29sTWVzc2FnZSopPiBhID0gU2V0QXJndW1lbnRQb2ludGVlPDE+KCptc2cpOworICAvLyBTZXRBcmd1bWVudFBvaW50ZWU8Tj4ocHJvdG9fYnVmZmVyKSBtYWtlcyBhIGNvcHkgb2YgcHJvdG9fYnVmZmVyCisgIC8vIHMudC4gdGhlIGFjdGlvbiB3b3JrcyBldmVuIHdoZW4gdGhlIG9yaWdpbmFsIHByb3RvX2J1ZmZlciBoYXMKKyAgLy8gZGllZC4gIFdlIGVuc3VyZSB0aGlzIGJlaGF2aW9yIGJ5IGRlbGV0aW5nIG1zZyBiZWZvcmUgdXNpbmcgdGhlCisgIC8vIGFjdGlvbi4KKyAgZGVsZXRlIG1zZzsKKworICBUZXN0TWVzc2FnZSBkZXN0OworICA6OlByb3RvY29sTWVzc2FnZSogY29uc3QgZGVzdF9iYXNlID0gJmRlc3Q7CisgIEVYUEVDVF9GQUxTRShvcmlnX21zZy5FcXVhbHMoZGVzdCkpOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCBkZXN0X2Jhc2UpKTsKKyAgRVhQRUNUX1RSVUUob3JpZ19tc2cuRXF1YWxzKGRlc3QpKTsKK30KKworLy8gVGVzdHMgdGhhdCBTZXRBcmd1bWVudFBvaW50ZWU8Tj4ocHJvdG8yX2J1ZmZlcikgc2V0cyB0aGUgdjIKKy8vIHByb3RvYnVmIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvCisvLyBwcm90bzJfYnVmZmVyLgorVEVTVChTZXRBcmd1bWVudFBvaW50ZWVUZXN0LCBTZXRzVGhlTnRoUG9pbnRlZU9mUHJvdG8yQnVmZmVyVHlwZSkgeworICB1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9vTWVzc2FnZTsKKyAgRm9vTWVzc2FnZSogY29uc3QgbXNnID0gbmV3IEZvb01lc3NhZ2U7CisgIG1zZy0+c2V0X2ludF9maWVsZCgyKTsKKyAgbXNnLT5zZXRfc3RyaW5nX2ZpZWxkKCJoaSIpOworICBGb29NZXNzYWdlIG9yaWdfbXNnOworICBvcmlnX21zZy5Db3B5RnJvbSgqbXNnKTsKKworICBBY3Rpb248dm9pZChib29sLCBGb29NZXNzYWdlKik+IGEgPSBTZXRBcmd1bWVudFBvaW50ZWU8MT4oKm1zZyk7CisgIC8vIFNldEFyZ3VtZW50UG9pbnRlZTxOPihwcm90bzJfYnVmZmVyKSBtYWtlcyBhIGNvcHkgb2YKKyAgLy8gcHJvdG8yX2J1ZmZlciBzLnQuIHRoZSBhY3Rpb24gd29ya3MgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbAorICAvLyBwcm90bzJfYnVmZmVyIGhhcyBkaWVkLiAgV2UgZW5zdXJlIHRoaXMgYmVoYXZpb3IgYnkgZGVsZXRpbmcgbXNnCisgIC8vIGJlZm9yZSB1c2luZyB0aGUgYWN0aW9uLgorICBkZWxldGUgbXNnOworCisgIEZvb01lc3NhZ2UgZGVzdDsKKyAgZGVzdC5zZXRfaW50X2ZpZWxkKDApOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAmZGVzdCkpOworICBFWFBFQ1RfRVEoMiwgZGVzdC5pbnRfZmllbGQoKSk7CisgIEVYUEVDVF9FUSgiaGkiLCBkZXN0LnN0cmluZ19maWVsZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBTZXRBcmd1bWVudFBvaW50ZWU8Tj4ocHJvdG8yX2J1ZmZlcikgc2V0cyB0aGUKKy8vIHByb3RvMjo6TWVzc2FnZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IHRoZSBOLXRoICgwLWJhc2VkKSBhcmd1bWVudAorLy8gdG8gcHJvdG8yX2J1ZmZlci4KK1RFU1QoU2V0QXJndW1lbnRQb2ludGVlVGVzdCwgU2V0c1RoZU50aFBvaW50ZWVPZlByb3RvMkJ1ZmZlckJhc2VUeXBlKSB7CisgIHVzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb29NZXNzYWdlOworICBGb29NZXNzYWdlKiBjb25zdCBtc2cgPSBuZXcgRm9vTWVzc2FnZTsKKyAgbXNnLT5zZXRfaW50X2ZpZWxkKDIpOworICBtc2ctPnNldF9zdHJpbmdfZmllbGQoImhpIik7CisgIEZvb01lc3NhZ2Ugb3JpZ19tc2c7CisgIG9yaWdfbXNnLkNvcHlGcm9tKCptc2cpOworCisgIEFjdGlvbjx2b2lkKGJvb2wsIDo6cHJvdG8yOjpNZXNzYWdlKik+IGEgPSBTZXRBcmd1bWVudFBvaW50ZWU8MT4oKm1zZyk7CisgIC8vIFNldEFyZ3VtZW50UG9pbnRlZTxOPihwcm90bzJfYnVmZmVyKSBtYWtlcyBhIGNvcHkgb2YKKyAgLy8gcHJvdG8yX2J1ZmZlciBzLnQuIHRoZSBhY3Rpb24gd29ya3MgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbAorICAvLyBwcm90bzJfYnVmZmVyIGhhcyBkaWVkLiAgV2UgZW5zdXJlIHRoaXMgYmVoYXZpb3IgYnkgZGVsZXRpbmcgbXNnCisgIC8vIGJlZm9yZSB1c2luZyB0aGUgYWN0aW9uLgorICBkZWxldGUgbXNnOworCisgIEZvb01lc3NhZ2UgZGVzdDsKKyAgZGVzdC5zZXRfaW50X2ZpZWxkKDApOworICA6OnByb3RvMjo6TWVzc2FnZSogY29uc3QgZGVzdF9iYXNlID0gJmRlc3Q7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIGRlc3RfYmFzZSkpOworICBFWFBFQ1RfRVEoMiwgZGVzdC5pbnRfZmllbGQoKSk7CisgIEVYUEVDVF9FUSgiaGkiLCBkZXN0LnN0cmluZ19maWVsZCgpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUFJPVE9CVUZfCisKKy8vIFNhbXBsZSBmdW5jdGlvbnMgYW5kIGZ1bmN0b3JzIGZvciB0ZXN0aW5nIEludm9rZSgpIGFuZCBldGMuCitpbnQgTnVsbGFyeSgpIHsgcmV0dXJuIDE7IH0KKworY2xhc3MgTnVsbGFyeUZ1bmN0b3IgeworIHB1YmxpYzoKKyAgaW50IG9wZXJhdG9yKCkoKSB7IHJldHVybiAyOyB9Cit9OworCitib29sIGdfZG9uZSA9IGZhbHNlOwordm9pZCBWb2lkTnVsbGFyeSgpIHsgZ19kb25lID0gdHJ1ZTsgfQorCitjbGFzcyBWb2lkTnVsbGFyeUZ1bmN0b3IgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcigpKCkgeyBnX2RvbmUgPSB0cnVlOyB9Cit9OworCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgRm9vKCkgOiB2YWx1ZV8oMTIzKSB7fQorCisgIGludCBOdWxsYXJ5KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICBpbnQgdmFsdWVfOworfTsKKworLy8gVGVzdHMgSW52b2tlV2l0aG91dEFyZ3MoZnVuY3Rpb24pLgorVEVTVChJbnZva2VXaXRob3V0QXJnc1Rlc3QsIEZ1bmN0aW9uKSB7CisgIC8vIEFzIGFuIGFjdGlvbiB0aGF0IHRha2VzIG9uZSBhcmd1bWVudC4KKyAgQWN0aW9uPGludChpbnQpPiBhID0gSW52b2tlV2l0aG91dEFyZ3MoTnVsbGFyeSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDIpKSk7CisKKyAgLy8gQXMgYW4gYWN0aW9uIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cy4KKyAgQWN0aW9uPGludChpbnQsIGRvdWJsZSk+IGEyID0gSW52b2tlV2l0aG91dEFyZ3MoTnVsbGFyeSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEsIGEyLlBlcmZvcm0obWFrZV90dXBsZSgyLCAzLjUpKSk7CisKKyAgLy8gQXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB2b2lkLgorICBBY3Rpb248dm9pZChpbnQpPiBhMyA9IEludm9rZVdpdGhvdXRBcmdzKFZvaWROdWxsYXJ5KTsgIC8vIE5PTElOVAorICBnX2RvbmUgPSBmYWxzZTsKKyAgYTMuUGVyZm9ybShtYWtlX3R1cGxlKDEpKTsKKyAgRVhQRUNUX1RSVUUoZ19kb25lKTsKK30KKworLy8gVGVzdHMgSW52b2tlV2l0aG91dEFyZ3MoZnVuY3RvcikuCitURVNUKEludm9rZVdpdGhvdXRBcmdzVGVzdCwgRnVuY3RvcikgeworICAvLyBBcyBhbiBhY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudC4KKyAgQWN0aW9uPGludCgpPiBhID0gSW52b2tlV2l0aG91dEFyZ3MoTnVsbGFyeUZ1bmN0b3IoKSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKworICAvLyBBcyBhbiBhY3Rpb24gdGhhdCB0YWtlcyB0aHJlZSBhcmd1bWVudHMuCisgIEFjdGlvbjxpbnQoaW50LCBkb3VibGUsIGNoYXIpPiBhMiA9ICAvLyBOT0xJTlQKKyAgICAgIEludm9rZVdpdGhvdXRBcmdzKE51bGxhcnlGdW5jdG9yKCkpOworICBFWFBFQ1RfRVEoMiwgYTIuUGVyZm9ybShtYWtlX3R1cGxlKDMsIDMuNSwgJ2EnKSkpOworCisgIC8vIEFzIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgdm9pZC4KKyAgQWN0aW9uPHZvaWQoKT4gYTMgPSBJbnZva2VXaXRob3V0QXJncyhWb2lkTnVsbGFyeUZ1bmN0b3IoKSk7CisgIGdfZG9uZSA9IGZhbHNlOworICBhMy5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9UUlVFKGdfZG9uZSk7Cit9CisKKy8vIFRlc3RzIEludm9rZVdpdGhvdXRBcmdzKG9ial9wdHIsIG1ldGhvZCkuCitURVNUKEludm9rZVdpdGhvdXRBcmdzVGVzdCwgTWV0aG9kKSB7CisgIEZvbyBmb287CisgIEFjdGlvbjxpbnQoYm9vbCwgY2hhcik+IGEgPSAgLy8gTk9MSU5UCisgICAgICBJbnZva2VXaXRob3V0QXJncygmZm9vLCAmRm9vOjpOdWxsYXJ5KTsKKyAgRVhQRUNUX0VRKDEyMywgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJ2EnKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJZ25vcmVSZXN1bHQoKSBvbiBhIHBvbHltb3JwaGljIGFjdGlvbi4KK1RFU1QoSWdub3JlUmVzdWx0VGVzdCwgUG9seW1vcnBoaWNBY3Rpb24pIHsKKyAgQWN0aW9uPHZvaWQoaW50KT4gYSA9IElnbm9yZVJlc3VsdChSZXR1cm4oNSkpOyAgLy8gTk9MSU5UCisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKDEpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSWdub3JlUmVzdWx0KCkgb24gYSBtb25vbW9ycGhpYyBhY3Rpb24uCisKK2ludCBSZXR1cm5PbmUoKSB7CisgIGdfZG9uZSA9IHRydWU7CisgIHJldHVybiAxOworfQorCitURVNUKElnbm9yZVJlc3VsdFRlc3QsIE1vbm9tb3JwaGljQWN0aW9uKSB7CisgIGdfZG9uZSA9IGZhbHNlOworICBBY3Rpb248dm9pZCgpPiBhID0gSWdub3JlUmVzdWx0KEludm9rZShSZXR1cm5PbmUpKTsKKyAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9UUlVFKGdfZG9uZSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIElnbm9yZVJlc3VsdCgpIG9uIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgYSBjbGFzcyB0eXBlLgorCitNeU5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlIFJldHVybk15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUoZG91YmxlIC8qIHggKi8pIHsKKyAgZ19kb25lID0gdHJ1ZTsKKyAgcmV0dXJuIE15Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUoNDIpOworfQorCitURVNUKElnbm9yZVJlc3VsdFRlc3QsIEFjdGlvblJldHVybmluZ0NsYXNzKSB7CisgIGdfZG9uZSA9IGZhbHNlOworICBBY3Rpb248dm9pZChpbnQpPiBhID0KKyAgICAgIElnbm9yZVJlc3VsdChJbnZva2UoUmV0dXJuTXlOb25EZWZhdWx0Q29uc3RydWN0aWJsZSkpOyAgLy8gTk9MSU5UCisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKDIpKTsKKyAgRVhQRUNUX1RSVUUoZ19kb25lKTsKK30KKworVEVTVChBc3NpZ25UZXN0LCBJbnQpIHsKKyAgaW50IHggPSAwOworICBBY3Rpb248dm9pZChpbnQpPiBhID0gQXNzaWduKCZ4LCA1KTsKKyAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMCkpOworICBFWFBFQ1RfRVEoNSwgeCk7Cit9CisKK1RFU1QoQXNzaWduVGVzdCwgU3RyaW5nKSB7CisgIDo6c3RkOjpzdHJpbmcgeDsKKyAgQWN0aW9uPHZvaWQodm9pZCk+IGEgPSBBc3NpZ24oJngsICJIZWxsbywgd29ybGQiKTsKKyAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSgiSGVsbG8sIHdvcmxkIiwgeCk7Cit9CisKK1RFU1QoQXNzaWduVGVzdCwgQ29tcGF0aWJsZVR5cGVzKSB7CisgIGRvdWJsZSB4ID0gMDsKKyAgQWN0aW9uPHZvaWQoaW50KT4gYSA9IEFzc2lnbigmeCwgNSk7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKDApKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSg1LCB4KTsKK30KKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCitjbGFzcyBTZXRFcnJub0FuZFJldHVyblRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IGVycm5vID0gMDsgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IGVycm5vID0gMDsgfQorfTsKKworVEVTVF9GKFNldEVycm5vQW5kUmV0dXJuVGVzdCwgSW50KSB7CisgIEFjdGlvbjxpbnQodm9pZCk+IGEgPSBTZXRFcnJub0FuZFJldHVybihFTk9UVFksIC01KTsKKyAgRVhQRUNUX0VRKC01LCBhLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7CisgIEVYUEVDVF9FUShFTk9UVFksIGVycm5vKTsKK30KKworVEVTVF9GKFNldEVycm5vQW5kUmV0dXJuVGVzdCwgUHRyKSB7CisgIGludCB4OworICBBY3Rpb248aW50Kih2b2lkKT4gYSA9IFNldEVycm5vQW5kUmV0dXJuKEVOT1RUWSwgJngpOworICBFWFBFQ1RfRVEoJngsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKyAgRVhQRUNUX0VRKEVOT1RUWSwgZXJybm8pOworfQorCitURVNUX0YoU2V0RXJybm9BbmRSZXR1cm5UZXN0LCBDb21wYXRpYmxlVHlwZXMpIHsKKyAgQWN0aW9uPGRvdWJsZSgpPiBhID0gU2V0RXJybm9BbmRSZXR1cm4oRUlOVkFMLCA1KTsKKyAgRVhQRUNUX0RPVUJMRV9FUSg1LjAsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKyAgRVhQRUNUX0VRKEVJTlZBTCwgZXJybm8pOworfQorCisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBUZXN0cyBCeVJlZigpLgorCisvLyBUZXN0cyB0aGF0IFJlZmVyZW5jZVdyYXBwZXI8VD4gaXMgY29weWFibGUuCitURVNUKEJ5UmVmVGVzdCwgSXNDb3B5YWJsZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBzMSA9ICJIaSI7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHMyID0gIkhlbGxvIjsKKworICA6OnRlc3Rpbmc6OmludGVybmFsOjpSZWZlcmVuY2VXcmFwcGVyPGNvbnN0IHN0ZDo6c3RyaW5nPiByZWZfd3JhcHBlciA9CisgICAgICBCeVJlZihzMSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiByMSA9IHJlZl93cmFwcGVyOworICBFWFBFQ1RfRVEoJnMxLCAmcjEpOworCisgIC8vIEFzc2lnbnMgYSBuZXcgdmFsdWUgdG8gcmVmX3dyYXBwZXIuCisgIHJlZl93cmFwcGVyID0gQnlSZWYoczIpOworICBjb25zdCBzdGQ6OnN0cmluZyYgcjIgPSByZWZfd3JhcHBlcjsKKyAgRVhQRUNUX0VRKCZzMiwgJnIyKTsKKworICA6OnRlc3Rpbmc6OmludGVybmFsOjpSZWZlcmVuY2VXcmFwcGVyPGNvbnN0IHN0ZDo6c3RyaW5nPiByZWZfd3JhcHBlcjEgPQorICAgICAgQnlSZWYoczEpOworICAvLyBDb3BpZXMgcmVmX3dyYXBwZXIxIHRvIHJlZl93cmFwcGVyLgorICByZWZfd3JhcHBlciA9IHJlZl93cmFwcGVyMTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIHIzID0gcmVmX3dyYXBwZXI7CisgIEVYUEVDVF9FUSgmczEsICZyMyk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEJ5UmVmKCkgb24gYSBjb25zdCB2YWx1ZS4KK1RFU1QoQnlSZWZUZXN0LCBDb25zdFZhbHVlKSB7CisgIGNvbnN0IGludCBuID0gMDsKKyAgLy8gaW50JiByZWYgPSBCeVJlZihuKTsgIC8vIFRoaXMgc2hvdWxkbid0IGNvbXBpbGUgLSB3ZSBoYXZlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGNvbXBpbGF0aW9uIHRlc3QgdG8gY2F0Y2ggaXQuCisgIGNvbnN0IGludCYgY29uc3RfcmVmID0gQnlSZWYobik7CisgIEVYUEVDVF9FUSgmbiwgJmNvbnN0X3JlZik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEJ5UmVmKCkgb24gYSBub24tY29uc3QgdmFsdWUuCitURVNUKEJ5UmVmVGVzdCwgTm9uQ29uc3RWYWx1ZSkgeworICBpbnQgbiA9IDA7CisKKyAgLy8gQnlSZWYobikgY2FuIGJlIHVzZWQgYXMgZWl0aGVyIGFuIGludCYsCisgIGludCYgcmVmID0gQnlSZWYobik7CisgIEVYUEVDVF9FUSgmbiwgJnJlZik7CisKKyAgLy8gb3IgYSBjb25zdCBpbnQmLgorICBjb25zdCBpbnQmIGNvbnN0X3JlZiA9IEJ5UmVmKG4pOworICBFWFBFQ1RfRVEoJm4sICZjb25zdF9yZWYpOworfQorCisvLyBUZXN0cyBleHBsaWNpdGx5IHNwZWNpZnlpbmcgdGhlIHR5cGUgd2hlbiB1c2luZyBCeVJlZigpLgorVEVTVChCeVJlZlRlc3QsIEV4cGxpY2l0VHlwZSkgeworICBpbnQgbiA9IDA7CisgIGNvbnN0IGludCYgcjEgPSBCeVJlZjxjb25zdCBpbnQ+KG4pOworICBFWFBFQ1RfRVEoJm4sICZyMSk7CisKKyAgLy8gQnlSZWY8Y2hhcj4obik7ICAvLyBUaGlzIHNob3VsZG4ndCBjb21waWxlIC0gd2UgaGF2ZSBhIG5lZ2F0aXZlCisgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGlsYXRpb24gdGVzdCB0byBjYXRjaCBpdC4KKworICBEZXJpdmVkIGQ7CisgIERlcml2ZWQmIHIyID0gQnlSZWY8RGVyaXZlZD4oZCk7CisgIEVYUEVDVF9FUSgmZCwgJnIyKTsKKworICBjb25zdCBEZXJpdmVkJiByMyA9IEJ5UmVmPGNvbnN0IERlcml2ZWQ+KGQpOworICBFWFBFQ1RfRVEoJmQsICZyMyk7CisKKyAgQmFzZSYgcjQgPSBCeVJlZjxCYXNlPihkKTsKKyAgRVhQRUNUX0VRKCZkLCAmcjQpOworCisgIGNvbnN0IEJhc2UmIHI1ID0gQnlSZWY8Y29uc3QgQmFzZT4oZCk7CisgIEVYUEVDVF9FUSgmZCwgJnI1KTsKKworICAvLyBUaGUgZm9sbG93aW5nIHNob3VsZG4ndCBjb21waWxlIC0gd2UgaGF2ZSBhIG5lZ2F0aXZlIGNvbXBpbGF0aW9uCisgIC8vIHRlc3QgZm9yIGl0LgorICAvLworICAvLyBCYXNlIGI7CisgIC8vIEJ5UmVmPERlcml2ZWQ+KGIpOworfQorCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBNb2NrIHByaW50cyBleHByZXNzaW9uIEJ5UmVmKHgpIGFzIGEgcmVmZXJlbmNlIHRvIHguCitURVNUKEJ5UmVmVGVzdCwgUHJpbnRzQ29ycmVjdGx5KSB7CisgIGludCBuID0gNDI7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gZXhwZWN0ZWQsIGFjdHVhbDsKKyAgdGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8Y29uc3QgaW50Jj46OlByaW50KG4sICZleHBlY3RlZCk7CisgIHRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludChCeVJlZihuKSwgJmFjdHVhbCk7CisgIEVYUEVDVF9FUShleHBlY3RlZC5zdHIoKSwgYWN0dWFsLnN0cigpKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8KKworc3RkOjp1bmlxdWVfcHRyPGludD4gVW5pcXVlUHRyU291cmNlKCkgeworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPGludD4obmV3IGludCgxOSkpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4gVmVjdG9yVW5pcXVlUHRyU291cmNlKCkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4gb3V0OworICBvdXQuZW1wbGFjZV9iYWNrKG5ldyBpbnQoNykpOworICByZXR1cm4gb3V0OworfQorCitURVNUKE1vY2tNZXRob2RUZXN0LCBDYW5SZXR1cm5Nb3ZlT25seVZhbHVlX1JldHVybikgeworICBNb2NrQ2xhc3MgbW9jazsKKyAgc3RkOjp1bmlxdWVfcHRyPGludD4gaShuZXcgaW50KDE5KSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE1ha2VVbmlxdWUoKSkuV2lsbE9uY2UoUmV0dXJuKEJ5TW92ZShzdGQ6Om1vdmUoaSkpKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE1ha2VWZWN0b3JVbmlxdWUoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oQnlNb3ZlKFZlY3RvclVuaXF1ZVB0clNvdXJjZSgpKSkpOworICBEZXJpdmVkKiBkID0gbmV3IERlcml2ZWQ7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE1ha2VVbmlxdWVCYXNlKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKEJ5TW92ZShzdGQ6OnVuaXF1ZV9wdHI8RGVyaXZlZD4oZCkpKSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPGludD4gcmVzdWx0MSA9IG1vY2suTWFrZVVuaXF1ZSgpOworICBFWFBFQ1RfRVEoMTksICpyZXN1bHQxKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4gdnJlc3VsdCA9IG1vY2suTWFrZVZlY3RvclVuaXF1ZSgpOworICBFWFBFQ1RfRVEoMXUsIHZyZXN1bHQuc2l6ZSgpKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHZyZXN1bHRbMF0pOworICBFWFBFQ1RfRVEoNywgKnZyZXN1bHRbMF0pOworCisgIHN0ZDo6dW5pcXVlX3B0cjxCYXNlPiByZXN1bHQyID0gbW9jay5NYWtlVW5pcXVlQmFzZSgpOworICBFWFBFQ1RfRVEoZCwgcmVzdWx0Mi5nZXQoKSk7Cit9CisKK1RFU1QoTW9ja01ldGhvZFRlc3QsIENhblJldHVybk1vdmVPbmx5VmFsdWVfRG9BbGxSZXR1cm4pIHsKKyAgdGVzdGluZzo6TW9ja0Z1bmN0aW9uPHZvaWQoKT4gbW9ja19mdW5jdGlvbjsKKyAgTW9ja0NsYXNzIG1vY2s7CisgIHN0ZDo6dW5pcXVlX3B0cjxpbnQ+IGkobmV3IGludCgxOSkpOworICBFWFBFQ1RfQ0FMTChtb2NrX2Z1bmN0aW9uLCBDYWxsKCkpOworICBFWFBFQ1RfQ0FMTChtb2NrLCBNYWtlVW5pcXVlKCkpLldpbGxPbmNlKERvQWxsKAorICAgICAgSW52b2tlV2l0aG91dEFyZ3MoJm1vY2tfZnVuY3Rpb24sICZ0ZXN0aW5nOjpNb2NrRnVuY3Rpb248dm9pZCgpPjo6Q2FsbCksCisgICAgICBSZXR1cm4oQnlNb3ZlKHN0ZDo6bW92ZShpKSkpKSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPGludD4gcmVzdWx0MSA9IG1vY2suTWFrZVVuaXF1ZSgpOworICBFWFBFQ1RfRVEoMTksICpyZXN1bHQxKTsKK30KKworVEVTVChNb2NrTWV0aG9kVGVzdCwgQ2FuUmV0dXJuTW92ZU9ubHlWYWx1ZV9JbnZva2UpIHsKKyAgTW9ja0NsYXNzIG1vY2s7CisKKyAgLy8gQ2hlY2sgZGVmYXVsdCB2YWx1ZQorICBEZWZhdWx0VmFsdWU8c3RkOjp1bmlxdWVfcHRyPGludD4+OjpTZXRGYWN0b3J5KFtdIHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPGludD4obmV3IGludCg0MikpOworICB9KTsKKyAgRVhQRUNUX0VRKDQyLCAqbW9jay5NYWtlVW5pcXVlKCkpOworCisgIEVYUEVDVF9DQUxMKG1vY2ssIE1ha2VVbmlxdWUoKSkuV2lsbFJlcGVhdGVkbHkoSW52b2tlKFVuaXF1ZVB0clNvdXJjZSkpOworICBFWFBFQ1RfQ0FMTChtb2NrLCBNYWtlVmVjdG9yVW5pcXVlKCkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlKFZlY3RvclVuaXF1ZVB0clNvdXJjZSkpOworICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiByZXN1bHQxID0gbW9jay5NYWtlVW5pcXVlKCk7CisgIEVYUEVDVF9FUSgxOSwgKnJlc3VsdDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiByZXN1bHQyID0gbW9jay5NYWtlVW5pcXVlKCk7CisgIEVYUEVDVF9FUSgxOSwgKnJlc3VsdDIpOworICBFWFBFQ1RfTkUocmVzdWx0MSwgcmVzdWx0Mik7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGludD4+IHZyZXN1bHQgPSBtb2NrLk1ha2VWZWN0b3JVbmlxdWUoKTsKKyAgRVhQRUNUX0VRKDF1LCB2cmVzdWx0LnNpemUoKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCB2cmVzdWx0WzBdKTsKKyAgRVhQRUNUX0VRKDcsICp2cmVzdWx0WzBdKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCisKK30gIC8vIFVubmFtZWQgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1jYXJkaW5hbGl0aWVzX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1jYXJkaW5hbGl0aWVzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4MTVlNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLWNhcmRpbmFsaXRpZXNfdGVzdC5jYwpAQCAtMCwwICsxLDQyOCBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgYnVpbHQtaW4gY2FyZGluYWxpdGllcy4KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworbmFtZXNwYWNlIHsKKwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyB0ZXN0aW5nOjpBbnlOdW1iZXI7Cit1c2luZyB0ZXN0aW5nOjpBdExlYXN0OwordXNpbmcgdGVzdGluZzo6QXRNb3N0OwordXNpbmcgdGVzdGluZzo6QmV0d2VlbjsKK3VzaW5nIHRlc3Rpbmc6OkNhcmRpbmFsaXR5OwordXNpbmcgdGVzdGluZzo6Q2FyZGluYWxpdHlJbnRlcmZhY2U7Cit1c2luZyB0ZXN0aW5nOjpFeGFjdGx5OwordXNpbmcgdGVzdGluZzo6SXNTdWJzdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjpNYWtlQ2FyZGluYWxpdHk7CisKK2NsYXNzIE1vY2tGb28geworIHB1YmxpYzoKKyAgTW9ja0ZvbygpIHt9CisgIE1PQ0tfTUVUSE9EMChCYXIsIGludCgpKTsgIC8vIE5PTElOVAorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRm9vKTsKK307CisKKy8vIFRlc3RzIHRoYXQgQ2FyZGluYWxpdHkgb2JqZWN0cyBjYW4gYmUgZGVmYXVsdCBjb25zdHJ1Y3RlZC4KK1RFU1QoQ2FyZGluYWxpdHlUZXN0LCBJc0RlZmF1bHRDb25zdHJ1Y3RhYmxlKSB7CisgIENhcmRpbmFsaXR5IGM7Cit9CisKKy8vIFRlc3RzIHRoYXQgQ2FyZGluYWxpdHkgb2JqZWN0cyBhcmUgY29weWFibGUuCitURVNUKENhcmRpbmFsaXR5VGVzdCwgSXNDb3B5YWJsZSkgeworICAvLyBUZXN0cyB0aGUgY29weSBjb25zdHJ1Y3Rvci4KKyAgQ2FyZGluYWxpdHkgYyA9IEV4YWN0bHkoMSk7CisgIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOworCisgIC8vIFRlc3RzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICBjID0gRXhhY3RseSgyKTsKKyAgRVhQRUNUX0ZBTFNFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgxKSk7CisgIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7CisgIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgyKSk7Cit9CisKK1RFU1QoQ2FyZGluYWxpdHlUZXN0LCBJc092ZXJTYXR1cmF0ZWRCeUNhbGxDb3VudFdvcmtzKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdE1vc3QoNSk7CisgIEVYUEVDVF9GQUxTRShjLklzT3ZlclNhdHVyYXRlZEJ5Q2FsbENvdW50KDQpKTsKKyAgRVhQRUNUX0ZBTFNFKGMuSXNPdmVyU2F0dXJhdGVkQnlDYWxsQ291bnQoNSkpOworICBFWFBFQ1RfVFJVRShjLklzT3ZlclNhdHVyYXRlZEJ5Q2FsbENvdW50KDYpKTsKK30KKworLy8gVGVzdHMgdGhhdCBDYXJkaW5hbGl0eTo6RGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbygpIGNyZWF0ZXMgdGhlCisvLyBjb3JyZWN0IGRlc2NyaXB0aW9uLgorVEVTVChDYXJkaW5hbGl0eVRlc3QsIENhbkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50KSB7CisgIHN0cmluZ3N0cmVhbSBzczA7CisgIENhcmRpbmFsaXR5OjpEZXNjcmliZUFjdHVhbENhbGxDb3VudFRvKDAsICZzczApOworICBFWFBFQ1RfRVEoIm5ldmVyIGNhbGxlZCIsIHNzMC5zdHIoKSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzMTsKKyAgQ2FyZGluYWxpdHk6OkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oMSwgJnNzMSk7CisgIEVYUEVDVF9FUSgiY2FsbGVkIG9uY2UiLCBzczEuc3RyKCkpOworCisgIHN0cmluZ3N0cmVhbSBzczI7CisgIENhcmRpbmFsaXR5OjpEZXNjcmliZUFjdHVhbENhbGxDb3VudFRvKDIsICZzczIpOworICBFWFBFQ1RfRVEoImNhbGxlZCB0d2ljZSIsIHNzMi5zdHIoKSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzMzsKKyAgQ2FyZGluYWxpdHk6OkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oMywgJnNzMyk7CisgIEVYUEVDVF9FUSgiY2FsbGVkIDMgdGltZXMiLCBzczMuc3RyKCkpOworfQorCisvLyBUZXN0cyBBbnlOdW1iZXIoKQorVEVTVChBbnlOdW1iZXIsIFdvcmtzKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBbnlOdW1iZXIoKTsKKyAgRVhQRUNUX1RSVUUoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDApKTsKKyAgRVhQRUNUX0ZBTFNFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgwKSk7CisKKyAgRVhQRUNUX1RSVUUoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDEpKTsKKyAgRVhQRUNUX0ZBTFNFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgxKSk7CisKKyAgRVhQRUNUX1RSVUUoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDkpKTsKKyAgRVhQRUNUX0ZBTFNFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCg5KSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzOworICBjLkRlc2NyaWJlVG8oJnNzKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzcy5zdHIoKSk7Cit9CisKK1RFU1QoQW55TnVtYmVyVGVzdCwgSGFzQ29ycmVjdEJvdW5kcykgeworICBjb25zdCBDYXJkaW5hbGl0eSBjID0gQW55TnVtYmVyKCk7CisgIEVYUEVDVF9FUSgwLCBjLkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSk7CisgIEVYUEVDVF9FUShJTlRfTUFYLCBjLkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSk7Cit9CisKKy8vIFRlc3RzIEF0TGVhc3QobikuCisKK1RFU1QoQXRMZWFzdFRlc3QsIE9uTmVnYXRpdmVOdW1iZXIpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQXRMZWFzdCgtMSk7CisgIH0sICJUaGUgaW52b2NhdGlvbiBsb3dlciBib3VuZCBtdXN0IGJlID49IDAiKTsKK30KKworVEVTVChBdExlYXN0VGVzdCwgT25aZXJvKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdExlYXN0KDApOworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOworICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDApKTsKKworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOworICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDEpKTsKKworICBzdHJpbmdzdHJlYW0gc3M7CisgIGMuRGVzY3JpYmVUbygmc3MpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiYW55IG51bWJlciBvZiB0aW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgc3Muc3RyKCkpOworfQorCitURVNUKEF0TGVhc3RUZXN0LCBPblBvc2l0aXZlTnVtYmVyKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdExlYXN0KDIpOworICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDApKTsKKyAgRVhQRUNUX0ZBTFNFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgwKSk7CisKKyAgRVhQRUNUX0ZBTFNFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgxKSk7CisgIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOworCisgIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7CisgIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMikpOworCisgIHN0cmluZ3N0cmVhbSBzczE7CisgIEF0TGVhc3QoMSkuRGVzY3JpYmVUbygmc3MxKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImF0IGxlYXN0IG9uY2UiLAorICAgICAgICAgICAgICAgICAgICAgIHNzMS5zdHIoKSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzMjsKKyAgYy5EZXNjcmliZVRvKCZzczIpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiYXQgbGVhc3QgdHdpY2UiLAorICAgICAgICAgICAgICAgICAgICAgIHNzMi5zdHIoKSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzMzsKKyAgQXRMZWFzdCgzKS5EZXNjcmliZVRvKCZzczMpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiYXQgbGVhc3QgMyB0aW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgc3MzLnN0cigpKTsKK30KKworVEVTVChBdExlYXN0VGVzdCwgSGFzQ29ycmVjdEJvdW5kcykgeworICBjb25zdCBDYXJkaW5hbGl0eSBjID0gQXRMZWFzdCgyKTsKKyAgRVhQRUNUX0VRKDIsIGMuQ29uc2VydmF0aXZlTG93ZXJCb3VuZCgpKTsKKyAgRVhQRUNUX0VRKElOVF9NQVgsIGMuQ29uc2VydmF0aXZlVXBwZXJCb3VuZCgpKTsKK30KKworLy8gVGVzdHMgQXRNb3N0KG4pLgorCitURVNUKEF0TW9zdFRlc3QsIE9uTmVnYXRpdmVOdW1iZXIpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQXRNb3N0KC0xKTsKKyAgfSwgIlRoZSBpbnZvY2F0aW9uIHVwcGVyIGJvdW5kIG11c3QgYmUgPj0gMCIpOworfQorCitURVNUKEF0TW9zdFRlc3QsIE9uWmVybykgeworICBjb25zdCBDYXJkaW5hbGl0eSBjID0gQXRNb3N0KDApOworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOworCisgIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOworCisgIHN0cmluZ3N0cmVhbSBzczsKKyAgYy5EZXNjcmliZVRvKCZzcyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJuZXZlciBjYWxsZWQiLAorICAgICAgICAgICAgICAgICAgICAgIHNzLnN0cigpKTsKK30KKworVEVTVChBdE1vc3RUZXN0LCBPblBvc2l0aXZlTnVtYmVyKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdE1vc3QoMik7CisgIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgwKSk7CisgIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOworCisgIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgxKSk7CisgIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOworCisgIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7CisgIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgyKSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzMTsKKyAgQXRNb3N0KDEpLkRlc2NyaWJlVG8oJnNzMSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJjYWxsZWQgYXQgbW9zdCBvbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICBzczEuc3RyKCkpOworCisgIHN0cmluZ3N0cmVhbSBzczI7CisgIGMuRGVzY3JpYmVUbygmc3MyKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImNhbGxlZCBhdCBtb3N0IHR3aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICBzczIuc3RyKCkpOworCisgIHN0cmluZ3N0cmVhbSBzczM7CisgIEF0TW9zdCgzKS5EZXNjcmliZVRvKCZzczMpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiY2FsbGVkIGF0IG1vc3QgMyB0aW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgc3MzLnN0cigpKTsKK30KKworVEVTVChBdE1vc3RUZXN0LCBIYXNDb3JyZWN0Qm91bmRzKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBBdE1vc3QoMik7CisgIEVYUEVDVF9FUSgwLCBjLkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSk7CisgIEVYUEVDVF9FUSgyLCBjLkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSk7Cit9CisKKy8vIFRlc3RzIEJldHdlZW4obSwgbikuCisKK1RFU1QoQmV0d2VlblRlc3QsIE9uTmVnYXRpdmVTdGFydCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBCZXR3ZWVuKC0xLCAyKTsKKyAgfSwgIlRoZSBpbnZvY2F0aW9uIGxvd2VyIGJvdW5kIG11c3QgYmUgPj0gMCwgYnV0IGlzIGFjdHVhbGx5IC0xIik7Cit9CisKK1RFU1QoQmV0d2VlblRlc3QsIE9uTmVnYXRpdmVFbmQpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQmV0d2VlbigxLCAtMik7CisgIH0sICJUaGUgaW52b2NhdGlvbiB1cHBlciBib3VuZCBtdXN0IGJlID49IDAsIGJ1dCBpcyBhY3R1YWxseSAtMiIpOworfQorCitURVNUKEJldHdlZW5UZXN0LCBPblN0YXJ0QmlnZ2VyVGhhbkVuZCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBCZXR3ZWVuKDIsIDEpOworICB9LCAiVGhlIGludm9jYXRpb24gdXBwZXIgYm91bmQgKDEpIG11c3QgYmUgPj0gIgorICAgICAidGhlIGludm9jYXRpb24gbG93ZXIgYm91bmQgKDIpIik7Cit9CisKK1RFU1QoQmV0d2VlblRlc3QsIE9uWmVyb1N0YXJ0QW5kWmVyb0VuZCkgeworICBjb25zdCBDYXJkaW5hbGl0eSBjID0gQmV0d2VlbigwLCAwKTsKKworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOworCisgIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOworCisgIHN0cmluZ3N0cmVhbSBzczsKKyAgYy5EZXNjcmliZVRvKCZzcyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJuZXZlciBjYWxsZWQiLAorICAgICAgICAgICAgICAgICAgICAgIHNzLnN0cigpKTsKK30KKworVEVTVChCZXR3ZWVuVGVzdCwgT25aZXJvU3RhcnRBbmROb25aZXJvRW5kKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBCZXR3ZWVuKDAsIDIpOworCisgIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgwKSk7CisgIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOworCisgIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7CisgIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgyKSk7CisKKyAgRVhQRUNUX0ZBTFNFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCg0KSk7CisgIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCg0KSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzOworICBjLkRlc2NyaWJlVG8oJnNzKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImNhbGxlZCBhdCBtb3N0IHR3aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICBzcy5zdHIoKSk7Cit9CisKK1RFU1QoQmV0d2VlblRlc3QsIE9uU2FtZVN0YXJ0QW5kRW5kKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBCZXR3ZWVuKDMsIDMpOworCisgIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMikpOworICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDIpKTsKKworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMykpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMykpOworCisgIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoNCkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoNCkpOworCisgIHN0cmluZ3N0cmVhbSBzczsKKyAgYy5EZXNjcmliZVRvKCZzcyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJjYWxsZWQgMyB0aW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgc3Muc3RyKCkpOworfQorCitURVNUKEJldHdlZW5UZXN0LCBPbkRpZmZlcmVudFN0YXJ0QW5kRW5kKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBCZXR3ZWVuKDMsIDUpOworCisgIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMikpOworICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDIpKTsKKworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMykpOworICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDMpKTsKKworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoNSkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoNSkpOworCisgIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoNikpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoNikpOworCisgIHN0cmluZ3N0cmVhbSBzczsKKyAgYy5EZXNjcmliZVRvKCZzcyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJjYWxsZWQgYmV0d2VlbiAzIGFuZCA1IHRpbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzcy5zdHIoKSk7Cit9CisKK1RFU1QoQmV0d2VlblRlc3QsIEhhc0NvcnJlY3RCb3VuZHMpIHsKKyAgY29uc3QgQ2FyZGluYWxpdHkgYyA9IEJldHdlZW4oMywgNSk7CisgIEVYUEVDVF9FUSgzLCBjLkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSk7CisgIEVYUEVDVF9FUSg1LCBjLkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSk7Cit9CisKKy8vIFRlc3RzIEV4YWN0bHkobikuCisKK1RFU1QoRXhhY3RseVRlc3QsIE9uTmVnYXRpdmVOdW1iZXIpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRXhhY3RseSgtMSk7CisgIH0sICJUaGUgaW52b2NhdGlvbiBsb3dlciBib3VuZCBtdXN0IGJlID49IDAiKTsKK30KKworVEVTVChFeGFjdGx5VGVzdCwgT25aZXJvKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBFeGFjdGx5KDApOworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMCkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOworCisgIEVYUEVDVF9GQUxTRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMSkpOworICBFWFBFQ1RfVFJVRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMSkpOworCisgIHN0cmluZ3N0cmVhbSBzczsKKyAgYy5EZXNjcmliZVRvKCZzcyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJuZXZlciBjYWxsZWQiLAorICAgICAgICAgICAgICAgICAgICAgIHNzLnN0cigpKTsKK30KKworVEVTVChFeGFjdGx5VGVzdCwgT25Qb3NpdGl2ZU51bWJlcikgeworICBjb25zdCBDYXJkaW5hbGl0eSBjID0gRXhhY3RseSgyKTsKKyAgRVhQRUNUX0ZBTFNFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgwKSk7CisgIEVYUEVDVF9GQUxTRShjLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoMCkpOworCisgIEVYUEVDVF9UUlVFKGMuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudCgyKSk7CisgIEVYUEVDVF9UUlVFKGMuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudCgyKSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzMTsKKyAgRXhhY3RseSgxKS5EZXNjcmliZVRvKCZzczEpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiY2FsbGVkIG9uY2UiLAorICAgICAgICAgICAgICAgICAgICAgIHNzMS5zdHIoKSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzMjsKKyAgYy5EZXNjcmliZVRvKCZzczIpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiY2FsbGVkIHR3aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICBzczIuc3RyKCkpOworCisgIHN0cmluZ3N0cmVhbSBzczM7CisgIEV4YWN0bHkoMykuRGVzY3JpYmVUbygmc3MzKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgImNhbGxlZCAzIHRpbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzczMuc3RyKCkpOworfQorCitURVNUKEV4YWN0bHlUZXN0LCBIYXNDb3JyZWN0Qm91bmRzKSB7CisgIGNvbnN0IENhcmRpbmFsaXR5IGMgPSBFeGFjdGx5KDMpOworICBFWFBFQ1RfRVEoMywgYy5Db25zZXJ2YXRpdmVMb3dlckJvdW5kKCkpOworICBFWFBFQ1RfRVEoMywgYy5Db25zZXJ2YXRpdmVVcHBlckJvdW5kKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgdXNlciBjYW4gbWFrZSBoaXMgb3duIGNhcmRpbmFsaXR5IGJ5IGltcGxlbWVudGluZworLy8gQ2FyZGluYWxpdHlJbnRlcmZhY2UgYW5kIGNhbGxpbmcgTWFrZUNhcmRpbmFsaXR5KCkuCisKK2NsYXNzIEV2ZW5DYXJkaW5hbGl0eSA6IHB1YmxpYyBDYXJkaW5hbGl0eUludGVyZmFjZSB7CisgcHVibGljOgorICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXRpc2Z5IHRoaXMgY2FyZGluYWxpdHkuCisgIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIChjYWxsX2NvdW50ICUgMiA9PSAwKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCAvKiBjYWxsX2NvdW50ICovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbS4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIHNzKSBjb25zdCB7CisgICAgKnNzIDw8ICJjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiOworICB9Cit9OworCitURVNUKE1ha2VDYXJkaW5hbGl0eVRlc3QsIENvbnN0cnVjdHNDYXJkaW5hbGl0eUZyb21JbnRlcmZhY2UpIHsKKyAgY29uc3QgQ2FyZGluYWxpdHkgYyA9IE1ha2VDYXJkaW5hbGl0eShuZXcgRXZlbkNhcmRpbmFsaXR5KTsKKworICBFWFBFQ1RfVFJVRShjLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoMikpOworICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KDMpKTsKKworICBFWFBFQ1RfRkFMU0UoYy5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KDEwMDAwKSk7CisKKyAgc3RyaW5nc3RyZWFtIHNzOworICBjLkRlc2NyaWJlVG8oJnNzKTsKKyAgRVhQRUNUX0VRKCJjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiLCBzcy5zdHIoKSk7Cit9CisKK30gIC8vIFVubmFtZWQgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1nZW5lcmF0ZWQtYWN0aW9uc190ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQyYTBhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnNfdGVzdC5jYwpAQCAtMCwwICsxLDEyMjcgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGJ1aWx0LWluIGFjdGlvbnMgZ2VuZXJhdGVkIGJ5IGEgc2NyaXB0LgorCisjaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgZ21vY2tfZ2VuZXJhdGVkX2FjdGlvbnNfdGVzdCB7CisKK3VzaW5nIDo6c3RkOjpwbHVzOwordXNpbmcgOjpzdGQ6OnN0cmluZzsKK3VzaW5nIHRlc3Rpbmc6OmdldDsKK3VzaW5nIHRlc3Rpbmc6Om1ha2VfdHVwbGU7Cit1c2luZyB0ZXN0aW5nOjp0dXBsZTsKK3VzaW5nIHRlc3Rpbmc6OnR1cGxlX2VsZW1lbnQ7Cit1c2luZyB0ZXN0aW5nOjpfOwordXNpbmcgdGVzdGluZzo6QWN0aW9uOwordXNpbmcgdGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlOwordXNpbmcgdGVzdGluZzo6QnlSZWY7Cit1c2luZyB0ZXN0aW5nOjpEb0FsbDsKK3VzaW5nIHRlc3Rpbmc6Okludm9rZTsKK3VzaW5nIHRlc3Rpbmc6OlJldHVybjsKK3VzaW5nIHRlc3Rpbmc6OlJldHVybk5ldzsKK3VzaW5nIHRlc3Rpbmc6OlNldEFyZ1BvaW50ZWU7Cit1c2luZyB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE7Cit1c2luZyB0ZXN0aW5nOjpVbnVzZWQ7Cit1c2luZyB0ZXN0aW5nOjpXaXRoQXJnczsKKworLy8gRm9yIHN1cHByZXNzaW5nIGNvbXBpbGVyIHdhcm5pbmdzIG9uIGNvbnZlcnNpb24gcG9zc2libHkgbG9zaW5nIHByZWNpc2lvbi4KK2lubGluZSBzaG9ydCBTaG9ydChzaG9ydCBuKSB7IHJldHVybiBuOyB9ICAvLyBOT0xJTlQKK2lubGluZSBjaGFyIENoYXIoY2hhciBjaCkgeyByZXR1cm4gY2g7IH0KKworLy8gU2FtcGxlIGZ1bmN0aW9ucyBhbmQgZnVuY3RvcnMgZm9yIHRlc3RpbmcgdmFyaW91cyBhY3Rpb25zLgoraW50IE51bGxhcnkoKSB7IHJldHVybiAxOyB9CisKK2NsYXNzIE51bGxhcnlGdW5jdG9yIHsKKyBwdWJsaWM6CisgIGludCBvcGVyYXRvcigpKCkgeyByZXR1cm4gMjsgfQorfTsKKworYm9vbCBnX2RvbmUgPSBmYWxzZTsKKworYm9vbCBVbmFyeShpbnQgeCkgeyByZXR1cm4geCA8IDA7IH0KKworY29uc3QgY2hhciogUGx1czEoY29uc3QgY2hhciogcykgeyByZXR1cm4gcyArIDE7IH0KKworYm9vbCBCeUNvbnN0UmVmKGNvbnN0IHN0cmluZyYgcykgeyByZXR1cm4gcyA9PSAiSGkiOyB9CisKK2NvbnN0IGRvdWJsZSBnX2RvdWJsZSA9IDA7Citib29sIFJlZmVyZW5jZXNHbG9iYWxEb3VibGUoY29uc3QgZG91YmxlJiB4KSB7IHJldHVybiAmeCA9PSAmZ19kb3VibGU7IH0KKworc3RyaW5nIEJ5Tm9uQ29uc3RSZWYoc3RyaW5nJiBzKSB7IHJldHVybiBzICs9ICIrIjsgfSAgLy8gTk9MSU5UCisKK3N0cnVjdCBVbmFyeUZ1bmN0b3IgeworICBpbnQgb3BlcmF0b3IoKShib29sIHgpIHsgcmV0dXJuIHggPyAxIDogLTE7IH0KK307CisKK2NvbnN0IGNoYXIqIEJpbmFyeShjb25zdCBjaGFyKiBpbnB1dCwgc2hvcnQgbikgeyByZXR1cm4gaW5wdXQgKyBuOyB9ICAvLyBOT0xJTlQKKwordm9pZCBWb2lkQmluYXJ5KGludCwgY2hhcikgeyBnX2RvbmUgPSB0cnVlOyB9CisKK2ludCBUZXJuYXJ5KGludCB4LCBjaGFyIHksIHNob3J0IHopIHsgcmV0dXJuIHggKyB5ICsgejsgfSAgLy8gTk9MSU5UCisKK3ZvaWQgVm9pZFRlcm5hcnkoaW50LCBjaGFyLCBib29sKSB7IGdfZG9uZSA9IHRydWU7IH0KKworaW50IFN1bU9mNChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgeyByZXR1cm4gYSArIGIgKyBjICsgZDsgfQorCitzdHJpbmcgQ29uY2F0NChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQpIHsKKyAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQ7Cit9CisKK2ludCBTdW1PZjUoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlKSB7IHJldHVybiBhICsgYiArIGMgKyBkICsgZTsgfQorCitzdHJ1Y3QgU3VtT2Y1RnVuY3RvciB7CisgIGludCBvcGVyYXRvcigpKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSkgeworICAgIHJldHVybiBhICsgYiArIGMgKyBkICsgZTsKKyAgfQorfTsKKworc3RyaW5nIENvbmNhdDUoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSkgeworICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1OworfQorCitpbnQgU3VtT2Y2KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSwgaW50IGYpIHsKKyAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlICsgZjsKK30KKworc3RydWN0IFN1bU9mNkZ1bmN0b3IgeworICBpbnQgb3BlcmF0b3IoKShpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUsIGludCBmKSB7CisgICAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlICsgZjsKKyAgfQorfTsKKworc3RyaW5nIENvbmNhdDYoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYpIHsKKyAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNSArIHM2OworfQorCitzdHJpbmcgQ29uY2F0Nyhjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNiwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM3KSB7CisgIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNiArIHM3OworfQorCitzdHJpbmcgQ29uY2F0OChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNiwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM3LCBjb25zdCBjaGFyKiBzOCkgeworICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNyArIHM4OworfQorCitzdHJpbmcgQ29uY2F0OShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNiwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM3LCBjb25zdCBjaGFyKiBzOCwgY29uc3QgY2hhciogczkpIHsKKyAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNSArIHM2ICsgczcgKyBzOCArIHM5OworfQorCitzdHJpbmcgQ29uY2F0MTAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM3LCBjb25zdCBjaGFyKiBzOCwgY29uc3QgY2hhciogczksCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEwKSB7CisgIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNiArIHM3ICsgczggKyBzOSArIHMxMDsKK30KKworLy8gQSBoZWxwZXIgdGhhdCB0dXJucyB0aGUgdHlwZSBvZiBhIEMtc3RyaW5nIGxpdGVyYWwgZnJvbSBjb25zdAorLy8gY2hhcltOXSB0byBjb25zdCBjaGFyKi4KK2lubGluZSBjb25zdCBjaGFyKiBDaGFyUHRyKGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIHM7IH0KKworLy8gVGVzdHMgSW52b2tlQXJndW1lbnQ8Tj4oLi4uKS4KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIG51bGxhcnkgZnVuY3Rpb24uCitURVNUKEludm9rZUFyZ3VtZW50VGVzdCwgRnVuY3Rpb24wKSB7CisgIEFjdGlvbjxpbnQoaW50LCBpbnQoKikoKSk+IGEgPSBJbnZva2VBcmd1bWVudDwxPigpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgxLCBhLlBlcmZvcm0obWFrZV90dXBsZSgyLCAmTnVsbGFyeSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIHVuYXJ5IGZ1bmN0aW9uLgorVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0b3IxKSB7CisgIEFjdGlvbjxpbnQoVW5hcnlGdW5jdG9yKT4gYSA9IEludm9rZUFyZ3VtZW50PDA+KHRydWUpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgxLCBhLlBlcmZvcm0obWFrZV90dXBsZShVbmFyeUZ1bmN0b3IoKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIDUtYXJ5IGZ1bmN0aW9uLgorVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0aW9uNSkgeworICBBY3Rpb248aW50KGludCgqKShpbnQsIGludCwgaW50LCBpbnQsIGludCkpPiBhID0gIC8vIE5PTElOVAorICAgICAgSW52b2tlQXJndW1lbnQ8MD4oMTAwMDAsIDIwMDAsIDMwMCwgNDAsIDUpOworICBFWFBFQ1RfRVEoMTIzNDUsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZTdW1PZjUpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggYSA1LWFyeSBmdW5jdG9yLgorVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0b3I1KSB7CisgIEFjdGlvbjxpbnQoU3VtT2Y1RnVuY3Rvcik+IGEgPSAgLy8gTk9MSU5UCisgICAgICBJbnZva2VBcmd1bWVudDwwPigxMDAwMCwgMjAwMCwgMzAwLCA0MCwgNSk7CisgIEVYUEVDVF9FUSgxMjM0NSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoU3VtT2Y1RnVuY3RvcigpKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2VBcmd1bWVudCB3aXRoIGEgNi1hcnkgZnVuY3Rpb24uCitURVNUKEludm9rZUFyZ3VtZW50VGVzdCwgRnVuY3Rpb242KSB7CisgIEFjdGlvbjxpbnQoaW50KCopKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpKT4gYSA9ICAvLyBOT0xJTlQKKyAgICAgIEludm9rZUFyZ3VtZW50PDA+KDEwMDAwMCwgMjAwMDAsIDMwMDAsIDQwMCwgNTAsIDYpOworICBFWFBFQ1RfRVEoMTIzNDU2LCBhLlBlcmZvcm0obWFrZV90dXBsZSgmU3VtT2Y2KSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2VBcmd1bWVudCB3aXRoIGEgNi1hcnkgZnVuY3Rvci4KK1RFU1QoSW52b2tlQXJndW1lbnRUZXN0LCBGdW5jdG9yNikgeworICBBY3Rpb248aW50KFN1bU9mNkZ1bmN0b3IpPiBhID0gIC8vIE5PTElOVAorICAgICAgSW52b2tlQXJndW1lbnQ8MD4oMTAwMDAwLCAyMDAwMCwgMzAwMCwgNDAwLCA1MCwgNik7CisgIEVYUEVDVF9FUSgxMjM0NTYsIGEuUGVyZm9ybShtYWtlX3R1cGxlKFN1bU9mNkZ1bmN0b3IoKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIDctYXJ5IGZ1bmN0aW9uLgorVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEZ1bmN0aW9uNykgeworICBBY3Rpb248c3RyaW5nKHN0cmluZygqKShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKikpPiBhID0KKyAgICAgIEludm9rZUFyZ3VtZW50PDA+KCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3Iik7CisgIEVYUEVDVF9FUSgiMTIzNDU2NyIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZDb25jYXQ3KSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2VBcmd1bWVudCB3aXRoIGEgOC1hcnkgZnVuY3Rpb24uCitURVNUKEludm9rZUFyZ3VtZW50VGVzdCwgRnVuY3Rpb244KSB7CisgIEFjdGlvbjxzdHJpbmcoc3RyaW5nKCopKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikpPiBhID0KKyAgICAgIEludm9rZUFyZ3VtZW50PDA+KCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiKTsKKyAgRVhQRUNUX0VRKCIxMjM0NTY3OCIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZDb25jYXQ4KSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2VBcmd1bWVudCB3aXRoIGEgOS1hcnkgZnVuY3Rpb24uCitURVNUKEludm9rZUFyZ3VtZW50VGVzdCwgRnVuY3Rpb245KSB7CisgIEFjdGlvbjxzdHJpbmcoc3RyaW5nKCopKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopKT4gYSA9CisgICAgICBJbnZva2VBcmd1bWVudDwwPigiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiKTsKKyAgRVhQRUNUX0VRKCIxMjM0NTY3ODkiLCBhLlBlcmZvcm0obWFrZV90dXBsZSgmQ29uY2F0OSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIDEwLWFyeSBmdW5jdGlvbi4KK1RFU1QoSW52b2tlQXJndW1lbnRUZXN0LCBGdW5jdGlvbjEwKSB7CisgIEFjdGlvbjxzdHJpbmcoc3RyaW5nKCopKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKSk+IGEgPQorICAgICAgSW52b2tlQXJndW1lbnQ8MD4oIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjAiKTsKKyAgRVhQRUNUX0VRKCIxMjM0NTY3ODkwIiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJkNvbmNhdDEwKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2VBcmd1bWVudCB3aXRoIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHBvaW50ZXIgYXJndW1lbnQuCitURVNUKEludm9rZUFyZ3VtZW50VGVzdCwgQnlQb2ludGVyRnVuY3Rpb24pIHsKKyAgQWN0aW9uPGNvbnN0IGNoYXIqKGNvbnN0IGNoYXIqKCopKGNvbnN0IGNoYXIqIGlucHV0LCBzaG9ydCBuKSk+IGEgPSAgLy8gTk9MSU5UCisgICAgICBJbnZva2VBcmd1bWVudDwwPihzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oIkhpIiksIFNob3J0KDEpKTsKKyAgRVhQRUNUX1NUUkVRKCJpIiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJkJpbmFyeSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlQXJndW1lbnQgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjb25zdCBjaGFyKgorLy8gYnkgcGFzc2luZyBpdCBhIEMtc3RyaW5nIGxpdGVyYWwuCitURVNUKEludm9rZUFyZ3VtZW50VGVzdCwgRnVuY3Rpb25XaXRoQ1N0cmluZ0xpdGVyYWwpIHsKKyAgQWN0aW9uPGNvbnN0IGNoYXIqKGNvbnN0IGNoYXIqKCopKGNvbnN0IGNoYXIqIGlucHV0LCBzaG9ydCBuKSk+IGEgPSAgLy8gTk9MSU5UCisgICAgICBJbnZva2VBcmd1bWVudDwwPigiSGkiLCBTaG9ydCgxKSk7CisgIEVYUEVDVF9TVFJFUSgiaSIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZCaW5hcnkpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgY29uc3QgcmVmZXJlbmNlLgorVEVTVChJbnZva2VBcmd1bWVudFRlc3QsIEJ5Q29uc3RSZWZlcmVuY2VGdW5jdGlvbikgeworICBBY3Rpb248Ym9vbChib29sKCpmdW5jdGlvbikoY29uc3Qgc3RyaW5nJiBzKSk+IGEgPSAgLy8gTk9MSU5UCisgICAgICBJbnZva2VBcmd1bWVudDwwPihzdHJpbmcoIkhpIikpOworICAvLyBXaGVuIGFjdGlvbiAnYScgaXMgY29uc3RydWN0ZWQsIGl0IG1ha2VzIGEgY29weSBvZiB0aGUgdGVtcG9yYXJ5CisgIC8vIHN0cmluZyBvYmplY3QgcGFzc2VkIHRvIGl0LCBzbyBpdCdzIE9LIHRvIHVzZSAnYScgbGF0ZXIsIHdoZW4gdGhlCisgIC8vIHRlbXBvcmFyeSBvYmplY3QgaGFzIGFscmVhZHkgZGllZC4KKyAgRVhQRUNUX1RSVUUoYS5QZXJmb3JtKG1ha2VfdHVwbGUoJkJ5Q29uc3RSZWYpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEludm9rZUFyZ3VtZW50IHdpdGggQnlSZWYoKSBhbmQgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEKKy8vIGNvbnN0IHJlZmVyZW5jZS4KK1RFU1QoSW52b2tlQXJndW1lbnRUZXN0LCBCeUV4cGxpY2l0Q29uc3RSZWZlcmVuY2VGdW5jdGlvbikgeworICBBY3Rpb248Ym9vbChib29sKCopKGNvbnN0IGRvdWJsZSYgeCkpPiBhID0gIC8vIE5PTElOVAorICAgICAgSW52b2tlQXJndW1lbnQ8MD4oQnlSZWYoZ19kb3VibGUpKTsKKyAgLy8gVGhlIGFib3ZlIGxpbmUgY2FsbHMgQnlSZWYoKSBvbiBhIGNvbnN0IHZhbHVlLgorICBFWFBFQ1RfVFJVRShhLlBlcmZvcm0obWFrZV90dXBsZSgmUmVmZXJlbmNlc0dsb2JhbERvdWJsZSkpKTsKKworICBkb3VibGUgeCA9IDA7CisgIGEgPSBJbnZva2VBcmd1bWVudDwwPihCeVJlZih4KSk7ICAvLyBUaGlzIGNhbGxzIEJ5UmVmKCkgb24gYSBub24tY29uc3QuCisgIEVYUEVDVF9GQUxTRShhLlBlcmZvcm0obWFrZV90dXBsZSgmUmVmZXJlbmNlc0dsb2JhbERvdWJsZSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3MgYW5kIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgMSBhcmd1bWVudC4KK1RFU1QoV2l0aEFyZ3NUZXN0LCBPbmVBcmcpIHsKKyAgQWN0aW9uPGJvb2woZG91YmxlIHgsIGludCBuKT4gYSA9IFdpdGhBcmdzPDE+KEludm9rZShVbmFyeSkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKGEuUGVyZm9ybShtYWtlX3R1cGxlKDEuNSwgLTEpKSk7CisgIEVYUEVDVF9GQUxTRShhLlBlcmZvcm0obWFrZV90dXBsZSgxLjUsIDEpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgMiBhcmd1bWVudHMuCitURVNUKFdpdGhBcmdzVGVzdCwgVHdvQXJncykgeworICBBY3Rpb248Y29uc3QgY2hhciooY29uc3QgY2hhciogcywgZG91YmxlIHgsIHNob3J0IG4pPiBhID0KKyAgICAgIFdpdGhBcmdzPDAsIDI+KEludm9rZShCaW5hcnkpKTsKKyAgY29uc3QgY2hhciBzW10gPSAiSGVsbG8iOworICBFWFBFQ1RfRVEocyArIDIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIocyksIDAuNSwgU2hvcnQoMikpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgMyBhcmd1bWVudHMuCitURVNUKFdpdGhBcmdzVGVzdCwgVGhyZWVBcmdzKSB7CisgIEFjdGlvbjxpbnQoaW50LCBkb3VibGUsIGNoYXIsIHNob3J0KT4gYSA9ICAvLyBOT0xJTlQKKyAgICAgIFdpdGhBcmdzPDAsIDIsIDM+KEludm9rZShUZXJuYXJ5KSk7CisgIEVYUEVDVF9FUSgxMjMsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDEwMCwgNi41LCBDaGFyKDIwKSwgU2hvcnQoMykpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgNCBhcmd1bWVudHMuCitURVNUKFdpdGhBcmdzVGVzdCwgRm91ckFyZ3MpIHsKKyAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGRvdWJsZSwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9CisgICAgICBXaXRoQXJnczw0LCAzLCAxLCAwPihJbnZva2UoQ29uY2F0NCkpOworICBFWFBFQ1RfRVEoIjQzMTAiLCBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIwIiksIENoYXJQdHIoIjEiKSwgMi41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCIzIiksIENoYXJQdHIoIjQiKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCBhbiBhY3Rpb24gdGhhdCB0YWtlcyA1IGFyZ3VtZW50cy4KK1RFU1QoV2l0aEFyZ3NUZXN0LCBGaXZlQXJncykgeworICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9CisgICAgICBXaXRoQXJnczw0LCAzLCAyLCAxLCAwPihJbnZva2UoQ29uY2F0NSkpOworICBFWFBFQ1RfRVEoIjQzMjEwIiwKKyAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjAiKSwgQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCIzIiksIENoYXJQdHIoIjQiKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCBhbiBhY3Rpb24gdGhhdCB0YWtlcyA2IGFyZ3VtZW50cy4KK1RFU1QoV2l0aEFyZ3NUZXN0LCBTaXhBcmdzKSB7CisgIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik+IGEgPQorICAgICAgV2l0aEFyZ3M8MCwgMSwgMiwgMiwgMSwgMD4oSW52b2tlKENvbmNhdDYpKTsKKyAgRVhQRUNUX0VRKCIwMTIyMTAiLAorICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMCIpLCBDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCBhbiBhY3Rpb24gdGhhdCB0YWtlcyA3IGFyZ3VtZW50cy4KK1RFU1QoV2l0aEFyZ3NUZXN0LCBTZXZlbkFyZ3MpIHsKKyAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik+IGEgPQorICAgICAgV2l0aEFyZ3M8MCwgMSwgMiwgMywgMiwgMSwgMD4oSW52b2tlKENvbmNhdDcpKTsKKyAgRVhQRUNUX0VRKCIwMTIzMjEwIiwKKyAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjAiKSwgQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCIzIikpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggYW4gYWN0aW9uIHRoYXQgdGFrZXMgOCBhcmd1bWVudHMuCitURVNUKFdpdGhBcmdzVGVzdCwgRWlnaHRBcmdzKSB7CisgIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0KKyAgICAgIFdpdGhBcmdzPDAsIDEsIDIsIDMsIDAsIDEsIDIsIDM+KEludm9rZShDb25jYXQ4KSk7CisgIEVYUEVDVF9FUSgiMDEyMzAxMjMiLAorICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMCIpLCBDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjMiKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCBhbiBhY3Rpb24gdGhhdCB0YWtlcyA5IGFyZ3VtZW50cy4KK1RFU1QoV2l0aEFyZ3NUZXN0LCBOaW5lQXJncykgeworICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9CisgICAgICBXaXRoQXJnczwwLCAxLCAyLCAzLCAxLCAyLCAzLCAyLCAzPihJbnZva2UoQ29uY2F0OSkpOworICBFWFBFQ1RfRVEoIjAxMjMxMjMyMyIsCisgICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIwIiksIENoYXJQdHIoIjEiKSwgQ2hhclB0cigiMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiMyIpKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBXaXRoQXJncyB3aXRoIGFuIGFjdGlvbiB0aGF0IHRha2VzIDEwIGFyZ3VtZW50cy4KK1RFU1QoV2l0aEFyZ3NUZXN0LCBUZW5BcmdzKSB7CisgIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0KKyAgICAgIFdpdGhBcmdzPDAsIDEsIDIsIDMsIDIsIDEsIDAsIDEsIDIsIDM+KEludm9rZShDb25jYXQxMCkpOworICBFWFBFQ1RfRVEoIjAxMjMyMTAxMjMiLAorICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMCIpLCBDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjMiKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCBhbiBhY3Rpb24gdGhhdCBpcyBub3QgSW52b2tlKCkuCitjbGFzcyBTdWJzdHJhY3RBY3Rpb24gOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPGludChpbnQsIGludCk+IHsgIC8vIE5PTElOVAorIHB1YmxpYzoKKyAgdmlydHVhbCBpbnQgUGVyZm9ybShjb25zdCB0dXBsZTxpbnQsIGludD4mIGFyZ3MpIHsKKyAgICByZXR1cm4gZ2V0PDA+KGFyZ3MpIC0gZ2V0PDE+KGFyZ3MpOworICB9Cit9OworCitURVNUKFdpdGhBcmdzVGVzdCwgTm9uSW52b2tlQWN0aW9uKSB7CisgIEFjdGlvbjxpbnQoY29uc3Qgc3RyaW5nJiwgaW50LCBpbnQpPiBhID0gIC8vIE5PTElOVAorICAgICAgV2l0aEFyZ3M8MiwgMT4oTWFrZUFjdGlvbihuZXcgU3Vic3RyYWN0QWN0aW9uKSk7CisgIEVYUEVDVF9FUSg4LCBhLlBlcmZvcm0obWFrZV90dXBsZShzdHJpbmcoImhpIiksIDIsIDEwKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBXaXRoQXJncyB0byBwYXNzIGFsbCBvcmlnaW5hbCBhcmd1bWVudHMgaW4gdGhlIG9yaWdpbmFsIG9yZGVyLgorVEVTVChXaXRoQXJnc1Rlc3QsIElkZW50aXR5KSB7CisgIEFjdGlvbjxpbnQoaW50IHgsIGNoYXIgeSwgc2hvcnQgeik+IGEgPSAgLy8gTk9MSU5UCisgICAgICBXaXRoQXJnczwwLCAxLCAyPihJbnZva2UoVGVybmFyeSkpOworICBFWFBFQ1RfRVEoMTIzLCBhLlBlcmZvcm0obWFrZV90dXBsZSgxMDAsIENoYXIoMjApLCBTaG9ydCgzKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCByZXBlYXRlZCBhcmd1bWVudHMuCitURVNUKFdpdGhBcmdzVGVzdCwgUmVwZWF0ZWRBcmd1bWVudHMpIHsKKyAgQWN0aW9uPGludChib29sLCBpbnQgbSwgaW50IG4pPiBhID0gIC8vIE5PTElOVAorICAgICAgV2l0aEFyZ3M8MSwgMSwgMSwgMT4oSW52b2tlKFN1bU9mNCkpOworICBFWFBFQ1RfRVEoNCwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoZmFsc2UsIDEsIDEwKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBXaXRoQXJncyB3aXRoIHJldmVyc2VkIGFyZ3VtZW50IG9yZGVyLgorVEVTVChXaXRoQXJnc1Rlc3QsIFJldmVyc2VkQXJndW1lbnRPcmRlcikgeworICBBY3Rpb248Y29uc3QgY2hhciooc2hvcnQgbiwgY29uc3QgY2hhciogaW5wdXQpPiBhID0gIC8vIE5PTElOVAorICAgICAgV2l0aEFyZ3M8MSwgMD4oSW52b2tlKEJpbmFyeSkpOworICBjb25zdCBjaGFyIHNbXSA9ICJIZWxsbyI7CisgIEVYUEVDVF9FUShzICsgMiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoU2hvcnQoMiksIENoYXJQdHIocykpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFdpdGhBcmdzIHdpdGggY29tcGF0aWJsZSwgYnV0IG5vdCBpZGVudGljYWwsIGFyZ3VtZW50IHR5cGVzLgorVEVTVChXaXRoQXJnc1Rlc3QsIEFyZ3NPZkNvbXBhdGlibGVUeXBlcykgeworICBBY3Rpb248bG9uZyhzaG9ydCB4LCBjaGFyIHksIGRvdWJsZSB6LCBjaGFyIGMpPiBhID0gIC8vIE5PTElOVAorICAgICAgV2l0aEFyZ3M8MCwgMSwgMz4oSW52b2tlKFRlcm5hcnkpKTsKKyAgRVhQRUNUX0VRKDEyMywgYS5QZXJmb3JtKG1ha2VfdHVwbGUoU2hvcnQoMTAwKSwgQ2hhcigyMCksIDUuNiwgQ2hhcigzKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aEFyZ3Mgd2l0aCBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIHZvaWQuCitURVNUKFdpdGhBcmdzVGVzdCwgVm9pZEFjdGlvbikgeworICBBY3Rpb248dm9pZChkb3VibGUgeCwgY2hhciBjLCBpbnQgbik+IGEgPSBXaXRoQXJnczwyLCAxPihJbnZva2UoVm9pZEJpbmFyeSkpOworICBnX2RvbmUgPSBmYWxzZTsKKyAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMS41LCAnYScsIDMpKTsKKyAgRVhQRUNUX1RSVUUoZ19kb25lKTsKK30KKworLy8gVGVzdHMgRG9BbGwoYTEsIGEyKS4KK1RFU1QoRG9BbGxUZXN0LCBUd29BY3Rpb25zKSB7CisgIGludCBuID0gMDsKKyAgQWN0aW9uPGludChpbnQqKT4gYSA9IERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybigyKSk7CisgIEVYUEVDVF9FUSgyLCBhLlBlcmZvcm0obWFrZV90dXBsZSgmbikpKTsKKyAgRVhQRUNUX0VRKDEsIG4pOworfQorCisvLyBUZXN0cyBEb0FsbChhMSwgYTIsIGEzKS4KK1RFU1QoRG9BbGxUZXN0LCBUaHJlZUFjdGlvbnMpIHsKKyAgaW50IG0gPSAwLCBuID0gMDsKKyAgQWN0aW9uPGludChpbnQqLCBpbnQqKT4gYSA9IERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEFyZ1BvaW50ZWU8MT4oMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4oMykpOworICBFWFBFQ1RfRVEoMywgYS5QZXJmb3JtKG1ha2VfdHVwbGUoJm0sICZuKSkpOworICBFWFBFQ1RfRVEoMSwgbSk7CisgIEVYUEVDVF9FUSgyLCBuKTsKK30KKworLy8gVGVzdHMgRG9BbGwoYTEsIGEyLCBhMywgYTQpLgorVEVTVChEb0FsbFRlc3QsIEZvdXJBY3Rpb25zKSB7CisgIGludCBtID0gMCwgbiA9IDA7CisgIGNoYXIgY2ggPSAnXDAnOworICBBY3Rpb248aW50KGludCosIGludCosIGNoYXIqKT4gYSA9ICAvLyBOT0xJTlQKKyAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksCisgICAgICAgICAgICBTZXRBcmdQb2ludGVlPDE+KDIpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwyPignYScpLAorICAgICAgICAgICAgUmV0dXJuKDMpKTsKKyAgRVhQRUNUX0VRKDMsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZtLCAmbiwgJmNoKSkpOworICBFWFBFQ1RfRVEoMSwgbSk7CisgIEVYUEVDVF9FUSgyLCBuKTsKKyAgRVhQRUNUX0VRKCdhJywgY2gpOworfQorCisvLyBUZXN0cyBEb0FsbChhMSwgYTIsIGEzLCBhNCwgYTUpLgorVEVTVChEb0FsbFRlc3QsIEZpdmVBY3Rpb25zKSB7CisgIGludCBtID0gMCwgbiA9IDA7CisgIGNoYXIgYSA9ICdcMCcsIGIgPSAnXDAnOworICBBY3Rpb248aW50KGludCosIGludCosIGNoYXIqLCBjaGFyKik+IGFjdGlvbiA9ICAvLyBOT0xJTlQKKyAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksCisgICAgICAgICAgICBTZXRBcmdQb2ludGVlPDE+KDIpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwyPignYScpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwzPignYicpLAorICAgICAgICAgICAgUmV0dXJuKDMpKTsKKyAgRVhQRUNUX0VRKDMsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUoJm0sICZuLCAmYSwgJmIpKSk7CisgIEVYUEVDVF9FUSgxLCBtKTsKKyAgRVhQRUNUX0VRKDIsIG4pOworICBFWFBFQ1RfRVEoJ2EnLCBhKTsKKyAgRVhQRUNUX0VRKCdiJywgYik7Cit9CisKKy8vIFRlc3RzIERvQWxsKGExLCBhMiwgLi4uLCBhNikuCitURVNUKERvQWxsVGVzdCwgU2l4QWN0aW9ucykgeworICBpbnQgbSA9IDAsIG4gPSAwOworICBjaGFyIGEgPSAnXDAnLCBiID0gJ1wwJywgYyA9ICdcMCc7CisgIEFjdGlvbjxpbnQoaW50KiwgaW50KiwgY2hhciosIGNoYXIqLCBjaGFyKik+IGFjdGlvbiA9ICAvLyBOT0xJTlQKKyAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksCisgICAgICAgICAgICBTZXRBcmdQb2ludGVlPDE+KDIpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwyPignYScpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwzPignYicpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw0PignYycpLAorICAgICAgICAgICAgUmV0dXJuKDMpKTsKKyAgRVhQRUNUX0VRKDMsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUoJm0sICZuLCAmYSwgJmIsICZjKSkpOworICBFWFBFQ1RfRVEoMSwgbSk7CisgIEVYUEVDVF9FUSgyLCBuKTsKKyAgRVhQRUNUX0VRKCdhJywgYSk7CisgIEVYUEVDVF9FUSgnYicsIGIpOworICBFWFBFQ1RfRVEoJ2MnLCBjKTsKK30KKworLy8gVGVzdHMgRG9BbGwoYTEsIGEyLCAuLi4sIGE3KS4KK1RFU1QoRG9BbGxUZXN0LCBTZXZlbkFjdGlvbnMpIHsKKyAgaW50IG0gPSAwLCBuID0gMDsKKyAgY2hhciBhID0gJ1wwJywgYiA9ICdcMCcsIGMgPSAnXDAnLCBkID0gJ1wwJzsKKyAgQWN0aW9uPGludChpbnQqLCBpbnQqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBjaGFyKik+IGFjdGlvbiA9ICAvLyBOT0xJTlQKKyAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksCisgICAgICAgICAgICBTZXRBcmdQb2ludGVlPDE+KDIpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwyPignYScpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwzPignYicpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw0PignYycpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw1PignZCcpLAorICAgICAgICAgICAgUmV0dXJuKDMpKTsKKyAgRVhQRUNUX0VRKDMsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUoJm0sICZuLCAmYSwgJmIsICZjLCAmZCkpKTsKKyAgRVhQRUNUX0VRKDEsIG0pOworICBFWFBFQ1RfRVEoMiwgbik7CisgIEVYUEVDVF9FUSgnYScsIGEpOworICBFWFBFQ1RfRVEoJ2InLCBiKTsKKyAgRVhQRUNUX0VRKCdjJywgYyk7CisgIEVYUEVDVF9FUSgnZCcsIGQpOworfQorCisvLyBUZXN0cyBEb0FsbChhMSwgYTIsIC4uLiwgYTgpLgorVEVTVChEb0FsbFRlc3QsIEVpZ2h0QWN0aW9ucykgeworICBpbnQgbSA9IDAsIG4gPSAwOworICBjaGFyIGEgPSAnXDAnLCBiID0gJ1wwJywgYyA9ICdcMCcsIGQgPSAnXDAnLCBlID0gJ1wwJzsKKyAgQWN0aW9uPGludChpbnQqLCBpbnQqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBjaGFyKiwgIC8vIE5PTElOVAorICAgICAgICAgICAgIGNoYXIqKT4gYWN0aW9uID0KKyAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksCisgICAgICAgICAgICBTZXRBcmdQb2ludGVlPDE+KDIpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwyPignYScpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwzPignYicpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw0PignYycpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw1PignZCcpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw2PignZScpLAorICAgICAgICAgICAgUmV0dXJuKDMpKTsKKyAgRVhQRUNUX0VRKDMsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUoJm0sICZuLCAmYSwgJmIsICZjLCAmZCwgJmUpKSk7CisgIEVYUEVDVF9FUSgxLCBtKTsKKyAgRVhQRUNUX0VRKDIsIG4pOworICBFWFBFQ1RfRVEoJ2EnLCBhKTsKKyAgRVhQRUNUX0VRKCdiJywgYik7CisgIEVYUEVDVF9FUSgnYycsIGMpOworICBFWFBFQ1RfRVEoJ2QnLCBkKTsKKyAgRVhQRUNUX0VRKCdlJywgZSk7Cit9CisKKy8vIFRlc3RzIERvQWxsKGExLCBhMiwgLi4uLCBhOSkuCitURVNUKERvQWxsVGVzdCwgTmluZUFjdGlvbnMpIHsKKyAgaW50IG0gPSAwLCBuID0gMDsKKyAgY2hhciBhID0gJ1wwJywgYiA9ICdcMCcsIGMgPSAnXDAnLCBkID0gJ1wwJywgZSA9ICdcMCcsIGYgPSAnXDAnOworICBBY3Rpb248aW50KGludCosIGludCosIGNoYXIqLCBjaGFyKiwgY2hhciosIGNoYXIqLCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgY2hhciosIGNoYXIqKT4gYWN0aW9uID0KKyAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksCisgICAgICAgICAgICBTZXRBcmdQb2ludGVlPDE+KDIpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwyPignYScpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwzPignYicpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw0PignYycpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw1PignZCcpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw2PignZScpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw3PignZicpLAorICAgICAgICAgICAgUmV0dXJuKDMpKTsKKyAgRVhQRUNUX0VRKDMsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUoJm0sICZuLCAmYSwgJmIsICZjLCAmZCwgJmUsICZmKSkpOworICBFWFBFQ1RfRVEoMSwgbSk7CisgIEVYUEVDVF9FUSgyLCBuKTsKKyAgRVhQRUNUX0VRKCdhJywgYSk7CisgIEVYUEVDVF9FUSgnYicsIGIpOworICBFWFBFQ1RfRVEoJ2MnLCBjKTsKKyAgRVhQRUNUX0VRKCdkJywgZCk7CisgIEVYUEVDVF9FUSgnZScsIGUpOworICBFWFBFQ1RfRVEoJ2YnLCBmKTsKK30KKworLy8gVGVzdHMgRG9BbGwoYTEsIGEyLCAuLi4sIGExMCkuCitURVNUKERvQWxsVGVzdCwgVGVuQWN0aW9ucykgeworICBpbnQgbSA9IDAsIG4gPSAwOworICBjaGFyIGEgPSAnXDAnLCBiID0gJ1wwJywgYyA9ICdcMCcsIGQgPSAnXDAnOworICBjaGFyIGUgPSAnXDAnLCBmID0gJ1wwJywgZyA9ICdcMCc7CisgIEFjdGlvbjxpbnQoaW50KiwgaW50KiwgY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciosICAvLyBOT0xJTlQKKyAgICAgICAgICAgICBjaGFyKiwgY2hhciosIGNoYXIqKT4gYWN0aW9uID0KKyAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksCisgICAgICAgICAgICBTZXRBcmdQb2ludGVlPDE+KDIpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwyPignYScpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTwzPignYicpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw0PignYycpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw1PignZCcpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw2PignZScpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw3PignZicpLAorICAgICAgICAgICAgU2V0QXJnUG9pbnRlZTw4PignZycpLAorICAgICAgICAgICAgUmV0dXJuKDMpKTsKKyAgRVhQRUNUX0VRKDMsIGFjdGlvbi5QZXJmb3JtKG1ha2VfdHVwbGUoJm0sICZuLCAmYSwgJmIsICZjLCAmZCwgJmUsICZmLCAmZykpKTsKKyAgRVhQRUNUX0VRKDEsIG0pOworICBFWFBFQ1RfRVEoMiwgbik7CisgIEVYUEVDVF9FUSgnYScsIGEpOworICBFWFBFQ1RfRVEoJ2InLCBiKTsKKyAgRVhQRUNUX0VRKCdjJywgYyk7CisgIEVYUEVDVF9FUSgnZCcsIGQpOworICBFWFBFQ1RfRVEoJ2UnLCBlKTsKKyAgRVhQRUNUX0VRKCdmJywgZik7CisgIEVYUEVDVF9FUSgnZycsIGcpOworfQorCisvLyBUaGUgQUNUSU9OKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwKKy8vIHBhcmFtZXRlcikgaW4gTVNWQyB3aXRoIC1XNC4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW5ub3QgYmUgZml4ZWQgaW4KKy8vIHRoZSBtYWNybyBkZWZpbml0aW9uLCBhcyB0aGUgd2FybmluZ3MgYXJlIGdlbmVyYXRlZCB3aGVuIHRoZSBtYWNybworLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlCisvLyB3ZSBzdXBwcmVzcyB0aGVtIGhlcmUuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQorI2VuZGlmCisKKy8vIFRlc3RzIHRoZSBBQ1RJT04qKCkgbWFjcm8gZmFtaWx5LgorCisvLyBUZXN0cyB0aGF0IEFDVElPTigpIGNhbiBkZWZpbmUgYW4gYWN0aW9uIHRoYXQgZG9lc24ndCByZWZlcmVuY2UgdGhlCisvLyBtb2NrIGZ1bmN0aW9uIGFyZ3VtZW50cy4KK0FDVElPTihSZXR1cm41KSB7IHJldHVybiA1OyB9CisKK1RFU1QoQWN0aW9uTWFjcm9UZXN0LCBXb3Jrc1doZW5Ob3RSZWZlcmVuY2luZ0FyZ3VtZW50cykgeworICBBY3Rpb248ZG91YmxlKCk+IGExID0gUmV0dXJuNSgpOworICBFWFBFQ1RfRE9VQkxFX0VRKDUsIGExLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7CisKKyAgQWN0aW9uPGludChkb3VibGUsIGJvb2wpPiBhMiA9IFJldHVybjUoKTsKKyAgRVhQRUNUX0VRKDUsIGEyLlBlcmZvcm0obWFrZV90dXBsZSgxLCB0cnVlKSkpOworfQorCisvLyBUZXN0cyB0aGF0IEFDVElPTigpIGNhbiBkZWZpbmUgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB2b2lkLgorQUNUSU9OKEluY3JlbWVudEFyZzEpIHsgKCphcmcxKSsrOyB9CisKK1RFU1QoQWN0aW9uTWFjcm9UZXN0LCBXb3Jrc1doZW5SZXR1cm5pbmdWb2lkKSB7CisgIEFjdGlvbjx2b2lkKGludCwgaW50Kik+IGExID0gSW5jcmVtZW50QXJnMSgpOworICBpbnQgbiA9IDA7CisgIGExLlBlcmZvcm0obWFrZV90dXBsZSg1LCAmbikpOworICBFWFBFQ1RfRVEoMSwgbik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGJvZHkgb2YgQUNUSU9OKCkgY2FuIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiB0aGUKKy8vIGFyZ3VtZW50LgorQUNUSU9OKEluY3JlbWVudEFyZzIpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCosIGFyZzJfdHlwZT4oKTsKKyAgYXJnMl90eXBlIHRlbXAgPSBhcmcyOworICAoKnRlbXApKys7Cit9CisKK1RFU1QoQWN0aW9uTWFjcm9UZXN0LCBDYW5SZWZlcmVuY2VBcmd1bWVudFR5cGUpIHsKKyAgQWN0aW9uPHZvaWQoaW50LCBib29sLCBpbnQqKT4gYTEgPSBJbmNyZW1lbnRBcmcyKCk7CisgIGludCBuID0gMDsKKyAgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDUsIGZhbHNlLCAmbikpOworICBFWFBFQ1RfRVEoMSwgbik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGJvZHkgb2YgQUNUSU9OKCkgY2FuIHJlZmVyZW5jZSB0aGUgYXJndW1lbnQgdHVwbGUKKy8vIHZpYSBhcmdzX3R5cGUgYW5kIGFyZ3MuCitBQ1RJT04oU3VtMikgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8dHVwbGU8aW50LCBjaGFyLCBpbnQqPiwgYXJnc190eXBlPigpOworICBhcmdzX3R5cGUgYXJnc19jb3B5ID0gYXJnczsKKyAgcmV0dXJuIGdldDwwPihhcmdzX2NvcHkpICsgZ2V0PDE+KGFyZ3NfY29weSk7Cit9CisKK1RFU1QoQWN0aW9uTWFjcm9UZXN0LCBDYW5SZWZlcmVuY2VBcmd1bWVudFR1cGxlKSB7CisgIEFjdGlvbjxpbnQoaW50LCBjaGFyLCBpbnQqKT4gYTEgPSBTdW0yKCk7CisgIGludCBkdW1teSA9IDA7CisgIEVYUEVDVF9FUSgxMSwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDUsIENoYXIoNiksICZkdW1teSkpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgYm9keSBvZiBBQ1RJT04oKSBjYW4gcmVmZXJlbmNlIHRoZSBtb2NrIGZ1bmN0aW9uCisvLyB0eXBlLgoraW50IER1bW15KGJvb2wgZmxhZykgeyByZXR1cm4gZmxhZz8gMSA6IDA7IH0KKworQUNUSU9OKEludm9rZUR1bW15KSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQoYm9vbCksIGZ1bmN0aW9uX3R5cGU+KCk7CisgIGZ1bmN0aW9uX3R5cGUqIGZwID0gJkR1bW15OworICByZXR1cm4gKCpmcCkodHJ1ZSk7Cit9CisKK1RFU1QoQWN0aW9uTWFjcm9UZXN0LCBDYW5SZWZlcmVuY2VNb2NrRnVuY3Rpb25UeXBlKSB7CisgIEFjdGlvbjxpbnQoYm9vbCk+IGExID0gSW52b2tlRHVtbXkoKTsKKyAgRVhQRUNUX0VRKDEsIGExLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlKSkpOworICBFWFBFQ1RfRVEoMSwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlKSkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBib2R5IG9mIEFDVElPTigpIGNhbiByZWZlcmVuY2UgdGhlIG1vY2sgZnVuY3Rpb24ncworLy8gcmV0dXJuIHR5cGUuCitBQ1RJT04oSW52b2tlRHVtbXkyKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIHJldHVybl90eXBlPigpOworICByZXR1cm5fdHlwZSByZXN1bHQgPSBEdW1teSh0cnVlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVChBY3Rpb25NYWNyb1Rlc3QsIENhblJlZmVyZW5jZU1vY2tGdW5jdGlvblJldHVyblR5cGUpIHsKKyAgQWN0aW9uPGludChib29sKT4gYTEgPSBJbnZva2VEdW1teTIoKTsKKyAgRVhQRUNUX0VRKDEsIGExLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlKSkpOworICBFWFBFQ1RfRVEoMSwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlKSkpOworfQorCisvLyBUZXN0cyB0aGF0IEFDVElPTigpIHdvcmtzIGZvciBhcmd1bWVudHMgcGFzc2VkIGJ5IGNvbnN0IHJlZmVyZW5jZS4KK0FDVElPTihSZXR1cm5BZGRyT2ZDb25zdEJvb2xSZWZlcmVuY2VBcmcpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IGJvb2wmLCBhcmcxX3R5cGU+KCk7CisgIHJldHVybiAmYXJnMTsKK30KKworVEVTVChBY3Rpb25NYWNyb1Rlc3QsIFdvcmtzRm9yQ29uc3RSZWZlcmVuY2VBcmcpIHsKKyAgQWN0aW9uPGNvbnN0IGJvb2wqKGludCwgY29uc3QgYm9vbCYpPiBhID0gUmV0dXJuQWRkck9mQ29uc3RCb29sUmVmZXJlbmNlQXJnKCk7CisgIGNvbnN0IGJvb2wgYiA9IGZhbHNlOworICBFWFBFQ1RfRVEoJmIsIGEuUGVyZm9ybSh0dXBsZTxpbnQsIGNvbnN0IGJvb2wmPigwLCBiKSkpOworfQorCisvLyBUZXN0cyB0aGF0IEFDVElPTigpIHdvcmtzIGZvciBhcmd1bWVudHMgcGFzc2VkIGJ5IG5vbi1jb25zdCByZWZlcmVuY2UuCitBQ1RJT04oUmV0dXJuQWRkck9mSW50UmVmZXJlbmNlQXJnKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQmLCBhcmcwX3R5cGU+KCk7CisgIHJldHVybiAmYXJnMDsKK30KKworVEVTVChBY3Rpb25NYWNyb1Rlc3QsIFdvcmtzRm9yTm9uQ29uc3RSZWZlcmVuY2VBcmcpIHsKKyAgQWN0aW9uPGludCooaW50JiwgYm9vbCwgaW50KT4gYSA9IFJldHVybkFkZHJPZkludFJlZmVyZW5jZUFyZygpOworICBpbnQgbiA9IDA7CisgIEVYUEVDVF9FUSgmbiwgYS5QZXJmb3JtKHR1cGxlPGludCYsIGJvb2wsIGludD4obiwgdHJ1ZSwgMSkpKTsKK30KKworLy8gVGVzdHMgdGhhdCBBQ1RJT04oKSBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZS4KK25hbWVzcGFjZSBhY3Rpb25fdGVzdCB7CitBQ1RJT04oU3VtKSB7IHJldHVybiBhcmcwICsgYXJnMTsgfQorfSAgLy8gbmFtZXNwYWNlIGFjdGlvbl90ZXN0CisKK1RFU1QoQWN0aW9uTWFjcm9UZXN0LCBXb3Jrc0luTmFtZXNwYWNlKSB7CisgIEFjdGlvbjxpbnQoaW50LCBpbnQpPiBhMSA9IGFjdGlvbl90ZXN0OjpTdW0oKTsKKyAgRVhQRUNUX0VRKDMsIGExLlBlcmZvcm0obWFrZV90dXBsZSgxLCAyKSkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBzYW1lIEFDVElPTiBkZWZpbml0aW9uIHdvcmtzIGZvciBtb2NrIGZ1bmN0aW9ucyB3aXRoCisvLyBkaWZmZXJlbnQgYXJndW1lbnQgbnVtYmVycy4KK0FDVElPTihQbHVzVHdvKSB7IHJldHVybiBhcmcwICsgMjsgfQorCitURVNUKEFjdGlvbk1hY3JvVGVzdCwgV29ya3NGb3JEaWZmZXJlbnRBcmd1bWVudE51bWJlcnMpIHsKKyAgQWN0aW9uPGludChpbnQpPiBhMSA9IFBsdXNUd28oKTsKKyAgRVhQRUNUX0VRKDQsIGExLlBlcmZvcm0obWFrZV90dXBsZSgyKSkpOworCisgIEFjdGlvbjxkb3VibGUoZmxvYXQsIHZvaWQqKT4gYTIgPSBQbHVzVHdvKCk7CisgIGludCBkdW1teTsKKyAgRVhQRUNUX0RPVUJMRV9FUSg2LCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoNC4wZiwgJmR1bW15KSkpOworfQorCisvLyBUZXN0cyB0aGF0IEFDVElPTl9QIGNhbiBkZWZpbmUgYSBwYXJhbWV0ZXJpemVkIGFjdGlvbi4KK0FDVElPTl9QKFBsdXMsIG4pIHsgcmV0dXJuIGFyZzAgKyBuOyB9CisKK1RFU1QoQWN0aW9uUE1hY3JvVGVzdCwgRGVmaW5lc1BhcmFtZXRlcml6ZWRBY3Rpb24pIHsKKyAgQWN0aW9uPGludChpbnQgbSwgYm9vbCB0KT4gYTEgPSBQbHVzKDkpOworICBFWFBFQ1RfRVEoMTAsIGExLlBlcmZvcm0obWFrZV90dXBsZSgxLCB0cnVlKSkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBib2R5IG9mIEFDVElPTl9QIGNhbiByZWZlcmVuY2UgdGhlIGFyZ3VtZW50IHR5cGVzCisvLyBhbmQgdGhlIHBhcmFtZXRlciB0eXBlLgorQUNUSU9OX1AoVHlwZWRQbHVzLCBuKSB7CisgIGFyZzBfdHlwZSB0MSA9IGFyZzA7CisgIG5fdHlwZSB0MiA9IG47CisgIHJldHVybiB0MSArIHQyOworfQorCitURVNUKEFjdGlvblBNYWNyb1Rlc3QsIENhblJlZmVyZW5jZUFyZ3VtZW50QW5kUGFyYW1ldGVyVHlwZXMpIHsKKyAgQWN0aW9uPGludChjaGFyIG0sIGJvb2wgdCk+IGExID0gVHlwZWRQbHVzKDkpOworICBFWFBFQ1RfRVEoMTAsIGExLlBlcmZvcm0obWFrZV90dXBsZShDaGFyKDEpLCB0cnVlKSkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgcGFyYW1ldGVyaXplZCBhY3Rpb24gY2FuIGJlIHVzZWQgaW4gYW55IG1vY2sgZnVuY3Rpb24KKy8vIHdob3NlIHR5cGUgaXMgY29tcGF0aWJsZS4KK1RFU1QoQWN0aW9uUE1hY3JvVGVzdCwgV29ya3NJbkNvbXBhdGlibGVNb2NrRnVuY3Rpb24pIHsKKyAgQWN0aW9uPHN0ZDo6c3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKT4gYTEgPSBQbHVzKCJ0YWlsIik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlID0gInJlIjsKKyAgRVhQRUNUX0VRKCJyZXRhaWwiLCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUocmUpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIHVzZSBBQ1RJT04qKCkgdG8gZGVmaW5lIGFjdGlvbnMgb3ZlcmxvYWRlZCBvbiB0aGUKKy8vIG51bWJlciBvZiBwYXJhbWV0ZXJzLgorCitBQ1RJT04oT3ZlcmxvYWRlZEFjdGlvbikgeyByZXR1cm4gYXJnMCA/IGFyZzEgOiAiaGVsbG8iOyB9CisKK0FDVElPTl9QKE92ZXJsb2FkZWRBY3Rpb24sIGRlZmF1bHRfdmFsdWUpIHsKKyAgcmV0dXJuIGFyZzAgPyBhcmcxIDogZGVmYXVsdF92YWx1ZTsKK30KKworQUNUSU9OX1AyKE92ZXJsb2FkZWRBY3Rpb24sIHRydWVfdmFsdWUsIGZhbHNlX3ZhbHVlKSB7CisgIHJldHVybiBhcmcwID8gdHJ1ZV92YWx1ZSA6IGZhbHNlX3ZhbHVlOworfQorCitURVNUKEFjdGlvbk1hY3JvVGVzdCwgQ2FuRGVmaW5lT3ZlcmxvYWRlZEFjdGlvbnMpIHsKKyAgdHlwZWRlZiBBY3Rpb248Y29uc3QgY2hhciooYm9vbCwgY29uc3QgY2hhciopPiBNeUFjdGlvbjsKKworICBjb25zdCBNeUFjdGlvbiBhMSA9IE92ZXJsb2FkZWRBY3Rpb24oKTsKKyAgRVhQRUNUX1NUUkVRKCJoZWxsbyIsIGExLlBlcmZvcm0obWFrZV90dXBsZShmYWxzZSwgQ2hhclB0cigid29ybGQiKSkpKTsKKyAgRVhQRUNUX1NUUkVRKCJ3b3JsZCIsIGExLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCBDaGFyUHRyKCJ3b3JsZCIpKSkpOworCisgIGNvbnN0IE15QWN0aW9uIGEyID0gT3ZlcmxvYWRlZEFjdGlvbigiaGkiKTsKKyAgRVhQRUNUX1NUUkVRKCJoaSIsIGEyLlBlcmZvcm0obWFrZV90dXBsZShmYWxzZSwgQ2hhclB0cigid29ybGQiKSkpKTsKKyAgRVhQRUNUX1NUUkVRKCJ3b3JsZCIsIGEyLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCBDaGFyUHRyKCJ3b3JsZCIpKSkpOworCisgIGNvbnN0IE15QWN0aW9uIGEzID0gT3ZlcmxvYWRlZEFjdGlvbigiaGkiLCAieW91Iik7CisgIEVYUEVDVF9TVFJFUSgiaGkiLCBhMy5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgQ2hhclB0cigid29ybGQiKSkpKTsKKyAgRVhQRUNUX1NUUkVRKCJ5b3UiLCBhMy5QZXJmb3JtKG1ha2VfdHVwbGUoZmFsc2UsIENoYXJQdHIoIndvcmxkIikpKSk7Cit9CisKKy8vIFRlc3RzIEFDVElPTl9QbiB3aGVyZSBuID49IDMuCisKK0FDVElPTl9QMyhQbHVzLCBtLCBuLCBrKSB7IHJldHVybiBhcmcwICsgbSArIG4gKyBrOyB9CisKK1RFU1QoQWN0aW9uUG5NYWNyb1Rlc3QsIFdvcmtzRm9yM1BhcmFtZXRlcnMpIHsKKyAgQWN0aW9uPGRvdWJsZShpbnQgbSwgYm9vbCB0KT4gYTEgPSBQbHVzKDEwMCwgMjAsIDMuNCk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMzEyMy40LCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoMzAwMCwgdHJ1ZSkpKTsKKworICBBY3Rpb248c3RkOjpzdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpPiBhMiA9IFBsdXMoInRhaWwiLCAiLSIsICI+Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlID0gInJlIjsKKyAgRVhQRUNUX0VRKCJyZXRhaWwtPiIsIGEyLlBlcmZvcm0obWFrZV90dXBsZShyZSkpKTsKK30KKworQUNUSU9OX1A0KFBsdXMsIHAwLCBwMSwgcDIsIHAzKSB7IHJldHVybiBhcmcwICsgcDAgKyBwMSArIHAyICsgcDM7IH0KKworVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgV29ya3NGb3I0UGFyYW1ldGVycykgeworICBBY3Rpb248aW50KGludCk+IGExID0gUGx1cygxLCAyLCAzLCA0KTsKKyAgRVhQRUNUX0VRKDEwICsgMSArIDIgKyAzICsgNCwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDEwKSkpOworfQorCitBQ1RJT05fUDUoUGx1cywgcDAsIHAxLCBwMiwgcDMsIHA0KSB7IHJldHVybiBhcmcwICsgcDAgKyBwMSArIHAyICsgcDMgKyBwNDsgfQorCitURVNUKEFjdGlvblBuTWFjcm9UZXN0LCBXb3Jrc0ZvcjVQYXJhbWV0ZXJzKSB7CisgIEFjdGlvbjxpbnQoaW50KT4gYTEgPSBQbHVzKDEsIDIsIDMsIDQsIDUpOworICBFWFBFQ1RfRVEoMTAgKyAxICsgMiArIDMgKyA0ICsgNSwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDEwKSkpOworfQorCitBQ1RJT05fUDYoUGx1cywgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgeworICByZXR1cm4gYXJnMCArIHAwICsgcDEgKyBwMiArIHAzICsgcDQgKyBwNTsKK30KKworVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgV29ya3NGb3I2UGFyYW1ldGVycykgeworICBBY3Rpb248aW50KGludCk+IGExID0gUGx1cygxLCAyLCAzLCA0LCA1LCA2KTsKKyAgRVhQRUNUX0VRKDEwICsgMSArIDIgKyAzICsgNCArIDUgKyA2LCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoMTApKSk7Cit9CisKK0FDVElPTl9QNyhQbHVzLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikgeworICByZXR1cm4gYXJnMCArIHAwICsgcDEgKyBwMiArIHAzICsgcDQgKyBwNSArIHA2OworfQorCitURVNUKEFjdGlvblBuTWFjcm9UZXN0LCBXb3Jrc0ZvcjdQYXJhbWV0ZXJzKSB7CisgIEFjdGlvbjxpbnQoaW50KT4gYTEgPSBQbHVzKDEsIDIsIDMsIDQsIDUsIDYsIDcpOworICBFWFBFQ1RfRVEoMTAgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3LCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoMTApKSk7Cit9CisKK0FDVElPTl9QOChQbHVzLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpIHsKKyAgcmV0dXJuIGFyZzAgKyBwMCArIHAxICsgcDIgKyBwMyArIHA0ICsgcDUgKyBwNiArIHA3OworfQorCitURVNUKEFjdGlvblBuTWFjcm9UZXN0LCBXb3Jrc0ZvcjhQYXJhbWV0ZXJzKSB7CisgIEFjdGlvbjxpbnQoaW50KT4gYTEgPSBQbHVzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpOworICBFWFBFQ1RfRVEoMTAgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3ICsgOCwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDEwKSkpOworfQorCitBQ1RJT05fUDkoUGx1cywgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkgeworICByZXR1cm4gYXJnMCArIHAwICsgcDEgKyBwMiArIHAzICsgcDQgKyBwNSArIHA2ICsgcDcgKyBwODsKK30KKworVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgV29ya3NGb3I5UGFyYW1ldGVycykgeworICBBY3Rpb248aW50KGludCk+IGExID0gUGx1cygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KTsKKyAgRVhQRUNUX0VRKDEwICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNyArIDggKyA5LCBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoMTApKSk7Cit9CisKK0FDVElPTl9QMTAoUGx1cywgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgbGFzdF9wYXJhbSkgeworICBhcmcwX3R5cGUgdDAgPSBhcmcwOworICBsYXN0X3BhcmFtX3R5cGUgdDkgPSBsYXN0X3BhcmFtOworICByZXR1cm4gdDAgKyBwMCArIHAxICsgcDIgKyBwMyArIHA0ICsgcDUgKyBwNiArIHA3ICsgcDggKyB0OTsKK30KKworVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgV29ya3NGb3IxMFBhcmFtZXRlcnMpIHsKKyAgQWN0aW9uPGludChpbnQpPiBhMSA9IFBsdXMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApOworICBFWFBFQ1RfRVEoMTAgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3ICsgOCArIDkgKyAxMCwKKyAgICAgICAgICAgIGExLlBlcmZvcm0obWFrZV90dXBsZSgxMCkpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgYWN0aW9uIGJvZHkgY2FuIHByb21vdGUgdGhlIHBhcmFtZXRlciB0eXBlcy4KKworQUNUSU9OX1AyKFBhZEFyZ3VtZW50LCBwcmVmaXgsIHN1ZmZpeCkgeworICAvLyBUaGUgZm9sbG93aW5nIGxpbmVzIHByb21vdGUgdGhlIHR3byBwYXJhbWV0ZXJzIHRvIGRlc2lyZWQgdHlwZXMuCisgIHN0ZDo6c3RyaW5nIHByZWZpeF9zdHIocHJlZml4KTsKKyAgY2hhciBzdWZmaXhfY2hhciA9IHN0YXRpY19jYXN0PGNoYXI+KHN1ZmZpeCk7CisgIHJldHVybiBwcmVmaXhfc3RyICsgYXJnMCArIHN1ZmZpeF9jaGFyOworfQorCitURVNUKEFjdGlvblBuTWFjcm9UZXN0LCBTaW1wbGVUeXBlUHJvbW90aW9uKSB7CisgIEFjdGlvbjxzdGQ6OnN0cmluZyhjb25zdCBjaGFyKik+IG5vX3Byb21vID0KKyAgICAgIFBhZEFyZ3VtZW50KHN0ZDo6c3RyaW5nKCJmb28iKSwgJ3InKTsKKyAgQWN0aW9uPHN0ZDo6c3RyaW5nKGNvbnN0IGNoYXIqKT4gcHJvbW8gPQorICAgICAgUGFkQXJndW1lbnQoImZvbyIsIHN0YXRpY19jYXN0PGludD4oJ3InKSk7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgbm9fcHJvbW8uUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoImJhIikpKSk7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgcHJvbW8uUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoImJhIikpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIHBhcnRpYWxseSByZXN0cmljdCBwYXJhbWV0ZXIgdHlwZXMgdXNpbmcgYQorLy8gc3RyYWlnaHQtZm9yd2FyZCBwYXR0ZXJuLgorCisvLyBEZWZpbmVzIGEgZ2VuZXJpYyBhY3Rpb24gdGhhdCBkb2Vzbid0IHJlc3RyaWN0IHRoZSB0eXBlcyBvZiBpdHMKKy8vIHBhcmFtZXRlcnMuCitBQ1RJT05fUDMoQ29uY2F0SW1wbCwgYSwgYiwgYykgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgYSA8PCBiIDw8IGM7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gTmV4dCwgd2UgdHJ5IHRvIHJlc3RyaWN0IHRoYXQgZWl0aGVyIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYQorLy8gc3RyaW5nLCBvciB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhbiBpbnQuCisKKy8vIERlZmluZXMgYSBwYXJ0aWFsbHkgc3BlY2lhbGl6ZWQgd3JhcHBlciB0aGF0IHJlc3RyaWN0cyB0aGUgZmlyc3QKKy8vIHBhcmFtZXRlciB0byBzdGQ6OnN0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisvLyBDb25jYXRJbXBsQWN0aW9uUDMgaXMgdGhlIGNsYXNzIHRlbXBsYXRlIEFDVElPTl9QMyB1c2VzIHRvCisvLyBpbXBsZW1lbnQgQ29uY2F0SW1wbC4gIFdlIHNob3VsZG4ndCBjaGFuZ2UgdGhlIG5hbWUgYXMgdGhpcworLy8gcGF0dGVybiByZXF1aXJlcyB0aGUgdXNlciB0byB1c2UgaXQgZGlyZWN0bHkuCitDb25jYXRJbXBsQWN0aW9uUDM8c3RkOjpzdHJpbmcsIFQxLCBUMj4KK0NvbmNhdChjb25zdCBzdGQ6OnN0cmluZyYgYSwgVDEgYiwgVDIgYykgeworICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BVU0hfKCkKKyAgaWYgKHRydWUpIHsKKyAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QT1BfKCkKKyAgICAvLyBUaGlzIGJyYW5jaCB2ZXJpZmllcyB0aGF0IENvbmNhdEltcGwoKSBjYW4gYmUgaW52b2tlZCB3aXRob3V0CisgICAgLy8gZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnRzLgorICAgIHJldHVybiBDb25jYXRJbXBsKGEsIGIsIGMpOworICB9IGVsc2UgeworICAgIC8vIFRoaXMgYnJhbmNoIHZlcmlmaWVzIHRoYXQgQ29uY2F0SW1wbCgpIGNhbiBhbHNvIGJlIGludm9rZWQgd2l0aAorICAgIC8vIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50cy4gIEl0IGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8gYmUKKyAgICAvLyBleGVjdXRlZCBhcyB0aGlzIGlzIGEgY29tcGlsZS10aW1lIHZlcmlmaWNhdGlvbi4KKyAgICByZXR1cm4gQ29uY2F0SW1wbDxzdGQ6OnN0cmluZywgVDEsIFQyPihhLCBiLCBjKTsKKyAgfQorfQorCisvLyBEZWZpbmVzIGFub3RoZXIgcGFydGlhbGx5IHNwZWNpYWxpemVkIHdyYXBwZXIgdGhhdCByZXN0cmljdHMgdGhlCisvLyBzZWNvbmQgcGFyYW1ldGVyIHRvIGludC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitDb25jYXRJbXBsQWN0aW9uUDM8VDEsIGludCwgVDI+CitDb25jYXQoVDEgYSwgaW50IGIsIFQyIGMpIHsKKyAgcmV0dXJuIENvbmNhdEltcGwoYSwgYiwgYyk7Cit9CisKK1RFU1QoQWN0aW9uUG5NYWNyb1Rlc3QsIENhblBhcnRpYWxseVJlc3RyaWN0UGFyYW1ldGVyVHlwZXMpIHsKKyAgQWN0aW9uPGNvbnN0IHN0ZDo6c3RyaW5nKCk+IGExID0gQ29uY2F0KCJIZWxsbyIsICIxIiwgMik7CisgIEVYUEVDVF9FUSgiSGVsbG8xMiIsIGExLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7CisKKyAgYTEgPSBDb25jYXQoMSwgMiwgMyk7CisgIEVYUEVDVF9FUSgiMTIzIiwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKK30KKworLy8gVmVyaWZpZXMgdGhlIHR5cGUgb2YgYW4gQUNUSU9OKi4KKworQUNUSU9OKERvRm9vKSB7fQorQUNUSU9OX1AoRG9Gb28sIHApIHt9CitBQ1RJT05fUDIoRG9Gb28sIHAwLCBwMSkge30KKworVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgVHlwZXNBcmVDb3JyZWN0KSB7CisgIC8vIERvRm9vKCkgbXVzdCBiZSBhc3NpZ25hYmxlIHRvIGEgRG9Gb29BY3Rpb24gdmFyaWFibGUuCisgIERvRm9vQWN0aW9uIGEwID0gRG9Gb28oKTsKKworICAvLyBEb0ZvbygxKSBtdXN0IGJlIGFzc2lnbmFibGUgdG8gYSBEb0Zvb0FjdGlvblAgdmFyaWFibGUuCisgIERvRm9vQWN0aW9uUDxpbnQ+IGExID0gRG9Gb28oMSk7CisKKyAgLy8gRG9Gb28ocDEsIC4uLiwgcGspIG11c3QgYmUgYXNzaWduYWJsZSB0byBhIERvRm9vQWN0aW9uUGsKKyAgLy8gdmFyaWFibGUsIGFuZCBzbyBvbi4KKyAgRG9Gb29BY3Rpb25QMjxpbnQsIGNoYXI+IGEyID0gRG9Gb28oMSwgJzInKTsKKyAgUGx1c0FjdGlvblAzPGludCwgaW50LCBjaGFyPiBhMyA9IFBsdXMoMSwgMiwgJzMnKTsKKyAgUGx1c0FjdGlvblA0PGludCwgaW50LCBpbnQsIGNoYXI+IGE0ID0gUGx1cygxLCAyLCAzLCAnNCcpOworICBQbHVzQWN0aW9uUDU8aW50LCBpbnQsIGludCwgaW50LCBjaGFyPiBhNSA9IFBsdXMoMSwgMiwgMywgNCwgJzUnKTsKKyAgUGx1c0FjdGlvblA2PGludCwgaW50LCBpbnQsIGludCwgaW50LCBjaGFyPiBhNiA9IFBsdXMoMSwgMiwgMywgNCwgNSwgJzYnKTsKKyAgUGx1c0FjdGlvblA3PGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGNoYXI+IGE3ID0KKyAgICAgIFBsdXMoMSwgMiwgMywgNCwgNSwgNiwgJzcnKTsKKyAgUGx1c0FjdGlvblA4PGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTggPQorICAgICAgUGx1cygxLCAyLCAzLCA0LCA1LCA2LCA3LCAnOCcpOworICBQbHVzQWN0aW9uUDk8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGNoYXI+IGE5ID0KKyAgICAgIFBsdXMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgJzknKTsKKyAgUGx1c0FjdGlvblAxMDxpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBjaGFyPiBhMTAgPQorICAgICAgUGx1cygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAnMCcpOworCisgIC8vIEF2b2lkICJ1bnVzZWQgdmFyaWFibGUiIHdhcm5pbmdzLgorICAodm9pZClhMDsKKyAgKHZvaWQpYTE7CisgICh2b2lkKWEyOworICAodm9pZClhMzsKKyAgKHZvaWQpYTQ7CisgICh2b2lkKWE1OworICAodm9pZClhNjsKKyAgKHZvaWQpYTc7CisgICh2b2lkKWE4OworICAodm9pZClhOTsKKyAgKHZvaWQpYTEwOworfQorCisvLyBUZXN0cyB0aGF0IGFuIEFDVElPTl9QKigpIGFjdGlvbiBjYW4gYmUgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQKKy8vIHdpdGggcmVmZXJlbmNlLXR5cGVkIHBhcmFtZXRlcnMuCisKK0FDVElPTl9QKFBsdXMxLCB4KSB7IHJldHVybiB4OyB9CitBQ1RJT05fUDIoUGx1czIsIHgsIHkpIHsgcmV0dXJuIHggKyB5OyB9CitBQ1RJT05fUDMoUGx1czMsIHgsIHksIHopIHsgcmV0dXJuIHggKyB5ICsgejsgfQorQUNUSU9OX1AxMChQbHVzMTAsIGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7CisgIHJldHVybiBhMCArIGExICsgYTIgKyBhMyArIGE0ICsgYTUgKyBhNiArIGE3ICsgYTggKyBhOTsKK30KKworVEVTVChBY3Rpb25Qbk1hY3JvVGVzdCwgQ2FuRXhwbGljaXRseUluc3RhbnRpYXRlV2l0aFJlZmVyZW5jZVR5cGVzKSB7CisgIGludCB4ID0gMSwgeSA9IDIsIHogPSAzOworICBjb25zdCB0dXBsZTw+IGVtcHR5ID0gbWFrZV90dXBsZSgpOworCisgIEFjdGlvbjxpbnQoKT4gYSA9IFBsdXMxPGludCY+KHgpOworICBFWFBFQ1RfRVEoMSwgYS5QZXJmb3JtKGVtcHR5KSk7CisKKyAgYSA9IFBsdXMyPGNvbnN0IGludCYsIGludCY+KHgsIHkpOworICBFWFBFQ1RfRVEoMywgYS5QZXJmb3JtKGVtcHR5KSk7CisKKyAgYSA9IFBsdXMzPGludCYsIGNvbnN0IGludCYsIGludCY+KHgsIHksIHopOworICBFWFBFQ1RfRVEoNiwgYS5QZXJmb3JtKGVtcHR5KSk7CisKKyAgaW50IG5bMTBdID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCB9OworICBhID0gUGx1czEwPGNvbnN0IGludCYsIGludCYsIGNvbnN0IGludCYsIGludCYsIGNvbnN0IGludCYsIGludCYsIGNvbnN0IGludCYsCisgICAgICBpbnQmLCBjb25zdCBpbnQmLCBpbnQmPihuWzBdLCBuWzFdLCBuWzJdLCBuWzNdLCBuWzRdLCBuWzVdLCBuWzZdLCBuWzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbls4XSwgbls5XSk7CisgIEVYUEVDVF9FUSg1NSwgYS5QZXJmb3JtKGVtcHR5KSk7Cit9CisKK2NsYXNzIE51bGxhcnlDb25zdHJ1Y3RvckNsYXNzIHsKKyBwdWJsaWM6CisgIE51bGxhcnlDb25zdHJ1Y3RvckNsYXNzKCkgOiB2YWx1ZV8oMTIzKSB7fQorICBpbnQgdmFsdWVfOworfTsKKworLy8gVGVzdHMgdXNpbmcgUmV0dXJuTmV3KCkgd2l0aCBhIG51bGxhcnkgY29uc3RydWN0b3IuCitURVNUKFJldHVybk5ld1Rlc3QsIE5vQXJncykgeworICBBY3Rpb248TnVsbGFyeUNvbnN0cnVjdG9yQ2xhc3MqKCk+IGEgPSBSZXR1cm5OZXc8TnVsbGFyeUNvbnN0cnVjdG9yQ2xhc3M+KCk7CisgIE51bGxhcnlDb25zdHJ1Y3RvckNsYXNzKiBjID0gYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSgxMjMsIGMtPnZhbHVlXyk7CisgIGRlbGV0ZSBjOworfQorCitjbGFzcyBVbmFyeUNvbnN0cnVjdG9yQ2xhc3MgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5hcnlDb25zdHJ1Y3RvckNsYXNzKGludCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIGludCB2YWx1ZV87Cit9OworCisvLyBUZXN0cyB1c2luZyBSZXR1cm5OZXcoKSB3aXRoIGEgdW5hcnkgY29uc3RydWN0b3IuCitURVNUKFJldHVybk5ld1Rlc3QsIFVuYXJ5KSB7CisgIEFjdGlvbjxVbmFyeUNvbnN0cnVjdG9yQ2xhc3MqKCk+IGEgPSBSZXR1cm5OZXc8VW5hcnlDb25zdHJ1Y3RvckNsYXNzPig0MDAwKTsKKyAgVW5hcnlDb25zdHJ1Y3RvckNsYXNzKiBjID0gYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSg0MDAwLCBjLT52YWx1ZV8pOworICBkZWxldGUgYzsKK30KKworVEVTVChSZXR1cm5OZXdUZXN0LCBVbmFyeVdvcmtzV2hlbk1vY2tNZXRob2RIYXNBcmdzKSB7CisgIEFjdGlvbjxVbmFyeUNvbnN0cnVjdG9yQ2xhc3MqKGJvb2wsIGludCk+IGEgPQorICAgICAgUmV0dXJuTmV3PFVuYXJ5Q29uc3RydWN0b3JDbGFzcz4oNDAwMCk7CisgIFVuYXJ5Q29uc3RydWN0b3JDbGFzcyogYyA9IGEuUGVyZm9ybShtYWtlX3R1cGxlKGZhbHNlLCA1KSk7CisgIEVYUEVDVF9FUSg0MDAwLCBjLT52YWx1ZV8pOworICBkZWxldGUgYzsKK30KKworVEVTVChSZXR1cm5OZXdUZXN0LCBVbmFyeVdvcmtzV2hlbk1vY2tNZXRob2RSZXR1cm5zUG9pbnRlclRvQ29uc3QpIHsKKyAgQWN0aW9uPGNvbnN0IFVuYXJ5Q29uc3RydWN0b3JDbGFzcyooKT4gYSA9CisgICAgICBSZXR1cm5OZXc8VW5hcnlDb25zdHJ1Y3RvckNsYXNzPig0MDAwKTsKKyAgY29uc3QgVW5hcnlDb25zdHJ1Y3RvckNsYXNzKiBjID0gYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSg0MDAwLCBjLT52YWx1ZV8pOworICBkZWxldGUgYzsKK30KKworY2xhc3MgVGVuQXJnQ29uc3RydWN0b3JDbGFzcyB7CisgcHVibGljOgorICBUZW5BcmdDb25zdHJ1Y3RvckNsYXNzKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhNiwgaW50IGE3LCBpbnQgYTgsIGludCBhOSwgaW50IGExMCkKKyAgICA6IHZhbHVlXyhhMSArIGEyICsgYTMgKyBhNCArIGE1ICsgYTYgKyBhNyArIGE4ICsgYTkgKyBhMTApIHsKKyAgfQorICBpbnQgdmFsdWVfOworfTsKKworLy8gVGVzdHMgdXNpbmcgUmV0dXJuTmV3KCkgd2l0aCBhIDEwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgorVEVTVChSZXR1cm5OZXdUZXN0LCBDb25zdHJ1Y3RvclRoYXRUYWtlczEwQXJndW1lbnRzKSB7CisgIEFjdGlvbjxUZW5BcmdDb25zdHJ1Y3RvckNsYXNzKigpPiBhID0KKyAgICAgIFJldHVybk5ldzxUZW5BcmdDb25zdHJ1Y3RvckNsYXNzPigxMDAwMDAwMDAwLCAyMDAwMDAwMDAsIDMwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMDAwMDAsIDUwMDAwMCwgNjAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAwMCwgODAwLCA5MCwgMCk7CisgIFRlbkFyZ0NvbnN0cnVjdG9yQ2xhc3MqIGMgPSBhLlBlcmZvcm0obWFrZV90dXBsZSgpKTsKKyAgRVhQRUNUX0VRKDEyMzQ1Njc4OTAsIGMtPnZhbHVlXyk7CisgIGRlbGV0ZSBjOworfQorCisvLyBUZXN0cyB0aGF0IEFDVElPTl9URU1QTEFURSB3b3JrcyB3aGVuIHRoZXJlIGlzIG5vIHZhbHVlIHBhcmFtZXRlci4KK0FDVElPTl9URU1QTEFURShDcmVhdGVOZXcsCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKKyAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgeworICByZXR1cm4gbmV3IFQ7Cit9CisKK1RFU1QoQWN0aW9uVGVtcGxhdGVUZXN0LCBXb3Jrc1dpdGhvdXRWYWx1ZVBhcmFtKSB7CisgIGNvbnN0IEFjdGlvbjxpbnQqKCk+IGEgPSBDcmVhdGVOZXc8aW50PigpOworICBpbnQqIHAgPSBhLlBlcmZvcm0obWFrZV90dXBsZSgpKTsKKyAgZGVsZXRlIHA7Cit9CisKKy8vIFRlc3RzIHRoYXQgQUNUSU9OX1RFTVBMQVRFIHdvcmtzIHdoZW4gdGhlcmUgYXJlIHZhbHVlIHBhcmFtZXRlcnMuCitBQ1RJT05fVEVNUExBVEUoQ3JlYXRlTmV3LAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCisgICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKGEwKSkgeworICByZXR1cm4gbmV3IFQoYTApOworfQorCitURVNUKEFjdGlvblRlbXBsYXRlVGVzdCwgV29ya3NXaXRoVmFsdWVQYXJhbXMpIHsKKyAgY29uc3QgQWN0aW9uPGludCooKT4gYSA9IENyZWF0ZU5ldzxpbnQ+KDQyKTsKKyAgaW50KiBwID0gYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSg0MiwgKnApOworICBkZWxldGUgcDsKK30KKworLy8gVGVzdHMgdGhhdCBBQ1RJT05fVEVNUExBVEUgd29ya3MgZm9yIGludGVncmFsIHRlbXBsYXRlIHBhcmFtZXRlcnMuCitBQ1RJT05fVEVNUExBVEUoTXlEZWxldGVBcmcsCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCisgICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKKyAgZGVsZXRlIGdldDxrPihhcmdzKTsKK30KKworLy8gUmVzZXRzIGEgYm9vbCB2YXJpYWJsZSBpbiB0aGUgZGVzdHJ1Y3Rvci4KK2NsYXNzIEJvb2xSZXNldHRlciB7CisgcHVibGljOgorICBleHBsaWNpdCBCb29sUmVzZXR0ZXIoYm9vbCogdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQorICB+Qm9vbFJlc2V0dGVyKCkgeyAqdmFsdWVfID0gZmFsc2U7IH0KKyBwcml2YXRlOgorICBib29sKiB2YWx1ZV87Cit9OworCitURVNUKEFjdGlvblRlbXBsYXRlVGVzdCwgV29ya3NGb3JJbnRlZ3JhbFRlbXBsYXRlUGFyYW1zKSB7CisgIGNvbnN0IEFjdGlvbjx2b2lkKGludCosIEJvb2xSZXNldHRlciopPiBhID0gTXlEZWxldGVBcmc8MT4oKTsKKyAgaW50IG4gPSAwOworICBib29sIGIgPSB0cnVlOworICBCb29sUmVzZXR0ZXIqIHJlc2V0dGVyID0gbmV3IEJvb2xSZXNldHRlcigmYik7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKCZuLCByZXNldHRlcikpOworICBFWFBFQ1RfRkFMU0UoYik7ICAvLyBWZXJpZmllcyB0aGF0IHJlc2V0dGVyIGlzIGRlbGV0ZWQuCit9CisKKy8vIFRlc3RzIHRoYXQgQUNUSU9OX1RFTVBMQVRFUyB3b3JrcyBmb3IgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycy4KK0FDVElPTl9URU1QTEFURShSZXR1cm5TbWFydFBvaW50ZXIsCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVlPiBjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciksCisgICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHBvaW50ZWUpKSB7CisgIHJldHVybiBQb2ludGVyPHBvaW50ZWVfdHlwZT4obmV3IHBvaW50ZWVfdHlwZShwb2ludGVlKSk7Cit9CisKK1RFU1QoQWN0aW9uVGVtcGxhdGVUZXN0LCBXb3Jrc0ZvclRlbXBsYXRlVGVtcGxhdGVQYXJhbWV0ZXJzKSB7CisgIHVzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OmxpbmtlZF9wdHI7CisgIGNvbnN0IEFjdGlvbjxsaW5rZWRfcHRyPGludD4oKT4gYSA9IFJldHVyblNtYXJ0UG9pbnRlcjxsaW5rZWRfcHRyPig0Mik7CisgIGxpbmtlZF9wdHI8aW50PiBwID0gYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSg0MiwgKnApOworfQorCisvLyBUZXN0cyB0aGF0IEFDVElPTl9URU1QTEFURSB3b3JrcyBmb3IgMTAgdGVtcGxhdGUgcGFyYW1ldGVycy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCBpbnQgazQsIGJvb2wgazUsCisgICAgICAgICAgdW5zaWduZWQgaW50IGs2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgorc3RydWN0IEdpYW50VGVtcGxhdGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgR2lhbnRUZW1wbGF0ZShpbnQgYV92YWx1ZSkgOiB2YWx1ZShhX3ZhbHVlKSB7fQorICBpbnQgdmFsdWU7Cit9OworCitBQ1RJT05fVEVNUExBVEUoUmV0dXJuR2lhbnQsCisgICAgICAgICAgICAgICAgSEFTXzEwX1RFTVBMQVRFX1BBUkFNUygKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUsIFQxLAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSwgVDIsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lLCBUMywKKyAgICAgICAgICAgICAgICAgICAgaW50LCBrNCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCwgazUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCwgazYsCisgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBUNywKKyAgICAgICAgICAgICAgICAgICAgY2xhc3MsIFQ4LAorICAgICAgICAgICAgICAgICAgICBjbGFzcywgVDksCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcywgVDEwKSwKKyAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVModmFsdWUpKSB7CisgIHJldHVybiBHaWFudFRlbXBsYXRlPFQxMDxUMT4sIFQyLCBUMywgazQsIGs1LCBrNiwgVDcsIFQ4LCBUOT4odmFsdWUpOworfQorCitURVNUKEFjdGlvblRlbXBsYXRlVGVzdCwgV29ya3NGb3IxMFRlbXBsYXRlUGFyYW1ldGVycykgeworICB1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyOworICB0eXBlZGVmIEdpYW50VGVtcGxhdGU8bGlua2VkX3B0cjxpbnQ+LCBib29sLCBkb3VibGUsIDUsCisgICAgICB0cnVlLCA2LCBjaGFyLCB1bnNpZ25lZCwgaW50PiBHaWFudDsKKyAgY29uc3QgQWN0aW9uPEdpYW50KCk+IGEgPSBSZXR1cm5HaWFudDwKKyAgICAgIGludCwgYm9vbCwgZG91YmxlLCA1LCB0cnVlLCA2LCBjaGFyLCB1bnNpZ25lZCwgaW50LCBsaW5rZWRfcHRyPig0Mik7CisgIEdpYW50IGdpYW50ID0gYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSg0MiwgZ2lhbnQudmFsdWUpOworfQorCisvLyBUZXN0cyB0aGF0IEFDVElPTl9URU1QTEFURSB3b3JrcyBmb3IgMTAgdmFsdWUgcGFyYW1ldGVycy4KK0FDVElPTl9URU1QTEFURShSZXR1cm5TdW0sCisgICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBOdW1iZXIpLAorICAgICAgICAgICAgICAgIEFORF8xMF9WQUxVRV9QQVJBTVModjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwKSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8TnVtYmVyPih2MSkgKyB2MiArIHYzICsgdjQgKyB2NSArIHY2ICsgdjcgKyB2OCArIHY5ICsgdjEwOworfQorCitURVNUKEFjdGlvblRlbXBsYXRlVGVzdCwgV29ya3NGb3IxMFZhbHVlUGFyYW1ldGVycykgeworICBjb25zdCBBY3Rpb248aW50KCk+IGEgPSBSZXR1cm5TdW08aW50PigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCk7CisgIEVYUEVDVF9FUSg1NSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworfQorCisvLyBUZXN0cyB0aGF0IEFDVElPTl9URU1QTEFURSBhbmQgQUNUSU9OL0FDVElPTl9QKiBjYW4gYmUgb3ZlcmxvYWRlZAorLy8gb24gdGhlIG51bWJlciBvZiB2YWx1ZSBwYXJhbWV0ZXJzLgorCitBQ1RJT04oUmV0dXJuU3VtKSB7IHJldHVybiAwOyB9CisKK0FDVElPTl9QKFJldHVyblN1bSwgeCkgeyByZXR1cm4geDsgfQorCitBQ1RJT05fVEVNUExBVEUoUmV0dXJuU3VtLAorICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgTnVtYmVyKSwKKyAgICAgICAgICAgICAgICBBTkRfMl9WQUxVRV9QQVJBTVModjEsIHYyKSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8TnVtYmVyPih2MSkgKyB2MjsKK30KKworQUNUSU9OX1RFTVBMQVRFKFJldHVyblN1bSwKKyAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIE51bWJlciksCisgICAgICAgICAgICAgICAgQU5EXzNfVkFMVUVfUEFSQU1TKHYxLCB2MiwgdjMpKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxOdW1iZXI+KHYxKSArIHYyICsgdjM7Cit9CisKK0FDVElPTl9URU1QTEFURShSZXR1cm5TdW0sCisgICAgICAgICAgICAgICAgSEFTXzJfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBOdW1iZXIsIGludCwgayksCisgICAgICAgICAgICAgICAgQU5EXzRfVkFMVUVfUEFSQU1TKHYxLCB2MiwgdjMsIHY0KSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8TnVtYmVyPih2MSkgKyB2MiArIHYzICsgdjQgKyBrOworfQorCitURVNUKEFjdGlvblRlbXBsYXRlVGVzdCwgQ2FuQmVPdmVybG9hZGVkT25OdW1iZXJPZlZhbHVlUGFyYW1ldGVycykgeworICBjb25zdCBBY3Rpb248aW50KCk+IGEwID0gUmV0dXJuU3VtKCk7CisgIGNvbnN0IEFjdGlvbjxpbnQoKT4gYTEgPSBSZXR1cm5TdW0oMSk7CisgIGNvbnN0IEFjdGlvbjxpbnQoKT4gYTIgPSBSZXR1cm5TdW08aW50PigxLCAyKTsKKyAgY29uc3QgQWN0aW9uPGludCgpPiBhMyA9IFJldHVyblN1bTxpbnQ+KDEsIDIsIDMpOworICBjb25zdCBBY3Rpb248aW50KCk+IGE0ID0gUmV0dXJuU3VtPGludCwgMTAwMDA+KDIwMDAsIDMwMCwgNDAsIDUpOworICBFWFBFQ1RfRVEoMCwgYTAuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKyAgRVhQRUNUX0VRKDEsIGExLlBlcmZvcm0obWFrZV90dXBsZSgpKSk7CisgIEVYUEVDVF9FUSgzLCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworICBFWFBFQ1RfRVEoNiwgYTMuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKyAgRVhQRUNUX0VRKDEyMzQ1LCBhNC5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBnbW9ja19nZW5lcmF0ZWRfYWN0aW9uc190ZXN0Cit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnNfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2YTYxMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzX3Rlc3QuY2MKQEAgLTAsMCArMSw2MjIgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGZ1bmN0aW9uIG1vY2tlciBjbGFzc2VzLgorCisjaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaCIKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKy8vIE1TRE4gc2F5cyB0aGUgaGVhZGVyIGZpbGUgdG8gYmUgaW5jbHVkZWQgZm9yIFNURE1FVEhPRCBpcyBCYXNlVHlwcy5oIGJ1dAorLy8gd2UgYXJlIGdldHRpbmcgY29tcGlsZXIgZXJyb3JzIGlmIHdlIHVzZSBiYXNldHlwcy5oLCBoZW5jZSBpbmNsdWRpbmcKKy8vIG9iamJhc2UuaCBmb3IgZGVmaW5pdGlvbiBvZiBTVERNRVRIT0QuCisjIGluY2x1ZGUgPG9iamJhc2UuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFRoZXJlIGlzIGEgYnVnIGluIE1TVkMgKGZpeGVkIGluIFZTIDIwMDgpIHRoYXQgcHJldmVudHMgY3JlYXRpbmcgYQorLy8gbW9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGNvbnN0IGFyZ3VtZW50cywgc28gd2UgZG9uJ3QgdGVzdCBzdWNoCisvLyBjYXNlcyBmb3IgTVNWQyB2ZXJzaW9ucyBvbGRlciB0aGFuIDIwMDguCisjaWYgIUdURVNUX09TX1dJTkRPV1MgfHwgKF9NU0NfVkVSID49IDE1MDApCisjIGRlZmluZSBHTU9DS19BTExPV1NfQ09OU1RfUEFSQU1fRlVOQ1RJT05TCisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTIHx8IChfTVNDX1ZFUiA+PSAxNTAwKQorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgZ21vY2tfZ2VuZXJhdGVkX2Z1bmN0aW9uX21vY2tlcnNfdGVzdCB7CisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjpfOwordXNpbmcgdGVzdGluZzo6QTsKK3VzaW5nIHRlc3Rpbmc6OkFuOwordXNpbmcgdGVzdGluZzo6QW55TnVtYmVyOwordXNpbmcgdGVzdGluZzo6Q29uc3Q7Cit1c2luZyB0ZXN0aW5nOjpEb0RlZmF1bHQ7Cit1c2luZyB0ZXN0aW5nOjpFcTsKK3VzaW5nIHRlc3Rpbmc6Okx0OwordXNpbmcgdGVzdGluZzo6TW9ja0Z1bmN0aW9uOwordXNpbmcgdGVzdGluZzo6UmVmOwordXNpbmcgdGVzdGluZzo6UmV0dXJuOwordXNpbmcgdGVzdGluZzo6UmV0dXJuUmVmOwordXNpbmcgdGVzdGluZzo6VHlwZWRFcTsKKworY2xhc3MgRm9vSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkZvb0ludGVyZmFjZSgpIHt9CisKKyAgdmlydHVhbCB2b2lkIFZvaWRSZXR1cm5pbmcoaW50IHgpID0gMDsKKworICB2aXJ0dWFsIGludCBOdWxsYXJ5KCkgPSAwOworICB2aXJ0dWFsIGJvb2wgVW5hcnkoaW50IHgpID0gMDsKKyAgdmlydHVhbCBsb25nIEJpbmFyeShzaG9ydCB4LCBpbnQgeSkgPSAwOyAgLy8gTk9MSU5UCisgIHZpcnR1YWwgaW50IERlY2ltYWwoYm9vbCBiLCBjaGFyIGMsIHNob3J0IGQsIGludCBlLCBsb25nIGYsICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBnLCBkb3VibGUgaCwgdW5zaWduZWQgaSwgY2hhciogaiwgY29uc3Qgc3RyaW5nJiBrKQorICAgICAgPSAwOworCisgIHZpcnR1YWwgYm9vbCBUYWtlc05vbkNvbnN0UmVmZXJlbmNlKGludCYgbikgPSAwOyAgLy8gTk9MSU5UCisgIHZpcnR1YWwgc3RyaW5nIFRha2VzQ29uc3RSZWZlcmVuY2UoY29uc3QgaW50JiBuKSA9IDA7CisjaWZkZWYgR01PQ0tfQUxMT1dTX0NPTlNUX1BBUkFNX0ZVTkNUSU9OUworICB2aXJ0dWFsIGJvb2wgVGFrZXNDb25zdChjb25zdCBpbnQgeCkgPSAwOworI2VuZGlmICAvLyBHTU9DS19BTExPV1NfQ09OU1RfUEFSQU1fRlVOQ1RJT05TCisKKyAgdmlydHVhbCBpbnQgT3ZlcmxvYWRlZE9uQXJndW1lbnROdW1iZXIoKSA9IDA7CisgIHZpcnR1YWwgaW50IE92ZXJsb2FkZWRPbkFyZ3VtZW50TnVtYmVyKGludCBuKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgT3ZlcmxvYWRlZE9uQXJndW1lbnRUeXBlKGludCBuKSA9IDA7CisgIHZpcnR1YWwgY2hhciBPdmVybG9hZGVkT25Bcmd1bWVudFR5cGUoY2hhciBjKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgT3ZlcmxvYWRlZE9uQ29uc3RuZXNzKCkgPSAwOworICB2aXJ0dWFsIGNoYXIgT3ZlcmxvYWRlZE9uQ29uc3RuZXNzKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgaW50IFR5cGVXaXRoSG9sZShpbnQgKCpmdW5jKSgpKSA9IDA7CisgIHZpcnR1YWwgaW50IFR5cGVXaXRoQ29tbWEoY29uc3Qgc3RkOjptYXA8aW50LCBzdHJpbmc+JiBhX21hcCkgPSAwOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICBTVERNRVRIT0RfKGludCwgQ1ROdWxsYXJ5KSgpID0gMDsKKyAgU1RETUVUSE9EXyhib29sLCBDVFVuYXJ5KShpbnQgeCkgPSAwOworICBTVERNRVRIT0RfKGludCwgQ1REZWNpbWFsKShib29sIGIsIGNoYXIgYywgc2hvcnQgZCwgaW50IGUsIGxvbmcgZiwgIC8vIE5PTElOVAorICAgICAgZmxvYXQgZywgZG91YmxlIGgsIHVuc2lnbmVkIGksIGNoYXIqIGosIGNvbnN0IHN0cmluZyYgaykgPSAwOworICBTVERNRVRIT0RfKGNoYXIsIENUQ29uc3QpKGludCB4KSBjb25zdCA9IDA7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK307CisKKy8vIENvbnN0IHF1YWxpZmllcnMgb24gYXJndW1lbnRzIHdlcmUgb25jZSAoaW5jb3JyZWN0bHkpIGNvbnNpZGVyZWQKKy8vIHNpZ25pZmljYW50IGluIGRldGVybWluaW5nIHdoZXRoZXIgdHdvIHZpcnR1YWwgZnVuY3Rpb25zIGhhZCB0aGUgc2FtZQorLy8gc2lnbmF0dXJlLiBUaGlzIHdhcyBmaXhlZCBpbiBWaXN1YWwgU3R1ZGlvIDIwMDguIEhvd2V2ZXIsIHRoZSBjb21waWxlcgorLy8gc3RpbGwgZW1pdHMgYSB3YXJuaW5nIHRoYXQgYWxlcnRzIGFib3V0IHRoaXMgY2hhbmdlIGluIGJlaGF2aW9yLgorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MzczKQorI2VuZGlmCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvb0ludGVyZmFjZSB7CisgcHVibGljOgorICBNb2NrRm9vKCkge30KKworICAvLyBNYWtlcyBzdXJlIHRoYXQgYSBtb2NrIGZ1bmN0aW9uIHBhcmFtZXRlciBjYW4gYmUgbmFtZWQuCisgIE1PQ0tfTUVUSE9EMShWb2lkUmV0dXJuaW5nLCB2b2lkKGludCBuKSk7ICAvLyBOT0xJTlQKKworICBNT0NLX01FVEhPRDAoTnVsbGFyeSwgaW50KCkpOyAgLy8gTk9MSU5UCisKKyAgLy8gTWFrZXMgc3VyZSB0aGF0IGEgbW9jayBmdW5jdGlvbiBwYXJhbWV0ZXIgY2FuIGJlIHVubmFtZWQuCisgIE1PQ0tfTUVUSE9EMShVbmFyeSwgYm9vbChpbnQpKTsgIC8vIE5PTElOVAorICBNT0NLX01FVEhPRDIoQmluYXJ5LCBsb25nKHNob3J0LCBpbnQpKTsgIC8vIE5PTElOVAorICBNT0NLX01FVEhPRDEwKERlY2ltYWwsIGludChib29sLCBjaGFyLCBzaG9ydCwgaW50LCBsb25nLCBmbG9hdCwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIHVuc2lnbmVkLCBjaGFyKiwgY29uc3Qgc3RyaW5nJiBzdHIpKTsKKworICBNT0NLX01FVEhPRDEoVGFrZXNOb25Db25zdFJlZmVyZW5jZSwgYm9vbChpbnQmKSk7ICAvLyBOT0xJTlQKKyAgTU9DS19NRVRIT0QxKFRha2VzQ29uc3RSZWZlcmVuY2UsIHN0cmluZyhjb25zdCBpbnQmKSk7CisKKyNpZmRlZiBHTU9DS19BTExPV1NfQ09OU1RfUEFSQU1fRlVOQ1RJT05TCisgIE1PQ0tfTUVUSE9EMShUYWtlc0NvbnN0LCBib29sKGNvbnN0IGludCkpOyAgLy8gTk9MSU5UCisjZW5kaWYKKworICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZSBjYW4gY29udGFpbiB1bnByb3RlY3RlZCBjb21tYS4KKyAgTU9DS19NRVRIT0QwKFJldHVyblR5cGVXaXRoQ29tbWEsIHN0ZDo6bWFwPGludCwgc3RyaW5nPigpKTsKKyAgTU9DS19DT05TVF9NRVRIT0QxKFJldHVyblR5cGVXaXRoQ29tbWEsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxpbnQsIHN0cmluZz4oaW50KSk7ICAvLyBOT0xJTlQKKworICBNT0NLX01FVEhPRDAoT3ZlcmxvYWRlZE9uQXJndW1lbnROdW1iZXIsIGludCgpKTsgIC8vIE5PTElOVAorICBNT0NLX01FVEhPRDEoT3ZlcmxvYWRlZE9uQXJndW1lbnROdW1iZXIsIGludChpbnQpKTsgIC8vIE5PTElOVAorCisgIE1PQ0tfTUVUSE9EMShPdmVybG9hZGVkT25Bcmd1bWVudFR5cGUsIGludChpbnQpKTsgIC8vIE5PTElOVAorICBNT0NLX01FVEhPRDEoT3ZlcmxvYWRlZE9uQXJndW1lbnRUeXBlLCBjaGFyKGNoYXIpKTsgIC8vIE5PTElOVAorCisgIE1PQ0tfTUVUSE9EMChPdmVybG9hZGVkT25Db25zdG5lc3MsIGludCgpKTsgIC8vIE5PTElOVAorICBNT0NLX0NPTlNUX01FVEhPRDAoT3ZlcmxvYWRlZE9uQ29uc3RuZXNzLCBjaGFyKCkpOyAgLy8gTk9MSU5UCisKKyAgTU9DS19NRVRIT0QxKFR5cGVXaXRoSG9sZSwgaW50KGludCAoKikoKSkpOyAgLy8gTk9MSU5UCisgIE1PQ0tfTUVUSE9EMShUeXBlV2l0aENvbW1hLCBpbnQoY29uc3Qgc3RkOjptYXA8aW50LCBzdHJpbmc+JikpOyAgLy8gTk9MSU5UCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIE1PQ0tfTUVUSE9EMF9XSVRIX0NBTExUWVBFKFNURE1FVEhPRENBTExUWVBFLCBDVE51bGxhcnksIGludCgpKTsKKyAgTU9DS19NRVRIT0QxX1dJVEhfQ0FMTFRZUEUoU1RETUVUSE9EQ0FMTFRZUEUsIENUVW5hcnksIGJvb2woaW50KSk7CisgIE1PQ0tfTUVUSE9EMTBfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgQ1REZWNpbWFsLCBpbnQoYm9vbCBiLCBjaGFyIGMsCisgICAgICBzaG9ydCBkLCBpbnQgZSwgbG9uZyBmLCBmbG9hdCBnLCBkb3VibGUgaCwgdW5zaWduZWQgaSwgY2hhciogaiwKKyAgICAgIGNvbnN0IHN0cmluZyYgaykpOworICBNT0NLX0NPTlNUX01FVEhPRDFfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgQ1RDb25zdCwgY2hhcihpbnQpKTsKKworICAvLyBUZXN0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZSBjYW4gY29udGFpbiB1bnByb3RlY3RlZCBjb21tYS4KKyAgTU9DS19NRVRIT0QwX1dJVEhfQ0FMTFRZUEUoU1RETUVUSE9EQ0FMTFRZUEUsIENUUmV0dXJuVHlwZVdpdGhDb21tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8aW50LCBzdHJpbmc+KCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGb28pOworfTsKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworY2xhc3MgRnVuY3Rpb25Nb2NrZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgRnVuY3Rpb25Nb2NrZXJUZXN0KCkgOiBmb29fKCZtb2NrX2Zvb18pIHt9CisKKyAgRm9vSW50ZXJmYWNlKiBjb25zdCBmb29fOworICBNb2NrRm9vIG1vY2tfZm9vXzsKK307CisKKy8vIFRlc3RzIG1vY2tpbmcgYSB2b2lkLXJldHVybmluZyBmdW5jdGlvbi4KK1RFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzVm9pZEZ1bmN0aW9uKSB7CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgVm9pZFJldHVybmluZyhMdCgxMDApKSk7CisgIGZvb18tPlZvaWRSZXR1cm5pbmcoMCk7Cit9CisKKy8vIFRlc3RzIG1vY2tpbmcgYSBudWxsYXJ5IGZ1bmN0aW9uLgorVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NOdWxsYXJ5RnVuY3Rpb24pIHsKKyAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBOdWxsYXJ5KCkpCisgICAgICAuV2lsbE9uY2UoRG9EZWZhdWx0KCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKKworICBFWFBFQ1RfRVEoMCwgZm9vXy0+TnVsbGFyeSgpKTsKKyAgRVhQRUNUX0VRKDEsIGZvb18tPk51bGxhcnkoKSk7Cit9CisKKy8vIFRlc3RzIG1vY2tpbmcgYSB1bmFyeSBmdW5jdGlvbi4KK1RFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzVW5hcnlGdW5jdGlvbikgeworICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIFVuYXJ5KEVxKDIpKSkKKyAgICAgIC5UaW1lcygyKQorICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7CisKKyAgRVhQRUNUX1RSVUUoZm9vXy0+VW5hcnkoMikpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+VW5hcnkoMikpOworfQorCisvLyBUZXN0cyBtb2NraW5nIGEgYmluYXJ5IGZ1bmN0aW9uLgorVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NCaW5hcnlGdW5jdGlvbikgeworICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIEJpbmFyeSgyLCBfKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMykpOworCisgIEVYUEVDVF9FUSgzLCBmb29fLT5CaW5hcnkoMiwgMSkpOworfQorCisvLyBUZXN0cyBtb2NraW5nIGEgZGVjaW1hbCBmdW5jdGlvbi4KK1RFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzRGVjaW1hbEZ1bmN0aW9uKSB7CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgRGVjaW1hbCh0cnVlLCAnYScsIDAsIDAsIDFMLCBBPGZsb2F0PigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHQoMTAwKSwgNVUsIE5VTEwsICJoaSIpKQorICAgICAgLldpbGxPbmNlKFJldHVybig1KSk7CisKKyAgRVhQRUNUX0VRKDUsIGZvb18tPkRlY2ltYWwodHJ1ZSwgJ2EnLCAwLCAwLCAxLCAwLCAwLCA1LCBOVUxMLCAiaGkiKSk7Cit9CisKKy8vIFRlc3RzIG1vY2tpbmcgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgbm9uLWNvbnN0IHJlZmVyZW5jZS4KK1RFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzRnVuY3Rpb25XaXRoTm9uQ29uc3RSZWZlcmVuY2VBcmd1bWVudCkgeworICBpbnQgYSA9IDA7CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgVGFrZXNOb25Db25zdFJlZmVyZW5jZShSZWYoYSkpKQorICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7CisKKyAgRVhQRUNUX1RSVUUoZm9vXy0+VGFrZXNOb25Db25zdFJlZmVyZW5jZShhKSk7Cit9CisKKy8vIFRlc3RzIG1vY2tpbmcgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgY29uc3QgcmVmZXJlbmNlLgorVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NGdW5jdGlvbldpdGhDb25zdFJlZmVyZW5jZUFyZ3VtZW50KSB7CisgIGludCBhID0gMDsKKyAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBUYWtlc0NvbnN0UmVmZXJlbmNlKFJlZihhKSkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCJIZWxsbyIpKTsKKworICBFWFBFQ1RfRVEoIkhlbGxvIiwgZm9vXy0+VGFrZXNDb25zdFJlZmVyZW5jZShhKSk7Cit9CisKKyNpZmRlZiBHTU9DS19BTExPV1NfQ09OU1RfUEFSQU1fRlVOQ1RJT05TCisvLyBUZXN0cyBtb2NraW5nIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGNvbnN0IHZhcmlhYmxlLgorVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NGdW5jdGlvbldpdGhDb25zdEFyZ3VtZW50KSB7CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgVGFrZXNDb25zdChMdCgxMCkpKQorICAgICAgLldpbGxPbmNlKERvRGVmYXVsdCgpKTsKKworICBFWFBFQ1RfRkFMU0UoZm9vXy0+VGFrZXNDb25zdCg1KSk7Cit9CisjZW5kaWYgIC8vIEdNT0NLX0FMTE9XU19DT05TVF9QQVJBTV9GVU5DVElPTlMKKworLy8gVGVzdHMgbW9ja2luZyBmdW5jdGlvbnMgb3ZlcmxvYWRlZCBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KK1RFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzRnVuY3Rpb25zT3ZlcmxvYWRlZE9uQXJndW1lbnROdW1iZXIpIHsKKyAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBPdmVybG9hZGVkT25Bcmd1bWVudE51bWJlcigpKQorICAgICAgLldpbGxPbmNlKFJldHVybigxKSk7CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgT3ZlcmxvYWRlZE9uQXJndW1lbnROdW1iZXIoXykpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKKworICBFWFBFQ1RfRVEoMiwgZm9vXy0+T3ZlcmxvYWRlZE9uQXJndW1lbnROdW1iZXIoMSkpOworICBFWFBFQ1RfRVEoMSwgZm9vXy0+T3ZlcmxvYWRlZE9uQXJndW1lbnROdW1iZXIoKSk7Cit9CisKKy8vIFRlc3RzIG1vY2tpbmcgZnVuY3Rpb25zIG92ZXJsb2FkZWQgb24gdGhlIHR5cGVzIG9mIGFyZ3VtZW50LgorVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NGdW5jdGlvbnNPdmVybG9hZGVkT25Bcmd1bWVudFR5cGUpIHsKKyAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBPdmVybG9hZGVkT25Bcmd1bWVudFR5cGUoQW48aW50PigpKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOworICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIE92ZXJsb2FkZWRPbkFyZ3VtZW50VHlwZShUeXBlZEVxPGNoYXI+KCdhJykpKQorICAgICAgLldpbGxPbmNlKFJldHVybignYicpKTsKKworICBFWFBFQ1RfRVEoMSwgZm9vXy0+T3ZlcmxvYWRlZE9uQXJndW1lbnRUeXBlKDApKTsKKyAgRVhQRUNUX0VRKCdiJywgZm9vXy0+T3ZlcmxvYWRlZE9uQXJndW1lbnRUeXBlKCdhJykpOworfQorCisvLyBUZXN0cyBtb2NraW5nIGZ1bmN0aW9ucyBvdmVybG9hZGVkIG9uIHRoZSBjb25zdC1uZXNzIG9mIHRoaXMgb2JqZWN0LgorVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NGdW5jdGlvbnNPdmVybG9hZGVkT25Db25zdG5lc3NPZlRoaXMpIHsKKyAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBPdmVybG9hZGVkT25Db25zdG5lc3MoKSk7CisgIEVYUEVDVF9DQUxMKENvbnN0KG1vY2tfZm9vXyksIE92ZXJsb2FkZWRPbkNvbnN0bmVzcygpKQorICAgICAgLldpbGxPbmNlKFJldHVybignYScpKTsKKworICBFWFBFQ1RfRVEoMCwgZm9vXy0+T3ZlcmxvYWRlZE9uQ29uc3RuZXNzKCkpOworICBFWFBFQ1RfRVEoJ2EnLCBDb25zdCgqZm9vXykuT3ZlcmxvYWRlZE9uQ29uc3RuZXNzKCkpOworfQorCitURVNUX0YoRnVuY3Rpb25Nb2NrZXJUZXN0LCBNb2Nrc1JldHVyblR5cGVXaXRoQ29tbWEpIHsKKyAgY29uc3Qgc3RkOjptYXA8aW50LCBzdHJpbmc+IGFfbWFwOworICBFWFBFQ1RfQ0FMTChtb2NrX2Zvb18sIFJldHVyblR5cGVXaXRoQ29tbWEoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oYV9tYXApKTsKKyAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBSZXR1cm5UeXBlV2l0aENvbW1hKDQyKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oYV9tYXApKTsKKworICBFWFBFQ1RfRVEoYV9tYXAsIG1vY2tfZm9vXy5SZXR1cm5UeXBlV2l0aENvbW1hKCkpOworICBFWFBFQ1RfRVEoYV9tYXAsIG1vY2tfZm9vXy5SZXR1cm5UeXBlV2l0aENvbW1hKDQyKSk7Cit9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBUZXN0cyBtb2NraW5nIGEgbnVsbGFyeSBmdW5jdGlvbiB3aXRoIGNhbGx0eXBlLgorVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NOdWxsYXJ5RnVuY3Rpb25XaXRoQ2FsbFR5cGUpIHsKKyAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBDVE51bGxhcnkoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oLTEpKQorICAgICAgLldpbGxPbmNlKFJldHVybigwKSk7CisKKyAgRVhQRUNUX0VRKC0xLCBmb29fLT5DVE51bGxhcnkoKSk7CisgIEVYUEVDVF9FUSgwLCBmb29fLT5DVE51bGxhcnkoKSk7Cit9CisKKy8vIFRlc3RzIG1vY2tpbmcgYSB1bmFyeSBmdW5jdGlvbiB3aXRoIGNhbGx0eXBlLgorVEVTVF9GKEZ1bmN0aW9uTW9ja2VyVGVzdCwgTW9ja3NVbmFyeUZ1bmN0aW9uV2l0aENhbGxUeXBlKSB7CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgQ1RVbmFyeShFcSgyKSkpCisgICAgICAuVGltZXMoMikKKyAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7CisKKyAgRVhQRUNUX1RSVUUoZm9vXy0+Q1RVbmFyeSgyKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5DVFVuYXJ5KDIpKTsKK30KKworLy8gVGVzdHMgbW9ja2luZyBhIGRlY2ltYWwgZnVuY3Rpb24gd2l0aCBjYWxsdHlwZS4KK1RFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzRGVjaW1hbEZ1bmN0aW9uV2l0aENhbGxUeXBlKSB7CisgIEVYUEVDVF9DQUxMKG1vY2tfZm9vXywgQ1REZWNpbWFsKHRydWUsICdhJywgMCwgMCwgMUwsIEE8ZmxvYXQ+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEx0KDEwMCksIDVVLCBOVUxMLCAiaGkiKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMTApKTsKKworICBFWFBFQ1RfRVEoMTAsIGZvb18tPkNURGVjaW1hbCh0cnVlLCAnYScsIDAsIDAsIDEsIDAsIDAsIDUsIE5VTEwsICJoaSIpKTsKK30KKworLy8gVGVzdHMgbW9ja2luZyBmdW5jdGlvbnMgb3ZlcmxvYWRlZCBvbiB0aGUgY29uc3QtbmVzcyBvZiB0aGlzIG9iamVjdC4KK1RFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzRnVuY3Rpb25zQ29uc3RGdW5jdGlvbldpdGhDYWxsVHlwZSkgeworICBFWFBFQ1RfQ0FMTChDb25zdChtb2NrX2Zvb18pLCBDVENvbnN0KF8pKQorICAgICAgLldpbGxPbmNlKFJldHVybignYScpKTsKKworICBFWFBFQ1RfRVEoJ2EnLCBDb25zdCgqZm9vXykuQ1RDb25zdCgwKSk7Cit9CisKK1RFU1RfRihGdW5jdGlvbk1vY2tlclRlc3QsIE1vY2tzUmV0dXJuVHlwZVdpdGhDb21tYUFuZENhbGxUeXBlKSB7CisgIGNvbnN0IHN0ZDo6bWFwPGludCwgc3RyaW5nPiBhX21hcDsKKyAgRVhQRUNUX0NBTEwobW9ja19mb29fLCBDVFJldHVyblR5cGVXaXRoQ29tbWEoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oYV9tYXApKTsKKworICBFWFBFQ1RfRVEoYV9tYXAsIG1vY2tfZm9vXy5DVFJldHVyblR5cGVXaXRoQ29tbWEoKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCitjbGFzcyBNb2NrQiB7CisgcHVibGljOgorICBNb2NrQigpIHt9CisKKyAgTU9DS19NRVRIT0QwKERvQiwgdm9pZCgpKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0IpOworfTsKKworLy8gVGVzdHMgdGhhdCBmdW5jdGlvbnMgd2l0aCBubyBFWFBFQ1RfQ0FMTCgpIHJ1bHMgY2FuIGJlIGNhbGxlZCBhbnkKKy8vIG51bWJlciBvZiB0aW1lcy4KK1RFU1QoRXhwZWN0Q2FsbFRlc3QsIFVubWVudGlvbmVkRnVuY3Rpb25DYW5CZUNhbGxlZEFueU51bWJlck9mVGltZXMpIHsKKyAgeworICAgIE1vY2tCIGI7CisgIH0KKworICB7CisgICAgTW9ja0IgYjsKKyAgICBiLkRvQigpOworICB9CisKKyAgeworICAgIE1vY2tCIGI7CisgICAgYi5Eb0IoKTsKKyAgICBiLkRvQigpOworICB9Cit9CisKKy8vIFRlc3RzIG1vY2tpbmcgdGVtcGxhdGUgaW50ZXJmYWNlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTdGFja0ludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5TdGFja0ludGVyZmFjZSgpIHt9CisKKyAgLy8gVGVtcGxhdGUgcGFyYW1ldGVyIGFwcGVhcnMgaW4gZnVuY3Rpb24gcGFyYW1ldGVyLgorICB2aXJ0dWFsIHZvaWQgUHVzaChjb25zdCBUJiB2YWx1ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgUG9wKCkgPSAwOworICB2aXJ0dWFsIGludCBHZXRTaXplKCkgY29uc3QgPSAwOworICAvLyBUZW1wbGF0ZSBwYXJhbWV0ZXIgYXBwZWFycyBpbiBmdW5jdGlvbiByZXR1cm4gdHlwZS4KKyAgdmlydHVhbCBjb25zdCBUJiBHZXRUb3AoKSBjb25zdCA9IDA7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIE1vY2tTdGFjayA6IHB1YmxpYyBTdGFja0ludGVyZmFjZTxUPiB7CisgcHVibGljOgorICBNb2NrU3RhY2soKSB7fQorCisgIE1PQ0tfTUVUSE9EMV9UKFB1c2gsIHZvaWQoY29uc3QgVCYgZWxlbSkpOworICBNT0NLX01FVEhPRDBfVChQb3AsIHZvaWQoKSk7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMF9UKEdldFNpemUsIGludCgpKTsgIC8vIE5PTElOVAorICBNT0NLX0NPTlNUX01FVEhPRDBfVChHZXRUb3AsIGNvbnN0IFQmKCkpOworCisgIC8vIFRlc3RzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIGNhbiBjb250YWluIHVucHJvdGVjdGVkIGNvbW1hLgorICBNT0NLX01FVEhPRDBfVChSZXR1cm5UeXBlV2l0aENvbW1hLCBzdGQ6Om1hcDxpbnQsIGludD4oKSk7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMV9UKFJldHVyblR5cGVXaXRoQ29tbWEsIHN0ZDo6bWFwPGludCwgaW50PihpbnQpKTsgIC8vIE5PTElOVAorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrU3RhY2spOworfTsKKworLy8gVGVzdHMgdGhhdCB0ZW1wbGF0ZSBtb2NrIHdvcmtzLgorVEVTVChUZW1wbGF0ZU1vY2tUZXN0LCBXb3JrcykgeworICBNb2NrU3RhY2s8aW50PiBtb2NrOworCisgIEVYUEVDVF9DQUxMKG1vY2ssIEdldFNpemUoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgICAgLldpbGxPbmNlKFJldHVybigwKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIFB1c2goXykpOworICBpbnQgbiA9IDU7CisgIEVYUEVDVF9DQUxMKG1vY2ssIEdldFRvcCgpKQorICAgICAgLldpbGxPbmNlKFJldHVyblJlZihuKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIFBvcCgpKQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKKworICBFWFBFQ1RfRVEoMCwgbW9jay5HZXRTaXplKCkpOworICBtb2NrLlB1c2goNSk7CisgIEVYUEVDVF9FUSgxLCBtb2NrLkdldFNpemUoKSk7CisgIEVYUEVDVF9FUSg1LCBtb2NrLkdldFRvcCgpKTsKKyAgbW9jay5Qb3AoKTsKKyAgRVhQRUNUX0VRKDAsIG1vY2suR2V0U2l6ZSgpKTsKK30KKworVEVTVChUZW1wbGF0ZU1vY2tUZXN0LCBNZXRob2RXaXRoQ29tbWFJblJldHVyblR5cGVXb3JrcykgeworICBNb2NrU3RhY2s8aW50PiBtb2NrOworCisgIGNvbnN0IHN0ZDo6bWFwPGludCwgaW50PiBhX21hcDsKKyAgRVhQRUNUX0NBTEwobW9jaywgUmV0dXJuVHlwZVdpdGhDb21tYSgpKQorICAgICAgLldpbGxPbmNlKFJldHVybihhX21hcCkpOworICBFWFBFQ1RfQ0FMTChtb2NrLCBSZXR1cm5UeXBlV2l0aENvbW1hKDEpKQorICAgICAgLldpbGxPbmNlKFJldHVybihhX21hcCkpOworCisgIEVYUEVDVF9FUShhX21hcCwgbW9jay5SZXR1cm5UeXBlV2l0aENvbW1hKCkpOworICBFWFBFQ1RfRVEoYV9tYXAsIG1vY2suUmV0dXJuVHlwZVdpdGhDb21tYSgxKSk7Cit9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBUZXN0cyBtb2NraW5nIHRlbXBsYXRlIGludGVyZmFjZXMgd2l0aCBjYWxsdHlwZS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTdGFja0ludGVyZmFjZVdpdGhDYWxsVHlwZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5TdGFja0ludGVyZmFjZVdpdGhDYWxsVHlwZSgpIHt9CisKKyAgLy8gVGVtcGxhdGUgcGFyYW1ldGVyIGFwcGVhcnMgaW4gZnVuY3Rpb24gcGFyYW1ldGVyLgorICBTVERNRVRIT0RfKHZvaWQsIFB1c2gpKGNvbnN0IFQmIHZhbHVlKSA9IDA7CisgIFNURE1FVEhPRF8odm9pZCwgUG9wKSgpID0gMDsKKyAgU1RETUVUSE9EXyhpbnQsIEdldFNpemUpKCkgY29uc3QgPSAwOworICAvLyBUZW1wbGF0ZSBwYXJhbWV0ZXIgYXBwZWFycyBpbiBmdW5jdGlvbiByZXR1cm4gdHlwZS4KKyAgU1RETUVUSE9EXyhjb25zdCBUJiwgR2V0VG9wKSgpIGNvbnN0ID0gMDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTW9ja1N0YWNrV2l0aENhbGxUeXBlIDogcHVibGljIFN0YWNrSW50ZXJmYWNlV2l0aENhbGxUeXBlPFQ+IHsKKyBwdWJsaWM6CisgIE1vY2tTdGFja1dpdGhDYWxsVHlwZSgpIHt9CisKKyAgTU9DS19NRVRIT0QxX1RfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgUHVzaCwgdm9pZChjb25zdCBUJiBlbGVtKSk7CisgIE1PQ0tfTUVUSE9EMF9UX1dJVEhfQ0FMTFRZUEUoU1RETUVUSE9EQ0FMTFRZUEUsIFBvcCwgdm9pZCgpKTsKKyAgTU9DS19DT05TVF9NRVRIT0QwX1RfV0lUSF9DQUxMVFlQRShTVERNRVRIT0RDQUxMVFlQRSwgR2V0U2l6ZSwgaW50KCkpOworICBNT0NLX0NPTlNUX01FVEhPRDBfVF9XSVRIX0NBTExUWVBFKFNURE1FVEhPRENBTExUWVBFLCBHZXRUb3AsIGNvbnN0IFQmKCkpOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrU3RhY2tXaXRoQ2FsbFR5cGUpOworfTsKKworLy8gVGVzdHMgdGhhdCB0ZW1wbGF0ZSBtb2NrIHdpdGggY2FsbHR5cGUgd29ya3MuCitURVNUKFRlbXBsYXRlTW9ja1Rlc3RXaXRoQ2FsbFR5cGUsIFdvcmtzKSB7CisgIE1vY2tTdGFja1dpdGhDYWxsVHlwZTxpbnQ+IG1vY2s7CisKKyAgRVhQRUNUX0NBTEwobW9jaywgR2V0U2l6ZSgpKQorICAgICAgLldpbGxPbmNlKFJldHVybigwKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDApKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgUHVzaChfKSk7CisgIGludCBuID0gNTsKKyAgRVhQRUNUX0NBTEwobW9jaywgR2V0VG9wKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuUmVmKG4pKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgUG9wKCkpCisgICAgICAuVGltZXMoQW55TnVtYmVyKCkpOworCisgIEVYUEVDVF9FUSgwLCBtb2NrLkdldFNpemUoKSk7CisgIG1vY2suUHVzaCg1KTsKKyAgRVhQRUNUX0VRKDEsIG1vY2suR2V0U2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDUsIG1vY2suR2V0VG9wKCkpOworICBtb2NrLlBvcCgpOworICBFWFBFQ1RfRVEoMCwgbW9jay5HZXRTaXplKCkpOworfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyNkZWZpbmUgTVlfTU9DS19NRVRIT0RTMV8gXAorICAgIE1PQ0tfTUVUSE9EMChPdmVybG9hZGVkLCB2b2lkKCkpOyBcCisgICAgTU9DS19DT05TVF9NRVRIT0QxKE92ZXJsb2FkZWQsIGludChpbnQgbikpOyBcCisgICAgTU9DS19NRVRIT0QyKE92ZXJsb2FkZWQsIGJvb2woYm9vbCBmLCBpbnQgbikpCisKK2NsYXNzIE1vY2tPdmVybG9hZGVkT25BcmdOdW1iZXIgeworIHB1YmxpYzoKKyAgTW9ja092ZXJsb2FkZWRPbkFyZ051bWJlcigpIHt9CisKKyAgTVlfTU9DS19NRVRIT0RTMV87CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tPdmVybG9hZGVkT25BcmdOdW1iZXIpOworfTsKKworVEVTVChPdmVybG9hZGVkTW9ja01ldGhvZFRlc3QsIENhbk92ZXJsb2FkT25BcmdOdW1iZXJJbk1hY3JvQm9keSkgeworICBNb2NrT3ZlcmxvYWRlZE9uQXJnTnVtYmVyIG1vY2s7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE92ZXJsb2FkZWQoKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE92ZXJsb2FkZWQoMSkpLldpbGxPbmNlKFJldHVybigyKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE92ZXJsb2FkZWQodHJ1ZSwgMSkpLldpbGxPbmNlKFJldHVybih0cnVlKSk7CisKKyAgbW9jay5PdmVybG9hZGVkKCk7CisgIEVYUEVDVF9FUSgyLCBtb2NrLk92ZXJsb2FkZWQoMSkpOworICBFWFBFQ1RfVFJVRShtb2NrLk92ZXJsb2FkZWQodHJ1ZSwgMSkpOworfQorCisjZGVmaW5lIE1ZX01PQ0tfTUVUSE9EUzJfIFwKKyAgICBNT0NLX0NPTlNUX01FVEhPRDEoT3ZlcmxvYWRlZCwgaW50KGludCBuKSk7IFwKKyAgICBNT0NLX01FVEhPRDEoT3ZlcmxvYWRlZCwgaW50KGludCBuKSk7CisKK2NsYXNzIE1vY2tPdmVybG9hZGVkT25Db25zdG5lc3MgeworIHB1YmxpYzoKKyAgTW9ja092ZXJsb2FkZWRPbkNvbnN0bmVzcygpIHt9CisKKyAgTVlfTU9DS19NRVRIT0RTMl87CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tPdmVybG9hZGVkT25Db25zdG5lc3MpOworfTsKKworVEVTVChPdmVybG9hZGVkTW9ja01ldGhvZFRlc3QsIENhbk92ZXJsb2FkT25Db25zdG5lc3NJbk1hY3JvQm9keSkgeworICBNb2NrT3ZlcmxvYWRlZE9uQ29uc3RuZXNzIG1vY2s7CisgIGNvbnN0IE1vY2tPdmVybG9hZGVkT25Db25zdG5lc3MqIGNvbnN0X21vY2sgPSAmbW9jazsKKyAgRVhQRUNUX0NBTEwobW9jaywgT3ZlcmxvYWRlZCgxKSkuV2lsbE9uY2UoUmV0dXJuKDIpKTsKKyAgRVhQRUNUX0NBTEwoKmNvbnN0X21vY2ssIE92ZXJsb2FkZWQoMSkpLldpbGxPbmNlKFJldHVybigzKSk7CisKKyAgRVhQRUNUX0VRKDIsIG1vY2suT3ZlcmxvYWRlZCgxKSk7CisgIEVYUEVDVF9FUSgzLCBjb25zdF9tb2NrLT5PdmVybG9hZGVkKDEpKTsKK30KKworVEVTVChNb2NrRnVuY3Rpb25UZXN0LCBXb3Jrc0ZvclZvaWROdWxsYXJ5KSB7CisgIE1vY2tGdW5jdGlvbjx2b2lkKCk+IGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBDYWxsKCkpOworICBmb28uQ2FsbCgpOworfQorCitURVNUKE1vY2tGdW5jdGlvblRlc3QsIFdvcmtzRm9yTm9uVm9pZE51bGxhcnkpIHsKKyAgTW9ja0Z1bmN0aW9uPGludCgpPiBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgQ2FsbCgpKQorICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOworICBFWFBFQ1RfRVEoMSwgZm9vLkNhbGwoKSk7CisgIEVYUEVDVF9FUSgyLCBmb28uQ2FsbCgpKTsKK30KKworVEVTVChNb2NrRnVuY3Rpb25UZXN0LCBXb3Jrc0ZvclZvaWRVbmFyeSkgeworICBNb2NrRnVuY3Rpb248dm9pZChpbnQpPiBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgQ2FsbCgxKSk7CisgIGZvby5DYWxsKDEpOworfQorCitURVNUKE1vY2tGdW5jdGlvblRlc3QsIFdvcmtzRm9yTm9uVm9pZEJpbmFyeSkgeworICBNb2NrRnVuY3Rpb248aW50KGJvb2wsIGludCk+IGZvbzsKKyAgRVhQRUNUX0NBTEwoZm9vLCBDYWxsKGZhbHNlLCA0MikpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgQ2FsbCh0cnVlLCBHZSgxMDApKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMykpOworICBFWFBFQ1RfRVEoMSwgZm9vLkNhbGwoZmFsc2UsIDQyKSk7CisgIEVYUEVDVF9FUSgyLCBmb28uQ2FsbChmYWxzZSwgNDIpKTsKKyAgRVhQRUNUX0VRKDMsIGZvby5DYWxsKHRydWUsIDEyMCkpOworfQorCitURVNUKE1vY2tGdW5jdGlvblRlc3QsIFdvcmtzRm9yMTBBcmd1bWVudHMpIHsKKyAgTW9ja0Z1bmN0aW9uPGludChib29sIGEwLCBjaGFyIGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LAorICAgICAgICAgICAgICAgICAgIGludCBhNSwgaW50IGE2LCBjaGFyIGE3LCBpbnQgYTgsIGJvb2wgYTkpPiBmb287CisgIEVYUEVDVF9DQUxMKGZvbywgQ2FsbChfLCAnYScsIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKQorICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOworICBFWFBFQ1RfRVEoMSwgZm9vLkNhbGwoZmFsc2UsICdhJywgMCwgMCwgMCwgMCwgMCwgJ2InLCAwLCB0cnVlKSk7CisgIEVYUEVDVF9FUSgyLCBmb28uQ2FsbCh0cnVlLCAnYScsIDAsIDAsIDAsIDAsIDAsICdiJywgMSwgZmFsc2UpKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCitURVNUKE1vY2tGdW5jdGlvblRlc3QsIEFzU3RkRnVuY3Rpb24pIHsKKyAgTW9ja0Z1bmN0aW9uPGludChpbnQpPiBmb287CisgIGF1dG8gY2FsbCA9IFtdKGNvbnN0IHN0ZDo6ZnVuY3Rpb248aW50KGludCk+ICZmLCBpbnQgaSkgeworICAgIHJldHVybiBmKGkpOworICB9OworICBFWFBFQ1RfQ0FMTChmb28sIENhbGwoMSkpLldpbGxPbmNlKFJldHVybigtMSkpOworICBFWFBFQ1RfQ0FMTChmb28sIENhbGwoMikpLldpbGxPbmNlKFJldHVybigtMikpOworICBFWFBFQ1RfRVEoLTEsIGNhbGwoZm9vLkFzU3RkRnVuY3Rpb24oKSwgMSkpOworICBFWFBFQ1RfRVEoLTIsIGNhbGwoZm9vLkFzU3RkRnVuY3Rpb24oKSwgMikpOworfQorCitURVNUKE1vY2tGdW5jdGlvblRlc3QsIEFzU3RkRnVuY3Rpb25SZXR1cm5zUmVmZXJlbmNlKSB7CisgIE1vY2tGdW5jdGlvbjxpbnQmKCk+IGZvbzsKKyAgaW50IHZhbHVlID0gMTsKKyAgRVhQRUNUX0NBTEwoZm9vLCBDYWxsKCkpLldpbGxPbmNlKFJldHVyblJlZih2YWx1ZSkpOworICBpbnQmIHJlZiA9IGZvby5Bc1N0ZEZ1bmN0aW9uKCkoKTsKKyAgRVhQRUNUX0VRKDEsIHJlZik7CisgIHZhbHVlID0gMjsKKyAgRVhQRUNUX0VRKDIsIHJlZik7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCisKK30gIC8vIG5hbWVzcGFjZSBnbW9ja19nZW5lcmF0ZWRfZnVuY3Rpb25fbW9ja2Vyc190ZXN0Cit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE1MzVhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzX3Rlc3QuY2MKQEAgLTAsMCArMSwxMjcgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGludGVybmFsIHV0aWxpdGllcy4KKworI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oIgorI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjp0ZXN0aW5nOjp0dXBsZTsKK3VzaW5nIDo6dGVzdGluZzo6TWF0Y2hlcjsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWF0Y2hlclR1cGxlOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb247Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpJZ25vcmVkVmFsdWU7CisKKy8vIFRlc3RzIHRoZSBNYXRjaGVyVHVwbGUgdGVtcGxhdGUgc3RydWN0LgorCitURVNUKE1hdGNoZXJUdXBsZVRlc3QsIEZvclNpemUwKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPD4sIE1hdGNoZXJUdXBsZTx0dXBsZTw+ID46OnR5cGU+KCk7Cit9CisKK1RFU1QoTWF0Y2hlclR1cGxlVGVzdCwgRm9yU2l6ZTEpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dHVwbGU8TWF0Y2hlcjxpbnQ+ID4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXJUdXBsZTx0dXBsZTxpbnQ+ID46OnR5cGU+KCk7Cit9CisKK1RFU1QoTWF0Y2hlclR1cGxlVGVzdCwgRm9yU2l6ZTIpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dHVwbGU8TWF0Y2hlcjxpbnQ+LCBNYXRjaGVyPGNoYXI+ID4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXJUdXBsZTx0dXBsZTxpbnQsIGNoYXI+ID46OnR5cGU+KCk7Cit9CisKK1RFU1QoTWF0Y2hlclR1cGxlVGVzdCwgRm9yU2l6ZTUpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dHVwbGU8TWF0Y2hlcjxpbnQ+LCBNYXRjaGVyPGNoYXI+LCBNYXRjaGVyPGJvb2w+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyPGRvdWJsZT4sIE1hdGNoZXI8Y2hhcio+ID4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXJUdXBsZTx0dXBsZTxpbnQsIGNoYXIsIGJvb2wsIGRvdWJsZSwgY2hhcio+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSBzdHJ1Y3QuCisKK1RFU1QoRnVuY3Rpb25UZXN0LCBOdWxsYXJ5KSB7CisgIHR5cGVkZWYgRnVuY3Rpb248aW50KCk+IEY7ICAvLyBOT0xJTlQKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBGOjpSZXN1bHQ+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPD4sIEY6OkFyZ3VtZW50VHVwbGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPD4sIEY6OkFyZ3VtZW50TWF0Y2hlclR1cGxlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkKCksIEY6Ok1ha2VSZXN1bHRWb2lkPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxJZ25vcmVkVmFsdWUoKSwgRjo6TWFrZVJlc3VsdElnbm9yZWRWYWx1ZT4oKTsKK30KKworVEVTVChGdW5jdGlvblRlc3QsIFVuYXJ5KSB7CisgIHR5cGVkZWYgRnVuY3Rpb248aW50KGJvb2wpPiBGOyAgLy8gTk9MSU5UCisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgRjo6UmVzdWx0PigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxib29sLCBGOjpBcmd1bWVudDE+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPGJvb2w+LCBGOjpBcmd1bWVudFR1cGxlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx0dXBsZTxNYXRjaGVyPGJvb2w+ID4sIEY6OkFyZ3VtZW50TWF0Y2hlclR1cGxlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkKGJvb2wpLCBGOjpNYWtlUmVzdWx0Vm9pZD4oKTsgIC8vIE5PTElOVAorICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxJZ25vcmVkVmFsdWUoYm9vbCksICAvLyBOT0xJTlQKKyAgICAgIEY6Ok1ha2VSZXN1bHRJZ25vcmVkVmFsdWU+KCk7Cit9CisKK1RFU1QoRnVuY3Rpb25UZXN0LCBCaW5hcnkpIHsKKyAgdHlwZWRlZiBGdW5jdGlvbjxpbnQoYm9vbCwgY29uc3QgbG9uZyYpPiBGOyAgLy8gTk9MSU5UCisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgRjo6UmVzdWx0PigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxib29sLCBGOjpBcmd1bWVudDE+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGxvbmcmLCBGOjpBcmd1bWVudDI+KCk7ICAvLyBOT0xJTlQKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dHVwbGU8Ym9vbCwgY29uc3QgbG9uZyY+LCBGOjpBcmd1bWVudFR1cGxlPigpOyAgLy8gTk9MSU5UCisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPE1hdGNoZXI8Ym9vbD4sIE1hdGNoZXI8Y29uc3QgbG9uZyY+ID4sICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRjo6QXJndW1lbnRNYXRjaGVyVHVwbGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQoYm9vbCwgY29uc3QgbG9uZyYpLCBGOjpNYWtlUmVzdWx0Vm9pZD4oKTsgIC8vIE5PTElOVAorICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxJZ25vcmVkVmFsdWUoYm9vbCwgY29uc3QgbG9uZyYpLCAgLy8gTk9MSU5UCisgICAgICBGOjpNYWtlUmVzdWx0SWdub3JlZFZhbHVlPigpOworfQorCitURVNUKEZ1bmN0aW9uVGVzdCwgTG9uZ0FyZ3VtZW50TGlzdCkgeworICB0eXBlZGVmIEZ1bmN0aW9uPGNoYXIoYm9vbCwgaW50LCBjaGFyKiwgaW50JiwgY29uc3QgbG9uZyYpPiBGOyAgLy8gTk9MSU5UCisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNoYXIsIEY6OlJlc3VsdD4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Ym9vbCwgRjo6QXJndW1lbnQxPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIEY6OkFyZ3VtZW50Mj4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y2hhciosIEY6OkFyZ3VtZW50Mz4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50JiwgRjo6QXJndW1lbnQ0PigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBsb25nJiwgRjo6QXJndW1lbnQ1PigpOyAgLy8gTk9MSU5UCisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHR1cGxlPGJvb2wsIGludCwgY2hhciosIGludCYsIGNvbnN0IGxvbmcmPiwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAgICBGOjpBcmd1bWVudFR1cGxlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx0dXBsZTxNYXRjaGVyPGJvb2w+LCBNYXRjaGVyPGludD4sIE1hdGNoZXI8Y2hhcio+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyPGludCY+LCBNYXRjaGVyPGNvbnN0IGxvbmcmPiA+LCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgIEY6OkFyZ3VtZW50TWF0Y2hlclR1cGxlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkKGJvb2wsIGludCwgY2hhciosIGludCYsIGNvbnN0IGxvbmcmKSwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAgICBGOjpNYWtlUmVzdWx0Vm9pZD4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8CisgICAgICBJZ25vcmVkVmFsdWUoYm9vbCwgaW50LCBjaGFyKiwgaW50JiwgY29uc3QgbG9uZyYpLCAgLy8gTk9MSU5UCisgICAgICBGOjpNYWtlUmVzdWx0SWdub3JlZFZhbHVlPigpOworfQorCit9ICAvLyBVbm5hbWVkIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTlmNzdmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzX3Rlc3QuY2MKQEAgLTAsMCArMSwxMjg2IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGJ1aWx0LWluIG1hdGNoZXJzIGdlbmVyYXRlZCBieSBhIHNjcmlwdC4KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCituYW1lc3BhY2UgeworCit1c2luZyBzdGQ6Omxpc3Q7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHRlc3Rpbmc6OmdldDsKK3VzaW5nIHRlc3Rpbmc6Om1ha2VfdHVwbGU7Cit1c2luZyB0ZXN0aW5nOjp0dXBsZTsKK3VzaW5nIHRlc3Rpbmc6Ol87Cit1c2luZyB0ZXN0aW5nOjpBcmdzOwordXNpbmcgdGVzdGluZzo6Q29udGFpbnM7Cit1c2luZyB0ZXN0aW5nOjpFbGVtZW50c0FyZTsKK3VzaW5nIHRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXk7Cit1c2luZyB0ZXN0aW5nOjpFcTsKK3VzaW5nIHRlc3Rpbmc6OkdlOwordXNpbmcgdGVzdGluZzo6R3Q7Cit1c2luZyB0ZXN0aW5nOjpMZTsKK3VzaW5nIHRlc3Rpbmc6Okx0OwordXNpbmcgdGVzdGluZzo6TWFrZU1hdGNoZXI7Cit1c2luZyB0ZXN0aW5nOjpNYXRjaGVyOwordXNpbmcgdGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTsKK3VzaW5nIHRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXI7Cit1c2luZyB0ZXN0aW5nOjpOZTsKK3VzaW5nIHRlc3Rpbmc6Ok5vdDsKK3VzaW5nIHRlc3Rpbmc6OlBvaW50ZWU7Cit1c2luZyB0ZXN0aW5nOjpQcmludFRvU3RyaW5nOwordXNpbmcgdGVzdGluZzo6UmVmOwordXNpbmcgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOwordXNpbmcgdGVzdGluZzo6U3RyRXE7Cit1c2luZyB0ZXN0aW5nOjpWYWx1ZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc7CisKKy8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiBtYXRjaGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJpbmcgRGVzY3JpYmUoY29uc3QgTWF0Y2hlcjxUPiYgbSkgeworICBzdHJpbmdzdHJlYW0gc3M7CisgIG0uRGVzY3JpYmVUbygmc3MpOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZWdhdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0Y2hlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RyaW5nIERlc2NyaWJlTmVnYXRpb24oY29uc3QgTWF0Y2hlcjxUPiYgbSkgeworICBzdHJpbmdzdHJlYW0gc3M7CisgIG0uRGVzY3JpYmVOZWdhdGlvblRvKCZzcyk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gUmV0dXJucyB0aGUgcmVhc29uIHdoeSB4IG1hdGNoZXMsIG9yIGRvZXNuJ3QgbWF0Y2gsIG0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR5cGUsIHR5cGVuYW1lIFZhbHVlPgorc3RyaW5nIEV4cGxhaW4oY29uc3QgTWF0Y2hlclR5cGUmIG0sIGNvbnN0IFZhbHVlJiB4KSB7CisgIHN0cmluZ3N0cmVhbSBzczsKKyAgbS5FeHBsYWluTWF0Y2hSZXN1bHRUbyh4LCAmc3MpOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIFRlc3RzIEFyZ3M8azAsIC4uLiwga24+KG0pLgorCitURVNUKEFyZ3NUZXN0LCBBY2NlcHRzWmVyb1RlbXBsYXRlQXJnKSB7CisgIGNvbnN0IHR1cGxlPGludCwgYm9vbD4gdCg1LCB0cnVlKTsKKyAgRVhQRUNUX1RIQVQodCwgQXJnczw+KEVxKHR1cGxlPD4oKSkpKTsKKyAgRVhQRUNUX1RIQVQodCwgTm90KEFyZ3M8PihOZSh0dXBsZTw+KCkpKSkpOworfQorCitURVNUKEFyZ3NUZXN0LCBBY2NlcHRzT25lVGVtcGxhdGVBcmcpIHsKKyAgY29uc3QgdHVwbGU8aW50LCBib29sPiB0KDUsIHRydWUpOworICBFWFBFQ1RfVEhBVCh0LCBBcmdzPDA+KEVxKG1ha2VfdHVwbGUoNSkpKSk7CisgIEVYUEVDVF9USEFUKHQsIEFyZ3M8MT4oRXEobWFrZV90dXBsZSh0cnVlKSkpKTsKKyAgRVhQRUNUX1RIQVQodCwgTm90KEFyZ3M8MT4oRXEobWFrZV90dXBsZShmYWxzZSkpKSkpOworfQorCitURVNUKEFyZ3NUZXN0LCBBY2NlcHRzVHdvVGVtcGxhdGVBcmdzKSB7CisgIGNvbnN0IHR1cGxlPHNob3J0LCBpbnQsIGxvbmc+IHQoNCwgNSwgNkwpOyAgLy8gTk9MSU5UCisKKyAgRVhQRUNUX1RIQVQodCwgKEFyZ3M8MCwgMT4oTHQoKSkpKTsKKyAgRVhQRUNUX1RIQVQodCwgKEFyZ3M8MSwgMj4oTHQoKSkpKTsKKyAgRVhQRUNUX1RIQVQodCwgTm90KEFyZ3M8MCwgMj4oR3QoKSkpKTsKK30KKworVEVTVChBcmdzVGVzdCwgQWNjZXB0c1JlcGVhdGVkVGVtcGxhdGVBcmdzKSB7CisgIGNvbnN0IHR1cGxlPHNob3J0LCBpbnQsIGxvbmc+IHQoNCwgNSwgNkwpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9USEFUKHQsIChBcmdzPDAsIDA+KEVxKCkpKSk7CisgIEVYUEVDVF9USEFUKHQsIE5vdChBcmdzPDEsIDE+KE5lKCkpKSk7Cit9CisKK1RFU1QoQXJnc1Rlc3QsIEFjY2VwdHNEZWNyZWFzaW5nVGVtcGxhdGVBcmdzKSB7CisgIGNvbnN0IHR1cGxlPHNob3J0LCBpbnQsIGxvbmc+IHQoNCwgNSwgNkwpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9USEFUKHQsIChBcmdzPDIsIDA+KEd0KCkpKSk7CisgIEVYUEVDVF9USEFUKHQsIE5vdChBcmdzPDIsIDE+KEx0KCkpKSk7Cit9CisKKy8vIFRoZSBNQVRDSEVSKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwKKy8vIHBhcmFtZXRlcikgaW4gTVNWQyB3aXRoIC1XNC4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW5ub3QgYmUgZml4ZWQgaW4KKy8vIHRoZSBtYWNybyBkZWZpbml0aW9uLCBhcyB0aGUgd2FybmluZ3MgYXJlIGdlbmVyYXRlZCB3aGVuIHRoZSBtYWNybworLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlCisvLyB3ZSBzdXBwcmVzcyB0aGVtIGhlcmUuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQorI2VuZGlmCisKK01BVENIRVIoU3VtSXNaZXJvLCAiIikgeworICByZXR1cm4gZ2V0PDA+KGFyZykgKyBnZXQ8MT4oYXJnKSArIGdldDwyPihhcmcpID09IDA7Cit9CisKK1RFU1QoQXJnc1Rlc3QsIEFjY2VwdHNNb3JlVGVtcGxhdGVBcmdzVGhhbkFyaXR5T2ZPcmlnaW5hbFR1cGxlKSB7CisgIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUoLTEsIDIpLCAoQXJnczwwLCAwLCAxPihTdW1Jc1plcm8oKSkpKTsKKyAgRVhQRUNUX1RIQVQobWFrZV90dXBsZSgxLCAyKSwgTm90KEFyZ3M8MCwgMCwgMT4oU3VtSXNaZXJvKCkpKSk7Cit9CisKK1RFU1QoQXJnc1Rlc3QsIENhbkJlTmVzdGVkKSB7CisgIGNvbnN0IHR1cGxlPHNob3J0LCBpbnQsIGxvbmcsIGludD4gdCg0LCA1LCA2TCwgNik7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX1RIQVQodCwgKEFyZ3M8MSwgMiwgMz4oQXJnczwxLCAyPihFcSgpKSkpKTsKKyAgRVhQRUNUX1RIQVQodCwgKEFyZ3M8MCwgMSwgMz4oQXJnczwwLCAyPihMdCgpKSkpKTsKK30KKworVEVTVChBcmdzVGVzdCwgQ2FuTWF0Y2hUdXBsZUJ5VmFsdWUpIHsKKyAgdHlwZWRlZiB0dXBsZTxjaGFyLCBpbnQsIGludD4gVHVwbGUzOworICBjb25zdCBNYXRjaGVyPFR1cGxlMz4gbSA9IEFyZ3M8MSwgMj4oTHQoKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhUdXBsZTMoJ2EnLCAxLCAyKSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKFR1cGxlMygnYicsIDIsIDIpKSk7Cit9CisKK1RFU1QoQXJnc1Rlc3QsIENhbk1hdGNoVHVwbGVCeVJlZmVyZW5jZSkgeworICB0eXBlZGVmIHR1cGxlPGNoYXIsIGNoYXIsIGludD4gVHVwbGUzOworICBjb25zdCBNYXRjaGVyPGNvbnN0IFR1cGxlMyY+IG0gPSBBcmdzPDAsIDE+KEx0KCkpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoVHVwbGUzKCdhJywgJ2InLCAyKSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKFR1cGxlMygnYicsICdiJywgMikpKTsKK30KKworLy8gVmFsaWRhdGVzIHRoYXQgYXJnIGlzIHByaW50ZWQgYXMgc3RyLgorTUFUQ0hFUl9QKFByaW50c0FzLCBzdHIsICIiKSB7CisgIHJldHVybiB0ZXN0aW5nOjpQcmludFRvU3RyaW5nKGFyZykgPT0gc3RyOworfQorCitURVNUKEFyZ3NUZXN0LCBBY2NlcHRzVGVuVGVtcGxhdGVBcmdzKSB7CisgIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUoMCwgMUwsIDIsIDNMLCA0LCA1LCA2LCA3LCA4LCA5KSwKKyAgICAgICAgICAgICAgKEFyZ3M8OSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMD4oCisgICAgICAgICAgICAgICAgICBQcmludHNBcygiKDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDApIikpKSk7CisgIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUoMCwgMUwsIDIsIDNMLCA0LCA1LCA2LCA3LCA4LCA5KSwKKyAgICAgICAgICAgICAgTm90KEFyZ3M8OSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMD4oCisgICAgICAgICAgICAgICAgICAgICAgUHJpbnRzQXMoIigwLCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwKSIpKSkpOworfQorCitURVNUKEFyZ3NUZXN0LCBEZXNjaXJiZXNTZWxmQ29ycmVjdGx5KSB7CisgIGNvbnN0IE1hdGNoZXI8dHVwbGU8aW50LCBib29sLCBjaGFyPiA+IG0gPSBBcmdzPDIsIDA+KEx0KCkpOworICBFWFBFQ1RfRVEoImFyZSBhIHR1cGxlIHdob3NlIGZpZWxkcyAoIzIsICMwKSBhcmUgYSBwYWlyIHdoZXJlICIKKyAgICAgICAgICAgICJ0aGUgZmlyc3QgPCB0aGUgc2Vjb25kIiwKKyAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKK30KKworVEVTVChBcmdzVGVzdCwgRGVzY2lyYmVzTmVzdGVkQXJnc0NvcnJlY3RseSkgeworICBjb25zdCBNYXRjaGVyPGNvbnN0IHR1cGxlPGludCwgYm9vbCwgY2hhciwgaW50PiY+IG0gPQorICAgICAgQXJnczwwLCAyLCAzPihBcmdzPDIsIDA+KEx0KCkpKTsKKyAgRVhQRUNUX0VRKCJhcmUgYSB0dXBsZSB3aG9zZSBmaWVsZHMgKCMwLCAjMiwgIzMpIGFyZSBhIHR1cGxlICIKKyAgICAgICAgICAgICJ3aG9zZSBmaWVsZHMgKCMyLCAjMCkgYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPCB0aGUgc2Vjb25kIiwKKyAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKK30KKworVEVTVChBcmdzVGVzdCwgRGVzY3JpYmVzTmVnYXRpb25Db3JyZWN0bHkpIHsKKyAgY29uc3QgTWF0Y2hlcjx0dXBsZTxpbnQsIGNoYXI+ID4gbSA9IEFyZ3M8MSwgMD4oR3QoKSk7CisgIEVYUEVDVF9FUSgiYXJlIGEgdHVwbGUgd2hvc2UgZmllbGRzICgjMSwgIzApIGFyZW4ndCBhIHBhaXIgIgorICAgICAgICAgICAgIndoZXJlIHRoZSBmaXJzdCA+IHRoZSBzZWNvbmQiLAorICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKK1RFU1QoQXJnc1Rlc3QsIEV4cGxhaW5zTWF0Y2hSZXN1bHRXaXRob3V0SW5uZXJFeHBsYW5hdGlvbikgeworICBjb25zdCBNYXRjaGVyPHR1cGxlPGJvb2wsIGludCwgaW50PiA+IG0gPSBBcmdzPDEsIDI+KEVxKCkpOworICBFWFBFQ1RfRVEoIndob3NlIGZpZWxkcyAoIzEsICMyKSBhcmUgKDQyLCA0MikiLAorICAgICAgICAgICAgRXhwbGFpbihtLCBtYWtlX3R1cGxlKGZhbHNlLCA0MiwgNDIpKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZmllbGRzICgjMSwgIzIpIGFyZSAoNDIsIDQzKSIsCisgICAgICAgICAgICBFeHBsYWluKG0sIG1ha2VfdHVwbGUoZmFsc2UsIDQyLCA0MykpKTsKK30KKworLy8gRm9yIHRlc3RpbmcgQXJnczw+J3MgZXhwbGFuYXRpb24uCitjbGFzcyBMZXNzVGhhbk1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTx0dXBsZTxjaGFyLCBpbnQ+ID4geworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7fQorCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4odHVwbGU8Y2hhciwgaW50PiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGNvbnN0IGludCBkaWZmID0gZ2V0PDA+KHZhbHVlKSAtIGdldDwxPih2YWx1ZSk7CisgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAqbGlzdGVuZXIgPDwgIndoZXJlIHRoZSBmaXJzdCB2YWx1ZSBpcyAiIDw8IGRpZmYKKyAgICAgICAgICAgICAgICA8PCAiIG1vcmUgdGhhbiB0aGUgc2Vjb25kIjsKKyAgICB9CisgICAgcmV0dXJuIGRpZmYgPCAwOworICB9Cit9OworCitNYXRjaGVyPHR1cGxlPGNoYXIsIGludD4gPiBMZXNzVGhhbigpIHsKKyAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBMZXNzVGhhbk1hdGNoZXIpOworfQorCitURVNUKEFyZ3NUZXN0LCBFeHBsYWluc01hdGNoUmVzdWx0V2l0aElubmVyRXhwbGFuYXRpb24pIHsKKyAgY29uc3QgTWF0Y2hlcjx0dXBsZTxjaGFyLCBpbnQsIGludD4gPiBtID0gQXJnczwwLCAyPihMZXNzVGhhbigpKTsKKyAgRVhQRUNUX0VRKCJ3aG9zZSBmaWVsZHMgKCMwLCAjMikgYXJlICgnYScgKDk3LCAweDYxKSwgNDIpLCAiCisgICAgICAgICAgICAid2hlcmUgdGhlIGZpcnN0IHZhbHVlIGlzIDU1IG1vcmUgdGhhbiB0aGUgc2Vjb25kIiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgbWFrZV90dXBsZSgnYScsIDQyLCA0MikpKTsKKyAgRVhQRUNUX0VRKCJ3aG9zZSBmaWVsZHMgKCMwLCAjMikgYXJlICgnXFwwJywgNDMpIiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgbWFrZV90dXBsZSgnXDAnLCA0MiwgNDMpKSk7Cit9CisKKy8vIEZvciB0ZXN0aW5nIEV4cGxhaW5NYXRjaFJlc3VsdFRvKCkuCitjbGFzcyBHcmVhdGVyVGhhbk1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxpbnQ+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdyZWF0ZXJUaGFuTWF0Y2hlcihpbnQgcmhzKSA6IHJoc18ocmhzKSB7fQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiaXMgZ3JlYXRlciB0aGFuICIgPDwgcmhzXzsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oaW50IGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgIGNvbnN0IGludCBkaWZmID0gbGhzIC0gcmhzXzsKKyAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgIiA8PCBkaWZmIDw8ICIgbW9yZSB0aGFuICIgPDwgcmhzXzsKKyAgICB9IGVsc2UgaWYgKGRpZmYgPT0gMCkgeworICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBpcyB0aGUgc2FtZSBhcyAiIDw8IHJoc187CisgICAgfSBlbHNlIHsKKyAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgIiA8PCAtZGlmZiA8PCAiIGxlc3MgdGhhbiAiIDw8IHJoc187CisgICAgfQorCisgICAgcmV0dXJuIGxocyA+IHJoc187CisgIH0KKworIHByaXZhdGU6CisgIGludCByaHNfOworfTsKKworTWF0Y2hlcjxpbnQ+IEdyZWF0ZXJUaGFuKGludCBuKSB7CisgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgR3JlYXRlclRoYW5NYXRjaGVyKG4pKTsKK30KKworLy8gVGVzdHMgZm9yIEVsZW1lbnRzQXJlKCkuCisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBDYW5EZXNjcmliZUV4cGVjdGluZ05vRWxlbWVudCkgeworICBNYXRjaGVyPGNvbnN0IHZlY3RvcjxpbnQ+Jj4gbSA9IEVsZW1lbnRzQXJlKCk7CisgIEVYUEVDVF9FUSgiaXMgZW1wdHkiLCBEZXNjcmliZShtKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBDYW5EZXNjcmliZUV4cGVjdGluZ09uZUVsZW1lbnQpIHsKKyAgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0gPSBFbGVtZW50c0FyZShHdCg1KSk7CisgIEVYUEVDVF9FUSgiaGFzIDEgZWxlbWVudCB0aGF0IGlzID4gNSIsIERlc2NyaWJlKG0pKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIENhbkRlc2NyaWJlRXhwZWN0aW5nTWFueUVsZW1lbnRzKSB7CisgIE1hdGNoZXI8bGlzdDxzdHJpbmc+ID4gbSA9IEVsZW1lbnRzQXJlKFN0ckVxKCJvbmUiKSwgInR3byIpOworICBFWFBFQ1RfRVEoImhhcyAyIGVsZW1lbnRzIHdoZXJlXG4iCisgICAgICAgICAgICAiZWxlbWVudCAjMCBpcyBlcXVhbCB0byBcIm9uZVwiLFxuIgorICAgICAgICAgICAgImVsZW1lbnQgIzEgaXMgZXF1YWwgdG8gXCJ0d29cIiIsIERlc2NyaWJlKG0pKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIENhbkRlc2NyaWJlTmVnYXRpb25PZkV4cGVjdGluZ05vRWxlbWVudCkgeworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbSA9IEVsZW1lbnRzQXJlKCk7CisgIEVYUEVDVF9FUSgiaXNuJ3QgZW1wdHkiLCBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIENhbkRlc2NyaWJlTmVnYXRpb25PZkV4cGVjdGluZ09uZUVsbWVudCkgeworICBNYXRjaGVyPGNvbnN0IGxpc3Q8aW50PiYgPiBtID0gRWxlbWVudHNBcmUoR3QoNSkpOworICBFWFBFQ1RfRVEoImRvZXNuJ3QgaGF2ZSAxIGVsZW1lbnQsIG9yXG4iCisgICAgICAgICAgICAiZWxlbWVudCAjMCBpc24ndCA+IDUiLCBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIENhbkRlc2NyaWJlTmVnYXRpb25PZkV4cGVjdGluZ01hbnlFbGVtZW50cykgeworICBNYXRjaGVyPGNvbnN0IGxpc3Q8c3RyaW5nPiYgPiBtID0gRWxlbWVudHNBcmUoIm9uZSIsICJ0d28iKTsKKyAgRVhQRUNUX0VRKCJkb2Vzbid0IGhhdmUgMiBlbGVtZW50cywgb3JcbiIKKyAgICAgICAgICAgICJlbGVtZW50ICMwIGlzbid0IGVxdWFsIHRvIFwib25lXCIsIG9yXG4iCisgICAgICAgICAgICAiZWxlbWVudCAjMSBpc24ndCBlcXVhbCB0byBcInR3b1wiIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBEb2VzTm90RXhwbGFpblRyaXZpYWxNYXRjaCkgeworICBNYXRjaGVyPGNvbnN0IGxpc3Q8aW50PiYgPiBtID0gRWxlbWVudHNBcmUoMSwgTmUoMikpOworCisgIGxpc3Q8aW50PiB0ZXN0X2xpc3Q7CisgIHRlc3RfbGlzdC5wdXNoX2JhY2soMSk7CisgIHRlc3RfbGlzdC5wdXNoX2JhY2soMyk7CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCB0ZXN0X2xpc3QpKTsgIC8vIE5vIG5lZWQgdG8gZXhwbGFpbiBhbnl0aGluZy4KK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIEV4cGxhaW5zTm9uVHJpdmlhbE1hdGNoKSB7CisgIE1hdGNoZXI8Y29uc3QgdmVjdG9yPGludD4mID4gbSA9CisgICAgICBFbGVtZW50c0FyZShHcmVhdGVyVGhhbigxKSwgMCwgR3JlYXRlclRoYW4oMikpOworCisgIGNvbnN0IGludCBhW10gPSB7IDEwLCAwLCAxMDAgfTsKKyAgdmVjdG9yPGludD4gdGVzdF92ZWN0b3IoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKyAgRVhQRUNUX0VRKCJ3aG9zZSBlbGVtZW50ICMwIG1hdGNoZXMsIHdoaWNoIGlzIDkgbW9yZSB0aGFuIDEsXG4iCisgICAgICAgICAgICAiYW5kIHdob3NlIGVsZW1lbnQgIzIgbWF0Y2hlcywgd2hpY2ggaXMgOTggbW9yZSB0aGFuIDIiLAorICAgICAgICAgICAgRXhwbGFpbihtLCB0ZXN0X3ZlY3RvcikpOworfQorCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgQ2FuRXhwbGFpbk1pc21hdGNoV3JvbmdTaXplKSB7CisgIE1hdGNoZXI8Y29uc3QgbGlzdDxpbnQ+JiA+IG0gPSBFbGVtZW50c0FyZSgxLCAzKTsKKworICBsaXN0PGludD4gdGVzdF9saXN0OworICAvLyBObyBuZWVkIHRvIGV4cGxhaW4gd2hlbiB0aGUgY29udGFpbmVyIGlzIGVtcHR5LgorICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgdGVzdF9saXN0KSk7CisKKyAgdGVzdF9saXN0LnB1c2hfYmFjaygxKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBoYXMgMSBlbGVtZW50IiwgRXhwbGFpbihtLCB0ZXN0X2xpc3QpKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIENhbkV4cGxhaW5NaXNtYXRjaFJpZ2h0U2l6ZSkgeworICBNYXRjaGVyPGNvbnN0IHZlY3RvcjxpbnQ+JiA+IG0gPSBFbGVtZW50c0FyZSgxLCBHcmVhdGVyVGhhbig1KSk7CisKKyAgdmVjdG9yPGludD4gdjsKKyAgdi5wdXNoX2JhY2soMik7CisgIHYucHVzaF9iYWNrKDEpOworICBFWFBFQ1RfRVEoIndob3NlIGVsZW1lbnQgIzAgZG9lc24ndCBtYXRjaCIsIEV4cGxhaW4obSwgdikpOworCisgIHZbMF0gPSAxOworICBFWFBFQ1RfRVEoIndob3NlIGVsZW1lbnQgIzEgZG9lc24ndCBtYXRjaCwgd2hpY2ggaXMgNCBsZXNzIHRoYW4gNSIsCisgICAgICAgICAgICBFeHBsYWluKG0sIHYpKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIE1hdGNoZXNPbmVFbGVtZW50VmVjdG9yKSB7CisgIHZlY3RvcjxzdHJpbmc+IHRlc3RfdmVjdG9yOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInRlc3Qgc3RyaW5nIik7CisKKyAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlKFN0ckVxKCJ0ZXN0IHN0cmluZyIpKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBNYXRjaGVzT25lRWxlbWVudExpc3QpIHsKKyAgbGlzdDxzdHJpbmc+IHRlc3RfbGlzdDsKKyAgdGVzdF9saXN0LnB1c2hfYmFjaygidGVzdCBzdHJpbmciKTsKKworICBFWFBFQ1RfVEhBVCh0ZXN0X2xpc3QsIEVsZW1lbnRzQXJlKCJ0ZXN0IHN0cmluZyIpKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIE1hdGNoZXNUaHJlZUVsZW1lbnRWZWN0b3IpIHsKKyAgdmVjdG9yPHN0cmluZz4gdGVzdF92ZWN0b3I7CisgIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygib25lIik7CisgIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygidHdvIik7CisgIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygidGhyZWUiKTsKKworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmUoIm9uZSIsIFN0ckVxKCJ0d28iKSwgXykpOworfQorCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgTWF0Y2hlc09uZUVsZW1lbnRFcU1hdGNoZXIpIHsKKyAgdmVjdG9yPGludD4gdGVzdF92ZWN0b3I7CisgIHRlc3RfdmVjdG9yLnB1c2hfYmFjayg0KTsKKworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmUoRXEoNCkpKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIE1hdGNoZXNPbmVFbGVtZW50QW55TWF0Y2hlcikgeworICB2ZWN0b3I8aW50PiB0ZXN0X3ZlY3RvcjsKKyAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKDQpOworCisgIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZShfKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBNYXRjaGVzT25lRWxlbWVudFZhbHVlKSB7CisgIHZlY3RvcjxpbnQ+IHRlc3RfdmVjdG9yOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soNCk7CisKKyAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlKDQpKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIE1hdGNoZXNUaHJlZUVsZW1lbnRzTWl4ZWRNYXRjaGVycykgeworICB2ZWN0b3I8aW50PiB0ZXN0X3ZlY3RvcjsKKyAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKDEpOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soMik7CisgIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygzKTsKKworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmUoMSwgRXEoMiksIF8pKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIE1hdGNoZXNUZW5FbGVtZW50VmVjdG9yKSB7CisgIGNvbnN0IGludCBhW10gPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfTsKKyAgdmVjdG9yPGludD4gdGVzdF92ZWN0b3IoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwKKyAgICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnQgbGlzdCBjYW4gY29udGFpbiB2YWx1ZXMgYW5kL29yIG1hdGNoZXJzCisgICAgICAgICAgICAgIC8vIG9mIGRpZmZlcmVudCB0eXBlcy4KKyAgICAgICAgICAgICAgRWxlbWVudHNBcmUoMCwgR2UoMCksIF8sIDMsIDQsIE5lKDIpLCBFcSg2KSwgNywgOCwgXykpOworfQorCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgRG9lc05vdE1hdGNoV3JvbmdTaXplKSB7CisgIHZlY3RvcjxzdHJpbmc+IHRlc3RfdmVjdG9yOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInRlc3Qgc3RyaW5nIik7CisgIHRlc3RfdmVjdG9yLnB1c2hfYmFjaygidGVzdCBzdHJpbmciKTsKKworICBNYXRjaGVyPHZlY3RvcjxzdHJpbmc+ID4gbSA9IEVsZW1lbnRzQXJlKFN0ckVxKCJ0ZXN0IHN0cmluZyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3ZlY3RvcikpOworfQorCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgRG9lc05vdE1hdGNoV3JvbmdWYWx1ZSkgeworICB2ZWN0b3I8c3RyaW5nPiB0ZXN0X3ZlY3RvcjsKKyAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJvdGhlciBzdHJpbmciKTsKKworICBNYXRjaGVyPHZlY3RvcjxzdHJpbmc+ID4gbSA9IEVsZW1lbnRzQXJlKFN0ckVxKCJ0ZXN0IHN0cmluZyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3ZlY3RvcikpOworfQorCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgRG9lc05vdE1hdGNoV3JvbmdPcmRlcikgeworICB2ZWN0b3I8c3RyaW5nPiB0ZXN0X3ZlY3RvcjsKKyAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJvbmUiKTsKKyAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKCJ0aHJlZSIpOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInR3byIpOworCisgIE1hdGNoZXI8dmVjdG9yPHN0cmluZz4gPiBtID0gRWxlbWVudHNBcmUoCisgICAgU3RyRXEoIm9uZSIpLCBTdHJFcSgidHdvIiksIFN0ckVxKCJ0aHJlZSIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3ZlY3RvcikpOworfQorCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgV29ya3NGb3JOZXN0ZWRDb250YWluZXIpIHsKKyAgY29uc3QgY2hhciogc3RyaW5nc1tdID0geworICAgICJIaSIsCisgICAgIndvcmxkIgorICB9OworCisgIHZlY3RvcjxsaXN0PGNoYXI+ID4gbmVzdGVkOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEdURVNUX0FSUkFZX1NJWkVfKHN0cmluZ3MpOyBpKyspIHsKKyAgICBuZXN0ZWQucHVzaF9iYWNrKGxpc3Q8Y2hhcj4oc3RyaW5nc1tpXSwgc3RyaW5nc1tpXSArIHN0cmxlbihzdHJpbmdzW2ldKSkpOworICB9CisKKyAgRVhQRUNUX1RIQVQobmVzdGVkLCBFbGVtZW50c0FyZShFbGVtZW50c0FyZSgnSCcsIE5lKCdlJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKCd3JywgJ28nLCBfLCBfLCAnZCcpKSk7CisgIEVYUEVDVF9USEFUKG5lc3RlZCwgTm90KEVsZW1lbnRzQXJlKEVsZW1lbnRzQXJlKCdIJywgJ2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudHNBcmUoJ3cnLCAnbycsIF8sIF8sICdkJykpKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBXb3Jrc1dpdGhCeVJlZkVsZW1lbnRNYXRjaGVycykgeworICBpbnQgYVtdID0geyAwLCAxLCAyIH07CisgIHZlY3RvcjxpbnQ+IHYoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKworICBFWFBFQ1RfVEhBVCh2LCBFbGVtZW50c0FyZShSZWYodlswXSksIFJlZih2WzFdKSwgUmVmKHZbMl0pKSk7CisgIEVYUEVDVF9USEFUKHYsIE5vdChFbGVtZW50c0FyZShSZWYodlswXSksIFJlZih2WzFdKSwgUmVmKGFbMl0pKSkpOworfQorCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgV29ya3NXaXRoQ29udGFpbmVyUG9pbnRlclVzaW5nUG9pbnRlZSkgeworICBpbnQgYVtdID0geyAwLCAxLCAyIH07CisgIHZlY3RvcjxpbnQ+IHYoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKworICBFWFBFQ1RfVEhBVCgmdiwgUG9pbnRlZShFbGVtZW50c0FyZSgwLCAxLCBfKSkpOworICBFWFBFQ1RfVEhBVCgmdiwgTm90KFBvaW50ZWUoRWxlbWVudHNBcmUoMCwgXywgMykpKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBXb3Jrc1dpdGhOYXRpdmVBcnJheVBhc3NlZEJ5UmVmZXJlbmNlKSB7CisgIGludCBhcnJheVtdID0geyAwLCAxLCAyIH07CisgIEVYUEVDVF9USEFUKGFycmF5LCBFbGVtZW50c0FyZSgwLCAxLCBfKSk7CisgIEVYUEVDVF9USEFUKGFycmF5LCBOb3QoRWxlbWVudHNBcmUoMSwgXywgXykpKTsKKyAgRVhQRUNUX1RIQVQoYXJyYXksIE5vdChFbGVtZW50c0FyZSgwLCBfKSkpOworfQorCitjbGFzcyBOYXRpdmVBcnJheVBhc3NlZEFzUG9pbnRlckFuZFNpemUgeworIHB1YmxpYzoKKyAgTmF0aXZlQXJyYXlQYXNzZWRBc1BvaW50ZXJBbmRTaXplKCkge30KKworICBNT0NLX01FVEhPRDIoSGVscGVyLCB2b2lkKGludCogYXJyYXksIGludCBzaXplKSk7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5hdGl2ZUFycmF5UGFzc2VkQXNQb2ludGVyQW5kU2l6ZSk7Cit9OworCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgV29ya3NXaXRoTmF0aXZlQXJyYXlQYXNzZWRBc1BvaW50ZXJBbmRTaXplKSB7CisgIGludCBhcnJheVtdID0geyAwLCAxIH07CisgIDo6dGVzdGluZzo6dHVwbGU8aW50Kiwgc2l6ZV90PiBhcnJheV9hc190dXBsZShhcnJheSwgMik7CisgIEVYUEVDVF9USEFUKGFycmF5X2FzX3R1cGxlLCBFbGVtZW50c0FyZSgwLCAxKSk7CisgIEVYUEVDVF9USEFUKGFycmF5X2FzX3R1cGxlLCBOb3QoRWxlbWVudHNBcmUoMCkpKTsKKworICBOYXRpdmVBcnJheVBhc3NlZEFzUG9pbnRlckFuZFNpemUgaGVscGVyOworICBFWFBFQ1RfQ0FMTChoZWxwZXIsIEhlbHBlcihfLCBfKSkKKyAgICAgIC5XaXRoKEVsZW1lbnRzQXJlKDAsIDEpKTsKKyAgaGVscGVyLkhlbHBlcihhcnJheSwgMik7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBXb3Jrc1dpdGhUd29EaW1lbnNpb25hbE5hdGl2ZUFycmF5KSB7CisgIGNvbnN0IGNoYXIgYTJbXVszXSA9IHsgImhpIiwgImxvIiB9OworICBFWFBFQ1RfVEhBVChhMiwgRWxlbWVudHNBcmUoRWxlbWVudHNBcmUoJ2gnLCAnaScsICdcMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudHNBcmUoJ2wnLCAnbycsICdcMCcpKSk7CisgIEVYUEVDVF9USEFUKGEyLCBFbGVtZW50c0FyZShTdHJFcSgiaGkiKSwgU3RyRXEoImxvIikpKTsKKyAgRVhQRUNUX1RIQVQoYTIsIEVsZW1lbnRzQXJlKE5vdChFbGVtZW50c0FyZSgnaCcsICdvJywgJ1wwJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudHNBcmUoJ2wnLCAnbycsICdcMCcpKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBBY2NlcHRzU3RyaW5nTGl0ZXJhbCkgeworICBzdHJpbmcgYXJyYXlbXSA9IHsgImhpIiwgIm9uZSIsICJ0d28iIH07CisgIEVYUEVDVF9USEFUKGFycmF5LCBFbGVtZW50c0FyZSgiaGkiLCAib25lIiwgInR3byIpKTsKKyAgRVhQRUNUX1RIQVQoYXJyYXksIE5vdChFbGVtZW50c0FyZSgiaGkiLCAib25lIiwgInRvbyIpKSk7Cit9CisKKyNpZm5kZWYgX01TQ19WRVIKKworLy8gVGhlIGZvbGxvd2luZyB0ZXN0IHBhc3NlcyBhIHZhbHVlIG9mIHR5cGUgY29uc3QgY2hhcltdIHRvIGEKKy8vIGZ1bmN0aW9uIHRlbXBsYXRlIHRoYXQgZXhwZWN0cyBjb25zdCBUJi4gIFNvbWUgdmVyc2lvbnMgb2YgTVNWQworLy8gZ2VuZXJhdGVzIGEgY29tcGlsZXIgZXJyb3IgQzI2NjUgZm9yIHRoYXQuICBXZSBiZWxpZXZlIGl0J3MgYSBidWcKKy8vIGluIE1TVkMuICBUaGVyZWZvcmUgdGhpcyB0ZXN0IGlzICNpZi1lZCBvdXQgZm9yIE1TVkMuCisKKy8vIERlY2xhcmVkIGhlcmUgd2l0aCB0aGUgc2l6ZSB1bmtub3duLiAgRGVmaW5lZCBBRlRFUiB0aGUgZm9sbG93aW5nIHRlc3QuCitleHRlcm4gY29uc3QgY2hhciBrSGlbXTsKKworVEVTVChFbGVtZW50c0FyZVRlc3QsIEFjY2VwdHNBcnJheVdpdGhVbmtub3duU2l6ZSkgeworICAvLyBUaGUgc2l6ZSBvZiBrSGkgaXMgbm90IGtub3duIGluIHRoaXMgdGVzdCwgYnV0IEVsZW1lbnRzQXJlKCkgc2hvdWxkCisgIC8vIHN0aWxsIGFjY2VwdCBpdC4KKworICBzdHJpbmcgYXJyYXkxW10gPSB7ICJoaSIgfTsKKyAgRVhQRUNUX1RIQVQoYXJyYXkxLCBFbGVtZW50c0FyZShrSGkpKTsKKworICBzdHJpbmcgYXJyYXkyW10gPSB7ICJobyIgfTsKKyAgRVhQRUNUX1RIQVQoYXJyYXkyLCBOb3QoRWxlbWVudHNBcmUoa0hpKSkpOworfQorCitjb25zdCBjaGFyIGtIaVtdID0gImhpIjsKKworI2VuZGlmICAvLyBfTVNDX1ZFUgorCitURVNUKEVsZW1lbnRzQXJlVGVzdCwgTWFrZXNDb3B5T2ZBcmd1bWVudHMpIHsKKyAgaW50IHggPSAxOworICBpbnQgeSA9IDI7CisgIC8vIFRoaXMgc2hvdWxkIG1ha2UgYSBjb3B5IG9mIHggYW5kIHkuCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjx0ZXN0aW5nOjp0dXBsZTxpbnQsIGludD4gPgorICAgICAgICAgIHBvbHltb3JwaGljX21hdGNoZXIgPSBFbGVtZW50c0FyZSh4LCB5KTsKKyAgLy8gQ2hhbmdpbmcgeCBhbmQgeSBub3cgc2hvdWxkbid0IGFmZmVjdCB0aGUgbWVhbmluZyBvZiB0aGUgYWJvdmUgbWF0Y2hlci4KKyAgeCA9IHkgPSAwOworICBjb25zdCBpbnQgYXJyYXkxW10gPSB7IDEsIDIgfTsKKyAgRVhQRUNUX1RIQVQoYXJyYXkxLCBwb2x5bW9ycGhpY19tYXRjaGVyKTsKKyAgY29uc3QgaW50IGFycmF5MltdID0geyAwLCAwIH07CisgIEVYUEVDVF9USEFUKGFycmF5MiwgTm90KHBvbHltb3JwaGljX21hdGNoZXIpKTsKK30KKworCisvLyBUZXN0cyBmb3IgRWxlbWVudHNBcmVBcnJheSgpLiAgU2luY2UgRWxlbWVudHNBcmVBcnJheSgpIHNoYXJlcyBtb3N0CisvLyBvZiB0aGUgaW1wbGVtZW50YXRpb24gd2l0aCBFbGVtZW50c0FyZSgpLCB3ZSBkb24ndCB0ZXN0IGl0IGFzCisvLyB0aG9yb3VnaGx5IGhlcmUuCisKK1RFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsIENhbkJlQ3JlYXRlZFdpdGhWYWx1ZUFycmF5KSB7CisgIGNvbnN0IGludCBhW10gPSB7IDEsIDIsIDMgfTsKKworICB2ZWN0b3I8aW50PiB0ZXN0X3ZlY3RvcihhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgRWxlbWVudHNBcmVBcnJheShhKSk7CisKKyAgdGVzdF92ZWN0b3JbMl0gPSAwOworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgTm90KEVsZW1lbnRzQXJlQXJyYXkoYSkpKTsKK30KKworVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwgQ2FuQmVDcmVhdGVkV2l0aEFycmF5U2l6ZSkgeworICBjb25zdCBjaGFyKiBhW10gPSB7ICJvbmUiLCAidHdvIiwgInRocmVlIiB9OworCisgIHZlY3RvcjxzdHJpbmc+IHRlc3RfdmVjdG9yKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7CisgIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZUFycmF5KGEsIEdURVNUX0FSUkFZX1NJWkVfKGEpKSk7CisKKyAgY29uc3QgY2hhcioqIHAgPSBhOworICB0ZXN0X3ZlY3RvclswXSA9ICIxIjsKKyAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIE5vdChFbGVtZW50c0FyZUFycmF5KHAsIEdURVNUX0FSUkFZX1NJWkVfKGEpKSkpOworfQorCitURVNUKEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBDYW5CZUNyZWF0ZWRXaXRob3V0QXJyYXlTaXplKSB7CisgIGNvbnN0IGNoYXIqIGFbXSA9IHsgIm9uZSIsICJ0d28iLCAidGhyZWUiIH07CisKKyAgdmVjdG9yPHN0cmluZz4gdGVzdF92ZWN0b3IoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKyAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlQXJyYXkoYSkpOworCisgIHRlc3RfdmVjdG9yWzBdID0gIjEiOworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgTm90KEVsZW1lbnRzQXJlQXJyYXkoYSkpKTsKK30KKworVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwgQ2FuQmVDcmVhdGVkV2l0aE1hdGNoZXJBcnJheSkgeworICBjb25zdCBNYXRjaGVyPHN0cmluZz4ga01hdGNoZXJBcnJheVtdID0KKyAgICB7IFN0ckVxKCJvbmUiKSwgU3RyRXEoInR3byIpLCBTdHJFcSgidGhyZWUiKSB9OworCisgIHZlY3RvcjxzdHJpbmc+IHRlc3RfdmVjdG9yOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soIm9uZSIpOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInR3byIpOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInRocmVlIik7CisgIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZUFycmF5KGtNYXRjaGVyQXJyYXkpKTsKKworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soInRocmVlIik7CisgIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBOb3QoRWxlbWVudHNBcmVBcnJheShrTWF0Y2hlckFycmF5KSkpOworfQorCitURVNUKEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBDYW5CZUNyZWF0ZWRXaXRoVmVjdG9yKSB7CisgIGNvbnN0IGludCBhW10gPSB7IDEsIDIsIDMgfTsKKyAgdmVjdG9yPGludD4gdGVzdF92ZWN0b3IoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKyAgY29uc3QgdmVjdG9yPGludD4gZXhwZWN0ZWQoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKyAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlQXJyYXkoZXhwZWN0ZWQpKTsKKyAgdGVzdF92ZWN0b3IucHVzaF9iYWNrKDQpOworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgTm90KEVsZW1lbnRzQXJlQXJyYXkoZXhwZWN0ZWQpKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCisKK1RFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsIFRha2VzSW5pdGlhbGl6ZXJMaXN0KSB7CisgIGNvbnN0IGludCBhWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CisgIEVYUEVDVF9USEFUKGEsIEVsZW1lbnRzQXJlQXJyYXkoeyAxLCAyLCAzLCA0LCA1IH0pKTsKKyAgRVhQRUNUX1RIQVQoYSwgTm90KEVsZW1lbnRzQXJlQXJyYXkoeyAxLCAyLCAzLCA1LCA0IH0pKSk7CisgIEVYUEVDVF9USEFUKGEsIE5vdChFbGVtZW50c0FyZUFycmF5KHsgMSwgMiwgMywgNCwgNiB9KSkpOworfQorCitURVNUKEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBUYWtlc0luaXRpYWxpemVyTGlzdE9mQ1N0cmluZ3MpIHsKKyAgY29uc3Qgc3RyaW5nIGFbNV0gPSB7ICJhIiwgImIiLCAiYyIsICJkIiwgImUiIH07CisgIEVYUEVDVF9USEFUKGEsIEVsZW1lbnRzQXJlQXJyYXkoeyAiYSIsICJiIiwgImMiLCAiZCIsICJlIiB9KSk7CisgIEVYUEVDVF9USEFUKGEsIE5vdChFbGVtZW50c0FyZUFycmF5KHsgImEiLCAiYiIsICJjIiwgImUiLCAiZCIgfSkpKTsKKyAgRVhQRUNUX1RIQVQoYSwgTm90KEVsZW1lbnRzQXJlQXJyYXkoeyAiYSIsICJiIiwgImMiLCAiZCIsICJlZiIgfSkpKTsKK30KKworVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwgVGFrZXNJbml0aWFsaXplckxpc3RPZlNhbWVUeXBlZE1hdGNoZXJzKSB7CisgIGNvbnN0IGludCBhWzVdID0geyAxLCAyLCAzLCA0LCA1IH07CisgIEVYUEVDVF9USEFUKGEsIEVsZW1lbnRzQXJlQXJyYXkoCisgICAgICB7IEVxKDEpLCBFcSgyKSwgRXEoMyksIEVxKDQpLCBFcSg1KSB9KSk7CisgIEVYUEVDVF9USEFUKGEsIE5vdChFbGVtZW50c0FyZUFycmF5KAorICAgICAgeyBFcSgxKSwgRXEoMiksIEVxKDMpLCBFcSg0KSwgRXEoNikgfSkpKTsKK30KKworVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwKKyAgICAgVGFrZXNJbml0aWFsaXplckxpc3RPZkRpZmZlcmVudFR5cGVkTWF0Y2hlcnMpIHsKKyAgY29uc3QgaW50IGFbNV0gPSB7IDEsIDIsIDMsIDQsIDUgfTsKKyAgLy8gVGhlIGNvbXBpbGVyIGNhbm5vdCBpbmZlciB0aGUgdHlwZSBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBpZiBpdHMKKyAgLy8gZWxlbWVudHMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuICBXZSBtdXN0IGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUKKyAgLy8gdW5pZmllZCBlbGVtZW50IHR5cGUgaW4gdGhpcyBjYXNlLgorICBFWFBFQ1RfVEhBVChhLCBFbGVtZW50c0FyZUFycmF5PE1hdGNoZXI8aW50PiA+KAorICAgICAgeyBFcSgxKSwgTmUoLTIpLCBHZSgzKSwgTGUoNCksIEVxKDUpIH0pKTsKKyAgRVhQRUNUX1RIQVQoYSwgTm90KEVsZW1lbnRzQXJlQXJyYXk8TWF0Y2hlcjxpbnQ+ID4oCisgICAgICB7IEVxKDEpLCBOZSgtMiksIEdlKDMpLCBMZSg0KSwgRXEoNikgfSkpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCisKK1RFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsIENhbkJlQ3JlYXRlZFdpdGhNYXRjaGVyVmVjdG9yKSB7CisgIGNvbnN0IGludCBhW10gPSB7IDEsIDIsIDMgfTsKKyAgY29uc3QgTWF0Y2hlcjxpbnQ+IGtNYXRjaGVyc1tdID0geyBFcSgxKSwgRXEoMiksIEVxKDMpIH07CisgIHZlY3RvcjxpbnQ+IHRlc3RfdmVjdG9yKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7CisgIGNvbnN0IHZlY3RvcjxNYXRjaGVyPGludD4gPiBleHBlY3RlZCgKKyAgICAgIGtNYXRjaGVycywga01hdGNoZXJzICsgR1RFU1RfQVJSQVlfU0laRV8oa01hdGNoZXJzKSk7CisgIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSk7CisgIHRlc3RfdmVjdG9yLnB1c2hfYmFjayg0KTsKKyAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIE5vdChFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSkpOworfQorCitURVNUKEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBDYW5CZUNyZWF0ZWRXaXRoSXRlcmF0b3JSYW5nZSkgeworICBjb25zdCBpbnQgYVtdID0geyAxLCAyLCAzIH07CisgIGNvbnN0IHZlY3RvcjxpbnQ+IHRlc3RfdmVjdG9yKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7CisgIGNvbnN0IHZlY3RvcjxpbnQ+IGV4cGVjdGVkKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7CisgIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkLmJlZ2luKCksIGV4cGVjdGVkLmVuZCgpKSk7CisgIC8vIFBvaW50ZXJzIGFyZSBpdGVyYXRvcnMsIHRvby4KKyAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIEVsZW1lbnRzQXJlQXJyYXkoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKSk7CisgIC8vIFRoZSBlbXB0eSByYW5nZSBvZiBOVUxMIHBvaW50ZXJzIHNob3VsZCBhbHNvIGJlIG9rYXkuCisgIGludCogY29uc3QgbnVsbF9pbnQgPSBOVUxMOworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgTm90KEVsZW1lbnRzQXJlQXJyYXkobnVsbF9pbnQsIG51bGxfaW50KSkpOworICBFWFBFQ1RfVEhBVCgodmVjdG9yPGludD4oKSksIEVsZW1lbnRzQXJlQXJyYXkobnVsbF9pbnQsIG51bGxfaW50KSk7Cit9CisKKy8vIFNpbmNlIEVsZW1lbnRzQXJlKCkgYW5kIEVsZW1lbnRzQXJlQXJyYXkoKSBzaGFyZSBtdWNoIG9mIHRoZQorLy8gaW1wbGVtZW50YXRpb24sIHdlIG9ubHkgZG8gYSBzYW5pdHkgdGVzdCBmb3IgbmF0aXZlIGFycmF5cyBoZXJlLgorVEVTVChFbGVtZW50c0FyZUFycmF5VGVzdCwgV29ya3NXaXRoTmF0aXZlQXJyYXkpIHsKKyAgOjpzdGQ6OnN0cmluZyBhW10gPSB7ICJoaSIsICJobyIgfTsKKyAgOjpzdGQ6OnN0cmluZyBiW10gPSB7ICJoaSIsICJobyIgfTsKKworICBFWFBFQ1RfVEhBVChhLCBFbGVtZW50c0FyZUFycmF5KGIpKTsKKyAgRVhQRUNUX1RIQVQoYSwgRWxlbWVudHNBcmVBcnJheShiLCAyKSk7CisgIEVYUEVDVF9USEFUKGEsIE5vdChFbGVtZW50c0FyZUFycmF5KGIsIDEpKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVBcnJheVRlc3QsIFNvdXJjZUxpZmVTcGFuKSB7CisgIGNvbnN0IGludCBhW10gPSB7IDEsIDIsIDMgfTsKKyAgdmVjdG9yPGludD4gdGVzdF92ZWN0b3IoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKyAgdmVjdG9yPGludD4gZXhwZWN0KGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7CisgIEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPGludD4gbWF0Y2hlcl9tYWtlciA9CisgICAgICBFbGVtZW50c0FyZUFycmF5KGV4cGVjdC5iZWdpbigpLCBleHBlY3QuZW5kKCkpOworICBFWFBFQ1RfVEhBVCh0ZXN0X3ZlY3RvciwgbWF0Y2hlcl9tYWtlcik7CisgIC8vIENoYW5naW5nIGluIHBsYWNlIHRoZSB2YWx1ZXMgdGhhdCBpbml0aWFsaXplZCBtYXRjaGVyX21ha2VyIHNob3VsZCBub3QKKyAgLy8gYWZmZWN0IG1hdGNoZXJfbWFrZXIgYW55bW9yZS4gSXQgc2hvdWxkIGhhdmUgbWFkZSBpdHMgb3duIGNvcHkgb2YgdGhlbS4KKyAgdHlwZWRlZiB2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgSXRlcjsKKyAgZm9yIChJdGVyIGl0ID0gZXhwZWN0LmJlZ2luKCk7IGl0ICE9IGV4cGVjdC5lbmQoKTsgKytpdCkgeyAqaXQgKz0gMTA7IH0KKyAgRVhQRUNUX1RIQVQodGVzdF92ZWN0b3IsIG1hdGNoZXJfbWFrZXIpOworICB0ZXN0X3ZlY3Rvci5wdXNoX2JhY2soMyk7CisgIEVYUEVDVF9USEFUKHRlc3RfdmVjdG9yLCBOb3QobWF0Y2hlcl9tYWtlcikpOworfQorCisvLyBUZXN0cyBmb3IgdGhlIE1BVENIRVIqKCkgbWFjcm8gZmFtaWx5LgorCisvLyBUZXN0cyB0aGF0IGEgc2ltcGxlIE1BVENIRVIoKSBkZWZpbml0aW9uIHdvcmtzLgorCitNQVRDSEVSKElzRXZlbiwgIiIpIHsgcmV0dXJuIChhcmcgJSAyKSA9PSAwOyB9CisKK1RFU1QoTWF0Y2hlck1hY3JvVGVzdCwgV29ya3MpIHsKKyAgY29uc3QgTWF0Y2hlcjxpbnQ+IG0gPSBJc0V2ZW4oKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDYpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyg3KSk7CisKKyAgRVhQRUNUX0VRKCJpcyBldmVuIiwgRGVzY3JpYmUobSkpOworICBFWFBFQ1RfRVEoIm5vdCAoaXMgZXZlbikiLCBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDYpKTsKKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDcpKTsKK30KKworLy8gVGhpcyBhbHNvIHRlc3RzIHRoYXQgdGhlIGRlc2NyaXB0aW9uIHN0cmluZyBjYW4gcmVmZXJlbmNlICduZWdhdGlvbicuCitNQVRDSEVSKElzRXZlbjIsIG5lZ2F0aW9uID8gImlzIG9kZCIgOiAiaXMgZXZlbiIpIHsKKyAgaWYgKChhcmcgJSAyKSA9PSAwKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBjYW4gc3RyZWFtIHRvIHJlc3VsdF9saXN0ZW5lciwgYSBsaXN0ZW5lcgorICAgIC8vIHN1cHBsaWVkIGJ5IHRoZSBNQVRDSEVSIG1hY3JvIGltcGxpY2l0bHkuCisgICAgKnJlc3VsdF9saXN0ZW5lciA8PCAiT0siOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgICpyZXN1bHRfbGlzdGVuZXIgPDwgIiUgMiA9PSAiIDw8IChhcmcgJSAyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gVGhpcyBhbHNvIHRlc3RzIHRoYXQgdGhlIGRlc2NyaXB0aW9uIHN0cmluZyBjYW4gcmVmZXJlbmNlIG1hdGNoZXIKKy8vIHBhcmFtZXRlcnMuCitNQVRDSEVSX1AyKEVxU3VtT2YsIHgsIHksCisgICAgICAgICAgIHN0cmluZyhuZWdhdGlvbiA/ICJkb2Vzbid0IGVxdWFsIiA6ICJlcXVhbHMiKSArICIgdGhlIHN1bSBvZiAiICsKKyAgICAgICAgICAgUHJpbnRUb1N0cmluZyh4KSArICIgYW5kICIgKyBQcmludFRvU3RyaW5nKHkpKSB7CisgIGlmIChhcmcgPT0gKHggKyB5KSkgeworICAgICpyZXN1bHRfbGlzdGVuZXIgPDwgIk9LIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IHdlIGNhbiBzdHJlYW0gdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIG9mCisgICAgLy8gcmVzdWx0X2xpc3RlbmVyLgorICAgIGlmIChyZXN1bHRfbGlzdGVuZXItPnN0cmVhbSgpICE9IE5VTEwpIHsKKyAgICAgICpyZXN1bHRfbGlzdGVuZXItPnN0cmVhbSgpIDw8ICJkaWZmID09ICIgPDwgKHggKyB5IC0gYXJnKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIG1hdGNoZXIgZGVzY3JpcHRpb24gY2FuIHJlZmVyZW5jZSAnbmVnYXRpb24nIGFuZCB0aGUKKy8vIG1hdGNoZXIgcGFyYW1ldGVycy4KK1RFU1QoTWF0Y2hlck1hY3JvVGVzdCwgRGVzY3JpcHRpb25DYW5SZWZlcmVuY2VOZWdhdGlvbkFuZFBhcmFtZXRlcnMpIHsKKyAgY29uc3QgTWF0Y2hlcjxpbnQ+IG0xID0gSXNFdmVuMigpOworICBFWFBFQ1RfRVEoImlzIGV2ZW4iLCBEZXNjcmliZShtMSkpOworICBFWFBFQ1RfRVEoImlzIG9kZCIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKKworICBjb25zdCBNYXRjaGVyPGludD4gbTIgPSBFcVN1bU9mKDUsIDkpOworICBFWFBFQ1RfRVEoImVxdWFscyB0aGUgc3VtIG9mIDUgYW5kIDkiLCBEZXNjcmliZShtMikpOworICBFWFBFQ1RfRVEoImRvZXNuJ3QgZXF1YWwgdGhlIHN1bSBvZiA1IGFuZCA5IiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOworfQorCisvLyBUZXN0cyBleHBsYWluaW5nIG1hdGNoIHJlc3VsdCBpbiBhIE1BVENIRVIqIG1hY3JvLgorVEVTVChNYXRjaGVyTWFjcm9UZXN0LCBDYW5FeHBsYWluTWF0Y2hSZXN1bHQpIHsKKyAgY29uc3QgTWF0Y2hlcjxpbnQ+IG0xID0gSXNFdmVuMigpOworICBFWFBFQ1RfRVEoIk9LIiwgRXhwbGFpbihtMSwgNCkpOworICBFWFBFQ1RfRVEoIiUgMiA9PSAxIiwgRXhwbGFpbihtMSwgNSkpOworCisgIGNvbnN0IE1hdGNoZXI8aW50PiBtMiA9IEVxU3VtT2YoMSwgMik7CisgIEVYUEVDVF9FUSgiT0siLCBFeHBsYWluKG0yLCAzKSk7CisgIEVYUEVDVF9FUSgiZGlmZiA9PSAtMSIsIEV4cGxhaW4obTIsIDQpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgYm9keSBvZiBNQVRDSEVSKCkgY2FuIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiB0aGUKKy8vIHZhbHVlIGJlaW5nIG1hdGNoZWQuCisKK01BVENIRVIoSXNFbXB0eVN0cmluZywgIiIpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPCA6OnN0ZDo6c3RyaW5nLCBhcmdfdHlwZT4oKTsKKyAgcmV0dXJuIGFyZyA9PSAiIjsKK30KKworTUFUQ0hFUihJc0VtcHR5U3RyaW5nQnlSZWYsICIiKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCA6OnN0ZDo6c3RyaW5nJiwgYXJnX3R5cGU+KCk7CisgIHJldHVybiBhcmcgPT0gIiI7Cit9CisKK1RFU1QoTWF0Y2hlck1hY3JvVGVzdCwgQ2FuUmVmZXJlbmNlQXJnVHlwZSkgeworICBjb25zdCBNYXRjaGVyPCA6OnN0ZDo6c3RyaW5nPiBtMSA9IElzRW1wdHlTdHJpbmcoKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygiIikpOworCisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgOjpzdGQ6OnN0cmluZyY+IG0yID0gSXNFbXB0eVN0cmluZ0J5UmVmKCk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIiIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBNQVRDSEVSKCkgY2FuIGJlIHVzZWQgaW4gYSBuYW1lc3BhY2UuCisKK25hbWVzcGFjZSBtYXRjaGVyX3Rlc3QgeworTUFUQ0hFUihJc09kZCwgIiIpIHsgcmV0dXJuIChhcmcgJSAyKSAhPSAwOyB9Cit9ICAvLyBuYW1lc3BhY2UgbWF0Y2hlcl90ZXN0CisKK1RFU1QoTWF0Y2hlck1hY3JvVGVzdCwgV29ya3NJbk5hbWVzcGFjZSkgeworICBNYXRjaGVyPGludD4gbSA9IG1hdGNoZXJfdGVzdDo6SXNPZGQoKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyg0KSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyg1KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVmFsdWUoKSBjYW4gYmUgdXNlZCB0byBjb21wb3NlIG1hdGNoZXJzLgorTUFUQ0hFUihJc1Bvc2l0aXZlT2RkLCAiIikgeworICByZXR1cm4gVmFsdWUoYXJnLCBtYXRjaGVyX3Rlc3Q6OklzT2RkKCkpICYmIGFyZyA+IDA7Cit9CisKK1RFU1QoTWF0Y2hlck1hY3JvVGVzdCwgQ2FuQmVDb21wb3NlZFVzaW5nVmFsdWUpIHsKKyAgRVhQRUNUX1RIQVQoMywgSXNQb3NpdGl2ZU9kZCgpKTsKKyAgRVhQRUNUX1RIQVQoNCwgTm90KElzUG9zaXRpdmVPZGQoKSkpOworICBFWFBFQ1RfVEhBVCgtMSwgTm90KElzUG9zaXRpdmVPZGQoKSkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgc2ltcGxlIE1BVENIRVJfUCgpIGRlZmluaXRpb24gd29ya3MuCisKK01BVENIRVJfUChJc0dyZWF0ZXJUaGFuMzJBbmQsIG4sICIiKSB7IHJldHVybiBhcmcgPiAzMiAmJiBhcmcgPiBuOyB9CisKK1RFU1QoTWF0Y2hlclBNYWNyb1Rlc3QsIFdvcmtzKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gSXNHcmVhdGVyVGhhbjMyQW5kKDUpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMzYpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyg1KSk7CisKKyAgRVhQRUNUX0VRKCJpcyBncmVhdGVyIHRoYW4gMzIgYW5kIDUiLCBEZXNjcmliZShtKSk7CisgIEVYUEVDVF9FUSgibm90IChpcyBncmVhdGVyIHRoYW4gMzIgYW5kIDUpIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCAzNikpOworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgNSkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBkZXNjcmlwdGlvbiBpcyBjYWxjdWxhdGVkIGNvcnJlY3RseSBmcm9tIHRoZSBtYXRjaGVyIG5hbWUuCitNQVRDSEVSX1AoX2lzX0dyZWF0ZXJfVGhhbjMyYW5kXywgbiwgIiIpIHsgcmV0dXJuIGFyZyA+IDMyICYmIGFyZyA+IG47IH0KKworVEVTVChNYXRjaGVyUE1hY3JvVGVzdCwgR2VuZXJhdGVzQ29ycmVjdERlc2NyaXB0aW9uKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gX2lzX0dyZWF0ZXJfVGhhbjMyYW5kXyg1KTsKKworICBFWFBFQ1RfRVEoImlzIGdyZWF0ZXIgdGhhbiAzMiBhbmQgNSIsIERlc2NyaWJlKG0pKTsKKyAgRVhQRUNUX0VRKCJub3QgKGlzIGdyZWF0ZXIgdGhhbiAzMiBhbmQgNSkiLCBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDM2KSk7CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCA1KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBNQVRDSEVSX1AgbWF0Y2hlciBjYW4gYmUgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gYSByZWZlcmVuY2UgcGFyYW1ldGVyIHR5cGUuCisKK2NsYXNzIFVuY29weWFibGVGb28geworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5jb3B5YWJsZUZvbyhjaGFyIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKyBwcml2YXRlOgorICBVbmNvcHlhYmxlRm9vKGNvbnN0IFVuY29weWFibGVGb28mKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVW5jb3B5YWJsZUZvbyYpOworCisgIGNoYXIgdmFsdWVfOworfTsKKworTUFUQ0hFUl9QKFJlZmVyZW5jZXNVbmNvcHlhYmxlLCB2YXJpYWJsZSwgIiIpIHsgcmV0dXJuICZhcmcgPT0gJnZhcmlhYmxlOyB9CisKK1RFU1QoTWF0Y2hlclBNYWNyb1Rlc3QsIFdvcmtzV2hlbkV4cGxpY2l0bHlJbnN0YW50aWF0ZWRXaXRoUmVmZXJlbmNlKSB7CisgIFVuY29weWFibGVGb28gZm9vMSgnMScpLCBmb28yKCcyJyk7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgVW5jb3B5YWJsZUZvbyY+IG0gPQorICAgICAgUmVmZXJlbmNlc1VuY29weWFibGU8Y29uc3QgVW5jb3B5YWJsZUZvbyY+KGZvbzEpOworCisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhmb28xKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoZm9vMikpOworCisgIC8vIFdlIGRvbid0IHdhbnQgdGhlIGFkZHJlc3Mgb2YgdGhlIHBhcmFtZXRlciBwcmludGVkLCBhcyBtb3N0CisgIC8vIGxpa2VseSBpdCB3aWxsIGp1c3QgYW5ub3kgdGhlIHVzZXIuICBJZiB0aGUgYWRkcmVzcyBpcworICAvLyBpbnRlcmVzdGluZywgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHBhc3NpbmcgdGhlIHBhcmFtZXRlciBieQorICAvLyBwb2ludGVyIGluc3RlYWQuCisgIEVYUEVDVF9FUSgicmVmZXJlbmNlcyB1bmNvcHlhYmxlIDEtYnl0ZSBvYmplY3QgPDMxPiIsIERlc2NyaWJlKG0pKTsKK30KKworCisvLyBUZXN0cyB0aGF0IHRoZSBib2R5IG9mIE1BVENIRVJfUG4oKSBjYW4gcmVmZXJlbmNlIHRoZSBwYXJhbWV0ZXIKKy8vIHR5cGVzLgorCitNQVRDSEVSX1AzKFBhcmFtVHlwZXNBcmVJbnRMb25nQW5kQ2hhciwgZm9vLCBiYXIsIGJheiwgIiIpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCwgZm9vX3R5cGU+KCk7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxsb25nLCBiYXJfdHlwZT4oKTsgIC8vIE5PTElOVAorICBTdGF0aWNBc3NlcnRUeXBlRXE8Y2hhciwgYmF6X3R5cGU+KCk7CisgIHJldHVybiBhcmcgPT0gMDsKK30KKworVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsIENhblJlZmVyZW5jZVBhcmFtVHlwZXMpIHsKKyAgRVhQRUNUX1RIQVQoMCwgUGFyYW1UeXBlc0FyZUludExvbmdBbmRDaGFyKDEwLCAyMEwsICdhJykpOworfQorCisvLyBUZXN0cyB0aGF0IGEgTUFUQ0hFUl9QbiBtYXRjaGVyIGNhbiBiZSBleHBsaWNpdGx5IGluc3RhbnRpYXRlZCB3aXRoCisvLyByZWZlcmVuY2UgcGFyYW1ldGVyIHR5cGVzLgorCitNQVRDSEVSX1AyKFJlZmVyZW5jZXNBbnlPZiwgdmFyaWFibGUxLCB2YXJpYWJsZTIsICIiKSB7CisgIHJldHVybiAmYXJnID09ICZ2YXJpYWJsZTEgfHwgJmFyZyA9PSAmdmFyaWFibGUyOworfQorCitURVNUKE1hdGNoZXJQbk1hY3JvVGVzdCwgV29ya3NXaGVuRXhwbGljaXRseUluc3RhbnRpYXRlZFdpdGhSZWZlcmVuY2VzKSB7CisgIFVuY29weWFibGVGb28gZm9vMSgnMScpLCBmb28yKCcyJyksIGZvbzMoJzMnKTsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBVbmNvcHlhYmxlRm9vJj4gbSA9CisgICAgICBSZWZlcmVuY2VzQW55T2Y8Y29uc3QgVW5jb3B5YWJsZUZvbyYsIGNvbnN0IFVuY29weWFibGVGb28mPihmb28xLCBmb28yKTsKKworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoZm9vMSkpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoZm9vMikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGZvbzMpKTsKK30KKworVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsCisgICAgIEdlbmVyYXRlc0NvcnJldERlc2NyaXB0aW9uV2hlbkV4cGxpY2l0bHlJbnN0YW50aWF0ZWRXaXRoUmVmZXJlbmNlcykgeworICBVbmNvcHlhYmxlRm9vIGZvbzEoJzEnKSwgZm9vMignMicpOworICBjb25zdCBNYXRjaGVyPGNvbnN0IFVuY29weWFibGVGb28mPiBtID0KKyAgICAgIFJlZmVyZW5jZXNBbnlPZjxjb25zdCBVbmNvcHlhYmxlRm9vJiwgY29uc3QgVW5jb3B5YWJsZUZvbyY+KGZvbzEsIGZvbzIpOworCisgIC8vIFdlIGRvbid0IHdhbnQgdGhlIGFkZHJlc3NlcyBvZiB0aGUgcGFyYW1ldGVycyBwcmludGVkLCBhcyBtb3N0CisgIC8vIGxpa2VseSB0aGV5IHdpbGwganVzdCBhbm5veSB0aGUgdXNlci4gIElmIHRoZSBhZGRyZXNzZXMgYXJlCisgIC8vIGludGVyZXN0aW5nLCB0aGUgdXNlciBzaG91bGQgY29uc2lkZXIgcGFzc2luZyB0aGUgcGFyYW1ldGVycyBieQorICAvLyBwb2ludGVycyBpbnN0ZWFkLgorICBFWFBFQ1RfRVEoInJlZmVyZW5jZXMgYW55IG9mICgxLWJ5dGUgb2JqZWN0IDwzMT4sIDEtYnl0ZSBvYmplY3QgPDMyPikiLAorICAgICAgICAgICAgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgc2ltcGxlIE1BVENIRVJfUDIoKSBkZWZpbml0aW9uIHdvcmtzLgorCitNQVRDSEVSX1AyKElzTm90SW5DbG9zZWRSYW5nZSwgbG93LCBoaSwgIiIpIHsgcmV0dXJuIGFyZyA8IGxvdyB8fCBhcmcgPiBoaTsgfQorCitURVNUKE1hdGNoZXJQbk1hY3JvVGVzdCwgV29ya3MpIHsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBsb25nJj4gbSA9IElzTm90SW5DbG9zZWRSYW5nZSgxMCwgMjApOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygzNkwpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygxNUwpKTsKKworICBFWFBFQ1RfRVEoImlzIG5vdCBpbiBjbG9zZWQgcmFuZ2UgKDEwLCAyMCkiLCBEZXNjcmliZShtKSk7CisgIEVYUEVDVF9FUSgibm90IChpcyBub3QgaW4gY2xvc2VkIHJhbmdlICgxMCwgMjApKSIsIERlc2NyaWJlTmVnYXRpb24obSkpOworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgMzZMKSk7CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCAxNUwpKTsKK30KKworLy8gVGVzdHMgdGhhdCBNQVRDSEVSKigpIGRlZmluaXRpb25zIGNhbiBiZSBvdmVybG9hZGVkIG9uIHRoZSBudW1iZXIKKy8vIG9mIHBhcmFtZXRlcnM7IGFsc28gdGVzdHMgTUFUQ0hFUl9QbigpIHdoZXJlIG4gPj0gMy4KKworTUFUQ0hFUihFcXVhbHNTdW1PZiwgIiIpIHsgcmV0dXJuIGFyZyA9PSAwOyB9CitNQVRDSEVSX1AoRXF1YWxzU3VtT2YsIGEsICIiKSB7IHJldHVybiBhcmcgPT0gYTsgfQorTUFUQ0hFUl9QMihFcXVhbHNTdW1PZiwgYSwgYiwgIiIpIHsgcmV0dXJuIGFyZyA9PSBhICsgYjsgfQorTUFUQ0hFUl9QMyhFcXVhbHNTdW1PZiwgYSwgYiwgYywgIiIpIHsgcmV0dXJuIGFyZyA9PSBhICsgYiArIGM7IH0KK01BVENIRVJfUDQoRXF1YWxzU3VtT2YsIGEsIGIsIGMsIGQsICIiKSB7IHJldHVybiBhcmcgPT0gYSArIGIgKyBjICsgZDsgfQorTUFUQ0hFUl9QNShFcXVhbHNTdW1PZiwgYSwgYiwgYywgZCwgZSwgIiIpIHsgcmV0dXJuIGFyZyA9PSBhICsgYiArIGMgKyBkICsgZTsgfQorTUFUQ0hFUl9QNihFcXVhbHNTdW1PZiwgYSwgYiwgYywgZCwgZSwgZiwgIiIpIHsKKyAgcmV0dXJuIGFyZyA9PSBhICsgYiArIGMgKyBkICsgZSArIGY7Cit9CitNQVRDSEVSX1A3KEVxdWFsc1N1bU9mLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCAiIikgeworICByZXR1cm4gYXJnID09IGEgKyBiICsgYyArIGQgKyBlICsgZiArIGc7Cit9CitNQVRDSEVSX1A4KEVxdWFsc1N1bU9mLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCAiIikgeworICByZXR1cm4gYXJnID09IGEgKyBiICsgYyArIGQgKyBlICsgZiArIGcgKyBoOworfQorTUFUQ0hFUl9QOShFcXVhbHNTdW1PZiwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgIiIpIHsKKyAgcmV0dXJuIGFyZyA9PSBhICsgYiArIGMgKyBkICsgZSArIGYgKyBnICsgaCArIGk7Cit9CitNQVRDSEVSX1AxMChFcXVhbHNTdW1PZiwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgIiIpIHsKKyAgcmV0dXJuIGFyZyA9PSBhICsgYiArIGMgKyBkICsgZSArIGYgKyBnICsgaCArIGkgKyBqOworfQorCitURVNUKE1hdGNoZXJQbk1hY3JvVGVzdCwgQ2FuQmVPdmVybG9hZGVkT25OdW1iZXJPZlBhcmFtZXRlcnMpIHsKKyAgRVhQRUNUX1RIQVQoMCwgRXF1YWxzU3VtT2YoKSk7CisgIEVYUEVDVF9USEFUKDEsIEVxdWFsc1N1bU9mKDEpKTsKKyAgRVhQRUNUX1RIQVQoMTIsIEVxdWFsc1N1bU9mKDEwLCAyKSk7CisgIEVYUEVDVF9USEFUKDEyMywgRXF1YWxzU3VtT2YoMTAwLCAyMCwgMykpOworICBFWFBFQ1RfVEhBVCgxMjM0LCBFcXVhbHNTdW1PZigxMDAwLCAyMDAsIDMwLCA0KSk7CisgIEVYUEVDVF9USEFUKDEyMzQ1LCBFcXVhbHNTdW1PZigxMDAwMCwgMjAwMCwgMzAwLCA0MCwgNSkpOworICBFWFBFQ1RfVEhBVCgiYWJjZGVmIiwKKyAgICAgICAgICAgICAgRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAnYicsICdjJywgImQiLCAiZSIsICdmJykpOworICBFWFBFQ1RfVEhBVCgiYWJjZGVmZyIsCisgICAgICAgICAgICAgIEVxdWFsc1N1bU9mKDo6c3RkOjpzdHJpbmcoImEiKSwgJ2InLCAnYycsICJkIiwgImUiLCAnZicsICdnJykpOworICBFWFBFQ1RfVEhBVCgiYWJjZGVmZ2giLAorICAgICAgICAgICAgICBFcXVhbHNTdW1PZig6OnN0ZDo6c3RyaW5nKCJhIiksICdiJywgJ2MnLCAiZCIsICJlIiwgJ2YnLCAnZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJoIikpOworICBFWFBFQ1RfVEhBVCgiYWJjZGVmZ2hpIiwKKyAgICAgICAgICAgICAgRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAnYicsICdjJywgImQiLCAiZSIsICdmJywgJ2cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaCIsICdpJykpOworICBFWFBFQ1RfVEhBVCgiYWJjZGVmZ2hpaiIsCisgICAgICAgICAgICAgIEVxdWFsc1N1bU9mKDo6c3RkOjpzdHJpbmcoImEiKSwgJ2InLCAnYycsICJkIiwgImUiLCAnZicsICdnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImgiLCAnaScsIDo6c3RkOjpzdHJpbmcoImoiKSkpOworCisgIEVYUEVDVF9USEFUKDEsIE5vdChFcXVhbHNTdW1PZigpKSk7CisgIEVYUEVDVF9USEFUKC0xLCBOb3QoRXF1YWxzU3VtT2YoMSkpKTsKKyAgRVhQRUNUX1RIQVQoLTEyLCBOb3QoRXF1YWxzU3VtT2YoMTAsIDIpKSk7CisgIEVYUEVDVF9USEFUKC0xMjMsIE5vdChFcXVhbHNTdW1PZigxMDAsIDIwLCAzKSkpOworICBFWFBFQ1RfVEhBVCgtMTIzNCwgTm90KEVxdWFsc1N1bU9mKDEwMDAsIDIwMCwgMzAsIDQpKSk7CisgIEVYUEVDVF9USEFUKC0xMjM0NSwgTm90KEVxdWFsc1N1bU9mKDEwMDAwLCAyMDAwLCAzMDAsIDQwLCA1KSkpOworICBFWFBFQ1RfVEhBVCgiYWJjZGVmICIsCisgICAgICAgICAgICAgIE5vdChFcXVhbHNTdW1PZig6OnN0ZDo6c3RyaW5nKCJhIiksICdiJywgJ2MnLCAiZCIsICJlIiwgJ2YnKSkpOworICBFWFBFQ1RfVEhBVCgiYWJjZGVmZyAiLAorICAgICAgICAgICAgICBOb3QoRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAnYicsICdjJywgImQiLCAiZSIsICdmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJykpKTsKKyAgRVhQRUNUX1RIQVQoImFiY2RlZmdoICIsCisgICAgICAgICAgICAgIE5vdChFcXVhbHNTdW1PZig6OnN0ZDo6c3RyaW5nKCJhIiksICdiJywgJ2MnLCAiZCIsICJlIiwgJ2YnLCAnZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaCIpKSk7CisgIEVYUEVDVF9USEFUKCJhYmNkZWZnaGkgIiwKKyAgICAgICAgICAgICAgTm90KEVxdWFsc1N1bU9mKDo6c3RkOjpzdHJpbmcoImEiKSwgJ2InLCAnYycsICJkIiwgImUiLCAnZicsICdnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoIiwgJ2knKSkpOworICBFWFBFQ1RfVEhBVCgiYWJjZGVmZ2hpaiAiLAorICAgICAgICAgICAgICBOb3QoRXF1YWxzU3VtT2YoOjpzdGQ6OnN0cmluZygiYSIpLCAnYicsICdjJywgImQiLCAiZSIsICdmJywgJ2cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImgiLCAnaScsIDo6c3RkOjpzdHJpbmcoImoiKSkpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIE1BVENIRVJfUG4oKSBkZWZpbml0aW9uIGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhbnkKKy8vIGNvbXBhdGlibGUgcGFyYW1ldGVyIHR5cGVzLgorVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsIFdvcmtzRm9yRGlmZmVyZW50UGFyYW1ldGVyVHlwZXMpIHsKKyAgRVhQRUNUX1RIQVQoMTIzLCBFcXVhbHNTdW1PZigxMDBMLCAyMCwgc3RhdGljX2Nhc3Q8Y2hhcj4oMykpKTsKKyAgRVhQRUNUX1RIQVQoImFiY2QiLCBFcXVhbHNTdW1PZig6OnN0ZDo6c3RyaW5nKCJhIiksICJiIiwgJ2MnLCAiZCIpKTsKKworICBFWFBFQ1RfVEhBVCgxMjQsIE5vdChFcXVhbHNTdW1PZigxMDBMLCAyMCwgc3RhdGljX2Nhc3Q8Y2hhcj4oMykpKSk7CisgIEVYUEVDVF9USEFUKCJhYmNkZSIsIE5vdChFcXVhbHNTdW1PZig6OnN0ZDo6c3RyaW5nKCJhIiksICJiIiwgJ2MnLCAiZCIpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIG1hdGNoZXIgYm9keSBjYW4gcHJvbW90ZSB0aGUgcGFyYW1ldGVyIHR5cGVzLgorCitNQVRDSEVSX1AyKEVxQ29uY2F0LCBwcmVmaXgsIHN1ZmZpeCwgIiIpIHsKKyAgLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwcm9tb3RlIHRoZSB0d28gcGFyYW1ldGVycyB0byBkZXNpcmVkIHR5cGVzLgorICBzdGQ6OnN0cmluZyBwcmVmaXhfc3RyKHByZWZpeCk7CisgIGNoYXIgc3VmZml4X2NoYXIgPSBzdGF0aWNfY2FzdDxjaGFyPihzdWZmaXgpOworICByZXR1cm4gYXJnID09IHByZWZpeF9zdHIgKyBzdWZmaXhfY2hhcjsKK30KKworVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsIFNpbXBsZVR5cGVQcm9tb3Rpb24pIHsKKyAgTWF0Y2hlcjxzdGQ6OnN0cmluZz4gbm9fcHJvbW8gPQorICAgICAgRXFDb25jYXQoc3RkOjpzdHJpbmcoImZvbyIpLCAndCcpOworICBNYXRjaGVyPGNvbnN0IHN0ZDo6c3RyaW5nJj4gcHJvbW8gPQorICAgICAgRXFDb25jYXQoImZvbyIsIHN0YXRpY19jYXN0PGludD4oJ3QnKSk7CisgIEVYUEVDVF9GQUxTRShub19wcm9tby5NYXRjaGVzKCJmb29sIikpOworICBFWFBFQ1RfRkFMU0UocHJvbW8uTWF0Y2hlcygiZm9vbCIpKTsKKyAgRVhQRUNUX1RSVUUobm9fcHJvbW8uTWF0Y2hlcygiZm9vdCIpKTsKKyAgRVhQRUNUX1RSVUUocHJvbW8uTWF0Y2hlcygiZm9vdCIpKTsKK30KKworLy8gVmVyaWZpZXMgdGhlIHR5cGUgb2YgYSBNQVRDSEVSKi4KKworVEVTVChNYXRjaGVyUG5NYWNyb1Rlc3QsIFR5cGVzQXJlQ29ycmVjdCkgeworICAvLyBFcXVhbHNTdW1PZigpIG11c3QgYmUgYXNzaWduYWJsZSB0byBhIEVxdWFsc1N1bU9mTWF0Y2hlciB2YXJpYWJsZS4KKyAgRXF1YWxzU3VtT2ZNYXRjaGVyIGEwID0gRXF1YWxzU3VtT2YoKTsKKworICAvLyBFcXVhbHNTdW1PZigxKSBtdXN0IGJlIGFzc2lnbmFibGUgdG8gYSBFcXVhbHNTdW1PZk1hdGNoZXJQIHZhcmlhYmxlLgorICBFcXVhbHNTdW1PZk1hdGNoZXJQPGludD4gYTEgPSBFcXVhbHNTdW1PZigxKTsKKworICAvLyBFcXVhbHNTdW1PZihwMSwgLi4uLCBwaykgbXVzdCBiZSBhc3NpZ25hYmxlIHRvIGEgRXF1YWxzU3VtT2ZNYXRjaGVyUGsKKyAgLy8gdmFyaWFibGUsIGFuZCBzbyBvbi4KKyAgRXF1YWxzU3VtT2ZNYXRjaGVyUDI8aW50LCBjaGFyPiBhMiA9IEVxdWFsc1N1bU9mKDEsICcyJyk7CisgIEVxdWFsc1N1bU9mTWF0Y2hlclAzPGludCwgaW50LCBjaGFyPiBhMyA9IEVxdWFsc1N1bU9mKDEsIDIsICczJyk7CisgIEVxdWFsc1N1bU9mTWF0Y2hlclA0PGludCwgaW50LCBpbnQsIGNoYXI+IGE0ID0gRXF1YWxzU3VtT2YoMSwgMiwgMywgJzQnKTsKKyAgRXF1YWxzU3VtT2ZNYXRjaGVyUDU8aW50LCBpbnQsIGludCwgaW50LCBjaGFyPiBhNSA9CisgICAgICBFcXVhbHNTdW1PZigxLCAyLCAzLCA0LCAnNScpOworICBFcXVhbHNTdW1PZk1hdGNoZXJQNjxpbnQsIGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTYgPQorICAgICAgRXF1YWxzU3VtT2YoMSwgMiwgMywgNCwgNSwgJzYnKTsKKyAgRXF1YWxzU3VtT2ZNYXRjaGVyUDc8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTcgPQorICAgICAgRXF1YWxzU3VtT2YoMSwgMiwgMywgNCwgNSwgNiwgJzcnKTsKKyAgRXF1YWxzU3VtT2ZNYXRjaGVyUDg8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBjaGFyPiBhOCA9CisgICAgICBFcXVhbHNTdW1PZigxLCAyLCAzLCA0LCA1LCA2LCA3LCAnOCcpOworICBFcXVhbHNTdW1PZk1hdGNoZXJQOTxpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgY2hhcj4gYTkgPQorICAgICAgRXF1YWxzU3VtT2YoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgJzknKTsKKyAgRXF1YWxzU3VtT2ZNYXRjaGVyUDEwPGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGNoYXI+IGExMCA9CisgICAgICBFcXVhbHNTdW1PZigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAnMCcpOworCisgIC8vIEF2b2lkICJ1bnVzZWQgdmFyaWFibGUiIHdhcm5pbmdzLgorICAodm9pZClhMDsKKyAgKHZvaWQpYTE7CisgICh2b2lkKWEyOworICAodm9pZClhMzsKKyAgKHZvaWQpYTQ7CisgICh2b2lkKWE1OworICAodm9pZClhNjsKKyAgKHZvaWQpYTc7CisgICh2b2lkKWE4OworICAodm9pZClhOTsKKyAgKHZvaWQpYTEwOworfQorCisvLyBUZXN0cyB0aGF0IG1hdGNoZXItdHlwZWQgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCBpbiBWYWx1ZSgpIGluc2lkZSBhCisvLyBNQVRDSEVSX1BuIGRlZmluaXRpb24uCisKKy8vIFN1Y2NlZWRzIGlmIGFyZyBtYXRjaGVzIGV4YWN0bHkgMiBvZiB0aGUgMyBtYXRjaGVycy4KK01BVENIRVJfUDMoVHdvT2YsIG0xLCBtMiwgbTMsICIiKSB7CisgIGNvbnN0IGludCBjb3VudCA9IHN0YXRpY19jYXN0PGludD4oVmFsdWUoYXJnLCBtMSkpCisgICAgICArIHN0YXRpY19jYXN0PGludD4oVmFsdWUoYXJnLCBtMikpICsgc3RhdGljX2Nhc3Q8aW50PihWYWx1ZShhcmcsIG0zKSk7CisgIHJldHVybiBjb3VudCA9PSAyOworfQorCitURVNUKE1hdGNoZXJQbk1hY3JvVGVzdCwgQ2FuVXNlTWF0Y2hlclR5cGVkUGFyYW1ldGVySW5WYWx1ZSkgeworICBFWFBFQ1RfVEhBVCg0MiwgVHdvT2YoR3QoMCksIEx0KDUwKSwgRXEoMTApKSk7CisgIEVYUEVDVF9USEFUKDAsIE5vdChUd29PZihHdCgtMSksIEx0KDEpLCBFcSgwKSkpKTsKK30KKworLy8gVGVzdHMgQ29udGFpbnMoKS4KKworVEVTVChDb250YWluc1Rlc3QsIExpc3RNYXRjaGVzV2hlbkVsZW1lbnRJc0luQ29udGFpbmVyKSB7CisgIGxpc3Q8aW50PiBzb21lX2xpc3Q7CisgIHNvbWVfbGlzdC5wdXNoX2JhY2soMyk7CisgIHNvbWVfbGlzdC5wdXNoX2JhY2soMSk7CisgIHNvbWVfbGlzdC5wdXNoX2JhY2soMik7CisgIEVYUEVDVF9USEFUKHNvbWVfbGlzdCwgQ29udGFpbnMoMSkpOworICBFWFBFQ1RfVEhBVChzb21lX2xpc3QsIENvbnRhaW5zKEd0KDIuNSkpKTsKKyAgRVhQRUNUX1RIQVQoc29tZV9saXN0LCBDb250YWlucyhFcSgyLjBmKSkpOworCisgIGxpc3Q8c3RyaW5nPiBhbm90aGVyX2xpc3Q7CisgIGFub3RoZXJfbGlzdC5wdXNoX2JhY2soImZlZSIpOworICBhbm90aGVyX2xpc3QucHVzaF9iYWNrKCJmaWUiKTsKKyAgYW5vdGhlcl9saXN0LnB1c2hfYmFjaygiZm9lIik7CisgIGFub3RoZXJfbGlzdC5wdXNoX2JhY2soImZ1bSIpOworICBFWFBFQ1RfVEhBVChhbm90aGVyX2xpc3QsIENvbnRhaW5zKHN0cmluZygiZmVlIikpKTsKK30KKworVEVTVChDb250YWluc1Rlc3QsIExpc3REb2VzTm90TWF0Y2hXaGVuRWxlbWVudElzTm90SW5Db250YWluZXIpIHsKKyAgbGlzdDxpbnQ+IHNvbWVfbGlzdDsKKyAgc29tZV9saXN0LnB1c2hfYmFjaygzKTsKKyAgc29tZV9saXN0LnB1c2hfYmFjaygxKTsKKyAgRVhQRUNUX1RIQVQoc29tZV9saXN0LCBOb3QoQ29udGFpbnMoNCkpKTsKK30KKworVEVTVChDb250YWluc1Rlc3QsIFNldE1hdGNoZXNXaGVuRWxlbWVudElzSW5Db250YWluZXIpIHsKKyAgc2V0PGludD4gc29tZV9zZXQ7CisgIHNvbWVfc2V0Lmluc2VydCgzKTsKKyAgc29tZV9zZXQuaW5zZXJ0KDEpOworICBzb21lX3NldC5pbnNlcnQoMik7CisgIEVYUEVDVF9USEFUKHNvbWVfc2V0LCBDb250YWlucyhFcSgxLjApKSk7CisgIEVYUEVDVF9USEFUKHNvbWVfc2V0LCBDb250YWlucyhFcSgzLjBmKSkpOworICBFWFBFQ1RfVEhBVChzb21lX3NldCwgQ29udGFpbnMoMikpOworCisgIHNldDxjb25zdCBjaGFyKj4gYW5vdGhlcl9zZXQ7CisgIGFub3RoZXJfc2V0Lmluc2VydCgiZmVlIik7CisgIGFub3RoZXJfc2V0Lmluc2VydCgiZmllIik7CisgIGFub3RoZXJfc2V0Lmluc2VydCgiZm9lIik7CisgIGFub3RoZXJfc2V0Lmluc2VydCgiZnVtIik7CisgIEVYUEVDVF9USEFUKGFub3RoZXJfc2V0LCBDb250YWlucyhFcShzdHJpbmcoImZ1bSIpKSkpOworfQorCitURVNUKENvbnRhaW5zVGVzdCwgU2V0RG9lc05vdE1hdGNoV2hlbkVsZW1lbnRJc05vdEluQ29udGFpbmVyKSB7CisgIHNldDxpbnQ+IHNvbWVfc2V0OworICBzb21lX3NldC5pbnNlcnQoMyk7CisgIHNvbWVfc2V0Lmluc2VydCgxKTsKKyAgRVhQRUNUX1RIQVQoc29tZV9zZXQsIE5vdChDb250YWlucyg0KSkpOworCisgIHNldDxjb25zdCBjaGFyKj4gY19zdHJpbmdfc2V0OworICBjX3N0cmluZ19zZXQuaW5zZXJ0KCJoZWxsbyIpOworICBFWFBFQ1RfVEhBVChjX3N0cmluZ19zZXQsIE5vdChDb250YWlucyhzdHJpbmcoImhlbGxvIikuY19zdHIoKSkpKTsKK30KKworVEVTVChDb250YWluc1Rlc3QsIEV4cGxhaW5zTWF0Y2hSZXN1bHRDb3JyZWN0bHkpIHsKKyAgY29uc3QgaW50IGFbMl0gPSB7IDEsIDIgfTsKKyAgTWF0Y2hlcjxjb25zdCBpbnQgKCYpWzJdPiBtID0gQ29udGFpbnMoMik7CisgIEVYUEVDVF9FUSgid2hvc2UgZWxlbWVudCAjMSBtYXRjaGVzIiwgRXhwbGFpbihtLCBhKSk7CisKKyAgbSA9IENvbnRhaW5zKDMpOworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgYSkpOworCisgIG0gPSBDb250YWlucyhHcmVhdGVyVGhhbigwKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZWxlbWVudCAjMCBtYXRjaGVzLCB3aGljaCBpcyAxIG1vcmUgdGhhbiAwIiwgRXhwbGFpbihtLCBhKSk7CisKKyAgbSA9IENvbnRhaW5zKEdyZWF0ZXJUaGFuKDEwKSk7CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCBhKSk7Cit9CisKK1RFU1QoQ29udGFpbnNUZXN0LCBEZXNjcmliZXNJdHNlbGZDb3JyZWN0bHkpIHsKKyAgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0gPSBDb250YWlucygxKTsKKyAgRVhQRUNUX0VRKCJjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCB0aGF0IGlzIGVxdWFsIHRvIDEiLCBEZXNjcmliZShtKSk7CisKKyAgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0yID0gTm90KG0pOworICBFWFBFQ1RfRVEoImRvZXNuJ3QgY29udGFpbiBhbnkgZWxlbWVudCB0aGF0IGlzIGVxdWFsIHRvIDEiLCBEZXNjcmliZShtMikpOworfQorCitURVNUKENvbnRhaW5zVGVzdCwgTWFwTWF0Y2hlc1doZW5FbGVtZW50SXNJbkNvbnRhaW5lcikgeworICBtYXA8Y29uc3QgY2hhciosIGludD4gbXlfbWFwOworICBjb25zdCBjaGFyKiBiYXIgPSAiYSBzdHJpbmciOworICBteV9tYXBbYmFyXSA9IDI7CisgIEVYUEVDVF9USEFUKG15X21hcCwgQ29udGFpbnMocGFpcjxjb25zdCBjaGFyKiBjb25zdCwgaW50PihiYXIsIDIpKSk7CisKKyAgbWFwPHN0cmluZywgaW50PiBhbm90aGVyX21hcDsKKyAgYW5vdGhlcl9tYXBbImZlZSJdID0gMTsKKyAgYW5vdGhlcl9tYXBbImZpZSJdID0gMjsKKyAgYW5vdGhlcl9tYXBbImZvZSJdID0gMzsKKyAgYW5vdGhlcl9tYXBbImZ1bSJdID0gNDsKKyAgRVhQRUNUX1RIQVQoYW5vdGhlcl9tYXAsIENvbnRhaW5zKHBhaXI8Y29uc3Qgc3RyaW5nLCBpbnQ+KHN0cmluZygiZmVlIiksIDEpKSk7CisgIEVYUEVDVF9USEFUKGFub3RoZXJfbWFwLCBDb250YWlucyhwYWlyPGNvbnN0IHN0cmluZywgaW50PigiZmllIiwgMikpKTsKK30KKworVEVTVChDb250YWluc1Rlc3QsIE1hcERvZXNOb3RNYXRjaFdoZW5FbGVtZW50SXNOb3RJbkNvbnRhaW5lcikgeworICBtYXA8aW50LCBpbnQ+IHNvbWVfbWFwOworICBzb21lX21hcFsxXSA9IDExOworICBzb21lX21hcFsyXSA9IDIyOworICBFWFBFQ1RfVEhBVChzb21lX21hcCwgTm90KENvbnRhaW5zKHBhaXI8Y29uc3QgaW50LCBpbnQ+KDIsIDIzKSkpKTsKK30KKworVEVTVChDb250YWluc1Rlc3QsIEFycmF5TWF0Y2hlc1doZW5FbGVtZW50SXNJbkNvbnRhaW5lcikgeworICBjb25zdCBjaGFyKiBzdHJpbmdfYXJyYXlbXSA9IHsgImZlZSIsICJmaWUiLCAiZm9lIiwgImZ1bSIgfTsKKyAgRVhQRUNUX1RIQVQoc3RyaW5nX2FycmF5LCBDb250YWlucyhFcShzdHJpbmcoImZ1bSIpKSkpOworfQorCitURVNUKENvbnRhaW5zVGVzdCwgQXJyYXlEb2VzTm90TWF0Y2hXaGVuRWxlbWVudElzTm90SW5Db250YWluZXIpIHsKKyAgaW50IGludF9hcnJheVtdID0geyAxLCAyLCAzLCA0IH07CisgIEVYUEVDVF9USEFUKGludF9hcnJheSwgTm90KENvbnRhaW5zKDUpKSk7Cit9CisKK1RFU1QoQ29udGFpbnNUZXN0LCBBY2NlcHRzTWF0Y2hlcikgeworICBjb25zdCBpbnQgYVtdID0geyAxLCAyLCAzIH07CisgIEVYUEVDVF9USEFUKGEsIENvbnRhaW5zKEd0KDIpKSk7CisgIEVYUEVDVF9USEFUKGEsIE5vdChDb250YWlucyhHdCg0KSkpKTsKK30KKworVEVTVChDb250YWluc1Rlc3QsIFdvcmtzRm9yTmF0aXZlQXJyYXlBc1R1cGxlKSB7CisgIGNvbnN0IGludCBhW10gPSB7IDEsIDIgfTsKKyAgY29uc3QgaW50KiBjb25zdCBwb2ludGVyID0gYTsKKyAgRVhQRUNUX1RIQVQobWFrZV90dXBsZShwb2ludGVyLCAyKSwgQ29udGFpbnMoMSkpOworICBFWFBFQ1RfVEhBVChtYWtlX3R1cGxlKHBvaW50ZXIsIDIpLCBOb3QoQ29udGFpbnMoR3QoMykpKSk7Cit9CisKK1RFU1QoQ29udGFpbnNUZXN0LCBXb3Jrc0ZvclR3b0RpbWVuc2lvbmFsTmF0aXZlQXJyYXkpIHsKKyAgaW50IGFbXVszXSA9IHsgeyAxLCAyLCAzIH0sIHsgNCwgNSwgNiB9IH07CisgIEVYUEVDVF9USEFUKGEsIENvbnRhaW5zKEVsZW1lbnRzQXJlKDQsIDUsIDYpKSk7CisgIEVYUEVDVF9USEFUKGEsIENvbnRhaW5zKENvbnRhaW5zKDUpKSk7CisgIEVYUEVDVF9USEFUKGEsIE5vdChDb250YWlucyhFbGVtZW50c0FyZSgzLCA0LCA1KSkpKTsKKyAgRVhQRUNUX1RIQVQoYSwgQ29udGFpbnMoTm90KENvbnRhaW5zKDUpKSkpOworfQorCitURVNUKEFsbE9mVGVzdCwgSHVnZU1hdGNoZXIpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgdXNpbmcgQWxsT2Ygd2l0aCBtYW55IGFyZ3VtZW50cyBkb2Vzbid0IGNhdXNlCisgIC8vIHRoZSBjb21waWxlciB0byBleGNlZWQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBkZXB0aCBsaW1pdC4KKyAgRVhQRUNUX1RIQVQoMCwgdGVzdGluZzo6QWxsT2YoXywgXywgXywgXywgXywgXywgXywgXywgXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6QWxsT2YoXywgXywgXywgXywgXywgXywgXywgXywgXywgXykpKTsKK30KKworVEVTVChBbnlPZlRlc3QsIEh1Z2VNYXRjaGVyKSB7CisgIC8vIFZlcmlmeSB0aGF0IHVzaW5nIEFueU9mIHdpdGggbWFueSBhcmd1bWVudHMgZG9lc24ndCBjYXVzZQorICAvLyB0aGUgY29tcGlsZXIgdG8gZXhjZWVkIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gZGVwdGggbGltaXQuCisgIEVYUEVDVF9USEFUKDAsIHRlc3Rpbmc6OkFueU9mKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OkFueU9mKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKSk7Cit9CisKK25hbWVzcGFjZSBhZGxfdGVzdCB7CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIDo6dGVzdGluZzo6QWxsT2YgYW5kIDo6dGVzdGluZzo6QW55T2YKKy8vIGRvbid0IGlzc3VlIHVucXVhbGlmaWVkIHJlY3Vyc2l2ZSBjYWxscy4gIElmIHRoZXkgZG8sIHRoZSBhcmd1bWVudCBkZXBlbmRlbnQKKy8vIG5hbWUgbG9va3VwIHdpbGwgY2F1c2UgQWxsT2YvQW55T2YgaW4gdGhlICdhZGxfdGVzdCcgbmFtZXNwYWNlIHRvIGJlIGZvdW5kCisvLyBhcyBhIGNhbmRpZGF0ZSBhbmQgdGhlIGNvbXBpbGF0aW9uIHdpbGwgYnJlYWsgZHVlIHRvIGFuIGFtYmlndW91cyBvdmVybG9hZC4KKworLy8gVGhlIG1hdGNoZXIgbXVzdCBiZSBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgQWxsT2YvQW55T2YgdG8gbWFrZSBhcmd1bWVudAorLy8gZGVwZW5kZW50IGxvb2t1cCBmaW5kIHRob3NlLgorTUFUQ0hFUihNLCAiIikgeyByZXR1cm4gdHJ1ZTsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBBbGxPZihjb25zdCBUMSYgdDEsIGNvbnN0IFQyJiB0MikgeyByZXR1cm4gdHJ1ZTsgfQorCitURVNUKEFsbE9mVGVzdCwgRG9lc05vdENhbGxBbGxPZlVucXVhbGlmaWVkKSB7CisgIEVYUEVDVF9USEFUKDQyLCB0ZXN0aW5nOjpBbGxPZigKKyAgICAgIE0oKSwgTSgpLCBNKCksIE0oKSwgTSgpLCBNKCksIE0oKSwgTSgpLCBNKCksIE0oKSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBib29sCitBbnlPZihjb25zdCBUMSYgdDEsIGNvbnN0IFQyJiB0MikgeyByZXR1cm4gdHJ1ZTsgfQorCitURVNUKEFueU9mVGVzdCwgRG9lc05vdENhbGxBbnlPZlVucXVhbGlmaWVkKSB7CisgIEVYUEVDVF9USEFUKDQyLCB0ZXN0aW5nOjpBbnlPZigKKyAgICAgIE0oKSwgTSgpLCBNKCksIE0oKSwgTSgpLCBNKCksIE0oKSwgTSgpLCBNKCksIE0oKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYWRsX3Rlc3QKKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLWludGVybmFsLXV0aWxzX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1pbnRlcm5hbC11dGlsc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDBmMGQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1pbnRlcm5hbC11dGlsc190ZXN0LmNjCkBAIC0wLDAgKzEsNjk4IEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSBpbnRlcm5hbCB1dGlsaXRpZXMuCisKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZiBHVEVTVF9PU19DWUdXSU4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyBGb3Igc3NpemVfdC4gTk9MSU5UCisjZW5kaWYKKworY2xhc3MgUHJvdG9jb2xNZXNzYWdlOworCituYW1lc3BhY2UgcHJvdG8yIHsKK2NsYXNzIE1lc3NhZ2U7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG8yCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK25hbWVzcGFjZSB7CisKK1RFU1QoQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3Jkc1Rlc3QsIFdvcmtzV2hlbk5hbWVDb250YWluc05vV29yZCkgeworICBFWFBFQ1RfRVEoIiIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIiIpKTsKKyAgRVhQRUNUX0VRKCIiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfIikpOworICBFWFBFQ1RfRVEoIiIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIl9fIikpOworfQorCitURVNUKENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHNUZXN0LCBXb3Jrc1doZW5OYW1lQ29udGFpbnNEaWdpdHMpIHsKKyAgRVhQRUNUX0VRKCIxIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiXzEiKSk7CisgIEVYUEVDVF9FUSgiMiIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIjJfIikpOworICBFWFBFQ1RfRVEoIjM0IiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiXzM0XyIpKTsKKyAgRVhQRUNUX0VRKCIzNCA1NiIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIl8zNF81NiIpKTsKK30KKworVEVTVChDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzVGVzdCwgV29ya3NXaGVuTmFtZUNvbnRhaW5zQ2FtZWxDYXNlV29yZHMpIHsKKyAgRVhQRUNUX0VRKCJhIGJpZyB3b3JkIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiQUJpZ1dvcmQiKSk7CisgIEVYUEVDVF9FUSgiZm9vIGJhciIsIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoIkZvb0JhciIpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJGb29fIikpOworICBFWFBFQ1RfRVEoImZvbyBiYXIiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfRm9vX0Jhcl8iKSk7CisgIEVYUEVDVF9FUSgiZm9vIGFuZCBiYXIiLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfRm9vX19BbmRfQmFyIikpOworfQorCitURVNUKENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHNUZXN0LCBXb3Jrc1doZW5OYW1lQ29udGFpbnNfU2VwYXJhdGVkV29yZHMpIHsKKyAgRVhQRUNUX0VRKCJmb28gYmFyIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiZm9vX2JhciIpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfZm9vXyIpKTsKKyAgRVhQRUNUX0VRKCJmb28gYmFyIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiX2Zvb19iYXJfIikpOworICBFWFBFQ1RfRVEoImZvbyBhbmQgYmFyIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiX2Zvb19fYW5kX2JhciIpKTsKK30KKworVEVTVChDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzVGVzdCwgV29ya3NXaGVuTmFtZUlzTWl4dHVyZSkgeworICBFWFBFQ1RfRVEoImZvbyBiYXIgMTIzIiwgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcygiRm9vX2JhcjEyMyIpKTsKKyAgRVhQRUNUX0VRKCJjaGFwdGVyIDExIHNlY3Rpb24gMSIsCisgICAgICAgICAgICBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKCJfQ2hhcHRlcjExU2VjdGlvbl8xXyIpKTsKK30KKworVEVTVChQb2ludGVlT2ZUZXN0LCBXb3Jrc0ZvclNtYXJ0UG9pbnRlcnMpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y29uc3QgY2hhciwKKyAgICAgIFBvaW50ZWVPZjxpbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBjaGFyPiA+Ojp0eXBlPigpOworI2lmIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8KKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBQb2ludGVlT2Y8c3RkOjp1bmlxdWVfcHRyPGludD4gPjo6dHlwZT4oKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9VTklRVUVfUFRSXworI2lmIEdURVNUX0hBU19TVERfU0hBUkVEX1BUUl8KKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8c3RkOjpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZWVPZjxzdGQ6OnNoYXJlZF9wdHI8c3RkOjpzdHJpbmc+ID46OnR5cGU+KCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfU0hBUkVEX1BUUl8KK30KKworVEVTVChQb2ludGVlT2ZUZXN0LCBXb3Jrc0ZvclJhd1BvaW50ZXJzKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCwgUG9pbnRlZU9mPGludCo+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyLCBQb2ludGVlT2Y8Y29uc3QgY2hhcio+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkLCBQb2ludGVlT2Y8dm9pZCo+Ojp0eXBlPigpOworfQorCitURVNUKEdldFJhd1BvaW50ZXJUZXN0LCBXb3Jrc0ZvclNtYXJ0UG9pbnRlcnMpIHsKKyNpZiBHVEVTVF9IQVNfU1REX1VOSVFVRV9QVFJfCisgIGNvbnN0IGNoYXIqIGNvbnN0IHJhd19wMSA9IG5ldyBjb25zdCBjaGFyKCdhJyk7ICAvLyBOT0xJTlQKKyAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGNoYXI+IHAxKHJhd19wMSk7CisgIEVYUEVDVF9FUShyYXdfcDEsIEdldFJhd1BvaW50ZXIocDEpKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9VTklRVUVfUFRSXworI2lmIEdURVNUX0hBU19TVERfU0hBUkVEX1BUUl8KKyAgZG91YmxlKiBjb25zdCByYXdfcDIgPSBuZXcgZG91YmxlKDIuNSk7ICAvLyBOT0xJTlQKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGRvdWJsZT4gcDIocmF3X3AyKTsKKyAgRVhQRUNUX0VRKHJhd19wMiwgR2V0UmF3UG9pbnRlcihwMikpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1NIQVJFRF9QVFJfCisKKyAgY29uc3QgY2hhciogY29uc3QgcmF3X3A0ID0gbmV3IGNvbnN0IGNoYXIoJ2EnKTsgIC8vIE5PTElOVAorICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBjaGFyPiBwNChyYXdfcDQpOworICBFWFBFQ1RfRVEocmF3X3A0LCBHZXRSYXdQb2ludGVyKHA0KSk7Cit9CisKK1RFU1QoR2V0UmF3UG9pbnRlclRlc3QsIFdvcmtzRm9yUmF3UG9pbnRlcnMpIHsKKyAgaW50KiBwID0gTlVMTDsKKyAgLy8gRG9uJ3QgdXNlIEVYUEVDVF9FUSBhcyBubyBOVUxMLXRlc3RpbmcgbWFnaWMgb24gU3ltYmlhbi4KKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRSYXdQb2ludGVyKHApKTsKKyAgaW50IG4gPSAxOworICBFWFBFQ1RfRVEoJm4sIEdldFJhd1BvaW50ZXIoJm4pKTsKK30KKworLy8gVGVzdHMgS2luZE9mPFQ+LgorCitjbGFzcyBCYXNlIHt9OworY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHt9OworCitURVNUKEtpbmRPZlRlc3QsIEJvb2wpIHsKKyAgRVhQRUNUX0VRKGtCb29sLCBHTU9DS19LSU5EX09GXyhib29sKSk7ICAvLyBOT0xJTlQKK30KKworVEVTVChLaW5kT2ZUZXN0LCBJbnRlZ2VyKSB7CisgIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8oY2hhcikpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8oc2lnbmVkIGNoYXIpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKHVuc2lnbmVkIGNoYXIpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKHNob3J0KSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKGtJbnRlZ2VyLCBHTU9DS19LSU5EX09GXyh1bnNpZ25lZCBzaG9ydCkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUShrSW50ZWdlciwgR01PQ0tfS0lORF9PRl8oaW50KSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKGtJbnRlZ2VyLCBHTU9DS19LSU5EX09GXyh1bnNpZ25lZCBpbnQpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKGxvbmcpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKHVuc2lnbmVkIGxvbmcpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKHdjaGFyX3QpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKEludDY0KSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKGtJbnRlZ2VyLCBHTU9DS19LSU5EX09GXyhVSW50NjQpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa0ludGVnZXIsIEdNT0NLX0tJTkRfT0ZfKHNpemVfdCkpOyAgLy8gTk9MSU5UCisjaWYgR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX0NZR1dJTgorICAvLyBzc2l6ZV90IGlzIG5vdCBkZWZpbmVkIG9uIFdpbmRvd3MgYW5kIHBvc3NpYmx5IHNvbWUgb3RoZXIgT1Nlcy4KKyAgRVhQRUNUX0VRKGtJbnRlZ2VyLCBHTU9DS19LSU5EX09GXyhzc2l6ZV90KSk7ICAvLyBOT0xJTlQKKyNlbmRpZgorfQorCitURVNUKEtpbmRPZlRlc3QsIEZsb2F0aW5nUG9pbnQpIHsKKyAgRVhQRUNUX0VRKGtGbG9hdGluZ1BvaW50LCBHTU9DS19LSU5EX09GXyhmbG9hdCkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUShrRmxvYXRpbmdQb2ludCwgR01PQ0tfS0lORF9PRl8oZG91YmxlKSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKGtGbG9hdGluZ1BvaW50LCBHTU9DS19LSU5EX09GXyhsb25nIGRvdWJsZSkpOyAgLy8gTk9MSU5UCit9CisKK1RFU1QoS2luZE9mVGVzdCwgT3RoZXIpIHsKKyAgRVhQRUNUX0VRKGtPdGhlciwgR01PQ0tfS0lORF9PRl8odm9pZCopKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa090aGVyLCBHTU9DS19LSU5EX09GXyhjaGFyKiopKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoa090aGVyLCBHTU9DS19LSU5EX09GXyhCYXNlKSk7ICAvLyBOT0xJTlQKK30KKworLy8gVGVzdHMgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8VCwgVT4uCisKK1RFU1QoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVUZXN0LCBCb29sVG9Cb29sKSB7CisgIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxib29sLCBib29sPjo6dmFsdWUpKTsKK30KKworVEVTVChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZVRlc3QsIEJvb2xUb0ludGVnZXIpIHsKKyAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGJvb2wsIGNoYXI+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8Ym9vbCwgaW50Pjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICAoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8Ym9vbCwgdW5zaWduZWQgbG9uZz46OnZhbHVlKSk7ICAvLyBOT0xJTlQKK30KKworVEVTVChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZVRlc3QsIEJvb2xUb0Zsb2F0aW5nUG9pbnQpIHsKKyAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGJvb2wsIGZsb2F0Pjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGJvb2wsIGRvdWJsZT46OnZhbHVlKSk7Cit9CisKK1RFU1QoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVUZXN0LCBJbnRlZ2VyVG9Cb29sKSB7CisgIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8dW5zaWduZWQgY2hhciwgYm9vbD46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8aW50LCBib29sPjo6dmFsdWUpKTsKK30KKworVEVTVChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZVRlc3QsIEludGVnZXJUb0ludGVnZXIpIHsKKyAgLy8gVW5zaWduZWQgPT4gbGFyZ2VyIHNpZ25lZCBpcyBmaW5lLgorICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8dW5zaWduZWQgY2hhciwgaW50Pjo6dmFsdWUpKTsKKworICAvLyBVbnNpZ25lZCA9PiBsYXJnZXIgdW5zaWduZWQgaXMgZmluZS4KKyAgRVhQRUNUX1RSVUUoCisgICAgICAoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8dW5zaWduZWQgc2hvcnQsIFVJbnQ2ND46OnZhbHVlKSk7IC8vIE5PTElOVAorCisgIC8vIFNpZ25lZCA9PiB1bnNpZ25lZCBpcyBub3QgZmluZS4KKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxzaG9ydCwgVUludDY0Pjo6dmFsdWUpKTsgLy8gTk9MSU5UCisgIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8CisgICAgICBzaWduZWQgY2hhciwgdW5zaWduZWQgaW50Pjo6dmFsdWUpKTsgIC8vIE5PTElOVAorCisgIC8vIFNhbWUgc2l6ZSBhbmQgc2FtZSBzaWduZWRuZXNzOiBmaW5lIHRvby4KKyAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhcj46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxpbnQsIGludD46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTx3Y2hhcl90LCB3Y2hhcl90Pjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZz46OnZhbHVlKSk7ICAvLyBOT0xJTlQKKworICAvLyBTYW1lIHNpemUsIGRpZmZlcmVudCBzaWduZWRuZXNzOiBub3QgZmluZS4KKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLCBzaWduZWQgY2hhcj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8aW50LCB1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPFVJbnQ2NCwgSW50NjQ+Ojp2YWx1ZSkpOworCisgIC8vIExhcmdlciBzaXplID0+IHNtYWxsZXIgc2l6ZSBpcyBub3QgZmluZS4KKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxsb25nLCBjaGFyPjo6dmFsdWUpKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGludCwgc2lnbmVkIGNoYXI+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPEludDY0LCB1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSkpOworfQorCitURVNUKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlVGVzdCwgSW50ZWdlclRvRmxvYXRpbmdQb2ludCkgeworICAvLyBJbnRlZ2VycyBjYW5ub3QgYmUgbG9zc2xlc3NseSBjb252ZXJ0ZWQgdG8gZmxvYXRpbmctcG9pbnRzLCBhcworICAvLyB0aGUgZm9ybWF0IG9mIHRoZSBsYXR0ZXIgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxjaGFyLCBmbG9hdD46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8aW50LCBkb3VibGU+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgIHNob3J0LCBsb25nIGRvdWJsZT46OnZhbHVlKSk7ICAvLyBOT0xJTlQKK30KKworVEVTVChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZVRlc3QsIEZsb2F0aW5nUG9pbnRUb0Jvb2wpIHsKKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxmbG9hdCwgYm9vbD46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8ZG91YmxlLCBib29sPjo6dmFsdWUpKTsKK30KKworVEVTVChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZVRlc3QsIEZsb2F0aW5nUG9pbnRUb0ludGVnZXIpIHsKKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxmbG9hdCwgbG9uZz46OnZhbHVlKSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxkb3VibGUsIEludDY0Pjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxsb25nIGRvdWJsZSwgaW50Pjo6dmFsdWUpKTsKK30KKworVEVTVChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZVRlc3QsIEZsb2F0aW5nUG9pbnRUb0Zsb2F0aW5nUG9pbnQpIHsKKyAgLy8gU21hbGxlciBzaXplID0+IGxhcmdlciBzaXplIGlzIGZpbmUuCisgIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxmbG9hdCwgZG91YmxlPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPGZsb2F0LCBsb25nIGRvdWJsZT46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxkb3VibGUsIGxvbmcgZG91YmxlPjo6dmFsdWUpKTsKKworICAvLyBTYW1lIHNpemU6IGZpbmUuCisgIEVYUEVDVF9UUlVFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxmbG9hdCwgZmxvYXQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8ZG91YmxlLCBkb3VibGU+Ojp2YWx1ZSkpOworCisgIC8vIExhcmdlciBzaXplID0+IHNtYWxsZXIgc2l6ZSBpcyBub3QgZmluZS4KKyAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxkb3VibGUsIGZsb2F0Pjo6dmFsdWUpKTsKKyAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXygpCisgIGlmIChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YobG9uZyBkb3VibGUpKSB7ICAvLyBOT0xJTlQKKyAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QT1BfKCkKKyAgICAvLyBJbiBzb21lIGltcGxlbWVudGF0aW9ucyAoZS5nLiBNU1ZDKSwgZG91YmxlIGFuZCBsb25nIGRvdWJsZQorICAgIC8vIGhhdmUgdGhlIHNhbWUgc2l6ZS4KKyAgICBFWFBFQ1RfVFJVRSgoTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8bG9uZyBkb3VibGUsIGRvdWJsZT46OnZhbHVlKSk7CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX0ZBTFNFKChMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxsb25nIGRvdWJsZSwgZG91YmxlPjo6dmFsdWUpKTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGUgVHVwbGVNYXRjaGVzKCkgdGVtcGxhdGUgZnVuY3Rpb24uCisKK1RFU1QoVHVwbGVNYXRjaGVzVGVzdCwgV29ya3NGb3JTaXplMCkgeworICB0dXBsZTw+IG1hdGNoZXJzOworICB0dXBsZTw+IHZhbHVlczsKKworICBFWFBFQ1RfVFJVRShUdXBsZU1hdGNoZXMobWF0Y2hlcnMsIHZhbHVlcykpOworfQorCitURVNUKFR1cGxlTWF0Y2hlc1Rlc3QsIFdvcmtzRm9yU2l6ZTEpIHsKKyAgdHVwbGU8TWF0Y2hlcjxpbnQ+ID4gbWF0Y2hlcnMoRXEoMSkpOworICB0dXBsZTxpbnQ+IHZhbHVlczEoMSksCisgICAgICB2YWx1ZXMyKDIpOworCisgIEVYUEVDVF9UUlVFKFR1cGxlTWF0Y2hlcyhtYXRjaGVycywgdmFsdWVzMSkpOworICBFWFBFQ1RfRkFMU0UoVHVwbGVNYXRjaGVzKG1hdGNoZXJzLCB2YWx1ZXMyKSk7Cit9CisKK1RFU1QoVHVwbGVNYXRjaGVzVGVzdCwgV29ya3NGb3JTaXplMikgeworICB0dXBsZTxNYXRjaGVyPGludD4sIE1hdGNoZXI8Y2hhcj4gPiBtYXRjaGVycyhFcSgxKSwgRXEoJ2EnKSk7CisgIHR1cGxlPGludCwgY2hhcj4gdmFsdWVzMSgxLCAnYScpLAorICAgICAgdmFsdWVzMigxLCAnYicpLAorICAgICAgdmFsdWVzMygyLCAnYScpLAorICAgICAgdmFsdWVzNCgyLCAnYicpOworCisgIEVYUEVDVF9UUlVFKFR1cGxlTWF0Y2hlcyhtYXRjaGVycywgdmFsdWVzMSkpOworICBFWFBFQ1RfRkFMU0UoVHVwbGVNYXRjaGVzKG1hdGNoZXJzLCB2YWx1ZXMyKSk7CisgIEVYUEVDVF9GQUxTRShUdXBsZU1hdGNoZXMobWF0Y2hlcnMsIHZhbHVlczMpKTsKKyAgRVhQRUNUX0ZBTFNFKFR1cGxlTWF0Y2hlcyhtYXRjaGVycywgdmFsdWVzNCkpOworfQorCitURVNUKFR1cGxlTWF0Y2hlc1Rlc3QsIFdvcmtzRm9yU2l6ZTUpIHsKKyAgdHVwbGU8TWF0Y2hlcjxpbnQ+LCBNYXRjaGVyPGNoYXI+LCBNYXRjaGVyPGJvb2w+LCBNYXRjaGVyPGxvbmc+LCAgLy8gTk9MSU5UCisgICAgICBNYXRjaGVyPHN0cmluZz4gPgorICAgICAgbWF0Y2hlcnMoRXEoMSksIEVxKCdhJyksIEVxKHRydWUpLCBFcSgyTCksIEVxKCJoaSIpKTsKKyAgdHVwbGU8aW50LCBjaGFyLCBib29sLCBsb25nLCBzdHJpbmc+ICAvLyBOT0xJTlQKKyAgICAgIHZhbHVlczEoMSwgJ2EnLCB0cnVlLCAyTCwgImhpIiksCisgICAgICB2YWx1ZXMyKDEsICdhJywgdHJ1ZSwgMkwsICJoZWxsbyIpLAorICAgICAgdmFsdWVzMygyLCAnYScsIHRydWUsIDJMLCAiaGkiKTsKKworICBFWFBFQ1RfVFJVRShUdXBsZU1hdGNoZXMobWF0Y2hlcnMsIHZhbHVlczEpKTsKKyAgRVhQRUNUX0ZBTFNFKFR1cGxlTWF0Y2hlcyhtYXRjaGVycywgdmFsdWVzMikpOworICBFWFBFQ1RfRkFMU0UoVHVwbGVNYXRjaGVzKG1hdGNoZXJzLCB2YWx1ZXMzKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQXNzZXJ0KHRydWUsIC4uLikgc3VjY2VlZHMuCitURVNUKEFzc2VydFRlc3QsIFN1Y2NlZWRzT25UcnVlKSB7CisgIEFzc2VydCh0cnVlLCBfX0ZJTEVfXywgX19MSU5FX18sICJUaGlzIHNob3VsZCBzdWNjZWVkLiIpOworICBBc3NlcnQodHJ1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgIC8vIFRoaXMgc2hvdWxkIHN1Y2NlZWQgdG9vLgorfQorCisvLyBUZXN0cyB0aGF0IEFzc2VydChmYWxzZSwgLi4uKSBnZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlLgorVEVTVChBc3NlcnRUZXN0LCBGYWlsc0ZhdGFsbHlPbkZhbHNlKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoeworICAgIEFzc2VydChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCAiVGhpcyBzaG91bGQgZmFpbC4iKTsKKyAgfSwgIiIpOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoeworICAgIEFzc2VydChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fKTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEV4cGVjdCh0cnVlLCAuLi4pIHN1Y2NlZWRzLgorVEVTVChFeHBlY3RUZXN0LCBTdWNjZWVkc09uVHJ1ZSkgeworICBFeHBlY3QodHJ1ZSwgX19GSUxFX18sIF9fTElORV9fLCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iKTsKKyAgRXhwZWN0KHRydWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAvLyBUaGlzIHNob3VsZCBzdWNjZWVkIHRvby4KK30KKworLy8gVGVzdHMgdGhhdCBFeHBlY3QoZmFsc2UsIC4uLikgZ2VuZXJhdGVzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCitURVNUKEV4cGVjdFRlc3QsIEZhaWxzTm9uZmF0YWxseU9uRmFsc2UpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRXhwZWN0KGZhbHNlLCBfX0ZJTEVfXywgX19MSU5FX18sICJUaGlzIHNob3VsZCBmYWlsLiIpOworICB9LCAiVGhpcyBzaG91bGQgZmFpbCIpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fKTsKKyAgfSwgIkV4cGVjdGF0aW9uIGZhaWxlZCIpOworfQorCisvLyBUZXN0cyBMb2dJc1Zpc2libGUoKS4KKworY2xhc3MgTG9nSXNWaXNpYmxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIG9yaWdpbmFsX3ZlcmJvc2VfID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IG9yaWdpbmFsX3ZlcmJvc2VfOyB9CisKKyAgc3RyaW5nIG9yaWdpbmFsX3ZlcmJvc2VfOworfTsKKworVEVTVF9GKExvZ0lzVmlzaWJsZVRlc3QsIEFsd2F5c1JldHVybnNUcnVlSWZWZXJib3NpdHlJc0luZm8pIHsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtJbmZvVmVyYm9zaXR5OworICBFWFBFQ1RfVFJVRShMb2dJc1Zpc2libGUoa0luZm8pKTsKKyAgRVhQRUNUX1RSVUUoTG9nSXNWaXNpYmxlKGtXYXJuaW5nKSk7Cit9CisKK1RFU1RfRihMb2dJc1Zpc2libGVUZXN0LCBBbHdheXNSZXR1cm5zRmFsc2VJZlZlcmJvc2l0eUlzRXJyb3IpIHsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtFcnJvclZlcmJvc2l0eTsKKyAgRVhQRUNUX0ZBTFNFKExvZ0lzVmlzaWJsZShrSW5mbykpOworICBFWFBFQ1RfRkFMU0UoTG9nSXNWaXNpYmxlKGtXYXJuaW5nKSk7Cit9CisKK1RFU1RfRihMb2dJc1Zpc2libGVUZXN0LCBXb3Jrc1doZW5WZXJib3NpdHlJc1dhcm5pbmcpIHsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtXYXJuaW5nVmVyYm9zaXR5OworICBFWFBFQ1RfRkFMU0UoTG9nSXNWaXNpYmxlKGtJbmZvKSk7CisgIEVYUEVDVF9UUlVFKExvZ0lzVmlzaWJsZShrV2FybmluZykpOworfQorCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisvLyBUZXN0cyB0aGUgTG9nKCkgZnVuY3Rpb24uCisKKy8vIFZlcmlmaWVzIHRoYXQgTG9nKCkgYmVoYXZlcyBjb3JyZWN0bHkgZm9yIHRoZSBnaXZlbiB2ZXJib3NpdHkgbGV2ZWwKKy8vIGFuZCBsb2cgc2V2ZXJpdHkuCit2b2lkIFRlc3RMb2dXaXRoU2V2ZXJpdHkoY29uc3Qgc3RyaW5nJiB2ZXJib3NpdHksIExvZ1NldmVyaXR5IHNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkX3ByaW50KSB7CisgIGNvbnN0IHN0cmluZyBvbGRfZmxhZyA9IEdNT0NLX0ZMQUcodmVyYm9zZSk7CisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSB2ZXJib3NpdHk7CisgIENhcHR1cmVTdGRvdXQoKTsKKyAgTG9nKHNldmVyaXR5LCAiVGVzdCBsb2cuXG4iLCAwKTsKKyAgaWYgKHNob3VsZF9wcmludCkgeworICAgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3Rkb3V0KCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBDb250YWluc1JlZ2V4KAorICAgICAgICAgICAgICAgICAgICBzZXZlcml0eSA9PSBrV2FybmluZyA/CisgICAgICAgICAgICAgICAgICAgICJeXG5HTU9DSyBXQVJOSU5HOlxuVGVzdCBsb2dcXC5cblN0YWNrIHRyYWNlOlxuIiA6CisgICAgICAgICAgICAgICAgICAgICJeXG5UZXN0IGxvZ1xcLlxuU3RhY2sgdHJhY2U6XG4iKSk7CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBHZXRDYXB0dXJlZFN0ZG91dCgpLmNfc3RyKCkpOworICB9CisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBvbGRfZmxhZzsKK30KKworLy8gVGVzdHMgdGhhdCB3aGVuIHRoZSBzdGFja19mcmFtZXNfdG9fc2tpcCBwYXJhbWV0ZXIgaXMgbmVnYXRpdmUsCisvLyBMb2coKSBkb2Vzbid0IGluY2x1ZGUgdGhlIHN0YWNrIHRyYWNlIGluIHRoZSBvdXRwdXQuCitURVNUKExvZ1Rlc3QsIE5vU3RhY2tUcmFjZVdoZW5TdGFja0ZyYW1lc1RvU2tpcElzTmVnYXRpdmUpIHsKKyAgY29uc3Qgc3RyaW5nIHNhdmVkX2ZsYWcgPSBHTU9DS19GTEFHKHZlcmJvc2UpOworICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga0luZm9WZXJib3NpdHk7CisgIENhcHR1cmVTdGRvdXQoKTsKKyAgTG9nKGtJbmZvLCAiVGVzdCBsb2cuXG4iLCAtMSk7CisgIEVYUEVDVF9TVFJFUSgiXG5UZXN0IGxvZy5cbiIsIEdldENhcHR1cmVkU3Rkb3V0KCkuY19zdHIoKSk7CisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBzYXZlZF9mbGFnOworfQorCitzdHJ1Y3QgTW9ja1N0YWNrVHJhY2VHZXR0ZXIgOiB0ZXN0aW5nOjppbnRlcm5hbDo6T3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyAgdmlydHVhbCBzdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpIHsKKyAgICByZXR1cm4gKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCBtYXhfZGVwdGggPDwgIjo6IiA8PCBza2lwX2NvdW50IDw8ICJcbiIpCisgICAgICAgIC5HZXRTdHJpbmcoKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpIHt9Cit9OworCisvLyBUZXN0cyB0aGF0IGluIG9wdCBtb2RlLCBhIHBvc2l0aXZlIHN0YWNrX2ZyYW1lc190b19za2lwIGFyZ3VtZW50IGlzCisvLyB0cmVhdGVkIGFzIDAuCitURVNUKExvZ1Rlc3QsIE5vU2tpcHBpbmdTdGFja0ZyYW1lSW5PcHRNb2RlKSB7CisgIE1vY2tTdGFja1RyYWNlR2V0dGVyKiBtb2NrX29zX3N0YWNrX3RyYWNlX2dldHRlciA9IG5ldyBNb2NrU3RhY2tUcmFjZUdldHRlcjsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPnNldF9vc19zdGFja190cmFjZV9nZXR0ZXIobW9ja19vc19zdGFja190cmFjZV9nZXR0ZXIpOworCisgIENhcHR1cmVTdGRvdXQoKTsKKyAgTG9nKGtXYXJuaW5nLCAiVGVzdCBsb2cuXG4iLCAxMDApOworICBjb25zdCBzdHJpbmcgbG9nID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKKworICBzdHJpbmcgZXhwZWN0ZWRfdHJhY2UgPQorICAgICAgKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA8PCAiOjoiKS5HZXRTdHJpbmcoKTsKKyAgc3RyaW5nIGV4cGVjdGVkX21lc3NhZ2UgPQorICAgICAgIlxuR01PQ0sgV0FSTklORzpcbiIKKyAgICAgICJUZXN0IGxvZy5cbiIKKyAgICAgICJTdGFjayB0cmFjZTpcbiIgKworICAgICAgZXhwZWN0ZWRfdHJhY2U7CisgIEVYUEVDVF9USEFUKGxvZywgSGFzU3Vic3RyKGV4cGVjdGVkX21lc3NhZ2UpKTsKKyAgaW50IHNraXBfY291bnQgPSBhdG9pKGxvZy5zdWJzdHIoZXhwZWN0ZWRfbWVzc2FnZS5zaXplKCkpLmNfc3RyKCkpOworCisjIGlmIGRlZmluZWQoTkRFQlVHKQorICAvLyBJbiBvcHQgbW9kZSwgbm8gc3RhY2sgZnJhbWUgc2hvdWxkIGJlIHNraXBwZWQuCisgIGNvbnN0IGludCBleHBlY3RlZF9za2lwX2NvdW50ID0gMDsKKyMgZWxzZQorICAvLyBJbiBkYmcgbW9kZSwgdGhlIHN0YWNrIGZyYW1lcyBzaG91bGQgYmUgc2tpcHBlZC4KKyAgY29uc3QgaW50IGV4cGVjdGVkX3NraXBfY291bnQgPSAxMDA7CisjIGVuZGlmCisKKyAgLy8gTm90ZSB0aGF0IGVhY2ggaW5uZXIgaW1wbGVtZW50YXRpb24gbGF5ZXIgd2lsbCArMSB0aGUgbnVtYmVyIHRvIHJlbW92ZQorICAvLyBpdHNlbGYgZnJvbSB0aGUgdHJhY2UuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdmFsdWUgaXMgYSBsaXR0bGUgaGlnaGVyIHRoYW4KKyAgLy8gZXhwZWN0ZWQsIGJ1dCBjbG9zZSBlbm91Z2guCisgIEVYUEVDVF9USEFUKHNraXBfY291bnQsCisgICAgICAgICAgICAgIEFsbE9mKEdlKGV4cGVjdGVkX3NraXBfY291bnQpLCBMZShleHBlY3RlZF9za2lwX2NvdW50ICsgMTApKSk7CisKKyAgLy8gUmVzdG9yZXMgdGhlIGRlZmF1bHQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLgorICBHZXRVbml0VGVzdEltcGwoKS0+c2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcihOVUxMKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbGwgbG9ncyBhcmUgcHJpbnRlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUKKy8vIC0tZ21vY2tfdmVyYm9zZSBmbGFnIGlzICJpbmZvIi4KK1RFU1QoTG9nVGVzdCwgQWxsTG9nc0FyZVByaW50ZWRXaGVuVmVyYm9zaXR5SXNJbmZvKSB7CisgIFRlc3RMb2dXaXRoU2V2ZXJpdHkoa0luZm9WZXJib3NpdHksIGtJbmZvLCB0cnVlKTsKKyAgVGVzdExvZ1dpdGhTZXZlcml0eShrSW5mb1ZlcmJvc2l0eSwga1dhcm5pbmcsIHRydWUpOworfQorCisvLyBUZXN0cyB0aGF0IG9ubHkgd2FybmluZ3MgYXJlIHByaW50ZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlCisvLyAtLWdtb2NrX3ZlcmJvc2UgZmxhZyBpcyAid2FybmluZyIuCitURVNUKExvZ1Rlc3QsIE9ubHlXYXJuaW5nc0FyZVByaW50ZWRXaGVuVmVyYm9zaXR5SXNXYXJuaW5nKSB7CisgIFRlc3RMb2dXaXRoU2V2ZXJpdHkoa1dhcm5pbmdWZXJib3NpdHksIGtJbmZvLCBmYWxzZSk7CisgIFRlc3RMb2dXaXRoU2V2ZXJpdHkoa1dhcm5pbmdWZXJib3NpdHksIGtXYXJuaW5nLCB0cnVlKTsKK30KKworLy8gVGVzdHMgdGhhdCBubyBsb2dzIGFyZSBwcmludGVkIHdoZW4gdGhlIHZhbHVlIG9mIHRoZQorLy8gLS1nbW9ja192ZXJib3NlIGZsYWcgaXMgImVycm9yIi4KK1RFU1QoTG9nVGVzdCwgTm9Mb2dzQXJlUHJpbnRlZFdoZW5WZXJib3NpdHlJc0Vycm9yKSB7CisgIFRlc3RMb2dXaXRoU2V2ZXJpdHkoa0Vycm9yVmVyYm9zaXR5LCBrSW5mbywgZmFsc2UpOworICBUZXN0TG9nV2l0aFNldmVyaXR5KGtFcnJvclZlcmJvc2l0eSwga1dhcm5pbmcsIGZhbHNlKTsKK30KKworLy8gVGVzdHMgdGhhdCBvbmx5IHdhcm5pbmdzIGFyZSBwcmludGVkIHdoZW4gdGhlIHZhbHVlIG9mIHRoZQorLy8gLS1nbW9ja192ZXJib3NlIGZsYWcgaXMgaW52YWxpZC4KK1RFU1QoTG9nVGVzdCwgT25seVdhcm5pbmdzQXJlUHJpbnRlZFdoZW5WZXJib3NpdHlJc0ludmFsaWQpIHsKKyAgVGVzdExvZ1dpdGhTZXZlcml0eSgiaW52YWxpZCIsIGtJbmZvLCBmYWxzZSk7CisgIFRlc3RMb2dXaXRoU2V2ZXJpdHkoImludmFsaWQiLCBrV2FybmluZywgdHJ1ZSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCitURVNUKFR5cGVUcmFpdHNUZXN0LCB0cnVlX3R5cGUpIHsKKyAgRVhQRUNUX1RSVUUodHJ1ZV90eXBlOjp2YWx1ZSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIGZhbHNlX3R5cGUpIHsKKyAgRVhQRUNUX0ZBTFNFKGZhbHNlX3R5cGU6OnZhbHVlKTsKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgaXNfcmVmZXJlbmNlKSB7CisgIEVYUEVDVF9GQUxTRShpc19yZWZlcmVuY2U8aW50Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcmVmZXJlbmNlPGNoYXIqPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19yZWZlcmVuY2U8Y29uc3QgaW50Jj46OnZhbHVlKTsKK30KKworVEVTVChUeXBlVHJhaXRzVGVzdCwgaXNfcG9pbnRlcikgeworICBFWFBFQ1RfRkFMU0UoaXNfcG9pbnRlcjxpbnQ+Ojp2YWx1ZSk7CisgIEVYUEVDVF9GQUxTRShpc19wb2ludGVyPGNoYXImPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wb2ludGVyPGNvbnN0IGludCo+Ojp2YWx1ZSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIHR5cGVfZXF1YWxzKSB7CisgIEVYUEVDVF9GQUxTRSgodHlwZV9lcXVhbHM8aW50LCBjb25zdCBpbnQ+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKHR5cGVfZXF1YWxzPGludCwgaW50Jj46OnZhbHVlKSk7CisgIEVYUEVDVF9GQUxTRSgodHlwZV9lcXVhbHM8aW50LCBkb3VibGU+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgodHlwZV9lcXVhbHM8Y2hhciwgY2hhcj46OnZhbHVlKSk7Cit9CisKK1RFU1QoVHlwZVRyYWl0c1Rlc3QsIHJlbW92ZV9yZWZlcmVuY2UpIHsKKyAgRVhQRUNUX1RSVUUoKHR5cGVfZXF1YWxzPGNoYXIsIHJlbW92ZV9yZWZlcmVuY2U8Y2hhciY+Ojp0eXBlPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKHR5cGVfZXF1YWxzPGNvbnN0IGludCwKKyAgICAgICAgICAgICAgIHJlbW92ZV9yZWZlcmVuY2U8Y29uc3QgaW50Jj46OnR5cGU+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgodHlwZV9lcXVhbHM8aW50LCByZW1vdmVfcmVmZXJlbmNlPGludD46OnR5cGU+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgodHlwZV9lcXVhbHM8ZG91YmxlKiwgcmVtb3ZlX3JlZmVyZW5jZTxkb3VibGUqPjo6dHlwZT46OnZhbHVlKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIFZlcmlmaWVzIHRoYXQgTG9nKCkgYmVoYXZlcyBjb3JyZWN0bHkgZm9yIHRoZSBnaXZlbiB2ZXJib3NpdHkgbGV2ZWwKKy8vIGFuZCBsb2cgc2V2ZXJpdHkuCitzdGQ6OnN0cmluZyBHcmFiT3V0cHV0KHZvaWQoKmxvZ2dlcikoKSwgY29uc3QgY2hhciogdmVyYm9zaXR5KSB7CisgIGNvbnN0IHN0cmluZyBzYXZlZF9mbGFnID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHZlcmJvc2l0eTsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBsb2dnZXIoKTsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHNhdmVkX2ZsYWc7CisgIHJldHVybiBHZXRDYXB0dXJlZFN0ZG91dCgpOworfQorCitjbGFzcyBEdW1teU1vY2sgeworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QwKFRlc3RNZXRob2QsIHZvaWQoKSk7CisgIE1PQ0tfTUVUSE9EMShUZXN0TWV0aG9kQXJnLCB2b2lkKGludCBkdW1teSkpOworfTsKKwordm9pZCBFeHBlY3RDYWxsTG9nZ2VyKCkgeworICBEdW1teU1vY2sgbW9jazsKKyAgRVhQRUNUX0NBTEwobW9jaywgVGVzdE1ldGhvZCgpKTsKKyAgbW9jay5UZXN0TWV0aG9kKCk7Cit9OworCisvLyBWZXJpZmllcyB0aGF0IEVYUEVDVF9DQUxMIGxvZ3MgaWYgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnIGlzIHNldCB0byAiaW5mbyIuCitURVNUKEV4cGVjdENhbGxUZXN0LCBMb2dzV2hlblZlcmJvc2l0eUlzSW5mbykgeworICBFWFBFQ1RfVEhBVChzdGQ6OnN0cmluZyhHcmFiT3V0cHV0KEV4cGVjdENhbGxMb2dnZXIsIGtJbmZvVmVyYm9zaXR5KSksCisgICAgICAgICAgICAgIEhhc1N1YnN0cigiRVhQRUNUX0NBTEwobW9jaywgVGVzdE1ldGhvZCgpKSIpKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBFWFBFQ1RfQ0FMTCBkb2Vzbid0IGxvZworLy8gaWYgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnIGlzIHNldCB0byAid2FybmluZyIuCitURVNUKEV4cGVjdENhbGxUZXN0LCBEb2VzTm90TG9nV2hlblZlcmJvc2l0eUlzV2FybmluZykgeworICBFWFBFQ1RfU1RSRVEoIiIsIEdyYWJPdXRwdXQoRXhwZWN0Q2FsbExvZ2dlciwga1dhcm5pbmdWZXJib3NpdHkpLmNfc3RyKCkpOworfQorCisvLyBWZXJpZmllcyB0aGF0IEVYUEVDVF9DQUxMIGRvZXNuJ3QgbG9nCisvLyBpZiB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcgaXMgc2V0IHRvICJlcnJvciIuCitURVNUKEV4cGVjdENhbGxUZXN0LCAgRG9lc05vdExvZ1doZW5WZXJib3NpdHlJc0Vycm9yKSB7CisgIEVYUEVDVF9TVFJFUSgiIiwgR3JhYk91dHB1dChFeHBlY3RDYWxsTG9nZ2VyLCBrRXJyb3JWZXJib3NpdHkpLmNfc3RyKCkpOworfQorCit2b2lkIE9uQ2FsbExvZ2dlcigpIHsKKyAgRHVtbXlNb2NrIG1vY2s7CisgIE9OX0NBTEwobW9jaywgVGVzdE1ldGhvZCgpKTsKK307CisKKy8vIFZlcmlmaWVzIHRoYXQgT05fQ0FMTCBsb2dzIGlmIHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gImluZm8iLgorVEVTVChPbkNhbGxUZXN0LCBMb2dzV2hlblZlcmJvc2l0eUlzSW5mbykgeworICBFWFBFQ1RfVEhBVChzdGQ6OnN0cmluZyhHcmFiT3V0cHV0KE9uQ2FsbExvZ2dlciwga0luZm9WZXJib3NpdHkpKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJPTl9DQUxMKG1vY2ssIFRlc3RNZXRob2QoKSkiKSk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgT05fQ0FMTCBkb2Vzbid0IGxvZworLy8gaWYgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnIGlzIHNldCB0byAid2FybmluZyIuCitURVNUKE9uQ2FsbFRlc3QsIERvZXNOb3RMb2dXaGVuVmVyYm9zaXR5SXNXYXJuaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiIiwgR3JhYk91dHB1dChPbkNhbGxMb2dnZXIsIGtXYXJuaW5nVmVyYm9zaXR5KS5jX3N0cigpKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBPTl9DQUxMIGRvZXNuJ3QgbG9nIGlmCisvLyB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcgaXMgc2V0IHRvICJlcnJvciIuCitURVNUKE9uQ2FsbFRlc3QsIERvZXNOb3RMb2dXaGVuVmVyYm9zaXR5SXNFcnJvcikgeworICBFWFBFQ1RfU1RSRVEoIiIsIEdyYWJPdXRwdXQoT25DYWxsTG9nZ2VyLCBrRXJyb3JWZXJib3NpdHkpLmNfc3RyKCkpOworfQorCit2b2lkIE9uQ2FsbEFueUFyZ3VtZW50TG9nZ2VyKCkgeworICBEdW1teU1vY2sgbW9jazsKKyAgT05fQ0FMTChtb2NrLCBUZXN0TWV0aG9kQXJnKF8pKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBPTl9DQUxMIHByaW50cyBwcm92aWRlZCBfIGFyZ3VtZW50LgorVEVTVChPbkNhbGxUZXN0LCBMb2dzQW55dGhpbmdBcmd1bWVudCkgeworICBFWFBFQ1RfVEhBVChzdGQ6OnN0cmluZyhHcmFiT3V0cHV0KE9uQ2FsbEFueUFyZ3VtZW50TG9nZ2VyLCBrSW5mb1ZlcmJvc2l0eSkpLAorICAgICAgICAgICAgICBIYXNTdWJzdHIoIk9OX0NBTEwobW9jaywgVGVzdE1ldGhvZEFyZyhfKSIpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIFRlc3RzIFN0bENvbnRhaW5lclZpZXcuCisKK1RFU1QoU3RsQ29udGFpbmVyVmlld1Rlc3QsIFdvcmtzRm9yU3RsQ29udGFpbmVyKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxzdGQ6OnZlY3RvcjxpbnQ+LAorICAgICAgU3RsQ29udGFpbmVyVmlldzxzdGQ6OnZlY3RvcjxpbnQ+ID46OnR5cGU+KCk7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiwKKyAgICAgIFN0bENvbnRhaW5lclZpZXc8c3RkOjp2ZWN0b3I8ZG91YmxlPiA+Ojpjb25zdF9yZWZlcmVuY2U+KCk7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxjaGFyPiBDaGFyczsKKyAgQ2hhcnMgdjE7CisgIGNvbnN0IENoYXJzJiB2MihTdGxDb250YWluZXJWaWV3PENoYXJzPjo6Q29uc3RSZWZlcmVuY2UodjEpKTsKKyAgRVhQRUNUX0VRKCZ2MSwgJnYyKTsKKworICB2MS5wdXNoX2JhY2soJ2EnKTsKKyAgQ2hhcnMgdjMgPSBTdGxDb250YWluZXJWaWV3PENoYXJzPjo6Q29weSh2MSk7CisgIEVYUEVDVF9USEFUKHYzLCBFcSh2MykpOworfQorCitURVNUKFN0bENvbnRhaW5lclZpZXdUZXN0LCBXb3Jrc0ZvclN0YXRpY05hdGl2ZUFycmF5KSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxOYXRpdmVBcnJheTxpbnQ+LAorICAgICAgU3RsQ29udGFpbmVyVmlldzxpbnRbM10+Ojp0eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8TmF0aXZlQXJyYXk8ZG91YmxlPiwKKyAgICAgIFN0bENvbnRhaW5lclZpZXc8Y29uc3QgZG91YmxlWzRdPjo6dHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPE5hdGl2ZUFycmF5PGNoYXJbM10+LAorICAgICAgU3RsQ29udGFpbmVyVmlldzxjb25zdCBjaGFyWzJdWzNdPjo6dHlwZT4oKTsKKworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3QgTmF0aXZlQXJyYXk8aW50PiwKKyAgICAgIFN0bENvbnRhaW5lclZpZXc8aW50WzJdPjo6Y29uc3RfcmVmZXJlbmNlPigpOworCisgIGludCBhMVszXSA9IHsgMCwgMSwgMiB9OworICBOYXRpdmVBcnJheTxpbnQ+IGEyID0gU3RsQ29udGFpbmVyVmlldzxpbnRbM10+OjpDb25zdFJlZmVyZW5jZShhMSk7CisgIEVYUEVDVF9FUSgzVSwgYTIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGExLCBhMi5iZWdpbigpKTsKKworICBjb25zdCBOYXRpdmVBcnJheTxpbnQ+IGEzID0gU3RsQ29udGFpbmVyVmlldzxpbnRbM10+OjpDb3B5KGExKTsKKyAgQVNTRVJUX0VRKDNVLCBhMy5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgYTMuYmVnaW4oKVswXSk7CisgIEVYUEVDVF9FUSgxLCBhMy5iZWdpbigpWzFdKTsKKyAgRVhQRUNUX0VRKDIsIGEzLmJlZ2luKClbMl0pOworCisgIC8vIE1ha2VzIHN1cmUgYTEgYW5kIGEzIGFyZW4ndCBhbGlhc2VzLgorICBhMVswXSA9IDM7CisgIEVYUEVDVF9FUSgwLCBhMy5iZWdpbigpWzBdKTsKK30KKworVEVTVChTdGxDb250YWluZXJWaWV3VGVzdCwgV29ya3NGb3JEeW5hbWljTmF0aXZlQXJyYXkpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPE5hdGl2ZUFycmF5PGludD4sCisgICAgICBTdGxDb250YWluZXJWaWV3PHR1cGxlPGNvbnN0IGludCosIHNpemVfdD4gPjo6dHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPE5hdGl2ZUFycmF5PGRvdWJsZT4sCisgICAgICBTdGxDb250YWluZXJWaWV3PHR1cGxlPGxpbmtlZF9wdHI8ZG91YmxlPiwgaW50PiA+Ojp0eXBlPigpOworCisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBOYXRpdmVBcnJheTxpbnQ+LAorICAgICAgU3RsQ29udGFpbmVyVmlldzx0dXBsZTxjb25zdCBpbnQqLCBpbnQ+ID46OmNvbnN0X3JlZmVyZW5jZT4oKTsKKworICBpbnQgYTFbM10gPSB7IDAsIDEsIDIgfTsKKyAgY29uc3QgaW50KiBjb25zdCBwMSA9IGExOworICBOYXRpdmVBcnJheTxpbnQ+IGEyID0gU3RsQ29udGFpbmVyVmlldzx0dXBsZTxjb25zdCBpbnQqLCBpbnQ+ID46OgorICAgICAgQ29uc3RSZWZlcmVuY2UobWFrZV90dXBsZShwMSwgMykpOworICBFWFBFQ1RfRVEoM1UsIGEyLnNpemUoKSk7CisgIEVYUEVDVF9FUShhMSwgYTIuYmVnaW4oKSk7CisKKyAgY29uc3QgTmF0aXZlQXJyYXk8aW50PiBhMyA9IFN0bENvbnRhaW5lclZpZXc8dHVwbGU8aW50Kiwgc2l6ZV90PiA+OjoKKyAgICAgIENvcHkobWFrZV90dXBsZShzdGF0aWNfY2FzdDxpbnQqPihhMSksIDMpKTsKKyAgQVNTRVJUX0VRKDNVLCBhMy5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgYTMuYmVnaW4oKVswXSk7CisgIEVYUEVDVF9FUSgxLCBhMy5iZWdpbigpWzFdKTsKKyAgRVhQRUNUX0VRKDIsIGEzLmJlZ2luKClbMl0pOworCisgIC8vIE1ha2VzIHN1cmUgYTEgYW5kIGEzIGFyZW4ndCBhbGlhc2VzLgorICBhMVswXSA9IDM7CisgIEVYUEVDVF9FUSgwLCBhMy5iZWdpbigpWzBdKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1tYXRjaGVyc190ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stbWF0Y2hlcnNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDlhY2JhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stbWF0Y2hlcnNfdGVzdC5jYwpAQCAtMCwwICsxLDU2NDYgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgc29tZSBjb21tb25seSB1c2VkIGFyZ3VtZW50IG1hdGNoZXJzLgorCisjaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKKyNpbmNsdWRlICJnbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworI2lmIEdURVNUX0hBU19TVERfRk9SV0FSRF9MSVNUXworIyBpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+ICAvLyBOT0xJTlQKKyNlbmRpZgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitHVEVTVF9BUElfIHN0cmluZyBKb2luQXNUdXBsZShjb25zdCBTdHJpbmdzJiBmaWVsZHMpOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBnbW9ja19tYXRjaGVyc190ZXN0IHsKKwordXNpbmcgc3RkOjpncmVhdGVyOwordXNpbmcgc3RkOjpsZXNzOwordXNpbmcgc3RkOjpsaXN0OwordXNpbmcgc3RkOjptYWtlX3BhaXI7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6bXVsdGltYXA7Cit1c2luZyBzdGQ6Om11bHRpc2V0OwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgdGVzdGluZzo6QTsKK3VzaW5nIHRlc3Rpbmc6OkFsbEFyZ3M7Cit1c2luZyB0ZXN0aW5nOjpBbGxPZjsKK3VzaW5nIHRlc3Rpbmc6OkFuOwordXNpbmcgdGVzdGluZzo6QW55T2Y7Cit1c2luZyB0ZXN0aW5nOjpCeVJlZjsKK3VzaW5nIHRlc3Rpbmc6OkNvbnRhaW5zUmVnZXg7Cit1c2luZyB0ZXN0aW5nOjpEb3VibGVFcTsKK3VzaW5nIHRlc3Rpbmc6OkRvdWJsZU5lYXI7Cit1c2luZyB0ZXN0aW5nOjpFbmRzV2l0aDsKK3VzaW5nIHRlc3Rpbmc6OkVxOwordXNpbmcgdGVzdGluZzo6RXhwbGFpbk1hdGNoUmVzdWx0OwordXNpbmcgdGVzdGluZzo6RmllbGQ7Cit1c2luZyB0ZXN0aW5nOjpGbG9hdEVxOwordXNpbmcgdGVzdGluZzo6RmxvYXROZWFyOwordXNpbmcgdGVzdGluZzo6R2U7Cit1c2luZyB0ZXN0aW5nOjpHdDsKK3VzaW5nIHRlc3Rpbmc6Okhhc1N1YnN0cjsKK3VzaW5nIHRlc3Rpbmc6OklzRW1wdHk7Cit1c2luZyB0ZXN0aW5nOjpJc051bGw7Cit1c2luZyB0ZXN0aW5nOjpLZXk7Cit1c2luZyB0ZXN0aW5nOjpMZTsKK3VzaW5nIHRlc3Rpbmc6Okx0OwordXNpbmcgdGVzdGluZzo6TWFrZU1hdGNoZXI7Cit1c2luZyB0ZXN0aW5nOjpNYWtlUG9seW1vcnBoaWNNYXRjaGVyOwordXNpbmcgdGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lcjsKK3VzaW5nIHRlc3Rpbmc6Ok1hdGNoZXI7Cit1c2luZyB0ZXN0aW5nOjpNYXRjaGVyQ2FzdDsKK3VzaW5nIHRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U7Cit1c2luZyB0ZXN0aW5nOjpNYXRjaGVzOwordXNpbmcgdGVzdGluZzo6TWF0Y2hlc1JlZ2V4OwordXNpbmcgdGVzdGluZzo6TmFuU2Vuc2l0aXZlRG91YmxlRXE7Cit1c2luZyB0ZXN0aW5nOjpOYW5TZW5zaXRpdmVEb3VibGVOZWFyOwordXNpbmcgdGVzdGluZzo6TmFuU2Vuc2l0aXZlRmxvYXRFcTsKK3VzaW5nIHRlc3Rpbmc6Ok5hblNlbnNpdGl2ZUZsb2F0TmVhcjsKK3VzaW5nIHRlc3Rpbmc6Ok5lOwordXNpbmcgdGVzdGluZzo6Tm90OwordXNpbmcgdGVzdGluZzo6Tm90TnVsbDsKK3VzaW5nIHRlc3Rpbmc6OlBhaXI7Cit1c2luZyB0ZXN0aW5nOjpQb2ludGVlOwordXNpbmcgdGVzdGluZzo6UG9pbnR3aXNlOwordXNpbmcgdGVzdGluZzo6UG9seW1vcnBoaWNNYXRjaGVyOwordXNpbmcgdGVzdGluZzo6UHJvcGVydHk7Cit1c2luZyB0ZXN0aW5nOjpSZWY7Cit1c2luZyB0ZXN0aW5nOjpSZXN1bHRPZjsKK3VzaW5nIHRlc3Rpbmc6OlNpemVJczsKK3VzaW5nIHRlc3Rpbmc6OlN0YXJ0c1dpdGg7Cit1c2luZyB0ZXN0aW5nOjpTdHJDYXNlRXE7Cit1c2luZyB0ZXN0aW5nOjpTdHJDYXNlTmU7Cit1c2luZyB0ZXN0aW5nOjpTdHJFcTsKK3VzaW5nIHRlc3Rpbmc6OlN0ck5lOwordXNpbmcgdGVzdGluZzo6U3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lcjsKK3VzaW5nIHRlc3Rpbmc6OlRydWx5OwordXNpbmcgdGVzdGluZzo6VHlwZWRFcTsKK3VzaW5nIHRlc3Rpbmc6OlVub3JkZXJlZFBvaW50d2lzZTsKK3VzaW5nIHRlc3Rpbmc6OlZhbHVlOwordXNpbmcgdGVzdGluZzo6V2hlblNvcnRlZDsKK3VzaW5nIHRlc3Rpbmc6OldoZW5Tb3J0ZWRCeTsKK3VzaW5nIHRlc3Rpbmc6Ol87Cit1c2luZyB0ZXN0aW5nOjpnZXQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6RHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkVsZW1lbnRNYXRjaGVyUGFpcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpFbGVtZW50TWF0Y2hlclBhaXJzOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkV4cGxhaW5NYXRjaEZhaWx1cmVUdXBsZVRvOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc1JlYWRhYmxlVHlwZU5hbWU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Sm9pbkFzVHVwbGU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpNYXRjaE1hdHJpeDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpSRTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nczsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nOwordXNpbmcgdGVzdGluZzo6bWFrZV90dXBsZTsKK3VzaW5nIHRlc3Rpbmc6OnR1cGxlOworCisvLyBGb3IgdGVzdGluZyBFeHBsYWluTWF0Y2hSZXN1bHRUbygpLgorY2xhc3MgR3JlYXRlclRoYW5NYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7CisgcHVibGljOgorICBleHBsaWNpdCBHcmVhdGVyVGhhbk1hdGNoZXIoaW50IHJocykgOiByaHNfKHJocykge30KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyhvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiaXMgPiAiIDw8IHJoc187CisgIH0KKworICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICBjb25zdCBpbnQgZGlmZiA9IGxocyAtIHJoc187CisgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzICIgPDwgZGlmZiA8PCAiIG1vcmUgdGhhbiAiIDw8IHJoc187CisgICAgfSBlbHNlIGlmIChkaWZmID09IDApIHsKKyAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgdGhlIHNhbWUgYXMgIiA8PCByaHNfOworICAgIH0gZWxzZSB7CisgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzICIgPDwgLWRpZmYgPDwgIiBsZXNzIHRoYW4gIiA8PCByaHNfOworICAgIH0KKworICAgIHJldHVybiBsaHMgPiByaHNfOworICB9CisKKyBwcml2YXRlOgorICBpbnQgcmhzXzsKK307CisKK01hdGNoZXI8aW50PiBHcmVhdGVyVGhhbihpbnQgbikgeworICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEdyZWF0ZXJUaGFuTWF0Y2hlcihuKSk7Cit9CisKK3N0cmluZyBPZlR5cGUoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIHsKKyNpZiBHVEVTVF9IQVNfUlRUSQorICByZXR1cm4gIiAob2YgdHlwZSAiICsgdHlwZV9uYW1lICsgIikiOworI2Vsc2UKKyAgcmV0dXJuICIiOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiBtYXRjaGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJpbmcgRGVzY3JpYmUoY29uc3QgTWF0Y2hlcjxUPiYgbSkgeworICBzdHJpbmdzdHJlYW0gc3M7CisgIG0uRGVzY3JpYmVUbygmc3MpOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZWdhdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0Y2hlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RyaW5nIERlc2NyaWJlTmVnYXRpb24oY29uc3QgTWF0Y2hlcjxUPiYgbSkgeworICBzdHJpbmdzdHJlYW0gc3M7CisgIG0uRGVzY3JpYmVOZWdhdGlvblRvKCZzcyk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gUmV0dXJucyB0aGUgcmVhc29uIHdoeSB4IG1hdGNoZXMsIG9yIGRvZXNuJ3QgbWF0Y2gsIG0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR5cGUsIHR5cGVuYW1lIFZhbHVlPgorc3RyaW5nIEV4cGxhaW4oY29uc3QgTWF0Y2hlclR5cGUmIG0sIGNvbnN0IFZhbHVlJiB4KSB7CisgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7CisgIEV4cGxhaW5NYXRjaFJlc3VsdChtLCB4LCAmbGlzdGVuZXIpOworICByZXR1cm4gbGlzdGVuZXIuc3RyKCk7Cit9CisKK1RFU1QoTWF0Y2hSZXN1bHRMaXN0ZW5lclRlc3QsIFN0cmVhbWluZ1dvcmtzKSB7CisgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7CisgIGxpc3RlbmVyIDw8ICJoaSIgPDwgNTsKKyAgRVhQRUNUX0VRKCJoaTUiLCBsaXN0ZW5lci5zdHIoKSk7CisKKyAgbGlzdGVuZXIuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKCIiLCBsaXN0ZW5lci5zdHIoKSk7CisKKyAgbGlzdGVuZXIgPDwgNDI7CisgIEVYUEVDVF9FUSgiNDIiLCBsaXN0ZW5lci5zdHIoKSk7CisKKyAgLy8gU3RyZWFtaW5nIHNob3VsZG4ndCBjcmFzaCB3aGVuIHRoZSB1bmRlcmx5aW5nIG9zdHJlYW0gaXMgTlVMTC4KKyAgRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyIGR1bW15OworICBkdW1teSA8PCAiaGkiIDw8IDU7Cit9CisKK1RFU1QoTWF0Y2hSZXN1bHRMaXN0ZW5lclRlc3QsIENhbkFjY2Vzc1VuZGVybHlpbmdTdHJlYW0pIHsKKyAgRVhQRUNUX1RSVUUoRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyKCkuc3RyZWFtKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIoTlVMTCkuc3RyZWFtKCkgPT0gTlVMTCk7CisKKyAgRVhQRUNUX0VRKCZzdGQ6OmNvdXQsIFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIoJnN0ZDo6Y291dCkuc3RyZWFtKCkpOworfQorCitURVNUKE1hdGNoUmVzdWx0TGlzdGVuZXJUZXN0LCBJc0ludGVyZXN0ZWRXb3JrcykgeworICBFWFBFQ1RfVFJVRShTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyKCkuSXNJbnRlcmVzdGVkKCkpOworICBFWFBFQ1RfVFJVRShTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyKCZzdGQ6OmNvdXQpLklzSW50ZXJlc3RlZCgpKTsKKworICBFWFBFQ1RfRkFMU0UoRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyKCkuSXNJbnRlcmVzdGVkKCkpOworICBFWFBFQ1RfRkFMU0UoU3RyZWFtTWF0Y2hSZXN1bHRMaXN0ZW5lcihOVUxMKS5Jc0ludGVyZXN0ZWQoKSk7Cit9CisKKy8vIE1ha2VzIHN1cmUgdGhhdCB0aGUgTWF0Y2hlckludGVyZmFjZTxUPiBpbnRlcmZhY2UgZG9lc24ndAorLy8gY2hhbmdlLgorY2xhc3MgRXZlbk1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8aW50PiB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7CisgICAgcmV0dXJuIHggJSAyID09IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyhvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiaXMgYW4gZXZlbiBudW1iZXIiOworICB9CisKKyAgLy8gV2UgZGVsaWJlcmF0ZWx5IGRvbid0IGRlZmluZSBEZXNjcmliZU5lZ2F0aW9uVG8oKSBhbmQKKyAgLy8gRXhwbGFpbk1hdGNoUmVzdWx0VG8oKSBoZXJlLCB0byBtYWtlIHN1cmUgdGhlIGRlZmluaXRpb24gb2YgdGhlc2UKKyAgLy8gdHdvIG1ldGhvZHMgaXMgb3B0aW9uYWwuCit9OworCisvLyBNYWtlcyBzdXJlIHRoYXQgdGhlIE1hdGNoZXJJbnRlcmZhY2UgQVBJIGRvZXNuJ3QgY2hhbmdlLgorVEVTVChNYXRjaGVySW50ZXJmYWNlVGVzdCwgQ2FuQmVJbXBsZW1lbnRlZFVzaW5nUHVibGlzaGVkQVBJKSB7CisgIEV2ZW5NYXRjaGVySW1wbCBtOworfQorCisvLyBUZXN0cyBpbXBsZW1lbnRpbmcgYSBtb25vbW9ycGhpYyBtYXRjaGVyIHVzaW5nIE1hdGNoQW5kRXhwbGFpbigpLgorCitjbGFzcyBOZXdFdmVuTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxpbnQ+IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oaW50IHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgY29uc3QgYm9vbCBtYXRjaCA9IHggJSAyID09IDA7CisgICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBjYW4gc3RyZWFtIHRvIGEgbGlzdGVuZXIgZGlyZWN0bHkuCisgICAgKmxpc3RlbmVyIDw8ICJ2YWx1ZSAlICIgPDwgMjsKKyAgICBpZiAobGlzdGVuZXItPnN0cmVhbSgpICE9IE5VTEwpIHsKKyAgICAgIC8vIFZlcmlmaWVzIHRoYXQgd2UgY2FuIHN0cmVhbSB0byBhIGxpc3RlbmVyJ3MgdW5kZXJseWluZyBzdHJlYW0KKyAgICAgIC8vIHRvby4KKyAgICAgICpsaXN0ZW5lci0+c3RyZWFtKCkgPDwgIiA9PSAiIDw8ICh4ICUgMik7CisgICAgfQorICAgIHJldHVybiBtYXRjaDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKG9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBhbiBldmVuIG51bWJlciI7CisgIH0KK307CisKK1RFU1QoTWF0Y2hlckludGVyZmFjZVRlc3QsIENhbkJlSW1wbGVtZW50ZWRVc2luZ05ld0FQSSkgeworICBNYXRjaGVyPGludD4gbSA9IE1ha2VNYXRjaGVyKG5ldyBOZXdFdmVuTWF0Y2hlckltcGwpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDMpKTsKKyAgRVhQRUNUX0VRKCJ2YWx1ZSAlIDIgPT0gMCIsIEV4cGxhaW4obSwgMikpOworICBFWFBFQ1RfRVEoInZhbHVlICUgMiA9PSAxIiwgRXhwbGFpbihtLCAzKSk7Cit9CisKKy8vIFRlc3RzIGRlZmF1bHQtY29uc3RydWN0aW5nIGEgbWF0Y2hlci4KK1RFU1QoTWF0Y2hlclRlc3QsIENhbkJlRGVmYXVsdENvbnN0cnVjdGVkKSB7CisgIE1hdGNoZXI8ZG91YmxlPiBtOworfQorCisvLyBUZXN0cyB0aGF0IE1hdGNoZXI8VD4gY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYSBNYXRjaGVySW50ZXJmYWNlPFQ+Ki4KK1RFU1QoTWF0Y2hlclRlc3QsIENhbkJlQ29uc3RydWN0ZWRGcm9tTWF0Y2hlckludGVyZmFjZSkgeworICBjb25zdCBNYXRjaGVySW50ZXJmYWNlPGludD4qIGltcGwgPSBuZXcgRXZlbk1hdGNoZXJJbXBsOworICBNYXRjaGVyPGludD4gbShpbXBsKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDQpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyg1KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdmFsdWUgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgRXEodmFsdWUpLgorVEVTVChNYXRjaGVyVGVzdCwgQ2FuQmVJbXBsaWNpdGx5Q29uc3RydWN0ZWRGcm9tVmFsdWUpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0xID0gNTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyg1KSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKDYpKTsKK30KKworLy8gVGVzdHMgdGhhdCBOVUxMIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIEVxKE5VTEwpLgorVEVTVChNYXRjaGVyVGVzdCwgQ2FuQmVJbXBsaWNpdGx5Q29uc3RydWN0ZWRGcm9tTlVMTCkgeworICBNYXRjaGVyPGludCo+IG0xID0gTlVMTDsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhOVUxMKSk7CisgIGludCBuID0gMDsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoJm4pKTsKK30KKworLy8gVGVzdHMgdGhhdCBtYXRjaGVycyBhcmUgY29weWFibGUuCitURVNUKE1hdGNoZXJUZXN0LCBJc0NvcHlhYmxlKSB7CisgIC8vIFRlc3RzIHRoZSBjb3B5IGNvbnN0cnVjdG9yLgorICBNYXRjaGVyPGJvb2w+IG0xID0gRXEoZmFsc2UpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKHRydWUpKTsKKworICAvLyBUZXN0cyB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgbTEgPSBFcSh0cnVlKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyh0cnVlKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKGZhbHNlKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTWF0Y2hlcjxUPjo6RGVzY3JpYmVUbygpIGNhbGxzCisvLyBNYXRjaGVySW50ZXJmYWNlPFQ+OjpEZXNjcmliZVRvKCkuCitURVNUKE1hdGNoZXJUZXN0LCBDYW5EZXNjcmliZUl0c2VsZikgeworICBFWFBFQ1RfRVEoImlzIGFuIGV2ZW4gbnVtYmVyIiwKKyAgICAgICAgICAgIERlc2NyaWJlKE1hdGNoZXI8aW50PihuZXcgRXZlbk1hdGNoZXJJbXBsKSkpOworfQorCisvLyBUZXN0cyBNYXRjaGVyPFQ+OjpNYXRjaEFuZEV4cGxhaW4oKS4KK1RFU1QoTWF0Y2hlclRlc3QsIE1hdGNoQW5kRXhwbGFpbikgeworICBNYXRjaGVyPGludD4gbSA9IEdyZWF0ZXJUaGFuKDApOworICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaEFuZEV4cGxhaW4oNDIsICZsaXN0ZW5lcjEpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyA0MiBtb3JlIHRoYW4gMCIsIGxpc3RlbmVyMS5zdHIoKSk7CisKKyAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjI7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoQW5kRXhwbGFpbigtOSwgJmxpc3RlbmVyMikpOworICBFWFBFQ1RfRVEoIndoaWNoIGlzIDkgbGVzcyB0aGFuIDAiLCBsaXN0ZW5lcjIuc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgQy1zdHJpbmcgbGl0ZXJhbCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYQorLy8gTWF0Y2hlcjxzdHJpbmc+IG9yIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4uCitURVNUKFN0cmluZ01hdGNoZXJUZXN0LCBDYW5CZUltcGxpY2l0bHlDb25zdHJ1Y3RlZEZyb21DU3RyaW5nTGl0ZXJhbCkgeworICBNYXRjaGVyPHN0cmluZz4gbTEgPSAiaGkiOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJoaSIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoImhlbGxvIikpOworCisgIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4gbTIgPSAiaGkiOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCJoaSIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoImhlbGxvIikpOworfQorCisvLyBUZXN0cyB0aGF0IGEgc3RyaW5nIG9iamVjdCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYQorLy8gTWF0Y2hlcjxzdHJpbmc+IG9yIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4uCitURVNUKFN0cmluZ01hdGNoZXJUZXN0LCBDYW5CZUltcGxpY2l0bHlDb25zdHJ1Y3RlZEZyb21TdHJpbmcpIHsKKyAgTWF0Y2hlcjxzdHJpbmc+IG0xID0gc3RyaW5nKCJoaSIpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJoaSIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoImhlbGxvIikpOworCisgIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4gbTIgPSBzdHJpbmcoImhpIik7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImhpIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiaGVsbG8iKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXworLy8gVGVzdHMgdGhhdCBhIEMtc3RyaW5nIGxpdGVyYWwgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEKKy8vIE1hdGNoZXI8U3RyaW5nUGllY2U+IG9yIE1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPi4KK1RFU1QoU3RyaW5nUGllY2VNYXRjaGVyVGVzdCwgQ2FuQmVJbXBsaWNpdGx5Q29uc3RydWN0ZWRGcm9tQ1N0cmluZ0xpdGVyYWwpIHsKKyAgTWF0Y2hlcjxTdHJpbmdQaWVjZT4gbTEgPSAiY2F0cyI7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoImNhdHMiKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKCJkb2dzIikpOworCisgIE1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPiBtMiA9ICJjYXRzIjsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiY2F0cyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoImRvZ3MiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBzdHJpbmcgb2JqZWN0IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhCisvLyBNYXRjaGVyPFN0cmluZ1BpZWNlPiBvciBNYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj4uCitURVNUKFN0cmluZ1BpZWNlTWF0Y2hlclRlc3QsIENhbkJlSW1wbGljaXRseUNvbnN0cnVjdGVkRnJvbVN0cmluZykgeworICBNYXRjaGVyPFN0cmluZ1BpZWNlPiBtMSA9IHN0cmluZygiY2F0cyIpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJjYXRzIikpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygiZG9ncyIpKTsKKworICBNYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj4gbTIgPSBzdHJpbmcoImNhdHMiKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiY2F0cyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoImRvZ3MiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBTdHJpbmdQaWVjZSBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEKKy8vIE1hdGNoZXI8U3RyaW5nUGllY2U+IG9yIE1hdGNoZXI8Y29uc3QgU3RyaW5nUGllY2UmPi4KK1RFU1QoU3RyaW5nUGllY2VNYXRjaGVyVGVzdCwgQ2FuQmVJbXBsaWNpdGx5Q29uc3RydWN0ZWRGcm9tU3RyaW5nUGllY2UpIHsKKyAgTWF0Y2hlcjxTdHJpbmdQaWVjZT4gbTEgPSBTdHJpbmdQaWVjZSgiY2F0cyIpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJjYXRzIikpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygiZG9ncyIpKTsKKworICBNYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj4gbTIgPSBTdHJpbmdQaWVjZSgiY2F0cyIpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCJjYXRzIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiZG9ncyIpKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KKworLy8gVGVzdHMgdGhhdCBNYWtlTWF0Y2hlcigpIGNvbnN0cnVjdHMgYSBNYXRjaGVyPFQ+IGZyb20gYQorLy8gTWF0Y2hlckludGVyZmFjZSogd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZXhwbGljaXRseQorLy8gd3JpdGUgdGhlIHR5cGUuCitURVNUKE1ha2VNYXRjaGVyVGVzdCwgQ29uc3RydWN0c01hdGNoZXJGcm9tTWF0Y2hlckludGVyZmFjZSkgeworICBjb25zdCBNYXRjaGVySW50ZXJmYWNlPGludD4qIGR1bW15X2ltcGwgPSBOVUxMOworICBNYXRjaGVyPGludD4gbSA9IE1ha2VNYXRjaGVyKGR1bW15X2ltcGwpOworfQorCisvLyBUZXN0cyB0aGF0IE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKSBjYW4gY29uc3RydWN0IGEgcG9seW1vcnBoaWMKKy8vIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIG9sZCBBUEkuCitjb25zdCBpbnQgZ19iYXIgPSAxOworY2xhc3MgUmVmZXJlbmNlc0Jhck9ySXNaZXJvSW1wbCB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgVCYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKKyAgICBjb25zdCB2b2lkKiBwID0gJng7CisgICAgcmV0dXJuIHAgPT0gJmdfYmFyIHx8IHggPT0gMDsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVUbyhvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImdfYmFyIG9yIHplcm8iOyB9CisKKyAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8ob3N0cmVhbSogb3MpIGNvbnN0IHsKKyAgICAqb3MgPDwgImRvZXNuJ3QgcmVmZXJlbmNlIGdfYmFyIGFuZCBpcyBub3QgemVybyI7CisgIH0KK307CisKKy8vIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhhdCBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKCkgcmV0dXJucyBhCisvLyBQb2x5bW9ycGhpY01hdGNoZXI8VD4gd2hlcmUgVCBpcyB0aGUgYXJndW1lbnQncyB0eXBlLgorUG9seW1vcnBoaWNNYXRjaGVyPFJlZmVyZW5jZXNCYXJPcklzWmVyb0ltcGw+IFJlZmVyZW5jZXNCYXJPcklzWmVybygpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoUmVmZXJlbmNlc0Jhck9ySXNaZXJvSW1wbCgpKTsKK30KKworVEVTVChNYWtlUG9seW1vcnBoaWNNYXRjaGVyVGVzdCwgQ29uc3RydWN0c01hdGNoZXJVc2luZ09sZEFQSSkgeworICAvLyBVc2luZyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdG8gbWF0Y2ggYSByZWZlcmVuY2UgdHlwZS4KKyAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtMSA9IFJlZmVyZW5jZXNCYXJPcklzWmVybygpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDApKTsKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgaWRlbnRpdHkgb2YgYSBieS1yZWZlcmVuY2UgYXJndW1lbnQgaXMgcHJlc2VydmVkLgorICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGdfYmFyKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKDEpKTsKKyAgRVhQRUNUX0VRKCJnX2JhciBvciB6ZXJvIiwgRGVzY3JpYmUobTEpKTsKKworICAvLyBVc2luZyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdG8gbWF0Y2ggYSB2YWx1ZSB0eXBlLgorICBNYXRjaGVyPGRvdWJsZT4gbTIgPSBSZWZlcmVuY2VzQmFyT3JJc1plcm8oKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwLjApKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoMC4xKSk7CisgIEVYUEVDVF9FUSgiZ19iYXIgb3IgemVybyIsIERlc2NyaWJlKG0yKSk7Cit9CisKKy8vIFRlc3RzIGltcGxlbWVudGluZyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdXNpbmcgTWF0Y2hBbmRFeHBsYWluKCkuCisKK2NsYXNzIFBvbHltb3JwaGljSXNFdmVuSW1wbCB7CisgcHVibGljOgorICB2b2lkIERlc2NyaWJlVG8ob3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpcyBldmVuIjsgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKG9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBvZGQiOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFQmIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBjYW4gc3RyZWFtIHRvIHRoZSBsaXN0ZW5lciBkaXJlY3RseS4KKyAgICAqbGlzdGVuZXIgPDwgIiUgIiA8PCAyOworICAgIGlmIChsaXN0ZW5lci0+c3RyZWFtKCkgIT0gTlVMTCkgeworICAgICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBjYW4gc3RyZWFtIHRvIHRoZSBsaXN0ZW5lcidzIHVuZGVybHlpbmcgc3RyZWFtCisgICAgICAvLyB0b28uCisgICAgICAqbGlzdGVuZXItPnN0cmVhbSgpIDw8ICIgPT0gIiA8PCAoeCAlIDIpOworICAgIH0KKyAgICByZXR1cm4gKHggJSAyKSA9PSAwOworICB9Cit9OworCitQb2x5bW9ycGhpY01hdGNoZXI8UG9seW1vcnBoaWNJc0V2ZW5JbXBsPiBQb2x5bW9ycGhpY0lzRXZlbigpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoUG9seW1vcnBoaWNJc0V2ZW5JbXBsKCkpOworfQorCitURVNUKE1ha2VQb2x5bW9ycGhpY01hdGNoZXJUZXN0LCBDb25zdHJ1Y3RzTWF0Y2hlclVzaW5nTmV3QVBJKSB7CisgIC8vIFVzaW5nIFBvbHltb3JwaGljSXNFdmVuKCkgYXMgYSBNYXRjaGVyPGludD4uCisgIGNvbnN0IE1hdGNoZXI8aW50PiBtMSA9IFBvbHltb3JwaGljSXNFdmVuKCk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoNDIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoNDMpKTsKKyAgRVhQRUNUX0VRKCJpcyBldmVuIiwgRGVzY3JpYmUobTEpKTsKKworICBjb25zdCBNYXRjaGVyPGludD4gbm90X20xID0gTm90KG0xKTsKKyAgRVhQRUNUX0VRKCJpcyBvZGQiLCBEZXNjcmliZShub3RfbTEpKTsKKworICBFWFBFQ1RfRVEoIiUgMiA9PSAwIiwgRXhwbGFpbihtMSwgNDIpKTsKKworICAvLyBVc2luZyBQb2x5bW9ycGhpY0lzRXZlbigpIGFzIGEgTWF0Y2hlcjxjaGFyPi4KKyAgY29uc3QgTWF0Y2hlcjxjaGFyPiBtMiA9IFBvbHltb3JwaGljSXNFdmVuKCk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoJ1x4NDInKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCdceDQzJykpOworICBFWFBFQ1RfRVEoImlzIGV2ZW4iLCBEZXNjcmliZShtMikpOworCisgIGNvbnN0IE1hdGNoZXI8Y2hhcj4gbm90X20yID0gTm90KG0yKTsKKyAgRVhQRUNUX0VRKCJpcyBvZGQiLCBEZXNjcmliZShub3RfbTIpKTsKKworICBFWFBFQ1RfRVEoIiUgMiA9PSAwIiwgRXhwbGFpbihtMiwgJ1x4NDInKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTWF0Y2hlckNhc3Q8VD4obSkgd29ya3Mgd2hlbiBtIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlci4KK1RFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tUG9seW1vcnBoaWNNYXRjaGVyKSB7CisgIE1hdGNoZXI8aW50PiBtID0gTWF0Y2hlckNhc3Q8aW50PihFcSg1KSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyg1KSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoNikpOworfQorCisvLyBGb3IgdGVzdGluZyBjYXN0aW5nIG1hdGNoZXJzIGJldHdlZW4gY29tcGF0aWJsZSB0eXBlcy4KK2NsYXNzIEludFZhbHVlIHsKKyBwdWJsaWM6CisgIC8vIEFuIGludCBjYW4gYmUgc3RhdGljYWxseSAoYWx0aG91Z2ggbm90IGltcGxpY2l0bHkpIGNhc3QgdG8gYQorICAvLyBJbnRWYWx1ZS4KKyAgZXhwbGljaXQgSW50VmFsdWUoaW50IGFfdmFsdWUpIDogdmFsdWVfKGFfdmFsdWUpIHt9CisKKyAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgcHJpdmF0ZToKKyAgaW50IHZhbHVlXzsKK307CisKKy8vIEZvciB0ZXN0aW5nIGNhc3RpbmcgbWF0Y2hlcnMgYmV0d2VlbiBjb21wYXRpYmxlIHR5cGVzLgorYm9vbCBJc1Bvc2l0aXZlSW50VmFsdWUoY29uc3QgSW50VmFsdWUmIGZvbykgeworICByZXR1cm4gZm9vLnZhbHVlKCkgPiAwOworfQorCisvLyBUZXN0cyB0aGF0IE1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VT4gd2hlcmUgVAorLy8gY2FuIGJlIHN0YXRpY2FsbHkgY29udmVydGVkIHRvIFUuCitURVNUKE1hdGNoZXJDYXN0VGVzdCwgRnJvbUNvbXBhdGlibGVUeXBlKSB7CisgIE1hdGNoZXI8ZG91YmxlPiBtMSA9IEVxKDIuMCk7CisgIE1hdGNoZXI8aW50PiBtMiA9IE1hdGNoZXJDYXN0PGludD4obTEpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoMykpOworCisgIE1hdGNoZXI8SW50VmFsdWU+IG0zID0gVHJ1bHkoSXNQb3NpdGl2ZUludFZhbHVlKTsKKyAgTWF0Y2hlcjxpbnQ+IG00ID0gTWF0Y2hlckNhc3Q8aW50PihtMyk7CisgIC8vIEluIHRoZSBmb2xsb3dpbmcsIHRoZSBhcmd1bWVudHMgMSBhbmQgMCBhcmUgc3RhdGljYWxseSBjb252ZXJ0ZWQKKyAgLy8gdG8gSW50VmFsdWUgb2JqZWN0cywgYW5kIHRoZW4gdGVzdGVkIGJ5IHRoZSBJc1Bvc2l0aXZlSW50VmFsdWUoKQorICAvLyBwcmVkaWNhdGUuCisgIEVYUEVDVF9UUlVFKG00Lk1hdGNoZXMoMSkpOworICBFWFBFQ1RfRkFMU0UobTQuTWF0Y2hlcygwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTWF0Y2hlckNhc3Q8VD4obSkgd29ya3Mgd2hlbiBtIGlzIGEgTWF0Y2hlcjxjb25zdCBUJj4uCitURVNUKE1hdGNoZXJDYXN0VGVzdCwgRnJvbUNvbnN0UmVmZXJlbmNlVG9Ob25SZWZlcmVuY2UpIHsKKyAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtMSA9IEVxKDApOworICBNYXRjaGVyPGludD4gbTIgPSBNYXRjaGVyQ2FzdDxpbnQ+KG0xKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBNYXRjaGVyQ2FzdDxUPihtKSB3b3JrcyB3aGVuIG0gaXMgYSBNYXRjaGVyPFQmPi4KK1RFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tUmVmZXJlbmNlVG9Ob25SZWZlcmVuY2UpIHsKKyAgTWF0Y2hlcjxpbnQmPiBtMSA9IEVxKDApOworICBNYXRjaGVyPGludD4gbTIgPSBNYXRjaGVyQ2FzdDxpbnQ+KG0xKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBNYXRjaGVyQ2FzdDxjb25zdCBUJj4obSkgd29ya3Mgd2hlbiBtIGlzIGEgTWF0Y2hlcjxUPi4KK1RFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tTm9uUmVmZXJlbmNlVG9Db25zdFJlZmVyZW5jZSkgeworICBNYXRjaGVyPGludD4gbTEgPSBFcSgwKTsKKyAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtMiA9IE1hdGNoZXJDYXN0PGNvbnN0IGludCY+KG0xKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBNYXRjaGVyQ2FzdDxUJj4obSkgd29ya3Mgd2hlbiBtIGlzIGEgTWF0Y2hlcjxUPi4KK1RFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tTm9uUmVmZXJlbmNlVG9SZWZlcmVuY2UpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0xID0gRXEoMCk7CisgIE1hdGNoZXI8aW50Jj4gbTIgPSBNYXRjaGVyQ2FzdDxpbnQmPihtMSk7CisgIGludCBuID0gMDsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhuKSk7CisgIG4gPSAxOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhuKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTWF0Y2hlckNhc3Q8VD4obSkgd29ya3Mgd2hlbiBtIGlzIGEgTWF0Y2hlcjxUPi4KK1RFU1QoTWF0Y2hlckNhc3RUZXN0LCBGcm9tU2FtZVR5cGUpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0xID0gRXEoMCk7CisgIE1hdGNoZXI8aW50PiBtMiA9IE1hdGNoZXJDYXN0PGludD4obTEpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDApKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoMSkpOworfQorCisvLyBJbXBsaWNpdGx5IGNvbnZlcnRpYmxlIGZyb20gYW55IHR5cGUuCitzdHJ1Y3QgQ29udmVydGlibGVGcm9tQW55IHsKKyAgQ29udmVydGlibGVGcm9tQW55KGludCBhX3ZhbHVlKSA6IHZhbHVlKGFfdmFsdWUpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBDb252ZXJ0aWJsZUZyb21BbnkoY29uc3QgVCYgLyphX3ZhbHVlKi8pIDogdmFsdWUoLTEpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJDb252ZXJzaW9uIGNvbnN0cnVjdG9yIGNhbGxlZCI7CisgIH0KKyAgaW50IHZhbHVlOworfTsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnZlcnRpYmxlRnJvbUFueSYgYSwgY29uc3QgQ29udmVydGlibGVGcm9tQW55JiBiKSB7CisgIHJldHVybiBhLnZhbHVlID09IGIudmFsdWU7Cit9CisKK29zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IENvbnZlcnRpYmxlRnJvbUFueSYgYSkgeworICByZXR1cm4gb3MgPDwgYS52YWx1ZTsKK30KKworVEVTVChNYXRjaGVyQ2FzdFRlc3QsIENvbnZlcnNpb25Db25zdHJ1Y3RvcklzVXNlZCkgeworICBNYXRjaGVyPENvbnZlcnRpYmxlRnJvbUFueT4gbSA9IE1hdGNoZXJDYXN0PENvbnZlcnRpYmxlRnJvbUFueT4oMSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhDb252ZXJ0aWJsZUZyb21BbnkoMSkpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhDb252ZXJ0aWJsZUZyb21BbnkoMikpKTsKK30KKworVEVTVChNYXRjaGVyQ2FzdFRlc3QsIEZyb21Db252ZXJ0aWJsZUZyb21BbnkpIHsKKyAgTWF0Y2hlcjxDb252ZXJ0aWJsZUZyb21Bbnk+IG0gPQorICAgICAgTWF0Y2hlckNhc3Q8Q29udmVydGlibGVGcm9tQW55PihFcShDb252ZXJ0aWJsZUZyb21BbnkoMSkpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKENvbnZlcnRpYmxlRnJvbUFueSgxKSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKENvbnZlcnRpYmxlRnJvbUFueSgyKSkpOworfQorCitzdHJ1Y3QgSW50UmVmZXJlbmNlV3JhcHBlciB7CisgIEludFJlZmVyZW5jZVdyYXBwZXIoY29uc3QgaW50JiBhX3ZhbHVlKSA6IHZhbHVlKCZhX3ZhbHVlKSB7fQorICBjb25zdCBpbnQqIHZhbHVlOworfTsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludFJlZmVyZW5jZVdyYXBwZXImIGEsIGNvbnN0IEludFJlZmVyZW5jZVdyYXBwZXImIGIpIHsKKyAgcmV0dXJuIGEudmFsdWUgPT0gYi52YWx1ZTsKK30KKworVEVTVChNYXRjaGVyQ2FzdFRlc3QsIFZhbHVlSXNOb3RDb3BpZWQpIHsKKyAgaW50IG4gPSA0MjsKKyAgTWF0Y2hlcjxJbnRSZWZlcmVuY2VXcmFwcGVyPiBtID0gTWF0Y2hlckNhc3Q8SW50UmVmZXJlbmNlV3JhcHBlcj4obik7CisgIC8vIFZlcmlmeSB0aGF0IHRoZSBtYXRjaGVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvIG4sIG5vdCB0byBpdHMgdGVtcG9yYXJ5IGNvcHkuCisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuKSk7Cit9CisKK2NsYXNzIEJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+QmFzZSgpIHt9CisgIEJhc2UoKSB7fQorIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQmFzZSk7Cit9OworCitjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgeworIHB1YmxpYzoKKyAgRGVyaXZlZCgpIDogQmFzZSgpIHt9CisgIGludCBpOworfTsKKworY2xhc3MgT3RoZXJEZXJpdmVkIDogcHVibGljIEJhc2Uge307CisKKy8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIHBvbHltb3JwaGljIG1hdGNoZXIuCitURVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIEZyb21Qb2x5bW9ycGhpY01hdGNoZXIpIHsKKyAgTWF0Y2hlcjxjaGFyPiBtMiA9IFNhZmVNYXRjaGVyQ2FzdDxjaGFyPihFcSgzMikpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCcgJykpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygnXG4nKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VT4gd2hlcmUKKy8vIFQgYW5kIFUgYXJlIGFyaXRobWV0aWMgdHlwZXMgYW5kIFQgY2FuIGJlIGxvc3NsZXNzbHkgY29udmVydGVkIHRvCisvLyBVLgorVEVTVChTYWZlTWF0Y2hlckNhc3RUZXN0LCBGcm9tTG9zc2xlc3NseUNvbnZlcnRpYmxlQXJpdGhtZXRpY1R5cGUpIHsKKyAgTWF0Y2hlcjxkb3VibGU+IG0xID0gRG91YmxlRXEoMS4wKTsKKyAgTWF0Y2hlcjxmbG9hdD4gbTIgPSBTYWZlTWF0Y2hlckNhc3Q8ZmxvYXQ+KG0xKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygxLjBmKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDIuMGYpKTsKKworICBNYXRjaGVyPGNoYXI+IG0zID0gU2FmZU1hdGNoZXJDYXN0PGNoYXI+KFR5cGVkRXE8aW50PignYScpKTsKKyAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcygnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoJ2InKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VT4gd2hlcmUgVCBhbmQgVQorLy8gYXJlIHBvaW50ZXJzIG9yIHJlZmVyZW5jZXMgdG8gYSBkZXJpdmVkIGFuZCBhIGJhc2UgY2xhc3MsIGNvcnJlc3BvbmRpbmdseS4KK1RFU1QoU2FmZU1hdGNoZXJDYXN0VGVzdCwgRnJvbUJhc2VDbGFzcykgeworICBEZXJpdmVkIGQsIGQyOworICBNYXRjaGVyPEJhc2UqPiBtMSA9IEVxKCZkKTsKKyAgTWF0Y2hlcjxEZXJpdmVkKj4gbTIgPSBTYWZlTWF0Y2hlckNhc3Q8RGVyaXZlZCo+KG0xKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygmZCkpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygmZDIpKTsKKworICBNYXRjaGVyPEJhc2UmPiBtMyA9IFJlZihkKTsKKyAgTWF0Y2hlcjxEZXJpdmVkJj4gbTQgPSBTYWZlTWF0Y2hlckNhc3Q8RGVyaXZlZCY+KG0zKTsKKyAgRVhQRUNUX1RSVUUobTQuTWF0Y2hlcyhkKSk7CisgIEVYUEVDVF9GQUxTRShtNC5NYXRjaGVzKGQyKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQmPihtKSB3b3JrcyB3aGVuIG0gaXMgYSBNYXRjaGVyPGNvbnN0IFQmPi4KK1RFU1QoU2FmZU1hdGNoZXJDYXN0VGVzdCwgRnJvbUNvbnN0UmVmZXJlbmNlVG9SZWZlcmVuY2UpIHsKKyAgaW50IG4gPSAwOworICBNYXRjaGVyPGNvbnN0IGludCY+IG0xID0gUmVmKG4pOworICBNYXRjaGVyPGludCY+IG0yID0gU2FmZU1hdGNoZXJDYXN0PGludCY+KG0xKTsKKyAgaW50IG4xID0gMDsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhuKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKG4xKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VD4uCitURVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIEZyb21Ob25SZWZlcmVuY2VUb0NvbnN0UmVmZXJlbmNlKSB7CisgIE1hdGNoZXI8aW50PiBtMSA9IEVxKDApOworICBNYXRjaGVyPGNvbnN0IGludCY+IG0yID0gU2FmZU1hdGNoZXJDYXN0PGNvbnN0IGludCY+KG0xKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBTYWZlTWF0Y2hlckNhc3Q8VCY+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VD4uCitURVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIEZyb21Ob25SZWZlcmVuY2VUb1JlZmVyZW5jZSkgeworICBNYXRjaGVyPGludD4gbTEgPSBFcSgwKTsKKyAgTWF0Y2hlcjxpbnQmPiBtMiA9IFNhZmVNYXRjaGVyQ2FzdDxpbnQmPihtMSk7CisgIGludCBuID0gMDsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhuKSk7CisgIG4gPSAxOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhuKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgU2FmZU1hdGNoZXJDYXN0PFQ+KG0pIHdvcmtzIHdoZW4gbSBpcyBhIE1hdGNoZXI8VD4uCitURVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIEZyb21TYW1lVHlwZSkgeworICBNYXRjaGVyPGludD4gbTEgPSBFcSgwKTsKKyAgTWF0Y2hlcjxpbnQ+IG0yID0gU2FmZU1hdGNoZXJDYXN0PGludD4obTEpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDApKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoMSkpOworfQorCitURVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIENvbnZlcnNpb25Db25zdHJ1Y3RvcklzVXNlZCkgeworICBNYXRjaGVyPENvbnZlcnRpYmxlRnJvbUFueT4gbSA9IFNhZmVNYXRjaGVyQ2FzdDxDb252ZXJ0aWJsZUZyb21Bbnk+KDEpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoQ29udmVydGlibGVGcm9tQW55KDEpKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoQ29udmVydGlibGVGcm9tQW55KDIpKSk7Cit9CisKK1RFU1QoU2FmZU1hdGNoZXJDYXN0VGVzdCwgRnJvbUNvbnZlcnRpYmxlRnJvbUFueSkgeworICBNYXRjaGVyPENvbnZlcnRpYmxlRnJvbUFueT4gbSA9CisgICAgICBTYWZlTWF0Y2hlckNhc3Q8Q29udmVydGlibGVGcm9tQW55PihFcShDb252ZXJ0aWJsZUZyb21BbnkoMSkpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKENvbnZlcnRpYmxlRnJvbUFueSgxKSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKENvbnZlcnRpYmxlRnJvbUFueSgyKSkpOworfQorCitURVNUKFNhZmVNYXRjaGVyQ2FzdFRlc3QsIFZhbHVlSXNOb3RDb3BpZWQpIHsKKyAgaW50IG4gPSA0MjsKKyAgTWF0Y2hlcjxJbnRSZWZlcmVuY2VXcmFwcGVyPiBtID0gU2FmZU1hdGNoZXJDYXN0PEludFJlZmVyZW5jZVdyYXBwZXI+KG4pOworICAvLyBWZXJpZnkgdGhhdCB0aGUgbWF0Y2hlciBob2xkcyBhIHJlZmVyZW5jZSB0byBuLCBub3QgdG8gaXRzIHRlbXBvcmFyeSBjb3B5LgorICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobikpOworfQorCitURVNUKEV4cGVjdFRoYXQsIFRha2VzTGl0ZXJhbHMpIHsKKyAgRVhQRUNUX1RIQVQoMSwgMSk7CisgIEVYUEVDVF9USEFUKDEuMCwgMS4wKTsKKyAgRVhQRUNUX1RIQVQoc3RyaW5nKCksICIiKTsKK30KKworVEVTVChFeHBlY3RUaGF0LCBUYWtlc0Z1bmN0aW9ucykgeworICBzdHJ1Y3QgSGVscGVyIHsKKyAgICBzdGF0aWMgdm9pZCBGdW5jKCkge30KKyAgfTsKKyAgdm9pZCAoKmZ1bmMpKCkgPSBIZWxwZXI6OkZ1bmM7CisgIEVYUEVDVF9USEFUKGZ1bmMsIEhlbHBlcjo6RnVuYyk7CisgIEVYUEVDVF9USEFUKGZ1bmMsICZIZWxwZXI6OkZ1bmMpOworfQorCisvLyBUZXN0cyB0aGF0IEE8VD4oKSBtYXRjaGVzIGFueSB2YWx1ZSBvZiB0eXBlIFQuCitURVNUKEFUZXN0LCBNYXRjaGVzQW55VmFsdWUpIHsKKyAgLy8gVGVzdHMgYSBtYXRjaGVyIGZvciBhIHZhbHVlIHR5cGUuCisgIE1hdGNoZXI8ZG91YmxlPiBtMSA9IEE8ZG91YmxlPigpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDkxLjQzKSk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoLTE1LjMyKSk7CisKKyAgLy8gVGVzdHMgYSBtYXRjaGVyIGZvciBhIHJlZmVyZW5jZSB0eXBlLgorICBpbnQgYSA9IDI7CisgIGludCBiID0gLTY7CisgIE1hdGNoZXI8aW50Jj4gbTIgPSBBPGludCY+KCk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoYSkpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKGIpKTsKK30KKworVEVTVChBVGVzdCwgV29ya3NGb3JEZXJpdmVkQ2xhc3MpIHsKKyAgQmFzZSBiYXNlOworICBEZXJpdmVkIGRlcml2ZWQ7CisgIEVYUEVDVF9USEFUKCZiYXNlLCBBPEJhc2UqPigpKTsKKyAgLy8gVGhpcyBzaG91bGRuJ3QgY29tcGlsZTogRVhQRUNUX1RIQVQoJmJhc2UsIEE8RGVyaXZlZCo+KCkpOworICBFWFBFQ1RfVEhBVCgmZGVyaXZlZCwgQTxCYXNlKj4oKSk7CisgIEVYUEVDVF9USEFUKCZkZXJpdmVkLCBBPERlcml2ZWQqPigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBBPFQ+KCkgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoQVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBFWFBFQ1RfRVEoImlzIGFueXRoaW5nIiwgRGVzY3JpYmUoQTxib29sPigpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQW48VD4oKSBtYXRjaGVzIGFueSB2YWx1ZSBvZiB0eXBlIFQuCitURVNUKEFuVGVzdCwgTWF0Y2hlc0FueVZhbHVlKSB7CisgIC8vIFRlc3RzIGEgbWF0Y2hlciBmb3IgYSB2YWx1ZSB0eXBlLgorICBNYXRjaGVyPGludD4gbTEgPSBBbjxpbnQ+KCk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoOTE0MykpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKC0xNTMyKSk7CisKKyAgLy8gVGVzdHMgYSBtYXRjaGVyIGZvciBhIHJlZmVyZW5jZSB0eXBlLgorICBpbnQgYSA9IDI7CisgIGludCBiID0gLTY7CisgIE1hdGNoZXI8aW50Jj4gbTIgPSBBbjxpbnQmPigpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKGEpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQW48VD4oKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChBblRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBFWFBFQ1RfRVEoImlzIGFueXRoaW5nIiwgRGVzY3JpYmUoQW48aW50PigpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgXyBjYW4gYmUgdXNlZCBhcyBhIG1hdGNoZXIgZm9yIGFueSB0eXBlIGFuZCBtYXRjaGVzIGFueQorLy8gdmFsdWUgb2YgdGhhdCB0eXBlLgorVEVTVChVbmRlcnNjb3JlVGVzdCwgTWF0Y2hlc0FueVZhbHVlKSB7CisgIC8vIFVzZXMgXyBhcyBhIG1hdGNoZXIgZm9yIGEgdmFsdWUgdHlwZS4KKyAgTWF0Y2hlcjxpbnQ+IG0xID0gXzsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygxMjMpKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygtMjQyKSk7CisKKyAgLy8gVXNlcyBfIGFzIGEgbWF0Y2hlciBmb3IgYSByZWZlcmVuY2UgdHlwZS4KKyAgYm9vbCBhID0gZmFsc2U7CisgIGNvbnN0IGJvb2wgYiA9IHRydWU7CisgIE1hdGNoZXI8Y29uc3QgYm9vbCY+IG0yID0gXzsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhhKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoYikpOworfQorCisvLyBUZXN0cyB0aGF0IF8gZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoVW5kZXJzY29yZVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGludD4gbSA9IF87CisgIEVYUEVDVF9FUSgiaXMgYW55dGhpbmciLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRXEoeCkgbWF0Y2hlcyBhbnkgdmFsdWUgZXF1YWwgdG8geC4KK1RFU1QoRXFUZXN0LCBNYXRjaGVzRXF1YWxWYWx1ZSkgeworICAvLyAyIEMtc3RyaW5ncyB3aXRoIHNhbWUgY29udGVudCBidXQgZGlmZmVyZW50IGFkZHJlc3Nlcy4KKyAgY29uc3QgY2hhciBhMVtdID0gImhpIjsKKyAgY29uc3QgY2hhciBhMltdID0gImhpIjsKKworICBNYXRjaGVyPGNvbnN0IGNoYXIqPiBtMSA9IEVxKGExKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhhMSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhhMikpOworfQorCisvLyBUZXN0cyB0aGF0IEVxKHYpIGRlc2NyaWJlcyBpdHNlbGYgcHJvcGVybHkuCisKK2NsYXNzIFVucHJpbnRhYmxlIHsKKyBwdWJsaWM6CisgIFVucHJpbnRhYmxlKCkgOiBjXygnYScpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVucHJpbnRhYmxlJiAvKiByaHMgKi8pIHsgcmV0dXJuIHRydWU7IH0KKyBwcml2YXRlOgorICBjaGFyIGNfOworfTsKKworVEVTVChFcVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPFVucHJpbnRhYmxlPiBtID0gRXEoVW5wcmludGFibGUoKSk7CisgIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gMS1ieXRlIG9iamVjdCA8NjE+IiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IEVxKHYpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFueSB0eXBlIHRoYXQgc3VwcG9ydHMKKy8vIGNvbXBhcmluZyB3aXRoIHR5cGUgVCwgd2hlcmUgVCBpcyB2J3MgdHlwZS4KK1RFU1QoRXFUZXN0LCBJc1BvbHltb3JwaGljKSB7CisgIE1hdGNoZXI8aW50PiBtMSA9IEVxKDEpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoMikpOworCisgIE1hdGNoZXI8Y2hhcj4gbTIgPSBFcSgxKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygnXDEnKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCdhJykpOworfQorCisvLyBUZXN0cyB0aGF0IFR5cGVkRXE8VD4odikgbWF0Y2hlcyB2YWx1ZXMgb2YgdHlwZSBUIHRoYXQncyBlcXVhbCB0byB2LgorVEVTVChUeXBlZEVxVGVzdCwgQ2hlY2tzRXF1YWxpdHlGb3JHaXZlblR5cGUpIHsKKyAgTWF0Y2hlcjxjaGFyPiBtMSA9IFR5cGVkRXE8Y2hhcj4oJ2EnKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoJ2InKSk7CisKKyAgTWF0Y2hlcjxpbnQ+IG0yID0gVHlwZWRFcTxpbnQ+KDYpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDYpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoNykpOworfQorCisvLyBUZXN0cyB0aGF0IFR5cGVkRXEodikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoVHlwZWRFcVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIDIiLCBEZXNjcmliZShUeXBlZEVxPGludD4oMikpKTsKK30KKworLy8gVGVzdHMgdGhhdCBUeXBlZEVxPFQ+KHYpIGhhcyB0eXBlIE1hdGNoZXI8VD4uCisKKy8vIFR5cGU8VD46OklzVHlwZU9mKHYpIGNvbXBpbGVzIGlmZiB0aGUgdHlwZSBvZiB2YWx1ZSB2IGlzIFQsIHdoZXJlIFQKKy8vIGlzIGEgImJhcmUiIHR5cGUgKGkuZS4gbm90IGluIHRoZSBmb3JtIG9mIGNvbnN0IFUgb3IgVSYpLiAgSWYgdidzCisvLyB0eXBlIGlzIG5vdCBULCB0aGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhIG1lc3NhZ2UgYWJvdXQKKy8vICJ1bmRlZmluZWQgcmVmZXJlY2UiLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVHlwZSB7CisgIHN0YXRpYyBib29sIElzVHlwZU9mKGNvbnN0IFQmIC8qIHYgKi8pIHsgcmV0dXJuIHRydWU7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDI+CisgIHN0YXRpYyB2b2lkIElzVHlwZU9mKFQyIHYpOworfTsKKworVEVTVChUeXBlZEVxVGVzdCwgSGFzU3BlY2lmaWVkVHlwZSkgeworICAvLyBWZXJmaWVzIHRoYXQgdGhlIHR5cGUgb2YgVHlwZWRFcTxUPih2KSBpcyBNYXRjaGVyPFQ+LgorICBUeXBlPE1hdGNoZXI8aW50PiA+OjpJc1R5cGVPZihUeXBlZEVxPGludD4oNSkpOworICBUeXBlPE1hdGNoZXI8ZG91YmxlPiA+OjpJc1R5cGVPZihUeXBlZEVxPGRvdWJsZT4oNSkpOworfQorCisvLyBUZXN0cyB0aGF0IEdlKHYpIG1hdGNoZXMgYW55dGhpbmcgPj0gdi4KK1RFU1QoR2VUZXN0LCBJbXBsZW1lbnRzR3JlYXRlclRoYW5PckVxdWFsKSB7CisgIE1hdGNoZXI8aW50PiBtMSA9IEdlKDApOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDEpKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygwKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKC0xKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR2UodikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoR2VUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0gPSBHZSg1KTsKKyAgRVhQRUNUX0VRKCJpcyA+PSA1IiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IEd0KHYpIG1hdGNoZXMgYW55dGhpbmcgPiB2LgorVEVTVChHdFRlc3QsIEltcGxlbWVudHNHcmVhdGVyVGhhbikgeworICBNYXRjaGVyPGRvdWJsZT4gbTEgPSBHdCgwKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygxLjApKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoMC4wKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKC0xLjApKTsKK30KKworLy8gVGVzdHMgdGhhdCBHdCh2KSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChHdFRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGludD4gbSA9IEd0KDUpOworICBFWFBFQ1RfRVEoImlzID4gNSIsIERlc2NyaWJlKG0pKTsKK30KKworLy8gVGVzdHMgdGhhdCBMZSh2KSBtYXRjaGVzIGFueXRoaW5nIDw9IHYuCitURVNUKExlVGVzdCwgSW1wbGVtZW50c0xlc3NUaGFuT3JFcXVhbCkgeworICBNYXRjaGVyPGNoYXI+IG0xID0gTGUoJ2InKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygnYScpKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygnYicpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoJ2MnKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTGUodikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoTGVUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0gPSBMZSg1KTsKKyAgRVhQRUNUX0VRKCJpcyA8PSA1IiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IEx0KHYpIG1hdGNoZXMgYW55dGhpbmcgPCB2LgorVEVTVChMdFRlc3QsIEltcGxlbWVudHNMZXNzVGhhbikgeworICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0xID0gTHQoIkhlbGxvIik7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoIkFiYyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoIkhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygiSGVsbG8sIHdvcmxkISIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBMdCh2KSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChMdFRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGludD4gbSA9IEx0KDUpOworICBFWFBFQ1RfRVEoImlzIDwgNSIsIERlc2NyaWJlKG0pKTsKK30KKworLy8gVGVzdHMgdGhhdCBOZSh2KSBtYXRjaGVzIGFueXRoaW5nICE9IHYuCitURVNUKE5lVGVzdCwgSW1wbGVtZW50c05vdEVxdWFsKSB7CisgIE1hdGNoZXI8aW50PiBtMSA9IE5lKDApOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKDEpKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygtMSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTmUodikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoTmVUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0gPSBOZSg1KTsKKyAgRVhQRUNUX0VRKCJpc24ndCBlcXVhbCB0byA1IiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IElzTnVsbCgpIG1hdGNoZXMgYW55IE5VTEwgcG9pbnRlciBvZiBhbnkgdHlwZS4KK1RFU1QoSXNOdWxsVGVzdCwgTWF0Y2hlc051bGxQb2ludGVyKSB7CisgIE1hdGNoZXI8aW50Kj4gbTEgPSBJc051bGwoKTsKKyAgaW50KiBwMSA9IE5VTEw7CisgIGludCBuID0gMDsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhwMSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcygmbikpOworCisgIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0yID0gSXNOdWxsKCk7CisgIGNvbnN0IGNoYXIqIHAyID0gTlVMTDsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhwMikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiaGkiKSk7CisKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorICAvLyBOb2tpYSdzIFN5bWJpYW4gY29tcGlsZXIgZ2VuZXJhdGVzOgorICAvLyBnbW9jay1tYXRjaGVycy5oOiBhbWJpZ3VvdXMgYWNjZXNzIHRvIG92ZXJsb2FkZWQgZnVuY3Rpb24KKyAgLy8gZ21vY2stbWF0Y2hlcnMuaDogJ3Rlc3Rpbmc6Ok1hdGNoZXI8dm9pZCAqPjo6TWF0Y2hlcih2b2lkICopJworICAvLyBnbW9jay1tYXRjaGVycy5oOiAndGVzdGluZzo6TWF0Y2hlcjx2b2lkICo+OjpNYXRjaGVyKGNvbnN0IHRlc3Rpbmc6OgorICAvLyAgICAgTWF0Y2hlckludGVyZmFjZTx2b2lkICo+ICopJworICAvLyBnbW9jay1tYXRjaGVycy5oOiAgKHBvaW50IG9mIGluc3RhbnRpYXRpb246ICd0ZXN0aW5nOjoKKyAgLy8gICAgIGdtb2NrX21hdGNoZXJzX3Rlc3Q6OklzTnVsbFRlc3RfTWF0Y2hlc051bGxQb2ludGVyX1Rlc3Q6OlRlc3RCb2R5KCknKQorICAvLyBnbW9jay1tYXRjaGVycy5oOiAgIChpbnN0YW50aWF0aW5nOiAndGVzdGluZzo6UG9seW1vcnBoaWNNYXRjCisgIE1hdGNoZXI8dm9pZCo+IG0zID0gSXNOdWxsKCk7CisgIHZvaWQqIHAzID0gTlVMTDsKKyAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcyhwMykpOworICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhyZWludGVycHJldF9jYXN0PHZvaWQqPigweGJlZWYpKSk7CisjZW5kaWYKK30KKworVEVTVChJc051bGxUZXN0LCBMaW5rZWRQdHIpIHsKKyAgY29uc3QgTWF0Y2hlcjxsaW5rZWRfcHRyPGludD4gPiBtID0gSXNOdWxsKCk7CisgIGNvbnN0IGxpbmtlZF9wdHI8aW50PiBudWxsX3A7CisgIGNvbnN0IGxpbmtlZF9wdHI8aW50PiBub25fbnVsbF9wKG5ldyBpbnQpOworCisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhudWxsX3ApKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhub25fbnVsbF9wKSk7Cit9CisKK1RFU1QoSXNOdWxsVGVzdCwgUmVmZXJlbmNlVG9Db25zdExpbmtlZFB0cikgeworICBjb25zdCBNYXRjaGVyPGNvbnN0IGxpbmtlZF9wdHI8ZG91YmxlPiY+IG0gPSBJc051bGwoKTsKKyAgY29uc3QgbGlua2VkX3B0cjxkb3VibGU+IG51bGxfcDsKKyAgY29uc3QgbGlua2VkX3B0cjxkb3VibGU+IG5vbl9udWxsX3AobmV3IGRvdWJsZSk7CisKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG51bGxfcCkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5vbl9udWxsX3ApKTsKK30KKworI2lmIEdURVNUX0xBTkdfQ1hYMTEKK1RFU1QoSXNOdWxsVGVzdCwgU3RkRnVuY3Rpb24pIHsKKyAgY29uc3QgTWF0Y2hlcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+IG0gPSBJc051bGwoKTsKKworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoc3RkOjpmdW5jdGlvbjx2b2lkKCk+KCkpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhbXXt9KSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKKworLy8gVGVzdHMgdGhhdCBJc051bGwoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChJc051bGxUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxpbnQqPiBtID0gSXNOdWxsKCk7CisgIEVYUEVDVF9FUSgiaXMgTlVMTCIsIERlc2NyaWJlKG0pKTsKKyAgRVhQRUNUX0VRKCJpc24ndCBOVUxMIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTm90TnVsbCgpIG1hdGNoZXMgYW55IG5vbi1OVUxMIHBvaW50ZXIgb2YgYW55IHR5cGUuCitURVNUKE5vdE51bGxUZXN0LCBNYXRjaGVzTm9uTnVsbFBvaW50ZXIpIHsKKyAgTWF0Y2hlcjxpbnQqPiBtMSA9IE5vdE51bGwoKTsKKyAgaW50KiBwMSA9IE5VTEw7CisgIGludCBuID0gMDsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMocDEpKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygmbikpOworCisgIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0yID0gTm90TnVsbCgpOworICBjb25zdCBjaGFyKiBwMiA9IE5VTEw7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKHAyKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImhpIikpOworfQorCitURVNUKE5vdE51bGxUZXN0LCBMaW5rZWRQdHIpIHsKKyAgY29uc3QgTWF0Y2hlcjxsaW5rZWRfcHRyPGludD4gPiBtID0gTm90TnVsbCgpOworICBjb25zdCBsaW5rZWRfcHRyPGludD4gbnVsbF9wOworICBjb25zdCBsaW5rZWRfcHRyPGludD4gbm9uX251bGxfcChuZXcgaW50KTsKKworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG51bGxfcCkpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobm9uX251bGxfcCkpOworfQorCitURVNUKE5vdE51bGxUZXN0LCBSZWZlcmVuY2VUb0NvbnN0TGlua2VkUHRyKSB7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgbGlua2VkX3B0cjxkb3VibGU+Jj4gbSA9IE5vdE51bGwoKTsKKyAgY29uc3QgbGlua2VkX3B0cjxkb3VibGU+IG51bGxfcDsKKyAgY29uc3QgbGlua2VkX3B0cjxkb3VibGU+IG5vbl9udWxsX3AobmV3IGRvdWJsZSk7CisKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhudWxsX3ApKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG5vbl9udWxsX3ApKTsKK30KKworI2lmIEdURVNUX0xBTkdfQ1hYMTEKK1RFU1QoTm90TnVsbFRlc3QsIFN0ZEZ1bmN0aW9uKSB7CisgIGNvbnN0IE1hdGNoZXI8c3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBtID0gTm90TnVsbCgpOworCisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhbXXt9KSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoc3RkOjpmdW5jdGlvbjx2b2lkKCk+KCkpKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQorCisvLyBUZXN0cyB0aGF0IE5vdE51bGwoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChOb3ROdWxsVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8aW50Kj4gbSA9IE5vdE51bGwoKTsKKyAgRVhQRUNUX0VRKCJpc24ndCBOVUxMIiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IFJlZih2YXJpYWJsZSkgbWF0Y2hlcyBhbiBhcmd1bWVudCB0aGF0IHJlZmVyZW5jZXMKKy8vICd2YXJpYWJsZScuCitURVNUKFJlZlRlc3QsIE1hdGNoZXNTYW1lVmFyaWFibGUpIHsKKyAgaW50IGEgPSAwOworICBpbnQgYiA9IDA7CisgIE1hdGNoZXI8aW50Jj4gbSA9IFJlZihhKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmVmKHZhcmlhYmxlKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChSZWZUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgaW50IG4gPSA1OworICBNYXRjaGVyPGludCY+IG0gPSBSZWYobik7CisgIHN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgInJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlIEAiIDw8ICZuIDw8ICIgNSI7CisgIEVYUEVDVF9FUShzdHJpbmcoc3Muc3RyKCkpLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3QgdGhhdCBSZWYobm9uX2NvbnN0X3ZhcmlhbGJlKSBjYW4gYmUgdXNlZCBhcyBhIG1hdGNoZXIgZm9yIGEKKy8vIGNvbnN0IHJlZmVyZW5jZS4KK1RFU1QoUmVmVGVzdCwgQ2FuQmVVc2VkQXNNYXRjaGVyRm9yQ29uc3RSZWZlcmVuY2UpIHsKKyAgaW50IGEgPSAwOworICBpbnQgYiA9IDA7CisgIE1hdGNoZXI8Y29uc3QgaW50Jj4gbSA9IFJlZihhKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmVmKHZhcmlhYmxlKSBpcyBjb3ZhcmlhbnQsIGkuZS4gUmVmKGRlcml2ZWQpIGNhbiBiZQorLy8gdXNlZCB3aGVyZXZlciBSZWYoYmFzZSkgY2FuIGJlIHVzZWQgKFJlZihkZXJpdmVkKSBpcyBhIHN1Yi10eXBlCisvLyBvZiBSZWYoYmFzZSksIGJ1dCBub3QgdmljZSB2ZXJzYS4KKworVEVTVChSZWZUZXN0LCBJc0NvdmFyaWFudCkgeworICBCYXNlIGJhc2UsIGJhc2UyOworICBEZXJpdmVkIGRlcml2ZWQ7CisgIE1hdGNoZXI8Y29uc3QgQmFzZSY+IG0xID0gUmVmKGJhc2UpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGJhc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoYmFzZTIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoZGVyaXZlZCkpOworCisgIG0xID0gUmVmKGRlcml2ZWQpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGRlcml2ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoYmFzZSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhiYXNlMikpOworfQorCitURVNUKFJlZlRlc3QsIEV4cGxhaW5zUmVzdWx0KSB7CisgIGludCBuID0gMDsKKyAgRVhQRUNUX1RIQVQoRXhwbGFpbihNYXRjaGVyPGNvbnN0IGludCY+KFJlZihuKSksIG4pLAorICAgICAgICAgICAgICBTdGFydHNXaXRoKCJ3aGljaCBpcyBsb2NhdGVkIEAiKSk7CisKKyAgaW50IG0gPSAwOworICBFWFBFQ1RfVEhBVChFeHBsYWluKE1hdGNoZXI8Y29uc3QgaW50Jj4oUmVmKG4pKSwgbSksCisgICAgICAgICAgICAgIFN0YXJ0c1dpdGgoIndoaWNoIGlzIGxvY2F0ZWQgQCIpKTsKK30KKworLy8gVGVzdHMgc3RyaW5nIGNvbXBhcmlzb24gbWF0Y2hlcnMuCisKK1RFU1QoU3RyRXFUZXN0LCBNYXRjaGVzRXF1YWxTdHJpbmcpIHsKKyAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFN0ckVxKHN0cmluZygiSGVsbG8iKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygiSGVsbG8iKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoImhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKE5VTEwpKTsKKworICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0yID0gU3RyRXEoIkhlbGxvIik7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIkhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiSGkiKSk7Cit9CisKK1RFU1QoU3RyRXFUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxzdHJpbmc+IG0gPSBTdHJFcSgiSGktXCdcIj9cXFxhXGJcZlxuXHJcdFx2XHhEMyIpOworICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIFwiSGktXCdcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXHhEM1wiIiwKKyAgICAgIERlc2NyaWJlKG0pKTsKKworICBzdHJpbmcgc3RyKCIwMTIwNDUwMDgwMCIpOworICBzdHJbM10gPSAnXDAnOworICBNYXRjaGVyPHN0cmluZz4gbTIgPSBTdHJFcShzdHIpOworICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIFwiMDEyXFwwNDUwMDgwMFwiIiwgRGVzY3JpYmUobTIpKTsKKyAgc3RyWzBdID0gc3RyWzZdID0gc3RyWzddID0gc3RyWzldID0gc3RyWzEwXSA9ICdcMCc7CisgIE1hdGNoZXI8c3RyaW5nPiBtMyA9IFN0ckVxKHN0cik7CisgIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gXCJcXDAxMlxcMDQ1XFwwXFwwOFxcMFxcMFwiIiwgRGVzY3JpYmUobTMpKTsKK30KKworVEVTVChTdHJOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nKSB7CisgIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0gPSBTdHJOZSgiSGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCIiKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoIkhlbGxvIikpOworCisgIE1hdGNoZXI8c3RyaW5nPiBtMiA9IFN0ck5lKHN0cmluZygiSGVsbG8iKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiSGVsbG8iKSk7Cit9CisKK1RFU1QoU3RyTmVUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFN0ck5lKCJIaSIpOworICBFWFBFQ1RfRVEoImlzbid0IGVxdWFsIHRvIFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKK30KKworVEVTVChTdHJDYXNlRXFUZXN0LCBNYXRjaGVzRXF1YWxTdHJpbmdJZ25vcmluZ0Nhc2UpIHsKKyAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFN0ckNhc2VFcShzdHJpbmcoIkhlbGxvIikpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoIkhlbGxvIikpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoImhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCJIaSIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhOVUxMKSk7CisKKyAgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcSgiSGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiaGVsbG8iKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJIaSIpKTsKK30KKworVEVTVChTdHJDYXNlRXFUZXN0LCBNYXRjaGVzRXF1YWxTdHJpbmdXaXRoMElnbm9yaW5nQ2FzZSkgeworICBzdHJpbmcgc3RyMSgib2Fib2Nkb29lb28iKTsKKyAgc3RyaW5nIHN0cjIoIk9BQk9DRE9PRU9PIik7CisgIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4gbTAgPSBTdHJDYXNlRXEoc3RyMSk7CisgIEVYUEVDVF9GQUxTRShtMC5NYXRjaGVzKHN0cjIgKyBzdHJpbmcoMSwgJ1wwJykpKTsKKworICBzdHIxWzNdID0gc3RyMlszXSA9ICdcMCc7CisgIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4gbTEgPSBTdHJDYXNlRXEoc3RyMSk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoc3RyMikpOworCisgIHN0cjFbMF0gPSBzdHIxWzZdID0gc3RyMVs3XSA9IHN0cjFbMTBdID0gJ1wwJzsKKyAgc3RyMlswXSA9IHN0cjJbNl0gPSBzdHIyWzddID0gc3RyMlsxMF0gPSAnXDAnOworICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0yID0gU3RyQ2FzZUVxKHN0cjEpOworICBzdHIxWzldID0gc3RyMls5XSA9ICdcMCc7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKHN0cjIpKTsKKworICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0zID0gU3RyQ2FzZUVxKHN0cjEpOworICBFWFBFQ1RfVFJVRShtMy5NYXRjaGVzKHN0cjIpKTsKKworICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhzdHIyICsgIngiKSk7CisgIHN0cjIuYXBwZW5kKDEsICdcMCcpOworICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhzdHIyKSk7CisgIEVYUEVDVF9GQUxTRShtMy5NYXRjaGVzKHN0cmluZyhzdHIyLCAwLCA5KSkpOworfQorCitURVNUKFN0ckNhc2VFcVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPHN0cmluZz4gbSA9IFN0ckNhc2VFcSgiSGkiKTsKKyAgRVhQRUNUX0VRKCJpcyBlcXVhbCB0byAoaWdub3JpbmcgY2FzZSkgXCJIaVwiIiwgRGVzY3JpYmUobSkpOworfQorCitURVNUKFN0ckNhc2VOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nSWdub3JpbmdDYXNlKSB7CisgIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0gPSBTdHJDYXNlTmUoIkhlbGxvIik7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygiSGkiKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoIkhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCJoZWxsbyIpKTsKKworICBNYXRjaGVyPHN0cmluZz4gbTIgPSBTdHJDYXNlTmUoc3RyaW5nKCJIZWxsbyIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiSGVsbG8iKSk7Cit9CisKK1RFU1QoU3RyQ2FzZU5lVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8Y29uc3QgY2hhcio+IG0gPSBTdHJDYXNlTmUoIkhpIik7CisgIEVYUEVDVF9FUSgiaXNuJ3QgZXF1YWwgdG8gKGlnbm9yaW5nIGNhc2UpIFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKK30KKworLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIoKSB3b3JrcyBmb3IgbWF0Y2hpbmcgc3RyaW5nLXR5cGVkIHZhbHVlcy4KK1RFU1QoSGFzU3Vic3RyVGVzdCwgV29ya3NGb3JTdHJpbmdDbGFzc2VzKSB7CisgIGNvbnN0IE1hdGNoZXI8c3RyaW5nPiBtMSA9IEhhc1N1YnN0cigiZm9vIik7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoc3RyaW5nKCJJIGxvdmUgZm9vZC4iKSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhzdHJpbmcoInRvZm8iKSkpOworCisgIGNvbnN0IE1hdGNoZXI8Y29uc3Qgc3RkOjpzdHJpbmcmPiBtMiA9IEhhc1N1YnN0cigiZm9vIik7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoc3RkOjpzdHJpbmcoIkkgbG92ZSBmb29kLiIpKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKHN0ZDo6c3RyaW5nKCJ0b2ZvIikpKTsKK30KKworLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIoKSB3b3JrcyBmb3IgbWF0Y2hpbmcgQy1zdHJpbmctdHlwZWQgdmFsdWVzLgorVEVTVChIYXNTdWJzdHJUZXN0LCBXb3Jrc0ZvckNTdHJpbmdzKSB7CisgIGNvbnN0IE1hdGNoZXI8Y2hhcio+IG0xID0gSGFzU3Vic3RyKCJmb28iKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhjb25zdF9jYXN0PGNoYXIqPigiSSBsb3ZlIGZvb2QuIikpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoY29uc3RfY2FzdDxjaGFyKj4oInRvZm8iKSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7CisKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbTIgPSBIYXNTdWJzdHIoImZvbyIpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCJJIGxvdmUgZm9vZC4iKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJ0b2ZvIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhOVUxMKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSGFzU3Vic3RyKHMpIGRlc2NyaWJlcyBpdHNlbGYgcHJvcGVybHkuCitURVNUKEhhc1N1YnN0clRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPHN0cmluZz4gbSA9IEhhc1N1YnN0cigiZm9vXG5cIiIpOworICBFWFBFQ1RfRVEoImhhcyBzdWJzdHJpbmcgXCJmb29cXG5cXFwiXCIiLCBEZXNjcmliZShtKSk7Cit9CisKK1RFU1QoS2V5VGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8Y29uc3QgcGFpcjxzdGQ6OnN0cmluZywgaW50PiY+IG0gPSBLZXkoImZvbyIpOworICBFWFBFQ1RfRVEoImhhcyBhIGtleSB0aGF0IGlzIGVxdWFsIHRvIFwiZm9vXCIiLCBEZXNjcmliZShtKSk7CisgIEVYUEVDVF9FUSgiZG9lc24ndCBoYXZlIGEga2V5IHRoYXQgaXMgZXF1YWwgdG8gXCJmb29cIiIsIERlc2NyaWJlTmVnYXRpb24obSkpOworfQorCitURVNUKEtleVRlc3QsIEV4cGxhaW5zUmVzdWx0KSB7CisgIE1hdGNoZXI8cGFpcjxpbnQsIGJvb2w+ID4gbSA9IEtleShHcmVhdGVyVGhhbigxMCkpOworICBFWFBFQ1RfRVEoIndob3NlIGZpcnN0IGZpZWxkIGlzIGEgdmFsdWUgd2hpY2ggaXMgNSBsZXNzIHRoYW4gMTAiLAorICAgICAgICAgICAgRXhwbGFpbihtLCBtYWtlX3BhaXIoNSwgdHJ1ZSkpKTsKKyAgRVhQRUNUX0VRKCJ3aG9zZSBmaXJzdCBmaWVsZCBpcyBhIHZhbHVlIHdoaWNoIGlzIDUgbW9yZSB0aGFuIDEwIiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgbWFrZV9wYWlyKDE1LCB0cnVlKSkpOworfQorCitURVNUKEtleVRlc3QsIE1hdGNoZXNDb3JyZWN0bHkpIHsKKyAgcGFpcjxpbnQsIHN0ZDo6c3RyaW5nPiBwKDI1LCAiZm9vIik7CisgIEVYUEVDVF9USEFUKHAsIEtleSgyNSkpOworICBFWFBFQ1RfVEhBVChwLCBOb3QoS2V5KDQyKSkpOworICBFWFBFQ1RfVEhBVChwLCBLZXkoR2UoMjApKSk7CisgIEVYUEVDVF9USEFUKHAsIE5vdChLZXkoTHQoMjUpKSkpOworfQorCitURVNUKEtleVRlc3QsIFNhZmVseUNhc3RzSW5uZXJNYXRjaGVyKSB7CisgIE1hdGNoZXI8aW50PiBpc19wb3NpdGl2ZSA9IEd0KDApOworICBNYXRjaGVyPGludD4gaXNfbmVnYXRpdmUgPSBMdCgwKTsKKyAgcGFpcjxjaGFyLCBib29sPiBwKCdhJywgdHJ1ZSk7CisgIEVYUEVDVF9USEFUKHAsIEtleShpc19wb3NpdGl2ZSkpOworICBFWFBFQ1RfVEhBVChwLCBOb3QoS2V5KGlzX25lZ2F0aXZlKSkpOworfQorCitURVNUKEtleVRlc3QsIEluc2lkZUNvbnRhaW5zVXNpbmdNYXApIHsKKyAgbWFwPGludCwgY2hhcj4gY29udGFpbmVyOworICBjb250YWluZXIuaW5zZXJ0KG1ha2VfcGFpcigxLCAnYScpKTsKKyAgY29udGFpbmVyLmluc2VydChtYWtlX3BhaXIoMiwgJ2InKSk7CisgIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDQsICdjJykpOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIENvbnRhaW5zKEtleSgxKSkpOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChDb250YWlucyhLZXkoMykpKSk7Cit9CisKK1RFU1QoS2V5VGVzdCwgSW5zaWRlQ29udGFpbnNVc2luZ011bHRpbWFwKSB7CisgIG11bHRpbWFwPGludCwgY2hhcj4gY29udGFpbmVyOworICBjb250YWluZXIuaW5zZXJ0KG1ha2VfcGFpcigxLCAnYScpKTsKKyAgY29udGFpbmVyLmluc2VydChtYWtlX3BhaXIoMiwgJ2InKSk7CisgIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDQsICdjJykpOworCisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KENvbnRhaW5zKEtleSgyNSkpKSk7CisgIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDI1LCAnZCcpKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhLZXkoMjUpKSk7CisgIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDI1LCAnZScpKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhLZXkoMjUpKSk7CisKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhLZXkoMSkpKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoQ29udGFpbnMoS2V5KDMpKSkpOworfQorCitURVNUKFBhaXJUZXN0LCBUeXBpbmcpIHsKKyAgLy8gVGVzdCB2ZXJpZmllcyB0aGUgZm9sbG93aW5nIHR5cGUgY29udmVyc2lvbnMgY2FuIGJlIGNvbXBpbGVkLgorICBNYXRjaGVyPGNvbnN0IHBhaXI8Y29uc3QgY2hhciosIGludD4mPiBtMSA9IFBhaXIoImZvbyIsIDQyKTsKKyAgTWF0Y2hlcjxjb25zdCBwYWlyPGNvbnN0IGNoYXIqLCBpbnQ+ID4gbTIgPSBQYWlyKCJmb28iLCA0Mik7CisgIE1hdGNoZXI8cGFpcjxjb25zdCBjaGFyKiwgaW50PiA+IG0zID0gUGFpcigiZm9vIiwgNDIpOworCisgIE1hdGNoZXI8cGFpcjxpbnQsIGNvbnN0IHN0ZDo6c3RyaW5nPiA+IG00ID0gUGFpcigyNSwgIjQyIik7CisgIE1hdGNoZXI8cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgaW50PiA+IG01ID0gUGFpcigiMjUiLCA0Mik7Cit9CisKK1RFU1QoUGFpclRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGNvbnN0IHBhaXI8c3RkOjpzdHJpbmcsIGludD4mPiBtMSA9IFBhaXIoImZvbyIsIDQyKTsKKyAgRVhQRUNUX0VRKCJoYXMgYSBmaXJzdCBmaWVsZCB0aGF0IGlzIGVxdWFsIHRvIFwiZm9vXCIiCisgICAgICAgICAgICAiLCBhbmQgaGFzIGEgc2Vjb25kIGZpZWxkIHRoYXQgaXMgZXF1YWwgdG8gNDIiLAorICAgICAgICAgICAgRGVzY3JpYmUobTEpKTsKKyAgRVhQRUNUX0VRKCJoYXMgYSBmaXJzdCBmaWVsZCB0aGF0IGlzbid0IGVxdWFsIHRvIFwiZm9vXCIiCisgICAgICAgICAgICAiLCBvciBoYXMgYSBzZWNvbmQgZmllbGQgdGhhdCBpc24ndCBlcXVhbCB0byA0MiIsCisgICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0xKSk7CisgIC8vIERvdWJsZSBhbmQgdHJpcGxlIG5lZ2F0aW9uICgxIG9yIDIgdGltZXMgbm90IGFuZCBkZXNjcmlwdGlvbiBvZiBuZWdhdGlvbikuCisgIE1hdGNoZXI8Y29uc3QgcGFpcjxpbnQsIGludD4mPiBtMiA9IE5vdChQYWlyKE5vdCgxMyksIDQyKSk7CisgIEVYUEVDVF9FUSgiaGFzIGEgZmlyc3QgZmllbGQgdGhhdCBpc24ndCBlcXVhbCB0byAxMyIKKyAgICAgICAgICAgICIsIGFuZCBoYXMgYSBzZWNvbmQgZmllbGQgdGhhdCBpcyBlcXVhbCB0byA0MiIsCisgICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0yKSk7Cit9CisKK1RFU1QoUGFpclRlc3QsIENhbkV4cGxhaW5NYXRjaFJlc3VsdFRvKSB7CisgIC8vIElmIG5laXRoZXIgZmllbGQgbWF0Y2hlcywgUGFpcigpIHNob3VsZCBleHBsYWluIGFib3V0IHRoZSBmaXJzdAorICAvLyBmaWVsZC4KKyAgY29uc3QgTWF0Y2hlcjxwYWlyPGludCwgaW50PiA+IG0gPSBQYWlyKEdyZWF0ZXJUaGFuKDApLCBHcmVhdGVyVGhhbigwKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZmlyc3QgZmllbGQgZG9lcyBub3QgbWF0Y2gsIHdoaWNoIGlzIDEgbGVzcyB0aGFuIDAiLAorICAgICAgICAgICAgRXhwbGFpbihtLCBtYWtlX3BhaXIoLTEsIC0yKSkpOworCisgIC8vIElmIHRoZSBmaXJzdCBmaWVsZCBtYXRjaGVzIGJ1dCB0aGUgc2Vjb25kIGRvZXNuJ3QsIFBhaXIoKSBzaG91bGQKKyAgLy8gZXhwbGFpbiBhYm91dCB0aGUgc2Vjb25kIGZpZWxkLgorICBFWFBFQ1RfRVEoIndob3NlIHNlY29uZCBmaWVsZCBkb2VzIG5vdCBtYXRjaCwgd2hpY2ggaXMgMiBsZXNzIHRoYW4gMCIsCisgICAgICAgICAgICBFeHBsYWluKG0sIG1ha2VfcGFpcigxLCAtMikpKTsKKworICAvLyBJZiB0aGUgZmlyc3QgZmllbGQgZG9lc24ndCBtYXRjaCBidXQgdGhlIHNlY29uZCBkb2VzLCBQYWlyKCkKKyAgLy8gc2hvdWxkIGV4cGxhaW4gYWJvdXQgdGhlIGZpcnN0IGZpZWxkLgorICBFWFBFQ1RfRVEoIndob3NlIGZpcnN0IGZpZWxkIGRvZXMgbm90IG1hdGNoLCB3aGljaCBpcyAxIGxlc3MgdGhhbiAwIiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgbWFrZV9wYWlyKC0xLCAyKSkpOworCisgIC8vIElmIGJvdGggZmllbGRzIG1hdGNoLCBQYWlyKCkgc2hvdWxkIGV4cGxhaW4gYWJvdXQgdGhlbSBib3RoLgorICBFWFBFQ1RfRVEoIndob3NlIGJvdGggZmllbGRzIG1hdGNoLCB3aGVyZSB0aGUgZmlyc3QgZmllbGQgaXMgYSB2YWx1ZSAiCisgICAgICAgICAgICAid2hpY2ggaXMgMSBtb3JlIHRoYW4gMCwgYW5kIHRoZSBzZWNvbmQgZmllbGQgaXMgYSB2YWx1ZSAiCisgICAgICAgICAgICAid2hpY2ggaXMgMiBtb3JlIHRoYW4gMCIsCisgICAgICAgICAgICBFeHBsYWluKG0sIG1ha2VfcGFpcigxLCAyKSkpOworCisgIC8vIElmIG9ubHkgdGhlIGZpcnN0IG1hdGNoIGhhcyBhbiBleHBsYW5hdGlvbiwgb25seSB0aGlzIGV4cGxhbmF0aW9uIHNob3VsZAorICAvLyBiZSBwcmludGVkLgorICBjb25zdCBNYXRjaGVyPHBhaXI8aW50LCBpbnQ+ID4gZXhwbGFpbl9maXJzdCA9IFBhaXIoR3JlYXRlclRoYW4oMCksIDApOworICBFWFBFQ1RfRVEoIndob3NlIGJvdGggZmllbGRzIG1hdGNoLCB3aGVyZSB0aGUgZmlyc3QgZmllbGQgaXMgYSB2YWx1ZSAiCisgICAgICAgICAgICAid2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsCisgICAgICAgICAgICBFeHBsYWluKGV4cGxhaW5fZmlyc3QsIG1ha2VfcGFpcigxLCAwKSkpOworCisgIC8vIElmIG9ubHkgdGhlIHNlY29uZCBtYXRjaCBoYXMgYW4gZXhwbGFuYXRpb24sIG9ubHkgdGhpcyBleHBsYW5hdGlvbiBzaG91bGQKKyAgLy8gYmUgcHJpbnRlZC4KKyAgY29uc3QgTWF0Y2hlcjxwYWlyPGludCwgaW50PiA+IGV4cGxhaW5fc2Vjb25kID0gUGFpcigwLCBHcmVhdGVyVGhhbigwKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgYm90aCBmaWVsZHMgbWF0Y2gsIHdoZXJlIHRoZSBzZWNvbmQgZmllbGQgaXMgYSB2YWx1ZSAiCisgICAgICAgICAgICAid2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsCisgICAgICAgICAgICBFeHBsYWluKGV4cGxhaW5fc2Vjb25kLCBtYWtlX3BhaXIoMCwgMSkpKTsKK30KKworVEVTVChQYWlyVGVzdCwgTWF0Y2hlc0NvcnJlY3RseSkgeworICBwYWlyPGludCwgc3RkOjpzdHJpbmc+IHAoMjUsICJmb28iKTsKKworICAvLyBCb3RoIGZpZWxkcyBtYXRjaC4KKyAgRVhQRUNUX1RIQVQocCwgUGFpcigyNSwgImZvbyIpKTsKKyAgRVhQRUNUX1RIQVQocCwgUGFpcihHZSgyMCksIEhhc1N1YnN0cigibyIpKSk7CisKKyAgLy8gJ2ZpcnN0JyBkb2VzbnQnIG1hdGNoLCBidXQgJ3NlY29uZCcgbWF0Y2hlcy4KKyAgRVhQRUNUX1RIQVQocCwgTm90KFBhaXIoNDIsICJmb28iKSkpOworICBFWFBFQ1RfVEhBVChwLCBOb3QoUGFpcihMdCgyNSksICJmb28iKSkpOworCisgIC8vICdmaXJzdCcgbWF0Y2hlcywgYnV0ICdzZWNvbmQnIGRvZXNuJ3QgbWF0Y2guCisgIEVYUEVDVF9USEFUKHAsIE5vdChQYWlyKDI1LCAiYmFyIikpKTsKKyAgRVhQRUNUX1RIQVQocCwgTm90KFBhaXIoMjUsIE5vdCgiZm9vIikpKSk7CisKKyAgLy8gTmVpdGhlciBmaWVsZCBtYXRjaGVzLgorICBFWFBFQ1RfVEhBVChwLCBOb3QoUGFpcigxMywgImJhciIpKSk7CisgIEVYUEVDVF9USEFUKHAsIE5vdChQYWlyKEx0KDEzKSwgSGFzU3Vic3RyKCJhIikpKSk7Cit9CisKK1RFU1QoUGFpclRlc3QsIFNhZmVseUNhc3RzSW5uZXJNYXRjaGVycykgeworICBNYXRjaGVyPGludD4gaXNfcG9zaXRpdmUgPSBHdCgwKTsKKyAgTWF0Y2hlcjxpbnQ+IGlzX25lZ2F0aXZlID0gTHQoMCk7CisgIHBhaXI8Y2hhciwgYm9vbD4gcCgnYScsIHRydWUpOworICBFWFBFQ1RfVEhBVChwLCBQYWlyKGlzX3Bvc2l0aXZlLCBfKSk7CisgIEVYUEVDVF9USEFUKHAsIE5vdChQYWlyKGlzX25lZ2F0aXZlLCBfKSkpOworICBFWFBFQ1RfVEhBVChwLCBQYWlyKF8sIGlzX3Bvc2l0aXZlKSk7CisgIEVYUEVDVF9USEFUKHAsIE5vdChQYWlyKF8sIGlzX25lZ2F0aXZlKSkpOworfQorCitURVNUKFBhaXJUZXN0LCBJbnNpZGVDb250YWluc1VzaW5nTWFwKSB7CisgIG1hcDxpbnQsIGNoYXI+IGNvbnRhaW5lcjsKKyAgY29udGFpbmVyLmluc2VydChtYWtlX3BhaXIoMSwgJ2EnKSk7CisgIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKDIsICdiJykpOworICBjb250YWluZXIuaW5zZXJ0KG1ha2VfcGFpcig0LCAnYycpKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhQYWlyKDEsICdhJykpKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBDb250YWlucyhQYWlyKDEsIF8pKSk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgQ29udGFpbnMoUGFpcihfLCAnYScpKSk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KENvbnRhaW5zKFBhaXIoMywgXykpKSk7Cit9CisKKy8vIFRlc3RzIFN0YXJ0c1dpdGgocykuCisKK1RFU1QoU3RhcnRzV2l0aFRlc3QsIE1hdGNoZXNTdHJpbmdXaXRoR2l2ZW5QcmVmaXgpIHsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbTEgPSBTdGFydHNXaXRoKHN0cmluZygiIikpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJIaSIpKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygiIikpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7CisKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBtMiA9IFN0YXJ0c1dpdGgoIkhpIik7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIkhpIikpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCJIaSBIaSEiKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIkhpZ2giKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJIIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiIEhpIikpOworfQorCitURVNUKFN0YXJ0c1dpdGhUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCBzdGQ6OnN0cmluZz4gbSA9IFN0YXJ0c1dpdGgoIkhpIik7CisgIEVYUEVDVF9FUSgic3RhcnRzIHdpdGggXCJIaVwiIiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyBFbmRzV2l0aChzKS4KKworVEVTVChFbmRzV2l0aFRlc3QsIE1hdGNoZXNTdHJpbmdXaXRoR2l2ZW5TdWZmaXgpIHsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbTEgPSBFbmRzV2l0aCgiIik7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoIkhpIikpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCIiKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKKworICBjb25zdCBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0yID0gRW5kc1dpdGgoc3RyaW5nKCJIaSIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiSGkiKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoIldvdyBIaSBIaSIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygiU3VwZXIgSGkiKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJpIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygiSGkgIikpOworfQorCitURVNUKEVuZHNXaXRoVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8Y29uc3Qgc3RkOjpzdHJpbmc+IG0gPSBFbmRzV2l0aCgiSGkiKTsKKyAgRVhQRUNUX0VRKCJlbmRzIHdpdGggXCJIaVwiIiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyBNYXRjaGVzUmVnZXgoKS4KKworVEVTVChNYXRjaGVzUmVnZXhUZXN0LCBNYXRjaGVzU3RyaW5nTWF0Y2hpbmdHaXZlblJlZ2V4KSB7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgY2hhcio+IG0xID0gTWF0Y2hlc1JlZ2V4KCJhLip6Iik7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoImF6IikpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCJhYmN6IikpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7CisKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBtMiA9IE1hdGNoZXNSZWdleChuZXcgUkUoImEuKnoiKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImF6YnoiKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCJhejEiKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKCIxYXoiKSk7Cit9CisKK1RFU1QoTWF0Y2hlc1JlZ2V4VGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8Y29uc3Qgc3RkOjpzdHJpbmc+IG0xID0gTWF0Y2hlc1JlZ2V4KHN0cmluZygiSGkuKiIpKTsKKyAgRVhQRUNUX0VRKCJtYXRjaGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiBcIkhpLipcIiIsIERlc2NyaWJlKG0xKSk7CisKKyAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbTIgPSBNYXRjaGVzUmVnZXgobmV3IFJFKCJhLioiKSk7CisgIEVYUEVDVF9FUSgibWF0Y2hlcyByZWd1bGFyIGV4cHJlc3Npb24gXCJhLipcIiIsIERlc2NyaWJlKG0yKSk7Cit9CisKKy8vIFRlc3RzIENvbnRhaW5zUmVnZXgoKS4KKworVEVTVChDb250YWluc1JlZ2V4VGVzdCwgTWF0Y2hlc1N0cmluZ0NvbnRhaW5pbmdHaXZlblJlZ2V4KSB7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgY2hhcio+IG0xID0gQ29udGFpbnNSZWdleChzdHJpbmcoImEuKnoiKSk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoImF6IikpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKCIwYWJjejEiKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKKworICBjb25zdCBNYXRjaGVyPGNvbnN0IHN0cmluZyY+IG0yID0gQ29udGFpbnNSZWdleChuZXcgUkUoImEuKnoiKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImF6YnoiKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoImF6MSIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoIjFhIikpOworfQorCitURVNUKENvbnRhaW5zUmVnZXhUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCBzdGQ6OnN0cmluZz4gbTEgPSBDb250YWluc1JlZ2V4KCJIaS4qIik7CisgIEVYUEVDVF9FUSgiY29udGFpbnMgcmVndWxhciBleHByZXNzaW9uIFwiSGkuKlwiIiwgRGVzY3JpYmUobTEpKTsKKworICBNYXRjaGVyPGNvbnN0IGNoYXIqPiBtMiA9IENvbnRhaW5zUmVnZXgobmV3IFJFKCJhLioiKSk7CisgIEVYUEVDVF9FUSgiY29udGFpbnMgcmVndWxhciBleHByZXNzaW9uIFwiYS4qXCIiLCBEZXNjcmliZShtMikpOworfQorCisvLyBUZXN0cyBmb3Igd2lkZSBzdHJpbmdzLgorI2lmIEdURVNUX0hBU19TVERfV1NUUklORworVEVTVChTdGRXaWRlU3RyRXFUZXN0LCBNYXRjaGVzRXF1YWwpIHsKKyAgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbSA9IFN0ckVxKDo6c3RkOjp3c3RyaW5nKEwiSGVsbG8iKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhMIkhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKEwiaGVsbG8iKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOworCisgIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMiA9IFN0ckVxKEwiSGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMIkhpIikpOworCisgIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMyA9IFN0ckVxKEwiXHhEM1x4NTc2XHg4RDNceEM3NEQiKTsKKyAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcyhMIlx4RDNceDU3Nlx4OEQzXHhDNzREIikpOworICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhMIlx4RDNceDU3Nlx4OEQzXHhDNzRFIikpOworCisgIDo6c3RkOjp3c3RyaW5nIHN0cihMIjAxMjA0NTAwODAwIik7CisgIHN0clszXSA9IEwnXDAnOworICBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTQgPSBTdHJFcShzdHIpOworICBFWFBFQ1RfVFJVRShtNC5NYXRjaGVzKHN0cikpOworICBzdHJbMF0gPSBzdHJbNl0gPSBzdHJbN10gPSBzdHJbOV0gPSBzdHJbMTBdID0gTCdcMCc7CisgIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtNSA9IFN0ckVxKHN0cik7CisgIEVYUEVDVF9UUlVFKG01Lk1hdGNoZXMoc3RyKSk7Cit9CisKK1RFU1QoU3RkV2lkZVN0ckVxVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8IDo6c3RkOjp3c3RyaW5nPiBtID0gU3RyRXEoTCJIaS1cJ1wiP1xcXGFcYlxmXG5cclx0XHYiKTsKKyAgRVhQRUNUX0VRKCJpcyBlcXVhbCB0byBMXCJIaS1cJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcclxcdFxcdlwiIiwKKyAgICBEZXNjcmliZShtKSk7CisKKyAgTWF0Y2hlcjwgOjpzdGQ6OndzdHJpbmc+IG0yID0gU3RyRXEoTCJceEQzXHg1NzZceDhEM1x4Qzc0RCIpOworICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIExcIlxceEQzXFx4NTc2XFx4OEQzXFx4Qzc0RFwiIiwKKyAgICBEZXNjcmliZShtMikpOworCisgIDo6c3RkOjp3c3RyaW5nIHN0cihMIjAxMjA0NTAwODAwIik7CisgIHN0clszXSA9IEwnXDAnOworICBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTQgPSBTdHJFcShzdHIpOworICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIExcIjAxMlxcMDQ1MDA4MDBcIiIsIERlc2NyaWJlKG00KSk7CisgIHN0clswXSA9IHN0cls2XSA9IHN0cls3XSA9IHN0cls5XSA9IHN0clsxMF0gPSBMJ1wwJzsKKyAgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6d3N0cmluZyY+IG01ID0gU3RyRXEoc3RyKTsKKyAgRVhQRUNUX0VRKCJpcyBlcXVhbCB0byBMXCJcXDAxMlxcMDQ1XFwwXFwwOFxcMFxcMFwiIiwgRGVzY3JpYmUobTUpKTsKK30KKworVEVTVChTdGRXaWRlU3RyTmVUZXN0LCBNYXRjaGVzVW5lcXVhbFN0cmluZykgeworICBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtID0gU3RyTmUoTCJIZWxsbyIpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCIiKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTCJIZWxsbyIpKTsKKworICBNYXRjaGVyPCA6OnN0ZDo6d3N0cmluZz4gbTIgPSBTdHJOZSg6OnN0ZDo6d3N0cmluZyhMIkhlbGxvIikpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiaGVsbG8iKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSGVsbG8iKSk7Cit9CisKK1RFU1QoU3RkV2lkZVN0ck5lVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJOZShMIkhpIik7CisgIEVYUEVDVF9FUSgiaXNuJ3QgZXF1YWwgdG8gTFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKK30KKworVEVTVChTdGRXaWRlU3RyQ2FzZUVxVGVzdCwgTWF0Y2hlc0VxdWFsU3RyaW5nSWdub3JpbmdDYXNlKSB7CisgIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJDYXNlRXEoOjpzdGQ6OndzdHJpbmcoTCJIZWxsbyIpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKEwiSGVsbG8iKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhMImhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKEwiSGkiKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOworCisgIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcShMIkhlbGxvIik7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJoZWxsbyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJIaSIpKTsKK30KKworVEVTVChTdGRXaWRlU3RyQ2FzZUVxVGVzdCwgTWF0Y2hlc0VxdWFsU3RyaW5nV2l0aDBJZ25vcmluZ0Nhc2UpIHsKKyAgOjpzdGQ6OndzdHJpbmcgc3RyMShMIm9hYm9jZG9vZW9vIik7CisgIDo6c3RkOjp3c3RyaW5nIHN0cjIoTCJPQUJPQ0RPT0VPTyIpOworICBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTAgPSBTdHJDYXNlRXEoc3RyMSk7CisgIEVYUEVDVF9GQUxTRShtMC5NYXRjaGVzKHN0cjIgKyA6OnN0ZDo6d3N0cmluZygxLCBMJ1wwJykpKTsKKworICBzdHIxWzNdID0gc3RyMlszXSA9IEwnXDAnOworICBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTEgPSBTdHJDYXNlRXEoc3RyMSk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoc3RyMikpOworCisgIHN0cjFbMF0gPSBzdHIxWzZdID0gc3RyMVs3XSA9IHN0cjFbMTBdID0gTCdcMCc7CisgIHN0cjJbMF0gPSBzdHIyWzZdID0gc3RyMls3XSA9IHN0cjJbMTBdID0gTCdcMCc7CisgIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcShzdHIxKTsKKyAgc3RyMVs5XSA9IHN0cjJbOV0gPSBMJ1wwJzsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoc3RyMikpOworCisgIE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMyA9IFN0ckNhc2VFcShzdHIxKTsKKyAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcyhzdHIyKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoc3RyMiArIEwieCIpKTsKKyAgc3RyMi5hcHBlbmQoMSwgTCdcMCcpOworICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhzdHIyKSk7CisgIEVYUEVDVF9GQUxTRShtMy5NYXRjaGVzKDo6c3RkOjp3c3RyaW5nKHN0cjIsIDAsIDkpKSk7Cit9CisKK1RFU1QoU3RkV2lkZVN0ckNhc2VFcVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPCA6OnN0ZDo6d3N0cmluZz4gbSA9IFN0ckNhc2VFcShMIkhpIik7CisgIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gKGlnbm9yaW5nIGNhc2UpIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Cit9CisKK1RFU1QoU3RkV2lkZVN0ckNhc2VOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nSWdub3JpbmdDYXNlKSB7CisgIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJDYXNlTmUoTCJIZWxsbyIpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCJIaSIpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKE5VTEwpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhMIkhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKEwiaGVsbG8iKSk7CisKKyAgTWF0Y2hlcjwgOjpzdGQ6OndzdHJpbmc+IG0yID0gU3RyQ2FzZU5lKDo6c3RkOjp3c3RyaW5nKEwiSGVsbG8iKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCIiKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSGVsbG8iKSk7Cit9CisKK1RFU1QoU3RkV2lkZVN0ckNhc2VOZVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtID0gU3RyQ2FzZU5lKEwiSGkiKTsKKyAgRVhQRUNUX0VRKCJpc24ndCBlcXVhbCB0byAoaWdub3JpbmcgY2FzZSkgTFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKK30KKworLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIoKSB3b3JrcyBmb3IgbWF0Y2hpbmcgd3N0cmluZy10eXBlZCB2YWx1ZXMuCitURVNUKFN0ZFdpZGVIYXNTdWJzdHJUZXN0LCBXb3Jrc0ZvclN0cmluZ0NsYXNzZXMpIHsKKyAgY29uc3QgTWF0Y2hlcjwgOjpzdGQ6OndzdHJpbmc+IG0xID0gSGFzU3Vic3RyKEwiZm9vIik7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoOjpzdGQ6OndzdHJpbmcoTCJJIGxvdmUgZm9vZC4iKSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyg6OnN0ZDo6d3N0cmluZyhMInRvZm8iKSkpOworCisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgOjpzdGQ6OndzdHJpbmcmPiBtMiA9IEhhc1N1YnN0cihMImZvbyIpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDo6c3RkOjp3c3RyaW5nKEwiSSBsb3ZlIGZvb2QuIikpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoOjpzdGQ6OndzdHJpbmcoTCJ0b2ZvIikpKTsKK30KKworLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIoKSB3b3JrcyBmb3IgbWF0Y2hpbmcgQy13aWRlLXN0cmluZy10eXBlZCB2YWx1ZXMuCitURVNUKFN0ZFdpZGVIYXNTdWJzdHJUZXN0LCBXb3Jrc0ZvckNTdHJpbmdzKSB7CisgIGNvbnN0IE1hdGNoZXI8d2NoYXJfdCo+IG0xID0gSGFzU3Vic3RyKEwiZm9vIik7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoY29uc3RfY2FzdDx3Y2hhcl90Kj4oTCJJIGxvdmUgZm9vZC4iKSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhjb25zdF9jYXN0PHdjaGFyX3QqPihMInRvZm8iKSkpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7CisKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbTIgPSBIYXNTdWJzdHIoTCJmb28iKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkkgbG92ZSBmb29kLiIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJ0b2ZvIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhOVUxMKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSGFzU3Vic3RyKHMpIGRlc2NyaWJlcyBpdHNlbGYgcHJvcGVybHkuCitURVNUKFN0ZFdpZGVIYXNTdWJzdHJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjwgOjpzdGQ6OndzdHJpbmc+IG0gPSBIYXNTdWJzdHIoTCJmb29cblwiIik7CisgIEVYUEVDVF9FUSgiaGFzIHN1YnN0cmluZyBMXCJmb29cXG5cXFwiXCIiLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIFN0YXJ0c1dpdGgocykuCisKK1RFU1QoU3RkV2lkZVN0YXJ0c1dpdGhUZXN0LCBNYXRjaGVzU3RyaW5nV2l0aEdpdmVuUHJlZml4KSB7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0xID0gU3RhcnRzV2l0aCg6OnN0ZDo6d3N0cmluZyhMIiIpKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhMIkhpIikpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKEwiIikpOworICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhOVUxMKSk7CisKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6d3N0cmluZyY+IG0yID0gU3RhcnRzV2l0aChMIkhpIik7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJIaSIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkhpIEhpISIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkhpZ2giKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSCIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCIgSGkiKSk7Cit9CisKK1RFU1QoU3RkV2lkZVN0YXJ0c1dpdGhUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6d3N0cmluZz4gbSA9IFN0YXJ0c1dpdGgoTCJIaSIpOworICBFWFBFQ1RfRVEoInN0YXJ0cyB3aXRoIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIEVuZHNXaXRoKHMpLgorCitURVNUKFN0ZFdpZGVFbmRzV2l0aFRlc3QsIE1hdGNoZXNTdHJpbmdXaXRoR2l2ZW5TdWZmaXgpIHsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbTEgPSBFbmRzV2l0aChMIiIpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKEwiSGkiKSk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoTCIiKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKKworICBjb25zdCBNYXRjaGVyPGNvbnN0IDo6c3RkOjp3c3RyaW5nJj4gbTIgPSBFbmRzV2l0aCg6OnN0ZDo6d3N0cmluZyhMIkhpIikpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSGkiKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJXb3cgSGkgSGkiKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJTdXBlciBIaSIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJpIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMIkhpICIpKTsKK30KKworVEVTVChTdGRXaWRlRW5kc1dpdGhUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCA6OnN0ZDo6d3N0cmluZz4gbSA9IEVuZHNXaXRoKEwiSGkiKTsKKyAgRVhQRUNUX0VRKCJlbmRzIHdpdGggTFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworVEVTVChHbG9iYWxXaWRlU3RyRXFUZXN0LCBNYXRjaGVzRXF1YWwpIHsKKyAgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbSA9IFN0ckVxKDo6d3N0cmluZyhMIkhlbGxvIikpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCJIZWxsbyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhMImhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKE5VTEwpKTsKKworICBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZyY+IG0yID0gU3RyRXEoTCJIZWxsbyIpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSGVsbG8iKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSGkiKSk7CisKKyAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMyA9IFN0ckVxKEwiXHhEM1x4NTc2XHg4RDNceEM3NEQiKTsKKyAgRVhQRUNUX1RSVUUobTMuTWF0Y2hlcyhMIlx4RDNceDU3Nlx4OEQzXHhDNzREIikpOworICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhMIlx4RDNceDU3Nlx4OEQzXHhDNzRFIikpOworCisgIDo6d3N0cmluZyBzdHIoTCIwMTIwNDUwMDgwMCIpOworICBzdHJbM10gPSBMJ1wwJzsKKyAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtNCA9IFN0ckVxKHN0cik7CisgIEVYUEVDVF9UUlVFKG00Lk1hdGNoZXMoc3RyKSk7CisgIHN0clswXSA9IHN0cls2XSA9IHN0cls3XSA9IHN0cls5XSA9IHN0clsxMF0gPSBMJ1wwJzsKKyAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtNSA9IFN0ckVxKHN0cik7CisgIEVYUEVDVF9UUlVFKG01Lk1hdGNoZXMoc3RyKSk7Cit9CisKK1RFU1QoR2xvYmFsV2lkZVN0ckVxVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8IDo6d3N0cmluZz4gbSA9IFN0ckVxKEwiSGktXCdcIj9cXFxhXGJcZlxuXHJcdFx2Iik7CisgIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gTFwiSGktXCdcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXHJcXHRcXHZcIiIsCisgICAgRGVzY3JpYmUobSkpOworCisgIE1hdGNoZXI8IDo6d3N0cmluZz4gbTIgPSBTdHJFcShMIlx4RDNceDU3Nlx4OEQzXHhDNzREIik7CisgIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gTFwiXFx4RDNcXHg1NzZcXHg4RDNcXHhDNzREXCIiLAorICAgIERlc2NyaWJlKG0yKSk7CisKKyAgOjp3c3RyaW5nIHN0cihMIjAxMjA0NTAwODAwIik7CisgIHN0clszXSA9IEwnXDAnOworICBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZyY+IG00ID0gU3RyRXEoc3RyKTsKKyAgRVhQRUNUX0VRKCJpcyBlcXVhbCB0byBMXCIwMTJcXDA0NTAwODAwXCIiLCBEZXNjcmliZShtNCkpOworICBzdHJbMF0gPSBzdHJbNl0gPSBzdHJbN10gPSBzdHJbOV0gPSBzdHJbMTBdID0gTCdcMCc7CisgIE1hdGNoZXI8Y29uc3QgOjp3c3RyaW5nJj4gbTUgPSBTdHJFcShzdHIpOworICBFWFBFQ1RfRVEoImlzIGVxdWFsIHRvIExcIlxcMDEyXFwwNDVcXDBcXDA4XFwwXFwwXCIiLCBEZXNjcmliZShtNSkpOworfQorCitURVNUKEdsb2JhbFdpZGVTdHJOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nKSB7CisgIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJOZShMIkhlbGxvIik7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhMIiIpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKE5VTEwpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhMIkhlbGxvIikpOworCisgIE1hdGNoZXI8IDo6d3N0cmluZz4gbTIgPSBTdHJOZSg6OndzdHJpbmcoTCJIZWxsbyIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMImhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMIkhlbGxvIikpOworfQorCitURVNUKEdsb2JhbFdpZGVTdHJOZVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtID0gU3RyTmUoTCJIaSIpOworICBFWFBFQ1RfRVEoImlzbid0IGVxdWFsIHRvIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Cit9CisKK1RFU1QoR2xvYmFsV2lkZVN0ckNhc2VFcVRlc3QsIE1hdGNoZXNFcXVhbFN0cmluZ0lnbm9yaW5nQ2FzZSkgeworICBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtID0gU3RyQ2FzZUVxKDo6d3N0cmluZyhMIkhlbGxvIikpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCJIZWxsbyIpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKEwiaGVsbG8iKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTCJIaSIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhOVUxMKSk7CisKKyAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcShMIkhlbGxvIik7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJoZWxsbyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJIaSIpKTsKK30KKworVEVTVChHbG9iYWxXaWRlU3RyQ2FzZUVxVGVzdCwgTWF0Y2hlc0VxdWFsU3RyaW5nV2l0aDBJZ25vcmluZ0Nhc2UpIHsKKyAgOjp3c3RyaW5nIHN0cjEoTCJvYWJvY2Rvb2VvbyIpOworICA6OndzdHJpbmcgc3RyMihMIk9BQk9DRE9PRU9PIik7CisgIE1hdGNoZXI8Y29uc3QgOjp3c3RyaW5nJj4gbTAgPSBTdHJDYXNlRXEoc3RyMSk7CisgIEVYUEVDVF9GQUxTRShtMC5NYXRjaGVzKHN0cjIgKyA6OndzdHJpbmcoMSwgTCdcMCcpKSk7CisKKyAgc3RyMVszXSA9IHN0cjJbM10gPSBMJ1wwJzsKKyAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMSA9IFN0ckNhc2VFcShzdHIxKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhzdHIyKSk7CisKKyAgc3RyMVswXSA9IHN0cjFbNl0gPSBzdHIxWzddID0gc3RyMVsxMF0gPSBMJ1wwJzsKKyAgc3RyMlswXSA9IHN0cjJbNl0gPSBzdHIyWzddID0gc3RyMlsxMF0gPSBMJ1wwJzsKKyAgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMiA9IFN0ckNhc2VFcShzdHIxKTsKKyAgc3RyMVs5XSA9IHN0cjJbOV0gPSBMJ1wwJzsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoc3RyMikpOworCisgIE1hdGNoZXI8Y29uc3QgOjp3c3RyaW5nJj4gbTMgPSBTdHJDYXNlRXEoc3RyMSk7CisgIEVYUEVDVF9UUlVFKG0zLk1hdGNoZXMoc3RyMikpOworCisgIEVYUEVDVF9GQUxTRShtMy5NYXRjaGVzKHN0cjIgKyBMIngiKSk7CisgIHN0cjIuYXBwZW5kKDEsIEwnXDAnKTsKKyAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoc3RyMikpOworICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyg6OndzdHJpbmcoc3RyMiwgMCwgOSkpKTsKK30KKworVEVTVChHbG9iYWxXaWRlU3RyQ2FzZUVxVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8IDo6d3N0cmluZz4gbSA9IFN0ckNhc2VFcShMIkhpIik7CisgIEVYUEVDVF9FUSgiaXMgZXF1YWwgdG8gKGlnbm9yaW5nIGNhc2UpIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Cit9CisKK1RFU1QoR2xvYmFsV2lkZVN0ckNhc2VOZVRlc3QsIE1hdGNoZXNVbmVxdWFsU3RyaW5nSWdub3JpbmdDYXNlKSB7CisgIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJDYXNlTmUoTCJIZWxsbyIpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTCJIaSIpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKE5VTEwpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhMIkhlbGxvIikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKEwiaGVsbG8iKSk7CisKKyAgTWF0Y2hlcjwgOjp3c3RyaW5nPiBtMiA9IFN0ckNhc2VOZSg6OndzdHJpbmcoTCJIZWxsbyIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJIZWxsbyIpKTsKK30KKworVEVTVChHbG9iYWxXaWRlU3RyQ2FzZU5lVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0gPSBTdHJDYXNlTmUoTCJIaSIpOworICBFWFBFQ1RfRVEoImlzbid0IGVxdWFsIHRvIChpZ25vcmluZyBjYXNlKSBMXCJIaVwiIiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IEhhc1N1YnN0cigpIHdvcmtzIGZvciBtYXRjaGluZyB3c3RyaW5nLXR5cGVkIHZhbHVlcy4KK1RFU1QoR2xvYmFsV2lkZUhhc1N1YnN0clRlc3QsIFdvcmtzRm9yU3RyaW5nQ2xhc3NlcykgeworICBjb25zdCBNYXRjaGVyPCA6OndzdHJpbmc+IG0xID0gSGFzU3Vic3RyKEwiZm9vIik7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoOjp3c3RyaW5nKEwiSSBsb3ZlIGZvb2QuIikpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoOjp3c3RyaW5nKEwidG9mbyIpKSk7CisKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCA6OndzdHJpbmcmPiBtMiA9IEhhc1N1YnN0cihMImZvbyIpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDo6d3N0cmluZyhMIkkgbG92ZSBmb29kLiIpKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKDo6d3N0cmluZyhMInRvZm8iKSkpOworfQorCisvLyBUZXN0cyB0aGF0IEhhc1N1YnN0cigpIHdvcmtzIGZvciBtYXRjaGluZyBDLXdpZGUtc3RyaW5nLXR5cGVkIHZhbHVlcy4KK1RFU1QoR2xvYmFsV2lkZUhhc1N1YnN0clRlc3QsIFdvcmtzRm9yQ1N0cmluZ3MpIHsKKyAgY29uc3QgTWF0Y2hlcjx3Y2hhcl90Kj4gbTEgPSBIYXNTdWJzdHIoTCJmb28iKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhjb25zdF9jYXN0PHdjaGFyX3QqPihMIkkgbG92ZSBmb29kLiIpKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KEwidG9mbyIpKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKKworICBjb25zdCBNYXRjaGVyPGNvbnN0IHdjaGFyX3QqPiBtMiA9IEhhc1N1YnN0cihMImZvbyIpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSSBsb3ZlIGZvb2QuIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMInRvZm8iKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKE5VTEwpKTsKK30KKworLy8gVGVzdHMgdGhhdCBIYXNTdWJzdHIocykgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoR2xvYmFsV2lkZUhhc1N1YnN0clRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPCA6OndzdHJpbmc+IG0gPSBIYXNTdWJzdHIoTCJmb29cblwiIik7CisgIEVYUEVDVF9FUSgiaGFzIHN1YnN0cmluZyBMXCJmb29cXG5cXFwiXCIiLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIFN0YXJ0c1dpdGgocykuCisKK1RFU1QoR2xvYmFsV2lkZVN0YXJ0c1dpdGhUZXN0LCBNYXRjaGVzU3RyaW5nV2l0aEdpdmVuUHJlZml4KSB7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3Qgd2NoYXJfdCo+IG0xID0gU3RhcnRzV2l0aCg6OndzdHJpbmcoTCIiKSk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoTCJIaSIpKTsKKyAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhMIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoTlVMTCkpOworCisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgOjp3c3RyaW5nJj4gbTIgPSBTdGFydHNXaXRoKEwiSGkiKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIkhpIikpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSGkgSGkhIikpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKEwiSGlnaCIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0yLk1hdGNoZXMoTCJIIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMIiBIaSIpKTsKK30KKworVEVTVChHbG9iYWxXaWRlU3RhcnRzV2l0aFRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZz4gbSA9IFN0YXJ0c1dpdGgoTCJIaSIpOworICBFWFBFQ1RfRVEoInN0YXJ0cyB3aXRoIExcIkhpXCIiLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIEVuZHNXaXRoKHMpLgorCitURVNUKEdsb2JhbFdpZGVFbmRzV2l0aFRlc3QsIE1hdGNoZXNTdHJpbmdXaXRoR2l2ZW5TdWZmaXgpIHsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCB3Y2hhcl90Kj4gbTEgPSBFbmRzV2l0aChMIiIpOworICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKEwiSGkiKSk7CisgIEVYUEVDVF9UUlVFKG0xLk1hdGNoZXMoTCIiKSk7CisgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKE5VTEwpKTsKKworICBjb25zdCBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZyY+IG0yID0gRW5kc1dpdGgoOjp3c3RyaW5nKEwiSGkiKSk7CisgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoTCJIaSIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIldvdyBIaSBIaSIpKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcyhMIlN1cGVyIEhpIikpOworICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcyhMImkiKSk7CisgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKEwiSGkgIikpOworfQorCitURVNUKEdsb2JhbFdpZGVFbmRzV2l0aFRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGNvbnN0IDo6d3N0cmluZz4gbSA9IEVuZHNXaXRoKEwiSGkiKTsKKyAgRVhQRUNUX0VRKCJlbmRzIHdpdGggTFwiSGlcIiIsIERlc2NyaWJlKG0pKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworCit0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8bG9uZywgaW50PiBUdXBsZTI7ICAvLyBOT0xJTlQKKworLy8gVGVzdHMgdGhhdCBFcSgpIG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZSBmaXJzdCBmaWVsZCA9PSB0aGUKKy8vIHNlY29uZCBmaWVsZC4KK1RFU1QoRXEyVGVzdCwgTWF0Y2hlc0VxdWFsQXJndW1lbnRzKSB7CisgIE1hdGNoZXI8Y29uc3QgVHVwbGUyJj4gbSA9IEVxKCk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDUpKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoVHVwbGUyKDVMLCA2KSkpOworfQorCisvLyBUZXN0cyB0aGF0IEVxKCkgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoRXEyVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8Y29uc3QgVHVwbGUyJj4gbSA9IEVxKCk7CisgIEVYUEVDVF9FUSgiYXJlIGFuIGVxdWFsIHBhaXIiLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR2UoKSBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUgZmlyc3QgZmllbGQgPj0gdGhlCisvLyBzZWNvbmQgZmllbGQuCitURVNUKEdlMlRlc3QsIE1hdGNoZXNHcmVhdGVyVGhhbk9yRXF1YWxBcmd1bWVudHMpIHsKKyAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gR2UoKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMig1TCwgNCkpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMig1TCwgNSkpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDYpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR2UoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChHZTJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gR2UoKTsKKyAgRVhQRUNUX0VRKCJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+PSB0aGUgc2Vjb25kIiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IEd0KCkgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlIGZpcnN0IGZpZWxkID4gdGhlCisvLyBzZWNvbmQgZmllbGQuCitURVNUKEd0MlRlc3QsIE1hdGNoZXNHcmVhdGVyVGhhbkFyZ3VtZW50cykgeworICBNYXRjaGVyPGNvbnN0IFR1cGxlMiY+IG0gPSBHdCgpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoVHVwbGUyKDVMLCA0KSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKFR1cGxlMig1TCwgNSkpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDYpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR3QoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChHdDJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gR3QoKTsKKyAgRVhQRUNUX0VRKCJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+IHRoZSBzZWNvbmQiLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTGUoKSBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUgZmlyc3QgZmllbGQgPD0gdGhlCisvLyBzZWNvbmQgZmllbGQuCitURVNUKExlMlRlc3QsIE1hdGNoZXNMZXNzVGhhbk9yRXF1YWxBcmd1bWVudHMpIHsKKyAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gTGUoKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMig1TCwgNikpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKFR1cGxlMig1TCwgNSkpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDQpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTGUoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChMZTJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gTGUoKTsKKyAgRVhQRUNUX0VRKCJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA8PSB0aGUgc2Vjb25kIiwgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IEx0KCkgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlIGZpcnN0IGZpZWxkIDwgdGhlCisvLyBzZWNvbmQgZmllbGQuCitURVNUKEx0MlRlc3QsIE1hdGNoZXNMZXNzVGhhbkFyZ3VtZW50cykgeworICBNYXRjaGVyPGNvbnN0IFR1cGxlMiY+IG0gPSBMdCgpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoVHVwbGUyKDVMLCA2KSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKFR1cGxlMig1TCwgNSkpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDQpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTHQoKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChMdDJUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCBUdXBsZTImPiBtID0gTHQoKTsKKyAgRVhQRUNUX0VRKCJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA8IHRoZSBzZWNvbmQiLCBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTmUoKSBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUgZmlyc3QgZmllbGQgIT0gdGhlCisvLyBzZWNvbmQgZmllbGQuCitURVNUKE5lMlRlc3QsIE1hdGNoZXNVbmVxdWFsQXJndW1lbnRzKSB7CisgIE1hdGNoZXI8Y29uc3QgVHVwbGUyJj4gbSA9IE5lKCk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDYpKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhUdXBsZTIoNUwsIDQpKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoVHVwbGUyKDVMLCA1KSkpOworfQorCisvLyBUZXN0cyB0aGF0IE5lKCkgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoTmUyVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8Y29uc3QgVHVwbGUyJj4gbSA9IE5lKCk7CisgIEVYUEVDVF9FUSgiYXJlIGFuIHVuZXF1YWwgcGFpciIsIERlc2NyaWJlKG0pKTsKK30KKworLy8gVGVzdHMgdGhhdCBOb3QobSkgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBkb2Vzbid0IG1hdGNoIG0uCitURVNUKE5vdFRlc3QsIE5lZ2F0ZXNNYXRjaGVyKSB7CisgIE1hdGNoZXI8aW50PiBtOworICBtID0gTm90KEVxKDIpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDMpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygyKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTm90KG0pIGRlc2NyaWJlcyBpdHNlbGYgcHJvcGVybHkuCitURVNUKE5vdFRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGludD4gbSA9IE5vdChFcSg1KSk7CisgIEVYUEVDVF9FUSgiaXNuJ3QgZXF1YWwgdG8gNSIsIERlc2NyaWJlKG0pKTsKK30KKworLy8gVGVzdHMgdGhhdCBtb25vbW9ycGhpYyBtYXRjaGVycyBhcmUgc2FmZWx5IGNhc3QgYnkgdGhlIE5vdCBtYXRjaGVyLgorVEVTVChOb3RUZXN0LCBOb3RNYXRjaGVyU2FmZWx5Q2FzdHNNb25vbW9ycGhpY01hdGNoZXJzKSB7CisgIC8vIGdyZWF0ZXJfdGhhbl81IGlzIGEgbW9ub21vcnBoaWMgbWF0Y2hlci4KKyAgTWF0Y2hlcjxpbnQ+IGdyZWF0ZXJfdGhhbl81ID0gR3QoNSk7CisKKyAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtID0gTm90KGdyZWF0ZXJfdGhhbl81KTsKKyAgTWF0Y2hlcjxpbnQmPiBtMiA9IE5vdChncmVhdGVyX3RoYW5fNSk7CisgIE1hdGNoZXI8aW50Jj4gbTMgPSBOb3QobSk7Cit9CisKKy8vIEhlbHBlciB0byBhbGxvdyBlYXN5IHRlc3Rpbmcgb2YgQWxsT2YgbWF0Y2hlcnMgd2l0aCBudW0gcGFyYW1ldGVycy4KK3ZvaWQgQWxsT2ZNYXRjaGVzKGludCBudW0sIGNvbnN0IE1hdGNoZXI8aW50PiYgbSkgeworICBTQ09QRURfVFJBQ0UoRGVzY3JpYmUobSkpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMCkpOworICBmb3IgKGludCBpID0gMTsgaSA8PSBudW07ICsraSkgeworICAgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoaSkpOworICB9CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhudW0gKyAxKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQWxsT2YobTEsIC4uLiwgbW4pIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQgbWF0Y2hlcyBhbGwgb2YKKy8vIHRoZSBnaXZlbiBtYXRjaGVycy4KK1RFU1QoQWxsT2ZUZXN0LCBNYXRjaGVzV2hlbkFsbE1hdGNoKSB7CisgIE1hdGNoZXI8aW50PiBtOworICBtID0gQWxsT2YoTGUoMiksIEdlKDEpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDEpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygwKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMykpOworCisgIG0gPSBBbGxPZihHdCgwKSwgTmUoMSksIE5lKDIpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDMpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygyKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDApKTsKKworICBtID0gQWxsT2YoR3QoMCksIE5lKDEpLCBOZSgyKSwgTmUoMykpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoNCkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDMpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygyKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDApKTsKKworICBtID0gQWxsT2YoR2UoMCksIEx0KDEwKSwgTmUoMyksIE5lKDUpLCBOZSg3KSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygwKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygxKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMykpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgZm9yIHZhcnlpbmcgbnVtYmVyIG9mIHN1Yi1tYXRjaGVycy4gRHVlIHRvIHRoZSB3YXkKKyAgLy8gdGhlIHN1Yi1tYXRjaGVycyBhcmUgaGFuZGxlZCBpdCBpcyBlbm91Z2ggdG8gdGVzdCBldmVyeSBzdWItbWF0Y2hlciBvbmNlCisgIC8vIHdpdGggc3ViLW1hdGNoZXJzIHVzaW5nIHRoZSBzYW1lIG1hdGNoZXIgdHlwZS4gVmFyeWluZyBtYXRjaGVyIHR5cGVzIGFyZQorICAvLyBjaGVja2VkIGZvciBhYm92ZS4KKyAgQWxsT2ZNYXRjaGVzKDIsIEFsbE9mKE5lKDEpLCBOZSgyKSkpOworICBBbGxPZk1hdGNoZXMoMywgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSkpOworICBBbGxPZk1hdGNoZXMoNCwgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSwgTmUoNCkpKTsKKyAgQWxsT2ZNYXRjaGVzKDUsIEFsbE9mKE5lKDEpLCBOZSgyKSwgTmUoMyksIE5lKDQpLCBOZSg1KSkpOworICBBbGxPZk1hdGNoZXMoNiwgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSwgTmUoNCksIE5lKDUpLCBOZSg2KSkpOworICBBbGxPZk1hdGNoZXMoNywgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSwgTmUoNCksIE5lKDUpLCBOZSg2KSwgTmUoNykpKTsKKyAgQWxsT2ZNYXRjaGVzKDgsIEFsbE9mKE5lKDEpLCBOZSgyKSwgTmUoMyksIE5lKDQpLCBOZSg1KSwgTmUoNiksIE5lKDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgTmUoOCkpKTsKKyAgQWxsT2ZNYXRjaGVzKDksIEFsbE9mKE5lKDEpLCBOZSgyKSwgTmUoMyksIE5lKDQpLCBOZSg1KSwgTmUoNiksIE5lKDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgTmUoOCksIE5lKDkpKSk7CisgIEFsbE9mTWF0Y2hlcygxMCwgQWxsT2YoTmUoMSksIE5lKDIpLCBOZSgzKSwgTmUoNCksIE5lKDUpLCBOZSg2KSwgTmUoNyksIE5lKDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5lKDkpLCBOZSgxMCkpKTsKK30KKworI2lmIEdURVNUX0xBTkdfQ1hYMTEKKy8vIFRlc3RzIHRoZSB2YXJpYWRpYyB2ZXJzaW9uIG9mIHRoZSBBbGxPZk1hdGNoZXIuCitURVNUKEFsbE9mVGVzdCwgVmFyaWFkaWNNYXRjaGVzV2hlbkFsbE1hdGNoKSB7CisgIC8vIE1ha2Ugc3VyZSBBbGxPZiBpcyBkZWZpbmVkIGluIHRoZSByaWdodCBuYW1lc3BhY2UgYW5kIGRvZXMgbm90IGRlcGVuZCBvbgorICAvLyBBREwuCisgIDo6dGVzdGluZzo6QWxsT2YoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExKTsKKyAgTWF0Y2hlcjxpbnQ+IG0gPSBBbGxPZihOZSgxKSwgTmUoMiksIE5lKDMpLCBOZSg0KSwgTmUoNSksIE5lKDYpLCBOZSg3KSwgTmUoOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTmUoOSksIE5lKDEwKSwgTmUoMTEpKTsKKyAgRVhQRUNUX1RIQVQoRGVzY3JpYmUobSksIEVuZHNXaXRoKCJhbmQgKGlzbid0IGVxdWFsIHRvIDExKSkpKSkpKSkpKSIpKTsKKyAgQWxsT2ZNYXRjaGVzKDExLCBtKTsKKyAgQWxsT2ZNYXRjaGVzKDUwLCBBbGxPZihOZSgxKSwgTmUoMiksIE5lKDMpLCBOZSg0KSwgTmUoNSksIE5lKDYpLCBOZSg3KSwgTmUoOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTmUoOSksIE5lKDEwKSwgTmUoMTEpLCBOZSgxMiksIE5lKDEzKSwgTmUoMTQpLCBOZSgxNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTmUoMTYpLCBOZSgxNyksIE5lKDE4KSwgTmUoMTkpLCBOZSgyMCksIE5lKDIxKSwgTmUoMjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5lKDIzKSwgTmUoMjQpLCBOZSgyNSksIE5lKDI2KSwgTmUoMjcpLCBOZSgyOCksIE5lKDI5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOZSgzMCksIE5lKDMxKSwgTmUoMzIpLCBOZSgzMyksIE5lKDM0KSwgTmUoMzUpLCBOZSgzNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgTmUoMzcpLCBOZSgzOCksIE5lKDM5KSwgTmUoNDApLCBOZSg0MSksIE5lKDQyKSwgTmUoNDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5lKDQ0KSwgTmUoNDUpLCBOZSg0NiksIE5lKDQ3KSwgTmUoNDgpLCBOZSg0OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTmUoNTApKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQorCisvLyBUZXN0cyB0aGF0IEFsbE9mKG0xLCAuLi4sIG1uKSBkZXNjcmliZXMgaXRzZWxmIHByb3Blcmx5LgorVEVTVChBbGxPZlRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGludD4gbTsKKyAgbSA9IEFsbE9mKExlKDIpLCBHZSgxKSk7CisgIEVYUEVDVF9FUSgiKGlzIDw9IDIpIGFuZCAoaXMgPj0gMSkiLCBEZXNjcmliZShtKSk7CisKKyAgbSA9IEFsbE9mKEd0KDApLCBOZSgxKSwgTmUoMikpOworICBFWFBFQ1RfRVEoIihpcyA+IDApIGFuZCAiCisgICAgICAgICAgICAiKChpc24ndCBlcXVhbCB0byAxKSBhbmQgIgorICAgICAgICAgICAgIihpc24ndCBlcXVhbCB0byAyKSkiLAorICAgICAgICAgICAgRGVzY3JpYmUobSkpOworCisKKyAgbSA9IEFsbE9mKEd0KDApLCBOZSgxKSwgTmUoMiksIE5lKDMpKTsKKyAgRVhQRUNUX0VRKCIoKGlzID4gMCkgYW5kICIKKyAgICAgICAgICAgICIoaXNuJ3QgZXF1YWwgdG8gMSkpIGFuZCAiCisgICAgICAgICAgICAiKChpc24ndCBlcXVhbCB0byAyKSBhbmQgIgorICAgICAgICAgICAgIihpc24ndCBlcXVhbCB0byAzKSkiLAorICAgICAgICAgICAgRGVzY3JpYmUobSkpOworCisKKyAgbSA9IEFsbE9mKEdlKDApLCBMdCgxMCksIE5lKDMpLCBOZSg1KSwgTmUoNykpOworICBFWFBFQ1RfRVEoIigoaXMgPj0gMCkgYW5kICIKKyAgICAgICAgICAgICIoaXMgPCAxMCkpIGFuZCAiCisgICAgICAgICAgICAiKChpc24ndCBlcXVhbCB0byAzKSBhbmQgIgorICAgICAgICAgICAgIigoaXNuJ3QgZXF1YWwgdG8gNSkgYW5kICIKKyAgICAgICAgICAgICIoaXNuJ3QgZXF1YWwgdG8gNykpKSIsCisgICAgICAgICAgICBEZXNjcmliZShtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQWxsT2YobTEsIC4uLiwgbW4pIGRlc2NyaWJlcyBpdHMgbmVnYXRpb24gcHJvcGVybHkuCitURVNUKEFsbE9mVGVzdCwgQ2FuRGVzY3JpYmVOZWdhdGlvbikgeworICBNYXRjaGVyPGludD4gbTsKKyAgbSA9IEFsbE9mKExlKDIpLCBHZSgxKSk7CisgIEVYUEVDVF9FUSgiKGlzbid0IDw9IDIpIG9yICIKKyAgICAgICAgICAgICIoaXNuJ3QgPj0gMSkiLAorICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7CisKKyAgbSA9IEFsbE9mKEd0KDApLCBOZSgxKSwgTmUoMikpOworICBFWFBFQ1RfRVEoIihpc24ndCA+IDApIG9yICIKKyAgICAgICAgICAgICIoKGlzIGVxdWFsIHRvIDEpIG9yICIKKyAgICAgICAgICAgICIoaXMgZXF1YWwgdG8gMikpIiwKKyAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOworCisKKyAgbSA9IEFsbE9mKEd0KDApLCBOZSgxKSwgTmUoMiksIE5lKDMpKTsKKyAgRVhQRUNUX0VRKCIoKGlzbid0ID4gMCkgb3IgIgorICAgICAgICAgICAgIihpcyBlcXVhbCB0byAxKSkgb3IgIgorICAgICAgICAgICAgIigoaXMgZXF1YWwgdG8gMikgb3IgIgorICAgICAgICAgICAgIihpcyBlcXVhbCB0byAzKSkiLAorICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7CisKKworICBtID0gQWxsT2YoR2UoMCksIEx0KDEwKSwgTmUoMyksIE5lKDUpLCBOZSg3KSk7CisgIEVYUEVDVF9FUSgiKChpc24ndCA+PSAwKSBvciAiCisgICAgICAgICAgICAiKGlzbid0IDwgMTApKSBvciAiCisgICAgICAgICAgICAiKChpcyBlcXVhbCB0byAzKSBvciAiCisgICAgICAgICAgICAiKChpcyBlcXVhbCB0byA1KSBvciAiCisgICAgICAgICAgICAiKGlzIGVxdWFsIHRvIDcpKSkiLAorICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbW9ub21vcnBoaWMgbWF0Y2hlcnMgYXJlIHNhZmVseSBjYXN0IGJ5IHRoZSBBbGxPZiBtYXRjaGVyLgorVEVTVChBbGxPZlRlc3QsIEFsbE9mTWF0Y2hlclNhZmVseUNhc3RzTW9ub21vcnBoaWNNYXRjaGVycykgeworICAvLyBncmVhdGVyX3RoYW5fNSBhbmQgbGVzc190aGFuXzEwIGFyZSBtb25vbW9ycGhpYyBtYXRjaGVycy4KKyAgTWF0Y2hlcjxpbnQ+IGdyZWF0ZXJfdGhhbl81ID0gR3QoNSk7CisgIE1hdGNoZXI8aW50PiBsZXNzX3RoYW5fMTAgPSBMdCgxMCk7CisKKyAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtID0gQWxsT2YoZ3JlYXRlcl90aGFuXzUsIGxlc3NfdGhhbl8xMCk7CisgIE1hdGNoZXI8aW50Jj4gbTIgPSBBbGxPZihncmVhdGVyX3RoYW5fNSwgbGVzc190aGFuXzEwKTsKKyAgTWF0Y2hlcjxpbnQmPiBtMyA9IEFsbE9mKGdyZWF0ZXJfdGhhbl81LCBtMik7CisKKyAgLy8gVGVzdHMgdGhhdCBCb3RoT2Ygd29ya3Mgd2hlbiBjb21wb3NpbmcgaXRzZWxmLgorICBNYXRjaGVyPGNvbnN0IGludCY+IG00ID0gQWxsT2YoZ3JlYXRlcl90aGFuXzUsIGxlc3NfdGhhbl8xMCwgbGVzc190aGFuXzEwKTsKKyAgTWF0Y2hlcjxpbnQmPiBtNSA9IEFsbE9mKGdyZWF0ZXJfdGhhbl81LCBsZXNzX3RoYW5fMTAsIGxlc3NfdGhhbl8xMCk7Cit9CisKK1RFU1QoQWxsT2ZUZXN0LCBFeHBsYWluc1Jlc3VsdCkgeworICBNYXRjaGVyPGludD4gbTsKKworICAvLyBTdWNjZXNzZnVsIG1hdGNoLiAgQm90aCBtYXRjaGVycyBuZWVkIHRvIGV4cGxhaW4uICBUaGUgc2Vjb25kCisgIC8vIG1hdGNoZXIgZG9lc24ndCBnaXZlIGFuIGV4cGxhbmF0aW9uLCBzbyBvbmx5IHRoZSBmaXJzdCBtYXRjaGVyJ3MKKyAgLy8gZXhwbGFuYXRpb24gaXMgcHJpbnRlZC4KKyAgbSA9IEFsbE9mKEdyZWF0ZXJUaGFuKDEwKSwgTHQoMzApKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyAxNSBtb3JlIHRoYW4gMTAiLCBFeHBsYWluKG0sIDI1KSk7CisKKyAgLy8gU3VjY2Vzc2Z1bCBtYXRjaC4gIEJvdGggbWF0Y2hlcnMgbmVlZCB0byBleHBsYWluLgorICBtID0gQWxsT2YoR3JlYXRlclRoYW4oMTApLCBHcmVhdGVyVGhhbigyMCkpOworICBFWFBFQ1RfRVEoIndoaWNoIGlzIDIwIG1vcmUgdGhhbiAxMCwgYW5kIHdoaWNoIGlzIDEwIG1vcmUgdGhhbiAyMCIsCisgICAgICAgICAgICBFeHBsYWluKG0sIDMwKSk7CisKKyAgLy8gU3VjY2Vzc2Z1bCBtYXRjaC4gIEFsbCBtYXRjaGVycyBuZWVkIHRvIGV4cGxhaW4uICBUaGUgc2Vjb25kCisgIC8vIG1hdGNoZXIgZG9lc24ndCBnaXZlbiBhbiBleHBsYW5hdGlvbi4KKyAgbSA9IEFsbE9mKEdyZWF0ZXJUaGFuKDEwKSwgTHQoMzApLCBHcmVhdGVyVGhhbigyMCkpOworICBFWFBFQ1RfRVEoIndoaWNoIGlzIDE1IG1vcmUgdGhhbiAxMCwgYW5kIHdoaWNoIGlzIDUgbW9yZSB0aGFuIDIwIiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgMjUpKTsKKworICAvLyBTdWNjZXNzZnVsIG1hdGNoLiAgQWxsIG1hdGNoZXJzIG5lZWQgdG8gZXhwbGFpbi4KKyAgbSA9IEFsbE9mKEdyZWF0ZXJUaGFuKDEwKSwgR3JlYXRlclRoYW4oMjApLCBHcmVhdGVyVGhhbigzMCkpOworICBFWFBFQ1RfRVEoIndoaWNoIGlzIDMwIG1vcmUgdGhhbiAxMCwgYW5kIHdoaWNoIGlzIDIwIG1vcmUgdGhhbiAyMCwgIgorICAgICAgICAgICAgImFuZCB3aGljaCBpcyAxMCBtb3JlIHRoYW4gMzAiLAorICAgICAgICAgICAgRXhwbGFpbihtLCA0MCkpOworCisgIC8vIEZhaWxlZCBtYXRjaC4gIFRoZSBmaXJzdCBtYXRjaGVyLCB3aGljaCBmYWlsZWQsIG5lZWRzIHRvCisgIC8vIGV4cGxhaW4uCisgIG0gPSBBbGxPZihHcmVhdGVyVGhhbigxMCksIEdyZWF0ZXJUaGFuKDIwKSk7CisgIEVYUEVDVF9FUSgid2hpY2ggaXMgNSBsZXNzIHRoYW4gMTAiLCBFeHBsYWluKG0sIDUpKTsKKworICAvLyBGYWlsZWQgbWF0Y2guICBUaGUgc2Vjb25kIG1hdGNoZXIsIHdoaWNoIGZhaWxlZCwgbmVlZHMgdG8KKyAgLy8gZXhwbGFpbi4gIFNpbmNlIGl0IGRvZXNuJ3QgZ2l2ZW4gYW4gZXhwbGFuYXRpb24sIG5vdGhpbmcgaXMKKyAgLy8gcHJpbnRlZC4KKyAgbSA9IEFsbE9mKEdyZWF0ZXJUaGFuKDEwKSwgTHQoMzApKTsKKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDQwKSk7CisKKyAgLy8gRmFpbGVkIG1hdGNoLiAgVGhlIHNlY29uZCBtYXRjaGVyLCB3aGljaCBmYWlsZWQsIG5lZWRzIHRvCisgIC8vIGV4cGxhaW4uCisgIG0gPSBBbGxPZihHcmVhdGVyVGhhbigxMCksIEdyZWF0ZXJUaGFuKDIwKSk7CisgIEVYUEVDVF9FUSgid2hpY2ggaXMgNSBsZXNzIHRoYW4gMjAiLCBFeHBsYWluKG0sIDE1KSk7Cit9CisKKy8vIEhlbHBlciB0byBhbGxvdyBlYXN5IHRlc3Rpbmcgb2YgQW55T2YgbWF0Y2hlcnMgd2l0aCBudW0gcGFyYW1ldGVycy4KK3ZvaWQgQW55T2ZNYXRjaGVzKGludCBudW0sIGNvbnN0IE1hdGNoZXI8aW50PiYgbSkgeworICBTQ09QRURfVFJBQ0UoRGVzY3JpYmUobSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDApKTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoaSkpOworICB9CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMobnVtICsgMSkpOworfQorCisvLyBUZXN0cyB0aGF0IEFueU9mKG0xLCAuLi4sIG1uKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYXQKKy8vIGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW4gbWF0Y2hlcnMuCitURVNUKEFueU9mVGVzdCwgTWF0Y2hlc1doZW5BbnlNYXRjaGVzKSB7CisgIE1hdGNoZXI8aW50PiBtOworICBtID0gQW55T2YoTGUoMSksIEdlKDMpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDEpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDQpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygyKSk7CisKKyAgbSA9IEFueU9mKEx0KDApLCBFcSgxKSwgRXEoMikpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoLTEpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDEpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygwKSk7CisKKyAgbSA9IEFueU9mKEx0KDApLCBFcSgxKSwgRXEoMiksIEVxKDMpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKC0xKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygxKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygyKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygzKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMCkpOworCisgIG0gPSBBbnlPZihMZSgwKSwgR3QoMTApLCAzLCA1LCA3KTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDApKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDExKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygzKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMikpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgZm9yIHZhcnlpbmcgbnVtYmVyIG9mIHN1Yi1tYXRjaGVycy4gRHVlIHRvIHRoZSB3YXkKKyAgLy8gdGhlIHN1Yi1tYXRjaGVycyBhcmUgaGFuZGxlZCBpdCBpcyBlbm91Z2ggdG8gdGVzdCBldmVyeSBzdWItbWF0Y2hlciBvbmNlCisgIC8vIHdpdGggc3ViLW1hdGNoZXJzIHVzaW5nIHRoZSBzYW1lIG1hdGNoZXIgdHlwZS4gVmFyeWluZyBtYXRjaGVyIHR5cGVzIGFyZQorICAvLyBjaGVja2VkIGZvciBhYm92ZS4KKyAgQW55T2ZNYXRjaGVzKDIsIEFueU9mKDEsIDIpKTsKKyAgQW55T2ZNYXRjaGVzKDMsIEFueU9mKDEsIDIsIDMpKTsKKyAgQW55T2ZNYXRjaGVzKDQsIEFueU9mKDEsIDIsIDMsIDQpKTsKKyAgQW55T2ZNYXRjaGVzKDUsIEFueU9mKDEsIDIsIDMsIDQsIDUpKTsKKyAgQW55T2ZNYXRjaGVzKDYsIEFueU9mKDEsIDIsIDMsIDQsIDUsIDYpKTsKKyAgQW55T2ZNYXRjaGVzKDcsIEFueU9mKDEsIDIsIDMsIDQsIDUsIDYsIDcpKTsKKyAgQW55T2ZNYXRjaGVzKDgsIEFueU9mKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpKTsKKyAgQW55T2ZNYXRjaGVzKDksIEFueU9mKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpKTsKKyAgQW55T2ZNYXRjaGVzKDEwLCBBbnlPZigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkpOworfQorCisjaWYgR1RFU1RfTEFOR19DWFgxMQorLy8gVGVzdHMgdGhlIHZhcmlhZGljIHZlcnNpb24gb2YgdGhlIEFueU9mTWF0Y2hlci4KK1RFU1QoQW55T2ZUZXN0LCBWYXJpYWRpY01hdGNoZXNXaGVuQW55TWF0Y2hlcykgeworICAvLyBBbHNvIG1ha2Ugc3VyZSBBbnlPZiBpcyBkZWZpbmVkIGluIHRoZSByaWdodCBuYW1lc3BhY2UgYW5kIGRvZXMgbm90IGRlcGVuZAorICAvLyBvbiBBREwuCisgIE1hdGNoZXI8aW50PiBtID0gOjp0ZXN0aW5nOjpBbnlPZigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEpOworCisgIEVYUEVDVF9USEFUKERlc2NyaWJlKG0pLCBFbmRzV2l0aCgib3IgKGlzIGVxdWFsIHRvIDExKSkpKSkpKSkpKSIpKTsKKyAgQW55T2ZNYXRjaGVzKDExLCBtKTsKKyAgQW55T2ZNYXRjaGVzKDUwLCBBbnlPZigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKKworLy8gVGVzdHMgdGhhdCBBbnlPZihtMSwgLi4uLCBtbikgZGVzY3JpYmVzIGl0c2VsZiBwcm9wZXJseS4KK1RFU1QoQW55T2ZUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxpbnQ+IG07CisgIG0gPSBBbnlPZihMZSgxKSwgR2UoMykpOworICBFWFBFQ1RfRVEoIihpcyA8PSAxKSBvciAoaXMgPj0gMykiLAorICAgICAgICAgICAgRGVzY3JpYmUobSkpOworCisgIG0gPSBBbnlPZihMdCgwKSwgRXEoMSksIEVxKDIpKTsKKyAgRVhQRUNUX0VRKCIoaXMgPCAwKSBvciAiCisgICAgICAgICAgICAiKChpcyBlcXVhbCB0byAxKSBvciAoaXMgZXF1YWwgdG8gMikpIiwKKyAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKKworICBtID0gQW55T2YoTHQoMCksIEVxKDEpLCBFcSgyKSwgRXEoMykpOworICBFWFBFQ1RfRVEoIigoaXMgPCAwKSBvciAiCisgICAgICAgICAgICAiKGlzIGVxdWFsIHRvIDEpKSBvciAiCisgICAgICAgICAgICAiKChpcyBlcXVhbCB0byAyKSBvciAiCisgICAgICAgICAgICAiKGlzIGVxdWFsIHRvIDMpKSIsCisgICAgICAgICAgICBEZXNjcmliZShtKSk7CisKKyAgbSA9IEFueU9mKExlKDApLCBHdCgxMCksIDMsIDUsIDcpOworICBFWFBFQ1RfRVEoIigoaXMgPD0gMCkgb3IgIgorICAgICAgICAgICAgIihpcyA+IDEwKSkgb3IgIgorICAgICAgICAgICAgIigoaXMgZXF1YWwgdG8gMykgb3IgIgorICAgICAgICAgICAgIigoaXMgZXF1YWwgdG8gNSkgb3IgIgorICAgICAgICAgICAgIihpcyBlcXVhbCB0byA3KSkpIiwKKyAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKK30KKworLy8gVGVzdHMgdGhhdCBBbnlPZihtMSwgLi4uLCBtbikgZGVzY3JpYmVzIGl0cyBuZWdhdGlvbiBwcm9wZXJseS4KK1RFU1QoQW55T2ZUZXN0LCBDYW5EZXNjcmliZU5lZ2F0aW9uKSB7CisgIE1hdGNoZXI8aW50PiBtOworICBtID0gQW55T2YoTGUoMSksIEdlKDMpKTsKKyAgRVhQRUNUX0VRKCIoaXNuJ3QgPD0gMSkgYW5kIChpc24ndCA+PSAzKSIsCisgICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKKworICBtID0gQW55T2YoTHQoMCksIEVxKDEpLCBFcSgyKSk7CisgIEVYUEVDVF9FUSgiKGlzbid0IDwgMCkgYW5kICIKKyAgICAgICAgICAgICIoKGlzbid0IGVxdWFsIHRvIDEpIGFuZCAoaXNuJ3QgZXF1YWwgdG8gMikpIiwKKyAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOworCisgIG0gPSBBbnlPZihMdCgwKSwgRXEoMSksIEVxKDIpLCBFcSgzKSk7CisgIEVYUEVDVF9FUSgiKChpc24ndCA8IDApIGFuZCAiCisgICAgICAgICAgICAiKGlzbid0IGVxdWFsIHRvIDEpKSBhbmQgIgorICAgICAgICAgICAgIigoaXNuJ3QgZXF1YWwgdG8gMikgYW5kICIKKyAgICAgICAgICAgICIoaXNuJ3QgZXF1YWwgdG8gMykpIiwKKyAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOworCisgIG0gPSBBbnlPZihMZSgwKSwgR3QoMTApLCAzLCA1LCA3KTsKKyAgRVhQRUNUX0VRKCIoKGlzbid0IDw9IDApIGFuZCAiCisgICAgICAgICAgICAiKGlzbid0ID4gMTApKSBhbmQgIgorICAgICAgICAgICAgIigoaXNuJ3QgZXF1YWwgdG8gMykgYW5kICIKKyAgICAgICAgICAgICIoKGlzbid0IGVxdWFsIHRvIDUpIGFuZCAiCisgICAgICAgICAgICAiKGlzbid0IGVxdWFsIHRvIDcpKSkiLAorICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgbW9ub21vcnBoaWMgbWF0Y2hlcnMgYXJlIHNhZmVseSBjYXN0IGJ5IHRoZSBBbnlPZiBtYXRjaGVyLgorVEVTVChBbnlPZlRlc3QsIEFueU9mTWF0Y2hlclNhZmVseUNhc3RzTW9ub21vcnBoaWNNYXRjaGVycykgeworICAvLyBncmVhdGVyX3RoYW5fNSBhbmQgbGVzc190aGFuXzEwIGFyZSBtb25vbW9ycGhpYyBtYXRjaGVycy4KKyAgTWF0Y2hlcjxpbnQ+IGdyZWF0ZXJfdGhhbl81ID0gR3QoNSk7CisgIE1hdGNoZXI8aW50PiBsZXNzX3RoYW5fMTAgPSBMdCgxMCk7CisKKyAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtID0gQW55T2YoZ3JlYXRlcl90aGFuXzUsIGxlc3NfdGhhbl8xMCk7CisgIE1hdGNoZXI8aW50Jj4gbTIgPSBBbnlPZihncmVhdGVyX3RoYW5fNSwgbGVzc190aGFuXzEwKTsKKyAgTWF0Y2hlcjxpbnQmPiBtMyA9IEFueU9mKGdyZWF0ZXJfdGhhbl81LCBtMik7CisKKyAgLy8gVGVzdHMgdGhhdCBFaXRoZXJPZiB3b3JrcyB3aGVuIGNvbXBvc2luZyBpdHNlbGYuCisgIE1hdGNoZXI8Y29uc3QgaW50Jj4gbTQgPSBBbnlPZihncmVhdGVyX3RoYW5fNSwgbGVzc190aGFuXzEwLCBsZXNzX3RoYW5fMTApOworICBNYXRjaGVyPGludCY+IG01ID0gQW55T2YoZ3JlYXRlcl90aGFuXzUsIGxlc3NfdGhhbl8xMCwgbGVzc190aGFuXzEwKTsKK30KKworVEVTVChBbnlPZlRlc3QsIEV4cGxhaW5zUmVzdWx0KSB7CisgIE1hdGNoZXI8aW50PiBtOworCisgIC8vIEZhaWxlZCBtYXRjaC4gIEJvdGggbWF0Y2hlcnMgbmVlZCB0byBleHBsYWluLiAgVGhlIHNlY29uZAorICAvLyBtYXRjaGVyIGRvZXNuJ3QgZ2l2ZSBhbiBleHBsYW5hdGlvbiwgc28gb25seSB0aGUgZmlyc3QgbWF0Y2hlcidzCisgIC8vIGV4cGxhbmF0aW9uIGlzIHByaW50ZWQuCisgIG0gPSBBbnlPZihHcmVhdGVyVGhhbigxMCksIEx0KDApKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyA1IGxlc3MgdGhhbiAxMCIsIEV4cGxhaW4obSwgNSkpOworCisgIC8vIEZhaWxlZCBtYXRjaC4gIEJvdGggbWF0Y2hlcnMgbmVlZCB0byBleHBsYWluLgorICBtID0gQW55T2YoR3JlYXRlclRoYW4oMTApLCBHcmVhdGVyVGhhbigyMCkpOworICBFWFBFQ1RfRVEoIndoaWNoIGlzIDUgbGVzcyB0aGFuIDEwLCBhbmQgd2hpY2ggaXMgMTUgbGVzcyB0aGFuIDIwIiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgNSkpOworCisgIC8vIEZhaWxlZCBtYXRjaC4gIEFsbCBtYXRjaGVycyBuZWVkIHRvIGV4cGxhaW4uICBUaGUgc2Vjb25kCisgIC8vIG1hdGNoZXIgZG9lc24ndCBnaXZlbiBhbiBleHBsYW5hdGlvbi4KKyAgbSA9IEFueU9mKEdyZWF0ZXJUaGFuKDEwKSwgR3QoMjApLCBHcmVhdGVyVGhhbigzMCkpOworICBFWFBFQ1RfRVEoIndoaWNoIGlzIDUgbGVzcyB0aGFuIDEwLCBhbmQgd2hpY2ggaXMgMjUgbGVzcyB0aGFuIDMwIiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgNSkpOworCisgIC8vIEZhaWxlZCBtYXRjaC4gIEFsbCBtYXRjaGVycyBuZWVkIHRvIGV4cGxhaW4uCisgIG0gPSBBbnlPZihHcmVhdGVyVGhhbigxMCksIEdyZWF0ZXJUaGFuKDIwKSwgR3JlYXRlclRoYW4oMzApKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyA1IGxlc3MgdGhhbiAxMCwgYW5kIHdoaWNoIGlzIDE1IGxlc3MgdGhhbiAyMCwgIgorICAgICAgICAgICAgImFuZCB3aGljaCBpcyAyNSBsZXNzIHRoYW4gMzAiLAorICAgICAgICAgICAgRXhwbGFpbihtLCA1KSk7CisKKyAgLy8gU3VjY2Vzc2Z1bCBtYXRjaC4gIFRoZSBmaXJzdCBtYXRjaGVyLCB3aGljaCBzdWNjZWVkZWQsIG5lZWRzIHRvCisgIC8vIGV4cGxhaW4uCisgIG0gPSBBbnlPZihHcmVhdGVyVGhhbigxMCksIEdyZWF0ZXJUaGFuKDIwKSk7CisgIEVYUEVDVF9FUSgid2hpY2ggaXMgNSBtb3JlIHRoYW4gMTAiLCBFeHBsYWluKG0sIDE1KSk7CisKKyAgLy8gU3VjY2Vzc2Z1bCBtYXRjaC4gIFRoZSBzZWNvbmQgbWF0Y2hlciwgd2hpY2ggc3VjY2VlZGVkLCBuZWVkcyB0bworICAvLyBleHBsYWluLiAgU2luY2UgaXQgZG9lc24ndCBnaXZlbiBhbiBleHBsYW5hdGlvbiwgbm90aGluZyBpcworICAvLyBwcmludGVkLgorICBtID0gQW55T2YoR3JlYXRlclRoYW4oMTApLCBMdCgzMCkpOworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgMCkpOworCisgIC8vIFN1Y2Nlc3NmdWwgbWF0Y2guICBUaGUgc2Vjb25kIG1hdGNoZXIsIHdoaWNoIHN1Y2NlZWRlZCwgbmVlZHMgdG8KKyAgLy8gZXhwbGFpbi4KKyAgbSA9IEFueU9mKEdyZWF0ZXJUaGFuKDMwKSwgR3JlYXRlclRoYW4oMjApKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyA1IG1vcmUgdGhhbiAyMCIsIEV4cGxhaW4obSwgMjUpKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyBwcmVkaWNhdGUgZnVuY3Rpb24gYW5kIHByZWRpY2F0ZSBmdW5jdG9yIGFyZSBmb3IKKy8vIHRlc3RpbmcgdGhlIFRydWx5KHByZWRpY2F0ZSkgbWF0Y2hlci4KKworLy8gUmV0dXJucyBub24temVybyBpZiB0aGUgaW5wdXQgaXMgcG9zaXRpdmUuICBOb3RlIHRoYXQgdGhlIHJldHVybgorLy8gdHlwZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBib29sLiAgSXQncyBPSyBhcyBUcnVseSgpIGFjY2VwdHMgYW55CisvLyB1bmFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHdob3NlIHJldHVybiB0eXBlIGNhbiBiZSBpbXBsaWNpdGx5CisvLyBjb252ZXJ0ZWQgdG8gYm9vbC4KK2ludCBJc1Bvc2l0aXZlKGRvdWJsZSB4KSB7CisgIHJldHVybiB4ID4gMCA/IDEgOiAwOworfQorCisvLyBUaGlzIGZ1bmN0b3IgcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuCisvLyBudW1iZXIuCitjbGFzcyBJc0dyZWF0ZXJUaGFuIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IElzR3JlYXRlclRoYW4oaW50IHRocmVzaG9sZCkgOiB0aHJlc2hvbGRfKHRocmVzaG9sZCkge30KKworICBib29sIG9wZXJhdG9yKCkoaW50IG4pIGNvbnN0IHsgcmV0dXJuIG4gPiB0aHJlc2hvbGRfOyB9CisKKyBwcml2YXRlOgorICBpbnQgdGhyZXNob2xkXzsKK307CisKKy8vIEZvciB0ZXN0aW5nIFRydWx5KCkuCitjb25zdCBpbnQgZm9vID0gMDsKKworLy8gVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmZiB0aGUgYXJndW1lbnQgcmVmZXJlbmNlcyBmb28gYW5kIGhhcworLy8gYSB6ZXJvIHZhbHVlLgorYm9vbCBSZWZlcmVuY2VzRm9vQW5kSXNaZXJvKGNvbnN0IGludCYgbikgeworICByZXR1cm4gKCZuID09ICZmb28pICYmIChuID09IDApOworfQorCisvLyBUZXN0cyB0aGF0IFRydWx5KHByZWRpY2F0ZSkgbWF0Y2hlcyB3aGF0IHNhdGlzZmllcyB0aGUgZ2l2ZW4KKy8vIHByZWRpY2F0ZS4KK1RFU1QoVHJ1bHlUZXN0LCBNYXRjaGVzV2hhdFNhdGlzZmllc1RoZVByZWRpY2F0ZSkgeworICBNYXRjaGVyPGRvdWJsZT4gbSA9IFRydWx5KElzUG9zaXRpdmUpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMi4wKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoLTEuNSkpOworfQorCisvLyBUZXN0cyB0aGF0IFRydWx5KHByZWRpY2F0ZV9mdW5jdG9yKSB3b3JrcyB0b28uCitURVNUKFRydWx5VGVzdCwgQ2FuQmVVc2VkV2l0aEZ1bmN0b3IpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0gPSBUcnVseShJc0dyZWF0ZXJUaGFuKDUpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKDYpKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyg0KSk7Cit9CisKKy8vIEEgY2xhc3MgdGhhdCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYm9vbC4KK2NsYXNzIENvbnZlcnRpYmxlVG9Cb29sIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENvbnZlcnRpYmxlVG9Cb29sKGludCBudW1iZXIpIDogbnVtYmVyXyhudW1iZXIpIHt9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBudW1iZXJfICE9IDA7IH0KKworIHByaXZhdGU6CisgIGludCBudW1iZXJfOworfTsKKworQ29udmVydGlibGVUb0Jvb2wgSXNOb3RaZXJvKGludCBudW1iZXIpIHsKKyAgcmV0dXJuIENvbnZlcnRpYmxlVG9Cb29sKG51bWJlcik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIHByZWRpY2F0ZSB1c2VkIGluIFRydWx5KCkgbWF5IHJldHVybiBhIGNsYXNzIHRoYXQncworLy8gaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBib29sLCBldmVuIHdoZW4gdGhlIGNsYXNzIGhhcyBubworLy8gb3BlcmF0b3IhKCkuCitURVNUKFRydWx5VGVzdCwgUHJlZGljYXRlQ2FuUmV0dXJuQUNsYXNzQ29udmVydGlibGVUb0Jvb2wpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0gPSBUcnVseShJc05vdFplcm8pOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDApKTsKK30KKworLy8gVGVzdHMgdGhhdCBUcnVseShwcmVkaWNhdGUpIGNhbiBkZXNjcmliZSBpdHNlbGYgcHJvcGVybHkuCitURVNUKFRydWx5VGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8ZG91YmxlPiBtID0gVHJ1bHkoSXNQb3NpdGl2ZSk7CisgIEVYUEVDVF9FUSgic2F0aXNmaWVzIHRoZSBnaXZlbiBwcmVkaWNhdGUiLAorICAgICAgICAgICAgRGVzY3JpYmUobSkpOworfQorCisvLyBUZXN0cyB0aGF0IFRydWx5KHByZWRpY2F0ZSkgd29ya3Mgd2hlbiB0aGUgbWF0Y2hlciB0YWtlcyBpdHMKKy8vIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZS4KK1RFU1QoVHJ1bHlUZXN0LCBXb3Jrc0ZvckJ5UmVmQXJndW1lbnRzKSB7CisgIE1hdGNoZXI8Y29uc3QgaW50Jj4gbSA9IFRydWx5KFJlZmVyZW5jZXNGb29BbmRJc1plcm8pOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoZm9vKSk7CisgIGludCBuID0gMDsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhuKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTWF0Y2hlcyhtKSBpcyBhIHByZWRpY2F0ZSBzYXRpc2ZpZWQgYnkgd2hhdGV2ZXIgdGhhdAorLy8gbWF0Y2hlcyBtYXRjaGVyIG0uCitURVNUKE1hdGNoZXNUZXN0LCBJc1NhdGlzZmllZEJ5V2hhdE1hdGNoZXNUaGVNYXRjaGVyKSB7CisgIEVYUEVDVF9UUlVFKE1hdGNoZXMoR2UoMCkpKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoZXMoRXEoJ2EnKSkoJ2InKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgTWF0Y2hlcyhtKSB3b3JrcyB3aGVuIHRoZSBtYXRjaGVyIHRha2VzIGl0cyBhcmd1bWVudCBieQorLy8gcmVmZXJlbmNlLgorVEVTVChNYXRjaGVzVGVzdCwgV29ya3NPbkJ5UmVmQXJndW1lbnRzKSB7CisgIGludCBtID0gMCwgbiA9IDA7CisgIEVYUEVDVF9UUlVFKE1hdGNoZXMoQWxsT2YoUmVmKG4pLCBFcSgwKSkpKG4pKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoZXMoUmVmKG0pKShuKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBNYXRjaGVyIG9uIG5vbi1yZWZlcmVuY2UgdHlwZSBjYW4gYmUgdXNlZCBpbgorLy8gTWF0Y2hlcygpLgorVEVTVChNYXRjaGVzVGVzdCwgV29ya3NXaXRoTWF0Y2hlck9uTm9uUmVmVHlwZSkgeworICBNYXRjaGVyPGludD4gZXE1ID0gRXEoNSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoZXMoZXE1KSg1KSk7CisgIEVYUEVDVF9GQUxTRShNYXRjaGVzKGVxNSkoMikpOworfQorCisvLyBUZXN0cyBWYWx1ZSh2YWx1ZSwgbWF0Y2hlcikuICBTaW5jZSBWYWx1ZSgpIGlzIGEgc2ltcGxlIHdyYXBwZXIgZm9yCisvLyBNYXRjaGVzKCksIHdoaWNoIGhhcyBiZWVuIHRlc3RlZCBhbHJlYWR5LCB3ZSBkb24ndCBzcGVuZCBhIGxvdCBvZgorLy8gZWZmb3J0IG9uIHRlc3RpbmcgVmFsdWUoKS4KK1RFU1QoVmFsdWVUZXN0LCBXb3Jrc1dpdGhQb2x5bW9ycGhpY01hdGNoZXIpIHsKKyAgRVhQRUNUX1RSVUUoVmFsdWUoImhpIiwgU3RhcnRzV2l0aCgiaCIpKSk7CisgIEVYUEVDVF9GQUxTRShWYWx1ZSg1LCBHdCgxMCkpKTsKK30KKworVEVTVChWYWx1ZVRlc3QsIFdvcmtzV2l0aE1vbm9tb3JwaGljTWF0Y2hlcikgeworICBjb25zdCBNYXRjaGVyPGludD4gaXNfemVybyA9IEVxKDApOworICBFWFBFQ1RfVFJVRShWYWx1ZSgwLCBpc196ZXJvKSk7CisgIEVYUEVDVF9GQUxTRShWYWx1ZSgnYScsIGlzX3plcm8pKTsKKworICBpbnQgbiA9IDA7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgaW50Jj4gcmVmX24gPSBSZWYobik7CisgIEVYUEVDVF9UUlVFKFZhbHVlKG4sIHJlZl9uKSk7CisgIEVYUEVDVF9GQUxTRShWYWx1ZSgxLCByZWZfbikpOworfQorCitURVNUKEV4cGxhaW5NYXRjaFJlc3VsdFRlc3QsIFdvcmtzV2l0aFBvbHltb3JwaGljTWF0Y2hlcikgeworICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMTsKKyAgRVhQRUNUX1RSVUUoRXhwbGFpbk1hdGNoUmVzdWx0KFBvbHltb3JwaGljSXNFdmVuKCksIDQyLCAmbGlzdGVuZXIxKSk7CisgIEVYUEVDVF9FUSgiJSAyID09IDAiLCBsaXN0ZW5lcjEuc3RyKCkpOworCisgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIyOworICBFWFBFQ1RfRkFMU0UoRXhwbGFpbk1hdGNoUmVzdWx0KEdlKDQyKSwgMS41LCAmbGlzdGVuZXIyKSk7CisgIEVYUEVDVF9FUSgiIiwgbGlzdGVuZXIyLnN0cigpKTsKK30KKworVEVTVChFeHBsYWluTWF0Y2hSZXN1bHRUZXN0LCBXb3Jrc1dpdGhNb25vbW9ycGhpY01hdGNoZXIpIHsKKyAgY29uc3QgTWF0Y2hlcjxpbnQ+IGlzX2V2ZW4gPSBQb2x5bW9ycGhpY0lzRXZlbigpOworICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMTsKKyAgRVhQRUNUX1RSVUUoRXhwbGFpbk1hdGNoUmVzdWx0KGlzX2V2ZW4sIDQyLCAmbGlzdGVuZXIxKSk7CisgIEVYUEVDVF9FUSgiJSAyID09IDAiLCBsaXN0ZW5lcjEuc3RyKCkpOworCisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgZG91YmxlJj4gaXNfemVybyA9IEVxKDApOworICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMjsKKyAgRVhQRUNUX0ZBTFNFKEV4cGxhaW5NYXRjaFJlc3VsdChpc196ZXJvLCAxLjUsICZsaXN0ZW5lcjIpKTsKKyAgRVhQRUNUX0VRKCIiLCBsaXN0ZW5lcjIuc3RyKCkpOworfQorCitNQVRDSEVSX1AoUmVhbGx5LCBpbm5lcl9tYXRjaGVyLCAiIikgeworICByZXR1cm4gRXhwbGFpbk1hdGNoUmVzdWx0KGlubmVyX21hdGNoZXIsIGFyZywgcmVzdWx0X2xpc3RlbmVyKTsKK30KKworVEVTVChFeHBsYWluTWF0Y2hSZXN1bHRUZXN0LCBXb3Jrc0luc2lkZU1BVENIRVIpIHsKKyAgRVhQRUNUX1RIQVQoMCwgUmVhbGx5KEVxKDApKSk7Cit9CisKK1RFU1QoQWxsQXJnc1Rlc3QsIFdvcmtzRm9yVHVwbGUpIHsKKyAgRVhQRUNUX1RIQVQobWFrZV90dXBsZSgxLCAyTCksIEFsbEFyZ3MoTHQoKSkpOworICBFWFBFQ1RfVEhBVChtYWtlX3R1cGxlKDJMLCAxKSwgTm90KEFsbEFyZ3MoTHQoKSkpKTsKK30KKworVEVTVChBbGxBcmdzVGVzdCwgV29ya3NGb3JOb25UdXBsZSkgeworICBFWFBFQ1RfVEhBVCg0MiwgQWxsQXJncyhHdCgwKSkpOworICBFWFBFQ1RfVEhBVCgnYScsIE5vdChBbGxBcmdzKEVxKCdiJykpKSk7Cit9CisKK2NsYXNzIEFsbEFyZ3NIZWxwZXIgeworIHB1YmxpYzoKKyAgQWxsQXJnc0hlbHBlcigpIHt9CisKKyAgTU9DS19NRVRIT0QyKEhlbHBlciwgaW50KGNoYXIgeCwgaW50IHkpKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQWxsQXJnc0hlbHBlcik7Cit9OworCitURVNUKEFsbEFyZ3NUZXN0LCBXb3Jrc0luV2l0aENsYXVzZSkgeworICBBbGxBcmdzSGVscGVyIGhlbHBlcjsKKyAgT05fQ0FMTChoZWxwZXIsIEhlbHBlcihfLCBfKSkKKyAgICAgIC5XaXRoKEFsbEFyZ3MoTHQoKSkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICBFWFBFQ1RfQ0FMTChoZWxwZXIsIEhlbHBlcihfLCBfKSk7CisgIEVYUEVDVF9DQUxMKGhlbHBlciwgSGVscGVyKF8sIF8pKQorICAgICAgLldpdGgoQWxsQXJncyhHdCgpKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOworCisgIEVYUEVDVF9FUSgxLCBoZWxwZXIuSGVscGVyKCdcMScsIDIpKTsKKyAgRVhQRUNUX0VRKDIsIGhlbHBlci5IZWxwZXIoJ2EnLCAxKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKSB3b3JrIHdoZW4gdGhlIHZhbHVlCisvLyBtYXRjaGVzIHRoZSBtYXRjaGVyLgorVEVTVChNYXRjaGVyQXNzZXJ0aW9uVGVzdCwgV29ya3NXaGVuTWF0Y2hlcklzU2F0aXNmaWVkKSB7CisgIEFTU0VSVF9USEFUKDUsIEdlKDIpKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBBU1NFUlRfVEhBVCgiRm9vIiwgRW5kc1dpdGgoIm9vIikpOworICBFWFBFQ1RfVEhBVCgyLCBBbGxPZihMZSg3KSwgR2UoMCkpKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZCB0b28uIjsKKyAgRVhQRUNUX1RIQVQoIkhlbGxvIiwgU3RhcnRzV2l0aCgiSGVsbCIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfVEhBVCgpIGFuZCBFWFBFQ1RfVEhBVCgpIHdvcmsgd2hlbiB0aGUgdmFsdWUKKy8vIGRvZXNuJ3QgbWF0Y2ggdGhlIG1hdGNoZXIuCitURVNUKE1hdGNoZXJBc3NlcnRpb25UZXN0LCBXb3Jrc1doZW5NYXRjaGVySXNOb3RTYXRpc2ZpZWQpIHsKKyAgLy8gJ24nIG11c3QgYmUgc3RhdGljIGFzIGl0IGlzIHVzZWQgaW4gYW4gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSwKKyAgLy8gd2hpY2ggY2Fubm90IHJlZmVyZW5jZSBhdXRvIHZhcmlhYmxlcy4KKyAgc3RhdGljIHVuc2lnbmVkIHNob3J0IG47ICAvLyBOT0xJTlQKKyAgbiA9IDU7CisKKyAgLy8gVkMrKyBwcmlvciB0byB2ZXJzaW9uIDguMCBTUDEgaGFzIGEgYnVnIHdoZXJlIGl0IHdpbGwgbm90IHNlZSBhbnkKKyAgLy8gZnVuY3Rpb25zIGRlY2xhcmVkIGluIHRoZSBuYW1lc3BhY2Ugc2NvcGUgZnJvbSB3aXRoaW4gbmVzdGVkIGNsYXNzZXMuCisgIC8vIEVYUEVDVC9BU1NFUlRfKE5PTilGQVRBTF9GQUlMVVJFIG1hY3JvcyB1c2UgbmVzdGVkIGNsYXNzZXMgc28gdGhhdCBhbGwKKyAgLy8gbmFtZXNwYWNlLWxldmVsIGZ1bmN0aW9ucyBpbnZva2VkIGluc2lkZSB0aGVtIG5lZWQgdG8gYmUgZXhwbGljaXRseQorICAvLyByZXNvbHZlZC4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RIQVQobiwgOjp0ZXN0aW5nOjpHdCgxMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBpcyA+IDEwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogNSIgKyBPZlR5cGUoInVuc2lnbmVkIHNob3J0IikpOworICBuID0gMDsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfVEhBVChuLCA6OnRlc3Rpbmc6OkFsbE9mKDo6dGVzdGluZzo6TGUoNyksIDo6dGVzdGluZzo6R2UoNSkpKSwKKyAgICAgICJWYWx1ZSBvZjogblxuIgorICAgICAgIkV4cGVjdGVkOiAoaXMgPD0gNykgYW5kIChpcyA+PSA1KVxuIgorICAgICAgIiAgQWN0dWFsOiAwIiArIE9mVHlwZSgidW5zaWduZWQgc2hvcnQiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKSB3b3JrIHdoZW4gdGhlIGFyZ3VtZW50CisvLyBoYXMgYSByZWZlcmVuY2UgdHlwZS4KK1RFU1QoTWF0Y2hlckFzc2VydGlvblRlc3QsIFdvcmtzRm9yQnlSZWZBcmd1bWVudHMpIHsKKyAgLy8gV2UgdXNlIGEgc3RhdGljIHZhcmlhYmxlIGhlcmUgYXMgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBjYW5ub3QKKyAgLy8gcmVmZXJlbmNlIGF1dG8gdmFyaWFibGVzLgorICBzdGF0aWMgaW50IG47CisgIG4gPSAwOworICBFWFBFQ1RfVEhBVChuLCBBbGxPZihMZSg3KSwgUmVmKG4pKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9USEFUKG4sIDo6dGVzdGluZzo6Tm90KDo6dGVzdGluZzo6UmVmKG4pKSksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogblxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGRvZXMgbm90IHJlZmVyZW5jZSB0aGUgdmFyaWFibGUgQCIpOworICAvLyBUZXN0cyB0aGUgIkFjdHVhbCIgcGFydC4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1RIQVQobiwgOjp0ZXN0aW5nOjpOb3QoOjp0ZXN0aW5nOjpSZWYobikpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFjdHVhbDogMCIgKyBPZlR5cGUoImludCIpICsgIiwgd2hpY2ggaXMgbG9jYXRlZCBAIik7Cit9CisKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorLy8gVGVzdHMgdGhhdCBBU1NFUlRfVEhBVCgpIGFuZCBFWFBFQ1RfVEhBVCgpIHdvcmsgd2hlbiB0aGUgbWF0Y2hlciBpcworLy8gbW9ub21vcnBoaWMuCisKKy8vIEFTU0VSVF9USEFUKCJoZWxsbyIsIHN0YXJ0c193aXRoX2hlKSBmYWlscyB0byBjb21waWxlIHdpdGggTm9raWEncworLy8gU3ltYmlhbiBjb21waWxlcjogaXQgdHJpZXMgdG8gY29tcGlsZQorLy8gdGVtcGxhdGU8VCwgVT4gY2xhc3MgTWF0Y2hlckNhc3RJbXBsIHsgLi4uCisvLyAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCAuLi4pIGNvbnN0IHsKKy8vICAgICByZXR1cm4gc291cmNlX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzdGF0aWNfY2FzdDxVPih4KSwgLi4uKTsKKy8vIHdpdGggVSA9PSBzdHJpbmcgYW5kIFQgPT0gY29uc3QgY2hhcioKKy8vIFdpdGggQVNTRVJUX1RIQVQoImhlbGxvIi4uLikgY2hhbmdlZCB0byBBU1NFUlRfVEhBVChzdHJpbmcoImhlbGxvIikgLi4uICkKKy8vIHRoZSBjb21waWxlciBzaWxlbnRseSBjcmFzaGVzIHdpdGggbm8gb3V0cHV0LgorLy8gSWYgTWF0Y2hlckNhc3RJbXBsIGlzIGNoYW5nZWQgdG8gdXNlIFUoeCkgaW5zdGVhZCBvZiBzdGF0aWNfY2FzdDxVPih4KQorLy8gdGhlIGNvZGUgY29tcGlsZXMgYnV0IHRoZSBjb252ZXJ0ZWQgc3RyaW5nIGlzIGJvZ3VzLgorVEVTVChNYXRjaGVyQXNzZXJ0aW9uVGVzdCwgV29ya3NGb3JNb25vbW9ycGhpY01hdGNoZXIpIHsKKyAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gc3RhcnRzX3dpdGhfaGUgPSBTdGFydHNXaXRoKCJoZSIpOworICBBU1NFUlRfVEhBVCgiaGVsbG8iLCBzdGFydHNfd2l0aF9oZSk7CisKKyAgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBlbmRzX3dpdGhfb2sgPSBFbmRzV2l0aCgib2siKTsKKyAgQVNTRVJUX1RIQVQoImJvb2siLCBlbmRzX3dpdGhfb2spOworICBjb25zdCBzdHJpbmcgYmFkID0gImJhZCI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USEFUKGJhZCwgZW5kc193aXRoX29rKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBiYWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBlbmRzIHdpdGggXCJva1wiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogXCJiYWRcIiIpOworICBNYXRjaGVyPGludD4gaXNfZ3JlYXRlcl90aGFuXzUgPSBHdCg1KTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIQVQoNSwgaXNfZ3JlYXRlcl90aGFuXzUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBpcyA+IDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiA1IiArIE9mVHlwZSgiaW50IikpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorCisvLyBUZXN0cyBmbG9hdGluZy1wb2ludCBtYXRjaGVycy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorY2xhc3MgRmxvYXRpbmdQb2ludFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB0eXBlZGVmIHRlc3Rpbmc6OmludGVybmFsOjpGbG9hdGluZ1BvaW50PFJhd1R5cGU+IEZsb2F0aW5nOworICB0eXBlZGVmIHR5cGVuYW1lIEZsb2F0aW5nOjpCaXRzIEJpdHM7CisKKyAgRmxvYXRpbmdQb2ludFRlc3QoKQorICAgICAgOiBtYXhfdWxwc18oRmxvYXRpbmc6OmtNYXhVbHBzKSwKKyAgICAgICAgemVyb19iaXRzXyhGbG9hdGluZygwKS5iaXRzKCkpLAorICAgICAgICBvbmVfYml0c18oRmxvYXRpbmcoMSkuYml0cygpKSwKKyAgICAgICAgaW5maW5pdHlfYml0c18oRmxvYXRpbmcoRmxvYXRpbmc6OkluZmluaXR5KCkpLmJpdHMoKSksCisgICAgICAgIGNsb3NlX3RvX3Bvc2l0aXZlX3plcm9fKAorICAgICAgICAgICAgRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyh6ZXJvX2JpdHNfICsgbWF4X3VscHNfLzIpKSwKKyAgICAgICAgY2xvc2VfdG9fbmVnYXRpdmVfemVyb18oCisgICAgICAgICAgICAtRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cyh6ZXJvX2JpdHNfICsgbWF4X3VscHNfIC0gbWF4X3VscHNfLzIpKSwKKyAgICAgICAgZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm9fKC1GbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICAgICAgemVyb19iaXRzXyArIG1heF91bHBzXyArIDEgLSBtYXhfdWxwc18vMikpLAorICAgICAgICBjbG9zZV90b19vbmVfKEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMob25lX2JpdHNfICsgbWF4X3VscHNfKSksCisgICAgICAgIGZ1cnRoZXJfZnJvbV9vbmVfKEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMob25lX2JpdHNfICsgbWF4X3VscHNfICsgMSkpLAorICAgICAgICBpbmZpbml0eV8oRmxvYXRpbmc6OkluZmluaXR5KCkpLAorICAgICAgICBjbG9zZV90b19pbmZpbml0eV8oCisgICAgICAgICAgICBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKGluZmluaXR5X2JpdHNfIC0gbWF4X3VscHNfKSksCisgICAgICAgIGZ1cnRoZXJfZnJvbV9pbmZpbml0eV8oCisgICAgICAgICAgICBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKGluZmluaXR5X2JpdHNfIC0gbWF4X3VscHNfIC0gMSkpLAorICAgICAgICBtYXhfKEZsb2F0aW5nOjpNYXgoKSksCisgICAgICAgIG5hbjFfKEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoRmxvYXRpbmc6OmtFeHBvbmVudEJpdE1hc2sgfCAxKSksCisgICAgICAgIG5hbjJfKEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoRmxvYXRpbmc6OmtFeHBvbmVudEJpdE1hc2sgfCAyMDApKSB7CisgIH0KKworICB2b2lkIFRlc3RTaXplKCkgeworICAgIEVYUEVDVF9FUShzaXplb2YoUmF3VHlwZSksIHNpemVvZihCaXRzKSk7CisgIH0KKworICAvLyBBIGJhdHRlcnkgb2YgdGVzdHMgZm9yIEZsb2F0aW5nRXFNYXRjaGVyOjpNYXRjaGVzLgorICAvLyBtYXRjaGVyX21ha2VyIGlzIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBGbG9hdGluZ0VxTWF0Y2hlci4KKyAgdm9pZCBUZXN0TWF0Y2hlcygKKyAgICAgIHRlc3Rpbmc6OmludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxSYXdUeXBlPiAoKm1hdGNoZXJfbWFrZXIpKFJhd1R5cGUpKSB7CisgICAgTWF0Y2hlcjxSYXdUeXBlPiBtMSA9IG1hdGNoZXJfbWFrZXIoMC4wKTsKKyAgICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKC0wLjApKTsKKyAgICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKGNsb3NlX3RvX3Bvc2l0aXZlX3plcm9fKSk7CisgICAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcyhjbG9zZV90b19uZWdhdGl2ZV96ZXJvXykpOworICAgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKDEuMCkpOworCisgICAgTWF0Y2hlcjxSYXdUeXBlPiBtMiA9IG1hdGNoZXJfbWFrZXIoY2xvc2VfdG9fcG9zaXRpdmVfemVyb18pOworICAgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKGZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvXykpOworCisgICAgTWF0Y2hlcjxSYXdUeXBlPiBtMyA9IG1hdGNoZXJfbWFrZXIoMS4wKTsKKyAgICBFWFBFQ1RfVFJVRShtMy5NYXRjaGVzKGNsb3NlX3RvX29uZV8pKTsKKyAgICBFWFBFQ1RfRkFMU0UobTMuTWF0Y2hlcyhmdXJ0aGVyX2Zyb21fb25lXykpOworCisgICAgLy8gVGVzdCBjb21tdXRhdGl2aXR5OiBtYXRjaGVyX21ha2VyKDAuMCkuTWF0Y2hlcygxLjApIHdhcyB0ZXN0ZWQgYWJvdmUuCisgICAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoMC4wKSk7CisKKyAgICBNYXRjaGVyPFJhd1R5cGU+IG00ID0gbWF0Y2hlcl9tYWtlcigtaW5maW5pdHlfKTsKKyAgICBFWFBFQ1RfVFJVRShtNC5NYXRjaGVzKC1jbG9zZV90b19pbmZpbml0eV8pKTsKKworICAgIE1hdGNoZXI8UmF3VHlwZT4gbTUgPSBtYXRjaGVyX21ha2VyKGluZmluaXR5Xyk7CisgICAgRVhQRUNUX1RSVUUobTUuTWF0Y2hlcyhjbG9zZV90b19pbmZpbml0eV8pKTsKKworICAgIC8vIFRoaXMgaXMgaW50ZXJlc3RpbmcgYXMgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiBpbmZpbml0eV8gYW5kIG5hbjFfCisgICAgLy8gYXJlIG9ubHkgMSBETFAgYXBhcnQuCisgICAgRVhQRUNUX0ZBTFNFKG01Lk1hdGNoZXMobmFuMV8pKTsKKworICAgIC8vIG1hdGNoZXJfbWFrZXIgY2FuIHByb2R1Y2UgYSBNYXRjaGVyPGNvbnN0IFJhd1R5cGUmPiwgd2hpY2ggaXMgbmVlZGVkIGluCisgICAgLy8gc29tZSBjYXNlcy4KKyAgICBNYXRjaGVyPGNvbnN0IFJhd1R5cGUmPiBtNiA9IG1hdGNoZXJfbWFrZXIoMC4wKTsKKyAgICBFWFBFQ1RfVFJVRShtNi5NYXRjaGVzKC0wLjApKTsKKyAgICBFWFBFQ1RfVFJVRShtNi5NYXRjaGVzKGNsb3NlX3RvX3Bvc2l0aXZlX3plcm9fKSk7CisgICAgRVhQRUNUX0ZBTFNFKG02Lk1hdGNoZXMoMS4wKSk7CisKKyAgICAvLyBtYXRjaGVyX21ha2VyIGNhbiBwcm9kdWNlIGEgTWF0Y2hlcjxSYXdUeXBlJj4sIHdoaWNoIGlzIG5lZWRlZCBpbiBzb21lCisgICAgLy8gY2FzZXMuCisgICAgTWF0Y2hlcjxSYXdUeXBlJj4gbTcgPSBtYXRjaGVyX21ha2VyKDAuMCk7CisgICAgUmF3VHlwZSB4ID0gMC4wOworICAgIEVYUEVDVF9UUlVFKG03Lk1hdGNoZXMoeCkpOworICAgIHggPSAwLjAxZjsKKyAgICBFWFBFQ1RfRkFMU0UobTcuTWF0Y2hlcyh4KSk7CisgIH0KKworICAvLyBQcmUtY2FsY3VsYXRlZCBudW1iZXJzIHRvIGJlIHVzZWQgYnkgdGhlIHRlc3RzLgorCisgIGNvbnN0IHNpemVfdCBtYXhfdWxwc187CisKKyAgY29uc3QgQml0cyB6ZXJvX2JpdHNfOyAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgMC4wLgorICBjb25zdCBCaXRzIG9uZV9iaXRzXzsgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IDEuMC4KKyAgY29uc3QgQml0cyBpbmZpbml0eV9iaXRzXzsgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50ICtpbmZpbml0eS4KKworICAvLyBTb21lIG51bWJlcnMgY2xvc2UgdG8gMC4wLgorICBjb25zdCBSYXdUeXBlIGNsb3NlX3RvX3Bvc2l0aXZlX3plcm9fOworICBjb25zdCBSYXdUeXBlIGNsb3NlX3RvX25lZ2F0aXZlX3plcm9fOworICBjb25zdCBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvXzsKKworICAvLyBTb21lIG51bWJlcnMgY2xvc2UgdG8gMS4wLgorICBjb25zdCBSYXdUeXBlIGNsb3NlX3RvX29uZV87CisgIGNvbnN0IFJhd1R5cGUgZnVydGhlcl9mcm9tX29uZV87CisKKyAgLy8gU29tZSBudW1iZXJzIGNsb3NlIHRvICtpbmZpbml0eS4KKyAgY29uc3QgUmF3VHlwZSBpbmZpbml0eV87CisgIGNvbnN0IFJhd1R5cGUgY2xvc2VfdG9faW5maW5pdHlfOworICBjb25zdCBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9pbmZpbml0eV87CisKKyAgLy8gTWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlIHRoYXQncyBub3QgaW5maW5pdHkuCisgIGNvbnN0IFJhd1R5cGUgbWF4XzsKKworICAvLyBTb21lIE5hTnMuCisgIGNvbnN0IFJhd1R5cGUgbmFuMV87CisgIGNvbnN0IFJhd1R5cGUgbmFuMl87Cit9OworCisvLyBUZXN0cyBmbG9hdGluZy1wb2ludCBtYXRjaGVycyB3aXRoIGZpeGVkIGVwc2lsb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+CitjbGFzcyBGbG9hdGluZ1BvaW50TmVhclRlc3QgOiBwdWJsaWMgRmxvYXRpbmdQb2ludFRlc3Q8UmF3VHlwZT4geworIHByb3RlY3RlZDoKKyAgdHlwZWRlZiBGbG9hdGluZ1BvaW50VGVzdDxSYXdUeXBlPiBQYXJlbnRUeXBlOworCisgIC8vIEEgYmF0dGVyeSBvZiB0ZXN0cyBmb3IgRmxvYXRpbmdFcU1hdGNoZXI6Ok1hdGNoZXMgd2l0aCBhIGZpeGVkIGVwc2lsb24uCisgIC8vIG1hdGNoZXJfbWFrZXIgaXMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIEZsb2F0aW5nRXFNYXRjaGVyLgorICB2b2lkIFRlc3ROZWFyTWF0Y2hlcygKKyAgICAgIHRlc3Rpbmc6OmludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxSYXdUeXBlPgorICAgICAgICAgICgqbWF0Y2hlcl9tYWtlcikoUmF3VHlwZSwgUmF3VHlwZSkpIHsKKyAgICBNYXRjaGVyPFJhd1R5cGU+IG0xID0gbWF0Y2hlcl9tYWtlcigwLjAsIDAuMCk7CisgICAgRVhQRUNUX1RSVUUobTEuTWF0Y2hlcygwLjApKTsKKyAgICBFWFBFQ1RfVFJVRShtMS5NYXRjaGVzKC0wLjApKTsKKyAgICBFWFBFQ1RfRkFMU0UobTEuTWF0Y2hlcyhQYXJlbnRUeXBlOjpjbG9zZV90b19wb3NpdGl2ZV96ZXJvXykpOworICAgIEVYUEVDVF9GQUxTRShtMS5NYXRjaGVzKFBhcmVudFR5cGU6OmNsb3NlX3RvX25lZ2F0aXZlX3plcm9fKSk7CisgICAgRVhQRUNUX0ZBTFNFKG0xLk1hdGNoZXMoMS4wKSk7CisKKyAgICBNYXRjaGVyPFJhd1R5cGU+IG0yID0gbWF0Y2hlcl9tYWtlcigwLjAsIDEuMCk7CisgICAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygwLjApKTsKKyAgICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKC0wLjApKTsKKyAgICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKDEuMCkpOworICAgIEVYUEVDVF9UUlVFKG0yLk1hdGNoZXMoLTEuMCkpOworICAgIEVYUEVDVF9GQUxTRShtMi5NYXRjaGVzKFBhcmVudFR5cGU6OmNsb3NlX3RvX29uZV8pKTsKKyAgICBFWFBFQ1RfRkFMU0UobTIuTWF0Y2hlcygtUGFyZW50VHlwZTo6Y2xvc2VfdG9fb25lXykpOworCisgICAgLy8gQ2hlY2sgdGhhdCBpbmYgbWF0Y2hlcyBpbmYsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9mIHRoZSBzcGVjaWZpZWQgbWF4CisgICAgLy8gYWJzb2x1dGUgZXJyb3IuCisgICAgTWF0Y2hlcjxSYXdUeXBlPiBtMyA9IG1hdGNoZXJfbWFrZXIoUGFyZW50VHlwZTo6aW5maW5pdHlfLCAwLjApOworICAgIEVYUEVDVF9UUlVFKG0zLk1hdGNoZXMoUGFyZW50VHlwZTo6aW5maW5pdHlfKSk7CisgICAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoUGFyZW50VHlwZTo6Y2xvc2VfdG9faW5maW5pdHlfKSk7CisgICAgRVhQRUNUX0ZBTFNFKG0zLk1hdGNoZXMoLVBhcmVudFR5cGU6OmluZmluaXR5XykpOworCisgICAgTWF0Y2hlcjxSYXdUeXBlPiBtNCA9IG1hdGNoZXJfbWFrZXIoLVBhcmVudFR5cGU6OmluZmluaXR5XywgMC4wKTsKKyAgICBFWFBFQ1RfVFJVRShtNC5NYXRjaGVzKC1QYXJlbnRUeXBlOjppbmZpbml0eV8pKTsKKyAgICBFWFBFQ1RfRkFMU0UobTQuTWF0Y2hlcygtUGFyZW50VHlwZTo6Y2xvc2VfdG9faW5maW5pdHlfKSk7CisgICAgRVhQRUNUX0ZBTFNFKG00Lk1hdGNoZXMoUGFyZW50VHlwZTo6aW5maW5pdHlfKSk7CisKKyAgICAvLyBUZXN0IHZhcmlvdXMgb3ZlcmZsb3cgc2NlbmFyaW9zLgorICAgIE1hdGNoZXI8UmF3VHlwZT4gbTUgPSBtYXRjaGVyX21ha2VyKFBhcmVudFR5cGU6Om1heF8sIFBhcmVudFR5cGU6Om1heF8pOworICAgIEVYUEVDVF9UUlVFKG01Lk1hdGNoZXMoUGFyZW50VHlwZTo6bWF4XykpOworICAgIEVYUEVDVF9GQUxTRShtNS5NYXRjaGVzKC1QYXJlbnRUeXBlOjptYXhfKSk7CisKKyAgICBNYXRjaGVyPFJhd1R5cGU+IG02ID0gbWF0Y2hlcl9tYWtlcigtUGFyZW50VHlwZTo6bWF4XywgUGFyZW50VHlwZTo6bWF4Xyk7CisgICAgRVhQRUNUX0ZBTFNFKG02Lk1hdGNoZXMoUGFyZW50VHlwZTo6bWF4XykpOworICAgIEVYUEVDVF9UUlVFKG02Lk1hdGNoZXMoLVBhcmVudFR5cGU6Om1heF8pKTsKKworICAgIE1hdGNoZXI8UmF3VHlwZT4gbTcgPSBtYXRjaGVyX21ha2VyKFBhcmVudFR5cGU6Om1heF8sIDApOworICAgIEVYUEVDVF9UUlVFKG03Lk1hdGNoZXMoUGFyZW50VHlwZTo6bWF4XykpOworICAgIEVYUEVDVF9GQUxTRShtNy5NYXRjaGVzKC1QYXJlbnRUeXBlOjptYXhfKSk7CisKKyAgICBNYXRjaGVyPFJhd1R5cGU+IG04ID0gbWF0Y2hlcl9tYWtlcigtUGFyZW50VHlwZTo6bWF4XywgMCk7CisgICAgRVhQRUNUX0ZBTFNFKG04Lk1hdGNoZXMoUGFyZW50VHlwZTo6bWF4XykpOworICAgIEVYUEVDVF9UUlVFKG04Lk1hdGNoZXMoLVBhcmVudFR5cGU6Om1heF8pKTsKKworICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbWF4KCkgYW5kIC1tYXgoKSBub3JtYWxseSBvdmVyZmxvd3MgdG8gaW5maW5pdHksCisgICAgLy8gYnV0IGl0IHNob3VsZCBzdGlsbCBtYXRjaCBpZiB0aGUgbWF4X2Fic19lcnJvciBpcyBhbHNvIGluZmluaXR5LgorICAgIE1hdGNoZXI8UmF3VHlwZT4gbTkgPSBtYXRjaGVyX21ha2VyKAorICAgICAgICBQYXJlbnRUeXBlOjptYXhfLCBQYXJlbnRUeXBlOjppbmZpbml0eV8pOworICAgIEVYUEVDVF9UUlVFKG04Lk1hdGNoZXMoLVBhcmVudFR5cGU6Om1heF8pKTsKKworICAgIC8vIG1hdGNoZXJfbWFrZXIgY2FuIHByb2R1Y2UgYSBNYXRjaGVyPGNvbnN0IFJhd1R5cGUmPiwgd2hpY2ggaXMgbmVlZGVkIGluCisgICAgLy8gc29tZSBjYXNlcy4KKyAgICBNYXRjaGVyPGNvbnN0IFJhd1R5cGUmPiBtMTAgPSBtYXRjaGVyX21ha2VyKDAuMCwgMS4wKTsKKyAgICBFWFBFQ1RfVFJVRShtMTAuTWF0Y2hlcygtMC4wKSk7CisgICAgRVhQRUNUX1RSVUUobTEwLk1hdGNoZXMoUGFyZW50VHlwZTo6Y2xvc2VfdG9fcG9zaXRpdmVfemVyb18pKTsKKyAgICBFWFBFQ1RfRkFMU0UobTEwLk1hdGNoZXMoUGFyZW50VHlwZTo6Y2xvc2VfdG9fb25lXykpOworCisgICAgLy8gbWF0Y2hlcl9tYWtlciBjYW4gcHJvZHVjZSBhIE1hdGNoZXI8UmF3VHlwZSY+LCB3aGljaCBpcyBuZWVkZWQgaW4gc29tZQorICAgIC8vIGNhc2VzLgorICAgIE1hdGNoZXI8UmF3VHlwZSY+IG0xMSA9IG1hdGNoZXJfbWFrZXIoMC4wLCAxLjApOworICAgIFJhd1R5cGUgeCA9IDAuMDsKKyAgICBFWFBFQ1RfVFJVRShtMTEuTWF0Y2hlcyh4KSk7CisgICAgeCA9IDEuMGY7CisgICAgRVhQRUNUX1RSVUUobTExLk1hdGNoZXMoeCkpOworICAgIHggPSAtMS4wZjsKKyAgICBFWFBFQ1RfVFJVRShtMTEuTWF0Y2hlcyh4KSk7CisgICAgeCA9IDEuMWY7CisgICAgRVhQRUNUX0ZBTFNFKG0xMS5NYXRjaGVzKHgpKTsKKyAgICB4ID0gLTEuMWY7CisgICAgRVhQRUNUX0ZBTFNFKG0xMS5NYXRjaGVzKHgpKTsKKyAgfQorfTsKKworLy8gSW5zdGFudGlhdGUgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgZmxvYXRzLgordHlwZWRlZiBGbG9hdGluZ1BvaW50VGVzdDxmbG9hdD4gRmxvYXRUZXN0OworCitURVNUX0YoRmxvYXRUZXN0LCBGbG9hdEVxQXBwcm94aW1hdGVseU1hdGNoZXNGbG9hdHMpIHsKKyAgVGVzdE1hdGNoZXMoJkZsb2F0RXEpOworfQorCitURVNUX0YoRmxvYXRUZXN0LCBOYW5TZW5zaXRpdmVGbG9hdEVxQXBwcm94aW1hdGVseU1hdGNoZXNGbG9hdHMpIHsKKyAgVGVzdE1hdGNoZXMoJk5hblNlbnNpdGl2ZUZsb2F0RXEpOworfQorCitURVNUX0YoRmxvYXRUZXN0LCBGbG9hdEVxQ2Fubm90TWF0Y2hOYU4pIHsKKyAgLy8gRmxvYXRFcSBuZXZlciBtYXRjaGVzIE5hTi4KKyAgTWF0Y2hlcjxmbG9hdD4gbSA9IEZsb2F0RXEobmFuMV8pOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5hbjFfKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMobmFuMl8pKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygxLjApKTsKK30KKworVEVTVF9GKEZsb2F0VGVzdCwgTmFuU2Vuc2l0aXZlRmxvYXRFcUNhbk1hdGNoTmFOKSB7CisgIC8vIE5hblNlbnNpdGl2ZUZsb2F0RXEgd2lsbCBtYXRjaCBOYU4uCisgIE1hdGNoZXI8ZmxvYXQ+IG0gPSBOYW5TZW5zaXRpdmVGbG9hdEVxKG5hbjFfKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG5hbjFfKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuYW4yXykpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDEuMCkpOworfQorCitURVNUX0YoRmxvYXRUZXN0LCBGbG9hdEVxQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8ZmxvYXQ+IG0xID0gRmxvYXRFcSgyLjBmKTsKKyAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDIiLCBEZXNjcmliZShtMSkpOworICBFWFBFQ1RfRVEoImlzbid0IGFwcHJveGltYXRlbHkgMiIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKKworICBNYXRjaGVyPGZsb2F0PiBtMiA9IEZsb2F0RXEoMC41Zik7CisgIEVYUEVDVF9FUSgiaXMgYXBwcm94aW1hdGVseSAwLjUiLCBEZXNjcmliZShtMikpOworICBFWFBFQ1RfRVEoImlzbid0IGFwcHJveGltYXRlbHkgMC41IiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOworCisgIE1hdGNoZXI8ZmxvYXQ+IG0zID0gRmxvYXRFcShuYW4xXyk7CisgIEVYUEVDVF9FUSgibmV2ZXIgbWF0Y2hlcyIsIERlc2NyaWJlKG0zKSk7CisgIEVYUEVDVF9FUSgiaXMgYW55dGhpbmciLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Cit9CisKK1RFU1RfRihGbG9hdFRlc3QsIE5hblNlbnNpdGl2ZUZsb2F0RXFDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxmbG9hdD4gbTEgPSBOYW5TZW5zaXRpdmVGbG9hdEVxKDIuMGYpOworICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMiIsIERlc2NyaWJlKG0xKSk7CisgIEVYUEVDVF9FUSgiaXNuJ3QgYXBwcm94aW1hdGVseSAyIiwgRGVzY3JpYmVOZWdhdGlvbihtMSkpOworCisgIE1hdGNoZXI8ZmxvYXQ+IG0yID0gTmFuU2Vuc2l0aXZlRmxvYXRFcSgwLjVmKTsKKyAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDAuNSIsIERlc2NyaWJlKG0yKSk7CisgIEVYUEVDVF9FUSgiaXNuJ3QgYXBwcm94aW1hdGVseSAwLjUiLCBEZXNjcmliZU5lZ2F0aW9uKG0yKSk7CisKKyAgTWF0Y2hlcjxmbG9hdD4gbTMgPSBOYW5TZW5zaXRpdmVGbG9hdEVxKG5hbjFfKTsKKyAgRVhQRUNUX0VRKCJpcyBOYU4iLCBEZXNjcmliZShtMykpOworICBFWFBFQ1RfRVEoImlzbid0IE5hTiIsIERlc2NyaWJlTmVnYXRpb24obTMpKTsKK30KKworLy8gSW5zdGFudGlhdGUgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgZmxvYXRzIHdpdGggYSB1c2VyLXNwZWNpZmllZAorLy8gbWF4IGFic29sdXRlIGVycm9yLgordHlwZWRlZiBGbG9hdGluZ1BvaW50TmVhclRlc3Q8ZmxvYXQ+IEZsb2F0TmVhclRlc3Q7CisKK1RFU1RfRihGbG9hdE5lYXJUZXN0LCBGbG9hdE5lYXJNYXRjaGVzKSB7CisgIFRlc3ROZWFyTWF0Y2hlcygmRmxvYXROZWFyKTsKK30KKworVEVTVF9GKEZsb2F0TmVhclRlc3QsIE5hblNlbnNpdGl2ZUZsb2F0TmVhckFwcHJveGltYXRlbHlNYXRjaGVzRmxvYXRzKSB7CisgIFRlc3ROZWFyTWF0Y2hlcygmTmFuU2Vuc2l0aXZlRmxvYXROZWFyKTsKK30KKworVEVTVF9GKEZsb2F0TmVhclRlc3QsIEZsb2F0TmVhckNhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGZsb2F0PiBtMSA9IEZsb2F0TmVhcigyLjBmLCAwLjVmKTsKKyAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDIgKGFic29sdXRlIGVycm9yIDw9IDAuNSkiLCBEZXNjcmliZShtMSkpOworICBFWFBFQ1RfRVEoCisgICAgICAiaXNuJ3QgYXBwcm94aW1hdGVseSAyIChhYnNvbHV0ZSBlcnJvciA+IDAuNSkiLCBEZXNjcmliZU5lZ2F0aW9uKG0xKSk7CisKKyAgTWF0Y2hlcjxmbG9hdD4gbTIgPSBGbG9hdE5lYXIoMC41ZiwgMC41Zik7CisgIEVYUEVDVF9FUSgiaXMgYXBwcm94aW1hdGVseSAwLjUgKGFic29sdXRlIGVycm9yIDw9IDAuNSkiLCBEZXNjcmliZShtMikpOworICBFWFBFQ1RfRVEoCisgICAgICAiaXNuJ3QgYXBwcm94aW1hdGVseSAwLjUgKGFic29sdXRlIGVycm9yID4gMC41KSIsIERlc2NyaWJlTmVnYXRpb24obTIpKTsKKworICBNYXRjaGVyPGZsb2F0PiBtMyA9IEZsb2F0TmVhcihuYW4xXywgMC4wKTsKKyAgRVhQRUNUX0VRKCJuZXZlciBtYXRjaGVzIiwgRGVzY3JpYmUobTMpKTsKKyAgRVhQRUNUX0VRKCJpcyBhbnl0aGluZyIsIERlc2NyaWJlTmVnYXRpb24obTMpKTsKK30KKworVEVTVF9GKEZsb2F0TmVhclRlc3QsIE5hblNlbnNpdGl2ZUZsb2F0TmVhckNhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGZsb2F0PiBtMSA9IE5hblNlbnNpdGl2ZUZsb2F0TmVhcigyLjBmLCAwLjVmKTsKKyAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDIgKGFic29sdXRlIGVycm9yIDw9IDAuNSkiLCBEZXNjcmliZShtMSkpOworICBFWFBFQ1RfRVEoCisgICAgICAiaXNuJ3QgYXBwcm94aW1hdGVseSAyIChhYnNvbHV0ZSBlcnJvciA+IDAuNSkiLCBEZXNjcmliZU5lZ2F0aW9uKG0xKSk7CisKKyAgTWF0Y2hlcjxmbG9hdD4gbTIgPSBOYW5TZW5zaXRpdmVGbG9hdE5lYXIoMC41ZiwgMC41Zik7CisgIEVYUEVDVF9FUSgiaXMgYXBwcm94aW1hdGVseSAwLjUgKGFic29sdXRlIGVycm9yIDw9IDAuNSkiLCBEZXNjcmliZShtMikpOworICBFWFBFQ1RfRVEoCisgICAgICAiaXNuJ3QgYXBwcm94aW1hdGVseSAwLjUgKGFic29sdXRlIGVycm9yID4gMC41KSIsIERlc2NyaWJlTmVnYXRpb24obTIpKTsKKworICBNYXRjaGVyPGZsb2F0PiBtMyA9IE5hblNlbnNpdGl2ZUZsb2F0TmVhcihuYW4xXywgMC4xZik7CisgIEVYUEVDVF9FUSgiaXMgTmFOIiwgRGVzY3JpYmUobTMpKTsKKyAgRVhQRUNUX0VRKCJpc24ndCBOYU4iLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Cit9CisKK1RFU1RfRihGbG9hdE5lYXJUZXN0LCBGbG9hdE5lYXJDYW5ub3RNYXRjaE5hTikgeworICAvLyBGbG9hdE5lYXIgbmV2ZXIgbWF0Y2hlcyBOYU4uCisgIE1hdGNoZXI8ZmxvYXQ+IG0gPSBGbG9hdE5lYXIoUGFyZW50VHlwZTo6bmFuMV8sIDAuMWYpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5hbjFfKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMobmFuMl8pKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygxLjApKTsKK30KKworVEVTVF9GKEZsb2F0TmVhclRlc3QsIE5hblNlbnNpdGl2ZUZsb2F0TmVhckNhbk1hdGNoTmFOKSB7CisgIC8vIE5hblNlbnNpdGl2ZUZsb2F0TmVhciB3aWxsIG1hdGNoIE5hTi4KKyAgTWF0Y2hlcjxmbG9hdD4gbSA9IE5hblNlbnNpdGl2ZUZsb2F0TmVhcihuYW4xXywgMC4xZik7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuYW4xXykpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobmFuMl8pKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygxLjApKTsKK30KKworLy8gSW5zdGFudGlhdGUgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgZG91Ymxlcy4KK3R5cGVkZWYgRmxvYXRpbmdQb2ludFRlc3Q8ZG91YmxlPiBEb3VibGVUZXN0OworCitURVNUX0YoRG91YmxlVGVzdCwgRG91YmxlRXFBcHByb3hpbWF0ZWx5TWF0Y2hlc0RvdWJsZXMpIHsKKyAgVGVzdE1hdGNoZXMoJkRvdWJsZUVxKTsKK30KKworVEVTVF9GKERvdWJsZVRlc3QsIE5hblNlbnNpdGl2ZURvdWJsZUVxQXBwcm94aW1hdGVseU1hdGNoZXNEb3VibGVzKSB7CisgIFRlc3RNYXRjaGVzKCZOYW5TZW5zaXRpdmVEb3VibGVFcSk7Cit9CisKK1RFU1RfRihEb3VibGVUZXN0LCBEb3VibGVFcUNhbm5vdE1hdGNoTmFOKSB7CisgIC8vIERvdWJsZUVxIG5ldmVyIG1hdGNoZXMgTmFOLgorICBNYXRjaGVyPGRvdWJsZT4gbSA9IERvdWJsZUVxKG5hbjFfKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhuYW4xXykpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5hbjJfKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMS4wKSk7Cit9CisKK1RFU1RfRihEb3VibGVUZXN0LCBOYW5TZW5zaXRpdmVEb3VibGVFcUNhbk1hdGNoTmFOKSB7CisgIC8vIE5hblNlbnNpdGl2ZURvdWJsZUVxIHdpbGwgbWF0Y2ggTmFOLgorICBNYXRjaGVyPGRvdWJsZT4gbSA9IE5hblNlbnNpdGl2ZURvdWJsZUVxKG5hbjFfKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG5hbjFfKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuYW4yXykpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDEuMCkpOworfQorCitURVNUX0YoRG91YmxlVGVzdCwgRG91YmxlRXFDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxkb3VibGU+IG0xID0gRG91YmxlRXEoMi4wKTsKKyAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDIiLCBEZXNjcmliZShtMSkpOworICBFWFBFQ1RfRVEoImlzbid0IGFwcHJveGltYXRlbHkgMiIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKKworICBNYXRjaGVyPGRvdWJsZT4gbTIgPSBEb3VibGVFcSgwLjUpOworICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMC41IiwgRGVzY3JpYmUobTIpKTsKKyAgRVhQRUNUX0VRKCJpc24ndCBhcHByb3hpbWF0ZWx5IDAuNSIsIERlc2NyaWJlTmVnYXRpb24obTIpKTsKKworICBNYXRjaGVyPGRvdWJsZT4gbTMgPSBEb3VibGVFcShuYW4xXyk7CisgIEVYUEVDVF9FUSgibmV2ZXIgbWF0Y2hlcyIsIERlc2NyaWJlKG0zKSk7CisgIEVYUEVDVF9FUSgiaXMgYW55dGhpbmciLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Cit9CisKK1RFU1RfRihEb3VibGVUZXN0LCBOYW5TZW5zaXRpdmVEb3VibGVFcUNhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGRvdWJsZT4gbTEgPSBOYW5TZW5zaXRpdmVEb3VibGVFcSgyLjApOworICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMiIsIERlc2NyaWJlKG0xKSk7CisgIEVYUEVDVF9FUSgiaXNuJ3QgYXBwcm94aW1hdGVseSAyIiwgRGVzY3JpYmVOZWdhdGlvbihtMSkpOworCisgIE1hdGNoZXI8ZG91YmxlPiBtMiA9IE5hblNlbnNpdGl2ZURvdWJsZUVxKDAuNSk7CisgIEVYUEVDVF9FUSgiaXMgYXBwcm94aW1hdGVseSAwLjUiLCBEZXNjcmliZShtMikpOworICBFWFBFQ1RfRVEoImlzbid0IGFwcHJveGltYXRlbHkgMC41IiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOworCisgIE1hdGNoZXI8ZG91YmxlPiBtMyA9IE5hblNlbnNpdGl2ZURvdWJsZUVxKG5hbjFfKTsKKyAgRVhQRUNUX0VRKCJpcyBOYU4iLCBEZXNjcmliZShtMykpOworICBFWFBFQ1RfRVEoImlzbid0IE5hTiIsIERlc2NyaWJlTmVnYXRpb24obTMpKTsKK30KKworLy8gSW5zdGFudGlhdGUgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgZmxvYXRzIHdpdGggYSB1c2VyLXNwZWNpZmllZAorLy8gbWF4IGFic29sdXRlIGVycm9yLgordHlwZWRlZiBGbG9hdGluZ1BvaW50TmVhclRlc3Q8ZG91YmxlPiBEb3VibGVOZWFyVGVzdDsKKworVEVTVF9GKERvdWJsZU5lYXJUZXN0LCBEb3VibGVOZWFyTWF0Y2hlcykgeworICBUZXN0TmVhck1hdGNoZXMoJkRvdWJsZU5lYXIpOworfQorCitURVNUX0YoRG91YmxlTmVhclRlc3QsIE5hblNlbnNpdGl2ZURvdWJsZU5lYXJBcHByb3hpbWF0ZWx5TWF0Y2hlc0RvdWJsZXMpIHsKKyAgVGVzdE5lYXJNYXRjaGVzKCZOYW5TZW5zaXRpdmVEb3VibGVOZWFyKTsKK30KKworVEVTVF9GKERvdWJsZU5lYXJUZXN0LCBEb3VibGVOZWFyQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8ZG91YmxlPiBtMSA9IERvdWJsZU5lYXIoMi4wLCAwLjUpOworICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMiAoYWJzb2x1dGUgZXJyb3IgPD0gMC41KSIsIERlc2NyaWJlKG0xKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJpc24ndCBhcHByb3hpbWF0ZWx5IDIgKGFic29sdXRlIGVycm9yID4gMC41KSIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKKworICBNYXRjaGVyPGRvdWJsZT4gbTIgPSBEb3VibGVOZWFyKDAuNSwgMC41KTsKKyAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDAuNSAoYWJzb2x1dGUgZXJyb3IgPD0gMC41KSIsIERlc2NyaWJlKG0yKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJpc24ndCBhcHByb3hpbWF0ZWx5IDAuNSAoYWJzb2x1dGUgZXJyb3IgPiAwLjUpIiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOworCisgIE1hdGNoZXI8ZG91YmxlPiBtMyA9IERvdWJsZU5lYXIobmFuMV8sIDAuMCk7CisgIEVYUEVDVF9FUSgibmV2ZXIgbWF0Y2hlcyIsIERlc2NyaWJlKG0zKSk7CisgIEVYUEVDVF9FUSgiaXMgYW55dGhpbmciLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Cit9CisKK1RFU1RfRihEb3VibGVOZWFyVGVzdCwgRXhwbGFpbnNSZXN1bHRXaGVuTWF0Y2hGYWlscykgeworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4oRG91YmxlTmVhcigyLjAsIDAuMSksIDIuMDUpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyAwLjIgZnJvbSAyIiwgRXhwbGFpbihEb3VibGVOZWFyKDIuMCwgMC4xKSwgMi4yKSk7CisgIEVYUEVDVF9FUSgid2hpY2ggaXMgLTAuMyBmcm9tIDIiLCBFeHBsYWluKERvdWJsZU5lYXIoMi4wLCAwLjEpLCAxLjcpKTsKKworICBjb25zdCBzdHJpbmcgZXhwbGFuYXRpb24gPSBFeHBsYWluKERvdWJsZU5lYXIoMi4xLCAxZS0xMCksIDIuMSArIDEuMmUtMTApOworICAvLyBEaWZmZXJlbnQgQysrIGltcGxlbWVudGF0aW9ucyBtYXkgcHJpbnQgZmxvYXRpbmctcG9pbnQgbnVtYmVycworICAvLyBzbGlnaHRseSBkaWZmZXJlbnRseS4KKyAgRVhQRUNUX1RSVUUoZXhwbGFuYXRpb24gPT0gIndoaWNoIGlzIDEuMmUtMTAgZnJvbSAyLjEiIHx8ICAvLyBHQ0MKKyAgICAgICAgICAgICAgZXhwbGFuYXRpb24gPT0gIndoaWNoIGlzIDEuMmUtMDEwIGZyb20gMi4xIikgICAvLyBNU1ZDCisgICAgICA8PCAiIHdoZXJlIGV4cGxhbmF0aW9uIGlzIFwiIiA8PCBleHBsYW5hdGlvbiA8PCAiXCIuIjsKK30KKworVEVTVF9GKERvdWJsZU5lYXJUZXN0LCBOYW5TZW5zaXRpdmVEb3VibGVOZWFyQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8ZG91YmxlPiBtMSA9IE5hblNlbnNpdGl2ZURvdWJsZU5lYXIoMi4wLCAwLjUpOworICBFWFBFQ1RfRVEoImlzIGFwcHJveGltYXRlbHkgMiAoYWJzb2x1dGUgZXJyb3IgPD0gMC41KSIsIERlc2NyaWJlKG0xKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJpc24ndCBhcHByb3hpbWF0ZWx5IDIgKGFic29sdXRlIGVycm9yID4gMC41KSIsIERlc2NyaWJlTmVnYXRpb24obTEpKTsKKworICBNYXRjaGVyPGRvdWJsZT4gbTIgPSBOYW5TZW5zaXRpdmVEb3VibGVOZWFyKDAuNSwgMC41KTsKKyAgRVhQRUNUX0VRKCJpcyBhcHByb3hpbWF0ZWx5IDAuNSAoYWJzb2x1dGUgZXJyb3IgPD0gMC41KSIsIERlc2NyaWJlKG0yKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJpc24ndCBhcHByb3hpbWF0ZWx5IDAuNSAoYWJzb2x1dGUgZXJyb3IgPiAwLjUpIiwgRGVzY3JpYmVOZWdhdGlvbihtMikpOworCisgIE1hdGNoZXI8ZG91YmxlPiBtMyA9IE5hblNlbnNpdGl2ZURvdWJsZU5lYXIobmFuMV8sIDAuMSk7CisgIEVYUEVDVF9FUSgiaXMgTmFOIiwgRGVzY3JpYmUobTMpKTsKKyAgRVhQRUNUX0VRKCJpc24ndCBOYU4iLCBEZXNjcmliZU5lZ2F0aW9uKG0zKSk7Cit9CisKK1RFU1RfRihEb3VibGVOZWFyVGVzdCwgRG91YmxlTmVhckNhbm5vdE1hdGNoTmFOKSB7CisgIC8vIERvdWJsZU5lYXIgbmV2ZXIgbWF0Y2hlcyBOYU4uCisgIE1hdGNoZXI8ZG91YmxlPiBtID0gRG91YmxlTmVhcihQYXJlbnRUeXBlOjpuYW4xXywgMC4xKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhuYW4xXykpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG5hbjJfKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoMS4wKSk7Cit9CisKK1RFU1RfRihEb3VibGVOZWFyVGVzdCwgTmFuU2Vuc2l0aXZlRG91YmxlTmVhckNhbk1hdGNoTmFOKSB7CisgIC8vIE5hblNlbnNpdGl2ZURvdWJsZU5lYXIgd2lsbCBtYXRjaCBOYU4uCisgIE1hdGNoZXI8ZG91YmxlPiBtID0gTmFuU2Vuc2l0aXZlRG91YmxlTmVhcihuYW4xXywgMC4xKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG5hbjFfKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuYW4yXykpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDEuMCkpOworfQorCitURVNUKFBvaW50ZWVUZXN0LCBSYXdQb2ludGVyKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50Kj4gbSA9IFBvaW50ZWUoR2UoMCkpOworCisgIGludCBuID0gMTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZuKSk7CisgIG4gPSAtMTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygmbikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKE5VTEwpKTsKK30KKworVEVTVChQb2ludGVlVGVzdCwgUmF3UG9pbnRlclRvQ29uc3QpIHsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBkb3VibGUqPiBtID0gUG9pbnRlZShHZSgwKSk7CisKKyAgZG91YmxlIHggPSAxOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJngpKTsKKyAgeCA9IC0xOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZ4KSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOworfQorCitURVNUKFBvaW50ZWVUZXN0LCBSZWZlcmVuY2VUb0NvbnN0UmF3UG9pbnRlcikgeworICBjb25zdCBNYXRjaGVyPGludCogY29uc3QgJj4gbSA9IFBvaW50ZWUoR2UoMCkpOworCisgIGludCBuID0gMTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZuKSk7CisgIG4gPSAtMTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygmbikpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKE5VTEwpKTsKK30KKworVEVTVChQb2ludGVlVGVzdCwgUmVmZXJlbmNlVG9Ob25Db25zdFJhd1BvaW50ZXIpIHsKKyAgY29uc3QgTWF0Y2hlcjxkb3VibGUqICY+IG0gPSBQb2ludGVlKEdlKDApKTsKKworICBkb3VibGUgeCA9IDEuMDsKKyAgZG91YmxlKiBwID0gJng7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhwKSk7CisgIHggPSAtMTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKHApKTsKK30KKworTUFUQ0hFUl9QKEZpZWxkSUlzLCBpbm5lcl9tYXRjaGVyLCAiIikgeworICByZXR1cm4gRXhwbGFpbk1hdGNoUmVzdWx0KGlubmVyX21hdGNoZXIsIGFyZy5pLCByZXN1bHRfbGlzdGVuZXIpOworfQorCitURVNUKFdoZW5EeW5hbWljQ2FzdFRvVGVzdCwgU2FtZVR5cGUpIHsKKyAgRGVyaXZlZCBkZXJpdmVkOworICBkZXJpdmVkLmkgPSA0OworCisgIC8vIFJpZ2h0IHR5cGUuIEEgcG9pbnRlciBpcyBwYXNzZWQgZG93bi4KKyAgQmFzZSogYXNfYmFzZV9wdHIgPSAmZGVyaXZlZDsKKyAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsIFdoZW5EeW5hbWljQ2FzdFRvPERlcml2ZWQqPihOb3QoSXNOdWxsKCkpKSk7CisgIEVYUEVDVF9USEFUKGFzX2Jhc2VfcHRyLCBXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oUG9pbnRlZShGaWVsZElJcyg0KSkpKTsKKyAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsCisgICAgICAgICAgICAgIE5vdChXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oUG9pbnRlZShGaWVsZElJcyg1KSkpKSk7Cit9CisKK1RFU1QoV2hlbkR5bmFtaWNDYXN0VG9UZXN0LCBXcm9uZ1R5cGVzKSB7CisgIEJhc2UgYmFzZTsKKyAgRGVyaXZlZCBkZXJpdmVkOworICBPdGhlckRlcml2ZWQgb3RoZXJfZGVyaXZlZDsKKworICAvLyBXcm9uZyB0eXBlcy4gTlVMTCBpcyBwYXNzZWQuCisgIEVYUEVDVF9USEFUKCZiYXNlLCBOb3QoV2hlbkR5bmFtaWNDYXN0VG88RGVyaXZlZCo+KFBvaW50ZWUoXykpKSk7CisgIEVYUEVDVF9USEFUKCZiYXNlLCBXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oSXNOdWxsKCkpKTsKKyAgQmFzZSogYXNfYmFzZV9wdHIgPSAmZGVyaXZlZDsKKyAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsIE5vdChXaGVuRHluYW1pY0Nhc3RUbzxPdGhlckRlcml2ZWQqPihQb2ludGVlKF8pKSkpOworICBFWFBFQ1RfVEhBVChhc19iYXNlX3B0ciwgV2hlbkR5bmFtaWNDYXN0VG88T3RoZXJEZXJpdmVkKj4oSXNOdWxsKCkpKTsKKyAgYXNfYmFzZV9wdHIgPSAmb3RoZXJfZGVyaXZlZDsKKyAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsIE5vdChXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oUG9pbnRlZShfKSkpKTsKKyAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsIFdoZW5EeW5hbWljQ2FzdFRvPERlcml2ZWQqPihJc051bGwoKSkpOworfQorCitURVNUKFdoZW5EeW5hbWljQ2FzdFRvVGVzdCwgQWxyZWFkeU51bGwpIHsKKyAgLy8gQWxyZWFkeSBOVUxMLgorICBCYXNlKiBhc19iYXNlX3B0ciA9IE5VTEw7CisgIEVYUEVDVF9USEFUKGFzX2Jhc2VfcHRyLCBXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oSXNOdWxsKCkpKTsKK30KKworc3RydWN0IEFtYmlndW91c0Nhc3RUeXBlcyB7CisgIGNsYXNzIFZpcnR1YWxEZXJpdmVkIDogcHVibGljIHZpcnR1YWwgQmFzZSB7fTsKKyAgY2xhc3MgRGVyaXZlZFN1YjEgOiBwdWJsaWMgVmlydHVhbERlcml2ZWQge307CisgIGNsYXNzIERlcml2ZWRTdWIyIDogcHVibGljIFZpcnR1YWxEZXJpdmVkIHt9OworICBjbGFzcyBNYW55RGVyaXZlZEluSGllcmFyY2h5IDogcHVibGljIERlcml2ZWRTdWIxLCBwdWJsaWMgRGVyaXZlZFN1YjIge307Cit9OworCitURVNUKFdoZW5EeW5hbWljQ2FzdFRvVGVzdCwgQW1iaWd1b3VzQ2FzdCkgeworICBBbWJpZ3VvdXNDYXN0VHlwZXM6OkRlcml2ZWRTdWIxIHN1YjE7CisgIEFtYmlndW91c0Nhc3RUeXBlczo6TWFueURlcml2ZWRJbkhpZXJhcmNoeSBtYW55X2Rlcml2ZWQ7CisgIC8vIE11bHRpcGx5IGRlcml2ZWQgZnJvbSBCYXNlLiBkeW5hbWljX2Nhc3Q8PiByZXR1cm5zIE5VTEwuCisgIEJhc2UqIGFzX2Jhc2VfcHRyID0KKyAgICAgIHN0YXRpY19jYXN0PEFtYmlndW91c0Nhc3RUeXBlczo6RGVyaXZlZFN1YjEqPigmbWFueV9kZXJpdmVkKTsKKyAgRVhQRUNUX1RIQVQoYXNfYmFzZV9wdHIsCisgICAgICAgICAgICAgIFdoZW5EeW5hbWljQ2FzdFRvPEFtYmlndW91c0Nhc3RUeXBlczo6VmlydHVhbERlcml2ZWQqPihJc051bGwoKSkpOworICBhc19iYXNlX3B0ciA9ICZzdWIxOworICBFWFBFQ1RfVEhBVCgKKyAgICAgIGFzX2Jhc2VfcHRyLAorICAgICAgV2hlbkR5bmFtaWNDYXN0VG88QW1iaWd1b3VzQ2FzdFR5cGVzOjpWaXJ0dWFsRGVyaXZlZCo+KE5vdChJc051bGwoKSkpKTsKK30KKworVEVTVChXaGVuRHluYW1pY0Nhc3RUb1Rlc3QsIERlc2NyaWJlKSB7CisgIE1hdGNoZXI8QmFzZSo+IG1hdGNoZXIgPSBXaGVuRHluYW1pY0Nhc3RUbzxEZXJpdmVkKj4oUG9pbnRlZShfKSk7CisjaWYgR1RFU1RfSEFTX1JUVEkKKyAgY29uc3Qgc3RyaW5nIHByZWZpeCA9CisgICAgICAid2hlbiBkeW5hbWljX2Nhc3QgdG8gIiArIGludGVybmFsOjpHZXRUeXBlTmFtZTxEZXJpdmVkKj4oKSArICIsICI7CisjZWxzZSAgLy8gR1RFU1RfSEFTX1JUVEkKKyAgY29uc3Qgc3RyaW5nIHByZWZpeCA9ICJ3aGVuIGR5bmFtaWNfY2FzdCwgIjsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKKyAgRVhQRUNUX0VRKHByZWZpeCArICJwb2ludHMgdG8gYSB2YWx1ZSB0aGF0IGlzIGFueXRoaW5nIiwgRGVzY3JpYmUobWF0Y2hlcikpOworICBFWFBFQ1RfRVEocHJlZml4ICsgImRvZXMgbm90IHBvaW50IHRvIGEgdmFsdWUgdGhhdCBpcyBhbnl0aGluZyIsCisgICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG1hdGNoZXIpKTsKK30KKworVEVTVChXaGVuRHluYW1pY0Nhc3RUb1Rlc3QsIEV4cGxhaW4pIHsKKyAgTWF0Y2hlcjxCYXNlKj4gbWF0Y2hlciA9IFdoZW5EeW5hbWljQ2FzdFRvPERlcml2ZWQqPihQb2ludGVlKF8pKTsKKyAgQmFzZSogbnVsbCA9IE5VTEw7CisgIEVYUEVDVF9USEFUKEV4cGxhaW4obWF0Y2hlciwgbnVsbCksIEhhc1N1YnN0cigiTlVMTCIpKTsKKyAgRGVyaXZlZCBkZXJpdmVkOworICBFWFBFQ1RfVFJVRShtYXRjaGVyLk1hdGNoZXMoJmRlcml2ZWQpKTsKKyAgRVhQRUNUX1RIQVQoRXhwbGFpbihtYXRjaGVyLCAmZGVyaXZlZCksIEhhc1N1YnN0cigid2hpY2ggcG9pbnRzIHRvICIpKTsKKworICAvLyBXaXRoIHJlZmVyZW5jZXMsIHRoZSBtYXRjaGVyIGl0c2VsZiBjYW4gZmFpbC4gVGVzdCBmb3IgdGhhdCBvbmUuCisgIE1hdGNoZXI8Y29uc3QgQmFzZSY+IHJlZl9tYXRjaGVyID0gV2hlbkR5bmFtaWNDYXN0VG88Y29uc3QgT3RoZXJEZXJpdmVkJj4oXyk7CisgIEVYUEVDVF9USEFUKEV4cGxhaW4ocmVmX21hdGNoZXIsIGRlcml2ZWQpLAorICAgICAgICAgICAgICBIYXNTdWJzdHIoIndoaWNoIGNhbm5vdCBiZSBkeW5hbWljX2Nhc3QiKSk7Cit9CisKK1RFU1QoV2hlbkR5bmFtaWNDYXN0VG9UZXN0LCBHb29kUmVmZXJlbmNlKSB7CisgIERlcml2ZWQgZGVyaXZlZDsKKyAgZGVyaXZlZC5pID0gNDsKKyAgQmFzZSYgYXNfYmFzZV9yZWYgPSBkZXJpdmVkOworICBFWFBFQ1RfVEhBVChhc19iYXNlX3JlZiwgV2hlbkR5bmFtaWNDYXN0VG88Y29uc3QgRGVyaXZlZCY+KEZpZWxkSUlzKDQpKSk7CisgIEVYUEVDVF9USEFUKGFzX2Jhc2VfcmVmLCBXaGVuRHluYW1pY0Nhc3RUbzxjb25zdCBEZXJpdmVkJj4oTm90KEZpZWxkSUlzKDUpKSkpOworfQorCitURVNUKFdoZW5EeW5hbWljQ2FzdFRvVGVzdCwgQmFkUmVmZXJlbmNlKSB7CisgIERlcml2ZWQgZGVyaXZlZDsKKyAgQmFzZSYgYXNfYmFzZV9yZWYgPSBkZXJpdmVkOworICBFWFBFQ1RfVEhBVChhc19iYXNlX3JlZiwgTm90KFdoZW5EeW5hbWljQ2FzdFRvPGNvbnN0IE90aGVyRGVyaXZlZCY+KF8pKSk7Cit9CisKKy8vIE1pbmltYWwgY29uc3QtcHJvcGFnYXRpbmcgcG9pbnRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQ29uc3RQcm9wYWdhdGluZ1B0ciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworCisgIENvbnN0UHJvcGFnYXRpbmdQdHIoKSA6IHZhbF8oKSB7fQorICBleHBsaWNpdCBDb25zdFByb3BhZ2F0aW5nUHRyKFQqIHQpIDogdmFsXyh0KSB7fQorICBDb25zdFByb3BhZ2F0aW5nUHRyKGNvbnN0IENvbnN0UHJvcGFnYXRpbmdQdHImIG90aGVyKSA6IHZhbF8ob3RoZXIudmFsXykge30KKworICBUKiBnZXQoKSB7IHJldHVybiB2YWxfOyB9CisgIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuICp2YWxfOyB9CisgIC8vIE1vc3Qgc21hcnQgcG9pbnRlcnMgcmV0dXJuIG5vbi1jb25zdCBUKiBhbmQgVCYgZnJvbSB0aGUgbmV4dCBtZXRob2RzLgorICBjb25zdCBUKiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWxfOyB9CisgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICp2YWxfOyB9CisKKyBwcml2YXRlOgorICBUKiB2YWxfOworfTsKKworVEVTVChQb2ludGVlVGVzdCwgV29ya3NXaXRoQ29uc3RQcm9wYWdhdGluZ1BvaW50ZXJzKSB7CisgIGNvbnN0IE1hdGNoZXI8IENvbnN0UHJvcGFnYXRpbmdQdHI8aW50PiA+IG0gPSBQb2ludGVlKEx0KDUpKTsKKyAgaW50IHRocmVlID0gMzsKKyAgY29uc3QgQ29uc3RQcm9wYWdhdGluZ1B0cjxpbnQ+IGNvKCZ0aHJlZSk7CisgIENvbnN0UHJvcGFnYXRpbmdQdHI8aW50PiBvKCZ0aHJlZSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhvKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhjbykpOworICAqbyA9IDY7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMobykpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKENvbnN0UHJvcGFnYXRpbmdQdHI8aW50PigpKSk7Cit9CisKK1RFU1QoUG9pbnRlZVRlc3QsIE5ldmVyTWF0Y2hlc051bGwpIHsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFBvaW50ZWUoXyk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiB3cml0ZSBQb2ludGVlKHZhbHVlKSBpbnN0ZWFkIG9mIFBvaW50ZWUoRXEodmFsdWUpKS4KK1RFU1QoUG9pbnRlZVRlc3QsIE1hdGNoZXNBZ2FpbnN0QVZhbHVlKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50Kj4gbSA9IFBvaW50ZWUoNSk7CisKKyAgaW50IG4gPSA1OworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJm4pKTsKKyAgbiA9IC0xOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZuKSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoTlVMTCkpOworfQorCitURVNUKFBvaW50ZWVUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgY29uc3QgTWF0Y2hlcjxpbnQqPiBtID0gUG9pbnRlZShHdCgzKSk7CisgIEVYUEVDVF9FUSgicG9pbnRzIHRvIGEgdmFsdWUgdGhhdCBpcyA+IDMiLCBEZXNjcmliZShtKSk7CisgIEVYUEVDVF9FUSgiZG9lcyBub3QgcG9pbnQgdG8gYSB2YWx1ZSB0aGF0IGlzID4gMyIsCisgICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKK30KKworVEVTVChQb2ludGVlVGVzdCwgQ2FuRXhwbGFpbk1hdGNoUmVzdWx0KSB7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3Qgc3RyaW5nKj4gbSA9IFBvaW50ZWUoU3RhcnRzV2l0aCgiSGkiKSk7CisKKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIHN0YXRpY19jYXN0PGNvbnN0IHN0cmluZyo+KE5VTEwpKSk7CisKKyAgY29uc3QgTWF0Y2hlcjxsb25nKj4gbTIgPSBQb2ludGVlKEdyZWF0ZXJUaGFuKDEpKTsgIC8vIE5PTElOVAorICBsb25nIG4gPSAzOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgid2hpY2ggcG9pbnRzIHRvIDMiICsgT2ZUeXBlKCJsb25nIikgKyAiLCB3aGljaCBpcyAyIG1vcmUgdGhhbiAxIiwKKyAgICAgICAgICAgIEV4cGxhaW4obTIsICZuKSk7Cit9CisKK1RFU1QoUG9pbnRlZVRlc3QsIEFsd2F5c0V4cGxhaW5zUG9pbnRlZSkgeworICBjb25zdCBNYXRjaGVyPGludCo+IG0gPSBQb2ludGVlKDApOworICBpbnQgbiA9IDQyOworICBFWFBFQ1RfRVEoIndoaWNoIHBvaW50cyB0byA0MiIgKyBPZlR5cGUoImludCIpLCBFeHBsYWluKG0sICZuKSk7Cit9CisKKy8vIEFuIHVuY29weWFibGUgY2xhc3MuCitjbGFzcyBVbmNvcHlhYmxlIHsKKyBwdWJsaWM6CisgIFVuY29weWFibGUoKSA6IHZhbHVlXygtMSkge30KKyAgZXhwbGljaXQgVW5jb3B5YWJsZShpbnQgYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30KKworICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgdm9pZCBzZXRfdmFsdWUoaW50IGkpIHsgdmFsdWVfID0gaTsgfQorCisgcHJpdmF0ZToKKyAgaW50IHZhbHVlXzsKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbmNvcHlhYmxlKTsKK307CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgeC52YWx1ZSgpIGlzIHBvc2l0aXZlLgorYm9vbCBWYWx1ZUlzUG9zaXRpdmUoY29uc3QgVW5jb3B5YWJsZSYgeCkgeyByZXR1cm4geC52YWx1ZSgpID4gMDsgfQorCitNQVRDSEVSX1AoVW5jb3B5YWJsZUlzLCBpbm5lcl9tYXRjaGVyLCAiIikgeworICByZXR1cm4gRXhwbGFpbk1hdGNoUmVzdWx0KGlubmVyX21hdGNoZXIsIGFyZy52YWx1ZSgpLCByZXN1bHRfbGlzdGVuZXIpOworfQorCisvLyBBIHVzZXItZGVmaW5lZCBzdHJ1Y3QgZm9yIHRlc3RpbmcgRmllbGQoKS4KK3N0cnVjdCBBU3RydWN0IHsKKyAgQVN0cnVjdCgpIDogeCgwKSwgeSgxLjApLCB6KDUpLCBwKE5VTEwpIHt9CisgIEFTdHJ1Y3QoY29uc3QgQVN0cnVjdCYgcmhzKQorICAgICAgOiB4KHJocy54KSwgeShyaHMueSksIHoocmhzLnoudmFsdWUoKSksIHAocmhzLnApIHt9CisKKyAgaW50IHg7ICAgICAgICAgICAvLyBBIG5vbi1jb25zdCBmaWVsZC4KKyAgY29uc3QgZG91YmxlIHk7ICAvLyBBIGNvbnN0IGZpZWxkLgorICBVbmNvcHlhYmxlIHo7ICAgIC8vIEFuIHVuY29weWFibGUgZmllbGQuCisgIGNvbnN0IGNoYXIqIHA7ICAgLy8gQSBwb2ludGVyIGZpZWxkLgorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBU3RydWN0KTsKK307CisKKy8vIEEgZGVyaXZlZCBzdHJ1Y3QgZm9yIHRlc3RpbmcgRmllbGQoKS4KK3N0cnVjdCBEZXJpdmVkU3RydWN0IDogcHVibGljIEFTdHJ1Y3QgeworICBjaGFyIGNoOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhEZXJpdmVkU3RydWN0KTsKK307CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiBmaWVsZCBpcyBub24tY29uc3QuCitURVNUKEZpZWxkVGVzdCwgV29ya3NGb3JOb25Db25zdEZpZWxkKSB7CisgIE1hdGNoZXI8QVN0cnVjdD4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7CisKKyAgQVN0cnVjdCBhOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoYSkpOworICBhLnggPSAtMTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiBmaWVsZCBpcyBjb25zdC4KK1RFU1QoRmllbGRUZXN0LCBXb3Jrc0ZvckNvbnN0RmllbGQpIHsKKyAgQVN0cnVjdCBhOworCisgIE1hdGNoZXI8QVN0cnVjdD4gbSA9IEZpZWxkKCZBU3RydWN0Ojp5LCBHZSgwLjApKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKKyAgbSA9IEZpZWxkKCZBU3RydWN0Ojp5LCBMZSgwLjApKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiBmaWVsZCBpcyBub3QgY29weWFibGUuCitURVNUKEZpZWxkVGVzdCwgV29ya3NGb3JVbmNvcHlhYmxlRmllbGQpIHsKKyAgQVN0cnVjdCBhOworCisgIE1hdGNoZXI8QVN0cnVjdD4gbSA9IEZpZWxkKCZBU3RydWN0Ojp6LCBUcnVseShWYWx1ZUlzUG9zaXRpdmUpKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKKyAgbSA9IEZpZWxkKCZBU3RydWN0Ojp6LCBOb3QoVHJ1bHkoVmFsdWVJc1Bvc2l0aXZlKSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBGaWVsZCgmRm9vOjpmaWVsZCwgLi4uKSB3b3JrcyB3aGVuIGZpZWxkIGlzIGEgcG9pbnRlci4KK1RFU1QoRmllbGRUZXN0LCBXb3Jrc0ZvclBvaW50ZXJGaWVsZCkgeworICAvLyBNYXRjaGluZyBhZ2FpbnN0IE5VTEwuCisgIE1hdGNoZXI8QVN0cnVjdD4gbSA9IEZpZWxkKCZBU3RydWN0OjpwLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oTlVMTCkpOworICBBU3RydWN0IGE7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhhKSk7CisgIGEucCA9ICJoaSI7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoYSkpOworCisgIC8vIE1hdGNoaW5nIGEgcG9pbnRlciB0aGF0IGlzIG5vdCBOVUxMLgorICBtID0gRmllbGQoJkFTdHJ1Y3Q6OnAsIFN0YXJ0c1dpdGgoImhpIikpOworICBhLnAgPSAiaGlsbCI7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhhKSk7CisgIGEucCA9ICJob2xlIjsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoKSB3b3JrcyB3aGVuIHRoZSBvYmplY3QgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KK1RFU1QoRmllbGRUZXN0LCBXb3Jrc0ZvckJ5UmVmQXJndW1lbnQpIHsKKyAgTWF0Y2hlcjxjb25zdCBBU3RydWN0Jj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7CisKKyAgQVN0cnVjdCBhOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoYSkpOworICBhLnggPSAtMTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQncyB0eXBlCisvLyBpcyBhIHN1Yi10eXBlIG9mIEZvby4KK1RFU1QoRmllbGRUZXN0LCBXb3Jrc0ZvckFyZ3VtZW50T2ZTdWJUeXBlKSB7CisgIC8vIE5vdGUgdGhhdCB0aGUgbWF0Y2hlciBleHBlY3RzIERlcml2ZWRTdHJ1Y3QgYnV0IHdlIHNheSBBU3RydWN0CisgIC8vIGluc2lkZSBGaWVsZCgpLgorICBNYXRjaGVyPGNvbnN0IERlcml2ZWRTdHJ1Y3QmPiBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdlKDApKTsKKworICBEZXJpdmVkU3RydWN0IGQ7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhkKSk7CisgIGQueCA9IC0xOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGQpKTsKK30KKworLy8gVGVzdHMgdGhhdCBGaWVsZCgmRm9vOjpmaWVsZCwgbSkgd29ya3Mgd2hlbiBmaWVsZCdzIHR5cGUgYW5kIG0ncworLy8gYXJndW1lbnQgdHlwZSBhcmUgY29tcGF0aWJsZSBidXQgbm90IHRoZSBzYW1lLgorVEVTVChGaWVsZFRlc3QsIFdvcmtzRm9yQ29tcGF0aWJsZU1hdGNoZXJUeXBlKSB7CisgIC8vIFRoZSBmaWVsZCBpcyBhbiBpbnQsIGJ1dCB0aGUgaW5uZXIgbWF0Y2hlciBleHBlY3RzIGEgc2lnbmVkIGNoYXIuCisgIE1hdGNoZXI8Y29uc3QgQVN0cnVjdCY+IG0gPSBGaWVsZCgmQVN0cnVjdDo6eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXI8c2lnbmVkIGNoYXI+KEdlKDApKSk7CisKKyAgQVN0cnVjdCBhOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoYSkpOworICBhLnggPSAtMTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoKSBjYW4gZGVzY3JpYmUgaXRzZWxmLgorVEVTVChGaWVsZFRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGNvbnN0IEFTdHJ1Y3QmPiBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdlKDApKTsKKworICBFWFBFQ1RfRVEoImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBpcyA+PSAwIiwgRGVzY3JpYmUobSkpOworICBFWFBFQ1RfRVEoImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBpc24ndCA+PSAwIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoKSBjYW4gZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0LgorVEVTVChGaWVsZFRlc3QsIENhbkV4cGxhaW5NYXRjaFJlc3VsdCkgeworICBNYXRjaGVyPGNvbnN0IEFTdHJ1Y3QmPiBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdlKDApKTsKKworICBBU3RydWN0IGE7CisgIGEueCA9IDE7CisgIEVYUEVDVF9FUSgid2hvc2UgZ2l2ZW4gZmllbGQgaXMgMSIgKyBPZlR5cGUoImludCIpLCBFeHBsYWluKG0sIGEpKTsKKworICBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdyZWF0ZXJUaGFuKDApKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIndob3NlIGdpdmVuIGZpZWxkIGlzIDEiICsgT2ZUeXBlKCJpbnQiKSArICIsIHdoaWNoIGlzIDEgbW9yZSB0aGFuIDAiLAorICAgICAgRXhwbGFpbihtLCBhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoKSB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gY29uc3QuCitURVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIFdvcmtzRm9yUG9pbnRlclRvQ29uc3QpIHsKKyAgTWF0Y2hlcjxjb25zdCBBU3RydWN0Kj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7CisKKyAgQVN0cnVjdCBhOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJmEpKTsKKyAgYS54ID0gLTE7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoJmEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBGaWVsZCgpIHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBub24tY29uc3QuCitURVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIFdvcmtzRm9yUG9pbnRlclRvTm9uQ29uc3QpIHsKKyAgTWF0Y2hlcjxBU3RydWN0Kj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7CisKKyAgQVN0cnVjdCBhOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJmEpKTsKKyAgYS54ID0gLTE7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoJmEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBGaWVsZCgpIHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgY29uc3QgcG9pbnRlci4KK1RFU1QoRmllbGRGb3JQb2ludGVyVGVzdCwgV29ya3NGb3JSZWZlcmVuY2VUb0NvbnN0UG9pbnRlcikgeworICBNYXRjaGVyPEFTdHJ1Y3QqIGNvbnN0Jj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBHZSgwKSk7CisKKyAgQVN0cnVjdCBhOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoJmEpKTsKKyAgYS54ID0gLTE7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoJmEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBGaWVsZCgpIGRvZXMgbm90IG1hdGNoIHRoZSBOVUxMIHBvaW50ZXIuCitURVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIERvZXNOb3RNYXRjaE51bGwpIHsKKyAgTWF0Y2hlcjxjb25zdCBBU3RydWN0Kj4gbSA9IEZpZWxkKCZBU3RydWN0Ojp4LCBfKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhOVUxMKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoJkZvbzo6ZmllbGQsIC4uLikgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQncyB0eXBlCisvLyBpcyBhIHN1Yi10eXBlIG9mIGNvbnN0IEZvbyouCitURVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIFdvcmtzRm9yQXJndW1lbnRPZlN1YlR5cGUpIHsKKyAgLy8gTm90ZSB0aGF0IHRoZSBtYXRjaGVyIGV4cGVjdHMgRGVyaXZlZFN0cnVjdCBidXQgd2Ugc2F5IEFTdHJ1Y3QKKyAgLy8gaW5zaWRlIEZpZWxkKCkuCisgIE1hdGNoZXI8RGVyaXZlZFN0cnVjdCo+IG0gPSBGaWVsZCgmQVN0cnVjdDo6eCwgR2UoMCkpOworCisgIERlcml2ZWRTdHJ1Y3QgZDsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZkKSk7CisgIGQueCA9IC0xOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZkKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoKSBjYW4gZGVzY3JpYmUgaXRzZWxmIHdoZW4gdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuCitURVNUKEZpZWxkRm9yUG9pbnRlclRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGNvbnN0IEFTdHJ1Y3QqPiBtID0gRmllbGQoJkFTdHJ1Y3Q6OngsIEdlKDApKTsKKworICBFWFBFQ1RfRVEoImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBpcyA+PSAwIiwgRGVzY3JpYmUobSkpOworICBFWFBFQ1RfRVEoImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBpc24ndCA+PSAwIiwgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRmllbGQoKSBjYW4gZXhwbGFpbiB0aGUgcmVzdWx0IG9mIG1hdGNoaW5nIGEgcG9pbnRlci4KK1RFU1QoRmllbGRGb3JQb2ludGVyVGVzdCwgQ2FuRXhwbGFpbk1hdGNoUmVzdWx0KSB7CisgIE1hdGNoZXI8Y29uc3QgQVN0cnVjdCo+IG0gPSBGaWVsZCgmQVN0cnVjdDo6eCwgR2UoMCkpOworCisgIEFTdHJ1Y3QgYTsKKyAgYS54ID0gMTsKKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIHN0YXRpY19jYXN0PGNvbnN0IEFTdHJ1Y3QqPihOVUxMKSkpOworICBFWFBFQ1RfRVEoIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgaXMgMSIgKyBPZlR5cGUoImludCIpLAorICAgICAgICAgICAgRXhwbGFpbihtLCAmYSkpOworCisgIG0gPSBGaWVsZCgmQVN0cnVjdDo6eCwgR3JlYXRlclRoYW4oMCkpOworICBFWFBFQ1RfRVEoIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgaXMgMSIgKyBPZlR5cGUoImludCIpICsKKyAgICAgICAgICAgICIsIHdoaWNoIGlzIDEgbW9yZSB0aGFuIDAiLCBFeHBsYWluKG0sICZhKSk7Cit9CisKKy8vIEEgdXNlci1kZWZpbmVkIGNsYXNzIGZvciB0ZXN0aW5nIFByb3BlcnR5KCkuCitjbGFzcyBBQ2xhc3MgeworIHB1YmxpYzoKKyAgQUNsYXNzKCkgOiBuXygwKSB7fQorCisgIC8vIEEgZ2V0dGVyIHRoYXQgcmV0dXJucyBhIG5vbi1yZWZlcmVuY2UuCisgIGludCBuKCkgY29uc3QgeyByZXR1cm4gbl87IH0KKworICB2b2lkIHNldF9uKGludCBuZXdfbikgeyBuXyA9IG5ld19uOyB9CisKKyAgLy8gQSBnZXR0ZXIgdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGNvbnN0LgorICBjb25zdCBzdHJpbmcmIHMoKSBjb25zdCB7IHJldHVybiBzXzsgfQorCisgIHZvaWQgc2V0X3MoY29uc3Qgc3RyaW5nJiBuZXdfcykgeyBzXyA9IG5ld19zOyB9CisKKyAgLy8gQSBnZXR0ZXIgdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIG5vbi1jb25zdC4KKyAgZG91YmxlJiB4KCkgY29uc3QgeyByZXR1cm4geF87IH0KKyBwcml2YXRlOgorICBpbnQgbl87CisgIHN0cmluZyBzXzsKKworICBzdGF0aWMgZG91YmxlIHhfOworfTsKKworZG91YmxlIEFDbGFzczo6eF8gPSAwLjA7CisKKy8vIEEgZGVyaXZlZCBjbGFzcyBmb3IgdGVzdGluZyBQcm9wZXJ0eSgpLgorY2xhc3MgRGVyaXZlZENsYXNzIDogcHVibGljIEFDbGFzcyB7CisgcHVibGljOgorICBpbnQgaygpIGNvbnN0IHsgcmV0dXJuIGtfOyB9CisgcHJpdmF0ZToKKyAgaW50IGtfOworfTsKKworLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgmRm9vOjpwcm9wZXJ0eSwgLi4uKSB3b3JrcyB3aGVuIHByb3BlcnR5KCkKKy8vIHJldHVybnMgYSBub24tcmVmZXJlbmNlLgorVEVTVChQcm9wZXJ0eVRlc3QsIFdvcmtzRm9yTm9uUmVmZXJlbmNlUHJvcGVydHkpIHsKKyAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6biwgR2UoMCkpOworCisgIEFDbGFzcyBhOworICBhLnNldF9uKDEpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoYSkpOworCisgIGEuc2V0X24oLTEpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgmRm9vOjpwcm9wZXJ0eSwgLi4uKSB3b3JrcyB3aGVuIHByb3BlcnR5KCkKKy8vIHJldHVybnMgYSByZWZlcmVuY2UgdG8gY29uc3QuCitURVNUKFByb3BlcnR5VGVzdCwgV29ya3NGb3JSZWZlcmVuY2VUb0NvbnN0UHJvcGVydHkpIHsKKyAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6cywgU3RhcnRzV2l0aCgiaGkiKSk7CisKKyAgQUNsYXNzIGE7CisgIGEuc2V0X3MoImhpbGwiKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKKworICBhLnNldF9zKCJob2xlIik7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoYSkpOworfQorCisvLyBUZXN0cyB0aGF0IFByb3BlcnR5KCZGb286OnByb3BlcnR5LCAuLi4pIHdvcmtzIHdoZW4gcHJvcGVydHkoKQorLy8gcmV0dXJucyBhIHJlZmVyZW5jZSB0byBub24tY29uc3QuCitURVNUKFByb3BlcnR5VGVzdCwgV29ya3NGb3JSZWZlcmVuY2VUb05vbkNvbnN0UHJvcGVydHkpIHsKKyAgZG91YmxlIHggPSAwLjA7CisgIEFDbGFzcyBhOworCisgIE1hdGNoZXI8Y29uc3QgQUNsYXNzJj4gbSA9IFByb3BlcnR5KCZBQ2xhc3M6OngsIFJlZih4KSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoYSkpOworCisgIG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjp4LCBOb3QoUmVmKHgpKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUHJvcGVydHkoJkZvbzo6cHJvcGVydHksIC4uLikgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQgaXMKKy8vIHBhc3NlZCBieSB2YWx1ZS4KK1RFU1QoUHJvcGVydHlUZXN0LCBXb3Jrc0ZvckJ5VmFsdWVBcmd1bWVudCkgeworICBNYXRjaGVyPEFDbGFzcz4gbSA9IFByb3BlcnR5KCZBQ2xhc3M6OnMsIFN0YXJ0c1dpdGgoImhpIikpOworCisgIEFDbGFzcyBhOworICBhLnNldF9zKCJoaWxsIik7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhhKSk7CisKKyAgYS5zZXRfcygiaG9sZSIpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKGEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgmRm9vOjpwcm9wZXJ0eSwgLi4uKSB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCdzCisvLyB0eXBlIGlzIGEgc3ViLXR5cGUgb2YgRm9vLgorVEVTVChQcm9wZXJ0eVRlc3QsIFdvcmtzRm9yQXJndW1lbnRPZlN1YlR5cGUpIHsKKyAgLy8gVGhlIG1hdGNoZXIgZXhwZWN0cyBhIERlcml2ZWRDbGFzcywgYnV0IGluc2lkZSB0aGUgUHJvcGVydHkoKSB3ZQorICAvLyBzYXkgQUNsYXNzLgorICBNYXRjaGVyPGNvbnN0IERlcml2ZWRDbGFzcyY+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7CisKKyAgRGVyaXZlZENsYXNzIGQ7CisgIGQuc2V0X24oMSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhkKSk7CisKKyAgZC5zZXRfbigtMSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoZCkpOworfQorCisvLyBUZXN0cyB0aGF0IFByb3BlcnR5KCZGb286OnByb3BlcnR5LCBtKSB3b3JrcyB3aGVuIHByb3BlcnR5KCkncyB0eXBlCisvLyBhbmQgbSdzIGFyZ3VtZW50IHR5cGUgYXJlIGNvbXBhdGlibGUgYnV0IGRpZmZlcmVudC4KK1RFU1QoUHJvcGVydHlUZXN0LCBXb3Jrc0ZvckNvbXBhdGlibGVNYXRjaGVyVHlwZSkgeworICAvLyBuKCkgcmV0dXJucyBhbiBpbnQgYnV0IHRoZSBpbm5lciBtYXRjaGVyIGV4cGVjdHMgYSBzaWduZWQgY2hhci4KKyAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcjxzaWduZWQgY2hhcj4oR2UoMCkpKTsKKworICBBQ2xhc3MgYTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGEpKTsKKyAgYS5zZXRfbigtMSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXMoYSkpOworfQorCisvLyBUZXN0cyB0aGF0IFByb3BlcnR5KCkgY2FuIGRlc2NyaWJlIGl0c2VsZi4KK1RFU1QoUHJvcGVydHlUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6biwgR2UoMCkpOworCisgIEVYUEVDVF9FUSgiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5IGlzID49IDAiLCBEZXNjcmliZShtKSk7CisgIEVYUEVDVF9FUSgiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5IGlzbid0ID49IDAiLAorICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUHJvcGVydHkoKSBjYW4gZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0LgorVEVTVChQcm9wZXJ0eVRlc3QsIENhbkV4cGxhaW5NYXRjaFJlc3VsdCkgeworICBNYXRjaGVyPGNvbnN0IEFDbGFzcyY+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7CisKKyAgQUNsYXNzIGE7CisgIGEuc2V0X24oMSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgMSIgKyBPZlR5cGUoImludCIpLCBFeHBsYWluKG0sIGEpKTsKKworICBtID0gUHJvcGVydHkoJkFDbGFzczo6biwgR3JlYXRlclRoYW4oMCkpOworICBFWFBFQ1RfRVEoCisgICAgICAid2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgMSIgKyBPZlR5cGUoImludCIpICsgIiwgd2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsCisgICAgICBFeHBsYWluKG0sIGEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgpIHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBjb25zdC4KK1RFU1QoUHJvcGVydHlGb3JQb2ludGVyVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Db25zdCkgeworICBNYXRjaGVyPGNvbnN0IEFDbGFzcyo+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7CisKKyAgQUNsYXNzIGE7CisgIGEuc2V0X24oMSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygmYSkpOworCisgIGEuc2V0X24oLTEpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUHJvcGVydHkoKSB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gbm9uLWNvbnN0LgorVEVTVChQcm9wZXJ0eUZvclBvaW50ZXJUZXN0LCBXb3Jrc0ZvclBvaW50ZXJUb05vbkNvbnN0KSB7CisgIE1hdGNoZXI8QUNsYXNzKj4gbSA9IFByb3BlcnR5KCZBQ2xhc3M6OnMsIFN0YXJ0c1dpdGgoImhpIikpOworCisgIEFDbGFzcyBhOworICBhLnNldF9zKCJoaWxsIik7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygmYSkpOworCisgIGEuc2V0X3MoImhvbGUiKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcygmYSkpOworfQorCisvLyBUZXN0cyB0aGF0IFByb3BlcnR5KCkgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYQorLy8gY29uc3QgcG9pbnRlci4KK1RFU1QoUHJvcGVydHlGb3JQb2ludGVyVGVzdCwgV29ya3NGb3JSZWZlcmVuY2VUb0NvbnN0UG9pbnRlcikgeworICBNYXRjaGVyPEFDbGFzcyogY29uc3QmPiBtID0gUHJvcGVydHkoJkFDbGFzczo6cywgU3RhcnRzV2l0aCgiaGkiKSk7CisKKyAgQUNsYXNzIGE7CisgIGEuc2V0X3MoImhpbGwiKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKCZhKSk7CisKKyAgYS5zZXRfcygiaG9sZSIpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZhKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUHJvcGVydHkoKSBkb2VzIG5vdCBtYXRjaCB0aGUgTlVMTCBwb2ludGVyLgorVEVTVChQcm9wZXJ0eUZvclBvaW50ZXJUZXN0LCBXb3Jrc0ZvclJlZmVyZW5jZVRvTm9uQ29uc3RQcm9wZXJ0eSkgeworICBNYXRjaGVyPGNvbnN0IEFDbGFzcyo+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjp4LCBfKTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyhOVUxMKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUHJvcGVydHkoJkZvbzo6cHJvcGVydHksIC4uLikgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQncworLy8gdHlwZSBpcyBhIHN1Yi10eXBlIG9mIGNvbnN0IEZvbyouCitURVNUKFByb3BlcnR5Rm9yUG9pbnRlclRlc3QsIFdvcmtzRm9yQXJndW1lbnRPZlN1YlR5cGUpIHsKKyAgLy8gVGhlIG1hdGNoZXIgZXhwZWN0cyBhIERlcml2ZWRDbGFzcywgYnV0IGluc2lkZSB0aGUgUHJvcGVydHkoKSB3ZQorICAvLyBzYXkgQUNsYXNzLgorICBNYXRjaGVyPGNvbnN0IERlcml2ZWRDbGFzcyo+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7CisKKyAgRGVyaXZlZENsYXNzIGQ7CisgIGQuc2V0X24oMSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygmZCkpOworCisgIGQuc2V0X24oLTEpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKCZkKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUHJvcGVydHkoKSBjYW4gZGVzY3JpYmUgaXRzZWxmIHdoZW4gdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuCitURVNUKFByb3BlcnR5Rm9yUG9pbnRlclRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPGNvbnN0IEFDbGFzcyo+IG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHZSgwKSk7CisKKyAgRVhQRUNUX0VRKCJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgPj0gMCIsIERlc2NyaWJlKG0pKTsKKyAgRVhQRUNUX0VRKCJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXNuJ3QgPj0gMCIsCisgICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKK30KKworLy8gVGVzdHMgdGhhdCBQcm9wZXJ0eSgpIGNhbiBleHBsYWluIHRoZSByZXN1bHQgb2YgbWF0Y2hpbmcgYSBwb2ludGVyLgorVEVTVChQcm9wZXJ0eUZvclBvaW50ZXJUZXN0LCBDYW5FeHBsYWluTWF0Y2hSZXN1bHQpIHsKKyAgTWF0Y2hlcjxjb25zdCBBQ2xhc3MqPiBtID0gUHJvcGVydHkoJkFDbGFzczo6biwgR2UoMCkpOworCisgIEFDbGFzcyBhOworICBhLnNldF9uKDEpOworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgc3RhdGljX2Nhc3Q8Y29uc3QgQUNsYXNzKj4oTlVMTCkpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgMSIgKyBPZlR5cGUoImludCIpLAorICAgICAgRXhwbGFpbihtLCAmYSkpOworCisgIG0gPSBQcm9wZXJ0eSgmQUNsYXNzOjpuLCBHcmVhdGVyVGhhbigwKSk7CisgIEVYUEVDVF9FUSgid2hpY2ggcG9pbnRzIHRvIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBwcm9wZXJ0eSBpcyAxIiArCisgICAgICAgICAgICBPZlR5cGUoImludCIpICsgIiwgd2hpY2ggaXMgMSBtb3JlIHRoYW4gMCIsCisgICAgICAgICAgICBFeHBsYWluKG0sICZhKSk7Cit9CisKKy8vIFRlc3RzIFJlc3VsdE9mLgorCisvLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZiBpcyBhCisvLyBmdW5jdGlvbiBwb2ludGVyLgorc3RyaW5nIEludFRvU3RyaW5nRnVuY3Rpb24oaW50IGlucHV0KSB7IHJldHVybiBpbnB1dCA9PSAxID8gImZvbyIgOiAiYmFyIjsgfQorCitURVNUKFJlc3VsdE9mVGVzdCwgV29ya3NGb3JGdW5jdGlvblBvaW50ZXJzKSB7CisgIE1hdGNoZXI8aW50PiBtYXRjaGVyID0gUmVzdWx0T2YoJkludFRvU3RyaW5nRnVuY3Rpb24sIEVxKHN0cmluZygiZm9vIikpKTsKKworICBFWFBFQ1RfVFJVRShtYXRjaGVyLk1hdGNoZXMoMSkpOworICBFWFBFQ1RfRkFMU0UobWF0Y2hlci5NYXRjaGVzKDIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZXN1bHRPZigpIGNhbiBkZXNjcmliZSBpdHNlbGYuCitURVNUKFJlc3VsdE9mVGVzdCwgQ2FuRGVzY3JpYmVJdHNlbGYpIHsKKyAgTWF0Y2hlcjxpbnQ+IG1hdGNoZXIgPSBSZXN1bHRPZigmSW50VG9TdHJpbmdGdW5jdGlvbiwgU3RyRXEoImZvbyIpKTsKKworICBFWFBFQ1RfRVEoImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICIKKyAgICAgICAgICAgICJpcyBlcXVhbCB0byBcImZvb1wiIiwgRGVzY3JpYmUobWF0Y2hlcikpOworICBFWFBFQ1RfRVEoImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICIKKyAgICAgICAgICAgICJpc24ndCBlcXVhbCB0byBcImZvb1wiIiwgRGVzY3JpYmVOZWdhdGlvbihtYXRjaGVyKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmVzdWx0T2YoKSBjYW4gZXhwbGFpbiB0aGUgbWF0Y2ggcmVzdWx0LgoraW50IEludEZ1bmN0aW9uKGludCBpbnB1dCkgeyByZXR1cm4gaW5wdXQgPT0gNDIgPyA4MCA6IDkwOyB9CisKK1RFU1QoUmVzdWx0T2ZUZXN0LCBDYW5FeHBsYWluTWF0Y2hSZXN1bHQpIHsKKyAgTWF0Y2hlcjxpbnQ+IG1hdGNoZXIgPSBSZXN1bHRPZigmSW50RnVuY3Rpb24sIEdlKDg1KSk7CisgIEVYUEVDVF9FUSgid2hpY2ggaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byA5MCIgKyBPZlR5cGUoImludCIpLAorICAgICAgICAgICAgRXhwbGFpbihtYXRjaGVyLCAzNikpOworCisgIG1hdGNoZXIgPSBSZXN1bHRPZigmSW50RnVuY3Rpb24sIEdyZWF0ZXJUaGFuKDg1KSk7CisgIEVYUEVDVF9FUSgid2hpY2ggaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byA5MCIgKyBPZlR5cGUoImludCIpICsKKyAgICAgICAgICAgICIsIHdoaWNoIGlzIDUgbW9yZSB0aGFuIDg1IiwgRXhwbGFpbihtYXRjaGVyLCAzNikpOworfQorCisvLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZih4KQorLy8gcmV0dXJucyBhIG5vbi1yZWZlcmVuY2UuCitURVNUKFJlc3VsdE9mVGVzdCwgV29ya3NGb3JOb25SZWZlcmVuY2VSZXN1bHRzKSB7CisgIE1hdGNoZXI8aW50PiBtYXRjaGVyID0gUmVzdWx0T2YoJkludEZ1bmN0aW9uLCBFcSg4MCkpOworCisgIEVYUEVDVF9UUlVFKG1hdGNoZXIuTWF0Y2hlcyg0MikpOworICBFWFBFQ1RfRkFMU0UobWF0Y2hlci5NYXRjaGVzKDM2KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmVzdWx0T2YoZiwgLi4uKSBjb21waWxlcyBhbmQgd29ya3MgYXMgZXhwZWN0ZWQgd2hlbiBmKHgpCisvLyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIG5vbi1jb25zdC4KK2RvdWJsZSYgRG91YmxlRnVuY3Rpb24oZG91YmxlJiBpbnB1dCkgeyByZXR1cm4gaW5wdXQ7IH0gIC8vIE5PTElOVAorCitVbmNvcHlhYmxlJiBSZWZVbmNvcHlhYmxlRnVuY3Rpb24oVW5jb3B5YWJsZSYgb2JqKSB7ICAvLyBOT0xJTlQKKyAgcmV0dXJuIG9iajsKK30KKworVEVTVChSZXN1bHRPZlRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlVG9Ob25Db25zdFJlc3VsdHMpIHsKKyAgZG91YmxlIHggPSAzLjE0OworICBkb3VibGUgeDIgPSB4OworICBNYXRjaGVyPGRvdWJsZSY+IG1hdGNoZXIgPSBSZXN1bHRPZigmRG91YmxlRnVuY3Rpb24sIFJlZih4KSk7CisKKyAgRVhQRUNUX1RSVUUobWF0Y2hlci5NYXRjaGVzKHgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1hdGNoZXIuTWF0Y2hlcyh4MikpOworCisgIC8vIFRlc3QgdGhhdCBSZXN1bHRPZiB3b3JrcyB3aXRoIHVuY29weWFibGUgb2JqZWN0cworICBVbmNvcHlhYmxlIG9iaigwKTsKKyAgVW5jb3B5YWJsZSBvYmoyKDApOworICBNYXRjaGVyPFVuY29weWFibGUmPiBtYXRjaGVyMiA9CisgICAgICBSZXN1bHRPZigmUmVmVW5jb3B5YWJsZUZ1bmN0aW9uLCBSZWYob2JqKSk7CisKKyAgRVhQRUNUX1RSVUUobWF0Y2hlcjIuTWF0Y2hlcyhvYmopKTsKKyAgRVhQRUNUX0ZBTFNFKG1hdGNoZXIyLk1hdGNoZXMob2JqMikpOworfQorCisvLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZih4KQorLy8gcmV0dXJucyBhIHJlZmVyZW5jZSB0byBjb25zdC4KK2NvbnN0IHN0cmluZyYgU3RyaW5nRnVuY3Rpb24oY29uc3Qgc3RyaW5nJiBpbnB1dCkgeyByZXR1cm4gaW5wdXQ7IH0KKworVEVTVChSZXN1bHRPZlRlc3QsIFdvcmtzRm9yUmVmZXJlbmNlVG9Db25zdFJlc3VsdHMpIHsKKyAgc3RyaW5nIHMgPSAiZm9vIjsKKyAgc3RyaW5nIHMyID0gczsKKyAgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPiBtYXRjaGVyID0gUmVzdWx0T2YoJlN0cmluZ0Z1bmN0aW9uLCBSZWYocykpOworCisgIEVYUEVDVF9UUlVFKG1hdGNoZXIuTWF0Y2hlcyhzKSk7CisgIEVYUEVDVF9GQUxTRShtYXRjaGVyLk1hdGNoZXMoczIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBSZXN1bHRPZihmLCBtKSB3b3JrcyB3aGVuIGYoeCkgYW5kIG0ncworLy8gYXJndW1lbnQgdHlwZXMgYXJlIGNvbXBhdGlibGUgYnV0IGRpZmZlcmVudC4KK1RFU1QoUmVzdWx0T2ZUZXN0LCBXb3Jrc0ZvckNvbXBhdGlibGVNYXRjaGVyVHlwZXMpIHsKKyAgLy8gSW50RnVuY3Rpb24oKSByZXR1cm5zIGludCBidXQgdGhlIGlubmVyIG1hdGNoZXIgZXhwZWN0cyBhIHNpZ25lZCBjaGFyLgorICBNYXRjaGVyPGludD4gbWF0Y2hlciA9IFJlc3VsdE9mKEludEZ1bmN0aW9uLCBNYXRjaGVyPHNpZ25lZCBjaGFyPihHZSg4NSkpKTsKKworICBFWFBFQ1RfVFJVRShtYXRjaGVyLk1hdGNoZXMoMzYpKTsKKyAgRVhQRUNUX0ZBTFNFKG1hdGNoZXIuTWF0Y2hlcyg0MikpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBwcm9ncmFtIGFib3J0cyB3aGVuIFJlc3VsdE9mIGlzIHBhc3NlZAorLy8gYSBOVUxMIGZ1bmN0aW9uIHBvaW50ZXIuCitURVNUKFJlc3VsdE9mRGVhdGhUZXN0LCBEaWVzT25OdWxsRnVuY3Rpb25Qb2ludGVycykgeworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgUmVzdWx0T2Yoc3RhdGljX2Nhc3Q8c3RyaW5nKCopKGludCBkdW1teSk+KE5VTEwpLCBFcShzdHJpbmcoImZvbyIpKSksCisgICAgICAgICAgICAgICAiTlVMTCBmdW5jdGlvbiBwb2ludGVyIGlzIHBhc3NlZCBpbnRvIFJlc3VsdE9mXFwoXFwpXFwuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmVzdWx0T2YoZiwgLi4uKSBjb21waWxlcyBhbmQgd29ya3MgYXMgZXhwZWN0ZWQgd2hlbiBmIGlzIGEKKy8vIGZ1bmN0aW9uIHJlZmVyZW5jZS4KK1RFU1QoUmVzdWx0T2ZUZXN0LCBXb3Jrc0ZvckZ1bmN0aW9uUmVmZXJlbmNlcykgeworICBNYXRjaGVyPGludD4gbWF0Y2hlciA9IFJlc3VsdE9mKEludFRvU3RyaW5nRnVuY3Rpb24sIFN0ckVxKCJmb28iKSk7CisgIEVYUEVDVF9UUlVFKG1hdGNoZXIuTWF0Y2hlcygxKSk7CisgIEVYUEVDVF9GQUxTRShtYXRjaGVyLk1hdGNoZXMoMikpOworfQorCisvLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZiBpcyBhCisvLyBmdW5jdGlvbiBvYmplY3QuCitzdHJ1Y3QgRnVuY3RvciA6IHB1YmxpYyA6OnN0ZDo6dW5hcnlfZnVuY3Rpb248aW50LCBzdHJpbmc+IHsKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShhcmd1bWVudF90eXBlIGlucHV0KSBjb25zdCB7CisgICAgcmV0dXJuIEludFRvU3RyaW5nRnVuY3Rpb24oaW5wdXQpOworICB9Cit9OworCitURVNUKFJlc3VsdE9mVGVzdCwgV29ya3NGb3JGdW5jdG9ycykgeworICBNYXRjaGVyPGludD4gbWF0Y2hlciA9IFJlc3VsdE9mKEZ1bmN0b3IoKSwgRXEoc3RyaW5nKCJmb28iKSkpOworCisgIEVYUEVDVF9UUlVFKG1hdGNoZXIuTWF0Y2hlcygxKSk7CisgIEVYUEVDVF9GQUxTRShtYXRjaGVyLk1hdGNoZXMoMikpOworfQorCisvLyBUZXN0cyB0aGF0IFJlc3VsdE9mKGYsIC4uLikgY29tcGlsZXMgYW5kIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gZiBpcyBhCisvLyBmdW5jdG9yIHdpdGggbW9yZSB0aGVuIG9uZSBvcGVyYXRvcigpIGRlZmluZWQuIFJlc3VsdE9mKCkgbXVzdCB3b3JrCisvLyBmb3IgZWFjaCBkZWZpbmVkIG9wZXJhdG9yKCkuCitzdHJ1Y3QgUG9seW1vcnBoaWNGdW5jdG9yIHsKKyAgdHlwZWRlZiBpbnQgcmVzdWx0X3R5cGU7CisgIGludCBvcGVyYXRvcigpKGludCBuKSB7IHJldHVybiBuOyB9CisgIGludCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc3RybGVuKHMpKTsgfQorfTsKKworVEVTVChSZXN1bHRPZlRlc3QsIFdvcmtzRm9yUG9seW1vcnBoaWNGdW5jdG9ycykgeworICBNYXRjaGVyPGludD4gbWF0Y2hlcl9pbnQgPSBSZXN1bHRPZihQb2x5bW9ycGhpY0Z1bmN0b3IoKSwgR2UoNSkpOworCisgIEVYUEVDVF9UUlVFKG1hdGNoZXJfaW50Lk1hdGNoZXMoMTApKTsKKyAgRVhQRUNUX0ZBTFNFKG1hdGNoZXJfaW50Lk1hdGNoZXMoMikpOworCisgIE1hdGNoZXI8Y29uc3QgY2hhcio+IG1hdGNoZXJfc3RyaW5nID0gUmVzdWx0T2YoUG9seW1vcnBoaWNGdW5jdG9yKCksIEdlKDUpKTsKKworICBFWFBFQ1RfVFJVRShtYXRjaGVyX3N0cmluZy5NYXRjaGVzKCJsb25nIHN0cmluZyIpKTsKKyAgRVhQRUNUX0ZBTFNFKG1hdGNoZXJfc3RyaW5nLk1hdGNoZXMoInNocnQiKSk7Cit9CisKK2NvbnN0IGludCogUmVmZXJlbmNpbmdGdW5jdGlvbihjb25zdCBpbnQmIG4pIHsgcmV0dXJuICZuOyB9CisKK3N0cnVjdCBSZWZlcmVuY2luZ0Z1bmN0b3IgeworICB0eXBlZGVmIGNvbnN0IGludCogcmVzdWx0X3R5cGU7CisgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgaW50JiBuKSB7IHJldHVybiAmbjsgfQorfTsKKworVEVTVChSZXN1bHRPZlRlc3QsIFdvcmtzRm9yUmVmZXJlbmNpbmdDYWxsYWJsZXMpIHsKKyAgY29uc3QgaW50IG4gPSAxOworICBjb25zdCBpbnQgbjIgPSAxOworICBNYXRjaGVyPGNvbnN0IGludCY+IG1hdGNoZXIyID0gUmVzdWx0T2YoUmVmZXJlbmNpbmdGdW5jdGlvbiwgRXEoJm4pKTsKKyAgRVhQRUNUX1RSVUUobWF0Y2hlcjIuTWF0Y2hlcyhuKSk7CisgIEVYUEVDVF9GQUxTRShtYXRjaGVyMi5NYXRjaGVzKG4yKSk7CisKKyAgTWF0Y2hlcjxjb25zdCBpbnQmPiBtYXRjaGVyMyA9IFJlc3VsdE9mKFJlZmVyZW5jaW5nRnVuY3RvcigpLCBFcSgmbikpOworICBFWFBFQ1RfVFJVRShtYXRjaGVyMy5NYXRjaGVzKG4pKTsKKyAgRVhQRUNUX0ZBTFNFKG1hdGNoZXIzLk1hdGNoZXMobjIpKTsKK30KKworY2xhc3MgRGl2aXNpYmxlQnlJbXBsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERpdmlzaWJsZUJ5SW1wbChpbnQgYV9kaXZpZGVyKSA6IGRpdmlkZXJfKGFfZGl2aWRlcikge30KKworICAvLyBGb3IgdGVzdGluZyB1c2luZyBFeHBsYWluTWF0Y2hSZXN1bHRUbygpIHdpdGggcG9seW1vcnBoaWMgbWF0Y2hlcnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBUJiBuLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgeworICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgIiA8PCAobiAlIGRpdmlkZXJfKSA8PCAiIG1vZHVsbyAiCisgICAgICAgICAgICAgIDw8IGRpdmlkZXJfOworICAgIHJldHVybiAobiAlIGRpdmlkZXJfKSA9PSAwOworICB9CisKKyAgdm9pZCBEZXNjcmliZVRvKG9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBkaXZpc2libGUgYnkgIiA8PCBkaXZpZGVyXzsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKG9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJpcyBub3QgZGl2aXNpYmxlIGJ5ICIgPDwgZGl2aWRlcl87CisgIH0KKworICB2b2lkIHNldF9kaXZpZGVyKGludCBhX2RpdmlkZXIpIHsgZGl2aWRlcl8gPSBhX2RpdmlkZXI7IH0KKyAgaW50IGRpdmlkZXIoKSBjb25zdCB7IHJldHVybiBkaXZpZGVyXzsgfQorCisgcHJpdmF0ZToKKyAgaW50IGRpdmlkZXJfOworfTsKKworUG9seW1vcnBoaWNNYXRjaGVyPERpdmlzaWJsZUJ5SW1wbD4gRGl2aXNpYmxlQnkoaW50IG4pIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoRGl2aXNpYmxlQnlJbXBsKG4pKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aGVuIEFsbE9mKCkgZmFpbHMsIG9ubHkgdGhlIGZpcnN0IGZhaWxpbmcgbWF0Y2hlciBpcworLy8gYXNrZWQgdG8gZXhwbGFpbiB3aHkuCitURVNUKEV4cGxhaW5NYXRjaFJlc3VsdFRlc3QsIEFsbE9mX0ZhbHNlX0ZhbHNlKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoRGl2aXNpYmxlQnkoNCksIERpdmlzaWJsZUJ5KDMpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyAxIG1vZHVsbyA0IiwgRXhwbGFpbihtLCA1KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBBbGxPZigpIGZhaWxzLCBvbmx5IHRoZSBmaXJzdCBmYWlsaW5nIG1hdGNoZXIgaXMKKy8vIGFza2VkIHRvIGV4cGxhaW4gd2h5LgorVEVTVChFeHBsYWluTWF0Y2hSZXN1bHRUZXN0LCBBbGxPZl9GYWxzZV9UcnVlKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoRGl2aXNpYmxlQnkoNCksIERpdmlzaWJsZUJ5KDMpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyAyIG1vZHVsbyA0IiwgRXhwbGFpbihtLCA2KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBBbGxPZigpIGZhaWxzLCBvbmx5IHRoZSBmaXJzdCBmYWlsaW5nIG1hdGNoZXIgaXMKKy8vIGFza2VkIHRvIGV4cGxhaW4gd2h5LgorVEVTVChFeHBsYWluTWF0Y2hSZXN1bHRUZXN0LCBBbGxPZl9UcnVlX0ZhbHNlKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoR2UoMSksIERpdmlzaWJsZUJ5KDMpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyAyIG1vZHVsbyAzIiwgRXhwbGFpbihtLCA1KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBBbGxPZigpIHN1Y2NlZWRzLCBhbGwgbWF0Y2hlcnMgYXJlIGFza2VkIHRvIGV4cGxhaW4KKy8vIHdoeS4KK1RFU1QoRXhwbGFpbk1hdGNoUmVzdWx0VGVzdCwgQWxsT2ZfVHJ1ZV9UcnVlKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoRGl2aXNpYmxlQnkoMiksIERpdmlzaWJsZUJ5KDMpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyAwIG1vZHVsbyAyLCBhbmQgd2hpY2ggaXMgMCBtb2R1bG8gMyIsIEV4cGxhaW4obSwgNikpOworfQorCitURVNUKEV4cGxhaW5NYXRjaFJlc3VsdFRlc3QsIEFsbE9mX1RydWVfVHJ1ZV8yKSB7CisgIGNvbnN0IE1hdGNoZXI8aW50PiBtID0gQWxsT2YoR2UoMiksIExlKDMpKTsKKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIDIpKTsKK30KKworVEVTVChFeHBsYWlubWF0Y2hlclJlc3VsdFRlc3QsIE1vbm9tb3JwaGljTWF0Y2hlcikgeworICBjb25zdCBNYXRjaGVyPGludD4gbSA9IEdyZWF0ZXJUaGFuKDUpOworICBFWFBFQ1RfRVEoIndoaWNoIGlzIDEgbW9yZSB0aGFuIDUiLCBFeHBsYWluKG0sIDYpKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gdGVzdHMgdmVyaWZ5IHRoYXQgdmFsdWVzIHdpdGhvdXQgYSBwdWJsaWMgY29weQorLy8gY3RvciBjYW4gYmUgdXNlZCBhcyBhcmd1bWVudHMgdG8gbWF0Y2hlcnMgbGlrZSBFcSgpLCBHZSgpLCBhbmQgZXRjCisvLyB3aXRoIHRoZSBoZWxwIG9mIEJ5UmVmKCkuCisKK2NsYXNzIE5vdENvcHlhYmxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE5vdENvcHlhYmxlKGludCBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorCisgIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOb3RDb3B5YWJsZSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlKCkgPT0gcmhzLnZhbHVlKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPj0oY29uc3QgTm90Q29weWFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiB2YWx1ZSgpID49IHJocy52YWx1ZSgpOworICB9CisgcHJpdmF0ZToKKyAgaW50IHZhbHVlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5vdENvcHlhYmxlKTsKK307CisKK1RFU1QoQnlSZWZUZXN0LCBBbGxvd3NOb3RDb3B5YWJsZUNvbnN0VmFsdWVJbk1hdGNoZXJzKSB7CisgIGNvbnN0IE5vdENvcHlhYmxlIGNvbnN0X3ZhbHVlMSgxKTsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBOb3RDb3B5YWJsZSY+IG0gPSBFcShCeVJlZihjb25zdF92YWx1ZTEpKTsKKworICBjb25zdCBOb3RDb3B5YWJsZSBuMSgxKSwgbjIoMik7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuMSkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG4yKSk7Cit9CisKK1RFU1QoQnlSZWZUZXN0LCBBbGxvd3NOb3RDb3B5YWJsZVZhbHVlSW5NYXRjaGVycykgeworICBOb3RDb3B5YWJsZSB2YWx1ZTIoMik7CisgIGNvbnN0IE1hdGNoZXI8Tm90Q29weWFibGUmPiBtID0gR2UoQnlSZWYodmFsdWUyKSk7CisKKyAgTm90Q29weWFibGUgbjEoMSksIG4yKDIpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKG4xKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhuMikpOworfQorCitURVNUKElzRW1wdHlUZXN0LCBJbXBsZW1lbnRzSXNFbXB0eSkgeworICB2ZWN0b3I8aW50PiBjb250YWluZXI7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgSXNFbXB0eSgpKTsKKyAgY29udGFpbmVyLnB1c2hfYmFjaygwKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoSXNFbXB0eSgpKSk7CisgIGNvbnRhaW5lci5wdXNoX2JhY2soMSk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KElzRW1wdHkoKSkpOworfQorCitURVNUKElzRW1wdHlUZXN0LCBXb3Jrc1dpdGhTdHJpbmcpIHsKKyAgc3RyaW5nIHRleHQ7CisgIEVYUEVDVF9USEFUKHRleHQsIElzRW1wdHkoKSk7CisgIHRleHQgPSAiZm9vIjsKKyAgRVhQRUNUX1RIQVQodGV4dCwgTm90KElzRW1wdHkoKSkpOworICB0ZXh0ID0gc3RyaW5nKCJcMCIsIDEpOworICBFWFBFQ1RfVEhBVCh0ZXh0LCBOb3QoSXNFbXB0eSgpKSk7Cit9CisKK1RFU1QoSXNFbXB0eVRlc3QsIENhbkRlc2NyaWJlU2VsZikgeworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbSA9IElzRW1wdHkoKTsKKyAgRVhQRUNUX0VRKCJpcyBlbXB0eSIsIERlc2NyaWJlKG0pKTsKKyAgRVhQRUNUX0VRKCJpc24ndCBlbXB0eSIsIERlc2NyaWJlTmVnYXRpb24obSkpOworfQorCitURVNUKElzRW1wdHlUZXN0LCBFeHBsYWluc1Jlc3VsdCkgeworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbSA9IElzRW1wdHkoKTsKKyAgdmVjdG9yPGludD4gY29udGFpbmVyOworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgY29udGFpbmVyKSk7CisgIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7CisgIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSBpcyAxIiwgRXhwbGFpbihtLCBjb250YWluZXIpKTsKK30KKworVEVTVChTaXplSXNUZXN0LCBJbXBsZW1lbnRzU2l6ZUlzKSB7CisgIHZlY3RvcjxpbnQ+IGNvbnRhaW5lcjsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBTaXplSXMoMCkpOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChTaXplSXMoMSkpKTsKKyAgY29udGFpbmVyLnB1c2hfYmFjaygwKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoU2l6ZUlzKDApKSk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKDEpKTsKKyAgY29udGFpbmVyLnB1c2hfYmFjaygwKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoU2l6ZUlzKDApKSk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKDIpKTsKK30KKworVEVTVChTaXplSXNUZXN0LCBXb3Jrc1dpdGhNYXApIHsKKyAgbWFwPHN0cmluZywgaW50PiBjb250YWluZXI7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKDApKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBOb3QoU2l6ZUlzKDEpKSk7CisgIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKCJmb28iLCAxKSk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KFNpemVJcygwKSkpOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIFNpemVJcygxKSk7CisgIGNvbnRhaW5lci5pbnNlcnQobWFrZV9wYWlyKCJiYXIiLCAyKSk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KFNpemVJcygwKSkpOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIFNpemVJcygyKSk7Cit9CisKK1RFU1QoU2l6ZUlzVGVzdCwgV29ya3NXaXRoUmVmZXJlbmNlcykgeworICB2ZWN0b3I8aW50PiBjb250YWluZXI7CisgIE1hdGNoZXI8Y29uc3QgdmVjdG9yPGludD4mPiBtID0gU2l6ZUlzKDEpOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChtKSk7CisgIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgbSk7Cit9CisKK1RFU1QoU2l6ZUlzVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gU2l6ZUlzKDIpOworICBFWFBFQ1RfRVEoInNpemUgaXMgZXF1YWwgdG8gMiIsIERlc2NyaWJlKG0pKTsKKyAgRVhQRUNUX0VRKCJzaXplIGlzbid0IGVxdWFsIHRvIDIiLCBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKK30KKworVEVTVChTaXplSXNUZXN0LCBFeHBsYWluc1Jlc3VsdCkgeworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTEgPSBTaXplSXMoMik7CisgIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtMiA9IFNpemVJcyhMdCgydSkpOworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTMgPSBTaXplSXMoQW55T2YoMCwgMykpOworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTQgPSBTaXplSXMoR3JlYXRlclRoYW4oMSkpOworICB2ZWN0b3I8aW50PiBjb250YWluZXI7CisgIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSAwIGRvZXNuJ3QgbWF0Y2giLCBFeHBsYWluKG0xLCBjb250YWluZXIpKTsKKyAgRVhQRUNUX0VRKCJ3aG9zZSBzaXplIDAgbWF0Y2hlcyIsIEV4cGxhaW4obTIsIGNvbnRhaW5lcikpOworICBFWFBFQ1RfRVEoIndob3NlIHNpemUgMCBtYXRjaGVzIiwgRXhwbGFpbihtMywgY29udGFpbmVyKSk7CisgIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSAwIGRvZXNuJ3QgbWF0Y2gsIHdoaWNoIGlzIDEgbGVzcyB0aGFuIDEiLAorICAgICAgICAgICAgRXhwbGFpbihtNCwgY29udGFpbmVyKSk7CisgIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7CisgIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7CisgIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSAyIG1hdGNoZXMiLCBFeHBsYWluKG0xLCBjb250YWluZXIpKTsKKyAgRVhQRUNUX0VRKCJ3aG9zZSBzaXplIDIgZG9lc24ndCBtYXRjaCIsIEV4cGxhaW4obTIsIGNvbnRhaW5lcikpOworICBFWFBFQ1RfRVEoIndob3NlIHNpemUgMiBkb2Vzbid0IG1hdGNoIiwgRXhwbGFpbihtMywgY29udGFpbmVyKSk7CisgIEVYUEVDVF9FUSgid2hvc2Ugc2l6ZSAyIG1hdGNoZXMsIHdoaWNoIGlzIDEgbW9yZSB0aGFuIDEiLAorICAgICAgICAgICAgRXhwbGFpbihtNCwgY29udGFpbmVyKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorLy8gVGVzdHMgQ29udGFpbmVyRXEgd2l0aCBkaWZmZXJlbnQgY29udGFpbmVyIHR5cGVzLCBhbmQKKy8vIGRpZmZlcmVudCBlbGVtZW50IHR5cGVzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIENvbnRhaW5lckVxVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHt9OworCit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPAorICAgIHNldDxpbnQ+LAorICAgIHZlY3RvcjxzaXplX3Q+LAorICAgIG11bHRpc2V0PHNpemVfdD4sCisgICAgbGlzdDxpbnQ+ID4KKyAgICBDb250YWluZXJFcVRlc3RUeXBlczsKKworVFlQRURfVEVTVF9DQVNFKENvbnRhaW5lckVxVGVzdCwgQ29udGFpbmVyRXFUZXN0VHlwZXMpOworCisvLyBUZXN0cyB0aGF0IHRoZSBmaWxsZWQgY29udGFpbmVyIGlzIGVxdWFsIHRvIGl0c2VsZi4KK1RZUEVEX1RFU1QoQ29udGFpbmVyRXFUZXN0LCBFcXVhbHNTZWxmKSB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsc1tdID0gezEsIDEsIDIsIDMsIDUsIDh9OworICBUeXBlUGFyYW0gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKKyAgY29uc3QgTWF0Y2hlcjxUeXBlUGFyYW0+IG0gPSBDb250YWluZXJFcShteV9zZXQpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobXlfc2V0KSk7CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCBteV9zZXQpKTsKK30KKworLy8gVGVzdHMgdGhhdCBtaXNzaW5nIHZhbHVlcyBhcmUgcmVwb3J0ZWQuCitUWVBFRF9URVNUKENvbnRhaW5lckVxVGVzdCwgVmFsdWVNaXNzaW5nKSB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsc1tdID0gezEsIDEsIDIsIDMsIDUsIDh9OworICBzdGF0aWMgY29uc3QgaW50IHRlc3RfdmFsc1tdID0gezIsIDEsIDgsIDV9OworICBUeXBlUGFyYW0gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKKyAgVHlwZVBhcmFtIHRlc3Rfc2V0KHRlc3RfdmFscywgdGVzdF92YWxzICsgNCk7CisgIGNvbnN0IE1hdGNoZXI8VHlwZVBhcmFtPiBtID0gQ29udGFpbmVyRXEobXlfc2V0KTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3NldCkpOworICBFWFBFQ1RfRVEoIndoaWNoIGRvZXNuJ3QgaGF2ZSB0aGVzZSBleHBlY3RlZCBlbGVtZW50czogMyIsCisgICAgICAgICAgICBFeHBsYWluKG0sIHRlc3Rfc2V0KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYWRkZWQgdmFsdWVzIGFyZSByZXBvcnRlZC4KK1RZUEVEX1RFU1QoQ29udGFpbmVyRXFUZXN0LCBWYWx1ZUFkZGVkKSB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsc1tdID0gezEsIDEsIDIsIDMsIDUsIDh9OworICBzdGF0aWMgY29uc3QgaW50IHRlc3RfdmFsc1tdID0gezEsIDIsIDMsIDUsIDgsIDQ2fTsKKyAgVHlwZVBhcmFtIG15X3NldCh2YWxzLCB2YWxzICsgNik7CisgIFR5cGVQYXJhbSB0ZXN0X3NldCh0ZXN0X3ZhbHMsIHRlc3RfdmFscyArIDYpOworICBjb25zdCBNYXRjaGVyPGNvbnN0IFR5cGVQYXJhbSY+IG0gPSBDb250YWluZXJFcShteV9zZXQpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKHRlc3Rfc2V0KSk7CisgIEVYUEVDVF9FUSgid2hpY2ggaGFzIHRoZXNlIHVuZXhwZWN0ZWQgZWxlbWVudHM6IDQ2IiwgRXhwbGFpbihtLCB0ZXN0X3NldCkpOworfQorCisvLyBUZXN0cyB0aGF0IGFkZGVkIGFuZCBtaXNzaW5nIHZhbHVlcyBhcmUgcmVwb3J0ZWQgdG9nZXRoZXIuCitUWVBFRF9URVNUKENvbnRhaW5lckVxVGVzdCwgVmFsdWVBZGRlZEFuZFJlbW92ZWQpIHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWxzW10gPSB7MSwgMSwgMiwgMywgNSwgOH07CisgIHN0YXRpYyBjb25zdCBpbnQgdGVzdF92YWxzW10gPSB7MSwgMiwgMywgOCwgNDZ9OworICBUeXBlUGFyYW0gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKKyAgVHlwZVBhcmFtIHRlc3Rfc2V0KHRlc3RfdmFscywgdGVzdF92YWxzICsgNSk7CisgIGNvbnN0IE1hdGNoZXI8VHlwZVBhcmFtPiBtID0gQ29udGFpbmVyRXEobXlfc2V0KTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3NldCkpOworICBFWFBFQ1RfRVEoIndoaWNoIGhhcyB0aGVzZSB1bmV4cGVjdGVkIGVsZW1lbnRzOiA0NixcbiIKKyAgICAgICAgICAgICJhbmQgZG9lc24ndCBoYXZlIHRoZXNlIGV4cGVjdGVkIGVsZW1lbnRzOiA1IiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgdGVzdF9zZXQpKTsKK30KKworLy8gVGVzdHMgZHVwbGljYXRlZCB2YWx1ZSAtLSBleHBlY3Qgbm8gZXhwbGFuYXRpb24uCitUWVBFRF9URVNUKENvbnRhaW5lckVxVGVzdCwgRHVwbGljYXRlRGlmZmVyZW5jZSkgeworICBzdGF0aWMgY29uc3QgaW50IHZhbHNbXSA9IHsxLCAxLCAyLCAzLCA1LCA4fTsKKyAgc3RhdGljIGNvbnN0IGludCB0ZXN0X3ZhbHNbXSA9IHsxLCAyLCAzLCA1LCA4fTsKKyAgVHlwZVBhcmFtIG15X3NldCh2YWxzLCB2YWxzICsgNik7CisgIFR5cGVQYXJhbSB0ZXN0X3NldCh0ZXN0X3ZhbHMsIHRlc3RfdmFscyArIDUpOworICBjb25zdCBNYXRjaGVyPGNvbnN0IFR5cGVQYXJhbSY+IG0gPSBDb250YWluZXJFcShteV9zZXQpOworICAvLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5lciwgbWF0Y2ggbWF5IGJlIHRydWUgb3IgZmFsc2UKKyAgLy8gQnV0IGluIGFueSBjYXNlIHRoZXJlIHNob3VsZCBiZSBubyBleHBsYW5hdGlvbi4KKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKG0sIHRlc3Rfc2V0KSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIFRlc3RzIHRoYXQgbXV0bGlwbGUgbWlzc2luZyB2YWx1ZXMgYXJlIHJlcG9ydGVkLgorLy8gVXNpbmcganVzdCB2ZWN0b3IgaGVyZSwgc28gb3JkZXIgaXMgcHJlZGljYXRibGUuCitURVNUKENvbnRhaW5lckVxRXh0cmFUZXN0LCBNdWx0aXBsZVZhbHVlc01pc3NpbmcpIHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWxzW10gPSB7MSwgMSwgMiwgMywgNSwgOH07CisgIHN0YXRpYyBjb25zdCBpbnQgdGVzdF92YWxzW10gPSB7MiwgMSwgNX07CisgIHZlY3RvcjxpbnQ+IG15X3NldCh2YWxzLCB2YWxzICsgNik7CisgIHZlY3RvcjxpbnQ+IHRlc3Rfc2V0KHRlc3RfdmFscywgdGVzdF92YWxzICsgMyk7CisgIGNvbnN0IE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gQ29udGFpbmVyRXEobXlfc2V0KTsKKyAgRVhQRUNUX0ZBTFNFKG0uTWF0Y2hlcyh0ZXN0X3NldCkpOworICBFWFBFQ1RfRVEoIndoaWNoIGRvZXNuJ3QgaGF2ZSB0aGVzZSBleHBlY3RlZCBlbGVtZW50czogMywgOCIsCisgICAgICAgICAgICBFeHBsYWluKG0sIHRlc3Rfc2V0KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYWRkZWQgdmFsdWVzIGFyZSByZXBvcnRlZC4KKy8vIFVzaW5nIGp1c3QgdmVjdG9yIGhlcmUsIHNvIG9yZGVyIGlzIHByZWRpY2F0YmxlLgorVEVTVChDb250YWluZXJFcUV4dHJhVGVzdCwgTXVsdGlwbGVWYWx1ZXNBZGRlZCkgeworICBzdGF0aWMgY29uc3QgaW50IHZhbHNbXSA9IHsxLCAxLCAyLCAzLCA1LCA4fTsKKyAgc3RhdGljIGNvbnN0IGludCB0ZXN0X3ZhbHNbXSA9IHsxLCAyLCA5MiwgMywgNSwgOCwgNDZ9OworICBsaXN0PHNpemVfdD4gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKKyAgbGlzdDxzaXplX3Q+IHRlc3Rfc2V0KHRlc3RfdmFscywgdGVzdF92YWxzICsgNyk7CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgbGlzdDxzaXplX3Q+Jj4gbSA9IENvbnRhaW5lckVxKG15X3NldCk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXModGVzdF9zZXQpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBoYXMgdGhlc2UgdW5leHBlY3RlZCBlbGVtZW50czogOTIsIDQ2IiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgdGVzdF9zZXQpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhZGRlZCBhbmQgbWlzc2luZyB2YWx1ZXMgYXJlIHJlcG9ydGVkIHRvZ2V0aGVyLgorVEVTVChDb250YWluZXJFcUV4dHJhVGVzdCwgTXVsdGlwbGVWYWx1ZXNBZGRlZEFuZFJlbW92ZWQpIHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWxzW10gPSB7MSwgMSwgMiwgMywgNSwgOH07CisgIHN0YXRpYyBjb25zdCBpbnQgdGVzdF92YWxzW10gPSB7MSwgMiwgMywgOTIsIDQ2fTsKKyAgbGlzdDxzaXplX3Q+IG15X3NldCh2YWxzLCB2YWxzICsgNik7CisgIGxpc3Q8c2l6ZV90PiB0ZXN0X3NldCh0ZXN0X3ZhbHMsIHRlc3RfdmFscyArIDUpOworICBjb25zdCBNYXRjaGVyPGNvbnN0IGxpc3Q8c2l6ZV90PiA+IG0gPSBDb250YWluZXJFcShteV9zZXQpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKHRlc3Rfc2V0KSk7CisgIEVYUEVDVF9FUSgid2hpY2ggaGFzIHRoZXNlIHVuZXhwZWN0ZWQgZWxlbWVudHM6IDkyLCA0NixcbiIKKyAgICAgICAgICAgICJhbmQgZG9lc24ndCBoYXZlIHRoZXNlIGV4cGVjdGVkIGVsZW1lbnRzOiA1LCA4IiwKKyAgICAgICAgICAgIEV4cGxhaW4obSwgdGVzdF9zZXQpKTsKK30KKworLy8gVGVzdHMgdG8gc2VlIHRoYXQgZHVwbGljYXRlIGVsZW1lbnRzIGFyZSBkZXRlY3RlZCwKKy8vIGJ1dCAoYXMgYWJvdmUpIG5vdCByZXBvcnRlZCBpbiB0aGUgZXhwbGFuYXRpb24uCitURVNUKENvbnRhaW5lckVxRXh0cmFUZXN0LCBNdWx0aVNldE9mSW50RHVwbGljYXRlRGlmZmVyZW5jZSkgeworICBzdGF0aWMgY29uc3QgaW50IHZhbHNbXSA9IHsxLCAxLCAyLCAzLCA1LCA4fTsKKyAgc3RhdGljIGNvbnN0IGludCB0ZXN0X3ZhbHNbXSA9IHsxLCAyLCAzLCA1LCA4fTsKKyAgdmVjdG9yPGludD4gbXlfc2V0KHZhbHMsIHZhbHMgKyA2KTsKKyAgdmVjdG9yPGludD4gdGVzdF9zZXQodGVzdF92YWxzLCB0ZXN0X3ZhbHMgKyA1KTsKKyAgY29uc3QgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0gPSBDb250YWluZXJFcShteV9zZXQpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMobXlfc2V0KSk7CisgIEVYUEVDVF9GQUxTRShtLk1hdGNoZXModGVzdF9zZXQpKTsKKyAgLy8gVGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQgd2hlbiBib3RoIHNldHMgY29udGFpbiBhbGwgdGhlIHNhbWUgdmFsdWVzLgorICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgdGVzdF9zZXQpKTsKK30KKworLy8gVGVzdHMgdGhhdCBDb250YWluZXJFcSB3b3JrcyBmb3Igbm9uLXRyaXZpYWwgYXNzb2NpYXRpdmUgY29udGFpbmVycywKKy8vIGxpa2UgbWFwcy4KK1RFU1QoQ29udGFpbmVyRXFFeHRyYVRlc3QsIFdvcmtzRm9yTWFwcykgeworICBtYXA8aW50LCBzdGQ6OnN0cmluZz4gbXlfbWFwOworICBteV9tYXBbMF0gPSAiYSI7CisgIG15X21hcFsxXSA9ICJiIjsKKworICBtYXA8aW50LCBzdGQ6OnN0cmluZz4gdGVzdF9tYXA7CisgIHRlc3RfbWFwWzBdID0gImFhIjsKKyAgdGVzdF9tYXBbMV0gPSAiYiI7CisKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCBtYXA8aW50LCBzdGQ6OnN0cmluZz4mPiBtID0gQ29udGFpbmVyRXEobXlfbWFwKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKG15X21hcCkpOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKHRlc3RfbWFwKSk7CisKKyAgRVhQRUNUX0VRKCJ3aGljaCBoYXMgdGhlc2UgdW5leHBlY3RlZCBlbGVtZW50czogKDAsIFwiYWFcIiksXG4iCisgICAgICAgICAgICAiYW5kIGRvZXNuJ3QgaGF2ZSB0aGVzZSBleHBlY3RlZCBlbGVtZW50czogKDAsIFwiYVwiKSIsCisgICAgICAgICAgICBFeHBsYWluKG0sIHRlc3RfbWFwKSk7Cit9CisKK1RFU1QoQ29udGFpbmVyRXFFeHRyYVRlc3QsIFdvcmtzRm9yTmF0aXZlQXJyYXkpIHsKKyAgaW50IGExW10gPSB7MSwgMiwgM307CisgIGludCBhMltdID0gezEsIDIsIDN9OworICBpbnQgYltdID0gezEsIDIsIDR9OworCisgIEVYUEVDVF9USEFUKGExLCBDb250YWluZXJFcShhMikpOworICBFWFBFQ1RfVEhBVChhMSwgTm90KENvbnRhaW5lckVxKGIpKSk7Cit9CisKK1RFU1QoQ29udGFpbmVyRXFFeHRyYVRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxOYXRpdmVBcnJheSkgeworICBjb25zdCBjaGFyIGExW11bM10gPSB7ImhpIiwgImxvIn07CisgIGNvbnN0IGNoYXIgYTJbXVszXSA9IHsiaGkiLCAibG8ifTsKKyAgY29uc3QgY2hhciBiW11bM10gPSB7ImxvIiwgImhpIn07CisKKyAgLy8gVGVzdHMgdXNpbmcgQ29udGFpbmVyRXEoKSBpbiB0aGUgZmlyc3QgZGltZW5zaW9uLgorICBFWFBFQ1RfVEhBVChhMSwgQ29udGFpbmVyRXEoYTIpKTsKKyAgRVhQRUNUX1RIQVQoYTEsIE5vdChDb250YWluZXJFcShiKSkpOworCisgIC8vIFRlc3RzIHVzaW5nIENvbnRhaW5lckVxKCkgaW4gdGhlIHNlY29uZCBkaW1lbnNpb24uCisgIEVYUEVDVF9USEFUKGExLCBFbGVtZW50c0FyZShDb250YWluZXJFcShhMlswXSksIENvbnRhaW5lckVxKGEyWzFdKSkpOworICBFWFBFQ1RfVEhBVChhMSwgRWxlbWVudHNBcmUoTm90KENvbnRhaW5lckVxKGJbMF0pKSwgQ29udGFpbmVyRXEoYTJbMV0pKSk7Cit9CisKK1RFU1QoQ29udGFpbmVyRXFFeHRyYVRlc3QsIFdvcmtzRm9yTmF0aXZlQXJyYXlBc1R1cGxlKSB7CisgIGNvbnN0IGludCBhMVtdID0gezEsIDIsIDN9OworICBjb25zdCBpbnQgYTJbXSA9IHsxLCAyLCAzfTsKKyAgY29uc3QgaW50IGJbXSA9IHsxLCAyLCAzLCA0fTsKKworICBjb25zdCBpbnQqIGNvbnN0IHAxID0gYTE7CisgIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUocDEsIDMpLCBDb250YWluZXJFcShhMikpOworICBFWFBFQ1RfVEhBVChtYWtlX3R1cGxlKHAxLCAzKSwgTm90KENvbnRhaW5lckVxKGIpKSk7CisKKyAgY29uc3QgaW50IGNbXSA9IHsxLCAzLCAyfTsKKyAgRVhQRUNUX1RIQVQobWFrZV90dXBsZShwMSwgMyksIE5vdChDb250YWluZXJFcShjKSkpOworfQorCitURVNUKENvbnRhaW5lckVxRXh0cmFUZXN0LCBDb3BpZXNOYXRpdmVBcnJheVBhcmFtZXRlcikgeworICBzdGQ6OnN0cmluZyBhMVtdWzNdID0geworICAgIHsiaGkiLCAiaGVsbG8iLCAiY2lhbyJ9LAorICAgIHsiYnllIiwgInNlZSB5b3UiLCAiY2lhbyJ9CisgIH07CisKKyAgc3RkOjpzdHJpbmcgYTJbXVszXSA9IHsKKyAgICB7ImhpIiwgImhlbGxvIiwgImNpYW8ifSwKKyAgICB7ImJ5ZSIsICJzZWUgeW91IiwgImNpYW8ifQorICB9OworCisgIGNvbnN0IE1hdGNoZXI8Y29uc3Qgc3RkOjpzdHJpbmcoJilbMl1bM10+IG0gPSBDb250YWluZXJFcShhMik7CisgIEVYUEVDVF9USEFUKGExLCBtKTsKKworICBhMlswXVswXSA9ICJoYSI7CisgIEVYUEVDVF9USEFUKGExLCBtKTsKK30KKworVEVTVChXaGVuU29ydGVkQnlUZXN0LCBXb3Jrc0ZvckVtcHR5Q29udGFpbmVyKSB7CisgIGNvbnN0IHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgIEVYUEVDVF9USEFUKG51bWJlcnMsIFdoZW5Tb3J0ZWRCeShsZXNzPGludD4oKSwgRWxlbWVudHNBcmUoKSkpOworICBFWFBFQ1RfVEhBVChudW1iZXJzLCBOb3QoV2hlblNvcnRlZEJ5KGxlc3M8aW50PigpLCBFbGVtZW50c0FyZSgxKSkpKTsKK30KKworVEVTVChXaGVuU29ydGVkQnlUZXN0LCBXb3Jrc0Zvck5vbkVtcHR5Q29udGFpbmVyKSB7CisgIHZlY3Rvcjx1bnNpZ25lZD4gbnVtYmVyczsKKyAgbnVtYmVycy5wdXNoX2JhY2soMyk7CisgIG51bWJlcnMucHVzaF9iYWNrKDEpOworICBudW1iZXJzLnB1c2hfYmFjaygyKTsKKyAgbnVtYmVycy5wdXNoX2JhY2soMik7CisgIEVYUEVDVF9USEFUKG51bWJlcnMsIFdoZW5Tb3J0ZWRCeShncmVhdGVyPHVuc2lnbmVkPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudHNBcmUoMywgMiwgMiwgMSkpKTsKKyAgRVhQRUNUX1RIQVQobnVtYmVycywgTm90KFdoZW5Tb3J0ZWRCeShncmVhdGVyPHVuc2lnbmVkPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKDEsIDIsIDIsIDMpKSkpOworfQorCitURVNUKFdoZW5Tb3J0ZWRCeVRlc3QsIFdvcmtzRm9yTm9uVmVjdG9yQ29udGFpbmVyKSB7CisgIGxpc3Q8c3RyaW5nPiB3b3JkczsKKyAgd29yZHMucHVzaF9iYWNrKCJzYXkiKTsKKyAgd29yZHMucHVzaF9iYWNrKCJoZWxsbyIpOworICB3b3Jkcy5wdXNoX2JhY2soIndvcmxkIik7CisgIEVYUEVDVF9USEFUKHdvcmRzLCBXaGVuU29ydGVkQnkobGVzczxzdHJpbmc+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudHNBcmUoImhlbGxvIiwgInNheSIsICJ3b3JsZCIpKSk7CisgIEVYUEVDVF9USEFUKHdvcmRzLCBOb3QoV2hlblNvcnRlZEJ5KGxlc3M8c3RyaW5nPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50c0FyZSgic2F5IiwgImhlbGxvIiwgIndvcmxkIikpKSk7Cit9CisKK1RFU1QoV2hlblNvcnRlZEJ5VGVzdCwgV29ya3NGb3JOYXRpdmVBcnJheSkgeworICBjb25zdCBpbnQgbnVtYmVyc1tdID0gezEsIDMsIDIsIDR9OworICBjb25zdCBpbnQgc29ydGVkX251bWJlcnNbXSA9IHsxLCAyLCAzLCA0fTsKKyAgRVhQRUNUX1RIQVQobnVtYmVycywgV2hlblNvcnRlZEJ5KGxlc3M8aW50PigpLCBFbGVtZW50c0FyZSgxLCAyLCAzLCA0KSkpOworICBFWFBFQ1RfVEhBVChudW1iZXJzLCBXaGVuU29ydGVkQnkobGVzczxpbnQ+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50c0FyZUFycmF5KHNvcnRlZF9udW1iZXJzKSkpOworICBFWFBFQ1RfVEhBVChudW1iZXJzLCBOb3QoV2hlblNvcnRlZEJ5KGxlc3M8aW50PigpLCBFbGVtZW50c0FyZSgxLCAzLCAyLCA0KSkpKTsKK30KKworVEVTVChXaGVuU29ydGVkQnlUZXN0LCBDYW5EZXNjcmliZVNlbGYpIHsKKyAgY29uc3QgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0gPSBXaGVuU29ydGVkQnkobGVzczxpbnQ+KCksIEVsZW1lbnRzQXJlKDEsIDIpKTsKKyAgRVhQRUNUX0VRKCIod2hlbiBzb3J0ZWQpIGhhcyAyIGVsZW1lbnRzIHdoZXJlXG4iCisgICAgICAgICAgICAiZWxlbWVudCAjMCBpcyBlcXVhbCB0byAxLFxuIgorICAgICAgICAgICAgImVsZW1lbnQgIzEgaXMgZXF1YWwgdG8gMiIsCisgICAgICAgICAgICBEZXNjcmliZShtKSk7CisgIEVYUEVDVF9FUSgiKHdoZW4gc29ydGVkKSBkb2Vzbid0IGhhdmUgMiBlbGVtZW50cywgb3JcbiIKKyAgICAgICAgICAgICJlbGVtZW50ICMwIGlzbid0IGVxdWFsIHRvIDEsIG9yXG4iCisgICAgICAgICAgICAiZWxlbWVudCAjMSBpc24ndCBlcXVhbCB0byAyIiwKKyAgICAgICAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOworfQorCitURVNUKFdoZW5Tb3J0ZWRCeVRlc3QsIEV4cGxhaW5zTWF0Y2hSZXN1bHQpIHsKKyAgY29uc3QgaW50IGFbXSA9IHsyLCAxfTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyB7IDEsIDIgfSB3aGVuIHNvcnRlZCwgd2hvc2UgZWxlbWVudCAjMCBkb2Vzbid0IG1hdGNoIiwKKyAgICAgICAgICAgIEV4cGxhaW4oV2hlblNvcnRlZEJ5KGxlc3M8aW50PigpLCBFbGVtZW50c0FyZSgyLCAzKSksIGEpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBpcyB7IDEsIDIgfSB3aGVuIHNvcnRlZCIsCisgICAgICAgICAgICBFeHBsYWluKFdoZW5Tb3J0ZWRCeShsZXNzPGludD4oKSwgRWxlbWVudHNBcmUoMSwgMikpLCBhKSk7Cit9CisKKy8vIFdoZW5Tb3J0ZWQoKSBpcyBhIHNpbXBsZSB3cmFwcGVyIG9uIFdoZW5Tb3J0ZWRCeSgpLiAgSGVuY2Ugd2UgZG9uJ3QKKy8vIG5lZWQgdG8gdGVzdCBpdCBhcyBleGhhdXN0aXZlbHkgYXMgd2UgdGVzdCB0aGUgbGF0dGVyLgorCitURVNUKFdoZW5Tb3J0ZWRUZXN0LCBXb3Jrc0ZvckVtcHR5Q29udGFpbmVyKSB7CisgIGNvbnN0IHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgIEVYUEVDVF9USEFUKG51bWJlcnMsIFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoKSkpOworICBFWFBFQ1RfVEhBVChudW1iZXJzLCBOb3QoV2hlblNvcnRlZChFbGVtZW50c0FyZSgxKSkpKTsKK30KKworVEVTVChXaGVuU29ydGVkVGVzdCwgV29ya3NGb3JOb25FbXB0eUNvbnRhaW5lcikgeworICBsaXN0PHN0cmluZz4gd29yZHM7CisgIHdvcmRzLnB1c2hfYmFjaygiMyIpOworICB3b3Jkcy5wdXNoX2JhY2soIjEiKTsKKyAgd29yZHMucHVzaF9iYWNrKCIyIik7CisgIHdvcmRzLnB1c2hfYmFjaygiMiIpOworICBFWFBFQ1RfVEhBVCh3b3JkcywgV2hlblNvcnRlZChFbGVtZW50c0FyZSgiMSIsICIyIiwgIjIiLCAiMyIpKSk7CisgIEVYUEVDVF9USEFUKHdvcmRzLCBOb3QoV2hlblNvcnRlZChFbGVtZW50c0FyZSgiMyIsICIxIiwgIjIiLCAiMiIpKSkpOworfQorCitURVNUKFdoZW5Tb3J0ZWRUZXN0LCBXb3Jrc0Zvck1hcFR5cGVzKSB7CisgICAgbWFwPHN0cmluZywgaW50PiB3b3JkX2NvdW50czsKKyAgICB3b3JkX2NvdW50c1siYW5kIl0gPSAxOworICAgIHdvcmRfY291bnRzWyJ0aGUiXSA9IDE7CisgICAgd29yZF9jb3VudHNbImJ1ZmZhbG8iXSA9IDI7CisgICAgRVhQRUNUX1RIQVQod29yZF9jb3VudHMsIFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoCisgICAgICAgICAgICBQYWlyKCJhbmQiLCAxKSwgUGFpcigiYnVmZmFsbyIsIDIpLCBQYWlyKCJ0aGUiLCAxKSkpKTsKKyAgICBFWFBFQ1RfVEhBVCh3b3JkX2NvdW50cywgTm90KFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoCisgICAgICAgICAgICBQYWlyKCJhbmQiLCAxKSwgUGFpcigidGhlIiwgMSksIFBhaXIoImJ1ZmZhbG8iLCAyKSkpKSk7Cit9CisKK1RFU1QoV2hlblNvcnRlZFRlc3QsIFdvcmtzRm9yTXVsdGlNYXBUeXBlcykgeworICAgIG11bHRpbWFwPGludCwgaW50PiBpZmliOworICAgIGlmaWIuaW5zZXJ0KG1ha2VfcGFpcig4LCA2KSk7CisgICAgaWZpYi5pbnNlcnQobWFrZV9wYWlyKDIsIDMpKTsKKyAgICBpZmliLmluc2VydChtYWtlX3BhaXIoMSwgMSkpOworICAgIGlmaWIuaW5zZXJ0KG1ha2VfcGFpcigzLCA0KSk7CisgICAgaWZpYi5pbnNlcnQobWFrZV9wYWlyKDEsIDIpKTsKKyAgICBpZmliLmluc2VydChtYWtlX3BhaXIoNSwgNSkpOworICAgIEVYUEVDVF9USEFUKGlmaWIsIFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoUGFpcigxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIoMSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpcigzLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIoNSwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDgsIDYpKSkpOworICAgIEVYUEVDVF9USEFUKGlmaWIsIE5vdChXaGVuU29ydGVkKEVsZW1lbnRzQXJlKFBhaXIoOCwgNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpcigyLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIoMywgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpcigxLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDUsIDUpKSkpKTsKK30KKworVEVTVChXaGVuU29ydGVkVGVzdCwgV29ya3NGb3JQb2x5bW9ycGhpY01hdGNoZXIpIHsKKyAgICBzdGQ6OmRlcXVlPGludD4gZDsKKyAgICBkLnB1c2hfYmFjaygyKTsKKyAgICBkLnB1c2hfYmFjaygxKTsKKyAgICBFWFBFQ1RfVEhBVChkLCBXaGVuU29ydGVkKEVsZW1lbnRzQXJlKDEsIDIpKSk7CisgICAgRVhQRUNUX1RIQVQoZCwgTm90KFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoMiwgMSkpKSk7Cit9CisKK1RFU1QoV2hlblNvcnRlZFRlc3QsIFdvcmtzRm9yVmVjdG9yQ29uc3RSZWZNYXRjaGVyKSB7CisgICAgc3RkOjpkZXF1ZTxpbnQ+IGQ7CisgICAgZC5wdXNoX2JhY2soMik7CisgICAgZC5wdXNoX2JhY2soMSk7CisgICAgTWF0Y2hlcjxjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+Jj4gdmVjdG9yX21hdGNoID0gRWxlbWVudHNBcmUoMSwgMik7CisgICAgRVhQRUNUX1RIQVQoZCwgV2hlblNvcnRlZCh2ZWN0b3JfbWF0Y2gpKTsKKyAgICBNYXRjaGVyPGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mPiBub3RfdmVjdG9yX21hdGNoID0gRWxlbWVudHNBcmUoMiwgMSk7CisgICAgRVhQRUNUX1RIQVQoZCwgTm90KFdoZW5Tb3J0ZWQobm90X3ZlY3Rvcl9tYXRjaCkpKTsKK30KKworLy8gRGVsaWJlcmF0ZWx5IGJhcmUgcHNldWRvLWNvbnRhaW5lci4KKy8vIE9mZmVycyBvbmx5IGJlZ2luKCkgYW5kIGVuZCgpIGFjY2Vzc29ycywgeWllbGRpbmcgSW5wdXRJdGVyYXRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU3RyZWFtbGlrZSB7CisgcHJpdmF0ZToKKyAgY2xhc3MgQ29uc3RJdGVyOworIHB1YmxpYzoKKyAgdHlwZWRlZiBDb25zdEl0ZXIgY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbkl0ZXI+CisgIFN0cmVhbWxpa2UoSW5JdGVyIGZpcnN0LCBJbkl0ZXIgbGFzdCkgOiByZW1haW5kZXJfKGZpcnN0LCBsYXN0KSB7fQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLCByZW1haW5kZXJfLmJlZ2luKCkpOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcywgcmVtYWluZGVyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIENvbnN0SXRlciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV90eXBlJj4geworICAgcHVibGljOgorICAgIENvbnN0SXRlcihjb25zdCBTdHJlYW1saWtlKiBzLAorICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Omxpc3Q8dmFsdWVfdHlwZT46Oml0ZXJhdG9yIHBvcykKKyAgICAgICAgOiBzXyhzKSwgcG9zXyhwb3MpIHt9CisKKyAgICBjb25zdCB2YWx1ZV90eXBlJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcG9zXzsgfQorICAgIGNvbnN0IHZhbHVlX3R5cGUqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKnBvc187IH0KKyAgICBDb25zdEl0ZXImIG9wZXJhdG9yKysoKSB7CisgICAgICBzXy0+cmVtYWluZGVyXy5lcmFzZShwb3NfKyspOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vICppdGVyKysgaXMgcmVxdWlyZWQgdG8gd29yayAoc2VlIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcikuCisgICAgLy8gKHZvaWQpaXRlcisrIGlzIGFsc28gcmVxdWlyZWQgdG8gd29yay4KKyAgICBjbGFzcyBQb3N0SW5jclByb3h5IHsKKyAgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgUG9zdEluY3JQcm94eShjb25zdCB2YWx1ZV90eXBlJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgICAgICB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICAgICBwcml2YXRlOgorICAgICAgdmFsdWVfdHlwZSB2YWx1ZV87CisgICAgfTsKKyAgICBQb3N0SW5jclByb3h5IG9wZXJhdG9yKysoaW50KSB7CisgICAgICBQb3N0SW5jclByb3h5IHByb3h5KCoqdGhpcyk7CisgICAgICArKygqdGhpcyk7CisgICAgICByZXR1cm4gcHJveHk7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb25zdEl0ZXImIGEsIGNvbnN0IENvbnN0SXRlciYgYikgeworICAgICAgcmV0dXJuIGEuc18gPT0gYi5zXyAmJiBhLnBvc18gPT0gYi5wb3NfOworICAgIH0KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbnN0SXRlciYgYSwgY29uc3QgQ29uc3RJdGVyJiBiKSB7CisgICAgICByZXR1cm4gIShhID09IGIpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBjb25zdCBTdHJlYW1saWtlKiBzXzsKKyAgICB0eXBlbmFtZSBzdGQ6Omxpc3Q8dmFsdWVfdHlwZT46Oml0ZXJhdG9yIHBvc187CisgIH07CisKKyAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdHJlYW1saWtlJiBzKSB7CisgICAgb3MgPDwgIlsiOworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpsaXN0PHZhbHVlX3R5cGU+Ojpjb25zdF9pdGVyYXRvciBJdGVyOworICAgIGNvbnN0IGNoYXIqIHNlcCA9ICIiOworICAgIGZvciAoSXRlciBpdCA9IHMucmVtYWluZGVyXy5iZWdpbigpOyBpdCAhPSBzLnJlbWFpbmRlcl8uZW5kKCk7ICsraXQpIHsKKyAgICAgIG9zIDw8IHNlcCA8PCAqaXQ7CisgICAgICBzZXAgPSAiLCI7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7CisgIH0KKworICBtdXRhYmxlIHN0ZDo6bGlzdDx2YWx1ZV90eXBlPiByZW1haW5kZXJfOyAgLy8gbW9kaWZpZWQgYnkgaXRlcmF0aW9uCit9OworCitURVNUKFN0cmVhbWxpa2VUZXN0LCBJdGVyYXRpb24pIHsKKyAgY29uc3QgaW50IGFbNV0gPSB7MiwgMSwgNCwgNSwgM307CisgIFN0cmVhbWxpa2U8aW50PiBzKGEsIGEgKyA1KTsKKyAgU3RyZWFtbGlrZTxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHMuYmVnaW4oKTsKKyAgY29uc3QgaW50KiBpcCA9IGE7CisgIHdoaWxlIChpdCAhPSBzLmVuZCgpKSB7CisgICAgU0NPUEVEX1RSQUNFKGlwIC0gYSk7CisgICAgRVhQRUNUX0VRKCppcCsrLCAqaXQrKyk7CisgIH0KK30KKworI2lmIEdURVNUX0hBU19TVERfRk9SV0FSRF9MSVNUXworVEVTVChCZWdpbkVuZERpc3RhbmNlSXNUZXN0LCBXb3Jrc1dpdGhGb3J3YXJkTGlzdCkgeworICBzdGQ6OmZvcndhcmRfbGlzdDxpbnQ+IGNvbnRhaW5lcjsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBCZWdpbkVuZERpc3RhbmNlSXMoMCkpOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChCZWdpbkVuZERpc3RhbmNlSXMoMSkpKTsKKyAgY29udGFpbmVyLnB1c2hfZnJvbnQoMCk7CisgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgTm90KEJlZ2luRW5kRGlzdGFuY2VJcygwKSkpOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIEJlZ2luRW5kRGlzdGFuY2VJcygxKSk7CisgIGNvbnRhaW5lci5wdXNoX2Zyb250KDApOworICBFWFBFQ1RfVEhBVChjb250YWluZXIsIE5vdChCZWdpbkVuZERpc3RhbmNlSXMoMCkpKTsKKyAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBCZWdpbkVuZERpc3RhbmNlSXMoMikpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZPUldBUkRfTElTVF8KKworVEVTVChCZWdpbkVuZERpc3RhbmNlSXNUZXN0LCBXb3Jrc1dpdGhOb25TdGRMaXN0KSB7CisgIGNvbnN0IGludCBhWzVdID0gezEsIDIsIDMsIDQsIDV9OworICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgNSk7CisgIEVYUEVDVF9USEFUKHMsIEJlZ2luRW5kRGlzdGFuY2VJcyg1KSk7Cit9CisKK1RFU1QoQmVnaW5FbmREaXN0YW5jZUlzVGVzdCwgQ2FuRGVzY3JpYmVTZWxmKSB7CisgIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gQmVnaW5FbmREaXN0YW5jZUlzKDIpOworICBFWFBFQ1RfRVEoImRpc3RhbmNlIGJldHdlZW4gYmVnaW4oKSBhbmQgZW5kKCkgaXMgZXF1YWwgdG8gMiIsIERlc2NyaWJlKG0pKTsKKyAgRVhQRUNUX0VRKCJkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpIGlzbid0IGVxdWFsIHRvIDIiLAorICAgICAgICAgICAgRGVzY3JpYmVOZWdhdGlvbihtKSk7Cit9CisKK1RFU1QoQmVnaW5FbmREaXN0YW5jZUlzVGVzdCwgRXhwbGFpbnNSZXN1bHQpIHsKKyAgTWF0Y2hlcjx2ZWN0b3I8aW50PiA+IG0xID0gQmVnaW5FbmREaXN0YW5jZUlzKDIpOworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTIgPSBCZWdpbkVuZERpc3RhbmNlSXMoTHQoMikpOworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTMgPSBCZWdpbkVuZERpc3RhbmNlSXMoQW55T2YoMCwgMykpOworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTQgPSBCZWdpbkVuZERpc3RhbmNlSXMoR3JlYXRlclRoYW4oMSkpOworICB2ZWN0b3I8aW50PiBjb250YWluZXI7CisgIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAwIGRvZXNuJ3QgbWF0Y2giLAorICAgICAgICAgICAgRXhwbGFpbihtMSwgY29udGFpbmVyKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAwIG1hdGNoZXMiLAorICAgICAgICAgICAgRXhwbGFpbihtMiwgY29udGFpbmVyKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAwIG1hdGNoZXMiLAorICAgICAgICAgICAgRXhwbGFpbihtMywgY29udGFpbmVyKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJ3aG9zZSBkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpIDAgZG9lc24ndCBtYXRjaCwgd2hpY2ggaXMgMSAiCisgICAgICAibGVzcyB0aGFuIDEiLAorICAgICAgRXhwbGFpbihtNCwgY29udGFpbmVyKSk7CisgIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7CisgIGNvbnRhaW5lci5wdXNoX2JhY2soMCk7CisgIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAyIG1hdGNoZXMiLAorICAgICAgICAgICAgRXhwbGFpbihtMSwgY29udGFpbmVyKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAyIGRvZXNuJ3QgbWF0Y2giLAorICAgICAgICAgICAgRXhwbGFpbihtMiwgY29udGFpbmVyKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAyIGRvZXNuJ3QgbWF0Y2giLAorICAgICAgICAgICAgRXhwbGFpbihtMywgY29udGFpbmVyKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJ3aG9zZSBkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpIDIgbWF0Y2hlcywgd2hpY2ggaXMgMSBtb3JlICIKKyAgICAgICJ0aGFuIDEiLAorICAgICAgRXhwbGFpbihtNCwgY29udGFpbmVyKSk7Cit9CisKK1RFU1QoV2hlblNvcnRlZFRlc3QsIFdvcmtzRm9yU3RyZWFtbGlrZSkgeworICAvLyBTdHJlYW1saWtlICdjb250YWluZXInIHByb3ZpZGVzIG9ubHkgbWluaW1hbCBpdGVyYXRvciBzdXBwb3J0LgorICAvLyBJdHMgaXRlcmF0b3JzIGFyZSB0YWdnZWQgd2l0aCBpbnB1dF9pdGVyYXRvcl90YWcuCisgIGNvbnN0IGludCBhWzVdID0gezIsIDEsIDQsIDUsIDN9OworICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOworICBFWFBFQ1RfVEhBVChzLCBXaGVuU29ydGVkKEVsZW1lbnRzQXJlKDEsIDIsIDMsIDQsIDUpKSk7CisgIEVYUEVDVF9USEFUKHMsIE5vdChXaGVuU29ydGVkKEVsZW1lbnRzQXJlKDIsIDEsIDQsIDUsIDMpKSkpOworfQorCitURVNUKFdoZW5Tb3J0ZWRUZXN0LCBXb3Jrc0ZvclZlY3RvckNvbnN0UmVmTWF0Y2hlck9uU3RyZWFtbGlrZSkgeworICBjb25zdCBpbnQgYVtdID0gezIsIDEsIDQsIDUsIDN9OworICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOworICBNYXRjaGVyPGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mPiB2ZWN0b3JfbWF0Y2ggPSBFbGVtZW50c0FyZSgxLCAyLCAzLCA0LCA1KTsKKyAgRVhQRUNUX1RIQVQocywgV2hlblNvcnRlZCh2ZWN0b3JfbWF0Y2gpKTsKKyAgRVhQRUNUX1RIQVQocywgTm90KFdoZW5Tb3J0ZWQoRWxlbWVudHNBcmUoMiwgMSwgNCwgNSwgMykpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEVsZW1lbnRzQXJlKCkgYW5kIEVsZW1lbnRzQXJlQXJyYXkoKSB3aXRoIHN0cmVhbS1saWtlCisvLyAiY29udGFpbmVycyIuCisKK1RFU1QoRWxlbWVuc0FyZVN0cmVhbVRlc3QsIFdvcmtzRm9yU3RyZWFtbGlrZSkgeworICBjb25zdCBpbnQgYVs1XSA9IHsxLCAyLCAzLCA0LCA1fTsKKyAgU3RyZWFtbGlrZTxpbnQ+IHMoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKyAgRVhQRUNUX1RIQVQocywgRWxlbWVudHNBcmUoMSwgMiwgMywgNCwgNSkpOworICBFWFBFQ1RfVEhBVChzLCBOb3QoRWxlbWVudHNBcmUoMiwgMSwgNCwgNSwgMykpKTsKK30KKworVEVTVChFbGVtZW5zQXJlQXJyYXlTdHJlYW1UZXN0LCBXb3Jrc0ZvclN0cmVhbWxpa2UpIHsKKyAgY29uc3QgaW50IGFbNV0gPSB7MSwgMiwgMywgNCwgNX07CisgIFN0cmVhbWxpa2U8aW50PiBzKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7CisKKyAgdmVjdG9yPGludD4gZXhwZWN0ZWQ7CisgIGV4cGVjdGVkLnB1c2hfYmFjaygxKTsKKyAgZXhwZWN0ZWQucHVzaF9iYWNrKDIpOworICBleHBlY3RlZC5wdXNoX2JhY2soMyk7CisgIGV4cGVjdGVkLnB1c2hfYmFjayg0KTsKKyAgZXhwZWN0ZWQucHVzaF9iYWNrKDUpOworICBFWFBFQ1RfVEhBVChzLCBFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSk7CisKKyAgZXhwZWN0ZWRbM10gPSAwOworICBFWFBFQ1RfVEhBVChzLCBOb3QoRWxlbWVudHNBcmVBcnJheShleHBlY3RlZCkpKTsKK30KKworVEVTVChFbGVtZW50c0FyZVRlc3QsIFdvcmtzV2l0aFVuY29weWFibGUpIHsKKyAgVW5jb3B5YWJsZSBvYmpzWzJdOworICBvYmpzWzBdLnNldF92YWx1ZSgtMyk7CisgIG9ianNbMV0uc2V0X3ZhbHVlKDEpOworICBFWFBFQ1RfVEhBVChvYmpzLCBFbGVtZW50c0FyZShVbmNvcHlhYmxlSXMoLTMpLCBUcnVseShWYWx1ZUlzUG9zaXRpdmUpKSk7Cit9CisKK1RFU1QoRWxlbWVudHNBcmVUZXN0LCBUYWtlc1N0bENvbnRhaW5lcikgeworICBjb25zdCBpbnQgYWN0dWFsW10gPSB7MywgMSwgMn07CisKKyAgOjpzdGQ6Omxpc3Q8aW50PiBleHBlY3RlZDsKKyAgZXhwZWN0ZWQucHVzaF9iYWNrKDMpOworICBleHBlY3RlZC5wdXNoX2JhY2soMSk7CisgIGV4cGVjdGVkLnB1c2hfYmFjaygyKTsKKyAgRVhQRUNUX1RIQVQoYWN0dWFsLCBFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSk7CisKKyAgZXhwZWN0ZWQucHVzaF9iYWNrKDQpOworICBFWFBFQ1RfVEhBVChhY3R1YWwsIE5vdChFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSkpOworfQorCisvLyBUZXN0cyBmb3IgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpCisKK1RFU1QoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheVRlc3QsIFN1Y2NlZWRzV2hlbkV4cGVjdGVkKSB7CisgIGNvbnN0IGludCBhW10gPSB7MCwgMSwgMiwgMywgNH07CisgIHN0ZDo6dmVjdG9yPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOworICBkbyB7CisgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsKKyAgICBFWFBFQ1RfVFJVRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7CisgIH0gd2hpbGUgKHN0ZDo6bmV4dF9wZXJtdXRhdGlvbihzLmJlZ2luKCksIHMuZW5kKCkpKTsKK30KKworVEVTVChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5VGVzdCwgVmVjdG9yQm9vbCkgeworICBjb25zdCBib29sIGFbXSA9IHswLCAxLCAwLCAxLCAxfTsKKyAgY29uc3QgYm9vbCBiW10gPSB7MSwgMCwgMSwgMSwgMH07CisgIHN0ZDo6dmVjdG9yPGJvb2w+IGV4cGVjdGVkKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7CisgIHN0ZDo6dmVjdG9yPGJvb2w+IGFjdHVhbChiLCBiICsgR1RFU1RfQVJSQVlfU0laRV8oYikpOworICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOworICBFWFBFQ1RfVFJVRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwsICZsaXN0ZW5lcikpIDw8IGxpc3RlbmVyLnN0cigpOworfQorCitURVNUKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBXb3Jrc0ZvclN0cmVhbWxpa2UpIHsKKyAgLy8gU3RyZWFtbGlrZSAnY29udGFpbmVyJyBwcm92aWRlcyBvbmx5IG1pbmltYWwgaXRlcmF0b3Igc3VwcG9ydC4KKyAgLy8gSXRzIGl0ZXJhdG9ycyBhcmUgdGFnZ2VkIHdpdGggaW5wdXRfaXRlcmF0b3JfdGFnLCBhbmQgaXQgaGFzIG5vCisgIC8vIHNpemUoKSBvciBlbXB0eSgpIG1ldGhvZHMuCisgIGNvbnN0IGludCBhWzVdID0gezIsIDEsIDQsIDUsIDN9OworICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOworCisgIDo6c3RkOjp2ZWN0b3I8aW50PiBleHBlY3RlZDsKKyAgZXhwZWN0ZWQucHVzaF9iYWNrKDEpOworICBleHBlY3RlZC5wdXNoX2JhY2soMik7CisgIGV4cGVjdGVkLnB1c2hfYmFjaygzKTsKKyAgZXhwZWN0ZWQucHVzaF9iYWNrKDQpOworICBleHBlY3RlZC5wdXNoX2JhY2soNSk7CisgIEVYUEVDVF9USEFUKHMsIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoZXhwZWN0ZWQpKTsKKworICBleHBlY3RlZC5wdXNoX2JhY2soNik7CisgIEVYUEVDVF9USEFUKHMsIE5vdChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSkpOworfQorCitURVNUKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBUYWtlc1N0bENvbnRhaW5lcikgeworICBjb25zdCBpbnQgYWN0dWFsW10gPSB7MywgMSwgMn07CisKKyAgOjpzdGQ6Omxpc3Q8aW50PiBleHBlY3RlZDsKKyAgZXhwZWN0ZWQucHVzaF9iYWNrKDEpOworICBleHBlY3RlZC5wdXNoX2JhY2soMik7CisgIGV4cGVjdGVkLnB1c2hfYmFjaygzKTsKKyAgRVhQRUNUX1RIQVQoYWN0dWFsLCBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSk7CisKKyAgZXhwZWN0ZWQucHVzaF9iYWNrKDQpOworICBFWFBFQ1RfVEhBVChhY3R1YWwsIE5vdChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkKSkpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXworCitURVNUKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBUYWtlc0luaXRpYWxpemVyTGlzdCkgeworICBjb25zdCBpbnQgYVs1XSA9IHsyLCAxLCA0LCA1LCAzfTsKKyAgRVhQRUNUX1RIQVQoYSwgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSh7MSwgMiwgMywgNCwgNX0pKTsKKyAgRVhQRUNUX1RIQVQoYSwgTm90KFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoezEsIDIsIDMsIDQsIDZ9KSkpOworfQorCitURVNUKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlUZXN0LCBUYWtlc0luaXRpYWxpemVyTGlzdE9mQ1N0cmluZ3MpIHsKKyAgY29uc3Qgc3RyaW5nIGFbNV0gPSB7ImEiLCAiYiIsICJjIiwgImQiLCAiZSJ9OworICBFWFBFQ1RfVEhBVChhLCBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHsiYSIsICJiIiwgImMiLCAiZCIsICJlIn0pKTsKKyAgRVhQRUNUX1RIQVQoYSwgTm90KFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoeyJhIiwgImIiLCAiYyIsICJkIiwgImVmIn0pKSk7Cit9CisKK1RFU1QoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheVRlc3QsIFRha2VzSW5pdGlhbGl6ZXJMaXN0T2ZTYW1lVHlwZWRNYXRjaGVycykgeworICBjb25zdCBpbnQgYVs1XSA9IHsyLCAxLCA0LCA1LCAzfTsKKyAgRVhQRUNUX1RIQVQoYSwgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgKKyAgICAgIHtFcSgxKSwgRXEoMiksIEVxKDMpLCBFcSg0KSwgRXEoNSl9KSk7CisgIEVYUEVDVF9USEFUKGEsIE5vdChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KAorICAgICAge0VxKDEpLCBFcSgyKSwgRXEoMyksIEVxKDQpLCBFcSg2KX0pKSk7Cit9CisKK1RFU1QoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheVRlc3QsCisgICAgIFRha2VzSW5pdGlhbGl6ZXJMaXN0T2ZEaWZmZXJlbnRUeXBlZE1hdGNoZXJzKSB7CisgIGNvbnN0IGludCBhWzVdID0gezIsIDEsIDQsIDUsIDN9OworICAvLyBUaGUgY29tcGlsZXIgY2Fubm90IGluZmVyIHRoZSB0eXBlIG9mIHRoZSBpbml0aWFsaXplciBsaXN0IGlmIGl0cworICAvLyBlbGVtZW50cyBoYXZlIGRpZmZlcmVudCB0eXBlcy4gIFdlIG11c3QgZXhwbGljaXRseSBzcGVjaWZ5IHRoZQorICAvLyB1bmlmaWVkIGVsZW1lbnQgdHlwZSBpbiB0aGlzIGNhc2UuCisgIEVYUEVDVF9USEFUKGEsIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXk8TWF0Y2hlcjxpbnQ+ID4oCisgICAgICB7RXEoMSksIE5lKC0yKSwgR2UoMyksIExlKDQpLCBFcSg1KX0pKTsKKyAgRVhQRUNUX1RIQVQoYSwgTm90KFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXk8TWF0Y2hlcjxpbnQ+ID4oCisgICAgICB7RXEoMSksIE5lKC0yKSwgR2UoMyksIExlKDQpLCBFcSg2KX0pKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXworCitjbGFzcyBVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD4gSW50VmVjOworfTsKKworVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgV29ya3NXaXRoVW5jb3B5YWJsZSkgeworICBVbmNvcHlhYmxlIG9ianNbMl07CisgIG9ianNbMF0uc2V0X3ZhbHVlKC0zKTsKKyAgb2Jqc1sxXS5zZXRfdmFsdWUoMSk7CisgIEVYUEVDVF9USEFUKG9ianMsCisgICAgICAgICAgICAgIFVub3JkZXJlZEVsZW1lbnRzQXJlKFRydWx5KFZhbHVlSXNQb3NpdGl2ZSksIFVuY29weWFibGVJcygtMykpKTsKK30KKworVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgU3VjY2VlZHNXaGVuRXhwZWN0ZWQpIHsKKyAgY29uc3QgaW50IGFbXSA9IHsxLCAyLCAzfTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBzKGEsIGEgKyBHVEVTVF9BUlJBWV9TSVpFXyhhKSk7CisgIGRvIHsKKyAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOworICAgIEVYUEVDVF9UUlVFKEV4cGxhaW5NYXRjaFJlc3VsdChVbm9yZGVyZWRFbGVtZW50c0FyZSgxLCAyLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7CisgIH0gd2hpbGUgKHN0ZDo6bmV4dF9wZXJtdXRhdGlvbihzLmJlZ2luKCksIHMuZW5kKCkpKTsKK30KKworVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgRmFpbHNXaGVuQW5FbGVtZW50TWF0Y2hlc05vTWF0Y2hlcikgeworICBjb25zdCBpbnQgYVtdID0gezEsIDIsIDN9OworICBzdGQ6OnZlY3RvcjxpbnQ+IHMoYSwgYSArIEdURVNUX0FSUkFZX1NJWkVfKGEpKTsKKyAgc3RkOjp2ZWN0b3I8TWF0Y2hlcjxpbnQ+ID4gbXY7CisgIG12LnB1c2hfYmFjaygxKTsKKyAgbXYucHVzaF9iYWNrKDIpOworICBtdi5wdXNoX2JhY2soMik7CisgIC8vIFRoZSBlbGVtZW50IHdpdGggdmFsdWUgJzMnIG1hdGNoZXMgbm90aGluZzogZmFpbCBmYXN0LgorICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOworICBFWFBFQ1RfRkFMU0UoRXhwbGFpbk1hdGNoUmVzdWx0KFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkobXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsICZsaXN0ZW5lcikpIDw8IGxpc3RlbmVyLnN0cigpOworfQorCitURVNUX0YoVW5vcmRlcmVkRWxlbWVudHNBcmVUZXN0LCBXb3Jrc0ZvclN0cmVhbWxpa2UpIHsKKyAgLy8gU3RyZWFtbGlrZSAnY29udGFpbmVyJyBwcm92aWRlcyBvbmx5IG1pbmltYWwgaXRlcmF0b3Igc3VwcG9ydC4KKyAgLy8gSXRzIGl0ZXJhdG9ycyBhcmUgdGFnZ2VkIHdpdGggaW5wdXRfaXRlcmF0b3JfdGFnLCBhbmQgaXQgaGFzIG5vCisgIC8vIHNpemUoKSBvciBlbXB0eSgpIG1ldGhvZHMuCisgIGNvbnN0IGludCBhWzVdID0gezIsIDEsIDQsIDUsIDN9OworICBTdHJlYW1saWtlPGludD4gcyhhLCBhICsgR1RFU1RfQVJSQVlfU0laRV8oYSkpOworCisgIEVYUEVDVF9USEFUKHMsIFVub3JkZXJlZEVsZW1lbnRzQXJlKDEsIDIsIDMsIDQsIDUpKTsKKyAgRVhQRUNUX1RIQVQocywgTm90KFVub3JkZXJlZEVsZW1lbnRzQXJlKDIsIDIsIDMsIDQsIDUpKSk7Cit9CisKKy8vIE9uZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWF0Y2hlciBydW5zIGluIE8oTiEpIHRpbWUsIHdoaWNoIGlzIHRvbworLy8gc2xvdyBmb3IgbWFueSByZWFsLXdvcmxkIGlucHV0cy4gVGhpcyB0ZXN0IHNob3dzIHRoYXQgb3VyIG1hdGNoZXIgY2FuIG1hdGNoCisvLyAxMDAgaW5wdXRzIHZlcnkgcXVpY2tseSAoYSBmZXcgbWlsbGlzZWNvbmRzKS4gIEFuIE8oMTAwISkgaXMgMTBeMTU4CisvLyBpdGVyYXRpb25zIGFuZCBvYnZpb3VzbHkgZWZmZWN0aXZlbHkgaW5jb21wdXRhYmxlLgorLy8gWyBSVU4gICAgICBdIFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdC5QZXJmb3JtYW5jZQorLy8gWyAgICAgICBPSyBdIFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdC5QZXJmb3JtYW5jZSAoNCBtcykKK1RFU1RfRihVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QsIFBlcmZvcm1hbmNlKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gczsKKyAgc3RkOjp2ZWN0b3I8TWF0Y2hlcjxpbnQ+ID4gbXY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBzLnB1c2hfYmFjayhpKTsKKyAgICBtdi5wdXNoX2JhY2soXyk7CisgIH0KKyAgbXZbNTBdID0gRXEoMCk7CisgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7CisgIEVYUEVDVF9UUlVFKEV4cGxhaW5NYXRjaFJlc3VsdChVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KG12KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsICZsaXN0ZW5lcikpIDw8IGxpc3RlbmVyLnN0cigpOworfQorCisvLyBBbm90aGVyIHZhcmlhbnQgb2YgJ1BlcmZvcm1hbmNlJyB3aXRoIHNpbWlsYXIgZXhwZWN0YXRpb25zLgorLy8gWyBSVU4gICAgICBdIFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdC5QZXJmb3JtYW5jZUhhbGZTdHJpY3QKKy8vIFsgICAgICAgT0sgXSBVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QuUGVyZm9ybWFuY2VIYWxmU3RyaWN0ICg0IG1zKQorVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgUGVyZm9ybWFuY2VIYWxmU3RyaWN0KSB7CisgIHN0ZDo6dmVjdG9yPGludD4gczsKKyAgc3RkOjp2ZWN0b3I8TWF0Y2hlcjxpbnQ+ID4gbXY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBzLnB1c2hfYmFjayhpKTsKKyAgICBpZiAoaSAmIDEpIHsKKyAgICAgIG12LnB1c2hfYmFjayhfKTsKKyAgICB9IGVsc2UgeworICAgICAgbXYucHVzaF9iYWNrKGkpOworICAgIH0KKyAgfQorICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOworICBFWFBFQ1RfVFJVRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShtdiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCAmbGlzdGVuZXIpKSA8PCBsaXN0ZW5lci5zdHIoKTsKK30KKworVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgRmFpbE1lc3NhZ2VDb3VudFdyb25nKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gdjsKKyAgdi5wdXNoX2JhY2soNCk7CisgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7CisgIEVYUEVDVF9GQUxTRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgMiwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7CisgIEVYUEVDVF9USEFUKGxpc3RlbmVyLnN0cigpLCBFcSgid2hpY2ggaGFzIDEgZWxlbWVudCIpKTsKK30KKworVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgRmFpbE1lc3NhZ2VDb3VudFdyb25nWmVybykgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7CisgIEVYUEVDVF9GQUxTRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgMiwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7CisgIEVYUEVDVF9USEFUKGxpc3RlbmVyLnN0cigpLCBFcSgiIikpOworfQorCitURVNUX0YoVW5vcmRlcmVkRWxlbWVudHNBcmVUZXN0LCBGYWlsTWVzc2FnZVVubWF0Y2hlZE1hdGNoZXJzKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gdjsKKyAgdi5wdXNoX2JhY2soMSk7CisgIHYucHVzaF9iYWNrKDEpOworICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOworICBFWFBFQ1RfRkFMU0UoRXhwbGFpbk1hdGNoUmVzdWx0KFVub3JkZXJlZEVsZW1lbnRzQXJlKDEsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsICZsaXN0ZW5lcikpIDw8IGxpc3RlbmVyLnN0cigpOworICBFWFBFQ1RfVEhBVCgKKyAgICAgIGxpc3RlbmVyLnN0cigpLAorICAgICAgRXEoIndoZXJlIHRoZSBmb2xsb3dpbmcgbWF0Y2hlcnMgZG9uJ3QgbWF0Y2ggYW55IGVsZW1lbnRzOlxuIgorICAgICAgICAgIm1hdGNoZXIgIzE6IGlzIGVxdWFsIHRvIDIiKSk7Cit9CisKK1RFU1RfRihVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QsIEZhaWxNZXNzYWdlVW5tYXRjaGVkRWxlbWVudHMpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2OworICB2LnB1c2hfYmFjaygxKTsKKyAgdi5wdXNoX2JhY2soMik7CisgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7CisgIEVYUEVDVF9GQUxTRShFeHBsYWluTWF0Y2hSZXN1bHQoVW5vcmRlcmVkRWxlbWVudHNBcmUoMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgJmxpc3RlbmVyKSkgPDwgbGlzdGVuZXIuc3RyKCk7CisgIEVYUEVDVF9USEFUKAorICAgICAgbGlzdGVuZXIuc3RyKCksCisgICAgICBFcSgid2hlcmUgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBkb24ndCBtYXRjaCBhbnkgbWF0Y2hlcnM6XG4iCisgICAgICAgICAiZWxlbWVudCAjMTogMiIpKTsKK30KKworVEVTVF9GKFVub3JkZXJlZEVsZW1lbnRzQXJlVGVzdCwgRmFpbE1lc3NhZ2VVbm1hdGNoZWRNYXRjaGVyQW5kRWxlbWVudCkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIHYucHVzaF9iYWNrKDIpOworICB2LnB1c2hfYmFjaygzKTsKKyAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsKKyAgRVhQRUNUX0ZBTFNFKEV4cGxhaW5NYXRjaFJlc3VsdChVbm9yZGVyZWRFbGVtZW50c0FyZSgxLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LCAmbGlzdGVuZXIpKSA8PCBsaXN0ZW5lci5zdHIoKTsKKyAgRVhQRUNUX1RIQVQoCisgICAgICBsaXN0ZW5lci5zdHIoKSwKKyAgICAgIEVxKCJ3aGVyZSIKKyAgICAgICAgICIgdGhlIGZvbGxvd2luZyBtYXRjaGVycyBkb24ndCBtYXRjaCBhbnkgZWxlbWVudHM6XG4iCisgICAgICAgICAibWF0Y2hlciAjMDogaXMgZXF1YWwgdG8gMVxuIgorICAgICAgICAgImFuZCIKKyAgICAgICAgICIgd2hlcmUiCisgICAgICAgICAiIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMgZG9uJ3QgbWF0Y2ggYW55IG1hdGNoZXJzOlxuIgorICAgICAgICAgImVsZW1lbnQgIzE6IDMiKSk7Cit9CisKKy8vIFRlc3QgaGVscGVyIGZvciBmb3JtYXR0aW5nIGVsZW1lbnQsIG1hdGNoZXIgaW5kZXggcGFpcnMgaW4gZXhwZWN0YXRpb25zLgorc3RhdGljIHN0cmluZyBFTVN0cmluZyhpbnQgZWxlbWVudCwgaW50IG1hdGNoZXIpIHsKKyAgc3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAiKGVsZW1lbnQgIyIgPDwgZWxlbWVudCA8PCAiLCBtYXRjaGVyICMiIDw8IG1hdGNoZXIgPDwgIikiOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK1RFU1RfRihVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QsIEZhaWxNZXNzYWdlSW1wZXJmZWN0TWF0Y2hPbmx5KSB7CisgIC8vIEEgc2l0dWF0aW9uIHdoZXJlIGFsbCBlbGVtZW50cyBhbmQgbWF0Y2hlcnMgaGF2ZSBhIG1hdGNoCisgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBidXQgdGhlIG1heCBtYXRjaGluZyBpcyBub3QgcGVyZmVjdC4KKyAgc3RkOjp2ZWN0b3I8c3RyaW5nPiB2OworICB2LnB1c2hfYmFjaygiYSIpOworICB2LnB1c2hfYmFjaygiYiIpOworICB2LnB1c2hfYmFjaygiYyIpOworICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOworICBFWFBFQ1RfRkFMU0UoRXhwbGFpbk1hdGNoUmVzdWx0KAorICAgICAgVW5vcmRlcmVkRWxlbWVudHNBcmUoImEiLCAiYSIsIEFueU9mKCJiIiwgImMiKSksIHYsICZsaXN0ZW5lcikpCisgICAgICA8PCBsaXN0ZW5lci5zdHIoKTsKKworICBzdHJpbmcgcHJlZml4ID0KKyAgICAgICJ3aGVyZSBubyBwZXJtdXRhdGlvbiBvZiB0aGUgZWxlbWVudHMgY2FuIHNhdGlzZnkgYWxsIG1hdGNoZXJzLCAiCisgICAgICAiYW5kIHRoZSBjbG9zZXN0IG1hdGNoIGlzIDIgb2YgMyBtYXRjaGVycyB3aXRoIHRoZSAiCisgICAgICAicGFpcmluZ3M6XG4iOworCisgIC8vIFdlIGhhdmUgdG8gYmUgYSBiaXQgbG9vc2UgaGVyZSwgYmVjYXVzZSB0aGVyZSBhcmUgNCB2YWxpZCBtYXggbWF0Y2hlcy4KKyAgRVhQRUNUX1RIQVQoCisgICAgICBsaXN0ZW5lci5zdHIoKSwKKyAgICAgIEFueU9mKHByZWZpeCArICJ7XG4gICIgKyBFTVN0cmluZygwLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAiLFxuICAiICsgRU1TdHJpbmcoMSwgMikgKyAiXG59IiwKKyAgICAgICAgICAgIHByZWZpeCArICJ7XG4gICIgKyBFTVN0cmluZygwLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAiLFxuICAiICsgRU1TdHJpbmcoMSwgMikgKyAiXG59IiwKKyAgICAgICAgICAgIHByZWZpeCArICJ7XG4gICIgKyBFTVN0cmluZygwLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAiLFxuICAiICsgRU1TdHJpbmcoMiwgMikgKyAiXG59IiwKKyAgICAgICAgICAgIHByZWZpeCArICJ7XG4gICIgKyBFTVN0cmluZygwLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAiLFxuICAiICsgRU1TdHJpbmcoMiwgMikgKyAiXG59IikpOworfQorCitURVNUX0YoVW5vcmRlcmVkRWxlbWVudHNBcmVUZXN0LCBEZXNjcmliZSkgeworICBFWFBFQ1RfVEhBVChEZXNjcmliZTxJbnRWZWM+KFVub3JkZXJlZEVsZW1lbnRzQXJlKCkpLAorICAgICAgICAgICAgICBFcSgiaXMgZW1wdHkiKSk7CisgIEVYUEVDVF9USEFUKAorICAgICAgRGVzY3JpYmU8SW50VmVjPihVbm9yZGVyZWRFbGVtZW50c0FyZSgzNDUpKSwKKyAgICAgIEVxKCJoYXMgMSBlbGVtZW50IGFuZCB0aGF0IGVsZW1lbnQgaXMgZXF1YWwgdG8gMzQ1IikpOworICBFWFBFQ1RfVEhBVCgKKyAgICAgIERlc2NyaWJlPEludFZlYz4oVW5vcmRlcmVkRWxlbWVudHNBcmUoMTExLCAyMjIsIDMzMykpLAorICAgICAgRXEoImhhcyAzIGVsZW1lbnRzIGFuZCB0aGVyZSBleGlzdHMgc29tZSBwZXJtdXRhdGlvbiAiCisgICAgICAgICAib2YgZWxlbWVudHMgc3VjaCB0aGF0OlxuIgorICAgICAgICAgIiAtIGVsZW1lbnQgIzAgaXMgZXF1YWwgdG8gMTExLCBhbmRcbiIKKyAgICAgICAgICIgLSBlbGVtZW50ICMxIGlzIGVxdWFsIHRvIDIyMiwgYW5kXG4iCisgICAgICAgICAiIC0gZWxlbWVudCAjMiBpcyBlcXVhbCB0byAzMzMiKSk7Cit9CisKK1RFU1RfRihVbm9yZGVyZWRFbGVtZW50c0FyZVRlc3QsIERlc2NyaWJlTmVnYXRpb24pIHsKKyAgRVhQRUNUX1RIQVQoRGVzY3JpYmVOZWdhdGlvbjxJbnRWZWM+KFVub3JkZXJlZEVsZW1lbnRzQXJlKCkpLAorICAgICAgICAgICAgICBFcSgiaXNuJ3QgZW1wdHkiKSk7CisgIEVYUEVDVF9USEFUKAorICAgICAgRGVzY3JpYmVOZWdhdGlvbjxJbnRWZWM+KFVub3JkZXJlZEVsZW1lbnRzQXJlKDM0NSkpLAorICAgICAgRXEoImRvZXNuJ3QgaGF2ZSAxIGVsZW1lbnQsIG9yIGhhcyAxIGVsZW1lbnQgdGhhdCBpc24ndCBlcXVhbCB0byAzNDUiKSk7CisgIEVYUEVDVF9USEFUKAorICAgICAgRGVzY3JpYmVOZWdhdGlvbjxJbnRWZWM+KFVub3JkZXJlZEVsZW1lbnRzQXJlKDEyMywgMjM0LCAzNDUpKSwKKyAgICAgIEVxKCJkb2Vzbid0IGhhdmUgMyBlbGVtZW50cywgb3IgdGhlcmUgZXhpc3RzIG5vIHBlcm11dGF0aW9uICIKKyAgICAgICAgICJvZiBlbGVtZW50cyBzdWNoIHRoYXQ6XG4iCisgICAgICAgICAiIC0gZWxlbWVudCAjMCBpcyBlcXVhbCB0byAxMjMsIGFuZFxuIgorICAgICAgICAgIiAtIGVsZW1lbnQgIzEgaXMgZXF1YWwgdG8gMjM0LCBhbmRcbiIKKyAgICAgICAgICIgLSBlbGVtZW50ICMyIGlzIGVxdWFsIHRvIDM0NSIpKTsKK30KKworbmFtZXNwYWNlIHsKKworLy8gVXNlZCBhcyBhIGNoZWNrIG9uIHRoZSBtb3JlIGNvbXBsZXggbWF4IGZsb3cgbWV0aG9kIHVzZWQgaW4gdGhlCisvLyByZWFsIHRlc3Rpbmc6OmludGVybmFsOjpGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcuIFRoaXMgbWV0aG9kIGlzCisvLyBjb21wYXRpYmxlIGJ1dCBydW5zIGluIHdvcnN0LWNhc2UgZmFjdG9yaWFsIHRpbWUsIHNvIHdlIG9ubHkKKy8vIHVzZSBpdCBpbiB0ZXN0aW5nIGZvciBzbWFsbCBwcm9ibGVtIHNpemVzLgordGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoPgorY2xhc3MgQmFja3RyYWNraW5nTWF4QlBNU3RhdGUgeworIHB1YmxpYzoKKyAgLy8gRG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgJ2cnLgorICBleHBsaWNpdCBCYWNrdHJhY2tpbmdNYXhCUE1TdGF0ZShjb25zdCBHcmFwaCogZykgOiBncmFwaF8oZykgeyB9CisKKyAgRWxlbWVudE1hdGNoZXJQYWlycyBDb21wdXRlKCkgeworICAgIGlmIChncmFwaF8tPkxoc1NpemUoKSA9PSAwIHx8IGdyYXBoXy0+UmhzU2l6ZSgpID09IDApIHsKKyAgICAgIHJldHVybiBiZXN0X3NvX2Zhcl87CisgICAgfQorICAgIGxoc191c2VkXy5hc3NpZ24oZ3JhcGhfLT5MaHNTaXplKCksIGtVbnVzZWQpOworICAgIHJoc191c2VkXy5hc3NpZ24oZ3JhcGhfLT5SaHNTaXplKCksIGtVbnVzZWQpOworICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgZ3JhcGhfLT5SaHNTaXplKCk7ICsraXJocykgeworICAgICAgbWF0Y2hlc18uY2xlYXIoKTsKKyAgICAgIFJlY3Vyc2VJbnRvKGlyaHMpOworICAgICAgaWYgKGJlc3Rfc29fZmFyXy5zaXplKCkgPT0gZ3JhcGhfLT5SaHNTaXplKCkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gYmVzdF9zb19mYXJfOworICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtVbnVzZWQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KC0xKTsKKworICB2b2lkIFB1c2hNYXRjaChzaXplX3QgbGhzLCBzaXplX3QgcmhzKSB7CisgICAgbWF0Y2hlc18ucHVzaF9iYWNrKEVsZW1lbnRNYXRjaGVyUGFpcihsaHMsIHJocykpOworICAgIGxoc191c2VkX1tsaHNdID0gcmhzOworICAgIHJoc191c2VkX1tyaHNdID0gbGhzOworICAgIGlmIChtYXRjaGVzXy5zaXplKCkgPiBiZXN0X3NvX2Zhcl8uc2l6ZSgpKSB7CisgICAgICBiZXN0X3NvX2Zhcl8gPSBtYXRjaGVzXzsKKyAgICB9CisgIH0KKworICB2b2lkIFBvcE1hdGNoKCkgeworICAgIGNvbnN0IEVsZW1lbnRNYXRjaGVyUGFpciYgYmFjayA9IG1hdGNoZXNfLmJhY2soKTsKKyAgICBsaHNfdXNlZF9bYmFjay5maXJzdF0gPSBrVW51c2VkOworICAgIHJoc191c2VkX1tiYWNrLnNlY29uZF0gPSBrVW51c2VkOworICAgIG1hdGNoZXNfLnBvcF9iYWNrKCk7CisgIH0KKworICBib29sIFJlY3Vyc2VJbnRvKHNpemVfdCBpcmhzKSB7CisgICAgaWYgKHJoc191c2VkX1tpcmhzXSAhPSBrVW51c2VkKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBncmFwaF8tPkxoc1NpemUoKTsgKytpbGhzKSB7CisgICAgICBpZiAobGhzX3VzZWRfW2lsaHNdICE9IGtVbnVzZWQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoIWdyYXBoXy0+SGFzRWRnZShpbGhzLCBpcmhzKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFB1c2hNYXRjaChpbGhzLCBpcmhzKTsKKyAgICAgIGlmIChiZXN0X3NvX2Zhcl8uc2l6ZSgpID09IGdyYXBoXy0+UmhzU2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGZvciAoc2l6ZV90IG1pID0gaXJocyArIDE7IG1pIDwgZ3JhcGhfLT5SaHNTaXplKCk7ICsrbWkpIHsKKyAgICAgICAgaWYgKCFSZWN1cnNlSW50byhtaSkpIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIFBvcE1hdGNoKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgR3JhcGgqIGdyYXBoXzsgIC8vIG5vdCBvd25lZAorICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGxoc191c2VkXzsKKyAgc3RkOjp2ZWN0b3I8c2l6ZV90PiByaHNfdXNlZF87CisgIEVsZW1lbnRNYXRjaGVyUGFpcnMgbWF0Y2hlc187CisgIEVsZW1lbnRNYXRjaGVyUGFpcnMgYmVzdF9zb19mYXJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoPgorY29uc3Qgc2l6ZV90IEJhY2t0cmFja2luZ01heEJQTVN0YXRlPEdyYXBoPjo6a1VudXNlZDsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIEltcGxlbWVudCBhIHNpbXBsZSBiYWNrdHJhY2tpbmcgYWxnb3JpdGhtIHRvIGRldGVybWluZSBpZiBpdCBpcyBwb3NzaWJsZQorLy8gdG8gZmluZCBvbmUgZWxlbWVudCBwZXIgbWF0Y2hlciwgd2l0aG91dCByZXVzaW5nIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoPgorRWxlbWVudE1hdGNoZXJQYWlycworRmluZEJhY2t0cmFja2luZ01heEJQTShjb25zdCBHcmFwaCYgZykgeworICByZXR1cm4gQmFja3RyYWNraW5nTWF4QlBNU3RhdGU8R3JhcGg+KCZnKS5Db21wdXRlKCk7Cit9CisKK2NsYXNzIEJhY2t0cmFja2luZ0JQTVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsgfTsKKworLy8gVGVzdHMgdGhlIE1heEJpcGFydGl0ZU1hdGNoaW5nIGFsZ29yaXRobSB3aXRoIHNxdWFyZSBtYXRyaWNlcy4KKy8vIFRoZSBzaW5nbGUgaW50IHBhcmFtIGlzIHRoZSAjIG9mIG5vZGVzIG9uIGVhY2ggb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzLgorY2xhc3MgQmlwYXJ0aXRlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7IH07CisKKy8vIFZlcmlmeSBhbGwgbWF0Y2ggZ3JhcGhzIHVwIHRvIHNvbWUgbW9kZXJhdGUgbnVtYmVyIG9mIGVkZ2VzLgorVEVTVF9QKEJpcGFydGl0ZVRlc3QsIEV4aGF1c3RpdmUpIHsKKyAgaW50IG5vZGVzID0gR2V0UGFyYW0oKTsKKyAgTWF0Y2hNYXRyaXggZ3JhcGgobm9kZXMsIG5vZGVzKTsKKyAgZG8geworICAgIEVsZW1lbnRNYXRjaGVyUGFpcnMgbWF0Y2hlcyA9CisgICAgICAgIGludGVybmFsOjpGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcoZ3JhcGgpOworICAgIEVYUEVDVF9FUShGaW5kQmFja3RyYWNraW5nTWF4QlBNKGdyYXBoKS5zaXplKCksIG1hdGNoZXMuc2l6ZSgpKQorICAgICAgICA8PCAiZ3JhcGg6ICIgPDwgZ3JhcGguRGVidWdTdHJpbmcoKTsKKyAgICAvLyBDaGVjayB0aGF0IGFsbCBlbGVtZW50cyBvZiBtYXRjaGVzIGFyZSBpbiB0aGUgZ3JhcGguCisgICAgLy8gQ2hlY2sgdGhhdCBlbGVtZW50cyBvZiBmaXJzdCBhbmQgc2Vjb25kIGFyZSB1bmlxdWUuCisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gc2Vlbl9lbGVtZW50KGdyYXBoLkxoc1NpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gc2Vlbl9tYXRjaGVyKGdyYXBoLlJoc1NpemUoKSk7CisgICAgU0NPUEVEX1RSQUNFKFByaW50VG9TdHJpbmcobWF0Y2hlcykpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hlcy5zaXplKCk7ICsraSkgeworICAgICAgc2l6ZV90IGlsaHMgPSBtYXRjaGVzW2ldLmZpcnN0OworICAgICAgc2l6ZV90IGlyaHMgPSBtYXRjaGVzW2ldLnNlY29uZDsKKyAgICAgIEVYUEVDVF9UUlVFKGdyYXBoLkhhc0VkZ2UoaWxocywgaXJocykpOworICAgICAgRVhQRUNUX0ZBTFNFKHNlZW5fZWxlbWVudFtpbGhzXSk7CisgICAgICBFWFBFQ1RfRkFMU0Uoc2Vlbl9tYXRjaGVyW2lyaHNdKTsKKyAgICAgIHNlZW5fZWxlbWVudFtpbGhzXSA9IHRydWU7CisgICAgICBzZWVuX21hdGNoZXJbaXJoc10gPSB0cnVlOworICAgIH0KKyAgfSB3aGlsZSAoZ3JhcGguTmV4dEdyYXBoKCkpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbGxHcmFwaHMsIEJpcGFydGl0ZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIDUpKTsKKworLy8gUGFyYW1ldGVyaXplZCBieSBhIHBhaXIgaW50ZXJwcmV0ZWQgYXMgKExoc1NpemUsIFJoc1NpemUpLgorY2xhc3MgQmlwYXJ0aXRlTm9uU3F1YXJlVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+ID4geworfTsKKworVEVTVF9GKEJpcGFydGl0ZU5vblNxdWFyZVRlc3QsIFNpbXBsZUJhY2t0cmFja2luZykgeworICAvLyAgIC4uLi4uLi4KKyAgLy8gMDotLS0tLVwgOgorICAvLyAxOi0tLVwgfCA6CisgIC8vIDI6LS0tXCB8IDoKKyAgLy8gMzotXCB8IHwgOgorICAvLyAgOi4uLi4uLi46CisgIC8vICAgIDAgMSAyCisgIE1hdGNoTWF0cml4IGcoNCwgMyk7CisgIHN0YXRpYyBjb25zdCBpbnQga0VkZ2VzW11bMl0gPSB7ezAsIDJ9LCB7MSwgMX0sIHsyLCAxfSwgezMsIDB9fTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHVEVTVF9BUlJBWV9TSVpFXyhrRWRnZXMpOyArK2kpIHsKKyAgICBnLlNldEVkZ2Uoa0VkZ2VzW2ldWzBdLCBrRWRnZXNbaV1bMV0sIHRydWUpOworICB9CisgIEVYUEVDVF9USEFUKEZpbmRCYWNrdHJhY2tpbmdNYXhCUE0oZyksCisgICAgICAgICAgICAgIEVsZW1lbnRzQXJlKFBhaXIoMywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIoQW55T2YoMSwgMiksIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlyKDAsIDIpKSkgPDwgZy5EZWJ1Z1N0cmluZygpOworfQorCisvLyBWZXJpZnkgYSBmZXcgbm9uc3F1YXJlIG1hdHJpY2VzLgorVEVTVF9QKEJpcGFydGl0ZU5vblNxdWFyZVRlc3QsIEV4aGF1c3RpdmUpIHsKKyAgc2l6ZV90IG5saHMgPSBHZXRQYXJhbSgpLmZpcnN0OworICBzaXplX3QgbnJocyA9IEdldFBhcmFtKCkuc2Vjb25kOworICBNYXRjaE1hdHJpeCBncmFwaChubGhzLCBucmhzKTsKKyAgZG8geworICAgIEVYUEVDVF9FUShGaW5kQmFja3RyYWNraW5nTWF4QlBNKGdyYXBoKS5zaXplKCksCisgICAgICAgICAgICAgIGludGVybmFsOjpGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcoZ3JhcGgpLnNpemUoKSkKKyAgICAgICAgPDwgImdyYXBoOiAiIDw8IGdyYXBoLkRlYnVnU3RyaW5nKCkKKyAgICAgICAgPDwgIlxuYmFja3RyYWNraW5nOiAiCisgICAgICAgIDw8IFByaW50VG9TdHJpbmcoRmluZEJhY2t0cmFja2luZ01heEJQTShncmFwaCkpCisgICAgICAgIDw8ICJcbm1heCBmbG93OiAiCisgICAgICAgIDw8IFByaW50VG9TdHJpbmcoaW50ZXJuYWw6OkZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhncmFwaCkpOworICB9IHdoaWxlIChncmFwaC5OZXh0R3JhcGgoKSk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFsbEdyYXBocywgQmlwYXJ0aXRlTm9uU3F1YXJlVGVzdCwKKyAgICB0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIDIpLAorICAgICAgICBzdGQ6Om1ha2VfcGFpcigyLCAxKSwKKyAgICAgICAgc3RkOjptYWtlX3BhaXIoMywgMiksCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDIsIDMpLAorICAgICAgICBzdGQ6Om1ha2VfcGFpcig0LCAxKSwKKyAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgNCksCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDQsIDMpLAorICAgICAgICBzdGQ6Om1ha2VfcGFpcigzLCA0KSkpOworCitjbGFzcyBCaXBhcnRpdGVSYW5kb21UZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjxpbnQsIGludD4gPiB7Cit9OworCisvLyBWZXJpZmllcyBhIGxhcmdlIHNhbXBsZSBvZiBsYXJnZXIgZ3JhcGhzLgorVEVTVF9QKEJpcGFydGl0ZVJhbmRvbVRlc3QsIExhcmdlck5ldHMpIHsKKyAgaW50IG5vZGVzID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgaW50IGl0ZXJzID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgIE1hdGNoTWF0cml4IGdyYXBoKG5vZGVzLCBub2Rlcyk7CisKKyAgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyIHNlZWQgPSBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKKyAgaWYgKHNlZWQgPT0gMCkgeworICAgIHNlZWQgPSBzdGF0aWNfY2FzdDx0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzI+KHRpbWUoTlVMTCkpOworICB9CisKKyAgZm9yICg7IGl0ZXJzID4gMDsgLS1pdGVycywgKytzZWVkKSB7CisgICAgc3JhbmQoc3RhdGljX2Nhc3Q8aW50PihzZWVkKSk7CisgICAgZ3JhcGguUmFuZG9taXplKCk7CisgICAgRVhQRUNUX0VRKEZpbmRCYWNrdHJhY2tpbmdNYXhCUE0oZ3JhcGgpLnNpemUoKSwKKyAgICAgICAgICAgICAgaW50ZXJuYWw6OkZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhncmFwaCkuc2l6ZSgpKQorICAgICAgICA8PCAiIGdyYXBoOiAiIDw8IGdyYXBoLkRlYnVnU3RyaW5nKCkKKyAgICAgICAgPDwgIlxuVG8gcmVwcm9kdWNlIHRoZSBmYWlsdXJlLCByZXJ1biB0aGUgdGVzdCB3aXRoIHRoZSBmbGFnIgorICAgICAgICAgICAiIC0tIiA8PCBHVEVTVF9GTEFHX1BSRUZJWF8gPDwgInJhbmRvbV9zZWVkPSIgPDwgc2VlZDsKKyAgfQorfQorCisvLyBUZXN0IGFyZ3VtZW50IGlzIGEgc3RkOjpwYWlyPGludCwgaW50PiByZXByZXNlbnRpbmcgKG5vZGVzLCBpdGVycykuCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTYW1wbGVzLCBCaXBhcnRpdGVSYW5kb21UZXN0LAorICAgIHRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgc3RkOjptYWtlX3BhaXIoNSwgMTAwMDApLAorICAgICAgICBzdGQ6Om1ha2VfcGFpcig2LCA1MDAwKSwKKyAgICAgICAgc3RkOjptYWtlX3BhaXIoNywgMjAwMCksCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDgsIDUwMCksCisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDksIDEwMCkpKTsKKworLy8gVGVzdHMgSXNSZWFkYWJsZVR5cGVOYW1lKCkuCisKK1RFU1QoSXNSZWFkYWJsZVR5cGVOYW1lVGVzdCwgUmV0dXJuc1RydWVGb3JTaG9ydE5hbWVzKSB7CisgIEVYUEVDVF9UUlVFKElzUmVhZGFibGVUeXBlTmFtZSgiaW50IikpOworICBFWFBFQ1RfVFJVRShJc1JlYWRhYmxlVHlwZU5hbWUoImNvbnN0IHVuc2lnbmVkIGNoYXIqIikpOworICBFWFBFQ1RfVFJVRShJc1JlYWRhYmxlVHlwZU5hbWUoIk15TWFwPGludCwgdm9pZCo+IikpOworICBFWFBFQ1RfVFJVRShJc1JlYWRhYmxlVHlwZU5hbWUoInZvaWQgKCopKGludCwgYm9vbCkiKSk7Cit9CisKK1RFU1QoSXNSZWFkYWJsZVR5cGVOYW1lVGVzdCwgUmV0dXJuc1RydWVGb3JMb25nTm9uVGVtcGxhdGVOb25GdW5jdGlvbk5hbWVzKSB7CisgIEVYUEVDVF9UUlVFKElzUmVhZGFibGVUeXBlTmFtZSgibXlfbG9uZ19uYW1lc3BhY2U6Ok15Q2xhc3NOYW1lIikpOworICBFWFBFQ1RfVFJVRShJc1JlYWRhYmxlVHlwZU5hbWUoImludCBbNV1bNl1bN11bOF1bOV1bMTBdWzExXSIpKTsKKyAgRVhQRUNUX1RSVUUoSXNSZWFkYWJsZVR5cGVOYW1lKCJteV9uYW1lc3BhY2U6Ok15T3V0ZXJDbGFzczo6TXlJbm5lckNsYXNzIikpOworfQorCitURVNUKElzUmVhZGFibGVUeXBlTmFtZVRlc3QsIFJldHVybnNGYWxzZUZvckxvbmdUZW1wbGF0ZU5hbWVzKSB7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIElzUmVhZGFibGVUeXBlTmFtZSgiYmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4gPiIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUmVhZGFibGVUeXBlTmFtZSgic3RkOjp2ZWN0b3I8aW50LCBzdGQ6OmFsbG9jX3RyYWl0czxpbnQ+ID4iKSk7Cit9CisKK1RFU1QoSXNSZWFkYWJsZVR5cGVOYW1lVGVzdCwgUmV0dXJuc0ZhbHNlRm9yTG9uZ0Z1bmN0aW9uVHlwZU5hbWVzKSB7CisgIEVYUEVDVF9GQUxTRShJc1JlYWRhYmxlVHlwZU5hbWUoInZvaWQgKCYpKGludCwgYm9vbCwgY2hhciwgZmxvYXQpIikpOworfQorCisvLyBUZXN0cyBKb2luQXNUdXBsZSgpLgorCitURVNUKEpvaW5Bc1R1cGxlVGVzdCwgSm9pbnNFbXB0eVR1cGxlKSB7CisgIEVYUEVDVF9FUSgiIiwgSm9pbkFzVHVwbGUoU3RyaW5ncygpKSk7Cit9CisKK1RFU1QoSm9pbkFzVHVwbGVUZXN0LCBKb2luc09uZVR1cGxlKSB7CisgIGNvbnN0IGNoYXIqIGZpZWxkc1tdID0geyIxIn07CisgIEVYUEVDVF9FUSgiMSIsIEpvaW5Bc1R1cGxlKFN0cmluZ3MoZmllbGRzLCBmaWVsZHMgKyAxKSkpOworfQorCitURVNUKEpvaW5Bc1R1cGxlVGVzdCwgSm9pbnNUd29UdXBsZSkgeworICBjb25zdCBjaGFyKiBmaWVsZHNbXSA9IHsiMSIsICJhIn07CisgIEVYUEVDVF9FUSgiKDEsIGEpIiwgSm9pbkFzVHVwbGUoU3RyaW5ncyhmaWVsZHMsIGZpZWxkcyArIDIpKSk7Cit9CisKK1RFU1QoSm9pbkFzVHVwbGVUZXN0LCBKb2luc1RlblR1cGxlKSB7CisgIGNvbnN0IGNoYXIqIGZpZWxkc1tdID0geyIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCJ9OworICBFWFBFQ1RfRVEoIigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkiLAorICAgICAgICAgICAgSm9pbkFzVHVwbGUoU3RyaW5ncyhmaWVsZHMsIGZpZWxkcyArIDEwKSkpOworfQorCisvLyBUZXN0cyBGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oKS4KKworVEVTVChGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb25UZXN0LCBXb3Jrc0ZvckVtcHR5RGVzY3JpcHRpb24pIHsKKyAgRVhQRUNUX0VRKCJpcyBldmVuIiwKKyAgICAgICAgICAgIEZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihmYWxzZSwgIklzRXZlbiIsIFN0cmluZ3MoKSkpOworICBFWFBFQ1RfRVEoIm5vdCAoaXMgZXZlbikiLAorICAgICAgICAgICAgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKHRydWUsICJJc0V2ZW4iLCBTdHJpbmdzKCkpKTsKKworICBjb25zdCBjaGFyKiBwYXJhbXNbXSA9IHsiNSJ9OworICBFWFBFQ1RfRVEoImVxdWFscyA1IiwKKyAgICAgICAgICAgIEZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihmYWxzZSwgIkVxdWFscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5ncyhwYXJhbXMsIHBhcmFtcyArIDEpKSk7CisKKyAgY29uc3QgY2hhciogcGFyYW1zMltdID0geyI1IiwgIjgifTsKKyAgRVhQRUNUX0VRKCJpcyBpbiByYW5nZSAoNSwgOCkiLAorICAgICAgICAgICAgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKGZhbHNlLCAiSXNJblJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdzKHBhcmFtczIsIHBhcmFtczIgKyAyKSkpOworfQorCisvLyBUZXN0cyBQb2x5bW9ycGhpY01hdGNoZXI6Om11dGFibGVfaW1wbCgpLgorVEVTVChQb2x5bW9ycGhpY01hdGNoZXJUZXN0LCBDYW5BY2Nlc3NNdXRhYmxlSW1wbCkgeworICBQb2x5bW9ycGhpY01hdGNoZXI8RGl2aXNpYmxlQnlJbXBsPiBtKERpdmlzaWJsZUJ5SW1wbCg0MikpOworICBEaXZpc2libGVCeUltcGwmIGltcGwgPSBtLm11dGFibGVfaW1wbCgpOworICBFWFBFQ1RfRVEoNDIsIGltcGwuZGl2aWRlcigpKTsKKworICBpbXBsLnNldF9kaXZpZGVyKDApOworICBFWFBFQ1RfRVEoMCwgbS5tdXRhYmxlX2ltcGwoKS5kaXZpZGVyKCkpOworfQorCisvLyBUZXN0cyBQb2x5bW9ycGhpY01hdGNoZXI6OmltcGwoKS4KK1RFU1QoUG9seW1vcnBoaWNNYXRjaGVyVGVzdCwgQ2FuQWNjZXNzSW1wbCkgeworICBjb25zdCBQb2x5bW9ycGhpY01hdGNoZXI8RGl2aXNpYmxlQnlJbXBsPiBtKERpdmlzaWJsZUJ5SW1wbCg0MikpOworICBjb25zdCBEaXZpc2libGVCeUltcGwmIGltcGwgPSBtLmltcGwoKTsKKyAgRVhQRUNUX0VRKDQyLCBpbXBsLmRpdmlkZXIoKSk7Cit9CisKK1RFU1QoTWF0Y2hlclR1cGxlVGVzdCwgRXhwbGFpbnNNYXRjaEZhaWx1cmUpIHsKKyAgc3RyaW5nc3RyZWFtIHNzMTsKKyAgRXhwbGFpbk1hdGNoRmFpbHVyZVR1cGxlVG8obWFrZV90dXBsZShNYXRjaGVyPGNoYXI+KEVxKCdhJykpLCBHcmVhdGVyVGhhbig1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoJ2EnLCAxMCksICZzczEpOworICBFWFBFQ1RfRVEoIiIsIHNzMS5zdHIoKSk7ICAvLyBTdWNjZXNzZnVsIG1hdGNoLgorCisgIHN0cmluZ3N0cmVhbSBzczI7CisgIEV4cGxhaW5NYXRjaEZhaWx1cmVUdXBsZVRvKG1ha2VfdHVwbGUoR3JlYXRlclRoYW4oNSksIE1hdGNoZXI8Y2hhcj4oRXEoJ2EnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDIsICdiJyksICZzczIpOworICBFWFBFQ1RfRVEoIiAgRXhwZWN0ZWQgYXJnICMwOiBpcyA+IDVcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgIEFjdHVhbDogMiwgd2hpY2ggaXMgMyBsZXNzIHRoYW4gNVxuIgorICAgICAgICAgICAgIiAgRXhwZWN0ZWQgYXJnICMxOiBpcyBlcXVhbCB0byAnYScgKDk3LCAweDYxKVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgQWN0dWFsOiAnYicgKDk4LCAweDYyKVxuIiwKKyAgICAgICAgICAgIHNzMi5zdHIoKSk7ICAvLyBGYWlsZWQgbWF0Y2ggd2hlcmUgYm90aCBhcmd1bWVudHMgbmVlZCBleHBsYW5hdGlvbi4KKworICBzdHJpbmdzdHJlYW0gc3MzOworICBFeHBsYWluTWF0Y2hGYWlsdXJlVHVwbGVUbyhtYWtlX3R1cGxlKEdyZWF0ZXJUaGFuKDUpLCBNYXRjaGVyPGNoYXI+KEVxKCdhJykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgyLCAnYScpLCAmc3MzKTsKKyAgRVhQRUNUX0VRKCIgIEV4cGVjdGVkIGFyZyAjMDogaXMgPiA1XG4iCisgICAgICAgICAgICAiICAgICAgICAgICBBY3R1YWw6IDIsIHdoaWNoIGlzIDMgbGVzcyB0aGFuIDVcbiIsCisgICAgICAgICAgICBzczMuc3RyKCkpOyAgLy8gRmFpbGVkIG1hdGNoIHdoZXJlIG9ubHkgb25lIGFyZ3VtZW50IG5lZWRzCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGFuYXRpb24uCit9CisKKy8vIFRlc3RzIEVhY2goKS4KKworVEVTVChFYWNoVGVzdCwgRXhwbGFpbnNNYXRjaFJlc3VsdENvcnJlY3RseSkgeworICBzZXQ8aW50PiBhOyAgLy8gZW1wdHkKKworICBNYXRjaGVyPHNldDxpbnQ+ID4gbSA9IEVhY2goMik7CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihtLCBhKSk7CisKKyAgTWF0Y2hlcjxjb25zdCBpbnQoJilbMV0+IG4gPSBFYWNoKDEpOyAgLy8gTk9MSU5UCisKKyAgY29uc3QgaW50IGJbMV0gPSB7MX07CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihuLCBiKSk7CisKKyAgbiA9IEVhY2goMyk7CisgIEVYUEVDVF9FUSgid2hvc2UgZWxlbWVudCAjMCBkb2Vzbid0IG1hdGNoIiwgRXhwbGFpbihuLCBiKSk7CisKKyAgYS5pbnNlcnQoMSk7CisgIGEuaW5zZXJ0KDIpOworICBhLmluc2VydCgzKTsKKyAgbSA9IEVhY2goR3JlYXRlclRoYW4oMCkpOworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4obSwgYSkpOworCisgIG0gPSBFYWNoKEdyZWF0ZXJUaGFuKDEwKSk7CisgIEVYUEVDVF9FUSgid2hvc2UgZWxlbWVudCAjMCBkb2Vzbid0IG1hdGNoLCB3aGljaCBpcyA5IGxlc3MgdGhhbiAxMCIsCisgICAgICAgICAgICBFeHBsYWluKG0sIGEpKTsKK30KKworVEVTVChFYWNoVGVzdCwgRGVzY3JpYmVzSXRzZWxmQ29ycmVjdGx5KSB7CisgIE1hdGNoZXI8dmVjdG9yPGludD4gPiBtID0gRWFjaCgxKTsKKyAgRVhQRUNUX0VRKCJvbmx5IGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgaXMgZXF1YWwgdG8gMSIsIERlc2NyaWJlKG0pKTsKKworICBNYXRjaGVyPHZlY3RvcjxpbnQ+ID4gbTIgPSBOb3QobSk7CisgIEVYUEVDVF9FUSgiY29udGFpbnMgc29tZSBlbGVtZW50IHRoYXQgaXNuJ3QgZXF1YWwgdG8gMSIsIERlc2NyaWJlKG0yKSk7Cit9CisKK1RFU1QoRWFjaFRlc3QsIE1hdGNoZXNWZWN0b3JXaGVuQWxsRWxlbWVudHNNYXRjaCkgeworICB2ZWN0b3I8aW50PiBzb21lX3ZlY3RvcjsKKyAgRVhQRUNUX1RIQVQoc29tZV92ZWN0b3IsIEVhY2goMSkpOworICBzb21lX3ZlY3Rvci5wdXNoX2JhY2soMyk7CisgIEVYUEVDVF9USEFUKHNvbWVfdmVjdG9yLCBOb3QoRWFjaCgxKSkpOworICBFWFBFQ1RfVEhBVChzb21lX3ZlY3RvciwgRWFjaCgzKSk7CisgIHNvbWVfdmVjdG9yLnB1c2hfYmFjaygxKTsKKyAgc29tZV92ZWN0b3IucHVzaF9iYWNrKDIpOworICBFWFBFQ1RfVEhBVChzb21lX3ZlY3RvciwgTm90KEVhY2goMykpKTsKKyAgRVhQRUNUX1RIQVQoc29tZV92ZWN0b3IsIEVhY2goTHQoMy41KSkpOworCisgIHZlY3RvcjxzdHJpbmc+IGFub3RoZXJfdmVjdG9yOworICBhbm90aGVyX3ZlY3Rvci5wdXNoX2JhY2soImZlZSIpOworICBFWFBFQ1RfVEhBVChhbm90aGVyX3ZlY3RvciwgRWFjaChzdHJpbmcoImZlZSIpKSk7CisgIGFub3RoZXJfdmVjdG9yLnB1c2hfYmFjaygiZmllIik7CisgIGFub3RoZXJfdmVjdG9yLnB1c2hfYmFjaygiZm9lIik7CisgIGFub3RoZXJfdmVjdG9yLnB1c2hfYmFjaygiZnVtIik7CisgIEVYUEVDVF9USEFUKGFub3RoZXJfdmVjdG9yLCBOb3QoRWFjaChzdHJpbmcoImZlZSIpKSkpOworfQorCitURVNUKEVhY2hUZXN0LCBNYXRjaGVzTWFwV2hlbkFsbEVsZW1lbnRzTWF0Y2gpIHsKKyAgbWFwPGNvbnN0IGNoYXIqLCBpbnQ+IG15X21hcDsKKyAgY29uc3QgY2hhciogYmFyID0gImEgc3RyaW5nIjsKKyAgbXlfbWFwW2Jhcl0gPSAyOworICBFWFBFQ1RfVEhBVChteV9tYXAsIEVhY2gobWFrZV9wYWlyKGJhciwgMikpKTsKKworICBtYXA8c3RyaW5nLCBpbnQ+IGFub3RoZXJfbWFwOworICBFWFBFQ1RfVEhBVChhbm90aGVyX21hcCwgRWFjaChtYWtlX3BhaXIoc3RyaW5nKCJmZWUiKSwgMSkpKTsKKyAgYW5vdGhlcl9tYXBbImZlZSJdID0gMTsKKyAgRVhQRUNUX1RIQVQoYW5vdGhlcl9tYXAsIEVhY2gobWFrZV9wYWlyKHN0cmluZygiZmVlIiksIDEpKSk7CisgIGFub3RoZXJfbWFwWyJmaWUiXSA9IDI7CisgIGFub3RoZXJfbWFwWyJmb2UiXSA9IDM7CisgIGFub3RoZXJfbWFwWyJmdW0iXSA9IDQ7CisgIEVYUEVDVF9USEFUKGFub3RoZXJfbWFwLCBOb3QoRWFjaChtYWtlX3BhaXIoc3RyaW5nKCJmZWUiKSwgMSkpKSk7CisgIEVYUEVDVF9USEFUKGFub3RoZXJfbWFwLCBOb3QoRWFjaChtYWtlX3BhaXIoc3RyaW5nKCJmdW0iKSwgMSkpKSk7CisgIEVYUEVDVF9USEFUKGFub3RoZXJfbWFwLCBFYWNoKFBhaXIoXywgR3QoMCkpKSk7Cit9CisKK1RFU1QoRWFjaFRlc3QsIEFjY2VwdHNNYXRjaGVyKSB7CisgIGNvbnN0IGludCBhW10gPSB7MSwgMiwgM307CisgIEVYUEVDVF9USEFUKGEsIEVhY2goR3QoMCkpKTsKKyAgRVhQRUNUX1RIQVQoYSwgTm90KEVhY2goR3QoMSkpKSk7Cit9CisKK1RFU1QoRWFjaFRlc3QsIFdvcmtzRm9yTmF0aXZlQXJyYXlBc1R1cGxlKSB7CisgIGNvbnN0IGludCBhW10gPSB7MSwgMn07CisgIGNvbnN0IGludCogY29uc3QgcG9pbnRlciA9IGE7CisgIEVYUEVDVF9USEFUKG1ha2VfdHVwbGUocG9pbnRlciwgMiksIEVhY2goR3QoMCkpKTsKKyAgRVhQRUNUX1RIQVQobWFrZV90dXBsZShwb2ludGVyLCAyKSwgTm90KEVhY2goR3QoMSkpKSk7Cit9CisKKy8vIEZvciB0ZXN0aW5nIFBvaW50d2lzZSgpLgorY2xhc3MgSXNIYWxmT2ZNYXRjaGVyIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IHR1cGxlPFQxLCBUMj4mIGFfcGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKKyAgICBpZiAoZ2V0PDA+KGFfcGFpcikgPT0gZ2V0PDE+KGFfcGFpcikvMikgeworICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSB0aGUgc2Vjb25kIGlzICIgPDwgZ2V0PDE+KGFfcGFpcik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSB0aGUgc2Vjb25kLzIgaXMgIiA8PCBnZXQ8MT4oYV9wYWlyKS8yOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZvaWQgRGVzY3JpYmVUbyhvc3RyZWFtKiBvcykgY29uc3QgeworICAgICpvcyA8PCAiYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgaXMgaGFsZiBvZiB0aGUgc2Vjb25kIjsKKyAgfQorCisgIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKG9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCBpc24ndCBoYWxmIG9mIHRoZSBzZWNvbmQiOworICB9Cit9OworCitQb2x5bW9ycGhpY01hdGNoZXI8SXNIYWxmT2ZNYXRjaGVyPiBJc0hhbGZPZigpIHsKKyAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoSXNIYWxmT2ZNYXRjaGVyKCkpOworfQorCitURVNUKFBvaW50d2lzZVRlc3QsIERlc2NyaWJlc1NlbGYpIHsKKyAgdmVjdG9yPGludD4gcmhzOworICByaHMucHVzaF9iYWNrKDEpOworICByaHMucHVzaF9iYWNrKDIpOworICByaHMucHVzaF9iYWNrKDMpOworICBjb25zdCBNYXRjaGVyPGNvbnN0IHZlY3RvcjxpbnQ+Jj4gbSA9IFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpOworICBFWFBFQ1RfRVEoImNvbnRhaW5zIDMgdmFsdWVzLCB3aGVyZSBlYWNoIHZhbHVlIGFuZCBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZSAiCisgICAgICAgICAgICAiaW4geyAxLCAyLCAzIH0gYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgaXMgaGFsZiBvZiB0aGUgc2Vjb25kIiwKKyAgICAgICAgICAgIERlc2NyaWJlKG0pKTsKKyAgRVhQRUNUX0VRKCJkb2Vzbid0IGNvbnRhaW4gZXhhY3RseSAzIHZhbHVlcywgb3IgY29udGFpbnMgYSB2YWx1ZSB4IGF0IHNvbWUgIgorICAgICAgICAgICAgImluZGV4IGkgd2hlcmUgeCBhbmQgdGhlIGktdGggdmFsdWUgb2YgeyAxLCAyLCAzIH0gYXJlIGEgcGFpciAiCisgICAgICAgICAgICAid2hlcmUgdGhlIGZpcnN0IGlzbid0IGhhbGYgb2YgdGhlIHNlY29uZCIsCisgICAgICAgICAgICBEZXNjcmliZU5lZ2F0aW9uKG0pKTsKK30KKworVEVTVChQb2ludHdpc2VUZXN0LCBNYWtlc0NvcHlPZlJocykgeworICBsaXN0PHNpZ25lZCBjaGFyPiByaHM7CisgIHJocy5wdXNoX2JhY2soMik7CisgIHJocy5wdXNoX2JhY2soNCk7CisKKyAgaW50IGxoc1tdID0gezEsIDJ9OworICBjb25zdCBNYXRjaGVyPGNvbnN0IGludCAoJilbMl0+IG0gPSBQb2ludHdpc2UoSXNIYWxmT2YoKSwgcmhzKTsKKyAgRVhQRUNUX1RIQVQobGhzLCBtKTsKKworICAvLyBDaGFuZ2luZyByaHMgbm93IHNob3VsZG4ndCBhZmZlY3QgbSwgd2hpY2ggbWFkZSBhIGNvcHkgb2YgcmhzLgorICByaHMucHVzaF9iYWNrKDYpOworICBFWFBFQ1RfVEhBVChsaHMsIG0pOworfQorCitURVNUKFBvaW50d2lzZVRlc3QsIFdvcmtzRm9yTGhzTmF0aXZlQXJyYXkpIHsKKyAgY29uc3QgaW50IGxoc1tdID0gezEsIDIsIDN9OworICB2ZWN0b3I8aW50PiByaHM7CisgIHJocy5wdXNoX2JhY2soMik7CisgIHJocy5wdXNoX2JhY2soNCk7CisgIHJocy5wdXNoX2JhY2soNik7CisgIEVYUEVDVF9USEFUKGxocywgUG9pbnR3aXNlKEx0KCksIHJocykpOworICBFWFBFQ1RfVEhBVChsaHMsIE5vdChQb2ludHdpc2UoR3QoKSwgcmhzKSkpOworfQorCitURVNUKFBvaW50d2lzZVRlc3QsIFdvcmtzRm9yUmhzTmF0aXZlQXJyYXkpIHsKKyAgY29uc3QgaW50IHJoc1tdID0gezEsIDIsIDN9OworICB2ZWN0b3I8aW50PiBsaHM7CisgIGxocy5wdXNoX2JhY2soMik7CisgIGxocy5wdXNoX2JhY2soNCk7CisgIGxocy5wdXNoX2JhY2soNik7CisgIEVYUEVDVF9USEFUKGxocywgUG9pbnR3aXNlKEd0KCksIHJocykpOworICBFWFBFQ1RfVEhBVChsaHMsIE5vdChQb2ludHdpc2UoTHQoKSwgcmhzKSkpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXworCitURVNUKFBvaW50d2lzZVRlc3QsIFdvcmtzRm9yUmhzSW5pdGlhbGl6ZXJMaXN0KSB7CisgIGNvbnN0IHZlY3RvcjxpbnQ+IGxoc3syLCA0LCA2fTsKKyAgRVhQRUNUX1RIQVQobGhzLCBQb2ludHdpc2UoR3QoKSwgezEsIDIsIDN9KSk7CisgIEVYUEVDVF9USEFUKGxocywgTm90KFBvaW50d2lzZShMdCgpLCB7MywgMywgN30pKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXworCitURVNUKFBvaW50d2lzZVRlc3QsIFJlamVjdHNXcm9uZ1NpemUpIHsKKyAgY29uc3QgZG91YmxlIGxoc1syXSA9IHsxLCAyfTsKKyAgY29uc3QgaW50IHJoc1sxXSA9IHswfTsKKyAgRVhQRUNUX1RIQVQobGhzLCBOb3QoUG9pbnR3aXNlKEd0KCksIHJocykpKTsKKyAgRVhQRUNUX0VRKCJ3aGljaCBjb250YWlucyAyIHZhbHVlcyIsCisgICAgICAgICAgICBFeHBsYWluKFBvaW50d2lzZShHdCgpLCByaHMpLCBsaHMpKTsKKworICBjb25zdCBpbnQgcmhzMlszXSA9IHswLCAxLCAyfTsKKyAgRVhQRUNUX1RIQVQobGhzLCBOb3QoUG9pbnR3aXNlKEd0KCksIHJoczIpKSk7Cit9CisKK1RFU1QoUG9pbnR3aXNlVGVzdCwgUmVqZWN0c1dyb25nQ29udGVudCkgeworICBjb25zdCBkb3VibGUgbGhzWzNdID0gezEsIDIsIDN9OworICBjb25zdCBpbnQgcmhzWzNdID0gezIsIDYsIDR9OworICBFWFBFQ1RfVEhBVChsaHMsIE5vdChQb2ludHdpc2UoSXNIYWxmT2YoKSwgcmhzKSkpOworICBFWFBFQ1RfRVEoIndoZXJlIHRoZSB2YWx1ZSBwYWlyICgyLCA2KSBhdCBpbmRleCAjMSBkb24ndCBtYXRjaCwgIgorICAgICAgICAgICAgIndoZXJlIHRoZSBzZWNvbmQvMiBpcyAzIiwKKyAgICAgICAgICAgIEV4cGxhaW4oUG9pbnR3aXNlKElzSGFsZk9mKCksIHJocyksIGxocykpOworfQorCitURVNUKFBvaW50d2lzZVRlc3QsIEFjY2VwdHNDb3JyZWN0Q29udGVudCkgeworICBjb25zdCBkb3VibGUgbGhzWzNdID0gezEsIDIsIDN9OworICBjb25zdCBpbnQgcmhzWzNdID0gezIsIDQsIDZ9OworICBFWFBFQ1RfVEhBVChsaHMsIFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpKTsKKyAgRVhQRUNUX0VRKCIiLCBFeHBsYWluKFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpLCBsaHMpKTsKK30KKworVEVTVChQb2ludHdpc2VUZXN0LCBBbGxvd3NNb25vbW9ycGhpY0lubmVyTWF0Y2hlcikgeworICBjb25zdCBkb3VibGUgbGhzWzNdID0gezEsIDIsIDN9OworICBjb25zdCBpbnQgcmhzWzNdID0gezIsIDQsIDZ9OworICBjb25zdCBNYXRjaGVyPHR1cGxlPGNvbnN0IGRvdWJsZSYsIGNvbnN0IGludCY+ID4gbTEgPSBJc0hhbGZPZigpOworICBFWFBFQ1RfVEhBVChsaHMsIFBvaW50d2lzZShtMSwgcmhzKSk7CisgIEVYUEVDVF9FUSgiIiwgRXhwbGFpbihQb2ludHdpc2UobTEsIHJocyksIGxocykpOworCisgIC8vIFRoaXMgdHlwZSB3b3JrcyBhcyBhIHR1cGxlPGNvbnN0IGRvdWJsZSYsIGNvbnN0IGludCY+IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNhc3QgdG8gdHVwbGU8ZG91YmxlLCBpbnQ+LgorICBjb25zdCBNYXRjaGVyPHR1cGxlPGRvdWJsZSwgaW50PiA+IG0yID0gSXNIYWxmT2YoKTsKKyAgRVhQRUNUX1RIQVQobGhzLCBQb2ludHdpc2UobTIsIHJocykpOworICBFWFBFQ1RfRVEoIiIsIEV4cGxhaW4oUG9pbnR3aXNlKG0yLCByaHMpLCBsaHMpKTsKK30KKworVEVTVChVbm9yZGVyZWRQb2ludHdpc2VUZXN0LCBEZXNjcmliZXNTZWxmKSB7CisgIHZlY3RvcjxpbnQ+IHJoczsKKyAgcmhzLnB1c2hfYmFjaygxKTsKKyAgcmhzLnB1c2hfYmFjaygyKTsKKyAgcmhzLnB1c2hfYmFjaygzKTsKKyAgY29uc3QgTWF0Y2hlcjxjb25zdCB2ZWN0b3I8aW50PiY+IG0gPSBVbm9yZGVyZWRQb2ludHdpc2UoSXNIYWxmT2YoKSwgcmhzKTsKKyAgRVhQRUNUX0VRKAorICAgICAgImhhcyAzIGVsZW1lbnRzIGFuZCB0aGVyZSBleGlzdHMgc29tZSBwZXJtdXRhdGlvbiBvZiBlbGVtZW50cyBzdWNoICIKKyAgICAgICJ0aGF0OlxuIgorICAgICAgIiAtIGVsZW1lbnQgIzAgYW5kIDEgYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgaXMgaGFsZiBvZiB0aGUgc2Vjb25kLCAiCisgICAgICAiYW5kXG4iCisgICAgICAiIC0gZWxlbWVudCAjMSBhbmQgMiBhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCBpcyBoYWxmIG9mIHRoZSBzZWNvbmQsICIKKyAgICAgICJhbmRcbiIKKyAgICAgICIgLSBlbGVtZW50ICMyIGFuZCAzIGFyZSBhIHBhaXIgd2hlcmUgdGhlIGZpcnN0IGlzIGhhbGYgb2YgdGhlIHNlY29uZCIsCisgICAgICBEZXNjcmliZShtKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJkb2Vzbid0IGhhdmUgMyBlbGVtZW50cywgb3IgdGhlcmUgZXhpc3RzIG5vIHBlcm11dGF0aW9uIG9mIGVsZW1lbnRzICIKKyAgICAgICJzdWNoIHRoYXQ6XG4iCisgICAgICAiIC0gZWxlbWVudCAjMCBhbmQgMSBhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCBpcyBoYWxmIG9mIHRoZSBzZWNvbmQsICIKKyAgICAgICJhbmRcbiIKKyAgICAgICIgLSBlbGVtZW50ICMxIGFuZCAyIGFyZSBhIHBhaXIgd2hlcmUgdGhlIGZpcnN0IGlzIGhhbGYgb2YgdGhlIHNlY29uZCwgIgorICAgICAgImFuZFxuIgorICAgICAgIiAtIGVsZW1lbnQgIzIgYW5kIDMgYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgaXMgaGFsZiBvZiB0aGUgc2Vjb25kIiwKKyAgICAgIERlc2NyaWJlTmVnYXRpb24obSkpOworfQorCitURVNUKFVub3JkZXJlZFBvaW50d2lzZVRlc3QsIE1ha2VzQ29weU9mUmhzKSB7CisgIGxpc3Q8c2lnbmVkIGNoYXI+IHJoczsKKyAgcmhzLnB1c2hfYmFjaygyKTsKKyAgcmhzLnB1c2hfYmFjayg0KTsKKworICBpbnQgbGhzW10gPSB7MiwgMX07CisgIGNvbnN0IE1hdGNoZXI8Y29uc3QgaW50ICgmKVsyXT4gbSA9IFVub3JkZXJlZFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpOworICBFWFBFQ1RfVEhBVChsaHMsIG0pOworCisgIC8vIENoYW5naW5nIHJocyBub3cgc2hvdWxkbid0IGFmZmVjdCBtLCB3aGljaCBtYWRlIGEgY29weSBvZiByaHMuCisgIHJocy5wdXNoX2JhY2soNik7CisgIEVYUEVDVF9USEFUKGxocywgbSk7Cit9CisKK1RFU1QoVW5vcmRlcmVkUG9pbnR3aXNlVGVzdCwgV29ya3NGb3JMaHNOYXRpdmVBcnJheSkgeworICBjb25zdCBpbnQgbGhzW10gPSB7MSwgMiwgM307CisgIHZlY3RvcjxpbnQ+IHJoczsKKyAgcmhzLnB1c2hfYmFjayg0KTsKKyAgcmhzLnB1c2hfYmFjayg2KTsKKyAgcmhzLnB1c2hfYmFjaygyKTsKKyAgRVhQRUNUX1RIQVQobGhzLCBVbm9yZGVyZWRQb2ludHdpc2UoTHQoKSwgcmhzKSk7CisgIEVYUEVDVF9USEFUKGxocywgTm90KFVub3JkZXJlZFBvaW50d2lzZShHdCgpLCByaHMpKSk7Cit9CisKK1RFU1QoVW5vcmRlcmVkUG9pbnR3aXNlVGVzdCwgV29ya3NGb3JSaHNOYXRpdmVBcnJheSkgeworICBjb25zdCBpbnQgcmhzW10gPSB7MSwgMiwgM307CisgIHZlY3RvcjxpbnQ+IGxoczsKKyAgbGhzLnB1c2hfYmFjayg0KTsKKyAgbGhzLnB1c2hfYmFjaygyKTsKKyAgbGhzLnB1c2hfYmFjayg2KTsKKyAgRVhQRUNUX1RIQVQobGhzLCBVbm9yZGVyZWRQb2ludHdpc2UoR3QoKSwgcmhzKSk7CisgIEVYUEVDVF9USEFUKGxocywgTm90KFVub3JkZXJlZFBvaW50d2lzZShMdCgpLCByaHMpKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCisKK1RFU1QoVW5vcmRlcmVkUG9pbnR3aXNlVGVzdCwgV29ya3NGb3JSaHNJbml0aWFsaXplckxpc3QpIHsKKyAgY29uc3QgdmVjdG9yPGludD4gbGhzezIsIDQsIDZ9OworICBFWFBFQ1RfVEhBVChsaHMsIFVub3JkZXJlZFBvaW50d2lzZShHdCgpLCB7NSwgMSwgM30pKTsKKyAgRVhQRUNUX1RIQVQobGhzLCBOb3QoVW5vcmRlcmVkUG9pbnR3aXNlKEx0KCksIHsxLCAxLCA3fSkpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCisKK1RFU1QoVW5vcmRlcmVkUG9pbnR3aXNlVGVzdCwgUmVqZWN0c1dyb25nU2l6ZSkgeworICBjb25zdCBkb3VibGUgbGhzWzJdID0gezEsIDJ9OworICBjb25zdCBpbnQgcmhzWzFdID0gezB9OworICBFWFBFQ1RfVEhBVChsaHMsIE5vdChVbm9yZGVyZWRQb2ludHdpc2UoR3QoKSwgcmhzKSkpOworICBFWFBFQ1RfRVEoIndoaWNoIGhhcyAyIGVsZW1lbnRzIiwKKyAgICAgICAgICAgIEV4cGxhaW4oVW5vcmRlcmVkUG9pbnR3aXNlKEd0KCksIHJocyksIGxocykpOworCisgIGNvbnN0IGludCByaHMyWzNdID0gezAsIDEsIDJ9OworICBFWFBFQ1RfVEhBVChsaHMsIE5vdChVbm9yZGVyZWRQb2ludHdpc2UoR3QoKSwgcmhzMikpKTsKK30KKworVEVTVChVbm9yZGVyZWRQb2ludHdpc2VUZXN0LCBSZWplY3RzV3JvbmdDb250ZW50KSB7CisgIGNvbnN0IGRvdWJsZSBsaHNbM10gPSB7MSwgMiwgM307CisgIGNvbnN0IGludCByaHNbM10gPSB7MiwgNiwgNn07CisgIEVYUEVDVF9USEFUKGxocywgTm90KFVub3JkZXJlZFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpKSk7CisgIEVYUEVDVF9FUSgid2hlcmUgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBkb24ndCBtYXRjaCBhbnkgbWF0Y2hlcnM6XG4iCisgICAgICAgICAgICAiZWxlbWVudCAjMTogMiIsCisgICAgICAgICAgICBFeHBsYWluKFVub3JkZXJlZFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpLCBsaHMpKTsKK30KKworVEVTVChVbm9yZGVyZWRQb2ludHdpc2VUZXN0LCBBY2NlcHRzQ29ycmVjdENvbnRlbnRJblNhbWVPcmRlcikgeworICBjb25zdCBkb3VibGUgbGhzWzNdID0gezEsIDIsIDN9OworICBjb25zdCBpbnQgcmhzWzNdID0gezIsIDQsIDZ9OworICBFWFBFQ1RfVEhBVChsaHMsIFVub3JkZXJlZFBvaW50d2lzZShJc0hhbGZPZigpLCByaHMpKTsKK30KKworVEVTVChVbm9yZGVyZWRQb2ludHdpc2VUZXN0LCBBY2NlcHRzQ29ycmVjdENvbnRlbnRJbkRpZmZlcmVudE9yZGVyKSB7CisgIGNvbnN0IGRvdWJsZSBsaHNbM10gPSB7MSwgMiwgM307CisgIGNvbnN0IGludCByaHNbM10gPSB7NiwgNCwgMn07CisgIEVYUEVDVF9USEFUKGxocywgVW5vcmRlcmVkUG9pbnR3aXNlKElzSGFsZk9mKCksIHJocykpOworfQorCitURVNUKFVub3JkZXJlZFBvaW50d2lzZVRlc3QsIEFsbG93c01vbm9tb3JwaGljSW5uZXJNYXRjaGVyKSB7CisgIGNvbnN0IGRvdWJsZSBsaHNbM10gPSB7MSwgMiwgM307CisgIGNvbnN0IGludCByaHNbM10gPSB7NCwgNiwgMn07CisgIGNvbnN0IE1hdGNoZXI8dHVwbGU8Y29uc3QgZG91YmxlJiwgY29uc3QgaW50Jj4gPiBtMSA9IElzSGFsZk9mKCk7CisgIEVYUEVDVF9USEFUKGxocywgVW5vcmRlcmVkUG9pbnR3aXNlKG0xLCByaHMpKTsKKworICAvLyBUaGlzIHR5cGUgd29ya3MgYXMgYSB0dXBsZTxjb25zdCBkb3VibGUmLCBjb25zdCBpbnQmPiBjYW4gYmUKKyAgLy8gaW1wbGljaXRseSBjYXN0IHRvIHR1cGxlPGRvdWJsZSwgaW50Pi4KKyAgY29uc3QgTWF0Y2hlcjx0dXBsZTxkb3VibGUsIGludD4gPiBtMiA9IElzSGFsZk9mKCk7CisgIEVYUEVDVF9USEFUKGxocywgVW5vcmRlcmVkUG9pbnR3aXNlKG0yLCByaHMpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGdtb2NrX21hdGNoZXJzX3Rlc3QKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1tb3JlLWFjdGlvbnNfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLW1vcmUtYWN0aW9uc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NzdmZTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1tb3JlLWFjdGlvbnNfdGVzdC5jYwpAQCAtMCwwICsxLDcwNSBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgYnVpbHQtaW4gYWN0aW9ucyBpbiBnbW9jay1tb3JlLWFjdGlvbnMuaC4KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1vcmUtYWN0aW9ucy5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgZ21vY2tfbW9yZV9hY3Rpb25zX3Rlc3QgeworCit1c2luZyA6OnN0ZDo6cGx1czsKK3VzaW5nIDo6c3RkOjpzdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjpnZXQ7Cit1c2luZyB0ZXN0aW5nOjptYWtlX3R1cGxlOwordXNpbmcgdGVzdGluZzo6dHVwbGU7Cit1c2luZyB0ZXN0aW5nOjp0dXBsZV9lbGVtZW50OwordXNpbmcgdGVzdGluZzo6XzsKK3VzaW5nIHRlc3Rpbmc6OkFjdGlvbjsKK3VzaW5nIHRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTsKK3VzaW5nIHRlc3Rpbmc6OkRlbGV0ZUFyZzsKK3VzaW5nIHRlc3Rpbmc6Okludm9rZTsKK3VzaW5nIHRlc3Rpbmc6OlJldHVybjsKK3VzaW5nIHRlc3Rpbmc6OlJldHVybkFyZzsKK3VzaW5nIHRlc3Rpbmc6OlJldHVyblBvaW50ZWU7Cit1c2luZyB0ZXN0aW5nOjpTYXZlQXJnOwordXNpbmcgdGVzdGluZzo6U2F2ZUFyZ1BvaW50ZWU7Cit1c2luZyB0ZXN0aW5nOjpTZXRBcmdSZWZlcmVlOwordXNpbmcgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxOwordXNpbmcgdGVzdGluZzo6VW51c2VkOwordXNpbmcgdGVzdGluZzo6V2l0aEFyZzsKK3VzaW5nIHRlc3Rpbmc6OldpdGhvdXRBcmdzOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmxpbmtlZF9wdHI7CisKKy8vIEZvciBzdXBwcmVzc2luZyBjb21waWxlciB3YXJuaW5ncyBvbiBjb252ZXJzaW9uIHBvc3NpYmx5IGxvc2luZyBwcmVjaXNpb24uCitpbmxpbmUgc2hvcnQgU2hvcnQoc2hvcnQgbikgeyByZXR1cm4gbjsgfSAgLy8gTk9MSU5UCitpbmxpbmUgY2hhciBDaGFyKGNoYXIgY2gpIHsgcmV0dXJuIGNoOyB9CisKKy8vIFNhbXBsZSBmdW5jdGlvbnMgYW5kIGZ1bmN0b3JzIGZvciB0ZXN0aW5nIEludm9rZSgpIGFuZCBldGMuCitpbnQgTnVsbGFyeSgpIHsgcmV0dXJuIDE7IH0KKworY2xhc3MgTnVsbGFyeUZ1bmN0b3IgeworIHB1YmxpYzoKKyAgaW50IG9wZXJhdG9yKCkoKSB7IHJldHVybiAyOyB9Cit9OworCitib29sIGdfZG9uZSA9IGZhbHNlOwordm9pZCBWb2lkTnVsbGFyeSgpIHsgZ19kb25lID0gdHJ1ZTsgfQorCitjbGFzcyBWb2lkTnVsbGFyeUZ1bmN0b3IgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcigpKCkgeyBnX2RvbmUgPSB0cnVlOyB9Cit9OworCitib29sIFVuYXJ5KGludCB4KSB7IHJldHVybiB4IDwgMDsgfQorCitjb25zdCBjaGFyKiBQbHVzMShjb25zdCBjaGFyKiBzKSB7IHJldHVybiBzICsgMTsgfQorCit2b2lkIFZvaWRVbmFyeShpbnQgLyogbiAqLykgeyBnX2RvbmUgPSB0cnVlOyB9CisKK2Jvb2wgQnlDb25zdFJlZihjb25zdCBzdHJpbmcmIHMpIHsgcmV0dXJuIHMgPT0gIkhpIjsgfQorCitjb25zdCBkb3VibGUgZ19kb3VibGUgPSAwOworYm9vbCBSZWZlcmVuY2VzR2xvYmFsRG91YmxlKGNvbnN0IGRvdWJsZSYgeCkgeyByZXR1cm4gJnggPT0gJmdfZG91YmxlOyB9CisKK3N0cmluZyBCeU5vbkNvbnN0UmVmKHN0cmluZyYgcykgeyByZXR1cm4gcyArPSAiKyI7IH0gIC8vIE5PTElOVAorCitzdHJ1Y3QgVW5hcnlGdW5jdG9yIHsKKyAgaW50IG9wZXJhdG9yKCkoYm9vbCB4KSB7IHJldHVybiB4ID8gMSA6IC0xOyB9Cit9OworCitjb25zdCBjaGFyKiBCaW5hcnkoY29uc3QgY2hhciogaW5wdXQsIHNob3J0IG4pIHsgcmV0dXJuIGlucHV0ICsgbjsgfSAgLy8gTk9MSU5UCisKK3ZvaWQgVm9pZEJpbmFyeShpbnQsIGNoYXIpIHsgZ19kb25lID0gdHJ1ZTsgfQorCitpbnQgVGVybmFyeShpbnQgeCwgY2hhciB5LCBzaG9ydCB6KSB7IHJldHVybiB4ICsgeSArIHo7IH0gIC8vIE5PTElOVAorCit2b2lkIFZvaWRUZXJuYXJ5KGludCwgY2hhciwgYm9vbCkgeyBnX2RvbmUgPSB0cnVlOyB9CisKK2ludCBTdW1PZjQoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsgcmV0dXJuIGEgKyBiICsgYyArIGQ7IH0KKworaW50IFN1bU9mRmlyc3QyKGludCBhLCBpbnQgYiwgVW51c2VkLCBVbnVzZWQpIHsgcmV0dXJuIGEgKyBiOyB9CisKK3ZvaWQgVm9pZEZ1bmN0aW9uV2l0aEZvdXJBcmd1bWVudHMoY2hhciwgaW50LCBmbG9hdCwgZG91YmxlKSB7IGdfZG9uZSA9IHRydWU7IH0KKworc3RyaW5nIENvbmNhdDQoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0KSB7CisgIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0OworfQorCitpbnQgU3VtT2Y1KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSkgeyByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7IH0KKworc3RydWN0IFN1bU9mNUZ1bmN0b3IgeworICBpbnQgb3BlcmF0b3IoKShpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUpIHsKKyAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7CisgIH0KK307CisKK3N0cmluZyBDb25jYXQ1KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUpIHsKKyAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNTsKK30KKworaW50IFN1bU9mNihpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUsIGludCBmKSB7CisgIHJldHVybiBhICsgYiArIGMgKyBkICsgZSArIGY7Cit9CisKK3N0cnVjdCBTdW1PZjZGdW5jdG9yIHsKKyAgaW50IG9wZXJhdG9yKCkoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlLCBpbnQgZikgeworICAgIHJldHVybiBhICsgYiArIGMgKyBkICsgZSArIGY7CisgIH0KK307CisKK3N0cmluZyBDb25jYXQ2KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2KSB7CisgIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNjsKK30KKworc3RyaW5nIENvbmNhdDcoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNykgeworICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNzsKK30KKworc3RyaW5nIENvbmNhdDgoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNywgY29uc3QgY2hhciogczgpIHsKKyAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNSArIHM2ICsgczcgKyBzODsKK30KKworc3RyaW5nIENvbmNhdDkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNywgY29uc3QgY2hhciogczgsIGNvbnN0IGNoYXIqIHM5KSB7CisgIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNiArIHM3ICsgczggKyBzOTsKK30KKworc3RyaW5nIENvbmNhdDEwKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNiwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNywgY29uc3QgY2hhciogczgsIGNvbnN0IGNoYXIqIHM5LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxMCkgeworICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNyArIHM4ICsgczkgKyBzMTA7Cit9CisKK2NsYXNzIEZvbyB7CisgcHVibGljOgorICBGb28oKSA6IHZhbHVlXygxMjMpIHt9CisKKyAgaW50IE51bGxhcnkoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworICBzaG9ydCBVbmFyeShsb25nIHgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PHNob3J0Pih2YWx1ZV8gKyB4KTsgfSAgLy8gTk9MSU5UCisKKyAgc3RyaW5nIEJpbmFyeShjb25zdCBzdHJpbmcmIHN0ciwgY2hhciBjKSBjb25zdCB7IHJldHVybiBzdHIgKyBjOyB9CisKKyAgaW50IFRlcm5hcnkoaW50IHgsIGJvb2wgeSwgY2hhciB6KSB7IHJldHVybiB2YWx1ZV8gKyB4ICsgeSp6OyB9CisKKyAgaW50IFN1bU9mNChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgY29uc3QgeworICAgIHJldHVybiBhICsgYiArIGMgKyBkICsgdmFsdWVfOworICB9CisKKyAgaW50IFN1bU9mTGFzdDIoVW51c2VkLCBVbnVzZWQsIGludCBhLCBpbnQgYikgY29uc3QgeyByZXR1cm4gYSArIGI7IH0KKworICBpbnQgU3VtT2Y1KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSkgeyByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7IH0KKworICBpbnQgU3VtT2Y2KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSwgaW50IGYpIHsKKyAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGUgKyBmOworICB9CisKKyAgc3RyaW5nIENvbmNhdDcoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyLCBjb25zdCBjaGFyKiBzMywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczQsIGNvbnN0IGNoYXIqIHM1LCBjb25zdCBjaGFyKiBzNiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczcpIHsKKyAgICByZXR1cm4gc3RyaW5nKHMxKSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNzsKKyAgfQorCisgIHN0cmluZyBDb25jYXQ4KGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM0LCBjb25zdCBjaGFyKiBzNSwgY29uc3QgY2hhciogczYsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM3LCBjb25zdCBjaGFyKiBzOCkgeworICAgIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNiArIHM3ICsgczg7CisgIH0KKworICBzdHJpbmcgQ29uY2F0OShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIsIGNvbnN0IGNoYXIqIHMzLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNywgY29uc3QgY2hhciogczgsIGNvbnN0IGNoYXIqIHM5KSB7CisgICAgcmV0dXJuIHN0cmluZyhzMSkgKyBzMiArIHMzICsgczQgKyBzNSArIHM2ICsgczcgKyBzOCArIHM5OworICB9CisKKyAgc3RyaW5nIENvbmNhdDEwKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgY29uc3QgY2hhciogczMsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzNCwgY29uc3QgY2hhciogczUsIGNvbnN0IGNoYXIqIHM2LAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczcsIGNvbnN0IGNoYXIqIHM4LCBjb25zdCBjaGFyKiBzOSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxMCkgeworICAgIHJldHVybiBzdHJpbmcoczEpICsgczIgKyBzMyArIHM0ICsgczUgKyBzNiArIHM3ICsgczggKyBzOSArIHMxMDsKKyAgfQorCisgcHJpdmF0ZToKKyAgaW50IHZhbHVlXzsKK307CisKKy8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSBudWxsYXJ5IGZ1bmN0aW9uLgorVEVTVChJbnZva2VUZXN0LCBOdWxsYXJ5KSB7CisgIEFjdGlvbjxpbnQoKT4gYSA9IEludm9rZShOdWxsYXJ5KTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoMSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgdW5hcnkgZnVuY3Rpb24uCitURVNUKEludm9rZVRlc3QsIFVuYXJ5KSB7CisgIEFjdGlvbjxib29sKGludCk+IGEgPSBJbnZva2UoVW5hcnkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9GQUxTRShhLlBlcmZvcm0obWFrZV90dXBsZSgxKSkpOworICBFWFBFQ1RfVFJVRShhLlBlcmZvcm0obWFrZV90dXBsZSgtMSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIGJpbmFyeSBmdW5jdGlvbi4KK1RFU1QoSW52b2tlVGVzdCwgQmluYXJ5KSB7CisgIEFjdGlvbjxjb25zdCBjaGFyKihjb25zdCBjaGFyKiwgc2hvcnQpPiBhID0gSW52b2tlKEJpbmFyeSk7ICAvLyBOT0xJTlQKKyAgY29uc3QgY2hhciogcCA9ICJIZWxsbyI7CisgIEVYUEVDVF9FUShwICsgMiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUocCwgU2hvcnQoMikpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSB0ZXJuYXJ5IGZ1bmN0aW9uLgorVEVTVChJbnZva2VUZXN0LCBUZXJuYXJ5KSB7CisgIEFjdGlvbjxpbnQoaW50LCBjaGFyLCBzaG9ydCk+IGEgPSBJbnZva2UoVGVybmFyeSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDYsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDEsICdcMicsIFNob3J0KDMpKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgNC1hcmd1bWVudCBmdW5jdGlvbi4KK1RFU1QoSW52b2tlVGVzdCwgRnVuY3Rpb25UaGF0VGFrZXM0QXJndW1lbnRzKSB7CisgIEFjdGlvbjxpbnQoaW50LCBpbnQsIGludCwgaW50KT4gYSA9IEludm9rZShTdW1PZjQpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgxMjM0LCBhLlBlcmZvcm0obWFrZV90dXBsZSgxMDAwLCAyMDAsIDMwLCA0KSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgNS1hcmd1bWVudCBmdW5jdGlvbi4KK1RFU1QoSW52b2tlVGVzdCwgRnVuY3Rpb25UaGF0VGFrZXM1QXJndW1lbnRzKSB7CisgIEFjdGlvbjxpbnQoaW50LCBpbnQsIGludCwgaW50LCBpbnQpPiBhID0gSW52b2tlKFN1bU9mNSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEyMzQ1LCBhLlBlcmZvcm0obWFrZV90dXBsZSgxMDAwMCwgMjAwMCwgMzAwLCA0MCwgNSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDYtYXJndW1lbnQgZnVuY3Rpb24uCitURVNUKEludm9rZVRlc3QsIEZ1bmN0aW9uVGhhdFRha2VzNkFyZ3VtZW50cykgeworICBBY3Rpb248aW50KGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpPiBhID0gSW52b2tlKFN1bU9mNik7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEyMzQ1NiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMTAwMDAwLCAyMDAwMCwgMzAwMCwgNDAwLCA1MCwgNikpKTsKK30KKworLy8gQSBoZWxwZXIgdGhhdCB0dXJucyB0aGUgdHlwZSBvZiBhIEMtc3RyaW5nIGxpdGVyYWwgZnJvbSBjb25zdAorLy8gY2hhcltOXSB0byBjb25zdCBjaGFyKi4KK2lubGluZSBjb25zdCBjaGFyKiBDaGFyUHRyKGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIHM7IH0KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDctYXJndW1lbnQgZnVuY3Rpb24uCitURVNUKEludm9rZVRlc3QsIEZ1bmN0aW9uVGhhdFRha2VzN0FyZ3VtZW50cykgeworICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0KKyAgICAgIEludm9rZShDb25jYXQ3KTsKKyAgRVhQRUNUX0VRKCIxMjM0NTY3IiwKKyAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjEiKSwgQ2hhclB0cigiMiIpLCBDaGFyUHRyKCIzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI0IiksIENoYXJQdHIoIjUiKSwgQ2hhclB0cigiNiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNyIpKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgOC1hcmd1bWVudCBmdW5jdGlvbi4KK1RFU1QoSW52b2tlVGVzdCwgRnVuY3Rpb25UaGF0VGFrZXM4QXJndW1lbnRzKSB7CisgIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0KKyAgICAgIEludm9rZShDb25jYXQ4KTsKKyAgRVhQRUNUX0VRKCIxMjM0NTY3OCIsCisgICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwgQ2hhclB0cigiMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNCIpLCBDaGFyUHRyKCI1IiksIENoYXJQdHIoIjYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjciKSwgQ2hhclB0cigiOCIpKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgOS1hcmd1bWVudCBmdW5jdGlvbi4KK1RFU1QoSW52b2tlVGVzdCwgRnVuY3Rpb25UaGF0VGFrZXM5QXJndW1lbnRzKSB7CisgIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciopPiBhID0gSW52b2tlKENvbmNhdDkpOworICBFWFBFQ1RfRVEoIjEyMzQ1Njc4OSIsCisgICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwgQ2hhclB0cigiMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNCIpLCBDaGFyUHRyKCI1IiksIENoYXJQdHIoIjYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjciKSwgQ2hhclB0cigiOCIpLCBDaGFyUHRyKCI5IikpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSAxMC1hcmd1bWVudCBmdW5jdGlvbi4KK1RFU1QoSW52b2tlVGVzdCwgRnVuY3Rpb25UaGF0VGFrZXMxMEFyZ3VtZW50cykgeworICBBY3Rpb248c3RyaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik+IGEgPSBJbnZva2UoQ29uY2F0MTApOworICBFWFBFQ1RfRVEoIjEyMzQ1Njc4OTAiLAorICAgICAgICAgICAgYS5QZXJmb3JtKG1ha2VfdHVwbGUoQ2hhclB0cigiMSIpLCBDaGFyUHRyKCIyIiksIENoYXJQdHIoIjMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjQiKSwgQ2hhclB0cigiNSIpLCBDaGFyUHRyKCI2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI3IiksIENoYXJQdHIoIjgiKSwgQ2hhclB0cigiOSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiMCIpKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGZ1bmN0aW9ucyB3aXRoIHBhcmFtZXRlcnMgZGVjbGFyZWQgYXMgVW51c2VkLgorVEVTVChJbnZva2VUZXN0LCBGdW5jdGlvbldpdGhVbnVzZWRQYXJhbWV0ZXJzKSB7CisgIEFjdGlvbjxpbnQoaW50LCBpbnQsIGRvdWJsZSwgY29uc3Qgc3RyaW5nJik+IGExID0KKyAgICAgIEludm9rZShTdW1PZkZpcnN0Mik7CisgIEVYUEVDVF9FUSgxMiwgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDEwLCAyLCA1LjYsIHN0cmluZygiaGkiKSkpKTsKKworICBBY3Rpb248aW50KGludCwgaW50LCBib29sLCBpbnQqKT4gYTIgPQorICAgICAgSW52b2tlKFN1bU9mRmlyc3QyKTsKKyAgRVhQRUNUX0VRKDIzLCBhMi5QZXJmb3JtKG1ha2VfdHVwbGUoMjAsIDMsIHRydWUsIHN0YXRpY19jYXN0PGludCo+KE5VTEwpKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIG1ldGhvZHMgd2l0aCBwYXJhbWV0ZXJzIGRlY2xhcmVkIGFzIFVudXNlZC4KK1RFU1QoSW52b2tlVGVzdCwgTWV0aG9kV2l0aFVudXNlZFBhcmFtZXRlcnMpIHsKKyAgRm9vIGZvbzsKKyAgQWN0aW9uPGludChzdHJpbmcsIGJvb2wsIGludCwgaW50KT4gYTEgPQorICAgICAgSW52b2tlKCZmb28sICZGb286OlN1bU9mTGFzdDIpOworICBFWFBFQ1RfRVEoMTIsIGExLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCJoaSIpLCB0cnVlLCAxMCwgMikpKTsKKworICBBY3Rpb248aW50KGNoYXIsIGRvdWJsZSwgaW50LCBpbnQpPiBhMiA9CisgICAgICBJbnZva2UoJmZvbywgJkZvbzo6U3VtT2ZMYXN0Mik7CisgIEVYUEVDVF9FUSgyMywgYTIuUGVyZm9ybShtYWtlX3R1cGxlKCdhJywgMi41LCAyMCwgMykpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIGZ1bmN0b3IuCitURVNUKEludm9rZVRlc3QsIEZ1bmN0b3IpIHsKKyAgQWN0aW9uPGxvbmcobG9uZywgaW50KT4gYSA9IEludm9rZShwbHVzPGxvbmc+KCkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgzTCwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMSwgMikpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKGYpIGFzIGFuIGFjdGlvbiBvZiBhIGNvbXBhdGlibGUgdHlwZS4KK1RFU1QoSW52b2tlVGVzdCwgRnVuY3Rpb25XaXRoQ29tcGF0aWJsZVR5cGUpIHsKKyAgQWN0aW9uPGxvbmcoaW50LCBzaG9ydCwgY2hhciwgYm9vbCk+IGEgPSBJbnZva2UoU3VtT2Y0KTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoNDMyMSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoNDAwMCwgU2hvcnQoMzAwKSwgQ2hhcigyMCksIHRydWUpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYW4gb2JqZWN0IHBvaW50ZXIgYW5kIGEgbWV0aG9kIHBvaW50ZXIuCisKKy8vIFRlc3RzIHVzaW5nIEludm9rZSgpIHdpdGggYSBudWxsYXJ5IG1ldGhvZC4KK1RFU1QoSW52b2tlTWV0aG9kVGVzdCwgTnVsbGFyeSkgeworICBGb28gZm9vOworICBBY3Rpb248aW50KCk+IGEgPSBJbnZva2UoJmZvbywgJkZvbzo6TnVsbGFyeSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEyMywgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgdW5hcnkgbWV0aG9kLgorVEVTVChJbnZva2VNZXRob2RUZXN0LCBVbmFyeSkgeworICBGb28gZm9vOworICBBY3Rpb248c2hvcnQobG9uZyk+IGEgPSBJbnZva2UoJmZvbywgJkZvbzo6VW5hcnkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSg0MTIzLCBhLlBlcmZvcm0obWFrZV90dXBsZSg0MDAwKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgYmluYXJ5IG1ldGhvZC4KK1RFU1QoSW52b2tlTWV0aG9kVGVzdCwgQmluYXJ5KSB7CisgIEZvbyBmb287CisgIEFjdGlvbjxzdHJpbmcoY29uc3Qgc3RyaW5nJiwgY2hhcik+IGEgPSBJbnZva2UoJmZvbywgJkZvbzo6QmluYXJ5KTsKKyAgc3RyaW5nIHMoIkhlbGwiKTsKKyAgRVhQRUNUX0VRKCJIZWxsbyIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKHMsICdvJykpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIHRlcm5hcnkgbWV0aG9kLgorVEVTVChJbnZva2VNZXRob2RUZXN0LCBUZXJuYXJ5KSB7CisgIEZvbyBmb287CisgIEFjdGlvbjxpbnQoaW50LCBib29sLCBjaGFyKT4gYSA9IEludm9rZSgmZm9vLCAmRm9vOjpUZXJuYXJ5KTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoMTEyNCwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoMTAwMCwgdHJ1ZSwgQ2hhcigxKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDQtYXJndW1lbnQgbWV0aG9kLgorVEVTVChJbnZva2VNZXRob2RUZXN0LCBNZXRob2RUaGF0VGFrZXM0QXJndW1lbnRzKSB7CisgIEZvbyBmb287CisgIEFjdGlvbjxpbnQoaW50LCBpbnQsIGludCwgaW50KT4gYSA9IEludm9rZSgmZm9vLCAmRm9vOjpTdW1PZjQpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgxMzU3LCBhLlBlcmZvcm0obWFrZV90dXBsZSgxMDAwLCAyMDAsIDMwLCA0KSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgNS1hcmd1bWVudCBtZXRob2QuCitURVNUKEludm9rZU1ldGhvZFRlc3QsIE1ldGhvZFRoYXRUYWtlczVBcmd1bWVudHMpIHsKKyAgRm9vIGZvbzsKKyAgQWN0aW9uPGludChpbnQsIGludCwgaW50LCBpbnQsIGludCk+IGEgPSBJbnZva2UoJmZvbywgJkZvbzo6U3VtT2Y1KTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRVEoMTIzNDUsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDEwMDAwLCAyMDAwLCAzMDAsIDQwLCA1KSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgNi1hcmd1bWVudCBtZXRob2QuCitURVNUKEludm9rZU1ldGhvZFRlc3QsIE1ldGhvZFRoYXRUYWtlczZBcmd1bWVudHMpIHsKKyAgRm9vIGZvbzsKKyAgQWN0aW9uPGludChpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KT4gYSA9ICAvLyBOT0xJTlQKKyAgICAgIEludm9rZSgmZm9vLCAmRm9vOjpTdW1PZjYpOworICBFWFBFQ1RfRVEoMTIzNDU2LCBhLlBlcmZvcm0obWFrZV90dXBsZSgxMDAwMDAsIDIwMDAwLCAzMDAwLCA0MDAsIDUwLCA2KSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgNy1hcmd1bWVudCBtZXRob2QuCitURVNUKEludm9rZU1ldGhvZFRlc3QsIE1ldGhvZFRoYXRUYWtlczdBcmd1bWVudHMpIHsKKyAgRm9vIGZvbzsKKyAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT4gYSA9CisgICAgICBJbnZva2UoJmZvbywgJkZvbzo6Q29uY2F0Nyk7CisgIEVYUEVDVF9FUSgiMTIzNDU2NyIsCisgICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwgQ2hhclB0cigiMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNCIpLCBDaGFyUHRyKCI1IiksIENoYXJQdHIoIjYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjciKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDgtYXJndW1lbnQgbWV0aG9kLgorVEVTVChJbnZva2VNZXRob2RUZXN0LCBNZXRob2RUaGF0VGFrZXM4QXJndW1lbnRzKSB7CisgIEZvbyBmb287CisgIEFjdGlvbjxzdHJpbmcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0KKyAgICAgIEludm9rZSgmZm9vLCAmRm9vOjpDb25jYXQ4KTsKKyAgRVhQRUNUX0VRKCIxMjM0NTY3OCIsCisgICAgICAgICAgICBhLlBlcmZvcm0obWFrZV90dXBsZShDaGFyUHRyKCIxIiksIENoYXJQdHIoIjIiKSwgQ2hhclB0cigiMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNCIpLCBDaGFyUHRyKCI1IiksIENoYXJQdHIoIjYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjciKSwgQ2hhclB0cigiOCIpKSkpOworfQorCisvLyBUZXN0cyB1c2luZyBJbnZva2UoKSB3aXRoIGEgOS1hcmd1bWVudCBtZXRob2QuCitURVNUKEludm9rZU1ldGhvZFRlc3QsIE1ldGhvZFRoYXRUYWtlczlBcmd1bWVudHMpIHsKKyAgRm9vIGZvbzsKKyAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKik+IGEgPSBJbnZva2UoJmZvbywgJkZvbzo6Q29uY2F0OSk7CisgIEVYUEVDVF9FUSgiMTIzNDU2Nzg5IiwKKyAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjEiKSwgQ2hhclB0cigiMiIpLCBDaGFyUHRyKCIzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI0IiksIENoYXJQdHIoIjUiKSwgQ2hhclB0cigiNiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNyIpLCBDaGFyUHRyKCI4IiksIENoYXJQdHIoIjkiKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKCkgd2l0aCBhIDEwLWFyZ3VtZW50IG1ldGhvZC4KK1RFU1QoSW52b2tlTWV0aG9kVGVzdCwgTWV0aG9kVGhhdFRha2VzMTBBcmd1bWVudHMpIHsKKyAgRm9vIGZvbzsKKyAgQWN0aW9uPHN0cmluZyhjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopPiBhID0gSW52b2tlKCZmb28sICZGb286OkNvbmNhdDEwKTsKKyAgRVhQRUNUX0VRKCIxMjM0NTY3ODkwIiwKKyAgICAgICAgICAgIGEuUGVyZm9ybShtYWtlX3R1cGxlKENoYXJQdHIoIjEiKSwgQ2hhclB0cigiMiIpLCBDaGFyUHRyKCIzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUHRyKCI0IiksIENoYXJQdHIoIjUiKSwgQ2hhclB0cigiNiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclB0cigiNyIpLCBDaGFyUHRyKCI4IiksIENoYXJQdHIoIjkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQdHIoIjAiKSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgSW52b2tlKGYpIGFzIGFuIGFjdGlvbiBvZiBhIGNvbXBhdGlibGUgdHlwZS4KK1RFU1QoSW52b2tlTWV0aG9kVGVzdCwgTWV0aG9kV2l0aENvbXBhdGlibGVUeXBlKSB7CisgIEZvbyBmb287CisgIEFjdGlvbjxsb25nKGludCwgc2hvcnQsIGNoYXIsIGJvb2wpPiBhID0gIC8vIE5PTElOVAorICAgICAgSW52b2tlKCZmb28sICZGb286OlN1bU9mNCk7CisgIEVYUEVDVF9FUSg0NDQ0LCBhLlBlcmZvcm0obWFrZV90dXBsZSg0MDAwLCBTaG9ydCgzMDApLCBDaGFyKDIwKSwgdHJ1ZSkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgV2l0aG91dEFyZ3Mgd2l0aCBhbiBhY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudC4KK1RFU1QoV2l0aG91dEFyZ3NUZXN0LCBOb0FyZykgeworICBBY3Rpb248aW50KGludCBuKT4gYSA9IFdpdGhvdXRBcmdzKEludm9rZShOdWxsYXJ5KSk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEsIGEuUGVyZm9ybShtYWtlX3R1cGxlKDIpKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFdpdGhBcmcgd2l0aCBhbiBhY3Rpb24gdGhhdCB0YWtlcyAxIGFyZ3VtZW50LgorVEVTVChXaXRoQXJnVGVzdCwgT25lQXJnKSB7CisgIEFjdGlvbjxib29sKGRvdWJsZSB4LCBpbnQgbik+IGIgPSBXaXRoQXJnPDE+KEludm9rZShVbmFyeSkpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKGIuUGVyZm9ybShtYWtlX3R1cGxlKDEuNSwgLTEpKSk7CisgIEVYUEVDVF9GQUxTRShiLlBlcmZvcm0obWFrZV90dXBsZSgxLjUsIDEpKSk7Cit9CisKK1RFU1QoUmV0dXJuQXJnQWN0aW9uVGVzdCwgV29ya3NGb3JPbmVBcmdJbnRBcmcwKSB7CisgIGNvbnN0IEFjdGlvbjxpbnQoaW50KT4gYSA9IFJldHVybkFyZzwwPigpOworICBFWFBFQ1RfRVEoNSwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoNSkpKTsKK30KKworVEVTVChSZXR1cm5BcmdBY3Rpb25UZXN0LCBXb3Jrc0Zvck11bHRpQXJnQm9vbEFyZzApIHsKKyAgY29uc3QgQWN0aW9uPGJvb2woYm9vbCwgYm9vbCwgYm9vbCk+IGEgPSBSZXR1cm5Bcmc8MD4oKTsKKyAgRVhQRUNUX1RSVUUoYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgZmFsc2UsIGZhbHNlKSkpOworfQorCitURVNUKFJldHVybkFyZ0FjdGlvblRlc3QsIFdvcmtzRm9yTXVsdGlBcmdTdHJpbmdBcmcyKSB7CisgIGNvbnN0IEFjdGlvbjxzdHJpbmcoaW50LCBpbnQsIHN0cmluZywgaW50KT4gYSA9IFJldHVybkFyZzwyPigpOworICBFWFBFQ1RfRVEoInNldmVuIiwgYS5QZXJmb3JtKG1ha2VfdHVwbGUoNSwgNiwgc3RyaW5nKCJzZXZlbiIpLCA4KSkpOworfQorCitURVNUKFNhdmVBcmdBY3Rpb25UZXN0LCBXb3Jrc0ZvclNhbWVUeXBlKSB7CisgIGludCByZXN1bHQgPSAwOworICBjb25zdCBBY3Rpb248dm9pZChpbnQgbik+IGExID0gU2F2ZUFyZzwwPigmcmVzdWx0KTsKKyAgYTEuUGVyZm9ybShtYWtlX3R1cGxlKDUpKTsKKyAgRVhQRUNUX0VRKDUsIHJlc3VsdCk7Cit9CisKK1RFU1QoU2F2ZUFyZ0FjdGlvblRlc3QsIFdvcmtzRm9yQ29tcGF0aWJsZVR5cGUpIHsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGNvbnN0IEFjdGlvbjx2b2lkKGJvb2wsIGNoYXIpPiBhMSA9IFNhdmVBcmc8MT4oJnJlc3VsdCk7CisgIGExLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCAnYScpKTsKKyAgRVhQRUNUX0VRKCdhJywgcmVzdWx0KTsKK30KKworVEVTVChTYXZlQXJnUG9pbnRlZUFjdGlvblRlc3QsIFdvcmtzRm9yU2FtZVR5cGUpIHsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGNvbnN0IGludCB2YWx1ZSA9IDU7CisgIGNvbnN0IEFjdGlvbjx2b2lkKGNvbnN0IGludCopPiBhMSA9IFNhdmVBcmdQb2ludGVlPDA+KCZyZXN1bHQpOworICBhMS5QZXJmb3JtKG1ha2VfdHVwbGUoJnZhbHVlKSk7CisgIEVYUEVDVF9FUSg1LCByZXN1bHQpOworfQorCitURVNUKFNhdmVBcmdQb2ludGVlQWN0aW9uVGVzdCwgV29ya3NGb3JDb21wYXRpYmxlVHlwZSkgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgY2hhciB2YWx1ZSA9ICdhJzsKKyAgY29uc3QgQWN0aW9uPHZvaWQoYm9vbCwgY2hhciopPiBhMSA9IFNhdmVBcmdQb2ludGVlPDE+KCZyZXN1bHQpOworICBhMS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgnYScsIHJlc3VsdCk7Cit9CisKK1RFU1QoU2F2ZUFyZ1BvaW50ZWVBY3Rpb25UZXN0LCBXb3Jrc0ZvckxpbmtlZFB0cikgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgbGlua2VkX3B0cjxpbnQ+IHZhbHVlKG5ldyBpbnQoNSkpOworICBjb25zdCBBY3Rpb248dm9pZChsaW5rZWRfcHRyPGludD4pPiBhMSA9IFNhdmVBcmdQb2ludGVlPDA+KCZyZXN1bHQpOworICBhMS5QZXJmb3JtKG1ha2VfdHVwbGUodmFsdWUpKTsKKyAgRVhQRUNUX0VRKDUsIHJlc3VsdCk7Cit9CisKK1RFU1QoU2V0QXJnUmVmZXJlZUFjdGlvblRlc3QsIFdvcmtzRm9yU2FtZVR5cGUpIHsKKyAgaW50IHZhbHVlID0gMDsKKyAgY29uc3QgQWN0aW9uPHZvaWQoaW50Jik+IGExID0gU2V0QXJnUmVmZXJlZTwwPigxKTsKKyAgYTEuUGVyZm9ybSh0dXBsZTxpbnQmPih2YWx1ZSkpOworICBFWFBFQ1RfRVEoMSwgdmFsdWUpOworfQorCitURVNUKFNldEFyZ1JlZmVyZWVBY3Rpb25UZXN0LCBXb3Jrc0ZvckNvbXBhdGlibGVUeXBlKSB7CisgIGludCB2YWx1ZSA9IDA7CisgIGNvbnN0IEFjdGlvbjx2b2lkKGludCwgaW50Jik+IGExID0gU2V0QXJnUmVmZXJlZTwxPignYScpOworICBhMS5QZXJmb3JtKHR1cGxlPGludCwgaW50Jj4oMCwgdmFsdWUpKTsKKyAgRVhQRUNUX0VRKCdhJywgdmFsdWUpOworfQorCitURVNUKFNldEFyZ1JlZmVyZWVBY3Rpb25UZXN0LCBXb3Jrc1dpdGhFeHRyYUFyZ3VtZW50cykgeworICBpbnQgdmFsdWUgPSAwOworICBjb25zdCBBY3Rpb248dm9pZChib29sLCBpbnQsIGludCYsIGNvbnN0IGNoYXIqKT4gYTEgPSBTZXRBcmdSZWZlcmVlPDI+KCdhJyk7CisgIGExLlBlcmZvcm0odHVwbGU8Ym9vbCwgaW50LCBpbnQmLCBjb25zdCBjaGFyKj4odHJ1ZSwgMCwgdmFsdWUsICJoaSIpKTsKKyAgRVhQRUNUX0VRKCdhJywgdmFsdWUpOworfQorCisvLyBBIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkOiBpdCB3aWxsIHNldAorLy8gdGhlIGJvb2wgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHRvIHRydWUgd2hlbiBkZXN0cm95ZWQuCitjbGFzcyBEZWxldGlvblRlc3RlciB7CisgcHVibGljOgorICBleHBsaWNpdCBEZWxldGlvblRlc3Rlcihib29sKiBpc19kZWxldGVkKQorICAgIDogaXNfZGVsZXRlZF8oaXNfZGVsZXRlZCkgeworICAgIC8vIE1ha2Ugc3VyZSB0aGUgYml0IGlzIHNldCB0byBmYWxzZS4KKyAgICAqaXNfZGVsZXRlZF8gPSBmYWxzZTsKKyAgfQorCisgIH5EZWxldGlvblRlc3RlcigpIHsKKyAgICAqaXNfZGVsZXRlZF8gPSB0cnVlOworICB9CisKKyBwcml2YXRlOgorICBib29sKiBpc19kZWxldGVkXzsKK307CisKK1RFU1QoRGVsZXRlQXJnQWN0aW9uVGVzdCwgT25lQXJnKSB7CisgIGJvb2wgaXNfZGVsZXRlZCA9IGZhbHNlOworICBEZWxldGlvblRlc3RlciogdCA9IG5ldyBEZWxldGlvblRlc3RlcigmaXNfZGVsZXRlZCk7CisgIGNvbnN0IEFjdGlvbjx2b2lkKERlbGV0aW9uVGVzdGVyKik+IGExID0gRGVsZXRlQXJnPDA+KCk7ICAgICAgLy8gTk9MSU5UCisgIEVYUEVDVF9GQUxTRShpc19kZWxldGVkKTsKKyAgYTEuUGVyZm9ybShtYWtlX3R1cGxlKHQpKTsKKyAgRVhQRUNUX1RSVUUoaXNfZGVsZXRlZCk7Cit9CisKK1RFU1QoRGVsZXRlQXJnQWN0aW9uVGVzdCwgVGVuQXJncykgeworICBib29sIGlzX2RlbGV0ZWQgPSBmYWxzZTsKKyAgRGVsZXRpb25UZXN0ZXIqIHQgPSBuZXcgRGVsZXRpb25UZXN0ZXIoJmlzX2RlbGV0ZWQpOworICBjb25zdCBBY3Rpb248dm9pZChib29sLCBpbnQsIGludCwgY29uc3QgY2hhciosIGJvb2wsCisgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQsIGludCwgRGVsZXRpb25UZXN0ZXIqKT4gYTEgPSBEZWxldGVBcmc8OT4oKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX2RlbGV0ZWQpOworICBhMS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgNSwgNiwgQ2hhclB0cigiaGkiKSwgZmFsc2UsIDcsIDgsIDksIDEwLCB0KSk7CisgIEVYUEVDVF9UUlVFKGlzX2RlbGV0ZWQpOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworVEVTVChUaHJvd0FjdGlvblRlc3QsIFRocm93c0dpdmVuRXhjZXB0aW9uSW5Wb2lkRnVuY3Rpb24pIHsKKyAgY29uc3QgQWN0aW9uPHZvaWQoaW50IG4pPiBhID0gVGhyb3coJ2EnKTsKKyAgRVhQRUNUX1RIUk9XKGEuUGVyZm9ybShtYWtlX3R1cGxlKDApKSwgY2hhcik7Cit9CisKK2NsYXNzIE15RXhjZXB0aW9uIHt9OworCitURVNUKFRocm93QWN0aW9uVGVzdCwgVGhyb3dzR2l2ZW5FeGNlcHRpb25Jbk5vblZvaWRGdW5jdGlvbikgeworICBjb25zdCBBY3Rpb248ZG91YmxlKGNoYXIgY2gpPiBhID0gVGhyb3coTXlFeGNlcHRpb24oKSk7CisgIEVYUEVDVF9USFJPVyhhLlBlcmZvcm0obWFrZV90dXBsZSgnMCcpKSwgTXlFeGNlcHRpb24pOworfQorCitURVNUKFRocm93QWN0aW9uVGVzdCwgVGhyb3dzR2l2ZW5FeGNlcHRpb25Jbk51bGxhcnlGdW5jdGlvbikgeworICBjb25zdCBBY3Rpb248ZG91YmxlKCk+IGEgPSBUaHJvdyhNeUV4Y2VwdGlvbigpKTsKKyAgRVhQRUNUX1RIUk9XKGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpLCBNeUV4Y2VwdGlvbik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gVGVzdHMgdGhhdCBTZXRBcnJheUFyZ3VtZW50PE4+KGZpcnN0LCBsYXN0KSBzZXRzIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKy8vIHBvaW50ZWQgdG8gYnkgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IHRvIHZhbHVlcyBpbiByYW5nZSBbZmlyc3QsIGxhc3QpLgorVEVTVChTZXRBcnJheUFyZ3VtZW50VGVzdCwgU2V0c1RoZU50aEFycmF5KSB7CisgIHR5cGVkZWYgdm9pZCBNeUZ1bmN0aW9uKGJvb2wsIGludCosIGNoYXIqKTsKKyAgaW50IG51bWJlcnNbXSA9IHsgMSwgMiwgMyB9OworICBBY3Rpb248TXlGdW5jdGlvbj4gYSA9IFNldEFycmF5QXJndW1lbnQ8MT4obnVtYmVycywgbnVtYmVycyArIDMpOworCisgIGludCBuWzRdID0ge307CisgIGludCogcG4gPSBuOworICBjaGFyIGNoWzRdID0ge307CisgIGNoYXIqIHBjaCA9IGNoOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCBwbiwgcGNoKSk7CisgIEVYUEVDVF9FUSgxLCBuWzBdKTsKKyAgRVhQRUNUX0VRKDIsIG5bMV0pOworICBFWFBFQ1RfRVEoMywgblsyXSk7CisgIEVYUEVDVF9FUSgwLCBuWzNdKTsKKyAgRVhQRUNUX0VRKCdcMCcsIGNoWzBdKTsKKyAgRVhQRUNUX0VRKCdcMCcsIGNoWzFdKTsKKyAgRVhQRUNUX0VRKCdcMCcsIGNoWzJdKTsKKyAgRVhQRUNUX0VRKCdcMCcsIGNoWzNdKTsKKworICAvLyBUZXN0cyBmaXJzdCBhbmQgbGFzdCBhcmUgaXRlcmF0b3JzLgorICBzdGQ6OnN0cmluZyBsZXR0ZXJzID0gImFiYyI7CisgIGEgPSBTZXRBcnJheUFyZ3VtZW50PDI+KGxldHRlcnMuYmVnaW4oKSwgbGV0dGVycy5lbmQoKSk7CisgIHN0ZDo6ZmlsbF9uKG4sIDQsIDApOworICBzdGQ6OmZpbGxfbihjaCwgNCwgJ1wwJyk7CisgIGEuUGVyZm9ybShtYWtlX3R1cGxlKHRydWUsIHBuLCBwY2gpKTsKKyAgRVhQRUNUX0VRKDAsIG5bMF0pOworICBFWFBFQ1RfRVEoMCwgblsxXSk7CisgIEVYUEVDVF9FUSgwLCBuWzJdKTsKKyAgRVhQRUNUX0VRKDAsIG5bM10pOworICBFWFBFQ1RfRVEoJ2EnLCBjaFswXSk7CisgIEVYUEVDVF9FUSgnYicsIGNoWzFdKTsKKyAgRVhQRUNUX0VRKCdjJywgY2hbMl0pOworICBFWFBFQ1RfRVEoJ1wwJywgY2hbM10pOworfQorCisvLyBUZXN0cyBTZXRBcnJheUFyZ3VtZW50PE4+KGZpcnN0LCBsYXN0KSB3aGVyZSBmaXJzdCA9PSBsYXN0LgorVEVTVChTZXRBcnJheUFyZ3VtZW50VGVzdCwgU2V0c1RoZU50aEFycmF5V2l0aEVtcHR5UmFuZ2UpIHsKKyAgdHlwZWRlZiB2b2lkIE15RnVuY3Rpb24oYm9vbCwgaW50Kik7CisgIGludCBudW1iZXJzW10gPSB7IDEsIDIsIDMgfTsKKyAgQWN0aW9uPE15RnVuY3Rpb24+IGEgPSBTZXRBcnJheUFyZ3VtZW50PDE+KG51bWJlcnMsIG51bWJlcnMpOworCisgIGludCBuWzRdID0ge307CisgIGludCogcG4gPSBuOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCBwbikpOworICBFWFBFQ1RfRVEoMCwgblswXSk7CisgIEVYUEVDVF9FUSgwLCBuWzFdKTsKKyAgRVhQRUNUX0VRKDAsIG5bMl0pOworICBFWFBFQ1RfRVEoMCwgblszXSk7Cit9CisKKy8vIFRlc3RzIFNldEFycmF5QXJndW1lbnQ8Tj4oZmlyc3QsIGxhc3QpIHdoZXJlICpmaXJzdCBpcyBjb252ZXJ0aWJsZQorLy8gKGJ1dCBub3QgZXF1YWwpIHRvIHRoZSBhcmd1bWVudCB0eXBlLgorVEVTVChTZXRBcnJheUFyZ3VtZW50VGVzdCwgU2V0c1RoZU50aEFycmF5V2l0aENvbnZlcnRpYmxlVHlwZSkgeworICB0eXBlZGVmIHZvaWQgTXlGdW5jdGlvbihib29sLCBpbnQqKTsKKyAgY2hhciBjaGFyc1tdID0geyA5NywgOTgsIDk5IH07CisgIEFjdGlvbjxNeUZ1bmN0aW9uPiBhID0gU2V0QXJyYXlBcmd1bWVudDwxPihjaGFycywgY2hhcnMgKyAzKTsKKworICBpbnQgY29kZXNbNF0gPSB7IDExMSwgMjIyLCAzMzMsIDQ0NCB9OworICBpbnQqIHBjb2RlcyA9IGNvZGVzOworICBhLlBlcmZvcm0obWFrZV90dXBsZSh0cnVlLCBwY29kZXMpKTsKKyAgRVhQRUNUX0VRKDk3LCBjb2Rlc1swXSk7CisgIEVYUEVDVF9FUSg5OCwgY29kZXNbMV0pOworICBFWFBFQ1RfRVEoOTksIGNvZGVzWzJdKTsKKyAgRVhQRUNUX0VRKDQ0NCwgY29kZXNbM10pOworfQorCisvLyBUZXN0IFNldEFycmF5QXJndW1lbnQ8Tj4oZmlyc3QsIGxhc3QpIHdpdGggaXRlcmF0b3IgYXMgYXJndW1lbnQuCitURVNUKFNldEFycmF5QXJndW1lbnRUZXN0LCBTZXRzVGhlTnRoQXJyYXlXaXRoSXRlcmF0b3JBcmd1bWVudCkgeworICB0eXBlZGVmIHZvaWQgTXlGdW5jdGlvbihib29sLCBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHN0ZDo6c3RyaW5nPik7CisgIHN0ZDo6c3RyaW5nIGxldHRlcnMgPSAiYWJjIjsKKyAgQWN0aW9uPE15RnVuY3Rpb24+IGEgPSBTZXRBcnJheUFyZ3VtZW50PDE+KGxldHRlcnMuYmVnaW4oKSwgbGV0dGVycy5lbmQoKSk7CisKKyAgc3RkOjpzdHJpbmcgczsKKyAgYS5QZXJmb3JtKG1ha2VfdHVwbGUodHJ1ZSwgYmFja19pbnNlcnRlcihzKSkpOworICBFWFBFQ1RfRVEobGV0dGVycywgcyk7Cit9CisKK1RFU1QoUmV0dXJuUG9pbnRlZVRlc3QsIFdvcmtzKSB7CisgIGludCBuID0gNDI7CisgIGNvbnN0IEFjdGlvbjxpbnQoKT4gYSA9IFJldHVyblBvaW50ZWUoJm4pOworICBFWFBFQ1RfRVEoNDIsIGEuUGVyZm9ybShtYWtlX3R1cGxlKCkpKTsKKworICBuID0gNDM7CisgIEVYUEVDVF9FUSg0MywgYS5QZXJmb3JtKG1ha2VfdHVwbGUoKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZ21vY2tfZ2VuZXJhdGVkX2FjdGlvbnNfdGVzdAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLW5pY2Utc3RyaWN0X3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1uaWNlLXN0cmljdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYWRjYmIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1uaWNlLXN0cmljdF90ZXN0LmNjCkBAIC0wLDAgKzEsNDI0IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisvLyBUaGlzIG11c3Qgbm90IGJlIGRlZmluZWQgaW5zaWRlIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLCBvciBpdCB3aWxsCisvLyBjbGFzaCB3aXRoIDo6dGVzdGluZzo6TW9jay4KK2NsYXNzIE1vY2sgeworIHB1YmxpYzoKKyAgTW9jaygpIHt9CisKKyAgTU9DS19NRVRIT0QwKERvVGhpcywgdm9pZCgpKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9jayk7Cit9OworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgZ21vY2tfbmljZV9zdHJpY3RfdGVzdCB7CisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjpHTU9DS19GTEFHKHZlcmJvc2UpOwordXNpbmcgdGVzdGluZzo6SGFzU3Vic3RyOwordXNpbmcgdGVzdGluZzo6TmFnZ3lNb2NrOwordXNpbmcgdGVzdGluZzo6TmljZU1vY2s7Cit1c2luZyB0ZXN0aW5nOjpTdHJpY3RNb2NrOworCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNhcHR1cmVTdGRvdXQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q2FwdHVyZWRTdGRvdXQ7CisjZW5kaWYKKworLy8gRGVmaW5lcyBzb21lIG1vY2sgY2xhc3NlcyBuZWVkZWQgYnkgdGhlIHRlc3RzLgorCitjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Rm9vKCkge30KKworICB2aXJ0dWFsIHZvaWQgRG9UaGlzKCkgPSAwOworICB2aXJ0dWFsIGludCBEb1RoYXQoYm9vbCBmbGFnKSA9IDA7Cit9OworCitjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7CisgcHVibGljOgorICBNb2NrRm9vKCkge30KKyAgdm9pZCBEZWxldGUoKSB7IGRlbGV0ZSB0aGlzOyB9CisKKyAgTU9DS19NRVRIT0QwKERvVGhpcywgdm9pZCgpKTsKKyAgTU9DS19NRVRIT0QxKERvVGhhdCwgaW50KGJvb2wgZmxhZykpOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRm9vKTsKK307CisKK2NsYXNzIE1vY2tCYXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTW9ja0Jhcihjb25zdCBzdHJpbmcmIHMpIDogc3RyXyhzKSB7fQorCisgIE1vY2tCYXIoY2hhciBhMSwgY2hhciBhMiwgc3RyaW5nIGEzLCBzdHJpbmcgYTQsIGludCBhNSwgaW50IGE2LAorICAgICAgICAgIGNvbnN0IHN0cmluZyYgYTcsIGNvbnN0IHN0cmluZyYgYTgsIGJvb2wgYTksIGJvb2wgYTEwKSB7CisgICAgc3RyXyA9IHN0cmluZygpICsgYTEgKyBhMiArIGEzICsgYTQgKyBzdGF0aWNfY2FzdDxjaGFyPihhNSkgKworICAgICAgICBzdGF0aWNfY2FzdDxjaGFyPihhNikgKyBhNyArIGE4ICsgKGE5ID8gJ1QnIDogJ0YnKSArIChhMTAgPyAnVCcgOiAnRicpOworICB9CisKKyAgdmlydHVhbCB+TW9ja0JhcigpIHt9CisKKyAgY29uc3Qgc3RyaW5nJiBzdHIoKSBjb25zdCB7IHJldHVybiBzdHJfOyB9CisKKyAgTU9DS19NRVRIT0QwKFRoaXMsIGludCgpKTsKKyAgTU9DS19NRVRIT0QyKFRoYXQsIHN0cmluZyhpbnQsIGJvb2wpKTsKKworIHByaXZhdGU6CisgIHN0cmluZyBzdHJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Jhcik7Cit9OworCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisvLyBUZXN0cyB0aGF0IGEgcmF3IG1vY2sgZ2VuZXJhdGVzIHdhcm5pbmdzIGZvciB1bmludGVyZXN0aW5nIGNhbGxzLgorVEVTVChSYXdNb2NrVGVzdCwgV2FybmluZ0ZvclVuaW50ZXJlc3RpbmdDYWxsKSB7CisgIGNvbnN0IHN0cmluZyBzYXZlZF9mbGFnID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJ3YXJuaW5nIjsKKworICBNb2NrRm9vIHJhd19mb287CisKKyAgQ2FwdHVyZVN0ZG91dCgpOworICByYXdfZm9vLkRvVGhpcygpOworICByYXdfZm9vLkRvVGhhdCh0cnVlKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRvdXQoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCIpKTsKKworICBHTU9DS19GTEFHKHZlcmJvc2UpID0gc2F2ZWRfZmxhZzsKK30KKworLy8gVGVzdHMgdGhhdCBhIHJhdyBtb2NrIGdlbmVyYXRlcyB3YXJuaW5ncyBmb3IgdW5pbnRlcmVzdGluZyBjYWxscworLy8gdGhhdCBkZWxldGUgdGhlIG1vY2sgb2JqZWN0LgorVEVTVChSYXdNb2NrVGVzdCwgV2FybmluZ0ZvclVuaW50ZXJlc3RpbmdDYWxsQWZ0ZXJEZWF0aCkgeworICBjb25zdCBzdHJpbmcgc2F2ZWRfZmxhZyA9IEdNT0NLX0ZMQUcodmVyYm9zZSk7CisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSAid2FybmluZyI7CisKKyAgTW9ja0ZvbyogY29uc3QgcmF3X2ZvbyA9IG5ldyBNb2NrRm9vOworCisgIE9OX0NBTEwoKnJhd19mb28sIERvVGhpcygpKQorICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKHJhd19mb28sICZNb2NrRm9vOjpEZWxldGUpKTsKKworICBDYXB0dXJlU3Rkb3V0KCk7CisgIHJhd19mb28tPkRvVGhpcygpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZG91dCgpLAorICAgICAgICAgICAgICBIYXNTdWJzdHIoIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIikpOworCisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBzYXZlZF9mbGFnOworfQorCisvLyBUZXN0cyB0aGF0IGEgcmF3IG1vY2sgZ2VuZXJhdGVzIGluZm9ybWF0aW9uYWwgbG9ncyBmb3IKKy8vIHVuaW50ZXJlc3RpbmcgY2FsbHMuCitURVNUKFJhd01vY2tUZXN0LCBJbmZvRm9yVW5pbnRlcmVzdGluZ0NhbGwpIHsKKyAgTW9ja0ZvbyByYXdfZm9vOworCisgIGNvbnN0IHN0cmluZyBzYXZlZF9mbGFnID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJpbmZvIjsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICByYXdfZm9vLkRvVGhpcygpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZG91dCgpLAorICAgICAgICAgICAgICBIYXNTdWJzdHIoIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIikpOworCisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBzYXZlZF9mbGFnOworfQorCisvLyBUZXN0cyB0aGF0IGEgbmljZSBtb2NrIGdlbmVyYXRlcyBubyB3YXJuaW5nIGZvciB1bmludGVyZXN0aW5nIGNhbGxzLgorVEVTVChOaWNlTW9ja1Rlc3QsIE5vV2FybmluZ0ZvclVuaW50ZXJlc3RpbmdDYWxsKSB7CisgIE5pY2VNb2NrPE1vY2tGb28+IG5pY2VfZm9vOworCisgIENhcHR1cmVTdGRvdXQoKTsKKyAgbmljZV9mb28uRG9UaGlzKCk7CisgIG5pY2VfZm9vLkRvVGhhdCh0cnVlKTsKKyAgRVhQRUNUX0VRKCIiLCBHZXRDYXB0dXJlZFN0ZG91dCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIG5pY2UgbW9jayBnZW5lcmF0ZXMgbm8gd2FybmluZyBmb3IgdW5pbnRlcmVzdGluZyBjYWxscworLy8gdGhhdCBkZWxldGUgdGhlIG1vY2sgb2JqZWN0LgorVEVTVChOaWNlTW9ja1Rlc3QsIE5vV2FybmluZ0ZvclVuaW50ZXJlc3RpbmdDYWxsQWZ0ZXJEZWF0aCkgeworICBOaWNlTW9jazxNb2NrRm9vPiogY29uc3QgbmljZV9mb28gPSBuZXcgTmljZU1vY2s8TW9ja0Zvbz47CisKKyAgT05fQ0FMTCgqbmljZV9mb28sIERvVGhpcygpKQorICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKG5pY2VfZm9vLCAmTW9ja0Zvbzo6RGVsZXRlKSk7CisKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBuaWNlX2Zvby0+RG9UaGlzKCk7CisgIEVYUEVDVF9FUSgiIiwgR2V0Q2FwdHVyZWRTdGRvdXQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBuaWNlIG1vY2sgZ2VuZXJhdGVzIGluZm9ybWF0aW9uYWwgbG9ncyBmb3IKKy8vIHVuaW50ZXJlc3RpbmcgY2FsbHMuCitURVNUKE5pY2VNb2NrVGVzdCwgSW5mb0ZvclVuaW50ZXJlc3RpbmdDYWxsKSB7CisgIE5pY2VNb2NrPE1vY2tGb28+IG5pY2VfZm9vOworCisgIGNvbnN0IHN0cmluZyBzYXZlZF9mbGFnID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJpbmZvIjsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBuaWNlX2Zvby5Eb1RoaXMoKTsKKyAgRVhQRUNUX1RIQVQoR2V0Q2FwdHVyZWRTdGRvdXQoKSwKKyAgICAgICAgICAgICAgSGFzU3Vic3RyKCJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCIpKTsKKworICBHTU9DS19GTEFHKHZlcmJvc2UpID0gc2F2ZWRfZmxhZzsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIFRlc3RzIHRoYXQgYSBuaWNlIG1vY2sgYWxsb3dzIGV4cGVjdGVkIGNhbGxzLgorVEVTVChOaWNlTW9ja1Rlc3QsIEFsbG93c0V4cGVjdGVkQ2FsbCkgeworICBOaWNlTW9jazxNb2NrRm9vPiBuaWNlX2ZvbzsKKworICBFWFBFQ1RfQ0FMTChuaWNlX2ZvbywgRG9UaGlzKCkpOworICBuaWNlX2Zvby5Eb1RoaXMoKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbiB1bmV4cGVjdGVkIGNhbGwgb24gYSBuaWNlIG1vY2sgZmFpbHMuCitURVNUKE5pY2VNb2NrVGVzdCwgVW5leHBlY3RlZENhbGxGYWlscykgeworICBOaWNlTW9jazxNb2NrRm9vPiBuaWNlX2ZvbzsKKworICBFWFBFQ1RfQ0FMTChuaWNlX2ZvbywgRG9UaGlzKCkpLlRpbWVzKDApOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShuaWNlX2Zvby5Eb1RoaXMoKSwgImNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gZXhwZWN0ZWQiKTsKK30KKworLy8gVGVzdHMgdGhhdCBOaWNlTW9jayB3b3JrcyB3aXRoIGEgbW9jayBjbGFzcyB0aGF0IGhhcyBhIG5vbi1kZWZhdWx0CisvLyBjb25zdHJ1Y3Rvci4KK1RFU1QoTmljZU1vY2tUZXN0LCBOb25EZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgTmljZU1vY2s8TW9ja0Jhcj4gbmljZV9iYXIoImhpIik7CisgIEVYUEVDVF9FUSgiaGkiLCBuaWNlX2Jhci5zdHIoKSk7CisKKyAgbmljZV9iYXIuVGhpcygpOworICBuaWNlX2Jhci5UaGF0KDUsIHRydWUpOworfQorCisvLyBUZXN0cyB0aGF0IE5pY2VNb2NrIHdvcmtzIHdpdGggYSBtb2NrIGNsYXNzIHRoYXQgaGFzIGEgMTAtYXJ5CisvLyBub24tZGVmYXVsdCBjb25zdHJ1Y3Rvci4KK1RFU1QoTmljZU1vY2tUZXN0LCBOb25EZWZhdWx0Q29uc3RydWN0b3IxMCkgeworICBOaWNlTW9jazxNb2NrQmFyPiBuaWNlX2JhcignYScsICdiJywgImMiLCAiZCIsICdlJywgJ2YnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIsICJoIiwgdHJ1ZSwgZmFsc2UpOworICBFWFBFQ1RfRVEoImFiY2RlZmdoVEYiLCBuaWNlX2Jhci5zdHIoKSk7CisKKyAgbmljZV9iYXIuVGhpcygpOworICBuaWNlX2Jhci5UaGF0KDUsIHRydWUpOworfQorCisjaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBUZXN0cyB0aGF0IE5pY2VNb2NrPE1vY2s+IGNvbXBpbGVzIHdoZXJlIE1vY2sgaXMgYSB1c2VyLWRlZmluZWQKKy8vIGNsYXNzIChhcyBvcHBvc2VkIHRvIDo6dGVzdGluZzo6TW9jaykuICBXZSBoYWQgdG8gd29yayBhcm91bmQgYW4KKy8vIE1TVkMgOC4wIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgc3ltYm9sIE1vY2sgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbiBvZgorLy8gTmljZU1vY2sgdG8gYmUgbG9va2VkIHVwIGluIHRoZSB3cm9uZyBjb250ZXh0LCBhbmQgdGhpcyB0ZXN0CisvLyBlbnN1cmVzIHRoYXQgb3VyIGZpeCB3b3Jrcy4KKy8vCisvLyBXZSBoYXZlIHRvIHNraXAgdGhpcyB0ZXN0IG9uIFN5bWJpYW4gYW5kIFdpbmRvd3MgTW9iaWxlLCBhcyBpdAorLy8gY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGNyYXNoIHRoZXJlLCBmb3IgcmVhc29ucyB1bmNsZWFyIHRvIHVzIHlldC4KK1RFU1QoTmljZU1vY2tUZXN0LCBBY2NlcHRzQ2xhc3NOYW1lZE1vY2spIHsKKyAgTmljZU1vY2s8IDo6TW9jaz4gbmljZTsKKyAgRVhQRUNUX0NBTEwobmljZSwgRG9UaGlzKCkpOworICBuaWNlLkRvVGhpcygpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTiAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gVGVzdHMgdGhhdCBhIG5hZ2d5IG1vY2sgZ2VuZXJhdGVzIHdhcm5pbmdzIGZvciB1bmludGVyZXN0aW5nIGNhbGxzLgorVEVTVChOYWdneU1vY2tUZXN0LCBXYXJuaW5nRm9yVW5pbnRlcmVzdGluZ0NhbGwpIHsKKyAgY29uc3Qgc3RyaW5nIHNhdmVkX2ZsYWcgPSBHTU9DS19GTEFHKHZlcmJvc2UpOworICBHTU9DS19GTEFHKHZlcmJvc2UpID0gIndhcm5pbmciOworCisgIE5hZ2d5TW9jazxNb2NrRm9vPiBuYWdneV9mb287CisKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBuYWdneV9mb28uRG9UaGlzKCk7CisgIG5hZ2d5X2Zvby5Eb1RoYXQodHJ1ZSk7CisgIEVYUEVDVF9USEFUKEdldENhcHR1cmVkU3Rkb3V0KCksCisgICAgICAgICAgICAgIEhhc1N1YnN0cigiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwiKSk7CisKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IHNhdmVkX2ZsYWc7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBuYWdneSBtb2NrIGdlbmVyYXRlcyBhIHdhcm5pbmcgZm9yIGFuIHVuaW50ZXJlc3RpbmcgY2FsbAorLy8gdGhhdCBkZWxldGVzIHRoZSBtb2NrIG9iamVjdC4KK1RFU1QoTmFnZ3lNb2NrVGVzdCwgV2FybmluZ0ZvclVuaW50ZXJlc3RpbmdDYWxsQWZ0ZXJEZWF0aCkgeworICBjb25zdCBzdHJpbmcgc2F2ZWRfZmxhZyA9IEdNT0NLX0ZMQUcodmVyYm9zZSk7CisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSAid2FybmluZyI7CisKKyAgTmFnZ3lNb2NrPE1vY2tGb28+KiBjb25zdCBuYWdneV9mb28gPSBuZXcgTmFnZ3lNb2NrPE1vY2tGb28+OworCisgIE9OX0NBTEwoKm5hZ2d5X2ZvbywgRG9UaGlzKCkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UobmFnZ3lfZm9vLCAmTW9ja0Zvbzo6RGVsZXRlKSk7CisKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBuYWdneV9mb28tPkRvVGhpcygpOworICBFWFBFQ1RfVEhBVChHZXRDYXB0dXJlZFN0ZG91dCgpLAorICAgICAgICAgICAgICBIYXNTdWJzdHIoIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIikpOworCisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBzYXZlZF9mbGFnOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gVGVzdHMgdGhhdCBhIG5hZ2d5IG1vY2sgYWxsb3dzIGV4cGVjdGVkIGNhbGxzLgorVEVTVChOYWdneU1vY2tUZXN0LCBBbGxvd3NFeHBlY3RlZENhbGwpIHsKKyAgTmFnZ3lNb2NrPE1vY2tGb28+IG5hZ2d5X2ZvbzsKKworICBFWFBFQ1RfQ0FMTChuYWdneV9mb28sIERvVGhpcygpKTsKKyAgbmFnZ3lfZm9vLkRvVGhpcygpOworfQorCisvLyBUZXN0cyB0aGF0IGFuIHVuZXhwZWN0ZWQgY2FsbCBvbiBhIG5hZ2d5IG1vY2sgZmFpbHMuCitURVNUKE5hZ2d5TW9ja1Rlc3QsIFVuZXhwZWN0ZWRDYWxsRmFpbHMpIHsKKyAgTmFnZ3lNb2NrPE1vY2tGb28+IG5hZ2d5X2ZvbzsKKworICBFWFBFQ1RfQ0FMTChuYWdneV9mb28sIERvVGhpcygpKS5UaW1lcygwKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUobmFnZ3lfZm9vLkRvVGhpcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCIpOworfQorCisvLyBUZXN0cyB0aGF0IE5hZ2d5TW9jayB3b3JrcyB3aXRoIGEgbW9jayBjbGFzcyB0aGF0IGhhcyBhIG5vbi1kZWZhdWx0CisvLyBjb25zdHJ1Y3Rvci4KK1RFU1QoTmFnZ3lNb2NrVGVzdCwgTm9uRGVmYXVsdENvbnN0cnVjdG9yKSB7CisgIE5hZ2d5TW9jazxNb2NrQmFyPiBuYWdneV9iYXIoImhpIik7CisgIEVYUEVDVF9FUSgiaGkiLCBuYWdneV9iYXIuc3RyKCkpOworCisgIG5hZ2d5X2Jhci5UaGlzKCk7CisgIG5hZ2d5X2Jhci5UaGF0KDUsIHRydWUpOworfQorCisvLyBUZXN0cyB0aGF0IE5hZ2d5TW9jayB3b3JrcyB3aXRoIGEgbW9jayBjbGFzcyB0aGF0IGhhcyBhIDEwLWFyeQorLy8gbm9uLWRlZmF1bHQgY29uc3RydWN0b3IuCitURVNUKE5hZ2d5TW9ja1Rlc3QsIE5vbkRlZmF1bHRDb25zdHJ1Y3RvcjEwKSB7CisgIE5hZ2d5TW9jazxNb2NrQmFyPiBuYWdneV9iYXIoJzAnLCAnMScsICIyIiwgIjMiLCAnNCcsICc1JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNiIsICI3IiwgdHJ1ZSwgZmFsc2UpOworICBFWFBFQ1RfRVEoIjAxMjM0NTY3VEYiLCBuYWdneV9iYXIuc3RyKCkpOworCisgIG5hZ2d5X2Jhci5UaGlzKCk7CisgIG5hZ2d5X2Jhci5UaGF0KDUsIHRydWUpOworfQorCisjaWYgIUdURVNUX09TX1NZTUJJQU4gJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBUZXN0cyB0aGF0IE5hZ2d5TW9jazxNb2NrPiBjb21waWxlcyB3aGVyZSBNb2NrIGlzIGEgdXNlci1kZWZpbmVkCisvLyBjbGFzcyAoYXMgb3Bwb3NlZCB0byA6OnRlc3Rpbmc6Ok1vY2spLiAgV2UgaGFkIHRvIHdvcmsgYXJvdW5kIGFuCisvLyBNU1ZDIDguMCBidWcgdGhhdCBjYXVzZWQgdGhlIHN5bWJvbCBNb2NrIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YKKy8vIE5hZ2d5TW9jayB0byBiZSBsb29rZWQgdXAgaW4gdGhlIHdyb25nIGNvbnRleHQsIGFuZCB0aGlzIHRlc3QKKy8vIGVuc3VyZXMgdGhhdCBvdXIgZml4IHdvcmtzLgorLy8KKy8vIFdlIGhhdmUgdG8gc2tpcCB0aGlzIHRlc3Qgb24gU3ltYmlhbiBhbmQgV2luZG93cyBNb2JpbGUsIGFzIGl0CisvLyBjYXVzZXMgdGhlIHByb2dyYW0gdG8gY3Jhc2ggdGhlcmUsIGZvciByZWFzb25zIHVuY2xlYXIgdG8gdXMgeWV0LgorVEVTVChOYWdneU1vY2tUZXN0LCBBY2NlcHRzQ2xhc3NOYW1lZE1vY2spIHsKKyAgTmFnZ3lNb2NrPCA6Ok1vY2s+IG5hZ2d5OworICBFWFBFQ1RfQ0FMTChuYWdneSwgRG9UaGlzKCkpOworICBuYWdneS5Eb1RoaXMoKTsKK30KKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4gJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFRlc3RzIHRoYXQgYSBzdHJpY3QgbW9jayBhbGxvd3MgZXhwZWN0ZWQgY2FsbHMuCitURVNUKFN0cmljdE1vY2tUZXN0LCBBbGxvd3NFeHBlY3RlZENhbGwpIHsKKyAgU3RyaWN0TW9jazxNb2NrRm9vPiBzdHJpY3RfZm9vOworCisgIEVYUEVDVF9DQUxMKHN0cmljdF9mb28sIERvVGhpcygpKTsKKyAgc3RyaWN0X2Zvby5Eb1RoaXMoKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbiB1bmV4cGVjdGVkIGNhbGwgb24gYSBzdHJpY3QgbW9jayBmYWlscy4KK1RFU1QoU3RyaWN0TW9ja1Rlc3QsIFVuZXhwZWN0ZWRDYWxsRmFpbHMpIHsKKyAgU3RyaWN0TW9jazxNb2NrRm9vPiBzdHJpY3RfZm9vOworCisgIEVYUEVDVF9DQUxMKHN0cmljdF9mb28sIERvVGhpcygpKS5UaW1lcygwKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoc3RyaWN0X2Zvby5Eb1RoaXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gZXhwZWN0ZWQiKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbiB1bmludGVyZXN0aW5nIGNhbGwgb24gYSBzdHJpY3QgbW9jayBmYWlscy4KK1RFU1QoU3RyaWN0TW9ja1Rlc3QsIFVuaW50ZXJlc3RpbmdDYWxsRmFpbHMpIHsKKyAgU3RyaWN0TW9jazxNb2NrRm9vPiBzdHJpY3RfZm9vOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHN0cmljdF9mb28uRG9UaGlzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworfQorCisvLyBUZXN0cyB0aGF0IGFuIHVuaW50ZXJlc3RpbmcgY2FsbCBvbiBhIHN0cmljdCBtb2NrIGZhaWxzLCBldmVuIGlmCisvLyB0aGUgY2FsbCBkZWxldGVzIHRoZSBtb2NrIG9iamVjdC4KK1RFU1QoU3RyaWN0TW9ja1Rlc3QsIFVuaW50ZXJlc3RpbmdDYWxsRmFpbHNBZnRlckRlYXRoKSB7CisgIFN0cmljdE1vY2s8TW9ja0Zvbz4qIGNvbnN0IHN0cmljdF9mb28gPSBuZXcgU3RyaWN0TW9jazxNb2NrRm9vPjsKKworICBPTl9DQUxMKCpzdHJpY3RfZm9vLCBEb1RoaXMoKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZShzdHJpY3RfZm9vLCAmTW9ja0Zvbzo6RGVsZXRlKSk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoc3RyaWN0X2Zvby0+RG9UaGlzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworfQorCisvLyBUZXN0cyB0aGF0IFN0cmljdE1vY2sgd29ya3Mgd2l0aCBhIG1vY2sgY2xhc3MgdGhhdCBoYXMgYQorLy8gbm9uLWRlZmF1bHQgY29uc3RydWN0b3IuCitURVNUKFN0cmljdE1vY2tUZXN0LCBOb25EZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgU3RyaWN0TW9jazxNb2NrQmFyPiBzdHJpY3RfYmFyKCJoaSIpOworICBFWFBFQ1RfRVEoImhpIiwgc3RyaWN0X2Jhci5zdHIoKSk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoc3RyaWN0X2Jhci5UaGF0KDUsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKK30KKworLy8gVGVzdHMgdGhhdCBTdHJpY3RNb2NrIHdvcmtzIHdpdGggYSBtb2NrIGNsYXNzIHRoYXQgaGFzIGEgMTAtYXJ5CisvLyBub24tZGVmYXVsdCBjb25zdHJ1Y3Rvci4KK1RFU1QoU3RyaWN0TW9ja1Rlc3QsIE5vbkRlZmF1bHRDb25zdHJ1Y3RvcjEwKSB7CisgIFN0cmljdE1vY2s8TW9ja0Jhcj4gc3RyaWN0X2JhcignYScsICdiJywgImMiLCAiZCIsICdlJywgJ2YnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImciLCAiaCIsIHRydWUsIGZhbHNlKTsKKyAgRVhQRUNUX0VRKCJhYmNkZWZnaFRGIiwgc3RyaWN0X2Jhci5zdHIoKSk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoc3RyaWN0X2Jhci5UaGF0KDUsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKK30KKworI2lmICFHVEVTVF9PU19TWU1CSUFOICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gVGVzdHMgdGhhdCBTdHJpY3RNb2NrPE1vY2s+IGNvbXBpbGVzIHdoZXJlIE1vY2sgaXMgYSB1c2VyLWRlZmluZWQKKy8vIGNsYXNzIChhcyBvcHBvc2VkIHRvIDo6dGVzdGluZzo6TW9jaykuICBXZSBoYWQgdG8gd29yayBhcm91bmQgYW4KKy8vIE1TVkMgOC4wIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgc3ltYm9sIE1vY2sgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbiBvZgorLy8gU3RyaWN0TW9jayB0byBiZSBsb29rZWQgdXAgaW4gdGhlIHdyb25nIGNvbnRleHQsIGFuZCB0aGlzIHRlc3QKKy8vIGVuc3VyZXMgdGhhdCBvdXIgZml4IHdvcmtzLgorLy8KKy8vIFdlIGhhdmUgdG8gc2tpcCB0aGlzIHRlc3Qgb24gU3ltYmlhbiBhbmQgV2luZG93cyBNb2JpbGUsIGFzIGl0CisvLyBjYXVzZXMgdGhlIHByb2dyYW0gdG8gY3Jhc2ggdGhlcmUsIGZvciByZWFzb25zIHVuY2xlYXIgdG8gdXMgeWV0LgorVEVTVChTdHJpY3RNb2NrVGVzdCwgQWNjZXB0c0NsYXNzTmFtZWRNb2NrKSB7CisgIFN0cmljdE1vY2s8IDo6TW9jaz4gc3RyaWN0OworICBFWFBFQ1RfQ0FMTChzdHJpY3QsIERvVGhpcygpKTsKKyAgc3RyaWN0LkRvVGhpcygpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTiAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworfSAgLy8gbmFtZXNwYWNlIGdtb2NrX25pY2Vfc3RyaWN0X3Rlc3QKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1wb3J0X3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9jay1wb3J0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhOGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLXBvcnRfdGVzdC5jYwpAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSBpbnRlcm5hbCBjcm9zcy1wbGF0Zm9ybSBzdXBwb3J0IHV0aWxpdGllcy4KKworI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBOT1RFOiBpZiB0aGlzIGZpbGUgaXMgbGVmdCB3aXRob3V0IHRlc3RzIGZvciBzb21lIHJlYXNvbiwgcHV0IGEgZHVtbXkKKy8vIHRlc3QgaGVyZSB0byBtYWtlIHJlZmVyZW5jZXMgdG8gc3ltYm9scyBpbiB0aGUgZ3Rlc3QgbGlicmFyeSBhbmQgYXZvaWQKKy8vICd1bmRlZmluZWQgc3ltYm9sJyBsaW5rZXIgZXJyb3JzIGluIGdtb2NrX21haW46CisKK1RFU1QoRHVtbXlUZXN0LCBEdW1teSkge30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJjMjJmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2stc3BlYy1idWlsZGVyc190ZXN0LmNjCkBAIC0wLDAgKzEsMjY0NCBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgc3BlYyBidWlsZGVyIHN5bnRheC4KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCIKKworI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBIZWxwZXIgY2xhc3MgZm9yIHRlc3RpbmcgdGhlIEV4cGVjdGF0aW9uIGNsYXNzIHRlbXBsYXRlLgorY2xhc3MgRXhwZWN0YXRpb25UZXN0ZXIgeworIHB1YmxpYzoKKyAgLy8gU2V0cyB0aGUgY2FsbCBjb3VudCBvZiB0aGUgZ2l2ZW4gZXhwZWN0YXRpb24gdG8gdGhlIGdpdmVuIG51bWJlci4KKyAgdm9pZCBTZXRDYWxsQ291bnQoaW50IG4sIEV4cGVjdGF0aW9uQmFzZSogZXhwKSB7CisgICAgZXhwLT5jYWxsX2NvdW50XyA9IG47CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworbmFtZXNwYWNlIHsKKwordXNpbmcgdGVzdGluZzo6XzsKK3VzaW5nIHRlc3Rpbmc6OkFueU51bWJlcjsKK3VzaW5nIHRlc3Rpbmc6OkF0TGVhc3Q7Cit1c2luZyB0ZXN0aW5nOjpBdE1vc3Q7Cit1c2luZyB0ZXN0aW5nOjpCZXR3ZWVuOwordXNpbmcgdGVzdGluZzo6Q2FyZGluYWxpdHk7Cit1c2luZyB0ZXN0aW5nOjpDYXJkaW5hbGl0eUludGVyZmFjZTsKK3VzaW5nIHRlc3Rpbmc6OkNvbnRhaW5zUmVnZXg7Cit1c2luZyB0ZXN0aW5nOjpDb25zdDsKK3VzaW5nIHRlc3Rpbmc6OkRvQWxsOwordXNpbmcgdGVzdGluZzo6RG9EZWZhdWx0OwordXNpbmcgdGVzdGluZzo6RXE7Cit1c2luZyB0ZXN0aW5nOjpFeHBlY3RhdGlvbjsKK3VzaW5nIHRlc3Rpbmc6OkV4cGVjdGF0aW9uU2V0OwordXNpbmcgdGVzdGluZzo6R01PQ0tfRkxBRyh2ZXJib3NlKTsKK3VzaW5nIHRlc3Rpbmc6Okd0OwordXNpbmcgdGVzdGluZzo6SW5TZXF1ZW5jZTsKK3VzaW5nIHRlc3Rpbmc6Okludm9rZTsKK3VzaW5nIHRlc3Rpbmc6Okludm9rZVdpdGhvdXRBcmdzOwordXNpbmcgdGVzdGluZzo6SXNOb3RTdWJzdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjpJc1N1YnN0cmluZzsKK3VzaW5nIHRlc3Rpbmc6Okx0OwordXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6Ok1vY2s7Cit1c2luZyB0ZXN0aW5nOjpOYWdneU1vY2s7Cit1c2luZyB0ZXN0aW5nOjpOZTsKK3VzaW5nIHRlc3Rpbmc6OlJldHVybjsKK3VzaW5nIHRlc3Rpbmc6OlNlcXVlbmNlOwordXNpbmcgdGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpFeHBlY3RhdGlvblRlc3RlcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb247Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6a0Vycm9yVmVyYm9zaXR5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtJbmZvVmVyYm9zaXR5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtXYXJuaW5nVmVyYm9zaXR5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmxpbmtlZF9wdHI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nOworCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgordXNpbmcgdGVzdGluZzo6SGFzU3Vic3RyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNhcHR1cmVTdGRvdXQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q2FwdHVyZWRTdGRvdXQ7CisjZW5kaWYKKworY2xhc3MgSW5jb21wbGV0ZTsKKworY2xhc3MgTW9ja0luY29tcGxldGUgeworIHB1YmxpYzoKKyAgLy8gVGhpcyBsaW5lIHZlcmlmaWVzIHRoYXQgYSBtb2NrIG1ldGhvZCBjYW4gdGFrZSBhIGJ5LXJlZmVyZW5jZQorICAvLyBhcmd1bWVudCBvZiBhbiBpbmNvbXBsZXRlIHR5cGUuCisgIE1PQ0tfTUVUSE9EMShCeVJlZkZ1bmMsIHZvaWQoY29uc3QgSW5jb21wbGV0ZSYgeCkpOworfTsKKworLy8gVGVsbHMgR29vZ2xlIE1vY2sgaG93IHRvIHByaW50IGEgdmFsdWUgb2YgdHlwZSBJbmNvbXBsZXRlLgordm9pZCBQcmludFRvKGNvbnN0IEluY29tcGxldGUmIHgsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKK1RFU1QoTW9ja01ldGhvZFRlc3QsIENhbkluc3RhbnRpYXRlV2l0aEluY29tcGxldGVBcmdUeXBlKSB7CisgIC8vIEV2ZW4gdGhvdWdoIHRoaXMgbW9jayBjbGFzcyBjb250YWlucyBhIG1vY2sgbWV0aG9kIHRoYXQgdGFrZXMKKyAgLy8gYnktcmVmZXJlbmNlIGFuIGFyZ3VtZW50IHdob3NlIHR5cGUgaXMgaW5jb21wbGV0ZSwgd2UgY2FuIHN0aWxsCisgIC8vIHVzZSB0aGUgbW9jaywgYXMgbG9uZyBhcyBHb29nbGUgTW9jayBrbm93cyBob3cgdG8gcHJpbnQgdGhlCisgIC8vIGFyZ3VtZW50LgorICBNb2NrSW5jb21wbGV0ZSBpbmNvbXBsZXRlOworICBFWFBFQ1RfQ0FMTChpbmNvbXBsZXRlLCBCeVJlZkZ1bmMoXykpCisgICAgICAuVGltZXMoQW55TnVtYmVyKCkpOworfQorCisvLyBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbnRlciBmb3IgdGhlIGFyZ3VtZW50IHR5cGUgZG9lc24ndCBoYXZlIHRvCisvLyBiZSB2aXNpYmxlIHdoZXJlIHRoZSBtb2NrIGlzIHVzZWQuCit2b2lkIFByaW50VG8oY29uc3QgSW5jb21wbGV0ZSYgLyogeCAqLywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAiaW5jb21wbGV0ZSI7Cit9CisKK2NsYXNzIFJlc3VsdCB7fTsKKworLy8gQSB0eXBlIHRoYXQncyBub3QgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlLgorY2xhc3MgTm9uRGVmYXVsdENvbnN0cnVjdGlibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTm9uRGVmYXVsdENvbnN0cnVjdGlibGUoaW50IC8qIGR1bW15ICovKSB7fQorfTsKKworY2xhc3MgTW9ja0EgeworIHB1YmxpYzoKKyAgTW9ja0EoKSB7fQorCisgIE1PQ0tfTUVUSE9EMShEb0EsIHZvaWQoaW50IG4pKTsKKyAgTU9DS19NRVRIT0QxKFJldHVyblJlc3VsdCwgUmVzdWx0KGludCBuKSk7CisgIE1PQ0tfTUVUSE9EMChSZXR1cm5Ob25EZWZhdWx0Q29uc3RydWN0aWJsZSwgTm9uRGVmYXVsdENvbnN0cnVjdGlibGUoKSk7CisgIE1PQ0tfTUVUSE9EMihCaW5hcnksIGJvb2woaW50IHgsIGludCB5KSk7CisgIE1PQ0tfTUVUSE9EMihSZXR1cm5JbnQsIGludChpbnQgeCwgaW50IHkpKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0EpOworfTsKKworY2xhc3MgTW9ja0IgeworIHB1YmxpYzoKKyAgTW9ja0IoKSB7fQorCisgIE1PQ0tfQ09OU1RfTUVUSE9EMChEb0IsIGludCgpKTsgIC8vIE5PTElOVAorICBNT0NLX01FVEhPRDEoRG9CLCBpbnQoaW50IG4pKTsgIC8vIE5PTElOVAorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrQik7Cit9OworCitjbGFzcyBSZWZlcmVuY2VIb2xkaW5nTW9jayB7CisgcHVibGljOgorICBSZWZlcmVuY2VIb2xkaW5nTW9jaygpIHt9CisKKyAgTU9DS19NRVRIT0QxKEFjY2VwdFJlZmVyZW5jZSwgdm9pZChsaW5rZWRfcHRyPE1vY2tBPiopKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUmVmZXJlbmNlSG9sZGluZ01vY2spOworfTsKKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfQ0FMTCBhbmQgT05fQ0FMTCBjb21waWxlIGluIGEgcHJlc2VuY2Ugb2YgbWFjcm8KKy8vIHJlZGVmaW5pbmcgYSBtb2NrIG1ldGhvZCBuYW1lLiBUaGlzIGNvdWxkIGhhcHBlbiwgZm9yIGV4YW1wbGUsIHdoZW4KKy8vIHRoZSB0ZXN0ZWQgY29kZSAjaW5jbHVkZXMgV2luMzIgQVBJIGhlYWRlcnMgd2hpY2ggZGVmaW5lIG1hbnkgQVBJcworLy8gYXMgbWFjcm9zLCBlLmcuICNkZWZpbmUgVGV4dE91dCBUZXh0T3V0Vy4KKworI2RlZmluZSBNZXRob2QgTWV0aG9kVworCitjbGFzcyBDQyB7CisgcHVibGljOgorICB2aXJ0dWFsIH5DQygpIHt9CisgIHZpcnR1YWwgaW50IE1ldGhvZCgpID0gMDsKK307CitjbGFzcyBNb2NrQ0MgOiBwdWJsaWMgQ0MgeworIHB1YmxpYzoKKyAgTW9ja0NDKCkge30KKworICBNT0NLX01FVEhPRDAoTWV0aG9kLCBpbnQoKSk7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tDQyk7Cit9OworCisvLyBUZXN0cyB0aGF0IGEgbWV0aG9kIHdpdGggZXhwYW5kZWQgbmFtZSBjb21waWxlcy4KK1RFU1QoT25DYWxsU3ludGF4VGVzdCwgQ29tcGlsZXNXaXRoTWV0aG9kTmFtZUV4cGFuZGVkRnJvbU1hY3JvKSB7CisgIE1vY2tDQyBjYzsKKyAgT05fQ0FMTChjYywgTWV0aG9kKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBtZXRob2Qgd2l0aCBleHBhbmRlZCBuYW1lIG5vdCBvbmx5IGNvbXBpbGVzIGJ1dCBydW5zCisvLyBhbmQgcmV0dXJucyBhIGNvcnJlY3QgdmFsdWUsIHRvby4KK1RFU1QoT25DYWxsU3ludGF4VGVzdCwgV29ya3NXaXRoTWV0aG9kTmFtZUV4cGFuZGVkRnJvbU1hY3JvKSB7CisgIE1vY2tDQyBjYzsKKyAgT05fQ0FMTChjYywgTWV0aG9kKCkpLldpbGxCeURlZmF1bHQoUmV0dXJuKDQyKSk7CisgIEVYUEVDVF9FUSg0MiwgY2MuTWV0aG9kKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgbWV0aG9kIHdpdGggZXhwYW5kZWQgbmFtZSBjb21waWxlcy4KK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIENvbXBpbGVzV2l0aE1ldGhvZE5hbWVFeHBhbmRlZEZyb21NYWNybykgeworICBNb2NrQ0MgY2M7CisgIEVYUEVDVF9DQUxMKGNjLCBNZXRob2QoKSk7CisgIGNjLk1ldGhvZCgpOworfQorCisvLyBUZXN0cyB0aGF0IGl0IHdvcmtzLCB0b28uCitURVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBXb3Jrc1dpdGhNZXRob2ROYW1lRXhwYW5kZWRGcm9tTWFjcm8pIHsKKyAgTW9ja0NDIGNjOworICBFWFBFQ1RfQ0FMTChjYywgTWV0aG9kKCkpLldpbGxPbmNlKFJldHVybig0MikpOworICBFWFBFQ1RfRVEoNDIsIGNjLk1ldGhvZCgpKTsKK30KKworI3VuZGVmIE1ldGhvZCAgLy8gRG9uZSB3aXRoIG1hY3JvIHJlZGVmaW5pdGlvbiB0ZXN0cy4KKworLy8gVGVzdHMgdGhhdCBPTl9DQUxMIGV2YWx1YXRlcyBpdHMgYXJndW1lbnRzIGV4YWN0bHkgb25jZSBhcyBwcm9taXNlZAorLy8gYnkgR29vZ2xlIE1vY2suCitURVNUKE9uQ2FsbFN5bnRheFRlc3QsIEV2YWx1YXRlc0ZpcnN0QXJndW1lbnRPbmNlKSB7CisgIE1vY2tBIGE7CisgIE1vY2tBKiBwYSA9ICZhOworCisgIE9OX0NBTEwoKnBhKyssIERvQShfKSk7CisgIEVYUEVDVF9FUSgmYSArIDEsIHBhKTsKK30KKworVEVTVChPbkNhbGxTeW50YXhUZXN0LCBFdmFsdWF0ZXNTZWNvbmRBcmd1bWVudE9uY2UpIHsKKyAgTW9ja0EgYTsKKyAgaW50IG4gPSAwOworCisgIE9OX0NBTEwoYSwgRG9BKG4rKykpOworICBFWFBFQ1RfRVEoMSwgbik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIHN5bnRheCBvZiBPTl9DQUxMKCkgaXMgZW5mb3JjZWQgYXQgcnVuIHRpbWUuCisKK1RFU1QoT25DYWxsU3ludGF4VGVzdCwgV2l0aElzT3B0aW9uYWwpIHsKKyAgTW9ja0EgYTsKKworICBPTl9DQUxMKGEsIERvQSg1KSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKKyAgT05fQ0FMTChhLCBEb0EoXykpCisgICAgICAuV2l0aChfKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworfQorCitURVNUKE9uQ2FsbFN5bnRheFRlc3QsIFdpdGhDYW5BcHBlYXJBdE1vc3RPbmNlKSB7CisgIE1vY2tBIGE7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgT05fQ0FMTChhLCBSZXR1cm5SZXN1bHQoXykpCisgICAgICAgIC5XaXRoKF8pCisgICAgICAgIC5XaXRoKF8pCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihSZXN1bHQoKSkpOworICB9LCAiLldpdGgoKSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIGFuIE9OX0NBTEwoKSIpOworfQorCitURVNUKE9uQ2FsbFN5bnRheFRlc3QsIFdpbGxCeURlZmF1bHRJc01hbmRhdG9yeSkgeworICBNb2NrQSBhOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoeworICAgIE9OX0NBTEwoYSwgRG9BKDUpKTsKKyAgICBhLkRvQSg1KTsKKyAgfSwgIiIpOworfQorCitURVNUKE9uQ2FsbFN5bnRheFRlc3QsIFdpbGxCeURlZmF1bHRDYW5BcHBlYXJBdE1vc3RPbmNlKSB7CisgIE1vY2tBIGE7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgT05fQ0FMTChhLCBEb0EoNSkpCisgICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigpKQorICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIH0sICIuV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZSBpbiBhbiBPTl9DQUxMKCkiKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfQ0FMTCBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UgYXMKKy8vIHByb21pc2VkIGJ5IEdvb2dsZSBNb2NrLgorVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgRXZhbHVhdGVzRmlyc3RBcmd1bWVudE9uY2UpIHsKKyAgTW9ja0EgYTsKKyAgTW9ja0EqIHBhID0gJmE7CisKKyAgRVhQRUNUX0NBTEwoKnBhKyssIERvQShfKSk7CisgIGEuRG9BKDApOworICBFWFBFQ1RfRVEoJmEgKyAxLCBwYSk7Cit9CisKK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIEV2YWx1YXRlc1NlY29uZEFyZ3VtZW50T25jZSkgeworICBNb2NrQSBhOworICBpbnQgbiA9IDA7CisKKyAgRVhQRUNUX0NBTEwoYSwgRG9BKG4rKykpOworICBhLkRvQSgwKTsKKyAgRVhQRUNUX0VRKDEsIG4pOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBzeW50YXggb2YgRVhQRUNUX0NBTEwoKSBpcyBlbmZvcmNlZCBhdCBydW4gdGltZS4KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgV2l0aElzT3B0aW9uYWwpIHsKKyAgTW9ja0EgYTsKKworICBFWFBFQ1RfQ0FMTChhLCBEb0EoNSkpCisgICAgICAuVGltZXMoMCk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSg2KSkKKyAgICAgIC5XaXRoKF8pCisgICAgICAuVGltZXMoMCk7Cit9CisKK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdpdGhDYW5BcHBlYXJBdE1vc3RPbmNlKSB7CisgIE1vY2tBIGE7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDYpKQorICAgICAgICAuV2l0aChfKQorICAgICAgICAuV2l0aChfKTsKKyAgfSwgIi5XaXRoKCkgY2Fubm90IGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiBhbiBFWFBFQ1RfQ0FMTCgpIik7CisKKyAgYS5Eb0EoNik7Cit9CisKK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdpdGhNdXN0QmVGaXJzdENsYXVzZSkgeworICBNb2NrQSBhOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKKyAgICAgICAgLlRpbWVzKDEpCisgICAgICAgIC5XaXRoKF8pOworICB9LCAiLldpdGgoKSBtdXN0IGJlIHRoZSBmaXJzdCBjbGF1c2UgaW4gYW4gRVhQRUNUX0NBTEwoKSIpOworCisgIGEuRG9BKDEpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9DQUxMKGEsIERvQSgyKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigpKQorICAgICAgICAuV2l0aChfKTsKKyAgfSwgIi5XaXRoKCkgbXVzdCBiZSB0aGUgZmlyc3QgY2xhdXNlIGluIGFuIEVYUEVDVF9DQUxMKCkiKTsKKworICBhLkRvQSgyKTsKK30KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgVGltZXNDYW5CZUluZmVycmVkKSB7CisgIE1vY2tBIGE7CisKKyAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQorICAgICAgLldpbGxPbmNlKFJldHVybigpKTsKKworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCkpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCkpOworCisgIGEuRG9BKDEpOworICBhLkRvQSgyKTsKKyAgYS5Eb0EoMik7Cit9CisKK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFRpbWVzQ2FuQXBwZWFyQXRNb3N0T25jZSkgeworICBNb2NrQSBhOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKKyAgICAgICAgLlRpbWVzKDEpCisgICAgICAgIC5UaW1lcygyKTsKKyAgfSwgIi5UaW1lcygpIGNhbm5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYW4gRVhQRUNUX0NBTEwoKSIpOworCisgIGEuRG9BKDEpOworICBhLkRvQSgxKTsKK30KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgVGltZXNNdXN0QmVCZWZvcmVJblNlcXVlbmNlKSB7CisgIE1vY2tBIGE7CisgIFNlcXVlbmNlIHM7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQorICAgICAgICAuSW5TZXF1ZW5jZShzKQorICAgICAgICAuVGltZXMoMSk7CisgIH0sICIuVGltZXMoKSBjYW5ub3QgYXBwZWFyIGFmdGVyICIpOworCisgIGEuRG9BKDEpOworfQorCitURVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBJblNlcXVlbmNlSXNPcHRpb25hbCkgeworICBNb2NrQSBhOworICBTZXF1ZW5jZSBzOworCisgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSgyKSkKKyAgICAgIC5JblNlcXVlbmNlKHMpOworCisgIGEuRG9BKDEpOworICBhLkRvQSgyKTsKK30KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgSW5TZXF1ZW5jZUNhbkFwcGVhck11bHRpcGxlVGltZXMpIHsKKyAgTW9ja0EgYTsKKyAgU2VxdWVuY2UgczEsIHMyOworCisgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKKyAgICAgIC5JblNlcXVlbmNlKHMxLCBzMikKKyAgICAgIC5JblNlcXVlbmNlKHMxKTsKKworICBhLkRvQSgxKTsKK30KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgSW5TZXF1ZW5jZU11c3RCZUJlZm9yZUFmdGVyKSB7CisgIE1vY2tBIGE7CisgIFNlcXVlbmNlIHM7CisKKyAgRXhwZWN0YXRpb24gZSA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKKyAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9DQUxMKGEsIERvQSgyKSkKKyAgICAgICAgLkFmdGVyKGUpCisgICAgICAgIC5JblNlcXVlbmNlKHMpOworICB9LCAiLkluU2VxdWVuY2UoKSBjYW5ub3QgYXBwZWFyIGFmdGVyICIpOworCisgIGEuRG9BKDIpOworfQorCitURVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBJblNlcXVlbmNlTXVzdEJlQmVmb3JlV2lsbE9uY2UpIHsKKyAgTW9ja0EgYTsKKyAgU2VxdWVuY2UgczsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oKSkKKyAgICAgICAgLkluU2VxdWVuY2Uocyk7CisgIH0sICIuSW5TZXF1ZW5jZSgpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgIik7CisKKyAgYS5Eb0EoMSk7Cit9CisKK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIEFmdGVyTXVzdEJlQmVmb3JlV2lsbE9uY2UpIHsKKyAgTW9ja0EgYTsKKworICBFeHBlY3RhdGlvbiBlID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIEVYUEVDVF9DQUxMKGEsIERvQSgyKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigpKQorICAgICAgICAuQWZ0ZXIoZSk7CisgIH0sICIuQWZ0ZXIoKSBjYW5ub3QgYXBwZWFyIGFmdGVyICIpOworCisgIGEuRG9BKDEpOworICBhLkRvQSgyKTsKK30KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgV2lsbElzT3B0aW9uYWwpIHsKKyAgTW9ja0EgYTsKKworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCkpOworCisgIGEuRG9BKDEpOworICBhLkRvQSgyKTsKK30KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgV2lsbENhbkFwcGVhck11bHRpcGxlVGltZXMpIHsKKyAgTW9ja0EgYTsKKworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCisgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCkpOworfQorCitURVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBXaWxsTXVzdEJlQmVmb3JlV2lsbFJlcGVhdGVkbHkpIHsKKyAgTW9ja0EgYTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigpKTsKKyAgfSwgIi5XaWxsT25jZSgpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgIik7CisKKyAgYS5Eb0EoMSk7Cit9CisKK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdpbGxSZXBlYXRlZGx5SXNPcHRpb25hbCkgeworICBNb2NrQSBhOworCisgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oKSk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSgyKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oKSk7CisKKyAgYS5Eb0EoMSk7CisgIGEuRG9BKDIpOworICBhLkRvQSgyKTsKK30KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgV2lsbFJlcGVhdGVkbHlDYW5ub3RBcHBlYXJNdWx0aXBsZVRpbWVzKSB7CisgIE1vY2tBIGE7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQorICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCkpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oKSk7CisgIH0sICIuV2lsbFJlcGVhdGVkbHkoKSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIGFuICIKKyAgICAgIkVYUEVDVF9DQUxMKCkiKTsKK30KKworVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgV2lsbFJlcGVhdGVkbHlNdXN0QmVCZWZvcmVSZXRpcmVzT25TYXR1cmF0aW9uKSB7CisgIE1vY2tBIGE7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oKSk7CisgIH0sICIuV2lsbFJlcGVhdGVkbHkoKSBjYW5ub3QgYXBwZWFyIGFmdGVyICIpOworfQorCitURVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBSZXRpcmVzT25TYXR1cmF0aW9uSXNPcHRpb25hbCkgeworICBNb2NrQSBhOworCisgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKKyAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisKKyAgYS5Eb0EoMSk7CisgIGEuRG9BKDEpOworfQorCitURVNUKEV4cGVjdENhbGxTeW50YXhUZXN0LCBSZXRpcmVzT25TYXR1cmF0aW9uQ2Fubm90QXBwZWFyTXVsdGlwbGVUaW1lcykgeworICBNb2NrQSBhOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKKyAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKQorICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICB9LCAiLlJldGlyZXNPblNhdHVyYXRpb24oKSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlIik7CisKKyAgYS5Eb0EoMSk7Cit9CisKK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIERlZmF1bHRDYXJkaW5hbGl0eUlzT25jZSkgeworICB7CisgICAgTW9ja0EgYTsKKyAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICAgIGEuRG9BKDEpOworICB9CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIE1vY2tBIGE7CisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgfSwgInRvIGJlIGNhbGxlZCBvbmNlIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIE1vY2tBIGE7CisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgICBhLkRvQSgxKTsKKyAgICBhLkRvQSgxKTsKKyAgfSwgInRvIGJlIGNhbGxlZCBvbmNlIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIE1vY2sgZG9lc24ndCBwcmludCBhIHdhcm5pbmcgd2hlbiB0aGUgbnVtYmVyIG9mCisvLyBXaWxsT25jZSgpIGlzIGFkZXF1YXRlLgorVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgRG9lc05vdFdhcm5PbkFkZXF1YXRlQWN0aW9uQ291bnQpIHsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICB7CisgICAgTW9ja0IgYjsKKworICAgIC8vIEl0J3MgYWx3YXlzIGZpbmUgdG8gb21pdCBXaWxsT25jZSgpIGVudGlyZWx5LgorICAgIEVYUEVDVF9DQUxMKGIsIERvQigpKQorICAgICAgICAuVGltZXMoMCk7CisgICAgRVhQRUNUX0NBTEwoYiwgRG9CKDEpKQorICAgICAgICAuVGltZXMoQXRNb3N0KDEpKTsKKyAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoMikpCisgICAgICAgIC5UaW1lcygxKQorICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDEpKTsKKworICAgIC8vIEl0J3MgZmluZSBmb3IgdGhlIG51bWJlciBvZiBXaWxsT25jZSgpcyB0byBlcXVhbCB0aGUgdXBwZXIgYm91bmQuCisgICAgRVhQRUNUX0NBTEwoYiwgRG9CKDMpKQorICAgICAgICAuVGltZXMoQmV0d2VlbigxLCAyKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7CisKKyAgICAvLyBJdCdzIGZpbmUgZm9yIHRoZSBudW1iZXIgb2YgV2lsbE9uY2UoKXMgdG8gYmUgc21hbGxlciB0aGFuIHRoZQorICAgIC8vIHVwcGVyIGJvdW5kIHdoZW4gdGhlcmUgaXMgYSBXaWxsUmVwZWF0ZWRseSgpLgorICAgIEVYUEVDVF9DQUxMKGIsIERvQig0KSkKKyAgICAgICAgLlRpbWVzKEF0TW9zdCgzKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigyKSk7CisKKyAgICAvLyBTYXRpc2ZpZXMgdGhlIGFib3ZlIGV4cGVjdGF0aW9ucy4KKyAgICBiLkRvQigyKTsKKyAgICBiLkRvQigzKTsKKyAgfQorICBFWFBFQ1RfU1RSRVEoIiIsIEdldENhcHR1cmVkU3Rkb3V0KCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIE1vY2sgd2FybnMgb24gaGF2aW5nIHRvbyBtYW55IGFjdGlvbnMgaW4gYW4KKy8vIGV4cGVjdGF0aW9uIGNvbXBhcmVkIHRvIGl0cyBjYXJkaW5hbGl0eS4KK1RFU1QoRXhwZWN0Q2FsbFN5bnRheFRlc3QsIFdhcm5zT25Ub29NYW55QWN0aW9ucykgeworICBDYXB0dXJlU3Rkb3V0KCk7CisgIHsKKyAgICBNb2NrQiBiOworCisgICAgLy8gV2FybnMgd2hlbiB0aGUgbnVtYmVyIG9mIFdpbGxPbmNlKClzIGlzIGxhcmdlciB0aGFuIHRoZSB1cHBlciBib3VuZC4KKyAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgICAgLlRpbWVzKDApCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOyAgLy8gIzEKKyAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgICAgLlRpbWVzKEF0TW9zdCgxKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7ICAvLyAjMgorICAgIEVYUEVDVF9DQUxMKGIsIERvQigxKSkKKyAgICAgICAgLlRpbWVzKDEpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpCisgICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7ICAvLyAjMworCisgICAgLy8gV2FybnMgd2hlbiB0aGUgbnVtYmVyIG9mIFdpbGxPbmNlKClzIGVxdWFscyB0aGUgdXBwZXIgYm91bmQgYW5kCisgICAgLy8gdGhlcmUgaXMgYSBXaWxsUmVwZWF0ZWRseSgpLgorICAgIEVYUEVDVF9DQUxMKGIsIERvQigpKQorICAgICAgICAuVGltZXMoMCkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigxKSk7ICAvLyAjNAorICAgIEVYUEVDVF9DQUxMKGIsIERvQigyKSkKKyAgICAgICAgLlRpbWVzKDEpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMikpOyAgLy8gIzUKKworICAgIC8vIFNhdGlzZmllcyB0aGUgYWJvdmUgZXhwZWN0YXRpb25zLgorICAgIGIuRG9CKDEpOworICAgIGIuRG9CKDIpOworICB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dCA9IEdldENhcHR1cmVkU3Rkb3V0KCk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoCisgICAgICBJc1N1YnN0cmluZywKKyAgICAgICJUb28gbWFueSBhY3Rpb25zIHNwZWNpZmllZCBpbiBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkuLi5cbiIKKyAgICAgICJFeHBlY3RlZCB0byBiZSBuZXZlciBjYWxsZWQsIGJ1dCBoYXMgMSBXaWxsT25jZSgpLiIsCisgICAgICBvdXRwdXQpOyAgLy8gIzEKKyAgRVhQRUNUX1BSRURfRk9STUFUMigKKyAgICAgIElzU3Vic3RyaW5nLAorICAgICAgIlRvbyBtYW55IGFjdGlvbnMgc3BlY2lmaWVkIGluIEVYUEVDVF9DQUxMKGIsIERvQigpKS4uLlxuIgorICAgICAgIkV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UsICIKKyAgICAgICJidXQgaGFzIDIgV2lsbE9uY2UoKXMuIiwKKyAgICAgIG91dHB1dCk7ICAvLyAjMgorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKAorICAgICAgSXNTdWJzdHJpbmcsCisgICAgICAiVG9vIG1hbnkgYWN0aW9ucyBzcGVjaWZpZWQgaW4gRVhQRUNUX0NBTEwoYiwgRG9CKDEpKS4uLlxuIgorICAgICAgIkV4cGVjdGVkIHRvIGJlIGNhbGxlZCBvbmNlLCBidXQgaGFzIDIgV2lsbE9uY2UoKXMuIiwKKyAgICAgIG91dHB1dCk7ICAvLyAjMworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKAorICAgICAgSXNTdWJzdHJpbmcsCisgICAgICAiVG9vIG1hbnkgYWN0aW9ucyBzcGVjaWZpZWQgaW4gRVhQRUNUX0NBTEwoYiwgRG9CKCkpLi4uXG4iCisgICAgICAiRXhwZWN0ZWQgdG8gYmUgbmV2ZXIgY2FsbGVkLCBidXQgaGFzIDAgV2lsbE9uY2UoKXMgIgorICAgICAgImFuZCBhIFdpbGxSZXBlYXRlZGx5KCkuIiwKKyAgICAgIG91dHB1dCk7ICAvLyAjNAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKAorICAgICAgSXNTdWJzdHJpbmcsCisgICAgICAiVG9vIG1hbnkgYWN0aW9ucyBzcGVjaWZpZWQgaW4gRVhQRUNUX0NBTEwoYiwgRG9CKDIpKS4uLlxuIgorICAgICAgIkV4cGVjdGVkIHRvIGJlIGNhbGxlZCBvbmNlLCBidXQgaGFzIDEgV2lsbE9uY2UoKSAiCisgICAgICAiYW5kIGEgV2lsbFJlcGVhdGVkbHkoKS4iLAorICAgICAgb3V0cHV0KTsgIC8vICM1Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIE1vY2sgd2FybnMgb24gaGF2aW5nIHRvbyBmZXcgYWN0aW9ucyBpbiBhbgorLy8gZXhwZWN0YXRpb24gY29tcGFyZWQgdG8gaXRzIGNhcmRpbmFsaXR5LgorVEVTVChFeHBlY3RDYWxsU3ludGF4VGVzdCwgV2FybnNPblRvb0Zld0FjdGlvbnMpIHsKKyAgTW9ja0IgYjsKKworICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgIC5UaW1lcyhCZXR3ZWVuKDIsIDMpKQorICAgICAgLldpbGxPbmNlKFJldHVybigxKSk7CisKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBiLkRvQigpOworICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKAorICAgICAgSXNTdWJzdHJpbmcsCisgICAgICAiVG9vIGZldyBhY3Rpb25zIHNwZWNpZmllZCBpbiBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkuLi5cbiIKKyAgICAgICJFeHBlY3RlZCB0byBiZSBjYWxsZWQgYmV0d2VlbiAyIGFuZCAzIHRpbWVzLCAiCisgICAgICAiYnV0IGhhcyBvbmx5IDEgV2lsbE9uY2UoKS4iLAorICAgICAgb3V0cHV0KTsKKyAgYi5Eb0IoKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIFRlc3RzIHRoZSBzZW1hbnRpY3Mgb2YgT05fQ0FMTCgpLgorCisvLyBUZXN0cyB0aGF0IHRoZSBidWlsdC1pbiBkZWZhdWx0IGFjdGlvbiBpcyB0YWtlbiB3aGVuIG5vIE9OX0NBTEwoKQorLy8gaXMgc3BlY2lmaWVkLgorVEVTVChPbkNhbGxUZXN0LCBUYWtlc0J1aWx0SW5EZWZhdWx0QWN0aW9uV2hlbk5vT25DYWxsKSB7CisgIE1vY2tCIGI7CisgIEVYUEVDVF9DQUxMKGIsIERvQigpKTsKKworICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGJ1aWx0LWluIGRlZmF1bHQgYWN0aW9uIGlzIHRha2VuIHdoZW4gbm8gT05fQ0FMTCgpCisvLyBtYXRjaGVzIHRoZSBpbnZvY2F0aW9uLgorVEVTVChPbkNhbGxUZXN0LCBUYWtlc0J1aWx0SW5EZWZhdWx0QWN0aW9uV2hlbk5vT25DYWxsTWF0Y2hlcykgeworICBNb2NrQiBiOworICBPTl9DQUxMKGIsIERvQigxKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7CisgIEVYUEVDVF9DQUxMKGIsIERvQihfKSk7CisKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDIpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgbGFzdCBtYXRjaGluZyBPTl9DQUxMKCkgYWN0aW9uIGlzIHRha2VuLgorVEVTVChPbkNhbGxUZXN0LCBQaWNrc0xhc3RNYXRjaGluZ09uQ2FsbCkgeworICBNb2NrQiBiOworICBPTl9DQUxMKGIsIERvQihfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigzKSk7CisgIE9OX0NBTEwoYiwgRG9CKDIpKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDIpKTsKKyAgT05fQ0FMTChiLCBEb0IoMSkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoXykpOworCisgIEVYUEVDVF9FUSgyLCBiLkRvQigyKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBzZW1hbnRpY3Mgb2YgRVhQRUNUX0NBTEwoKS4KKworLy8gVGVzdHMgdGhhdCBhbnkgY2FsbCBpcyBhbGxvd2VkIHdoZW4gbm8gRVhQRUNUX0NBTEwoKSBpcyBzcGVjaWZpZWQuCitURVNUKEV4cGVjdENhbGxUZXN0LCBBbGxvd3NBbnlDYWxsV2hlbk5vU3BlYykgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSk7CisgIC8vIFRoZXJlIGlzIG5vIGV4cGVjdGF0aW9uIG9uIERvQihpbnQpLgorCisgIGIuRG9CKCk7CisKKyAgLy8gRG9CKGludCkgY2FuIGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgorICBiLkRvQigxKTsKKyAgYi5Eb0IoMik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGxhc3QgbWF0Y2hpbmcgRVhQRUNUX0NBTEwoKSBmaXJlcy4KK1RFU1QoRXhwZWN0Q2FsbFRlc3QsIFBpY2tzTGFzdE1hdGNoaW5nRXhwZWN0Q2FsbCkgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoXykpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDIpKTsKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKDEpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigxKSk7CisKKyAgRVhQRUNUX0VRKDEsIGIuRG9CKDEpKTsKK30KKworLy8gVGVzdHMgbG93ZXItYm91bmQgdmlvbGF0aW9uLgorVEVTVChFeHBlY3RDYWxsVGVzdCwgQ2F0Y2hlc1Rvb0Zld0NhbGxzKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIE1vY2tCIGI7CisgICAgRVhQRUNUX0NBTEwoYiwgRG9CKDUpKQorICAgICAgICAuVGltZXMoQXRMZWFzdCgyKSk7CisKKyAgICBiLkRvQig1KTsKKyAgfSwgIkFjdHVhbCBmdW5jdGlvbiBjYWxsIGNvdW50IGRvZXNuJ3QgbWF0Y2ggRVhQRUNUX0NBTEwoYiwgRG9CKDUpKS4uLlxuIgorICAgICAiICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBhdCBsZWFzdCB0d2ljZVxuIgorICAgICAiICAgICAgICAgICBBY3R1YWw6IGNhbGxlZCBvbmNlIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZSIpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBjYXJkaW5hbGl0eSBjYW4gYmUgaW5mZXJyZWQgd2hlbiBubyBUaW1lcyguLi4pIGlzCisvLyBzcGVjaWZpZWQuCitURVNUKEV4cGVjdENhbGxUZXN0LCBJbmZlcnNDYXJkaW5hbGl0eVdoZW5UaGVyZUlzTm9XaWxsUmVwZWF0ZWRseSkgeworICB7CisgICAgTW9ja0IgYjsKKyAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7CisKKyAgICBFWFBFQ1RfRVEoMSwgYi5Eb0IoKSk7CisgICAgRVhQRUNUX0VRKDIsIGIuRG9CKCkpOworICB9CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgTW9ja0IgYjsKKyAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7CisKKyAgICBFWFBFQ1RfRVEoMSwgYi5Eb0IoKSk7CisgIH0sICJ0byBiZSBjYWxsZWQgdHdpY2UiKTsKKworICB7ICAvLyBOT0xJTlQKKyAgICBNb2NrQiBiOworICAgIEVYUEVDVF9DQUxMKGIsIERvQigpKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKKworICAgIEVYUEVDVF9FUSgxLCBiLkRvQigpKTsKKyAgICBFWFBFQ1RfRVEoMiwgYi5Eb0IoKSk7CisgICAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYi5Eb0IoKSwgInRvIGJlIGNhbGxlZCB0d2ljZSIpOworICB9Cit9CisKK1RFU1QoRXhwZWN0Q2FsbFRlc3QsIEluZmVyc0NhcmRpbmFsaXR5MVdoZW5UaGVyZUlzV2lsbFJlcGVhdGVkbHkpIHsKKyAgeworICAgIE1vY2tCIGI7CisgICAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMikpOworCisgICAgRVhQRUNUX0VRKDEsIGIuRG9CKCkpOworICB9CisKKyAgeyAgLy8gTk9MSU5UCisgICAgTW9ja0IgYjsKKyAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigyKSk7CisKKyAgICBFWFBFQ1RfRVEoMSwgYi5Eb0IoKSk7CisgICAgRVhQRUNUX0VRKDIsIGIuRG9CKCkpOworICAgIEVYUEVDVF9FUSgyLCBiLkRvQigpKTsKKyAgfQorCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIE1vY2tCIGI7CisgICAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCisgICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMikpOworICB9LCAidG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UiKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgbi10aCBhY3Rpb24gaXMgdGFrZW4gZm9yIHRoZSBuLXRoIG1hdGNoaW5nCisvLyBpbnZvY2F0aW9uLgorVEVTVChFeHBlY3RDYWxsVGVzdCwgTnRoTWF0Y2hUYWtlc050aEFjdGlvbikgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKQorICAgICAgLldpbGxPbmNlKFJldHVybigzKSk7CisKKyAgRVhQRUNUX0VRKDEsIGIuRG9CKCkpOworICBFWFBFQ1RfRVEoMiwgYi5Eb0IoKSk7CisgIEVYUEVDVF9FUSgzLCBiLkRvQigpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgV2lsbFJlcGVhdGVkbHkoKSBhY3Rpb24gaXMgdGFrZW4gd2hlbiB0aGUgV2lsbE9uY2UoLi4uKQorLy8gbGlzdCBpcyBleGhhdXN0ZWQuCitURVNUKEV4cGVjdENhbGxUZXN0LCBUYWtlc1JlcGVhdGVkQWN0aW9uV2hlbldpbGxMaXN0SXNFeGhhdXN0ZWQpIHsKKyAgTW9ja0IgYjsKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKQorICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigyKSk7CisKKyAgRVhQRUNUX0VRKDEsIGIuRG9CKCkpOworICBFWFBFQ1RfRVEoMiwgYi5Eb0IoKSk7CisgIEVYUEVDVF9FUSgyLCBiLkRvQigpKTsKK30KKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gVGVzdHMgdGhhdCB0aGUgZGVmYXVsdCBhY3Rpb24gaXMgdGFrZW4gd2hlbiB0aGUgV2lsbE9uY2UoLi4uKSBsaXN0IGlzCisvLyBleGhhdXN0ZWQgYW5kIHRoZXJlIGlzIG5vIFdpbGxSZXBlYXRlZGx5KCkuCitURVNUKEV4cGVjdENhbGxUZXN0LCBUYWtlc0RlZmF1bHRBY3Rpb25XaGVuV2lsbExpc3RJc0V4aGF1c3RlZCkgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoXykpCisgICAgICAuVGltZXMoMSk7CisgIEVYUEVDVF9DQUxMKGIsIERvQigpKQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKQorICAgICAgLldpbGxPbmNlKFJldHVybigxKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOworCisgIENhcHR1cmVTdGRvdXQoKTsKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsgIC8vIFNob3VsZG4ndCBnZW5lcmF0ZSBhIHdhcm5pbmcgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RhdGlvbiBoYXMgbm8gYWN0aW9uIGNsYXVzZSBhdCBhbGwuCisgIEVYUEVDVF9FUSgxLCBiLkRvQigpKTsKKyAgRVhQRUNUX0VRKDIsIGIuRG9CKCkpOworICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXQxID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBvdXRwdXQxLmNfc3RyKCkpOworCisgIENhcHR1cmVTdGRvdXQoKTsKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOworICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dDIgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOworICBFWFBFQ1RfVEhBVChvdXRwdXQyLmNfc3RyKCksCisgICAgICAgICAgICAgIEhhc1N1YnN0cigiQWN0aW9ucyByYW4gb3V0IGluIEVYUEVDVF9DQUxMKGIsIERvQigpKS4uLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGxlZCAzIHRpbWVzLCBidXQgb25seSAyIFdpbGxPbmNlKClzIGFyZSBzcGVjaWZpZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuIikpOworICBFWFBFQ1RfVEhBVChvdXRwdXQyLmNfc3RyKCksCisgICAgICAgICAgICAgIEhhc1N1YnN0cigiQWN0aW9ucyByYW4gb3V0IGluIEVYUEVDVF9DQUxMKGIsIERvQigpKS4uLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGxlZCA0IHRpbWVzLCBidXQgb25seSAyIFdpbGxPbmNlKClzIGFyZSBzcGVjaWZpZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuIikpOworfQorCitURVNUKEZ1bmN0aW9uTW9ja2VyTWVzc2FnZVRlc3QsIFJlcG9ydHNFeHBlY3RDYWxsTG9jYXRpb25Gb3JFeGhhdXNlZEFjdGlvbnMpIHsKKyAgTW9ja0IgYjsKKyAgc3RkOjpzdHJpbmcgZXhwZWN0X2NhbGxfbG9jYXRpb24gPSBGb3JtYXRGaWxlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fICsgMSk7CisgIEVYUEVDVF9DQUxMKGIsIERvQigpKS5UaW1lcyhBbnlOdW1iZXIoKSkuV2lsbE9uY2UoUmV0dXJuKDEpKTsKKworICBFWFBFQ1RfRVEoMSwgYi5Eb0IoKSk7CisKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dCA9IEdldENhcHR1cmVkU3Rkb3V0KCk7CisgIC8vIFRoZSB3YXJuaW5nIG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gdGhlIGNhbGwgbG9jYXRpb24uCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsIGV4cGVjdF9jYWxsX2xvY2F0aW9uLCBvdXRwdXQpOworfQorCitURVNUKEZ1bmN0aW9uTW9ja2VyTWVzc2FnZVRlc3QsCisgICAgIFJlcG9ydHNEZWZhdWx0QWN0aW9uTG9jYXRpb25PZlVuaW50ZXJlc3RpbmdDYWxsc0Zvck5hZ2d5TW9jaykgeworICBzdGQ6OnN0cmluZyBvbl9jYWxsX2xvY2F0aW9uOworICBDYXB0dXJlU3Rkb3V0KCk7CisgIHsKKyAgICBOYWdneU1vY2s8TW9ja0I+IGI7CisgICAgb25fY2FsbF9sb2NhdGlvbiA9IEZvcm1hdEZpbGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18gKyAxKTsKKyAgICBPTl9DQUxMKGIsIERvQihfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMCkpOworICAgIGIuRG9CKDApOworICB9CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsIG9uX2NhbGxfbG9jYXRpb24sIEdldENhcHR1cmVkU3Rkb3V0KCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gVGVzdHMgdGhhdCBhbiB1bmludGVyZXN0aW5nIGNhbGwgcGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uLgorVEVTVChVbmludGVyZXN0aW5nQ2FsbFRlc3QsIERvZXNEZWZhdWx0QWN0aW9uKSB7CisgIC8vIFdoZW4gdGhlcmUgaXMgYW4gT05fQ0FMTCgpIHN0YXRlbWVudCwgdGhlIGFjdGlvbiBzcGVjaWZpZWQgYnkgaXQKKyAgLy8gc2hvdWxkIGJlIHRha2VuLgorICBNb2NrQSBhOworICBPTl9DQUxMKGEsIEJpbmFyeShfLCBfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7CisgIEVYUEVDVF9UUlVFKGEuQmluYXJ5KDEsIDIpKTsKKworICAvLyBXaGVuIHRoZXJlIGlzIG5vIE9OX0NBTEwoKSwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSByZXR1cm4gdHlwZQorICAvLyBzaG91bGQgYmUgcmV0dXJuZWQuCisgIE1vY2tCIGI7CisgIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbiB1bmV4cGVjdGVkIGNhbGwgcGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uLgorVEVTVChVbmV4cGVjdGVkQ2FsbFRlc3QsIERvZXNEZWZhdWx0QWN0aW9uKSB7CisgIC8vIFdoZW4gdGhlcmUgaXMgYW4gT05fQ0FMTCgpIHN0YXRlbWVudCwgdGhlIGFjdGlvbiBzcGVjaWZpZWQgYnkgaXQKKyAgLy8gc2hvdWxkIGJlIHRha2VuLgorICBNb2NrQSBhOworICBPTl9DQUxMKGEsIEJpbmFyeShfLCBfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7CisgIEVYUEVDVF9DQUxMKGEsIEJpbmFyeSgwLCAwKSk7CisgIGEuQmluYXJ5KDAsIDApOworICBib29sIHJlc3VsdCA9IGZhbHNlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShyZXN1bHQgPSBhLkJpbmFyeSgxLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisKKyAgLy8gV2hlbiB0aGVyZSBpcyBubyBPTl9DQUxMKCksIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcmV0dXJuIHR5cGUKKyAgLy8gc2hvdWxkIGJlIHJldHVybmVkLgorICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoMCkpCisgICAgICAuVGltZXMoMCk7CisgIGludCBuID0gLTE7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKG4gPSBiLkRvQigxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisgIEVYUEVDVF9FUSgwLCBuKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aGVuIGFuIHVuZXhwZWN0ZWQgdm9pZCBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIHJpZ2h0CisvLyBmYWlsdXJlIG1lc3NhZ2UuCitURVNUKFVuZXhwZWN0ZWRDYWxsVGVzdCwgR2VuZXJhdGVzRmFpbHVyZUZvclZvaWRGdW5jdGlvbikgeworICAvLyBGaXJzdCwgdGVzdHMgdGhlIG1lc3NhZ2Ugd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBFWFBFQ1RfQ0FMTCgpLgorICBNb2NrQSBhMTsKKyAgRVhQRUNUX0NBTEwoYTEsIERvQSgxKSk7CisgIGExLkRvQSgxKTsKKyAgLy8gSWRlYWxseSB3ZSBzaG91bGQgbWF0Y2ggdGhlIGZhaWx1cmUgbWVzc2FnZSBhZ2FpbnN0IGEgcmVnZXgsIGJ1dAorICAvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSBkb2Vzbid0IHN1cHBvcnQgdGhhdCwgc28gd2UgdGVzdCBmb3IKKyAgLy8gbXVsdGlwbGUgc3ViLXN0cmluZ3MgaW5zdGVhZC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBhMS5Eb0EoOSksCisgICAgICAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGlyZWN0bHkuXG4iCisgICAgICAiICAgIEZ1bmN0aW9uIGNhbGw6IERvQSg5KVxuIgorICAgICAgIkdvb2dsZSBNb2NrIHRyaWVkIHRoZSBmb2xsb3dpbmcgMSBleHBlY3RhdGlvbiwgYnV0IGl0IGRpZG4ndCBtYXRjaDoiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBhMS5Eb0EoOSksCisgICAgICAiICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDFcbiIKKyAgICAgICIgICAgICAgICAgIEFjdHVhbDogOVxuIgorICAgICAgIiAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZVxuIgorICAgICAgIiAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgb25jZSAtIHNhdHVyYXRlZCBhbmQgYWN0aXZlIik7CisKKyAgLy8gTmV4dCwgdGVzdHMgdGhlIG1lc3NhZ2Ugd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBFWFBFQ1RfQ0FMTCgpLgorICBNb2NrQSBhMjsKKyAgRVhQRUNUX0NBTEwoYTIsIERvQSgxKSk7CisgIEVYUEVDVF9DQUxMKGEyLCBEb0EoMykpOworICBhMi5Eb0EoMSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgYTIuRG9BKDIpLAorICAgICAgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRpcmVjdGx5LlxuIgorICAgICAgIiAgICBGdW5jdGlvbiBjYWxsOiBEb0EoMilcbiIKKyAgICAgICJHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDIgZXhwZWN0YXRpb25zLCBidXQgbm9uZSBtYXRjaGVkOiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIGEyLkRvQSgyKSwKKyAgICAgICJ0cmllZCBleHBlY3RhdGlvbiAjMDogRVhQRUNUX0NBTEwoYTIsIERvQSgxKSkuLi5cbiIKKyAgICAgICIgIEV4cGVjdGVkIGFyZyAjMDogaXMgZXF1YWwgdG8gMVxuIgorICAgICAgIiAgICAgICAgICAgQWN0dWFsOiAyXG4iCisgICAgICAiICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlXG4iCisgICAgICAiICAgICAgICAgICBBY3R1YWw6IGNhbGxlZCBvbmNlIC0gc2F0dXJhdGVkIGFuZCBhY3RpdmUiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBhMi5Eb0EoMiksCisgICAgICAidHJpZWQgZXhwZWN0YXRpb24gIzE6IEVYUEVDVF9DQUxMKGEyLCBEb0EoMykpLi4uXG4iCisgICAgICAiICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDNcbiIKKyAgICAgICIgICAgICAgICAgIEFjdHVhbDogMlxuIgorICAgICAgIiAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZVxuIgorICAgICAgIiAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlIik7CisgIGEyLkRvQSgzKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbiB1bmV4cGVjdGVkIG5vbi12b2lkIGZ1bmN0aW9uIGdlbmVyYXRlcyB0aGUgcmlnaHQKKy8vIGZhaWx1cmUgbWVzc2FnZS4KK1RFU1QoVW5leHBlY3RlZENhbGxUZXN0LCBHZW5lYXJ0ZXNGYWlsdXJlRm9yTm9uVm9pZEZ1bmN0aW9uKSB7CisgIE1vY2tCIGIxOworICBFWFBFQ1RfQ0FMTChiMSwgRG9CKDEpKTsKKyAgYjEuRG9CKDEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIGIxLkRvQigyKSwKKyAgICAgICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLlxuIgorICAgICAgIiAgICBGdW5jdGlvbiBjYWxsOiBEb0IoMilcbiIKKyAgICAgICIgICAgICAgICAgUmV0dXJuczogMFxuIgorICAgICAgIkdvb2dsZSBNb2NrIHRyaWVkIHRoZSBmb2xsb3dpbmcgMSBleHBlY3RhdGlvbiwgYnV0IGl0IGRpZG4ndCBtYXRjaDoiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBiMS5Eb0IoMiksCisgICAgICAiICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDFcbiIKKyAgICAgICIgICAgICAgICAgIEFjdHVhbDogMlxuIgorICAgICAgIiAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZVxuIgorICAgICAgIiAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgb25jZSAtIHNhdHVyYXRlZCBhbmQgYWN0aXZlIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIE1vY2sgZXhwbGFpbnMgdGhhdCBhbiByZXRpcmVkIGV4cGVjdGF0aW9uIGRvZXNuJ3QKKy8vIG1hdGNoIHRoZSBjYWxsLgorVEVTVChVbmV4cGVjdGVkQ2FsbFRlc3QsIFJldGlyZWRFeHBlY3RhdGlvbikgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoMSkpCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworCisgIGIuRG9CKDEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIGIuRG9CKDEpLAorICAgICAgIiAgICAgICAgIEV4cGVjdGVkOiB0aGUgZXhwZWN0YXRpb24gaXMgYWN0aXZlXG4iCisgICAgICAiICAgICAgICAgICBBY3R1YWw6IGl0IGlzIHJldGlyZWQiKTsKK30KKworLy8gVGVzdHMgdGhhdCBHb29nbGUgTW9jayBleHBsYWlucyB0aGF0IGFuIGV4cGVjdGF0aW9uIHRoYXQgZG9lc24ndAorLy8gbWF0Y2ggdGhlIGFyZ3VtZW50cyBkb2Vzbid0IG1hdGNoIHRoZSBjYWxsLgorVEVTVChVbmV4cGVjdGVkQ2FsbFRlc3QsIFVubWF0Y2hlZEFyZ3VtZW50cykgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoMSkpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgYi5Eb0IoMiksCisgICAgICAiICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDFcbiIKKyAgICAgICIgICAgICAgICAgIEFjdHVhbDogMlxuIik7CisgIGIuRG9CKDEpOworfQorCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBNb2NrIGV4cGxhaW5zIHRoYXQgYW4gZXhwZWN0YXRpb24gd2l0aAorLy8gdW5zYXRpc2ZpZWQgcHJlLXJlcXVpc2l0ZXMgZG9lc24ndCBtYXRjaCB0aGUgY2FsbC4KK1RFU1QoVW5leHBlY3RlZENhbGxUZXN0LCBVbnNhdGlzaWZpZWRQcmVyZXF1aXNpdGVzKSB7CisgIFNlcXVlbmNlIHMxLCBzMjsKKyAgTW9ja0IgYjsKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKDEpKQorICAgICAgLkluU2VxdWVuY2UoczEpOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoMikpCisgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCisgICAgICAuSW5TZXF1ZW5jZShzMSk7CisgIEVYUEVDVF9DQUxMKGIsIERvQigzKSkKKyAgICAgIC5JblNlcXVlbmNlKHMyKTsKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKDQpKQorICAgICAgLkluU2VxdWVuY2UoczEsIHMyKTsKKworICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZmFpbHVyZXM7CisgIHsKKyAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKCZmYWlsdXJlcyk7CisgICAgYi5Eb0IoNCk7CisgICAgLy8gTm93ICdmYWlsdXJlcycgY29udGFpbnMgdGhlIEdvb2dsZSBUZXN0IGZhaWx1cmVzIGdlbmVyYXRlZCBieQorICAgIC8vIHRoZSBhYm92ZSBzdGF0ZW1lbnQuCisgIH0KKworICAvLyBUaGVyZSBzaG91bGQgYmUgb25lIG5vbi1mYXRhbCBmYWlsdXJlLgorICBBU1NFUlRfRVEoMSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdCYgciA9IGZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDApOworICBFWFBFQ1RfRVEoOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgci50eXBlKCkpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUgdHdvIHVuc2F0aXNmaWVkCisgIC8vIHByZS1yZXF1aXNpdGVzIGJ1dCBub3QgdGhlIHNhdGlzZmllZCBvbmUuCisjaWYgR1RFU1RfVVNFU19QQ1JFCisgIEVYUEVDVF9USEFUKHIubWVzc2FnZSgpLCBDb250YWluc1JlZ2V4KAorICAgICAgLy8gUENSRSBoYXMgdHJvdWJsZSB1c2luZyAoLnxcbikgdG8gbWF0Y2ggYW55IGNoYXJhY3RlciwgYnV0CisgICAgICAvLyBzdXBwb3J0cyB0aGUgKD9zKSBwcmVmaXggZm9yIHVzaW5nIC4gdG8gbWF0Y2ggYW55IGNoYXJhY3Rlci4KKyAgICAgICIoP3MpdGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcHJlLXJlcXVpc2l0ZXMgYXJlIG5vdCBzYXRpc2ZpZWQ6XG4iCisgICAgICAiLio6IHByZS1yZXF1aXNpdGUgIzBcbiIKKyAgICAgICIuKjogcHJlLXJlcXVpc2l0ZSAjMSIpKTsKKyNlbGlmIEdURVNUX1VTRVNfUE9TSVhfUkUKKyAgRVhQRUNUX1RIQVQoci5tZXNzYWdlKCksIENvbnRhaW5zUmVnZXgoCisgICAgICAvLyBQT1NJWCBSRSBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICg/cykgcHJlZml4LCBidXQgaGFzIG5vIHRyb3VibGUKKyAgICAgIC8vIHdpdGggKC58XG4pLgorICAgICAgInRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzIGFyZSBub3Qgc2F0aXNmaWVkOlxuIgorICAgICAgIigufFxuKSo6IHByZS1yZXF1aXNpdGUgIzBcbiIKKyAgICAgICIoLnxcbikqOiBwcmUtcmVxdWlzaXRlICMxIikpOworI2Vsc2UKKyAgLy8gV2UgY2FuIG9ubHkgdXNlIEdvb2dsZSBUZXN0J3Mgb3duIHNpbXBsZSByZWdleC4KKyAgRVhQRUNUX1RIQVQoci5tZXNzYWdlKCksIENvbnRhaW5zUmVnZXgoCisgICAgICAidGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcHJlLXJlcXVpc2l0ZXMgYXJlIG5vdCBzYXRpc2ZpZWQ6IikpOworICBFWFBFQ1RfVEhBVChyLm1lc3NhZ2UoKSwgQ29udGFpbnNSZWdleCgiOiBwcmUtcmVxdWlzaXRlICMwIikpOworICBFWFBFQ1RfVEhBVChyLm1lc3NhZ2UoKSwgQ29udGFpbnNSZWdleCgiOiBwcmUtcmVxdWlzaXRlICMxIikpOworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BDUkUKKworICBiLkRvQigxKTsKKyAgYi5Eb0IoMyk7CisgIGIuRG9CKDQpOworfQorCitURVNUKFVuZGVmaW5lZFJldHVyblZhbHVlVGVzdCwKKyAgICAgUmV0dXJuVmFsdWVJc01hbmRhdG9yeVdoZW5Ob3REZWZhdWx0Q29uc3RydWN0aWJsZSkgeworICBNb2NrQSBhOworICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogV2Ugc2hvdWxkIHJlYWxseSB2ZXJpZnkgdGhlIG91dHB1dCBtZXNzYWdlLAorICAvLyBidXQgd2UgY2Fubm90IHlldCBkdWUgdG8gdGhhdCBFWFBFQ1RfREVBVEggb25seSBjYXB0dXJlcyBzdGRlcnIKKyAgLy8gd2hpbGUgR29vZ2xlIE1vY2sgbG9ncyB0byBzdGRvdXQuCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgRVhQRUNUX0FOWV9USFJPVyhhLlJldHVybk5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKCkpOworI2Vsc2UKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChhLlJldHVybk5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKCksICIiKTsKKyNlbmRpZgorfQorCisvLyBUZXN0cyB0aGF0IGFuIGV4Y2Vzc2l2ZSBjYWxsIChvbmUgd2hvc2UgYXJndW1lbnRzIG1hdGNoIHRoZQorLy8gbWF0Y2hlcnMgYnV0IGlzIGNhbGxlZCB0b28gbWFueSB0aW1lcykgcGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uLgorVEVTVChFeGNlc3NpdmVDYWxsVGVzdCwgRG9lc0RlZmF1bHRBY3Rpb24pIHsKKyAgLy8gV2hlbiB0aGVyZSBpcyBhbiBPTl9DQUxMKCkgc3RhdGVtZW50LCB0aGUgYWN0aW9uIHNwZWNpZmllZCBieSBpdAorICAvLyBzaG91bGQgYmUgdGFrZW4uCisgIE1vY2tBIGE7CisgIE9OX0NBTEwoYSwgQmluYXJ5KF8sIF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKKyAgRVhQRUNUX0NBTEwoYSwgQmluYXJ5KDAsIDApKTsKKyAgYS5CaW5hcnkoMCwgMCk7CisgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHJlc3VsdCA9IGEuQmluYXJ5KDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9jayBmdW5jdGlvbiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIGV4cGVjdGVkIik7CisgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisKKyAgLy8gV2hlbiB0aGVyZSBpcyBubyBPTl9DQUxMKCksIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcmV0dXJuIHR5cGUKKyAgLy8gc2hvdWxkIGJlIHJldHVybmVkLgorICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoMCkpCisgICAgICAuVGltZXMoMCk7CisgIGludCBuID0gLTE7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKG4gPSBiLkRvQigwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCIpOworICBFWFBFQ1RfRVEoMCwgbik7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBhIHZvaWQgZnVuY3Rpb24gaXMgY2FsbGVkIHRvbyBtYW55IHRpbWVzLAorLy8gdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUgYXJndW1lbnQgdmFsdWVzLgorVEVTVChFeGNlc3NpdmVDYWxsVGVzdCwgR2VuZXJhdGVzRmFpbHVyZUZvclZvaWRGdW5jdGlvbikgeworICBNb2NrQSBhOworICBFWFBFQ1RfQ0FMTChhLCBEb0EoXykpCisgICAgICAuVGltZXMoMCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgYS5Eb0EoOSksCisgICAgICAiTW9jayBmdW5jdGlvbiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIGV4cGVjdGVkIC0gcmV0dXJuaW5nIGRpcmVjdGx5LlxuIgorICAgICAgIiAgICBGdW5jdGlvbiBjYWxsOiBEb0EoOSlcbiIKKyAgICAgICIgICAgICAgICBFeHBlY3RlZDogdG8gYmUgbmV2ZXIgY2FsbGVkXG4iCisgICAgICAiICAgICAgICAgICBBY3R1YWw6IGNhbGxlZCBvbmNlIC0gb3Zlci1zYXR1cmF0ZWQgYW5kIGFjdGl2ZSIpOworfQorCisvLyBUZXN0cyB0aGF0IHdoZW4gYSBub24tdm9pZCBmdW5jdGlvbiBpcyBjYWxsZWQgdG9vIG1hbnkgdGltZXMsIHRoZQorLy8gZmFpbHVyZSBtZXNzYWdlIGNvbnRhaW5zIHRoZSBhcmd1bWVudCB2YWx1ZXMgYW5kIHRoZSByZXR1cm4gdmFsdWUuCitURVNUKEV4Y2Vzc2l2ZUNhbGxUZXN0LCBHZW5lcmF0ZXNGYWlsdXJlRm9yTm9uVm9pZEZ1bmN0aW9uKSB7CisgIE1vY2tCIGI7CisgIEVYUEVDVF9DQUxMKGIsIERvQihfKSk7CisgIGIuRG9CKDEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIGIuRG9CKDIpLAorICAgICAgIk1vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCAtICIKKyAgICAgICJyZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS5cbiIKKyAgICAgICIgICAgRnVuY3Rpb24gY2FsbDogRG9CKDIpXG4iCisgICAgICAiICAgICAgICAgIFJldHVybnM6IDBcbiIKKyAgICAgICIgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2VcbiIKKyAgICAgICIgICAgICAgICAgIEFjdHVhbDogY2FsbGVkIHR3aWNlIC0gb3Zlci1zYXR1cmF0ZWQgYW5kIGFjdGl2ZSIpOworfQorCisvLyBUZXN0cyB1c2luZyBzZXF1ZW5jZXMuCisKK1RFU1QoSW5TZXF1ZW5jZVRlc3QsIEFsbEV4cGVjdGF0aW9uSW5TY29wZUFyZUluU2VxdWVuY2UpIHsKKyAgTW9ja0EgYTsKKyAgeworICAgIEluU2VxdWVuY2UgZHVtbXk7CisKKyAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICAgIEVYUEVDVF9DQUxMKGEsIERvQSgyKSk7CisgIH0KKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBhLkRvQSgyKTsKKyAgfSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisKKyAgYS5Eb0EoMSk7CisgIGEuRG9BKDIpOworfQorCitURVNUKEluU2VxdWVuY2VUZXN0LCBOZXN0ZWRJblNlcXVlbmNlKSB7CisgIE1vY2tBIGE7CisgIHsKKyAgICBJblNlcXVlbmNlIGR1bW15OworCisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgICB7CisgICAgICBJblNlcXVlbmNlIGR1bW15MjsKKworICAgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDIpKTsKKyAgICAgIEVYUEVDVF9DQUxMKGEsIERvQSgzKSk7CisgICAgfQorICB9CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgYS5Eb0EoMSk7CisgICAgYS5Eb0EoMyk7CisgIH0sICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworCisgIGEuRG9BKDIpOworICBhLkRvQSgzKTsKK30KKworVEVTVChJblNlcXVlbmNlVGVzdCwgRXhwZWN0YXRpb25zT3V0T2ZTY29wZUFyZU5vdEFmZmVjdGVkKSB7CisgIE1vY2tBIGE7CisgIHsKKyAgICBJblNlcXVlbmNlIGR1bW15OworCisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOworICB9CisgIEVYUEVDVF9DQUxMKGEsIERvQSgzKSk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgYS5Eb0EoMik7CisgIH0sICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworCisgIGEuRG9BKDMpOworICBhLkRvQSgxKTsKKyAgYS5Eb0EoMik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYW55IG9yZGVyIGlzIGFsbG93ZWQgd2hlbiBubyBzZXF1ZW5jZSBpcyB1c2VkLgorVEVTVChTZXF1ZW5jZVRlc3QsIEFueU9yZGVySXNPa0J5RGVmYXVsdCkgeworICB7CisgICAgTW9ja0EgYTsKKyAgICBNb2NrQiBiOworCisgICAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKKworICAgIGEuRG9BKDEpOworICAgIGIuRG9CKCk7CisgIH0KKworICB7ICAvLyBOT0xJTlQKKyAgICBNb2NrQSBhOworICAgIE1vY2tCIGI7CisKKyAgICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICAgIEVYUEVDVF9DQUxMKGIsIERvQigpKQorICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpOworCisgICAgYi5Eb0IoKTsKKyAgICBhLkRvQSgxKTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGF0IHRoZSBjYWxscyBtdXN0IGJlIGluIHN0cmljdCBvcmRlciB3aGVuIGEgY29tcGxldGUgb3JkZXIKKy8vIGlzIHNwZWNpZmllZC4KK1RFU1QoU2VxdWVuY2VUZXN0LCBDYWxsc011c3RCZUluU3RyaWN0T3JkZXJXaGVuU2FpZFNvMSkgeworICBNb2NrQSBhOworICBPTl9DQUxMKGEsIFJldHVyblJlc3VsdChfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihSZXN1bHQoKSkpOworCisgIFNlcXVlbmNlIHM7CisgIEVYUEVDVF9DQUxMKGEsIFJldHVyblJlc3VsdCgxKSkKKyAgICAgIC5JblNlcXVlbmNlKHMpOworICBFWFBFQ1RfQ0FMTChhLCBSZXR1cm5SZXN1bHQoMikpCisgICAgICAuSW5TZXF1ZW5jZShzKTsKKyAgRVhQRUNUX0NBTEwoYSwgUmV0dXJuUmVzdWx0KDMpKQorICAgICAgLkluU2VxdWVuY2Uocyk7CisKKyAgYS5SZXR1cm5SZXN1bHQoMSk7CisKKyAgLy8gTWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEuUmV0dXJuUmVzdWx0KDIpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhLlJldHVyblJlc3VsdCgzKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisKKyAgYS5SZXR1cm5SZXN1bHQoMik7CisgIGEuUmV0dXJuUmVzdWx0KDMpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBjYWxscyBtdXN0IGJlIGluIHN0cmljdCBvcmRlciB3aGVuIGEgY29tcGxldGUgb3JkZXIKKy8vIGlzIHNwZWNpZmllZC4KK1RFU1QoU2VxdWVuY2VUZXN0LCBDYWxsc011c3RCZUluU3RyaWN0T3JkZXJXaGVuU2FpZFNvMikgeworICBNb2NrQSBhOworICBPTl9DQUxMKGEsIFJldHVyblJlc3VsdChfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihSZXN1bHQoKSkpOworCisgIFNlcXVlbmNlIHM7CisgIEVYUEVDVF9DQUxMKGEsIFJldHVyblJlc3VsdCgxKSkKKyAgICAgIC5JblNlcXVlbmNlKHMpOworICBFWFBFQ1RfQ0FMTChhLCBSZXR1cm5SZXN1bHQoMikpCisgICAgICAuSW5TZXF1ZW5jZShzKTsKKworICAvLyBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYS5SZXR1cm5SZXN1bHQoMSkuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKGEuUmV0dXJuUmVzdWx0KDIpLCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKKworICBhLlJldHVyblJlc3VsdCgxKTsKKyAgYS5SZXR1cm5SZXN1bHQoMik7Cit9CisKKy8vIFRlc3RzIHNwZWNpZnlpbmcgYSBEQUcgdXNpbmcgbXVsdGlwbGUgc2VxdWVuY2VzLgorY2xhc3MgUGFydGlhbE9yZGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFBhcnRpYWxPcmRlclRlc3QoKSB7CisgICAgT05fQ0FMTChhXywgUmV0dXJuUmVzdWx0KF8pKQorICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oUmVzdWx0KCkpKTsKKworICAgIC8vIFNwZWNpZmllcyB0aGlzIHBhcnRpYWwgb3JkZXJpbmc6CisgICAgLy8KKyAgICAvLyBhLlJldHVyblJlc3VsdCgxKSA9PT4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYS5SZXR1cm5SZXN1bHQoMikgKiBuICA9PT4gIGEuUmV0dXJuUmVzdWx0KDMpCisgICAgLy8gYi5Eb0IoKSAqIDIgICAgICAgPT0+CisgICAgU2VxdWVuY2UgeCwgeTsKKyAgICBFWFBFQ1RfQ0FMTChhXywgUmV0dXJuUmVzdWx0KDEpKQorICAgICAgICAuSW5TZXF1ZW5jZSh4KTsKKyAgICBFWFBFQ1RfQ0FMTChiXywgRG9CKCkpCisgICAgICAgIC5UaW1lcygyKQorICAgICAgICAuSW5TZXF1ZW5jZSh5KTsKKyAgICBFWFBFQ1RfQ0FMTChhXywgUmV0dXJuUmVzdWx0KDIpKQorICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCisgICAgICAgIC5JblNlcXVlbmNlKHgsIHkpOworICAgIEVYUEVDVF9DQUxMKGFfLCBSZXR1cm5SZXN1bHQoMykpCisgICAgICAgIC5JblNlcXVlbmNlKHgpOworICB9CisKKyAgTW9ja0EgYV87CisgIE1vY2tCIGJfOworfTsKKworVEVTVF9GKFBhcnRpYWxPcmRlclRlc3QsIENhbGxzTXVzdENvbmZvcm1Ub1NwZWNpZmllZERhZzEpIHsKKyAgYV8uUmV0dXJuUmVzdWx0KDEpOworICBiXy5Eb0IoKTsKKworICAvLyBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHNlY29uZCBEb0IoKS4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYV8uUmV0dXJuUmVzdWx0KDIpLCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKKworICBiXy5Eb0IoKTsKKyAgYV8uUmV0dXJuUmVzdWx0KDMpOworfQorCitURVNUX0YoUGFydGlhbE9yZGVyVGVzdCwgQ2FsbHNNdXN0Q29uZm9ybVRvU3BlY2lmaWVkRGFnMikgeworICAvLyBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgUmV0dXJuUmVzdWx0KDEpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhXy5SZXR1cm5SZXN1bHQoMiksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworCisgIGFfLlJldHVyblJlc3VsdCgxKTsKKyAgYl8uRG9CKCk7CisgIGJfLkRvQigpOworICBhXy5SZXR1cm5SZXN1bHQoMyk7Cit9CisKK1RFU1RfRihQYXJ0aWFsT3JkZXJUZXN0LCBDYWxsc011c3RDb25mb3JtVG9TcGVjaWZpZWREYWczKSB7CisgIC8vIE1heSBvbmx5IGJlIGNhbGxlZCBsYXN0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhXy5SZXR1cm5SZXN1bHQoMyksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworCisgIGFfLlJldHVyblJlc3VsdCgxKTsKKyAgYl8uRG9CKCk7CisgIGJfLkRvQigpOworICBhXy5SZXR1cm5SZXN1bHQoMyk7Cit9CisKK1RFU1RfRihQYXJ0aWFsT3JkZXJUZXN0LCBDYWxsc011c3RDb25mb3JtVG9TcGVjaWZpZWREYWc0KSB7CisgIGFfLlJldHVyblJlc3VsdCgxKTsKKyAgYl8uRG9CKCk7CisgIGJfLkRvQigpOworICBhXy5SZXR1cm5SZXN1bHQoMyk7CisKKyAgLy8gTWF5IG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBSZXR1cm5SZXN1bHQoMykuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKGFfLlJldHVyblJlc3VsdCgyKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7Cit9CisKK1RFU1QoU2VxdWVuY2VUZXN0LCBSZXRpcmVtZW50KSB7CisgIE1vY2tBIGE7CisgIFNlcXVlbmNlIHM7CisKKyAgRVhQRUNUX0NBTEwoYSwgRG9BKDEpKQorICAgICAgLkluU2VxdWVuY2Uocyk7CisgIEVYUEVDVF9DQUxMKGEsIERvQShfKSkKKyAgICAgIC5JblNlcXVlbmNlKHMpCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpCisgICAgICAuSW5TZXF1ZW5jZShzKTsKKworICBhLkRvQSgxKTsKKyAgYS5Eb0EoMik7CisgIGEuRG9BKDEpOworfQorCisvLyBUZXN0cyBFeHBlY3RhdGlvbi4KKworVEVTVChFeHBlY3RhdGlvblRlc3QsIENvbnN0cnV0b3JzV29yaykgeworICBNb2NrQSBhOworICBFeHBlY3RhdGlvbiBlMTsgIC8vIERlZmF1bHQgY3Rvci4KKworICAvLyBDdG9yIGZyb20gdmFyaW91cyBmb3JtcyBvZiBFWFBFQ1RfQ0FMTC4KKyAgRXhwZWN0YXRpb24gZTIgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOworICBFeHBlY3RhdGlvbiBlMyA9IEVYUEVDVF9DQUxMKGEsIERvQSgzKSkuV2l0aChfKTsKKyAgeworICAgIFNlcXVlbmNlIHM7CisgICAgRXhwZWN0YXRpb24gZTQgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoNCkpLlRpbWVzKDEpOworICAgIEV4cGVjdGF0aW9uIGU1ID0gRVhQRUNUX0NBTEwoYSwgRG9BKDUpKS5JblNlcXVlbmNlKHMpOworICB9CisgIEV4cGVjdGF0aW9uIGU2ID0gRVhQRUNUX0NBTEwoYSwgRG9BKDYpKS5BZnRlcihlMik7CisgIEV4cGVjdGF0aW9uIGU3ID0gRVhQRUNUX0NBTEwoYSwgRG9BKDcpKS5XaWxsT25jZShSZXR1cm4oKSk7CisgIEV4cGVjdGF0aW9uIGU4ID0gRVhQRUNUX0NBTEwoYSwgRG9BKDgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oKSk7CisgIEV4cGVjdGF0aW9uIGU5ID0gRVhQRUNUX0NBTEwoYSwgRG9BKDkpKS5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisKKyAgRXhwZWN0YXRpb24gZTEwID0gZTI7ICAvLyBDb3B5IGN0b3IuCisKKyAgRVhQRUNUX1RIQVQoZTEsIE5lKGUyKSk7CisgIEVYUEVDVF9USEFUKGUyLCBFcShlMTApKTsKKworICBhLkRvQSgyKTsKKyAgYS5Eb0EoMyk7CisgIGEuRG9BKDQpOworICBhLkRvQSg1KTsKKyAgYS5Eb0EoNik7CisgIGEuRG9BKDcpOworICBhLkRvQSg4KTsKKyAgYS5Eb0EoOSk7Cit9CisKK1RFU1QoRXhwZWN0YXRpb25UZXN0LCBBc3NpZ25tZW50V29ya3MpIHsKKyAgTW9ja0EgYTsKKyAgRXhwZWN0YXRpb24gZTE7CisgIEV4cGVjdGF0aW9uIGUyID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKworICBFWFBFQ1RfVEhBVChlMSwgTmUoZTIpKTsKKworICBlMSA9IGUyOworICBFWFBFQ1RfVEhBVChlMSwgRXEoZTIpKTsKKworICBhLkRvQSgxKTsKK30KKworLy8gVGVzdHMgRXhwZWN0YXRpb25TZXQuCisKK1RFU1QoRXhwZWN0YXRpb25TZXRUZXN0LCBNZW1iZXJUeXBlc0FyZUNvcnJlY3QpIHsKKyAgOjp0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8RXhwZWN0YXRpb24sIEV4cGVjdGF0aW9uU2V0Ojp2YWx1ZV90eXBlPigpOworfQorCitURVNUKEV4cGVjdGF0aW9uU2V0VGVzdCwgQ29uc3RydWN0b3JzV29yaykgeworICBNb2NrQSBhOworCisgIEV4cGVjdGF0aW9uIGUxOworICBjb25zdCBFeHBlY3RhdGlvbiBlMjsKKyAgRXhwZWN0YXRpb25TZXQgZXMxOyAgLy8gRGVmYXVsdCBjdG9yLgorICBFeHBlY3RhdGlvblNldCBlczIgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOyAgLy8gQ3RvciBmcm9tIEVYUEVDVF9DQUxMLgorICBFeHBlY3RhdGlvblNldCBlczMgPSBlMTsgIC8vIEN0b3IgZnJvbSBFeHBlY3RhdGlvbi4KKyAgRXhwZWN0YXRpb25TZXQgZXM0KGUxKTsgICAvLyBDdG9yIGZyb20gRXhwZWN0YXRpb247IGFsdGVybmF0aXZlIHN5bnRheC4KKyAgRXhwZWN0YXRpb25TZXQgZXM1ID0gZTI7ICAvLyBDdG9yIGZyb20gY29uc3QgRXhwZWN0YXRpb24uCisgIEV4cGVjdGF0aW9uU2V0IGVzNihlMik7ICAgLy8gQ3RvciBmcm9tIGNvbnN0IEV4cGVjdGF0aW9uOyBhbHRlcm5hdGl2ZSBzeW50YXguCisgIEV4cGVjdGF0aW9uU2V0IGVzNyA9IGVzMjsgIC8vIENvcHkgY3Rvci4KKworICBFWFBFQ1RfRVEoMCwgZXMxLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBlczIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIGVzMy5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZXM0LnNpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBlczUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIGVzNi5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZXM3LnNpemUoKSk7CisKKyAgRVhQRUNUX1RIQVQoZXMzLCBOZShlczIpKTsKKyAgRVhQRUNUX1RIQVQoZXM0LCBFcShlczMpKTsKKyAgRVhQRUNUX1RIQVQoZXM1LCBFcShlczQpKTsKKyAgRVhQRUNUX1RIQVQoZXM2LCBFcShlczUpKTsKKyAgRVhQRUNUX1RIQVQoZXM3LCBFcShlczIpKTsKKyAgYS5Eb0EoMSk7Cit9CisKK1RFU1QoRXhwZWN0YXRpb25TZXRUZXN0LCBBc3NpZ25tZW50V29ya3MpIHsKKyAgRXhwZWN0YXRpb25TZXQgZXMxOworICBFeHBlY3RhdGlvblNldCBlczIgPSBFeHBlY3RhdGlvbigpOworCisgIGVzMSA9IGVzMjsKKyAgRVhQRUNUX0VRKDEsIGVzMS5zaXplKCkpOworICBFWFBFQ1RfVEhBVCgqKGVzMS5iZWdpbigpKSwgRXEoRXhwZWN0YXRpb24oKSkpOworICBFWFBFQ1RfVEhBVChlczEsIEVxKGVzMikpOworfQorCitURVNUKEV4cGVjdGF0aW9uU2V0VGVzdCwgSW5zZXJ0aW9uV29ya3MpIHsKKyAgRXhwZWN0YXRpb25TZXQgZXMxOworICBFeHBlY3RhdGlvbiBlMTsKKyAgZXMxICs9IGUxOworICBFWFBFQ1RfRVEoMSwgZXMxLnNpemUoKSk7CisgIEVYUEVDVF9USEFUKCooZXMxLmJlZ2luKCkpLCBFcShlMSkpOworCisgIE1vY2tBIGE7CisgIEV4cGVjdGF0aW9uIGUyID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgZXMxICs9IGUyOworICBFWFBFQ1RfRVEoMiwgZXMxLnNpemUoKSk7CisKKyAgRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0MSA9IGVzMS5iZWdpbigpOworICBFeHBlY3RhdGlvblNldDo6Y29uc3RfaXRlcmF0b3IgaXQyID0gaXQxOworICArK2l0MjsKKyAgRVhQRUNUX1RSVUUoKml0MSA9PSBlMSB8fCAqaXQyID09IGUxKTsgIC8vIGUxIG11c3QgYmUgaW4gdGhlIHNldC4KKyAgRVhQRUNUX1RSVUUoKml0MSA9PSBlMiB8fCAqaXQyID09IGUyKTsgIC8vIGUyIG11c3QgYmUgaW4gdGhlIHNldCB0b28uCisgIGEuRG9BKDEpOworfQorCitURVNUKEV4cGVjdGF0aW9uU2V0VGVzdCwgU2l6ZVdvcmtzKSB7CisgIEV4cGVjdGF0aW9uU2V0IGVzOworICBFWFBFQ1RfRVEoMCwgZXMuc2l6ZSgpKTsKKworICBlcyArPSBFeHBlY3RhdGlvbigpOworICBFWFBFQ1RfRVEoMSwgZXMuc2l6ZSgpKTsKKworICBNb2NrQSBhOworICBlcyArPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICBFWFBFQ1RfRVEoMiwgZXMuc2l6ZSgpKTsKKworICBhLkRvQSgxKTsKK30KKworVEVTVChFeHBlY3RhdGlvblNldFRlc3QsIElzRW51bWVyYWJsZSkgeworICBFeHBlY3RhdGlvblNldCBlczsKKyAgRVhQRUNUX1RSVUUoZXMuYmVnaW4oKSA9PSBlcy5lbmQoKSk7CisKKyAgZXMgKz0gRXhwZWN0YXRpb24oKTsKKyAgRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZXMuYmVnaW4oKTsKKyAgRVhQRUNUX1RSVUUoaXQgIT0gZXMuZW5kKCkpOworICBFWFBFQ1RfVEhBVCgqaXQsIEVxKEV4cGVjdGF0aW9uKCkpKTsKKyAgKytpdDsKKyAgRVhQRUNUX1RSVUUoaXQ9PSBlcy5lbmQoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSAuQWZ0ZXIoKSBjbGF1c2UuCisKK1RFU1QoQWZ0ZXJUZXN0LCBTdWNjZWVkc1doZW5QYXJ0aWFsT3JkZXJJc1NhdGlzZmllZCkgeworICBNb2NrQSBhOworICBFeHBlY3RhdGlvblNldCBlczsKKyAgZXMgKz0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgZXMgKz0gRVhQRUNUX0NBTEwoYSwgRG9BKDIpKTsKKyAgRVhQRUNUX0NBTEwoYSwgRG9BKDMpKQorICAgICAgLkFmdGVyKGVzKTsKKworICBhLkRvQSgxKTsKKyAgYS5Eb0EoMik7CisgIGEuRG9BKDMpOworfQorCitURVNUKEFmdGVyVGVzdCwgU3VjY2VlZHNXaGVuVG90YWxPcmRlcklzU2F0aXNmaWVkKSB7CisgIE1vY2tBIGE7CisgIE1vY2tCIGI7CisgIC8vIFRoZSBmb2xsb3dpbmcgYWxzbyB2ZXJpZmllcyB0aGF0IGNvbnN0IEV4cGVjdGF0aW9uIG9iamVjdHMgd29yaworICAvLyB0b28uICBEbyBub3QgcmVtb3ZlIHRoZSBjb25zdCBtb2RpZmllcnMuCisgIGNvbnN0IEV4cGVjdGF0aW9uIGUxID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgY29uc3QgRXhwZWN0YXRpb24gZTIgPSBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgIC5UaW1lcygyKQorICAgICAgLkFmdGVyKGUxKTsKKyAgRVhQRUNUX0NBTEwoYSwgRG9BKDIpKS5BZnRlcihlMik7CisKKyAgYS5Eb0EoMSk7CisgIGIuRG9CKCk7CisgIGIuRG9CKCk7CisgIGEuRG9BKDIpOworfQorCisvLyBDYWxscyBtdXN0IGJlIGluIHN0cmljdCBvcmRlciB3aGVuIHNwZWNpZmllZCBzbyB1c2luZyAuQWZ0ZXIoKS4KK1RFU1QoQWZ0ZXJUZXN0LCBDYWxsc011c3RCZUluU3RyaWN0T3JkZXJXaGVuU3BlY2lmaWVkU28xKSB7CisgIE1vY2tBIGE7CisgIE1vY2tCIGI7CisKKyAgLy8gRGVmaW5lIG9yZGVyaW5nOgorICAvLyAgIGEuRG9BKDEpID09PiBiLkRvQigpID09PiBhLkRvQSgyKQorICBFeHBlY3RhdGlvbiBlMSA9IEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7CisgIEV4cGVjdGF0aW9uIGUyID0gRVhQRUNUX0NBTEwoYiwgRG9CKCkpCisgICAgICAuQWZ0ZXIoZTEpOworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCisgICAgICAuQWZ0ZXIoZTIpOworCisgIGEuRG9BKDEpOworCisgIC8vIE1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciBEb0IoKS4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS5Eb0EoMiksICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworCisgIGIuRG9CKCk7CisgIGEuRG9BKDIpOworfQorCisvLyBDYWxscyBtdXN0IGJlIGluIHN0cmljdCBvcmRlciB3aGVuIHNwZWNpZmllZCBzbyB1c2luZyAuQWZ0ZXIoKS4KK1RFU1QoQWZ0ZXJUZXN0LCBDYWxsc011c3RCZUluU3RyaWN0T3JkZXJXaGVuU3BlY2lmaWVkU28yKSB7CisgIE1vY2tBIGE7CisgIE1vY2tCIGI7CisKKyAgLy8gRGVmaW5lIG9yZGVyaW5nOgorICAvLyAgIGEuRG9BKDEpID09PiBiLkRvQigpICogMiA9PT4gYS5Eb0EoMikKKyAgRXhwZWN0YXRpb24gZTEgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICBFeHBlY3RhdGlvbiBlMiA9IEVYUEVDVF9DQUxMKGIsIERvQigpKQorICAgICAgLlRpbWVzKDIpCisgICAgICAuQWZ0ZXIoZTEpOworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpCisgICAgICAuQWZ0ZXIoZTIpOworCisgIGEuRG9BKDEpOworICBiLkRvQigpOworCisgIC8vIE1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUgc2Vjb25kIERvQigpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhLkRvQSgyKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisKKyAgYi5Eb0IoKTsKKyAgYS5Eb0EoMik7Cit9CisKKy8vIENhbGxzIG11c3Qgc2F0aXNmeSB0aGUgcGFydGlhbCBvcmRlciB3aGVuIHNwZWNpZmllZCBzby4KK1RFU1QoQWZ0ZXJUZXN0LCBDYWxsc011c3RTYXRpc2Z5UGFydGlhbE9yZGVyV2hlblNwZWNpZmllZFNvKSB7CisgIE1vY2tBIGE7CisgIE9OX0NBTEwoYSwgUmV0dXJuUmVzdWx0KF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKFJlc3VsdCgpKSk7CisKKyAgLy8gRGVmaW5lIG9yZGVyaW5nOgorICAvLyAgIGEuRG9BKDEpID09PgorICAvLyAgIGEuRG9BKDIpID09PiBhLlJldHVyblJlc3VsdCgzKQorICBFeHBlY3RhdGlvbiBlID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgY29uc3QgRXhwZWN0YXRpb25TZXQgZXMgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOworICBFWFBFQ1RfQ0FMTChhLCBSZXR1cm5SZXN1bHQoMykpCisgICAgICAuQWZ0ZXIoZSwgZXMpOworCisgIC8vIE1heSBvbmx5IGJlIGNhbGxlZCBsYXN0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhLlJldHVyblJlc3VsdCgzKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisKKyAgYS5Eb0EoMik7CisgIGEuRG9BKDEpOworICBhLlJldHVyblJlc3VsdCgzKTsKK30KKworLy8gQ2FsbHMgbXVzdCBzYXRpc2Z5IHRoZSBwYXJ0aWFsIG9yZGVyIHdoZW4gc3BlY2lmaWVkIHNvLgorVEVTVChBZnRlclRlc3QsIENhbGxzTXVzdFNhdGlzZnlQYXJ0aWFsT3JkZXJXaGVuU3BlY2lmaWVkU28yKSB7CisgIE1vY2tBIGE7CisKKyAgLy8gRGVmaW5lIG9yZGVyaW5nOgorICAvLyAgIGEuRG9BKDEpID09PgorICAvLyAgIGEuRG9BKDIpID09PiBhLkRvQSgzKQorICBFeHBlY3RhdGlvbiBlID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgY29uc3QgRXhwZWN0YXRpb25TZXQgZXMgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMykpCisgICAgICAuQWZ0ZXIoZSwgZXMpOworCisgIGEuRG9BKDIpOworCisgIC8vIE1heSBvbmx5IGJlIGNhbGxlZCBsYXN0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhLkRvQSgzKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisKKyAgYS5Eb0EoMSk7CisgIGEuRG9BKDMpOworfQorCisvLyAuQWZ0ZXIoKSBjYW4gYmUgY29tYmluZWQgd2l0aCAuSW5TZXF1ZW5jZSgpLgorVEVTVChBZnRlclRlc3QsIENhbkJlVXNlZFdpdGhJblNlcXVlbmNlKSB7CisgIE1vY2tBIGE7CisgIFNlcXVlbmNlIHM7CisgIEV4cGVjdGF0aW9uIGUgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpLkluU2VxdWVuY2Uocyk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSgzKSkKKyAgICAgIC5JblNlcXVlbmNlKHMpCisgICAgICAuQWZ0ZXIoZSk7CisKKyAgYS5Eb0EoMSk7CisKKyAgLy8gTWF5IG9ubHkgYmUgYWZ0ZXIgRG9BKDIpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhLkRvQSgzKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisKKyAgYS5Eb0EoMik7CisgIGEuRG9BKDMpOworfQorCisvLyAuQWZ0ZXIoKSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorVEVTVChBZnRlclRlc3QsIENhbkJlQ2FsbGVkTWFueVRpbWVzKSB7CisgIE1vY2tBIGE7CisgIEV4cGVjdGF0aW9uIGUxID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgRXhwZWN0YXRpb24gZTIgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOworICBFeHBlY3RhdGlvbiBlMyA9IEVYUEVDVF9DQUxMKGEsIERvQSgzKSk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSg0KSkKKyAgICAgIC5BZnRlcihlMSkKKyAgICAgIC5BZnRlcihlMikKKyAgICAgIC5BZnRlcihlMyk7CisKKyAgYS5Eb0EoMyk7CisgIGEuRG9BKDEpOworICBhLkRvQSgyKTsKKyAgYS5Eb0EoNCk7Cit9CisKKy8vIC5BZnRlcigpIGFjY2VwdHMgdXAgdG8gNSBhcmd1bWVudHMuCitURVNUKEFmdGVyVGVzdCwgQWNjZXB0c1VwVG9GaXZlQXJndW1lbnRzKSB7CisgIE1vY2tBIGE7CisgIEV4cGVjdGF0aW9uIGUxID0gRVhQRUNUX0NBTEwoYSwgRG9BKDEpKTsKKyAgRXhwZWN0YXRpb24gZTIgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMikpOworICBFeHBlY3RhdGlvbiBlMyA9IEVYUEVDVF9DQUxMKGEsIERvQSgzKSk7CisgIEV4cGVjdGF0aW9uU2V0IGVzMSA9IEVYUEVDVF9DQUxMKGEsIERvQSg0KSk7CisgIEV4cGVjdGF0aW9uU2V0IGVzMiA9IEVYUEVDVF9DQUxMKGEsIERvQSg1KSk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSg2KSkKKyAgICAgIC5BZnRlcihlMSwgZTIsIGUzLCBlczEsIGVzMik7CisKKyAgYS5Eb0EoNSk7CisgIGEuRG9BKDIpOworICBhLkRvQSg0KTsKKyAgYS5Eb0EoMSk7CisgIGEuRG9BKDMpOworICBhLkRvQSg2KTsKK30KKworLy8gLkFmdGVyKCkgYWxsb3dzIGlucHV0IHRvIGNvbnRhaW4gZHVwbGljYXRlZCBFeHBlY3RhdGlvbnMuCitURVNUKEFmdGVyVGVzdCwgQWNjZXB0c0R1cGxpY2F0ZWRJbnB1dCkgeworICBNb2NrQSBhOworICBPTl9DQUxMKGEsIFJldHVyblJlc3VsdChfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihSZXN1bHQoKSkpOworCisgIC8vIERlZmluZSBvcmRlcmluZzoKKyAgLy8gICBEb0EoMSkgPT0+CisgIC8vICAgRG9BKDIpID09PiBSZXR1cm5SZXN1bHQoMykKKyAgRXhwZWN0YXRpb24gZTEgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICBFeHBlY3RhdGlvbiBlMiA9IEVYUEVDVF9DQUxMKGEsIERvQSgyKSk7CisgIEV4cGVjdGF0aW9uU2V0IGVzOworICBlcyArPSBlMTsKKyAgZXMgKz0gZTI7CisgIEVYUEVDVF9DQUxMKGEsIFJldHVyblJlc3VsdCgzKSkKKyAgICAgIC5BZnRlcihlMSwgZTIsIGVzLCBlMSk7CisKKyAgYS5Eb0EoMSk7CisKKyAgLy8gTWF5IG9ubHkgYmUgYWZ0ZXIgRG9BKDIpLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhLlJldHVyblJlc3VsdCgzKSwgIlVuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIik7CisKKyAgYS5Eb0EoMik7CisgIGEuUmV0dXJuUmVzdWx0KDMpOworfQorCisvLyBBbiBFeHBlY3RhdGlvbiBhZGRlZCB0byBhbiBFeHBlY3RhdGlvblNldCBhZnRlciBpdCBoYXMgYmVlbiB1c2VkIGluCisvLyBhbiAuQWZ0ZXIoKSBoYXMgbm8gZWZmZWN0LgorVEVTVChBZnRlclRlc3QsIENoYW5nZXNUb0V4cGVjdGF0aW9uU2V0SGF2ZU5vRWZmZWN0QWZ0ZXJ3YXJkcykgeworICBNb2NrQSBhOworICBFeHBlY3RhdGlvblNldCBlczEgPSBFWFBFQ1RfQ0FMTChhLCBEb0EoMSkpOworICBFeHBlY3RhdGlvbiBlMiA9IEVYUEVDVF9DQUxMKGEsIERvQSgyKSk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSgzKSkKKyAgICAgIC5BZnRlcihlczEpOworICBlczEgKz0gZTI7CisKKyAgYS5Eb0EoMSk7CisgIGEuRG9BKDMpOworICBhLkRvQSgyKTsKK30KKworLy8gVGVzdHMgdGhhdCBHb29nbGUgTW9jayBjb3JyZWN0bHkgaGFuZGxlcyBjYWxscyB0byBtb2NrIGZ1bmN0aW9ucworLy8gYWZ0ZXIgYSBtb2NrIG9iamVjdCBvd25pbmcgb25lIG9mIHRoZWlyIHByZS1yZXF1aXNpdGVzIGhhcyBkaWVkLgorCisvLyBUZXN0cyB0aGF0IGNhbGxzIHRoYXQgc2F0aXNmeSB0aGUgb3JpZ2luYWwgc3BlYyBhcmUgc3VjY2Vzc2Z1bC4KK1RFU1QoRGVsZXRpbmdNb2NrRWFybHlUZXN0LCBTdWNjZXNzMSkgeworICBNb2NrQiogY29uc3QgYjEgPSBuZXcgTW9ja0I7CisgIE1vY2tBKiBjb25zdCBhID0gbmV3IE1vY2tBOworICBNb2NrQiogY29uc3QgYjIgPSBuZXcgTW9ja0I7CisKKyAgeworICAgIEluU2VxdWVuY2UgZHVtbXk7CisgICAgRVhQRUNUX0NBTEwoKmIxLCBEb0IoXykpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOworICAgIEVYUEVDVF9DQUxMKCphLCBCaW5hcnkoXywgXykpCisgICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0cnVlKSk7CisgICAgRVhQRUNUX0NBTEwoKmIyLCBEb0IoXykpCisgICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigyKSk7CisgIH0KKworICBFWFBFQ1RfRVEoMSwgYjEtPkRvQigxKSk7CisgIGRlbGV0ZSBiMTsKKyAgLy8gYSdzIHByZS1yZXF1aXNpdGUgaGFzIGRpZWQuCisgIEVYUEVDVF9UUlVFKGEtPkJpbmFyeSgwLCAxKSk7CisgIGRlbGV0ZSBiMjsKKyAgLy8gYSdzIHN1Y2Nlc3NvciBoYXMgZGllZC4KKyAgRVhQRUNUX1RSVUUoYS0+QmluYXJ5KDEsIDIpKTsKKyAgZGVsZXRlIGE7Cit9CisKKy8vIFRlc3RzIHRoYXQgY2FsbHMgdGhhdCBzYXRpc2Z5IHRoZSBvcmlnaW5hbCBzcGVjIGFyZSBzdWNjZXNzZnVsLgorVEVTVChEZWxldGluZ01vY2tFYXJseVRlc3QsIFN1Y2Nlc3MyKSB7CisgIE1vY2tCKiBjb25zdCBiMSA9IG5ldyBNb2NrQjsKKyAgTW9ja0EqIGNvbnN0IGEgPSBuZXcgTW9ja0E7CisgIE1vY2tCKiBjb25zdCBiMiA9IG5ldyBNb2NrQjsKKworICB7CisgICAgSW5TZXF1ZW5jZSBkdW1teTsKKyAgICBFWFBFQ1RfQ0FMTCgqYjEsIERvQihfKSkKKyAgICAgICAgLldpbGxPbmNlKFJldHVybigxKSk7CisgICAgRVhQRUNUX0NBTEwoKmEsIEJpbmFyeShfLCBfKSkKKyAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKKyAgICBFWFBFQ1RfQ0FMTCgqYjIsIERvQihfKSkKKyAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKQorICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKDIpKTsKKyAgfQorCisgIGRlbGV0ZSBhOyAgLy8gYSBpcyB0cml2aWFsbHkgc2F0aXNmaWVkLgorICBFWFBFQ1RfRVEoMSwgYjEtPkRvQigxKSk7CisgIEVYUEVDVF9FUSgyLCBiMi0+RG9CKDIpKTsKKyAgZGVsZXRlIGIxOworICBkZWxldGUgYjI7Cit9CisKKy8vIFRlc3RzIHRoYXQgaXQncyBPSyB0byBkZWxldGUgYSBtb2NrIG9iamVjdCBpdHNlbGYgaW4gaXRzIGFjdGlvbi4KKworLy8gU3VwcHJlc3NlcyB3YXJuaW5nIG9uIHVucmVmZXJlbmNlZCBmb3JtYWwgcGFyYW1ldGVyIGluIE1TVkMgd2l0aAorLy8gLVc0LgorI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkKKyNlbmRpZgorCitBQ1RJT05fUChEZWxldGUsIHB0cikgeyBkZWxldGUgcHRyOyB9CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworVEVTVChEZWxldGluZ01vY2tFYXJseVRlc3QsIENhbkRlbGV0ZVNlbGZJbkFjdGlvblJldHVybmluZ1ZvaWQpIHsKKyAgTW9ja0EqIGNvbnN0IGEgPSBuZXcgTW9ja0E7CisgIEVYUEVDVF9DQUxMKCphLCBEb0EoXykpLldpbGxPbmNlKERlbGV0ZShhKSk7CisgIGEtPkRvQSg0Mik7ICAvLyBUaGlzIHdpbGwgY2F1c2UgYSB0byBiZSBkZWxldGVkLgorfQorCitURVNUKERlbGV0aW5nTW9ja0Vhcmx5VGVzdCwgQ2FuRGVsZXRlU2VsZkluQWN0aW9uUmV0dXJuaW5nVmFsdWUpIHsKKyAgTW9ja0EqIGNvbnN0IGEgPSBuZXcgTW9ja0E7CisgIEVYUEVDVF9DQUxMKCphLCBSZXR1cm5SZXN1bHQoXykpCisgICAgICAuV2lsbE9uY2UoRG9BbGwoRGVsZXRlKGEpLCBSZXR1cm4oUmVzdWx0KCkpKSk7CisgIGEtPlJldHVyblJlc3VsdCg0Mik7ICAvLyBUaGlzIHdpbGwgY2F1c2UgYSB0byBiZSBkZWxldGVkLgorfQorCisvLyBUZXN0cyB0aGF0IGNhbGxzIHRoYXQgdmlvbGF0ZSB0aGUgb3JpZ2luYWwgc3BlYyB5aWVsZCBmYWlsdXJlcy4KK1RFU1QoRGVsZXRpbmdNb2NrRWFybHlUZXN0LCBGYWlsdXJlMSkgeworICBNb2NrQiogY29uc3QgYjEgPSBuZXcgTW9ja0I7CisgIE1vY2tBKiBjb25zdCBhID0gbmV3IE1vY2tBOworICBNb2NrQiogY29uc3QgYjIgPSBuZXcgTW9ja0I7CisKKyAgeworICAgIEluU2VxdWVuY2UgZHVtbXk7CisgICAgRVhQRUNUX0NBTEwoKmIxLCBEb0IoXykpCisgICAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOworICAgIEVYUEVDVF9DQUxMKCphLCBCaW5hcnkoXywgXykpCisgICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CisgICAgRVhQRUNUX0NBTEwoKmIyLCBEb0IoXykpCisgICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKKyAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigyKSk7CisgIH0KKworICBkZWxldGUgYTsgIC8vIGEgaXMgdHJpdmlhbGx5IHNhdGlzZmllZC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIGIyLT5Eb0IoMik7CisgIH0sICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworICBFWFBFQ1RfRVEoMSwgYjEtPkRvQigxKSk7CisgIGRlbGV0ZSBiMTsKKyAgZGVsZXRlIGIyOworfQorCisvLyBUZXN0cyB0aGF0IGNhbGxzIHRoYXQgdmlvbGF0ZSB0aGUgb3JpZ2luYWwgc3BlYyB5aWVsZCBmYWlsdXJlcy4KK1RFU1QoRGVsZXRpbmdNb2NrRWFybHlUZXN0LCBGYWlsdXJlMikgeworICBNb2NrQiogY29uc3QgYjEgPSBuZXcgTW9ja0I7CisgIE1vY2tBKiBjb25zdCBhID0gbmV3IE1vY2tBOworICBNb2NrQiogY29uc3QgYjIgPSBuZXcgTW9ja0I7CisKKyAgeworICAgIEluU2VxdWVuY2UgZHVtbXk7CisgICAgRVhQRUNUX0NBTEwoKmIxLCBEb0IoXykpOworICAgIEVYUEVDVF9DQUxMKCphLCBCaW5hcnkoXywgXykpCisgICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CisgICAgRVhQRUNUX0NBTEwoKmIyLCBEb0IoXykpCisgICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7CisgIH0KKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShkZWxldGUgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3R1YWw6IG5ldmVyIGNhbGxlZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShhLT5CaW5hcnkoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShiMi0+RG9CKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKKyAgZGVsZXRlIGE7CisgIGRlbGV0ZSBiMjsKK30KKworY2xhc3MgRXZlbk51bWJlckNhcmRpbmFsaXR5IDogcHVibGljIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdGlzZnkgdGhpcyBjYXJkaW5hbGl0eS4KKyAgdmlydHVhbCBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FsbF9jb3VudCAlIDIgPT0gMDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCisgIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCAvKiBjYWxsX2NvdW50ICovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbS4KKyAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7CisgICAgKm9zIDw8ICJjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiOworICB9Cit9OworCitDYXJkaW5hbGl0eSBFdmVuTnVtYmVyKCkgeworICByZXR1cm4gQ2FyZGluYWxpdHkobmV3IEV2ZW5OdW1iZXJDYXJkaW5hbGl0eSk7Cit9CisKK1RFU1QoRXhwZWN0YXRpb25CYXNlVGVzdCwKKyAgICAgQWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZFdvcmtzRm9yTm9uTW9ub3RvbmljQ2FyZGluYWxpdHkpIHsKKyAgTW9ja0EqIGEgPSBuZXcgTW9ja0E7CisgIFNlcXVlbmNlIHM7CisKKyAgRVhQRUNUX0NBTEwoKmEsIERvQSgxKSkKKyAgICAgIC5UaW1lcyhFdmVuTnVtYmVyKCkpCisgICAgICAuSW5TZXF1ZW5jZShzKTsKKyAgRVhQRUNUX0NBTEwoKmEsIERvQSgyKSkKKyAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKKyAgICAgIC5JblNlcXVlbmNlKHMpOworICBFWFBFQ1RfQ0FMTCgqYSwgRG9BKDMpKQorICAgICAgLlRpbWVzKEFueU51bWJlcigpKTsKKworICBhLT5Eb0EoMyk7CisgIGEtPkRvQSgxKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYS0+RG9BKDIpLCAiVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoZGVsZXRlIGEsICJ0byBiZSBjYWxsZWQgZXZlbiBudW1iZXIgb2YgdGltZXMiKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyB2ZXJpZnkgdGhlIG1lc3NhZ2UgZ2VuZXJhdGVkIHdoZW4gYSBtb2NrCisvLyBmdW5jdGlvbiBpcyBjYWxsZWQuCisKK3N0cnVjdCBQcmludGFibGUgeworfTsKKworaW5saW5lIHZvaWQgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFByaW50YWJsZSYpIHsKKyAgb3MgPDwgIlByaW50YWJsZSI7Cit9CisKK3N0cnVjdCBVbnByaW50YWJsZSB7CisgIFVucHJpbnRhYmxlKCkgOiB2YWx1ZSgwKSB7fQorICBpbnQgdmFsdWU7Cit9OworCitjbGFzcyBNb2NrQyB7CisgcHVibGljOgorICBNb2NrQygpIHt9CisKKyAgTU9DS19NRVRIT0Q2KFZvaWRNZXRob2QsIHZvaWQoYm9vbCBjb25kLCBpbnQgbiwgc3RyaW5nIHMsIHZvaWQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50YWJsZSYgeCwgVW5wcmludGFibGUgeSkpOworICBNT0NLX01FVEhPRDAoTm9uVm9pZE1ldGhvZCwgaW50KCkpOyAgLy8gTk9MSU5UCisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tDKTsKK307CisKK2NsYXNzIFZlcmJvc2VGbGFnUHJlc2VydmluZ0ZpeHR1cmUgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBWZXJib3NlRmxhZ1ByZXNlcnZpbmdGaXh0dXJlKCkKKyAgICAgIDogc2F2ZWRfdmVyYm9zZV9mbGFnXyhHTU9DS19GTEFHKHZlcmJvc2UpKSB7fQorCisgIH5WZXJib3NlRmxhZ1ByZXNlcnZpbmdGaXh0dXJlKCkgeyBHTU9DS19GTEFHKHZlcmJvc2UpID0gc2F2ZWRfdmVyYm9zZV9mbGFnXzsgfQorCisgcHJpdmF0ZToKKyAgY29uc3Qgc3RyaW5nIHNhdmVkX3ZlcmJvc2VfZmxhZ187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWZXJib3NlRmxhZ1ByZXNlcnZpbmdGaXh0dXJlKTsKK307CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIFRlc3RzIHRoYXQgYW4gdW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwgb24gYSBuYWdneSBtb2NrCisvLyBnZW5lcmF0ZXMgYSB3YXJuaW5nIHdpdGhvdXQgdGhlIHN0YWNrIHRyYWNlIHdoZW4KKy8vIC0tZ21vY2tfdmVyYm9zZT13YXJuaW5nIGlzIHNwZWNpZmllZC4KK1RFU1QoRnVuY3Rpb25DYWxsTWVzc2FnZVRlc3QsCisgICAgIFVuaW50ZXJlc3RpbmdDYWxsT25OYWdneU1vY2tHZW5lcmF0ZXNOb1N0YWNrVHJhY2VXaGVuVmVyYm9zZVdhcm5pbmcpIHsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtXYXJuaW5nVmVyYm9zaXR5OworICBOYWdneU1vY2s8TW9ja0M+IGM7CisgIENhcHR1cmVTdGRvdXQoKTsKKyAgYy5Wb2lkTWV0aG9kKGZhbHNlLCA1LCAiSGkiLCBOVUxMLCBQcmludGFibGUoKSwgVW5wcmludGFibGUoKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dCA9IEdldENhcHR1cmVkU3Rkb3V0KCk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJHTU9DSyBXQVJOSU5HIiwgb3V0cHV0KTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihJc05vdFN1YnN0cmluZywgIlN0YWNrIHRyYWNlOiIsIG91dHB1dCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYW4gdW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwgb24gYSBuYWdneSBtb2NrCisvLyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGNvbnRhaW5pbmcgdGhlIHN0YWNrIHRyYWNlIHdoZW4KKy8vIC0tZ21vY2tfdmVyYm9zZT1pbmZvIGlzIHNwZWNpZmllZC4KK1RFU1QoRnVuY3Rpb25DYWxsTWVzc2FnZVRlc3QsCisgICAgIFVuaW50ZXJlc3RpbmdDYWxsT25OYWdneU1vY2tHZW5lcmF0ZXNGeWlXaXRoU3RhY2tUcmFjZVdoZW5WZXJib3NlSW5mbykgeworICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga0luZm9WZXJib3NpdHk7CisgIE5hZ2d5TW9jazxNb2NrQz4gYzsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBjLlZvaWRNZXRob2QoZmFsc2UsIDUsICJIaSIsIE5VTEwsIFByaW50YWJsZSgpLCBVbnByaW50YWJsZSgpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0ID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgIkdNT0NLIFdBUk5JTkciLCBvdXRwdXQpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiU3RhY2sgdHJhY2U6Iiwgb3V0cHV0KTsKKworIyBpZm5kZWYgTkRFQlVHCisKKyAgLy8gV2UgY2hlY2sgdGhlIHN0YWNrIHRyYWNlIGNvbnRlbnQgaW4gZGJnLW1vZGUgb25seSwgYXMgb3B0LW1vZGUKKyAgLy8gbWF5IGlubGluZSB0aGUgY2FsbCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBzZWVpbmcuCisKKyAgLy8gVmVyaWZpZXMgdGhhdCBhIHZvaWQgbW9jayBmdW5jdGlvbidzIG5hbWUgYXBwZWFycyBpbiB0aGUgc3RhY2sKKyAgLy8gdHJhY2UuCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsICJWb2lkTWV0aG9kKCIsIG91dHB1dCk7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBhIG5vbi12b2lkIG1vY2sgZnVuY3Rpb24ncyBuYW1lIGFwcGVhcnMgaW4gdGhlCisgIC8vIHN0YWNrIHRyYWNlLgorICBDYXB0dXJlU3Rkb3V0KCk7CisgIGMuTm9uVm9pZE1ldGhvZCgpOworICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXQyID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihJc1N1YnN0cmluZywgIk5vblZvaWRNZXRob2QoIiwgb3V0cHV0Mik7CisKKyMgZW5kaWYgIC8vIE5ERUJVRworfQorCisvLyBUZXN0cyB0aGF0IGFuIHVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIG9uIGEgbmFnZ3kgbW9jaworLy8gY2F1c2VzIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZSB0byBiZSBwcmludGVkLgorVEVTVChGdW5jdGlvbkNhbGxNZXNzYWdlVGVzdCwKKyAgICAgVW5pbnRlcmVzdGluZ0NhbGxPbk5hZ2d5TW9ja1ByaW50c0FyZ3VtZW50c0FuZFJldHVyblZhbHVlKSB7CisgIC8vIEEgbm9uLXZvaWQgbW9jayBmdW5jdGlvbi4KKyAgTmFnZ3lNb2NrPE1vY2tCPiBiOworICBDYXB0dXJlU3Rkb3V0KCk7CisgIGIuRG9CKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dDEgPSBHZXRDYXB0dXJlZFN0ZG91dCgpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKAorICAgICAgSXNTdWJzdHJpbmcsCisgICAgICAiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS5cbiIKKyAgICAgICIgICAgRnVuY3Rpb24gY2FsbDogRG9CKClcbiIKKyAgICAgICIgICAgICAgICAgUmV0dXJuczogMFxuIiwgb3V0cHV0MS5jX3N0cigpKTsKKyAgLy8gTWFrZXMgc3VyZSB0aGUgcmV0dXJuIHZhbHVlIGlzIHByaW50ZWQuCisKKyAgLy8gQSB2b2lkIG1vY2sgZnVuY3Rpb24uCisgIE5hZ2d5TW9jazxNb2NrQz4gYzsKKyAgQ2FwdHVyZVN0ZG91dCgpOworICBjLlZvaWRNZXRob2QoZmFsc2UsIDUsICJIaSIsIE5VTEwsIFByaW50YWJsZSgpLCBVbnByaW50YWJsZSgpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0MiA9IEdldENhcHR1cmVkU3Rkb3V0KCk7CisgIEVYUEVDVF9USEFUKG91dHB1dDIuY19zdHIoKSwKKyAgICAgICAgICAgICAgQ29udGFpbnNSZWdleCgKKyAgICAgICAgICAgICAgICAgICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkaXJlY3RseVxcLlxuIgorICAgICAgICAgICAgICAgICAgIiAgICBGdW5jdGlvbiBjYWxsOiBWb2lkTWV0aG9kIgorICAgICAgICAgICAgICAgICAgIlxcKGZhbHNlLCA1LCBcIkhpXCIsIE5VTEwsIEAuKyAiCisgICAgICAgICAgICAgICAgICAiUHJpbnRhYmxlLCA0LWJ5dGUgb2JqZWN0IDwwMC0wMCAwMC0wMD5cXCkiKSk7CisgIC8vIEEgdm9pZCBmdW5jdGlvbiBoYXMgbm8gcmV0dXJuIHZhbHVlIHRvIHByaW50LgorfQorCisvLyBUZXN0cyBob3cgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnIGFmZmVjdHMgR29vZ2xlIE1vY2sncyBvdXRwdXQuCisKK2NsYXNzIEdNb2NrVmVyYm9zZUZsYWdUZXN0IDogcHVibGljIFZlcmJvc2VGbGFnUHJlc2VydmluZ0ZpeHR1cmUgeworIHB1YmxpYzoKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gR29vZ2xlIE1vY2sgb3V0cHV0IGlzIGNvcnJlY3QuICAoV2hlbgorICAvLyBzaG91bGRfcHJpbnQgaXMgdHJ1ZSwgdGhlIG91dHB1dCBzaG91bGQgbWF0Y2ggdGhlIGdpdmVuIHJlZ2V4IGFuZAorICAvLyBjb250YWluIHRoZSBnaXZlbiBmdW5jdGlvbiBuYW1lIGluIHRoZSBzdGFjayB0cmFjZS4gIFdoZW4gaXQncworICAvLyBmYWxzZSwgdGhlIG91dHB1dCBzaG91bGQgYmUgZW1wdHkuKQorICB2b2lkIFZlcmlmeU91dHB1dChjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0LCBib29sIHNob3VsZF9wcmludCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZnVuY3Rpb25fbmFtZSkgeworICAgIGlmIChzaG91bGRfcHJpbnQpIHsKKyAgICAgIEVYUEVDVF9USEFUKG91dHB1dC5jX3N0cigpLCBIYXNTdWJzdHIoZXhwZWN0ZWRfc3Vic3RyaW5nKSk7CisjIGlmbmRlZiBOREVCVUcKKyAgICAgIC8vIFdlIGNoZWNrIHRoZSBzdGFjayB0cmFjZSBjb250ZW50IGluIGRiZy1tb2RlIG9ubHksIGFzIG9wdC1tb2RlCisgICAgICAvLyBtYXkgaW5saW5lIHRoZSBjYWxsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHNlZWluZy4KKyAgICAgIEVYUEVDVF9USEFUKG91dHB1dC5jX3N0cigpLCBIYXNTdWJzdHIoZnVuY3Rpb25fbmFtZSkpOworIyBlbHNlCisgICAgICAvLyBTdXBwcmVzc2VzICd1bnVzZWQgZnVuY3Rpb24gcGFyYW1ldGVyJyB3YXJuaW5ncy4KKyAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGZ1bmN0aW9uX25hbWUpOworIyBlbmRpZiAgLy8gTkRFQlVHCisgICAgfSBlbHNlIHsKKyAgICAgIEVYUEVDVF9TVFJFUSgiIiwgb3V0cHV0LmNfc3RyKCkpOworICAgIH0KKyAgfQorCisgIC8vIFRlc3RzIGhvdyB0aGUgZmxhZyBhZmZlY3RzIGV4cGVjdGVkIGNhbGxzLgorICB2b2lkIFRlc3RFeHBlY3RlZENhbGwoYm9vbCBzaG91bGRfcHJpbnQpIHsKKyAgICBNb2NrQSBhOworICAgIEVYUEVDVF9DQUxMKGEsIERvQSg1KSk7CisgICAgRVhQRUNUX0NBTEwoYSwgQmluYXJ5KF8sIDEpKQorICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKKworICAgIC8vIEEgdm9pZC1yZXR1cm5pbmcgZnVuY3Rpb24uCisgICAgQ2FwdHVyZVN0ZG91dCgpOworICAgIGEuRG9BKDUpOworICAgIFZlcmlmeU91dHB1dCgKKyAgICAgICAgR2V0Q2FwdHVyZWRTdGRvdXQoKSwKKyAgICAgICAgc2hvdWxkX3ByaW50LAorICAgICAgICAiTW9jayBmdW5jdGlvbiBjYWxsIG1hdGNoZXMgRVhQRUNUX0NBTEwoYSwgRG9BKDUpKS4uLlxuIgorICAgICAgICAiICAgIEZ1bmN0aW9uIGNhbGw6IERvQSg1KVxuIgorICAgICAgICAiU3RhY2sgdHJhY2U6XG4iLAorICAgICAgICAiRG9BIik7CisKKyAgICAvLyBBIG5vbi12b2lkLXJldHVybmluZyBmdW5jdGlvbi4KKyAgICBDYXB0dXJlU3Rkb3V0KCk7CisgICAgYS5CaW5hcnkoMiwgMSk7CisgICAgVmVyaWZ5T3V0cHV0KAorICAgICAgICBHZXRDYXB0dXJlZFN0ZG91dCgpLAorICAgICAgICBzaG91bGRfcHJpbnQsCisgICAgICAgICJNb2NrIGZ1bmN0aW9uIGNhbGwgbWF0Y2hlcyBFWFBFQ1RfQ0FMTChhLCBCaW5hcnkoXywgMSkpLi4uXG4iCisgICAgICAgICIgICAgRnVuY3Rpb24gY2FsbDogQmluYXJ5KDIsIDEpXG4iCisgICAgICAgICIgICAgICAgICAgUmV0dXJuczogdHJ1ZVxuIgorICAgICAgICAiU3RhY2sgdHJhY2U6XG4iLAorICAgICAgICAiQmluYXJ5Iik7CisgIH0KKworICAvLyBUZXN0cyBob3cgdGhlIGZsYWcgYWZmZWN0cyB1bmludGVyZXN0aW5nIGNhbGxzIG9uIGEgbmFnZ3kgbW9jay4KKyAgdm9pZCBUZXN0VW5pbnRlcmVzdGluZ0NhbGxPbk5hZ2d5TW9jayhib29sIHNob3VsZF9wcmludCkgeworICAgIE5hZ2d5TW9jazxNb2NrQT4gYTsKKyAgICBjb25zdCBzdHJpbmcgbm90ZSA9CisgICAgICAgICJOT1RFOiBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIGFib3ZlIHdhcm5pbmcgdW5sZXNzIHRoaXMgIgorICAgICAgICAiY2FsbCBzaG91bGQgbm90IGhhcHBlbi4gIERvIG5vdCBzdXBwcmVzcyBpdCBieSBibGluZGx5IGFkZGluZyAiCisgICAgICAgICJhbiBFWFBFQ1RfQ0FMTCgpIGlmIHlvdSBkb24ndCBtZWFuIHRvIGVuZm9yY2UgdGhlIGNhbGwuICAiCisgICAgICAgICJTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayMiCisgICAgICAgICJLbm93aW5nX1doZW5fdG9fRXhwZWN0IGZvciBkZXRhaWxzLiI7CisKKyAgICAvLyBBIHZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9uLgorICAgIENhcHR1cmVTdGRvdXQoKTsKKyAgICBhLkRvQSg1KTsKKyAgICBWZXJpZnlPdXRwdXQoCisgICAgICAgIEdldENhcHR1cmVkU3Rkb3V0KCksCisgICAgICAgIHNob3VsZF9wcmludCwKKyAgICAgICAgIlxuR01PQ0sgV0FSTklORzpcbiIKKyAgICAgICAgIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRpcmVjdGx5LlxuIgorICAgICAgICAiICAgIEZ1bmN0aW9uIGNhbGw6IERvQSg1KVxuIiArCisgICAgICAgIG5vdGUsCisgICAgICAgICJEb0EiKTsKKworICAgIC8vIEEgbm9uLXZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9uLgorICAgIENhcHR1cmVTdGRvdXQoKTsKKyAgICBhLkJpbmFyeSgyLCAxKTsKKyAgICBWZXJpZnlPdXRwdXQoCisgICAgICAgIEdldENhcHR1cmVkU3Rkb3V0KCksCisgICAgICAgIHNob3VsZF9wcmludCwKKyAgICAgICAgIlxuR01PQ0sgV0FSTklORzpcbiIKKyAgICAgICAgIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuXG4iCisgICAgICAgICIgICAgRnVuY3Rpb24gY2FsbDogQmluYXJ5KDIsIDEpXG4iCisgICAgICAgICIgICAgICAgICAgUmV0dXJuczogZmFsc2VcbiIgKworICAgICAgICBub3RlLAorICAgICAgICAiQmluYXJ5Iik7CisgIH0KK307CisKKy8vIFRlc3RzIHRoYXQgLS1nbW9ja192ZXJib3NlPWluZm8gY2F1c2VzIGJvdGggZXhwZWN0ZWQgYW5kCisvLyB1bmludGVyZXN0aW5nIGNhbGxzIHRvIGJlIHJlcG9ydGVkLgorVEVTVF9GKEdNb2NrVmVyYm9zZUZsYWdUZXN0LCBJbmZvKSB7CisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBrSW5mb1ZlcmJvc2l0eTsKKyAgVGVzdEV4cGVjdGVkQ2FsbCh0cnVlKTsKKyAgVGVzdFVuaW50ZXJlc3RpbmdDYWxsT25OYWdneU1vY2sodHJ1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgLS1nbW9ja192ZXJib3NlPXdhcm5pbmcgY2F1c2VzIHVuaW50ZXJlc3RpbmcgY2FsbHMgdG8gYmUKKy8vIHJlcG9ydGVkLgorVEVTVF9GKEdNb2NrVmVyYm9zZUZsYWdUZXN0LCBXYXJuaW5nKSB7CisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBrV2FybmluZ1ZlcmJvc2l0eTsKKyAgVGVzdEV4cGVjdGVkQ2FsbChmYWxzZSk7CisgIFRlc3RVbmludGVyZXN0aW5nQ2FsbE9uTmFnZ3lNb2NrKHRydWUpOworfQorCisvLyBUZXN0cyB0aGF0IC0tZ21vY2tfdmVyYm9zZT13YXJuaW5nIGNhdXNlcyBuZWl0aGVyIGV4cGVjdGVkIG5vcgorLy8gdW5pbnRlcmVzdGluZyBjYWxscyB0byBiZSByZXBvcnRlZC4KK1RFU1RfRihHTW9ja1ZlcmJvc2VGbGFnVGVzdCwgRXJyb3IpIHsKKyAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9IGtFcnJvclZlcmJvc2l0eTsKKyAgVGVzdEV4cGVjdGVkQ2FsbChmYWxzZSk7CisgIFRlc3RVbmludGVyZXN0aW5nQ2FsbE9uTmFnZ3lNb2NrKGZhbHNlKTsKK30KKworLy8gVGVzdHMgdGhhdCAtLWdtb2NrX3ZlcmJvc2U9U09NRV9JTlZBTElEX1ZBTFVFIGhhcyB0aGUgc2FtZSBlZmZlY3QKKy8vIGFzIC0tZ21vY2tfdmVyYm9zZT13YXJuaW5nLgorVEVTVF9GKEdNb2NrVmVyYm9zZUZsYWdUZXN0LCBJbnZhbGlkRmxhZ0lzVHJlYXRlZEFzV2FybmluZykgeworICBHTU9DS19GTEFHKHZlcmJvc2UpID0gImludmFsaWQiOyAgLy8gVHJlYXRlZCBhcyAid2FybmluZyIuCisgIFRlc3RFeHBlY3RlZENhbGwoZmFsc2UpOworICBUZXN0VW5pbnRlcmVzdGluZ0NhbGxPbk5hZ2d5TW9jayh0cnVlKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIEEgaGVscGVyIGNsYXNzIHRoYXQgZ2VuZXJhdGVzIGEgZmFpbHVyZSB3aGVuIHByaW50ZWQuICBXZSB1c2UgaXQgdG8KKy8vIGVuc3VyZSB0aGF0IEdvb2dsZSBNb2NrIGRvZXNuJ3QgcHJpbnQgYSB2YWx1ZSAoZXZlbiB0byBhbiBpbnRlcm5hbAorLy8gYnVmZmVyKSB3aGVuIGl0IGlzIG5vdCBzdXBwb3NlZCB0byBkbyBzby4KK2NsYXNzIFByaW50TWVOb3Qge307CisKK3ZvaWQgUHJpbnRUbyhQcmludE1lTm90IC8qIGR1bW15ICovLCA6OnN0ZDo6b3N0cmVhbSogLyogb3MgKi8pIHsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiR29vZ2xlIE1vY2sgaXMgcHJpbnRpbmcgYSB2YWx1ZSB0aGF0IHNob3VsZG4ndCBiZSAiCisgICAgICAgICAgICAgICAgPDwgInByaW50ZWQgZXZlbiB0byBhbiBpbnRlcm5hbCBidWZmZXIuIjsKK30KKworY2xhc3MgTG9nVGVzdEhlbHBlciB7CisgcHVibGljOgorICBMb2dUZXN0SGVscGVyKCkge30KKworICBNT0NLX01FVEhPRDEoRm9vLCBQcmludE1lTm90KFByaW50TWVOb3QpKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTG9nVGVzdEhlbHBlcik7Cit9OworCitjbGFzcyBHTW9ja0xvZ1Rlc3QgOiBwdWJsaWMgVmVyYm9zZUZsYWdQcmVzZXJ2aW5nRml4dHVyZSB7CisgcHJvdGVjdGVkOgorICBMb2dUZXN0SGVscGVyIGhlbHBlcl87Cit9OworCitURVNUX0YoR01vY2tMb2dUZXN0LCBEb2VzTm90UHJpbnRHb29kQ2FsbEludGVybmFsbHlJZlZlcmJvc2l0eUlzV2FybmluZykgeworICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga1dhcm5pbmdWZXJib3NpdHk7CisgIEVYUEVDVF9DQUxMKGhlbHBlcl8sIEZvbyhfKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oUHJpbnRNZU5vdCgpKSk7CisgIGhlbHBlcl8uRm9vKFByaW50TWVOb3QoKSk7ICAvLyBUaGlzIGlzIGFuIGV4cGVjdGVkIGNhbGwuCit9CisKK1RFU1RfRihHTW9ja0xvZ1Rlc3QsIERvZXNOb3RQcmludEdvb2RDYWxsSW50ZXJuYWxseUlmVmVyYm9zaXR5SXNFcnJvcikgeworICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga0Vycm9yVmVyYm9zaXR5OworICBFWFBFQ1RfQ0FMTChoZWxwZXJfLCBGb28oXykpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKFByaW50TWVOb3QoKSkpOworICBoZWxwZXJfLkZvbyhQcmludE1lTm90KCkpOyAgLy8gVGhpcyBpcyBhbiBleHBlY3RlZCBjYWxsLgorfQorCitURVNUX0YoR01vY2tMb2dUZXN0LCBEb2VzTm90UHJpbnRXYXJuaW5nSW50ZXJuYWxseUlmVmVyYm9zaXR5SXNFcnJvcikgeworICBHTU9DS19GTEFHKHZlcmJvc2UpID0ga0Vycm9yVmVyYm9zaXR5OworICBPTl9DQUxMKGhlbHBlcl8sIEZvbyhfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihQcmludE1lTm90KCkpKTsKKyAgaGVscGVyXy5Gb28oUHJpbnRNZU5vdCgpKTsgIC8vIFRoaXMgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZy4KK30KKworLy8gVGVzdHMgTW9jazo6QWxsb3dMZWFrKCkuCisKK1RFU1QoQWxsb3dMZWFrVGVzdCwgQWxsb3dzTGVha2luZ1VudXNlZE1vY2tPYmplY3QpIHsKKyAgTW9ja0EqIGEgPSBuZXcgTW9ja0E7CisgIE1vY2s6OkFsbG93TGVhayhhKTsKK30KKworVEVTVChBbGxvd0xlYWtUZXN0LCBDYW5CZUNhbGxlZEJlZm9yZU9uQ2FsbCkgeworICBNb2NrQSogYSA9IG5ldyBNb2NrQTsKKyAgTW9jazo6QWxsb3dMZWFrKGEpOworICBPTl9DQUxMKCphLCBEb0EoXykpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworICBhLT5Eb0EoMCk7Cit9CisKK1RFU1QoQWxsb3dMZWFrVGVzdCwgQ2FuQmVDYWxsZWRBZnRlck9uQ2FsbCkgeworICBNb2NrQSogYSA9IG5ldyBNb2NrQTsKKyAgT05fQ0FMTCgqYSwgRG9BKF8pKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKKyAgTW9jazo6QWxsb3dMZWFrKGEpOworfQorCitURVNUKEFsbG93TGVha1Rlc3QsIENhbkJlQ2FsbGVkQmVmb3JlRXhwZWN0Q2FsbCkgeworICBNb2NrQSogYSA9IG5ldyBNb2NrQTsKKyAgTW9jazo6QWxsb3dMZWFrKGEpOworICBFWFBFQ1RfQ0FMTCgqYSwgRG9BKF8pKTsKKyAgYS0+RG9BKDApOworfQorCitURVNUKEFsbG93TGVha1Rlc3QsIENhbkJlQ2FsbGVkQWZ0ZXJFeHBlY3RDYWxsKSB7CisgIE1vY2tBKiBhID0gbmV3IE1vY2tBOworICBFWFBFQ1RfQ0FMTCgqYSwgRG9BKF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7CisgIE1vY2s6OkFsbG93TGVhayhhKTsKK30KKworVEVTVChBbGxvd0xlYWtUZXN0LCBXb3Jrc1doZW5Cb3RoT25DYWxsQW5kRXhwZWN0Q2FsbEFyZVByZXNlbnQpIHsKKyAgTW9ja0EqIGEgPSBuZXcgTW9ja0E7CisgIE9OX0NBTEwoKmEsIERvQShfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIEVYUEVDVF9DQUxMKCphLCBEb0EoXykpLlRpbWVzKEFueU51bWJlcigpKTsKKyAgTW9jazo6QWxsb3dMZWFrKGEpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiB2ZXJpZnkgYW5kIGNsZWFyIGEgbW9jayBvYmplY3QncyBleHBlY3RhdGlvbnMKKy8vIHdoZW4gbm9uZSBvZiBpdHMgbWV0aG9kcyBoYXMgZXhwZWN0YXRpb25zLgorVEVTVChWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc1Rlc3QsIE5vTWV0aG9kSGFzRXhwZWN0YXRpb25zKSB7CisgIE1vY2tCIGI7CisgIEFTU0VSVF9UUlVFKE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZiKSk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGV4cGVjdGF0aW9ucyBvbiB0aGUgbWV0aG9kcyBub3csIHNvIHdlIGNhbgorICAvLyBmcmVlbHkgY2FsbCB0aGVtLgorICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7CisgIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIHZlcmlmeSBhbmQgY2xlYXIgYSBtb2NrIG9iamVjdCdzIGV4cGVjdGF0aW9ucworLy8gd2hlbiBzb21lLCBidXQgbm90IGFsbCwgb2YgaXRzIG1ldGhvZHMgaGF2ZSBleHBlY3RhdGlvbnMgKmFuZCogdGhlCisvLyB2ZXJpZmljYXRpb24gc3VjY2VlZHMuCitURVNUKFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zVGVzdCwgU29tZU1ldGhvZHNIYXZlRXhwZWN0YXRpb25zQW5kU3VjY2VlZCkgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOworICBiLkRvQigpOworICBBU1NFUlRfVFJVRShNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYikpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBleHBlY3RhdGlvbnMgb24gdGhlIG1ldGhvZHMgbm93LCBzbyB3ZSBjYW4KKyAgLy8gZnJlZWx5IGNhbGwgdGhlbS4KKyAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOworICBFWFBFQ1RfRVEoMCwgYi5Eb0IoMSkpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiB2ZXJpZnkgYW5kIGNsZWFyIGEgbW9jayBvYmplY3QncyBleHBlY3RhdGlvbnMKKy8vIHdoZW4gc29tZSwgYnV0IG5vdCBhbGwsIG9mIGl0cyBtZXRob2RzIGhhdmUgZXhwZWN0YXRpb25zICphbmQqIHRoZQorLy8gdmVyaWZpY2F0aW9uIGZhaWxzLgorVEVTVChWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc1Rlc3QsIFNvbWVNZXRob2RzSGF2ZUV4cGVjdGF0aW9uc0FuZEZhaWwpIHsKKyAgTW9ja0IgYjsKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKKyAgYm9vbCByZXN1bHQgPSB0cnVlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShyZXN1bHQgPSBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3R1YWw6IG5ldmVyIGNhbGxlZCIpOworICBBU1NFUlRfRkFMU0UocmVzdWx0KTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXhwZWN0YXRpb25zIG9uIHRoZSBtZXRob2RzIG5vdywgc28gd2UgY2FuCisgIC8vIGZyZWVseSBjYWxsIHRoZW0uCisgIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gdmVyaWZ5IGFuZCBjbGVhciBhIG1vY2sgb2JqZWN0J3MgZXhwZWN0YXRpb25zCisvLyB3aGVuIGFsbCBvZiBpdHMgbWV0aG9kcyBoYXZlIGV4cGVjdGF0aW9ucy4KK1RFU1QoVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNUZXN0LCBBbGxNZXRob2RzSGF2ZUV4cGVjdGF0aW9ucykgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMSkpOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoXykpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKKyAgYi5Eb0IoKTsKKyAgYi5Eb0IoMSk7CisgIEFTU0VSVF9UUlVFKE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZiKSk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGV4cGVjdGF0aW9ucyBvbiB0aGUgbWV0aG9kcyBub3csIHNvIHdlIGNhbgorICAvLyBmcmVlbHkgY2FsbCB0aGVtLgorICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7CisgIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIHZlcmlmeSBhbmQgY2xlYXIgYSBtb2NrIG9iamVjdCdzIGV4cGVjdGF0aW9ucworLy8gd2hlbiBhIG1ldGhvZCBoYXMgbW9yZSB0aGFuIG9uZSBleHBlY3RhdGlvbi4KK1RFU1QoVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNUZXN0LCBBTWV0aG9kSGFzTWFueUV4cGVjdGF0aW9ucykgeworICBNb2NrQiBiOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoMCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDEpKTsKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKF8pKQorICAgICAgLldpbGxPbmNlKFJldHVybigyKSk7CisgIGIuRG9CKDEpOworICBib29sIHJlc3VsdCA9IHRydWU7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHJlc3VsdCA9IE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdHVhbDogbmV2ZXIgY2FsbGVkIik7CisgIEFTU0VSVF9GQUxTRShyZXN1bHQpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBleHBlY3RhdGlvbnMgb24gdGhlIG1ldGhvZHMgbm93LCBzbyB3ZSBjYW4KKyAgLy8gZnJlZWx5IGNhbGwgdGhlbS4KKyAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOworICBFWFBFQ1RfRVEoMCwgYi5Eb0IoMSkpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBjYWxsIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCkgb24gdGhlIHNhbWUKKy8vIG1vY2sgb2JqZWN0IG11bHRpcGxlIHRpbWVzLgorVEVTVChWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc1Rlc3QsIENhbkNhbGxNYW55VGltZXMpIHsKKyAgTW9ja0IgYjsKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpOworICBiLkRvQigpOworICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYik7CisKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKF8pKQorICAgICAgLldpbGxPbmNlKFJldHVybigxKSk7CisgIGIuRG9CKDEpOworICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYik7CisgIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZiKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXhwZWN0YXRpb25zIG9uIHRoZSBtZXRob2RzIG5vdywgc28gd2UgY2FuCisgIC8vIGZyZWVseSBjYWxsIHRoZW0uCisgIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gY2xlYXIgYSBtb2NrIG9iamVjdCdzIGRlZmF1bHQgYWN0aW9ucyB3aGVuIG5vbmUKKy8vIG9mIGl0cyBtZXRob2RzIGhhcyBkZWZhdWx0IGFjdGlvbnMuCitURVNUKFZlcmlmeUFuZENsZWFyVGVzdCwgTm9NZXRob2RIYXNEZWZhdWx0QWN0aW9ucykgeworICBNb2NrQiBiOworICAvLyBJZiB0aGlzIGNyYXNoZXMgb3IgZ2VuZXJhdGVzIGEgZmFpbHVyZSwgdGhlIHRlc3Qgd2lsbCBjYXRjaCBpdC4KKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpOworICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIGNsZWFyIGEgbW9jayBvYmplY3QncyBkZWZhdWx0IGFjdGlvbnMgd2hlbiBzb21lLAorLy8gYnV0IG5vdCBhbGwgb2YgaXRzIG1ldGhvZHMgaGF2ZSBkZWZhdWx0IGFjdGlvbnMuCitURVNUKFZlcmlmeUFuZENsZWFyVGVzdCwgU29tZU1ldGhvZHNIYXZlRGVmYXVsdEFjdGlvbnMpIHsKKyAgTW9ja0IgYjsKKyAgT05fQ0FMTChiLCBEb0IoKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7CisKKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIGludCBEb0IoKSB3YXMgcmVtb3ZlZC4KKyAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBjbGVhciBhIG1vY2sgb2JqZWN0J3MgZGVmYXVsdCBhY3Rpb25zIHdoZW4gYWxsIG9mCisvLyBpdHMgbWV0aG9kcyBoYXZlIGRlZmF1bHQgYWN0aW9ucy4KK1RFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LCBBbGxNZXRob2RzSGF2ZURlZmF1bHRBY3Rpb25zKSB7CisgIE1vY2tCIGI7CisgIE9OX0NBTEwoYiwgRG9CKCkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICBPTl9DQUxMKGIsIERvQihfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigyKSk7CisKKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIGludCBEb0IoKSB3YXMgcmVtb3ZlZC4KKyAgRVhQRUNUX0VRKDAsIGIuRG9CKCkpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIGludCBEb0IoaW50KSB3YXMgcmVtb3ZlZC4KKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDApKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gY2xlYXIgYSBtb2NrIG9iamVjdCdzIGRlZmF1bHQgYWN0aW9ucyB3aGVuIGEKKy8vIG1ldGhvZCBoYXMgbW9yZSB0aGFuIG9uZSBPTl9DQUxMKCkgc2V0IG9uIGl0LgorVEVTVChWZXJpZnlBbmRDbGVhclRlc3QsIEFNZXRob2RIYXNNYW55RGVmYXVsdEFjdGlvbnMpIHsKKyAgTW9ja0IgYjsKKyAgT05fQ0FMTChiLCBEb0IoMCkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICBPTl9DQUxMKGIsIERvQihfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigyKSk7CisKKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9ucyAodGhlcmUgYXJlIHR3bykgb2YgaW50IERvQihpbnQpCisgIC8vIHdlcmUgcmVtb3ZlZC4KKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDApKTsKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gY2FsbCBWZXJpZnlBbmRDbGVhcigpIG9uIGEgbW9jayBvYmplY3QgbXVsdGlwbGUKKy8vIHRpbWVzLgorVEVTVChWZXJpZnlBbmRDbGVhclRlc3QsIENhbkNhbGxNYW55VGltZXMpIHsKKyAgTW9ja0IgYjsKKyAgT05fQ0FMTChiLCBEb0IoKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7CisgIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKTsKKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpOworCisgIE9OX0NBTEwoYiwgRG9CKF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDEpKTsKKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpOworCisgIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBWZXJpZnlBbmRDbGVhcigpIHdvcmtzIHdoZW4gdGhlIHZlcmlmaWNhdGlvbiBzdWNjZWVkcy4KK1RFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LCBTdWNjZXNzKSB7CisgIE1vY2tCIGI7CisgIE9OX0NBTEwoYiwgRG9CKCkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICBFWFBFQ1RfQ0FMTChiLCBEb0IoMSkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKKworICBiLkRvQigpOworICBiLkRvQigxKTsKKyAgQVNTRVJUX1RSVUUoTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIpKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXhwZWN0YXRpb25zIG9uIHRoZSBtZXRob2RzIG5vdywgc28gd2UgY2FuCisgIC8vIGZyZWVseSBjYWxsIHRoZW0uCisgIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBWZXJpZnlBbmRDbGVhcigpIHdvcmtzIHdoZW4gdGhlIHZlcmlmaWNhdGlvbiBmYWlscy4KK1RFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LCBGYWlsdXJlKSB7CisgIE1vY2tCIGI7CisgIE9OX0NBTEwoYiwgRG9CKF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKDEpKTsKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKKworICBiLkRvQigxKTsKKyAgYm9vbCByZXN1bHQgPSB0cnVlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShyZXN1bHQgPSBNb2NrOjpWZXJpZnlBbmRDbGVhcigmYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3R1YWw6IG5ldmVyIGNhbGxlZCIpOworICBBU1NFUlRfRkFMU0UocmVzdWx0KTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXhwZWN0YXRpb25zIG9uIHRoZSBtZXRob2RzIG5vdywgc28gd2UgY2FuCisgIC8vIGZyZWVseSBjYWxsIHRoZW0uCisgIEVYUEVDVF9FUSgwLCBiLkRvQigpKTsKKyAgRVhQRUNUX0VRKDAsIGIuRG9CKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBWZXJpZnlBbmRDbGVhcigpIHdvcmtzIHdoZW4gdGhlIGRlZmF1bHQgYWN0aW9ucyBhbmQKKy8vIGV4cGVjdGF0aW9ucyBhcmUgc2V0IG9uIGEgY29uc3QgbW9jayBvYmplY3QuCitURVNUKFZlcmlmeUFuZENsZWFyVGVzdCwgQ29uc3QpIHsKKyAgTW9ja0IgYjsKKyAgT05fQ0FMTChDb25zdChiKSwgRG9CKCkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworCisgIEVYUEVDVF9DQUxMKENvbnN0KGIpLCBEb0IoKSkKKyAgICAgIC5XaWxsT25jZShEb0RlZmF1bHQoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOworCisgIGIuRG9CKCk7CisgIGIuRG9CKCk7CisgIEFTU0VSVF9UUlVFKE1vY2s6OlZlcmlmeUFuZENsZWFyKCZiKSk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGV4cGVjdGF0aW9ucyBvbiB0aGUgbWV0aG9kcyBub3csIHNvIHdlIGNhbgorICAvLyBmcmVlbHkgY2FsbCB0aGVtLgorICBFWFBFQ1RfRVEoMCwgYi5Eb0IoKSk7CisgIEVYUEVDVF9FUSgwLCBiLkRvQigxKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2UgY2FuIHNldCBkZWZhdWx0IGFjdGlvbnMgYW5kIGV4cGVjdGF0aW9ucyBvbiBhIG1vY2sKKy8vIG9iamVjdCBhZnRlciBWZXJpZnlBbmRDbGVhcigpIGhhcyBiZWVuIGNhbGxlZCBvbiBpdC4KK1RFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LCBDYW5TZXREZWZhdWx0QWN0aW9uc0FuZEV4cGVjdGF0aW9uc0FmdGVyd2FyZHMpIHsKKyAgTW9ja0IgYjsKKyAgT05fQ0FMTChiLCBEb0IoKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7CisgIEVYUEVDVF9DQUxMKGIsIERvQihfKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oMikpOworICBiLkRvQigxKTsKKworICBNb2NrOjpWZXJpZnlBbmRDbGVhcigmYik7CisKKyAgRVhQRUNUX0NBTEwoYiwgRG9CKCkpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDMpKTsKKyAgT05fQ0FMTChiLCBEb0IoXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oNCkpOworCisgIEVYUEVDVF9FUSgzLCBiLkRvQigpKTsKKyAgRVhQRUNUX0VRKDQsIGIuRG9CKDEpKTsKK30KKworLy8gVGVzdHMgdGhhdCBjYWxsaW5nIFZlcmlmeUFuZENsZWFyKCkgb24gb25lIG1vY2sgb2JqZWN0IGRvZXMgbm90CisvLyBhZmZlY3Qgb3RoZXIgbW9jayBvYmplY3RzIChlaXRoZXIgb2YgdGhlIHNhbWUgdHlwZSBvciBub3QpLgorVEVTVChWZXJpZnlBbmRDbGVhclRlc3QsIERvZXNOb3RBZmZlY3RPdGhlck1vY2tPYmplY3RzKSB7CisgIE1vY2tBIGE7CisgIE1vY2tCIGIxOworICBNb2NrQiBiMjsKKworICBPTl9DQUxMKGEsIEJpbmFyeShfLCBfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7CisgIEVYUEVDVF9DQUxMKGEsIEJpbmFyeShfLCBfKSkKKyAgICAgIC5XaWxsT25jZShEb0RlZmF1bHQoKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKKworICBPTl9DQUxMKGIxLCBEb0IoKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxKSk7CisgIEVYUEVDVF9DQUxMKGIxLCBEb0IoXykpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKDIpKTsKKworICBPTl9DQUxMKGIyLCBEb0IoKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigzKSk7CisgIEVYUEVDVF9DQUxMKGIyLCBEb0IoXykpOworCisgIGIyLkRvQigwKTsKKyAgTW9jazo6VmVyaWZ5QW5kQ2xlYXIoJmIyKTsKKworICAvLyBWZXJpZmllcyB0aGF0IHRoZSBkZWZhdWx0IGFjdGlvbnMgYW5kIGV4cGVjdGF0aW9ucyBvZiBhIGFuZCBiMQorICAvLyBhcmUgc3RpbGwgaW4gZWZmZWN0LgorICBFWFBFQ1RfVFJVRShhLkJpbmFyeSgwLCAwKSk7CisgIEVYUEVDVF9GQUxTRShhLkJpbmFyeSgwLCAwKSk7CisKKyAgRVhQRUNUX0VRKDEsIGIxLkRvQigpKTsKKyAgRVhQRUNUX0VRKDIsIGIxLkRvQigwKSk7Cit9CisKK1RFU1QoVmVyaWZ5QW5kQ2xlYXJUZXN0LAorICAgICBEZXN0cm95aW5nQ2hhaW5lZE1vY2tzRG9lc05vdERlYWRsb2NrVGhyb3VnaEV4cGVjdGF0aW9ucykgeworICBsaW5rZWRfcHRyPE1vY2tBPiBhKG5ldyBNb2NrQSk7CisgIFJlZmVyZW5jZUhvbGRpbmdNb2NrIHRlc3RfbW9jazsKKworICAvLyBFWFBFQ1RfQ0FMTCBzdG9yZXMgYSByZWZlcmVuY2UgdG8gYSBpbnNpZGUgdGVzdF9tb2NrLgorICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2ssIEFjY2VwdFJlZmVyZW5jZShfKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShTZXRBcmdQb2ludGVlPDA+KGEpKTsKKworICAvLyBUaHJvdyBhd2F5IHRoZSByZWZlcmVuY2UgdG8gdGhlIG1vY2sgdGhhdCB3ZSBoYXZlIGluIGEuIEFmdGVyIHRoaXMsIHRoZQorICAvLyBvbmx5IHJlZmVyZW5jZSB0byBpdCBpcyBzdG9yZWQgYnkgdGVzdF9tb2NrLgorICBhLnJlc2V0KCk7CisKKyAgLy8gV2hlbiB0ZXN0X21vY2sgZ29lcyBvdXQgb2Ygc2NvcGUsIGl0IGRlc3Ryb3lzIHRoZSBsYXN0IHJlbWFpbmluZyByZWZlcmVuY2UKKyAgLy8gdG8gdGhlIG1vY2sgb2JqZWN0IG9yaWdpbmFsbHkgcG9pbnRlZCB0byBieSBhLiBUaGlzIHdpbGwgY2F1c2UgdGhlIE1vY2tBCisgIC8vIGRlc3RydWN0b3IgdG8gYmUgY2FsbGVkIGZyb20gaW5zaWRlIHRoZSBSZWZlcmVuY2VIb2xkaW5nTW9jayBkZXN0cnVjdG9yLgorICAvLyBUaGUgc3RhdGUgb2YgYWxsIG1vY2tzIGlzIHByb3RlY3RlZCBieSBhIHNpbmdsZSBnbG9iYWwgbG9jaywgYnV0IHRoZXJlCisgIC8vIHNob3VsZCBiZSBubyBkZWFkbG9jay4KK30KKworVEVTVChWZXJpZnlBbmRDbGVhclRlc3QsCisgICAgIERlc3Ryb3lpbmdDaGFpbmVkTW9ja3NEb2VzTm90RGVhZGxvY2tUaHJvdWdoRGVmYXVsdEFjdGlvbikgeworICBsaW5rZWRfcHRyPE1vY2tBPiBhKG5ldyBNb2NrQSk7CisgIFJlZmVyZW5jZUhvbGRpbmdNb2NrIHRlc3RfbW9jazsKKworICAvLyBPTl9DQUxMIHN0b3JlcyBhIHJlZmVyZW5jZSB0byBhIGluc2lkZSB0ZXN0X21vY2suCisgIE9OX0NBTEwodGVzdF9tb2NrLCBBY2NlcHRSZWZlcmVuY2UoXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChTZXRBcmdQb2ludGVlPDA+KGEpKTsKKworICAvLyBUaHJvdyBhd2F5IHRoZSByZWZlcmVuY2UgdG8gdGhlIG1vY2sgdGhhdCB3ZSBoYXZlIGluIGEuIEFmdGVyIHRoaXMsIHRoZQorICAvLyBvbmx5IHJlZmVyZW5jZSB0byBpdCBpcyBzdG9yZWQgYnkgdGVzdF9tb2NrLgorICBhLnJlc2V0KCk7CisKKyAgLy8gV2hlbiB0ZXN0X21vY2sgZ29lcyBvdXQgb2Ygc2NvcGUsIGl0IGRlc3Ryb3lzIHRoZSBsYXN0IHJlbWFpbmluZyByZWZlcmVuY2UKKyAgLy8gdG8gdGhlIG1vY2sgb2JqZWN0IG9yaWdpbmFsbHkgcG9pbnRlZCB0byBieSBhLiBUaGlzIHdpbGwgY2F1c2UgdGhlIE1vY2tBCisgIC8vIGRlc3RydWN0b3IgdG8gYmUgY2FsbGVkIGZyb20gaW5zaWRlIHRoZSBSZWZlcmVuY2VIb2xkaW5nTW9jayBkZXN0cnVjdG9yLgorICAvLyBUaGUgc3RhdGUgb2YgYWxsIG1vY2tzIGlzIHByb3RlY3RlZCBieSBhIHNpbmdsZSBnbG9iYWwgbG9jaywgYnV0IHRoZXJlCisgIC8vIHNob3VsZCBiZSBubyBkZWFkbG9jay4KK30KKworLy8gVGVzdHMgdGhhdCBhIG1vY2sgZnVuY3Rpb24ncyBhY3Rpb24gY2FuIGNhbGwgYSBtb2NrIGZ1bmN0aW9uCisvLyAoZWl0aGVyIHRoZSBzYW1lIGZ1bmN0aW9uIG9yIGEgZGlmZmVyZW50IG9uZSkgZWl0aGVyIGFzIGFuIGV4cGxpY2l0CisvLyBhY3Rpb24gb3IgYXMgYSBkZWZhdWx0IGFjdGlvbiB3aXRob3V0IGNhdXNpbmcgYSBkZWFkIGxvY2suICBJdAorLy8gdmVyaWZpZXMgdGhhdCB0aGUgYWN0aW9uIGlzIG5vdCBwZXJmb3JtZWQgaW5zaWRlIHRoZSBjcml0aWNhbAorLy8gc2VjdGlvbi4KK1RFU1QoU3luY2hyb25pemF0aW9uVGVzdCwgQ2FuQ2FsbE1vY2tNZXRob2RJbkFjdGlvbikgeworICBNb2NrQSBhOworICBNb2NrQyBjOworICBPTl9DQUxMKGEsIERvQShfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KElnbm9yZVJlc3VsdChJbnZva2VXaXRob3V0QXJncygmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTW9ja0M6Ok5vblZvaWRNZXRob2QpKSk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSk7CisgIEVYUEVDVF9DQUxMKGEsIERvQSgxKSkKKyAgICAgIC5XaWxsT25jZShJbnZva2UoJmEsICZNb2NrQTo6RG9BKSkKKyAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7CisgIEVYUEVDVF9DQUxMKGMsIE5vblZvaWRNZXRob2QoKSk7CisKKyAgYS5Eb0EoMSk7CisgIC8vIFRoaXMgd2lsbCBtYXRjaCB0aGUgc2Vjb25kIEVYUEVDVF9DQUxMKCkgYW5kIHRyaWdnZXIgYW5vdGhlciBhLkRvQSgxKSwKKyAgLy8gd2hpY2ggd2lsbCBpbiB0dXJuIG1hdGNoIHRoZSBmaXJzdCBFWFBFQ1RfQ0FMTCgpIGFuZCB0cmlnZ2VyIGEgY2FsbCB0bworICAvLyBjLk5vblZvaWRNZXRob2QoKSB0aGF0IHdhcyBzcGVjaWZpZWQgYnkgdGhlIE9OX0NBTEwoKSBzaW5jZSB0aGUgZmlyc3QKKyAgLy8gRVhQRUNUX0NBTEwoKSBkaWQgbm90IHNwZWNpZnkgYW4gYWN0aW9uLgorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQWxsb3dzIHRoZSB1c2VyIHRvIGRlZmluZSBoaXMgb3duIG1haW4gYW5kIHRoZW4gaW52b2tlIGdtb2NrX21haW4KKy8vIGZyb20gaXQuIFRoaXMgbWlnaHQgYmUgbmVjZXNzYXJ5IG9uIHNvbWUgcGxhdGZvcm1zIHdoaWNoIHJlcXVpcmUKKy8vIHNwZWNpZmljIHNldHVwIGFuZCB0ZWFyZG93bi4KKyNpZiBHTU9DS19SRU5BTUVfTUFJTgoraW50IGdtb2NrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjZWxzZQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjZW5kaWYgIC8vIEdNT0NLX1JFTkFNRV9NQUlOCisgIHRlc3Rpbmc6OkluaXRHb29nbGVNb2NrKCZhcmdjLCBhcmd2KTsKKworICAvLyBFbnN1cmVzIHRoYXQgdGhlIHRlc3RzIHBhc3Mgbm8gbWF0dGVyIHdoYXQgdmFsdWUgb2YKKyAgLy8gLS1nbW9ja19jYXRjaF9sZWFrZWRfbW9ja3MgYW5kIC0tZ21vY2tfdmVyYm9zZSB0aGUgdXNlciBzcGVjaWZpZXMuCisgIHRlc3Rpbmc6OkdNT0NLX0ZMQUcoY2F0Y2hfbGVha2VkX21vY2tzKSA9IHRydWU7CisgIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSkgPSB0ZXN0aW5nOjppbnRlcm5hbDo6a1dhcm5pbmdWZXJib3NpdHk7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX2FsbF90ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfYWxsX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkNmM0OQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX2FsbF90ZXN0LmNjCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcmsgKEdvb2dsZSBNb2NrKQorLy8KKy8vIFNvbWUgdXNlcnMgdXNlIGEgYnVpbGQgc3lzdGVtIHRoYXQgR29vZ2xlIE1vY2sgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LAorLy8geWV0IHRoZXkgc3RpbGwgd2FudCB0byBidWlsZCBhbmQgcnVuIEdvb2dsZSBNb2NrJ3Mgb3duIHRlc3RzLiAgVGhpcyBmaWxlCisvLyBpbmNsdWRlcyBtb3N0IHN1Y2ggdGVzdHMsIG1ha2luZyBpdCBlYXNpZXIgZm9yIHRoZXNlIHVzZXJzIHRvIG1haW50YWluCisvLyB0aGVpciBidWlsZCBzY3JpcHRzICh0aGV5IGp1c3QgbmVlZCB0byBidWlsZCB0aGlzIGZpbGUsIGV2ZW4gdGhvdWdoIHRoZQorLy8gYmVsb3cgbGlzdCBvZiBhY3R1YWwgKl90ZXN0LmNjIGZpbGVzIG1pZ2h0IGNoYW5nZSkuCisjaW5jbHVkZSAidGVzdC9nbW9jay1hY3Rpb25zX3Rlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9nbW9jay1jYXJkaW5hbGl0aWVzX3Rlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9nbW9jay1nZW5lcmF0ZWQtYWN0aW9uc190ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnNfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlsc190ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzX3Rlc3QuY2MiCisjaW5jbHVkZSAidGVzdC9nbW9jay1pbnRlcm5hbC11dGlsc190ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ21vY2stbWF0Y2hlcnNfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2dtb2NrLW1vcmUtYWN0aW9uc190ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ21vY2stbmljZS1zdHJpY3RfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2dtb2NrLXBvcnRfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2dtb2NrX3Rlc3QuY2MiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9ja19leF90ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfZXhfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZlZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfZXhfdGVzdC5jYwpAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxMywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyBHb29nbGUgTW9jaydzIGZ1bmN0aW9uYWxpdHkgdGhhdCBkZXBlbmRzIG9uIGV4Y2VwdGlvbnMuCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIHRlc3Rpbmc6Okhhc1N1YnN0cjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbjsKKworLy8gQSB0eXBlIHRoYXQgY2Fubm90IGJlIGRlZmF1bHQgY29uc3RydWN0ZWQuCitjbGFzcyBOb25EZWZhdWx0Q29uc3RydWN0aWJsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBOb25EZWZhdWx0Q29uc3RydWN0aWJsZShpbnQgLyogZHVtbXkgKi8pIHt9Cit9OworCitjbGFzcyBNb2NrRm9vIHsKKyBwdWJsaWM6CisgIC8vIEEgbW9jayBtZXRob2QgdGhhdCByZXR1cm5zIGEgdXNlci1kZWZpbmVkIHR5cGUuICBHb29nbGUgTW9jaworICAvLyBkb2Vzbid0IGtub3cgd2hhdCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyB0eXBlIGlzLgorICBNT0NLX01FVEhPRDAoR2V0Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUsIE5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKCkpOworfTsKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK1RFU1QoRGVmYXVsdFZhbHVlVGVzdCwgVGhyb3dzUnVudGltZUVycm9yV2hlbk5vRGVmYXVsdFZhbHVlKSB7CisgIE1vY2tGb28gbW9jazsKKyAgdHJ5IHsKKyAgICAvLyBObyBleHBlY3RhdGlvbiBpcyBzZXQgb24gdGhpcyBtZXRob2QsIHNvIEdvb2dsZSBNb2NrIG11c3QKKyAgICAvLyByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuICBIb3dldmVyLCBzaW5jZSBHb29nbGUgTW9jayBrbm93cworICAgIC8vIG5vdGhpbmcgYWJvdXQgdGhlIHJldHVybiB0eXBlLCBpdCBkb2Vzbid0IGtub3cgd2hhdCB0byByZXR1cm4sCisgICAgLy8gYW5kIGhhcyB0byB0aHJvdyAod2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkKSBvciBhYm9ydAorICAgIC8vIChvdGhlcndpc2UpLgorICAgIG1vY2suR2V0Tm9uRGVmYXVsdENvbnN0cnVjdGlibGUoKTsKKyAgICBGQUlMKCkgPDwgIkdldE5vbkRlZmF1bHRDb25zdHJ1Y3RpYmxlKCkncyByZXR1cm4gdHlwZSBoYXMgbm8gZGVmYXVsdCAiCisgICAgICAgICAgIDw8ICJ2YWx1ZSwgc28gR29vZ2xlIE1vY2sgc2hvdWxkIGhhdmUgdGhyb3duLiI7CisgIH0gY2F0Y2ggKGNvbnN0IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uJiAvKiB1bnVzZWQgKi8pIHsKKyAgICBGQUlMKCkgPDwgIkdvb2dsZSBUZXN0IGRvZXMgbm90IHRyeSB0byBjYXRjaCBhbiBleGNlcHRpb24gb2YgdHlwZSAiCisgICAgICAgICAgIDw8ICJHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiwgd2hpY2ggaXMgdXNlZCBmb3IgcmVwb3J0aW5nICIKKyAgICAgICAgICAgPDwgImEgZmFpbHVyZSB0byBvdGhlciB0ZXN0aW5nIGZyYW1ld29ya3MuICBHb29nbGUgTW9jayBzaG91bGQgIgorICAgICAgICAgICA8PCAibm90IHRocm93IGEgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24gYXMgaXQgd2lsbCBraWxsIHRoZSAiCisgICAgICAgICAgIDw8ICJlbnRpcmUgdGVzdCBwcm9ncmFtIGluc3RlYWQgb2YganVzdCB0aGUgY3VycmVudCBURVNULiI7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgeworICAgIEVYUEVDVF9USEFUKGV4LndoYXQoKSwgSGFzU3Vic3RyKCJoYXMgbm8gZGVmYXVsdCB2YWx1ZSIpKTsKKyAgfQorfQorCisjZW5kaWYKKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX2xlYWtfdGVzdC5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX2xlYWtfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OTc2ODBjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfbGVha190ZXN0LnB5CkBAIC0wLDAgKzEsMTA4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0cyB0aGF0IGxlYWtlZCBtb2NrIG9iamVjdHMgY2FuIGJlIGNhdWdodCBiZSBHb29nbGUgTW9jay4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworCitpbXBvcnQgZ21vY2tfdGVzdF91dGlscworCisKK1BST0dSQU1fUEFUSCA9IGdtb2NrX3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKCdnbW9ja19sZWFrX3Rlc3RfJykKK1RFU1RfV0lUSF9FWFBFQ1RfQ0FMTCA9IFtQUk9HUkFNX1BBVEgsICctLWd0ZXN0X2ZpbHRlcj0qRXhwZWN0Q2FsbConXQorVEVTVF9XSVRIX09OX0NBTEwgPSBbUFJPR1JBTV9QQVRILCAnLS1ndGVzdF9maWx0ZXI9Kk9uQ2FsbConXQorVEVTVF9NVUxUSVBMRV9MRUFLUyA9IFtQUk9HUkFNX1BBVEgsICctLWd0ZXN0X2ZpbHRlcj0qTXVsdGlwbGVMZWFrZWQqJ10KKworZW52aXJvbiA9IGdtb2NrX3Rlc3RfdXRpbHMuZW52aXJvbgorU2V0RW52VmFyID0gZ21vY2tfdGVzdF91dGlscy5TZXRFbnZWYXIKKworIyBUZXN0cyBpbiB0aGlzIGZpbGUgcnVuIGEgR29vZ2xlLVRlc3QtYmFzZWQgdGVzdCBwcm9ncmFtIGFuZCBleHBlY3QgaXQKKyMgdG8gdGVybWluYXRlIHByZW1hdHVyZWx5LiAgVGhlcmVmb3JlIHRoZXkgYXJlIGluY29tcGF0aWJsZSB3aXRoCisjIHRoZSBwcmVtYXR1cmUtZXhpdC1maWxlIHByb3RvY29sIGJ5IGRlc2lnbi4gIFVuc2V0IHRoZQorIyBwcmVtYXR1cmUtZXhpdCBmaWxlcGF0aCB0byBwcmV2ZW50IEdvb2dsZSBUZXN0IGZyb20gY3JlYXRpbmcKKyMgdGhlIGZpbGUuCitTZXRFbnZWYXIoZ21vY2tfdGVzdF91dGlscy5QUkVNQVRVUkVfRVhJVF9GSUxFX0VOVl9WQVIsIE5vbmUpCisKKworY2xhc3MgR01vY2tMZWFrVGVzdChnbW9ja190ZXN0X3V0aWxzLlRlc3RDYXNlKToKKworICBkZWYgdGVzdENhdGNoZXNMZWFrZWRNb2NrQnlEZWZhdWx0KHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCisgICAgICAgIDAsCisgICAgICAgIGdtb2NrX3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhURVNUX1dJVEhfRVhQRUNUX0NBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52aXJvbikuZXhpdF9jb2RlKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCisgICAgICAgIDAsCisgICAgICAgIGdtb2NrX3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhURVNUX1dJVEhfT05fQ0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnZpcm9uKS5leGl0X2NvZGUpCisKKyAgZGVmIHRlc3REb2VzTm90Q2F0Y2hMZWFrZWRNb2NrV2hlbkRpc2FibGVkKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAwLAorICAgICAgICBnbW9ja190ZXN0X3V0aWxzLlN1YnByb2Nlc3MoVEVTVF9XSVRIX0VYUEVDVF9DQUxMICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLS1nbW9ja19jYXRjaF9sZWFrZWRfbW9ja3M9MCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLmV4aXRfY29kZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgMCwKKyAgICAgICAgZ21vY2tfdGVzdF91dGlscy5TdWJwcm9jZXNzKFRFU1RfV0lUSF9PTl9DQUxMICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLS1nbW9ja19jYXRjaF9sZWFrZWRfbW9ja3M9MCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLmV4aXRfY29kZSkKKworICBkZWYgdGVzdENhdGNoZXNMZWFrZWRNb2NrV2hlbkVuYWJsZWQoc2VsZik6CisgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgMCwKKyAgICAgICAgZ21vY2tfdGVzdF91dGlscy5TdWJwcm9jZXNzKFRFU1RfV0lUSF9FWFBFQ1RfQ0FMTCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy0tZ21vY2tfY2F0Y2hfbGVha2VkX21vY2tzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52aXJvbikuZXhpdF9jb2RlKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCisgICAgICAgIDAsCisgICAgICAgIGdtb2NrX3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhURVNUX1dJVEhfT05fQ0FMTCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy0tZ21vY2tfY2F0Y2hfbGVha2VkX21vY2tzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52aXJvbikuZXhpdF9jb2RlKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc0xlYWtlZE1vY2tXaGVuRW5hYmxlZFdpdGhFeHBsaWN0RmxhZ1ZhbHVlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCisgICAgICAgIDAsCisgICAgICAgIGdtb2NrX3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhURVNUX1dJVEhfRVhQRUNUX0NBTEwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyctLWdtb2NrX2NhdGNoX2xlYWtlZF9tb2Nrcz0xJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52aXJvbikuZXhpdF9jb2RlKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc011bHRpcGxlTGVha2VkTW9ja3Moc2VsZik6CisgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgMCwKKyAgICAgICAgZ21vY2tfdGVzdF91dGlscy5TdWJwcm9jZXNzKFRFU1RfTVVMVElQTEVfTEVBS1MgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyctLWdtb2NrX2NhdGNoX2xlYWtlZF9tb2NrcyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLmV4aXRfY29kZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBnbW9ja190ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfbGVha190ZXN0Xy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX2xlYWtfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyN2QyMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX2xlYWtfdGVzdF8uY2MKQEAgLTAsMCArMSwxMDAgQEAKKy8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZm9yIHZlcmlmeWluZyB0aGF0IGEgbGVha2VkIG1vY2sgb2JqZWN0IGNhbiBiZQorLy8gY2F1Z2h0IGJ5IEdvb2dsZSBNb2NrJ3MgbGVhayBkZXRlY3Rvci4KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworCitjbGFzcyBGb29JbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Rm9vSW50ZXJmYWNlKCkge30KKyAgdmlydHVhbCB2b2lkIERvVGhpcygpID0gMDsKK307CisKK2NsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE1vY2tGb28oKSB7fQorCisgIE1PQ0tfTUVUSE9EMChEb1RoaXMsIHZvaWQoKSk7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGb28pOworfTsKKworVEVTVChMZWFrVGVzdCwgTGVha2VkTW9ja1dpdGhFeHBlY3RDYWxsQ2F1c2VzRmFpbHVyZVdoZW5MZWFrQ2hlY2tpbmdJc0VuYWJsZWQpIHsKKyAgTW9ja0ZvbyogZm9vID0gbmV3IE1vY2tGb287CisKKyAgRVhQRUNUX0NBTEwoKmZvbywgRG9UaGlzKCkpOworICBmb28tPkRvVGhpcygpOworCisgIC8vIEluIG9yZGVyIHRvIHRlc3QgdGhlIGxlYWsgZGV0ZWN0b3IsIHdlIGRlbGliZXJhdGVseSBsZWFrIGZvby4KKworICAvLyBNYWtlcyBzdXJlIEdvb2dsZSBNb2NrJ3MgbGVhayBkZXRlY3RvciBjYW4gY2hhbmdlIHRoZSBleGl0IGNvZGUKKyAgLy8gdG8gMSBldmVuIHdoZW4gdGhlIGNvZGUgaXMgYWxyZWFkeSBleGl0aW5nIHdpdGggMC4KKyAgZXhpdCgwKTsKK30KKworVEVTVChMZWFrVGVzdCwgTGVha2VkTW9ja1dpdGhPbkNhbGxDYXVzZXNGYWlsdXJlV2hlbkxlYWtDaGVja2luZ0lzRW5hYmxlZCkgeworICBNb2NrRm9vKiBmb28gPSBuZXcgTW9ja0ZvbzsKKworICBPTl9DQUxMKCpmb28sIERvVGhpcygpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKKworICAvLyBJbiBvcmRlciB0byB0ZXN0IHRoZSBsZWFrIGRldGVjdG9yLCB3ZSBkZWxpYmVyYXRlbHkgbGVhayBmb28uCisKKyAgLy8gTWFrZXMgc3VyZSBHb29nbGUgTW9jaydzIGxlYWsgZGV0ZWN0b3IgY2FuIGNoYW5nZSB0aGUgZXhpdCBjb2RlCisgIC8vIHRvIDEgZXZlbiB3aGVuIHRoZSBjb2RlIGlzIGFscmVhZHkgZXhpdGluZyB3aXRoIDAuCisgIGV4aXQoMCk7Cit9CisKK1RFU1QoTGVha1Rlc3QsIENhdGNoZXNNdWx0aXBsZUxlYWtlZE1vY2tPYmplY3RzKSB7CisgIE1vY2tGb28qIGZvbzEgPSBuZXcgTW9ja0ZvbzsKKyAgTW9ja0ZvbyogZm9vMiA9IG5ldyBNb2NrRm9vOworCisgIE9OX0NBTEwoKmZvbzEsIERvVGhpcygpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKKyAgRVhQRUNUX0NBTEwoKmZvbzIsIERvVGhpcygpKTsKKyAgZm9vMi0+RG9UaGlzKCk7CisKKyAgLy8gSW4gb3JkZXIgdG8gdGVzdCB0aGUgbGVhayBkZXRlY3Rvciwgd2UgZGVsaWJlcmF0ZWx5IGxlYWsgZm9vMSBhbmQKKyAgLy8gZm9vMi4KKworICAvLyBNYWtlcyBzdXJlIEdvb2dsZSBNb2NrJ3MgbGVhayBkZXRlY3RvciBjYW4gY2hhbmdlIHRoZSBleGl0IGNvZGUKKyAgLy8gdG8gMSBldmVuIHdoZW4gdGhlIGNvZGUgaXMgYWxyZWFkeSBleGl0aW5nIHdpdGggMC4KKyAgZXhpdCgwKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9ja19saW5rMl90ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfbGluazJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMxMGMzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfbGluazJfdGVzdC5jYwpAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBmb3IgdmVyaWZ5aW5nIHRoYXQgdmFyaW91cyBHb29nbGUgTW9jayBjb25zdHJ1Y3RzIGRvIG5vdAorLy8gcHJvZHVjZSBsaW5rZXIgZXJyb3JzIHdoZW4gaW5zdGFudGlhdGVkIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cy4KKy8vIFBsZWFzZSBzZWUgZ21vY2tfbGlua190ZXN0LmggZm9yIGRldGFpbHMuCisKKyNkZWZpbmUgTGlua1Rlc3QgTGlua1Rlc3QyCisKKyNpbmNsdWRlICAidGVzdC9nbW9ja19saW5rX3Rlc3QuaCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX2xpbmtfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX2xpbmtfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWU5N2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfbGlua190ZXN0LmNjCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCisvLworLy8gVGhpcyBmaWxlIGlzIGZvciB2ZXJpZnlpbmcgdGhhdCB2YXJpb3VzIEdvb2dsZSBNb2NrIGNvbnN0cnVjdHMgZG8gbm90CisvLyBwcm9kdWNlIGxpbmtlciBlcnJvcnMgd2hlbiBpbnN0YW50aWF0ZWQgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzLgorLy8gUGxlYXNlIHNlZSBnbW9ja19saW5rX3Rlc3QuaCBmb3IgZGV0YWlscy4KKworI2RlZmluZSBMaW5rVGVzdCBMaW5rVGVzdDEKKworI2luY2x1ZGUgICJ0ZXN0L2dtb2NrX2xpbmtfdGVzdC5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfbGlua190ZXN0LmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9ja19saW5rX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjU1ZjViCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfbGlua190ZXN0LmgKQEAgLTAsMCArMSw2NjkgQEAKKy8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhhdDoKKy8vIGEuIEEgaGVhZGVyIGZpbGUgZGVmaW5pbmcgYSBtb2NrIGNsYXNzIGNhbiBiZSBpbmNsdWRlZCBpbiBtdWx0aXBsZQorLy8gICAgdHJhbnNsYXRpb24gdW5pdHMgd2l0aG91dCBjYXVzaW5nIGEgbGluayBlcnJvci4KKy8vIGIuIEFjdGlvbnMgYW5kIG1hdGNoZXJzIGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBpZGVudGljYWwgdGVtcGxhdGUKKy8vICAgIGFyZ3VtZW50cyBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgd2l0aG91dCBjYXVzaW5nIGxpbmsKKy8vICAgIGVycm9ycy4KKy8vICAgIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBhcmUgY3VycmVudGx5IHRlc3RlZDoKKy8vICAgIEFjdGlvbnM6CisvLyAgICAgIFJldHVybigpCisvLyAgICAgIFJldHVybih2YWx1ZSkKKy8vICAgICAgUmV0dXJuTnVsbAorLy8gICAgICBSZXR1cm5SZWYKKy8vICAgICAgQXNzaWduCisvLyAgICAgIFNldEFyZ1BvaW50ZWUKKy8vICAgICAgU2V0QXJyYXlBcmd1bWVudAorLy8gICAgICBTZXRFcnJub0FuZFJldHVybgorLy8gICAgICBJbnZva2UoZnVuY3Rpb24pCisvLyAgICAgIEludm9rZShvYmplY3QsIG1ldGhvZCkKKy8vICAgICAgSW52b2tlV2l0aG91dEFyZ3MoZnVuY3Rpb24pCisvLyAgICAgIEludm9rZVdpdGhvdXRBcmdzKG9iamVjdCwgbWV0aG9kKQorLy8gICAgICBJbnZva2VBcmd1bWVudAorLy8gICAgICBXaXRoQXJnCisvLyAgICAgIFdpdGhBcmdzCisvLyAgICAgIFdpdGhvdXRBcmdzCisvLyAgICAgIERvQWxsCisvLyAgICAgIERvRGVmYXVsdAorLy8gICAgICBJZ25vcmVSZXN1bHQKKy8vICAgICAgVGhyb3cKKy8vICAgICAgQUNUSU9OKCktZ2VuZXJhdGVkCisvLyAgICAgIEFDVElPTl9QKCktZ2VuZXJhdGVkCisvLyAgICAgIEFDVElPTl9QMigpLWdlbmVyYXRlZAorLy8gICAgTWF0Y2hlcnM6CisvLyAgICAgIF8KKy8vICAgICAgQQorLy8gICAgICBBbgorLy8gICAgICBFcQorLy8gICAgICBHdCwgTHQsIEdlLCBMZSwgTmUKKy8vICAgICAgTm90TnVsbAorLy8gICAgICBSZWYKKy8vICAgICAgVHlwZWRFcQorLy8gICAgICBEb3VibGVFcQorLy8gICAgICBGbG9hdEVxCisvLyAgICAgIE5hblNlbnNpdGl2ZURvdWJsZUVxCisvLyAgICAgIE5hblNlbnNpdGl2ZUZsb2F0RXEKKy8vICAgICAgQ29udGFpbnNSZWdleAorLy8gICAgICBNYXRjaGVzUmVnZXgKKy8vICAgICAgRW5kc1dpdGgKKy8vICAgICAgSGFzU3Vic3RyCisvLyAgICAgIFN0YXJ0c1dpdGgKKy8vICAgICAgU3RyQ2FzZUVxCisvLyAgICAgIFN0ckNhc2VOZQorLy8gICAgICBTdHJFcQorLy8gICAgICBTdHJOZQorLy8gICAgICBFbGVtZW50c0FyZQorLy8gICAgICBFbGVtZW50c0FyZUFycmF5CisvLyAgICAgIENvbnRhaW5lckVxCisvLyAgICAgIEZpZWxkCisvLyAgICAgIFByb3BlcnR5CisvLyAgICAgIFJlc3VsdE9mKGZ1bmN0aW9uKQorLy8gICAgICBQb2ludGVlCisvLyAgICAgIFRydWx5KHByZWRpY2F0ZSkKKy8vICAgICAgQWxsT2YKKy8vICAgICAgQW55T2YKKy8vICAgICAgTm90CisvLyAgICAgIE1hdGNoZXJDYXN0PFQ+CisvLworLy8gIFBsZWFzZSBub3RlOiB0aGlzIHRlc3QgZG9lcyBub3QgdmVyaWZ5IHRoZSBmdW5jdGlvbmluZyBvZiB0aGVzZQorLy8gIGNvbnN0cnVjdHMsIG9ubHkgdGhhdCB0aGUgcHJvZ3JhbXMgdXNpbmcgdGhlbSB3aWxsIGxpbmsgc3VjY2Vzc2Z1bGx5LgorLy8KKy8vIEltcGxlbWVudGF0aW9uIG5vdGU6CisvLyBUaGlzIHRlc3QgcmVxdWlyZXMgaWRlbnRpY2FsIGRlZmluaXRpb25zIG9mIEludGVyZmFjZSBhbmQgTW9jayB0byBiZQorLy8gaW5jbHVkZWQgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzLiAgV2UgYWNoaWV2ZSB0aGlzIGJ5IHdyaXRpbmcKKy8vIHRoZW0gaW4gdGhpcyBoZWFkZXIgYW5kICNpbmNsdWRpbmcgaXQgaW4gZ21vY2tfbGlua190ZXN0LmNjIGFuZAorLy8gZ21vY2tfbGluazJfdGVzdC5jYy4gIEJlY2F1c2UgdGhlIHN5bWJvbHMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IKKy8vIHRob3NlIGNvbnN0cnVjdHMgbXVzdCBiZSBpZGVudGljYWwgaW4gYm90aCB0cmFuc2xhdGlvbiB1bml0cywKKy8vIGRlZmluaXRpb25zIG9mIEludGVyZmFjZSBhbmQgTW9jayB0ZXN0cyBNVVNUIGJlIGtlcHQgaW4gdGhlIFNBTUUKKy8vIE5PTi1BTk9OWU1PVVMgbmFtZXNwYWNlIGluIHRoaXMgZmlsZS4gIFRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MgTGlua1Rlc3QKKy8vIGlzIGRlZmluZWQgYXMgTGlua1Rlc3QxIGluIGdtb2NrX2xpbmtfdGVzdC5jYyBhbmQgYXMgTGlua1Rlc3QyIGluCisvLyBnbW9ja19saW5rMl90ZXN0LmNjIHRvIGF2b2lkIHByb2R1Y2luZyBsaW5rZXIgZXJyb3JzLgorCisjaWZuZGVmIEdNT0NLX1RFU1RfR01PQ0tfTElOS19URVNUX0hfCisjZGVmaW5lIEdNT0NLX1RFU1RfR01PQ0tfTElOS19URVNUX0hfCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgdGVzdGluZzo6XzsKK3VzaW5nIHRlc3Rpbmc6OkE7Cit1c2luZyB0ZXN0aW5nOjpBbGxPZjsKK3VzaW5nIHRlc3Rpbmc6OkFueU9mOwordXNpbmcgdGVzdGluZzo6QXNzaWduOwordXNpbmcgdGVzdGluZzo6Q29udGFpbmVyRXE7Cit1c2luZyB0ZXN0aW5nOjpEb0FsbDsKK3VzaW5nIHRlc3Rpbmc6OkRvRGVmYXVsdDsKK3VzaW5nIHRlc3Rpbmc6OkRvdWJsZUVxOwordXNpbmcgdGVzdGluZzo6RWxlbWVudHNBcmU7Cit1c2luZyB0ZXN0aW5nOjpFbGVtZW50c0FyZUFycmF5OwordXNpbmcgdGVzdGluZzo6RW5kc1dpdGg7Cit1c2luZyB0ZXN0aW5nOjpFcTsKK3VzaW5nIHRlc3Rpbmc6OkZpZWxkOwordXNpbmcgdGVzdGluZzo6RmxvYXRFcTsKK3VzaW5nIHRlc3Rpbmc6OkdlOwordXNpbmcgdGVzdGluZzo6R3Q7Cit1c2luZyB0ZXN0aW5nOjpIYXNTdWJzdHI7Cit1c2luZyB0ZXN0aW5nOjpJZ25vcmVSZXN1bHQ7Cit1c2luZyB0ZXN0aW5nOjpJbnZva2U7Cit1c2luZyB0ZXN0aW5nOjpJbnZva2VBcmd1bWVudDsKK3VzaW5nIHRlc3Rpbmc6Okludm9rZVdpdGhvdXRBcmdzOwordXNpbmcgdGVzdGluZzo6SXNOdWxsOwordXNpbmcgdGVzdGluZzo6TGU7Cit1c2luZyB0ZXN0aW5nOjpMdDsKK3VzaW5nIHRlc3Rpbmc6Ok1hdGNoZXI7Cit1c2luZyB0ZXN0aW5nOjpNYXRjaGVyQ2FzdDsKK3VzaW5nIHRlc3Rpbmc6Ok5hblNlbnNpdGl2ZURvdWJsZUVxOwordXNpbmcgdGVzdGluZzo6TmFuU2Vuc2l0aXZlRmxvYXRFcTsKK3VzaW5nIHRlc3Rpbmc6Ok5lOwordXNpbmcgdGVzdGluZzo6Tm90OwordXNpbmcgdGVzdGluZzo6Tm90TnVsbDsKK3VzaW5nIHRlc3Rpbmc6OlBvaW50ZWU7Cit1c2luZyB0ZXN0aW5nOjpQcm9wZXJ0eTsKK3VzaW5nIHRlc3Rpbmc6OlJlZjsKK3VzaW5nIHRlc3Rpbmc6OlJlc3VsdE9mOwordXNpbmcgdGVzdGluZzo6UmV0dXJuOwordXNpbmcgdGVzdGluZzo6UmV0dXJuTnVsbDsKK3VzaW5nIHRlc3Rpbmc6OlJldHVyblJlZjsKK3VzaW5nIHRlc3Rpbmc6OlNldEFyZ1BvaW50ZWU7Cit1c2luZyB0ZXN0aW5nOjpTZXRBcnJheUFyZ3VtZW50OwordXNpbmcgdGVzdGluZzo6U3RhcnRzV2l0aDsKK3VzaW5nIHRlc3Rpbmc6OlN0ckNhc2VFcTsKK3VzaW5nIHRlc3Rpbmc6OlN0ckNhc2VOZTsKK3VzaW5nIHRlc3Rpbmc6OlN0ckVxOwordXNpbmcgdGVzdGluZzo6U3RyTmU7Cit1c2luZyB0ZXN0aW5nOjpUcnVseTsKK3VzaW5nIHRlc3Rpbmc6OlR5cGVkRXE7Cit1c2luZyB0ZXN0aW5nOjpXaXRoQXJnOwordXNpbmcgdGVzdGluZzo6V2l0aEFyZ3M7Cit1c2luZyB0ZXN0aW5nOjpXaXRob3V0QXJnczsKKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQordXNpbmcgdGVzdGluZzo6U2V0RXJybm9BbmRSZXR1cm47CisjZW5kaWYKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCit1c2luZyB0ZXN0aW5nOjpUaHJvdzsKKyNlbmRpZgorCit1c2luZyB0ZXN0aW5nOjpDb250YWluc1JlZ2V4OwordXNpbmcgdGVzdGluZzo6TWF0Y2hlc1JlZ2V4OworCitjbGFzcyBJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SW50ZXJmYWNlKCkge30KKyAgdmlydHVhbCB2b2lkIFZvaWRGcm9tU3RyaW5nKGNoYXIqIHN0cikgPSAwOworICB2aXJ0dWFsIGNoYXIqIFN0cmluZ0Zyb21TdHJpbmcoY2hhciogc3RyKSA9IDA7CisgIHZpcnR1YWwgaW50IEludEZyb21TdHJpbmcoY2hhciogc3RyKSA9IDA7CisgIHZpcnR1YWwgaW50JiBJbnRSZWZGcm9tU3RyaW5nKGNoYXIqIHN0cikgPSAwOworICB2aXJ0dWFsIHZvaWQgVm9pZEZyb21GdW5jKHZvaWQoKmZ1bmMpKGNoYXIqIHN0cikpID0gMDsKKyAgdmlydHVhbCB2b2lkIFZvaWRGcm9tSW50UmVmKGludCYgbikgPSAwOyAgLy8gTk9MSU5UCisgIHZpcnR1YWwgdm9pZCBWb2lkRnJvbUZsb2F0KGZsb2F0IG4pID0gMDsKKyAgdmlydHVhbCB2b2lkIFZvaWRGcm9tRG91YmxlKGRvdWJsZSBuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBWb2lkRnJvbVZlY3Rvcihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiB2KSA9IDA7Cit9OworCitjbGFzcyBNb2NrOiBwdWJsaWMgSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE1vY2soKSB7fQorCisgIE1PQ0tfTUVUSE9EMShWb2lkRnJvbVN0cmluZywgdm9pZChjaGFyKiBzdHIpKTsKKyAgTU9DS19NRVRIT0QxKFN0cmluZ0Zyb21TdHJpbmcsIGNoYXIqKGNoYXIqIHN0cikpOworICBNT0NLX01FVEhPRDEoSW50RnJvbVN0cmluZywgaW50KGNoYXIqIHN0cikpOworICBNT0NLX01FVEhPRDEoSW50UmVmRnJvbVN0cmluZywgaW50JihjaGFyKiBzdHIpKTsKKyAgTU9DS19NRVRIT0QxKFZvaWRGcm9tRnVuYywgdm9pZCh2b2lkKCpmdW5jKShjaGFyKiBzdHIpKSk7CisgIE1PQ0tfTUVUSE9EMShWb2lkRnJvbUludFJlZiwgdm9pZChpbnQmIG4pKTsgIC8vIE5PTElOVAorICBNT0NLX01FVEhPRDEoVm9pZEZyb21GbG9hdCwgdm9pZChmbG9hdCBuKSk7CisgIE1PQ0tfTUVUSE9EMShWb2lkRnJvbURvdWJsZSwgdm9pZChkb3VibGUgbikpOworICBNT0NLX01FVEhPRDEoVm9pZEZyb21WZWN0b3IsIHZvaWQoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgdikpOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrKTsKK307CisKK2NsYXNzIEludm9rZUhlbHBlciB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTdGF0aWNWb2lkRnJvbVZvaWQoKSB7fQorICB2b2lkIFZvaWRGcm9tVm9pZCgpIHt9CisgIHN0YXRpYyB2b2lkIFN0YXRpY1ZvaWRGcm9tU3RyaW5nKGNoYXIqIC8qIHN0ciAqLykge30KKyAgdm9pZCBWb2lkRnJvbVN0cmluZyhjaGFyKiAvKiBzdHIgKi8pIHt9CisgIHN0YXRpYyBpbnQgU3RhdGljSW50RnJvbVN0cmluZyhjaGFyKiAvKiBzdHIgKi8pIHsgcmV0dXJuIDE7IH0KKyAgc3RhdGljIGJvb2wgU3RhdGljQm9vbEZyb21TdHJpbmcoY29uc3QgY2hhciogLyogc3RyICovKSB7IHJldHVybiB0cnVlOyB9Cit9OworCitjbGFzcyBGaWVsZEhlbHBlciB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWVsZEhlbHBlcihpbnQgYV9maWVsZCkgOiBmaWVsZF8oYV9maWVsZCkge30KKyAgaW50IGZpZWxkKCkgY29uc3QgeyByZXR1cm4gZmllbGRfOyB9CisgIGludCBmaWVsZF87ICAvLyBOT0xJTlQgLS0gbmVlZCBleHRlcm5hbCBhY2Nlc3MgdG8gZmllbGRfIHRvIHRlc3QKKyAgICAgICAgICAgICAgIC8vICAgICAgICAgICB0aGUgRmllbGQgbWF0Y2hlci4KK307CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBSZXR1cm5Wb2lkIGFjdGlvbi4KK1RFU1QoTGlua1Rlc3QsIFRlc3RSZXR1cm5Wb2lkKSB7CisgIE1vY2sgbW9jazsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoUmV0dXJuKCkpOworICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgUmV0dXJuIGFjdGlvbi4KK1RFU1QoTGlua1Rlc3QsIFRlc3RSZXR1cm4pIHsKKyAgTW9jayBtb2NrOworICBjaGFyIGNoID0gJ3gnOworCisgIEVYUEVDVF9DQUxMKG1vY2ssIFN0cmluZ0Zyb21TdHJpbmcoXykpLldpbGxPbmNlKFJldHVybigmY2gpKTsKKyAgbW9jay5TdHJpbmdGcm9tU3RyaW5nKE5VTEwpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgUmV0dXJuTnVsbCBhY3Rpb24uCitURVNUKExpbmtUZXN0LCBUZXN0UmV0dXJuTnVsbCkgeworICBNb2NrIG1vY2s7CisKKyAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoXykpLldpbGxPbmNlKFJldHVybigpKTsKKyAgbW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFJldHVyblJlZiBhY3Rpb24uCitURVNUKExpbmtUZXN0LCBUZXN0UmV0dXJuUmVmKSB7CisgIE1vY2sgbW9jazsKKyAgaW50IG4gPSA0MjsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBJbnRSZWZGcm9tU3RyaW5nKF8pKS5XaWxsT25jZShSZXR1cm5SZWYobikpOworICBtb2NrLkludFJlZkZyb21TdHJpbmcoTlVMTCk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBBc3NpZ24gYWN0aW9uLgorVEVTVChMaW5rVGVzdCwgVGVzdEFzc2lnbikgeworICBNb2NrIG1vY2s7CisgIGNoYXIgY2ggPSAneCc7CisKKyAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoXykpLldpbGxPbmNlKEFzc2lnbigmY2gsICd5JykpOworICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgU2V0QXJnUG9pbnRlZSBhY3Rpb24uCitURVNUKExpbmtUZXN0LCBUZXN0U2V0QXJnUG9pbnRlZSkgeworICBNb2NrIG1vY2s7CisgIGNoYXIgY2ggPSAneCc7CisKKyAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoXykpLldpbGxPbmNlKFNldEFyZ1BvaW50ZWU8MD4oJ3knKSk7CisgIG1vY2suVm9pZEZyb21TdHJpbmcoJmNoKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFNldEFycmF5QXJndW1lbnQgYWN0aW9uLgorVEVTVChMaW5rVGVzdCwgVGVzdFNldEFycmF5QXJndW1lbnQpIHsKKyAgTW9jayBtb2NrOworICBjaGFyIGNoID0gJ3gnOworICBjaGFyIGNoMiA9ICd5JzsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoU2V0QXJyYXlBcmd1bWVudDwwPigmY2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2gyICsgMSkpOworICBtb2NrLlZvaWRGcm9tU3RyaW5nKCZjaCk7Cit9CisKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFNldEVycm5vQW5kUmV0dXJuIGFjdGlvbi4KK1RFU1QoTGlua1Rlc3QsIFRlc3RTZXRFcnJub0FuZFJldHVybikgeworICBNb2NrIG1vY2s7CisKKyAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87CisgIEVYUEVDVF9DQUxMKG1vY2ssIEludEZyb21TdHJpbmcoXykpLldpbGxPbmNlKFNldEVycm5vQW5kUmV0dXJuKDEsIC0xKSk7CisgIG1vY2suSW50RnJvbVN0cmluZyhOVUxMKTsKKyAgZXJybm8gPSBzYXZlZF9lcnJubzsKK30KKworI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEludm9rZShmdW5jdGlvbikgYW5kIEludm9rZShvYmplY3QsIG1ldGhvZCkgYWN0aW9ucy4KK1RFU1QoTGlua1Rlc3QsIFRlc3RJbnZva2UpIHsKKyAgTW9jayBtb2NrOworICBJbnZva2VIZWxwZXIgdGVzdF9pbnZva2VfaGVscGVyOworCisgIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZSgmSW52b2tlSGVscGVyOjpTdGF0aWNWb2lkRnJvbVN0cmluZykpCisgICAgICAuV2lsbE9uY2UoSW52b2tlKCZ0ZXN0X2ludm9rZV9oZWxwZXIsICZJbnZva2VIZWxwZXI6OlZvaWRGcm9tU3RyaW5nKSk7CisgIG1vY2suVm9pZEZyb21TdHJpbmcoTlVMTCk7CisgIG1vY2suVm9pZEZyb21TdHJpbmcoTlVMTCk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBJbnZva2VXaXRob3V0QXJncyBhY3Rpb24uCitURVNUKExpbmtUZXN0LCBUZXN0SW52b2tlV2l0aG91dEFyZ3MpIHsKKyAgTW9jayBtb2NrOworICBJbnZva2VIZWxwZXIgdGVzdF9pbnZva2VfaGVscGVyOworCisgIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKQorICAgICAgLldpbGxPbmNlKEludm9rZVdpdGhvdXRBcmdzKCZJbnZva2VIZWxwZXI6OlN0YXRpY1ZvaWRGcm9tVm9pZCkpCisgICAgICAuV2lsbE9uY2UoSW52b2tlV2l0aG91dEFyZ3MoJnRlc3RfaW52b2tlX2hlbHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW52b2tlSGVscGVyOjpWb2lkRnJvbVZvaWQpKTsKKyAgbW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKTsKKyAgbW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEludm9rZUFyZ3VtZW50IGFjdGlvbi4KK1RFU1QoTGlua1Rlc3QsIFRlc3RJbnZva2VBcmd1bWVudCkgeworICBNb2NrIG1vY2s7CisgIGNoYXIgY2ggPSAneCc7CisKKyAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21GdW5jKF8pKS5XaWxsT25jZShJbnZva2VBcmd1bWVudDwwPigmY2gpKTsKKyAgbW9jay5Wb2lkRnJvbUZ1bmMoSW52b2tlSGVscGVyOjpTdGF0aWNWb2lkRnJvbVN0cmluZyk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBXaXRoQXJnIGFjdGlvbi4KK1RFU1QoTGlua1Rlc3QsIFRlc3RXaXRoQXJnKSB7CisgIE1vY2sgbW9jazsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkKKyAgICAgIC5XaWxsT25jZShXaXRoQXJnPDA+KEludm9rZSgmSW52b2tlSGVscGVyOjpTdGF0aWNWb2lkRnJvbVN0cmluZykpKTsKKyAgbW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFdpdGhBcmdzIGFjdGlvbi4KK1RFU1QoTGlua1Rlc3QsIFRlc3RXaXRoQXJncykgeworICBNb2NrIG1vY2s7CisKKyAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoXykpCisgICAgICAuV2lsbE9uY2UoV2l0aEFyZ3M8MD4oSW52b2tlKCZJbnZva2VIZWxwZXI6OlN0YXRpY1ZvaWRGcm9tU3RyaW5nKSkpOworICBtb2NrLlZvaWRGcm9tU3RyaW5nKE5VTEwpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgV2l0aG91dEFyZ3MgYWN0aW9uLgorVEVTVChMaW5rVGVzdCwgVGVzdFdpdGhvdXRBcmdzKSB7CisgIE1vY2sgbW9jazsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoV2l0aG91dEFyZ3MoUmV0dXJuKCkpKTsKKyAgbW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIERvQWxsIGFjdGlvbi4KK1RFU1QoTGlua1Rlc3QsIFRlc3REb0FsbCkgeworICBNb2NrIG1vY2s7CisgIGNoYXIgY2ggPSAneCc7CisKKyAgRVhQRUNUX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoXykpCisgICAgICAuV2lsbE9uY2UoRG9BbGwoU2V0QXJnUG9pbnRlZTwwPigneScpLCBSZXR1cm4oKSkpOworICBtb2NrLlZvaWRGcm9tU3RyaW5nKCZjaCk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBEb0RlZmF1bHQgYWN0aW9uLgorVEVTVChMaW5rVGVzdCwgVGVzdERvRGVmYXVsdCkgeworICBNb2NrIG1vY2s7CisgIGNoYXIgY2ggPSAneCc7CisKKyAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKF8pKS5XaWxsT25jZShEb0RlZmF1bHQoKSk7CisgIG1vY2suVm9pZEZyb21TdHJpbmcoJmNoKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIElnbm9yZVJlc3VsdCBhY3Rpb24uCitURVNUKExpbmtUZXN0LCBUZXN0SWdub3JlUmVzdWx0KSB7CisgIE1vY2sgbW9jazsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoSWdub3JlUmVzdWx0KFJldHVybig0MikpKTsKKyAgbW9jay5Wb2lkRnJvbVN0cmluZyhOVUxMKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgVGhyb3cgYWN0aW9uLgorVEVTVChMaW5rVGVzdCwgVGVzdFRocm93KSB7CisgIE1vY2sgbW9jazsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbE9uY2UoVGhyb3coNDIpKTsKKyAgRVhQRUNUX1RIUk9XKG1vY2suVm9pZEZyb21TdHJpbmcoTlVMTCksIGludCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRoZSBBQ1RJT04qKCkgbWFjcm9zIHRyaWdnZXIgd2FybmluZyBDNDEwMCAodW5yZWZlcmVuY2VkIGZvcm1hbAorLy8gcGFyYW1ldGVyKSBpbiBNU1ZDIHdpdGggLVc0LiAgVW5mb3J0dW5hdGVseSB0aGV5IGNhbm5vdCBiZSBmaXhlZCBpbgorLy8gdGhlIG1hY3JvIGRlZmluaXRpb24sIGFzIHRoZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1hY3JvCisvLyBpcyBleHBhbmRlZCBhbmQgbWFjcm8gZXhwYW5zaW9uIGNhbm5vdCBjb250YWluICNwcmFnbWEuICBUaGVyZWZvcmUKKy8vIHdlIHN1cHByZXNzIHRoZW0gaGVyZS4KKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKQorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxMDApCisjZW5kaWYKKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgYWN0aW9ucyBjcmVhdGVkIHVzaW5nIEFDVElPTiBtYWNyby4KK25hbWVzcGFjZSB7CitBQ1RJT04oUmV0dXJuMSkgeyByZXR1cm4gMTsgfQorfQorCitURVNUKExpbmtUZXN0LCBUZXN0QWN0aW9uTWFjcm8pIHsKKyAgTW9jayBtb2NrOworCisgIEVYUEVDVF9DQUxMKG1vY2ssIEludEZyb21TdHJpbmcoXykpLldpbGxPbmNlKFJldHVybjEoKSk7CisgIG1vY2suSW50RnJvbVN0cmluZyhOVUxMKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgYWN0aW9ucyBjcmVhdGVkIHVzaW5nIEFDVElPTl9QIG1hY3JvLgorbmFtZXNwYWNlIHsKK0FDVElPTl9QKFJldHVybkFyZ3VtZW50LCByZXRfdmFsdWUpIHsgcmV0dXJuIHJldF92YWx1ZTsgfQorfQorCitURVNUKExpbmtUZXN0LCBUZXN0QWN0aW9uUE1hY3JvKSB7CisgIE1vY2sgbW9jazsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBJbnRGcm9tU3RyaW5nKF8pKS5XaWxsT25jZShSZXR1cm5Bcmd1bWVudCg0MikpOworICBtb2NrLkludEZyb21TdHJpbmcoTlVMTCk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIGFjdGlvbnMgY3JlYXRlZCB1c2luZyBBQ1RJT05fUDIgbWFjcm8uCituYW1lc3BhY2UgeworQUNUSU9OX1AyKFJldHVybkVxdWFsc0VpdGhlck9mLCBmaXJzdCwgc2Vjb25kKSB7CisgIHJldHVybiBhcmcwID09IGZpcnN0IHx8IGFyZzAgPT0gc2Vjb25kOworfQorfQorCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKK1RFU1QoTGlua1Rlc3QsIFRlc3RBY3Rpb25QMk1hY3JvKSB7CisgIE1vY2sgbW9jazsKKyAgY2hhciBjaCA9ICd4JzsKKworICBFWFBFQ1RfQ0FMTChtb2NrLCBJbnRGcm9tU3RyaW5nKF8pKQorICAgICAgLldpbGxPbmNlKFJldHVybkVxdWFsc0VpdGhlck9mKCJvbmUiLCAidHdvIikpOworICBtb2NrLkludEZyb21TdHJpbmcoJmNoKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlICJfIiBtYXRjaGVyLgorVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJBbnl0aGluZykgeworICBNb2NrIG1vY2s7CisKKyAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBBIG1hdGNoZXIuCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlckEpIHsKKyAgTW9jayBtb2NrOworCisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoQTxjaGFyKj4oKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgRXEgYW5kIHRoZSAiYmFyZSB2YWx1ZSIgbWF0Y2hlci4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyc0VxKSB7CisgIE1vY2sgbW9jazsKKyAgY29uc3QgY2hhciogcCA9ICJ4IjsKKworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKEVxKHApKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoY29uc3RfY2FzdDxjaGFyKj4oInkiKSkpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBMdCwgR3QsIExlLCBHZSwgYW5kIE5lIG1hdGNoZXJzLgorVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJzUmVsYXRpb25zKSB7CisgIE1vY2sgbW9jazsKKworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tRmxvYXQoTHQoMS4wZikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKKyAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbUZsb2F0KEd0KDEuMGYpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21GbG9hdChMZSgxLjBmKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tRmxvYXQoR2UoMS4wZikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKKyAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbUZsb2F0KE5lKDEuMGYpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBOb3ROdWxsIG1hdGNoZXIuCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlck5vdE51bGwpIHsKKyAgTW9jayBtb2NrOworCisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoTm90TnVsbCgpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBJc051bGwgbWF0Y2hlci4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVySXNOdWxsKSB7CisgIE1vY2sgbW9jazsKKworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKElzTnVsbCgpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBSZWYgbWF0Y2hlci4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyUmVmKSB7CisgIE1vY2sgbW9jazsKKyAgaW50IGEgPSAwOworCisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21JbnRSZWYoUmVmKGEpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBUeXBlZEVxIG1hdGNoZXIuCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlclR5cGVkRXEpIHsKKyAgTW9jayBtb2NrOworICBsb25nIGEgPSAwOworCisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21JbnRSZWYoVHlwZWRFcTxpbnQmPihhKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgRmxvYXRFcSwgRG91YmxlRXEsIE5hblNlbnNpdGl2ZUZsb2F0RXEgYW5kCisvLyBOYW5TZW5zaXRpdmVEb3VibGVFcSBtYXRjaGVycy4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyc0Zsb2F0aW5nUG9pbnQpIHsKKyAgTW9jayBtb2NrOworICBmbG9hdCBhID0gMDsKKworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tRmxvYXQoRmxvYXRFcShhKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tRG91YmxlKERvdWJsZUVxKGEpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21GbG9hdChOYW5TZW5zaXRpdmVGbG9hdEVxKGEpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21Eb3VibGUoTmFuU2Vuc2l0aXZlRG91YmxlRXEoYSkpKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgQ29udGFpbnNSZWdleCBtYXRjaGVyLgorVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJDb250YWluc1JlZ2V4KSB7CisgIE1vY2sgbW9jazsKKworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKENvbnRhaW5zUmVnZXgoIi4qIikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIE1hdGNoZXNSZWdleCBtYXRjaGVyLgorVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJNYXRjaGVzUmVnZXgpIHsKKyAgTW9jayBtb2NrOworCisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoTWF0Y2hlc1JlZ2V4KCIuKiIpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBTdGFydHNXaXRoLCBFbmRzV2l0aCwgYW5kIEhhc1N1YnN0ciBtYXRjaGVycy4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyc1N1YnN0cmluZ3MpIHsKKyAgTW9jayBtb2NrOworCisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoU3RhcnRzV2l0aCgiYSIpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoRW5kc1dpdGgoImMiKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKEhhc1N1YnN0cigiYiIpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBTdHJFcSwgU3RyTmUsIFN0ckNhc2VFcSwgYW5kIFN0ckNhc2VOZSBtYXRjaGVycy4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyc1N0cmluZ0VxdWFsaXR5KSB7CisgIE1vY2sgbW9jazsKKyAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVN0cmluZyhTdHJFcSgiYSIpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoU3RyTmUoImEiKSkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCkpOworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tU3RyaW5nKFN0ckNhc2VFcSgiYSIpKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oKSk7CisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21TdHJpbmcoU3RyQ2FzZU5lKCJhIikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEVsZW1lbnRzQXJlIG1hdGNoZXIuCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlckVsZW1lbnRzQXJlKSB7CisgIE1vY2sgbW9jazsKKworICBPTl9DQUxMKG1vY2ssIFZvaWRGcm9tVmVjdG9yKEVsZW1lbnRzQXJlKCdhJywgXykpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEVsZW1lbnRzQXJlQXJyYXkgbWF0Y2hlci4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyRWxlbWVudHNBcmVBcnJheSkgeworICBNb2NrIG1vY2s7CisgIGNoYXIgYXJyW10gPSB7ICdhJywgJ2InIH07CisKKyAgT05fQ0FMTChtb2NrLCBWb2lkRnJvbVZlY3RvcihFbGVtZW50c0FyZUFycmF5KGFycikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIENvbnRhaW5lckVxIG1hdGNoZXIuCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlckNvbnRhaW5lckVxKSB7CisgIE1vY2sgbW9jazsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2OworCisgIE9OX0NBTEwobW9jaywgVm9pZEZyb21WZWN0b3IoQ29udGFpbmVyRXEodikpKS5XaWxsQnlEZWZhdWx0KFJldHVybigpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEZpZWxkIG1hdGNoZXIuCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlckZpZWxkKSB7CisgIEZpZWxkSGVscGVyIGhlbHBlcigwKTsKKworICBNYXRjaGVyPGNvbnN0IEZpZWxkSGVscGVyJj4gbSA9IEZpZWxkKCZGaWVsZEhlbHBlcjo6ZmllbGRfLCBFcSgwKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcyhoZWxwZXIpKTsKKworICBNYXRjaGVyPGNvbnN0IEZpZWxkSGVscGVyKj4gbTIgPSBGaWVsZCgmRmllbGRIZWxwZXI6OmZpZWxkXywgRXEoMCkpOworICBFWFBFQ1RfVFJVRShtMi5NYXRjaGVzKCZoZWxwZXIpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIFByb3BlcnR5IG1hdGNoZXIuCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlclByb3BlcnR5KSB7CisgIEZpZWxkSGVscGVyIGhlbHBlcigwKTsKKworICBNYXRjaGVyPGNvbnN0IEZpZWxkSGVscGVyJj4gbSA9IFByb3BlcnR5KCZGaWVsZEhlbHBlcjo6ZmllbGQsIEVxKDApKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKGhlbHBlcikpOworCisgIE1hdGNoZXI8Y29uc3QgRmllbGRIZWxwZXIqPiBtMiA9IFByb3BlcnR5KCZGaWVsZEhlbHBlcjo6ZmllbGQsIEVxKDApKTsKKyAgRVhQRUNUX1RSVUUobTIuTWF0Y2hlcygmaGVscGVyKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBSZXN1bHRPZiBtYXRjaGVyLgorVEVTVChMaW5rVGVzdCwgVGVzdE1hdGNoZXJSZXN1bHRPZikgeworICBNYXRjaGVyPGNoYXIqPiBtID0gUmVzdWx0T2YoJkludm9rZUhlbHBlcjo6U3RhdGljSW50RnJvbVN0cmluZywgRXEoMSkpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoTlVMTCkpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgUmVzdWx0T2YgbWF0Y2hlci4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyUG9pbnRlZSkgeworICBpbnQgbiA9IDE7CisKKyAgTWF0Y2hlcjxpbnQqPiBtID0gUG9pbnRlZShFcSgxKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygmbikpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgVHJ1bHkgbWF0Y2hlci4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyVHJ1bHkpIHsKKyAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IFRydWx5KCZJbnZva2VIZWxwZXI6OlN0YXRpY0Jvb2xGcm9tU3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKE5VTEwpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIEFsbE9mIG1hdGNoZXIuCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlckFsbE9mKSB7CisgIE1hdGNoZXI8aW50PiBtID0gQWxsT2YoXywgRXEoMSkpOworICBFWFBFQ1RfVFJVRShtLk1hdGNoZXMoMSkpOworfQorCisvLyBUZXN0cyB0aGUgbGlua2FnZSBvZiB0aGUgQW55T2YgbWF0Y2hlci4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyQW55T2YpIHsKKyAgTWF0Y2hlcjxpbnQ+IG0gPSBBbnlPZihfLCBFcSgxKSk7CisgIEVYUEVDVF9UUlVFKG0uTWF0Y2hlcygxKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaW5rYWdlIG9mIHRoZSBOb3QgbWF0Y2hlci4KK1RFU1QoTGlua1Rlc3QsIFRlc3RNYXRjaGVyTm90KSB7CisgIE1hdGNoZXI8aW50PiBtID0gTm90KF8pOworICBFWFBFQ1RfRkFMU0UobS5NYXRjaGVzKDEpKTsKK30KKworLy8gVGVzdHMgdGhlIGxpbmthZ2Ugb2YgdGhlIE1hdGNoZXJDYXN0PFQ+KCkgZnVuY3Rpb24uCitURVNUKExpbmtUZXN0LCBUZXN0TWF0Y2hlckNhc3QpIHsKKyAgTWF0Y2hlcjxjb25zdCBjaGFyKj4gbSA9IE1hdGNoZXJDYXN0PGNvbnN0IGNoYXIqPihfKTsKKyAgRVhQRUNUX1RSVUUobS5NYXRjaGVzKE5VTEwpKTsKK30KKworI2VuZGlmICAvLyBHTU9DS19URVNUX0dNT0NLX0xJTktfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfb3V0cHV0X3Rlc3QucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9ja19vdXRwdXRfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lY2VkOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfb3V0cHV0X3Rlc3QucHkKQEAgLTAsMCArMSwxODAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIHRoZSB0ZXh0IG91dHB1dCBvZiBHb29nbGUgQysrIE1vY2tpbmcgRnJhbWV3b3JrLgorCitTWU5PUFNJUworICAgICAgIGdtb2NrX291dHB1dF90ZXN0LnB5IC0tYnVpbGRfZGlyPUJVSUxEL0RJUiAtLWdlbmdvbGRlbgorICAgICAgICAgIyB3aGVyZSBCVUlMRC9ESVIgY29udGFpbnMgdGhlIGJ1aWx0IGdtb2NrX291dHB1dF90ZXN0XyBmaWxlLgorICAgICAgIGdtb2NrX291dHB1dF90ZXN0LnB5IC0tZ2VuZ29sZGVuCisgICAgICAgZ21vY2tfb3V0cHV0X3Rlc3QucHkKKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworCitpbXBvcnQgZ21vY2tfdGVzdF91dGlscworCisKKyMgVGhlIGZsYWcgZm9yIGdlbmVyYXRpbmcgdGhlIGdvbGRlbiBmaWxlCitHRU5HT0xERU5fRkxBRyA9ICctLWdlbmdvbGRlbicKKworUFJPR1JBTV9QQVRIID0gZ21vY2tfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2dtb2NrX291dHB1dF90ZXN0XycpCitDT01NQU5EID0gW1BST0dSQU1fUEFUSCwgJy0tZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGg9MCcsICctLWd0ZXN0X3ByaW50X3RpbWU9MCddCitHT0xERU5fTkFNRSA9ICdnbW9ja19vdXRwdXRfdGVzdF9nb2xkZW4udHh0JworR09MREVOX1BBVEggPSBvcy5wYXRoLmpvaW4oZ21vY2tfdGVzdF91dGlscy5HZXRTb3VyY2VEaXIoKSwgR09MREVOX05BTUUpCisKKworZGVmIFRvVW5peExpbmVFbmRpbmcocyk6CisgICIiIkNoYW5nZXMgYWxsIFdpbmRvd3MvTWFjIGxpbmUgZW5kaW5ncyBpbiBzIHRvIFVOSVggbGluZSBlbmRpbmdzLiIiIgorCisgIHJldHVybiBzLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKS5yZXBsYWNlKCdccicsICdcbicpCisKKworZGVmIFJlbW92ZVJlcG9ydEhlYWRlckFuZEZvb3RlcihvdXRwdXQpOgorICAiIiJSZW1vdmVzIEdvb2dsZSBUZXN0IHJlc3VsdCByZXBvcnQncyBoZWFkZXIgYW5kIGZvb3RlciBmcm9tIHRoZSBvdXRwdXQuIiIiCisKKyAgb3V0cHV0ID0gcmUuc3ViKHInLipndGVzdF9tYWluLipcbicsICcnLCBvdXRwdXQpCisgIG91dHB1dCA9IHJlLnN1YihyJ1xbLipcZCsgdGVzdHMuKlxuJywgJycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInXFsuKiB0ZXN0IGVudmlyb25tZW50IC4qXG4nLCAnJywgb3V0cHV0KQorICBvdXRwdXQgPSByZS5zdWIocidcWz0rXF0gXGQrIHRlc3RzIC4qIHJhbi4qJywgJycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInLiogRkFJTEVEIFRFU1RTXG4nLCAnJywgb3V0cHV0KQorICByZXR1cm4gb3V0cHV0CisKKworZGVmIFJlbW92ZUxvY2F0aW9ucyhvdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gZnJvbSBhIEdvb2dsZSBUZXN0IHByb2dyYW0ncyBvdXRwdXQuCisKKyAgQXJnczoKKyAgICAgICBvdXRwdXQ6ICB0aGUgb3V0cHV0IG9mIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbS4KKworICBSZXR1cm5zOgorICAgICAgIG91dHB1dCB3aXRoIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gKGluIHRoZSBmb3JtIG9mCisgICAgICAgJ0RJUkVDVE9SWS9GSUxFX05BTUU6TElORV9OVU1CRVI6ICdvcgorICAgICAgICdESVJFQ1RPUllcXEZJTEVfTkFNRShMSU5FX05VTUJFUik6ICcpIHJlcGxhY2VkIGJ5CisgICAgICAgJ0ZJTEU6IzogJy4KKyAgIiIiCisKKyAgcmV0dXJuIHJlLnN1YihyJy4qWy9cXF0oLispKFw6XGQrfFwoXGQrXCkpXDonLCAnRklMRTojOicsIG91dHB1dCkKKworCitkZWYgTm9ybWFsaXplRXJyb3JNYXJrZXIob3V0cHV0KToKKyAgIiIiTm9ybWFsaXplcyB0aGUgZXJyb3IgbWFya2VyLCB3aGljaCBpcyBkaWZmZXJlbnQgb24gV2luZG93cyB2cyBvbiBMaW51eC4iIiIKKworICByZXR1cm4gcmUuc3ViKHInIGVycm9yOiAnLCAnIEZhaWx1cmVcbicsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlTWVtb3J5QWRkcmVzc2VzKG91dHB1dCk6CisgICIiIlJlbW92ZXMgbWVtb3J5IGFkZHJlc3NlcyBmcm9tIHRoZSB0ZXN0IG91dHB1dC4iIiIKKworICByZXR1cm4gcmUuc3ViKHInQFx3KycsICdAMHgjJywgb3V0cHV0KQorCisKK2RlZiBSZW1vdmVUZXN0TmFtZXNPZkxlYWtlZE1vY2tzKG91dHB1dCk6CisgICIiIlJlbW92ZXMgdGhlIHRlc3QgbmFtZXMgb2YgbGVha2VkIG1vY2sgb2JqZWN0cyBmcm9tIHRoZSB0ZXN0IG91dHB1dC4iIiIKKworICByZXR1cm4gcmUuc3ViKHInXCh1c2VkIGluIHRlc3QgLitcKSAnLCAnJywgb3V0cHV0KQorCisKK2RlZiBHZXRMZWFreVRlc3RzKG91dHB1dCk6CisgICIiIlJldHVybnMgYSBsaXN0IG9mIHRlc3QgbmFtZXMgdGhhdCBsZWFrIG1vY2sgb2JqZWN0cy4iIiIKKworICAjIGZpbmRhbGwoKSByZXR1cm5zIGEgbGlzdCBvZiBhbGwgbWF0Y2hlcyBvZiB0aGUgcmVnZXggaW4gb3V0cHV0LgorICAjIEZvciBleGFtcGxlLCBpZiAnKHVzZWQgaW4gdGVzdCBGb29UZXN0LkJhciknIGlzIGluIG91dHB1dCwgdGhlCisgICMgbGlzdCB3aWxsIGNvbnRhaW4gJ0Zvb1Rlc3QuQmFyJy4KKyAgcmV0dXJuIHJlLmZpbmRhbGwocidcKHVzZWQgaW4gdGVzdCAoLispXCknLCBvdXRwdXQpCisKKworZGVmIEdldE5vcm1hbGl6ZWRPdXRwdXRBbmRMZWFreVRlc3RzKG91dHB1dCk6CisgICIiIk5vcm1hbGl6ZXMgdGhlIG91dHB1dCBvZiBnbW9ja19vdXRwdXRfdGVzdF8uCisKKyAgQXJnczoKKyAgICBvdXRwdXQ6IFRoZSB0ZXN0IG91dHB1dC4KKworICBSZXR1cm5zOgorICAgIEEgdHVwbGUgKHRoZSBub3JtYWxpemVkIHRlc3Qgb3V0cHV0LCB0aGUgbGlzdCBvZiB0ZXN0IG5hbWVzIHRoYXQgaGF2ZQorICAgIGxlYWtlZCBtb2NrcykuCisgICIiIgorCisgIG91dHB1dCA9IFRvVW5peExpbmVFbmRpbmcob3V0cHV0KQorICBvdXRwdXQgPSBSZW1vdmVSZXBvcnRIZWFkZXJBbmRGb290ZXIob3V0cHV0KQorICBvdXRwdXQgPSBOb3JtYWxpemVFcnJvck1hcmtlcihvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZUxvY2F0aW9ucyhvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZU1lbW9yeUFkZHJlc3NlcyhvdXRwdXQpCisgIHJldHVybiAoUmVtb3ZlVGVzdE5hbWVzT2ZMZWFrZWRNb2NrcyhvdXRwdXQpLCBHZXRMZWFreVRlc3RzKG91dHB1dCkpCisKKworZGVmIEdldFNoZWxsQ29tbWFuZE91dHB1dChjbWQpOgorICAiIiJSdW5zIGEgY29tbWFuZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgcmV0dXJucyBpdHMgU1RET1VUIGluIGEgc3RyaW5nLiIiIgorCisgIHJldHVybiBnbW9ja190ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY21kLCBjYXB0dXJlX3N0ZGVycj1GYWxzZSkub3V0cHV0CisKKworZGVmIEdldE5vcm1hbGl6ZWRDb21tYW5kT3V0cHV0QW5kTGVha3lUZXN0cyhjbWQpOgorICAiIiJSdW5zIGEgY29tbWFuZCBhbmQgcmV0dXJucyBpdHMgbm9ybWFsaXplZCBvdXRwdXQgYW5kIGEgbGlzdCBvZiBsZWFreSB0ZXN0cy4KKworICBBcmdzOgorICAgIGNtZDogIHRoZSBzaGVsbCBjb21tYW5kLgorICAiIiIKKworICAjIERpc2FibGVzIGV4Y2VwdGlvbiBwb3AtdXBzIG9uIFdpbmRvd3MuCisgIG9zLmVudmlyb25bJ0dURVNUX0NBVENIX0VYQ0VQVElPTlMnXSA9ICcxJworICByZXR1cm4gR2V0Tm9ybWFsaXplZE91dHB1dEFuZExlYWt5VGVzdHMoR2V0U2hlbGxDb21tYW5kT3V0cHV0KGNtZCkpCisKKworY2xhc3MgR01vY2tPdXRwdXRUZXN0KGdtb2NrX3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgdGVzdE91dHB1dChzZWxmKToKKyAgICAob3V0cHV0LCBsZWFreV90ZXN0cykgPSBHZXROb3JtYWxpemVkQ29tbWFuZE91dHB1dEFuZExlYWt5VGVzdHMoQ09NTUFORCkKKyAgICBnb2xkZW5fZmlsZSA9IG9wZW4oR09MREVOX1BBVEgsICdyYicpCisgICAgZ29sZGVuID0gZ29sZGVuX2ZpbGUucmVhZCgpCisgICAgZ29sZGVuX2ZpbGUuY2xvc2UoKQorCisgICAgIyBUaGUgbm9ybWFsaXplZCBvdXRwdXQgc2hvdWxkIG1hdGNoIHRoZSBnb2xkZW4gZmlsZS4KKyAgICBzZWxmLmFzc2VydEVxdWFscyhnb2xkZW4sIG91dHB1dCkKKworICAgICMgVGhlIHJhdyBvdXRwdXQgc2hvdWxkIGNvbnRhaW4gMiBsZWFrZWQgbW9jayBvYmplY3QgZXJyb3JzIGZvcgorICAgICMgdGVzdCBHTW9ja091dHB1dFRlc3QuQ2F0Y2hlc0xlYWtlZE1vY2tzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsnR01vY2tPdXRwdXRUZXN0LkNhdGNoZXNMZWFrZWRNb2NrcycsCisgICAgICAgICAgICAgICAgICAgICAgICdHTW9ja091dHB1dFRlc3QuQ2F0Y2hlc0xlYWtlZE1vY2tzJ10sCisgICAgICAgICAgICAgICAgICAgICAgbGVha3lfdGVzdHMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgaWYgc3lzLmFyZ3ZbMTpdID09IFtHRU5HT0xERU5fRkxBR106CisgICAgKG91dHB1dCwgXykgPSBHZXROb3JtYWxpemVkQ29tbWFuZE91dHB1dEFuZExlYWt5VGVzdHMoQ09NTUFORCkKKyAgICBnb2xkZW5fZmlsZSA9IG9wZW4oR09MREVOX1BBVEgsICd3YicpCisgICAgZ29sZGVuX2ZpbGUud3JpdGUob3V0cHV0KQorICAgIGdvbGRlbl9maWxlLmNsb3NlKCkKKyAgZWxzZToKKyAgICBnbW9ja190ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfb3V0cHV0X3Rlc3RfLmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfb3V0cHV0X3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Y2JhMzQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9ja19vdXRwdXRfdGVzdF8uY2MKQEAgLTAsMCArMSwyOTEgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFRlc3RzIEdvb2dsZSBNb2NrJ3Mgb3V0cHV0IGluIHZhcmlvdXMgc2NlbmFyaW9zLiAgVGhpcyBlbnN1cmVzIHRoYXQKKy8vIEdvb2dsZSBNb2NrJ3MgbWVzc2FnZXMgYXJlIHJlYWRhYmxlIGFuZCB1c2VmdWwuCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyB0ZXN0aW5nOjpfOwordXNpbmcgdGVzdGluZzo6QW55TnVtYmVyOwordXNpbmcgdGVzdGluZzo6R2U7Cit1c2luZyB0ZXN0aW5nOjpJblNlcXVlbmNlOwordXNpbmcgdGVzdGluZzo6TmFnZ3lNb2NrOwordXNpbmcgdGVzdGluZzo6UmVmOwordXNpbmcgdGVzdGluZzo6UmV0dXJuOwordXNpbmcgdGVzdGluZzo6U2VxdWVuY2U7CisKK2NsYXNzIE1vY2tGb28geworIHB1YmxpYzoKKyAgTW9ja0ZvbygpIHt9CisKKyAgTU9DS19NRVRIT0QzKEJhciwgY2hhcihjb25zdCBzdGQ6OnN0cmluZyYgcywgaW50IGksIGRvdWJsZSB4KSk7CisgIE1PQ0tfTUVUSE9EMihCYXIyLCBib29sKGludCB4LCBpbnQgeSkpOworICBNT0NLX01FVEhPRDIoQmFyMywgdm9pZChpbnQgeCwgaW50IHkpKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Zvbyk7Cit9OworCitjbGFzcyBHTW9ja091dHB1dFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBOYWdneU1vY2s8TW9ja0Zvbz4gZm9vXzsKK307CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIEV4cGVjdGVkQ2FsbCkgeworICB0ZXN0aW5nOjpHTU9DS19GTEFHKHZlcmJvc2UpID0gImluZm8iOworCisgIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMCwgXykpOworICBmb29fLkJhcjIoMCwgMCk7ICAvLyBFeHBlY3RlZCBjYWxsCisKKyAgdGVzdGluZzo6R01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJ3YXJuaW5nIjsKK30KKworVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgRXhwZWN0ZWRDYWxsVG9Wb2lkRnVuY3Rpb24pIHsKKyAgdGVzdGluZzo6R01PQ0tfRkxBRyh2ZXJib3NlKSA9ICJpbmZvIjsKKworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIzKDAsIF8pKTsKKyAgZm9vXy5CYXIzKDAsIDApOyAgLy8gRXhwZWN0ZWQgY2FsbAorCisgIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSkgPSAid2FybmluZyI7Cit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIEV4cGxpY2l0QWN0aW9uc1J1bk91dCkgeworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKQorICAgICAgLlRpbWVzKDIpCisgICAgICAuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7CisgIGZvb18uQmFyMigyLCAyKTsKKyAgZm9vXy5CYXIyKDEsIDEpOyAgLy8gRXhwbGljaXQgYWN0aW9ucyBpbiBFWFBFQ1RfQ0FMTCBydW4gb3V0LgorfQorCitURVNUX0YoR01vY2tPdXRwdXRUZXN0LCBVbmV4cGVjdGVkQ2FsbCkgeworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIF8pKTsKKworICBmb29fLkJhcjIoMSwgMCk7ICAvLyBVbmV4cGVjdGVkIGNhbGwKKyAgZm9vXy5CYXIyKDAsIDApOyAgLy8gRXhwZWN0ZWQgY2FsbAorfQorCitURVNUX0YoR01vY2tPdXRwdXRUZXN0LCBVbmV4cGVjdGVkQ2FsbFRvVm9pZEZ1bmN0aW9uKSB7CisgIEVYUEVDVF9DQUxMKGZvb18sIEJhcjMoMCwgXykpOworCisgIGZvb18uQmFyMygxLCAwKTsgIC8vIFVuZXhwZWN0ZWQgY2FsbAorICBmb29fLkJhcjMoMCwgMCk7ICAvLyBFeHBlY3RlZCBjYWxsCit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIEV4Y2Vzc2l2ZUNhbGwpIHsKKyAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCBfKSk7CisKKyAgZm9vXy5CYXIyKDAsIDApOyAgLy8gRXhwZWN0ZWQgY2FsbAorICBmb29fLkJhcjIoMCwgMSk7ICAvLyBFeGNlc3NpdmUgY2FsbAorfQorCitURVNUX0YoR01vY2tPdXRwdXRUZXN0LCBFeGNlc3NpdmVDYWxsVG9Wb2lkRnVuY3Rpb24pIHsKKyAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMygwLCBfKSk7CisKKyAgZm9vXy5CYXIzKDAsIDApOyAgLy8gRXhwZWN0ZWQgY2FsbAorICBmb29fLkJhcjMoMCwgMSk7ICAvLyBFeGNlc3NpdmUgY2FsbAorfQorCitURVNUX0YoR01vY2tPdXRwdXRUZXN0LCBVbmludGVyZXN0aW5nQ2FsbCkgeworICBmb29fLkJhcjIoMCwgMSk7ICAvLyBVbmludGVyZXN0aW5nIGNhbGwKK30KKworVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgVW5pbnRlcmVzdGluZ0NhbGxUb1ZvaWRGdW5jdGlvbikgeworICBmb29fLkJhcjMoMCwgMSk7ICAvLyBVbmludGVyZXN0aW5nIGNhbGwKK30KKworVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgUmV0aXJlZEV4cGVjdGF0aW9uKSB7CisgIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoXywgXykpCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIDApKTsKKworICBmb29fLkJhcjIoMSwgMSk7CisgIGZvb18uQmFyMigxLCAxKTsgIC8vIE1hdGNoZXMgYSByZXRpcmVkIGV4cGVjdGF0aW9uCisgIGZvb18uQmFyMigwLCAwKTsKK30KKworVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGUpIHsKKyAgeworICAgIEluU2VxdWVuY2UgczsKKyAgICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIoXywgMCwgXykpOworICAgIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMCwgMCkpOworICAgIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMSwgXykpOworICB9CisKKyAgZm9vXy5CYXIyKDEsIDApOyAgLy8gSGFzIG9uZSBpbW1lZGlhdGUgdW5zYXRpc2ZpZWQgcHJlLXJlcXVpc2l0ZQorICBmb29fLkJhcigiSGkiLCAwLCAwKTsKKyAgZm9vXy5CYXIyKDAsIDApOworICBmb29fLkJhcjIoMSwgMCk7Cit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcykgeworICBTZXF1ZW5jZSBzMSwgczI7CisKKyAgRVhQRUNUX0NBTEwoZm9vXywgQmFyKF8sIDAsIF8pKQorICAgICAgLkluU2VxdWVuY2UoczEpOworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIDApKQorICAgICAgLkluU2VxdWVuY2UoczIpOworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDEsIF8pKQorICAgICAgLkluU2VxdWVuY2UoczEsIHMyKTsKKworICBmb29fLkJhcjIoMSwgMCk7ICAvLyBIYXMgdHdvIGltbWVkaWF0ZSB1bnNhdGlzZmllZCBwcmUtcmVxdWlzaXRlcworICBmb29fLkJhcigiSGkiLCAwLCAwKTsKKyAgZm9vXy5CYXIyKDAsIDApOworICBmb29fLkJhcjIoMSwgMCk7Cit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIFVuc2F0aXNmaWVkV2l0aCkgeworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKS5XaXRoKEdlKCkpOworfQorCitURVNUX0YoR01vY2tPdXRwdXRUZXN0LCBVbnNhdGlzZmllZEV4cGVjdGF0aW9uKSB7CisgIEVYUEVDVF9DQUxMKGZvb18sIEJhcihfLCBfLCBfKSk7CisgIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMCwgXykpCisgICAgICAuVGltZXMoMik7CisKKyAgZm9vXy5CYXIyKDAsIDEpOworfQorCitURVNUX0YoR01vY2tPdXRwdXRUZXN0LCBNaXNtYXRjaEFyZ3VtZW50cykgeworICBjb25zdCBzdGQ6OnN0cmluZyBzID0gIkhpIjsKKyAgRVhQRUNUX0NBTEwoZm9vXywgQmFyKFJlZihzKSwgXywgR2UoMCkpKTsKKworICBmb29fLkJhcigiSG8iLCAwLCAtMC4xKTsgIC8vIE1pc21hdGNoIGFyZ3VtZW50cworICBmb29fLkJhcihzLCAwLCAwKTsKK30KKworVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgTWlzbWF0Y2hXaXRoKSB7CisgIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoR2UoMiksIEdlKDEpKSkKKyAgICAgIC5XaXRoKEdlKCkpOworCisgIGZvb18uQmFyMigyLCAzKTsgIC8vIE1pc21hdGNoIFdpdGgoKQorICBmb29fLkJhcjIoMiwgMSk7Cit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIE1pc21hdGNoQXJndW1lbnRzQW5kV2l0aCkgeworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKEdlKDIpLCBHZSgxKSkpCisgICAgICAuV2l0aChHZSgpKTsKKworICBmb29fLkJhcjIoMSwgMyk7ICAvLyBNaXNtYXRjaCBhcmd1bWVudHMgYW5kIG1pc21hdGNoIFdpdGgoKQorICBmb29fLkJhcjIoMiwgMSk7Cit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIFVuZXhwZWN0ZWRDYWxsV2l0aERlZmF1bHRBY3Rpb24pIHsKKyAgT05fQ0FMTChmb29fLCBCYXIyKF8sIF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsgICAvLyBEZWZhdWx0IGFjdGlvbiAjMQorICBPTl9DQUxMKGZvb18sIEJhcjIoMSwgXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oZmFsc2UpKTsgIC8vIERlZmF1bHQgYWN0aW9uICMyCisKKyAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigyLCAyKSk7CisgIGZvb18uQmFyMigxLCAwKTsgIC8vIFVuZXhwZWN0ZWQgY2FsbCwgdGFrZXMgZGVmYXVsdCBhY3Rpb24gIzIuCisgIGZvb18uQmFyMigwLCAwKTsgIC8vIFVuZXhwZWN0ZWQgY2FsbCwgdGFrZXMgZGVmYXVsdCBhY3Rpb24gIzEuCisgIGZvb18uQmFyMigyLCAyKTsgIC8vIEV4cGVjdGVkIGNhbGwuCit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIEV4Y2Vzc2l2ZUNhbGxXaXRoRGVmYXVsdEFjdGlvbikgeworICBPTl9DQUxMKGZvb18sIEJhcjIoXywgXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4odHJ1ZSkpOyAgIC8vIERlZmF1bHQgYWN0aW9uICMxCisgIE9OX0NBTEwoZm9vXywgQmFyMigxLCBfKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihmYWxzZSkpOyAgLy8gRGVmYXVsdCBhY3Rpb24gIzIKKworICBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDIsIDIpKTsKKyAgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigxLCAxKSk7CisKKyAgZm9vXy5CYXIyKDIsIDIpOyAgLy8gRXhwZWN0ZWQgY2FsbC4KKyAgZm9vXy5CYXIyKDIsIDIpOyAgLy8gRXhjZXNzaXZlIGNhbGwsIHRha2VzIGRlZmF1bHQgYWN0aW9uICMxLgorICBmb29fLkJhcjIoMSwgMSk7ICAvLyBFeHBlY3RlZCBjYWxsLgorICBmb29fLkJhcjIoMSwgMSk7ICAvLyBFeGNlc3NpdmUgY2FsbCwgdGFrZXMgZGVmYXVsdCBhY3Rpb24gIzIuCit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIFVuaW50ZXJlc3RpbmdDYWxsV2l0aERlZmF1bHRBY3Rpb24pIHsKKyAgT05fQ0FMTChmb29fLCBCYXIyKF8sIF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsgICAvLyBEZWZhdWx0IGFjdGlvbiAjMQorICBPTl9DQUxMKGZvb18sIEJhcjIoMSwgXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oZmFsc2UpKTsgIC8vIERlZmF1bHQgYWN0aW9uICMyCisKKyAgZm9vXy5CYXIyKDIsIDIpOyAgLy8gVW5pbnRlcmVzdGluZyBjYWxsLCB0YWtlcyBkZWZhdWx0IGFjdGlvbiAjMS4KKyAgZm9vXy5CYXIyKDEsIDEpOyAgLy8gVW5pbnRlcmVzdGluZyBjYWxsLCB0YWtlcyBkZWZhdWx0IGFjdGlvbiAjMi4KK30KKworVEVTVF9GKEdNb2NrT3V0cHV0VGVzdCwgRXhwbGljaXRBY3Rpb25zUnVuT3V0V2l0aERlZmF1bHRBY3Rpb24pIHsKKyAgT05fQ0FMTChmb29fLCBCYXIyKF8sIF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsgICAvLyBEZWZhdWx0IGFjdGlvbiAjMQorCisgIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoXywgXykpCisgICAgICAuVGltZXMoMikKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKKyAgZm9vXy5CYXIyKDIsIDIpOworICBmb29fLkJhcjIoMSwgMSk7ICAvLyBFeHBsaWNpdCBhY3Rpb25zIGluIEVYUEVDVF9DQUxMIHJ1biBvdXQuCit9CisKK1RFU1RfRihHTW9ja091dHB1dFRlc3QsIENhdGNoZXNMZWFrZWRNb2NrcykgeworICBNb2NrRm9vKiBmb28xID0gbmV3IE1vY2tGb287CisgIE1vY2tGb28qIGZvbzIgPSBuZXcgTW9ja0ZvbzsKKworICAvLyBJbnZva2VzIE9OX0NBTEwgb24gZm9vMS4KKyAgT05fQ0FMTCgqZm9vMSwgQmFyKF8sIF8sIF8pKS5XaWxsQnlEZWZhdWx0KFJldHVybignYScpKTsKKworICAvLyBJbnZva2VzIEVYUEVDVF9DQUxMIG9uIGZvbzIuCisgIEVYUEVDVF9DQUxMKCpmb28yLCBCYXIyKF8sIF8pKTsKKyAgRVhQRUNUX0NBTEwoKmZvbzIsIEJhcjIoMSwgXykpOworICBFWFBFQ1RfQ0FMTCgqZm9vMiwgQmFyMyhfLCBfKSkuVGltZXMoQW55TnVtYmVyKCkpOworICBmb28yLT5CYXIyKDIsIDEpOworICBmb28yLT5CYXIyKDEsIDEpOworCisgIC8vIEJvdGggZm9vMSBhbmQgZm9vMiBhcmUgZGVsaWJlcmF0ZWx5IGxlYWtlZC4KK30KKwordm9pZCBUZXN0Q2F0Y2hlc0xlYWtlZE1vY2tzSW5BZEhvY1Rlc3RzKCkgeworICBNb2NrRm9vKiBmb28gPSBuZXcgTW9ja0ZvbzsKKworICAvLyBJbnZva2VzIEVYUEVDVF9DQUxMIG9uIGZvby4KKyAgRVhQRUNUX0NBTEwoKmZvbywgQmFyMihfLCBfKSk7CisgIGZvby0+QmFyMigyLCAxKTsKKworICAvLyBmb28gaXMgZGVsaWJlcmF0ZWx5IGxlYWtlZC4KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVNb2NrKCZhcmdjLCBhcmd2KTsKKworICAvLyBFbnN1cmVzIHRoYXQgdGhlIHRlc3RzIHBhc3Mgbm8gbWF0dGVyIHdoYXQgdmFsdWUgb2YKKyAgLy8gLS1nbW9ja19jYXRjaF9sZWFrZWRfbW9ja3MgYW5kIC0tZ21vY2tfdmVyYm9zZSB0aGUgdXNlciBzcGVjaWZpZXMuCisgIHRlc3Rpbmc6OkdNT0NLX0ZMQUcoY2F0Y2hfbGVha2VkX21vY2tzKSA9IHRydWU7CisgIHRlc3Rpbmc6OkdNT0NLX0ZMQUcodmVyYm9zZSkgPSAid2FybmluZyI7CisKKyAgVGVzdENhdGNoZXNMZWFrZWRNb2Nrc0luQWRIb2NUZXN0cygpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfb3V0cHV0X3Rlc3RfZ29sZGVuLnR4dCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX291dHB1dF90ZXN0X2dvbGRlbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwYThmMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX291dHB1dF90ZXN0X2dvbGRlbi50eHQKQEAgLTAsMCArMSwzMTAgQEAKK1sgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuRXhwZWN0ZWRDYWxsCisKK0ZJTEU6IzogRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCBfKSkgaW52b2tlZAorU3RhY2sgdHJhY2U6CisKK0ZJTEU6IzogTW9jayBmdW5jdGlvbiBjYWxsIG1hdGNoZXMgRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCBfKSkuLi4KKyAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDAsIDApCisgICAgICAgICAgUmV0dXJuczogZmFsc2UKK1N0YWNrIHRyYWNlOgorWyAgICAgICBPSyBdIEdNb2NrT3V0cHV0VGVzdC5FeHBlY3RlZENhbGwKK1sgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuRXhwZWN0ZWRDYWxsVG9Wb2lkRnVuY3Rpb24KKworRklMRTojOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIzKDAsIF8pKSBpbnZva2VkCitTdGFjayB0cmFjZToKKworRklMRTojOiBNb2NrIGZ1bmN0aW9uIGNhbGwgbWF0Y2hlcyBFWFBFQ1RfQ0FMTChmb29fLCBCYXIzKDAsIF8pKS4uLgorICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjMoMCwgMCkKK1N0YWNrIHRyYWNlOgorWyAgICAgICBPSyBdIEdNb2NrT3V0cHV0VGVzdC5FeHBlY3RlZENhbGxUb1ZvaWRGdW5jdGlvbgorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5FeHBsaWNpdEFjdGlvbnNSdW5PdXQKKworR01PQ0sgV0FSTklORzoKK0ZJTEU6IzogVG9vIGZldyBhY3Rpb25zIHNwZWNpZmllZCBpbiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKS4uLgorRXhwZWN0ZWQgdG8gYmUgY2FsbGVkIHR3aWNlLCBidXQgaGFzIG9ubHkgMSBXaWxsT25jZSgpLgorR01PQ0sgV0FSTklORzoKK0ZJTEU6IzogQWN0aW9ucyByYW4gb3V0IGluIEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoXywgXykpLi4uCitDYWxsZWQgMiB0aW1lcywgYnV0IG9ubHkgMSBXaWxsT25jZSgpIGlzIHNwZWNpZmllZCAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLgorU3RhY2sgdHJhY2U6CitbICAgICAgIE9LIF0gR01vY2tPdXRwdXRUZXN0LkV4cGxpY2l0QWN0aW9uc1J1bk91dAorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbAordW5rbm93biBmaWxlOiBGYWlsdXJlCisKK1VuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCisgICAgRnVuY3Rpb24gY2FsbDogQmFyMigxLCAwKQorICAgICAgICAgIFJldHVybnM6IGZhbHNlCitHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6CisKK0ZJTEU6IzogRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCBfKSkuLi4KKyAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAwCisgICAgICAgICAgIEFjdHVhbDogMQorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbAorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbFRvVm9pZEZ1bmN0aW9uCit1bmtub3duIGZpbGU6IEZhaWx1cmUKKworVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSByZXR1cm5pbmcgZGlyZWN0bHkuCisgICAgRnVuY3Rpb24gY2FsbDogQmFyMygxLCAwKQorR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAxIGV4cGVjdGF0aW9uLCBidXQgaXQgZGlkbid0IG1hdGNoOgorCitGSUxFOiM6IEVYUEVDVF9DQUxMKGZvb18sIEJhcjMoMCwgXykpLi4uCisgIEV4cGVjdGVkIGFyZyAjMDogaXMgZXF1YWwgdG8gMAorICAgICAgICAgICBBY3R1YWw6IDEKKyAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQorICAgICAgICAgICBBY3R1YWw6IG5ldmVyIGNhbGxlZCAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUKK1sgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5leHBlY3RlZENhbGxUb1ZvaWRGdW5jdGlvbgorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5FeGNlc3NpdmVDYWxsCitGSUxFOiM6IEZhaWx1cmUKK01vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLgorICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjIoMCwgMSkKKyAgICAgICAgICBSZXR1cm5zOiBmYWxzZQorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogY2FsbGVkIHR3aWNlIC0gb3Zlci1zYXR1cmF0ZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5FeGNlc3NpdmVDYWxsCitbIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGxUb1ZvaWRGdW5jdGlvbgorRklMRTojOiBGYWlsdXJlCitNb2NrIGZ1bmN0aW9uIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gZXhwZWN0ZWQgLSByZXR1cm5pbmcgZGlyZWN0bHkuCisgICAgRnVuY3Rpb24gY2FsbDogQmFyMygwLCAxKQorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogY2FsbGVkIHR3aWNlIC0gb3Zlci1zYXR1cmF0ZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5FeGNlc3NpdmVDYWxsVG9Wb2lkRnVuY3Rpb24KK1sgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuVW5pbnRlcmVzdGluZ0NhbGwKKworR01PQ0sgV0FSTklORzoKK1VuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCisgICAgRnVuY3Rpb24gY2FsbDogQmFyMigwLCAxKQorICAgICAgICAgIFJldHVybnM6IGZhbHNlCitOT1RFOiBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIGFib3ZlIHdhcm5pbmcgdW5sZXNzIHRoaXMgY2FsbCBzaG91bGQgbm90IGhhcHBlbi4gIERvIG5vdCBzdXBwcmVzcyBpdCBieSBibGluZGx5IGFkZGluZyBhbiBFWFBFQ1RfQ0FMTCgpIGlmIHlvdSBkb24ndCBtZWFuIHRvIGVuZm9yY2UgdGhlIGNhbGwuICBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNLbm93aW5nX1doZW5fdG9fRXhwZWN0IGZvciBkZXRhaWxzLgorWyAgICAgICBPSyBdIEdNb2NrT3V0cHV0VGVzdC5VbmludGVyZXN0aW5nQ2FsbAorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbmludGVyZXN0aW5nQ2FsbFRvVm9pZEZ1bmN0aW9uCisKK0dNT0NLIFdBUk5JTkc6CitVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkaXJlY3RseS4KKyAgICBGdW5jdGlvbiBjYWxsOiBCYXIzKDAsIDEpCitOT1RFOiBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIGFib3ZlIHdhcm5pbmcgdW5sZXNzIHRoaXMgY2FsbCBzaG91bGQgbm90IGhhcHBlbi4gIERvIG5vdCBzdXBwcmVzcyBpdCBieSBibGluZGx5IGFkZGluZyBhbiBFWFBFQ1RfQ0FMTCgpIGlmIHlvdSBkb24ndCBtZWFuIHRvIGVuZm9yY2UgdGhlIGNhbGwuICBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNLbm93aW5nX1doZW5fdG9fRXhwZWN0IGZvciBkZXRhaWxzLgorWyAgICAgICBPSyBdIEdNb2NrT3V0cHV0VGVzdC5VbmludGVyZXN0aW5nQ2FsbFRvVm9pZEZ1bmN0aW9uCitbIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LlJldGlyZWRFeHBlY3RhdGlvbgordW5rbm93biBmaWxlOiBGYWlsdXJlCisKK1VuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCisgICAgRnVuY3Rpb24gY2FsbDogQmFyMigxLCAxKQorICAgICAgICAgIFJldHVybnM6IGZhbHNlCitHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDIgZXhwZWN0YXRpb25zLCBidXQgbm9uZSBtYXRjaGVkOgorCitGSUxFOiM6IHRyaWVkIGV4cGVjdGF0aW9uICMwOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKS4uLgorICAgICAgICAgRXhwZWN0ZWQ6IHRoZSBleHBlY3RhdGlvbiBpcyBhY3RpdmUKKyAgICAgICAgICAgQWN0dWFsOiBpdCBpcyByZXRpcmVkCisgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgb25jZSAtIHNhdHVyYXRlZCBhbmQgcmV0aXJlZAorRklMRTojOiB0cmllZCBleHBlY3RhdGlvbiAjMTogRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCAwKSkuLi4KKyAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAwCisgICAgICAgICAgIEFjdHVhbDogMQorICBFeHBlY3RlZCBhcmcgIzE6IGlzIGVxdWFsIHRvIDAKKyAgICAgICAgICAgQWN0dWFsOiAxCisgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlJldGlyZWRFeHBlY3RhdGlvbgorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZFByZXJlcXVpc2l0ZQordW5rbm93biBmaWxlOiBGYWlsdXJlCisKK1VuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCisgICAgRnVuY3Rpb24gY2FsbDogQmFyMigxLCAwKQorICAgICAgICAgIFJldHVybnM6IGZhbHNlCitHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDIgZXhwZWN0YXRpb25zLCBidXQgbm9uZSBtYXRjaGVkOgorCitGSUxFOiM6IHRyaWVkIGV4cGVjdGF0aW9uICMwOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDAsIDApKS4uLgorICBFeHBlY3RlZCBhcmcgIzA6IGlzIGVxdWFsIHRvIDAKKyAgICAgICAgICAgQWN0dWFsOiAxCisgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCitGSUxFOiM6IHRyaWVkIGV4cGVjdGF0aW9uICMxOiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKDEsIF8pKS4uLgorICAgICAgICAgRXhwZWN0ZWQ6IGFsbCBwcmUtcmVxdWlzaXRlcyBhcmUgc2F0aXNmaWVkCisgICAgICAgICAgIEFjdHVhbDogdGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcHJlLXJlcXVpc2l0ZXMgYXJlIG5vdCBzYXRpc2ZpZWQ6CitGSUxFOiM6IHByZS1yZXF1aXNpdGUgIzAKKyAgICAgICAgICAgICAgICAgICAoZW5kIG9mIHByZS1yZXF1aXNpdGVzKQorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZFByZXJlcXVpc2l0ZQorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMKK3Vua25vd24gZmlsZTogRmFpbHVyZQorCitVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLgorICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjIoMSwgMCkKKyAgICAgICAgICBSZXR1cm5zOiBmYWxzZQorR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAyIGV4cGVjdGF0aW9ucywgYnV0IG5vbmUgbWF0Y2hlZDoKKworRklMRTojOiB0cmllZCBleHBlY3RhdGlvbiAjMDogRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCAwKSkuLi4KKyAgRXhwZWN0ZWQgYXJnICMwOiBpcyBlcXVhbCB0byAwCisgICAgICAgICAgIEFjdHVhbDogMQorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQorRklMRTojOiB0cmllZCBleHBlY3RhdGlvbiAjMTogRVhQRUNUX0NBTEwoZm9vXywgQmFyMigxLCBfKSkuLi4KKyAgICAgICAgIEV4cGVjdGVkOiBhbGwgcHJlLXJlcXVpc2l0ZXMgYXJlIHNhdGlzZmllZAorICAgICAgICAgICBBY3R1YWw6IHRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzIGFyZSBub3Qgc2F0aXNmaWVkOgorRklMRTojOiBwcmUtcmVxdWlzaXRlICMwCitGSUxFOiM6IHByZS1yZXF1aXNpdGUgIzEKKyAgICAgICAgICAgICAgICAgICAoZW5kIG9mIHByZS1yZXF1aXNpdGVzKQorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMKK1sgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuVW5zYXRpc2ZpZWRXaXRoCitGSUxFOiM6IEZhaWx1cmUKK0FjdHVhbCBmdW5jdGlvbiBjYWxsIGNvdW50IGRvZXNuJ3QgbWF0Y2ggRVhQRUNUX0NBTEwoZm9vXywgQmFyMihfLCBfKSkuLi4KKyAgICBFeHBlY3RlZCBhcmdzOiBhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+PSB0aGUgc2Vjb25kCisgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkV2l0aAorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZEV4cGVjdGF0aW9uCitGSUxFOiM6IEZhaWx1cmUKK0FjdHVhbCBmdW5jdGlvbiBjYWxsIGNvdW50IGRvZXNuJ3QgbWF0Y2ggRVhQRUNUX0NBTEwoZm9vXywgQmFyMigwLCBfKSkuLi4KKyAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgdHdpY2UKKyAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgb25jZSAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUKK0ZJTEU6IzogRmFpbHVyZQorQWN0dWFsIGZ1bmN0aW9uIGNhbGwgY291bnQgZG9lc24ndCBtYXRjaCBFWFBFQ1RfQ0FMTChmb29fLCBCYXIoXywgXywgXykpLi4uCisgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkRXhwZWN0YXRpb24KK1sgUlVOICAgICAgXSBHTW9ja091dHB1dFRlc3QuTWlzbWF0Y2hBcmd1bWVudHMKK3Vua25vd24gZmlsZTogRmFpbHVyZQorCitVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLgorICAgIEZ1bmN0aW9uIGNhbGw6IEJhcihAMHgjICJIbyIsIDAsIC0wLjEpCisgICAgICAgICAgUmV0dXJuczogJ1wwJworR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAxIGV4cGVjdGF0aW9uLCBidXQgaXQgZGlkbid0IG1hdGNoOgorCitGSUxFOiM6IEVYUEVDVF9DQUxMKGZvb18sIEJhcihSZWYocyksIF8sIEdlKDApKSkuLi4KKyAgRXhwZWN0ZWQgYXJnICMwOiByZWZlcmVuY2VzIHRoZSB2YXJpYWJsZSBAMHgjICJIaSIKKyAgICAgICAgICAgQWN0dWFsOiAiSG8iLCB3aGljaCBpcyBsb2NhdGVkIEAweCMKKyAgRXhwZWN0ZWQgYXJnICMyOiBpcyA+PSAwCisgICAgICAgICAgIEFjdHVhbDogLTAuMQorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5NaXNtYXRjaEFyZ3VtZW50cworWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5NaXNtYXRjaFdpdGgKK3Vua25vd24gZmlsZTogRmFpbHVyZQorCitVbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHJldHVybmluZyBkZWZhdWx0IHZhbHVlLgorICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjIoMiwgMykKKyAgICAgICAgICBSZXR1cm5zOiBmYWxzZQorR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAxIGV4cGVjdGF0aW9uLCBidXQgaXQgZGlkbid0IG1hdGNoOgorCitGSUxFOiM6IEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoR2UoMiksIEdlKDEpKSkuLi4KKyAgICBFeHBlY3RlZCBhcmdzOiBhcmUgYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+PSB0aGUgc2Vjb25kCisgICAgICAgICAgIEFjdHVhbDogZG9uJ3QgbWF0Y2gKKyAgICAgICAgIEV4cGVjdGVkOiB0byBiZSBjYWxsZWQgb25jZQorICAgICAgICAgICBBY3R1YWw6IG5ldmVyIGNhbGxlZCAtIHVuc2F0aXNmaWVkIGFuZCBhY3RpdmUKK1sgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuTWlzbWF0Y2hXaXRoCitbIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0Lk1pc21hdGNoQXJndW1lbnRzQW5kV2l0aAordW5rbm93biBmaWxlOiBGYWlsdXJlCisKK1VuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWUuCisgICAgRnVuY3Rpb24gY2FsbDogQmFyMigxLCAzKQorICAgICAgICAgIFJldHVybnM6IGZhbHNlCitHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nIDEgZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2g6CisKK0ZJTEU6IzogRVhQRUNUX0NBTEwoZm9vXywgQmFyMihHZSgyKSwgR2UoMSkpKS4uLgorICBFeHBlY3RlZCBhcmcgIzA6IGlzID49IDIKKyAgICAgICAgICAgQWN0dWFsOiAxCisgICAgRXhwZWN0ZWQgYXJnczogYXJlIGEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPj0gdGhlIHNlY29uZAorICAgICAgICAgICBBY3R1YWw6IGRvbid0IG1hdGNoCisgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgICAgQWN0dWFsOiBuZXZlciBjYWxsZWQgLSB1bnNhdGlzZmllZCBhbmQgYWN0aXZlCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0Lk1pc21hdGNoQXJndW1lbnRzQW5kV2l0aAorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbFdpdGhEZWZhdWx0QWN0aW9uCit1bmtub3duIGZpbGU6IEZhaWx1cmUKKworVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSB0YWtpbmcgZGVmYXVsdCBhY3Rpb24gc3BlY2lmaWVkIGF0OgorRklMRTojOgorICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjIoMSwgMCkKKyAgICAgICAgICBSZXR1cm5zOiBmYWxzZQorR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAxIGV4cGVjdGF0aW9uLCBidXQgaXQgZGlkbid0IG1hdGNoOgorCitGSUxFOiM6IEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMiwgMikpLi4uCisgIEV4cGVjdGVkIGFyZyAjMDogaXMgZXF1YWwgdG8gMgorICAgICAgICAgICBBY3R1YWw6IDEKKyAgRXhwZWN0ZWQgYXJnICMxOiBpcyBlcXVhbCB0byAyCisgICAgICAgICAgIEFjdHVhbDogMAorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQordW5rbm93biBmaWxlOiBGYWlsdXJlCisKK1VuZXhwZWN0ZWQgbW9jayBmdW5jdGlvbiBjYWxsIC0gdGFraW5nIGRlZmF1bHQgYWN0aW9uIHNwZWNpZmllZCBhdDoKK0ZJTEU6IzoKKyAgICBGdW5jdGlvbiBjYWxsOiBCYXIyKDAsIDApCisgICAgICAgICAgUmV0dXJuczogdHJ1ZQorR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAxIGV4cGVjdGF0aW9uLCBidXQgaXQgZGlkbid0IG1hdGNoOgorCitGSUxFOiM6IEVYUEVDVF9DQUxMKGZvb18sIEJhcjIoMiwgMikpLi4uCisgIEV4cGVjdGVkIGFyZyAjMDogaXMgZXF1YWwgdG8gMgorICAgICAgICAgICBBY3R1YWw6IDAKKyAgRXhwZWN0ZWQgYXJnICMxOiBpcyBlcXVhbCB0byAyCisgICAgICAgICAgIEFjdHVhbDogMAorICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlIGNhbGxlZCBvbmNlCisgICAgICAgICAgIEFjdHVhbDogbmV2ZXIgY2FsbGVkIC0gdW5zYXRpc2ZpZWQgYW5kIGFjdGl2ZQorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbmV4cGVjdGVkQ2FsbFdpdGhEZWZhdWx0QWN0aW9uCitbIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGxXaXRoRGVmYXVsdEFjdGlvbgorRklMRTojOiBGYWlsdXJlCitNb2NrIGZ1bmN0aW9uIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gZXhwZWN0ZWQgLSB0YWtpbmcgZGVmYXVsdCBhY3Rpb24gc3BlY2lmaWVkIGF0OgorRklMRTojOgorICAgIEZ1bmN0aW9uIGNhbGw6IEJhcjIoMiwgMikKKyAgICAgICAgICBSZXR1cm5zOiB0cnVlCisgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgdHdpY2UgLSBvdmVyLXNhdHVyYXRlZCBhbmQgYWN0aXZlCitGSUxFOiM6IEZhaWx1cmUKK01vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCAtIHRha2luZyBkZWZhdWx0IGFjdGlvbiBzcGVjaWZpZWQgYXQ6CitGSUxFOiM6CisgICAgRnVuY3Rpb24gY2FsbDogQmFyMigxLCAxKQorICAgICAgICAgIFJldHVybnM6IGZhbHNlCisgICAgICAgICBFeHBlY3RlZDogdG8gYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgICAgQWN0dWFsOiBjYWxsZWQgdHdpY2UgLSBvdmVyLXNhdHVyYXRlZCBhbmQgYWN0aXZlCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGxXaXRoRGVmYXVsdEFjdGlvbgorWyBSVU4gICAgICBdIEdNb2NrT3V0cHV0VGVzdC5VbmludGVyZXN0aW5nQ2FsbFdpdGhEZWZhdWx0QWN0aW9uCisKK0dNT0NLIFdBUk5JTkc6CitVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHRha2luZyBkZWZhdWx0IGFjdGlvbiBzcGVjaWZpZWQgYXQ6CitGSUxFOiM6CisgICAgRnVuY3Rpb24gY2FsbDogQmFyMigyLCAyKQorICAgICAgICAgIFJldHVybnM6IHRydWUKK05PVEU6IFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgYWJvdmUgd2FybmluZyB1bmxlc3MgdGhpcyBjYWxsIHNob3VsZCBub3QgaGFwcGVuLiAgRG8gbm90IHN1cHByZXNzIGl0IGJ5IGJsaW5kbHkgYWRkaW5nIGFuIEVYUEVDVF9DQUxMKCkgaWYgeW91IGRvbid0IG1lYW4gdG8gZW5mb3JjZSB0aGUgY2FsbC4gIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rI0tub3dpbmdfV2hlbl90b19FeHBlY3QgZm9yIGRldGFpbHMuCisKK0dNT0NLIFdBUk5JTkc6CitVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCAtIHRha2luZyBkZWZhdWx0IGFjdGlvbiBzcGVjaWZpZWQgYXQ6CitGSUxFOiM6CisgICAgRnVuY3Rpb24gY2FsbDogQmFyMigxLCAxKQorICAgICAgICAgIFJldHVybnM6IGZhbHNlCitOT1RFOiBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIGFib3ZlIHdhcm5pbmcgdW5sZXNzIHRoaXMgY2FsbCBzaG91bGQgbm90IGhhcHBlbi4gIERvIG5vdCBzdXBwcmVzcyBpdCBieSBibGluZGx5IGFkZGluZyBhbiBFWFBFQ1RfQ0FMTCgpIGlmIHlvdSBkb24ndCBtZWFuIHRvIGVuZm9yY2UgdGhlIGNhbGwuICBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNLbm93aW5nX1doZW5fdG9fRXhwZWN0IGZvciBkZXRhaWxzLgorWyAgICAgICBPSyBdIEdNb2NrT3V0cHV0VGVzdC5VbmludGVyZXN0aW5nQ2FsbFdpdGhEZWZhdWx0QWN0aW9uCitbIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LkV4cGxpY2l0QWN0aW9uc1J1bk91dFdpdGhEZWZhdWx0QWN0aW9uCisKK0dNT0NLIFdBUk5JTkc6CitGSUxFOiM6IFRvbyBmZXcgYWN0aW9ucyBzcGVjaWZpZWQgaW4gRVhQRUNUX0NBTEwoZm9vXywgQmFyMihfLCBfKSkuLi4KK0V4cGVjdGVkIHRvIGJlIGNhbGxlZCB0d2ljZSwgYnV0IGhhcyBvbmx5IDEgV2lsbE9uY2UoKS4KK0dNT0NLIFdBUk5JTkc6CitGSUxFOiM6IEFjdGlvbnMgcmFuIG91dCBpbiBFWFBFQ1RfQ0FMTChmb29fLCBCYXIyKF8sIF8pKS4uLgorQ2FsbGVkIDIgdGltZXMsIGJ1dCBvbmx5IDEgV2lsbE9uY2UoKSBpcyBzcGVjaWZpZWQgLSB0YWtpbmcgZGVmYXVsdCBhY3Rpb24gc3BlY2lmaWVkIGF0OgorRklMRTojOgorU3RhY2sgdHJhY2U6CitbICAgICAgIE9LIF0gR01vY2tPdXRwdXRUZXN0LkV4cGxpY2l0QWN0aW9uc1J1bk91dFdpdGhEZWZhdWx0QWN0aW9uCitbIFJVTiAgICAgIF0gR01vY2tPdXRwdXRUZXN0LkNhdGNoZXNMZWFrZWRNb2NrcworWyAgICAgICBPSyBdIEdNb2NrT3V0cHV0VGVzdC5DYXRjaGVzTGVha2VkTW9ja3MKK1sgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5leHBlY3RlZENhbGwKK1sgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5leHBlY3RlZENhbGxUb1ZvaWRGdW5jdGlvbgorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5FeGNlc3NpdmVDYWxsCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LkV4Y2Vzc2l2ZUNhbGxUb1ZvaWRGdW5jdGlvbgorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5SZXRpcmVkRXhwZWN0YXRpb24KK1sgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGUKK1sgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0LlVuc2F0aXNmaWVkV2l0aAorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5VbnNhdGlzZmllZEV4cGVjdGF0aW9uCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0Lk1pc21hdGNoQXJndW1lbnRzCitbICBGQUlMRUQgIF0gR01vY2tPdXRwdXRUZXN0Lk1pc21hdGNoV2l0aAorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5NaXNtYXRjaEFyZ3VtZW50c0FuZFdpdGgKK1sgIEZBSUxFRCAgXSBHTW9ja091dHB1dFRlc3QuVW5leHBlY3RlZENhbGxXaXRoRGVmYXVsdEFjdGlvbgorWyAgRkFJTEVEICBdIEdNb2NrT3V0cHV0VGVzdC5FeGNlc3NpdmVDYWxsV2l0aERlZmF1bHRBY3Rpb24KKworCitGSUxFOiM6IEVSUk9SOiB0aGlzIG1vY2sgb2JqZWN0IHNob3VsZCBiZSBkZWxldGVkIGJ1dCBuZXZlciBpcy4gSXRzIGFkZHJlc3MgaXMgQDB4Iy4KK0ZJTEU6IzogRVJST1I6IHRoaXMgbW9jayBvYmplY3Qgc2hvdWxkIGJlIGRlbGV0ZWQgYnV0IG5ldmVyIGlzLiBJdHMgYWRkcmVzcyBpcyBAMHgjLgorRklMRTojOiBFUlJPUjogdGhpcyBtb2NrIG9iamVjdCBzaG91bGQgYmUgZGVsZXRlZCBidXQgbmV2ZXIgaXMuIEl0cyBhZGRyZXNzIGlzIEAweCMuCitFUlJPUjogMyBsZWFrZWQgbW9jayBvYmplY3RzIGZvdW5kIGF0IHByb2dyYW0gZXhpdC4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX3N0cmVzc190ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfc3RyZXNzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5N2FlZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX3N0cmVzc190ZXN0LmNjCkBAIC0wLDAgKzEsMzIyIEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBNb2NrIGNvbnN0cnVjdHMgY2FuIGJlIHVzZWQgaW4gYSBsYXJnZSBudW1iZXIgb2YKKy8vIHRocmVhZHMgY29uY3VycmVudGx5LgorCisjaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgeworCisvLyBGcm9tIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0Lmg+LgordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGhyZWFkV2l0aFBhcmFtOworCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVzdCB0aHJlYWRzIChub3QgaW5jbHVkaW5nIGhlbHBlciB0aHJlYWRzKQorLy8gdG8gY3JlYXRlLgorY29uc3QgaW50IGtNYXhUZXN0VGhyZWFkcyA9IDUwOworCisvLyBIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgYSB0YXNrIGluIGEgdGVzdCB0aHJlYWQuCitjb25zdCBpbnQga1JlcGVhdCA9IDUwOworCitjbGFzcyBNb2NrRm9vIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShCYXIsIGludChpbnQgbikpOyAgLy8gTk9MSU5UCisgIE1PQ0tfTUVUSE9EMihCYXosIGNoYXIoY29uc3QgY2hhciogczEsIGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMyKSk7ICAvLyBOT0xJTlQKK307CisKKy8vIEhlbHBlciBmb3Igd2FpdGluZyBmb3IgdGhlIGdpdmVuIHRocmVhZCB0byBmaW5pc2ggYW5kIHRoZW4gZGVsZXRpbmcgaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgSm9pbkFuZERlbGV0ZShUaHJlYWRXaXRoUGFyYW08VD4qIHQpIHsKKyAgdC0+Sm9pbigpOworICBkZWxldGUgdDsKK30KKwordXNpbmcgaW50ZXJuYWw6OmxpbmtlZF9wdHI7CisKKy8vIEhlbHBlciBjbGFzc2VzIGZvciB0ZXN0aW5nIHVzaW5nIGxpbmtlZF9wdHIgY29uY3VycmVudGx5LgorCitjbGFzcyBCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEJhc2UoaW50IGFfeCkgOiB4XyhhX3gpIHt9CisgIHZpcnR1YWwgfkJhc2UoKSB7fQorICBpbnQgeCgpIGNvbnN0IHsgcmV0dXJuIHhfOyB9CisgcHJpdmF0ZToKKyAgaW50IHhfOworfTsKKworY2xhc3MgRGVyaXZlZDEgOiBwdWJsaWMgQmFzZSB7CisgcHVibGljOgorICBEZXJpdmVkMShpbnQgYV94LCBpbnQgYV95KSA6IEJhc2UoYV94KSwgeV8oYV95KSB7fQorICBpbnQgeSgpIGNvbnN0IHsgcmV0dXJuIHlfOyB9CisgcHJpdmF0ZToKKyAgaW50IHlfOworfTsKKworY2xhc3MgRGVyaXZlZDIgOiBwdWJsaWMgQmFzZSB7CisgcHVibGljOgorICBEZXJpdmVkMihpbnQgYV94LCBpbnQgYV96KSA6IEJhc2UoYV94KSwgel8oYV96KSB7fQorICBpbnQgeigpIGNvbnN0IHsgcmV0dXJuIHpfOyB9CisgcHJpdmF0ZToKKyAgaW50IHpfOworfTsKKworbGlua2VkX3B0cjxEZXJpdmVkMT4gcG9pbnRlcjEobmV3IERlcml2ZWQxKDEsIDIpKTsKK2xpbmtlZF9wdHI8RGVyaXZlZDI+IHBvaW50ZXIyKG5ldyBEZXJpdmVkMigzLCA0KSk7CisKK3N0cnVjdCBEdW1teSB7fTsKKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gY29weSBmcm9tIGEgbGlua2VkX3B0ciBhbmQgcmVhZCBpdCBjb25jdXJyZW50bHkuCit2b2lkIFRlc3RDb25jdXJyZW50Q29weUFuZFJlYWRMaW5rZWRQdHIoRHVtbXkgLyogZHVtbXkgKi8pIHsKKyAgLy8gUmVhZHMgcG9pbnRlcjEgYW5kIHBvaW50ZXIyIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGNvcGllZCBmcm9tIGluCisgIC8vIGFub3RoZXIgdGhyZWFkLgorICBFWFBFQ1RfRVEoMSwgcG9pbnRlcjEtPngoKSk7CisgIEVYUEVDVF9FUSgyLCBwb2ludGVyMS0+eSgpKTsKKyAgRVhQRUNUX0VRKDMsIHBvaW50ZXIyLT54KCkpOworICBFWFBFQ1RfRVEoNCwgcG9pbnRlcjItPnooKSk7CisKKyAgLy8gQ29waWVzIGZyb20gcG9pbnRlcjEuCisgIGxpbmtlZF9wdHI8RGVyaXZlZDE+IHAxKHBvaW50ZXIxKTsKKyAgRVhQRUNUX0VRKDEsIHAxLT54KCkpOworICBFWFBFQ1RfRVEoMiwgcDEtPnkoKSk7CisKKyAgLy8gQXNzaWducyBmcm9tIHBvaW50ZXIyIHdoZXJlIHRoZSBMSFMgd2FzIGVtcHR5LgorICBsaW5rZWRfcHRyPEJhc2U+IHAyOworICBwMiA9IHBvaW50ZXIxOworICBFWFBFQ1RfRVEoMSwgcDItPngoKSk7CisKKyAgLy8gQXNzaWducyBmcm9tIHBvaW50ZXIyIHdoZXJlIHRoZSBMSFMgd2FzIG5vdCBlbXB0eS4KKyAgcDIgPSBwb2ludGVyMjsKKyAgRVhQRUNUX0VRKDMsIHAyLT54KCkpOworfQorCitjb25zdCBsaW5rZWRfcHRyPERlcml2ZWQxPiBwMChuZXcgRGVyaXZlZDEoMSwgMikpOworCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBjb25jdXJyZW50bHkgbW9kaWZ5IHR3byBsaW5rZWRfcHRycyB0aGF0IHBvaW50IHRvCisvLyB0aGUgc2FtZSBvYmplY3QuCit2b2lkIFRlc3RDb25jdXJyZW50V3JpdGVUb0VxdWFsTGlua2VkUHRyKER1bW15IC8qIGR1bW15ICovKSB7CisgIC8vIHAxIGFuZCBwMiBwb2ludCB0byB0aGUgc2FtZSwgc2hhcmVkIHRoaW5nLiAgT25lIHRocmVhZCByZXNldHMgcDEuCisgIC8vIEFub3RoZXIgdGhyZWFkIGFzc2lnbnMgdG8gcDIuICBUaGlzIHdpbGwgY2F1c2UgdGhlIHNhbWUKKyAgLy8gdW5kZXJseWluZyAicmluZyIgdG8gYmUgdXBkYXRlZCBjb25jdXJyZW50bHkuCisgIGxpbmtlZF9wdHI8RGVyaXZlZDE+IHAxKHAwKTsKKyAgbGlua2VkX3B0cjxEZXJpdmVkMT4gcDIocDApOworCisgIEVYUEVDVF9FUSgxLCBwMS0+eCgpKTsKKyAgRVhQRUNUX0VRKDIsIHAxLT55KCkpOworCisgIEVYUEVDVF9FUSgxLCBwMi0+eCgpKTsKKyAgRVhQRUNUX0VRKDIsIHAyLT55KCkpOworCisgIHAxLnJlc2V0KCk7CisgIHAyID0gcDA7CisKKyAgRVhQRUNUX0VRKDEsIHAyLT54KCkpOworICBFWFBFQ1RfRVEoMiwgcDItPnkoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZGlmZmVyZW50IG1vY2sgb2JqZWN0cyBjYW4gYmUgdXNlZCBpbiB0aGVpciByZXNwZWN0aXZlCisvLyB0aHJlYWRzLiAgVGhpcyBzaG91bGQgZ2VuZXJhdGUgbm8gR29vZ2xlIFRlc3QgZmFpbHVyZS4KK3ZvaWQgVGVzdENvbmN1cnJlbnRNb2NrT2JqZWN0cyhEdW1teSAvKiBkdW1teSAqLykgeworICAvLyBDcmVhdGVzIGEgbW9jayBhbmQgZG9lcyBzb21lIHR5cGljYWwgb3BlcmF0aW9ucyBvbiBpdC4KKyAgTW9ja0ZvbyBmb287CisgIE9OX0NBTEwoZm9vLCBCYXIoXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICBPTl9DQUxMKGZvbywgQmF6KF8sIF8pKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKCdiJykpOworICBPTl9DQUxMKGZvbywgQmF6KF8sICJ5b3UiKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybignYScpKTsKKworICBFWFBFQ1RfQ0FMTChmb28sIEJhcigwKSkKKyAgICAgIC5UaW1lcyhBdE1vc3QoMykpOworICBFWFBFQ1RfQ0FMTChmb28sIEJheihfLCBfKSk7CisgIEVYUEVDVF9DQUxMKGZvbywgQmF6KCJoaSIsICJ5b3UiKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oJ3onKSkKKyAgICAgIC5XaWxsUmVwZWF0ZWRseShEb0RlZmF1bHQoKSk7CisKKyAgRVhQRUNUX0VRKDEsIGZvby5CYXIoMCkpOworICBFWFBFQ1RfRVEoMSwgZm9vLkJhcigwKSk7CisgIEVYUEVDVF9FUSgneicsIGZvby5CYXooImhpIiwgInlvdSIpKTsKKyAgRVhQRUNUX0VRKCdhJywgZm9vLkJheigiaGkiLCAieW91IikpOworICBFWFBFQ1RfRVEoJ2InLCBmb28uQmF6KCJoaSIsICJtZSIpKTsKK30KKworLy8gVGVzdHMgaW52b2tpbmcgbWV0aG9kcyBvZiB0aGUgc2FtZSBtb2NrIG9iamVjdCBpbiBtdWx0aXBsZSB0aHJlYWRzLgorCitzdHJ1Y3QgSGVscGVyMVBhcmFtIHsKKyAgTW9ja0ZvbyogbW9ja19mb287CisgIGludCogY291bnQ7Cit9OworCit2b2lkIEhlbHBlcjEoSGVscGVyMVBhcmFtIHBhcmFtKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga1JlcGVhdDsgaSsrKSB7CisgICAgY29uc3QgY2hhciBjaCA9IHBhcmFtLm1vY2tfZm9vLT5CYXooImEiLCAiYiIpOworICAgIGlmIChjaCA9PSAnYScpIHsKKyAgICAgIC8vIEl0IHdhcyBhbiBleHBlY3RlZCBjYWxsLgorICAgICAgKCpwYXJhbS5jb3VudCkrKzsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSXQgd2FzIGFuIGV4Y2Vzc2l2ZSBjYWxsLgorICAgICAgRVhQRUNUX0VRKCdcMCcsIGNoKTsKKyAgICB9CisKKyAgICAvLyBBbiB1bmV4cGVjdGVkIGNhbGwuCisgICAgRVhQRUNUX0VRKCdcMCcsIHBhcmFtLm1vY2tfZm9vLT5CYXooIngiLCAieSIpKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iOworCisgICAgLy8gQW4gdW5pbnRlcmVzdGluZyBjYWxsLgorICAgIEVYUEVDVF9FUSgxLCBwYXJhbS5tb2NrX2Zvby0+QmFyKDUpKTsKKyAgfQorfQorCisvLyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAzKmtSZXBlYXQgKyAxIGZhaWx1cmVzIGluIHRvdGFsLgordm9pZCBUZXN0Q29uY3VycmVudENhbGxzT25TYW1lT2JqZWN0KER1bW15IC8qIGR1bW15ICovKSB7CisgIE1vY2tGb28gZm9vOworCisgIE9OX0NBTEwoZm9vLCBCYXIoXykpCisgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMSkpOworICBFWFBFQ1RfQ0FMTChmb28sIEJheihfLCAiYiIpKQorICAgICAgLlRpbWVzKGtSZXBlYXQpCisgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCdhJykpOworICBFWFBFQ1RfQ0FMTChmb28sIEJheihfLCAiYyIpKTsgIC8vIEV4cGVjdGVkIHRvIGJlIHVuc2F0aXNmaWVkLgorCisgIC8vIFRoaXMgY2h1bmsgb2YgY29kZSBzaG91bGQgZ2VuZXJhdGUga1JlcGVhdCBmYWlsdXJlcyBhYm91dAorICAvLyBleGNlc3NpdmUgY2FsbHMsIGFuZCAyKmtSZXBlYXQgZmFpbHVyZXMgYWJvdXQgdW5leHBlY3RlZCBjYWxscy4KKyAgaW50IGNvdW50MSA9IDA7CisgIGNvbnN0IEhlbHBlcjFQYXJhbSBwYXJhbSA9IHsgJmZvbywgJmNvdW50MSB9OworICBUaHJlYWRXaXRoUGFyYW08SGVscGVyMVBhcmFtPiogY29uc3QgdCA9CisgICAgICBuZXcgVGhyZWFkV2l0aFBhcmFtPEhlbHBlcjFQYXJhbT4oSGVscGVyMSwgcGFyYW0sIE5VTEwpOworCisgIGludCBjb3VudDIgPSAwOworICBjb25zdCBIZWxwZXIxUGFyYW0gcGFyYW0yID0geyAmZm9vLCAmY291bnQyIH07CisgIEhlbHBlcjEocGFyYW0yKTsKKyAgSm9pbkFuZERlbGV0ZSh0KTsKKworICBFWFBFQ1RfRVEoa1JlcGVhdCwgY291bnQxICsgY291bnQyKTsKKworICAvLyBmb28ncyBkZXN0cnVjdG9yIHNob3VsZCBnZW5lcmF0ZSBvbmUgZmFpbHVyZSBhYm91dCB1bnNhdGlzZmllZAorICAvLyBleHBlY3RhdGlvbi4KK30KKworLy8gVGVzdHMgdXNpbmcgdGhlIHNhbWUgbW9jayBvYmplY3QgaW4gbXVsdGlwbGUgdGhyZWFkcyB3aGVuIHRoZQorLy8gZXhwZWN0YXRpb25zIGFyZSBwYXJ0aWFsbHkgb3JkZXJlZC4KKwordm9pZCBIZWxwZXIyKE1vY2tGb28qIGZvbykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGtSZXBlYXQ7IGkrKykgeworICAgIGZvby0+QmFyKDIpOworICAgIGZvby0+QmFyKDMpOworICB9Cit9CisKKy8vIFRoaXMgc2hvdWxkIGdlbmVyYXRlIG5vIEdvb2dsZSBUZXN0IGZhaWx1cmVzLgordm9pZCBUZXN0UGFydGlhbGx5T3JkZXJlZEV4cGVjdGF0aW9uc1dpdGhUaHJlYWRzKER1bW15IC8qIGR1bW15ICovKSB7CisgIE1vY2tGb28gZm9vOworICBTZXF1ZW5jZSBzMSwgczI7CisKKyAgeworICAgIEluU2VxdWVuY2UgZHVtbXk7CisgICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMCkpOworICAgIEVYUEVDVF9DQUxMKGZvbywgQmFyKDEpKQorICAgICAgICAuSW5TZXF1ZW5jZShzMSwgczIpOworICB9CisKKyAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMikpCisgICAgICAuVGltZXMoMiprUmVwZWF0KQorICAgICAgLkluU2VxdWVuY2UoczEpCisgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOworICBFWFBFQ1RfQ0FMTChmb28sIEJhcigzKSkKKyAgICAgIC5UaW1lcygyKmtSZXBlYXQpCisgICAgICAuSW5TZXF1ZW5jZShzMik7CisKKyAgeworICAgIEluU2VxdWVuY2UgZHVtbXk7CisgICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoMikpCisgICAgICAgIC5JblNlcXVlbmNlKHMxLCBzMik7CisgICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoNCkpOworICB9CisKKyAgZm9vLkJhcigwKTsKKyAgZm9vLkJhcigxKTsKKworICBUaHJlYWRXaXRoUGFyYW08TW9ja0Zvbyo+KiBjb25zdCB0ID0KKyAgICAgIG5ldyBUaHJlYWRXaXRoUGFyYW08TW9ja0Zvbyo+KEhlbHBlcjIsICZmb28sIE5VTEwpOworICBIZWxwZXIyKCZmb28pOworICBKb2luQW5kRGVsZXRlKHQpOworCisgIGZvby5CYXIoMik7CisgIGZvby5CYXIoNCk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIEdvb2dsZSBNb2NrIGNvbnN0cnVjdHMgaW4gbWFueSB0aHJlYWRzIGNvbmN1cnJlbnRseS4KK1RFU1QoU3RyZXNzVGVzdCwgQ2FuVXNlR01vY2tXaXRoVGhyZWFkcykgeworICB2b2lkICgqdGVzdF9yb3V0aW5lc1tdKShEdW1teSBkdW1teSkgPSB7CisgICAgJlRlc3RDb25jdXJyZW50Q29weUFuZFJlYWRMaW5rZWRQdHIsCisgICAgJlRlc3RDb25jdXJyZW50V3JpdGVUb0VxdWFsTGlua2VkUHRyLAorICAgICZUZXN0Q29uY3VycmVudE1vY2tPYmplY3RzLAorICAgICZUZXN0Q29uY3VycmVudENhbGxzT25TYW1lT2JqZWN0LAorICAgICZUZXN0UGFydGlhbGx5T3JkZXJlZEV4cGVjdGF0aW9uc1dpdGhUaHJlYWRzLAorICB9OworCisgIGNvbnN0IGludCBrUm91dGluZXMgPSBzaXplb2YodGVzdF9yb3V0aW5lcykvc2l6ZW9mKHRlc3Rfcm91dGluZXNbMF0pOworICBjb25zdCBpbnQga0NvcGllc09mRWFjaFJvdXRpbmUgPSBrTWF4VGVzdFRocmVhZHMgLyBrUm91dGluZXM7CisgIGNvbnN0IGludCBrVGVzdFRocmVhZHMgPSBrQ29waWVzT2ZFYWNoUm91dGluZSAqIGtSb3V0aW5lczsKKyAgVGhyZWFkV2l0aFBhcmFtPER1bW15PiogdGhyZWFkc1trVGVzdFRocmVhZHNdID0ge307CisgIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RUaHJlYWRzOyBpKyspIHsKKyAgICAvLyBDcmVhdGVzIGEgdGhyZWFkIHRvIHJ1biB0aGUgdGVzdCBmdW5jdGlvbi4KKyAgICB0aHJlYWRzW2ldID0KKyAgICAgICAgbmV3IFRocmVhZFdpdGhQYXJhbTxEdW1teT4odGVzdF9yb3V0aW5lc1tpICUga1JvdXRpbmVzXSwgRHVtbXkoKSwgTlVMTCk7CisgICAgR1RFU1RfTE9HXyhJTkZPKSA8PCAiVGhyZWFkICMiIDw8IGkgPDwgIiBydW5uaW5nIC4gLiAuIjsKKyAgfQorCisgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbWFueSB0aHJlYWRzIHJ1bm5pbmcuCisgIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RUaHJlYWRzOyBpKyspIHsKKyAgICBKb2luQW5kRGVsZXRlKHRocmVhZHNbaV0pOworICB9CisKKyAgLy8gRW5zdXJlcyB0aGF0IHRoZSBjb3JyZWN0IG51bWJlciBvZiBmYWlsdXJlcyBoYXZlIGJlZW4gcmVwb3J0ZWQuCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBpbmZvID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCA9ICppbmZvLT5yZXN1bHQoKTsKKyAgY29uc3QgaW50IGtFeHBlY3RlZEZhaWx1cmVzID0gKDMqa1JlcGVhdCArIDEpKmtDb3BpZXNPZkVhY2hSb3V0aW5lOworICBHVEVTVF9DSEVDS18oa0V4cGVjdGVkRmFpbHVyZXMgPT0gcmVzdWx0LnRvdGFsX3BhcnRfY291bnQoKSkKKyAgICAgIDw8ICJFeHBlY3RlZCAiIDw8IGtFeHBlY3RlZEZhaWx1cmVzIDw8ICIgZmFpbHVyZXMsIGJ1dCBnb3QgIgorICAgICAgPDwgcmVzdWx0LnRvdGFsX3BhcnRfY291bnQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZU1vY2soJmFyZ2MsIGFyZ3YpOworCisgIGNvbnN0IGludCBleGl0X2NvZGUgPSBSVU5fQUxMX1RFU1RTKCk7ICAvLyBFeHBlY3RlZCB0byBmYWlsLgorICBHVEVTVF9DSEVDS18oZXhpdF9jb2RlICE9IDApIDw8ICJSVU5fQUxMX1RFU1RTKCkgZGlkIG5vdCBmYWlsIGFzIGV4cGVjdGVkIjsKKworICBwcmludGYoIlxuUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ZTIyYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xlbW9jay90ZXN0L2dtb2NrX3Rlc3QuY2MKQEAgLTAsMCArMSwyMjEgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KKy8vCisvLyBUaGlzIGZpbGUgdGVzdHMgY29kZSBpbiBnbW9jay5jYy4KKworI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QuaCIKKworI2lmICFkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKKwordXNpbmcgdGVzdGluZzo6R01PQ0tfRkxBRyh2ZXJib3NlKTsKK3VzaW5nIHRlc3Rpbmc6OkluaXRHb29nbGVNb2NrOworCisvLyBWZXJpZmllcyB0aGF0IGNhbGxpbmcgSW5pdEdvb2dsZU1vY2soKSBvbiBhcmd2IHJlc3VsdHMgaW4gbmV3X2FyZ3YsCisvLyBhbmQgdGhlIGdtb2NrX3ZlcmJvc2UgZmxhZydzIHZhbHVlIGlzIHNldCB0byBleHBlY3RlZF9nbW9ja192ZXJib3NlLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIGludCBNLCBpbnQgTj4KK3ZvaWQgVGVzdEluaXRHb29nbGVNb2NrKGNvbnN0IENoYXIqICgmYXJndilbTV0sIGNvbnN0IENoYXIqICgmbmV3X2FyZ3YpW05dLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfZ21vY2tfdmVyYm9zZSkgeworICBjb25zdCA6OnN0ZDo6c3RyaW5nIG9sZF92ZXJib3NlID0gR01PQ0tfRkxBRyh2ZXJib3NlKTsKKworICBpbnQgYXJnYyA9IE07CisgIEluaXRHb29nbGVNb2NrKCZhcmdjLCBjb25zdF9jYXN0PENoYXIqKj4oYXJndikpOworICBBU1NFUlRfRVEoTiwgYXJnYykgPDwgIlRoZSBuZXcgYXJndiBoYXMgd3JvbmcgbnVtYmVyIG9mIGVsZW1lbnRzLiI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICBFWFBFQ1RfU1RSRVEobmV3X2FyZ3ZbaV0sIGFyZ3ZbaV0pOworICB9CisKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX2dtb2NrX3ZlcmJvc2UsIEdNT0NLX0ZMQUcodmVyYm9zZSkuY19zdHIoKSk7CisgIEdNT0NLX0ZMQUcodmVyYm9zZSkgPSBvbGRfdmVyYm9zZTsgIC8vIFJlc3RvcmVzIHRoZSBnbW9ja192ZXJib3NlIGZsYWcuCit9CisKK1RFU1QoSW5pdEdvb2dsZU1vY2tUZXN0LCBQYXJzZXNJbnZhbGlkQ29tbWFuZExpbmUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBuZXdfYXJndltdID0geworICAgIE5VTEwKKyAgfTsKKworICBUZXN0SW5pdEdvb2dsZU1vY2soYXJndiwgbmV3X2FyZ3YsIEdNT0NLX0ZMQUcodmVyYm9zZSkpOworfQorCitURVNUKEluaXRHb29nbGVNb2NrVGVzdCwgUGFyc2VzRW1wdHlDb21tYW5kTGluZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBuZXdfYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCBHTU9DS19GTEFHKHZlcmJvc2UpKTsKK30KKworVEVTVChJbml0R29vZ2xlTW9ja1Rlc3QsIFBhcnNlc1NpbmdsZUZsYWcpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1nbW9ja192ZXJib3NlPWluZm8iLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBuZXdfYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCAiaW5mbyIpOworfQorCitURVNUKEluaXRHb29nbGVNb2NrVGVzdCwgUGFyc2VzVW5yZWNvZ25pemVkRmxhZykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLW5vbl9nbW9ja19mbGFnPWJsYWgiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBuZXdfYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ub25fZ21vY2tfZmxhZz1ibGFoIiwKKyAgICBOVUxMCisgIH07CisKKyAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCBHTU9DS19GTEFHKHZlcmJvc2UpKTsKK30KKworVEVTVChJbml0R29vZ2xlTW9ja1Rlc3QsIFBhcnNlc0dvb2dsZU1vY2tGbGFnQW5kVW5yZWNvZ25pemVkRmxhZykgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLW5vbl9nbW9ja19mbGFnPWJsYWgiLAorICAgICItLWdtb2NrX3ZlcmJvc2U9ZXJyb3IiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBuZXdfYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ub25fZ21vY2tfZmxhZz1ibGFoIiwKKyAgICBOVUxMCisgIH07CisKKyAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCAiZXJyb3IiKTsKK30KKworVEVTVChXaWRlSW5pdEdvb2dsZU1vY2tUZXN0LCBQYXJzZXNJbnZhbGlkQ29tbWFuZExpbmUpIHsKKyAgY29uc3Qgd2NoYXJfdCogYXJndltdID0geworICAgIE5VTEwKKyAgfTsKKworICBjb25zdCB3Y2hhcl90KiBuZXdfYXJndltdID0geworICAgIE5VTEwKKyAgfTsKKworICBUZXN0SW5pdEdvb2dsZU1vY2soYXJndiwgbmV3X2FyZ3YsIEdNT0NLX0ZMQUcodmVyYm9zZSkpOworfQorCitURVNUKFdpZGVJbml0R29vZ2xlTW9ja1Rlc3QsIFBhcnNlc0VtcHR5Q29tbWFuZExpbmUpIHsKKyAgY29uc3Qgd2NoYXJfdCogYXJndltdID0geworICAgIEwiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IHdjaGFyX3QqIG5ld19hcmd2W10gPSB7CisgICAgTCJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCBHTU9DS19GTEFHKHZlcmJvc2UpKTsKK30KKworVEVTVChXaWRlSW5pdEdvb2dsZU1vY2tUZXN0LCBQYXJzZXNTaW5nbGVGbGFnKSB7CisgIGNvbnN0IHdjaGFyX3QqIGFyZ3ZbXSA9IHsKKyAgICBMImZvby5leGUiLAorICAgIEwiLS1nbW9ja192ZXJib3NlPWluZm8iLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCB3Y2hhcl90KiBuZXdfYXJndltdID0geworICAgIEwiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIFRlc3RJbml0R29vZ2xlTW9jayhhcmd2LCBuZXdfYXJndiwgImluZm8iKTsKK30KKworVEVTVChXaWRlSW5pdEdvb2dsZU1vY2tUZXN0LCBQYXJzZXNVbnJlY29nbml6ZWRGbGFnKSB7CisgIGNvbnN0IHdjaGFyX3QqIGFyZ3ZbXSA9IHsKKyAgICBMImZvby5leGUiLAorICAgIEwiLS1ub25fZ21vY2tfZmxhZz1ibGFoIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3Qgd2NoYXJfdCogbmV3X2FyZ3ZbXSA9IHsKKyAgICBMImZvby5leGUiLAorICAgIEwiLS1ub25fZ21vY2tfZmxhZz1ibGFoIiwKKyAgICBOVUxMCisgIH07CisKKyAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCBHTU9DS19GTEFHKHZlcmJvc2UpKTsKK30KKworVEVTVChXaWRlSW5pdEdvb2dsZU1vY2tUZXN0LCBQYXJzZXNHb29nbGVNb2NrRmxhZ0FuZFVucmVjb2duaXplZEZsYWcpIHsKKyAgY29uc3Qgd2NoYXJfdCogYXJndltdID0geworICAgIEwiZm9vLmV4ZSIsCisgICAgTCItLW5vbl9nbW9ja19mbGFnPWJsYWgiLAorICAgIEwiLS1nbW9ja192ZXJib3NlPWVycm9yIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3Qgd2NoYXJfdCogbmV3X2FyZ3ZbXSA9IHsKKyAgICBMImZvby5leGUiLAorICAgIEwiLS1ub25fZ21vY2tfZmxhZz1ibGFoIiwKKyAgICBOVUxMCisgIH07CisKKyAgVGVzdEluaXRHb29nbGVNb2NrKGFyZ3YsIG5ld19hcmd2LCAiZXJyb3IiKTsKK30KKworI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCisKKy8vIE1ha2VzIHN1cmUgR29vZ2xlIE1vY2sgZmxhZ3MgY2FuIGJlIGFjY2Vzc2VkIGluIGNvZGUuCitURVNUKEZsYWdUZXN0LCBJc0FjY2Vzc2libGVJbkNvZGUpIHsKKyAgYm9vbCBkdW1teSA9IHRlc3Rpbmc6OkdNT0NLX0ZMQUcoY2F0Y2hfbGVha2VkX21vY2tzKSAmJgorICAgICAgdGVzdGluZzo6R01PQ0tfRkxBRyh2ZXJib3NlKSA9PSAiIjsKKyAgKHZvaWQpZHVtbXk7ICAvLyBBdm9pZHMgdGhlICJ1bnVzZWQgbG9jYWwgdmFyaWFibGUiIHdhcm5pbmcuCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9nbW9ja190ZXN0X3V0aWxzLnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfdGVzdF91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGUzZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvZ21vY2tfdGVzdF91dGlscy5weQpAQCAtMCwwICsxLDExMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IHV0aWxpdGllcyBmb3IgR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yay4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKKworIyBEZXRlcm1pbmVzIHBhdGggdG8gZ3Rlc3RfdGVzdF91dGlscyBhbmQgaW1wb3J0cyBpdC4KK1NDUklQVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yICcuJworCisjIGlzZGlyIHJlc29sdmVzIHN5bWJvbGljIGxpbmtzLgorZ3Rlc3RfdGVzdHNfdXRpbF9kaXIgPSBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgJy4uL2d0ZXN0L3Rlc3QnKQoraWYgb3MucGF0aC5pc2RpcihndGVzdF90ZXN0c191dGlsX2Rpcik6CisgIEdURVNUX1RFU1RTX1VUSUxfRElSID0gZ3Rlc3RfdGVzdHNfdXRpbF9kaXIKK2Vsc2U6CisgIEdURVNUX1RFU1RTX1VUSUxfRElSID0gb3MucGF0aC5qb2luKFNDUklQVF9ESVIsICcuLi8uLi9ndGVzdC90ZXN0JykKKworc3lzLnBhdGguYXBwZW5kKEdURVNUX1RFU1RTX1VUSUxfRElSKQoraW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjIwNAorCisKK2RlZiBHZXRTb3VyY2VEaXIoKToKKyAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSAucHkgZmlsZXMgYXJlLiIiIgorCisgIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLkdldFNvdXJjZURpcigpCisKKworZGVmIEdldFRlc3RFeGVjdXRhYmxlUGF0aChleGVjdXRhYmxlX25hbWUpOgorICAiIiJSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0ZXN0IGJpbmFyeSBnaXZlbiBpdHMgbmFtZS4KKworICBUaGUgZnVuY3Rpb24gd2lsbCBwcmludCBhIG1lc3NhZ2UgYW5kIGFib3J0IHRoZSBwcm9ncmFtIGlmIHRoZSByZXN1bHRpbmcgZmlsZQorICBkb2Vzbid0IGV4aXN0LgorCisgIEFyZ3M6CisgICAgZXhlY3V0YWJsZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGJpbmFyeSB0aGF0IHRoZSB0ZXN0IHNjcmlwdCBydW5zLgorCisgIFJldHVybnM6CisgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHRlc3QgYmluYXJ5LgorICAiIiIKKworICByZXR1cm4gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoZXhlY3V0YWJsZV9uYW1lKQorCisKK2RlZiBHZXRFeGl0U3RhdHVzKGV4aXRfY29kZSk6CisgICIiIlJldHVybnMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSwgb3IgLTEgaWYgZXhpdCgpIHdhc24ndCBjYWxsZWQuCisKKyAgQXJnczoKKyAgICBleGl0X2NvZGU6IHRoZSByZXN1bHQgdmFsdWUgb2Ygb3Muc3lzdGVtKGNvbW1hbmQpLgorICAiIiIKKworICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgIyBPbiBXaW5kb3dzLCBvcy5XRVhJVFNUQVRVUygpIGRvZXNuJ3Qgd29yayBhbmQgb3Muc3lzdGVtKCkgcmV0dXJucworICAgICMgdGhlIGFyZ3VtZW50IHRvIGV4aXQoKSBkaXJlY3RseS4KKyAgICByZXR1cm4gZXhpdF9jb2RlCisgIGVsc2U6CisgICAgIyBPbiBVbml4LCBvcy5XRVhJVFNUQVRVUygpIG11c3QgYmUgdXNlZCB0byBleHRyYWN0IHRoZSBleGl0IHN0YXR1cworICAgICMgZnJvbSB0aGUgcmVzdWx0IG9mIG9zLnN5c3RlbSgpLgorICAgIGlmIG9zLldJRkVYSVRFRChleGl0X2NvZGUpOgorICAgICAgcmV0dXJuIG9zLldFWElUU1RBVFVTKGV4aXRfY29kZSkKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIC0xCisKKworIyBTdXBwcmVzc2VzIHRoZSAiSW52YWxpZCBjb25zdCBuYW1lIiBsaW50IGNvbXBsYWludAorIyBweWxpbnQ6IGRpc2FibGUtbXNnPUM2NDA5CisKKyMgRXhwb3NlcyB1dGlsaXRpZXMgZnJvbSBndGVzdF90ZXN0X3V0aWxzLgorU3VicHJvY2VzcyA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcworVGVzdENhc2UgPSBndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlCitlbnZpcm9uID0gZ3Rlc3RfdGVzdF91dGlscy5lbnZpcm9uCitTZXRFbnZWYXIgPSBndGVzdF90ZXN0X3V0aWxzLlNldEVudlZhcgorUFJFTUFUVVJFX0VYSVRfRklMRV9FTlZfVkFSID0gZ3Rlc3RfdGVzdF91dGlscy5QUkVNQVRVUkVfRVhJVF9GSUxFX0VOVl9WQVIKKworIyBweWxpbnQ6IGVuYWJsZS1tc2c9QzY0MDkKKworCitkZWYgTWFpbigpOgorICAiIiJSdW5zIHRoZSB1bml0IHRlc3QuIiIiCisKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9DSEFOR0VTIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L0NIQU5HRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1MjEzMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9DSEFOR0VTCkBAIC0wLDAgKzEsMTU3IEBACitDaGFuZ2VzIGZvciAxLjcuMDoKKworKiBOZXcgZmVhdHVyZTogZGVhdGggdGVzdHMgYXJlIHN1cHBvcnRlZCBvbiBPcGVuQlNEIGFuZCBpbiBpT1MKKyAgc2ltdWxhdG9yIG5vdy4KKyogTmV3IGZlYXR1cmU6IEdvb2dsZSBUZXN0IG5vdyBpbXBsZW1lbnRzIGEgcHJvdG9jb2wgdG8gYWxsb3cKKyAgYSB0ZXN0IHJ1bm5lciB0byBkZXRlY3QgdGhhdCBhIHRlc3QgcHJvZ3JhbSBoYXMgZXhpdGVkCisgIHByZW1hdHVyZWx5IGFuZCByZXBvcnQgaXQgYXMgYSBmYWlsdXJlIChiZWZvcmUgaXQgd291bGQgYmUKKyAgZmFsc2VseSByZXBvcnRlZCBhcyBhIHN1Y2Nlc3MgaWYgdGhlIGV4aXQgY29kZSBpcyAwKS4KKyogTmV3IGZlYXR1cmU6IFRlc3Q6OlJlY29yZFByb3BlcnR5KCkgY2FuIG5vdyBiZSB1c2VkIG91dHNpZGUgb2YgdGhlCisgIGxpZmVzcGFuIG9mIGEgdGVzdCBtZXRob2QsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBhdHRyaWJ1dGVkIHRvCisgIHRoZSBjdXJyZW50IHRlc3QgY2FzZSBvciB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBYTUwgcmVwb3J0LgorKiBOZXcgZmVhdHVyZSAocG90ZW50aWFsbHkgYnJlYWtpbmcpOiAtLWd0ZXN0X2xpc3RfdGVzdHMgbm93IHByaW50cworICB0aGUgdHlwZSBwYXJhbWV0ZXJzIGFuZCB2YWx1ZSBwYXJhbWV0ZXJzIGZvciBlYWNoIHRlc3QuCisqIEltcHJvdmVtZW50OiBjaGFyIHBvaW50ZXJzIGFuZCBjaGFyIGFycmF5cyBhcmUgbm93IGVzY2FwZWQgcHJvcGVybHkKKyAgaW4gZmFpbHVyZSBtZXNzYWdlcy4KKyogSW1wcm92ZW1lbnQ6IGZhaWx1cmUgc3VtbWFyeSBpbiBYTUwgcmVwb3J0cyBub3cgaW5jbHVkZXMgZmlsZSBhbmQKKyAgbGluZSBpbmZvcm1hdGlvbi4KKyogSW1wcm92ZW1lbnQ6IHRoZSA8dGVzdHN1aXRlcz4gWE1MIGVsZW1lbnQgbm93IGhhcyBhIHRpbWVzdGFtcCBhdHRyaWJ1dGUuCisqIEltcHJvdmVtZW50OiBXaGVuIC0tZ3Rlc3RfZmlsdGVyIGlzIHNwZWNpZmllZCwgWE1MIHJlcG9ydCBub3cgZG9lc24ndAorICBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRlc3RzIHRoYXQgYXJlIGZpbHRlcmVkIG91dC4KKyogRml4ZWQgdGhlIGJ1ZyB3aGVyZSBsb25nIC0tZ3Rlc3RfZmlsdGVyIGZsYWcgdmFsdWVzIGFyZSB0cnVuY2F0ZWQgaW4KKyAgZGVhdGggdGVzdHMuCisqIFBvdGVudGlhbGx5IGJyZWFraW5nIGNoYW5nZTogUlVOX0FMTF9URVNUUygpIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhCisgIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBtYWNybyBpbiBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIENsYW5nLgorKiBDb21wYXRpYmlsaXR5IGZpeGVzIHdpdGggQysrIDExIGFuZCB2YXJpb3VzIHBsYXRmb3Jtcy4KKyogQnVnL3dhcm5pbmcgZml4ZXMuCisKK0NoYW5nZXMgZm9yIDEuNi4wOgorCisqIE5ldyBmZWF0dXJlOiBBRERfRkFJTFVSRV9BVCgpIGZvciByZXBvcnRpbmcgYSB0ZXN0IGZhaWx1cmUgYXQgdGhlCisgIGdpdmVuIHNvdXJjZSBsb2NhdGlvbiAtLSB1c2VmdWwgZm9yIHdyaXRpbmcgdGVzdGluZyB1dGlsaXRpZXMuCisqIE5ldyBmZWF0dXJlOiB0aGUgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgaXMgbW92ZWQgZnJvbSBHb29nbGUgTW9jaworICB0byBHb29nbGUgVGVzdC4KKyogTmV3IGZlYXR1cmU6IHR5cGUgcGFyYW1ldGVycyBhbmQgdmFsdWUgcGFyYW1ldGVycyBhcmUgcmVwb3J0ZWQgaW4KKyAgdGhlIFhNTCByZXBvcnQgbm93LgorKiBBIGd0ZXN0X2Rpc2FibGVfcHRocmVhZHMgQ01ha2Ugb3B0aW9uLgorKiBDb2xvcmVkIG91dHB1dCB3b3JrcyBpbiBHTlUgU2NyZWVuIHNlc3Npb25zIG5vdy4KKyogUGFyYW1ldGVycyBvZiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBub3cgcHJpbnRlZCBpbiB0aGUKKyAgdGV4dHVhbCBvdXRwdXQuCisqIEZhaWx1cmVzIGZyb20gYWQgaG9jIHRlc3QgYXNzZXJ0aW9ucyBydW4gYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBhcmUKKyAgbm93IGNvcnJlY3RseSByZXBvcnRlZC4KKyogQXJndW1lbnRzIG9mIEFTU0VSVF9YWSBhbmQgRVhQRUNUX1hZIG5vIGxvbmdlciBuZWVkIHRvIHN1cHBvcnQgPDwgdG8KKyAgb3N0cmVhbS4KKyogTW9yZSBjb21wbGV0ZSBoYW5kbGluZyBvZiBleGNlcHRpb25zLgorKiBHVEVTVF9BU1NFUlRfWFkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBBU1NFUlRfWFkgaW4gY2FzZSB0aGUgbGF0dGVyCisgIG5hbWUgaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgbGlicmFyeS4KKyogLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIGlzIG5vdyB0cnVlIGJ5IGRlZmF1bHQsIGFsbG93aW5nIGEgdGVzdAorICBwcm9ncmFtIHRvIGNvbnRpbnVlIGFmdGVyIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisqIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlcyBjYW4gbm93IGRlcml2ZSBmcm9tIFRlc3QgYW5kCisgIFdpdGhQYXJhbUludGVyZmFjZTxUPiBzZXBhcmF0ZWx5LCBlYXNpbmcgY29udmVyc2lvbiBvZiBsZWdhY3kgdGVzdHMuCisqIERlYXRoIHRlc3QgbWVzc2FnZXMgYXJlIGNsZWFybHkgbWFya2VkIHRvIG1ha2UgdGhlbSBtb3JlCisgIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIG90aGVyIG1lc3NhZ2VzLgorKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBBbmRyb2lkLCBHb29nbGUgTmF0aXZlIENsaWVudCwgTWluR1csIEhQIFVYLAorICBQb3dlclBDLCBMdWNpZCBhdXRvdG9vbHMsIGxpYkNTdGQsIFN1biBDKyssIEJvcmxhbmQgQysrIEJ1aWxkZXIgKENvZGUgR2VhciksCisgIElCTSBYTCBDKysgKFZpc3VhbCBBZ2UgQysrKSwgYW5kIEMrKzB4LgorKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KKyogUG90ZW50aWFsbHkgaW5jb21wYXRpYmxlIGNoYW5nZXM6IGRpc2FibGVzIHRoZSBoYXJtZnVsICdtYWtlIGluc3RhbGwnCisgIGNvbW1hbmQgaW4gYXV0b3Rvb2xzLgorCitDaGFuZ2VzIGZvciAxLjUuMDoKKworICogTmV3IGZlYXR1cmU6IGFzc2VydGlvbnMgY2FuIGJlIHNhZmVseSBjYWxsZWQgaW4gbXVsdGlwbGUgdGhyZWFkcworICAgd2hlcmUgdGhlIHB0aHJlYWRzIGxpYnJhcnkgaXMgYXZhaWxhYmxlLgorICogTmV3IGZlYXR1cmU6IHByZWRpY2F0ZXMgdXNlZCBpbnNpZGUgRVhQRUNUX1RSVUUoKSBhbmQgZnJpZW5kcworICAgY2FuIG5vdyBnZW5lcmF0ZSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlcy4KKyAqIE5ldyBmZWF0dXJlOiBHb29nbGUgVGVzdCBjYW4gbm93IGJlIGNvbXBpbGVkIGFzIGEgRExMLgorICogTmV3IGZlYXR1cmU6IGZ1c2VkIHNvdXJjZSBmaWxlcyBhcmUgaW5jbHVkZWQuCisgKiBOZXcgZmVhdHVyZTogcHJpbnRzIGhlbHAgd2hlbiBlbmNvdW50ZXJpbmcgdW5yZWNvZ25pemVkIEdvb2dsZSBUZXN0IGZsYWdzLgorICogRXhwZXJpbWVudGFsIGZlYXR1cmU6IENNYWtlIGJ1aWxkIHNjcmlwdCAocmVxdWlyZXMgQ01ha2UgMi42LjQrKS4KKyAqIEV4cGVyaW1lbnRhbCBmZWF0dXJlOiB0aGUgUHVtcCBzY3JpcHQgZm9yIG1ldGEgcHJvZ3JhbW1pbmcuCisgKiBkb3VibGUgdmFsdWVzIHN0cmVhbWVkIHRvIGFuIGFzc2VydGlvbiBhcmUgcHJpbnRlZCB3aXRoIGVub3VnaCBwcmVjaXNpb24KKyAgIHRvIGRpZmZlcmVudGlhdGUgYW55IHR3byBkaWZmZXJlbnQgdmFsdWVzLgorICogR29vZ2xlIFRlc3Qgbm93IHdvcmtzIG9uIFNvbGFyaXMgYW5kIEFJWC4KKyAqIEJ1aWxkIGFuZCB0ZXN0IHNjcmlwdCBpbXByb3ZlbWVudHMuCisgKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KKworIFBvdGVudGlhbGx5IGJyZWFraW5nIGNoYW5nZXM6CisKKyAqIFN0b3BwZWQgc3VwcG9ydGluZyBWQysrIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCisgKiBEcm9wcGVkIHN1cHBvcnQgZm9yICdtYWtlIGluc3RhbGwnLgorCitDaGFuZ2VzIGZvciAxLjQuMDoKKworICogTmV3IGZlYXR1cmU6IHRoZSBldmVudCBsaXN0ZW5lciBBUEkKKyAqIE5ldyBmZWF0dXJlOiB0ZXN0IHNodWZmbGluZworICogTmV3IGZlYXR1cmU6IHRoZSBYTUwgcmVwb3J0IGZvcm1hdCBpcyBjbG9zZXIgdG8ganVuaXRyZXBvcnQgYW5kIGNhbgorICAgYmUgcGFyc2VkIGJ5IEh1ZHNvbiBub3cuCisgKiBOZXcgZmVhdHVyZTogd2hlbiBhIHRlc3QgcnVucyB1bmRlciBWaXN1YWwgU3R1ZGlvLCBpdHMgZmFpbHVyZXMgYXJlCisgICBpbnRlZ3JhdGVkIGluIHRoZSBJREUuCisgKiBOZXcgZmVhdHVyZTogL01EKGQpIHZlcnNpb25zIG9mIFZDKysgcHJvamVjdHMuCisgKiBOZXcgZmVhdHVyZTogZWxhcHNlZCB0aW1lIGZvciB0aGUgdGVzdHMgaXMgcHJpbnRlZCBieSBkZWZhdWx0LgorICogTmV3IGZlYXR1cmU6IGNvbWVzIHdpdGggYSBUUjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc3VjaCB0aGF0IEJvb3N0CisgICBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBDb21iaW5lKCkuCisgKiBOZXcgZmVhdHVyZTogRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCBtYWNybyBhbmQgZnJpZW5kcy4KKyAqIE5ldyBmZWF0dXJlOiB0aGUgWGNvZGUgcHJvamVjdCBjYW4gbm93IHByb2R1Y2Ugc3RhdGljIGd0ZXN0CisgICBsaWJyYXJpZXMgaW4gYWRkaXRpb24gdG8gYSBmcmFtZXdvcmsuCisgKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBTb2xhcmlzLCBDeWd3aW4sIG1pbkdXLCBXaW5kb3dzIE1vYmlsZSwKKyAgIFN5bWJpYW4sIGdjYywgYW5kIEMrK0J1aWxkZXIuCisgKiBCdWcgZml4ZXMgYW5kIGltcGxlbWVudGF0aW9uIGNsZWFuLXVwcy4KKworQ2hhbmdlcyBmb3IgMS4zLjA6CisKKyAqIE5ldyBmZWF0dXJlOiBkZWF0aCB0ZXN0cyBvbiBXaW5kb3dzLCBDeWd3aW4sIGFuZCBNYWMuCisgKiBOZXcgZmVhdHVyZTogYWJpbGl0eSB0byB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBpbiBvdGhlciB0ZXN0aW5nCisgICBmcmFtZXdvcmtzLgorICogTmV3IGZlYXR1cmU6IGFiaWxpdHkgdG8gcnVuIGRpc2FibGVkIHRlc3QgdmlhCisgICAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzLgorICogTmV3IGZlYXR1cmU6IHRoZSAtLWhlbHAgZmxhZyBmb3IgcHJpbnRpbmcgdGhlIHVzYWdlLgorICogTmV3IGZlYXR1cmU6IGFjY2VzcyB0byBHb29nbGUgVGVzdCBmbGFnIHZhbHVlcyBpbiB1c2VyIGNvZGUuCisgKiBOZXcgZmVhdHVyZTogYSBzY3JpcHQgdGhhdCBwYWNrcyBHb29nbGUgVGVzdCBpbnRvIG9uZSAuaCBhbmQgb25lCisgICAuY2MgZmlsZSBmb3IgZWFzeSBkZXBsb3ltZW50LgorICogTmV3IGZlYXR1cmU6IHN1cHBvcnQgZm9yIGRpc3RyaWJ1dGluZyB0ZXN0IGZ1bmN0aW9ucyB0byBtdWx0aXBsZQorICAgbWFjaGluZXMgKHJlcXVpcmVzIHN1cHBvcnQgZnJvbSB0aGUgdGVzdCBydW5uZXIpLgorICogQnVnIGZpeGVzIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGVhbi11cHMuCisKK0NoYW5nZXMgZm9yIDEuMi4xOgorCisgKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBMaW51eCBJQS02NCBhbmQgSUJNIHovT1MuCisgKiBBZGRlZCBzdXBwb3J0IGZvciB1c2luZyBCb29zdCBhbmQgb3RoZXIgVFIxIGltcGxlbWVudGF0aW9ucy4KKyAqIENoYW5nZXMgdG8gdGhlIGJ1aWxkIHNjcmlwdHMgdG8gc3VwcG9ydCB1cGNvbWluZyByZWxlYXNlIG9mIEdvb2dsZSBDKysKKyAgIE1vY2tpbmcgRnJhbWV3b3JrLgorICogQWRkZWQgTWFrZWZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBwYWNrYWdlLgorICogSW1wcm92ZWQgYnVpbGQgaW5zdHJ1Y3Rpb25zIGluIFJFQURNRS4KKworQ2hhbmdlcyBmb3IgMS4yLjA6CisKKyAqIE5ldyBmZWF0dXJlOiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorICogTmV3IGZlYXR1cmU6IHRoZSBBU1NFUlQvRVhQRUNUXyhOT04pRkFUQUxfRkFJTFVSRShfT05fQUxMX1RIUkVBRFMpCisgICBtYWNyb3MuCisgKiBDaGFuZ2VkIHRoZSBYTUwgcmVwb3J0IGZvcm1hdCB0byBtYXRjaCBKVW5pdC9BbnQncy4KKyAqIEFkZGVkIHRlc3RzIHRvIHRoZSBYY29kZSBwcm9qZWN0LgorICogQWRkZWQgc2NvbnMvU0NvbnNjcmlwdCBmb3IgYnVpbGRpbmcgd2l0aCBTQ29ucy4KKyAqIEFkZGVkIHNyYy9ndGVzdC1hbGwuY2MgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0IGZyb20gYSBzaW5nbGUgZmlsZS4KKyAqIEZpeGVkIGNvbXBhdGliaWxpdHkgd2l0aCBTb2xhcmlzIGFuZCB6L09TLgorICogRW5hYmxlZCBydW5uaW5nIFB5dGhvbiB0ZXN0cyBvbiBzeXN0ZW1zIHdpdGggcHl0aG9uIDIuMyBpbnN0YWxsZWQsCisgICBlLmcuIE1hYyBPUyBYIDEwLjQuCisgKiBCdWcgZml4ZXMuCisKK0NoYW5nZXMgZm9yIDEuMS4wOgorCisgKiBOZXcgZmVhdHVyZTogdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorICogTmV3IGZlYXR1cmU6IGV4Y2VwdGlvbiBhc3NlcnRpb25zLgorICogTmV3IGZlYXR1cmU6IHByaW50aW5nIGVsYXBzZWQgdGltZSBvZiB0ZXN0cy4KKyAqIEltcHJvdmVkIHRoZSByb2J1c3RuZXNzIG9mIGRlYXRoIHRlc3RzLgorICogQWRkZWQgYW4gWGNvZGUgcHJvamVjdCBhbmQgc2FtcGxlcy4KKyAqIEFkanVzdGVkIHRoZSBvdXRwdXQgZm9ybWF0IG9uIFdpbmRvd3MgdG8gYmUgdW5kZXJzdGFuZGFibGUgYnkgVmlzdWFsIFN0dWRpby4KKyAqIE1pbm9yIGJ1ZyBmaXhlcy4KKworQ2hhbmdlcyBmb3IgMS4wLjE6CisKKyAqIEFkZGVkIHByb2plY3QgZmlsZXMgZm9yIFZpc3VhbCBTdHVkaW8gNy4xLgorICogRml4ZWQgaXNzdWVzIHdpdGggY29tcGlsaW5nIG9uIE1hYyBPUyBYLgorICogRml4ZWQgaXNzdWVzIHdpdGggY29tcGlsaW5nIG9uIEN5Z3dpbi4KKworQ2hhbmdlcyBmb3IgMS4wLjA6CisKKyAqIEluaXRpYWwgT3BlbiBTb3VyY2UgcmVsZWFzZSBvZiBHb29nbGUgVGVzdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzhjZmUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNjAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDTWFrZSBidWlsZCBzY3JpcHQgZm9yIEdvb2dsZSBUZXN0LgorIworIyBUbyBydW4gdGhlIHRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYgb24gTGludXgsIHVzZSAnbWFrZSB0ZXN0JyBvcgorIyBjdGVzdC4gIFlvdSBjYW4gc2VsZWN0IHdoaWNoIHRlc3RzIHRvIHJ1biB1c2luZyAnY3Rlc3QgLVIgcmVnZXgnLgorIyBGb3IgbW9yZSBvcHRpb25zLCBydW4gJ2N0ZXN0IC0taGVscCcuCisKKyMgQlVJTERfU0hBUkVEX0xJQlMgaXMgYSBzdGFuZGFyZCBDTWFrZSB2YXJpYWJsZSwgYnV0IHdlIGRlY2xhcmUgaXQgaGVyZSB0bworIyBtYWtlIGl0IHByb21pbmVudCBpbiB0aGUgR1VJLgorb3B0aW9uKEJVSUxEX1NIQVJFRF9MSUJTICJCdWlsZCBzaGFyZWQgbGlicmFyaWVzIChETExzKS4iIE9GRikKKworIyBXaGVuIG90aGVyIGxpYnJhcmllcyBhcmUgdXNpbmcgYSBzaGFyZWQgdmVyc2lvbiBvZiBydW50aW1lIGxpYnJhcmllcywKKyMgR29vZ2xlIFRlc3QgYWxzbyBoYXMgdG8gdXNlIG9uZS4KK29wdGlvbigKKyAgZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydAorICAiVXNlIHNoYXJlZCAoRExMKSBydW4tdGltZSBsaWIgZXZlbiB3aGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIHN0YXRpYyBsaWIuIgorICBPRkYpCisKK29wdGlvbihndGVzdF9idWlsZF90ZXN0cyAiQnVpbGQgYWxsIG9mIGd0ZXN0J3Mgb3duIHRlc3RzLiIgT0ZGKQorCitvcHRpb24oZ3Rlc3RfYnVpbGRfc2FtcGxlcyAiQnVpbGQgZ3Rlc3QncyBzYW1wbGUgcHJvZ3JhbXMuIiBPRkYpCisKK29wdGlvbihndGVzdF9kaXNhYmxlX3B0aHJlYWRzICJEaXNhYmxlIHVzZXMgb2YgcHRocmVhZHMgaW4gZ3Rlc3QuIiBPRkYpCisKKyMgRGVmaW5lcyBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKSBhbmQgc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkuCitpbmNsdWRlKGNtYWtlL2hlcm1ldGljX2J1aWxkLmNtYWtlIE9QVElPTkFMKQorCitpZiAoQ09NTUFORCBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQpCisgIHByZV9wcm9qZWN0X3NldF91cF9oZXJtZXRpY19idWlsZCgpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQcm9qZWN0LXdpZGUgc2V0dGluZ3MKKworIyBOYW1lIG9mIHRoZSBwcm9qZWN0LgorIworIyBDTWFrZSBmaWxlcyBpbiB0aGlzIHByb2plY3QgY2FuIHJlZmVyIHRvIHRoZSByb290IHNvdXJjZSBkaXJlY3RvcnkKKyMgYXMgJHtndGVzdF9TT1VSQ0VfRElSfSBhbmQgdG8gdGhlIHJvb3QgYmluYXJ5IGRpcmVjdG9yeSBhcworIyAke2d0ZXN0X0JJTkFSWV9ESVJ9LgorIyBMYW5ndWFnZSAiQyIgaXMgcmVxdWlyZWQgZm9yIGZpbmRfcGFja2FnZShUaHJlYWRzKS4KK3Byb2plY3QoZ3Rlc3QgQ1hYIEMpCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42LjIpCisKK2lmIChDT01NQU5EIHNldF91cF9oZXJtZXRpY19idWlsZCkKKyAgc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkKK2VuZGlmKCkKKworIyBEZWZpbmUgaGVscGVyIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIHVzZWQgYnkgR29vZ2xlIFRlc3QuCitpbmNsdWRlKGNtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlKQorCitjb25maWdfY29tcGlsZXJfYW5kX2xpbmtlcigpICAjIERlZmluZWQgaW4gaW50ZXJuYWxfdXRpbHMuY21ha2UuCisKKyMgV2hlcmUgR29vZ2xlIFRlc3QncyAuaCBmaWxlcyBjYW4gYmUgZm91bmQuCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAke2d0ZXN0X1NPVVJDRV9ESVJ9L2luY2x1ZGUKKyAgJHtndGVzdF9TT1VSQ0VfRElSfSkKKworIyBXaGVyZSBHb29nbGUgVGVzdCdzIGxpYnJhcmllcyBjYW4gYmUgZm91bmQuCitsaW5rX2RpcmVjdG9yaWVzKCR7Z3Rlc3RfQklOQVJZX0RJUn0vc3JjKQorCisjIFN1bW1hcnkgb2YgdHVwbGUgc3VwcG9ydCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW86CisjIENvbXBpbGVyICAgIHZlcnNpb24oTVMpICB2ZXJzaW9uKGNtYWtlKSAgU3VwcG9ydAorIyAtLS0tLS0tLS0tICAtLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIDw9IFZTIDIwMTAgIDw9IDEwICAgICAgICA8PSAxNjAwICAgICAgICAgVXNlIEdvb2dsZSBUZXN0cydzIG93biB0dXBsZS4KKyMgVlMgMjAxMiAgICAgMTEgICAgICAgICAgIDE3MDAgICAgICAgICAgICBzdGQ6OnRyMTo6dHVwbGUgKyBfVkFSSUFESUNfTUFYPTEwCisjIFZTIDIwMTMgICAgIDEyICAgICAgICAgICAxODAwICAgICAgICAgICAgc3RkOjp0cjE6OnR1cGxlCitpZiAoTVNWQyBBTkQgTVNWQ19WRVJTSU9OIEVRVUFMIDE3MDApCisgIGFkZF9kZWZpbml0aW9ucygvRCBfVkFSSUFESUNfTUFYPTEwKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRGVmaW5lcyB0aGUgZ3Rlc3QgJiBndGVzdF9tYWluIGxpYnJhcmllcy4gIFVzZXIgdGVzdHMgc2hvdWxkIGxpbmsKKyMgd2l0aCBvbmUgb2YgdGhlbS4KKworIyBHb29nbGUgVGVzdCBsaWJyYXJpZXMuICBXZSBidWlsZCB0aGVtIHVzaW5nIG1vcmUgc3RyaWN0IHdhcm5pbmdzIHRoYW4gd2hhdAorIyBhcmUgdXNlZCBmb3Igb3RoZXIgdGFyZ2V0cywgdG8gZW5zdXJlIHRoYXQgZ3Rlc3QgY2FuIGJlIGNvbXBpbGVkIGJ5IGEgdXNlcgorIyBhZ2dyZXNzaXZlIGFib3V0IHdhcm5pbmdzLgorY3h4X2xpYnJhcnkoZ3Rlc3QgIiR7Y3h4X3N0cmljdH0iIHNyYy9ndGVzdC1hbGwuY2MpCitjeHhfbGlicmFyeShndGVzdF9tYWluICIke2N4eF9zdHJpY3R9IiBzcmMvZ3Rlc3RfbWFpbi5jYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhndGVzdF9tYWluIGd0ZXN0KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU2FtcGxlcyBvbiBob3cgdG8gbGluayB1c2VyIHRlc3RzIHdpdGggZ3Rlc3Qgb3IgZ3Rlc3RfbWFpbi4KKyMKKyMgVGhleSBhcmUgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuICBUbyBidWlsZCB0aGVtLCBzZXQgdGhlCisjIGd0ZXN0X2J1aWxkX3NhbXBsZXMgb3B0aW9uIHRvIE9OLiAgWW91IGNhbiBkbyBpdCBieSBydW5uaW5nIGNjbWFrZQorIyBvciBzcGVjaWZ5aW5nIHRoZSAtRGd0ZXN0X2J1aWxkX3NhbXBsZXM9T04gZmxhZyB3aGVuIHJ1bm5pbmcgY21ha2UuCisKK2lmIChndGVzdF9idWlsZF9zYW1wbGVzKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGUxX3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbiBzYW1wbGVzL3NhbXBsZTEuY2MpCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTJfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluIHNhbXBsZXMvc2FtcGxlMi5jYykKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlM191bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4pCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTRfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluIHNhbXBsZXMvc2FtcGxlNC5jYykKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlNV91bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4gc2FtcGxlcy9zYW1wbGUxLmNjKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGU2X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3RfbWFpbikKKyAgY3h4X2V4ZWN1dGFibGUoc2FtcGxlN191bml0dGVzdCBzYW1wbGVzIGd0ZXN0X21haW4pCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZThfdW5pdHRlc3Qgc2FtcGxlcyBndGVzdF9tYWluKQorICBjeHhfZXhlY3V0YWJsZShzYW1wbGU5X3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3QpCisgIGN4eF9leGVjdXRhYmxlKHNhbXBsZTEwX3VuaXR0ZXN0IHNhbXBsZXMgZ3Rlc3QpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBHb29nbGUgVGVzdCdzIG93biB0ZXN0cy4KKyMKKyMgWW91IGNhbiBza2lwIHRoaXMgc2VjdGlvbiBpZiB5b3UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGVzdGluZworIyBHb29nbGUgVGVzdCBpdHNlbGYuCisjCisjIFRoZSB0ZXN0cyBhcmUgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuICBUbyBidWlsZCB0aGVtLCBzZXQgdGhlCisjIGd0ZXN0X2J1aWxkX3Rlc3RzIG9wdGlvbiB0byBPTi4gIFlvdSBjYW4gZG8gaXQgYnkgcnVubmluZyBjY21ha2UKKyMgb3Igc3BlY2lmeWluZyB0aGUgLURndGVzdF9idWlsZF90ZXN0cz1PTiBmbGFnIHdoZW4gcnVubmluZyBjbWFrZS4KKworaWYgKGd0ZXN0X2J1aWxkX3Rlc3RzKQorICAjIFRoaXMgbXVzdCBiZSBzZXQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGZvciB0aGUgdGVzdHMgdG8gYmUgcnVuIGJ5CisgICMgJ21ha2UgdGVzdCcgb3IgY3Rlc3QuCisgIGVuYWJsZV90ZXN0aW5nKCkKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyBDKysgdGVzdHMgYnVpbHQgd2l0aCBzdGFuZGFyZCBjb21waWxlciBmbGFncy4KKworICBjeHhfdGVzdChndGVzdC1kZWF0aC10ZXN0X3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdCBndGVzdCkKKyAgY3h4X3Rlc3QoZ3Rlc3QtZmlsZXBhdGhfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdC1saW5rZWRfcHRyX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3QtbGlzdGVuZXJfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdF9tYWluX3VuaXR0ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0LW1lc3NhZ2VfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdF9ub190ZXN0X3VuaXR0ZXN0IGd0ZXN0KQorICBjeHhfdGVzdChndGVzdC1vcHRpb25zX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0IGd0ZXN0CisgICAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjKQorICBjeHhfdGVzdChndGVzdC1wb3J0X3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QgZ3Rlc3QKKyAgICB0ZXN0L2d0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QuY2MpCisgIGN4eF90ZXN0KGd0ZXN0LXByaW50ZXJzX3Rlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X3Rlc3QoZ3Rlc3RfcHJvZF90ZXN0IGd0ZXN0X21haW4KKyAgICB0ZXN0L3Byb2R1Y3Rpb24uY2MpCisgIGN4eF90ZXN0KGd0ZXN0X3JlcGVhdF90ZXN0IGd0ZXN0KQorICBjeHhfdGVzdChndGVzdF9zb2xlX2hlYWRlcl90ZXN0IGd0ZXN0X21haW4pCisgIGN4eF90ZXN0KGd0ZXN0X3N0cmVzc190ZXN0IGd0ZXN0KQorICBjeHhfdGVzdChndGVzdC10ZXN0LXBhcnRfdGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdF90aHJvd19vbl9mYWlsdXJlX2V4X3Rlc3QgZ3Rlc3QpCisgIGN4eF90ZXN0KGd0ZXN0LXR5cGVkLXRlc3RfdGVzdCBndGVzdF9tYWluCisgICAgdGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjKQorICBjeHhfdGVzdChndGVzdF91bml0dGVzdCBndGVzdF9tYWluKQorICBjeHhfdGVzdChndGVzdC11bml0dGVzdC1hcGlfdGVzdCBndGVzdCkKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyBDKysgdGVzdHMgYnVpbHQgd2l0aCBub24tc3RhbmRhcmQgY29tcGlsZXIgZmxhZ3MuCisKKyAgIyBNU1ZDIDcuMSBkb2VzIG5vdCBzdXBwb3J0IFNUTCB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCisgIGlmIChOT1QgTVNWQyBPUiBNU1ZDX1ZFUlNJT04gR1JFQVRFUiAxMzEwKQorICAgIGN4eF9saWJyYXJ5KGd0ZXN0X25vX2V4Y2VwdGlvbiAiJHtjeHhfbm9fZXhjZXB0aW9ufSIKKyAgICAgIHNyYy9ndGVzdC1hbGwuY2MpCisgICAgY3h4X2xpYnJhcnkoZ3Rlc3RfbWFpbl9ub19leGNlcHRpb24gIiR7Y3h4X25vX2V4Y2VwdGlvbn0iCisgICAgICBzcmMvZ3Rlc3QtYWxsLmNjIHNyYy9ndGVzdF9tYWluLmNjKQorICBlbmRpZigpCisgIGN4eF9saWJyYXJ5KGd0ZXN0X21haW5fbm9fcnR0aSAiJHtjeHhfbm9fcnR0aX0iCisgICAgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYykKKworICBjeHhfdGVzdF93aXRoX2ZsYWdzKGd0ZXN0LWRlYXRoLXRlc3RfZXhfbm9jYXRjaF90ZXN0CisgICAgIiR7Y3h4X2V4Y2VwdGlvbn0gLURHVEVTVF9FTkFCTEVfQ0FUQ0hfRVhDRVBUSU9OU189MCIKKyAgICBndGVzdCB0ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYykKKyAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhndGVzdC1kZWF0aC10ZXN0X2V4X2NhdGNoX3Rlc3QKKyAgICAiJHtjeHhfZXhjZXB0aW9ufSAtREdURVNUX0VOQUJMRV9DQVRDSF9FWENFUFRJT05TXz0xIgorICAgIGd0ZXN0IHRlc3QvZ3Rlc3QtZGVhdGgtdGVzdF9leF90ZXN0LmNjKQorCisgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoZ3Rlc3Rfbm9fcnR0aV91bml0dGVzdCAiJHtjeHhfbm9fcnR0aX0iCisgICAgZ3Rlc3RfbWFpbl9ub19ydHRpIHRlc3QvZ3Rlc3RfdW5pdHRlc3QuY2MpCisKKyAgY3h4X3NoYXJlZF9saWJyYXJ5KGd0ZXN0X2RsbCAiJHtjeHhfZGVmYXVsdH0iCisgICAgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYykKKworICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKGd0ZXN0X2RsbF90ZXN0XyAiJHtjeHhfZGVmYXVsdH0iCisgICAgZ3Rlc3RfZGxsIHRlc3QvZ3Rlc3RfYWxsX3Rlc3QuY2MpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhndGVzdF9kbGxfdGVzdF8KKyAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWT0xIikKKworICBpZiAoTk9UIE1TVkMgT1IgTVNWQ19WRVJTSU9OIExFU1MgMTYwMCkgICMgMTYwMCBpcyBWaXN1YWwgU3R1ZGlvIDIwMTAuCisgICAgIyBWaXN1YWwgU3R1ZGlvIDIwMTAsIDIwMTIsIGFuZCAyMDEzIGRlZmluZSBzeW1ib2xzIGluIHN0ZDo6dHIxIHRoYXQKKyAgICAjIGNvbmZsaWN0IHdpdGggb3VyIG93biBkZWZpbml0aW9ucy4gVGhlcmVmb3JlIHVzaW5nIG91ciBvd24gdHVwbGUgZG9lcyBub3QKKyAgICAjIHdvcmsgb24gdGhvc2UgY29tcGlsZXJzLgorICAgIGN4eF9saWJyYXJ5KGd0ZXN0X21haW5fdXNlX293bl90dXBsZSAiJHtjeHhfdXNlX293bl90dXBsZX0iCisgICAgICBzcmMvZ3Rlc3QtYWxsLmNjIHNyYy9ndGVzdF9tYWluLmNjKQorCisgICAgY3h4X3Rlc3Rfd2l0aF9mbGFncyhndGVzdC10dXBsZV90ZXN0ICIke2N4eF91c2Vfb3duX3R1cGxlfSIKKyAgICAgIGd0ZXN0X21haW5fdXNlX293bl90dXBsZSB0ZXN0L2d0ZXN0LXR1cGxlX3Rlc3QuY2MpCisKKyAgICBjeHhfdGVzdF93aXRoX2ZsYWdzKGd0ZXN0X3VzZV9vd25fdHVwbGVfdGVzdCAiJHtjeHhfdXNlX293bl90dXBsZX0iCisgICAgICBndGVzdF9tYWluX3VzZV9vd25fdHVwbGUKKyAgICAgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdDJfdGVzdC5jYykKKyAgZW5kaWYoKQorCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIFB5dGhvbiB0ZXN0cy4KKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QpCisKKyAgIyBWaXN1YWwgU3R1ZGlvIC5ORVQgMjAwMyBkb2VzIG5vdCBzdXBwb3J0IFNUTCB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCisgIGlmIChOT1QgTVNWQyBPUiBNU1ZDX1ZFUlNJT04gR1JFQVRFUiAxMzEwKSAgIyAxMzEwIGlzIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzCisgICAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncygKKyAgICAgIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfbm9fZXhfdGVzdF8KKyAgICAgICIke2N4eF9ub19leGNlcHRpb259IgorICAgICAgZ3Rlc3RfbWFpbl9ub19leGNlcHRpb24KKyAgICAgIHRlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0Xy5jYykKKyAgZW5kaWYoKQorCisgIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MoCisgICAgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XworICAgICIke2N4eF9leGNlcHRpb259IgorICAgIGd0ZXN0X21haW4KKyAgICB0ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MpCisgIHB5X3Rlc3QoZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2NvbG9yX3Rlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfY29sb3JfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9lbnZfdmFyX3Rlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfZW52X3Zhcl90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9maWx0ZXJfdW5pdHRlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfaGVscF90ZXN0XyB0ZXN0IGd0ZXN0X21haW4pCisgIHB5X3Rlc3QoZ3Rlc3RfaGVscF90ZXN0KQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9vdXRwdXRfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF9vdXRwdXRfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF9zaHVmZmxlX3Rlc3RfIHRlc3QgZ3Rlc3QpCisgIHB5X3Rlc3QoZ3Rlc3Rfc2h1ZmZsZV90ZXN0KQorCisgICMgTVNWQyA3LjEgZG9lcyBub3Qgc3VwcG9ydCBTVEwgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLgorICBpZiAoTk9UIE1TVkMgT1IgTVNWQ19WRVJTSU9OIEdSRUFURVIgMTMxMCkKKyAgICBjeHhfZXhlY3V0YWJsZShndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfIHRlc3QgZ3Rlc3Rfbm9fZXhjZXB0aW9uKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfCisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0ZMQUdTICIke2N4eF9ub19leGNlcHRpb259IikKKyAgICBweV90ZXN0KGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdCkKKyAgZW5kaWYoKQorCisgIGN4eF9leGVjdXRhYmxlKGd0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8gdGVzdCBndGVzdCkKKyAgcHlfdGVzdChndGVzdF91bmluaXRpYWxpemVkX3Rlc3QpCisKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfIHRlc3QgZ3Rlc3RfbWFpbikKKyAgY3h4X2V4ZWN1dGFibGUoZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfIHRlc3QgZ3Rlc3RfbWFpbikKKyAgcHlfdGVzdChndGVzdF94bWxfb3V0ZmlsZXNfdGVzdCkKKworICBjeHhfZXhlY3V0YWJsZShndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0XyB0ZXN0IGd0ZXN0KQorICBweV90ZXN0KGd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvQ09OVFJJQlVUT1JTIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L0NPTlRSSUJVVE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFlMmZjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L0NPTlRSSUJVVE9SUwpAQCAtMCwwICsxLDM3IEBACisjIFRoaXMgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgcGVvcGxlIHdobyd2ZSBtYWRlIG5vbi10cml2aWFsCisjIGNvbnRyaWJ1dGlvbiB0byB0aGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBwcm9qZWN0LiAgUGVvcGxlCisjIHdobyBjb21taXQgY29kZSB0byB0aGUgcHJvamVjdCBhcmUgZW5jb3VyYWdlZCB0byBhZGQgdGhlaXIgbmFtZXMKKyMgaGVyZS4gIFBsZWFzZSBrZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBmaXJzdCBuYW1lcy4KKworQWpheSBKb3NoaSA8amFqQGdvb2dsZS5jb20+CitCYWzDoXpzIETDoW4gPGJhbGF6cy5kYW5AZ21haWwuY29tPgorQmhhcmF0IE1lZGlyYXR0YSA8YmhhcmF0QG1lbmFsdG8uY29tPgorQ2hhbmRsZXIgQ2FycnV0aCA8Y2hhbmRsZXJjQGdvb2dsZS5jb20+CitDaHJpcyBQcmluY2UgPGNwcmluY2VAZ29vZ2xlLmNvbT4KK0NocmlzIFRheWxvciA8dGF5bG9yY0Bnb29nbGUuY29tPgorRGFuIEVnbm9yIDxlZ25vckBnb29nbGUuY29tPgorRXJpYyBSb21hbiA8ZXJvbWFuQGNocm9taXVtLm9yZz4KK0hhZHkgWmFsZWsgPGhhZHkuemFsZWtAZ21haWwuY29tPgorSmVmZnJleSBZYXNza2luIDxqeWFzc2tpbkBnb29nbGUuY29tPgorSsOzaSBTaWd1csOwc3NvbiA8am9pQGdvb2dsZS5jb20+CitLZWlyIE1pZXJsZSA8bWllcmxlQGdtYWlsLmNvbT4KK0tlaXRoIFJheSA8a2VpdGgucmF5QGdtYWlsLmNvbT4KK0tlbnRvbiBWYXJkYSA8a2VudG9uQGdvb2dsZS5jb20+CitNYW51ZWwgS2xpbWVrIDxrbGltZWtAZ29vZ2xlLmNvbT4KK01hcmt1cyBIZXVsZSA8bWFya3VzLmhldWxlQGdtYWlsLmNvbT4KK01pa2EgUmFlbnRvIDxtaWtpZUBpa2kuZmk+CitNaWtsw7NzIEZhemVrYXMgPG1mYXpla2FzQHN6ZW1hZm9yLmNvbT4KK1Bhc2kgVmFsbWluZW4gPHBhc2kudmFsbWluZW5AZ21haWwuY29tPgorUGF0cmljayBIYW5uYSA8cGhhbm5hQGdvb2dsZS5jb20+CitQYXRyaWNrIFJpbGV5IDxwZnJAZ29vZ2xlLmNvbT4KK1BldGVyIEthbWluc2tpIDxwaW90cmtAZ29vZ2xlLmNvbT4KK1ByZXN0b24gSmFja3NvbiA8cHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tPgorUmFpbmVyIEtsYWZmZW5ib2VjayA8cmFpbmVyLmtsYWZmZW5ib2Vja0BkeW5hdHJhY2UuY29tPgorUnVzcyBDb3ggPHJzY0Bnb29nbGUuY29tPgorUnVzcyBSdWZlciA8cnVzc0BwZW50YWQuY29tPgorU2VhbiBNY2FmZWUgPGVlZmFjbUBnbWFpbC5jb20+CitTaWd1csOwdXIgw4FzZ2VpcnNzb24gPHNpZ2dpQGdvb2dsZS5jb20+CitUcmFjeSBCaWFsaWsgPHRyYWN5QHBlbnRhZC5jb20+CitWYWRpbSBCZXJtYW4gPHZhZGltYkBnb29nbGUuY29tPgorVmxhZCBMb3NldiA8dmxhZGxAZ29vZ2xlLmNvbT4KK1poYW55b25nIFdhbiA8d2FuQGdvb2dsZS5jb20+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvTElDRU5TRSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDFhMTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvTElDRU5TRQpAQCAtMCwwICsxLDI4IEBACitDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgoraW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvTWFrZWZpbGUuYW0gYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5NmI0MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwNiBAQAorIyBBdXRvbWFrZSBmaWxlCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CisKKyMgTm9uc3RhbmRhcmQgcGFja2FnZSBmaWxlcyBmb3IgZGlzdHJpYnV0aW9uCitFWFRSQV9ESVNUID0gXAorICBDSEFOR0VTIFwKKyAgQ09OVFJJQlVUT1JTIFwKKyAgTElDRU5TRSBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAgXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wIFwKKyAgbWFrZS9NYWtlZmlsZSBcCisgIHNjcmlwdHMvZnVzZV9ndGVzdF9maWxlcy5weSBcCisgIHNjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSBcCisgIHNjcmlwdHMvcHVtcC5weSBcCisgIHNjcmlwdHMvdGVzdC9NYWtlZmlsZQorCisjIGd0ZXN0IHNvdXJjZSBmaWxlcyB0aGF0IHdlIGRvbid0IGNvbXBpbGUgZGlyZWN0bHkuICBUaGV5IGFyZQorIyAjaW5jbHVkZWQgYnkgZ3Rlc3QtYWxsLmNjLgorR1RFU1RfU1JDID0gXAorICBzcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyBcCisgIHNyYy9ndGVzdC1maWxlcGF0aC5jYyBcCisgIHNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCBcCisgIHNyYy9ndGVzdC1wb3J0LmNjIFwKKyAgc3JjL2d0ZXN0LXByaW50ZXJzLmNjIFwKKyAgc3JjL2d0ZXN0LXRlc3QtcGFydC5jYyBcCisgIHNyYy9ndGVzdC10eXBlZC10ZXN0LmNjIFwKKyAgc3JjL2d0ZXN0LmNjCisKK0VYVFJBX0RJU1QgKz0gJChHVEVTVF9TUkMpCisKKyMgU2FtcGxlIGZpbGVzIHRoYXQgd2UgZG9uJ3QgY29tcGlsZS4KK0VYVFJBX0RJU1QgKz0gXAorICBzYW1wbGVzL3ByaW1lX3RhYmxlcy5oIFwKKyAgc2FtcGxlcy9zYW1wbGUyX3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGUzX3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjIFwKKyAgc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjCisKKyMgQysrIHRlc3QgZmlsZXMgdGhhdCB3ZSBkb24ndCBjb21waWxlIGRpcmVjdGx5LgorRVhUUkFfRElTVCArPSBcCisgIHRlc3QvZ3Rlc3QtZGVhdGgtdGVzdF9leF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1kZWF0aC10ZXN0X3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtbGlzdGVuZXJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtbWVzc2FnZV90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1vcHRpb25zX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaCBcCisgIHRlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9wcmVtYXR1cmVfZXhpdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC1wcmludGVyc190ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10ZXN0LXBhcnRfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtdHVwbGVfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCBcCisgIHRlc3QvZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9jb2xvcl90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8uY2MgXAorICB0ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X291dHB1dF90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9wcm9kX3Rlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3JlcGVhdF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF9zb2xlX2hlYWRlcl90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF9zdHJlc3NfdGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV9leF90ZXN0LmNjIFwKKyAgdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF91bml0dGVzdC5jYyBcCisgIHRlc3QvZ3Rlc3RfdW5pdHRlc3QuY2MgXAorICB0ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMV90ZXN0Xy5jYyBcCisgIHRlc3QvZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfLmNjIFwKKyAgdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYyBcCisgIHRlc3QvcHJvZHVjdGlvbi5jYyBcCisgIHRlc3QvcHJvZHVjdGlvbi5oCisKKyMgUHl0aG9uIHRlc3RzIHRoYXQgd2UgZG9uJ3QgcnVuLgorRVhUUkFfRElTVCArPSBcCisgIHRlc3QvZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfaGVscF90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF9vdXRwdXRfdGVzdC5weSBcCisgIHRlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfZ29sZGVuX2xpbi50eHQgXAorICB0ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weSBcCisgIHRlc3QvZ3Rlc3RfdGVzdF91dGlscy5weSBcCisgIHRlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3QucHkgXAorICB0ZXN0L2d0ZXN0X3htbF9vdXRmaWxlc190ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0LnB5IFwKKyAgdGVzdC9ndGVzdF94bWxfdGVzdF91dGlscy5weQorCisjIENNYWtlIHNjcmlwdAorRVhUUkFfRElTVCArPSBcCisgIENNYWtlTGlzdHMudHh0IFwKKyAgY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKKworIyBNU1ZDIHByb2plY3QgZmlsZXMKK0VYVFJBX0RJU1QgKz0gXAorICBtc3ZjL2d0ZXN0LW1kLnNsbiBcCisgIG1zdmMvZ3Rlc3QtbWQudmNwcm9qIFwKKyAgbXN2Yy9ndGVzdC5zbG4gXAorICBtc3ZjL2d0ZXN0LnZjcHJvaiBcCisgIG1zdmMvZ3Rlc3RfbWFpbi1tZC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X21haW4udmNwcm9qIFwKKyAgbXN2Yy9ndGVzdF9wcm9kX3Rlc3QtbWQudmNwcm9qIFwKKyAgbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qIFwKKyAgbXN2Yy9ndGVzdF91bml0dGVzdC1tZC52Y3Byb2ogXAorICBtc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvagorCisjIHhjb2RlIHByb2plY3QgZmlsZXMKK0VYVFJBX0RJU1QgKz0gXAorICB4Y29kZS9Db25maWcvRGVidWdQcm9qZWN0LnhjY29uZmlnIFwKKyAgeGNvZGUvQ29uZmlnL0ZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyBcCisgIHhjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnIFwKKyAgeGNvZGUvQ29uZmlnL1JlbGVhc2VQcm9qZWN0LnhjY29uZmlnIFwKKyAgeGNvZGUvQ29uZmlnL1N0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgXAorICB4Y29kZS9Db25maWcvVGVzdFRhcmdldC54Y2NvbmZpZyBcCisgIHhjb2RlL1Jlc291cmNlcy9JbmZvLnBsaXN0IFwKKyAgeGNvZGUvU2NyaXB0cy9ydW50ZXN0cy5zaCBcCisgIHhjb2RlL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IFwKKyAgeGNvZGUvZ3Rlc3QueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorCisjIHhjb2RlIHNhbXBsZSBmaWxlcworRVhUUkFfRElTVCArPSBcCisgIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL0luZm8ucGxpc3QgXAorICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBcCisgIHhjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3J1bnRlc3RzLnNoIFwKKyAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmNjIFwKKyAgeGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmggXAorICB4Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXRfdGVzdC5jYworCisjIEMrK0J1aWxkZXIgcHJvamVjdCBmaWxlcworRVhUUkFfRElTVCArPSBcCisgIGNvZGVnZWFyL2d0ZXN0LmNicHJvaiBcCisgIGNvZGVnZWFyL2d0ZXN0Lmdyb3VwcHJvaiBcCisgIGNvZGVnZWFyL2d0ZXN0X2FsbC5jYyBcCisgIGNvZGVnZWFyL2d0ZXN0X2xpbmsuY2MgXAorICBjb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvaiBcCisgIGNvZGVnZWFyL2d0ZXN0X3VuaXR0ZXN0LmNicHJvagorCisjIERpc3RyaWJ1dGUgYW5kIGluc3RhbGwgTTQgbWFjcm8KK200ZGF0YWRpciA9ICQoZGF0YWRpcikvYWNsb2NhbAorbTRkYXRhX0RBVEEgPSBtNC9ndGVzdC5tNAorRVhUUkFfRElTVCArPSAkKG00ZGF0YV9EQVRBKQorCisjIFdlIGRlZmluZSB0aGUgZ2xvYmFsIEFNX0NQUEZMQUdTIGFzIGV2ZXJ5dGhpbmcgd2UgY29tcGlsZSBpbmNsdWRlcyBmcm9tIHRoZXNlCisjIGRpcmVjdG9yaWVzLgorQU1fQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKSAtSSQoc3JjZGlyKS9pbmNsdWRlCisKKyMgTW9kaWZpZXMgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncyBmb3IgcHRocmVhZHMgY29tcGF0aWJpbGl0eS4KK2lmIEhBVkVfUFRIUkVBRFMKKyAgQU1fQ1hYRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NAIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MQorICBBTV9MSUJTID0gQFBUSFJFQURfTElCU0AKK2Vsc2UKKyAgQU1fQ1hYRkxBR1MgPSAtREdURVNUX0hBU19QVEhSRUFEPTAKK2VuZGlmCisKKyMgQnVpbGQgcnVsZXMgZm9yIGxpYnJhcmllcy4KK2xpYl9MVExJQlJBUklFUyA9IGxpYi9saWJndGVzdC5sYSBsaWIvbGliZ3Rlc3RfbWFpbi5sYQorCitsaWJfbGliZ3Rlc3RfbGFfU09VUkNFUyA9IHNyYy9ndGVzdC1hbGwuY2MKKworcGtnaW5jbHVkZV9IRUFERVJTID0gXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmggXAorICBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oCisKK3BrZ2luY2x1ZGVfaW50ZXJuYWxkaXIgPSAkKHBrZ2luY2x1ZGVkaXIpL2ludGVybmFsCitwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMgPSBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggXAorICBpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIFwKKyAgaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCBcCisgIGluY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKKworbGliX2xpYmd0ZXN0X21haW5fbGFfU09VUkNFUyA9IHNyYy9ndGVzdF9tYWluLmNjCitsaWJfbGliZ3Rlc3RfbWFpbl9sYV9MSUJBREQgPSBsaWIvbGliZ3Rlc3QubGEKKworIyBCdWxpZCBydWxlcyBmb3Igc2FtcGxlcyBhbmQgdGVzdHMuIEF1dG9tYWtlJ3MgbmFtaW5nIGZvciBzb21lIG9mCisjIHRoZXNlIHZhcmlhYmxlcyBpc24ndCB0ZXJyaWJseSBvYnZpb3VzLCBzbyB0aGlzIGlzIGEgYnJpZWYKKyMgcmVmZXJlbmNlOgorIworIyBURVNUUyAtLSBQcm9ncmFtcyBydW4gYXV0b21hdGljYWxseSBieSAibWFrZSBjaGVjayIKKyMgY2hlY2tfUFJPR1JBTVMgLS0gUHJvZ3JhbXMgYnVpbHQgYnkgIm1ha2UgY2hlY2siIGJ1dCBub3QgbmVjZXNzYXJpbHkgcnVuCisKK25vaW5zdF9MVExJQlJBUklFUyA9IHNhbXBsZXMvbGlic2FtcGxlcy5sYQorCitzYW1wbGVzX2xpYnNhbXBsZXNfbGFfU09VUkNFUyA9IFwKKyAgc2FtcGxlcy9zYW1wbGUxLmNjIFwKKyAgc2FtcGxlcy9zYW1wbGUxLmggXAorICBzYW1wbGVzL3NhbXBsZTIuY2MgXAorICBzYW1wbGVzL3NhbXBsZTIuaCBcCisgIHNhbXBsZXMvc2FtcGxlMy1pbmwuaCBcCisgIHNhbXBsZXMvc2FtcGxlNC5jYyBcCisgIHNhbXBsZXMvc2FtcGxlNC5oCisKK1RFU1RTPQorVEVTVFNfRU5WSVJPTk1FTlQgPSBHVEVTVF9TT1VSQ0VfRElSPSIkKHNyY2RpcikvdGVzdCIgXAorICAgICAgICAgICAgICAgICAgICBHVEVTVF9CVUlMRF9ESVI9IiQodG9wX2J1aWxkZGlyKS90ZXN0IgorY2hlY2tfUFJPR1JBTVM9CisKKyMgQSBzaW1wbGUgc2FtcGxlIG9uIHVzaW5nIGd0ZXN0LgorVEVTVFMgKz0gc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0CitjaGVja19QUk9HUkFNUyArPSBzYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QKK3NhbXBsZXNfc2FtcGxlMV91bml0dGVzdF9TT1VSQ0VTID0gc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjCitzYW1wbGVzX3NhbXBsZTFfdW5pdHRlc3RfTERBREQgPSBsaWIvbGliZ3Rlc3RfbWFpbi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWIvbGliZ3Rlc3QubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcy9saWJzYW1wbGVzLmxhCisKKyMgQW5vdGhlciBzYW1wbGUuICBJdCBhbHNvIHZlcmlmaWVzIHRoYXQgbGliZ3Rlc3Qgd29ya3MuCitURVNUUyArPSBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0CitjaGVja19QUk9HUkFNUyArPSBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0CitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X1NPVVJDRVMgPSBzYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCitzYW1wbGVzX3NhbXBsZTEwX3VuaXR0ZXN0X0xEQUREID0gbGliL2xpYmd0ZXN0LmxhCisKKyMgVGhpcyB0ZXN0cyBtb3N0IGNvbnN0cnVjdHMgb2YgZ3Rlc3QgYW5kIHZlcmlmaWVzIHRoYXQgbGliZ3Rlc3RfbWFpbgorIyBhbmQgbGliZ3Rlc3Qgd29yay4KK1RFU1RTICs9IHRlc3QvZ3Rlc3RfYWxsX3Rlc3QKK2NoZWNrX1BST0dSQU1TICs9IHRlc3QvZ3Rlc3RfYWxsX3Rlc3QKK3Rlc3RfZ3Rlc3RfYWxsX3Rlc3RfU09VUkNFUyA9IHRlc3QvZ3Rlc3RfYWxsX3Rlc3QuY2MKK3Rlc3RfZ3Rlc3RfYWxsX3Rlc3RfTERBREQgPSBsaWIvbGliZ3Rlc3RfbWFpbi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliL2xpYmd0ZXN0LmxhCisKKyMgVGVzdHMgdGhhdCBmdXNlZCBndGVzdCBmaWxlcyBjb21waWxlIGFuZCB3b3JrLgorRlVTRURfR1RFU1RfU1JDID0gXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3QtYWxsLmNjIFwKKyAgZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LmggXAorICBmdXNlZC1zcmMvZ3Rlc3QvZ3Rlc3RfbWFpbi5jYworCitpZiBIQVZFX1BZVEhPTgorVEVTVFMgKz0gdGVzdC9mdXNlZF9ndGVzdF90ZXN0CitjaGVja19QUk9HUkFNUyArPSB0ZXN0L2Z1c2VkX2d0ZXN0X3Rlc3QKK3Rlc3RfZnVzZWRfZ3Rlc3RfdGVzdF9TT1VSQ0VTID0gJChGVVNFRF9HVEVTVF9TUkMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcy9zYW1wbGUxLmNjIHNhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYwordGVzdF9mdXNlZF9ndGVzdF90ZXN0X0NQUEZMQUdTID0gLUkiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKworIyBCdWlsZCBydWxlcyBmb3IgcHV0dGluZyBmdXNlZCBHb29nbGUgVGVzdCBmaWxlcyBpbnRvIHRoZSBkaXN0cmlidXRpb24KKyMgcGFja2FnZS4gVGhlIHVzZXIgY2FuIGFsc28gY3JlYXRlIHRob3NlIGZpbGVzIGJ5IG1hbnVhbGx5IHJ1bm5pbmcKKyMgc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5LgorJCh0ZXN0X2Z1c2VkX2d0ZXN0X3Rlc3RfU09VUkNFUyk6IGZ1c2VkLWd0ZXN0CisKK2Z1c2VkLWd0ZXN0OiAkKHBrZ2luY2x1ZGVfSEVBREVSUykgJChwa2dpbmNsdWRlX2ludGVybmFsX0hFQURFUlMpIFwKKyAgICAgICAgICAgICAkKEdURVNUX1NSQykgc3JjL2d0ZXN0LWFsbC5jYyBzcmMvZ3Rlc3RfbWFpbi5jYyBcCisgICAgICAgICAgICAgc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5CisJbWtkaXIgLXAgIiQoc3JjZGlyKS9mdXNlZC1zcmMiCisJY2htb2QgLVIgdSt3ICIkKHNyY2RpcikvZnVzZWQtc3JjIgorCXJtIC1mICIkKHNyY2RpcikvZnVzZWQtc3JjL2d0ZXN0L2d0ZXN0LWFsbC5jYyIKKwlybSAtZiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9ndGVzdC9ndGVzdC5oIgorCSIkKHNyY2Rpcikvc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5IiAiJChzcmNkaXIpL2Z1c2VkLXNyYyIKKwljcCAtZiAiJChzcmNkaXIpL3NyYy9ndGVzdF9tYWluLmNjIiAiJChzcmNkaXIpL2Z1c2VkLXNyYy9ndGVzdC8iCisKK21haW50YWluZXItY2xlYW4tbG9jYWw6CisJcm0gLXJmICIkKHNyY2RpcikvZnVzZWQtc3JjIgorZW5kaWYKKworIyBEZWF0aCB0ZXN0cyBtYXkgcHJvZHVjZSBjb3JlIGR1bXBzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuIEluIGNhc2UKKyMgdGhpcyBoYXBwZW5zLCBjbGVhbiB0aGVtIHRvIGtlZXAgZGlzdGNsZWFuY2hlY2sgaGFwcHkuCitDTEVBTkZJTEVTID0gY29yZQorCisjIERpc2FibGVzICdtYWtlIGluc3RhbGwnIGFzIGluc3RhbGxpbmcgYSBjb21waWxlZCB2ZXJzaW9uIG9mIEdvb2dsZQorIyBUZXN0IGNhbiBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvciBkdWUgdG8gdmlvbGF0aW9uIG9mIHRoZQorIyBPbmUtRGVmaW5pdGlvbiBSdWxlLgorCitpbnN0YWxsLWV4ZWMtbG9jYWw6CisJZWNobyAiJ21ha2UgaW5zdGFsbCcgaXMgZGFuZ2Vyb3VzIGFuZCBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBzZWUgUkVBRE1FIGZvciBob3cgdG8gaW50ZWdyYXRlIEdvb2dsZSBUZXN0IGludG8geW91ciBidWlsZCBzeXN0ZW0uIgorCWZhbHNlCisKK2luc3RhbGwtZGF0YS1sb2NhbDoKKwllY2hvICInbWFrZSBpbnN0YWxsJyBpcyBkYW5nZXJvdXMgYW5kIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIHNlZSBSRUFETUUgZm9yIGhvdyB0byBpbnRlZ3JhdGUgR29vZ2xlIFRlc3QgaW50byB5b3VyIGJ1aWxkIHN5c3RlbS4iCisJZmFsc2UKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9SRUFETUUubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDU5YzgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjgwIEBACisKKyMjIyBHZW5lcmljIEJ1aWxkIEluc3RydWN0aW9ucyAjIyMKKworIyMjIyBTZXR1cCAjIyMjCisKK1RvIGJ1aWxkIEdvb2dsZSBUZXN0IGFuZCB5b3VyIHRlc3RzIHRoYXQgdXNlIGl0LCB5b3UgbmVlZCB0byB0ZWxsIHlvdXIKK2J1aWxkIHN5c3RlbSB3aGVyZSB0byBmaW5kIGl0cyBoZWFkZXJzIGFuZCBzb3VyY2UgZmlsZXMuICBUaGUgZXhhY3QKK3dheSB0byBkbyBpdCBkZXBlbmRzIG9uIHdoaWNoIGJ1aWxkIHN5c3RlbSB5b3UgdXNlLCBhbmQgaXMgdXN1YWxseQorc3RyYWlnaHRmb3J3YXJkLgorCisjIyMjIEJ1aWxkICMjIyMKKworU3VwcG9zZSB5b3UgcHV0IEdvb2dsZSBUZXN0IGluIGRpcmVjdG9yeSBgJHtHVEVTVF9ESVJ9YC4gIFRvIGJ1aWxkIGl0LAorY3JlYXRlIGEgbGlicmFyeSBidWlsZCB0YXJnZXQgKG9yIGEgcHJvamVjdCBhcyBjYWxsZWQgYnkgVmlzdWFsIFN0dWRpbworYW5kIFhjb2RlKSB0byBjb21waWxlCisKKyAgICAke0dURVNUX0RJUn0vc3JjL2d0ZXN0LWFsbC5jYworCit3aXRoIGAke0dURVNUX0RJUn0vaW5jbHVkZWAgaW4gdGhlIHN5c3RlbSBoZWFkZXIgc2VhcmNoIHBhdGggYW5kIGAke0dURVNUX0RJUn1gCitpbiB0aGUgbm9ybWFsIGhlYWRlciBzZWFyY2ggcGF0aC4gIEFzc3VtaW5nIGEgTGludXgtbGlrZSBzeXN0ZW0gYW5kIGdjYywKK3NvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgd2lsbCBkbzoKKworICAgIGcrKyAtaXN5c3RlbSAke0dURVNUX0RJUn0vaW5jbHVkZSAtSSR7R1RFU1RfRElSfSBcCisgICAgICAgIC1wdGhyZWFkIC1jICR7R1RFU1RfRElSfS9zcmMvZ3Rlc3QtYWxsLmNjCisgICAgYXIgLXJ2IGxpYmd0ZXN0LmEgZ3Rlc3QtYWxsLm8KKworKFdlIG5lZWQgYC1wdGhyZWFkYCBhcyBHb29nbGUgVGVzdCB1c2VzIHRocmVhZHMuKQorCitOZXh0LCB5b3Ugc2hvdWxkIGNvbXBpbGUgeW91ciB0ZXN0IHNvdXJjZSBmaWxlIHdpdGgKK2Ake0dURVNUX0RJUn0vaW5jbHVkZWAgaW4gdGhlIHN5c3RlbSBoZWFkZXIgc2VhcmNoIHBhdGgsIGFuZCBsaW5rIGl0Cit3aXRoIGd0ZXN0IGFuZCBhbnkgb3RoZXIgbmVjZXNzYXJ5IGxpYnJhcmllczoKKworICAgIGcrKyAtaXN5c3RlbSAke0dURVNUX0RJUn0vaW5jbHVkZSAtcHRocmVhZCBwYXRoL3RvL3lvdXJfdGVzdC5jYyBsaWJndGVzdC5hIFwKKyAgICAgICAgLW8geW91cl90ZXN0CisKK0FzIGFuIGV4YW1wbGUsIHRoZSBtYWtlLyBkaXJlY3RvcnkgY29udGFpbnMgYSBNYWtlZmlsZSB0aGF0IHlvdSBjYW4KK3VzZSB0byBidWlsZCBHb29nbGUgVGVzdCBvbiBzeXN0ZW1zIHdoZXJlIEdOVSBtYWtlIGlzIGF2YWlsYWJsZQorKGUuZy4gTGludXgsIE1hYyBPUyBYLCBhbmQgQ3lnd2luKS4gIEl0IGRvZXNuJ3QgdHJ5IHRvIGJ1aWxkIEdvb2dsZQorVGVzdCdzIG93biB0ZXN0cy4gIEluc3RlYWQsIGl0IGp1c3QgYnVpbGRzIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5IGFuZAorYSBzYW1wbGUgdGVzdC4gIFlvdSBjYW4gdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgb3duIGJ1aWxkCitzY3JpcHQuCisKK0lmIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSBjb3JyZWN0IGZvciB5b3VyIGVudmlyb25tZW50LCB0aGUKK2ZvbGxvd2luZyBjb21tYW5kcyBzaG91bGQgc3VjY2VlZDoKKworICAgIGNkICR7R1RFU1RfRElSfS9tYWtlCisgICAgbWFrZQorICAgIC4vc2FtcGxlMV91bml0dGVzdAorCitJZiB5b3Ugc2VlIGVycm9ycywgdHJ5IHRvIHR3ZWFrIHRoZSBjb250ZW50cyBvZiBgbWFrZS9NYWtlZmlsZWAgdG8gbWFrZQordGhlbSBnbyBhd2F5LiAgVGhlcmUgYXJlIGluc3RydWN0aW9ucyBpbiBgbWFrZS9NYWtlZmlsZWAgb24gaG93IHRvIGRvCitpdC4KKworIyMjIFVzaW5nIENNYWtlICMjIworCitHb29nbGUgVGVzdCBjb21lcyB3aXRoIGEgQ01ha2UgYnVpbGQgc2NyaXB0ICgKK1tDTWFrZUxpc3RzLnR4dF0obWFzdGVyL0NNYWtlTGlzdHMudHh0KSkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIHdpZGUgcmFuZ2Ugb2YgcGxhdGZvcm1zICgiQyIgc3RhbmRzIGZvcgorY3Jvc3MtcGxhdGZvcm0uKS4gSWYgeW91IGRvbid0IGhhdmUgQ01ha2UgaW5zdGFsbGVkIGFscmVhZHksIHlvdSBjYW4KK2Rvd25sb2FkIGl0IGZvciBmcmVlIGZyb20gPGh0dHA6Ly93d3cuY21ha2Uub3JnLz4uCisKK0NNYWtlIHdvcmtzIGJ5IGdlbmVyYXRpbmcgbmF0aXZlIG1ha2VmaWxlcyBvciBidWlsZCBwcm9qZWN0cyB0aGF0IGNhbgorYmUgdXNlZCBpbiB0aGUgY29tcGlsZXIgZW52aXJvbm1lbnQgb2YgeW91ciBjaG9pY2UuICBUaGUgdHlwaWNhbAord29ya2Zsb3cgc3RhcnRzIHdpdGg6CisKKyAgICBta2RpciBteWJ1aWxkICAgICAgICMgQ3JlYXRlIGEgZGlyZWN0b3J5IHRvIGhvbGQgdGhlIGJ1aWxkIG91dHB1dC4KKyAgICBjZCBteWJ1aWxkCisgICAgY21ha2UgJHtHVEVTVF9ESVJ9ICAjIEdlbmVyYXRlIG5hdGl2ZSBidWlsZCBzY3JpcHRzLgorCitJZiB5b3Ugd2FudCB0byBidWlsZCBHb29nbGUgVGVzdCdzIHNhbXBsZXMsIHlvdSBzaG91bGQgcmVwbGFjZSB0aGUKK2xhc3QgY29tbWFuZCB3aXRoCisKKyAgICBjbWFrZSAtRGd0ZXN0X2J1aWxkX3NhbXBsZXM9T04gJHtHVEVTVF9ESVJ9CisKK0lmIHlvdSBhcmUgb24gYSBcKm5peCBzeXN0ZW0sIHlvdSBzaG91bGQgbm93IHNlZSBhIE1ha2VmaWxlIGluIHRoZQorY3VycmVudCBkaXJlY3RvcnkuICBKdXN0IHR5cGUgJ21ha2UnIHRvIGJ1aWxkIGd0ZXN0LgorCitJZiB5b3UgdXNlIFdpbmRvd3MgYW5kIGhhdmUgVmlzdWFsIFN0dWRpbyBpbnN0YWxsZWQsIGEgYGd0ZXN0LnNsbmAgZmlsZQorYW5kIHNldmVyYWwgYC52Y3Byb2pgIGZpbGVzIHdpbGwgYmUgY3JlYXRlZC4gIFlvdSBjYW4gdGhlbiBidWlsZCB0aGVtCit1c2luZyBWaXN1YWwgU3R1ZGlvLgorCitPbiBNYWMgT1MgWCB3aXRoIFhjb2RlIGluc3RhbGxlZCwgYSBgLnhjb2RlcHJvamAgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZC4KKworIyMjIExlZ2FjeSBCdWlsZCBTY3JpcHRzICMjIworCitCZWZvcmUgc2V0dGxpbmcgb24gQ01ha2UsIHdlIGhhdmUgYmVlbiBwcm92aWRpbmcgaGFuZC1tYWludGFpbmVkIGJ1aWxkCitwcm9qZWN0cy9zY3JpcHRzIGZvciBWaXN1YWwgU3R1ZGlvLCBYY29kZSwgYW5kIEF1dG90b29scy4gIFdoaWxlIHdlCitjb250aW51ZSB0byBwcm92aWRlIHRoZW0gZm9yIGNvbnZlbmllbmNlLCB0aGV5IGFyZSBub3QgYWN0aXZlbHkKK21haW50YWluZWQgYW55IG1vcmUuICBXZSBoaWdobHkgcmVjb21tZW5kIHRoYXQgeW91IGZvbGxvdyB0aGUKK2luc3RydWN0aW9ucyBpbiB0aGUgcHJldmlvdXMgdHdvIHNlY3Rpb25zIHRvIGludGVncmF0ZSBHb29nbGUgVGVzdAord2l0aCB5b3VyIGV4aXN0aW5nIGJ1aWxkIHN5c3RlbS4KKworSWYgeW91IHN0aWxsIG5lZWQgdG8gdXNlIHRoZSBsZWdhY3kgYnVpbGQgc2NyaXB0cywgaGVyZSdzIGhvdzoKKworVGhlIG1zdmNcIGZvbGRlciBjb250YWlucyB0d28gc29sdXRpb25zIHdpdGggVmlzdWFsIEMrKyBwcm9qZWN0cy4KK09wZW4gdGhlIGBndGVzdC5zbG5gIG9yIGBndGVzdC1tZC5zbG5gIGZpbGUgdXNpbmcgVmlzdWFsIFN0dWRpbywgYW5kIHlvdQorYXJlIHJlYWR5IHRvIGJ1aWxkIEdvb2dsZSBUZXN0IHRoZSBzYW1lIHdheSB5b3UgYnVpbGQgYW55IFZpc3VhbAorU3R1ZGlvIHByb2plY3QuICBGaWxlcyB0aGF0IGhhdmUgbmFtZXMgZW5kaW5nIHdpdGggLW1kIHVzZSBETEwKK3ZlcnNpb25zIG9mIE1pY3Jvc29mdCBydW50aW1lIGxpYnJhcmllcyAodGhlIC9NRCBvciB0aGUgL01EZCBjb21waWxlcgorb3B0aW9uKS4gIEZpbGVzIHdpdGhvdXQgdGhhdCBzdWZmaXggdXNlIHN0YXRpYyB2ZXJzaW9ucyBvZiB0aGUgcnVudGltZQorbGlicmFyaWVzICh0aGUgL01UIG9yIHRoZSAvTVRkIG9wdGlvbikuICBQbGVhc2Ugbm90ZSB0aGF0IG9uZSBtdXN0IHVzZQordGhlIHNhbWUgb3B0aW9uIHRvIGNvbXBpbGUgYm90aCBndGVzdCBhbmQgdGhlIHRlc3QgY29kZS4gIElmIHlvdSB1c2UKK1Zpc3VhbCBTdHVkaW8gMjAwNSBvciBhYm92ZSwgd2UgcmVjb21tZW5kIHRoZSAtbWQgdmVyc2lvbiBhcyAvTUQgaXMKK3RoZSBkZWZhdWx0IGZvciBuZXcgcHJvamVjdHMgaW4gdGhlc2UgdmVyc2lvbnMgb2YgVmlzdWFsIFN0dWRpby4KKworT24gTWFjIE9TIFgsIG9wZW4gdGhlIGBndGVzdC54Y29kZXByb2pgIGluIHRoZSBgeGNvZGUvYCBmb2xkZXIgdXNpbmcKK1hjb2RlLiAgQnVpbGQgdGhlICJndGVzdCIgdGFyZ2V0LiAgVGhlIHVuaXZlcnNhbCBiaW5hcnkgZnJhbWV3b3JrIHdpbGwKK2VuZCB1cCBpbiB5b3VyIHNlbGVjdGVkIGJ1aWxkIGRpcmVjdG9yeSAoc2VsZWN0ZWQgaW4gdGhlIFhjb2RlCisiUHJlZmVyZW5jZXMuLi4iIC0+ICJCdWlsZGluZyIgcGFuZSBhbmQgZGVmYXVsdHMgdG8geGNvZGUvYnVpbGQpLgorQWx0ZXJuYXRpdmVseSwgYXQgdGhlIGNvbW1hbmQgbGluZSwgZW50ZXI6CisKKyAgICB4Y29kZWJ1aWxkCisKK1RoaXMgd2lsbCBidWlsZCB0aGUgIlJlbGVhc2UiIGNvbmZpZ3VyYXRpb24gb2YgZ3Rlc3QuZnJhbWV3b3JrIGluIHlvdXIKK2RlZmF1bHQgYnVpbGQgbG9jYXRpb24uICBTZWUgdGhlICJ4Y29kZWJ1aWxkIiBtYW4gcGFnZSBmb3IgbW9yZQoraW5mb3JtYXRpb24gYWJvdXQgYnVpbGRpbmcgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIGFuZCBidWlsZGluZyBpbgorZGlmZmVyZW50IGxvY2F0aW9ucy4KKworSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBHb29nbGUgVGVzdCBYY29kZSBwcm9qZWN0IHdpdGggWGNvZGUgNC54IGFuZAorYWJvdmUsIHlvdSBuZWVkIHRvIGVpdGhlcjoKKworICogdXBkYXRlIHRoZSBTREsgY29uZmlndXJhdGlvbiBvcHRpb25zIGluIHhjb2RlL0NvbmZpZy9HZW5lcmFsLnhjb25maWcuCisgICBDb21tZW50IG9wdGlvbnMgYFNES1JPT1RgLCBgTUFDT1NfREVQTE9ZTUVOVF9UQVJHRVRgLCBhbmQgYEdDQ19WRVJTSU9OYC4gSWYKKyAgIHlvdSBjaG9vc2UgdGhpcyByb3V0ZSB5b3UgbG9zZSB0aGUgYWJpbGl0eSB0byB0YXJnZXQgZWFybGllciB2ZXJzaW9ucworICAgb2YgTWFjT1MgWC4KKyAqIEluc3RhbGwgYW4gU0RLIGZvciBhbiBlYXJsaWVyIHZlcnNpb24uIFRoaXMgZG9lc24ndCBhcHBlYXIgdG8gYmUKKyAgIHN1cHBvcnRlZCBieSBBcHBsZSwgYnV0IGhhcyBiZWVuIHJlcG9ydGVkIHRvIHdvcmsKKyAgIChodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUzNzg1MTgpLgorCisjIyMgVHdlYWtpbmcgR29vZ2xlIFRlc3QgIyMjCisKK0dvb2dsZSBUZXN0IGNhbiBiZSB1c2VkIGluIGRpdmVyc2UgZW52aXJvbm1lbnRzLiAgVGhlIGRlZmF1bHQKK2NvbmZpZ3VyYXRpb24gbWF5IG5vdCB3b3JrIChvciBtYXkgbm90IHdvcmsgd2VsbCkgb3V0IG9mIHRoZSBib3ggaW4KK3NvbWUgZW52aXJvbm1lbnRzLiAgSG93ZXZlciwgeW91IGNhbiBlYXNpbHkgdHdlYWsgR29vZ2xlIFRlc3QgYnkKK2RlZmluaW5nIGNvbnRyb2wgbWFjcm9zIG9uIHRoZSBjb21waWxlciBjb21tYW5kIGxpbmUuICBHZW5lcmFsbHksCit0aGVzZSBtYWNyb3MgYXJlIG5hbWVkIGxpa2UgYEdURVNUX1hZWmAgYW5kIHlvdSBkZWZpbmUgdGhlbSB0byBlaXRoZXIgMQorb3IgMCB0byBlbmFibGUgb3IgZGlzYWJsZSBhIGNlcnRhaW4gZmVhdHVyZS4KKworV2UgbGlzdCB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgbWFjcm9zIGJlbG93LiAgRm9yIGEgY29tcGxldGUgbGlzdCwKK3NlZSBmaWxlIFtpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaF0oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0L2Jsb2IvbWFzdGVyL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oKS4KKworIyMjIENob29zaW5nIGEgVFIxIFR1cGxlIExpYnJhcnkgIyMjCisKK1NvbWUgR29vZ2xlIFRlc3QgZmVhdHVyZXMgcmVxdWlyZSB0aGUgQysrIFRlY2huaWNhbCBSZXBvcnQgMSAoVFIxKQordHVwbGUgbGlicmFyeSwgd2hpY2ggaXMgbm90IHlldCBhdmFpbGFibGUgd2l0aCBhbGwgY29tcGlsZXJzLiAgVGhlCitnb29kIG5ld3MgaXMgdGhhdCBHb29nbGUgVGVzdCBpbXBsZW1lbnRzIGEgc3Vic2V0IG9mIFRSMSB0dXBsZSB0aGF0J3MKK2Vub3VnaCBmb3IgaXRzIG93biBuZWVkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZSB0aGlzIHdoZW4gdGhlCitjb21waWxlciBkb2Vzbid0IHByb3ZpZGUgVFIxIHR1cGxlLgorCitVc3VhbGx5IHlvdSBkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgd2hpY2ggdHVwbGUgbGlicmFyeSBHb29nbGUgVGVzdAordXNlcy4gIEhvd2V2ZXIsIGlmIHlvdXIgcHJvamVjdCBhbHJlYWR5IHVzZXMgVFIxIHR1cGxlLCB5b3UgbmVlZCB0bwordGVsbCBHb29nbGUgVGVzdCB0byB1c2UgdGhlIHNhbWUgVFIxIHR1cGxlIGxpYnJhcnkgdGhlIHJlc3Qgb2YgeW91cgorcHJvamVjdCB1c2VzLCBvciB0aGUgdHdvIHR1cGxlIGltcGxlbWVudGF0aW9ucyB3aWxsIGNsYXNoLiAgVG8gZG8KK3RoYXQsIGFkZAorCisgICAgLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0wCisKK3RvIHRoZSBjb21waWxlciBmbGFncyB3aGlsZSBjb21waWxpbmcgR29vZ2xlIFRlc3QgYW5kIHlvdXIgdGVzdHMuICBJZgoreW91IHdhbnQgdG8gZm9yY2UgR29vZ2xlIFRlc3QgdG8gdXNlIGl0cyBvd24gdHVwbGUgbGlicmFyeSwganVzdCBhZGQKKworICAgIC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MQorCit0byB0aGUgY29tcGlsZXIgZmxhZ3MgaW5zdGVhZC4KKworSWYgeW91IGRvbid0IHdhbnQgR29vZ2xlIFRlc3QgdG8gdXNlIHR1cGxlIGF0IGFsbCwgYWRkCisKKyAgICAtREdURVNUX0hBU19UUjFfVFVQTEU9MAorCithbmQgYWxsIGZlYXR1cmVzIHVzaW5nIHR1cGxlIHdpbGwgYmUgZGlzYWJsZWQuCisKKyMjIyBNdWx0aS10aHJlYWRlZCBUZXN0cyAjIyMKKworR29vZ2xlIFRlc3QgaXMgdGhyZWFkLXNhZmUgd2hlcmUgdGhlIHB0aHJlYWQgbGlicmFyeSBpcyBhdmFpbGFibGUuCitBZnRlciBgI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiYCwgeW91IGNhbiBjaGVjayB0aGUgYEdURVNUX0lTX1RIUkVBRFNBRkVgCittYWNybyB0byBzZWUgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlICh5ZXMgaWYgdGhlIG1hY3JvIGlzIGAjZGVmaW5lZGAgdG8KKzEsIG5vIGlmIGl0J3MgdW5kZWZpbmVkLikuCisKK0lmIEdvb2dsZSBUZXN0IGRvZXNuJ3QgY29ycmVjdGx5IGRldGVjdCB3aGV0aGVyIHB0aHJlYWQgaXMgYXZhaWxhYmxlCitpbiB5b3VyIGVudmlyb25tZW50LCB5b3UgY2FuIGZvcmNlIGl0IHdpdGgKKworICAgIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MQorCitvcgorCisgICAgLURHVEVTVF9IQVNfUFRIUkVBRD0wCisKK1doZW4gR29vZ2xlIFRlc3QgdXNlcyBwdGhyZWFkLCB5b3UgbWF5IG5lZWQgdG8gYWRkIGZsYWdzIHRvIHlvdXIKK2NvbXBpbGVyIGFuZC9vciBsaW5rZXIgdG8gc2VsZWN0IHRoZSBwdGhyZWFkIGxpYnJhcnksIG9yIHlvdSdsbCBnZXQKK2xpbmsgZXJyb3JzLiAgSWYgeW91IHVzZSB0aGUgQ01ha2Ugc2NyaXB0IG9yIHRoZSBkZXByZWNhdGVkIEF1dG90b29scworc2NyaXB0LCB0aGlzIGlzIHRha2VuIGNhcmUgb2YgZm9yIHlvdS4gIElmIHlvdSB1c2UgeW91ciBvd24gYnVpbGQKK3NjcmlwdCwgeW91J2xsIG5lZWQgdG8gcmVhZCB5b3VyIGNvbXBpbGVyIGFuZCBsaW5rZXIncyBtYW51YWwgdG8KK2ZpZ3VyZSBvdXQgd2hhdCBmbGFncyB0byBhZGQuCisKKyMjIyBBcyBhIFNoYXJlZCBMaWJyYXJ5IChETEwpICMjIworCitHb29nbGUgVGVzdCBpcyBjb21wYWN0LCBzbyBtb3N0IHVzZXJzIGNhbiBidWlsZCBhbmQgbGluayBpdCBhcyBhCitzdGF0aWMgbGlicmFyeSBmb3IgdGhlIHNpbXBsaWNpdHkuICBZb3UgY2FuIGNob29zZSB0byB1c2UgR29vZ2xlIFRlc3QKK2FzIGEgc2hhcmVkIGxpYnJhcnkgKGtub3duIGFzIGEgRExMIG9uIFdpbmRvd3MpIGlmIHlvdSBwcmVmZXIuCisKK1RvIGNvbXBpbGUgKmd0ZXN0KiBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBhZGQKKworICAgIC1ER1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZPTEKKwordG8gdGhlIGNvbXBpbGVyIGZsYWdzLiAgWW91J2xsIGFsc28gbmVlZCB0byB0ZWxsIHRoZSBsaW5rZXIgdG8gcHJvZHVjZQorYSBzaGFyZWQgbGlicmFyeSBpbnN0ZWFkIC0gY29uc3VsdCB5b3VyIGxpbmtlcidzIG1hbnVhbCBmb3IgaG93IHRvIGRvCitpdC4KKworVG8gY29tcGlsZSB5b3VyICp0ZXN0cyogdGhhdCB1c2UgdGhlIGd0ZXN0IHNoYXJlZCBsaWJyYXJ5LCBhZGQKKworICAgIC1ER1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZPTEKKwordG8gdGhlIGNvbXBpbGVyIGZsYWdzLgorCitOb3RlOiB3aGlsZSB0aGUgYWJvdmUgc3RlcHMgYXJlbid0IHRlY2huaWNhbGx5IG5lY2Vzc2FyeSB0b2RheSB3aGVuCit1c2luZyBzb21lIGNvbXBpbGVycyAoZS5nLiBHQ0MpLCB0aGV5IG1heSBiZWNvbWUgbmVjZXNzYXJ5IGluIHRoZQorZnV0dXJlLCBpZiB3ZSBkZWNpZGUgdG8gaW1wcm92ZSB0aGUgc3BlZWQgb2YgbG9hZGluZyB0aGUgbGlicmFyeSAoc2VlCis8aHR0cDovL2djYy5nbnUub3JnL3dpa2kvVmlzaWJpbGl0eT4gZm9yIGRldGFpbHMpLiAgVGhlcmVmb3JlIHlvdSBhcmUKK3JlY29tbWVuZGVkIHRvIGFsd2F5cyBhZGQgdGhlIGFib3ZlIGZsYWdzIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMgYQorc2hhcmVkIGxpYnJhcnkuICBPdGhlcndpc2UgYSBmdXR1cmUgcmVsZWFzZSBvZiBHb29nbGUgVGVzdCBtYXkgYnJlYWsKK3lvdXIgYnVpbGQgc2NyaXB0LgorCisjIyMgQXZvaWRpbmcgTWFjcm8gTmFtZSBDbGFzaGVzICMjIworCitJbiBDKyssIG1hY3JvcyBkb24ndCBvYmV5IG5hbWVzcGFjZXMuICBUaGVyZWZvcmUgdHdvIGxpYnJhcmllcyB0aGF0Citib3RoIGRlZmluZSBhIG1hY3JvIG9mIHRoZSBzYW1lIG5hbWUgd2lsbCBjbGFzaCBpZiB5b3UgI2luY2x1ZGUgYm90aAorZGVmaW5pdGlvbnMuICBJbiBjYXNlIGEgR29vZ2xlIFRlc3QgbWFjcm8gY2xhc2hlcyB3aXRoIGFub3RoZXIKK2xpYnJhcnksIHlvdSBjYW4gZm9yY2UgR29vZ2xlIFRlc3QgdG8gcmVuYW1lIGl0cyBtYWNybyB0byBhdm9pZCB0aGUKK2NvbmZsaWN0LgorCitTcGVjaWZpY2FsbHksIGlmIGJvdGggR29vZ2xlIFRlc3QgYW5kIHNvbWUgb3RoZXIgY29kZSBkZWZpbmUgbWFjcm8KK0ZPTywgeW91IGNhbiBhZGQKKworICAgIC1ER1RFU1RfRE9OVF9ERUZJTkVfRk9PPTEKKwordG8gdGhlIGNvbXBpbGVyIGZsYWdzIHRvIHRlbGwgR29vZ2xlIFRlc3QgdG8gY2hhbmdlIHRoZSBtYWNybydzIG5hbWUKK2Zyb20gYEZPT2AgdG8gYEdURVNUX0ZPT2AuICBDdXJyZW50bHkgYEZPT2AgY2FuIGJlIGBGQUlMYCwgYFNVQ0NFRURgLAorb3IgYFRFU1RgLiAgRm9yIGV4YW1wbGUsIHdpdGggYC1ER1RFU1RfRE9OVF9ERUZJTkVfVEVTVD0xYCwgeW91J2xsCituZWVkIHRvIHdyaXRlCisKKyAgICBHVEVTVF9URVNUKFNvbWVUZXN0LCBEb2VzVGhpcykgeyAuLi4gfQorCitpbnN0ZWFkIG9mCisKKyAgICBURVNUKFNvbWVUZXN0LCBEb2VzVGhpcykgeyAuLi4gfQorCitpbiBvcmRlciB0byBkZWZpbmUgYSB0ZXN0LgorCisjIyBEZXZlbG9waW5nIEdvb2dsZSBUZXN0ICMjCisKK1RoaXMgc2VjdGlvbiBkaXNjdXNzZXMgaG93IHRvIG1ha2UgeW91ciBvd24gY2hhbmdlcyB0byBHb29nbGUgVGVzdC4KKworIyMjIFRlc3RpbmcgR29vZ2xlIFRlc3QgSXRzZWxmICMjIworCitUbyBtYWtlIHN1cmUgeW91ciBjaGFuZ2VzIHdvcmsgYXMgaW50ZW5kZWQgYW5kIGRvbid0IGJyZWFrIGV4aXN0aW5nCitmdW5jdGlvbmFsaXR5LCB5b3UnbGwgd2FudCB0byBjb21waWxlIGFuZCBydW4gR29vZ2xlIFRlc3QncyBvd24gdGVzdHMuCitGb3IgdGhhdCB5b3UgY2FuIHVzZSBDTWFrZToKKworICAgIG1rZGlyIG15YnVpbGQKKyAgICBjZCBteWJ1aWxkCisgICAgY21ha2UgLURndGVzdF9idWlsZF90ZXN0cz1PTiAke0dURVNUX0RJUn0KKworTWFrZSBzdXJlIHlvdSBoYXZlIFB5dGhvbiBpbnN0YWxsZWQsIGFzIHNvbWUgb2YgR29vZ2xlIFRlc3QncyB0ZXN0cworYXJlIHdyaXR0ZW4gaW4gUHl0aG9uLiAgSWYgdGhlIGNtYWtlIGNvbW1hbmQgY29tcGxhaW5zIGFib3V0IG5vdCBiZWluZworYWJsZSB0byBmaW5kIFB5dGhvbiAoYENvdWxkIE5PVCBmaW5kIFB5dGhvbkludGVycCAobWlzc2luZzoKK1BZVEhPTl9FWEVDVVRBQkxFKWApLCB0cnkgdGVsbGluZyBpdCBleHBsaWNpdGx5IHdoZXJlIHlvdXIgUHl0aG9uCitleGVjdXRhYmxlIGNhbiBiZSBmb3VuZDoKKworICAgIGNtYWtlIC1EUFlUSE9OX0VYRUNVVEFCTEU9cGF0aC90by9weXRob24gLURndGVzdF9idWlsZF90ZXN0cz1PTiAke0dURVNUX0RJUn0KKworTmV4dCwgeW91IGNhbiBidWlsZCBHb29nbGUgVGVzdCBhbmQgYWxsIG9mIGl0cyBvd24gdGVzdHMuICBPbiBcKm5peCwKK3RoaXMgaXMgdXN1YWxseSBkb25lIGJ5ICdtYWtlJy4gIFRvIHJ1biB0aGUgdGVzdHMsIGRvCisKKyAgICBtYWtlIHRlc3QKKworQWxsIHRlc3RzIHNob3VsZCBwYXNzLgorCitOb3JtYWxseSB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCByZWdlbmVyYXRpbmcgdGhlIHNvdXJjZSBmaWxlcywKK3VubGVzcyB5b3UgbmVlZCB0byBtb2RpZnkgdGhlbS4gIEluIHRoYXQgY2FzZSwgeW91IHNob3VsZCBtb2RpZnkgdGhlCitjb3JyZXNwb25kaW5nIC5wdW1wIGZpbGVzIGluc3RlYWQgYW5kIHJ1biB0aGUgcHVtcC5weSBQeXRob24gc2NyaXB0IHRvCityZWdlbmVyYXRlIHRoZW0uICBZb3UgY2FuIGZpbmQgcHVtcC5weSBpbiB0aGUgW3NjcmlwdHMvXShzY3JpcHRzLykgZGlyZWN0b3J5LgorUmVhZCB0aGUgW1B1bXAgbWFudWFsXShkb2NzL1B1bXBNYW51YWwubWQpIGZvciBob3cgdG8gdXNlIGl0LgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2J1aWxkLWF1eC8ua2VlcCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9idWlsZC1hdXgvLmtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9idWlsZC1hdXgvLmtlZXAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2U2ZGJiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2NtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlCkBAIC0wLDAgKzEsMjQyIEBACisjIERlZmluZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZnVsIGZvciBidWlsZGluZyBHb29nbGUgVGVzdCBhbmQKKyMgR29vZ2xlIE1vY2suCisjCisjIE5vdGU6CisjCisjIC0gVGhpcyBmaWxlIHdpbGwgYmUgcnVuIHR3aWNlIHdoZW4gYnVpbGRpbmcgR29vZ2xlIE1vY2sgKG9uY2UgdmlhCisjICAgR29vZ2xlIFRlc3QncyBDTWFrZUxpc3RzLnR4dCwgYW5kIG9uY2UgdmlhIEdvb2dsZSBNb2NrJ3MpLgorIyAgIFRoZXJlZm9yZSBpdCBzaG91bGRuJ3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3RzIG90aGVyIHRoYW4gZGVmaW5pbmcKKyMgICB0aGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MuCisjCisjIC0gVGhlIGZ1bmN0aW9ucy9tYWNyb3MgZGVmaW5lZCBpbiB0aGlzIGZpbGUgbWF5IGRlcGVuZCBvbiBHb29nbGUKKyMgICBUZXN0IGFuZCBHb29nbGUgTW9jaydzIG9wdGlvbigpIGRlZmluaXRpb25zLCBhbmQgdGh1cyBtdXN0IGJlCisjICAgY2FsbGVkICphZnRlciogdGhlIG9wdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQuCisKKyMgVHdlYWtzIENNYWtlJ3MgZGVmYXVsdCBjb21waWxlci9saW5rZXIgc2V0dGluZ3MgdG8gc3VpdCBHb29nbGUgVGVzdCdzIG5lZWRzLgorIworIyBUaGlzIG11c3QgYmUgYSBtYWNybygpLCBhcyBpbnNpZGUgYSBmdW5jdGlvbiBzdHJpbmcoKSBjYW4gb25seQorIyB1cGRhdGUgdmFyaWFibGVzIGluIHRoZSBmdW5jdGlvbiBzY29wZS4KK21hY3JvKGZpeF9kZWZhdWx0X2NvbXBpbGVyX3NldHRpbmdzXykKKyAgaWYgKE1TVkMpCisgICAgIyBGb3IgTVNWQywgQ01ha2Ugc2V0cyBjZXJ0YWluIGZsYWdzIHRvIGRlZmF1bHRzIHdlIHdhbnQgdG8gb3ZlcnJpZGUuCisgICAgIyBUaGlzIHJlcGxhY2VtZW50IGNvZGUgaXMgdGFrZW4gZnJvbSBzYW1wbGUgaW4gdGhlIENNYWtlIFdpa2kgYXQKKyAgICAjIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2VfRkFRI0R5bmFtaWNfUmVwbGFjZS4KKyAgICBmb3JlYWNoIChmbGFnX3ZhcgorICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHUyBDTUFLRV9DWFhfRkxBR1NfREVCVUcgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTCBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8pCisgICAgICBpZiAoTk9UIEJVSUxEX1NIQVJFRF9MSUJTIEFORCBOT1QgZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydCkKKyAgICAgICAgIyBXaGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIGEgc2hhcmVkIGxpYnJhcnksIGl0IHNob3VsZCBhbHNvIHVzZQorICAgICAgICAjIHNoYXJlZCBydW50aW1lIGxpYnJhcmllcy4gIE90aGVyd2lzZSwgaXQgbWF5IGVuZCB1cCB3aXRoIG11bHRpcGxlCisgICAgICAgICMgY29waWVzIG9mIHJ1bnRpbWUgbGlicmFyeSBkYXRhIGluIGRpZmZlcmVudCBtb2R1bGVzLCByZXN1bHRpbmcgaW4KKyAgICAgICAgIyBoYXJkLXRvLWZpbmQgY3Jhc2hlcy4gV2hlbiBpdCBpcyBidWlsdCBhcyBhIHN0YXRpYyBsaWJyYXJ5LCBpdCBpcworICAgICAgICAjIHByZWZlcmFibGUgdG8gdXNlIENSVCBhcyBzdGF0aWMgbGlicmFyaWVzLCBhcyB3ZSBkb24ndCBoYXZlIHRvIHJlbHkKKyAgICAgICAgIyBvbiBDUlQgRExMcyBiZWluZyBhdmFpbGFibGUuIENNYWtlIGFsd2F5cyBkZWZhdWx0cyB0byB1c2luZyBzaGFyZWQKKyAgICAgICAgIyBDUlQgbGlicmFyaWVzLCBzbyB3ZSBvdmVycmlkZSB0aGF0IGRlZmF1bHQgaGVyZS4KKyAgICAgICAgc3RyaW5nKFJFUExBQ0UgIi9NRCIgIi1NVCIgJHtmbGFnX3Zhcn0gIiR7JHtmbGFnX3Zhcn19IikKKyAgICAgIGVuZGlmKCkKKworICAgICAgIyBXZSBwcmVmZXIgbW9yZSBzdHJpY3Qgd2FybmluZyBjaGVja2luZyBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QuCisgICAgICAjIFJlcGxhY2VzIC9XMyB3aXRoIC9XNCBpbiBkZWZhdWx0cy4KKyAgICAgIHN0cmluZyhSRVBMQUNFICIvVzMiICIvVzQiICR7ZmxhZ192YXJ9ICIkeyR7ZmxhZ192YXJ9fSIpCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBEZWZpbmVzIHRoZSBjb21waWxlci9saW5rZXIgZmxhZ3MgdXNlZCB0byBidWlsZCBHb29nbGUgVGVzdCBhbmQKKyMgR29vZ2xlIE1vY2suICBZb3UgY2FuIHR3ZWFrIHRoZXNlIGRlZmluaXRpb25zIHRvIHN1aXQgeW91ciBuZWVkLiAgQQorIyB2YXJpYWJsZSdzIHZhbHVlIGlzIGVtcHR5IGJlZm9yZSBpdCdzIGV4cGxpY2l0bHkgYXNzaWduZWQgdG8uCittYWNybyhjb25maWdfY29tcGlsZXJfYW5kX2xpbmtlcikKKyAgaWYgKE5PVCBndGVzdF9kaXNhYmxlX3B0aHJlYWRzKQorICAgICMgRGVmaW5lcyBDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCBhbmQgQ01BS0VfVEhSRUFEX0xJQlNfSU5JVC4KKyAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykKKyAgZW5kaWYoKQorCisgIGZpeF9kZWZhdWx0X2NvbXBpbGVyX3NldHRpbmdzXygpCisgIGlmIChNU1ZDKQorICAgICMgTmV3bGluZXMgaW5zaWRlIGZsYWdzIHZhcmlhYmxlcyBicmVhayBDTWFrZSdzIE5NYWtlIGdlbmVyYXRvci4KKyAgICAjIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEFkZCAtUlRDcyBhbmQgLVJUQ3UgdG8gZGVidWcgYnVpbGRzLgorICAgIHNldChjeHhfYmFzZV9mbGFncyAiLUdTIC1XNCAtV1ggLXdkNDI1MSAtd2Q0Mjc1IC1ub2xvZ28gLUogLVppIikKKyAgICBpZiAoTVNWQ19WRVJTSU9OIExFU1MgMTQwMCkgICMgMTQwMCBpcyBWaXN1YWwgU3R1ZGlvIDIwMDUKKyAgICAgICMgU3VwcHJlc3Mgc3B1cmlvdXMgd2FybmluZ3MgTVNWQyA3LjEgc29tZXRpbWVzIGlzc3Vlcy4KKyAgICAgICMgRm9yY2luZyB2YWx1ZSB0byBib29sLgorICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0ODAwIikKKyAgICAgICMgQ29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLgorICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0NTExIC13ZDQ1MTIiKQorICAgICAgIyBDb21wYXRpYmlsaXR5IHdhcm5pbmdzIG5vdCBhcHBsaWNhYmxlIHRvIEdvb2dsZSBUZXN0LgorICAgICAgIyBSZXNvbHZlZCBvdmVybG9hZCB3YXMgZm91bmQgYnkgYXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cC4KKyAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDY3NSIpCisgICAgZW5kaWYoKQorICAgIGlmIChNU1ZDX1ZFUlNJT04gTEVTUyAxNTAwKSAgIyAxNTAwIGlzIFZpc3VhbCBTdHVkaW8gMjAwOAorICAgICAgIyBDb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50LgorICAgICAgIyBXaGVuIGNvbXBpbGluZyB3aXRoIC9XNCwgd2UgZ2V0IHNldmVyYWwgaW5zdGFuY2VzIG9mIEM0MTI3CisgICAgICAjIChDb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50KS4gSW4gb3VyIGNvZGUsIHdlIGRpc2FibGUgdGhhdAorICAgICAgIyB3YXJuaW5nIG9uIGEgY2FzZS1ieS1jYXNlIGJhc2lzLiBIb3dldmVyLCBvbiBWaXN1YWwgU3R1ZGlvIDIwMDUsCisgICAgICAjIHRoZSB3YXJuaW5nIGZpcmVzIG9uIHN0ZDo6bGlzdC4gVGhlcmVmb3JlIG9uIHRoYXQgY29tcGlsZXIgYW5kIGVhcmxpZXIsCisgICAgICAjIHdlIGRpc2FibGUgdGhlIHdhcm5pbmcgcHJvamVjdC13aWRlLgorICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0MTI3IikKKyAgICBlbmRpZigpCisgICAgaWYgKE5PVCAoTVNWQ19WRVJTSU9OIExFU1MgMTcwMCkpICAjIDE3MDAgaXMgVmlzdWFsIFN0dWRpbyAyMDEyLgorICAgICAgIyBTdXBwcmVzcyAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBvbiBWUyAyMDEyIGFuZCBsYXRlci4KKyAgICAgICMgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMjMyNjY5IGV4cGxhaW5zIHRoZSBpc3N1ZS4KKyAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDcwMiIpCisgICAgZW5kaWYoKQorCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtRF9VTklDT0RFIC1EVU5JQ09ERSAtRFdJTjMyIC1EX1dJTjMyIikKKyAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIiR7Y3h4X2Jhc2VfZmxhZ3N9IC1EU1RSSUNUIC1EV0lOMzJfTEVBTl9BTkRfTUVBTiIpCisgICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1FSHNjIC1EX0hBU19FWENFUFRJT05TPTEiKQorICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItRF9IQVNfRVhDRVBUSU9OUz0wIikKKyAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1HUi0iKQorICBlbHNlaWYgKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCkKKyAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIi1XYWxsIC1Xc2hhZG93IikKKyAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLWZleGNlcHRpb25zIikKKyAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLWZuby1leGNlcHRpb25zIikKKyAgICAjIFVudGlsIHZlcnNpb24gNC4zLjIsIEdDQyBkb2Vzbid0IGRlZmluZSBhIG1hY3JvIHRvIGluZGljYXRlCisgICAgIyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZC4gIFRoZXJlZm9yZSB3ZSBkZWZpbmUgR1RFU1RfSEFTX1JUVEkKKyAgICAjIGV4cGxpY2l0bHkuCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItZm5vLXJ0dGkgLURHVEVTVF9IQVNfUlRUST0wIikKKyAgICBzZXQoY3h4X3N0cmljdF9mbGFncworICAgICAgIi1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiKQorICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiU3VuUHJvIikKKyAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLWZlYXR1cmVzPWV4Y2VwdCIpCisgICAgIyBTdW4gUHJvIGRvZXNuJ3QgcHJvdmlkZSBtYWNyb3MgdG8gaW5kaWNhdGUgd2hldGhlciBleGNlcHRpb25zIGFuZAorICAgICMgUlRUSSBhcmUgZW5hYmxlZCwgc28gd2UgZGVmaW5lIEdURVNUX0hBU18qIGV4cGxpY2l0bHkuCisgICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1mZWF0dXJlcz1ubyVleGNlcHQgLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0wIikKKyAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1mZWF0dXJlcz1ubyVydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCisgIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJWaXN1YWxBZ2UiIE9SCisgICAgICBDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIlhMIikKKyAgICAjIENNYWtlIDIuOCBjaGFuZ2VzIFZpc3VhbCBBZ2UncyBjb21waWxlciBJRCB0byAiWEwiLgorICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItcWVoIikKKyAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLXFub2VoIikKKyAgICAjIFVudGlsIHZlcnNpb24gOS4wLCBWaXN1YWwgQWdlIGRvZXNuJ3QgZGVmaW5lIGEgbWFjcm8gdG8gaW5kaWNhdGUKKyAgICAjIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLiAgVGhlcmVmb3JlIHdlIGRlZmluZSBHVEVTVF9IQVNfUlRUSQorICAgICMgZXhwbGljaXRseS4KKyAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1xbm9ydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCisgIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJIUCIpCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICItQUEgLW10IikKKyAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0xIikKKyAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiK25vZWggLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0wIikKKyAgICAjIFJUVEkgY2FuIG5vdCBiZSBkaXNhYmxlZCBpbiBIUCBhQ0MgY29tcGlsZXIuCisgICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICIiKQorICBlbmRpZigpCisKKyAgaWYgKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKSAgIyBUaGUgcHRocmVhZHMgbGlicmFyeSBpcyBhdmFpbGFibGUgYW5kIGFsbG93ZWQuCisgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtREdURVNUX0hBU19QVEhSRUFEPTEiKQorICBlbHNlKCkKKyAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIiR7Y3h4X2Jhc2VfZmxhZ3N9IC1ER1RFU1RfSEFTX1BUSFJFQUQ9MCIpCisgIGVuZGlmKCkKKworICAjIEZvciBidWlsZGluZyBndGVzdCdzIG93biB0ZXN0cyBhbmQgc2FtcGxlcy4KKyAgc2V0KGN4eF9leGNlcHRpb24gIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2N4eF9iYXNlX2ZsYWdzfSAke2N4eF9leGNlcHRpb25fZmxhZ3N9IikKKyAgc2V0KGN4eF9ub19leGNlcHRpb24KKyAgICAiJHtDTUFLRV9DWFhfRkxBR1N9ICR7Y3h4X2Jhc2VfZmxhZ3N9ICR7Y3h4X25vX2V4Y2VwdGlvbl9mbGFnc30iKQorICBzZXQoY3h4X2RlZmF1bHQgIiR7Y3h4X2V4Y2VwdGlvbn0iKQorICBzZXQoY3h4X25vX3J0dGkgIiR7Y3h4X2RlZmF1bHR9ICR7Y3h4X25vX3J0dGlfZmxhZ3N9IikKKyAgc2V0KGN4eF91c2Vfb3duX3R1cGxlICIke2N4eF9kZWZhdWx0fSAtREdURVNUX1VTRV9PV05fVFIxX1RVUExFPTEiKQorCisgICMgRm9yIGJ1aWxkaW5nIHRoZSBndGVzdCBsaWJyYXJpZXMuCisgIHNldChjeHhfc3RyaWN0ICIke2N4eF9kZWZhdWx0fSAke2N4eF9zdHJpY3RfZmxhZ3N9IikKK2VuZG1hY3JvKCkKKworIyBEZWZpbmVzIHRoZSBndGVzdCAmIGd0ZXN0X21haW4gbGlicmFyaWVzLiAgVXNlciB0ZXN0cyBzaG91bGQgbGluaworIyB3aXRoIG9uZSBvZiB0aGVtLgorZnVuY3Rpb24oY3h4X2xpYnJhcnlfd2l0aF90eXBlIG5hbWUgdHlwZSBjeHhfZmxhZ3MpCisgICMgdHlwZSBjYW4gYmUgZWl0aGVyIFNUQVRJQyBvciBTSEFSRUQgdG8gZGVub3RlIGEgc3RhdGljIG9yIHNoYXJlZCBsaWJyYXJ5LgorICAjIEFSR04gcmVmZXJzIHRvIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyICdjeHhfZmxhZ3MnLgorICBhZGRfbGlicmFyeSgke25hbWV9ICR7dHlwZX0gJHtBUkdOfSkKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KKyAgICBQUk9QRVJUSUVTCisgICAgQ09NUElMRV9GTEFHUyAiJHtjeHhfZmxhZ3N9IikKKyAgaWYgKEJVSUxEX1NIQVJFRF9MSUJTIE9SIHR5cGUgU1RSRVFVQUwgIlNIQVJFRCIpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KKyAgICAgIFBST1BFUlRJRVMKKyAgICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWT0xIikKKyAgZW5kaWYoKQorICBpZiAoQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYnVpbGQgdGFyZ2V0cy4KKworZnVuY3Rpb24oY3h4X3NoYXJlZF9saWJyYXJ5IG5hbWUgY3h4X2ZsYWdzKQorICBjeHhfbGlicmFyeV93aXRoX3R5cGUoJHtuYW1lfSBTSEFSRUQgIiR7Y3h4X2ZsYWdzfSIgJHtBUkdOfSkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24oY3h4X2xpYnJhcnkgbmFtZSBjeHhfZmxhZ3MpCisgIGN4eF9saWJyYXJ5X3dpdGhfdHlwZSgke25hbWV9ICIiICIke2N4eF9mbGFnc30iICR7QVJHTn0pCitlbmRmdW5jdGlvbigpCisKKyMgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyhuYW1lIGN4eF9mbGFncyBsaWJzIHNyY3MuLi4pCisjCisjIGNyZWF0ZXMgYSBuYW1lZCBDKysgZXhlY3V0YWJsZSB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnJhcmllcyBhbmQKKyMgaXMgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGNvbXBpbGVyIGZsYWdzLgorZnVuY3Rpb24oY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyBuYW1lIGN4eF9mbGFncyBsaWJzKQorICBhZGRfZXhlY3V0YWJsZSgke25hbWV9ICR7QVJHTn0pCisgIGlmIChjeHhfZmxhZ3MpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KKyAgICAgIFBST1BFUlRJRVMKKyAgICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X2ZsYWdzfSIpCisgIGVuZGlmKCkKKyAgaWYgKEJVSUxEX1NIQVJFRF9MSUJTKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9CisgICAgICBQUk9QRVJUSUVTCisgICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlk9MSIpCisgIGVuZGlmKCkKKyAgIyBUbyBzdXBwb3J0IG1peGluZyBsaW5raW5nIGluIHN0YXRpYyBhbmQgZHluYW1pYyBsaWJyYXJpZXMsIGxpbmsgZWFjaAorICAjIGxpYnJhcnkgaW4gd2l0aCBhbiBleHRyYSBjYWxsIHRvIHRhcmdldF9saW5rX2xpYnJhcmllcy4KKyAgZm9yZWFjaCAobGliICIke2xpYnN9IikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke2xpYn0pCisgIGVuZGZvcmVhY2goKQorZW5kZnVuY3Rpb24oKQorCisjIGN4eF9leGVjdXRhYmxlKG5hbWUgZGlyIGxpYiBzcmNzLi4uKQorIworIyBjcmVhdGVzIGEgbmFtZWQgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMgYnVpbHQKKyMgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzLiAgZGlyL25hbWUuY2MgaXMgaW1wbGljaXRseSBpbmNsdWRlZCBpbgorIyB0aGUgc291cmNlIGZpbGUgbGlzdC4KK2Z1bmN0aW9uKGN4eF9leGVjdXRhYmxlIG5hbWUgZGlyIGxpYnMpCisgIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MoCisgICAgJHtuYW1lfSAiJHtjeHhfZGVmYXVsdH0iICIke2xpYnN9IiAiJHtkaXJ9LyR7bmFtZX0uY2MiICR7QVJHTn0pCitlbmRmdW5jdGlvbigpCisKKyMgU2V0cyBQWVRIT05JTlRFUlBfRk9VTkQgYW5kIFBZVEhPTl9FWEVDVVRBQkxFLgorZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCkKKworIyBjeHhfdGVzdF93aXRoX2ZsYWdzKG5hbWUgY3h4X2ZsYWdzIGxpYnMgc3Jjcy4uLikKKyMKKyMgY3JlYXRlcyBhIG5hbWVkIEMrKyB0ZXN0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMgYnVpbHQKKyMgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGNvbXBpbGVyIGZsYWdzLgorZnVuY3Rpb24oY3h4X3Rlc3Rfd2l0aF9mbGFncyBuYW1lIGN4eF9mbGFncyBsaWJzKQorICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKCR7bmFtZX0gIiR7Y3h4X2ZsYWdzfSIgIiR7bGlic30iICR7QVJHTn0pCisgIGFkZF90ZXN0KCR7bmFtZX0gJHtuYW1lfSkKK2VuZGZ1bmN0aW9uKCkKKworIyBjeHhfdGVzdChuYW1lIGxpYnMgc3Jjcy4uLikKKyMKKyMgY3JlYXRlcyBhIG5hbWVkIHRlc3QgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMKKyMgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzLiAgVW5saWtlIGN4eF90ZXN0X3dpdGhfZmxhZ3MsCisjIHRlc3QvbmFtZS5jYyBpcyBhbHJlYWR5IGltcGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSBmaWxlIGxpc3QuCitmdW5jdGlvbihjeHhfdGVzdCBuYW1lIGxpYnMpCisgIGN4eF90ZXN0X3dpdGhfZmxhZ3MoIiR7bmFtZX0iICIke2N4eF9kZWZhdWx0fSIgIiR7bGlic30iCisgICAgInRlc3QvJHtuYW1lfS5jYyIgJHtBUkdOfSkKK2VuZGZ1bmN0aW9uKCkKKworIyBweV90ZXN0KG5hbWUpCisjCisjIGNyZWF0ZXMgYSBQeXRob24gdGVzdCB3aXRoIHRoZSBnaXZlbiBuYW1lIHdob3NlIG1haW4gbW9kdWxlIGlzIGluCisjIHRlc3QvbmFtZS5weS4gIEl0IGRvZXMgbm90aGluZyBpZiBQeXRob24gaXMgbm90IGluc3RhbGxlZC4KK2Z1bmN0aW9uKHB5X3Rlc3QgbmFtZSkKKyAgIyBXZSBhcmUgbm90IHN1cHBvcnRpbmcgUHl0aG9uIHRlc3RzIG9uIExpbnV4IHlldCBhcyB0aGV5IGNvbnNpZGVyCisgICMgYWxsIExpbnV4IGVudmlyb25tZW50cyB0byBiZSBnb29nbGUzIGFuZCB0cnkgdG8gdXNlIGdvb2dsZTMgZmVhdHVyZXMuCisgIGlmIChQWVRIT05JTlRFUlBfRk9VTkQpCisgICAgIyAke0NNQUtFX0JJTkFSWV9ESVJ9IGlzIGtub3duIGF0IGNvbmZpZ3VyYXRpb24gdGltZSwgc28gd2UgY2FuCisgICAgIyBkaXJlY3RseSBiaW5kIGl0IGZyb20gY21ha2UuICR7Q1RFU1RfQ09ORklHVVJBVElPTl9UWVBFfSBpcyBrbm93bgorICAgICMgb25seSBhdCBjdGVzdCBydW50aW1lIChieSBjYWxsaW5nIGN0ZXN0IC1jIDxDb25maWd1cmF0aW9uPiksIHNvCisgICAgIyB3ZSBoYXZlIHRvIGVzY2FwZSAkIHRvIGRlbGF5IHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBoZXJlLgorICAgIGFkZF90ZXN0KCR7bmFtZX0KKyAgICAgICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0LyR7bmFtZX0ucHkKKyAgICAgICAgICAtLWJ1aWxkX2Rpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vXCR7Q1RFU1RfQ09ORklHVVJBVElPTl9UWVBFfSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2NvZGVnZWFyL2d0ZXN0LmNicHJvaiBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jb2RlZ2Vhci9ndGVzdC5jYnByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjMzA1NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jb2RlZ2Vhci9ndGVzdC5jYnByb2oKQEAgLTAsMCArMSwxMzggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFByb2plY3RHdWlkPntiY2EzN2E3Mi01YjA3LTQ2Y2YtYjQ0ZS04OWY4ZTA2NDUxYTJ9PC9Qcm9qZWN0R3VpZD4NCisgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+UmVsZWFzZTwvQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2UnIG9yICckKEJhc2UpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+DQorICAgIDxCYXNlPnRydWU8L0Jhc2U+DQorICAgIDxDZmdfMT50cnVlPC9DZmdfMT4NCisgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+DQorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4NCisgICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPnRydWU8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPg0KKyAgICA8T3V0cHV0RXh0PmxpYjwvT3V0cHV0RXh0Pg0KKyAgICA8RENDX0NCdWlsZGVyT3V0cHV0PkpQSE5FPC9EQ0NfQ0J1aWxkZXJPdXRwdXQ+DQorICAgIDxEZWZpbmVzPk5PX1NUUklDVDwvRGVmaW5lcz4NCisgICAgPER5bmFtaWNSVEw+dHJ1ZTwvRHluYW1pY1JUTD4NCisgICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPg0KKyAgICA8UHJvamVjdFR5cGU+Q3BwU3RhdGljTGlicmFyeTwvUHJvamVjdFR5cGU+DQorICAgIDxCQ0NfQ1BQQ29tcGlsZUFsd2F5cz50cnVlPC9CQ0NfQ1BQQ29tcGlsZUFsd2F5cz4NCisgICAgPFBhY2thZ2VJbXBvcnRzPnJ0bC5icGk7dmNsLmJwaTtiY2JpZS5icGk7dmNseC5icGk7dmNsYWN0bmJhbmQuYnBpO3htbHJ0bC5icGk7YmNic21wLmJwaTtkYnJ0bC5icGk7dmNsZGIuYnBpO2JkZXJ0bC5icGk7dmNsZGJ4LmJwaTtkc25hcC5icGk7ZHNuYXBjb24uYnBpO3ZjbGliLmJwaTtpYnhwcmVzcy5icGk7YWRvcnRsLmJwaTtkYnhjZHMuYnBpO2RiZXhwcmVzcy5icGk7RGJ4Q29tbW9uRHJpdmVyLmJwaTt3ZWJzbmFwLmJwaTt2Y2xpZS5icGk7d2ViZHNuYXAuYnBpO2luZXQuYnBpO2luZXRkYmJkZS5icGk7aW5ldGRieHByZXNzLmJwaTtzb2FwcnRsLmJwaTtSYXZlNzVWQ0wuYnBpO3RlZVVJLmJwaTt0ZWUuYnBpO3RlZWRiLmJwaTtJbmR5Q29yZS5icGk7SW5keVN5c3RlbS5icGk7SW5keVByb3RvY29scy5icGk7SW50cmF3ZWJEQl85MF8xMDAuYnBpO0ludHJhd2ViXzkwXzEwMC5icGk7ZGNsWmlwRm9yZ2VkMTEuYnBpO3ZjbFppcEZvcmdlZDExLmJwaTtHUjMyX0JEUzIwMDYuYnBpO0dSMzJfRFNHTl9CRFMyMDA2LmJwaTtKY2wuYnBpO0pjbFZjbC5icGk7SnZDb3JlRDExUi5icGk7SnZTeXN0ZW1EMTFSLmJwaTtKdlN0ZEN0cmxzRDExUi5icGk7SnZBcHBGcm1EMTFSLmJwaTtKdkJhbmRzRDExUi5icGk7SnZEQkQxMVIuYnBpO0p2RGxnc0QxMVIuYnBpO0p2QkRFRDExUi5icGk7SnZDbXBEMTFSLmJwaTtKdkNyeXB0RDExUi5icGk7SnZDdHJsc0QxMVIuYnBpO0p2Q3VzdG9tRDExUi5icGk7SnZEb2NraW5nRDExUi5icGk7SnZEb3ROZXRDdHJsc0QxMVIuYnBpO0p2RURJRDExUi5icGk7SnZHbG9idXNEMTFSLmJwaTtKdkhNSUQxMVIuYnBpO0p2SW50ZXJwcmV0ZXJEMTFSLmJwaTtKdkphbnNEMTFSLmJwaTtKdk1hbmFnZWRUaHJlYWRzRDExUi5icGk7SnZNTUQxMVIuYnBpO0p2TmV0RDExUi5icGk7SnZQYWdlQ29tcHNEMTFSLmJwaTtKdlBsdWdpbkQxMVIuYnBpO0p2UHJpbnRQcmV2aWV3RDExUi5icGk7SnZSdW50aW1lRGVzaWduRDExUi5icGk7SnZUaW1lRnJhbWV3b3JrRDExUi5icGk7SnZWYWxpZGF0b3JzRDExUi5icGk7SnZXaXphcmREMTFSLmJwaTtKdlhQQ3RybHNEMTFSLmJwaTtWY2xTbXAuYnBpO0NFeGNlcHRpb25FeHBlcnQxMS5icGk8L1BhY2thZ2VJbXBvcnRzPg0KKyAgICA8QkNDX3dwYXI+ZmFsc2U8L0JDQ193cGFyPg0KKyAgICA8SW5jbHVkZVBhdGg+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0luY2x1ZGVQYXRoPg0KKyAgICA8QWxsUGFja2FnZUxpYnM+cnRsLmxpYjt2Y2wubGliPC9BbGxQYWNrYWdlTGlicz4NCisgICAgPFRMSUJfUGFnZVNpemU+MzI8L1RMSUJfUGFnZVNpemU+DQorICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazwvSUxJTktfTGlicmFyeVBhdGg+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4NCisgICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPmZhbHNlPC9CQ0NfT3B0aW1pemVGb3JTcGVlZD4NCisgICAgPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPg0KKyAgICA8RENDX0RlYnVnSW5mb0luRXhlPnRydWU8L0RDQ19EZWJ1Z0luZm9JbkV4ZT4NCisgICAgPERlZmluZXM+X0RFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQorICAgIDxJTElOS19GdWxsRGVidWdJbmZvPnRydWU8L0lMSU5LX0Z1bGxEZWJ1Z0luZm8+DQorICAgIDxCQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+ZmFsc2U8L0JDQ19JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgPElMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+dHJ1ZTwvSUxJTktfRGlzYWJsZUluY3JlbWVudGFsTGlua2luZz4NCisgICAgPEJDQ19Vc2VSZWdpc3RlclZhcmlhYmxlcz5Ob25lPC9CQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+DQorICAgIDxEQ0NfRGVmaW5lPkRFQlVHPC9EQ0NfRGVmaW5lPg0KKyAgICA8QkNDX0RlYnVnTGluZU51bWJlcnM+dHJ1ZTwvQkNDX0RlYnVnTGluZU51bWJlcnM+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+RGVidWc8L0ludGVybWVkaWF0ZU91dHB1dERpcj4NCisgICAgPFRBU01fRGlzcGxheVNvdXJjZUxpbmVzPnRydWU8L1RBU01fRGlzcGxheVNvdXJjZUxpbmVzPg0KKyAgICA8QkNDX1N0YWNrRnJhbWVzPnRydWU8L0JDQ19TdGFja0ZyYW1lcz4NCisgICAgPEJDQ19EaXNhYmxlT3B0aW1pemF0aW9ucz50cnVlPC9CQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+DQorICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliXGRlYnVnOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCisgICAgPFRBU01fRGVidWdnaW5nPkZ1bGw8L1RBU01fRGVidWdnaW5nPg0KKyAgICA8QkNDX1NvdXJjZURlYnVnZ2luZ09uPnRydWU8L0JDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPg0KKyAgICA8RGVmaW5lcz5OREVCVUc7JChEZWZpbmVzKTwvRGVmaW5lcz4NCisgICAgPEludGVybWVkaWF0ZU91dHB1dERpcj5SZWxlYXNlPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQorICAgIDxJTElOS19MaWJyYXJ5UGF0aD4kKEJEUylcbGliXHJlbGVhc2U7JChJTElOS19MaWJyYXJ5UGF0aCk8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgICA8VEFTTV9EZWJ1Z2dpbmc+Tm9uZTwvVEFTTV9EZWJ1Z2dpbmc+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvamVjdEV4dGVuc2lvbnM+DQorICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkNQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk8L0JvcmxhbmQuUGVyc29uYWxpdHk+DQorICAgIDxCb3JsYW5kLlByb2plY3RUeXBlPkNwcFN0YXRpY0xpYnJhcnk8L0JvcmxhbmQuUHJvamVjdFR5cGU+DQorICAgIDxCb3JsYW5kUHJvamVjdD4NCis8Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZTJrMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgMjAwMCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZXhwMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgWFAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgPC9FeGNsdWRlZF9QYWNrYWdlcz48TGlua2VyPjxMaW5rZXIgTmFtZT0iTGliUHJlZml4Ij48L0xpbmtlcj48TGlua2VyIE5hbWU9IkxpYlN1ZmZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJWZXJzaW9uIj48L0xpbmtlcj48L0xpbmtlcj48UHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IkF1dG9TaG93RGVwcyI+RmFsc2U8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJNYW5hZ2VQYXRocyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IlZlcmlmeVBhY2thZ2VzIj5UcnVlPC9Qcm9qZWN0UHJvcGVydGllcz48L1Byb2plY3RQcm9wZXJ0aWVzPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iQ291bnQiPjM8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMSI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXGluY2x1ZGU7Li48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMiI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5cc3JjOy4uXHNyYzsuLlxpbmNsdWRlPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iSXRlbTAiPk5PX1NUUklDVDwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PEhpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemUgTmFtZT0iSXRlbTAiPjMyPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0xIj4xNjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjwvQm9ybGFuZFByb2plY3Q+PC9Cb3JsYW5kUHJvamVjdD4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuQ3BwLlRhcmdldHMiIC8+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LWRlYXRoLXRlc3QuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MzwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LW1lc3NhZ2UuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+NDwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LXBhcmFtLXRlc3QuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+NTwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGd0ZXN0LXNwaS5oIj4NCisgICAgICA8QnVpbGRPcmRlcj42PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3QtdGVzdC1wYXJ0LmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjc8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC10eXBlZC10ZXN0LmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjg8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4wPC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcZ3Rlc3RfcHJlZF9pbXBsLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxndGVzdF9wcm9kLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjI8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjk8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1maWxlcGF0aC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xMDwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LWludGVybmFsLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjExPC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtbGlua2VkX3B0ci5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xMjwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE0PC9CdWlsZE9yZGVyPg0KKyAgICA8L05vbmU+DQorICAgIDxOb25lIEluY2x1ZGU9Ii4uXGluY2x1ZGVcZ3Rlc3RcaW50ZXJuYWxcZ3Rlc3QtcGFyYW0tdXRpbC5oIj4NCisgICAgICA8QnVpbGRPcmRlcj4xMzwvQnVpbGRPcmRlcj4NCisgICAgPC9Ob25lPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSIuLlxpbmNsdWRlXGd0ZXN0XGludGVybmFsXGd0ZXN0LXBvcnQuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTU8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC1zdHJpbmcuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTY8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPE5vbmUgSW5jbHVkZT0iLi5caW5jbHVkZVxndGVzdFxpbnRlcm5hbFxndGVzdC10eXBlLXV0aWwuaCI+DQorICAgICAgPEJ1aWxkT3JkZXI+MTc8L0J1aWxkT3JkZXI+DQorICAgIDwvTm9uZT4NCisgICAgPENwcENvbXBpbGUgSW5jbHVkZT0iZ3Rlc3RfYWxsLmNjIj4NCisgICAgICA8QnVpbGRPcmRlcj4xODwvQnVpbGRPcmRlcj4NCisgICAgPC9DcHBDb21waWxlPg0KKyAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4NCisgICAgICA8S2V5PkNmZ18xPC9LZXk+DQorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KKyAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPg0KKyAgICAgIDxLZXk+Q2ZnXzI8L0tleT4NCisgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2NvZGVnZWFyL2d0ZXN0Lmdyb3VwcHJvaiBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jb2RlZ2Vhci9ndGVzdC5ncm91cHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmMzFjYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jb2RlZ2Vhci9ndGVzdC5ncm91cHByb2oKQEAgLTAsMCArMSw1NCBAQAor77u/PFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFByb2plY3RHdWlkPntjMWQ5MjNlMC02Y2JhLTQzMzItOWI2Zi0zNDIwYWNiZjUwOTF9PC9Qcm9qZWN0R3VpZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXAgLz4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0cyBJbmNsdWRlPSJndGVzdC5jYnByb2oiIC8+DQorICAgIDxQcm9qZWN0cyBJbmNsdWRlPSJndGVzdF9tYWluLmNicHJvaiIgLz4NCisgICAgPFByb2plY3RzIEluY2x1ZGU9Imd0ZXN0X3VuaXR0ZXN0LmNicHJvaiIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWZhdWx0LlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KKyAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZSAvPg0KKyAgICA8Qm9ybGFuZFByb2plY3Q+DQorPEJvcmxhbmRQcm9qZWN0IHhtbG5zPSIiPjxEZWZhdWx0LlBlcnNvbmFsaXR5PjwvRGVmYXVsdC5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdCI+DQorICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdC5jYnByb2oiIFRhcmdldHM9IiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdDpDbGVhbiI+DQorICAgIDxNU0J1aWxkIFByb2plY3RzPSJndGVzdC5jYnByb2oiIFRhcmdldHM9IkNsZWFuIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9Imd0ZXN0Ok1ha2UiPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3QuY2Jwcm9qIiBUYXJnZXRzPSJNYWtlIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9Imd0ZXN0X21haW4iPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfbWFpbi5jYnByb2oiIFRhcmdldHM9IiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdF9tYWluOkNsZWFuIj4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X21haW4uY2Jwcm9qIiBUYXJnZXRzPSJDbGVhbiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdF9tYWluOk1ha2UiPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfbWFpbi5jYnByb2oiIFRhcmdldHM9Ik1ha2UiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfdW5pdHRlc3QiPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIiBUYXJnZXRzPSIiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iZ3Rlc3RfdW5pdHRlc3Q6Q2xlYW4iPg0KKyAgICA8TVNCdWlsZCBQcm9qZWN0cz0iZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qIiBUYXJnZXRzPSJDbGVhbiIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJndGVzdF91bml0dGVzdDpNYWtlIj4NCisgICAgPE1TQnVpbGQgUHJvamVjdHM9Imd0ZXN0X3VuaXR0ZXN0LmNicHJvaiIgVGFyZ2V0cz0iTWFrZSIgLz4NCisgIDwvVGFyZ2V0Pg0KKyAgPFRhcmdldCBOYW1lPSJCdWlsZCI+DQorICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9Imd0ZXN0O2d0ZXN0X21haW47Z3Rlc3RfdW5pdHRlc3QiIC8+DQorICA8L1RhcmdldD4NCisgIDxUYXJnZXQgTmFtZT0iQ2xlYW4iPg0KKyAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJndGVzdDpDbGVhbjtndGVzdF9tYWluOkNsZWFuO2d0ZXN0X3VuaXR0ZXN0OkNsZWFuIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8VGFyZ2V0IE5hbWU9Ik1ha2UiPg0KKyAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJndGVzdDpNYWtlO2d0ZXN0X21haW46TWFrZTtndGVzdF91bml0dGVzdDpNYWtlIiAvPg0KKyAgPC9UYXJnZXQ+DQorICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcQm9ybGFuZC5Hcm91cC5UYXJnZXRzIiAvPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29kZWdlYXIvZ3Rlc3RfYWxsLmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2NvZGVnZWFyL2d0ZXN0X2FsbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFiMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2NvZGVnZWFyL2d0ZXN0X2FsbC5jYwpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorLy8NCisvLyBBdXRob3I6IEpvc2ggS2VsbGV5IChqb3Noa2VsQGdtYWlsLmNvbSkNCisvLw0KKy8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KKy8vDQorLy8gQysrQnVpbGRlcidzIElERSBjYW5ub3QgYnVpbGQgYSBzdGF0aWMgbGlicmFyeSBmcm9tIGZpbGVzIHdpdGggaHlwaGVucw0KKy8vIGluIHRoZWlyIG5hbWUuICBTZWUgaHR0cDovL3FjLmNvZGVnZWFyLmNvbS93Yy9xY21haW4uYXNweD9kPTcwOTc3IC4NCisvLyBUaGlzIGZpbGUgc2VydmVzIGFzIGEgd29ya2Fyb3VuZC4NCisNCisjaW5jbHVkZSAic3JjL2d0ZXN0LWFsbC5jYyINCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29kZWdlYXIvZ3Rlc3RfbGluay5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jb2RlZ2Vhci9ndGVzdF9saW5rLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOGVjY2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29kZWdlYXIvZ3Rlc3RfbGluay5jYwpAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4NCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vDQorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKy8vIG1ldDoNCisvLw0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKy8vIGRpc3RyaWJ1dGlvbi4NCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKy8vDQorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorLy8NCisvLyBBdXRob3I6IEpvc2ggS2VsbGV5IChqb3Noa2VsQGdtYWlsLmNvbSkNCisvLw0KKy8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KKy8vDQorLy8gTGlua3MgZ3Rlc3QubGliIGFuZCBndGVzdF9tYWluLmxpYiBpbnRvIHRoZSBjdXJyZW50IHByb2plY3QgaW4gQysrQnVpbGRlci4NCisvLyBUaGlzIG1lYW5zIHRoYXQgdGhlc2UgbGlicmFyaWVzIGNhbid0IGJlIHJlbmFtZWQsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSB0bw0KKy8vIGVuc3VyZSB0aGF0IERlYnVnIHZlcnN1cyBSZWxlYXNlIHRlc3QgYnVpbGRzIGFyZSBsaW5rZWQgYWdhaW5zdCB0aGUNCisvLyBhcHByb3ByaWF0ZSBEZWJ1ZyBvciBSZWxlYXNlIGJ1aWxkIG9mIHRoZSBsaWJyYXJpZXMuDQorDQorI3ByYWdtYSBsaW5rICJndGVzdC5saWIiDQorI3ByYWdtYSBsaW5rICJndGVzdF9tYWluLmxpYiINCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29kZWdlYXIvZ3Rlc3RfbWFpbi5jYnByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2Y2UxMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jb2RlZ2Vhci9ndGVzdF9tYWluLmNicHJvagpAQCAtMCwwICsxLDgyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxQcm9qZWN0R3VpZD57YmNhMzdhNzItNWIwNy00NmNmLWI0NGUtODlmOGUwNjQ1MWEyfTwvUHJvamVjdEd1aWQ+DQorICAgIDxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPlJlbGVhc2U8L0NvbmZpZz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNlJyBvciAnJChCYXNlKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgICA8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+DQorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4NCisgICAgPEJhc2U+dHJ1ZTwvQmFzZT4NCisgICAgPENmZ18yPnRydWU8L0NmZ18yPg0KKyAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD50cnVlPC9CQ0NfT3B0aW1pemVGb3JTcGVlZD4NCisgICAgPE91dHB1dEV4dD5saWI8L091dHB1dEV4dD4NCisgICAgPERDQ19DQnVpbGRlck91dHB1dD5KUEhORTwvRENDX0NCdWlsZGVyT3V0cHV0Pg0KKyAgICA8RGVmaW5lcz5OT19TVFJJQ1Q8L0RlZmluZXM+DQorICAgIDxEeW5hbWljUlRMPnRydWU8L0R5bmFtaWNSVEw+DQorICAgIDxVc2VQYWNrYWdlcz50cnVlPC9Vc2VQYWNrYWdlcz4NCisgICAgPFByb2plY3RUeXBlPkNwcFN0YXRpY0xpYnJhcnk8L1Byb2plY3RUeXBlPg0KKyAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+DQorICAgIDxQYWNrYWdlSW1wb3J0cz5ydGwuYnBpO3ZjbC5icGk7YmNiaWUuYnBpO3ZjbHguYnBpO3ZjbGFjdG5iYW5kLmJwaTt4bWxydGwuYnBpO2JjYnNtcC5icGk7ZGJydGwuYnBpO3ZjbGRiLmJwaTtiZGVydGwuYnBpO3ZjbGRieC5icGk7ZHNuYXAuYnBpO2RzbmFwY29uLmJwaTt2Y2xpYi5icGk7aWJ4cHJlc3MuYnBpO2Fkb3J0bC5icGk7ZGJ4Y2RzLmJwaTtkYmV4cHJlc3MuYnBpO0RieENvbW1vbkRyaXZlci5icGk7d2Vic25hcC5icGk7dmNsaWUuYnBpO3dlYmRzbmFwLmJwaTtpbmV0LmJwaTtpbmV0ZGJiZGUuYnBpO2luZXRkYnhwcmVzcy5icGk7c29hcHJ0bC5icGk7UmF2ZTc1VkNMLmJwaTt0ZWVVSS5icGk7dGVlLmJwaTt0ZWVkYi5icGk7SW5keUNvcmUuYnBpO0luZHlTeXN0ZW0uYnBpO0luZHlQcm90b2NvbHMuYnBpO0ludHJhd2ViREJfOTBfMTAwLmJwaTtJbnRyYXdlYl85MF8xMDAuYnBpO2RjbFppcEZvcmdlZDExLmJwaTt2Y2xaaXBGb3JnZWQxMS5icGk7R1IzMl9CRFMyMDA2LmJwaTtHUjMyX0RTR05fQkRTMjAwNi5icGk7SmNsLmJwaTtKY2xWY2wuYnBpO0p2Q29yZUQxMVIuYnBpO0p2U3lzdGVtRDExUi5icGk7SnZTdGRDdHJsc0QxMVIuYnBpO0p2QXBwRnJtRDExUi5icGk7SnZCYW5kc0QxMVIuYnBpO0p2REJEMTFSLmJwaTtKdkRsZ3NEMTFSLmJwaTtKdkJERUQxMVIuYnBpO0p2Q21wRDExUi5icGk7SnZDcnlwdEQxMVIuYnBpO0p2Q3RybHNEMTFSLmJwaTtKdkN1c3RvbUQxMVIuYnBpO0p2RG9ja2luZ0QxMVIuYnBpO0p2RG90TmV0Q3RybHNEMTFSLmJwaTtKdkVESUQxMVIuYnBpO0p2R2xvYnVzRDExUi5icGk7SnZITUlEMTFSLmJwaTtKdkludGVycHJldGVyRDExUi5icGk7SnZKYW5zRDExUi5icGk7SnZNYW5hZ2VkVGhyZWFkc0QxMVIuYnBpO0p2TU1EMTFSLmJwaTtKdk5ldEQxMVIuYnBpO0p2UGFnZUNvbXBzRDExUi5icGk7SnZQbHVnaW5EMTFSLmJwaTtKdlByaW50UHJldmlld0QxMVIuYnBpO0p2UnVudGltZURlc2lnbkQxMVIuYnBpO0p2VGltZUZyYW1ld29ya0QxMVIuYnBpO0p2VmFsaWRhdG9yc0QxMVIuYnBpO0p2V2l6YXJkRDExUi5icGk7SnZYUEN0cmxzRDExUi5icGk7VmNsU21wLmJwaTtDRXhjZXB0aW9uRXhwZXJ0MTEuYnBpPC9QYWNrYWdlSW1wb3J0cz4NCisgICAgPEJDQ193cGFyPmZhbHNlPC9CQ0Nfd3Bhcj4NCisgICAgPEluY2x1ZGVQYXRoPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9JbmNsdWRlUGF0aD4NCisgICAgPEFsbFBhY2thZ2VMaWJzPnJ0bC5saWI7dmNsLmxpYjwvQWxsUGFja2FnZUxpYnM+DQorICAgIDxUTElCX1BhZ2VTaXplPjMyPC9UTElCX1BhZ2VTaXplPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+DQorICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4NCisgICAgPERDQ19EZWJ1Z0luZm9JbkV4ZT50cnVlPC9EQ0NfRGVidWdJbmZvSW5FeGU+DQorICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KKyAgICA8SUxJTktfRnVsbERlYnVnSW5mbz50cnVlPC9JTElOS19GdWxsRGVidWdJbmZvPg0KKyAgICA8QkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPmZhbHNlPC9CQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+DQorICAgIDxCQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+Tm9uZTwvQkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPg0KKyAgICA8RENDX0RlZmluZT5ERUJVRzwvRENDX0RlZmluZT4NCisgICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPkRlYnVnPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQorICAgIDxUQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz50cnVlPC9UQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz4NCisgICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+DQorICAgIDxCQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+dHJ1ZTwvQkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxkZWJ1ZzskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQorICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4NCisgICAgPEJDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj50cnVlPC9CQ0NfU291cmNlRGVidWdnaW5nT24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4NCisgICAgPERlZmluZXM+TkRFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+UmVsZWFzZTwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCisgICAgPFRBU01fRGVidWdnaW5nPk5vbmU8L1RBU01fRGVidWdnaW5nPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KKyAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZT5DcHBTdGF0aWNMaWJyYXJ5PC9Cb3JsYW5kLlByb2plY3RUeXBlPg0KKyAgICA8Qm9ybGFuZFByb2plY3Q+DQorPEJvcmxhbmRQcm9qZWN0PjxDUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjxWZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPjwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyI+PC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyI+PC9WZXJzaW9uSW5mb0tleXM+PC9WZXJzaW9uSW5mb0tleXM+PERlYnVnZ2luZz48RGVidWdnaW5nIE5hbWU9IkRlYnVnU291cmNlRGlycyI+PC9EZWJ1Z2dpbmc+PC9EZWJ1Z2dpbmc+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUnVuUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iRGVidWdDV0QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJIb3N0QXBwbGljYXRpb24iPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVIb3N0Ij48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGF0aCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZVBhcmFtcyI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUxhdW5jaGVyIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iVXNlUmVtb3RlTGF1bmNoZXIiPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUNXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZURlYnVnIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1ZyBTeW1ib2xzIFNlYXJjaCBQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZEFsbFN5bWJvbHMiPlRydWU8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iTG9hZFVuc3BlY2lmaWVkU3ltYm9scyI+RmFsc2U8L1BhcmFtZXRlcnM+PC9QYXJhbWV0ZXJzPjxFeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2UyazEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIDIwMDAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgICA8RXhjbHVkZWRfUGFja2FnZXMgTmFtZT0iJChCRFMpXGJpblxiY2JvZmZpY2V4cDEwMC5icGwiPkNvZGVHZWFyIEMrK0J1aWxkZXIgT2ZmaWNlIFhQIFNlcnZlcnMgUGFja2FnZTwvRXhjbHVkZWRfUGFja2FnZXM+DQorICAgIDwvRXhjbHVkZWRfUGFja2FnZXM+PExpbmtlcj48TGlua2VyIE5hbWU9IkxpYlByZWZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJTdWZmaXgiPjwvTGlua2VyPjxMaW5rZXIgTmFtZT0iTGliVmVyc2lvbiI+PC9MaW5rZXI+PC9MaW5rZXI+PFByb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJBdXRvU2hvd0RlcHMiPkZhbHNlPC9Qcm9qZWN0UHJvcGVydGllcz48UHJvamVjdFByb3BlcnRpZXMgTmFtZT0iTWFuYWdlUGF0aHMiPlRydWU8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJWZXJpZnlQYWNrYWdlcyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PC9Qcm9qZWN0UHJvcGVydGllcz48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9IkNvdW50Ij4zPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTEiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxpbmNsdWRlOy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTIiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXHNyYzsuLlxzcmM7Li5caW5jbHVkZTwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTAiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrPC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0wIj5OT19TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9IkNvdW50Ij4xPC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjxIaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplIE5hbWU9Ikl0ZW0wIj4zMjwvSGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZT48SGlzdG9yeUxpc3RzX2hsVExJQl9QYWdlU2l6ZSBOYW1lPSJJdGVtMSI+MTY8L0hpc3RvcnlMaXN0c19obFRMSUJfUGFnZVNpemU+PC9IaXN0b3J5TGlzdHNfaGxUTElCX1BhZ2VTaXplPjwvQ1BsdXNQbHVzQnVpbGRlci5QZXJzb25hbGl0eT48L0JvcmxhbmRQcm9qZWN0PjwvQm9ybGFuZFByb2plY3Q+DQorICA8L1Byb2plY3RFeHRlbnNpb25zPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxCb3JsYW5kLkNwcC5UYXJnZXRzIiAvPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENwcENvbXBpbGUgSW5jbHVkZT0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjA8L0J1aWxkT3JkZXI+DQorICAgIDwvQ3BwQ29tcGlsZT4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+DQorICAgICAgPEtleT5DZmdfMTwvS2V5Pg0KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4NCisgICAgICA8S2V5PkNmZ18yPC9LZXk+DQorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jb2RlZ2Vhci9ndGVzdF91bml0dGVzdC5jYnByb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWRiOGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29kZWdlYXIvZ3Rlc3RfdW5pdHRlc3QuY2Jwcm9qCkBAIC0wLDAgKzEsODggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPFByb2plY3RHdWlkPntlZWE2MzM5My01YWM1LTRiOWMtODkwOS1kNzVmZWYyZGFhNDF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+UmVsZWFzZTwvQ29uZmlnPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2UnIG9yICckKEJhc2UpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+DQorICAgIDxCYXNlPnRydWU8L0Jhc2U+DQorICAgIDxDZmdfMT50cnVlPC9DZmdfMT4NCisgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPg0KKyAgICA8QmFzZT50cnVlPC9CYXNlPg0KKyAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+DQorICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4NCisgICAgPE91dHB1dEV4dD5leGU8L091dHB1dEV4dD4NCisgICAgPEJDQ19PcHRpbWl6ZUZvclNwZWVkPnRydWU8L0JDQ19PcHRpbWl6ZUZvclNwZWVkPg0KKyAgICA8RGVmaW5lcz5OT19TVFJJQ1Q8L0RlZmluZXM+DQorICAgIDxEQ0NfQ0J1aWxkZXJPdXRwdXQ+SlBITkU8L0RDQ19DQnVpbGRlck91dHB1dD4NCisgICAgPER5bmFtaWNSVEw+dHJ1ZTwvRHluYW1pY1JUTD4NCisgICAgPElMSU5LX09iamVjdFNlYXJjaFBhdGg+Li5cdGVzdDwvSUxJTktfT2JqZWN0U2VhcmNoUGF0aD4NCisgICAgPFVzZVBhY2thZ2VzPnRydWU8L1VzZVBhY2thZ2VzPg0KKyAgICA8UHJvamVjdFR5cGU+Q3BwQ29uc29sZUFwcGxpY2F0aW9uPC9Qcm9qZWN0VHlwZT4NCisgICAgPE5vVkNMPnRydWU8L05vVkNMPg0KKyAgICA8QkNDX0NQUENvbXBpbGVBbHdheXM+dHJ1ZTwvQkNDX0NQUENvbXBpbGVBbHdheXM+DQorICAgIDxQYWNrYWdlSW1wb3J0cz5ydGwuYnBpO3ZjbC5icGk7YmNiaWUuYnBpO3ZjbHguYnBpO3ZjbGFjdG5iYW5kLmJwaTt4bWxydGwuYnBpO2JjYnNtcC5icGk7ZGJydGwuYnBpO3ZjbGRiLmJwaTtiZGVydGwuYnBpO3ZjbGRieC5icGk7ZHNuYXAuYnBpO2RzbmFwY29uLmJwaTt2Y2xpYi5icGk7aWJ4cHJlc3MuYnBpO2Fkb3J0bC5icGk7ZGJ4Y2RzLmJwaTtkYmV4cHJlc3MuYnBpO0RieENvbW1vbkRyaXZlci5icGk7d2Vic25hcC5icGk7dmNsaWUuYnBpO3dlYmRzbmFwLmJwaTtpbmV0LmJwaTtpbmV0ZGJiZGUuYnBpO2luZXRkYnhwcmVzcy5icGk7c29hcHJ0bC5icGk7UmF2ZTc1VkNMLmJwaTt0ZWVVSS5icGk7dGVlLmJwaTt0ZWVkYi5icGk7SW5keUNvcmUuYnBpO0luZHlTeXN0ZW0uYnBpO0luZHlQcm90b2NvbHMuYnBpO0ludHJhd2ViREJfOTBfMTAwLmJwaTtJbnRyYXdlYl85MF8xMDAuYnBpO0pjbC5icGk7SmNsVmNsLmJwaTtKdkNvcmVEMTFSLmJwaTtKdlN5c3RlbUQxMVIuYnBpO0p2U3RkQ3RybHNEMTFSLmJwaTtKdkFwcEZybUQxMVIuYnBpO0p2QmFuZHNEMTFSLmJwaTtKdkRCRDExUi5icGk7SnZEbGdzRDExUi5icGk7SnZCREVEMTFSLmJwaTtKdkNtcEQxMVIuYnBpO0p2Q3J5cHREMTFSLmJwaTtKdkN0cmxzRDExUi5icGk7SnZDdXN0b21EMTFSLmJwaTtKdkRvY2tpbmdEMTFSLmJwaTtKdkRvdE5ldEN0cmxzRDExUi5icGk7SnZFRElEMTFSLmJwaTtKdkdsb2J1c0QxMVIuYnBpO0p2SE1JRDExUi5icGk7SnZJbnRlcnByZXRlckQxMVIuYnBpO0p2SmFuc0QxMVIuYnBpO0p2TWFuYWdlZFRocmVhZHNEMTFSLmJwaTtKdk1NRDExUi5icGk7SnZOZXREMTFSLmJwaTtKdlBhZ2VDb21wc0QxMVIuYnBpO0p2UGx1Z2luRDExUi5icGk7SnZQcmludFByZXZpZXdEMTFSLmJwaTtKdlJ1bnRpbWVEZXNpZ25EMTFSLmJwaTtKdlRpbWVGcmFtZXdvcmtEMTFSLmJwaTtKdlZhbGlkYXRvcnNEMTFSLmJwaTtKdldpemFyZEQxMVIuYnBpO0p2WFBDdHJsc0QxMVIuYnBpO1ZjbFNtcC5icGk8L1BhY2thZ2VJbXBvcnRzPg0KKyAgICA8QkNDX3dwYXI+ZmFsc2U8L0JDQ193cGFyPg0KKyAgICA8SW5jbHVkZVBhdGg+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTsuLlx0ZXN0Oy4uPC9JbmNsdWRlUGF0aD4NCisgICAgPElMSU5LX0xpYnJhcnlQYXRoPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrOy4uXHRlc3Q8L0lMSU5LX0xpYnJhcnlQYXRoPg0KKyAgICA8TXVsdGl0aHJlYWRlZD50cnVlPC9NdWx0aXRocmVhZGVkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+DQorICAgIDxCQ0NfT3B0aW1pemVGb3JTcGVlZD5mYWxzZTwvQkNDX09wdGltaXplRm9yU3BlZWQ+DQorICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4NCisgICAgPERDQ19EZWJ1Z0luZm9JbkV4ZT50cnVlPC9EQ0NfRGVidWdJbmZvSW5FeGU+DQorICAgIDxEZWZpbmVzPl9ERUJVRzskKERlZmluZXMpPC9EZWZpbmVzPg0KKyAgICA8SUxJTktfRnVsbERlYnVnSW5mbz50cnVlPC9JTElOS19GdWxsRGVidWdJbmZvPg0KKyAgICA8QkNDX0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPmZhbHNlPC9CQ0NfSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgIDxJTElOS19EaXNhYmxlSW5jcmVtZW50YWxMaW5raW5nPnRydWU8L0lMSU5LX0Rpc2FibGVJbmNyZW1lbnRhbExpbmtpbmc+DQorICAgIDxCQ0NfVXNlUmVnaXN0ZXJWYXJpYWJsZXM+Tm9uZTwvQkNDX1VzZVJlZ2lzdGVyVmFyaWFibGVzPg0KKyAgICA8RENDX0RlZmluZT5ERUJVRzwvRENDX0RlZmluZT4NCisgICAgPEJDQ19EZWJ1Z0xpbmVOdW1iZXJzPnRydWU8L0JDQ19EZWJ1Z0xpbmVOdW1iZXJzPg0KKyAgICA8SW50ZXJtZWRpYXRlT3V0cHV0RGlyPkRlYnVnPC9JbnRlcm1lZGlhdGVPdXRwdXREaXI+DQorICAgIDxUQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz50cnVlPC9UQVNNX0Rpc3BsYXlTb3VyY2VMaW5lcz4NCisgICAgPEJDQ19TdGFja0ZyYW1lcz50cnVlPC9CQ0NfU3RhY2tGcmFtZXM+DQorICAgIDxCQ0NfRGlzYWJsZU9wdGltaXphdGlvbnM+dHJ1ZTwvQkNDX0Rpc2FibGVPcHRpbWl6YXRpb25zPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxkZWJ1ZzskKElMSU5LX0xpYnJhcnlQYXRoKTwvSUxJTktfTGlicmFyeVBhdGg+DQorICAgIDxUQVNNX0RlYnVnZ2luZz5GdWxsPC9UQVNNX0RlYnVnZ2luZz4NCisgICAgPEJDQ19Tb3VyY2VEZWJ1Z2dpbmdPbj50cnVlPC9CQ0NfU291cmNlRGVidWdnaW5nT24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4NCisgICAgPERlZmluZXM+TkRFQlVHOyQoRGVmaW5lcyk8L0RlZmluZXM+DQorICAgIDxJbnRlcm1lZGlhdGVPdXRwdXREaXI+UmVsZWFzZTwvSW50ZXJtZWRpYXRlT3V0cHV0RGlyPg0KKyAgICA8SUxJTktfTGlicmFyeVBhdGg+JChCRFMpXGxpYlxyZWxlYXNlOyQoSUxJTktfTGlicmFyeVBhdGgpPC9JTElOS19MaWJyYXJ5UGF0aD4NCisgICAgPFRBU01fRGVidWdnaW5nPk5vbmU8L1RBU01fRGVidWdnaW5nPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb2plY3RFeHRlbnNpb25zPg0KKyAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PC9Cb3JsYW5kLlBlcnNvbmFsaXR5Pg0KKyAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZT5DcHBDb25zb2xlQXBwbGljYXRpb248L0JvcmxhbmQuUHJvamVjdFR5cGU+DQorICAgIDxCb3JsYW5kUHJvamVjdD4NCis8Qm9ybGFuZFByb2plY3Q+PENQbHVzUGx1c0J1aWxkZXIuUGVyc29uYWxpdHk+PFZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+PFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPjxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+PC9WZXJzaW9uSW5mbz48VmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+PFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIj48L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPjwvVmVyc2lvbkluZm9LZXlzPjxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz48VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIj48L1ZlcnNpb25JbmZvS2V5cz48L1ZlcnNpb25JbmZvS2V5cz48RGVidWdnaW5nPjxEZWJ1Z2dpbmcgTmFtZT0iRGVidWdTb3VyY2VEaXJzIj48L0RlYnVnZ2luZz48L0RlYnVnZ2luZz48UGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSdW5QYXJhbXMiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMYXVuY2hlciI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlVzZUxhdW5jaGVyIj5GYWxzZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJEZWJ1Z0NXRCI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9Ikhvc3RBcHBsaWNhdGlvbiI+PC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IlJlbW90ZUhvc3QiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJSZW1vdGVQYXRoIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlUGFyYW1zIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlTGF1bmNoZXIiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJVc2VSZW1vdGVMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlQ1dEIj48L1BhcmFtZXRlcnM+PFBhcmFtZXRlcnMgTmFtZT0iUmVtb3RlRGVidWciPkZhbHNlPC9QYXJhbWV0ZXJzPjxQYXJhbWV0ZXJzIE5hbWU9IkRlYnVnIFN5bWJvbHMgU2VhcmNoIFBhdGgiPjwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz48UGFyYW1ldGVycyBOYW1lPSJMb2FkVW5zcGVjaWZpZWRTeW1ib2xzIj5GYWxzZTwvUGFyYW1ldGVycz48L1BhcmFtZXRlcnM+PEV4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICAgIA0KKyAgICAgIA0KKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZTJrMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgMjAwMCBTZXJ2ZXJzIFBhY2thZ2U8L0V4Y2x1ZGVkX1BhY2thZ2VzPg0KKyAgICAgIDxFeGNsdWRlZF9QYWNrYWdlcyBOYW1lPSIkKEJEUylcYmluXGJjYm9mZmljZXhwMTAwLmJwbCI+Q29kZUdlYXIgQysrQnVpbGRlciBPZmZpY2UgWFAgU2VydmVycyBQYWNrYWdlPC9FeGNsdWRlZF9QYWNrYWdlcz4NCisgICAgPC9FeGNsdWRlZF9QYWNrYWdlcz48TGlua2VyPjxMaW5rZXIgTmFtZT0iTGliUHJlZml4Ij48L0xpbmtlcj48TGlua2VyIE5hbWU9IkxpYlN1ZmZpeCI+PC9MaW5rZXI+PExpbmtlciBOYW1lPSJMaWJWZXJzaW9uIj48L0xpbmtlcj48L0xpbmtlcj48UHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IkF1dG9TaG93RGVwcyI+RmFsc2U8L1Byb2plY3RQcm9wZXJ0aWVzPjxQcm9qZWN0UHJvcGVydGllcyBOYW1lPSJNYW5hZ2VQYXRocyI+VHJ1ZTwvUHJvamVjdFByb3BlcnRpZXM+PFByb2plY3RQcm9wZXJ0aWVzIE5hbWU9IlZlcmlmeVBhY2thZ2VzIj5UcnVlPC9Qcm9qZWN0UHJvcGVydGllcz48L1Byb2plY3RQcm9wZXJ0aWVzPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iQ291bnQiPjM8L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGluY2x1ZGU7JChCRFMpXGluY2x1ZGVcZGlua3Vtd2FyZTskKEJEUylcaW5jbHVkZVx2Y2w7Li5caW5jbHVkZTsuLlx0ZXN0Oy4uPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48SGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGggTmFtZT0iSXRlbTEiPiQoQkRTKVxpbmNsdWRlOyQoQkRTKVxpbmNsdWRlXGRpbmt1bXdhcmU7JChCRFMpXGluY2x1ZGVcdmNsOy4uXGluY2x1ZGU7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSW5jbHVkZVBhdGg+PEhpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoIE5hbWU9Ikl0ZW0yIj4kKEJEUylcaW5jbHVkZTskKEJEUylcaW5jbHVkZVxkaW5rdW13YXJlOyQoQkRTKVxpbmNsdWRlXHZjbDsuLlxpbmNsdWRlPC9IaXN0b3J5TGlzdHNfaGxJbmNsdWRlUGF0aD48L0hpc3RvcnlMaXN0c19obEluY2x1ZGVQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iQ291bnQiPjE8L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aCBOYW1lPSJJdGVtMCI+JChCRFMpXGxpYjskKEJEUylcbGliXG9iajskKEJEUylcbGliXHBzZGs7Li5cdGVzdDwvSGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGg+PEhpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoIE5hbWU9Ikl0ZW0xIj4kKEJEUylcbGliOyQoQkRTKVxsaWJcb2JqOyQoQkRTKVxsaWJccHNkazsuLlx0ZXN0PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48SGlzdG9yeUxpc3RzX2hsSUxJTktfTGlicmFyeVBhdGggTmFtZT0iSXRlbTIiPiQoQkRTKVxsaWI7JChCRFMpXGxpYlxvYmo7JChCRFMpXGxpYlxwc2RrOyQoT1VUUFVURElSKTsuLlx0ZXN0PC9IaXN0b3J5TGlzdHNfaGxJTElOS19MaWJyYXJ5UGF0aD48L0hpc3RvcnlMaXN0c19obElMSU5LX0xpYnJhcnlQYXRoPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9IkNvdW50Ij4yPC9IaXN0b3J5TGlzdHNfaGxEZWZpbmVzPjxIaXN0b3J5TGlzdHNfaGxEZWZpbmVzIE5hbWU9Ikl0ZW0wIj5OT19TVFJJQ1Q8L0hpc3RvcnlMaXN0c19obERlZmluZXM+PEhpc3RvcnlMaXN0c19obERlZmluZXMgTmFtZT0iSXRlbTEiPlNUUklDVDwvSGlzdG9yeUxpc3RzX2hsRGVmaW5lcz48L0hpc3RvcnlMaXN0c19obERlZmluZXM+PC9DUGx1c1BsdXNCdWlsZGVyLlBlcnNvbmFsaXR5PjwvQm9ybGFuZFByb2plY3Q+PC9Cb3JsYW5kUHJvamVjdD4NCisgIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXEJvcmxhbmQuQ3BwLlRhcmdldHMiIC8+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q3BwQ29tcGlsZSBJbmNsdWRlPSIuLlx0ZXN0XGd0ZXN0X3VuaXR0ZXN0LmNjIj4NCisgICAgICA8QnVpbGRPcmRlcj4wPC9CdWlsZE9yZGVyPg0KKyAgICA8L0NwcENvbXBpbGU+DQorICAgIDxDcHBDb21waWxlIEluY2x1ZGU9Imd0ZXN0X2xpbmsuY2MiPg0KKyAgICAgIDxCdWlsZE9yZGVyPjE8L0J1aWxkT3JkZXI+DQorICAgIDwvQ3BwQ29tcGlsZT4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+DQorICAgICAgPEtleT5DZmdfMTwvS2V5Pg0KKyAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4NCisgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4NCisgICAgICA8S2V5PkNmZ18yPC9LZXk+DQorICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9jb25maWd1cmUuYWMgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTkyZTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsNjggQEAKK200X2luY2x1ZGUobTQvYWN4X3B0aHJlYWQubTQpCisKKyMgQXQgdGhpcyBwb2ludCwgdGhlIFhjb2RlIHByb2plY3QgYXNzdW1lcyB0aGUgdmVyc2lvbiBzdHJpbmcgd2lsbCBiZSB0aHJlZQorIyBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgc3Vycm91bmRlZCBieSBzcXVhcmUgYnJhY2tldHMgKGUuZy4KKyMgIlsxLjAuMV0iKS4gSXQgYWxzbyBhc3VtZXMgdGhhdCB0aGVyZSB3b24ndCBiZSBhbnkgY2xvc2luZyBwYXJlbnRoZXNpcworIyBiZXR3ZWVuICJBQ19JTklUKCIgYW5kIHRoZSBjbG9zaW5nICIpIiBpbmNsdWRpbmcgY29tbWVudHMgYW5kIHN0cmluZ3MuCitBQ19JTklUKFtHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrXSwKKyAgICAgICAgWzEuNy4wXSwKKyAgICAgICAgW2dvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbV0sCisgICAgICAgIFtndGVzdF0pCisKKyMgUHJvdmlkZSB2YXJpb3VzIG9wdGlvbnMgdG8gaW5pdGlhbGl6ZSB0aGUgQXV0b2NvbmYgYW5kIGNvbmZpZ3VyZSBwcm9jZXNzZXMuCitBQ19QUkVSRVEoWzIuNTldKQorQUNfQ09ORklHX1NSQ0RJUihbLi9MSUNFTlNFXSkKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKK0FDX0NPTkZJR19BVVhfRElSKFtidWlsZC1hdXhdKQorQUNfQ09ORklHX0hFQURFUlMoW2J1aWxkLWF1eC9jb25maWcuaF0pCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKK0FDX0NPTkZJR19GSUxFUyhbc2NyaXB0cy9ndGVzdC1jb25maWddLCBbY2htb2QgK3ggc2NyaXB0cy9ndGVzdC1jb25maWddKQorCisjIEluaXRpYWxpemUgQXV0b21ha2Ugd2l0aCB2YXJpb3VzIG9wdGlvbnMuIFdlIHJlcXVpcmUgYXQgbGVhc3QgdjEuOSwgcHJldmVudAorIyBwZWRhbnRpYyBjb21wbGFpbnRzIGFib3V0IHBhY2thZ2UgZmlsZXMsIGFuZCBlbmFibGUgdmFyaW91cyBkaXN0cmlidXRpb24KKyMgdGFyZ2V0cy4KK0FNX0lOSVRfQVVUT01BS0UoWzEuOSBkaXN0LWJ6aXAyIGRpc3QtemlwIGZvcmVpZ24gc3ViZGlyLW9iamVjdHNdKQorCisjIENoZWNrIGZvciBwcm9ncmFtcyB1c2VkIGluIGJ1aWxkaW5nIEdvb2dsZSBUZXN0LgorQUNfUFJPR19DQworQUNfUFJPR19DWFgKK0FDX0xBTkcoW0MrK10pCitBQ19QUk9HX0xJQlRPT0wKKworIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKTogQ3VycmVudGx5IHdlIGFyZW4ndCBydW5uaW5nIHRoZSBQeXRob24gdGVzdHMKKyMgYWdhaW5zdCB0aGUgaW50ZXJwcmV0ZXIgZGV0ZWN0ZWQgYnkgQU1fUEFUSF9QWVRIT04sIGFuZCBzbyB3ZSBjb25kaXRpb24KKyMgSEFWRV9QWVRIT04gYnkgcmVxdWlyaW5nICJweXRob24iIHRvIGJlIGluIHRoZSBQQVRILCBhbmQgdGhhdCBpbnRlcnByZXRlcidzCisjIHZlcnNpb24gdG8gYmUgPj0gMi4zLiBUaGlzIHdpbGwgYWxsb3cgdGhlIHNjcmlwdHMgdG8gdXNlIGEgIi91c3IvYmluL2VudiIKKyMgaGFzaGJhbmcuCitQWVRIT049ICAjIFdlICpkbyBub3QqIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBweXRob24gaW50ZXJwcmV0ZXIKK0FDX1BBVEhfUFJPRyhbUFlUSE9OXSxbcHl0aG9uXSxbOl0pCitBU19JRihbdGVzdCAiJFBZVEhPTiIgIT0gIjoiXSwKKyAgICAgIFtBTV9QWVRIT05fQ0hFQ0tfVkVSU0lPTihbJFBZVEhPTl0sWzIuM10sWzpdLFtQWVRIT049IjoiXSldKQorQU1fQ09ORElUSU9OQUwoW0hBVkVfUFlUSE9OXSxbdGVzdCAiJFBZVEhPTiIgIT0gIjoiXSkKKworIyBDb25maWd1cmUgcHRocmVhZHMuCitBQ19BUkdfV0lUSChbcHRocmVhZHNdLAorICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtcHRocmVhZHNdLAorICAgICAgICAgICAgICAgW3VzZSBwdGhyZWFkcyAoZGVmYXVsdCBpcyB5ZXMpXSldLAorICAgICAgICAgICAgW3dpdGhfcHRocmVhZHM9JHdpdGh2YWxdLAorICAgICAgICAgICAgW3dpdGhfcHRocmVhZHM9Y2hlY2tdKQorCitoYXZlX3B0aHJlYWRzPW5vCitBU19JRihbdGVzdCAieCR3aXRoX3B0aHJlYWRzIiAhPSAieG5vIl0sCisgICAgICBbQUNYX1BUSFJFQUQoCisgICAgICAgIFtdLAorICAgICAgICBbQVNfSUYoW3Rlc3QgIngkd2l0aF9wdGhyZWFkcyIgIT0gInhjaGVjayJdLAorICAgICAgICAgICAgICAgW0FDX01TR19GQUlMVVJFKAorICAgICAgICAgICAgICAgICBbLS13aXRoLXB0aHJlYWRzIHdhcyBzcGVjaWZpZWQsIGJ1dCB1bmFibGUgdG8gYmUgdXNlZF0pXSldKQorICAgICAgIGhhdmVfcHRocmVhZHM9IiRhY3hfcHRocmVhZF9vayJdKQorQU1fQ09ORElUSU9OQUwoW0hBVkVfUFRIUkVBRFNdLFt0ZXN0ICJ4JGhhdmVfcHRocmVhZHMiID0gInh5ZXMiXSkKK0FDX1NVQlNUKFBUSFJFQURfQ0ZMQUdTKQorQUNfU1VCU1QoUFRIUkVBRF9MSUJTKQorCisjIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pIENoZWNrIGZvciB0aGUgbmVjZXNzYXJ5IHN5c3RlbSBoZWFkZXJzLgorCisjIFRPRE8oY2hhbmRsZXJjQGdvb2dsZS5jb20pIENoZWNrIHRoZSB0eXBlcywgc3RydWN0dXJlcywgYW5kIG90aGVyIGNvbXBpbGVyCisjIGFuZCBhcmNoaXRlY3R1cmUgY2hhcmFjdGVyaXN0aWNzLgorCisjIE91dHB1dCB0aGUgZ2VuZXJhdGVkIGZpbGVzLiBObyBmdXJ0aGVyIGF1dG9jb25mIG1hY3JvcyBtYXkgYmUgdXNlZC4KK0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvQWR2YW5jZWRHdWlkZS5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL0FkdmFuY2VkR3VpZGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2ZWZjMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL0FkdmFuY2VkR3VpZGUubWQKQEAgLTAsMCArMSwyMTgzIEBACisKKworTm93IHRoYXQgeW91IGhhdmUgcmVhZCBbUHJpbWVyXShQcmltZXIubWQpIGFuZCBsZWFybmVkIGhvdyB0byB3cml0ZSB0ZXN0cwordXNpbmcgR29vZ2xlIFRlc3QsIGl0J3MgdGltZSB0byBsZWFybiBzb21lIG5ldyB0cmlja3MuIFRoaXMgZG9jdW1lbnQKK3dpbGwgc2hvdyB5b3UgbW9yZSBhc3NlcnRpb25zIGFzIHdlbGwgYXMgaG93IHRvIGNvbnN0cnVjdCBjb21wbGV4CitmYWlsdXJlIG1lc3NhZ2VzLCBwcm9wYWdhdGUgZmF0YWwgZmFpbHVyZXMsIHJldXNlIGFuZCBzcGVlZCB1cCB5b3VyCit0ZXN0IGZpeHR1cmVzLCBhbmQgdXNlIHZhcmlvdXMgZmxhZ3Mgd2l0aCB5b3VyIHRlc3RzLgorCisjIE1vcmUgQXNzZXJ0aW9ucyAjCisKK1RoaXMgc2VjdGlvbiBjb3ZlcnMgc29tZSBsZXNzIGZyZXF1ZW50bHkgdXNlZCwgYnV0IHN0aWxsIHNpZ25pZmljYW50LAorYXNzZXJ0aW9ucy4KKworIyMgRXhwbGljaXQgU3VjY2VzcyBhbmQgRmFpbHVyZSAjIworCitUaGVzZSB0aHJlZSBhc3NlcnRpb25zIGRvIG5vdCBhY3R1YWxseSB0ZXN0IGEgdmFsdWUgb3IgZXhwcmVzc2lvbi4gSW5zdGVhZCwKK3RoZXkgZ2VuZXJhdGUgYSBzdWNjZXNzIG9yIGZhaWx1cmUgZGlyZWN0bHkuIExpa2UgdGhlIG1hY3JvcyB0aGF0IGFjdHVhbGx5CitwZXJmb3JtIGEgdGVzdCwgeW91IG1heSBzdHJlYW0gYSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlIGludG8gdGhlIHRoZW0uCisKK3wgYFNVQ0NFRUQoKTtgIHwKK3w6LS0tLS0tLS0tLS0tLXwKKworR2VuZXJhdGVzIGEgc3VjY2Vzcy4gVGhpcyBkb2VzIE5PVCBtYWtlIHRoZSBvdmVyYWxsIHRlc3Qgc3VjY2VlZC4gQSB0ZXN0IGlzCitjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgb25seSBpZiBub25lIG9mIGl0cyBhc3NlcnRpb25zIGZhaWwgZHVyaW5nIGl0cyBleGVjdXRpb24uCisKK05vdGU6IGBTVUNDRUVEKClgIGlzIHB1cmVseSBkb2N1bWVudGFyeSBhbmQgY3VycmVudGx5IGRvZXNuJ3QgZ2VuZXJhdGUgYW55Cit1c2VyLXZpc2libGUgb3V0cHV0LiBIb3dldmVyLCB3ZSBtYXkgYWRkIGBTVUNDRUVEKClgIG1lc3NhZ2VzIHRvIEdvb2dsZSBUZXN0J3MKK291dHB1dCBpbiB0aGUgZnV0dXJlLgorCit8IGBGQUlMKCk7YCAgfCBgQUREX0ZBSUxVUkUoKTtgIHwgYEFERF9GQUlMVVJFX0FUKCJgX2ZpbGVcX3BhdGhfYCIsIGBfbGluZVxfbnVtYmVyX2ApO2AgfAorfDotLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworYEZBSUwoKWAgZ2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSwgd2hpbGUgYEFERF9GQUlMVVJFKClgIGFuZCBgQUREX0ZBSUxVUkVfQVQoKWAgZ2VuZXJhdGUgYSBub25mYXRhbAorZmFpbHVyZS4gVGhlc2UgYXJlIHVzZWZ1bCB3aGVuIGNvbnRyb2wgZmxvdywgcmF0aGVyIHRoYW4gYSBCb29sZWFuIGV4cHJlc3Npb24sCitkZXRlcmVtaW5lcyB0aGUgdGVzdCdzIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIHdyaXRlCitzb21ldGhpbmcgbGlrZToKKworYGBgCitzd2l0Y2goZXhwcmVzc2lvbikgeworICBjYXNlIDE6IC4uLiBzb21lIGNoZWNrcyAuLi4KKyAgY2FzZSAyOiAuLi4gc29tZSBvdGhlciBjaGVja3MKKyAgLi4uCisgIGRlZmF1bHQ6IEZBSUwoKSA8PCAiV2Ugc2hvdWxkbid0IGdldCBoZXJlLiI7Cit9CitgYGAKKworTm90ZTogeW91IGNhbiBvbmx5IHVzZSBgRkFJTCgpYCBpbiBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYHZvaWRgLiBTZWUgdGhlIFtBc3NlcnRpb24gUGxhY2VtZW50IHNlY3Rpb25dKCNBc3NlcnRpb25fUGxhY2VtZW50Lm1kKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIEV4Y2VwdGlvbiBBc3NlcnRpb25zICMjCisKK1RoZXNlIGFyZSBmb3IgdmVyaWZ5aW5nIHRoYXQgYSBwaWVjZSBvZiBjb2RlIHRocm93cyAob3IgZG9lcyBub3QKK3Rocm93KSBhbiBleGNlcHRpb24gb2YgdGhlIGdpdmVuIHR5cGU6CisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfVEhST1coYF9zdGF0ZW1lbnRfLCBfZXhjZXB0aW9uXF90eXBlX2ApO2AgIHwgYEVYUEVDVF9USFJPVyhgX3N0YXRlbWVudF8sIF9leGNlcHRpb25cX3R5cGVfYCk7YCAgfCBfc3RhdGVtZW50XyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHRoZSBnaXZlbiB0eXBlICB8Cit8IGBBU1NFUlRfQU5ZX1RIUk9XKGBfc3RhdGVtZW50X2ApO2AgICAgICAgICAgICAgICAgfCBgRVhQRUNUX0FOWV9USFJPVyhgX3N0YXRlbWVudF9gKTtgICAgICAgICAgICAgICAgIHwgX3N0YXRlbWVudF8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiBhbnkgdHlwZSAgICAgICAgfAorfCBgQVNTRVJUX05PX1RIUk9XKGBfc3RhdGVtZW50X2ApO2AgICAgICAgICAgICAgICAgIHwgYEVYUEVDVF9OT19USFJPVyhgX3N0YXRlbWVudF9gKTtgICAgICAgICAgICAgICAgICB8IF9zdGF0ZW1lbnRfIGRvZXNuJ3QgdGhyb3cgYW55IGV4Y2VwdGlvbiAgICAgICAgICAgIHwKKworRXhhbXBsZXM6CisKK2BgYAorQVNTRVJUX1RIUk9XKEZvbyg1KSwgYmFyX2V4Y2VwdGlvbik7CisKK0VYUEVDVF9OT19USFJPVyh7CisgIGludCBuID0gNTsKKyAgQmFyKCZuKTsKK30pOworYGBgCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2ZXJzaW9uIDEuMS4wLgorCisjIyBQcmVkaWNhdGUgQXNzZXJ0aW9ucyBmb3IgQmV0dGVyIEVycm9yIE1lc3NhZ2VzICMjCisKK0V2ZW4gdGhvdWdoIEdvb2dsZSBUZXN0IGhhcyBhIHJpY2ggc2V0IG9mIGFzc2VydGlvbnMsIHRoZXkgY2FuIG5ldmVyIGJlCitjb21wbGV0ZSwgYXMgaXQncyBpbXBvc3NpYmxlIChub3IgYSBnb29kIGlkZWEpIHRvIGFudGljaXBhdGUgYWxsIHRoZSBzY2VuYXJpb3MKK2EgdXNlciBtaWdodCBydW4gaW50by4gVGhlcmVmb3JlLCBzb21ldGltZXMgYSB1c2VyIGhhcyB0byB1c2UgYEVYUEVDVF9UUlVFKClgCit0byBjaGVjayBhIGNvbXBsZXggZXhwcmVzc2lvbiwgZm9yIGxhY2sgb2YgYSBiZXR0ZXIgbWFjcm8uIFRoaXMgaGFzIHRoZSBwcm9ibGVtCitvZiBub3Qgc2hvd2luZyB5b3UgdGhlIHZhbHVlcyBvZiB0aGUgcGFydHMgb2YgdGhlIGV4cHJlc3Npb24sIG1ha2luZyBpdCBoYXJkIHRvCit1bmRlcnN0YW5kIHdoYXQgd2VudCB3cm9uZy4gQXMgYSB3b3JrYXJvdW5kLCBzb21lIHVzZXJzIGNob29zZSB0byBjb25zdHJ1Y3QgdGhlCitmYWlsdXJlIG1lc3NhZ2UgYnkgdGhlbXNlbHZlcywgc3RyZWFtaW5nIGl0IGludG8gYEVYUEVDVF9UUlVFKClgLiBIb3dldmVyLCB0aGlzCitpcyBhd2t3YXJkIGVzcGVjaWFsbHkgd2hlbiB0aGUgZXhwcmVzc2lvbiBoYXMgc2lkZS1lZmZlY3RzIG9yIGlzIGV4cGVuc2l2ZSB0bworZXZhbHVhdGUuCisKK0dvb2dsZSBUZXN0IGdpdmVzIHlvdSB0aHJlZSBkaWZmZXJlbnQgb3B0aW9ucyB0byBzb2x2ZSB0aGlzIHByb2JsZW06CisKKyMjIyBVc2luZyBhbiBFeGlzdGluZyBCb29sZWFuIEZ1bmN0aW9uICMjIworCitJZiB5b3UgYWxyZWFkeSBoYXZlIGEgZnVuY3Rpb24gb3IgYSBmdW5jdG9yIHRoYXQgcmV0dXJucyBgYm9vbGAgKG9yIGEgdHlwZQordGhhdCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYGJvb2xgKSwgeW91IGNhbiB1c2UgaXQgaW4gYSBfcHJlZGljYXRlCithc3NlcnRpb25fIHRvIGdldCB0aGUgZnVuY3Rpb24gYXJndW1lbnRzIHByaW50ZWQgZm9yIGZyZWU6CisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfUFJFRDEoYF9wcmVkMSwgdmFsMV9gKTtgICAgICAgIHwgYEVYUEVDVF9QUkVEMShgX3ByZWQxLCB2YWwxX2ApO2AgfCBfcHJlZDEodmFsMSlfIHJldHVybnMgdHJ1ZSB8Cit8IGBBU1NFUlRfUFJFRDIoYF9wcmVkMiwgdmFsMSwgdmFsMl9gKTtgIHwgYEVYUEVDVF9QUkVEMihgX3ByZWQyLCB2YWwxLCB2YWwyX2ApO2AgfCAgX3ByZWQyKHZhbDEsIHZhbDIpXyByZXR1cm5zIHRydWUgfAorfCAgLi4uICAgICAgICAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICB8IC4uLiAgICAgICAgICB8CisKK0luIHRoZSBhYm92ZSwgX3ByZWRuXyBpcyBhbiBfbl8tYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbiBvciBmdW5jdG9yLCB3aGVyZQorX3ZhbDFfLCBfdmFsMl8sIC4uLiwgYW5kIF92YWxuXyBhcmUgaXRzIGFyZ3VtZW50cy4gVGhlIGFzc2VydGlvbiBzdWNjZWVkcworaWYgdGhlIHByZWRpY2F0ZSByZXR1cm5zIGB0cnVlYCB3aGVuIGFwcGxpZWQgdG8gdGhlIGdpdmVuIGFyZ3VtZW50cywgYW5kIGZhaWxzCitvdGhlcndpc2UuIFdoZW4gdGhlIGFzc2VydGlvbiBmYWlscywgaXQgcHJpbnRzIHRoZSB2YWx1ZSBvZiBlYWNoIGFyZ3VtZW50LiBJbgorZWl0aGVyIGNhc2UsIHRoZSBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuCisKK0hlcmUncyBhbiBleGFtcGxlLiBHaXZlbgorCitgYGAKKy8vIFJldHVybnMgdHJ1ZSBpZmYgbSBhbmQgbiBoYXZlIG5vIGNvbW1vbiBkaXZpc29ycyBleGNlcHQgMS4KK2Jvb2wgTXV0dWFsbHlQcmltZShpbnQgbSwgaW50IG4pIHsgLi4uIH0KK2NvbnN0IGludCBhID0gMzsKK2NvbnN0IGludCBiID0gNDsKK2NvbnN0IGludCBjID0gMTA7CitgYGAKKwordGhlIGFzc2VydGlvbiBgRVhQRUNUX1BSRUQyKE11dHVhbGx5UHJpbWUsIGEsIGIpO2Agd2lsbCBzdWNjZWVkLCB3aGlsZSB0aGUKK2Fzc2VydGlvbiBgRVhQRUNUX1BSRUQyKE11dHVhbGx5UHJpbWUsIGIsIGMpO2Agd2lsbCBmYWlsIHdpdGggdGhlIG1lc3NhZ2UKKworPHByZT4KKyFNdXR1YWxseVByaW1lKGIsIGMpIGlzIGZhbHNlLCB3aGVyZTxicj4KK2IgaXMgNDxicj4KK2MgaXMgMTA8YnI+Cis8L3ByZT4KKworKipOb3RlczoqKgorCisgIDEuIElmIHlvdSBzZWUgYSBjb21waWxlciBlcnJvciAibm8gbWF0Y2hpbmcgZnVuY3Rpb24gdG8gY2FsbCIgd2hlbiB1c2luZyBgQVNTRVJUX1BSRUQqYCBvciBgRVhQRUNUX1BSRUQqYCwgcGxlYXNlIHNlZSBbdGhpc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9GQVEjVGhlX2NvbXBpbGVyX2NvbXBsYWluc18lMjJub19tYXRjaGluZ19mdW5jdGlvbl90b19jYWxsJTIyKSBmb3IgaG93IHRvIHJlc29sdmUgaXQuCisgIDEuIEN1cnJlbnRseSB3ZSBvbmx5IHByb3ZpZGUgcHJlZGljYXRlIGFzc2VydGlvbnMgb2YgYXJpdHkgPD0gNS4gSWYgeW91IG5lZWQgYSBoaWdoZXItYXJpdHkgYXNzZXJ0aW9uLCBsZXQgdXMga25vdy4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMKKworIyMjIFVzaW5nIGEgRnVuY3Rpb24gVGhhdCBSZXR1cm5zIGFuIEFzc2VydGlvblJlc3VsdCAjIyMKKworV2hpbGUgYEVYUEVDVF9QUkVEKigpYCBhbmQgZnJpZW5kcyBhcmUgaGFuZHkgZm9yIGEgcXVpY2sgam9iLCB0aGUKK3N5bnRheCBpcyBub3Qgc2F0aXNmYWN0b3J5OiB5b3UgaGF2ZSB0byB1c2UgZGlmZmVyZW50IG1hY3JvcyBmb3IKK2RpZmZlcmVudCBhcml0aWVzLCBhbmQgaXQgZmVlbHMgbW9yZSBsaWtlIExpc3AgdGhhbiBDKysuICBUaGUKK2A6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdGAgY2xhc3Mgc29sdmVzIHRoaXMgcHJvYmxlbS4KKworQW4gYEFzc2VydGlvblJlc3VsdGAgb2JqZWN0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhbiBhc3NlcnRpb24KKyh3aGV0aGVyIGl0J3MgYSBzdWNjZXNzIG9yIGEgZmFpbHVyZSwgYW5kIGFuIGFzc29jaWF0ZWQgbWVzc2FnZSkuICBZb3UKK2NhbiBjcmVhdGUgYW4gYEFzc2VydGlvblJlc3VsdGAgdXNpbmcgb25lIG9mIHRoZXNlIGZhY3RvcnkKK2Z1bmN0aW9uczoKKworYGBgCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFJldHVybnMgYW4gQXNzZXJ0aW9uUmVzdWx0IG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGFuIGFzc2VydGlvbiBoYXMKKy8vIHN1Y2NlZWRlZC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCk7CisKKy8vIFJldHVybnMgYW4gQXNzZXJ0aW9uUmVzdWx0IG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGFuIGFzc2VydGlvbiBoYXMKKy8vIGZhaWxlZC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCk7CisKK30KK2BgYAorCitZb3UgY2FuIHRoZW4gdXNlIHRoZSBgPDxgIG9wZXJhdG9yIHRvIHN0cmVhbSBtZXNzYWdlcyB0byB0aGUKK2BBc3NlcnRpb25SZXN1bHRgIG9iamVjdC4KKworVG8gcHJvdmlkZSBtb3JlIHJlYWRhYmxlIG1lc3NhZ2VzIGluIEJvb2xlYW4gYXNzZXJ0aW9ucworKGUuZy4gYEVYUEVDVF9UUlVFKClgKSwgd3JpdGUgYSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zCitgQXNzZXJ0aW9uUmVzdWx0YCBpbnN0ZWFkIG9mIGBib29sYC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUKK2BJc0V2ZW4oKWAgYXM6CisKK2BgYAorOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7CisgIGlmICgobiAlIDIpID09IDApCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworICBlbHNlCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworfQorYGBgCisKK2luc3RlYWQgb2Y6CisKK2BgYAorYm9vbCBJc0V2ZW4oaW50IG4pIHsKKyAgcmV0dXJuIChuICUgMikgPT0gMDsKK30KK2BgYAorCit0aGUgZmFpbGVkIGFzc2VydGlvbiBgRVhQRUNUX1RSVUUoSXNFdmVuKEZpYig0KSkpYCB3aWxsIHByaW50OgorCis8cHJlPgorVmFsdWUgb2Y6IElzRXZlbihGaWIoNCkpPGJyPgorQWN0dWFsOiBmYWxzZSAoKjMgaXMgb2RkKik8YnI+CitFeHBlY3RlZDogdHJ1ZTxicj4KKzwvcHJlPgorCitpbnN0ZWFkIG9mIGEgbW9yZSBvcGFxdWUKKworPHByZT4KK1ZhbHVlIG9mOiBJc0V2ZW4oRmliKDQpKTxicj4KK0FjdHVhbDogZmFsc2U8YnI+CitFeHBlY3RlZDogdHJ1ZTxicj4KKzwvcHJlPgorCitJZiB5b3Ugd2FudCBpbmZvcm1hdGl2ZSBtZXNzYWdlcyBpbiBgRVhQRUNUX0ZBTFNFYCBhbmQgYEFTU0VSVF9GQUxTRWAKK2FzIHdlbGwsIGFuZCBhcmUgZmluZSB3aXRoIG1ha2luZyB0aGUgcHJlZGljYXRlIHNsb3dlciBpbiB0aGUgc3VjY2VzcworY2FzZSwgeW91IGNhbiBzdXBwbHkgYSBzdWNjZXNzIG1lc3NhZ2U6CisKK2BgYAorOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7CisgIGlmICgobiAlIDIpID09IDApCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpIDw8IG4gPDwgIiBpcyBldmVuIjsKKyAgZWxzZQorICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKK30KK2BgYAorCitUaGVuIHRoZSBzdGF0ZW1lbnQgYEVYUEVDVF9GQUxTRShJc0V2ZW4oRmliKDYpKSlgIHdpbGwgcHJpbnQKKworPHByZT4KK1ZhbHVlIG9mOiBJc0V2ZW4oRmliKDYpKTxicj4KK0FjdHVhbDogdHJ1ZSAoOCBpcyBldmVuKTxicj4KK0V4cGVjdGVkOiBmYWxzZTxicj4KKzwvcHJlPgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjQuMS4KKworIyMjIFVzaW5nIGEgUHJlZGljYXRlLUZvcm1hdHRlciAjIyMKKworSWYgeW91IGZpbmQgdGhlIGRlZmF1bHQgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgYChBU1NFUlR8RVhQRUNUKV9QUkVEKmAgYW5kCitgKEFTU0VSVHxFWFBFQ1QpXyhUUlVFfEZBTFNFKWAgdW5zYXRpc2ZhY3RvcnksIG9yIHNvbWUgYXJndW1lbnRzIHRvIHlvdXIKK3ByZWRpY2F0ZSBkbyBub3Qgc3VwcG9ydCBzdHJlYW1pbmcgdG8gYG9zdHJlYW1gLCB5b3UgY2FuIGluc3RlYWQgdXNlIHRoZQorZm9sbG93aW5nIF9wcmVkaWNhdGUtZm9ybWF0dGVyIGFzc2VydGlvbnNfIHRvIF9mdWxseV8gY3VzdG9taXplIGhvdyB0aGUKK21lc3NhZ2UgaXMgZm9ybWF0dGVkOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX1BSRURfRk9STUFUMShgX3ByZWRcX2Zvcm1hdDEsIHZhbDFfYCk7YCAgICAgICAgfCBgRVhQRUNUX1BSRURfRk9STUFUMShgX3ByZWRcX2Zvcm1hdDEsIHZhbDFfYCk7IHwgX3ByZWRcX2Zvcm1hdDEodmFsMSlfIGlzIHN1Y2Nlc3NmdWwgfAorfCBgQVNTRVJUX1BSRURfRk9STUFUMihgX3ByZWRcX2Zvcm1hdDIsIHZhbDEsIHZhbDJfYCk7YCB8IGBFWFBFQ1RfUFJFRF9GT1JNQVQyKGBfcHJlZFxfZm9ybWF0MiwgdmFsMSwgdmFsMl9gKTtgIHwgX3ByZWRcX2Zvcm1hdDIodmFsMSwgdmFsMilfIGlzIHN1Y2Nlc3NmdWwgfAorfCBgLi4uYCAgICAgICAgICAgICAgIHwgYC4uLmAgICAgICAgICAgICAgICAgICB8IGAuLi5gICAgICAgICB8CisKK1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgdGhlIHByZXZpb3VzIHR3byBncm91cHMgb2YgbWFjcm9zIGlzIHRoYXQgaW5zdGVhZCBvZgorYSBwcmVkaWNhdGUsIGAoQVNTRVJUfEVYUEVDVClfUFJFRF9GT1JNQVQqYCB0YWtlIGEgX3ByZWRpY2F0ZS1mb3JtYXR0ZXJfCisoX3ByZWRcX2Zvcm1hdG5fKSwgd2hpY2ggaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHdpdGggdGhlIHNpZ25hdHVyZToKKworYDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRpY2F0ZUZvcm1hdHRlcm4oY29uc3QgY2hhciogYF9leHByMV9gLCBjb25zdCBjaGFyKiBgX2V4cHIyX2AsIC4uLiBjb25zdCBjaGFyKiBgX2V4cHJuX2AsIFQxIGBfdmFsMV9gLCBUMiBgX3ZhbDJfYCwgLi4uIFRuIGBfdmFsbl9gKTtgCisKK3doZXJlIF92YWwxXywgX3ZhbDJfLCAuLi4sIGFuZCBfdmFsbl8gYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIHByZWRpY2F0ZQorYXJndW1lbnRzLCBhbmQgX2V4cHIxXywgX2V4cHIyXywgLi4uLCBhbmQgX2V4cHJuXyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcKK2V4cHJlc3Npb25zIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgY29kZS4gVGhlIHR5cGVzIGBUMWAsIGBUMmAsIC4uLiwgYW5kCitgVG5gIGNhbiBiZSBlaXRoZXIgdmFsdWUgdHlwZXMgb3IgcmVmZXJlbmNlIHR5cGVzLiBGb3IgZXhhbXBsZSwgaWYgYW4KK2FyZ3VtZW50IGhhcyB0eXBlIGBGb29gLCB5b3UgY2FuIGRlY2xhcmUgaXQgYXMgZWl0aGVyIGBGb29gIG9yIGBjb25zdCBGb28mYCwKK3doaWNoZXZlciBpcyBhcHByb3ByaWF0ZS4KKworQSBwcmVkaWNhdGUtZm9ybWF0dGVyIHJldHVybnMgYSBgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHRgIG9iamVjdCB0byBpbmRpY2F0ZQord2hldGhlciB0aGUgYXNzZXJ0aW9uIGhhcyBzdWNjZWVkZWQgb3Igbm90LiBUaGUgb25seSB3YXkgdG8gY3JlYXRlIHN1Y2ggYW4KK29iamVjdCBpcyB0byBjYWxsIG9uZSBvZiB0aGVzZSBmYWN0b3J5IGZ1bmN0aW9uczoKKworQXMgYW4gZXhhbXBsZSwgbGV0J3MgaW1wcm92ZSB0aGUgZmFpbHVyZSBtZXNzYWdlIGluIHRoZSBwcmV2aW91cyBleGFtcGxlLCB3aGljaCB1c2VzIGBFWFBFQ1RfUFJFRDIoKWA6CisKK2BgYAorLy8gUmV0dXJucyB0aGUgc21hbGxlc3QgcHJpbWUgY29tbW9uIGRpdmlzb3Igb2YgbSBhbmQgbiwKKy8vIG9yIDEgd2hlbiBtIGFuZCBuIGFyZSBtdXR1YWxseSBwcmltZS4KK2ludCBTbWFsbGVzdFByaW1lQ29tbW9uRGl2aXNvcihpbnQgbSwgaW50IG4pIHsgLi4uIH0KKworLy8gQSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZvciBhc3NlcnRpbmcgdGhhdCB0d28gaW50ZWdlcnMgYXJlIG11dHVhbGx5IHByaW1lLgorOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgQXNzZXJ0TXV0dWFsbHlQcmltZShjb25zdCBjaGFyKiBtX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5fZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKSB7CisgIGlmIChNdXR1YWxseVByaW1lKG0sIG4pKQorICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKyAKKyAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBtX2V4cHIgPDwgIiBhbmQgIiA8PCBuX2V4cHIgPDwgIiAoIiA8PCBtIDw8ICIgYW5kICIgPDwgbgorICAgICAgPDwgIikgYXJlIG5vdCBtdXR1YWxseSBwcmltZSwgIiA8PCAiYXMgdGhleSBoYXZlIGEgY29tbW9uIGRpdmlzb3IgIgorICAgICAgPDwgU21hbGxlc3RQcmltZUNvbW1vbkRpdmlzb3IobSwgbik7Cit9CitgYGAKKworV2l0aCB0aGlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIsIHdlIGNhbiB1c2UKKworYGBgCitFWFBFQ1RfUFJFRF9GT1JNQVQyKEFzc2VydE11dHVhbGx5UHJpbWUsIGIsIGMpOworYGBgCisKK3RvIGdlbmVyYXRlIHRoZSBtZXNzYWdlCisKKzxwcmU+CitiIGFuZCBjICg0IGFuZCAxMCkgYXJlIG5vdCBtdXR1YWxseSBwcmltZSwgYXMgdGhleSBoYXZlIGEgY29tbW9uIGRpdmlzb3IgMi48YnI+Cis8L3ByZT4KKworQXMgeW91IG1heSBoYXZlIHJlYWxpemVkLCBtYW55IG9mIHRoZSBhc3NlcnRpb25zIHdlIGludHJvZHVjZWQgZWFybGllciBhcmUKK3NwZWNpYWwgY2FzZXMgb2YgYChFWFBFQ1R8QVNTRVJUKV9QUkVEX0ZPUk1BVCpgLiBJbiBmYWN0LCBtb3N0IG9mIHRoZW0gYXJlCitpbmRlZWQgZGVmaW5lZCB1c2luZyBgKEVYUEVDVHxBU1NFUlQpX1BSRURfRk9STUFUKmAuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisKKyMjIEZsb2F0aW5nLVBvaW50IENvbXBhcmlzb24gIyMKKworQ29tcGFyaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgaXMgdHJpY2t5LiBEdWUgdG8gcm91bmQtb2ZmIGVycm9ycywgaXQgaXMKK3ZlcnkgdW5saWtlbHkgdGhhdCB0d28gZmxvYXRpbmctcG9pbnRzIHdpbGwgbWF0Y2ggZXhhY3RseS4gVGhlcmVmb3JlLAorYEFTU0VSVF9FUWAgJ3MgbmFpdmUgY29tcGFyaXNvbiB1c3VhbGx5IGRvZXNuJ3Qgd29yay4gQW5kIHNpbmNlIGZsb2F0aW5nLXBvaW50cworY2FuIGhhdmUgYSB3aWRlIHZhbHVlIHJhbmdlLCBubyBzaW5nbGUgZml4ZWQgZXJyb3IgYm91bmQgd29ya3MuIEl0J3MgYmV0dGVyIHRvCitjb21wYXJlIGJ5IGEgZml4ZWQgcmVsYXRpdmUgZXJyb3IgYm91bmQsIGV4Y2VwdCBmb3IgdmFsdWVzIGNsb3NlIHRvIDAgZHVlIHRvCit0aGUgbG9zcyBvZiBwcmVjaXNpb24gdGhlcmUuCisKK0luIGdlbmVyYWwsIGZvciBmbG9hdGluZy1wb2ludCBjb21wYXJpc29uIHRvIG1ha2Ugc2Vuc2UsIHRoZSB1c2VyIG5lZWRzIHRvCitjYXJlZnVsbHkgY2hvb3NlIHRoZSBlcnJvciBib3VuZC4gSWYgdGhleSBkb24ndCB3YW50IG9yIGNhcmUgdG8sIGNvbXBhcmluZyBpbgordGVybXMgb2YgVW5pdHMgaW4gdGhlIExhc3QgUGxhY2UgKFVMUHMpIGlzIGEgZ29vZCBkZWZhdWx0LCBhbmQgR29vZ2xlIFRlc3QKK3Byb3ZpZGVzIGFzc2VydGlvbnMgdG8gZG8gdGhpcy4gRnVsbCBkZXRhaWxzIGFib3V0IFVMUHMgYXJlIHF1aXRlIGxvbmc7IGlmIHlvdQord2FudCB0byBsZWFybiBtb3JlLCBzZWUKK1t0aGlzIGFydGljbGUgb24gZmxvYXQgY29tcGFyaXNvbl0oaHR0cDovL3d3dy5jeWdudXMtc29mdHdhcmUuY29tL3BhcGVycy9jb21wYXJpbmdmbG9hdHMvY29tcGFyaW5nZmxvYXRzLmh0bSkuCisKKyMjIyBGbG9hdGluZy1Qb2ludCBNYWNyb3MgIyMjCisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfRkxPQVRfRVEoYF9leHBlY3RlZCwgYWN0dWFsX2ApO2AgIHwgYEVYUEVDVF9GTE9BVF9FUShgX2V4cGVjdGVkLCBhY3R1YWxfYCk7YCB8IHRoZSB0d28gYGZsb2F0YCB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbCB8Cit8IGBBU1NFUlRfRE9VQkxFX0VRKGBfZXhwZWN0ZWQsIGFjdHVhbF9gKTtgIHwgYEVYUEVDVF9ET1VCTEVfRVEoYF9leHBlY3RlZCwgYWN0dWFsX2ApO2AgfCB0aGUgdHdvIGBkb3VibGVgIHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsIHwKKworQnkgImFsbW9zdCBlcXVhbCIsIHdlIG1lYW4gdGhlIHR3byB2YWx1ZXMgYXJlIHdpdGhpbiA0IFVMUCdzIGZyb20gZWFjaAorb3RoZXIuCisKK1RoZSBmb2xsb3dpbmcgYXNzZXJ0aW9ucyBhbGxvdyB5b3UgdG8gY2hvb3NlIHRoZSBhY2NlcHRhYmxlIGVycm9yIGJvdW5kOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX05FQVIoYF92YWwxLCB2YWwyLCBhYnNcX2Vycm9yX2ApO2AgfCBgRVhQRUNUX05FQVJgXyh2YWwxLCB2YWwyLCBhYnNcX2Vycm9yX2ApO2AgfCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIF92YWwxXyBhbmQgX3ZhbDJfIGRvZXNuJ3QgZXhjZWVkIHRoZSBnaXZlbiBhYnNvbHV0ZSBlcnJvciB8CisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgRmxvYXRpbmctUG9pbnQgUHJlZGljYXRlLUZvcm1hdCBGdW5jdGlvbnMgIyMjCisKK1NvbWUgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhcmUgdXNlZnVsLCBidXQgbm90IHRoYXQgb2Z0ZW4gdXNlZC4gSW4gb3JkZXIKK3RvIGF2b2lkIGFuIGV4cGxvc2lvbiBvZiBuZXcgbWFjcm9zLCB3ZSBwcm92aWRlIHRoZW0gYXMgcHJlZGljYXRlLWZvcm1hdAorZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgaW4gcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MgKGUuZy4KK2BFWFBFQ1RfUFJFRF9GT1JNQVQyYCwgZXRjKS4KKworYGBgCitFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6RmxvYXRMRSwgdmFsMSwgdmFsMik7CitFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6RG91YmxlTEUsIHZhbDEsIHZhbDIpOworYGBgCisKK1ZlcmlmaWVzIHRoYXQgX3ZhbDFfIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCBfdmFsMl8uIFlvdSBjYW4KK3JlcGxhY2UgYEVYUEVDVF9QUkVEX0ZPUk1BVDJgIGluIHRoZSBhYm92ZSB0YWJsZSB3aXRoIGBBU1NFUlRfUFJFRF9GT1JNQVQyYC4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIFdpbmRvd3MgSFJFU1VMVCBhc3NlcnRpb25zICMjCisKK1RoZXNlIGFzc2VydGlvbnMgdGVzdCBmb3IgYEhSRVNVTFRgIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChgX2V4cHJlc3Npb25fYCk7YCB8IGBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoYF9leHByZXNzaW9uX2ApO2AgfCBfZXhwcmVzc2lvbl8gaXMgYSBzdWNjZXNzIGBIUkVTVUxUYCB8Cit8IGBBU1NFUlRfSFJFU1VMVF9GQUlMRUQoYF9leHByZXNzaW9uX2ApO2AgICAgfCBgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKGBfZXhwcmVzc2lvbl9gKTtgICAgIHwgX2V4cHJlc3Npb25fIGlzIGEgZmFpbHVyZSBgSFJFU1VMVGAgfAorCitUaGUgZ2VuZXJhdGVkIG91dHB1dCBjb250YWlucyB0aGUgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZQorYXNzb2NpYXRlZCB3aXRoIHRoZSBgSFJFU1VMVGAgY29kZSByZXR1cm5lZCBieSBfZXhwcmVzc2lvbl8uCisKK1lvdSBtaWdodCB1c2UgdGhlbSBsaWtlIHRoaXM6CisKK2BgYAorQ0NvbVB0ciBzaGVsbDsKK0FTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChzaGVsbC5Db0NyZWF0ZUluc3RhbmNlKEwiU2hlbGwuQXBwbGljYXRpb24iKSk7CitDQ29tVmFyaWFudCBlbXB0eTsKK0FTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChzaGVsbC0+U2hlbGxFeGVjdXRlKENDb21CU1RSKHVybCksIGVtcHR5LCBlbXB0eSwgZW1wdHksIGVtcHR5KSk7CitgYGAKKworX0F2YWlsYWJpbGl0eV86IFdpbmRvd3MuCisKKyMjIFR5cGUgQXNzZXJ0aW9ucyAjIworCitZb3UgY2FuIGNhbGwgdGhlIGZ1bmN0aW9uCitgYGAKKzo6dGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4oKTsKK2BgYAordG8gYXNzZXJ0IHRoYXQgdHlwZXMgYFQxYCBhbmQgYFQyYCBhcmUgdGhlIHNhbWUuICBUaGUgZnVuY3Rpb24gZG9lcworbm90aGluZyBpZiB0aGUgYXNzZXJ0aW9uIGlzIHNhdGlzZmllZC4gIElmIHRoZSB0eXBlcyBhcmUgZGlmZmVyZW50LAordGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBmYWlsIHRvIGNvbXBpbGUsIGFuZCB0aGUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZQord2lsbCBsaWtlbHkgKGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIpIHNob3cgeW91IHRoZSBhY3R1YWwgdmFsdWVzIG9mCitgVDFgIGFuZCBgVDJgLiAgVGhpcyBpcyBtYWlubHkgdXNlZnVsIGluc2lkZSB0ZW1wbGF0ZSBjb2RlLgorCitfQ2F2ZWF0Ol8gV2hlbiB1c2VkIGluc2lkZSBhIG1lbWJlciBmdW5jdGlvbiBvZiBhIGNsYXNzIHRlbXBsYXRlIG9yIGEKK2Z1bmN0aW9uIHRlbXBsYXRlLCBgU3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4oKWAgaXMgZWZmZWN0aXZlIF9vbmx5IGlmXwordGhlIGZ1bmN0aW9uIGlzIGluc3RhbnRpYXRlZC4gIEZvciBleGFtcGxlLCBnaXZlbjoKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZvbyB7CisgcHVibGljOgorICB2b2lkIEJhcigpIHsgOjp0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBUPigpOyB9Cit9OworYGBgCit0aGUgY29kZToKK2BgYAordm9pZCBUZXN0MSgpIHsgRm9vPGJvb2w+IGZvbzsgfQorYGBgCit3aWxsIF9ub3RfIGdlbmVyYXRlIGEgY29tcGlsZXIgZXJyb3IsIGFzIGBGb288Ym9vbD46OkJhcigpYCBpcyBuZXZlcgorYWN0dWFsbHkgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgeW91IG5lZWQ6CitgYGAKK3ZvaWQgVGVzdDIoKSB7IEZvbzxib29sPiBmb287IGZvby5CYXIoKTsgfQorYGBgCit0byBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjMuMC4KKworIyMgQXNzZXJ0aW9uIFBsYWNlbWVudCAjIworCitZb3UgY2FuIHVzZSBhc3NlcnRpb25zIGluIGFueSBDKysgZnVuY3Rpb24uIEluIHBhcnRpY3VsYXIsIGl0IGRvZXNuJ3QKK2hhdmUgdG8gYmUgYSBtZXRob2Qgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcy4gVGhlIG9uZSBjb25zdHJhaW50IGlzCit0aGF0IGFzc2VydGlvbnMgdGhhdCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUgKGBGQUlMKmAgYW5kIGBBU1NFUlRfKmApCitjYW4gb25seSBiZSB1c2VkIGluIHZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9ucy4gVGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mCitHb29nbGUgVGVzdCBub3QgdXNpbmcgZXhjZXB0aW9ucy4gQnkgcGxhY2luZyBpdCBpbiBhIG5vbi12b2lkIGZ1bmN0aW9uCit5b3UnbGwgZ2V0IGEgY29uZnVzaW5nIGNvbXBpbGUgZXJyb3IgbGlrZQorYCJlcnJvcjogdm9pZCB2YWx1ZSBub3QgaWdub3JlZCBhcyBpdCBvdWdodCB0byBiZSJgLgorCitJZiB5b3UgbmVlZCB0byB1c2UgYXNzZXJ0aW9ucyBpbiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBub24tdm9pZCwgb25lIG9wdGlvbgoraXMgdG8gbWFrZSB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBpbiBhbiBvdXQgcGFyYW1ldGVyIGluc3RlYWQuIEZvcgorZXhhbXBsZSwgeW91IGNhbiByZXdyaXRlIGBUMiBGb28oVDEgeClgIHRvIGB2b2lkIEZvbyhUMSB4LCBUMiogcmVzdWx0KWAuIFlvdQorbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBgKnJlc3VsdGAgY29udGFpbnMgc29tZSBzZW5zaWJsZSB2YWx1ZSBldmVuIHdoZW4gdGhlCitmdW5jdGlvbiByZXR1cm5zIHByZW1hdHVyZWx5LiBBcyB0aGUgZnVuY3Rpb24gbm93IHJldHVybnMgYHZvaWRgLCB5b3UgY2FuIHVzZQorYW55IGFzc2VydGlvbiBpbnNpZGUgb2YgaXQuCisKK0lmIGNoYW5naW5nIHRoZSBmdW5jdGlvbidzIHR5cGUgaXMgbm90IGFuIG9wdGlvbiwgeW91IHNob3VsZCBqdXN0IHVzZQorYXNzZXJ0aW9ucyB0aGF0IGdlbmVyYXRlIG5vbi1mYXRhbCBmYWlsdXJlcywgc3VjaCBhcyBgQUREX0ZBSUxVUkUqYCBhbmQKK2BFWFBFQ1RfKmAuCisKK19Ob3RlXzogQ29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgbm90IGNvbnNpZGVyZWQgdm9pZC1yZXR1cm5pbmcKK2Z1bmN0aW9ucywgYWNjb3JkaW5nIHRvIHRoZSBDKysgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiwgYW5kIHNvIHlvdSBtYXkgbm90IHVzZQorZmF0YWwgYXNzZXJ0aW9ucyBpbiB0aGVtLiBZb3UnbGwgZ2V0IGEgY29tcGlsYXRpb24gZXJyb3IgaWYgeW91IHRyeS4gQSBzaW1wbGUKK3dvcmthcm91bmQgaXMgdG8gdHJhbnNmZXIgdGhlIGVudGlyZSBib2R5IG9mIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIHRvIGEKK3ByaXZhdGUgdm9pZC1yZXR1cm5pbmcgbWV0aG9kLiBIb3dldmVyLCB5b3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgYSBmYXRhbAorYXNzZXJ0aW9uIGZhaWx1cmUgaW4gYSBjb25zdHJ1Y3RvciBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIGN1cnJlbnQgdGVzdCwgYXMgeW91cgoraW50dWl0aW9uIG1pZ2h0IHN1Z2dlc3Q7IGl0IG1lcmVseSByZXR1cm5zIGZyb20gdGhlIGNvbnN0cnVjdG9yIGVhcmx5LCBwb3NzaWJseQorbGVhdmluZyB5b3VyIG9iamVjdCBpbiBhIHBhcnRpYWxseS1jb25zdHJ1Y3RlZCBzdGF0ZS4gTGlrZXdpc2UsIGEgZmF0YWwKK2Fzc2VydGlvbiBmYWlsdXJlIGluIGEgZGVzdHJ1Y3RvciBtYXkgbGVhdmUgeW91ciBvYmplY3QgaW4gYQorcGFydGlhbGx5LWRlc3RydWN0ZWQgc3RhdGUuIFVzZSBhc3NlcnRpb25zIGNhcmVmdWxseSBpbiB0aGVzZSBzaXR1YXRpb25zIQorCisjIFRlYWNoaW5nIEdvb2dsZSBUZXN0IEhvdyB0byBQcmludCBZb3VyIFZhbHVlcyAjCisKK1doZW4gYSB0ZXN0IGFzc2VydGlvbiBzdWNoIGFzIGBFWFBFQ1RfRVFgIGZhaWxzLCBHb29nbGUgVGVzdCBwcmludHMgdGhlCithcmd1bWVudCB2YWx1ZXMgdG8gaGVscCB5b3UgZGVidWcuICBJdCBkb2VzIHRoaXMgdXNpbmcgYQordXNlci1leHRlbnNpYmxlIHZhbHVlIHByaW50ZXIuCisKK1RoaXMgcHJpbnRlciBrbm93cyBob3cgdG8gcHJpbnQgYnVpbHQtaW4gQysrIHR5cGVzLCBuYXRpdmUgYXJyYXlzLCBTVEwKK2NvbnRhaW5lcnMsIGFuZCBhbnkgdHlwZSB0aGF0IHN1cHBvcnRzIHRoZSBgPDxgIG9wZXJhdG9yLiAgRm9yIG90aGVyCit0eXBlcywgaXQgcHJpbnRzIHRoZSByYXcgYnl0ZXMgaW4gdGhlIHZhbHVlIGFuZCBob3BlcyB0aGF0IHlvdSB0aGUKK3VzZXIgY2FuIGZpZ3VyZSBpdCBvdXQuCisKK0FzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGUgcHJpbnRlciBpcyBfZXh0ZW5zaWJsZV8uICBUaGF0IG1lYW5zCit5b3UgY2FuIHRlYWNoIGl0IHRvIGRvIGEgYmV0dGVyIGpvYiBhdCBwcmludGluZyB5b3VyIHBhcnRpY3VsYXIgdHlwZQordGhhbiB0byBkdW1wIHRoZSBieXRlcy4gIFRvIGRvIHRoYXQsIGRlZmluZSBgPDxgIGZvciB5b3VyIHR5cGU6CisKK2BgYAorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgQmFyIHsgLi4uIH07ICAvLyBXZSB3YW50IEdvb2dsZSBUZXN0IHRvIGJlIGFibGUgdG8gcHJpbnQgaW5zdGFuY2VzIG9mIHRoaXMuCisKKy8vIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIDw8IG9wZXJhdG9yIGlzIGRlZmluZWQgaW4gdGhlIFNBTUUKKy8vIG5hbWVzcGFjZSB0aGF0IGRlZmluZXMgQmFyLiAgQysrJ3MgbG9vay11cCBydWxlcyByZWx5IG9uIHRoYXQuCis6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEJhciYgYmFyKSB7CisgIHJldHVybiBvcyA8PCBiYXIuRGVidWdTdHJpbmcoKTsgIC8vIHdoYXRldmVyIG5lZWRlZCB0byBwcmludCBiYXIgdG8gb3MKK30KKworfSAgLy8gbmFtZXNwYWNlIGZvbworYGBgCisKK1NvbWV0aW1lcywgdGhpcyBtaWdodCBub3QgYmUgYW4gb3B0aW9uOiB5b3VyIHRlYW0gbWF5IGNvbnNpZGVyIGl0IGJhZAorc3R5bGUgdG8gaGF2ZSBhIGA8PGAgb3BlcmF0b3IgZm9yIGBCYXJgLCBvciBgQmFyYCBtYXkgYWxyZWFkeSBoYXZlIGEKK2A8PGAgb3BlcmF0b3IgdGhhdCBkb2Vzbid0IGRvIHdoYXQgeW91IHdhbnQgKGFuZCB5b3UgY2Fubm90IGNoYW5nZQoraXQpLiAgSWYgc28sIHlvdSBjYW4gaW5zdGVhZCBkZWZpbmUgYSBgUHJpbnRUbygpYCBmdW5jdGlvbiBsaWtlIHRoaXM6CisKK2BgYAorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgQmFyIHsgLi4uIH07CisKKy8vIEl0J3MgaW1wb3J0YW50IHRoYXQgUHJpbnRUbygpIGlzIGRlZmluZWQgaW4gdGhlIFNBTUUKKy8vIG5hbWVzcGFjZSB0aGF0IGRlZmluZXMgQmFyLiAgQysrJ3MgbG9vay11cCBydWxlcyByZWx5IG9uIHRoYXQuCit2b2lkIFByaW50VG8oY29uc3QgQmFyJiBiYXIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgYmFyLkRlYnVnU3RyaW5nKCk7ICAvLyB3aGF0ZXZlciBuZWVkZWQgdG8gcHJpbnQgYmFyIHRvIG9zCit9CisKK30gIC8vIG5hbWVzcGFjZSBmb28KK2BgYAorCitJZiB5b3UgaGF2ZSBkZWZpbmVkIGJvdGggYDw8YCBhbmQgYFByaW50VG8oKWAsIHRoZSBsYXR0ZXIgd2lsbCBiZSB1c2VkCit3aGVuIEdvb2dsZSBUZXN0IGlzIGNvbmNlcm5lZC4gIFRoaXMgYWxsb3dzIHlvdSB0byBjdXN0b21pemUgaG93IHRoZSB2YWx1ZQorYXBwZWFycyBpbiBHb29nbGUgVGVzdCdzIG91dHB1dCB3aXRob3V0IGFmZmVjdGluZyBjb2RlIHRoYXQgcmVsaWVzIG9uIHRoZQorYmVoYXZpb3Igb2YgaXRzIGA8PGAgb3BlcmF0b3IuCisKK0lmIHlvdSB3YW50IHRvIHByaW50IGEgdmFsdWUgYHhgIHVzaW5nIEdvb2dsZSBUZXN0J3MgdmFsdWUgcHJpbnRlcgoreW91cnNlbGYsIGp1c3QgY2FsbCBgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKGBfeF9gKWAsIHdoaWNoCityZXR1cm5zIGFuIGBzdGQ6OnN0cmluZ2A6CisKK2BgYAordmVjdG9yPHBhaXI8QmFyLCBpbnQ+ID4gYmFyX2ludHMgPSBHZXRCYXJJbnRWZWN0b3IoKTsKKworRVhQRUNUX1RSVUUoSXNDb3JyZWN0QmFySW50VmVjdG9yKGJhcl9pbnRzKSkKKyAgICA8PCAiYmFyX2ludHMgPSAiIDw8IDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhiYXJfaW50cyk7CitgYGAKKworIyBEZWF0aCBUZXN0cyAjCisKK0luIG1hbnkgYXBwbGljYXRpb25zLCB0aGVyZSBhcmUgYXNzZXJ0aW9ucyB0aGF0IGNhbiBjYXVzZSBhcHBsaWNhdGlvbiBmYWlsdXJlCitpZiBhIGNvbmRpdGlvbiBpcyBub3QgbWV0LiBUaGVzZSBzYW5pdHkgY2hlY2tzLCB3aGljaCBlbnN1cmUgdGhhdCB0aGUgcHJvZ3JhbQoraXMgaW4gYSBrbm93biBnb29kIHN0YXRlLCBhcmUgdGhlcmUgdG8gZmFpbCBhdCB0aGUgZWFybGllc3QgcG9zc2libGUgdGltZSBhZnRlcgorc29tZSBwcm9ncmFtIHN0YXRlIGlzIGNvcnJ1cHRlZC4gSWYgdGhlIGFzc2VydGlvbiBjaGVja3MgdGhlIHdyb25nIGNvbmRpdGlvbiwKK3RoZW4gdGhlIHByb2dyYW0gbWF5IHByb2NlZWQgaW4gYW4gZXJyb25lb3VzIHN0YXRlLCB3aGljaCBjb3VsZCBsZWFkIHRvIG1lbW9yeQorY29ycnVwdGlvbiwgc2VjdXJpdHkgaG9sZXMsIG9yIHdvcnNlLiBIZW5jZSBpdCBpcyB2aXRhbGx5IGltcG9ydGFudCB0byB0ZXN0Cit0aGF0IHN1Y2ggYXNzZXJ0aW9uIHN0YXRlbWVudHMgd29yayBhcyBleHBlY3RlZC4KKworU2luY2UgdGhlc2UgcHJlY29uZGl0aW9uIGNoZWNrcyBjYXVzZSB0aGUgcHJvY2Vzc2VzIHRvIGRpZSwgd2UgY2FsbCBzdWNoIHRlc3RzCitfZGVhdGggdGVzdHNfLiBNb3JlIGdlbmVyYWxseSwgYW55IHRlc3QgdGhhdCBjaGVja3MgdGhhdCBhIHByb2dyYW0gdGVybWluYXRlcworKGV4Y2VwdCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24pIGluIGFuIGV4cGVjdGVkIGZhc2hpb24gaXMgYWxzbyBhIGRlYXRoIHRlc3QuCisKK05vdGUgdGhhdCBpZiBhIHBpZWNlIG9mIGNvZGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgd2UgZG9uJ3QgY29uc2lkZXIgaXQgImRlYXRoIgorZm9yIHRoZSBwdXJwb3NlIG9mIGRlYXRoIHRlc3RzLCBhcyB0aGUgY2FsbGVyIG9mIHRoZSBjb2RlIGNvdWxkIGNhdGNoIHRoZSBleGNlcHRpb24KK2FuZCBhdm9pZCB0aGUgY3Jhc2guIElmIHlvdSB3YW50IHRvIHZlcmlmeSBleGNlcHRpb25zIHRocm93biBieSB5b3VyIGNvZGUsCitzZWUgW0V4Y2VwdGlvbiBBc3NlcnRpb25zXSgjRXhjZXB0aW9uX0Fzc2VydGlvbnMubWQpLgorCitJZiB5b3Ugd2FudCB0byB0ZXN0IGBFWFBFQ1RfKigpL0FTU0VSVF8qKClgIGZhaWx1cmVzIGluIHlvdXIgdGVzdCBjb2RlLCBzZWUgW0NhdGNoaW5nIEZhaWx1cmVzXSgjQ2F0Y2hpbmdfRmFpbHVyZXMubWQpLgorCisjIyBIb3cgdG8gV3JpdGUgYSBEZWF0aCBUZXN0ICMjCisKK0dvb2dsZSBUZXN0IGhhcyB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBzdXBwb3J0IGRlYXRoIHRlc3RzOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX0RFQVRIKGBfc3RhdGVtZW50LCByZWdleF9gKTsgfCBgRVhQRUNUX0RFQVRIKGBfc3RhdGVtZW50LCByZWdleF9gKTsgfCBfc3RhdGVtZW50XyBjcmFzaGVzIHdpdGggdGhlIGdpdmVuIGVycm9yIHwKK3wgYEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoYF9zdGF0ZW1lbnQsIHJlZ2V4X2ApOyB8IGBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKGBfc3RhdGVtZW50LCByZWdleF9gKTsgfCBpZiBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkLCB2ZXJpZmllcyB0aGF0IF9zdGF0ZW1lbnRfIGNyYXNoZXMgd2l0aCB0aGUgZ2l2ZW4gZXJyb3I7IG90aGVyd2lzZSB2ZXJpZmllcyBub3RoaW5nIHwKK3wgYEFTU0VSVF9FWElUKGBfc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4X2ApOyB8IGBFWFBFQ1RfRVhJVChgX3N0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleF9gKTsgfF9zdGF0ZW1lbnRfIGV4aXRzIHdpdGggdGhlIGdpdmVuIGVycm9yIGFuZCBpdHMgZXhpdCBjb2RlIG1hdGNoZXMgX3ByZWRpY2F0ZV8gfAorCit3aGVyZSBfc3RhdGVtZW50XyBpcyBhIHN0YXRlbWVudCB0aGF0IGlzIGV4cGVjdGVkIHRvIGNhdXNlIHRoZSBwcm9jZXNzIHRvCitkaWUsIF9wcmVkaWNhdGVfIGlzIGEgZnVuY3Rpb24gb3IgZnVuY3Rpb24gb2JqZWN0IHRoYXQgZXZhbHVhdGVzIGFuIGludGVnZXIKK2V4aXQgc3RhdHVzLCBhbmQgX3JlZ2V4XyBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHRoZSBzdGRlcnIgb3V0cHV0IG9mCitfc3RhdGVtZW50XyBpcyBleHBlY3RlZCB0byBtYXRjaC4gTm90ZSB0aGF0IF9zdGF0ZW1lbnRfIGNhbiBiZSBfYW55IHZhbGlkCitzdGF0ZW1lbnRfIChpbmNsdWRpbmcgX2NvbXBvdW5kIHN0YXRlbWVudF8pIGFuZCBkb2Vzbid0IGhhdmUgdG8gYmUgYW4KK2V4cHJlc3Npb24uCisKK0FzIHVzdWFsLCB0aGUgYEFTU0VSVGAgdmFyaWFudHMgYWJvcnQgdGhlIGN1cnJlbnQgdGVzdCBmdW5jdGlvbiwgd2hpbGUgdGhlCitgRVhQRUNUYCB2YXJpYW50cyBkbyBub3QuCisKKyoqTm90ZToqKiBXZSB1c2UgdGhlIHdvcmQgImNyYXNoIiBoZXJlIHRvIG1lYW4gdGhhdCB0aGUgcHJvY2VzcwordGVybWluYXRlcyB3aXRoIGEgX25vbi16ZXJvXyBleGl0IHN0YXR1cyBjb2RlLiAgVGhlcmUgYXJlIHR3bworcG9zc2liaWxpdGllczogZWl0aGVyIHRoZSBwcm9jZXNzIGhhcyBjYWxsZWQgYGV4aXQoKWAgb3IgYF9leGl0KClgCit3aXRoIGEgbm9uLXplcm8gdmFsdWUsIG9yIGl0IG1heSBiZSBraWxsZWQgYnkgYSBzaWduYWwuCisKK1RoaXMgbWVhbnMgdGhhdCBpZiBfc3RhdGVtZW50XyB0ZXJtaW5hdGVzIHRoZSBwcm9jZXNzIHdpdGggYSAwIGV4aXQKK2NvZGUsIGl0IGlzIF9ub3RfIGNvbnNpZGVyZWQgYSBjcmFzaCBieSBgRVhQRUNUX0RFQVRIYC4gIFVzZQorYEVYUEVDVF9FWElUYCBpbnN0ZWFkIGlmIHRoaXMgaXMgdGhlIGNhc2UsIG9yIGlmIHlvdSB3YW50IHRvIHJlc3RyaWN0Cit0aGUgZXhpdCBjb2RlIG1vcmUgcHJlY2lzZWx5LgorCitBIHByZWRpY2F0ZSBoZXJlIG11c3QgYWNjZXB0IGFuIGBpbnRgIGFuZCByZXR1cm4gYSBgYm9vbGAuIFRoZSBkZWF0aCB0ZXN0CitzdWNjZWVkcyBvbmx5IGlmIHRoZSBwcmVkaWNhdGUgcmV0dXJucyBgdHJ1ZWAuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBmZXcKK3ByZWRpY2F0ZXMgdGhhdCBoYW5kbGUgdGhlIG1vc3QgY29tbW9uIGNhc2VzOgorCitgYGAKKzo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoZXhpdF9jb2RlKQorYGBgCisKK1RoaXMgZXhwcmVzc2lvbiBpcyBgdHJ1ZWAgaWYgdGhlIHByb2dyYW0gZXhpdGVkIG5vcm1hbGx5IHdpdGggdGhlIGdpdmVuIGV4aXQKK2NvZGUuCisKK2BgYAorOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChzaWduYWxfbnVtYmVyKSAgLy8gTm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorYGBgCisKK1RoaXMgZXhwcmVzc2lvbiBpcyBgdHJ1ZWAgaWYgdGhlIHByb2dyYW0gd2FzIGtpbGxlZCBieSB0aGUgZ2l2ZW4gc2lnbmFsLgorCitUaGUgYCpfREVBVEhgIG1hY3JvcyBhcmUgY29udmVuaWVudCB3cmFwcGVycyBmb3IgYCpfRVhJVGAgdGhhdCB1c2UgYSBwcmVkaWNhdGUKK3RoYXQgdmVyaWZpZXMgdGhlIHByb2Nlc3MnIGV4aXQgY29kZSBpcyBub24temVyby4KKworTm90ZSB0aGF0IGEgZGVhdGggdGVzdCBvbmx5IGNhcmVzIGFib3V0IHRocmVlIHRoaW5nczoKKworICAxLiBkb2VzIF9zdGF0ZW1lbnRfIGFib3J0IG9yIGV4aXQgdGhlIHByb2Nlc3M/CisgIDEuIChpbiB0aGUgY2FzZSBvZiBgQVNTRVJUX0VYSVRgIGFuZCBgRVhQRUNUX0VYSVRgKSBkb2VzIHRoZSBleGl0IHN0YXR1cyBzYXRpc2Z5IF9wcmVkaWNhdGVfPyAgT3IgKGluIHRoZSBjYXNlIG9mIGBBU1NFUlRfREVBVEhgIGFuZCBgRVhQRUNUX0RFQVRIYCkgaXMgdGhlIGV4aXQgc3RhdHVzIG5vbi16ZXJvPyAgQW5kCisgIDEuIGRvZXMgdGhlIHN0ZGVyciBvdXRwdXQgbWF0Y2ggX3JlZ2V4Xz8KKworSW4gcGFydGljdWxhciwgaWYgX3N0YXRlbWVudF8gZ2VuZXJhdGVzIGFuIGBBU1NFUlRfKmAgb3IgYEVYUEVDVF8qYCBmYWlsdXJlLCBpdCB3aWxsICoqbm90KiogY2F1c2UgdGhlIGRlYXRoIHRlc3QgdG8gZmFpbCwgYXMgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBkb24ndCBhYm9ydCB0aGUgcHJvY2Vzcy4KKworVG8gd3JpdGUgYSBkZWF0aCB0ZXN0LCBzaW1wbHkgdXNlIG9uZSBvZiB0aGUgYWJvdmUgbWFjcm9zIGluc2lkZSB5b3VyIHRlc3QKK2Z1bmN0aW9uLiBGb3IgZXhhbXBsZSwKKworYGBgCitURVNUKE15RGVhdGhUZXN0LCBGb28pIHsKKyAgLy8gVGhpcyBkZWF0aCB0ZXN0IHVzZXMgYSBjb21wb3VuZCBzdGF0ZW1lbnQuCisgIEFTU0VSVF9ERUFUSCh7IGludCBuID0gNTsgRm9vKCZuKTsgfSwgIkVycm9yIG9uIGxpbmUgLiogb2YgRm9vKCkiKTsKK30KK1RFU1QoTXlEZWF0aFRlc3QsIE5vcm1hbEV4aXQpIHsKKyAgRVhQRUNUX0VYSVQoTm9ybWFsRXhpdCgpLCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiU3VjY2VzcyIpOworfQorVEVTVChNeURlYXRoVGVzdCwgS2lsbE15c2VsZikgeworICBFWFBFQ1RfRVhJVChLaWxsTXlzZWxmKCksIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHS0lMTCksICJTZW5kaW5nIG15c2VsZiB1bmJsb2NrYWJsZSBzaWduYWwiKTsKK30KK2BgYAorCit2ZXJpZmllcyB0aGF0OgorCisgICogY2FsbGluZyBgRm9vKDUpYCBjYXVzZXMgdGhlIHByb2Nlc3MgdG8gZGllIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UsCisgICogY2FsbGluZyBgTm9ybWFsRXhpdCgpYCBjYXVzZXMgdGhlIHByb2Nlc3MgdG8gcHJpbnQgYCJTdWNjZXNzImAgdG8gc3RkZXJyIGFuZCBleGl0IHdpdGggZXhpdCBjb2RlIDAsIGFuZAorICAqIGNhbGxpbmcgYEtpbGxNeXNlbGYoKWAga2lsbHMgdGhlIHByb2Nlc3Mgd2l0aCBzaWduYWwgYFNJR0tJTExgLgorCitUaGUgdGVzdCBmdW5jdGlvbiBib2R5IG1heSBjb250YWluIG90aGVyIGFzc2VydGlvbnMgYW5kIHN0YXRlbWVudHMgYXMgd2VsbCwgaWYKK25lY2Vzc2FyeS4KKworX0ltcG9ydGFudDpfIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB5b3UgdG8gZm9sbG93IHRoZSBjb252ZW50aW9uIG9mIG5hbWluZyB5b3VyCit0ZXN0IGNhc2UgKG5vdCB0ZXN0KSBgKkRlYXRoVGVzdGAgd2hlbiBpdCBjb250YWlucyBhIGRlYXRoIHRlc3QsIGFzCitkZW1vbnN0cmF0ZWQgaW4gdGhlIGFib3ZlIGV4YW1wbGUuIFRoZSBgRGVhdGggVGVzdHMgQW5kIFRocmVhZHNgIHNlY3Rpb24gYmVsb3cKK2V4cGxhaW5zIHdoeS4KKworSWYgYSB0ZXN0IGZpeHR1cmUgY2xhc3MgaXMgc2hhcmVkIGJ5IG5vcm1hbCB0ZXN0cyBhbmQgZGVhdGggdGVzdHMsIHlvdQorY2FuIHVzZSB0eXBlZGVmIHRvIGludHJvZHVjZSBhbiBhbGlhcyBmb3IgdGhlIGZpeHR1cmUgY2xhc3MgYW5kIGF2b2lkCitkdXBsaWNhdGluZyBpdHMgY29kZToKK2BgYAorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeyAuLi4gfTsKKwordHlwZWRlZiBGb29UZXN0IEZvb0RlYXRoVGVzdDsKKworVEVTVF9GKEZvb1Rlc3QsIERvZXNUaGlzKSB7CisgIC8vIG5vcm1hbCB0ZXN0Cit9CisKK1RFU1RfRihGb29EZWF0aFRlc3QsIERvZXNUaGF0KSB7CisgIC8vIGRlYXRoIHRlc3QKK30KK2BgYAorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MgKHJlcXVpcmVzIE1TVkMgOC4wIG9yIGFib3ZlKSwgQ3lnd2luLCBhbmQgTWFjICh0aGUgbGF0dGVyIHRocmVlIGFyZSBzdXBwb3J0ZWQgc2luY2UgdjEuMy4wKS4gIGAoQVNTRVJUfEVYUEVDVClfREVBVEhfSUZfU1VQUE9SVEVEYCBhcmUgbmV3IGluIHYxLjQuMC4KKworIyMgUmVndWxhciBFeHByZXNzaW9uIFN5bnRheCAjIworCitPbiBQT1NJWCBzeXN0ZW1zIChlLmcuIExpbnV4LCBDeWd3aW4sIGFuZCBNYWMpLCBHb29nbGUgVGVzdCB1c2VzIHRoZQorW1BPU0lYIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbl0oaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Jhc2VkZWZzL3hiZF9jaGFwMDkuaHRtbCN0YWdfMDlfMDQpCitzeW50YXggaW4gZGVhdGggdGVzdHMuIFRvIGxlYXJuIGFib3V0IHRoaXMgc3ludGF4LCB5b3UgbWF5IHdhbnQgdG8gcmVhZCB0aGlzIFtXaWtpcGVkaWEgZW50cnldKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uI1BPU0lYX0V4dGVuZGVkX1JlZ3VsYXJfRXhwcmVzc2lvbnMpLgorCitPbiBXaW5kb3dzLCBHb29nbGUgVGVzdCB1c2VzIGl0cyBvd24gc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbgoraW1wbGVtZW50YXRpb24uIEl0IGxhY2tzIG1hbnkgZmVhdHVyZXMgeW91IGNhbiBmaW5kIGluIFBPU0lYIGV4dGVuZGVkCityZWd1bGFyIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGUsIHdlIGRvbid0IHN1cHBvcnQgdW5pb24gKGAieHx5ImApLAorZ3JvdXBpbmcgKGAiKHh5KSJgKSwgYnJhY2tldHMgKGAiW3h5XSJgKSwgYW5kIHJlcGV0aXRpb24gY291bnQKKyhgInh7NSw3fSJgKSwgYW1vbmcgb3RoZXJzLiBCZWxvdyBpcyB3aGF0IHdlIGRvIHN1cHBvcnQgKExldHRlciBgQWAgZGVub3RlcyBhCitsaXRlcmFsIGNoYXJhY3RlciwgcGVyaW9kIChgLmApLCBvciBhIHNpbmdsZSBgXFxgIGVzY2FwZSBzZXF1ZW5jZTsgYHhgCithbmQgYHlgIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zLik6CisKK3wgYGNgIHwgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYGNgIHwKK3w6LS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYFxcZGAgfCBtYXRjaGVzIGFueSBkZWNpbWFsIGRpZ2l0ICAgICAgICAgfAorfCBgXFxEYCB8IG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgZGVjaW1hbCBkaWdpdCB8Cit8IGBcXGZgIHwgbWF0Y2hlcyBgXGZgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYFxcbmAgfCBtYXRjaGVzIGBcbmAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgXFxyYCB8IG1hdGNoZXMgYFxyYCAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBcXHNgIHwgbWF0Y2hlcyBhbnkgQVNDSUkgd2hpdGVzcGFjZSwgaW5jbHVkaW5nIGBcbmAgfAorfCBgXFxTYCB8IG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgd2hpdGVzcGFjZSB8Cit8IGBcXHRgIHwgbWF0Y2hlcyBgXHRgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYFxcdmAgfCBtYXRjaGVzIGBcdmAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgXFx3YCB8IG1hdGNoZXMgYW55IGxldHRlciwgYF9gLCBvciBkZWNpbWFsIGRpZ2l0IHwKK3wgYFxcV2AgfCBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCBgXFx3YCBkb2Vzbid0IG1hdGNoIHwKK3wgYFxcY2AgfCBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBgY2AsIHdoaWNoIG11c3QgYmUgYSBwdW5jdHVhdGlvbiB8Cit8IGBcXC5gIHwgbWF0Y2hlcyB0aGUgYC5gIGNoYXJhY3RlciAgICAgICAgIHwKK3wgYC5gIHwgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgYFxuYCB8Cit8IGBBP2AgfCBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBgQWAgfAorfCBgQSpgIHwgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgYEFgIHwKK3wgYEErYCB8IG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIGBBYCB8Cit8IGBeYCB8IG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKSB8Cit8IGAkYCB8IG1hdGNoZXMgdGhlIGVuZCBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKSB8Cit8IGB4eWAgfCBtYXRjaGVzIGB4YCBmb2xsb3dlZCBieSBgeWAgICAgICAgfAorCitUbyBoZWxwIHlvdSBkZXRlcm1pbmUgd2hpY2ggY2FwYWJpbGl0eSBpcyBhdmFpbGFibGUgb24geW91ciBzeXN0ZW0sCitHb29nbGUgVGVzdCBkZWZpbmVzIG1hY3JvIGBHVEVTVF9VU0VTX1BPU0lYX1JFPTFgIHdoZW4gaXQgdXNlcyBQT1NJWAorZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucywgb3IgYEdURVNUX1VTRVNfU0lNUExFX1JFPTFgIHdoZW4gaXQgdXNlcwordGhlIHNpbXBsZSB2ZXJzaW9uLiAgSWYgeW91IHdhbnQgeW91ciBkZWF0aCB0ZXN0cyB0byB3b3JrIGluIGJvdGgKK2Nhc2VzLCB5b3UgY2FuIGVpdGhlciBgI2lmYCBvbiB0aGVzZSBtYWNyb3Mgb3IgdXNlIHRoZSBtb3JlIGxpbWl0ZWQKK3N5bnRheCBvbmx5LgorCisjIyBIb3cgSXQgV29ya3MgIyMKKworVW5kZXIgdGhlIGhvb2QsIGBBU1NFUlRfRVhJVCgpYCBzcGF3bnMgYSBuZXcgcHJvY2VzcyBhbmQgZXhlY3V0ZXMgdGhlCitkZWF0aCB0ZXN0IHN0YXRlbWVudCBpbiB0aGF0IHByb2Nlc3MuIFRoZSBkZXRhaWxzIG9mIG9mIGhvdyBwcmVjaXNlbHkKK3RoYXQgaGFwcGVucyBkZXBlbmQgb24gdGhlIHBsYXRmb3JtIGFuZCB0aGUgdmFyaWFibGUKK2A6OnRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSlgICh3aGljaCBpcyBpbml0aWFsaXplZCBmcm9tIHRoZQorY29tbWFuZC1saW5lIGZsYWcgYC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZWApLgorCisgICogT24gUE9TSVggc3lzdGVtcywgYGZvcmsoKWAgKG9yIGBjbG9uZSgpYCBvbiBMaW51eCkgaXMgdXNlZCB0byBzcGF3biB0aGUgY2hpbGQsIGFmdGVyIHdoaWNoOgorICAgICogSWYgdGhlIHZhcmlhYmxlJ3MgdmFsdWUgaXMgYCJmYXN0ImAsIHRoZSBkZWF0aCB0ZXN0IHN0YXRlbWVudCBpcyBpbW1lZGlhdGVseSBleGVjdXRlZC4KKyAgICAqIElmIHRoZSB2YXJpYWJsZSdzIHZhbHVlIGlzIGAidGhyZWFkc2FmZSJgLCB0aGUgY2hpbGQgcHJvY2VzcyByZS1leGVjdXRlcyB0aGUgdW5pdCB0ZXN0IGJpbmFyeSBqdXN0IGFzIGl0IHdhcyBvcmlnaW5hbGx5IGludm9rZWQsIGJ1dCB3aXRoIHNvbWUgZXh0cmEgZmxhZ3MgdG8gY2F1c2UganVzdCB0aGUgc2luZ2xlIGRlYXRoIHRlc3QgdW5kZXIgY29uc2lkZXJhdGlvbiB0byBiZSBydW4uCisgICogT24gV2luZG93cywgdGhlIGNoaWxkIGlzIHNwYXduZWQgdXNpbmcgdGhlIGBDcmVhdGVQcm9jZXNzKClgIEFQSSwgYW5kIHJlLWV4ZWN1dGVzIHRoZSBiaW5hcnkgdG8gY2F1c2UganVzdCB0aGUgc2luZ2xlIGRlYXRoIHRlc3QgdW5kZXIgY29uc2lkZXJhdGlvbiB0byBiZSBydW4gLSBtdWNoIGxpa2UgdGhlIGB0aHJlYWRzYWZlYCBtb2RlIG9uIFBPU0lYLgorCitPdGhlciB2YWx1ZXMgZm9yIHRoZSB2YXJpYWJsZSBhcmUgaWxsZWdhbCBhbmQgd2lsbCBjYXVzZSB0aGUgZGVhdGggdGVzdCB0bworZmFpbC4gQ3VycmVudGx5LCB0aGUgZmxhZydzIGRlZmF1bHQgdmFsdWUgaXMgYCJmYXN0ImAuIEhvd2V2ZXIsIHdlIHJlc2VydmUgdGhlCityaWdodCB0byBjaGFuZ2UgaXQgaW4gdGhlIGZ1dHVyZS4gVGhlcmVmb3JlLCB5b3VyIHRlc3RzIHNob3VsZCBub3QgZGVwZW5kIG9uCit0aGlzLgorCitJbiBlaXRoZXIgY2FzZSwgdGhlIHBhcmVudCBwcm9jZXNzIHdhaXRzIGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBjb21wbGV0ZSwgYW5kIGNoZWNrcyB0aGF0CisKKyAgMS4gdGhlIGNoaWxkJ3MgZXhpdCBzdGF0dXMgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUsIGFuZAorICAxLiB0aGUgY2hpbGQncyBzdGRlcnIgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLgorCitJZiB0aGUgZGVhdGggdGVzdCBzdGF0ZW1lbnQgcnVucyB0byBjb21wbGV0aW9uIHdpdGhvdXQgZHlpbmcsIHRoZSBjaGlsZAorcHJvY2VzcyB3aWxsIG5vbmV0aGVsZXNzIHRlcm1pbmF0ZSwgYW5kIHRoZSBhc3NlcnRpb24gZmFpbHMuCisKKyMjIERlYXRoIFRlc3RzIEFuZCBUaHJlYWRzICMjCisKK1RoZSByZWFzb24gZm9yIHRoZSB0d28gZGVhdGggdGVzdCBzdHlsZXMgaGFzIHRvIGRvIHdpdGggdGhyZWFkIHNhZmV0eS4gRHVlIHRvCit3ZWxsLWtub3duIHByb2JsZW1zIHdpdGggZm9ya2luZyBpbiB0aGUgcHJlc2VuY2Ugb2YgdGhyZWFkcywgZGVhdGggdGVzdHMgc2hvdWxkCitiZSBydW4gaW4gYSBzaW5nbGUtdGhyZWFkZWQgY29udGV4dC4gU29tZXRpbWVzLCBob3dldmVyLCBpdCBpc24ndCBmZWFzaWJsZSB0bworYXJyYW5nZSB0aGF0IGtpbmQgb2YgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBzdGF0aWNhbGx5LWluaXRpYWxpemVkIG1vZHVsZXMKK21heSBzdGFydCB0aHJlYWRzIGJlZm9yZSBtYWluIGlzIGV2ZXIgcmVhY2hlZC4gT25jZSB0aHJlYWRzIGhhdmUgYmVlbiBjcmVhdGVkLAoraXQgbWF5IGJlIGRpZmZpY3VsdCBvciBpbXBvc3NpYmxlIHRvIGNsZWFuIHRoZW0gdXAuCisKK0dvb2dsZSBUZXN0IGhhcyB0aHJlZSBmZWF0dXJlcyBpbnRlbmRlZCB0byByYWlzZSBhd2FyZW5lc3Mgb2YgdGhyZWFkaW5nIGlzc3Vlcy4KKworICAxLiBBIHdhcm5pbmcgaXMgZW1pdHRlZCBpZiBtdWx0aXBsZSB0aHJlYWRzIGFyZSBydW5uaW5nIHdoZW4gYSBkZWF0aCB0ZXN0IGlzIGVuY291bnRlcmVkLgorICAxLiBUZXN0IGNhc2VzIHdpdGggYSBuYW1lIGVuZGluZyBpbiAiRGVhdGhUZXN0IiBhcmUgcnVuIGJlZm9yZSBhbGwgb3RoZXIgdGVzdHMuCisgIDEuIEl0IHVzZXMgYGNsb25lKClgIGluc3RlYWQgb2YgYGZvcmsoKWAgdG8gc3Bhd24gdGhlIGNoaWxkIHByb2Nlc3Mgb24gTGludXggKGBjbG9uZSgpYCBpcyBub3QgYXZhaWxhYmxlIG9uIEN5Z3dpbiBhbmQgTWFjKSwgYXMgYGZvcmsoKWAgaXMgbW9yZSBsaWtlbHkgdG8gY2F1c2UgdGhlIGNoaWxkIHRvIGhhbmcgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgaGFzIG11bHRpcGxlIHRocmVhZHMuCisKK0l0J3MgcGVyZmVjdGx5IGZpbmUgdG8gY3JlYXRlIHRocmVhZHMgaW5zaWRlIGEgZGVhdGggdGVzdCBzdGF0ZW1lbnQ7IHRoZXkgYXJlCitleGVjdXRlZCBpbiBhIHNlcGFyYXRlIHByb2Nlc3MgYW5kIGNhbm5vdCBhZmZlY3QgdGhlIHBhcmVudC4KKworIyMgRGVhdGggVGVzdCBTdHlsZXMgIyMKKworVGhlICJ0aHJlYWRzYWZlIiBkZWF0aCB0ZXN0IHN0eWxlIHdhcyBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGhlbHAgbWl0aWdhdGUgdGhlCityaXNrcyBvZiB0ZXN0aW5nIGluIGEgcG9zc2libHkgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudC4gSXQgdHJhZGVzIGluY3JlYXNlZAordGVzdCBleGVjdXRpb24gdGltZSAocG90ZW50aWFsbHkgZHJhbWF0aWNhbGx5IHNvKSBmb3IgaW1wcm92ZWQgdGhyZWFkIHNhZmV0eS4KK1dlIHN1Z2dlc3QgdXNpbmcgdGhlIGZhc3RlciwgZGVmYXVsdCAiZmFzdCIgc3R5bGUgdW5sZXNzIHlvdXIgdGVzdCBoYXMgc3BlY2lmaWMKK3Byb2JsZW1zIHdpdGggaXQuCisKK1lvdSBjYW4gY2hvb3NlIGEgcGFydGljdWxhciBzdHlsZSBvZiBkZWF0aCB0ZXN0cyBieSBzZXR0aW5nIHRoZSBmbGFnCitwcm9ncmFtbWF0aWNhbGx5OgorCitgYGAKKzo6dGVzdGluZzo6RkxBR1NfZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSA9ICJ0aHJlYWRzYWZlIjsKK2BgYAorCitZb3UgY2FuIGRvIHRoaXMgaW4gYG1haW4oKWAgdG8gc2V0IHRoZSBzdHlsZSBmb3IgYWxsIGRlYXRoIHRlc3RzIGluIHRoZQorYmluYXJ5LCBvciBpbiBpbmRpdmlkdWFsIHRlc3RzLiBSZWNhbGwgdGhhdCBmbGFncyBhcmUgc2F2ZWQgYmVmb3JlIHJ1bm5pbmcgZWFjaAordGVzdCBhbmQgcmVzdG9yZWQgYWZ0ZXJ3YXJkcywgc28geW91IG5lZWQgbm90IGRvIHRoYXQgeW91cnNlbGYuIEZvciBleGFtcGxlOgorCitgYGAKK1RFU1QoTXlEZWF0aFRlc3QsIFRlc3RPbmUpIHsKKyAgOjp0ZXN0aW5nOjpGTEFHU19ndGVzdF9kZWF0aF90ZXN0X3N0eWxlID0gInRocmVhZHNhZmUiOworICAvLyBUaGlzIHRlc3QgaXMgcnVuIGluIHRoZSAidGhyZWFkc2FmZSIgc3R5bGU6CisgIEFTU0VSVF9ERUFUSChUaGlzU2hvdWxkRGllKCksICIiKTsKK30KKworVEVTVChNeURlYXRoVGVzdCwgVGVzdFR3bykgeworICAvLyBUaGlzIHRlc3QgaXMgcnVuIGluIHRoZSAiZmFzdCIgc3R5bGU6CisgIEFTU0VSVF9ERUFUSChUaGlzU2hvdWxkRGllKCksICIiKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAiZmFzdCI7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CitgYGAKKworIyMgQ2F2ZWF0cyAjIworCitUaGUgX3N0YXRlbWVudF8gYXJndW1lbnQgb2YgYEFTU0VSVF9FWElUKClgIGNhbiBiZSBhbnkgdmFsaWQgQysrIHN0YXRlbWVudC4KK0lmIGl0IGxlYXZlcyB0aGUgY3VycmVudCBmdW5jdGlvbiB2aWEgYSBgcmV0dXJuYCBzdGF0ZW1lbnQgb3IgYnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLAordGhlIGRlYXRoIHRlc3QgaXMgY29uc2lkZXJlZCB0byBoYXZlIGZhaWxlZC4gIFNvbWUgR29vZ2xlIFRlc3QgbWFjcm9zIG1heSByZXR1cm4KK2Zyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24gKGUuZy4gYEFTU0VSVF9UUlVFKClgKSwgc28gYmUgc3VyZSB0byBhdm9pZCB0aGVtIGluIF9zdGF0ZW1lbnRfLgorCitTaW5jZSBfc3RhdGVtZW50XyBydW5zIGluIHRoZSBjaGlsZCBwcm9jZXNzLCBhbnkgaW4tbWVtb3J5IHNpZGUgZWZmZWN0IChlLmcuCittb2RpZnlpbmcgYSB2YXJpYWJsZSwgcmVsZWFzaW5nIG1lbW9yeSwgZXRjKSBpdCBjYXVzZXMgd2lsbCBfbm90XyBiZSBvYnNlcnZhYmxlCitpbiB0aGUgcGFyZW50IHByb2Nlc3MuIEluIHBhcnRpY3VsYXIsIGlmIHlvdSByZWxlYXNlIG1lbW9yeSBpbiBhIGRlYXRoIHRlc3QsCit5b3VyIHByb2dyYW0gd2lsbCBmYWlsIHRoZSBoZWFwIGNoZWNrIGFzIHRoZSBwYXJlbnQgcHJvY2VzcyB3aWxsIG5ldmVyIHNlZSB0aGUKK21lbW9yeSByZWNsYWltZWQuIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgeW91IGNhbgorCisgIDEuIHRyeSBub3QgdG8gZnJlZSBtZW1vcnkgaW4gYSBkZWF0aCB0ZXN0OworICAxLiBmcmVlIHRoZSBtZW1vcnkgYWdhaW4gaW4gdGhlIHBhcmVudCBwcm9jZXNzOyBvcgorICAxLiBkbyBub3QgdXNlIHRoZSBoZWFwIGNoZWNrZXIgaW4geW91ciBwcm9ncmFtLgorCitEdWUgdG8gYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCB5b3UgY2Fubm90IHBsYWNlIG11bHRpcGxlIGRlYXRoIHRlc3QKK2Fzc2VydGlvbnMgb24gdGhlIHNhbWUgbGluZTsgb3RoZXJ3aXNlLCBjb21waWxhdGlvbiB3aWxsIGZhaWwgd2l0aCBhbiB1bm9idmlvdXMKK2Vycm9yIG1lc3NhZ2UuCisKK0Rlc3BpdGUgdGhlIGltcHJvdmVkIHRocmVhZCBzYWZldHkgYWZmb3JkZWQgYnkgdGhlICJ0aHJlYWRzYWZlIiBzdHlsZSBvZiBkZWF0aAordGVzdCwgdGhyZWFkIHByb2JsZW1zIHN1Y2ggYXMgZGVhZGxvY2sgYXJlIHN0aWxsIHBvc3NpYmxlIGluIHRoZSBwcmVzZW5jZSBvZgoraGFuZGxlcnMgcmVnaXN0ZXJlZCB3aXRoIGBwdGhyZWFkX2F0Zm9yaygzKWAuCisKKyMgVXNpbmcgQXNzZXJ0aW9ucyBpbiBTdWItcm91dGluZXMgIworCisjIyBBZGRpbmcgVHJhY2VzIHRvIEFzc2VydGlvbnMgIyMKKworSWYgYSB0ZXN0IHN1Yi1yb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNldmVyYWwgcGxhY2VzLCB3aGVuIGFuIGFzc2VydGlvbgoraW5zaWRlIGl0IGZhaWxzLCBpdCBjYW4gYmUgaGFyZCB0byB0ZWxsIHdoaWNoIGludm9jYXRpb24gb2YgdGhlCitzdWItcm91dGluZSB0aGUgZmFpbHVyZSBpcyBmcm9tLiAgWW91IGNhbiBhbGxldmlhdGUgdGhpcyBwcm9ibGVtIHVzaW5nCitleHRyYSBsb2dnaW5nIG9yIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2VzLCBidXQgdGhhdCB1c3VhbGx5IGNsdXR0ZXJzIHVwCit5b3VyIHRlc3RzLiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byB1c2UgdGhlIGBTQ09QRURfVFJBQ0VgIG1hY3JvOgorCit8IGBTQ09QRURfVFJBQ0UoYF9tZXNzYWdlX2ApO2AgfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKword2hlcmUgX21lc3NhZ2VfIGNhbiBiZSBhbnl0aGluZyBzdHJlYW1hYmxlIHRvIGBzdGQ6Om9zdHJlYW1gLiBUaGlzCittYWNybyB3aWxsIGNhdXNlIHRoZSBjdXJyZW50IGZpbGUgbmFtZSwgbGluZSBudW1iZXIsIGFuZCB0aGUgZ2l2ZW4KK21lc3NhZ2UgdG8gYmUgYWRkZWQgaW4gZXZlcnkgZmFpbHVyZSBtZXNzYWdlLiBUaGUgZWZmZWN0IHdpbGwgYmUKK3VuZG9uZSB3aGVuIHRoZSBjb250cm9sIGxlYXZlcyB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlLgorCitGb3IgZXhhbXBsZSwKKworYGBgCisxMDogdm9pZCBTdWIxKGludCBuKSB7CisxMTogICBFWFBFQ1RfRVEoMSwgQmFyKG4pKTsKKzEyOiAgIEVYUEVDVF9FUSgyLCBCYXIobiArIDEpKTsKKzEzOiB9CisxNDogCisxNTogVEVTVChGb29UZXN0LCBCYXIpIHsKKzE2OiAgIHsKKzE3OiAgICAgU0NPUEVEX1RSQUNFKCJBIik7ICAvLyBUaGlzIHRyYWNlIHBvaW50IHdpbGwgYmUgaW5jbHVkZWQgaW4KKzE4OiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBmYWlsdXJlIGluIHRoaXMgc2NvcGUuCisxOTogICAgIFN1YjEoMSk7CisyMDogICB9CisyMTogICAvLyBOb3cgaXQgd29uJ3QuCisyMjogICBTdWIxKDkpOworMjM6IH0KK2BgYAorCitjb3VsZCByZXN1bHQgaW4gbWVzc2FnZXMgbGlrZSB0aGVzZToKKworYGBgCitwYXRoL3RvL2Zvb190ZXN0LmNjOjExOiBGYWlsdXJlCitWYWx1ZSBvZjogQmFyKG4pCitFeHBlY3RlZDogMQorICBBY3R1YWw6IDIKKyAgIFRyYWNlOgorcGF0aC90by9mb29fdGVzdC5jYzoxNzogQQorCitwYXRoL3RvL2Zvb190ZXN0LmNjOjEyOiBGYWlsdXJlCitWYWx1ZSBvZjogQmFyKG4gKyAxKQorRXhwZWN0ZWQ6IDIKKyAgQWN0dWFsOiAzCitgYGAKKworV2l0aG91dCB0aGUgdHJhY2UsIGl0IHdvdWxkJ3ZlIGJlZW4gZGlmZmljdWx0IHRvIGtub3cgd2hpY2ggaW52b2NhdGlvbgorb2YgYFN1YjEoKWAgdGhlIHR3byBmYWlsdXJlcyBjb21lIGZyb20gcmVzcGVjdGl2ZWx5LiAoWW91IGNvdWxkIGFkZCBhbgorZXh0cmEgbWVzc2FnZSB0byBlYWNoIGFzc2VydGlvbiBpbiBgU3ViMSgpYCB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgb2YKK2BuYCwgYnV0IHRoYXQncyB0ZWRpb3VzLikKKworU29tZSB0aXBzIG9uIHVzaW5nIGBTQ09QRURfVFJBQ0VgOgorCisgIDEuIFdpdGggYSBzdWl0YWJsZSBtZXNzYWdlLCBpdCdzIG9mdGVuIGVub3VnaCB0byB1c2UgYFNDT1BFRF9UUkFDRWAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHN1Yi1yb3V0aW5lLCBpbnN0ZWFkIG9mIGF0IGVhY2ggY2FsbCBzaXRlLgorICAxLiBXaGVuIGNhbGxpbmcgc3ViLXJvdXRpbmVzIGluc2lkZSBhIGxvb3AsIG1ha2UgdGhlIGxvb3AgaXRlcmF0b3IgcGFydCBvZiB0aGUgbWVzc2FnZSBpbiBgU0NPUEVEX1RSQUNFYCBzdWNoIHRoYXQgeW91IGNhbiBrbm93IHdoaWNoIGl0ZXJhdGlvbiB0aGUgZmFpbHVyZSBpcyBmcm9tLgorICAxLiBTb21ldGltZXMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0cmFjZSBwb2ludCBpcyBlbm91Z2ggZm9yIGlkZW50aWZ5aW5nIHRoZSBwYXJ0aWN1bGFyIGludm9jYXRpb24gb2YgYSBzdWItcm91dGluZS4gSW4gdGhpcyBjYXNlLCB5b3UgZG9uJ3QgaGF2ZSB0byBjaG9vc2UgYSB1bmlxdWUgbWVzc2FnZSBmb3IgYFNDT1BFRF9UUkFDRWAuIFlvdSBjYW4gc2ltcGx5IHVzZSBgIiJgLgorICAxLiBZb3UgY2FuIHVzZSBgU0NPUEVEX1RSQUNFYCBpbiBhbiBpbm5lciBzY29wZSB3aGVuIHRoZXJlIGlzIG9uZSBpbiB0aGUgb3V0ZXIgc2NvcGUuIEluIHRoaXMgY2FzZSwgYWxsIGFjdGl2ZSB0cmFjZSBwb2ludHMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlcywgaW4gcmV2ZXJzZSBvcmRlciB0aGV5IGFyZSBlbmNvdW50ZXJlZC4KKyAgMS4gVGhlIHRyYWNlIGR1bXAgaXMgY2xpY2thYmxlIGluIEVtYWNzJyBjb21waWxhdGlvbiBidWZmZXIgLSBoaXQgcmV0dXJuIG9uIGEgbGluZSBudW1iZXIgYW5kIHlvdSdsbCBiZSB0YWtlbiB0byB0aGF0IGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIQorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMgUHJvcGFnYXRpbmcgRmF0YWwgRmFpbHVyZXMgIyMKKworQSBjb21tb24gcGl0ZmFsbCB3aGVuIHVzaW5nIGBBU1NFUlRfKmAgYW5kIGBGQUlMKmAgaXMgbm90IHVuZGVyc3RhbmRpbmcgdGhhdAord2hlbiB0aGV5IGZhaWwgdGhleSBvbmx5IGFib3J0IHRoZSBfY3VycmVudCBmdW5jdGlvbl8sIG5vdCB0aGUgZW50aXJlIHRlc3QuIEZvcgorZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0ZXN0IHdpbGwgc2VnZmF1bHQ6CitgYGAKK3ZvaWQgU3Vicm91dGluZSgpIHsKKyAgLy8gR2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSBhbmQgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBBU1NFUlRfRVEoMSwgMik7CisgIC8vIFRoZSBmb2xsb3dpbmcgd29uJ3QgYmUgZXhlY3V0ZWQuCisgIC4uLgorfQorCitURVNUKEZvb1Rlc3QsIEJhcikgeworICBTdWJyb3V0aW5lKCk7CisgIC8vIFRoZSBpbnRlbmRlZCBiZWhhdmlvciBpcyBmb3IgdGhlIGZhdGFsIGZhaWx1cmUKKyAgLy8gaW4gU3Vicm91dGluZSgpIHRvIGFib3J0IHRoZSBlbnRpcmUgdGVzdC4KKyAgLy8gVGhlIGFjdHVhbCBiZWhhdmlvcjogdGhlIGZ1bmN0aW9uIGdvZXMgb24gYWZ0ZXIgU3Vicm91dGluZSgpIHJldHVybnMuCisgIGludCogcCA9IE5VTEw7CisgICpwID0gMzsgLy8gU2VnZmF1bHQhCit9CitgYGAKKworU2luY2Ugd2UgZG9uJ3QgdXNlIGV4Y2VwdGlvbnMsIGl0IGlzIHRlY2huaWNhbGx5IGltcG9zc2libGUgdG8KK2ltcGxlbWVudCB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgaGVyZS4gIFRvIGFsbGV2aWF0ZSB0aGlzLCBHb29nbGUgVGVzdAorcHJvdmlkZXMgdHdvIHNvbHV0aW9ucy4gIFlvdSBjb3VsZCB1c2UgZWl0aGVyIHRoZQorYChBU1NFUlR8RVhQRUNUKV9OT19GQVRBTF9GQUlMVVJFYCBhc3NlcnRpb25zIG9yIHRoZQorYEhhc0ZhdGFsRmFpbHVyZSgpYCBmdW5jdGlvbi4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHR3bworc3Vic2VjdGlvbnMuCisKKyMjIyBBc3NlcnRpbmcgb24gU3Vicm91dGluZXMgIyMjCisKK0FzIHNob3duIGFib3ZlLCBpZiB5b3VyIHRlc3QgY2FsbHMgYSBzdWJyb3V0aW5lIHRoYXQgaGFzIGFuIGBBU1NFUlRfKmAKK2ZhaWx1cmUgaW4gaXQsIHRoZSB0ZXN0IHdpbGwgY29udGludWUgYWZ0ZXIgdGhlIHN1YnJvdXRpbmUKK3JldHVybnMuIFRoaXMgbWF5IG5vdCBiZSB3aGF0IHlvdSB3YW50LgorCitPZnRlbiBwZW9wbGUgd2FudCBmYXRhbCBmYWlsdXJlcyB0byBwcm9wYWdhdGUgbGlrZSBleGNlcHRpb25zLiAgRm9yCit0aGF0IEdvb2dsZSBUZXN0IG9mZmVycyB0aGUgZm9sbG93aW5nIG1hY3JvczoKKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGBfc3RhdGVtZW50X2ApO2AgfCBgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoYF9zdGF0ZW1lbnRfYCk7YCB8IF9zdGF0ZW1lbnRfIGRvZXNuJ3QgZ2VuZXJhdGUgYW55IG5ldyBmYXRhbCBmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuIHwKKworT25seSBmYWlsdXJlcyBpbiB0aGUgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgdGhlIGFzc2VydGlvbiBhcmUgY2hlY2tlZCB0bworZGV0ZXJtaW5lIHRoZSByZXN1bHQgb2YgdGhpcyB0eXBlIG9mIGFzc2VydGlvbnMuICBJZiBfc3RhdGVtZW50XworY3JlYXRlcyBuZXcgdGhyZWFkcywgZmFpbHVyZXMgaW4gdGhlc2UgdGhyZWFkcyBhcmUgaWdub3JlZC4KKworRXhhbXBsZXM6CisKK2BgYAorQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRm9vKCkpOworCitpbnQgaTsKK0VYUEVDVF9OT19GQVRBTF9GQUlMVVJFKHsKKyAgaSA9IEJhcigpOworfSk7CitgYGAKKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuIEFzc2VydGlvbnMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzCithcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCisKKyMjIyBDaGVja2luZyBmb3IgRmFpbHVyZXMgaW4gdGhlIEN1cnJlbnQgVGVzdCAjIyMKKworYEhhc0ZhdGFsRmFpbHVyZSgpYCBpbiB0aGUgYDo6dGVzdGluZzo6VGVzdGAgY2xhc3MgcmV0dXJucyBgdHJ1ZWAgaWYgYW4KK2Fzc2VydGlvbiBpbiB0aGUgY3VycmVudCB0ZXN0IGhhcyBzdWZmZXJlZCBhIGZhdGFsIGZhaWx1cmUuIFRoaXMKK2FsbG93cyBmdW5jdGlvbnMgdG8gY2F0Y2ggZmF0YWwgZmFpbHVyZXMgaW4gYSBzdWItcm91dGluZSBhbmQgcmV0dXJuCitlYXJseS4KKworYGBgCitjbGFzcyBUZXN0IHsKKyBwdWJsaWM6CisgIC4uLgorICBzdGF0aWMgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKTsKK307CitgYGAKKworVGhlIHR5cGljYWwgdXNhZ2UsIHdoaWNoIGJhc2ljYWxseSBzaW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIGEgdGhyb3duCitleGNlcHRpb24sIGlzOgorCitgYGAKK1RFU1QoRm9vVGVzdCwgQmFyKSB7CisgIFN1YnJvdXRpbmUoKTsKKyAgLy8gQWJvcnRzIGlmIFN1YnJvdXRpbmUoKSBoYWQgYSBmYXRhbCBmYWlsdXJlLgorICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpCisgICAgcmV0dXJuOworICAvLyBUaGUgZm9sbG93aW5nIHdvbid0IGJlIGV4ZWN1dGVkLgorICAuLi4KK30KK2BgYAorCitJZiBgSGFzRmF0YWxGYWlsdXJlKClgIGlzIHVzZWQgb3V0c2lkZSBvZiBgVEVTVCgpYCAsIGBURVNUX0YoKWAgLCBvciBhIHRlc3QKK2ZpeHR1cmUsIHlvdSBtdXN0IGFkZCB0aGUgYDo6dGVzdGluZzo6VGVzdDo6YCBwcmVmaXgsIGFzIGluOgorCitgYGAKK2lmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKQorICByZXR1cm47CitgYGAKKworU2ltaWxhcmx5LCBgSGFzTm9uZmF0YWxGYWlsdXJlKClgIHJldHVybnMgYHRydWVgIGlmIHRoZSBjdXJyZW50IHRlc3QKK2hhcyBhdCBsZWFzdCBvbmUgbm9uLWZhdGFsIGZhaWx1cmUsIGFuZCBgSGFzRmFpbHVyZSgpYCByZXR1cm5zIGB0cnVlYAoraWYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYXQgbGVhc3Qgb25lIGZhaWx1cmUgb2YgZWl0aGVyIGtpbmQuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLiAgYEhhc05vbmZhdGFsRmFpbHVyZSgpYCBhbmQKK2BIYXNGYWlsdXJlKClgIGFyZSBhdmFpbGFibGUgc2luY2UgdmVyc2lvbiAxLjQuMC4KKworIyBMb2dnaW5nIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24gIworCitJbiB5b3VyIHRlc3QgY29kZSwgeW91IGNhbiBjYWxsIGBSZWNvcmRQcm9wZXJ0eSgia2V5IiwgdmFsdWUpYCB0byBsb2cKK2FkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHdoZXJlIGB2YWx1ZWAgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBgaW50YC4gVGhlIF9sYXN0XyB2YWx1ZSByZWNvcmRlZCBmb3IgYSBrZXkgd2lsbCBiZSBlbWl0dGVkIHRvIHRoZSBYTUwgb3V0cHV0CitpZiB5b3Ugc3BlY2lmeSBvbmUuIEZvciBleGFtcGxlLCB0aGUgdGVzdAorCitgYGAKK1RFU1RfRihXaWRnZXRVc2FnZVRlc3QsIE1pbkFuZE1heFdpZGdldHMpIHsKKyAgUmVjb3JkUHJvcGVydHkoIk1heGltdW1XaWRnZXRzIiwgQ29tcHV0ZU1heFVzYWdlKCkpOworICBSZWNvcmRQcm9wZXJ0eSgiTWluaW11bVdpZGdldHMiLCBDb21wdXRlTWluVXNhZ2UoKSk7Cit9CitgYGAKKword2lsbCBvdXRwdXQgWE1MIGxpa2UgdGhpczoKKworYGBgCisuLi4KKyAgPHRlc3RjYXNlIG5hbWU9Ik1pbkFuZE1heFdpZGdldHMiIHN0YXR1cz0icnVuIiB0aW1lPSI2IiBjbGFzc25hbWU9IldpZGdldFVzYWdlVGVzdCIKKyAgICAgICAgICAgIE1heGltdW1XaWRnZXRzPSIxMiIKKyAgICAgICAgICAgIE1pbmltdW1XaWRnZXRzPSI5IiAvPgorLi4uCitgYGAKKworX05vdGVfOgorICAqIGBSZWNvcmRQcm9wZXJ0eSgpYCBpcyBhIHN0YXRpYyBtZW1iZXIgb2YgdGhlIGBUZXN0YCBjbGFzcy4gVGhlcmVmb3JlIGl0IG5lZWRzIHRvIGJlIHByZWZpeGVkIHdpdGggYDo6dGVzdGluZzo6VGVzdDo6YCBpZiB1c2VkIG91dHNpZGUgb2YgdGhlIGBURVNUYCBib2R5IGFuZCB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLgorICAqIGBrZXlgIG11c3QgYmUgYSB2YWxpZCBYTUwgYXR0cmlidXRlIG5hbWUsIGFuZCBjYW5ub3QgY29uZmxpY3Qgd2l0aCB0aGUgb25lcyBhbHJlYWR5IHVzZWQgYnkgR29vZ2xlIFRlc3QgKGBuYW1lYCwgYHN0YXR1c2AsIGB0aW1lYCwgYGNsYXNzbmFtZWAsIGB0eXBlX3BhcmFtYCwgYW5kIGB2YWx1ZV9wYXJhbWApLgorICAqIENhbGxpbmcgYFJlY29yZFByb3BlcnR5KClgIG91dHNpZGUgb2YgdGhlIGxpZmVzcGFuIG9mIGEgdGVzdCBpcyBhbGxvd2VkLiBJZiBpdCdzIGNhbGxlZCBvdXRzaWRlIG9mIGEgdGVzdCBidXQgYmV0d2VlbiBhIHRlc3QgY2FzZSdzIGBTZXRVcFRlc3RDYXNlKClgIGFuZCBgVGVhckRvd25UZXN0Q2FzZSgpYCBtZXRob2RzLCBpdCB3aWxsIGJlIGF0dHJpYnV0ZWQgdG8gdGhlIFhNTCBlbGVtZW50IGZvciB0aGUgdGVzdCBjYXNlLiBJZiBpdCdzIGNhbGxlZCBvdXRzaWRlIG9mIGFsbCB0ZXN0IGNhc2VzIChlLmcuIGluIGEgdGVzdCBlbnZpcm9ubWVudCksIGl0IHdpbGwgYmUgYXR0cmlidXRlZCB0byB0aGUgdG9wLWxldmVsIFhNTCBlbGVtZW50LgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyBTaGFyaW5nIFJlc291cmNlcyBCZXR3ZWVuIFRlc3RzIGluIHRoZSBTYW1lIFRlc3QgQ2FzZSAjCisKKworCitHb29nbGUgVGVzdCBjcmVhdGVzIGEgbmV3IHRlc3QgZml4dHVyZSBvYmplY3QgZm9yIGVhY2ggdGVzdCBpbiBvcmRlciB0byBtYWtlCit0ZXN0cyBpbmRlcGVuZGVudCBhbmQgZWFzaWVyIHRvIGRlYnVnLiBIb3dldmVyLCBzb21ldGltZXMgdGVzdHMgdXNlIHJlc291cmNlcwordGhhdCBhcmUgZXhwZW5zaXZlIHRvIHNldCB1cCwgbWFraW5nIHRoZSBvbmUtY29weS1wZXItdGVzdCBtb2RlbCBwcm9oaWJpdGl2ZWx5CitleHBlbnNpdmUuCisKK0lmIHRoZSB0ZXN0cyBkb24ndCBjaGFuZ2UgdGhlIHJlc291cmNlLCB0aGVyZSdzIG5vIGhhcm0gaW4gdGhlbSBzaGFyaW5nIGEKK3NpbmdsZSByZXNvdXJjZSBjb3B5LiBTbywgaW4gYWRkaXRpb24gdG8gcGVyLXRlc3Qgc2V0LXVwL3RlYXItZG93biwgR29vZ2xlIFRlc3QKK2Fsc28gc3VwcG9ydHMgcGVyLXRlc3QtY2FzZSBzZXQtdXAvdGVhci1kb3duLiBUbyB1c2UgaXQ6CisKKyAgMS4gSW4geW91ciB0ZXN0IGZpeHR1cmUgY2xhc3MgKHNheSBgRm9vVGVzdGAgKSwgZGVmaW5lIGFzIGBzdGF0aWNgIHNvbWUgbWVtYmVyIHZhcmlhYmxlcyB0byBob2xkIHRoZSBzaGFyZWQgcmVzb3VyY2VzLgorICAxLiBJbiB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUgY2xhc3MsIGRlZmluZSBhIGBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKClgIGZ1bmN0aW9uIChyZW1lbWJlciBub3QgdG8gc3BlbGwgaXQgYXMgKipgU2V0dXBUZXN0Q2FzZWAqKiB3aXRoIGEgc21hbGwgYHVgISkgdG8gc2V0IHVwIHRoZSBzaGFyZWQgcmVzb3VyY2VzIGFuZCBhIGBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKClgIGZ1bmN0aW9uIHRvIHRlYXIgdGhlbSBkb3duLgorCitUaGF0J3MgaXQhIEdvb2dsZSBUZXN0IGF1dG9tYXRpY2FsbHkgY2FsbHMgYFNldFVwVGVzdENhc2UoKWAgYmVmb3JlIHJ1bm5pbmcgdGhlCitfZmlyc3QgdGVzdF8gaW4gdGhlIGBGb29UZXN0YCB0ZXN0IGNhc2UgKGkuZS4gYmVmb3JlIGNyZWF0aW5nIHRoZSBmaXJzdAorYEZvb1Rlc3RgIG9iamVjdCksIGFuZCBjYWxscyBgVGVhckRvd25UZXN0Q2FzZSgpYCBhZnRlciBydW5uaW5nIHRoZSBfbGFzdCB0ZXN0XworaW4gaXQgKGkuZS4gYWZ0ZXIgZGVsZXRpbmcgdGhlIGxhc3QgYEZvb1Rlc3RgIG9iamVjdCkuIEluIGJldHdlZW4sIHRoZSB0ZXN0cworY2FuIHVzZSB0aGUgc2hhcmVkIHJlc291cmNlcy4KKworUmVtZW1iZXIgdGhhdCB0aGUgdGVzdCBvcmRlciBpcyB1bmRlZmluZWQsIHNvIHlvdXIgY29kZSBjYW4ndCBkZXBlbmQgb24gYSB0ZXN0CitwcmVjZWRpbmcgb3IgZm9sbG93aW5nIGFub3RoZXIuIEFsc28sIHRoZSB0ZXN0cyBtdXN0IGVpdGhlciBub3QgbW9kaWZ5IHRoZQorc3RhdGUgb2YgYW55IHNoYXJlZCByZXNvdXJjZSwgb3IsIGlmIHRoZXkgZG8gbW9kaWZ5IHRoZSBzdGF0ZSwgdGhleSBtdXN0CityZXN0b3JlIHRoZSBzdGF0ZSB0byBpdHMgb3JpZ2luYWwgdmFsdWUgYmVmb3JlIHBhc3NpbmcgY29udHJvbCB0byB0aGUgbmV4dAordGVzdC4KKworSGVyZSdzIGFuIGV4YW1wbGUgb2YgcGVyLXRlc3QtY2FzZSBzZXQtdXAgYW5kIHRlYXItZG93bjoKK2BgYAorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gUGVyLXRlc3QtY2FzZSBzZXQtdXAuCisgIC8vIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIC8vIENhbiBiZSBvbWl0dGVkIGlmIG5vdCBuZWVkZWQuCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgc2hhcmVkX3Jlc291cmNlXyA9IG5ldyAuLi47CisgIH0KKworICAvLyBQZXItdGVzdC1jYXNlIHRlYXItZG93bi4KKyAgLy8gQ2FsbGVkIGFmdGVyIHRoZSBsYXN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIC8vIENhbiBiZSBvbWl0dGVkIGlmIG5vdCBuZWVkZWQuCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgZGVsZXRlIHNoYXJlZF9yZXNvdXJjZV87CisgICAgc2hhcmVkX3Jlc291cmNlXyA9IE5VTEw7CisgIH0KKworICAvLyBZb3UgY2FuIGRlZmluZSBwZXItdGVzdCBzZXQtdXAgYW5kIHRlYXItZG93biBsb2dpYyBhcyB1c3VhbC4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyAuLi4gfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IC4uLiB9CisKKyAgLy8gU29tZSBleHBlbnNpdmUgcmVzb3VyY2Ugc2hhcmVkIGJ5IGFsbCB0ZXN0cy4KKyAgc3RhdGljIFQqIHNoYXJlZF9yZXNvdXJjZV87Cit9OworCitUKiBGb29UZXN0OjpzaGFyZWRfcmVzb3VyY2VfID0gTlVMTDsKKworVEVTVF9GKEZvb1Rlc3QsIFRlc3QxKSB7CisgIC4uLiB5b3UgY2FuIHJlZmVyIHRvIHNoYXJlZF9yZXNvdXJjZSBoZXJlIC4uLgorfQorVEVTVF9GKEZvb1Rlc3QsIFRlc3QyKSB7CisgIC4uLiB5b3UgY2FuIHJlZmVyIHRvIHNoYXJlZF9yZXNvdXJjZSBoZXJlIC4uLgorfQorYGBgCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIEdsb2JhbCBTZXQtVXAgYW5kIFRlYXItRG93biAjCisKK0p1c3QgYXMgeW91IGNhbiBkbyBzZXQtdXAgYW5kIHRlYXItZG93biBhdCB0aGUgdGVzdCBsZXZlbCBhbmQgdGhlIHRlc3QgY2FzZQorbGV2ZWwsIHlvdSBjYW4gYWxzbyBkbyBpdCBhdCB0aGUgdGVzdCBwcm9ncmFtIGxldmVsLiBIZXJlJ3MgaG93LgorCitGaXJzdCwgeW91IHN1YmNsYXNzIHRoZSBgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudGAgY2xhc3MgdG8gZGVmaW5lIGEgdGVzdAorZW52aXJvbm1lbnQsIHdoaWNoIGtub3dzIGhvdyB0byBzZXQtdXAgYW5kIHRlYXItZG93bjoKKworYGBgCitjbGFzcyBFbnZpcm9ubWVudCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5FbnZpcm9ubWVudCgpIHt9CisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQorICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gdGVhciBkb3duIHRoZSBlbnZpcm9ubWVudC4KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkge30KK307CitgYGAKKworVGhlbiwgeW91IHJlZ2lzdGVyIGFuIGluc3RhbmNlIG9mIHlvdXIgZW52aXJvbm1lbnQgY2xhc3Mgd2l0aCBHb29nbGUgVGVzdCBieQorY2FsbGluZyB0aGUgYDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KClgIGZ1bmN0aW9uOgorCitgYGAKK0Vudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7CitgYGAKKworTm93LCB3aGVuIGBSVU5fQUxMX1RFU1RTKClgIGlzIGNhbGxlZCwgaXQgZmlyc3QgY2FsbHMgdGhlIGBTZXRVcCgpYCBtZXRob2Qgb2YKK3RoZSBlbnZpcm9ubWVudCBvYmplY3QsIHRoZW4gcnVucyB0aGUgdGVzdHMgaWYgdGhlcmUgd2FzIG5vIGZhdGFsIGZhaWx1cmVzLCBhbmQKK2ZpbmFsbHkgY2FsbHMgYFRlYXJEb3duKClgIG9mIHRoZSBlbnZpcm9ubWVudCBvYmplY3QuCisKK0l0J3MgT0sgdG8gcmVnaXN0ZXIgbXVsdGlwbGUgZW52aXJvbm1lbnQgb2JqZWN0cy4gSW4gdGhpcyBjYXNlLCB0aGVpciBgU2V0VXAoKWAKK3dpbGwgYmUgY2FsbGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWdpc3RlcmVkLCBhbmQgdGhlaXIgYFRlYXJEb3duKClgIHdpbGwgYmUKK2NhbGxlZCBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKworTm90ZSB0aGF0IEdvb2dsZSBUZXN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcmVnaXN0ZXJlZCBlbnZpcm9ubWVudCBvYmplY3RzLgorVGhlcmVmb3JlICoqZG8gbm90IGRlbGV0ZSB0aGVtKiogYnkgeW91cnNlbGYuCisKK1lvdSBzaG91bGQgY2FsbCBgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KClgIGJlZm9yZSBgUlVOX0FMTF9URVNUUygpYCBpcworY2FsbGVkLCBwcm9iYWJseSBpbiBgbWFpbigpYC4gSWYgeW91IHVzZSBgZ3Rlc3RfbWFpbmAsIHlvdSBuZWVkIHRvICAgICAgY2FsbAordGhpcyBiZWZvcmUgYG1haW4oKWAgc3RhcnRzIGZvciBpdCB0byB0YWtlIGVmZmVjdC4gT25lIHdheSB0byBkbyB0aGlzIGlzIHRvCitkZWZpbmUgYSBnbG9iYWwgdmFyaWFibGUgbGlrZSB0aGlzOgorCitgYGAKKzo6dGVzdGluZzo6RW52aXJvbm1lbnQqIGNvbnN0IGZvb19lbnYgPSA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworYGBgCisKK0hvd2V2ZXIsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB5b3UgdG8gd3JpdGUgeW91ciBvd24gYG1haW4oKWAgYW5kIGNhbGwKK2BBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKWAgdGhlcmUsIGFzIHJlbHlpbmcgb24gaW5pdGlhbGl6YXRpb24gb2YgZ2xvYmFsCit2YXJpYWJsZXMgbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQgYW5kIG1heSBjYXVzZSBwcm9ibGVtcyB3aGVuIHlvdQorcmVnaXN0ZXIgbXVsdGlwbGUgZW52aXJvbm1lbnRzIGZyb20gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGFuZCB0aGUKK2Vudmlyb25tZW50cyBoYXZlIGRlcGVuZGVuY2llcyBhbW9uZyB0aGVtIChyZW1lbWJlciB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0CitndWFyYW50ZWUgdGhlIG9yZGVyIGluIHdoaWNoIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMKK2FyZSBpbml0aWFsaXplZCkuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisKKyMgVmFsdWUgUGFyYW1ldGVyaXplZCBUZXN0cyAjCisKK19WYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzXyBhbGxvdyB5b3UgdG8gdGVzdCB5b3VyIGNvZGUgd2l0aCBkaWZmZXJlbnQKK3BhcmFtZXRlcnMgd2l0aG91dCB3cml0aW5nIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSB0ZXN0LgorCitTdXBwb3NlIHlvdSB3cml0ZSBhIHRlc3QgZm9yIHlvdXIgY29kZSBhbmQgdGhlbiByZWFsaXplIHRoYXQgeW91ciBjb2RlIGlzIGFmZmVjdGVkIGJ5IGEgcHJlc2VuY2Ugb2YgYSBCb29sZWFuIGNvbW1hbmQgbGluZSBmbGFnLgorCitgYGAKK1RFU1QoTXlDb2RlVGVzdCwgVGVzdEZvbykgeworICAvLyBBIGNvZGUgdG8gdGVzdCBmb28oKS4KK30KK2BgYAorCitVc3VhbGx5IHBlb3BsZSBmYWN0b3IgdGhlaXIgdGVzdCBjb2RlIGludG8gYSBmdW5jdGlvbiB3aXRoIGEgQm9vbGVhbiBwYXJhbWV0ZXIgaW4gc3VjaCBzaXR1YXRpb25zLiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgZmxhZywgdGhlbiBleGVjdXRlcyB0aGUgdGVzdGluZyBjb2RlLgorCitgYGAKK3ZvaWQgVGVzdEZvb0hlbHBlcihib29sIGZsYWdfdmFsdWUpIHsKKyAgZmxhZyA9IGZsYWdfdmFsdWU7CisgIC8vIEEgY29kZSB0byB0ZXN0IGZvbygpLgorfQorCitURVNUKE15Q29kZVRlc3QsIFRlc3RGb28pIHsKKyAgVGVzdEZvb0hlbHBlcihmYWxzZSk7CisgIFRlc3RGb29IZWxwZXIodHJ1ZSk7Cit9CitgYGAKKworQnV0IHRoaXMgc2V0dXAgaGFzIHNlcmlvdXMgZHJhd2JhY2tzLiBGaXJzdCwgd2hlbiBhIHRlc3QgYXNzZXJ0aW9uIGZhaWxzIGluIHlvdXIgdGVzdHMsIGl0IGJlY29tZXMgdW5jbGVhciB3aGF0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgY2F1c2VkIGl0IHRvIGZhaWwuIFlvdSBjYW4gc3RyZWFtIGEgY2xhcmlmeWluZyBtZXNzYWdlIGludG8geW91ciBgRVhQRUNUYC9gQVNTRVJUYCBzdGF0ZW1lbnRzLCBidXQgaXQgeW91J2xsIGhhdmUgdG8gZG8gaXQgd2l0aCBhbGwgb2YgdGhlbS4gU2Vjb25kLCB5b3UgaGF2ZSB0byBhZGQgb25lIHN1Y2ggaGVscGVyIGZ1bmN0aW9uIHBlciB0ZXN0LiBXaGF0IGlmIHlvdSBoYXZlIHRlbiB0ZXN0cz8gVHdlbnR5PyBBIGh1bmRyZWQ/CisKK1ZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgd2lsbCBsZXQgeW91IHdyaXRlIHlvdXIgdGVzdCBvbmx5IG9uY2UgYW5kIHRoZW4gZWFzaWx5IGluc3RhbnRpYXRlIGFuZCBydW4gaXQgd2l0aCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHBhcmFtZXRlciB2YWx1ZXMuCisKK0hlcmUgYXJlIHNvbWUgb3RoZXIgc2l0dWF0aW9ucyB3aGVuIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgY29tZSBoYW5keToKKworICAqIFlvdSB3YW50IHRvIHRlc3QgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBhbiBPTyBpbnRlcmZhY2UuCisgICogWW91IHdhbnQgdG8gdGVzdCB5b3VyIGNvZGUgb3ZlciB2YXJpb3VzIGlucHV0cyAoYS5rLmEuIGRhdGEtZHJpdmVuIHRlc3RpbmcpLiBUaGlzIGZlYXR1cmUgaXMgZWFzeSB0byBhYnVzZSwgc28gcGxlYXNlIGV4ZXJjaXNlIHlvdXIgZ29vZCBzZW5zZSB3aGVuIGRvaW5nIGl0IQorCisjIyBIb3cgdG8gV3JpdGUgVmFsdWUtUGFyYW1ldGVyaXplZCBUZXN0cyAjIworCitUbyB3cml0ZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCBmaXJzdCB5b3Ugc2hvdWxkIGRlZmluZSBhIGZpeHR1cmUKK2NsYXNzLiAgSXQgbXVzdCBiZSBkZXJpdmVkIGZyb20gYm90aCBgOjp0ZXN0aW5nOjpUZXN0YCBhbmQKK2A6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPmAgKHRoZSBsYXR0ZXIgaXMgYSBwdXJlIGludGVyZmFjZSksCit3aGVyZSBgVGAgaXMgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLiAgRm9yIGNvbnZlbmllbmNlLCB5b3UKK2NhbiBqdXN0IGRlcml2ZSB0aGUgZml4dHVyZSBjbGFzcyBmcm9tIGA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD5gLAord2hpY2ggaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBib3RoIGA6OnRlc3Rpbmc6OlRlc3RgIGFuZAorYDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPFQ+YC4gYFRgIGNhbiBiZSBhbnkgY29weWFibGUgdHlwZS4gSWYKK2l0J3MgYSByYXcgcG9pbnRlciwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIGxpZmVzcGFuIG9mCit0aGUgcG9pbnRlZCB2YWx1ZXMuCisKK2BgYAorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKKyAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBmaXh0dXJlIGNsYXNzIG1lbWJlcnMgaGVyZS4KKyAgLy8gVG8gYWNjZXNzIHRoZSB0ZXN0IHBhcmFtZXRlciwgY2FsbCBHZXRQYXJhbSgpIGZyb20gY2xhc3MKKyAgLy8gVGVzdFdpdGhQYXJhbTxUPi4KK307CisKKy8vIE9yLCB3aGVuIHlvdSB3YW50IHRvIGFkZCBwYXJhbWV0ZXJzIHRvIGEgcHJlLWV4aXN0aW5nIGZpeHR1cmUgY2xhc3M6CitjbGFzcyBCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAuLi4KK307CitjbGFzcyBCYXJUZXN0IDogcHVibGljIEJhc2VUZXN0LAorICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxjb25zdCBjaGFyKj4geworICAuLi4KK307CitgYGAKKworVGhlbiwgdXNlIHRoZSBgVEVTVF9QYCBtYWNybyB0byBkZWZpbmUgYXMgbWFueSB0ZXN0IHBhdHRlcm5zIHVzaW5nCit0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuICBUaGUgYF9QYCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvcgorInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KKworYGBgCitURVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgYWNjZXNzIHRoZSB0ZXN0IHBhcmFtZXRlciB3aXRoIHRoZSBHZXRQYXJhbSgpIG1ldGhvZAorICAvLyBvZiB0aGUgVGVzdFdpdGhQYXJhbTxUPiBjbGFzczoKKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworICAuLi4KK30KKworVEVTVF9QKEZvb1Rlc3QsIEhhc0JsYWhCbGFoKSB7CisgIC4uLgorfQorYGBgCisKK0ZpbmFsbHksIHlvdSBjYW4gdXNlIGBJTlNUQU5USUFURV9URVNUX0NBU0VfUGAgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKK2Nhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIgb2YKK2Z1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAorKHN1cnByaXNlISkgX3BhcmFtZXRlciBnZW5lcmF0b3JzXy4gSGVyZSBpcyBhIHN1bW1hcnkgb2YgdGhlbSwKK3doaWNoIGFyZSBhbGwgaW4gdGhlIGB0ZXN0aW5nYCBuYW1lc3BhY2U6CisKK3wgYFJhbmdlKGJlZ2luLCBlbmRbLCBzdGVwXSlgIHwgWWllbGRzIHZhbHVlcyBge2JlZ2luLCBiZWdpbitzdGVwLCBiZWdpbitzdGVwK3N0ZXAsIC4uLn1gLiBUaGUgdmFsdWVzIGRvIG5vdCBpbmNsdWRlIGBlbmRgLiBgc3RlcGAgZGVmYXVsdHMgdG8gMS4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKWAgICB8IFlpZWxkcyB2YWx1ZXMgYHt2MSwgdjIsIC4uLiwgdk59YC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYFZhbHVlc0luKGNvbnRhaW5lcilgIGFuZCBgVmFsdWVzSW4oYmVnaW4sIGVuZClgIHwgWWllbGRzIHZhbHVlcyBmcm9tIGEgQy1zdHlsZSBhcnJheSwgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgYFtiZWdpbiwgZW5kKWAuIGBjb250YWluZXJgLCBgYmVnaW5gLCBhbmQgYGVuZGAgY2FuIGJlIGV4cHJlc3Npb25zIHdob3NlIHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBhdCBydW4gdGltZS4gIHwKK3wgYEJvb2woKWAgICAgICAgICAgICAgICAgICAgIHwgWWllbGRzIHNlcXVlbmNlIGB7ZmFsc2UsIHRydWV9YC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pYCAgfCBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0IGZvciB0aGUgbWF0aCBzYXZ2eSkgb2YgdGhlIHZhbHVlcyBnZW5lcmF0ZWQgYnkgdGhlIGBOYCBnZW5lcmF0b3JzLiBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdXIgc3lzdGVtIHByb3ZpZGVzIHRoZSBgPHRyMS90dXBsZT5gIGhlYWRlci4gSWYgeW91IGFyZSBzdXJlIHlvdXIgc3lzdGVtIGRvZXMsIGFuZCBHb29nbGUgVGVzdCBkaXNhZ3JlZXMsIHlvdSBjYW4gb3ZlcnJpZGUgaXQgYnkgZGVmaW5pbmcgYEdURVNUX0hBU19UUjFfVFVQTEU9MWAuIFNlZSBjb21tZW50cyBpbiBbaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmhdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgpIGZvciBtb3JlIGluZm9ybWF0aW9uLiB8CisKK0ZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgY29tbWVudHMgYXQgdGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgW3NvdXJjZSBjb2RlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oKS4KKworVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBgRm9vVGVzdGAgdGVzdCBjYXNlCitlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyBgIm1lZW55ImAsIGAibWlueSJgLCBhbmQgYCJtb2UiYC4KKworYGBgCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnN0YW50aWF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvb1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7CitgYGAKKworVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiAoeWVzLCB5b3UgY2FuCitpbnN0YW50aWF0ZSBpdCBtb3JlIHRoYW4gb25jZSksIHRoZSBmaXJzdCBhcmd1bWVudCB0bworYElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QYCBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGFjdHVhbAordGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKK2luc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUgdGhlc2UKK25hbWVzOgorCisgICogYEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMGAgZm9yIGAibWVlbnkiYAorICAqIGBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzFgIGZvciBgIm1pbnkiYAorICAqIGBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzJgIGZvciBgIm1vZSJgCisgICogYEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMGAgZm9yIGAibWVlbnkiYAorICAqIGBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzFgIGZvciBgIm1pbnkiYAorICAqIGBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzJgIGZvciBgIm1vZSJgCisKK1lvdSBjYW4gdXNlIHRoZXNlIG5hbWVzIGluIFstLWd0ZXN0XF9maWx0ZXJdKCNSdW5uaW5nX2FfU3Vic2V0X29mX3RoZV9UZXN0cy5tZCkuCisKK1RoaXMgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzIGZyb20gYEZvb1Rlc3RgIGFnYWluLCBlYWNoCit3aXRoIHBhcmFtZXRlciB2YWx1ZXMgYCJjYXQiYCBhbmQgYCJkb2ciYDoKKworYGBgCitjb25zdCBjaGFyKiBwZXRzW10gPSB7ImNhdCIsICJkb2cifTsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZSwgRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4ocGV0cykpOworYGBgCisKK1RoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKKworICAqIGBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wYCBmb3IgYCJjYXQiYAorICAqIGBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xYCBmb3IgYCJkb2ciYAorICAqIGBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wYCBmb3IgYCJjYXQiYAorICAqIGBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xYCBmb3IgYCJkb2ciYAorCitQbGVhc2Ugbm90ZSB0aGF0IGBJTlNUQU5USUFURV9URVNUX0NBU0VfUGAgd2lsbCBpbnN0YW50aWF0ZSBfYWxsXwordGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgorX2FmdGVyXyB0aGUgYElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QYCBzdGF0ZW1lbnQuCisKK1lvdSBjYW4gc2VlCitbdGhlc2VdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjKQorW2ZpbGVzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYykgZm9yIG1vcmUgZXhhbXBsZXMuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cyAocmVxdWlyZXMgTVNWQyA4LjAgb3IgYWJvdmUpLCBNYWM7IHNpbmNlIHZlcnNpb24gMS4yLjAuCisKKyMjIENyZWF0aW5nIFZhbHVlLVBhcmFtZXRlcml6ZWQgQWJzdHJhY3QgVGVzdHMgIyMKKworSW4gdGhlIGFib3ZlLCB3ZSBkZWZpbmUgYW5kIGluc3RhbnRpYXRlIGBGb29UZXN0YCBpbiB0aGUgc2FtZSBzb3VyY2UKK2ZpbGUuIFNvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdG8gZGVmaW5lIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW4gYQorbGlicmFyeSBhbmQgbGV0IG90aGVyIHBlb3BsZSBpbnN0YW50aWF0ZSB0aGVtIGxhdGVyLiBUaGlzIHBhdHRlcm4gaXMKK2tub3duIGFzIDxpPmFic3RyYWN0IHRlc3RzPC9pPi4gQXMgYW4gZXhhbXBsZSBvZiBpdHMgYXBwbGljYXRpb24sIHdoZW4geW91CithcmUgZGVzaWduaW5nIGFuIGludGVyZmFjZSB5b3UgY2FuIHdyaXRlIGEgc3RhbmRhcmQgc3VpdGUgb2YgYWJzdHJhY3QKK3Rlc3RzIChwZXJoYXBzIHVzaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiBhcyB0aGUgdGVzdCBwYXJhbWV0ZXIpIHRoYXQKK2FsbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGludGVyZmFjZSBhcmUgZXhwZWN0ZWQgdG8gcGFzcy4gV2hlbgorc29tZW9uZSBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UsIGhlIGNhbiBpbnN0YW50aWF0ZSB5b3VyIHN1aXRlIHRvIGdldAorYWxsIHRoZSBpbnRlcmZhY2UtY29uZm9ybWFuY2UgdGVzdHMgZm9yIGZyZWUuCisKK1RvIGRlZmluZSBhYnN0cmFjdCB0ZXN0cywgeW91IHNob3VsZCBvcmdhbml6ZSB5b3VyIGNvZGUgbGlrZSB0aGlzOgorCisgIDEuIFB1dCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcGFyYW1ldGVyaXplZCB0ZXN0IGZpeHR1cmUgY2xhc3MgKGUuZy4gYEZvb1Rlc3RgKSBpbiBhIGhlYWRlciBmaWxlLCBzYXkgYGZvb19wYXJhbV90ZXN0LmhgLiBUaGluayBvZiB0aGlzIGFzIF9kZWNsYXJpbmdfIHlvdXIgYWJzdHJhY3QgdGVzdHMuCisgIDEuIFB1dCB0aGUgYFRFU1RfUGAgZGVmaW5pdGlvbnMgaW4gYGZvb19wYXJhbV90ZXN0LmNjYCwgd2hpY2ggaW5jbHVkZXMgYGZvb19wYXJhbV90ZXN0LmhgLiBUaGluayBvZiB0aGlzIGFzIF9pbXBsZW1lbnRpbmdfIHlvdXIgYWJzdHJhY3QgdGVzdHMuCisKK09uY2UgdGhleSBhcmUgZGVmaW5lZCwgeW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtIGJ5IGluY2x1ZGluZworYGZvb19wYXJhbV90ZXN0LmhgLCBpbnZva2luZyBgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoKWAsIGFuZCBsaW5raW5nCit3aXRoIGBmb29fcGFyYW1fdGVzdC5jY2AuIFlvdSBjYW4gaW5zdGFudGlhdGUgdGhlIHNhbWUgYWJzdHJhY3QgdGVzdAorY2FzZSBtdWx0aXBsZSB0aW1lcywgcG9zc2libHkgaW4gZGlmZmVyZW50IHNvdXJjZSBmaWxlcy4KKworIyBUeXBlZCBUZXN0cyAjCisKK1N1cHBvc2UgeW91IGhhdmUgbXVsdGlwbGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzYW1lIGludGVyZmFjZSBhbmQKK3dhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZW0gc2F0aXNmeSBzb21lIGNvbW1vbiByZXF1aXJlbWVudHMuCitPciwgeW91IG1heSBoYXZlIGRlZmluZWQgc2V2ZXJhbCB0eXBlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBjb25mb3JtIHRvCit0aGUgc2FtZSAiY29uY2VwdCIgYW5kIHlvdSB3YW50IHRvIHZlcmlmeSBpdC4gIEluIGJvdGggY2FzZXMsIHlvdSB3YW50Cit0aGUgc2FtZSB0ZXN0IGxvZ2ljIHJlcGVhdGVkIGZvciBkaWZmZXJlbnQgdHlwZXMuCisKK1doaWxlIHlvdSBjYW4gd3JpdGUgb25lIGBURVNUYCBvciBgVEVTVF9GYCBmb3IgZWFjaCB0eXBlIHlvdSB3YW50IHRvCit0ZXN0IChhbmQgeW91IG1heSBldmVuIGZhY3RvciB0aGUgdGVzdCBsb2dpYyBpbnRvIGEgZnVuY3Rpb24gdGVtcGxhdGUKK3RoYXQgeW91IGludm9rZSBmcm9tIHRoZSBgVEVTVGApLCBpdCdzIHRlZGlvdXMgYW5kIGRvZXNuJ3Qgc2NhbGU6CitpZiB5b3Ugd2FudCBfbV8gdGVzdHMgb3ZlciBfbl8gdHlwZXMsIHlvdSdsbCBlbmQgdXAgd3JpdGluZyBfbVwqbl8KK2BURVNUYHMuCisKK19UeXBlZCB0ZXN0c18gYWxsb3cgeW91IHRvIHJlcGVhdCB0aGUgc2FtZSB0ZXN0IGxvZ2ljIG92ZXIgYSBsaXN0IG9mCit0eXBlcy4gIFlvdSBvbmx5IG5lZWQgdG8gd3JpdGUgdGhlIHRlc3QgbG9naWMgb25jZSwgYWx0aG91Z2ggeW91IG11c3QKK2tub3cgdGhlIHR5cGUgbGlzdCB3aGVuIHdyaXRpbmcgdHlwZWQgdGVzdHMuICBIZXJlJ3MgaG93IHlvdSBkbyBpdDoKKworRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZAorYnkgYSB0eXBlLiAgUmVtZW1iZXIgdG8gZGVyaXZlIGl0IGZyb20gYDo6dGVzdGluZzo6VGVzdGA6CisKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICAuLi4KKyAgdHlwZWRlZiBzdGQ6Omxpc3Q8VD4gTGlzdDsKKyAgc3RhdGljIFQgc2hhcmVkXzsKKyAgVCB2YWx1ZV87Cit9OworYGBgCisKK05leHQsIGFzc29jaWF0ZSBhIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGUgdGVzdCBjYXNlLCB3aGljaCB3aWxsIGJlCityZXBlYXRlZCBmb3IgZWFjaCB0eXBlIGluIHRoZSBsaXN0OgorCitgYGAKK3R5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxjaGFyLCBpbnQsIHVuc2lnbmVkIGludD4gTXlUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShGb29UZXN0LCBNeVR5cGVzKTsKK2BgYAorCitUaGUgYHR5cGVkZWZgIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGBUWVBFRF9URVNUX0NBU0VgIG1hY3JvIHRvIHBhcnNlCitjb3JyZWN0bHkuICBPdGhlcndpc2UgdGhlIGNvbXBpbGVyIHdpbGwgdGhpbmsgdGhhdCBlYWNoIGNvbW1hIGluIHRoZQordHlwZSBsaXN0IGludHJvZHVjZXMgYSBuZXcgbWFjcm8gYXJndW1lbnQuCisKK1RoZW4sIHVzZSBgVFlQRURfVEVTVCgpYCBpbnN0ZWFkIG9mIGBURVNUX0YoKWAgdG8gZGVmaW5lIGEgdHlwZWQgdGVzdAorZm9yIHRoaXMgdGVzdCBjYXNlLiAgWW91IGNhbiByZXBlYXQgdGhpcyBhcyBtYW55IHRpbWVzIGFzIHlvdSB3YW50OgorCitgYGAKK1RZUEVEX1RFU1QoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gdGhlIHNwZWNpYWwgbmFtZSBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlCisgIC8vIHBhcmFtZXRlci4gIFNpbmNlIHdlIGFyZSBpbnNpZGUgYSBkZXJpdmVkIGNsYXNzIHRlbXBsYXRlLCBDKysgcmVxdWlyZXMKKyAgLy8gdXMgdG8gdmlzaXQgdGhlIG1lbWJlcnMgb2YgRm9vVGVzdCB2aWEgJ3RoaXMnLgorICBUeXBlUGFyYW0gbiA9IHRoaXMtPnZhbHVlXzsKKworICAvLyBUbyB2aXNpdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSwgYWRkIHRoZSAnVGVzdEZpeHR1cmU6OicKKyAgLy8gcHJlZml4LgorICBuICs9IFRlc3RGaXh0dXJlOjpzaGFyZWRfOworCisgIC8vIFRvIHJlZmVyIHRvIHR5cGVkZWZzIGluIHRoZSBmaXh0dXJlLCBhZGQgdGhlICd0eXBlbmFtZSBUZXN0Rml4dHVyZTo6JworICAvLyBwcmVmaXguICBUaGUgJ3R5cGVuYW1lJyBpcyByZXF1aXJlZCB0byBzYXRpc2Z5IHRoZSBjb21waWxlci4KKyAgdHlwZW5hbWUgVGVzdEZpeHR1cmU6Okxpc3QgdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKG4pOworICAuLi4KK30KKworVFlQRURfVEVTVChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KK2BgYAorCitZb3UgY2FuIHNlZSBgc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjYCBmb3IgYSBjb21wbGV0ZSBleGFtcGxlLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MgKHJlcXVpcmVzIE1TVkMgOC4wIG9yIGFib3ZlKSwgTWFjOworc2luY2UgdmVyc2lvbiAxLjEuMC4KKworIyBUeXBlLVBhcmFtZXRlcml6ZWQgVGVzdHMgIworCitfVHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzXyBhcmUgbGlrZSB0eXBlZCB0ZXN0cywgZXhjZXB0IHRoYXQgdGhleQorZG9uJ3QgcmVxdWlyZSB5b3UgdG8ga25vdyB0aGUgbGlzdCBvZiB0eXBlcyBhaGVhZCBvZiB0aW1lLiAgSW5zdGVhZCwKK3lvdSBjYW4gZGVmaW5lIHRoZSB0ZXN0IGxvZ2ljIGZpcnN0IGFuZCBpbnN0YW50aWF0ZSBpdCB3aXRoIGRpZmZlcmVudAordHlwZSBsaXN0cyBsYXRlci4gIFlvdSBjYW4gZXZlbiBpbnN0YW50aWF0ZSBpdCBtb3JlIHRoYW4gb25jZSBpbiB0aGUKK3NhbWUgcHJvZ3JhbS4KKworSWYgeW91IGFyZSBkZXNpZ25pbmcgYW4gaW50ZXJmYWNlIG9yIGNvbmNlcHQsIHlvdSBjYW4gZGVmaW5lIGEgc3VpdGUKK29mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB0byB2ZXJpZnkgcHJvcGVydGllcyB0aGF0IGFueSB2YWxpZAoraW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZS9jb25jZXB0IHNob3VsZCBoYXZlLiAgVGhlbiwgdGhlIGF1dGhvcgorb2YgZWFjaCBpbXBsZW1lbnRhdGlvbiBjYW4ganVzdCBpbnN0YW50aWF0ZSB0aGUgdGVzdCBzdWl0ZSB3aXRoIGhpcwordHlwZSB0byB2ZXJpZnkgdGhhdCBpdCBjb25mb3JtcyB0byB0aGUgcmVxdWlyZW1lbnRzLCB3aXRob3V0IGhhdmluZyB0bword3JpdGUgc2ltaWxhciB0ZXN0cyByZXBlYXRlZGx5LiAgSGVyZSdzIGFuIGV4YW1wbGU6CisKK0ZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLCBhcyB3ZSBkaWQgd2l0aCB0eXBlZCB0ZXN0czoKKworYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgLi4uCit9OworYGBgCisKK05leHQsIGRlY2xhcmUgdGhhdCB5b3Ugd2lsbCBkZWZpbmUgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlOgorCitgYGAKK1RZUEVEX1RFU1RfQ0FTRV9QKEZvb1Rlc3QpOworYGBgCisKK1RoZSBgX1BgIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdQorcHJlZmVyIHRvIHRoaW5rLgorCitUaGVuLCB1c2UgYFRZUEVEX1RFU1RfUCgpYCB0byBkZWZpbmUgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4gIFlvdQorY2FuIHJlcGVhdCB0aGlzIGFzIG1hbnkgdGltZXMgYXMgeW91IHdhbnQ6CisKK2BgYAorVFlQRURfVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIFR5cGVQYXJhbSB0byBnZXQgdGhlIHR5cGUgcGFyYW1ldGVyLgorICBUeXBlUGFyYW0gbiA9IDA7CisgIC4uLgorfQorCitUWVBFRF9URVNUX1AoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9CitgYGAKKworTm93IHRoZSB0cmlja3kgcGFydDogeW91IG5lZWQgdG8gcmVnaXN0ZXIgYWxsIHRlc3QgcGF0dGVybnMgdXNpbmcgdGhlCitgUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1BgIG1hY3JvIGJlZm9yZSB5b3UgY2FuIGluc3RhbnRpYXRlIHRoZW0uCitUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIG1hY3JvIGlzIHRoZSB0ZXN0IGNhc2UgbmFtZTsgdGhlIHJlc3QgYXJlCit0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlOgorCitgYGAKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKEZvb1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2VzQmxhaCwgSGFzUHJvcGVydHlBKTsKK2BgYAorCitGaW5hbGx5LCB5b3UgYXJlIGZyZWUgdG8gaW5zdGFudGlhdGUgdGhlIHBhdHRlcm4gd2l0aCB0aGUgdHlwZXMgeW91Cit3YW50LiAgSWYgeW91IHB1dCB0aGUgYWJvdmUgY29kZSBpbiBhIGhlYWRlciBmaWxlLCB5b3UgY2FuIGAjaW5jbHVkZWAKK2l0IGluIG11bHRpcGxlIEMrKyBzb3VyY2UgZmlsZXMgYW5kIGluc3RhbnRpYXRlIGl0IG11bHRpcGxlIHRpbWVzLgorCitgYGAKK3R5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxjaGFyLCBpbnQsIHVuc2lnbmVkIGludD4gTXlUeXBlczsKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBNeVR5cGVzKTsKK2BgYAorCitUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCB0aGUgZmlyc3QgYXJndW1lbnQKK3RvIHRoZSBgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1BgIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZQorYWRkZWQgdG8gdGhlIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzCitmb3IgZGlmZmVyZW50IGluc3RhbmNlcy4KKworSW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdQorY2FuIHdyaXRlIHRoYXQgdHlwZSBkaXJlY3RseSB3aXRob3V0IGA6OnRlc3Rpbmc6OlR5cGVzPC4uLj5gLCBsaWtlIHRoaXM6CisKK2BgYAorSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIGludCk7CitgYGAKKworWW91IGNhbiBzZWUgYHNhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jY2AgZm9yIGEgY29tcGxldGUgZXhhbXBsZS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzIChyZXF1aXJlcyBNU1ZDIDguMCBvciBhYm92ZSksIE1hYzsKK3NpbmNlIHZlcnNpb24gMS4xLjAuCisKKyMgVGVzdGluZyBQcml2YXRlIENvZGUgIworCitJZiB5b3UgY2hhbmdlIHlvdXIgc29mdHdhcmUncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiwgeW91ciB0ZXN0cyBzaG91bGQgbm90CiticmVhayBhcyBsb25nIGFzIHRoZSBjaGFuZ2UgaXMgbm90IG9ic2VydmFibGUgYnkgdXNlcnMuIFRoZXJlZm9yZSwgcGVyIHRoZQorX2JsYWNrLWJveCB0ZXN0aW5nIHByaW5jaXBsZV8sIG1vc3Qgb2YgdGhlIHRpbWUgeW91IHNob3VsZCB0ZXN0IHlvdXIgY29kZQordGhyb3VnaCBpdHMgcHVibGljIGludGVyZmFjZXMuCisKK0lmIHlvdSBzdGlsbCBmaW5kIHlvdXJzZWxmIG5lZWRpbmcgdG8gdGVzdCBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBjb2RlLAorY29uc2lkZXIgaWYgdGhlcmUncyBhIGJldHRlciBkZXNpZ24gdGhhdCB3b3VsZG4ndCByZXF1aXJlIHlvdSB0byBkbyBzby4gSWYgeW91CithYnNvbHV0ZWx5IGhhdmUgdG8gdGVzdCBub24tcHVibGljIGludGVyZmFjZSBjb2RlIHRob3VnaCwgeW91IGNhbi4gVGhlcmUgYXJlCit0d28gY2FzZXMgdG8gY29uc2lkZXI6CisKKyAgKiBTdGF0aWMgZnVuY3Rpb25zIChfbm90XyB0aGUgc2FtZSBhcyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyEpIG9yIHVubmFtZWQgbmFtZXNwYWNlcywgYW5kCisgICogUHJpdmF0ZSBvciBwcm90ZWN0ZWQgY2xhc3MgbWVtYmVycworCisjIyBTdGF0aWMgRnVuY3Rpb25zICMjCisKK0JvdGggc3RhdGljIGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMvZGVjbGFyYXRpb25zIGluIGFuIHVubmFtZWQgbmFtZXNwYWNlIGFyZQorb25seSB2aXNpYmxlIHdpdGhpbiB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0LiBUbyB0ZXN0IHRoZW0sIHlvdSBjYW4gYCNpbmNsdWRlYAordGhlIGVudGlyZSBgLmNjYCBmaWxlIGJlaW5nIHRlc3RlZCBpbiB5b3VyIGAqX3Rlc3QuY2NgIGZpbGUuICgjaW5jbHVkaW5nIGAuY2NgCitmaWxlcyBpcyBub3QgYSBnb29kIHdheSB0byByZXVzZSBjb2RlIC0geW91IHNob3VsZCBub3QgZG8gdGhpcyBpbiBwcm9kdWN0aW9uCitjb2RlISkKKworSG93ZXZlciwgYSBiZXR0ZXIgYXBwcm9hY2ggaXMgdG8gbW92ZSB0aGUgcHJpdmF0ZSBjb2RlIGludG8gdGhlCitgZm9vOjppbnRlcm5hbGAgbmFtZXNwYWNlLCB3aGVyZSBgZm9vYCBpcyB0aGUgbmFtZXNwYWNlIHlvdXIgcHJvamVjdCBub3JtYWxseQordXNlcywgYW5kIHB1dCB0aGUgcHJpdmF0ZSBkZWNsYXJhdGlvbnMgaW4gYSBgKi1pbnRlcm5hbC5oYCBmaWxlLiBZb3VyCitwcm9kdWN0aW9uIGAuY2NgIGZpbGVzIGFuZCB5b3VyIHRlc3RzIGFyZSBhbGxvd2VkIHRvIGluY2x1ZGUgdGhpcyBpbnRlcm5hbAoraGVhZGVyLCBidXQgeW91ciBjbGllbnRzIGFyZSBub3QuIFRoaXMgd2F5LCB5b3UgY2FuIGZ1bGx5IHRlc3QgeW91ciBpbnRlcm5hbAoraW1wbGVtZW50YXRpb24gd2l0aG91dCBsZWFraW5nIGl0IHRvIHlvdXIgY2xpZW50cy4KKworIyMgUHJpdmF0ZSBDbGFzcyBNZW1iZXJzICMjCisKK1ByaXZhdGUgY2xhc3MgbWVtYmVycyBhcmUgb25seSBhY2Nlc3NpYmxlIGZyb20gd2l0aGluIHRoZSBjbGFzcyBvciBieSBmcmllbmRzLgorVG8gYWNjZXNzIGEgY2xhc3MnIHByaXZhdGUgbWVtYmVycywgeW91IGNhbiBkZWNsYXJlIHlvdXIgdGVzdCBmaXh0dXJlIGFzIGEKK2ZyaWVuZCB0byB0aGUgY2xhc3MgYW5kIGRlZmluZSBhY2Nlc3NvcnMgaW4geW91ciBmaXh0dXJlLiBUZXN0cyB1c2luZyB0aGUKK2ZpeHR1cmUgY2FuIHRoZW4gYWNjZXNzIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgeW91ciBwcm9kdWN0aW9uIGNsYXNzIHZpYSB0aGUKK2FjY2Vzc29ycyBpbiB0aGUgZml4dHVyZS4gTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHlvdXIgZml4dHVyZSBpcyBhIGZyaWVuZCB0bworeW91ciBwcm9kdWN0aW9uIGNsYXNzLCB5b3VyIHRlc3RzIGFyZSBub3QgYXV0b21hdGljYWxseSBmcmllbmRzIHRvIGl0LCBhcyB0aGV5CithcmUgdGVjaG5pY2FsbHkgZGVmaW5lZCBpbiBzdWItY2xhc3NlcyBvZiB0aGUgZml4dHVyZS4KKworQW5vdGhlciB3YXkgdG8gdGVzdCBwcml2YXRlIG1lbWJlcnMgaXMgdG8gcmVmYWN0b3IgdGhlbSBpbnRvIGFuIGltcGxlbWVudGF0aW9uCitjbGFzcywgd2hpY2ggaXMgdGhlbiBkZWNsYXJlZCBpbiBhIGAqLWludGVybmFsLmhgIGZpbGUuIFlvdXIgY2xpZW50cyBhcmVuJ3QKK2FsbG93ZWQgdG8gaW5jbHVkZSB0aGlzIGhlYWRlciBidXQgeW91ciB0ZXN0cyBjYW4uIFN1Y2ggaXMgY2FsbGVkIHRoZSBQaW1wbAorKFByaXZhdGUgSW1wbGVtZW50YXRpb24pIGlkaW9tLgorCitPciwgeW91IGNhbiBkZWNsYXJlIGFuIGluZGl2aWR1YWwgdGVzdCBhcyBhIGZyaWVuZCBvZiB5b3VyIGNsYXNzIGJ5IGFkZGluZyB0aGlzCitsaW5lIGluIHRoZSBjbGFzcyBib2R5OgorCitgYGAKK0ZSSUVORF9URVNUKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpOworYGBgCisKK0ZvciBleGFtcGxlLAorYGBgCisvLyBmb28uaAorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3Byb2QuaCIKKworLy8gRGVmaW5lcyBGUklFTkRfVEVTVC4KK2NsYXNzIEZvbyB7CisgIC4uLgorIHByaXZhdGU6CisgIEZSSUVORF9URVNUKEZvb1Rlc3QsIEJhclJldHVybnNaZXJvT25OdWxsKTsKKyAgaW50IEJhcih2b2lkKiB4KTsKK307CisKKy8vIGZvb190ZXN0LmNjCisuLi4KK1RFU1QoRm9vVGVzdCwgQmFyUmV0dXJuc1plcm9Pbk51bGwpIHsKKyAgRm9vIGZvbzsKKyAgRVhQRUNUX0VRKDAsIGZvby5CYXIoTlVMTCkpOworICAvLyBVc2VzIEZvbydzIHByaXZhdGUgbWVtYmVyIEJhcigpLgorfQorYGBgCisKK1BheSBzcGVjaWFsIGF0dGVudGlvbiB3aGVuIHlvdXIgY2xhc3MgaXMgZGVmaW5lZCBpbiBhIG5hbWVzcGFjZSwgYXMgeW91IHNob3VsZAorZGVmaW5lIHlvdXIgdGVzdCBmaXh0dXJlcyBhbmQgdGVzdHMgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGlmIHlvdSB3YW50IHRoZW0gdG8KK2JlIGZyaWVuZHMgb2YgeW91ciBjbGFzcy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb2RlIHRvIGJlIHRlc3RlZCBsb29rcyBsaWtlOgorCitgYGAKK25hbWVzcGFjZSBteV9uYW1lc3BhY2UgeworCitjbGFzcyBGb28geworICBmcmllbmQgY2xhc3MgRm9vVGVzdDsKKyAgRlJJRU5EX1RFU1QoRm9vVGVzdCwgQmFyKTsKKyAgRlJJRU5EX1RFU1QoRm9vVGVzdCwgQmF6KTsKKyAgLi4uCisgIGRlZmluaXRpb24gb2YgdGhlIGNsYXNzIEZvbworICAuLi4KK307CisKK30gIC8vIG5hbWVzcGFjZSBteV9uYW1lc3BhY2UKK2BgYAorCitZb3VyIHRlc3QgY29kZSBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2U6CisKK2BgYAorbmFtZXNwYWNlIG15X25hbWVzcGFjZSB7CitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAuLi4KK307CisKK1RFU1RfRihGb29UZXN0LCBCYXIpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBCYXopIHsgLi4uIH0KKworfSAgLy8gbmFtZXNwYWNlIG15X25hbWVzcGFjZQorYGBgCisKKyMgQ2F0Y2hpbmcgRmFpbHVyZXMgIworCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGEgdGVzdGluZyB1dGlsaXR5IG9uIHRvcCBvZiBHb29nbGUgVGVzdCwgeW91J2xsCit3YW50IHRvIHRlc3QgeW91ciB1dGlsaXR5LiAgV2hhdCBmcmFtZXdvcmsgd291bGQgeW91IHVzZSB0byB0ZXN0IGl0PworR29vZ2xlIFRlc3QsIG9mIGNvdXJzZS4KKworVGhlIGNoYWxsZW5nZSBpcyB0byB2ZXJpZnkgdGhhdCB5b3VyIHRlc3RpbmcgdXRpbGl0eSByZXBvcnRzIGZhaWx1cmVzCitjb3JyZWN0bHkuICBJbiBmcmFtZXdvcmtzIHRoYXQgcmVwb3J0IGEgZmFpbHVyZSBieSB0aHJvd2luZyBhbgorZXhjZXB0aW9uLCB5b3UgY291bGQgY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgYXNzZXJ0IG9uIGl0LiAgQnV0IEdvb2dsZQorVGVzdCBkb2Vzbid0IHVzZSBleGNlcHRpb25zLCBzbyBob3cgZG8gd2UgdGVzdCB0aGF0IGEgcGllY2Ugb2YgY29kZQorZ2VuZXJhdGVzIGFuIGV4cGVjdGVkIGZhaWx1cmU/CisKK2AiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiYCBjb250YWlucyBzb21lIGNvbnN0cnVjdHMgdG8gZG8gdGhpcy4gIEFmdGVyCisjaW5jbHVkaW5nIHRoaXMgaGVhZGVyLCB5b3UgY2FuIHVzZQorCit8IGBFWFBFQ1RfRkFUQUxfRkFJTFVSRShgX3N0YXRlbWVudCwgc3Vic3RyaW5nX2ApO2AgfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKwordG8gYXNzZXJ0IHRoYXQgX3N0YXRlbWVudF8gZ2VuZXJhdGVzIGEgZmF0YWwgKGUuZy4gYEFTU0VSVF8qYCkgZmFpbHVyZQord2hvc2UgbWVzc2FnZSBjb250YWlucyB0aGUgZ2l2ZW4gX3N1YnN0cmluZ18sIG9yIHVzZQorCit8IGBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShgX3N0YXRlbWVudCwgc3Vic3RyaW5nX2ApO2AgfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworaWYgeW91IGFyZSBleHBlY3RpbmcgYSBub24tZmF0YWwgKGUuZy4gYEVYUEVDVF8qYCkgZmFpbHVyZS4KKworRm9yIHRlY2huaWNhbCByZWFzb25zLCB0aGVyZSBhcmUgc29tZSBjYXZlYXRzOgorCisgIDEuIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIGVpdGhlciBtYWNyby4KKyAgMS4gX3N0YXRlbWVudF8gaW4gYEVYUEVDVF9GQVRBTF9GQUlMVVJFKClgIGNhbm5vdCByZWZlcmVuY2UgbG9jYWwgbm9uLXN0YXRpYyB2YXJpYWJsZXMgb3Igbm9uLXN0YXRpYyBtZW1iZXJzIG9mIGB0aGlzYCBvYmplY3QuCisgIDEuIF9zdGF0ZW1lbnRfIGluIGBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpYCBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuCisKK19Ob3RlOl8gR29vZ2xlIFRlc3QgaXMgZGVzaWduZWQgd2l0aCB0aHJlYWRzIGluIG1pbmQuICBPbmNlIHRoZQorc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaW4gYCJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiYCBoYXZlCitiZWVuIGltcGxlbWVudGVkLCBHb29nbGUgVGVzdCB3aWxsIGJlY29tZSB0aHJlYWQtc2FmZSwgbWVhbmluZyB0aGF0Cit5b3UgY2FuIHRoZW4gdXNlIGFzc2VydGlvbnMgaW4gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHkuICBCZWZvcmUKKwordGhhdCwgaG93ZXZlciwgR29vZ2xlIFRlc3Qgb25seSBzdXBwb3J0cyBzaW5nbGUtdGhyZWFkZWQgdXNhZ2UuICBPbmNlCit0aHJlYWQtc2FmZSwgYEVYUEVDVF9GQVRBTF9GQUlMVVJFKClgIGFuZCBgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKWAKK3dpbGwgY2FwdHVyZSBmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQgb25seS4gSWYgX3N0YXRlbWVudF8KK2NyZWF0ZXMgbmV3IHRocmVhZHMsIGZhaWx1cmVzIGluIHRoZXNlIHRocmVhZHMgd2lsbCBiZSBpZ25vcmVkLiAgSWYKK3lvdSB3YW50IHRvIGNhcHR1cmUgZmFpbHVyZXMgZnJvbSBhbGwgdGhyZWFkcyBpbnN0ZWFkLCB5b3Ugc2hvdWxkIHVzZQordGhlIGZvbGxvd2luZyBtYWNyb3M6CisKK3wgYEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKGBfc3RhdGVtZW50LCBzdWJzdHJpbmdfYCk7YCB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoYF9zdGF0ZW1lbnQsIHN1YnN0cmluZ19gKTtgIHwKKworIyBHZXR0aW5nIHRoZSBDdXJyZW50IFRlc3QncyBOYW1lICMKKworU29tZXRpbWVzIGEgZnVuY3Rpb24gbWF5IG5lZWQgdG8ga25vdyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4KK0ZvciBleGFtcGxlLCB5b3UgbWF5IGJlIHVzaW5nIHRoZSBgU2V0VXAoKWAgbWV0aG9kIG9mIHlvdXIgdGVzdCBmaXh0dXJlIHRvIHNldAordGhlIGdvbGRlbiBmaWxlIG5hbWUgYmFzZWQgb24gd2hpY2ggdGVzdCBpcyBydW5uaW5nLiBUaGUgYDo6dGVzdGluZzo6VGVzdEluZm9gCitjbGFzcyBoYXMgdGhpcyBpbmZvcm1hdGlvbjoKKworYGBgCituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIFRlc3RJbmZvIHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgdGhlIHRlc3QgY2FzZSBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLCByZXNwZWN0aXZlbHkuCisgIC8vCisgIC8vIERvIE5PVCBkZWxldGUgb3IgZnJlZSB0aGUgcmV0dXJuIHZhbHVlIC0gaXQncyBtYW5hZ2VkIGJ5IHRoZQorICAvLyBUZXN0SW5mbyBjbGFzcy4KKyAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUoKSBjb25zdDsKKyAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK2BgYAorCisKKz4gVG8gb2J0YWluIGEgYFRlc3RJbmZvYCBvYmplY3QgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LCBjYWxsCitgY3VycmVudF90ZXN0X2luZm8oKWAgb24gdGhlIGBVbml0VGVzdGAgc2luZ2xldG9uIG9iamVjdDoKKworYGBgCisvLyBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LgorLy8gRG8gTk9UIGRlbGV0ZSB0aGUgcmV0dXJuZWQgb2JqZWN0IC0gaXQncyBtYW5hZ2VkIGJ5IHRoZSBVbml0VGVzdCBjbGFzcy4KK2NvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CitwcmludGYoIldlIGFyZSBpbiB0ZXN0ICVzIG9mIHRlc3QgY2FzZSAlcy5cbiIsCisgICAgICAgdGVzdF9pbmZvLT5uYW1lKCksIHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSk7CitgYGAKKworYGN1cnJlbnRfdGVzdF9pbmZvKClgIHJldHVybnMgYSBudWxsIHBvaW50ZXIgaWYgbm8gdGVzdCBpcyBydW5uaW5nLiBJbgorcGFydGljdWxhciwgeW91IGNhbm5vdCBmaW5kIHRoZSB0ZXN0IGNhc2UgbmFtZSBpbiBgVGVzdENhc2VTZXRVcCgpYCwKK2BUZXN0Q2FzZVRlYXJEb3duKClgICh3aGVyZSB5b3Uga25vdyB0aGUgdGVzdCBjYXNlIG5hbWUgaW1wbGljaXRseSksIG9yCitmdW5jdGlvbnMgY2FsbGVkIGZyb20gdGhlbS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMgRXh0ZW5kaW5nIEdvb2dsZSBUZXN0IGJ5IEhhbmRsaW5nIFRlc3QgRXZlbnRzICMKKworR29vZ2xlIFRlc3QgcHJvdmlkZXMgYW4gPGI+ZXZlbnQgbGlzdGVuZXIgQVBJPC9iPiB0byBsZXQgeW91IHJlY2VpdmUKK25vdGlmaWNhdGlvbnMgYWJvdXQgdGhlIHByb2dyZXNzIG9mIGEgdGVzdCBwcm9ncmFtIGFuZCB0ZXN0CitmYWlsdXJlcy4gVGhlIGV2ZW50cyB5b3UgY2FuIGxpc3RlbiB0byBpbmNsdWRlIHRoZSBzdGFydCBhbmQgZW5kIG9mCit0aGUgdGVzdCBwcm9ncmFtLCBhIHRlc3QgY2FzZSwgb3IgYSB0ZXN0IG1ldGhvZCwgYW1vbmcgb3RoZXJzLiBZb3UgbWF5Cit1c2UgdGhpcyBBUEkgdG8gYXVnbWVudCBvciByZXBsYWNlIHRoZSBzdGFuZGFyZCBjb25zb2xlIG91dHB1dCwKK3JlcGxhY2UgdGhlIFhNTCBvdXRwdXQsIG9yIHByb3ZpZGUgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmb3JtIG9mCitvdXRwdXQsIHN1Y2ggYXMgYSBHVUkgb3IgYSBkYXRhYmFzZS4gWW91IGNhbiBhbHNvIHVzZSB0ZXN0IGV2ZW50cyBhcworY2hlY2twb2ludHMgdG8gaW1wbGVtZW50IGEgcmVzb3VyY2UgbGVhayBjaGVja2VyLCBmb3IgZXhhbXBsZS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWM7IHNpbmNlIHYxLjQuMC4KKworIyMgRGVmaW5pbmcgRXZlbnQgTGlzdGVuZXJzICMjCisKK1RvIGRlZmluZSBhIGV2ZW50IGxpc3RlbmVyLCB5b3Ugc3ViY2xhc3MgZWl0aGVyCitbdGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIzg1NSkKK29yIFt0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM5MDUpLgorVGhlIGZvcm1lciBpcyBhbiAoYWJzdHJhY3QpIGludGVyZmFjZSwgd2hlcmUgPGk+ZWFjaCBwdXJlIHZpcnR1YWwgbWV0aG9kPGJyPgorY2FuIGJlIG92ZXJyaWRkZW4gdG8gaGFuZGxlIGEgdGVzdCBldmVudDwvaT4gKEZvciBleGFtcGxlLCB3aGVuIGEgdGVzdAorc3RhcnRzLCB0aGUgYE9uVGVzdFN0YXJ0KClgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZC4pLiBUaGUgbGF0dGVyIHByb3ZpZGVzCithbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlLCBzdWNoIHRoYXQgYQorc3ViY2xhc3Mgb25seSBuZWVkcyB0byBvdmVycmlkZSB0aGUgbWV0aG9kcyBpdCBjYXJlcyBhYm91dC4KKworV2hlbiBhbiBldmVudCBpcyBmaXJlZCwgaXRzIGNvbnRleHQgaXMgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uCithcyBhbiBhcmd1bWVudC4gVGhlIGZvbGxvd2luZyBhcmd1bWVudCB0eXBlcyBhcmUgdXNlZDoKKyAgKiBbVW5pdFRlc3RdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIzEwMDcpIHJlZmxlY3RzIHRoZSBzdGF0ZSBvZiB0aGUgZW50aXJlIHRlc3QgcHJvZ3JhbSwKKyAgKiBbVGVzdENhc2VdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIzY4OSkgaGFzIGluZm9ybWF0aW9uIGFib3V0IGEgdGVzdCBjYXNlLCB3aGljaCBjYW4gY29udGFpbiBvbmUgb3IgbW9yZSB0ZXN0cywKKyAgKiBbVGVzdEluZm9dKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIzU5OSkgY29udGFpbnMgdGhlIHN0YXRlIG9mIGEgdGVzdCwgYW5kCisgICogW1Rlc3RQYXJ0UmVzdWx0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgjNDIpIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIHRlc3QgYXNzZXJ0aW9uLgorCitBbiBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIGNhbiBleGFtaW5lIHRoZSBhcmd1bWVudCBpdCByZWNlaXZlcyB0byBmaW5kCitvdXQgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV2ZW50IGFuZCB0aGUgdGVzdCBwcm9ncmFtJ3MKK3N0YXRlLiAgSGVyZSdzIGFuIGV4YW1wbGU6CisKK2BgYAorICBjbGFzcyBNaW5pbWFsaXN0UHJpbnRlciA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgeworICAgIC8vIENhbGxlZCBiZWZvcmUgYSB0ZXN0IHN0YXJ0cy4KKyAgICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgICBwcmludGYoIioqKiBUZXN0ICVzLiVzIHN0YXJ0aW5nLlxuIiwKKyAgICAgICAgICAgICB0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgfQorCisgICAgLy8gQ2FsbGVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFRUQoKSBpbnZvY2F0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KAorICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgICAgICBwcmludGYoIiVzIGluICVzOiVkXG4lc1xuIiwKKyAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmZhaWxlZCgpID8gIioqKiBGYWlsdXJlIiA6ICJTdWNjZXNzIiwKKyAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpLAorICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQubGluZV9udW1iZXIoKSwKKyAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LnN1bW1hcnkoKSk7CisgICAgfQorCisgICAgLy8gQ2FsbGVkIGFmdGVyIGEgdGVzdCBlbmRzLgorICAgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgICBwcmludGYoIioqKiBUZXN0ICVzLiVzIGVuZGluZy5cbiIsCisgICAgICAgICAgICAgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgIH0KKyAgfTsKK2BgYAorCisjIyBVc2luZyBFdmVudCBMaXN0ZW5lcnMgIyMKKworVG8gdXNlIHRoZSBldmVudCBsaXN0ZW5lciB5b3UgaGF2ZSBkZWZpbmVkLCBhZGQgYW4gaW5zdGFuY2Ugb2YgaXQgdG8KK3RoZSBHb29nbGUgVGVzdCBldmVudCBsaXN0ZW5lciBsaXN0IChyZXByZXNlbnRlZCBieSBjbGFzcworW1Rlc3RFdmVudExpc3RlbmVyc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgjOTI5KQorLSBub3RlIHRoZSAicyIgYXQgdGhlIGVuZCBvZiB0aGUgbmFtZSkgaW4geW91cgorYG1haW4oKWAgZnVuY3Rpb24sIGJlZm9yZSBjYWxsaW5nIGBSVU5fQUxMX1RFU1RTKClgOgorYGBgCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIC8vIEdldHMgaG9sZCBvZiB0aGUgZXZlbnQgbGlzdGVuZXIgbGlzdC4KKyAgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycyA9CisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKKyAgLy8gQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBlbmQuICBHb29nbGUgVGVzdCB0YWtlcyB0aGUgb3duZXJzaGlwLgorICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBNaW5pbWFsaXN0UHJpbnRlcik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CitgYGAKKworVGhlcmUncyBvbmx5IG9uZSBwcm9ibGVtOiB0aGUgZGVmYXVsdCB0ZXN0IHJlc3VsdCBwcmludGVyIGlzIHN0aWxsIGluCitlZmZlY3QsIHNvIGl0cyBvdXRwdXQgd2lsbCBtaW5nbGUgd2l0aCB0aGUgb3V0cHV0IGZyb20geW91ciBtaW5pbWFsaXN0CitwcmludGVyLiBUbyBzdXBwcmVzcyB0aGUgZGVmYXVsdCBwcmludGVyLCBqdXN0IHJlbGVhc2UgaXQgZnJvbSB0aGUKK2V2ZW50IGxpc3RlbmVyIGxpc3QgYW5kIGRlbGV0ZSBpdC4gWW91IGNhbiBkbyBzbyBieSBhZGRpbmcgb25lIGxpbmU6CitgYGAKKyAgLi4uCisgIGRlbGV0ZSBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpKTsKKyAgbGlzdGVuZXJzLkFwcGVuZChuZXcgTWluaW1hbGlzdFByaW50ZXIpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworYGBgCisKK05vdywgc2l0IGJhY2sgYW5kIGVuam95IGEgY29tcGxldGVseSBkaWZmZXJlbnQgb3V0cHV0IGZyb20geW91cgordGVzdHMuIEZvciBtb3JlIGRldGFpbHMsIHlvdSBjYW4gcmVhZCB0aGlzCitbc2FtcGxlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlOV91bml0dGVzdC5jYykuCisKK1lvdSBtYXkgYXBwZW5kIG1vcmUgdGhhbiBvbmUgbGlzdGVuZXIgdG8gdGhlIGxpc3QuIFdoZW4gYW4gYE9uKlN0YXJ0KClgCitvciBgT25UZXN0UGFydFJlc3VsdCgpYCBldmVudCBpcyBmaXJlZCwgdGhlIGxpc3RlbmVycyB3aWxsIHJlY2VpdmUgaXQgaW4KK3RoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgbGlzdCAoc2luY2UgbmV3IGxpc3RlbmVycyBhcmUgYWRkZWQgdG8KK3RoZSBlbmQgb2YgdGhlIGxpc3QsIHRoZSBkZWZhdWx0IHRleHQgcHJpbnRlciBhbmQgdGhlIGRlZmF1bHQgWE1MCitnZW5lcmF0b3Igd2lsbCByZWNlaXZlIHRoZSBldmVudCBmaXJzdCkuIEFuIGBPbipFbmQoKWAgZXZlbnQgd2lsbCBiZQorcmVjZWl2ZWQgYnkgdGhlIGxpc3RlbmVycyBpbiB0aGUgX3JldmVyc2VfIG9yZGVyLiBUaGlzIGFsbG93cyBvdXRwdXQgYnkKK2xpc3RlbmVycyBhZGRlZCBsYXRlciB0byBiZSBmcmFtZWQgYnkgb3V0cHV0IGZyb20gbGlzdGVuZXJzIGFkZGVkCitlYXJsaWVyLgorCisjIyBHZW5lcmF0aW5nIEZhaWx1cmVzIGluIExpc3RlbmVycyAjIworCitZb3UgbWF5IHVzZSBmYWlsdXJlLXJhaXNpbmcgbWFjcm9zIChgRVhQRUNUXyooKWAsIGBBU1NFUlRfKigpYCwKK2BGQUlMKClgLCBldGMpIHdoZW4gcHJvY2Vzc2luZyBhbiBldmVudC4gVGhlcmUgYXJlIHNvbWUgcmVzdHJpY3Rpb25zOgorCisgIDEuIFlvdSBjYW5ub3QgZ2VuZXJhdGUgYW55IGZhaWx1cmUgaW4gYE9uVGVzdFBhcnRSZXN1bHQoKWAgKG90aGVyd2lzZSBpdCB3aWxsIGNhdXNlIGBPblRlc3RQYXJ0UmVzdWx0KClgIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseSkuCisgIDEuIEEgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIGBPblRlc3RQYXJ0UmVzdWx0KClgIGlzIG5vdCBhbGxvd2VkIHRvIGdlbmVyYXRlIGFueSBmYWlsdXJlLgorCitXaGVuIHlvdSBhZGQgbGlzdGVuZXJzIHRvIHRoZSBsaXN0ZW5lciBsaXN0LCB5b3Ugc2hvdWxkIHB1dCBsaXN0ZW5lcnMKK3RoYXQgaGFuZGxlIGBPblRlc3RQYXJ0UmVzdWx0KClgIF9iZWZvcmVfIGxpc3RlbmVycyB0aGF0IGNhbiBnZW5lcmF0ZQorZmFpbHVyZXMuIFRoaXMgZW5zdXJlcyB0aGF0IGZhaWx1cmVzIGdlbmVyYXRlZCBieSB0aGUgbGF0dGVyIGFyZQorYXR0cmlidXRlZCB0byB0aGUgcmlnaHQgdGVzdCBieSB0aGUgZm9ybWVyLgorCitXZSBoYXZlIGEgc2FtcGxlIG9mIGZhaWx1cmUtcmFpc2luZyBsaXN0ZW5lcgorW2hlcmVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC5jYykuCisKKyMgUnVubmluZyBUZXN0IFByb2dyYW1zOiBBZHZhbmNlZCBPcHRpb25zICMKKworR29vZ2xlIFRlc3QgdGVzdCBwcm9ncmFtcyBhcmUgb3JkaW5hcnkgZXhlY3V0YWJsZXMuIE9uY2UgYnVpbHQsIHlvdSBjYW4gcnVuCit0aGVtIGRpcmVjdGx5IGFuZCBhZmZlY3QgdGhlaXIgYmVoYXZpb3IgdmlhIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzCithbmQvb3IgY29tbWFuZCBsaW5lIGZsYWdzLiBGb3IgdGhlIGZsYWdzIHRvIHdvcmssIHlvdXIgcHJvZ3JhbXMgbXVzdCBjYWxsCitgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpYCBiZWZvcmUgY2FsbGluZyBgUlVOX0FMTF9URVNUUygpYC4KKworVG8gc2VlIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZmxhZ3MgYW5kIHRoZWlyIHVzYWdlLCBwbGVhc2UgcnVuIHlvdXIgdGVzdAorcHJvZ3JhbSB3aXRoIHRoZSBgLS1oZWxwYCBmbGFnLiAgWW91IGNhbiBhbHNvIHVzZSBgLWhgLCBgLT9gLCBvciBgLz9gCitmb3Igc2hvcnQuICBUaGlzIGZlYXR1cmUgaXMgYWRkZWQgaW4gdmVyc2lvbiAxLjMuMC4KKworSWYgYW4gb3B0aW9uIGlzIHNwZWNpZmllZCBib3RoIGJ5IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCBieSBhCitmbGFnLCB0aGUgbGF0dGVyIHRha2VzIHByZWNlZGVuY2UuICBNb3N0IG9mIHRoZSBvcHRpb25zIGNhbiBhbHNvIGJlCitzZXQvcmVhZCBpbiBjb2RlOiB0byBhY2Nlc3MgdGhlIHZhbHVlIG9mIGNvbW1hbmQgbGluZSBmbGFnCitgLS1ndGVzdF9mb29gLCB3cml0ZSBgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKGZvbylgLiAgQSBjb21tb24gcGF0dGVybiBpcwordG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGZsYWcgYmVmb3JlIGNhbGxpbmcgYDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKWAKK3RvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmxhZzoKK2BgYAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIC8vIERpc2FibGVzIGVsYXBzZWQgdGltZSBieSBkZWZhdWx0LgorICA6OnRlc3Rpbmc6OkdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBmYWxzZTsKKworICAvLyBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgZmxhZyBvbiB0aGUgY29tbWFuZCBsaW5lLgorICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorYGBgCisKKyMjIFNlbGVjdGluZyBUZXN0cyAjIworCitUaGlzIHNlY3Rpb24gc2hvd3MgdmFyaW91cyBvcHRpb25zIGZvciBjaG9vc2luZyB3aGljaCB0ZXN0cyB0byBydW4uCisKKyMjIyBMaXN0aW5nIFRlc3QgTmFtZXMgIyMjCisKK1NvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gbGlzdCB0aGUgYXZhaWxhYmxlIHRlc3RzIGluIGEgcHJvZ3JhbSBiZWZvcmUKK3J1bm5pbmcgdGhlbSBzbyB0aGF0IGEgZmlsdGVyIG1heSBiZSBhcHBsaWVkIGlmIG5lZWRlZC4gSW5jbHVkaW5nIHRoZSBmbGFnCitgLS1ndGVzdF9saXN0X3Rlc3RzYCBvdmVycmlkZXMgYWxsIG90aGVyIGZsYWdzIGFuZCBsaXN0cyB0ZXN0cyBpbiB0aGUgZm9sbG93aW5nCitmb3JtYXQ6CitgYGAKK1Rlc3RDYXNlMS4KKyAgVGVzdE5hbWUxCisgIFRlc3ROYW1lMgorVGVzdENhc2UyLgorICBUZXN0TmFtZQorYGBgCisKK05vbmUgb2YgdGhlIHRlc3RzIGxpc3RlZCBhcmUgYWN0dWFsbHkgcnVuIGlmIHRoZSBmbGFnIGlzIHByb3ZpZGVkLiBUaGVyZSBpcyBubworY29ycmVzcG9uZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgdGhpcyBmbGFnLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMjIFJ1bm5pbmcgYSBTdWJzZXQgb2YgdGhlIFRlc3RzICMjIworCitCeSBkZWZhdWx0LCBhIEdvb2dsZSBUZXN0IHByb2dyYW0gcnVucyBhbGwgdGVzdHMgdGhlIHVzZXIgaGFzIGRlZmluZWQuCitTb21ldGltZXMsIHlvdSB3YW50IHRvIHJ1biBvbmx5IGEgc3Vic2V0IG9mIHRoZSB0ZXN0cyAoZS5nLiBmb3IgZGVidWdnaW5nIG9yCitxdWlja2x5IHZlcmlmeWluZyBhIGNoYW5nZSkuIElmIHlvdSBzZXQgdGhlIGBHVEVTVF9GSUxURVJgIGVudmlyb25tZW50IHZhcmlhYmxlCitvciB0aGUgYC0tZ3Rlc3RfZmlsdGVyYCBmbGFnIHRvIGEgZmlsdGVyIHN0cmluZywgR29vZ2xlIFRlc3Qgd2lsbCBvbmx5IHJ1biB0aGUKK3Rlc3RzIHdob3NlIGZ1bGwgbmFtZXMgKGluIHRoZSBmb3JtIG9mIGBUZXN0Q2FzZU5hbWUuVGVzdE5hbWVgKSBtYXRjaCB0aGUKK2ZpbHRlci4KKworVGhlIGZvcm1hdCBvZiBhIGZpbHRlciBpcyBhICdgOmAnLXNlcGFyYXRlZCBsaXN0IG9mIHdpbGRjYXJkIHBhdHRlcm5zIChjYWxsZWQKK3RoZSBwb3NpdGl2ZSBwYXR0ZXJucykgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICdgLWAnIGFuZCBhbm90aGVyCisnYDpgJy1zZXBhcmF0ZWQgcGF0dGVybiBsaXN0IChjYWxsZWQgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zKS4gQSB0ZXN0IG1hdGNoZXMgdGhlCitmaWx0ZXIgaWYgYW5kIG9ubHkgaWYgaXQgbWF0Y2hlcyBhbnkgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGJ1dCBkb2VzIG5vdAorbWF0Y2ggYW55IG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4KKworQSBwYXR0ZXJuIG1heSBjb250YWluIGAnKidgIChtYXRjaGVzIGFueSBzdHJpbmcpIG9yIGAnPydgIChtYXRjaGVzIGFueSBzaW5nbGUKK2NoYXJhY3RlcikuIEZvciBjb252ZW5pZW5jZSwgdGhlIGZpbHRlciBgJyotTmVnYXRpdmVQYXR0ZXJucydgIGNhbiBiZSBhbHNvCit3cml0dGVuIGFzIGAnLU5lZ2F0aXZlUGF0dGVybnMnYC4KKworRm9yIGV4YW1wbGU6CisKKyAgKiBgLi9mb29fdGVzdGAgSGFzIG5vIGZsYWcsIGFuZCB0aHVzIHJ1bnMgYWxsIGl0cyB0ZXN0cy4KKyAgKiBgLi9mb29fdGVzdCAtLWd0ZXN0X2ZpbHRlcj0qYCBBbHNvIHJ1bnMgZXZlcnl0aGluZywgZHVlIHRvIHRoZSBzaW5nbGUgbWF0Y2gtZXZlcnl0aGluZyBgKmAgdmFsdWUuCisgICogYC4vZm9vX3Rlc3QgLS1ndGVzdF9maWx0ZXI9Rm9vVGVzdC4qYCBSdW5zIGV2ZXJ5dGhpbmcgaW4gdGVzdCBjYXNlIGBGb29UZXN0YC4KKyAgKiBgLi9mb29fdGVzdCAtLWd0ZXN0X2ZpbHRlcj0qTnVsbCo6KkNvbnN0cnVjdG9yKmAgUnVucyBhbnkgdGVzdCB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgZWl0aGVyIGAiTnVsbCJgIG9yIGAiQ29uc3RydWN0b3IiYC4KKyAgKiBgLi9mb29fdGVzdCAtLWd0ZXN0X2ZpbHRlcj0tKkRlYXRoVGVzdC4qYCBSdW5zIGFsbCBub24tZGVhdGggdGVzdHMuCisgICogYC4vZm9vX3Rlc3QgLS1ndGVzdF9maWx0ZXI9Rm9vVGVzdC4qLUZvb1Rlc3QuQmFyYCBSdW5zIGV2ZXJ5dGhpbmcgaW4gdGVzdCBjYXNlIGBGb29UZXN0YCBleGNlcHQgYEZvb1Rlc3QuQmFyYC4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIyBUZW1wb3JhcmlseSBEaXNhYmxpbmcgVGVzdHMgIyMjCisKK0lmIHlvdSBoYXZlIGEgYnJva2VuIHRlc3QgdGhhdCB5b3UgY2Fubm90IGZpeCByaWdodCBhd2F5LCB5b3UgY2FuIGFkZCB0aGUKK2BESVNBQkxFRF9gIHByZWZpeCB0byBpdHMgbmFtZS4gVGhpcyB3aWxsIGV4Y2x1ZGUgaXQgZnJvbSBleGVjdXRpb24uIFRoaXMgaXMKK2JldHRlciB0aGFuIGNvbW1lbnRpbmcgb3V0IHRoZSBjb2RlIG9yIHVzaW5nIGAjaWYgMGAsIGFzIGRpc2FibGVkIHRlc3RzIGFyZQorc3RpbGwgY29tcGlsZWQgKGFuZCB0aHVzIHdvbid0IHJvdCkuCisKK0lmIHlvdSBuZWVkIHRvIGRpc2FibGUgYWxsIHRlc3RzIGluIGEgdGVzdCBjYXNlLCB5b3UgY2FuIGVpdGhlciBhZGQgYERJU0FCTEVEX2AKK3RvIHRoZSBmcm9udCBvZiB0aGUgbmFtZSBvZiBlYWNoIHRlc3QsIG9yIGFsdGVybmF0aXZlbHkgYWRkIGl0IHRvIHRoZSBmcm9udCBvZgordGhlIHRlc3QgY2FzZSBuYW1lLgorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0ZXN0cyB3b24ndCBiZSBydW4gYnkgR29vZ2xlIFRlc3QsIGV2ZW4gdGhvdWdoIHRoZXkKK3dpbGwgc3RpbGwgYmUgY29tcGlsZWQ6CisKK2BgYAorLy8gVGVzdHMgdGhhdCBGb28gZG9lcyBBYmMuCitURVNUKEZvb1Rlc3QsIERJU0FCTEVEX0RvZXNBYmMpIHsgLi4uIH0KKworY2xhc3MgRElTQUJMRURfQmFyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeyAuLi4gfTsKKworLy8gVGVzdHMgdGhhdCBCYXIgZG9lcyBYeXouCitURVNUX0YoRElTQUJMRURfQmFyVGVzdCwgRG9lc1h5eikgeyAuLi4gfQorYGBgCisKK19Ob3RlOl8gVGhpcyBmZWF0dXJlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlbXBvcmFyeSBwYWluLXJlbGllZi4gWW91IHN0aWxsCitoYXZlIHRvIGZpeCB0aGUgZGlzYWJsZWQgdGVzdHMgYXQgYSBsYXRlciBkYXRlLiBBcyBhIHJlbWluZGVyLCBHb29nbGUgVGVzdCB3aWxsCitwcmludCBhIGJhbm5lciB3YXJuaW5nIHlvdSBpZiBhIHRlc3QgcHJvZ3JhbSBjb250YWlucyBhbnkgZGlzYWJsZWQgdGVzdHMuCisKK19UaXA6XyBZb3UgY2FuIGVhc2lseSBjb3VudCB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHlvdSBoYXZlCit1c2luZyBgZ3JlcGAuIFRoaXMgbnVtYmVyIGNhbiBiZSB1c2VkIGFzIGEgbWV0cmljIGZvciBpbXByb3ZpbmcgeW91cgordGVzdCBxdWFsaXR5LgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMjIFRlbXBvcmFyaWx5IEVuYWJsaW5nIERpc2FibGVkIFRlc3RzICMjIworCitUbyBpbmNsdWRlIFtkaXNhYmxlZCB0ZXN0c10oI1RlbXBvcmFyaWx5X0Rpc2FibGluZ19UZXN0cy5tZCkgaW4gdGVzdAorZXhlY3V0aW9uLCBqdXN0IGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHdpdGggdGhlCitgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0c2AgZmxhZyBvciBzZXQgdGhlCitgR1RFU1RfQUxTT19SVU5fRElTQUJMRURfVEVTVFNgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgdmFsdWUgb3RoZXIKK3RoYW4gYDBgLiAgWW91IGNhbiBjb21iaW5lIHRoaXMgd2l0aCB0aGUKK1stLWd0ZXN0XF9maWx0ZXJdKCNSdW5uaW5nX2FfU3Vic2V0X29mX3RoZV9UZXN0cy5tZCkgZmxhZyB0byBmdXJ0aGVyIHNlbGVjdAord2hpY2ggZGlzYWJsZWQgdGVzdHMgdG8gcnVuLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjMuMC4KKworIyMgUmVwZWF0aW5nIHRoZSBUZXN0cyAjIworCitPbmNlIGluIGEgd2hpbGUgeW91J2xsIHJ1biBpbnRvIGEgdGVzdCB3aG9zZSByZXN1bHQgaXMgaGl0LW9yLW1pc3MuIFBlcmhhcHMgaXQKK3dpbGwgZmFpbCBvbmx5IDElIG9mIHRoZSB0aW1lLCBtYWtpbmcgaXQgcmF0aGVyIGhhcmQgdG8gcmVwcm9kdWNlIHRoZSBidWcgdW5kZXIKK2EgZGVidWdnZXIuIFRoaXMgY2FuIGJlIGEgbWFqb3Igc291cmNlIG9mIGZydXN0cmF0aW9uLgorCitUaGUgYC0tZ3Rlc3RfcmVwZWF0YCBmbGFnIGFsbG93cyB5b3UgdG8gcmVwZWF0IGFsbCAob3Igc2VsZWN0ZWQpIHRlc3QgbWV0aG9kcworaW4gYSBwcm9ncmFtIG1hbnkgdGltZXMuIEhvcGVmdWxseSwgYSBmbGFreSB0ZXN0IHdpbGwgZXZlbnR1YWxseSBmYWlsIGFuZCBnaXZlCit5b3UgYSBjaGFuY2UgdG8gZGVidWcuIEhlcmUncyBob3cgdG8gdXNlIGl0OgorCit8IGAkIGZvb190ZXN0IC0tZ3Rlc3RfcmVwZWF0PTEwMDBgIHwgUmVwZWF0IGZvb1xfdGVzdCAxMDAwIHRpbWVzIGFuZCBkb24ndCBzdG9wIGF0IGZhaWx1cmVzLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGAkIGZvb190ZXN0IC0tZ3Rlc3RfcmVwZWF0PS0xYCAgIHwgQSBuZWdhdGl2ZSBjb3VudCBtZWFucyByZXBlYXRpbmcgZm9yZXZlci4gICAgICAgICAgICAgICB8Cit8IGAkIGZvb190ZXN0IC0tZ3Rlc3RfcmVwZWF0PTEwMDAgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlYCB8IFJlcGVhdCBmb29cX3Rlc3QgMTAwMCB0aW1lcywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IGZhaWx1cmUuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBydW5uaW5nIHVuZGVyIGEgZGVidWdnZXI6IHdoZW4gdGhlIHRlc3RmYWlscywgaXQgd2lsbCBkcm9wIGludG8gdGhlIGRlYnVnZ2VyIGFuZCB5b3UgY2FuIHRoZW4gaW5zcGVjdCB2YXJpYWJsZXMgYW5kIHN0YWNrcy4gfAorfCBgJCBmb29fdGVzdCAtLWd0ZXN0X3JlcGVhdD0xMDAwIC0tZ3Rlc3RfZmlsdGVyPUZvb0JhcmAgfCBSZXBlYXQgdGhlIHRlc3RzIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgZmlsdGVyIDEwMDAgdGltZXMuIHwKKworSWYgeW91ciB0ZXN0IHByb2dyYW0gY29udGFpbnMgZ2xvYmFsIHNldC11cC90ZWFyLWRvd24gY29kZSByZWdpc3RlcmVkCit1c2luZyBgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KClgLCBpdCB3aWxsIGJlIHJlcGVhdGVkIGluIGVhY2gKK2l0ZXJhdGlvbiBhcyB3ZWxsLCBhcyB0aGUgZmxha2luZXNzIG1heSBiZSBpbiBpdC4gWW91IGNhbiBhbHNvIHNwZWNpZnkKK3RoZSByZXBlYXQgY291bnQgYnkgc2V0dGluZyB0aGUgYEdURVNUX1JFUEVBVGAgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBTaHVmZmxpbmcgdGhlIFRlc3RzICMjCisKK1lvdSBjYW4gc3BlY2lmeSB0aGUgYC0tZ3Rlc3Rfc2h1ZmZsZWAgZmxhZyAob3Igc2V0IHRoZSBgR1RFU1RfU0hVRkZMRWAKK2Vudmlyb25tZW50IHZhcmlhYmxlIHRvIGAxYCkgdG8gcnVuIHRoZSB0ZXN0cyBpbiBhIHByb2dyYW0gaW4gYSByYW5kb20KK29yZGVyLiBUaGlzIGhlbHBzIHRvIHJldmVhbCBiYWQgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGVzdHMuCisKK0J5IGRlZmF1bHQsIEdvb2dsZSBUZXN0IHVzZXMgYSByYW5kb20gc2VlZCBjYWxjdWxhdGVkIGZyb20gdGhlIGN1cnJlbnQKK3RpbWUuIFRoZXJlZm9yZSB5b3UnbGwgZ2V0IGEgZGlmZmVyZW50IG9yZGVyIGV2ZXJ5IHRpbWUuIFRoZSBjb25zb2xlCitvdXRwdXQgaW5jbHVkZXMgdGhlIHJhbmRvbSBzZWVkIHZhbHVlLCBzdWNoIHRoYXQgeW91IGNhbiByZXByb2R1Y2UgYW4KK29yZGVyLXJlbGF0ZWQgdGVzdCBmYWlsdXJlIGxhdGVyLiBUbyBzcGVjaWZ5IHRoZSByYW5kb20gc2VlZAorZXhwbGljaXRseSwgdXNlIHRoZSBgLS1ndGVzdF9yYW5kb21fc2VlZD1TRUVEYCBmbGFnIChvciBzZXQgdGhlCitgR1RFU1RfUkFORE9NX1NFRURgIGVudmlyb25tZW50IHZhcmlhYmxlKSwgd2hlcmUgYFNFRURgIGlzIGFuIGludGVnZXIKK2JldHdlZW4gMCBhbmQgOTk5OTkuIFRoZSBzZWVkIHZhbHVlIDAgaXMgc3BlY2lhbDogaXQgdGVsbHMgR29vZ2xlIFRlc3QKK3RvIGRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGNhbGN1bGF0aW5nIHRoZSBzZWVkIGZyb20gdGhlIGN1cnJlbnQKK3RpbWUuCisKK0lmIHlvdSBjb21iaW5lIHRoaXMgd2l0aCBgLS1ndGVzdF9yZXBlYXQ9TmAsIEdvb2dsZSBUZXN0IHdpbGwgcGljayBhCitkaWZmZXJlbnQgcmFuZG9tIHNlZWQgYW5kIHJlLXNodWZmbGUgdGhlIHRlc3RzIGluIGVhY2ggaXRlcmF0aW9uLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdjEuNC4wLgorCisjIyBDb250cm9sbGluZyBUZXN0IE91dHB1dCAjIworCitUaGlzIHNlY3Rpb24gdGVhY2hlcyBob3cgdG8gdHdlYWsgdGhlIHdheSB0ZXN0IHJlc3VsdHMgYXJlIHJlcG9ydGVkLgorCisjIyMgQ29sb3JlZCBUZXJtaW5hbCBPdXRwdXQgIyMjCisKK0dvb2dsZSBUZXN0IGNhbiB1c2UgY29sb3JzIGluIGl0cyB0ZXJtaW5hbCBvdXRwdXQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc3BvdAordGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0ZXN0cywgYW5kIHdoZXRoZXIgdGVzdHMgcGFzc2VkLgorCitZb3UgY2FuIHNldCB0aGUgR1RFU1RcX0NPTE9SIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHNldCB0aGUgYC0tZ3Rlc3RfY29sb3JgCitjb21tYW5kIGxpbmUgZmxhZyB0byBgeWVzYCwgYG5vYCwgb3IgYGF1dG9gICh0aGUgZGVmYXVsdCkgdG8gZW5hYmxlIGNvbG9ycywKK2Rpc2FibGUgY29sb3JzLCBvciBsZXQgR29vZ2xlIFRlc3QgZGVjaWRlLiBXaGVuIHRoZSB2YWx1ZSBpcyBgYXV0b2AsIEdvb2dsZQorVGVzdCB3aWxsIHVzZSBjb2xvcnMgaWYgYW5kIG9ubHkgaWYgdGhlIG91dHB1dCBnb2VzIHRvIGEgdGVybWluYWwgYW5kIChvbgorbm9uLVdpbmRvd3MgcGxhdGZvcm1zKSB0aGUgYFRFUk1gIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byBgeHRlcm1gIG9yCitgeHRlcm0tY29sb3JgLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMjIFN1cHByZXNzaW5nIHRoZSBFbGFwc2VkIFRpbWUgIyMjCisKK0J5IGRlZmF1bHQsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUgdGltZSBpdCB0YWtlcyB0byBydW4gZWFjaCB0ZXN0LiAgVG8KK3N1cHByZXNzIHRoYXQsIHJ1biB0aGUgdGVzdCBwcm9ncmFtIHdpdGggdGhlIGAtLWd0ZXN0X3ByaW50X3RpbWU9MGAKK2NvbW1hbmQgbGluZSBmbGFnLiAgU2V0dGluZyB0aGUgYEdURVNUX1BSSU5UX1RJTUVgIGVudmlyb25tZW50Cit2YXJpYWJsZSB0byBgMGAgaGFzIHRoZSBzYW1lIGVmZmVjdC4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuICAoSW4gR29vZ2xlIFRlc3QgMS4zLjAgYW5kIGxvd2VyLAordGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhhdCB0aGUgZWxhcHNlZCB0aW1lIGlzICoqbm90KiogcHJpbnRlZC4pCisKKyMjIyBHZW5lcmF0aW5nIGFuIFhNTCBSZXBvcnQgIyMjCisKK0dvb2dsZSBUZXN0IGNhbiBlbWl0IGEgZGV0YWlsZWQgWE1MIHJlcG9ydCB0byBhIGZpbGUgaW4gYWRkaXRpb24gdG8gaXRzIG5vcm1hbAordGV4dHVhbCBvdXRwdXQuIFRoZSByZXBvcnQgY29udGFpbnMgdGhlIGR1cmF0aW9uIG9mIGVhY2ggdGVzdCwgYW5kIHRodXMgY2FuCitoZWxwIHlvdSBpZGVudGlmeSBzbG93IHRlc3RzLgorCitUbyBnZW5lcmF0ZSB0aGUgWE1MIHJlcG9ydCwgc2V0IHRoZSBgR1RFU1RfT1VUUFVUYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUKK2AtLWd0ZXN0X291dHB1dGAgZmxhZyB0byB0aGUgc3RyaW5nIGAieG1sOl9wYXRoX3RvX291dHB1dF9maWxlXyJgLCB3aGljaCB3aWxsCitjcmVhdGUgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiBZb3UgY2FuIGFsc28ganVzdCB1c2UgdGhlIHN0cmluZworYCJ4bWwiYCwgaW4gd2hpY2ggY2FzZSB0aGUgb3V0cHV0IGNhbiBiZSBmb3VuZCBpbiB0aGUgYHRlc3RfZGV0YWlsLnhtbGAgZmlsZSBpbgordGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCitJZiB5b3Ugc3BlY2lmeSBhIGRpcmVjdG9yeSAoZm9yIGV4YW1wbGUsIGAieG1sOm91dHB1dC9kaXJlY3RvcnkvImAgb24gTGludXggb3IKK2AieG1sOm91dHB1dFxkaXJlY3RvcnlcImAgb24gV2luZG93cyksIEdvb2dsZSBUZXN0IHdpbGwgY3JlYXRlIHRoZSBYTUwgZmlsZSBpbgordGhhdCBkaXJlY3RvcnksIG5hbWVkIGFmdGVyIHRoZSB0ZXN0IGV4ZWN1dGFibGUgKGUuZy4gYGZvb190ZXN0LnhtbGAgZm9yIHRlc3QKK3Byb2dyYW0gYGZvb190ZXN0YCBvciBgZm9vX3Rlc3QuZXhlYCkuIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIChwZXJoYXBzIGxlZnQKK292ZXIgZnJvbSBhIHByZXZpb3VzIHJ1biksIEdvb2dsZSBUZXN0IHdpbGwgcGljayBhIGRpZmZlcmVudCBuYW1lIChlLmcuCitgZm9vX3Rlc3RfMS54bWxgKSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4KKworVGhlIHJlcG9ydCB1c2VzIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGhlcmUuICBJdCBpcyBiYXNlZCBvbiB0aGUKK2BqdW5pdHJlcG9ydGAgQW50IHRhc2sgYW5kIGNhbiBiZSBwYXJzZWQgYnkgcG9wdWxhciBjb250aW51b3VzIGJ1aWxkCitzeXN0ZW1zIGxpa2UgW0h1ZHNvbl0oaHR0cHM6Ly9odWRzb24uZGV2LmphdmEubmV0LykuIFNpbmNlIHRoYXQgZm9ybWF0Cit3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCBmb3IgSmF2YSwgYSBsaXR0bGUgaW50ZXJwcmV0YXRpb24gaXMgcmVxdWlyZWQKK3RvIG1ha2UgaXQgYXBwbHkgdG8gR29vZ2xlIFRlc3QgdGVzdHMsIGFzIHNob3duIGhlcmU6CisKK2BgYAorPHRlc3RzdWl0ZXMgbmFtZT0iQWxsVGVzdHMiIC4uLj4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJ0ZXN0X2Nhc2VfbmFtZSIgLi4uPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0X25hbWUiIC4uLj4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiIvPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIi8+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iLz4KKyAgICA8L3Rlc3RjYXNlPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4KK2BgYAorCisgICogVGhlIHJvb3QgYDx0ZXN0c3VpdGVzPmAgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgZW50aXJlIHRlc3QgcHJvZ3JhbS4KKyAgKiBgPHRlc3RzdWl0ZT5gIGVsZW1lbnRzIGNvcnJlc3BvbmQgdG8gR29vZ2xlIFRlc3QgdGVzdCBjYXNlcy4KKyAgKiBgPHRlc3RjYXNlPmAgZWxlbWVudHMgY29ycmVzcG9uZCB0byBHb29nbGUgVGVzdCB0ZXN0IGZ1bmN0aW9ucy4KKworRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0KKworYGBgCitURVNUKE1hdGhUZXN0LCBBZGRpdGlvbikgeyAuLi4gfQorVEVTVChNYXRoVGVzdCwgU3VidHJhY3Rpb24pIHsgLi4uIH0KK1RFU1QoTG9naWNUZXN0LCBOb25Db250cmFkaWN0aW9uKSB7IC4uLiB9CitgYGAKKworY291bGQgZ2VuZXJhdGUgdGhpcyByZXBvcnQ6CisKK2BgYAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIzIiBmYWlsdXJlcz0iMSIgZXJyb3JzPSIwIiB0aW1lPSIzNSIgbmFtZT0iQWxsVGVzdHMiPgorICA8dGVzdHN1aXRlIG5hbWU9Ik1hdGhUZXN0IiB0ZXN0cz0iMiIgZmFpbHVyZXM9IjEiIGVycm9ycz0iMCIgdGltZT0iMTUiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBZGRpdGlvbiIgc3RhdHVzPSJydW4iIHRpbWU9IjciIGNsYXNzbmFtZT0iIj4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9IlZhbHVlIG9mOiBhZGQoMSwgMSkmI3gwQTsgQWN0dWFsOiAzJiN4MEE7RXhwZWN0ZWQ6IDIiIHR5cGU9IiIvPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iVmFsdWUgb2Y6IGFkZCgxLCAtMSkmI3gwQTsgQWN0dWFsOiAxJiN4MEE7RXhwZWN0ZWQ6IDAiIHR5cGU9IiIvPgorICAgIDwvdGVzdGNhc2U+CisgICAgPHRlc3RjYXNlIG5hbWU9IlN1YnRyYWN0aW9uIiBzdGF0dXM9InJ1biIgdGltZT0iNSIgY2xhc3NuYW1lPSIiPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IkxvZ2ljVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBlcnJvcnM9IjAiIHRpbWU9IjUiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJOb25Db250cmFkaWN0aW9uIiBzdGF0dXM9InJ1biIgdGltZT0iNSIgY2xhc3NuYW1lPSIiPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorPC90ZXN0c3VpdGVzPgorYGBgCisKK1RoaW5ncyB0byBub3RlOgorCisgICogVGhlIGB0ZXN0c2AgYXR0cmlidXRlIG9mIGEgYDx0ZXN0c3VpdGVzPmAgb3IgYDx0ZXN0c3VpdGU+YCBlbGVtZW50IHRlbGxzIGhvdyBtYW55IHRlc3QgZnVuY3Rpb25zIHRoZSBHb29nbGUgVGVzdCBwcm9ncmFtIG9yIHRlc3QgY2FzZSBjb250YWlucywgd2hpbGUgdGhlIGBmYWlsdXJlc2AgYXR0cmlidXRlIHRlbGxzIGhvdyBtYW55IG9mIHRoZW0gZmFpbGVkLgorICAqIFRoZSBgdGltZWAgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgZHVyYXRpb24gb2YgdGhlIHRlc3QsIHRlc3QgY2FzZSwgb3IgZW50aXJlIHRlc3QgcHJvZ3JhbSBpbiBtaWxsaXNlY29uZHMuCisgICogRWFjaCBgPGZhaWx1cmU+YCBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGZhaWxlZCBHb29nbGUgVGVzdCBhc3NlcnRpb24uCisgICogU29tZSBKVW5pdCBjb25jZXB0cyBkb24ndCBhcHBseSB0byBHb29nbGUgVGVzdCwgeWV0IHdlIGhhdmUgdG8gY29uZm9ybSB0byB0aGUgRFRELiBUaGVyZWZvcmUgeW91J2xsIHNlZSBzb21lIGR1bW15IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSByZXBvcnQuIFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGVzZSBwYXJ0cy4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIENvbnRyb2xsaW5nIEhvdyBGYWlsdXJlcyBBcmUgUmVwb3J0ZWQgIyMKKworIyMjIFR1cm5pbmcgQXNzZXJ0aW9uIEZhaWx1cmVzIGludG8gQnJlYWstUG9pbnRzICMjIworCitXaGVuIHJ1bm5pbmcgdGVzdCBwcm9ncmFtcyB1bmRlciBhIGRlYnVnZ2VyLCBpdCdzIHZlcnkgY29udmVuaWVudCBpZiB0aGUKK2RlYnVnZ2VyIGNhbiBjYXRjaCBhbiBhc3NlcnRpb24gZmFpbHVyZSBhbmQgYXV0b21hdGljYWxseSBkcm9wIGludG8gaW50ZXJhY3RpdmUKK21vZGUuIEdvb2dsZSBUZXN0J3MgX2JyZWFrLW9uLWZhaWx1cmVfIG1vZGUgc3VwcG9ydHMgdGhpcyBiZWhhdmlvci4KKworVG8gZW5hYmxlIGl0LCBzZXQgdGhlIGBHVEVTVF9CUkVBS19PTl9GQUlMVVJFYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIHZhbHVlCitvdGhlciB0aGFuIGAwYCAuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlYAorY29tbWFuZCBsaW5lIGZsYWcuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgRGlzYWJsaW5nIENhdGNoaW5nIFRlc3QtVGhyb3duIEV4Y2VwdGlvbnMgIyMjCisKK0dvb2dsZSBUZXN0IGNhbiBiZSB1c2VkIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQgZXhjZXB0aW9ucyBlbmFibGVkLiAgSWYKK2EgdGVzdCB0aHJvd3MgYSBDKysgZXhjZXB0aW9uIG9yIChvbiBXaW5kb3dzKSBhIHN0cnVjdHVyZWQgZXhjZXB0aW9uCisoU0VIKSwgYnkgZGVmYXVsdCBHb29nbGUgVGVzdCBjYXRjaGVzIGl0LCByZXBvcnRzIGl0IGFzIGEgdGVzdAorZmFpbHVyZSwgYW5kIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IHRlc3QgbWV0aG9kLiAgVGhpcyBtYXhpbWl6ZXMgdGhlCitjb3ZlcmFnZSBvZiBhIHRlc3QgcnVuLiAgQWxzbywgb24gV2luZG93cyBhbiB1bmNhdWdodCBleGNlcHRpb24gd2lsbAorY2F1c2UgYSBwb3AtdXAgd2luZG93LCBzbyBjYXRjaGluZyB0aGUgZXhjZXB0aW9ucyBhbGxvd3MgeW91IHRvIHJ1bgordGhlIHRlc3RzIGF1dG9tYXRpY2FsbHkuCisKK1doZW4gZGVidWdnaW5nIHRoZSB0ZXN0IGZhaWx1cmVzLCBob3dldmVyLCB5b3UgbWF5IGluc3RlYWQgd2FudCB0aGUKK2V4Y2VwdGlvbnMgdG8gYmUgaGFuZGxlZCBieSB0aGUgZGVidWdnZXIsIHN1Y2ggdGhhdCB5b3UgY2FuIGV4YW1pbmUKK3RoZSBjYWxsIHN0YWNrIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93bi4gIFRvIGFjaGlldmUgdGhhdCwgc2V0IHRoZQorYEdURVNUX0NBVENIX0VYQ0VQVElPTlNgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGAwYCwgb3IgdXNlIHRoZQorYC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucz0wYCBmbGFnIHdoZW4gcnVubmluZyB0aGUgdGVzdHMuCisKKyoqQXZhaWxhYmlsaXR5Kio6IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIyBMZXR0aW5nIEFub3RoZXIgVGVzdGluZyBGcmFtZXdvcmsgRHJpdmUgIyMjCisKK0lmIHlvdSB3b3JrIG9uIGEgcHJvamVjdCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gdXNpbmcgYW5vdGhlciB0ZXN0aW5nCitmcmFtZXdvcmsgYW5kIGlzIG5vdCByZWFkeSB0byBjb21wbGV0ZWx5IHN3aXRjaCB0byBHb29nbGUgVGVzdCB5ZXQsCit5b3UgY2FuIGdldCBtdWNoIG9mIEdvb2dsZSBUZXN0J3MgYmVuZWZpdCBieSB1c2luZyBpdHMgYXNzZXJ0aW9ucyBpbgoreW91ciBleGlzdGluZyB0ZXN0cy4gIEp1c3QgY2hhbmdlIHlvdXIgYG1haW4oKWAgZnVuY3Rpb24gdG8gbG9vaworbGlrZToKKworYGBgCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7CisgIC8vIEltcG9ydGFudDogR29vZ2xlIFRlc3QgbXVzdCBiZSBpbml0aWFsaXplZC4KKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgLi4uIHdoYXRldmVyIHlvdXIgZXhpc3RpbmcgdGVzdGluZyBmcmFtZXdvcmsgcmVxdWlyZXMgLi4uCit9CitgYGAKKworV2l0aCB0aGF0LCB5b3UgY2FuIHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGluIGFkZGl0aW9uIHRvIHRoZQorbmF0aXZlIGFzc2VydGlvbnMgeW91ciB0ZXN0aW5nIGZyYW1ld29yayBwcm92aWRlcywgZm9yIGV4YW1wbGU6CisKK2BgYAordm9pZCBUZXN0Rm9vRG9lc0JhcigpIHsKKyAgRm9vIGZvbzsKKyAgRVhQRUNUX0xFKGZvby5CYXIoMSksIDEwMCk7ICAgICAvLyBBIEdvb2dsZSBUZXN0IGFzc2VydGlvbi4KKyAgQ1BQVU5JVF9BU1NFUlQoZm9vLklzRW1wdHkoKSk7ICAvLyBBIG5hdGl2ZSBhc3NlcnRpb24uCit9CitgYGAKKworSWYgYSBHb29nbGUgVGVzdCBhc3NlcnRpb24gZmFpbHMsIGl0IHdpbGwgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQKK3Rocm93IGFuIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBiZSB0cmVhdGVkIGFzIGEgZmFpbHVyZSBieSB5b3VyIGhvc3QKK3Rlc3RpbmcgZnJhbWV3b3JrLiAgSWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZCwKK2EgZmFpbGVkIEdvb2dsZSBUZXN0IGFzc2VydGlvbiB3aWxsIGluc3RlYWQgZXhpdCB5b3VyIHByb2dyYW0gd2l0aCBhCitub24temVybyBjb2RlLCB3aGljaCB3aWxsIGFsc28gc2lnbmFsIGEgdGVzdCBmYWlsdXJlIHRvIHlvdXIgdGVzdAorcnVubmVyLgorCitJZiB5b3UgZG9uJ3Qgd3JpdGUgYDo6dGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7YCBpbgoreW91ciBgbWFpbigpYCwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IGVuYWJsZSB0aGlzIGZlYXR1cmUgYnkgc3BlY2lmeWluZwordGhlIGAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmVgIGZsYWcgb24gdGhlIGNvbW1hbmQtbGluZSBvciBzZXR0aW5nIHRoZQorYEdURVNUX1RIUk9XX09OX0ZBSUxVUkVgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgbm9uLXplcm8gdmFsdWUuCisKK0RlYXRoIHRlc3RzIGFyZSBfbm90XyBzdXBwb3J0ZWQgd2hlbiBvdGhlciB0ZXN0IGZyYW1ld29yayBpcyB1c2VkIHRvIG9yZ2FuaXplIHRlc3RzLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdjEuMy4wLgorCisjIyBEaXN0cmlidXRpbmcgVGVzdCBGdW5jdGlvbnMgdG8gTXVsdGlwbGUgTWFjaGluZXMgIyMKKworSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBtYWNoaW5lIHlvdSBjYW4gdXNlIHRvIHJ1biBhIHRlc3QgcHJvZ3JhbSwKK3lvdSBtaWdodCB3YW50IHRvIHJ1biB0aGUgdGVzdCBmdW5jdGlvbnMgaW4gcGFyYWxsZWwgYW5kIGdldCB0aGUKK3Jlc3VsdCBmYXN0ZXIuICBXZSBjYWxsIHRoaXMgdGVjaG5pcXVlIF9zaGFyZGluZ18sIHdoZXJlIGVhY2ggbWFjaGluZQoraXMgY2FsbGVkIGEgX3NoYXJkXy4KKworR29vZ2xlIFRlc3QgaXMgY29tcGF0aWJsZSB3aXRoIHRlc3Qgc2hhcmRpbmcuICBUbyB0YWtlIGFkdmFudGFnZSBvZgordGhpcyBmZWF0dXJlLCB5b3VyIHRlc3QgcnVubmVyIChub3QgcGFydCBvZiBHb29nbGUgVGVzdCkgbmVlZHMgdG8gZG8KK3RoZSBmb2xsb3dpbmc6CisKKyAgMS4gQWxsb2NhdGUgYSBudW1iZXIgb2YgbWFjaGluZXMgKHNoYXJkcykgdG8gcnVuIHRoZSB0ZXN0cy4KKyAgMS4gT24gZWFjaCBzaGFyZCwgc2V0IHRoZSBgR1RFU1RfVE9UQUxfU0hBUkRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcy4gIEl0IG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBzaGFyZHMuCisgIDEuIE9uIGVhY2ggc2hhcmQsIHNldCB0aGUgYEdURVNUX1NIQVJEX0lOREVYYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgaW5kZXggb2YgdGhlIHNoYXJkLiAgRGlmZmVyZW50IHNoYXJkcyBtdXN0IGJlIGFzc2lnbmVkIGRpZmZlcmVudCBpbmRpY2VzLCB3aGljaCBtdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsIEdURVNUX1RPVEFMX1NIQVJEUyAtIDFdYC4KKyAgMS4gUnVuIHRoZSBzYW1lIHRlc3QgcHJvZ3JhbSBvbiBhbGwgc2hhcmRzLiAgV2hlbiBHb29nbGUgVGVzdCBzZWVzIHRoZSBhYm92ZSB0d28gZW52aXJvbm1lbnQgdmFyaWFibGVzLCBpdCB3aWxsIHNlbGVjdCBhIHN1YnNldCBvZiB0aGUgdGVzdCBmdW5jdGlvbnMgdG8gcnVuLiAgQWNyb3NzIGFsbCBzaGFyZHMsIGVhY2ggdGVzdCBmdW5jdGlvbiBpbiB0aGUgcHJvZ3JhbSB3aWxsIGJlIHJ1biBleGFjdGx5IG9uY2UuCisgIDEuIFdhaXQgZm9yIGFsbCBzaGFyZHMgdG8gZmluaXNoLCB0aGVuIGNvbGxlY3QgYW5kIHJlcG9ydCB0aGUgcmVzdWx0cy4KKworWW91ciBwcm9qZWN0IG1heSBoYXZlIHRlc3RzIHRoYXQgd2VyZSB3cml0dGVuIHdpdGhvdXQgR29vZ2xlIFRlc3QgYW5kCit0aHVzIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBwcm90b2NvbC4gIEluIG9yZGVyIGZvciB5b3VyIHRlc3QgcnVubmVyIHRvCitmaWd1cmUgb3V0IHdoaWNoIHRlc3Qgc3VwcG9ydHMgc2hhcmRpbmcsIGl0IGNhbiBzZXQgdGhlIGVudmlyb25tZW50Cit2YXJpYWJsZSBgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEVgIHRvIGEgbm9uLWV4aXN0ZW50IGZpbGUgcGF0aC4gIElmIGEKK3Rlc3QgcHJvZ3JhbSBzdXBwb3J0cyBzaGFyZGluZywgaXQgd2lsbCBjcmVhdGUgdGhpcyBmaWxlIHRvCithY2tub3dsZWRnZSB0aGUgZmFjdCAodGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgbm90CitpbXBvcnRhbnQgYXQgdGhpcyB0aW1lOyBhbHRob3VnaCB3ZSBtYXkgc3RpY2sgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24KK2luIGl0IGluIHRoZSBmdXR1cmUuKTsgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGNyZWF0ZSBpdC4KKworSGVyZSdzIGFuIGV4YW1wbGUgdG8gbWFrZSBpdCBjbGVhci4gIFN1cHBvc2UgeW91IGhhdmUgYSB0ZXN0IHByb2dyYW0KK2Bmb29fdGVzdGAgdGhhdCBjb250YWlucyB0aGUgZm9sbG93aW5nIDUgdGVzdCBmdW5jdGlvbnM6CitgYGAKK1RFU1QoQSwgVikKK1RFU1QoQSwgVykKK1RFU1QoQiwgWCkKK1RFU1QoQiwgWSkKK1RFU1QoQiwgWikKK2BgYAorYW5kIHlvdSBoYXZlIDMgbWFjaGluZXMgYXQgeW91ciBkaXNwb3NhbC4gIFRvIHJ1biB0aGUgdGVzdCBmdW5jdGlvbnMgaW4KK3BhcmFsbGVsLCB5b3Ugd291bGQgc2V0IGBHVEVTVF9UT1RBTF9TSEFSRFNgIHRvIDMgb24gYWxsIG1hY2hpbmVzLCBhbmQKK3NldCBgR1RFU1RfU0hBUkRfSU5ERVhgIHRvIDAsIDEsIGFuZCAyIG9uIHRoZSBtYWNoaW5lcyByZXNwZWN0aXZlbHkuCitUaGVuIHlvdSB3b3VsZCBydW4gdGhlIHNhbWUgYGZvb190ZXN0YCBvbiBlYWNoIG1hY2hpbmUuCisKK0dvb2dsZSBUZXN0IHJlc2VydmVzIHRoZSByaWdodCB0byBjaGFuZ2UgaG93IHRoZSB3b3JrIGlzIGRpc3RyaWJ1dGVkCithY3Jvc3MgdGhlIHNoYXJkcywgYnV0IGhlcmUncyBvbmUgcG9zc2libGUgc2NlbmFyaW86CisKKyAgKiBNYWNoaW5lICMwIHJ1bnMgYEEuVmAgYW5kIGBCLlhgLgorICAqIE1hY2hpbmUgIzEgcnVucyBgQS5XYCBhbmQgYEIuWWAuCisgICogTWFjaGluZSAjMiBydW5zIGBCLlpgLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjMuMC4KKworIyBGdXNpbmcgR29vZ2xlIFRlc3QgU291cmNlIEZpbGVzICMKKworR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiB+MzAgZmlsZXMgKGV4Y2x1ZGluZyBpdHMgb3duCit0ZXN0cykuICBTb21ldGltZXMgeW91IG1heSB3YW50IHRoZW0gdG8gYmUgcGFja2FnZWQgdXAgaW4gdHdvIGZpbGVzIChhCitgLmhgIGFuZCBhIGAuY2NgKSBpbnN0ZWFkLCBzdWNoIHRoYXQgeW91IGNhbiBlYXNpbHkgY29weSB0aGVtIHRvIGEgbmV3CittYWNoaW5lIGFuZCBzdGFydCBoYWNraW5nIHRoZXJlLiAgRm9yIHRoaXMgd2UgcHJvdmlkZSBhbiBleHBlcmltZW50YWwKK1B5dGhvbiBzY3JpcHQgYGZ1c2VfZ3Rlc3RfZmlsZXMucHlgIGluIHRoZSBgc2NyaXB0cy9gIGRpcmVjdG9yeSAoc2luY2UgcmVsZWFzZSAxLjMuMCkuCitBc3N1bWluZyB5b3UgaGF2ZSBQeXRob24gMi40IG9yIGFib3ZlIGluc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUsIGp1c3QKK2dvIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW4KK2BgYAorcHl0aG9uIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgT1VUUFVUX0RJUgorYGBgCisKK2FuZCB5b3Ugc2hvdWxkIHNlZSBhbiBgT1VUUFVUX0RJUmAgZGlyZWN0b3J5IGJlaW5nIGNyZWF0ZWQgd2l0aCBmaWxlcworYGd0ZXN0L2d0ZXN0LmhgIGFuZCBgZ3Rlc3QvZ3Rlc3QtYWxsLmNjYCBpbiBpdC4gIFRoZXNlIGZpbGVzIGNvbnRhaW4KK2V2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gdXNlIEdvb2dsZSBUZXN0LiAgSnVzdCBjb3B5IHRoZW0gdG8gYW55d2hlcmUKK3lvdSB3YW50IGFuZCB5b3UgYXJlIHJlYWR5IHRvIHdyaXRlIHRlc3RzLiAgWW91IGNhbiB1c2UgdGhlCitbc2NyaXB0cy90ZXN0L01ha2VmaWxlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvdGVzdC9NYWtlZmlsZSkKK2ZpbGUgYXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY29tcGlsZSB5b3VyIHRlc3RzIGFnYWluc3QgdGhlbS4KKworIyBXaGVyZSB0byBHbyBmcm9tIEhlcmUgIworCitDb25ncmF0dWxhdGlvbnMhIFlvdSd2ZSBub3cgbGVhcm5lZCBtb3JlIGFkdmFuY2VkIEdvb2dsZSBUZXN0IHRvb2xzIGFuZCBhcmUKK3JlYWR5IHRvIHRhY2tsZSBtb3JlIGNvbXBsZXggdGVzdGluZyB0YXNrcy4gSWYgeW91IHdhbnQgdG8gZGl2ZSBldmVuIGRlZXBlciwgeW91CitjYW4gcmVhZCB0aGUgW0ZyZXF1ZW50bHktQXNrZWQgUXVlc3Rpb25zXShGQVEubWQpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL0Rldkd1aWRlLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvRGV2R3VpZGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NzcwYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL0Rldkd1aWRlLm1kCkBAIC0wLDAgKzEsMTM5IEBACisKKworSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHVuZGVyc3RhbmRpbmcgdGhlIGludGVybmFscyBvZiBHb29nbGUgVGVzdCwKK2J1aWxkaW5nIGZyb20gc291cmNlLCBvciBjb250cmlidXRpbmcgaWRlYXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUKK3Byb2plY3QsIHRoZW4gdGhpcyBkb2N1bWVudCBpcyBmb3IgeW91LgorCisjIEludHJvZHVjdGlvbiAjCisKK0ZpcnN0LCBsZXQncyBnaXZlIHlvdSBzb21lIGJhY2tncm91bmQgb2YgdGhlIHByb2plY3QuCisKKyMjIExpY2Vuc2luZyAjIworCitBbGwgR29vZ2xlIFRlc3Qgc291cmNlIGFuZCBwcmUtYnVpbHQgcGFja2FnZXMgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSBbTmV3IEJTRCBMaWNlbnNlXShodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkuCisKKyMjIFRoZSBHb29nbGUgVGVzdCBDb21tdW5pdHkgIyMKKworVGhlIEdvb2dsZSBUZXN0IGNvbW11bml0eSBleGlzdHMgcHJpbWFyaWx5IHRocm91Z2ggdGhlIFtkaXNjdXNzaW9uIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xldGVzdGZyYW1ld29yayksIHRoZQorW2lzc3VlIHRyYWNrZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L2lzc3Vlcy9saXN0KSBhbmQsIHRvIGEgbGVzc2VyIGV4dGVudCwgdGhlIFtzb3VyY2UgY29udHJvbCByZXBvc2l0b3J5XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvY2hlY2tvdXQpLiBZb3UgYXJlIGRlZmluaXRlbHkgZW5jb3VyYWdlZCB0byBjb250cmlidXRlIHRvIHRoZQorZGlzY3Vzc2lvbiBhbmQgeW91IGNhbiBhbHNvIGhlbHAgdXMgdG8ga2VlcCB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUKK2dyb3VwIGhpZ2ggYnkgZm9sbG93aW5nIGFuZCBwcm9tb3RpbmcgdGhlIGd1aWRlbGluZXMgbGlzdGVkIGhlcmUuCisKKyMjIyBQbGVhc2UgQmUgRnJpZW5kbHkgIyMjCisKK1Nob3dpbmcgY291cnRlc3kgYW5kIHJlc3BlY3QgdG8gb3RoZXJzIGlzIGEgdml0YWwgcGFydCBvZiB0aGUgR29vZ2xlCitjdWx0dXJlLCBhbmQgd2Ugc3Ryb25nbHkgZW5jb3VyYWdlIGV2ZXJ5b25lIHBhcnRpY2lwYXRpbmcgaW4gR29vZ2xlCitUZXN0IGRldmVsb3BtZW50IHRvIGpvaW4gdXMgaW4gYWNjZXB0aW5nIG5vdGhpbmcgbGVzcy4gT2YgY291cnNlLAorYmVpbmcgY291cnRlb3VzIGlzIG5vdCB0aGUgc2FtZSBhcyBmYWlsaW5nIHRvIGNvbnN0cnVjdGl2ZWx5IGRpc2FncmVlCit3aXRoIGVhY2ggb3RoZXIsIGJ1dCBpdCBkb2VzIG1lYW4gdGhhdCB3ZSBzaG91bGQgYmUgcmVzcGVjdGZ1bCBvZiBlYWNoCitvdGhlciB3aGVuIGVudW1lcmF0aW5nIHRoZSA0MiB0ZWNobmljYWwgcmVhc29ucyB0aGF0IGEgcGFydGljdWxhcgorcHJvcG9zYWwgbWF5IG5vdCBiZSB0aGUgYmVzdCBjaG9pY2UuIFRoZXJlJ3MgbmV2ZXIgYSByZWFzb24gdG8gYmUKK2FudGFnb25pc3RpYyBvciBkaXNtaXNzaXZlIHRvd2FyZCBhbnlvbmUgd2hvIGlzIHNpbmNlcmVseSB0cnlpbmcgdG8KK2NvbnRyaWJ1dGUgdG8gYSBkaXNjdXNzaW9uLgorCitTdXJlLCBDKysgdGVzdGluZyBpcyBzZXJpb3VzIGJ1c2luZXNzIGFuZCBhbGwgdGhhdCwgYnV0IGl0J3MgYWxzbworYSBsb3Qgb2YgZnVuLiBMZXQncyBrZWVwIGl0IHRoYXQgd2F5LiBMZXQncyBzdHJpdmUgdG8gYmUgb25lIG9mIHRoZQorZnJpZW5kbGllc3QgY29tbXVuaXRpZXMgaW4gYWxsIG9mIG9wZW4gc291cmNlLgorCisjIyMgV2hlcmUgdG8gRGlzY3VzcyBHb29nbGUgVGVzdCAjIyMKKworQXMgYWx3YXlzLCBkaXNjdXNzIEdvb2dsZSBUZXN0IGluIHRoZSBvZmZpY2lhbCBbR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBkaXNjdXNzaW9uIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xldGVzdGZyYW1ld29yaykuICBZb3UgZG9uJ3QgaGF2ZSB0byBhY3R1YWxseSBzdWJtaXQKK2NvZGUgaW4gb3JkZXIgdG8gc2lnbiB1cC4gWW91ciBwYXJ0aWNpcGF0aW9uIGl0c2VsZiBpcyBhIHZhbHVhYmxlCitjb250cmlidXRpb24uCisKKyMgV29ya2luZyB3aXRoIHRoZSBDb2RlICMKKworSWYgeW91IHdhbnQgdG8gZ2V0IHlvdXIgaGFuZHMgZGlydHkgd2l0aCB0aGUgY29kZSBpbnNpZGUgR29vZ2xlIFRlc3QsCit0aGlzIGlzIHRoZSBzZWN0aW9uIGZvciB5b3UuCisKKyMjIENoZWNraW5nIE91dCB0aGUgU291cmNlIGZyb20gU3VidmVyc2lvbiAjIworCitDaGVja2luZyBvdXQgdGhlIEdvb2dsZSBUZXN0IHNvdXJjZSBpcyBtb3N0IHVzZWZ1bCBpZiB5b3UgcGxhbiB0bwordHdlYWsgaXQgeW91cnNlbGYuICBZb3UgY2hlY2sgb3V0IHRoZSBzb3VyY2UgZm9yIEdvb2dsZSBUZXN0IHVzaW5nIGEKK1tTdWJ2ZXJzaW9uXShodHRwOi8vc3VidmVyc2lvbi50aWdyaXMub3JnLykgY2xpZW50IGFzIHlvdSB3b3VsZCBmb3IgYW55CitvdGhlciBwcm9qZWN0IGhvc3RlZCBvbiBHb29nbGUgQ29kZS4gIFBsZWFzZSBzZWUgdGhlIGluc3RydWN0aW9uIG9uCit0aGUgW3NvdXJjZSBjb2RlIGFjY2VzcyBwYWdlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvY2hlY2tvdXQpIGZvciBob3cgdG8gZG8gaXQuCisKKyMjIENvbXBpbGluZyBmcm9tIFNvdXJjZSAjIworCitPbmNlIHlvdSBjaGVjayBvdXQgdGhlIGNvZGUsIHlvdSBjYW4gZmluZCBpbnN0cnVjdGlvbnMgb24gaG93IHRvCitjb21waWxlIGl0IGluIHRoZSBbUkVBRE1FXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL1JFQURNRSkgZmlsZS4KKworIyMgVGVzdGluZyAjIworCitBIHRlc3RpbmcgZnJhbWV3b3JrIGlzIG9mIG5vIGdvb2QgaWYgaXRzZWxmIGlzIG5vdCB0aG9yb3VnaGx5IHRlc3RlZC4KK1Rlc3RzIHNob3VsZCBiZSB3cml0dGVuIGZvciBhbnkgbmV3IGNvZGUsIGFuZCBjaGFuZ2VzIHNob3VsZCBiZQordmVyaWZpZWQgdG8gbm90IGJyZWFrIGV4aXN0aW5nIHRlc3RzIGJlZm9yZSB0aGV5IGFyZSBzdWJtaXR0ZWQgZm9yCityZXZpZXcuIFRvIHBlcmZvcm0gdGhlIHRlc3RzLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiBbUkVBRE1FXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL1JFQURNRSkgYW5kCit2ZXJpZnkgdGhhdCB0aGVyZSBhcmUgbm8gZmFpbHVyZXMuCisKKyMgQ29udHJpYnV0aW5nIENvZGUgIworCitXZSBhcmUgZXhjaXRlZCB0aGF0IEdvb2dsZSBUZXN0IGlzIG5vdyBvcGVuIHNvdXJjZSwgYW5kIGhvcGUgdG8gZ2V0CitncmVhdCBwYXRjaGVzIGZyb20gdGhlIGNvbW11bml0eS4gQmVmb3JlIHlvdSBmaXJlIHVwIHlvdXIgZmF2b3JpdGUgSURFCithbmQgYmVnaW4gaGFtbWVyaW5nIGF3YXkgYXQgdGhhdCBuZXcgZmVhdHVyZSwgdGhvdWdoLCBwbGVhc2UgdGFrZSB0aGUKK3RpbWUgdG8gcmVhZCB0aGlzIHNlY3Rpb24gYW5kIHVuZGVyc3RhbmQgdGhlIHByb2Nlc3MuIFdoaWxlIGl0IHNlZW1zCityaWdvcm91cywgd2Ugd2FudCB0byBrZWVwIGEgaGlnaCBzdGFuZGFyZCBvZiBxdWFsaXR5IGluIHRoZSBjb2RlCitiYXNlLgorCisjIyBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudHMgIyMKKworWW91IG11c3Qgc2lnbiBhIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpIGJlZm9yZSB3ZSBjYW4KK2FjY2VwdCBhbnkgY29kZS4gIFRoZSBDTEEgcHJvdGVjdHMgeW91IGFuZCB1cy4KKworICAqIElmIHlvdSBhcmUgYW4gaW5kaXZpZHVhbCB3cml0aW5nIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGFuZCB5b3UncmUgc3VyZSB5b3Ugb3duIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHksIHRoZW4geW91J2xsIG5lZWQgdG8gc2lnbiBhbiBbaW5kaXZpZHVhbCBDTEFdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vbGVnYWwvaW5kaXZpZHVhbC1jbGEtdjEuMC5odG1sKS4KKyAgKiBJZiB5b3Ugd29yayBmb3IgYSBjb21wYW55IHRoYXQgd2FudHMgdG8gYWxsb3cgeW91IHRvIGNvbnRyaWJ1dGUgeW91ciB3b3JrIHRvIEdvb2dsZSBUZXN0LCB0aGVuIHlvdSdsbCBuZWVkIHRvIHNpZ24gYSBbY29ycG9yYXRlIENMQV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9sZWdhbC9jb3Jwb3JhdGUtY2xhLXYxLjAuaHRtbCkuCisKK0ZvbGxvdyBlaXRoZXIgb2YgdGhlIHR3byBsaW5rcyBhYm92ZSB0byBhY2Nlc3MgdGhlIGFwcHJvcHJpYXRlIENMQSBhbmQKK2luc3RydWN0aW9ucyBmb3IgaG93IHRvIHNpZ24gYW5kIHJldHVybiBpdC4KKworIyMgQ29kaW5nIFN0eWxlICMjCisKK1RvIGtlZXAgdGhlIHNvdXJjZSBjb25zaXN0ZW50LCByZWFkYWJsZSwgZGlmZmFibGUgYW5kIGVhc3kgdG8gbWVyZ2UsCit3ZSB1c2UgYSBmYWlybHkgcmlnaWQgY29kaW5nIHN0eWxlLCBhcyBkZWZpbmVkIGJ5IHRoZSBbZ29vZ2xlLXN0eWxlZ3VpZGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtc3R5bGVndWlkZS8pIHByb2plY3QuICBBbGwgcGF0Y2hlcyB3aWxsIGJlIGV4cGVjdGVkCit0byBjb25mb3JtIHRvIHRoZSBzdHlsZSBvdXRsaW5lZCBbaGVyZV0oaHR0cDovL2dvb2dsZS1zdHlsZWd1aWRlLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9jcHBndWlkZS54bWwpLgorCisjIyBVcGRhdGluZyBHZW5lcmF0ZWQgQ29kZSAjIworCitTb21lIG9mIEdvb2dsZSBUZXN0J3Mgc291cmNlIGZpbGVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFB1bXAgdG9vbCAoYQorUHl0aG9uIHNjcmlwdCkuICBJZiB5b3UgbmVlZCB0byB1cGRhdGUgc3VjaCBmaWxlcywgcGxlYXNlIG1vZGlmeSB0aGUKK3NvdXJjZSAoYGZvby5oLnB1bXBgKSBhbmQgcmUtZ2VuZXJhdGUgdGhlIEMrKyBmaWxlIHVzaW5nIFB1bXAuICBZb3UKK2NhbiByZWFkIHRoZSBQdW1wTWFudWFsIGZvciBkZXRhaWxzLgorCisjIyBTdWJtaXR0aW5nIFBhdGNoZXMgIyMKKworUGxlYXNlIGRvIHN1Ym1pdCBjb2RlLiBIZXJlJ3Mgd2hhdCB5b3UgbmVlZCB0byBkbzoKKworICAxLiBOb3JtYWxseSB5b3Ugc2hvdWxkIG1ha2UgeW91ciBjaGFuZ2UgYWdhaW5zdCB0aGUgU1ZOIHRydW5rIGluc3RlYWQgb2YgYSBicmFuY2ggb3IgYSB0YWcsIGFzIHRoZSBsYXR0ZXIgdHdvIGFyZSBmb3IgcmVsZWFzZSBjb250cm9sIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBtb3N0bHkgYXMgcmVhZC1vbmx5LgorICAxLiBEZWNpZGUgd2hpY2ggY29kZSB5b3Ugd2FudCB0byBzdWJtaXQuIEEgc3VibWlzc2lvbiBzaG91bGQgYmUgYSBzZXQgb2YgY2hhbmdlcyB0aGF0IGFkZHJlc3NlcyBvbmUgaXNzdWUgaW4gdGhlIFtHb29nbGUgVGVzdCBpc3N1ZSB0cmFja2VyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9pc3N1ZXMvbGlzdCkuIFBsZWFzZSBkb24ndCBtaXggbW9yZSB0aGFuIG9uZSBsb2dpY2FsIGNoYW5nZSBwZXIgc3VibWl0dGFsLCBiZWNhdXNlIGl0IG1ha2VzIHRoZSBoaXN0b3J5IGhhcmQgdG8gZm9sbG93LiBJZiB5b3Ugd2FudCB0byBtYWtlIGEgY2hhbmdlIHRoYXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBpc3N1ZSBpbiB0aGUgaXNzdWUgdHJhY2tlciwgcGxlYXNlIGNyZWF0ZSBvbmUuCisgIDEuIEFsc28sIGNvb3JkaW5hdGUgd2l0aCB0ZWFtIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIG9uIHRoZSBpc3N1ZSBpbiBxdWVzdGlvbi4gVGhpcyBlbnN1cmVzIHRoYXQgd29yayBpc24ndCBiZWluZyBkdXBsaWNhdGVkIGFuZCBjb21tdW5pY2F0aW5nIHlvdXIgcGxhbiBlYXJseSBhbHNvIGdlbmVyYWxseSBsZWFkcyB0byBiZXR0ZXIgcGF0Y2hlcy4KKyAgMS4gRW5zdXJlIHRoYXQgeW91ciBjb2RlIGFkaGVyZXMgdG8gdGhlIFtHb29nbGUgVGVzdCBzb3VyY2UgY29kZSBzdHlsZV0oI0NvZGluZ19TdHlsZS5tZCkuCisgIDEuIEVuc3VyZSB0aGF0IHRoZXJlIGFyZSB1bml0IHRlc3RzIGZvciB5b3VyIGNvZGUuCisgIDEuIFNpZ24gYSBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudC4KKyAgMS4gQ3JlYXRlIGEgcGF0Y2ggZmlsZSB1c2luZyBgc3ZuIGRpZmZgLgorICAxLiBXZSB1c2UgW1JpZXR2ZWxkXShodHRwOi8vY29kZXJldmlldy5hcHBzcG90LmNvbS8pIHRvIGRvIHdlYi1iYXNlZCBjb2RlIHJldmlld3MuICBZb3UgY2FuIHJlYWQgYWJvdXQgdGhlIHRvb2wgW2hlcmVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9yaWV0dmVsZC93aWtpL0NvZGVSZXZpZXdIZWxwKS4gIFdoZW4geW91IGFyZSByZWFkeSwgdXBsb2FkIHlvdXIgcGF0Y2ggdmlhIFJpZXR2ZWxkIGFuZCBub3RpZnkgYGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbWAgdG8gcmV2aWV3IGl0LiAgVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byB1cGxvYWQgdGhlIHBhdGNoLiAgV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBbdXBsb2FkXF9ndGVzdC5weV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zY3JpcHRzL3VwbG9hZF9ndGVzdC5weSkgc2NyaXB0LCB3aGljaCB5b3UgY2FuIGZpbmQgaW4gdGhlIGBzY3JpcHRzL2AgZm9sZGVyIGluIHRoZSBTVk4gdHJ1bmsuCisKKyMjIEdvb2dsZSBUZXN0IENvbW1pdHRlcnMgIyMKKworVGhlIGN1cnJlbnQgbWVtYmVycyBvZiB0aGUgR29vZ2xlIFRlc3QgZW5naW5lZXJpbmcgdGVhbSBhcmUgdGhlIG9ubHkKK2NvbW1pdHRlcnMgYXQgcHJlc2VudC4gSW4gdGhlIGdyZWF0IHRyYWRpdGlvbiBvZiBlYXRpbmcgb25lJ3Mgb3duCitkb2dmb29kLCB3ZSB3aWxsIGJlIHJlcXVpcmluZyBlYWNoIG5ldyBHb29nbGUgVGVzdCBlbmdpbmVlcmluZyB0ZWFtCittZW1iZXIgdG8gZWFybiB0aGUgcmlnaHQgdG8gYmVjb21lIGEgY29tbWl0dGVyIGJ5IGZvbGxvd2luZyB0aGUKK3Byb2NlZHVyZXMgaW4gdGhpcyBkb2N1bWVudCwgd3JpdGluZyBjb25zaXN0ZW50bHkgZ3JlYXQgY29kZSwgYW5kCitkZW1vbnN0cmF0aW5nIHJlcGVhdGVkbHkgdGhhdCBoZSBvciBzaGUgdHJ1bHkgZ2V0cyB0aGUgemVuIG9mIEdvb2dsZQorVGVzdC4KKworIyBSZWxlYXNlIFByb2Nlc3MgIworCitXZSBmb2xsb3cgdGhlIHR5cGljYWwgcmVsZWFzZSBwcm9jZXNzIGZvciBTdWJ2ZXJzaW9uLWJhc2VkIHByb2plY3RzOgorCisgIDEuIEEgcmVsZWFzZSBicmFuY2ggbmFtZWQgYHJlbGVhc2UtWC5ZYCBpcyBjcmVhdGVkLgorICAxLiBCdWdzIGFyZSBmaXhlZCBhbmQgZmVhdHVyZXMgYXJlIGFkZGVkIGluIHRydW5rOyB0aG9zZSBpbmRpdmlkdWFsIHBhdGNoZXMgYXJlIG1lcmdlZCBpbnRvIHRoZSByZWxlYXNlIGJyYW5jaCB1bnRpbCBpdCdzIHN0YWJsZS4KKyAgMS4gQW4gaW5kaXZpZHVhbCBwb2ludCByZWxlYXNlICh0aGUgYFpgIGluIGBYLlkuWmApIGlzIG1hZGUgYnkgY3JlYXRpbmcgYSB0YWcgZnJvbSB0aGUgYnJhbmNoLgorICAxLiBSZXBlYXQgc3RlcHMgMiBhbmQgMyB0aHJvdWdob3V0IG9uZSByZWxlYXNlIGN5Y2xlIChhcyBkZXRlcm1pbmVkIGJ5IGZlYXR1cmVzIG9yIHRpbWUpLgorICAxLiBHbyBiYWNrIHRvIHN0ZXAgMSB0byBjcmVhdGUgYW5vdGhlciByZWxlYXNlIGJyYW5jaCBhbmQgc28gb24uCisKKworLS0tCisKK1RoaXMgcGFnZSBpcyBiYXNlZCBvbiB0aGUgW01ha2luZyBHV1QgQmV0dGVyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3dlYnRvb2xraXQvbWFraW5nZ3d0YmV0dGVyLmh0bWwpIGd1aWRlIGZyb20gdGhlIFtHb29nbGUgV2ViIFRvb2xraXRdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vd2VidG9vbGtpdC8pIHByb2plY3QuICBFeGNlcHQgYXMgb3RoZXJ3aXNlIFtub3RlZF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wb2xpY2llcy5odG1sI3Jlc3RyaWN0aW9ucyksIHRoZSBjb250ZW50IG9mIHRoaXMgcGFnZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgW0NyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41IExpY2Vuc2VdKGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8pLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL0RvY3VtZW50YXRpb24ubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9Eb2N1bWVudGF0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTFhYWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9Eb2N1bWVudGF0aW9uLm1kCkBAIC0wLDAgKzEsMTQgQEAKK1RoaXMgcGFnZSBsaXN0cyBhbGwgZG9jdW1lbnRhdGlvbiB3aWtpIHBhZ2VzIGZvciBHb29nbGUgVGVzdCAqKih0aGUgU1ZOIHRydW5rIHZlcnNpb24pKioKKy0tICoqaWYgeW91IHVzZSBhIHJlbGVhc2VkIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QsIHBsZWFzZSByZWFkIHRoZQorZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyB2ZXJzaW9uIGluc3RlYWQuKioKKworICAqIFtQcmltZXJdKFByaW1lci5tZCkgLS0gc3RhcnQgaGVyZSBpZiB5b3UgYXJlIG5ldyB0byBHb29nbGUgVGVzdC4KKyAgKiBbU2FtcGxlc10oU2FtcGxlcy5tZCkgLS0gbGVhcm4gZnJvbSBleGFtcGxlcy4KKyAgKiBbQWR2YW5jZWRHdWlkZV0oQWR2YW5jZWRHdWlkZS5tZCkgLS0gbGVhcm4gbW9yZSBhYm91dCBHb29nbGUgVGVzdC4KKyAgKiBbWGNvZGVHdWlkZV0oWGNvZGVHdWlkZS5tZCkgLS0gaG93IHRvIHVzZSBHb29nbGUgVGVzdCBpbiBYY29kZSBvbiBNYWMuCisgICogW0ZyZXF1ZW50bHktQXNrZWQgUXVlc3Rpb25zXShGQVEubWQpIC0tIGNoZWNrIGhlcmUgYmVmb3JlIGFza2luZyBhIHF1ZXN0aW9uIG9uIHRoZSBtYWlsaW5nIGxpc3QuCisKK1RvIGNvbnRyaWJ1dGUgY29kZSB0byBHb29nbGUgVGVzdCwgcmVhZDoKKworICAqIFtEZXZHdWlkZV0oRGV2R3VpZGUubWQpIC0tIHJlYWQgdGhpcyBfYmVmb3JlXyB3cml0aW5nIHlvdXIgZmlyc3QgcGF0Y2guCisgICogW1B1bXBNYW51YWxdKFB1bXBNYW51YWwubWQpIC0tIGhvdyB3ZSBnZW5lcmF0ZSBzb21lIG9mIEdvb2dsZSBUZXN0J3Mgc291cmNlIGZpbGVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL0ZBUS5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL0ZBUS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JkOTdiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvRkFRLm1kCkBAIC0wLDAgKzEsMTA4NyBAQAorCisKK0lmIHlvdSBjYW5ub3QgZmluZCB0aGUgYW5zd2VyIHRvIHlvdXIgcXVlc3Rpb24gaGVyZSwgYW5kIHlvdSBoYXZlIHJlYWQKK1tQcmltZXJdKFByaW1lci5tZCkgYW5kIFtBZHZhbmNlZEd1aWRlXShBZHZhbmNlZEd1aWRlLm1kKSwgc2VuZCBpdCB0bworZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tLgorCisjIyBXaHkgc2hvdWxkIEkgdXNlIEdvb2dsZSBUZXN0IGluc3RlYWQgb2YgbXkgZmF2b3JpdGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrPyAjIworCitGaXJzdCwgbGV0IHVzIHNheSBjbGVhcmx5IHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBnZXQgaW50byB0aGUgZGViYXRlIG9mCit3aGljaCBDKysgdGVzdGluZyBmcmFtZXdvcmsgaXMgKip0aGUgYmVzdCoqLiAgVGhlcmUgZXhpc3QgbWFueSBmaW5lCitmcmFtZXdvcmtzIGZvciB3cml0aW5nIEMrKyB0ZXN0cywgYW5kIHdlIGhhdmUgdHJlbWVuZG91cyByZXNwZWN0IGZvcgordGhlIGRldmVsb3BlcnMgYW5kIHVzZXJzIG9mIHRoZW0uICBXZSBkb24ndCB0aGluayB0aGVyZSBpcyAob3Igd2lsbAorYmUpIGEgc2luZ2xlIGJlc3QgZnJhbWV3b3JrIC0geW91IGhhdmUgdG8gcGljayB0aGUgcmlnaHQgdG9vbCBmb3IgdGhlCitwYXJ0aWN1bGFyIHRhc2sgeW91IGFyZSB0YWNrbGluZy4KKworV2UgY3JlYXRlZCBHb29nbGUgVGVzdCBiZWNhdXNlIHdlIGNvdWxkbid0IGZpbmQgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uCitvZiBmZWF0dXJlcyBhbmQgY29udmVuaWVuY2VzIGluIGFuIGV4aXN0aW5nIGZyYW1ld29yayB0byBzYXRpc2Z5IF9vdXJfCituZWVkcy4gIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHRoaW5ncyB0aGF0IF93ZV8gbGlrZSBhYm91dCBHb29nbGUKK1Rlc3QuICBXZSBkb24ndCBjbGFpbSB0aGVtIHRvIGJlIHVuaXF1ZSB0byBHb29nbGUgVGVzdCAtIHJhdGhlciwgdGhlCitjb21iaW5hdGlvbiBvZiB0aGVtIG1ha2VzIEdvb2dsZSBUZXN0IHRoZSBjaG9pY2UgZm9yIHVzLiAgV2UgaG9wZSB0aGlzCitsaXN0IGNhbiBoZWxwIHlvdSBkZWNpZGUgd2hldGhlciBpdCBpcyBmb3IgeW91IHRvby4KKworICAqIEdvb2dsZSBUZXN0IGlzIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlOiBpdCBkb2Vzbid0IHJlcXVpcmUgZXhjZXB0aW9ucyBvciBSVFRJOyBpdCB3b3JrcyBhcm91bmQgdmFyaW91cyBidWdzIGluIHZhcmlvdXMgY29tcGlsZXJzIGFuZCBlbnZpcm9ubWVudHM7IGV0Yy4gIEFzIGEgcmVzdWx0LCBpdCB3b3JrcyBvbiBMaW51eCwgTWFjIE9TIFgsIFdpbmRvd3MgYW5kIHNldmVyYWwgZW1iZWRkZWQgb3BlcmF0aW5nIHN5c3RlbXMuCisgICogTm9uZmF0YWwgYXNzZXJ0aW9ucyAoYEVYUEVDVF8qYCkgaGF2ZSBwcm92ZW4gdG8gYmUgZ3JlYXQgdGltZSBzYXZlcnMsIGFzIHRoZXkgYWxsb3cgYSB0ZXN0IHRvIHJlcG9ydCBtdWx0aXBsZSBmYWlsdXJlcyBpbiBhIHNpbmdsZSBlZGl0LWNvbXBpbGUtdGVzdCBjeWNsZS4KKyAgKiBJdCdzIGVhc3kgdG8gd3JpdGUgYXNzZXJ0aW9ucyB0aGF0IGdlbmVyYXRlIGluZm9ybWF0aXZlIG1lc3NhZ2VzOiB5b3UganVzdCB1c2UgdGhlIHN0cmVhbSBzeW50YXggdG8gYXBwZW5kIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBlLmcuIGBBU1NFUlRfRVEoNSwgRm9vKGkpKSA8PCAiIHdoZXJlIGkgPSAiIDw8IGk7YC4gIEl0IGRvZXNuJ3QgcmVxdWlyZSBhIG5ldyBzZXQgb2YgbWFjcm9zIG9yIHNwZWNpYWwgZnVuY3Rpb25zLgorICAqIEdvb2dsZSBUZXN0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyB5b3VyIHRlc3RzIGFuZCBkb2Vzbid0IHJlcXVpcmUgeW91IHRvIGVudW1lcmF0ZSB0aGVtIGluIG9yZGVyIHRvIHJ1biB0aGVtLgorICAqIERlYXRoIHRlc3RzIGFyZSBwcmV0dHkgaGFuZHkgZm9yIGVuc3VyaW5nIHRoYXQgeW91ciBhc3NlcnRzIGluIHByb2R1Y3Rpb24gY29kZSBhcmUgdHJpZ2dlcmVkIGJ5IHRoZSByaWdodCBjb25kaXRpb25zLgorICAqIGBTQ09QRURfVFJBQ0VgIGhlbHBzIHlvdSB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIGFuIGFzc2VydGlvbiBmYWlsdXJlIHdoZW4gaXQgY29tZXMgZnJvbSBpbnNpZGUgYSBzdWItcm91dGluZSBvciBsb29wLgorICAqIFlvdSBjYW4gZGVjaWRlIHdoaWNoIHRlc3RzIHRvIHJ1biB1c2luZyBuYW1lIHBhdHRlcm5zLiAgVGhpcyBzYXZlcyB0aW1lIHdoZW4geW91IHdhbnQgdG8gcXVpY2tseSByZXByb2R1Y2UgYSB0ZXN0IGZhaWx1cmUuCisgICogR29vZ2xlIFRlc3QgY2FuIGdlbmVyYXRlIFhNTCB0ZXN0IHJlc3VsdCByZXBvcnRzIHRoYXQgY2FuIGJlIHBhcnNlZCBieSBwb3B1bGFyIGNvbnRpbnVvdXMgYnVpbGQgc3lzdGVtIGxpa2UgSHVkc29uLgorICAqIFNpbXBsZSB0aGluZ3MgYXJlIGVhc3kgaW4gR29vZ2xlIFRlc3QsIHdoaWxlIGhhcmQgdGhpbmdzIGFyZSBwb3NzaWJsZTogaW4gYWRkaXRpb24gdG8gYWR2YW5jZWQgZmVhdHVyZXMgbGlrZSBbZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0FkdmFuY2VkR3VpZGUjR2xvYmFsX1NldC1VcF9hbmRfVGVhci1Eb3duKSBhbmQgdGVzdHMgcGFyYW1ldGVyaXplZCBieSBbdmFsdWVzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0FkdmFuY2VkR3VpZGUjVmFsdWVfUGFyYW1ldGVyaXplZF9UZXN0cykgb3IgW3R5cGVzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0FkdmFuY2VkR3VpZGUjVHlwZWRfVGVzdHMpLCBHb29nbGUgVGVzdCBzdXBwb3J0cyB2YXJpb3VzIHdheXMgZm9yIHRoZSB1c2VyIHRvIGV4dGVuZCB0aGUgZnJhbWV3b3JrIC0tIGlmIEdvb2dsZSBUZXN0IGRvZXNuJ3QgZG8gc29tZXRoaW5nIG91dCBvZiB0aGUgYm94LCBjaGFuY2VzIGFyZSB0aGF0IGEgdXNlciBjYW4gaW1wbGVtZW50IHRoZSBmZWF0dXJlIHVzaW5nIEdvb2dsZSBUZXN0J3MgcHVibGljIEFQSSwgd2l0aG91dCBjaGFuZ2luZyBHb29nbGUgVGVzdCBpdHNlbGYuICBJbiBwYXJ0aWN1bGFyLCB5b3UgY2FuOgorICAgICogZXhwYW5kIHlvdXIgdGVzdGluZyB2b2NhYnVsYXJ5IGJ5IGRlZmluaW5nIFtjdXN0b20gcHJlZGljYXRlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9BZHZhbmNlZEd1aWRlI1ByZWRpY2F0ZV9Bc3NlcnRpb25zX2Zvcl9CZXR0ZXJfRXJyb3JfTWVzc2FnZXMpLAorICAgICogdGVhY2ggR29vZ2xlIFRlc3QgaG93IHRvIFtwcmludCB5b3VyIHR5cGVzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0FkdmFuY2VkR3VpZGUjVGVhY2hpbmdfR29vZ2xlX1Rlc3RfSG93X3RvX1ByaW50X1lvdXJfVmFsdWVzKSwKKyAgICAqIGRlZmluZSB5b3VyIG93biB0ZXN0aW5nIG1hY3JvcyBvciB1dGlsaXRpZXMgYW5kIHZlcmlmeSB0aGVtIHVzaW5nIEdvb2dsZSBUZXN0J3MgW1NlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0FkdmFuY2VkR3VpZGUjQ2F0Y2hpbmdfRmFpbHVyZXMpLCBhbmQKKyAgICAqIHJlZmxlY3Qgb24gdGhlIHRlc3QgY2FzZXMgb3IgY2hhbmdlIHRoZSB0ZXN0IG91dHB1dCBmb3JtYXQgYnkgaW50ZXJjZXB0aW5nIHRoZSBbdGVzdCBldmVudHNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvQWR2YW5jZWRHdWlkZSNFeHRlbmRpbmdfR29vZ2xlX1Rlc3RfYnlfSGFuZGxpbmdfVGVzdF9FdmVudHMpLgorCisjIyBJJ20gZ2V0dGluZyB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdC4gIFdvdWxkIHlvdSBmaXggdGhlbT8gIyMKKworV2Ugc3RyaXZlIHRvIG1pbmltaXplIGNvbXBpbGVyIHdhcm5pbmdzIEdvb2dsZSBUZXN0IGdlbmVyYXRlcy4gIEJlZm9yZSByZWxlYXNpbmcgYSBuZXcgdmVyc2lvbiwgd2UgdGVzdCB0byBtYWtlIHN1cmUgdGhhdCBpdCBkb2Vzbid0IGdlbmVyYXRlIHdhcm5pbmdzIHdoZW4gY29tcGlsZWQgdXNpbmcgaXRzIENNYWtlIHNjcmlwdCBvbiBXaW5kb3dzLCBMaW51eCwgYW5kIE1hYyBPUy4KKworVW5mb3J0dW5hdGVseSwgdGhpcyBkb2Vzbid0IG1lYW4geW91IGFyZSBndWFyYW50ZWVkIHRvIHNlZSBubyB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBpbiB5b3VyIGVudmlyb25tZW50OgorCisgICogWW91IG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBjb21waWxlciBhcyB3ZSB1c2UsIG9yIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhlIHNhbWUgY29tcGlsZXIuICBXZSBjYW5ub3QgcG9zc2libHkgdGVzdCBmb3IgYWxsIGNvbXBpbGVycy4KKyAgKiBZb3UgbWF5IGJlIGNvbXBpbGluZyBvbiBhIGRpZmZlcmVudCBwbGF0Zm9ybSBhcyB3ZSBkby4KKyAgKiBZb3VyIHByb2plY3QgbWF5IGJlIHVzaW5nIGRpZmZlcmVudCBjb21waWxlciBmbGFncyBhcyB3ZSBkby4KKworSXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byBtYWtlIEdvb2dsZSBUZXN0IHdhcm5pbmctZnJlZSBmb3IgZXZlcnlvbmUuICBPciwgaXQgbWF5IG5vdCBiZSBkZXNpcmFibGUgaWYgdGhlIHdhcm5pbmcgaXMgcmFyZWx5IGVuYWJsZWQgYW5kIGZpeGluZyB0aGUgdmlvbGF0aW9ucyBtYWtlcyB0aGUgY29kZSBtb3JlIGNvbXBsZXguCisKK0lmIHlvdSBzZWUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgR29vZ2xlIFRlc3QsIHdlIHN1Z2dlc3QgdGhhdCB5b3UgdXNlIHRoZSBgLWlzeXN0ZW1gIGZsYWcgKGFzc3VtaW5nIHlvdXIgYXJlIHVzaW5nIEdDQykgdG8gbWFyayBHb29nbGUgVGVzdCBoZWFkZXJzIGFzIHN5c3RlbSBoZWFkZXJzLiAgVGhhdCdsbCBzdXBwcmVzcyB3YXJuaW5ncyBmcm9tIEdvb2dsZSBUZXN0IGhlYWRlcnMuCisKKyMjIFdoeSBzaG91bGQgbm90IHRlc3QgY2FzZSBuYW1lcyBhbmQgdGVzdCBuYW1lcyBjb250YWluIHVuZGVyc2NvcmU/ICMjCisKK1VuZGVyc2NvcmUgKGBfYCkgaXMgc3BlY2lhbCwgYXMgQysrIHJlc2VydmVzIHRoZSBmb2xsb3dpbmcgdG8gYmUgdXNlZCBieQordGhlIGNvbXBpbGVyIGFuZCB0aGUgc3RhbmRhcmQgbGlicmFyeToKKworICAxLiBhbnkgaWRlbnRpZmllciB0aGF0IHN0YXJ0cyB3aXRoIGFuIGBfYCBmb2xsb3dlZCBieSBhbiB1cHBlci1jYXNlIGxldHRlciwgYW5kCisgIDEuIGFueSBpZGVudGlmaWVyIHRoYXQgY29udGFpbmVycyB0d28gY29uc2VjdXRpdmUgdW5kZXJzY29yZXMgKGkuZS4gYF9fYCkgX2FueXdoZXJlXyBpbiBpdHMgbmFtZS4KKworVXNlciBjb2RlIGlzIF9wcm9oaWJpdGVkXyBmcm9tIHVzaW5nIHN1Y2ggaWRlbnRpZmllcnMuCisKK05vdyBsZXQncyBsb29rIGF0IHdoYXQgdGhpcyBtZWFucyBmb3IgYFRFU1RgIGFuZCBgVEVTVF9GYC4KKworQ3VycmVudGx5IGBURVNUKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpYCBnZW5lcmF0ZXMgYSBjbGFzcyBuYW1lZAorYFRlc3RDYXNlTmFtZV9UZXN0TmFtZV9UZXN0YC4gIFdoYXQgaGFwcGVucyBpZiBgVGVzdENhc2VOYW1lYCBvciBgVGVzdE5hbWVgCitjb250YWlucyBgX2A/CisKKyAgMS4gSWYgYFRlc3RDYXNlTmFtZWAgc3RhcnRzIHdpdGggYW4gYF9gIGZvbGxvd2VkIGJ5IGFuIHVwcGVyLWNhc2UgbGV0dGVyIChzYXksIGBfRm9vYCksIHdlIGVuZCB1cCB3aXRoIGBfRm9vX1Rlc3ROYW1lX1Rlc3RgLCB3aGljaCBpcyByZXNlcnZlZCBhbmQgdGh1cyBpbnZhbGlkLgorICAxLiBJZiBgVGVzdENhc2VOYW1lYCBlbmRzIHdpdGggYW4gYF9gIChzYXksIGBGb29fYCksIHdlIGdldCBgRm9vX19UZXN0TmFtZV9UZXN0YCwgd2hpY2ggaXMgaW52YWxpZC4KKyAgMS4gSWYgYFRlc3ROYW1lYCBzdGFydHMgd2l0aCBhbiBgX2AgKHNheSwgYF9CYXJgKSwgd2UgZ2V0IGBUZXN0Q2FzZU5hbWVfX0Jhcl9UZXN0YCwgd2hpY2ggaXMgaW52YWxpZC4KKyAgMS4gSWYgYFRlc3ROYW1lYCBlbmRzIHdpdGggYW4gYF9gIChzYXksIGBCYXJfYCksIHdlIGdldCBgVGVzdENhc2VOYW1lX0Jhcl9fVGVzdGAsIHdoaWNoIGlzIGludmFsaWQuCisKK1NvIGNsZWFybHkgYFRlc3RDYXNlTmFtZWAgYW5kIGBUZXN0TmFtZWAgY2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIGBfYAorKEFjdHVhbGx5LCBgVGVzdENhc2VOYW1lYCBjYW4gc3RhcnQgd2l0aCBgX2AgLS0gYXMgbG9uZyBhcyB0aGUgYF9gIGlzbid0Citmb2xsb3dlZCBieSBhbiB1cHBlci1jYXNlIGxldHRlci4gIEJ1dCB0aGF0J3MgZ2V0dGluZyBjb21wbGljYXRlZC4gIFNvCitmb3Igc2ltcGxpY2l0eSB3ZSBqdXN0IHNheSB0aGF0IGl0IGNhbm5vdCBzdGFydCB3aXRoIGBfYC4pLgorCitJdCBtYXkgc2VlbSBmaW5lIGZvciBgVGVzdENhc2VOYW1lYCBhbmQgYFRlc3ROYW1lYCB0byBjb250YWluIGBfYCBpbiB0aGUKK21pZGRsZS4gIEhvd2V2ZXIsIGNvbnNpZGVyIHRoaXM6CitgYGAKK1RFU1QoVGltZSwgRmxpZXNfTGlrZV9Bbl9BcnJvdykgeyAuLi4gfQorVEVTVChUaW1lX0ZsaWVzLCBMaWtlX0FuX0Fycm93KSB7IC4uLiB9CitgYGAKKworTm93LCB0aGUgdHdvIGBURVNUYHMgd2lsbCBib3RoIGdlbmVyYXRlIHRoZSBzYW1lIGNsYXNzCisoYFRpbWVfRmlsZXNfTGlrZV9Bbl9BcnJvd19UZXN0YCkuICBUaGF0J3Mgbm90IGdvb2QuCisKK1NvIGZvciBzaW1wbGljaXR5LCB3ZSBqdXN0IGFzayB0aGUgdXNlcnMgdG8gYXZvaWQgYF9gIGluIGBUZXN0Q2FzZU5hbWVgCithbmQgYFRlc3ROYW1lYC4gIFRoZSBydWxlIGlzIG1vcmUgY29uc3RyYWluaW5nIHRoYW4gbmVjZXNzYXJ5LCBidXQgaXQncworc2ltcGxlIGFuZCBlYXN5IHRvIHJlbWVtYmVyLiAgSXQgYWxzbyBnaXZlcyBHb29nbGUgVGVzdCBzb21lIHdpZ2dsZQorcm9vbSBpbiBjYXNlIGl0cyBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKworSWYgeW91IHZpb2xhdGUgdGhlIHJ1bGUsIHRoZXJlIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgY29uc2VxdWVuY2VzLAorYnV0IHlvdXIgdGVzdCBtYXkgKGp1c3QgbWF5KSBicmVhayB3aXRoIGEgbmV3IGNvbXBpbGVyIChvciBhIG5ldwordmVyc2lvbiBvZiB0aGUgY29tcGlsZXIgeW91IGFyZSB1c2luZykgb3Igd2l0aCBhIG5ldyB2ZXJzaW9uIG9mIEdvb2dsZQorVGVzdC4gIFRoZXJlZm9yZSBpdCdzIGJlc3QgdG8gZm9sbG93IHRoZSBydWxlLgorCisjIyBXaHkgaXMgaXQgbm90IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBwcmUtY29tcGlsZWQgY29weSBvZiBHb29nbGUgVGVzdCAoZm9yIGV4YW1wbGUsIGludG8gL3Vzci9sb2NhbCk/ICMjCisKK0luIHRoZSBlYXJseSBkYXlzLCB3ZSBzYWlkIHRoYXQgeW91IGNvdWxkIGluc3RhbGwKK2NvbXBpbGVkIEdvb2dsZSBUZXN0IGxpYnJhcmllcyBvbiBgKmBuaXggc3lzdGVtcyB1c2luZyBgbWFrZSBpbnN0YWxsYC4KK1RoZW4gZXZlcnkgdXNlciBvZiB5b3VyIG1hY2hpbmUgY2FuIHdyaXRlIHRlc3RzIHdpdGhvdXQKK3JlY29tcGlsaW5nIEdvb2dsZSBUZXN0LgorCitUaGlzIHNlZW1lZCBsaWtlIGEgZ29vZCBpZGVhLCBidXQgaXQgaGFzIGEKK2dvdC1jaGE6IGV2ZXJ5IHVzZXIgbmVlZHMgdG8gY29tcGlsZSBoaXMgdGVzdHMgdXNpbmcgdGhlIF9zYW1lXyBjb21waWxlcgorZmxhZ3MgdXNlZCB0byBjb21waWxlIHRoZSBpbnN0YWxsZWQgR29vZ2xlIFRlc3QgbGlicmFyaWVzOyBvdGhlcndpc2UKK2hlIG1heSBydW4gaW50byB1bmRlZmluZWQgYmVoYXZpb3JzIChpLmUuIHRoZSB0ZXN0cyBjYW4gYmVoYXZlCitzdHJhbmdlbHkgYW5kIG1heSBldmVuIGNyYXNoIGZvciBubyBvYnZpb3VzIHJlYXNvbnMpLgorCitXaHk/ICBCZWNhdXNlIEMrKyBoYXMgdGhpcyB0aGluZyBjYWxsZWQgdGhlIE9uZS1EZWZpbml0aW9uIFJ1bGU6IGlmCit0d28gQysrIHNvdXJjZSBmaWxlcyBjb250YWluIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZQorY2xhc3MvZnVuY3Rpb24vdmFyaWFibGUsIGFuZCB5b3UgbGluayB0aGVtIHRvZ2V0aGVyLCB5b3UgdmlvbGF0ZSB0aGUKK3J1bGUuICBUaGUgbGlua2VyIG1heSBvciBtYXkgbm90IGNhdGNoIHRoZSBlcnJvciAoaW4gbWFueSBjYXNlcyBpdCdzCitub3QgcmVxdWlyZWQgYnkgdGhlIEMrKyBzdGFuZGFyZCB0byBjYXRjaCB0aGUgdmlvbGF0aW9uKS4gIElmIGl0Citkb2Vzbid0LCB5b3UgZ2V0IHN0cmFuZ2UgcnVuLXRpbWUgYmVoYXZpb3JzIHRoYXQgYXJlIHVuZXhwZWN0ZWQgYW5kCitoYXJkIHRvIGRlYnVnLgorCitJZiB5b3UgY29tcGlsZSBHb29nbGUgVGVzdCBhbmQgeW91ciB0ZXN0IGNvZGUgdXNpbmcgZGlmZmVyZW50IGNvbXBpbGVyCitmbGFncywgdGhleSBtYXkgc2VlIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZQorY2xhc3MvZnVuY3Rpb24vdmFyaWFibGUgKGUuZy4gZHVlIHRvIHRoZSB1c2Ugb2YgYCNpZmAgaW4gR29vZ2xlIFRlc3QpLgorVGhlcmVmb3JlLCBmb3IgeW91ciBzYW5pdHksIHdlIHJlY29tbWVuZCB0byBhdm9pZCBpbnN0YWxsaW5nIHByZS1jb21waWxlZAorR29vZ2xlIFRlc3QgbGlicmFyaWVzLiAgSW5zdGVhZCwgZWFjaCBwcm9qZWN0IHNob3VsZCBjb21waWxlCitHb29nbGUgVGVzdCBpdHNlbGYgc3VjaCB0aGF0IGl0IGNhbiBiZSBzdXJlIHRoYXQgdGhlIHNhbWUgZmxhZ3MgYXJlCit1c2VkIGZvciBib3RoIEdvb2dsZSBUZXN0IGFuZCB0aGUgdGVzdHMuCisKKyMjIEhvdyBkbyBJIGdlbmVyYXRlIDY0LWJpdCBiaW5hcmllcyBvbiBXaW5kb3dzICh1c2luZyBWaXN1YWwgU3R1ZGlvIDIwMDgpPyAjIworCisoQW5zd2VyZWQgYnkgVHJldm9yIFJvYmluc29uKQorCitMb2FkIHRoZSBzdXBwbGllZCBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZpbGUsIGVpdGhlciBgbXN2Y1xndGVzdC1tZC5zbG5gIG9yCitgbXN2Y1xndGVzdC5zbG5gLiBHbyB0aHJvdWdoIHRoZSBtaWdyYXRpb24gd2l6YXJkIHRvIG1pZ3JhdGUgdGhlCitzb2x1dGlvbiBhbmQgcHJvamVjdCBmaWxlcyB0byBWaXN1YWwgU3R1ZGlvIDIwMDguIFNlbGVjdAorYENvbmZpZ3VyYXRpb24gTWFuYWdlci4uLmAgZnJvbSB0aGUgYEJ1aWxkYCBtZW51LiBTZWxlY3QgYDxOZXcuLi4+YCBmcm9tCit0aGUgYEFjdGl2ZSBzb2x1dGlvbiBwbGF0Zm9ybWAgZHJvcGRvd24uICBTZWxlY3QgYHg2NGAgZnJvbSB0aGUgbmV3CitwbGF0Zm9ybSBkcm9wZG93biwgbGVhdmUgYENvcHkgc2V0dGluZ3MgZnJvbWAgc2V0IHRvIGBXaW4zMmAgYW5kCitgQ3JlYXRlIG5ldyBwcm9qZWN0IHBsYXRmb3Jtc2AgY2hlY2tlZCwgdGhlbiBjbGljayBgT0tgLiBZb3Ugbm93IGhhdmUKK2BXaW4zMmAgYW5kIGB4NjRgIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb25zLCBzZWxlY3RhYmxlIGZyb20gdGhlCitgU3RhbmRhcmRgIHRvb2xiYXIsIHdoaWNoIGFsbG93IHlvdSB0byB0b2dnbGUgYmV0d2VlbiBidWlsZGluZyAzMi1iaXQgb3IKKzY0LWJpdCBiaW5hcmllcyAob3IgYm90aCBhdCBvbmNlIHVzaW5nIEJhdGNoIEJ1aWxkKS4KKworSW4gb3JkZXIgdG8gcHJldmVudCBidWlsZCBvdXRwdXQgZmlsZXMgZnJvbSBvdmVyd3JpdGluZyBvbmUgYW5vdGhlciwKK3lvdSdsbCBuZWVkIHRvIGNoYW5nZSB0aGUgYEludGVybWVkaWF0ZSBEaXJlY3RvcnlgIHNldHRpbmdzIGZvciB0aGUKK25ld2x5IGNyZWF0ZWQgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBhY3Jvc3MgYWxsIHRoZSBwcm9qZWN0cy4gVG8gZG8KK3RoaXMsIG11bHRpLXNlbGVjdCAoZS5nLiB1c2luZyBzaGlmdC1jbGljaykgYWxsIHByb2plY3RzIChidXQgbm90IHRoZQorc29sdXRpb24pIGluIHRoZSBgU29sdXRpb24gRXhwbG9yZXJgLiBSaWdodC1jbGljayBvbmUgb2YgdGhlbSBhbmQKK3NlbGVjdCBgUHJvcGVydGllc2AuIEluIHRoZSBsZWZ0IHBhbmUsIHNlbGVjdCBgQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzYCwKK2FuZCBmcm9tIHRoZSBgQ29uZmlndXJhdGlvbmAgZHJvcGRvd24sIHNlbGVjdCBgQWxsIENvbmZpZ3VyYXRpb25zYC4KK01ha2Ugc3VyZSB0aGUgc2VsZWN0ZWQgcGxhdGZvcm0gaXMgYHg2NGAuIEZvciB0aGUKK2BJbnRlcm1lZGlhdGUgRGlyZWN0b3J5YCBzZXR0aW5nLCBjaGFuZ2UgdGhlIHZhbHVlIGZyb20KK2AkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSlgIHRvCitgJChPdXREaXIpXCQoUHJvamVjdE5hbWUpYC4gQ2xpY2sgYE9LYCBhbmQgdGhlbiBidWlsZCB0aGUKK3NvbHV0aW9uLiBXaGVuIHRoZSBidWlsZCBpcyBjb21wbGV0ZSwgdGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGluCit0aGUgYG1zdmNceDY0XERlYnVnYCBkaXJlY3RvcnkuCisKKyMjIENhbiBJIHVzZSBHb29nbGUgVGVzdCBvbiBNaW5HVz8gIyMKKworV2UgaGF2ZW4ndCB0ZXN0ZWQgdGhpcyBvdXJzZWx2ZXMsIGJ1dCBQZXIgQWJyYWhhbXNlbiByZXBvcnRlZCB0aGF0IGhlCit3YXMgYWJsZSB0byBjb21waWxlIGFuZCBpbnN0YWxsIEdvb2dsZSBUZXN0IHN1Y2Nlc3NmdWxseSB3aGVuIHVzaW5nCitNaW5HVyBmcm9tIEN5Z3dpbi4gIFlvdSdsbCBuZWVkIHRvIGNvbmZpZ3VyZSBpdCB3aXRoOgorCitgUEFUSC9UTy9jb25maWd1cmUgQ0M9ImdjYyAtbW5vLWN5Z3dpbiIgQ1hYPSJnKysgLW1uby1jeWd3aW4iYAorCitZb3Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGUgYC1tbm8tY3lnd2luYCBvcHRpb24gd2l0aCBkaXJlY3QgbGlua3MKK3RvIHRoZSByZWFsIE1pbkdXIGJpbmFyaWVzLCBidXQgd2UgaGF2ZW4ndCB0cmllZCB0aGF0LgorCitDYXZlYXRzOgorCisgICogVGhlcmUgYXJlIG1hbnkgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcuCisgICogYG1ha2UgY2hlY2tgIHdpbGwgcHJvZHVjZSBzb21lIGVycm9ycyBhcyBub3QgYWxsIHRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYgYXJlIGNvbXBhdGlibGUgd2l0aCBNaW5HVy4KKworV2UgYWxzbyBoYXZlIHJlcG9ydHMgb24gc3VjY2Vzc2Z1bCBjcm9zcyBjb21waWxhdGlvbiBvZiBHb29nbGUgVGVzdAorTWluR1cgYmluYXJpZXMgb24gTGludXggdXNpbmcKK1t0aGVzZSBpbnN0cnVjdGlvbnNdKGh0dHA6Ly93aWtpLnd4d2lkZ2V0cy5vcmcvQ3Jvc3MtQ29tcGlsaW5nX1VuZGVyX0xpbnV4I0Nyb3NzLWNvbXBpbGluZ191bmRlcl9MaW51eF9mb3JfTVNfV2luZG93cykKK29uIHRoZSBXeFdpZGdldHMgc2l0ZS4KKworUGxlYXNlIGNvbnRhY3QgYGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbWAgaWYgeW91IGFyZQoraW50ZXJlc3RlZCBpbiBpbXByb3ZpbmcgdGhlIHN1cHBvcnQgZm9yIE1pbkdXLgorCisjIyBXaHkgZG9lcyBHb29nbGUgVGVzdCBzdXBwb3J0IEVYUEVDVFxfRVEoTlVMTCwgcHRyKSBhbmQgQVNTRVJUXF9FUShOVUxMLCBwdHIpIGJ1dCBub3QgRVhQRUNUXF9ORShOVUxMLCBwdHIpIGFuZCBBU1NFUlRcX05FKE5VTEwsIHB0cik/ICMjCisKK0R1ZSB0byBzb21lIHBlY3VsaWFyaXR5IG9mIEMrKywgaXQgcmVxdWlyZXMgc29tZSBub24tdHJpdmlhbCB0ZW1wbGF0ZQorbWV0YSBwcm9ncmFtbWluZyB0cmlja3MgdG8gc3VwcG9ydCB1c2luZyBgTlVMTGAgYXMgYW4gYXJndW1lbnQgb2YgdGhlCitgRVhQRUNUX1hYKClgIGFuZCBgQVNTRVJUX1hYKClgIG1hY3Jvcy4gVGhlcmVmb3JlIHdlIG9ubHkgZG8gaXQgd2hlcmUKK2l0J3MgbW9zdCBuZWVkZWQgKG90aGVyd2lzZSB3ZSBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHb29nbGUgVGVzdAoraGFyZGVyIHRvIG1haW50YWluIGFuZCBtb3JlIGVycm9yLXByb25lIHRoYW4gbmVjZXNzYXJ5KS4KKworVGhlIGBFWFBFQ1RfRVEoKWAgbWFjcm8gdGFrZXMgdGhlIF9leHBlY3RlZF8gdmFsdWUgYXMgaXRzIGZpcnN0Cithcmd1bWVudCBhbmQgdGhlIF9hY3R1YWxfIHZhbHVlIGFzIHRoZSBzZWNvbmQuIEl0J3MgcmVhc29uYWJsZSB0aGF0Citzb21lb25lIHdhbnRzIHRvIHdyaXRlIGBFWFBFQ1RfRVEoTlVMTCwgc29tZV9leHByZXNzaW9uKWAsIGFuZCB0aGlzCitpbmRlZWQgd2FzIHJlcXVlc3RlZCBzZXZlcmFsIHRpbWVzLiBUaGVyZWZvcmUgd2UgaW1wbGVtZW50ZWQgaXQuCisKK1RoZSBuZWVkIGZvciBgRVhQRUNUX05FKE5VTEwsIHB0cilgIGlzbid0IG5lYXJseSBhcyBzdHJvbmcuIFdoZW4gdGhlCithc3NlcnRpb24gZmFpbHMsIHlvdSBhbHJlYWR5IGtub3cgdGhhdCBgcHRyYCBtdXN0IGJlIGBOVUxMYCwgc28gaXQKK2RvZXNuJ3QgYWRkIGFueSBpbmZvcm1hdGlvbiB0byBwcmludCBwdHIgaW4gdGhpcyBjYXNlLiBUaGF0IG1lYW5zCitgRVhQRUNUX1RSVUUocHRyICE9IE5VTEwpYCB3b3JrcyBqdXN0IGFzIHdlbGwuCisKK0lmIHdlIHdlcmUgdG8gc3VwcG9ydCBgRVhQRUNUX05FKE5VTEwsIHB0cilgLCBmb3IgY29uc2lzdGVuY3kgd2UnbGwKK2hhdmUgdG8gc3VwcG9ydCBgRVhQRUNUX05FKHB0ciwgTlVMTClgIGFzIHdlbGwsIGFzIHVubGlrZSBgRVhQRUNUX0VRYCwKK3dlIGRvbid0IGhhdmUgYSBjb252ZW50aW9uIG9uIHRoZSBvcmRlciBvZiB0aGUgdHdvIGFyZ3VtZW50cyBmb3IKK2BFWFBFQ1RfTkVgLiBUaGlzIG1lYW5zIHVzaW5nIHRoZSB0ZW1wbGF0ZSBtZXRhIHByb2dyYW1taW5nIHRyaWNrcwordHdpY2UgaW4gdGhlIGltcGxlbWVudGF0aW9uLCBtYWtpbmcgaXQgZXZlbiBoYXJkZXIgdG8gdW5kZXJzdGFuZCBhbmQKK21haW50YWluLiBXZSBiZWxpZXZlIHRoZSBiZW5lZml0IGRvZXNuJ3QganVzdGlmeSB0aGUgY29zdC4KKworRmluYWxseSwgd2l0aCB0aGUgZ3Jvd3RoIG9mIEdvb2dsZSBNb2NrJ3MgW21hdGNoZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjVXNpbmdfTWF0Y2hlcnNfaW5fR29vZ2xlX1Rlc3RfQXNzZXJ0aW9ucykgbGlicmFyeSwgd2UgYXJlCitlbmNvdXJhZ2luZyBwZW9wbGUgdG8gdXNlIHRoZSB1bmlmaWVkIGBFWFBFQ1RfVEhBVCh2YWx1ZSwgbWF0Y2hlcilgCitzeW50YXggbW9yZSBvZnRlbiBpbiB0ZXN0cy4gT25lIHNpZ25pZmljYW50IGFkdmFudGFnZSBvZiB0aGUgbWF0Y2hlcgorYXBwcm9hY2ggaXMgdGhhdCBtYXRjaGVycyBjYW4gYmUgZWFzaWx5IGNvbWJpbmVkIHRvIGZvcm0gbmV3IG1hdGNoZXJzLAord2hpbGUgdGhlIGBFWFBFQ1RfTkVgLCBldGMsIG1hY3JvcyBjYW5ub3QgYmUgZWFzaWx5Citjb21iaW5lZC4gVGhlcmVmb3JlIHdlIHdhbnQgdG8gaW52ZXN0IG1vcmUgaW4gdGhlIG1hdGNoZXJzIHRoYW4gaW4gdGhlCitgRVhQRUNUX1hYKClgIG1hY3Jvcy4KKworIyMgRG9lcyBHb29nbGUgVGVzdCBzdXBwb3J0IHJ1bm5pbmcgdGVzdHMgaW4gcGFyYWxsZWw/ICMjCisKK1Rlc3QgcnVubmVycyB0ZW5kIHRvIGJlIHRpZ2h0bHkgY291cGxlZCB3aXRoIHRoZSBidWlsZC90ZXN0CitlbnZpcm9ubWVudCwgYW5kIEdvb2dsZSBUZXN0IGRvZXNuJ3QgdHJ5IHRvIHNvbHZlIHRoZSBwcm9ibGVtIG9mCitydW5uaW5nIHRlc3RzIGluIHBhcmFsbGVsLiAgSW5zdGVhZCwgd2UgdHJpZWQgdG8gbWFrZSBHb29nbGUgVGVzdCB3b3JrCituaWNlbHkgd2l0aCB0ZXN0IHJ1bm5lcnMuICBGb3IgZXhhbXBsZSwgR29vZ2xlIFRlc3QncyBYTUwgcmVwb3J0Citjb250YWlucyB0aGUgdGltZSBzcGVudCBvbiBlYWNoIHRlc3QsIGFuZCBpdHMgYGd0ZXN0X2xpc3RfdGVzdHNgIGFuZAorYGd0ZXN0X2ZpbHRlcmAgZmxhZ3MgY2FuIGJlIHVzZWQgZm9yIHNwbGl0dGluZyB0aGUgZXhlY3V0aW9uIG9mIHRlc3QKK21ldGhvZHMgaW50byBtdWx0aXBsZSBwcm9jZXNzZXMuICBUaGVzZSBmdW5jdGlvbmFsaXRpZXMgY2FuIGhlbHAgdGhlCit0ZXN0IHJ1bm5lciBydW4gdGhlIHRlc3RzIGluIHBhcmFsbGVsLgorCisjIyBXaHkgZG9uJ3QgR29vZ2xlIFRlc3QgcnVuIHRoZSB0ZXN0cyBpbiBkaWZmZXJlbnQgdGhyZWFkcyB0byBzcGVlZCB0aGluZ3MgdXA/ICMjCisKK0l0J3MgZGlmZmljdWx0IHRvIHdyaXRlIHRocmVhZC1zYWZlIGNvZGUuICBNb3N0IHRlc3RzIGFyZSBub3Qgd3JpdHRlbgord2l0aCB0aHJlYWQtc2FmZXR5IGluIG1pbmQsIGFuZCB0aHVzIG1heSBub3Qgd29yayBjb3JyZWN0bHkgaW4gYQorbXVsdGktdGhyZWFkZWQgc2V0dGluZy4KKworSWYgeW91IHRoaW5rIGFib3V0IGl0LCBpdCdzIGFscmVhZHkgaGFyZCB0byBtYWtlIHlvdXIgY29kZSB3b3JrIHdoZW4KK3lvdSBrbm93IHdoYXQgb3RoZXIgdGhyZWFkcyBhcmUgZG9pbmcuICBJdCdzIG11Y2ggaGFyZGVyLCBhbmQKK3NvbWV0aW1lcyBldmVuIGltcG9zc2libGUsIHRvIG1ha2UgeW91ciBjb2RlIHdvcmsgd2hlbiB5b3UgZG9uJ3Qga25vdword2hhdCBvdGhlciB0aHJlYWRzIGFyZSBkb2luZyAocmVtZW1iZXIgdGhhdCB0ZXN0IG1ldGhvZHMgY2FuIGJlIGFkZGVkLAorZGVsZXRlZCwgb3IgbW9kaWZpZWQgYWZ0ZXIgeW91ciB0ZXN0IHdhcyB3cml0dGVuKS4gIElmIHlvdSB3YW50IHRvIHJ1bgordGhlIHRlc3RzIGluIHBhcmFsbGVsLCB5b3UnZCBiZXR0ZXIgcnVuIHRoZW0gaW4gZGlmZmVyZW50IHByb2Nlc3Nlcy4KKworIyMgV2h5IGFyZW4ndCBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGltcGxlbWVudGVkIHVzaW5nIGV4Y2VwdGlvbnM/ICMjCisKK091ciBvcmlnaW5hbCBtb3RpdmF0aW9uIHdhcyB0byBiZSBhYmxlIHRvIHVzZSBHb29nbGUgVGVzdCBpbiBwcm9qZWN0cwordGhhdCBkaXNhYmxlIGV4Y2VwdGlvbnMuICBMYXRlciB3ZSByZWFsaXplZCBzb21lIGFkZGl0aW9uYWwgYmVuZWZpdHMKK29mIHRoaXMgYXBwcm9hY2g6CisKKyAgMS4gVGhyb3dpbmcgaW4gYSBkZXN0cnVjdG9yIGlzIHVuZGVmaW5lZCBiZWhhdmlvciBpbiBDKysuICBOb3QgdXNpbmcgZXhjZXB0aW9ucyBtZWFucyBHb29nbGUgVGVzdCdzIGFzc2VydGlvbnMgYXJlIHNhZmUgdG8gdXNlIGluIGRlc3RydWN0b3JzLgorICAxLiBUaGUgYEVYUEVDVF8qYCBmYW1pbHkgb2YgbWFjcm9zIHdpbGwgY29udGludWUgZXZlbiBhZnRlciBhIGZhaWx1cmUsIGFsbG93aW5nIG11bHRpcGxlIGZhaWx1cmVzIGluIGEgYFRFU1RgIHRvIGJlIHJlcG9ydGVkIGluIGEgc2luZ2xlIHJ1bi4gVGhpcyBpcyBhIHBvcHVsYXIgZmVhdHVyZSwgYXMgaW4gQysrIHRoZSBlZGl0LWNvbXBpbGUtdGVzdCBjeWNsZSBpcyB1c3VhbGx5IHF1aXRlIGxvbmcgYW5kIGJlaW5nIGFibGUgdG8gZml4aW5nIG1vcmUgdGhhbiBvbmUgdGhpbmcgYXQgYSB0aW1lIGlzIGEgYmxlc3NpbmcuCisgIDEuIElmIGFzc2VydGlvbnMgYXJlIGltcGxlbWVudGVkIHVzaW5nIGV4Y2VwdGlvbnMsIGEgdGVzdCBtYXkgZmFsc2VseSBpZ25vcmUgYSBmYWlsdXJlIGlmIGl0J3MgY2F1Z2h0IGJ5IHVzZXIgY29kZToKK2BgYAordHJ5IHsgLi4uIEFTU0VSVF9UUlVFKC4uLikgLi4uIH0KK2NhdGNoICguLi4pIHsgLi4uIH0KK2BgYAorVGhlIGFib3ZlIGNvZGUgd2lsbCBwYXNzIGV2ZW4gaWYgdGhlIGBBU1NFUlRfVFJVRWAgdGhyb3dzLiAgV2hpbGUgaXQncyB1bmxpa2VseSBmb3Igc29tZW9uZSB0byB3cml0ZSB0aGlzIGluIGEgdGVzdCwgaXQncyBwb3NzaWJsZSB0byBydW4gaW50byB0aGlzIHBhdHRlcm4gd2hlbiB5b3Ugd3JpdGUgYXNzZXJ0aW9ucyBpbiBjYWxsYmFja3MgdGhhdCBhcmUgY2FsbGVkIGJ5IHRoZSBjb2RlIHVuZGVyIHRlc3QuCisKK1RoZSBkb3duc2lkZSBvZiBub3QgdXNpbmcgZXhjZXB0aW9ucyBpcyB0aGF0IGBBU1NFUlRfKmAgKGltcGxlbWVudGVkCit1c2luZyBgcmV0dXJuYCkgd2lsbCBvbmx5IGFib3J0IHRoZSBjdXJyZW50IGZ1bmN0aW9uLCBub3QgdGhlIGN1cnJlbnQKK2BURVNUYC4KKworIyMgV2h5IGRvIHdlIHVzZSB0d28gZGlmZmVyZW50IG1hY3JvcyBmb3IgdGVzdHMgd2l0aCBhbmQgd2l0aG91dCBmaXh0dXJlcz8gIyMKKworVW5mb3J0dW5hdGVseSwgQysrJ3MgbWFjcm8gc3lzdGVtIGRvZXNuJ3QgYWxsb3cgdXMgdG8gdXNlIHRoZSBzYW1lCittYWNybyBmb3IgYm90aCBjYXNlcy4gIE9uZSBwb3NzaWJpbGl0eSBpcyB0byBwcm92aWRlIG9ubHkgb25lIG1hY3JvCitmb3IgdGVzdHMgd2l0aCBmaXh0dXJlcywgYW5kIHJlcXVpcmUgdGhlIHVzZXIgdG8gZGVmaW5lIGFuIGVtcHR5CitmaXh0dXJlIHNvbWV0aW1lczoKKworYGBgCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7fTsKKworVEVTVF9GKEZvb1Rlc3QsIERvZXNUaGlzKSB7IC4uLiB9CitgYGAKK29yCitgYGAKK3R5cGVkZWYgOjp0ZXN0aW5nOjpUZXN0IEZvb1Rlc3Q7CisKK1RFU1RfRihGb29UZXN0LCBEb2VzVGhhdCkgeyAuLi4gfQorYGBgCisKK1lldCwgbWFueSBwZW9wbGUgdGhpbmsgdGhpcyBpcyBvbmUgbGluZSB0b28gbWFueS4gOi0pIE91ciBnb2FsIHdhcyB0bworbWFrZSBpdCByZWFsbHkgZWFzeSB0byB3cml0ZSB0ZXN0cywgc28gd2UgdHJpZWQgdG8gbWFrZSBzaW1wbGUgdGVzdHMKK3RyaXZpYWwgdG8gY3JlYXRlLiAgVGhhdCBtZWFucyB1c2luZyBhIHNlcGFyYXRlIG1hY3JvIGZvciBzdWNoIHRlc3RzLgorCitXZSB0aGluayBuZWl0aGVyIGFwcHJvYWNoIGlzIGlkZWFsLCB5ZXQgZWl0aGVyIG9mIHRoZW0gaXMgcmVhc29uYWJsZS4KK0luIHRoZSBlbmQsIGl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyIG11Y2ggZWl0aGVyIHdheS4KKworIyMgV2h5IGRvbid0IHdlIHVzZSBzdHJ1Y3RzIGFzIHRlc3QgZml4dHVyZXM/ICMjCisKK1dlIGxpa2UgdG8gdXNlIHN0cnVjdHMgb25seSB3aGVuIHJlcHJlc2VudGluZyBwYXNzaXZlIGRhdGEuICBUaGlzCitkaXN0aW5jdGlvbiBiZXR3ZWVuIHN0cnVjdHMgYW5kIGNsYXNzZXMgaXMgZ29vZCBmb3IgZG9jdW1lbnRpbmcgdGhlCitpbnRlbnQgb2YgdGhlIGNvZGUncyBhdXRob3IuICBTaW5jZSB0ZXN0IGZpeHR1cmVzIGhhdmUgbG9naWMgbGlrZQorYFNldFVwKClgIGFuZCBgVGVhckRvd24oKWAsIHRoZXkgYXJlIGJldHRlciBkZWZpbmVkIGFzIGNsYXNzZXMuCisKKyMjIFdoeSBhcmUgZGVhdGggdGVzdHMgaW1wbGVtZW50ZWQgYXMgYXNzZXJ0aW9ucyBpbnN0ZWFkIG9mIHVzaW5nIGEgdGVzdCBydW5uZXI/ICMjCisKK091ciBnb2FsIHdhcyB0byBtYWtlIGRlYXRoIHRlc3RzIGFzIGNvbnZlbmllbnQgZm9yIGEgdXNlciBhcyBDKysKK3Bvc3NpYmx5IGFsbG93cy4gIEluIHBhcnRpY3VsYXI6CisKKyAgKiBUaGUgcnVubmVyLXN0eWxlIHJlcXVpcmVzIHRvIHNwbGl0IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHR3byBwaWVjZXM6IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkZWF0aCB0ZXN0IGl0c2VsZiwgYW5kIHRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgcnVubmVyIG9uIGhvdyB0byBydW4gdGhlIGRlYXRoIHRlc3QgYW5kIHdoYXQgdG8gZXhwZWN0LiAgVGhlIGRlYXRoIHRlc3Qgd291bGQgYmUgd3JpdHRlbiBpbiBDKyssIHdoaWxlIHRoZSBydW5uZXIgc3BlYyBtYXkgb3IgbWF5IG5vdCBiZS4gIEEgdXNlciBuZWVkcyB0byBjYXJlZnVsbHkga2VlcCB0aGUgdHdvIGluIHN5bmMuIGBBU1NFUlRfREVBVEgoc3RhdGVtZW50LCBleHBlY3RlZF9tZXNzYWdlKWAgc3BlY2lmaWVzIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaW4gb25lIHBsYWNlLCBpbiBvbmUgbGFuZ3VhZ2UsIHdpdGhvdXQgYm9pbGVycGxhdGUgY29kZS4gSXQgaXMgdmVyeSBkZWNsYXJhdGl2ZS4KKyAgKiBgQVNTRVJUX0RFQVRIYCBoYXMgYSBzaW1pbGFyIHN5bnRheCBhbmQgZXJyb3ItcmVwb3J0aW5nIHNlbWFudGljcyBhcyBvdGhlciBHb29nbGUgVGVzdCBhc3NlcnRpb25zLCBhbmQgdGh1cyBpcyBlYXN5IHRvIGxlYXJuLgorICAqIGBBU1NFUlRfREVBVEhgIGNhbiBiZSBtaXhlZCB3aXRoIG90aGVyIGFzc2VydGlvbnMgYW5kIG90aGVyIGxvZ2ljIGF0IHlvdXIgd2lsbC4gIFlvdSBhcmUgbm90IGxpbWl0ZWQgdG8gb25lIGRlYXRoIHRlc3QgcGVyIHRlc3QgbWV0aG9kLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB3cml0ZSBzb21ldGhpbmcgbGlrZToKK2BgYAorICAgIGlmIChGb29Db25kaXRpb24oKSkgeworICAgICAgQVNTRVJUX0RFQVRIKEJhcigpLCAiYmxhaCIpOworICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlRfRVEoNSwgQmFyKCkpOworICAgIH0KK2BgYAorSWYgeW91IHByZWZlciBvbmUgZGVhdGggdGVzdCBwZXIgdGVzdCBtZXRob2QsIHlvdSBjYW4gd3JpdGUgeW91ciB0ZXN0cyBpbiB0aGF0IHN0eWxlIHRvbywgYnV0IHdlIGRvbid0IHdhbnQgdG8gaW1wb3NlIHRoYXQgb24gdGhlIHVzZXJzLiAgVGhlIGZld2VyIGFydGlmaWNpYWwgbGltaXRhdGlvbnMgdGhlIGJldHRlci4KKyAgKiBgQVNTRVJUX0RFQVRIYCBjYW4gcmVmZXJlbmNlIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gZGVjaWRlIGhvdyBtYW55IGRlYXRoIHRlc3RzIHlvdSB3YW50IGJhc2VkIG9uIHJ1bi10aW1lIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsCitgYGAKKyAgICBjb25zdCBpbnQgY291bnQgPSBHZXRDb3VudCgpOyAgLy8gT25seSBrbm93biBhdCBydW4gdGltZS4KKyAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICBBU1NFUlRfREVBVEgoeworICAgICAgICBkb3VibGUqIGJ1ZmZlciA9IG5ldyBkb3VibGVbaV07CisgICAgICAgIC4uLiBpbml0aWFsaXplcyBidWZmZXIgLi4uCisgICAgICAgIEZvbyhidWZmZXIsIGkpCisgICAgICB9LCAiYmxhaCBibGFoIik7CisgICAgfQorYGBgCitUaGUgcnVubmVyLWJhc2VkIGFwcHJvYWNoIHRlbmRzIHRvIGJlIG1vcmUgc3RhdGljIGFuZCBsZXNzIGZsZXhpYmxlLCBvciByZXF1aXJlcyBtb3JlIHVzZXIgZWZmb3J0IHRvIGdldCB0aGlzIGtpbmQgb2YgZmxleGliaWxpdHkuCisKK0Fub3RoZXIgaW50ZXJlc3RpbmcgdGhpbmcgYWJvdXQgYEFTU0VSVF9ERUFUSGAgaXMgdGhhdCBpdCBjYWxscyBgZm9yaygpYAordG8gY3JlYXRlIGEgY2hpbGQgcHJvY2VzcyB0byBydW4gdGhlIGRlYXRoIHRlc3QuICBUaGlzIGlzIGxpZ2h0ZW5pbmcKK2Zhc3QsIGFzIGBmb3JrKClgIHVzZXMgY29weS1vbi13cml0ZSBwYWdlcyBhbmQgaW5jdXJzIGFsbW9zdCB6ZXJvCitvdmVyaGVhZCwgYW5kIHRoZSBjaGlsZCBwcm9jZXNzIHN0YXJ0cyBmcm9tIHRoZSB1c2VyLXN1cHBsaWVkCitzdGF0ZW1lbnQgZGlyZWN0bHksIHNraXBwaW5nIGFsbCBnbG9iYWwgYW5kIGxvY2FsIGluaXRpYWxpemF0aW9uIGFuZAorYW55IGNvZGUgbGVhZGluZyB0byB0aGUgZ2l2ZW4gc3RhdGVtZW50LiAgSWYgeW91IGxhdW5jaCB0aGUgY2hpbGQKK3Byb2Nlc3MgZnJvbSBzY3JhdGNoLCBpdCBjYW4gdGFrZSBzZWNvbmRzIGp1c3QgdG8gbG9hZCBldmVyeXRoaW5nIGFuZAorc3RhcnQgcnVubmluZyBpZiB0aGUgdGVzdCBsaW5rcyB0byBtYW55IGxpYnJhcmllcyBkeW5hbWljYWxseS4KKworIyMgTXkgZGVhdGggdGVzdCBtb2RpZmllcyBzb21lIHN0YXRlLCBidXQgdGhlIGNoYW5nZSBzZWVtcyBsb3N0IGFmdGVyIHRoZSBkZWF0aCB0ZXN0IGZpbmlzaGVzLiBXaHk/ICMjCisKK0RlYXRoIHRlc3RzIChgRVhQRUNUX0RFQVRIYCwgZXRjKSBhcmUgZXhlY3V0ZWQgaW4gYSBzdWItcHJvY2VzcyBzLnQuIHRoZQorZXhwZWN0ZWQgY3Jhc2ggd29uJ3Qga2lsbCB0aGUgdGVzdCBwcm9ncmFtIChpLmUuIHRoZSBwYXJlbnQgcHJvY2VzcykuIEFzIGEKK3Jlc3VsdCwgYW55IGluLW1lbW9yeSBzaWRlIGVmZmVjdHMgdGhleSBpbmN1ciBhcmUgb2JzZXJ2YWJsZSBpbiB0aGVpcgorcmVzcGVjdGl2ZSBzdWItcHJvY2Vzc2VzLCBidXQgbm90IGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gWW91IGNhbiB0aGluayBvZiB0aGVtCithcyBydW5uaW5nIGluIGEgcGFyYWxsZWwgdW5pdmVyc2UsIG1vcmUgb3IgbGVzcy4KKworIyMgVGhlIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCAidW5kZWZpbmVkIHJlZmVyZW5jZXMiIHRvIHNvbWUgc3RhdGljIGNvbnN0IG1lbWJlciB2YXJpYWJsZXMsIGJ1dCBJIGRpZCBkZWZpbmUgdGhlbSBpbiB0aGUgY2xhc3MgYm9keS4gV2hhdCdzIHdyb25nPyAjIworCitJZiB5b3VyIGNsYXNzIGhhcyBhIHN0YXRpYyBkYXRhIG1lbWJlcjoKKworYGBgCisvLyBmb28uaAorY2xhc3MgRm9vIHsKKyAgLi4uCisgIHN0YXRpYyBjb25zdCBpbnQga0JhciA9IDEwMDsKK307CitgYGAKKworWW91IGFsc28gbmVlZCB0byBkZWZpbmUgaXQgX291dHNpZGVfIG9mIHRoZSBjbGFzcyBib2R5IGluIGBmb28uY2NgOgorCitgYGAKK2NvbnN0IGludCBGb286OmtCYXI7ICAvLyBObyBpbml0aWFsaXplciBoZXJlLgorYGBgCisKK090aGVyd2lzZSB5b3VyIGNvZGUgaXMgKippbnZhbGlkIEMrKyoqLCBhbmQgbWF5IGJyZWFrIGluIHVuZXhwZWN0ZWQgd2F5cy4gSW4KK3BhcnRpY3VsYXIsIHVzaW5nIGl0IGluIEdvb2dsZSBUZXN0IGNvbXBhcmlzb24gYXNzZXJ0aW9ucyAoYEVYUEVDVF9FUWAsIGV0YykKK3dpbGwgZ2VuZXJhdGUgYW4gInVuZGVmaW5lZCByZWZlcmVuY2UiIGxpbmtlciBlcnJvci4KKworIyMgSSBoYXZlIGFuIGludGVyZmFjZSB0aGF0IGhhcyBzZXZlcmFsIGltcGxlbWVudGF0aW9ucy4gQ2FuIEkgd3JpdGUgYSBzZXQgb2YgdGVzdHMgb25jZSBhbmQgcmVwZWF0IHRoZW0gb3ZlciBhbGwgdGhlIGltcGxlbWVudGF0aW9ucz8gIyMKKworR29vZ2xlIFRlc3QgZG9lc24ndCB5ZXQgaGF2ZSBnb29kIHN1cHBvcnQgZm9yIHRoaXMga2luZCBvZiB0ZXN0cywgb3IKK2RhdGEtZHJpdmVuIHRlc3RzIGluIGdlbmVyYWwuIFdlIGhvcGUgdG8gYmUgYWJsZSB0byBtYWtlIGltcHJvdmVtZW50cyBpbiB0aGlzCithcmVhIHNvb24uCisKKyMjIENhbiBJIGRlcml2ZSBhIHRlc3QgZml4dHVyZSBmcm9tIGFub3RoZXI/ICMjCisKK1llcy4KKworRWFjaCB0ZXN0IGZpeHR1cmUgaGFzIGEgY29ycmVzcG9uZGluZyBhbmQgc2FtZSBuYW1lZCB0ZXN0IGNhc2UuIFRoaXMgbWVhbnMgb25seQorb25lIHRlc3QgY2FzZSBjYW4gdXNlIGEgcGFydGljdWxhciBmaXh0dXJlLiBTb21ldGltZXMsIGhvd2V2ZXIsIG11bHRpcGxlIHRlc3QKK2Nhc2VzIG1heSB3YW50IHRvIHVzZSB0aGUgc2FtZSBvciBzbGlnaHRseSBkaWZmZXJlbnQgZml4dHVyZXMuIEZvciBleGFtcGxlLCB5b3UKK21heSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiBhIEdVSSBsaWJyYXJ5J3MgdGVzdCBjYXNlcyBkb24ndCBsZWFrCitpbXBvcnRhbnQgc3lzdGVtIHJlc291cmNlcyBsaWtlIGZvbnRzIGFuZCBicnVzaGVzLgorCitJbiBHb29nbGUgVGVzdCwgeW91IHNoYXJlIGEgZml4dHVyZSBhbW9uZyB0ZXN0IGNhc2VzIGJ5IHB1dHRpbmcgdGhlIHNoYXJlZAorbG9naWMgaW4gYSBiYXNlIHRlc3QgZml4dHVyZSwgdGhlbiBkZXJpdmluZyBmcm9tIHRoYXQgYmFzZSBhIHNlcGFyYXRlIGZpeHR1cmUKK2ZvciBlYWNoIHRlc3QgY2FzZSB0aGF0IHdhbnRzIHRvIHVzZSB0aGlzIGNvbW1vbiBsb2dpYy4gWW91IHRoZW4gdXNlIGBURVNUX0YoKWAKK3RvIHdyaXRlIHRlc3RzIHVzaW5nIGVhY2ggZGVyaXZlZCBmaXh0dXJlLgorCitUeXBpY2FsbHksIHlvdXIgY29kZSBsb29rcyBsaWtlIHRoaXM6CisKK2BgYAorLy8gRGVmaW5lcyBhIGJhc2UgdGVzdCBmaXh0dXJlLgorY2xhc3MgQmFzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgLi4uCit9OworCisvLyBEZXJpdmVzIGEgZml4dHVyZSBGb29UZXN0IGZyb20gQmFzZVRlc3QuCitjbGFzcyBGb29UZXN0IDogcHVibGljIEJhc2VUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAgIEJhc2VUZXN0OjpTZXRVcCgpOyAgLy8gU2V0cyB1cCB0aGUgYmFzZSBmaXh0dXJlIGZpcnN0LgorICAgICAgLi4uIGFkZGl0aW9uYWwgc2V0LXVwIHdvcmsgLi4uCisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAgIC4uLiBjbGVhbi11cCB3b3JrIGZvciBGb29UZXN0IC4uLgorICAgICAgQmFzZVRlc3Q6OlRlYXJEb3duKCk7ICAvLyBSZW1lbWJlciB0byB0ZWFyIGRvd24gdGhlIGJhc2UgZml4dHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciBjbGVhbmluZyB1cCBGb29UZXN0IQorICAgIH0KKyAgICAuLi4gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZm9yIEZvb1Rlc3QgLi4uCit9OworCisvLyBUZXN0cyB0aGF0IHVzZSB0aGUgZml4dHVyZSBGb29UZXN0LgorVEVTVF9GKEZvb1Rlc3QsIEJhcikgeyAuLi4gfQorVEVTVF9GKEZvb1Rlc3QsIEJheikgeyAuLi4gfQorCisuLi4gYWRkaXRpb25hbCBmaXh0dXJlcyBkZXJpdmVkIGZyb20gQmFzZVRlc3QgLi4uCitgYGAKKworSWYgbmVjZXNzYXJ5LCB5b3UgY2FuIGNvbnRpbnVlIHRvIGRlcml2ZSB0ZXN0IGZpeHR1cmVzIGZyb20gYSBkZXJpdmVkIGZpeHR1cmUuCitHb29nbGUgVGVzdCBoYXMgbm8gbGltaXQgb24gaG93IGRlZXAgdGhlIGhpZXJhcmNoeSBjYW4gYmUuCisKK0ZvciBhIGNvbXBsZXRlIGV4YW1wbGUgdXNpbmcgZGVyaXZlZCB0ZXN0IGZpeHR1cmVzLCBzZWUKK1tzYW1wbGU1XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYykuCisKKyMjIE15IGNvbXBpbGVyIGNvbXBsYWlucyAidm9pZCB2YWx1ZSBub3QgaWdub3JlZCBhcyBpdCBvdWdodCB0byBiZS4iIFdoYXQgZG9lcyB0aGlzIG1lYW4/ICMjCisKK1lvdSdyZSBwcm9iYWJseSB1c2luZyBhbiBgQVNTRVJUXyooKWAgaW4gYSBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QgcmV0dXJuIGB2b2lkYC4KK2BBU1NFUlRfKigpYCBjYW4gb25seSBiZSB1c2VkIGluIGB2b2lkYCBmdW5jdGlvbnMuCisKKyMjIE15IGRlYXRoIHRlc3QgaGFuZ3MgKG9yIHNlZy1mYXVsdHMpLiBIb3cgZG8gSSBmaXggaXQ/ICMjCisKK0luIEdvb2dsZSBUZXN0LCBkZWF0aCB0ZXN0cyBhcmUgcnVuIGluIGEgY2hpbGQgcHJvY2VzcyBhbmQgdGhlIHdheSB0aGV5IHdvcmsgaXMKK2RlbGljYXRlLiBUbyB3cml0ZSBkZWF0aCB0ZXN0cyB5b3UgcmVhbGx5IG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhleSB3b3JrLgorUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSByZWFkIHRoaXMuCisKK0luIHBhcnRpY3VsYXIsIGRlYXRoIHRlc3RzIGRvbid0IGxpa2UgaGF2aW5nIG11bHRpcGxlIHRocmVhZHMgaW4gdGhlIHBhcmVudAorcHJvY2Vzcy4gU28gdGhlIGZpcnN0IHRoaW5nIHlvdSBjYW4gdHJ5IGlzIHRvIGVsaW1pbmF0ZSBjcmVhdGluZyB0aHJlYWRzCitvdXRzaWRlIG9mIGBFWFBFQ1RfREVBVEgoKWAuCisKK1NvbWV0aW1lcyB0aGlzIGlzIGltcG9zc2libGUgYXMgc29tZSBsaWJyYXJ5IHlvdSBtdXN0IHVzZSBtYXkgYmUgY3JlYXRpbmcKK3RocmVhZHMgYmVmb3JlIGBtYWluKClgIGlzIGV2ZW4gcmVhY2hlZC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHRyeSB0byBtaW5pbWl6ZQordGhlIGNoYW5jZSBvZiBjb25mbGljdHMgYnkgZWl0aGVyIG1vdmluZyBhcyBtYW55IGFjdGl2aXRpZXMgYXMgcG9zc2libGUgaW5zaWRlCitgRVhQRUNUX0RFQVRIKClgIChpbiB0aGUgZXh0cmVtZSBjYXNlLCB5b3Ugd2FudCB0byBtb3ZlIGV2ZXJ5dGhpbmcgaW5zaWRlKSwgb3IKK2xlYXZpbmcgYXMgZmV3IHRoaW5ncyBhcyBwb3NzaWJsZSBpbiBpdC4gQWxzbywgeW91IGNhbiB0cnkgdG8gc2V0IHRoZSBkZWF0aAordGVzdCBzdHlsZSB0byBgInRocmVhZHNhZmUiYCwgd2hpY2ggaXMgc2FmZXIgYnV0IHNsb3dlciwgYW5kIHNlZSBpZiBpdCBoZWxwcy4KKworSWYgeW91IGdvIHdpdGggdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMsIHJlbWVtYmVyIHRoYXQgdGhleSByZXJ1biB0aGUgdGVzdAorcHJvZ3JhbSBmcm9tIHRoZSBiZWdpbm5pbmcgaW4gdGhlIGNoaWxkIHByb2Nlc3MuIFRoZXJlZm9yZSBtYWtlIHN1cmUgeW91cgorcHJvZ3JhbSBjYW4gcnVuIHNpZGUtYnktc2lkZSB3aXRoIGl0c2VsZiBhbmQgaXMgZGV0ZXJtaW5pc3RpYy4KKworSW4gdGhlIGVuZCwgdGhpcyBib2lscyBkb3duIHRvIGdvb2QgY29uY3VycmVudCBwcm9ncmFtbWluZy4gWW91IGhhdmUgdG8gbWFrZQorc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHJhY2UgY29uZGl0aW9ucyBvciBkZWFkIGxvY2tzIGluIHlvdXIgcHJvZ3JhbS4gTm8gc2lsdmVyCitidWxsZXQgLSBzb3JyeSEKKworIyMgU2hvdWxkIEkgdXNlIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIG9mIHRoZSB0ZXN0IGZpeHR1cmUgb3IgdGhlIHNldC11cC90ZWFyLWRvd24gZnVuY3Rpb24/ICMjCisKK1RoZSBmaXJzdCB0aGluZyB0byByZW1lbWJlciBpcyB0aGF0IEdvb2dsZSBUZXN0IGRvZXMgbm90IHJldXNlIHRoZQorc2FtZSB0ZXN0IGZpeHR1cmUgb2JqZWN0IGFjcm9zcyBtdWx0aXBsZSB0ZXN0cy4gRm9yIGVhY2ggYFRFU1RfRmAsCitHb29nbGUgVGVzdCB3aWxsIGNyZWF0ZSBhIGZyZXNoIHRlc3QgZml4dHVyZSBvYmplY3QsIF9pbW1lZGlhdGVseV8KK2NhbGwgYFNldFVwKClgLCBydW4gdGhlIHRlc3QgYm9keSwgY2FsbCBgVGVhckRvd24oKWAsIGFuZCB0aGVuCitfaW1tZWRpYXRlbHlfIGRlbGV0ZSB0aGUgdGVzdCBmaXh0dXJlIG9iamVjdC4KKworV2hlbiB5b3UgbmVlZCB0byB3cml0ZSBwZXItdGVzdCBzZXQtdXAgYW5kIHRlYXItZG93biBsb2dpYywgeW91IGhhdmUKK3RoZSBjaG9pY2UgYmV0d2VlbiB1c2luZyB0aGUgdGVzdCBmaXh0dXJlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igb3IKK2BTZXRVcCgpL1RlYXJEb3duKClgLiBUaGUgZm9ybWVyIGlzIHVzdWFsbHkgcHJlZmVycmVkLCBhcyBpdCBoYXMgdGhlCitmb2xsb3dpbmcgYmVuZWZpdHM6CisKKyAgKiBCeSBpbml0aWFsaXppbmcgYSBtZW1iZXIgdmFyaWFibGUgaW4gdGhlIGNvbnN0cnVjdG9yLCB3ZSBoYXZlIHRoZSBvcHRpb24gdG8gbWFrZSBpdCBgY29uc3RgLCB3aGljaCBoZWxwcyBwcmV2ZW50IGFjY2lkZW50YWwgY2hhbmdlcyB0byBpdHMgdmFsdWUgYW5kIG1ha2VzIHRoZSB0ZXN0cyBtb3JlIG9idmlvdXNseSBjb3JyZWN0LgorICAqIEluIGNhc2Ugd2UgbmVlZCB0byBzdWJjbGFzcyB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLCB0aGUgc3ViY2xhc3MnIGNvbnN0cnVjdG9yIGlzIGd1YXJhbnRlZWQgdG8gY2FsbCB0aGUgYmFzZSBjbGFzcycgY29uc3RydWN0b3IgZmlyc3QsIGFuZCB0aGUgc3ViY2xhc3MnIGRlc3RydWN0b3IgaXMgZ3VhcmFudGVlZCB0byBjYWxsIHRoZSBiYXNlIGNsYXNzJyBkZXN0cnVjdG9yIGFmdGVyd2FyZC4gV2l0aCBgU2V0VXAoKS9UZWFyRG93bigpYCwgYSBzdWJjbGFzcyBtYXkgbWFrZSB0aGUgbWlzdGFrZSBvZiBmb3JnZXR0aW5nIHRvIGNhbGwgdGhlIGJhc2UgY2xhc3MnIGBTZXRVcCgpL1RlYXJEb3duKClgIG9yIGNhbGwgdGhlbSBhdCB0aGUgd3JvbmcgbW9tZW50LgorCitZb3UgbWF5IHN0aWxsIHdhbnQgdG8gdXNlIGBTZXRVcCgpL1RlYXJEb3duKClgIGluIHRoZSBmb2xsb3dpbmcgcmFyZSBjYXNlczoKKyAgKiBJZiB0aGUgdGVhci1kb3duIG9wZXJhdGlvbiBjb3VsZCB0aHJvdyBhbiBleGNlcHRpb24sIHlvdSBtdXN0IHVzZSBgVGVhckRvd24oKWAgYXMgb3Bwb3NlZCB0byB0aGUgZGVzdHJ1Y3RvciwgYXMgdGhyb3dpbmcgaW4gYSBkZXN0cnVjdG9yIGxlYWRzIHRvIHVuZGVmaW5lZCBiZWhhdmlvciBhbmQgdXN1YWxseSB3aWxsIGtpbGwgeW91ciBwcm9ncmFtIHJpZ2h0IGF3YXkuIE5vdGUgdGhhdCBtYW55IHN0YW5kYXJkIGxpYnJhcmllcyAobGlrZSBTVEwpIG1heSB0aHJvdyB3aGVuIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgaW4gdGhlIGNvbXBpbGVyLiBUaGVyZWZvcmUgeW91IHNob3VsZCBwcmVmZXIgYFRlYXJEb3duKClgIGlmIHlvdSB3YW50IHRvIHdyaXRlIHBvcnRhYmxlIHRlc3RzIHRoYXQgd29yayB3aXRoIG9yIHdpdGhvdXQgZXhjZXB0aW9ucy4KKyAgKiBUaGUgYXNzZXJ0aW9uIG1hY3JvcyB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBmbGFnIGAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmVgIGlzIHNwZWNpZmllZC4gVGhlcmVmb3JlLCB5b3Ugc2hvdWxkbid0IHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGluIGEgZGVzdHJ1Y3RvciBpZiB5b3UgcGxhbiB0byBydW4geW91ciB0ZXN0cyB3aXRoIHRoaXMgZmxhZy4KKyAgKiBJbiBhIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IsIHlvdSBjYW5ub3QgbWFrZSBhIHZpcnR1YWwgZnVuY3Rpb24gY2FsbCBvbiB0aGlzIG9iamVjdC4gKFlvdSBjYW4gY2FsbCBhIG1ldGhvZCBkZWNsYXJlZCBhcyB2aXJ0dWFsLCBidXQgaXQgd2lsbCBiZSBzdGF0aWNhbGx5IGJvdW5kLikgVGhlcmVmb3JlLCBpZiB5b3UgbmVlZCB0byBjYWxsIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSBvdmVycmlkZW4gaW4gYSBkZXJpdmVkIGNsYXNzLCB5b3UgaGF2ZSB0byB1c2UgYFNldFVwKCkvVGVhckRvd24oKWAuCisKKyMjIFRoZSBjb21waWxlciBjb21wbGFpbnMgIm5vIG1hdGNoaW5nIGZ1bmN0aW9uIHRvIGNhbGwiIHdoZW4gSSB1c2UgQVNTRVJUXF9QUkVEbi4gSG93IGRvIEkgZml4IGl0PyAjIworCitJZiB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIHlvdSB1c2UgaW4gYEFTU0VSVF9QUkVEKmAgb3IgYEVYUEVDVF9QUkVEKmAgaXMKK292ZXJsb2FkZWQgb3IgYSB0ZW1wbGF0ZSwgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0cm91YmxlIGZpZ3VyaW5nIG91dCB3aGljaAorb3ZlcmxvYWRlZCB2ZXJzaW9uIGl0IHNob3VsZCB1c2UuIGBBU1NFUlRfUFJFRF9GT1JNQVQqYCBhbmQKK2BFWFBFQ1RfUFJFRF9GT1JNQVQqYCBkb24ndCBoYXZlIHRoaXMgcHJvYmxlbS4KKworSWYgeW91IHNlZSB0aGlzIGVycm9yLCB5b3UgbWlnaHQgd2FudCB0byBzd2l0Y2ggdG8KK2AoQVNTRVJUfEVYUEVDVClfUFJFRF9GT1JNQVQqYCwgd2hpY2ggd2lsbCBhbHNvIGdpdmUgeW91IGEgYmV0dGVyIGZhaWx1cmUKK21lc3NhZ2UuIElmLCBob3dldmVyLCB0aGF0IGlzIG5vdCBhbiBvcHRpb24sIHlvdSBjYW4gcmVzb2x2ZSB0aGUgcHJvYmxlbSBieQorZXhwbGljaXRseSB0ZWxsaW5nIHRoZSBjb21waWxlciB3aGljaCB2ZXJzaW9uIHRvIHBpY2suCisKK0ZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlCisKK2BgYAorYm9vbCBJc1Bvc2l0aXZlKGludCBuKSB7CisgIHJldHVybiBuID4gMDsKK30KK2Jvb2wgSXNQb3NpdGl2ZShkb3VibGUgeCkgeworICByZXR1cm4geCA+IDA7Cit9CitgYGAKKworeW91IHdpbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IgaWYgeW91IHdyaXRlCisKK2BgYAorRVhQRUNUX1BSRUQxKElzUG9zaXRpdmUsIDUpOworYGBgCisKK0hvd2V2ZXIsIHRoaXMgd2lsbCB3b3JrOgorCitgYGAKK0VYUEVDVF9QUkVEMSgqc3RhdGljX2Nhc3Q8Ym9vbCAoKikoaW50KT4qKElzUG9zaXRpdmUpLCA1KTsKK2BgYAorCisoVGhlIHN0dWZmIGluc2lkZSB0aGUgYW5nbGVkIGJyYWNrZXRzIGZvciB0aGUgYHN0YXRpY19jYXN0YCBvcGVyYXRvciBpcyB0aGUKK3R5cGUgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIHRoZSBgaW50YC12ZXJzaW9uIG9mIGBJc1Bvc2l0aXZlKClgLikKKworQXMgYW5vdGhlciBleGFtcGxlLCB3aGVuIHlvdSBoYXZlIGEgdGVtcGxhdGUgZnVuY3Rpb24KKworYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgSXNOZWdhdGl2ZShUIHgpIHsKKyAgcmV0dXJuIHggPCAwOworfQorYGBgCisKK3lvdSBjYW4gdXNlIGl0IGluIGEgcHJlZGljYXRlIGFzc2VydGlvbiBsaWtlIHRoaXM6CisKK2BgYAorQVNTRVJUX1BSRUQxKElzTmVnYXRpdmUqPGludD4qLCAtNSk7CitgYGAKKworVGhpbmdzIGFyZSBtb3JlIGludGVyZXN0aW5nIGlmIHlvdXIgdGVtcGxhdGUgaGFzIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVycy4gVGhlCitmb2xsb3dpbmcgd29uJ3QgY29tcGlsZToKKworYGBgCitBU1NFUlRfUFJFRDIoKkdyZWF0ZXJUaGFuPGludCwgaW50PiosIDUsIDApOworYGBgCisKKworYXMgdGhlIEMrKyBwcmUtcHJvY2Vzc29yIHRoaW5rcyB5b3UgYXJlIGdpdmluZyBgQVNTRVJUX1BSRUQyYCA0IGFyZ3VtZW50cywKK3doaWNoIGlzIG9uZSBtb3JlIHRoYW4gZXhwZWN0ZWQuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHdyYXAgdGhlIHByZWRpY2F0ZQorZnVuY3Rpb24gaW4gcGFyZW50aGVzZXM6CisKK2BgYAorQVNTRVJUX1BSRUQyKCooR3JlYXRlclRoYW48aW50LCBpbnQ+KSosIDUsIDApOworYGBgCisKKworIyMgTXkgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0ICJpZ25vcmluZyByZXR1cm4gdmFsdWUiIHdoZW4gSSBjYWxsIFJVTlxfQUxMXF9URVNUUygpLiBXaHk/ICMjCisKK1NvbWUgcGVvcGxlIGhhZCBiZWVuIGlnbm9yaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYFJVTl9BTExfVEVTVFMoKWAuIFRoYXQgaXMsCitpbnN0ZWFkIG9mCisKK2BgYAorcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK2BgYAorCit0aGV5IHdyaXRlCisKK2BgYAorUlVOX0FMTF9URVNUUygpOworYGBgCisKK1RoaXMgaXMgd3JvbmcgYW5kIGRhbmdlcm91cy4gQSB0ZXN0IHJ1bm5lciBuZWVkcyB0byBzZWUgdGhlIHJldHVybiB2YWx1ZSBvZgorYFJVTl9BTExfVEVTVFMoKWAgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIGEgdGVzdCBoYXMgcGFzc2VkLiBJZiB5b3VyIGBtYWluKClgCitmdW5jdGlvbiBpZ25vcmVzIGl0LCB5b3VyIHRlc3Qgd2lsbCBiZSBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgZXZlbiBpZiBpdCBoYXMgYQorR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIGZhaWx1cmUuIFZlcnkgYmFkLgorCitUbyBoZWxwIHRoZSB1c2VycyBhdm9pZCB0aGlzIGRhbmdlcm91cyBidWcsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorYFJVTl9BTExfVEVTVFMoKWAgY2F1c2VzIGdjYyB0byByYWlzZSB0aGlzIHdhcm5pbmcsIHdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcworaWdub3JlZC4gSWYgeW91IHNlZSB0aGlzIHdhcm5pbmcsIHRoZSBmaXggaXMgc2ltcGxlOiBqdXN0IG1ha2Ugc3VyZSBpdHMgdmFsdWUKK2lzIHVzZWQgYXMgdGhlIHJldHVybiB2YWx1ZSBvZiBgbWFpbigpYC4KKworIyMgTXkgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgYSBjb25zdHJ1Y3RvciAob3IgZGVzdHJ1Y3RvcikgY2Fubm90IHJldHVybiBhIHZhbHVlLiBXaGF0J3MgZ29pbmcgb24/ICMjCisKK0R1ZSB0byBhIHBlY3VsaWFyaXR5IG9mIEMrKywgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgc3ludGF4IGZvciBzdHJlYW1pbmcKK21lc3NhZ2VzIHRvIGFuIGBBU1NFUlRfKmAsIGUuZy4KKworYGBgCitBU1NFUlRfRVEoMSwgRm9vKCkpIDw8ICJibGFoIGJsYWgiIDw8IGZvbzsKK2BgYAorCit3ZSBoYWQgdG8gZ2l2ZSB1cCB1c2luZyBgQVNTRVJUKmAgYW5kIGBGQUlMKmAgKGJ1dCBub3QgYEVYUEVDVCpgIGFuZAorYEFERF9GQUlMVVJFKmApIGluIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIG1vdmUgdGhlCitjb250ZW50IG9mIHlvdXIgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0byBhIHByaXZhdGUgdm9pZCBtZW1iZXIgZnVuY3Rpb24sIG9yCitzd2l0Y2ggdG8gYEVYUEVDVF8qKClgIGlmIHRoYXQgd29ya3MuIFRoaXMgc2VjdGlvbiBpbiB0aGUgdXNlcidzIGd1aWRlIGV4cGxhaW5zCitpdC4KKworIyMgTXkgc2V0LXVwIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQuIFdoeT8gIyMKKworQysrIGlzIGNhc2Utc2Vuc2l0aXZlLiBJdCBzaG91bGQgYmUgc3BlbGxlZCBhcyBgU2V0VXAoKWAuICBEaWQgeW91CitzcGVsbCBpdCBhcyBgU2V0dXAoKWA/CisKK1NpbWlsYXJseSwgc29tZXRpbWVzIHBlb3BsZSBzcGVsbCBgU2V0VXBUZXN0Q2FzZSgpYCBhcyBgU2V0dXBUZXN0Q2FzZSgpYCBhbmQKK3dvbmRlciB3aHkgaXQncyBuZXZlciBjYWxsZWQuCisKKyMjIEhvdyBkbyBJIGp1bXAgdG8gdGhlIGxpbmUgb2YgYSBmYWlsdXJlIGluIEVtYWNzIGRpcmVjdGx5PyAjIworCitHb29nbGUgVGVzdCdzIGZhaWx1cmUgbWVzc2FnZSBmb3JtYXQgaXMgdW5kZXJzdG9vZCBieSBFbWFjcyBhbmQgbWFueSBvdGhlcgorSURFcywgbGlrZSBhY21lIGFuZCBYQ29kZS4gSWYgYSBHb29nbGUgVGVzdCBtZXNzYWdlIGlzIGluIGEgY29tcGlsYXRpb24gYnVmZmVyCitpbiBFbWFjcywgdGhlbiBpdCdzIGNsaWNrYWJsZS4gWW91IGNhbiBub3cgaGl0IGBlbnRlcmAgb24gYSBtZXNzYWdlIHRvIGp1bXAgdG8KK3RoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCBvciB1c2UgYEMteCBgYCB0byBqdW1wIHRvIHRoZSBuZXh0IGZhaWx1cmUuCisKKyMjIEkgaGF2ZSBzZXZlcmFsIHRlc3QgY2FzZXMgd2hpY2ggc2hhcmUgdGhlIHNhbWUgdGVzdCBmaXh0dXJlIGxvZ2ljLCBkbyBJIGhhdmUgdG8gZGVmaW5lIGEgbmV3IHRlc3QgZml4dHVyZSBjbGFzcyBmb3IgZWFjaCBvZiB0aGVtPyBUaGlzIHNlZW1zIHByZXR0eSB0ZWRpb3VzLiAjIworCitZb3UgZG9uJ3QgaGF2ZSB0by4gSW5zdGVhZCBvZgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgQmFzZVRlc3Qge307CisKK1RFU1RfRihGb29UZXN0LCBBYmMpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBEZWYpIHsgLi4uIH0KKworY2xhc3MgQmFyVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCB7fTsKKworVEVTVF9GKEJhclRlc3QsIEFiYykgeyAuLi4gfQorVEVTVF9GKEJhclRlc3QsIERlZikgeyAuLi4gfQorYGBgCisKK3lvdSBjYW4gc2ltcGx5IGB0eXBlZGVmYCB0aGUgdGVzdCBmaXh0dXJlczoKK2BgYAordHlwZWRlZiBCYXNlVGVzdCBGb29UZXN0OworCitURVNUX0YoRm9vVGVzdCwgQWJjKSB7IC4uLiB9CitURVNUX0YoRm9vVGVzdCwgRGVmKSB7IC4uLiB9CisKK3R5cGVkZWYgQmFzZVRlc3QgQmFyVGVzdDsKKworVEVTVF9GKEJhclRlc3QsIEFiYykgeyAuLi4gfQorVEVTVF9GKEJhclRlc3QsIERlZikgeyAuLi4gfQorYGBgCisKKyMjIFRoZSBHb29nbGUgVGVzdCBvdXRwdXQgaXMgYnVyaWVkIGluIGEgd2hvbGUgYnVuY2ggb2YgbG9nIG1lc3NhZ2VzLiBXaGF0IGRvIEkgZG8/ICMjCisKK1RoZSBHb29nbGUgVGVzdCBvdXRwdXQgaXMgbWVhbnQgdG8gYmUgYSBjb25jaXNlIGFuZCBodW1hbi1mcmllbmRseSByZXBvcnQuIElmCit5b3VyIHRlc3QgZ2VuZXJhdGVzIHRleHR1YWwgb3V0cHV0IGl0c2VsZiwgaXQgd2lsbCBtaXggd2l0aCB0aGUgR29vZ2xlIFRlc3QKK291dHB1dCwgbWFraW5nIGl0IGhhcmQgdG8gcmVhZC4gSG93ZXZlciwgdGhlcmUgaXMgYW4gZWFzeSBzb2x1dGlvbiB0byB0aGlzCitwcm9ibGVtLgorCitTaW5jZSBtb3N0IGxvZyBtZXNzYWdlcyBnbyB0byBzdGRlcnIsIHdlIGRlY2lkZWQgdG8gbGV0IEdvb2dsZSBUZXN0IG91dHB1dCBnbwordG8gc3Rkb3V0LiBUaGlzIHdheSwgeW91IGNhbiBlYXNpbHkgc2VwYXJhdGUgdGhlIHR3byB1c2luZyByZWRpcmVjdGlvbi4gRm9yCitleGFtcGxlOgorYGBgCisuL215X3Rlc3QgPiBnb29nbGV0ZXN0X291dHB1dC50eHQKK2BgYAorCisjIyBXaHkgc2hvdWxkIEkgcHJlZmVyIHRlc3QgZml4dHVyZXMgb3ZlciBnbG9iYWwgdmFyaWFibGVzPyAjIworCitUaGVyZSBhcmUgc2V2ZXJhbCBnb29kIHJlYXNvbnM6CisgIDEuIEl0J3MgbGlrZWx5IHlvdXIgdGVzdCBuZWVkcyB0byBjaGFuZ2UgdGhlIHN0YXRlcyBvZiBpdHMgZ2xvYmFsIHZhcmlhYmxlcy4gVGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8ga2VlcCBzaWRlIGVmZmVjdHMgZnJvbSBlc2NhcGluZyBvbmUgdGVzdCBhbmQgY29udGFtaW5hdGluZyBvdGhlcnMsIG1ha2luZyBkZWJ1Z2dpbmcgZGlmZmljdWx0LiBCeSB1c2luZyBmaXh0dXJlcywgZWFjaCB0ZXN0IGhhcyBhIGZyZXNoIHNldCBvZiB2YXJpYWJsZXMgdGhhdCdzIGRpZmZlcmVudCAoYnV0IHdpdGggdGhlIHNhbWUgbmFtZXMpLiBUaHVzLCB0ZXN0cyBhcmUga2VwdCBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLgorICAxLiBHbG9iYWwgdmFyaWFibGVzIHBvbGx1dGUgdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisgIDEuIFRlc3QgZml4dHVyZXMgY2FuIGJlIHJldXNlZCB2aWEgc3ViY2xhc3NpbmcsIHdoaWNoIGNhbm5vdCBiZSBkb25lIGVhc2lseSB3aXRoIGdsb2JhbCB2YXJpYWJsZXMuIFRoaXMgaXMgdXNlZnVsIGlmIG1hbnkgdGVzdCBjYXNlcyBoYXZlIHNvbWV0aGluZyBpbiBjb21tb24uCisKKyMjIEhvdyBkbyBJIHRlc3QgcHJpdmF0ZSBjbGFzcyBtZW1iZXJzIHdpdGhvdXQgd3JpdGluZyBGUklFTkRcX1RFU1QoKXM/ICMjCisKK1lvdSBzaG91bGQgdHJ5IHRvIHdyaXRlIHRlc3RhYmxlIGNvZGUsIHdoaWNoIG1lYW5zIGNsYXNzZXMgc2hvdWxkIGJlIGVhc2lseQordGVzdGVkIGZyb20gdGhlaXIgcHVibGljIGludGVyZmFjZS4gT25lIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdGhlIFBpbXBsIGlkaW9tOgoreW91IG1vdmUgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIGludG8gYSBoZWxwZXIgY2xhc3MsIGFuZCBtYWtlIGFsbAorbWVtYmVycyBvZiB0aGUgaGVscGVyIGNsYXNzIHB1YmxpYy4KKworWW91IGhhdmUgc2V2ZXJhbCBvdGhlciBvcHRpb25zIHRoYXQgZG9uJ3QgcmVxdWlyZSB1c2luZyBgRlJJRU5EX1RFU1RgOgorICAqIFdyaXRlIHRoZSB0ZXN0cyBhcyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzOgorYGBgCitjbGFzcyBGb28geworICBmcmllbmQgY2xhc3MgRm9vVGVzdDsKKyAgLi4uCit9OworCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAuLi4KKyAgdm9pZCBUZXN0MSgpIHsuLi59IC8vIFRoaXMgYWNjZXNzZXMgcHJpdmF0ZSBtZW1iZXJzIG9mIGNsYXNzIEZvby4KKyAgdm9pZCBUZXN0MigpIHsuLi59IC8vIFNvIGRvZXMgdGhpcyBvbmUuCit9OworCitURVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKKyAgVGVzdDEoKTsKK30KKworVEVTVF9GKEZvb1Rlc3QsIFRlc3QyKSB7CisgIFRlc3QyKCk7Cit9CitgYGAKKyAgKiBJbiB0aGUgZml4dHVyZSBjbGFzcywgd3JpdGUgYWNjZXNzb3JzIGZvciB0aGUgdGVzdGVkIGNsYXNzJyBwcml2YXRlIG1lbWJlcnMsIHRoZW4gdXNlIHRoZSBhY2Nlc3NvcnMgaW4geW91ciB0ZXN0czoKK2BgYAorY2xhc3MgRm9vIHsKKyAgZnJpZW5kIGNsYXNzIEZvb1Rlc3Q7CisgIC4uLgorfTsKKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLi4uCisgIFQxIGdldF9wcml2YXRlX21lbWJlcjEoRm9vKiBvYmopIHsKKyAgICByZXR1cm4gb2JqLT5wcml2YXRlX21lbWJlcjFfOworICB9Cit9OworCitURVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKKyAgLi4uCisgIGdldF9wcml2YXRlX21lbWJlcjEoeCkKKyAgLi4uCit9CitgYGAKKyAgKiBJZiB0aGUgbWV0aG9kcyBhcmUgZGVjbGFyZWQgKipwcm90ZWN0ZWQqKiwgeW91IGNhbiBjaGFuZ2UgdGhlaXIgYWNjZXNzIGxldmVsIGluIGEgdGVzdC1vbmx5IHN1YmNsYXNzOgorYGBgCitjbGFzcyBZb3VyQ2xhc3MgeworICAuLi4KKyBwcm90ZWN0ZWQ6IC8vIHByb3RlY3RlZCBhY2Nlc3MgZm9yIHRlc3RhYmlsaXR5LgorICBpbnQgRG9Tb21ldGhpbmdSZXR1cm5pbmdJbnQoKTsKKyAgLi4uCit9OworCisvLyBpbiB0aGUgeW91cl9jbGFzc190ZXN0LmNjIGZpbGU6CitjbGFzcyBUZXN0YWJsZVlvdXJDbGFzcyA6IHB1YmxpYyBZb3VyQ2xhc3MgeworICAuLi4KKyBwdWJsaWM6IHVzaW5nIFlvdXJDbGFzczo6RG9Tb21ldGhpbmdSZXR1cm5pbmdJbnQ7IC8vIGNoYW5nZXMgYWNjZXNzIHJpZ2h0cworICAuLi4KK307CisKK1RFU1RfRihZb3VyQ2xhc3NUZXN0LCBEb1NvbWV0aGluZ1Rlc3QpIHsKKyAgVGVzdGFibGVZb3VyQ2xhc3Mgb2JqOworICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfdmFsdWUsIG9iai5Eb1NvbWV0aGluZ1JldHVybmluZ0ludCgpKTsKK30KK2BgYAorCisjIyBIb3cgZG8gSSB0ZXN0IHByaXZhdGUgY2xhc3Mgc3RhdGljIG1lbWJlcnMgd2l0aG91dCB3cml0aW5nIEZSSUVORFxfVEVTVCgpcz8gIyMKKworV2UgZmluZCBwcml2YXRlIHN0YXRpYyBtZXRob2RzIGNsdXR0ZXIgdGhlIGhlYWRlciBmaWxlLiAgVGhleSBhcmUKK2ltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGlkZWFsbHkgc2hvdWxkIGJlIGtlcHQgb3V0IG9mIGEgLmguIFNvIG9mdGVuIEkgbWFrZQordGhlbSBmcmVlIGZ1bmN0aW9ucyBpbnN0ZWFkLgorCitJbnN0ZWFkIG9mOgorYGBgCisvLyBmb28uaAorY2xhc3MgRm9vIHsKKyAgLi4uCisgcHJpdmF0ZToKKyAgc3RhdGljIGJvb2wgRnVuYyhpbnQgbik7Cit9OworCisvLyBmb28uY2MKK2Jvb2wgRm9vOjpGdW5jKGludCBuKSB7IC4uLiB9CisKKy8vIGZvb190ZXN0LmNjCitFWFBFQ1RfVFJVRShGb286OkZ1bmMoMTIzNDUpKTsKK2BgYAorCitZb3UgcHJvYmFibHkgc2hvdWxkIGJldHRlciB3cml0ZToKK2BgYAorLy8gZm9vLmgKK2NsYXNzIEZvbyB7CisgIC4uLgorfTsKKworLy8gZm9vLmNjCituYW1lc3BhY2UgaW50ZXJuYWwgeworICBib29sIEZ1bmMoaW50IG4pIHsgLi4uIH0KK30KKworLy8gZm9vX3Rlc3QuY2MKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIGJvb2wgRnVuYyhpbnQgbik7Cit9CisKK0VYUEVDVF9UUlVFKGludGVybmFsOjpGdW5jKDEyMzQ1KSk7CitgYGAKKworIyMgSSB3b3VsZCBsaWtlIHRvIHJ1biBhIHRlc3Qgc2V2ZXJhbCB0aW1lcyB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLiBEbyBJIG5lZWQgdG8gd3JpdGUgc2V2ZXJhbCBzaW1pbGFyIGNvcGllcyBvZiBpdD8gIyMKKworTm8uIFlvdSBjYW4gdXNlIGEgZmVhdHVyZSBjYWxsZWQgW3ZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHNdKEFkdmFuY2VkR3VpZGUjVmFsdWVfUGFyYW1ldGVyaXplZF9UZXN0cy5tZCkgd2hpY2gKK2xldHMgeW91IHJlcGVhdCB5b3VyIHRlc3RzIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMsIHdpdGhvdXQgZGVmaW5pbmcgaXQgbW9yZSB0aGFuIG9uY2UuCisKKyMjIEhvdyBkbyBJIHRlc3QgYSBmaWxlIHRoYXQgZGVmaW5lcyBtYWluKCk/ICMjCisKK1RvIHRlc3QgYSBgZm9vLmNjYCBmaWxlLCB5b3UgbmVlZCB0byBjb21waWxlIGFuZCBsaW5rIGl0IGludG8geW91ciB1bml0IHRlc3QKK3Byb2dyYW0uIEhvd2V2ZXIsIHdoZW4gdGhlIGZpbGUgY29udGFpbnMgYSBkZWZpbml0aW9uIGZvciB0aGUgYG1haW4oKWAKK2Z1bmN0aW9uLCBpdCB3aWxsIGNsYXNoIHdpdGggdGhlIGBtYWluKClgIG9mIHlvdXIgdW5pdCB0ZXN0LCBhbmQgd2lsbCByZXN1bHQgaW4KK2EgYnVpbGQgZXJyb3IuCisKK1RoZSByaWdodCBzb2x1dGlvbiBpcyB0byBzcGxpdCBpdCBpbnRvIHRocmVlIGZpbGVzOgorICAxLiBgZm9vLmhgIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMsCisgIDEuIGBmb28uY2NgIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBleGNlcHQgYG1haW4oKWAsIGFuZAorICAxLiBgZm9vX21haW4uY2NgIHdoaWNoIGNvbnRhaW5zIG5vdGhpbmcgYnV0IHRoZSBkZWZpbml0aW9uIG9mIGBtYWluKClgLgorCitUaGVuIGBmb28uY2NgIGNhbiBiZSBlYXNpbHkgdGVzdGVkLgorCitJZiB5b3UgYXJlIGFkZGluZyB0ZXN0cyB0byBhbiBleGlzdGluZyBmaWxlIGFuZCBkb24ndCB3YW50IGFuIGludHJ1c2l2ZSBjaGFuZ2UKK2xpa2UgdGhpcywgdGhlcmUgaXMgYSBoYWNrOiBqdXN0IGluY2x1ZGUgdGhlIGVudGlyZSBgZm9vLmNjYCBmaWxlIGluIHlvdXIgdW5pdAordGVzdC4gRm9yIGV4YW1wbGU6CitgYGAKKy8vIEZpbGUgZm9vX3VuaXR0ZXN0LmNjCisKKy8vIFRoZSBoZWFkZXJzIHNlY3Rpb24KKy4uLgorCisvLyBSZW5hbWVzIG1haW4oKSBpbiBmb28uY2MgdG8gbWFrZSByb29tIGZvciB0aGUgdW5pdCB0ZXN0IG1haW4oKQorI2RlZmluZSBtYWluIEZvb01haW4KKworI2luY2x1ZGUgImEvYi9mb28uY2MiCisKKy8vIFRoZSB0ZXN0cyBzdGFydCBoZXJlLgorLi4uCitgYGAKKworCitIb3dldmVyLCBwbGVhc2UgcmVtZW1iZXIgdGhpcyBpcyBhIGhhY2sgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgdGhlIGxhc3QKK3Jlc29ydC4KKworIyMgV2hhdCBjYW4gdGhlIHN0YXRlbWVudCBhcmd1bWVudCBpbiBBU1NFUlRcX0RFQVRIKCkgYmU/ICMjCisKK2BBU1NFUlRfREVBVEgoX3N0YXRlbWVudF8sIF9yZWdleF8pYCAob3IgYW55IGRlYXRoIGFzc2VydGlvbiBtYWNybykgY2FuIGJlIHVzZWQKK3doZXJldmVyIGBfc3RhdGVtZW50X2AgaXMgdmFsaWQuIFNvIGJhc2ljYWxseSBgX3N0YXRlbWVudF9gIGNhbiBiZSBhbnkgQysrCitzdGF0ZW1lbnQgdGhhdCBtYWtlcyBzZW5zZSBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBJbiBwYXJ0aWN1bGFyLCBpdCBjYW4KK3JlZmVyZW5jZSBnbG9iYWwgYW5kL29yIGxvY2FsIHZhcmlhYmxlcywgYW5kIGNhbiBiZToKKyAgKiBhIHNpbXBsZSBmdW5jdGlvbiBjYWxsIChvZnRlbiB0aGUgY2FzZSksCisgICogYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yCisgICogYSBjb21wb3VuZCBzdGF0ZW1lbnQuCisKKz4gU29tZSBleGFtcGxlcyBhcmUgc2hvd24gaGVyZToKK2BgYAorLy8gQSBkZWF0aCB0ZXN0IGNhbiBiZSBhIHNpbXBsZSBmdW5jdGlvbiBjYWxsLgorVEVTVChNeURlYXRoVGVzdCwgRnVuY3Rpb25DYWxsKSB7CisgIEFTU0VSVF9ERUFUSChYeXooNSksICJYeXogZmFpbGVkIik7Cit9CisKKy8vIE9yIGEgY29tcGxleCBleHByZXNzaW9uIHRoYXQgcmVmZXJlbmNlcyB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucy4KK1RFU1QoTXlEZWF0aFRlc3QsIENvbXBsZXhFeHByZXNzaW9uKSB7CisgIGNvbnN0IGJvb2wgYyA9IENvbmRpdGlvbigpOworICBBU1NFUlRfREVBVEgoKGMgPyBGdW5jMSgwKSA6IG9iamVjdDIuTWV0aG9kKCJ0ZXN0IikpLAorICAgICAgICAgICAgICAgIihGdW5jMXxNZXRob2QpIGZhaWxlZCIpOworfQorCisvLyBEZWF0aCBhc3NlcnRpb25zIGNhbiBiZSB1c2VkIGFueSB3aGVyZSBpbiBhIGZ1bmN0aW9uLiBJbgorLy8gcGFydGljdWxhciwgdGhleSBjYW4gYmUgaW5zaWRlIGEgbG9vcC4KK1RFU1QoTXlEZWF0aFRlc3QsIEluc2lkZUxvb3ApIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCBGb28oMCksIEZvbygxKSwgLi4uLCBhbmQgRm9vKDQpIGFsbCBkaWUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgRVhQRUNUX0RFQVRIX00oRm9vKGkpLCAiRm9vIGhhcyBcXGQrIGVycm9ycyIsCisgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIndoZXJlIGkgaXMgIiA8PCBpKTsKKyAgfQorfQorCisvLyBBIGRlYXRoIGFzc2VydGlvbiBjYW4gY29udGFpbiBhIGNvbXBvdW5kIHN0YXRlbWVudC4KK1RFU1QoTXlEZWF0aFRlc3QsIENvbXBvdW5kU3RhdGVtZW50KSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgYXQgbGVhc2Ugb25lIG9mIEJhcigwKSwgQmFyKDEpLCAuLi4sIGFuZAorICAvLyBCYXIoNCkgZGllcy4KKyAgQVNTRVJUX0RFQVRIKHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgQmFyKGkpOworICAgIH0KKyAgfSwKKyAgIkJhciBoYXMgXFxkKyBlcnJvcnMiKTt9CitgYGAKKworYGdvb2dsZXRlc3RfdW5pdHRlc3QuY2NgIGNvbnRhaW5zIG1vcmUgZXhhbXBsZXMgaWYgeW91IGFyZSBpbnRlcmVzdGVkLgorCisjIyBXaGF0IHN5bnRheCBkb2VzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaW4gQVNTRVJUXF9ERUFUSCB1c2U/ICMjCisKK09uIFBPU0lYIHN5c3RlbXMsIEdvb2dsZSBUZXN0IHVzZXMgdGhlIFBPU0lYIEV4dGVuZGVkIHJlZ3VsYXIKK2V4cHJlc3Npb24gc3ludGF4CisoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWd1bGFyX2V4cHJlc3Npb24jUE9TSVhfRXh0ZW5kZWRfUmVndWxhcl9FeHByZXNzaW9ucykuCitPbiBXaW5kb3dzLCBpdCB1c2VzIGEgbGltaXRlZCB2YXJpYW50IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbgorc3ludGF4LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlCitbcmVndWxhciBleHByZXNzaW9uIHN5bnRheF0oQWR2YW5jZWRHdWlkZSNSZWd1bGFyX0V4cHJlc3Npb25fU3ludGF4Lm1kKS4KKworIyMgSSBoYXZlIGEgZml4dHVyZSBjbGFzcyBGb28sIGJ1dCBURVNUXF9GKEZvbywgQmFyKSBnaXZlcyBtZSBlcnJvciAibm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGNhbGwgdG8gRm9vOjpGb28oKSIuIFdoeT8gIyMKKworR29vZ2xlIFRlc3QgbmVlZHMgdG8gYmUgYWJsZSB0byBjcmVhdGUgb2JqZWN0cyBvZiB5b3VyIHRlc3QgZml4dHVyZSBjbGFzcywgc28KK2l0IG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuIE5vcm1hbGx5IHRoZSBjb21waWxlciB3aWxsIGRlZmluZSBvbmUgZm9yCit5b3UuIEhvd2V2ZXIsIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB5b3UgaGF2ZSB0byBkZWZpbmUgeW91ciBvd246CisgICogSWYgeW91IGV4cGxpY2l0bHkgZGVjbGFyZSBhIG5vbi1kZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBjbGFzcyBgRm9vYCwgdGhlbiB5b3UgbmVlZCB0byBkZWZpbmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBldmVuIGlmIGl0IHdvdWxkIGJlIGVtcHR5LgorICAqIElmIGBGb29gIGhhcyBhIGNvbnN0IG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIsIHRoZW4geW91IGhhdmUgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIF9hbmRfIGluaXRpYWxpemUgdGhlIGNvbnN0IG1lbWJlciBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiB0aGUgY29uc3RydWN0b3IuIChFYXJseSB2ZXJzaW9ucyBvZiBgZ2NjYCBkb2Vzbid0IGZvcmNlIHlvdSB0byBpbml0aWFsaXplIHRoZSBjb25zdCBtZW1iZXIuIEl0J3MgYSBidWcgdGhhdCBoYXMgYmVlbiBmaXhlZCBpbiBgZ2NjIDRgLikKKworIyMgV2h5IGRvZXMgQVNTRVJUXF9ERUFUSCBjb21wbGFpbiBhYm91dCBwcmV2aW91cyB0aHJlYWRzIHRoYXQgd2VyZSBhbHJlYWR5IGpvaW5lZD8gIyMKKworV2l0aCB0aGUgTGludXggcHRocmVhZCBsaWJyYXJ5LCB0aGVyZSBpcyBubyB0dXJuaW5nIGJhY2sgb25jZSB5b3UgY3Jvc3MgdGhlCitsaW5lIGZyb20gc2luZ2xlIHRocmVhZCB0byBtdWx0aXBsZSB0aHJlYWRzLiBUaGUgZmlyc3QgdGltZSB5b3UgY3JlYXRlIGEKK3RocmVhZCwgYSBtYW5hZ2VyIHRocmVhZCBpcyBjcmVhdGVkIGluIGFkZGl0aW9uLCBzbyB5b3UgZ2V0IDMsIG5vdCAyLCB0aHJlYWRzLgorTGF0ZXIgd2hlbiB0aGUgdGhyZWFkIHlvdSBjcmVhdGUgam9pbnMgdGhlIG1haW4gdGhyZWFkLCB0aGUgdGhyZWFkIGNvdW50CitkZWNyZW1lbnRzIGJ5IDEsIGJ1dCB0aGUgbWFuYWdlciB0aHJlYWQgd2lsbCBuZXZlciBiZSBraWxsZWQsIHNvIHlvdSBzdGlsbCBoYXZlCisyIHRocmVhZHMsIHdoaWNoIG1lYW5zIHlvdSBjYW5ub3Qgc2FmZWx5IHJ1biBhIGRlYXRoIHRlc3QuCisKK1RoZSBuZXcgTlBUTCB0aHJlYWQgbGlicmFyeSBkb2Vzbid0IHN1ZmZlciBmcm9tIHRoaXMgcHJvYmxlbSwgYXMgaXQgZG9lc24ndAorY3JlYXRlIGEgbWFuYWdlciB0aHJlYWQuIEhvd2V2ZXIsIGlmIHlvdSBkb24ndCBjb250cm9sIHdoaWNoIG1hY2hpbmUgeW91ciB0ZXN0CitydW5zIG9uLCB5b3Ugc2hvdWxkbid0IGRlcGVuZCBvbiB0aGlzLgorCisjIyBXaHkgZG9lcyBHb29nbGUgVGVzdCByZXF1aXJlIHRoZSBlbnRpcmUgdGVzdCBjYXNlLCBpbnN0ZWFkIG9mIGluZGl2aWR1YWwgdGVzdHMsIHRvIGJlIG5hbWVkIEZPT0RlYXRoVGVzdCB3aGVuIGl0IHVzZXMgQVNTRVJUXF9ERUFUSD8gIyMKKworR29vZ2xlIFRlc3QgZG9lcyBub3QgaW50ZXJsZWF2ZSB0ZXN0cyBmcm9tIGRpZmZlcmVudCB0ZXN0IGNhc2VzLiBUaGF0IGlzLCBpdAorcnVucyBhbGwgdGVzdHMgaW4gb25lIHRlc3QgY2FzZSBmaXJzdCwgYW5kIHRoZW4gcnVucyBhbGwgdGVzdHMgaW4gdGhlIG5leHQgdGVzdAorY2FzZSwgYW5kIHNvIG9uLiBHb29nbGUgVGVzdCBkb2VzIHRoaXMgYmVjYXVzZSBpdCBuZWVkcyB0byBzZXQgdXAgYSB0ZXN0IGNhc2UKK2JlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiBpdCBpcyBydW4sIGFuZCB0ZWFyIGl0IGRvd24gYWZ0ZXJ3b3Jkcy4gU3BsaXR0aW5nIHVwCit0aGUgdGVzdCBjYXNlIHdvdWxkIHJlcXVpcmUgbXVsdGlwbGUgc2V0LXVwIGFuZCB0ZWFyLWRvd24gcHJvY2Vzc2VzLCB3aGljaCBpcworaW5lZmZpY2llbnQgYW5kIG1ha2VzIHRoZSBzZW1hbnRpY3MgdW5jbGVhbi4KKworSWYgd2Ugd2VyZSB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIHRlc3RzIGJhc2VkIG9uIHRlc3QgbmFtZSBpbnN0ZWFkIG9mIHRlc3QKK2Nhc2UgbmFtZSwgdGhlbiB3ZSB3b3VsZCBoYXZlIGEgcHJvYmxlbSB3aXRoIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uOgorCitgYGAKK1RFU1RfRihGb29UZXN0LCBBYmNEZWF0aFRlc3QpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBVdncpIHsgLi4uIH0KKworVEVTVF9GKEJhclRlc3QsIERlZkRlYXRoVGVzdCkgeyAuLi4gfQorVEVTVF9GKEJhclRlc3QsIFh5eikgeyAuLi4gfQorYGBgCisKK1NpbmNlIGBGb29UZXN0LkFiY0RlYXRoVGVzdGAgbmVlZHMgdG8gcnVuIGJlZm9yZSBgQmFyVGVzdC5YeXpgLCBhbmQgd2UgZG9uJ3QKK2ludGVybGVhdmUgdGVzdHMgZnJvbSBkaWZmZXJlbnQgdGVzdCBjYXNlcywgd2UgbmVlZCB0byBydW4gYWxsIHRlc3RzIGluIHRoZQorYEZvb1Rlc3RgIGNhc2UgYmVmb3JlIHJ1bm5pbmcgYW55IHRlc3QgaW4gdGhlIGBCYXJUZXN0YCBjYXNlLiBUaGlzIGNvbnRyYWRpY3RzCit3aXRoIHRoZSByZXF1aXJlbWVudCB0byBydW4gYEJhclRlc3QuRGVmRGVhdGhUZXN0YCBiZWZvcmUgYEZvb1Rlc3QuVXZ3YC4KKworIyMgQnV0IEkgZG9uJ3QgbGlrZSBjYWxsaW5nIG15IGVudGlyZSB0ZXN0IGNhc2UgRk9PRGVhdGhUZXN0IHdoZW4gaXQgY29udGFpbnMgYm90aCBkZWF0aCB0ZXN0cyBhbmQgbm9uLWRlYXRoIHRlc3RzLiBXaGF0IGRvIEkgZG8/ICMjCisKK1lvdSBkb24ndCBoYXZlIHRvLCBidXQgaWYgeW91IGxpa2UsIHlvdSBtYXkgc3BsaXQgdXAgdGhlIHRlc3QgY2FzZSBpbnRvCitgRm9vVGVzdGAgYW5kIGBGb29EZWF0aFRlc3RgLCB3aGVyZSB0aGUgbmFtZXMgbWFrZSBpdCBjbGVhciB0aGF0IHRoZXkgYXJlCityZWxhdGVkOgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsgLi4uIH07CisKK1RFU1RfRihGb29UZXN0LCBBYmMpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBEZWYpIHsgLi4uIH0KKwordHlwZWRlZiBGb29UZXN0IEZvb0RlYXRoVGVzdDsKKworVEVTVF9GKEZvb0RlYXRoVGVzdCwgVXZ3KSB7IC4uLiBFWFBFQ1RfREVBVEgoLi4uKSAuLi4gfQorVEVTVF9GKEZvb0RlYXRoVGVzdCwgWHl6KSB7IC4uLiBBU1NFUlRfREVBVEgoLi4uKSAuLi4gfQorYGBgCisKKyMjIFRoZSBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgIm5vIG1hdGNoIGZvciAnb3BlcmF0b3I8PCciIHdoZW4gSSB1c2UgYW4gYXNzZXJ0aW9uLiBXaGF0IGdpdmVzPyAjIworCitJZiB5b3UgdXNlIGEgdXNlci1kZWZpbmVkIHR5cGUgYEZvb1R5cGVgIGluIGFuIGFzc2VydGlvbiwgeW91IG11c3QgbWFrZSBzdXJlCit0aGVyZSBpcyBhbiBgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IEZvb1R5cGUmKWAgZnVuY3Rpb24KK2RlZmluZWQgc3VjaCB0aGF0IHdlIGNhbiBwcmludCBhIHZhbHVlIG9mIGBGb29UeXBlYC4KKworSW4gYWRkaXRpb24sIGlmIGBGb29UeXBlYCBpcyBkZWNsYXJlZCBpbiBhIG5hbWUgc3BhY2UsIHRoZSBgPDxgIG9wZXJhdG9yIGFsc28KK25lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIF9zYW1lXyBuYW1lIHNwYWNlLgorCisjIyBIb3cgZG8gSSBzdXBwcmVzcyB0aGUgbWVtb3J5IGxlYWsgbWVzc2FnZXMgb24gV2luZG93cz8gIyMKKworU2luY2UgdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgR29vZ2xlIFRlc3Qgc2luZ2xldG9uIHJlcXVpcmVzIGFsbG9jYXRpb25zIG9uCit0aGUgaGVhcCwgdGhlIFZpc3VhbCBDKysgbWVtb3J5IGxlYWsgZGV0ZWN0b3Igd2lsbCByZXBvcnQgbWVtb3J5IGxlYWtzIGF0IHRoZQorZW5kIG9mIHRoZSBwcm9ncmFtIHJ1bi4gVGhlIGVhc2llc3Qgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gdXNlIHRoZQorYF9DcnRNZW1DaGVja3BvaW50YCBhbmQgYF9DcnRNZW1EdW1wQWxsT2JqZWN0c1NpbmNlYCBjYWxscyB0byBub3QgcmVwb3J0IGFueQorc3RhdGljYWxseSBpbml0aWFsaXplZCBoZWFwIG9iamVjdHMuIFNlZSBNU0ROIGZvciBtb3JlIGRldGFpbHMgYW5kIGFkZGl0aW9uYWwKK2hlYXAgY2hlY2svZGVidWcgcm91dGluZXMuCisKKyMjIEkgYW0gYnVpbGRpbmcgbXkgcHJvamVjdCB3aXRoIEdvb2dsZSBUZXN0IGluIFZpc3VhbCBTdHVkaW8gYW5kIGFsbCBJJ20gZ2V0dGluZyBpcyBhIGJ1bmNoIG9mIGxpbmtlciBlcnJvcnMgKG9yIHdhcm5pbmdzKS4gSGVscCEgIyMKKworWW91IG1heSBnZXQgYSBudW1iZXIgb2YgdGhlIGZvbGxvd2luZyBsaW5rZXIgZXJyb3Igb3Igd2FybmluZ3MgaWYgeW91CithdHRlbXB0IHRvIGxpbmsgeW91ciB0ZXN0IHByb2plY3Qgd2l0aCB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSB3aGVuCit5b3VyIHByb2plY3QgYW5kIHRoZSBhcmUgbm90IGJ1aWx0IHVzaW5nIHRoZSBzYW1lIGNvbXBpbGVyIHNldHRpbmdzLgorCisgICogTE5LMjAwNTogc3ltYm9sIGFscmVhZHkgZGVmaW5lZCBpbiBvYmplY3QKKyAgKiBMTks0MjE3OiBsb2NhbGx5IGRlZmluZWQgc3ltYm9sICdzeW1ib2wnIGltcG9ydGVkIGluIGZ1bmN0aW9uICdmdW5jdGlvbicKKyAgKiBMTks0MDQ5OiBsb2NhbGx5IGRlZmluZWQgc3ltYm9sICdzeW1ib2wnIGltcG9ydGVkCisKK1RoZSBHb29nbGUgVGVzdCBwcm9qZWN0IChndGVzdC52Y3Byb2opIGhhcyB0aGUgUnVudGltZSBMaWJyYXJ5IG9wdGlvbgorc2V0IHRvIC9NVCAodXNlIG11bHRpLXRocmVhZGVkIHN0YXRpYyBsaWJyYXJpZXMsIC9NVGQgZm9yIGRlYnVnKS4gSWYKK3lvdXIgcHJvamVjdCB1c2VzIHNvbWV0aGluZyBlbHNlLCBmb3IgZXhhbXBsZSAvTUQgKHVzZSBtdWx0aS10aHJlYWRlZAorRExMcywgL01EZCBmb3IgZGVidWcpLCB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIHNldHRpbmcgaW4gdGhlIEdvb2dsZQorVGVzdCBwcm9qZWN0IHRvIG1hdGNoIHlvdXIgcHJvamVjdCdzLgorCitUbyB1cGRhdGUgdGhpcyBzZXR0aW5nIG9wZW4gdGhlIHByb2plY3QgcHJvcGVydGllcyBpbiB0aGUgVmlzdWFsCitTdHVkaW8gSURFIHRoZW4gc2VsZWN0IHRoZSBicmFuY2ggQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIHwgQy9DKysgfAorQ29kZSBHZW5lcmF0aW9uIGFuZCBjaGFuZ2UgdGhlIG9wdGlvbiAiUnVudGltZSBMaWJyYXJ5Ii4gIFlvdSBtYXkgYWxzbyB0cnkKK3VzaW5nIGd0ZXN0LW1kLnZjcHJvaiBpbnN0ZWFkIG9mIGd0ZXN0LnZjcHJvai4KKworIyMgSSBwdXQgbXkgdGVzdHMgaW4gYSBsaWJyYXJ5IGFuZCBHb29nbGUgVGVzdCBkb2Vzbid0IHJ1biB0aGVtLiBXaGF0J3MgaGFwcGVuaW5nPyAjIworSGF2ZSB5b3UgcmVhZCBhCitbd2FybmluZ10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9QcmltZXIjSW1wb3J0YW50X25vdGVfZm9yX1Zpc3VhbF9DKytfdXNlcnMpIG9uCit0aGUgR29vZ2xlIFRlc3QgUHJpbWVyIHBhZ2U/CisKKyMjIEkgd2FudCB0byB1c2UgR29vZ2xlIFRlc3Qgd2l0aCBWaXN1YWwgU3R1ZGlvIGJ1dCBkb24ndCBrbm93IHdoZXJlIHRvIHN0YXJ0LiAjIworTWFueSBwZW9wbGUgYXJlIGluIHlvdXIgcG9zaXRpb24gYW5kIG9uZSBvZiB0aGUgcG9zdGVkIGhpcyBzb2x1dGlvbiB0bworb3VyIG1haWxpbmcgbGlzdC4gSGVyZSBpcyBoaXMgbGluazoKK2h0dHA6Ly9oYXNzYW5qYW1pbGFobWFkLmJsb2dzcG90LmNvbS8yMDA5LzA3L2d0ZXN0LXN0YXJ0ZXJzLWhlbHAuaHRtbC4KKworIyMgSSBhbSBzZWVpbmcgY29tcGlsZSBlcnJvcnMgbWVudGlvbmluZyBzdGQ6OnR5cGVcX3RyYWl0cyB3aGVuIEkgdHJ5IHRvIHVzZSBHb29nbGUgVGVzdCBvbiBTb2xhcmlzLiAjIworR29vZ2xlIFRlc3QgdXNlcyBwYXJ0cyBvZiB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkgdGhhdCBTdW5TdHVkaW8gZG9lcyBub3Qgc3VwcG9ydC4KK091ciB1c2VycyByZXBvcnRlZCBzdWNjZXNzIHVzaW5nIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucy4gVHJ5IHJ1bm5pbmcgdGhlIGJ1aWxkIGFmdGVyIHJ1bmluZyB0aGlzIGNvbW1hZDoKKworYGV4cG9ydCBDQz1jYyBDWFg9Q0MgQ1hYRkxBR1M9Jy1saWJyYXJ5PXN0bHBvcnQ0J2AKKworIyMgSG93IGNhbiBteSBjb2RlIGRldGVjdCBpZiBpdCBpcyBydW5uaW5nIGluIGEgdGVzdD8gIyMKKworSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBzbmlmZnMgd2hldGhlciBpdCdzIHJ1bm5pbmcgaW4gYSB0ZXN0IGFuZCBkb2VzCitkaWZmZXJlbnQgdGhpbmdzIGFjY29yZGluZ2x5LCB5b3UgYXJlIGxlYWtpbmcgdGVzdC1vbmx5IGxvZ2ljIGludG8KK3Byb2R1Y3Rpb24gY29kZSBhbmQgdGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gZW5zdXJlIHRoYXQgdGhlIHRlc3Qtb25seQorY29kZSBwYXRocyBhcmVuJ3QgcnVuIGJ5IG1pc3Rha2UgaW4gcHJvZHVjdGlvbi4gIFN1Y2ggY2xldmVybmVzcyBhbHNvCitsZWFkcyB0bworW0hlaXNlbmJ1Z3NdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW51c3VhbF9zb2Z0d2FyZV9idWcjSGVpc2VuYnVnKS4KK1RoZXJlZm9yZSB3ZSBzdHJvbmdseSBhZHZpc2UgYWdhaW5zdCB0aGUgcHJhY3RpY2UsIGFuZCBHb29nbGUgVGVzdCBkb2Vzbid0Citwcm92aWRlIGEgd2F5IHRvIGRvIGl0LgorCitJbiBnZW5lcmFsLCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGNhdXNlIHRoZSBjb2RlIHRvIGJlaGF2ZQorZGlmZmVyZW50bHkgdW5kZXIgdGVzdCBpcyBbZGVwZW5kZW5jeSBpbmplY3Rpb25dKGh0dHA6Ly9qYW1lc3Nob3JlLmNvbS9CbG9nL0RlcGVuZGVuY3ktSW5qZWN0aW9uLURlbXlzdGlmaWVkLmh0bWwpLgorWW91IGNhbiBpbmplY3QgZGlmZmVyZW50IGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgdGVzdCBhbmQgZnJvbSB0aGUKK3Byb2R1Y3Rpb24gY29kZS4gIFNpbmNlIHlvdXIgcHJvZHVjdGlvbiBjb2RlIGRvZXNuJ3QgbGluayBpbiB0aGUKK2Zvci10ZXN0IGxvZ2ljIGF0IGFsbCwgdGhlcmUgaXMgbm8gZGFuZ2VyIGluIGFjY2lkZW50YWxseSBydW5uaW5nIGl0LgorCitIb3dldmVyLCBpZiB5b3UgX3JlYWxseV8sIF9yZWFsbHlfLCBfcmVhbGx5XyBoYXZlIG5vIGNob2ljZSwgYW5kIGlmCit5b3UgZm9sbG93IHRoZSBydWxlIG9mIGVuZGluZyB5b3VyIHRlc3QgcHJvZ3JhbSBuYW1lcyB3aXRoIGBfdGVzdGAsCit5b3UgY2FuIHVzZSB0aGUgX2hvcnJpYmxlXyBoYWNrIG9mIHNuaWZmaW5nIHlvdXIgZXhlY3V0YWJsZSBuYW1lCisoYGFyZ3ZbMF1gIGluIGBtYWluKClgKSB0byBrbm93IHdoZXRoZXIgdGhlIGNvZGUgaXMgdW5kZXIgdGVzdC4KKworIyMgR29vZ2xlIFRlc3QgZGVmaW5lcyBhIG1hY3JvIHRoYXQgY2xhc2hlcyB3aXRoIG9uZSBkZWZpbmVkIGJ5IGFub3RoZXIgbGlicmFyeS4gSG93IGRvIEkgZGVhbCB3aXRoIHRoYXQ/ICMjCisKK0luIEMrKywgbWFjcm9zIGRvbid0IG9iZXkgbmFtZXNwYWNlcy4gIFRoZXJlZm9yZSB0d28gbGlicmFyaWVzIHRoYXQKK2JvdGggZGVmaW5lIGEgbWFjcm8gb2YgdGhlIHNhbWUgbmFtZSB3aWxsIGNsYXNoIGlmIHlvdSAjaW5jbHVkZSBib3RoCitkZWZpbml0aW9ucy4gIEluIGNhc2UgYSBHb29nbGUgVGVzdCBtYWNybyBjbGFzaGVzIHdpdGggYW5vdGhlcgorbGlicmFyeSwgeW91IGNhbiBmb3JjZSBHb29nbGUgVGVzdCB0byByZW5hbWUgaXRzIG1hY3JvIHRvIGF2b2lkIHRoZQorY29uZmxpY3QuCisKK1NwZWNpZmljYWxseSwgaWYgYm90aCBHb29nbGUgVGVzdCBhbmQgc29tZSBvdGhlciBjb2RlIGRlZmluZSBtYWNybworYEZPT2AsIHlvdSBjYW4gYWRkCitgYGAKKyAgLURHVEVTVF9ET05UX0RFRklORV9GT089MQorYGBgCit0byB0aGUgY29tcGlsZXIgZmxhZ3MgdG8gdGVsbCBHb29nbGUgVGVzdCB0byBjaGFuZ2UgdGhlIG1hY3JvJ3MgbmFtZQorZnJvbSBgRk9PYCB0byBgR1RFU1RfRk9PYC4gRm9yIGV4YW1wbGUsIHdpdGggYC1ER1RFU1RfRE9OVF9ERUZJTkVfVEVTVD0xYCwgeW91J2xsIG5lZWQgdG8gd3JpdGUKK2BgYAorICBHVEVTVF9URVNUKFNvbWVUZXN0LCBEb2VzVGhpcykgeyAuLi4gfQorYGBgCitpbnN0ZWFkIG9mCitgYGAKKyAgVEVTVChTb21lVGVzdCwgRG9lc1RoaXMpIHsgLi4uIH0KK2BgYAoraW4gb3JkZXIgdG8gZGVmaW5lIGEgdGVzdC4KKworQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIGBURVNUYCwgYEZBSUxgLCBgU1VDQ0VFRGAsIGFuZCB0aGUgYmFzaWMgY29tcGFyaXNvbiBhc3NlcnRpb24gbWFjcm9zIGNhbiBoYXZlIGFsdGVybmF0aXZlIG5hbWVzLiBZb3UgY2FuIHNlZSB0aGUgZnVsbCBsaXN0IG9mIGNvdmVyZWQgbWFjcm9zIFtoZXJlXShodHRwOi8vd3d3Lmdvb2dsZS5jb20vY29kZXNlYXJjaD9xPWlmKyFHVEVTVF9ET05UX0RFRklORV9cdyUyQitwYWNrYWdlOmh0dHA6Ly9nb29nbGV0ZXN0XC5nb29nbGVjb2RlXC5jb20rZmlsZTovaW5jbHVkZS9ndGVzdC9ndGVzdC5oKS4gTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlICJBdm9pZGluZyBNYWNybyBOYW1lIENsYXNoZXMiIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBmaWxlLgorCisKKyMjIElzIGl0IE9LIGlmIEkgaGF2ZSB0d28gc2VwYXJhdGUgYFRFU1QoRm9vLCBCYXIpYCB0ZXN0IG1ldGhvZHMgZGVmaW5lZCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcz8gIyMKKworWWVzLgorCitUaGUgcnVsZSBpcyAqKmFsbCB0ZXN0IG1ldGhvZHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIGZpeHR1cmUgY2xhc3MqKi4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgaXMgKiphbGxvd2VkKiogYmVjYXVzZSBib3RoIHRlc3RzIHVzZSB0aGUgc2FtZSBmaXh0dXJlIGNsYXNzIChgOjp0ZXN0aW5nOjpUZXN0YCkuCisKK2BgYAorbmFtZXNwYWNlIGZvbyB7CitURVNUKENvb2xUZXN0LCBEb1NvbWV0aGluZykgeworICBTVUNDRUVEKCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgZm9vCisKK25hbWVzcGFjZSBiYXIgeworVEVTVChDb29sVGVzdCwgRG9Tb21ldGhpbmcpIHsKKyAgU1VDQ0VFRCgpOworfQorfSAgLy8gbmFtZXNwYWNlIGZvbworYGBgCisKK0hvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgY29kZSBpcyAqKm5vdCBhbGxvd2VkKiogYW5kIHdpbGwgcHJvZHVjZSBhIHJ1bnRpbWUgZXJyb3IgZnJvbSBHb29nbGUgVGVzdCBiZWNhdXNlIHRoZSB0ZXN0IG1ldGhvZHMgYXJlIHVzaW5nIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIHRlc3QgY2FzZSBuYW1lLgorCitgYGAKK25hbWVzcGFjZSBmb28geworY2xhc3MgQ29vbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OyAgLy8gRml4dHVyZSBmb286OkNvb2xUZXN0CitURVNUX0YoQ29vbFRlc3QsIERvU29tZXRoaW5nKSB7CisgIFNVQ0NFRUQoKTsKK30KK30gIC8vIG5hbWVzcGFjZSBmb28KKworbmFtZXNwYWNlIGJhciB7CitjbGFzcyBDb29sVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307ICAvLyBGaXh0dXJlOiBiYXI6OkNvb2xUZXN0CitURVNUX0YoQ29vbFRlc3QsIERvU29tZXRoaW5nKSB7CisgIFNVQ0NFRUQoKTsKK30KK30gIC8vIG5hbWVzcGFjZSBmb28KK2BgYAorCisjIyBIb3cgZG8gSSBidWlsZCBHb29nbGUgVGVzdGluZyBGcmFtZXdvcmsgd2l0aCBYY29kZSA0PyAjIworCitJZiB5b3UgdHJ5IHRvIGJ1aWxkIEdvb2dsZSBUZXN0J3MgWGNvZGUgcHJvamVjdCB3aXRoIFhjb2RlIDQuMCBvciBsYXRlciwgeW91IG1heSBlbmNvdW50ZXIgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IGxvb2tzIGxpa2UKKyJNaXNzaW5nIFNESyBpbiB0YXJnZXQgZ3Rlc3RcX2ZyYW1ld29yazogL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayIuIFRoYXQgbWVhbnMgdGhhdCBYY29kZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTREsgdGhlIHByb2plY3QgaXMgdGFyZ2V0aW5nLiBTZWUgdGhlIFhjb2RlIHNlY3Rpb24gaW4gdGhlIFtSRUFETUVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvUkVBRE1FKSBmaWxlIG9uIGhvdyB0byByZXNvbHZlIHRoaXMuCisKKyMjIE15IHF1ZXN0aW9uIGlzIG5vdCBjb3ZlcmVkIGluIHlvdXIgRkFRISAjIworCitJZiB5b3UgY2Fubm90IGZpbmQgdGhlIGFuc3dlciB0byB5b3VyIHF1ZXN0aW9uIGluIHRoaXMgRkFRLCB0aGVyZSBhcmUKK3NvbWUgb3RoZXIgcmVzb3VyY2VzIHlvdSBjYW4gdXNlOgorCisgIDEuIHJlYWQgb3RoZXIgW3dpa2kgcGFnZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3cvbGlzdCksCisgIDEuIHNlYXJjaCB0aGUgbWFpbGluZyBsaXN0IFthcmNoaXZlXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xldGVzdGZyYW1ld29yay90b3BpY3MpLAorICAxLiBhc2sgaXQgb24gW2dvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbV0obWFpbHRvOmdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSkgYW5kIHNvbWVvbmUgd2lsbCBhbnN3ZXIgaXQgKHRvIHByZXZlbnQgc3BhbSwgd2UgcmVxdWlyZSB5b3UgdG8gam9pbiB0aGUgW2Rpc2N1c3Npb24gZ3JvdXBdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGV0ZXN0ZnJhbWV3b3JrKSBiZWZvcmUgeW91IGNhbiBwb3N0LikuCisKK1BsZWFzZSBub3RlIHRoYXQgY3JlYXRpbmcgYW4gaXNzdWUgaW4gdGhlCitbaXNzdWUgdHJhY2tlcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvaXNzdWVzL2xpc3QpIGlzIF9ub3RfCithIGdvb2Qgd2F5IHRvIGdldCB5b3VyIGFuc3dlciwgYXMgaXQgaXMgbW9uaXRvcmVkIGluZnJlcXVlbnRseSBieSBhCit2ZXJ5IHNtYWxsIG51bWJlciBvZiBwZW9wbGUuCisKK1doZW4gYXNraW5nIGEgcXVlc3Rpb24sIGl0J3MgaGVscGZ1bCB0byBwcm92aWRlIGFzIG11Y2ggb2YgdGhlCitmb2xsb3dpbmcgaW5mb3JtYXRpb24gYXMgcG9zc2libGUgKHBlb3BsZSBjYW5ub3QgaGVscCB5b3UgaWYgdGhlcmUncworbm90IGVub3VnaCBpbmZvcm1hdGlvbiBpbiB5b3VyIHF1ZXN0aW9uKToKKworICAqIHRoZSB2ZXJzaW9uIChvciB0aGUgcmV2aXNpb24gbnVtYmVyIGlmIHlvdSBjaGVjayBvdXQgZnJvbSBTVk4gZGlyZWN0bHkpIG9mIEdvb2dsZSBUZXN0IHlvdSB1c2UgKEdvb2dsZSBUZXN0IGlzIHVuZGVyIGFjdGl2ZSBkZXZlbG9wbWVudCwgc28gaXQncyBwb3NzaWJsZSB0aGF0IHlvdXIgcHJvYmxlbSBoYXMgYmVlbiBzb2x2ZWQgaW4gYSBsYXRlciB2ZXJzaW9uKSwKKyAgKiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0sCisgICogdGhlIG5hbWUgYW5kIHZlcnNpb24gb2YgeW91ciBjb21waWxlciwKKyAgKiB0aGUgY29tcGxldGUgY29tbWFuZCBsaW5lIGZsYWdzIHlvdSBnaXZlIHRvIHlvdXIgY29tcGlsZXIsCisgICogdGhlIGNvbXBsZXRlIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2VzIChpZiB0aGUgcXVlc3Rpb24gaXMgYWJvdXQgY29tcGlsYXRpb24pLAorICAqIHRoZSBfYWN0dWFsXyBjb2RlIChpZGVhbGx5LCBhIG1pbmltYWwgYnV0IGNvbXBsZXRlIHByb2dyYW0pIHRoYXQgaGFzIHRoZSBwcm9ibGVtIHlvdSBlbmNvdW50ZXIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvUHJpbWVyLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvUHJpbWVyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTZjNzcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9QcmltZXIubWQKQEAgLTAsMCArMSw1MDEgQEAKKworCisjIEludHJvZHVjdGlvbjogV2h5IEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcms/ICMKKworX0dvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmtfIGhlbHBzIHlvdSB3cml0ZSBiZXR0ZXIgQysrIHRlc3RzLgorCitObyBtYXR0ZXIgd2hldGhlciB5b3Ugd29yayBvbiBMaW51eCwgV2luZG93cywgb3IgYSBNYWMsIGlmIHlvdSB3cml0ZSBDKysgY29kZSwKK0dvb2dsZSBUZXN0IGNhbiBoZWxwIHlvdS4KKworU28gd2hhdCBtYWtlcyBhIGdvb2QgdGVzdCwgYW5kIGhvdyBkb2VzIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgZml0IGluPyBXZSBiZWxpZXZlOgorICAxLiBUZXN0cyBzaG91bGQgYmUgX2luZGVwZW5kZW50XyBhbmQgX3JlcGVhdGFibGVfLiBJdCdzIGEgcGFpbiB0byBkZWJ1ZyBhIHRlc3QgdGhhdCBzdWNjZWVkcyBvciBmYWlscyBhcyBhIHJlc3VsdCBvZiBvdGhlciB0ZXN0cy4gIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgaXNvbGF0ZXMgdGhlIHRlc3RzIGJ5IHJ1bm5pbmcgZWFjaCBvZiB0aGVtIG9uIGEgZGlmZmVyZW50IG9iamVjdC4gV2hlbiBhIHRlc3QgZmFpbHMsIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgYWxsb3dzIHlvdSB0byBydW4gaXQgaW4gaXNvbGF0aW9uIGZvciBxdWljayBkZWJ1Z2dpbmcuCisgIDEuIFRlc3RzIHNob3VsZCBiZSB3ZWxsIF9vcmdhbml6ZWRfIGFuZCByZWZsZWN0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHRlc3RlZCBjb2RlLiAgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBncm91cHMgcmVsYXRlZCB0ZXN0cyBpbnRvIHRlc3QgY2FzZXMgdGhhdCBjYW4gc2hhcmUgZGF0YSBhbmQgc3Vicm91dGluZXMuIFRoaXMgY29tbW9uIHBhdHRlcm4gaXMgZWFzeSB0byByZWNvZ25pemUgYW5kIG1ha2VzIHRlc3RzIGVhc3kgdG8gbWFpbnRhaW4uIFN1Y2ggY29uc2lzdGVuY3kgaXMgZXNwZWNpYWxseSBoZWxwZnVsIHdoZW4gcGVvcGxlIHN3aXRjaCBwcm9qZWN0cyBhbmQgc3RhcnQgdG8gd29yayBvbiBhIG5ldyBjb2RlIGJhc2UuCisgIDEuIFRlc3RzIHNob3VsZCBiZSBfcG9ydGFibGVfIGFuZCBfcmV1c2FibGVfLiBUaGUgb3Blbi1zb3VyY2UgY29tbXVuaXR5IGhhcyBhIGxvdCBvZiBjb2RlIHRoYXQgaXMgcGxhdGZvcm0tbmV1dHJhbCwgaXRzIHRlc3RzIHNob3VsZCBhbHNvIGJlIHBsYXRmb3JtLW5ldXRyYWwuICBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIHdvcmtzIG9uIGRpZmZlcmVudCBPU2VzLCB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMgKGdjYywgTVNWQywgYW5kIG90aGVycyksIHdpdGggb3Igd2l0aG91dCBleGNlcHRpb25zLCBzbyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIHRlc3RzIGNhbiBlYXNpbHkgd29yayB3aXRoIGEgdmFyaWV0eSBvZiBjb25maWd1cmF0aW9ucy4gIChOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcmVsZWFzZSBvbmx5IGNvbnRhaW5zIGJ1aWxkIHNjcmlwdHMgZm9yIExpbnV4IC0gd2UgYXJlIGFjdGl2ZWx5IHdvcmtpbmcgb24gc2NyaXB0cyBmb3Igb3RoZXIgcGxhdGZvcm1zLikKKyAgMS4gV2hlbiB0ZXN0cyBmYWlsLCB0aGV5IHNob3VsZCBwcm92aWRlIGFzIG11Y2ggX2luZm9ybWF0aW9uXyBhYm91dCB0aGUgcHJvYmxlbSBhcyBwb3NzaWJsZS4gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBkb2Vzbid0IHN0b3AgYXQgdGhlIGZpcnN0IHRlc3QgZmFpbHVyZS4gSW5zdGVhZCwgaXQgb25seSBzdG9wcyB0aGUgY3VycmVudCB0ZXN0IGFuZCBjb250aW51ZXMgd2l0aCB0aGUgbmV4dC4gWW91IGNhbiBhbHNvIHNldCB1cCB0ZXN0cyB0aGF0IHJlcG9ydCBub24tZmF0YWwgZmFpbHVyZXMgYWZ0ZXIgd2hpY2ggdGhlIGN1cnJlbnQgdGVzdCBjb250aW51ZXMuIFRodXMsIHlvdSBjYW4gZGV0ZWN0IGFuZCBmaXggbXVsdGlwbGUgYnVncyBpbiBhIHNpbmdsZSBydW4tZWRpdC1jb21waWxlIGN5Y2xlLgorICAxLiBUaGUgdGVzdGluZyBmcmFtZXdvcmsgc2hvdWxkIGxpYmVyYXRlIHRlc3Qgd3JpdGVycyBmcm9tIGhvdXNla2VlcGluZyBjaG9yZXMgYW5kIGxldCB0aGVtIGZvY3VzIG9uIHRoZSB0ZXN0IF9jb250ZW50Xy4gIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgYXV0b21hdGljYWxseSBrZWVwcyB0cmFjayBvZiBhbGwgdGVzdHMgZGVmaW5lZCwgYW5kIGRvZXNuJ3QgcmVxdWlyZSB0aGUgdXNlciB0byBlbnVtZXJhdGUgdGhlbSBpbiBvcmRlciB0byBydW4gdGhlbS4KKyAgMS4gVGVzdHMgc2hvdWxkIGJlIF9mYXN0Xy4gV2l0aCBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLCB5b3UgY2FuIHJldXNlIHNoYXJlZCByZXNvdXJjZXMgYWNyb3NzIHRlc3RzIGFuZCBwYXkgZm9yIHRoZSBzZXQtdXAvdGVhci1kb3duIG9ubHkgb25jZSwgd2l0aG91dCBtYWtpbmcgdGVzdHMgZGVwZW5kIG9uIGVhY2ggb3RoZXIuCisKK1NpbmNlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgaXMgYmFzZWQgb24gdGhlIHBvcHVsYXIgeFVuaXQKK2FyY2hpdGVjdHVyZSwgeW91J2xsIGZlZWwgcmlnaHQgYXQgaG9tZSBpZiB5b3UndmUgdXNlZCBKVW5pdCBvciBQeVVuaXQgYmVmb3JlLgorSWYgbm90LCBpdCB3aWxsIHRha2UgeW91IGFib3V0IDEwIG1pbnV0ZXMgdG8gbGVhcm4gdGhlIGJhc2ljcyBhbmQgZ2V0IHN0YXJ0ZWQuCitTbyBsZXQncyBnbyEKKworX05vdGU6XyBXZSBzb21ldGltZXMgcmVmZXIgdG8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBpbmZvcm1hbGx5CithcyBfR29vZ2xlIFRlc3RfLgorCisjIFNldHRpbmcgdXAgYSBOZXcgVGVzdCBQcm9qZWN0ICMKKworVG8gd3JpdGUgYSB0ZXN0IHByb2dyYW0gdXNpbmcgR29vZ2xlIFRlc3QsIHlvdSBuZWVkIHRvIGNvbXBpbGUgR29vZ2xlCitUZXN0IGludG8gYSBsaWJyYXJ5IGFuZCBsaW5rIHlvdXIgdGVzdCB3aXRoIGl0LiAgV2UgcHJvdmlkZSBidWlsZAorZmlsZXMgZm9yIHNvbWUgcG9wdWxhciBidWlsZCBzeXN0ZW1zOiBgbXN2Yy9gIGZvciBWaXN1YWwgU3R1ZGlvLAorYHhjb2RlL2AgZm9yIE1hYyBYY29kZSwgYG1ha2UvYCBmb3IgR05VIG1ha2UsIGBjb2RlZ2Vhci9gIGZvciBCb3JsYW5kCitDKysgQnVpbGRlciwgYW5kIHRoZSBhdXRvdG9vbHMgc2NyaXB0IChkZXByZWNhdGVkKSBhbmQKK2BDTWFrZUxpc3RzLnR4dGAgZm9yIENNYWtlIChyZWNvbW1lbmRlZCkgaW4gdGhlIEdvb2dsZSBUZXN0IHJvb3QKK2RpcmVjdG9yeS4gIElmIHlvdXIgYnVpbGQgc3lzdGVtIGlzIG5vdCBvbiB0aGlzIGxpc3QsIHlvdSBjYW4gdGFrZSBhCitsb29rIGF0IGBtYWtlL01ha2VmaWxlYCB0byBsZWFybiBob3cgR29vZ2xlIFRlc3Qgc2hvdWxkIGJlIGNvbXBpbGVkCisoYmFzaWNhbGx5IHlvdSB3YW50IHRvIGNvbXBpbGUgYHNyYy9ndGVzdC1hbGwuY2NgIHdpdGggYEdURVNUX1JPT1RgCithbmQgYEdURVNUX1JPT1QvaW5jbHVkZWAgaW4gdGhlIGhlYWRlciBzZWFyY2ggcGF0aCwgd2hlcmUgYEdURVNUX1JPT1RgCitpcyB0aGUgR29vZ2xlIFRlc3Qgcm9vdCBkaXJlY3RvcnkpLgorCitPbmNlIHlvdSBhcmUgYWJsZSB0byBjb21waWxlIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5LCB5b3Ugc2hvdWxkCitjcmVhdGUgYSBwcm9qZWN0IG9yIGJ1aWxkIHRhcmdldCBmb3IgeW91ciB0ZXN0IHByb2dyYW0uICBNYWtlIHN1cmUgeW91CitoYXZlIGBHVEVTVF9ST09UL2luY2x1ZGVgIGluIHRoZSBoZWFkZXIgc2VhcmNoIHBhdGggc28gdGhhdCB0aGUKK2NvbXBpbGVyIGNhbiBmaW5kIGAiZ3Rlc3QvZ3Rlc3QuaCJgIHdoZW4gY29tcGlsaW5nIHlvdXIgdGVzdC4gIFNldCB1cAoreW91ciB0ZXN0IHByb2plY3QgdG8gbGluayB3aXRoIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5IChmb3IgZXhhbXBsZSwKK2luIFZpc3VhbCBTdHVkaW8sIHRoaXMgaXMgZG9uZSBieSBhZGRpbmcgYSBkZXBlbmRlbmN5IG9uCitgZ3Rlc3QudmNwcm9qYCkuCisKK0lmIHlvdSBzdGlsbCBoYXZlIHF1ZXN0aW9ucywgdGFrZSBhIGxvb2sgYXQgaG93IEdvb2dsZSBUZXN0J3Mgb3duCit0ZXN0cyBhcmUgYnVpbHQgYW5kIHVzZSB0aGVtIGFzIGV4YW1wbGVzLgorCisjIEJhc2ljIENvbmNlcHRzICMKKworV2hlbiB1c2luZyBHb29nbGUgVGVzdCwgeW91IHN0YXJ0IGJ5IHdyaXRpbmcgX2Fzc2VydGlvbnNfLCB3aGljaCBhcmUgc3RhdGVtZW50cwordGhhdCBjaGVjayB3aGV0aGVyIGEgY29uZGl0aW9uIGlzIHRydWUuIEFuIGFzc2VydGlvbidzIHJlc3VsdCBjYW4gYmUgX3N1Y2Nlc3NfLAorX25vbmZhdGFsIGZhaWx1cmVfLCBvciBfZmF0YWwgZmFpbHVyZV8uIElmIGEgZmF0YWwgZmFpbHVyZSBvY2N1cnMsIGl0IGFib3J0cwordGhlIGN1cnJlbnQgZnVuY3Rpb247IG90aGVyd2lzZSB0aGUgcHJvZ3JhbSBjb250aW51ZXMgbm9ybWFsbHkuCisKK19UZXN0c18gdXNlIGFzc2VydGlvbnMgdG8gdmVyaWZ5IHRoZSB0ZXN0ZWQgY29kZSdzIGJlaGF2aW9yLiBJZiBhIHRlc3QgY3Jhc2hlcworb3IgaGFzIGEgZmFpbGVkIGFzc2VydGlvbiwgdGhlbiBpdCBfZmFpbHNfOyBvdGhlcndpc2UgaXQgX3N1Y2NlZWRzXy4KKworQSBfdGVzdCBjYXNlXyBjb250YWlucyBvbmUgb3IgbWFueSB0ZXN0cy4gWW91IHNob3VsZCBncm91cCB5b3VyIHRlc3RzIGludG8gdGVzdAorY2FzZXMgdGhhdCByZWZsZWN0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHRlc3RlZCBjb2RlLiBXaGVuIG11bHRpcGxlIHRlc3RzIGluIGEKK3Rlc3QgY2FzZSBuZWVkIHRvIHNoYXJlIGNvbW1vbiBvYmplY3RzIGFuZCBzdWJyb3V0aW5lcywgeW91IGNhbiBwdXQgdGhlbSBpbnRvIGEKK190ZXN0IGZpeHR1cmVfIGNsYXNzLgorCitBIF90ZXN0IHByb2dyYW1fIGNhbiBjb250YWluIG11bHRpcGxlIHRlc3QgY2FzZXMuCisKK1dlJ2xsIG5vdyBleHBsYWluIGhvdyB0byB3cml0ZSBhIHRlc3QgcHJvZ3JhbSwgc3RhcnRpbmcgYXQgdGhlIGluZGl2aWR1YWwKK2Fzc2VydGlvbiBsZXZlbCBhbmQgYnVpbGRpbmcgdXAgdG8gdGVzdHMgYW5kIHRlc3QgY2FzZXMuCisKKyMgQXNzZXJ0aW9ucyAjCisKK0dvb2dsZSBUZXN0IGFzc2VydGlvbnMgYXJlIG1hY3JvcyB0aGF0IHJlc2VtYmxlIGZ1bmN0aW9uIGNhbGxzLiBZb3UgdGVzdCBhCitjbGFzcyBvciBmdW5jdGlvbiBieSBtYWtpbmcgYXNzZXJ0aW9ucyBhYm91dCBpdHMgYmVoYXZpb3IuIFdoZW4gYW4gYXNzZXJ0aW9uCitmYWlscywgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSBhc3NlcnRpb24ncyBzb3VyY2UgZmlsZSBhbmQgbGluZSBudW1iZXIgbG9jYXRpb24sCithbG9uZyB3aXRoIGEgZmFpbHVyZSBtZXNzYWdlLiBZb3UgbWF5IGFsc28gc3VwcGx5IGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZQord2hpY2ggd2lsbCBiZSBhcHBlbmRlZCB0byBHb29nbGUgVGVzdCdzIG1lc3NhZ2UuCisKK1RoZSBhc3NlcnRpb25zIGNvbWUgaW4gcGFpcnMgdGhhdCB0ZXN0IHRoZSBzYW1lIHRoaW5nIGJ1dCBoYXZlIGRpZmZlcmVudAorZWZmZWN0cyBvbiB0aGUgY3VycmVudCBmdW5jdGlvbi4gYEFTU0VSVF8qYCB2ZXJzaW9ucyBnZW5lcmF0ZSBmYXRhbCBmYWlsdXJlcword2hlbiB0aGV5IGZhaWwsIGFuZCAqKmFib3J0IHRoZSBjdXJyZW50IGZ1bmN0aW9uKiouIGBFWFBFQ1RfKmAgdmVyc2lvbnMgZ2VuZXJhdGUKK25vbmZhdGFsIGZhaWx1cmVzLCB3aGljaCBkb24ndCBhYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbi4gVXN1YWxseSBgRVhQRUNUXypgCithcmUgcHJlZmVycmVkLCBhcyB0aGV5IGFsbG93IG1vcmUgdGhhbiBvbmUgZmFpbHVyZXMgdG8gYmUgcmVwb3J0ZWQgaW4gYSB0ZXN0LgorSG93ZXZlciwgeW91IHNob3VsZCB1c2UgYEFTU0VSVF8qYCBpZiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY29udGludWUgd2hlbgordGhlIGFzc2VydGlvbiBpbiBxdWVzdGlvbiBmYWlscy4KKworU2luY2UgYSBmYWlsZWQgYEFTU0VSVF8qYCByZXR1cm5zIGZyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24gaW1tZWRpYXRlbHksCitwb3NzaWJseSBza2lwcGluZyBjbGVhbi11cCBjb2RlIHRoYXQgY29tZXMgYWZ0ZXIgaXQsIGl0IG1heSBjYXVzZSBhIHNwYWNlIGxlYWsuCitEZXBlbmRpbmcgb24gdGhlIG5hdHVyZSBvZiB0aGUgbGVhaywgaXQgbWF5IG9yIG1heSBub3QgYmUgd29ydGggZml4aW5nIC0gc28KK2tlZXAgdGhpcyBpbiBtaW5kIGlmIHlvdSBnZXQgYSBoZWFwIGNoZWNrZXIgZXJyb3IgaW4gYWRkaXRpb24gdG8gYXNzZXJ0aW9uCitlcnJvcnMuCisKK1RvIHByb3ZpZGUgYSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlLCBzaW1wbHkgc3RyZWFtIGl0IGludG8gdGhlIG1hY3JvIHVzaW5nIHRoZQorYDw8YCBvcGVyYXRvciwgb3IgYSBzZXF1ZW5jZSBvZiBzdWNoIG9wZXJhdG9ycy4gQW4gZXhhbXBsZToKK2BgYAorQVNTRVJUX0VRKHguc2l6ZSgpLCB5LnNpemUoKSkgPDwgIlZlY3RvcnMgeCBhbmQgeSBhcmUgb2YgdW5lcXVhbCBsZW5ndGgiOworCitmb3IgKGludCBpID0gMDsgaSA8IHguc2l6ZSgpOyArK2kpIHsKKyAgRVhQRUNUX0VRKHhbaV0sIHlbaV0pIDw8ICJWZWN0b3JzIHggYW5kIHkgZGlmZmVyIGF0IGluZGV4ICIgPDwgaTsKK30KK2BgYAorCitBbnl0aGluZyB0aGF0IGNhbiBiZSBzdHJlYW1lZCB0byBhbiBgb3N0cmVhbWAgY2FuIGJlIHN0cmVhbWVkIHRvIGFuIGFzc2VydGlvbgorbWFjcm8tLWluIHBhcnRpY3VsYXIsIEMgc3RyaW5ncyBhbmQgYHN0cmluZ2Agb2JqZWN0cy4gSWYgYSB3aWRlIHN0cmluZworKGB3Y2hhcl90KmAsIGBUQ0hBUipgIGluIGBVTklDT0RFYCBtb2RlIG9uIFdpbmRvd3MsIG9yIGBzdGQ6OndzdHJpbmdgKSBpcworc3RyZWFtZWQgdG8gYW4gYXNzZXJ0aW9uLCBpdCB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gVVRGLTggd2hlbiBwcmludGVkLgorCisjIyBCYXNpYyBBc3NlcnRpb25zICMjCisKK1RoZXNlIGFzc2VydGlvbnMgZG8gYmFzaWMgdHJ1ZS9mYWxzZSBjb25kaXRpb24gdGVzdGluZy4KK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfVFJVRShgX2NvbmRpdGlvbl9gKWA7ICB8IGBFWFBFQ1RfVFJVRShgX2NvbmRpdGlvbl9gKWA7ICAgfCBfY29uZGl0aW9uXyBpcyB0cnVlIHwKK3wgYEFTU0VSVF9GQUxTRShgX2NvbmRpdGlvbl9gKWA7IHwgYEVYUEVDVF9GQUxTRShgX2NvbmRpdGlvbl9gKWA7ICB8IF9jb25kaXRpb25fIGlzIGZhbHNlIHwKKworUmVtZW1iZXIsIHdoZW4gdGhleSBmYWlsLCBgQVNTRVJUXypgIHlpZWxkcyBhIGZhdGFsIGZhaWx1cmUgYW5kCityZXR1cm5zIGZyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24sIHdoaWxlIGBFWFBFQ1RfKmAgeWllbGRzIGEgbm9uZmF0YWwKK2ZhaWx1cmUsIGFsbG93aW5nIHRoZSBmdW5jdGlvbiB0byBjb250aW51ZSBydW5uaW5nLiBJbiBlaXRoZXIgY2FzZSwgYW4KK2Fzc2VydGlvbiBmYWlsdXJlIG1lYW5zIGl0cyBjb250YWluaW5nIHRlc3QgZmFpbHMuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBCaW5hcnkgQ29tcGFyaXNvbiAjIworCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGFzc2VydGlvbnMgdGhhdCBjb21wYXJlIHR3byB2YWx1ZXMuCisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8YEFTU0VSVF9FUShgX2V4cGVjdGVkX2AsIGBfYWN0dWFsX2ApO2B8YEVYUEVDVF9FUShgX2V4cGVjdGVkX2AsIGBfYWN0dWFsX2ApO2B8IF9leHBlY3RlZF8gYD09YCBfYWN0dWFsXyB8Cit8YEFTU0VSVF9ORShgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8YEVYUEVDVF9ORShgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8IF92YWwxXyBgIT1gIF92YWwyXyB8Cit8YEFTU0VSVF9MVChgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8YEVYUEVDVF9MVChgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8IF92YWwxXyBgPGAgX3ZhbDJfIHwKK3xgQVNTRVJUX0xFKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHxgRVhQRUNUX0xFKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHwgX3ZhbDFfIGA8PWAgX3ZhbDJfIHwKK3xgQVNTRVJUX0dUKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHxgRVhQRUNUX0dUKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHwgX3ZhbDFfIGA+YCBfdmFsMl8gfAorfGBBU1NFUlRfR0UoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfGBFWFBFQ1RfR0UoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfCBfdmFsMV8gYD49YCBfdmFsMl8gfAorCitJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlLCBHb29nbGUgVGVzdCBwcmludHMgYm90aCBfdmFsMV8gYW5kIF92YWwyXworLiBJbiBgQVNTRVJUX0VRKmAgYW5kIGBFWFBFQ1RfRVEqYCAoYW5kIGFsbCBvdGhlciBlcXVhbGl0eSBhc3NlcnRpb25zCit3ZSdsbCBpbnRyb2R1Y2UgbGF0ZXIpLCB5b3Ugc2hvdWxkIHB1dCB0aGUgZXhwcmVzc2lvbiB5b3Ugd2FudCB0byB0ZXN0CitpbiB0aGUgcG9zaXRpb24gb2YgX2FjdHVhbF8sIGFuZCBwdXQgaXRzIGV4cGVjdGVkIHZhbHVlIGluIF9leHBlY3RlZF8sCithcyBHb29nbGUgVGVzdCdzIGZhaWx1cmUgbWVzc2FnZXMgYXJlIG9wdGltaXplZCBmb3IgdGhpcyBjb252ZW50aW9uLgorCitWYWx1ZSBhcmd1bWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIGJ5IHRoZSBhc3NlcnRpb24ncyBjb21wYXJpc29uCitvcGVyYXRvciBvciB5b3UnbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IuICBXZSB1c2VkIHRvIHJlcXVpcmUgdGhlCithcmd1bWVudHMgdG8gc3VwcG9ydCB0aGUgYDw8YCBvcGVyYXRvciBmb3Igc3RyZWFtaW5nIHRvIGFuIGBvc3RyZWFtYCwKK2J1dCBpdCdzIG5vIGxvbmdlciBuZWNlc3Nhcnkgc2luY2UgdjEuNi4wIChpZiBgPDxgIGlzIHN1cHBvcnRlZCwgaXQKK3dpbGwgYmUgY2FsbGVkIHRvIHByaW50IHRoZSBhcmd1bWVudHMgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzOworb3RoZXJ3aXNlIEdvb2dsZSBUZXN0IHdpbGwgYXR0ZW1wdCB0byBwcmludCB0aGVtIGluIHRoZSBiZXN0IHdheSBpdAorY2FuLiBGb3IgbW9yZSBkZXRhaWxzIGFuZCBob3cgdG8gY3VzdG9taXplIHRoZSBwcmludGluZyBvZiB0aGUKK2FyZ3VtZW50cywgc2VlIHRoaXMgR29vZ2xlIE1vY2sgW3JlY2lwZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNUZWFjaGluZ19Hb29nbGVfTW9ja19Ib3dfdG9fUHJpbnRfWW91cl9WYWx1ZXMpLikuCisKK1RoZXNlIGFzc2VydGlvbnMgY2FuIHdvcmsgd2l0aCBhIHVzZXItZGVmaW5lZCB0eXBlLCBidXQgb25seSBpZiB5b3UgZGVmaW5lIHRoZQorY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9wZXJhdG9yIChlLmcuIGA9PWAsIGA8YCwgZXRjKS4gIElmIHRoZSBjb3JyZXNwb25kaW5nCitvcGVyYXRvciBpcyBkZWZpbmVkLCBwcmVmZXIgdXNpbmcgdGhlIGBBU1NFUlRfKigpYCBtYWNyb3MgYmVjYXVzZSB0aGV5IHdpbGwKK3ByaW50IG91dCBub3Qgb25seSB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLCBidXQgdGhlIHR3byBvcGVyYW5kcyBhcyB3ZWxsLgorCitBcmd1bWVudHMgYXJlIGFsd2F5cyBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiBUaGVyZWZvcmUsIGl0J3MgT0sgZm9yIHRoZQorYXJndW1lbnRzIHRvIGhhdmUgc2lkZSBlZmZlY3RzLiBIb3dldmVyLCBhcyB3aXRoIGFueSBvcmRpbmFyeSBDL0MrKyBmdW5jdGlvbiwKK3RoZSBhcmd1bWVudHMnIGV2YWx1YXRpb24gb3JkZXIgaXMgdW5kZWZpbmVkIChpLmUuIHRoZSBjb21waWxlciBpcyBmcmVlIHRvCitjaG9vc2UgYW55IG9yZGVyKSBhbmQgeW91ciBjb2RlIHNob3VsZCBub3QgZGVwZW5kIG9uIGFueSBwYXJ0aWN1bGFyIGFyZ3VtZW50CitldmFsdWF0aW9uIG9yZGVyLgorCitgQVNTRVJUX0VRKClgIGRvZXMgcG9pbnRlciBlcXVhbGl0eSBvbiBwb2ludGVycy4gSWYgdXNlZCBvbiB0d28gQyBzdHJpbmdzLCBpdAordGVzdHMgaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbWVtb3J5IGxvY2F0aW9uLCBub3QgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlLgorVGhlcmVmb3JlLCBpZiB5b3Ugd2FudCB0byBjb21wYXJlIEMgc3RyaW5ncyAoZS5nLiBgY29uc3QgY2hhcipgKSBieSB2YWx1ZSwgdXNlCitgQVNTRVJUX1NUUkVRKClgICwgd2hpY2ggd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIgb24uIEluIHBhcnRpY3VsYXIsIHRvIGFzc2VydAordGhhdCBhIEMgc3RyaW5nIGlzIGBOVUxMYCwgdXNlIGBBU1NFUlRfU1RSRVEoTlVMTCwgY19zdHJpbmcpYCAuIEhvd2V2ZXIsIHRvCitjb21wYXJlIHR3byBgc3RyaW5nYCBvYmplY3RzLCB5b3Ugc2hvdWxkIHVzZSBgQVNTRVJUX0VRYC4KKworTWFjcm9zIGluIHRoaXMgc2VjdGlvbiB3b3JrIHdpdGggYm90aCBuYXJyb3cgYW5kIHdpZGUgc3RyaW5nIG9iamVjdHMgKGBzdHJpbmdgCithbmQgYHdzdHJpbmdgKS4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIFN0cmluZyBDb21wYXJpc29uICMjCisKK1RoZSBhc3NlcnRpb25zIGluIHRoaXMgZ3JvdXAgY29tcGFyZSB0d28gKipDIHN0cmluZ3MqKi4gSWYgeW91IHdhbnQgdG8gY29tcGFyZQordHdvIGBzdHJpbmdgIG9iamVjdHMsIHVzZSBgRVhQRUNUX0VRYCwgYEVYUEVDVF9ORWAsIGFuZCBldGMgaW5zdGVhZC4KKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9TVFJFUShgX2V4cGVjdGVkXF9zdHJfYCwgYF9hY3R1YWxcX3N0cl9gKTtgICAgIHwgYEVYUEVDVF9TVFJFUShgX2V4cGVjdGVkXF9zdHJfYCwgYF9hY3R1YWxcX3N0cl9gKTtgICAgICB8IHRoZSB0d28gQyBzdHJpbmdzIGhhdmUgdGhlIHNhbWUgY29udGVudCB8Cit8IGBBU1NFUlRfU1RSTkUoYF9zdHIxX2AsIGBfc3RyMl9gKTtgICAgIHwgYEVYUEVDVF9TVFJORShgX3N0cjFfYCwgYF9zdHIyX2ApO2AgICAgIHwgdGhlIHR3byBDIHN0cmluZ3MgaGF2ZSBkaWZmZXJlbnQgY29udGVudCB8Cit8IGBBU1NFUlRfU1RSQ0FTRUVRKGBfZXhwZWN0ZWRcX3N0cl9gLCBgX2FjdHVhbFxfc3RyX2ApO2B8IGBFWFBFQ1RfU1RSQ0FTRUVRKGBfZXhwZWN0ZWRcX3N0cl9gLCBgX2FjdHVhbFxfc3RyX2ApO2AgfCB0aGUgdHdvIEMgc3RyaW5ncyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQsIGlnbm9yaW5nIGNhc2UgfAorfCBgQVNTRVJUX1NUUkNBU0VORShgX3N0cjFfYCwgYF9zdHIyX2ApO2B8IGBFWFBFQ1RfU1RSQ0FTRU5FKGBfc3RyMV9gLCBgX3N0cjJfYCk7YCB8IHRoZSB0d28gQyBzdHJpbmdzIGhhdmUgZGlmZmVyZW50IGNvbnRlbnQsIGlnbm9yaW5nIGNhc2UgfAorCitOb3RlIHRoYXQgIkNBU0UiIGluIGFuIGFzc2VydGlvbiBuYW1lIG1lYW5zIHRoYXQgY2FzZSBpcyBpZ25vcmVkLgorCitgKlNUUkVRKmAgYW5kIGAqU1RSTkUqYCBhbHNvIGFjY2VwdCB3aWRlIEMgc3RyaW5ncyAoYHdjaGFyX3QqYCkuIElmIGEKK2NvbXBhcmlzb24gb2YgdHdvIHdpZGUgc3RyaW5ncyBmYWlscywgdGhlaXIgdmFsdWVzIHdpbGwgYmUgcHJpbnRlZCBhcyBVVEYtOAorbmFycm93IHN0cmluZ3MuCisKK0EgYE5VTExgIHBvaW50ZXIgYW5kIGFuIGVtcHR5IHN0cmluZyBhcmUgY29uc2lkZXJlZCBfZGlmZmVyZW50Xy4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKK1NlZSBhbHNvOiBGb3IgbW9yZSBzdHJpbmcgY29tcGFyaXNvbiB0cmlja3MgKHN1YnN0cmluZywgcHJlZml4LCBzdWZmaXgsIGFuZAorcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nLCBmb3IgZXhhbXBsZSksIHNlZSB0aGUgW0FkdmFuY2VkIEdvb2dsZSBUZXN0IEd1aWRlXShBZHZhbmNlZEd1aWRlLm1kKS4KKworIyBTaW1wbGUgVGVzdHMgIworCitUbyBjcmVhdGUgYSB0ZXN0OgorICAxLiBVc2UgdGhlIGBURVNUKClgIG1hY3JvIHRvIGRlZmluZSBhbmQgbmFtZSBhIHRlc3QgZnVuY3Rpb24sIFRoZXNlIGFyZSBvcmRpbmFyeSBDKysgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgcmV0dXJuIGEgdmFsdWUuCisgIDEuIEluIHRoaXMgZnVuY3Rpb24sIGFsb25nIHdpdGggYW55IHZhbGlkIEMrKyBzdGF0ZW1lbnRzIHlvdSB3YW50IHRvIGluY2x1ZGUsIHVzZSB0aGUgdmFyaW91cyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIHRvIGNoZWNrIHZhbHVlcy4KKyAgMS4gVGhlIHRlc3QncyByZXN1bHQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNzZXJ0aW9uczsgaWYgYW55IGFzc2VydGlvbiBpbiB0aGUgdGVzdCBmYWlscyAoZWl0aGVyIGZhdGFsbHkgb3Igbm9uLWZhdGFsbHkpLCBvciBpZiB0aGUgdGVzdCBjcmFzaGVzLCB0aGUgZW50aXJlIHRlc3QgZmFpbHMuIE90aGVyd2lzZSwgaXQgc3VjY2VlZHMuCisKK2BgYAorVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSB7CisgLi4uIHRlc3QgYm9keSAuLi4KK30KK2BgYAorCisKK2BURVNUKClgIGFyZ3VtZW50cyBnbyBmcm9tIGdlbmVyYWwgdG8gc3BlY2lmaWMuIFRoZSBfZmlyc3RfIGFyZ3VtZW50IGlzIHRoZQorbmFtZSBvZiB0aGUgdGVzdCBjYXNlLCBhbmQgdGhlIF9zZWNvbmRfIGFyZ3VtZW50IGlzIHRoZSB0ZXN0J3MgbmFtZSB3aXRoaW4gdGhlCit0ZXN0IGNhc2UuIEJvdGggbmFtZXMgbXVzdCBiZSB2YWxpZCBDKysgaWRlbnRpZmllcnMsIGFuZCB0aGV5IHNob3VsZCBub3QgY29udGFpbiB1bmRlcnNjb3JlIChgX2ApLiBBIHRlc3QncyBfZnVsbCBuYW1lXyBjb25zaXN0cyBvZiBpdHMgY29udGFpbmluZyB0ZXN0IGNhc2UgYW5kIGl0cworaW5kaXZpZHVhbCBuYW1lLiBUZXN0cyBmcm9tIGRpZmZlcmVudCB0ZXN0IGNhc2VzIGNhbiBoYXZlIHRoZSBzYW1lIGluZGl2aWR1YWwKK25hbWUuCisKK0ZvciBleGFtcGxlLCBsZXQncyB0YWtlIGEgc2ltcGxlIGludGVnZXIgZnVuY3Rpb246CitgYGAKK2ludCBGYWN0b3JpYWwoaW50IG4pOyAvLyBSZXR1cm5zIHRoZSBmYWN0b3JpYWwgb2YgbgorYGBgCisKK0EgdGVzdCBjYXNlIGZvciB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGxvb2sgbGlrZToKK2BgYAorLy8gVGVzdHMgZmFjdG9yaWFsIG9mIDAuCitURVNUKEZhY3RvcmlhbFRlc3QsIEhhbmRsZXNaZXJvSW5wdXQpIHsKKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgwKSk7Cit9CisKKy8vIFRlc3RzIGZhY3RvcmlhbCBvZiBwb3NpdGl2ZSBudW1iZXJzLgorVEVTVChGYWN0b3JpYWxUZXN0LCBIYW5kbGVzUG9zaXRpdmVJbnB1dCkgeworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDEpKTsKKyAgRVhQRUNUX0VRKDIsIEZhY3RvcmlhbCgyKSk7CisgIEVYUEVDVF9FUSg2LCBGYWN0b3JpYWwoMykpOworICBFWFBFQ1RfRVEoNDAzMjAsIEZhY3RvcmlhbCg4KSk7Cit9CitgYGAKKworR29vZ2xlIFRlc3QgZ3JvdXBzIHRoZSB0ZXN0IHJlc3VsdHMgYnkgdGVzdCBjYXNlcywgc28gbG9naWNhbGx5LXJlbGF0ZWQgdGVzdHMKK3Nob3VsZCBiZSBpbiB0aGUgc2FtZSB0ZXN0IGNhc2U7IGluIG90aGVyIHdvcmRzLCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlaXIKK2BURVNUKClgIHNob3VsZCBiZSB0aGUgc2FtZS4gSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHdlIGhhdmUgdHdvIHRlc3RzLAorYEhhbmRsZXNaZXJvSW5wdXRgIGFuZCBgSGFuZGxlc1Bvc2l0aXZlSW5wdXRgLCB0aGF0IGJlbG9uZyB0byB0aGUgc2FtZSB0ZXN0CitjYXNlIGBGYWN0b3JpYWxUZXN0YC4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMgVGVzdCBGaXh0dXJlczogVXNpbmcgdGhlIFNhbWUgRGF0YSBDb25maWd1cmF0aW9uIGZvciBNdWx0aXBsZSBUZXN0cyAjCisKK0lmIHlvdSBmaW5kIHlvdXJzZWxmIHdyaXRpbmcgdHdvIG9yIG1vcmUgdGVzdHMgdGhhdCBvcGVyYXRlIG9uIHNpbWlsYXIgZGF0YSwKK3lvdSBjYW4gdXNlIGEgX3Rlc3QgZml4dHVyZV8uIEl0IGFsbG93cyB5b3UgdG8gcmV1c2UgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBvZgorb2JqZWN0cyBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgdGVzdHMuCisKK1RvIGNyZWF0ZSBhIGZpeHR1cmUsIGp1c3Q6CisgIDEuIERlcml2ZSBhIGNsYXNzIGZyb20gYDo6dGVzdGluZzo6VGVzdGAgLiBTdGFydCBpdHMgYm9keSB3aXRoIGBwcm90ZWN0ZWQ6YCBvciBgcHVibGljOmAgYXMgd2UnbGwgd2FudCB0byBhY2Nlc3MgZml4dHVyZSBtZW1iZXJzIGZyb20gc3ViLWNsYXNzZXMuCisgIDEuIEluc2lkZSB0aGUgY2xhc3MsIGRlY2xhcmUgYW55IG9iamVjdHMgeW91IHBsYW4gdG8gdXNlLgorICAxLiBJZiBuZWNlc3NhcnksIHdyaXRlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciBvciBgU2V0VXAoKWAgZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgb2JqZWN0cyBmb3IgZWFjaCB0ZXN0LiBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHNwZWxsIGBTZXRVcCgpYCBhcyBgU2V0dXAoKWAgd2l0aCBhIHNtYWxsIGB1YCAtIGRvbid0IGxldCB0aGF0IGhhcHBlbiB0byB5b3UuCisgIDEuIElmIG5lY2Vzc2FyeSwgd3JpdGUgYSBkZXN0cnVjdG9yIG9yIGBUZWFyRG93bigpYCBmdW5jdGlvbiB0byByZWxlYXNlIGFueSByZXNvdXJjZXMgeW91IGFsbG9jYXRlZCBpbiBgU2V0VXAoKWAgLiBUbyBsZWFybiB3aGVuIHlvdSBzaG91bGQgdXNlIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGFuZCB3aGVuIHlvdSBzaG91bGQgdXNlIGBTZXRVcCgpL1RlYXJEb3duKClgLCByZWFkIHRoaXMgW0ZBUSBlbnRyeV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9GQVEjU2hvdWxkX0lfdXNlX3RoZV9jb25zdHJ1Y3Rvci9kZXN0cnVjdG9yX29mX3RoZV90ZXN0X2ZpeHR1cmVfb3JfdCkuCisgIDEuIElmIG5lZWRlZCwgZGVmaW5lIHN1YnJvdXRpbmVzIGZvciB5b3VyIHRlc3RzIHRvIHNoYXJlLgorCitXaGVuIHVzaW5nIGEgZml4dHVyZSwgdXNlIGBURVNUX0YoKWAgaW5zdGVhZCBvZiBgVEVTVCgpYCBhcyBpdCBhbGxvd3MgeW91IHRvCithY2Nlc3Mgb2JqZWN0cyBhbmQgc3Vicm91dGluZXMgaW4gdGhlIHRlc3QgZml4dHVyZToKK2BgYAorVEVTVF9GKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIHsKKyAuLi4gdGVzdCBib2R5IC4uLgorfQorYGBgCisKK0xpa2UgYFRFU1QoKWAsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgdGVzdCBjYXNlIG5hbWUsIGJ1dCBmb3IgYFRFU1RfRigpYAordGhpcyBtdXN0IGJlIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MuIFlvdSd2ZSBwcm9iYWJseSBndWVzc2VkOiBgX0ZgCitpcyBmb3IgZml4dHVyZS4KKworVW5mb3J0dW5hdGVseSwgdGhlIEMrKyBtYWNybyBzeXN0ZW0gZG9lcyBub3QgYWxsb3cgdXMgdG8gY3JlYXRlIGEgc2luZ2xlIG1hY3JvCit0aGF0IGNhbiBoYW5kbGUgYm90aCB0eXBlcyBvZiB0ZXN0cy4gVXNpbmcgdGhlIHdyb25nIG1hY3JvIGNhdXNlcyBhIGNvbXBpbGVyCitlcnJvci4KKworQWxzbywgeW91IG11c3QgZmlyc3QgZGVmaW5lIGEgdGVzdCBmaXh0dXJlIGNsYXNzIGJlZm9yZSB1c2luZyBpdCBpbiBhCitgVEVTVF9GKClgLCBvciB5b3UnbGwgZ2V0IHRoZSBjb21waWxlciBlcnJvciAiYHZpcnR1YWwgb3V0c2lkZSBjbGFzcworZGVjbGFyYXRpb25gIi4KKworRm9yIGVhY2ggdGVzdCBkZWZpbmVkIHdpdGggYFRFU1RfRigpYCwgR29vZ2xlIFRlc3Qgd2lsbDoKKyAgMS4gQ3JlYXRlIGEgX2ZyZXNoXyB0ZXN0IGZpeHR1cmUgYXQgcnVudGltZQorICAxLiBJbW1lZGlhdGVseSBpbml0aWFsaXplIGl0IHZpYSBgU2V0VXAoKWAgLAorICAxLiBSdW4gdGhlIHRlc3QKKyAgMS4gQ2xlYW4gdXAgYnkgY2FsbGluZyBgVGVhckRvd24oKWAKKyAgMS4gRGVsZXRlIHRoZSB0ZXN0IGZpeHR1cmUuICBOb3RlIHRoYXQgZGlmZmVyZW50IHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBoYXZlIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgb2JqZWN0cywgYW5kIEdvb2dsZSBUZXN0IGFsd2F5cyBkZWxldGVzIGEgdGVzdCBmaXh0dXJlIGJlZm9yZSBpdCBjcmVhdGVzIHRoZSBuZXh0IG9uZS4gR29vZ2xlIFRlc3QgZG9lcyBub3QgcmV1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlIGZvciBtdWx0aXBsZSB0ZXN0cy4gQW55IGNoYW5nZXMgb25lIHRlc3QgbWFrZXMgdG8gdGhlIGZpeHR1cmUgZG8gbm90IGFmZmVjdCBvdGhlciB0ZXN0cy4KKworQXMgYW4gZXhhbXBsZSwgbGV0J3Mgd3JpdGUgdGVzdHMgZm9yIGEgRklGTyBxdWV1ZSBjbGFzcyBuYW1lZCBgUXVldWVgLCB3aGljaAoraGFzIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgorYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4gLy8gRSBpcyB0aGUgZWxlbWVudCB0eXBlLgorY2xhc3MgUXVldWUgeworIHB1YmxpYzoKKyAgUXVldWUoKTsKKyAgdm9pZCBFbnF1ZXVlKGNvbnN0IEUmIGVsZW1lbnQpOworICBFKiBEZXF1ZXVlKCk7IC8vIFJldHVybnMgTlVMTCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgIC4uLgorfTsKK2BgYAorCitGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcy4gQnkgY29udmVudGlvbiwgeW91IHNob3VsZCBnaXZlIGl0IHRoZSBuYW1lCitgRm9vVGVzdGAgd2hlcmUgYEZvb2AgaXMgdGhlIGNsYXNzIGJlaW5nIHRlc3RlZC4KK2BgYAorY2xhc3MgUXVldWVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcTFfLkVucXVldWUoMSk7CisgICAgcTJfLkVucXVldWUoMik7CisgICAgcTJfLkVucXVldWUoMyk7CisgIH0KKworICAvLyB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQorCisgIFF1ZXVlPGludD4gcTBfOworICBRdWV1ZTxpbnQ+IHExXzsKKyAgUXVldWU8aW50PiBxMl87Cit9OworYGBgCisKK0luIHRoaXMgY2FzZSwgYFRlYXJEb3duKClgIGlzIG5vdCBuZWVkZWQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0byBjbGVhbiB1cCBhZnRlcgorZWFjaCB0ZXN0LCBvdGhlciB0aGFuIHdoYXQncyBhbHJlYWR5IGRvbmUgYnkgdGhlIGRlc3RydWN0b3IuCisKK05vdyB3ZSdsbCB3cml0ZSB0ZXN0cyB1c2luZyBgVEVTVF9GKClgIGFuZCB0aGlzIGZpeHR1cmUuCitgYGAKK1RFU1RfRihRdWV1ZVRlc3QsIElzRW1wdHlJbml0aWFsbHkpIHsKKyAgRVhQRUNUX0VRKDAsIHEwXy5zaXplKCkpOworfQorCitURVNUX0YoUXVldWVUZXN0LCBEZXF1ZXVlV29ya3MpIHsKKyAgaW50KiBuID0gcTBfLkRlcXVldWUoKTsKKyAgRVhQRUNUX0VRKE5VTEwsIG4pOworCisgIG4gPSBxMV8uRGVxdWV1ZSgpOworICBBU1NFUlRfVFJVRShuICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMSwgKm4pOworICBFWFBFQ1RfRVEoMCwgcTFfLnNpemUoKSk7CisgIGRlbGV0ZSBuOworCisgIG4gPSBxMl8uRGVxdWV1ZSgpOworICBBU1NFUlRfVFJVRShuICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMiwgKm4pOworICBFWFBFQ1RfRVEoMSwgcTJfLnNpemUoKSk7CisgIGRlbGV0ZSBuOworfQorYGBgCisKK1RoZSBhYm92ZSB1c2VzIGJvdGggYEFTU0VSVF8qYCBhbmQgYEVYUEVDVF8qYCBhc3NlcnRpb25zLiBUaGUgcnVsZSBvZiB0aHVtYiBpcwordG8gdXNlIGBFWFBFQ1RfKmAgd2hlbiB5b3Ugd2FudCB0aGUgdGVzdCB0byBjb250aW51ZSB0byByZXZlYWwgbW9yZSBlcnJvcnMKK2FmdGVyIHRoZSBhc3NlcnRpb24gZmFpbHVyZSwgYW5kIHVzZSBgQVNTRVJUXypgIHdoZW4gY29udGludWluZyBhZnRlciBmYWlsdXJlCitkb2Vzbid0IG1ha2Ugc2Vuc2UuIEZvciBleGFtcGxlLCB0aGUgc2Vjb25kIGFzc2VydGlvbiBpbiB0aGUgYERlcXVldWVgIHRlc3QgaXMKK2BBU1NFUlRfVFJVRShuICE9IE5VTEwpYCwgYXMgd2UgbmVlZCB0byBkZXJlZmVyZW5jZSB0aGUgcG9pbnRlciBgbmAgbGF0ZXIsCit3aGljaCB3b3VsZCBsZWFkIHRvIGEgc2VnZmF1bHQgd2hlbiBgbmAgaXMgYE5VTExgLgorCitXaGVuIHRoZXNlIHRlc3RzIHJ1biwgdGhlIGZvbGxvd2luZyBoYXBwZW5zOgorICAxLiBHb29nbGUgVGVzdCBjb25zdHJ1Y3RzIGEgYFF1ZXVlVGVzdGAgb2JqZWN0IChsZXQncyBjYWxsIGl0IGB0MWAgKS4KKyAgMS4gYHQxLlNldFVwKClgIGluaXRpYWxpemVzIGB0MWAgLgorICAxLiBUaGUgZmlyc3QgdGVzdCAoIGBJc0VtcHR5SW5pdGlhbGx5YCApIHJ1bnMgb24gYHQxYCAuCisgIDEuIGB0MS5UZWFyRG93bigpYCBjbGVhbnMgdXAgYWZ0ZXIgdGhlIHRlc3QgZmluaXNoZXMuCisgIDEuIGB0MWAgaXMgZGVzdHJ1Y3RlZC4KKyAgMS4gVGhlIGFib3ZlIHN0ZXBzIGFyZSByZXBlYXRlZCBvbiBhbm90aGVyIGBRdWV1ZVRlc3RgIG9iamVjdCwgdGhpcyB0aW1lIHJ1bm5pbmcgdGhlIGBEZXF1ZXVlV29ya3NgIHRlc3QuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCitfTm90ZV86IEdvb2dsZSBUZXN0IGF1dG9tYXRpY2FsbHkgc2F2ZXMgYWxsIF9Hb29nbGUgVGVzdF8gZmxhZ3Mgd2hlbiBhIHRlc3QKK29iamVjdCBpcyBjb25zdHJ1Y3RlZCwgYW5kIHJlc3RvcmVzIHRoZW0gd2hlbiBpdCBpcyBkZXN0cnVjdGVkLgorCisjIEludm9raW5nIHRoZSBUZXN0cyAjCisKK2BURVNUKClgIGFuZCBgVEVTVF9GKClgIGltcGxpY2l0bHkgcmVnaXN0ZXIgdGhlaXIgdGVzdHMgd2l0aCBHb29nbGUgVGVzdC4gU28sIHVubGlrZSB3aXRoIG1hbnkgb3RoZXIgQysrIHRlc3RpbmcgZnJhbWV3b3JrcywgeW91IGRvbid0IGhhdmUgdG8gcmUtbGlzdCBhbGwgeW91ciBkZWZpbmVkIHRlc3RzIGluIG9yZGVyIHRvIHJ1biB0aGVtLgorCitBZnRlciBkZWZpbmluZyB5b3VyIHRlc3RzLCB5b3UgY2FuIHJ1biB0aGVtIHdpdGggYFJVTl9BTExfVEVTVFMoKWAgLCB3aGljaCByZXR1cm5zIGAwYCBpZiBhbGwgdGhlIHRlc3RzIGFyZSBzdWNjZXNzZnVsLCBvciBgMWAgb3RoZXJ3aXNlLiBOb3RlIHRoYXQgYFJVTl9BTExfVEVTVFMoKWAgcnVucyBfYWxsIHRlc3RzXyBpbiB5b3VyIGxpbmsgdW5pdCAtLSB0aGV5IGNhbiBiZSBmcm9tIGRpZmZlcmVudCB0ZXN0IGNhc2VzLCBvciBldmVuIGRpZmZlcmVudCBzb3VyY2UgZmlsZXMuCisKK1doZW4gaW52b2tlZCwgdGhlIGBSVU5fQUxMX1RFU1RTKClgIG1hY3JvOgorICAxLiBTYXZlcyB0aGUgc3RhdGUgb2YgYWxsICBHb29nbGUgVGVzdCBmbGFncy4KKyAgMS4gQ3JlYXRlcyBhIHRlc3QgZml4dHVyZSBvYmplY3QgZm9yIHRoZSBmaXJzdCB0ZXN0LgorICAxLiBJbml0aWFsaXplcyBpdCB2aWEgYFNldFVwKClgLgorICAxLiBSdW5zIHRoZSB0ZXN0IG9uIHRoZSBmaXh0dXJlIG9iamVjdC4KKyAgMS4gQ2xlYW5zIHVwIHRoZSBmaXh0dXJlIHZpYSBgVGVhckRvd24oKWAuCisgIDEuIERlbGV0ZXMgdGhlIGZpeHR1cmUuCisgIDEuIFJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCisgIDEuIFJlcGVhdHMgdGhlIGFib3ZlIHN0ZXBzIGZvciB0aGUgbmV4dCB0ZXN0LCB1bnRpbCBhbGwgdGVzdHMgaGF2ZSBydW4uCisKK0luIGFkZGl0aW9uLCBpZiB0aGUgdGV4dCBmaXh0dXJlJ3MgY29uc3RydWN0b3IgZ2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSBpbgorc3RlcCAyLCB0aGVyZSBpcyBubyBwb2ludCBmb3Igc3RlcCAzIC0gNSBhbmQgdGhleSBhcmUgdGh1cyBza2lwcGVkLiBTaW1pbGFybHksCitpZiBzdGVwIDMgZ2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSwgc3RlcCA0IHdpbGwgYmUgc2tpcHBlZC4KKworX0ltcG9ydGFudF86IFlvdSBtdXN0IG5vdCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBgUlVOX0FMTF9URVNUUygpYCwgb3IgYGdjY2AKK3dpbGwgZ2l2ZSB5b3UgYSBjb21waWxlciBlcnJvci4gVGhlIHJhdGlvbmFsZSBmb3IgdGhpcyBkZXNpZ24gaXMgdGhhdCB0aGUKK2F1dG9tYXRlZCB0ZXN0aW5nIHNlcnZpY2UgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdGVzdCBoYXMgcGFzc2VkIGJhc2VkIG9uIGl0cworZXhpdCBjb2RlLCBub3Qgb24gaXRzIHN0ZG91dC9zdGRlcnIgb3V0cHV0OyB0aHVzIHlvdXIgYG1haW4oKWAgZnVuY3Rpb24gbXVzdAorcmV0dXJuIHRoZSB2YWx1ZSBvZiBgUlVOX0FMTF9URVNUUygpYC4KKworQWxzbywgeW91IHNob3VsZCBjYWxsIGBSVU5fQUxMX1RFU1RTKClgIG9ubHkgKipvbmNlKiouIENhbGxpbmcgaXQgbW9yZSB0aGFuIG9uY2UKK2NvbmZsaWN0cyB3aXRoIHNvbWUgYWR2YW5jZWQgR29vZ2xlIFRlc3QgZmVhdHVyZXMgKGUuZy4gdGhyZWFkLXNhZmUgZGVhdGgKK3Rlc3RzKSBhbmQgdGh1cyBpcyBub3Qgc3VwcG9ydGVkLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyBXcml0aW5nIHRoZSBtYWluKCkgRnVuY3Rpb24gIworCitZb3UgY2FuIHN0YXJ0IGZyb20gdGhpcyBib2lsZXJwbGF0ZToKK2BgYAorI2luY2x1ZGUgInRoaXMvcGFja2FnZS9mb28uaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCisvLyBUaGUgZml4dHVyZSBmb3IgdGVzdGluZyBjbGFzcyBGb28uCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBZb3UgY2FuIHJlbW92ZSBhbnkgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlmIGl0cyBib2R5CisgIC8vIGlzIGVtcHR5LgorCisgIEZvb1Rlc3QoKSB7CisgICAgLy8gWW91IGNhbiBkbyBzZXQtdXAgd29yayBmb3IgZWFjaCB0ZXN0IGhlcmUuCisgIH0KKworICB2aXJ0dWFsIH5Gb29UZXN0KCkgeworICAgIC8vIFlvdSBjYW4gZG8gY2xlYW4tdXAgd29yayB0aGF0IGRvZXNuJ3QgdGhyb3cgZXhjZXB0aW9ucyBoZXJlLgorICB9CisKKyAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGFyZSBub3QgZW5vdWdoIGZvciBzZXR0aW5nIHVwCisgIC8vIGFuZCBjbGVhbmluZyB1cCBlYWNoIHRlc3QsIHlvdSBjYW4gZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gQ29kZSBoZXJlIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciAocmlnaHQKKyAgICAvLyBiZWZvcmUgZWFjaCB0ZXN0KS4KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBDb2RlIGhlcmUgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCB0ZXN0IChyaWdodAorICAgIC8vIGJlZm9yZSB0aGUgZGVzdHJ1Y3RvcikuCisgIH0KKworICAvLyBPYmplY3RzIGRlY2xhcmVkIGhlcmUgY2FuIGJlIHVzZWQgYnkgYWxsIHRlc3RzIGluIHRoZSB0ZXN0IGNhc2UgZm9yIEZvby4KK307CisKKy8vIFRlc3RzIHRoYXQgdGhlIEZvbzo6QmFyKCkgbWV0aG9kIGRvZXMgQWJjLgorVEVTVF9GKEZvb1Rlc3QsIE1ldGhvZEJhckRvZXNBYmMpIHsKKyAgY29uc3Qgc3RyaW5nIGlucHV0X2ZpbGVwYXRoID0gInRoaXMvcGFja2FnZS90ZXN0ZGF0YS9teWlucHV0ZmlsZS5kYXQiOworICBjb25zdCBzdHJpbmcgb3V0cHV0X2ZpbGVwYXRoID0gInRoaXMvcGFja2FnZS90ZXN0ZGF0YS9teW91dHB1dGZpbGUuZGF0IjsKKyAgRm9vIGY7CisgIEVYUEVDVF9FUSgwLCBmLkJhcihpbnB1dF9maWxlcGF0aCwgb3V0cHV0X2ZpbGVwYXRoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRm9vIGRvZXMgWHl6LgorVEVTVF9GKEZvb1Rlc3QsIERvZXNYeXopIHsKKyAgLy8gRXhlcmNpc2VzIHRoZSBYeXogZmVhdHVyZSBvZiBGb28uCit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CitgYGAKKworVGhlIGA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KClgIGZ1bmN0aW9uIHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUKK1Rlc3QgZmxhZ3MsIGFuZCByZW1vdmVzIGFsbCByZWNvZ25pemVkIGZsYWdzLiBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBjb250cm9sIGEKK3Rlc3QgcHJvZ3JhbSdzIGJlaGF2aW9yIHZpYSB2YXJpb3VzIGZsYWdzLCB3aGljaCB3ZSdsbCBjb3ZlciBpbiBbQWR2YW5jZWRHdWlkZV0oQWR2YW5jZWRHdWlkZS5tZCkuCitZb3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYFJVTl9BTExfVEVTVFMoKWAsIG9yIHRoZSBmbGFncword29uJ3QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisKK09uIFdpbmRvd3MsIGBJbml0R29vZ2xlVGVzdCgpYCBhbHNvIHdvcmtzIHdpdGggd2lkZSBzdHJpbmdzLCBzbyBpdCBjYW4gYmUgdXNlZAoraW4gcHJvZ3JhbXMgY29tcGlsZWQgaW4gYFVOSUNPREVgIG1vZGUgYXMgd2VsbC4KKworQnV0IG1heWJlIHlvdSB0aGluayB0aGF0IHdyaXRpbmcgYWxsIHRob3NlIG1haW4oKSBmdW5jdGlvbnMgaXMgdG9vIG11Y2ggd29yaz8gV2UgYWdyZWUgd2l0aCB5b3UgY29tcGxldGVseSBhbmQgdGhhdCdzIHdoeSBHb29nbGUgVGVzdCBwcm92aWRlcyBhIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIG1haW4oKS4gSWYgaXQgZml0cyB5b3VyIG5lZWRzLCB0aGVuIGp1c3QgbGluayB5b3VyIHRlc3Qgd2l0aCBndGVzdFxfbWFpbiBsaWJyYXJ5IGFuZCB5b3UgYXJlIGdvb2QgdG8gZ28uCisKKyMjIEltcG9ydGFudCBub3RlIGZvciBWaXN1YWwgQysrIHVzZXJzICMjCitJZiB5b3UgcHV0IHlvdXIgdGVzdHMgaW50byBhIGxpYnJhcnkgYW5kIHlvdXIgYG1haW4oKWAgZnVuY3Rpb24gaXMgaW4gYSBkaWZmZXJlbnQgbGlicmFyeSBvciBpbiB5b3VyIC5leGUgZmlsZSwgdGhvc2UgdGVzdHMgd2lsbCBub3QgcnVuLiBUaGUgcmVhc29uIGlzIGEgW2J1Z10oaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vZmVlZGJhY2svdmlld2ZlZWRiYWNrLmFzcHg/RmVlZGJhY2tJRD0yNDQ0MTAmc2l0ZWlkPTIxMCkgaW4gVmlzdWFsIEMrKy4gV2hlbiB5b3UgZGVmaW5lIHlvdXIgdGVzdHMsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgY2VydGFpbiBzdGF0aWMgb2JqZWN0cyB0byByZWdpc3RlciB0aGVtLiBUaGVzZSBvYmplY3RzIGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIGVsc2V3aGVyZSBidXQgdGhlaXIgY29uc3RydWN0b3JzIGFyZSBzdGlsbCBzdXBwb3NlZCB0byBydW4uIFdoZW4gVmlzdWFsIEMrKyBsaW5rZXIgc2VlcyB0aGF0IG5vdGhpbmcgaW4gdGhlIGxpYnJhcnkgaXMgcmVmZXJlbmNlZCBmcm9tIG90aGVyIHBsYWNlcyBpdCB0aHJvd3MgdGhlIGxpYnJhcnkgb3V0LiBZb3UgaGF2ZSB0byByZWZlcmVuY2UgeW91ciBsaWJyYXJ5IHdpdGggdGVzdHMgZnJvbSB5b3VyIG1haW4gcHJvZ3JhbSB0byBrZWVwIHRoZSBsaW5rZXIgZnJvbSBkaXNjYXJkaW5nIGl0LiBIZXJlIGlzIGhvdyB0byBkbyBpdC4gU29tZXdoZXJlIGluIHlvdXIgbGlicmFyeSBjb2RlIGRlY2xhcmUgYSBmdW5jdGlvbjoKK2BgYAorX19kZWNsc3BlYyhkbGxleHBvcnQpIGludCBQdWxsSW5NeUxpYnJhcnkoKSB7IHJldHVybiAwOyB9CitgYGAKK0lmIHlvdSBwdXQgeW91ciB0ZXN0cyBpbiBhIHN0YXRpYyBsaWJyYXJ5IChub3QgRExMKSB0aGVuIGBfX2RlY2xzcGVjKGRsbGV4cG9ydClgIGlzIG5vdCByZXF1aXJlZC4gTm93LCBpbiB5b3VyIG1haW4gcHJvZ3JhbSwgd3JpdGUgYSBjb2RlIHRoYXQgaW52b2tlcyB0aGF0IGZ1bmN0aW9uOgorYGBgCitpbnQgUHVsbEluTXlMaWJyYXJ5KCk7CitzdGF0aWMgaW50IGR1bW15ID0gUHVsbEluTXlMaWJyYXJ5KCk7CitgYGAKK1RoaXMgd2lsbCBrZWVwIHlvdXIgdGVzdHMgcmVmZXJlbmNlZCBhbmQgd2lsbCBtYWtlIHRoZW0gcmVnaXN0ZXIgdGhlbXNlbHZlcyBhdCBzdGFydHVwLgorCitJbiBhZGRpdGlvbiwgaWYgeW91IGRlZmluZSB5b3VyIHRlc3RzIGluIGEgc3RhdGljIGxpYnJhcnksIGFkZCBgL09QVDpOT1JFRmAgdG8geW91ciBtYWluIHByb2dyYW0gbGlua2VyIG9wdGlvbnMuIElmIHlvdSB1c2UgTVNWQysrIElERSwgZ28gdG8geW91ciAuZXhlIHByb2plY3QgcHJvcGVydGllcy9Db25maWd1cmF0aW9uIFByb3BlcnRpZXMvTGlua2VyL09wdGltaXphdGlvbiBhbmQgc2V0IFJlZmVyZW5jZXMgc2V0dGluZyB0byBgS2VlcCBVbnJlZmVyZW5jZWQgRGF0YSAoL09QVDpOT1JFRilgLiBUaGlzIHdpbGwga2VlcCBWaXN1YWwgQysrIGxpbmtlciBmcm9tIGRpc2NhcmRpbmcgaW5kaXZpZHVhbCBzeW1ib2xzIGdlbmVyYXRlZCBieSB5b3VyIHRlc3RzIGZyb20gdGhlIGZpbmFsIGV4ZWN1dGFibGUuCisKK1RoZXJlIGlzIG9uZSBtb3JlIHBpdGZhbGwsIHRob3VnaC4gSWYgeW91IHVzZSBHb29nbGUgVGVzdCBhcyBhIHN0YXRpYyBsaWJyYXJ5ICh0aGF0J3MgaG93IGl0IGlzIGRlZmluZWQgaW4gZ3Rlc3QudmNwcm9qKSB5b3VyIHRlc3RzIG11c3QgYWxzbyByZXNpZGUgaW4gYSBzdGF0aWMgbGlicmFyeS4gSWYgeW91IGhhdmUgdG8gaGF2ZSB0aGVtIGluIGEgRExMLCB5b3UgX211c3RfIGNoYW5nZSBHb29nbGUgVGVzdCB0byBidWlsZCBpbnRvIGEgRExMIGFzIHdlbGwuIE90aGVyd2lzZSB5b3VyIHRlc3RzIHdpbGwgbm90IHJ1biBjb3JyZWN0bHkgb3Igd2lsbCBub3QgcnVuIGF0IGFsbC4gVGhlIGdlbmVyYWwgY29uY2x1c2lvbiBoZXJlIGlzOiBtYWtlIHlvdXIgbGlmZSBlYXNpZXIgLSBkbyBub3Qgd3JpdGUgeW91ciB0ZXN0cyBpbiBsaWJyYXJpZXMhCisKKyMgV2hlcmUgdG8gR28gZnJvbSBIZXJlICMKKworQ29uZ3JhdHVsYXRpb25zISBZb3UndmUgbGVhcm5lZCB0aGUgR29vZ2xlIFRlc3QgYmFzaWNzLiBZb3UgY2FuIHN0YXJ0IHdyaXRpbmcKK2FuZCBydW5uaW5nIEdvb2dsZSBUZXN0IHRlc3RzLCByZWFkIHNvbWUgW3NhbXBsZXNdKFNhbXBsZXMubWQpLCBvciBjb250aW51ZSB3aXRoCitbQWR2YW5jZWRHdWlkZV0oQWR2YW5jZWRHdWlkZS5tZCksIHdoaWNoIGRlc2NyaWJlcyBtYW55IG1vcmUgdXNlZnVsIEdvb2dsZSBUZXN0IGZlYXR1cmVzLgorCisjIEtub3duIExpbWl0YXRpb25zICMKKworR29vZ2xlIFRlc3QgaXMgZGVzaWduZWQgdG8gYmUgdGhyZWFkLXNhZmUuICBUaGUgaW1wbGVtZW50YXRpb24gaXMKK3RocmVhZC1zYWZlIG9uIHN5c3RlbXMgd2hlcmUgdGhlIGBwdGhyZWFkc2AgbGlicmFyeSBpcyBhdmFpbGFibGUuICBJdAoraXMgY3VycmVudGx5IF91bnNhZmVfIHRvIHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGZyb20gdHdvIHRocmVhZHMKK2NvbmN1cnJlbnRseSBvbiBvdGhlciBzeXN0ZW1zIChlLmcuIFdpbmRvd3MpLiAgSW4gbW9zdCB0ZXN0cyB0aGlzIGlzCitub3QgYW4gaXNzdWUgYXMgdXN1YWxseSB0aGUgYXNzZXJ0aW9ucyBhcmUgZG9uZSBpbiB0aGUgbWFpbiB0aHJlYWQuIElmCit5b3Ugd2FudCB0byBoZWxwLCB5b3UgY2FuIHZvbHVudGVlciB0byBpbXBsZW1lbnQgdGhlIG5lY2Vzc2FyeQorc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaW4gYGd0ZXN0LXBvcnQuaGAgZm9yIHlvdXIgcGxhdGZvcm0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvUHVtcE1hbnVhbC5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1B1bXBNYW51YWwubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4NGYxNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1B1bXBNYW51YWwubWQKQEAgLTAsMCArMSwxNzcgQEAKKworCis8Yj5QPC9iPnVtcCBpcyA8Yj5VPC9iPnNlZnVsIGZvciA8Yj5NPC9iPmV0YSA8Yj5QPC9iPnJvZ3JhbW1pbmcuCisKKyMgVGhlIFByb2JsZW0gIworCitUZW1wbGF0ZSBhbmQgbWFjcm8gbGlicmFyaWVzIG9mdGVuIG5lZWQgdG8gZGVmaW5lIG1hbnkgY2xhc3NlcywKK2Z1bmN0aW9ucywgb3IgbWFjcm9zIHRoYXQgdmFyeSBvbmx5IChvciBhbG1vc3Qgb25seSkgaW4gdGhlIG51bWJlciBvZgorYXJndW1lbnRzIHRoZXkgdGFrZS4gSXQncyBhIGxvdCBvZiByZXBldGl0aXZlLCBtZWNoYW5pY2FsLCBhbmQKK2Vycm9yLXByb25lIHdvcmsuCisKK1ZhcmlhZGljIHRlbXBsYXRlcyBhbmQgdmFyaWFkaWMgbWFjcm9zIGNhbiBhbGxldmlhdGUgdGhlIHByb2JsZW0uCitIb3dldmVyLCB3aGlsZSBib3RoIGFyZSBiZWluZyBjb25zaWRlcmVkIGJ5IHRoZSBDKysgY29tbWl0dGVlLCBuZWl0aGVyCitpcyBpbiB0aGUgc3RhbmRhcmQgeWV0IG9yIHdpZGVseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXJzLiAgVGh1cyB0aGV5CithcmUgb2Z0ZW4gbm90IGEgZ29vZCBjaG9pY2UsIGVzcGVjaWFsbHkgd2hlbiB5b3VyIGNvZGUgbmVlZHMgdG8gYmUKK3BvcnRhYmxlLiBBbmQgdGhlaXIgY2FwYWJpbGl0aWVzIGFyZSBzdGlsbCBsaW1pdGVkLgorCitBcyBhIHJlc3VsdCwgYXV0aG9ycyBvZiBzdWNoIGxpYnJhcmllcyBvZnRlbiBoYXZlIHRvIHdyaXRlIHNjcmlwdHMgdG8KK2dlbmVyYXRlIHRoZWlyIGltcGxlbWVudGF0aW9uLiBIb3dldmVyLCBvdXIgZXhwZXJpZW5jZSBpcyB0aGF0IGl0J3MKK3RlZGlvdXMgdG8gd3JpdGUgc3VjaCBzY3JpcHRzLCB3aGljaCB0ZW5kIHRvIHJlZmxlY3QgdGhlIHN0cnVjdHVyZSBvZgordGhlIGdlbmVyYXRlZCBjb2RlIHBvb3JseSBhbmQgYXJlIG9mdGVuIGhhcmQgdG8gcmVhZCBhbmQgZWRpdC4gRm9yCitleGFtcGxlLCBhIHNtYWxsIGNoYW5nZSBuZWVkZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIG1heSByZXF1aXJlIHNvbWUKK25vbi1pbnR1aXRpdmUsIG5vbi10cml2aWFsIGNoYW5nZXMgaW4gdGhlIHNjcmlwdC4gVGhpcyBpcyBlc3BlY2lhbGx5CitwYWluZnVsIHdoZW4gZXhwZXJpbWVudGluZyB3aXRoIHRoZSBjb2RlLgorCisjIE91ciBTb2x1dGlvbiAjCisKK1B1bXAgKGZvciBQdW1wIGlzIFVzZWZ1bCBmb3IgTWV0YSBQcm9ncmFtbWluZywgUHJldHR5IFVzZWZ1bCBmb3IgTWV0YQorUHJvZ3JhbW1pbmcsIG9yIFByYWN0aWNhbCBVdGlsaXR5IGZvciBNZXRhIFByb2dyYW1taW5nLCB3aGljaGV2ZXIgeW91CitwcmVmZXIpIGlzIGEgc2ltcGxlIG1ldGEtcHJvZ3JhbW1pbmcgdG9vbCBmb3IgQysrLiBUaGUgaWRlYSBpcyB0aGF0IGEKK3Byb2dyYW1tZXIgd3JpdGVzIGEgYGZvby5wdW1wYCBmaWxlIHdoaWNoIGNvbnRhaW5zIEMrKyBjb2RlIHBsdXMgbWV0YQorY29kZSB0aGF0IG1hbmlwdWxhdGVzIHRoZSBDKysgY29kZS4gVGhlIG1ldGEgY29kZSBjYW4gaGFuZGxlCitpdGVyYXRpb25zIG92ZXIgYSByYW5nZSwgbmVzdGVkIGl0ZXJhdGlvbnMsIGxvY2FsIG1ldGEgdmFyaWFibGUKK2RlZmluaXRpb25zLCBzaW1wbGUgYXJpdGhtZXRpYywgYW5kIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zLiBZb3UgY2FuCit2aWV3IGl0IGFzIGEgc21hbGwgRG9tYWluLVNwZWNpZmljIExhbmd1YWdlLiBUaGUgbWV0YSBsYW5ndWFnZSBpcworZGVzaWduZWQgdG8gYmUgbm9uLWludHJ1c2l2ZSAocy50LiBpdCB3b24ndCBjb25mdXNlIEVtYWNzJyBDKysgbW9kZSwKK2ZvciBleGFtcGxlKSBhbmQgY29uY2lzZSwgbWFraW5nIFB1bXAgY29kZSBpbnR1aXRpdmUgYW5kIGVhc3kgdG8KK21haW50YWluLgorCisjIyBIaWdobGlnaHRzICMjCisKKyAgKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgaW4gYSBzaW5nbGUgUHl0aG9uIHNjcmlwdCBhbmQgdGh1cyB1bHRyYSBwb3J0YWJsZTogbm8gYnVpbGQgb3IgaW5zdGFsbGF0aW9uIGlzIG5lZWRlZCBhbmQgaXQgd29ya3MgY3Jvc3MgcGxhdGZvcm1zLgorICAqIFB1bXAgdHJpZXMgdG8gYmUgc21hcnQgd2l0aCByZXNwZWN0IHRvIFtHb29nbGUncyBzdHlsZSBndWlkZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1zdHlsZWd1aWRlLyk6IGl0IGJyZWFrcyBsb25nIGxpbmVzIChlYXN5IHRvIGhhdmUgd2hlbiB0aGV5IGFyZSBnZW5lcmF0ZWQpIGF0IGFjY2VwdGFibGUgcGxhY2VzIHRvIGZpdCB3aXRoaW4gODAgY29sdW1ucyBhbmQgaW5kZW50IHRoZSBjb250aW51YXRpb24gbGluZXMgY29ycmVjdGx5LgorICAqIFRoZSBmb3JtYXQgaXMgaHVtYW4tcmVhZGFibGUgYW5kIG1vcmUgY29uY2lzZSB0aGFuIFhNTC4KKyAgKiBUaGUgZm9ybWF0IHdvcmtzIHJlbGF0aXZlbHkgd2VsbCB3aXRoIEVtYWNzJyBDKysgbW9kZS4KKworIyMgRXhhbXBsZXMgIyMKKworVGhlIGZvbGxvd2luZyBQdW1wIGNvZGUgKHdoZXJlIG1ldGEga2V5d29yZHMgc3RhcnQgd2l0aCBgJGAsIGBbW2AgYW5kIGBdXWAgYXJlIG1ldGEgYnJhY2tldHMsIGFuZCBgJCRgIHN0YXJ0cyBhIG1ldGEgY29tbWVudCB0aGF0IGVuZHMgd2l0aCB0aGUgbGluZSk6CisKK2BgYAorJHZhciBuID0gMyAgICAgJCQgRGVmaW5lcyBhIG1ldGEgdmFyaWFibGUgbi4KKyRyYW5nZSBpIDAuLm4gICQkIERlY2xhcmVzIHRoZSByYW5nZSBvZiBtZXRhIGl0ZXJhdG9yIGkgKGluY2x1c2l2ZSkuCiskZm9yIGkgW1sKKyAgICAgICAgICAgICAgICQkIE1ldGEgbG9vcC4KKy8vIEZvbyRpIGRvZXMgYmxhaCBmb3IgJGktYXJ5IHByZWRpY2F0ZXMuCiskcmFuZ2UgaiAxLi5pCit0ZW1wbGF0ZSA8c2l6ZV90IE4gJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXT4KK2NsYXNzIEZvbyRpIHsKKyRpZiBpID09IDAgW1sKKyAgYmxhaCBhOworXV0gJGVsaWYgaSA8PSAyIFtbCisgIGJsYWggYjsKK11dICRlbHNlIFtbCisgIGJsYWggYzsKK11dCit9OworCitdXQorYGBgCisKK3dpbGwgYmUgdHJhbnNsYXRlZCBieSB0aGUgUHVtcCBjb21waWxlciB0bzoKKworYGBgCisvLyBGb28wIGRvZXMgYmxhaCBmb3IgMC1hcnkgcHJlZGljYXRlcy4KK3RlbXBsYXRlIDxzaXplX3QgTj4KK2NsYXNzIEZvbzAgeworICBibGFoIGE7Cit9OworCisvLyBGb28xIGRvZXMgYmxhaCBmb3IgMS1hcnkgcHJlZGljYXRlcy4KK3RlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgQTE+CitjbGFzcyBGb28xIHsKKyAgYmxhaCBiOworfTsKKworLy8gRm9vMiBkb2VzIGJsYWggZm9yIDItYXJ5IHByZWRpY2F0ZXMuCit0ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KK2NsYXNzIEZvbzIgeworICBibGFoIGI7Cit9OworCisvLyBGb28zIGRvZXMgYmxhaCBmb3IgMy1hcnkgcHJlZGljYXRlcy4KK3RlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KK2NsYXNzIEZvbzMgeworICBibGFoIGM7Cit9OworYGBgCisKK0luIGFub3RoZXIgZXhhbXBsZSwKKworYGBgCiskcmFuZ2UgaSAxLi5uCitGdW5jKCRmb3IgaSArIFtbYSRpXV0pOworJCQgVGhlIHRleHQgYmV0d2VlbiBpIGFuZCBbWyBpcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gaXRlcmF0aW9ucy4KK2BgYAorCit3aWxsIGdlbmVyYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpbmVzICh3aXRob3V0IHRoZSBjb21tZW50cyksIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYG5gOgorCitgYGAKK0Z1bmMoKTsgICAgICAgICAgICAgIC8vIElmIG4gaXMgMC4KK0Z1bmMoYTEpOyAgICAgICAgICAgIC8vIElmIG4gaXMgMS4KK0Z1bmMoYTEgKyBhMik7ICAgICAgIC8vIElmIG4gaXMgMi4KK0Z1bmMoYTEgKyBhMiArIGEzKTsgIC8vIElmIG4gaXMgMy4KKy8vIEFuZCBzbyBvbi4uLgorYGBgCisKKyMjIENvbnN0cnVjdHMgIyMKKworV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1ldGEgcHJvZ3JhbW1pbmcgY29uc3RydWN0czoKKworfCBgJHZhciBpZCA9IGV4cGAgfCBEZWZpbmVzIGEgbmFtZWQgY29uc3RhbnQgdmFsdWUuIGAkaWRgIGlzIHZhbGlkIHV0aWwgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtZXRhIGxleGljYWwgYmxvY2suIHwKK3w6LS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGAkcmFuZ2UgaWQgZXhwLi5leHBgIHwgU2V0cyB0aGUgcmFuZ2Ugb2YgYW4gaXRlcmF0aW9uIHZhcmlhYmxlLCB3aGljaCBjYW4gYmUgcmV1c2VkIGluIG11bHRpcGxlIGxvb3BzIGxhdGVyLiAgICAgICAgICB8Cit8IGAkZm9yIGlkIHNlcCBbWyBjb2RlIF1dYCB8IEl0ZXJhdGlvbi4gVGhlIHJhbmdlIG9mIGBpZGAgbXVzdCBoYXZlIGJlZW4gZGVmaW5lZCBlYXJsaWVyLiBgJGlkYCBpcyB2YWxpZCBpbiBgY29kZWAuICAgICAgICAgfAorfCBgJCgkKWAgICAgICAgICAgfCBHZW5lcmF0ZXMgYSBzaW5nbGUgYCRgIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYCRpZGAgICAgICAgICAgIHwgVmFsdWUgb2YgdGhlIG5hbWVkIGNvbnN0YW50IG9yIGl0ZXJhdGlvbiB2YXJpYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGAkKGV4cClgICAgICAgICB8IFZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgJGlmIGV4cCBbWyBjb2RlIF1dIGVsc2VfYnJhbmNoYCB8IENvbmRpdGlvbmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgW1sgY29kZSBdXWAgICAgfCBNZXRhIGxleGljYWwgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYGNwcF9jb2RlYCAgICAgIHwgUmF3IEMrKyBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGAkJCBjb21tZW50YCAgICB8IE1ldGEgY29tbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisqKk5vdGU6KiogVG8gZ2l2ZSB0aGUgdXNlciBzb21lIGZyZWVkb20gaW4gZm9ybWF0dGluZyB0aGUgUHVtcCBzb3VyY2UKK2NvZGUsIFB1bXAgaWdub3JlcyBhIG5ldy1saW5lIGNoYXJhY3RlciBpZiBpdCdzIHJpZ2h0IGFmdGVyIGAkZm9yIGZvb2AKK29yIG5leHQgdG8gYFtbYCBvciBgXV1gLiBXaXRob3V0IHRoaXMgcnVsZSB5b3UnbGwgb2Z0ZW4gYmUgZm9yY2VkIHRvIHdyaXRlCit2ZXJ5IGxvbmcgbGluZXMgdG8gZ2V0IHRoZSBkZXNpcmVkIG91dHB1dC4gVGhlcmVmb3JlIHNvbWV0aW1lcyB5b3UgbWF5CituZWVkIHRvIGluc2VydCBhbiBleHRyYSBuZXctbGluZSBpbiBzdWNoIHBsYWNlcyBmb3IgYSBuZXctbGluZSB0byBzaG93Cit1cCBpbiB5b3VyIG91dHB1dC4KKworIyMgR3JhbW1hciAjIworCitgYGAKK2NvZGUgOjo9IGF0b21pY19jb2RlKgorYXRvbWljX2NvZGUgOjo9ICR2YXIgaWQgPSBleHAKKyAgICB8ICR2YXIgaWQgPSBbWyBjb2RlIF1dCisgICAgfCAkcmFuZ2UgaWQgZXhwLi5leHAKKyAgICB8ICRmb3IgaWQgc2VwIFtbIGNvZGUgXV0KKyAgICB8ICQoJCkKKyAgICB8ICRpZAorICAgIHwgJChleHApCisgICAgfCAkaWYgZXhwIFtbIGNvZGUgXV0gZWxzZV9icmFuY2gKKyAgICB8IFtbIGNvZGUgXV0KKyAgICB8IGNwcF9jb2RlCitzZXAgOjo9IGNwcF9jb2RlIHwgZW1wdHlfc3RyaW5nCitlbHNlX2JyYW5jaCA6Oj0gJGVsc2UgW1sgY29kZSBdXQorICAgIHwgJGVsaWYgZXhwIFtbIGNvZGUgXV0gZWxzZV9icmFuY2gKKyAgICB8IGVtcHR5X3N0cmluZworZXhwIDo6PSBzaW1wbGVfZXhwcmVzc2lvbl9pbl9QeXRob25fc3ludGF4CitgYGAKKworIyMgQ29kZSAjIworCitZb3UgY2FuIGZpbmQgdGhlIHNvdXJjZSBjb2RlIG9mIFB1bXAgaW4gW3NjcmlwdHMvcHVtcC5weV0oLi4vc2NyaXB0cy9wdW1wLnB5KS4gSXQgaXMgc3RpbGwKK3ZlcnkgdW5wb2xpc2hlZCBhbmQgbGFja3MgYXV0b21hdGVkIHRlc3RzLCBhbHRob3VnaCBpdCBoYXMgYmVlbgorc3VjY2Vzc2Z1bGx5IHVzZWQgbWFueSB0aW1lcy4gSWYgeW91IGZpbmQgYSBjaGFuY2UgdG8gdXNlIGl0IGluIHlvdXIKK3Byb2plY3QsIHBsZWFzZSBsZXQgdXMga25vdyB3aGF0IHlvdSB0aGluayEgIFdlIGFsc28gd2VsY29tZSBoZWxwIG9uCitpbXByb3ZpbmcgUHVtcC4KKworIyMgUmVhbCBFeGFtcGxlcyAjIworCitZb3UgY2FuIGZpbmQgcmVhbC13b3JsZCBhcHBsaWNhdGlvbnMgb2YgUHVtcCBpbiBbR29vZ2xlIFRlc3RdKGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jb2Rlc2VhcmNoP3E9ZmlsZSUzQVwucHVtcCUyNCtwYWNrYWdlJTNBaHR0cCUzQSUyRiUyRmdvb2dsZXRlc3RcLmdvb2dsZWNvZGVcLmNvbSkgYW5kIFtHb29nbGUgTW9ja10oaHR0cDovL3d3dy5nb29nbGUuY29tL2NvZGVzZWFyY2g/cT1maWxlJTNBXC5wdW1wJTI0K3BhY2thZ2UlM0FodHRwJTNBJTJGJTJGZ29vZ2xlbW9ja1wuZ29vZ2xlY29kZVwuY29tKS4gIFRoZSBzb3VyY2UgZmlsZSBgZm9vLmgucHVtcGAgZ2VuZXJhdGVzIGBmb28uaGAuCisKKyMjIFRpcHMgIyMKKworICAqIElmIGEgbWV0YSB2YXJpYWJsZSBpcyBmb2xsb3dlZCBieSBhIGxldHRlciBvciBkaWdpdCwgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIHVzaW5nIGBbW11dYCwgd2hpY2ggaW5zZXJ0cyBhbiBlbXB0eSBzdHJpbmcuIEZvciBleGFtcGxlIGBGb28kaltbXV1IZWxwZXJgIGdlbmVyYXRlIGBGb28xSGVscGVyYCB3aGVuIGBqYCBpcyAxLgorICAqIFRvIGF2b2lkIGV4dHJhLWxvbmcgUHVtcCBzb3VyY2UgbGluZXMsIHlvdSBjYW4gYnJlYWsgYSBsaW5lIGFueXdoZXJlIHlvdSB3YW50IGJ5IGluc2VydGluZyBgW1tdXWAgZm9sbG93ZWQgYnkgYSBuZXcgbGluZS4gU2luY2UgYW55IG5ldy1saW5lIGNoYXJhY3RlciBuZXh0IHRvIGBbW2Agb3IgYF1dYCBpcyBpZ25vcmVkLCB0aGUgZ2VuZXJhdGVkIGNvZGUgd29uJ3QgY29udGFpbiB0aGlzIG5ldyBsaW5lLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvU2FtcGxlcy5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1NhbXBsZXMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxZDIwMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1NhbXBsZXMubWQKQEAgLTAsMCArMSwxNCBAQAorSWYgeW91J3JlIGxpa2UgdXMsIHlvdSdkIGxpa2UgdG8gbG9vayBhdCBzb21lIEdvb2dsZSBUZXN0IHNhbXBsZSBjb2RlLiAgVGhlCitbc2FtcGxlcyBmb2xkZXJdKC4uL3NhbXBsZXMpIGhhcyBhIG51bWJlciBvZiB3ZWxsLWNvbW1lbnRlZCBzYW1wbGVzIHNob3dpbmcgaG93IHRvIHVzZSBhCit2YXJpZXR5IG9mIEdvb2dsZSBUZXN0IGZlYXR1cmVzLgorCisgICogW1NhbXBsZSAjMV0oLi4vc2FtcGxlcy9zYW1wbGUxX3VuaXR0ZXN0LmNjKSBzaG93cyB0aGUgYmFzaWMgc3RlcHMgb2YgdXNpbmcgR29vZ2xlIFRlc3QgdG8gdGVzdCBDKysgZnVuY3Rpb25zLgorICAqIFtTYW1wbGUgIzJdKC4uL3NhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYykgc2hvd3MgYSBtb3JlIGNvbXBsZXggdW5pdCB0ZXN0IGZvciBhIGNsYXNzIHdpdGggbXVsdGlwbGUgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgKiBbU2FtcGxlICMzXSguLi9zYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MpIHVzZXMgYSB0ZXN0IGZpeHR1cmUuCisgICogW1NhbXBsZSAjNF0oLi4vc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjKSBpcyBhbm90aGVyIGJhc2ljIGV4YW1wbGUgb2YgdXNpbmcgR29vZ2xlIFRlc3QuCisgICogW1NhbXBsZSAjNV0oLi4vc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjKSB0ZWFjaGVzIGhvdyB0byByZXVzZSBhIHRlc3QgZml4dHVyZSBpbiBtdWx0aXBsZSB0ZXN0IGNhc2VzIGJ5IGRlcml2aW5nIHN1Yi1maXh0dXJlcyBmcm9tIGl0LgorICAqIFtTYW1wbGUgIzZdKC4uL3NhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jYykgZGVtb25zdHJhdGVzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgKiBbU2FtcGxlICM3XSguLi9zYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MpIHRlYWNoZXMgdGhlIGJhc2ljcyBvZiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorICAqIFtTYW1wbGUgIzhdKC4uL3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYykgc2hvd3MgdXNpbmcgYENvbWJpbmUoKWAgaW4gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgKiBbU2FtcGxlICM5XSguLi9zYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MpIHNob3dzIHVzZSBvZiB0aGUgbGlzdGVuZXIgQVBJIHRvIG1vZGlmeSBHb29nbGUgVGVzdCdzIGNvbnNvbGUgb3V0cHV0IGFuZCB0aGUgdXNlIG9mIGl0cyByZWZsZWN0aW9uIEFQSSB0byBpbnNwZWN0IHRlc3QgcmVzdWx0cy4KKyAgKiBbU2FtcGxlICMxMF0oLi4vc2FtcGxlcy9zYW1wbGUxMF91bml0dGVzdC5jYykgc2hvd3MgdXNlIG9mIHRoZSBsaXN0ZW5lciBBUEkgdG8gaW1wbGVtZW50IGEgcHJpbWl0aXZlIG1lbW9yeSBsZWFrIGNoZWNrZXIuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV81X0FkdmFuY2VkR3VpZGUubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV81X0FkdmFuY2VkR3VpZGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzZmMxYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzVfQWR2YW5jZWRHdWlkZS5tZApAQCAtMCwwICsxLDIwOTYgQEAKKworCitOb3cgdGhhdCB5b3UgaGF2ZSByZWFkIFtQcmltZXJdKFYxXzVfUHJpbWVyLm1kKSBhbmQgbGVhcm5lZCBob3cgdG8gd3JpdGUgdGVzdHMKK3VzaW5nIEdvb2dsZSBUZXN0LCBpdCdzIHRpbWUgdG8gbGVhcm4gc29tZSBuZXcgdHJpY2tzLiBUaGlzIGRvY3VtZW50Cit3aWxsIHNob3cgeW91IG1vcmUgYXNzZXJ0aW9ucyBhcyB3ZWxsIGFzIGhvdyB0byBjb25zdHJ1Y3QgY29tcGxleAorZmFpbHVyZSBtZXNzYWdlcywgcHJvcGFnYXRlIGZhdGFsIGZhaWx1cmVzLCByZXVzZSBhbmQgc3BlZWQgdXAgeW91cgordGVzdCBmaXh0dXJlcywgYW5kIHVzZSB2YXJpb3VzIGZsYWdzIHdpdGggeW91ciB0ZXN0cy4KKworIyBNb3JlIEFzc2VydGlvbnMgIworCitUaGlzIHNlY3Rpb24gY292ZXJzIHNvbWUgbGVzcyBmcmVxdWVudGx5IHVzZWQsIGJ1dCBzdGlsbCBzaWduaWZpY2FudCwKK2Fzc2VydGlvbnMuCisKKyMjIEV4cGxpY2l0IFN1Y2Nlc3MgYW5kIEZhaWx1cmUgIyMKKworVGhlc2UgdGhyZWUgYXNzZXJ0aW9ucyBkbyBub3QgYWN0dWFsbHkgdGVzdCBhIHZhbHVlIG9yIGV4cHJlc3Npb24uIEluc3RlYWQsCit0aGV5IGdlbmVyYXRlIGEgc3VjY2VzcyBvciBmYWlsdXJlIGRpcmVjdGx5LiBMaWtlIHRoZSBtYWNyb3MgdGhhdCBhY3R1YWxseQorcGVyZm9ybSBhIHRlc3QsIHlvdSBtYXkgc3RyZWFtIGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZSBpbnRvIHRoZSB0aGVtLgorCit8IGBTVUNDRUVEKCk7YCB8Cit8Oi0tLS0tLS0tLS0tLS18CisKK0dlbmVyYXRlcyBhIHN1Y2Nlc3MuIFRoaXMgZG9lcyBOT1QgbWFrZSB0aGUgb3ZlcmFsbCB0ZXN0IHN1Y2NlZWQuIEEgdGVzdCBpcworY29uc2lkZXJlZCBzdWNjZXNzZnVsIG9ubHkgaWYgbm9uZSBvZiBpdHMgYXNzZXJ0aW9ucyBmYWlsIGR1cmluZyBpdHMgZXhlY3V0aW9uLgorCitOb3RlOiBgU1VDQ0VFRCgpYCBpcyBwdXJlbHkgZG9jdW1lbnRhcnkgYW5kIGN1cnJlbnRseSBkb2Vzbid0IGdlbmVyYXRlIGFueQordXNlci12aXNpYmxlIG91dHB1dC4gSG93ZXZlciwgd2UgbWF5IGFkZCBgU1VDQ0VFRCgpYCBtZXNzYWdlcyB0byBHb29nbGUgVGVzdCdzCitvdXRwdXQgaW4gdGhlIGZ1dHVyZS4KKworfCBgRkFJTCgpO2AgIHwgYEFERF9GQUlMVVJFKCk7YCB8Cit8Oi0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLXwKKworYEZBSUwqYCBnZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlIHdoaWxlIGBBRERfRkFJTFVSRSpgIGdlbmVyYXRlcyBhIG5vbmZhdGFsCitmYWlsdXJlLiBUaGVzZSBhcmUgdXNlZnVsIHdoZW4gY29udHJvbCBmbG93LCByYXRoZXIgdGhhbiBhIEJvb2xlYW4gZXhwcmVzc2lvbiwKK2RldGVyZW1pbmVzIHRoZSB0ZXN0J3Mgc3VjY2VzcyBvciBmYWlsdXJlLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUKK3NvbWV0aGluZyBsaWtlOgorCitgYGAKK3N3aXRjaChleHByZXNzaW9uKSB7CisgIGNhc2UgMTogLi4uIHNvbWUgY2hlY2tzIC4uLgorICBjYXNlIDI6IC4uLiBzb21lIG90aGVyIGNoZWNrcworICAuLi4KKyAgZGVmYXVsdDogRkFJTCgpIDw8ICJXZSBzaG91bGRuJ3QgZ2V0IGhlcmUuIjsKK30KK2BgYAorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMgRXhjZXB0aW9uIEFzc2VydGlvbnMgIyMKKworVGhlc2UgYXJlIGZvciB2ZXJpZnlpbmcgdGhhdCBhIHBpZWNlIG9mIGNvZGUgdGhyb3dzIChvciBkb2VzIG5vdAordGhyb3cpIGFuIGV4Y2VwdGlvbiBvZiB0aGUgZ2l2ZW4gdHlwZToKKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9USFJPVyhgX3N0YXRlbWVudF8sIF9leGNlcHRpb25cX3R5cGVfYCk7YCAgfCBgRVhQRUNUX1RIUk9XKGBfc3RhdGVtZW50XywgX2V4Y2VwdGlvblxfdHlwZV9gKTtgICB8IF9zdGF0ZW1lbnRfIHRocm93cyBhbiBleGNlcHRpb24gb2YgdGhlIGdpdmVuIHR5cGUgIHwKK3wgYEFTU0VSVF9BTllfVEhST1coYF9zdGF0ZW1lbnRfYCk7YCAgICAgICAgICAgICAgICB8IGBFWFBFQ1RfQU5ZX1RIUk9XKGBfc3RhdGVtZW50X2ApO2AgICAgICAgICAgICAgICAgfCBfc3RhdGVtZW50XyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIGFueSB0eXBlICAgICAgICB8Cit8IGBBU1NFUlRfTk9fVEhST1coYF9zdGF0ZW1lbnRfYCk7YCAgICAgICAgICAgICAgICAgfCBgRVhQRUNUX05PX1RIUk9XKGBfc3RhdGVtZW50X2ApO2AgICAgICAgICAgICAgICAgIHwgX3N0YXRlbWVudF8gZG9lc24ndCB0aHJvdyBhbnkgZXhjZXB0aW9uICAgICAgICAgICAgfAorCitFeGFtcGxlczoKKworYGBgCitBU1NFUlRfVEhST1coRm9vKDUpLCBiYXJfZXhjZXB0aW9uKTsKKworRVhQRUNUX05PX1RIUk9XKHsKKyAgaW50IG4gPSA1OworICBCYXIoJm4pOworfSk7CitgYGAKKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWM7IHNpbmNlIHZlcnNpb24gMS4xLjAuCisKKyMjIFByZWRpY2F0ZSBBc3NlcnRpb25zIGZvciBCZXR0ZXIgRXJyb3IgTWVzc2FnZXMgIyMKKworRXZlbiB0aG91Z2ggR29vZ2xlIFRlc3QgaGFzIGEgcmljaCBzZXQgb2YgYXNzZXJ0aW9ucywgdGhleSBjYW4gbmV2ZXIgYmUKK2NvbXBsZXRlLCBhcyBpdCdzIGltcG9zc2libGUgKG5vciBhIGdvb2QgaWRlYSkgdG8gYW50aWNpcGF0ZSBhbGwgdGhlIHNjZW5hcmlvcworYSB1c2VyIG1pZ2h0IHJ1biBpbnRvLiBUaGVyZWZvcmUsIHNvbWV0aW1lcyBhIHVzZXIgaGFzIHRvIHVzZSBgRVhQRUNUX1RSVUUoKWAKK3RvIGNoZWNrIGEgY29tcGxleCBleHByZXNzaW9uLCBmb3IgbGFjayBvZiBhIGJldHRlciBtYWNyby4gVGhpcyBoYXMgdGhlIHByb2JsZW0KK29mIG5vdCBzaG93aW5nIHlvdSB0aGUgdmFsdWVzIG9mIHRoZSBwYXJ0cyBvZiB0aGUgZXhwcmVzc2lvbiwgbWFraW5nIGl0IGhhcmQgdG8KK3VuZGVyc3RhbmQgd2hhdCB3ZW50IHdyb25nLiBBcyBhIHdvcmthcm91bmQsIHNvbWUgdXNlcnMgY2hvb3NlIHRvIGNvbnN0cnVjdCB0aGUKK2ZhaWx1cmUgbWVzc2FnZSBieSB0aGVtc2VsdmVzLCBzdHJlYW1pbmcgaXQgaW50byBgRVhQRUNUX1RSVUUoKWAuIEhvd2V2ZXIsIHRoaXMKK2lzIGF3a3dhcmQgZXNwZWNpYWxseSB3aGVuIHRoZSBleHByZXNzaW9uIGhhcyBzaWRlLWVmZmVjdHMgb3IgaXMgZXhwZW5zaXZlIHRvCitldmFsdWF0ZS4KKworR29vZ2xlIFRlc3QgZ2l2ZXMgeW91IHRocmVlIGRpZmZlcmVudCBvcHRpb25zIHRvIHNvbHZlIHRoaXMgcHJvYmxlbToKKworIyMjIFVzaW5nIGFuIEV4aXN0aW5nIEJvb2xlYW4gRnVuY3Rpb24gIyMjCisKK0lmIHlvdSBhbHJlYWR5IGhhdmUgYSBmdW5jdGlvbiBvciBhIGZ1bmN0b3IgdGhhdCByZXR1cm5zIGBib29sYCAob3IgYSB0eXBlCit0aGF0IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBgYm9vbGApLCB5b3UgY2FuIHVzZSBpdCBpbiBhIF9wcmVkaWNhdGUKK2Fzc2VydGlvbl8gdG8gZ2V0IHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgcHJpbnRlZCBmb3IgZnJlZToKKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9QUkVEMShgX3ByZWQxLCB2YWwxX2ApO2AgICAgICAgfCBgRVhQRUNUX1BSRUQxKGBfcHJlZDEsIHZhbDFfYCk7YCB8IF9wcmVkMSh2YWwxKV8gcmV0dXJucyB0cnVlIHwKK3wgYEFTU0VSVF9QUkVEMihgX3ByZWQyLCB2YWwxLCB2YWwyX2ApO2AgfCBgRVhQRUNUX1BSRUQyKGBfcHJlZDIsIHZhbDEsIHZhbDJfYCk7YCB8ICBfcHJlZDIodmFsMSwgdmFsMilfIHJldHVybnMgdHJ1ZSB8Cit8ICAuLi4gICAgICAgICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgIHwgLi4uICAgICAgICAgIHwKKworSW4gdGhlIGFib3ZlLCBfcHJlZG5fIGlzIGFuIF9uXy1hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIGZ1bmN0b3IsIHdoZXJlCitfdmFsMV8sIF92YWwyXywgLi4uLCBhbmQgX3ZhbG5fIGFyZSBpdHMgYXJndW1lbnRzLiBUaGUgYXNzZXJ0aW9uIHN1Y2NlZWRzCitpZiB0aGUgcHJlZGljYXRlIHJldHVybnMgYHRydWVgIHdoZW4gYXBwbGllZCB0byB0aGUgZ2l2ZW4gYXJndW1lbnRzLCBhbmQgZmFpbHMKK290aGVyd2lzZS4gV2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLCBpdCBwcmludHMgdGhlIHZhbHVlIG9mIGVhY2ggYXJndW1lbnQuIEluCitlaXRoZXIgY2FzZSwgdGhlIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4KKworSGVyZSdzIGFuIGV4YW1wbGUuIEdpdmVuCisKK2BgYAorLy8gUmV0dXJucyB0cnVlIGlmZiBtIGFuZCBuIGhhdmUgbm8gY29tbW9uIGRpdmlzb3JzIGV4Y2VwdCAxLgorYm9vbCBNdXR1YWxseVByaW1lKGludCBtLCBpbnQgbikgeyAuLi4gfQorY29uc3QgaW50IGEgPSAzOworY29uc3QgaW50IGIgPSA0OworY29uc3QgaW50IGMgPSAxMDsKK2BgYAorCit0aGUgYXNzZXJ0aW9uIGBFWFBFQ1RfUFJFRDIoTXV0dWFsbHlQcmltZSwgYSwgYik7YCB3aWxsIHN1Y2NlZWQsIHdoaWxlIHRoZQorYXNzZXJ0aW9uIGBFWFBFQ1RfUFJFRDIoTXV0dWFsbHlQcmltZSwgYiwgYyk7YCB3aWxsIGZhaWwgd2l0aCB0aGUgbWVzc2FnZQorCis8cHJlPgorIU11dHVhbGx5UHJpbWUoYiwgYykgaXMgZmFsc2UsIHdoZXJlPGJyPgorYiBpcyA0PGJyPgorYyBpcyAxMDxicj4KKzwvcHJlPgorCisqKk5vdGVzOioqCisKKyAgMS4gSWYgeW91IHNlZSBhIGNvbXBpbGVyIGVycm9yICJubyBtYXRjaGluZyBmdW5jdGlvbiB0byBjYWxsIiB3aGVuIHVzaW5nIGBBU1NFUlRfUFJFRCpgIG9yIGBFWFBFQ1RfUFJFRCpgLCBwbGVhc2Ugc2VlIFt0aGlzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzVfRkFRI1RoZV9jb21waWxlcl9jb21wbGFpbnNfJTIybm9fbWF0Y2hpbmdfZnVuY3Rpb25fdG9fY2FsbCUyMikgZm9yIGhvdyB0byByZXNvbHZlIGl0LgorICAxLiBDdXJyZW50bHkgd2Ugb25seSBwcm92aWRlIHByZWRpY2F0ZSBhc3NlcnRpb25zIG9mIGFyaXR5IDw9IDUuIElmIHlvdSBuZWVkIGEgaGlnaGVyLWFyaXR5IGFzc2VydGlvbiwgbGV0IHVzIGtub3cuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjCisKKyMjIyBVc2luZyBhIEZ1bmN0aW9uIFRoYXQgUmV0dXJucyBhbiBBc3NlcnRpb25SZXN1bHQgIyMjCisKK1doaWxlIGBFWFBFQ1RfUFJFRCooKWAgYW5kIGZyaWVuZHMgYXJlIGhhbmR5IGZvciBhIHF1aWNrIGpvYiwgdGhlCitzeW50YXggaXMgbm90IHNhdGlzZmFjdG9yeTogeW91IGhhdmUgdG8gdXNlIGRpZmZlcmVudCBtYWNyb3MgZm9yCitkaWZmZXJlbnQgYXJpdGllcywgYW5kIGl0IGZlZWxzIG1vcmUgbGlrZSBMaXNwIHRoYW4gQysrLiAgVGhlCitgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHRgIGNsYXNzIHNvbHZlcyB0aGlzIHByb2JsZW0uCisKK0FuIGBBc3NlcnRpb25SZXN1bHRgIG9iamVjdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYW4gYXNzZXJ0aW9uCisod2hldGhlciBpdCdzIGEgc3VjY2VzcyBvciBhIGZhaWx1cmUsIGFuZCBhbiBhc3NvY2lhdGVkIG1lc3NhZ2UpLiAgWW91CitjYW4gY3JlYXRlIGFuIGBBc3NlcnRpb25SZXN1bHRgIHVzaW5nIG9uZSBvZiB0aGVzZSBmYWN0b3J5CitmdW5jdGlvbnM6CisKK2BgYAorbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBSZXR1cm5zIGFuIEFzc2VydGlvblJlc3VsdCBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCBhbiBhc3NlcnRpb24gaGFzCisvLyBzdWNjZWVkZWQuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpOworCisvLyBSZXR1cm5zIGFuIEFzc2VydGlvblJlc3VsdCBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCBhbiBhc3NlcnRpb24gaGFzCisvLyBmYWlsZWQuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpOworCit9CitgYGAKKworWW91IGNhbiB0aGVuIHVzZSB0aGUgYDw8YCBvcGVyYXRvciB0byBzdHJlYW0gbWVzc2FnZXMgdG8gdGhlCitgQXNzZXJ0aW9uUmVzdWx0YCBvYmplY3QuCisKK1RvIHByb3ZpZGUgbW9yZSByZWFkYWJsZSBtZXNzYWdlcyBpbiBCb29sZWFuIGFzc2VydGlvbnMKKyhlLmcuIGBFWFBFQ1RfVFJVRSgpYCksIHdyaXRlIGEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucworYEFzc2VydGlvblJlc3VsdGAgaW5zdGVhZCBvZiBgYm9vbGAuIEZvciBleGFtcGxlLCBpZiB5b3UgZGVmaW5lCitgSXNFdmVuKClgIGFzOgorCitgYGAKKzo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihpbnQgbikgeworICBpZiAoKG4gJSAyKSA9PSAwKQorICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgZWxzZQorICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKK30KK2BgYAorCitpbnN0ZWFkIG9mOgorCitgYGAKK2Jvb2wgSXNFdmVuKGludCBuKSB7CisgIHJldHVybiAobiAlIDIpID09IDA7Cit9CitgYGAKKwordGhlIGZhaWxlZCBhc3NlcnRpb24gYEVYUEVDVF9UUlVFKElzRXZlbihGaWIoNCkpKWAgd2lsbCBwcmludDoKKworPHByZT4KK1ZhbHVlIG9mOiAhSXNFdmVuKEZpYig0KSk8YnI+CitBY3R1YWw6IGZhbHNlICgqMyBpcyBvZGQqKTxicj4KK0V4cGVjdGVkOiB0cnVlPGJyPgorPC9wcmU+CisKK2luc3RlYWQgb2YgYSBtb3JlIG9wYXF1ZQorCis8cHJlPgorVmFsdWUgb2Y6ICFJc0V2ZW4oRmliKDQpKTxicj4KK0FjdHVhbDogZmFsc2U8YnI+CitFeHBlY3RlZDogdHJ1ZTxicj4KKzwvcHJlPgorCitJZiB5b3Ugd2FudCBpbmZvcm1hdGl2ZSBtZXNzYWdlcyBpbiBgRVhQRUNUX0ZBTFNFYCBhbmQgYEFTU0VSVF9GQUxTRWAKK2FzIHdlbGwsIGFuZCBhcmUgZmluZSB3aXRoIG1ha2luZyB0aGUgcHJlZGljYXRlIHNsb3dlciBpbiB0aGUgc3VjY2VzcworY2FzZSwgeW91IGNhbiBzdXBwbHkgYSBzdWNjZXNzIG1lc3NhZ2U6CisKK2BgYAorOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7CisgIGlmICgobiAlIDIpID09IDApCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpIDw8IG4gPDwgIiBpcyBldmVuIjsKKyAgZWxzZQorICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKK30KK2BgYAorCitUaGVuIHRoZSBzdGF0ZW1lbnQgYEVYUEVDVF9GQUxTRShJc0V2ZW4oRmliKDYpKSlgIHdpbGwgcHJpbnQKKworPHByZT4KK1ZhbHVlIG9mOiAhSXNFdmVuKEZpYig2KSk8YnI+CitBY3R1YWw6IHRydWUgKDggaXMgZXZlbik8YnI+CitFeHBlY3RlZDogZmFsc2U8YnI+Cis8L3ByZT4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWM7IHNpbmNlIHZlcnNpb24gMS40LjEuCisKKyMjIyBVc2luZyBhIFByZWRpY2F0ZS1Gb3JtYXR0ZXIgIyMjCisKK0lmIHlvdSBmaW5kIHRoZSBkZWZhdWx0IG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IGAoQVNTRVJUfEVYUEVDVClfUFJFRCpgIGFuZAorYChBU1NFUlR8RVhQRUNUKV8oVFJVRXxGQUxTRSlgIHVuc2F0aXNmYWN0b3J5LCBvciBzb21lIGFyZ3VtZW50cyB0byB5b3VyCitwcmVkaWNhdGUgZG8gbm90IHN1cHBvcnQgc3RyZWFtaW5nIHRvIGBvc3RyZWFtYCwgeW91IGNhbiBpbnN0ZWFkIHVzZSB0aGUKK2ZvbGxvd2luZyBfcHJlZGljYXRlLWZvcm1hdHRlciBhc3NlcnRpb25zXyB0byBfZnVsbHlfIGN1c3RvbWl6ZSBob3cgdGhlCittZXNzYWdlIGlzIGZvcm1hdHRlZDoKKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9QUkVEX0ZPUk1BVDEoYF9wcmVkXF9mb3JtYXQxLCB2YWwxX2ApO2AgICAgICAgIHwgYEVYUEVDVF9QUkVEX0ZPUk1BVDEoYF9wcmVkXF9mb3JtYXQxLCB2YWwxX2ApOyB8IF9wcmVkXF9mb3JtYXQxKHZhbDEpXyBpcyBzdWNjZXNzZnVsIHwKK3wgYEFTU0VSVF9QUkVEX0ZPUk1BVDIoYF9wcmVkXF9mb3JtYXQyLCB2YWwxLCB2YWwyX2ApO2AgfCBgRVhQRUNUX1BSRURfRk9STUFUMihgX3ByZWRcX2Zvcm1hdDIsIHZhbDEsIHZhbDJfYCk7YCB8IF9wcmVkXF9mb3JtYXQyKHZhbDEsIHZhbDIpXyBpcyBzdWNjZXNzZnVsIHwKK3wgYC4uLmAgICAgICAgICAgICAgICB8IGAuLi5gICAgICAgICAgICAgICAgICAgfCBgLi4uYCAgICAgICAgfAorCitUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBwcmV2aW91cyB0d28gZ3JvdXBzIG9mIG1hY3JvcyBpcyB0aGF0IGluc3RlYWQgb2YKK2EgcHJlZGljYXRlLCBgKEFTU0VSVHxFWFBFQ1QpX1BSRURfRk9STUFUKmAgdGFrZSBhIF9wcmVkaWNhdGUtZm9ybWF0dGVyXworKF9wcmVkXF9mb3JtYXRuXyksIHdoaWNoIGlzIGEgZnVuY3Rpb24gb3IgZnVuY3RvciB3aXRoIHRoZSBzaWduYXR1cmU6CisKK2A6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkaWNhdGVGb3JtYXR0ZXJuKGNvbnN0IGNoYXIqIGBfZXhwcjFfYCwgY29uc3QgY2hhciogYF9leHByMl9gLCAuLi4gY29uc3QgY2hhciogYF9leHBybl9gLCBUMSBgX3ZhbDFfYCwgVDIgYF92YWwyX2AsIC4uLiBUbiBgX3ZhbG5fYCk7YAorCit3aGVyZSBfdmFsMV8sIF92YWwyXywgLi4uLCBhbmQgX3ZhbG5fIGFyZSB0aGUgdmFsdWVzIG9mIHRoZSBwcmVkaWNhdGUKK2FyZ3VtZW50cywgYW5kIF9leHByMV8sIF9leHByMl8sIC4uLiwgYW5kIF9leHBybl8gYXJlIHRoZSBjb3JyZXNwb25kaW5nCitleHByZXNzaW9ucyBhcyB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuIFRoZSB0eXBlcyBgVDFgLCBgVDJgLCAuLi4sIGFuZAorYFRuYCBjYW4gYmUgZWl0aGVyIHZhbHVlIHR5cGVzIG9yIHJlZmVyZW5jZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGlmIGFuCithcmd1bWVudCBoYXMgdHlwZSBgRm9vYCwgeW91IGNhbiBkZWNsYXJlIGl0IGFzIGVpdGhlciBgRm9vYCBvciBgY29uc3QgRm9vJmAsCit3aGljaGV2ZXIgaXMgYXBwcm9wcmlhdGUuCisKK0EgcHJlZGljYXRlLWZvcm1hdHRlciByZXR1cm5zIGEgYDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0YCBvYmplY3QgdG8gaW5kaWNhdGUKK3doZXRoZXIgdGhlIGFzc2VydGlvbiBoYXMgc3VjY2VlZGVkIG9yIG5vdC4gVGhlIG9ubHkgd2F5IHRvIGNyZWF0ZSBzdWNoIGFuCitvYmplY3QgaXMgdG8gY2FsbCBvbmUgb2YgdGhlc2UgZmFjdG9yeSBmdW5jdGlvbnM6CisKK0FzIGFuIGV4YW1wbGUsIGxldCdzIGltcHJvdmUgdGhlIGZhaWx1cmUgbWVzc2FnZSBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgd2hpY2ggdXNlcyBgRVhQRUNUX1BSRUQyKClgOgorCitgYGAKKy8vIFJldHVybnMgdGhlIHNtYWxsZXN0IHByaW1lIGNvbW1vbiBkaXZpc29yIG9mIG0gYW5kIG4sCisvLyBvciAxIHdoZW4gbSBhbmQgbiBhcmUgbXV0dWFsbHkgcHJpbWUuCitpbnQgU21hbGxlc3RQcmltZUNvbW1vbkRpdmlzb3IoaW50IG0sIGludCBuKSB7IC4uLiB9CisKKy8vIEEgcHJlZGljYXRlLWZvcm1hdHRlciBmb3IgYXNzZXJ0aW5nIHRoYXQgdHdvIGludGVnZXJzIGFyZSBtdXR1YWxseSBwcmltZS4KKzo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IEFzc2VydE11dHVhbGx5UHJpbWUoY29uc3QgY2hhciogbV9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbikgeworICBpZiAoTXV0dWFsbHlQcmltZShtLCBuKSkKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisgCisgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgbV9leHByIDw8ICIgYW5kICIgPDwgbl9leHByIDw8ICIgKCIgPDwgbSA8PCAiIGFuZCAiIDw8IG4KKyAgICAgIDw8ICIpIGFyZSBub3QgbXV0dWFsbHkgcHJpbWUsICIgPDwgImFzIHRoZXkgaGF2ZSBhIGNvbW1vbiBkaXZpc29yICIKKyAgICAgIDw8IFNtYWxsZXN0UHJpbWVDb21tb25EaXZpc29yKG0sIG4pOworfQorYGBgCisKK1dpdGggdGhpcyBwcmVkaWNhdGUtZm9ybWF0dGVyLCB3ZSBjYW4gdXNlCisKK2BgYAorRVhQRUNUX1BSRURfRk9STUFUMihBc3NlcnRNdXR1YWxseVByaW1lLCBiLCBjKTsKK2BgYAorCit0byBnZW5lcmF0ZSB0aGUgbWVzc2FnZQorCis8cHJlPgorYiBhbmQgYyAoNCBhbmQgMTApIGFyZSBub3QgbXV0dWFsbHkgcHJpbWUsIGFzIHRoZXkgaGF2ZSBhIGNvbW1vbiBkaXZpc29yIDIuPGJyPgorPC9wcmU+CisKK0FzIHlvdSBtYXkgaGF2ZSByZWFsaXplZCwgbWFueSBvZiB0aGUgYXNzZXJ0aW9ucyB3ZSBpbnRyb2R1Y2VkIGVhcmxpZXIgYXJlCitzcGVjaWFsIGNhc2VzIG9mIGAoRVhQRUNUfEFTU0VSVClfUFJFRF9GT1JNQVQqYC4gSW4gZmFjdCwgbW9zdCBvZiB0aGVtIGFyZQoraW5kZWVkIGRlZmluZWQgdXNpbmcgYChFWFBFQ1R8QVNTRVJUKV9QUkVEX0ZPUk1BVCpgLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworCisjIyBGbG9hdGluZy1Qb2ludCBDb21wYXJpc29uICMjCisKK0NvbXBhcmluZyBmbG9hdGluZy1wb2ludCBudW1iZXJzIGlzIHRyaWNreS4gRHVlIHRvIHJvdW5kLW9mZiBlcnJvcnMsIGl0IGlzCit2ZXJ5IHVubGlrZWx5IHRoYXQgdHdvIGZsb2F0aW5nLXBvaW50cyB3aWxsIG1hdGNoIGV4YWN0bHkuIFRoZXJlZm9yZSwKK2BBU1NFUlRfRVFgICdzIG5haXZlIGNvbXBhcmlzb24gdXN1YWxseSBkb2Vzbid0IHdvcmsuIEFuZCBzaW5jZSBmbG9hdGluZy1wb2ludHMKK2NhbiBoYXZlIGEgd2lkZSB2YWx1ZSByYW5nZSwgbm8gc2luZ2xlIGZpeGVkIGVycm9yIGJvdW5kIHdvcmtzLiBJdCdzIGJldHRlciB0bworY29tcGFyZSBieSBhIGZpeGVkIHJlbGF0aXZlIGVycm9yIGJvdW5kLCBleGNlcHQgZm9yIHZhbHVlcyBjbG9zZSB0byAwIGR1ZSB0bwordGhlIGxvc3Mgb2YgcHJlY2lzaW9uIHRoZXJlLgorCitJbiBnZW5lcmFsLCBmb3IgZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbiB0byBtYWtlIHNlbnNlLCB0aGUgdXNlciBuZWVkcyB0bworY2FyZWZ1bGx5IGNob29zZSB0aGUgZXJyb3IgYm91bmQuIElmIHRoZXkgZG9uJ3Qgd2FudCBvciBjYXJlIHRvLCBjb21wYXJpbmcgaW4KK3Rlcm1zIG9mIFVuaXRzIGluIHRoZSBMYXN0IFBsYWNlIChVTFBzKSBpcyBhIGdvb2QgZGVmYXVsdCwgYW5kIEdvb2dsZSBUZXN0Citwcm92aWRlcyBhc3NlcnRpb25zIHRvIGRvIHRoaXMuIEZ1bGwgZGV0YWlscyBhYm91dCBVTFBzIGFyZSBxdWl0ZSBsb25nOyBpZiB5b3UKK3dhbnQgdG8gbGVhcm4gbW9yZSwgc2VlCitbdGhpcyBhcnRpY2xlIG9uIGZsb2F0IGNvbXBhcmlzb25dKGh0dHA6Ly93d3cuY3lnbnVzLXNvZnR3YXJlLmNvbS9wYXBlcnMvY29tcGFyaW5nZmxvYXRzL2NvbXBhcmluZ2Zsb2F0cy5odG0pLgorCisjIyMgRmxvYXRpbmctUG9pbnQgTWFjcm9zICMjIworCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX0ZMT0FUX0VRKGBfZXhwZWN0ZWQsIGFjdHVhbF9gKTtgICB8IGBFWFBFQ1RfRkxPQVRfRVEoYF9leHBlY3RlZCwgYWN0dWFsX2ApO2AgfCB0aGUgdHdvIGBmbG9hdGAgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwgfAorfCBgQVNTRVJUX0RPVUJMRV9FUShgX2V4cGVjdGVkLCBhY3R1YWxfYCk7YCB8IGBFWFBFQ1RfRE9VQkxFX0VRKGBfZXhwZWN0ZWQsIGFjdHVhbF9gKTtgIHwgdGhlIHR3byBgZG91YmxlYCB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbCB8CisKK0J5ICJhbG1vc3QgZXF1YWwiLCB3ZSBtZWFuIHRoZSB0d28gdmFsdWVzIGFyZSB3aXRoaW4gNCBVTFAncyBmcm9tIGVhY2gKK290aGVyLgorCitUaGUgZm9sbG93aW5nIGFzc2VydGlvbnMgYWxsb3cgeW91IHRvIGNob29zZSB0aGUgYWNjZXB0YWJsZSBlcnJvciBib3VuZDoKKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9ORUFSKGBfdmFsMSwgdmFsMiwgYWJzXF9lcnJvcl9gKTtgIHwgYEVYUEVDVF9ORUFSYF8odmFsMSwgdmFsMiwgYWJzXF9lcnJvcl9gKTtgIHwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBfdmFsMV8gYW5kIF92YWwyXyBkb2Vzbid0IGV4Y2VlZCB0aGUgZ2l2ZW4gYWJzb2x1dGUgZXJyb3IgfAorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMjIEZsb2F0aW5nLVBvaW50IFByZWRpY2F0ZS1Gb3JtYXQgRnVuY3Rpb25zICMjIworCitTb21lIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXJlIHVzZWZ1bCwgYnV0IG5vdCB0aGF0IG9mdGVuIHVzZWQuIEluIG9yZGVyCit0byBhdm9pZCBhbiBleHBsb3Npb24gb2YgbmV3IG1hY3Jvcywgd2UgcHJvdmlkZSB0aGVtIGFzIHByZWRpY2F0ZS1mb3JtYXQKK2Z1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGluIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zIChlLmcuCitgRVhQRUNUX1BSRURfRk9STUFUMmAsIGV0YykuCisKK2BgYAorRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OkZsb2F0TEUsIHZhbDEsIHZhbDIpOworRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OkRvdWJsZUxFLCB2YWwxLCB2YWwyKTsKK2BgYAorCitWZXJpZmllcyB0aGF0IF92YWwxXyBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgX3ZhbDJfLiBZb3UgY2FuCityZXBsYWNlIGBFWFBFQ1RfUFJFRF9GT1JNQVQyYCBpbiB0aGUgYWJvdmUgdGFibGUgd2l0aCBgQVNTRVJUX1BSRURfRk9STUFUMmAuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBXaW5kb3dzIEhSRVNVTFQgYXNzZXJ0aW9ucyAjIworCitUaGVzZSBhc3NlcnRpb25zIHRlc3QgZm9yIGBIUkVTVUxUYCBzdWNjZXNzIG9yIGZhaWx1cmUuCisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoYF9leHByZXNzaW9uX2ApO2AgfCBgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKGBfZXhwcmVzc2lvbl9gKTtgIHwgX2V4cHJlc3Npb25fIGlzIGEgc3VjY2VzcyBgSFJFU1VMVGAgfAorfCBgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKGBfZXhwcmVzc2lvbl9gKTtgICAgIHwgYEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChgX2V4cHJlc3Npb25fYCk7YCAgICB8IF9leHByZXNzaW9uXyBpcyBhIGZhaWx1cmUgYEhSRVNVTFRgIHwKKworVGhlIGdlbmVyYXRlZCBvdXRwdXQgY29udGFpbnMgdGhlIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgYEhSRVNVTFRgIGNvZGUgcmV0dXJuZWQgYnkgX2V4cHJlc3Npb25fLgorCitZb3UgbWlnaHQgdXNlIHRoZW0gbGlrZSB0aGlzOgorCitgYGAKK0NDb21QdHIgc2hlbGw7CitBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoc2hlbGwuQ29DcmVhdGVJbnN0YW5jZShMIlNoZWxsLkFwcGxpY2F0aW9uIikpOworQ0NvbVZhcmlhbnQgZW1wdHk7CitBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoc2hlbGwtPlNoZWxsRXhlY3V0ZShDQ29tQlNUUih1cmwpLCBlbXB0eSwgZW1wdHksIGVtcHR5LCBlbXB0eSkpOworYGBgCisKK19BdmFpbGFiaWxpdHlfOiBXaW5kb3dzLgorCisjIyBUeXBlIEFzc2VydGlvbnMgIyMKKworWW91IGNhbiBjYWxsIHRoZSBmdW5jdGlvbgorYGBgCis6OnRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxUMSwgVDI+KCk7CitgYGAKK3RvIGFzc2VydCB0aGF0IHR5cGVzIGBUMWAgYW5kIGBUMmAgYXJlIHRoZSBzYW1lLiAgVGhlIGZ1bmN0aW9uIGRvZXMKK25vdGhpbmcgaWYgdGhlIGFzc2VydGlvbiBpcyBzYXRpc2ZpZWQuICBJZiB0aGUgdHlwZXMgYXJlIGRpZmZlcmVudCwKK3RoZSBmdW5jdGlvbiBjYWxsIHdpbGwgZmFpbCB0byBjb21waWxlLCBhbmQgdGhlIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2UKK3dpbGwgbGlrZWx5IChkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyKSBzaG93IHlvdSB0aGUgYWN0dWFsIHZhbHVlcyBvZgorYFQxYCBhbmQgYFQyYC4gIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBpbnNpZGUgdGVtcGxhdGUgY29kZS4KKworX0NhdmVhdDpfIFdoZW4gdXNlZCBpbnNpZGUgYSBtZW1iZXIgZnVuY3Rpb24gb2YgYSBjbGFzcyB0ZW1wbGF0ZSBvciBhCitmdW5jdGlvbiB0ZW1wbGF0ZSwgYFN0YXRpY0Fzc2VydFR5cGVFcTxUMSwgVDI+KClgIGlzIGVmZmVjdGl2ZSBfb25seSBpZl8KK3RoZSBmdW5jdGlvbiBpcyBpbnN0YW50aWF0ZWQuICBGb3IgZXhhbXBsZSwgZ2l2ZW46CitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBGb28geworIHB1YmxpYzoKKyAgdm9pZCBCYXIoKSB7IDo6dGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPGludCwgVD4oKTsgfQorfTsKK2BgYAordGhlIGNvZGU6CitgYGAKK3ZvaWQgVGVzdDEoKSB7IEZvbzxib29sPiBmb287IH0KK2BgYAord2lsbCBfbm90XyBnZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yLCBhcyBgRm9vPGJvb2w+OjpCYXIoKWAgaXMgbmV2ZXIKK2FjdHVhbGx5IGluc3RhbnRpYXRlZC4gIEluc3RlYWQsIHlvdSBuZWVkOgorYGBgCit2b2lkIFRlc3QyKCkgeyBGb288Ym9vbD4gZm9vOyBmb28uQmFyKCk7IH0KK2BgYAordG8gY2F1c2UgYSBjb21waWxlciBlcnJvci4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWM7IHNpbmNlIHZlcnNpb24gMS4zLjAuCisKKyMjIEFzc2VydGlvbiBQbGFjZW1lbnQgIyMKKworWW91IGNhbiB1c2UgYXNzZXJ0aW9ucyBpbiBhbnkgQysrIGZ1bmN0aW9uLiBJbiBwYXJ0aWN1bGFyLCBpdCBkb2Vzbid0CitoYXZlIHRvIGJlIGEgbWV0aG9kIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MuIFRoZSBvbmUgY29uc3RyYWludCBpcwordGhhdCBhc3NlcnRpb25zIHRoYXQgZ2VuZXJhdGUgYSBmYXRhbCBmYWlsdXJlIChgRkFJTCpgIGFuZCBgQVNTRVJUXypgKQorY2FuIG9ubHkgYmUgdXNlZCBpbiB2b2lkLXJldHVybmluZyBmdW5jdGlvbnMuIFRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZgorR29vZ2xlIFRlc3Qgbm90IHVzaW5nIGV4Y2VwdGlvbnMuIEJ5IHBsYWNpbmcgaXQgaW4gYSBub24tdm9pZCBmdW5jdGlvbgoreW91J2xsIGdldCBhIGNvbmZ1c2luZyBjb21waWxlIGVycm9yIGxpa2UKK2AiZXJyb3I6IHZvaWQgdmFsdWUgbm90IGlnbm9yZWQgYXMgaXQgb3VnaHQgdG8gYmUiYC4KKworSWYgeW91IG5lZWQgdG8gdXNlIGFzc2VydGlvbnMgaW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgbm9uLXZvaWQsIG9uZSBvcHRpb24KK2lzIHRvIG1ha2UgdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgaW4gYW4gb3V0IHBhcmFtZXRlciBpbnN0ZWFkLiBGb3IKK2V4YW1wbGUsIHlvdSBjYW4gcmV3cml0ZSBgVDIgRm9vKFQxIHgpYCB0byBgdm9pZCBGb28oVDEgeCwgVDIqIHJlc3VsdClgLiBZb3UKK25lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYCpyZXN1bHRgIGNvbnRhaW5zIHNvbWUgc2Vuc2libGUgdmFsdWUgZXZlbiB3aGVuIHRoZQorZnVuY3Rpb24gcmV0dXJucyBwcmVtYXR1cmVseS4gQXMgdGhlIGZ1bmN0aW9uIG5vdyByZXR1cm5zIGB2b2lkYCwgeW91IGNhbiB1c2UKK2FueSBhc3NlcnRpb24gaW5zaWRlIG9mIGl0LgorCitJZiBjaGFuZ2luZyB0aGUgZnVuY3Rpb24ncyB0eXBlIGlzIG5vdCBhbiBvcHRpb24sIHlvdSBzaG91bGQganVzdCB1c2UKK2Fzc2VydGlvbnMgdGhhdCBnZW5lcmF0ZSBub24tZmF0YWwgZmFpbHVyZXMsIHN1Y2ggYXMgYEFERF9GQUlMVVJFKmAgYW5kCitgRVhQRUNUXypgLgorCitfTm90ZV86IENvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIG5vdCBjb25zaWRlcmVkIHZvaWQtcmV0dXJuaW5nCitmdW5jdGlvbnMsIGFjY29yZGluZyB0byB0aGUgQysrIGxhbmd1YWdlIHNwZWNpZmljYXRpb24sIGFuZCBzbyB5b3UgbWF5IG5vdCB1c2UKK2ZhdGFsIGFzc2VydGlvbnMgaW4gdGhlbS4gWW91J2xsIGdldCBhIGNvbXBpbGF0aW9uIGVycm9yIGlmIHlvdSB0cnkuIEEgc2ltcGxlCit3b3JrYXJvdW5kIGlzIHRvIHRyYW5zZmVyIHRoZSBlbnRpcmUgYm9keSBvZiB0aGUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciB0byBhCitwcml2YXRlIHZvaWQtcmV0dXJuaW5nIG1ldGhvZC4gSG93ZXZlciwgeW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IGEgZmF0YWwKK2Fzc2VydGlvbiBmYWlsdXJlIGluIGEgY29uc3RydWN0b3IgZG9lcyBub3QgdGVybWluYXRlIHRoZSBjdXJyZW50IHRlc3QsIGFzIHlvdXIKK2ludHVpdGlvbiBtaWdodCBzdWdnZXN0OyBpdCBtZXJlbHkgcmV0dXJucyBmcm9tIHRoZSBjb25zdHJ1Y3RvciBlYXJseSwgcG9zc2libHkKK2xlYXZpbmcgeW91ciBvYmplY3QgaW4gYSBwYXJ0aWFsbHktY29uc3RydWN0ZWQgc3RhdGUuIExpa2V3aXNlLCBhIGZhdGFsCithc3NlcnRpb24gZmFpbHVyZSBpbiBhIGRlc3RydWN0b3IgbWF5IGxlYXZlIHlvdXIgb2JqZWN0IGluIGEKK3BhcnRpYWxseS1kZXN0cnVjdGVkIHN0YXRlLiBVc2UgYXNzZXJ0aW9ucyBjYXJlZnVsbHkgaW4gdGhlc2Ugc2l0dWF0aW9ucyEKKworIyBEZWF0aCBUZXN0cyAjCisKK0luIG1hbnkgYXBwbGljYXRpb25zLCB0aGVyZSBhcmUgYXNzZXJ0aW9ucyB0aGF0IGNhbiBjYXVzZSBhcHBsaWNhdGlvbiBmYWlsdXJlCitpZiBhIGNvbmRpdGlvbiBpcyBub3QgbWV0LiBUaGVzZSBzYW5pdHkgY2hlY2tzLCB3aGljaCBlbnN1cmUgdGhhdCB0aGUgcHJvZ3JhbQoraXMgaW4gYSBrbm93biBnb29kIHN0YXRlLCBhcmUgdGhlcmUgdG8gZmFpbCBhdCB0aGUgZWFybGllc3QgcG9zc2libGUgdGltZSBhZnRlcgorc29tZSBwcm9ncmFtIHN0YXRlIGlzIGNvcnJ1cHRlZC4gSWYgdGhlIGFzc2VydGlvbiBjaGVja3MgdGhlIHdyb25nIGNvbmRpdGlvbiwKK3RoZW4gdGhlIHByb2dyYW0gbWF5IHByb2NlZWQgaW4gYW4gZXJyb25lb3VzIHN0YXRlLCB3aGljaCBjb3VsZCBsZWFkIHRvIG1lbW9yeQorY29ycnVwdGlvbiwgc2VjdXJpdHkgaG9sZXMsIG9yIHdvcnNlLiBIZW5jZSBpdCBpcyB2aXRhbGx5IGltcG9ydGFudCB0byB0ZXN0Cit0aGF0IHN1Y2ggYXNzZXJ0aW9uIHN0YXRlbWVudHMgd29yayBhcyBleHBlY3RlZC4KKworU2luY2UgdGhlc2UgcHJlY29uZGl0aW9uIGNoZWNrcyBjYXVzZSB0aGUgcHJvY2Vzc2VzIHRvIGRpZSwgd2UgY2FsbCBzdWNoIHRlc3RzCitfZGVhdGggdGVzdHNfLiBNb3JlIGdlbmVyYWxseSwgYW55IHRlc3QgdGhhdCBjaGVja3MgdGhhdCBhIHByb2dyYW0gdGVybWluYXRlcworaW4gYW4gZXhwZWN0ZWQgZmFzaGlvbiBpcyBhbHNvIGEgZGVhdGggdGVzdC4KKworSWYgeW91IHdhbnQgdG8gdGVzdCBgRVhQRUNUXyooKS9BU1NFUlRfKigpYCBmYWlsdXJlcyBpbiB5b3VyIHRlc3QgY29kZSwgc2VlIFtDYXRjaGluZyBGYWlsdXJlc10oI0NhdGNoaW5nX0ZhaWx1cmVzLm1kKS4KKworIyMgSG93IHRvIFdyaXRlIGEgRGVhdGggVGVzdCAjIworCitHb29nbGUgVGVzdCBoYXMgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gc3VwcG9ydCBkZWF0aCB0ZXN0czoKKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9ERUFUSChgX3N0YXRlbWVudCwgcmVnZXhfYCk7IHwgYEVYUEVDVF9ERUFUSChgX3N0YXRlbWVudCwgcmVnZXhfYCk7IHwgX3N0YXRlbWVudF8gY3Jhc2hlcyB3aXRoIHRoZSBnaXZlbiBlcnJvciB8Cit8IGBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKGBfc3RhdGVtZW50LCByZWdleF9gKTsgfCBgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChgX3N0YXRlbWVudCwgcmVnZXhfYCk7IHwgaWYgZGVhdGggdGVzdHMgYXJlIHN1cHBvcnRlZCwgdmVyaWZpZXMgdGhhdCBfc3RhdGVtZW50XyBjcmFzaGVzIHdpdGggdGhlIGdpdmVuIGVycm9yOyBvdGhlcndpc2UgdmVyaWZpZXMgbm90aGluZyB8Cit8IGBBU1NFUlRfRVhJVChgX3N0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleF9gKTsgfCBgRVhQRUNUX0VYSVQoYF9zdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXhfYCk7IHxfc3RhdGVtZW50XyBleGl0cyB3aXRoIHRoZSBnaXZlbiBlcnJvciBhbmQgaXRzIGV4aXQgY29kZSBtYXRjaGVzIF9wcmVkaWNhdGVfIHwKKword2hlcmUgX3N0YXRlbWVudF8gaXMgYSBzdGF0ZW1lbnQgdGhhdCBpcyBleHBlY3RlZCB0byBjYXVzZSB0aGUgcHJvY2VzcyB0bworZGllLCBfcHJlZGljYXRlXyBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0aW9uIG9iamVjdCB0aGF0IGV2YWx1YXRlcyBhbiBpbnRlZ2VyCitleGl0IHN0YXR1cywgYW5kIF9yZWdleF8gaXMgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB0aGUgc3RkZXJyIG91dHB1dCBvZgorX3N0YXRlbWVudF8gaXMgZXhwZWN0ZWQgdG8gbWF0Y2guIE5vdGUgdGhhdCBfc3RhdGVtZW50XyBjYW4gYmUgX2FueSB2YWxpZAorc3RhdGVtZW50XyAoaW5jbHVkaW5nIF9jb21wb3VuZCBzdGF0ZW1lbnRfKSBhbmQgZG9lc24ndCBoYXZlIHRvIGJlIGFuCitleHByZXNzaW9uLgorCitBcyB1c3VhbCwgdGhlIGBBU1NFUlRgIHZhcmlhbnRzIGFib3J0IHRoZSBjdXJyZW50IHRlc3QgZnVuY3Rpb24sIHdoaWxlIHRoZQorYEVYUEVDVGAgdmFyaWFudHMgZG8gbm90LgorCisqKk5vdGU6KiogV2UgdXNlIHRoZSB3b3JkICJjcmFzaCIgaGVyZSB0byBtZWFuIHRoYXQgdGhlIHByb2Nlc3MKK3Rlcm1pbmF0ZXMgd2l0aCBhIF9ub24temVyb18gZXhpdCBzdGF0dXMgY29kZS4gIFRoZXJlIGFyZSB0d28KK3Bvc3NpYmlsaXRpZXM6IGVpdGhlciB0aGUgcHJvY2VzcyBoYXMgY2FsbGVkIGBleGl0KClgIG9yIGBfZXhpdCgpYAord2l0aCBhIG5vbi16ZXJvIHZhbHVlLCBvciBpdCBtYXkgYmUga2lsbGVkIGJ5IGEgc2lnbmFsLgorCitUaGlzIG1lYW5zIHRoYXQgaWYgX3N0YXRlbWVudF8gdGVybWluYXRlcyB0aGUgcHJvY2VzcyB3aXRoIGEgMCBleGl0Citjb2RlLCBpdCBpcyBfbm90XyBjb25zaWRlcmVkIGEgY3Jhc2ggYnkgYEVYUEVDVF9ERUFUSGAuICBVc2UKK2BFWFBFQ1RfRVhJVGAgaW5zdGVhZCBpZiB0aGlzIGlzIHRoZSBjYXNlLCBvciBpZiB5b3Ugd2FudCB0byByZXN0cmljdAordGhlIGV4aXQgY29kZSBtb3JlIHByZWNpc2VseS4KKworQSBwcmVkaWNhdGUgaGVyZSBtdXN0IGFjY2VwdCBhbiBgaW50YCBhbmQgcmV0dXJuIGEgYGJvb2xgLiBUaGUgZGVhdGggdGVzdAorc3VjY2VlZHMgb25seSBpZiB0aGUgcHJlZGljYXRlIHJldHVybnMgYHRydWVgLiBHb29nbGUgVGVzdCBkZWZpbmVzIGEgZmV3CitwcmVkaWNhdGVzIHRoYXQgaGFuZGxlIHRoZSBtb3N0IGNvbW1vbiBjYXNlczoKKworYGBgCis6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKGV4aXRfY29kZSkKK2BgYAorCitUaGlzIGV4cHJlc3Npb24gaXMgYHRydWVgIGlmIHRoZSBwcm9ncmFtIGV4aXRlZCBub3JtYWxseSB3aXRoIHRoZSBnaXZlbiBleGl0Citjb2RlLgorCitgYGAKKzo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoc2lnbmFsX251bWJlcikgIC8vIE5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KK2BgYAorCitUaGlzIGV4cHJlc3Npb24gaXMgYHRydWVgIGlmIHRoZSBwcm9ncmFtIHdhcyBraWxsZWQgYnkgdGhlIGdpdmVuIHNpZ25hbC4KKworVGhlIGAqX0RFQVRIYCBtYWNyb3MgYXJlIGNvbnZlbmllbnQgd3JhcHBlcnMgZm9yIGAqX0VYSVRgIHRoYXQgdXNlIGEgcHJlZGljYXRlCit0aGF0IHZlcmlmaWVzIHRoZSBwcm9jZXNzJyBleGl0IGNvZGUgaXMgbm9uLXplcm8uCisKK05vdGUgdGhhdCBhIGRlYXRoIHRlc3Qgb25seSBjYXJlcyBhYm91dCB0aHJlZSB0aGluZ3M6CisKKyAgMS4gZG9lcyBfc3RhdGVtZW50XyBhYm9ydCBvciBleGl0IHRoZSBwcm9jZXNzPworICAxLiAoaW4gdGhlIGNhc2Ugb2YgYEFTU0VSVF9FWElUYCBhbmQgYEVYUEVDVF9FWElUYCkgZG9lcyB0aGUgZXhpdCBzdGF0dXMgc2F0aXNmeSBfcHJlZGljYXRlXz8gIE9yIChpbiB0aGUgY2FzZSBvZiBgQVNTRVJUX0RFQVRIYCBhbmQgYEVYUEVDVF9ERUFUSGApIGlzIHRoZSBleGl0IHN0YXR1cyBub24temVybz8gIEFuZAorICAxLiBkb2VzIHRoZSBzdGRlcnIgb3V0cHV0IG1hdGNoIF9yZWdleF8/CisKK0luIHBhcnRpY3VsYXIsIGlmIF9zdGF0ZW1lbnRfIGdlbmVyYXRlcyBhbiBgQVNTRVJUXypgIG9yIGBFWFBFQ1RfKmAgZmFpbHVyZSwgaXQgd2lsbCAqKm5vdCoqIGNhdXNlIHRoZSBkZWF0aCB0ZXN0IHRvIGZhaWwsIGFzIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgZG9uJ3QgYWJvcnQgdGhlIHByb2Nlc3MuCisKK1RvIHdyaXRlIGEgZGVhdGggdGVzdCwgc2ltcGx5IHVzZSBvbmUgb2YgdGhlIGFib3ZlIG1hY3JvcyBpbnNpZGUgeW91ciB0ZXN0CitmdW5jdGlvbi4gRm9yIGV4YW1wbGUsCisKK2BgYAorVEVTVChNeSpEZWF0aFRlc3QqLCBGb28pIHsKKyAgLy8gVGhpcyBkZWF0aCB0ZXN0IHVzZXMgYSBjb21wb3VuZCBzdGF0ZW1lbnQuCisgIEFTU0VSVF9ERUFUSCh7IGludCBuID0gNTsgRm9vKCZuKTsgfSwgIkVycm9yIG9uIGxpbmUgLiogb2YgRm9vKCkiKTsKK30KK1RFU1QoTXlEZWF0aFRlc3QsIE5vcm1hbEV4aXQpIHsKKyAgRVhQRUNUX0VYSVQoTm9ybWFsRXhpdCgpLCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiU3VjY2VzcyIpOworfQorVEVTVChNeURlYXRoVGVzdCwgS2lsbE15c2VsZikgeworICBFWFBFQ1RfRVhJVChLaWxsTXlzZWxmKCksIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHS0lMTCksICJTZW5kaW5nIG15c2VsZiB1bmJsb2NrYWJsZSBzaWduYWwiKTsKK30KK2BgYAorCit2ZXJpZmllcyB0aGF0OgorCisgICogY2FsbGluZyBgRm9vKDUpYCBjYXVzZXMgdGhlIHByb2Nlc3MgdG8gZGllIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UsCisgICogY2FsbGluZyBgTm9ybWFsRXhpdCgpYCBjYXVzZXMgdGhlIHByb2Nlc3MgdG8gcHJpbnQgYCJTdWNjZXNzImAgdG8gc3RkZXJyIGFuZCBleGl0IHdpdGggZXhpdCBjb2RlIDAsIGFuZAorICAqIGNhbGxpbmcgYEtpbGxNeXNlbGYoKWAga2lsbHMgdGhlIHByb2Nlc3Mgd2l0aCBzaWduYWwgYFNJR0tJTExgLgorCitUaGUgdGVzdCBmdW5jdGlvbiBib2R5IG1heSBjb250YWluIG90aGVyIGFzc2VydGlvbnMgYW5kIHN0YXRlbWVudHMgYXMgd2VsbCwgaWYKK25lY2Vzc2FyeS4KKworX0ltcG9ydGFudDpfIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB5b3UgdG8gZm9sbG93IHRoZSBjb252ZW50aW9uIG9mIG5hbWluZyB5b3VyCit0ZXN0IGNhc2UgKG5vdCB0ZXN0KSBgKkRlYXRoVGVzdGAgd2hlbiBpdCBjb250YWlucyBhIGRlYXRoIHRlc3QsIGFzCitkZW1vbnN0cmF0ZWQgaW4gdGhlIGFib3ZlIGV4YW1wbGUuIFRoZSBgRGVhdGggVGVzdHMgQW5kIFRocmVhZHNgIHNlY3Rpb24gYmVsb3cKK2V4cGxhaW5zIHdoeS4KKworSWYgYSB0ZXN0IGZpeHR1cmUgY2xhc3MgaXMgc2hhcmVkIGJ5IG5vcm1hbCB0ZXN0cyBhbmQgZGVhdGggdGVzdHMsIHlvdQorY2FuIHVzZSB0eXBlZGVmIHRvIGludHJvZHVjZSBhbiBhbGlhcyBmb3IgdGhlIGZpeHR1cmUgY2xhc3MgYW5kIGF2b2lkCitkdXBsaWNhdGluZyBpdHMgY29kZToKK2BgYAorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeyAuLi4gfTsKKwordHlwZWRlZiBGb29UZXN0IEZvb0RlYXRoVGVzdDsKKworVEVTVF9GKEZvb1Rlc3QsIERvZXNUaGlzKSB7CisgIC8vIG5vcm1hbCB0ZXN0Cit9CisKK1RFU1RfRihGb29EZWF0aFRlc3QsIERvZXNUaGF0KSB7CisgIC8vIGRlYXRoIHRlc3QKK30KK2BgYAorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MgKHJlcXVpcmVzIE1TVkMgOC4wIG9yIGFib3ZlKSwgQ3lnd2luLCBhbmQgTWFjICh0aGUgbGF0dGVyIHRocmVlIGFyZSBzdXBwb3J0ZWQgc2luY2UgdjEuMy4wKS4gIGAoQVNTRVJUfEVYUEVDVClfREVBVEhfSUZfU1VQUE9SVEVEYCBhcmUgbmV3IGluIHYxLjQuMC4KKworIyMgUmVndWxhciBFeHByZXNzaW9uIFN5bnRheCAjIworCitPbiBQT1NJWCBzeXN0ZW1zIChlLmcuIExpbnV4LCBDeWd3aW4sIGFuZCBNYWMpLCBHb29nbGUgVGVzdCB1c2VzIHRoZQorW1BPU0lYIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbl0oaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Jhc2VkZWZzL3hiZF9jaGFwMDkuaHRtbCN0YWdfMDlfMDQpCitzeW50YXggaW4gZGVhdGggdGVzdHMuIFRvIGxlYXJuIGFib3V0IHRoaXMgc3ludGF4LCB5b3UgbWF5IHdhbnQgdG8gcmVhZCB0aGlzIFtXaWtpcGVkaWEgZW50cnldKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uI1BPU0lYX0V4dGVuZGVkX1JlZ3VsYXJfRXhwcmVzc2lvbnMpLgorCitPbiBXaW5kb3dzLCBHb29nbGUgVGVzdCB1c2VzIGl0cyBvd24gc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbgoraW1wbGVtZW50YXRpb24uIEl0IGxhY2tzIG1hbnkgZmVhdHVyZXMgeW91IGNhbiBmaW5kIGluIFBPU0lYIGV4dGVuZGVkCityZWd1bGFyIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGUsIHdlIGRvbid0IHN1cHBvcnQgdW5pb24gKGAieHx5ImApLAorZ3JvdXBpbmcgKGAiKHh5KSJgKSwgYnJhY2tldHMgKGAiW3h5XSJgKSwgYW5kIHJlcGV0aXRpb24gY291bnQKKyhgInh7NSw3fSJgKSwgYW1vbmcgb3RoZXJzLiBCZWxvdyBpcyB3aGF0IHdlIGRvIHN1cHBvcnQgKGBBYCBkZW5vdGVzIGEKK2xpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKGAuYCksIG9yIGEgc2luZ2xlIGBcXGAgZXNjYXBlIHNlcXVlbmNlOyBgeGAKK2FuZCBgeWAgZGVub3RlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuKToKKworfCBgY2AgfCBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBgY2AgfAorfDotLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgXFxkYCB8IG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQgICAgICAgICB8Cit8IGBcXERgIHwgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQncyBub3QgYSBkZWNpbWFsIGRpZ2l0IHwKK3wgYFxcZmAgfCBtYXRjaGVzIGBcZmAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgXFxuYCB8IG1hdGNoZXMgYFxuYCAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBcXHJgIHwgbWF0Y2hlcyBgXHJgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYFxcc2AgfCBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgYFxuYCB8Cit8IGBcXFNgIHwgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQncyBub3QgYSB3aGl0ZXNwYWNlIHwKK3wgYFxcdGAgfCBtYXRjaGVzIGBcdGAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgXFx2YCB8IG1hdGNoZXMgYFx2YCAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBcXHdgIHwgbWF0Y2hlcyBhbnkgbGV0dGVyLCBgX2AsIG9yIGRlY2ltYWwgZGlnaXQgfAorfCBgXFxXYCB8IG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IGBcXHdgIGRvZXNuJ3QgbWF0Y2ggfAorfCBgXFxjYCB8IG1hdGNoZXMgYW55IGxpdGVyYWwgY2hhcmFjdGVyIGBjYCwgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uIHwKK3wgYC5gIHwgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgYFxuYCB8Cit8IGBBP2AgfCBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBgQWAgfAorfCBgQSpgIHwgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgYEFgIHwKK3wgYEErYCB8IG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIGBBYCB8Cit8IGBeYCB8IG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKSB8Cit8IGAkYCB8IG1hdGNoZXMgdGhlIGVuZCBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKSB8Cit8IGB4eWAgfCBtYXRjaGVzIGB4YCBmb2xsb3dlZCBieSBgeWAgICAgICAgfAorCitUbyBoZWxwIHlvdSBkZXRlcm1pbmUgd2hpY2ggY2FwYWJpbGl0eSBpcyBhdmFpbGFibGUgb24geW91ciBzeXN0ZW0sCitHb29nbGUgVGVzdCBkZWZpbmVzIG1hY3JvIGBHVEVTVF9VU0VTX1BPU0lYX1JFPTFgIHdoZW4gaXQgdXNlcyBQT1NJWAorZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucywgb3IgYEdURVNUX1VTRVNfU0lNUExFX1JFPTFgIHdoZW4gaXQgdXNlcwordGhlIHNpbXBsZSB2ZXJzaW9uLiAgSWYgeW91IHdhbnQgeW91ciBkZWF0aCB0ZXN0cyB0byB3b3JrIGluIGJvdGgKK2Nhc2VzLCB5b3UgY2FuIGVpdGhlciBgI2lmYCBvbiB0aGVzZSBtYWNyb3Mgb3IgdXNlIHRoZSBtb3JlIGxpbWl0ZWQKK3N5bnRheCBvbmx5LgorCisjIyBIb3cgSXQgV29ya3MgIyMKKworVW5kZXIgdGhlIGhvb2QsIGBBU1NFUlRfRVhJVCgpYCBzcGF3bnMgYSBuZXcgcHJvY2VzcyBhbmQgZXhlY3V0ZXMgdGhlCitkZWF0aCB0ZXN0IHN0YXRlbWVudCBpbiB0aGF0IHByb2Nlc3MuIFRoZSBkZXRhaWxzIG9mIG9mIGhvdyBwcmVjaXNlbHkKK3RoYXQgaGFwcGVucyBkZXBlbmQgb24gdGhlIHBsYXRmb3JtIGFuZCB0aGUgdmFyaWFibGUKK2A6OnRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSlgICh3aGljaCBpcyBpbml0aWFsaXplZCBmcm9tIHRoZQorY29tbWFuZC1saW5lIGZsYWcgYC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZWApLgorCisgICogT24gUE9TSVggc3lzdGVtcywgYGZvcmsoKWAgKG9yIGBjbG9uZSgpYCBvbiBMaW51eCkgaXMgdXNlZCB0byBzcGF3biB0aGUgY2hpbGQsIGFmdGVyIHdoaWNoOgorICAgICogSWYgdGhlIHZhcmlhYmxlJ3MgdmFsdWUgaXMgYCJmYXN0ImAsIHRoZSBkZWF0aCB0ZXN0IHN0YXRlbWVudCBpcyBpbW1lZGlhdGVseSBleGVjdXRlZC4KKyAgICAqIElmIHRoZSB2YXJpYWJsZSdzIHZhbHVlIGlzIGAidGhyZWFkc2FmZSJgLCB0aGUgY2hpbGQgcHJvY2VzcyByZS1leGVjdXRlcyB0aGUgdW5pdCB0ZXN0IGJpbmFyeSBqdXN0IGFzIGl0IHdhcyBvcmlnaW5hbGx5IGludm9rZWQsIGJ1dCB3aXRoIHNvbWUgZXh0cmEgZmxhZ3MgdG8gY2F1c2UganVzdCB0aGUgc2luZ2xlIGRlYXRoIHRlc3QgdW5kZXIgY29uc2lkZXJhdGlvbiB0byBiZSBydW4uCisgICogT24gV2luZG93cywgdGhlIGNoaWxkIGlzIHNwYXduZWQgdXNpbmcgdGhlIGBDcmVhdGVQcm9jZXNzKClgIEFQSSwgYW5kIHJlLWV4ZWN1dGVzIHRoZSBiaW5hcnkgdG8gY2F1c2UganVzdCB0aGUgc2luZ2xlIGRlYXRoIHRlc3QgdW5kZXIgY29uc2lkZXJhdGlvbiB0byBiZSBydW4gLSBtdWNoIGxpa2UgdGhlIGB0aHJlYWRzYWZlYCBtb2RlIG9uIFBPU0lYLgorCitPdGhlciB2YWx1ZXMgZm9yIHRoZSB2YXJpYWJsZSBhcmUgaWxsZWdhbCBhbmQgd2lsbCBjYXVzZSB0aGUgZGVhdGggdGVzdCB0bworZmFpbC4gQ3VycmVudGx5LCB0aGUgZmxhZydzIGRlZmF1bHQgdmFsdWUgaXMgYCJmYXN0ImAuIEhvd2V2ZXIsIHdlIHJlc2VydmUgdGhlCityaWdodCB0byBjaGFuZ2UgaXQgaW4gdGhlIGZ1dHVyZS4gVGhlcmVmb3JlLCB5b3VyIHRlc3RzIHNob3VsZCBub3QgZGVwZW5kIG9uCit0aGlzLgorCitJbiBlaXRoZXIgY2FzZSwgdGhlIHBhcmVudCBwcm9jZXNzIHdhaXRzIGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBjb21wbGV0ZSwgYW5kIGNoZWNrcyB0aGF0CisKKyAgMS4gdGhlIGNoaWxkJ3MgZXhpdCBzdGF0dXMgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUsIGFuZAorICAxLiB0aGUgY2hpbGQncyBzdGRlcnIgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLgorCitJZiB0aGUgZGVhdGggdGVzdCBzdGF0ZW1lbnQgcnVucyB0byBjb21wbGV0aW9uIHdpdGhvdXQgZHlpbmcsIHRoZSBjaGlsZAorcHJvY2VzcyB3aWxsIG5vbmV0aGVsZXNzIHRlcm1pbmF0ZSwgYW5kIHRoZSBhc3NlcnRpb24gZmFpbHMuCisKKyMjIERlYXRoIFRlc3RzIEFuZCBUaHJlYWRzICMjCisKK1RoZSByZWFzb24gZm9yIHRoZSB0d28gZGVhdGggdGVzdCBzdHlsZXMgaGFzIHRvIGRvIHdpdGggdGhyZWFkIHNhZmV0eS4gRHVlIHRvCit3ZWxsLWtub3duIHByb2JsZW1zIHdpdGggZm9ya2luZyBpbiB0aGUgcHJlc2VuY2Ugb2YgdGhyZWFkcywgZGVhdGggdGVzdHMgc2hvdWxkCitiZSBydW4gaW4gYSBzaW5nbGUtdGhyZWFkZWQgY29udGV4dC4gU29tZXRpbWVzLCBob3dldmVyLCBpdCBpc24ndCBmZWFzaWJsZSB0bworYXJyYW5nZSB0aGF0IGtpbmQgb2YgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBzdGF0aWNhbGx5LWluaXRpYWxpemVkIG1vZHVsZXMKK21heSBzdGFydCB0aHJlYWRzIGJlZm9yZSBtYWluIGlzIGV2ZXIgcmVhY2hlZC4gT25jZSB0aHJlYWRzIGhhdmUgYmVlbiBjcmVhdGVkLAoraXQgbWF5IGJlIGRpZmZpY3VsdCBvciBpbXBvc3NpYmxlIHRvIGNsZWFuIHRoZW0gdXAuCisKK0dvb2dsZSBUZXN0IGhhcyB0aHJlZSBmZWF0dXJlcyBpbnRlbmRlZCB0byByYWlzZSBhd2FyZW5lc3Mgb2YgdGhyZWFkaW5nIGlzc3Vlcy4KKworICAxLiBBIHdhcm5pbmcgaXMgZW1pdHRlZCBpZiBtdWx0aXBsZSB0aHJlYWRzIGFyZSBydW5uaW5nIHdoZW4gYSBkZWF0aCB0ZXN0IGlzIGVuY291bnRlcmVkLgorICAxLiBUZXN0IGNhc2VzIHdpdGggYSBuYW1lIGVuZGluZyBpbiAiRGVhdGhUZXN0IiBhcmUgcnVuIGJlZm9yZSBhbGwgb3RoZXIgdGVzdHMuCisgIDEuIEl0IHVzZXMgYGNsb25lKClgIGluc3RlYWQgb2YgYGZvcmsoKWAgdG8gc3Bhd24gdGhlIGNoaWxkIHByb2Nlc3Mgb24gTGludXggKGBjbG9uZSgpYCBpcyBub3QgYXZhaWxhYmxlIG9uIEN5Z3dpbiBhbmQgTWFjKSwgYXMgYGZvcmsoKWAgaXMgbW9yZSBsaWtlbHkgdG8gY2F1c2UgdGhlIGNoaWxkIHRvIGhhbmcgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgaGFzIG11bHRpcGxlIHRocmVhZHMuCisKK0l0J3MgcGVyZmVjdGx5IGZpbmUgdG8gY3JlYXRlIHRocmVhZHMgaW5zaWRlIGEgZGVhdGggdGVzdCBzdGF0ZW1lbnQ7IHRoZXkgYXJlCitleGVjdXRlZCBpbiBhIHNlcGFyYXRlIHByb2Nlc3MgYW5kIGNhbm5vdCBhZmZlY3QgdGhlIHBhcmVudC4KKworIyMgRGVhdGggVGVzdCBTdHlsZXMgIyMKKworVGhlICJ0aHJlYWRzYWZlIiBkZWF0aCB0ZXN0IHN0eWxlIHdhcyBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGhlbHAgbWl0aWdhdGUgdGhlCityaXNrcyBvZiB0ZXN0aW5nIGluIGEgcG9zc2libHkgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudC4gSXQgdHJhZGVzIGluY3JlYXNlZAordGVzdCBleGVjdXRpb24gdGltZSAocG90ZW50aWFsbHkgZHJhbWF0aWNhbGx5IHNvKSBmb3IgaW1wcm92ZWQgdGhyZWFkIHNhZmV0eS4KK1dlIHN1Z2dlc3QgdXNpbmcgdGhlIGZhc3RlciwgZGVmYXVsdCAiZmFzdCIgc3R5bGUgdW5sZXNzIHlvdXIgdGVzdCBoYXMgc3BlY2lmaWMKK3Byb2JsZW1zIHdpdGggaXQuCisKK1lvdSBjYW4gY2hvb3NlIGEgcGFydGljdWxhciBzdHlsZSBvZiBkZWF0aCB0ZXN0cyBieSBzZXR0aW5nIHRoZSBmbGFnCitwcm9ncmFtbWF0aWNhbGx5OgorCitgYGAKKzo6dGVzdGluZzo6RkxBR1NfZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSA9ICJ0aHJlYWRzYWZlIjsKK2BgYAorCitZb3UgY2FuIGRvIHRoaXMgaW4gYG1haW4oKWAgdG8gc2V0IHRoZSBzdHlsZSBmb3IgYWxsIGRlYXRoIHRlc3RzIGluIHRoZQorYmluYXJ5LCBvciBpbiBpbmRpdmlkdWFsIHRlc3RzLiBSZWNhbGwgdGhhdCBmbGFncyBhcmUgc2F2ZWQgYmVmb3JlIHJ1bm5pbmcgZWFjaAordGVzdCBhbmQgcmVzdG9yZWQgYWZ0ZXJ3YXJkcywgc28geW91IG5lZWQgbm90IGRvIHRoYXQgeW91cnNlbGYuIEZvciBleGFtcGxlOgorCitgYGAKK1RFU1QoTXlEZWF0aFRlc3QsIFRlc3RPbmUpIHsKKyAgOjp0ZXN0aW5nOjpGTEFHU19ndGVzdF9kZWF0aF90ZXN0X3N0eWxlID0gInRocmVhZHNhZmUiOworICAvLyBUaGlzIHRlc3QgaXMgcnVuIGluIHRoZSAidGhyZWFkc2FmZSIgc3R5bGU6CisgIEFTU0VSVF9ERUFUSChUaGlzU2hvdWxkRGllKCksICIiKTsKK30KKworVEVTVChNeURlYXRoVGVzdCwgVGVzdFR3bykgeworICAvLyBUaGlzIHRlc3QgaXMgcnVuIGluIHRoZSAiZmFzdCIgc3R5bGU6CisgIEFTU0VSVF9ERUFUSChUaGlzU2hvdWxkRGllKCksICIiKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAiZmFzdCI7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CitgYGAKKworIyMgQ2F2ZWF0cyAjIworCitUaGUgX3N0YXRlbWVudF8gYXJndW1lbnQgb2YgYEFTU0VSVF9FWElUKClgIGNhbiBiZSBhbnkgdmFsaWQgQysrIHN0YXRlbWVudAorZXhjZXB0IHRoYXQgaXQgY2FuIG5vdCByZXR1cm4gZnJvbSB0aGUgY3VycmVudCBmdW5jdGlvbi4gVGhpcyBtZWFucworX3N0YXRlbWVudF8gc2hvdWxkIG5vdCBjb250YWluIGByZXR1cm5gIG9yIGEgbWFjcm8gdGhhdCBtaWdodCByZXR1cm4gKGUuZy4KK2BBU1NFUlRfVFJVRSgpYCApLiBJZiBfc3RhdGVtZW50XyByZXR1cm5zIGJlZm9yZSBpdCBjcmFzaGVzLCBHb29nbGUgVGVzdCB3aWxsCitwcmludCBhbiBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIHRlc3Qgd2lsbCBmYWlsLgorCitTaW5jZSBfc3RhdGVtZW50XyBydW5zIGluIHRoZSBjaGlsZCBwcm9jZXNzLCBhbnkgaW4tbWVtb3J5IHNpZGUgZWZmZWN0IChlLmcuCittb2RpZnlpbmcgYSB2YXJpYWJsZSwgcmVsZWFzaW5nIG1lbW9yeSwgZXRjKSBpdCBjYXVzZXMgd2lsbCBfbm90XyBiZSBvYnNlcnZhYmxlCitpbiB0aGUgcGFyZW50IHByb2Nlc3MuIEluIHBhcnRpY3VsYXIsIGlmIHlvdSByZWxlYXNlIG1lbW9yeSBpbiBhIGRlYXRoIHRlc3QsCit5b3VyIHByb2dyYW0gd2lsbCBmYWlsIHRoZSBoZWFwIGNoZWNrIGFzIHRoZSBwYXJlbnQgcHJvY2VzcyB3aWxsIG5ldmVyIHNlZSB0aGUKK21lbW9yeSByZWNsYWltZWQuIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgeW91IGNhbgorCisgIDEuIHRyeSBub3QgdG8gZnJlZSBtZW1vcnkgaW4gYSBkZWF0aCB0ZXN0OworICAxLiBmcmVlIHRoZSBtZW1vcnkgYWdhaW4gaW4gdGhlIHBhcmVudCBwcm9jZXNzOyBvcgorICAxLiBkbyBub3QgdXNlIHRoZSBoZWFwIGNoZWNrZXIgaW4geW91ciBwcm9ncmFtLgorCitEdWUgdG8gYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCB5b3UgY2Fubm90IHBsYWNlIG11bHRpcGxlIGRlYXRoIHRlc3QKK2Fzc2VydGlvbnMgb24gdGhlIHNhbWUgbGluZTsgb3RoZXJ3aXNlLCBjb21waWxhdGlvbiB3aWxsIGZhaWwgd2l0aCBhbiB1bm9idmlvdXMKK2Vycm9yIG1lc3NhZ2UuCisKK0Rlc3BpdGUgdGhlIGltcHJvdmVkIHRocmVhZCBzYWZldHkgYWZmb3JkZWQgYnkgdGhlICJ0aHJlYWRzYWZlIiBzdHlsZSBvZiBkZWF0aAordGVzdCwgdGhyZWFkIHByb2JsZW1zIHN1Y2ggYXMgZGVhZGxvY2sgYXJlIHN0aWxsIHBvc3NpYmxlIGluIHRoZSBwcmVzZW5jZSBvZgoraGFuZGxlcnMgcmVnaXN0ZXJlZCB3aXRoIGBwdGhyZWFkX2F0Zm9yaygzKWAuCisKKyMgVXNpbmcgQXNzZXJ0aW9ucyBpbiBTdWItcm91dGluZXMgIworCisjIyBBZGRpbmcgVHJhY2VzIHRvIEFzc2VydGlvbnMgIyMKKworSWYgYSB0ZXN0IHN1Yi1yb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNldmVyYWwgcGxhY2VzLCB3aGVuIGFuIGFzc2VydGlvbgoraW5zaWRlIGl0IGZhaWxzLCBpdCBjYW4gYmUgaGFyZCB0byB0ZWxsIHdoaWNoIGludm9jYXRpb24gb2YgdGhlCitzdWItcm91dGluZSB0aGUgZmFpbHVyZSBpcyBmcm9tLiAgWW91IGNhbiBhbGxldmlhdGUgdGhpcyBwcm9ibGVtIHVzaW5nCitleHRyYSBsb2dnaW5nIG9yIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2VzLCBidXQgdGhhdCB1c3VhbGx5IGNsdXR0ZXJzIHVwCit5b3VyIHRlc3RzLiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byB1c2UgdGhlIGBTQ09QRURfVFJBQ0VgIG1hY3JvOgorCit8IGBTQ09QRURfVFJBQ0UoYF9tZXNzYWdlX2ApO2AgfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKword2hlcmUgX21lc3NhZ2VfIGNhbiBiZSBhbnl0aGluZyBzdHJlYW1hYmxlIHRvIGBzdGQ6Om9zdHJlYW1gLiBUaGlzCittYWNybyB3aWxsIGNhdXNlIHRoZSBjdXJyZW50IGZpbGUgbmFtZSwgbGluZSBudW1iZXIsIGFuZCB0aGUgZ2l2ZW4KK21lc3NhZ2UgdG8gYmUgYWRkZWQgaW4gZXZlcnkgZmFpbHVyZSBtZXNzYWdlLiBUaGUgZWZmZWN0IHdpbGwgYmUKK3VuZG9uZSB3aGVuIHRoZSBjb250cm9sIGxlYXZlcyB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlLgorCitGb3IgZXhhbXBsZSwKKworYGBgCisxMDogdm9pZCBTdWIxKGludCBuKSB7CisxMTogICBFWFBFQ1RfRVEoMSwgQmFyKG4pKTsKKzEyOiAgIEVYUEVDVF9FUSgyLCBCYXIobiArIDEpKTsKKzEzOiB9CisxNDogCisxNTogVEVTVChGb29UZXN0LCBCYXIpIHsKKzE2OiAgIHsKKzE3OiAgICAgU0NPUEVEX1RSQUNFKCJBIik7ICAvLyBUaGlzIHRyYWNlIHBvaW50IHdpbGwgYmUgaW5jbHVkZWQgaW4KKzE4OiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBmYWlsdXJlIGluIHRoaXMgc2NvcGUuCisxOTogICAgIFN1YjEoMSk7CisyMDogICB9CisyMTogICAvLyBOb3cgaXQgd29uJ3QuCisyMjogICBTdWIxKDkpOworMjM6IH0KK2BgYAorCitjb3VsZCByZXN1bHQgaW4gbWVzc2FnZXMgbGlrZSB0aGVzZToKKworYGBgCitwYXRoL3RvL2Zvb190ZXN0LmNjOjExOiBGYWlsdXJlCitWYWx1ZSBvZjogQmFyKG4pCitFeHBlY3RlZDogMQorICBBY3R1YWw6IDIKKyAgIFRyYWNlOgorcGF0aC90by9mb29fdGVzdC5jYzoxNzogQQorCitwYXRoL3RvL2Zvb190ZXN0LmNjOjEyOiBGYWlsdXJlCitWYWx1ZSBvZjogQmFyKG4gKyAxKQorRXhwZWN0ZWQ6IDIKKyAgQWN0dWFsOiAzCitgYGAKKworV2l0aG91dCB0aGUgdHJhY2UsIGl0IHdvdWxkJ3ZlIGJlZW4gZGlmZmljdWx0IHRvIGtub3cgd2hpY2ggaW52b2NhdGlvbgorb2YgYFN1YjEoKWAgdGhlIHR3byBmYWlsdXJlcyBjb21lIGZyb20gcmVzcGVjdGl2ZWx5LiAoWW91IGNvdWxkIGFkZCBhbgorZXh0cmEgbWVzc2FnZSB0byBlYWNoIGFzc2VydGlvbiBpbiBgU3ViMSgpYCB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgb2YKK2BuYCwgYnV0IHRoYXQncyB0ZWRpb3VzLikKKworU29tZSB0aXBzIG9uIHVzaW5nIGBTQ09QRURfVFJBQ0VgOgorCisgIDEuIFdpdGggYSBzdWl0YWJsZSBtZXNzYWdlLCBpdCdzIG9mdGVuIGVub3VnaCB0byB1c2UgYFNDT1BFRF9UUkFDRWAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHN1Yi1yb3V0aW5lLCBpbnN0ZWFkIG9mIGF0IGVhY2ggY2FsbCBzaXRlLgorICAxLiBXaGVuIGNhbGxpbmcgc3ViLXJvdXRpbmVzIGluc2lkZSBhIGxvb3AsIG1ha2UgdGhlIGxvb3AgaXRlcmF0b3IgcGFydCBvZiB0aGUgbWVzc2FnZSBpbiBgU0NPUEVEX1RSQUNFYCBzdWNoIHRoYXQgeW91IGNhbiBrbm93IHdoaWNoIGl0ZXJhdGlvbiB0aGUgZmFpbHVyZSBpcyBmcm9tLgorICAxLiBTb21ldGltZXMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0cmFjZSBwb2ludCBpcyBlbm91Z2ggZm9yIGlkZW50aWZ5aW5nIHRoZSBwYXJ0aWN1bGFyIGludm9jYXRpb24gb2YgYSBzdWItcm91dGluZS4gSW4gdGhpcyBjYXNlLCB5b3UgZG9uJ3QgaGF2ZSB0byBjaG9vc2UgYSB1bmlxdWUgbWVzc2FnZSBmb3IgYFNDT1BFRF9UUkFDRWAuIFlvdSBjYW4gc2ltcGx5IHVzZSBgIiJgLgorICAxLiBZb3UgY2FuIHVzZSBgU0NPUEVEX1RSQUNFYCBpbiBhbiBpbm5lciBzY29wZSB3aGVuIHRoZXJlIGlzIG9uZSBpbiB0aGUgb3V0ZXIgc2NvcGUuIEluIHRoaXMgY2FzZSwgYWxsIGFjdGl2ZSB0cmFjZSBwb2ludHMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlcywgaW4gcmV2ZXJzZSBvcmRlciB0aGV5IGFyZSBlbmNvdW50ZXJlZC4KKyAgMS4gVGhlIHRyYWNlIGR1bXAgaXMgY2xpY2thYmxlIGluIEVtYWNzJyBjb21waWxhdGlvbiBidWZmZXIgLSBoaXQgcmV0dXJuIG9uIGEgbGluZSBudW1iZXIgYW5kIHlvdSdsbCBiZSB0YWtlbiB0byB0aGF0IGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIQorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMgUHJvcGFnYXRpbmcgRmF0YWwgRmFpbHVyZXMgIyMKKworQSBjb21tb24gcGl0ZmFsbCB3aGVuIHVzaW5nIGBBU1NFUlRfKmAgYW5kIGBGQUlMKmAgaXMgbm90IHVuZGVyc3RhbmRpbmcgdGhhdAord2hlbiB0aGV5IGZhaWwgdGhleSBvbmx5IGFib3J0IHRoZSBfY3VycmVudCBmdW5jdGlvbl8sIG5vdCB0aGUgZW50aXJlIHRlc3QuIEZvcgorZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0ZXN0IHdpbGwgc2VnZmF1bHQ6CitgYGAKK3ZvaWQgU3Vicm91dGluZSgpIHsKKyAgLy8gR2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSBhbmQgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBBU1NFUlRfRVEoMSwgMik7CisgIC8vIFRoZSBmb2xsb3dpbmcgd29uJ3QgYmUgZXhlY3V0ZWQuCisgIC4uLgorfQorCitURVNUKEZvb1Rlc3QsIEJhcikgeworICBTdWJyb3V0aW5lKCk7CisgIC8vIFRoZSBpbnRlbmRlZCBiZWhhdmlvciBpcyBmb3IgdGhlIGZhdGFsIGZhaWx1cmUKKyAgLy8gaW4gU3Vicm91dGluZSgpIHRvIGFib3J0IHRoZSBlbnRpcmUgdGVzdC4KKyAgLy8gVGhlIGFjdHVhbCBiZWhhdmlvcjogdGhlIGZ1bmN0aW9uIGdvZXMgb24gYWZ0ZXIgU3Vicm91dGluZSgpIHJldHVybnMuCisgIGludCogcCA9IE5VTEw7CisgICpwID0gMzsgLy8gU2VnZmF1bHQhCit9CitgYGAKKworU2luY2Ugd2UgZG9uJ3QgdXNlIGV4Y2VwdGlvbnMsIGl0IGlzIHRlY2huaWNhbGx5IGltcG9zc2libGUgdG8KK2ltcGxlbWVudCB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgaGVyZS4gIFRvIGFsbGV2aWF0ZSB0aGlzLCBHb29nbGUgVGVzdAorcHJvdmlkZXMgdHdvIHNvbHV0aW9ucy4gIFlvdSBjb3VsZCB1c2UgZWl0aGVyIHRoZQorYChBU1NFUlR8RVhQRUNUKV9OT19GQVRBTF9GQUlMVVJFYCBhc3NlcnRpb25zIG9yIHRoZQorYEhhc0ZhdGFsRmFpbHVyZSgpYCBmdW5jdGlvbi4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHR3bworc3Vic2VjdGlvbnMuCisKKworCisjIyMgQXNzZXJ0aW5nIG9uIFN1YnJvdXRpbmVzICMjIworCitBcyBzaG93biBhYm92ZSwgaWYgeW91ciB0ZXN0IGNhbGxzIGEgc3Vicm91dGluZSB0aGF0IGhhcyBhbiBgQVNTRVJUXypgCitmYWlsdXJlIGluIGl0LCB0aGUgdGVzdCB3aWxsIGNvbnRpbnVlIGFmdGVyIHRoZSBzdWJyb3V0aW5lCityZXR1cm5zLiBUaGlzIG1heSBub3QgYmUgd2hhdCB5b3Ugd2FudC4KKworT2Z0ZW4gcGVvcGxlIHdhbnQgZmF0YWwgZmFpbHVyZXMgdG8gcHJvcGFnYXRlIGxpa2UgZXhjZXB0aW9ucy4gIEZvcgordGhhdCBHb29nbGUgVGVzdCBvZmZlcnMgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShgX3N0YXRlbWVudF9gKTtgIHwgYEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKGBfc3RhdGVtZW50X2ApO2AgfCBfc3RhdGVtZW50XyBkb2Vzbid0IGdlbmVyYXRlIGFueSBuZXcgZmF0YWwgZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLiB8CisKK09ubHkgZmFpbHVyZXMgaW4gdGhlIHRocmVhZCB0aGF0IGV4ZWN1dGVzIHRoZSBhc3NlcnRpb24gYXJlIGNoZWNrZWQgdG8KK2RldGVybWluZSB0aGUgcmVzdWx0IG9mIHRoaXMgdHlwZSBvZiBhc3NlcnRpb25zLiAgSWYgX3N0YXRlbWVudF8KK2NyZWF0ZXMgbmV3IHRocmVhZHMsIGZhaWx1cmVzIGluIHRoZXNlIHRocmVhZHMgYXJlIGlnbm9yZWQuCisKK0V4YW1wbGVzOgorCitgYGAKK0FTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEZvbygpKTsKKworaW50IGk7CitFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRSh7CisgIGkgPSBCYXIoKTsKK30pOworYGBgCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLiBBc3NlcnRpb25zIGZyb20gbXVsdGlwbGUgdGhyZWFkcworYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorCisjIyMgQ2hlY2tpbmcgZm9yIEZhaWx1cmVzIGluIHRoZSBDdXJyZW50IFRlc3QgIyMjCisKK2BIYXNGYXRhbEZhaWx1cmUoKWAgaW4gdGhlIGA6OnRlc3Rpbmc6OlRlc3RgIGNsYXNzIHJldHVybnMgYHRydWVgIGlmIGFuCithc3NlcnRpb24gaW4gdGhlIGN1cnJlbnQgdGVzdCBoYXMgc3VmZmVyZWQgYSBmYXRhbCBmYWlsdXJlLiBUaGlzCithbGxvd3MgZnVuY3Rpb25zIHRvIGNhdGNoIGZhdGFsIGZhaWx1cmVzIGluIGEgc3ViLXJvdXRpbmUgYW5kIHJldHVybgorZWFybHkuCisKK2BgYAorY2xhc3MgVGVzdCB7CisgcHVibGljOgorICAuLi4KKyAgc3RhdGljIGJvb2wgSGFzRmF0YWxGYWlsdXJlKCk7Cit9OworYGBgCisKK1RoZSB0eXBpY2FsIHVzYWdlLCB3aGljaCBiYXNpY2FsbHkgc2ltdWxhdGVzIHRoZSBiZWhhdmlvciBvZiBhIHRocm93bgorZXhjZXB0aW9uLCBpczoKKworYGBgCitURVNUKEZvb1Rlc3QsIEJhcikgeworICBTdWJyb3V0aW5lKCk7CisgIC8vIEFib3J0cyBpZiBTdWJyb3V0aW5lKCkgaGFkIGEgZmF0YWwgZmFpbHVyZS4KKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKQorICAgIHJldHVybjsKKyAgLy8gVGhlIGZvbGxvd2luZyB3b24ndCBiZSBleGVjdXRlZC4KKyAgLi4uCit9CitgYGAKKworSWYgYEhhc0ZhdGFsRmFpbHVyZSgpYCBpcyB1c2VkIG91dHNpZGUgb2YgYFRFU1QoKWAgLCBgVEVTVF9GKClgICwgb3IgYSB0ZXN0CitmaXh0dXJlLCB5b3UgbXVzdCBhZGQgdGhlIGA6OnRlc3Rpbmc6OlRlc3Q6OmAgcHJlZml4LCBhcyBpbjoKKworYGBgCitpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkKKyAgcmV0dXJuOworYGBgCisKK1NpbWlsYXJseSwgYEhhc05vbmZhdGFsRmFpbHVyZSgpYCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgY3VycmVudCB0ZXN0CitoYXMgYXQgbGVhc3Qgb25lIG5vbi1mYXRhbCBmYWlsdXJlLCBhbmQgYEhhc0ZhaWx1cmUoKWAgcmV0dXJucyBgdHJ1ZWAKK2lmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGF0IGxlYXN0IG9uZSBmYWlsdXJlIG9mIGVpdGhlciBraW5kLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4gIGBIYXNOb25mYXRhbEZhaWx1cmUoKWAgYW5kCitgSGFzRmFpbHVyZSgpYCBhcmUgYXZhaWxhYmxlIHNpbmNlIHZlcnNpb24gMS40LjAuCisKKyMgTG9nZ2luZyBBZGRpdGlvbmFsIEluZm9ybWF0aW9uICMKKworSW4geW91ciB0ZXN0IGNvZGUsIHlvdSBjYW4gY2FsbCBgUmVjb3JkUHJvcGVydHkoImtleSIsIHZhbHVlKWAgdG8gbG9nCithZGRpdGlvbmFsIGluZm9ybWF0aW9uLCB3aGVyZSBgdmFsdWVgIGNhbiBiZSBlaXRoZXIgYSBDIHN0cmluZyBvciBhIDMyLWJpdAoraW50ZWdlci4gVGhlIF9sYXN0XyB2YWx1ZSByZWNvcmRlZCBmb3IgYSBrZXkgd2lsbCBiZSBlbWl0dGVkIHRvIHRoZSBYTUwgb3V0cHV0CitpZiB5b3Ugc3BlY2lmeSBvbmUuIEZvciBleGFtcGxlLCB0aGUgdGVzdAorCitgYGAKK1RFU1RfRihXaWRnZXRVc2FnZVRlc3QsIE1pbkFuZE1heFdpZGdldHMpIHsKKyAgUmVjb3JkUHJvcGVydHkoIk1heGltdW1XaWRnZXRzIiwgQ29tcHV0ZU1heFVzYWdlKCkpOworICBSZWNvcmRQcm9wZXJ0eSgiTWluaW11bVdpZGdldHMiLCBDb21wdXRlTWluVXNhZ2UoKSk7Cit9CitgYGAKKword2lsbCBvdXRwdXQgWE1MIGxpa2UgdGhpczoKKworYGBgCisuLi4KKyAgPHRlc3RjYXNlIG5hbWU9Ik1pbkFuZE1heFdpZGdldHMiIHN0YXR1cz0icnVuIiB0aW1lPSI2IiBjbGFzc25hbWU9IldpZGdldFVzYWdlVGVzdCIKKyAgICAgICAgICAgIE1heGltdW1XaWRnZXRzPSIxMiIKKyAgICAgICAgICAgIE1pbmltdW1XaWRnZXRzPSI5IiAvPgorLi4uCitgYGAKKworX05vdGVfOgorICAqIGBSZWNvcmRQcm9wZXJ0eSgpYCBpcyBhIHN0YXRpYyBtZW1iZXIgb2YgdGhlIGBUZXN0YCBjbGFzcy4gVGhlcmVmb3JlIGl0IG5lZWRzIHRvIGJlIHByZWZpeGVkIHdpdGggYDo6dGVzdGluZzo6VGVzdDo6YCBpZiB1c2VkIG91dHNpZGUgb2YgdGhlIGBURVNUYCBib2R5IGFuZCB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLgorICAqIGBrZXlgIG11c3QgYmUgYSB2YWxpZCBYTUwgYXR0cmlidXRlIG5hbWUsIGFuZCBjYW5ub3QgY29uZmxpY3Qgd2l0aCB0aGUgb25lcyBhbHJlYWR5IHVzZWQgYnkgR29vZ2xlIFRlc3QgKGBuYW1lYCwgYHN0YXR1c2AsICAgICBgdGltZWAsIGFuZCBgY2xhc3NuYW1lYCkuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIFNoYXJpbmcgUmVzb3VyY2VzIEJldHdlZW4gVGVzdHMgaW4gdGhlIFNhbWUgVGVzdCBDYXNlICMKKworCisKK0dvb2dsZSBUZXN0IGNyZWF0ZXMgYSBuZXcgdGVzdCBmaXh0dXJlIG9iamVjdCBmb3IgZWFjaCB0ZXN0IGluIG9yZGVyIHRvIG1ha2UKK3Rlc3RzIGluZGVwZW5kZW50IGFuZCBlYXNpZXIgdG8gZGVidWcuIEhvd2V2ZXIsIHNvbWV0aW1lcyB0ZXN0cyB1c2UgcmVzb3VyY2VzCit0aGF0IGFyZSBleHBlbnNpdmUgdG8gc2V0IHVwLCBtYWtpbmcgdGhlIG9uZS1jb3B5LXBlci10ZXN0IG1vZGVsIHByb2hpYml0aXZlbHkKK2V4cGVuc2l2ZS4KKworSWYgdGhlIHRlc3RzIGRvbid0IGNoYW5nZSB0aGUgcmVzb3VyY2UsIHRoZXJlJ3Mgbm8gaGFybSBpbiB0aGVtIHNoYXJpbmcgYQorc2luZ2xlIHJlc291cmNlIGNvcHkuIFNvLCBpbiBhZGRpdGlvbiB0byBwZXItdGVzdCBzZXQtdXAvdGVhci1kb3duLCBHb29nbGUgVGVzdAorYWxzbyBzdXBwb3J0cyBwZXItdGVzdC1jYXNlIHNldC11cC90ZWFyLWRvd24uIFRvIHVzZSBpdDoKKworICAxLiBJbiB5b3VyIHRlc3QgZml4dHVyZSBjbGFzcyAoc2F5IGBGb29UZXN0YCApLCBkZWZpbmUgYXMgYHN0YXRpY2Agc29tZSBtZW1iZXIgdmFyaWFibGVzIHRvIGhvbGQgdGhlIHNoYXJlZCByZXNvdXJjZXMuCisgIDEuIEluIHRoZSBzYW1lIHRlc3QgZml4dHVyZSBjbGFzcywgZGVmaW5lIGEgYHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKWAgZnVuY3Rpb24gKHJlbWVtYmVyIG5vdCB0byBzcGVsbCBpdCBhcyAqKmBTZXR1cFRlc3RDYXNlYCoqIHdpdGggYSBzbWFsbCBgdWAhKSB0byBzZXQgdXAgdGhlIHNoYXJlZCByZXNvdXJjZXMgYW5kIGEgYHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKWAgZnVuY3Rpb24gdG8gdGVhciB0aGVtIGRvd24uCisKK1RoYXQncyBpdCEgR29vZ2xlIFRlc3QgYXV0b21hdGljYWxseSBjYWxscyBgU2V0VXBUZXN0Q2FzZSgpYCBiZWZvcmUgcnVubmluZyB0aGUKK19maXJzdCB0ZXN0XyBpbiB0aGUgYEZvb1Rlc3RgIHRlc3QgY2FzZSAoaS5lLiBiZWZvcmUgY3JlYXRpbmcgdGhlIGZpcnN0CitgRm9vVGVzdGAgb2JqZWN0KSwgYW5kIGNhbGxzIGBUZWFyRG93blRlc3RDYXNlKClgIGFmdGVyIHJ1bm5pbmcgdGhlIF9sYXN0IHRlc3RfCitpbiBpdCAoaS5lLiBhZnRlciBkZWxldGluZyB0aGUgbGFzdCBgRm9vVGVzdGAgb2JqZWN0KS4gSW4gYmV0d2VlbiwgdGhlIHRlc3RzCitjYW4gdXNlIHRoZSBzaGFyZWQgcmVzb3VyY2VzLgorCitSZW1lbWJlciB0aGF0IHRoZSB0ZXN0IG9yZGVyIGlzIHVuZGVmaW5lZCwgc28geW91ciBjb2RlIGNhbid0IGRlcGVuZCBvbiBhIHRlc3QKK3ByZWNlZGluZyBvciBmb2xsb3dpbmcgYW5vdGhlci4gQWxzbywgdGhlIHRlc3RzIG11c3QgZWl0aGVyIG5vdCBtb2RpZnkgdGhlCitzdGF0ZSBvZiBhbnkgc2hhcmVkIHJlc291cmNlLCBvciwgaWYgdGhleSBkbyBtb2RpZnkgdGhlIHN0YXRlLCB0aGV5IG11c3QKK3Jlc3RvcmUgdGhlIHN0YXRlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBiZWZvcmUgcGFzc2luZyBjb250cm9sIHRvIHRoZSBuZXh0Cit0ZXN0LgorCitIZXJlJ3MgYW4gZXhhbXBsZSBvZiBwZXItdGVzdC1jYXNlIHNldC11cCBhbmQgdGVhci1kb3duOgorYGBgCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBQZXItdGVzdC1jYXNlIHNldC11cC4KKyAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8gQ2FuIGJlIG9taXR0ZWQgaWYgbm90IG5lZWRlZC4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBzaGFyZWRfcmVzb3VyY2VfID0gbmV3IC4uLjsKKyAgfQorCisgIC8vIFBlci10ZXN0LWNhc2UgdGVhci1kb3duLgorICAvLyBDYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8gQ2FuIGJlIG9taXR0ZWQgaWYgbm90IG5lZWRlZC4KKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBkZWxldGUgc2hhcmVkX3Jlc291cmNlXzsKKyAgICBzaGFyZWRfcmVzb3VyY2VfID0gTlVMTDsKKyAgfQorCisgIC8vIFlvdSBjYW4gZGVmaW5lIHBlci10ZXN0IHNldC11cCBhbmQgdGVhci1kb3duIGxvZ2ljIGFzIHVzdWFsLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IC4uLiB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsgLi4uIH0KKworICAvLyBTb21lIGV4cGVuc2l2ZSByZXNvdXJjZSBzaGFyZWQgYnkgYWxsIHRlc3RzLgorICBzdGF0aWMgVCogc2hhcmVkX3Jlc291cmNlXzsKK307CisKK1QqIEZvb1Rlc3Q6OnNoYXJlZF9yZXNvdXJjZV8gPSBOVUxMOworCitURVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKKyAgLi4uIHlvdSBjYW4gcmVmZXIgdG8gc2hhcmVkX3Jlc291cmNlIGhlcmUgLi4uCit9CitURVNUX0YoRm9vVGVzdCwgVGVzdDIpIHsKKyAgLi4uIHlvdSBjYW4gcmVmZXIgdG8gc2hhcmVkX3Jlc291cmNlIGhlcmUgLi4uCit9CitgYGAKKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMgR2xvYmFsIFNldC1VcCBhbmQgVGVhci1Eb3duICMKKworSnVzdCBhcyB5b3UgY2FuIGRvIHNldC11cCBhbmQgdGVhci1kb3duIGF0IHRoZSB0ZXN0IGxldmVsIGFuZCB0aGUgdGVzdCBjYXNlCitsZXZlbCwgeW91IGNhbiBhbHNvIGRvIGl0IGF0IHRoZSB0ZXN0IHByb2dyYW0gbGV2ZWwuIEhlcmUncyBob3cuCisKK0ZpcnN0LCB5b3Ugc3ViY2xhc3MgdGhlIGA6OnRlc3Rpbmc6OkVudmlyb25tZW50YCBjbGFzcyB0byBkZWZpbmUgYSB0ZXN0CitlbnZpcm9ubWVudCwgd2hpY2gga25vd3MgaG93IHRvIHNldC11cCBhbmQgdGVhci1kb3duOgorCitgYGAKK2NsYXNzIEVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkVudmlyb25tZW50KCkge30KKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9CisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byB0ZWFyIGRvd24gdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQorfTsKK2BgYAorCitUaGVuLCB5b3UgcmVnaXN0ZXIgYW4gaW5zdGFuY2Ugb2YgeW91ciBlbnZpcm9ubWVudCBjbGFzcyB3aXRoIEdvb2dsZSBUZXN0IGJ5CitjYWxsaW5nIHRoZSBgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKWAgZnVuY3Rpb246CisKK2BgYAorRW52aXJvbm1lbnQqIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KTsKK2BgYAorCitOb3csIHdoZW4gYFJVTl9BTExfVEVTVFMoKWAgaXMgY2FsbGVkLCBpdCBmaXJzdCBjYWxscyB0aGUgYFNldFVwKClgIG1ldGhvZCBvZgordGhlIGVudmlyb25tZW50IG9iamVjdCwgdGhlbiBydW5zIHRoZSB0ZXN0cyBpZiB0aGVyZSB3YXMgbm8gZmF0YWwgZmFpbHVyZXMsIGFuZAorZmluYWxseSBjYWxscyBgVGVhckRvd24oKWAgb2YgdGhlIGVudmlyb25tZW50IG9iamVjdC4KKworSXQncyBPSyB0byByZWdpc3RlciBtdWx0aXBsZSBlbnZpcm9ubWVudCBvYmplY3RzLiBJbiB0aGlzIGNhc2UsIHRoZWlyIGBTZXRVcCgpYAord2lsbCBiZSBjYWxsZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJlZ2lzdGVyZWQsIGFuZCB0aGVpciBgVGVhckRvd24oKWAgd2lsbCBiZQorY2FsbGVkIGluIHRoZSByZXZlcnNlIG9yZGVyLgorCitOb3RlIHRoYXQgR29vZ2xlIFRlc3QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZWdpc3RlcmVkIGVudmlyb25tZW50IG9iamVjdHMuCitUaGVyZWZvcmUgKipkbyBub3QgZGVsZXRlIHRoZW0qKiBieSB5b3Vyc2VsZi4KKworWW91IHNob3VsZCBjYWxsIGBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKWAgYmVmb3JlIGBSVU5fQUxMX1RFU1RTKClgIGlzCitjYWxsZWQsIHByb2JhYmx5IGluIGBtYWluKClgLiBJZiB5b3UgdXNlIGBndGVzdF9tYWluYCwgeW91IG5lZWQgdG8gICAgICBjYWxsCit0aGlzIGJlZm9yZSBgbWFpbigpYCBzdGFydHMgZm9yIGl0IHRvIHRha2UgZWZmZWN0LiBPbmUgd2F5IHRvIGRvIHRoaXMgaXMgdG8KK2RlZmluZSBhIGdsb2JhbCB2YXJpYWJsZSBsaWtlIHRoaXM6CisKK2BgYAorOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgZm9vX2VudiA9IDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBGb29FbnZpcm9ubWVudCk7CitgYGAKKworSG93ZXZlciwgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdSB0byB3cml0ZSB5b3VyIG93biBgbWFpbigpYCBhbmQgY2FsbAorYEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpYCB0aGVyZSwgYXMgcmVseWluZyBvbiBpbml0aWFsaXphdGlvbiBvZiBnbG9iYWwKK3ZhcmlhYmxlcyBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZCBhbmQgbWF5IGNhdXNlIHByb2JsZW1zIHdoZW4geW91CityZWdpc3RlciBtdWx0aXBsZSBlbnZpcm9ubWVudHMgZnJvbSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgYW5kIHRoZQorZW52aXJvbm1lbnRzIGhhdmUgZGVwZW5kZW5jaWVzIGFtb25nIHRoZW0gKHJlbWVtYmVyIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3QKK2d1YXJhbnRlZSB0aGUgb3JkZXIgaW4gd2hpY2ggZ2xvYmFsIHZhcmlhYmxlcyBmcm9tIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cworYXJlIGluaXRpYWxpemVkKS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKworIyBWYWx1ZSBQYXJhbWV0ZXJpemVkIFRlc3RzICMKKworX1ZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHNfIGFsbG93IHlvdSB0byB0ZXN0IHlvdXIgY29kZSB3aXRoIGRpZmZlcmVudAorcGFyYW1ldGVycyB3aXRob3V0IHdyaXRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHRlc3QuCisKK1N1cHBvc2UgeW91IHdyaXRlIGEgdGVzdCBmb3IgeW91ciBjb2RlIGFuZCB0aGVuIHJlYWxpemUgdGhhdCB5b3VyIGNvZGUgaXMgYWZmZWN0ZWQgYnkgYSBwcmVzZW5jZSBvZiBhIEJvb2xlYW4gY29tbWFuZCBsaW5lIGZsYWcuCisKK2BgYAorVEVTVChNeUNvZGVUZXN0LCBUZXN0Rm9vKSB7CisgIC8vIEEgY29kZSB0byB0ZXN0IGZvbygpLgorfQorYGBgCisKK1VzdWFsbHkgcGVvcGxlIGZhY3RvciB0aGVpciB0ZXN0IGNvZGUgaW50byBhIGZ1bmN0aW9uIHdpdGggYSBCb29sZWFuIHBhcmFtZXRlciBpbiBzdWNoIHNpdHVhdGlvbnMuIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBmbGFnLCB0aGVuIGV4ZWN1dGVzIHRoZSB0ZXN0aW5nIGNvZGUuCisKK2BgYAordm9pZCBUZXN0Rm9vSGVscGVyKGJvb2wgZmxhZ192YWx1ZSkgeworICBmbGFnID0gZmxhZ192YWx1ZTsKKyAgLy8gQSBjb2RlIHRvIHRlc3QgZm9vKCkuCit9CisKK1RFU1QoTXlDb2RlVGVzdCwgVGVzdEZvb28pIHsKKyAgVGVzdEZvb0hlbHBlcihmYWxzZSk7CisgIFRlc3RGb29IZWxwZXIodHJ1ZSk7Cit9CitgYGAKKworQnV0IHRoaXMgc2V0dXAgaGFzIHNlcmlvdXMgZHJhd2JhY2tzLiBGaXJzdCwgd2hlbiBhIHRlc3QgYXNzZXJ0aW9uIGZhaWxzIGluIHlvdXIgdGVzdHMsIGl0IGJlY29tZXMgdW5jbGVhciB3aGF0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgY2F1c2VkIGl0IHRvIGZhaWwuIFlvdSBjYW4gc3RyZWFtIGEgY2xhcmlmeWluZyBtZXNzYWdlIGludG8geW91ciBgRVhQRUNUYC9gQVNTRVJUYCBzdGF0ZW1lbnRzLCBidXQgaXQgeW91J2xsIGhhdmUgdG8gZG8gaXQgd2l0aCBhbGwgb2YgdGhlbS4gU2Vjb25kLCB5b3UgaGF2ZSB0byBhZGQgb25lIHN1Y2ggaGVscGVyIGZ1bmN0aW9uIHBlciB0ZXN0LiBXaGF0IGlmIHlvdSBoYXZlIHRlbiB0ZXN0cz8gVHdlbnR5PyBBIGh1bmRyZWQ/CisKK1ZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgd2lsbCBsZXQgeW91IHdyaXRlIHlvdXIgdGVzdCBvbmx5IG9uY2UgYW5kIHRoZW4gZWFzaWx5IGluc3RhbnRpYXRlIGFuZCBydW4gaXQgd2l0aCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHBhcmFtZXRlciB2YWx1ZXMuCisKK0hlcmUgYXJlIHNvbWUgb3RoZXIgc2l0dWF0aW9ucyB3aGVuIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgY29tZSBoYW5keToKKworICAqIFlvdSB3YW4gdG8gdGVzdCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIGFuIE9PIGludGVyZmFjZS4KKyAgKiBZb3Ugd2FudCB0byB0ZXN0IHlvdXIgY29kZSBvdmVyIHZhcmlvdXMgaW5wdXRzIChhLmsuYS4gZGF0YS1kcml2ZW4gdGVzdGluZykuIFRoaXMgZmVhdHVyZSBpcyBlYXN5IHRvIGFidXNlLCBzbyBwbGVhc2UgZXhlcmNpc2UgeW91ciBnb29kIHNlbnNlIHdoZW4gZG9pbmcgaXQhCisKKyMjIEhvdyB0byBXcml0ZSBWYWx1ZS1QYXJhbWV0ZXJpemVkIFRlc3RzICMjCisKK1RvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQorY2xhc3MuIEl0IG11c3QgYmUgZGVyaXZlZCBmcm9tIGA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD5gLCB3aGVyZSBgVGAKK2lzIHRoZSB0eXBlIG9mIHlvdXIgcGFyYW1ldGVyIHZhbHVlcy4gYFRlc3RXaXRoUGFyYW08VD5gIGlzIGl0c2VsZgorZGVyaXZlZCBmcm9tIGA6OnRlc3Rpbmc6OlRlc3RgLiBgVGAgY2FuIGJlIGFueSBjb3B5YWJsZSB0eXBlLiBJZiBpdCdzCithIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgbGlmZXNwYW4gb2YgdGhlCitwb2ludGVkIHZhbHVlcy4KKworYGBgCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxjb25zdCBjaGFyKj4geworICAvLyBZb3UgY2FuIGltcGxlbWVudCBhbGwgdGhlIHVzdWFsIGZpeHR1cmUgY2xhc3MgbWVtYmVycyBoZXJlLgorICAvLyBUbyBhY2Nlc3MgdGhlIHRlc3QgcGFyYW1ldGVyLCBjYWxsIEdldFBhcmFtKCkgZnJvbSBjbGFzcworICAvLyBUZXN0V2l0aFBhcmFtPFQ+LgorfTsKK2BgYAorCitUaGVuLCB1c2UgdGhlIGBURVNUX1BgIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHRlc3QgcGF0dGVybnMgdXNpbmcKK3RoaXMgZml4dHVyZSBhcyB5b3Ugd2FudC4gIFRoZSBgX1BgIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiIG9yCisicGF0dGVybiIsIHdoaWNoZXZlciB5b3UgcHJlZmVyIHRvIHRoaW5rLgorCitgYGAKK1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCBhY2Nlc3MgdGhlIHRlc3QgcGFyYW1ldGVyIHdpdGggdGhlIEdldFBhcmFtKCkgbWV0aG9kCisgIC8vIG9mIHRoZSBUZXN0V2l0aFBhcmFtPFQ+IGNsYXNzOgorICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7CisgIC4uLgorfQorCitURVNUX1AoRm9vVGVzdCwgSGFzQmxhaEJsYWgpIHsKKyAgLi4uCit9CitgYGAKKworRmluYWxseSwgeW91IGNhbiB1c2UgYElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QYCB0byBpbnN0YW50aWF0ZSB0aGUgdGVzdAorY2FzZSB3aXRoIGFueSBzZXQgb2YgcGFyYW1ldGVycyB5b3Ugd2FudC4gR29vZ2xlIFRlc3QgZGVmaW5lcyBhIG51bWJlciBvZgorZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRlc3QgcGFyYW1ldGVycy4gVGhleSByZXR1cm4gd2hhdCB3ZSBjYWxsCisoc3VycHJpc2UhKSBfcGFyYW1ldGVyIGdlbmVyYXRvcnNfLiBIZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGVtLAord2hpY2ggYXJlIGFsbCBpbiB0aGUgYHRlc3RpbmdgIG5hbWVzcGFjZToKKworfCBgUmFuZ2UoYmVnaW4sIGVuZFssIHN0ZXBdKWAgfCBZaWVsZHMgdmFsdWVzIGB7YmVnaW4sIGJlZ2luK3N0ZXAsIGJlZ2luK3N0ZXArc3RlcCwgLi4ufWAuIFRoZSB2YWx1ZXMgZG8gbm90IGluY2x1ZGUgYGVuZGAuIGBzdGVwYCBkZWZhdWx0cyB0byAxLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYFZhbHVlcyh2MSwgdjIsIC4uLiwgdk4pYCAgIHwgWWllbGRzIHZhbHVlcyBge3YxLCB2MiwgLi4uLCB2Tn1gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgVmFsdWVzSW4oY29udGFpbmVyKWAgYW5kIGBWYWx1ZXNJbihiZWdpbiwgZW5kKWAgfCBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwtc3R5bGUgY29udGFpbmVyLCBvciBhbiBpdGVyYXRvciByYW5nZSBgW2JlZ2luLCBlbmQpYC4gICAgICAgICAgICAgICAgICB8Cit8IGBCb29sKClgICAgICAgICAgICAgICAgICAgICB8IFlpZWxkcyBzZXF1ZW5jZSBge2ZhbHNlLCB0cnVlfWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYENvbWJpbmUoZzEsIGcyLCAuLi4sIGdOKWAgIHwgWWllbGRzIGFsbCBjb21iaW5hdGlvbnMgKHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IHRoZSBgTmAgZ2VuZXJhdG9ycy4gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3VyIHN5c3RlbSBwcm92aWRlcyB0aGUgYDx0cjEvdHVwbGU+YCBoZWFkZXIuIElmIHlvdSBhcmUgc3VyZSB5b3VyIHN5c3RlbSBkb2VzLCBhbmQgR29vZ2xlIFRlc3QgZGlzYWdyZWVzLCB5b3UgY2FuIG92ZXJyaWRlIGl0IGJ5IGRlZmluaW5nIGBHVEVTVF9IQVNfVFIxX1RVUExFPTFgLiBTZWUgY29tbWVudHMgaW4gW2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gfAorCitGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIFtzb3VyY2UgY29kZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCkuCisKK1RoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgZnJvbSB0aGUgYEZvb1Rlc3RgIHRlc3QgY2FzZQorZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgYCJtZWVueSJgLCBgIm1pbnkiYCwgYW5kIGAibW9lImAuCisKK2BgYAorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoIm1lZW55IiwgIm1pbnkiLCAibW9lIikpOworYGBgCisKK1RvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4gKHllcywgeW91IGNhbgoraW5zdGFudGlhdGUgaXQgbW9yZSB0aGFuIG9uY2UpLCB0aGUgZmlyc3QgYXJndW1lbnQgdG8KK2BJTlNUQU5USUFURV9URVNUX0NBU0VfUGAgaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhY3R1YWwKK3Rlc3QgY2FzZSBuYW1lLiBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IgZGlmZmVyZW50CitpbnN0YW50aWF0aW9ucy4gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlIHRoZXNlCituYW1lczoKKworICAqIGBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzBgIGZvciBgIm1lZW55ImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xYCBmb3IgYCJtaW55ImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8yYCBmb3IgYCJtb2UiYAorICAqIGBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzBgIGZvciBgIm1lZW55ImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xYCBmb3IgYCJtaW55ImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8yYCBmb3IgYCJtb2UiYAorCitZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiBbLS1ndGVzdFxfZmlsdGVyXSgjUnVubmluZ19hX1N1YnNldF9vZl90aGVfVGVzdHMubWQpLgorCitUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIGBGb29UZXN0YCBhZ2FpbiwgZWFjaAord2l0aCBwYXJhbWV0ZXIgdmFsdWVzIGAiY2F0ImAgYW5kIGAiZG9nImA6CisKK2BgYAorY29uc3QgY2hhciogcGV0c1tdID0geyJjYXQiLCAiZG9nIn07CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbm90aGVySW5zdGFudGlhdGlvbk5hbWUsIEZvb1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKHBldHMpKTsKK2BgYAorCitUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUgdGhlc2UgbmFtZXM6CisKKyAgKiBgQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMGAgZm9yIGAiY2F0ImAKKyAgKiBgQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMWAgZm9yIGAiZG9nImAKKyAgKiBgQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMGAgZm9yIGAiY2F0ImAKKyAgKiBgQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMWAgZm9yIGAiZG9nImAKKworUGxlYXNlIG5vdGUgdGhhdCBgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1BgIHdpbGwgaW5zdGFudGlhdGUgX2FsbF8KK3Rlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UsIHdoZXRoZXIgdGhlaXIgZGVmaW5pdGlvbnMgY29tZSBiZWZvcmUgb3IKK19hZnRlcl8gdGhlIGBJTlNUQU5USUFURV9URVNUX0NBU0VfUGAgc3RhdGVtZW50LgorCitZb3UgY2FuIHNlZQorW3RoZXNlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYykKK1tmaWxlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MpIGZvciBtb3JlIGV4YW1wbGVzLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MgKHJlcXVpcmVzIE1TVkMgOC4wIG9yIGFib3ZlKSwgTWFjOyBzaW5jZSB2ZXJzaW9uIDEuMi4wLgorCisjIyBDcmVhdGluZyBWYWx1ZS1QYXJhbWV0ZXJpemVkIEFic3RyYWN0IFRlc3RzICMjCisKK0luIHRoZSBhYm92ZSwgd2UgZGVmaW5lIGFuZCBpbnN0YW50aWF0ZSBgRm9vVGVzdGAgaW4gdGhlIHNhbWUgc291cmNlCitmaWxlLiBTb21ldGltZXMgeW91IG1heSB3YW50IHRvIGRlZmluZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIGEKK2xpYnJhcnkgYW5kIGxldCBvdGhlciBwZW9wbGUgaW5zdGFudGlhdGUgdGhlbSBsYXRlci4gVGhpcyBwYXR0ZXJuIGlzCitrbm93biBhcyA8aT5hYnN0cmFjdCB0ZXN0czwvaT4uIEFzIGFuIGV4YW1wbGUgb2YgaXRzIGFwcGxpY2F0aW9uLCB3aGVuIHlvdQorYXJlIGRlc2lnbmluZyBhbiBpbnRlcmZhY2UgeW91IGNhbiB3cml0ZSBhIHN0YW5kYXJkIHN1aXRlIG9mIGFic3RyYWN0Cit0ZXN0cyAocGVyaGFwcyB1c2luZyBhIGZhY3RvcnkgZnVuY3Rpb24gYXMgdGhlIHRlc3QgcGFyYW1ldGVyKSB0aGF0CithbGwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBpbnRlcmZhY2UgYXJlIGV4cGVjdGVkIHRvIHBhc3MuIFdoZW4KK3NvbWVvbmUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlLCBoZSBjYW4gaW5zdGFudGlhdGUgeW91ciBzdWl0ZSB0byBnZXQKK2FsbCB0aGUgaW50ZXJmYWNlLWNvbmZvcm1hbmNlIHRlc3RzIGZvciBmcmVlLgorCitUbyBkZWZpbmUgYWJzdHJhY3QgdGVzdHMsIHlvdSBzaG91bGQgb3JnYW5pemUgeW91ciBjb2RlIGxpa2UgdGhpczoKKworICAxLiBQdXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIGNsYXNzIChlLmcuIGBGb29UZXN0YCkgaW4gYSBoZWFkZXIgZmlsZSwgc2F5IGBmb29fcGFyYW1fdGVzdC5oYC4gVGhpbmsgb2YgdGhpcyBhcyBfZGVjbGFyaW5nXyB5b3VyIGFic3RyYWN0IHRlc3RzLgorICAxLiBQdXQgdGhlIGBURVNUX1BgIGRlZmluaXRpb25zIGluIGBmb29fcGFyYW1fdGVzdC5jY2AsIHdoaWNoIGluY2x1ZGVzIGBmb29fcGFyYW1fdGVzdC5oYC4gVGhpbmsgb2YgdGhpcyBhcyBfaW1wbGVtZW50aW5nXyB5b3VyIGFic3RyYWN0IHRlc3RzLgorCitPbmNlIHRoZXkgYXJlIGRlZmluZWQsIHlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbSBieSBpbmNsdWRpbmcKK2Bmb29fcGFyYW1fdGVzdC5oYCwgaW52b2tpbmcgYElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKClgLCBhbmQgbGlua2luZword2l0aCBgZm9vX3BhcmFtX3Rlc3QuY2NgLiBZb3UgY2FuIGluc3RhbnRpYXRlIHRoZSBzYW1lIGFic3RyYWN0IHRlc3QKK2Nhc2UgbXVsdGlwbGUgdGltZXMsIHBvc3NpYmx5IGluIGRpZmZlcmVudCBzb3VyY2UgZmlsZXMuCisKKyMgVHlwZWQgVGVzdHMgIworCitTdXBwb3NlIHlvdSBoYXZlIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBpbnRlcmZhY2UgYW5kCit3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGVtIHNhdGlzZnkgc29tZSBjb21tb24gcmVxdWlyZW1lbnRzLgorT3IsIHlvdSBtYXkgaGF2ZSBkZWZpbmVkIHNldmVyYWwgdHlwZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gY29uZm9ybSB0bwordGhlIHNhbWUgImNvbmNlcHQiIGFuZCB5b3Ugd2FudCB0byB2ZXJpZnkgaXQuICBJbiBib3RoIGNhc2VzLCB5b3Ugd2FudAordGhlIHNhbWUgdGVzdCBsb2dpYyByZXBlYXRlZCBmb3IgZGlmZmVyZW50IHR5cGVzLgorCitXaGlsZSB5b3UgY2FuIHdyaXRlIG9uZSBgVEVTVGAgb3IgYFRFU1RfRmAgZm9yIGVhY2ggdHlwZSB5b3Ugd2FudCB0bwordGVzdCAoYW5kIHlvdSBtYXkgZXZlbiBmYWN0b3IgdGhlIHRlc3QgbG9naWMgaW50byBhIGZ1bmN0aW9uIHRlbXBsYXRlCit0aGF0IHlvdSBpbnZva2UgZnJvbSB0aGUgYFRFU1RgKSwgaXQncyB0ZWRpb3VzIGFuZCBkb2Vzbid0IHNjYWxlOgoraWYgeW91IHdhbnQgX21fIHRlc3RzIG92ZXIgX25fIHR5cGVzLCB5b3UnbGwgZW5kIHVwIHdyaXRpbmcgX21cKm5fCitgVEVTVGBzLgorCitfVHlwZWQgdGVzdHNfIGFsbG93IHlvdSB0byByZXBlYXQgdGhlIHNhbWUgdGVzdCBsb2dpYyBvdmVyIGEgbGlzdCBvZgordHlwZXMuICBZb3Ugb25seSBuZWVkIHRvIHdyaXRlIHRoZSB0ZXN0IGxvZ2ljIG9uY2UsIGFsdGhvdWdoIHlvdSBtdXN0Citrbm93IHRoZSB0eXBlIGxpc3Qgd2hlbiB3cml0aW5nIHR5cGVkIHRlc3RzLiAgSGVyZSdzIGhvdyB5b3UgZG8gaXQ6CisKK0ZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKK2J5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIGA6OnRlc3Rpbmc6OlRlc3RgOgorCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgLi4uCisgIHR5cGVkZWYgc3RkOjpsaXN0PFQ+IExpc3Q7CisgIHN0YXRpYyBUIHNoYXJlZF87CisgIFQgdmFsdWVfOworfTsKK2BgYAorCitOZXh0LCBhc3NvY2lhdGUgYSBsaXN0IG9mIHR5cGVzIHdpdGggdGhlIHRlc3QgY2FzZSwgd2hpY2ggd2lsbCBiZQorcmVwZWF0ZWQgZm9yIGVhY2ggdHlwZSBpbiB0aGUgbGlzdDoKKworYGBgCit0eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitUWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgTXlUeXBlcyk7CitgYGAKKworVGhlIGB0eXBlZGVmYCBpcyBuZWNlc3NhcnkgZm9yIHRoZSBgVFlQRURfVEVTVF9DQVNFYCBtYWNybyB0byBwYXJzZQorY29ycmVjdGx5LiAgT3RoZXJ3aXNlIHRoZSBjb21waWxlciB3aWxsIHRoaW5rIHRoYXQgZWFjaCBjb21tYSBpbiB0aGUKK3R5cGUgbGlzdCBpbnRyb2R1Y2VzIGEgbmV3IG1hY3JvIGFyZ3VtZW50LgorCitUaGVuLCB1c2UgYFRZUEVEX1RFU1QoKWAgaW5zdGVhZCBvZiBgVEVTVF9GKClgIHRvIGRlZmluZSBhIHR5cGVkIHRlc3QKK2ZvciB0aGlzIHRlc3QgY2FzZS4gIFlvdSBjYW4gcmVwZWF0IHRoaXMgYXMgbWFueSB0aW1lcyBhcyB5b3Ugd2FudDoKKworYGBgCitUWVBFRF9URVNUKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIHRoZSBzcGVjaWFsIG5hbWUgVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZQorICAvLyBwYXJhbWV0ZXIuICBTaW5jZSB3ZSBhcmUgaW5zaWRlIGEgZGVyaXZlZCBjbGFzcyB0ZW1wbGF0ZSwgQysrIHJlcXVpcmVzCisgIC8vIHVzIHRvIHZpc2l0IHRoZSBtZW1iZXJzIG9mIEZvb1Rlc3QgdmlhICd0aGlzJy4KKyAgVHlwZVBhcmFtIG4gPSB0aGlzLT52YWx1ZV87CisKKyAgLy8gVG8gdmlzaXQgc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUsIGFkZCB0aGUgJ1Rlc3RGaXh0dXJlOjonCisgIC8vIHByZWZpeC4KKyAgbiArPSBUZXN0Rml4dHVyZTo6c2hhcmVkXzsKKworICAvLyBUbyByZWZlciB0byB0eXBlZGVmcyBpbiB0aGUgZml4dHVyZSwgYWRkIHRoZSAndHlwZW5hbWUgVGVzdEZpeHR1cmU6OicKKyAgLy8gcHJlZml4LiAgVGhlICd0eXBlbmFtZScgaXMgcmVxdWlyZWQgdG8gc2F0aXNmeSB0aGUgY29tcGlsZXIuCisgIHR5cGVuYW1lIFRlc3RGaXh0dXJlOjpMaXN0IHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjayhuKTsKKyAgLi4uCit9CisKK1RZUEVEX1RFU1QoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9CitgYGAKKworWW91IGNhbiBzZWUgYHNhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jY2AgZm9yIGEgY29tcGxldGUgZXhhbXBsZS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzIChyZXF1aXJlcyBNU1ZDIDguMCBvciBhYm92ZSksIE1hYzsKK3NpbmNlIHZlcnNpb24gMS4xLjAuCisKKyMgVHlwZS1QYXJhbWV0ZXJpemVkIFRlc3RzICMKKworX1R5cGUtcGFyYW1ldGVyaXplZCB0ZXN0c18gYXJlIGxpa2UgdHlwZWQgdGVzdHMsIGV4Y2VwdCB0aGF0IHRoZXkKK2Rvbid0IHJlcXVpcmUgeW91IHRvIGtub3cgdGhlIGxpc3Qgb2YgdHlwZXMgYWhlYWQgb2YgdGltZS4gIEluc3RlYWQsCit5b3UgY2FuIGRlZmluZSB0aGUgdGVzdCBsb2dpYyBmaXJzdCBhbmQgaW5zdGFudGlhdGUgaXQgd2l0aCBkaWZmZXJlbnQKK3R5cGUgbGlzdHMgbGF0ZXIuICBZb3UgY2FuIGV2ZW4gaW5zdGFudGlhdGUgaXQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlCitzYW1lIHByb2dyYW0uCisKK0lmIHlvdSBhcmUgZGVzaWduaW5nIGFuIGludGVyZmFjZSBvciBjb25jZXB0LCB5b3UgY2FuIGRlZmluZSBhIHN1aXRlCitvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgdG8gdmVyaWZ5IHByb3BlcnRpZXMgdGhhdCBhbnkgdmFsaWQKK2ltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UvY29uY2VwdCBzaG91bGQgaGF2ZS4gIFRoZW4sIHRoZSBhdXRob3IKK29mIGVhY2ggaW1wbGVtZW50YXRpb24gY2FuIGp1c3QgaW5zdGFudGlhdGUgdGhlIHRlc3Qgc3VpdGUgd2l0aCBoaXMKK3R5cGUgdG8gdmVyaWZ5IHRoYXQgaXQgY29uZm9ybXMgdG8gdGhlIHJlcXVpcmVtZW50cywgd2l0aG91dCBoYXZpbmcgdG8KK3dyaXRlIHNpbWlsYXIgdGVzdHMgcmVwZWF0ZWRseS4gIEhlcmUncyBhbiBleGFtcGxlOgorCitGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSwgYXMgd2UgZGlkIHdpdGggdHlwZWQgdGVzdHM6CisKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC4uLgorfTsKK2BgYAorCitOZXh0LCBkZWNsYXJlIHRoYXQgeW91IHdpbGwgZGVmaW5lIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZToKKworYGBgCitUWVBFRF9URVNUX0NBU0VfUChGb29UZXN0KTsKK2BgYAorCitUaGUgYF9QYCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UKK3ByZWZlciB0byB0aGluay4KKworVGhlbiwgdXNlIGBUWVBFRF9URVNUX1AoKWAgdG8gZGVmaW5lIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuICBZb3UKK2NhbiByZXBlYXQgdGhpcyBhcyBtYW55IHRpbWVzIGFzIHlvdSB3YW50OgorCitgYGAKK1RZUEVEX1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgVHlwZVBhcmFtIG4gPSAwOworICAuLi4KK30KKworVFlQRURfVEVTVF9QKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorYGBgCisKK05vdyB0aGUgdHJpY2t5IHBhcnQ6IHlvdSBuZWVkIHRvIHJlZ2lzdGVyIGFsbCB0ZXN0IHBhdHRlcm5zIHVzaW5nIHRoZQorYFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QYCBtYWNybyBiZWZvcmUgeW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtLgorVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBtYWNybyBpcyB0aGUgdGVzdCBjYXNlIG5hbWU7IHRoZSByZXN0IGFyZQordGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZToKKworYGBgCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9lc0JsYWgsIEhhc1Byb3BlcnR5QSk7CitgYGAKKworRmluYWxseSwgeW91IGFyZSBmcmVlIHRvIGluc3RhbnRpYXRlIHRoZSBwYXR0ZXJuIHdpdGggdGhlIHR5cGVzIHlvdQord2FudC4gIElmIHlvdSBwdXQgdGhlIGFib3ZlIGNvZGUgaW4gYSBoZWFkZXIgZmlsZSwgeW91IGNhbiBgI2luY2x1ZGVgCitpdCBpbiBtdWx0aXBsZSBDKysgc291cmNlIGZpbGVzIGFuZCBpbnN0YW50aWF0ZSBpdCBtdWx0aXBsZSB0aW1lcy4KKworYGBgCit0eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgTXlUeXBlcyk7CitgYGAKKworVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgdGhlIGZpcnN0IGFyZ3VtZW50Cit0byB0aGUgYElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QYCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUKK2FkZGVkIHRvIHRoZSBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuICBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcworZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMuCisKK0luIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIHR5cGUgbGlzdCBjb250YWlucyBvbmx5IG9uZSB0eXBlLCB5b3UKK2NhbiB3cml0ZSB0aGF0IHR5cGUgZGlyZWN0bHkgd2l0aG91dCBgOjp0ZXN0aW5nOjpUeXBlczwuLi4+YCwgbGlrZSB0aGlzOgorCitgYGAKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBpbnQpOworYGBgCisKK1lvdSBjYW4gc2VlIGBzYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2NgIGZvciBhIGNvbXBsZXRlIGV4YW1wbGUuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cyAocmVxdWlyZXMgTVNWQyA4LjAgb3IgYWJvdmUpLCBNYWM7CitzaW5jZSB2ZXJzaW9uIDEuMS4wLgorCisjIFRlc3RpbmcgUHJpdmF0ZSBDb2RlICMKKworSWYgeW91IGNoYW5nZSB5b3VyIHNvZnR3YXJlJ3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24sIHlvdXIgdGVzdHMgc2hvdWxkIG5vdAorYnJlYWsgYXMgbG9uZyBhcyB0aGUgY2hhbmdlIGlzIG5vdCBvYnNlcnZhYmxlIGJ5IHVzZXJzLiBUaGVyZWZvcmUsIHBlciB0aGUKK19ibGFjay1ib3ggdGVzdGluZyBwcmluY2lwbGVfLCBtb3N0IG9mIHRoZSB0aW1lIHlvdSBzaG91bGQgdGVzdCB5b3VyIGNvZGUKK3Rocm91Z2ggaXRzIHB1YmxpYyBpbnRlcmZhY2VzLgorCitJZiB5b3Ugc3RpbGwgZmluZCB5b3Vyc2VsZiBuZWVkaW5nIHRvIHRlc3QgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gY29kZSwKK2NvbnNpZGVyIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgZGVzaWduIHRoYXQgd291bGRuJ3QgcmVxdWlyZSB5b3UgdG8gZG8gc28uIElmIHlvdQorYWJzb2x1dGVseSBoYXZlIHRvIHRlc3Qgbm9uLXB1YmxpYyBpbnRlcmZhY2UgY29kZSB0aG91Z2gsIHlvdSBjYW4uIFRoZXJlIGFyZQordHdvIGNhc2VzIHRvIGNvbnNpZGVyOgorCisgICogU3RhdGljIGZ1bmN0aW9ucyAoX25vdF8gdGhlIHNhbWUgYXMgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMhKSBvciB1bm5hbWVkIG5hbWVzcGFjZXMsIGFuZAorICAqIFByaXZhdGUgb3IgcHJvdGVjdGVkIGNsYXNzIG1lbWJlcnMKKworIyMgU3RhdGljIEZ1bmN0aW9ucyAjIworCitCb3RoIHN0YXRpYyBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zL2RlY2xhcmF0aW9ucyBpbiBhbiB1bm5hbWVkIG5hbWVzcGFjZSBhcmUKK29ubHkgdmlzaWJsZSB3aXRoaW4gdGhlIHNhbWUgdHJhbnNsYXRpb24gdW5pdC4gVG8gdGVzdCB0aGVtLCB5b3UgY2FuIGAjaW5jbHVkZWAKK3RoZSBlbnRpcmUgYC5jY2AgZmlsZSBiZWluZyB0ZXN0ZWQgaW4geW91ciBgKl90ZXN0LmNjYCBmaWxlLiAoI2luY2x1ZGluZyBgLmNjYAorZmlsZXMgaXMgbm90IGEgZ29vZCB3YXkgdG8gcmV1c2UgY29kZSAtIHlvdSBzaG91bGQgbm90IGRvIHRoaXMgaW4gcHJvZHVjdGlvbgorY29kZSEpCisKK0hvd2V2ZXIsIGEgYmV0dGVyIGFwcHJvYWNoIGlzIHRvIG1vdmUgdGhlIHByaXZhdGUgY29kZSBpbnRvIHRoZQorYGZvbzo6aW50ZXJuYWxgIG5hbWVzcGFjZSwgd2hlcmUgYGZvb2AgaXMgdGhlIG5hbWVzcGFjZSB5b3VyIHByb2plY3Qgbm9ybWFsbHkKK3VzZXMsIGFuZCBwdXQgdGhlIHByaXZhdGUgZGVjbGFyYXRpb25zIGluIGEgYCotaW50ZXJuYWwuaGAgZmlsZS4gWW91cgorcHJvZHVjdGlvbiBgLmNjYCBmaWxlcyBhbmQgeW91ciB0ZXN0cyBhcmUgYWxsb3dlZCB0byBpbmNsdWRlIHRoaXMgaW50ZXJuYWwKK2hlYWRlciwgYnV0IHlvdXIgY2xpZW50cyBhcmUgbm90LiBUaGlzIHdheSwgeW91IGNhbiBmdWxseSB0ZXN0IHlvdXIgaW50ZXJuYWwKK2ltcGxlbWVudGF0aW9uIHdpdGhvdXQgbGVha2luZyBpdCB0byB5b3VyIGNsaWVudHMuCisKKyMjIFByaXZhdGUgQ2xhc3MgTWVtYmVycyAjIworCitQcml2YXRlIGNsYXNzIG1lbWJlcnMgYXJlIG9ubHkgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiB0aGUgY2xhc3Mgb3IgYnkgZnJpZW5kcy4KK1RvIGFjY2VzcyBhIGNsYXNzJyBwcml2YXRlIG1lbWJlcnMsIHlvdSBjYW4gZGVjbGFyZSB5b3VyIHRlc3QgZml4dHVyZSBhcyBhCitmcmllbmQgdG8gdGhlIGNsYXNzIGFuZCBkZWZpbmUgYWNjZXNzb3JzIGluIHlvdXIgZml4dHVyZS4gVGVzdHMgdXNpbmcgdGhlCitmaXh0dXJlIGNhbiB0aGVuIGFjY2VzcyB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mIHlvdXIgcHJvZHVjdGlvbiBjbGFzcyB2aWEgdGhlCithY2Nlc3NvcnMgaW4gdGhlIGZpeHR1cmUuIE5vdGUgdGhhdCBldmVuIHRob3VnaCB5b3VyIGZpeHR1cmUgaXMgYSBmcmllbmQgdG8KK3lvdXIgcHJvZHVjdGlvbiBjbGFzcywgeW91ciB0ZXN0cyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgZnJpZW5kcyB0byBpdCwgYXMgdGhleQorYXJlIHRlY2huaWNhbGx5IGRlZmluZWQgaW4gc3ViLWNsYXNzZXMgb2YgdGhlIGZpeHR1cmUuCisKK0Fub3RoZXIgd2F5IHRvIHRlc3QgcHJpdmF0ZSBtZW1iZXJzIGlzIHRvIHJlZmFjdG9yIHRoZW0gaW50byBhbiBpbXBsZW1lbnRhdGlvbgorY2xhc3MsIHdoaWNoIGlzIHRoZW4gZGVjbGFyZWQgaW4gYSBgKi1pbnRlcm5hbC5oYCBmaWxlLiBZb3VyIGNsaWVudHMgYXJlbid0CithbGxvd2VkIHRvIGluY2x1ZGUgdGhpcyBoZWFkZXIgYnV0IHlvdXIgdGVzdHMgY2FuLiBTdWNoIGlzIGNhbGxlZCB0aGUgUGltcGwKKyhQcml2YXRlIEltcGxlbWVudGF0aW9uKSBpZGlvbS4KKworT3IsIHlvdSBjYW4gZGVjbGFyZSBhbiBpbmRpdmlkdWFsIHRlc3QgYXMgYSBmcmllbmQgb2YgeW91ciBjbGFzcyBieSBhZGRpbmcgdGhpcworbGluZSBpbiB0aGUgY2xhc3MgYm9keToKKworYGBgCitGUklFTkRfVEVTVChUZXN0Q2FzZU5hbWUsIFRlc3ROYW1lKTsKK2BgYAorCitGb3IgZXhhbXBsZSwKK2BgYAorLy8gZm9vLmgKKyNpbmNsdWRlIDxndGVzdC9ndGVzdF9wcm9kLmg+CisKKy8vIERlZmluZXMgRlJJRU5EX1RFU1QuCitjbGFzcyBGb28geworICAuLi4KKyBwcml2YXRlOgorICBGUklFTkRfVEVTVChGb29UZXN0LCBCYXJSZXR1cm5zWmVyb09uTnVsbCk7CisgIGludCBCYXIodm9pZCogeCk7Cit9OworCisvLyBmb29fdGVzdC5jYworLi4uCitURVNUKEZvb1Rlc3QsIEJhclJldHVybnNaZXJvT25OdWxsKSB7CisgIEZvbyBmb287CisgIEVYUEVDVF9FUSgwLCBmb28uQmFyKE5VTEwpKTsKKyAgLy8gVXNlcyBGb28ncyBwcml2YXRlIG1lbWJlciBCYXIoKS4KK30KK2BgYAorCitQYXkgc3BlY2lhbCBhdHRlbnRpb24gd2hlbiB5b3VyIGNsYXNzIGlzIGRlZmluZWQgaW4gYSBuYW1lc3BhY2UsIGFzIHlvdSBzaG91bGQKK2RlZmluZSB5b3VyIHRlc3QgZml4dHVyZXMgYW5kIHRlc3RzIGluIHRoZSBzYW1lIG5hbWVzcGFjZSBpZiB5b3Ugd2FudCB0aGVtIHRvCitiZSBmcmllbmRzIG9mIHlvdXIgY2xhc3MuIEZvciBleGFtcGxlLCBpZiB0aGUgY29kZSB0byBiZSB0ZXN0ZWQgbG9va3MgbGlrZToKKworYGBgCituYW1lc3BhY2UgbXlfbmFtZXNwYWNlIHsKKworY2xhc3MgRm9vIHsKKyAgZnJpZW5kIGNsYXNzIEZvb1Rlc3Q7CisgIEZSSUVORF9URVNUKEZvb1Rlc3QsIEJhcik7CisgIEZSSUVORF9URVNUKEZvb1Rlc3QsIEJheik7CisgIC4uLgorICBkZWZpbml0aW9uIG9mIHRoZSBjbGFzcyBGb28KKyAgLi4uCit9OworCit9ICAvLyBuYW1lc3BhY2UgbXlfbmFtZXNwYWNlCitgYGAKKworWW91ciB0ZXN0IGNvZGUgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlOgorCitgYGAKK25hbWVzcGFjZSBteV9uYW1lc3BhY2UgeworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLi4uCit9OworCitURVNUX0YoRm9vVGVzdCwgQmFyKSB7IC4uLiB9CitURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9CisKK30gIC8vIG5hbWVzcGFjZSBteV9uYW1lc3BhY2UKK2BgYAorCisjIENhdGNoaW5nIEZhaWx1cmVzICMKKworSWYgeW91IGFyZSBidWlsZGluZyBhIHRlc3RpbmcgdXRpbGl0eSBvbiB0b3Agb2YgR29vZ2xlIFRlc3QsIHlvdSdsbAord2FudCB0byB0ZXN0IHlvdXIgdXRpbGl0eS4gIFdoYXQgZnJhbWV3b3JrIHdvdWxkIHlvdSB1c2UgdG8gdGVzdCBpdD8KK0dvb2dsZSBUZXN0LCBvZiBjb3Vyc2UuCisKK1RoZSBjaGFsbGVuZ2UgaXMgdG8gdmVyaWZ5IHRoYXQgeW91ciB0ZXN0aW5nIHV0aWxpdHkgcmVwb3J0cyBmYWlsdXJlcworY29ycmVjdGx5LiAgSW4gZnJhbWV3b3JrcyB0aGF0IHJlcG9ydCBhIGZhaWx1cmUgYnkgdGhyb3dpbmcgYW4KK2V4Y2VwdGlvbiwgeW91IGNvdWxkIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIGFzc2VydCBvbiBpdC4gIEJ1dCBHb29nbGUKK1Rlc3QgZG9lc24ndCB1c2UgZXhjZXB0aW9ucywgc28gaG93IGRvIHdlIHRlc3QgdGhhdCBhIHBpZWNlIG9mIGNvZGUKK2dlbmVyYXRlcyBhbiBleHBlY3RlZCBmYWlsdXJlPworCitgPGd0ZXN0L2d0ZXN0LXNwaS5oPmAgY29udGFpbnMgc29tZSBjb25zdHJ1Y3RzIHRvIGRvIHRoaXMuICBBZnRlcgorI2luY2x1ZGluZyB0aGlzIGhlYWRlciwgeW91IGNhbiB1c2UKKworfCBgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoYF9zdGF0ZW1lbnQsIHN1YnN0cmluZ19gKTtgIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKK3RvIGFzc2VydCB0aGF0IF9zdGF0ZW1lbnRfIGdlbmVyYXRlcyBhIGZhdGFsIChlLmcuIGBBU1NFUlRfKmApIGZhaWx1cmUKK3dob3NlIG1lc3NhZ2UgY29udGFpbnMgdGhlIGdpdmVuIF9zdWJzdHJpbmdfLCBvciB1c2UKKworfCBgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYF9zdGF0ZW1lbnQsIHN1YnN0cmluZ19gKTtgIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKK2lmIHlvdSBhcmUgZXhwZWN0aW5nIGEgbm9uLWZhdGFsIChlLmcuIGBFWFBFQ1RfKmApIGZhaWx1cmUuCisKK0ZvciB0ZWNobmljYWwgcmVhc29ucywgdGhlcmUgYXJlIHNvbWUgY2F2ZWF0czoKKworICAxLiBZb3UgY2Fubm90IHN0cmVhbSBhIGZhaWx1cmUgbWVzc2FnZSB0byBlaXRoZXIgbWFjcm8uCisgIDEuIF9zdGF0ZW1lbnRfIGluIGBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpYCBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsIG5vbi1zdGF0aWMgdmFyaWFibGVzIG9yIG5vbi1zdGF0aWMgbWVtYmVycyBvZiBgdGhpc2Agb2JqZWN0LgorICAxLiBfc3RhdGVtZW50XyBpbiBgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKWAgY2Fubm90IHJldHVybiBhIHZhbHVlLgorCitfTm90ZTpfIEdvb2dsZSBUZXN0IGlzIGRlc2lnbmVkIHdpdGggdGhyZWFkcyBpbiBtaW5kLiAgT25jZSB0aGUKK3N5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGluIGA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oPmAgaGF2ZQorYmVlbiBpbXBsZW1lbnRlZCwgR29vZ2xlIFRlc3Qgd2lsbCBiZWNvbWUgdGhyZWFkLXNhZmUsIG1lYW5pbmcgdGhhdAoreW91IGNhbiB0aGVuIHVzZSBhc3NlcnRpb25zIGluIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LiAgQmVmb3JlCisKK3RoYXQsIGhvd2V2ZXIsIEdvb2dsZSBUZXN0IG9ubHkgc3VwcG9ydHMgc2luZ2xlLXRocmVhZGVkIHVzYWdlLiAgT25jZQordGhyZWFkLXNhZmUsIGBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpYCBhbmQgYEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKClgCit3aWxsIGNhcHR1cmUgZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIG9ubHkuIElmIF9zdGF0ZW1lbnRfCitjcmVhdGVzIG5ldyB0aHJlYWRzLCBmYWlsdXJlcyBpbiB0aGVzZSB0aHJlYWRzIHdpbGwgYmUgaWdub3JlZC4gIElmCit5b3Ugd2FudCB0byBjYXB0dXJlIGZhaWx1cmVzIGZyb20gYWxsIHRocmVhZHMgaW5zdGVhZCwgeW91IHNob3VsZCB1c2UKK3RoZSBmb2xsb3dpbmcgbWFjcm9zOgorCit8IGBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhgX3N0YXRlbWVudCwgc3Vic3RyaW5nX2ApO2AgfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKGBfc3RhdGVtZW50LCBzdWJzdHJpbmdfYCk7YCB8CisKKyMgR2V0dGluZyB0aGUgQ3VycmVudCBUZXN0J3MgTmFtZSAjCisKK1NvbWV0aW1lcyBhIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGtub3cgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuCitGb3IgZXhhbXBsZSwgeW91IG1heSBiZSB1c2luZyB0aGUgYFNldFVwKClgIG1ldGhvZCBvZiB5b3VyIHRlc3QgZml4dHVyZSB0byBzZXQKK3RoZSBnb2xkZW4gZmlsZSBuYW1lIGJhc2VkIG9uIHdoaWNoIHRlc3QgaXMgcnVubmluZy4gVGhlIGA6OnRlc3Rpbmc6OlRlc3RJbmZvYAorY2xhc3MgaGFzIHRoaXMgaW5mb3JtYXRpb246CisKK2BgYAorbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBUZXN0SW5mbyB7CisgcHVibGljOgorICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgbmFtZSBhbmQgdGhlIHRlc3QgbmFtZSwgcmVzcGVjdGl2ZWx5LgorICAvLworICAvLyBEbyBOT1QgZGVsZXRlIG9yIGZyZWUgdGhlIHJldHVybiB2YWx1ZSAtIGl0J3MgbWFuYWdlZCBieSB0aGUKKyAgLy8gVGVzdEluZm8gY2xhc3MuCisgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lKCkgY29uc3Q7CisgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCitgYGAKKworCis+IFRvIG9idGFpbiBhIGBUZXN0SW5mb2Agb2JqZWN0IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdCwgY2FsbAorYGN1cnJlbnRfdGVzdF9pbmZvKClgIG9uIHRoZSBgVW5pdFRlc3RgIHNpbmdsZXRvbiBvYmplY3Q6CisKK2BgYAorLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4KKy8vIERvIE5PVCBkZWxldGUgdGhlIHJldHVybmVkIG9iamVjdCAtIGl0J3MgbWFuYWdlZCBieSB0aGUgVW5pdFRlc3QgY2xhc3MuCitjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworcHJpbnRmKCJXZSBhcmUgaW4gdGVzdCAlcyBvZiB0ZXN0IGNhc2UgJXMuXG4iLAorICAgICAgIHRlc3RfaW5mby0+bmFtZSgpLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpOworYGBgCisKK2BjdXJyZW50X3Rlc3RfaW5mbygpYCByZXR1cm5zIGEgbnVsbCBwb2ludGVyIGlmIG5vIHRlc3QgaXMgcnVubmluZy4gSW4KK3BhcnRpY3VsYXIsIHlvdSBjYW5ub3QgZmluZCB0aGUgdGVzdCBjYXNlIG5hbWUgaW4gYFRlc3RDYXNlU2V0VXAoKWAsCitgVGVzdENhc2VUZWFyRG93bigpYCAod2hlcmUgeW91IGtub3cgdGhlIHRlc3QgY2FzZSBuYW1lIGltcGxpY2l0bHkpLCBvcgorZnVuY3Rpb25zIGNhbGxlZCBmcm9tIHRoZW0uCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIEV4dGVuZGluZyBHb29nbGUgVGVzdCBieSBIYW5kbGluZyBUZXN0IEV2ZW50cyAjCisKK0dvb2dsZSBUZXN0IHByb3ZpZGVzIGFuIDxiPmV2ZW50IGxpc3RlbmVyIEFQSTwvYj4gdG8gbGV0IHlvdSByZWNlaXZlCitub3RpZmljYXRpb25zIGFib3V0IHRoZSBwcm9ncmVzcyBvZiBhIHRlc3QgcHJvZ3JhbSBhbmQgdGVzdAorZmFpbHVyZXMuIFRoZSBldmVudHMgeW91IGNhbiBsaXN0ZW4gdG8gaW5jbHVkZSB0aGUgc3RhcnQgYW5kIGVuZCBvZgordGhlIHRlc3QgcHJvZ3JhbSwgYSB0ZXN0IGNhc2UsIG9yIGEgdGVzdCBtZXRob2QsIGFtb25nIG90aGVycy4gWW91IG1heQordXNlIHRoaXMgQVBJIHRvIGF1Z21lbnQgb3IgcmVwbGFjZSB0aGUgc3RhbmRhcmQgY29uc29sZSBvdXRwdXQsCityZXBsYWNlIHRoZSBYTUwgb3V0cHV0LCBvciBwcm92aWRlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgZm9ybSBvZgorb3V0cHV0LCBzdWNoIGFzIGEgR1VJIG9yIGEgZGF0YWJhc2UuIFlvdSBjYW4gYWxzbyB1c2UgdGVzdCBldmVudHMgYXMKK2NoZWNrcG9pbnRzIHRvIGltcGxlbWVudCBhIHJlc291cmNlIGxlYWsgY2hlY2tlciwgZm9yIGV4YW1wbGUuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2MS40LjAuCisKKyMjIERlZmluaW5nIEV2ZW50IExpc3RlbmVycyAjIworCitUbyBkZWZpbmUgYSBldmVudCBsaXN0ZW5lciwgeW91IHN1YmNsYXNzIGVpdGhlcgorW3Rlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM4NTUpCitvciBbdGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgjOTA1KS4KK1RoZSBmb3JtZXIgaXMgYW4gKGFic3RyYWN0KSBpbnRlcmZhY2UsIHdoZXJlIDxpPmVhY2ggcHVyZSB2aXJ0dWFsIG1ldGhvZDxicj4KK2NhbiBiZSBvdmVycmlkZGVuIHRvIGhhbmRsZSBhIHRlc3QgZXZlbnQ8L2k+IChGb3IgZXhhbXBsZSwgd2hlbiBhIHRlc3QKK3N0YXJ0cywgdGhlIGBPblRlc3RTdGFydCgpYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuKS4gVGhlIGxhdHRlciBwcm92aWRlcworYW4gZW1wdHkgaW1wbGVtZW50YXRpb24gb2YgYWxsIG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSwgc3VjaCB0aGF0IGEKK3N1YmNsYXNzIG9ubHkgbmVlZHMgdG8gb3ZlcnJpZGUgdGhlIG1ldGhvZHMgaXQgY2FyZXMgYWJvdXQuCisKK1doZW4gYW4gZXZlbnQgaXMgZmlyZWQsIGl0cyBjb250ZXh0IGlzIHBhc3NlZCB0byB0aGUgaGFuZGxlciBmdW5jdGlvbgorYXMgYW4gYXJndW1lbnQuIFRoZSBmb2xsb3dpbmcgYXJndW1lbnQgdHlwZXMgYXJlIHVzZWQ6CisgICogW1VuaXRUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCMxMDA3KSByZWZsZWN0cyB0aGUgc3RhdGUgb2YgdGhlIGVudGlyZSB0ZXN0IHByb2dyYW0sCisgICogW1Rlc3RDYXNlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM2ODkpIGhhcyBpbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QgY2FzZSwgd2hpY2ggY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgdGVzdHMsCisgICogW1Rlc3RJbmZvXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM1OTkpIGNvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIHRlc3QsIGFuZAorICAqIFtUZXN0UGFydFJlc3VsdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oIzQyKSByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSB0ZXN0IGFzc2VydGlvbi4KKworQW4gZXZlbnQgaGFuZGxlciBmdW5jdGlvbiBjYW4gZXhhbWluZSB0aGUgYXJndW1lbnQgaXQgcmVjZWl2ZXMgdG8gZmluZAorb3V0IGludGVyZXN0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudCBhbmQgdGhlIHRlc3QgcHJvZ3JhbSdzCitzdGF0ZS4gIEhlcmUncyBhbiBleGFtcGxlOgorCitgYGAKKyAgY2xhc3MgTWluaW1hbGlzdFByaW50ZXIgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyAgICAvLyBDYWxsZWQgYmVmb3JlIGEgdGVzdCBzdGFydHMuCisgICAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgICAgcHJpbnRmKCIqKiogVGVzdCAlcy4lcyBzdGFydGluZy5cbiIsCisgICAgICAgICAgICAgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgIH0KKworICAgIC8vIENhbGxlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRVNTKCkuCisgICAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoCisgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgICAgIHByaW50ZigiJXMgaW4gJXM6JWRcbiVzXG4iLAorICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmFpbGVkKCkgPyAiKioqIEZhaWx1cmUiIDogIlN1Y2Nlc3MiLAorICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCisgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpLAorICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuc3VtbWFyeSgpKTsKKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYWZ0ZXIgYSB0ZXN0IGVuZHMuCisgICAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICAgIHByaW50ZigiKioqIFRlc3QgJXMuJXMgZW5kaW5nLlxuIiwKKyAgICAgICAgICAgICB0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgfQorICB9OworYGBgCisKKyMjIFVzaW5nIEV2ZW50IExpc3RlbmVycyAjIworCitUbyB1c2UgdGhlIGV2ZW50IGxpc3RlbmVyIHlvdSBoYXZlIGRlZmluZWQsIGFkZCBhbiBpbnN0YW5jZSBvZiBpdCB0bwordGhlIEdvb2dsZSBUZXN0IGV2ZW50IGxpc3RlbmVyIGxpc3QgKHJlcHJlc2VudGVkIGJ5IGNsYXNzCitbVGVzdEV2ZW50TGlzdGVuZXJzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM5MjkpCistIG5vdGUgdGhlICJzIiBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lKSBpbiB5b3VyCitgbWFpbigpYCBmdW5jdGlvbiwgYmVmb3JlIGNhbGxpbmcgYFJVTl9BTExfVEVTVFMoKWA6CitgYGAKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgLy8gR2V0cyBob2xkIG9mIHRoZSBldmVudCBsaXN0ZW5lciBsaXN0LgorICA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0KKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpOworICAvLyBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGVuZC4gIEdvb2dsZSBUZXN0IHRha2VzIHRoZSBvd25lcnNoaXAuCisgIGxpc3RlbmVycy5BcHBlbmQobmV3IE1pbmltYWxpc3RQcmludGVyKTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KK2BgYAorCitUaGVyZSdzIG9ubHkgb25lIHByb2JsZW06IHRoZSBkZWZhdWx0IHRlc3QgcmVzdWx0IHByaW50ZXIgaXMgc3RpbGwgaW4KK2VmZmVjdCwgc28gaXRzIG91dHB1dCB3aWxsIG1pbmdsZSB3aXRoIHRoZSBvdXRwdXQgZnJvbSB5b3VyIG1pbmltYWxpc3QKK3ByaW50ZXIuIFRvIHN1cHByZXNzIHRoZSBkZWZhdWx0IHByaW50ZXIsIGp1c3QgcmVsZWFzZSBpdCBmcm9tIHRoZQorZXZlbnQgbGlzdGVuZXIgbGlzdCBhbmQgZGVsZXRlIGl0LiBZb3UgY2FuIGRvIHNvIGJ5IGFkZGluZyBvbmUgbGluZToKK2BgYAorICAuLi4KKyAgZGVsZXRlIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkpOworICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBNaW5pbWFsaXN0UHJpbnRlcik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7CitgYGAKKworTm93LCBzaXQgYmFjayBhbmQgZW5qb3kgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBvdXRwdXQgZnJvbSB5b3VyCit0ZXN0cy4gRm9yIG1vcmUgZGV0YWlscywgeW91IGNhbiByZWFkIHRoaXMKK1tzYW1wbGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjKS4KKworWW91IG1heSBhcHBlbmQgbW9yZSB0aGFuIG9uZSBsaXN0ZW5lciB0byB0aGUgbGlzdC4gV2hlbiBhbiBgT24qU3RhcnQoKWAKK29yIGBPblRlc3RQYXJ0UmVzdWx0KClgIGV2ZW50IGlzIGZpcmVkLCB0aGUgbGlzdGVuZXJzIHdpbGwgcmVjZWl2ZSBpdCBpbgordGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBsaXN0IChzaW5jZSBuZXcgbGlzdGVuZXJzIGFyZSBhZGRlZCB0bwordGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlIGRlZmF1bHQgdGV4dCBwcmludGVyIGFuZCB0aGUgZGVmYXVsdCBYTUwKK2dlbmVyYXRvciB3aWxsIHJlY2VpdmUgdGhlIGV2ZW50IGZpcnN0KS4gQW4gYE9uKkVuZCgpYCBldmVudCB3aWxsIGJlCityZWNlaXZlZCBieSB0aGUgbGlzdGVuZXJzIGluIHRoZSBfcmV2ZXJzZV8gb3JkZXIuIFRoaXMgYWxsb3dzIG91dHB1dCBieQorbGlzdGVuZXJzIGFkZGVkIGxhdGVyIHRvIGJlIGZyYW1lZCBieSBvdXRwdXQgZnJvbSBsaXN0ZW5lcnMgYWRkZWQKK2VhcmxpZXIuCisKKyMjIEdlbmVyYXRpbmcgRmFpbHVyZXMgaW4gTGlzdGVuZXJzICMjCisKK1lvdSBtYXkgdXNlIGZhaWx1cmUtcmFpc2luZyBtYWNyb3MgKGBFWFBFQ1RfKigpYCwgYEFTU0VSVF8qKClgLAorYEZBSUwoKWAsIGV0Yykgd2hlbiBwcm9jZXNzaW5nIGFuIGV2ZW50LiBUaGVyZSBhcmUgc29tZSByZXN0cmljdGlvbnM6CisKKyAgMS4gWW91IGNhbm5vdCBnZW5lcmF0ZSBhbnkgZmFpbHVyZSBpbiBgT25UZXN0UGFydFJlc3VsdCgpYCAob3RoZXJ3aXNlIGl0IHdpbGwgY2F1c2UgYE9uVGVzdFBhcnRSZXN1bHQoKWAgdG8gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5KS4KKyAgMS4gQSBsaXN0ZW5lciB0aGF0IGhhbmRsZXMgYE9uVGVzdFBhcnRSZXN1bHQoKWAgaXMgbm90IGFsbG93ZWQgdG8gZ2VuZXJhdGUgYW55IGZhaWx1cmUuCisKK1doZW4geW91IGFkZCBsaXN0ZW5lcnMgdG8gdGhlIGxpc3RlbmVyIGxpc3QsIHlvdSBzaG91bGQgcHV0IGxpc3RlbmVycwordGhhdCBoYW5kbGUgYE9uVGVzdFBhcnRSZXN1bHQoKWAgX2JlZm9yZV8gbGlzdGVuZXJzIHRoYXQgY2FuIGdlbmVyYXRlCitmYWlsdXJlcy4gVGhpcyBlbnN1cmVzIHRoYXQgZmFpbHVyZXMgZ2VuZXJhdGVkIGJ5IHRoZSBsYXR0ZXIgYXJlCithdHRyaWJ1dGVkIHRvIHRoZSByaWdodCB0ZXN0IGJ5IHRoZSBmb3JtZXIuCisKK1dlIGhhdmUgYSBzYW1wbGUgb2YgZmFpbHVyZS1yYWlzaW5nIGxpc3RlbmVyCitbaGVyZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjKS4KKworIyBSdW5uaW5nIFRlc3QgUHJvZ3JhbXM6IEFkdmFuY2VkIE9wdGlvbnMgIworCitHb29nbGUgVGVzdCB0ZXN0IHByb2dyYW1zIGFyZSBvcmRpbmFyeSBleGVjdXRhYmxlcy4gT25jZSBidWlsdCwgeW91IGNhbiBydW4KK3RoZW0gZGlyZWN0bHkgYW5kIGFmZmVjdCB0aGVpciBiZWhhdmlvciB2aWEgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK2FuZC9vciBjb21tYW5kIGxpbmUgZmxhZ3MuIEZvciB0aGUgZmxhZ3MgdG8gd29yaywgeW91ciBwcm9ncmFtcyBtdXN0IGNhbGwKK2A6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KClgIGJlZm9yZSBjYWxsaW5nIGBSVU5fQUxMX1RFU1RTKClgLgorCitUbyBzZWUgYSBsaXN0IG9mIHN1cHBvcnRlZCBmbGFncyBhbmQgdGhlaXIgdXNhZ2UsIHBsZWFzZSBydW4geW91ciB0ZXN0Citwcm9ncmFtIHdpdGggdGhlIGAtLWhlbHBgIGZsYWcuICBZb3UgY2FuIGFsc28gdXNlIGAtaGAsIGAtP2AsIG9yIGAvP2AKK2ZvciBzaG9ydC4gIFRoaXMgZmVhdHVyZSBpcyBhZGRlZCBpbiB2ZXJzaW9uIDEuMy4wLgorCitJZiBhbiBvcHRpb24gaXMgc3BlY2lmaWVkIGJvdGggYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGJ5IGEKK2ZsYWcsIHRoZSBsYXR0ZXIgdGFrZXMgcHJlY2VkZW5jZS4gIE1vc3Qgb2YgdGhlIG9wdGlvbnMgY2FuIGFsc28gYmUKK3NldC9yZWFkIGluIGNvZGU6IHRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgY29tbWFuZCBsaW5lIGZsYWcKK2AtLWd0ZXN0X2Zvb2AsIHdyaXRlIGA6OnRlc3Rpbmc6OkdURVNUX0ZMQUcoZm9vKWAuICBBIGNvbW1vbiBwYXR0ZXJuIGlzCit0byBzZXQgdGhlIHZhbHVlIG9mIGEgZmxhZyBiZWZvcmUgY2FsbGluZyBgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpYAordG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmbGFnOgorYGBgCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgLy8gRGlzYWJsZXMgZWxhcHNlZCB0aW1lIGJ5IGRlZmF1bHQuCisgIDo6dGVzdGluZzo6R1RFU1RfRkxBRyhwcmludF90aW1lKSA9IGZhbHNlOworCisgIC8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBmbGFnIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CitgYGAKKworIyMgU2VsZWN0aW5nIFRlc3RzICMjCisKK1RoaXMgc2VjdGlvbiBzaG93cyB2YXJpb3VzIG9wdGlvbnMgZm9yIGNob29zaW5nIHdoaWNoIHRlc3RzIHRvIHJ1bi4KKworIyMjIExpc3RpbmcgVGVzdCBOYW1lcyAjIyMKKworU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBsaXN0IHRoZSBhdmFpbGFibGUgdGVzdHMgaW4gYSBwcm9ncmFtIGJlZm9yZQorcnVubmluZyB0aGVtIHNvIHRoYXQgYSBmaWx0ZXIgbWF5IGJlIGFwcGxpZWQgaWYgbmVlZGVkLiBJbmNsdWRpbmcgdGhlIGZsYWcKK2AtLWd0ZXN0X2xpc3RfdGVzdHNgIG92ZXJyaWRlcyBhbGwgb3RoZXIgZmxhZ3MgYW5kIGxpc3RzIHRlc3RzIGluIHRoZSBmb2xsb3dpbmcKK2Zvcm1hdDoKK2BgYAorVGVzdENhc2UxLgorICBUZXN0TmFtZTEKKyAgVGVzdE5hbWUyCitUZXN0Q2FzZTIuCisgIFRlc3ROYW1lCitgYGAKKworTm9uZSBvZiB0aGUgdGVzdHMgbGlzdGVkIGFyZSBhY3R1YWxseSBydW4gaWYgdGhlIGZsYWcgaXMgcHJvdmlkZWQuIFRoZXJlIGlzIG5vCitjb3JyZXNwb25kaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciB0aGlzIGZsYWcuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgUnVubmluZyBhIFN1YnNldCBvZiB0aGUgVGVzdHMgIyMjCisKK0J5IGRlZmF1bHQsIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSBydW5zIGFsbCB0ZXN0cyB0aGUgdXNlciBoYXMgZGVmaW5lZC4KK1NvbWV0aW1lcywgeW91IHdhbnQgdG8gcnVuIG9ubHkgYSBzdWJzZXQgb2YgdGhlIHRlc3RzIChlLmcuIGZvciBkZWJ1Z2dpbmcgb3IKK3F1aWNrbHkgdmVyaWZ5aW5nIGEgY2hhbmdlKS4gSWYgeW91IHNldCB0aGUgYEdURVNUX0ZJTFRFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUKK29yIHRoZSBgLS1ndGVzdF9maWx0ZXJgIGZsYWcgdG8gYSBmaWx0ZXIgc3RyaW5nLCBHb29nbGUgVGVzdCB3aWxsIG9ubHkgcnVuIHRoZQordGVzdHMgd2hvc2UgZnVsbCBuYW1lcyAoaW4gdGhlIGZvcm0gb2YgYFRlc3RDYXNlTmFtZS5UZXN0TmFtZWApIG1hdGNoIHRoZQorZmlsdGVyLgorCitUaGUgZm9ybWF0IG9mIGEgZmlsdGVyIGlzIGEgJ2A6YCctc2VwYXJhdGVkIGxpc3Qgb2Ygd2lsZGNhcmQgcGF0dGVybnMgKGNhbGxlZAordGhlIHBvc2l0aXZlIHBhdHRlcm5zKSBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgJ2AtYCcgYW5kIGFub3RoZXIKKydgOmAnLXNlcGFyYXRlZCBwYXR0ZXJuIGxpc3QgKGNhbGxlZCB0aGUgbmVnYXRpdmUgcGF0dGVybnMpLiBBIHRlc3QgbWF0Y2hlcyB0aGUKK2ZpbHRlciBpZiBhbmQgb25seSBpZiBpdCBtYXRjaGVzIGFueSBvZiB0aGUgcG9zaXRpdmUgcGF0dGVybnMgYnV0IGRvZXMgbm90CittYXRjaCBhbnkgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLgorCitBIHBhdHRlcm4gbWF5IGNvbnRhaW4gYCcqJ2AgKG1hdGNoZXMgYW55IHN0cmluZykgb3IgYCc/J2AgKG1hdGNoZXMgYW55IHNpbmdsZQorY2hhcmFjdGVyKS4gRm9yIGNvbnZlbmllbmNlLCB0aGUgZmlsdGVyIGAnKi1OZWdhdGl2ZVBhdHRlcm5zJ2AgY2FuIGJlIGFsc28KK3dyaXR0ZW4gYXMgYCctTmVnYXRpdmVQYXR0ZXJucydgLgorCitGb3IgZXhhbXBsZToKKworICAqIGAuL2Zvb190ZXN0YCBIYXMgbm8gZmxhZywgYW5kIHRodXMgcnVucyBhbGwgaXRzIHRlc3RzLgorICAqIGAuL2Zvb190ZXN0IC0tZ3Rlc3RfZmlsdGVyPSpgIEFsc28gcnVucyBldmVyeXRoaW5nLCBkdWUgdG8gdGhlIHNpbmdsZSBtYXRjaC1ldmVyeXRoaW5nIGAqYCB2YWx1ZS4KKyAgKiBgLi9mb29fdGVzdCAtLWd0ZXN0X2ZpbHRlcj1Gb29UZXN0LipgIFJ1bnMgZXZlcnl0aGluZyBpbiB0ZXN0IGNhc2UgYEZvb1Rlc3RgLgorICAqIGAuL2Zvb190ZXN0IC0tZ3Rlc3RfZmlsdGVyPSpOdWxsKjoqQ29uc3RydWN0b3IqYCBSdW5zIGFueSB0ZXN0IHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyBlaXRoZXIgYCJOdWxsImAgb3IgYCJDb25zdHJ1Y3RvciJgLgorICAqIGAuL2Zvb190ZXN0IC0tZ3Rlc3RfZmlsdGVyPS0qRGVhdGhUZXN0LipgIFJ1bnMgYWxsIG5vbi1kZWF0aCB0ZXN0cy4KKyAgKiBgLi9mb29fdGVzdCAtLWd0ZXN0X2ZpbHRlcj1Gb29UZXN0LiotRm9vVGVzdC5CYXJgIFJ1bnMgZXZlcnl0aGluZyBpbiB0ZXN0IGNhc2UgYEZvb1Rlc3RgIGV4Y2VwdCBgRm9vVGVzdC5CYXJgLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMjIFRlbXBvcmFyaWx5IERpc2FibGluZyBUZXN0cyAjIyMKKworSWYgeW91IGhhdmUgYSBicm9rZW4gdGVzdCB0aGF0IHlvdSBjYW5ub3QgZml4IHJpZ2h0IGF3YXksIHlvdSBjYW4gYWRkIHRoZQorYERJU0FCTEVEX2AgcHJlZml4IHRvIGl0cyBuYW1lLiBUaGlzIHdpbGwgZXhjbHVkZSBpdCBmcm9tIGV4ZWN1dGlvbi4gVGhpcyBpcworYmV0dGVyIHRoYW4gY29tbWVudGluZyBvdXQgdGhlIGNvZGUgb3IgdXNpbmcgYCNpZiAwYCwgYXMgZGlzYWJsZWQgdGVzdHMgYXJlCitzdGlsbCBjb21waWxlZCAoYW5kIHRodXMgd29uJ3Qgcm90KS4KKworSWYgeW91IG5lZWQgdG8gZGlzYWJsZSBhbGwgdGVzdHMgaW4gYSB0ZXN0IGNhc2UsIHlvdSBjYW4gZWl0aGVyIGFkZCBgRElTQUJMRURfYAordG8gdGhlIGZyb250IG9mIHRoZSBuYW1lIG9mIGVhY2ggdGVzdCwgb3IgYWx0ZXJuYXRpdmVseSBhZGQgaXQgdG8gdGhlIGZyb250IG9mCit0aGUgdGVzdCBjYXNlIG5hbWUuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRlc3RzIHdvbid0IGJlIHJ1biBieSBHb29nbGUgVGVzdCwgZXZlbiB0aG91Z2ggdGhleQord2lsbCBzdGlsbCBiZSBjb21waWxlZDoKKworYGBgCisvLyBUZXN0cyB0aGF0IEZvbyBkb2VzIEFiYy4KK1RFU1QoRm9vVGVzdCwgRElTQUJMRURfRG9lc0FiYykgeyAuLi4gfQorCitjbGFzcyBESVNBQkxFRF9CYXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7IC4uLiB9OworCisvLyBUZXN0cyB0aGF0IEJhciBkb2VzIFh5ei4KK1RFU1RfRihESVNBQkxFRF9CYXJUZXN0LCBEb2VzWHl6KSB7IC4uLiB9CitgYGAKKworX05vdGU6XyBUaGlzIGZlYXR1cmUgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVtcG9yYXJ5IHBhaW4tcmVsaWVmLiBZb3Ugc3RpbGwKK2hhdmUgdG8gZml4IHRoZSBkaXNhYmxlZCB0ZXN0cyBhdCBhIGxhdGVyIGRhdGUuIEFzIGEgcmVtaW5kZXIsIEdvb2dsZSBUZXN0IHdpbGwKK3ByaW50IGEgYmFubmVyIHdhcm5pbmcgeW91IGlmIGEgdGVzdCBwcm9ncmFtIGNvbnRhaW5zIGFueSBkaXNhYmxlZCB0ZXN0cy4KKworX1RpcDpfIFlvdSBjYW4gZWFzaWx5IGNvdW50IHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgeW91IGhhdmUKK3VzaW5nIGBncmVwYC4gVGhpcyBudW1iZXIgY2FuIGJlIHVzZWQgYXMgYSBtZXRyaWMgZm9yIGltcHJvdmluZyB5b3VyCit0ZXN0IHF1YWxpdHkuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgVGVtcG9yYXJpbHkgRW5hYmxpbmcgRGlzYWJsZWQgVGVzdHMgIyMjCisKK1RvIGluY2x1ZGUgW2Rpc2FibGVkIHRlc3RzXSgjVGVtcG9yYXJpbHlfRGlzYWJsaW5nX1Rlc3RzLm1kKSBpbiB0ZXN0CitleGVjdXRpb24sIGp1c3QgaW52b2tlIHRoZSB0ZXN0IHByb2dyYW0gd2l0aCB0aGUKK2AtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzYCBmbGFnIG9yIHNldCB0aGUKK2BHVEVTVF9BTFNPX1JVTl9ESVNBQkxFRF9URVNUU2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSB2YWx1ZSBvdGhlcgordGhhbiBgMGAuICBZb3UgY2FuIGNvbWJpbmUgdGhpcyB3aXRoIHRoZQorWy0tZ3Rlc3RcX2ZpbHRlcl0oI1J1bm5pbmdfYV9TdWJzZXRfb2ZfdGhlX1Rlc3RzLm1kKSBmbGFnIHRvIGZ1cnRoZXIgc2VsZWN0Cit3aGljaCBkaXNhYmxlZCB0ZXN0cyB0byBydW4uCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2ZXJzaW9uIDEuMy4wLgorCisjIyBSZXBlYXRpbmcgdGhlIFRlc3RzICMjCisKK09uY2UgaW4gYSB3aGlsZSB5b3UnbGwgcnVuIGludG8gYSB0ZXN0IHdob3NlIHJlc3VsdCBpcyBoaXQtb3ItbWlzcy4gUGVyaGFwcyBpdAord2lsbCBmYWlsIG9ubHkgMSUgb2YgdGhlIHRpbWUsIG1ha2luZyBpdCByYXRoZXIgaGFyZCB0byByZXByb2R1Y2UgdGhlIGJ1ZyB1bmRlcgorYSBkZWJ1Z2dlci4gVGhpcyBjYW4gYmUgYSBtYWpvciBzb3VyY2Ugb2YgZnJ1c3RyYXRpb24uCisKK1RoZSBgLS1ndGVzdF9yZXBlYXRgIGZsYWcgYWxsb3dzIHlvdSB0byByZXBlYXQgYWxsIChvciBzZWxlY3RlZCkgdGVzdCBtZXRob2RzCitpbiBhIHByb2dyYW0gbWFueSB0aW1lcy4gSG9wZWZ1bGx5LCBhIGZsYWt5IHRlc3Qgd2lsbCBldmVudHVhbGx5IGZhaWwgYW5kIGdpdmUKK3lvdSBhIGNoYW5jZSB0byBkZWJ1Zy4gSGVyZSdzIGhvdyB0byB1c2UgaXQ6CisKK3wgYCQgZm9vX3Rlc3QgLS1ndGVzdF9yZXBlYXQ9MTAwMGAgfCBSZXBlYXQgZm9vXF90ZXN0IDEwMDAgdGltZXMgYW5kIGRvbid0IHN0b3AgYXQgZmFpbHVyZXMuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYCQgZm9vX3Rlc3QgLS1ndGVzdF9yZXBlYXQ9LTFgICAgfCBBIG5lZ2F0aXZlIGNvdW50IG1lYW5zIHJlcGVhdGluZyBmb3JldmVyLiAgICAgICAgICAgICAgIHwKK3wgYCQgZm9vX3Rlc3QgLS1ndGVzdF9yZXBlYXQ9MTAwMCAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVgIHwgUmVwZWF0IGZvb1xfdGVzdCAxMDAwIHRpbWVzLCBzdG9wcGluZyBhdCB0aGUgZmlyc3QgZmFpbHVyZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgYSBkZWJ1Z2dlcjogd2hlbiB0aGUgdGVzdGZhaWxzLCBpdCB3aWxsIGRyb3AgaW50byB0aGUgZGVidWdnZXIgYW5kIHlvdSBjYW4gdGhlbiBpbnNwZWN0IHZhcmlhYmxlcyBhbmQgc3RhY2tzLiB8Cit8IGAkIGZvb190ZXN0IC0tZ3Rlc3RfcmVwZWF0PTEwMDAgLS1ndGVzdF9maWx0ZXI9Rm9vQmFyYCB8IFJlcGVhdCB0aGUgdGVzdHMgd2hvc2UgbmFtZSBtYXRjaGVzIHRoZSBmaWx0ZXIgMTAwMCB0aW1lcy4gfAorCitJZiB5b3VyIHRlc3QgcHJvZ3JhbSBjb250YWlucyBnbG9iYWwgc2V0LXVwL3RlYXItZG93biBjb2RlIHJlZ2lzdGVyZWQKK3VzaW5nIGBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKWAsIGl0IHdpbGwgYmUgcmVwZWF0ZWQgaW4gZWFjaAoraXRlcmF0aW9uIGFzIHdlbGwsIGFzIHRoZSBmbGFraW5lc3MgbWF5IGJlIGluIGl0LiBZb3UgY2FuIGFsc28gc3BlY2lmeQordGhlIHJlcGVhdCBjb3VudCBieSBzZXR0aW5nIHRoZSBgR1RFU1RfUkVQRUFUYCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIFNodWZmbGluZyB0aGUgVGVzdHMgIyMKKworWW91IGNhbiBzcGVjaWZ5IHRoZSBgLS1ndGVzdF9zaHVmZmxlYCBmbGFnIChvciBzZXQgdGhlIGBHVEVTVF9TSFVGRkxFYAorZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYDFgKSB0byBydW4gdGhlIHRlc3RzIGluIGEgcHJvZ3JhbSBpbiBhIHJhbmRvbQorb3JkZXIuIFRoaXMgaGVscHMgdG8gcmV2ZWFsIGJhZCBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0ZXN0cy4KKworQnkgZGVmYXVsdCwgR29vZ2xlIFRlc3QgdXNlcyBhIHJhbmRvbSBzZWVkIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY3VycmVudAordGltZS4gVGhlcmVmb3JlIHlvdSdsbCBnZXQgYSBkaWZmZXJlbnQgb3JkZXIgZXZlcnkgdGltZS4gVGhlIGNvbnNvbGUKK291dHB1dCBpbmNsdWRlcyB0aGUgcmFuZG9tIHNlZWQgdmFsdWUsIHN1Y2ggdGhhdCB5b3UgY2FuIHJlcHJvZHVjZSBhbgorb3JkZXItcmVsYXRlZCB0ZXN0IGZhaWx1cmUgbGF0ZXIuIFRvIHNwZWNpZnkgdGhlIHJhbmRvbSBzZWVkCitleHBsaWNpdGx5LCB1c2UgdGhlIGAtLWd0ZXN0X3JhbmRvbV9zZWVkPVNFRURgIGZsYWcgKG9yIHNldCB0aGUKK2BHVEVTVF9SQU5ET01fU0VFRGAgZW52aXJvbm1lbnQgdmFyaWFibGUpLCB3aGVyZSBgU0VFRGAgaXMgYW4gaW50ZWdlcgorYmV0d2VlbiAwIGFuZCA5OTk5OS4gVGhlIHNlZWQgdmFsdWUgMCBpcyBzcGVjaWFsOiBpdCB0ZWxscyBHb29nbGUgVGVzdAordG8gZG8gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY2FsY3VsYXRpbmcgdGhlIHNlZWQgZnJvbSB0aGUgY3VycmVudAordGltZS4KKworSWYgeW91IGNvbWJpbmUgdGhpcyB3aXRoIGAtLWd0ZXN0X3JlcGVhdD1OYCwgR29vZ2xlIFRlc3Qgd2lsbCBwaWNrIGEKK2RpZmZlcmVudCByYW5kb20gc2VlZCBhbmQgcmUtc2h1ZmZsZSB0aGUgdGVzdHMgaW4gZWFjaCBpdGVyYXRpb24uCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2MS40LjAuCisKKyMjIENvbnRyb2xsaW5nIFRlc3QgT3V0cHV0ICMjCisKK1RoaXMgc2VjdGlvbiB0ZWFjaGVzIGhvdyB0byB0d2VhayB0aGUgd2F5IHRlc3QgcmVzdWx0cyBhcmUgcmVwb3J0ZWQuCisKKyMjIyBDb2xvcmVkIFRlcm1pbmFsIE91dHB1dCAjIyMKKworR29vZ2xlIFRlc3QgY2FuIHVzZSBjb2xvcnMgaW4gaXRzIHRlcm1pbmFsIG91dHB1dCB0byBtYWtlIGl0IGVhc2llciB0byBzcG90Cit0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRlc3RzLCBhbmQgd2hldGhlciB0ZXN0cyBwYXNzZWQuCisKK1lvdSBjYW4gc2V0IHRoZSBHVEVTVFxfQ09MT1IgZW52aXJvbm1lbnQgdmFyaWFibGUgb3Igc2V0IHRoZSBgLS1ndGVzdF9jb2xvcmAKK2NvbW1hbmQgbGluZSBmbGFnIHRvIGB5ZXNgLCBgbm9gLCBvciBgYXV0b2AgKHRoZSBkZWZhdWx0KSB0byBlbmFibGUgY29sb3JzLAorZGlzYWJsZSBjb2xvcnMsIG9yIGxldCBHb29nbGUgVGVzdCBkZWNpZGUuIFdoZW4gdGhlIHZhbHVlIGlzIGBhdXRvYCwgR29vZ2xlCitUZXN0IHdpbGwgdXNlIGNvbG9ycyBpZiBhbmQgb25seSBpZiB0aGUgb3V0cHV0IGdvZXMgdG8gYSB0ZXJtaW5hbCBhbmQgKG9uCitub24tV2luZG93cyBwbGF0Zm9ybXMpIHRoZSBgVEVSTWAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIGB4dGVybWAgb3IKK2B4dGVybS1jb2xvcmAuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgU3VwcHJlc3NpbmcgdGhlIEVsYXBzZWQgVGltZSAjIyMKKworQnkgZGVmYXVsdCwgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSB0aW1lIGl0IHRha2VzIHRvIHJ1biBlYWNoIHRlc3QuICBUbworc3VwcHJlc3MgdGhhdCwgcnVuIHRoZSB0ZXN0IHByb2dyYW0gd2l0aCB0aGUgYC0tZ3Rlc3RfcHJpbnRfdGltZT0wYAorY29tbWFuZCBsaW5lIGZsYWcuICBTZXR0aW5nIHRoZSBgR1RFU1RfUFJJTlRfVElNRWAgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIHRvIGAwYCBoYXMgdGhlIHNhbWUgZWZmZWN0LgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4gIChJbiBHb29nbGUgVGVzdCAxLjMuMCBhbmQgbG93ZXIsCit0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0aGF0IHRoZSBlbGFwc2VkIHRpbWUgaXMgKipub3QqKiBwcmludGVkLikKKworIyMjIEdlbmVyYXRpbmcgYW4gWE1MIFJlcG9ydCAjIyMKKworR29vZ2xlIFRlc3QgY2FuIGVtaXQgYSBkZXRhaWxlZCBYTUwgcmVwb3J0IHRvIGEgZmlsZSBpbiBhZGRpdGlvbiB0byBpdHMgbm9ybWFsCit0ZXh0dWFsIG91dHB1dC4gVGhlIHJlcG9ydCBjb250YWlucyB0aGUgZHVyYXRpb24gb2YgZWFjaCB0ZXN0LCBhbmQgdGh1cyBjYW4KK2hlbHAgeW91IGlkZW50aWZ5IHNsb3cgdGVzdHMuCisKK1RvIGdlbmVyYXRlIHRoZSBYTUwgcmVwb3J0LCBzZXQgdGhlIGBHVEVTVF9PVVRQVVRgIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZQorYC0tZ3Rlc3Rfb3V0cHV0YCBmbGFnIHRvIHRoZSBzdHJpbmcgYCJ4bWw6X3BhdGhfdG9fb3V0cHV0X2ZpbGVfImAsIHdoaWNoIHdpbGwKK2NyZWF0ZSB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uIFlvdSBjYW4gYWxzbyBqdXN0IHVzZSB0aGUgc3RyaW5nCitgInhtbCJgLCBpbiB3aGljaCBjYXNlIHRoZSBvdXRwdXQgY2FuIGJlIGZvdW5kIGluIHRoZSBgdGVzdF9kZXRhaWwueG1sYCBmaWxlIGluCit0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKK0lmIHlvdSBzcGVjaWZ5IGEgZGlyZWN0b3J5IChmb3IgZXhhbXBsZSwgYCJ4bWw6b3V0cHV0L2RpcmVjdG9yeS8iYCBvbiBMaW51eCBvcgorYCJ4bWw6b3V0cHV0XGRpcmVjdG9yeVwiYCBvbiBXaW5kb3dzKSwgR29vZ2xlIFRlc3Qgd2lsbCBjcmVhdGUgdGhlIFhNTCBmaWxlIGluCit0aGF0IGRpcmVjdG9yeSwgbmFtZWQgYWZ0ZXIgdGhlIHRlc3QgZXhlY3V0YWJsZSAoZS5nLiBgZm9vX3Rlc3QueG1sYCBmb3IgdGVzdAorcHJvZ3JhbSBgZm9vX3Rlc3RgIG9yIGBmb29fdGVzdC5leGVgKS4gSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgKHBlcmhhcHMgbGVmdAorb3ZlciBmcm9tIGEgcHJldmlvdXMgcnVuKSwgR29vZ2xlIFRlc3Qgd2lsbCBwaWNrIGEgZGlmZmVyZW50IG5hbWUgKGUuZy4KK2Bmb29fdGVzdF8xLnhtbGApIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LgorCitUaGUgcmVwb3J0IHVzZXMgdGhlIGZvcm1hdCBkZXNjcmliZWQgaGVyZS4gIEl0IGlzIGJhc2VkIG9uIHRoZQorYGp1bml0cmVwb3J0YCBBbnQgdGFzayBhbmQgY2FuIGJlIHBhcnNlZCBieSBwb3B1bGFyIGNvbnRpbnVvdXMgYnVpbGQKK3N5c3RlbXMgbGlrZSBbSHVkc29uXShodHRwczovL2h1ZHNvbi5kZXYuamF2YS5uZXQvKS4gU2luY2UgdGhhdCBmb3JtYXQKK3dhcyBvcmlnaW5hbGx5IGludGVuZGVkIGZvciBKYXZhLCBhIGxpdHRsZSBpbnRlcnByZXRhdGlvbiBpcyByZXF1aXJlZAordG8gbWFrZSBpdCBhcHBseSB0byBHb29nbGUgVGVzdCB0ZXN0cywgYXMgc2hvd24gaGVyZToKKworYGBgCis8dGVzdHN1aXRlcyBuYW1lPSJBbGxUZXN0cyIgLi4uPgorICA8dGVzdHN1aXRlIG5hbWU9InRlc3RfY2FzZV9uYW1lIiAuLi4+CisgICAgPHRlc3RjYXNlIG5hbWU9InRlc3RfbmFtZSIgLi4uPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIi8+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iLz4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiIvPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorPC90ZXN0c3VpdGVzPgorYGBgCisKKyAgKiBUaGUgcm9vdCBgPHRlc3RzdWl0ZXM+YCBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBlbnRpcmUgdGVzdCBwcm9ncmFtLgorICAqIGA8dGVzdHN1aXRlPmAgZWxlbWVudHMgY29ycmVzcG9uZCB0byBHb29nbGUgVGVzdCB0ZXN0IGNhc2VzLgorICAqIGA8dGVzdGNhc2U+YCBlbGVtZW50cyBjb3JyZXNwb25kIHRvIEdvb2dsZSBUZXN0IHRlc3QgZnVuY3Rpb25zLgorCitGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbQorCitgYGAKK1RFU1QoTWF0aFRlc3QsIEFkZGl0aW9uKSB7IC4uLiB9CitURVNUKE1hdGhUZXN0LCBTdWJ0cmFjdGlvbikgeyAuLi4gfQorVEVTVChMb2dpY1Rlc3QsIE5vbkNvbnRyYWRpY3Rpb24pIHsgLi4uIH0KK2BgYAorCitjb3VsZCBnZW5lcmF0ZSB0aGlzIHJlcG9ydDoKKworYGBgCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHRlc3RzdWl0ZXMgdGVzdHM9IjMiIGZhaWx1cmVzPSIxIiBlcnJvcnM9IjAiIHRpbWU9IjM1IiBuYW1lPSJBbGxUZXN0cyI+CisgIDx0ZXN0c3VpdGUgbmFtZT0iTWF0aFRlc3QiIHRlc3RzPSIyIiBmYWlsdXJlcz0iMSIqIGVycm9ycz0iMCIgdGltZT0iMTUiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBZGRpdGlvbiIgc3RhdHVzPSJydW4iIHRpbWU9IjciIGNsYXNzbmFtZT0iIj4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9IlZhbHVlIG9mOiBhZGQoMSwgMSkmI3gwQTsgQWN0dWFsOiAzJiN4MEE7RXhwZWN0ZWQ6IDIiIHR5cGU9IiIvPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iVmFsdWUgb2Y6IGFkZCgxLCAtMSkmI3gwQTsgQWN0dWFsOiAxJiN4MEE7RXhwZWN0ZWQ6IDAiIHR5cGU9IiIvPgorICAgIDwvdGVzdGNhc2U+CisgICAgPHRlc3RjYXNlIG5hbWU9IlN1YnRyYWN0aW9uIiBzdGF0dXM9InJ1biIgdGltZT0iNSIgY2xhc3NuYW1lPSIiPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IkxvZ2ljVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBlcnJvcnM9IjAiIHRpbWU9IjUiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJOb25Db250cmFkaWN0aW9uIiBzdGF0dXM9InJ1biIgdGltZT0iNSIgY2xhc3NuYW1lPSIiPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorPC90ZXN0c3VpdGVzPgorYGBgCisKK1RoaW5ncyB0byBub3RlOgorCisgICogVGhlIGB0ZXN0c2AgYXR0cmlidXRlIG9mIGEgYDx0ZXN0c3VpdGVzPmAgb3IgYDx0ZXN0c3VpdGU+YCBlbGVtZW50IHRlbGxzIGhvdyBtYW55IHRlc3QgZnVuY3Rpb25zIHRoZSBHb29nbGUgVGVzdCBwcm9ncmFtIG9yIHRlc3QgY2FzZSBjb250YWlucywgd2hpbGUgdGhlIGBmYWlsdXJlc2AgYXR0cmlidXRlIHRlbGxzIGhvdyBtYW55IG9mIHRoZW0gZmFpbGVkLgorICAqIFRoZSBgdGltZWAgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgZHVyYXRpb24gb2YgdGhlIHRlc3QsIHRlc3QgY2FzZSwgb3IgZW50aXJlIHRlc3QgcHJvZ3JhbSBpbiBtaWxsaXNlY29uZHMuCisgICogRWFjaCBgPGZhaWx1cmU+YCBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGZhaWxlZCBHb29nbGUgVGVzdCBhc3NlcnRpb24uCisgICogU29tZSBKVW5pdCBjb25jZXB0cyBkb24ndCBhcHBseSB0byBHb29nbGUgVGVzdCwgeWV0IHdlIGhhdmUgdG8gY29uZm9ybSB0byB0aGUgRFRELiBUaGVyZWZvcmUgeW91J2xsIHNlZSBzb21lIGR1bW15IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSByZXBvcnQuIFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGVzZSBwYXJ0cy4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIENvbnRyb2xsaW5nIEhvdyBGYWlsdXJlcyBBcmUgUmVwb3J0ZWQgIyMKKworIyMjIFR1cm5pbmcgQXNzZXJ0aW9uIEZhaWx1cmVzIGludG8gQnJlYWstUG9pbnRzICMjIworCitXaGVuIHJ1bm5pbmcgdGVzdCBwcm9ncmFtcyB1bmRlciBhIGRlYnVnZ2VyLCBpdCdzIHZlcnkgY29udmVuaWVudCBpZiB0aGUKK2RlYnVnZ2VyIGNhbiBjYXRjaCBhbiBhc3NlcnRpb24gZmFpbHVyZSBhbmQgYXV0b21hdGljYWxseSBkcm9wIGludG8gaW50ZXJhY3RpdmUKK21vZGUuIEdvb2dsZSBUZXN0J3MgX2JyZWFrLW9uLWZhaWx1cmVfIG1vZGUgc3VwcG9ydHMgdGhpcyBiZWhhdmlvci4KKworVG8gZW5hYmxlIGl0LCBzZXQgdGhlIGBHVEVTVF9CUkVBS19PTl9GQUlMVVJFYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIHZhbHVlCitvdGhlciB0aGFuIGAwYCAuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlYAorY29tbWFuZCBsaW5lIGZsYWcuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgU3VwcHJlc3NpbmcgUG9wLXVwcyBDYXVzZWQgYnkgRXhjZXB0aW9ucyAjIyMKKworT24gV2luZG93cywgR29vZ2xlIFRlc3QgbWF5IGJlIHVzZWQgd2l0aCBleGNlcHRpb25zIGVuYWJsZWQuIEV2ZW4gd2hlbgorZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQsIGFuIGFwcGxpY2F0aW9uIGNhbiBzdGlsbCB0aHJvdyBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbnMKKyhTRUgncykuIElmIGEgdGVzdCB0aHJvd3MgYW4gZXhjZXB0aW9uLCBieSBkZWZhdWx0IEdvb2dsZSBUZXN0IGRvZXNuJ3QgdHJ5IHRvCitjYXRjaCBpdC4gSW5zdGVhZCwgeW91J2xsIHNlZSBhIHBvcC11cCBkaWFsb2csIGF0IHdoaWNoIHBvaW50IHlvdSBjYW4gYXR0YWNoCit0aGUgcHJvY2VzcyB0byBhIGRlYnVnZ2VyIGFuZCBlYXNpbHkgZmluZCBvdXQgd2hhdCB3ZW50IHdyb25nLgorCitIb3dldmVyLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzZWUgdGhlIHBvcC11cHMgKGZvciBleGFtcGxlLCBpZiB5b3UgcnVuIHRoZQordGVzdHMgaW4gYSBiYXRjaCBqb2IpLCBzZXQgdGhlIGBHVEVTVF9DQVRDSF9FWENFUFRJT05TYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0bworYSBub24tIGAwYCB2YWx1ZSwgb3IgdXNlIHRoZSBgLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zYCBmbGFnLiBHb29nbGUgVGVzdCBub3cKK2NhdGNoZXMgYWxsIHRlc3QtdGhyb3duIGV4Y2VwdGlvbnMgYW5kIGxvZ3MgdGhlbSBhcyBmYWlsdXJlcy4KKworX0F2YWlsYWJpbGl0eTpfIFdpbmRvd3MuIGBHVEVTVF9DQVRDSF9FWENFUFRJT05TYCBhbmQKK2AtLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNgIGhhdmUgbm8gZWZmZWN0IG9uIEdvb2dsZSBUZXN0J3MgYmVoYXZpb3Igb24gTGludXggb3IKK01hYywgZXZlbiBpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLiBJdCBpcyBwb3NzaWJsZSB0byBhZGQgc3VwcG9ydCBmb3IgY2F0Y2hpbmcKK2V4Y2VwdGlvbnMgb24gdGhlc2UgcGxhdGZvcm1zLCBidXQgaXQgaXMgbm90IGltcGxlbWVudGVkIHlldC4KKworIyMjIExldHRpbmcgQW5vdGhlciBUZXN0aW5nIEZyYW1ld29yayBEcml2ZSAjIyMKKworSWYgeW91IHdvcmsgb24gYSBwcm9qZWN0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiB1c2luZyBhbm90aGVyIHRlc3RpbmcKK2ZyYW1ld29yayBhbmQgaXMgbm90IHJlYWR5IHRvIGNvbXBsZXRlbHkgc3dpdGNoIHRvIEdvb2dsZSBUZXN0IHlldCwKK3lvdSBjYW4gZ2V0IG11Y2ggb2YgR29vZ2xlIFRlc3QncyBiZW5lZml0IGJ5IHVzaW5nIGl0cyBhc3NlcnRpb25zIGluCit5b3VyIGV4aXN0aW5nIHRlc3RzLiAgSnVzdCBjaGFuZ2UgeW91ciBgbWFpbigpYCBmdW5jdGlvbiB0byBsb29rCitsaWtlOgorCitgYGAKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdHJ1ZTsKKyAgLy8gSW1wb3J0YW50OiBHb29nbGUgVGVzdCBtdXN0IGJlIGluaXRpYWxpemVkLgorICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAuLi4gd2hhdGV2ZXIgeW91ciBleGlzdGluZyB0ZXN0aW5nIGZyYW1ld29yayByZXF1aXJlcyAuLi4KK30KK2BgYAorCitXaXRoIHRoYXQsIHlvdSBjYW4gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4gYWRkaXRpb24gdG8gdGhlCituYXRpdmUgYXNzZXJ0aW9ucyB5b3VyIHRlc3RpbmcgZnJhbWV3b3JrIHByb3ZpZGVzLCBmb3IgZXhhbXBsZToKKworYGBgCit2b2lkIFRlc3RGb29Eb2VzQmFyKCkgeworICBGb28gZm9vOworICBFWFBFQ1RfTEUoZm9vLkJhcigxKSwgMTAwKTsgICAgIC8vIEEgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uLgorICBDUFBVTklUX0FTU0VSVChmb28uSXNFbXB0eSgpKTsgIC8vIEEgbmF0aXZlIGFzc2VydGlvbi4KK30KK2BgYAorCitJZiBhIEdvb2dsZSBUZXN0IGFzc2VydGlvbiBmYWlscywgaXQgd2lsbCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZAordGhyb3cgYW4gZXhjZXB0aW9uLCB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBmYWlsdXJlIGJ5IHlvdXIgaG9zdAordGVzdGluZyBmcmFtZXdvcmsuICBJZiB5b3UgY29tcGlsZSB5b3VyIGNvZGUgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLAorYSBmYWlsZWQgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIHdpbGwgaW5zdGVhZCBleGl0IHlvdXIgcHJvZ3JhbSB3aXRoIGEKK25vbi16ZXJvIGNvZGUsIHdoaWNoIHdpbGwgYWxzbyBzaWduYWwgYSB0ZXN0IGZhaWx1cmUgdG8geW91ciB0ZXN0CitydW5uZXIuCisKK0lmIHlvdSBkb24ndCB3cml0ZSBgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdHJ1ZTtgIGluCit5b3VyIGBtYWluKClgLCB5b3UgY2FuIGFsdGVybmF0aXZlbHkgZW5hYmxlIHRoaXMgZmVhdHVyZSBieSBzcGVjaWZ5aW5nCit0aGUgYC0tZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZWAgZmxhZyBvbiB0aGUgY29tbWFuZC1saW5lIG9yIHNldHRpbmcgdGhlCitgR1RFU1RfVEhST1dfT05fRkFJTFVSRWAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSBub24temVybyB2YWx1ZS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWM7IHNpbmNlIHYxLjMuMC4KKworIyMgRGlzdHJpYnV0aW5nIFRlc3QgRnVuY3Rpb25zIHRvIE11bHRpcGxlIE1hY2hpbmVzICMjCisKK0lmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgbWFjaGluZSB5b3UgY2FuIHVzZSB0byBydW4gYSB0ZXN0IHByb2dyYW0sCit5b3UgbWlnaHQgd2FudCB0byBydW4gdGhlIHRlc3QgZnVuY3Rpb25zIGluIHBhcmFsbGVsIGFuZCBnZXQgdGhlCityZXN1bHQgZmFzdGVyLiAgV2UgY2FsbCB0aGlzIHRlY2huaXF1ZSBfc2hhcmRpbmdfLCB3aGVyZSBlYWNoIG1hY2hpbmUKK2lzIGNhbGxlZCBhIF9zaGFyZF8uCisKK0dvb2dsZSBUZXN0IGlzIGNvbXBhdGlibGUgd2l0aCB0ZXN0IHNoYXJkaW5nLiAgVG8gdGFrZSBhZHZhbnRhZ2Ugb2YKK3RoaXMgZmVhdHVyZSwgeW91ciB0ZXN0IHJ1bm5lciAobm90IHBhcnQgb2YgR29vZ2xlIFRlc3QpIG5lZWRzIHRvIGRvCit0aGUgZm9sbG93aW5nOgorCisgIDEuIEFsbG9jYXRlIGEgbnVtYmVyIG9mIG1hY2hpbmVzIChzaGFyZHMpIHRvIHJ1biB0aGUgdGVzdHMuCisgIDEuIE9uIGVhY2ggc2hhcmQsIHNldCB0aGUgYEdURVNUX1RPVEFMX1NIQVJEU2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMuICBJdCBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgc2hhcmRzLgorICAxLiBPbiBlYWNoIHNoYXJkLCBzZXQgdGhlIGBHVEVTVF9TSEFSRF9JTkRFWGAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGluZGV4IG9mIHRoZSBzaGFyZC4gIERpZmZlcmVudCBzaGFyZHMgbXVzdCBiZSBhc3NpZ25lZCBkaWZmZXJlbnQgaW5kaWNlcywgd2hpY2ggbXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLCBHVEVTVF9UT1RBTF9TSEFSRFMgLSAxXWAuCisgIDEuIFJ1biB0aGUgc2FtZSB0ZXN0IHByb2dyYW0gb24gYWxsIHNoYXJkcy4gIFdoZW4gR29vZ2xlIFRlc3Qgc2VlcyB0aGUgYWJvdmUgdHdvIGVudmlyb25tZW50IHZhcmlhYmxlcywgaXQgd2lsbCBzZWxlY3QgYSBzdWJzZXQgb2YgdGhlIHRlc3QgZnVuY3Rpb25zIHRvIHJ1bi4gIEFjcm9zcyBhbGwgc2hhcmRzLCBlYWNoIHRlc3QgZnVuY3Rpb24gaW4gdGhlIHByb2dyYW0gd2lsbCBiZSBydW4gZXhhY3RseSBvbmNlLgorICAxLiBXYWl0IGZvciBhbGwgc2hhcmRzIHRvIGZpbmlzaCwgdGhlbiBjb2xsZWN0IGFuZCByZXBvcnQgdGhlIHJlc3VsdHMuCisKK1lvdXIgcHJvamVjdCBtYXkgaGF2ZSB0ZXN0cyB0aGF0IHdlcmUgd3JpdHRlbiB3aXRob3V0IEdvb2dsZSBUZXN0IGFuZAordGh1cyBkb24ndCB1bmRlcnN0YW5kIHRoaXMgcHJvdG9jb2wuICBJbiBvcmRlciBmb3IgeW91ciB0ZXN0IHJ1bm5lciB0bworZmlndXJlIG91dCB3aGljaCB0ZXN0IHN1cHBvcnRzIHNoYXJkaW5nLCBpdCBjYW4gc2V0IHRoZSBlbnZpcm9ubWVudAordmFyaWFibGUgYEdURVNUX1NIQVJEX1NUQVRVU19GSUxFYCB0byBhIG5vbi1leGlzdGVudCBmaWxlIHBhdGguICBJZiBhCit0ZXN0IHByb2dyYW0gc3VwcG9ydHMgc2hhcmRpbmcsIGl0IHdpbGwgY3JlYXRlIHRoaXMgZmlsZSB0bworYWNrbm93bGVkZ2UgdGhlIGZhY3QgKHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlIGZpbGUgYXJlIG5vdAoraW1wb3J0YW50IGF0IHRoaXMgdGltZTsgYWx0aG91Z2ggd2UgbWF5IHN0aWNrIHNvbWUgdXNlZnVsIGluZm9ybWF0aW9uCitpbiBpdCBpbiB0aGUgZnV0dXJlLik7IG90aGVyd2lzZSBpdCB3aWxsIG5vdCBjcmVhdGUgaXQuCisKK0hlcmUncyBhbiBleGFtcGxlIHRvIG1ha2UgaXQgY2xlYXIuICBTdXBwb3NlIHlvdSBoYXZlIGEgdGVzdCBwcm9ncmFtCitgZm9vX3Rlc3RgIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyA1IHRlc3QgZnVuY3Rpb25zOgorYGBgCitURVNUKEEsIFYpCitURVNUKEEsIFcpCitURVNUKEIsIFgpCitURVNUKEIsIFkpCitURVNUKEIsIFopCitgYGAKK2FuZCB5b3UgaGF2ZSAzIG1hY2hpbmVzIGF0IHlvdXIgZGlzcG9zYWwuICBUbyBydW4gdGhlIHRlc3QgZnVuY3Rpb25zIGluCitwYXJhbGxlbCwgeW91IHdvdWxkIHNldCBgR1RFU1RfVE9UQUxfU0hBUkRTYCB0byAzIG9uIGFsbCBtYWNoaW5lcywgYW5kCitzZXQgYEdURVNUX1NIQVJEX0lOREVYYCB0byAwLCAxLCBhbmQgMiBvbiB0aGUgbWFjaGluZXMgcmVzcGVjdGl2ZWx5LgorVGhlbiB5b3Ugd291bGQgcnVuIHRoZSBzYW1lIGBmb29fdGVzdGAgb24gZWFjaCBtYWNoaW5lLgorCitHb29nbGUgVGVzdCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gY2hhbmdlIGhvdyB0aGUgd29yayBpcyBkaXN0cmlidXRlZAorYWNyb3NzIHRoZSBzaGFyZHMsIGJ1dCBoZXJlJ3Mgb25lIHBvc3NpYmxlIHNjZW5hcmlvOgorCisgICogTWFjaGluZSAjMCBydW5zIGBBLlZgIGFuZCBgQi5YYC4KKyAgKiBNYWNoaW5lICMxIHJ1bnMgYEEuV2AgYW5kIGBCLllgLgorICAqIE1hY2hpbmUgIzIgcnVucyBgQi5aYC4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWM7IHNpbmNlIHZlcnNpb24gMS4zLjAuCisKKyMgRnVzaW5nIEdvb2dsZSBUZXN0IFNvdXJjZSBGaWxlcyAjCisKK0dvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgfjMwIGZpbGVzIChleGNsdWRpbmcgaXRzIG93bgordGVzdHMpLiAgU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0aGVtIHRvIGJlIHBhY2thZ2VkIHVwIGluIHR3byBmaWxlcyAoYQorYC5oYCBhbmQgYSBgLmNjYCkgaW5zdGVhZCwgc3VjaCB0aGF0IHlvdSBjYW4gZWFzaWx5IGNvcHkgdGhlbSB0byBhIG5ldworbWFjaGluZSBhbmQgc3RhcnQgaGFja2luZyB0aGVyZS4gIEZvciB0aGlzIHdlIHByb3ZpZGUgYW4gZXhwZXJpbWVudGFsCitQeXRob24gc2NyaXB0IGBmdXNlX2d0ZXN0X2ZpbGVzLnB5YCBpbiB0aGUgYHNjcmlwdHMvYCBkaXJlY3RvcnkgKHNpbmNlIHJlbGVhc2UgMS4zLjApLgorQXNzdW1pbmcgeW91IGhhdmUgUHl0aG9uIDIuNCBvciBhYm92ZSBpbnN0YWxsZWQgb24geW91ciBtYWNoaW5lLCBqdXN0CitnbyB0byB0aGF0IGRpcmVjdG9yeSBhbmQgcnVuCitgYGAKK3B5dGhvbiBmdXNlX2d0ZXN0X2ZpbGVzLnB5IE9VVFBVVF9ESVIKK2BgYAorCithbmQgeW91IHNob3VsZCBzZWUgYW4gYE9VVFBVVF9ESVJgIGRpcmVjdG9yeSBiZWluZyBjcmVhdGVkIHdpdGggZmlsZXMKK2BndGVzdC9ndGVzdC5oYCBhbmQgYGd0ZXN0L2d0ZXN0LWFsbC5jY2AgaW4gaXQuICBUaGVzZSBmaWxlcyBjb250YWluCitldmVyeXRoaW5nIHlvdSBuZWVkIHRvIHVzZSBHb29nbGUgVGVzdC4gIEp1c3QgY29weSB0aGVtIHRvIGFueXdoZXJlCit5b3Ugd2FudCBhbmQgeW91IGFyZSByZWFkeSB0byB3cml0ZSB0ZXN0cy4gIFlvdSBjYW4gdXNlIHRoZQorW3NjcnB0cy90ZXN0L01ha2VmaWxlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvdGVzdC9NYWtlZmlsZSkKK2ZpbGUgYXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY29tcGlsZSB5b3VyIHRlc3RzIGFnYWluc3QgdGhlbS4KKworIyBXaGVyZSB0byBHbyBmcm9tIEhlcmUgIworCitDb25ncmF0dWxhdGlvbnMhIFlvdSd2ZSBub3cgbGVhcm5lZCBtb3JlIGFkdmFuY2VkIEdvb2dsZSBUZXN0IHRvb2xzIGFuZCBhcmUKK3JlYWR5IHRvIHRhY2tsZSBtb3JlIGNvbXBsZXggdGVzdGluZyB0YXNrcy4gSWYgeW91IHdhbnQgdG8gZGl2ZSBldmVuIGRlZXBlciwgeW91CitjYW4gcmVhZCB0aGUgW0ZBUV0oVjFfNV9GQVEubWQpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzVfRG9jdW1lbnRhdGlvbi5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzVfRG9jdW1lbnRhdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJiYTJlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNV9Eb2N1bWVudGF0aW9uLm1kCkBAIC0wLDAgKzEsMTIgQEAKK1RoaXMgcGFnZSBsaXN0cyBhbGwgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiB3aWtpIHBhZ2VzIGZvciBHb29nbGUgVGVzdCAqKjEuNS4wKiogLS0gKippZiB5b3UgdXNlIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgR29vZ2xlIFRlc3QsIG1ha2Ugc3VyZSB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGF0IHZlcnNpb24gaW5zdGVhZC4qKgorCisgICogW1ByaW1lcl0oVjFfNV9QcmltZXIubWQpIC0tIHN0YXJ0IGhlcmUgaWYgeW91IGFyZSBuZXcgdG8gR29vZ2xlIFRlc3QuCisgICogW1NhbXBsZXNdKFNhbXBsZXMubWQpIC0tIGxlYXJuIGZyb20gZXhhbXBsZXMuCisgICogW0FkdmFuY2VkR3VpZGVdKFYxXzVfQWR2YW5jZWRHdWlkZS5tZCkgLS0gbGVhcm4gbW9yZSBhYm91dCBHb29nbGUgVGVzdC4KKyAgKiBbWGNvZGVHdWlkZV0oVjFfNV9YY29kZUd1aWRlLm1kKSAtLSBob3cgdG8gdXNlIEdvb2dsZSBUZXN0IGluIFhjb2RlIG9uIE1hYy4KKyAgKiBbRnJlcXVlbnRseS1Bc2tlZCBRdWVzdGlvbnNdKFYxXzVfRkFRLm1kKSAtLSBjaGVjayBoZXJlIGJlZm9yZSBhc2tpbmcgYSBxdWVzdGlvbiBvbiB0aGUgbWFpbGluZyBsaXN0LgorCitUbyBjb250cmlidXRlIGNvZGUgdG8gR29vZ2xlIFRlc3QsIHJlYWQ6CisKKyAgKiBEZXZHdWlkZSAtLSByZWFkIHRoaXMgX2JlZm9yZV8gd3JpdGluZyB5b3VyIGZpcnN0IHBhdGNoLgorICAqIFtQdW1wTWFudWFsXShWMV81X1B1bXBNYW51YWwubWQpIC0tIGhvdyB3ZSBnZW5lcmF0ZSBzb21lIG9mIEdvb2dsZSBUZXN0J3Mgc291cmNlIGZpbGVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzVfRkFRLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNV9GQVEubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZGJhMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzVfRkFRLm1kCkBAIC0wLDAgKzEsODg1IEBACisKKworSWYgeW91IGNhbm5vdCBmaW5kIHRoZSBhbnN3ZXIgdG8geW91ciBxdWVzdGlvbiBoZXJlLCBhbmQgeW91IGhhdmUgcmVhZAorW1ByaW1lcl0oVjFfNV9QcmltZXIubWQpIGFuZCBbQWR2YW5jZWRHdWlkZV0oVjFfNV9BZHZhbmNlZEd1aWRlLm1kKSwgc2VuZCBpdCB0bworZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tLgorCisjIyBXaHkgc2hvdWxkIEkgdXNlIEdvb2dsZSBUZXN0IGluc3RlYWQgb2YgbXkgZmF2b3JpdGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrPyAjIworCitGaXJzdCwgbGV0J3Mgc2F5IGNsZWFybHkgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGdldCBpbnRvIHRoZSBkZWJhdGUgb2YKK3doaWNoIEMrKyB0ZXN0aW5nIGZyYW1ld29yayBpcyAqKnRoZSBiZXN0KiouICBUaGVyZSBleGlzdCBtYW55IGZpbmUKK2ZyYW1ld29ya3MgZm9yIHdyaXRpbmcgQysrIHRlc3RzLCBhbmQgd2UgaGF2ZSB0cmVtZW5kb3VzIHJlc3BlY3QgZm9yCit0aGUgZGV2ZWxvcGVycyBhbmQgdXNlcnMgb2YgdGhlbS4gIFdlIGRvbid0IHRoaW5rIHRoZXJlIGlzIChvciB3aWxsCitiZSkgYSBzaW5nbGUgYmVzdCBmcmFtZXdvcmsgLSB5b3UgaGF2ZSB0byBwaWNrIHRoZSByaWdodCB0b29sIGZvciB0aGUKK3BhcnRpY3VsYXIgdGFzayB5b3UgYXJlIHRhY2tsaW5nLgorCitXZSBjcmVhdGVkIEdvb2dsZSBUZXN0IGJlY2F1c2Ugd2UgY291bGRuJ3QgZmluZCB0aGUgcmlnaHQgY29tYmluYXRpb24KK29mIGZlYXR1cmVzIGFuZCBjb252ZW5pZW5jZXMgaW4gYW4gZXhpc3RpbmcgZnJhbWV3b3JrIHRvIHNhdGlzZnkgX291cl8KK25lZWRzLiAgVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdGhpbmdzIHRoYXQgX3dlXyBsaWtlIGFib3V0IEdvb2dsZQorVGVzdC4gIFdlIGRvbid0IGNsYWltIHRoZW0gdG8gYmUgdW5pcXVlIHRvIEdvb2dsZSBUZXN0IC0gcmF0aGVyLCB0aGUKK2NvbWJpbmF0aW9uIG9mIHRoZW0gbWFrZXMgR29vZ2xlIFRlc3QgdGhlIGNob2ljZSBmb3IgdXMuICBXZSBob3BlIHRoaXMKK2xpc3QgY2FuIGhlbHAgeW91IGRlY2lkZSB3aGV0aGVyIGl0IGlzIGZvciB5b3UgdG9vLgorCisgICogR29vZ2xlIFRlc3QgaXMgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUuICBJdCB3b3JrcyB3aGVyZSBtYW55IFNUTCB0eXBlcyAoZS5nLiBgc3RkOjpzdHJpbmdgIGFuZCBgc3RkOjp2ZWN0b3JgKSBkb24ndCBjb21waWxlLiAgSXQgZG9lc24ndCByZXF1aXJlIGV4Y2VwdGlvbnMgb3IgUlRUSS4gIEFzIGEgcmVzdWx0LCBpdCBydW5zIG9uIExpbnV4LCBNYWMgT1MgWCwgV2luZG93cyBhbmQgc2V2ZXJhbCBlbWJlZGRlZCBvcGVyYXRpbmcgc3lzdGVtcy4KKyAgKiBOb25mYXRhbCBhc3NlcnRpb25zIChgRVhQRUNUXypgKSBoYXZlIHByb3ZlbiB0byBiZSBncmVhdCB0aW1lIHNhdmVycywgYXMgdGhleSBhbGxvdyBhIHRlc3QgdG8gcmVwb3J0IG11bHRpcGxlIGZhaWx1cmVzIGluIGEgc2luZ2xlIGVkaXQtY29tcGlsZS10ZXN0IGN5Y2xlLgorICAqIEl0J3MgZWFzeSB0byB3cml0ZSBhc3NlcnRpb25zIHRoYXQgZ2VuZXJhdGUgaW5mb3JtYXRpdmUgbWVzc2FnZXM6IHlvdSBqdXN0IHVzZSB0aGUgc3RyZWFtIHN5bnRheCB0byBhcHBlbmQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIGUuZy4gYEFTU0VSVF9FUSg1LCBGb28oaSkpIDw8ICIgd2hlcmUgaSA9ICIgPDwgaTtgLiAgSXQgZG9lc24ndCByZXF1aXJlIGEgbmV3IHNldCBvZiBtYWNyb3Mgb3Igc3BlY2lhbCBmdW5jdGlvbnMuCisgICogR29vZ2xlIFRlc3QgYXV0b21hdGljYWxseSBkZXRlY3RzIHlvdXIgdGVzdHMgYW5kIGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8gZW51bWVyYXRlIHRoZW0gaW4gb3JkZXIgdG8gcnVuIHRoZW0uCisgICogTm8gZnJhbWV3b3JrIGNhbiBhbnRpY2lwYXRlIGFsbCB5b3VyIG5lZWRzLCBzbyBHb29nbGUgVGVzdCBwcm92aWRlcyBgRVhQRUNUX1BSRUQqYCB0byBtYWtlIGl0IGVhc3kgdG8gZXh0ZW5kIHlvdXIgYXNzZXJ0aW9uIHZvY2FidWxhcnkuICBGb3IgYSBuaWNlciBzeW50YXgsIHlvdSBjYW4gZGVmaW5lIHlvdXIgb3duIGFzc2VydGlvbiBtYWNyb3MgdHJpdmlhbGx5IGluIHRlcm1zIG9mIGBFWFBFQ1RfUFJFRCpgLgorICAqIERlYXRoIHRlc3RzIGFyZSBwcmV0dHkgaGFuZHkgZm9yIGVuc3VyaW5nIHRoYXQgeW91ciBhc3NlcnRzIGluIHByb2R1Y3Rpb24gY29kZSBhcmUgdHJpZ2dlcmVkIGJ5IHRoZSByaWdodCBjb25kaXRpb25zLgorICAqIGBTQ09QRURfVFJBQ0VgIGhlbHBzIHlvdSB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIGFuIGFzc2VydGlvbiBmYWlsdXJlIHdoZW4gaXQgY29tZXMgZnJvbSBpbnNpZGUgYSBzdWItcm91dGluZSBvciBsb29wLgorICAqIFlvdSBjYW4gZGVjaWRlIHdoaWNoIHRlc3RzIHRvIHJ1biB1c2luZyBuYW1lIHBhdHRlcm5zLiAgVGhpcyBzYXZlcyB0aW1lIHdoZW4geW91IHdhbnQgdG8gcXVpY2tseSByZXByb2R1Y2UgYSB0ZXN0IGZhaWx1cmUuCisKKyMjIEhvdyBkbyBJIGdlbmVyYXRlIDY0LWJpdCBiaW5hcmllcyBvbiBXaW5kb3dzICh1c2luZyBWaXN1YWwgU3R1ZGlvIDIwMDgpPyAjIworCisoQW5zd2VyZWQgYnkgVHJldm9yIFJvYmluc29uKQorCitMb2FkIHRoZSBzdXBwbGllZCBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZpbGUsIGVpdGhlciBgbXN2Y1xndGVzdC1tZC5zbG5gIG9yCitgbXN2Y1xndGVzdC5zbG5gLiBHbyB0aHJvdWdoIHRoZSBtaWdyYXRpb24gd2l6YXJkIHRvIG1pZ3JhdGUgdGhlCitzb2x1dGlvbiBhbmQgcHJvamVjdCBmaWxlcyB0byBWaXN1YWwgU3R1ZGlvIDIwMDguIFNlbGVjdAorYENvbmZpZ3VyYXRpb24gTWFuYWdlci4uLmAgZnJvbSB0aGUgYEJ1aWxkYCBtZW51LiBTZWxlY3QgYDxOZXcuLi4+YCBmcm9tCit0aGUgYEFjdGl2ZSBzb2x1dGlvbiBwbGF0Zm9ybWAgZHJvcGRvd24uICBTZWxlY3QgYHg2NGAgZnJvbSB0aGUgbmV3CitwbGF0Zm9ybSBkcm9wZG93biwgbGVhdmUgYENvcHkgc2V0dGluZ3MgZnJvbWAgc2V0IHRvIGBXaW4zMmAgYW5kCitgQ3JlYXRlIG5ldyBwcm9qZWN0IHBsYXRmb3Jtc2AgY2hlY2tlZCwgdGhlbiBjbGljayBgT0tgLiBZb3Ugbm93IGhhdmUKK2BXaW4zMmAgYW5kIGB4NjRgIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb25zLCBzZWxlY3RhYmxlIGZyb20gdGhlCitgU3RhbmRhcmRgIHRvb2xiYXIsIHdoaWNoIGFsbG93IHlvdSB0byB0b2dnbGUgYmV0d2VlbiBidWlsZGluZyAzMi1iaXQgb3IKKzY0LWJpdCBiaW5hcmllcyAob3IgYm90aCBhdCBvbmNlIHVzaW5nIEJhdGNoIEJ1aWxkKS4KKworSW4gb3JkZXIgdG8gcHJldmVudCBidWlsZCBvdXRwdXQgZmlsZXMgZnJvbSBvdmVyd3JpdGluZyBvbmUgYW5vdGhlciwKK3lvdSdsbCBuZWVkIHRvIGNoYW5nZSB0aGUgYEludGVybWVkaWF0ZSBEaXJlY3RvcnlgIHNldHRpbmdzIGZvciB0aGUKK25ld2x5IGNyZWF0ZWQgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBhY3Jvc3MgYWxsIHRoZSBwcm9qZWN0cy4gVG8gZG8KK3RoaXMsIG11bHRpLXNlbGVjdCAoZS5nLiB1c2luZyBzaGlmdC1jbGljaykgYWxsIHByb2plY3RzIChidXQgbm90IHRoZQorc29sdXRpb24pIGluIHRoZSBgU29sdXRpb24gRXhwbG9yZXJgLiBSaWdodC1jbGljayBvbmUgb2YgdGhlbSBhbmQKK3NlbGVjdCBgUHJvcGVydGllc2AuIEluIHRoZSBsZWZ0IHBhbmUsIHNlbGVjdCBgQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzYCwKK2FuZCBmcm9tIHRoZSBgQ29uZmlndXJhdGlvbmAgZHJvcGRvd24sIHNlbGVjdCBgQWxsIENvbmZpZ3VyYXRpb25zYC4KK01ha2Ugc3VyZSB0aGUgc2VsZWN0ZWQgcGxhdGZvcm0gaXMgYHg2NGAuIEZvciB0aGUKK2BJbnRlcm1lZGlhdGUgRGlyZWN0b3J5YCBzZXR0aW5nLCBjaGFuZ2UgdGhlIHZhbHVlIGZyb20KK2AkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSlgIHRvCitgJChPdXREaXIpXCQoUHJvamVjdE5hbWUpYC4gQ2xpY2sgYE9LYCBhbmQgdGhlbiBidWlsZCB0aGUKK3NvbHV0aW9uLiBXaGVuIHRoZSBidWlsZCBpcyBjb21wbGV0ZSwgdGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGluCit0aGUgYG1zdmNceDY0XERlYnVnYCBkaXJlY3RvcnkuCisKKyMjIENhbiBJIHVzZSBHb29nbGUgVGVzdCBvbiBNaW5HVz8gIyMKKworV2UgaGF2ZW4ndCB0ZXN0ZWQgdGhpcyBvdXJzZWx2ZXMsIGJ1dCBQZXIgQWJyYWhhbXNlbiByZXBvcnRlZCB0aGF0IGhlCit3YXMgYWJsZSB0byBjb21waWxlIGFuZCBpbnN0YWxsIEdvb2dsZSBUZXN0IHN1Y2Nlc3NmdWxseSB3aGVuIHVzaW5nCitNaW5HVyBmcm9tIEN5Z3dpbi4gIFlvdSdsbCBuZWVkIHRvIGNvbmZpZ3VyZSBpdCB3aXRoOgorCitgUEFUSC9UTy9jb25maWd1cmUgQ0M9ImdjYyAtbW5vLWN5Z3dpbiIgQ1hYPSJnKysgLW1uby1jeWd3aW4iYAorCitZb3Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGUgYC1tbm8tY3lnd2luYCBvcHRpb24gd2l0aCBkaXJlY3QgbGlua3MKK3RvIHRoZSByZWFsIE1pbkdXIGJpbmFyaWVzLCBidXQgd2UgaGF2ZW4ndCB0cmllZCB0aGF0LgorCitDYXZlYXRzOgorCisgICogVGhlcmUgYXJlIG1hbnkgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcuCisgICogYG1ha2UgY2hlY2tgIHdpbGwgcHJvZHVjZSBzb21lIGVycm9ycyBhcyBub3QgYWxsIHRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYgYXJlIGNvbXBhdGlibGUgd2l0aCBNaW5HVy4KKworV2UgYWxzbyBoYXZlIHJlcG9ydHMgb24gc3VjY2Vzc2Z1bCBjcm9zcyBjb21waWxhdGlvbiBvZiBHb29nbGUgVGVzdCBNaW5HVyBiaW5hcmllcyBvbiBMaW51eCB1c2luZyBbdGhlc2UgaW5zdHJ1Y3Rpb25zXShodHRwOi8vd2lraS53eHdpZGdldHMub3JnL0Nyb3NzLUNvbXBpbGluZ19VbmRlcl9MaW51eCNDcm9zcy1jb21waWxpbmdfdW5kZXJfTGludXhfZm9yX01TX1dpbmRvd3MpIG9uIHRoZSBXeFdpZGdldHMgc2l0ZS4KKworUGxlYXNlIGNvbnRhY3QgYGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbWAgaWYgeW91IGFyZQoraW50ZXJlc3RlZCBpbiBpbXByb3ZpbmcgdGhlIHN1cHBvcnQgZm9yIE1pbkdXLgorCisjIyBXaHkgZG9lcyBHb29nbGUgVGVzdCBzdXBwb3J0IEVYUEVDVFxfRVEoTlVMTCwgcHRyKSBhbmQgQVNTRVJUXF9FUShOVUxMLCBwdHIpIGJ1dCBub3QgRVhQRUNUXF9ORShOVUxMLCBwdHIpIGFuZCBBU1NFUlRcX05FKE5VTEwsIHB0cik/ICMjCisKK0R1ZSB0byBzb21lIHBlY3VsaWFyaXR5IG9mIEMrKywgaXQgcmVxdWlyZXMgc29tZSBub24tdHJpdmlhbCB0ZW1wbGF0ZQorbWV0YSBwcm9ncmFtbWluZyB0cmlja3MgdG8gc3VwcG9ydCB1c2luZyBgTlVMTGAgYXMgYW4gYXJndW1lbnQgb2YgdGhlCitgRVhQRUNUX1hYKClgIGFuZCBgQVNTRVJUX1hYKClgIG1hY3Jvcy4gVGhlcmVmb3JlIHdlIG9ubHkgZG8gaXQgd2hlcmUKK2l0J3MgbW9zdCBuZWVkZWQgKG90aGVyd2lzZSB3ZSBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHb29nbGUgVGVzdAoraGFyZGVyIHRvIG1haW50YWluIGFuZCBtb3JlIGVycm9yLXByb25lIHRoYW4gbmVjZXNzYXJ5KS4KKworVGhlIGBFWFBFQ1RfRVEoKWAgbWFjcm8gdGFrZXMgdGhlIF9leHBlY3RlZF8gdmFsdWUgYXMgaXRzIGZpcnN0Cithcmd1bWVudCBhbmQgdGhlIF9hY3R1YWxfIHZhbHVlIGFzIHRoZSBzZWNvbmQuIEl0J3MgcmVhc29uYWJsZSB0aGF0Citzb21lb25lIHdhbnRzIHRvIHdyaXRlIGBFWFBFQ1RfRVEoTlVMTCwgc29tZV9leHByZXNzaW9uKWAsIGFuZCB0aGlzCitpbmRlZWQgd2FzIHJlcXVlc3RlZCBzZXZlcmFsIHRpbWVzLiBUaGVyZWZvcmUgd2UgaW1wbGVtZW50ZWQgaXQuCisKK1RoZSBuZWVkIGZvciBgRVhQRUNUX05FKE5VTEwsIHB0cilgIGlzbid0IG5lYXJseSBhcyBzdHJvbmcuIFdoZW4gdGhlCithc3NlcnRpb24gZmFpbHMsIHlvdSBhbHJlYWR5IGtub3cgdGhhdCBgcHRyYCBtdXN0IGJlIGBOVUxMYCwgc28gaXQKK2RvZXNuJ3QgYWRkIGFueSBpbmZvcm1hdGlvbiB0byBwcmludCBwdHIgaW4gdGhpcyBjYXNlLiBUaGF0IG1lYW5zCitgRVhQRUNUX1RSVUUocHRyICEgTlVMTClgIHdvcmtzIGp1c3QgYXMgd2VsbC4KKworSWYgd2Ugd2VyZSB0byBzdXBwb3J0IGBFWFBFQ1RfTkUoTlVMTCwgcHRyKWAsIGZvciBjb25zaXN0ZW5jeSB3ZSdsbAoraGF2ZSB0byBzdXBwb3J0IGBFWFBFQ1RfTkUocHRyLCBOVUxMKWAgYXMgd2VsbCwgYXMgdW5saWtlIGBFWFBFQ1RfRVFgLAord2UgZG9uJ3QgaGF2ZSBhIGNvbnZlbnRpb24gb24gdGhlIG9yZGVyIG9mIHRoZSB0d28gYXJndW1lbnRzIGZvcgorYEVYUEVDVF9ORWAuIFRoaXMgbWVhbnMgdXNpbmcgdGhlIHRlbXBsYXRlIG1ldGEgcHJvZ3JhbW1pbmcgdHJpY2tzCit0d2ljZSBpbiB0aGUgaW1wbGVtZW50YXRpb24sIG1ha2luZyBpdCBldmVuIGhhcmRlciB0byB1bmRlcnN0YW5kIGFuZAorbWFpbnRhaW4uIFdlIGJlbGlldmUgdGhlIGJlbmVmaXQgZG9lc24ndCBqdXN0aWZ5IHRoZSBjb3N0LgorCitGaW5hbGx5LCB3aXRoIHRoZSBncm93dGggb2YgR29vZ2xlIE1vY2sncyBbbWF0Y2hlcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNVc2luZ19NYXRjaGVyc19pbl9Hb29nbGVfVGVzdF9Bc3NlcnRpb25zKSBsaWJyYXJ5LCB3ZSBhcmUKK2VuY291cmFnaW5nIHBlb3BsZSB0byB1c2UgdGhlIHVuaWZpZWQgYEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAKK3N5bnRheCBtb3JlIG9mdGVuIGluIHRlc3RzLiBPbmUgc2lnbmlmaWNhbnQgYWR2YW50YWdlIG9mIHRoZSBtYXRjaGVyCithcHByb2FjaCBpcyB0aGF0IG1hdGNoZXJzIGNhbiBiZSBlYXNpbHkgY29tYmluZWQgdG8gZm9ybSBuZXcgbWF0Y2hlcnMsCit3aGlsZSB0aGUgYEVYUEVDVF9ORWAsIGV0YywgbWFjcm9zIGNhbm5vdCBiZSBlYXNpbHkKK2NvbWJpbmVkLiBUaGVyZWZvcmUgd2Ugd2FudCB0byBpbnZlc3QgbW9yZSBpbiB0aGUgbWF0Y2hlcnMgdGhhbiBpbiB0aGUKK2BFWFBFQ1RfWFgoKWAgbWFjcm9zLgorCisjIyBEb2VzIEdvb2dsZSBUZXN0IHN1cHBvcnQgcnVubmluZyB0ZXN0cyBpbiBwYXJhbGxlbD8gIyMKKworVGVzdCBydW5uZXJzIHRlbmQgdG8gYmUgdGlnaHRseSBjb3VwbGVkIHdpdGggdGhlIGJ1aWxkL3Rlc3QKK2Vudmlyb25tZW50LCBhbmQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cnkgdG8gc29sdmUgdGhlIHByb2JsZW0gb2YKK3J1bm5pbmcgdGVzdHMgaW4gcGFyYWxsZWwuICBJbnN0ZWFkLCB3ZSB0cmllZCB0byBtYWtlIEdvb2dsZSBUZXN0IHdvcmsKK25pY2VseSB3aXRoIHRlc3QgcnVubmVycy4gIEZvciBleGFtcGxlLCBHb29nbGUgVGVzdCdzIFhNTCByZXBvcnQKK2NvbnRhaW5zIHRoZSB0aW1lIHNwZW50IG9uIGVhY2ggdGVzdCwgYW5kIGl0cyBgZ3Rlc3RfbGlzdF90ZXN0c2AgYW5kCitgZ3Rlc3RfZmlsdGVyYCBmbGFncyBjYW4gYmUgdXNlZCBmb3Igc3BsaXR0aW5nIHRoZSBleGVjdXRpb24gb2YgdGVzdAorbWV0aG9kcyBpbnRvIG11bHRpcGxlIHByb2Nlc3Nlcy4gIFRoZXNlIGZ1bmN0aW9uYWxpdGllcyBjYW4gaGVscCB0aGUKK3Rlc3QgcnVubmVyIHJ1biB0aGUgdGVzdHMgaW4gcGFyYWxsZWwuCisKKyMjIFdoeSBkb24ndCBHb29nbGUgVGVzdCBydW4gdGhlIHRlc3RzIGluIGRpZmZlcmVudCB0aHJlYWRzIHRvIHNwZWVkIHRoaW5ncyB1cD8gIyMKKworSXQncyBkaWZmaWN1bHQgdG8gd3JpdGUgdGhyZWFkLXNhZmUgY29kZS4gIE1vc3QgdGVzdHMgYXJlIG5vdCB3cml0dGVuCit3aXRoIHRocmVhZC1zYWZldHkgaW4gbWluZCwgYW5kIHRodXMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSBpbiBhCittdWx0aS10aHJlYWRlZCBzZXR0aW5nLgorCitJZiB5b3UgdGhpbmsgYWJvdXQgaXQsIGl0J3MgYWxyZWFkeSBoYXJkIHRvIG1ha2UgeW91ciBjb2RlIHdvcmsgd2hlbgoreW91IGtub3cgd2hhdCBvdGhlciB0aHJlYWRzIGFyZSBkb2luZy4gIEl0J3MgbXVjaCBoYXJkZXIsIGFuZAorc29tZXRpbWVzIGV2ZW4gaW1wb3NzaWJsZSwgdG8gbWFrZSB5b3VyIGNvZGUgd29yayB3aGVuIHlvdSBkb24ndCBrbm93Cit3aGF0IG90aGVyIHRocmVhZHMgYXJlIGRvaW5nIChyZW1lbWJlciB0aGF0IHRlc3QgbWV0aG9kcyBjYW4gYmUgYWRkZWQsCitkZWxldGVkLCBvciBtb2RpZmllZCBhZnRlciB5b3VyIHRlc3Qgd2FzIHdyaXR0ZW4pLiAgSWYgeW91IHdhbnQgdG8gcnVuCit0aGUgdGVzdHMgaW4gcGFyYWxsZWwsIHlvdSdkIGJldHRlciBydW4gdGhlbSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLgorCisjIyBXaHkgYXJlbid0IEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW1wbGVtZW50ZWQgdXNpbmcgZXhjZXB0aW9ucz8gIyMKKworT3VyIG9yaWdpbmFsIG1vdGl2YXRpb24gd2FzIHRvIGJlIGFibGUgdG8gdXNlIEdvb2dsZSBUZXN0IGluIHByb2plY3RzCit0aGF0IGRpc2FibGUgZXhjZXB0aW9ucy4gIExhdGVyIHdlIHJlYWxpemVkIHNvbWUgYWRkaXRpb25hbCBiZW5lZml0cworb2YgdGhpcyBhcHByb2FjaDoKKworICAxLiBUaHJvd2luZyBpbiBhIGRlc3RydWN0b3IgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIGluIEMrKy4gIE5vdCB1c2luZyBleGNlcHRpb25zIG1lYW5zIEdvb2dsZSBUZXN0J3MgYXNzZXJ0aW9ucyBhcmUgc2FmZSB0byB1c2UgaW4gZGVzdHJ1Y3RvcnMuCisgIDEuIFRoZSBgRVhQRUNUXypgIGZhbWlseSBvZiBtYWNyb3Mgd2lsbCBjb250aW51ZSBldmVuIGFmdGVyIGEgZmFpbHVyZSwgYWxsb3dpbmcgbXVsdGlwbGUgZmFpbHVyZXMgaW4gYSBgVEVTVGAgdG8gYmUgcmVwb3J0ZWQgaW4gYSBzaW5nbGUgcnVuLiBUaGlzIGlzIGEgcG9wdWxhciBmZWF0dXJlLCBhcyBpbiBDKysgdGhlIGVkaXQtY29tcGlsZS10ZXN0IGN5Y2xlIGlzIHVzdWFsbHkgcXVpdGUgbG9uZyBhbmQgYmVpbmcgYWJsZSB0byBmaXhpbmcgbW9yZSB0aGFuIG9uZSB0aGluZyBhdCBhIHRpbWUgaXMgYSBibGVzc2luZy4KKyAgMS4gSWYgYXNzZXJ0aW9ucyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgZXhjZXB0aW9ucywgYSB0ZXN0IG1heSBmYWxzZWx5IGlnbm9yZSBhIGZhaWx1cmUgaWYgaXQncyBjYXVnaHQgYnkgdXNlciBjb2RlOgorYGBgCit0cnkgeyAuLi4gQVNTRVJUX1RSVUUoLi4uKSAuLi4gfQorY2F0Y2ggKC4uLikgeyAuLi4gfQorYGBgCitUaGUgYWJvdmUgY29kZSB3aWxsIHBhc3MgZXZlbiBpZiB0aGUgYEFTU0VSVF9UUlVFYCB0aHJvd3MuICBXaGlsZSBpdCdzIHVubGlrZWx5IGZvciBzb21lb25lIHRvIHdyaXRlIHRoaXMgaW4gYSB0ZXN0LCBpdCdzIHBvc3NpYmxlIHRvIHJ1biBpbnRvIHRoaXMgcGF0dGVybiB3aGVuIHlvdSB3cml0ZSBhc3NlcnRpb25zIGluIGNhbGxiYWNrcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4KKworVGhlIGRvd25zaWRlIG9mIG5vdCB1c2luZyBleGNlcHRpb25zIGlzIHRoYXQgYEFTU0VSVF8qYCAoaW1wbGVtZW50ZWQKK3VzaW5nIGByZXR1cm5gKSB3aWxsIG9ubHkgYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIG5vdCB0aGUgY3VycmVudAorYFRFU1RgLgorCisjIyBXaHkgZG8gd2UgdXNlIHR3byBkaWZmZXJlbnQgbWFjcm9zIGZvciB0ZXN0cyB3aXRoIGFuZCB3aXRob3V0IGZpeHR1cmVzPyAjIworCitVbmZvcnR1bmF0ZWx5LCBDKysncyBtYWNybyBzeXN0ZW0gZG9lc24ndCBhbGxvdyB1cyB0byB1c2UgdGhlIHNhbWUKK21hY3JvIGZvciBib3RoIGNhc2VzLiAgT25lIHBvc3NpYmlsaXR5IGlzIHRvIHByb3ZpZGUgb25seSBvbmUgbWFjcm8KK2ZvciB0ZXN0cyB3aXRoIGZpeHR1cmVzLCBhbmQgcmVxdWlyZSB0aGUgdXNlciB0byBkZWZpbmUgYW4gZW1wdHkKK2ZpeHR1cmUgc29tZXRpbWVzOgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OworCitURVNUX0YoRm9vVGVzdCwgRG9lc1RoaXMpIHsgLi4uIH0KK2BgYAorb3IKK2BgYAordHlwZWRlZiA6OnRlc3Rpbmc6OlRlc3QgRm9vVGVzdDsKKworVEVTVF9GKEZvb1Rlc3QsIERvZXNUaGF0KSB7IC4uLiB9CitgYGAKKworWWV0LCBtYW55IHBlb3BsZSB0aGluayB0aGlzIGlzIG9uZSBsaW5lIHRvbyBtYW55LiA6LSkgT3VyIGdvYWwgd2FzIHRvCittYWtlIGl0IHJlYWxseSBlYXN5IHRvIHdyaXRlIHRlc3RzLCBzbyB3ZSB0cmllZCB0byBtYWtlIHNpbXBsZSB0ZXN0cwordHJpdmlhbCB0byBjcmVhdGUuICBUaGF0IG1lYW5zIHVzaW5nIGEgc2VwYXJhdGUgbWFjcm8gZm9yIHN1Y2ggdGVzdHMuCisKK1dlIHRoaW5rIG5laXRoZXIgYXBwcm9hY2ggaXMgaWRlYWwsIHlldCBlaXRoZXIgb2YgdGhlbSBpcyByZWFzb25hYmxlLgorSW4gdGhlIGVuZCwgaXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgbXVjaCBlaXRoZXIgd2F5LgorCisjIyBXaHkgZG9uJ3Qgd2UgdXNlIHN0cnVjdHMgYXMgdGVzdCBmaXh0dXJlcz8gIyMKKworV2UgbGlrZSB0byB1c2Ugc3RydWN0cyBvbmx5IHdoZW4gcmVwcmVzZW50aW5nIHBhc3NpdmUgZGF0YS4gIFRoaXMKK2Rpc3RpbmN0aW9uIGJldHdlZW4gc3RydWN0cyBhbmQgY2xhc3NlcyBpcyBnb29kIGZvciBkb2N1bWVudGluZyB0aGUKK2ludGVudCBvZiB0aGUgY29kZSdzIGF1dGhvci4gIFNpbmNlIHRlc3QgZml4dHVyZXMgaGF2ZSBsb2dpYyBsaWtlCitgU2V0VXAoKWAgYW5kIGBUZWFyRG93bigpYCwgdGhleSBhcmUgYmV0dGVyIGRlZmluZWQgYXMgY2xhc3Nlcy4KKworIyMgV2h5IGFyZSBkZWF0aCB0ZXN0cyBpbXBsZW1lbnRlZCBhcyBhc3NlcnRpb25zIGluc3RlYWQgb2YgdXNpbmcgYSB0ZXN0IHJ1bm5lcj8gIyMKKworT3VyIGdvYWwgd2FzIHRvIG1ha2UgZGVhdGggdGVzdHMgYXMgY29udmVuaWVudCBmb3IgYSB1c2VyIGFzIEMrKworcG9zc2libHkgYWxsb3dzLiAgSW4gcGFydGljdWxhcjoKKworICAqIFRoZSBydW5uZXItc3R5bGUgcmVxdWlyZXMgdG8gc3BsaXQgdGhlIGluZm9ybWF0aW9uIGludG8gdHdvIHBpZWNlczogdGhlIGRlZmluaXRpb24gb2YgdGhlIGRlYXRoIHRlc3QgaXRzZWxmLCBhbmQgdGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBydW5uZXIgb24gaG93IHRvIHJ1biB0aGUgZGVhdGggdGVzdCBhbmQgd2hhdCB0byBleHBlY3QuICBUaGUgZGVhdGggdGVzdCB3b3VsZCBiZSB3cml0dGVuIGluIEMrKywgd2hpbGUgdGhlIHJ1bm5lciBzcGVjIG1heSBvciBtYXkgbm90IGJlLiAgQSB1c2VyIG5lZWRzIHRvIGNhcmVmdWxseSBrZWVwIHRoZSB0d28gaW4gc3luYy4gYEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIGV4cGVjdGVkX21lc3NhZ2UpYCBzcGVjaWZpZXMgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBvbmUgcGxhY2UsIGluIG9uZSBsYW5ndWFnZSwgd2l0aG91dCBib2lsZXJwbGF0ZSBjb2RlLiBJdCBpcyB2ZXJ5IGRlY2xhcmF0aXZlLgorICAqIGBBU1NFUlRfREVBVEhgIGhhcyBhIHNpbWlsYXIgc3ludGF4IGFuZCBlcnJvci1yZXBvcnRpbmcgc2VtYW50aWNzIGFzIG90aGVyIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMsIGFuZCB0aHVzIGlzIGVhc3kgdG8gbGVhcm4uCisgICogYEFTU0VSVF9ERUFUSGAgY2FuIGJlIG1peGVkIHdpdGggb3RoZXIgYXNzZXJ0aW9ucyBhbmQgb3RoZXIgbG9naWMgYXQgeW91ciB3aWxsLiAgWW91IGFyZSBub3QgbGltaXRlZCB0byBvbmUgZGVhdGggdGVzdCBwZXIgdGVzdCBtZXRob2QuIEZvciBleGFtcGxlLCB5b3UgY2FuIHdyaXRlIHNvbWV0aGluZyBsaWtlOgorYGBgCisgICAgaWYgKEZvb0NvbmRpdGlvbigpKSB7CisgICAgICBBU1NFUlRfREVBVEgoQmFyKCksICJibGFoIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9FUSg1LCBCYXIoKSk7CisgICAgfQorYGBgCitJZiB5b3UgcHJlZmVyIG9uZSBkZWF0aCB0ZXN0IHBlciB0ZXN0IG1ldGhvZCwgeW91IGNhbiB3cml0ZSB5b3VyIHRlc3RzIGluIHRoYXQgc3R5bGUgdG9vLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBpbXBvc2UgdGhhdCBvbiB0aGUgdXNlcnMuICBUaGUgZmV3ZXIgYXJ0aWZpY2lhbCBsaW1pdGF0aW9ucyB0aGUgYmV0dGVyLgorICAqIGBBU1NFUlRfREVBVEhgIGNhbiByZWZlcmVuY2UgbG9jYWwgdmFyaWFibGVzIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCBhbmQgeW91IGNhbiBkZWNpZGUgaG93IG1hbnkgZGVhdGggdGVzdHMgeW91IHdhbnQgYmFzZWQgb24gcnVuLXRpbWUgaW5mb3JtYXRpb24uICBGb3IgZXhhbXBsZSwKK2BgYAorICAgIGNvbnN0IGludCBjb3VudCA9IEdldENvdW50KCk7ICAvLyBPbmx5IGtub3duIGF0IHJ1biB0aW1lLgorICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgIEFTU0VSVF9ERUFUSCh7CisgICAgICAgIGRvdWJsZSogYnVmZmVyID0gbmV3IGRvdWJsZVtpXTsKKyAgICAgICAgLi4uIGluaXRpYWxpemVzIGJ1ZmZlciAuLi4KKyAgICAgICAgRm9vKGJ1ZmZlciwgaSkKKyAgICAgIH0sICJibGFoIGJsYWgiKTsKKyAgICB9CitgYGAKK1RoZSBydW5uZXItYmFzZWQgYXBwcm9hY2ggdGVuZHMgdG8gYmUgbW9yZSBzdGF0aWMgYW5kIGxlc3MgZmxleGlibGUsIG9yIHJlcXVpcmVzIG1vcmUgdXNlciBlZmZvcnQgdG8gZ2V0IHRoaXMga2luZCBvZiBmbGV4aWJpbGl0eS4KKworQW5vdGhlciBpbnRlcmVzdGluZyB0aGluZyBhYm91dCBgQVNTRVJUX0RFQVRIYCBpcyB0aGF0IGl0IGNhbGxzIGBmb3JrKClgCit0byBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzIHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoaXMgaXMgbGlnaHRlbmluZworZmFzdCwgYXMgYGZvcmsoKWAgdXNlcyBjb3B5LW9uLXdyaXRlIHBhZ2VzIGFuZCBpbmN1cnMgYWxtb3N0IHplcm8KK292ZXJoZWFkLCBhbmQgdGhlIGNoaWxkIHByb2Nlc3Mgc3RhcnRzIGZyb20gdGhlIHVzZXItc3VwcGxpZWQKK3N0YXRlbWVudCBkaXJlY3RseSwgc2tpcHBpbmcgYWxsIGdsb2JhbCBhbmQgbG9jYWwgaW5pdGlhbGl6YXRpb24gYW5kCithbnkgY29kZSBsZWFkaW5nIHRvIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJZiB5b3UgbGF1bmNoIHRoZSBjaGlsZAorcHJvY2VzcyBmcm9tIHNjcmF0Y2gsIGl0IGNhbiB0YWtlIHNlY29uZHMganVzdCB0byBsb2FkIGV2ZXJ5dGhpbmcgYW5kCitzdGFydCBydW5uaW5nIGlmIHRoZSB0ZXN0IGxpbmtzIHRvIG1hbnkgbGlicmFyaWVzIGR5bmFtaWNhbGx5LgorCisjIyBNeSBkZWF0aCB0ZXN0IG1vZGlmaWVzIHNvbWUgc3RhdGUsIGJ1dCB0aGUgY2hhbmdlIHNlZW1zIGxvc3QgYWZ0ZXIgdGhlIGRlYXRoIHRlc3QgZmluaXNoZXMuIFdoeT8gIyMKKworRGVhdGggdGVzdHMgKGBFWFBFQ1RfREVBVEhgLCBldGMpIGFyZSBleGVjdXRlZCBpbiBhIHN1Yi1wcm9jZXNzIHMudC4gdGhlCitleHBlY3RlZCBjcmFzaCB3b24ndCBraWxsIHRoZSB0ZXN0IHByb2dyYW0gKGkuZS4gdGhlIHBhcmVudCBwcm9jZXNzKS4gQXMgYQorcmVzdWx0LCBhbnkgaW4tbWVtb3J5IHNpZGUgZWZmZWN0cyB0aGV5IGluY3VyIGFyZSBvYnNlcnZhYmxlIGluIHRoZWlyCityZXNwZWN0aXZlIHN1Yi1wcm9jZXNzZXMsIGJ1dCBub3QgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiBZb3UgY2FuIHRoaW5rIG9mIHRoZW0KK2FzIHJ1bm5pbmcgaW4gYSBwYXJhbGxlbCB1bml2ZXJzZSwgbW9yZSBvciBsZXNzLgorCisjIyBUaGUgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0ICJ1bmRlZmluZWQgcmVmZXJlbmNlcyIgdG8gc29tZSBzdGF0aWMgY29uc3QgbWVtYmVyIHZhcmlhYmxlcywgYnV0IEkgZGlkIGRlZmluZSB0aGVtIGluIHRoZSBjbGFzcyBib2R5LiBXaGF0J3Mgd3Jvbmc/ICMjCisKK0lmIHlvdXIgY2xhc3MgaGFzIGEgc3RhdGljIGRhdGEgbWVtYmVyOgorCitgYGAKKy8vIGZvby5oCitjbGFzcyBGb28geworICAuLi4KKyAgc3RhdGljIGNvbnN0IGludCBrQmFyID0gMTAwOworfTsKK2BgYAorCitZb3UgYWxzbyBuZWVkIHRvIGRlZmluZSBpdCBfb3V0c2lkZV8gb2YgdGhlIGNsYXNzIGJvZHkgaW4gYGZvby5jY2A6CisKK2BgYAorY29uc3QgaW50IEZvbzo6a0JhcjsgIC8vIE5vIGluaXRpYWxpemVyIGhlcmUuCitgYGAKKworT3RoZXJ3aXNlIHlvdXIgY29kZSBpcyAqKmludmFsaWQgQysrKiosIGFuZCBtYXkgYnJlYWsgaW4gdW5leHBlY3RlZCB3YXlzLiBJbgorcGFydGljdWxhciwgdXNpbmcgaXQgaW4gR29vZ2xlIFRlc3QgY29tcGFyaXNvbiBhc3NlcnRpb25zIChgRVhQRUNUX0VRYCwgZXRjKQord2lsbCBnZW5lcmF0ZSBhbiAidW5kZWZpbmVkIHJlZmVyZW5jZSIgbGlua2VyIGVycm9yLgorCisjIyBJIGhhdmUgYW4gaW50ZXJmYWNlIHRoYXQgaGFzIHNldmVyYWwgaW1wbGVtZW50YXRpb25zLiBDYW4gSSB3cml0ZSBhIHNldCBvZiB0ZXN0cyBvbmNlIGFuZCByZXBlYXQgdGhlbSBvdmVyIGFsbCB0aGUgaW1wbGVtZW50YXRpb25zPyAjIworCitHb29nbGUgVGVzdCBkb2Vzbid0IHlldCBoYXZlIGdvb2Qgc3VwcG9ydCBmb3IgdGhpcyBraW5kIG9mIHRlc3RzLCBvcgorZGF0YS1kcml2ZW4gdGVzdHMgaW4gZ2VuZXJhbC4gV2UgaG9wZSB0byBiZSBhYmxlIHRvIG1ha2UgaW1wcm92ZW1lbnRzIGluIHRoaXMKK2FyZWEgc29vbi4KKworIyMgQ2FuIEkgZGVyaXZlIGEgdGVzdCBmaXh0dXJlIGZyb20gYW5vdGhlcj8gIyMKKworWWVzLgorCitFYWNoIHRlc3QgZml4dHVyZSBoYXMgYSBjb3JyZXNwb25kaW5nIGFuZCBzYW1lIG5hbWVkIHRlc3QgY2FzZS4gVGhpcyBtZWFucyBvbmx5CitvbmUgdGVzdCBjYXNlIGNhbiB1c2UgYSBwYXJ0aWN1bGFyIGZpeHR1cmUuIFNvbWV0aW1lcywgaG93ZXZlciwgbXVsdGlwbGUgdGVzdAorY2FzZXMgbWF5IHdhbnQgdG8gdXNlIHRoZSBzYW1lIG9yIHNsaWdodGx5IGRpZmZlcmVudCBmaXh0dXJlcy4gRm9yIGV4YW1wbGUsIHlvdQorbWF5IHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG9mIGEgR1VJIGxpYnJhcnkncyB0ZXN0IGNhc2VzIGRvbid0IGxlYWsKK2ltcG9ydGFudCBzeXN0ZW0gcmVzb3VyY2VzIGxpa2UgZm9udHMgYW5kIGJydXNoZXMuCisKK0luIEdvb2dsZSBUZXN0LCB5b3Ugc2hhcmUgYSBmaXh0dXJlIGFtb25nIHRlc3QgY2FzZXMgYnkgcHV0dGluZyB0aGUgc2hhcmVkCitsb2dpYyBpbiBhIGJhc2UgdGVzdCBmaXh0dXJlLCB0aGVuIGRlcml2aW5nIGZyb20gdGhhdCBiYXNlIGEgc2VwYXJhdGUgZml4dHVyZQorZm9yIGVhY2ggdGVzdCBjYXNlIHRoYXQgd2FudHMgdG8gdXNlIHRoaXMgY29tbW9uIGxvZ2ljLiBZb3UgdGhlbiB1c2UgYFRFU1RfRigpYAordG8gd3JpdGUgdGVzdHMgdXNpbmcgZWFjaCBkZXJpdmVkIGZpeHR1cmUuCisKK1R5cGljYWxseSwgeW91ciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKworYGBgCisvLyBEZWZpbmVzIGEgYmFzZSB0ZXN0IGZpeHR1cmUuCitjbGFzcyBCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAuLi4KK307CisKKy8vIERlcml2ZXMgYSBmaXh0dXJlIEZvb1Rlc3QgZnJvbSBCYXNlVGVzdC4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgQmFzZVRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgICAgQmFzZVRlc3Q6OlNldFVwKCk7ICAvLyBTZXRzIHVwIHRoZSBiYXNlIGZpeHR1cmUgZmlyc3QuCisgICAgICAuLi4gYWRkaXRpb25hbCBzZXQtdXAgd29yayAuLi4KKyAgICB9CisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgICAgLi4uIGNsZWFuLXVwIHdvcmsgZm9yIEZvb1Rlc3QgLi4uCisgICAgICBCYXNlVGVzdDo6VGVhckRvd24oKTsgIC8vIFJlbWVtYmVyIHRvIHRlYXIgZG93biB0aGUgYmFzZSBmaXh0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIGNsZWFuaW5nIHVwIEZvb1Rlc3QhCisgICAgfQorICAgIC4uLiBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBmb3IgRm9vVGVzdCAuLi4KK307CisKKy8vIFRlc3RzIHRoYXQgdXNlIHRoZSBmaXh0dXJlIEZvb1Rlc3QuCitURVNUX0YoRm9vVGVzdCwgQmFyKSB7IC4uLiB9CitURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9CisKKy4uLiBhZGRpdGlvbmFsIGZpeHR1cmVzIGRlcml2ZWQgZnJvbSBCYXNlVGVzdCAuLi4KK2BgYAorCitJZiBuZWNlc3NhcnksIHlvdSBjYW4gY29udGludWUgdG8gZGVyaXZlIHRlc3QgZml4dHVyZXMgZnJvbSBhIGRlcml2ZWQgZml4dHVyZS4KK0dvb2dsZSBUZXN0IGhhcyBubyBsaW1pdCBvbiBob3cgZGVlcCB0aGUgaGllcmFyY2h5IGNhbiBiZS4KKworRm9yIGEgY29tcGxldGUgZXhhbXBsZSB1c2luZyBkZXJpdmVkIHRlc3QgZml4dHVyZXMsIHNlZQorYHNhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jY2AuCisKKyMjIE15IGNvbXBpbGVyIGNvbXBsYWlucyAidm9pZCB2YWx1ZSBub3QgaWdub3JlZCBhcyBpdCBvdWdodCB0byBiZS4iIFdoYXQgZG9lcyB0aGlzIG1lYW4/ICMjCisKK1lvdSdyZSBwcm9iYWJseSB1c2luZyBhbiBgQVNTRVJUXyooKWAgaW4gYSBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QgcmV0dXJuIGB2b2lkYC4KK2BBU1NFUlRfKigpYCBjYW4gb25seSBiZSB1c2VkIGluIGB2b2lkYCBmdW5jdGlvbnMuCisKKyMjIE15IGRlYXRoIHRlc3QgaGFuZ3MgKG9yIHNlZy1mYXVsdHMpLiBIb3cgZG8gSSBmaXggaXQ/ICMjCisKK0luIEdvb2dsZSBUZXN0LCBkZWF0aCB0ZXN0cyBhcmUgcnVuIGluIGEgY2hpbGQgcHJvY2VzcyBhbmQgdGhlIHdheSB0aGV5IHdvcmsgaXMKK2RlbGljYXRlLiBUbyB3cml0ZSBkZWF0aCB0ZXN0cyB5b3UgcmVhbGx5IG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhleSB3b3JrLgorUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSByZWFkIHRoaXMuCisKK0luIHBhcnRpY3VsYXIsIGRlYXRoIHRlc3RzIGRvbid0IGxpa2UgaGF2aW5nIG11bHRpcGxlIHRocmVhZHMgaW4gdGhlIHBhcmVudAorcHJvY2Vzcy4gU28gdGhlIGZpcnN0IHRoaW5nIHlvdSBjYW4gdHJ5IGlzIHRvIGVsaW1pbmF0ZSBjcmVhdGluZyB0aHJlYWRzCitvdXRzaWRlIG9mIGBFWFBFQ1RfREVBVEgoKWAuCisKK1NvbWV0aW1lcyB0aGlzIGlzIGltcG9zc2libGUgYXMgc29tZSBsaWJyYXJ5IHlvdSBtdXN0IHVzZSBtYXkgYmUgY3JlYXRpbmcKK3RocmVhZHMgYmVmb3JlIGBtYWluKClgIGlzIGV2ZW4gcmVhY2hlZC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHRyeSB0byBtaW5pbWl6ZQordGhlIGNoYW5jZSBvZiBjb25mbGljdHMgYnkgZWl0aGVyIG1vdmluZyBhcyBtYW55IGFjdGl2aXRpZXMgYXMgcG9zc2libGUgaW5zaWRlCitgRVhQRUNUX0RFQVRIKClgIChpbiB0aGUgZXh0cmVtZSBjYXNlLCB5b3Ugd2FudCB0byBtb3ZlIGV2ZXJ5dGhpbmcgaW5zaWRlKSwgb3IKK2xlYXZpbmcgYXMgZmV3IHRoaW5ncyBhcyBwb3NzaWJsZSBpbiBpdC4gQWxzbywgeW91IGNhbiB0cnkgdG8gc2V0IHRoZSBkZWF0aAordGVzdCBzdHlsZSB0byBgInRocmVhZHNhZmUiYCwgd2hpY2ggaXMgc2FmZXIgYnV0IHNsb3dlciwgYW5kIHNlZSBpZiBpdCBoZWxwcy4KKworSWYgeW91IGdvIHdpdGggdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMsIHJlbWVtYmVyIHRoYXQgdGhleSByZXJ1biB0aGUgdGVzdAorcHJvZ3JhbSBmcm9tIHRoZSBiZWdpbm5pbmcgaW4gdGhlIGNoaWxkIHByb2Nlc3MuIFRoZXJlZm9yZSBtYWtlIHN1cmUgeW91cgorcHJvZ3JhbSBjYW4gcnVuIHNpZGUtYnktc2lkZSB3aXRoIGl0c2VsZiBhbmQgaXMgZGV0ZXJtaW5pc3RpYy4KKworSW4gdGhlIGVuZCwgdGhpcyBib2lscyBkb3duIHRvIGdvb2QgY29uY3VycmVudCBwcm9ncmFtbWluZy4gWW91IGhhdmUgdG8gbWFrZQorc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHJhY2UgY29uZGl0aW9ucyBvciBkZWFkIGxvY2tzIGluIHlvdXIgcHJvZ3JhbS4gTm8gc2lsdmVyCitidWxsZXQgLSBzb3JyeSEKKworIyMgU2hvdWxkIEkgdXNlIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIG9mIHRoZSB0ZXN0IGZpeHR1cmUgb3IgdGhlIHNldC11cC90ZWFyLWRvd24gZnVuY3Rpb24/ICMjCisKK1RoZSBmaXJzdCB0aGluZyB0byByZW1lbWJlciBpcyB0aGF0IEdvb2dsZSBUZXN0IGRvZXMgbm90IHJldXNlIHRoZQorc2FtZSB0ZXN0IGZpeHR1cmUgb2JqZWN0IGFjcm9zcyBtdWx0aXBsZSB0ZXN0cy4gRm9yIGVhY2ggYFRFU1RfRmAsCitHb29nbGUgVGVzdCB3aWxsIGNyZWF0ZSBhIGZyZXNoIHRlc3QgZml4dHVyZSBvYmplY3QsIF9pbW1lZGlhdGVseV8KK2NhbGwgYFNldFVwKClgLCBydW4gdGhlIHRlc3QsIGNhbGwgYFRlYXJEb3duKClgLCBhbmQgdGhlbgorX2ltbWVkaWF0ZWx5XyBkZWxldGUgdGhlIHRlc3QgZml4dHVyZSBvYmplY3QuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8KK25lZWQgdG8gd3JpdGUgYSBgU2V0VXAoKWAgb3IgYFRlYXJEb3duKClgIGZ1bmN0aW9uIGlmIHRoZSBjb25zdHJ1Y3Rvcgorb3IgZGVzdHJ1Y3RvciBhbHJlYWR5IGRvZXMgdGhlIGpvYi4KKworWW91IG1heSBzdGlsbCB3YW50IHRvIHVzZSBgU2V0VXAoKS9UZWFyRG93bigpYCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorICAqIElmIHRoZSB0ZWFyLWRvd24gb3BlcmF0aW9uIGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiwgeW91IG11c3QgdXNlIGBUZWFyRG93bigpYCBhcyBvcHBvc2VkIHRvIHRoZSBkZXN0cnVjdG9yLCBhcyB0aHJvd2luZyBpbiBhIGRlc3RydWN0b3IgbGVhZHMgdG8gdW5kZWZpbmVkIGJlaGF2aW9yIGFuZCB1c3VhbGx5IHdpbGwga2lsbCB5b3VyIHByb2dyYW0gcmlnaHQgYXdheS4gTm90ZSB0aGF0IG1hbnkgc3RhbmRhcmQgbGlicmFyaWVzIChsaWtlIFNUTCkgbWF5IHRocm93IHdoZW4gZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBpbiB0aGUgY29tcGlsZXIuIFRoZXJlZm9yZSB5b3Ugc2hvdWxkIHByZWZlciBgVGVhckRvd24oKWAgaWYgeW91IHdhbnQgdG8gd3JpdGUgcG9ydGFibGUgdGVzdHMgdGhhdCB3b3JrIHdpdGggb3Igd2l0aG91dCBleGNlcHRpb25zLgorICAqIFRoZSBHb29nbGUgVGVzdCB0ZWFtIGlzIGNvbnNpZGVyaW5nIG1ha2luZyB0aGUgYXNzZXJ0aW9uIG1hY3JvcyB0aHJvdyBvbiBwbGF0Zm9ybXMgd2hlcmUgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCAoZS5nLiBXaW5kb3dzLCBNYWMgT1MsIGFuZCBMaW51eCBjbGllbnQtc2lkZSksIHdoaWNoIHdpbGwgZWxpbWluYXRlIHRoZSBuZWVkIGZvciB0aGUgdXNlciB0byBwcm9wYWdhdGUgZmFpbHVyZXMgZnJvbSBhIHN1YnJvdXRpbmUgdG8gaXRzIGNhbGxlci4gVGhlcmVmb3JlLCB5b3Ugc2hvdWxkbid0IHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGluIGEgZGVzdHJ1Y3RvciBpZiB5b3VyIGNvZGUgY291bGQgcnVuIG9uIHN1Y2ggYSBwbGF0Zm9ybS4KKyAgKiBJbiBhIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IsIHlvdSBjYW5ub3QgbWFrZSBhIHZpcnR1YWwgZnVuY3Rpb24gY2FsbCBvbiB0aGlzIG9iamVjdC4gKFlvdSBjYW4gY2FsbCBhIG1ldGhvZCBkZWNsYXJlZCBhcyB2aXJ0dWFsLCBidXQgaXQgd2lsbCBiZSBzdGF0aWNhbGx5IGJvdW5kLikgVGhlcmVmb3JlLCBpZiB5b3UgbmVlZCB0byBjYWxsIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSBvdmVycmlkZW4gaW4gYSBkZXJpdmVkIGNsYXNzLCB5b3UgaGF2ZSB0byB1c2UgYFNldFVwKCkvVGVhckRvd24oKWAuCisKKyMjIFRoZSBjb21waWxlciBjb21wbGFpbnMgIm5vIG1hdGNoaW5nIGZ1bmN0aW9uIHRvIGNhbGwiIHdoZW4gSSB1c2UgQVNTRVJUXF9QUkVEbi4gSG93IGRvIEkgZml4IGl0PyAjIworCitJZiB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIHlvdSB1c2UgaW4gYEFTU0VSVF9QUkVEKmAgb3IgYEVYUEVDVF9QUkVEKmAgaXMKK292ZXJsb2FkZWQgb3IgYSB0ZW1wbGF0ZSwgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0cm91YmxlIGZpZ3VyaW5nIG91dCB3aGljaAorb3ZlcmxvYWRlZCB2ZXJzaW9uIGl0IHNob3VsZCB1c2UuIGBBU1NFUlRfUFJFRF9GT1JNQVQqYCBhbmQKK2BFWFBFQ1RfUFJFRF9GT1JNQVQqYCBkb24ndCBoYXZlIHRoaXMgcHJvYmxlbS4KKworSWYgeW91IHNlZSB0aGlzIGVycm9yLCB5b3UgbWlnaHQgd2FudCB0byBzd2l0Y2ggdG8KK2AoQVNTRVJUfEVYUEVDVClfUFJFRF9GT1JNQVQqYCwgd2hpY2ggd2lsbCBhbHNvIGdpdmUgeW91IGEgYmV0dGVyIGZhaWx1cmUKK21lc3NhZ2UuIElmLCBob3dldmVyLCB0aGF0IGlzIG5vdCBhbiBvcHRpb24sIHlvdSBjYW4gcmVzb2x2ZSB0aGUgcHJvYmxlbSBieQorZXhwbGljaXRseSB0ZWxsaW5nIHRoZSBjb21waWxlciB3aGljaCB2ZXJzaW9uIHRvIHBpY2suCisKK0ZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlCisKK2BgYAorYm9vbCBJc1Bvc2l0aXZlKGludCBuKSB7CisgIHJldHVybiBuID4gMDsKK30KK2Jvb2wgSXNQb3NpdGl2ZShkb3VibGUgeCkgeworICByZXR1cm4geCA+IDA7Cit9CitgYGAKKworeW91IHdpbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IgaWYgeW91IHdyaXRlCisKK2BgYAorRVhQRUNUX1BSRUQxKElzUG9zaXRpdmUsIDUpOworYGBgCisKK0hvd2V2ZXIsIHRoaXMgd2lsbCB3b3JrOgorCitgYGAKK0VYUEVDVF9QUkVEMSgqc3RhdGljX2Nhc3Q8Ym9vbCAoKikoaW50KT4qKElzUG9zaXRpdmUpLCA1KTsKK2BgYAorCisoVGhlIHN0dWZmIGluc2lkZSB0aGUgYW5nbGVkIGJyYWNrZXRzIGZvciB0aGUgYHN0YXRpY19jYXN0YCBvcGVyYXRvciBpcyB0aGUKK3R5cGUgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIHRoZSBgaW50YC12ZXJzaW9uIG9mIGBJc1Bvc2l0aXZlKClgLikKKworQXMgYW5vdGhlciBleGFtcGxlLCB3aGVuIHlvdSBoYXZlIGEgdGVtcGxhdGUgZnVuY3Rpb24KKworYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgSXNOZWdhdGl2ZShUIHgpIHsKKyAgcmV0dXJuIHggPCAwOworfQorYGBgCisKK3lvdSBjYW4gdXNlIGl0IGluIGEgcHJlZGljYXRlIGFzc2VydGlvbiBsaWtlIHRoaXM6CisKK2BgYAorQVNTRVJUX1BSRUQxKElzTmVnYXRpdmUqPGludD4qLCAtNSk7CitgYGAKKworVGhpbmdzIGFyZSBtb3JlIGludGVyZXN0aW5nIGlmIHlvdXIgdGVtcGxhdGUgaGFzIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVycy4gVGhlCitmb2xsb3dpbmcgd29uJ3QgY29tcGlsZToKKworYGBgCitBU1NFUlRfUFJFRDIoKkdyZWF0ZXJUaGFuPGludCwgaW50PiosIDUsIDApOworYGBgCisKKworYXMgdGhlIEMrKyBwcmUtcHJvY2Vzc29yIHRoaW5rcyB5b3UgYXJlIGdpdmluZyBgQVNTRVJUX1BSRUQyYCA0IGFyZ3VtZW50cywKK3doaWNoIGlzIG9uZSBtb3JlIHRoYW4gZXhwZWN0ZWQuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHdyYXAgdGhlIHByZWRpY2F0ZQorZnVuY3Rpb24gaW4gcGFyZW50aGVzZXM6CisKK2BgYAorQVNTRVJUX1BSRUQyKCooR3JlYXRlclRoYW48aW50LCBpbnQ+KSosIDUsIDApOworYGBgCisKKworIyMgTXkgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0ICJpZ25vcmluZyByZXR1cm4gdmFsdWUiIHdoZW4gSSBjYWxsIFJVTlxfQUxMXF9URVNUUygpLiBXaHk/ICMjCisKK1NvbWUgcGVvcGxlIGhhZCBiZWVuIGlnbm9yaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYFJVTl9BTExfVEVTVFMoKWAuIFRoYXQgaXMsCitpbnN0ZWFkIG9mCisKK2BgYAorcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK2BgYAorCit0aGV5IHdyaXRlCisKK2BgYAorUlVOX0FMTF9URVNUUygpOworYGBgCisKK1RoaXMgaXMgd3JvbmcgYW5kIGRhbmdlcm91cy4gQSB0ZXN0IHJ1bm5lciBuZWVkcyB0byBzZWUgdGhlIHJldHVybiB2YWx1ZSBvZgorYFJVTl9BTExfVEVTVFMoKWAgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIGEgdGVzdCBoYXMgcGFzc2VkLiBJZiB5b3VyIGBtYWluKClgCitmdW5jdGlvbiBpZ25vcmVzIGl0LCB5b3VyIHRlc3Qgd2lsbCBiZSBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgZXZlbiBpZiBpdCBoYXMgYQorR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIGZhaWx1cmUuIFZlcnkgYmFkLgorCitUbyBoZWxwIHRoZSB1c2VycyBhdm9pZCB0aGlzIGRhbmdlcm91cyBidWcsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorYFJVTl9BTExfVEVTVFMoKWAgY2F1c2VzIGdjYyB0byByYWlzZSB0aGlzIHdhcm5pbmcsIHdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcworaWdub3JlZC4gSWYgeW91IHNlZSB0aGlzIHdhcm5pbmcsIHRoZSBmaXggaXMgc2ltcGxlOiBqdXN0IG1ha2Ugc3VyZSBpdHMgdmFsdWUKK2lzIHVzZWQgYXMgdGhlIHJldHVybiB2YWx1ZSBvZiBgbWFpbigpYC4KKworIyMgTXkgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgYSBjb25zdHJ1Y3RvciAob3IgZGVzdHJ1Y3RvcikgY2Fubm90IHJldHVybiBhIHZhbHVlLiBXaGF0J3MgZ29pbmcgb24/ICMjCisKK0R1ZSB0byBhIHBlY3VsaWFyaXR5IG9mIEMrKywgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgc3ludGF4IGZvciBzdHJlYW1pbmcKK21lc3NhZ2VzIHRvIGFuIGBBU1NFUlRfKmAsIGUuZy4KKworYGBgCitBU1NFUlRfRVEoMSwgRm9vKCkpIDw8ICJibGFoIGJsYWgiIDw8IGZvbzsKK2BgYAorCit3ZSBoYWQgdG8gZ2l2ZSB1cCB1c2luZyBgQVNTRVJUKmAgYW5kIGBGQUlMKmAgKGJ1dCBub3QgYEVYUEVDVCpgIGFuZAorYEFERF9GQUlMVVJFKmApIGluIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIG1vdmUgdGhlCitjb250ZW50IG9mIHlvdXIgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0byBhIHByaXZhdGUgdm9pZCBtZW1iZXIgZnVuY3Rpb24sIG9yCitzd2l0Y2ggdG8gYEVYUEVDVF8qKClgIGlmIHRoYXQgd29ya3MuIFRoaXMgc2VjdGlvbiBpbiB0aGUgdXNlcidzIGd1aWRlIGV4cGxhaW5zCitpdC4KKworIyMgTXkgc2V0LXVwIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQuIFdoeT8gIyMKKworQysrIGlzIGNhc2Utc2Vuc2l0aXZlLiBJdCBzaG91bGQgYmUgc3BlbGxlZCBhcyBgU2V0VXAoKWAuICBEaWQgeW91CitzcGVsbCBpdCBhcyBgU2V0dXAoKWA/CisKK1NpbWlsYXJseSwgc29tZXRpbWVzIHBlb3BsZSBzcGVsbCBgU2V0VXBUZXN0Q2FzZSgpYCBhcyBgU2V0dXBUZXN0Q2FzZSgpYCBhbmQKK3dvbmRlciB3aHkgaXQncyBuZXZlciBjYWxsZWQuCisKKyMjIEhvdyBkbyBJIGp1bXAgdG8gdGhlIGxpbmUgb2YgYSBmYWlsdXJlIGluIEVtYWNzIGRpcmVjdGx5PyAjIworCitHb29nbGUgVGVzdCdzIGZhaWx1cmUgbWVzc2FnZSBmb3JtYXQgaXMgdW5kZXJzdG9vZCBieSBFbWFjcyBhbmQgbWFueSBvdGhlcgorSURFcywgbGlrZSBhY21lIGFuZCBYQ29kZS4gSWYgYSBHb29nbGUgVGVzdCBtZXNzYWdlIGlzIGluIGEgY29tcGlsYXRpb24gYnVmZmVyCitpbiBFbWFjcywgdGhlbiBpdCdzIGNsaWNrYWJsZS4gWW91IGNhbiBub3cgaGl0IGBlbnRlcmAgb24gYSBtZXNzYWdlIHRvIGp1bXAgdG8KK3RoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCBvciB1c2UgYEMteCBgYCB0byBqdW1wIHRvIHRoZSBuZXh0IGZhaWx1cmUuCisKKyMjIEkgaGF2ZSBzZXZlcmFsIHRlc3QgY2FzZXMgd2hpY2ggc2hhcmUgdGhlIHNhbWUgdGVzdCBmaXh0dXJlIGxvZ2ljLCBkbyBJIGhhdmUgdG8gZGVmaW5lIGEgbmV3IHRlc3QgZml4dHVyZSBjbGFzcyBmb3IgZWFjaCBvZiB0aGVtPyBUaGlzIHNlZW1zIHByZXR0eSB0ZWRpb3VzLiAjIworCitZb3UgZG9uJ3QgaGF2ZSB0by4gSW5zdGVhZCBvZgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgQmFzZVRlc3Qge307CisKK1RFU1RfRihGb29UZXN0LCBBYmMpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBEZWYpIHsgLi4uIH0KKworY2xhc3MgQmFyVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCB7fTsKKworVEVTVF9GKEJhclRlc3QsIEFiYykgeyAuLi4gfQorVEVTVF9GKEJhclRlc3QsIERlZikgeyAuLi4gfQorYGBgCisKK3lvdSBjYW4gc2ltcGx5IGB0eXBlZGVmYCB0aGUgdGVzdCBmaXh0dXJlczoKK2BgYAordHlwZWRlZiBCYXNlVGVzdCBGb29UZXN0OworCitURVNUX0YoRm9vVGVzdCwgQWJjKSB7IC4uLiB9CitURVNUX0YoRm9vVGVzdCwgRGVmKSB7IC4uLiB9CisKK3R5cGVkZWYgQmFzZVRlc3QgQmFyVGVzdDsKKworVEVTVF9GKEJhclRlc3QsIEFiYykgeyAuLi4gfQorVEVTVF9GKEJhclRlc3QsIERlZikgeyAuLi4gfQorYGBgCisKKyMjIFRoZSBHb29nbGUgVGVzdCBvdXRwdXQgaXMgYnVyaWVkIGluIGEgd2hvbGUgYnVuY2ggb2YgbG9nIG1lc3NhZ2VzLiBXaGF0IGRvIEkgZG8/ICMjCisKK1RoZSBHb29nbGUgVGVzdCBvdXRwdXQgaXMgbWVhbnQgdG8gYmUgYSBjb25jaXNlIGFuZCBodW1hbi1mcmllbmRseSByZXBvcnQuIElmCit5b3VyIHRlc3QgZ2VuZXJhdGVzIHRleHR1YWwgb3V0cHV0IGl0c2VsZiwgaXQgd2lsbCBtaXggd2l0aCB0aGUgR29vZ2xlIFRlc3QKK291dHB1dCwgbWFraW5nIGl0IGhhcmQgdG8gcmVhZC4gSG93ZXZlciwgdGhlcmUgaXMgYW4gZWFzeSBzb2x1dGlvbiB0byB0aGlzCitwcm9ibGVtLgorCitTaW5jZSBtb3N0IGxvZyBtZXNzYWdlcyBnbyB0byBzdGRlcnIsIHdlIGRlY2lkZWQgdG8gbGV0IEdvb2dsZSBUZXN0IG91dHB1dCBnbwordG8gc3Rkb3V0LiBUaGlzIHdheSwgeW91IGNhbiBlYXNpbHkgc2VwYXJhdGUgdGhlIHR3byB1c2luZyByZWRpcmVjdGlvbi4gRm9yCitleGFtcGxlOgorYGBgCisuL215X3Rlc3QgPiBnb29nbGV0ZXN0X291dHB1dC50eHQKK2BgYAorCisjIyBXaHkgc2hvdWxkIEkgcHJlZmVyIHRlc3QgZml4dHVyZXMgb3ZlciBnbG9iYWwgdmFyaWFibGVzPyAjIworCitUaGVyZSBhcmUgc2V2ZXJhbCBnb29kIHJlYXNvbnM6CisgIDEuIEl0J3MgbGlrZWx5IHlvdXIgdGVzdCBuZWVkcyB0byBjaGFuZ2UgdGhlIHN0YXRlcyBvZiBpdHMgZ2xvYmFsIHZhcmlhYmxlcy4gVGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8ga2VlcCBzaWRlIGVmZmVjdHMgZnJvbSBlc2NhcGluZyBvbmUgdGVzdCBhbmQgY29udGFtaW5hdGluZyBvdGhlcnMsIG1ha2luZyBkZWJ1Z2dpbmcgZGlmZmljdWx0LiBCeSB1c2luZyBmaXh0dXJlcywgZWFjaCB0ZXN0IGhhcyBhIGZyZXNoIHNldCBvZiB2YXJpYWJsZXMgdGhhdCdzIGRpZmZlcmVudCAoYnV0IHdpdGggdGhlIHNhbWUgbmFtZXMpLiBUaHVzLCB0ZXN0cyBhcmUga2VwdCBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLgorICAxLiBHbG9iYWwgdmFyaWFibGVzIHBvbGx1dGUgdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisgIDEuIFRlc3QgZml4dHVyZXMgY2FuIGJlIHJldXNlZCB2aWEgc3ViY2xhc3NpbmcsIHdoaWNoIGNhbm5vdCBiZSBkb25lIGVhc2lseSB3aXRoIGdsb2JhbCB2YXJpYWJsZXMuIFRoaXMgaXMgdXNlZnVsIGlmIG1hbnkgdGVzdCBjYXNlcyBoYXZlIHNvbWV0aGluZyBpbiBjb21tb24uCisKKyMjIEhvdyBkbyBJIHRlc3QgcHJpdmF0ZSBjbGFzcyBtZW1iZXJzIHdpdGhvdXQgd3JpdGluZyBGUklFTkRcX1RFU1QoKXM/ICMjCisKK1lvdSBzaG91bGQgdHJ5IHRvIHdyaXRlIHRlc3RhYmxlIGNvZGUsIHdoaWNoIG1lYW5zIGNsYXNzZXMgc2hvdWxkIGJlIGVhc2lseQordGVzdGVkIGZyb20gdGhlaXIgcHVibGljIGludGVyZmFjZS4gT25lIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdGhlIFBpbXBsIGlkaW9tOgoreW91IG1vdmUgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIGludG8gYSBoZWxwZXIgY2xhc3MsIGFuZCBtYWtlIGFsbAorbWVtYmVycyBvZiB0aGUgaGVscGVyIGNsYXNzIHB1YmxpYy4KKworWW91IGhhdmUgc2V2ZXJhbCBvdGhlciBvcHRpb25zIHRoYXQgZG9uJ3QgcmVxdWlyZSB1c2luZyBgRlJJRU5EX1RFU1RgOgorICAqIFdyaXRlIHRoZSB0ZXN0cyBhcyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzOgorYGBgCitjbGFzcyBGb28geworICBmcmllbmQgY2xhc3MgRm9vVGVzdDsKKyAgLi4uCit9OworCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAuLi4KKyAgdm9pZCBUZXN0MSgpIHsuLi59IC8vIFRoaXMgYWNjZXNzZXMgcHJpdmF0ZSBtZW1iZXJzIG9mIGNsYXNzIEZvby4KKyAgdm9pZCBUZXN0MigpIHsuLi59IC8vIFNvIGRvZXMgdGhpcyBvbmUuCit9OworCitURVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKKyAgVGVzdDEoKTsKK30KKworVEVTVF9GKEZvb1Rlc3QsIFRlc3QyKSB7CisgIFRlc3QyKCk7Cit9CitgYGAKKyAgKiBJbiB0aGUgZml4dHVyZSBjbGFzcywgd3JpdGUgYWNjZXNzb3JzIGZvciB0aGUgdGVzdGVkIGNsYXNzJyBwcml2YXRlIG1lbWJlcnMsIHRoZW4gdXNlIHRoZSBhY2Nlc3NvcnMgaW4geW91ciB0ZXN0czoKK2BgYAorY2xhc3MgRm9vIHsKKyAgZnJpZW5kIGNsYXNzIEZvb1Rlc3Q7CisgIC4uLgorfTsKKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLi4uCisgIFQxIGdldF9wcml2YXRlX21lbWJlcjEoRm9vKiBvYmopIHsKKyAgICByZXR1cm4gb2JqLT5wcml2YXRlX21lbWJlcjFfOworICB9Cit9OworCitURVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKKyAgLi4uCisgIGdldF9wcml2YXRlX21lbWJlcjEoeCkKKyAgLi4uCit9CitgYGAKKyAgKiBJZiB0aGUgbWV0aG9kcyBhcmUgZGVjbGFyZWQgKipwcm90ZWN0ZWQqKiwgeW91IGNhbiBjaGFuZ2UgdGhlaXIgYWNjZXNzIGxldmVsIGluIGEgdGVzdC1vbmx5IHN1YmNsYXNzOgorYGBgCitjbGFzcyBZb3VyQ2xhc3MgeworICAuLi4KKyBwcm90ZWN0ZWQ6IC8vIHByb3RlY3RlZCBhY2Nlc3MgZm9yIHRlc3RhYmlsaXR5LgorICBpbnQgRG9Tb21ldGhpbmdSZXR1cm5pbmdJbnQoKTsKKyAgLi4uCit9OworCisvLyBpbiB0aGUgeW91cl9jbGFzc190ZXN0LmNjIGZpbGU6CitjbGFzcyBUZXN0YWJsZVlvdXJDbGFzcyA6IHB1YmxpYyBZb3VyQ2xhc3MgeworICAuLi4KKyBwdWJsaWM6IHVzaW5nIFlvdXJDbGFzczo6RG9Tb21ldGhpbmdSZXR1cm5pbmdJbnQ7IC8vIGNoYW5nZXMgYWNjZXNzIHJpZ2h0cworICAuLi4KK307CisKK1RFU1RfRihZb3VyQ2xhc3NUZXN0LCBEb1NvbWV0aGluZ1Rlc3QpIHsKKyAgVGVzdGFibGVZb3VyQ2xhc3Mgb2JqOworICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfdmFsdWUsIG9iai5Eb1NvbWV0aGluZ1JldHVybmluZ0ludCgpKTsKK30KK2BgYAorCisjIyBIb3cgZG8gSSB0ZXN0IHByaXZhdGUgY2xhc3Mgc3RhdGljIG1lbWJlcnMgd2l0aG91dCB3cml0aW5nIEZSSUVORFxfVEVTVCgpcz8gIyMKKworV2UgZmluZCBwcml2YXRlIHN0YXRpYyBtZXRob2RzIGNsdXR0ZXIgdGhlIGhlYWRlciBmaWxlLiAgVGhleSBhcmUKK2ltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGlkZWFsbHkgc2hvdWxkIGJlIGtlcHQgb3V0IG9mIGEgLmguIFNvIG9mdGVuIEkgbWFrZQordGhlbSBmcmVlIGZ1bmN0aW9ucyBpbnN0ZWFkLgorCitJbnN0ZWFkIG9mOgorYGBgCisvLyBmb28uaAorY2xhc3MgRm9vIHsKKyAgLi4uCisgcHJpdmF0ZToKKyAgc3RhdGljIGJvb2wgRnVuYyhpbnQgbik7Cit9OworCisvLyBmb28uY2MKK2Jvb2wgRm9vOjpGdW5jKGludCBuKSB7IC4uLiB9CisKKy8vIGZvb190ZXN0LmNjCitFWFBFQ1RfVFJVRShGb286OkZ1bmMoMTIzNDUpKTsKK2BgYAorCitZb3UgcHJvYmFibHkgc2hvdWxkIGJldHRlciB3cml0ZToKK2BgYAorLy8gZm9vLmgKK2NsYXNzIEZvbyB7CisgIC4uLgorfTsKKworLy8gZm9vLmNjCituYW1lc3BhY2UgaW50ZXJuYWwgeworICBib29sIEZ1bmMoaW50IG4pIHsgLi4uIH0KK30KKworLy8gZm9vX3Rlc3QuY2MKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIGJvb2wgRnVuYyhpbnQgbik7Cit9CisKK0VYUEVDVF9UUlVFKGludGVybmFsOjpGdW5jKDEyMzQ1KSk7CitgYGAKKworIyMgSSB3b3VsZCBsaWtlIHRvIHJ1biBhIHRlc3Qgc2V2ZXJhbCB0aW1lcyB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLiBEbyBJIG5lZWQgdG8gd3JpdGUgc2V2ZXJhbCBzaW1pbGFyIGNvcGllcyBvZiBpdD8gIyMKKworTm8uIFlvdSBjYW4gdXNlIGEgZmVhdHVyZSBjYWxsZWQgW3ZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHNdKFYxXzVfQWR2YW5jZWRHdWlkZSNWYWx1ZV9QYXJhbWV0ZXJpemVkX1Rlc3RzLm1kKSB3aGljaAorbGV0cyB5b3UgcmVwZWF0IHlvdXIgdGVzdHMgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycywgd2l0aG91dCBkZWZpbmluZyBpdCBtb3JlIHRoYW4gb25jZS4KKworIyMgSG93IGRvIEkgdGVzdCBhIGZpbGUgdGhhdCBkZWZpbmVzIG1haW4oKT8gIyMKKworVG8gdGVzdCBhIGBmb28uY2NgIGZpbGUsIHlvdSBuZWVkIHRvIGNvbXBpbGUgYW5kIGxpbmsgaXQgaW50byB5b3VyIHVuaXQgdGVzdAorcHJvZ3JhbS4gSG93ZXZlciwgd2hlbiB0aGUgZmlsZSBjb250YWlucyBhIGRlZmluaXRpb24gZm9yIHRoZSBgbWFpbigpYAorZnVuY3Rpb24sIGl0IHdpbGwgY2xhc2ggd2l0aCB0aGUgYG1haW4oKWAgb2YgeW91ciB1bml0IHRlc3QsIGFuZCB3aWxsIHJlc3VsdCBpbgorYSBidWlsZCBlcnJvci4KKworVGhlIHJpZ2h0IHNvbHV0aW9uIGlzIHRvIHNwbGl0IGl0IGludG8gdGhyZWUgZmlsZXM6CisgIDEuIGBmb28uaGAgd2hpY2ggY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucywKKyAgMS4gYGZvby5jY2Agd2hpY2ggY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGV4Y2VwdCBgbWFpbigpYCwgYW5kCisgIDEuIGBmb29fbWFpbi5jY2Agd2hpY2ggY29udGFpbnMgbm90aGluZyBidXQgdGhlIGRlZmluaXRpb24gb2YgYG1haW4oKWAuCisKK1RoZW4gYGZvby5jY2AgY2FuIGJlIGVhc2lseSB0ZXN0ZWQuCisKK0lmIHlvdSBhcmUgYWRkaW5nIHRlc3RzIHRvIGFuIGV4aXN0aW5nIGZpbGUgYW5kIGRvbid0IHdhbnQgYW4gaW50cnVzaXZlIGNoYW5nZQorbGlrZSB0aGlzLCB0aGVyZSBpcyBhIGhhY2s6IGp1c3QgaW5jbHVkZSB0aGUgZW50aXJlIGBmb28uY2NgIGZpbGUgaW4geW91ciB1bml0Cit0ZXN0LiBGb3IgZXhhbXBsZToKK2BgYAorLy8gRmlsZSBmb29fdW5pdHRlc3QuY2MKKworLy8gVGhlIGhlYWRlcnMgc2VjdGlvbgorLi4uCisKKy8vIFJlbmFtZXMgbWFpbigpIGluIGZvby5jYyB0byBtYWtlIHJvb20gZm9yIHRoZSB1bml0IHRlc3QgbWFpbigpCisjZGVmaW5lIG1haW4gRm9vTWFpbgorCisjaW5jbHVkZSAiYS9iL2Zvby5jYyIKKworLy8gVGhlIHRlc3RzIHN0YXJ0IGhlcmUuCisuLi4KK2BgYAorCisKK0hvd2V2ZXIsIHBsZWFzZSByZW1lbWJlciB0aGlzIGlzIGEgaGFjayBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyB0aGUgbGFzdAorcmVzb3J0LgorCisjIyBXaGF0IGNhbiB0aGUgc3RhdGVtZW50IGFyZ3VtZW50IGluIEFTU0VSVFxfREVBVEgoKSBiZT8gIyMKKworYEFTU0VSVF9ERUFUSChfc3RhdGVtZW50XywgX3JlZ2V4XylgIChvciBhbnkgZGVhdGggYXNzZXJ0aW9uIG1hY3JvKSBjYW4gYmUgdXNlZAord2hlcmV2ZXIgYF9zdGF0ZW1lbnRfYCBpcyB2YWxpZC4gU28gYmFzaWNhbGx5IGBfc3RhdGVtZW50X2AgY2FuIGJlIGFueSBDKysKK3N0YXRlbWVudCB0aGF0IG1ha2VzIHNlbnNlIGluIHRoZSBjdXJyZW50IGNvbnRleHQuIEluIHBhcnRpY3VsYXIsIGl0IGNhbgorcmVmZXJlbmNlIGdsb2JhbCBhbmQvb3IgbG9jYWwgdmFyaWFibGVzLCBhbmQgY2FuIGJlOgorICAqIGEgc2ltcGxlIGZ1bmN0aW9uIGNhbGwgKG9mdGVuIHRoZSBjYXNlKSwKKyAgKiBhIGNvbXBsZXggZXhwcmVzc2lvbiwgb3IKKyAgKiBhIGNvbXBvdW5kIHN0YXRlbWVudC4KKworPiBTb21lIGV4YW1wbGVzIGFyZSBzaG93biBoZXJlOgorYGBgCisvLyBBIGRlYXRoIHRlc3QgY2FuIGJlIGEgc2ltcGxlIGZ1bmN0aW9uIGNhbGwuCitURVNUKE15RGVhdGhUZXN0LCBGdW5jdGlvbkNhbGwpIHsKKyAgQVNTRVJUX0RFQVRIKFh5eig1KSwgIlh5eiBmYWlsZWQiKTsKK30KKworLy8gT3IgYSBjb21wbGV4IGV4cHJlc3Npb24gdGhhdCByZWZlcmVuY2VzIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLgorVEVTVChNeURlYXRoVGVzdCwgQ29tcGxleEV4cHJlc3Npb24pIHsKKyAgY29uc3QgYm9vbCBjID0gQ29uZGl0aW9uKCk7CisgIEFTU0VSVF9ERUFUSCgoYyA/IEZ1bmMxKDApIDogb2JqZWN0Mi5NZXRob2QoInRlc3QiKSksCisgICAgICAgICAgICAgICAiKEZ1bmMxfE1ldGhvZCkgZmFpbGVkIik7Cit9CisKKy8vIERlYXRoIGFzc2VydGlvbnMgY2FuIGJlIHVzZWQgYW55IHdoZXJlIGluIGEgZnVuY3Rpb24uIEluCisvLyBwYXJ0aWN1bGFyLCB0aGV5IGNhbiBiZSBpbnNpZGUgYSBsb29wLgorVEVTVChNeURlYXRoVGVzdCwgSW5zaWRlTG9vcCkgeworICAvLyBWZXJpZmllcyB0aGF0IEZvbygwKSwgRm9vKDEpLCAuLi4sIGFuZCBGb28oNCkgYWxsIGRpZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBFWFBFQ1RfREVBVEhfTShGb28oaSksICJGb28gaGFzIFxcZCsgZXJyb3JzIiwKKyAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAid2hlcmUgaSBpcyAiIDw8IGkpOworICB9Cit9CisKKy8vIEEgZGVhdGggYXNzZXJ0aW9uIGNhbiBjb250YWluIGEgY29tcG91bmQgc3RhdGVtZW50LgorVEVTVChNeURlYXRoVGVzdCwgQ29tcG91bmRTdGF0ZW1lbnQpIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCBhdCBsZWFzZSBvbmUgb2YgQmFyKDApLCBCYXIoMSksIC4uLiwgYW5kCisgIC8vIEJhcig0KSBkaWVzLgorICBBU1NFUlRfREVBVEgoeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICBCYXIoaSk7CisgICAgfQorICB9LAorICAiQmFyIGhhcyBcXGQrIGVycm9ycyIpO30KK2BgYAorCitgZ29vZ2xldGVzdF91bml0dGVzdC5jY2AgY29udGFpbnMgbW9yZSBleGFtcGxlcyBpZiB5b3UgYXJlIGludGVyZXN0ZWQuCisKKyMjIFdoYXQgc3ludGF4IGRvZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBBU1NFUlRcX0RFQVRIIHVzZT8gIyMKKworT24gUE9TSVggc3lzdGVtcywgR29vZ2xlIFRlc3QgdXNlcyB0aGUgUE9TSVggRXh0ZW5kZWQgcmVndWxhcgorZXhwcmVzc2lvbiBzeW50YXgKKyhodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JlZ3VsYXJfZXhwcmVzc2lvbiNQT1NJWF9FeHRlbmRlZF9SZWd1bGFyX0V4cHJlc3Npb25zKS4gT24KK1dpbmRvd3MsIGl0IHVzZXMgYSBsaW1pdGVkIHZhcmlhbnQgb2YgcmVndWxhciBleHByZXNzaW9uIHN5bnRheC4gRm9yCittb3JlIGRldGFpbHMsIHNlZSB0aGUgW3JlZ3VsYXIgZXhwcmVzc2lvbiBzeW50YXhdKFYxXzVfQWR2YW5jZWRHdWlkZSNSZWd1bGFyX0V4cHJlc3Npb25fU3ludGF4Lm1kKS4KKworIyMgSSBoYXZlIGEgZml4dHVyZSBjbGFzcyBGb28sIGJ1dCBURVNUXF9GKEZvbywgQmFyKSBnaXZlcyBtZSBlcnJvciAibm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGNhbGwgdG8gRm9vOjpGb28oKSIuIFdoeT8gIyMKKworR29vZ2xlIFRlc3QgbmVlZHMgdG8gYmUgYWJsZSB0byBjcmVhdGUgb2JqZWN0cyBvZiB5b3VyIHRlc3QgZml4dHVyZSBjbGFzcywgc28KK2l0IG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuIE5vcm1hbGx5IHRoZSBjb21waWxlciB3aWxsIGRlZmluZSBvbmUgZm9yCit5b3UuIEhvd2V2ZXIsIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB5b3UgaGF2ZSB0byBkZWZpbmUgeW91ciBvd246CisgICogSWYgeW91IGV4cGxpY2l0bHkgZGVjbGFyZSBhIG5vbi1kZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBjbGFzcyBgRm9vYCwgdGhlbiB5b3UgbmVlZCB0byBkZWZpbmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBldmVuIGlmIGl0IHdvdWxkIGJlIGVtcHR5LgorICAqIElmIGBGb29gIGhhcyBhIGNvbnN0IG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIsIHRoZW4geW91IGhhdmUgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIF9hbmRfIGluaXRpYWxpemUgdGhlIGNvbnN0IG1lbWJlciBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiB0aGUgY29uc3RydWN0b3IuIChFYXJseSB2ZXJzaW9ucyBvZiBgZ2NjYCBkb2Vzbid0IGZvcmNlIHlvdSB0byBpbml0aWFsaXplIHRoZSBjb25zdCBtZW1iZXIuIEl0J3MgYSBidWcgdGhhdCBoYXMgYmVlbiBmaXhlZCBpbiBgZ2NjIDRgLikKKworIyMgV2h5IGRvZXMgQVNTRVJUXF9ERUFUSCBjb21wbGFpbiBhYm91dCBwcmV2aW91cyB0aHJlYWRzIHRoYXQgd2VyZSBhbHJlYWR5IGpvaW5lZD8gIyMKKworV2l0aCB0aGUgTGludXggcHRocmVhZCBsaWJyYXJ5LCB0aGVyZSBpcyBubyB0dXJuaW5nIGJhY2sgb25jZSB5b3UgY3Jvc3MgdGhlCitsaW5lIGZyb20gc2luZ2xlIHRocmVhZCB0byBtdWx0aXBsZSB0aHJlYWRzLiBUaGUgZmlyc3QgdGltZSB5b3UgY3JlYXRlIGEKK3RocmVhZCwgYSBtYW5hZ2VyIHRocmVhZCBpcyBjcmVhdGVkIGluIGFkZGl0aW9uLCBzbyB5b3UgZ2V0IDMsIG5vdCAyLCB0aHJlYWRzLgorTGF0ZXIgd2hlbiB0aGUgdGhyZWFkIHlvdSBjcmVhdGUgam9pbnMgdGhlIG1haW4gdGhyZWFkLCB0aGUgdGhyZWFkIGNvdW50CitkZWNyZW1lbnRzIGJ5IDEsIGJ1dCB0aGUgbWFuYWdlciB0aHJlYWQgd2lsbCBuZXZlciBiZSBraWxsZWQsIHNvIHlvdSBzdGlsbCBoYXZlCisyIHRocmVhZHMsIHdoaWNoIG1lYW5zIHlvdSBjYW5ub3Qgc2FmZWx5IHJ1biBhIGRlYXRoIHRlc3QuCisKK1RoZSBuZXcgTlBUTCB0aHJlYWQgbGlicmFyeSBkb2Vzbid0IHN1ZmZlciBmcm9tIHRoaXMgcHJvYmxlbSwgYXMgaXQgZG9lc24ndAorY3JlYXRlIGEgbWFuYWdlciB0aHJlYWQuIEhvd2V2ZXIsIGlmIHlvdSBkb24ndCBjb250cm9sIHdoaWNoIG1hY2hpbmUgeW91ciB0ZXN0CitydW5zIG9uLCB5b3Ugc2hvdWxkbid0IGRlcGVuZCBvbiB0aGlzLgorCisjIyBXaHkgZG9lcyBHb29nbGUgVGVzdCByZXF1aXJlIHRoZSBlbnRpcmUgdGVzdCBjYXNlLCBpbnN0ZWFkIG9mIGluZGl2aWR1YWwgdGVzdHMsIHRvIGJlIG5hbWVkIEZPT0RlYXRoVGVzdCB3aGVuIGl0IHVzZXMgQVNTRVJUXF9ERUFUSD8gIyMKKworR29vZ2xlIFRlc3QgZG9lcyBub3QgaW50ZXJsZWF2ZSB0ZXN0cyBmcm9tIGRpZmZlcmVudCB0ZXN0IGNhc2VzLiBUaGF0IGlzLCBpdAorcnVucyBhbGwgdGVzdHMgaW4gb25lIHRlc3QgY2FzZSBmaXJzdCwgYW5kIHRoZW4gcnVucyBhbGwgdGVzdHMgaW4gdGhlIG5leHQgdGVzdAorY2FzZSwgYW5kIHNvIG9uLiBHb29nbGUgVGVzdCBkb2VzIHRoaXMgYmVjYXVzZSBpdCBuZWVkcyB0byBzZXQgdXAgYSB0ZXN0IGNhc2UKK2JlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiBpdCBpcyBydW4sIGFuZCB0ZWFyIGl0IGRvd24gYWZ0ZXJ3b3Jkcy4gU3BsaXR0aW5nIHVwCit0aGUgdGVzdCBjYXNlIHdvdWxkIHJlcXVpcmUgbXVsdGlwbGUgc2V0LXVwIGFuZCB0ZWFyLWRvd24gcHJvY2Vzc2VzLCB3aGljaCBpcworaW5lZmZpY2llbnQgYW5kIG1ha2VzIHRoZSBzZW1hbnRpY3MgdW5jbGVhbi4KKworSWYgd2Ugd2VyZSB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIHRlc3RzIGJhc2VkIG9uIHRlc3QgbmFtZSBpbnN0ZWFkIG9mIHRlc3QKK2Nhc2UgbmFtZSwgdGhlbiB3ZSB3b3VsZCBoYXZlIGEgcHJvYmxlbSB3aXRoIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uOgorCitgYGAKK1RFU1RfRihGb29UZXN0LCBBYmNEZWF0aFRlc3QpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBVdncpIHsgLi4uIH0KKworVEVTVF9GKEJhclRlc3QsIERlZkRlYXRoVGVzdCkgeyAuLi4gfQorVEVTVF9GKEJhclRlc3QsIFh5eikgeyAuLi4gfQorYGBgCisKK1NpbmNlIGBGb29UZXN0LkFiY0RlYXRoVGVzdGAgbmVlZHMgdG8gcnVuIGJlZm9yZSBgQmFyVGVzdC5YeXpgLCBhbmQgd2UgZG9uJ3QKK2ludGVybGVhdmUgdGVzdHMgZnJvbSBkaWZmZXJlbnQgdGVzdCBjYXNlcywgd2UgbmVlZCB0byBydW4gYWxsIHRlc3RzIGluIHRoZQorYEZvb1Rlc3RgIGNhc2UgYmVmb3JlIHJ1bm5pbmcgYW55IHRlc3QgaW4gdGhlIGBCYXJUZXN0YCBjYXNlLiBUaGlzIGNvbnRyYWRpY3RzCit3aXRoIHRoZSByZXF1aXJlbWVudCB0byBydW4gYEJhclRlc3QuRGVmRGVhdGhUZXN0YCBiZWZvcmUgYEZvb1Rlc3QuVXZ3YC4KKworIyMgQnV0IEkgZG9uJ3QgbGlrZSBjYWxsaW5nIG15IGVudGlyZSB0ZXN0IGNhc2UgRk9PRGVhdGhUZXN0IHdoZW4gaXQgY29udGFpbnMgYm90aCBkZWF0aCB0ZXN0cyBhbmQgbm9uLWRlYXRoIHRlc3RzLiBXaGF0IGRvIEkgZG8/ICMjCisKK1lvdSBkb24ndCBoYXZlIHRvLCBidXQgaWYgeW91IGxpa2UsIHlvdSBtYXkgc3BsaXQgdXAgdGhlIHRlc3QgY2FzZSBpbnRvCitgRm9vVGVzdGAgYW5kIGBGb29EZWF0aFRlc3RgLCB3aGVyZSB0aGUgbmFtZXMgbWFrZSBpdCBjbGVhciB0aGF0IHRoZXkgYXJlCityZWxhdGVkOgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsgLi4uIH07CisKK1RFU1RfRihGb29UZXN0LCBBYmMpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBEZWYpIHsgLi4uIH0KKwordHlwZWRlZiBGb29UZXN0IEZvb0RlYXRoVGVzdDsKKworVEVTVF9GKEZvb0RlYXRoVGVzdCwgVXZ3KSB7IC4uLiBFWFBFQ1RfREVBVEgoLi4uKSAuLi4gfQorVEVTVF9GKEZvb0RlYXRoVGVzdCwgWHl6KSB7IC4uLiBBU1NFUlRfREVBVEgoLi4uKSAuLi4gfQorYGBgCisKKyMjIFRoZSBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgIm5vIG1hdGNoIGZvciAnb3BlcmF0b3I8PCciIHdoZW4gSSB1c2UgYW4gYXNzZXJ0aW9uLiBXaGF0IGdpdmVzPyAjIworCitJZiB5b3UgdXNlIGEgdXNlci1kZWZpbmVkIHR5cGUgYEZvb1R5cGVgIGluIGFuIGFzc2VydGlvbiwgeW91IG11c3QgbWFrZSBzdXJlCit0aGVyZSBpcyBhbiBgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IEZvb1R5cGUmKWAgZnVuY3Rpb24KK2RlZmluZWQgc3VjaCB0aGF0IHdlIGNhbiBwcmludCBhIHZhbHVlIG9mIGBGb29UeXBlYC4KKworSW4gYWRkaXRpb24sIGlmIGBGb29UeXBlYCBpcyBkZWNsYXJlZCBpbiBhIG5hbWUgc3BhY2UsIHRoZSBgPDxgIG9wZXJhdG9yIGFsc28KK25lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIF9zYW1lXyBuYW1lIHNwYWNlLgorCisjIyBIb3cgZG8gSSBzdXBwcmVzcyB0aGUgbWVtb3J5IGxlYWsgbWVzc2FnZXMgb24gV2luZG93cz8gIyMKKworU2luY2UgdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgR29vZ2xlIFRlc3Qgc2luZ2xldG9uIHJlcXVpcmVzIGFsbG9jYXRpb25zIG9uCit0aGUgaGVhcCwgdGhlIFZpc3VhbCBDKysgbWVtb3J5IGxlYWsgZGV0ZWN0b3Igd2lsbCByZXBvcnQgbWVtb3J5IGxlYWtzIGF0IHRoZQorZW5kIG9mIHRoZSBwcm9ncmFtIHJ1bi4gVGhlIGVhc2llc3Qgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gdXNlIHRoZQorYF9DcnRNZW1DaGVja3BvaW50YCBhbmQgYF9DcnRNZW1EdW1wQWxsT2JqZWN0c1NpbmNlYCBjYWxscyB0byBub3QgcmVwb3J0IGFueQorc3RhdGljYWxseSBpbml0aWFsaXplZCBoZWFwIG9iamVjdHMuIFNlZSBNU0ROIGZvciBtb3JlIGRldGFpbHMgYW5kIGFkZGl0aW9uYWwKK2hlYXAgY2hlY2svZGVidWcgcm91dGluZXMuCisKKyMjIEkgYW0gYnVpbGRpbmcgbXkgcHJvamVjdCB3aXRoIEdvb2dsZSBUZXN0IGluIFZpc3VhbCBTdHVkaW8gYW5kIGFsbCBJJ20gZ2V0dGluZyBpcyBhIGJ1bmNoIG9mIGxpbmtlciBlcnJvcnMgKG9yIHdhcm5pbmdzKS4gSGVscCEgIyMKKworWW91IG1heSBnZXQgYSBudW1iZXIgb2YgdGhlIGZvbGxvd2luZyBsaW5rZXIgZXJyb3Igb3Igd2FybmluZ3MgaWYgeW91CithdHRlbXB0IHRvIGxpbmsgeW91ciB0ZXN0IHByb2plY3Qgd2l0aCB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSB3aGVuCit5b3VyIHByb2plY3QgYW5kIHRoZSBhcmUgbm90IGJ1aWx0IHVzaW5nIHRoZSBzYW1lIGNvbXBpbGVyIHNldHRpbmdzLgorCisgICogTE5LMjAwNTogc3ltYm9sIGFscmVhZHkgZGVmaW5lZCBpbiBvYmplY3QKKyAgKiBMTks0MjE3OiBsb2NhbGx5IGRlZmluZWQgc3ltYm9sICdzeW1ib2wnIGltcG9ydGVkIGluIGZ1bmN0aW9uICdmdW5jdGlvbicKKyAgKiBMTks0MDQ5OiBsb2NhbGx5IGRlZmluZWQgc3ltYm9sICdzeW1ib2wnIGltcG9ydGVkCisKK1RoZSBHb29nbGUgVGVzdCBwcm9qZWN0IChndGVzdC52Y3Byb2opIGhhcyB0aGUgUnVudGltZSBMaWJyYXJ5IG9wdGlvbgorc2V0IHRvIC9NVCAodXNlIG11bHRpLXRocmVhZGVkIHN0YXRpYyBsaWJyYXJpZXMsIC9NVGQgZm9yIGRlYnVnKS4gSWYKK3lvdXIgcHJvamVjdCB1c2VzIHNvbWV0aGluZyBlbHNlLCBmb3IgZXhhbXBsZSAvTUQgKHVzZSBtdWx0aS10aHJlYWRlZAorRExMcywgL01EZCBmb3IgZGVidWcpLCB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIHNldHRpbmcgaW4gdGhlIEdvb2dsZQorVGVzdCBwcm9qZWN0IHRvIG1hdGNoIHlvdXIgcHJvamVjdCdzLgorCitUbyB1cGRhdGUgdGhpcyBzZXR0aW5nIG9wZW4gdGhlIHByb2plY3QgcHJvcGVydGllcyBpbiB0aGUgVmlzdWFsCitTdHVkaW8gSURFIHRoZW4gc2VsZWN0IHRoZSBicmFuY2ggQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIHwgQy9DKysgfAorQ29kZSBHZW5lcmF0aW9uIGFuZCBjaGFuZ2UgdGhlIG9wdGlvbiAiUnVudGltZSBMaWJyYXJ5Ii4gIFlvdSBtYXkgYWxzbyB0cnkKK3VzaW5nIGd0ZXN0LW1kLnZjcHJvaiBpbnN0ZWFkIG9mIGd0ZXN0LnZjcHJvai4KKworIyMgSSBwdXQgbXkgdGVzdHMgaW4gYSBsaWJyYXJ5IGFuZCBHb29nbGUgVGVzdCBkb2Vzbid0IHJ1biB0aGVtLiBXaGF0J3MgaGFwcGVuaW5nPyAjIworSGF2ZSB5b3UgcmVhZCBhCitbd2FybmluZ10oVjFfNV9QcmltZXIjSW1wb3J0YW50X25vdGVfZm9yX1Zpc3VhbF9DKytfdXNlcnMubWQpIG9uCit0aGUgR29vZ2xlIFRlc3QgUHJpbWVyIHBhZ2U/CisKKyMjIEkgd2FudCB0byB1c2UgR29vZ2xlIFRlc3Qgd2l0aCBWaXN1YWwgU3R1ZGlvIGJ1dCBkb24ndCBrbm93IHdoZXJlIHRvIHN0YXJ0LiAjIworTWFueSBwZW9wbGUgYXJlIGluIHlvdXIgcG9zaXRpb24gYW5kIG9uZSBvZiB0aGUgcG9zdGVkIGhpcyBzb2x1dGlvbiB0bworb3VyIG1haWxpbmcgbGlzdC4gSGVyZSBpcyBoaXMgbGluazoKK2h0dHA6Ly9oYXNzYW5qYW1pbGFobWFkLmJsb2dzcG90LmNvbS8yMDA5LzA3L2d0ZXN0LXN0YXJ0ZXJzLWhlbHAuaHRtbC4KKworIyMgTXkgcXVlc3Rpb24gaXMgbm90IGNvdmVyZWQgaW4geW91ciBGQVEhICMjCisKK0lmIHlvdSBjYW5ub3QgZmluZCB0aGUgYW5zd2VyIHRvIHlvdXIgcXVlc3Rpb24gaW4gdGhpcyBGQVEsIHRoZXJlIGFyZQorc29tZSBvdGhlciByZXNvdXJjZXMgeW91IGNhbiB1c2U6CisKKyAgMS4gcmVhZCBvdGhlciBbd2lraSBwYWdlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvdy9saXN0KSwKKyAgMS4gc2VhcmNoIHRoZSBtYWlsaW5nIGxpc3QgW2FyY2hpdmVdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGV0ZXN0ZnJhbWV3b3JrL3RvcGljcyksCisgIDEuIGFzayBpdCBvbiBbZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tXShtYWlsdG86Z29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tKSBhbmQgc29tZW9uZSB3aWxsIGFuc3dlciBpdCAodG8gcHJldmVudCBzcGFtLCB3ZSByZXF1aXJlIHlvdSB0byBqb2luIHRoZSBbZGlzY3Vzc2lvbiBncm91cF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZXRlc3RmcmFtZXdvcmspIGJlZm9yZSB5b3UgY2FuIHBvc3QuKS4KKworUGxlYXNlIG5vdGUgdGhhdCBjcmVhdGluZyBhbiBpc3N1ZSBpbiB0aGUKK1tpc3N1ZSB0cmFja2VyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9pc3N1ZXMvbGlzdCkgaXMgX25vdF8KK2EgZ29vZCB3YXkgdG8gZ2V0IHlvdXIgYW5zd2VyLCBhcyBpdCBpcyBtb25pdG9yZWQgaW5mcmVxdWVudGx5IGJ5IGEKK3Zlcnkgc21hbGwgbnVtYmVyIG9mIHBlb3BsZS4KKworV2hlbiBhc2tpbmcgYSBxdWVzdGlvbiwgaXQncyBoZWxwZnVsIHRvIHByb3ZpZGUgYXMgbXVjaCBvZiB0aGUKK2ZvbGxvd2luZyBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSAocGVvcGxlIGNhbm5vdCBoZWxwIHlvdSBpZiB0aGVyZSdzCitub3QgZW5vdWdoIGluZm9ybWF0aW9uIGluIHlvdXIgcXVlc3Rpb24pOgorCisgICogdGhlIHZlcnNpb24gKG9yIHRoZSByZXZpc2lvbiBudW1iZXIgaWYgeW91IGNoZWNrIG91dCBmcm9tIFNWTiBkaXJlY3RseSkgb2YgR29vZ2xlIFRlc3QgeW91IHVzZSAoR29vZ2xlIFRlc3QgaXMgdW5kZXIgYWN0aXZlIGRldmVsb3BtZW50LCBzbyBpdCdzIHBvc3NpYmxlIHRoYXQgeW91ciBwcm9ibGVtIGhhcyBiZWVuIHNvbHZlZCBpbiBhIGxhdGVyIHZlcnNpb24pLAorICAqIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwKKyAgKiB0aGUgbmFtZSBhbmQgdmVyc2lvbiBvZiB5b3VyIGNvbXBpbGVyLAorICAqIHRoZSBjb21wbGV0ZSBjb21tYW5kIGxpbmUgZmxhZ3MgeW91IGdpdmUgdG8geW91ciBjb21waWxlciwKKyAgKiB0aGUgY29tcGxldGUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgKGlmIHRoZSBxdWVzdGlvbiBpcyBhYm91dCBjb21waWxhdGlvbiksCisgICogdGhlIF9hY3R1YWxfIGNvZGUgKGlkZWFsbHksIGEgbWluaW1hbCBidXQgY29tcGxldGUgcHJvZ3JhbSkgdGhhdCBoYXMgdGhlIHByb2JsZW0geW91IGVuY291bnRlci7vnIEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV81X1ByaW1lci5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzVfUHJpbWVyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDJlMGIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV81X1ByaW1lci5tZApAQCAtMCwwICsxLDQ5NyBAQAorCisKKyMgSW50cm9kdWN0aW9uOiBXaHkgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaz8gIworCitfR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29ya18gaGVscHMgeW91IHdyaXRlIGJldHRlciBDKysgdGVzdHMuCisKK05vIG1hdHRlciB3aGV0aGVyIHlvdSB3b3JrIG9uIExpbnV4LCBXaW5kb3dzLCBvciBhIE1hYywgaWYgeW91IHdyaXRlIEMrKyBjb2RlLAorR29vZ2xlIFRlc3QgY2FuIGhlbHAgeW91LgorCitTbyB3aGF0IG1ha2VzIGEgZ29vZCB0ZXN0LCBhbmQgaG93IGRvZXMgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBmaXQgaW4/IFdlIGJlbGlldmU6CisgIDEuIFRlc3RzIHNob3VsZCBiZSBfaW5kZXBlbmRlbnRfIGFuZCBfcmVwZWF0YWJsZV8uIEl0J3MgYSBwYWluIHRvIGRlYnVnIGEgdGVzdCB0aGF0IHN1Y2NlZWRzIG9yIGZhaWxzIGFzIGEgcmVzdWx0IG9mIG90aGVyIHRlc3RzLiAgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBpc29sYXRlcyB0aGUgdGVzdHMgYnkgcnVubmluZyBlYWNoIG9mIHRoZW0gb24gYSBkaWZmZXJlbnQgb2JqZWN0LiBXaGVuIGEgdGVzdCBmYWlscywgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBhbGxvd3MgeW91IHRvIHJ1biBpdCBpbiBpc29sYXRpb24gZm9yIHF1aWNrIGRlYnVnZ2luZy4KKyAgMS4gVGVzdHMgc2hvdWxkIGJlIHdlbGwgX29yZ2FuaXplZF8gYW5kIHJlZmxlY3QgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdGVzdGVkIGNvZGUuICBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGdyb3VwcyByZWxhdGVkIHRlc3RzIGludG8gdGVzdCBjYXNlcyB0aGF0IGNhbiBzaGFyZSBkYXRhIGFuZCBzdWJyb3V0aW5lcy4gVGhpcyBjb21tb24gcGF0dGVybiBpcyBlYXN5IHRvIHJlY29nbml6ZSBhbmQgbWFrZXMgdGVzdHMgZWFzeSB0byBtYWludGFpbi4gU3VjaCBjb25zaXN0ZW5jeSBpcyBlc3BlY2lhbGx5IGhlbHBmdWwgd2hlbiBwZW9wbGUgc3dpdGNoIHByb2plY3RzIGFuZCBzdGFydCB0byB3b3JrIG9uIGEgbmV3IGNvZGUgYmFzZS4KKyAgMS4gVGVzdHMgc2hvdWxkIGJlIF9wb3J0YWJsZV8gYW5kIF9yZXVzYWJsZV8uIFRoZSBvcGVuLXNvdXJjZSBjb21tdW5pdHkgaGFzIGEgbG90IG9mIGNvZGUgdGhhdCBpcyBwbGF0Zm9ybS1uZXV0cmFsLCBpdHMgdGVzdHMgc2hvdWxkIGFsc28gYmUgcGxhdGZvcm0tbmV1dHJhbC4gIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgd29ya3Mgb24gZGlmZmVyZW50IE9TZXMsIHdpdGggZGlmZmVyZW50IGNvbXBpbGVycyAoZ2NjLCBNU1ZDLCBhbmQgb3RoZXJzKSwgd2l0aCBvciB3aXRob3V0IGV4Y2VwdGlvbnMsIHNvIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgdGVzdHMgY2FuIGVhc2lseSB3b3JrIHdpdGggYSB2YXJpZXR5IG9mIGNvbmZpZ3VyYXRpb25zLiAgKE5vdGUgdGhhdCB0aGUgY3VycmVudCByZWxlYXNlIG9ubHkgY29udGFpbnMgYnVpbGQgc2NyaXB0cyBmb3IgTGludXggLSB3ZSBhcmUgYWN0aXZlbHkgd29ya2luZyBvbiBzY3JpcHRzIGZvciBvdGhlciBwbGF0Zm9ybXMuKQorICAxLiBXaGVuIHRlc3RzIGZhaWwsIHRoZXkgc2hvdWxkIHByb3ZpZGUgYXMgbXVjaCBfaW5mb3JtYXRpb25fIGFib3V0IHRoZSBwcm9ibGVtIGFzIHBvc3NpYmxlLiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGRvZXNuJ3Qgc3RvcCBhdCB0aGUgZmlyc3QgdGVzdCBmYWlsdXJlLiBJbnN0ZWFkLCBpdCBvbmx5IHN0b3BzIHRoZSBjdXJyZW50IHRlc3QgYW5kIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0LiBZb3UgY2FuIGFsc28gc2V0IHVwIHRlc3RzIHRoYXQgcmVwb3J0IG5vbi1mYXRhbCBmYWlsdXJlcyBhZnRlciB3aGljaCB0aGUgY3VycmVudCB0ZXN0IGNvbnRpbnVlcy4gVGh1cywgeW91IGNhbiBkZXRlY3QgYW5kIGZpeCBtdWx0aXBsZSBidWdzIGluIGEgc2luZ2xlIHJ1bi1lZGl0LWNvbXBpbGUgY3ljbGUuCisgIDEuIFRoZSB0ZXN0aW5nIGZyYW1ld29yayBzaG91bGQgbGliZXJhdGUgdGVzdCB3cml0ZXJzIGZyb20gaG91c2VrZWVwaW5nIGNob3JlcyBhbmQgbGV0IHRoZW0gZm9jdXMgb24gdGhlIHRlc3QgX2NvbnRlbnRfLiAgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBhdXRvbWF0aWNhbGx5IGtlZXBzIHRyYWNrIG9mIGFsbCB0ZXN0cyBkZWZpbmVkLCBhbmQgZG9lc24ndCByZXF1aXJlIHRoZSB1c2VyIHRvIGVudW1lcmF0ZSB0aGVtIGluIG9yZGVyIHRvIHJ1biB0aGVtLgorICAxLiBUZXN0cyBzaG91bGQgYmUgX2Zhc3RfLiBXaXRoIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmssIHlvdSBjYW4gcmV1c2Ugc2hhcmVkIHJlc291cmNlcyBhY3Jvc3MgdGVzdHMgYW5kIHBheSBmb3IgdGhlIHNldC11cC90ZWFyLWRvd24gb25seSBvbmNlLCB3aXRob3V0IG1ha2luZyB0ZXN0cyBkZXBlbmQgb24gZWFjaCBvdGhlci4KKworU2luY2UgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBpcyBiYXNlZCBvbiB0aGUgcG9wdWxhciB4VW5pdAorYXJjaGl0ZWN0dXJlLCB5b3UnbGwgZmVlbCByaWdodCBhdCBob21lIGlmIHlvdSd2ZSB1c2VkIEpVbml0IG9yIFB5VW5pdCBiZWZvcmUuCitJZiBub3QsIGl0IHdpbGwgdGFrZSB5b3UgYWJvdXQgMTAgbWludXRlcyB0byBsZWFybiB0aGUgYmFzaWNzIGFuZCBnZXQgc3RhcnRlZC4KK1NvIGxldCdzIGdvIQorCitfTm90ZTpfIFdlIHNvbWV0aW1lcyByZWZlciB0byBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGluZm9ybWFsbHkKK2FzIF9Hb29nbGUgVGVzdF8uCisKKyMgU2V0dGluZyB1cCBhIE5ldyBUZXN0IFByb2plY3QgIworCitUbyB3cml0ZSBhIHRlc3QgcHJvZ3JhbSB1c2luZyBHb29nbGUgVGVzdCwgeW91IG5lZWQgdG8gY29tcGlsZSBHb29nbGUKK1Rlc3QgaW50byBhIGxpYnJhcnkgYW5kIGxpbmsgeW91ciB0ZXN0IHdpdGggaXQuICBXZSBwcm92aWRlIGJ1aWxkCitmaWxlcyBmb3Igc29tZSBwb3B1bGFyIGJ1aWxkIHN5c3RlbXMgKGBtc3ZjL2AgZm9yIFZpc3VhbCBTdHVkaW8sCitgeGNvZGUvYCBmb3IgTWFjIFhjb2RlLCBgbWFrZS9gIGZvciBHTlUgbWFrZSwgYGNvZGVnZWFyL2AgZm9yIEJvcmxhbmQKK0MrKyBCdWlsZGVyLCBhbmQgdGhlIGF1dG90b29scyBzY3JpcHQgaW4gdGhlCitHb29nbGUgVGVzdCByb290IGRpcmVjdG9yeSkuICBJZiB5b3VyIGJ1aWxkIHN5c3RlbSBpcyBub3Qgb24gdGhpcworbGlzdCwgeW91IGNhbiB0YWtlIGEgbG9vayBhdCBgbWFrZS9NYWtlZmlsZWAgdG8gbGVhcm4gaG93IEdvb2dsZSBUZXN0CitzaG91bGQgYmUgY29tcGlsZWQgKGJhc2ljYWxseSB5b3Ugd2FudCB0byBjb21waWxlIGBzcmMvZ3Rlc3QtYWxsLmNjYAord2l0aCBgR1RFU1RfUk9PVGAgYW5kIGBHVEVTVF9ST09UL2luY2x1ZGVgIGluIHRoZSBoZWFkZXIgc2VhcmNoIHBhdGgsCit3aGVyZSBgR1RFU1RfUk9PVGAgaXMgdGhlIEdvb2dsZSBUZXN0IHJvb3QgZGlyZWN0b3J5KS4KKworT25jZSB5b3UgYXJlIGFibGUgdG8gY29tcGlsZSB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSwgeW91IHNob3VsZAorY3JlYXRlIGEgcHJvamVjdCBvciBidWlsZCB0YXJnZXQgZm9yIHlvdXIgdGVzdCBwcm9ncmFtLiAgTWFrZSBzdXJlIHlvdQoraGF2ZSBgR1RFU1RfUk9PVC9pbmNsdWRlYCBpbiB0aGUgaGVhZGVyIHNlYXJjaCBwYXRoIHNvIHRoYXQgdGhlCitjb21waWxlciBjYW4gZmluZCBgPGd0ZXN0L2d0ZXN0Lmg+YCB3aGVuIGNvbXBpbGluZyB5b3VyIHRlc3QuICBTZXQgdXAKK3lvdXIgdGVzdCBwcm9qZWN0IHRvIGxpbmsgd2l0aCB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSAoZm9yIGV4YW1wbGUsCitpbiBWaXN1YWwgU3R1ZGlvLCB0aGlzIGlzIGRvbmUgYnkgYWRkaW5nIGEgZGVwZW5kZW5jeSBvbgorYGd0ZXN0LnZjcHJvamApLgorCitJZiB5b3Ugc3RpbGwgaGF2ZSBxdWVzdGlvbnMsIHRha2UgYSBsb29rIGF0IGhvdyBHb29nbGUgVGVzdCdzIG93bgordGVzdHMgYXJlIGJ1aWx0IGFuZCB1c2UgdGhlbSBhcyBleGFtcGxlcy4KKworIyBCYXNpYyBDb25jZXB0cyAjCisKK1doZW4gdXNpbmcgR29vZ2xlIFRlc3QsIHlvdSBzdGFydCBieSB3cml0aW5nIF9hc3NlcnRpb25zXywgd2hpY2ggYXJlIHN0YXRlbWVudHMKK3RoYXQgY2hlY2sgd2hldGhlciBhIGNvbmRpdGlvbiBpcyB0cnVlLiBBbiBhc3NlcnRpb24ncyByZXN1bHQgY2FuIGJlIF9zdWNjZXNzXywKK19ub25mYXRhbCBmYWlsdXJlXywgb3IgX2ZhdGFsIGZhaWx1cmVfLiBJZiBhIGZhdGFsIGZhaWx1cmUgb2NjdXJzLCBpdCBhYm9ydHMKK3RoZSBjdXJyZW50IGZ1bmN0aW9uOyBvdGhlcndpc2UgdGhlIHByb2dyYW0gY29udGludWVzIG5vcm1hbGx5LgorCitfVGVzdHNfIHVzZSBhc3NlcnRpb25zIHRvIHZlcmlmeSB0aGUgdGVzdGVkIGNvZGUncyBiZWhhdmlvci4gSWYgYSB0ZXN0IGNyYXNoZXMKK29yIGhhcyBhIGZhaWxlZCBhc3NlcnRpb24sIHRoZW4gaXQgX2ZhaWxzXzsgb3RoZXJ3aXNlIGl0IF9zdWNjZWVkc18uCisKK0EgX3Rlc3QgY2FzZV8gY29udGFpbnMgb25lIG9yIG1hbnkgdGVzdHMuIFlvdSBzaG91bGQgZ3JvdXAgeW91ciB0ZXN0cyBpbnRvIHRlc3QKK2Nhc2VzIHRoYXQgcmVmbGVjdCB0aGUgc3RydWN0dXJlIG9mIHRoZSB0ZXN0ZWQgY29kZS4gV2hlbiBtdWx0aXBsZSB0ZXN0cyBpbiBhCit0ZXN0IGNhc2UgbmVlZCB0byBzaGFyZSBjb21tb24gb2JqZWN0cyBhbmQgc3Vicm91dGluZXMsIHlvdSBjYW4gcHV0IHRoZW0gaW50byBhCitfdGVzdCBmaXh0dXJlXyBjbGFzcy4KKworQSBfdGVzdCBwcm9ncmFtXyBjYW4gY29udGFpbiBtdWx0aXBsZSB0ZXN0IGNhc2VzLgorCitXZSdsbCBub3cgZXhwbGFpbiBob3cgdG8gd3JpdGUgYSB0ZXN0IHByb2dyYW0sIHN0YXJ0aW5nIGF0IHRoZSBpbmRpdmlkdWFsCithc3NlcnRpb24gbGV2ZWwgYW5kIGJ1aWxkaW5nIHVwIHRvIHRlc3RzIGFuZCB0ZXN0IGNhc2VzLgorCisjIEFzc2VydGlvbnMgIworCitHb29nbGUgVGVzdCBhc3NlcnRpb25zIGFyZSBtYWNyb3MgdGhhdCByZXNlbWJsZSBmdW5jdGlvbiBjYWxscy4gWW91IHRlc3QgYQorY2xhc3Mgb3IgZnVuY3Rpb24gYnkgbWFraW5nIGFzc2VydGlvbnMgYWJvdXQgaXRzIGJlaGF2aW9yLiBXaGVuIGFuIGFzc2VydGlvbgorZmFpbHMsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUgYXNzZXJ0aW9uJ3Mgc291cmNlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGxvY2F0aW9uLAorYWxvbmcgd2l0aCBhIGZhaWx1cmUgbWVzc2FnZS4gWW91IG1heSBhbHNvIHN1cHBseSBhIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UKK3doaWNoIHdpbGwgYmUgYXBwZW5kZWQgdG8gR29vZ2xlIFRlc3QncyBtZXNzYWdlLgorCitUaGUgYXNzZXJ0aW9ucyBjb21lIGluIHBhaXJzIHRoYXQgdGVzdCB0aGUgc2FtZSB0aGluZyBidXQgaGF2ZSBkaWZmZXJlbnQKK2VmZmVjdHMgb24gdGhlIGN1cnJlbnQgZnVuY3Rpb24uIGBBU1NFUlRfKmAgdmVyc2lvbnMgZ2VuZXJhdGUgZmF0YWwgZmFpbHVyZXMKK3doZW4gdGhleSBmYWlsLCBhbmQgKiphYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbioqLiBgRVhQRUNUXypgIHZlcnNpb25zIGdlbmVyYXRlCitub25mYXRhbCBmYWlsdXJlcywgd2hpY2ggZG9uJ3QgYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFVzdWFsbHkgYEVYUEVDVF8qYAorYXJlIHByZWZlcnJlZCwgYXMgdGhleSBhbGxvdyBtb3JlIHRoYW4gb25lIGZhaWx1cmVzIHRvIGJlIHJlcG9ydGVkIGluIGEgdGVzdC4KK0hvd2V2ZXIsIHlvdSBzaG91bGQgdXNlIGBBU1NFUlRfKmAgaWYgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGNvbnRpbnVlIHdoZW4KK3RoZSBhc3NlcnRpb24gaW4gcXVlc3Rpb24gZmFpbHMuCisKK1NpbmNlIGEgZmFpbGVkIGBBU1NFUlRfKmAgcmV0dXJucyBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGltbWVkaWF0ZWx5LAorcG9zc2libHkgc2tpcHBpbmcgY2xlYW4tdXAgY29kZSB0aGF0IGNvbWVzIGFmdGVyIGl0LCBpdCBtYXkgY2F1c2UgYSBzcGFjZSBsZWFrLgorRGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgdGhlIGxlYWssIGl0IG1heSBvciBtYXkgbm90IGJlIHdvcnRoIGZpeGluZyAtIHNvCitrZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgZ2V0IGEgaGVhcCBjaGVja2VyIGVycm9yIGluIGFkZGl0aW9uIHRvIGFzc2VydGlvbgorZXJyb3JzLgorCitUbyBwcm92aWRlIGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZSwgc2ltcGx5IHN0cmVhbSBpdCBpbnRvIHRoZSBtYWNybyB1c2luZyB0aGUKK2A8PGAgb3BlcmF0b3IsIG9yIGEgc2VxdWVuY2Ugb2Ygc3VjaCBvcGVyYXRvcnMuIEFuIGV4YW1wbGU6CitgYGAKK0FTU0VSVF9FUSh4LnNpemUoKSwgeS5zaXplKCkpIDw8ICJWZWN0b3JzIHggYW5kIHkgYXJlIG9mIHVuZXF1YWwgbGVuZ3RoIjsKKworZm9yIChpbnQgaSA9IDA7IGkgPCB4LnNpemUoKTsgKytpKSB7CisgIEVYUEVDVF9FUSh4W2ldLCB5W2ldKSA8PCAiVmVjdG9ycyB4IGFuZCB5IGRpZmZlciBhdCBpbmRleCAiIDw8IGk7Cit9CitgYGAKKworQW55dGhpbmcgdGhhdCBjYW4gYmUgc3RyZWFtZWQgdG8gYW4gYG9zdHJlYW1gIGNhbiBiZSBzdHJlYW1lZCB0byBhbiBhc3NlcnRpb24KK21hY3JvLS1pbiBwYXJ0aWN1bGFyLCBDIHN0cmluZ3MgYW5kIGBzdHJpbmdgIG9iamVjdHMuIElmIGEgd2lkZSBzdHJpbmcKKyhgd2NoYXJfdCpgLCBgVENIQVIqYCBpbiBgVU5JQ09ERWAgbW9kZSBvbiBXaW5kb3dzLCBvciBgc3RkOjp3c3RyaW5nYCkgaXMKK3N0cmVhbWVkIHRvIGFuIGFzc2VydGlvbiwgaXQgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIFVURi04IHdoZW4gcHJpbnRlZC4KKworIyMgQmFzaWMgQXNzZXJ0aW9ucyAjIworCitUaGVzZSBhc3NlcnRpb25zIGRvIGJhc2ljIHRydWUvZmFsc2UgY29uZGl0aW9uIHRlc3RpbmcuCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX1RSVUUoYF9jb25kaXRpb25fYClgOyAgfCBgRVhQRUNUX1RSVUUoYF9jb25kaXRpb25fYClgOyAgIHwgX2NvbmRpdGlvbl8gaXMgdHJ1ZSB8Cit8IGBBU1NFUlRfRkFMU0UoYF9jb25kaXRpb25fYClgOyB8IGBFWFBFQ1RfRkFMU0UoYF9jb25kaXRpb25fYClgOyAgfCBfY29uZGl0aW9uXyBpcyBmYWxzZSB8CisKK1JlbWVtYmVyLCB3aGVuIHRoZXkgZmFpbCwgYEFTU0VSVF8qYCB5aWVsZHMgYSBmYXRhbCBmYWlsdXJlIGFuZAorcmV0dXJucyBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCB3aGlsZSBgRVhQRUNUXypgIHlpZWxkcyBhIG5vbmZhdGFsCitmYWlsdXJlLCBhbGxvd2luZyB0aGUgZnVuY3Rpb24gdG8gY29udGludWUgcnVubmluZy4gSW4gZWl0aGVyIGNhc2UsIGFuCithc3NlcnRpb24gZmFpbHVyZSBtZWFucyBpdHMgY29udGFpbmluZyB0ZXN0IGZhaWxzLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMgQmluYXJ5IENvbXBhcmlzb24gIyMKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhc3NlcnRpb25zIHRoYXQgY29tcGFyZSB0d28gdmFsdWVzLgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfGBBU1NFUlRfRVEoYF9leHBlY3RlZF9gLCBgX2FjdHVhbF9gKTtgfGBFWFBFQ1RfRVEoYF9leHBlY3RlZF9gLCBgX2FjdHVhbF9gKTtgfCBfZXhwZWN0ZWRfIGA9PWAgX2FjdHVhbF8gfAorfGBBU1NFUlRfTkUoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfGBFWFBFQ1RfTkUoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfCBfdmFsMV8gYCE9YCBfdmFsMl8gfAorfGBBU1NFUlRfTFQoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfGBFWFBFQ1RfTFQoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfCBfdmFsMV8gYDxgIF92YWwyXyB8Cit8YEFTU0VSVF9MRShgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8YEVYUEVDVF9MRShgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8IF92YWwxXyBgPD1gIF92YWwyXyB8Cit8YEFTU0VSVF9HVChgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8YEVYUEVDVF9HVChgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8IF92YWwxXyBgPmAgX3ZhbDJfIHwKK3xgQVNTRVJUX0dFKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHxgRVhQRUNUX0dFKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHwgX3ZhbDFfIGA+PWAgX3ZhbDJfIHwKKworSW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZSwgR29vZ2xlIFRlc3QgcHJpbnRzIGJvdGggX3ZhbDFfIGFuZCBfdmFsMl8KKy4gSW4gYEFTU0VSVF9FUSpgIGFuZCBgRVhQRUNUX0VRKmAgKGFuZCBhbGwgb3RoZXIgZXF1YWxpdHkgYXNzZXJ0aW9ucword2UnbGwgaW50cm9kdWNlIGxhdGVyKSwgeW91IHNob3VsZCBwdXQgdGhlIGV4cHJlc3Npb24geW91IHdhbnQgdG8gdGVzdAoraW4gdGhlIHBvc2l0aW9uIG9mIF9hY3R1YWxfLCBhbmQgcHV0IGl0cyBleHBlY3RlZCB2YWx1ZSBpbiBfZXhwZWN0ZWRfLAorYXMgR29vZ2xlIFRlc3QncyBmYWlsdXJlIG1lc3NhZ2VzIGFyZSBvcHRpbWl6ZWQgZm9yIHRoaXMgY29udmVudGlvbi4KKworVmFsdWUgYXJndW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSBieSB0aGUgYXNzZXJ0aW9uJ3MgY29tcGFyaXNvbiBvcGVyYXRvciBvcgoreW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yLiBWYWx1ZXMgbXVzdCBhbHNvIHN1cHBvcnQgdGhlIGA8PGAgb3BlcmF0b3IgZm9yCitzdHJlYW1pbmcgdG8gYW4gYG9zdHJlYW1gLiBBbGwgYnVpbHQtaW4gdHlwZXMgc3VwcG9ydCB0aGlzLgorCitUaGVzZSBhc3NlcnRpb25zIGNhbiB3b3JrIHdpdGggYSB1c2VyLWRlZmluZWQgdHlwZSwgYnV0IG9ubHkgaWYgeW91IGRlZmluZSB0aGUKK2NvcnJlc3BvbmRpbmcgY29tcGFyaXNvbiBvcGVyYXRvciAoZS5nLiBgPT1gLCBgPGAsIGV0YykuICBJZiB0aGUgY29ycmVzcG9uZGluZworb3BlcmF0b3IgaXMgZGVmaW5lZCwgcHJlZmVyIHVzaW5nIHRoZSBgQVNTRVJUXyooKWAgbWFjcm9zIGJlY2F1c2UgdGhleSB3aWxsCitwcmludCBvdXQgbm90IG9ubHkgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiwgYnV0IHRoZSB0d28gb3BlcmFuZHMgYXMgd2VsbC4KKworQXJndW1lbnRzIGFyZSBhbHdheXMgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4gVGhlcmVmb3JlLCBpdCdzIE9LIGZvciB0aGUKK2FyZ3VtZW50cyB0byBoYXZlIHNpZGUgZWZmZWN0cy4gSG93ZXZlciwgYXMgd2l0aCBhbnkgb3JkaW5hcnkgQy9DKysgZnVuY3Rpb24sCit0aGUgYXJndW1lbnRzJyBldmFsdWF0aW9uIG9yZGVyIGlzIHVuZGVmaW5lZCAoaS5lLiB0aGUgY29tcGlsZXIgaXMgZnJlZSB0bworY2hvb3NlIGFueSBvcmRlcikgYW5kIHlvdXIgY29kZSBzaG91bGQgbm90IGRlcGVuZCBvbiBhbnkgcGFydGljdWxhciBhcmd1bWVudAorZXZhbHVhdGlvbiBvcmRlci4KKworYEFTU0VSVF9FUSgpYCBkb2VzIHBvaW50ZXIgZXF1YWxpdHkgb24gcG9pbnRlcnMuIElmIHVzZWQgb24gdHdvIEMgc3RyaW5ncywgaXQKK3Rlc3RzIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiwgbm90IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4KK1RoZXJlZm9yZSwgaWYgeW91IHdhbnQgdG8gY29tcGFyZSBDIHN0cmluZ3MgKGUuZy4gYGNvbnN0IGNoYXIqYCkgYnkgdmFsdWUsIHVzZQorYEFTU0VSVF9TVFJFUSgpYCAsIHdoaWNoIHdpbGwgYmUgZGVzY3JpYmVkIGxhdGVyIG9uLiBJbiBwYXJ0aWN1bGFyLCB0byBhc3NlcnQKK3RoYXQgYSBDIHN0cmluZyBpcyBgTlVMTGAsIHVzZSBgQVNTRVJUX1NUUkVRKE5VTEwsIGNfc3RyaW5nKWAgLiBIb3dldmVyLCB0bworY29tcGFyZSB0d28gYHN0cmluZ2Agb2JqZWN0cywgeW91IHNob3VsZCB1c2UgYEFTU0VSVF9FUWAuCisKK01hY3JvcyBpbiB0aGlzIHNlY3Rpb24gd29yayB3aXRoIGJvdGggbmFycm93IGFuZCB3aWRlIHN0cmluZyBvYmplY3RzIChgc3RyaW5nYAorYW5kIGB3c3RyaW5nYCkuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBTdHJpbmcgQ29tcGFyaXNvbiAjIworCitUaGUgYXNzZXJ0aW9ucyBpbiB0aGlzIGdyb3VwIGNvbXBhcmUgdHdvICoqQyBzdHJpbmdzKiouIElmIHlvdSB3YW50IHRvIGNvbXBhcmUKK3R3byBgc3RyaW5nYCBvYmplY3RzLCB1c2UgYEVYUEVDVF9FUWAsIGBFWFBFQ1RfTkVgLCBhbmQgZXRjIGluc3RlYWQuCisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfU1RSRVEoYF9leHBlY3RlZFxfc3RyX2AsIGBfYWN0dWFsXF9zdHJfYCk7YCAgICB8IGBFWFBFQ1RfU1RSRVEoYF9leHBlY3RlZFxfc3RyX2AsIGBfYWN0dWFsXF9zdHJfYCk7YCAgICAgfCB0aGUgdHdvIEMgc3RyaW5ncyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQgfAorfCBgQVNTRVJUX1NUUk5FKGBfc3RyMV9gLCBgX3N0cjJfYCk7YCAgICB8IGBFWFBFQ1RfU1RSTkUoYF9zdHIxX2AsIGBfc3RyMl9gKTtgICAgICB8IHRoZSB0d28gQyBzdHJpbmdzIGhhdmUgZGlmZmVyZW50IGNvbnRlbnQgfAorfCBgQVNTRVJUX1NUUkNBU0VFUShgX2V4cGVjdGVkXF9zdHJfYCwgYF9hY3R1YWxcX3N0cl9gKTtgfCBgRVhQRUNUX1NUUkNBU0VFUShgX2V4cGVjdGVkXF9zdHJfYCwgYF9hY3R1YWxcX3N0cl9gKTtgIHwgdGhlIHR3byBDIHN0cmluZ3MgaGF2ZSB0aGUgc2FtZSBjb250ZW50LCBpZ25vcmluZyBjYXNlIHwKK3wgYEFTU0VSVF9TVFJDQVNFTkUoYF9zdHIxX2AsIGBfc3RyMl9gKTtgfCBgRVhQRUNUX1NUUkNBU0VORShgX3N0cjFfYCwgYF9zdHIyX2ApO2AgfCB0aGUgdHdvIEMgc3RyaW5ncyBoYXZlIGRpZmZlcmVudCBjb250ZW50LCBpZ25vcmluZyBjYXNlIHwKKworTm90ZSB0aGF0ICJDQVNFIiBpbiBhbiBhc3NlcnRpb24gbmFtZSBtZWFucyB0aGF0IGNhc2UgaXMgaWdub3JlZC4KKworYCpTVFJFUSpgIGFuZCBgKlNUUk5FKmAgYWxzbyBhY2NlcHQgd2lkZSBDIHN0cmluZ3MgKGB3Y2hhcl90KmApLiBJZiBhCitjb21wYXJpc29uIG9mIHR3byB3aWRlIHN0cmluZ3MgZmFpbHMsIHRoZWlyIHZhbHVlcyB3aWxsIGJlIHByaW50ZWQgYXMgVVRGLTgKK25hcnJvdyBzdHJpbmdzLgorCitBIGBOVUxMYCBwb2ludGVyIGFuZCBhbiBlbXB0eSBzdHJpbmcgYXJlIGNvbnNpZGVyZWQgX2RpZmZlcmVudF8uCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCitTZWUgYWxzbzogRm9yIG1vcmUgc3RyaW5nIGNvbXBhcmlzb24gdHJpY2tzIChzdWJzdHJpbmcsIHByZWZpeCwgc3VmZml4LCBhbmQKK3JlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZywgZm9yIGV4YW1wbGUpLCBzZWUgdGhlIFtBZHZhbmNlZEd1aWRlIEFkdmFuY2VkCitHb29nbGUgVGVzdCBHdWlkZV0uCisKKyMgU2ltcGxlIFRlc3RzICMKKworVG8gY3JlYXRlIGEgdGVzdDoKKyAgMS4gVXNlIHRoZSBgVEVTVCgpYCBtYWNybyB0byBkZWZpbmUgYW5kIG5hbWUgYSB0ZXN0IGZ1bmN0aW9uLCBUaGVzZSBhcmUgb3JkaW5hcnkgQysrIGZ1bmN0aW9ucyB0aGF0IGRvbid0IHJldHVybiBhIHZhbHVlLgorICAxLiBJbiB0aGlzIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIGFueSB2YWxpZCBDKysgc3RhdGVtZW50cyB5b3Ugd2FudCB0byBpbmNsdWRlLCB1c2UgdGhlIHZhcmlvdXMgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyB0byBjaGVjayB2YWx1ZXMuCisgIDEuIFRoZSB0ZXN0J3MgcmVzdWx0IGlzIGRldGVybWluZWQgYnkgdGhlIGFzc2VydGlvbnM7IGlmIGFueSBhc3NlcnRpb24gaW4gdGhlIHRlc3QgZmFpbHMgKGVpdGhlciBmYXRhbGx5IG9yIG5vbi1mYXRhbGx5KSwgb3IgaWYgdGhlIHRlc3QgY3Jhc2hlcywgdGhlIGVudGlyZSB0ZXN0IGZhaWxzLiBPdGhlcndpc2UsIGl0IHN1Y2NlZWRzLgorCitgYGAKK1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgeworIC4uLiB0ZXN0IGJvZHkgLi4uCit9CitgYGAKKworCitgVEVTVCgpYCBhcmd1bWVudHMgZ28gZnJvbSBnZW5lcmFsIHRvIHNwZWNpZmljLiBUaGUgX2ZpcnN0XyBhcmd1bWVudCBpcyB0aGUKK25hbWUgb2YgdGhlIHRlc3QgY2FzZSwgYW5kIHRoZSBfc2Vjb25kXyBhcmd1bWVudCBpcyB0aGUgdGVzdCdzIG5hbWUgd2l0aGluIHRoZQordGVzdCBjYXNlLiBSZW1lbWJlciB0aGF0IGEgdGVzdCBjYXNlIGNhbiBjb250YWluIGFueSBudW1iZXIgb2YgaW5kaXZpZHVhbAordGVzdHMuIEEgdGVzdCdzIF9mdWxsIG5hbWVfIGNvbnNpc3RzIG9mIGl0cyBjb250YWluaW5nIHRlc3QgY2FzZSBhbmQgaXRzCitpbmRpdmlkdWFsIG5hbWUuIFRlc3RzIGZyb20gZGlmZmVyZW50IHRlc3QgY2FzZXMgY2FuIGhhdmUgdGhlIHNhbWUgaW5kaXZpZHVhbAorbmFtZS4KKworRm9yIGV4YW1wbGUsIGxldCdzIHRha2UgYSBzaW1wbGUgaW50ZWdlciBmdW5jdGlvbjoKK2BgYAoraW50IEZhY3RvcmlhbChpbnQgbik7IC8vIFJldHVybnMgdGhlIGZhY3RvcmlhbCBvZiBuCitgYGAKKworQSB0ZXN0IGNhc2UgZm9yIHRoaXMgZnVuY3Rpb24gbWlnaHQgbG9vayBsaWtlOgorYGBgCisvLyBUZXN0cyBmYWN0b3JpYWwgb2YgMC4KK1RFU1QoRmFjdG9yaWFsVGVzdCwgSGFuZGxlc1plcm9JbnB1dCkgeworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDApKTsKK30KKworLy8gVGVzdHMgZmFjdG9yaWFsIG9mIHBvc2l0aXZlIG51bWJlcnMuCitURVNUKEZhY3RvcmlhbFRlc3QsIEhhbmRsZXNQb3NpdGl2ZUlucHV0KSB7CisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoMSkpOworICBFWFBFQ1RfRVEoMiwgRmFjdG9yaWFsKDIpKTsKKyAgRVhQRUNUX0VRKDYsIEZhY3RvcmlhbCgzKSk7CisgIEVYUEVDVF9FUSg0MDMyMCwgRmFjdG9yaWFsKDgpKTsKK30KK2BgYAorCitHb29nbGUgVGVzdCBncm91cHMgdGhlIHRlc3QgcmVzdWx0cyBieSB0ZXN0IGNhc2VzLCBzbyBsb2dpY2FsbHktcmVsYXRlZCB0ZXN0cworc2hvdWxkIGJlIGluIHRoZSBzYW1lIHRlc3QgY2FzZTsgaW4gb3RoZXIgd29yZHMsIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVpcgorYFRFU1QoKWAgc2hvdWxkIGJlIHRoZSBzYW1lLiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgd2UgaGF2ZSB0d28gdGVzdHMsCitgSGFuZGxlc1plcm9JbnB1dGAgYW5kIGBIYW5kbGVzUG9zaXRpdmVJbnB1dGAsIHRoYXQgYmVsb25nIHRvIHRoZSBzYW1lIHRlc3QKK2Nhc2UgYEZhY3RvcmlhbFRlc3RgLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyBUZXN0IEZpeHR1cmVzOiBVc2luZyB0aGUgU2FtZSBEYXRhIENvbmZpZ3VyYXRpb24gZm9yIE11bHRpcGxlIFRlc3RzICMKKworSWYgeW91IGZpbmQgeW91cnNlbGYgd3JpdGluZyB0d28gb3IgbW9yZSB0ZXN0cyB0aGF0IG9wZXJhdGUgb24gc2ltaWxhciBkYXRhLAoreW91IGNhbiB1c2UgYSBfdGVzdCBmaXh0dXJlXy4gSXQgYWxsb3dzIHlvdSB0byByZXVzZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uIG9mCitvYmplY3RzIGZvciBzZXZlcmFsIGRpZmZlcmVudCB0ZXN0cy4KKworVG8gY3JlYXRlIGEgZml4dHVyZSwganVzdDoKKyAgMS4gRGVyaXZlIGEgY2xhc3MgZnJvbSBgOjp0ZXN0aW5nOjpUZXN0YCAuIFN0YXJ0IGl0cyBib2R5IHdpdGggYHByb3RlY3RlZDpgIG9yIGBwdWJsaWM6YCBhcyB3ZSdsbCB3YW50IHRvIGFjY2VzcyBmaXh0dXJlIG1lbWJlcnMgZnJvbSBzdWItY2xhc3Nlcy4KKyAgMS4gSW5zaWRlIHRoZSBjbGFzcywgZGVjbGFyZSBhbnkgb2JqZWN0cyB5b3UgcGxhbiB0byB1c2UuCisgIDEuIElmIG5lY2Vzc2FyeSwgd3JpdGUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9yIGBTZXRVcCgpYCBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBvYmplY3RzIGZvciBlYWNoIHRlc3QuIEEgY29tbW9uIG1pc3Rha2UgaXMgdG8gc3BlbGwgYFNldFVwKClgIGFzIGBTZXR1cCgpYCB3aXRoIGEgc21hbGwgYHVgIC0gZG9uJ3QgbGV0IHRoYXQgaGFwcGVuIHRvIHlvdS4KKyAgMS4gSWYgbmVjZXNzYXJ5LCB3cml0ZSBhIGRlc3RydWN0b3Igb3IgYFRlYXJEb3duKClgIGZ1bmN0aW9uIHRvIHJlbGVhc2UgYW55IHJlc291cmNlcyB5b3UgYWxsb2NhdGVkIGluIGBTZXRVcCgpYCAuIFRvIGxlYXJuIHdoZW4geW91IHNob3VsZCB1c2UgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgYW5kIHdoZW4geW91IHNob3VsZCB1c2UgYFNldFVwKCkvVGVhckRvd24oKWAsIHJlYWQgdGhpcyBbRkFRIGVudHJ5XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzVfRkFRI1Nob3VsZF9JX3VzZV90aGVfY29uc3RydWN0b3IvZGVzdHJ1Y3Rvcl9vZl90aGVfdGVzdF9maXh0dXJlX29yX3QpLgorICAxLiBJZiBuZWVkZWQsIGRlZmluZSBzdWJyb3V0aW5lcyBmb3IgeW91ciB0ZXN0cyB0byBzaGFyZS4KKworV2hlbiB1c2luZyBhIGZpeHR1cmUsIHVzZSBgVEVTVF9GKClgIGluc3RlYWQgb2YgYFRFU1QoKWAgYXMgaXQgYWxsb3dzIHlvdSB0bworYWNjZXNzIG9iamVjdHMgYW5kIHN1YnJvdXRpbmVzIGluIHRoZSB0ZXN0IGZpeHR1cmU6CitgYGAKK1RFU1RfRih0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSB7CisgLi4uIHRlc3QgYm9keSAuLi4KK30KK2BgYAorCitMaWtlIGBURVNUKClgLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHRlc3QgY2FzZSBuYW1lLCBidXQgZm9yIGBURVNUX0YoKWAKK3RoaXMgbXVzdCBiZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLiBZb3UndmUgcHJvYmFibHkgZ3Vlc3NlZDogYF9GYAoraXMgZm9yIGZpeHR1cmUuCisKK1VuZm9ydHVuYXRlbHksIHRoZSBDKysgbWFjcm8gc3lzdGVtIGRvZXMgbm90IGFsbG93IHVzIHRvIGNyZWF0ZSBhIHNpbmdsZSBtYWNybwordGhhdCBjYW4gaGFuZGxlIGJvdGggdHlwZXMgb2YgdGVzdHMuIFVzaW5nIHRoZSB3cm9uZyBtYWNybyBjYXVzZXMgYSBjb21waWxlcgorZXJyb3IuCisKK0Fsc28sIHlvdSBtdXN0IGZpcnN0IGRlZmluZSBhIHRlc3QgZml4dHVyZSBjbGFzcyBiZWZvcmUgdXNpbmcgaXQgaW4gYQorYFRFU1RfRigpYCwgb3IgeW91J2xsIGdldCB0aGUgY29tcGlsZXIgZXJyb3IgImB2aXJ0dWFsIG91dHNpZGUgY2xhc3MKK2RlY2xhcmF0aW9uYCIuCisKK0ZvciBlYWNoIHRlc3QgZGVmaW5lZCB3aXRoIGBURVNUX0YoKWAsIEdvb2dsZSBUZXN0IHdpbGw6CisgIDEuIENyZWF0ZSBhIF9mcmVzaF8gdGVzdCBmaXh0dXJlIGF0IHJ1bnRpbWUKKyAgMS4gSW1tZWRpYXRlbHkgaW5pdGlhbGl6ZSBpdCB2aWEgYFNldFVwKClgICwKKyAgMS4gUnVuIHRoZSB0ZXN0CisgIDEuIENsZWFuIHVwIGJ5IGNhbGxpbmcgYFRlYXJEb3duKClgCisgIDEuIERlbGV0ZSB0aGUgdGVzdCBmaXh0dXJlLiAgTm90ZSB0aGF0IGRpZmZlcmVudCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaGF2ZSBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIG9iamVjdHMsIGFuZCBHb29nbGUgVGVzdCBhbHdheXMgZGVsZXRlcyBhIHRlc3QgZml4dHVyZSBiZWZvcmUgaXQgY3JlYXRlcyB0aGUgbmV4dCBvbmUuIEdvb2dsZSBUZXN0IGRvZXMgbm90IHJldXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZSBmb3IgbXVsdGlwbGUgdGVzdHMuIEFueSBjaGFuZ2VzIG9uZSB0ZXN0IG1ha2VzIHRvIHRoZSBmaXh0dXJlIGRvIG5vdCBhZmZlY3Qgb3RoZXIgdGVzdHMuCisKK0FzIGFuIGV4YW1wbGUsIGxldCdzIHdyaXRlIHRlc3RzIGZvciBhIEZJRk8gcXVldWUgY2xhc3MgbmFtZWQgYFF1ZXVlYCwgd2hpY2gKK2hhcyB0aGUgZm9sbG93aW5nIGludGVyZmFjZToKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEU+IC8vIEUgaXMgdGhlIGVsZW1lbnQgdHlwZS4KK2NsYXNzIFF1ZXVlIHsKKyBwdWJsaWM6CisgIFF1ZXVlKCk7CisgIHZvaWQgRW5xdWV1ZShjb25zdCBFJiBlbGVtZW50KTsKKyAgRSogRGVxdWV1ZSgpOyAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgorICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICAuLi4KK307CitgYGAKKworRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MuIEJ5IGNvbnZlbnRpb24sIHlvdSBzaG91bGQgZ2l2ZSBpdCB0aGUgbmFtZQorYEZvb1Rlc3RgIHdoZXJlIGBGb29gIGlzIHRoZSBjbGFzcyBiZWluZyB0ZXN0ZWQuCitgYGAKK2NsYXNzIFF1ZXVlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHExXy5FbnF1ZXVlKDEpOworICAgIHEyXy5FbnF1ZXVlKDIpOworICAgIHEyXy5FbnF1ZXVlKDMpOworICB9CisKKyAgLy8gdmlydHVhbCB2b2lkIFRlYXJEb3duKCkge30KKworICBRdWV1ZTxpbnQ+IHEwXzsKKyAgUXVldWU8aW50PiBxMV87CisgIFF1ZXVlPGludD4gcTJfOworfTsKK2BgYAorCitJbiB0aGlzIGNhc2UsIGBUZWFyRG93bigpYCBpcyBub3QgbmVlZGVkIHNpbmNlIHdlIGRvbid0IGhhdmUgdG8gY2xlYW4gdXAgYWZ0ZXIKK2VhY2ggdGVzdCwgb3RoZXIgdGhhbiB3aGF0J3MgYWxyZWFkeSBkb25lIGJ5IHRoZSBkZXN0cnVjdG9yLgorCitOb3cgd2UnbGwgd3JpdGUgdGVzdHMgdXNpbmcgYFRFU1RfRigpYCBhbmQgdGhpcyBmaXh0dXJlLgorYGBgCitURVNUX0YoUXVldWVUZXN0LCBJc0VtcHR5SW5pdGlhbGx5KSB7CisgIEVYUEVDVF9FUSgwLCBxMF8uc2l6ZSgpKTsKK30KKworVEVTVF9GKFF1ZXVlVGVzdCwgRGVxdWV1ZVdvcmtzKSB7CisgIGludCogbiA9IHEwXy5EZXF1ZXVlKCk7CisgIEVYUEVDVF9FUShOVUxMLCBuKTsKKworICBuID0gcTFfLkRlcXVldWUoKTsKKyAgQVNTRVJUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDEsICpuKTsKKyAgRVhQRUNUX0VRKDAsIHExXy5zaXplKCkpOworICBkZWxldGUgbjsKKworICBuID0gcTJfLkRlcXVldWUoKTsKKyAgQVNTRVJUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDIsICpuKTsKKyAgRVhQRUNUX0VRKDEsIHEyXy5zaXplKCkpOworICBkZWxldGUgbjsKK30KK2BgYAorCitUaGUgYWJvdmUgdXNlcyBib3RoIGBBU1NFUlRfKmAgYW5kIGBFWFBFQ1RfKmAgYXNzZXJ0aW9ucy4gVGhlIHJ1bGUgb2YgdGh1bWIgaXMKK3RvIHVzZSBgRVhQRUNUXypgIHdoZW4geW91IHdhbnQgdGhlIHRlc3QgdG8gY29udGludWUgdG8gcmV2ZWFsIG1vcmUgZXJyb3JzCithZnRlciB0aGUgYXNzZXJ0aW9uIGZhaWx1cmUsIGFuZCB1c2UgYEFTU0VSVF8qYCB3aGVuIGNvbnRpbnVpbmcgYWZ0ZXIgZmFpbHVyZQorZG9lc24ndCBtYWtlIHNlbnNlLiBGb3IgZXhhbXBsZSwgdGhlIHNlY29uZCBhc3NlcnRpb24gaW4gdGhlIGBEZXF1ZXVlYCB0ZXN0IGlzCitgQVNTRVJUX1RSVUUobiAhPSBOVUxMKWAsIGFzIHdlIG5lZWQgdG8gZGVyZWZlcmVuY2UgdGhlIHBvaW50ZXIgYG5gIGxhdGVyLAord2hpY2ggd291bGQgbGVhZCB0byBhIHNlZ2ZhdWx0IHdoZW4gYG5gIGlzIGBOVUxMYC4KKworV2hlbiB0aGVzZSB0ZXN0cyBydW4sIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKKyAgMS4gR29vZ2xlIFRlc3QgY29uc3RydWN0cyBhIGBRdWV1ZVRlc3RgIG9iamVjdCAobGV0J3MgY2FsbCBpdCBgdDFgICkuCisgIDEuIGB0MS5TZXRVcCgpYCBpbml0aWFsaXplcyBgdDFgIC4KKyAgMS4gVGhlIGZpcnN0IHRlc3QgKCBgSXNFbXB0eUluaXRpYWxseWAgKSBydW5zIG9uIGB0MWAgLgorICAxLiBgdDEuVGVhckRvd24oKWAgY2xlYW5zIHVwIGFmdGVyIHRoZSB0ZXN0IGZpbmlzaGVzLgorICAxLiBgdDFgIGlzIGRlc3RydWN0ZWQuCisgIDEuIFRoZSBhYm92ZSBzdGVwcyBhcmUgcmVwZWF0ZWQgb24gYW5vdGhlciBgUXVldWVUZXN0YCBvYmplY3QsIHRoaXMgdGltZSBydW5uaW5nIHRoZSBgRGVxdWV1ZVdvcmtzYCB0ZXN0LgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworX05vdGVfOiBHb29nbGUgVGVzdCBhdXRvbWF0aWNhbGx5IHNhdmVzIGFsbCBfR29vZ2xlIFRlc3RfIGZsYWdzIHdoZW4gYSB0ZXN0CitvYmplY3QgaXMgY29uc3RydWN0ZWQsIGFuZCByZXN0b3JlcyB0aGVtIHdoZW4gaXQgaXMgZGVzdHJ1Y3RlZC4KKworIyBJbnZva2luZyB0aGUgVGVzdHMgIworCitgVEVTVCgpYCBhbmQgYFRFU1RfRigpYCBpbXBsaWNpdGx5IHJlZ2lzdGVyIHRoZWlyIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QuIFNvLCB1bmxpa2Ugd2l0aCBtYW55IG90aGVyIEMrKyB0ZXN0aW5nIGZyYW1ld29ya3MsIHlvdSBkb24ndCBoYXZlIHRvIHJlLWxpc3QgYWxsIHlvdXIgZGVmaW5lZCB0ZXN0cyBpbiBvcmRlciB0byBydW4gdGhlbS4KKworQWZ0ZXIgZGVmaW5pbmcgeW91ciB0ZXN0cywgeW91IGNhbiBydW4gdGhlbSB3aXRoIGBSVU5fQUxMX1RFU1RTKClgICwgd2hpY2ggcmV0dXJucyBgMGAgaWYgYWxsIHRoZSB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bCwgb3IgYDFgIG90aGVyd2lzZS4gTm90ZSB0aGF0IGBSVU5fQUxMX1RFU1RTKClgIHJ1bnMgX2FsbCB0ZXN0c18gaW4geW91ciBsaW5rIHVuaXQgLS0gdGhleSBjYW4gYmUgZnJvbSBkaWZmZXJlbnQgdGVzdCBjYXNlcywgb3IgZXZlbiBkaWZmZXJlbnQgc291cmNlIGZpbGVzLgorCitXaGVuIGludm9rZWQsIHRoZSBgUlVOX0FMTF9URVNUUygpYCBtYWNybzoKKyAgMS4gU2F2ZXMgdGhlIHN0YXRlIG9mIGFsbCAgR29vZ2xlIFRlc3QgZmxhZ3MuCisgIDEuIENyZWF0ZXMgYSB0ZXN0IGZpeHR1cmUgb2JqZWN0IGZvciB0aGUgZmlyc3QgdGVzdC4KKyAgMS4gSW5pdGlhbGl6ZXMgaXQgdmlhIGBTZXRVcCgpYC4KKyAgMS4gUnVucyB0aGUgdGVzdCBvbiB0aGUgZml4dHVyZSBvYmplY3QuCisgIDEuIENsZWFucyB1cCB0aGUgZml4dHVyZSB2aWEgYFRlYXJEb3duKClgLgorICAxLiBEZWxldGVzIHRoZSBmaXh0dXJlLgorICAxLiBSZXN0b3JlcyB0aGUgc3RhdGUgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorICAxLiBSZXBlYXRzIHRoZSBhYm92ZSBzdGVwcyBmb3IgdGhlIG5leHQgdGVzdCwgdW50aWwgYWxsIHRlc3RzIGhhdmUgcnVuLgorCitJbiBhZGRpdGlvbiwgaWYgdGhlIHRleHQgZml4dHVyZSdzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUgaW4KK3N0ZXAgMiwgdGhlcmUgaXMgbm8gcG9pbnQgZm9yIHN0ZXAgMyAtIDUgYW5kIHRoZXkgYXJlIHRodXMgc2tpcHBlZC4gU2ltaWxhcmx5LAoraWYgc3RlcCAzIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUsIHN0ZXAgNCB3aWxsIGJlIHNraXBwZWQuCisKK19JbXBvcnRhbnRfOiBZb3UgbXVzdCBub3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgYFJVTl9BTExfVEVTVFMoKWAsIG9yIGBnY2NgCit3aWxsIGdpdmUgeW91IGEgY29tcGlsZXIgZXJyb3IuIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgZGVzaWduIGlzIHRoYXQgdGhlCithdXRvbWF0ZWQgdGVzdGluZyBzZXJ2aWNlIGRldGVybWluZXMgd2hldGhlciBhIHRlc3QgaGFzIHBhc3NlZCBiYXNlZCBvbiBpdHMKK2V4aXQgY29kZSwgbm90IG9uIGl0cyBzdGRvdXQvc3RkZXJyIG91dHB1dDsgdGh1cyB5b3VyIGBtYWluKClgIGZ1bmN0aW9uIG11c3QKK3JldHVybiB0aGUgdmFsdWUgb2YgYFJVTl9BTExfVEVTVFMoKWAuCisKK0Fsc28sIHlvdSBzaG91bGQgY2FsbCBgUlVOX0FMTF9URVNUUygpYCBvbmx5ICoqb25jZSoqLiBDYWxsaW5nIGl0IG1vcmUgdGhhbiBvbmNlCitjb25mbGljdHMgd2l0aCBzb21lIGFkdmFuY2VkIEdvb2dsZSBUZXN0IGZlYXR1cmVzIChlLmcuIHRocmVhZC1zYWZlIGRlYXRoCit0ZXN0cykgYW5kIHRodXMgaXMgbm90IHN1cHBvcnRlZC4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMgV3JpdGluZyB0aGUgbWFpbigpIEZ1bmN0aW9uICMKKworWW91IGNhbiBzdGFydCBmcm9tIHRoaXMgYm9pbGVycGxhdGU6CitgYGAKKyNpbmNsdWRlICJ0aGlzL3BhY2thZ2UvZm9vLmgiCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIHsKKworLy8gVGhlIGZpeHR1cmUgZm9yIHRlc3RpbmcgY2xhc3MgRm9vLgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gWW91IGNhbiByZW1vdmUgYW55IG9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpZiBpdHMgYm9keQorICAvLyBpcyBlbXB0eS4KKworICBGb29UZXN0KCkgeworICAgIC8vIFlvdSBjYW4gZG8gc2V0LXVwIHdvcmsgZm9yIGVhY2ggdGVzdCBoZXJlLgorICB9CisKKyAgdmlydHVhbCB+Rm9vVGVzdCgpIHsKKyAgICAvLyBZb3UgY2FuIGRvIGNsZWFuLXVwIHdvcmsgdGhhdCBkb2Vzbid0IHRocm93IGV4Y2VwdGlvbnMgaGVyZS4KKyAgfQorCisgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBhcmUgbm90IGVub3VnaCBmb3Igc2V0dGluZyB1cAorICAvLyBhbmQgY2xlYW5pbmcgdXAgZWFjaCB0ZXN0LCB5b3UgY2FuIGRlZmluZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIENvZGUgaGVyZSB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29uc3RydWN0b3IgKHJpZ2h0CisgICAgLy8gYmVmb3JlIGVhY2ggdGVzdCkuCisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gQ29kZSBoZXJlIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVzdCAocmlnaHQKKyAgICAvLyBiZWZvcmUgdGhlIGRlc3RydWN0b3IpLgorICB9CisKKyAgLy8gT2JqZWN0cyBkZWNsYXJlZCBoZXJlIGNhbiBiZSB1c2VkIGJ5IGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIGZvciBGb28uCit9OworCisvLyBUZXN0cyB0aGF0IHRoZSBGb286OkJhcigpIG1ldGhvZCBkb2VzIEFiYy4KK1RFU1RfRihGb29UZXN0LCBNZXRob2RCYXJEb2VzQWJjKSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9maWxlcGF0aCA9ICJ0aGlzL3BhY2thZ2UvdGVzdGRhdGEvbXlpbnB1dGZpbGUuZGF0IjsKKyAgY29uc3Qgc3RyaW5nIG91dHB1dF9maWxlcGF0aCA9ICJ0aGlzL3BhY2thZ2UvdGVzdGRhdGEvbXlvdXRwdXRmaWxlLmRhdCI7CisgIEZvbyBmOworICBFWFBFQ1RfRVEoMCwgZi5CYXIoaW5wdXRfZmlsZXBhdGgsIG91dHB1dF9maWxlcGF0aCkpOworfQorCisvLyBUZXN0cyB0aGF0IEZvbyBkb2VzIFh5ei4KK1RFU1RfRihGb29UZXN0LCBEb2VzWHl6KSB7CisgIC8vIEV4ZXJjaXNlcyB0aGUgWHl6IGZlYXR1cmUgb2YgRm9vLgorfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorYGBgCisKK1RoZSBgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpYCBmdW5jdGlvbiBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlCitUZXN0IGZsYWdzLCBhbmQgcmVtb3ZlcyBhbGwgcmVjb2duaXplZCBmbGFncy4gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCBhCit0ZXN0IHByb2dyYW0ncyBiZWhhdmlvciB2aWEgdmFyaW91cyBmbGFncywgd2hpY2ggd2UnbGwgY292ZXIgaW4gW0FkdmFuY2VkR3VpZGVdKFYxXzVfQWR2YW5jZWRHdWlkZS5tZCkuCitZb3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYFJVTl9BTExfVEVTVFMoKWAsIG9yIHRoZSBmbGFncword29uJ3QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisKK09uIFdpbmRvd3MsIGBJbml0R29vZ2xlVGVzdCgpYCBhbHNvIHdvcmtzIHdpdGggd2lkZSBzdHJpbmdzLCBzbyBpdCBjYW4gYmUgdXNlZAoraW4gcHJvZ3JhbXMgY29tcGlsZWQgaW4gYFVOSUNPREVgIG1vZGUgYXMgd2VsbC4KKworQnV0IG1heWJlIHlvdSB0aGluayB0aGF0IHdyaXRpbmcgYWxsIHRob3NlIG1haW4oKSBmdW5jdGlvbnMgaXMgdG9vIG11Y2ggd29yaz8gV2UgYWdyZWUgd2l0aCB5b3UgY29tcGxldGVseSBhbmQgdGhhdCdzIHdoeSBHb29nbGUgVGVzdCBwcm92aWRlcyBhIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIG1haW4oKS4gSWYgaXQgZml0cyB5b3VyIG5lZWRzLCB0aGVuIGp1c3QgbGluayB5b3VyIHRlc3Qgd2l0aCBndGVzdFxfbWFpbiBsaWJyYXJ5IGFuZCB5b3UgYXJlIGdvb2QgdG8gZ28uCisKKyMjIEltcG9ydGFudCBub3RlIGZvciBWaXN1YWwgQysrIHVzZXJzICMjCitJZiB5b3UgcHV0IHlvdXIgdGVzdHMgaW50byBhIGxpYnJhcnkgYW5kIHlvdXIgYG1haW4oKWAgZnVuY3Rpb24gaXMgaW4gYSBkaWZmZXJlbnQgbGlicmFyeSBvciBpbiB5b3VyIC5leGUgZmlsZSwgdGhvc2UgdGVzdHMgd2lsbCBub3QgcnVuLiBUaGUgcmVhc29uIGlzIGEgW2J1Z10oaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vZmVlZGJhY2svdmlld2ZlZWRiYWNrLmFzcHg/RmVlZGJhY2tJRD0yNDQ0MTAmc2l0ZWlkPTIxMCkgaW4gVmlzdWFsIEMrKy4gV2hlbiB5b3UgZGVmaW5lIHlvdXIgdGVzdHMsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgY2VydGFpbiBzdGF0aWMgb2JqZWN0cyB0byByZWdpc3RlciB0aGVtLiBUaGVzZSBvYmplY3RzIGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIGVsc2V3aGVyZSBidXQgdGhlaXIgY29uc3RydWN0b3JzIGFyZSBzdGlsbCBzdXBwb3NlZCB0byBydW4uIFdoZW4gVmlzdWFsIEMrKyBsaW5rZXIgc2VlcyB0aGF0IG5vdGhpbmcgaW4gdGhlIGxpYnJhcnkgaXMgcmVmZXJlbmNlZCBmcm9tIG90aGVyIHBsYWNlcyBpdCB0aHJvd3MgdGhlIGxpYnJhcnkgb3V0LiBZb3UgaGF2ZSB0byByZWZlcmVuY2UgeW91ciBsaWJyYXJ5IHdpdGggdGVzdHMgZnJvbSB5b3VyIG1haW4gcHJvZ3JhbSB0byBrZWVwIHRoZSBsaW5rZXIgZnJvbSBkaXNjYXJkaW5nIGl0LiBIZXJlIGlzIGhvdyB0byBkbyBpdC4gU29tZXdoZXJlIGluIHlvdXIgbGlicmFyeSBjb2RlIGRlY2xhcmUgYSBmdW5jdGlvbjoKK2BgYAorX19kZWNsc3BlYyhkbGxleHBvcnQpIGludCBQdWxsSW5NeUxpYnJhcnkoKSB7IHJldHVybiAwOyB9CitgYGAKK0lmIHlvdSBwdXQgeW91ciB0ZXN0cyBpbiBhIHN0YXRpYyBsaWJyYXJ5IChub3QgRExMKSB0aGVuIGBfX2RlY2xzcGVjKGRsbGV4cG9ydClgIGlzIG5vdCByZXF1aXJlZC4gTm93LCBpbiB5b3VyIG1haW4gcHJvZ3JhbSwgd3JpdGUgYSBjb2RlIHRoYXQgaW52b2tlcyB0aGF0IGZ1bmN0aW9uOgorYGBgCitpbnQgUHVsbEluTXlMaWJyYXJ5KCk7CitzdGF0aWMgaW50IGR1bW15ID0gUHVsbEluTXlMaWJyYXJ5KCk7CitgYGAKK1RoaXMgd2lsbCBrZWVwIHlvdXIgdGVzdHMgcmVmZXJlbmNlZCBhbmQgd2lsbCBtYWtlIHRoZW0gcmVnaXN0ZXIgdGhlbXNlbHZlcyBhdCBzdGFydHVwLgorCitJbiBhZGRpdGlvbiwgaWYgeW91IGRlZmluZSB5b3VyIHRlc3RzIGluIGEgc3RhdGljIGxpYnJhcnksIGFkZCBgL09QVDpOT1JFRmAgdG8geW91ciBtYWluIHByb2dyYW0gbGlua2VyIG9wdGlvbnMuIElmIHlvdSB1c2UgTVNWQysrIElERSwgZ28gdG8geW91ciAuZXhlIHByb2plY3QgcHJvcGVydGllcy9Db25maWd1cmF0aW9uIFByb3BlcnRpZXMvTGlua2VyL09wdGltaXphdGlvbiBhbmQgc2V0IFJlZmVyZW5jZXMgc2V0dGluZyB0byBgS2VlcCBVbnJlZmVyZW5jZWQgRGF0YSAoL09QVDpOT1JFRilgLiBUaGlzIHdpbGwga2VlcCBWaXN1YWwgQysrIGxpbmtlciBmcm9tIGRpc2NhcmRpbmcgaW5kaXZpZHVhbCBzeW1ib2xzIGdlbmVyYXRlZCBieSB5b3VyIHRlc3RzIGZyb20gdGhlIGZpbmFsIGV4ZWN1dGFibGUuCisKK1RoZXJlIGlzIG9uZSBtb3JlIHBpdGZhbGwsIHRob3VnaC4gSWYgeW91IHVzZSBHb29nbGUgVGVzdCBhcyBhIHN0YXRpYyBsaWJyYXJ5ICh0aGF0J3MgaG93IGl0IGlzIGRlZmluZWQgaW4gZ3Rlc3QudmNwcm9qKSB5b3VyIHRlc3RzIG11c3QgYWxzbyByZXNpZGUgaW4gYSBzdGF0aWMgbGlicmFyeS4gSWYgeW91IGhhdmUgdG8gaGF2ZSB0aGVtIGluIGEgRExMLCB5b3UgX211c3RfIGNoYW5nZSBHb29nbGUgVGVzdCB0byBidWlsZCBpbnRvIGEgRExMIGFzIHdlbGwuIE90aGVyd2lzZSB5b3VyIHRlc3RzIHdpbGwgbm90IHJ1biBjb3JyZWN0bHkgb3Igd2lsbCBub3QgcnVuIGF0IGFsbC4gVGhlIGdlbmVyYWwgY29uY2x1c2lvbiBoZXJlIGlzOiBtYWtlIHlvdXIgbGlmZSBlYXNpZXIgLSBkbyBub3Qgd3JpdGUgeW91ciB0ZXN0cyBpbiBsaWJyYXJpZXMhCisKKyMgV2hlcmUgdG8gR28gZnJvbSBIZXJlICMKKworQ29uZ3JhdHVsYXRpb25zISBZb3UndmUgbGVhcm5lZCB0aGUgR29vZ2xlIFRlc3QgYmFzaWNzLiBZb3UgY2FuIHN0YXJ0IHdyaXRpbmcKK2FuZCBydW5uaW5nIEdvb2dsZSBUZXN0IHRlc3RzLCByZWFkIHNvbWUgW3NhbXBsZXNdKFNhbXBsZXMubWQpLCBvciBjb250aW51ZSB3aXRoCitbQWR2YW5jZWRHdWlkZV0oVjFfNV9BZHZhbmNlZEd1aWRlLm1kKSwgd2hpY2ggZGVzY3JpYmVzIG1hbnkgbW9yZSB1c2VmdWwgR29vZ2xlIFRlc3QgZmVhdHVyZXMuCisKKyMgS25vd24gTGltaXRhdGlvbnMgIworCitHb29nbGUgVGVzdCBpcyBkZXNpZ25lZCB0byBiZSB0aHJlYWQtc2FmZS4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcwordGhyZWFkLXNhZmUgb24gc3lzdGVtcyB3aGVyZSB0aGUgYHB0aHJlYWRzYCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4gIEl0CitpcyBjdXJyZW50bHkgX3Vuc2FmZV8gdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgZnJvbSB0d28gdGhyZWFkcworY29uY3VycmVudGx5IG9uIG90aGVyIHN5c3RlbXMgKGUuZy4gV2luZG93cykuICBJbiBtb3N0IHRlc3RzIHRoaXMgaXMKK25vdCBhbiBpc3N1ZSBhcyB1c3VhbGx5IHRoZSBhc3NlcnRpb25zIGFyZSBkb25lIGluIHRoZSBtYWluIHRocmVhZC4gSWYKK3lvdSB3YW50IHRvIGhlbHAsIHlvdSBjYW4gdm9sdW50ZWVyIHRvIGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5CitzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBpbiBgZ3Rlc3QtcG9ydC5oYCBmb3IgeW91ciBwbGF0Zm9ybS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV81X1B1bXBNYW51YWwubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV81X1B1bXBNYW51YWwubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MTA3OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzVfUHVtcE1hbnVhbC5tZApAQCAtMCwwICsxLDE3NyBAQAorCisKKzxiPlA8L2I+dW1wIGlzIDxiPlU8L2I+c2VmdWwgZm9yIDxiPk08L2I+ZXRhIDxiPlA8L2I+cm9ncmFtbWluZy4KKworIyBUaGUgUHJvYmxlbSAjCisKK1RlbXBsYXRlIGFuZCBtYWNybyBsaWJyYXJpZXMgb2Z0ZW4gbmVlZCB0byBkZWZpbmUgbWFueSBjbGFzc2VzLAorZnVuY3Rpb25zLCBvciBtYWNyb3MgdGhhdCB2YXJ5IG9ubHkgKG9yIGFsbW9zdCBvbmx5KSBpbiB0aGUgbnVtYmVyIG9mCithcmd1bWVudHMgdGhleSB0YWtlLiBJdCdzIGEgbG90IG9mIHJlcGV0aXRpdmUsIG1lY2hhbmljYWwsIGFuZAorZXJyb3ItcHJvbmUgd29yay4KKworVmFyaWFkaWMgdGVtcGxhdGVzIGFuZCB2YXJpYWRpYyBtYWNyb3MgY2FuIGFsbGV2aWF0ZSB0aGUgcHJvYmxlbS4KK0hvd2V2ZXIsIHdoaWxlIGJvdGggYXJlIGJlaW5nIGNvbnNpZGVyZWQgYnkgdGhlIEMrKyBjb21taXR0ZWUsIG5laXRoZXIKK2lzIGluIHRoZSBzdGFuZGFyZCB5ZXQgb3Igd2lkZWx5IHN1cHBvcnRlZCBieSBjb21waWxlcnMuICBUaHVzIHRoZXkKK2FyZSBvZnRlbiBub3QgYSBnb29kIGNob2ljZSwgZXNwZWNpYWxseSB3aGVuIHlvdXIgY29kZSBuZWVkcyB0byBiZQorcG9ydGFibGUuIEFuZCB0aGVpciBjYXBhYmlsaXRpZXMgYXJlIHN0aWxsIGxpbWl0ZWQuCisKK0FzIGEgcmVzdWx0LCBhdXRob3JzIG9mIHN1Y2ggbGlicmFyaWVzIG9mdGVuIGhhdmUgdG8gd3JpdGUgc2NyaXB0cyB0bworZ2VuZXJhdGUgdGhlaXIgaW1wbGVtZW50YXRpb24uIEhvd2V2ZXIsIG91ciBleHBlcmllbmNlIGlzIHRoYXQgaXQncwordGVkaW91cyB0byB3cml0ZSBzdWNoIHNjcmlwdHMsIHdoaWNoIHRlbmQgdG8gcmVmbGVjdCB0aGUgc3RydWN0dXJlIG9mCit0aGUgZ2VuZXJhdGVkIGNvZGUgcG9vcmx5IGFuZCBhcmUgb2Z0ZW4gaGFyZCB0byByZWFkIGFuZCBlZGl0LiBGb3IKK2V4YW1wbGUsIGEgc21hbGwgY2hhbmdlIG5lZWRlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgbWF5IHJlcXVpcmUgc29tZQorbm9uLWludHVpdGl2ZSwgbm9uLXRyaXZpYWwgY2hhbmdlcyBpbiB0aGUgc2NyaXB0LiBUaGlzIGlzIGVzcGVjaWFsbHkKK3BhaW5mdWwgd2hlbiBleHBlcmltZW50aW5nIHdpdGggdGhlIGNvZGUuCisKKyMgT3VyIFNvbHV0aW9uICMKKworUHVtcCAoZm9yIFB1bXAgaXMgVXNlZnVsIGZvciBNZXRhIFByb2dyYW1taW5nLCBQcmV0dHkgVXNlZnVsIGZvciBNZXRhCitQcm9ncmFtbWluZywgb3IgUHJhY3RpY2FsIFV0aWxpdHkgZm9yIE1ldGEgUHJvZ3JhbW1pbmcsIHdoaWNoZXZlciB5b3UKK3ByZWZlcikgaXMgYSBzaW1wbGUgbWV0YS1wcm9ncmFtbWluZyB0b29sIGZvciBDKysuIFRoZSBpZGVhIGlzIHRoYXQgYQorcHJvZ3JhbW1lciB3cml0ZXMgYSBgZm9vLnB1bXBgIGZpbGUgd2hpY2ggY29udGFpbnMgQysrIGNvZGUgcGx1cyBtZXRhCitjb2RlIHRoYXQgbWFuaXB1bGF0ZXMgdGhlIEMrKyBjb2RlLiBUaGUgbWV0YSBjb2RlIGNhbiBoYW5kbGUKK2l0ZXJhdGlvbnMgb3ZlciBhIHJhbmdlLCBuZXN0ZWQgaXRlcmF0aW9ucywgbG9jYWwgbWV0YSB2YXJpYWJsZQorZGVmaW5pdGlvbnMsIHNpbXBsZSBhcml0aG1ldGljLCBhbmQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMuIFlvdSBjYW4KK3ZpZXcgaXQgYXMgYSBzbWFsbCBEb21haW4tU3BlY2lmaWMgTGFuZ3VhZ2UuIFRoZSBtZXRhIGxhbmd1YWdlIGlzCitkZXNpZ25lZCB0byBiZSBub24taW50cnVzaXZlIChzLnQuIGl0IHdvbid0IGNvbmZ1c2UgRW1hY3MnIEMrKyBtb2RlLAorZm9yIGV4YW1wbGUpIGFuZCBjb25jaXNlLCBtYWtpbmcgUHVtcCBjb2RlIGludHVpdGl2ZSBhbmQgZWFzeSB0bworbWFpbnRhaW4uCisKKyMjIEhpZ2hsaWdodHMgIyMKKworICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBhIHNpbmdsZSBQeXRob24gc2NyaXB0IGFuZCB0aHVzIHVsdHJhIHBvcnRhYmxlOiBubyBidWlsZCBvciBpbnN0YWxsYXRpb24gaXMgbmVlZGVkIGFuZCBpdCB3b3JrcyBjcm9zcyBwbGF0Zm9ybXMuCisgICogUHVtcCB0cmllcyB0byBiZSBzbWFydCB3aXRoIHJlc3BlY3QgdG8gW0dvb2dsZSdzIHN0eWxlIGd1aWRlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXN0eWxlZ3VpZGUvKTogaXQgYnJlYWtzIGxvbmcgbGluZXMgKGVhc3kgdG8gaGF2ZSB3aGVuIHRoZXkgYXJlIGdlbmVyYXRlZCkgYXQgYWNjZXB0YWJsZSBwbGFjZXMgdG8gZml0IHdpdGhpbiA4MCBjb2x1bW5zIGFuZCBpbmRlbnQgdGhlIGNvbnRpbnVhdGlvbiBsaW5lcyBjb3JyZWN0bHkuCisgICogVGhlIGZvcm1hdCBpcyBodW1hbi1yZWFkYWJsZSBhbmQgbW9yZSBjb25jaXNlIHRoYW4gWE1MLgorICAqIFRoZSBmb3JtYXQgd29ya3MgcmVsYXRpdmVseSB3ZWxsIHdpdGggRW1hY3MnIEMrKyBtb2RlLgorCisjIyBFeGFtcGxlcyAjIworCitUaGUgZm9sbG93aW5nIFB1bXAgY29kZSAod2hlcmUgbWV0YSBrZXl3b3JkcyBzdGFydCB3aXRoIGAkYCwgYFtbYCBhbmQgYF1dYCBhcmUgbWV0YSBicmFja2V0cywgYW5kIGAkJGAgc3RhcnRzIGEgbWV0YSBjb21tZW50IHRoYXQgZW5kcyB3aXRoIHRoZSBsaW5lKToKKworYGBgCiskdmFyIG4gPSAzICAgICAkJCBEZWZpbmVzIGEgbWV0YSB2YXJpYWJsZSBuLgorJHJhbmdlIGkgMC4ubiAgJCQgRGVjbGFyZXMgdGhlIHJhbmdlIG9mIG1ldGEgaXRlcmF0b3IgaSAoaW5jbHVzaXZlKS4KKyRmb3IgaSBbWworICAgICAgICAgICAgICAgJCQgTWV0YSBsb29wLgorLy8gRm9vJGkgZG9lcyBibGFoIGZvciAkaS1hcnkgcHJlZGljYXRlcy4KKyRyYW5nZSBqIDEuLmkKK3RlbXBsYXRlIDxzaXplX3QgTiAkZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dPgorY2xhc3MgRm9vJGkgeworJGlmIGkgPT0gMCBbWworICBibGFoIGE7CitdXSAkZWxpZiBpIDw9IDIgW1sKKyAgYmxhaCBiOworXV0gJGVsc2UgW1sKKyAgYmxhaCBjOworXV0KK307CisKK11dCitgYGAKKword2lsbCBiZSB0cmFuc2xhdGVkIGJ5IHRoZSBQdW1wIGNvbXBpbGVyIHRvOgorCitgYGAKKy8vIEZvbzAgZG9lcyBibGFoIGZvciAwLWFyeSBwcmVkaWNhdGVzLgordGVtcGxhdGUgPHNpemVfdCBOPgorY2xhc3MgRm9vMCB7CisgIGJsYWggYTsKK307CisKKy8vIEZvbzEgZG9lcyBibGFoIGZvciAxLWFyeSBwcmVkaWNhdGVzLgordGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBBMT4KK2NsYXNzIEZvbzEgeworICBibGFoIGI7Cit9OworCisvLyBGb28yIGRvZXMgYmxhaCBmb3IgMi1hcnkgcHJlZGljYXRlcy4KK3RlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgorY2xhc3MgRm9vMiB7CisgIGJsYWggYjsKK307CisKKy8vIEZvbzMgZG9lcyBibGFoIGZvciAzLWFyeSBwcmVkaWNhdGVzLgordGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgorY2xhc3MgRm9vMyB7CisgIGJsYWggYzsKK307CitgYGAKKworSW4gYW5vdGhlciBleGFtcGxlLAorCitgYGAKKyRyYW5nZSBpIDEuLm4KK0Z1bmMoJGZvciBpICsgW1thJGldXSk7CiskJCBUaGUgdGV4dCBiZXR3ZWVuIGkgYW5kIFtbIGlzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBpdGVyYXRpb25zLgorYGBgCisKK3dpbGwgZ2VuZXJhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGluZXMgKHdpdGhvdXQgdGhlIGNvbW1lbnRzKSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBgbmA6CisKK2BgYAorRnVuYygpOyAgICAgICAgICAgICAgLy8gSWYgbiBpcyAwLgorRnVuYyhhMSk7ICAgICAgICAgICAgLy8gSWYgbiBpcyAxLgorRnVuYyhhMSArIGEyKTsgICAgICAgLy8gSWYgbiBpcyAyLgorRnVuYyhhMSArIGEyICsgYTMpOyAgLy8gSWYgbiBpcyAzLgorLy8gQW5kIHNvIG9uLi4uCitgYGAKKworIyMgQ29uc3RydWN0cyAjIworCitXZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbWV0YSBwcm9ncmFtbWluZyBjb25zdHJ1Y3RzOgorCit8IGAkdmFyIGlkID0gZXhwYCB8IERlZmluZXMgYSBuYW1lZCBjb25zdGFudCB2YWx1ZS4gYCRpZGAgaXMgdmFsaWQgdXRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1ldGEgbGV4aWNhbCBibG9jay4gfAorfDotLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgJHJhbmdlIGlkIGV4cC4uZXhwIHwgU2V0cyB0aGUgcmFuZ2Ugb2YgYW4gaXRlcmF0aW9uIHZhcmlhYmxlLCB3aGljaCBjYW4gYmUgcmV1c2VkIGluIG11bHRpcGxlIGxvb3BzIGxhdGVyLiAgICAgICAgICB8Cit8ICRmb3IgaWQgc2VwIFtbY29kZSBdKC5tZCldIHwgSXRlcmF0aW9uLiBUaGUgcmFuZ2Ugb2YgYGlkYCBtdXN0IGhhdmUgYmVlbiBkZWZpbmVkIGVhcmxpZXIuIGAkaWRgIGlzIHZhbGlkIGluIGBjb2RlYC4gICAgICAgICB8Cit8IGAkKCQpYCAgICAgICAgICB8IEdlbmVyYXRlcyBhIHNpbmdsZSBgJGAgY2hhcmFjdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgJGlkYCAgICAgICAgICAgfCBWYWx1ZSBvZiB0aGUgbmFtZWQgY29uc3RhbnQgb3IgaXRlcmF0aW9uIHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYCQoZXhwKWAgICAgICAgIHwgVmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGAkaWYgZXhwIFtbIGNvZGUgXV0gZWxzZV9icmFuY2hgIHwgQ29uZGl0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBbWyBjb2RlIF1dYCAgICB8IE1ldGEgbGV4aWNhbCBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgY3BwX2NvZGVgICAgICAgfCBSYXcgQysrIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYCQkIGNvbW1lbnRgICAgIHwgTWV0YSBjb21tZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKyoqTm90ZToqKiBUbyBnaXZlIHRoZSB1c2VyIHNvbWUgZnJlZWRvbSBpbiBmb3JtYXR0aW5nIHRoZSBQdW1wIHNvdXJjZQorY29kZSwgUHVtcCBpZ25vcmVzIGEgbmV3LWxpbmUgY2hhcmFjdGVyIGlmIGl0J3MgcmlnaHQgYWZ0ZXIgYCRmb3IgZm9vYAorb3IgbmV4dCB0byBgW1tgIG9yIGBdXWAuIFdpdGhvdXQgdGhpcyBydWxlIHlvdSdsbCBvZnRlbiBiZSBmb3JjZWQgdG8gd3JpdGUKK3ZlcnkgbG9uZyBsaW5lcyB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0LiBUaGVyZWZvcmUgc29tZXRpbWVzIHlvdSBtYXkKK25lZWQgdG8gaW5zZXJ0IGFuIGV4dHJhIG5ldy1saW5lIGluIHN1Y2ggcGxhY2VzIGZvciBhIG5ldy1saW5lIHRvIHNob3cKK3VwIGluIHlvdXIgb3V0cHV0LgorCisjIyBHcmFtbWFyICMjCisKK2BgYAorY29kZSA6Oj0gYXRvbWljX2NvZGUqCithdG9taWNfY29kZSA6Oj0gJHZhciBpZCA9IGV4cAorICAgIHwgJHZhciBpZCA9IFtbIGNvZGUgXV0KKyAgICB8ICRyYW5nZSBpZCBleHAuLmV4cAorICAgIHwgJGZvciBpZCBzZXAgW1sgY29kZSBdXQorICAgIHwgJCgkKQorICAgIHwgJGlkCisgICAgfCAkKGV4cCkKKyAgICB8ICRpZiBleHAgW1sgY29kZSBdXSBlbHNlX2JyYW5jaAorICAgIHwgW1sgY29kZSBdXQorICAgIHwgY3BwX2NvZGUKK3NlcCA6Oj0gY3BwX2NvZGUgfCBlbXB0eV9zdHJpbmcKK2Vsc2VfYnJhbmNoIDo6PSAkZWxzZSBbWyBjb2RlIF1dCisgICAgfCAkZWxpZiBleHAgW1sgY29kZSBdXSBlbHNlX2JyYW5jaAorICAgIHwgZW1wdHlfc3RyaW5nCitleHAgOjo9IHNpbXBsZV9leHByZXNzaW9uX2luX1B5dGhvbl9zeW50YXgKK2BgYAorCisjIyBDb2RlICMjCisKK1lvdSBjYW4gZmluZCB0aGUgc291cmNlIGNvZGUgb2YgUHVtcCBpbiBbc2NyaXB0cy9wdW1wLnB5XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvcHVtcC5weSkuIEl0IGlzIHN0aWxsCit2ZXJ5IHVucG9saXNoZWQgYW5kIGxhY2tzIGF1dG9tYXRlZCB0ZXN0cywgYWx0aG91Z2ggaXQgaGFzIGJlZW4KK3N1Y2Nlc3NmdWxseSB1c2VkIG1hbnkgdGltZXMuIElmIHlvdSBmaW5kIGEgY2hhbmNlIHRvIHVzZSBpdCBpbiB5b3VyCitwcm9qZWN0LCBwbGVhc2UgbGV0IHVzIGtub3cgd2hhdCB5b3UgdGhpbmshICBXZSBhbHNvIHdlbGNvbWUgaGVscCBvbgoraW1wcm92aW5nIFB1bXAuCisKKyMjIFJlYWwgRXhhbXBsZXMgIyMKKworWW91IGNhbiBmaW5kIHJlYWwtd29ybGQgYXBwbGljYXRpb25zIG9mIFB1bXAgaW4gW0dvb2dsZSBUZXN0XShodHRwOi8vd3d3Lmdvb2dsZS5jb20vY29kZXNlYXJjaD9xPWZpbGUlM0FcLnB1bXAlMjQrcGFja2FnZSUzQWh0dHAlM0ElMkYlMkZnb29nbGV0ZXN0XC5nb29nbGVjb2RlXC5jb20pIGFuZCBbR29vZ2xlIE1vY2tdKGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jb2Rlc2VhcmNoP3E9ZmlsZSUzQVwucHVtcCUyNCtwYWNrYWdlJTNBaHR0cCUzQSUyRiUyRmdvb2dsZW1vY2tcLmdvb2dsZWNvZGVcLmNvbSkuICBUaGUgc291cmNlIGZpbGUgYGZvby5oLnB1bXBgIGdlbmVyYXRlcyBgZm9vLmhgLgorCisjIyBUaXBzICMjCisKKyAgKiBJZiBhIG1ldGEgdmFyaWFibGUgaXMgZm9sbG93ZWQgYnkgYSBsZXR0ZXIgb3IgZGlnaXQsIHlvdSBjYW4gc2VwYXJhdGUgdGhlbSB1c2luZyBgW1tdXWAsIHdoaWNoIGluc2VydHMgYW4gZW1wdHkgc3RyaW5nLiBGb3IgZXhhbXBsZSBgRm9vJGpbW11dSGVscGVyYCBnZW5lcmF0ZSBgRm9vMUhlbHBlcmAgd2hlbiBgamAgaXMgMS4KKyAgKiBUbyBhdm9pZCBleHRyYS1sb25nIFB1bXAgc291cmNlIGxpbmVzLCB5b3UgY2FuIGJyZWFrIGEgbGluZSBhbnl3aGVyZSB5b3Ugd2FudCBieSBpbnNlcnRpbmcgYFtbXV1gIGZvbGxvd2VkIGJ5IGEgbmV3IGxpbmUuIFNpbmNlIGFueSBuZXctbGluZSBjaGFyYWN0ZXIgbmV4dCB0byBgW1tgIG9yIGBdXWAgaXMgaWdub3JlZCwgdGhlIGdlbmVyYXRlZCBjb2RlIHdvbid0IGNvbnRhaW4gdGhpcyBuZXcgbGluZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV81X1hjb2RlR3VpZGUubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV81X1hjb2RlR3VpZGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyNGJmNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzVfWGNvZGVHdWlkZS5tZApAQCAtMCwwICsxLDkzIEBACisKKworVGhpcyBndWlkZSB3aWxsIGV4cGxhaW4gaG93IHRvIHVzZSB0aGUgR29vZ2xlIFRlc3RpbmcgRnJhbWV3b3JrIGluIHlvdXIgWGNvZGUgcHJvamVjdHMgb24gTWFjIE9TIFguIFRoaXMgdHV0b3JpYWwgYmVnaW5zIGJ5IHF1aWNrbHkgZXhwbGFpbmluZyB3aGF0IHRvIGRvIGZvciBleHBlcmllbmNlZCB1c2Vycy4gQWZ0ZXIgdGhlIHF1aWNrIHN0YXJ0LCB0aGUgZ3VpZGUgZ29lcyBwcm92aWRlcyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGFib3V0IGVhY2ggc3RlcC4KKworIyBRdWljayBTdGFydCAjCisKK0hlcmUgaXMgdGhlIHF1aWNrIGd1aWRlIGZvciB1c2luZyBHb29nbGUgVGVzdCBpbiB5b3VyIFhjb2RlIHByb2plY3QuCisKKyAgMS4gRG93bmxvYWQgdGhlIHNvdXJjZSBmcm9tIHRoZSBbd2Vic2l0ZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QpIHVzaW5nIHRoaXMgY29tbWFuZDogYHN2biBjaGVja291dCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvIGdvb2dsZXRlc3QtcmVhZC1vbmx5YAorICAxLiBPcGVuIHVwIHRoZSBgZ3Rlc3QueGNvZGVwcm9qYCBpbiB0aGUgYGdvb2dsZXRlc3QtcmVhZC1vbmx5L3hjb2RlL2AgZGlyZWN0b3J5IGFuZCBidWlsZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrLgorICAxLiBDcmVhdGUgYSBuZXcgIlNoZWxsIFRvb2wiIHRhcmdldCBpbiB5b3VyIFhjb2RlIHByb2plY3QgY2FsbGVkIHNvbWV0aGluZyBsaWtlICJVbml0VGVzdHMiCisgIDEuIEFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHlvdXIgcHJvamVjdCBhbmQgYWRkIGl0IHRvIHRoZSAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mICJVbml0VGVzdHMiCisgIDEuIEFkZCB5b3VyIHVuaXQgdGVzdCBzb3VyY2UgY29kZSB0byB0aGUgIkNvbXBpbGUgU291cmNlcyIgYnVpbGQgcGhhc2Ugb2YgIlVuaXRUZXN0cyIKKyAgMS4gRWRpdCB0aGUgIlVuaXRUZXN0cyIgZXhlY3V0YWJsZSBhbmQgYWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVkICJEWUxEXF9GUkFNRVdPUktcX1BBVEgiIHdpdGggYSB2YWx1ZSBlcXVhbCB0byB0aGUgcGF0aCB0byB0aGUgZnJhbWV3b3JrIGNvbnRhaW5pbmcgdGhlIGd0ZXN0LmZyYW1ld29yayByZWxhdGl2ZSB0byB0aGUgY29tcGlsZWQgZXhlY3V0YWJsZS4KKyAgMS4gQnVpbGQgYW5kIEdvCisKK1RoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZnVydGhlciBleHBsYWluIGVhY2ggb2YgdGhlIHN0ZXBzIGxpc3RlZCBhYm92ZSBpbiBkZXB0aCwgZGVzY3JpYmluZyBpbiBtb3JlIGRldGFpbCBob3cgdG8gY29tcGxldGUgaXQgaW5jbHVkaW5nIHNvbWUgdmFyaWF0aW9ucy4KKworIyBHZXQgdGhlIFNvdXJjZSAjCisKK0N1cnJlbnRseSwgdGhlIGd0ZXN0LmZyYW1ld29yayBkaXNjdXNzZWQgaGVyZSBpc24ndCBhdmFpbGFibGUgaW4gYSB0YWdnZWQgcmVsZWFzZSBvZiBHb29nbGUgVGVzdCwgaXQgaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIHRydW5rLiBBcyBleHBsYWluZWQgYXQgdGhlIEdvb2dsZSBUZXN0IFtzaXRlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvY2hlY2tvdXQiPnN2biksIHlvdSBjYW4gZ2V0IHRoZSBjb2RlIGZyb20gYW5vbnltb3VzIFNWTiB3aXRoIHRoaXMgY29tbWFuZDoKKworYGBgCitzdm4gY2hlY2tvdXQgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLyBnb29nbGV0ZXN0LXJlYWQtb25seQorYGBgCisKK0FsdGVybmF0aXZlbHksIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIFN1YnZlcnNpb24gaW4geW91ciBvd24gY29kZSBiYXNlLCB5b3UgY2FuIGFkZCBHb29nbGUgVGVzdCBhcyBhbiBleHRlcm5hbCBkZXBlbmRlbmN5IHRvIHlvdXIgb3duIFN1YnZlcnNpb24gcmVwb3NpdG9yeS4gQnkgZm9sbG93aW5nIHRoaXMgYXBwcm9hY2gsIGV2ZXJ5b25lIHRoYXQgY2hlY2tzIG91dCB5b3VyIHN2biByZXBvc2l0b3J5IHdpbGwgYWxzbyByZWNlaXZlIGEgY29weSBvZiBHb29nbGUgVGVzdCAoYSBzcGVjaWZpYyB2ZXJzaW9uLCBpZiB5b3Ugd2lzaCkgd2l0aG91dCBoYXZpbmcgdG8gY2hlY2sgaXQgb3V0IGV4cGxpY2l0bHkuIFRoaXMgbWFrZXMgdGhlIHNldCB1cCBvZiB5b3VyIHByb2plY3Qgc2ltcGxlciBhbmQgcmVkdWNlcyB0aGUgY29waWVkIGNvZGUgaW4gdGhlIHJlcG9zaXRvcnkuCisKK1RvIHVzZSBgc3ZuOmV4dGVybmFsc2AsIGRlY2lkZSB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBoYXZlIHRoZSBleHRlcm5hbCBzb3VyY2UgcmVzaWRlLiBZb3UgbWlnaHQgY2hvb3NlIHRvIHB1dCB0aGUgZXh0ZXJuYWwgc291cmNlIGluc2lkZSB0aGUgdHJ1bmssIGJlY2F1c2UgeW91IHdhbnQgaXQgdG8gYmUgcGFydCBvZiB0aGUgYnJhbmNoIHdoZW4geW91IG1ha2UgYSByZWxlYXNlLiBIb3dldmVyLCBrZWVwaW5nIGl0IG91dHNpZGUgdGhlIHRydW5rIGluIGEgdmVyc2lvbi10YWdnZWQgZGlyZWN0b3J5IGNhbGxlZCBzb21ldGhpbmcgbGlrZSBgdGhpcmQtcGFydHkvZ29vZ2xldGVzdC8xLjAuMWAsIGlzIGFub3RoZXIgb3B0aW9uLiBPbmNlIHRoZSBsb2NhdGlvbiBpcyBlc3RhYmxpc2hlZCwgdXNlIGBzdm4gcHJvcGVkaXQgc3ZuOmV4dGVybmFscyBfZGlyZWN0b3J5X2AgdG8gc2V0IHRoZSBzdm46ZXh0ZXJuYWxzIHByb3BlcnR5IG9uIGEgZGlyZWN0b3J5IGluIHlvdXIgcmVwb3NpdG9yeS4gVGhpcyBkaXJlY3Rvcnkgd29uJ3QgY29udGFpbiB0aGUgY29kZSwgYnV0IGJlIGl0cyB2ZXJzaW9uZWQgcGFyZW50IGRpcmVjdG9yeS4KKworVGhlIGNvbW1hbmQgYHN2biBwcm9wZWRpdGAgd2lsbCBicmluZyB1cCB5b3VyIFN1YnZlcnNpb24gZWRpdG9yLCBtYWtpbmcgZWRpdGluZyB0aGUgbG9uZywgKHBvdGVudGlhbGx5IG11bHRpLWxpbmUpIHByb3BlcnR5IHNpbXBsZXIuIFRoaXMgc2FtZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY2hlY2sgb3V0IGEgdGFnZ2VkIGJyYW5jaCwgYnkgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFVSTCAoZS5nLiBgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RhZ3MvcmVsZWFzZS0xLjAuMWApLiBBZGRpdGlvbmFsbHksIHRoZSBzdm46ZXh0ZXJuYWxzIHByb3BlcnR5IGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHBhcnRpY3VsYXIgcmV2aXNpb24gb2YgdGhlIHRydW5rIHdpdGggdGhlIGAtcl8jI19gIG9wdGlvbiAoZS5nLiBgZXh0ZXJuYWxzL3NyYy9nb29nbGV0ZXN0IC1yNjAgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rYCkuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyB0aGUgc3ZuOmV4dGVybmFscyBwcm9wZXJ0aWVzIG9uIGEgdHJ1bmsgKHJlYWQgdmlhIGBzdm4gcHJvcGdldGApIG9mIGEgcHJvamVjdC4gVGhpcyB2YWx1ZSBjaGVja3Mgb3V0IGEgY29weSBvZiBHb29nbGUgVGVzdCBpbnRvIHRoZSBgdHJ1bmsvZXh0ZXJuYWxzL3NyYy9nb29nbGV0ZXN0L2AgZGlyZWN0b3J5LgorCitgYGAKK1tDb21wdXRlcjpzdm5dIHVzZXIkIHN2biBwcm9wZ2V0IHN2bjpleHRlcm5hbHMgdHJ1bmsKK2V4dGVybmFscy9zcmMvZ29vZ2xldGVzdCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsKK2BgYAorCisjIEFkZCB0aGUgRnJhbWV3b3JrIHRvIFlvdXIgUHJvamVjdCAjCisKK1RoZSBuZXh0IHN0ZXAgaXMgdG8gYnVpbGQgYW5kIGFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHlvdXIgb3duIHByb2plY3QuIFRoaXMgZ3VpZGUgZGVzY3JpYmVzIHR3byBjb21tb24gd2F5cyBiZWxvdy4KKworICAqICoqT3B0aW9uIDEqKiAtLS0gVGhlIHNpbXBsZXN0IHdheSB0byBhZGQgR29vZ2xlIFRlc3QgdG8geW91ciBvd24gcHJvamVjdCwgaXMgdG8gb3BlbiBndGVzdC54Y29kZXByb2ogKGZvdW5kIGluIHRoZSB4Y29kZS8gZGlyZWN0b3J5IG9mIHRoZSBHb29nbGUgVGVzdCB0cnVuaykgYW5kIGJ1aWxkIHRoZSBmcmFtZXdvcmsgbWFudWFsbHkuIFRoZW4sIGFkZCB0aGUgYnVpbHQgZnJhbWV3b3JrIGludG8geW91ciBwcm9qZWN0IHVzaW5nIHRoZSAiQWRkLT5FeGlzdGluZyBGcmFtZXdvcmsuLi4iIGZyb20gdGhlIGNvbnRleHQgbWVudSBvciAiUHJvamVjdC0+QWRkLi4uIiBmcm9tIHRoZSBtYWluIG1lbnUuIFRoZSBndGVzdC5mcmFtZXdvcmsgaXMgcmVsb2NhdGFibGUgYW5kIGNvbnRhaW5zIHRoZSBoZWFkZXJzIGFuZCBvYmplY3QgY29kZSB0aGF0IHlvdSdsbCBuZWVkIHRvIG1ha2UgdGVzdHMuIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHJlYnVpbGRpbmcgZXZlcnkgdGltZSB5b3UgdXBncmFkZSBHb29nbGUgVGVzdCBpbiB5b3VyIHByb2plY3QuCisgICogKipPcHRpb24gMioqIC0tLSBJZiB5b3UgYXJlIGdvaW5nIHRvIGJlIGxpdmluZyBvZmYgdGhlIHRydW5rIG9mIEdvb2dsZSBUZXN0LCBpbmNvcnBvcmF0aW5nIGl0cyBsYXRlc3QgZmVhdHVyZXMgaW50byB5b3VyIHVuaXQgdGVzdHMgKG9yIGFyZSBhIEdvb2dsZSBUZXN0IGRldmVsb3BlciB5b3Vyc2VsZikuIFlvdSdsbCB3YW50IHRvIHJlYnVpbGQgdGhlIGZyYW1ld29yayBldmVyeSB0aW1lIHRoZSBzb3VyY2UgdXBkYXRlcy4gdG8gZG8gdGhpcywgeW91J2xsIG5lZWQgdG8gYWRkIHRoZSBndGVzdC54Y29kZXByb2ogZmlsZSwgbm90IHRoZSBmcmFtZXdvcmsgaXRzZWxmLCB0byB5b3VyIG93biBYY29kZSBwcm9qZWN0LiBUaGVuLCBmcm9tIHRoZSBidWlsZCBwcm9kdWN0cyB0aGF0IGFyZSByZXZlYWxlZCBieSB0aGUgcHJvamVjdCdzIGRpc2Nsb3N1cmUgdHJpYW5nbGUsIHlvdSBjYW4gZmluZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrLCB3aGljaCBjYW4gYmUgYWRkZWQgdG8geW91ciB0YXJnZXRzIChkaXNjdXNzZWQgYmVsb3cpLgorCisjIE1ha2UgYSBUZXN0IFRhcmdldCAjCisKK1RvIHN0YXJ0IHdyaXRpbmcgdGVzdHMsIG1ha2UgYSBuZXcgIlNoZWxsIFRvb2wiIHRhcmdldC4gVGhpcyB0YXJnZXQgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIHVuZGVyIEJTRCwgQ29jb2EsIG9yIENhcmJvbi4gQWRkIHlvdXIgdW5pdCB0ZXN0IHNvdXJjZSBjb2RlIHRvIHRoZSAiQ29tcGlsZSBTb3VyY2VzIiBidWlsZCBwaGFzZSBvZiB0aGUgdGFyZ2V0LgorCitOZXh0LCB5b3UnbGwgd2FudCB0byBhZGQgZ3Rlc3QuZnJhbWV3b3JrIGluIHR3byBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIHVwb24gd2hpY2ggb3B0aW9uIHlvdSBjaG9zZSBhYm92ZS4KKworICAqICoqT3B0aW9uIDEqKiAtLS0gRHVyaW5nIGNvbXBpbGF0aW9uLCBYY29kZSB3aWxsIG5lZWQgdG8ga25vdyB0aGF0IHlvdSBhcmUgbGlua2luZyBhZ2FpbnN0IHRoZSBndGVzdC5mcmFtZXdvcmsuIEFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHRoZSAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mIHlvdXIgdGVzdCB0YXJnZXQuIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBHb29nbGUgVGVzdCBoZWFkZXJzIGluIHlvdXIgaGVhZGVyIHNlYXJjaCBwYXRoLCBhbmQgd2lsbCB0ZWxsIHRoZSBsaW5rZXIgd2hlcmUgdG8gZmluZCB0aGUgbGlicmFyeS4KKyAgKiAqKk9wdGlvbiAyKiogLS0tIElmIHlvdXIgd29ya2luZyBvdXQgb2YgdGhlIHRydW5rLCB5b3UnbGwgYWxzbyB3YW50IHRvIGFkZCBndGVzdC5mcmFtZXdvcmsgdG8geW91ciAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mIHlvdXIgdGVzdCB0YXJnZXQuIEluIGFkZGl0aW9uLCB5b3UnbGwgIHdhbnQgdG8gYWRkIHRoZSBndGVzdC5mcmFtZXdvcmsgYXMgYSBkZXBlbmRlbmN5IHRvIHlvdXIgdW5pdCB0ZXN0IHRhcmdldC4gVGhpcyB3YXksIFhjb2RlIHdpbGwgbWFrZSBzdXJlIHRoYXQgZ3Rlc3QuZnJhbWV3b3JrIGlzIHVwIHRvIGRhdGUsIGV2ZXJ5IHRpbWUgeW91ciBidWlsZCB5b3VyIHRhcmdldC4gRmluYWxseSwgaWYgeW91IGRvbid0IHNoYXJlIGJ1aWxkIGRpcmVjdG9yaWVzIHdpdGggR29vZ2xlIFRlc3QsIHlvdSdsbCBoYXZlIHRvIGNvcHkgdGhlIGd0ZXN0LmZyYW1ld29yayBpbnRvIHlvdXIgb3duIGJ1aWxkIHByb2R1Y3RzIGRpcmVjdG9yeSB1c2luZyBhICJSdW4gU2NyaXB0IiBidWlsZCBwaGFzZS4KKworIyBTZXQgVXAgdGhlIEV4ZWN1dGFibGUgUnVuIEVudmlyb25tZW50ICMKKworU2luY2UgdGhlIHVuaXQgdGVzdCBleGVjdXRhYmxlIGlzIGEgc2hlbGwgdG9vbCwgaXQgZG9lc24ndCBoYXZlIGEgYnVuZGxlIHdpdGggYSBgQ29udGVudHMvRnJhbWV3b3Jrc2AgZGlyZWN0b3J5LCBpbiB3aGljaCB0byBwbGFjZSBndGVzdC5mcmFtZXdvcmsuIEluc3RlYWQsIHRoZSBkeW5hbWljIGxpbmtlciBtdXN0IGJlIHRvbGQgYXQgcnVudGltZSB0byBzZWFyY2ggZm9yIHRoZSBmcmFtZXdvcmsgaW4gYW5vdGhlciBsb2NhdGlvbi4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHNldHRpbmcgdGhlICJEWUxEXF9GUkFNRVdPUktcX1BBVEgiIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSAiRWRpdCBBY3RpdmUgRXhlY3V0YWJsZSAuLi4iIEFyZ3VtZW50cyB0YWIsIHVuZGVyICJWYXJpYWJsZXMgdG8gYmUgc2V0IGluIHRoZSBlbnZpcm9ubWVudDoiLiBUaGUgcGF0aCBmb3IgdGhpcyB2YWx1ZSBpcyB0aGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZ3Rlc3QuZnJhbWV3b3JrLgorCitJZiB5b3UgaGF2ZW4ndCBzZXQgdXAgdGhlIERZTERcX0ZSQU1FV09SS1xfUEFUSCwgY29ycmVjdGx5LCB5b3UgbWlnaHQgZ2V0IGEgbWVzc2FnZSBsaWtlIHRoaXM6CisKK2BgYAorW1Nlc3Npb24gc3RhcnRlZCBhdCAyMDA4LTA4LTE1IDA2OjIzOjU3IC0wNjAwLl0KKyAgZHlsZDogTGlicmFyeSBub3QgbG9hZGVkOiBAbG9hZGVyX3BhdGgvLi4vRnJhbWV3b3Jrcy9ndGVzdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9ndGVzdAorICAgIFJlZmVyZW5jZWQgZnJvbTogL1VzZXJzL3VzZXJuYW1lL0RvY3VtZW50cy9TYW5kYm94L2d0ZXN0U2FtcGxlL2J1aWxkL0RlYnVnL1dpZGdldEZyYW1ld29ya1Rlc3QKKyAgICBSZWFzb246IGltYWdlIG5vdCBmb3VuZAorYGBgCisKK1RvIGNvcnJlY3QgdGhpcyBwcm9ibGVtLCBnb3QgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIG5hbWVkIGluICJSZWZlcmVuY2VkIGZyb206IiB2YWx1ZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSBhYm92ZS4gVGhlbiwgd2l0aCB0aGUgdGVybWluYWwgaW4gdGhpcyBsb2NhdGlvbiwgZmluZCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGd0ZXN0LmZyYW1ld29yay4gVGhhdCBpcyB0aGUgdmFsdWUgeW91J2xsIG5lZWQgdG8gc2V0IGFzIHRoZSBEWUxEXF9GUkFNRVdPUktcX1BBVEguCisKKyMgQnVpbGQgYW5kIEdvICMKKworTm93LCB3aGVuIHlvdSBjbGljayAiQnVpbGQgYW5kIEdvIiwgdGhlIHRlc3Qgd2lsbCBiZSBleGVjdXRlZC4gRHVtcGluZyBvdXQgc29tZXRoaW5nIGxpa2UgdGhpczoKKworYGBgCitbU2Vzc2lvbiBzdGFydGVkIGF0IDIwMDgtMDgtMDYgMDY6MzY6MTMgLTA2MDAuXQorWz09PT09PT09PT1dIFJ1bm5pbmcgMiB0ZXN0cyBmcm9tIDEgdGVzdCBjYXNlLgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK1stLS0tLS0tLS0tXSAyIHRlc3RzIGZyb20gV2lkZ2V0SW5pdGlhbGl6ZXJUZXN0CitbIFJVTiAgICAgIF0gV2lkZ2V0SW5pdGlhbGl6ZXJUZXN0LlRlc3RDb25zdHJ1Y3RvcgorWyAgICAgICBPSyBdIFdpZGdldEluaXRpYWxpemVyVGVzdC5UZXN0Q29uc3RydWN0b3IKK1sgUlVOICAgICAgXSBXaWRnZXRJbml0aWFsaXplclRlc3QuVGVzdENvbnZlcnNpb24KK1sgICAgICAgT0sgXSBXaWRnZXRJbml0aWFsaXplclRlc3QuVGVzdENvbnZlcnNpb24KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK1s9PT09PT09PT09XSAyIHRlc3RzIGZyb20gMSB0ZXN0IGNhc2UgcmFuLgorWyAgUEFTU0VEICBdIDIgdGVzdHMuCisKK1RoZSBEZWJ1Z2dlciBoYXMgZXhpdGVkIHdpdGggc3RhdHVzIDAuICAKK2BgYAorCisjIFN1bW1hcnkgIworCitVbml0IHRlc3RpbmcgaXMgYSB2YWx1YWJsZSB3YXkgdG8gZW5zdXJlIHlvdXIgZGF0YSBtb2RlbCBzdGF5cyB2YWxpZCBldmVuIGR1cmluZyByYXBpZCBkZXZlbG9wbWVudCBvciByZWZhY3RvcmluZy4gVGhlIEdvb2dsZSBUZXN0aW5nIEZyYW1ld29yayBpcyBhIGdyZWF0IHVuaXQgdGVzdGluZyBmcmFtZXdvcmsgZm9yIEMgYW5kIEMrKyB3aGljaCBpbnRlZ3JhdGVzIHdlbGwgd2l0aCBhbiBYY29kZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV82X0FkdmFuY2VkR3VpZGUubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV82X0FkdmFuY2VkR3VpZGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlMGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfQWR2YW5jZWRHdWlkZS5tZApAQCAtMCwwICsxLDIxNzggQEAKKworCitOb3cgdGhhdCB5b3UgaGF2ZSByZWFkIFtQcmltZXJdKFYxXzZfUHJpbWVyLm1kKSBhbmQgbGVhcm5lZCBob3cgdG8gd3JpdGUgdGVzdHMKK3VzaW5nIEdvb2dsZSBUZXN0LCBpdCdzIHRpbWUgdG8gbGVhcm4gc29tZSBuZXcgdHJpY2tzLiBUaGlzIGRvY3VtZW50Cit3aWxsIHNob3cgeW91IG1vcmUgYXNzZXJ0aW9ucyBhcyB3ZWxsIGFzIGhvdyB0byBjb25zdHJ1Y3QgY29tcGxleAorZmFpbHVyZSBtZXNzYWdlcywgcHJvcGFnYXRlIGZhdGFsIGZhaWx1cmVzLCByZXVzZSBhbmQgc3BlZWQgdXAgeW91cgordGVzdCBmaXh0dXJlcywgYW5kIHVzZSB2YXJpb3VzIGZsYWdzIHdpdGggeW91ciB0ZXN0cy4KKworIyBNb3JlIEFzc2VydGlvbnMgIworCitUaGlzIHNlY3Rpb24gY292ZXJzIHNvbWUgbGVzcyBmcmVxdWVudGx5IHVzZWQsIGJ1dCBzdGlsbCBzaWduaWZpY2FudCwKK2Fzc2VydGlvbnMuCisKKyMjIEV4cGxpY2l0IFN1Y2Nlc3MgYW5kIEZhaWx1cmUgIyMKKworVGhlc2UgdGhyZWUgYXNzZXJ0aW9ucyBkbyBub3QgYWN0dWFsbHkgdGVzdCBhIHZhbHVlIG9yIGV4cHJlc3Npb24uIEluc3RlYWQsCit0aGV5IGdlbmVyYXRlIGEgc3VjY2VzcyBvciBmYWlsdXJlIGRpcmVjdGx5LiBMaWtlIHRoZSBtYWNyb3MgdGhhdCBhY3R1YWxseQorcGVyZm9ybSBhIHRlc3QsIHlvdSBtYXkgc3RyZWFtIGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZSBpbnRvIHRoZSB0aGVtLgorCit8IGBTVUNDRUVEKCk7YCB8Cit8Oi0tLS0tLS0tLS0tLS18CisKK0dlbmVyYXRlcyBhIHN1Y2Nlc3MuIFRoaXMgZG9lcyBOT1QgbWFrZSB0aGUgb3ZlcmFsbCB0ZXN0IHN1Y2NlZWQuIEEgdGVzdCBpcworY29uc2lkZXJlZCBzdWNjZXNzZnVsIG9ubHkgaWYgbm9uZSBvZiBpdHMgYXNzZXJ0aW9ucyBmYWlsIGR1cmluZyBpdHMgZXhlY3V0aW9uLgorCitOb3RlOiBgU1VDQ0VFRCgpYCBpcyBwdXJlbHkgZG9jdW1lbnRhcnkgYW5kIGN1cnJlbnRseSBkb2Vzbid0IGdlbmVyYXRlIGFueQordXNlci12aXNpYmxlIG91dHB1dC4gSG93ZXZlciwgd2UgbWF5IGFkZCBgU1VDQ0VFRCgpYCBtZXNzYWdlcyB0byBHb29nbGUgVGVzdCdzCitvdXRwdXQgaW4gdGhlIGZ1dHVyZS4KKworfCBgRkFJTCgpO2AgIHwgYEFERF9GQUlMVVJFKCk7YCB8IGBBRERfRkFJTFVSRV9BVCgiYF9maWxlXF9wYXRoX2AiLCBgX2xpbmVcX251bWJlcl9gKTtgIHwKK3w6LS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKK2BGQUlMKClgIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUsIHdoaWxlIGBBRERfRkFJTFVSRSgpYCBhbmQgYEFERF9GQUlMVVJFX0FUKClgIGdlbmVyYXRlIGEgbm9uZmF0YWwKK2ZhaWx1cmUuIFRoZXNlIGFyZSB1c2VmdWwgd2hlbiBjb250cm9sIGZsb3csIHJhdGhlciB0aGFuIGEgQm9vbGVhbiBleHByZXNzaW9uLAorZGV0ZXJlbWluZXMgdGhlIHRlc3QncyBzdWNjZXNzIG9yIGZhaWx1cmUuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgd2FudCB0byB3cml0ZQorc29tZXRoaW5nIGxpa2U6CisKK2BgYAorc3dpdGNoKGV4cHJlc3Npb24pIHsKKyAgY2FzZSAxOiAuLi4gc29tZSBjaGVja3MgLi4uCisgIGNhc2UgMjogLi4uIHNvbWUgb3RoZXIgY2hlY2tzCisgIC4uLgorICBkZWZhdWx0OiBGQUlMKCkgPDwgIldlIHNob3VsZG4ndCBnZXQgaGVyZS4iOworfQorYGBgCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBFeGNlcHRpb24gQXNzZXJ0aW9ucyAjIworCitUaGVzZSBhcmUgZm9yIHZlcmlmeWluZyB0aGF0IGEgcGllY2Ugb2YgY29kZSB0aHJvd3MgKG9yIGRvZXMgbm90Cit0aHJvdykgYW4gZXhjZXB0aW9uIG9mIHRoZSBnaXZlbiB0eXBlOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX1RIUk9XKGBfc3RhdGVtZW50XywgX2V4Y2VwdGlvblxfdHlwZV9gKTtgICB8IGBFWFBFQ1RfVEhST1coYF9zdGF0ZW1lbnRfLCBfZXhjZXB0aW9uXF90eXBlX2ApO2AgIHwgX3N0YXRlbWVudF8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0aGUgZ2l2ZW4gdHlwZSAgfAorfCBgQVNTRVJUX0FOWV9USFJPVyhgX3N0YXRlbWVudF9gKTtgICAgICAgICAgICAgICAgIHwgYEVYUEVDVF9BTllfVEhST1coYF9zdGF0ZW1lbnRfYCk7YCAgICAgICAgICAgICAgICB8IF9zdGF0ZW1lbnRfIHRocm93cyBhbiBleGNlcHRpb24gb2YgYW55IHR5cGUgICAgICAgIHwKK3wgYEFTU0VSVF9OT19USFJPVyhgX3N0YXRlbWVudF9gKTtgICAgICAgICAgICAgICAgICB8IGBFWFBFQ1RfTk9fVEhST1coYF9zdGF0ZW1lbnRfYCk7YCAgICAgICAgICAgICAgICAgfCBfc3RhdGVtZW50XyBkb2Vzbid0IHRocm93IGFueSBleGNlcHRpb24gICAgICAgICAgICB8CisKK0V4YW1wbGVzOgorCitgYGAKK0FTU0VSVF9USFJPVyhGb28oNSksIGJhcl9leGNlcHRpb24pOworCitFWFBFQ1RfTk9fVEhST1coeworICBpbnQgbiA9IDU7CisgIEJhcigmbik7Cit9KTsKK2BgYAorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjEuMC4KKworIyMgUHJlZGljYXRlIEFzc2VydGlvbnMgZm9yIEJldHRlciBFcnJvciBNZXNzYWdlcyAjIworCitFdmVuIHRob3VnaCBHb29nbGUgVGVzdCBoYXMgYSByaWNoIHNldCBvZiBhc3NlcnRpb25zLCB0aGV5IGNhbiBuZXZlciBiZQorY29tcGxldGUsIGFzIGl0J3MgaW1wb3NzaWJsZSAobm9yIGEgZ29vZCBpZGVhKSB0byBhbnRpY2lwYXRlIGFsbCB0aGUgc2NlbmFyaW9zCithIHVzZXIgbWlnaHQgcnVuIGludG8uIFRoZXJlZm9yZSwgc29tZXRpbWVzIGEgdXNlciBoYXMgdG8gdXNlIGBFWFBFQ1RfVFJVRSgpYAordG8gY2hlY2sgYSBjb21wbGV4IGV4cHJlc3Npb24sIGZvciBsYWNrIG9mIGEgYmV0dGVyIG1hY3JvLiBUaGlzIGhhcyB0aGUgcHJvYmxlbQorb2Ygbm90IHNob3dpbmcgeW91IHRoZSB2YWx1ZXMgb2YgdGhlIHBhcnRzIG9mIHRoZSBleHByZXNzaW9uLCBtYWtpbmcgaXQgaGFyZCB0bwordW5kZXJzdGFuZCB3aGF0IHdlbnQgd3JvbmcuIEFzIGEgd29ya2Fyb3VuZCwgc29tZSB1c2VycyBjaG9vc2UgdG8gY29uc3RydWN0IHRoZQorZmFpbHVyZSBtZXNzYWdlIGJ5IHRoZW1zZWx2ZXMsIHN0cmVhbWluZyBpdCBpbnRvIGBFWFBFQ1RfVFJVRSgpYC4gSG93ZXZlciwgdGhpcworaXMgYXdrd2FyZCBlc3BlY2lhbGx5IHdoZW4gdGhlIGV4cHJlc3Npb24gaGFzIHNpZGUtZWZmZWN0cyBvciBpcyBleHBlbnNpdmUgdG8KK2V2YWx1YXRlLgorCitHb29nbGUgVGVzdCBnaXZlcyB5b3UgdGhyZWUgZGlmZmVyZW50IG9wdGlvbnMgdG8gc29sdmUgdGhpcyBwcm9ibGVtOgorCisjIyMgVXNpbmcgYW4gRXhpc3RpbmcgQm9vbGVhbiBGdW5jdGlvbiAjIyMKKworSWYgeW91IGFscmVhZHkgaGF2ZSBhIGZ1bmN0aW9uIG9yIGEgZnVuY3RvciB0aGF0IHJldHVybnMgYGJvb2xgIChvciBhIHR5cGUKK3RoYXQgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGBib29sYCksIHlvdSBjYW4gdXNlIGl0IGluIGEgX3ByZWRpY2F0ZQorYXNzZXJ0aW9uXyB0byBnZXQgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBwcmludGVkIGZvciBmcmVlOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX1BSRUQxKGBfcHJlZDEsIHZhbDFfYCk7YCAgICAgICB8IGBFWFBFQ1RfUFJFRDEoYF9wcmVkMSwgdmFsMV9gKTtgIHwgX3ByZWQxKHZhbDEpXyByZXR1cm5zIHRydWUgfAorfCBgQVNTRVJUX1BSRUQyKGBfcHJlZDIsIHZhbDEsIHZhbDJfYCk7YCB8IGBFWFBFQ1RfUFJFRDIoYF9wcmVkMiwgdmFsMSwgdmFsMl9gKTtgIHwgIF9wcmVkMih2YWwxLCB2YWwyKV8gcmV0dXJucyB0cnVlIHwKK3wgIC4uLiAgICAgICAgICAgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgfCAuLi4gICAgICAgICAgfAorCitJbiB0aGUgYWJvdmUsIF9wcmVkbl8gaXMgYW4gX25fLWFyeSBwcmVkaWNhdGUgZnVuY3Rpb24gb3IgZnVuY3Rvciwgd2hlcmUKK192YWwxXywgX3ZhbDJfLCAuLi4sIGFuZCBfdmFsbl8gYXJlIGl0cyBhcmd1bWVudHMuIFRoZSBhc3NlcnRpb24gc3VjY2VlZHMKK2lmIHRoZSBwcmVkaWNhdGUgcmV0dXJucyBgdHJ1ZWAgd2hlbiBhcHBsaWVkIHRvIHRoZSBnaXZlbiBhcmd1bWVudHMsIGFuZCBmYWlscworb3RoZXJ3aXNlLiBXaGVuIHRoZSBhc3NlcnRpb24gZmFpbHMsIGl0IHByaW50cyB0aGUgdmFsdWUgb2YgZWFjaCBhcmd1bWVudC4gSW4KK2VpdGhlciBjYXNlLCB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLgorCitIZXJlJ3MgYW4gZXhhbXBsZS4gR2l2ZW4KKworYGBgCisvLyBSZXR1cm5zIHRydWUgaWZmIG0gYW5kIG4gaGF2ZSBubyBjb21tb24gZGl2aXNvcnMgZXhjZXB0IDEuCitib29sIE11dHVhbGx5UHJpbWUoaW50IG0sIGludCBuKSB7IC4uLiB9Citjb25zdCBpbnQgYSA9IDM7Citjb25zdCBpbnQgYiA9IDQ7Citjb25zdCBpbnQgYyA9IDEwOworYGBgCisKK3RoZSBhc3NlcnRpb24gYEVYUEVDVF9QUkVEMihNdXR1YWxseVByaW1lLCBhLCBiKTtgIHdpbGwgc3VjY2VlZCwgd2hpbGUgdGhlCithc3NlcnRpb24gYEVYUEVDVF9QUkVEMihNdXR1YWxseVByaW1lLCBiLCBjKTtgIHdpbGwgZmFpbCB3aXRoIHRoZSBtZXNzYWdlCisKKzxwcmU+CishTXV0dWFsbHlQcmltZShiLCBjKSBpcyBmYWxzZSwgd2hlcmU8YnI+CitiIGlzIDQ8YnI+CitjIGlzIDEwPGJyPgorPC9wcmU+CisKKyoqTm90ZXM6KioKKworICAxLiBJZiB5b3Ugc2VlIGEgY29tcGlsZXIgZXJyb3IgIm5vIG1hdGNoaW5nIGZ1bmN0aW9uIHRvIGNhbGwiIHdoZW4gdXNpbmcgYEFTU0VSVF9QUkVEKmAgb3IgYEVYUEVDVF9QUkVEKmAsIHBsZWFzZSBzZWUgW3RoaXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvVjFfNl9GQVEjVGhlX2NvbXBpbGVyX2NvbXBsYWluc18lMjJub19tYXRjaGluZ19mdW5jdGlvbl90b19jYWxsJTIyKSBmb3IgaG93IHRvIHJlc29sdmUgaXQuCisgIDEuIEN1cnJlbnRseSB3ZSBvbmx5IHByb3ZpZGUgcHJlZGljYXRlIGFzc2VydGlvbnMgb2YgYXJpdHkgPD0gNS4gSWYgeW91IG5lZWQgYSBoaWdoZXItYXJpdHkgYXNzZXJ0aW9uLCBsZXQgdXMga25vdy4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMKKworIyMjIFVzaW5nIGEgRnVuY3Rpb24gVGhhdCBSZXR1cm5zIGFuIEFzc2VydGlvblJlc3VsdCAjIyMKKworV2hpbGUgYEVYUEVDVF9QUkVEKigpYCBhbmQgZnJpZW5kcyBhcmUgaGFuZHkgZm9yIGEgcXVpY2sgam9iLCB0aGUKK3N5bnRheCBpcyBub3Qgc2F0aXNmYWN0b3J5OiB5b3UgaGF2ZSB0byB1c2UgZGlmZmVyZW50IG1hY3JvcyBmb3IKK2RpZmZlcmVudCBhcml0aWVzLCBhbmQgaXQgZmVlbHMgbW9yZSBsaWtlIExpc3AgdGhhbiBDKysuICBUaGUKK2A6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdGAgY2xhc3Mgc29sdmVzIHRoaXMgcHJvYmxlbS4KKworQW4gYEFzc2VydGlvblJlc3VsdGAgb2JqZWN0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhbiBhc3NlcnRpb24KKyh3aGV0aGVyIGl0J3MgYSBzdWNjZXNzIG9yIGEgZmFpbHVyZSwgYW5kIGFuIGFzc29jaWF0ZWQgbWVzc2FnZSkuICBZb3UKK2NhbiBjcmVhdGUgYW4gYEFzc2VydGlvblJlc3VsdGAgdXNpbmcgb25lIG9mIHRoZXNlIGZhY3RvcnkKK2Z1bmN0aW9uczoKKworYGBgCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFJldHVybnMgYW4gQXNzZXJ0aW9uUmVzdWx0IG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGFuIGFzc2VydGlvbiBoYXMKKy8vIHN1Y2NlZWRlZC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCk7CisKKy8vIFJldHVybnMgYW4gQXNzZXJ0aW9uUmVzdWx0IG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGFuIGFzc2VydGlvbiBoYXMKKy8vIGZhaWxlZC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCk7CisKK30KK2BgYAorCitZb3UgY2FuIHRoZW4gdXNlIHRoZSBgPDxgIG9wZXJhdG9yIHRvIHN0cmVhbSBtZXNzYWdlcyB0byB0aGUKK2BBc3NlcnRpb25SZXN1bHRgIG9iamVjdC4KKworVG8gcHJvdmlkZSBtb3JlIHJlYWRhYmxlIG1lc3NhZ2VzIGluIEJvb2xlYW4gYXNzZXJ0aW9ucworKGUuZy4gYEVYUEVDVF9UUlVFKClgKSwgd3JpdGUgYSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zCitgQXNzZXJ0aW9uUmVzdWx0YCBpbnN0ZWFkIG9mIGBib29sYC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUKK2BJc0V2ZW4oKWAgYXM6CisKK2BgYAorOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7CisgIGlmICgobiAlIDIpID09IDApCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworICBlbHNlCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworfQorYGBgCisKK2luc3RlYWQgb2Y6CisKK2BgYAorYm9vbCBJc0V2ZW4oaW50IG4pIHsKKyAgcmV0dXJuIChuICUgMikgPT0gMDsKK30KK2BgYAorCit0aGUgZmFpbGVkIGFzc2VydGlvbiBgRVhQRUNUX1RSVUUoSXNFdmVuKEZpYig0KSkpYCB3aWxsIHByaW50OgorCis8cHJlPgorVmFsdWUgb2Y6ICFJc0V2ZW4oRmliKDQpKTxicj4KK0FjdHVhbDogZmFsc2UgKCozIGlzIG9kZCopPGJyPgorRXhwZWN0ZWQ6IHRydWU8YnI+Cis8L3ByZT4KKworaW5zdGVhZCBvZiBhIG1vcmUgb3BhcXVlCisKKzxwcmU+CitWYWx1ZSBvZjogIUlzRXZlbihGaWIoNCkpPGJyPgorQWN0dWFsOiBmYWxzZTxicj4KK0V4cGVjdGVkOiB0cnVlPGJyPgorPC9wcmU+CisKK0lmIHlvdSB3YW50IGluZm9ybWF0aXZlIG1lc3NhZ2VzIGluIGBFWFBFQ1RfRkFMU0VgIGFuZCBgQVNTRVJUX0ZBTFNFYAorYXMgd2VsbCwgYW5kIGFyZSBmaW5lIHdpdGggbWFraW5nIHRoZSBwcmVkaWNhdGUgc2xvd2VyIGluIHRoZSBzdWNjZXNzCitjYXNlLCB5b3UgY2FuIHN1cHBseSBhIHN1Y2Nlc3MgbWVzc2FnZToKKworYGBgCis6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKyAgaWYgKChuICUgMikgPT0gMCkKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCkgPDwgbiA8PCAiIGlzIGV2ZW4iOworICBlbHNlCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworfQorYGBgCisKK1RoZW4gdGhlIHN0YXRlbWVudCBgRVhQRUNUX0ZBTFNFKElzRXZlbihGaWIoNikpKWAgd2lsbCBwcmludAorCis8cHJlPgorVmFsdWUgb2Y6ICFJc0V2ZW4oRmliKDYpKTxicj4KK0FjdHVhbDogdHJ1ZSAoOCBpcyBldmVuKTxicj4KK0V4cGVjdGVkOiBmYWxzZTxicj4KKzwvcHJlPgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjQuMS4KKworIyMjIFVzaW5nIGEgUHJlZGljYXRlLUZvcm1hdHRlciAjIyMKKworSWYgeW91IGZpbmQgdGhlIGRlZmF1bHQgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgYChBU1NFUlR8RVhQRUNUKV9QUkVEKmAgYW5kCitgKEFTU0VSVHxFWFBFQ1QpXyhUUlVFfEZBTFNFKWAgdW5zYXRpc2ZhY3RvcnksIG9yIHNvbWUgYXJndW1lbnRzIHRvIHlvdXIKK3ByZWRpY2F0ZSBkbyBub3Qgc3VwcG9ydCBzdHJlYW1pbmcgdG8gYG9zdHJlYW1gLCB5b3UgY2FuIGluc3RlYWQgdXNlIHRoZQorZm9sbG93aW5nIF9wcmVkaWNhdGUtZm9ybWF0dGVyIGFzc2VydGlvbnNfIHRvIF9mdWxseV8gY3VzdG9taXplIGhvdyB0aGUKK21lc3NhZ2UgaXMgZm9ybWF0dGVkOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX1BSRURfRk9STUFUMShgX3ByZWRcX2Zvcm1hdDEsIHZhbDFfYCk7YCAgICAgICAgfCBgRVhQRUNUX1BSRURfRk9STUFUMShgX3ByZWRcX2Zvcm1hdDEsIHZhbDFfYCk7IHwgX3ByZWRcX2Zvcm1hdDEodmFsMSlfIGlzIHN1Y2Nlc3NmdWwgfAorfCBgQVNTRVJUX1BSRURfRk9STUFUMihgX3ByZWRcX2Zvcm1hdDIsIHZhbDEsIHZhbDJfYCk7YCB8IGBFWFBFQ1RfUFJFRF9GT1JNQVQyKGBfcHJlZFxfZm9ybWF0MiwgdmFsMSwgdmFsMl9gKTtgIHwgX3ByZWRcX2Zvcm1hdDIodmFsMSwgdmFsMilfIGlzIHN1Y2Nlc3NmdWwgfAorfCBgLi4uYCAgICAgICAgICAgICAgIHwgYC4uLmAgICAgICAgICAgICAgICAgICB8IGAuLi5gICAgICAgICB8CisKK1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgdGhlIHByZXZpb3VzIHR3byBncm91cHMgb2YgbWFjcm9zIGlzIHRoYXQgaW5zdGVhZCBvZgorYSBwcmVkaWNhdGUsIGAoQVNTRVJUfEVYUEVDVClfUFJFRF9GT1JNQVQqYCB0YWtlIGEgX3ByZWRpY2F0ZS1mb3JtYXR0ZXJfCisoX3ByZWRcX2Zvcm1hdG5fKSwgd2hpY2ggaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHdpdGggdGhlIHNpZ25hdHVyZToKKworYDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRpY2F0ZUZvcm1hdHRlcm4oY29uc3QgY2hhciogYF9leHByMV9gLCBjb25zdCBjaGFyKiBgX2V4cHIyX2AsIC4uLiBjb25zdCBjaGFyKiBgX2V4cHJuX2AsIFQxIGBfdmFsMV9gLCBUMiBgX3ZhbDJfYCwgLi4uIFRuIGBfdmFsbl9gKTtgCisKK3doZXJlIF92YWwxXywgX3ZhbDJfLCAuLi4sIGFuZCBfdmFsbl8gYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIHByZWRpY2F0ZQorYXJndW1lbnRzLCBhbmQgX2V4cHIxXywgX2V4cHIyXywgLi4uLCBhbmQgX2V4cHJuXyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcKK2V4cHJlc3Npb25zIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgY29kZS4gVGhlIHR5cGVzIGBUMWAsIGBUMmAsIC4uLiwgYW5kCitgVG5gIGNhbiBiZSBlaXRoZXIgdmFsdWUgdHlwZXMgb3IgcmVmZXJlbmNlIHR5cGVzLiBGb3IgZXhhbXBsZSwgaWYgYW4KK2FyZ3VtZW50IGhhcyB0eXBlIGBGb29gLCB5b3UgY2FuIGRlY2xhcmUgaXQgYXMgZWl0aGVyIGBGb29gIG9yIGBjb25zdCBGb28mYCwKK3doaWNoZXZlciBpcyBhcHByb3ByaWF0ZS4KKworQSBwcmVkaWNhdGUtZm9ybWF0dGVyIHJldHVybnMgYSBgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHRgIG9iamVjdCB0byBpbmRpY2F0ZQord2hldGhlciB0aGUgYXNzZXJ0aW9uIGhhcyBzdWNjZWVkZWQgb3Igbm90LiBUaGUgb25seSB3YXkgdG8gY3JlYXRlIHN1Y2ggYW4KK29iamVjdCBpcyB0byBjYWxsIG9uZSBvZiB0aGVzZSBmYWN0b3J5IGZ1bmN0aW9uczoKKworQXMgYW4gZXhhbXBsZSwgbGV0J3MgaW1wcm92ZSB0aGUgZmFpbHVyZSBtZXNzYWdlIGluIHRoZSBwcmV2aW91cyBleGFtcGxlLCB3aGljaCB1c2VzIGBFWFBFQ1RfUFJFRDIoKWA6CisKK2BgYAorLy8gUmV0dXJucyB0aGUgc21hbGxlc3QgcHJpbWUgY29tbW9uIGRpdmlzb3Igb2YgbSBhbmQgbiwKKy8vIG9yIDEgd2hlbiBtIGFuZCBuIGFyZSBtdXR1YWxseSBwcmltZS4KK2ludCBTbWFsbGVzdFByaW1lQ29tbW9uRGl2aXNvcihpbnQgbSwgaW50IG4pIHsgLi4uIH0KKworLy8gQSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZvciBhc3NlcnRpbmcgdGhhdCB0d28gaW50ZWdlcnMgYXJlIG11dHVhbGx5IHByaW1lLgorOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgQXNzZXJ0TXV0dWFsbHlQcmltZShjb25zdCBjaGFyKiBtX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5fZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKSB7CisgIGlmIChNdXR1YWxseVByaW1lKG0sIG4pKQorICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKyAKKyAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBtX2V4cHIgPDwgIiBhbmQgIiA8PCBuX2V4cHIgPDwgIiAoIiA8PCBtIDw8ICIgYW5kICIgPDwgbgorICAgICAgPDwgIikgYXJlIG5vdCBtdXR1YWxseSBwcmltZSwgIiA8PCAiYXMgdGhleSBoYXZlIGEgY29tbW9uIGRpdmlzb3IgIgorICAgICAgPDwgU21hbGxlc3RQcmltZUNvbW1vbkRpdmlzb3IobSwgbik7Cit9CitgYGAKKworV2l0aCB0aGlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIsIHdlIGNhbiB1c2UKKworYGBgCitFWFBFQ1RfUFJFRF9GT1JNQVQyKEFzc2VydE11dHVhbGx5UHJpbWUsIGIsIGMpOworYGBgCisKK3RvIGdlbmVyYXRlIHRoZSBtZXNzYWdlCisKKzxwcmU+CitiIGFuZCBjICg0IGFuZCAxMCkgYXJlIG5vdCBtdXR1YWxseSBwcmltZSwgYXMgdGhleSBoYXZlIGEgY29tbW9uIGRpdmlzb3IgMi48YnI+Cis8L3ByZT4KKworQXMgeW91IG1heSBoYXZlIHJlYWxpemVkLCBtYW55IG9mIHRoZSBhc3NlcnRpb25zIHdlIGludHJvZHVjZWQgZWFybGllciBhcmUKK3NwZWNpYWwgY2FzZXMgb2YgYChFWFBFQ1R8QVNTRVJUKV9QUkVEX0ZPUk1BVCpgLiBJbiBmYWN0LCBtb3N0IG9mIHRoZW0gYXJlCitpbmRlZWQgZGVmaW5lZCB1c2luZyBgKEVYUEVDVHxBU1NFUlQpX1BSRURfRk9STUFUKmAuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisKKyMjIEZsb2F0aW5nLVBvaW50IENvbXBhcmlzb24gIyMKKworQ29tcGFyaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgaXMgdHJpY2t5LiBEdWUgdG8gcm91bmQtb2ZmIGVycm9ycywgaXQgaXMKK3ZlcnkgdW5saWtlbHkgdGhhdCB0d28gZmxvYXRpbmctcG9pbnRzIHdpbGwgbWF0Y2ggZXhhY3RseS4gVGhlcmVmb3JlLAorYEFTU0VSVF9FUWAgJ3MgbmFpdmUgY29tcGFyaXNvbiB1c3VhbGx5IGRvZXNuJ3Qgd29yay4gQW5kIHNpbmNlIGZsb2F0aW5nLXBvaW50cworY2FuIGhhdmUgYSB3aWRlIHZhbHVlIHJhbmdlLCBubyBzaW5nbGUgZml4ZWQgZXJyb3IgYm91bmQgd29ya3MuIEl0J3MgYmV0dGVyIHRvCitjb21wYXJlIGJ5IGEgZml4ZWQgcmVsYXRpdmUgZXJyb3IgYm91bmQsIGV4Y2VwdCBmb3IgdmFsdWVzIGNsb3NlIHRvIDAgZHVlIHRvCit0aGUgbG9zcyBvZiBwcmVjaXNpb24gdGhlcmUuCisKK0luIGdlbmVyYWwsIGZvciBmbG9hdGluZy1wb2ludCBjb21wYXJpc29uIHRvIG1ha2Ugc2Vuc2UsIHRoZSB1c2VyIG5lZWRzIHRvCitjYXJlZnVsbHkgY2hvb3NlIHRoZSBlcnJvciBib3VuZC4gSWYgdGhleSBkb24ndCB3YW50IG9yIGNhcmUgdG8sIGNvbXBhcmluZyBpbgordGVybXMgb2YgVW5pdHMgaW4gdGhlIExhc3QgUGxhY2UgKFVMUHMpIGlzIGEgZ29vZCBkZWZhdWx0LCBhbmQgR29vZ2xlIFRlc3QKK3Byb3ZpZGVzIGFzc2VydGlvbnMgdG8gZG8gdGhpcy4gRnVsbCBkZXRhaWxzIGFib3V0IFVMUHMgYXJlIHF1aXRlIGxvbmc7IGlmIHlvdQord2FudCB0byBsZWFybiBtb3JlLCBzZWUKK1t0aGlzIGFydGljbGUgb24gZmxvYXQgY29tcGFyaXNvbl0oaHR0cDovL3d3dy5jeWdudXMtc29mdHdhcmUuY29tL3BhcGVycy9jb21wYXJpbmdmbG9hdHMvY29tcGFyaW5nZmxvYXRzLmh0bSkuCisKKyMjIyBGbG9hdGluZy1Qb2ludCBNYWNyb3MgIyMjCisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfRkxPQVRfRVEoYF9leHBlY3RlZCwgYWN0dWFsX2ApO2AgIHwgYEVYUEVDVF9GTE9BVF9FUShgX2V4cGVjdGVkLCBhY3R1YWxfYCk7YCB8IHRoZSB0d28gYGZsb2F0YCB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbCB8Cit8IGBBU1NFUlRfRE9VQkxFX0VRKGBfZXhwZWN0ZWQsIGFjdHVhbF9gKTtgIHwgYEVYUEVDVF9ET1VCTEVfRVEoYF9leHBlY3RlZCwgYWN0dWFsX2ApO2AgfCB0aGUgdHdvIGBkb3VibGVgIHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsIHwKKworQnkgImFsbW9zdCBlcXVhbCIsIHdlIG1lYW4gdGhlIHR3byB2YWx1ZXMgYXJlIHdpdGhpbiA0IFVMUCdzIGZyb20gZWFjaAorb3RoZXIuCisKK1RoZSBmb2xsb3dpbmcgYXNzZXJ0aW9ucyBhbGxvdyB5b3UgdG8gY2hvb3NlIHRoZSBhY2NlcHRhYmxlIGVycm9yIGJvdW5kOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX05FQVIoYF92YWwxLCB2YWwyLCBhYnNcX2Vycm9yX2ApO2AgfCBgRVhQRUNUX05FQVJgXyh2YWwxLCB2YWwyLCBhYnNcX2Vycm9yX2ApO2AgfCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIF92YWwxXyBhbmQgX3ZhbDJfIGRvZXNuJ3QgZXhjZWVkIHRoZSBnaXZlbiBhYnNvbHV0ZSBlcnJvciB8CisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgRmxvYXRpbmctUG9pbnQgUHJlZGljYXRlLUZvcm1hdCBGdW5jdGlvbnMgIyMjCisKK1NvbWUgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhcmUgdXNlZnVsLCBidXQgbm90IHRoYXQgb2Z0ZW4gdXNlZC4gSW4gb3JkZXIKK3RvIGF2b2lkIGFuIGV4cGxvc2lvbiBvZiBuZXcgbWFjcm9zLCB3ZSBwcm92aWRlIHRoZW0gYXMgcHJlZGljYXRlLWZvcm1hdAorZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgaW4gcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MgKGUuZy4KK2BFWFBFQ1RfUFJFRF9GT1JNQVQyYCwgZXRjKS4KKworYGBgCitFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6RmxvYXRMRSwgdmFsMSwgdmFsMik7CitFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6RG91YmxlTEUsIHZhbDEsIHZhbDIpOworYGBgCisKK1ZlcmlmaWVzIHRoYXQgX3ZhbDFfIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCBfdmFsMl8uIFlvdSBjYW4KK3JlcGxhY2UgYEVYUEVDVF9QUkVEX0ZPUk1BVDJgIGluIHRoZSBhYm92ZSB0YWJsZSB3aXRoIGBBU1NFUlRfUFJFRF9GT1JNQVQyYC4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIFdpbmRvd3MgSFJFU1VMVCBhc3NlcnRpb25zICMjCisKK1RoZXNlIGFzc2VydGlvbnMgdGVzdCBmb3IgYEhSRVNVTFRgIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChgX2V4cHJlc3Npb25fYCk7YCB8IGBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoYF9leHByZXNzaW9uX2ApO2AgfCBfZXhwcmVzc2lvbl8gaXMgYSBzdWNjZXNzIGBIUkVTVUxUYCB8Cit8IGBBU1NFUlRfSFJFU1VMVF9GQUlMRUQoYF9leHByZXNzaW9uX2ApO2AgICAgfCBgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKGBfZXhwcmVzc2lvbl9gKTtgICAgIHwgX2V4cHJlc3Npb25fIGlzIGEgZmFpbHVyZSBgSFJFU1VMVGAgfAorCitUaGUgZ2VuZXJhdGVkIG91dHB1dCBjb250YWlucyB0aGUgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZQorYXNzb2NpYXRlZCB3aXRoIHRoZSBgSFJFU1VMVGAgY29kZSByZXR1cm5lZCBieSBfZXhwcmVzc2lvbl8uCisKK1lvdSBtaWdodCB1c2UgdGhlbSBsaWtlIHRoaXM6CisKK2BgYAorQ0NvbVB0ciBzaGVsbDsKK0FTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChzaGVsbC5Db0NyZWF0ZUluc3RhbmNlKEwiU2hlbGwuQXBwbGljYXRpb24iKSk7CitDQ29tVmFyaWFudCBlbXB0eTsKK0FTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChzaGVsbC0+U2hlbGxFeGVjdXRlKENDb21CU1RSKHVybCksIGVtcHR5LCBlbXB0eSwgZW1wdHksIGVtcHR5KSk7CitgYGAKKworX0F2YWlsYWJpbGl0eV86IFdpbmRvd3MuCisKKyMjIFR5cGUgQXNzZXJ0aW9ucyAjIworCitZb3UgY2FuIGNhbGwgdGhlIGZ1bmN0aW9uCitgYGAKKzo6dGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4oKTsKK2BgYAordG8gYXNzZXJ0IHRoYXQgdHlwZXMgYFQxYCBhbmQgYFQyYCBhcmUgdGhlIHNhbWUuICBUaGUgZnVuY3Rpb24gZG9lcworbm90aGluZyBpZiB0aGUgYXNzZXJ0aW9uIGlzIHNhdGlzZmllZC4gIElmIHRoZSB0eXBlcyBhcmUgZGlmZmVyZW50LAordGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBmYWlsIHRvIGNvbXBpbGUsIGFuZCB0aGUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZQord2lsbCBsaWtlbHkgKGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIpIHNob3cgeW91IHRoZSBhY3R1YWwgdmFsdWVzIG9mCitgVDFgIGFuZCBgVDJgLiAgVGhpcyBpcyBtYWlubHkgdXNlZnVsIGluc2lkZSB0ZW1wbGF0ZSBjb2RlLgorCitfQ2F2ZWF0Ol8gV2hlbiB1c2VkIGluc2lkZSBhIG1lbWJlciBmdW5jdGlvbiBvZiBhIGNsYXNzIHRlbXBsYXRlIG9yIGEKK2Z1bmN0aW9uIHRlbXBsYXRlLCBgU3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4oKWAgaXMgZWZmZWN0aXZlIF9vbmx5IGlmXwordGhlIGZ1bmN0aW9uIGlzIGluc3RhbnRpYXRlZC4gIEZvciBleGFtcGxlLCBnaXZlbjoKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZvbyB7CisgcHVibGljOgorICB2b2lkIEJhcigpIHsgOjp0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBUPigpOyB9Cit9OworYGBgCit0aGUgY29kZToKK2BgYAordm9pZCBUZXN0MSgpIHsgRm9vPGJvb2w+IGZvbzsgfQorYGBgCit3aWxsIF9ub3RfIGdlbmVyYXRlIGEgY29tcGlsZXIgZXJyb3IsIGFzIGBGb288Ym9vbD46OkJhcigpYCBpcyBuZXZlcgorYWN0dWFsbHkgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgeW91IG5lZWQ6CitgYGAKK3ZvaWQgVGVzdDIoKSB7IEZvbzxib29sPiBmb287IGZvby5CYXIoKTsgfQorYGBgCit0byBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjMuMC4KKworIyMgQXNzZXJ0aW9uIFBsYWNlbWVudCAjIworCitZb3UgY2FuIHVzZSBhc3NlcnRpb25zIGluIGFueSBDKysgZnVuY3Rpb24uIEluIHBhcnRpY3VsYXIsIGl0IGRvZXNuJ3QKK2hhdmUgdG8gYmUgYSBtZXRob2Qgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcy4gVGhlIG9uZSBjb25zdHJhaW50IGlzCit0aGF0IGFzc2VydGlvbnMgdGhhdCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUgKGBGQUlMKmAgYW5kIGBBU1NFUlRfKmApCitjYW4gb25seSBiZSB1c2VkIGluIHZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9ucy4gVGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mCitHb29nbGUgVGVzdCBub3QgdXNpbmcgZXhjZXB0aW9ucy4gQnkgcGxhY2luZyBpdCBpbiBhIG5vbi12b2lkIGZ1bmN0aW9uCit5b3UnbGwgZ2V0IGEgY29uZnVzaW5nIGNvbXBpbGUgZXJyb3IgbGlrZQorYCJlcnJvcjogdm9pZCB2YWx1ZSBub3QgaWdub3JlZCBhcyBpdCBvdWdodCB0byBiZSJgLgorCitJZiB5b3UgbmVlZCB0byB1c2UgYXNzZXJ0aW9ucyBpbiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBub24tdm9pZCwgb25lIG9wdGlvbgoraXMgdG8gbWFrZSB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBpbiBhbiBvdXQgcGFyYW1ldGVyIGluc3RlYWQuIEZvcgorZXhhbXBsZSwgeW91IGNhbiByZXdyaXRlIGBUMiBGb28oVDEgeClgIHRvIGB2b2lkIEZvbyhUMSB4LCBUMiogcmVzdWx0KWAuIFlvdQorbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBgKnJlc3VsdGAgY29udGFpbnMgc29tZSBzZW5zaWJsZSB2YWx1ZSBldmVuIHdoZW4gdGhlCitmdW5jdGlvbiByZXR1cm5zIHByZW1hdHVyZWx5LiBBcyB0aGUgZnVuY3Rpb24gbm93IHJldHVybnMgYHZvaWRgLCB5b3UgY2FuIHVzZQorYW55IGFzc2VydGlvbiBpbnNpZGUgb2YgaXQuCisKK0lmIGNoYW5naW5nIHRoZSBmdW5jdGlvbidzIHR5cGUgaXMgbm90IGFuIG9wdGlvbiwgeW91IHNob3VsZCBqdXN0IHVzZQorYXNzZXJ0aW9ucyB0aGF0IGdlbmVyYXRlIG5vbi1mYXRhbCBmYWlsdXJlcywgc3VjaCBhcyBgQUREX0ZBSUxVUkUqYCBhbmQKK2BFWFBFQ1RfKmAuCisKK19Ob3RlXzogQ29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgbm90IGNvbnNpZGVyZWQgdm9pZC1yZXR1cm5pbmcKK2Z1bmN0aW9ucywgYWNjb3JkaW5nIHRvIHRoZSBDKysgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiwgYW5kIHNvIHlvdSBtYXkgbm90IHVzZQorZmF0YWwgYXNzZXJ0aW9ucyBpbiB0aGVtLiBZb3UnbGwgZ2V0IGEgY29tcGlsYXRpb24gZXJyb3IgaWYgeW91IHRyeS4gQSBzaW1wbGUKK3dvcmthcm91bmQgaXMgdG8gdHJhbnNmZXIgdGhlIGVudGlyZSBib2R5IG9mIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIHRvIGEKK3ByaXZhdGUgdm9pZC1yZXR1cm5pbmcgbWV0aG9kLiBIb3dldmVyLCB5b3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgYSBmYXRhbAorYXNzZXJ0aW9uIGZhaWx1cmUgaW4gYSBjb25zdHJ1Y3RvciBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIGN1cnJlbnQgdGVzdCwgYXMgeW91cgoraW50dWl0aW9uIG1pZ2h0IHN1Z2dlc3Q7IGl0IG1lcmVseSByZXR1cm5zIGZyb20gdGhlIGNvbnN0cnVjdG9yIGVhcmx5LCBwb3NzaWJseQorbGVhdmluZyB5b3VyIG9iamVjdCBpbiBhIHBhcnRpYWxseS1jb25zdHJ1Y3RlZCBzdGF0ZS4gTGlrZXdpc2UsIGEgZmF0YWwKK2Fzc2VydGlvbiBmYWlsdXJlIGluIGEgZGVzdHJ1Y3RvciBtYXkgbGVhdmUgeW91ciBvYmplY3QgaW4gYQorcGFydGlhbGx5LWRlc3RydWN0ZWQgc3RhdGUuIFVzZSBhc3NlcnRpb25zIGNhcmVmdWxseSBpbiB0aGVzZSBzaXR1YXRpb25zIQorCisjIFRlYWNoaW5nIEdvb2dsZSBUZXN0IEhvdyB0byBQcmludCBZb3VyIFZhbHVlcyAjCisKK1doZW4gYSB0ZXN0IGFzc2VydGlvbiBzdWNoIGFzIGBFWFBFQ1RfRVFgIGZhaWxzLCBHb29nbGUgVGVzdCBwcmludHMgdGhlCithcmd1bWVudCB2YWx1ZXMgdG8gaGVscCB5b3UgZGVidWcuICBJdCBkb2VzIHRoaXMgdXNpbmcgYQordXNlci1leHRlbnNpYmxlIHZhbHVlIHByaW50ZXIuCisKK1RoaXMgcHJpbnRlciBrbm93cyBob3cgdG8gcHJpbnQgYnVpbHQtaW4gQysrIHR5cGVzLCBuYXRpdmUgYXJyYXlzLCBTVEwKK2NvbnRhaW5lcnMsIGFuZCBhbnkgdHlwZSB0aGF0IHN1cHBvcnRzIHRoZSBgPDxgIG9wZXJhdG9yLiAgRm9yIG90aGVyCit0eXBlcywgaXQgcHJpbnRzIHRoZSByYXcgYnl0ZXMgaW4gdGhlIHZhbHVlIGFuZCBob3BlcyB0aGF0IHlvdSB0aGUKK3VzZXIgY2FuIGZpZ3VyZSBpdCBvdXQuCisKK0FzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGUgcHJpbnRlciBpcyBfZXh0ZW5zaWJsZV8uICBUaGF0IG1lYW5zCit5b3UgY2FuIHRlYWNoIGl0IHRvIGRvIGEgYmV0dGVyIGpvYiBhdCBwcmludGluZyB5b3VyIHBhcnRpY3VsYXIgdHlwZQordGhhbiB0byBkdW1wIHRoZSBieXRlcy4gIFRvIGRvIHRoYXQsIGRlZmluZSBgPDxgIGZvciB5b3VyIHR5cGU6CisKK2BgYAorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgQmFyIHsgLi4uIH07ICAvLyBXZSB3YW50IEdvb2dsZSBUZXN0IHRvIGJlIGFibGUgdG8gcHJpbnQgaW5zdGFuY2VzIG9mIHRoaXMuCisKKy8vIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIDw8IG9wZXJhdG9yIGlzIGRlZmluZWQgaW4gdGhlIFNBTUUKKy8vIG5hbWVzcGFjZSB0aGF0IGRlZmluZXMgQmFyLiAgQysrJ3MgbG9vay11cCBydWxlcyByZWx5IG9uIHRoYXQuCis6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEJhciYgYmFyKSB7CisgIHJldHVybiBvcyA8PCBiYXIuRGVidWdTdHJpbmcoKTsgIC8vIHdoYXRldmVyIG5lZWRlZCB0byBwcmludCBiYXIgdG8gb3MKK30KKworfSAgLy8gbmFtZXNwYWNlIGZvbworYGBgCisKK1NvbWV0aW1lcywgdGhpcyBtaWdodCBub3QgYmUgYW4gb3B0aW9uOiB5b3VyIHRlYW0gbWF5IGNvbnNpZGVyIGl0IGJhZAorc3R5bGUgdG8gaGF2ZSBhIGA8PGAgb3BlcmF0b3IgZm9yIGBCYXJgLCBvciBgQmFyYCBtYXkgYWxyZWFkeSBoYXZlIGEKK2A8PGAgb3BlcmF0b3IgdGhhdCBkb2Vzbid0IGRvIHdoYXQgeW91IHdhbnQgKGFuZCB5b3UgY2Fubm90IGNoYW5nZQoraXQpLiAgSWYgc28sIHlvdSBjYW4gaW5zdGVhZCBkZWZpbmUgYSBgUHJpbnRUbygpYCBmdW5jdGlvbiBsaWtlIHRoaXM6CisKK2BgYAorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgQmFyIHsgLi4uIH07CisKKy8vIEl0J3MgaW1wb3J0YW50IHRoYXQgUHJpbnRUbygpIGlzIGRlZmluZWQgaW4gdGhlIFNBTUUKKy8vIG5hbWVzcGFjZSB0aGF0IGRlZmluZXMgQmFyLiAgQysrJ3MgbG9vay11cCBydWxlcyByZWx5IG9uIHRoYXQuCit2b2lkIFByaW50VG8oY29uc3QgQmFyJiBiYXIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgYmFyLkRlYnVnU3RyaW5nKCk7ICAvLyB3aGF0ZXZlciBuZWVkZWQgdG8gcHJpbnQgYmFyIHRvIG9zCit9CisKK30gIC8vIG5hbWVzcGFjZSBmb28KK2BgYAorCitJZiB5b3UgaGF2ZSBkZWZpbmVkIGJvdGggYDw8YCBhbmQgYFByaW50VG8oKWAsIHRoZSBsYXR0ZXIgd2lsbCBiZSB1c2VkCit3aGVuIEdvb2dsZSBUZXN0IGlzIGNvbmNlcm5lZC4gIFRoaXMgYWxsb3dzIHlvdSB0byBjdXN0b21pemUgaG93IHRoZSB2YWx1ZQorYXBwZWFycyBpbiBHb29nbGUgVGVzdCdzIG91dHB1dCB3aXRob3V0IGFmZmVjdGluZyBjb2RlIHRoYXQgcmVsaWVzIG9uIHRoZQorYmVoYXZpb3Igb2YgaXRzIGA8PGAgb3BlcmF0b3IuCisKK0lmIHlvdSB3YW50IHRvIHByaW50IGEgdmFsdWUgYHhgIHVzaW5nIEdvb2dsZSBUZXN0J3MgdmFsdWUgcHJpbnRlcgoreW91cnNlbGYsIGp1c3QgY2FsbCBgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKGBfeF9gKWAsIHdoaWNoCityZXR1cm5zIGFuIGBzdGQ6OnN0cmluZ2A6CisKK2BgYAordmVjdG9yPHBhaXI8QmFyLCBpbnQ+ID4gYmFyX2ludHMgPSBHZXRCYXJJbnRWZWN0b3IoKTsKKworRVhQRUNUX1RSVUUoSXNDb3JyZWN0QmFySW50VmVjdG9yKGJhcl9pbnRzKSkKKyAgICA8PCAiYmFyX2ludHMgPSAiIDw8IDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhiYXJfaW50cyk7CitgYGAKKworIyBEZWF0aCBUZXN0cyAjCisKK0luIG1hbnkgYXBwbGljYXRpb25zLCB0aGVyZSBhcmUgYXNzZXJ0aW9ucyB0aGF0IGNhbiBjYXVzZSBhcHBsaWNhdGlvbiBmYWlsdXJlCitpZiBhIGNvbmRpdGlvbiBpcyBub3QgbWV0LiBUaGVzZSBzYW5pdHkgY2hlY2tzLCB3aGljaCBlbnN1cmUgdGhhdCB0aGUgcHJvZ3JhbQoraXMgaW4gYSBrbm93biBnb29kIHN0YXRlLCBhcmUgdGhlcmUgdG8gZmFpbCBhdCB0aGUgZWFybGllc3QgcG9zc2libGUgdGltZSBhZnRlcgorc29tZSBwcm9ncmFtIHN0YXRlIGlzIGNvcnJ1cHRlZC4gSWYgdGhlIGFzc2VydGlvbiBjaGVja3MgdGhlIHdyb25nIGNvbmRpdGlvbiwKK3RoZW4gdGhlIHByb2dyYW0gbWF5IHByb2NlZWQgaW4gYW4gZXJyb25lb3VzIHN0YXRlLCB3aGljaCBjb3VsZCBsZWFkIHRvIG1lbW9yeQorY29ycnVwdGlvbiwgc2VjdXJpdHkgaG9sZXMsIG9yIHdvcnNlLiBIZW5jZSBpdCBpcyB2aXRhbGx5IGltcG9ydGFudCB0byB0ZXN0Cit0aGF0IHN1Y2ggYXNzZXJ0aW9uIHN0YXRlbWVudHMgd29yayBhcyBleHBlY3RlZC4KKworU2luY2UgdGhlc2UgcHJlY29uZGl0aW9uIGNoZWNrcyBjYXVzZSB0aGUgcHJvY2Vzc2VzIHRvIGRpZSwgd2UgY2FsbCBzdWNoIHRlc3RzCitfZGVhdGggdGVzdHNfLiBNb3JlIGdlbmVyYWxseSwgYW55IHRlc3QgdGhhdCBjaGVja3MgdGhhdCBhIHByb2dyYW0gdGVybWluYXRlcworKGV4Y2VwdCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24pIGluIGFuIGV4cGVjdGVkIGZhc2hpb24gaXMgYWxzbyBhIGRlYXRoIHRlc3QuCisKK05vdGUgdGhhdCBpZiBhIHBpZWNlIG9mIGNvZGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgd2UgZG9uJ3QgY29uc2lkZXIgaXQgImRlYXRoIgorZm9yIHRoZSBwdXJwb3NlIG9mIGRlYXRoIHRlc3RzLCBhcyB0aGUgY2FsbGVyIG9mIHRoZSBjb2RlIGNvdWxkIGNhdGNoIHRoZSBleGNlcHRpb24KK2FuZCBhdm9pZCB0aGUgY3Jhc2guIElmIHlvdSB3YW50IHRvIHZlcmlmeSBleGNlcHRpb25zIHRocm93biBieSB5b3VyIGNvZGUsCitzZWUgW0V4Y2VwdGlvbiBBc3NlcnRpb25zXSgjRXhjZXB0aW9uX0Fzc2VydGlvbnMubWQpLgorCitJZiB5b3Ugd2FudCB0byB0ZXN0IGBFWFBFQ1RfKigpL0FTU0VSVF8qKClgIGZhaWx1cmVzIGluIHlvdXIgdGVzdCBjb2RlLCBzZWUgW0NhdGNoaW5nIEZhaWx1cmVzXSgjQ2F0Y2hpbmdfRmFpbHVyZXMubWQpLgorCisjIyBIb3cgdG8gV3JpdGUgYSBEZWF0aCBUZXN0ICMjCisKK0dvb2dsZSBUZXN0IGhhcyB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBzdXBwb3J0IGRlYXRoIHRlc3RzOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX0RFQVRIKGBfc3RhdGVtZW50LCByZWdleF9gKTsgfCBgRVhQRUNUX0RFQVRIKGBfc3RhdGVtZW50LCByZWdleF9gKTsgfCBfc3RhdGVtZW50XyBjcmFzaGVzIHdpdGggdGhlIGdpdmVuIGVycm9yIHwKK3wgYEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoYF9zdGF0ZW1lbnQsIHJlZ2V4X2ApOyB8IGBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKGBfc3RhdGVtZW50LCByZWdleF9gKTsgfCBpZiBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkLCB2ZXJpZmllcyB0aGF0IF9zdGF0ZW1lbnRfIGNyYXNoZXMgd2l0aCB0aGUgZ2l2ZW4gZXJyb3I7IG90aGVyd2lzZSB2ZXJpZmllcyBub3RoaW5nIHwKK3wgYEFTU0VSVF9FWElUKGBfc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4X2ApOyB8IGBFWFBFQ1RfRVhJVChgX3N0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleF9gKTsgfF9zdGF0ZW1lbnRfIGV4aXRzIHdpdGggdGhlIGdpdmVuIGVycm9yIGFuZCBpdHMgZXhpdCBjb2RlIG1hdGNoZXMgX3ByZWRpY2F0ZV8gfAorCit3aGVyZSBfc3RhdGVtZW50XyBpcyBhIHN0YXRlbWVudCB0aGF0IGlzIGV4cGVjdGVkIHRvIGNhdXNlIHRoZSBwcm9jZXNzIHRvCitkaWUsIF9wcmVkaWNhdGVfIGlzIGEgZnVuY3Rpb24gb3IgZnVuY3Rpb24gb2JqZWN0IHRoYXQgZXZhbHVhdGVzIGFuIGludGVnZXIKK2V4aXQgc3RhdHVzLCBhbmQgX3JlZ2V4XyBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHRoZSBzdGRlcnIgb3V0cHV0IG9mCitfc3RhdGVtZW50XyBpcyBleHBlY3RlZCB0byBtYXRjaC4gTm90ZSB0aGF0IF9zdGF0ZW1lbnRfIGNhbiBiZSBfYW55IHZhbGlkCitzdGF0ZW1lbnRfIChpbmNsdWRpbmcgX2NvbXBvdW5kIHN0YXRlbWVudF8pIGFuZCBkb2Vzbid0IGhhdmUgdG8gYmUgYW4KK2V4cHJlc3Npb24uCisKK0FzIHVzdWFsLCB0aGUgYEFTU0VSVGAgdmFyaWFudHMgYWJvcnQgdGhlIGN1cnJlbnQgdGVzdCBmdW5jdGlvbiwgd2hpbGUgdGhlCitgRVhQRUNUYCB2YXJpYW50cyBkbyBub3QuCisKKyoqTm90ZToqKiBXZSB1c2UgdGhlIHdvcmQgImNyYXNoIiBoZXJlIHRvIG1lYW4gdGhhdCB0aGUgcHJvY2VzcwordGVybWluYXRlcyB3aXRoIGEgX25vbi16ZXJvXyBleGl0IHN0YXR1cyBjb2RlLiAgVGhlcmUgYXJlIHR3bworcG9zc2liaWxpdGllczogZWl0aGVyIHRoZSBwcm9jZXNzIGhhcyBjYWxsZWQgYGV4aXQoKWAgb3IgYF9leGl0KClgCit3aXRoIGEgbm9uLXplcm8gdmFsdWUsIG9yIGl0IG1heSBiZSBraWxsZWQgYnkgYSBzaWduYWwuCisKK1RoaXMgbWVhbnMgdGhhdCBpZiBfc3RhdGVtZW50XyB0ZXJtaW5hdGVzIHRoZSBwcm9jZXNzIHdpdGggYSAwIGV4aXQKK2NvZGUsIGl0IGlzIF9ub3RfIGNvbnNpZGVyZWQgYSBjcmFzaCBieSBgRVhQRUNUX0RFQVRIYC4gIFVzZQorYEVYUEVDVF9FWElUYCBpbnN0ZWFkIGlmIHRoaXMgaXMgdGhlIGNhc2UsIG9yIGlmIHlvdSB3YW50IHRvIHJlc3RyaWN0Cit0aGUgZXhpdCBjb2RlIG1vcmUgcHJlY2lzZWx5LgorCitBIHByZWRpY2F0ZSBoZXJlIG11c3QgYWNjZXB0IGFuIGBpbnRgIGFuZCByZXR1cm4gYSBgYm9vbGAuIFRoZSBkZWF0aCB0ZXN0CitzdWNjZWVkcyBvbmx5IGlmIHRoZSBwcmVkaWNhdGUgcmV0dXJucyBgdHJ1ZWAuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBmZXcKK3ByZWRpY2F0ZXMgdGhhdCBoYW5kbGUgdGhlIG1vc3QgY29tbW9uIGNhc2VzOgorCitgYGAKKzo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoZXhpdF9jb2RlKQorYGBgCisKK1RoaXMgZXhwcmVzc2lvbiBpcyBgdHJ1ZWAgaWYgdGhlIHByb2dyYW0gZXhpdGVkIG5vcm1hbGx5IHdpdGggdGhlIGdpdmVuIGV4aXQKK2NvZGUuCisKK2BgYAorOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChzaWduYWxfbnVtYmVyKSAgLy8gTm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorYGBgCisKK1RoaXMgZXhwcmVzc2lvbiBpcyBgdHJ1ZWAgaWYgdGhlIHByb2dyYW0gd2FzIGtpbGxlZCBieSB0aGUgZ2l2ZW4gc2lnbmFsLgorCitUaGUgYCpfREVBVEhgIG1hY3JvcyBhcmUgY29udmVuaWVudCB3cmFwcGVycyBmb3IgYCpfRVhJVGAgdGhhdCB1c2UgYSBwcmVkaWNhdGUKK3RoYXQgdmVyaWZpZXMgdGhlIHByb2Nlc3MnIGV4aXQgY29kZSBpcyBub24temVyby4KKworTm90ZSB0aGF0IGEgZGVhdGggdGVzdCBvbmx5IGNhcmVzIGFib3V0IHRocmVlIHRoaW5nczoKKworICAxLiBkb2VzIF9zdGF0ZW1lbnRfIGFib3J0IG9yIGV4aXQgdGhlIHByb2Nlc3M/CisgIDEuIChpbiB0aGUgY2FzZSBvZiBgQVNTRVJUX0VYSVRgIGFuZCBgRVhQRUNUX0VYSVRgKSBkb2VzIHRoZSBleGl0IHN0YXR1cyBzYXRpc2Z5IF9wcmVkaWNhdGVfPyAgT3IgKGluIHRoZSBjYXNlIG9mIGBBU1NFUlRfREVBVEhgIGFuZCBgRVhQRUNUX0RFQVRIYCkgaXMgdGhlIGV4aXQgc3RhdHVzIG5vbi16ZXJvPyAgQW5kCisgIDEuIGRvZXMgdGhlIHN0ZGVyciBvdXRwdXQgbWF0Y2ggX3JlZ2V4Xz8KKworSW4gcGFydGljdWxhciwgaWYgX3N0YXRlbWVudF8gZ2VuZXJhdGVzIGFuIGBBU1NFUlRfKmAgb3IgYEVYUEVDVF8qYCBmYWlsdXJlLCBpdCB3aWxsICoqbm90KiogY2F1c2UgdGhlIGRlYXRoIHRlc3QgdG8gZmFpbCwgYXMgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBkb24ndCBhYm9ydCB0aGUgcHJvY2Vzcy4KKworVG8gd3JpdGUgYSBkZWF0aCB0ZXN0LCBzaW1wbHkgdXNlIG9uZSBvZiB0aGUgYWJvdmUgbWFjcm9zIGluc2lkZSB5b3VyIHRlc3QKK2Z1bmN0aW9uLiBGb3IgZXhhbXBsZSwKKworYGBgCitURVNUKE15KkRlYXRoVGVzdCosIEZvbykgeworICAvLyBUaGlzIGRlYXRoIHRlc3QgdXNlcyBhIGNvbXBvdW5kIHN0YXRlbWVudC4KKyAgQVNTRVJUX0RFQVRIKHsgaW50IG4gPSA1OyBGb28oJm4pOyB9LCAiRXJyb3Igb24gbGluZSAuKiBvZiBGb28oKSIpOworfQorVEVTVChNeURlYXRoVGVzdCwgTm9ybWFsRXhpdCkgeworICBFWFBFQ1RfRVhJVChOb3JtYWxFeGl0KCksIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICJTdWNjZXNzIik7Cit9CitURVNUKE15RGVhdGhUZXN0LCBLaWxsTXlzZWxmKSB7CisgIEVYUEVDVF9FWElUKEtpbGxNeXNlbGYoKSwgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdLSUxMKSwgIlNlbmRpbmcgbXlzZWxmIHVuYmxvY2thYmxlIHNpZ25hbCIpOworfQorYGBgCisKK3ZlcmlmaWVzIHRoYXQ6CisKKyAgKiBjYWxsaW5nIGBGb28oNSlgIGNhdXNlcyB0aGUgcHJvY2VzcyB0byBkaWUgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSwKKyAgKiBjYWxsaW5nIGBOb3JtYWxFeGl0KClgIGNhdXNlcyB0aGUgcHJvY2VzcyB0byBwcmludCBgIlN1Y2Nlc3MiYCB0byBzdGRlcnIgYW5kIGV4aXQgd2l0aCBleGl0IGNvZGUgMCwgYW5kCisgICogY2FsbGluZyBgS2lsbE15c2VsZigpYCBraWxscyB0aGUgcHJvY2VzcyB3aXRoIHNpZ25hbCBgU0lHS0lMTGAuCisKK1RoZSB0ZXN0IGZ1bmN0aW9uIGJvZHkgbWF5IGNvbnRhaW4gb3RoZXIgYXNzZXJ0aW9ucyBhbmQgc3RhdGVtZW50cyBhcyB3ZWxsLCBpZgorbmVjZXNzYXJ5LgorCitfSW1wb3J0YW50Ol8gV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdSB0byBmb2xsb3cgdGhlIGNvbnZlbnRpb24gb2YgbmFtaW5nIHlvdXIKK3Rlc3QgY2FzZSAobm90IHRlc3QpIGAqRGVhdGhUZXN0YCB3aGVuIGl0IGNvbnRhaW5zIGEgZGVhdGggdGVzdCwgYXMKK2RlbW9uc3RyYXRlZCBpbiB0aGUgYWJvdmUgZXhhbXBsZS4gVGhlIGBEZWF0aCBUZXN0cyBBbmQgVGhyZWFkc2Agc2VjdGlvbiBiZWxvdworZXhwbGFpbnMgd2h5LgorCitJZiBhIHRlc3QgZml4dHVyZSBjbGFzcyBpcyBzaGFyZWQgYnkgbm9ybWFsIHRlc3RzIGFuZCBkZWF0aCB0ZXN0cywgeW91CitjYW4gdXNlIHR5cGVkZWYgdG8gaW50cm9kdWNlIGFuIGFsaWFzIGZvciB0aGUgZml4dHVyZSBjbGFzcyBhbmQgYXZvaWQKK2R1cGxpY2F0aW5nIGl0cyBjb2RlOgorYGBgCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7IC4uLiB9OworCit0eXBlZGVmIEZvb1Rlc3QgRm9vRGVhdGhUZXN0OworCitURVNUX0YoRm9vVGVzdCwgRG9lc1RoaXMpIHsKKyAgLy8gbm9ybWFsIHRlc3QKK30KKworVEVTVF9GKEZvb0RlYXRoVGVzdCwgRG9lc1RoYXQpIHsKKyAgLy8gZGVhdGggdGVzdAorfQorYGBgCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cyAocmVxdWlyZXMgTVNWQyA4LjAgb3IgYWJvdmUpLCBDeWd3aW4sIGFuZCBNYWMgKHRoZSBsYXR0ZXIgdGhyZWUgYXJlIHN1cHBvcnRlZCBzaW5jZSB2MS4zLjApLiAgYChBU1NFUlR8RVhQRUNUKV9ERUFUSF9JRl9TVVBQT1JURURgIGFyZSBuZXcgaW4gdjEuNC4wLgorCisjIyBSZWd1bGFyIEV4cHJlc3Npb24gU3ludGF4ICMjCisKK09uIFBPU0lYIHN5c3RlbXMgKGUuZy4gTGludXgsIEN5Z3dpbiwgYW5kIE1hYyksIEdvb2dsZSBUZXN0IHVzZXMgdGhlCitbUE9TSVggZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uXShodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvYmFzZWRlZnMveGJkX2NoYXAwOS5odG1sI3RhZ18wOV8wNCkKK3N5bnRheCBpbiBkZWF0aCB0ZXN0cy4gVG8gbGVhcm4gYWJvdXQgdGhpcyBzeW50YXgsIHlvdSBtYXkgd2FudCB0byByZWFkIHRoaXMgW1dpa2lwZWRpYSBlbnRyeV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWd1bGFyX2V4cHJlc3Npb24jUE9TSVhfRXh0ZW5kZWRfUmVndWxhcl9FeHByZXNzaW9ucykuCisKK09uIFdpbmRvd3MsIEdvb2dsZSBUZXN0IHVzZXMgaXRzIG93biBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uCitpbXBsZW1lbnRhdGlvbi4gSXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUE9TSVggZXh0ZW5kZWQKK3JlZ3VsYXIgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydCB1bmlvbiAoYCJ4fHkiYCksCitncm91cGluZyAoYCIoeHkpImApLCBicmFja2V0cyAoYCJbeHldImApLCBhbmQgcmVwZXRpdGlvbiBjb3VudAorKGAieHs1LDd9ImApLCBhbW9uZyBvdGhlcnMuIEJlbG93IGlzIHdoYXQgd2UgZG8gc3VwcG9ydCAoYEFgIGRlbm90ZXMgYQorbGl0ZXJhbCBjaGFyYWN0ZXIsIHBlcmlvZCAoYC5gKSwgb3IgYSBzaW5nbGUgYFxcYCBlc2NhcGUgc2VxdWVuY2U7IGB4YAorYW5kIGB5YCBkZW5vdGUgcmVndWxhciBleHByZXNzaW9ucy4pOgorCit8IGBjYCB8IG1hdGNoZXMgYW55IGxpdGVyYWwgY2hhcmFjdGVyIGBjYCB8Cit8Oi0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBcXGRgIHwgbWF0Y2hlcyBhbnkgZGVjaW1hbCBkaWdpdCAgICAgICAgIHwKK3wgYFxcRGAgfCBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIGRlY2ltYWwgZGlnaXQgfAorfCBgXFxmYCB8IG1hdGNoZXMgYFxmYCAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBcXG5gIHwgbWF0Y2hlcyBgXG5gICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYFxccmAgfCBtYXRjaGVzIGBccmAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgXFxzYCB8IG1hdGNoZXMgYW55IEFTQ0lJIHdoaXRlc3BhY2UsIGluY2x1ZGluZyBgXG5gIHwKK3wgYFxcU2AgfCBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIHdoaXRlc3BhY2UgfAorfCBgXFx0YCB8IG1hdGNoZXMgYFx0YCAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBcXHZgIHwgbWF0Y2hlcyBgXHZgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYFxcd2AgfCBtYXRjaGVzIGFueSBsZXR0ZXIsIGBfYCwgb3IgZGVjaW1hbCBkaWdpdCB8Cit8IGBcXFdgIHwgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQgYFxcd2AgZG9lc24ndCBtYXRjaCB8Cit8IGBcXGNgIHwgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYGNgLCB3aGljaCBtdXN0IGJlIGEgcHVuY3R1YXRpb24gfAorfCBgLmAgfCBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIGV4Y2VwdCBgXG5gIHwKK3wgYEE/YCB8IG1hdGNoZXMgMCBvciAxIG9jY3VycmVuY2VzIG9mIGBBYCB8Cit8IGBBKmAgfCBtYXRjaGVzIDAgb3IgbWFueSBvY2N1cnJlbmNlcyBvZiBgQWAgfAorfCBgQStgIHwgbWF0Y2hlcyAxIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgYEFgIHwKK3wgYF5gIHwgbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RyaW5nIChub3QgdGhhdCBvZiBlYWNoIGxpbmUpIHwKK3wgYCRgIHwgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nIChub3QgdGhhdCBvZiBlYWNoIGxpbmUpIHwKK3wgYHh5YCB8IG1hdGNoZXMgYHhgIGZvbGxvd2VkIGJ5IGB5YCAgICAgICB8CisKK1RvIGhlbHAgeW91IGRldGVybWluZSB3aGljaCBjYXBhYmlsaXR5IGlzIGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbSwKK0dvb2dsZSBUZXN0IGRlZmluZXMgbWFjcm8gYEdURVNUX1VTRVNfUE9TSVhfUkU9MWAgd2hlbiBpdCB1c2VzIFBPU0lYCitleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb25zLCBvciBgR1RFU1RfVVNFU19TSU1QTEVfUkU9MWAgd2hlbiBpdCB1c2VzCit0aGUgc2ltcGxlIHZlcnNpb24uICBJZiB5b3Ugd2FudCB5b3VyIGRlYXRoIHRlc3RzIHRvIHdvcmsgaW4gYm90aAorY2FzZXMsIHlvdSBjYW4gZWl0aGVyIGAjaWZgIG9uIHRoZXNlIG1hY3JvcyBvciB1c2UgdGhlIG1vcmUgbGltaXRlZAorc3ludGF4IG9ubHkuCisKKyMjIEhvdyBJdCBXb3JrcyAjIworCitVbmRlciB0aGUgaG9vZCwgYEFTU0VSVF9FWElUKClgIHNwYXducyBhIG5ldyBwcm9jZXNzIGFuZCBleGVjdXRlcyB0aGUKK2RlYXRoIHRlc3Qgc3RhdGVtZW50IGluIHRoYXQgcHJvY2Vzcy4gVGhlIGRldGFpbHMgb2Ygb2YgaG93IHByZWNpc2VseQordGhhdCBoYXBwZW5zIGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0gYW5kIHRoZSB2YXJpYWJsZQorYDo6dGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKWAgKHdoaWNoIGlzIGluaXRpYWxpemVkIGZyb20gdGhlCitjb21tYW5kLWxpbmUgZmxhZyBgLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlYCkuCisKKyAgKiBPbiBQT1NJWCBzeXN0ZW1zLCBgZm9yaygpYCAob3IgYGNsb25lKClgIG9uIExpbnV4KSBpcyB1c2VkIHRvIHNwYXduIHRoZSBjaGlsZCwgYWZ0ZXIgd2hpY2g6CisgICAgKiBJZiB0aGUgdmFyaWFibGUncyB2YWx1ZSBpcyBgImZhc3QiYCwgdGhlIGRlYXRoIHRlc3Qgc3RhdGVtZW50IGlzIGltbWVkaWF0ZWx5IGV4ZWN1dGVkLgorICAgICogSWYgdGhlIHZhcmlhYmxlJ3MgdmFsdWUgaXMgYCJ0aHJlYWRzYWZlImAsIHRoZSBjaGlsZCBwcm9jZXNzIHJlLWV4ZWN1dGVzIHRoZSB1bml0IHRlc3QgYmluYXJ5IGp1c3QgYXMgaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZCwgYnV0IHdpdGggc29tZSBleHRyYSBmbGFncyB0byBjYXVzZSBqdXN0IHRoZSBzaW5nbGUgZGVhdGggdGVzdCB1bmRlciBjb25zaWRlcmF0aW9uIHRvIGJlIHJ1bi4KKyAgKiBPbiBXaW5kb3dzLCB0aGUgY2hpbGQgaXMgc3Bhd25lZCB1c2luZyB0aGUgYENyZWF0ZVByb2Nlc3MoKWAgQVBJLCBhbmQgcmUtZXhlY3V0ZXMgdGhlIGJpbmFyeSB0byBjYXVzZSBqdXN0IHRoZSBzaW5nbGUgZGVhdGggdGVzdCB1bmRlciBjb25zaWRlcmF0aW9uIHRvIGJlIHJ1biAtIG11Y2ggbGlrZSB0aGUgYHRocmVhZHNhZmVgIG1vZGUgb24gUE9TSVguCisKK090aGVyIHZhbHVlcyBmb3IgdGhlIHZhcmlhYmxlIGFyZSBpbGxlZ2FsIGFuZCB3aWxsIGNhdXNlIHRoZSBkZWF0aCB0ZXN0IHRvCitmYWlsLiBDdXJyZW50bHksIHRoZSBmbGFnJ3MgZGVmYXVsdCB2YWx1ZSBpcyBgImZhc3QiYC4gSG93ZXZlciwgd2UgcmVzZXJ2ZSB0aGUKK3JpZ2h0IHRvIGNoYW5nZSBpdCBpbiB0aGUgZnV0dXJlLiBUaGVyZWZvcmUsIHlvdXIgdGVzdHMgc2hvdWxkIG5vdCBkZXBlbmQgb24KK3RoaXMuCisKK0luIGVpdGhlciBjYXNlLCB0aGUgcGFyZW50IHByb2Nlc3Mgd2FpdHMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGNvbXBsZXRlLCBhbmQgY2hlY2tzIHRoYXQKKworICAxLiB0aGUgY2hpbGQncyBleGl0IHN0YXR1cyBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZSwgYW5kCisgIDEuIHRoZSBjaGlsZCdzIHN0ZGVyciBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisKK0lmIHRoZSBkZWF0aCB0ZXN0IHN0YXRlbWVudCBydW5zIHRvIGNvbXBsZXRpb24gd2l0aG91dCBkeWluZywgdGhlIGNoaWxkCitwcm9jZXNzIHdpbGwgbm9uZXRoZWxlc3MgdGVybWluYXRlLCBhbmQgdGhlIGFzc2VydGlvbiBmYWlscy4KKworIyMgRGVhdGggVGVzdHMgQW5kIFRocmVhZHMgIyMKKworVGhlIHJlYXNvbiBmb3IgdGhlIHR3byBkZWF0aCB0ZXN0IHN0eWxlcyBoYXMgdG8gZG8gd2l0aCB0aHJlYWQgc2FmZXR5LiBEdWUgdG8KK3dlbGwta25vd24gcHJvYmxlbXMgd2l0aCBmb3JraW5nIGluIHRoZSBwcmVzZW5jZSBvZiB0aHJlYWRzLCBkZWF0aCB0ZXN0cyBzaG91bGQKK2JlIHJ1biBpbiBhIHNpbmdsZS10aHJlYWRlZCBjb250ZXh0LiBTb21ldGltZXMsIGhvd2V2ZXIsIGl0IGlzbid0IGZlYXNpYmxlIHRvCithcnJhbmdlIHRoYXQga2luZCBvZiBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIHN0YXRpY2FsbHktaW5pdGlhbGl6ZWQgbW9kdWxlcworbWF5IHN0YXJ0IHRocmVhZHMgYmVmb3JlIG1haW4gaXMgZXZlciByZWFjaGVkLiBPbmNlIHRocmVhZHMgaGF2ZSBiZWVuIGNyZWF0ZWQsCitpdCBtYXkgYmUgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8gY2xlYW4gdGhlbSB1cC4KKworR29vZ2xlIFRlc3QgaGFzIHRocmVlIGZlYXR1cmVzIGludGVuZGVkIHRvIHJhaXNlIGF3YXJlbmVzcyBvZiB0aHJlYWRpbmcgaXNzdWVzLgorCisgIDEuIEEgd2FybmluZyBpcyBlbWl0dGVkIGlmIG11bHRpcGxlIHRocmVhZHMgYXJlIHJ1bm5pbmcgd2hlbiBhIGRlYXRoIHRlc3QgaXMgZW5jb3VudGVyZWQuCisgIDEuIFRlc3QgY2FzZXMgd2l0aCBhIG5hbWUgZW5kaW5nIGluICJEZWF0aFRlc3QiIGFyZSBydW4gYmVmb3JlIGFsbCBvdGhlciB0ZXN0cy4KKyAgMS4gSXQgdXNlcyBgY2xvbmUoKWAgaW5zdGVhZCBvZiBgZm9yaygpYCB0byBzcGF3biB0aGUgY2hpbGQgcHJvY2VzcyBvbiBMaW51eCAoYGNsb25lKClgIGlzIG5vdCBhdmFpbGFibGUgb24gQ3lnd2luIGFuZCBNYWMpLCBhcyBgZm9yaygpYCBpcyBtb3JlIGxpa2VseSB0byBjYXVzZSB0aGUgY2hpbGQgdG8gaGFuZyB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBoYXMgbXVsdGlwbGUgdGhyZWFkcy4KKworSXQncyBwZXJmZWN0bHkgZmluZSB0byBjcmVhdGUgdGhyZWFkcyBpbnNpZGUgYSBkZWF0aCB0ZXN0IHN0YXRlbWVudDsgdGhleSBhcmUKK2V4ZWN1dGVkIGluIGEgc2VwYXJhdGUgcHJvY2VzcyBhbmQgY2Fubm90IGFmZmVjdCB0aGUgcGFyZW50LgorCisjIyBEZWF0aCBUZXN0IFN0eWxlcyAjIworCitUaGUgInRocmVhZHNhZmUiIGRlYXRoIHRlc3Qgc3R5bGUgd2FzIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gaGVscCBtaXRpZ2F0ZSB0aGUKK3Jpc2tzIG9mIHRlc3RpbmcgaW4gYSBwb3NzaWJseSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50LiBJdCB0cmFkZXMgaW5jcmVhc2VkCit0ZXN0IGV4ZWN1dGlvbiB0aW1lIChwb3RlbnRpYWxseSBkcmFtYXRpY2FsbHkgc28pIGZvciBpbXByb3ZlZCB0aHJlYWQgc2FmZXR5LgorV2Ugc3VnZ2VzdCB1c2luZyB0aGUgZmFzdGVyLCBkZWZhdWx0ICJmYXN0IiBzdHlsZSB1bmxlc3MgeW91ciB0ZXN0IGhhcyBzcGVjaWZpYworcHJvYmxlbXMgd2l0aCBpdC4KKworWW91IGNhbiBjaG9vc2UgYSBwYXJ0aWN1bGFyIHN0eWxlIG9mIGRlYXRoIHRlc3RzIGJ5IHNldHRpbmcgdGhlIGZsYWcKK3Byb2dyYW1tYXRpY2FsbHk6CisKK2BgYAorOjp0ZXN0aW5nOjpGTEFHU19ndGVzdF9kZWF0aF90ZXN0X3N0eWxlID0gInRocmVhZHNhZmUiOworYGBgCisKK1lvdSBjYW4gZG8gdGhpcyBpbiBgbWFpbigpYCB0byBzZXQgdGhlIHN0eWxlIGZvciBhbGwgZGVhdGggdGVzdHMgaW4gdGhlCitiaW5hcnksIG9yIGluIGluZGl2aWR1YWwgdGVzdHMuIFJlY2FsbCB0aGF0IGZsYWdzIGFyZSBzYXZlZCBiZWZvcmUgcnVubmluZyBlYWNoCit0ZXN0IGFuZCByZXN0b3JlZCBhZnRlcndhcmRzLCBzbyB5b3UgbmVlZCBub3QgZG8gdGhhdCB5b3Vyc2VsZi4gRm9yIGV4YW1wbGU6CisKK2BgYAorVEVTVChNeURlYXRoVGVzdCwgVGVzdE9uZSkgeworICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAidGhyZWFkc2FmZSI7CisgIC8vIFRoaXMgdGVzdCBpcyBydW4gaW4gdGhlICJ0aHJlYWRzYWZlIiBzdHlsZToKKyAgQVNTRVJUX0RFQVRIKFRoaXNTaG91bGREaWUoKSwgIiIpOworfQorCitURVNUKE15RGVhdGhUZXN0LCBUZXN0VHdvKSB7CisgIC8vIFRoaXMgdGVzdCBpcyBydW4gaW4gdGhlICJmYXN0IiBzdHlsZToKKyAgQVNTRVJUX0RFQVRIKFRoaXNTaG91bGREaWUoKSwgIiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIDo6dGVzdGluZzo6RkxBR1NfZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSA9ICJmYXN0IjsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KK2BgYAorCisjIyBDYXZlYXRzICMjCisKK1RoZSBfc3RhdGVtZW50XyBhcmd1bWVudCBvZiBgQVNTRVJUX0VYSVQoKWAgY2FuIGJlIGFueSB2YWxpZCBDKysgc3RhdGVtZW50LgorSWYgaXQgbGVhdmVzIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHZpYSBhIGByZXR1cm5gIHN0YXRlbWVudCBvciBieSB0aHJvd2luZyBhbiBleGNlcHRpb24sCit0aGUgZGVhdGggdGVzdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkLiAgU29tZSBHb29nbGUgVGVzdCBtYWNyb3MgbWF5IHJldHVybgorZnJvbSB0aGUgY3VycmVudCBmdW5jdGlvbiAoZS5nLiBgQVNTRVJUX1RSVUUoKWApLCBzbyBiZSBzdXJlIHRvIGF2b2lkIHRoZW0gaW4gX3N0YXRlbWVudF8uCisKK1NpbmNlIF9zdGF0ZW1lbnRfIHJ1bnMgaW4gdGhlIGNoaWxkIHByb2Nlc3MsIGFueSBpbi1tZW1vcnkgc2lkZSBlZmZlY3QgKGUuZy4KK21vZGlmeWluZyBhIHZhcmlhYmxlLCByZWxlYXNpbmcgbWVtb3J5LCBldGMpIGl0IGNhdXNlcyB3aWxsIF9ub3RfIGJlIG9ic2VydmFibGUKK2luIHRoZSBwYXJlbnQgcHJvY2Vzcy4gSW4gcGFydGljdWxhciwgaWYgeW91IHJlbGVhc2UgbWVtb3J5IGluIGEgZGVhdGggdGVzdCwKK3lvdXIgcHJvZ3JhbSB3aWxsIGZhaWwgdGhlIGhlYXAgY2hlY2sgYXMgdGhlIHBhcmVudCBwcm9jZXNzIHdpbGwgbmV2ZXIgc2VlIHRoZQorbWVtb3J5IHJlY2xhaW1lZC4gVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB5b3UgY2FuCisKKyAgMS4gdHJ5IG5vdCB0byBmcmVlIG1lbW9yeSBpbiBhIGRlYXRoIHRlc3Q7CisgIDEuIGZyZWUgdGhlIG1lbW9yeSBhZ2FpbiBpbiB0aGUgcGFyZW50IHByb2Nlc3M7IG9yCisgIDEuIGRvIG5vdCB1c2UgdGhlIGhlYXAgY2hlY2tlciBpbiB5b3VyIHByb2dyYW0uCisKK0R1ZSB0byBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHlvdSBjYW5ub3QgcGxhY2UgbXVsdGlwbGUgZGVhdGggdGVzdAorYXNzZXJ0aW9ucyBvbiB0aGUgc2FtZSBsaW5lOyBvdGhlcndpc2UsIGNvbXBpbGF0aW9uIHdpbGwgZmFpbCB3aXRoIGFuIHVub2J2aW91cworZXJyb3IgbWVzc2FnZS4KKworRGVzcGl0ZSB0aGUgaW1wcm92ZWQgdGhyZWFkIHNhZmV0eSBhZmZvcmRlZCBieSB0aGUgInRocmVhZHNhZmUiIHN0eWxlIG9mIGRlYXRoCit0ZXN0LCB0aHJlYWQgcHJvYmxlbXMgc3VjaCBhcyBkZWFkbG9jayBhcmUgc3RpbGwgcG9zc2libGUgaW4gdGhlIHByZXNlbmNlIG9mCitoYW5kbGVycyByZWdpc3RlcmVkIHdpdGggYHB0aHJlYWRfYXRmb3JrKDMpYC4KKworIyBVc2luZyBBc3NlcnRpb25zIGluIFN1Yi1yb3V0aW5lcyAjCisKKyMjIEFkZGluZyBUcmFjZXMgdG8gQXNzZXJ0aW9ucyAjIworCitJZiBhIHRlc3Qgc3ViLXJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc2V2ZXJhbCBwbGFjZXMsIHdoZW4gYW4gYXNzZXJ0aW9uCitpbnNpZGUgaXQgZmFpbHMsIGl0IGNhbiBiZSBoYXJkIHRvIHRlbGwgd2hpY2ggaW52b2NhdGlvbiBvZiB0aGUKK3N1Yi1yb3V0aW5lIHRoZSBmYWlsdXJlIGlzIGZyb20uICBZb3UgY2FuIGFsbGV2aWF0ZSB0aGlzIHByb2JsZW0gdXNpbmcKK2V4dHJhIGxvZ2dpbmcgb3IgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZXMsIGJ1dCB0aGF0IHVzdWFsbHkgY2x1dHRlcnMgdXAKK3lvdXIgdGVzdHMuIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHVzZSB0aGUgYFNDT1BFRF9UUkFDRWAgbWFjcm86CisKK3wgYFNDT1BFRF9UUkFDRShgX21lc3NhZ2VfYCk7YCB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCit3aGVyZSBfbWVzc2FnZV8gY2FuIGJlIGFueXRoaW5nIHN0cmVhbWFibGUgdG8gYHN0ZDo6b3N0cmVhbWAuIFRoaXMKK21hY3JvIHdpbGwgY2F1c2UgdGhlIGN1cnJlbnQgZmlsZSBuYW1lLCBsaW5lIG51bWJlciwgYW5kIHRoZSBnaXZlbgorbWVzc2FnZSB0byBiZSBhZGRlZCBpbiBldmVyeSBmYWlsdXJlIG1lc3NhZ2UuIFRoZSBlZmZlY3Qgd2lsbCBiZQordW5kb25lIHdoZW4gdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUuCisKK0ZvciBleGFtcGxlLAorCitgYGAKKzEwOiB2b2lkIFN1YjEoaW50IG4pIHsKKzExOiAgIEVYUEVDVF9FUSgxLCBCYXIobikpOworMTI6ICAgRVhQRUNUX0VRKDIsIEJhcihuICsgMSkpOworMTM6IH0KKzE0OiAKKzE1OiBURVNUKEZvb1Rlc3QsIEJhcikgeworMTY6ICAgeworMTc6ICAgICBTQ09QRURfVFJBQ0UoIkEiKTsgIC8vIFRoaXMgdHJhY2UgcG9pbnQgd2lsbCBiZSBpbmNsdWRlZCBpbgorMTg6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGZhaWx1cmUgaW4gdGhpcyBzY29wZS4KKzE5OiAgICAgU3ViMSgxKTsKKzIwOiAgIH0KKzIxOiAgIC8vIE5vdyBpdCB3b24ndC4KKzIyOiAgIFN1YjEoOSk7CisyMzogfQorYGBgCisKK2NvdWxkIHJlc3VsdCBpbiBtZXNzYWdlcyBsaWtlIHRoZXNlOgorCitgYGAKK3BhdGgvdG8vZm9vX3Rlc3QuY2M6MTE6IEZhaWx1cmUKK1ZhbHVlIG9mOiBCYXIobikKK0V4cGVjdGVkOiAxCisgIEFjdHVhbDogMgorICAgVHJhY2U6CitwYXRoL3RvL2Zvb190ZXN0LmNjOjE3OiBBCisKK3BhdGgvdG8vZm9vX3Rlc3QuY2M6MTI6IEZhaWx1cmUKK1ZhbHVlIG9mOiBCYXIobiArIDEpCitFeHBlY3RlZDogMgorICBBY3R1YWw6IDMKK2BgYAorCitXaXRob3V0IHRoZSB0cmFjZSwgaXQgd291bGQndmUgYmVlbiBkaWZmaWN1bHQgdG8ga25vdyB3aGljaCBpbnZvY2F0aW9uCitvZiBgU3ViMSgpYCB0aGUgdHdvIGZhaWx1cmVzIGNvbWUgZnJvbSByZXNwZWN0aXZlbHkuIChZb3UgY291bGQgYWRkIGFuCitleHRyYSBtZXNzYWdlIHRvIGVhY2ggYXNzZXJ0aW9uIGluIGBTdWIxKClgIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBvZgorYG5gLCBidXQgdGhhdCdzIHRlZGlvdXMuKQorCitTb21lIHRpcHMgb24gdXNpbmcgYFNDT1BFRF9UUkFDRWA6CisKKyAgMS4gV2l0aCBhIHN1aXRhYmxlIG1lc3NhZ2UsIGl0J3Mgb2Z0ZW4gZW5vdWdoIHRvIHVzZSBgU0NPUEVEX1RSQUNFYCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc3ViLXJvdXRpbmUsIGluc3RlYWQgb2YgYXQgZWFjaCBjYWxsIHNpdGUuCisgIDEuIFdoZW4gY2FsbGluZyBzdWItcm91dGluZXMgaW5zaWRlIGEgbG9vcCwgbWFrZSB0aGUgbG9vcCBpdGVyYXRvciBwYXJ0IG9mIHRoZSBtZXNzYWdlIGluIGBTQ09QRURfVFJBQ0VgIHN1Y2ggdGhhdCB5b3UgY2FuIGtub3cgd2hpY2ggaXRlcmF0aW9uIHRoZSBmYWlsdXJlIGlzIGZyb20uCisgIDEuIFNvbWV0aW1lcyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHRyYWNlIHBvaW50IGlzIGVub3VnaCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhcnRpY3VsYXIgaW52b2NhdGlvbiBvZiBhIHN1Yi1yb3V0aW5lLiBJbiB0aGlzIGNhc2UsIHlvdSBkb24ndCBoYXZlIHRvIGNob29zZSBhIHVuaXF1ZSBtZXNzYWdlIGZvciBgU0NPUEVEX1RSQUNFYC4gWW91IGNhbiBzaW1wbHkgdXNlIGAiImAuCisgIDEuIFlvdSBjYW4gdXNlIGBTQ09QRURfVFJBQ0VgIGluIGFuIGlubmVyIHNjb3BlIHdoZW4gdGhlcmUgaXMgb25lIGluIHRoZSBvdXRlciBzY29wZS4gSW4gdGhpcyBjYXNlLCBhbGwgYWN0aXZlIHRyYWNlIHBvaW50cyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmYWlsdXJlIG1lc3NhZ2VzLCBpbiByZXZlcnNlIG9yZGVyIHRoZXkgYXJlIGVuY291bnRlcmVkLgorICAxLiBUaGUgdHJhY2UgZHVtcCBpcyBjbGlja2FibGUgaW4gRW1hY3MnIGNvbXBpbGF0aW9uIGJ1ZmZlciAtIGhpdCByZXR1cm4gb24gYSBsaW5lIG51bWJlciBhbmQgeW91J2xsIGJlIHRha2VuIHRvIHRoYXQgbGluZSBpbiB0aGUgc291cmNlIGZpbGUhCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBQcm9wYWdhdGluZyBGYXRhbCBGYWlsdXJlcyAjIworCitBIGNvbW1vbiBwaXRmYWxsIHdoZW4gdXNpbmcgYEFTU0VSVF8qYCBhbmQgYEZBSUwqYCBpcyBub3QgdW5kZXJzdGFuZGluZyB0aGF0Cit3aGVuIHRoZXkgZmFpbCB0aGV5IG9ubHkgYWJvcnQgdGhlIF9jdXJyZW50IGZ1bmN0aW9uXywgbm90IHRoZSBlbnRpcmUgdGVzdC4gRm9yCitleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRlc3Qgd2lsbCBzZWdmYXVsdDoKK2BgYAordm9pZCBTdWJyb3V0aW5lKCkgeworICAvLyBHZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlIGFuZCBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIEFTU0VSVF9FUSgxLCAyKTsKKyAgLy8gVGhlIGZvbGxvd2luZyB3b24ndCBiZSBleGVjdXRlZC4KKyAgLi4uCit9CisKK1RFU1QoRm9vVGVzdCwgQmFyKSB7CisgIFN1YnJvdXRpbmUoKTsKKyAgLy8gVGhlIGludGVuZGVkIGJlaGF2aW9yIGlzIGZvciB0aGUgZmF0YWwgZmFpbHVyZQorICAvLyBpbiBTdWJyb3V0aW5lKCkgdG8gYWJvcnQgdGhlIGVudGlyZSB0ZXN0LgorICAvLyBUaGUgYWN0dWFsIGJlaGF2aW9yOiB0aGUgZnVuY3Rpb24gZ29lcyBvbiBhZnRlciBTdWJyb3V0aW5lKCkgcmV0dXJucy4KKyAgaW50KiBwID0gTlVMTDsKKyAgKnAgPSAzOyAvLyBTZWdmYXVsdCEKK30KK2BgYAorCitTaW5jZSB3ZSBkb24ndCB1c2UgZXhjZXB0aW9ucywgaXQgaXMgdGVjaG5pY2FsbHkgaW1wb3NzaWJsZSB0bworaW1wbGVtZW50IHRoZSBpbnRlbmRlZCBiZWhhdmlvciBoZXJlLiAgVG8gYWxsZXZpYXRlIHRoaXMsIEdvb2dsZSBUZXN0Citwcm92aWRlcyB0d28gc29sdXRpb25zLiAgWW91IGNvdWxkIHVzZSBlaXRoZXIgdGhlCitgKEFTU0VSVHxFWFBFQ1QpX05PX0ZBVEFMX0ZBSUxVUkVgIGFzc2VydGlvbnMgb3IgdGhlCitgSGFzRmF0YWxGYWlsdXJlKClgIGZ1bmN0aW9uLiAgVGhleSBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdHdvCitzdWJzZWN0aW9ucy4KKworIyMjIEFzc2VydGluZyBvbiBTdWJyb3V0aW5lcyAjIyMKKworQXMgc2hvd24gYWJvdmUsIGlmIHlvdXIgdGVzdCBjYWxscyBhIHN1YnJvdXRpbmUgdGhhdCBoYXMgYW4gYEFTU0VSVF8qYAorZmFpbHVyZSBpbiBpdCwgdGhlIHRlc3Qgd2lsbCBjb250aW51ZSBhZnRlciB0aGUgc3Vicm91dGluZQorcmV0dXJucy4gVGhpcyBtYXkgbm90IGJlIHdoYXQgeW91IHdhbnQuCisKK09mdGVuIHBlb3BsZSB3YW50IGZhdGFsIGZhaWx1cmVzIHRvIHByb3BhZ2F0ZSBsaWtlIGV4Y2VwdGlvbnMuICBGb3IKK3RoYXQgR29vZ2xlIFRlc3Qgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYF9zdGF0ZW1lbnRfYCk7YCB8IGBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShgX3N0YXRlbWVudF9gKTtgIHwgX3N0YXRlbWVudF8gZG9lc24ndCBnZW5lcmF0ZSBhbnkgbmV3IGZhdGFsIGZhaWx1cmVzIGluIHRoZSBjdXJyZW50IHRocmVhZC4gfAorCitPbmx5IGZhaWx1cmVzIGluIHRoZSB0aHJlYWQgdGhhdCBleGVjdXRlcyB0aGUgYXNzZXJ0aW9uIGFyZSBjaGVja2VkIHRvCitkZXRlcm1pbmUgdGhlIHJlc3VsdCBvZiB0aGlzIHR5cGUgb2YgYXNzZXJ0aW9ucy4gIElmIF9zdGF0ZW1lbnRfCitjcmVhdGVzIG5ldyB0aHJlYWRzLCBmYWlsdXJlcyBpbiB0aGVzZSB0aHJlYWRzIGFyZSBpZ25vcmVkLgorCitFeGFtcGxlczoKKworYGBgCitBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShGb28oKSk7CisKK2ludCBpOworRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoeworICBpID0gQmFyKCk7Cit9KTsKK2BgYAorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4gQXNzZXJ0aW9ucyBmcm9tIG11bHRpcGxlIHRocmVhZHMKK2FyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4KKworIyMjIENoZWNraW5nIGZvciBGYWlsdXJlcyBpbiB0aGUgQ3VycmVudCBUZXN0ICMjIworCitgSGFzRmF0YWxGYWlsdXJlKClgIGluIHRoZSBgOjp0ZXN0aW5nOjpUZXN0YCBjbGFzcyByZXR1cm5zIGB0cnVlYCBpZiBhbgorYXNzZXJ0aW9uIGluIHRoZSBjdXJyZW50IHRlc3QgaGFzIHN1ZmZlcmVkIGEgZmF0YWwgZmFpbHVyZS4gVGhpcworYWxsb3dzIGZ1bmN0aW9ucyB0byBjYXRjaCBmYXRhbCBmYWlsdXJlcyBpbiBhIHN1Yi1yb3V0aW5lIGFuZCByZXR1cm4KK2Vhcmx5LgorCitgYGAKK2NsYXNzIFRlc3QgeworIHB1YmxpYzoKKyAgLi4uCisgIHN0YXRpYyBib29sIEhhc0ZhdGFsRmFpbHVyZSgpOworfTsKK2BgYAorCitUaGUgdHlwaWNhbCB1c2FnZSwgd2hpY2ggYmFzaWNhbGx5IHNpbXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgYSB0aHJvd24KK2V4Y2VwdGlvbiwgaXM6CisKK2BgYAorVEVTVChGb29UZXN0LCBCYXIpIHsKKyAgU3Vicm91dGluZSgpOworICAvLyBBYm9ydHMgaWYgU3Vicm91dGluZSgpIGhhZCBhIGZhdGFsIGZhaWx1cmUuCisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkKKyAgICByZXR1cm47CisgIC8vIFRoZSBmb2xsb3dpbmcgd29uJ3QgYmUgZXhlY3V0ZWQuCisgIC4uLgorfQorYGBgCisKK0lmIGBIYXNGYXRhbEZhaWx1cmUoKWAgaXMgdXNlZCBvdXRzaWRlIG9mIGBURVNUKClgICwgYFRFU1RfRigpYCAsIG9yIGEgdGVzdAorZml4dHVyZSwgeW91IG11c3QgYWRkIHRoZSBgOjp0ZXN0aW5nOjpUZXN0OjpgIHByZWZpeCwgYXMgaW46CisKK2BgYAoraWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpCisgIHJldHVybjsKK2BgYAorCitTaW1pbGFybHksIGBIYXNOb25mYXRhbEZhaWx1cmUoKWAgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGN1cnJlbnQgdGVzdAoraGFzIGF0IGxlYXN0IG9uZSBub24tZmF0YWwgZmFpbHVyZSwgYW5kIGBIYXNGYWlsdXJlKClgIHJldHVybnMgYHRydWVgCitpZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhdCBsZWFzdCBvbmUgZmFpbHVyZSBvZiBlaXRoZXIga2luZC4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuICBgSGFzTm9uZmF0YWxGYWlsdXJlKClgIGFuZAorYEhhc0ZhaWx1cmUoKWAgYXJlIGF2YWlsYWJsZSBzaW5jZSB2ZXJzaW9uIDEuNC4wLgorCisjIExvZ2dpbmcgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiAjCisKK0luIHlvdXIgdGVzdCBjb2RlLCB5b3UgY2FuIGNhbGwgYFJlY29yZFByb3BlcnR5KCJrZXkiLCB2YWx1ZSlgIHRvIGxvZworYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgd2hlcmUgYHZhbHVlYCBjYW4gYmUgZWl0aGVyIGEgQyBzdHJpbmcgb3IgYSAzMi1iaXQKK2ludGVnZXIuIFRoZSBfbGFzdF8gdmFsdWUgcmVjb3JkZWQgZm9yIGEga2V5IHdpbGwgYmUgZW1pdHRlZCB0byB0aGUgWE1MIG91dHB1dAoraWYgeW91IHNwZWNpZnkgb25lLiBGb3IgZXhhbXBsZSwgdGhlIHRlc3QKKworYGBgCitURVNUX0YoV2lkZ2V0VXNhZ2VUZXN0LCBNaW5BbmRNYXhXaWRnZXRzKSB7CisgIFJlY29yZFByb3BlcnR5KCJNYXhpbXVtV2lkZ2V0cyIsIENvbXB1dGVNYXhVc2FnZSgpKTsKKyAgUmVjb3JkUHJvcGVydHkoIk1pbmltdW1XaWRnZXRzIiwgQ29tcHV0ZU1pblVzYWdlKCkpOworfQorYGBgCisKK3dpbGwgb3V0cHV0IFhNTCBsaWtlIHRoaXM6CisKK2BgYAorLi4uCisgIDx0ZXN0Y2FzZSBuYW1lPSJNaW5BbmRNYXhXaWRnZXRzIiBzdGF0dXM9InJ1biIgdGltZT0iNiIgY2xhc3NuYW1lPSJXaWRnZXRVc2FnZVRlc3QiCisgICAgICAgICAgICBNYXhpbXVtV2lkZ2V0cz0iMTIiCisgICAgICAgICAgICBNaW5pbXVtV2lkZ2V0cz0iOSIgLz4KKy4uLgorYGBgCisKK19Ob3RlXzoKKyAgKiBgUmVjb3JkUHJvcGVydHkoKWAgaXMgYSBzdGF0aWMgbWVtYmVyIG9mIHRoZSBgVGVzdGAgY2xhc3MuIFRoZXJlZm9yZSBpdCBuZWVkcyB0byBiZSBwcmVmaXhlZCB3aXRoIGA6OnRlc3Rpbmc6OlRlc3Q6OmAgaWYgdXNlZCBvdXRzaWRlIG9mIHRoZSBgVEVTVGAgYm9keSBhbmQgdGhlIHRlc3QgZml4dHVyZSBjbGFzcy4KKyAgKiBga2V5YCBtdXN0IGJlIGEgdmFsaWQgWE1MIGF0dHJpYnV0ZSBuYW1lLCBhbmQgY2Fubm90IGNvbmZsaWN0IHdpdGggdGhlIG9uZXMgYWxyZWFkeSB1c2VkIGJ5IEdvb2dsZSBUZXN0IChgbmFtZWAsIGBzdGF0dXNgLCAgICAgYHRpbWVgLCBhbmQgYGNsYXNzbmFtZWApLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyBTaGFyaW5nIFJlc291cmNlcyBCZXR3ZWVuIFRlc3RzIGluIHRoZSBTYW1lIFRlc3QgQ2FzZSAjCisKKworCitHb29nbGUgVGVzdCBjcmVhdGVzIGEgbmV3IHRlc3QgZml4dHVyZSBvYmplY3QgZm9yIGVhY2ggdGVzdCBpbiBvcmRlciB0byBtYWtlCit0ZXN0cyBpbmRlcGVuZGVudCBhbmQgZWFzaWVyIHRvIGRlYnVnLiBIb3dldmVyLCBzb21ldGltZXMgdGVzdHMgdXNlIHJlc291cmNlcwordGhhdCBhcmUgZXhwZW5zaXZlIHRvIHNldCB1cCwgbWFraW5nIHRoZSBvbmUtY29weS1wZXItdGVzdCBtb2RlbCBwcm9oaWJpdGl2ZWx5CitleHBlbnNpdmUuCisKK0lmIHRoZSB0ZXN0cyBkb24ndCBjaGFuZ2UgdGhlIHJlc291cmNlLCB0aGVyZSdzIG5vIGhhcm0gaW4gdGhlbSBzaGFyaW5nIGEKK3NpbmdsZSByZXNvdXJjZSBjb3B5LiBTbywgaW4gYWRkaXRpb24gdG8gcGVyLXRlc3Qgc2V0LXVwL3RlYXItZG93biwgR29vZ2xlIFRlc3QKK2Fsc28gc3VwcG9ydHMgcGVyLXRlc3QtY2FzZSBzZXQtdXAvdGVhci1kb3duLiBUbyB1c2UgaXQ6CisKKyAgMS4gSW4geW91ciB0ZXN0IGZpeHR1cmUgY2xhc3MgKHNheSBgRm9vVGVzdGAgKSwgZGVmaW5lIGFzIGBzdGF0aWNgIHNvbWUgbWVtYmVyIHZhcmlhYmxlcyB0byBob2xkIHRoZSBzaGFyZWQgcmVzb3VyY2VzLgorICAxLiBJbiB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUgY2xhc3MsIGRlZmluZSBhIGBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKClgIGZ1bmN0aW9uIChyZW1lbWJlciBub3QgdG8gc3BlbGwgaXQgYXMgKipgU2V0dXBUZXN0Q2FzZWAqKiB3aXRoIGEgc21hbGwgYHVgISkgdG8gc2V0IHVwIHRoZSBzaGFyZWQgcmVzb3VyY2VzIGFuZCBhIGBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKClgIGZ1bmN0aW9uIHRvIHRlYXIgdGhlbSBkb3duLgorCitUaGF0J3MgaXQhIEdvb2dsZSBUZXN0IGF1dG9tYXRpY2FsbHkgY2FsbHMgYFNldFVwVGVzdENhc2UoKWAgYmVmb3JlIHJ1bm5pbmcgdGhlCitfZmlyc3QgdGVzdF8gaW4gdGhlIGBGb29UZXN0YCB0ZXN0IGNhc2UgKGkuZS4gYmVmb3JlIGNyZWF0aW5nIHRoZSBmaXJzdAorYEZvb1Rlc3RgIG9iamVjdCksIGFuZCBjYWxscyBgVGVhckRvd25UZXN0Q2FzZSgpYCBhZnRlciBydW5uaW5nIHRoZSBfbGFzdCB0ZXN0XworaW4gaXQgKGkuZS4gYWZ0ZXIgZGVsZXRpbmcgdGhlIGxhc3QgYEZvb1Rlc3RgIG9iamVjdCkuIEluIGJldHdlZW4sIHRoZSB0ZXN0cworY2FuIHVzZSB0aGUgc2hhcmVkIHJlc291cmNlcy4KKworUmVtZW1iZXIgdGhhdCB0aGUgdGVzdCBvcmRlciBpcyB1bmRlZmluZWQsIHNvIHlvdXIgY29kZSBjYW4ndCBkZXBlbmQgb24gYSB0ZXN0CitwcmVjZWRpbmcgb3IgZm9sbG93aW5nIGFub3RoZXIuIEFsc28sIHRoZSB0ZXN0cyBtdXN0IGVpdGhlciBub3QgbW9kaWZ5IHRoZQorc3RhdGUgb2YgYW55IHNoYXJlZCByZXNvdXJjZSwgb3IsIGlmIHRoZXkgZG8gbW9kaWZ5IHRoZSBzdGF0ZSwgdGhleSBtdXN0CityZXN0b3JlIHRoZSBzdGF0ZSB0byBpdHMgb3JpZ2luYWwgdmFsdWUgYmVmb3JlIHBhc3NpbmcgY29udHJvbCB0byB0aGUgbmV4dAordGVzdC4KKworSGVyZSdzIGFuIGV4YW1wbGUgb2YgcGVyLXRlc3QtY2FzZSBzZXQtdXAgYW5kIHRlYXItZG93bjoKK2BgYAorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gUGVyLXRlc3QtY2FzZSBzZXQtdXAuCisgIC8vIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIC8vIENhbiBiZSBvbWl0dGVkIGlmIG5vdCBuZWVkZWQuCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgc2hhcmVkX3Jlc291cmNlXyA9IG5ldyAuLi47CisgIH0KKworICAvLyBQZXItdGVzdC1jYXNlIHRlYXItZG93bi4KKyAgLy8gQ2FsbGVkIGFmdGVyIHRoZSBsYXN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIC8vIENhbiBiZSBvbWl0dGVkIGlmIG5vdCBuZWVkZWQuCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgZGVsZXRlIHNoYXJlZF9yZXNvdXJjZV87CisgICAgc2hhcmVkX3Jlc291cmNlXyA9IE5VTEw7CisgIH0KKworICAvLyBZb3UgY2FuIGRlZmluZSBwZXItdGVzdCBzZXQtdXAgYW5kIHRlYXItZG93biBsb2dpYyBhcyB1c3VhbC4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyAuLi4gfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IC4uLiB9CisKKyAgLy8gU29tZSBleHBlbnNpdmUgcmVzb3VyY2Ugc2hhcmVkIGJ5IGFsbCB0ZXN0cy4KKyAgc3RhdGljIFQqIHNoYXJlZF9yZXNvdXJjZV87Cit9OworCitUKiBGb29UZXN0OjpzaGFyZWRfcmVzb3VyY2VfID0gTlVMTDsKKworVEVTVF9GKEZvb1Rlc3QsIFRlc3QxKSB7CisgIC4uLiB5b3UgY2FuIHJlZmVyIHRvIHNoYXJlZF9yZXNvdXJjZSBoZXJlIC4uLgorfQorVEVTVF9GKEZvb1Rlc3QsIFRlc3QyKSB7CisgIC4uLiB5b3UgY2FuIHJlZmVyIHRvIHNoYXJlZF9yZXNvdXJjZSBoZXJlIC4uLgorfQorYGBgCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIEdsb2JhbCBTZXQtVXAgYW5kIFRlYXItRG93biAjCisKK0p1c3QgYXMgeW91IGNhbiBkbyBzZXQtdXAgYW5kIHRlYXItZG93biBhdCB0aGUgdGVzdCBsZXZlbCBhbmQgdGhlIHRlc3QgY2FzZQorbGV2ZWwsIHlvdSBjYW4gYWxzbyBkbyBpdCBhdCB0aGUgdGVzdCBwcm9ncmFtIGxldmVsLiBIZXJlJ3MgaG93LgorCitGaXJzdCwgeW91IHN1YmNsYXNzIHRoZSBgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudGAgY2xhc3MgdG8gZGVmaW5lIGEgdGVzdAorZW52aXJvbm1lbnQsIHdoaWNoIGtub3dzIGhvdyB0byBzZXQtdXAgYW5kIHRlYXItZG93bjoKKworYGBgCitjbGFzcyBFbnZpcm9ubWVudCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5FbnZpcm9ubWVudCgpIHt9CisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQorICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gdGVhciBkb3duIHRoZSBlbnZpcm9ubWVudC4KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkge30KK307CitgYGAKKworVGhlbiwgeW91IHJlZ2lzdGVyIGFuIGluc3RhbmNlIG9mIHlvdXIgZW52aXJvbm1lbnQgY2xhc3Mgd2l0aCBHb29nbGUgVGVzdCBieQorY2FsbGluZyB0aGUgYDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KClgIGZ1bmN0aW9uOgorCitgYGAKK0Vudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7CitgYGAKKworTm93LCB3aGVuIGBSVU5fQUxMX1RFU1RTKClgIGlzIGNhbGxlZCwgaXQgZmlyc3QgY2FsbHMgdGhlIGBTZXRVcCgpYCBtZXRob2Qgb2YKK3RoZSBlbnZpcm9ubWVudCBvYmplY3QsIHRoZW4gcnVucyB0aGUgdGVzdHMgaWYgdGhlcmUgd2FzIG5vIGZhdGFsIGZhaWx1cmVzLCBhbmQKK2ZpbmFsbHkgY2FsbHMgYFRlYXJEb3duKClgIG9mIHRoZSBlbnZpcm9ubWVudCBvYmplY3QuCisKK0l0J3MgT0sgdG8gcmVnaXN0ZXIgbXVsdGlwbGUgZW52aXJvbm1lbnQgb2JqZWN0cy4gSW4gdGhpcyBjYXNlLCB0aGVpciBgU2V0VXAoKWAKK3dpbGwgYmUgY2FsbGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWdpc3RlcmVkLCBhbmQgdGhlaXIgYFRlYXJEb3duKClgIHdpbGwgYmUKK2NhbGxlZCBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKworTm90ZSB0aGF0IEdvb2dsZSBUZXN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcmVnaXN0ZXJlZCBlbnZpcm9ubWVudCBvYmplY3RzLgorVGhlcmVmb3JlICoqZG8gbm90IGRlbGV0ZSB0aGVtKiogYnkgeW91cnNlbGYuCisKK1lvdSBzaG91bGQgY2FsbCBgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KClgIGJlZm9yZSBgUlVOX0FMTF9URVNUUygpYCBpcworY2FsbGVkLCBwcm9iYWJseSBpbiBgbWFpbigpYC4gSWYgeW91IHVzZSBgZ3Rlc3RfbWFpbmAsIHlvdSBuZWVkIHRvICAgICAgY2FsbAordGhpcyBiZWZvcmUgYG1haW4oKWAgc3RhcnRzIGZvciBpdCB0byB0YWtlIGVmZmVjdC4gT25lIHdheSB0byBkbyB0aGlzIGlzIHRvCitkZWZpbmUgYSBnbG9iYWwgdmFyaWFibGUgbGlrZSB0aGlzOgorCitgYGAKKzo6dGVzdGluZzo6RW52aXJvbm1lbnQqIGNvbnN0IGZvb19lbnYgPSA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworYGBgCisKK0hvd2V2ZXIsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB5b3UgdG8gd3JpdGUgeW91ciBvd24gYG1haW4oKWAgYW5kIGNhbGwKK2BBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKWAgdGhlcmUsIGFzIHJlbHlpbmcgb24gaW5pdGlhbGl6YXRpb24gb2YgZ2xvYmFsCit2YXJpYWJsZXMgbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQgYW5kIG1heSBjYXVzZSBwcm9ibGVtcyB3aGVuIHlvdQorcmVnaXN0ZXIgbXVsdGlwbGUgZW52aXJvbm1lbnRzIGZyb20gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGFuZCB0aGUKK2Vudmlyb25tZW50cyBoYXZlIGRlcGVuZGVuY2llcyBhbW9uZyB0aGVtIChyZW1lbWJlciB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0CitndWFyYW50ZWUgdGhlIG9yZGVyIGluIHdoaWNoIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMKK2FyZSBpbml0aWFsaXplZCkuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisKKyMgVmFsdWUgUGFyYW1ldGVyaXplZCBUZXN0cyAjCisKK19WYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzXyBhbGxvdyB5b3UgdG8gdGVzdCB5b3VyIGNvZGUgd2l0aCBkaWZmZXJlbnQKK3BhcmFtZXRlcnMgd2l0aG91dCB3cml0aW5nIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSB0ZXN0LgorCitTdXBwb3NlIHlvdSB3cml0ZSBhIHRlc3QgZm9yIHlvdXIgY29kZSBhbmQgdGhlbiByZWFsaXplIHRoYXQgeW91ciBjb2RlIGlzIGFmZmVjdGVkIGJ5IGEgcHJlc2VuY2Ugb2YgYSBCb29sZWFuIGNvbW1hbmQgbGluZSBmbGFnLgorCitgYGAKK1RFU1QoTXlDb2RlVGVzdCwgVGVzdEZvbykgeworICAvLyBBIGNvZGUgdG8gdGVzdCBmb28oKS4KK30KK2BgYAorCitVc3VhbGx5IHBlb3BsZSBmYWN0b3IgdGhlaXIgdGVzdCBjb2RlIGludG8gYSBmdW5jdGlvbiB3aXRoIGEgQm9vbGVhbiBwYXJhbWV0ZXIgaW4gc3VjaCBzaXR1YXRpb25zLiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgZmxhZywgdGhlbiBleGVjdXRlcyB0aGUgdGVzdGluZyBjb2RlLgorCitgYGAKK3ZvaWQgVGVzdEZvb0hlbHBlcihib29sIGZsYWdfdmFsdWUpIHsKKyAgZmxhZyA9IGZsYWdfdmFsdWU7CisgIC8vIEEgY29kZSB0byB0ZXN0IGZvbygpLgorfQorCitURVNUKE15Q29kZVRlc3QsIFRlc3RGb29vKSB7CisgIFRlc3RGb29IZWxwZXIoZmFsc2UpOworICBUZXN0Rm9vSGVscGVyKHRydWUpOworfQorYGBgCisKK0J1dCB0aGlzIHNldHVwIGhhcyBzZXJpb3VzIGRyYXdiYWNrcy4gRmlyc3QsIHdoZW4gYSB0ZXN0IGFzc2VydGlvbiBmYWlscyBpbiB5b3VyIHRlc3RzLCBpdCBiZWNvbWVzIHVuY2xlYXIgd2hhdCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIGNhdXNlZCBpdCB0byBmYWlsLiBZb3UgY2FuIHN0cmVhbSBhIGNsYXJpZnlpbmcgbWVzc2FnZSBpbnRvIHlvdXIgYEVYUEVDVGAvYEFTU0VSVGAgc3RhdGVtZW50cywgYnV0IGl0IHlvdSdsbCBoYXZlIHRvIGRvIGl0IHdpdGggYWxsIG9mIHRoZW0uIFNlY29uZCwgeW91IGhhdmUgdG8gYWRkIG9uZSBzdWNoIGhlbHBlciBmdW5jdGlvbiBwZXIgdGVzdC4gV2hhdCBpZiB5b3UgaGF2ZSB0ZW4gdGVzdHM/IFR3ZW50eT8gQSBodW5kcmVkPworCitWYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpbGwgbGV0IHlvdSB3cml0ZSB5b3VyIHRlc3Qgb25seSBvbmNlIGFuZCB0aGVuIGVhc2lseSBpbnN0YW50aWF0ZSBhbmQgcnVuIGl0IHdpdGggYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBwYXJhbWV0ZXIgdmFsdWVzLgorCitIZXJlIGFyZSBzb21lIG90aGVyIHNpdHVhdGlvbnMgd2hlbiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGNvbWUgaGFuZHk6CisKKyAgKiBZb3Ugd2FudCB0byB0ZXN0IGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgYW4gT08gaW50ZXJmYWNlLgorICAqIFlvdSB3YW50IHRvIHRlc3QgeW91ciBjb2RlIG92ZXIgdmFyaW91cyBpbnB1dHMgKGEuay5hLiBkYXRhLWRyaXZlbiB0ZXN0aW5nKS4gVGhpcyBmZWF0dXJlIGlzIGVhc3kgdG8gYWJ1c2UsIHNvIHBsZWFzZSBleGVyY2lzZSB5b3VyIGdvb2Qgc2Vuc2Ugd2hlbiBkb2luZyBpdCEKKworIyMgSG93IHRvIFdyaXRlIFZhbHVlLVBhcmFtZXRlcml6ZWQgVGVzdHMgIyMKKworVG8gd3JpdGUgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cywgZmlyc3QgeW91IHNob3VsZCBkZWZpbmUgYSBmaXh0dXJlCitjbGFzcy4gIEl0IG11c3QgYmUgZGVyaXZlZCBmcm9tIGJvdGggYDo6dGVzdGluZzo6VGVzdGAgYW5kCitgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8VD5gICh0aGUgbGF0dGVyIGlzIGEgcHVyZSBpbnRlcmZhY2UpLAord2hlcmUgYFRgIGlzIHRoZSB0eXBlIG9mIHlvdXIgcGFyYW1ldGVyIHZhbHVlcy4gIEZvciBjb252ZW5pZW5jZSwgeW91CitjYW4ganVzdCBkZXJpdmUgdGhlIGZpeHR1cmUgY2xhc3MgZnJvbSBgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFQ+YCwKK3doaWNoIGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gYm90aCBgOjp0ZXN0aW5nOjpUZXN0YCBhbmQKK2A6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPmAuIGBUYCBjYW4gYmUgYW55IGNvcHlhYmxlIHR5cGUuIElmCitpdCdzIGEgcmF3IHBvaW50ZXIsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBsaWZlc3BhbiBvZgordGhlIHBvaW50ZWQgdmFsdWVzLgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7CisgIC8vIFlvdSBjYW4gaW1wbGVtZW50IGFsbCB0aGUgdXN1YWwgZml4dHVyZSBjbGFzcyBtZW1iZXJzIGhlcmUuCisgIC8vIFRvIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIsIGNhbGwgR2V0UGFyYW0oKSBmcm9tIGNsYXNzCisgIC8vIFRlc3RXaXRoUGFyYW08VD4uCit9OworCisvLyBPciwgd2hlbiB5b3Ugd2FudCB0byBhZGQgcGFyYW1ldGVycyB0byBhIHByZS1leGlzdGluZyBmaXh0dXJlIGNsYXNzOgorY2xhc3MgQmFzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgLi4uCit9OworY2xhc3MgQmFyVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwKKyAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Y29uc3QgY2hhcio+IHsKKyAgLi4uCit9OworYGBgCisKK1RoZW4sIHVzZSB0aGUgYFRFU1RfUGAgbWFjcm8gdG8gZGVmaW5lIGFzIG1hbnkgdGVzdCBwYXR0ZXJucyB1c2luZwordGhpcyBmaXh0dXJlIGFzIHlvdSB3YW50LiAgVGhlIGBfUGAgc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIgb3IKKyJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdSBwcmVmZXIgdG8gdGhpbmsuCisKK2BgYAorVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKKyAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6CisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKKyAgLi4uCit9CisKK1RFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgeworICAuLi4KK30KK2BgYAorCitGaW5hbGx5LCB5b3UgY2FuIHVzZSBgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1BgIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0CitjYXNlIHdpdGggYW55IHNldCBvZiBwYXJhbWV0ZXJzIHlvdSB3YW50LiBHb29nbGUgVGVzdCBkZWZpbmVzIGEgbnVtYmVyIG9mCitmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGVzdCBwYXJhbWV0ZXJzLiBUaGV5IHJldHVybiB3aGF0IHdlIGNhbGwKKyhzdXJwcmlzZSEpIF9wYXJhbWV0ZXIgZ2VuZXJhdG9yc18uIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZW0sCit3aGljaCBhcmUgYWxsIGluIHRoZSBgdGVzdGluZ2AgbmFtZXNwYWNlOgorCit8IGBSYW5nZShiZWdpbiwgZW5kWywgc3RlcF0pYCB8IFlpZWxkcyB2YWx1ZXMgYHtiZWdpbiwgYmVnaW4rc3RlcCwgYmVnaW4rc3RlcCtzdGVwLCAuLi59YC4gVGhlIHZhbHVlcyBkbyBub3QgaW5jbHVkZSBgZW5kYC4gYHN0ZXBgIGRlZmF1bHRzIHRvIDEuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgVmFsdWVzKHYxLCB2MiwgLi4uLCB2TilgICAgfCBZaWVsZHMgdmFsdWVzIGB7djEsIHYyLCAuLi4sIHZOfWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBWYWx1ZXNJbihjb250YWluZXIpYCBhbmQgYFZhbHVlc0luKGJlZ2luLCBlbmQpYCB8IFlpZWxkcyB2YWx1ZXMgZnJvbSBhIEMtc3R5bGUgYXJyYXksIGFuIFNUTC1zdHlsZSBjb250YWluZXIsIG9yIGFuIGl0ZXJhdG9yIHJhbmdlIGBbYmVnaW4sIGVuZClgLiBgY29udGFpbmVyYCwgYGJlZ2luYCwgYW5kIGBlbmRgIGNhbiBiZSBleHByZXNzaW9ucyB3aG9zZSB2YWx1ZXMgYXJlIGRldGVybWluZWQgYXQgcnVuIHRpbWUuICB8Cit8IGBCb29sKClgICAgICAgICAgICAgICAgICAgICB8IFlpZWxkcyBzZXF1ZW5jZSBge2ZhbHNlLCB0cnVlfWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYENvbWJpbmUoZzEsIGcyLCAuLi4sIGdOKWAgIHwgWWllbGRzIGFsbCBjb21iaW5hdGlvbnMgKHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IHRoZSBgTmAgZ2VuZXJhdG9ycy4gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3VyIHN5c3RlbSBwcm92aWRlcyB0aGUgYDx0cjEvdHVwbGU+YCBoZWFkZXIuIElmIHlvdSBhcmUgc3VyZSB5b3VyIHN5c3RlbSBkb2VzLCBhbmQgR29vZ2xlIFRlc3QgZGlzYWdyZWVzLCB5b3UgY2FuIG92ZXJyaWRlIGl0IGJ5IGRlZmluaW5nIGBHVEVTVF9IQVNfVFIxX1RVUExFPTFgLiBTZWUgY29tbWVudHMgaW4gW2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gfAorCitGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIFtzb3VyY2UgY29kZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCkuCisKK1RoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgZnJvbSB0aGUgYEZvb1Rlc3RgIHRlc3QgY2FzZQorZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgYCJtZWVueSJgLCBgIm1pbnkiYCwgYW5kIGAibW9lImAuCisKK2BgYAorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoIm1lZW55IiwgIm1pbnkiLCAibW9lIikpOworYGBgCisKK1RvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4gKHllcywgeW91IGNhbgoraW5zdGFudGlhdGUgaXQgbW9yZSB0aGFuIG9uY2UpLCB0aGUgZmlyc3QgYXJndW1lbnQgdG8KK2BJTlNUQU5USUFURV9URVNUX0NBU0VfUGAgaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhY3R1YWwKK3Rlc3QgY2FzZSBuYW1lLiBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IgZGlmZmVyZW50CitpbnN0YW50aWF0aW9ucy4gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlIHRoZXNlCituYW1lczoKKworICAqIGBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzBgIGZvciBgIm1lZW55ImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xYCBmb3IgYCJtaW55ImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8yYCBmb3IgYCJtb2UiYAorICAqIGBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzBgIGZvciBgIm1lZW55ImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xYCBmb3IgYCJtaW55ImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8yYCBmb3IgYCJtb2UiYAorCitZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiBbLS1ndGVzdFxfZmlsdGVyXSgjUnVubmluZ19hX1N1YnNldF9vZl90aGVfVGVzdHMubWQpLgorCitUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIGBGb29UZXN0YCBhZ2FpbiwgZWFjaAord2l0aCBwYXJhbWV0ZXIgdmFsdWVzIGAiY2F0ImAgYW5kIGAiZG9nImA6CisKK2BgYAorY29uc3QgY2hhciogcGV0c1tdID0geyJjYXQiLCAiZG9nIn07CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbm90aGVySW5zdGFudGlhdGlvbk5hbWUsIEZvb1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKHBldHMpKTsKK2BgYAorCitUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUgdGhlc2UgbmFtZXM6CisKKyAgKiBgQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMGAgZm9yIGAiY2F0ImAKKyAgKiBgQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMWAgZm9yIGAiZG9nImAKKyAgKiBgQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMGAgZm9yIGAiY2F0ImAKKyAgKiBgQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMWAgZm9yIGAiZG9nImAKKworUGxlYXNlIG5vdGUgdGhhdCBgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1BgIHdpbGwgaW5zdGFudGlhdGUgX2FsbF8KK3Rlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UsIHdoZXRoZXIgdGhlaXIgZGVmaW5pdGlvbnMgY29tZSBiZWZvcmUgb3IKK19hZnRlcl8gdGhlIGBJTlNUQU5USUFURV9URVNUX0NBU0VfUGAgc3RhdGVtZW50LgorCitZb3UgY2FuIHNlZQorW3RoZXNlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYykKK1tmaWxlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MpIGZvciBtb3JlIGV4YW1wbGVzLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MgKHJlcXVpcmVzIE1TVkMgOC4wIG9yIGFib3ZlKSwgTWFjOyBzaW5jZSB2ZXJzaW9uIDEuMi4wLgorCisjIyBDcmVhdGluZyBWYWx1ZS1QYXJhbWV0ZXJpemVkIEFic3RyYWN0IFRlc3RzICMjCisKK0luIHRoZSBhYm92ZSwgd2UgZGVmaW5lIGFuZCBpbnN0YW50aWF0ZSBgRm9vVGVzdGAgaW4gdGhlIHNhbWUgc291cmNlCitmaWxlLiBTb21ldGltZXMgeW91IG1heSB3YW50IHRvIGRlZmluZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIGEKK2xpYnJhcnkgYW5kIGxldCBvdGhlciBwZW9wbGUgaW5zdGFudGlhdGUgdGhlbSBsYXRlci4gVGhpcyBwYXR0ZXJuIGlzCitrbm93biBhcyA8aT5hYnN0cmFjdCB0ZXN0czwvaT4uIEFzIGFuIGV4YW1wbGUgb2YgaXRzIGFwcGxpY2F0aW9uLCB3aGVuIHlvdQorYXJlIGRlc2lnbmluZyBhbiBpbnRlcmZhY2UgeW91IGNhbiB3cml0ZSBhIHN0YW5kYXJkIHN1aXRlIG9mIGFic3RyYWN0Cit0ZXN0cyAocGVyaGFwcyB1c2luZyBhIGZhY3RvcnkgZnVuY3Rpb24gYXMgdGhlIHRlc3QgcGFyYW1ldGVyKSB0aGF0CithbGwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBpbnRlcmZhY2UgYXJlIGV4cGVjdGVkIHRvIHBhc3MuIFdoZW4KK3NvbWVvbmUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlLCBoZSBjYW4gaW5zdGFudGlhdGUgeW91ciBzdWl0ZSB0byBnZXQKK2FsbCB0aGUgaW50ZXJmYWNlLWNvbmZvcm1hbmNlIHRlc3RzIGZvciBmcmVlLgorCitUbyBkZWZpbmUgYWJzdHJhY3QgdGVzdHMsIHlvdSBzaG91bGQgb3JnYW5pemUgeW91ciBjb2RlIGxpa2UgdGhpczoKKworICAxLiBQdXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIGNsYXNzIChlLmcuIGBGb29UZXN0YCkgaW4gYSBoZWFkZXIgZmlsZSwgc2F5IGBmb29fcGFyYW1fdGVzdC5oYC4gVGhpbmsgb2YgdGhpcyBhcyBfZGVjbGFyaW5nXyB5b3VyIGFic3RyYWN0IHRlc3RzLgorICAxLiBQdXQgdGhlIGBURVNUX1BgIGRlZmluaXRpb25zIGluIGBmb29fcGFyYW1fdGVzdC5jY2AsIHdoaWNoIGluY2x1ZGVzIGBmb29fcGFyYW1fdGVzdC5oYC4gVGhpbmsgb2YgdGhpcyBhcyBfaW1wbGVtZW50aW5nXyB5b3VyIGFic3RyYWN0IHRlc3RzLgorCitPbmNlIHRoZXkgYXJlIGRlZmluZWQsIHlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbSBieSBpbmNsdWRpbmcKK2Bmb29fcGFyYW1fdGVzdC5oYCwgaW52b2tpbmcgYElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKClgLCBhbmQgbGlua2luZword2l0aCBgZm9vX3BhcmFtX3Rlc3QuY2NgLiBZb3UgY2FuIGluc3RhbnRpYXRlIHRoZSBzYW1lIGFic3RyYWN0IHRlc3QKK2Nhc2UgbXVsdGlwbGUgdGltZXMsIHBvc3NpYmx5IGluIGRpZmZlcmVudCBzb3VyY2UgZmlsZXMuCisKKyMgVHlwZWQgVGVzdHMgIworCitTdXBwb3NlIHlvdSBoYXZlIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBpbnRlcmZhY2UgYW5kCit3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGVtIHNhdGlzZnkgc29tZSBjb21tb24gcmVxdWlyZW1lbnRzLgorT3IsIHlvdSBtYXkgaGF2ZSBkZWZpbmVkIHNldmVyYWwgdHlwZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gY29uZm9ybSB0bwordGhlIHNhbWUgImNvbmNlcHQiIGFuZCB5b3Ugd2FudCB0byB2ZXJpZnkgaXQuICBJbiBib3RoIGNhc2VzLCB5b3Ugd2FudAordGhlIHNhbWUgdGVzdCBsb2dpYyByZXBlYXRlZCBmb3IgZGlmZmVyZW50IHR5cGVzLgorCitXaGlsZSB5b3UgY2FuIHdyaXRlIG9uZSBgVEVTVGAgb3IgYFRFU1RfRmAgZm9yIGVhY2ggdHlwZSB5b3Ugd2FudCB0bwordGVzdCAoYW5kIHlvdSBtYXkgZXZlbiBmYWN0b3IgdGhlIHRlc3QgbG9naWMgaW50byBhIGZ1bmN0aW9uIHRlbXBsYXRlCit0aGF0IHlvdSBpbnZva2UgZnJvbSB0aGUgYFRFU1RgKSwgaXQncyB0ZWRpb3VzIGFuZCBkb2Vzbid0IHNjYWxlOgoraWYgeW91IHdhbnQgX21fIHRlc3RzIG92ZXIgX25fIHR5cGVzLCB5b3UnbGwgZW5kIHVwIHdyaXRpbmcgX21cKm5fCitgVEVTVGBzLgorCitfVHlwZWQgdGVzdHNfIGFsbG93IHlvdSB0byByZXBlYXQgdGhlIHNhbWUgdGVzdCBsb2dpYyBvdmVyIGEgbGlzdCBvZgordHlwZXMuICBZb3Ugb25seSBuZWVkIHRvIHdyaXRlIHRoZSB0ZXN0IGxvZ2ljIG9uY2UsIGFsdGhvdWdoIHlvdSBtdXN0Citrbm93IHRoZSB0eXBlIGxpc3Qgd2hlbiB3cml0aW5nIHR5cGVkIHRlc3RzLiAgSGVyZSdzIGhvdyB5b3UgZG8gaXQ6CisKK0ZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKK2J5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIGA6OnRlc3Rpbmc6OlRlc3RgOgorCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgLi4uCisgIHR5cGVkZWYgc3RkOjpsaXN0PFQ+IExpc3Q7CisgIHN0YXRpYyBUIHNoYXJlZF87CisgIFQgdmFsdWVfOworfTsKK2BgYAorCitOZXh0LCBhc3NvY2lhdGUgYSBsaXN0IG9mIHR5cGVzIHdpdGggdGhlIHRlc3QgY2FzZSwgd2hpY2ggd2lsbCBiZQorcmVwZWF0ZWQgZm9yIGVhY2ggdHlwZSBpbiB0aGUgbGlzdDoKKworYGBgCit0eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitUWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgTXlUeXBlcyk7CitgYGAKKworVGhlIGB0eXBlZGVmYCBpcyBuZWNlc3NhcnkgZm9yIHRoZSBgVFlQRURfVEVTVF9DQVNFYCBtYWNybyB0byBwYXJzZQorY29ycmVjdGx5LiAgT3RoZXJ3aXNlIHRoZSBjb21waWxlciB3aWxsIHRoaW5rIHRoYXQgZWFjaCBjb21tYSBpbiB0aGUKK3R5cGUgbGlzdCBpbnRyb2R1Y2VzIGEgbmV3IG1hY3JvIGFyZ3VtZW50LgorCitUaGVuLCB1c2UgYFRZUEVEX1RFU1QoKWAgaW5zdGVhZCBvZiBgVEVTVF9GKClgIHRvIGRlZmluZSBhIHR5cGVkIHRlc3QKK2ZvciB0aGlzIHRlc3QgY2FzZS4gIFlvdSBjYW4gcmVwZWF0IHRoaXMgYXMgbWFueSB0aW1lcyBhcyB5b3Ugd2FudDoKKworYGBgCitUWVBFRF9URVNUKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIHRoZSBzcGVjaWFsIG5hbWUgVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZQorICAvLyBwYXJhbWV0ZXIuICBTaW5jZSB3ZSBhcmUgaW5zaWRlIGEgZGVyaXZlZCBjbGFzcyB0ZW1wbGF0ZSwgQysrIHJlcXVpcmVzCisgIC8vIHVzIHRvIHZpc2l0IHRoZSBtZW1iZXJzIG9mIEZvb1Rlc3QgdmlhICd0aGlzJy4KKyAgVHlwZVBhcmFtIG4gPSB0aGlzLT52YWx1ZV87CisKKyAgLy8gVG8gdmlzaXQgc3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUsIGFkZCB0aGUgJ1Rlc3RGaXh0dXJlOjonCisgIC8vIHByZWZpeC4KKyAgbiArPSBUZXN0Rml4dHVyZTo6c2hhcmVkXzsKKworICAvLyBUbyByZWZlciB0byB0eXBlZGVmcyBpbiB0aGUgZml4dHVyZSwgYWRkIHRoZSAndHlwZW5hbWUgVGVzdEZpeHR1cmU6OicKKyAgLy8gcHJlZml4LiAgVGhlICd0eXBlbmFtZScgaXMgcmVxdWlyZWQgdG8gc2F0aXNmeSB0aGUgY29tcGlsZXIuCisgIHR5cGVuYW1lIFRlc3RGaXh0dXJlOjpMaXN0IHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjayhuKTsKKyAgLi4uCit9CisKK1RZUEVEX1RFU1QoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9CitgYGAKKworWW91IGNhbiBzZWUgYHNhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jY2AgZm9yIGEgY29tcGxldGUgZXhhbXBsZS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzIChyZXF1aXJlcyBNU1ZDIDguMCBvciBhYm92ZSksIE1hYzsKK3NpbmNlIHZlcnNpb24gMS4xLjAuCisKKyMgVHlwZS1QYXJhbWV0ZXJpemVkIFRlc3RzICMKKworX1R5cGUtcGFyYW1ldGVyaXplZCB0ZXN0c18gYXJlIGxpa2UgdHlwZWQgdGVzdHMsIGV4Y2VwdCB0aGF0IHRoZXkKK2Rvbid0IHJlcXVpcmUgeW91IHRvIGtub3cgdGhlIGxpc3Qgb2YgdHlwZXMgYWhlYWQgb2YgdGltZS4gIEluc3RlYWQsCit5b3UgY2FuIGRlZmluZSB0aGUgdGVzdCBsb2dpYyBmaXJzdCBhbmQgaW5zdGFudGlhdGUgaXQgd2l0aCBkaWZmZXJlbnQKK3R5cGUgbGlzdHMgbGF0ZXIuICBZb3UgY2FuIGV2ZW4gaW5zdGFudGlhdGUgaXQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlCitzYW1lIHByb2dyYW0uCisKK0lmIHlvdSBhcmUgZGVzaWduaW5nIGFuIGludGVyZmFjZSBvciBjb25jZXB0LCB5b3UgY2FuIGRlZmluZSBhIHN1aXRlCitvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgdG8gdmVyaWZ5IHByb3BlcnRpZXMgdGhhdCBhbnkgdmFsaWQKK2ltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UvY29uY2VwdCBzaG91bGQgaGF2ZS4gIFRoZW4sIHRoZSBhdXRob3IKK29mIGVhY2ggaW1wbGVtZW50YXRpb24gY2FuIGp1c3QgaW5zdGFudGlhdGUgdGhlIHRlc3Qgc3VpdGUgd2l0aCBoaXMKK3R5cGUgdG8gdmVyaWZ5IHRoYXQgaXQgY29uZm9ybXMgdG8gdGhlIHJlcXVpcmVtZW50cywgd2l0aG91dCBoYXZpbmcgdG8KK3dyaXRlIHNpbWlsYXIgdGVzdHMgcmVwZWF0ZWRseS4gIEhlcmUncyBhbiBleGFtcGxlOgorCitGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZSwgYXMgd2UgZGlkIHdpdGggdHlwZWQgdGVzdHM6CisKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC4uLgorfTsKK2BgYAorCitOZXh0LCBkZWNsYXJlIHRoYXQgeW91IHdpbGwgZGVmaW5lIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZToKKworYGBgCitUWVBFRF9URVNUX0NBU0VfUChGb29UZXN0KTsKK2BgYAorCitUaGUgYF9QYCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIiBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UKK3ByZWZlciB0byB0aGluay4KKworVGhlbiwgdXNlIGBUWVBFRF9URVNUX1AoKWAgdG8gZGVmaW5lIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuICBZb3UKK2NhbiByZXBlYXQgdGhpcyBhcyBtYW55IHRpbWVzIGFzIHlvdSB3YW50OgorCitgYGAKK1RZUEVEX1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgVHlwZVBhcmFtIG4gPSAwOworICAuLi4KK30KKworVFlQRURfVEVTVF9QKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorYGBgCisKK05vdyB0aGUgdHJpY2t5IHBhcnQ6IHlvdSBuZWVkIHRvIHJlZ2lzdGVyIGFsbCB0ZXN0IHBhdHRlcm5zIHVzaW5nIHRoZQorYFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QYCBtYWNybyBiZWZvcmUgeW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtLgorVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBtYWNybyBpcyB0aGUgdGVzdCBjYXNlIG5hbWU7IHRoZSByZXN0IGFyZQordGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZToKKworYGBgCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9lc0JsYWgsIEhhc1Byb3BlcnR5QSk7CitgYGAKKworRmluYWxseSwgeW91IGFyZSBmcmVlIHRvIGluc3RhbnRpYXRlIHRoZSBwYXR0ZXJuIHdpdGggdGhlIHR5cGVzIHlvdQord2FudC4gIElmIHlvdSBwdXQgdGhlIGFib3ZlIGNvZGUgaW4gYSBoZWFkZXIgZmlsZSwgeW91IGNhbiBgI2luY2x1ZGVgCitpdCBpbiBtdWx0aXBsZSBDKysgc291cmNlIGZpbGVzIGFuZCBpbnN0YW50aWF0ZSBpdCBtdWx0aXBsZSB0aW1lcy4KKworYGBgCit0eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgTXlUeXBlcyk7CitgYGAKKworVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgdGhlIGZpcnN0IGFyZ3VtZW50Cit0byB0aGUgYElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QYCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUKK2FkZGVkIHRvIHRoZSBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuICBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcworZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMuCisKK0luIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIHR5cGUgbGlzdCBjb250YWlucyBvbmx5IG9uZSB0eXBlLCB5b3UKK2NhbiB3cml0ZSB0aGF0IHR5cGUgZGlyZWN0bHkgd2l0aG91dCBgOjp0ZXN0aW5nOjpUeXBlczwuLi4+YCwgbGlrZSB0aGlzOgorCitgYGAKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBpbnQpOworYGBgCisKK1lvdSBjYW4gc2VlIGBzYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2NgIGZvciBhIGNvbXBsZXRlIGV4YW1wbGUuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cyAocmVxdWlyZXMgTVNWQyA4LjAgb3IgYWJvdmUpLCBNYWM7CitzaW5jZSB2ZXJzaW9uIDEuMS4wLgorCisjIFRlc3RpbmcgUHJpdmF0ZSBDb2RlICMKKworSWYgeW91IGNoYW5nZSB5b3VyIHNvZnR3YXJlJ3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24sIHlvdXIgdGVzdHMgc2hvdWxkIG5vdAorYnJlYWsgYXMgbG9uZyBhcyB0aGUgY2hhbmdlIGlzIG5vdCBvYnNlcnZhYmxlIGJ5IHVzZXJzLiBUaGVyZWZvcmUsIHBlciB0aGUKK19ibGFjay1ib3ggdGVzdGluZyBwcmluY2lwbGVfLCBtb3N0IG9mIHRoZSB0aW1lIHlvdSBzaG91bGQgdGVzdCB5b3VyIGNvZGUKK3Rocm91Z2ggaXRzIHB1YmxpYyBpbnRlcmZhY2VzLgorCitJZiB5b3Ugc3RpbGwgZmluZCB5b3Vyc2VsZiBuZWVkaW5nIHRvIHRlc3QgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gY29kZSwKK2NvbnNpZGVyIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgZGVzaWduIHRoYXQgd291bGRuJ3QgcmVxdWlyZSB5b3UgdG8gZG8gc28uIElmIHlvdQorYWJzb2x1dGVseSBoYXZlIHRvIHRlc3Qgbm9uLXB1YmxpYyBpbnRlcmZhY2UgY29kZSB0aG91Z2gsIHlvdSBjYW4uIFRoZXJlIGFyZQordHdvIGNhc2VzIHRvIGNvbnNpZGVyOgorCisgICogU3RhdGljIGZ1bmN0aW9ucyAoX25vdF8gdGhlIHNhbWUgYXMgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMhKSBvciB1bm5hbWVkIG5hbWVzcGFjZXMsIGFuZAorICAqIFByaXZhdGUgb3IgcHJvdGVjdGVkIGNsYXNzIG1lbWJlcnMKKworIyMgU3RhdGljIEZ1bmN0aW9ucyAjIworCitCb3RoIHN0YXRpYyBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zL2RlY2xhcmF0aW9ucyBpbiBhbiB1bm5hbWVkIG5hbWVzcGFjZSBhcmUKK29ubHkgdmlzaWJsZSB3aXRoaW4gdGhlIHNhbWUgdHJhbnNsYXRpb24gdW5pdC4gVG8gdGVzdCB0aGVtLCB5b3UgY2FuIGAjaW5jbHVkZWAKK3RoZSBlbnRpcmUgYC5jY2AgZmlsZSBiZWluZyB0ZXN0ZWQgaW4geW91ciBgKl90ZXN0LmNjYCBmaWxlLiAoI2luY2x1ZGluZyBgLmNjYAorZmlsZXMgaXMgbm90IGEgZ29vZCB3YXkgdG8gcmV1c2UgY29kZSAtIHlvdSBzaG91bGQgbm90IGRvIHRoaXMgaW4gcHJvZHVjdGlvbgorY29kZSEpCisKK0hvd2V2ZXIsIGEgYmV0dGVyIGFwcHJvYWNoIGlzIHRvIG1vdmUgdGhlIHByaXZhdGUgY29kZSBpbnRvIHRoZQorYGZvbzo6aW50ZXJuYWxgIG5hbWVzcGFjZSwgd2hlcmUgYGZvb2AgaXMgdGhlIG5hbWVzcGFjZSB5b3VyIHByb2plY3Qgbm9ybWFsbHkKK3VzZXMsIGFuZCBwdXQgdGhlIHByaXZhdGUgZGVjbGFyYXRpb25zIGluIGEgYCotaW50ZXJuYWwuaGAgZmlsZS4gWW91cgorcHJvZHVjdGlvbiBgLmNjYCBmaWxlcyBhbmQgeW91ciB0ZXN0cyBhcmUgYWxsb3dlZCB0byBpbmNsdWRlIHRoaXMgaW50ZXJuYWwKK2hlYWRlciwgYnV0IHlvdXIgY2xpZW50cyBhcmUgbm90LiBUaGlzIHdheSwgeW91IGNhbiBmdWxseSB0ZXN0IHlvdXIgaW50ZXJuYWwKK2ltcGxlbWVudGF0aW9uIHdpdGhvdXQgbGVha2luZyBpdCB0byB5b3VyIGNsaWVudHMuCisKKyMjIFByaXZhdGUgQ2xhc3MgTWVtYmVycyAjIworCitQcml2YXRlIGNsYXNzIG1lbWJlcnMgYXJlIG9ubHkgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiB0aGUgY2xhc3Mgb3IgYnkgZnJpZW5kcy4KK1RvIGFjY2VzcyBhIGNsYXNzJyBwcml2YXRlIG1lbWJlcnMsIHlvdSBjYW4gZGVjbGFyZSB5b3VyIHRlc3QgZml4dHVyZSBhcyBhCitmcmllbmQgdG8gdGhlIGNsYXNzIGFuZCBkZWZpbmUgYWNjZXNzb3JzIGluIHlvdXIgZml4dHVyZS4gVGVzdHMgdXNpbmcgdGhlCitmaXh0dXJlIGNhbiB0aGVuIGFjY2VzcyB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mIHlvdXIgcHJvZHVjdGlvbiBjbGFzcyB2aWEgdGhlCithY2Nlc3NvcnMgaW4gdGhlIGZpeHR1cmUuIE5vdGUgdGhhdCBldmVuIHRob3VnaCB5b3VyIGZpeHR1cmUgaXMgYSBmcmllbmQgdG8KK3lvdXIgcHJvZHVjdGlvbiBjbGFzcywgeW91ciB0ZXN0cyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgZnJpZW5kcyB0byBpdCwgYXMgdGhleQorYXJlIHRlY2huaWNhbGx5IGRlZmluZWQgaW4gc3ViLWNsYXNzZXMgb2YgdGhlIGZpeHR1cmUuCisKK0Fub3RoZXIgd2F5IHRvIHRlc3QgcHJpdmF0ZSBtZW1iZXJzIGlzIHRvIHJlZmFjdG9yIHRoZW0gaW50byBhbiBpbXBsZW1lbnRhdGlvbgorY2xhc3MsIHdoaWNoIGlzIHRoZW4gZGVjbGFyZWQgaW4gYSBgKi1pbnRlcm5hbC5oYCBmaWxlLiBZb3VyIGNsaWVudHMgYXJlbid0CithbGxvd2VkIHRvIGluY2x1ZGUgdGhpcyBoZWFkZXIgYnV0IHlvdXIgdGVzdHMgY2FuLiBTdWNoIGlzIGNhbGxlZCB0aGUgUGltcGwKKyhQcml2YXRlIEltcGxlbWVudGF0aW9uKSBpZGlvbS4KKworT3IsIHlvdSBjYW4gZGVjbGFyZSBhbiBpbmRpdmlkdWFsIHRlc3QgYXMgYSBmcmllbmQgb2YgeW91ciBjbGFzcyBieSBhZGRpbmcgdGhpcworbGluZSBpbiB0aGUgY2xhc3MgYm9keToKKworYGBgCitGUklFTkRfVEVTVChUZXN0Q2FzZU5hbWUsIFRlc3ROYW1lKTsKK2BgYAorCitGb3IgZXhhbXBsZSwKK2BgYAorLy8gZm9vLmgKKyNpbmNsdWRlICJndGVzdC9ndGVzdF9wcm9kLmgiCisKKy8vIERlZmluZXMgRlJJRU5EX1RFU1QuCitjbGFzcyBGb28geworICAuLi4KKyBwcml2YXRlOgorICBGUklFTkRfVEVTVChGb29UZXN0LCBCYXJSZXR1cm5zWmVyb09uTnVsbCk7CisgIGludCBCYXIodm9pZCogeCk7Cit9OworCisvLyBmb29fdGVzdC5jYworLi4uCitURVNUKEZvb1Rlc3QsIEJhclJldHVybnNaZXJvT25OdWxsKSB7CisgIEZvbyBmb287CisgIEVYUEVDVF9FUSgwLCBmb28uQmFyKE5VTEwpKTsKKyAgLy8gVXNlcyBGb28ncyBwcml2YXRlIG1lbWJlciBCYXIoKS4KK30KK2BgYAorCitQYXkgc3BlY2lhbCBhdHRlbnRpb24gd2hlbiB5b3VyIGNsYXNzIGlzIGRlZmluZWQgaW4gYSBuYW1lc3BhY2UsIGFzIHlvdSBzaG91bGQKK2RlZmluZSB5b3VyIHRlc3QgZml4dHVyZXMgYW5kIHRlc3RzIGluIHRoZSBzYW1lIG5hbWVzcGFjZSBpZiB5b3Ugd2FudCB0aGVtIHRvCitiZSBmcmllbmRzIG9mIHlvdXIgY2xhc3MuIEZvciBleGFtcGxlLCBpZiB0aGUgY29kZSB0byBiZSB0ZXN0ZWQgbG9va3MgbGlrZToKKworYGBgCituYW1lc3BhY2UgbXlfbmFtZXNwYWNlIHsKKworY2xhc3MgRm9vIHsKKyAgZnJpZW5kIGNsYXNzIEZvb1Rlc3Q7CisgIEZSSUVORF9URVNUKEZvb1Rlc3QsIEJhcik7CisgIEZSSUVORF9URVNUKEZvb1Rlc3QsIEJheik7CisgIC4uLgorICBkZWZpbml0aW9uIG9mIHRoZSBjbGFzcyBGb28KKyAgLi4uCit9OworCit9ICAvLyBuYW1lc3BhY2UgbXlfbmFtZXNwYWNlCitgYGAKKworWW91ciB0ZXN0IGNvZGUgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlOgorCitgYGAKK25hbWVzcGFjZSBteV9uYW1lc3BhY2UgeworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLi4uCit9OworCitURVNUX0YoRm9vVGVzdCwgQmFyKSB7IC4uLiB9CitURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9CisKK30gIC8vIG5hbWVzcGFjZSBteV9uYW1lc3BhY2UKK2BgYAorCisjIENhdGNoaW5nIEZhaWx1cmVzICMKKworSWYgeW91IGFyZSBidWlsZGluZyBhIHRlc3RpbmcgdXRpbGl0eSBvbiB0b3Agb2YgR29vZ2xlIFRlc3QsIHlvdSdsbAord2FudCB0byB0ZXN0IHlvdXIgdXRpbGl0eS4gIFdoYXQgZnJhbWV3b3JrIHdvdWxkIHlvdSB1c2UgdG8gdGVzdCBpdD8KK0dvb2dsZSBUZXN0LCBvZiBjb3Vyc2UuCisKK1RoZSBjaGFsbGVuZ2UgaXMgdG8gdmVyaWZ5IHRoYXQgeW91ciB0ZXN0aW5nIHV0aWxpdHkgcmVwb3J0cyBmYWlsdXJlcworY29ycmVjdGx5LiAgSW4gZnJhbWV3b3JrcyB0aGF0IHJlcG9ydCBhIGZhaWx1cmUgYnkgdGhyb3dpbmcgYW4KK2V4Y2VwdGlvbiwgeW91IGNvdWxkIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIGFzc2VydCBvbiBpdC4gIEJ1dCBHb29nbGUKK1Rlc3QgZG9lc24ndCB1c2UgZXhjZXB0aW9ucywgc28gaG93IGRvIHdlIHRlc3QgdGhhdCBhIHBpZWNlIG9mIGNvZGUKK2dlbmVyYXRlcyBhbiBleHBlY3RlZCBmYWlsdXJlPworCitgImd0ZXN0L2d0ZXN0LXNwaS5oImAgY29udGFpbnMgc29tZSBjb25zdHJ1Y3RzIHRvIGRvIHRoaXMuICBBZnRlcgorI2luY2x1ZGluZyB0aGlzIGhlYWRlciwgeW91IGNhbiB1c2UKKworfCBgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoYF9zdGF0ZW1lbnQsIHN1YnN0cmluZ19gKTtgIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKK3RvIGFzc2VydCB0aGF0IF9zdGF0ZW1lbnRfIGdlbmVyYXRlcyBhIGZhdGFsIChlLmcuIGBBU1NFUlRfKmApIGZhaWx1cmUKK3dob3NlIG1lc3NhZ2UgY29udGFpbnMgdGhlIGdpdmVuIF9zdWJzdHJpbmdfLCBvciB1c2UKKworfCBgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoYF9zdGF0ZW1lbnQsIHN1YnN0cmluZ19gKTtgIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKK2lmIHlvdSBhcmUgZXhwZWN0aW5nIGEgbm9uLWZhdGFsIChlLmcuIGBFWFBFQ1RfKmApIGZhaWx1cmUuCisKK0ZvciB0ZWNobmljYWwgcmVhc29ucywgdGhlcmUgYXJlIHNvbWUgY2F2ZWF0czoKKworICAxLiBZb3UgY2Fubm90IHN0cmVhbSBhIGZhaWx1cmUgbWVzc2FnZSB0byBlaXRoZXIgbWFjcm8uCisgIDEuIF9zdGF0ZW1lbnRfIGluIGBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpYCBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsIG5vbi1zdGF0aWMgdmFyaWFibGVzIG9yIG5vbi1zdGF0aWMgbWVtYmVycyBvZiBgdGhpc2Agb2JqZWN0LgorICAxLiBfc3RhdGVtZW50XyBpbiBgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKWAgY2Fubm90IHJldHVybiBhIHZhbHVlLgorCitfTm90ZTpfIEdvb2dsZSBUZXN0IGlzIGRlc2lnbmVkIHdpdGggdGhyZWFkcyBpbiBtaW5kLiAgT25jZSB0aGUKK3N5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGluIGAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oImAgaGF2ZQorYmVlbiBpbXBsZW1lbnRlZCwgR29vZ2xlIFRlc3Qgd2lsbCBiZWNvbWUgdGhyZWFkLXNhZmUsIG1lYW5pbmcgdGhhdAoreW91IGNhbiB0aGVuIHVzZSBhc3NlcnRpb25zIGluIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LiAgQmVmb3JlCisKK3RoYXQsIGhvd2V2ZXIsIEdvb2dsZSBUZXN0IG9ubHkgc3VwcG9ydHMgc2luZ2xlLXRocmVhZGVkIHVzYWdlLiAgT25jZQordGhyZWFkLXNhZmUsIGBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpYCBhbmQgYEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKClgCit3aWxsIGNhcHR1cmUgZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIG9ubHkuIElmIF9zdGF0ZW1lbnRfCitjcmVhdGVzIG5ldyB0aHJlYWRzLCBmYWlsdXJlcyBpbiB0aGVzZSB0aHJlYWRzIHdpbGwgYmUgaWdub3JlZC4gIElmCit5b3Ugd2FudCB0byBjYXB0dXJlIGZhaWx1cmVzIGZyb20gYWxsIHRocmVhZHMgaW5zdGVhZCwgeW91IHNob3VsZCB1c2UKK3RoZSBmb2xsb3dpbmcgbWFjcm9zOgorCit8IGBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhgX3N0YXRlbWVudCwgc3Vic3RyaW5nX2ApO2AgfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKGBfc3RhdGVtZW50LCBzdWJzdHJpbmdfYCk7YCB8CisKKyMgR2V0dGluZyB0aGUgQ3VycmVudCBUZXN0J3MgTmFtZSAjCisKK1NvbWV0aW1lcyBhIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGtub3cgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuCitGb3IgZXhhbXBsZSwgeW91IG1heSBiZSB1c2luZyB0aGUgYFNldFVwKClgIG1ldGhvZCBvZiB5b3VyIHRlc3QgZml4dHVyZSB0byBzZXQKK3RoZSBnb2xkZW4gZmlsZSBuYW1lIGJhc2VkIG9uIHdoaWNoIHRlc3QgaXMgcnVubmluZy4gVGhlIGA6OnRlc3Rpbmc6OlRlc3RJbmZvYAorY2xhc3MgaGFzIHRoaXMgaW5mb3JtYXRpb246CisKK2BgYAorbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBUZXN0SW5mbyB7CisgcHVibGljOgorICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgbmFtZSBhbmQgdGhlIHRlc3QgbmFtZSwgcmVzcGVjdGl2ZWx5LgorICAvLworICAvLyBEbyBOT1QgZGVsZXRlIG9yIGZyZWUgdGhlIHJldHVybiB2YWx1ZSAtIGl0J3MgbWFuYWdlZCBieSB0aGUKKyAgLy8gVGVzdEluZm8gY2xhc3MuCisgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lKCkgY29uc3Q7CisgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCitgYGAKKworCis+IFRvIG9idGFpbiBhIGBUZXN0SW5mb2Agb2JqZWN0IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdCwgY2FsbAorYGN1cnJlbnRfdGVzdF9pbmZvKClgIG9uIHRoZSBgVW5pdFRlc3RgIHNpbmdsZXRvbiBvYmplY3Q6CisKK2BgYAorLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4KKy8vIERvIE5PVCBkZWxldGUgdGhlIHJldHVybmVkIG9iamVjdCAtIGl0J3MgbWFuYWdlZCBieSB0aGUgVW5pdFRlc3QgY2xhc3MuCitjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworcHJpbnRmKCJXZSBhcmUgaW4gdGVzdCAlcyBvZiB0ZXN0IGNhc2UgJXMuXG4iLAorICAgICAgIHRlc3RfaW5mby0+bmFtZSgpLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpOworYGBgCisKK2BjdXJyZW50X3Rlc3RfaW5mbygpYCByZXR1cm5zIGEgbnVsbCBwb2ludGVyIGlmIG5vIHRlc3QgaXMgcnVubmluZy4gSW4KK3BhcnRpY3VsYXIsIHlvdSBjYW5ub3QgZmluZCB0aGUgdGVzdCBjYXNlIG5hbWUgaW4gYFRlc3RDYXNlU2V0VXAoKWAsCitgVGVzdENhc2VUZWFyRG93bigpYCAod2hlcmUgeW91IGtub3cgdGhlIHRlc3QgY2FzZSBuYW1lIGltcGxpY2l0bHkpLCBvcgorZnVuY3Rpb25zIGNhbGxlZCBmcm9tIHRoZW0uCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIEV4dGVuZGluZyBHb29nbGUgVGVzdCBieSBIYW5kbGluZyBUZXN0IEV2ZW50cyAjCisKK0dvb2dsZSBUZXN0IHByb3ZpZGVzIGFuIDxiPmV2ZW50IGxpc3RlbmVyIEFQSTwvYj4gdG8gbGV0IHlvdSByZWNlaXZlCitub3RpZmljYXRpb25zIGFib3V0IHRoZSBwcm9ncmVzcyBvZiBhIHRlc3QgcHJvZ3JhbSBhbmQgdGVzdAorZmFpbHVyZXMuIFRoZSBldmVudHMgeW91IGNhbiBsaXN0ZW4gdG8gaW5jbHVkZSB0aGUgc3RhcnQgYW5kIGVuZCBvZgordGhlIHRlc3QgcHJvZ3JhbSwgYSB0ZXN0IGNhc2UsIG9yIGEgdGVzdCBtZXRob2QsIGFtb25nIG90aGVycy4gWW91IG1heQordXNlIHRoaXMgQVBJIHRvIGF1Z21lbnQgb3IgcmVwbGFjZSB0aGUgc3RhbmRhcmQgY29uc29sZSBvdXRwdXQsCityZXBsYWNlIHRoZSBYTUwgb3V0cHV0LCBvciBwcm92aWRlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgZm9ybSBvZgorb3V0cHV0LCBzdWNoIGFzIGEgR1VJIG9yIGEgZGF0YWJhc2UuIFlvdSBjYW4gYWxzbyB1c2UgdGVzdCBldmVudHMgYXMKK2NoZWNrcG9pbnRzIHRvIGltcGxlbWVudCBhIHJlc291cmNlIGxlYWsgY2hlY2tlciwgZm9yIGV4YW1wbGUuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2MS40LjAuCisKKyMjIERlZmluaW5nIEV2ZW50IExpc3RlbmVycyAjIworCitUbyBkZWZpbmUgYSBldmVudCBsaXN0ZW5lciwgeW91IHN1YmNsYXNzIGVpdGhlcgorW3Rlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM4NTUpCitvciBbdGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgjOTA1KS4KK1RoZSBmb3JtZXIgaXMgYW4gKGFic3RyYWN0KSBpbnRlcmZhY2UsIHdoZXJlIDxpPmVhY2ggcHVyZSB2aXJ0dWFsIG1ldGhvZDxicj4KK2NhbiBiZSBvdmVycmlkZGVuIHRvIGhhbmRsZSBhIHRlc3QgZXZlbnQ8L2k+IChGb3IgZXhhbXBsZSwgd2hlbiBhIHRlc3QKK3N0YXJ0cywgdGhlIGBPblRlc3RTdGFydCgpYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuKS4gVGhlIGxhdHRlciBwcm92aWRlcworYW4gZW1wdHkgaW1wbGVtZW50YXRpb24gb2YgYWxsIG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSwgc3VjaCB0aGF0IGEKK3N1YmNsYXNzIG9ubHkgbmVlZHMgdG8gb3ZlcnJpZGUgdGhlIG1ldGhvZHMgaXQgY2FyZXMgYWJvdXQuCisKK1doZW4gYW4gZXZlbnQgaXMgZmlyZWQsIGl0cyBjb250ZXh0IGlzIHBhc3NlZCB0byB0aGUgaGFuZGxlciBmdW5jdGlvbgorYXMgYW4gYXJndW1lbnQuIFRoZSBmb2xsb3dpbmcgYXJndW1lbnQgdHlwZXMgYXJlIHVzZWQ6CisgICogW1VuaXRUZXN0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCMxMDA3KSByZWZsZWN0cyB0aGUgc3RhdGUgb2YgdGhlIGVudGlyZSB0ZXN0IHByb2dyYW0sCisgICogW1Rlc3RDYXNlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM2ODkpIGhhcyBpbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QgY2FzZSwgd2hpY2ggY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgdGVzdHMsCisgICogW1Rlc3RJbmZvXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM1OTkpIGNvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIHRlc3QsIGFuZAorICAqIFtUZXN0UGFydFJlc3VsdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oIzQyKSByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSB0ZXN0IGFzc2VydGlvbi4KKworQW4gZXZlbnQgaGFuZGxlciBmdW5jdGlvbiBjYW4gZXhhbWluZSB0aGUgYXJndW1lbnQgaXQgcmVjZWl2ZXMgdG8gZmluZAorb3V0IGludGVyZXN0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudCBhbmQgdGhlIHRlc3QgcHJvZ3JhbSdzCitzdGF0ZS4gIEhlcmUncyBhbiBleGFtcGxlOgorCitgYGAKKyAgY2xhc3MgTWluaW1hbGlzdFByaW50ZXIgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyAgICAvLyBDYWxsZWQgYmVmb3JlIGEgdGVzdCBzdGFydHMuCisgICAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgICAgcHJpbnRmKCIqKiogVGVzdCAlcy4lcyBzdGFydGluZy5cbiIsCisgICAgICAgICAgICAgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgIH0KKworICAgIC8vIENhbGxlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdCgKKyAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICAgICAgcHJpbnRmKCIlcyBpbiAlczolZFxuJXNcbiIsCisgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5mYWlsZWQoKSA/ICIqKiogRmFpbHVyZSIgOiAiU3VjY2VzcyIsCisgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKSwKKyAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCksCisgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5zdW1tYXJ5KCkpOworICAgIH0KKworICAgIC8vIENhbGxlZCBhZnRlciBhIHRlc3QgZW5kcy4KKyAgICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgICAgcHJpbnRmKCIqKiogVGVzdCAlcy4lcyBlbmRpbmcuXG4iLAorICAgICAgICAgICAgIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgICB9CisgIH07CitgYGAKKworIyMgVXNpbmcgRXZlbnQgTGlzdGVuZXJzICMjCisKK1RvIHVzZSB0aGUgZXZlbnQgbGlzdGVuZXIgeW91IGhhdmUgZGVmaW5lZCwgYWRkIGFuIGluc3RhbmNlIG9mIGl0IHRvCit0aGUgR29vZ2xlIFRlc3QgZXZlbnQgbGlzdGVuZXIgbGlzdCAocmVwcmVzZW50ZWQgYnkgY2xhc3MKK1tUZXN0RXZlbnRMaXN0ZW5lcnNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIzkyOSkKKy0gbm90ZSB0aGUgInMiIGF0IHRoZSBlbmQgb2YgdGhlIG5hbWUpIGluIHlvdXIKK2BtYWluKClgIGZ1bmN0aW9uLCBiZWZvcmUgY2FsbGluZyBgUlVOX0FMTF9URVNUUygpYDoKK2BgYAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAvLyBHZXRzIGhvbGQgb2YgdGhlIGV2ZW50IGxpc3RlbmVyIGxpc3QuCisgIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMgPQorICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCk7CisgIC8vIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgZW5kLiAgR29vZ2xlIFRlc3QgdGFrZXMgdGhlIG93bmVyc2hpcC4KKyAgbGlzdGVuZXJzLkFwcGVuZChuZXcgTWluaW1hbGlzdFByaW50ZXIpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorYGBgCisKK1RoZXJlJ3Mgb25seSBvbmUgcHJvYmxlbTogdGhlIGRlZmF1bHQgdGVzdCByZXN1bHQgcHJpbnRlciBpcyBzdGlsbCBpbgorZWZmZWN0LCBzbyBpdHMgb3V0cHV0IHdpbGwgbWluZ2xlIHdpdGggdGhlIG91dHB1dCBmcm9tIHlvdXIgbWluaW1hbGlzdAorcHJpbnRlci4gVG8gc3VwcHJlc3MgdGhlIGRlZmF1bHQgcHJpbnRlciwganVzdCByZWxlYXNlIGl0IGZyb20gdGhlCitldmVudCBsaXN0ZW5lciBsaXN0IGFuZCBkZWxldGUgaXQuIFlvdSBjYW4gZG8gc28gYnkgYWRkaW5nIG9uZSBsaW5lOgorYGBgCisgIC4uLgorICBkZWxldGUgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSk7CisgIGxpc3RlbmVycy5BcHBlbmQobmV3IE1pbmltYWxpc3RQcmludGVyKTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK2BgYAorCitOb3csIHNpdCBiYWNrIGFuZCBlbmpveSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IG91dHB1dCBmcm9tIHlvdXIKK3Rlc3RzLiBGb3IgbW9yZSBkZXRhaWxzLCB5b3UgY2FuIHJlYWQgdGhpcworW3NhbXBsZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MpLgorCitZb3UgbWF5IGFwcGVuZCBtb3JlIHRoYW4gb25lIGxpc3RlbmVyIHRvIHRoZSBsaXN0LiBXaGVuIGFuIGBPbipTdGFydCgpYAorb3IgYE9uVGVzdFBhcnRSZXN1bHQoKWAgZXZlbnQgaXMgZmlyZWQsIHRoZSBsaXN0ZW5lcnMgd2lsbCByZWNlaXZlIGl0IGluCit0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGxpc3QgKHNpbmNlIG5ldyBsaXN0ZW5lcnMgYXJlIGFkZGVkIHRvCit0aGUgZW5kIG9mIHRoZSBsaXN0LCB0aGUgZGVmYXVsdCB0ZXh0IHByaW50ZXIgYW5kIHRoZSBkZWZhdWx0IFhNTAorZ2VuZXJhdG9yIHdpbGwgcmVjZWl2ZSB0aGUgZXZlbnQgZmlyc3QpLiBBbiBgT24qRW5kKClgIGV2ZW50IHdpbGwgYmUKK3JlY2VpdmVkIGJ5IHRoZSBsaXN0ZW5lcnMgaW4gdGhlIF9yZXZlcnNlXyBvcmRlci4gVGhpcyBhbGxvd3Mgb3V0cHV0IGJ5CitsaXN0ZW5lcnMgYWRkZWQgbGF0ZXIgdG8gYmUgZnJhbWVkIGJ5IG91dHB1dCBmcm9tIGxpc3RlbmVycyBhZGRlZAorZWFybGllci4KKworIyMgR2VuZXJhdGluZyBGYWlsdXJlcyBpbiBMaXN0ZW5lcnMgIyMKKworWW91IG1heSB1c2UgZmFpbHVyZS1yYWlzaW5nIG1hY3JvcyAoYEVYUEVDVF8qKClgLCBgQVNTRVJUXyooKWAsCitgRkFJTCgpYCwgZXRjKSB3aGVuIHByb2Nlc3NpbmcgYW4gZXZlbnQuIFRoZXJlIGFyZSBzb21lIHJlc3RyaWN0aW9uczoKKworICAxLiBZb3UgY2Fubm90IGdlbmVyYXRlIGFueSBmYWlsdXJlIGluIGBPblRlc3RQYXJ0UmVzdWx0KClgIChvdGhlcndpc2UgaXQgd2lsbCBjYXVzZSBgT25UZXN0UGFydFJlc3VsdCgpYCB0byBiZSBjYWxsZWQgcmVjdXJzaXZlbHkpLgorICAxLiBBIGxpc3RlbmVyIHRoYXQgaGFuZGxlcyBgT25UZXN0UGFydFJlc3VsdCgpYCBpcyBub3QgYWxsb3dlZCB0byBnZW5lcmF0ZSBhbnkgZmFpbHVyZS4KKworV2hlbiB5b3UgYWRkIGxpc3RlbmVycyB0byB0aGUgbGlzdGVuZXIgbGlzdCwgeW91IHNob3VsZCBwdXQgbGlzdGVuZXJzCit0aGF0IGhhbmRsZSBgT25UZXN0UGFydFJlc3VsdCgpYCBfYmVmb3JlXyBsaXN0ZW5lcnMgdGhhdCBjYW4gZ2VuZXJhdGUKK2ZhaWx1cmVzLiBUaGlzIGVuc3VyZXMgdGhhdCBmYWlsdXJlcyBnZW5lcmF0ZWQgYnkgdGhlIGxhdHRlciBhcmUKK2F0dHJpYnV0ZWQgdG8gdGhlIHJpZ2h0IHRlc3QgYnkgdGhlIGZvcm1lci4KKworV2UgaGF2ZSBhIHNhbXBsZSBvZiBmYWlsdXJlLXJhaXNpbmcgbGlzdGVuZXIKK1toZXJlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QuY2MpLgorCisjIFJ1bm5pbmcgVGVzdCBQcm9ncmFtczogQWR2YW5jZWQgT3B0aW9ucyAjCisKK0dvb2dsZSBUZXN0IHRlc3QgcHJvZ3JhbXMgYXJlIG9yZGluYXJ5IGV4ZWN1dGFibGVzLiBPbmNlIGJ1aWx0LCB5b3UgY2FuIHJ1bgordGhlbSBkaXJlY3RseSBhbmQgYWZmZWN0IHRoZWlyIGJlaGF2aW9yIHZpYSB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcworYW5kL29yIGNvbW1hbmQgbGluZSBmbGFncy4gRm9yIHRoZSBmbGFncyB0byB3b3JrLCB5b3VyIHByb2dyYW1zIG11c3QgY2FsbAorYDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKWAgYmVmb3JlIGNhbGxpbmcgYFJVTl9BTExfVEVTVFMoKWAuCisKK1RvIHNlZSBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGZsYWdzIGFuZCB0aGVpciB1c2FnZSwgcGxlYXNlIHJ1biB5b3VyIHRlc3QKK3Byb2dyYW0gd2l0aCB0aGUgYC0taGVscGAgZmxhZy4gIFlvdSBjYW4gYWxzbyB1c2UgYC1oYCwgYC0/YCwgb3IgYC8/YAorZm9yIHNob3J0LiAgVGhpcyBmZWF0dXJlIGlzIGFkZGVkIGluIHZlcnNpb24gMS4zLjAuCisKK0lmIGFuIG9wdGlvbiBpcyBzcGVjaWZpZWQgYm90aCBieSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgYnkgYQorZmxhZywgdGhlIGxhdHRlciB0YWtlcyBwcmVjZWRlbmNlLiAgTW9zdCBvZiB0aGUgb3B0aW9ucyBjYW4gYWxzbyBiZQorc2V0L3JlYWQgaW4gY29kZTogdG8gYWNjZXNzIHRoZSB2YWx1ZSBvZiBjb21tYW5kIGxpbmUgZmxhZworYC0tZ3Rlc3RfZm9vYCwgd3JpdGUgYDo6dGVzdGluZzo6R1RFU1RfRkxBRyhmb28pYC4gIEEgY29tbW9uIHBhdHRlcm4gaXMKK3RvIHNldCB0aGUgdmFsdWUgb2YgYSBmbGFnIGJlZm9yZSBjYWxsaW5nIGA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KClgCit0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZsYWc6CitgYGAKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAvLyBEaXNhYmxlcyBlbGFwc2VkIHRpbWUgYnkgZGVmYXVsdC4KKyAgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gZmFsc2U7CisKKyAgLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGZsYWcgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KK2BgYAorCisjIyBTZWxlY3RpbmcgVGVzdHMgIyMKKworVGhpcyBzZWN0aW9uIHNob3dzIHZhcmlvdXMgb3B0aW9ucyBmb3IgY2hvb3Npbmcgd2hpY2ggdGVzdHMgdG8gcnVuLgorCisjIyMgTGlzdGluZyBUZXN0IE5hbWVzICMjIworCitTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpc3QgdGhlIGF2YWlsYWJsZSB0ZXN0cyBpbiBhIHByb2dyYW0gYmVmb3JlCitydW5uaW5nIHRoZW0gc28gdGhhdCBhIGZpbHRlciBtYXkgYmUgYXBwbGllZCBpZiBuZWVkZWQuIEluY2x1ZGluZyB0aGUgZmxhZworYC0tZ3Rlc3RfbGlzdF90ZXN0c2Agb3ZlcnJpZGVzIGFsbCBvdGhlciBmbGFncyBhbmQgbGlzdHMgdGVzdHMgaW4gdGhlIGZvbGxvd2luZworZm9ybWF0OgorYGBgCitUZXN0Q2FzZTEuCisgIFRlc3ROYW1lMQorICBUZXN0TmFtZTIKK1Rlc3RDYXNlMi4KKyAgVGVzdE5hbWUKK2BgYAorCitOb25lIG9mIHRoZSB0ZXN0cyBsaXN0ZWQgYXJlIGFjdHVhbGx5IHJ1biBpZiB0aGUgZmxhZyBpcyBwcm92aWRlZC4gVGhlcmUgaXMgbm8KK2NvcnJlc3BvbmRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRoaXMgZmxhZy4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIyBSdW5uaW5nIGEgU3Vic2V0IG9mIHRoZSBUZXN0cyAjIyMKKworQnkgZGVmYXVsdCwgYSBHb29nbGUgVGVzdCBwcm9ncmFtIHJ1bnMgYWxsIHRlc3RzIHRoZSB1c2VyIGhhcyBkZWZpbmVkLgorU29tZXRpbWVzLCB5b3Ugd2FudCB0byBydW4gb25seSBhIHN1YnNldCBvZiB0aGUgdGVzdHMgKGUuZy4gZm9yIGRlYnVnZ2luZyBvcgorcXVpY2tseSB2ZXJpZnlpbmcgYSBjaGFuZ2UpLiBJZiB5b3Ugc2V0IHRoZSBgR1RFU1RfRklMVEVSYCBlbnZpcm9ubWVudCB2YXJpYWJsZQorb3IgdGhlIGAtLWd0ZXN0X2ZpbHRlcmAgZmxhZyB0byBhIGZpbHRlciBzdHJpbmcsIEdvb2dsZSBUZXN0IHdpbGwgb25seSBydW4gdGhlCit0ZXN0cyB3aG9zZSBmdWxsIG5hbWVzIChpbiB0aGUgZm9ybSBvZiBgVGVzdENhc2VOYW1lLlRlc3ROYW1lYCkgbWF0Y2ggdGhlCitmaWx0ZXIuCisKK1RoZSBmb3JtYXQgb2YgYSBmaWx0ZXIgaXMgYSAnYDpgJy1zZXBhcmF0ZWQgbGlzdCBvZiB3aWxkY2FyZCBwYXR0ZXJucyAoY2FsbGVkCit0aGUgcG9zaXRpdmUgcGF0dGVybnMpIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAnYC1gJyBhbmQgYW5vdGhlcgorJ2A6YCctc2VwYXJhdGVkIHBhdHRlcm4gbGlzdCAoY2FsbGVkIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucykuIEEgdGVzdCBtYXRjaGVzIHRoZQorZmlsdGVyIGlmIGFuZCBvbmx5IGlmIGl0IG1hdGNoZXMgYW55IG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBidXQgZG9lcyBub3QKK21hdGNoIGFueSBvZiB0aGUgbmVnYXRpdmUgcGF0dGVybnMuCisKK0EgcGF0dGVybiBtYXkgY29udGFpbiBgJyonYCAobWF0Y2hlcyBhbnkgc3RyaW5nKSBvciBgJz8nYCAobWF0Y2hlcyBhbnkgc2luZ2xlCitjaGFyYWN0ZXIpLiBGb3IgY29udmVuaWVuY2UsIHRoZSBmaWx0ZXIgYCcqLU5lZ2F0aXZlUGF0dGVybnMnYCBjYW4gYmUgYWxzbword3JpdHRlbiBhcyBgJy1OZWdhdGl2ZVBhdHRlcm5zJ2AuCisKK0ZvciBleGFtcGxlOgorCisgICogYC4vZm9vX3Rlc3RgIEhhcyBubyBmbGFnLCBhbmQgdGh1cyBydW5zIGFsbCBpdHMgdGVzdHMuCisgICogYC4vZm9vX3Rlc3QgLS1ndGVzdF9maWx0ZXI9KmAgQWxzbyBydW5zIGV2ZXJ5dGhpbmcsIGR1ZSB0byB0aGUgc2luZ2xlIG1hdGNoLWV2ZXJ5dGhpbmcgYCpgIHZhbHVlLgorICAqIGAuL2Zvb190ZXN0IC0tZ3Rlc3RfZmlsdGVyPUZvb1Rlc3QuKmAgUnVucyBldmVyeXRoaW5nIGluIHRlc3QgY2FzZSBgRm9vVGVzdGAuCisgICogYC4vZm9vX3Rlc3QgLS1ndGVzdF9maWx0ZXI9Kk51bGwqOipDb25zdHJ1Y3RvcipgIFJ1bnMgYW55IHRlc3Qgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIGVpdGhlciBgIk51bGwiYCBvciBgIkNvbnN0cnVjdG9yImAuCisgICogYC4vZm9vX3Rlc3QgLS1ndGVzdF9maWx0ZXI9LSpEZWF0aFRlc3QuKmAgUnVucyBhbGwgbm9uLWRlYXRoIHRlc3RzLgorICAqIGAuL2Zvb190ZXN0IC0tZ3Rlc3RfZmlsdGVyPUZvb1Rlc3QuKi1Gb29UZXN0LkJhcmAgUnVucyBldmVyeXRoaW5nIGluIHRlc3QgY2FzZSBgRm9vVGVzdGAgZXhjZXB0IGBGb29UZXN0LkJhcmAuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgVGVtcG9yYXJpbHkgRGlzYWJsaW5nIFRlc3RzICMjIworCitJZiB5b3UgaGF2ZSBhIGJyb2tlbiB0ZXN0IHRoYXQgeW91IGNhbm5vdCBmaXggcmlnaHQgYXdheSwgeW91IGNhbiBhZGQgdGhlCitgRElTQUJMRURfYCBwcmVmaXggdG8gaXRzIG5hbWUuIFRoaXMgd2lsbCBleGNsdWRlIGl0IGZyb20gZXhlY3V0aW9uLiBUaGlzIGlzCitiZXR0ZXIgdGhhbiBjb21tZW50aW5nIG91dCB0aGUgY29kZSBvciB1c2luZyBgI2lmIDBgLCBhcyBkaXNhYmxlZCB0ZXN0cyBhcmUKK3N0aWxsIGNvbXBpbGVkIChhbmQgdGh1cyB3b24ndCByb3QpLgorCitJZiB5b3UgbmVlZCB0byBkaXNhYmxlIGFsbCB0ZXN0cyBpbiBhIHRlc3QgY2FzZSwgeW91IGNhbiBlaXRoZXIgYWRkIGBESVNBQkxFRF9gCit0byB0aGUgZnJvbnQgb2YgdGhlIG5hbWUgb2YgZWFjaCB0ZXN0LCBvciBhbHRlcm5hdGl2ZWx5IGFkZCBpdCB0byB0aGUgZnJvbnQgb2YKK3RoZSB0ZXN0IGNhc2UgbmFtZS4KKworRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdGVzdHMgd29uJ3QgYmUgcnVuIGJ5IEdvb2dsZSBUZXN0LCBldmVuIHRob3VnaCB0aGV5Cit3aWxsIHN0aWxsIGJlIGNvbXBpbGVkOgorCitgYGAKKy8vIFRlc3RzIHRoYXQgRm9vIGRvZXMgQWJjLgorVEVTVChGb29UZXN0LCBESVNBQkxFRF9Eb2VzQWJjKSB7IC4uLiB9CisKK2NsYXNzIERJU0FCTEVEX0JhclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsgLi4uIH07CisKKy8vIFRlc3RzIHRoYXQgQmFyIGRvZXMgWHl6LgorVEVTVF9GKERJU0FCTEVEX0JhclRlc3QsIERvZXNYeXopIHsgLi4uIH0KK2BgYAorCitfTm90ZTpfIFRoaXMgZmVhdHVyZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZW1wb3JhcnkgcGFpbi1yZWxpZWYuIFlvdSBzdGlsbAoraGF2ZSB0byBmaXggdGhlIGRpc2FibGVkIHRlc3RzIGF0IGEgbGF0ZXIgZGF0ZS4gQXMgYSByZW1pbmRlciwgR29vZ2xlIFRlc3Qgd2lsbAorcHJpbnQgYSBiYW5uZXIgd2FybmluZyB5b3UgaWYgYSB0ZXN0IHByb2dyYW0gY29udGFpbnMgYW55IGRpc2FibGVkIHRlc3RzLgorCitfVGlwOl8gWW91IGNhbiBlYXNpbHkgY291bnQgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB5b3UgaGF2ZQordXNpbmcgYGdyZXBgLiBUaGlzIG51bWJlciBjYW4gYmUgdXNlZCBhcyBhIG1ldHJpYyBmb3IgaW1wcm92aW5nIHlvdXIKK3Rlc3QgcXVhbGl0eS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIyBUZW1wb3JhcmlseSBFbmFibGluZyBEaXNhYmxlZCBUZXN0cyAjIyMKKworVG8gaW5jbHVkZSBbZGlzYWJsZWQgdGVzdHNdKCNUZW1wb3JhcmlseV9EaXNhYmxpbmdfVGVzdHMubWQpIGluIHRlc3QKK2V4ZWN1dGlvbiwganVzdCBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB3aXRoIHRoZQorYC0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNgIGZsYWcgb3Igc2V0IHRoZQorYEdURVNUX0FMU09fUlVOX0RJU0FCTEVEX1RFU1RTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIHZhbHVlIG90aGVyCit0aGFuIGAwYC4gIFlvdSBjYW4gY29tYmluZSB0aGlzIHdpdGggdGhlCitbLS1ndGVzdFxfZmlsdGVyXSgjUnVubmluZ19hX1N1YnNldF9vZl90aGVfVGVzdHMubWQpIGZsYWcgdG8gZnVydGhlciBzZWxlY3QKK3doaWNoIGRpc2FibGVkIHRlc3RzIHRvIHJ1bi4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWM7IHNpbmNlIHZlcnNpb24gMS4zLjAuCisKKyMjIFJlcGVhdGluZyB0aGUgVGVzdHMgIyMKKworT25jZSBpbiBhIHdoaWxlIHlvdSdsbCBydW4gaW50byBhIHRlc3Qgd2hvc2UgcmVzdWx0IGlzIGhpdC1vci1taXNzLiBQZXJoYXBzIGl0Cit3aWxsIGZhaWwgb25seSAxJSBvZiB0aGUgdGltZSwgbWFraW5nIGl0IHJhdGhlciBoYXJkIHRvIHJlcHJvZHVjZSB0aGUgYnVnIHVuZGVyCithIGRlYnVnZ2VyLiBUaGlzIGNhbiBiZSBhIG1ham9yIHNvdXJjZSBvZiBmcnVzdHJhdGlvbi4KKworVGhlIGAtLWd0ZXN0X3JlcGVhdGAgZmxhZyBhbGxvd3MgeW91IHRvIHJlcGVhdCBhbGwgKG9yIHNlbGVjdGVkKSB0ZXN0IG1ldGhvZHMKK2luIGEgcHJvZ3JhbSBtYW55IHRpbWVzLiBIb3BlZnVsbHksIGEgZmxha3kgdGVzdCB3aWxsIGV2ZW50dWFsbHkgZmFpbCBhbmQgZ2l2ZQoreW91IGEgY2hhbmNlIHRvIGRlYnVnLiBIZXJlJ3MgaG93IHRvIHVzZSBpdDoKKworfCBgJCBmb29fdGVzdCAtLWd0ZXN0X3JlcGVhdD0xMDAwYCB8IFJlcGVhdCBmb29cX3Rlc3QgMTAwMCB0aW1lcyBhbmQgZG9uJ3Qgc3RvcCBhdCBmYWlsdXJlcy4gfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgJCBmb29fdGVzdCAtLWd0ZXN0X3JlcGVhdD0tMWAgICB8IEEgbmVnYXRpdmUgY291bnQgbWVhbnMgcmVwZWF0aW5nIGZvcmV2ZXIuICAgICAgICAgICAgICAgfAorfCBgJCBmb29fdGVzdCAtLWd0ZXN0X3JlcGVhdD0xMDAwIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZWAgfCBSZXBlYXQgZm9vXF90ZXN0IDEwMDAgdGltZXMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBmYWlsdXJlLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gcnVubmluZyB1bmRlciBhIGRlYnVnZ2VyOiB3aGVuIHRoZSB0ZXN0ZmFpbHMsIGl0IHdpbGwgZHJvcCBpbnRvIHRoZSBkZWJ1Z2dlciBhbmQgeW91IGNhbiB0aGVuIGluc3BlY3QgdmFyaWFibGVzIGFuZCBzdGFja3MuIHwKK3wgYCQgZm9vX3Rlc3QgLS1ndGVzdF9yZXBlYXQ9MTAwMCAtLWd0ZXN0X2ZpbHRlcj1Gb29CYXJgIHwgUmVwZWF0IHRoZSB0ZXN0cyB3aG9zZSBuYW1lIG1hdGNoZXMgdGhlIGZpbHRlciAxMDAwIHRpbWVzLiB8CisKK0lmIHlvdXIgdGVzdCBwcm9ncmFtIGNvbnRhaW5zIGdsb2JhbCBzZXQtdXAvdGVhci1kb3duIGNvZGUgcmVnaXN0ZXJlZAordXNpbmcgYEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpYCwgaXQgd2lsbCBiZSByZXBlYXRlZCBpbiBlYWNoCitpdGVyYXRpb24gYXMgd2VsbCwgYXMgdGhlIGZsYWtpbmVzcyBtYXkgYmUgaW4gaXQuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5Cit0aGUgcmVwZWF0IGNvdW50IGJ5IHNldHRpbmcgdGhlIGBHVEVTVF9SRVBFQVRgIGVudmlyb25tZW50IHZhcmlhYmxlLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMgU2h1ZmZsaW5nIHRoZSBUZXN0cyAjIworCitZb3UgY2FuIHNwZWNpZnkgdGhlIGAtLWd0ZXN0X3NodWZmbGVgIGZsYWcgKG9yIHNldCB0aGUgYEdURVNUX1NIVUZGTEVgCitlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBgMWApIHRvIHJ1biB0aGUgdGVzdHMgaW4gYSBwcm9ncmFtIGluIGEgcmFuZG9tCitvcmRlci4gVGhpcyBoZWxwcyB0byByZXZlYWwgYmFkIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRlc3RzLgorCitCeSBkZWZhdWx0LCBHb29nbGUgVGVzdCB1c2VzIGEgcmFuZG9tIHNlZWQgY2FsY3VsYXRlZCBmcm9tIHRoZSBjdXJyZW50Cit0aW1lLiBUaGVyZWZvcmUgeW91J2xsIGdldCBhIGRpZmZlcmVudCBvcmRlciBldmVyeSB0aW1lLiBUaGUgY29uc29sZQorb3V0cHV0IGluY2x1ZGVzIHRoZSByYW5kb20gc2VlZCB2YWx1ZSwgc3VjaCB0aGF0IHlvdSBjYW4gcmVwcm9kdWNlIGFuCitvcmRlci1yZWxhdGVkIHRlc3QgZmFpbHVyZSBsYXRlci4gVG8gc3BlY2lmeSB0aGUgcmFuZG9tIHNlZWQKK2V4cGxpY2l0bHksIHVzZSB0aGUgYC0tZ3Rlc3RfcmFuZG9tX3NlZWQ9U0VFRGAgZmxhZyAob3Igc2V0IHRoZQorYEdURVNUX1JBTkRPTV9TRUVEYCBlbnZpcm9ubWVudCB2YXJpYWJsZSksIHdoZXJlIGBTRUVEYCBpcyBhbiBpbnRlZ2VyCitiZXR3ZWVuIDAgYW5kIDk5OTk5LiBUaGUgc2VlZCB2YWx1ZSAwIGlzIHNwZWNpYWw6IGl0IHRlbGxzIEdvb2dsZSBUZXN0Cit0byBkbyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBjYWxjdWxhdGluZyB0aGUgc2VlZCBmcm9tIHRoZSBjdXJyZW50Cit0aW1lLgorCitJZiB5b3UgY29tYmluZSB0aGlzIHdpdGggYC0tZ3Rlc3RfcmVwZWF0PU5gLCBHb29nbGUgVGVzdCB3aWxsIHBpY2sgYQorZGlmZmVyZW50IHJhbmRvbSBzZWVkIGFuZCByZS1zaHVmZmxlIHRoZSB0ZXN0cyBpbiBlYWNoIGl0ZXJhdGlvbi4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWM7IHNpbmNlIHYxLjQuMC4KKworIyMgQ29udHJvbGxpbmcgVGVzdCBPdXRwdXQgIyMKKworVGhpcyBzZWN0aW9uIHRlYWNoZXMgaG93IHRvIHR3ZWFrIHRoZSB3YXkgdGVzdCByZXN1bHRzIGFyZSByZXBvcnRlZC4KKworIyMjIENvbG9yZWQgVGVybWluYWwgT3V0cHV0ICMjIworCitHb29nbGUgVGVzdCBjYW4gdXNlIGNvbG9ycyBpbiBpdHMgdGVybWluYWwgb3V0cHV0IHRvIG1ha2UgaXQgZWFzaWVyIHRvIHNwb3QKK3RoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGVzdHMsIGFuZCB3aGV0aGVyIHRlc3RzIHBhc3NlZC4KKworWW91IGNhbiBzZXQgdGhlIEdURVNUXF9DT0xPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBzZXQgdGhlIGAtLWd0ZXN0X2NvbG9yYAorY29tbWFuZCBsaW5lIGZsYWcgdG8gYHllc2AsIGBub2AsIG9yIGBhdXRvYCAodGhlIGRlZmF1bHQpIHRvIGVuYWJsZSBjb2xvcnMsCitkaXNhYmxlIGNvbG9ycywgb3IgbGV0IEdvb2dsZSBUZXN0IGRlY2lkZS4gV2hlbiB0aGUgdmFsdWUgaXMgYGF1dG9gLCBHb29nbGUKK1Rlc3Qgd2lsbCB1c2UgY29sb3JzIGlmIGFuZCBvbmx5IGlmIHRoZSBvdXRwdXQgZ29lcyB0byBhIHRlcm1pbmFsIGFuZCAob24KK25vbi1XaW5kb3dzIHBsYXRmb3JtcykgdGhlIGBURVJNYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdG8gYHh0ZXJtYCBvcgorYHh0ZXJtLWNvbG9yYC4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIyBTdXBwcmVzc2luZyB0aGUgRWxhcHNlZCBUaW1lICMjIworCitCeSBkZWZhdWx0LCBHb29nbGUgVGVzdCBwcmludHMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gcnVuIGVhY2ggdGVzdC4gIFRvCitzdXBwcmVzcyB0aGF0LCBydW4gdGhlIHRlc3QgcHJvZ3JhbSB3aXRoIHRoZSBgLS1ndGVzdF9wcmludF90aW1lPTBgCitjb21tYW5kIGxpbmUgZmxhZy4gIFNldHRpbmcgdGhlIGBHVEVTVF9QUklOVF9USU1FYCBlbnZpcm9ubWVudAordmFyaWFibGUgdG8gYDBgIGhhcyB0aGUgc2FtZSBlZmZlY3QuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLiAgKEluIEdvb2dsZSBUZXN0IDEuMy4wIGFuZCBsb3dlciwKK3RoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoYXQgdGhlIGVsYXBzZWQgdGltZSBpcyAqKm5vdCoqIHByaW50ZWQuKQorCisjIyMgR2VuZXJhdGluZyBhbiBYTUwgUmVwb3J0ICMjIworCitHb29nbGUgVGVzdCBjYW4gZW1pdCBhIGRldGFpbGVkIFhNTCByZXBvcnQgdG8gYSBmaWxlIGluIGFkZGl0aW9uIHRvIGl0cyBub3JtYWwKK3RleHR1YWwgb3V0cHV0LiBUaGUgcmVwb3J0IGNvbnRhaW5zIHRoZSBkdXJhdGlvbiBvZiBlYWNoIHRlc3QsIGFuZCB0aHVzIGNhbgoraGVscCB5b3UgaWRlbnRpZnkgc2xvdyB0ZXN0cy4KKworVG8gZ2VuZXJhdGUgdGhlIFhNTCByZXBvcnQsIHNldCB0aGUgYEdURVNUX09VVFBVVGAgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlCitgLS1ndGVzdF9vdXRwdXRgIGZsYWcgdG8gdGhlIHN0cmluZyBgInhtbDpfcGF0aF90b19vdXRwdXRfZmlsZV8iYCwgd2hpY2ggd2lsbAorY3JlYXRlIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gWW91IGNhbiBhbHNvIGp1c3QgdXNlIHRoZSBzdHJpbmcKK2AieG1sImAsIGluIHdoaWNoIGNhc2UgdGhlIG91dHB1dCBjYW4gYmUgZm91bmQgaW4gdGhlIGB0ZXN0X2RldGFpbC54bWxgIGZpbGUgaW4KK3RoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworSWYgeW91IHNwZWNpZnkgYSBkaXJlY3RvcnkgKGZvciBleGFtcGxlLCBgInhtbDpvdXRwdXQvZGlyZWN0b3J5LyJgIG9uIExpbnV4IG9yCitgInhtbDpvdXRwdXRcZGlyZWN0b3J5XCJgIG9uIFdpbmRvd3MpLCBHb29nbGUgVGVzdCB3aWxsIGNyZWF0ZSB0aGUgWE1MIGZpbGUgaW4KK3RoYXQgZGlyZWN0b3J5LCBuYW1lZCBhZnRlciB0aGUgdGVzdCBleGVjdXRhYmxlIChlLmcuIGBmb29fdGVzdC54bWxgIGZvciB0ZXN0Citwcm9ncmFtIGBmb29fdGVzdGAgb3IgYGZvb190ZXN0LmV4ZWApLiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyAocGVyaGFwcyBsZWZ0CitvdmVyIGZyb20gYSBwcmV2aW91cyBydW4pLCBHb29nbGUgVGVzdCB3aWxsIHBpY2sgYSBkaWZmZXJlbnQgbmFtZSAoZS5nLgorYGZvb190ZXN0XzEueG1sYCkgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQuCisKK1RoZSByZXBvcnQgdXNlcyB0aGUgZm9ybWF0IGRlc2NyaWJlZCBoZXJlLiAgSXQgaXMgYmFzZWQgb24gdGhlCitganVuaXRyZXBvcnRgIEFudCB0YXNrIGFuZCBjYW4gYmUgcGFyc2VkIGJ5IHBvcHVsYXIgY29udGludW91cyBidWlsZAorc3lzdGVtcyBsaWtlIFtIdWRzb25dKGh0dHBzOi8vaHVkc29uLmRldi5qYXZhLm5ldC8pLiBTaW5jZSB0aGF0IGZvcm1hdAord2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgZm9yIEphdmEsIGEgbGl0dGxlIGludGVycHJldGF0aW9uIGlzIHJlcXVpcmVkCit0byBtYWtlIGl0IGFwcGx5IHRvIEdvb2dsZSBUZXN0IHRlc3RzLCBhcyBzaG93biBoZXJlOgorCitgYGAKKzx0ZXN0c3VpdGVzIG5hbWU9IkFsbFRlc3RzIiAuLi4+CisgIDx0ZXN0c3VpdGUgbmFtZT0idGVzdF9jYXNlX25hbWUiIC4uLj4KKyAgICA8dGVzdGNhc2UgbmFtZT0idGVzdF9uYW1lIiAuLi4+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iLz4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiIvPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIi8+CisgICAgPC90ZXN0Y2FzZT4KKyAgPC90ZXN0c3VpdGU+Cis8L3Rlc3RzdWl0ZXM+CitgYGAKKworICAqIFRoZSByb290IGA8dGVzdHN1aXRlcz5gIGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGVudGlyZSB0ZXN0IHByb2dyYW0uCisgICogYDx0ZXN0c3VpdGU+YCBlbGVtZW50cyBjb3JyZXNwb25kIHRvIEdvb2dsZSBUZXN0IHRlc3QgY2FzZXMuCisgICogYDx0ZXN0Y2FzZT5gIGVsZW1lbnRzIGNvcnJlc3BvbmQgdG8gR29vZ2xlIFRlc3QgdGVzdCBmdW5jdGlvbnMuCisKK0ZvciBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBwcm9ncmFtCisKK2BgYAorVEVTVChNYXRoVGVzdCwgQWRkaXRpb24pIHsgLi4uIH0KK1RFU1QoTWF0aFRlc3QsIFN1YnRyYWN0aW9uKSB7IC4uLiB9CitURVNUKExvZ2ljVGVzdCwgTm9uQ29udHJhZGljdGlvbikgeyAuLi4gfQorYGBgCisKK2NvdWxkIGdlbmVyYXRlIHRoaXMgcmVwb3J0OgorCitgYGAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8dGVzdHN1aXRlcyB0ZXN0cz0iMyIgZmFpbHVyZXM9IjEiIGVycm9ycz0iMCIgdGltZT0iMzUiIG5hbWU9IkFsbFRlc3RzIj4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJNYXRoVGVzdCIgdGVzdHM9IjIiIGZhaWx1cmVzPSIxIiBlcnJvcnM9IjAiIHRpbWU9IjE1Ij4KKyAgICA8dGVzdGNhc2UgbmFtZT0iQWRkaXRpb24iIHN0YXR1cz0icnVuIiB0aW1lPSI3IiBjbGFzc25hbWU9IiI+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSJWYWx1ZSBvZjogYWRkKDEsIDEpJiN4MEE7IEFjdHVhbDogMyYjeDBBO0V4cGVjdGVkOiAyIiB0eXBlPSIiLz4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9IlZhbHVlIG9mOiBhZGQoMSwgLTEpJiN4MEE7IEFjdHVhbDogMSYjeDBBO0V4cGVjdGVkOiAwIiB0eXBlPSIiLz4KKyAgICA8L3Rlc3RjYXNlPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJTdWJ0cmFjdGlvbiIgc3RhdHVzPSJydW4iIHRpbWU9IjUiIGNsYXNzbmFtZT0iIj4KKyAgICA8L3Rlc3RjYXNlPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJMb2dpY1Rlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZXJyb3JzPSIwIiB0aW1lPSI1Ij4KKyAgICA8dGVzdGNhc2UgbmFtZT0iTm9uQ29udHJhZGljdGlvbiIgc3RhdHVzPSJydW4iIHRpbWU9IjUiIGNsYXNzbmFtZT0iIj4KKyAgICA8L3Rlc3RjYXNlPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4KK2BgYAorCitUaGluZ3MgdG8gbm90ZToKKworICAqIFRoZSBgdGVzdHNgIGF0dHJpYnV0ZSBvZiBhIGA8dGVzdHN1aXRlcz5gIG9yIGA8dGVzdHN1aXRlPmAgZWxlbWVudCB0ZWxscyBob3cgbWFueSB0ZXN0IGZ1bmN0aW9ucyB0aGUgR29vZ2xlIFRlc3QgcHJvZ3JhbSBvciB0ZXN0IGNhc2UgY29udGFpbnMsIHdoaWxlIHRoZSBgZmFpbHVyZXNgIGF0dHJpYnV0ZSB0ZWxscyBob3cgbWFueSBvZiB0aGVtIGZhaWxlZC4KKyAgKiBUaGUgYHRpbWVgIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LCB0ZXN0IGNhc2UsIG9yIGVudGlyZSB0ZXN0IHByb2dyYW0gaW4gbWlsbGlzZWNvbmRzLgorICAqIEVhY2ggYDxmYWlsdXJlPmAgZWxlbWVudCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBmYWlsZWQgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uLgorICAqIFNvbWUgSlVuaXQgY29uY2VwdHMgZG9uJ3QgYXBwbHkgdG8gR29vZ2xlIFRlc3QsIHlldCB3ZSBoYXZlIHRvIGNvbmZvcm0gdG8gdGhlIERURC4gVGhlcmVmb3JlIHlvdSdsbCBzZWUgc29tZSBkdW1teSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgcmVwb3J0LiBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlc2UgcGFydHMuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBDb250cm9sbGluZyBIb3cgRmFpbHVyZXMgQXJlIFJlcG9ydGVkICMjCisKKyMjIyBUdXJuaW5nIEFzc2VydGlvbiBGYWlsdXJlcyBpbnRvIEJyZWFrLVBvaW50cyAjIyMKKworV2hlbiBydW5uaW5nIHRlc3QgcHJvZ3JhbXMgdW5kZXIgYSBkZWJ1Z2dlciwgaXQncyB2ZXJ5IGNvbnZlbmllbnQgaWYgdGhlCitkZWJ1Z2dlciBjYW4gY2F0Y2ggYW4gYXNzZXJ0aW9uIGZhaWx1cmUgYW5kIGF1dG9tYXRpY2FsbHkgZHJvcCBpbnRvIGludGVyYWN0aXZlCittb2RlLiBHb29nbGUgVGVzdCdzIF9icmVhay1vbi1mYWlsdXJlXyBtb2RlIHN1cHBvcnRzIHRoaXMgYmVoYXZpb3IuCisKK1RvIGVuYWJsZSBpdCwgc2V0IHRoZSBgR1RFU1RfQlJFQUtfT05fRkFJTFVSRWAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSB2YWx1ZQorb3RoZXIgdGhhbiBgMGAgLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgYC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZWAKK2NvbW1hbmQgbGluZSBmbGFnLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMjIERpc2FibGluZyBDYXRjaGluZyBUZXN0LVRocm93biBFeGNlcHRpb25zICMjIworCitHb29nbGUgVGVzdCBjYW4gYmUgdXNlZCBlaXRoZXIgd2l0aCBvciB3aXRob3V0IGV4Y2VwdGlvbnMgZW5hYmxlZC4gIElmCithIHRlc3QgdGhyb3dzIGEgQysrIGV4Y2VwdGlvbiBvciAob24gV2luZG93cykgYSBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbgorKFNFSCksIGJ5IGRlZmF1bHQgR29vZ2xlIFRlc3QgY2F0Y2hlcyBpdCwgcmVwb3J0cyBpdCBhcyBhIHRlc3QKK2ZhaWx1cmUsIGFuZCBjb250aW51ZXMgd2l0aCB0aGUgbmV4dCB0ZXN0IG1ldGhvZC4gIFRoaXMgbWF4aW1pemVzIHRoZQorY292ZXJhZ2Ugb2YgYSB0ZXN0IHJ1bi4gIEFsc28sIG9uIFdpbmRvd3MgYW4gdW5jYXVnaHQgZXhjZXB0aW9uIHdpbGwKK2NhdXNlIGEgcG9wLXVwIHdpbmRvdywgc28gY2F0Y2hpbmcgdGhlIGV4Y2VwdGlvbnMgYWxsb3dzIHlvdSB0byBydW4KK3RoZSB0ZXN0cyBhdXRvbWF0aWNhbGx5LgorCitXaGVuIGRlYnVnZ2luZyB0aGUgdGVzdCBmYWlsdXJlcywgaG93ZXZlciwgeW91IG1heSBpbnN0ZWFkIHdhbnQgdGhlCitleGNlcHRpb25zIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGRlYnVnZ2VyLCBzdWNoIHRoYXQgeW91IGNhbiBleGFtaW5lCit0aGUgY2FsbCBzdGFjayB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBUbyBhY2hpZXZlIHRoYXQsIHNldCB0aGUKK2BHVEVTVF9DQVRDSF9FWENFUFRJT05TYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBgMGAsIG9yIHVzZSB0aGUKK2AtLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnM9MGAgZmxhZyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLgorCisqKkF2YWlsYWJpbGl0eSoqOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgTGV0dGluZyBBbm90aGVyIFRlc3RpbmcgRnJhbWV3b3JrIERyaXZlICMjIworCitJZiB5b3Ugd29yayBvbiBhIHByb2plY3QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVzaW5nIGFub3RoZXIgdGVzdGluZworZnJhbWV3b3JrIGFuZCBpcyBub3QgcmVhZHkgdG8gY29tcGxldGVseSBzd2l0Y2ggdG8gR29vZ2xlIFRlc3QgeWV0LAoreW91IGNhbiBnZXQgbXVjaCBvZiBHb29nbGUgVGVzdCdzIGJlbmVmaXQgYnkgdXNpbmcgaXRzIGFzc2VydGlvbnMgaW4KK3lvdXIgZXhpc3RpbmcgdGVzdHMuICBKdXN0IGNoYW5nZSB5b3VyIGBtYWluKClgIGZ1bmN0aW9uIHRvIGxvb2sKK2xpa2U6CisKK2BgYAorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSB0cnVlOworICAvLyBJbXBvcnRhbnQ6IEdvb2dsZSBUZXN0IG11c3QgYmUgaW5pdGlhbGl6ZWQuCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIC4uLiB3aGF0ZXZlciB5b3VyIGV4aXN0aW5nIHRlc3RpbmcgZnJhbWV3b3JrIHJlcXVpcmVzIC4uLgorfQorYGBgCisKK1dpdGggdGhhdCwgeW91IGNhbiB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBpbiBhZGRpdGlvbiB0byB0aGUKK25hdGl2ZSBhc3NlcnRpb25zIHlvdXIgdGVzdGluZyBmcmFtZXdvcmsgcHJvdmlkZXMsIGZvciBleGFtcGxlOgorCitgYGAKK3ZvaWQgVGVzdEZvb0RvZXNCYXIoKSB7CisgIEZvbyBmb287CisgIEVYUEVDVF9MRShmb28uQmFyKDEpLCAxMDApOyAgICAgLy8gQSBHb29nbGUgVGVzdCBhc3NlcnRpb24uCisgIENQUFVOSVRfQVNTRVJUKGZvby5Jc0VtcHR5KCkpOyAgLy8gQSBuYXRpdmUgYXNzZXJ0aW9uLgorfQorYGBgCisKK0lmIGEgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIGZhaWxzLCBpdCB3aWxsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kCit0aHJvdyBhbiBleGNlcHRpb24sIHdoaWNoIHdpbGwgYmUgdHJlYXRlZCBhcyBhIGZhaWx1cmUgYnkgeW91ciBob3N0Cit0ZXN0aW5nIGZyYW1ld29yay4gIElmIHlvdSBjb21waWxlIHlvdXIgY29kZSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQsCithIGZhaWxlZCBHb29nbGUgVGVzdCBhc3NlcnRpb24gd2lsbCBpbnN0ZWFkIGV4aXQgeW91ciBwcm9ncmFtIHdpdGggYQorbm9uLXplcm8gY29kZSwgd2hpY2ggd2lsbCBhbHNvIHNpZ25hbCBhIHRlc3QgZmFpbHVyZSB0byB5b3VyIHRlc3QKK3J1bm5lci4KKworSWYgeW91IGRvbid0IHdyaXRlIGA6OnRlc3Rpbmc6OkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSB0cnVlO2AgaW4KK3lvdXIgYG1haW4oKWAsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBlbmFibGUgdGhpcyBmZWF0dXJlIGJ5IHNwZWNpZnlpbmcKK3RoZSBgLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlYCBmbGFnIG9uIHRoZSBjb21tYW5kLWxpbmUgb3Igc2V0dGluZyB0aGUKK2BHVEVTVF9USFJPV19PTl9GQUlMVVJFYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIG5vbi16ZXJvIHZhbHVlLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdjEuMy4wLgorCisjIyBEaXN0cmlidXRpbmcgVGVzdCBGdW5jdGlvbnMgdG8gTXVsdGlwbGUgTWFjaGluZXMgIyMKKworSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBtYWNoaW5lIHlvdSBjYW4gdXNlIHRvIHJ1biBhIHRlc3QgcHJvZ3JhbSwKK3lvdSBtaWdodCB3YW50IHRvIHJ1biB0aGUgdGVzdCBmdW5jdGlvbnMgaW4gcGFyYWxsZWwgYW5kIGdldCB0aGUKK3Jlc3VsdCBmYXN0ZXIuICBXZSBjYWxsIHRoaXMgdGVjaG5pcXVlIF9zaGFyZGluZ18sIHdoZXJlIGVhY2ggbWFjaGluZQoraXMgY2FsbGVkIGEgX3NoYXJkXy4KKworR29vZ2xlIFRlc3QgaXMgY29tcGF0aWJsZSB3aXRoIHRlc3Qgc2hhcmRpbmcuICBUbyB0YWtlIGFkdmFudGFnZSBvZgordGhpcyBmZWF0dXJlLCB5b3VyIHRlc3QgcnVubmVyIChub3QgcGFydCBvZiBHb29nbGUgVGVzdCkgbmVlZHMgdG8gZG8KK3RoZSBmb2xsb3dpbmc6CisKKyAgMS4gQWxsb2NhdGUgYSBudW1iZXIgb2YgbWFjaGluZXMgKHNoYXJkcykgdG8gcnVuIHRoZSB0ZXN0cy4KKyAgMS4gT24gZWFjaCBzaGFyZCwgc2V0IHRoZSBgR1RFU1RfVE9UQUxfU0hBUkRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcy4gIEl0IG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBzaGFyZHMuCisgIDEuIE9uIGVhY2ggc2hhcmQsIHNldCB0aGUgYEdURVNUX1NIQVJEX0lOREVYYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgaW5kZXggb2YgdGhlIHNoYXJkLiAgRGlmZmVyZW50IHNoYXJkcyBtdXN0IGJlIGFzc2lnbmVkIGRpZmZlcmVudCBpbmRpY2VzLCB3aGljaCBtdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsIEdURVNUX1RPVEFMX1NIQVJEUyAtIDFdYC4KKyAgMS4gUnVuIHRoZSBzYW1lIHRlc3QgcHJvZ3JhbSBvbiBhbGwgc2hhcmRzLiAgV2hlbiBHb29nbGUgVGVzdCBzZWVzIHRoZSBhYm92ZSB0d28gZW52aXJvbm1lbnQgdmFyaWFibGVzLCBpdCB3aWxsIHNlbGVjdCBhIHN1YnNldCBvZiB0aGUgdGVzdCBmdW5jdGlvbnMgdG8gcnVuLiAgQWNyb3NzIGFsbCBzaGFyZHMsIGVhY2ggdGVzdCBmdW5jdGlvbiBpbiB0aGUgcHJvZ3JhbSB3aWxsIGJlIHJ1biBleGFjdGx5IG9uY2UuCisgIDEuIFdhaXQgZm9yIGFsbCBzaGFyZHMgdG8gZmluaXNoLCB0aGVuIGNvbGxlY3QgYW5kIHJlcG9ydCB0aGUgcmVzdWx0cy4KKworWW91ciBwcm9qZWN0IG1heSBoYXZlIHRlc3RzIHRoYXQgd2VyZSB3cml0dGVuIHdpdGhvdXQgR29vZ2xlIFRlc3QgYW5kCit0aHVzIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBwcm90b2NvbC4gIEluIG9yZGVyIGZvciB5b3VyIHRlc3QgcnVubmVyIHRvCitmaWd1cmUgb3V0IHdoaWNoIHRlc3Qgc3VwcG9ydHMgc2hhcmRpbmcsIGl0IGNhbiBzZXQgdGhlIGVudmlyb25tZW50Cit2YXJpYWJsZSBgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEVgIHRvIGEgbm9uLWV4aXN0ZW50IGZpbGUgcGF0aC4gIElmIGEKK3Rlc3QgcHJvZ3JhbSBzdXBwb3J0cyBzaGFyZGluZywgaXQgd2lsbCBjcmVhdGUgdGhpcyBmaWxlIHRvCithY2tub3dsZWRnZSB0aGUgZmFjdCAodGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgbm90CitpbXBvcnRhbnQgYXQgdGhpcyB0aW1lOyBhbHRob3VnaCB3ZSBtYXkgc3RpY2sgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24KK2luIGl0IGluIHRoZSBmdXR1cmUuKTsgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGNyZWF0ZSBpdC4KKworSGVyZSdzIGFuIGV4YW1wbGUgdG8gbWFrZSBpdCBjbGVhci4gIFN1cHBvc2UgeW91IGhhdmUgYSB0ZXN0IHByb2dyYW0KK2Bmb29fdGVzdGAgdGhhdCBjb250YWlucyB0aGUgZm9sbG93aW5nIDUgdGVzdCBmdW5jdGlvbnM6CitgYGAKK1RFU1QoQSwgVikKK1RFU1QoQSwgVykKK1RFU1QoQiwgWCkKK1RFU1QoQiwgWSkKK1RFU1QoQiwgWikKK2BgYAorYW5kIHlvdSBoYXZlIDMgbWFjaGluZXMgYXQgeW91ciBkaXNwb3NhbC4gIFRvIHJ1biB0aGUgdGVzdCBmdW5jdGlvbnMgaW4KK3BhcmFsbGVsLCB5b3Ugd291bGQgc2V0IGBHVEVTVF9UT1RBTF9TSEFSRFNgIHRvIDMgb24gYWxsIG1hY2hpbmVzLCBhbmQKK3NldCBgR1RFU1RfU0hBUkRfSU5ERVhgIHRvIDAsIDEsIGFuZCAyIG9uIHRoZSBtYWNoaW5lcyByZXNwZWN0aXZlbHkuCitUaGVuIHlvdSB3b3VsZCBydW4gdGhlIHNhbWUgYGZvb190ZXN0YCBvbiBlYWNoIG1hY2hpbmUuCisKK0dvb2dsZSBUZXN0IHJlc2VydmVzIHRoZSByaWdodCB0byBjaGFuZ2UgaG93IHRoZSB3b3JrIGlzIGRpc3RyaWJ1dGVkCithY3Jvc3MgdGhlIHNoYXJkcywgYnV0IGhlcmUncyBvbmUgcG9zc2libGUgc2NlbmFyaW86CisKKyAgKiBNYWNoaW5lICMwIHJ1bnMgYEEuVmAgYW5kIGBCLlhgLgorICAqIE1hY2hpbmUgIzEgcnVucyBgQS5XYCBhbmQgYEIuWWAuCisgICogTWFjaGluZSAjMiBydW5zIGBCLlpgLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjMuMC4KKworIyBGdXNpbmcgR29vZ2xlIFRlc3QgU291cmNlIEZpbGVzICMKKworR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiB+MzAgZmlsZXMgKGV4Y2x1ZGluZyBpdHMgb3duCit0ZXN0cykuICBTb21ldGltZXMgeW91IG1heSB3YW50IHRoZW0gdG8gYmUgcGFja2FnZWQgdXAgaW4gdHdvIGZpbGVzIChhCitgLmhgIGFuZCBhIGAuY2NgKSBpbnN0ZWFkLCBzdWNoIHRoYXQgeW91IGNhbiBlYXNpbHkgY29weSB0aGVtIHRvIGEgbmV3CittYWNoaW5lIGFuZCBzdGFydCBoYWNraW5nIHRoZXJlLiAgRm9yIHRoaXMgd2UgcHJvdmlkZSBhbiBleHBlcmltZW50YWwKK1B5dGhvbiBzY3JpcHQgYGZ1c2VfZ3Rlc3RfZmlsZXMucHlgIGluIHRoZSBgc2NyaXB0cy9gIGRpcmVjdG9yeSAoc2luY2UgcmVsZWFzZSAxLjMuMCkuCitBc3N1bWluZyB5b3UgaGF2ZSBQeXRob24gMi40IG9yIGFib3ZlIGluc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUsIGp1c3QKK2dvIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW4KK2BgYAorcHl0aG9uIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgT1VUUFVUX0RJUgorYGBgCisKK2FuZCB5b3Ugc2hvdWxkIHNlZSBhbiBgT1VUUFVUX0RJUmAgZGlyZWN0b3J5IGJlaW5nIGNyZWF0ZWQgd2l0aCBmaWxlcworYGd0ZXN0L2d0ZXN0LmhgIGFuZCBgZ3Rlc3QvZ3Rlc3QtYWxsLmNjYCBpbiBpdC4gIFRoZXNlIGZpbGVzIGNvbnRhaW4KK2V2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gdXNlIEdvb2dsZSBUZXN0LiAgSnVzdCBjb3B5IHRoZW0gdG8gYW55d2hlcmUKK3lvdSB3YW50IGFuZCB5b3UgYXJlIHJlYWR5IHRvIHdyaXRlIHRlc3RzLiAgWW91IGNhbiB1c2UgdGhlCitbc2NyaXB0cy90ZXN0L01ha2VmaWxlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvdGVzdC9NYWtlZmlsZSkKK2ZpbGUgYXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY29tcGlsZSB5b3VyIHRlc3RzIGFnYWluc3QgdGhlbS4KKworIyBXaGVyZSB0byBHbyBmcm9tIEhlcmUgIworCitDb25ncmF0dWxhdGlvbnMhIFlvdSd2ZSBub3cgbGVhcm5lZCBtb3JlIGFkdmFuY2VkIEdvb2dsZSBUZXN0IHRvb2xzIGFuZCBhcmUKK3JlYWR5IHRvIHRhY2tsZSBtb3JlIGNvbXBsZXggdGVzdGluZyB0YXNrcy4gSWYgeW91IHdhbnQgdG8gZGl2ZSBldmVuIGRlZXBlciwgeW91CitjYW4gcmVhZCB0aGUgW0ZyZXF1ZW50bHktQXNrZWQgUXVlc3Rpb25zXShWMV82X0ZBUS5tZCkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNl9Eb2N1bWVudGF0aW9uLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNl9Eb2N1bWVudGF0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTI0NjYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV82X0RvY3VtZW50YXRpb24ubWQKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBwYWdlIGxpc3RzIGFsbCBkb2N1bWVudGF0aW9uIHdpa2kgcGFnZXMgZm9yIEdvb2dsZSBUZXN0ICoqMS42KioKKy0tICoqaWYgeW91IHVzZSBhIHJlbGVhc2VkIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QsIHBsZWFzZSByZWFkIHRoZQorZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyB2ZXJzaW9uIGluc3RlYWQuKioKKworICAqIFtQcmltZXJdKFYxXzZfUHJpbWVyLm1kKSAtLSBzdGFydCBoZXJlIGlmIHlvdSBhcmUgbmV3IHRvIEdvb2dsZSBUZXN0LgorICAqIFtTYW1wbGVzXShWMV82X1NhbXBsZXMubWQpIC0tIGxlYXJuIGZyb20gZXhhbXBsZXMuCisgICogW0FkdmFuY2VkR3VpZGVdKFYxXzZfQWR2YW5jZWRHdWlkZS5tZCkgLS0gbGVhcm4gbW9yZSBhYm91dCBHb29nbGUgVGVzdC4KKyAgKiBbWGNvZGVHdWlkZV0oVjFfNl9YY29kZUd1aWRlLm1kKSAtLSBob3cgdG8gdXNlIEdvb2dsZSBUZXN0IGluIFhjb2RlIG9uIE1hYy4KKyAgKiBbRnJlcXVlbnRseS1Bc2tlZCBRdWVzdGlvbnNdKFYxXzZfRkFRLm1kKSAtLSBjaGVjayBoZXJlIGJlZm9yZSBhc2tpbmcgYSBxdWVzdGlvbiBvbiB0aGUgbWFpbGluZyBsaXN0LgorCitUbyBjb250cmlidXRlIGNvZGUgdG8gR29vZ2xlIFRlc3QsIHJlYWQ6CisKKyAgKiBbRGV2R3VpZGVdKERldkd1aWRlLm1kKSAtLSByZWFkIHRoaXMgX2JlZm9yZV8gd3JpdGluZyB5b3VyIGZpcnN0IHBhdGNoLgorICAqIFtQdW1wTWFudWFsXShWMV82X1B1bXBNYW51YWwubWQpIC0tIGhvdyB3ZSBnZW5lcmF0ZSBzb21lIG9mIEdvb2dsZSBUZXN0J3Mgc291cmNlIGZpbGVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfRkFRLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNl9GQVEubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2NzdhNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfRkFRLm1kCkBAIC0wLDAgKzEsMTAzNyBAQAorCisKK0lmIHlvdSBjYW5ub3QgZmluZCB0aGUgYW5zd2VyIHRvIHlvdXIgcXVlc3Rpb24gaGVyZSwgYW5kIHlvdSBoYXZlIHJlYWQKK1tQcmltZXJdKFYxXzZfUHJpbWVyLm1kKSBhbmQgW0FkdmFuY2VkR3VpZGVdKFYxXzZfQWR2YW5jZWRHdWlkZS5tZCksIHNlbmQgaXQgdG8KK2dvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbS4KKworIyMgV2h5IHNob3VsZCBJIHVzZSBHb29nbGUgVGVzdCBpbnN0ZWFkIG9mIG15IGZhdm9yaXRlIEMrKyB0ZXN0aW5nIGZyYW1ld29yaz8gIyMKKworRmlyc3QsIGxldCB1cyBzYXkgY2xlYXJseSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gZ2V0IGludG8gdGhlIGRlYmF0ZSBvZgord2hpY2ggQysrIHRlc3RpbmcgZnJhbWV3b3JrIGlzICoqdGhlIGJlc3QqKi4gIFRoZXJlIGV4aXN0IG1hbnkgZmluZQorZnJhbWV3b3JrcyBmb3Igd3JpdGluZyBDKysgdGVzdHMsIGFuZCB3ZSBoYXZlIHRyZW1lbmRvdXMgcmVzcGVjdCBmb3IKK3RoZSBkZXZlbG9wZXJzIGFuZCB1c2VycyBvZiB0aGVtLiAgV2UgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgKG9yIHdpbGwKK2JlKSBhIHNpbmdsZSBiZXN0IGZyYW1ld29yayAtIHlvdSBoYXZlIHRvIHBpY2sgdGhlIHJpZ2h0IHRvb2wgZm9yIHRoZQorcGFydGljdWxhciB0YXNrIHlvdSBhcmUgdGFja2xpbmcuCisKK1dlIGNyZWF0ZWQgR29vZ2xlIFRlc3QgYmVjYXVzZSB3ZSBjb3VsZG4ndCBmaW5kIHRoZSByaWdodCBjb21iaW5hdGlvbgorb2YgZmVhdHVyZXMgYW5kIGNvbnZlbmllbmNlcyBpbiBhbiBleGlzdGluZyBmcmFtZXdvcmsgdG8gc2F0aXNmeSBfb3VyXworbmVlZHMuICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGluZ3MgdGhhdCBfd2VfIGxpa2UgYWJvdXQgR29vZ2xlCitUZXN0LiAgV2UgZG9uJ3QgY2xhaW0gdGhlbSB0byBiZSB1bmlxdWUgdG8gR29vZ2xlIFRlc3QgLSByYXRoZXIsIHRoZQorY29tYmluYXRpb24gb2YgdGhlbSBtYWtlcyBHb29nbGUgVGVzdCB0aGUgY2hvaWNlIGZvciB1cy4gIFdlIGhvcGUgdGhpcworbGlzdCBjYW4gaGVscCB5b3UgZGVjaWRlIHdoZXRoZXIgaXQgaXMgZm9yIHlvdSB0b28uCisKKyAgKiBHb29nbGUgVGVzdCBpcyBkZXNpZ25lZCB0byBiZSBwb3J0YWJsZTogaXQgZG9lc24ndCByZXF1aXJlIGV4Y2VwdGlvbnMgb3IgUlRUSTsgaXQgd29ya3MgYXJvdW5kIHZhcmlvdXMgYnVncyBpbiB2YXJpb3VzIGNvbXBpbGVycyBhbmQgZW52aXJvbm1lbnRzOyBldGMuICBBcyBhIHJlc3VsdCwgaXQgd29ya3Mgb24gTGludXgsIE1hYyBPUyBYLCBXaW5kb3dzIGFuZCBzZXZlcmFsIGVtYmVkZGVkIG9wZXJhdGluZyBzeXN0ZW1zLgorICAqIE5vbmZhdGFsIGFzc2VydGlvbnMgKGBFWFBFQ1RfKmApIGhhdmUgcHJvdmVuIHRvIGJlIGdyZWF0IHRpbWUgc2F2ZXJzLCBhcyB0aGV5IGFsbG93IGEgdGVzdCB0byByZXBvcnQgbXVsdGlwbGUgZmFpbHVyZXMgaW4gYSBzaW5nbGUgZWRpdC1jb21waWxlLXRlc3QgY3ljbGUuCisgICogSXQncyBlYXN5IHRvIHdyaXRlIGFzc2VydGlvbnMgdGhhdCBnZW5lcmF0ZSBpbmZvcm1hdGl2ZSBtZXNzYWdlczogeW91IGp1c3QgdXNlIHRoZSBzdHJlYW0gc3ludGF4IHRvIGFwcGVuZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgZS5nLiBgQVNTRVJUX0VRKDUsIEZvbyhpKSkgPDwgIiB3aGVyZSBpID0gIiA8PCBpO2AuICBJdCBkb2Vzbid0IHJlcXVpcmUgYSBuZXcgc2V0IG9mIG1hY3JvcyBvciBzcGVjaWFsIGZ1bmN0aW9ucy4KKyAgKiBHb29nbGUgVGVzdCBhdXRvbWF0aWNhbGx5IGRldGVjdHMgeW91ciB0ZXN0cyBhbmQgZG9lc24ndCByZXF1aXJlIHlvdSB0byBlbnVtZXJhdGUgdGhlbSBpbiBvcmRlciB0byBydW4gdGhlbS4KKyAgKiBEZWF0aCB0ZXN0cyBhcmUgcHJldHR5IGhhbmR5IGZvciBlbnN1cmluZyB0aGF0IHlvdXIgYXNzZXJ0cyBpbiBwcm9kdWN0aW9uIGNvZGUgYXJlIHRyaWdnZXJlZCBieSB0aGUgcmlnaHQgY29uZGl0aW9ucy4KKyAgKiBgU0NPUEVEX1RSQUNFYCBoZWxwcyB5b3UgdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiBhbiBhc3NlcnRpb24gZmFpbHVyZSB3aGVuIGl0IGNvbWVzIGZyb20gaW5zaWRlIGEgc3ViLXJvdXRpbmUgb3IgbG9vcC4KKyAgKiBZb3UgY2FuIGRlY2lkZSB3aGljaCB0ZXN0cyB0byBydW4gdXNpbmcgbmFtZSBwYXR0ZXJucy4gIFRoaXMgc2F2ZXMgdGltZSB3aGVuIHlvdSB3YW50IHRvIHF1aWNrbHkgcmVwcm9kdWNlIGEgdGVzdCBmYWlsdXJlLgorICAqIEdvb2dsZSBUZXN0IGNhbiBnZW5lcmF0ZSBYTUwgdGVzdCByZXN1bHQgcmVwb3J0cyB0aGF0IGNhbiBiZSBwYXJzZWQgYnkgcG9wdWxhciBjb250aW51b3VzIGJ1aWxkIHN5c3RlbSBsaWtlIEh1ZHNvbi4KKyAgKiBTaW1wbGUgdGhpbmdzIGFyZSBlYXN5IGluIEdvb2dsZSBUZXN0LCB3aGlsZSBoYXJkIHRoaW5ncyBhcmUgcG9zc2libGU6IGluIGFkZGl0aW9uIHRvIGFkdmFuY2VkIGZlYXR1cmVzIGxpa2UgW2dsb2JhbCB0ZXN0IGVudmlyb25tZW50c10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV82X0FkdmFuY2VkR3VpZGUjR2xvYmFsX1NldC1VcF9hbmRfVGVhci1Eb3duKSBhbmQgdGVzdHMgcGFyYW1ldGVyaXplZCBieSBbdmFsdWVzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzZfQWR2YW5jZWRHdWlkZSNWYWx1ZV9QYXJhbWV0ZXJpemVkX1Rlc3RzKSBvciBbdHlwZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvVjFfNl9BZHZhbmNlZEd1aWRlI1R5cGVkX1Rlc3RzKSwgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgdmFyaW91cyB3YXlzIGZvciB0aGUgdXNlciB0byBleHRlbmQgdGhlIGZyYW1ld29yayAtLSBpZiBHb29nbGUgVGVzdCBkb2Vzbid0IGRvIHNvbWV0aGluZyBvdXQgb2YgdGhlIGJveCwgY2hhbmNlcyBhcmUgdGhhdCBhIHVzZXIgY2FuIGltcGxlbWVudCB0aGUgZmVhdHVyZSB1c2luZyBHb29nbGUgVGVzdCdzIHB1YmxpYyBBUEksIHdpdGhvdXQgY2hhbmdpbmcgR29vZ2xlIFRlc3QgaXRzZWxmLiAgSW4gcGFydGljdWxhciwgeW91IGNhbjoKKyAgICAqIGV4cGFuZCB5b3VyIHRlc3Rpbmcgdm9jYWJ1bGFyeSBieSBkZWZpbmluZyBbY3VzdG9tIHByZWRpY2F0ZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvVjFfNl9BZHZhbmNlZEd1aWRlI1ByZWRpY2F0ZV9Bc3NlcnRpb25zX2Zvcl9CZXR0ZXJfRXJyb3JfTWVzc2FnZXMpLAorICAgICogdGVhY2ggR29vZ2xlIFRlc3QgaG93IHRvIFtwcmludCB5b3VyIHR5cGVzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzZfQWR2YW5jZWRHdWlkZSNUZWFjaGluZ19Hb29nbGVfVGVzdF9Ib3dfdG9fUHJpbnRfWW91cl9WYWx1ZXMpLAorICAgICogZGVmaW5lIHlvdXIgb3duIHRlc3RpbmcgbWFjcm9zIG9yIHV0aWxpdGllcyBhbmQgdmVyaWZ5IHRoZW0gdXNpbmcgR29vZ2xlIFRlc3QncyBbU2VydmljZSBQcm92aWRlciBJbnRlcmZhY2VdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvVjFfNl9BZHZhbmNlZEd1aWRlI0NhdGNoaW5nX0ZhaWx1cmVzKSwgYW5kCisgICAgKiByZWZsZWN0IG9uIHRoZSB0ZXN0IGNhc2VzIG9yIGNoYW5nZSB0aGUgdGVzdCBvdXRwdXQgZm9ybWF0IGJ5IGludGVyY2VwdGluZyB0aGUgW3Rlc3QgZXZlbnRzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzZfQWR2YW5jZWRHdWlkZSNFeHRlbmRpbmdfR29vZ2xlX1Rlc3RfYnlfSGFuZGxpbmdfVGVzdF9FdmVudHMpLgorCisjIyBJJ20gZ2V0dGluZyB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdC4gIFdvdWxkIHlvdSBmaXggdGhlbT8gIyMKKworV2Ugc3RyaXZlIHRvIG1pbmltaXplIGNvbXBpbGVyIHdhcm5pbmdzIEdvb2dsZSBUZXN0IGdlbmVyYXRlcy4gIEJlZm9yZSByZWxlYXNpbmcgYSBuZXcgdmVyc2lvbiwgd2UgdGVzdCB0byBtYWtlIHN1cmUgdGhhdCBpdCBkb2Vzbid0IGdlbmVyYXRlIHdhcm5pbmdzIHdoZW4gY29tcGlsZWQgdXNpbmcgaXRzIENNYWtlIHNjcmlwdCBvbiBXaW5kb3dzLCBMaW51eCwgYW5kIE1hYyBPUy4KKworVW5mb3J0dW5hdGVseSwgdGhpcyBkb2Vzbid0IG1lYW4geW91IGFyZSBndWFyYW50ZWVkIHRvIHNlZSBubyB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBpbiB5b3VyIGVudmlyb25tZW50OgorCisgICogWW91IG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBjb21waWxlciBhcyB3ZSB1c2UsIG9yIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhlIHNhbWUgY29tcGlsZXIuICBXZSBjYW5ub3QgcG9zc2libHkgdGVzdCBmb3IgYWxsIGNvbXBpbGVycy4KKyAgKiBZb3UgbWF5IGJlIGNvbXBpbGluZyBvbiBhIGRpZmZlcmVudCBwbGF0Zm9ybSBhcyB3ZSBkby4KKyAgKiBZb3VyIHByb2plY3QgbWF5IGJlIHVzaW5nIGRpZmZlcmVudCBjb21waWxlciBmbGFncyBhcyB3ZSBkby4KKworSXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byBtYWtlIEdvb2dsZSBUZXN0IHdhcm5pbmctZnJlZSBmb3IgZXZlcnlvbmUuICBPciwgaXQgbWF5IG5vdCBiZSBkZXNpcmFibGUgaWYgdGhlIHdhcm5pbmcgaXMgcmFyZWx5IGVuYWJsZWQgYW5kIGZpeGluZyB0aGUgdmlvbGF0aW9ucyBtYWtlcyB0aGUgY29kZSBtb3JlIGNvbXBsZXguCisKK0lmIHlvdSBzZWUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgR29vZ2xlIFRlc3QsIHdlIHN1Z2dlc3QgdGhhdCB5b3UgdXNlIHRoZSBgLWlzeXN0ZW1gIGZsYWcgKGFzc3VtaW5nIHlvdXIgYXJlIHVzaW5nIEdDQykgdG8gbWFyayBHb29nbGUgVGVzdCBoZWFkZXJzIGFzIHN5c3RlbSBoZWFkZXJzLiAgVGhhdCdsbCBzdXBwcmVzcyB3YXJuaW5ncyBmcm9tIEdvb2dsZSBUZXN0IGhlYWRlcnMuCisKKyMjIFdoeSBzaG91bGQgbm90IHRlc3QgY2FzZSBuYW1lcyBhbmQgdGVzdCBuYW1lcyBjb250YWluIHVuZGVyc2NvcmU/ICMjCisKK1VuZGVyc2NvcmUgKGBfYCkgaXMgc3BlY2lhbCwgYXMgQysrIHJlc2VydmVzIHRoZSBmb2xsb3dpbmcgdG8gYmUgdXNlZCBieQordGhlIGNvbXBpbGVyIGFuZCB0aGUgc3RhbmRhcmQgbGlicmFyeToKKworICAxLiBhbnkgaWRlbnRpZmllciB0aGF0IHN0YXJ0cyB3aXRoIGFuIGBfYCBmb2xsb3dlZCBieSBhbiB1cHBlci1jYXNlIGxldHRlciwgYW5kCisgIDEuIGFueSBpZGVudGlmaWVyIHRoYXQgY29udGFpbmVycyB0d28gY29uc2VjdXRpdmUgdW5kZXJzY29yZXMgKGkuZS4gYF9fYCkgX2FueXdoZXJlXyBpbiBpdHMgbmFtZS4KKworVXNlciBjb2RlIGlzIF9wcm9oaWJpdGVkXyBmcm9tIHVzaW5nIHN1Y2ggaWRlbnRpZmllcnMuCisKK05vdyBsZXQncyBsb29rIGF0IHdoYXQgdGhpcyBtZWFucyBmb3IgYFRFU1RgIGFuZCBgVEVTVF9GYC4KKworQ3VycmVudGx5IGBURVNUKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpYCBnZW5lcmF0ZXMgYSBjbGFzcyBuYW1lZAorYFRlc3RDYXNlTmFtZV9UZXN0TmFtZV9UZXN0YC4gIFdoYXQgaGFwcGVucyBpZiBgVGVzdENhc2VOYW1lYCBvciBgVGVzdE5hbWVgCitjb250YWlucyBgX2A/CisKKyAgMS4gSWYgYFRlc3RDYXNlTmFtZWAgc3RhcnRzIHdpdGggYW4gYF9gIGZvbGxvd2VkIGJ5IGFuIHVwcGVyLWNhc2UgbGV0dGVyIChzYXksIGBfRm9vYCksIHdlIGVuZCB1cCB3aXRoIGBfRm9vX1Rlc3ROYW1lX1Rlc3RgLCB3aGljaCBpcyByZXNlcnZlZCBhbmQgdGh1cyBpbnZhbGlkLgorICAxLiBJZiBgVGVzdENhc2VOYW1lYCBlbmRzIHdpdGggYW4gYF9gIChzYXksIGBGb29fYCksIHdlIGdldCBgRm9vX19UZXN0TmFtZV9UZXN0YCwgd2hpY2ggaXMgaW52YWxpZC4KKyAgMS4gSWYgYFRlc3ROYW1lYCBzdGFydHMgd2l0aCBhbiBgX2AgKHNheSwgYF9CYXJgKSwgd2UgZ2V0IGBUZXN0Q2FzZU5hbWVfX0Jhcl9UZXN0YCwgd2hpY2ggaXMgaW52YWxpZC4KKyAgMS4gSWYgYFRlc3ROYW1lYCBlbmRzIHdpdGggYW4gYF9gIChzYXksIGBCYXJfYCksIHdlIGdldCBgVGVzdENhc2VOYW1lX0Jhcl9fVGVzdGAsIHdoaWNoIGlzIGludmFsaWQuCisKK1NvIGNsZWFybHkgYFRlc3RDYXNlTmFtZWAgYW5kIGBUZXN0TmFtZWAgY2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIGBfYAorKEFjdHVhbGx5LCBgVGVzdENhc2VOYW1lYCBjYW4gc3RhcnQgd2l0aCBgX2AgLS0gYXMgbG9uZyBhcyB0aGUgYF9gIGlzbid0Citmb2xsb3dlZCBieSBhbiB1cHBlci1jYXNlIGxldHRlci4gIEJ1dCB0aGF0J3MgZ2V0dGluZyBjb21wbGljYXRlZC4gIFNvCitmb3Igc2ltcGxpY2l0eSB3ZSBqdXN0IHNheSB0aGF0IGl0IGNhbm5vdCBzdGFydCB3aXRoIGBfYC4pLgorCitJdCBtYXkgc2VlbSBmaW5lIGZvciBgVGVzdENhc2VOYW1lYCBhbmQgYFRlc3ROYW1lYCB0byBjb250YWluIGBfYCBpbiB0aGUKK21pZGRsZS4gIEhvd2V2ZXIsIGNvbnNpZGVyIHRoaXM6CitgYGAKK1RFU1QoVGltZSwgRmxpZXNfTGlrZV9Bbl9BcnJvdykgeyAuLi4gfQorVEVTVChUaW1lX0ZsaWVzLCBMaWtlX0FuX0Fycm93KSB7IC4uLiB9CitgYGAKKworTm93LCB0aGUgdHdvIGBURVNUYHMgd2lsbCBib3RoIGdlbmVyYXRlIHRoZSBzYW1lIGNsYXNzCisoYFRpbWVfRmlsZXNfTGlrZV9Bbl9BcnJvd19UZXN0YCkuICBUaGF0J3Mgbm90IGdvb2QuCisKK1NvIGZvciBzaW1wbGljaXR5LCB3ZSBqdXN0IGFzayB0aGUgdXNlcnMgdG8gYXZvaWQgYF9gIGluIGBUZXN0Q2FzZU5hbWVgCithbmQgYFRlc3ROYW1lYC4gIFRoZSBydWxlIGlzIG1vcmUgY29uc3RyYWluaW5nIHRoYW4gbmVjZXNzYXJ5LCBidXQgaXQncworc2ltcGxlIGFuZCBlYXN5IHRvIHJlbWVtYmVyLiAgSXQgYWxzbyBnaXZlcyBHb29nbGUgVGVzdCBzb21lIHdpZ2dsZQorcm9vbSBpbiBjYXNlIGl0cyBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKworSWYgeW91IHZpb2xhdGUgdGhlIHJ1bGUsIHRoZXJlIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgY29uc2VxdWVuY2VzLAorYnV0IHlvdXIgdGVzdCBtYXkgKGp1c3QgbWF5KSBicmVhayB3aXRoIGEgbmV3IGNvbXBpbGVyIChvciBhIG5ldwordmVyc2lvbiBvZiB0aGUgY29tcGlsZXIgeW91IGFyZSB1c2luZykgb3Igd2l0aCBhIG5ldyB2ZXJzaW9uIG9mIEdvb2dsZQorVGVzdC4gIFRoZXJlZm9yZSBpdCdzIGJlc3QgdG8gZm9sbG93IHRoZSBydWxlLgorCisjIyBXaHkgaXMgaXQgbm90IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBwcmUtY29tcGlsZWQgY29weSBvZiBHb29nbGUgVGVzdCAoZm9yIGV4YW1wbGUsIGludG8gL3Vzci9sb2NhbCk/ICMjCisKK0luIHRoZSBlYXJseSBkYXlzLCB3ZSBzYWlkIHRoYXQgeW91IGNvdWxkIGluc3RhbGwKK2NvbXBpbGVkIEdvb2dsZSBUZXN0IGxpYnJhcmllcyBvbiBgKmBuaXggc3lzdGVtcyB1c2luZyBgbWFrZSBpbnN0YWxsYC4KK1RoZW4gZXZlcnkgdXNlciBvZiB5b3VyIG1hY2hpbmUgY2FuIHdyaXRlIHRlc3RzIHdpdGhvdXQKK3JlY29tcGlsaW5nIEdvb2dsZSBUZXN0LgorCitUaGlzIHNlZW1lZCBsaWtlIGEgZ29vZCBpZGVhLCBidXQgaXQgaGFzIGEKK2dvdC1jaGE6IGV2ZXJ5IHVzZXIgbmVlZHMgdG8gY29tcGlsZSBoaXMgdGVzdHMgdXNpbmcgdGhlIF9zYW1lXyBjb21waWxlcgorZmxhZ3MgdXNlZCB0byBjb21waWxlIHRoZSBpbnN0YWxsZWQgR29vZ2xlIFRlc3QgbGlicmFyaWVzOyBvdGhlcndpc2UKK2hlIG1heSBydW4gaW50byB1bmRlZmluZWQgYmVoYXZpb3JzIChpLmUuIHRoZSB0ZXN0cyBjYW4gYmVoYXZlCitzdHJhbmdlbHkgYW5kIG1heSBldmVuIGNyYXNoIGZvciBubyBvYnZpb3VzIHJlYXNvbnMpLgorCitXaHk/ICBCZWNhdXNlIEMrKyBoYXMgdGhpcyB0aGluZyBjYWxsZWQgdGhlIE9uZS1EZWZpbml0aW9uIFJ1bGU6IGlmCit0d28gQysrIHNvdXJjZSBmaWxlcyBjb250YWluIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZQorY2xhc3MvZnVuY3Rpb24vdmFyaWFibGUsIGFuZCB5b3UgbGluayB0aGVtIHRvZ2V0aGVyLCB5b3UgdmlvbGF0ZSB0aGUKK3J1bGUuICBUaGUgbGlua2VyIG1heSBvciBtYXkgbm90IGNhdGNoIHRoZSBlcnJvciAoaW4gbWFueSBjYXNlcyBpdCdzCitub3QgcmVxdWlyZWQgYnkgdGhlIEMrKyBzdGFuZGFyZCB0byBjYXRjaCB0aGUgdmlvbGF0aW9uKS4gIElmIGl0Citkb2Vzbid0LCB5b3UgZ2V0IHN0cmFuZ2UgcnVuLXRpbWUgYmVoYXZpb3JzIHRoYXQgYXJlIHVuZXhwZWN0ZWQgYW5kCitoYXJkIHRvIGRlYnVnLgorCitJZiB5b3UgY29tcGlsZSBHb29nbGUgVGVzdCBhbmQgeW91ciB0ZXN0IGNvZGUgdXNpbmcgZGlmZmVyZW50IGNvbXBpbGVyCitmbGFncywgdGhleSBtYXkgc2VlIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZQorY2xhc3MvZnVuY3Rpb24vdmFyaWFibGUgKGUuZy4gZHVlIHRvIHRoZSB1c2Ugb2YgYCNpZmAgaW4gR29vZ2xlIFRlc3QpLgorVGhlcmVmb3JlLCBmb3IgeW91ciBzYW5pdHksIHdlIHJlY29tbWVuZCB0byBhdm9pZCBpbnN0YWxsaW5nIHByZS1jb21waWxlZAorR29vZ2xlIFRlc3QgbGlicmFyaWVzLiAgSW5zdGVhZCwgZWFjaCBwcm9qZWN0IHNob3VsZCBjb21waWxlCitHb29nbGUgVGVzdCBpdHNlbGYgc3VjaCB0aGF0IGl0IGNhbiBiZSBzdXJlIHRoYXQgdGhlIHNhbWUgZmxhZ3MgYXJlCit1c2VkIGZvciBib3RoIEdvb2dsZSBUZXN0IGFuZCB0aGUgdGVzdHMuCisKKyMjIEhvdyBkbyBJIGdlbmVyYXRlIDY0LWJpdCBiaW5hcmllcyBvbiBXaW5kb3dzICh1c2luZyBWaXN1YWwgU3R1ZGlvIDIwMDgpPyAjIworCisoQW5zd2VyZWQgYnkgVHJldm9yIFJvYmluc29uKQorCitMb2FkIHRoZSBzdXBwbGllZCBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZpbGUsIGVpdGhlciBgbXN2Y1xndGVzdC1tZC5zbG5gIG9yCitgbXN2Y1xndGVzdC5zbG5gLiBHbyB0aHJvdWdoIHRoZSBtaWdyYXRpb24gd2l6YXJkIHRvIG1pZ3JhdGUgdGhlCitzb2x1dGlvbiBhbmQgcHJvamVjdCBmaWxlcyB0byBWaXN1YWwgU3R1ZGlvIDIwMDguIFNlbGVjdAorYENvbmZpZ3VyYXRpb24gTWFuYWdlci4uLmAgZnJvbSB0aGUgYEJ1aWxkYCBtZW51LiBTZWxlY3QgYDxOZXcuLi4+YCBmcm9tCit0aGUgYEFjdGl2ZSBzb2x1dGlvbiBwbGF0Zm9ybWAgZHJvcGRvd24uICBTZWxlY3QgYHg2NGAgZnJvbSB0aGUgbmV3CitwbGF0Zm9ybSBkcm9wZG93biwgbGVhdmUgYENvcHkgc2V0dGluZ3MgZnJvbWAgc2V0IHRvIGBXaW4zMmAgYW5kCitgQ3JlYXRlIG5ldyBwcm9qZWN0IHBsYXRmb3Jtc2AgY2hlY2tlZCwgdGhlbiBjbGljayBgT0tgLiBZb3Ugbm93IGhhdmUKK2BXaW4zMmAgYW5kIGB4NjRgIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb25zLCBzZWxlY3RhYmxlIGZyb20gdGhlCitgU3RhbmRhcmRgIHRvb2xiYXIsIHdoaWNoIGFsbG93IHlvdSB0byB0b2dnbGUgYmV0d2VlbiBidWlsZGluZyAzMi1iaXQgb3IKKzY0LWJpdCBiaW5hcmllcyAob3IgYm90aCBhdCBvbmNlIHVzaW5nIEJhdGNoIEJ1aWxkKS4KKworSW4gb3JkZXIgdG8gcHJldmVudCBidWlsZCBvdXRwdXQgZmlsZXMgZnJvbSBvdmVyd3JpdGluZyBvbmUgYW5vdGhlciwKK3lvdSdsbCBuZWVkIHRvIGNoYW5nZSB0aGUgYEludGVybWVkaWF0ZSBEaXJlY3RvcnlgIHNldHRpbmdzIGZvciB0aGUKK25ld2x5IGNyZWF0ZWQgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBhY3Jvc3MgYWxsIHRoZSBwcm9qZWN0cy4gVG8gZG8KK3RoaXMsIG11bHRpLXNlbGVjdCAoZS5nLiB1c2luZyBzaGlmdC1jbGljaykgYWxsIHByb2plY3RzIChidXQgbm90IHRoZQorc29sdXRpb24pIGluIHRoZSBgU29sdXRpb24gRXhwbG9yZXJgLiBSaWdodC1jbGljayBvbmUgb2YgdGhlbSBhbmQKK3NlbGVjdCBgUHJvcGVydGllc2AuIEluIHRoZSBsZWZ0IHBhbmUsIHNlbGVjdCBgQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzYCwKK2FuZCBmcm9tIHRoZSBgQ29uZmlndXJhdGlvbmAgZHJvcGRvd24sIHNlbGVjdCBgQWxsIENvbmZpZ3VyYXRpb25zYC4KK01ha2Ugc3VyZSB0aGUgc2VsZWN0ZWQgcGxhdGZvcm0gaXMgYHg2NGAuIEZvciB0aGUKK2BJbnRlcm1lZGlhdGUgRGlyZWN0b3J5YCBzZXR0aW5nLCBjaGFuZ2UgdGhlIHZhbHVlIGZyb20KK2AkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSlgIHRvCitgJChPdXREaXIpXCQoUHJvamVjdE5hbWUpYC4gQ2xpY2sgYE9LYCBhbmQgdGhlbiBidWlsZCB0aGUKK3NvbHV0aW9uLiBXaGVuIHRoZSBidWlsZCBpcyBjb21wbGV0ZSwgdGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGluCit0aGUgYG1zdmNceDY0XERlYnVnYCBkaXJlY3RvcnkuCisKKyMjIENhbiBJIHVzZSBHb29nbGUgVGVzdCBvbiBNaW5HVz8gIyMKKworV2UgaGF2ZW4ndCB0ZXN0ZWQgdGhpcyBvdXJzZWx2ZXMsIGJ1dCBQZXIgQWJyYWhhbXNlbiByZXBvcnRlZCB0aGF0IGhlCit3YXMgYWJsZSB0byBjb21waWxlIGFuZCBpbnN0YWxsIEdvb2dsZSBUZXN0IHN1Y2Nlc3NmdWxseSB3aGVuIHVzaW5nCitNaW5HVyBmcm9tIEN5Z3dpbi4gIFlvdSdsbCBuZWVkIHRvIGNvbmZpZ3VyZSBpdCB3aXRoOgorCitgUEFUSC9UTy9jb25maWd1cmUgQ0M9ImdjYyAtbW5vLWN5Z3dpbiIgQ1hYPSJnKysgLW1uby1jeWd3aW4iYAorCitZb3Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGUgYC1tbm8tY3lnd2luYCBvcHRpb24gd2l0aCBkaXJlY3QgbGlua3MKK3RvIHRoZSByZWFsIE1pbkdXIGJpbmFyaWVzLCBidXQgd2UgaGF2ZW4ndCB0cmllZCB0aGF0LgorCitDYXZlYXRzOgorCisgICogVGhlcmUgYXJlIG1hbnkgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcuCisgICogYG1ha2UgY2hlY2tgIHdpbGwgcHJvZHVjZSBzb21lIGVycm9ycyBhcyBub3QgYWxsIHRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYgYXJlIGNvbXBhdGlibGUgd2l0aCBNaW5HVy4KKworV2UgYWxzbyBoYXZlIHJlcG9ydHMgb24gc3VjY2Vzc2Z1bCBjcm9zcyBjb21waWxhdGlvbiBvZiBHb29nbGUgVGVzdAorTWluR1cgYmluYXJpZXMgb24gTGludXggdXNpbmcKK1t0aGVzZSBpbnN0cnVjdGlvbnNdKGh0dHA6Ly93aWtpLnd4d2lkZ2V0cy5vcmcvQ3Jvc3MtQ29tcGlsaW5nX1VuZGVyX0xpbnV4I0Nyb3NzLWNvbXBpbGluZ191bmRlcl9MaW51eF9mb3JfTVNfV2luZG93cykKK29uIHRoZSBXeFdpZGdldHMgc2l0ZS4KKworUGxlYXNlIGNvbnRhY3QgYGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbWAgaWYgeW91IGFyZQoraW50ZXJlc3RlZCBpbiBpbXByb3ZpbmcgdGhlIHN1cHBvcnQgZm9yIE1pbkdXLgorCisjIyBXaHkgZG9lcyBHb29nbGUgVGVzdCBzdXBwb3J0IEVYUEVDVFxfRVEoTlVMTCwgcHRyKSBhbmQgQVNTRVJUXF9FUShOVUxMLCBwdHIpIGJ1dCBub3QgRVhQRUNUXF9ORShOVUxMLCBwdHIpIGFuZCBBU1NFUlRcX05FKE5VTEwsIHB0cik/ICMjCisKK0R1ZSB0byBzb21lIHBlY3VsaWFyaXR5IG9mIEMrKywgaXQgcmVxdWlyZXMgc29tZSBub24tdHJpdmlhbCB0ZW1wbGF0ZQorbWV0YSBwcm9ncmFtbWluZyB0cmlja3MgdG8gc3VwcG9ydCB1c2luZyBgTlVMTGAgYXMgYW4gYXJndW1lbnQgb2YgdGhlCitgRVhQRUNUX1hYKClgIGFuZCBgQVNTRVJUX1hYKClgIG1hY3Jvcy4gVGhlcmVmb3JlIHdlIG9ubHkgZG8gaXQgd2hlcmUKK2l0J3MgbW9zdCBuZWVkZWQgKG90aGVyd2lzZSB3ZSBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHb29nbGUgVGVzdAoraGFyZGVyIHRvIG1haW50YWluIGFuZCBtb3JlIGVycm9yLXByb25lIHRoYW4gbmVjZXNzYXJ5KS4KKworVGhlIGBFWFBFQ1RfRVEoKWAgbWFjcm8gdGFrZXMgdGhlIF9leHBlY3RlZF8gdmFsdWUgYXMgaXRzIGZpcnN0Cithcmd1bWVudCBhbmQgdGhlIF9hY3R1YWxfIHZhbHVlIGFzIHRoZSBzZWNvbmQuIEl0J3MgcmVhc29uYWJsZSB0aGF0Citzb21lb25lIHdhbnRzIHRvIHdyaXRlIGBFWFBFQ1RfRVEoTlVMTCwgc29tZV9leHByZXNzaW9uKWAsIGFuZCB0aGlzCitpbmRlZWQgd2FzIHJlcXVlc3RlZCBzZXZlcmFsIHRpbWVzLiBUaGVyZWZvcmUgd2UgaW1wbGVtZW50ZWQgaXQuCisKK1RoZSBuZWVkIGZvciBgRVhQRUNUX05FKE5VTEwsIHB0cilgIGlzbid0IG5lYXJseSBhcyBzdHJvbmcuIFdoZW4gdGhlCithc3NlcnRpb24gZmFpbHMsIHlvdSBhbHJlYWR5IGtub3cgdGhhdCBgcHRyYCBtdXN0IGJlIGBOVUxMYCwgc28gaXQKK2RvZXNuJ3QgYWRkIGFueSBpbmZvcm1hdGlvbiB0byBwcmludCBwdHIgaW4gdGhpcyBjYXNlLiBUaGF0IG1lYW5zCitgRVhQRUNUX1RSVUUocHRyICEgTlVMTClgIHdvcmtzIGp1c3QgYXMgd2VsbC4KKworSWYgd2Ugd2VyZSB0byBzdXBwb3J0IGBFWFBFQ1RfTkUoTlVMTCwgcHRyKWAsIGZvciBjb25zaXN0ZW5jeSB3ZSdsbAoraGF2ZSB0byBzdXBwb3J0IGBFWFBFQ1RfTkUocHRyLCBOVUxMKWAgYXMgd2VsbCwgYXMgdW5saWtlIGBFWFBFQ1RfRVFgLAord2UgZG9uJ3QgaGF2ZSBhIGNvbnZlbnRpb24gb24gdGhlIG9yZGVyIG9mIHRoZSB0d28gYXJndW1lbnRzIGZvcgorYEVYUEVDVF9ORWAuIFRoaXMgbWVhbnMgdXNpbmcgdGhlIHRlbXBsYXRlIG1ldGEgcHJvZ3JhbW1pbmcgdHJpY2tzCit0d2ljZSBpbiB0aGUgaW1wbGVtZW50YXRpb24sIG1ha2luZyBpdCBldmVuIGhhcmRlciB0byB1bmRlcnN0YW5kIGFuZAorbWFpbnRhaW4uIFdlIGJlbGlldmUgdGhlIGJlbmVmaXQgZG9lc24ndCBqdXN0aWZ5IHRoZSBjb3N0LgorCitGaW5hbGx5LCB3aXRoIHRoZSBncm93dGggb2YgR29vZ2xlIE1vY2sncyBbbWF0Y2hlcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNVc2luZ19NYXRjaGVyc19pbl9Hb29nbGVfVGVzdF9Bc3NlcnRpb25zKSBsaWJyYXJ5LCB3ZSBhcmUKK2VuY291cmFnaW5nIHBlb3BsZSB0byB1c2UgdGhlIHVuaWZpZWQgYEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAKK3N5bnRheCBtb3JlIG9mdGVuIGluIHRlc3RzLiBPbmUgc2lnbmlmaWNhbnQgYWR2YW50YWdlIG9mIHRoZSBtYXRjaGVyCithcHByb2FjaCBpcyB0aGF0IG1hdGNoZXJzIGNhbiBiZSBlYXNpbHkgY29tYmluZWQgdG8gZm9ybSBuZXcgbWF0Y2hlcnMsCit3aGlsZSB0aGUgYEVYUEVDVF9ORWAsIGV0YywgbWFjcm9zIGNhbm5vdCBiZSBlYXNpbHkKK2NvbWJpbmVkLiBUaGVyZWZvcmUgd2Ugd2FudCB0byBpbnZlc3QgbW9yZSBpbiB0aGUgbWF0Y2hlcnMgdGhhbiBpbiB0aGUKK2BFWFBFQ1RfWFgoKWAgbWFjcm9zLgorCisjIyBEb2VzIEdvb2dsZSBUZXN0IHN1cHBvcnQgcnVubmluZyB0ZXN0cyBpbiBwYXJhbGxlbD8gIyMKKworVGVzdCBydW5uZXJzIHRlbmQgdG8gYmUgdGlnaHRseSBjb3VwbGVkIHdpdGggdGhlIGJ1aWxkL3Rlc3QKK2Vudmlyb25tZW50LCBhbmQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cnkgdG8gc29sdmUgdGhlIHByb2JsZW0gb2YKK3J1bm5pbmcgdGVzdHMgaW4gcGFyYWxsZWwuICBJbnN0ZWFkLCB3ZSB0cmllZCB0byBtYWtlIEdvb2dsZSBUZXN0IHdvcmsKK25pY2VseSB3aXRoIHRlc3QgcnVubmVycy4gIEZvciBleGFtcGxlLCBHb29nbGUgVGVzdCdzIFhNTCByZXBvcnQKK2NvbnRhaW5zIHRoZSB0aW1lIHNwZW50IG9uIGVhY2ggdGVzdCwgYW5kIGl0cyBgZ3Rlc3RfbGlzdF90ZXN0c2AgYW5kCitgZ3Rlc3RfZmlsdGVyYCBmbGFncyBjYW4gYmUgdXNlZCBmb3Igc3BsaXR0aW5nIHRoZSBleGVjdXRpb24gb2YgdGVzdAorbWV0aG9kcyBpbnRvIG11bHRpcGxlIHByb2Nlc3Nlcy4gIFRoZXNlIGZ1bmN0aW9uYWxpdGllcyBjYW4gaGVscCB0aGUKK3Rlc3QgcnVubmVyIHJ1biB0aGUgdGVzdHMgaW4gcGFyYWxsZWwuCisKKyMjIFdoeSBkb24ndCBHb29nbGUgVGVzdCBydW4gdGhlIHRlc3RzIGluIGRpZmZlcmVudCB0aHJlYWRzIHRvIHNwZWVkIHRoaW5ncyB1cD8gIyMKKworSXQncyBkaWZmaWN1bHQgdG8gd3JpdGUgdGhyZWFkLXNhZmUgY29kZS4gIE1vc3QgdGVzdHMgYXJlIG5vdCB3cml0dGVuCit3aXRoIHRocmVhZC1zYWZldHkgaW4gbWluZCwgYW5kIHRodXMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSBpbiBhCittdWx0aS10aHJlYWRlZCBzZXR0aW5nLgorCitJZiB5b3UgdGhpbmsgYWJvdXQgaXQsIGl0J3MgYWxyZWFkeSBoYXJkIHRvIG1ha2UgeW91ciBjb2RlIHdvcmsgd2hlbgoreW91IGtub3cgd2hhdCBvdGhlciB0aHJlYWRzIGFyZSBkb2luZy4gIEl0J3MgbXVjaCBoYXJkZXIsIGFuZAorc29tZXRpbWVzIGV2ZW4gaW1wb3NzaWJsZSwgdG8gbWFrZSB5b3VyIGNvZGUgd29yayB3aGVuIHlvdSBkb24ndCBrbm93Cit3aGF0IG90aGVyIHRocmVhZHMgYXJlIGRvaW5nIChyZW1lbWJlciB0aGF0IHRlc3QgbWV0aG9kcyBjYW4gYmUgYWRkZWQsCitkZWxldGVkLCBvciBtb2RpZmllZCBhZnRlciB5b3VyIHRlc3Qgd2FzIHdyaXR0ZW4pLiAgSWYgeW91IHdhbnQgdG8gcnVuCit0aGUgdGVzdHMgaW4gcGFyYWxsZWwsIHlvdSdkIGJldHRlciBydW4gdGhlbSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLgorCisjIyBXaHkgYXJlbid0IEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW1wbGVtZW50ZWQgdXNpbmcgZXhjZXB0aW9ucz8gIyMKKworT3VyIG9yaWdpbmFsIG1vdGl2YXRpb24gd2FzIHRvIGJlIGFibGUgdG8gdXNlIEdvb2dsZSBUZXN0IGluIHByb2plY3RzCit0aGF0IGRpc2FibGUgZXhjZXB0aW9ucy4gIExhdGVyIHdlIHJlYWxpemVkIHNvbWUgYWRkaXRpb25hbCBiZW5lZml0cworb2YgdGhpcyBhcHByb2FjaDoKKworICAxLiBUaHJvd2luZyBpbiBhIGRlc3RydWN0b3IgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIGluIEMrKy4gIE5vdCB1c2luZyBleGNlcHRpb25zIG1lYW5zIEdvb2dsZSBUZXN0J3MgYXNzZXJ0aW9ucyBhcmUgc2FmZSB0byB1c2UgaW4gZGVzdHJ1Y3RvcnMuCisgIDEuIFRoZSBgRVhQRUNUXypgIGZhbWlseSBvZiBtYWNyb3Mgd2lsbCBjb250aW51ZSBldmVuIGFmdGVyIGEgZmFpbHVyZSwgYWxsb3dpbmcgbXVsdGlwbGUgZmFpbHVyZXMgaW4gYSBgVEVTVGAgdG8gYmUgcmVwb3J0ZWQgaW4gYSBzaW5nbGUgcnVuLiBUaGlzIGlzIGEgcG9wdWxhciBmZWF0dXJlLCBhcyBpbiBDKysgdGhlIGVkaXQtY29tcGlsZS10ZXN0IGN5Y2xlIGlzIHVzdWFsbHkgcXVpdGUgbG9uZyBhbmQgYmVpbmcgYWJsZSB0byBmaXhpbmcgbW9yZSB0aGFuIG9uZSB0aGluZyBhdCBhIHRpbWUgaXMgYSBibGVzc2luZy4KKyAgMS4gSWYgYXNzZXJ0aW9ucyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgZXhjZXB0aW9ucywgYSB0ZXN0IG1heSBmYWxzZWx5IGlnbm9yZSBhIGZhaWx1cmUgaWYgaXQncyBjYXVnaHQgYnkgdXNlciBjb2RlOgorYGBgCit0cnkgeyAuLi4gQVNTRVJUX1RSVUUoLi4uKSAuLi4gfQorY2F0Y2ggKC4uLikgeyAuLi4gfQorYGBgCitUaGUgYWJvdmUgY29kZSB3aWxsIHBhc3MgZXZlbiBpZiB0aGUgYEFTU0VSVF9UUlVFYCB0aHJvd3MuICBXaGlsZSBpdCdzIHVubGlrZWx5IGZvciBzb21lb25lIHRvIHdyaXRlIHRoaXMgaW4gYSB0ZXN0LCBpdCdzIHBvc3NpYmxlIHRvIHJ1biBpbnRvIHRoaXMgcGF0dGVybiB3aGVuIHlvdSB3cml0ZSBhc3NlcnRpb25zIGluIGNhbGxiYWNrcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4KKworVGhlIGRvd25zaWRlIG9mIG5vdCB1c2luZyBleGNlcHRpb25zIGlzIHRoYXQgYEFTU0VSVF8qYCAoaW1wbGVtZW50ZWQKK3VzaW5nIGByZXR1cm5gKSB3aWxsIG9ubHkgYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIG5vdCB0aGUgY3VycmVudAorYFRFU1RgLgorCisjIyBXaHkgZG8gd2UgdXNlIHR3byBkaWZmZXJlbnQgbWFjcm9zIGZvciB0ZXN0cyB3aXRoIGFuZCB3aXRob3V0IGZpeHR1cmVzPyAjIworCitVbmZvcnR1bmF0ZWx5LCBDKysncyBtYWNybyBzeXN0ZW0gZG9lc24ndCBhbGxvdyB1cyB0byB1c2UgdGhlIHNhbWUKK21hY3JvIGZvciBib3RoIGNhc2VzLiAgT25lIHBvc3NpYmlsaXR5IGlzIHRvIHByb3ZpZGUgb25seSBvbmUgbWFjcm8KK2ZvciB0ZXN0cyB3aXRoIGZpeHR1cmVzLCBhbmQgcmVxdWlyZSB0aGUgdXNlciB0byBkZWZpbmUgYW4gZW1wdHkKK2ZpeHR1cmUgc29tZXRpbWVzOgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OworCitURVNUX0YoRm9vVGVzdCwgRG9lc1RoaXMpIHsgLi4uIH0KK2BgYAorb3IKK2BgYAordHlwZWRlZiA6OnRlc3Rpbmc6OlRlc3QgRm9vVGVzdDsKKworVEVTVF9GKEZvb1Rlc3QsIERvZXNUaGF0KSB7IC4uLiB9CitgYGAKKworWWV0LCBtYW55IHBlb3BsZSB0aGluayB0aGlzIGlzIG9uZSBsaW5lIHRvbyBtYW55LiA6LSkgT3VyIGdvYWwgd2FzIHRvCittYWtlIGl0IHJlYWxseSBlYXN5IHRvIHdyaXRlIHRlc3RzLCBzbyB3ZSB0cmllZCB0byBtYWtlIHNpbXBsZSB0ZXN0cwordHJpdmlhbCB0byBjcmVhdGUuICBUaGF0IG1lYW5zIHVzaW5nIGEgc2VwYXJhdGUgbWFjcm8gZm9yIHN1Y2ggdGVzdHMuCisKK1dlIHRoaW5rIG5laXRoZXIgYXBwcm9hY2ggaXMgaWRlYWwsIHlldCBlaXRoZXIgb2YgdGhlbSBpcyByZWFzb25hYmxlLgorSW4gdGhlIGVuZCwgaXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgbXVjaCBlaXRoZXIgd2F5LgorCisjIyBXaHkgZG9uJ3Qgd2UgdXNlIHN0cnVjdHMgYXMgdGVzdCBmaXh0dXJlcz8gIyMKKworV2UgbGlrZSB0byB1c2Ugc3RydWN0cyBvbmx5IHdoZW4gcmVwcmVzZW50aW5nIHBhc3NpdmUgZGF0YS4gIFRoaXMKK2Rpc3RpbmN0aW9uIGJldHdlZW4gc3RydWN0cyBhbmQgY2xhc3NlcyBpcyBnb29kIGZvciBkb2N1bWVudGluZyB0aGUKK2ludGVudCBvZiB0aGUgY29kZSdzIGF1dGhvci4gIFNpbmNlIHRlc3QgZml4dHVyZXMgaGF2ZSBsb2dpYyBsaWtlCitgU2V0VXAoKWAgYW5kIGBUZWFyRG93bigpYCwgdGhleSBhcmUgYmV0dGVyIGRlZmluZWQgYXMgY2xhc3Nlcy4KKworIyMgV2h5IGFyZSBkZWF0aCB0ZXN0cyBpbXBsZW1lbnRlZCBhcyBhc3NlcnRpb25zIGluc3RlYWQgb2YgdXNpbmcgYSB0ZXN0IHJ1bm5lcj8gIyMKKworT3VyIGdvYWwgd2FzIHRvIG1ha2UgZGVhdGggdGVzdHMgYXMgY29udmVuaWVudCBmb3IgYSB1c2VyIGFzIEMrKworcG9zc2libHkgYWxsb3dzLiAgSW4gcGFydGljdWxhcjoKKworICAqIFRoZSBydW5uZXItc3R5bGUgcmVxdWlyZXMgdG8gc3BsaXQgdGhlIGluZm9ybWF0aW9uIGludG8gdHdvIHBpZWNlczogdGhlIGRlZmluaXRpb24gb2YgdGhlIGRlYXRoIHRlc3QgaXRzZWxmLCBhbmQgdGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBydW5uZXIgb24gaG93IHRvIHJ1biB0aGUgZGVhdGggdGVzdCBhbmQgd2hhdCB0byBleHBlY3QuICBUaGUgZGVhdGggdGVzdCB3b3VsZCBiZSB3cml0dGVuIGluIEMrKywgd2hpbGUgdGhlIHJ1bm5lciBzcGVjIG1heSBvciBtYXkgbm90IGJlLiAgQSB1c2VyIG5lZWRzIHRvIGNhcmVmdWxseSBrZWVwIHRoZSB0d28gaW4gc3luYy4gYEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIGV4cGVjdGVkX21lc3NhZ2UpYCBzcGVjaWZpZXMgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBvbmUgcGxhY2UsIGluIG9uZSBsYW5ndWFnZSwgd2l0aG91dCBib2lsZXJwbGF0ZSBjb2RlLiBJdCBpcyB2ZXJ5IGRlY2xhcmF0aXZlLgorICAqIGBBU1NFUlRfREVBVEhgIGhhcyBhIHNpbWlsYXIgc3ludGF4IGFuZCBlcnJvci1yZXBvcnRpbmcgc2VtYW50aWNzIGFzIG90aGVyIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMsIGFuZCB0aHVzIGlzIGVhc3kgdG8gbGVhcm4uCisgICogYEFTU0VSVF9ERUFUSGAgY2FuIGJlIG1peGVkIHdpdGggb3RoZXIgYXNzZXJ0aW9ucyBhbmQgb3RoZXIgbG9naWMgYXQgeW91ciB3aWxsLiAgWW91IGFyZSBub3QgbGltaXRlZCB0byBvbmUgZGVhdGggdGVzdCBwZXIgdGVzdCBtZXRob2QuIEZvciBleGFtcGxlLCB5b3UgY2FuIHdyaXRlIHNvbWV0aGluZyBsaWtlOgorYGBgCisgICAgaWYgKEZvb0NvbmRpdGlvbigpKSB7CisgICAgICBBU1NFUlRfREVBVEgoQmFyKCksICJibGFoIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9FUSg1LCBCYXIoKSk7CisgICAgfQorYGBgCitJZiB5b3UgcHJlZmVyIG9uZSBkZWF0aCB0ZXN0IHBlciB0ZXN0IG1ldGhvZCwgeW91IGNhbiB3cml0ZSB5b3VyIHRlc3RzIGluIHRoYXQgc3R5bGUgdG9vLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBpbXBvc2UgdGhhdCBvbiB0aGUgdXNlcnMuICBUaGUgZmV3ZXIgYXJ0aWZpY2lhbCBsaW1pdGF0aW9ucyB0aGUgYmV0dGVyLgorICAqIGBBU1NFUlRfREVBVEhgIGNhbiByZWZlcmVuY2UgbG9jYWwgdmFyaWFibGVzIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCBhbmQgeW91IGNhbiBkZWNpZGUgaG93IG1hbnkgZGVhdGggdGVzdHMgeW91IHdhbnQgYmFzZWQgb24gcnVuLXRpbWUgaW5mb3JtYXRpb24uICBGb3IgZXhhbXBsZSwKK2BgYAorICAgIGNvbnN0IGludCBjb3VudCA9IEdldENvdW50KCk7ICAvLyBPbmx5IGtub3duIGF0IHJ1biB0aW1lLgorICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgIEFTU0VSVF9ERUFUSCh7CisgICAgICAgIGRvdWJsZSogYnVmZmVyID0gbmV3IGRvdWJsZVtpXTsKKyAgICAgICAgLi4uIGluaXRpYWxpemVzIGJ1ZmZlciAuLi4KKyAgICAgICAgRm9vKGJ1ZmZlciwgaSkKKyAgICAgIH0sICJibGFoIGJsYWgiKTsKKyAgICB9CitgYGAKK1RoZSBydW5uZXItYmFzZWQgYXBwcm9hY2ggdGVuZHMgdG8gYmUgbW9yZSBzdGF0aWMgYW5kIGxlc3MgZmxleGlibGUsIG9yIHJlcXVpcmVzIG1vcmUgdXNlciBlZmZvcnQgdG8gZ2V0IHRoaXMga2luZCBvZiBmbGV4aWJpbGl0eS4KKworQW5vdGhlciBpbnRlcmVzdGluZyB0aGluZyBhYm91dCBgQVNTRVJUX0RFQVRIYCBpcyB0aGF0IGl0IGNhbGxzIGBmb3JrKClgCit0byBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzIHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoaXMgaXMgbGlnaHRlbmluZworZmFzdCwgYXMgYGZvcmsoKWAgdXNlcyBjb3B5LW9uLXdyaXRlIHBhZ2VzIGFuZCBpbmN1cnMgYWxtb3N0IHplcm8KK292ZXJoZWFkLCBhbmQgdGhlIGNoaWxkIHByb2Nlc3Mgc3RhcnRzIGZyb20gdGhlIHVzZXItc3VwcGxpZWQKK3N0YXRlbWVudCBkaXJlY3RseSwgc2tpcHBpbmcgYWxsIGdsb2JhbCBhbmQgbG9jYWwgaW5pdGlhbGl6YXRpb24gYW5kCithbnkgY29kZSBsZWFkaW5nIHRvIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJZiB5b3UgbGF1bmNoIHRoZSBjaGlsZAorcHJvY2VzcyBmcm9tIHNjcmF0Y2gsIGl0IGNhbiB0YWtlIHNlY29uZHMganVzdCB0byBsb2FkIGV2ZXJ5dGhpbmcgYW5kCitzdGFydCBydW5uaW5nIGlmIHRoZSB0ZXN0IGxpbmtzIHRvIG1hbnkgbGlicmFyaWVzIGR5bmFtaWNhbGx5LgorCisjIyBNeSBkZWF0aCB0ZXN0IG1vZGlmaWVzIHNvbWUgc3RhdGUsIGJ1dCB0aGUgY2hhbmdlIHNlZW1zIGxvc3QgYWZ0ZXIgdGhlIGRlYXRoIHRlc3QgZmluaXNoZXMuIFdoeT8gIyMKKworRGVhdGggdGVzdHMgKGBFWFBFQ1RfREVBVEhgLCBldGMpIGFyZSBleGVjdXRlZCBpbiBhIHN1Yi1wcm9jZXNzIHMudC4gdGhlCitleHBlY3RlZCBjcmFzaCB3b24ndCBraWxsIHRoZSB0ZXN0IHByb2dyYW0gKGkuZS4gdGhlIHBhcmVudCBwcm9jZXNzKS4gQXMgYQorcmVzdWx0LCBhbnkgaW4tbWVtb3J5IHNpZGUgZWZmZWN0cyB0aGV5IGluY3VyIGFyZSBvYnNlcnZhYmxlIGluIHRoZWlyCityZXNwZWN0aXZlIHN1Yi1wcm9jZXNzZXMsIGJ1dCBub3QgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiBZb3UgY2FuIHRoaW5rIG9mIHRoZW0KK2FzIHJ1bm5pbmcgaW4gYSBwYXJhbGxlbCB1bml2ZXJzZSwgbW9yZSBvciBsZXNzLgorCisjIyBUaGUgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0ICJ1bmRlZmluZWQgcmVmZXJlbmNlcyIgdG8gc29tZSBzdGF0aWMgY29uc3QgbWVtYmVyIHZhcmlhYmxlcywgYnV0IEkgZGlkIGRlZmluZSB0aGVtIGluIHRoZSBjbGFzcyBib2R5LiBXaGF0J3Mgd3Jvbmc/ICMjCisKK0lmIHlvdXIgY2xhc3MgaGFzIGEgc3RhdGljIGRhdGEgbWVtYmVyOgorCitgYGAKKy8vIGZvby5oCitjbGFzcyBGb28geworICAuLi4KKyAgc3RhdGljIGNvbnN0IGludCBrQmFyID0gMTAwOworfTsKK2BgYAorCitZb3UgYWxzbyBuZWVkIHRvIGRlZmluZSBpdCBfb3V0c2lkZV8gb2YgdGhlIGNsYXNzIGJvZHkgaW4gYGZvby5jY2A6CisKK2BgYAorY29uc3QgaW50IEZvbzo6a0JhcjsgIC8vIE5vIGluaXRpYWxpemVyIGhlcmUuCitgYGAKKworT3RoZXJ3aXNlIHlvdXIgY29kZSBpcyAqKmludmFsaWQgQysrKiosIGFuZCBtYXkgYnJlYWsgaW4gdW5leHBlY3RlZCB3YXlzLiBJbgorcGFydGljdWxhciwgdXNpbmcgaXQgaW4gR29vZ2xlIFRlc3QgY29tcGFyaXNvbiBhc3NlcnRpb25zIChgRVhQRUNUX0VRYCwgZXRjKQord2lsbCBnZW5lcmF0ZSBhbiAidW5kZWZpbmVkIHJlZmVyZW5jZSIgbGlua2VyIGVycm9yLgorCisjIyBJIGhhdmUgYW4gaW50ZXJmYWNlIHRoYXQgaGFzIHNldmVyYWwgaW1wbGVtZW50YXRpb25zLiBDYW4gSSB3cml0ZSBhIHNldCBvZiB0ZXN0cyBvbmNlIGFuZCByZXBlYXQgdGhlbSBvdmVyIGFsbCB0aGUgaW1wbGVtZW50YXRpb25zPyAjIworCitHb29nbGUgVGVzdCBkb2Vzbid0IHlldCBoYXZlIGdvb2Qgc3VwcG9ydCBmb3IgdGhpcyBraW5kIG9mIHRlc3RzLCBvcgorZGF0YS1kcml2ZW4gdGVzdHMgaW4gZ2VuZXJhbC4gV2UgaG9wZSB0byBiZSBhYmxlIHRvIG1ha2UgaW1wcm92ZW1lbnRzIGluIHRoaXMKK2FyZWEgc29vbi4KKworIyMgQ2FuIEkgZGVyaXZlIGEgdGVzdCBmaXh0dXJlIGZyb20gYW5vdGhlcj8gIyMKKworWWVzLgorCitFYWNoIHRlc3QgZml4dHVyZSBoYXMgYSBjb3JyZXNwb25kaW5nIGFuZCBzYW1lIG5hbWVkIHRlc3QgY2FzZS4gVGhpcyBtZWFucyBvbmx5CitvbmUgdGVzdCBjYXNlIGNhbiB1c2UgYSBwYXJ0aWN1bGFyIGZpeHR1cmUuIFNvbWV0aW1lcywgaG93ZXZlciwgbXVsdGlwbGUgdGVzdAorY2FzZXMgbWF5IHdhbnQgdG8gdXNlIHRoZSBzYW1lIG9yIHNsaWdodGx5IGRpZmZlcmVudCBmaXh0dXJlcy4gRm9yIGV4YW1wbGUsIHlvdQorbWF5IHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG9mIGEgR1VJIGxpYnJhcnkncyB0ZXN0IGNhc2VzIGRvbid0IGxlYWsKK2ltcG9ydGFudCBzeXN0ZW0gcmVzb3VyY2VzIGxpa2UgZm9udHMgYW5kIGJydXNoZXMuCisKK0luIEdvb2dsZSBUZXN0LCB5b3Ugc2hhcmUgYSBmaXh0dXJlIGFtb25nIHRlc3QgY2FzZXMgYnkgcHV0dGluZyB0aGUgc2hhcmVkCitsb2dpYyBpbiBhIGJhc2UgdGVzdCBmaXh0dXJlLCB0aGVuIGRlcml2aW5nIGZyb20gdGhhdCBiYXNlIGEgc2VwYXJhdGUgZml4dHVyZQorZm9yIGVhY2ggdGVzdCBjYXNlIHRoYXQgd2FudHMgdG8gdXNlIHRoaXMgY29tbW9uIGxvZ2ljLiBZb3UgdGhlbiB1c2UgYFRFU1RfRigpYAordG8gd3JpdGUgdGVzdHMgdXNpbmcgZWFjaCBkZXJpdmVkIGZpeHR1cmUuCisKK1R5cGljYWxseSwgeW91ciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKworYGBgCisvLyBEZWZpbmVzIGEgYmFzZSB0ZXN0IGZpeHR1cmUuCitjbGFzcyBCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAuLi4KK307CisKKy8vIERlcml2ZXMgYSBmaXh0dXJlIEZvb1Rlc3QgZnJvbSBCYXNlVGVzdC4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgQmFzZVRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgICAgQmFzZVRlc3Q6OlNldFVwKCk7ICAvLyBTZXRzIHVwIHRoZSBiYXNlIGZpeHR1cmUgZmlyc3QuCisgICAgICAuLi4gYWRkaXRpb25hbCBzZXQtdXAgd29yayAuLi4KKyAgICB9CisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgICAgLi4uIGNsZWFuLXVwIHdvcmsgZm9yIEZvb1Rlc3QgLi4uCisgICAgICBCYXNlVGVzdDo6VGVhckRvd24oKTsgIC8vIFJlbWVtYmVyIHRvIHRlYXIgZG93biB0aGUgYmFzZSBmaXh0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIGNsZWFuaW5nIHVwIEZvb1Rlc3QhCisgICAgfQorICAgIC4uLiBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBmb3IgRm9vVGVzdCAuLi4KK307CisKKy8vIFRlc3RzIHRoYXQgdXNlIHRoZSBmaXh0dXJlIEZvb1Rlc3QuCitURVNUX0YoRm9vVGVzdCwgQmFyKSB7IC4uLiB9CitURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9CisKKy4uLiBhZGRpdGlvbmFsIGZpeHR1cmVzIGRlcml2ZWQgZnJvbSBCYXNlVGVzdCAuLi4KK2BgYAorCitJZiBuZWNlc3NhcnksIHlvdSBjYW4gY29udGludWUgdG8gZGVyaXZlIHRlc3QgZml4dHVyZXMgZnJvbSBhIGRlcml2ZWQgZml4dHVyZS4KK0dvb2dsZSBUZXN0IGhhcyBubyBsaW1pdCBvbiBob3cgZGVlcCB0aGUgaGllcmFyY2h5IGNhbiBiZS4KKworRm9yIGEgY29tcGxldGUgZXhhbXBsZSB1c2luZyBkZXJpdmVkIHRlc3QgZml4dHVyZXMsIHNlZQorW3NhbXBsZTVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjKS4KKworIyMgTXkgY29tcGlsZXIgY29tcGxhaW5zICJ2b2lkIHZhbHVlIG5vdCBpZ25vcmVkIGFzIGl0IG91Z2h0IHRvIGJlLiIgV2hhdCBkb2VzIHRoaXMgbWVhbj8gIyMKKworWW91J3JlIHByb2JhYmx5IHVzaW5nIGFuIGBBU1NFUlRfKigpYCBpbiBhIGZ1bmN0aW9uIHRoYXQgZG9lc24ndCByZXR1cm4gYHZvaWRgLgorYEFTU0VSVF8qKClgIGNhbiBvbmx5IGJlIHVzZWQgaW4gYHZvaWRgIGZ1bmN0aW9ucy4KKworIyMgTXkgZGVhdGggdGVzdCBoYW5ncyAob3Igc2VnLWZhdWx0cykuIEhvdyBkbyBJIGZpeCBpdD8gIyMKKworSW4gR29vZ2xlIFRlc3QsIGRlYXRoIHRlc3RzIGFyZSBydW4gaW4gYSBjaGlsZCBwcm9jZXNzIGFuZCB0aGUgd2F5IHRoZXkgd29yayBpcworZGVsaWNhdGUuIFRvIHdyaXRlIGRlYXRoIHRlc3RzIHlvdSByZWFsbHkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGV5IHdvcmsuCitQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIHJlYWQgdGhpcy4KKworSW4gcGFydGljdWxhciwgZGVhdGggdGVzdHMgZG9uJ3QgbGlrZSBoYXZpbmcgbXVsdGlwbGUgdGhyZWFkcyBpbiB0aGUgcGFyZW50Citwcm9jZXNzLiBTbyB0aGUgZmlyc3QgdGhpbmcgeW91IGNhbiB0cnkgaXMgdG8gZWxpbWluYXRlIGNyZWF0aW5nIHRocmVhZHMKK291dHNpZGUgb2YgYEVYUEVDVF9ERUFUSCgpYC4KKworU29tZXRpbWVzIHRoaXMgaXMgaW1wb3NzaWJsZSBhcyBzb21lIGxpYnJhcnkgeW91IG11c3QgdXNlIG1heSBiZSBjcmVhdGluZwordGhyZWFkcyBiZWZvcmUgYG1haW4oKWAgaXMgZXZlbiByZWFjaGVkLiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gdHJ5IHRvIG1pbmltaXplCit0aGUgY2hhbmNlIG9mIGNvbmZsaWN0cyBieSBlaXRoZXIgbW92aW5nIGFzIG1hbnkgYWN0aXZpdGllcyBhcyBwb3NzaWJsZSBpbnNpZGUKK2BFWFBFQ1RfREVBVEgoKWAgKGluIHRoZSBleHRyZW1lIGNhc2UsIHlvdSB3YW50IHRvIG1vdmUgZXZlcnl0aGluZyBpbnNpZGUpLCBvcgorbGVhdmluZyBhcyBmZXcgdGhpbmdzIGFzIHBvc3NpYmxlIGluIGl0LiBBbHNvLCB5b3UgY2FuIHRyeSB0byBzZXQgdGhlIGRlYXRoCit0ZXN0IHN0eWxlIHRvIGAidGhyZWFkc2FmZSJgLCB3aGljaCBpcyBzYWZlciBidXQgc2xvd2VyLCBhbmQgc2VlIGlmIGl0IGhlbHBzLgorCitJZiB5b3UgZ28gd2l0aCB0aHJlYWQtc2FmZSBkZWF0aCB0ZXN0cywgcmVtZW1iZXIgdGhhdCB0aGV5IHJlcnVuIHRoZSB0ZXN0Citwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZyBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gVGhlcmVmb3JlIG1ha2Ugc3VyZSB5b3VyCitwcm9ncmFtIGNhbiBydW4gc2lkZS1ieS1zaWRlIHdpdGggaXRzZWxmIGFuZCBpcyBkZXRlcm1pbmlzdGljLgorCitJbiB0aGUgZW5kLCB0aGlzIGJvaWxzIGRvd24gdG8gZ29vZCBjb25jdXJyZW50IHByb2dyYW1taW5nLiBZb3UgaGF2ZSB0byBtYWtlCitzdXJlIHRoYXQgdGhlcmUgaXMgbm8gcmFjZSBjb25kaXRpb25zIG9yIGRlYWQgbG9ja3MgaW4geW91ciBwcm9ncmFtLiBObyBzaWx2ZXIKK2J1bGxldCAtIHNvcnJ5IQorCisjIyBTaG91bGQgSSB1c2UgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igb2YgdGhlIHRlc3QgZml4dHVyZSBvciB0aGUgc2V0LXVwL3RlYXItZG93biBmdW5jdGlvbj8gIyMKKworVGhlIGZpcnN0IHRoaW5nIHRvIHJlbWVtYmVyIGlzIHRoYXQgR29vZ2xlIFRlc3QgZG9lcyBub3QgcmV1c2UgdGhlCitzYW1lIHRlc3QgZml4dHVyZSBvYmplY3QgYWNyb3NzIG11bHRpcGxlIHRlc3RzLiBGb3IgZWFjaCBgVEVTVF9GYCwKK0dvb2dsZSBUZXN0IHdpbGwgY3JlYXRlIGEgZnJlc2ggdGVzdCBmaXh0dXJlIG9iamVjdCwgX2ltbWVkaWF0ZWx5XworY2FsbCBgU2V0VXAoKWAsIHJ1biB0aGUgdGVzdCwgY2FsbCBgVGVhckRvd24oKWAsIGFuZCB0aGVuCitfaW1tZWRpYXRlbHlfIGRlbGV0ZSB0aGUgdGVzdCBmaXh0dXJlIG9iamVjdC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubworbmVlZCB0byB3cml0ZSBhIGBTZXRVcCgpYCBvciBgVGVhckRvd24oKWAgZnVuY3Rpb24gaWYgdGhlIGNvbnN0cnVjdG9yCitvciBkZXN0cnVjdG9yIGFscmVhZHkgZG9lcyB0aGUgam9iLgorCitZb3UgbWF5IHN0aWxsIHdhbnQgdG8gdXNlIGBTZXRVcCgpL1RlYXJEb3duKClgIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisgICogSWYgdGhlIHRlYXItZG93biBvcGVyYXRpb24gY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uLCB5b3UgbXVzdCB1c2UgYFRlYXJEb3duKClgIGFzIG9wcG9zZWQgdG8gdGhlIGRlc3RydWN0b3IsIGFzIHRocm93aW5nIGluIGEgZGVzdHJ1Y3RvciBsZWFkcyB0byB1bmRlZmluZWQgYmVoYXZpb3IgYW5kIHVzdWFsbHkgd2lsbCBraWxsIHlvdXIgcHJvZ3JhbSByaWdodCBhd2F5LiBOb3RlIHRoYXQgbWFueSBzdGFuZGFyZCBsaWJyYXJpZXMgKGxpa2UgU1RMKSBtYXkgdGhyb3cgd2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkIGluIHRoZSBjb21waWxlci4gVGhlcmVmb3JlIHlvdSBzaG91bGQgcHJlZmVyIGBUZWFyRG93bigpYCBpZiB5b3Ugd2FudCB0byB3cml0ZSBwb3J0YWJsZSB0ZXN0cyB0aGF0IHdvcmsgd2l0aCBvciB3aXRob3V0IGV4Y2VwdGlvbnMuCisgICogVGhlIEdvb2dsZSBUZXN0IHRlYW0gaXMgY29uc2lkZXJpbmcgbWFraW5nIHRoZSBhc3NlcnRpb24gbWFjcm9zIHRocm93IG9uIHBsYXRmb3JtcyB3aGVyZSBleGNlcHRpb25zIGFyZSBlbmFibGVkIChlLmcuIFdpbmRvd3MsIE1hYyBPUywgYW5kIExpbnV4IGNsaWVudC1zaWRlKSwgd2hpY2ggd2lsbCBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHRoZSB1c2VyIHRvIHByb3BhZ2F0ZSBmYWlsdXJlcyBmcm9tIGEgc3Vicm91dGluZSB0byBpdHMgY2FsbGVyLiBUaGVyZWZvcmUsIHlvdSBzaG91bGRuJ3QgdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4gYSBkZXN0cnVjdG9yIGlmIHlvdXIgY29kZSBjb3VsZCBydW4gb24gc3VjaCBhIHBsYXRmb3JtLgorICAqIEluIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciwgeW91IGNhbm5vdCBtYWtlIGEgdmlydHVhbCBmdW5jdGlvbiBjYWxsIG9uIHRoaXMgb2JqZWN0LiAoWW91IGNhbiBjYWxsIGEgbWV0aG9kIGRlY2xhcmVkIGFzIHZpcnR1YWwsIGJ1dCBpdCB3aWxsIGJlIHN0YXRpY2FsbHkgYm91bmQuKSBUaGVyZWZvcmUsIGlmIHlvdSBuZWVkIHRvIGNhbGwgYSBtZXRob2QgdGhhdCB3aWxsIGJlIG92ZXJyaWRlbiBpbiBhIGRlcml2ZWQgY2xhc3MsIHlvdSBoYXZlIHRvIHVzZSBgU2V0VXAoKS9UZWFyRG93bigpYC4KKworIyMgVGhlIGNvbXBpbGVyIGNvbXBsYWlucyAibm8gbWF0Y2hpbmcgZnVuY3Rpb24gdG8gY2FsbCIgd2hlbiBJIHVzZSBBU1NFUlRcX1BSRURuLiBIb3cgZG8gSSBmaXggaXQ/ICMjCisKK0lmIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24geW91IHVzZSBpbiBgQVNTRVJUX1BSRUQqYCBvciBgRVhQRUNUX1BSRUQqYCBpcworb3ZlcmxvYWRlZCBvciBhIHRlbXBsYXRlLCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRyb3VibGUgZmlndXJpbmcgb3V0IHdoaWNoCitvdmVybG9hZGVkIHZlcnNpb24gaXQgc2hvdWxkIHVzZS4gYEFTU0VSVF9QUkVEX0ZPUk1BVCpgIGFuZAorYEVYUEVDVF9QUkVEX0ZPUk1BVCpgIGRvbid0IGhhdmUgdGhpcyBwcm9ibGVtLgorCitJZiB5b3Ugc2VlIHRoaXMgZXJyb3IsIHlvdSBtaWdodCB3YW50IHRvIHN3aXRjaCB0bworYChBU1NFUlR8RVhQRUNUKV9QUkVEX0ZPUk1BVCpgLCB3aGljaCB3aWxsIGFsc28gZ2l2ZSB5b3UgYSBiZXR0ZXIgZmFpbHVyZQorbWVzc2FnZS4gSWYsIGhvd2V2ZXIsIHRoYXQgaXMgbm90IGFuIG9wdGlvbiwgeW91IGNhbiByZXNvbHZlIHRoZSBwcm9ibGVtIGJ5CitleHBsaWNpdGx5IHRlbGxpbmcgdGhlIGNvbXBpbGVyIHdoaWNoIHZlcnNpb24gdG8gcGljay4KKworRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUKKworYGBgCitib29sIElzUG9zaXRpdmUoaW50IG4pIHsKKyAgcmV0dXJuIG4gPiAwOworfQorYm9vbCBJc1Bvc2l0aXZlKGRvdWJsZSB4KSB7CisgIHJldHVybiB4ID4gMDsKK30KK2BgYAorCit5b3Ugd2lsbCBnZXQgYSBjb21waWxlciBlcnJvciBpZiB5b3Ugd3JpdGUKKworYGBgCitFWFBFQ1RfUFJFRDEoSXNQb3NpdGl2ZSwgNSk7CitgYGAKKworSG93ZXZlciwgdGhpcyB3aWxsIHdvcms6CisKK2BgYAorRVhQRUNUX1BSRUQxKCpzdGF0aWNfY2FzdDxib29sICgqKShpbnQpPiooSXNQb3NpdGl2ZSksIDUpOworYGBgCisKKyhUaGUgc3R1ZmYgaW5zaWRlIHRoZSBhbmdsZWQgYnJhY2tldHMgZm9yIHRoZSBgc3RhdGljX2Nhc3RgIG9wZXJhdG9yIGlzIHRoZQordHlwZSBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlciBmb3IgdGhlIGBpbnRgLXZlcnNpb24gb2YgYElzUG9zaXRpdmUoKWAuKQorCitBcyBhbm90aGVyIGV4YW1wbGUsIHdoZW4geW91IGhhdmUgYSB0ZW1wbGF0ZSBmdW5jdGlvbgorCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBJc05lZ2F0aXZlKFQgeCkgeworICByZXR1cm4geCA8IDA7Cit9CitgYGAKKworeW91IGNhbiB1c2UgaXQgaW4gYSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGxpa2UgdGhpczoKKworYGBgCitBU1NFUlRfUFJFRDEoSXNOZWdhdGl2ZSo8aW50PiosIC01KTsKK2BgYAorCitUaGluZ3MgYXJlIG1vcmUgaW50ZXJlc3RpbmcgaWYgeW91ciB0ZW1wbGF0ZSBoYXMgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXJzLiBUaGUKK2ZvbGxvd2luZyB3b24ndCBjb21waWxlOgorCitgYGAKK0FTU0VSVF9QUkVEMigqR3JlYXRlclRoYW48aW50LCBpbnQ+KiwgNSwgMCk7CitgYGAKKworCithcyB0aGUgQysrIHByZS1wcm9jZXNzb3IgdGhpbmtzIHlvdSBhcmUgZ2l2aW5nIGBBU1NFUlRfUFJFRDJgIDQgYXJndW1lbnRzLAord2hpY2ggaXMgb25lIG1vcmUgdGhhbiBleHBlY3RlZC4gVGhlIHdvcmthcm91bmQgaXMgdG8gd3JhcCB0aGUgcHJlZGljYXRlCitmdW5jdGlvbiBpbiBwYXJlbnRoZXNlczoKKworYGBgCitBU1NFUlRfUFJFRDIoKihHcmVhdGVyVGhhbjxpbnQsIGludD4pKiwgNSwgMCk7CitgYGAKKworCisjIyBNeSBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgImlnbm9yaW5nIHJldHVybiB2YWx1ZSIgd2hlbiBJIGNhbGwgUlVOXF9BTExcX1RFU1RTKCkuIFdoeT8gIyMKKworU29tZSBwZW9wbGUgaGFkIGJlZW4gaWdub3JpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgUlVOX0FMTF9URVNUUygpYC4gVGhhdCBpcywKK2luc3RlYWQgb2YKKworYGBgCityZXR1cm4gUlVOX0FMTF9URVNUUygpOworYGBgCisKK3RoZXkgd3JpdGUKKworYGBgCitSVU5fQUxMX1RFU1RTKCk7CitgYGAKKworVGhpcyBpcyB3cm9uZyBhbmQgZGFuZ2Vyb3VzLiBBIHRlc3QgcnVubmVyIG5lZWRzIHRvIHNlZSB0aGUgcmV0dXJuIHZhbHVlIG9mCitgUlVOX0FMTF9URVNUUygpYCBpbiBvcmRlciB0byBkZXRlcm1pbmUgaWYgYSB0ZXN0IGhhcyBwYXNzZWQuIElmIHlvdXIgYG1haW4oKWAKK2Z1bmN0aW9uIGlnbm9yZXMgaXQsIHlvdXIgdGVzdCB3aWxsIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bCBldmVuIGlmIGl0IGhhcyBhCitHb29nbGUgVGVzdCBhc3NlcnRpb24gZmFpbHVyZS4gVmVyeSBiYWQuCisKK1RvIGhlbHAgdGhlIHVzZXJzIGF2b2lkIHRoaXMgZGFuZ2Vyb3VzIGJ1ZywgdGhlIGltcGxlbWVudGF0aW9uIG9mCitgUlVOX0FMTF9URVNUUygpYCBjYXVzZXMgZ2NjIHRvIHJhaXNlIHRoaXMgd2FybmluZywgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzCitpZ25vcmVkLiBJZiB5b3Ugc2VlIHRoaXMgd2FybmluZywgdGhlIGZpeCBpcyBzaW1wbGU6IGp1c3QgbWFrZSBzdXJlIGl0cyB2YWx1ZQoraXMgdXNlZCBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBtYWluKClgLgorCisjIyBNeSBjb21waWxlciBjb21wbGFpbnMgdGhhdCBhIGNvbnN0cnVjdG9yIChvciBkZXN0cnVjdG9yKSBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuIFdoYXQncyBnb2luZyBvbj8gIyMKKworRHVlIHRvIGEgcGVjdWxpYXJpdHkgb2YgQysrLCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSBzeW50YXggZm9yIHN0cmVhbWluZworbWVzc2FnZXMgdG8gYW4gYEFTU0VSVF8qYCwgZS5nLgorCitgYGAKK0FTU0VSVF9FUSgxLCBGb28oKSkgPDwgImJsYWggYmxhaCIgPDwgZm9vOworYGBgCisKK3dlIGhhZCB0byBnaXZlIHVwIHVzaW5nIGBBU1NFUlQqYCBhbmQgYEZBSUwqYCAoYnV0IG5vdCBgRVhQRUNUKmAgYW5kCitgQUREX0ZBSUxVUkUqYCkgaW4gY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4gVGhlIHdvcmthcm91bmQgaXMgdG8gbW92ZSB0aGUKK2NvbnRlbnQgb2YgeW91ciBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRvIGEgcHJpdmF0ZSB2b2lkIG1lbWJlciBmdW5jdGlvbiwgb3IKK3N3aXRjaCB0byBgRVhQRUNUXyooKWAgaWYgdGhhdCB3b3Jrcy4gVGhpcyBzZWN0aW9uIGluIHRoZSB1c2VyJ3MgZ3VpZGUgZXhwbGFpbnMKK2l0LgorCisjIyBNeSBzZXQtdXAgZnVuY3Rpb24gaXMgbm90IGNhbGxlZC4gV2h5PyAjIworCitDKysgaXMgY2FzZS1zZW5zaXRpdmUuIEl0IHNob3VsZCBiZSBzcGVsbGVkIGFzIGBTZXRVcCgpYC4gIERpZCB5b3UKK3NwZWxsIGl0IGFzIGBTZXR1cCgpYD8KKworU2ltaWxhcmx5LCBzb21ldGltZXMgcGVvcGxlIHNwZWxsIGBTZXRVcFRlc3RDYXNlKClgIGFzIGBTZXR1cFRlc3RDYXNlKClgIGFuZAord29uZGVyIHdoeSBpdCdzIG5ldmVyIGNhbGxlZC4KKworIyMgSG93IGRvIEkganVtcCB0byB0aGUgbGluZSBvZiBhIGZhaWx1cmUgaW4gRW1hY3MgZGlyZWN0bHk/ICMjCisKK0dvb2dsZSBUZXN0J3MgZmFpbHVyZSBtZXNzYWdlIGZvcm1hdCBpcyB1bmRlcnN0b29kIGJ5IEVtYWNzIGFuZCBtYW55IG90aGVyCitJREVzLCBsaWtlIGFjbWUgYW5kIFhDb2RlLiBJZiBhIEdvb2dsZSBUZXN0IG1lc3NhZ2UgaXMgaW4gYSBjb21waWxhdGlvbiBidWZmZXIKK2luIEVtYWNzLCB0aGVuIGl0J3MgY2xpY2thYmxlLiBZb3UgY2FuIG5vdyBoaXQgYGVudGVyYCBvbiBhIG1lc3NhZ2UgdG8ganVtcCB0bwordGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIG9yIHVzZSBgQy14IGBgIHRvIGp1bXAgdG8gdGhlIG5leHQgZmFpbHVyZS4KKworIyMgSSBoYXZlIHNldmVyYWwgdGVzdCBjYXNlcyB3aGljaCBzaGFyZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUgbG9naWMsIGRvIEkgaGF2ZSB0byBkZWZpbmUgYSBuZXcgdGVzdCBmaXh0dXJlIGNsYXNzIGZvciBlYWNoIG9mIHRoZW0/IFRoaXMgc2VlbXMgcHJldHR5IHRlZGlvdXMuICMjCisKK1lvdSBkb24ndCBoYXZlIHRvLiBJbnN0ZWFkIG9mCisKK2BgYAorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCB7fTsKKworVEVTVF9GKEZvb1Rlc3QsIEFiYykgeyAuLi4gfQorVEVTVF9GKEZvb1Rlc3QsIERlZikgeyAuLi4gfQorCitjbGFzcyBCYXJUZXN0IDogcHVibGljIEJhc2VUZXN0IHt9OworCitURVNUX0YoQmFyVGVzdCwgQWJjKSB7IC4uLiB9CitURVNUX0YoQmFyVGVzdCwgRGVmKSB7IC4uLiB9CitgYGAKKworeW91IGNhbiBzaW1wbHkgYHR5cGVkZWZgIHRoZSB0ZXN0IGZpeHR1cmVzOgorYGBgCit0eXBlZGVmIEJhc2VUZXN0IEZvb1Rlc3Q7CisKK1RFU1RfRihGb29UZXN0LCBBYmMpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBEZWYpIHsgLi4uIH0KKwordHlwZWRlZiBCYXNlVGVzdCBCYXJUZXN0OworCitURVNUX0YoQmFyVGVzdCwgQWJjKSB7IC4uLiB9CitURVNUX0YoQmFyVGVzdCwgRGVmKSB7IC4uLiB9CitgYGAKKworIyMgVGhlIEdvb2dsZSBUZXN0IG91dHB1dCBpcyBidXJpZWQgaW4gYSB3aG9sZSBidW5jaCBvZiBsb2cgbWVzc2FnZXMuIFdoYXQgZG8gSSBkbz8gIyMKKworVGhlIEdvb2dsZSBUZXN0IG91dHB1dCBpcyBtZWFudCB0byBiZSBhIGNvbmNpc2UgYW5kIGh1bWFuLWZyaWVuZGx5IHJlcG9ydC4gSWYKK3lvdXIgdGVzdCBnZW5lcmF0ZXMgdGV4dHVhbCBvdXRwdXQgaXRzZWxmLCBpdCB3aWxsIG1peCB3aXRoIHRoZSBHb29nbGUgVGVzdAorb3V0cHV0LCBtYWtpbmcgaXQgaGFyZCB0byByZWFkLiBIb3dldmVyLCB0aGVyZSBpcyBhbiBlYXN5IHNvbHV0aW9uIHRvIHRoaXMKK3Byb2JsZW0uCisKK1NpbmNlIG1vc3QgbG9nIG1lc3NhZ2VzIGdvIHRvIHN0ZGVyciwgd2UgZGVjaWRlZCB0byBsZXQgR29vZ2xlIFRlc3Qgb3V0cHV0IGdvCit0byBzdGRvdXQuIFRoaXMgd2F5LCB5b3UgY2FuIGVhc2lseSBzZXBhcmF0ZSB0aGUgdHdvIHVzaW5nIHJlZGlyZWN0aW9uLiBGb3IKK2V4YW1wbGU6CitgYGAKKy4vbXlfdGVzdCA+IGdvb2dsZXRlc3Rfb3V0cHV0LnR4dAorYGBgCisKKyMjIFdoeSBzaG91bGQgSSBwcmVmZXIgdGVzdCBmaXh0dXJlcyBvdmVyIGdsb2JhbCB2YXJpYWJsZXM/ICMjCisKK1RoZXJlIGFyZSBzZXZlcmFsIGdvb2QgcmVhc29uczoKKyAgMS4gSXQncyBsaWtlbHkgeW91ciB0ZXN0IG5lZWRzIHRvIGNoYW5nZSB0aGUgc3RhdGVzIG9mIGl0cyBnbG9iYWwgdmFyaWFibGVzLiBUaGlzIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBrZWVwIHNpZGUgZWZmZWN0cyBmcm9tIGVzY2FwaW5nIG9uZSB0ZXN0IGFuZCBjb250YW1pbmF0aW5nIG90aGVycywgbWFraW5nIGRlYnVnZ2luZyBkaWZmaWN1bHQuIEJ5IHVzaW5nIGZpeHR1cmVzLCBlYWNoIHRlc3QgaGFzIGEgZnJlc2ggc2V0IG9mIHZhcmlhYmxlcyB0aGF0J3MgZGlmZmVyZW50IChidXQgd2l0aCB0aGUgc2FtZSBuYW1lcykuIFRodXMsIHRlc3RzIGFyZSBrZXB0IGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuCisgIDEuIEdsb2JhbCB2YXJpYWJsZXMgcG9sbHV0ZSB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKyAgMS4gVGVzdCBmaXh0dXJlcyBjYW4gYmUgcmV1c2VkIHZpYSBzdWJjbGFzc2luZywgd2hpY2ggY2Fubm90IGJlIGRvbmUgZWFzaWx5IHdpdGggZ2xvYmFsIHZhcmlhYmxlcy4gVGhpcyBpcyB1c2VmdWwgaWYgbWFueSB0ZXN0IGNhc2VzIGhhdmUgc29tZXRoaW5nIGluIGNvbW1vbi4KKworIyMgSG93IGRvIEkgdGVzdCBwcml2YXRlIGNsYXNzIG1lbWJlcnMgd2l0aG91dCB3cml0aW5nIEZSSUVORFxfVEVTVCgpcz8gIyMKKworWW91IHNob3VsZCB0cnkgdG8gd3JpdGUgdGVzdGFibGUgY29kZSwgd2hpY2ggbWVhbnMgY2xhc3NlcyBzaG91bGQgYmUgZWFzaWx5Cit0ZXN0ZWQgZnJvbSB0aGVpciBwdWJsaWMgaW50ZXJmYWNlLiBPbmUgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0aGUgUGltcGwgaWRpb206Cit5b3UgbW92ZSBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3MgaW50byBhIGhlbHBlciBjbGFzcywgYW5kIG1ha2UgYWxsCittZW1iZXJzIG9mIHRoZSBoZWxwZXIgY2xhc3MgcHVibGljLgorCitZb3UgaGF2ZSBzZXZlcmFsIG90aGVyIG9wdGlvbnMgdGhhdCBkb24ndCByZXF1aXJlIHVzaW5nIGBGUklFTkRfVEVTVGA6CisgICogV3JpdGUgdGhlIHRlc3RzIGFzIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3M6CitgYGAKK2NsYXNzIEZvbyB7CisgIGZyaWVuZCBjbGFzcyBGb29UZXN0OworICAuLi4KK307CisKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC4uLgorICB2b2lkIFRlc3QxKCkgey4uLn0gLy8gVGhpcyBhY2Nlc3NlcyBwcml2YXRlIG1lbWJlcnMgb2YgY2xhc3MgRm9vLgorICB2b2lkIFRlc3QyKCkgey4uLn0gLy8gU28gZG9lcyB0aGlzIG9uZS4KK307CisKK1RFU1RfRihGb29UZXN0LCBUZXN0MSkgeworICBUZXN0MSgpOworfQorCitURVNUX0YoRm9vVGVzdCwgVGVzdDIpIHsKKyAgVGVzdDIoKTsKK30KK2BgYAorICAqIEluIHRoZSBmaXh0dXJlIGNsYXNzLCB3cml0ZSBhY2Nlc3NvcnMgZm9yIHRoZSB0ZXN0ZWQgY2xhc3MnIHByaXZhdGUgbWVtYmVycywgdGhlbiB1c2UgdGhlIGFjY2Vzc29ycyBpbiB5b3VyIHRlc3RzOgorYGBgCitjbGFzcyBGb28geworICBmcmllbmQgY2xhc3MgRm9vVGVzdDsKKyAgLi4uCit9OworCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAuLi4KKyAgVDEgZ2V0X3ByaXZhdGVfbWVtYmVyMShGb28qIG9iaikgeworICAgIHJldHVybiBvYmotPnByaXZhdGVfbWVtYmVyMV87CisgIH0KK307CisKK1RFU1RfRihGb29UZXN0LCBUZXN0MSkgeworICAuLi4KKyAgZ2V0X3ByaXZhdGVfbWVtYmVyMSh4KQorICAuLi4KK30KK2BgYAorICAqIElmIHRoZSBtZXRob2RzIGFyZSBkZWNsYXJlZCAqKnByb3RlY3RlZCoqLCB5b3UgY2FuIGNoYW5nZSB0aGVpciBhY2Nlc3MgbGV2ZWwgaW4gYSB0ZXN0LW9ubHkgc3ViY2xhc3M6CitgYGAKK2NsYXNzIFlvdXJDbGFzcyB7CisgIC4uLgorIHByb3RlY3RlZDogLy8gcHJvdGVjdGVkIGFjY2VzcyBmb3IgdGVzdGFiaWxpdHkuCisgIGludCBEb1NvbWV0aGluZ1JldHVybmluZ0ludCgpOworICAuLi4KK307CisKKy8vIGluIHRoZSB5b3VyX2NsYXNzX3Rlc3QuY2MgZmlsZToKK2NsYXNzIFRlc3RhYmxlWW91ckNsYXNzIDogcHVibGljIFlvdXJDbGFzcyB7CisgIC4uLgorIHB1YmxpYzogdXNpbmcgWW91ckNsYXNzOjpEb1NvbWV0aGluZ1JldHVybmluZ0ludDsgLy8gY2hhbmdlcyBhY2Nlc3MgcmlnaHRzCisgIC4uLgorfTsKKworVEVTVF9GKFlvdXJDbGFzc1Rlc3QsIERvU29tZXRoaW5nVGVzdCkgeworICBUZXN0YWJsZVlvdXJDbGFzcyBvYmo7CisgIGFzc2VydEVxdWFscyhleHBlY3RlZF92YWx1ZSwgb2JqLkRvU29tZXRoaW5nUmV0dXJuaW5nSW50KCkpOworfQorYGBgCisKKyMjIEhvdyBkbyBJIHRlc3QgcHJpdmF0ZSBjbGFzcyBzdGF0aWMgbWVtYmVycyB3aXRob3V0IHdyaXRpbmcgRlJJRU5EXF9URVNUKClzPyAjIworCitXZSBmaW5kIHByaXZhdGUgc3RhdGljIG1ldGhvZHMgY2x1dHRlciB0aGUgaGVhZGVyIGZpbGUuICBUaGV5IGFyZQoraW1wbGVtZW50YXRpb24gZGV0YWlscyBhbmQgaWRlYWxseSBzaG91bGQgYmUga2VwdCBvdXQgb2YgYSAuaC4gU28gb2Z0ZW4gSSBtYWtlCit0aGVtIGZyZWUgZnVuY3Rpb25zIGluc3RlYWQuCisKK0luc3RlYWQgb2Y6CitgYGAKKy8vIGZvby5oCitjbGFzcyBGb28geworICAuLi4KKyBwcml2YXRlOgorICBzdGF0aWMgYm9vbCBGdW5jKGludCBuKTsKK307CisKKy8vIGZvby5jYworYm9vbCBGb286OkZ1bmMoaW50IG4pIHsgLi4uIH0KKworLy8gZm9vX3Rlc3QuY2MKK0VYUEVDVF9UUlVFKEZvbzo6RnVuYygxMjM0NSkpOworYGBgCisKK1lvdSBwcm9iYWJseSBzaG91bGQgYmV0dGVyIHdyaXRlOgorYGBgCisvLyBmb28uaAorY2xhc3MgRm9vIHsKKyAgLi4uCit9OworCisvLyBmb28uY2MKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIGJvb2wgRnVuYyhpbnQgbikgeyAuLi4gfQorfQorCisvLyBmb29fdGVzdC5jYworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgYm9vbCBGdW5jKGludCBuKTsKK30KKworRVhQRUNUX1RSVUUoaW50ZXJuYWw6OkZ1bmMoMTIzNDUpKTsKK2BgYAorCisjIyBJIHdvdWxkIGxpa2UgdG8gcnVuIGEgdGVzdCBzZXZlcmFsIHRpbWVzIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMuIERvIEkgbmVlZCB0byB3cml0ZSBzZXZlcmFsIHNpbWlsYXIgY29waWVzIG9mIGl0PyAjIworCitOby4gWW91IGNhbiB1c2UgYSBmZWF0dXJlIGNhbGxlZCBbdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0c10oVjFfNl9BZHZhbmNlZEd1aWRlI1ZhbHVlX1BhcmFtZXRlcml6ZWRfVGVzdHMubWQpIHdoaWNoCitsZXRzIHlvdSByZXBlYXQgeW91ciB0ZXN0cyB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLCB3aXRob3V0IGRlZmluaW5nIGl0IG1vcmUgdGhhbiBvbmNlLgorCisjIyBIb3cgZG8gSSB0ZXN0IGEgZmlsZSB0aGF0IGRlZmluZXMgbWFpbigpPyAjIworCitUbyB0ZXN0IGEgYGZvby5jY2AgZmlsZSwgeW91IG5lZWQgdG8gY29tcGlsZSBhbmQgbGluayBpdCBpbnRvIHlvdXIgdW5pdCB0ZXN0Citwcm9ncmFtLiBIb3dldmVyLCB3aGVuIHRoZSBmaWxlIGNvbnRhaW5zIGEgZGVmaW5pdGlvbiBmb3IgdGhlIGBtYWluKClgCitmdW5jdGlvbiwgaXQgd2lsbCBjbGFzaCB3aXRoIHRoZSBgbWFpbigpYCBvZiB5b3VyIHVuaXQgdGVzdCwgYW5kIHdpbGwgcmVzdWx0IGluCithIGJ1aWxkIGVycm9yLgorCitUaGUgcmlnaHQgc29sdXRpb24gaXMgdG8gc3BsaXQgaXQgaW50byB0aHJlZSBmaWxlczoKKyAgMS4gYGZvby5oYCB3aGljaCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zLAorICAxLiBgZm9vLmNjYCB3aGljaCBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZXhjZXB0IGBtYWluKClgLCBhbmQKKyAgMS4gYGZvb19tYWluLmNjYCB3aGljaCBjb250YWlucyBub3RoaW5nIGJ1dCB0aGUgZGVmaW5pdGlvbiBvZiBgbWFpbigpYC4KKworVGhlbiBgZm9vLmNjYCBjYW4gYmUgZWFzaWx5IHRlc3RlZC4KKworSWYgeW91IGFyZSBhZGRpbmcgdGVzdHMgdG8gYW4gZXhpc3RpbmcgZmlsZSBhbmQgZG9uJ3Qgd2FudCBhbiBpbnRydXNpdmUgY2hhbmdlCitsaWtlIHRoaXMsIHRoZXJlIGlzIGEgaGFjazoganVzdCBpbmNsdWRlIHRoZSBlbnRpcmUgYGZvby5jY2AgZmlsZSBpbiB5b3VyIHVuaXQKK3Rlc3QuIEZvciBleGFtcGxlOgorYGBgCisvLyBGaWxlIGZvb191bml0dGVzdC5jYworCisvLyBUaGUgaGVhZGVycyBzZWN0aW9uCisuLi4KKworLy8gUmVuYW1lcyBtYWluKCkgaW4gZm9vLmNjIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHVuaXQgdGVzdCBtYWluKCkKKyNkZWZpbmUgbWFpbiBGb29NYWluCisKKyNpbmNsdWRlICJhL2IvZm9vLmNjIgorCisvLyBUaGUgdGVzdHMgc3RhcnQgaGVyZS4KKy4uLgorYGBgCisKKworSG93ZXZlciwgcGxlYXNlIHJlbWVtYmVyIHRoaXMgaXMgYSBoYWNrIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGFzIHRoZSBsYXN0CityZXNvcnQuCisKKyMjIFdoYXQgY2FuIHRoZSBzdGF0ZW1lbnQgYXJndW1lbnQgaW4gQVNTRVJUXF9ERUFUSCgpIGJlPyAjIworCitgQVNTRVJUX0RFQVRIKF9zdGF0ZW1lbnRfLCBfcmVnZXhfKWAgKG9yIGFueSBkZWF0aCBhc3NlcnRpb24gbWFjcm8pIGNhbiBiZSB1c2VkCit3aGVyZXZlciBgX3N0YXRlbWVudF9gIGlzIHZhbGlkLiBTbyBiYXNpY2FsbHkgYF9zdGF0ZW1lbnRfYCBjYW4gYmUgYW55IEMrKworc3RhdGVtZW50IHRoYXQgbWFrZXMgc2Vuc2UgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gSW4gcGFydGljdWxhciwgaXQgY2FuCityZWZlcmVuY2UgZ2xvYmFsIGFuZC9vciBsb2NhbCB2YXJpYWJsZXMsIGFuZCBjYW4gYmU6CisgICogYSBzaW1wbGUgZnVuY3Rpb24gY2FsbCAob2Z0ZW4gdGhlIGNhc2UpLAorICAqIGEgY29tcGxleCBleHByZXNzaW9uLCBvcgorICAqIGEgY29tcG91bmQgc3RhdGVtZW50LgorCis+IFNvbWUgZXhhbXBsZXMgYXJlIHNob3duIGhlcmU6CitgYGAKKy8vIEEgZGVhdGggdGVzdCBjYW4gYmUgYSBzaW1wbGUgZnVuY3Rpb24gY2FsbC4KK1RFU1QoTXlEZWF0aFRlc3QsIEZ1bmN0aW9uQ2FsbCkgeworICBBU1NFUlRfREVBVEgoWHl6KDUpLCAiWHl6IGZhaWxlZCIpOworfQorCisvLyBPciBhIGNvbXBsZXggZXhwcmVzc2lvbiB0aGF0IHJlZmVyZW5jZXMgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMuCitURVNUKE15RGVhdGhUZXN0LCBDb21wbGV4RXhwcmVzc2lvbikgeworICBjb25zdCBib29sIGMgPSBDb25kaXRpb24oKTsKKyAgQVNTRVJUX0RFQVRIKChjID8gRnVuYzEoMCkgOiBvYmplY3QyLk1ldGhvZCgidGVzdCIpKSwKKyAgICAgICAgICAgICAgICIoRnVuYzF8TWV0aG9kKSBmYWlsZWQiKTsKK30KKworLy8gRGVhdGggYXNzZXJ0aW9ucyBjYW4gYmUgdXNlZCBhbnkgd2hlcmUgaW4gYSBmdW5jdGlvbi4gSW4KKy8vIHBhcnRpY3VsYXIsIHRoZXkgY2FuIGJlIGluc2lkZSBhIGxvb3AuCitURVNUKE15RGVhdGhUZXN0LCBJbnNpZGVMb29wKSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgRm9vKDApLCBGb28oMSksIC4uLiwgYW5kIEZvbyg0KSBhbGwgZGllLgorICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgIEVYUEVDVF9ERUFUSF9NKEZvbyhpKSwgIkZvbyBoYXMgXFxkKyBlcnJvcnMiLAorICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJ3aGVyZSBpIGlzICIgPDwgaSk7CisgIH0KK30KKworLy8gQSBkZWF0aCBhc3NlcnRpb24gY2FuIGNvbnRhaW4gYSBjb21wb3VuZCBzdGF0ZW1lbnQuCitURVNUKE15RGVhdGhUZXN0LCBDb21wb3VuZFN0YXRlbWVudCkgeworICAvLyBWZXJpZmllcyB0aGF0IGF0IGxlYXNlIG9uZSBvZiBCYXIoMCksIEJhcigxKSwgLi4uLCBhbmQKKyAgLy8gQmFyKDQpIGRpZXMuCisgIEFTU0VSVF9ERUFUSCh7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgIEJhcihpKTsKKyAgICB9CisgIH0sCisgICJCYXIgaGFzIFxcZCsgZXJyb3JzIik7fQorYGBgCisKK2Bnb29nbGV0ZXN0X3VuaXR0ZXN0LmNjYCBjb250YWlucyBtb3JlIGV4YW1wbGVzIGlmIHlvdSBhcmUgaW50ZXJlc3RlZC4KKworIyMgV2hhdCBzeW50YXggZG9lcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGluIEFTU0VSVFxfREVBVEggdXNlPyAjIworCitPbiBQT1NJWCBzeXN0ZW1zLCBHb29nbGUgVGVzdCB1c2VzIHRoZSBQT1NJWCBFeHRlbmRlZCByZWd1bGFyCitleHByZXNzaW9uIHN5bnRheAorKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uI1BPU0lYX0V4dGVuZGVkX1JlZ3VsYXJfRXhwcmVzc2lvbnMpLgorT24gV2luZG93cywgaXQgdXNlcyBhIGxpbWl0ZWQgdmFyaWFudCBvZiByZWd1bGFyIGV4cHJlc3Npb24KK3N5bnRheC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZQorW3JlZ3VsYXIgZXhwcmVzc2lvbiBzeW50YXhdKFYxXzZfQWR2YW5jZWRHdWlkZSNSZWd1bGFyX0V4cHJlc3Npb25fU3ludGF4Lm1kKS4KKworIyMgSSBoYXZlIGEgZml4dHVyZSBjbGFzcyBGb28sIGJ1dCBURVNUXF9GKEZvbywgQmFyKSBnaXZlcyBtZSBlcnJvciAibm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGNhbGwgdG8gRm9vOjpGb28oKSIuIFdoeT8gIyMKKworR29vZ2xlIFRlc3QgbmVlZHMgdG8gYmUgYWJsZSB0byBjcmVhdGUgb2JqZWN0cyBvZiB5b3VyIHRlc3QgZml4dHVyZSBjbGFzcywgc28KK2l0IG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuIE5vcm1hbGx5IHRoZSBjb21waWxlciB3aWxsIGRlZmluZSBvbmUgZm9yCit5b3UuIEhvd2V2ZXIsIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB5b3UgaGF2ZSB0byBkZWZpbmUgeW91ciBvd246CisgICogSWYgeW91IGV4cGxpY2l0bHkgZGVjbGFyZSBhIG5vbi1kZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBjbGFzcyBgRm9vYCwgdGhlbiB5b3UgbmVlZCB0byBkZWZpbmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBldmVuIGlmIGl0IHdvdWxkIGJlIGVtcHR5LgorICAqIElmIGBGb29gIGhhcyBhIGNvbnN0IG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIsIHRoZW4geW91IGhhdmUgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIF9hbmRfIGluaXRpYWxpemUgdGhlIGNvbnN0IG1lbWJlciBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiB0aGUgY29uc3RydWN0b3IuIChFYXJseSB2ZXJzaW9ucyBvZiBgZ2NjYCBkb2Vzbid0IGZvcmNlIHlvdSB0byBpbml0aWFsaXplIHRoZSBjb25zdCBtZW1iZXIuIEl0J3MgYSBidWcgdGhhdCBoYXMgYmVlbiBmaXhlZCBpbiBgZ2NjIDRgLikKKworIyMgV2h5IGRvZXMgQVNTRVJUXF9ERUFUSCBjb21wbGFpbiBhYm91dCBwcmV2aW91cyB0aHJlYWRzIHRoYXQgd2VyZSBhbHJlYWR5IGpvaW5lZD8gIyMKKworV2l0aCB0aGUgTGludXggcHRocmVhZCBsaWJyYXJ5LCB0aGVyZSBpcyBubyB0dXJuaW5nIGJhY2sgb25jZSB5b3UgY3Jvc3MgdGhlCitsaW5lIGZyb20gc2luZ2xlIHRocmVhZCB0byBtdWx0aXBsZSB0aHJlYWRzLiBUaGUgZmlyc3QgdGltZSB5b3UgY3JlYXRlIGEKK3RocmVhZCwgYSBtYW5hZ2VyIHRocmVhZCBpcyBjcmVhdGVkIGluIGFkZGl0aW9uLCBzbyB5b3UgZ2V0IDMsIG5vdCAyLCB0aHJlYWRzLgorTGF0ZXIgd2hlbiB0aGUgdGhyZWFkIHlvdSBjcmVhdGUgam9pbnMgdGhlIG1haW4gdGhyZWFkLCB0aGUgdGhyZWFkIGNvdW50CitkZWNyZW1lbnRzIGJ5IDEsIGJ1dCB0aGUgbWFuYWdlciB0aHJlYWQgd2lsbCBuZXZlciBiZSBraWxsZWQsIHNvIHlvdSBzdGlsbCBoYXZlCisyIHRocmVhZHMsIHdoaWNoIG1lYW5zIHlvdSBjYW5ub3Qgc2FmZWx5IHJ1biBhIGRlYXRoIHRlc3QuCisKK1RoZSBuZXcgTlBUTCB0aHJlYWQgbGlicmFyeSBkb2Vzbid0IHN1ZmZlciBmcm9tIHRoaXMgcHJvYmxlbSwgYXMgaXQgZG9lc24ndAorY3JlYXRlIGEgbWFuYWdlciB0aHJlYWQuIEhvd2V2ZXIsIGlmIHlvdSBkb24ndCBjb250cm9sIHdoaWNoIG1hY2hpbmUgeW91ciB0ZXN0CitydW5zIG9uLCB5b3Ugc2hvdWxkbid0IGRlcGVuZCBvbiB0aGlzLgorCisjIyBXaHkgZG9lcyBHb29nbGUgVGVzdCByZXF1aXJlIHRoZSBlbnRpcmUgdGVzdCBjYXNlLCBpbnN0ZWFkIG9mIGluZGl2aWR1YWwgdGVzdHMsIHRvIGJlIG5hbWVkIEZPT0RlYXRoVGVzdCB3aGVuIGl0IHVzZXMgQVNTRVJUXF9ERUFUSD8gIyMKKworR29vZ2xlIFRlc3QgZG9lcyBub3QgaW50ZXJsZWF2ZSB0ZXN0cyBmcm9tIGRpZmZlcmVudCB0ZXN0IGNhc2VzLiBUaGF0IGlzLCBpdAorcnVucyBhbGwgdGVzdHMgaW4gb25lIHRlc3QgY2FzZSBmaXJzdCwgYW5kIHRoZW4gcnVucyBhbGwgdGVzdHMgaW4gdGhlIG5leHQgdGVzdAorY2FzZSwgYW5kIHNvIG9uLiBHb29nbGUgVGVzdCBkb2VzIHRoaXMgYmVjYXVzZSBpdCBuZWVkcyB0byBzZXQgdXAgYSB0ZXN0IGNhc2UKK2JlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiBpdCBpcyBydW4sIGFuZCB0ZWFyIGl0IGRvd24gYWZ0ZXJ3b3Jkcy4gU3BsaXR0aW5nIHVwCit0aGUgdGVzdCBjYXNlIHdvdWxkIHJlcXVpcmUgbXVsdGlwbGUgc2V0LXVwIGFuZCB0ZWFyLWRvd24gcHJvY2Vzc2VzLCB3aGljaCBpcworaW5lZmZpY2llbnQgYW5kIG1ha2VzIHRoZSBzZW1hbnRpY3MgdW5jbGVhbi4KKworSWYgd2Ugd2VyZSB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIHRlc3RzIGJhc2VkIG9uIHRlc3QgbmFtZSBpbnN0ZWFkIG9mIHRlc3QKK2Nhc2UgbmFtZSwgdGhlbiB3ZSB3b3VsZCBoYXZlIGEgcHJvYmxlbSB3aXRoIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uOgorCitgYGAKK1RFU1RfRihGb29UZXN0LCBBYmNEZWF0aFRlc3QpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBVdncpIHsgLi4uIH0KKworVEVTVF9GKEJhclRlc3QsIERlZkRlYXRoVGVzdCkgeyAuLi4gfQorVEVTVF9GKEJhclRlc3QsIFh5eikgeyAuLi4gfQorYGBgCisKK1NpbmNlIGBGb29UZXN0LkFiY0RlYXRoVGVzdGAgbmVlZHMgdG8gcnVuIGJlZm9yZSBgQmFyVGVzdC5YeXpgLCBhbmQgd2UgZG9uJ3QKK2ludGVybGVhdmUgdGVzdHMgZnJvbSBkaWZmZXJlbnQgdGVzdCBjYXNlcywgd2UgbmVlZCB0byBydW4gYWxsIHRlc3RzIGluIHRoZQorYEZvb1Rlc3RgIGNhc2UgYmVmb3JlIHJ1bm5pbmcgYW55IHRlc3QgaW4gdGhlIGBCYXJUZXN0YCBjYXNlLiBUaGlzIGNvbnRyYWRpY3RzCit3aXRoIHRoZSByZXF1aXJlbWVudCB0byBydW4gYEJhclRlc3QuRGVmRGVhdGhUZXN0YCBiZWZvcmUgYEZvb1Rlc3QuVXZ3YC4KKworIyMgQnV0IEkgZG9uJ3QgbGlrZSBjYWxsaW5nIG15IGVudGlyZSB0ZXN0IGNhc2UgRk9PRGVhdGhUZXN0IHdoZW4gaXQgY29udGFpbnMgYm90aCBkZWF0aCB0ZXN0cyBhbmQgbm9uLWRlYXRoIHRlc3RzLiBXaGF0IGRvIEkgZG8/ICMjCisKK1lvdSBkb24ndCBoYXZlIHRvLCBidXQgaWYgeW91IGxpa2UsIHlvdSBtYXkgc3BsaXQgdXAgdGhlIHRlc3QgY2FzZSBpbnRvCitgRm9vVGVzdGAgYW5kIGBGb29EZWF0aFRlc3RgLCB3aGVyZSB0aGUgbmFtZXMgbWFrZSBpdCBjbGVhciB0aGF0IHRoZXkgYXJlCityZWxhdGVkOgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsgLi4uIH07CisKK1RFU1RfRihGb29UZXN0LCBBYmMpIHsgLi4uIH0KK1RFU1RfRihGb29UZXN0LCBEZWYpIHsgLi4uIH0KKwordHlwZWRlZiBGb29UZXN0IEZvb0RlYXRoVGVzdDsKKworVEVTVF9GKEZvb0RlYXRoVGVzdCwgVXZ3KSB7IC4uLiBFWFBFQ1RfREVBVEgoLi4uKSAuLi4gfQorVEVTVF9GKEZvb0RlYXRoVGVzdCwgWHl6KSB7IC4uLiBBU1NFUlRfREVBVEgoLi4uKSAuLi4gfQorYGBgCisKKyMjIFRoZSBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgIm5vIG1hdGNoIGZvciAnb3BlcmF0b3I8PCciIHdoZW4gSSB1c2UgYW4gYXNzZXJ0aW9uLiBXaGF0IGdpdmVzPyAjIworCitJZiB5b3UgdXNlIGEgdXNlci1kZWZpbmVkIHR5cGUgYEZvb1R5cGVgIGluIGFuIGFzc2VydGlvbiwgeW91IG11c3QgbWFrZSBzdXJlCit0aGVyZSBpcyBhbiBgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IEZvb1R5cGUmKWAgZnVuY3Rpb24KK2RlZmluZWQgc3VjaCB0aGF0IHdlIGNhbiBwcmludCBhIHZhbHVlIG9mIGBGb29UeXBlYC4KKworSW4gYWRkaXRpb24sIGlmIGBGb29UeXBlYCBpcyBkZWNsYXJlZCBpbiBhIG5hbWUgc3BhY2UsIHRoZSBgPDxgIG9wZXJhdG9yIGFsc28KK25lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIF9zYW1lXyBuYW1lIHNwYWNlLgorCisjIyBIb3cgZG8gSSBzdXBwcmVzcyB0aGUgbWVtb3J5IGxlYWsgbWVzc2FnZXMgb24gV2luZG93cz8gIyMKKworU2luY2UgdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgR29vZ2xlIFRlc3Qgc2luZ2xldG9uIHJlcXVpcmVzIGFsbG9jYXRpb25zIG9uCit0aGUgaGVhcCwgdGhlIFZpc3VhbCBDKysgbWVtb3J5IGxlYWsgZGV0ZWN0b3Igd2lsbCByZXBvcnQgbWVtb3J5IGxlYWtzIGF0IHRoZQorZW5kIG9mIHRoZSBwcm9ncmFtIHJ1bi4gVGhlIGVhc2llc3Qgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gdXNlIHRoZQorYF9DcnRNZW1DaGVja3BvaW50YCBhbmQgYF9DcnRNZW1EdW1wQWxsT2JqZWN0c1NpbmNlYCBjYWxscyB0byBub3QgcmVwb3J0IGFueQorc3RhdGljYWxseSBpbml0aWFsaXplZCBoZWFwIG9iamVjdHMuIFNlZSBNU0ROIGZvciBtb3JlIGRldGFpbHMgYW5kIGFkZGl0aW9uYWwKK2hlYXAgY2hlY2svZGVidWcgcm91dGluZXMuCisKKyMjIEkgYW0gYnVpbGRpbmcgbXkgcHJvamVjdCB3aXRoIEdvb2dsZSBUZXN0IGluIFZpc3VhbCBTdHVkaW8gYW5kIGFsbCBJJ20gZ2V0dGluZyBpcyBhIGJ1bmNoIG9mIGxpbmtlciBlcnJvcnMgKG9yIHdhcm5pbmdzKS4gSGVscCEgIyMKKworWW91IG1heSBnZXQgYSBudW1iZXIgb2YgdGhlIGZvbGxvd2luZyBsaW5rZXIgZXJyb3Igb3Igd2FybmluZ3MgaWYgeW91CithdHRlbXB0IHRvIGxpbmsgeW91ciB0ZXN0IHByb2plY3Qgd2l0aCB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSB3aGVuCit5b3VyIHByb2plY3QgYW5kIHRoZSBhcmUgbm90IGJ1aWx0IHVzaW5nIHRoZSBzYW1lIGNvbXBpbGVyIHNldHRpbmdzLgorCisgICogTE5LMjAwNTogc3ltYm9sIGFscmVhZHkgZGVmaW5lZCBpbiBvYmplY3QKKyAgKiBMTks0MjE3OiBsb2NhbGx5IGRlZmluZWQgc3ltYm9sICdzeW1ib2wnIGltcG9ydGVkIGluIGZ1bmN0aW9uICdmdW5jdGlvbicKKyAgKiBMTks0MDQ5OiBsb2NhbGx5IGRlZmluZWQgc3ltYm9sICdzeW1ib2wnIGltcG9ydGVkCisKK1RoZSBHb29nbGUgVGVzdCBwcm9qZWN0IChndGVzdC52Y3Byb2opIGhhcyB0aGUgUnVudGltZSBMaWJyYXJ5IG9wdGlvbgorc2V0IHRvIC9NVCAodXNlIG11bHRpLXRocmVhZGVkIHN0YXRpYyBsaWJyYXJpZXMsIC9NVGQgZm9yIGRlYnVnKS4gSWYKK3lvdXIgcHJvamVjdCB1c2VzIHNvbWV0aGluZyBlbHNlLCBmb3IgZXhhbXBsZSAvTUQgKHVzZSBtdWx0aS10aHJlYWRlZAorRExMcywgL01EZCBmb3IgZGVidWcpLCB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIHNldHRpbmcgaW4gdGhlIEdvb2dsZQorVGVzdCBwcm9qZWN0IHRvIG1hdGNoIHlvdXIgcHJvamVjdCdzLgorCitUbyB1cGRhdGUgdGhpcyBzZXR0aW5nIG9wZW4gdGhlIHByb2plY3QgcHJvcGVydGllcyBpbiB0aGUgVmlzdWFsCitTdHVkaW8gSURFIHRoZW4gc2VsZWN0IHRoZSBicmFuY2ggQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIHwgQy9DKysgfAorQ29kZSBHZW5lcmF0aW9uIGFuZCBjaGFuZ2UgdGhlIG9wdGlvbiAiUnVudGltZSBMaWJyYXJ5Ii4gIFlvdSBtYXkgYWxzbyB0cnkKK3VzaW5nIGd0ZXN0LW1kLnZjcHJvaiBpbnN0ZWFkIG9mIGd0ZXN0LnZjcHJvai4KKworIyMgSSBwdXQgbXkgdGVzdHMgaW4gYSBsaWJyYXJ5IGFuZCBHb29nbGUgVGVzdCBkb2Vzbid0IHJ1biB0aGVtLiBXaGF0J3MgaGFwcGVuaW5nPyAjIworSGF2ZSB5b3UgcmVhZCBhCitbd2FybmluZ10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV82X1ByaW1lciNJbXBvcnRhbnRfbm90ZV9mb3JfVmlzdWFsX0MrK191c2Vycykgb24KK3RoZSBHb29nbGUgVGVzdCBQcmltZXIgcGFnZT8KKworIyMgSSB3YW50IHRvIHVzZSBHb29nbGUgVGVzdCB3aXRoIFZpc3VhbCBTdHVkaW8gYnV0IGRvbid0IGtub3cgd2hlcmUgdG8gc3RhcnQuICMjCitNYW55IHBlb3BsZSBhcmUgaW4geW91ciBwb3NpdGlvbiBhbmQgb25lIG9mIHRoZSBwb3N0ZWQgaGlzIHNvbHV0aW9uIHRvCitvdXIgbWFpbGluZyBsaXN0LiBIZXJlIGlzIGhpcyBsaW5rOgoraHR0cDovL2hhc3NhbmphbWlsYWhtYWQuYmxvZ3Nwb3QuY29tLzIwMDkvMDcvZ3Rlc3Qtc3RhcnRlcnMtaGVscC5odG1sLgorCisjIyBJIGFtIHNlZWluZyBjb21waWxlIGVycm9ycyBtZW50aW9uaW5nIHN0ZDo6dHlwZVxfdHJhaXRzIHdoZW4gSSB0cnkgdG8gdXNlIEdvb2dsZSBUZXN0IG9uIFNvbGFyaXMuICMjCitHb29nbGUgVGVzdCB1c2VzIHBhcnRzIG9mIHRoZSBzdGFuZGFyZCBDKysgbGlicmFyeSB0aGF0IFN1blN0dWRpbyBkb2VzIG5vdCBzdXBwb3J0LgorT3VyIHVzZXJzIHJlcG9ydGVkIHN1Y2Nlc3MgdXNpbmcgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zLiBUcnkgcnVubmluZyB0aGUgYnVpbGQgYWZ0ZXIgcnVuaW5nIHRoaXMgY29tbWFkOgorCitgZXhwb3J0IENDPWNjIENYWD1DQyBDWFhGTEFHUz0nLWxpYnJhcnk9c3RscG9ydDQnYAorCisjIyBIb3cgY2FuIG15IGNvZGUgZGV0ZWN0IGlmIGl0IGlzIHJ1bm5pbmcgaW4gYSB0ZXN0PyAjIworCitJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IHNuaWZmcyB3aGV0aGVyIGl0J3MgcnVubmluZyBpbiBhIHRlc3QgYW5kIGRvZXMKK2RpZmZlcmVudCB0aGluZ3MgYWNjb3JkaW5nbHksIHlvdSBhcmUgbGVha2luZyB0ZXN0LW9ubHkgbG9naWMgaW50bworcHJvZHVjdGlvbiBjb2RlIGFuZCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBlbnN1cmUgdGhhdCB0aGUgdGVzdC1vbmx5Citjb2RlIHBhdGhzIGFyZW4ndCBydW4gYnkgbWlzdGFrZSBpbiBwcm9kdWN0aW9uLiAgU3VjaCBjbGV2ZXJuZXNzIGFsc28KK2xlYWRzIHRvCitbSGVpc2VuYnVnc10oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VbnVzdWFsX3NvZnR3YXJlX2J1ZyNIZWlzZW5idWcpLgorVGhlcmVmb3JlIHdlIHN0cm9uZ2x5IGFkdmlzZSBhZ2FpbnN0IHRoZSBwcmFjdGljZSwgYW5kIEdvb2dsZSBUZXN0IGRvZXNuJ3QKK3Byb3ZpZGUgYSB3YXkgdG8gZG8gaXQuCisKK0luIGdlbmVyYWwsIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gY2F1c2UgdGhlIGNvZGUgdG8gYmVoYXZlCitkaWZmZXJlbnRseSB1bmRlciB0ZXN0IGlzIFtkZXBlbmRlbmN5IGluamVjdGlvbl0oaHR0cDovL2phbWVzc2hvcmUuY29tL0Jsb2cvRGVwZW5kZW5jeS1JbmplY3Rpb24tRGVteXN0aWZpZWQuaHRtbCkuCitZb3UgY2FuIGluamVjdCBkaWZmZXJlbnQgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSB0ZXN0IGFuZCBmcm9tIHRoZQorcHJvZHVjdGlvbiBjb2RlLiAgU2luY2UgeW91ciBwcm9kdWN0aW9uIGNvZGUgZG9lc24ndCBsaW5rIGluIHRoZQorZm9yLXRlc3QgbG9naWMgYXQgYWxsLCB0aGVyZSBpcyBubyBkYW5nZXIgaW4gYWNjaWRlbnRhbGx5IHJ1bm5pbmcgaXQuCisKK0hvd2V2ZXIsIGlmIHlvdSBfcmVhbGx5XywgX3JlYWxseV8sIF9yZWFsbHlfIGhhdmUgbm8gY2hvaWNlLCBhbmQgaWYKK3lvdSBmb2xsb3cgdGhlIHJ1bGUgb2YgZW5kaW5nIHlvdXIgdGVzdCBwcm9ncmFtIG5hbWVzIHdpdGggYF90ZXN0YCwKK3lvdSBjYW4gdXNlIHRoZSBfaG9ycmlibGVfIGhhY2sgb2Ygc25pZmZpbmcgeW91ciBleGVjdXRhYmxlIG5hbWUKKyhgYXJndlswXWAgaW4gYG1haW4oKWApIHRvIGtub3cgd2hldGhlciB0aGUgY29kZSBpcyB1bmRlciB0ZXN0LgorCisjIyBHb29nbGUgVGVzdCBkZWZpbmVzIGEgbWFjcm8gdGhhdCBjbGFzaGVzIHdpdGggb25lIGRlZmluZWQgYnkgYW5vdGhlciBsaWJyYXJ5LiBIb3cgZG8gSSBkZWFsIHdpdGggdGhhdD8gIyMKKworSW4gQysrLCBtYWNyb3MgZG9uJ3Qgb2JleSBuYW1lc3BhY2VzLiAgVGhlcmVmb3JlIHR3byBsaWJyYXJpZXMgdGhhdAorYm90aCBkZWZpbmUgYSBtYWNybyBvZiB0aGUgc2FtZSBuYW1lIHdpbGwgY2xhc2ggaWYgeW91ICNpbmNsdWRlIGJvdGgKK2RlZmluaXRpb25zLiAgSW4gY2FzZSBhIEdvb2dsZSBUZXN0IG1hY3JvIGNsYXNoZXMgd2l0aCBhbm90aGVyCitsaWJyYXJ5LCB5b3UgY2FuIGZvcmNlIEdvb2dsZSBUZXN0IHRvIHJlbmFtZSBpdHMgbWFjcm8gdG8gYXZvaWQgdGhlCitjb25mbGljdC4KKworU3BlY2lmaWNhbGx5LCBpZiBib3RoIEdvb2dsZSBUZXN0IGFuZCBzb21lIG90aGVyIGNvZGUgZGVmaW5lIG1hY3JvCitgRk9PYCwgeW91IGNhbiBhZGQKK2BgYAorICAtREdURVNUX0RPTlRfREVGSU5FX0ZPTz0xCitgYGAKK3RvIHRoZSBjb21waWxlciBmbGFncyB0byB0ZWxsIEdvb2dsZSBUZXN0IHRvIGNoYW5nZSB0aGUgbWFjcm8ncyBuYW1lCitmcm9tIGBGT09gIHRvIGBHVEVTVF9GT09gLiBGb3IgZXhhbXBsZSwgd2l0aCBgLURHVEVTVF9ET05UX0RFRklORV9URVNUPTFgLCB5b3UnbGwgbmVlZCB0byB3cml0ZQorYGBgCisgIEdURVNUX1RFU1QoU29tZVRlc3QsIERvZXNUaGlzKSB7IC4uLiB9CitgYGAKK2luc3RlYWQgb2YKK2BgYAorICBURVNUKFNvbWVUZXN0LCBEb2VzVGhpcykgeyAuLi4gfQorYGBgCitpbiBvcmRlciB0byBkZWZpbmUgYSB0ZXN0LgorCitDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgYFRFU1RgLCBgRkFJTGAsIGBTVUNDRUVEYCwgYW5kIHRoZSBiYXNpYyBjb21wYXJpc29uIGFzc2VydGlvbiBtYWNyb3MgY2FuIGhhdmUgYWx0ZXJuYXRpdmUgbmFtZXMuIFlvdSBjYW4gc2VlIHRoZSBmdWxsIGxpc3Qgb2YgY292ZXJlZCBtYWNyb3MgW2hlcmVdKGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jb2Rlc2VhcmNoP3E9aWYrIUdURVNUX0RPTlRfREVGSU5FX1x3JTJCK3BhY2thZ2U6aHR0cDovL2dvb2dsZXRlc3RcLmdvb2dsZWNvZGVcLmNvbStmaWxlOi9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgpLiBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgIkF2b2lkaW5nIE1hY3JvIE5hbWUgQ2xhc2hlcyIgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGZpbGUuCisKKyMjIE15IHF1ZXN0aW9uIGlzIG5vdCBjb3ZlcmVkIGluIHlvdXIgRkFRISAjIworCitJZiB5b3UgY2Fubm90IGZpbmQgdGhlIGFuc3dlciB0byB5b3VyIHF1ZXN0aW9uIGluIHRoaXMgRkFRLCB0aGVyZSBhcmUKK3NvbWUgb3RoZXIgcmVzb3VyY2VzIHlvdSBjYW4gdXNlOgorCisgIDEuIHJlYWQgb3RoZXIgW3dpa2kgcGFnZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3cvbGlzdCksCisgIDEuIHNlYXJjaCB0aGUgbWFpbGluZyBsaXN0IFthcmNoaXZlXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xldGVzdGZyYW1ld29yay90b3BpY3MpLAorICAxLiBhc2sgaXQgb24gW2dvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbV0obWFpbHRvOmdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSkgYW5kIHNvbWVvbmUgd2lsbCBhbnN3ZXIgaXQgKHRvIHByZXZlbnQgc3BhbSwgd2UgcmVxdWlyZSB5b3UgdG8gam9pbiB0aGUgW2Rpc2N1c3Npb24gZ3JvdXBdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGV0ZXN0ZnJhbWV3b3JrKSBiZWZvcmUgeW91IGNhbiBwb3N0LikuCisKK1BsZWFzZSBub3RlIHRoYXQgY3JlYXRpbmcgYW4gaXNzdWUgaW4gdGhlCitbaXNzdWUgdHJhY2tlcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvaXNzdWVzL2xpc3QpIGlzIF9ub3RfCithIGdvb2Qgd2F5IHRvIGdldCB5b3VyIGFuc3dlciwgYXMgaXQgaXMgbW9uaXRvcmVkIGluZnJlcXVlbnRseSBieSBhCit2ZXJ5IHNtYWxsIG51bWJlciBvZiBwZW9wbGUuCisKK1doZW4gYXNraW5nIGEgcXVlc3Rpb24sIGl0J3MgaGVscGZ1bCB0byBwcm92aWRlIGFzIG11Y2ggb2YgdGhlCitmb2xsb3dpbmcgaW5mb3JtYXRpb24gYXMgcG9zc2libGUgKHBlb3BsZSBjYW5ub3QgaGVscCB5b3UgaWYgdGhlcmUncworbm90IGVub3VnaCBpbmZvcm1hdGlvbiBpbiB5b3VyIHF1ZXN0aW9uKToKKworICAqIHRoZSB2ZXJzaW9uIChvciB0aGUgcmV2aXNpb24gbnVtYmVyIGlmIHlvdSBjaGVjayBvdXQgZnJvbSBTVk4gZGlyZWN0bHkpIG9mIEdvb2dsZSBUZXN0IHlvdSB1c2UgKEdvb2dsZSBUZXN0IGlzIHVuZGVyIGFjdGl2ZSBkZXZlbG9wbWVudCwgc28gaXQncyBwb3NzaWJsZSB0aGF0IHlvdXIgcHJvYmxlbSBoYXMgYmVlbiBzb2x2ZWQgaW4gYSBsYXRlciB2ZXJzaW9uKSwKKyAgKiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0sCisgICogdGhlIG5hbWUgYW5kIHZlcnNpb24gb2YgeW91ciBjb21waWxlciwKKyAgKiB0aGUgY29tcGxldGUgY29tbWFuZCBsaW5lIGZsYWdzIHlvdSBnaXZlIHRvIHlvdXIgY29tcGlsZXIsCisgICogdGhlIGNvbXBsZXRlIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2VzIChpZiB0aGUgcXVlc3Rpb24gaXMgYWJvdXQgY29tcGlsYXRpb24pLAorICAqIHRoZSBfYWN0dWFsXyBjb2RlIChpZGVhbGx5LCBhIG1pbmltYWwgYnV0IGNvbXBsZXRlIHByb2dyYW0pIHRoYXQgaGFzIHRoZSBwcm9ibGVtIHlvdSBlbmNvdW50ZXIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNl9QcmltZXIubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV82X1ByaW1lci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzUxYTIxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNl9QcmltZXIubWQKQEAgLTAsMCArMSw1MDEgQEAKKworCisjIEludHJvZHVjdGlvbjogV2h5IEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcms/ICMKKworX0dvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmtfIGhlbHBzIHlvdSB3cml0ZSBiZXR0ZXIgQysrIHRlc3RzLgorCitObyBtYXR0ZXIgd2hldGhlciB5b3Ugd29yayBvbiBMaW51eCwgV2luZG93cywgb3IgYSBNYWMsIGlmIHlvdSB3cml0ZSBDKysgY29kZSwKK0dvb2dsZSBUZXN0IGNhbiBoZWxwIHlvdS4KKworU28gd2hhdCBtYWtlcyBhIGdvb2QgdGVzdCwgYW5kIGhvdyBkb2VzIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgZml0IGluPyBXZSBiZWxpZXZlOgorICAxLiBUZXN0cyBzaG91bGQgYmUgX2luZGVwZW5kZW50XyBhbmQgX3JlcGVhdGFibGVfLiBJdCdzIGEgcGFpbiB0byBkZWJ1ZyBhIHRlc3QgdGhhdCBzdWNjZWVkcyBvciBmYWlscyBhcyBhIHJlc3VsdCBvZiBvdGhlciB0ZXN0cy4gIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgaXNvbGF0ZXMgdGhlIHRlc3RzIGJ5IHJ1bm5pbmcgZWFjaCBvZiB0aGVtIG9uIGEgZGlmZmVyZW50IG9iamVjdC4gV2hlbiBhIHRlc3QgZmFpbHMsIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgYWxsb3dzIHlvdSB0byBydW4gaXQgaW4gaXNvbGF0aW9uIGZvciBxdWljayBkZWJ1Z2dpbmcuCisgIDEuIFRlc3RzIHNob3VsZCBiZSB3ZWxsIF9vcmdhbml6ZWRfIGFuZCByZWZsZWN0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHRlc3RlZCBjb2RlLiAgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBncm91cHMgcmVsYXRlZCB0ZXN0cyBpbnRvIHRlc3QgY2FzZXMgdGhhdCBjYW4gc2hhcmUgZGF0YSBhbmQgc3Vicm91dGluZXMuIFRoaXMgY29tbW9uIHBhdHRlcm4gaXMgZWFzeSB0byByZWNvZ25pemUgYW5kIG1ha2VzIHRlc3RzIGVhc3kgdG8gbWFpbnRhaW4uIFN1Y2ggY29uc2lzdGVuY3kgaXMgZXNwZWNpYWxseSBoZWxwZnVsIHdoZW4gcGVvcGxlIHN3aXRjaCBwcm9qZWN0cyBhbmQgc3RhcnQgdG8gd29yayBvbiBhIG5ldyBjb2RlIGJhc2UuCisgIDEuIFRlc3RzIHNob3VsZCBiZSBfcG9ydGFibGVfIGFuZCBfcmV1c2FibGVfLiBUaGUgb3Blbi1zb3VyY2UgY29tbXVuaXR5IGhhcyBhIGxvdCBvZiBjb2RlIHRoYXQgaXMgcGxhdGZvcm0tbmV1dHJhbCwgaXRzIHRlc3RzIHNob3VsZCBhbHNvIGJlIHBsYXRmb3JtLW5ldXRyYWwuICBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIHdvcmtzIG9uIGRpZmZlcmVudCBPU2VzLCB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMgKGdjYywgTVNWQywgYW5kIG90aGVycyksIHdpdGggb3Igd2l0aG91dCBleGNlcHRpb25zLCBzbyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIHRlc3RzIGNhbiBlYXNpbHkgd29yayB3aXRoIGEgdmFyaWV0eSBvZiBjb25maWd1cmF0aW9ucy4gIChOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcmVsZWFzZSBvbmx5IGNvbnRhaW5zIGJ1aWxkIHNjcmlwdHMgZm9yIExpbnV4IC0gd2UgYXJlIGFjdGl2ZWx5IHdvcmtpbmcgb24gc2NyaXB0cyBmb3Igb3RoZXIgcGxhdGZvcm1zLikKKyAgMS4gV2hlbiB0ZXN0cyBmYWlsLCB0aGV5IHNob3VsZCBwcm92aWRlIGFzIG11Y2ggX2luZm9ybWF0aW9uXyBhYm91dCB0aGUgcHJvYmxlbSBhcyBwb3NzaWJsZS4gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBkb2Vzbid0IHN0b3AgYXQgdGhlIGZpcnN0IHRlc3QgZmFpbHVyZS4gSW5zdGVhZCwgaXQgb25seSBzdG9wcyB0aGUgY3VycmVudCB0ZXN0IGFuZCBjb250aW51ZXMgd2l0aCB0aGUgbmV4dC4gWW91IGNhbiBhbHNvIHNldCB1cCB0ZXN0cyB0aGF0IHJlcG9ydCBub24tZmF0YWwgZmFpbHVyZXMgYWZ0ZXIgd2hpY2ggdGhlIGN1cnJlbnQgdGVzdCBjb250aW51ZXMuIFRodXMsIHlvdSBjYW4gZGV0ZWN0IGFuZCBmaXggbXVsdGlwbGUgYnVncyBpbiBhIHNpbmdsZSBydW4tZWRpdC1jb21waWxlIGN5Y2xlLgorICAxLiBUaGUgdGVzdGluZyBmcmFtZXdvcmsgc2hvdWxkIGxpYmVyYXRlIHRlc3Qgd3JpdGVycyBmcm9tIGhvdXNla2VlcGluZyBjaG9yZXMgYW5kIGxldCB0aGVtIGZvY3VzIG9uIHRoZSB0ZXN0IF9jb250ZW50Xy4gIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgYXV0b21hdGljYWxseSBrZWVwcyB0cmFjayBvZiBhbGwgdGVzdHMgZGVmaW5lZCwgYW5kIGRvZXNuJ3QgcmVxdWlyZSB0aGUgdXNlciB0byBlbnVtZXJhdGUgdGhlbSBpbiBvcmRlciB0byBydW4gdGhlbS4KKyAgMS4gVGVzdHMgc2hvdWxkIGJlIF9mYXN0Xy4gV2l0aCBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLCB5b3UgY2FuIHJldXNlIHNoYXJlZCByZXNvdXJjZXMgYWNyb3NzIHRlc3RzIGFuZCBwYXkgZm9yIHRoZSBzZXQtdXAvdGVhci1kb3duIG9ubHkgb25jZSwgd2l0aG91dCBtYWtpbmcgdGVzdHMgZGVwZW5kIG9uIGVhY2ggb3RoZXIuCisKK1NpbmNlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgaXMgYmFzZWQgb24gdGhlIHBvcHVsYXIgeFVuaXQKK2FyY2hpdGVjdHVyZSwgeW91J2xsIGZlZWwgcmlnaHQgYXQgaG9tZSBpZiB5b3UndmUgdXNlZCBKVW5pdCBvciBQeVVuaXQgYmVmb3JlLgorSWYgbm90LCBpdCB3aWxsIHRha2UgeW91IGFib3V0IDEwIG1pbnV0ZXMgdG8gbGVhcm4gdGhlIGJhc2ljcyBhbmQgZ2V0IHN0YXJ0ZWQuCitTbyBsZXQncyBnbyEKKworX05vdGU6XyBXZSBzb21ldGltZXMgcmVmZXIgdG8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBpbmZvcm1hbGx5CithcyBfR29vZ2xlIFRlc3RfLgorCisjIFNldHRpbmcgdXAgYSBOZXcgVGVzdCBQcm9qZWN0ICMKKworVG8gd3JpdGUgYSB0ZXN0IHByb2dyYW0gdXNpbmcgR29vZ2xlIFRlc3QsIHlvdSBuZWVkIHRvIGNvbXBpbGUgR29vZ2xlCitUZXN0IGludG8gYSBsaWJyYXJ5IGFuZCBsaW5rIHlvdXIgdGVzdCB3aXRoIGl0LiAgV2UgcHJvdmlkZSBidWlsZAorZmlsZXMgZm9yIHNvbWUgcG9wdWxhciBidWlsZCBzeXN0ZW1zOiBgbXN2Yy9gIGZvciBWaXN1YWwgU3R1ZGlvLAorYHhjb2RlL2AgZm9yIE1hYyBYY29kZSwgYG1ha2UvYCBmb3IgR05VIG1ha2UsIGBjb2RlZ2Vhci9gIGZvciBCb3JsYW5kCitDKysgQnVpbGRlciwgYW5kIHRoZSBhdXRvdG9vbHMgc2NyaXB0IChkZXByZWNhdGVkKSBhbmQKK2BDTWFrZUxpc3RzLnR4dGAgZm9yIENNYWtlIChyZWNvbW1lbmRlZCkgaW4gdGhlIEdvb2dsZSBUZXN0IHJvb3QKK2RpcmVjdG9yeS4gIElmIHlvdXIgYnVpbGQgc3lzdGVtIGlzIG5vdCBvbiB0aGlzIGxpc3QsIHlvdSBjYW4gdGFrZSBhCitsb29rIGF0IGBtYWtlL01ha2VmaWxlYCB0byBsZWFybiBob3cgR29vZ2xlIFRlc3Qgc2hvdWxkIGJlIGNvbXBpbGVkCisoYmFzaWNhbGx5IHlvdSB3YW50IHRvIGNvbXBpbGUgYHNyYy9ndGVzdC1hbGwuY2NgIHdpdGggYEdURVNUX1JPT1RgCithbmQgYEdURVNUX1JPT1QvaW5jbHVkZWAgaW4gdGhlIGhlYWRlciBzZWFyY2ggcGF0aCwgd2hlcmUgYEdURVNUX1JPT1RgCitpcyB0aGUgR29vZ2xlIFRlc3Qgcm9vdCBkaXJlY3RvcnkpLgorCitPbmNlIHlvdSBhcmUgYWJsZSB0byBjb21waWxlIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5LCB5b3Ugc2hvdWxkCitjcmVhdGUgYSBwcm9qZWN0IG9yIGJ1aWxkIHRhcmdldCBmb3IgeW91ciB0ZXN0IHByb2dyYW0uICBNYWtlIHN1cmUgeW91CitoYXZlIGBHVEVTVF9ST09UL2luY2x1ZGVgIGluIHRoZSBoZWFkZXIgc2VhcmNoIHBhdGggc28gdGhhdCB0aGUKK2NvbXBpbGVyIGNhbiBmaW5kIGAiZ3Rlc3QvZ3Rlc3QuaCJgIHdoZW4gY29tcGlsaW5nIHlvdXIgdGVzdC4gIFNldCB1cAoreW91ciB0ZXN0IHByb2plY3QgdG8gbGluayB3aXRoIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5IChmb3IgZXhhbXBsZSwKK2luIFZpc3VhbCBTdHVkaW8sIHRoaXMgaXMgZG9uZSBieSBhZGRpbmcgYSBkZXBlbmRlbmN5IG9uCitgZ3Rlc3QudmNwcm9qYCkuCisKK0lmIHlvdSBzdGlsbCBoYXZlIHF1ZXN0aW9ucywgdGFrZSBhIGxvb2sgYXQgaG93IEdvb2dsZSBUZXN0J3Mgb3duCit0ZXN0cyBhcmUgYnVpbHQgYW5kIHVzZSB0aGVtIGFzIGV4YW1wbGVzLgorCisjIEJhc2ljIENvbmNlcHRzICMKKworV2hlbiB1c2luZyBHb29nbGUgVGVzdCwgeW91IHN0YXJ0IGJ5IHdyaXRpbmcgX2Fzc2VydGlvbnNfLCB3aGljaCBhcmUgc3RhdGVtZW50cwordGhhdCBjaGVjayB3aGV0aGVyIGEgY29uZGl0aW9uIGlzIHRydWUuIEFuIGFzc2VydGlvbidzIHJlc3VsdCBjYW4gYmUgX3N1Y2Nlc3NfLAorX25vbmZhdGFsIGZhaWx1cmVfLCBvciBfZmF0YWwgZmFpbHVyZV8uIElmIGEgZmF0YWwgZmFpbHVyZSBvY2N1cnMsIGl0IGFib3J0cwordGhlIGN1cnJlbnQgZnVuY3Rpb247IG90aGVyd2lzZSB0aGUgcHJvZ3JhbSBjb250aW51ZXMgbm9ybWFsbHkuCisKK19UZXN0c18gdXNlIGFzc2VydGlvbnMgdG8gdmVyaWZ5IHRoZSB0ZXN0ZWQgY29kZSdzIGJlaGF2aW9yLiBJZiBhIHRlc3QgY3Jhc2hlcworb3IgaGFzIGEgZmFpbGVkIGFzc2VydGlvbiwgdGhlbiBpdCBfZmFpbHNfOyBvdGhlcndpc2UgaXQgX3N1Y2NlZWRzXy4KKworQSBfdGVzdCBjYXNlXyBjb250YWlucyBvbmUgb3IgbWFueSB0ZXN0cy4gWW91IHNob3VsZCBncm91cCB5b3VyIHRlc3RzIGludG8gdGVzdAorY2FzZXMgdGhhdCByZWZsZWN0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHRlc3RlZCBjb2RlLiBXaGVuIG11bHRpcGxlIHRlc3RzIGluIGEKK3Rlc3QgY2FzZSBuZWVkIHRvIHNoYXJlIGNvbW1vbiBvYmplY3RzIGFuZCBzdWJyb3V0aW5lcywgeW91IGNhbiBwdXQgdGhlbSBpbnRvIGEKK190ZXN0IGZpeHR1cmVfIGNsYXNzLgorCitBIF90ZXN0IHByb2dyYW1fIGNhbiBjb250YWluIG11bHRpcGxlIHRlc3QgY2FzZXMuCisKK1dlJ2xsIG5vdyBleHBsYWluIGhvdyB0byB3cml0ZSBhIHRlc3QgcHJvZ3JhbSwgc3RhcnRpbmcgYXQgdGhlIGluZGl2aWR1YWwKK2Fzc2VydGlvbiBsZXZlbCBhbmQgYnVpbGRpbmcgdXAgdG8gdGVzdHMgYW5kIHRlc3QgY2FzZXMuCisKKyMgQXNzZXJ0aW9ucyAjCisKK0dvb2dsZSBUZXN0IGFzc2VydGlvbnMgYXJlIG1hY3JvcyB0aGF0IHJlc2VtYmxlIGZ1bmN0aW9uIGNhbGxzLiBZb3UgdGVzdCBhCitjbGFzcyBvciBmdW5jdGlvbiBieSBtYWtpbmcgYXNzZXJ0aW9ucyBhYm91dCBpdHMgYmVoYXZpb3IuIFdoZW4gYW4gYXNzZXJ0aW9uCitmYWlscywgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSBhc3NlcnRpb24ncyBzb3VyY2UgZmlsZSBhbmQgbGluZSBudW1iZXIgbG9jYXRpb24sCithbG9uZyB3aXRoIGEgZmFpbHVyZSBtZXNzYWdlLiBZb3UgbWF5IGFsc28gc3VwcGx5IGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZQord2hpY2ggd2lsbCBiZSBhcHBlbmRlZCB0byBHb29nbGUgVGVzdCdzIG1lc3NhZ2UuCisKK1RoZSBhc3NlcnRpb25zIGNvbWUgaW4gcGFpcnMgdGhhdCB0ZXN0IHRoZSBzYW1lIHRoaW5nIGJ1dCBoYXZlIGRpZmZlcmVudAorZWZmZWN0cyBvbiB0aGUgY3VycmVudCBmdW5jdGlvbi4gYEFTU0VSVF8qYCB2ZXJzaW9ucyBnZW5lcmF0ZSBmYXRhbCBmYWlsdXJlcword2hlbiB0aGV5IGZhaWwsIGFuZCAqKmFib3J0IHRoZSBjdXJyZW50IGZ1bmN0aW9uKiouIGBFWFBFQ1RfKmAgdmVyc2lvbnMgZ2VuZXJhdGUKK25vbmZhdGFsIGZhaWx1cmVzLCB3aGljaCBkb24ndCBhYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbi4gVXN1YWxseSBgRVhQRUNUXypgCithcmUgcHJlZmVycmVkLCBhcyB0aGV5IGFsbG93IG1vcmUgdGhhbiBvbmUgZmFpbHVyZXMgdG8gYmUgcmVwb3J0ZWQgaW4gYSB0ZXN0LgorSG93ZXZlciwgeW91IHNob3VsZCB1c2UgYEFTU0VSVF8qYCBpZiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY29udGludWUgd2hlbgordGhlIGFzc2VydGlvbiBpbiBxdWVzdGlvbiBmYWlscy4KKworU2luY2UgYSBmYWlsZWQgYEFTU0VSVF8qYCByZXR1cm5zIGZyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24gaW1tZWRpYXRlbHksCitwb3NzaWJseSBza2lwcGluZyBjbGVhbi11cCBjb2RlIHRoYXQgY29tZXMgYWZ0ZXIgaXQsIGl0IG1heSBjYXVzZSBhIHNwYWNlIGxlYWsuCitEZXBlbmRpbmcgb24gdGhlIG5hdHVyZSBvZiB0aGUgbGVhaywgaXQgbWF5IG9yIG1heSBub3QgYmUgd29ydGggZml4aW5nIC0gc28KK2tlZXAgdGhpcyBpbiBtaW5kIGlmIHlvdSBnZXQgYSBoZWFwIGNoZWNrZXIgZXJyb3IgaW4gYWRkaXRpb24gdG8gYXNzZXJ0aW9uCitlcnJvcnMuCisKK1RvIHByb3ZpZGUgYSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlLCBzaW1wbHkgc3RyZWFtIGl0IGludG8gdGhlIG1hY3JvIHVzaW5nIHRoZQorYDw8YCBvcGVyYXRvciwgb3IgYSBzZXF1ZW5jZSBvZiBzdWNoIG9wZXJhdG9ycy4gQW4gZXhhbXBsZToKK2BgYAorQVNTRVJUX0VRKHguc2l6ZSgpLCB5LnNpemUoKSkgPDwgIlZlY3RvcnMgeCBhbmQgeSBhcmUgb2YgdW5lcXVhbCBsZW5ndGgiOworCitmb3IgKGludCBpID0gMDsgaSA8IHguc2l6ZSgpOyArK2kpIHsKKyAgRVhQRUNUX0VRKHhbaV0sIHlbaV0pIDw8ICJWZWN0b3JzIHggYW5kIHkgZGlmZmVyIGF0IGluZGV4ICIgPDwgaTsKK30KK2BgYAorCitBbnl0aGluZyB0aGF0IGNhbiBiZSBzdHJlYW1lZCB0byBhbiBgb3N0cmVhbWAgY2FuIGJlIHN0cmVhbWVkIHRvIGFuIGFzc2VydGlvbgorbWFjcm8tLWluIHBhcnRpY3VsYXIsIEMgc3RyaW5ncyBhbmQgYHN0cmluZ2Agb2JqZWN0cy4gSWYgYSB3aWRlIHN0cmluZworKGB3Y2hhcl90KmAsIGBUQ0hBUipgIGluIGBVTklDT0RFYCBtb2RlIG9uIFdpbmRvd3MsIG9yIGBzdGQ6OndzdHJpbmdgKSBpcworc3RyZWFtZWQgdG8gYW4gYXNzZXJ0aW9uLCBpdCB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gVVRGLTggd2hlbiBwcmludGVkLgorCisjIyBCYXNpYyBBc3NlcnRpb25zICMjCisKK1RoZXNlIGFzc2VydGlvbnMgZG8gYmFzaWMgdHJ1ZS9mYWxzZSBjb25kaXRpb24gdGVzdGluZy4KK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfVFJVRShgX2NvbmRpdGlvbl9gKWA7ICB8IGBFWFBFQ1RfVFJVRShgX2NvbmRpdGlvbl9gKWA7ICAgfCBfY29uZGl0aW9uXyBpcyB0cnVlIHwKK3wgYEFTU0VSVF9GQUxTRShgX2NvbmRpdGlvbl9gKWA7IHwgYEVYUEVDVF9GQUxTRShgX2NvbmRpdGlvbl9gKWA7ICB8IF9jb25kaXRpb25fIGlzIGZhbHNlIHwKKworUmVtZW1iZXIsIHdoZW4gdGhleSBmYWlsLCBgQVNTRVJUXypgIHlpZWxkcyBhIGZhdGFsIGZhaWx1cmUgYW5kCityZXR1cm5zIGZyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24sIHdoaWxlIGBFWFBFQ1RfKmAgeWllbGRzIGEgbm9uZmF0YWwKK2ZhaWx1cmUsIGFsbG93aW5nIHRoZSBmdW5jdGlvbiB0byBjb250aW51ZSBydW5uaW5nLiBJbiBlaXRoZXIgY2FzZSwgYW4KK2Fzc2VydGlvbiBmYWlsdXJlIG1lYW5zIGl0cyBjb250YWluaW5nIHRlc3QgZmFpbHMuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBCaW5hcnkgQ29tcGFyaXNvbiAjIworCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGFzc2VydGlvbnMgdGhhdCBjb21wYXJlIHR3byB2YWx1ZXMuCisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8YEFTU0VSVF9FUShgX2V4cGVjdGVkX2AsIGBfYWN0dWFsX2ApO2B8YEVYUEVDVF9FUShgX2V4cGVjdGVkX2AsIGBfYWN0dWFsX2ApO2B8IF9leHBlY3RlZF8gYD09YCBfYWN0dWFsXyB8Cit8YEFTU0VSVF9ORShgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8YEVYUEVDVF9ORShgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8IF92YWwxXyBgIT1gIF92YWwyXyB8Cit8YEFTU0VSVF9MVChgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8YEVYUEVDVF9MVChgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8IF92YWwxXyBgPGAgX3ZhbDJfIHwKK3xgQVNTRVJUX0xFKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHxgRVhQRUNUX0xFKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHwgX3ZhbDFfIGA8PWAgX3ZhbDJfIHwKK3xgQVNTRVJUX0dUKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHxgRVhQRUNUX0dUKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHwgX3ZhbDFfIGA+YCBfdmFsMl8gfAorfGBBU1NFUlRfR0UoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfGBFWFBFQ1RfR0UoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfCBfdmFsMV8gYD49YCBfdmFsMl8gfAorCitJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlLCBHb29nbGUgVGVzdCBwcmludHMgYm90aCBfdmFsMV8gYW5kIF92YWwyXworLiBJbiBgQVNTRVJUX0VRKmAgYW5kIGBFWFBFQ1RfRVEqYCAoYW5kIGFsbCBvdGhlciBlcXVhbGl0eSBhc3NlcnRpb25zCit3ZSdsbCBpbnRyb2R1Y2UgbGF0ZXIpLCB5b3Ugc2hvdWxkIHB1dCB0aGUgZXhwcmVzc2lvbiB5b3Ugd2FudCB0byB0ZXN0CitpbiB0aGUgcG9zaXRpb24gb2YgX2FjdHVhbF8sIGFuZCBwdXQgaXRzIGV4cGVjdGVkIHZhbHVlIGluIF9leHBlY3RlZF8sCithcyBHb29nbGUgVGVzdCdzIGZhaWx1cmUgbWVzc2FnZXMgYXJlIG9wdGltaXplZCBmb3IgdGhpcyBjb252ZW50aW9uLgorCitWYWx1ZSBhcmd1bWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIGJ5IHRoZSBhc3NlcnRpb24ncyBjb21wYXJpc29uCitvcGVyYXRvciBvciB5b3UnbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IuICBXZSB1c2VkIHRvIHJlcXVpcmUgdGhlCithcmd1bWVudHMgdG8gc3VwcG9ydCB0aGUgYDw8YCBvcGVyYXRvciBmb3Igc3RyZWFtaW5nIHRvIGFuIGBvc3RyZWFtYCwKK2J1dCBpdCdzIG5vIGxvbmdlciBuZWNlc3Nhcnkgc2luY2UgdjEuNi4wIChpZiBgPDxgIGlzIHN1cHBvcnRlZCwgaXQKK3dpbGwgYmUgY2FsbGVkIHRvIHByaW50IHRoZSBhcmd1bWVudHMgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzOworb3RoZXJ3aXNlIEdvb2dsZSBUZXN0IHdpbGwgYXR0ZW1wdCB0byBwcmludCB0aGVtIGluIHRoZSBiZXN0IHdheSBpdAorY2FuLiBGb3IgbW9yZSBkZXRhaWxzIGFuZCBob3cgdG8gY3VzdG9taXplIHRoZSBwcmludGluZyBvZiB0aGUKK2FyZ3VtZW50cywgc2VlIHRoaXMgR29vZ2xlIE1vY2sgW3JlY2lwZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNUZWFjaGluZ19Hb29nbGVfTW9ja19Ib3dfdG9fUHJpbnRfWW91cl9WYWx1ZXMpLikuCisKK1RoZXNlIGFzc2VydGlvbnMgY2FuIHdvcmsgd2l0aCBhIHVzZXItZGVmaW5lZCB0eXBlLCBidXQgb25seSBpZiB5b3UgZGVmaW5lIHRoZQorY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9wZXJhdG9yIChlLmcuIGA9PWAsIGA8YCwgZXRjKS4gIElmIHRoZSBjb3JyZXNwb25kaW5nCitvcGVyYXRvciBpcyBkZWZpbmVkLCBwcmVmZXIgdXNpbmcgdGhlIGBBU1NFUlRfKigpYCBtYWNyb3MgYmVjYXVzZSB0aGV5IHdpbGwKK3ByaW50IG91dCBub3Qgb25seSB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLCBidXQgdGhlIHR3byBvcGVyYW5kcyBhcyB3ZWxsLgorCitBcmd1bWVudHMgYXJlIGFsd2F5cyBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiBUaGVyZWZvcmUsIGl0J3MgT0sgZm9yIHRoZQorYXJndW1lbnRzIHRvIGhhdmUgc2lkZSBlZmZlY3RzLiBIb3dldmVyLCBhcyB3aXRoIGFueSBvcmRpbmFyeSBDL0MrKyBmdW5jdGlvbiwKK3RoZSBhcmd1bWVudHMnIGV2YWx1YXRpb24gb3JkZXIgaXMgdW5kZWZpbmVkIChpLmUuIHRoZSBjb21waWxlciBpcyBmcmVlIHRvCitjaG9vc2UgYW55IG9yZGVyKSBhbmQgeW91ciBjb2RlIHNob3VsZCBub3QgZGVwZW5kIG9uIGFueSBwYXJ0aWN1bGFyIGFyZ3VtZW50CitldmFsdWF0aW9uIG9yZGVyLgorCitgQVNTRVJUX0VRKClgIGRvZXMgcG9pbnRlciBlcXVhbGl0eSBvbiBwb2ludGVycy4gSWYgdXNlZCBvbiB0d28gQyBzdHJpbmdzLCBpdAordGVzdHMgaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbWVtb3J5IGxvY2F0aW9uLCBub3QgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlLgorVGhlcmVmb3JlLCBpZiB5b3Ugd2FudCB0byBjb21wYXJlIEMgc3RyaW5ncyAoZS5nLiBgY29uc3QgY2hhcipgKSBieSB2YWx1ZSwgdXNlCitgQVNTRVJUX1NUUkVRKClgICwgd2hpY2ggd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIgb24uIEluIHBhcnRpY3VsYXIsIHRvIGFzc2VydAordGhhdCBhIEMgc3RyaW5nIGlzIGBOVUxMYCwgdXNlIGBBU1NFUlRfU1RSRVEoTlVMTCwgY19zdHJpbmcpYCAuIEhvd2V2ZXIsIHRvCitjb21wYXJlIHR3byBgc3RyaW5nYCBvYmplY3RzLCB5b3Ugc2hvdWxkIHVzZSBgQVNTRVJUX0VRYC4KKworTWFjcm9zIGluIHRoaXMgc2VjdGlvbiB3b3JrIHdpdGggYm90aCBuYXJyb3cgYW5kIHdpZGUgc3RyaW5nIG9iamVjdHMgKGBzdHJpbmdgCithbmQgYHdzdHJpbmdgKS4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIFN0cmluZyBDb21wYXJpc29uICMjCisKK1RoZSBhc3NlcnRpb25zIGluIHRoaXMgZ3JvdXAgY29tcGFyZSB0d28gKipDIHN0cmluZ3MqKi4gSWYgeW91IHdhbnQgdG8gY29tcGFyZQordHdvIGBzdHJpbmdgIG9iamVjdHMsIHVzZSBgRVhQRUNUX0VRYCwgYEVYUEVDVF9ORWAsIGFuZCBldGMgaW5zdGVhZC4KKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9TVFJFUShgX2V4cGVjdGVkXF9zdHJfYCwgYF9hY3R1YWxcX3N0cl9gKTtgICAgIHwgYEVYUEVDVF9TVFJFUShgX2V4cGVjdGVkXF9zdHJfYCwgYF9hY3R1YWxcX3N0cl9gKTtgICAgICB8IHRoZSB0d28gQyBzdHJpbmdzIGhhdmUgdGhlIHNhbWUgY29udGVudCB8Cit8IGBBU1NFUlRfU1RSTkUoYF9zdHIxX2AsIGBfc3RyMl9gKTtgICAgIHwgYEVYUEVDVF9TVFJORShgX3N0cjFfYCwgYF9zdHIyX2ApO2AgICAgIHwgdGhlIHR3byBDIHN0cmluZ3MgaGF2ZSBkaWZmZXJlbnQgY29udGVudCB8Cit8IGBBU1NFUlRfU1RSQ0FTRUVRKGBfZXhwZWN0ZWRcX3N0cl9gLCBgX2FjdHVhbFxfc3RyX2ApO2B8IGBFWFBFQ1RfU1RSQ0FTRUVRKGBfZXhwZWN0ZWRcX3N0cl9gLCBgX2FjdHVhbFxfc3RyX2ApO2AgfCB0aGUgdHdvIEMgc3RyaW5ncyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQsIGlnbm9yaW5nIGNhc2UgfAorfCBgQVNTRVJUX1NUUkNBU0VORShgX3N0cjFfYCwgYF9zdHIyX2ApO2B8IGBFWFBFQ1RfU1RSQ0FTRU5FKGBfc3RyMV9gLCBgX3N0cjJfYCk7YCB8IHRoZSB0d28gQyBzdHJpbmdzIGhhdmUgZGlmZmVyZW50IGNvbnRlbnQsIGlnbm9yaW5nIGNhc2UgfAorCitOb3RlIHRoYXQgIkNBU0UiIGluIGFuIGFzc2VydGlvbiBuYW1lIG1lYW5zIHRoYXQgY2FzZSBpcyBpZ25vcmVkLgorCitgKlNUUkVRKmAgYW5kIGAqU1RSTkUqYCBhbHNvIGFjY2VwdCB3aWRlIEMgc3RyaW5ncyAoYHdjaGFyX3QqYCkuIElmIGEKK2NvbXBhcmlzb24gb2YgdHdvIHdpZGUgc3RyaW5ncyBmYWlscywgdGhlaXIgdmFsdWVzIHdpbGwgYmUgcHJpbnRlZCBhcyBVVEYtOAorbmFycm93IHN0cmluZ3MuCisKK0EgYE5VTExgIHBvaW50ZXIgYW5kIGFuIGVtcHR5IHN0cmluZyBhcmUgY29uc2lkZXJlZCBfZGlmZmVyZW50Xy4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKK1NlZSBhbHNvOiBGb3IgbW9yZSBzdHJpbmcgY29tcGFyaXNvbiB0cmlja3MgKHN1YnN0cmluZywgcHJlZml4LCBzdWZmaXgsIGFuZAorcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nLCBmb3IgZXhhbXBsZSksIHNlZSB0aGUgW0FkdmFuY2VkIEdvb2dsZSBUZXN0IEd1aWRlXShWMV82X0FkdmFuY2VkR3VpZGUubWQpLgorCisjIFNpbXBsZSBUZXN0cyAjCisKK1RvIGNyZWF0ZSBhIHRlc3Q6CisgIDEuIFVzZSB0aGUgYFRFU1QoKWAgbWFjcm8gdG8gZGVmaW5lIGFuZCBuYW1lIGEgdGVzdCBmdW5jdGlvbiwgVGhlc2UgYXJlIG9yZGluYXJ5IEMrKyBmdW5jdGlvbnMgdGhhdCBkb24ndCByZXR1cm4gYSB2YWx1ZS4KKyAgMS4gSW4gdGhpcyBmdW5jdGlvbiwgYWxvbmcgd2l0aCBhbnkgdmFsaWQgQysrIHN0YXRlbWVudHMgeW91IHdhbnQgdG8gaW5jbHVkZSwgdXNlIHRoZSB2YXJpb3VzIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgdG8gY2hlY2sgdmFsdWVzLgorICAxLiBUaGUgdGVzdCdzIHJlc3VsdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3NlcnRpb25zOyBpZiBhbnkgYXNzZXJ0aW9uIGluIHRoZSB0ZXN0IGZhaWxzIChlaXRoZXIgZmF0YWxseSBvciBub24tZmF0YWxseSksIG9yIGlmIHRoZSB0ZXN0IGNyYXNoZXMsIHRoZSBlbnRpcmUgdGVzdCBmYWlscy4gT3RoZXJ3aXNlLCBpdCBzdWNjZWVkcy4KKworYGBgCitURVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIHsKKyAuLi4gdGVzdCBib2R5IC4uLgorfQorYGBgCisKKworYFRFU1QoKWAgYXJndW1lbnRzIGdvIGZyb20gZ2VuZXJhbCB0byBzcGVjaWZpYy4gVGhlIF9maXJzdF8gYXJndW1lbnQgaXMgdGhlCituYW1lIG9mIHRoZSB0ZXN0IGNhc2UsIGFuZCB0aGUgX3NlY29uZF8gYXJndW1lbnQgaXMgdGhlIHRlc3QncyBuYW1lIHdpdGhpbiB0aGUKK3Rlc3QgY2FzZS4gQm90aCBuYW1lcyBtdXN0IGJlIHZhbGlkIEMrKyBpZGVudGlmaWVycywgYW5kIHRoZXkgc2hvdWxkIG5vdCBjb250YWluIHVuZGVyc2NvcmUgKGBfYCkuIEEgdGVzdCdzIF9mdWxsIG5hbWVfIGNvbnNpc3RzIG9mIGl0cyBjb250YWluaW5nIHRlc3QgY2FzZSBhbmQgaXRzCitpbmRpdmlkdWFsIG5hbWUuIFRlc3RzIGZyb20gZGlmZmVyZW50IHRlc3QgY2FzZXMgY2FuIGhhdmUgdGhlIHNhbWUgaW5kaXZpZHVhbAorbmFtZS4KKworRm9yIGV4YW1wbGUsIGxldCdzIHRha2UgYSBzaW1wbGUgaW50ZWdlciBmdW5jdGlvbjoKK2BgYAoraW50IEZhY3RvcmlhbChpbnQgbik7IC8vIFJldHVybnMgdGhlIGZhY3RvcmlhbCBvZiBuCitgYGAKKworQSB0ZXN0IGNhc2UgZm9yIHRoaXMgZnVuY3Rpb24gbWlnaHQgbG9vayBsaWtlOgorYGBgCisvLyBUZXN0cyBmYWN0b3JpYWwgb2YgMC4KK1RFU1QoRmFjdG9yaWFsVGVzdCwgSGFuZGxlc1plcm9JbnB1dCkgeworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDApKTsKK30KKworLy8gVGVzdHMgZmFjdG9yaWFsIG9mIHBvc2l0aXZlIG51bWJlcnMuCitURVNUKEZhY3RvcmlhbFRlc3QsIEhhbmRsZXNQb3NpdGl2ZUlucHV0KSB7CisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoMSkpOworICBFWFBFQ1RfRVEoMiwgRmFjdG9yaWFsKDIpKTsKKyAgRVhQRUNUX0VRKDYsIEZhY3RvcmlhbCgzKSk7CisgIEVYUEVDVF9FUSg0MDMyMCwgRmFjdG9yaWFsKDgpKTsKK30KK2BgYAorCitHb29nbGUgVGVzdCBncm91cHMgdGhlIHRlc3QgcmVzdWx0cyBieSB0ZXN0IGNhc2VzLCBzbyBsb2dpY2FsbHktcmVsYXRlZCB0ZXN0cworc2hvdWxkIGJlIGluIHRoZSBzYW1lIHRlc3QgY2FzZTsgaW4gb3RoZXIgd29yZHMsIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVpcgorYFRFU1QoKWAgc2hvdWxkIGJlIHRoZSBzYW1lLiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgd2UgaGF2ZSB0d28gdGVzdHMsCitgSGFuZGxlc1plcm9JbnB1dGAgYW5kIGBIYW5kbGVzUG9zaXRpdmVJbnB1dGAsIHRoYXQgYmVsb25nIHRvIHRoZSBzYW1lIHRlc3QKK2Nhc2UgYEZhY3RvcmlhbFRlc3RgLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyBUZXN0IEZpeHR1cmVzOiBVc2luZyB0aGUgU2FtZSBEYXRhIENvbmZpZ3VyYXRpb24gZm9yIE11bHRpcGxlIFRlc3RzICMKKworSWYgeW91IGZpbmQgeW91cnNlbGYgd3JpdGluZyB0d28gb3IgbW9yZSB0ZXN0cyB0aGF0IG9wZXJhdGUgb24gc2ltaWxhciBkYXRhLAoreW91IGNhbiB1c2UgYSBfdGVzdCBmaXh0dXJlXy4gSXQgYWxsb3dzIHlvdSB0byByZXVzZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uIG9mCitvYmplY3RzIGZvciBzZXZlcmFsIGRpZmZlcmVudCB0ZXN0cy4KKworVG8gY3JlYXRlIGEgZml4dHVyZSwganVzdDoKKyAgMS4gRGVyaXZlIGEgY2xhc3MgZnJvbSBgOjp0ZXN0aW5nOjpUZXN0YCAuIFN0YXJ0IGl0cyBib2R5IHdpdGggYHByb3RlY3RlZDpgIG9yIGBwdWJsaWM6YCBhcyB3ZSdsbCB3YW50IHRvIGFjY2VzcyBmaXh0dXJlIG1lbWJlcnMgZnJvbSBzdWItY2xhc3Nlcy4KKyAgMS4gSW5zaWRlIHRoZSBjbGFzcywgZGVjbGFyZSBhbnkgb2JqZWN0cyB5b3UgcGxhbiB0byB1c2UuCisgIDEuIElmIG5lY2Vzc2FyeSwgd3JpdGUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9yIGBTZXRVcCgpYCBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBvYmplY3RzIGZvciBlYWNoIHRlc3QuIEEgY29tbW9uIG1pc3Rha2UgaXMgdG8gc3BlbGwgYFNldFVwKClgIGFzIGBTZXR1cCgpYCB3aXRoIGEgc21hbGwgYHVgIC0gZG9uJ3QgbGV0IHRoYXQgaGFwcGVuIHRvIHlvdS4KKyAgMS4gSWYgbmVjZXNzYXJ5LCB3cml0ZSBhIGRlc3RydWN0b3Igb3IgYFRlYXJEb3duKClgIGZ1bmN0aW9uIHRvIHJlbGVhc2UgYW55IHJlc291cmNlcyB5b3UgYWxsb2NhdGVkIGluIGBTZXRVcCgpYCAuIFRvIGxlYXJuIHdoZW4geW91IHNob3VsZCB1c2UgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgYW5kIHdoZW4geW91IHNob3VsZCB1c2UgYFNldFVwKCkvVGVhckRvd24oKWAsIHJlYWQgdGhpcyBbRkFRIGVudHJ5XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzZfRkFRI1Nob3VsZF9JX3VzZV90aGVfY29uc3RydWN0b3IvZGVzdHJ1Y3Rvcl9vZl90aGVfdGVzdF9maXh0dXJlX29yX3QpLgorICAxLiBJZiBuZWVkZWQsIGRlZmluZSBzdWJyb3V0aW5lcyBmb3IgeW91ciB0ZXN0cyB0byBzaGFyZS4KKworV2hlbiB1c2luZyBhIGZpeHR1cmUsIHVzZSBgVEVTVF9GKClgIGluc3RlYWQgb2YgYFRFU1QoKWAgYXMgaXQgYWxsb3dzIHlvdSB0bworYWNjZXNzIG9iamVjdHMgYW5kIHN1YnJvdXRpbmVzIGluIHRoZSB0ZXN0IGZpeHR1cmU6CitgYGAKK1RFU1RfRih0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSB7CisgLi4uIHRlc3QgYm9keSAuLi4KK30KK2BgYAorCitMaWtlIGBURVNUKClgLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHRlc3QgY2FzZSBuYW1lLCBidXQgZm9yIGBURVNUX0YoKWAKK3RoaXMgbXVzdCBiZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLiBZb3UndmUgcHJvYmFibHkgZ3Vlc3NlZDogYF9GYAoraXMgZm9yIGZpeHR1cmUuCisKK1VuZm9ydHVuYXRlbHksIHRoZSBDKysgbWFjcm8gc3lzdGVtIGRvZXMgbm90IGFsbG93IHVzIHRvIGNyZWF0ZSBhIHNpbmdsZSBtYWNybwordGhhdCBjYW4gaGFuZGxlIGJvdGggdHlwZXMgb2YgdGVzdHMuIFVzaW5nIHRoZSB3cm9uZyBtYWNybyBjYXVzZXMgYSBjb21waWxlcgorZXJyb3IuCisKK0Fsc28sIHlvdSBtdXN0IGZpcnN0IGRlZmluZSBhIHRlc3QgZml4dHVyZSBjbGFzcyBiZWZvcmUgdXNpbmcgaXQgaW4gYQorYFRFU1RfRigpYCwgb3IgeW91J2xsIGdldCB0aGUgY29tcGlsZXIgZXJyb3IgImB2aXJ0dWFsIG91dHNpZGUgY2xhc3MKK2RlY2xhcmF0aW9uYCIuCisKK0ZvciBlYWNoIHRlc3QgZGVmaW5lZCB3aXRoIGBURVNUX0YoKWAsIEdvb2dsZSBUZXN0IHdpbGw6CisgIDEuIENyZWF0ZSBhIF9mcmVzaF8gdGVzdCBmaXh0dXJlIGF0IHJ1bnRpbWUKKyAgMS4gSW1tZWRpYXRlbHkgaW5pdGlhbGl6ZSBpdCB2aWEgYFNldFVwKClgICwKKyAgMS4gUnVuIHRoZSB0ZXN0CisgIDEuIENsZWFuIHVwIGJ5IGNhbGxpbmcgYFRlYXJEb3duKClgCisgIDEuIERlbGV0ZSB0aGUgdGVzdCBmaXh0dXJlLiAgTm90ZSB0aGF0IGRpZmZlcmVudCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaGF2ZSBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIG9iamVjdHMsIGFuZCBHb29nbGUgVGVzdCBhbHdheXMgZGVsZXRlcyBhIHRlc3QgZml4dHVyZSBiZWZvcmUgaXQgY3JlYXRlcyB0aGUgbmV4dCBvbmUuIEdvb2dsZSBUZXN0IGRvZXMgbm90IHJldXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZSBmb3IgbXVsdGlwbGUgdGVzdHMuIEFueSBjaGFuZ2VzIG9uZSB0ZXN0IG1ha2VzIHRvIHRoZSBmaXh0dXJlIGRvIG5vdCBhZmZlY3Qgb3RoZXIgdGVzdHMuCisKK0FzIGFuIGV4YW1wbGUsIGxldCdzIHdyaXRlIHRlc3RzIGZvciBhIEZJRk8gcXVldWUgY2xhc3MgbmFtZWQgYFF1ZXVlYCwgd2hpY2gKK2hhcyB0aGUgZm9sbG93aW5nIGludGVyZmFjZToKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIEU+IC8vIEUgaXMgdGhlIGVsZW1lbnQgdHlwZS4KK2NsYXNzIFF1ZXVlIHsKKyBwdWJsaWM6CisgIFF1ZXVlKCk7CisgIHZvaWQgRW5xdWV1ZShjb25zdCBFJiBlbGVtZW50KTsKKyAgRSogRGVxdWV1ZSgpOyAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgorICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICAuLi4KK307CitgYGAKKworRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MuIEJ5IGNvbnZlbnRpb24sIHlvdSBzaG91bGQgZ2l2ZSBpdCB0aGUgbmFtZQorYEZvb1Rlc3RgIHdoZXJlIGBGb29gIGlzIHRoZSBjbGFzcyBiZWluZyB0ZXN0ZWQuCitgYGAKK2NsYXNzIFF1ZXVlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHExXy5FbnF1ZXVlKDEpOworICAgIHEyXy5FbnF1ZXVlKDIpOworICAgIHEyXy5FbnF1ZXVlKDMpOworICB9CisKKyAgLy8gdmlydHVhbCB2b2lkIFRlYXJEb3duKCkge30KKworICBRdWV1ZTxpbnQ+IHEwXzsKKyAgUXVldWU8aW50PiBxMV87CisgIFF1ZXVlPGludD4gcTJfOworfTsKK2BgYAorCitJbiB0aGlzIGNhc2UsIGBUZWFyRG93bigpYCBpcyBub3QgbmVlZGVkIHNpbmNlIHdlIGRvbid0IGhhdmUgdG8gY2xlYW4gdXAgYWZ0ZXIKK2VhY2ggdGVzdCwgb3RoZXIgdGhhbiB3aGF0J3MgYWxyZWFkeSBkb25lIGJ5IHRoZSBkZXN0cnVjdG9yLgorCitOb3cgd2UnbGwgd3JpdGUgdGVzdHMgdXNpbmcgYFRFU1RfRigpYCBhbmQgdGhpcyBmaXh0dXJlLgorYGBgCitURVNUX0YoUXVldWVUZXN0LCBJc0VtcHR5SW5pdGlhbGx5KSB7CisgIEVYUEVDVF9FUSgwLCBxMF8uc2l6ZSgpKTsKK30KKworVEVTVF9GKFF1ZXVlVGVzdCwgRGVxdWV1ZVdvcmtzKSB7CisgIGludCogbiA9IHEwXy5EZXF1ZXVlKCk7CisgIEVYUEVDVF9FUShOVUxMLCBuKTsKKworICBuID0gcTFfLkRlcXVldWUoKTsKKyAgQVNTRVJUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDEsICpuKTsKKyAgRVhQRUNUX0VRKDAsIHExXy5zaXplKCkpOworICBkZWxldGUgbjsKKworICBuID0gcTJfLkRlcXVldWUoKTsKKyAgQVNTRVJUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDIsICpuKTsKKyAgRVhQRUNUX0VRKDEsIHEyXy5zaXplKCkpOworICBkZWxldGUgbjsKK30KK2BgYAorCitUaGUgYWJvdmUgdXNlcyBib3RoIGBBU1NFUlRfKmAgYW5kIGBFWFBFQ1RfKmAgYXNzZXJ0aW9ucy4gVGhlIHJ1bGUgb2YgdGh1bWIgaXMKK3RvIHVzZSBgRVhQRUNUXypgIHdoZW4geW91IHdhbnQgdGhlIHRlc3QgdG8gY29udGludWUgdG8gcmV2ZWFsIG1vcmUgZXJyb3JzCithZnRlciB0aGUgYXNzZXJ0aW9uIGZhaWx1cmUsIGFuZCB1c2UgYEFTU0VSVF8qYCB3aGVuIGNvbnRpbnVpbmcgYWZ0ZXIgZmFpbHVyZQorZG9lc24ndCBtYWtlIHNlbnNlLiBGb3IgZXhhbXBsZSwgdGhlIHNlY29uZCBhc3NlcnRpb24gaW4gdGhlIGBEZXF1ZXVlYCB0ZXN0IGlzCitgQVNTRVJUX1RSVUUobiAhPSBOVUxMKWAsIGFzIHdlIG5lZWQgdG8gZGVyZWZlcmVuY2UgdGhlIHBvaW50ZXIgYG5gIGxhdGVyLAord2hpY2ggd291bGQgbGVhZCB0byBhIHNlZ2ZhdWx0IHdoZW4gYG5gIGlzIGBOVUxMYC4KKworV2hlbiB0aGVzZSB0ZXN0cyBydW4sIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKKyAgMS4gR29vZ2xlIFRlc3QgY29uc3RydWN0cyBhIGBRdWV1ZVRlc3RgIG9iamVjdCAobGV0J3MgY2FsbCBpdCBgdDFgICkuCisgIDEuIGB0MS5TZXRVcCgpYCBpbml0aWFsaXplcyBgdDFgIC4KKyAgMS4gVGhlIGZpcnN0IHRlc3QgKCBgSXNFbXB0eUluaXRpYWxseWAgKSBydW5zIG9uIGB0MWAgLgorICAxLiBgdDEuVGVhckRvd24oKWAgY2xlYW5zIHVwIGFmdGVyIHRoZSB0ZXN0IGZpbmlzaGVzLgorICAxLiBgdDFgIGlzIGRlc3RydWN0ZWQuCisgIDEuIFRoZSBhYm92ZSBzdGVwcyBhcmUgcmVwZWF0ZWQgb24gYW5vdGhlciBgUXVldWVUZXN0YCBvYmplY3QsIHRoaXMgdGltZSBydW5uaW5nIHRoZSBgRGVxdWV1ZVdvcmtzYCB0ZXN0LgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworX05vdGVfOiBHb29nbGUgVGVzdCBhdXRvbWF0aWNhbGx5IHNhdmVzIGFsbCBfR29vZ2xlIFRlc3RfIGZsYWdzIHdoZW4gYSB0ZXN0CitvYmplY3QgaXMgY29uc3RydWN0ZWQsIGFuZCByZXN0b3JlcyB0aGVtIHdoZW4gaXQgaXMgZGVzdHJ1Y3RlZC4KKworIyBJbnZva2luZyB0aGUgVGVzdHMgIworCitgVEVTVCgpYCBhbmQgYFRFU1RfRigpYCBpbXBsaWNpdGx5IHJlZ2lzdGVyIHRoZWlyIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QuIFNvLCB1bmxpa2Ugd2l0aCBtYW55IG90aGVyIEMrKyB0ZXN0aW5nIGZyYW1ld29ya3MsIHlvdSBkb24ndCBoYXZlIHRvIHJlLWxpc3QgYWxsIHlvdXIgZGVmaW5lZCB0ZXN0cyBpbiBvcmRlciB0byBydW4gdGhlbS4KKworQWZ0ZXIgZGVmaW5pbmcgeW91ciB0ZXN0cywgeW91IGNhbiBydW4gdGhlbSB3aXRoIGBSVU5fQUxMX1RFU1RTKClgICwgd2hpY2ggcmV0dXJucyBgMGAgaWYgYWxsIHRoZSB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bCwgb3IgYDFgIG90aGVyd2lzZS4gTm90ZSB0aGF0IGBSVU5fQUxMX1RFU1RTKClgIHJ1bnMgX2FsbCB0ZXN0c18gaW4geW91ciBsaW5rIHVuaXQgLS0gdGhleSBjYW4gYmUgZnJvbSBkaWZmZXJlbnQgdGVzdCBjYXNlcywgb3IgZXZlbiBkaWZmZXJlbnQgc291cmNlIGZpbGVzLgorCitXaGVuIGludm9rZWQsIHRoZSBgUlVOX0FMTF9URVNUUygpYCBtYWNybzoKKyAgMS4gU2F2ZXMgdGhlIHN0YXRlIG9mIGFsbCAgR29vZ2xlIFRlc3QgZmxhZ3MuCisgIDEuIENyZWF0ZXMgYSB0ZXN0IGZpeHR1cmUgb2JqZWN0IGZvciB0aGUgZmlyc3QgdGVzdC4KKyAgMS4gSW5pdGlhbGl6ZXMgaXQgdmlhIGBTZXRVcCgpYC4KKyAgMS4gUnVucyB0aGUgdGVzdCBvbiB0aGUgZml4dHVyZSBvYmplY3QuCisgIDEuIENsZWFucyB1cCB0aGUgZml4dHVyZSB2aWEgYFRlYXJEb3duKClgLgorICAxLiBEZWxldGVzIHRoZSBmaXh0dXJlLgorICAxLiBSZXN0b3JlcyB0aGUgc3RhdGUgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorICAxLiBSZXBlYXRzIHRoZSBhYm92ZSBzdGVwcyBmb3IgdGhlIG5leHQgdGVzdCwgdW50aWwgYWxsIHRlc3RzIGhhdmUgcnVuLgorCitJbiBhZGRpdGlvbiwgaWYgdGhlIHRleHQgZml4dHVyZSdzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUgaW4KK3N0ZXAgMiwgdGhlcmUgaXMgbm8gcG9pbnQgZm9yIHN0ZXAgMyAtIDUgYW5kIHRoZXkgYXJlIHRodXMgc2tpcHBlZC4gU2ltaWxhcmx5LAoraWYgc3RlcCAzIGdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUsIHN0ZXAgNCB3aWxsIGJlIHNraXBwZWQuCisKK19JbXBvcnRhbnRfOiBZb3UgbXVzdCBub3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgYFJVTl9BTExfVEVTVFMoKWAsIG9yIGBnY2NgCit3aWxsIGdpdmUgeW91IGEgY29tcGlsZXIgZXJyb3IuIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgZGVzaWduIGlzIHRoYXQgdGhlCithdXRvbWF0ZWQgdGVzdGluZyBzZXJ2aWNlIGRldGVybWluZXMgd2hldGhlciBhIHRlc3QgaGFzIHBhc3NlZCBiYXNlZCBvbiBpdHMKK2V4aXQgY29kZSwgbm90IG9uIGl0cyBzdGRvdXQvc3RkZXJyIG91dHB1dDsgdGh1cyB5b3VyIGBtYWluKClgIGZ1bmN0aW9uIG11c3QKK3JldHVybiB0aGUgdmFsdWUgb2YgYFJVTl9BTExfVEVTVFMoKWAuCisKK0Fsc28sIHlvdSBzaG91bGQgY2FsbCBgUlVOX0FMTF9URVNUUygpYCBvbmx5ICoqb25jZSoqLiBDYWxsaW5nIGl0IG1vcmUgdGhhbiBvbmNlCitjb25mbGljdHMgd2l0aCBzb21lIGFkdmFuY2VkIEdvb2dsZSBUZXN0IGZlYXR1cmVzIChlLmcuIHRocmVhZC1zYWZlIGRlYXRoCit0ZXN0cykgYW5kIHRodXMgaXMgbm90IHN1cHBvcnRlZC4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMgV3JpdGluZyB0aGUgbWFpbigpIEZ1bmN0aW9uICMKKworWW91IGNhbiBzdGFydCBmcm9tIHRoaXMgYm9pbGVycGxhdGU6CitgYGAKKyNpbmNsdWRlICJ0aGlzL3BhY2thZ2UvZm9vLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworLy8gVGhlIGZpeHR1cmUgZm9yIHRlc3RpbmcgY2xhc3MgRm9vLgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gWW91IGNhbiByZW1vdmUgYW55IG9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpZiBpdHMgYm9keQorICAvLyBpcyBlbXB0eS4KKworICBGb29UZXN0KCkgeworICAgIC8vIFlvdSBjYW4gZG8gc2V0LXVwIHdvcmsgZm9yIGVhY2ggdGVzdCBoZXJlLgorICB9CisKKyAgdmlydHVhbCB+Rm9vVGVzdCgpIHsKKyAgICAvLyBZb3UgY2FuIGRvIGNsZWFuLXVwIHdvcmsgdGhhdCBkb2Vzbid0IHRocm93IGV4Y2VwdGlvbnMgaGVyZS4KKyAgfQorCisgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBhcmUgbm90IGVub3VnaCBmb3Igc2V0dGluZyB1cAorICAvLyBhbmQgY2xlYW5pbmcgdXAgZWFjaCB0ZXN0LCB5b3UgY2FuIGRlZmluZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIENvZGUgaGVyZSB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29uc3RydWN0b3IgKHJpZ2h0CisgICAgLy8gYmVmb3JlIGVhY2ggdGVzdCkuCisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gQ29kZSBoZXJlIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVzdCAocmlnaHQKKyAgICAvLyBiZWZvcmUgdGhlIGRlc3RydWN0b3IpLgorICB9CisKKyAgLy8gT2JqZWN0cyBkZWNsYXJlZCBoZXJlIGNhbiBiZSB1c2VkIGJ5IGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIGZvciBGb28uCit9OworCisvLyBUZXN0cyB0aGF0IHRoZSBGb286OkJhcigpIG1ldGhvZCBkb2VzIEFiYy4KK1RFU1RfRihGb29UZXN0LCBNZXRob2RCYXJEb2VzQWJjKSB7CisgIGNvbnN0IHN0cmluZyBpbnB1dF9maWxlcGF0aCA9ICJ0aGlzL3BhY2thZ2UvdGVzdGRhdGEvbXlpbnB1dGZpbGUuZGF0IjsKKyAgY29uc3Qgc3RyaW5nIG91dHB1dF9maWxlcGF0aCA9ICJ0aGlzL3BhY2thZ2UvdGVzdGRhdGEvbXlvdXRwdXRmaWxlLmRhdCI7CisgIEZvbyBmOworICBFWFBFQ1RfRVEoMCwgZi5CYXIoaW5wdXRfZmlsZXBhdGgsIG91dHB1dF9maWxlcGF0aCkpOworfQorCisvLyBUZXN0cyB0aGF0IEZvbyBkb2VzIFh5ei4KK1RFU1RfRihGb29UZXN0LCBEb2VzWHl6KSB7CisgIC8vIEV4ZXJjaXNlcyB0aGUgWHl6IGZlYXR1cmUgb2YgRm9vLgorfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorYGBgCisKK1RoZSBgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpYCBmdW5jdGlvbiBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlCitUZXN0IGZsYWdzLCBhbmQgcmVtb3ZlcyBhbGwgcmVjb2duaXplZCBmbGFncy4gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCBhCit0ZXN0IHByb2dyYW0ncyBiZWhhdmlvciB2aWEgdmFyaW91cyBmbGFncywgd2hpY2ggd2UnbGwgY292ZXIgaW4gW0FkdmFuY2VkR3VpZGVdKFYxXzZfQWR2YW5jZWRHdWlkZS5tZCkuCitZb3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYFJVTl9BTExfVEVTVFMoKWAsIG9yIHRoZSBmbGFncword29uJ3QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisKK09uIFdpbmRvd3MsIGBJbml0R29vZ2xlVGVzdCgpYCBhbHNvIHdvcmtzIHdpdGggd2lkZSBzdHJpbmdzLCBzbyBpdCBjYW4gYmUgdXNlZAoraW4gcHJvZ3JhbXMgY29tcGlsZWQgaW4gYFVOSUNPREVgIG1vZGUgYXMgd2VsbC4KKworQnV0IG1heWJlIHlvdSB0aGluayB0aGF0IHdyaXRpbmcgYWxsIHRob3NlIG1haW4oKSBmdW5jdGlvbnMgaXMgdG9vIG11Y2ggd29yaz8gV2UgYWdyZWUgd2l0aCB5b3UgY29tcGxldGVseSBhbmQgdGhhdCdzIHdoeSBHb29nbGUgVGVzdCBwcm92aWRlcyBhIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIG1haW4oKS4gSWYgaXQgZml0cyB5b3VyIG5lZWRzLCB0aGVuIGp1c3QgbGluayB5b3VyIHRlc3Qgd2l0aCBndGVzdFxfbWFpbiBsaWJyYXJ5IGFuZCB5b3UgYXJlIGdvb2QgdG8gZ28uCisKKyMjIEltcG9ydGFudCBub3RlIGZvciBWaXN1YWwgQysrIHVzZXJzICMjCitJZiB5b3UgcHV0IHlvdXIgdGVzdHMgaW50byBhIGxpYnJhcnkgYW5kIHlvdXIgYG1haW4oKWAgZnVuY3Rpb24gaXMgaW4gYSBkaWZmZXJlbnQgbGlicmFyeSBvciBpbiB5b3VyIC5leGUgZmlsZSwgdGhvc2UgdGVzdHMgd2lsbCBub3QgcnVuLiBUaGUgcmVhc29uIGlzIGEgW2J1Z10oaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vZmVlZGJhY2svdmlld2ZlZWRiYWNrLmFzcHg/RmVlZGJhY2tJRD0yNDQ0MTAmc2l0ZWlkPTIxMCkgaW4gVmlzdWFsIEMrKy4gV2hlbiB5b3UgZGVmaW5lIHlvdXIgdGVzdHMsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgY2VydGFpbiBzdGF0aWMgb2JqZWN0cyB0byByZWdpc3RlciB0aGVtLiBUaGVzZSBvYmplY3RzIGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIGVsc2V3aGVyZSBidXQgdGhlaXIgY29uc3RydWN0b3JzIGFyZSBzdGlsbCBzdXBwb3NlZCB0byBydW4uIFdoZW4gVmlzdWFsIEMrKyBsaW5rZXIgc2VlcyB0aGF0IG5vdGhpbmcgaW4gdGhlIGxpYnJhcnkgaXMgcmVmZXJlbmNlZCBmcm9tIG90aGVyIHBsYWNlcyBpdCB0aHJvd3MgdGhlIGxpYnJhcnkgb3V0LiBZb3UgaGF2ZSB0byByZWZlcmVuY2UgeW91ciBsaWJyYXJ5IHdpdGggdGVzdHMgZnJvbSB5b3VyIG1haW4gcHJvZ3JhbSB0byBrZWVwIHRoZSBsaW5rZXIgZnJvbSBkaXNjYXJkaW5nIGl0LiBIZXJlIGlzIGhvdyB0byBkbyBpdC4gU29tZXdoZXJlIGluIHlvdXIgbGlicmFyeSBjb2RlIGRlY2xhcmUgYSBmdW5jdGlvbjoKK2BgYAorX19kZWNsc3BlYyhkbGxleHBvcnQpIGludCBQdWxsSW5NeUxpYnJhcnkoKSB7IHJldHVybiAwOyB9CitgYGAKK0lmIHlvdSBwdXQgeW91ciB0ZXN0cyBpbiBhIHN0YXRpYyBsaWJyYXJ5IChub3QgRExMKSB0aGVuIGBfX2RlY2xzcGVjKGRsbGV4cG9ydClgIGlzIG5vdCByZXF1aXJlZC4gTm93LCBpbiB5b3VyIG1haW4gcHJvZ3JhbSwgd3JpdGUgYSBjb2RlIHRoYXQgaW52b2tlcyB0aGF0IGZ1bmN0aW9uOgorYGBgCitpbnQgUHVsbEluTXlMaWJyYXJ5KCk7CitzdGF0aWMgaW50IGR1bW15ID0gUHVsbEluTXlMaWJyYXJ5KCk7CitgYGAKK1RoaXMgd2lsbCBrZWVwIHlvdXIgdGVzdHMgcmVmZXJlbmNlZCBhbmQgd2lsbCBtYWtlIHRoZW0gcmVnaXN0ZXIgdGhlbXNlbHZlcyBhdCBzdGFydHVwLgorCitJbiBhZGRpdGlvbiwgaWYgeW91IGRlZmluZSB5b3VyIHRlc3RzIGluIGEgc3RhdGljIGxpYnJhcnksIGFkZCBgL09QVDpOT1JFRmAgdG8geW91ciBtYWluIHByb2dyYW0gbGlua2VyIG9wdGlvbnMuIElmIHlvdSB1c2UgTVNWQysrIElERSwgZ28gdG8geW91ciAuZXhlIHByb2plY3QgcHJvcGVydGllcy9Db25maWd1cmF0aW9uIFByb3BlcnRpZXMvTGlua2VyL09wdGltaXphdGlvbiBhbmQgc2V0IFJlZmVyZW5jZXMgc2V0dGluZyB0byBgS2VlcCBVbnJlZmVyZW5jZWQgRGF0YSAoL09QVDpOT1JFRilgLiBUaGlzIHdpbGwga2VlcCBWaXN1YWwgQysrIGxpbmtlciBmcm9tIGRpc2NhcmRpbmcgaW5kaXZpZHVhbCBzeW1ib2xzIGdlbmVyYXRlZCBieSB5b3VyIHRlc3RzIGZyb20gdGhlIGZpbmFsIGV4ZWN1dGFibGUuCisKK1RoZXJlIGlzIG9uZSBtb3JlIHBpdGZhbGwsIHRob3VnaC4gSWYgeW91IHVzZSBHb29nbGUgVGVzdCBhcyBhIHN0YXRpYyBsaWJyYXJ5ICh0aGF0J3MgaG93IGl0IGlzIGRlZmluZWQgaW4gZ3Rlc3QudmNwcm9qKSB5b3VyIHRlc3RzIG11c3QgYWxzbyByZXNpZGUgaW4gYSBzdGF0aWMgbGlicmFyeS4gSWYgeW91IGhhdmUgdG8gaGF2ZSB0aGVtIGluIGEgRExMLCB5b3UgX211c3RfIGNoYW5nZSBHb29nbGUgVGVzdCB0byBidWlsZCBpbnRvIGEgRExMIGFzIHdlbGwuIE90aGVyd2lzZSB5b3VyIHRlc3RzIHdpbGwgbm90IHJ1biBjb3JyZWN0bHkgb3Igd2lsbCBub3QgcnVuIGF0IGFsbC4gVGhlIGdlbmVyYWwgY29uY2x1c2lvbiBoZXJlIGlzOiBtYWtlIHlvdXIgbGlmZSBlYXNpZXIgLSBkbyBub3Qgd3JpdGUgeW91ciB0ZXN0cyBpbiBsaWJyYXJpZXMhCisKKyMgV2hlcmUgdG8gR28gZnJvbSBIZXJlICMKKworQ29uZ3JhdHVsYXRpb25zISBZb3UndmUgbGVhcm5lZCB0aGUgR29vZ2xlIFRlc3QgYmFzaWNzLiBZb3UgY2FuIHN0YXJ0IHdyaXRpbmcKK2FuZCBydW5uaW5nIEdvb2dsZSBUZXN0IHRlc3RzLCByZWFkIHNvbWUgW3NhbXBsZXNdKFYxXzZfU2FtcGxlcy5tZCksIG9yIGNvbnRpbnVlIHdpdGgKK1tBZHZhbmNlZEd1aWRlXShWMV82X0FkdmFuY2VkR3VpZGUubWQpLCB3aGljaCBkZXNjcmliZXMgbWFueSBtb3JlIHVzZWZ1bCBHb29nbGUgVGVzdCBmZWF0dXJlcy4KKworIyBLbm93biBMaW1pdGF0aW9ucyAjCisKK0dvb2dsZSBUZXN0IGlzIGRlc2lnbmVkIHRvIGJlIHRocmVhZC1zYWZlLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzCit0aHJlYWQtc2FmZSBvbiBzeXN0ZW1zIHdoZXJlIHRoZSBgcHRocmVhZHNgIGxpYnJhcnkgaXMgYXZhaWxhYmxlLiAgSXQKK2lzIGN1cnJlbnRseSBfdW5zYWZlXyB0byB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBmcm9tIHR3byB0aHJlYWRzCitjb25jdXJyZW50bHkgb24gb3RoZXIgc3lzdGVtcyAoZS5nLiBXaW5kb3dzKS4gIEluIG1vc3QgdGVzdHMgdGhpcyBpcworbm90IGFuIGlzc3VlIGFzIHVzdWFsbHkgdGhlIGFzc2VydGlvbnMgYXJlIGRvbmUgaW4gdGhlIG1haW4gdGhyZWFkLiBJZgoreW91IHdhbnQgdG8gaGVscCwgeW91IGNhbiB2b2x1bnRlZXIgdG8gaW1wbGVtZW50IHRoZSBuZWNlc3NhcnkKK3N5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGluIGBndGVzdC1wb3J0LmhgIGZvciB5b3VyIHBsYXRmb3JtLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfUHVtcE1hbnVhbC5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfUHVtcE1hbnVhbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZjZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNl9QdW1wTWFudWFsLm1kCkBAIC0wLDAgKzEsMTc3IEBACisKKworPGI+UDwvYj51bXAgaXMgPGI+VTwvYj5zZWZ1bCBmb3IgPGI+TTwvYj5ldGEgPGI+UDwvYj5yb2dyYW1taW5nLgorCisjIFRoZSBQcm9ibGVtICMKKworVGVtcGxhdGUgYW5kIG1hY3JvIGxpYnJhcmllcyBvZnRlbiBuZWVkIHRvIGRlZmluZSBtYW55IGNsYXNzZXMsCitmdW5jdGlvbnMsIG9yIG1hY3JvcyB0aGF0IHZhcnkgb25seSAob3IgYWxtb3N0IG9ubHkpIGluIHRoZSBudW1iZXIgb2YKK2FyZ3VtZW50cyB0aGV5IHRha2UuIEl0J3MgYSBsb3Qgb2YgcmVwZXRpdGl2ZSwgbWVjaGFuaWNhbCwgYW5kCitlcnJvci1wcm9uZSB3b3JrLgorCitWYXJpYWRpYyB0ZW1wbGF0ZXMgYW5kIHZhcmlhZGljIG1hY3JvcyBjYW4gYWxsZXZpYXRlIHRoZSBwcm9ibGVtLgorSG93ZXZlciwgd2hpbGUgYm90aCBhcmUgYmVpbmcgY29uc2lkZXJlZCBieSB0aGUgQysrIGNvbW1pdHRlZSwgbmVpdGhlcgoraXMgaW4gdGhlIHN0YW5kYXJkIHlldCBvciB3aWRlbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVycy4gIFRodXMgdGhleQorYXJlIG9mdGVuIG5vdCBhIGdvb2QgY2hvaWNlLCBlc3BlY2lhbGx5IHdoZW4geW91ciBjb2RlIG5lZWRzIHRvIGJlCitwb3J0YWJsZS4gQW5kIHRoZWlyIGNhcGFiaWxpdGllcyBhcmUgc3RpbGwgbGltaXRlZC4KKworQXMgYSByZXN1bHQsIGF1dGhvcnMgb2Ygc3VjaCBsaWJyYXJpZXMgb2Z0ZW4gaGF2ZSB0byB3cml0ZSBzY3JpcHRzIHRvCitnZW5lcmF0ZSB0aGVpciBpbXBsZW1lbnRhdGlvbi4gSG93ZXZlciwgb3VyIGV4cGVyaWVuY2UgaXMgdGhhdCBpdCdzCit0ZWRpb3VzIHRvIHdyaXRlIHN1Y2ggc2NyaXB0cywgd2hpY2ggdGVuZCB0byByZWZsZWN0IHRoZSBzdHJ1Y3R1cmUgb2YKK3RoZSBnZW5lcmF0ZWQgY29kZSBwb29ybHkgYW5kIGFyZSBvZnRlbiBoYXJkIHRvIHJlYWQgYW5kIGVkaXQuIEZvcgorZXhhbXBsZSwgYSBzbWFsbCBjaGFuZ2UgbmVlZGVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBtYXkgcmVxdWlyZSBzb21lCitub24taW50dWl0aXZlLCBub24tdHJpdmlhbCBjaGFuZ2VzIGluIHRoZSBzY3JpcHQuIFRoaXMgaXMgZXNwZWNpYWxseQorcGFpbmZ1bCB3aGVuIGV4cGVyaW1lbnRpbmcgd2l0aCB0aGUgY29kZS4KKworIyBPdXIgU29sdXRpb24gIworCitQdW1wIChmb3IgUHVtcCBpcyBVc2VmdWwgZm9yIE1ldGEgUHJvZ3JhbW1pbmcsIFByZXR0eSBVc2VmdWwgZm9yIE1ldGEKK1Byb2dyYW1taW5nLCBvciBQcmFjdGljYWwgVXRpbGl0eSBmb3IgTWV0YSBQcm9ncmFtbWluZywgd2hpY2hldmVyIHlvdQorcHJlZmVyKSBpcyBhIHNpbXBsZSBtZXRhLXByb2dyYW1taW5nIHRvb2wgZm9yIEMrKy4gVGhlIGlkZWEgaXMgdGhhdCBhCitwcm9ncmFtbWVyIHdyaXRlcyBhIGBmb28ucHVtcGAgZmlsZSB3aGljaCBjb250YWlucyBDKysgY29kZSBwbHVzIG1ldGEKK2NvZGUgdGhhdCBtYW5pcHVsYXRlcyB0aGUgQysrIGNvZGUuIFRoZSBtZXRhIGNvZGUgY2FuIGhhbmRsZQoraXRlcmF0aW9ucyBvdmVyIGEgcmFuZ2UsIG5lc3RlZCBpdGVyYXRpb25zLCBsb2NhbCBtZXRhIHZhcmlhYmxlCitkZWZpbml0aW9ucywgc2ltcGxlIGFyaXRobWV0aWMsIGFuZCBjb25kaXRpb25hbCBleHByZXNzaW9ucy4gWW91IGNhbgordmlldyBpdCBhcyBhIHNtYWxsIERvbWFpbi1TcGVjaWZpYyBMYW5ndWFnZS4gVGhlIG1ldGEgbGFuZ3VhZ2UgaXMKK2Rlc2lnbmVkIHRvIGJlIG5vbi1pbnRydXNpdmUgKHMudC4gaXQgd29uJ3QgY29uZnVzZSBFbWFjcycgQysrIG1vZGUsCitmb3IgZXhhbXBsZSkgYW5kIGNvbmNpc2UsIG1ha2luZyBQdW1wIGNvZGUgaW50dWl0aXZlIGFuZCBlYXN5IHRvCittYWludGFpbi4KKworIyMgSGlnaGxpZ2h0cyAjIworCisgICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGluIGEgc2luZ2xlIFB5dGhvbiBzY3JpcHQgYW5kIHRodXMgdWx0cmEgcG9ydGFibGU6IG5vIGJ1aWxkIG9yIGluc3RhbGxhdGlvbiBpcyBuZWVkZWQgYW5kIGl0IHdvcmtzIGNyb3NzIHBsYXRmb3Jtcy4KKyAgKiBQdW1wIHRyaWVzIHRvIGJlIHNtYXJ0IHdpdGggcmVzcGVjdCB0byBbR29vZ2xlJ3Mgc3R5bGUgZ3VpZGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtc3R5bGVndWlkZS8pOiBpdCBicmVha3MgbG9uZyBsaW5lcyAoZWFzeSB0byBoYXZlIHdoZW4gdGhleSBhcmUgZ2VuZXJhdGVkKSBhdCBhY2NlcHRhYmxlIHBsYWNlcyB0byBmaXQgd2l0aGluIDgwIGNvbHVtbnMgYW5kIGluZGVudCB0aGUgY29udGludWF0aW9uIGxpbmVzIGNvcnJlY3RseS4KKyAgKiBUaGUgZm9ybWF0IGlzIGh1bWFuLXJlYWRhYmxlIGFuZCBtb3JlIGNvbmNpc2UgdGhhbiBYTUwuCisgICogVGhlIGZvcm1hdCB3b3JrcyByZWxhdGl2ZWx5IHdlbGwgd2l0aCBFbWFjcycgQysrIG1vZGUuCisKKyMjIEV4YW1wbGVzICMjCisKK1RoZSBmb2xsb3dpbmcgUHVtcCBjb2RlICh3aGVyZSBtZXRhIGtleXdvcmRzIHN0YXJ0IHdpdGggYCRgLCBgW1tgIGFuZCBgXV1gIGFyZSBtZXRhIGJyYWNrZXRzLCBhbmQgYCQkYCBzdGFydHMgYSBtZXRhIGNvbW1lbnQgdGhhdCBlbmRzIHdpdGggdGhlIGxpbmUpOgorCitgYGAKKyR2YXIgbiA9IDMgICAgICQkIERlZmluZXMgYSBtZXRhIHZhcmlhYmxlIG4uCiskcmFuZ2UgaSAwLi5uICAkJCBEZWNsYXJlcyB0aGUgcmFuZ2Ugb2YgbWV0YSBpdGVyYXRvciBpIChpbmNsdXNpdmUpLgorJGZvciBpIFtbCisgICAgICAgICAgICAgICAkJCBNZXRhIGxvb3AuCisvLyBGb28kaSBkb2VzIGJsYWggZm9yICRpLWFyeSBwcmVkaWNhdGVzLgorJHJhbmdlIGogMS4uaQordGVtcGxhdGUgPHNpemVfdCBOICRmb3IgaiBbWywgdHlwZW5hbWUgQSRqXV0+CitjbGFzcyBGb28kaSB7CiskaWYgaSA9PSAwIFtbCisgIGJsYWggYTsKK11dICRlbGlmIGkgPD0gMiBbWworICBibGFoIGI7CitdXSAkZWxzZSBbWworICBibGFoIGM7CitdXQorfTsKKworXV0KK2BgYAorCit3aWxsIGJlIHRyYW5zbGF0ZWQgYnkgdGhlIFB1bXAgY29tcGlsZXIgdG86CisKK2BgYAorLy8gRm9vMCBkb2VzIGJsYWggZm9yIDAtYXJ5IHByZWRpY2F0ZXMuCit0ZW1wbGF0ZSA8c2l6ZV90IE4+CitjbGFzcyBGb28wIHsKKyAgYmxhaCBhOworfTsKKworLy8gRm9vMSBkb2VzIGJsYWggZm9yIDEtYXJ5IHByZWRpY2F0ZXMuCit0ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIEExPgorY2xhc3MgRm9vMSB7CisgIGJsYWggYjsKK307CisKKy8vIEZvbzIgZG9lcyBibGFoIGZvciAyLWFyeSBwcmVkaWNhdGVzLgordGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+CitjbGFzcyBGb28yIHsKKyAgYmxhaCBiOworfTsKKworLy8gRm9vMyBkb2VzIGJsYWggZm9yIDMtYXJ5IHByZWRpY2F0ZXMuCit0ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+CitjbGFzcyBGb28zIHsKKyAgYmxhaCBjOworfTsKK2BgYAorCitJbiBhbm90aGVyIGV4YW1wbGUsCisKK2BgYAorJHJhbmdlIGkgMS4ubgorRnVuYygkZm9yIGkgKyBbW2EkaV1dKTsKKyQkIFRoZSB0ZXh0IGJldHdlZW4gaSBhbmQgW1sgaXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIGl0ZXJhdGlvbnMuCitgYGAKKword2lsbCBnZW5lcmF0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaW5lcyAod2l0aG91dCB0aGUgY29tbWVudHMpLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGBuYDoKKworYGBgCitGdW5jKCk7ICAgICAgICAgICAgICAvLyBJZiBuIGlzIDAuCitGdW5jKGExKTsgICAgICAgICAgICAvLyBJZiBuIGlzIDEuCitGdW5jKGExICsgYTIpOyAgICAgICAvLyBJZiBuIGlzIDIuCitGdW5jKGExICsgYTIgKyBhMyk7ICAvLyBJZiBuIGlzIDMuCisvLyBBbmQgc28gb24uLi4KK2BgYAorCisjIyBDb25zdHJ1Y3RzICMjCisKK1dlIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtZXRhIHByb2dyYW1taW5nIGNvbnN0cnVjdHM6CisKK3wgYCR2YXIgaWQgPSBleHBgIHwgRGVmaW5lcyBhIG5hbWVkIGNvbnN0YW50IHZhbHVlLiBgJGlkYCBpcyB2YWxpZCB1dGlsIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWV0YSBsZXhpY2FsIGJsb2NrLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgJHJhbmdlIGlkIGV4cC4uZXhwYCB8IFNldHMgdGhlIHJhbmdlIG9mIGFuIGl0ZXJhdGlvbiB2YXJpYWJsZSwgd2hpY2ggY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBsb29wcyBsYXRlci4gICAgICAgICAgfAorfCBgJGZvciBpZCBzZXAgW1sgY29kZSBdXWAgfCBJdGVyYXRpb24uIFRoZSByYW5nZSBvZiBgaWRgIG11c3QgaGF2ZSBiZWVuIGRlZmluZWQgZWFybGllci4gYCRpZGAgaXMgdmFsaWQgaW4gYGNvZGVgLiAgICAgICAgIHwKK3wgYCQoJClgICAgICAgICAgIHwgR2VuZXJhdGVzIGEgc2luZ2xlIGAkYCBjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGAkaWRgICAgICAgICAgICB8IFZhbHVlIG9mIHRoZSBuYW1lZCBjb25zdGFudCBvciBpdGVyYXRpb24gdmFyaWFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgJChleHApYCAgICAgICAgfCBWYWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYCRpZiBleHAgW1sgY29kZSBdXSBlbHNlX2JyYW5jaGAgfCBDb25kaXRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYFtbIGNvZGUgXV1gICAgIHwgTWV0YSBsZXhpY2FsIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBjcHBfY29kZWAgICAgICB8IFJhdyBDKysgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgJCQgY29tbWVudGAgICAgfCBNZXRhIGNvbW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworKipOb3RlOioqIFRvIGdpdmUgdGhlIHVzZXIgc29tZSBmcmVlZG9tIGluIGZvcm1hdHRpbmcgdGhlIFB1bXAgc291cmNlCitjb2RlLCBQdW1wIGlnbm9yZXMgYSBuZXctbGluZSBjaGFyYWN0ZXIgaWYgaXQncyByaWdodCBhZnRlciBgJGZvciBmb29gCitvciBuZXh0IHRvIGBbW2Agb3IgYF1dYC4gV2l0aG91dCB0aGlzIHJ1bGUgeW91J2xsIG9mdGVuIGJlIGZvcmNlZCB0byB3cml0ZQordmVyeSBsb25nIGxpbmVzIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQuIFRoZXJlZm9yZSBzb21ldGltZXMgeW91IG1heQorbmVlZCB0byBpbnNlcnQgYW4gZXh0cmEgbmV3LWxpbmUgaW4gc3VjaCBwbGFjZXMgZm9yIGEgbmV3LWxpbmUgdG8gc2hvdwordXAgaW4geW91ciBvdXRwdXQuCisKKyMjIEdyYW1tYXIgIyMKKworYGBgCitjb2RlIDo6PSBhdG9taWNfY29kZSoKK2F0b21pY19jb2RlIDo6PSAkdmFyIGlkID0gZXhwCisgICAgfCAkdmFyIGlkID0gW1sgY29kZSBdXQorICAgIHwgJHJhbmdlIGlkIGV4cC4uZXhwCisgICAgfCAkZm9yIGlkIHNlcCBbWyBjb2RlIF1dCisgICAgfCAkKCQpCisgICAgfCAkaWQKKyAgICB8ICQoZXhwKQorICAgIHwgJGlmIGV4cCBbWyBjb2RlIF1dIGVsc2VfYnJhbmNoCisgICAgfCBbWyBjb2RlIF1dCisgICAgfCBjcHBfY29kZQorc2VwIDo6PSBjcHBfY29kZSB8IGVtcHR5X3N0cmluZworZWxzZV9icmFuY2ggOjo9ICRlbHNlIFtbIGNvZGUgXV0KKyAgICB8ICRlbGlmIGV4cCBbWyBjb2RlIF1dIGVsc2VfYnJhbmNoCisgICAgfCBlbXB0eV9zdHJpbmcKK2V4cCA6Oj0gc2ltcGxlX2V4cHJlc3Npb25faW5fUHl0aG9uX3N5bnRheAorYGBgCisKKyMjIENvZGUgIyMKKworWW91IGNhbiBmaW5kIHRoZSBzb3VyY2UgY29kZSBvZiBQdW1wIGluIFtzY3JpcHRzL3B1bXAucHldKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2NyaXB0cy9wdW1wLnB5KS4gSXQgaXMgc3RpbGwKK3ZlcnkgdW5wb2xpc2hlZCBhbmQgbGFja3MgYXV0b21hdGVkIHRlc3RzLCBhbHRob3VnaCBpdCBoYXMgYmVlbgorc3VjY2Vzc2Z1bGx5IHVzZWQgbWFueSB0aW1lcy4gSWYgeW91IGZpbmQgYSBjaGFuY2UgdG8gdXNlIGl0IGluIHlvdXIKK3Byb2plY3QsIHBsZWFzZSBsZXQgdXMga25vdyB3aGF0IHlvdSB0aGluayEgIFdlIGFsc28gd2VsY29tZSBoZWxwIG9uCitpbXByb3ZpbmcgUHVtcC4KKworIyMgUmVhbCBFeGFtcGxlcyAjIworCitZb3UgY2FuIGZpbmQgcmVhbC13b3JsZCBhcHBsaWNhdGlvbnMgb2YgUHVtcCBpbiBbR29vZ2xlIFRlc3RdKGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jb2Rlc2VhcmNoP3E9ZmlsZSUzQVwucHVtcCUyNCtwYWNrYWdlJTNBaHR0cCUzQSUyRiUyRmdvb2dsZXRlc3RcLmdvb2dsZWNvZGVcLmNvbSkgYW5kIFtHb29nbGUgTW9ja10oaHR0cDovL3d3dy5nb29nbGUuY29tL2NvZGVzZWFyY2g/cT1maWxlJTNBXC5wdW1wJTI0K3BhY2thZ2UlM0FodHRwJTNBJTJGJTJGZ29vZ2xlbW9ja1wuZ29vZ2xlY29kZVwuY29tKS4gIFRoZSBzb3VyY2UgZmlsZSBgZm9vLmgucHVtcGAgZ2VuZXJhdGVzIGBmb28uaGAuCisKKyMjIFRpcHMgIyMKKworICAqIElmIGEgbWV0YSB2YXJpYWJsZSBpcyBmb2xsb3dlZCBieSBhIGxldHRlciBvciBkaWdpdCwgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIHVzaW5nIGBbW11dYCwgd2hpY2ggaW5zZXJ0cyBhbiBlbXB0eSBzdHJpbmcuIEZvciBleGFtcGxlIGBGb28kaltbXV1IZWxwZXJgIGdlbmVyYXRlIGBGb28xSGVscGVyYCB3aGVuIGBqYCBpcyAxLgorICAqIFRvIGF2b2lkIGV4dHJhLWxvbmcgUHVtcCBzb3VyY2UgbGluZXMsIHlvdSBjYW4gYnJlYWsgYSBsaW5lIGFueXdoZXJlIHlvdSB3YW50IGJ5IGluc2VydGluZyBgW1tdXWAgZm9sbG93ZWQgYnkgYSBuZXcgbGluZS4gU2luY2UgYW55IG5ldy1saW5lIGNoYXJhY3RlciBuZXh0IHRvIGBbW2Agb3IgYF1dYCBpcyBpZ25vcmVkLCB0aGUgZ2VuZXJhdGVkIGNvZGUgd29uJ3QgY29udGFpbiB0aGlzIG5ldyBsaW5lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfU2FtcGxlcy5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfU2FtcGxlcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTIyNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNl9TYW1wbGVzLm1kCkBAIC0wLDAgKzEsMTQgQEAKK0lmIHlvdSdyZSBsaWtlIHVzLCB5b3UnZCBsaWtlIHRvIGxvb2sgYXQgc29tZSBHb29nbGUgVGVzdCBzYW1wbGUgY29kZS4gIFRoZQorW3NhbXBsZXMgZm9sZGVyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlLyNzdm4vdHJ1bmsvc2FtcGxlcykgaGFzIGEgbnVtYmVyIG9mIHdlbGwtY29tbWVudGVkIHNhbXBsZXMgc2hvd2luZyBob3cgdG8gdXNlIGEKK3ZhcmlldHkgb2YgR29vZ2xlIFRlc3QgZmVhdHVyZXMuCisKKyAgKiBbU2FtcGxlICMxXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYykgc2hvd3MgdGhlIGJhc2ljIHN0ZXBzIG9mIHVzaW5nIEdvb2dsZSBUZXN0IHRvIHRlc3QgQysrIGZ1bmN0aW9ucy4KKyAgKiBbU2FtcGxlICMyXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYykgc2hvd3MgYSBtb3JlIGNvbXBsZXggdW5pdCB0ZXN0IGZvciBhIGNsYXNzIHdpdGggbXVsdGlwbGUgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgKiBbU2FtcGxlICMzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlM191bml0dGVzdC5jYykgdXNlcyBhIHRlc3QgZml4dHVyZS4KKyAgKiBbU2FtcGxlICM0XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlNF91bml0dGVzdC5jYykgaXMgYW5vdGhlciBiYXNpYyBleGFtcGxlIG9mIHVzaW5nIEdvb2dsZSBUZXN0LgorICAqIFtTYW1wbGUgIzVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjKSB0ZWFjaGVzIGhvdyB0byByZXVzZSBhIHRlc3QgZml4dHVyZSBpbiBtdWx0aXBsZSB0ZXN0IGNhc2VzIGJ5IGRlcml2aW5nIHN1Yi1maXh0dXJlcyBmcm9tIGl0LgorICAqIFtTYW1wbGUgIzZdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjKSBkZW1vbnN0cmF0ZXMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorICAqIFtTYW1wbGUgIzddKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjKSB0ZWFjaGVzIHRoZSBiYXNpY3Mgb2YgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgKiBbU2FtcGxlICM4XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYykgc2hvd3MgdXNpbmcgYENvbWJpbmUoKWAgaW4gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgKiBbU2FtcGxlICM5XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlOV91bml0dGVzdC5jYykgc2hvd3MgdXNlIG9mIHRoZSBsaXN0ZW5lciBBUEkgdG8gbW9kaWZ5IEdvb2dsZSBUZXN0J3MgY29uc29sZSBvdXRwdXQgYW5kIHRoZSB1c2Ugb2YgaXRzIHJlZmxlY3Rpb24gQVBJIHRvIGluc3BlY3QgdGVzdCByZXN1bHRzLgorICAqIFtTYW1wbGUgIzEwXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QuY2MpIHNob3dzIHVzZSBvZiB0aGUgbGlzdGVuZXIgQVBJIHRvIGltcGxlbWVudCBhIHByaW1pdGl2ZSBtZW1vcnkgbGVhayBjaGVja2VyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfWGNvZGVHdWlkZS5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzZfWGNvZGVHdWlkZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI0YmY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfNl9YY29kZUd1aWRlLm1kCkBAIC0wLDAgKzEsOTMgQEAKKworCitUaGlzIGd1aWRlIHdpbGwgZXhwbGFpbiBob3cgdG8gdXNlIHRoZSBHb29nbGUgVGVzdGluZyBGcmFtZXdvcmsgaW4geW91ciBYY29kZSBwcm9qZWN0cyBvbiBNYWMgT1MgWC4gVGhpcyB0dXRvcmlhbCBiZWdpbnMgYnkgcXVpY2tseSBleHBsYWluaW5nIHdoYXQgdG8gZG8gZm9yIGV4cGVyaWVuY2VkIHVzZXJzLiBBZnRlciB0aGUgcXVpY2sgc3RhcnQsIHRoZSBndWlkZSBnb2VzIHByb3ZpZGVzIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gYWJvdXQgZWFjaCBzdGVwLgorCisjIFF1aWNrIFN0YXJ0ICMKKworSGVyZSBpcyB0aGUgcXVpY2sgZ3VpZGUgZm9yIHVzaW5nIEdvb2dsZSBUZXN0IGluIHlvdXIgWGNvZGUgcHJvamVjdC4KKworICAxLiBEb3dubG9hZCB0aGUgc291cmNlIGZyb20gdGhlIFt3ZWJzaXRlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdCkgdXNpbmcgdGhpcyBjb21tYW5kOiBgc3ZuIGNoZWNrb3V0IGh0dHA6Ly9nb29nbGV0ZXN0Lmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay8gZ29vZ2xldGVzdC1yZWFkLW9ubHlgCisgIDEuIE9wZW4gdXAgdGhlIGBndGVzdC54Y29kZXByb2pgIGluIHRoZSBgZ29vZ2xldGVzdC1yZWFkLW9ubHkveGNvZGUvYCBkaXJlY3RvcnkgYW5kIGJ1aWxkIHRoZSBndGVzdC5mcmFtZXdvcmsuCisgIDEuIENyZWF0ZSBhIG5ldyAiU2hlbGwgVG9vbCIgdGFyZ2V0IGluIHlvdXIgWGNvZGUgcHJvamVjdCBjYWxsZWQgc29tZXRoaW5nIGxpa2UgIlVuaXRUZXN0cyIKKyAgMS4gQWRkIHRoZSBndGVzdC5mcmFtZXdvcmsgdG8geW91ciBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gdGhlICJMaW5rIEJpbmFyeSB3aXRoIExpYnJhcmllcyIgYnVpbGQgcGhhc2Ugb2YgIlVuaXRUZXN0cyIKKyAgMS4gQWRkIHlvdXIgdW5pdCB0ZXN0IHNvdXJjZSBjb2RlIHRvIHRoZSAiQ29tcGlsZSBTb3VyY2VzIiBidWlsZCBwaGFzZSBvZiAiVW5pdFRlc3RzIgorICAxLiBFZGl0IHRoZSAiVW5pdFRlc3RzIiBleGVjdXRhYmxlIGFuZCBhZGQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZWQgIkRZTERcX0ZSQU1FV09SS1xfUEFUSCIgd2l0aCBhIHZhbHVlIGVxdWFsIHRvIHRoZSBwYXRoIHRvIHRoZSBmcmFtZXdvcmsgY29udGFpbmluZyB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHJlbGF0aXZlIHRvIHRoZSBjb21waWxlZCBleGVjdXRhYmxlLgorICAxLiBCdWlsZCBhbmQgR28KKworVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBmdXJ0aGVyIGV4cGxhaW4gZWFjaCBvZiB0aGUgc3RlcHMgbGlzdGVkIGFib3ZlIGluIGRlcHRoLCBkZXNjcmliaW5nIGluIG1vcmUgZGV0YWlsIGhvdyB0byBjb21wbGV0ZSBpdCBpbmNsdWRpbmcgc29tZSB2YXJpYXRpb25zLgorCisjIEdldCB0aGUgU291cmNlICMKKworQ3VycmVudGx5LCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIGRpc2N1c3NlZCBoZXJlIGlzbid0IGF2YWlsYWJsZSBpbiBhIHRhZ2dlZCByZWxlYXNlIG9mIEdvb2dsZSBUZXN0LCBpdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgdHJ1bmsuIEFzIGV4cGxhaW5lZCBhdCB0aGUgR29vZ2xlIFRlc3QgW3NpdGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9jaGVja291dCI+c3ZuKSwgeW91IGNhbiBnZXQgdGhlIGNvZGUgZnJvbSBhbm9ueW1vdXMgU1ZOIHdpdGggdGhpcyBjb21tYW5kOgorCitgYGAKK3N2biBjaGVja291dCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvIGdvb2dsZXRlc3QtcmVhZC1vbmx5CitgYGAKKworQWx0ZXJuYXRpdmVseSwgaWYgeW91IGFyZSB3b3JraW5nIHdpdGggU3VidmVyc2lvbiBpbiB5b3VyIG93biBjb2RlIGJhc2UsIHlvdSBjYW4gYWRkIEdvb2dsZSBUZXN0IGFzIGFuIGV4dGVybmFsIGRlcGVuZGVuY3kgdG8geW91ciBvd24gU3VidmVyc2lvbiByZXBvc2l0b3J5LiBCeSBmb2xsb3dpbmcgdGhpcyBhcHByb2FjaCwgZXZlcnlvbmUgdGhhdCBjaGVja3Mgb3V0IHlvdXIgc3ZuIHJlcG9zaXRvcnkgd2lsbCBhbHNvIHJlY2VpdmUgYSBjb3B5IG9mIEdvb2dsZSBUZXN0IChhIHNwZWNpZmljIHZlcnNpb24sIGlmIHlvdSB3aXNoKSB3aXRob3V0IGhhdmluZyB0byBjaGVjayBpdCBvdXQgZXhwbGljaXRseS4gVGhpcyBtYWtlcyB0aGUgc2V0IHVwIG9mIHlvdXIgcHJvamVjdCBzaW1wbGVyIGFuZCByZWR1Y2VzIHRoZSBjb3BpZWQgY29kZSBpbiB0aGUgcmVwb3NpdG9yeS4KKworVG8gdXNlIGBzdm46ZXh0ZXJuYWxzYCwgZGVjaWRlIHdoZXJlIHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgdGhlIGV4dGVybmFsIHNvdXJjZSByZXNpZGUuIFlvdSBtaWdodCBjaG9vc2UgdG8gcHV0IHRoZSBleHRlcm5hbCBzb3VyY2UgaW5zaWRlIHRoZSB0cnVuaywgYmVjYXVzZSB5b3Ugd2FudCBpdCB0byBiZSBwYXJ0IG9mIHRoZSBicmFuY2ggd2hlbiB5b3UgbWFrZSBhIHJlbGVhc2UuIEhvd2V2ZXIsIGtlZXBpbmcgaXQgb3V0c2lkZSB0aGUgdHJ1bmsgaW4gYSB2ZXJzaW9uLXRhZ2dlZCBkaXJlY3RvcnkgY2FsbGVkIHNvbWV0aGluZyBsaWtlIGB0aGlyZC1wYXJ0eS9nb29nbGV0ZXN0LzEuMC4xYCwgaXMgYW5vdGhlciBvcHRpb24uIE9uY2UgdGhlIGxvY2F0aW9uIGlzIGVzdGFibGlzaGVkLCB1c2UgYHN2biBwcm9wZWRpdCBzdm46ZXh0ZXJuYWxzIF9kaXJlY3RvcnlfYCB0byBzZXQgdGhlIHN2bjpleHRlcm5hbHMgcHJvcGVydHkgb24gYSBkaXJlY3RvcnkgaW4geW91ciByZXBvc2l0b3J5LiBUaGlzIGRpcmVjdG9yeSB3b24ndCBjb250YWluIHRoZSBjb2RlLCBidXQgYmUgaXRzIHZlcnNpb25lZCBwYXJlbnQgZGlyZWN0b3J5LgorCitUaGUgY29tbWFuZCBgc3ZuIHByb3BlZGl0YCB3aWxsIGJyaW5nIHVwIHlvdXIgU3VidmVyc2lvbiBlZGl0b3IsIG1ha2luZyBlZGl0aW5nIHRoZSBsb25nLCAocG90ZW50aWFsbHkgbXVsdGktbGluZSkgcHJvcGVydHkgc2ltcGxlci4gVGhpcyBzYW1lIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjaGVjayBvdXQgYSB0YWdnZWQgYnJhbmNoLCBieSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVVJMIChlLmcuIGBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdGFncy9yZWxlYXNlLTEuMC4xYCkuIEFkZGl0aW9uYWxseSwgdGhlIHN2bjpleHRlcm5hbHMgcHJvcGVydHkgYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgcGFydGljdWxhciByZXZpc2lvbiBvZiB0aGUgdHJ1bmsgd2l0aCB0aGUgYC1yXyMjX2Agb3B0aW9uIChlLmcuIGBleHRlcm5hbHMvc3JjL2dvb2dsZXRlc3QgLXI2MCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmtgKS4KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIHRoZSBzdm46ZXh0ZXJuYWxzIHByb3BlcnRpZXMgb24gYSB0cnVuayAocmVhZCB2aWEgYHN2biBwcm9wZ2V0YCkgb2YgYSBwcm9qZWN0LiBUaGlzIHZhbHVlIGNoZWNrcyBvdXQgYSBjb3B5IG9mIEdvb2dsZSBUZXN0IGludG8gdGhlIGB0cnVuay9leHRlcm5hbHMvc3JjL2dvb2dsZXRlc3QvYCBkaXJlY3RvcnkuCisKK2BgYAorW0NvbXB1dGVyOnN2bl0gdXNlciQgc3ZuIHByb3BnZXQgc3ZuOmV4dGVybmFscyB0cnVuaworZXh0ZXJuYWxzL3NyYy9nb29nbGV0ZXN0IGh0dHA6Ly9nb29nbGV0ZXN0Lmdvb2dsZWNvZGUuY29tL3N2bi90cnVuaworYGBgCisKKyMgQWRkIHRoZSBGcmFtZXdvcmsgdG8gWW91ciBQcm9qZWN0ICMKKworVGhlIG5leHQgc3RlcCBpcyB0byBidWlsZCBhbmQgYWRkIHRoZSBndGVzdC5mcmFtZXdvcmsgdG8geW91ciBvd24gcHJvamVjdC4gVGhpcyBndWlkZSBkZXNjcmliZXMgdHdvIGNvbW1vbiB3YXlzIGJlbG93LgorCisgICogKipPcHRpb24gMSoqIC0tLSBUaGUgc2ltcGxlc3Qgd2F5IHRvIGFkZCBHb29nbGUgVGVzdCB0byB5b3VyIG93biBwcm9qZWN0LCBpcyB0byBvcGVuIGd0ZXN0Lnhjb2RlcHJvaiAoZm91bmQgaW4gdGhlIHhjb2RlLyBkaXJlY3Rvcnkgb2YgdGhlIEdvb2dsZSBUZXN0IHRydW5rKSBhbmQgYnVpbGQgdGhlIGZyYW1ld29yayBtYW51YWxseS4gVGhlbiwgYWRkIHRoZSBidWlsdCBmcmFtZXdvcmsgaW50byB5b3VyIHByb2plY3QgdXNpbmcgdGhlICJBZGQtPkV4aXN0aW5nIEZyYW1ld29yay4uLiIgZnJvbSB0aGUgY29udGV4dCBtZW51IG9yICJQcm9qZWN0LT5BZGQuLi4iIGZyb20gdGhlIG1haW4gbWVudS4gVGhlIGd0ZXN0LmZyYW1ld29yayBpcyByZWxvY2F0YWJsZSBhbmQgY29udGFpbnMgdGhlIGhlYWRlcnMgYW5kIG9iamVjdCBjb2RlIHRoYXQgeW91J2xsIG5lZWQgdG8gbWFrZSB0ZXN0cy4gVGhpcyBtZXRob2QgcmVxdWlyZXMgcmVidWlsZGluZyBldmVyeSB0aW1lIHlvdSB1cGdyYWRlIEdvb2dsZSBUZXN0IGluIHlvdXIgcHJvamVjdC4KKyAgKiAqKk9wdGlvbiAyKiogLS0tIElmIHlvdSBhcmUgZ29pbmcgdG8gYmUgbGl2aW5nIG9mZiB0aGUgdHJ1bmsgb2YgR29vZ2xlIFRlc3QsIGluY29ycG9yYXRpbmcgaXRzIGxhdGVzdCBmZWF0dXJlcyBpbnRvIHlvdXIgdW5pdCB0ZXN0cyAob3IgYXJlIGEgR29vZ2xlIFRlc3QgZGV2ZWxvcGVyIHlvdXJzZWxmKS4gWW91J2xsIHdhbnQgdG8gcmVidWlsZCB0aGUgZnJhbWV3b3JrIGV2ZXJ5IHRpbWUgdGhlIHNvdXJjZSB1cGRhdGVzLiB0byBkbyB0aGlzLCB5b3UnbGwgbmVlZCB0byBhZGQgdGhlIGd0ZXN0Lnhjb2RlcHJvaiBmaWxlLCBub3QgdGhlIGZyYW1ld29yayBpdHNlbGYsIHRvIHlvdXIgb3duIFhjb2RlIHByb2plY3QuIFRoZW4sIGZyb20gdGhlIGJ1aWxkIHByb2R1Y3RzIHRoYXQgYXJlIHJldmVhbGVkIGJ5IHRoZSBwcm9qZWN0J3MgZGlzY2xvc3VyZSB0cmlhbmdsZSwgeW91IGNhbiBmaW5kIHRoZSBndGVzdC5mcmFtZXdvcmssIHdoaWNoIGNhbiBiZSBhZGRlZCB0byB5b3VyIHRhcmdldHMgKGRpc2N1c3NlZCBiZWxvdykuCisKKyMgTWFrZSBhIFRlc3QgVGFyZ2V0ICMKKworVG8gc3RhcnQgd3JpdGluZyB0ZXN0cywgbWFrZSBhIG5ldyAiU2hlbGwgVG9vbCIgdGFyZ2V0LiBUaGlzIHRhcmdldCB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgdW5kZXIgQlNELCBDb2NvYSwgb3IgQ2FyYm9uLiBBZGQgeW91ciB1bml0IHRlc3Qgc291cmNlIGNvZGUgdG8gdGhlICJDb21waWxlIFNvdXJjZXMiIGJ1aWxkIHBoYXNlIG9mIHRoZSB0YXJnZXQuCisKK05leHQsIHlvdSdsbCB3YW50IHRvIGFkZCBndGVzdC5mcmFtZXdvcmsgaW4gdHdvIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgdXBvbiB3aGljaCBvcHRpb24geW91IGNob3NlIGFib3ZlLgorCisgICogKipPcHRpb24gMSoqIC0tLSBEdXJpbmcgY29tcGlsYXRpb24sIFhjb2RlIHdpbGwgbmVlZCB0byBrbm93IHRoYXQgeW91IGFyZSBsaW5raW5nIGFnYWluc3QgdGhlIGd0ZXN0LmZyYW1ld29yay4gQWRkIHRoZSBndGVzdC5mcmFtZXdvcmsgdG8gdGhlICJMaW5rIEJpbmFyeSB3aXRoIExpYnJhcmllcyIgYnVpbGQgcGhhc2Ugb2YgeW91ciB0ZXN0IHRhcmdldC4gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIEdvb2dsZSBUZXN0IGhlYWRlcnMgaW4geW91ciBoZWFkZXIgc2VhcmNoIHBhdGgsIGFuZCB3aWxsIHRlbGwgdGhlIGxpbmtlciB3aGVyZSB0byBmaW5kIHRoZSBsaWJyYXJ5LgorICAqICoqT3B0aW9uIDIqKiAtLS0gSWYgeW91ciB3b3JraW5nIG91dCBvZiB0aGUgdHJ1bmssIHlvdSdsbCBhbHNvIHdhbnQgdG8gYWRkIGd0ZXN0LmZyYW1ld29yayB0byB5b3VyICJMaW5rIEJpbmFyeSB3aXRoIExpYnJhcmllcyIgYnVpbGQgcGhhc2Ugb2YgeW91ciB0ZXN0IHRhcmdldC4gSW4gYWRkaXRpb24sIHlvdSdsbCAgd2FudCB0byBhZGQgdGhlIGd0ZXN0LmZyYW1ld29yayBhcyBhIGRlcGVuZGVuY3kgdG8geW91ciB1bml0IHRlc3QgdGFyZ2V0LiBUaGlzIHdheSwgWGNvZGUgd2lsbCBtYWtlIHN1cmUgdGhhdCBndGVzdC5mcmFtZXdvcmsgaXMgdXAgdG8gZGF0ZSwgZXZlcnkgdGltZSB5b3VyIGJ1aWxkIHlvdXIgdGFyZ2V0LiBGaW5hbGx5LCBpZiB5b3UgZG9uJ3Qgc2hhcmUgYnVpbGQgZGlyZWN0b3JpZXMgd2l0aCBHb29nbGUgVGVzdCwgeW91J2xsIGhhdmUgdG8gY29weSB0aGUgZ3Rlc3QuZnJhbWV3b3JrIGludG8geW91ciBvd24gYnVpbGQgcHJvZHVjdHMgZGlyZWN0b3J5IHVzaW5nIGEgIlJ1biBTY3JpcHQiIGJ1aWxkIHBoYXNlLgorCisjIFNldCBVcCB0aGUgRXhlY3V0YWJsZSBSdW4gRW52aXJvbm1lbnQgIworCitTaW5jZSB0aGUgdW5pdCB0ZXN0IGV4ZWN1dGFibGUgaXMgYSBzaGVsbCB0b29sLCBpdCBkb2Vzbid0IGhhdmUgYSBidW5kbGUgd2l0aCBhIGBDb250ZW50cy9GcmFtZXdvcmtzYCBkaXJlY3RvcnksIGluIHdoaWNoIHRvIHBsYWNlIGd0ZXN0LmZyYW1ld29yay4gSW5zdGVhZCwgdGhlIGR5bmFtaWMgbGlua2VyIG11c3QgYmUgdG9sZCBhdCBydW50aW1lIHRvIHNlYXJjaCBmb3IgdGhlIGZyYW1ld29yayBpbiBhbm90aGVyIGxvY2F0aW9uLiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgc2V0dGluZyB0aGUgIkRZTERcX0ZSQU1FV09SS1xfUEFUSCIgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlICJFZGl0IEFjdGl2ZSBFeGVjdXRhYmxlIC4uLiIgQXJndW1lbnRzIHRhYiwgdW5kZXIgIlZhcmlhYmxlcyB0byBiZSBzZXQgaW4gdGhlIGVudmlyb25tZW50OiIuIFRoZSBwYXRoIGZvciB0aGlzIHZhbHVlIGlzIHRoZSBwYXRoIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBndGVzdC5mcmFtZXdvcmsuCisKK0lmIHlvdSBoYXZlbid0IHNldCB1cCB0aGUgRFlMRFxfRlJBTUVXT1JLXF9QQVRILCBjb3JyZWN0bHksIHlvdSBtaWdodCBnZXQgYSBtZXNzYWdlIGxpa2UgdGhpczoKKworYGBgCitbU2Vzc2lvbiBzdGFydGVkIGF0IDIwMDgtMDgtMTUgMDY6MjM6NTcgLTA2MDAuXQorICBkeWxkOiBMaWJyYXJ5IG5vdCBsb2FkZWQ6IEBsb2FkZXJfcGF0aC8uLi9GcmFtZXdvcmtzL2d0ZXN0LmZyYW1ld29yay9WZXJzaW9ucy9BL2d0ZXN0CisgICAgUmVmZXJlbmNlZCBmcm9tOiAvVXNlcnMvdXNlcm5hbWUvRG9jdW1lbnRzL1NhbmRib3gvZ3Rlc3RTYW1wbGUvYnVpbGQvRGVidWcvV2lkZ2V0RnJhbWV3b3JrVGVzdAorICAgIFJlYXNvbjogaW1hZ2Ugbm90IGZvdW5kCitgYGAKKworVG8gY29ycmVjdCB0aGlzIHByb2JsZW0sIGdvdCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGV4ZWN1dGFibGUgbmFtZWQgaW4gIlJlZmVyZW5jZWQgZnJvbToiIHZhbHVlIGluIHRoZSBlcnJvciBtZXNzYWdlIGFib3ZlLiBUaGVuLCB3aXRoIHRoZSB0ZXJtaW5hbCBpbiB0aGlzIGxvY2F0aW9uLCBmaW5kIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZ3Rlc3QuZnJhbWV3b3JrLiBUaGF0IGlzIHRoZSB2YWx1ZSB5b3UnbGwgbmVlZCB0byBzZXQgYXMgdGhlIERZTERcX0ZSQU1FV09SS1xfUEFUSC4KKworIyBCdWlsZCBhbmQgR28gIworCitOb3csIHdoZW4geW91IGNsaWNrICJCdWlsZCBhbmQgR28iLCB0aGUgdGVzdCB3aWxsIGJlIGV4ZWN1dGVkLiBEdW1waW5nIG91dCBzb21ldGhpbmcgbGlrZSB0aGlzOgorCitgYGAKK1tTZXNzaW9uIHN0YXJ0ZWQgYXQgMjAwOC0wOC0wNiAwNjozNjoxMyAtMDYwMC5dCitbPT09PT09PT09PV0gUnVubmluZyAyIHRlc3RzIGZyb20gMSB0ZXN0IGNhc2UuCitbLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLgorWy0tLS0tLS0tLS1dIDIgdGVzdHMgZnJvbSBXaWRnZXRJbml0aWFsaXplclRlc3QKK1sgUlVOICAgICAgXSBXaWRnZXRJbml0aWFsaXplclRlc3QuVGVzdENvbnN0cnVjdG9yCitbICAgICAgIE9LIF0gV2lkZ2V0SW5pdGlhbGl6ZXJUZXN0LlRlc3RDb25zdHJ1Y3RvcgorWyBSVU4gICAgICBdIFdpZGdldEluaXRpYWxpemVyVGVzdC5UZXN0Q29udmVyc2lvbgorWyAgICAgICBPSyBdIFdpZGdldEluaXRpYWxpemVyVGVzdC5UZXN0Q29udmVyc2lvbgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgorWz09PT09PT09PT1dIDIgdGVzdHMgZnJvbSAxIHRlc3QgY2FzZSByYW4uCitbICBQQVNTRUQgIF0gMiB0ZXN0cy4KKworVGhlIERlYnVnZ2VyIGhhcyBleGl0ZWQgd2l0aCBzdGF0dXMgMC4gIAorYGBgCisKKyMgU3VtbWFyeSAjCisKK1VuaXQgdGVzdGluZyBpcyBhIHZhbHVhYmxlIHdheSB0byBlbnN1cmUgeW91ciBkYXRhIG1vZGVsIHN0YXlzIHZhbGlkIGV2ZW4gZHVyaW5nIHJhcGlkIGRldmVsb3BtZW50IG9yIHJlZmFjdG9yaW5nLiBUaGUgR29vZ2xlIFRlc3RpbmcgRnJhbWV3b3JrIGlzIGEgZ3JlYXQgdW5pdCB0ZXN0aW5nIGZyYW1ld29yayBmb3IgQyBhbmQgQysrIHdoaWNoIGludGVncmF0ZXMgd2VsbCB3aXRoIGFuIFhjb2RlIGRldmVsb3BtZW50IGVudmlyb25tZW50LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzdfQWR2YW5jZWRHdWlkZS5tZCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzdfQWR2YW5jZWRHdWlkZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Q2NDYyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfN19BZHZhbmNlZEd1aWRlLm1kCkBAIC0wLDAgKzEsMjE4MSBAQAorCisKK05vdyB0aGF0IHlvdSBoYXZlIHJlYWQgW1ByaW1lcl0oVjFfN19QcmltZXIubWQpIGFuZCBsZWFybmVkIGhvdyB0byB3cml0ZSB0ZXN0cwordXNpbmcgR29vZ2xlIFRlc3QsIGl0J3MgdGltZSB0byBsZWFybiBzb21lIG5ldyB0cmlja3MuIFRoaXMgZG9jdW1lbnQKK3dpbGwgc2hvdyB5b3UgbW9yZSBhc3NlcnRpb25zIGFzIHdlbGwgYXMgaG93IHRvIGNvbnN0cnVjdCBjb21wbGV4CitmYWlsdXJlIG1lc3NhZ2VzLCBwcm9wYWdhdGUgZmF0YWwgZmFpbHVyZXMsIHJldXNlIGFuZCBzcGVlZCB1cCB5b3VyCit0ZXN0IGZpeHR1cmVzLCBhbmQgdXNlIHZhcmlvdXMgZmxhZ3Mgd2l0aCB5b3VyIHRlc3RzLgorCisjIE1vcmUgQXNzZXJ0aW9ucyAjCisKK1RoaXMgc2VjdGlvbiBjb3ZlcnMgc29tZSBsZXNzIGZyZXF1ZW50bHkgdXNlZCwgYnV0IHN0aWxsIHNpZ25pZmljYW50LAorYXNzZXJ0aW9ucy4KKworIyMgRXhwbGljaXQgU3VjY2VzcyBhbmQgRmFpbHVyZSAjIworCitUaGVzZSB0aHJlZSBhc3NlcnRpb25zIGRvIG5vdCBhY3R1YWxseSB0ZXN0IGEgdmFsdWUgb3IgZXhwcmVzc2lvbi4gSW5zdGVhZCwKK3RoZXkgZ2VuZXJhdGUgYSBzdWNjZXNzIG9yIGZhaWx1cmUgZGlyZWN0bHkuIExpa2UgdGhlIG1hY3JvcyB0aGF0IGFjdHVhbGx5CitwZXJmb3JtIGEgdGVzdCwgeW91IG1heSBzdHJlYW0gYSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlIGludG8gdGhlIHRoZW0uCisKK3wgYFNVQ0NFRUQoKTtgIHwKK3w6LS0tLS0tLS0tLS0tLXwKKworR2VuZXJhdGVzIGEgc3VjY2Vzcy4gVGhpcyBkb2VzIE5PVCBtYWtlIHRoZSBvdmVyYWxsIHRlc3Qgc3VjY2VlZC4gQSB0ZXN0IGlzCitjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgb25seSBpZiBub25lIG9mIGl0cyBhc3NlcnRpb25zIGZhaWwgZHVyaW5nIGl0cyBleGVjdXRpb24uCisKK05vdGU6IGBTVUNDRUVEKClgIGlzIHB1cmVseSBkb2N1bWVudGFyeSBhbmQgY3VycmVudGx5IGRvZXNuJ3QgZ2VuZXJhdGUgYW55Cit1c2VyLXZpc2libGUgb3V0cHV0LiBIb3dldmVyLCB3ZSBtYXkgYWRkIGBTVUNDRUVEKClgIG1lc3NhZ2VzIHRvIEdvb2dsZSBUZXN0J3MKK291dHB1dCBpbiB0aGUgZnV0dXJlLgorCit8IGBGQUlMKCk7YCAgfCBgQUREX0ZBSUxVUkUoKTtgIHwgYEFERF9GQUlMVVJFX0FUKCJgX2ZpbGVcX3BhdGhfYCIsIGBfbGluZVxfbnVtYmVyX2ApO2AgfAorfDotLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworYEZBSUwoKWAgZ2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSwgd2hpbGUgYEFERF9GQUlMVVJFKClgIGFuZCBgQUREX0ZBSUxVUkVfQVQoKWAgZ2VuZXJhdGUgYSBub25mYXRhbAorZmFpbHVyZS4gVGhlc2UgYXJlIHVzZWZ1bCB3aGVuIGNvbnRyb2wgZmxvdywgcmF0aGVyIHRoYW4gYSBCb29sZWFuIGV4cHJlc3Npb24sCitkZXRlcmVtaW5lcyB0aGUgdGVzdCdzIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIHdyaXRlCitzb21ldGhpbmcgbGlrZToKKworYGBgCitzd2l0Y2goZXhwcmVzc2lvbikgeworICBjYXNlIDE6IC4uLiBzb21lIGNoZWNrcyAuLi4KKyAgY2FzZSAyOiAuLi4gc29tZSBvdGhlciBjaGVja3MKKyAgLi4uCisgIGRlZmF1bHQ6IEZBSUwoKSA8PCAiV2Ugc2hvdWxkbid0IGdldCBoZXJlLiI7Cit9CitgYGAKKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIEV4Y2VwdGlvbiBBc3NlcnRpb25zICMjCisKK1RoZXNlIGFyZSBmb3IgdmVyaWZ5aW5nIHRoYXQgYSBwaWVjZSBvZiBjb2RlIHRocm93cyAob3IgZG9lcyBub3QKK3Rocm93KSBhbiBleGNlcHRpb24gb2YgdGhlIGdpdmVuIHR5cGU6CisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfVEhST1coYF9zdGF0ZW1lbnRfLCBfZXhjZXB0aW9uXF90eXBlX2ApO2AgIHwgYEVYUEVDVF9USFJPVyhgX3N0YXRlbWVudF8sIF9leGNlcHRpb25cX3R5cGVfYCk7YCAgfCBfc3RhdGVtZW50XyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHRoZSBnaXZlbiB0eXBlICB8Cit8IGBBU1NFUlRfQU5ZX1RIUk9XKGBfc3RhdGVtZW50X2ApO2AgICAgICAgICAgICAgICAgfCBgRVhQRUNUX0FOWV9USFJPVyhgX3N0YXRlbWVudF9gKTtgICAgICAgICAgICAgICAgIHwgX3N0YXRlbWVudF8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiBhbnkgdHlwZSAgICAgICAgfAorfCBgQVNTRVJUX05PX1RIUk9XKGBfc3RhdGVtZW50X2ApO2AgICAgICAgICAgICAgICAgIHwgYEVYUEVDVF9OT19USFJPVyhgX3N0YXRlbWVudF9gKTtgICAgICAgICAgICAgICAgICB8IF9zdGF0ZW1lbnRfIGRvZXNuJ3QgdGhyb3cgYW55IGV4Y2VwdGlvbiAgICAgICAgICAgIHwKKworRXhhbXBsZXM6CisKK2BgYAorQVNTRVJUX1RIUk9XKEZvbyg1KSwgYmFyX2V4Y2VwdGlvbik7CisKK0VYUEVDVF9OT19USFJPVyh7CisgIGludCBuID0gNTsKKyAgQmFyKCZuKTsKK30pOworYGBgCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2ZXJzaW9uIDEuMS4wLgorCisjIyBQcmVkaWNhdGUgQXNzZXJ0aW9ucyBmb3IgQmV0dGVyIEVycm9yIE1lc3NhZ2VzICMjCisKK0V2ZW4gdGhvdWdoIEdvb2dsZSBUZXN0IGhhcyBhIHJpY2ggc2V0IG9mIGFzc2VydGlvbnMsIHRoZXkgY2FuIG5ldmVyIGJlCitjb21wbGV0ZSwgYXMgaXQncyBpbXBvc3NpYmxlIChub3IgYSBnb29kIGlkZWEpIHRvIGFudGljaXBhdGUgYWxsIHRoZSBzY2VuYXJpb3MKK2EgdXNlciBtaWdodCBydW4gaW50by4gVGhlcmVmb3JlLCBzb21ldGltZXMgYSB1c2VyIGhhcyB0byB1c2UgYEVYUEVDVF9UUlVFKClgCit0byBjaGVjayBhIGNvbXBsZXggZXhwcmVzc2lvbiwgZm9yIGxhY2sgb2YgYSBiZXR0ZXIgbWFjcm8uIFRoaXMgaGFzIHRoZSBwcm9ibGVtCitvZiBub3Qgc2hvd2luZyB5b3UgdGhlIHZhbHVlcyBvZiB0aGUgcGFydHMgb2YgdGhlIGV4cHJlc3Npb24sIG1ha2luZyBpdCBoYXJkIHRvCit1bmRlcnN0YW5kIHdoYXQgd2VudCB3cm9uZy4gQXMgYSB3b3JrYXJvdW5kLCBzb21lIHVzZXJzIGNob29zZSB0byBjb25zdHJ1Y3QgdGhlCitmYWlsdXJlIG1lc3NhZ2UgYnkgdGhlbXNlbHZlcywgc3RyZWFtaW5nIGl0IGludG8gYEVYUEVDVF9UUlVFKClgLiBIb3dldmVyLCB0aGlzCitpcyBhd2t3YXJkIGVzcGVjaWFsbHkgd2hlbiB0aGUgZXhwcmVzc2lvbiBoYXMgc2lkZS1lZmZlY3RzIG9yIGlzIGV4cGVuc2l2ZSB0bworZXZhbHVhdGUuCisKK0dvb2dsZSBUZXN0IGdpdmVzIHlvdSB0aHJlZSBkaWZmZXJlbnQgb3B0aW9ucyB0byBzb2x2ZSB0aGlzIHByb2JsZW06CisKKyMjIyBVc2luZyBhbiBFeGlzdGluZyBCb29sZWFuIEZ1bmN0aW9uICMjIworCitJZiB5b3UgYWxyZWFkeSBoYXZlIGEgZnVuY3Rpb24gb3IgYSBmdW5jdG9yIHRoYXQgcmV0dXJucyBgYm9vbGAgKG9yIGEgdHlwZQordGhhdCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYGJvb2xgKSwgeW91IGNhbiB1c2UgaXQgaW4gYSBfcHJlZGljYXRlCithc3NlcnRpb25fIHRvIGdldCB0aGUgZnVuY3Rpb24gYXJndW1lbnRzIHByaW50ZWQgZm9yIGZyZWU6CisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfUFJFRDEoYF9wcmVkMSwgdmFsMV9gKTtgICAgICAgIHwgYEVYUEVDVF9QUkVEMShgX3ByZWQxLCB2YWwxX2ApO2AgfCBfcHJlZDEodmFsMSlfIHJldHVybnMgdHJ1ZSB8Cit8IGBBU1NFUlRfUFJFRDIoYF9wcmVkMiwgdmFsMSwgdmFsMl9gKTtgIHwgYEVYUEVDVF9QUkVEMihgX3ByZWQyLCB2YWwxLCB2YWwyX2ApO2AgfCAgX3ByZWQyKHZhbDEsIHZhbDIpXyByZXR1cm5zIHRydWUgfAorfCAgLi4uICAgICAgICAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICB8IC4uLiAgICAgICAgICB8CisKK0luIHRoZSBhYm92ZSwgX3ByZWRuXyBpcyBhbiBfbl8tYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbiBvciBmdW5jdG9yLCB3aGVyZQorX3ZhbDFfLCBfdmFsMl8sIC4uLiwgYW5kIF92YWxuXyBhcmUgaXRzIGFyZ3VtZW50cy4gVGhlIGFzc2VydGlvbiBzdWNjZWVkcworaWYgdGhlIHByZWRpY2F0ZSByZXR1cm5zIGB0cnVlYCB3aGVuIGFwcGxpZWQgdG8gdGhlIGdpdmVuIGFyZ3VtZW50cywgYW5kIGZhaWxzCitvdGhlcndpc2UuIFdoZW4gdGhlIGFzc2VydGlvbiBmYWlscywgaXQgcHJpbnRzIHRoZSB2YWx1ZSBvZiBlYWNoIGFyZ3VtZW50LiBJbgorZWl0aGVyIGNhc2UsIHRoZSBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuCisKK0hlcmUncyBhbiBleGFtcGxlLiBHaXZlbgorCitgYGAKKy8vIFJldHVybnMgdHJ1ZSBpZmYgbSBhbmQgbiBoYXZlIG5vIGNvbW1vbiBkaXZpc29ycyBleGNlcHQgMS4KK2Jvb2wgTXV0dWFsbHlQcmltZShpbnQgbSwgaW50IG4pIHsgLi4uIH0KK2NvbnN0IGludCBhID0gMzsKK2NvbnN0IGludCBiID0gNDsKK2NvbnN0IGludCBjID0gMTA7CitgYGAKKwordGhlIGFzc2VydGlvbiBgRVhQRUNUX1BSRUQyKE11dHVhbGx5UHJpbWUsIGEsIGIpO2Agd2lsbCBzdWNjZWVkLCB3aGlsZSB0aGUKK2Fzc2VydGlvbiBgRVhQRUNUX1BSRUQyKE11dHVhbGx5UHJpbWUsIGIsIGMpO2Agd2lsbCBmYWlsIHdpdGggdGhlIG1lc3NhZ2UKKworPHByZT4KKyFNdXR1YWxseVByaW1lKGIsIGMpIGlzIGZhbHNlLCB3aGVyZTxicj4KK2IgaXMgNDxicj4KK2MgaXMgMTA8YnI+Cis8L3ByZT4KKworKipOb3RlczoqKgorCisgIDEuIElmIHlvdSBzZWUgYSBjb21waWxlciBlcnJvciAibm8gbWF0Y2hpbmcgZnVuY3Rpb24gdG8gY2FsbCIgd2hlbiB1c2luZyBgQVNTRVJUX1BSRUQqYCBvciBgRVhQRUNUX1BSRUQqYCwgcGxlYXNlIHNlZSBbdGhpc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV83X0ZBUSNUaGVfY29tcGlsZXJfY29tcGxhaW5zXyUyMm5vX21hdGNoaW5nX2Z1bmN0aW9uX3RvX2NhbGwlMjIpIGZvciBob3cgdG8gcmVzb2x2ZSBpdC4KKyAgMS4gQ3VycmVudGx5IHdlIG9ubHkgcHJvdmlkZSBwcmVkaWNhdGUgYXNzZXJ0aW9ucyBvZiBhcml0eSA8PSA1LiBJZiB5b3UgbmVlZCBhIGhpZ2hlci1hcml0eSBhc3NlcnRpb24sIGxldCB1cyBrbm93LgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYworCisjIyMgVXNpbmcgYSBGdW5jdGlvbiBUaGF0IFJldHVybnMgYW4gQXNzZXJ0aW9uUmVzdWx0ICMjIworCitXaGlsZSBgRVhQRUNUX1BSRUQqKClgIGFuZCBmcmllbmRzIGFyZSBoYW5keSBmb3IgYSBxdWljayBqb2IsIHRoZQorc3ludGF4IGlzIG5vdCBzYXRpc2ZhY3Rvcnk6IHlvdSBoYXZlIHRvIHVzZSBkaWZmZXJlbnQgbWFjcm9zIGZvcgorZGlmZmVyZW50IGFyaXRpZXMsIGFuZCBpdCBmZWVscyBtb3JlIGxpa2UgTGlzcCB0aGFuIEMrKy4gIFRoZQorYDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0YCBjbGFzcyBzb2x2ZXMgdGhpcyBwcm9ibGVtLgorCitBbiBgQXNzZXJ0aW9uUmVzdWx0YCBvYmplY3QgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGFuIGFzc2VydGlvbgorKHdoZXRoZXIgaXQncyBhIHN1Y2Nlc3Mgb3IgYSBmYWlsdXJlLCBhbmQgYW4gYXNzb2NpYXRlZCBtZXNzYWdlKS4gIFlvdQorY2FuIGNyZWF0ZSBhbiBgQXNzZXJ0aW9uUmVzdWx0YCB1c2luZyBvbmUgb2YgdGhlc2UgZmFjdG9yeQorZnVuY3Rpb25zOgorCitgYGAKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gUmV0dXJucyBhbiBBc3NlcnRpb25SZXN1bHQgb2JqZWN0IHRvIGluZGljYXRlIHRoYXQgYW4gYXNzZXJ0aW9uIGhhcworLy8gc3VjY2VlZGVkLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblN1Y2Nlc3MoKTsKKworLy8gUmV0dXJucyBhbiBBc3NlcnRpb25SZXN1bHQgb2JqZWN0IHRvIGluZGljYXRlIHRoYXQgYW4gYXNzZXJ0aW9uIGhhcworLy8gZmFpbGVkLgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoKTsKKworfQorYGBgCisKK1lvdSBjYW4gdGhlbiB1c2UgdGhlIGA8PGAgb3BlcmF0b3IgdG8gc3RyZWFtIG1lc3NhZ2VzIHRvIHRoZQorYEFzc2VydGlvblJlc3VsdGAgb2JqZWN0LgorCitUbyBwcm92aWRlIG1vcmUgcmVhZGFibGUgbWVzc2FnZXMgaW4gQm9vbGVhbiBhc3NlcnRpb25zCisoZS5nLiBgRVhQRUNUX1RSVUUoKWApLCB3cml0ZSBhIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IHJldHVybnMKK2BBc3NlcnRpb25SZXN1bHRgIGluc3RlYWQgb2YgYGJvb2xgLiBGb3IgZXhhbXBsZSwgaWYgeW91IGRlZmluZQorYElzRXZlbigpYCBhczoKKworYGBgCis6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKyAgaWYgKChuICUgMikgPT0gMCkKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisgIGVsc2UKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7Cit9CitgYGAKKworaW5zdGVhZCBvZjoKKworYGBgCitib29sIElzRXZlbihpbnQgbikgeworICByZXR1cm4gKG4gJSAyKSA9PSAwOworfQorYGBgCisKK3RoZSBmYWlsZWQgYXNzZXJ0aW9uIGBFWFBFQ1RfVFJVRShJc0V2ZW4oRmliKDQpKSlgIHdpbGwgcHJpbnQ6CisKKzxwcmU+CitWYWx1ZSBvZjogSXNFdmVuKEZpYig0KSk8YnI+CitBY3R1YWw6IGZhbHNlICgqMyBpcyBvZGQqKTxicj4KK0V4cGVjdGVkOiB0cnVlPGJyPgorPC9wcmU+CisKK2luc3RlYWQgb2YgYSBtb3JlIG9wYXF1ZQorCis8cHJlPgorVmFsdWUgb2Y6IElzRXZlbihGaWIoNCkpPGJyPgorQWN0dWFsOiBmYWxzZTxicj4KK0V4cGVjdGVkOiB0cnVlPGJyPgorPC9wcmU+CisKK0lmIHlvdSB3YW50IGluZm9ybWF0aXZlIG1lc3NhZ2VzIGluIGBFWFBFQ1RfRkFMU0VgIGFuZCBgQVNTRVJUX0ZBTFNFYAorYXMgd2VsbCwgYW5kIGFyZSBmaW5lIHdpdGggbWFraW5nIHRoZSBwcmVkaWNhdGUgc2xvd2VyIGluIHRoZSBzdWNjZXNzCitjYXNlLCB5b3UgY2FuIHN1cHBseSBhIHN1Y2Nlc3MgbWVzc2FnZToKKworYGBgCis6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKyAgaWYgKChuICUgMikgPT0gMCkKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCkgPDwgbiA8PCAiIGlzIGV2ZW4iOworICBlbHNlCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworfQorYGBgCisKK1RoZW4gdGhlIHN0YXRlbWVudCBgRVhQRUNUX0ZBTFNFKElzRXZlbihGaWIoNikpKWAgd2lsbCBwcmludAorCis8cHJlPgorVmFsdWUgb2Y6IElzRXZlbihGaWIoNikpPGJyPgorQWN0dWFsOiB0cnVlICg4IGlzIGV2ZW4pPGJyPgorRXhwZWN0ZWQ6IGZhbHNlPGJyPgorPC9wcmU+CisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2ZXJzaW9uIDEuNC4xLgorCisjIyMgVXNpbmcgYSBQcmVkaWNhdGUtRm9ybWF0dGVyICMjIworCitJZiB5b3UgZmluZCB0aGUgZGVmYXVsdCBtZXNzYWdlIGdlbmVyYXRlZCBieSBgKEFTU0VSVHxFWFBFQ1QpX1BSRUQqYCBhbmQKK2AoQVNTRVJUfEVYUEVDVClfKFRSVUV8RkFMU0UpYCB1bnNhdGlzZmFjdG9yeSwgb3Igc29tZSBhcmd1bWVudHMgdG8geW91cgorcHJlZGljYXRlIGRvIG5vdCBzdXBwb3J0IHN0cmVhbWluZyB0byBgb3N0cmVhbWAsIHlvdSBjYW4gaW5zdGVhZCB1c2UgdGhlCitmb2xsb3dpbmcgX3ByZWRpY2F0ZS1mb3JtYXR0ZXIgYXNzZXJ0aW9uc18gdG8gX2Z1bGx5XyBjdXN0b21pemUgaG93IHRoZQorbWVzc2FnZSBpcyBmb3JtYXR0ZWQ6CisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfUFJFRF9GT1JNQVQxKGBfcHJlZFxfZm9ybWF0MSwgdmFsMV9gKTtgICAgICAgICB8IGBFWFBFQ1RfUFJFRF9GT1JNQVQxKGBfcHJlZFxfZm9ybWF0MSwgdmFsMV9gKTsgfCBfcHJlZFxfZm9ybWF0MSh2YWwxKV8gaXMgc3VjY2Vzc2Z1bCB8Cit8IGBBU1NFUlRfUFJFRF9GT1JNQVQyKGBfcHJlZFxfZm9ybWF0MiwgdmFsMSwgdmFsMl9gKTtgIHwgYEVYUEVDVF9QUkVEX0ZPUk1BVDIoYF9wcmVkXF9mb3JtYXQyLCB2YWwxLCB2YWwyX2ApO2AgfCBfcHJlZFxfZm9ybWF0Mih2YWwxLCB2YWwyKV8gaXMgc3VjY2Vzc2Z1bCB8Cit8IGAuLi5gICAgICAgICAgICAgICAgfCBgLi4uYCAgICAgICAgICAgICAgICAgIHwgYC4uLmAgICAgICAgIHwKKworVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcHJldmlvdXMgdHdvIGdyb3VwcyBvZiBtYWNyb3MgaXMgdGhhdCBpbnN0ZWFkIG9mCithIHByZWRpY2F0ZSwgYChBU1NFUlR8RVhQRUNUKV9QUkVEX0ZPUk1BVCpgIHRha2UgYSBfcHJlZGljYXRlLWZvcm1hdHRlcl8KKyhfcHJlZFxfZm9ybWF0bl8pLCB3aGljaCBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3Igd2l0aCB0aGUgc2lnbmF0dXJlOgorCitgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZGljYXRlRm9ybWF0dGVybihjb25zdCBjaGFyKiBgX2V4cHIxX2AsIGNvbnN0IGNoYXIqIGBfZXhwcjJfYCwgLi4uIGNvbnN0IGNoYXIqIGBfZXhwcm5fYCwgVDEgYF92YWwxX2AsIFQyIGBfdmFsMl9gLCAuLi4gVG4gYF92YWxuX2ApO2AKKword2hlcmUgX3ZhbDFfLCBfdmFsMl8sIC4uLiwgYW5kIF92YWxuXyBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgcHJlZGljYXRlCithcmd1bWVudHMsIGFuZCBfZXhwcjFfLCBfZXhwcjJfLCAuLi4sIGFuZCBfZXhwcm5fIGFyZSB0aGUgY29ycmVzcG9uZGluZworZXhwcmVzc2lvbnMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLiBUaGUgdHlwZXMgYFQxYCwgYFQyYCwgLi4uLCBhbmQKK2BUbmAgY2FuIGJlIGVpdGhlciB2YWx1ZSB0eXBlcyBvciByZWZlcmVuY2UgdHlwZXMuIEZvciBleGFtcGxlLCBpZiBhbgorYXJndW1lbnQgaGFzIHR5cGUgYEZvb2AsIHlvdSBjYW4gZGVjbGFyZSBpdCBhcyBlaXRoZXIgYEZvb2Agb3IgYGNvbnN0IEZvbyZgLAord2hpY2hldmVyIGlzIGFwcHJvcHJpYXRlLgorCitBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgcmV0dXJucyBhIGA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdGAgb2JqZWN0IHRvIGluZGljYXRlCit3aGV0aGVyIHRoZSBhc3NlcnRpb24gaGFzIHN1Y2NlZWRlZCBvciBub3QuIFRoZSBvbmx5IHdheSB0byBjcmVhdGUgc3VjaCBhbgorb2JqZWN0IGlzIHRvIGNhbGwgb25lIG9mIHRoZXNlIGZhY3RvcnkgZnVuY3Rpb25zOgorCitBcyBhbiBleGFtcGxlLCBsZXQncyBpbXByb3ZlIHRoZSBmYWlsdXJlIG1lc3NhZ2UgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHdoaWNoIHVzZXMgYEVYUEVDVF9QUkVEMigpYDoKKworYGBgCisvLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCBwcmltZSBjb21tb24gZGl2aXNvciBvZiBtIGFuZCBuLAorLy8gb3IgMSB3aGVuIG0gYW5kIG4gYXJlIG11dHVhbGx5IHByaW1lLgoraW50IFNtYWxsZXN0UHJpbWVDb21tb25EaXZpc29yKGludCBtLCBpbnQgbikgeyAuLi4gfQorCisvLyBBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZm9yIGFzc2VydGluZyB0aGF0IHR3byBpbnRlZ2VycyBhcmUgbXV0dWFsbHkgcHJpbWUuCis6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBBc3NlcnRNdXR1YWxseVByaW1lKGNvbnN0IGNoYXIqIG1fZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbl9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4pIHsKKyAgaWYgKE11dHVhbGx5UHJpbWUobSwgbikpCisgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworIAorICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8IG1fZXhwciA8PCAiIGFuZCAiIDw8IG5fZXhwciA8PCAiICgiIDw8IG0gPDwgIiBhbmQgIiA8PCBuCisgICAgICA8PCAiKSBhcmUgbm90IG11dHVhbGx5IHByaW1lLCAiIDw8ICJhcyB0aGV5IGhhdmUgYSBjb21tb24gZGl2aXNvciAiCisgICAgICA8PCBTbWFsbGVzdFByaW1lQ29tbW9uRGl2aXNvcihtLCBuKTsKK30KK2BgYAorCitXaXRoIHRoaXMgcHJlZGljYXRlLWZvcm1hdHRlciwgd2UgY2FuIHVzZQorCitgYGAKK0VYUEVDVF9QUkVEX0ZPUk1BVDIoQXNzZXJ0TXV0dWFsbHlQcmltZSwgYiwgYyk7CitgYGAKKwordG8gZ2VuZXJhdGUgdGhlIG1lc3NhZ2UKKworPHByZT4KK2IgYW5kIGMgKDQgYW5kIDEwKSBhcmUgbm90IG11dHVhbGx5IHByaW1lLCBhcyB0aGV5IGhhdmUgYSBjb21tb24gZGl2aXNvciAyLjxicj4KKzwvcHJlPgorCitBcyB5b3UgbWF5IGhhdmUgcmVhbGl6ZWQsIG1hbnkgb2YgdGhlIGFzc2VydGlvbnMgd2UgaW50cm9kdWNlZCBlYXJsaWVyIGFyZQorc3BlY2lhbCBjYXNlcyBvZiBgKEVYUEVDVHxBU1NFUlQpX1BSRURfRk9STUFUKmAuIEluIGZhY3QsIG1vc3Qgb2YgdGhlbSBhcmUKK2luZGVlZCBkZWZpbmVkIHVzaW5nIGAoRVhQRUNUfEFTU0VSVClfUFJFRF9GT1JNQVQqYC4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKworIyMgRmxvYXRpbmctUG9pbnQgQ29tcGFyaXNvbiAjIworCitDb21wYXJpbmcgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBpcyB0cmlja3kuIER1ZSB0byByb3VuZC1vZmYgZXJyb3JzLCBpdCBpcwordmVyeSB1bmxpa2VseSB0aGF0IHR3byBmbG9hdGluZy1wb2ludHMgd2lsbCBtYXRjaCBleGFjdGx5LiBUaGVyZWZvcmUsCitgQVNTRVJUX0VRYCAncyBuYWl2ZSBjb21wYXJpc29uIHVzdWFsbHkgZG9lc24ndCB3b3JrLiBBbmQgc2luY2UgZmxvYXRpbmctcG9pbnRzCitjYW4gaGF2ZSBhIHdpZGUgdmFsdWUgcmFuZ2UsIG5vIHNpbmdsZSBmaXhlZCBlcnJvciBib3VuZCB3b3Jrcy4gSXQncyBiZXR0ZXIgdG8KK2NvbXBhcmUgYnkgYSBmaXhlZCByZWxhdGl2ZSBlcnJvciBib3VuZCwgZXhjZXB0IGZvciB2YWx1ZXMgY2xvc2UgdG8gMCBkdWUgdG8KK3RoZSBsb3NzIG9mIHByZWNpc2lvbiB0aGVyZS4KKworSW4gZ2VuZXJhbCwgZm9yIGZsb2F0aW5nLXBvaW50IGNvbXBhcmlzb24gdG8gbWFrZSBzZW5zZSwgdGhlIHVzZXIgbmVlZHMgdG8KK2NhcmVmdWxseSBjaG9vc2UgdGhlIGVycm9yIGJvdW5kLiBJZiB0aGV5IGRvbid0IHdhbnQgb3IgY2FyZSB0bywgY29tcGFyaW5nIGluCit0ZXJtcyBvZiBVbml0cyBpbiB0aGUgTGFzdCBQbGFjZSAoVUxQcykgaXMgYSBnb29kIGRlZmF1bHQsIGFuZCBHb29nbGUgVGVzdAorcHJvdmlkZXMgYXNzZXJ0aW9ucyB0byBkbyB0aGlzLiBGdWxsIGRldGFpbHMgYWJvdXQgVUxQcyBhcmUgcXVpdGUgbG9uZzsgaWYgeW91Cit3YW50IHRvIGxlYXJuIG1vcmUsIHNlZQorW3RoaXMgYXJ0aWNsZSBvbiBmbG9hdCBjb21wYXJpc29uXShodHRwOi8vd3d3LmN5Z251cy1zb2Z0d2FyZS5jb20vcGFwZXJzL2NvbXBhcmluZ2Zsb2F0cy9jb21wYXJpbmdmbG9hdHMuaHRtKS4KKworIyMjIEZsb2F0aW5nLVBvaW50IE1hY3JvcyAjIyMKKworfCAqKkZhdGFsIGFzc2VydGlvbioqIHwgKipOb25mYXRhbCBhc3NlcnRpb24qKiB8ICoqVmVyaWZpZXMqKiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLXwKK3wgYEFTU0VSVF9GTE9BVF9FUShgX2V4cGVjdGVkLCBhY3R1YWxfYCk7YCAgfCBgRVhQRUNUX0ZMT0FUX0VRKGBfZXhwZWN0ZWQsIGFjdHVhbF9gKTtgIHwgdGhlIHR3byBgZmxvYXRgIHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsIHwKK3wgYEFTU0VSVF9ET1VCTEVfRVEoYF9leHBlY3RlZCwgYWN0dWFsX2ApO2AgfCBgRVhQRUNUX0RPVUJMRV9FUShgX2V4cGVjdGVkLCBhY3R1YWxfYCk7YCB8IHRoZSB0d28gYGRvdWJsZWAgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwgfAorCitCeSAiYWxtb3N0IGVxdWFsIiwgd2UgbWVhbiB0aGUgdHdvIHZhbHVlcyBhcmUgd2l0aGluIDQgVUxQJ3MgZnJvbSBlYWNoCitvdGhlci4KKworVGhlIGZvbGxvd2luZyBhc3NlcnRpb25zIGFsbG93IHlvdSB0byBjaG9vc2UgdGhlIGFjY2VwdGFibGUgZXJyb3IgYm91bmQ6CisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfTkVBUihgX3ZhbDEsIHZhbDIsIGFic1xfZXJyb3JfYCk7YCB8IGBFWFBFQ1RfTkVBUmBfKHZhbDEsIHZhbDIsIGFic1xfZXJyb3JfYCk7YCB8IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gX3ZhbDFfIGFuZCBfdmFsMl8gZG9lc24ndCBleGNlZWQgdGhlIGdpdmVuIGFic29sdXRlIGVycm9yIHwKKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIyBGbG9hdGluZy1Qb2ludCBQcmVkaWNhdGUtRm9ybWF0IEZ1bmN0aW9ucyAjIyMKKworU29tZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGFyZSB1c2VmdWwsIGJ1dCBub3QgdGhhdCBvZnRlbiB1c2VkLiBJbiBvcmRlcgordG8gYXZvaWQgYW4gZXhwbG9zaW9uIG9mIG5ldyBtYWNyb3MsIHdlIHByb3ZpZGUgdGhlbSBhcyBwcmVkaWNhdGUtZm9ybWF0CitmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3JvcyAoZS5nLgorYEVYUEVDVF9QUkVEX0ZPUk1BVDJgLCBldGMpLgorCitgYGAKK0VYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjpGbG9hdExFLCB2YWwxLCB2YWwyKTsKK0VYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjpEb3VibGVMRSwgdmFsMSwgdmFsMik7CitgYGAKKworVmVyaWZpZXMgdGhhdCBfdmFsMV8gaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIF92YWwyXy4gWW91IGNhbgorcmVwbGFjZSBgRVhQRUNUX1BSRURfRk9STUFUMmAgaW4gdGhlIGFib3ZlIHRhYmxlIHdpdGggYEFTU0VSVF9QUkVEX0ZPUk1BVDJgLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMgV2luZG93cyBIUkVTVUxUIGFzc2VydGlvbnMgIyMKKworVGhlc2UgYXNzZXJ0aW9ucyB0ZXN0IGZvciBgSFJFU1VMVGAgc3VjY2VzcyBvciBmYWlsdXJlLgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKGBfZXhwcmVzc2lvbl9gKTtgIHwgYEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChgX2V4cHJlc3Npb25fYCk7YCB8IF9leHByZXNzaW9uXyBpcyBhIHN1Y2Nlc3MgYEhSRVNVTFRgIHwKK3wgYEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChgX2V4cHJlc3Npb25fYCk7YCAgICB8IGBFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoYF9leHByZXNzaW9uX2ApO2AgICAgfCBfZXhwcmVzc2lvbl8gaXMgYSBmYWlsdXJlIGBIUkVTVUxUYCB8CisKK1RoZSBnZW5lcmF0ZWQgb3V0cHV0IGNvbnRhaW5zIHRoZSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlCithc3NvY2lhdGVkIHdpdGggdGhlIGBIUkVTVUxUYCBjb2RlIHJldHVybmVkIGJ5IF9leHByZXNzaW9uXy4KKworWW91IG1pZ2h0IHVzZSB0aGVtIGxpa2UgdGhpczoKKworYGBgCitDQ29tUHRyIHNoZWxsOworQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKHNoZWxsLkNvQ3JlYXRlSW5zdGFuY2UoTCJTaGVsbC5BcHBsaWNhdGlvbiIpKTsKK0NDb21WYXJpYW50IGVtcHR5OworQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKHNoZWxsLT5TaGVsbEV4ZWN1dGUoQ0NvbUJTVFIodXJsKSwgZW1wdHksIGVtcHR5LCBlbXB0eSwgZW1wdHkpKTsKK2BgYAorCitfQXZhaWxhYmlsaXR5XzogV2luZG93cy4KKworIyMgVHlwZSBBc3NlcnRpb25zICMjCisKK1lvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24KK2BgYAorOjp0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPigpOworYGBgCit0byBhc3NlcnQgdGhhdCB0eXBlcyBgVDFgIGFuZCBgVDJgIGFyZSB0aGUgc2FtZS4gIFRoZSBmdW5jdGlvbiBkb2VzCitub3RoaW5nIGlmIHRoZSBhc3NlcnRpb24gaXMgc2F0aXNmaWVkLiAgSWYgdGhlIHR5cGVzIGFyZSBkaWZmZXJlbnQsCit0aGUgZnVuY3Rpb24gY2FsbCB3aWxsIGZhaWwgdG8gY29tcGlsZSwgYW5kIHRoZSBjb21waWxlciBlcnJvciBtZXNzYWdlCit3aWxsIGxpa2VseSAoZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlcikgc2hvdyB5b3UgdGhlIGFjdHVhbCB2YWx1ZXMgb2YKK2BUMWAgYW5kIGBUMmAuICBUaGlzIGlzIG1haW5seSB1c2VmdWwgaW5zaWRlIHRlbXBsYXRlIGNvZGUuCisKK19DYXZlYXQ6XyBXaGVuIHVzZWQgaW5zaWRlIGEgbWVtYmVyIGZ1bmN0aW9uIG9mIGEgY2xhc3MgdGVtcGxhdGUgb3IgYQorZnVuY3Rpb24gdGVtcGxhdGUsIGBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPigpYCBpcyBlZmZlY3RpdmUgX29ubHkgaWZfCit0aGUgZnVuY3Rpb24gaXMgaW5zdGFudGlhdGVkLiAgRm9yIGV4YW1wbGUsIGdpdmVuOgorYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgRm9vIHsKKyBwdWJsaWM6CisgIHZvaWQgQmFyKCkgeyA6OnRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIFQ+KCk7IH0KK307CitgYGAKK3RoZSBjb2RlOgorYGBgCit2b2lkIFRlc3QxKCkgeyBGb288Ym9vbD4gZm9vOyB9CitgYGAKK3dpbGwgX25vdF8gZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciwgYXMgYEZvbzxib29sPjo6QmFyKClgIGlzIG5ldmVyCithY3R1YWxseSBpbnN0YW50aWF0ZWQuICBJbnN0ZWFkLCB5b3UgbmVlZDoKK2BgYAordm9pZCBUZXN0MigpIHsgRm9vPGJvb2w+IGZvbzsgZm9vLkJhcigpOyB9CitgYGAKK3RvIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2ZXJzaW9uIDEuMy4wLgorCisjIyBBc3NlcnRpb24gUGxhY2VtZW50ICMjCisKK1lvdSBjYW4gdXNlIGFzc2VydGlvbnMgaW4gYW55IEMrKyBmdW5jdGlvbi4gSW4gcGFydGljdWxhciwgaXQgZG9lc24ndAoraGF2ZSB0byBiZSBhIG1ldGhvZCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLiBUaGUgb25lIGNvbnN0cmFpbnQgaXMKK3RoYXQgYXNzZXJ0aW9ucyB0aGF0IGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZSAoYEZBSUwqYCBhbmQgYEFTU0VSVF8qYCkKK2NhbiBvbmx5IGJlIHVzZWQgaW4gdm9pZC1yZXR1cm5pbmcgZnVuY3Rpb25zLiBUaGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YKK0dvb2dsZSBUZXN0IG5vdCB1c2luZyBleGNlcHRpb25zLiBCeSBwbGFjaW5nIGl0IGluIGEgbm9uLXZvaWQgZnVuY3Rpb24KK3lvdSdsbCBnZXQgYSBjb25mdXNpbmcgY29tcGlsZSBlcnJvciBsaWtlCitgImVycm9yOiB2b2lkIHZhbHVlIG5vdCBpZ25vcmVkIGFzIGl0IG91Z2h0IHRvIGJlImAuCisKK0lmIHlvdSBuZWVkIHRvIHVzZSBhc3NlcnRpb25zIGluIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIG5vbi12b2lkLCBvbmUgb3B0aW9uCitpcyB0byBtYWtlIHRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIHZhbHVlIGluIGFuIG91dCBwYXJhbWV0ZXIgaW5zdGVhZC4gRm9yCitleGFtcGxlLCB5b3UgY2FuIHJld3JpdGUgYFQyIEZvbyhUMSB4KWAgdG8gYHZvaWQgRm9vKFQxIHgsIFQyKiByZXN1bHQpYC4gWW91CituZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGAqcmVzdWx0YCBjb250YWlucyBzb21lIHNlbnNpYmxlIHZhbHVlIGV2ZW4gd2hlbiB0aGUKK2Z1bmN0aW9uIHJldHVybnMgcHJlbWF0dXJlbHkuIEFzIHRoZSBmdW5jdGlvbiBub3cgcmV0dXJucyBgdm9pZGAsIHlvdSBjYW4gdXNlCithbnkgYXNzZXJ0aW9uIGluc2lkZSBvZiBpdC4KKworSWYgY2hhbmdpbmcgdGhlIGZ1bmN0aW9uJ3MgdHlwZSBpcyBub3QgYW4gb3B0aW9uLCB5b3Ugc2hvdWxkIGp1c3QgdXNlCithc3NlcnRpb25zIHRoYXQgZ2VuZXJhdGUgbm9uLWZhdGFsIGZhaWx1cmVzLCBzdWNoIGFzIGBBRERfRkFJTFVSRSpgIGFuZAorYEVYUEVDVF8qYC4KKworX05vdGVfOiBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFyZSBub3QgY29uc2lkZXJlZCB2b2lkLXJldHVybmluZworZnVuY3Rpb25zLCBhY2NvcmRpbmcgdG8gdGhlIEMrKyBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uLCBhbmQgc28geW91IG1heSBub3QgdXNlCitmYXRhbCBhc3NlcnRpb25zIGluIHRoZW0uIFlvdSdsbCBnZXQgYSBjb21waWxhdGlvbiBlcnJvciBpZiB5b3UgdHJ5LiBBIHNpbXBsZQord29ya2Fyb3VuZCBpcyB0byB0cmFuc2ZlciB0aGUgZW50aXJlIGJvZHkgb2YgdGhlIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgdG8gYQorcHJpdmF0ZSB2b2lkLXJldHVybmluZyBtZXRob2QuIEhvd2V2ZXIsIHlvdSBzaG91bGQgYmUgYXdhcmUgdGhhdCBhIGZhdGFsCithc3NlcnRpb24gZmFpbHVyZSBpbiBhIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgY3VycmVudCB0ZXN0LCBhcyB5b3VyCitpbnR1aXRpb24gbWlnaHQgc3VnZ2VzdDsgaXQgbWVyZWx5IHJldHVybnMgZnJvbSB0aGUgY29uc3RydWN0b3IgZWFybHksIHBvc3NpYmx5CitsZWF2aW5nIHlvdXIgb2JqZWN0IGluIGEgcGFydGlhbGx5LWNvbnN0cnVjdGVkIHN0YXRlLiBMaWtld2lzZSwgYSBmYXRhbAorYXNzZXJ0aW9uIGZhaWx1cmUgaW4gYSBkZXN0cnVjdG9yIG1heSBsZWF2ZSB5b3VyIG9iamVjdCBpbiBhCitwYXJ0aWFsbHktZGVzdHJ1Y3RlZCBzdGF0ZS4gVXNlIGFzc2VydGlvbnMgY2FyZWZ1bGx5IGluIHRoZXNlIHNpdHVhdGlvbnMhCisKKyMgVGVhY2hpbmcgR29vZ2xlIFRlc3QgSG93IHRvIFByaW50IFlvdXIgVmFsdWVzICMKKworV2hlbiBhIHRlc3QgYXNzZXJ0aW9uIHN1Y2ggYXMgYEVYUEVDVF9FUWAgZmFpbHMsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUKK2FyZ3VtZW50IHZhbHVlcyB0byBoZWxwIHlvdSBkZWJ1Zy4gIEl0IGRvZXMgdGhpcyB1c2luZyBhCit1c2VyLWV4dGVuc2libGUgdmFsdWUgcHJpbnRlci4KKworVGhpcyBwcmludGVyIGtub3dzIGhvdyB0byBwcmludCBidWlsdC1pbiBDKysgdHlwZXMsIG5hdGl2ZSBhcnJheXMsIFNUTAorY29udGFpbmVycywgYW5kIGFueSB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlIGA8PGAgb3BlcmF0b3IuICBGb3Igb3RoZXIKK3R5cGVzLCBpdCBwcmludHMgdGhlIHJhdyBieXRlcyBpbiB0aGUgdmFsdWUgYW5kIGhvcGVzIHRoYXQgeW91IHRoZQordXNlciBjYW4gZmlndXJlIGl0IG91dC4KKworQXMgbWVudGlvbmVkIGVhcmxpZXIsIHRoZSBwcmludGVyIGlzIF9leHRlbnNpYmxlXy4gIFRoYXQgbWVhbnMKK3lvdSBjYW4gdGVhY2ggaXQgdG8gZG8gYSBiZXR0ZXIgam9iIGF0IHByaW50aW5nIHlvdXIgcGFydGljdWxhciB0eXBlCit0aGFuIHRvIGR1bXAgdGhlIGJ5dGVzLiAgVG8gZG8gdGhhdCwgZGVmaW5lIGA8PGAgZm9yIHlvdXIgdHlwZToKKworYGBgCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBmb28geworCitjbGFzcyBCYXIgeyAuLi4gfTsgIC8vIFdlIHdhbnQgR29vZ2xlIFRlc3QgdG8gYmUgYWJsZSB0byBwcmludCBpbnN0YW5jZXMgb2YgdGhpcy4KKworLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgPDwgb3BlcmF0b3IgaXMgZGVmaW5lZCBpbiB0aGUgU0FNRQorLy8gbmFtZXNwYWNlIHRoYXQgZGVmaW5lcyBCYXIuICBDKysncyBsb29rLXVwIHJ1bGVzIHJlbHkgb24gdGhhdC4KKzo6c3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQmFyJiBiYXIpIHsKKyAgcmV0dXJuIG9zIDw8IGJhci5EZWJ1Z1N0cmluZygpOyAgLy8gd2hhdGV2ZXIgbmVlZGVkIHRvIHByaW50IGJhciB0byBvcworfQorCit9ICAvLyBuYW1lc3BhY2UgZm9vCitgYGAKKworU29tZXRpbWVzLCB0aGlzIG1pZ2h0IG5vdCBiZSBhbiBvcHRpb246IHlvdXIgdGVhbSBtYXkgY29uc2lkZXIgaXQgYmFkCitzdHlsZSB0byBoYXZlIGEgYDw8YCBvcGVyYXRvciBmb3IgYEJhcmAsIG9yIGBCYXJgIG1heSBhbHJlYWR5IGhhdmUgYQorYDw8YCBvcGVyYXRvciB0aGF0IGRvZXNuJ3QgZG8gd2hhdCB5b3Ugd2FudCAoYW5kIHlvdSBjYW5ub3QgY2hhbmdlCitpdCkuICBJZiBzbywgeW91IGNhbiBpbnN0ZWFkIGRlZmluZSBhIGBQcmludFRvKClgIGZ1bmN0aW9uIGxpa2UgdGhpczoKKworYGBgCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBmb28geworCitjbGFzcyBCYXIgeyAuLi4gfTsKKworLy8gSXQncyBpbXBvcnRhbnQgdGhhdCBQcmludFRvKCkgaXMgZGVmaW5lZCBpbiB0aGUgU0FNRQorLy8gbmFtZXNwYWNlIHRoYXQgZGVmaW5lcyBCYXIuICBDKysncyBsb29rLXVwIHJ1bGVzIHJlbHkgb24gdGhhdC4KK3ZvaWQgUHJpbnRUbyhjb25zdCBCYXImIGJhciwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCBiYXIuRGVidWdTdHJpbmcoKTsgIC8vIHdoYXRldmVyIG5lZWRlZCB0byBwcmludCBiYXIgdG8gb3MKK30KKworfSAgLy8gbmFtZXNwYWNlIGZvbworYGBgCisKK0lmIHlvdSBoYXZlIGRlZmluZWQgYm90aCBgPDxgIGFuZCBgUHJpbnRUbygpYCwgdGhlIGxhdHRlciB3aWxsIGJlIHVzZWQKK3doZW4gR29vZ2xlIFRlc3QgaXMgY29uY2VybmVkLiAgVGhpcyBhbGxvd3MgeW91IHRvIGN1c3RvbWl6ZSBob3cgdGhlIHZhbHVlCithcHBlYXJzIGluIEdvb2dsZSBUZXN0J3Mgb3V0cHV0IHdpdGhvdXQgYWZmZWN0aW5nIGNvZGUgdGhhdCByZWxpZXMgb24gdGhlCitiZWhhdmlvciBvZiBpdHMgYDw8YCBvcGVyYXRvci4KKworSWYgeW91IHdhbnQgdG8gcHJpbnQgYSB2YWx1ZSBgeGAgdXNpbmcgR29vZ2xlIFRlc3QncyB2YWx1ZSBwcmludGVyCit5b3Vyc2VsZiwganVzdCBjYWxsIGA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoYF94X2ApYCwgd2hpY2gKK3JldHVybnMgYW4gYHN0ZDo6c3RyaW5nYDoKKworYGBgCit2ZWN0b3I8cGFpcjxCYXIsIGludD4gPiBiYXJfaW50cyA9IEdldEJhckludFZlY3RvcigpOworCitFWFBFQ1RfVFJVRShJc0NvcnJlY3RCYXJJbnRWZWN0b3IoYmFyX2ludHMpKQorICAgIDw8ICJiYXJfaW50cyA9ICIgPDwgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKGJhcl9pbnRzKTsKK2BgYAorCisjIERlYXRoIFRlc3RzICMKKworSW4gbWFueSBhcHBsaWNhdGlvbnMsIHRoZXJlIGFyZSBhc3NlcnRpb25zIHRoYXQgY2FuIGNhdXNlIGFwcGxpY2F0aW9uIGZhaWx1cmUKK2lmIGEgY29uZGl0aW9uIGlzIG5vdCBtZXQuIFRoZXNlIHNhbml0eSBjaGVja3MsIHdoaWNoIGVuc3VyZSB0aGF0IHRoZSBwcm9ncmFtCitpcyBpbiBhIGtub3duIGdvb2Qgc3RhdGUsIGFyZSB0aGVyZSB0byBmYWlsIGF0IHRoZSBlYXJsaWVzdCBwb3NzaWJsZSB0aW1lIGFmdGVyCitzb21lIHByb2dyYW0gc3RhdGUgaXMgY29ycnVwdGVkLiBJZiB0aGUgYXNzZXJ0aW9uIGNoZWNrcyB0aGUgd3JvbmcgY29uZGl0aW9uLAordGhlbiB0aGUgcHJvZ3JhbSBtYXkgcHJvY2VlZCBpbiBhbiBlcnJvbmVvdXMgc3RhdGUsIHdoaWNoIGNvdWxkIGxlYWQgdG8gbWVtb3J5Citjb3JydXB0aW9uLCBzZWN1cml0eSBob2xlcywgb3Igd29yc2UuIEhlbmNlIGl0IGlzIHZpdGFsbHkgaW1wb3J0YW50IHRvIHRlc3QKK3RoYXQgc3VjaCBhc3NlcnRpb24gc3RhdGVtZW50cyB3b3JrIGFzIGV4cGVjdGVkLgorCitTaW5jZSB0aGVzZSBwcmVjb25kaXRpb24gY2hlY2tzIGNhdXNlIHRoZSBwcm9jZXNzZXMgdG8gZGllLCB3ZSBjYWxsIHN1Y2ggdGVzdHMKK19kZWF0aCB0ZXN0c18uIE1vcmUgZ2VuZXJhbGx5LCBhbnkgdGVzdCB0aGF0IGNoZWNrcyB0aGF0IGEgcHJvZ3JhbSB0ZXJtaW5hdGVzCisoZXhjZXB0IGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbikgaW4gYW4gZXhwZWN0ZWQgZmFzaGlvbiBpcyBhbHNvIGEgZGVhdGggdGVzdC4KKworTm90ZSB0aGF0IGlmIGEgcGllY2Ugb2YgY29kZSB0aHJvd3MgYW4gZXhjZXB0aW9uLCB3ZSBkb24ndCBjb25zaWRlciBpdCAiZGVhdGgiCitmb3IgdGhlIHB1cnBvc2Ugb2YgZGVhdGggdGVzdHMsIGFzIHRoZSBjYWxsZXIgb2YgdGhlIGNvZGUgY291bGQgY2F0Y2ggdGhlIGV4Y2VwdGlvbgorYW5kIGF2b2lkIHRoZSBjcmFzaC4gSWYgeW91IHdhbnQgdG8gdmVyaWZ5IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHlvdXIgY29kZSwKK3NlZSBbRXhjZXB0aW9uIEFzc2VydGlvbnNdKCNFeGNlcHRpb25fQXNzZXJ0aW9ucy5tZCkuCisKK0lmIHlvdSB3YW50IHRvIHRlc3QgYEVYUEVDVF8qKCkvQVNTRVJUXyooKWAgZmFpbHVyZXMgaW4geW91ciB0ZXN0IGNvZGUsIHNlZSBbQ2F0Y2hpbmcgRmFpbHVyZXNdKCNDYXRjaGluZ19GYWlsdXJlcy5tZCkuCisKKyMjIEhvdyB0byBXcml0ZSBhIERlYXRoIFRlc3QgIyMKKworR29vZ2xlIFRlc3QgaGFzIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIHN1cHBvcnQgZGVhdGggdGVzdHM6CisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfREVBVEgoYF9zdGF0ZW1lbnQsIHJlZ2V4X2ApOyB8IGBFWFBFQ1RfREVBVEgoYF9zdGF0ZW1lbnQsIHJlZ2V4X2ApOyB8IF9zdGF0ZW1lbnRfIGNyYXNoZXMgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgfAorfCBgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChgX3N0YXRlbWVudCwgcmVnZXhfYCk7IHwgYEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoYF9zdGF0ZW1lbnQsIHJlZ2V4X2ApOyB8IGlmIGRlYXRoIHRlc3RzIGFyZSBzdXBwb3J0ZWQsIHZlcmlmaWVzIHRoYXQgX3N0YXRlbWVudF8gY3Jhc2hlcyB3aXRoIHRoZSBnaXZlbiBlcnJvcjsgb3RoZXJ3aXNlIHZlcmlmaWVzIG5vdGhpbmcgfAorfCBgQVNTRVJUX0VYSVQoYF9zdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXhfYCk7IHwgYEVYUEVDVF9FWElUKGBfc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4X2ApOyB8X3N0YXRlbWVudF8gZXhpdHMgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgYW5kIGl0cyBleGl0IGNvZGUgbWF0Y2hlcyBfcHJlZGljYXRlXyB8CisKK3doZXJlIF9zdGF0ZW1lbnRfIGlzIGEgc3RhdGVtZW50IHRoYXQgaXMgZXhwZWN0ZWQgdG8gY2F1c2UgdGhlIHByb2Nlc3MgdG8KK2RpZSwgX3ByZWRpY2F0ZV8gaXMgYSBmdW5jdGlvbiBvciBmdW5jdGlvbiBvYmplY3QgdGhhdCBldmFsdWF0ZXMgYW4gaW50ZWdlcgorZXhpdCBzdGF0dXMsIGFuZCBfcmVnZXhfIGlzIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgdGhlIHN0ZGVyciBvdXRwdXQgb2YKK19zdGF0ZW1lbnRfIGlzIGV4cGVjdGVkIHRvIG1hdGNoLiBOb3RlIHRoYXQgX3N0YXRlbWVudF8gY2FuIGJlIF9hbnkgdmFsaWQKK3N0YXRlbWVudF8gKGluY2x1ZGluZyBfY29tcG91bmQgc3RhdGVtZW50XykgYW5kIGRvZXNuJ3QgaGF2ZSB0byBiZSBhbgorZXhwcmVzc2lvbi4KKworQXMgdXN1YWwsIHRoZSBgQVNTRVJUYCB2YXJpYW50cyBhYm9ydCB0aGUgY3VycmVudCB0ZXN0IGZ1bmN0aW9uLCB3aGlsZSB0aGUKK2BFWFBFQ1RgIHZhcmlhbnRzIGRvIG5vdC4KKworKipOb3RlOioqIFdlIHVzZSB0aGUgd29yZCAiY3Jhc2giIGhlcmUgdG8gbWVhbiB0aGF0IHRoZSBwcm9jZXNzCit0ZXJtaW5hdGVzIHdpdGggYSBfbm9uLXplcm9fIGV4aXQgc3RhdHVzIGNvZGUuICBUaGVyZSBhcmUgdHdvCitwb3NzaWJpbGl0aWVzOiBlaXRoZXIgdGhlIHByb2Nlc3MgaGFzIGNhbGxlZCBgZXhpdCgpYCBvciBgX2V4aXQoKWAKK3dpdGggYSBub24temVybyB2YWx1ZSwgb3IgaXQgbWF5IGJlIGtpbGxlZCBieSBhIHNpZ25hbC4KKworVGhpcyBtZWFucyB0aGF0IGlmIF9zdGF0ZW1lbnRfIHRlcm1pbmF0ZXMgdGhlIHByb2Nlc3Mgd2l0aCBhIDAgZXhpdAorY29kZSwgaXQgaXMgX25vdF8gY29uc2lkZXJlZCBhIGNyYXNoIGJ5IGBFWFBFQ1RfREVBVEhgLiAgVXNlCitgRVhQRUNUX0VYSVRgIGluc3RlYWQgaWYgdGhpcyBpcyB0aGUgY2FzZSwgb3IgaWYgeW91IHdhbnQgdG8gcmVzdHJpY3QKK3RoZSBleGl0IGNvZGUgbW9yZSBwcmVjaXNlbHkuCisKK0EgcHJlZGljYXRlIGhlcmUgbXVzdCBhY2NlcHQgYW4gYGludGAgYW5kIHJldHVybiBhIGBib29sYC4gVGhlIGRlYXRoIHRlc3QKK3N1Y2NlZWRzIG9ubHkgaWYgdGhlIHByZWRpY2F0ZSByZXR1cm5zIGB0cnVlYC4gR29vZ2xlIFRlc3QgZGVmaW5lcyBhIGZldworcHJlZGljYXRlcyB0aGF0IGhhbmRsZSB0aGUgbW9zdCBjb21tb24gY2FzZXM6CisKK2BgYAorOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZShleGl0X2NvZGUpCitgYGAKKworVGhpcyBleHByZXNzaW9uIGlzIGB0cnVlYCBpZiB0aGUgcHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkgd2l0aCB0aGUgZ2l2ZW4gZXhpdAorY29kZS4KKworYGBgCis6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKHNpZ25hbF9udW1iZXIpICAvLyBOb3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCitgYGAKKworVGhpcyBleHByZXNzaW9uIGlzIGB0cnVlYCBpZiB0aGUgcHJvZ3JhbSB3YXMga2lsbGVkIGJ5IHRoZSBnaXZlbiBzaWduYWwuCisKK1RoZSBgKl9ERUFUSGAgbWFjcm9zIGFyZSBjb252ZW5pZW50IHdyYXBwZXJzIGZvciBgKl9FWElUYCB0aGF0IHVzZSBhIHByZWRpY2F0ZQordGhhdCB2ZXJpZmllcyB0aGUgcHJvY2VzcycgZXhpdCBjb2RlIGlzIG5vbi16ZXJvLgorCitOb3RlIHRoYXQgYSBkZWF0aCB0ZXN0IG9ubHkgY2FyZXMgYWJvdXQgdGhyZWUgdGhpbmdzOgorCisgIDEuIGRvZXMgX3N0YXRlbWVudF8gYWJvcnQgb3IgZXhpdCB0aGUgcHJvY2Vzcz8KKyAgMS4gKGluIHRoZSBjYXNlIG9mIGBBU1NFUlRfRVhJVGAgYW5kIGBFWFBFQ1RfRVhJVGApIGRvZXMgdGhlIGV4aXQgc3RhdHVzIHNhdGlzZnkgX3ByZWRpY2F0ZV8/ICBPciAoaW4gdGhlIGNhc2Ugb2YgYEFTU0VSVF9ERUFUSGAgYW5kIGBFWFBFQ1RfREVBVEhgKSBpcyB0aGUgZXhpdCBzdGF0dXMgbm9uLXplcm8/ICBBbmQKKyAgMS4gZG9lcyB0aGUgc3RkZXJyIG91dHB1dCBtYXRjaCBfcmVnZXhfPworCitJbiBwYXJ0aWN1bGFyLCBpZiBfc3RhdGVtZW50XyBnZW5lcmF0ZXMgYW4gYEFTU0VSVF8qYCBvciBgRVhQRUNUXypgIGZhaWx1cmUsIGl0IHdpbGwgKipub3QqKiBjYXVzZSB0aGUgZGVhdGggdGVzdCB0byBmYWlsLCBhcyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGRvbid0IGFib3J0IHRoZSBwcm9jZXNzLgorCitUbyB3cml0ZSBhIGRlYXRoIHRlc3QsIHNpbXBseSB1c2Ugb25lIG9mIHRoZSBhYm92ZSBtYWNyb3MgaW5zaWRlIHlvdXIgdGVzdAorZnVuY3Rpb24uIEZvciBleGFtcGxlLAorCitgYGAKK1RFU1QoTXlEZWF0aFRlc3QsIEZvbykgeworICAvLyBUaGlzIGRlYXRoIHRlc3QgdXNlcyBhIGNvbXBvdW5kIHN0YXRlbWVudC4KKyAgQVNTRVJUX0RFQVRIKHsgaW50IG4gPSA1OyBGb28oJm4pOyB9LCAiRXJyb3Igb24gbGluZSAuKiBvZiBGb28oKSIpOworfQorVEVTVChNeURlYXRoVGVzdCwgTm9ybWFsRXhpdCkgeworICBFWFBFQ1RfRVhJVChOb3JtYWxFeGl0KCksIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICJTdWNjZXNzIik7Cit9CitURVNUKE15RGVhdGhUZXN0LCBLaWxsTXlzZWxmKSB7CisgIEVYUEVDVF9FWElUKEtpbGxNeXNlbGYoKSwgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdLSUxMKSwgIlNlbmRpbmcgbXlzZWxmIHVuYmxvY2thYmxlIHNpZ25hbCIpOworfQorYGBgCisKK3ZlcmlmaWVzIHRoYXQ6CisKKyAgKiBjYWxsaW5nIGBGb28oNSlgIGNhdXNlcyB0aGUgcHJvY2VzcyB0byBkaWUgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSwKKyAgKiBjYWxsaW5nIGBOb3JtYWxFeGl0KClgIGNhdXNlcyB0aGUgcHJvY2VzcyB0byBwcmludCBgIlN1Y2Nlc3MiYCB0byBzdGRlcnIgYW5kIGV4aXQgd2l0aCBleGl0IGNvZGUgMCwgYW5kCisgICogY2FsbGluZyBgS2lsbE15c2VsZigpYCBraWxscyB0aGUgcHJvY2VzcyB3aXRoIHNpZ25hbCBgU0lHS0lMTGAuCisKK1RoZSB0ZXN0IGZ1bmN0aW9uIGJvZHkgbWF5IGNvbnRhaW4gb3RoZXIgYXNzZXJ0aW9ucyBhbmQgc3RhdGVtZW50cyBhcyB3ZWxsLCBpZgorbmVjZXNzYXJ5LgorCitfSW1wb3J0YW50Ol8gV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdSB0byBmb2xsb3cgdGhlIGNvbnZlbnRpb24gb2YgbmFtaW5nIHlvdXIKK3Rlc3QgY2FzZSAobm90IHRlc3QpIGAqRGVhdGhUZXN0YCB3aGVuIGl0IGNvbnRhaW5zIGEgZGVhdGggdGVzdCwgYXMKK2RlbW9uc3RyYXRlZCBpbiB0aGUgYWJvdmUgZXhhbXBsZS4gVGhlIGBEZWF0aCBUZXN0cyBBbmQgVGhyZWFkc2Agc2VjdGlvbiBiZWxvdworZXhwbGFpbnMgd2h5LgorCitJZiBhIHRlc3QgZml4dHVyZSBjbGFzcyBpcyBzaGFyZWQgYnkgbm9ybWFsIHRlc3RzIGFuZCBkZWF0aCB0ZXN0cywgeW91CitjYW4gdXNlIHR5cGVkZWYgdG8gaW50cm9kdWNlIGFuIGFsaWFzIGZvciB0aGUgZml4dHVyZSBjbGFzcyBhbmQgYXZvaWQKK2R1cGxpY2F0aW5nIGl0cyBjb2RlOgorYGBgCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7IC4uLiB9OworCit0eXBlZGVmIEZvb1Rlc3QgRm9vRGVhdGhUZXN0OworCitURVNUX0YoRm9vVGVzdCwgRG9lc1RoaXMpIHsKKyAgLy8gbm9ybWFsIHRlc3QKK30KKworVEVTVF9GKEZvb0RlYXRoVGVzdCwgRG9lc1RoYXQpIHsKKyAgLy8gZGVhdGggdGVzdAorfQorYGBgCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cyAocmVxdWlyZXMgTVNWQyA4LjAgb3IgYWJvdmUpLCBDeWd3aW4sIGFuZCBNYWMgKHRoZSBsYXR0ZXIgdGhyZWUgYXJlIHN1cHBvcnRlZCBzaW5jZSB2MS4zLjApLiAgYChBU1NFUlR8RVhQRUNUKV9ERUFUSF9JRl9TVVBQT1JURURgIGFyZSBuZXcgaW4gdjEuNC4wLgorCisjIyBSZWd1bGFyIEV4cHJlc3Npb24gU3ludGF4ICMjCisKK09uIFBPU0lYIHN5c3RlbXMgKGUuZy4gTGludXgsIEN5Z3dpbiwgYW5kIE1hYyksIEdvb2dsZSBUZXN0IHVzZXMgdGhlCitbUE9TSVggZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uXShodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvYmFzZWRlZnMveGJkX2NoYXAwOS5odG1sI3RhZ18wOV8wNCkKK3N5bnRheCBpbiBkZWF0aCB0ZXN0cy4gVG8gbGVhcm4gYWJvdXQgdGhpcyBzeW50YXgsIHlvdSBtYXkgd2FudCB0byByZWFkIHRoaXMgW1dpa2lwZWRpYSBlbnRyeV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWd1bGFyX2V4cHJlc3Npb24jUE9TSVhfRXh0ZW5kZWRfUmVndWxhcl9FeHByZXNzaW9ucykuCisKK09uIFdpbmRvd3MsIEdvb2dsZSBUZXN0IHVzZXMgaXRzIG93biBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uCitpbXBsZW1lbnRhdGlvbi4gSXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUE9TSVggZXh0ZW5kZWQKK3JlZ3VsYXIgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydCB1bmlvbiAoYCJ4fHkiYCksCitncm91cGluZyAoYCIoeHkpImApLCBicmFja2V0cyAoYCJbeHldImApLCBhbmQgcmVwZXRpdGlvbiBjb3VudAorKGAieHs1LDd9ImApLCBhbW9uZyBvdGhlcnMuIEJlbG93IGlzIHdoYXQgd2UgZG8gc3VwcG9ydCAoTGV0dGVyIGBBYCBkZW5vdGVzIGEKK2xpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKGAuYCksIG9yIGEgc2luZ2xlIGBcXGAgZXNjYXBlIHNlcXVlbmNlOyBgeGAKK2FuZCBgeWAgZGVub3RlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuKToKKworfCBgY2AgfCBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBgY2AgfAorfDotLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBgXFxkYCB8IG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQgICAgICAgICB8Cit8IGBcXERgIHwgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQncyBub3QgYSBkZWNpbWFsIGRpZ2l0IHwKK3wgYFxcZmAgfCBtYXRjaGVzIGBcZmAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgXFxuYCB8IG1hdGNoZXMgYFxuYCAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBcXHJgIHwgbWF0Y2hlcyBgXHJgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYFxcc2AgfCBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgYFxuYCB8Cit8IGBcXFNgIHwgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQncyBub3QgYSB3aGl0ZXNwYWNlIHwKK3wgYFxcdGAgfCBtYXRjaGVzIGBcdGAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgXFx2YCB8IG1hdGNoZXMgYFx2YCAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBcXHdgIHwgbWF0Y2hlcyBhbnkgbGV0dGVyLCBgX2AsIG9yIGRlY2ltYWwgZGlnaXQgfAorfCBgXFxXYCB8IG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IGBcXHdgIGRvZXNuJ3QgbWF0Y2ggfAorfCBgXFxjYCB8IG1hdGNoZXMgYW55IGxpdGVyYWwgY2hhcmFjdGVyIGBjYCwgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uIHwKK3wgYFxcLmAgfCBtYXRjaGVzIHRoZSBgLmAgY2hhcmFjdGVyICAgICAgICAgfAorfCBgLmAgfCBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIGV4Y2VwdCBgXG5gIHwKK3wgYEE/YCB8IG1hdGNoZXMgMCBvciAxIG9jY3VycmVuY2VzIG9mIGBBYCB8Cit8IGBBKmAgfCBtYXRjaGVzIDAgb3IgbWFueSBvY2N1cnJlbmNlcyBvZiBgQWAgfAorfCBgQStgIHwgbWF0Y2hlcyAxIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgYEFgIHwKK3wgYF5gIHwgbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RyaW5nIChub3QgdGhhdCBvZiBlYWNoIGxpbmUpIHwKK3wgYCRgIHwgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nIChub3QgdGhhdCBvZiBlYWNoIGxpbmUpIHwKK3wgYHh5YCB8IG1hdGNoZXMgYHhgIGZvbGxvd2VkIGJ5IGB5YCAgICAgICB8CisKK1RvIGhlbHAgeW91IGRldGVybWluZSB3aGljaCBjYXBhYmlsaXR5IGlzIGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbSwKK0dvb2dsZSBUZXN0IGRlZmluZXMgbWFjcm8gYEdURVNUX1VTRVNfUE9TSVhfUkU9MWAgd2hlbiBpdCB1c2VzIFBPU0lYCitleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb25zLCBvciBgR1RFU1RfVVNFU19TSU1QTEVfUkU9MWAgd2hlbiBpdCB1c2VzCit0aGUgc2ltcGxlIHZlcnNpb24uICBJZiB5b3Ugd2FudCB5b3VyIGRlYXRoIHRlc3RzIHRvIHdvcmsgaW4gYm90aAorY2FzZXMsIHlvdSBjYW4gZWl0aGVyIGAjaWZgIG9uIHRoZXNlIG1hY3JvcyBvciB1c2UgdGhlIG1vcmUgbGltaXRlZAorc3ludGF4IG9ubHkuCisKKyMjIEhvdyBJdCBXb3JrcyAjIworCitVbmRlciB0aGUgaG9vZCwgYEFTU0VSVF9FWElUKClgIHNwYXducyBhIG5ldyBwcm9jZXNzIGFuZCBleGVjdXRlcyB0aGUKK2RlYXRoIHRlc3Qgc3RhdGVtZW50IGluIHRoYXQgcHJvY2Vzcy4gVGhlIGRldGFpbHMgb2Ygb2YgaG93IHByZWNpc2VseQordGhhdCBoYXBwZW5zIGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0gYW5kIHRoZSB2YXJpYWJsZQorYDo6dGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKWAgKHdoaWNoIGlzIGluaXRpYWxpemVkIGZyb20gdGhlCitjb21tYW5kLWxpbmUgZmxhZyBgLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlYCkuCisKKyAgKiBPbiBQT1NJWCBzeXN0ZW1zLCBgZm9yaygpYCAob3IgYGNsb25lKClgIG9uIExpbnV4KSBpcyB1c2VkIHRvIHNwYXduIHRoZSBjaGlsZCwgYWZ0ZXIgd2hpY2g6CisgICAgKiBJZiB0aGUgdmFyaWFibGUncyB2YWx1ZSBpcyBgImZhc3QiYCwgdGhlIGRlYXRoIHRlc3Qgc3RhdGVtZW50IGlzIGltbWVkaWF0ZWx5IGV4ZWN1dGVkLgorICAgICogSWYgdGhlIHZhcmlhYmxlJ3MgdmFsdWUgaXMgYCJ0aHJlYWRzYWZlImAsIHRoZSBjaGlsZCBwcm9jZXNzIHJlLWV4ZWN1dGVzIHRoZSB1bml0IHRlc3QgYmluYXJ5IGp1c3QgYXMgaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZCwgYnV0IHdpdGggc29tZSBleHRyYSBmbGFncyB0byBjYXVzZSBqdXN0IHRoZSBzaW5nbGUgZGVhdGggdGVzdCB1bmRlciBjb25zaWRlcmF0aW9uIHRvIGJlIHJ1bi4KKyAgKiBPbiBXaW5kb3dzLCB0aGUgY2hpbGQgaXMgc3Bhd25lZCB1c2luZyB0aGUgYENyZWF0ZVByb2Nlc3MoKWAgQVBJLCBhbmQgcmUtZXhlY3V0ZXMgdGhlIGJpbmFyeSB0byBjYXVzZSBqdXN0IHRoZSBzaW5nbGUgZGVhdGggdGVzdCB1bmRlciBjb25zaWRlcmF0aW9uIHRvIGJlIHJ1biAtIG11Y2ggbGlrZSB0aGUgYHRocmVhZHNhZmVgIG1vZGUgb24gUE9TSVguCisKK090aGVyIHZhbHVlcyBmb3IgdGhlIHZhcmlhYmxlIGFyZSBpbGxlZ2FsIGFuZCB3aWxsIGNhdXNlIHRoZSBkZWF0aCB0ZXN0IHRvCitmYWlsLiBDdXJyZW50bHksIHRoZSBmbGFnJ3MgZGVmYXVsdCB2YWx1ZSBpcyBgImZhc3QiYC4gSG93ZXZlciwgd2UgcmVzZXJ2ZSB0aGUKK3JpZ2h0IHRvIGNoYW5nZSBpdCBpbiB0aGUgZnV0dXJlLiBUaGVyZWZvcmUsIHlvdXIgdGVzdHMgc2hvdWxkIG5vdCBkZXBlbmQgb24KK3RoaXMuCisKK0luIGVpdGhlciBjYXNlLCB0aGUgcGFyZW50IHByb2Nlc3Mgd2FpdHMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGNvbXBsZXRlLCBhbmQgY2hlY2tzIHRoYXQKKworICAxLiB0aGUgY2hpbGQncyBleGl0IHN0YXR1cyBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZSwgYW5kCisgIDEuIHRoZSBjaGlsZCdzIHN0ZGVyciBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisKK0lmIHRoZSBkZWF0aCB0ZXN0IHN0YXRlbWVudCBydW5zIHRvIGNvbXBsZXRpb24gd2l0aG91dCBkeWluZywgdGhlIGNoaWxkCitwcm9jZXNzIHdpbGwgbm9uZXRoZWxlc3MgdGVybWluYXRlLCBhbmQgdGhlIGFzc2VydGlvbiBmYWlscy4KKworIyMgRGVhdGggVGVzdHMgQW5kIFRocmVhZHMgIyMKKworVGhlIHJlYXNvbiBmb3IgdGhlIHR3byBkZWF0aCB0ZXN0IHN0eWxlcyBoYXMgdG8gZG8gd2l0aCB0aHJlYWQgc2FmZXR5LiBEdWUgdG8KK3dlbGwta25vd24gcHJvYmxlbXMgd2l0aCBmb3JraW5nIGluIHRoZSBwcmVzZW5jZSBvZiB0aHJlYWRzLCBkZWF0aCB0ZXN0cyBzaG91bGQKK2JlIHJ1biBpbiBhIHNpbmdsZS10aHJlYWRlZCBjb250ZXh0LiBTb21ldGltZXMsIGhvd2V2ZXIsIGl0IGlzbid0IGZlYXNpYmxlIHRvCithcnJhbmdlIHRoYXQga2luZCBvZiBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIHN0YXRpY2FsbHktaW5pdGlhbGl6ZWQgbW9kdWxlcworbWF5IHN0YXJ0IHRocmVhZHMgYmVmb3JlIG1haW4gaXMgZXZlciByZWFjaGVkLiBPbmNlIHRocmVhZHMgaGF2ZSBiZWVuIGNyZWF0ZWQsCitpdCBtYXkgYmUgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8gY2xlYW4gdGhlbSB1cC4KKworR29vZ2xlIFRlc3QgaGFzIHRocmVlIGZlYXR1cmVzIGludGVuZGVkIHRvIHJhaXNlIGF3YXJlbmVzcyBvZiB0aHJlYWRpbmcgaXNzdWVzLgorCisgIDEuIEEgd2FybmluZyBpcyBlbWl0dGVkIGlmIG11bHRpcGxlIHRocmVhZHMgYXJlIHJ1bm5pbmcgd2hlbiBhIGRlYXRoIHRlc3QgaXMgZW5jb3VudGVyZWQuCisgIDEuIFRlc3QgY2FzZXMgd2l0aCBhIG5hbWUgZW5kaW5nIGluICJEZWF0aFRlc3QiIGFyZSBydW4gYmVmb3JlIGFsbCBvdGhlciB0ZXN0cy4KKyAgMS4gSXQgdXNlcyBgY2xvbmUoKWAgaW5zdGVhZCBvZiBgZm9yaygpYCB0byBzcGF3biB0aGUgY2hpbGQgcHJvY2VzcyBvbiBMaW51eCAoYGNsb25lKClgIGlzIG5vdCBhdmFpbGFibGUgb24gQ3lnd2luIGFuZCBNYWMpLCBhcyBgZm9yaygpYCBpcyBtb3JlIGxpa2VseSB0byBjYXVzZSB0aGUgY2hpbGQgdG8gaGFuZyB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBoYXMgbXVsdGlwbGUgdGhyZWFkcy4KKworSXQncyBwZXJmZWN0bHkgZmluZSB0byBjcmVhdGUgdGhyZWFkcyBpbnNpZGUgYSBkZWF0aCB0ZXN0IHN0YXRlbWVudDsgdGhleSBhcmUKK2V4ZWN1dGVkIGluIGEgc2VwYXJhdGUgcHJvY2VzcyBhbmQgY2Fubm90IGFmZmVjdCB0aGUgcGFyZW50LgorCisjIyBEZWF0aCBUZXN0IFN0eWxlcyAjIworCitUaGUgInRocmVhZHNhZmUiIGRlYXRoIHRlc3Qgc3R5bGUgd2FzIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gaGVscCBtaXRpZ2F0ZSB0aGUKK3Jpc2tzIG9mIHRlc3RpbmcgaW4gYSBwb3NzaWJseSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50LiBJdCB0cmFkZXMgaW5jcmVhc2VkCit0ZXN0IGV4ZWN1dGlvbiB0aW1lIChwb3RlbnRpYWxseSBkcmFtYXRpY2FsbHkgc28pIGZvciBpbXByb3ZlZCB0aHJlYWQgc2FmZXR5LgorV2Ugc3VnZ2VzdCB1c2luZyB0aGUgZmFzdGVyLCBkZWZhdWx0ICJmYXN0IiBzdHlsZSB1bmxlc3MgeW91ciB0ZXN0IGhhcyBzcGVjaWZpYworcHJvYmxlbXMgd2l0aCBpdC4KKworWW91IGNhbiBjaG9vc2UgYSBwYXJ0aWN1bGFyIHN0eWxlIG9mIGRlYXRoIHRlc3RzIGJ5IHNldHRpbmcgdGhlIGZsYWcKK3Byb2dyYW1tYXRpY2FsbHk6CisKK2BgYAorOjp0ZXN0aW5nOjpGTEFHU19ndGVzdF9kZWF0aF90ZXN0X3N0eWxlID0gInRocmVhZHNhZmUiOworYGBgCisKK1lvdSBjYW4gZG8gdGhpcyBpbiBgbWFpbigpYCB0byBzZXQgdGhlIHN0eWxlIGZvciBhbGwgZGVhdGggdGVzdHMgaW4gdGhlCitiaW5hcnksIG9yIGluIGluZGl2aWR1YWwgdGVzdHMuIFJlY2FsbCB0aGF0IGZsYWdzIGFyZSBzYXZlZCBiZWZvcmUgcnVubmluZyBlYWNoCit0ZXN0IGFuZCByZXN0b3JlZCBhZnRlcndhcmRzLCBzbyB5b3UgbmVlZCBub3QgZG8gdGhhdCB5b3Vyc2VsZi4gRm9yIGV4YW1wbGU6CisKK2BgYAorVEVTVChNeURlYXRoVGVzdCwgVGVzdE9uZSkgeworICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAidGhyZWFkc2FmZSI7CisgIC8vIFRoaXMgdGVzdCBpcyBydW4gaW4gdGhlICJ0aHJlYWRzYWZlIiBzdHlsZToKKyAgQVNTRVJUX0RFQVRIKFRoaXNTaG91bGREaWUoKSwgIiIpOworfQorCitURVNUKE15RGVhdGhUZXN0LCBUZXN0VHdvKSB7CisgIC8vIFRoaXMgdGVzdCBpcyBydW4gaW4gdGhlICJmYXN0IiBzdHlsZToKKyAgQVNTRVJUX0RFQVRIKFRoaXNTaG91bGREaWUoKSwgIiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIDo6dGVzdGluZzo6RkxBR1NfZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSA9ICJmYXN0IjsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KK2BgYAorCisjIyBDYXZlYXRzICMjCisKK1RoZSBfc3RhdGVtZW50XyBhcmd1bWVudCBvZiBgQVNTRVJUX0VYSVQoKWAgY2FuIGJlIGFueSB2YWxpZCBDKysgc3RhdGVtZW50LgorSWYgaXQgbGVhdmVzIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHZpYSBhIGByZXR1cm5gIHN0YXRlbWVudCBvciBieSB0aHJvd2luZyBhbiBleGNlcHRpb24sCit0aGUgZGVhdGggdGVzdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkLiAgU29tZSBHb29nbGUgVGVzdCBtYWNyb3MgbWF5IHJldHVybgorZnJvbSB0aGUgY3VycmVudCBmdW5jdGlvbiAoZS5nLiBgQVNTRVJUX1RSVUUoKWApLCBzbyBiZSBzdXJlIHRvIGF2b2lkIHRoZW0gaW4gX3N0YXRlbWVudF8uCisKK1NpbmNlIF9zdGF0ZW1lbnRfIHJ1bnMgaW4gdGhlIGNoaWxkIHByb2Nlc3MsIGFueSBpbi1tZW1vcnkgc2lkZSBlZmZlY3QgKGUuZy4KK21vZGlmeWluZyBhIHZhcmlhYmxlLCByZWxlYXNpbmcgbWVtb3J5LCBldGMpIGl0IGNhdXNlcyB3aWxsIF9ub3RfIGJlIG9ic2VydmFibGUKK2luIHRoZSBwYXJlbnQgcHJvY2Vzcy4gSW4gcGFydGljdWxhciwgaWYgeW91IHJlbGVhc2UgbWVtb3J5IGluIGEgZGVhdGggdGVzdCwKK3lvdXIgcHJvZ3JhbSB3aWxsIGZhaWwgdGhlIGhlYXAgY2hlY2sgYXMgdGhlIHBhcmVudCBwcm9jZXNzIHdpbGwgbmV2ZXIgc2VlIHRoZQorbWVtb3J5IHJlY2xhaW1lZC4gVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB5b3UgY2FuCisKKyAgMS4gdHJ5IG5vdCB0byBmcmVlIG1lbW9yeSBpbiBhIGRlYXRoIHRlc3Q7CisgIDEuIGZyZWUgdGhlIG1lbW9yeSBhZ2FpbiBpbiB0aGUgcGFyZW50IHByb2Nlc3M7IG9yCisgIDEuIGRvIG5vdCB1c2UgdGhlIGhlYXAgY2hlY2tlciBpbiB5b3VyIHByb2dyYW0uCisKK0R1ZSB0byBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHlvdSBjYW5ub3QgcGxhY2UgbXVsdGlwbGUgZGVhdGggdGVzdAorYXNzZXJ0aW9ucyBvbiB0aGUgc2FtZSBsaW5lOyBvdGhlcndpc2UsIGNvbXBpbGF0aW9uIHdpbGwgZmFpbCB3aXRoIGFuIHVub2J2aW91cworZXJyb3IgbWVzc2FnZS4KKworRGVzcGl0ZSB0aGUgaW1wcm92ZWQgdGhyZWFkIHNhZmV0eSBhZmZvcmRlZCBieSB0aGUgInRocmVhZHNhZmUiIHN0eWxlIG9mIGRlYXRoCit0ZXN0LCB0aHJlYWQgcHJvYmxlbXMgc3VjaCBhcyBkZWFkbG9jayBhcmUgc3RpbGwgcG9zc2libGUgaW4gdGhlIHByZXNlbmNlIG9mCitoYW5kbGVycyByZWdpc3RlcmVkIHdpdGggYHB0aHJlYWRfYXRmb3JrKDMpYC4KKworIyBVc2luZyBBc3NlcnRpb25zIGluIFN1Yi1yb3V0aW5lcyAjCisKKyMjIEFkZGluZyBUcmFjZXMgdG8gQXNzZXJ0aW9ucyAjIworCitJZiBhIHRlc3Qgc3ViLXJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc2V2ZXJhbCBwbGFjZXMsIHdoZW4gYW4gYXNzZXJ0aW9uCitpbnNpZGUgaXQgZmFpbHMsIGl0IGNhbiBiZSBoYXJkIHRvIHRlbGwgd2hpY2ggaW52b2NhdGlvbiBvZiB0aGUKK3N1Yi1yb3V0aW5lIHRoZSBmYWlsdXJlIGlzIGZyb20uICBZb3UgY2FuIGFsbGV2aWF0ZSB0aGlzIHByb2JsZW0gdXNpbmcKK2V4dHJhIGxvZ2dpbmcgb3IgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZXMsIGJ1dCB0aGF0IHVzdWFsbHkgY2x1dHRlcnMgdXAKK3lvdXIgdGVzdHMuIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHVzZSB0aGUgYFNDT1BFRF9UUkFDRWAgbWFjcm86CisKK3wgYFNDT1BFRF9UUkFDRShgX21lc3NhZ2VfYCk7YCB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCit3aGVyZSBfbWVzc2FnZV8gY2FuIGJlIGFueXRoaW5nIHN0cmVhbWFibGUgdG8gYHN0ZDo6b3N0cmVhbWAuIFRoaXMKK21hY3JvIHdpbGwgY2F1c2UgdGhlIGN1cnJlbnQgZmlsZSBuYW1lLCBsaW5lIG51bWJlciwgYW5kIHRoZSBnaXZlbgorbWVzc2FnZSB0byBiZSBhZGRlZCBpbiBldmVyeSBmYWlsdXJlIG1lc3NhZ2UuIFRoZSBlZmZlY3Qgd2lsbCBiZQordW5kb25lIHdoZW4gdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUuCisKK0ZvciBleGFtcGxlLAorCitgYGAKKzEwOiB2b2lkIFN1YjEoaW50IG4pIHsKKzExOiAgIEVYUEVDVF9FUSgxLCBCYXIobikpOworMTI6ICAgRVhQRUNUX0VRKDIsIEJhcihuICsgMSkpOworMTM6IH0KKzE0OiAKKzE1OiBURVNUKEZvb1Rlc3QsIEJhcikgeworMTY6ICAgeworMTc6ICAgICBTQ09QRURfVFJBQ0UoIkEiKTsgIC8vIFRoaXMgdHJhY2UgcG9pbnQgd2lsbCBiZSBpbmNsdWRlZCBpbgorMTg6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGZhaWx1cmUgaW4gdGhpcyBzY29wZS4KKzE5OiAgICAgU3ViMSgxKTsKKzIwOiAgIH0KKzIxOiAgIC8vIE5vdyBpdCB3b24ndC4KKzIyOiAgIFN1YjEoOSk7CisyMzogfQorYGBgCisKK2NvdWxkIHJlc3VsdCBpbiBtZXNzYWdlcyBsaWtlIHRoZXNlOgorCitgYGAKK3BhdGgvdG8vZm9vX3Rlc3QuY2M6MTE6IEZhaWx1cmUKK1ZhbHVlIG9mOiBCYXIobikKK0V4cGVjdGVkOiAxCisgIEFjdHVhbDogMgorICAgVHJhY2U6CitwYXRoL3RvL2Zvb190ZXN0LmNjOjE3OiBBCisKK3BhdGgvdG8vZm9vX3Rlc3QuY2M6MTI6IEZhaWx1cmUKK1ZhbHVlIG9mOiBCYXIobiArIDEpCitFeHBlY3RlZDogMgorICBBY3R1YWw6IDMKK2BgYAorCitXaXRob3V0IHRoZSB0cmFjZSwgaXQgd291bGQndmUgYmVlbiBkaWZmaWN1bHQgdG8ga25vdyB3aGljaCBpbnZvY2F0aW9uCitvZiBgU3ViMSgpYCB0aGUgdHdvIGZhaWx1cmVzIGNvbWUgZnJvbSByZXNwZWN0aXZlbHkuIChZb3UgY291bGQgYWRkIGFuCitleHRyYSBtZXNzYWdlIHRvIGVhY2ggYXNzZXJ0aW9uIGluIGBTdWIxKClgIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBvZgorYG5gLCBidXQgdGhhdCdzIHRlZGlvdXMuKQorCitTb21lIHRpcHMgb24gdXNpbmcgYFNDT1BFRF9UUkFDRWA6CisKKyAgMS4gV2l0aCBhIHN1aXRhYmxlIG1lc3NhZ2UsIGl0J3Mgb2Z0ZW4gZW5vdWdoIHRvIHVzZSBgU0NPUEVEX1RSQUNFYCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc3ViLXJvdXRpbmUsIGluc3RlYWQgb2YgYXQgZWFjaCBjYWxsIHNpdGUuCisgIDEuIFdoZW4gY2FsbGluZyBzdWItcm91dGluZXMgaW5zaWRlIGEgbG9vcCwgbWFrZSB0aGUgbG9vcCBpdGVyYXRvciBwYXJ0IG9mIHRoZSBtZXNzYWdlIGluIGBTQ09QRURfVFJBQ0VgIHN1Y2ggdGhhdCB5b3UgY2FuIGtub3cgd2hpY2ggaXRlcmF0aW9uIHRoZSBmYWlsdXJlIGlzIGZyb20uCisgIDEuIFNvbWV0aW1lcyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHRyYWNlIHBvaW50IGlzIGVub3VnaCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhcnRpY3VsYXIgaW52b2NhdGlvbiBvZiBhIHN1Yi1yb3V0aW5lLiBJbiB0aGlzIGNhc2UsIHlvdSBkb24ndCBoYXZlIHRvIGNob29zZSBhIHVuaXF1ZSBtZXNzYWdlIGZvciBgU0NPUEVEX1RSQUNFYC4gWW91IGNhbiBzaW1wbHkgdXNlIGAiImAuCisgIDEuIFlvdSBjYW4gdXNlIGBTQ09QRURfVFJBQ0VgIGluIGFuIGlubmVyIHNjb3BlIHdoZW4gdGhlcmUgaXMgb25lIGluIHRoZSBvdXRlciBzY29wZS4gSW4gdGhpcyBjYXNlLCBhbGwgYWN0aXZlIHRyYWNlIHBvaW50cyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmYWlsdXJlIG1lc3NhZ2VzLCBpbiByZXZlcnNlIG9yZGVyIHRoZXkgYXJlIGVuY291bnRlcmVkLgorICAxLiBUaGUgdHJhY2UgZHVtcCBpcyBjbGlja2FibGUgaW4gRW1hY3MnIGNvbXBpbGF0aW9uIGJ1ZmZlciAtIGhpdCByZXR1cm4gb24gYSBsaW5lIG51bWJlciBhbmQgeW91J2xsIGJlIHRha2VuIHRvIHRoYXQgbGluZSBpbiB0aGUgc291cmNlIGZpbGUhCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBQcm9wYWdhdGluZyBGYXRhbCBGYWlsdXJlcyAjIworCitBIGNvbW1vbiBwaXRmYWxsIHdoZW4gdXNpbmcgYEFTU0VSVF8qYCBhbmQgYEZBSUwqYCBpcyBub3QgdW5kZXJzdGFuZGluZyB0aGF0Cit3aGVuIHRoZXkgZmFpbCB0aGV5IG9ubHkgYWJvcnQgdGhlIF9jdXJyZW50IGZ1bmN0aW9uXywgbm90IHRoZSBlbnRpcmUgdGVzdC4gRm9yCitleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRlc3Qgd2lsbCBzZWdmYXVsdDoKK2BgYAordm9pZCBTdWJyb3V0aW5lKCkgeworICAvLyBHZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlIGFuZCBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIEFTU0VSVF9FUSgxLCAyKTsKKyAgLy8gVGhlIGZvbGxvd2luZyB3b24ndCBiZSBleGVjdXRlZC4KKyAgLi4uCit9CisKK1RFU1QoRm9vVGVzdCwgQmFyKSB7CisgIFN1YnJvdXRpbmUoKTsKKyAgLy8gVGhlIGludGVuZGVkIGJlaGF2aW9yIGlzIGZvciB0aGUgZmF0YWwgZmFpbHVyZQorICAvLyBpbiBTdWJyb3V0aW5lKCkgdG8gYWJvcnQgdGhlIGVudGlyZSB0ZXN0LgorICAvLyBUaGUgYWN0dWFsIGJlaGF2aW9yOiB0aGUgZnVuY3Rpb24gZ29lcyBvbiBhZnRlciBTdWJyb3V0aW5lKCkgcmV0dXJucy4KKyAgaW50KiBwID0gTlVMTDsKKyAgKnAgPSAzOyAvLyBTZWdmYXVsdCEKK30KK2BgYAorCitTaW5jZSB3ZSBkb24ndCB1c2UgZXhjZXB0aW9ucywgaXQgaXMgdGVjaG5pY2FsbHkgaW1wb3NzaWJsZSB0bworaW1wbGVtZW50IHRoZSBpbnRlbmRlZCBiZWhhdmlvciBoZXJlLiAgVG8gYWxsZXZpYXRlIHRoaXMsIEdvb2dsZSBUZXN0Citwcm92aWRlcyB0d28gc29sdXRpb25zLiAgWW91IGNvdWxkIHVzZSBlaXRoZXIgdGhlCitgKEFTU0VSVHxFWFBFQ1QpX05PX0ZBVEFMX0ZBSUxVUkVgIGFzc2VydGlvbnMgb3IgdGhlCitgSGFzRmF0YWxGYWlsdXJlKClgIGZ1bmN0aW9uLiAgVGhleSBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdHdvCitzdWJzZWN0aW9ucy4KKworIyMjIEFzc2VydGluZyBvbiBTdWJyb3V0aW5lcyAjIyMKKworQXMgc2hvd24gYWJvdmUsIGlmIHlvdXIgdGVzdCBjYWxscyBhIHN1YnJvdXRpbmUgdGhhdCBoYXMgYW4gYEFTU0VSVF8qYAorZmFpbHVyZSBpbiBpdCwgdGhlIHRlc3Qgd2lsbCBjb250aW51ZSBhZnRlciB0aGUgc3Vicm91dGluZQorcmV0dXJucy4gVGhpcyBtYXkgbm90IGJlIHdoYXQgeW91IHdhbnQuCisKK09mdGVuIHBlb3BsZSB3YW50IGZhdGFsIGZhaWx1cmVzIHRvIHByb3BhZ2F0ZSBsaWtlIGV4Y2VwdGlvbnMuICBGb3IKK3RoYXQgR29vZ2xlIFRlc3Qgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYF9zdGF0ZW1lbnRfYCk7YCB8IGBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShgX3N0YXRlbWVudF9gKTtgIHwgX3N0YXRlbWVudF8gZG9lc24ndCBnZW5lcmF0ZSBhbnkgbmV3IGZhdGFsIGZhaWx1cmVzIGluIHRoZSBjdXJyZW50IHRocmVhZC4gfAorCitPbmx5IGZhaWx1cmVzIGluIHRoZSB0aHJlYWQgdGhhdCBleGVjdXRlcyB0aGUgYXNzZXJ0aW9uIGFyZSBjaGVja2VkIHRvCitkZXRlcm1pbmUgdGhlIHJlc3VsdCBvZiB0aGlzIHR5cGUgb2YgYXNzZXJ0aW9ucy4gIElmIF9zdGF0ZW1lbnRfCitjcmVhdGVzIG5ldyB0aHJlYWRzLCBmYWlsdXJlcyBpbiB0aGVzZSB0aHJlYWRzIGFyZSBpZ25vcmVkLgorCitFeGFtcGxlczoKKworYGBgCitBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShGb28oKSk7CisKK2ludCBpOworRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoeworICBpID0gQmFyKCk7Cit9KTsKK2BgYAorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4gQXNzZXJ0aW9ucyBmcm9tIG11bHRpcGxlIHRocmVhZHMKK2FyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4KKworIyMjIENoZWNraW5nIGZvciBGYWlsdXJlcyBpbiB0aGUgQ3VycmVudCBUZXN0ICMjIworCitgSGFzRmF0YWxGYWlsdXJlKClgIGluIHRoZSBgOjp0ZXN0aW5nOjpUZXN0YCBjbGFzcyByZXR1cm5zIGB0cnVlYCBpZiBhbgorYXNzZXJ0aW9uIGluIHRoZSBjdXJyZW50IHRlc3QgaGFzIHN1ZmZlcmVkIGEgZmF0YWwgZmFpbHVyZS4gVGhpcworYWxsb3dzIGZ1bmN0aW9ucyB0byBjYXRjaCBmYXRhbCBmYWlsdXJlcyBpbiBhIHN1Yi1yb3V0aW5lIGFuZCByZXR1cm4KK2Vhcmx5LgorCitgYGAKK2NsYXNzIFRlc3QgeworIHB1YmxpYzoKKyAgLi4uCisgIHN0YXRpYyBib29sIEhhc0ZhdGFsRmFpbHVyZSgpOworfTsKK2BgYAorCitUaGUgdHlwaWNhbCB1c2FnZSwgd2hpY2ggYmFzaWNhbGx5IHNpbXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgYSB0aHJvd24KK2V4Y2VwdGlvbiwgaXM6CisKK2BgYAorVEVTVChGb29UZXN0LCBCYXIpIHsKKyAgU3Vicm91dGluZSgpOworICAvLyBBYm9ydHMgaWYgU3Vicm91dGluZSgpIGhhZCBhIGZhdGFsIGZhaWx1cmUuCisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkKKyAgICByZXR1cm47CisgIC8vIFRoZSBmb2xsb3dpbmcgd29uJ3QgYmUgZXhlY3V0ZWQuCisgIC4uLgorfQorYGBgCisKK0lmIGBIYXNGYXRhbEZhaWx1cmUoKWAgaXMgdXNlZCBvdXRzaWRlIG9mIGBURVNUKClgICwgYFRFU1RfRigpYCAsIG9yIGEgdGVzdAorZml4dHVyZSwgeW91IG11c3QgYWRkIHRoZSBgOjp0ZXN0aW5nOjpUZXN0OjpgIHByZWZpeCwgYXMgaW46CisKK2BgYAoraWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpCisgIHJldHVybjsKK2BgYAorCitTaW1pbGFybHksIGBIYXNOb25mYXRhbEZhaWx1cmUoKWAgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGN1cnJlbnQgdGVzdAoraGFzIGF0IGxlYXN0IG9uZSBub24tZmF0YWwgZmFpbHVyZSwgYW5kIGBIYXNGYWlsdXJlKClgIHJldHVybnMgYHRydWVgCitpZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhdCBsZWFzdCBvbmUgZmFpbHVyZSBvZiBlaXRoZXIga2luZC4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuICBgSGFzTm9uZmF0YWxGYWlsdXJlKClgIGFuZAorYEhhc0ZhaWx1cmUoKWAgYXJlIGF2YWlsYWJsZSBzaW5jZSB2ZXJzaW9uIDEuNC4wLgorCisjIExvZ2dpbmcgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiAjCisKK0luIHlvdXIgdGVzdCBjb2RlLCB5b3UgY2FuIGNhbGwgYFJlY29yZFByb3BlcnR5KCJrZXkiLCB2YWx1ZSlgIHRvIGxvZworYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgd2hlcmUgYHZhbHVlYCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGBpbnRgLiBUaGUgX2xhc3RfIHZhbHVlIHJlY29yZGVkIGZvciBhIGtleSB3aWxsIGJlIGVtaXR0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKK2lmIHlvdSBzcGVjaWZ5IG9uZS4gRm9yIGV4YW1wbGUsIHRoZSB0ZXN0CisKK2BgYAorVEVTVF9GKFdpZGdldFVzYWdlVGVzdCwgTWluQW5kTWF4V2lkZ2V0cykgeworICBSZWNvcmRQcm9wZXJ0eSgiTWF4aW11bVdpZGdldHMiLCBDb21wdXRlTWF4VXNhZ2UoKSk7CisgIFJlY29yZFByb3BlcnR5KCJNaW5pbXVtV2lkZ2V0cyIsIENvbXB1dGVNaW5Vc2FnZSgpKTsKK30KK2BgYAorCit3aWxsIG91dHB1dCBYTUwgbGlrZSB0aGlzOgorCitgYGAKKy4uLgorICA8dGVzdGNhc2UgbmFtZT0iTWluQW5kTWF4V2lkZ2V0cyIgc3RhdHVzPSJydW4iIHRpbWU9IjYiIGNsYXNzbmFtZT0iV2lkZ2V0VXNhZ2VUZXN0IgorICAgICAgICAgICAgTWF4aW11bVdpZGdldHM9IjEyIgorICAgICAgICAgICAgTWluaW11bVdpZGdldHM9IjkiIC8+CisuLi4KK2BgYAorCitfTm90ZV86CisgICogYFJlY29yZFByb3BlcnR5KClgIGlzIGEgc3RhdGljIG1lbWJlciBvZiB0aGUgYFRlc3RgIGNsYXNzLiBUaGVyZWZvcmUgaXQgbmVlZHMgdG8gYmUgcHJlZml4ZWQgd2l0aCBgOjp0ZXN0aW5nOjpUZXN0OjpgIGlmIHVzZWQgb3V0c2lkZSBvZiB0aGUgYFRFU1RgIGJvZHkgYW5kIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MuCisgICogYGtleWAgbXVzdCBiZSBhIHZhbGlkIFhNTCBhdHRyaWJ1dGUgbmFtZSwgYW5kIGNhbm5vdCBjb25mbGljdCB3aXRoIHRoZSBvbmVzIGFscmVhZHkgdXNlZCBieSBHb29nbGUgVGVzdCAoYG5hbWVgLCBgc3RhdHVzYCwgYHRpbWVgLCBgY2xhc3NuYW1lYCwgYHR5cGVfcGFyYW1gLCBhbmQgYHZhbHVlX3BhcmFtYCkuCisgICogQ2FsbGluZyBgUmVjb3JkUHJvcGVydHkoKWAgb3V0c2lkZSBvZiB0aGUgbGlmZXNwYW4gb2YgYSB0ZXN0IGlzIGFsbG93ZWQuIElmIGl0J3MgY2FsbGVkIG91dHNpZGUgb2YgYSB0ZXN0IGJ1dCBiZXR3ZWVuIGEgdGVzdCBjYXNlJ3MgYFNldFVwVGVzdENhc2UoKWAgYW5kIGBUZWFyRG93blRlc3RDYXNlKClgIG1ldGhvZHMsIGl0IHdpbGwgYmUgYXR0cmlidXRlZCB0byB0aGUgWE1MIGVsZW1lbnQgZm9yIHRoZSB0ZXN0IGNhc2UuIElmIGl0J3MgY2FsbGVkIG91dHNpZGUgb2YgYWxsIHRlc3QgY2FzZXMgKGUuZy4gaW4gYSB0ZXN0IGVudmlyb25tZW50KSwgaXQgd2lsbCBiZSBhdHRyaWJ1dGVkIHRvIHRoZSB0b3AtbGV2ZWwgWE1MIGVsZW1lbnQuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIFNoYXJpbmcgUmVzb3VyY2VzIEJldHdlZW4gVGVzdHMgaW4gdGhlIFNhbWUgVGVzdCBDYXNlICMKKworCisKK0dvb2dsZSBUZXN0IGNyZWF0ZXMgYSBuZXcgdGVzdCBmaXh0dXJlIG9iamVjdCBmb3IgZWFjaCB0ZXN0IGluIG9yZGVyIHRvIG1ha2UKK3Rlc3RzIGluZGVwZW5kZW50IGFuZCBlYXNpZXIgdG8gZGVidWcuIEhvd2V2ZXIsIHNvbWV0aW1lcyB0ZXN0cyB1c2UgcmVzb3VyY2VzCit0aGF0IGFyZSBleHBlbnNpdmUgdG8gc2V0IHVwLCBtYWtpbmcgdGhlIG9uZS1jb3B5LXBlci10ZXN0IG1vZGVsIHByb2hpYml0aXZlbHkKK2V4cGVuc2l2ZS4KKworSWYgdGhlIHRlc3RzIGRvbid0IGNoYW5nZSB0aGUgcmVzb3VyY2UsIHRoZXJlJ3Mgbm8gaGFybSBpbiB0aGVtIHNoYXJpbmcgYQorc2luZ2xlIHJlc291cmNlIGNvcHkuIFNvLCBpbiBhZGRpdGlvbiB0byBwZXItdGVzdCBzZXQtdXAvdGVhci1kb3duLCBHb29nbGUgVGVzdAorYWxzbyBzdXBwb3J0cyBwZXItdGVzdC1jYXNlIHNldC11cC90ZWFyLWRvd24uIFRvIHVzZSBpdDoKKworICAxLiBJbiB5b3VyIHRlc3QgZml4dHVyZSBjbGFzcyAoc2F5IGBGb29UZXN0YCApLCBkZWZpbmUgYXMgYHN0YXRpY2Agc29tZSBtZW1iZXIgdmFyaWFibGVzIHRvIGhvbGQgdGhlIHNoYXJlZCByZXNvdXJjZXMuCisgIDEuIEluIHRoZSBzYW1lIHRlc3QgZml4dHVyZSBjbGFzcywgZGVmaW5lIGEgYHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKWAgZnVuY3Rpb24gKHJlbWVtYmVyIG5vdCB0byBzcGVsbCBpdCBhcyAqKmBTZXR1cFRlc3RDYXNlYCoqIHdpdGggYSBzbWFsbCBgdWAhKSB0byBzZXQgdXAgdGhlIHNoYXJlZCByZXNvdXJjZXMgYW5kIGEgYHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKWAgZnVuY3Rpb24gdG8gdGVhciB0aGVtIGRvd24uCisKK1RoYXQncyBpdCEgR29vZ2xlIFRlc3QgYXV0b21hdGljYWxseSBjYWxscyBgU2V0VXBUZXN0Q2FzZSgpYCBiZWZvcmUgcnVubmluZyB0aGUKK19maXJzdCB0ZXN0XyBpbiB0aGUgYEZvb1Rlc3RgIHRlc3QgY2FzZSAoaS5lLiBiZWZvcmUgY3JlYXRpbmcgdGhlIGZpcnN0CitgRm9vVGVzdGAgb2JqZWN0KSwgYW5kIGNhbGxzIGBUZWFyRG93blRlc3RDYXNlKClgIGFmdGVyIHJ1bm5pbmcgdGhlIF9sYXN0IHRlc3RfCitpbiBpdCAoaS5lLiBhZnRlciBkZWxldGluZyB0aGUgbGFzdCBgRm9vVGVzdGAgb2JqZWN0KS4gSW4gYmV0d2VlbiwgdGhlIHRlc3RzCitjYW4gdXNlIHRoZSBzaGFyZWQgcmVzb3VyY2VzLgorCitSZW1lbWJlciB0aGF0IHRoZSB0ZXN0IG9yZGVyIGlzIHVuZGVmaW5lZCwgc28geW91ciBjb2RlIGNhbid0IGRlcGVuZCBvbiBhIHRlc3QKK3ByZWNlZGluZyBvciBmb2xsb3dpbmcgYW5vdGhlci4gQWxzbywgdGhlIHRlc3RzIG11c3QgZWl0aGVyIG5vdCBtb2RpZnkgdGhlCitzdGF0ZSBvZiBhbnkgc2hhcmVkIHJlc291cmNlLCBvciwgaWYgdGhleSBkbyBtb2RpZnkgdGhlIHN0YXRlLCB0aGV5IG11c3QKK3Jlc3RvcmUgdGhlIHN0YXRlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBiZWZvcmUgcGFzc2luZyBjb250cm9sIHRvIHRoZSBuZXh0Cit0ZXN0LgorCitIZXJlJ3MgYW4gZXhhbXBsZSBvZiBwZXItdGVzdC1jYXNlIHNldC11cCBhbmQgdGVhci1kb3duOgorYGBgCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBQZXItdGVzdC1jYXNlIHNldC11cC4KKyAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8gQ2FuIGJlIG9taXR0ZWQgaWYgbm90IG5lZWRlZC4KKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBzaGFyZWRfcmVzb3VyY2VfID0gbmV3IC4uLjsKKyAgfQorCisgIC8vIFBlci10ZXN0LWNhc2UgdGVhci1kb3duLgorICAvLyBDYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgLy8gQ2FuIGJlIG9taXR0ZWQgaWYgbm90IG5lZWRlZC4KKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBkZWxldGUgc2hhcmVkX3Jlc291cmNlXzsKKyAgICBzaGFyZWRfcmVzb3VyY2VfID0gTlVMTDsKKyAgfQorCisgIC8vIFlvdSBjYW4gZGVmaW5lIHBlci10ZXN0IHNldC11cCBhbmQgdGVhci1kb3duIGxvZ2ljIGFzIHVzdWFsLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IC4uLiB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsgLi4uIH0KKworICAvLyBTb21lIGV4cGVuc2l2ZSByZXNvdXJjZSBzaGFyZWQgYnkgYWxsIHRlc3RzLgorICBzdGF0aWMgVCogc2hhcmVkX3Jlc291cmNlXzsKK307CisKK1QqIEZvb1Rlc3Q6OnNoYXJlZF9yZXNvdXJjZV8gPSBOVUxMOworCitURVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKKyAgLi4uIHlvdSBjYW4gcmVmZXIgdG8gc2hhcmVkX3Jlc291cmNlIGhlcmUgLi4uCit9CitURVNUX0YoRm9vVGVzdCwgVGVzdDIpIHsKKyAgLi4uIHlvdSBjYW4gcmVmZXIgdG8gc2hhcmVkX3Jlc291cmNlIGhlcmUgLi4uCit9CitgYGAKKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMgR2xvYmFsIFNldC1VcCBhbmQgVGVhci1Eb3duICMKKworSnVzdCBhcyB5b3UgY2FuIGRvIHNldC11cCBhbmQgdGVhci1kb3duIGF0IHRoZSB0ZXN0IGxldmVsIGFuZCB0aGUgdGVzdCBjYXNlCitsZXZlbCwgeW91IGNhbiBhbHNvIGRvIGl0IGF0IHRoZSB0ZXN0IHByb2dyYW0gbGV2ZWwuIEhlcmUncyBob3cuCisKK0ZpcnN0LCB5b3Ugc3ViY2xhc3MgdGhlIGA6OnRlc3Rpbmc6OkVudmlyb25tZW50YCBjbGFzcyB0byBkZWZpbmUgYSB0ZXN0CitlbnZpcm9ubWVudCwgd2hpY2gga25vd3MgaG93IHRvIHNldC11cCBhbmQgdGVhci1kb3duOgorCitgYGAKK2NsYXNzIEVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkVudmlyb25tZW50KCkge30KKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9CisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byB0ZWFyIGRvd24gdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQorfTsKK2BgYAorCitUaGVuLCB5b3UgcmVnaXN0ZXIgYW4gaW5zdGFuY2Ugb2YgeW91ciBlbnZpcm9ubWVudCBjbGFzcyB3aXRoIEdvb2dsZSBUZXN0IGJ5CitjYWxsaW5nIHRoZSBgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKWAgZnVuY3Rpb246CisKK2BgYAorRW52aXJvbm1lbnQqIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KTsKK2BgYAorCitOb3csIHdoZW4gYFJVTl9BTExfVEVTVFMoKWAgaXMgY2FsbGVkLCBpdCBmaXJzdCBjYWxscyB0aGUgYFNldFVwKClgIG1ldGhvZCBvZgordGhlIGVudmlyb25tZW50IG9iamVjdCwgdGhlbiBydW5zIHRoZSB0ZXN0cyBpZiB0aGVyZSB3YXMgbm8gZmF0YWwgZmFpbHVyZXMsIGFuZAorZmluYWxseSBjYWxscyBgVGVhckRvd24oKWAgb2YgdGhlIGVudmlyb25tZW50IG9iamVjdC4KKworSXQncyBPSyB0byByZWdpc3RlciBtdWx0aXBsZSBlbnZpcm9ubWVudCBvYmplY3RzLiBJbiB0aGlzIGNhc2UsIHRoZWlyIGBTZXRVcCgpYAord2lsbCBiZSBjYWxsZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJlZ2lzdGVyZWQsIGFuZCB0aGVpciBgVGVhckRvd24oKWAgd2lsbCBiZQorY2FsbGVkIGluIHRoZSByZXZlcnNlIG9yZGVyLgorCitOb3RlIHRoYXQgR29vZ2xlIFRlc3QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZWdpc3RlcmVkIGVudmlyb25tZW50IG9iamVjdHMuCitUaGVyZWZvcmUgKipkbyBub3QgZGVsZXRlIHRoZW0qKiBieSB5b3Vyc2VsZi4KKworWW91IHNob3VsZCBjYWxsIGBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKWAgYmVmb3JlIGBSVU5fQUxMX1RFU1RTKClgIGlzCitjYWxsZWQsIHByb2JhYmx5IGluIGBtYWluKClgLiBJZiB5b3UgdXNlIGBndGVzdF9tYWluYCwgeW91IG5lZWQgdG8gICAgICBjYWxsCit0aGlzIGJlZm9yZSBgbWFpbigpYCBzdGFydHMgZm9yIGl0IHRvIHRha2UgZWZmZWN0LiBPbmUgd2F5IHRvIGRvIHRoaXMgaXMgdG8KK2RlZmluZSBhIGdsb2JhbCB2YXJpYWJsZSBsaWtlIHRoaXM6CisKK2BgYAorOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgZm9vX2VudiA9IDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBGb29FbnZpcm9ubWVudCk7CitgYGAKKworSG93ZXZlciwgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdSB0byB3cml0ZSB5b3VyIG93biBgbWFpbigpYCBhbmQgY2FsbAorYEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpYCB0aGVyZSwgYXMgcmVseWluZyBvbiBpbml0aWFsaXphdGlvbiBvZiBnbG9iYWwKK3ZhcmlhYmxlcyBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZCBhbmQgbWF5IGNhdXNlIHByb2JsZW1zIHdoZW4geW91CityZWdpc3RlciBtdWx0aXBsZSBlbnZpcm9ubWVudHMgZnJvbSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgYW5kIHRoZQorZW52aXJvbm1lbnRzIGhhdmUgZGVwZW5kZW5jaWVzIGFtb25nIHRoZW0gKHJlbWVtYmVyIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3QKK2d1YXJhbnRlZSB0aGUgb3JkZXIgaW4gd2hpY2ggZ2xvYmFsIHZhcmlhYmxlcyBmcm9tIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cworYXJlIGluaXRpYWxpemVkKS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKworIyBWYWx1ZSBQYXJhbWV0ZXJpemVkIFRlc3RzICMKKworX1ZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHNfIGFsbG93IHlvdSB0byB0ZXN0IHlvdXIgY29kZSB3aXRoIGRpZmZlcmVudAorcGFyYW1ldGVycyB3aXRob3V0IHdyaXRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHRlc3QuCisKK1N1cHBvc2UgeW91IHdyaXRlIGEgdGVzdCBmb3IgeW91ciBjb2RlIGFuZCB0aGVuIHJlYWxpemUgdGhhdCB5b3VyIGNvZGUgaXMgYWZmZWN0ZWQgYnkgYSBwcmVzZW5jZSBvZiBhIEJvb2xlYW4gY29tbWFuZCBsaW5lIGZsYWcuCisKK2BgYAorVEVTVChNeUNvZGVUZXN0LCBUZXN0Rm9vKSB7CisgIC8vIEEgY29kZSB0byB0ZXN0IGZvbygpLgorfQorYGBgCisKK1VzdWFsbHkgcGVvcGxlIGZhY3RvciB0aGVpciB0ZXN0IGNvZGUgaW50byBhIGZ1bmN0aW9uIHdpdGggYSBCb29sZWFuIHBhcmFtZXRlciBpbiBzdWNoIHNpdHVhdGlvbnMuIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBmbGFnLCB0aGVuIGV4ZWN1dGVzIHRoZSB0ZXN0aW5nIGNvZGUuCisKK2BgYAordm9pZCBUZXN0Rm9vSGVscGVyKGJvb2wgZmxhZ192YWx1ZSkgeworICBmbGFnID0gZmxhZ192YWx1ZTsKKyAgLy8gQSBjb2RlIHRvIHRlc3QgZm9vKCkuCit9CisKK1RFU1QoTXlDb2RlVGVzdCwgVGVzdEZvbykgeworICBUZXN0Rm9vSGVscGVyKGZhbHNlKTsKKyAgVGVzdEZvb0hlbHBlcih0cnVlKTsKK30KK2BgYAorCitCdXQgdGhpcyBzZXR1cCBoYXMgc2VyaW91cyBkcmF3YmFja3MuIEZpcnN0LCB3aGVuIGEgdGVzdCBhc3NlcnRpb24gZmFpbHMgaW4geW91ciB0ZXN0cywgaXQgYmVjb21lcyB1bmNsZWFyIHdoYXQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBjYXVzZWQgaXQgdG8gZmFpbC4gWW91IGNhbiBzdHJlYW0gYSBjbGFyaWZ5aW5nIG1lc3NhZ2UgaW50byB5b3VyIGBFWFBFQ1RgL2BBU1NFUlRgIHN0YXRlbWVudHMsIGJ1dCBpdCB5b3UnbGwgaGF2ZSB0byBkbyBpdCB3aXRoIGFsbCBvZiB0aGVtLiBTZWNvbmQsIHlvdSBoYXZlIHRvIGFkZCBvbmUgc3VjaCBoZWxwZXIgZnVuY3Rpb24gcGVyIHRlc3QuIFdoYXQgaWYgeW91IGhhdmUgdGVuIHRlc3RzPyBUd2VudHk/IEEgaHVuZHJlZD8KKworVmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aWxsIGxldCB5b3Ugd3JpdGUgeW91ciB0ZXN0IG9ubHkgb25jZSBhbmQgdGhlbiBlYXNpbHkgaW5zdGFudGlhdGUgYW5kIHJ1biBpdCB3aXRoIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcGFyYW1ldGVyIHZhbHVlcy4KKworSGVyZSBhcmUgc29tZSBvdGhlciBzaXR1YXRpb25zIHdoZW4gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBjb21lIGhhbmR5OgorCisgICogWW91IHdhbnQgdG8gdGVzdCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIGFuIE9PIGludGVyZmFjZS4KKyAgKiBZb3Ugd2FudCB0byB0ZXN0IHlvdXIgY29kZSBvdmVyIHZhcmlvdXMgaW5wdXRzIChhLmsuYS4gZGF0YS1kcml2ZW4gdGVzdGluZykuIFRoaXMgZmVhdHVyZSBpcyBlYXN5IHRvIGFidXNlLCBzbyBwbGVhc2UgZXhlcmNpc2UgeW91ciBnb29kIHNlbnNlIHdoZW4gZG9pbmcgaXQhCisKKyMjIEhvdyB0byBXcml0ZSBWYWx1ZS1QYXJhbWV0ZXJpemVkIFRlc3RzICMjCisKK1RvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQorY2xhc3MuICBJdCBtdXN0IGJlIGRlcml2ZWQgZnJvbSBib3RoIGA6OnRlc3Rpbmc6OlRlc3RgIGFuZAorYDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPFQ+YCAodGhlIGxhdHRlciBpcyBhIHB1cmUgaW50ZXJmYWNlKSwKK3doZXJlIGBUYCBpcyB0aGUgdHlwZSBvZiB5b3VyIHBhcmFtZXRlciB2YWx1ZXMuICBGb3IgY29udmVuaWVuY2UsIHlvdQorY2FuIGp1c3QgZGVyaXZlIHRoZSBmaXh0dXJlIGNsYXNzIGZyb20gYDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUPmAsCit3aGljaCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIGJvdGggYDo6dGVzdGluZzo6VGVzdGAgYW5kCitgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8VD5gLiBgVGAgY2FuIGJlIGFueSBjb3B5YWJsZSB0eXBlLiBJZgoraXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgbGlmZXNwYW4gb2YKK3RoZSBwb2ludGVkIHZhbHVlcy4KKworYGBgCitjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxjb25zdCBjaGFyKj4geworICAvLyBZb3UgY2FuIGltcGxlbWVudCBhbGwgdGhlIHVzdWFsIGZpeHR1cmUgY2xhc3MgbWVtYmVycyBoZXJlLgorICAvLyBUbyBhY2Nlc3MgdGhlIHRlc3QgcGFyYW1ldGVyLCBjYWxsIEdldFBhcmFtKCkgZnJvbSBjbGFzcworICAvLyBUZXN0V2l0aFBhcmFtPFQ+LgorfTsKKworLy8gT3IsIHdoZW4geW91IHdhbnQgdG8gYWRkIHBhcmFtZXRlcnMgdG8gYSBwcmUtZXhpc3RpbmcgZml4dHVyZSBjbGFzczoKK2NsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC4uLgorfTsKK2NsYXNzIEJhclRlc3QgOiBwdWJsaWMgQmFzZVRlc3QsCisgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGNvbnN0IGNoYXIqPiB7CisgIC4uLgorfTsKK2BgYAorCitUaGVuLCB1c2UgdGhlIGBURVNUX1BgIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHRlc3QgcGF0dGVybnMgdXNpbmcKK3RoaXMgZml4dHVyZSBhcyB5b3Ugd2FudC4gIFRoZSBgX1BgIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiIG9yCisicGF0dGVybiIsIHdoaWNoZXZlciB5b3UgcHJlZmVyIHRvIHRoaW5rLgorCitgYGAKK1RFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCBhY2Nlc3MgdGhlIHRlc3QgcGFyYW1ldGVyIHdpdGggdGhlIEdldFBhcmFtKCkgbWV0aG9kCisgIC8vIG9mIHRoZSBUZXN0V2l0aFBhcmFtPFQ+IGNsYXNzOgorICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7CisgIC4uLgorfQorCitURVNUX1AoRm9vVGVzdCwgSGFzQmxhaEJsYWgpIHsKKyAgLi4uCit9CitgYGAKKworRmluYWxseSwgeW91IGNhbiB1c2UgYElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QYCB0byBpbnN0YW50aWF0ZSB0aGUgdGVzdAorY2FzZSB3aXRoIGFueSBzZXQgb2YgcGFyYW1ldGVycyB5b3Ugd2FudC4gR29vZ2xlIFRlc3QgZGVmaW5lcyBhIG51bWJlciBvZgorZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRlc3QgcGFyYW1ldGVycy4gVGhleSByZXR1cm4gd2hhdCB3ZSBjYWxsCisoc3VycHJpc2UhKSBfcGFyYW1ldGVyIGdlbmVyYXRvcnNfLiBIZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGVtLAord2hpY2ggYXJlIGFsbCBpbiB0aGUgYHRlc3RpbmdgIG5hbWVzcGFjZToKKworfCBgUmFuZ2UoYmVnaW4sIGVuZFssIHN0ZXBdKWAgfCBZaWVsZHMgdmFsdWVzIGB7YmVnaW4sIGJlZ2luK3N0ZXAsIGJlZ2luK3N0ZXArc3RlcCwgLi4ufWAuIFRoZSB2YWx1ZXMgZG8gbm90IGluY2x1ZGUgYGVuZGAuIGBzdGVwYCBkZWZhdWx0cyB0byAxLiB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYFZhbHVlcyh2MSwgdjIsIC4uLiwgdk4pYCAgIHwgWWllbGRzIHZhbHVlcyBge3YxLCB2MiwgLi4uLCB2Tn1gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgVmFsdWVzSW4oY29udGFpbmVyKWAgYW5kIGBWYWx1ZXNJbihiZWdpbiwgZW5kKWAgfCBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwtc3R5bGUgY29udGFpbmVyLCBvciBhbiBpdGVyYXRvciByYW5nZSBgW2JlZ2luLCBlbmQpYC4gYGNvbnRhaW5lcmAsIGBiZWdpbmAsIGFuZCBgZW5kYCBjYW4gYmUgZXhwcmVzc2lvbnMgd2hvc2UgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGF0IHJ1biB0aW1lLiAgfAorfCBgQm9vbCgpYCAgICAgICAgICAgICAgICAgICAgfCBZaWVsZHMgc2VxdWVuY2UgYHtmYWxzZSwgdHJ1ZX1gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBDb21iaW5lKGcxLCBnMiwgLi4uLCBnTilgICB8IFlpZWxkcyBhbGwgY29tYmluYXRpb25zICh0aGUgQ2FydGVzaWFuIHByb2R1Y3QgZm9yIHRoZSBtYXRoIHNhdnZ5KSBvZiB0aGUgdmFsdWVzIGdlbmVyYXRlZCBieSB0aGUgYE5gIGdlbmVyYXRvcnMuIFRoaXMgaXMgb25seSBhdmFpbGFibGUgaWYgeW91ciBzeXN0ZW0gcHJvdmlkZXMgdGhlIGA8dHIxL3R1cGxlPmAgaGVhZGVyLiBJZiB5b3UgYXJlIHN1cmUgeW91ciBzeXN0ZW0gZG9lcywgYW5kIEdvb2dsZSBUZXN0IGRpc2FncmVlcywgeW91IGNhbiBvdmVycmlkZSBpdCBieSBkZWZpbmluZyBgR1RFU1RfSEFTX1RSMV9UVVBMRT0xYC4gU2VlIGNvbW1lbnRzIGluIFtpbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uIHwKKworRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBbc291cmNlIGNvZGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgpLgorCitUaGUgZm9sbG93aW5nIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gdGhlIGBGb29UZXN0YCB0ZXN0IGNhc2UKK2VhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIGAibWVlbnkiYCwgYCJtaW55ImAsIGFuZCBgIm1vZSJgLgorCitgYGAKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCJtZWVueSIsICJtaW55IiwgIm1vZSIpKTsKK2BgYAorCitUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuICh5ZXMsIHlvdSBjYW4KK2luc3RhbnRpYXRlIGl0IG1vcmUgdGhhbiBvbmNlKSwgdGhlIGZpcnN0IGFyZ3VtZW50IHRvCitgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1BgIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYWN0dWFsCit0ZXN0IGNhc2UgbmFtZS4gUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yIGRpZmZlcmVudAoraW5zdGFudGlhdGlvbnMuIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZQorbmFtZXM6CisKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wYCBmb3IgYCJtZWVueSJgCisgICogYEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMWAgZm9yIGAibWlueSJgCisgICogYEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMmAgZm9yIGAibW9lImAKKyAgKiBgSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wYCBmb3IgYCJtZWVueSJgCisgICogYEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMWAgZm9yIGAibWlueSJgCisgICogYEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMmAgZm9yIGAibW9lImAKKworWW91IGNhbiB1c2UgdGhlc2UgbmFtZXMgaW4gWy0tZ3Rlc3RcX2ZpbHRlcl0oI1J1bm5pbmdfYV9TdWJzZXRfb2ZfdGhlX1Rlc3RzLm1kKS4KKworVGhpcyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMgZnJvbSBgRm9vVGVzdGAgYWdhaW4sIGVhY2gKK3dpdGggcGFyYW1ldGVyIHZhbHVlcyBgImNhdCJgIGFuZCBgImRvZyJgOgorCitgYGAKK2NvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihwZXRzKSk7CitgYGAKKworVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlIHRoZXNlIG5hbWVzOgorCisgICogYEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzBgIGZvciBgImNhdCJgCisgICogYEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzFgIGZvciBgImRvZyJgCisgICogYEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzBgIGZvciBgImNhdCJgCisgICogYEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzFgIGZvciBgImRvZyJgCisKK1BsZWFzZSBub3RlIHRoYXQgYElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QYCB3aWxsIGluc3RhbnRpYXRlIF9hbGxfCit0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLCB3aGV0aGVyIHRoZWlyIGRlZmluaXRpb25zIGNvbWUgYmVmb3JlIG9yCitfYWZ0ZXJfIHRoZSBgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1BgIHN0YXRlbWVudC4KKworWW91IGNhbiBzZWUKK1t0aGVzZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MpCitbZmlsZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjKSBmb3IgbW9yZSBleGFtcGxlcy4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzIChyZXF1aXJlcyBNU1ZDIDguMCBvciBhYm92ZSksIE1hYzsgc2luY2UgdmVyc2lvbiAxLjIuMC4KKworIyMgQ3JlYXRpbmcgVmFsdWUtUGFyYW1ldGVyaXplZCBBYnN0cmFjdCBUZXN0cyAjIworCitJbiB0aGUgYWJvdmUsIHdlIGRlZmluZSBhbmQgaW5zdGFudGlhdGUgYEZvb1Rlc3RgIGluIHRoZSBzYW1lIHNvdXJjZQorZmlsZS4gU29tZXRpbWVzIHlvdSBtYXkgd2FudCB0byBkZWZpbmUgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbiBhCitsaWJyYXJ5IGFuZCBsZXQgb3RoZXIgcGVvcGxlIGluc3RhbnRpYXRlIHRoZW0gbGF0ZXIuIFRoaXMgcGF0dGVybiBpcwora25vd24gYXMgPGk+YWJzdHJhY3QgdGVzdHM8L2k+LiBBcyBhbiBleGFtcGxlIG9mIGl0cyBhcHBsaWNhdGlvbiwgd2hlbiB5b3UKK2FyZSBkZXNpZ25pbmcgYW4gaW50ZXJmYWNlIHlvdSBjYW4gd3JpdGUgYSBzdGFuZGFyZCBzdWl0ZSBvZiBhYnN0cmFjdAordGVzdHMgKHBlcmhhcHMgdXNpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uIGFzIHRoZSB0ZXN0IHBhcmFtZXRlcikgdGhhdAorYWxsIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgaW50ZXJmYWNlIGFyZSBleHBlY3RlZCB0byBwYXNzLiBXaGVuCitzb21lb25lIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSwgaGUgY2FuIGluc3RhbnRpYXRlIHlvdXIgc3VpdGUgdG8gZ2V0CithbGwgdGhlIGludGVyZmFjZS1jb25mb3JtYW5jZSB0ZXN0cyBmb3IgZnJlZS4KKworVG8gZGVmaW5lIGFic3RyYWN0IHRlc3RzLCB5b3Ugc2hvdWxkIG9yZ2FuaXplIHlvdXIgY29kZSBsaWtlIHRoaXM6CisKKyAgMS4gUHV0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwYXJhbWV0ZXJpemVkIHRlc3QgZml4dHVyZSBjbGFzcyAoZS5nLiBgRm9vVGVzdGApIGluIGEgaGVhZGVyIGZpbGUsIHNheSBgZm9vX3BhcmFtX3Rlc3QuaGAuIFRoaW5rIG9mIHRoaXMgYXMgX2RlY2xhcmluZ18geW91ciBhYnN0cmFjdCB0ZXN0cy4KKyAgMS4gUHV0IHRoZSBgVEVTVF9QYCBkZWZpbml0aW9ucyBpbiBgZm9vX3BhcmFtX3Rlc3QuY2NgLCB3aGljaCBpbmNsdWRlcyBgZm9vX3BhcmFtX3Rlc3QuaGAuIFRoaW5rIG9mIHRoaXMgYXMgX2ltcGxlbWVudGluZ18geW91ciBhYnN0cmFjdCB0ZXN0cy4KKworT25jZSB0aGV5IGFyZSBkZWZpbmVkLCB5b3UgY2FuIGluc3RhbnRpYXRlIHRoZW0gYnkgaW5jbHVkaW5nCitgZm9vX3BhcmFtX3Rlc3QuaGAsIGludm9raW5nIGBJTlNUQU5USUFURV9URVNUX0NBU0VfUCgpYCwgYW5kIGxpbmtpbmcKK3dpdGggYGZvb19wYXJhbV90ZXN0LmNjYC4gWW91IGNhbiBpbnN0YW50aWF0ZSB0aGUgc2FtZSBhYnN0cmFjdCB0ZXN0CitjYXNlIG11bHRpcGxlIHRpbWVzLCBwb3NzaWJseSBpbiBkaWZmZXJlbnQgc291cmNlIGZpbGVzLgorCisjIFR5cGVkIFRlc3RzICMKKworU3VwcG9zZSB5b3UgaGF2ZSBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNhbWUgaW50ZXJmYWNlIGFuZAord2FudCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgb2YgdGhlbSBzYXRpc2Z5IHNvbWUgY29tbW9uIHJlcXVpcmVtZW50cy4KK09yLCB5b3UgbWF5IGhhdmUgZGVmaW5lZCBzZXZlcmFsIHR5cGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGNvbmZvcm0gdG8KK3RoZSBzYW1lICJjb25jZXB0IiBhbmQgeW91IHdhbnQgdG8gdmVyaWZ5IGl0LiAgSW4gYm90aCBjYXNlcywgeW91IHdhbnQKK3RoZSBzYW1lIHRlc3QgbG9naWMgcmVwZWF0ZWQgZm9yIGRpZmZlcmVudCB0eXBlcy4KKworV2hpbGUgeW91IGNhbiB3cml0ZSBvbmUgYFRFU1RgIG9yIGBURVNUX0ZgIGZvciBlYWNoIHR5cGUgeW91IHdhbnQgdG8KK3Rlc3QgKGFuZCB5b3UgbWF5IGV2ZW4gZmFjdG9yIHRoZSB0ZXN0IGxvZ2ljIGludG8gYSBmdW5jdGlvbiB0ZW1wbGF0ZQordGhhdCB5b3UgaW52b2tlIGZyb20gdGhlIGBURVNUYCksIGl0J3MgdGVkaW91cyBhbmQgZG9lc24ndCBzY2FsZToKK2lmIHlvdSB3YW50IF9tXyB0ZXN0cyBvdmVyIF9uXyB0eXBlcywgeW91J2xsIGVuZCB1cCB3cml0aW5nIF9tXCpuXworYFRFU1Rgcy4KKworX1R5cGVkIHRlc3RzXyBhbGxvdyB5b3UgdG8gcmVwZWF0IHRoZSBzYW1lIHRlc3QgbG9naWMgb3ZlciBhIGxpc3Qgb2YKK3R5cGVzLiAgWW91IG9ubHkgbmVlZCB0byB3cml0ZSB0aGUgdGVzdCBsb2dpYyBvbmNlLCBhbHRob3VnaCB5b3UgbXVzdAora25vdyB0aGUgdHlwZSBsaXN0IHdoZW4gd3JpdGluZyB0eXBlZCB0ZXN0cy4gIEhlcmUncyBob3cgeW91IGRvIGl0OgorCitGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEl0IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkCitieSBhIHR5cGUuICBSZW1lbWJlciB0byBkZXJpdmUgaXQgZnJvbSBgOjp0ZXN0aW5nOjpUZXN0YDoKKworYGBgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIC4uLgorICB0eXBlZGVmIHN0ZDo6bGlzdDxUPiBMaXN0OworICBzdGF0aWMgVCBzaGFyZWRfOworICBUIHZhbHVlXzsKK307CitgYGAKKworTmV4dCwgYXNzb2NpYXRlIGEgbGlzdCBvZiB0eXBlcyB3aXRoIHRoZSB0ZXN0IGNhc2UsIHdoaWNoIHdpbGwgYmUKK3JlcGVhdGVkIGZvciBlYWNoIHR5cGUgaW4gdGhlIGxpc3Q6CisKK2BgYAordHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOworVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIE15VHlwZXMpOworYGBgCisKK1RoZSBgdHlwZWRlZmAgaXMgbmVjZXNzYXJ5IGZvciB0aGUgYFRZUEVEX1RFU1RfQ0FTRWAgbWFjcm8gdG8gcGFyc2UKK2NvcnJlY3RseS4gIE90aGVyd2lzZSB0aGUgY29tcGlsZXIgd2lsbCB0aGluayB0aGF0IGVhY2ggY29tbWEgaW4gdGhlCit0eXBlIGxpc3QgaW50cm9kdWNlcyBhIG5ldyBtYWNybyBhcmd1bWVudC4KKworVGhlbiwgdXNlIGBUWVBFRF9URVNUKClgIGluc3RlYWQgb2YgYFRFU1RfRigpYCB0byBkZWZpbmUgYSB0eXBlZCB0ZXN0Citmb3IgdGhpcyB0ZXN0IGNhc2UuICBZb3UgY2FuIHJlcGVhdCB0aGlzIGFzIG1hbnkgdGltZXMgYXMgeW91IHdhbnQ6CisKK2BgYAorVFlQRURfVEVTVChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byB0aGUgc3BlY2lhbCBuYW1lIFR5cGVQYXJhbSB0byBnZXQgdGhlIHR5cGUKKyAgLy8gcGFyYW1ldGVyLiAgU2luY2Ugd2UgYXJlIGluc2lkZSBhIGRlcml2ZWQgY2xhc3MgdGVtcGxhdGUsIEMrKyByZXF1aXJlcworICAvLyB1cyB0byB2aXNpdCB0aGUgbWVtYmVycyBvZiBGb29UZXN0IHZpYSAndGhpcycuCisgIFR5cGVQYXJhbSBuID0gdGhpcy0+dmFsdWVfOworCisgIC8vIFRvIHZpc2l0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlLCBhZGQgdGhlICdUZXN0Rml4dHVyZTo6JworICAvLyBwcmVmaXguCisgIG4gKz0gVGVzdEZpeHR1cmU6OnNoYXJlZF87CisKKyAgLy8gVG8gcmVmZXIgdG8gdHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUsIGFkZCB0aGUgJ3R5cGVuYW1lIFRlc3RGaXh0dXJlOjonCisgIC8vIHByZWZpeC4gIFRoZSAndHlwZW5hbWUnIGlzIHJlcXVpcmVkIHRvIHNhdGlzZnkgdGhlIGNvbXBpbGVyLgorICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6TGlzdCB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2sobik7CisgIC4uLgorfQorCitUWVBFRF9URVNUKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorYGBgCisKK1lvdSBjYW4gc2VlIGBzYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2NgIGZvciBhIGNvbXBsZXRlIGV4YW1wbGUuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cyAocmVxdWlyZXMgTVNWQyA4LjAgb3IgYWJvdmUpLCBNYWM7CitzaW5jZSB2ZXJzaW9uIDEuMS4wLgorCisjIFR5cGUtUGFyYW1ldGVyaXplZCBUZXN0cyAjCisKK19UeXBlLXBhcmFtZXRlcml6ZWQgdGVzdHNfIGFyZSBsaWtlIHR5cGVkIHRlc3RzLCBleGNlcHQgdGhhdCB0aGV5Citkb24ndCByZXF1aXJlIHlvdSB0byBrbm93IHRoZSBsaXN0IG9mIHR5cGVzIGFoZWFkIG9mIHRpbWUuICBJbnN0ZWFkLAoreW91IGNhbiBkZWZpbmUgdGhlIHRlc3QgbG9naWMgZmlyc3QgYW5kIGluc3RhbnRpYXRlIGl0IHdpdGggZGlmZmVyZW50Cit0eXBlIGxpc3RzIGxhdGVyLiAgWW91IGNhbiBldmVuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhhbiBvbmNlIGluIHRoZQorc2FtZSBwcm9ncmFtLgorCitJZiB5b3UgYXJlIGRlc2lnbmluZyBhbiBpbnRlcmZhY2Ugb3IgY29uY2VwdCwgeW91IGNhbiBkZWZpbmUgYSBzdWl0ZQorb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHRvIHZlcmlmeSBwcm9wZXJ0aWVzIHRoYXQgYW55IHZhbGlkCitpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlL2NvbmNlcHQgc2hvdWxkIGhhdmUuICBUaGVuLCB0aGUgYXV0aG9yCitvZiBlYWNoIGltcGxlbWVudGF0aW9uIGNhbiBqdXN0IGluc3RhbnRpYXRlIHRoZSB0ZXN0IHN1aXRlIHdpdGggaGlzCit0eXBlIHRvIHZlcmlmeSB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSByZXF1aXJlbWVudHMsIHdpdGhvdXQgaGF2aW5nIHRvCit3cml0ZSBzaW1pbGFyIHRlc3RzIHJlcGVhdGVkbHkuICBIZXJlJ3MgYW4gZXhhbXBsZToKKworRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUsIGFzIHdlIGRpZCB3aXRoIHR5cGVkIHRlc3RzOgorCitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAuLi4KK307CitgYGAKKworTmV4dCwgZGVjbGFyZSB0aGF0IHlvdSB3aWxsIGRlZmluZSBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2U6CisKK2BgYAorVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCk7CitgYGAKKworVGhlIGBfUGAgc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIgb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91CitwcmVmZXIgdG8gdGhpbmsuCisKK1RoZW4sIHVzZSBgVFlQRURfVEVTVF9QKClgIHRvIGRlZmluZSBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LiAgWW91CitjYW4gcmVwZWF0IHRoaXMgYXMgbWFueSB0aW1lcyBhcyB5b3Ugd2FudDoKKworYGBgCitUWVBFRF9URVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuCisgIFR5cGVQYXJhbSBuID0gMDsKKyAgLi4uCit9CisKK1RZUEVEX1RFU1RfUChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KK2BgYAorCitOb3cgdGhlIHRyaWNreSBwYXJ0OiB5b3UgbmVlZCB0byByZWdpc3RlciBhbGwgdGVzdCBwYXR0ZXJucyB1c2luZyB0aGUKK2BSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUGAgbWFjcm8gYmVmb3JlIHlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbS4KK1RoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgbWFjcm8gaXMgdGhlIHRlc3QgY2FzZSBuYW1lOyB0aGUgcmVzdCBhcmUKK3RoZSBuYW1lcyBvZiB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2U6CisKK2BgYAorUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvZXNCbGFoLCBIYXNQcm9wZXJ0eUEpOworYGBgCisKK0ZpbmFsbHksIHlvdSBhcmUgZnJlZSB0byBpbnN0YW50aWF0ZSB0aGUgcGF0dGVybiB3aXRoIHRoZSB0eXBlcyB5b3UKK3dhbnQuICBJZiB5b3UgcHV0IHRoZSBhYm92ZSBjb2RlIGluIGEgaGVhZGVyIGZpbGUsIHlvdSBjYW4gYCNpbmNsdWRlYAoraXQgaW4gbXVsdGlwbGUgQysrIHNvdXJjZSBmaWxlcyBhbmQgaW5zdGFudGlhdGUgaXQgbXVsdGlwbGUgdGltZXMuCisKK2BgYAordHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIE15VHlwZXMpOworYGBgCisKK1RvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sIHRoZSBmaXJzdCBhcmd1bWVudAordG8gdGhlIGBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUGAgbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlCithZGRlZCB0byB0aGUgYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiAgUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMKK2ZvciBkaWZmZXJlbnQgaW5zdGFuY2VzLgorCitJbiB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91CitjYW4gd3JpdGUgdGhhdCB0eXBlIGRpcmVjdGx5IHdpdGhvdXQgYDo6dGVzdGluZzo6VHlwZXM8Li4uPmAsIGxpa2UgdGhpczoKKworYGBgCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgaW50KTsKK2BgYAorCitZb3UgY2FuIHNlZSBgc2FtcGxlcy9zYW1wbGU2X3VuaXR0ZXN0LmNjYCBmb3IgYSBjb21wbGV0ZSBleGFtcGxlLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MgKHJlcXVpcmVzIE1TVkMgOC4wIG9yIGFib3ZlKSwgTWFjOworc2luY2UgdmVyc2lvbiAxLjEuMC4KKworIyBUZXN0aW5nIFByaXZhdGUgQ29kZSAjCisKK0lmIHlvdSBjaGFuZ2UgeW91ciBzb2Z0d2FyZSdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLCB5b3VyIHRlc3RzIHNob3VsZCBub3QKK2JyZWFrIGFzIGxvbmcgYXMgdGhlIGNoYW5nZSBpcyBub3Qgb2JzZXJ2YWJsZSBieSB1c2Vycy4gVGhlcmVmb3JlLCBwZXIgdGhlCitfYmxhY2stYm94IHRlc3RpbmcgcHJpbmNpcGxlXywgbW9zdCBvZiB0aGUgdGltZSB5b3Ugc2hvdWxkIHRlc3QgeW91ciBjb2RlCit0aHJvdWdoIGl0cyBwdWJsaWMgaW50ZXJmYWNlcy4KKworSWYgeW91IHN0aWxsIGZpbmQgeW91cnNlbGYgbmVlZGluZyB0byB0ZXN0IGludGVybmFsIGltcGxlbWVudGF0aW9uIGNvZGUsCitjb25zaWRlciBpZiB0aGVyZSdzIGEgYmV0dGVyIGRlc2lnbiB0aGF0IHdvdWxkbid0IHJlcXVpcmUgeW91IHRvIGRvIHNvLiBJZiB5b3UKK2Fic29sdXRlbHkgaGF2ZSB0byB0ZXN0IG5vbi1wdWJsaWMgaW50ZXJmYWNlIGNvZGUgdGhvdWdoLCB5b3UgY2FuLiBUaGVyZSBhcmUKK3R3byBjYXNlcyB0byBjb25zaWRlcjoKKworICAqIFN0YXRpYyBmdW5jdGlvbnMgKF9ub3RfIHRoZSBzYW1lIGFzIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zISkgb3IgdW5uYW1lZCBuYW1lc3BhY2VzLCBhbmQKKyAgKiBQcml2YXRlIG9yIHByb3RlY3RlZCBjbGFzcyBtZW1iZXJzCisKKyMjIFN0YXRpYyBGdW5jdGlvbnMgIyMKKworQm90aCBzdGF0aWMgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucy9kZWNsYXJhdGlvbnMgaW4gYW4gdW5uYW1lZCBuYW1lc3BhY2UgYXJlCitvbmx5IHZpc2libGUgd2l0aGluIHRoZSBzYW1lIHRyYW5zbGF0aW9uIHVuaXQuIFRvIHRlc3QgdGhlbSwgeW91IGNhbiBgI2luY2x1ZGVgCit0aGUgZW50aXJlIGAuY2NgIGZpbGUgYmVpbmcgdGVzdGVkIGluIHlvdXIgYCpfdGVzdC5jY2AgZmlsZS4gKCNpbmNsdWRpbmcgYC5jY2AKK2ZpbGVzIGlzIG5vdCBhIGdvb2Qgd2F5IHRvIHJldXNlIGNvZGUgLSB5b3Ugc2hvdWxkIG5vdCBkbyB0aGlzIGluIHByb2R1Y3Rpb24KK2NvZGUhKQorCitIb3dldmVyLCBhIGJldHRlciBhcHByb2FjaCBpcyB0byBtb3ZlIHRoZSBwcml2YXRlIGNvZGUgaW50byB0aGUKK2Bmb286OmludGVybmFsYCBuYW1lc3BhY2UsIHdoZXJlIGBmb29gIGlzIHRoZSBuYW1lc3BhY2UgeW91ciBwcm9qZWN0IG5vcm1hbGx5Cit1c2VzLCBhbmQgcHV0IHRoZSBwcml2YXRlIGRlY2xhcmF0aW9ucyBpbiBhIGAqLWludGVybmFsLmhgIGZpbGUuIFlvdXIKK3Byb2R1Y3Rpb24gYC5jY2AgZmlsZXMgYW5kIHlvdXIgdGVzdHMgYXJlIGFsbG93ZWQgdG8gaW5jbHVkZSB0aGlzIGludGVybmFsCitoZWFkZXIsIGJ1dCB5b3VyIGNsaWVudHMgYXJlIG5vdC4gVGhpcyB3YXksIHlvdSBjYW4gZnVsbHkgdGVzdCB5b3VyIGludGVybmFsCitpbXBsZW1lbnRhdGlvbiB3aXRob3V0IGxlYWtpbmcgaXQgdG8geW91ciBjbGllbnRzLgorCisjIyBQcml2YXRlIENsYXNzIE1lbWJlcnMgIyMKKworUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFyZSBvbmx5IGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gdGhlIGNsYXNzIG9yIGJ5IGZyaWVuZHMuCitUbyBhY2Nlc3MgYSBjbGFzcycgcHJpdmF0ZSBtZW1iZXJzLCB5b3UgY2FuIGRlY2xhcmUgeW91ciB0ZXN0IGZpeHR1cmUgYXMgYQorZnJpZW5kIHRvIHRoZSBjbGFzcyBhbmQgZGVmaW5lIGFjY2Vzc29ycyBpbiB5b3VyIGZpeHR1cmUuIFRlc3RzIHVzaW5nIHRoZQorZml4dHVyZSBjYW4gdGhlbiBhY2Nlc3MgdGhlIHByaXZhdGUgbWVtYmVycyBvZiB5b3VyIHByb2R1Y3Rpb24gY2xhc3MgdmlhIHRoZQorYWNjZXNzb3JzIGluIHRoZSBmaXh0dXJlLiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggeW91ciBmaXh0dXJlIGlzIGEgZnJpZW5kIHRvCit5b3VyIHByb2R1Y3Rpb24gY2xhc3MsIHlvdXIgdGVzdHMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGZyaWVuZHMgdG8gaXQsIGFzIHRoZXkKK2FyZSB0ZWNobmljYWxseSBkZWZpbmVkIGluIHN1Yi1jbGFzc2VzIG9mIHRoZSBmaXh0dXJlLgorCitBbm90aGVyIHdheSB0byB0ZXN0IHByaXZhdGUgbWVtYmVycyBpcyB0byByZWZhY3RvciB0aGVtIGludG8gYW4gaW1wbGVtZW50YXRpb24KK2NsYXNzLCB3aGljaCBpcyB0aGVuIGRlY2xhcmVkIGluIGEgYCotaW50ZXJuYWwuaGAgZmlsZS4gWW91ciBjbGllbnRzIGFyZW4ndAorYWxsb3dlZCB0byBpbmNsdWRlIHRoaXMgaGVhZGVyIGJ1dCB5b3VyIHRlc3RzIGNhbi4gU3VjaCBpcyBjYWxsZWQgdGhlIFBpbXBsCisoUHJpdmF0ZSBJbXBsZW1lbnRhdGlvbikgaWRpb20uCisKK09yLCB5b3UgY2FuIGRlY2xhcmUgYW4gaW5kaXZpZHVhbCB0ZXN0IGFzIGEgZnJpZW5kIG9mIHlvdXIgY2xhc3MgYnkgYWRkaW5nIHRoaXMKK2xpbmUgaW4gdGhlIGNsYXNzIGJvZHk6CisKK2BgYAorRlJJRU5EX1RFU1QoVGVzdENhc2VOYW1lLCBUZXN0TmFtZSk7CitgYGAKKworRm9yIGV4YW1wbGUsCitgYGAKKy8vIGZvby5oCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJvZC5oIgorCisvLyBEZWZpbmVzIEZSSUVORF9URVNULgorY2xhc3MgRm9vIHsKKyAgLi4uCisgcHJpdmF0ZToKKyAgRlJJRU5EX1RFU1QoRm9vVGVzdCwgQmFyUmV0dXJuc1plcm9Pbk51bGwpOworICBpbnQgQmFyKHZvaWQqIHgpOworfTsKKworLy8gZm9vX3Rlc3QuY2MKKy4uLgorVEVTVChGb29UZXN0LCBCYXJSZXR1cm5zWmVyb09uTnVsbCkgeworICBGb28gZm9vOworICBFWFBFQ1RfRVEoMCwgZm9vLkJhcihOVUxMKSk7CisgIC8vIFVzZXMgRm9vJ3MgcHJpdmF0ZSBtZW1iZXIgQmFyKCkuCit9CitgYGAKKworUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHdoZW4geW91ciBjbGFzcyBpcyBkZWZpbmVkIGluIGEgbmFtZXNwYWNlLCBhcyB5b3Ugc2hvdWxkCitkZWZpbmUgeW91ciB0ZXN0IGZpeHR1cmVzIGFuZCB0ZXN0cyBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgaWYgeW91IHdhbnQgdGhlbSB0bworYmUgZnJpZW5kcyBvZiB5b3VyIGNsYXNzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGNvZGUgdG8gYmUgdGVzdGVkIGxvb2tzIGxpa2U6CisKK2BgYAorbmFtZXNwYWNlIG15X25hbWVzcGFjZSB7CisKK2NsYXNzIEZvbyB7CisgIGZyaWVuZCBjbGFzcyBGb29UZXN0OworICBGUklFTkRfVEVTVChGb29UZXN0LCBCYXIpOworICBGUklFTkRfVEVTVChGb29UZXN0LCBCYXopOworICAuLi4KKyAgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgRm9vCisgIC4uLgorfTsKKworfSAgLy8gbmFtZXNwYWNlIG15X25hbWVzcGFjZQorYGBgCisKK1lvdXIgdGVzdCBjb2RlIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZToKKworYGBgCituYW1lc3BhY2UgbXlfbmFtZXNwYWNlIHsKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC4uLgorfTsKKworVEVTVF9GKEZvb1Rlc3QsIEJhcikgeyAuLi4gfQorVEVTVF9GKEZvb1Rlc3QsIEJheikgeyAuLi4gfQorCit9ICAvLyBuYW1lc3BhY2UgbXlfbmFtZXNwYWNlCitgYGAKKworIyBDYXRjaGluZyBGYWlsdXJlcyAjCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgYSB0ZXN0aW5nIHV0aWxpdHkgb24gdG9wIG9mIEdvb2dsZSBUZXN0LCB5b3UnbGwKK3dhbnQgdG8gdGVzdCB5b3VyIHV0aWxpdHkuICBXaGF0IGZyYW1ld29yayB3b3VsZCB5b3UgdXNlIHRvIHRlc3QgaXQ/CitHb29nbGUgVGVzdCwgb2YgY291cnNlLgorCitUaGUgY2hhbGxlbmdlIGlzIHRvIHZlcmlmeSB0aGF0IHlvdXIgdGVzdGluZyB1dGlsaXR5IHJlcG9ydHMgZmFpbHVyZXMKK2NvcnJlY3RseS4gIEluIGZyYW1ld29ya3MgdGhhdCByZXBvcnQgYSBmYWlsdXJlIGJ5IHRocm93aW5nIGFuCitleGNlcHRpb24sIHlvdSBjb3VsZCBjYXRjaCB0aGUgZXhjZXB0aW9uIGFuZCBhc3NlcnQgb24gaXQuICBCdXQgR29vZ2xlCitUZXN0IGRvZXNuJ3QgdXNlIGV4Y2VwdGlvbnMsIHNvIGhvdyBkbyB3ZSB0ZXN0IHRoYXQgYSBwaWVjZSBvZiBjb2RlCitnZW5lcmF0ZXMgYW4gZXhwZWN0ZWQgZmFpbHVyZT8KKworYCJndGVzdC9ndGVzdC1zcGkuaCJgIGNvbnRhaW5zIHNvbWUgY29uc3RydWN0cyB0byBkbyB0aGlzLiAgQWZ0ZXIKKyNpbmNsdWRpbmcgdGhpcyBoZWFkZXIsIHlvdSBjYW4gdXNlCisKK3wgYEVYUEVDVF9GQVRBTF9GQUlMVVJFKGBfc3RhdGVtZW50LCBzdWJzdHJpbmdfYCk7YCB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCit0byBhc3NlcnQgdGhhdCBfc3RhdGVtZW50XyBnZW5lcmF0ZXMgYSBmYXRhbCAoZS5nLiBgQVNTRVJUXypgKSBmYWlsdXJlCit3aG9zZSBtZXNzYWdlIGNvbnRhaW5zIHRoZSBnaXZlbiBfc3Vic3RyaW5nXywgb3IgdXNlCisKK3wgYEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKGBfc3RhdGVtZW50LCBzdWJzdHJpbmdfYCk7YCB8Cit8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCitpZiB5b3UgYXJlIGV4cGVjdGluZyBhIG5vbi1mYXRhbCAoZS5nLiBgRVhQRUNUXypgKSBmYWlsdXJlLgorCitGb3IgdGVjaG5pY2FsIHJlYXNvbnMsIHRoZXJlIGFyZSBzb21lIGNhdmVhdHM6CisKKyAgMS4gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gZWl0aGVyIG1hY3JvLgorICAxLiBfc3RhdGVtZW50XyBpbiBgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKWAgY2Fubm90IHJlZmVyZW5jZSBsb2NhbCBub24tc3RhdGljIHZhcmlhYmxlcyBvciBub24tc3RhdGljIG1lbWJlcnMgb2YgYHRoaXNgIG9iamVjdC4KKyAgMS4gX3N0YXRlbWVudF8gaW4gYEVYUEVDVF9GQVRBTF9GQUlMVVJFKClgIGNhbm5vdCByZXR1cm4gYSB2YWx1ZS4KKworX05vdGU6XyBHb29nbGUgVGVzdCBpcyBkZXNpZ25lZCB3aXRoIHRocmVhZHMgaW4gbWluZC4gIE9uY2UgdGhlCitzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBpbiBgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCJgIGhhdmUKK2JlZW4gaW1wbGVtZW50ZWQsIEdvb2dsZSBUZXN0IHdpbGwgYmVjb21lIHRocmVhZC1zYWZlLCBtZWFuaW5nIHRoYXQKK3lvdSBjYW4gdGhlbiB1c2UgYXNzZXJ0aW9ucyBpbiBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseS4gIEJlZm9yZQorCit0aGF0LCBob3dldmVyLCBHb29nbGUgVGVzdCBvbmx5IHN1cHBvcnRzIHNpbmdsZS10aHJlYWRlZCB1c2FnZS4gIE9uY2UKK3RocmVhZC1zYWZlLCBgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKWAgYW5kIGBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpYAord2lsbCBjYXB0dXJlIGZhaWx1cmVzIGluIHRoZSBjdXJyZW50IHRocmVhZCBvbmx5LiBJZiBfc3RhdGVtZW50XworY3JlYXRlcyBuZXcgdGhyZWFkcywgZmFpbHVyZXMgaW4gdGhlc2UgdGhyZWFkcyB3aWxsIGJlIGlnbm9yZWQuICBJZgoreW91IHdhbnQgdG8gY2FwdHVyZSBmYWlsdXJlcyBmcm9tIGFsbCB0aHJlYWRzIGluc3RlYWQsIHlvdSBzaG91bGQgdXNlCit0aGUgZm9sbG93aW5nIG1hY3JvczoKKworfCBgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoYF9zdGF0ZW1lbnQsIHN1YnN0cmluZ19gKTtgIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IGBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhgX3N0YXRlbWVudCwgc3Vic3RyaW5nX2ApO2AgfAorCisjIEdldHRpbmcgdGhlIEN1cnJlbnQgVGVzdCdzIE5hbWUgIworCitTb21ldGltZXMgYSBmdW5jdGlvbiBtYXkgbmVlZCB0byBrbm93IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LgorRm9yIGV4YW1wbGUsIHlvdSBtYXkgYmUgdXNpbmcgdGhlIGBTZXRVcCgpYCBtZXRob2Qgb2YgeW91ciB0ZXN0IGZpeHR1cmUgdG8gc2V0Cit0aGUgZ29sZGVuIGZpbGUgbmFtZSBiYXNlZCBvbiB3aGljaCB0ZXN0IGlzIHJ1bm5pbmcuIFRoZSBgOjp0ZXN0aW5nOjpUZXN0SW5mb2AKK2NsYXNzIGhhcyB0aGlzIGluZm9ybWF0aW9uOgorCitgYGAKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgVGVzdEluZm8geworIHB1YmxpYzoKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUsIHJlc3BlY3RpdmVseS4KKyAgLy8KKyAgLy8gRG8gTk9UIGRlbGV0ZSBvciBmcmVlIHRoZSByZXR1cm4gdmFsdWUgLSBpdCdzIG1hbmFnZWQgYnkgdGhlCisgIC8vIFRlc3RJbmZvIGNsYXNzLgorICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSgpIGNvbnN0OworICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworYGBgCisKKworPiBUbyBvYnRhaW4gYSBgVGVzdEluZm9gIG9iamVjdCBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QsIGNhbGwKK2BjdXJyZW50X3Rlc3RfaW5mbygpYCBvbiB0aGUgYFVuaXRUZXN0YCBzaW5nbGV0b24gb2JqZWN0OgorCitgYGAKKy8vIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuCisvLyBEbyBOT1QgZGVsZXRlIHRoZSByZXR1cm5lZCBvYmplY3QgLSBpdCdzIG1hbmFnZWQgYnkgdGhlIFVuaXRUZXN0IGNsYXNzLgorY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKK3ByaW50ZigiV2UgYXJlIGluIHRlc3QgJXMgb2YgdGVzdCBjYXNlICVzLlxuIiwKKyAgICAgICB0ZXN0X2luZm8tPm5hbWUoKSwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKTsKK2BgYAorCitgY3VycmVudF90ZXN0X2luZm8oKWAgcmV0dXJucyBhIG51bGwgcG9pbnRlciBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuIEluCitwYXJ0aWN1bGFyLCB5b3UgY2Fubm90IGZpbmQgdGhlIHRlc3QgY2FzZSBuYW1lIGluIGBUZXN0Q2FzZVNldFVwKClgLAorYFRlc3RDYXNlVGVhckRvd24oKWAgKHdoZXJlIHlvdSBrbm93IHRoZSB0ZXN0IGNhc2UgbmFtZSBpbXBsaWNpdGx5KSwgb3IKK2Z1bmN0aW9ucyBjYWxsZWQgZnJvbSB0aGVtLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyBFeHRlbmRpbmcgR29vZ2xlIFRlc3QgYnkgSGFuZGxpbmcgVGVzdCBFdmVudHMgIworCitHb29nbGUgVGVzdCBwcm92aWRlcyBhbiA8Yj5ldmVudCBsaXN0ZW5lciBBUEk8L2I+IHRvIGxldCB5b3UgcmVjZWl2ZQorbm90aWZpY2F0aW9ucyBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YgYSB0ZXN0IHByb2dyYW0gYW5kIHRlc3QKK2ZhaWx1cmVzLiBUaGUgZXZlbnRzIHlvdSBjYW4gbGlzdGVuIHRvIGluY2x1ZGUgdGhlIHN0YXJ0IGFuZCBlbmQgb2YKK3RoZSB0ZXN0IHByb2dyYW0sIGEgdGVzdCBjYXNlLCBvciBhIHRlc3QgbWV0aG9kLCBhbW9uZyBvdGhlcnMuIFlvdSBtYXkKK3VzZSB0aGlzIEFQSSB0byBhdWdtZW50IG9yIHJlcGxhY2UgdGhlIHN0YW5kYXJkIGNvbnNvbGUgb3V0cHV0LAorcmVwbGFjZSB0aGUgWE1MIG91dHB1dCwgb3IgcHJvdmlkZSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZvcm0gb2YKK291dHB1dCwgc3VjaCBhcyBhIEdVSSBvciBhIGRhdGFiYXNlLiBZb3UgY2FuIGFsc28gdXNlIHRlc3QgZXZlbnRzIGFzCitjaGVja3BvaW50cyB0byBpbXBsZW1lbnQgYSByZXNvdXJjZSBsZWFrIGNoZWNrZXIsIGZvciBleGFtcGxlLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdjEuNC4wLgorCisjIyBEZWZpbmluZyBFdmVudCBMaXN0ZW5lcnMgIyMKKworVG8gZGVmaW5lIGEgZXZlbnQgbGlzdGVuZXIsIHlvdSBzdWJjbGFzcyBlaXRoZXIKK1t0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgjODU1KQorb3IgW3Rlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIzkwNSkuCitUaGUgZm9ybWVyIGlzIGFuIChhYnN0cmFjdCkgaW50ZXJmYWNlLCB3aGVyZSA8aT5lYWNoIHB1cmUgdmlydHVhbCBtZXRob2Q8YnI+CitjYW4gYmUgb3ZlcnJpZGRlbiB0byBoYW5kbGUgYSB0ZXN0IGV2ZW50PC9pPiAoRm9yIGV4YW1wbGUsIHdoZW4gYSB0ZXN0CitzdGFydHMsIHRoZSBgT25UZXN0U3RhcnQoKWAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLikuIFRoZSBsYXR0ZXIgcHJvdmlkZXMKK2FuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIGFsbCBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UsIHN1Y2ggdGhhdCBhCitzdWJjbGFzcyBvbmx5IG5lZWRzIHRvIG92ZXJyaWRlIHRoZSBtZXRob2RzIGl0IGNhcmVzIGFib3V0LgorCitXaGVuIGFuIGV2ZW50IGlzIGZpcmVkLCBpdHMgY29udGV4dCBpcyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24KK2FzIGFuIGFyZ3VtZW50LiBUaGUgZm9sbG93aW5nIGFyZ3VtZW50IHR5cGVzIGFyZSB1c2VkOgorICAqIFtVbml0VGVzdF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgjMTAwNykgcmVmbGVjdHMgdGhlIHN0YXRlIG9mIHRoZSBlbnRpcmUgdGVzdCBwcm9ncmFtLAorICAqIFtUZXN0Q2FzZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgjNjg5KSBoYXMgaW5mb3JtYXRpb24gYWJvdXQgYSB0ZXN0IGNhc2UsIHdoaWNoIGNhbiBjb250YWluIG9uZSBvciBtb3JlIHRlc3RzLAorICAqIFtUZXN0SW5mb10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgjNTk5KSBjb250YWlucyB0aGUgc3RhdGUgb2YgYSB0ZXN0LCBhbmQKKyAgKiBbVGVzdFBhcnRSZXN1bHRdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCM0MikgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgdGVzdCBhc3NlcnRpb24uCisKK0FuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gY2FuIGV4YW1pbmUgdGhlIGFyZ3VtZW50IGl0IHJlY2VpdmVzIHRvIGZpbmQKK291dCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXZlbnQgYW5kIHRoZSB0ZXN0IHByb2dyYW0ncworc3RhdGUuICBIZXJlJ3MgYW4gZXhhbXBsZToKKworYGBgCisgIGNsYXNzIE1pbmltYWxpc3RQcmludGVyIDogcHVibGljIDo6dGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgICAgLy8gQ2FsbGVkIGJlZm9yZSBhIHRlc3Qgc3RhcnRzLgorICAgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICAgIHByaW50ZigiKioqIFRlc3QgJXMuJXMgc3RhcnRpbmcuXG4iLAorICAgICAgICAgICAgIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBmYWlsZWQgYXNzZXJ0aW9uIG9yIGEgU1VDQ0VFRCgpIGludm9jYXRpb24uCisgICAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoCisgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgICAgIHByaW50ZigiJXMgaW4gJXM6JWRcbiVzXG4iLAorICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmFpbGVkKCkgPyAiKioqIEZhaWx1cmUiIDogIlN1Y2Nlc3MiLAorICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCisgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpLAorICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuc3VtbWFyeSgpKTsKKyAgICB9CisKKyAgICAvLyBDYWxsZWQgYWZ0ZXIgYSB0ZXN0IGVuZHMuCisgICAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICAgIHByaW50ZigiKioqIFRlc3QgJXMuJXMgZW5kaW5nLlxuIiwKKyAgICAgICAgICAgICB0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgfQorICB9OworYGBgCisKKyMjIFVzaW5nIEV2ZW50IExpc3RlbmVycyAjIworCitUbyB1c2UgdGhlIGV2ZW50IGxpc3RlbmVyIHlvdSBoYXZlIGRlZmluZWQsIGFkZCBhbiBpbnN0YW5jZSBvZiBpdCB0bwordGhlIEdvb2dsZSBUZXN0IGV2ZW50IGxpc3RlbmVyIGxpc3QgKHJlcHJlc2VudGVkIGJ5IGNsYXNzCitbVGVzdEV2ZW50TGlzdGVuZXJzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCM5MjkpCistIG5vdGUgdGhlICJzIiBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lKSBpbiB5b3VyCitgbWFpbigpYCBmdW5jdGlvbiwgYmVmb3JlIGNhbGxpbmcgYFJVTl9BTExfVEVTVFMoKWA6CitgYGAKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgLy8gR2V0cyBob2xkIG9mIHRoZSBldmVudCBsaXN0ZW5lciBsaXN0LgorICA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0KKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpOworICAvLyBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGVuZC4gIEdvb2dsZSBUZXN0IHRha2VzIHRoZSBvd25lcnNoaXAuCisgIGxpc3RlbmVycy5BcHBlbmQobmV3IE1pbmltYWxpc3RQcmludGVyKTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KK2BgYAorCitUaGVyZSdzIG9ubHkgb25lIHByb2JsZW06IHRoZSBkZWZhdWx0IHRlc3QgcmVzdWx0IHByaW50ZXIgaXMgc3RpbGwgaW4KK2VmZmVjdCwgc28gaXRzIG91dHB1dCB3aWxsIG1pbmdsZSB3aXRoIHRoZSBvdXRwdXQgZnJvbSB5b3VyIG1pbmltYWxpc3QKK3ByaW50ZXIuIFRvIHN1cHByZXNzIHRoZSBkZWZhdWx0IHByaW50ZXIsIGp1c3QgcmVsZWFzZSBpdCBmcm9tIHRoZQorZXZlbnQgbGlzdGVuZXIgbGlzdCBhbmQgZGVsZXRlIGl0LiBZb3UgY2FuIGRvIHNvIGJ5IGFkZGluZyBvbmUgbGluZToKK2BgYAorICAuLi4KKyAgZGVsZXRlIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkpOworICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBNaW5pbWFsaXN0UHJpbnRlcik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7CitgYGAKKworTm93LCBzaXQgYmFjayBhbmQgZW5qb3kgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBvdXRwdXQgZnJvbSB5b3VyCit0ZXN0cy4gRm9yIG1vcmUgZGV0YWlscywgeW91IGNhbiByZWFkIHRoaXMKK1tzYW1wbGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjKS4KKworWW91IG1heSBhcHBlbmQgbW9yZSB0aGFuIG9uZSBsaXN0ZW5lciB0byB0aGUgbGlzdC4gV2hlbiBhbiBgT24qU3RhcnQoKWAKK29yIGBPblRlc3RQYXJ0UmVzdWx0KClgIGV2ZW50IGlzIGZpcmVkLCB0aGUgbGlzdGVuZXJzIHdpbGwgcmVjZWl2ZSBpdCBpbgordGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBsaXN0IChzaW5jZSBuZXcgbGlzdGVuZXJzIGFyZSBhZGRlZCB0bwordGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlIGRlZmF1bHQgdGV4dCBwcmludGVyIGFuZCB0aGUgZGVmYXVsdCBYTUwKK2dlbmVyYXRvciB3aWxsIHJlY2VpdmUgdGhlIGV2ZW50IGZpcnN0KS4gQW4gYE9uKkVuZCgpYCBldmVudCB3aWxsIGJlCityZWNlaXZlZCBieSB0aGUgbGlzdGVuZXJzIGluIHRoZSBfcmV2ZXJzZV8gb3JkZXIuIFRoaXMgYWxsb3dzIG91dHB1dCBieQorbGlzdGVuZXJzIGFkZGVkIGxhdGVyIHRvIGJlIGZyYW1lZCBieSBvdXRwdXQgZnJvbSBsaXN0ZW5lcnMgYWRkZWQKK2VhcmxpZXIuCisKKyMjIEdlbmVyYXRpbmcgRmFpbHVyZXMgaW4gTGlzdGVuZXJzICMjCisKK1lvdSBtYXkgdXNlIGZhaWx1cmUtcmFpc2luZyBtYWNyb3MgKGBFWFBFQ1RfKigpYCwgYEFTU0VSVF8qKClgLAorYEZBSUwoKWAsIGV0Yykgd2hlbiBwcm9jZXNzaW5nIGFuIGV2ZW50LiBUaGVyZSBhcmUgc29tZSByZXN0cmljdGlvbnM6CisKKyAgMS4gWW91IGNhbm5vdCBnZW5lcmF0ZSBhbnkgZmFpbHVyZSBpbiBgT25UZXN0UGFydFJlc3VsdCgpYCAob3RoZXJ3aXNlIGl0IHdpbGwgY2F1c2UgYE9uVGVzdFBhcnRSZXN1bHQoKWAgdG8gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5KS4KKyAgMS4gQSBsaXN0ZW5lciB0aGF0IGhhbmRsZXMgYE9uVGVzdFBhcnRSZXN1bHQoKWAgaXMgbm90IGFsbG93ZWQgdG8gZ2VuZXJhdGUgYW55IGZhaWx1cmUuCisKK1doZW4geW91IGFkZCBsaXN0ZW5lcnMgdG8gdGhlIGxpc3RlbmVyIGxpc3QsIHlvdSBzaG91bGQgcHV0IGxpc3RlbmVycwordGhhdCBoYW5kbGUgYE9uVGVzdFBhcnRSZXN1bHQoKWAgX2JlZm9yZV8gbGlzdGVuZXJzIHRoYXQgY2FuIGdlbmVyYXRlCitmYWlsdXJlcy4gVGhpcyBlbnN1cmVzIHRoYXQgZmFpbHVyZXMgZ2VuZXJhdGVkIGJ5IHRoZSBsYXR0ZXIgYXJlCithdHRyaWJ1dGVkIHRvIHRoZSByaWdodCB0ZXN0IGJ5IHRoZSBmb3JtZXIuCisKK1dlIGhhdmUgYSBzYW1wbGUgb2YgZmFpbHVyZS1yYWlzaW5nIGxpc3RlbmVyCitbaGVyZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjKS4KKworIyBSdW5uaW5nIFRlc3QgUHJvZ3JhbXM6IEFkdmFuY2VkIE9wdGlvbnMgIworCitHb29nbGUgVGVzdCB0ZXN0IHByb2dyYW1zIGFyZSBvcmRpbmFyeSBleGVjdXRhYmxlcy4gT25jZSBidWlsdCwgeW91IGNhbiBydW4KK3RoZW0gZGlyZWN0bHkgYW5kIGFmZmVjdCB0aGVpciBiZWhhdmlvciB2aWEgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK2FuZC9vciBjb21tYW5kIGxpbmUgZmxhZ3MuIEZvciB0aGUgZmxhZ3MgdG8gd29yaywgeW91ciBwcm9ncmFtcyBtdXN0IGNhbGwKK2A6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KClgIGJlZm9yZSBjYWxsaW5nIGBSVU5fQUxMX1RFU1RTKClgLgorCitUbyBzZWUgYSBsaXN0IG9mIHN1cHBvcnRlZCBmbGFncyBhbmQgdGhlaXIgdXNhZ2UsIHBsZWFzZSBydW4geW91ciB0ZXN0Citwcm9ncmFtIHdpdGggdGhlIGAtLWhlbHBgIGZsYWcuICBZb3UgY2FuIGFsc28gdXNlIGAtaGAsIGAtP2AsIG9yIGAvP2AKK2ZvciBzaG9ydC4gIFRoaXMgZmVhdHVyZSBpcyBhZGRlZCBpbiB2ZXJzaW9uIDEuMy4wLgorCitJZiBhbiBvcHRpb24gaXMgc3BlY2lmaWVkIGJvdGggYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGJ5IGEKK2ZsYWcsIHRoZSBsYXR0ZXIgdGFrZXMgcHJlY2VkZW5jZS4gIE1vc3Qgb2YgdGhlIG9wdGlvbnMgY2FuIGFsc28gYmUKK3NldC9yZWFkIGluIGNvZGU6IHRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgY29tbWFuZCBsaW5lIGZsYWcKK2AtLWd0ZXN0X2Zvb2AsIHdyaXRlIGA6OnRlc3Rpbmc6OkdURVNUX0ZMQUcoZm9vKWAuICBBIGNvbW1vbiBwYXR0ZXJuIGlzCit0byBzZXQgdGhlIHZhbHVlIG9mIGEgZmxhZyBiZWZvcmUgY2FsbGluZyBgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpYAordG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmbGFnOgorYGBgCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgLy8gRGlzYWJsZXMgZWxhcHNlZCB0aW1lIGJ5IGRlZmF1bHQuCisgIDo6dGVzdGluZzo6R1RFU1RfRkxBRyhwcmludF90aW1lKSA9IGZhbHNlOworCisgIC8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBmbGFnIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CitgYGAKKworIyMgU2VsZWN0aW5nIFRlc3RzICMjCisKK1RoaXMgc2VjdGlvbiBzaG93cyB2YXJpb3VzIG9wdGlvbnMgZm9yIGNob29zaW5nIHdoaWNoIHRlc3RzIHRvIHJ1bi4KKworIyMjIExpc3RpbmcgVGVzdCBOYW1lcyAjIyMKKworU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBsaXN0IHRoZSBhdmFpbGFibGUgdGVzdHMgaW4gYSBwcm9ncmFtIGJlZm9yZQorcnVubmluZyB0aGVtIHNvIHRoYXQgYSBmaWx0ZXIgbWF5IGJlIGFwcGxpZWQgaWYgbmVlZGVkLiBJbmNsdWRpbmcgdGhlIGZsYWcKK2AtLWd0ZXN0X2xpc3RfdGVzdHNgIG92ZXJyaWRlcyBhbGwgb3RoZXIgZmxhZ3MgYW5kIGxpc3RzIHRlc3RzIGluIHRoZSBmb2xsb3dpbmcKK2Zvcm1hdDoKK2BgYAorVGVzdENhc2UxLgorICBUZXN0TmFtZTEKKyAgVGVzdE5hbWUyCitUZXN0Q2FzZTIuCisgIFRlc3ROYW1lCitgYGAKKworTm9uZSBvZiB0aGUgdGVzdHMgbGlzdGVkIGFyZSBhY3R1YWxseSBydW4gaWYgdGhlIGZsYWcgaXMgcHJvdmlkZWQuIFRoZXJlIGlzIG5vCitjb3JyZXNwb25kaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciB0aGlzIGZsYWcuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgUnVubmluZyBhIFN1YnNldCBvZiB0aGUgVGVzdHMgIyMjCisKK0J5IGRlZmF1bHQsIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSBydW5zIGFsbCB0ZXN0cyB0aGUgdXNlciBoYXMgZGVmaW5lZC4KK1NvbWV0aW1lcywgeW91IHdhbnQgdG8gcnVuIG9ubHkgYSBzdWJzZXQgb2YgdGhlIHRlc3RzIChlLmcuIGZvciBkZWJ1Z2dpbmcgb3IKK3F1aWNrbHkgdmVyaWZ5aW5nIGEgY2hhbmdlKS4gSWYgeW91IHNldCB0aGUgYEdURVNUX0ZJTFRFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUKK29yIHRoZSBgLS1ndGVzdF9maWx0ZXJgIGZsYWcgdG8gYSBmaWx0ZXIgc3RyaW5nLCBHb29nbGUgVGVzdCB3aWxsIG9ubHkgcnVuIHRoZQordGVzdHMgd2hvc2UgZnVsbCBuYW1lcyAoaW4gdGhlIGZvcm0gb2YgYFRlc3RDYXNlTmFtZS5UZXN0TmFtZWApIG1hdGNoIHRoZQorZmlsdGVyLgorCitUaGUgZm9ybWF0IG9mIGEgZmlsdGVyIGlzIGEgJ2A6YCctc2VwYXJhdGVkIGxpc3Qgb2Ygd2lsZGNhcmQgcGF0dGVybnMgKGNhbGxlZAordGhlIHBvc2l0aXZlIHBhdHRlcm5zKSBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgJ2AtYCcgYW5kIGFub3RoZXIKKydgOmAnLXNlcGFyYXRlZCBwYXR0ZXJuIGxpc3QgKGNhbGxlZCB0aGUgbmVnYXRpdmUgcGF0dGVybnMpLiBBIHRlc3QgbWF0Y2hlcyB0aGUKK2ZpbHRlciBpZiBhbmQgb25seSBpZiBpdCBtYXRjaGVzIGFueSBvZiB0aGUgcG9zaXRpdmUgcGF0dGVybnMgYnV0IGRvZXMgbm90CittYXRjaCBhbnkgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLgorCitBIHBhdHRlcm4gbWF5IGNvbnRhaW4gYCcqJ2AgKG1hdGNoZXMgYW55IHN0cmluZykgb3IgYCc/J2AgKG1hdGNoZXMgYW55IHNpbmdsZQorY2hhcmFjdGVyKS4gRm9yIGNvbnZlbmllbmNlLCB0aGUgZmlsdGVyIGAnKi1OZWdhdGl2ZVBhdHRlcm5zJ2AgY2FuIGJlIGFsc28KK3dyaXR0ZW4gYXMgYCctTmVnYXRpdmVQYXR0ZXJucydgLgorCitGb3IgZXhhbXBsZToKKworICAqIGAuL2Zvb190ZXN0YCBIYXMgbm8gZmxhZywgYW5kIHRodXMgcnVucyBhbGwgaXRzIHRlc3RzLgorICAqIGAuL2Zvb190ZXN0IC0tZ3Rlc3RfZmlsdGVyPSpgIEFsc28gcnVucyBldmVyeXRoaW5nLCBkdWUgdG8gdGhlIHNpbmdsZSBtYXRjaC1ldmVyeXRoaW5nIGAqYCB2YWx1ZS4KKyAgKiBgLi9mb29fdGVzdCAtLWd0ZXN0X2ZpbHRlcj1Gb29UZXN0LipgIFJ1bnMgZXZlcnl0aGluZyBpbiB0ZXN0IGNhc2UgYEZvb1Rlc3RgLgorICAqIGAuL2Zvb190ZXN0IC0tZ3Rlc3RfZmlsdGVyPSpOdWxsKjoqQ29uc3RydWN0b3IqYCBSdW5zIGFueSB0ZXN0IHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyBlaXRoZXIgYCJOdWxsImAgb3IgYCJDb25zdHJ1Y3RvciJgLgorICAqIGAuL2Zvb190ZXN0IC0tZ3Rlc3RfZmlsdGVyPS0qRGVhdGhUZXN0LipgIFJ1bnMgYWxsIG5vbi1kZWF0aCB0ZXN0cy4KKyAgKiBgLi9mb29fdGVzdCAtLWd0ZXN0X2ZpbHRlcj1Gb29UZXN0LiotRm9vVGVzdC5CYXJgIFJ1bnMgZXZlcnl0aGluZyBpbiB0ZXN0IGNhc2UgYEZvb1Rlc3RgIGV4Y2VwdCBgRm9vVGVzdC5CYXJgLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMjIFRlbXBvcmFyaWx5IERpc2FibGluZyBUZXN0cyAjIyMKKworSWYgeW91IGhhdmUgYSBicm9rZW4gdGVzdCB0aGF0IHlvdSBjYW5ub3QgZml4IHJpZ2h0IGF3YXksIHlvdSBjYW4gYWRkIHRoZQorYERJU0FCTEVEX2AgcHJlZml4IHRvIGl0cyBuYW1lLiBUaGlzIHdpbGwgZXhjbHVkZSBpdCBmcm9tIGV4ZWN1dGlvbi4gVGhpcyBpcworYmV0dGVyIHRoYW4gY29tbWVudGluZyBvdXQgdGhlIGNvZGUgb3IgdXNpbmcgYCNpZiAwYCwgYXMgZGlzYWJsZWQgdGVzdHMgYXJlCitzdGlsbCBjb21waWxlZCAoYW5kIHRodXMgd29uJ3Qgcm90KS4KKworSWYgeW91IG5lZWQgdG8gZGlzYWJsZSBhbGwgdGVzdHMgaW4gYSB0ZXN0IGNhc2UsIHlvdSBjYW4gZWl0aGVyIGFkZCBgRElTQUJMRURfYAordG8gdGhlIGZyb250IG9mIHRoZSBuYW1lIG9mIGVhY2ggdGVzdCwgb3IgYWx0ZXJuYXRpdmVseSBhZGQgaXQgdG8gdGhlIGZyb250IG9mCit0aGUgdGVzdCBjYXNlIG5hbWUuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRlc3RzIHdvbid0IGJlIHJ1biBieSBHb29nbGUgVGVzdCwgZXZlbiB0aG91Z2ggdGhleQord2lsbCBzdGlsbCBiZSBjb21waWxlZDoKKworYGBgCisvLyBUZXN0cyB0aGF0IEZvbyBkb2VzIEFiYy4KK1RFU1QoRm9vVGVzdCwgRElTQUJMRURfRG9lc0FiYykgeyAuLi4gfQorCitjbGFzcyBESVNBQkxFRF9CYXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7IC4uLiB9OworCisvLyBUZXN0cyB0aGF0IEJhciBkb2VzIFh5ei4KK1RFU1RfRihESVNBQkxFRF9CYXJUZXN0LCBEb2VzWHl6KSB7IC4uLiB9CitgYGAKKworX05vdGU6XyBUaGlzIGZlYXR1cmUgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVtcG9yYXJ5IHBhaW4tcmVsaWVmLiBZb3Ugc3RpbGwKK2hhdmUgdG8gZml4IHRoZSBkaXNhYmxlZCB0ZXN0cyBhdCBhIGxhdGVyIGRhdGUuIEFzIGEgcmVtaW5kZXIsIEdvb2dsZSBUZXN0IHdpbGwKK3ByaW50IGEgYmFubmVyIHdhcm5pbmcgeW91IGlmIGEgdGVzdCBwcm9ncmFtIGNvbnRhaW5zIGFueSBkaXNhYmxlZCB0ZXN0cy4KKworX1RpcDpfIFlvdSBjYW4gZWFzaWx5IGNvdW50IHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgeW91IGhhdmUKK3VzaW5nIGBncmVwYC4gVGhpcyBudW1iZXIgY2FuIGJlIHVzZWQgYXMgYSBtZXRyaWMgZm9yIGltcHJvdmluZyB5b3VyCit0ZXN0IHF1YWxpdHkuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgVGVtcG9yYXJpbHkgRW5hYmxpbmcgRGlzYWJsZWQgVGVzdHMgIyMjCisKK1RvIGluY2x1ZGUgW2Rpc2FibGVkIHRlc3RzXSgjVGVtcG9yYXJpbHlfRGlzYWJsaW5nX1Rlc3RzLm1kKSBpbiB0ZXN0CitleGVjdXRpb24sIGp1c3QgaW52b2tlIHRoZSB0ZXN0IHByb2dyYW0gd2l0aCB0aGUKK2AtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzYCBmbGFnIG9yIHNldCB0aGUKK2BHVEVTVF9BTFNPX1JVTl9ESVNBQkxFRF9URVNUU2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSB2YWx1ZSBvdGhlcgordGhhbiBgMGAuICBZb3UgY2FuIGNvbWJpbmUgdGhpcyB3aXRoIHRoZQorWy0tZ3Rlc3RcX2ZpbHRlcl0oI1J1bm5pbmdfYV9TdWJzZXRfb2ZfdGhlX1Rlc3RzLm1kKSBmbGFnIHRvIGZ1cnRoZXIgc2VsZWN0Cit3aGljaCBkaXNhYmxlZCB0ZXN0cyB0byBydW4uCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2ZXJzaW9uIDEuMy4wLgorCisjIyBSZXBlYXRpbmcgdGhlIFRlc3RzICMjCisKK09uY2UgaW4gYSB3aGlsZSB5b3UnbGwgcnVuIGludG8gYSB0ZXN0IHdob3NlIHJlc3VsdCBpcyBoaXQtb3ItbWlzcy4gUGVyaGFwcyBpdAord2lsbCBmYWlsIG9ubHkgMSUgb2YgdGhlIHRpbWUsIG1ha2luZyBpdCByYXRoZXIgaGFyZCB0byByZXByb2R1Y2UgdGhlIGJ1ZyB1bmRlcgorYSBkZWJ1Z2dlci4gVGhpcyBjYW4gYmUgYSBtYWpvciBzb3VyY2Ugb2YgZnJ1c3RyYXRpb24uCisKK1RoZSBgLS1ndGVzdF9yZXBlYXRgIGZsYWcgYWxsb3dzIHlvdSB0byByZXBlYXQgYWxsIChvciBzZWxlY3RlZCkgdGVzdCBtZXRob2RzCitpbiBhIHByb2dyYW0gbWFueSB0aW1lcy4gSG9wZWZ1bGx5LCBhIGZsYWt5IHRlc3Qgd2lsbCBldmVudHVhbGx5IGZhaWwgYW5kIGdpdmUKK3lvdSBhIGNoYW5jZSB0byBkZWJ1Zy4gSGVyZSdzIGhvdyB0byB1c2UgaXQ6CisKK3wgYCQgZm9vX3Rlc3QgLS1ndGVzdF9yZXBlYXQ9MTAwMGAgfCBSZXBlYXQgZm9vXF90ZXN0IDEwMDAgdGltZXMgYW5kIGRvbid0IHN0b3AgYXQgZmFpbHVyZXMuIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYCQgZm9vX3Rlc3QgLS1ndGVzdF9yZXBlYXQ9LTFgICAgfCBBIG5lZ2F0aXZlIGNvdW50IG1lYW5zIHJlcGVhdGluZyBmb3JldmVyLiAgICAgICAgICAgICAgIHwKK3wgYCQgZm9vX3Rlc3QgLS1ndGVzdF9yZXBlYXQ9MTAwMCAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVgIHwgUmVwZWF0IGZvb1xfdGVzdCAxMDAwIHRpbWVzLCBzdG9wcGluZyBhdCB0aGUgZmlyc3QgZmFpbHVyZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgYSBkZWJ1Z2dlcjogd2hlbiB0aGUgdGVzdGZhaWxzLCBpdCB3aWxsIGRyb3AgaW50byB0aGUgZGVidWdnZXIgYW5kIHlvdSBjYW4gdGhlbiBpbnNwZWN0IHZhcmlhYmxlcyBhbmQgc3RhY2tzLiB8Cit8IGAkIGZvb190ZXN0IC0tZ3Rlc3RfcmVwZWF0PTEwMDAgLS1ndGVzdF9maWx0ZXI9Rm9vQmFyYCB8IFJlcGVhdCB0aGUgdGVzdHMgd2hvc2UgbmFtZSBtYXRjaGVzIHRoZSBmaWx0ZXIgMTAwMCB0aW1lcy4gfAorCitJZiB5b3VyIHRlc3QgcHJvZ3JhbSBjb250YWlucyBnbG9iYWwgc2V0LXVwL3RlYXItZG93biBjb2RlIHJlZ2lzdGVyZWQKK3VzaW5nIGBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKWAsIGl0IHdpbGwgYmUgcmVwZWF0ZWQgaW4gZWFjaAoraXRlcmF0aW9uIGFzIHdlbGwsIGFzIHRoZSBmbGFraW5lc3MgbWF5IGJlIGluIGl0LiBZb3UgY2FuIGFsc28gc3BlY2lmeQordGhlIHJlcGVhdCBjb3VudCBieSBzZXR0aW5nIHRoZSBgR1RFU1RfUkVQRUFUYCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIFNodWZmbGluZyB0aGUgVGVzdHMgIyMKKworWW91IGNhbiBzcGVjaWZ5IHRoZSBgLS1ndGVzdF9zaHVmZmxlYCBmbGFnIChvciBzZXQgdGhlIGBHVEVTVF9TSFVGRkxFYAorZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYDFgKSB0byBydW4gdGhlIHRlc3RzIGluIGEgcHJvZ3JhbSBpbiBhIHJhbmRvbQorb3JkZXIuIFRoaXMgaGVscHMgdG8gcmV2ZWFsIGJhZCBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0ZXN0cy4KKworQnkgZGVmYXVsdCwgR29vZ2xlIFRlc3QgdXNlcyBhIHJhbmRvbSBzZWVkIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY3VycmVudAordGltZS4gVGhlcmVmb3JlIHlvdSdsbCBnZXQgYSBkaWZmZXJlbnQgb3JkZXIgZXZlcnkgdGltZS4gVGhlIGNvbnNvbGUKK291dHB1dCBpbmNsdWRlcyB0aGUgcmFuZG9tIHNlZWQgdmFsdWUsIHN1Y2ggdGhhdCB5b3UgY2FuIHJlcHJvZHVjZSBhbgorb3JkZXItcmVsYXRlZCB0ZXN0IGZhaWx1cmUgbGF0ZXIuIFRvIHNwZWNpZnkgdGhlIHJhbmRvbSBzZWVkCitleHBsaWNpdGx5LCB1c2UgdGhlIGAtLWd0ZXN0X3JhbmRvbV9zZWVkPVNFRURgIGZsYWcgKG9yIHNldCB0aGUKK2BHVEVTVF9SQU5ET01fU0VFRGAgZW52aXJvbm1lbnQgdmFyaWFibGUpLCB3aGVyZSBgU0VFRGAgaXMgYW4gaW50ZWdlcgorYmV0d2VlbiAwIGFuZCA5OTk5OS4gVGhlIHNlZWQgdmFsdWUgMCBpcyBzcGVjaWFsOiBpdCB0ZWxscyBHb29nbGUgVGVzdAordG8gZG8gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY2FsY3VsYXRpbmcgdGhlIHNlZWQgZnJvbSB0aGUgY3VycmVudAordGltZS4KKworSWYgeW91IGNvbWJpbmUgdGhpcyB3aXRoIGAtLWd0ZXN0X3JlcGVhdD1OYCwgR29vZ2xlIFRlc3Qgd2lsbCBwaWNrIGEKK2RpZmZlcmVudCByYW5kb20gc2VlZCBhbmQgcmUtc2h1ZmZsZSB0aGUgdGVzdHMgaW4gZWFjaCBpdGVyYXRpb24uCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjOyBzaW5jZSB2MS40LjAuCisKKyMjIENvbnRyb2xsaW5nIFRlc3QgT3V0cHV0ICMjCisKK1RoaXMgc2VjdGlvbiB0ZWFjaGVzIGhvdyB0byB0d2VhayB0aGUgd2F5IHRlc3QgcmVzdWx0cyBhcmUgcmVwb3J0ZWQuCisKKyMjIyBDb2xvcmVkIFRlcm1pbmFsIE91dHB1dCAjIyMKKworR29vZ2xlIFRlc3QgY2FuIHVzZSBjb2xvcnMgaW4gaXRzIHRlcm1pbmFsIG91dHB1dCB0byBtYWtlIGl0IGVhc2llciB0byBzcG90Cit0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRlc3RzLCBhbmQgd2hldGhlciB0ZXN0cyBwYXNzZWQuCisKK1lvdSBjYW4gc2V0IHRoZSBHVEVTVFxfQ09MT1IgZW52aXJvbm1lbnQgdmFyaWFibGUgb3Igc2V0IHRoZSBgLS1ndGVzdF9jb2xvcmAKK2NvbW1hbmQgbGluZSBmbGFnIHRvIGB5ZXNgLCBgbm9gLCBvciBgYXV0b2AgKHRoZSBkZWZhdWx0KSB0byBlbmFibGUgY29sb3JzLAorZGlzYWJsZSBjb2xvcnMsIG9yIGxldCBHb29nbGUgVGVzdCBkZWNpZGUuIFdoZW4gdGhlIHZhbHVlIGlzIGBhdXRvYCwgR29vZ2xlCitUZXN0IHdpbGwgdXNlIGNvbG9ycyBpZiBhbmQgb25seSBpZiB0aGUgb3V0cHV0IGdvZXMgdG8gYSB0ZXJtaW5hbCBhbmQgKG9uCitub24tV2luZG93cyBwbGF0Zm9ybXMpIHRoZSBgVEVSTWAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIGB4dGVybWAgb3IKK2B4dGVybS1jb2xvcmAuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgU3VwcHJlc3NpbmcgdGhlIEVsYXBzZWQgVGltZSAjIyMKKworQnkgZGVmYXVsdCwgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSB0aW1lIGl0IHRha2VzIHRvIHJ1biBlYWNoIHRlc3QuICBUbworc3VwcHJlc3MgdGhhdCwgcnVuIHRoZSB0ZXN0IHByb2dyYW0gd2l0aCB0aGUgYC0tZ3Rlc3RfcHJpbnRfdGltZT0wYAorY29tbWFuZCBsaW5lIGZsYWcuICBTZXR0aW5nIHRoZSBgR1RFU1RfUFJJTlRfVElNRWAgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIHRvIGAwYCBoYXMgdGhlIHNhbWUgZWZmZWN0LgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYy4gIChJbiBHb29nbGUgVGVzdCAxLjMuMCBhbmQgbG93ZXIsCit0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0aGF0IHRoZSBlbGFwc2VkIHRpbWUgaXMgKipub3QqKiBwcmludGVkLikKKworIyMjIEdlbmVyYXRpbmcgYW4gWE1MIFJlcG9ydCAjIyMKKworR29vZ2xlIFRlc3QgY2FuIGVtaXQgYSBkZXRhaWxlZCBYTUwgcmVwb3J0IHRvIGEgZmlsZSBpbiBhZGRpdGlvbiB0byBpdHMgbm9ybWFsCit0ZXh0dWFsIG91dHB1dC4gVGhlIHJlcG9ydCBjb250YWlucyB0aGUgZHVyYXRpb24gb2YgZWFjaCB0ZXN0LCBhbmQgdGh1cyBjYW4KK2hlbHAgeW91IGlkZW50aWZ5IHNsb3cgdGVzdHMuCisKK1RvIGdlbmVyYXRlIHRoZSBYTUwgcmVwb3J0LCBzZXQgdGhlIGBHVEVTVF9PVVRQVVRgIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZQorYC0tZ3Rlc3Rfb3V0cHV0YCBmbGFnIHRvIHRoZSBzdHJpbmcgYCJ4bWw6X3BhdGhfdG9fb3V0cHV0X2ZpbGVfImAsIHdoaWNoIHdpbGwKK2NyZWF0ZSB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uIFlvdSBjYW4gYWxzbyBqdXN0IHVzZSB0aGUgc3RyaW5nCitgInhtbCJgLCBpbiB3aGljaCBjYXNlIHRoZSBvdXRwdXQgY2FuIGJlIGZvdW5kIGluIHRoZSBgdGVzdF9kZXRhaWwueG1sYCBmaWxlIGluCit0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKK0lmIHlvdSBzcGVjaWZ5IGEgZGlyZWN0b3J5IChmb3IgZXhhbXBsZSwgYCJ4bWw6b3V0cHV0L2RpcmVjdG9yeS8iYCBvbiBMaW51eCBvcgorYCJ4bWw6b3V0cHV0XGRpcmVjdG9yeVwiYCBvbiBXaW5kb3dzKSwgR29vZ2xlIFRlc3Qgd2lsbCBjcmVhdGUgdGhlIFhNTCBmaWxlIGluCit0aGF0IGRpcmVjdG9yeSwgbmFtZWQgYWZ0ZXIgdGhlIHRlc3QgZXhlY3V0YWJsZSAoZS5nLiBgZm9vX3Rlc3QueG1sYCBmb3IgdGVzdAorcHJvZ3JhbSBgZm9vX3Rlc3RgIG9yIGBmb29fdGVzdC5leGVgKS4gSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgKHBlcmhhcHMgbGVmdAorb3ZlciBmcm9tIGEgcHJldmlvdXMgcnVuKSwgR29vZ2xlIFRlc3Qgd2lsbCBwaWNrIGEgZGlmZmVyZW50IG5hbWUgKGUuZy4KK2Bmb29fdGVzdF8xLnhtbGApIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LgorCitUaGUgcmVwb3J0IHVzZXMgdGhlIGZvcm1hdCBkZXNjcmliZWQgaGVyZS4gIEl0IGlzIGJhc2VkIG9uIHRoZQorYGp1bml0cmVwb3J0YCBBbnQgdGFzayBhbmQgY2FuIGJlIHBhcnNlZCBieSBwb3B1bGFyIGNvbnRpbnVvdXMgYnVpbGQKK3N5c3RlbXMgbGlrZSBbSmVua2luc10oaHR0cDovL2plbmtpbnMtY2kub3JnLykuIFNpbmNlIHRoYXQgZm9ybWF0Cit3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCBmb3IgSmF2YSwgYSBsaXR0bGUgaW50ZXJwcmV0YXRpb24gaXMgcmVxdWlyZWQKK3RvIG1ha2UgaXQgYXBwbHkgdG8gR29vZ2xlIFRlc3QgdGVzdHMsIGFzIHNob3duIGhlcmU6CisKK2BgYAorPHRlc3RzdWl0ZXMgbmFtZT0iQWxsVGVzdHMiIC4uLj4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJ0ZXN0X2Nhc2VfbmFtZSIgLi4uPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0X25hbWUiIC4uLj4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiIvPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIi8+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iLz4KKyAgICA8L3Rlc3RjYXNlPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4KK2BgYAorCisgICogVGhlIHJvb3QgYDx0ZXN0c3VpdGVzPmAgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgZW50aXJlIHRlc3QgcHJvZ3JhbS4KKyAgKiBgPHRlc3RzdWl0ZT5gIGVsZW1lbnRzIGNvcnJlc3BvbmQgdG8gR29vZ2xlIFRlc3QgdGVzdCBjYXNlcy4KKyAgKiBgPHRlc3RjYXNlPmAgZWxlbWVudHMgY29ycmVzcG9uZCB0byBHb29nbGUgVGVzdCB0ZXN0IGZ1bmN0aW9ucy4KKworRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0KKworYGBgCitURVNUKE1hdGhUZXN0LCBBZGRpdGlvbikgeyAuLi4gfQorVEVTVChNYXRoVGVzdCwgU3VidHJhY3Rpb24pIHsgLi4uIH0KK1RFU1QoTG9naWNUZXN0LCBOb25Db250cmFkaWN0aW9uKSB7IC4uLiB9CitgYGAKKworY291bGQgZ2VuZXJhdGUgdGhpcyByZXBvcnQ6CisKK2BgYAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIzIiBmYWlsdXJlcz0iMSIgZXJyb3JzPSIwIiB0aW1lPSIzNSIgbmFtZT0iQWxsVGVzdHMiPgorICA8dGVzdHN1aXRlIG5hbWU9Ik1hdGhUZXN0IiB0ZXN0cz0iMiIgZmFpbHVyZXM9IjEiIGVycm9ycz0iMCIgdGltZT0iMTUiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBZGRpdGlvbiIgc3RhdHVzPSJydW4iIHRpbWU9IjciIGNsYXNzbmFtZT0iIj4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9IlZhbHVlIG9mOiBhZGQoMSwgMSkmI3gwQTsgQWN0dWFsOiAzJiN4MEE7RXhwZWN0ZWQ6IDIiIHR5cGU9IiIvPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iVmFsdWUgb2Y6IGFkZCgxLCAtMSkmI3gwQTsgQWN0dWFsOiAxJiN4MEE7RXhwZWN0ZWQ6IDAiIHR5cGU9IiIvPgorICAgIDwvdGVzdGNhc2U+CisgICAgPHRlc3RjYXNlIG5hbWU9IlN1YnRyYWN0aW9uIiBzdGF0dXM9InJ1biIgdGltZT0iNSIgY2xhc3NuYW1lPSIiPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IkxvZ2ljVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBlcnJvcnM9IjAiIHRpbWU9IjUiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJOb25Db250cmFkaWN0aW9uIiBzdGF0dXM9InJ1biIgdGltZT0iNSIgY2xhc3NuYW1lPSIiPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorPC90ZXN0c3VpdGVzPgorYGBgCisKK1RoaW5ncyB0byBub3RlOgorCisgICogVGhlIGB0ZXN0c2AgYXR0cmlidXRlIG9mIGEgYDx0ZXN0c3VpdGVzPmAgb3IgYDx0ZXN0c3VpdGU+YCBlbGVtZW50IHRlbGxzIGhvdyBtYW55IHRlc3QgZnVuY3Rpb25zIHRoZSBHb29nbGUgVGVzdCBwcm9ncmFtIG9yIHRlc3QgY2FzZSBjb250YWlucywgd2hpbGUgdGhlIGBmYWlsdXJlc2AgYXR0cmlidXRlIHRlbGxzIGhvdyBtYW55IG9mIHRoZW0gZmFpbGVkLgorICAqIFRoZSBgdGltZWAgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgZHVyYXRpb24gb2YgdGhlIHRlc3QsIHRlc3QgY2FzZSwgb3IgZW50aXJlIHRlc3QgcHJvZ3JhbSBpbiBtaWxsaXNlY29uZHMuCisgICogRWFjaCBgPGZhaWx1cmU+YCBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGZhaWxlZCBHb29nbGUgVGVzdCBhc3NlcnRpb24uCisgICogU29tZSBKVW5pdCBjb25jZXB0cyBkb24ndCBhcHBseSB0byBHb29nbGUgVGVzdCwgeWV0IHdlIGhhdmUgdG8gY29uZm9ybSB0byB0aGUgRFRELiBUaGVyZWZvcmUgeW91J2xsIHNlZSBzb21lIGR1bW15IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSByZXBvcnQuIFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGVzZSBwYXJ0cy4KKworX0F2YWlsYWJpbGl0eTpfIExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIENvbnRyb2xsaW5nIEhvdyBGYWlsdXJlcyBBcmUgUmVwb3J0ZWQgIyMKKworIyMjIFR1cm5pbmcgQXNzZXJ0aW9uIEZhaWx1cmVzIGludG8gQnJlYWstUG9pbnRzICMjIworCitXaGVuIHJ1bm5pbmcgdGVzdCBwcm9ncmFtcyB1bmRlciBhIGRlYnVnZ2VyLCBpdCdzIHZlcnkgY29udmVuaWVudCBpZiB0aGUKK2RlYnVnZ2VyIGNhbiBjYXRjaCBhbiBhc3NlcnRpb24gZmFpbHVyZSBhbmQgYXV0b21hdGljYWxseSBkcm9wIGludG8gaW50ZXJhY3RpdmUKK21vZGUuIEdvb2dsZSBUZXN0J3MgX2JyZWFrLW9uLWZhaWx1cmVfIG1vZGUgc3VwcG9ydHMgdGhpcyBiZWhhdmlvci4KKworVG8gZW5hYmxlIGl0LCBzZXQgdGhlIGBHVEVTVF9CUkVBS19PTl9GQUlMVVJFYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIHZhbHVlCitvdGhlciB0aGFuIGAwYCAuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlYAorY29tbWFuZCBsaW5lIGZsYWcuCisKK19BdmFpbGFiaWxpdHk6XyBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyMgRGlzYWJsaW5nIENhdGNoaW5nIFRlc3QtVGhyb3duIEV4Y2VwdGlvbnMgIyMjCisKK0dvb2dsZSBUZXN0IGNhbiBiZSB1c2VkIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQgZXhjZXB0aW9ucyBlbmFibGVkLiAgSWYKK2EgdGVzdCB0aHJvd3MgYSBDKysgZXhjZXB0aW9uIG9yIChvbiBXaW5kb3dzKSBhIHN0cnVjdHVyZWQgZXhjZXB0aW9uCisoU0VIKSwgYnkgZGVmYXVsdCBHb29nbGUgVGVzdCBjYXRjaGVzIGl0LCByZXBvcnRzIGl0IGFzIGEgdGVzdAorZmFpbHVyZSwgYW5kIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IHRlc3QgbWV0aG9kLiAgVGhpcyBtYXhpbWl6ZXMgdGhlCitjb3ZlcmFnZSBvZiBhIHRlc3QgcnVuLiAgQWxzbywgb24gV2luZG93cyBhbiB1bmNhdWdodCBleGNlcHRpb24gd2lsbAorY2F1c2UgYSBwb3AtdXAgd2luZG93LCBzbyBjYXRjaGluZyB0aGUgZXhjZXB0aW9ucyBhbGxvd3MgeW91IHRvIHJ1bgordGhlIHRlc3RzIGF1dG9tYXRpY2FsbHkuCisKK1doZW4gZGVidWdnaW5nIHRoZSB0ZXN0IGZhaWx1cmVzLCBob3dldmVyLCB5b3UgbWF5IGluc3RlYWQgd2FudCB0aGUKK2V4Y2VwdGlvbnMgdG8gYmUgaGFuZGxlZCBieSB0aGUgZGVidWdnZXIsIHN1Y2ggdGhhdCB5b3UgY2FuIGV4YW1pbmUKK3RoZSBjYWxsIHN0YWNrIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93bi4gIFRvIGFjaGlldmUgdGhhdCwgc2V0IHRoZQorYEdURVNUX0NBVENIX0VYQ0VQVElPTlNgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGAwYCwgb3IgdXNlIHRoZQorYC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucz0wYCBmbGFnIHdoZW4gcnVubmluZyB0aGUgdGVzdHMuCisKKyoqQXZhaWxhYmlsaXR5Kio6IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMjIyBMZXR0aW5nIEFub3RoZXIgVGVzdGluZyBGcmFtZXdvcmsgRHJpdmUgIyMjCisKK0lmIHlvdSB3b3JrIG9uIGEgcHJvamVjdCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gdXNpbmcgYW5vdGhlciB0ZXN0aW5nCitmcmFtZXdvcmsgYW5kIGlzIG5vdCByZWFkeSB0byBjb21wbGV0ZWx5IHN3aXRjaCB0byBHb29nbGUgVGVzdCB5ZXQsCit5b3UgY2FuIGdldCBtdWNoIG9mIEdvb2dsZSBUZXN0J3MgYmVuZWZpdCBieSB1c2luZyBpdHMgYXNzZXJ0aW9ucyBpbgoreW91ciBleGlzdGluZyB0ZXN0cy4gIEp1c3QgY2hhbmdlIHlvdXIgYG1haW4oKWAgZnVuY3Rpb24gdG8gbG9vaworbGlrZToKKworYGBgCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7CisgIC8vIEltcG9ydGFudDogR29vZ2xlIFRlc3QgbXVzdCBiZSBpbml0aWFsaXplZC4KKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgLi4uIHdoYXRldmVyIHlvdXIgZXhpc3RpbmcgdGVzdGluZyBmcmFtZXdvcmsgcmVxdWlyZXMgLi4uCit9CitgYGAKKworV2l0aCB0aGF0LCB5b3UgY2FuIHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGluIGFkZGl0aW9uIHRvIHRoZQorbmF0aXZlIGFzc2VydGlvbnMgeW91ciB0ZXN0aW5nIGZyYW1ld29yayBwcm92aWRlcywgZm9yIGV4YW1wbGU6CisKK2BgYAordm9pZCBUZXN0Rm9vRG9lc0JhcigpIHsKKyAgRm9vIGZvbzsKKyAgRVhQRUNUX0xFKGZvby5CYXIoMSksIDEwMCk7ICAgICAvLyBBIEdvb2dsZSBUZXN0IGFzc2VydGlvbi4KKyAgQ1BQVU5JVF9BU1NFUlQoZm9vLklzRW1wdHkoKSk7ICAvLyBBIG5hdGl2ZSBhc3NlcnRpb24uCit9CitgYGAKKworSWYgYSBHb29nbGUgVGVzdCBhc3NlcnRpb24gZmFpbHMsIGl0IHdpbGwgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQKK3Rocm93IGFuIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBiZSB0cmVhdGVkIGFzIGEgZmFpbHVyZSBieSB5b3VyIGhvc3QKK3Rlc3RpbmcgZnJhbWV3b3JrLiAgSWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZCwKK2EgZmFpbGVkIEdvb2dsZSBUZXN0IGFzc2VydGlvbiB3aWxsIGluc3RlYWQgZXhpdCB5b3VyIHByb2dyYW0gd2l0aCBhCitub24temVybyBjb2RlLCB3aGljaCB3aWxsIGFsc28gc2lnbmFsIGEgdGVzdCBmYWlsdXJlIHRvIHlvdXIgdGVzdAorcnVubmVyLgorCitJZiB5b3UgZG9uJ3Qgd3JpdGUgYDo6dGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7YCBpbgoreW91ciBgbWFpbigpYCwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IGVuYWJsZSB0aGlzIGZlYXR1cmUgYnkgc3BlY2lmeWluZwordGhlIGAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmVgIGZsYWcgb24gdGhlIGNvbW1hbmQtbGluZSBvciBzZXR0aW5nIHRoZQorYEdURVNUX1RIUk9XX09OX0ZBSUxVUkVgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgbm9uLXplcm8gdmFsdWUuCisKK0RlYXRoIHRlc3RzIGFyZSBfbm90XyBzdXBwb3J0ZWQgd2hlbiBvdGhlciB0ZXN0IGZyYW1ld29yayBpcyB1c2VkIHRvIG9yZ2FuaXplIHRlc3RzLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdjEuMy4wLgorCisjIyBEaXN0cmlidXRpbmcgVGVzdCBGdW5jdGlvbnMgdG8gTXVsdGlwbGUgTWFjaGluZXMgIyMKKworSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBtYWNoaW5lIHlvdSBjYW4gdXNlIHRvIHJ1biBhIHRlc3QgcHJvZ3JhbSwKK3lvdSBtaWdodCB3YW50IHRvIHJ1biB0aGUgdGVzdCBmdW5jdGlvbnMgaW4gcGFyYWxsZWwgYW5kIGdldCB0aGUKK3Jlc3VsdCBmYXN0ZXIuICBXZSBjYWxsIHRoaXMgdGVjaG5pcXVlIF9zaGFyZGluZ18sIHdoZXJlIGVhY2ggbWFjaGluZQoraXMgY2FsbGVkIGEgX3NoYXJkXy4KKworR29vZ2xlIFRlc3QgaXMgY29tcGF0aWJsZSB3aXRoIHRlc3Qgc2hhcmRpbmcuICBUbyB0YWtlIGFkdmFudGFnZSBvZgordGhpcyBmZWF0dXJlLCB5b3VyIHRlc3QgcnVubmVyIChub3QgcGFydCBvZiBHb29nbGUgVGVzdCkgbmVlZHMgdG8gZG8KK3RoZSBmb2xsb3dpbmc6CisKKyAgMS4gQWxsb2NhdGUgYSBudW1iZXIgb2YgbWFjaGluZXMgKHNoYXJkcykgdG8gcnVuIHRoZSB0ZXN0cy4KKyAgMS4gT24gZWFjaCBzaGFyZCwgc2V0IHRoZSBgR1RFU1RfVE9UQUxfU0hBUkRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcy4gIEl0IG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBzaGFyZHMuCisgIDEuIE9uIGVhY2ggc2hhcmQsIHNldCB0aGUgYEdURVNUX1NIQVJEX0lOREVYYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgaW5kZXggb2YgdGhlIHNoYXJkLiAgRGlmZmVyZW50IHNoYXJkcyBtdXN0IGJlIGFzc2lnbmVkIGRpZmZlcmVudCBpbmRpY2VzLCB3aGljaCBtdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsIEdURVNUX1RPVEFMX1NIQVJEUyAtIDFdYC4KKyAgMS4gUnVuIHRoZSBzYW1lIHRlc3QgcHJvZ3JhbSBvbiBhbGwgc2hhcmRzLiAgV2hlbiBHb29nbGUgVGVzdCBzZWVzIHRoZSBhYm92ZSB0d28gZW52aXJvbm1lbnQgdmFyaWFibGVzLCBpdCB3aWxsIHNlbGVjdCBhIHN1YnNldCBvZiB0aGUgdGVzdCBmdW5jdGlvbnMgdG8gcnVuLiAgQWNyb3NzIGFsbCBzaGFyZHMsIGVhY2ggdGVzdCBmdW5jdGlvbiBpbiB0aGUgcHJvZ3JhbSB3aWxsIGJlIHJ1biBleGFjdGx5IG9uY2UuCisgIDEuIFdhaXQgZm9yIGFsbCBzaGFyZHMgdG8gZmluaXNoLCB0aGVuIGNvbGxlY3QgYW5kIHJlcG9ydCB0aGUgcmVzdWx0cy4KKworWW91ciBwcm9qZWN0IG1heSBoYXZlIHRlc3RzIHRoYXQgd2VyZSB3cml0dGVuIHdpdGhvdXQgR29vZ2xlIFRlc3QgYW5kCit0aHVzIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBwcm90b2NvbC4gIEluIG9yZGVyIGZvciB5b3VyIHRlc3QgcnVubmVyIHRvCitmaWd1cmUgb3V0IHdoaWNoIHRlc3Qgc3VwcG9ydHMgc2hhcmRpbmcsIGl0IGNhbiBzZXQgdGhlIGVudmlyb25tZW50Cit2YXJpYWJsZSBgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEVgIHRvIGEgbm9uLWV4aXN0ZW50IGZpbGUgcGF0aC4gIElmIGEKK3Rlc3QgcHJvZ3JhbSBzdXBwb3J0cyBzaGFyZGluZywgaXQgd2lsbCBjcmVhdGUgdGhpcyBmaWxlIHRvCithY2tub3dsZWRnZSB0aGUgZmFjdCAodGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgbm90CitpbXBvcnRhbnQgYXQgdGhpcyB0aW1lOyBhbHRob3VnaCB3ZSBtYXkgc3RpY2sgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24KK2luIGl0IGluIHRoZSBmdXR1cmUuKTsgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGNyZWF0ZSBpdC4KKworSGVyZSdzIGFuIGV4YW1wbGUgdG8gbWFrZSBpdCBjbGVhci4gIFN1cHBvc2UgeW91IGhhdmUgYSB0ZXN0IHByb2dyYW0KK2Bmb29fdGVzdGAgdGhhdCBjb250YWlucyB0aGUgZm9sbG93aW5nIDUgdGVzdCBmdW5jdGlvbnM6CitgYGAKK1RFU1QoQSwgVikKK1RFU1QoQSwgVykKK1RFU1QoQiwgWCkKK1RFU1QoQiwgWSkKK1RFU1QoQiwgWikKK2BgYAorYW5kIHlvdSBoYXZlIDMgbWFjaGluZXMgYXQgeW91ciBkaXNwb3NhbC4gIFRvIHJ1biB0aGUgdGVzdCBmdW5jdGlvbnMgaW4KK3BhcmFsbGVsLCB5b3Ugd291bGQgc2V0IGBHVEVTVF9UT1RBTF9TSEFSRFNgIHRvIDMgb24gYWxsIG1hY2hpbmVzLCBhbmQKK3NldCBgR1RFU1RfU0hBUkRfSU5ERVhgIHRvIDAsIDEsIGFuZCAyIG9uIHRoZSBtYWNoaW5lcyByZXNwZWN0aXZlbHkuCitUaGVuIHlvdSB3b3VsZCBydW4gdGhlIHNhbWUgYGZvb190ZXN0YCBvbiBlYWNoIG1hY2hpbmUuCisKK0dvb2dsZSBUZXN0IHJlc2VydmVzIHRoZSByaWdodCB0byBjaGFuZ2UgaG93IHRoZSB3b3JrIGlzIGRpc3RyaWJ1dGVkCithY3Jvc3MgdGhlIHNoYXJkcywgYnV0IGhlcmUncyBvbmUgcG9zc2libGUgc2NlbmFyaW86CisKKyAgKiBNYWNoaW5lICMwIHJ1bnMgYEEuVmAgYW5kIGBCLlhgLgorICAqIE1hY2hpbmUgIzEgcnVucyBgQS5XYCBhbmQgYEIuWWAuCisgICogTWFjaGluZSAjMiBydW5zIGBCLlpgLgorCitfQXZhaWxhYmlsaXR5Ol8gTGludXgsIFdpbmRvd3MsIE1hYzsgc2luY2UgdmVyc2lvbiAxLjMuMC4KKworIyBGdXNpbmcgR29vZ2xlIFRlc3QgU291cmNlIEZpbGVzICMKKworR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiB+MzAgZmlsZXMgKGV4Y2x1ZGluZyBpdHMgb3duCit0ZXN0cykuICBTb21ldGltZXMgeW91IG1heSB3YW50IHRoZW0gdG8gYmUgcGFja2FnZWQgdXAgaW4gdHdvIGZpbGVzIChhCitgLmhgIGFuZCBhIGAuY2NgKSBpbnN0ZWFkLCBzdWNoIHRoYXQgeW91IGNhbiBlYXNpbHkgY29weSB0aGVtIHRvIGEgbmV3CittYWNoaW5lIGFuZCBzdGFydCBoYWNraW5nIHRoZXJlLiAgRm9yIHRoaXMgd2UgcHJvdmlkZSBhbiBleHBlcmltZW50YWwKK1B5dGhvbiBzY3JpcHQgYGZ1c2VfZ3Rlc3RfZmlsZXMucHlgIGluIHRoZSBgc2NyaXB0cy9gIGRpcmVjdG9yeSAoc2luY2UgcmVsZWFzZSAxLjMuMCkuCitBc3N1bWluZyB5b3UgaGF2ZSBQeXRob24gMi40IG9yIGFib3ZlIGluc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUsIGp1c3QKK2dvIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW4KK2BgYAorcHl0aG9uIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgT1VUUFVUX0RJUgorYGBgCisKK2FuZCB5b3Ugc2hvdWxkIHNlZSBhbiBgT1VUUFVUX0RJUmAgZGlyZWN0b3J5IGJlaW5nIGNyZWF0ZWQgd2l0aCBmaWxlcworYGd0ZXN0L2d0ZXN0LmhgIGFuZCBgZ3Rlc3QvZ3Rlc3QtYWxsLmNjYCBpbiBpdC4gIFRoZXNlIGZpbGVzIGNvbnRhaW4KK2V2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gdXNlIEdvb2dsZSBUZXN0LiAgSnVzdCBjb3B5IHRoZW0gdG8gYW55d2hlcmUKK3lvdSB3YW50IGFuZCB5b3UgYXJlIHJlYWR5IHRvIHdyaXRlIHRlc3RzLiAgWW91IGNhbiB1c2UgdGhlCitbc2NyaXB0cy90ZXN0L01ha2VmaWxlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvdGVzdC9NYWtlZmlsZSkKK2ZpbGUgYXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY29tcGlsZSB5b3VyIHRlc3RzIGFnYWluc3QgdGhlbS4KKworIyBXaGVyZSB0byBHbyBmcm9tIEhlcmUgIworCitDb25ncmF0dWxhdGlvbnMhIFlvdSd2ZSBub3cgbGVhcm5lZCBtb3JlIGFkdmFuY2VkIEdvb2dsZSBUZXN0IHRvb2xzIGFuZCBhcmUKK3JlYWR5IHRvIHRhY2tsZSBtb3JlIGNvbXBsZXggdGVzdGluZyB0YXNrcy4gSWYgeW91IHdhbnQgdG8gZGl2ZSBldmVuIGRlZXBlciwgeW91CitjYW4gcmVhZCB0aGUgW0ZyZXF1ZW50bHktQXNrZWQgUXVlc3Rpb25zXShWMV83X0ZBUS5tZCkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfN19Eb2N1bWVudGF0aW9uLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfN19Eb2N1bWVudGF0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MjY5N2EKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV83X0RvY3VtZW50YXRpb24ubWQKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBwYWdlIGxpc3RzIGFsbCBkb2N1bWVudGF0aW9uIHdpa2kgcGFnZXMgZm9yIEdvb2dsZSBUZXN0ICoqKHRoZSBTVk4gdHJ1bmsgdmVyc2lvbikqKgorLS0gKippZiB5b3UgdXNlIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCwgcGxlYXNlIHJlYWQgdGhlCitkb2N1bWVudGF0aW9uIGZvciB0aGF0IHNwZWNpZmljIHZlcnNpb24gaW5zdGVhZC4qKgorCisgICogW1ByaW1lcl0oVjFfN19QcmltZXIubWQpIC0tIHN0YXJ0IGhlcmUgaWYgeW91IGFyZSBuZXcgdG8gR29vZ2xlIFRlc3QuCisgICogW1NhbXBsZXNdKFYxXzdfU2FtcGxlcy5tZCkgLS0gbGVhcm4gZnJvbSBleGFtcGxlcy4KKyAgKiBbQWR2YW5jZWRHdWlkZV0oVjFfN19BZHZhbmNlZEd1aWRlLm1kKSAtLSBsZWFybiBtb3JlIGFib3V0IEdvb2dsZSBUZXN0LgorICAqIFtYY29kZUd1aWRlXShWMV83X1hjb2RlR3VpZGUubWQpIC0tIGhvdyB0byB1c2UgR29vZ2xlIFRlc3QgaW4gWGNvZGUgb24gTWFjLgorICAqIFtGcmVxdWVudGx5LUFza2VkIFF1ZXN0aW9uc10oVjFfN19GQVEubWQpIC0tIGNoZWNrIGhlcmUgYmVmb3JlIGFza2luZyBhIHF1ZXN0aW9uIG9uIHRoZSBtYWlsaW5nIGxpc3QuCisKK1RvIGNvbnRyaWJ1dGUgY29kZSB0byBHb29nbGUgVGVzdCwgcmVhZDoKKworICAqIFtEZXZHdWlkZV0oRGV2R3VpZGUubWQpIC0tIHJlYWQgdGhpcyBfYmVmb3JlXyB3cml0aW5nIHlvdXIgZmlyc3QgcGF0Y2guCisgICogW1B1bXBNYW51YWxdKFYxXzdfUHVtcE1hbnVhbC5tZCkgLS0gaG93IHdlIGdlbmVyYXRlIHNvbWUgb2YgR29vZ2xlIFRlc3QncyBzb3VyY2UgZmlsZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfN19GQVEubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV83X0ZBUS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQ1NDdjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfN19GQVEubWQKQEAgLTAsMCArMSwxMDgxIEBACisKKworSWYgeW91IGNhbm5vdCBmaW5kIHRoZSBhbnN3ZXIgdG8geW91ciBxdWVzdGlvbiBoZXJlLCBhbmQgeW91IGhhdmUgcmVhZAorW1ByaW1lcl0oVjFfN19QcmltZXIubWQpIGFuZCBbQWR2YW5jZWRHdWlkZV0oVjFfN19BZHZhbmNlZEd1aWRlLm1kKSwgc2VuZCBpdCB0bworZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tLgorCisjIyBXaHkgc2hvdWxkIEkgdXNlIEdvb2dsZSBUZXN0IGluc3RlYWQgb2YgbXkgZmF2b3JpdGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrPyAjIworCitGaXJzdCwgbGV0IHVzIHNheSBjbGVhcmx5IHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBnZXQgaW50byB0aGUgZGViYXRlIG9mCit3aGljaCBDKysgdGVzdGluZyBmcmFtZXdvcmsgaXMgKip0aGUgYmVzdCoqLiAgVGhlcmUgZXhpc3QgbWFueSBmaW5lCitmcmFtZXdvcmtzIGZvciB3cml0aW5nIEMrKyB0ZXN0cywgYW5kIHdlIGhhdmUgdHJlbWVuZG91cyByZXNwZWN0IGZvcgordGhlIGRldmVsb3BlcnMgYW5kIHVzZXJzIG9mIHRoZW0uICBXZSBkb24ndCB0aGluayB0aGVyZSBpcyAob3Igd2lsbAorYmUpIGEgc2luZ2xlIGJlc3QgZnJhbWV3b3JrIC0geW91IGhhdmUgdG8gcGljayB0aGUgcmlnaHQgdG9vbCBmb3IgdGhlCitwYXJ0aWN1bGFyIHRhc2sgeW91IGFyZSB0YWNrbGluZy4KKworV2UgY3JlYXRlZCBHb29nbGUgVGVzdCBiZWNhdXNlIHdlIGNvdWxkbid0IGZpbmQgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uCitvZiBmZWF0dXJlcyBhbmQgY29udmVuaWVuY2VzIGluIGFuIGV4aXN0aW5nIGZyYW1ld29yayB0byBzYXRpc2Z5IF9vdXJfCituZWVkcy4gIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHRoaW5ncyB0aGF0IF93ZV8gbGlrZSBhYm91dCBHb29nbGUKK1Rlc3QuICBXZSBkb24ndCBjbGFpbSB0aGVtIHRvIGJlIHVuaXF1ZSB0byBHb29nbGUgVGVzdCAtIHJhdGhlciwgdGhlCitjb21iaW5hdGlvbiBvZiB0aGVtIG1ha2VzIEdvb2dsZSBUZXN0IHRoZSBjaG9pY2UgZm9yIHVzLiAgV2UgaG9wZSB0aGlzCitsaXN0IGNhbiBoZWxwIHlvdSBkZWNpZGUgd2hldGhlciBpdCBpcyBmb3IgeW91IHRvby4KKworICAqIEdvb2dsZSBUZXN0IGlzIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlOiBpdCBkb2Vzbid0IHJlcXVpcmUgZXhjZXB0aW9ucyBvciBSVFRJOyBpdCB3b3JrcyBhcm91bmQgdmFyaW91cyBidWdzIGluIHZhcmlvdXMgY29tcGlsZXJzIGFuZCBlbnZpcm9ubWVudHM7IGV0Yy4gIEFzIGEgcmVzdWx0LCBpdCB3b3JrcyBvbiBMaW51eCwgTWFjIE9TIFgsIFdpbmRvd3MgYW5kIHNldmVyYWwgZW1iZWRkZWQgb3BlcmF0aW5nIHN5c3RlbXMuCisgICogTm9uZmF0YWwgYXNzZXJ0aW9ucyAoYEVYUEVDVF8qYCkgaGF2ZSBwcm92ZW4gdG8gYmUgZ3JlYXQgdGltZSBzYXZlcnMsIGFzIHRoZXkgYWxsb3cgYSB0ZXN0IHRvIHJlcG9ydCBtdWx0aXBsZSBmYWlsdXJlcyBpbiBhIHNpbmdsZSBlZGl0LWNvbXBpbGUtdGVzdCBjeWNsZS4KKyAgKiBJdCdzIGVhc3kgdG8gd3JpdGUgYXNzZXJ0aW9ucyB0aGF0IGdlbmVyYXRlIGluZm9ybWF0aXZlIG1lc3NhZ2VzOiB5b3UganVzdCB1c2UgdGhlIHN0cmVhbSBzeW50YXggdG8gYXBwZW5kIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBlLmcuIGBBU1NFUlRfRVEoNSwgRm9vKGkpKSA8PCAiIHdoZXJlIGkgPSAiIDw8IGk7YC4gIEl0IGRvZXNuJ3QgcmVxdWlyZSBhIG5ldyBzZXQgb2YgbWFjcm9zIG9yIHNwZWNpYWwgZnVuY3Rpb25zLgorICAqIEdvb2dsZSBUZXN0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyB5b3VyIHRlc3RzIGFuZCBkb2Vzbid0IHJlcXVpcmUgeW91IHRvIGVudW1lcmF0ZSB0aGVtIGluIG9yZGVyIHRvIHJ1biB0aGVtLgorICAqIERlYXRoIHRlc3RzIGFyZSBwcmV0dHkgaGFuZHkgZm9yIGVuc3VyaW5nIHRoYXQgeW91ciBhc3NlcnRzIGluIHByb2R1Y3Rpb24gY29kZSBhcmUgdHJpZ2dlcmVkIGJ5IHRoZSByaWdodCBjb25kaXRpb25zLgorICAqIGBTQ09QRURfVFJBQ0VgIGhlbHBzIHlvdSB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIGFuIGFzc2VydGlvbiBmYWlsdXJlIHdoZW4gaXQgY29tZXMgZnJvbSBpbnNpZGUgYSBzdWItcm91dGluZSBvciBsb29wLgorICAqIFlvdSBjYW4gZGVjaWRlIHdoaWNoIHRlc3RzIHRvIHJ1biB1c2luZyBuYW1lIHBhdHRlcm5zLiAgVGhpcyBzYXZlcyB0aW1lIHdoZW4geW91IHdhbnQgdG8gcXVpY2tseSByZXByb2R1Y2UgYSB0ZXN0IGZhaWx1cmUuCisgICogR29vZ2xlIFRlc3QgY2FuIGdlbmVyYXRlIFhNTCB0ZXN0IHJlc3VsdCByZXBvcnRzIHRoYXQgY2FuIGJlIHBhcnNlZCBieSBwb3B1bGFyIGNvbnRpbnVvdXMgYnVpbGQgc3lzdGVtIGxpa2UgSHVkc29uLgorICAqIFNpbXBsZSB0aGluZ3MgYXJlIGVhc3kgaW4gR29vZ2xlIFRlc3QsIHdoaWxlIGhhcmQgdGhpbmdzIGFyZSBwb3NzaWJsZTogaW4gYWRkaXRpb24gdG8gYWR2YW5jZWQgZmVhdHVyZXMgbGlrZSBbZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzdfQWR2YW5jZWRHdWlkZSNHbG9iYWxfU2V0LVVwX2FuZF9UZWFyLURvd24pIGFuZCB0ZXN0cyBwYXJhbWV0ZXJpemVkIGJ5IFt2YWx1ZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvVjFfN19BZHZhbmNlZEd1aWRlI1ZhbHVlX1BhcmFtZXRlcml6ZWRfVGVzdHMpIG9yIFt0eXBlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV83X0FkdmFuY2VkR3VpZGUjVHlwZWRfVGVzdHMpLCBHb29nbGUgVGVzdCBzdXBwb3J0cyB2YXJpb3VzIHdheXMgZm9yIHRoZSB1c2VyIHRvIGV4dGVuZCB0aGUgZnJhbWV3b3JrIC0tIGlmIEdvb2dsZSBUZXN0IGRvZXNuJ3QgZG8gc29tZXRoaW5nIG91dCBvZiB0aGUgYm94LCBjaGFuY2VzIGFyZSB0aGF0IGEgdXNlciBjYW4gaW1wbGVtZW50IHRoZSBmZWF0dXJlIHVzaW5nIEdvb2dsZSBUZXN0J3MgcHVibGljIEFQSSwgd2l0aG91dCBjaGFuZ2luZyBHb29nbGUgVGVzdCBpdHNlbGYuICBJbiBwYXJ0aWN1bGFyLCB5b3UgY2FuOgorICAgICogZXhwYW5kIHlvdXIgdGVzdGluZyB2b2NhYnVsYXJ5IGJ5IGRlZmluaW5nIFtjdXN0b20gcHJlZGljYXRlc10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV83X0FkdmFuY2VkR3VpZGUjUHJlZGljYXRlX0Fzc2VydGlvbnNfZm9yX0JldHRlcl9FcnJvcl9NZXNzYWdlcyksCisgICAgKiB0ZWFjaCBHb29nbGUgVGVzdCBob3cgdG8gW3ByaW50IHlvdXIgdHlwZXNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvVjFfN19BZHZhbmNlZEd1aWRlI1RlYWNoaW5nX0dvb2dsZV9UZXN0X0hvd190b19QcmludF9Zb3VyX1ZhbHVlcyksCisgICAgKiBkZWZpbmUgeW91ciBvd24gdGVzdGluZyBtYWNyb3Mgb3IgdXRpbGl0aWVzIGFuZCB2ZXJpZnkgdGhlbSB1c2luZyBHb29nbGUgVGVzdCdzIFtTZXJ2aWNlIFByb3ZpZGVyIEludGVyZmFjZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV83X0FkdmFuY2VkR3VpZGUjQ2F0Y2hpbmdfRmFpbHVyZXMpLCBhbmQKKyAgICAqIHJlZmxlY3Qgb24gdGhlIHRlc3QgY2FzZXMgb3IgY2hhbmdlIHRoZSB0ZXN0IG91dHB1dCBmb3JtYXQgYnkgaW50ZXJjZXB0aW5nIHRoZSBbdGVzdCBldmVudHNdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvVjFfN19BZHZhbmNlZEd1aWRlI0V4dGVuZGluZ19Hb29nbGVfVGVzdF9ieV9IYW5kbGluZ19UZXN0X0V2ZW50cykuCisKKyMjIEknbSBnZXR0aW5nIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIEdvb2dsZSBUZXN0LiAgV291bGQgeW91IGZpeCB0aGVtPyAjIworCitXZSBzdHJpdmUgdG8gbWluaW1pemUgY29tcGlsZXIgd2FybmluZ3MgR29vZ2xlIFRlc3QgZ2VuZXJhdGVzLiAgQmVmb3JlIHJlbGVhc2luZyBhIG5ldyB2ZXJzaW9uLCB3ZSB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QgZ2VuZXJhdGUgd2FybmluZ3Mgd2hlbiBjb21waWxlZCB1c2luZyBpdHMgQ01ha2Ugc2NyaXB0IG9uIFdpbmRvd3MsIExpbnV4LCBhbmQgTWFjIE9TLgorCitVbmZvcnR1bmF0ZWx5LCB0aGlzIGRvZXNuJ3QgbWVhbiB5b3UgYXJlIGd1YXJhbnRlZWQgdG8gc2VlIG5vIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIEdvb2dsZSBUZXN0IGluIHlvdXIgZW52aXJvbm1lbnQ6CisKKyAgKiBZb3UgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IGNvbXBpbGVyIGFzIHdlIHVzZSwgb3IgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGUgc2FtZSBjb21waWxlci4gIFdlIGNhbm5vdCBwb3NzaWJseSB0ZXN0IGZvciBhbGwgY29tcGlsZXJzLgorICAqIFlvdSBtYXkgYmUgY29tcGlsaW5nIG9uIGEgZGlmZmVyZW50IHBsYXRmb3JtIGFzIHdlIGRvLgorICAqIFlvdXIgcHJvamVjdCBtYXkgYmUgdXNpbmcgZGlmZmVyZW50IGNvbXBpbGVyIGZsYWdzIGFzIHdlIGRvLgorCitJdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlIHRvIG1ha2UgR29vZ2xlIFRlc3Qgd2FybmluZy1mcmVlIGZvciBldmVyeW9uZS4gIE9yLCBpdCBtYXkgbm90IGJlIGRlc2lyYWJsZSBpZiB0aGUgd2FybmluZyBpcyByYXJlbHkgZW5hYmxlZCBhbmQgZml4aW5nIHRoZSB2aW9sYXRpb25zIG1ha2VzIHRoZSBjb2RlIG1vcmUgY29tcGxleC4KKworSWYgeW91IHNlZSB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCwgd2Ugc3VnZ2VzdCB0aGF0IHlvdSB1c2UgdGhlIGAtaXN5c3RlbWAgZmxhZyAoYXNzdW1pbmcgeW91ciBhcmUgdXNpbmcgR0NDKSB0byBtYXJrIEdvb2dsZSBUZXN0IGhlYWRlcnMgYXMgc3lzdGVtIGhlYWRlcnMuICBUaGF0J2xsIHN1cHByZXNzIHdhcm5pbmdzIGZyb20gR29vZ2xlIFRlc3QgaGVhZGVycy4KKworIyMgV2h5IHNob3VsZCBub3QgdGVzdCBjYXNlIG5hbWVzIGFuZCB0ZXN0IG5hbWVzIGNvbnRhaW4gdW5kZXJzY29yZT8gIyMKKworVW5kZXJzY29yZSAoYF9gKSBpcyBzcGVjaWFsLCBhcyBDKysgcmVzZXJ2ZXMgdGhlIGZvbGxvd2luZyB0byBiZSB1c2VkIGJ5Cit0aGUgY29tcGlsZXIgYW5kIHRoZSBzdGFuZGFyZCBsaWJyYXJ5OgorCisgIDEuIGFueSBpZGVudGlmaWVyIHRoYXQgc3RhcnRzIHdpdGggYW4gYF9gIGZvbGxvd2VkIGJ5IGFuIHVwcGVyLWNhc2UgbGV0dGVyLCBhbmQKKyAgMS4gYW55IGlkZW50aWZpZXIgdGhhdCBjb250YWluZXJzIHR3byBjb25zZWN1dGl2ZSB1bmRlcnNjb3JlcyAoaS5lLiBgX19gKSBfYW55d2hlcmVfIGluIGl0cyBuYW1lLgorCitVc2VyIGNvZGUgaXMgX3Byb2hpYml0ZWRfIGZyb20gdXNpbmcgc3VjaCBpZGVudGlmaWVycy4KKworTm93IGxldCdzIGxvb2sgYXQgd2hhdCB0aGlzIG1lYW5zIGZvciBgVEVTVGAgYW5kIGBURVNUX0ZgLgorCitDdXJyZW50bHkgYFRFU1QoVGVzdENhc2VOYW1lLCBUZXN0TmFtZSlgIGdlbmVyYXRlcyBhIGNsYXNzIG5hbWVkCitgVGVzdENhc2VOYW1lX1Rlc3ROYW1lX1Rlc3RgLiAgV2hhdCBoYXBwZW5zIGlmIGBUZXN0Q2FzZU5hbWVgIG9yIGBUZXN0TmFtZWAKK2NvbnRhaW5zIGBfYD8KKworICAxLiBJZiBgVGVzdENhc2VOYW1lYCBzdGFydHMgd2l0aCBhbiBgX2AgZm9sbG93ZWQgYnkgYW4gdXBwZXItY2FzZSBsZXR0ZXIgKHNheSwgYF9Gb29gKSwgd2UgZW5kIHVwIHdpdGggYF9Gb29fVGVzdE5hbWVfVGVzdGAsIHdoaWNoIGlzIHJlc2VydmVkIGFuZCB0aHVzIGludmFsaWQuCisgIDEuIElmIGBUZXN0Q2FzZU5hbWVgIGVuZHMgd2l0aCBhbiBgX2AgKHNheSwgYEZvb19gKSwgd2UgZ2V0IGBGb29fX1Rlc3ROYW1lX1Rlc3RgLCB3aGljaCBpcyBpbnZhbGlkLgorICAxLiBJZiBgVGVzdE5hbWVgIHN0YXJ0cyB3aXRoIGFuIGBfYCAoc2F5LCBgX0JhcmApLCB3ZSBnZXQgYFRlc3RDYXNlTmFtZV9fQmFyX1Rlc3RgLCB3aGljaCBpcyBpbnZhbGlkLgorICAxLiBJZiBgVGVzdE5hbWVgIGVuZHMgd2l0aCBhbiBgX2AgKHNheSwgYEJhcl9gKSwgd2UgZ2V0IGBUZXN0Q2FzZU5hbWVfQmFyX19UZXN0YCwgd2hpY2ggaXMgaW52YWxpZC4KKworU28gY2xlYXJseSBgVGVzdENhc2VOYW1lYCBhbmQgYFRlc3ROYW1lYCBjYW5ub3Qgc3RhcnQgb3IgZW5kIHdpdGggYF9gCisoQWN0dWFsbHksIGBUZXN0Q2FzZU5hbWVgIGNhbiBzdGFydCB3aXRoIGBfYCAtLSBhcyBsb25nIGFzIHRoZSBgX2AgaXNuJ3QKK2ZvbGxvd2VkIGJ5IGFuIHVwcGVyLWNhc2UgbGV0dGVyLiAgQnV0IHRoYXQncyBnZXR0aW5nIGNvbXBsaWNhdGVkLiAgU28KK2ZvciBzaW1wbGljaXR5IHdlIGp1c3Qgc2F5IHRoYXQgaXQgY2Fubm90IHN0YXJ0IHdpdGggYF9gLikuCisKK0l0IG1heSBzZWVtIGZpbmUgZm9yIGBUZXN0Q2FzZU5hbWVgIGFuZCBgVGVzdE5hbWVgIHRvIGNvbnRhaW4gYF9gIGluIHRoZQorbWlkZGxlLiAgSG93ZXZlciwgY29uc2lkZXIgdGhpczoKK2BgYAorVEVTVChUaW1lLCBGbGllc19MaWtlX0FuX0Fycm93KSB7IC4uLiB9CitURVNUKFRpbWVfRmxpZXMsIExpa2VfQW5fQXJyb3cpIHsgLi4uIH0KK2BgYAorCitOb3csIHRoZSB0d28gYFRFU1RgcyB3aWxsIGJvdGggZ2VuZXJhdGUgdGhlIHNhbWUgY2xhc3MKKyhgVGltZV9GaWxlc19MaWtlX0FuX0Fycm93X1Rlc3RgKS4gIFRoYXQncyBub3QgZ29vZC4KKworU28gZm9yIHNpbXBsaWNpdHksIHdlIGp1c3QgYXNrIHRoZSB1c2VycyB0byBhdm9pZCBgX2AgaW4gYFRlc3RDYXNlTmFtZWAKK2FuZCBgVGVzdE5hbWVgLiAgVGhlIHJ1bGUgaXMgbW9yZSBjb25zdHJhaW5pbmcgdGhhbiBuZWNlc3NhcnksIGJ1dCBpdCdzCitzaW1wbGUgYW5kIGVhc3kgdG8gcmVtZW1iZXIuICBJdCBhbHNvIGdpdmVzIEdvb2dsZSBUZXN0IHNvbWUgd2lnZ2xlCityb29tIGluIGNhc2UgaXRzIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorCitJZiB5b3UgdmlvbGF0ZSB0aGUgcnVsZSwgdGhlcmUgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBjb25zZXF1ZW5jZXMsCitidXQgeW91ciB0ZXN0IG1heSAoanVzdCBtYXkpIGJyZWFrIHdpdGggYSBuZXcgY29tcGlsZXIgKG9yIGEgbmV3Cit2ZXJzaW9uIG9mIHRoZSBjb21waWxlciB5b3UgYXJlIHVzaW5nKSBvciB3aXRoIGEgbmV3IHZlcnNpb24gb2YgR29vZ2xlCitUZXN0LiAgVGhlcmVmb3JlIGl0J3MgYmVzdCB0byBmb2xsb3cgdGhlIHJ1bGUuCisKKyMjIFdoeSBpcyBpdCBub3QgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIHByZS1jb21waWxlZCBjb3B5IG9mIEdvb2dsZSBUZXN0IChmb3IgZXhhbXBsZSwgaW50byAvdXNyL2xvY2FsKT8gIyMKKworSW4gdGhlIGVhcmx5IGRheXMsIHdlIHNhaWQgdGhhdCB5b3UgY291bGQgaW5zdGFsbAorY29tcGlsZWQgR29vZ2xlIFRlc3QgbGlicmFyaWVzIG9uIGAqYG5peCBzeXN0ZW1zIHVzaW5nIGBtYWtlIGluc3RhbGxgLgorVGhlbiBldmVyeSB1c2VyIG9mIHlvdXIgbWFjaGluZSBjYW4gd3JpdGUgdGVzdHMgd2l0aG91dAorcmVjb21waWxpbmcgR29vZ2xlIFRlc3QuCisKK1RoaXMgc2VlbWVkIGxpa2UgYSBnb29kIGlkZWEsIGJ1dCBpdCBoYXMgYQorZ290LWNoYTogZXZlcnkgdXNlciBuZWVkcyB0byBjb21waWxlIGhpcyB0ZXN0cyB1c2luZyB0aGUgX3NhbWVfIGNvbXBpbGVyCitmbGFncyB1c2VkIHRvIGNvbXBpbGUgdGhlIGluc3RhbGxlZCBHb29nbGUgVGVzdCBsaWJyYXJpZXM7IG90aGVyd2lzZQoraGUgbWF5IHJ1biBpbnRvIHVuZGVmaW5lZCBiZWhhdmlvcnMgKGkuZS4gdGhlIHRlc3RzIGNhbiBiZWhhdmUKK3N0cmFuZ2VseSBhbmQgbWF5IGV2ZW4gY3Jhc2ggZm9yIG5vIG9idmlvdXMgcmVhc29ucykuCisKK1doeT8gIEJlY2F1c2UgQysrIGhhcyB0aGlzIHRoaW5nIGNhbGxlZCB0aGUgT25lLURlZmluaXRpb24gUnVsZTogaWYKK3R3byBDKysgc291cmNlIGZpbGVzIGNvbnRhaW4gZGlmZmVyZW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lCitjbGFzcy9mdW5jdGlvbi92YXJpYWJsZSwgYW5kIHlvdSBsaW5rIHRoZW0gdG9nZXRoZXIsIHlvdSB2aW9sYXRlIHRoZQorcnVsZS4gIFRoZSBsaW5rZXIgbWF5IG9yIG1heSBub3QgY2F0Y2ggdGhlIGVycm9yIChpbiBtYW55IGNhc2VzIGl0J3MKK25vdCByZXF1aXJlZCBieSB0aGUgQysrIHN0YW5kYXJkIHRvIGNhdGNoIHRoZSB2aW9sYXRpb24pLiAgSWYgaXQKK2RvZXNuJ3QsIHlvdSBnZXQgc3RyYW5nZSBydW4tdGltZSBiZWhhdmlvcnMgdGhhdCBhcmUgdW5leHBlY3RlZCBhbmQKK2hhcmQgdG8gZGVidWcuCisKK0lmIHlvdSBjb21waWxlIEdvb2dsZSBUZXN0IGFuZCB5b3VyIHRlc3QgY29kZSB1c2luZyBkaWZmZXJlbnQgY29tcGlsZXIKK2ZsYWdzLCB0aGV5IG1heSBzZWUgZGlmZmVyZW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lCitjbGFzcy9mdW5jdGlvbi92YXJpYWJsZSAoZS5nLiBkdWUgdG8gdGhlIHVzZSBvZiBgI2lmYCBpbiBHb29nbGUgVGVzdCkuCitUaGVyZWZvcmUsIGZvciB5b3VyIHNhbml0eSwgd2UgcmVjb21tZW5kIHRvIGF2b2lkIGluc3RhbGxpbmcgcHJlLWNvbXBpbGVkCitHb29nbGUgVGVzdCBsaWJyYXJpZXMuICBJbnN0ZWFkLCBlYWNoIHByb2plY3Qgc2hvdWxkIGNvbXBpbGUKK0dvb2dsZSBUZXN0IGl0c2VsZiBzdWNoIHRoYXQgaXQgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc2FtZSBmbGFncyBhcmUKK3VzZWQgZm9yIGJvdGggR29vZ2xlIFRlc3QgYW5kIHRoZSB0ZXN0cy4KKworIyMgSG93IGRvIEkgZ2VuZXJhdGUgNjQtYml0IGJpbmFyaWVzIG9uIFdpbmRvd3MgKHVzaW5nIFZpc3VhbCBTdHVkaW8gMjAwOCk/ICMjCisKKyhBbnN3ZXJlZCBieSBUcmV2b3IgUm9iaW5zb24pCisKK0xvYWQgdGhlIHN1cHBsaWVkIFZpc3VhbCBTdHVkaW8gc29sdXRpb24gZmlsZSwgZWl0aGVyIGBtc3ZjXGd0ZXN0LW1kLnNsbmAgb3IKK2Btc3ZjXGd0ZXN0LnNsbmAuIEdvIHRocm91Z2ggdGhlIG1pZ3JhdGlvbiB3aXphcmQgdG8gbWlncmF0ZSB0aGUKK3NvbHV0aW9uIGFuZCBwcm9qZWN0IGZpbGVzIHRvIFZpc3VhbCBTdHVkaW8gMjAwOC4gU2VsZWN0CitgQ29uZmlndXJhdGlvbiBNYW5hZ2VyLi4uYCBmcm9tIHRoZSBgQnVpbGRgIG1lbnUuIFNlbGVjdCBgPE5ldy4uLj5gIGZyb20KK3RoZSBgQWN0aXZlIHNvbHV0aW9uIHBsYXRmb3JtYCBkcm9wZG93bi4gIFNlbGVjdCBgeDY0YCBmcm9tIHRoZSBuZXcKK3BsYXRmb3JtIGRyb3Bkb3duLCBsZWF2ZSBgQ29weSBzZXR0aW5ncyBmcm9tYCBzZXQgdG8gYFdpbjMyYCBhbmQKK2BDcmVhdGUgbmV3IHByb2plY3QgcGxhdGZvcm1zYCBjaGVja2VkLCB0aGVuIGNsaWNrIGBPS2AuIFlvdSBub3cgaGF2ZQorYFdpbjMyYCBhbmQgYHg2NGAgcGxhdGZvcm0gY29uZmlndXJhdGlvbnMsIHNlbGVjdGFibGUgZnJvbSB0aGUKK2BTdGFuZGFyZGAgdG9vbGJhciwgd2hpY2ggYWxsb3cgeW91IHRvIHRvZ2dsZSBiZXR3ZWVuIGJ1aWxkaW5nIDMyLWJpdCBvcgorNjQtYml0IGJpbmFyaWVzIChvciBib3RoIGF0IG9uY2UgdXNpbmcgQmF0Y2ggQnVpbGQpLgorCitJbiBvcmRlciB0byBwcmV2ZW50IGJ1aWxkIG91dHB1dCBmaWxlcyBmcm9tIG92ZXJ3cml0aW5nIG9uZSBhbm90aGVyLAoreW91J2xsIG5lZWQgdG8gY2hhbmdlIHRoZSBgSW50ZXJtZWRpYXRlIERpcmVjdG9yeWAgc2V0dGluZ3MgZm9yIHRoZQorbmV3bHkgY3JlYXRlZCBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGFjcm9zcyBhbGwgdGhlIHByb2plY3RzLiBUbyBkbwordGhpcywgbXVsdGktc2VsZWN0IChlLmcuIHVzaW5nIHNoaWZ0LWNsaWNrKSBhbGwgcHJvamVjdHMgKGJ1dCBub3QgdGhlCitzb2x1dGlvbikgaW4gdGhlIGBTb2x1dGlvbiBFeHBsb3JlcmAuIFJpZ2h0LWNsaWNrIG9uZSBvZiB0aGVtIGFuZAorc2VsZWN0IGBQcm9wZXJ0aWVzYC4gSW4gdGhlIGxlZnQgcGFuZSwgc2VsZWN0IGBDb25maWd1cmF0aW9uIFByb3BlcnRpZXNgLAorYW5kIGZyb20gdGhlIGBDb25maWd1cmF0aW9uYCBkcm9wZG93biwgc2VsZWN0IGBBbGwgQ29uZmlndXJhdGlvbnNgLgorTWFrZSBzdXJlIHRoZSBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBgeDY0YC4gRm9yIHRoZQorYEludGVybWVkaWF0ZSBEaXJlY3RvcnlgIHNldHRpbmcsIGNoYW5nZSB0aGUgdmFsdWUgZnJvbQorYCQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKWAgdG8KK2AkKE91dERpcilcJChQcm9qZWN0TmFtZSlgLiBDbGljayBgT0tgIGFuZCB0aGVuIGJ1aWxkIHRoZQorc29sdXRpb24uIFdoZW4gdGhlIGJ1aWxkIGlzIGNvbXBsZXRlLCB0aGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgaW4KK3RoZSBgbXN2Y1x4NjRcRGVidWdgIGRpcmVjdG9yeS4KKworIyMgQ2FuIEkgdXNlIEdvb2dsZSBUZXN0IG9uIE1pbkdXPyAjIworCitXZSBoYXZlbid0IHRlc3RlZCB0aGlzIG91cnNlbHZlcywgYnV0IFBlciBBYnJhaGFtc2VuIHJlcG9ydGVkIHRoYXQgaGUKK3dhcyBhYmxlIHRvIGNvbXBpbGUgYW5kIGluc3RhbGwgR29vZ2xlIFRlc3Qgc3VjY2Vzc2Z1bGx5IHdoZW4gdXNpbmcKK01pbkdXIGZyb20gQ3lnd2luLiAgWW91J2xsIG5lZWQgdG8gY29uZmlndXJlIGl0IHdpdGg6CisKK2BQQVRIL1RPL2NvbmZpZ3VyZSBDQz0iZ2NjIC1tbm8tY3lnd2luIiBDWFg9ImcrKyAtbW5vLWN5Z3dpbiJgCisKK1lvdSBzaG91bGQgYmUgYWJsZSB0byByZXBsYWNlIHRoZSBgLW1uby1jeWd3aW5gIG9wdGlvbiB3aXRoIGRpcmVjdCBsaW5rcwordG8gdGhlIHJlYWwgTWluR1cgYmluYXJpZXMsIGJ1dCB3ZSBoYXZlbid0IHRyaWVkIHRoYXQuCisKK0NhdmVhdHM6CisKKyAgKiBUaGVyZSBhcmUgbWFueSB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZy4KKyAgKiBgbWFrZSBjaGVja2Agd2lsbCBwcm9kdWNlIHNvbWUgZXJyb3JzIGFzIG5vdCBhbGwgdGVzdHMgZm9yIEdvb2dsZSBUZXN0IGl0c2VsZiBhcmUgY29tcGF0aWJsZSB3aXRoIE1pbkdXLgorCitXZSBhbHNvIGhhdmUgcmVwb3J0cyBvbiBzdWNjZXNzZnVsIGNyb3NzIGNvbXBpbGF0aW9uIG9mIEdvb2dsZSBUZXN0CitNaW5HVyBiaW5hcmllcyBvbiBMaW51eCB1c2luZworW3RoZXNlIGluc3RydWN0aW9uc10oaHR0cDovL3dpa2kud3h3aWRnZXRzLm9yZy9Dcm9zcy1Db21waWxpbmdfVW5kZXJfTGludXgjQ3Jvc3MtY29tcGlsaW5nX3VuZGVyX0xpbnV4X2Zvcl9NU19XaW5kb3dzKQorb24gdGhlIFd4V2lkZ2V0cyBzaXRlLgorCitQbGVhc2UgY29udGFjdCBgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tYCBpZiB5b3UgYXJlCitpbnRlcmVzdGVkIGluIGltcHJvdmluZyB0aGUgc3VwcG9ydCBmb3IgTWluR1cuCisKKyMjIFdoeSBkb2VzIEdvb2dsZSBUZXN0IHN1cHBvcnQgRVhQRUNUXF9FUShOVUxMLCBwdHIpIGFuZCBBU1NFUlRcX0VRKE5VTEwsIHB0cikgYnV0IG5vdCBFWFBFQ1RcX05FKE5VTEwsIHB0cikgYW5kIEFTU0VSVFxfTkUoTlVMTCwgcHRyKT8gIyMKKworRHVlIHRvIHNvbWUgcGVjdWxpYXJpdHkgb2YgQysrLCBpdCByZXF1aXJlcyBzb21lIG5vbi10cml2aWFsIHRlbXBsYXRlCittZXRhIHByb2dyYW1taW5nIHRyaWNrcyB0byBzdXBwb3J0IHVzaW5nIGBOVUxMYCBhcyBhbiBhcmd1bWVudCBvZiB0aGUKK2BFWFBFQ1RfWFgoKWAgYW5kIGBBU1NFUlRfWFgoKWAgbWFjcm9zLiBUaGVyZWZvcmUgd2Ugb25seSBkbyBpdCB3aGVyZQoraXQncyBtb3N0IG5lZWRlZCAob3RoZXJ3aXNlIHdlIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIEdvb2dsZSBUZXN0CitoYXJkZXIgdG8gbWFpbnRhaW4gYW5kIG1vcmUgZXJyb3ItcHJvbmUgdGhhbiBuZWNlc3NhcnkpLgorCitUaGUgYEVYUEVDVF9FUSgpYCBtYWNybyB0YWtlcyB0aGUgX2V4cGVjdGVkXyB2YWx1ZSBhcyBpdHMgZmlyc3QKK2FyZ3VtZW50IGFuZCB0aGUgX2FjdHVhbF8gdmFsdWUgYXMgdGhlIHNlY29uZC4gSXQncyByZWFzb25hYmxlIHRoYXQKK3NvbWVvbmUgd2FudHMgdG8gd3JpdGUgYEVYUEVDVF9FUShOVUxMLCBzb21lX2V4cHJlc3Npb24pYCwgYW5kIHRoaXMKK2luZGVlZCB3YXMgcmVxdWVzdGVkIHNldmVyYWwgdGltZXMuIFRoZXJlZm9yZSB3ZSBpbXBsZW1lbnRlZCBpdC4KKworVGhlIG5lZWQgZm9yIGBFWFBFQ1RfTkUoTlVMTCwgcHRyKWAgaXNuJ3QgbmVhcmx5IGFzIHN0cm9uZy4gV2hlbiB0aGUKK2Fzc2VydGlvbiBmYWlscywgeW91IGFscmVhZHkga25vdyB0aGF0IGBwdHJgIG11c3QgYmUgYE5VTExgLCBzbyBpdAorZG9lc24ndCBhZGQgYW55IGluZm9ybWF0aW9uIHRvIHByaW50IHB0ciBpbiB0aGlzIGNhc2UuIFRoYXQgbWVhbnMKK2BFWFBFQ1RfVFJVRShwdHIgIT0gTlVMTClgIHdvcmtzIGp1c3QgYXMgd2VsbC4KKworSWYgd2Ugd2VyZSB0byBzdXBwb3J0IGBFWFBFQ1RfTkUoTlVMTCwgcHRyKWAsIGZvciBjb25zaXN0ZW5jeSB3ZSdsbAoraGF2ZSB0byBzdXBwb3J0IGBFWFBFQ1RfTkUocHRyLCBOVUxMKWAgYXMgd2VsbCwgYXMgdW5saWtlIGBFWFBFQ1RfRVFgLAord2UgZG9uJ3QgaGF2ZSBhIGNvbnZlbnRpb24gb24gdGhlIG9yZGVyIG9mIHRoZSB0d28gYXJndW1lbnRzIGZvcgorYEVYUEVDVF9ORWAuIFRoaXMgbWVhbnMgdXNpbmcgdGhlIHRlbXBsYXRlIG1ldGEgcHJvZ3JhbW1pbmcgdHJpY2tzCit0d2ljZSBpbiB0aGUgaW1wbGVtZW50YXRpb24sIG1ha2luZyBpdCBldmVuIGhhcmRlciB0byB1bmRlcnN0YW5kIGFuZAorbWFpbnRhaW4uIFdlIGJlbGlldmUgdGhlIGJlbmVmaXQgZG9lc24ndCBqdXN0aWZ5IHRoZSBjb3N0LgorCitGaW5hbGx5LCB3aXRoIHRoZSBncm93dGggb2YgR29vZ2xlIE1vY2sncyBbbWF0Y2hlcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vayNVc2luZ19NYXRjaGVyc19pbl9Hb29nbGVfVGVzdF9Bc3NlcnRpb25zKSBsaWJyYXJ5LCB3ZSBhcmUKK2VuY291cmFnaW5nIHBlb3BsZSB0byB1c2UgdGhlIHVuaWZpZWQgYEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKWAKK3N5bnRheCBtb3JlIG9mdGVuIGluIHRlc3RzLiBPbmUgc2lnbmlmaWNhbnQgYWR2YW50YWdlIG9mIHRoZSBtYXRjaGVyCithcHByb2FjaCBpcyB0aGF0IG1hdGNoZXJzIGNhbiBiZSBlYXNpbHkgY29tYmluZWQgdG8gZm9ybSBuZXcgbWF0Y2hlcnMsCit3aGlsZSB0aGUgYEVYUEVDVF9ORWAsIGV0YywgbWFjcm9zIGNhbm5vdCBiZSBlYXNpbHkKK2NvbWJpbmVkLiBUaGVyZWZvcmUgd2Ugd2FudCB0byBpbnZlc3QgbW9yZSBpbiB0aGUgbWF0Y2hlcnMgdGhhbiBpbiB0aGUKK2BFWFBFQ1RfWFgoKWAgbWFjcm9zLgorCisjIyBEb2VzIEdvb2dsZSBUZXN0IHN1cHBvcnQgcnVubmluZyB0ZXN0cyBpbiBwYXJhbGxlbD8gIyMKKworVGVzdCBydW5uZXJzIHRlbmQgdG8gYmUgdGlnaHRseSBjb3VwbGVkIHdpdGggdGhlIGJ1aWxkL3Rlc3QKK2Vudmlyb25tZW50LCBhbmQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cnkgdG8gc29sdmUgdGhlIHByb2JsZW0gb2YKK3J1bm5pbmcgdGVzdHMgaW4gcGFyYWxsZWwuICBJbnN0ZWFkLCB3ZSB0cmllZCB0byBtYWtlIEdvb2dsZSBUZXN0IHdvcmsKK25pY2VseSB3aXRoIHRlc3QgcnVubmVycy4gIEZvciBleGFtcGxlLCBHb29nbGUgVGVzdCdzIFhNTCByZXBvcnQKK2NvbnRhaW5zIHRoZSB0aW1lIHNwZW50IG9uIGVhY2ggdGVzdCwgYW5kIGl0cyBgZ3Rlc3RfbGlzdF90ZXN0c2AgYW5kCitgZ3Rlc3RfZmlsdGVyYCBmbGFncyBjYW4gYmUgdXNlZCBmb3Igc3BsaXR0aW5nIHRoZSBleGVjdXRpb24gb2YgdGVzdAorbWV0aG9kcyBpbnRvIG11bHRpcGxlIHByb2Nlc3Nlcy4gIFRoZXNlIGZ1bmN0aW9uYWxpdGllcyBjYW4gaGVscCB0aGUKK3Rlc3QgcnVubmVyIHJ1biB0aGUgdGVzdHMgaW4gcGFyYWxsZWwuCisKKyMjIFdoeSBkb24ndCBHb29nbGUgVGVzdCBydW4gdGhlIHRlc3RzIGluIGRpZmZlcmVudCB0aHJlYWRzIHRvIHNwZWVkIHRoaW5ncyB1cD8gIyMKKworSXQncyBkaWZmaWN1bHQgdG8gd3JpdGUgdGhyZWFkLXNhZmUgY29kZS4gIE1vc3QgdGVzdHMgYXJlIG5vdCB3cml0dGVuCit3aXRoIHRocmVhZC1zYWZldHkgaW4gbWluZCwgYW5kIHRodXMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSBpbiBhCittdWx0aS10aHJlYWRlZCBzZXR0aW5nLgorCitJZiB5b3UgdGhpbmsgYWJvdXQgaXQsIGl0J3MgYWxyZWFkeSBoYXJkIHRvIG1ha2UgeW91ciBjb2RlIHdvcmsgd2hlbgoreW91IGtub3cgd2hhdCBvdGhlciB0aHJlYWRzIGFyZSBkb2luZy4gIEl0J3MgbXVjaCBoYXJkZXIsIGFuZAorc29tZXRpbWVzIGV2ZW4gaW1wb3NzaWJsZSwgdG8gbWFrZSB5b3VyIGNvZGUgd29yayB3aGVuIHlvdSBkb24ndCBrbm93Cit3aGF0IG90aGVyIHRocmVhZHMgYXJlIGRvaW5nIChyZW1lbWJlciB0aGF0IHRlc3QgbWV0aG9kcyBjYW4gYmUgYWRkZWQsCitkZWxldGVkLCBvciBtb2RpZmllZCBhZnRlciB5b3VyIHRlc3Qgd2FzIHdyaXR0ZW4pLiAgSWYgeW91IHdhbnQgdG8gcnVuCit0aGUgdGVzdHMgaW4gcGFyYWxsZWwsIHlvdSdkIGJldHRlciBydW4gdGhlbSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLgorCisjIyBXaHkgYXJlbid0IEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW1wbGVtZW50ZWQgdXNpbmcgZXhjZXB0aW9ucz8gIyMKKworT3VyIG9yaWdpbmFsIG1vdGl2YXRpb24gd2FzIHRvIGJlIGFibGUgdG8gdXNlIEdvb2dsZSBUZXN0IGluIHByb2plY3RzCit0aGF0IGRpc2FibGUgZXhjZXB0aW9ucy4gIExhdGVyIHdlIHJlYWxpemVkIHNvbWUgYWRkaXRpb25hbCBiZW5lZml0cworb2YgdGhpcyBhcHByb2FjaDoKKworICAxLiBUaHJvd2luZyBpbiBhIGRlc3RydWN0b3IgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIGluIEMrKy4gIE5vdCB1c2luZyBleGNlcHRpb25zIG1lYW5zIEdvb2dsZSBUZXN0J3MgYXNzZXJ0aW9ucyBhcmUgc2FmZSB0byB1c2UgaW4gZGVzdHJ1Y3RvcnMuCisgIDEuIFRoZSBgRVhQRUNUXypgIGZhbWlseSBvZiBtYWNyb3Mgd2lsbCBjb250aW51ZSBldmVuIGFmdGVyIGEgZmFpbHVyZSwgYWxsb3dpbmcgbXVsdGlwbGUgZmFpbHVyZXMgaW4gYSBgVEVTVGAgdG8gYmUgcmVwb3J0ZWQgaW4gYSBzaW5nbGUgcnVuLiBUaGlzIGlzIGEgcG9wdWxhciBmZWF0dXJlLCBhcyBpbiBDKysgdGhlIGVkaXQtY29tcGlsZS10ZXN0IGN5Y2xlIGlzIHVzdWFsbHkgcXVpdGUgbG9uZyBhbmQgYmVpbmcgYWJsZSB0byBmaXhpbmcgbW9yZSB0aGFuIG9uZSB0aGluZyBhdCBhIHRpbWUgaXMgYSBibGVzc2luZy4KKyAgMS4gSWYgYXNzZXJ0aW9ucyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgZXhjZXB0aW9ucywgYSB0ZXN0IG1heSBmYWxzZWx5IGlnbm9yZSBhIGZhaWx1cmUgaWYgaXQncyBjYXVnaHQgYnkgdXNlciBjb2RlOgorYGBgCit0cnkgeyAuLi4gQVNTRVJUX1RSVUUoLi4uKSAuLi4gfQorY2F0Y2ggKC4uLikgeyAuLi4gfQorYGBgCitUaGUgYWJvdmUgY29kZSB3aWxsIHBhc3MgZXZlbiBpZiB0aGUgYEFTU0VSVF9UUlVFYCB0aHJvd3MuICBXaGlsZSBpdCdzIHVubGlrZWx5IGZvciBzb21lb25lIHRvIHdyaXRlIHRoaXMgaW4gYSB0ZXN0LCBpdCdzIHBvc3NpYmxlIHRvIHJ1biBpbnRvIHRoaXMgcGF0dGVybiB3aGVuIHlvdSB3cml0ZSBhc3NlcnRpb25zIGluIGNhbGxiYWNrcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGNvZGUgdW5kZXIgdGVzdC4KKworVGhlIGRvd25zaWRlIG9mIG5vdCB1c2luZyBleGNlcHRpb25zIGlzIHRoYXQgYEFTU0VSVF8qYCAoaW1wbGVtZW50ZWQKK3VzaW5nIGByZXR1cm5gKSB3aWxsIG9ubHkgYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIG5vdCB0aGUgY3VycmVudAorYFRFU1RgLgorCisjIyBXaHkgZG8gd2UgdXNlIHR3byBkaWZmZXJlbnQgbWFjcm9zIGZvciB0ZXN0cyB3aXRoIGFuZCB3aXRob3V0IGZpeHR1cmVzPyAjIworCitVbmZvcnR1bmF0ZWx5LCBDKysncyBtYWNybyBzeXN0ZW0gZG9lc24ndCBhbGxvdyB1cyB0byB1c2UgdGhlIHNhbWUKK21hY3JvIGZvciBib3RoIGNhc2VzLiAgT25lIHBvc3NpYmlsaXR5IGlzIHRvIHByb3ZpZGUgb25seSBvbmUgbWFjcm8KK2ZvciB0ZXN0cyB3aXRoIGZpeHR1cmVzLCBhbmQgcmVxdWlyZSB0aGUgdXNlciB0byBkZWZpbmUgYW4gZW1wdHkKK2ZpeHR1cmUgc29tZXRpbWVzOgorCitgYGAKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OworCitURVNUX0YoRm9vVGVzdCwgRG9lc1RoaXMpIHsgLi4uIH0KK2BgYAorb3IKK2BgYAordHlwZWRlZiA6OnRlc3Rpbmc6OlRlc3QgRm9vVGVzdDsKKworVEVTVF9GKEZvb1Rlc3QsIERvZXNUaGF0KSB7IC4uLiB9CitgYGAKKworWWV0LCBtYW55IHBlb3BsZSB0aGluayB0aGlzIGlzIG9uZSBsaW5lIHRvbyBtYW55LiA6LSkgT3VyIGdvYWwgd2FzIHRvCittYWtlIGl0IHJlYWxseSBlYXN5IHRvIHdyaXRlIHRlc3RzLCBzbyB3ZSB0cmllZCB0byBtYWtlIHNpbXBsZSB0ZXN0cwordHJpdmlhbCB0byBjcmVhdGUuICBUaGF0IG1lYW5zIHVzaW5nIGEgc2VwYXJhdGUgbWFjcm8gZm9yIHN1Y2ggdGVzdHMuCisKK1dlIHRoaW5rIG5laXRoZXIgYXBwcm9hY2ggaXMgaWRlYWwsIHlldCBlaXRoZXIgb2YgdGhlbSBpcyByZWFzb25hYmxlLgorSW4gdGhlIGVuZCwgaXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgbXVjaCBlaXRoZXIgd2F5LgorCisjIyBXaHkgZG9uJ3Qgd2UgdXNlIHN0cnVjdHMgYXMgdGVzdCBmaXh0dXJlcz8gIyMKKworV2UgbGlrZSB0byB1c2Ugc3RydWN0cyBvbmx5IHdoZW4gcmVwcmVzZW50aW5nIHBhc3NpdmUgZGF0YS4gIFRoaXMKK2Rpc3RpbmN0aW9uIGJldHdlZW4gc3RydWN0cyBhbmQgY2xhc3NlcyBpcyBnb29kIGZvciBkb2N1bWVudGluZyB0aGUKK2ludGVudCBvZiB0aGUgY29kZSdzIGF1dGhvci4gIFNpbmNlIHRlc3QgZml4dHVyZXMgaGF2ZSBsb2dpYyBsaWtlCitgU2V0VXAoKWAgYW5kIGBUZWFyRG93bigpYCwgdGhleSBhcmUgYmV0dGVyIGRlZmluZWQgYXMgY2xhc3Nlcy4KKworIyMgV2h5IGFyZSBkZWF0aCB0ZXN0cyBpbXBsZW1lbnRlZCBhcyBhc3NlcnRpb25zIGluc3RlYWQgb2YgdXNpbmcgYSB0ZXN0IHJ1bm5lcj8gIyMKKworT3VyIGdvYWwgd2FzIHRvIG1ha2UgZGVhdGggdGVzdHMgYXMgY29udmVuaWVudCBmb3IgYSB1c2VyIGFzIEMrKworcG9zc2libHkgYWxsb3dzLiAgSW4gcGFydGljdWxhcjoKKworICAqIFRoZSBydW5uZXItc3R5bGUgcmVxdWlyZXMgdG8gc3BsaXQgdGhlIGluZm9ybWF0aW9uIGludG8gdHdvIHBpZWNlczogdGhlIGRlZmluaXRpb24gb2YgdGhlIGRlYXRoIHRlc3QgaXRzZWxmLCBhbmQgdGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBydW5uZXIgb24gaG93IHRvIHJ1biB0aGUgZGVhdGggdGVzdCBhbmQgd2hhdCB0byBleHBlY3QuICBUaGUgZGVhdGggdGVzdCB3b3VsZCBiZSB3cml0dGVuIGluIEMrKywgd2hpbGUgdGhlIHJ1bm5lciBzcGVjIG1heSBvciBtYXkgbm90IGJlLiAgQSB1c2VyIG5lZWRzIHRvIGNhcmVmdWxseSBrZWVwIHRoZSB0d28gaW4gc3luYy4gYEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIGV4cGVjdGVkX21lc3NhZ2UpYCBzcGVjaWZpZXMgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBvbmUgcGxhY2UsIGluIG9uZSBsYW5ndWFnZSwgd2l0aG91dCBib2lsZXJwbGF0ZSBjb2RlLiBJdCBpcyB2ZXJ5IGRlY2xhcmF0aXZlLgorICAqIGBBU1NFUlRfREVBVEhgIGhhcyBhIHNpbWlsYXIgc3ludGF4IGFuZCBlcnJvci1yZXBvcnRpbmcgc2VtYW50aWNzIGFzIG90aGVyIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMsIGFuZCB0aHVzIGlzIGVhc3kgdG8gbGVhcm4uCisgICogYEFTU0VSVF9ERUFUSGAgY2FuIGJlIG1peGVkIHdpdGggb3RoZXIgYXNzZXJ0aW9ucyBhbmQgb3RoZXIgbG9naWMgYXQgeW91ciB3aWxsLiAgWW91IGFyZSBub3QgbGltaXRlZCB0byBvbmUgZGVhdGggdGVzdCBwZXIgdGVzdCBtZXRob2QuIEZvciBleGFtcGxlLCB5b3UgY2FuIHdyaXRlIHNvbWV0aGluZyBsaWtlOgorYGBgCisgICAgaWYgKEZvb0NvbmRpdGlvbigpKSB7CisgICAgICBBU1NFUlRfREVBVEgoQmFyKCksICJibGFoIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9FUSg1LCBCYXIoKSk7CisgICAgfQorYGBgCitJZiB5b3UgcHJlZmVyIG9uZSBkZWF0aCB0ZXN0IHBlciB0ZXN0IG1ldGhvZCwgeW91IGNhbiB3cml0ZSB5b3VyIHRlc3RzIGluIHRoYXQgc3R5bGUgdG9vLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBpbXBvc2UgdGhhdCBvbiB0aGUgdXNlcnMuICBUaGUgZmV3ZXIgYXJ0aWZpY2lhbCBsaW1pdGF0aW9ucyB0aGUgYmV0dGVyLgorICAqIGBBU1NFUlRfREVBVEhgIGNhbiByZWZlcmVuY2UgbG9jYWwgdmFyaWFibGVzIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCBhbmQgeW91IGNhbiBkZWNpZGUgaG93IG1hbnkgZGVhdGggdGVzdHMgeW91IHdhbnQgYmFzZWQgb24gcnVuLXRpbWUgaW5mb3JtYXRpb24uICBGb3IgZXhhbXBsZSwKK2BgYAorICAgIGNvbnN0IGludCBjb3VudCA9IEdldENvdW50KCk7ICAvLyBPbmx5IGtub3duIGF0IHJ1biB0aW1lLgorICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgIEFTU0VSVF9ERUFUSCh7CisgICAgICAgIGRvdWJsZSogYnVmZmVyID0gbmV3IGRvdWJsZVtpXTsKKyAgICAgICAgLi4uIGluaXRpYWxpemVzIGJ1ZmZlciAuLi4KKyAgICAgICAgRm9vKGJ1ZmZlciwgaSkKKyAgICAgIH0sICJibGFoIGJsYWgiKTsKKyAgICB9CitgYGAKK1RoZSBydW5uZXItYmFzZWQgYXBwcm9hY2ggdGVuZHMgdG8gYmUgbW9yZSBzdGF0aWMgYW5kIGxlc3MgZmxleGlibGUsIG9yIHJlcXVpcmVzIG1vcmUgdXNlciBlZmZvcnQgdG8gZ2V0IHRoaXMga2luZCBvZiBmbGV4aWJpbGl0eS4KKworQW5vdGhlciBpbnRlcmVzdGluZyB0aGluZyBhYm91dCBgQVNTRVJUX0RFQVRIYCBpcyB0aGF0IGl0IGNhbGxzIGBmb3JrKClgCit0byBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzIHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoaXMgaXMgbGlnaHRlbmluZworZmFzdCwgYXMgYGZvcmsoKWAgdXNlcyBjb3B5LW9uLXdyaXRlIHBhZ2VzIGFuZCBpbmN1cnMgYWxtb3N0IHplcm8KK292ZXJoZWFkLCBhbmQgdGhlIGNoaWxkIHByb2Nlc3Mgc3RhcnRzIGZyb20gdGhlIHVzZXItc3VwcGxpZWQKK3N0YXRlbWVudCBkaXJlY3RseSwgc2tpcHBpbmcgYWxsIGdsb2JhbCBhbmQgbG9jYWwgaW5pdGlhbGl6YXRpb24gYW5kCithbnkgY29kZSBsZWFkaW5nIHRvIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJZiB5b3UgbGF1bmNoIHRoZSBjaGlsZAorcHJvY2VzcyBmcm9tIHNjcmF0Y2gsIGl0IGNhbiB0YWtlIHNlY29uZHMganVzdCB0byBsb2FkIGV2ZXJ5dGhpbmcgYW5kCitzdGFydCBydW5uaW5nIGlmIHRoZSB0ZXN0IGxpbmtzIHRvIG1hbnkgbGlicmFyaWVzIGR5bmFtaWNhbGx5LgorCisjIyBNeSBkZWF0aCB0ZXN0IG1vZGlmaWVzIHNvbWUgc3RhdGUsIGJ1dCB0aGUgY2hhbmdlIHNlZW1zIGxvc3QgYWZ0ZXIgdGhlIGRlYXRoIHRlc3QgZmluaXNoZXMuIFdoeT8gIyMKKworRGVhdGggdGVzdHMgKGBFWFBFQ1RfREVBVEhgLCBldGMpIGFyZSBleGVjdXRlZCBpbiBhIHN1Yi1wcm9jZXNzIHMudC4gdGhlCitleHBlY3RlZCBjcmFzaCB3b24ndCBraWxsIHRoZSB0ZXN0IHByb2dyYW0gKGkuZS4gdGhlIHBhcmVudCBwcm9jZXNzKS4gQXMgYQorcmVzdWx0LCBhbnkgaW4tbWVtb3J5IHNpZGUgZWZmZWN0cyB0aGV5IGluY3VyIGFyZSBvYnNlcnZhYmxlIGluIHRoZWlyCityZXNwZWN0aXZlIHN1Yi1wcm9jZXNzZXMsIGJ1dCBub3QgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiBZb3UgY2FuIHRoaW5rIG9mIHRoZW0KK2FzIHJ1bm5pbmcgaW4gYSBwYXJhbGxlbCB1bml2ZXJzZSwgbW9yZSBvciBsZXNzLgorCisjIyBUaGUgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0ICJ1bmRlZmluZWQgcmVmZXJlbmNlcyIgdG8gc29tZSBzdGF0aWMgY29uc3QgbWVtYmVyIHZhcmlhYmxlcywgYnV0IEkgZGlkIGRlZmluZSB0aGVtIGluIHRoZSBjbGFzcyBib2R5LiBXaGF0J3Mgd3Jvbmc/ICMjCisKK0lmIHlvdXIgY2xhc3MgaGFzIGEgc3RhdGljIGRhdGEgbWVtYmVyOgorCitgYGAKKy8vIGZvby5oCitjbGFzcyBGb28geworICAuLi4KKyAgc3RhdGljIGNvbnN0IGludCBrQmFyID0gMTAwOworfTsKK2BgYAorCitZb3UgYWxzbyBuZWVkIHRvIGRlZmluZSBpdCBfb3V0c2lkZV8gb2YgdGhlIGNsYXNzIGJvZHkgaW4gYGZvby5jY2A6CisKK2BgYAorY29uc3QgaW50IEZvbzo6a0JhcjsgIC8vIE5vIGluaXRpYWxpemVyIGhlcmUuCitgYGAKKworT3RoZXJ3aXNlIHlvdXIgY29kZSBpcyAqKmludmFsaWQgQysrKiosIGFuZCBtYXkgYnJlYWsgaW4gdW5leHBlY3RlZCB3YXlzLiBJbgorcGFydGljdWxhciwgdXNpbmcgaXQgaW4gR29vZ2xlIFRlc3QgY29tcGFyaXNvbiBhc3NlcnRpb25zIChgRVhQRUNUX0VRYCwgZXRjKQord2lsbCBnZW5lcmF0ZSBhbiAidW5kZWZpbmVkIHJlZmVyZW5jZSIgbGlua2VyIGVycm9yLgorCisjIyBJIGhhdmUgYW4gaW50ZXJmYWNlIHRoYXQgaGFzIHNldmVyYWwgaW1wbGVtZW50YXRpb25zLiBDYW4gSSB3cml0ZSBhIHNldCBvZiB0ZXN0cyBvbmNlIGFuZCByZXBlYXQgdGhlbSBvdmVyIGFsbCB0aGUgaW1wbGVtZW50YXRpb25zPyAjIworCitHb29nbGUgVGVzdCBkb2Vzbid0IHlldCBoYXZlIGdvb2Qgc3VwcG9ydCBmb3IgdGhpcyBraW5kIG9mIHRlc3RzLCBvcgorZGF0YS1kcml2ZW4gdGVzdHMgaW4gZ2VuZXJhbC4gV2UgaG9wZSB0byBiZSBhYmxlIHRvIG1ha2UgaW1wcm92ZW1lbnRzIGluIHRoaXMKK2FyZWEgc29vbi4KKworIyMgQ2FuIEkgZGVyaXZlIGEgdGVzdCBmaXh0dXJlIGZyb20gYW5vdGhlcj8gIyMKKworWWVzLgorCitFYWNoIHRlc3QgZml4dHVyZSBoYXMgYSBjb3JyZXNwb25kaW5nIGFuZCBzYW1lIG5hbWVkIHRlc3QgY2FzZS4gVGhpcyBtZWFucyBvbmx5CitvbmUgdGVzdCBjYXNlIGNhbiB1c2UgYSBwYXJ0aWN1bGFyIGZpeHR1cmUuIFNvbWV0aW1lcywgaG93ZXZlciwgbXVsdGlwbGUgdGVzdAorY2FzZXMgbWF5IHdhbnQgdG8gdXNlIHRoZSBzYW1lIG9yIHNsaWdodGx5IGRpZmZlcmVudCBmaXh0dXJlcy4gRm9yIGV4YW1wbGUsIHlvdQorbWF5IHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG9mIGEgR1VJIGxpYnJhcnkncyB0ZXN0IGNhc2VzIGRvbid0IGxlYWsKK2ltcG9ydGFudCBzeXN0ZW0gcmVzb3VyY2VzIGxpa2UgZm9udHMgYW5kIGJydXNoZXMuCisKK0luIEdvb2dsZSBUZXN0LCB5b3Ugc2hhcmUgYSBmaXh0dXJlIGFtb25nIHRlc3QgY2FzZXMgYnkgcHV0dGluZyB0aGUgc2hhcmVkCitsb2dpYyBpbiBhIGJhc2UgdGVzdCBmaXh0dXJlLCB0aGVuIGRlcml2aW5nIGZyb20gdGhhdCBiYXNlIGEgc2VwYXJhdGUgZml4dHVyZQorZm9yIGVhY2ggdGVzdCBjYXNlIHRoYXQgd2FudHMgdG8gdXNlIHRoaXMgY29tbW9uIGxvZ2ljLiBZb3UgdGhlbiB1c2UgYFRFU1RfRigpYAordG8gd3JpdGUgdGVzdHMgdXNpbmcgZWFjaCBkZXJpdmVkIGZpeHR1cmUuCisKK1R5cGljYWxseSwgeW91ciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKworYGBgCisvLyBEZWZpbmVzIGEgYmFzZSB0ZXN0IGZpeHR1cmUuCitjbGFzcyBCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAuLi4KK307CisKKy8vIERlcml2ZXMgYSBmaXh0dXJlIEZvb1Rlc3QgZnJvbSBCYXNlVGVzdC4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgQmFzZVRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgICAgQmFzZVRlc3Q6OlNldFVwKCk7ICAvLyBTZXRzIHVwIHRoZSBiYXNlIGZpeHR1cmUgZmlyc3QuCisgICAgICAuLi4gYWRkaXRpb25hbCBzZXQtdXAgd29yayAuLi4KKyAgICB9CisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgICAgLi4uIGNsZWFuLXVwIHdvcmsgZm9yIEZvb1Rlc3QgLi4uCisgICAgICBCYXNlVGVzdDo6VGVhckRvd24oKTsgIC8vIFJlbWVtYmVyIHRvIHRlYXIgZG93biB0aGUgYmFzZSBmaXh0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIGNsZWFuaW5nIHVwIEZvb1Rlc3QhCisgICAgfQorICAgIC4uLiBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBmb3IgRm9vVGVzdCAuLi4KK307CisKKy8vIFRlc3RzIHRoYXQgdXNlIHRoZSBmaXh0dXJlIEZvb1Rlc3QuCitURVNUX0YoRm9vVGVzdCwgQmFyKSB7IC4uLiB9CitURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9CisKKy4uLiBhZGRpdGlvbmFsIGZpeHR1cmVzIGRlcml2ZWQgZnJvbSBCYXNlVGVzdCAuLi4KK2BgYAorCitJZiBuZWNlc3NhcnksIHlvdSBjYW4gY29udGludWUgdG8gZGVyaXZlIHRlc3QgZml4dHVyZXMgZnJvbSBhIGRlcml2ZWQgZml4dHVyZS4KK0dvb2dsZSBUZXN0IGhhcyBubyBsaW1pdCBvbiBob3cgZGVlcCB0aGUgaGllcmFyY2h5IGNhbiBiZS4KKworRm9yIGEgY29tcGxldGUgZXhhbXBsZSB1c2luZyBkZXJpdmVkIHRlc3QgZml4dHVyZXMsIHNlZQorW3NhbXBsZTVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3NvdXJjZS9icm93c2UvdHJ1bmsvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjKS4KKworIyMgTXkgY29tcGlsZXIgY29tcGxhaW5zICJ2b2lkIHZhbHVlIG5vdCBpZ25vcmVkIGFzIGl0IG91Z2h0IHRvIGJlLiIgV2hhdCBkb2VzIHRoaXMgbWVhbj8gIyMKKworWW91J3JlIHByb2JhYmx5IHVzaW5nIGFuIGBBU1NFUlRfKigpYCBpbiBhIGZ1bmN0aW9uIHRoYXQgZG9lc24ndCByZXR1cm4gYHZvaWRgLgorYEFTU0VSVF8qKClgIGNhbiBvbmx5IGJlIHVzZWQgaW4gYHZvaWRgIGZ1bmN0aW9ucy4KKworIyMgTXkgZGVhdGggdGVzdCBoYW5ncyAob3Igc2VnLWZhdWx0cykuIEhvdyBkbyBJIGZpeCBpdD8gIyMKKworSW4gR29vZ2xlIFRlc3QsIGRlYXRoIHRlc3RzIGFyZSBydW4gaW4gYSBjaGlsZCBwcm9jZXNzIGFuZCB0aGUgd2F5IHRoZXkgd29yayBpcworZGVsaWNhdGUuIFRvIHdyaXRlIGRlYXRoIHRlc3RzIHlvdSByZWFsbHkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGV5IHdvcmsuCitQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIHJlYWQgdGhpcy4KKworSW4gcGFydGljdWxhciwgZGVhdGggdGVzdHMgZG9uJ3QgbGlrZSBoYXZpbmcgbXVsdGlwbGUgdGhyZWFkcyBpbiB0aGUgcGFyZW50Citwcm9jZXNzLiBTbyB0aGUgZmlyc3QgdGhpbmcgeW91IGNhbiB0cnkgaXMgdG8gZWxpbWluYXRlIGNyZWF0aW5nIHRocmVhZHMKK291dHNpZGUgb2YgYEVYUEVDVF9ERUFUSCgpYC4KKworU29tZXRpbWVzIHRoaXMgaXMgaW1wb3NzaWJsZSBhcyBzb21lIGxpYnJhcnkgeW91IG11c3QgdXNlIG1heSBiZSBjcmVhdGluZwordGhyZWFkcyBiZWZvcmUgYG1haW4oKWAgaXMgZXZlbiByZWFjaGVkLiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gdHJ5IHRvIG1pbmltaXplCit0aGUgY2hhbmNlIG9mIGNvbmZsaWN0cyBieSBlaXRoZXIgbW92aW5nIGFzIG1hbnkgYWN0aXZpdGllcyBhcyBwb3NzaWJsZSBpbnNpZGUKK2BFWFBFQ1RfREVBVEgoKWAgKGluIHRoZSBleHRyZW1lIGNhc2UsIHlvdSB3YW50IHRvIG1vdmUgZXZlcnl0aGluZyBpbnNpZGUpLCBvcgorbGVhdmluZyBhcyBmZXcgdGhpbmdzIGFzIHBvc3NpYmxlIGluIGl0LiBBbHNvLCB5b3UgY2FuIHRyeSB0byBzZXQgdGhlIGRlYXRoCit0ZXN0IHN0eWxlIHRvIGAidGhyZWFkc2FmZSJgLCB3aGljaCBpcyBzYWZlciBidXQgc2xvd2VyLCBhbmQgc2VlIGlmIGl0IGhlbHBzLgorCitJZiB5b3UgZ28gd2l0aCB0aHJlYWQtc2FmZSBkZWF0aCB0ZXN0cywgcmVtZW1iZXIgdGhhdCB0aGV5IHJlcnVuIHRoZSB0ZXN0Citwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZyBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gVGhlcmVmb3JlIG1ha2Ugc3VyZSB5b3VyCitwcm9ncmFtIGNhbiBydW4gc2lkZS1ieS1zaWRlIHdpdGggaXRzZWxmIGFuZCBpcyBkZXRlcm1pbmlzdGljLgorCitJbiB0aGUgZW5kLCB0aGlzIGJvaWxzIGRvd24gdG8gZ29vZCBjb25jdXJyZW50IHByb2dyYW1taW5nLiBZb3UgaGF2ZSB0byBtYWtlCitzdXJlIHRoYXQgdGhlcmUgaXMgbm8gcmFjZSBjb25kaXRpb25zIG9yIGRlYWQgbG9ja3MgaW4geW91ciBwcm9ncmFtLiBObyBzaWx2ZXIKK2J1bGxldCAtIHNvcnJ5IQorCisjIyBTaG91bGQgSSB1c2UgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igb2YgdGhlIHRlc3QgZml4dHVyZSBvciB0aGUgc2V0LXVwL3RlYXItZG93biBmdW5jdGlvbj8gIyMKKworVGhlIGZpcnN0IHRoaW5nIHRvIHJlbWVtYmVyIGlzIHRoYXQgR29vZ2xlIFRlc3QgZG9lcyBub3QgcmV1c2UgdGhlCitzYW1lIHRlc3QgZml4dHVyZSBvYmplY3QgYWNyb3NzIG11bHRpcGxlIHRlc3RzLiBGb3IgZWFjaCBgVEVTVF9GYCwKK0dvb2dsZSBUZXN0IHdpbGwgY3JlYXRlIGEgZnJlc2ggdGVzdCBmaXh0dXJlIG9iamVjdCwgX2ltbWVkaWF0ZWx5XworY2FsbCBgU2V0VXAoKWAsIHJ1biB0aGUgdGVzdCwgY2FsbCBgVGVhckRvd24oKWAsIGFuZCB0aGVuCitfaW1tZWRpYXRlbHlfIGRlbGV0ZSB0aGUgdGVzdCBmaXh0dXJlIG9iamVjdC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubworbmVlZCB0byB3cml0ZSBhIGBTZXRVcCgpYCBvciBgVGVhckRvd24oKWAgZnVuY3Rpb24gaWYgdGhlIGNvbnN0cnVjdG9yCitvciBkZXN0cnVjdG9yIGFscmVhZHkgZG9lcyB0aGUgam9iLgorCitZb3UgbWF5IHN0aWxsIHdhbnQgdG8gdXNlIGBTZXRVcCgpL1RlYXJEb3duKClgIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisgICogSWYgdGhlIHRlYXItZG93biBvcGVyYXRpb24gY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uLCB5b3UgbXVzdCB1c2UgYFRlYXJEb3duKClgIGFzIG9wcG9zZWQgdG8gdGhlIGRlc3RydWN0b3IsIGFzIHRocm93aW5nIGluIGEgZGVzdHJ1Y3RvciBsZWFkcyB0byB1bmRlZmluZWQgYmVoYXZpb3IgYW5kIHVzdWFsbHkgd2lsbCBraWxsIHlvdXIgcHJvZ3JhbSByaWdodCBhd2F5LiBOb3RlIHRoYXQgbWFueSBzdGFuZGFyZCBsaWJyYXJpZXMgKGxpa2UgU1RMKSBtYXkgdGhyb3cgd2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkIGluIHRoZSBjb21waWxlci4gVGhlcmVmb3JlIHlvdSBzaG91bGQgcHJlZmVyIGBUZWFyRG93bigpYCBpZiB5b3Ugd2FudCB0byB3cml0ZSBwb3J0YWJsZSB0ZXN0cyB0aGF0IHdvcmsgd2l0aCBvciB3aXRob3V0IGV4Y2VwdGlvbnMuCisgICogVGhlIGFzc2VydGlvbiBtYWNyb3MgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gZmxhZyBgLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlYCBpcyBzcGVjaWZpZWQuIFRoZXJlZm9yZSwgeW91IHNob3VsZG4ndCB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBpbiBhIGRlc3RydWN0b3IgaWYgeW91IHBsYW4gdG8gcnVuIHlvdXIgdGVzdHMgd2l0aCB0aGlzIGZsYWcuCisgICogSW4gYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLCB5b3UgY2Fubm90IG1ha2UgYSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwgb24gdGhpcyBvYmplY3QuIChZb3UgY2FuIGNhbGwgYSBtZXRob2QgZGVjbGFyZWQgYXMgdmlydHVhbCwgYnV0IGl0IHdpbGwgYmUgc3RhdGljYWxseSBib3VuZC4pIFRoZXJlZm9yZSwgaWYgeW91IG5lZWQgdG8gY2FsbCBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgb3ZlcnJpZGVuIGluIGEgZGVyaXZlZCBjbGFzcywgeW91IGhhdmUgdG8gdXNlIGBTZXRVcCgpL1RlYXJEb3duKClgLgorCisjIyBUaGUgY29tcGlsZXIgY29tcGxhaW5zICJubyBtYXRjaGluZyBmdW5jdGlvbiB0byBjYWxsIiB3aGVuIEkgdXNlIEFTU0VSVFxfUFJFRG4uIEhvdyBkbyBJIGZpeCBpdD8gIyMKKworSWYgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB5b3UgdXNlIGluIGBBU1NFUlRfUFJFRCpgIG9yIGBFWFBFQ1RfUFJFRCpgIGlzCitvdmVybG9hZGVkIG9yIGEgdGVtcGxhdGUsIHRoZSBjb21waWxlciB3aWxsIGhhdmUgdHJvdWJsZSBmaWd1cmluZyBvdXQgd2hpY2gKK292ZXJsb2FkZWQgdmVyc2lvbiBpdCBzaG91bGQgdXNlLiBgQVNTRVJUX1BSRURfRk9STUFUKmAgYW5kCitgRVhQRUNUX1BSRURfRk9STUFUKmAgZG9uJ3QgaGF2ZSB0aGlzIHByb2JsZW0uCisKK0lmIHlvdSBzZWUgdGhpcyBlcnJvciwgeW91IG1pZ2h0IHdhbnQgdG8gc3dpdGNoIHRvCitgKEFTU0VSVHxFWFBFQ1QpX1BSRURfRk9STUFUKmAsIHdoaWNoIHdpbGwgYWxzbyBnaXZlIHlvdSBhIGJldHRlciBmYWlsdXJlCittZXNzYWdlLiBJZiwgaG93ZXZlciwgdGhhdCBpcyBub3QgYW4gb3B0aW9uLCB5b3UgY2FuIHJlc29sdmUgdGhlIHByb2JsZW0gYnkKK2V4cGxpY2l0bHkgdGVsbGluZyB0aGUgY29tcGlsZXIgd2hpY2ggdmVyc2lvbiB0byBwaWNrLgorCitGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZQorCitgYGAKK2Jvb2wgSXNQb3NpdGl2ZShpbnQgbikgeworICByZXR1cm4gbiA+IDA7Cit9Citib29sIElzUG9zaXRpdmUoZG91YmxlIHgpIHsKKyAgcmV0dXJuIHggPiAwOworfQorYGBgCisKK3lvdSB3aWxsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmIHlvdSB3cml0ZQorCitgYGAKK0VYUEVDVF9QUkVEMShJc1Bvc2l0aXZlLCA1KTsKK2BgYAorCitIb3dldmVyLCB0aGlzIHdpbGwgd29yazoKKworYGBgCitFWFBFQ1RfUFJFRDEoKnN0YXRpY19jYXN0PGJvb2wgKCopKGludCk+KihJc1Bvc2l0aXZlKSwgNSk7CitgYGAKKworKFRoZSBzdHVmZiBpbnNpZGUgdGhlIGFuZ2xlZCBicmFja2V0cyBmb3IgdGhlIGBzdGF0aWNfY2FzdGAgb3BlcmF0b3IgaXMgdGhlCit0eXBlIG9mIHRoZSBmdW5jdGlvbiBwb2ludGVyIGZvciB0aGUgYGludGAtdmVyc2lvbiBvZiBgSXNQb3NpdGl2ZSgpYC4pCisKK0FzIGFub3RoZXIgZXhhbXBsZSwgd2hlbiB5b3UgaGF2ZSBhIHRlbXBsYXRlIGZ1bmN0aW9uCisKK2BgYAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIElzTmVnYXRpdmUoVCB4KSB7CisgIHJldHVybiB4IDwgMDsKK30KK2BgYAorCit5b3UgY2FuIHVzZSBpdCBpbiBhIHByZWRpY2F0ZSBhc3NlcnRpb24gbGlrZSB0aGlzOgorCitgYGAKK0FTU0VSVF9QUkVEMShJc05lZ2F0aXZlKjxpbnQ+KiwgLTUpOworYGBgCisKK1RoaW5ncyBhcmUgbW9yZSBpbnRlcmVzdGluZyBpZiB5b3VyIHRlbXBsYXRlIGhhcyBtb3JlIHRoYW4gb25lIHBhcmFtZXRlcnMuIFRoZQorZm9sbG93aW5nIHdvbid0IGNvbXBpbGU6CisKK2BgYAorQVNTRVJUX1BSRUQyKCpHcmVhdGVyVGhhbjxpbnQsIGludD4qLCA1LCAwKTsKK2BgYAorCisKK2FzIHRoZSBDKysgcHJlLXByb2Nlc3NvciB0aGlua3MgeW91IGFyZSBnaXZpbmcgYEFTU0VSVF9QUkVEMmAgNCBhcmd1bWVudHMsCit3aGljaCBpcyBvbmUgbW9yZSB0aGFuIGV4cGVjdGVkLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB3cmFwIHRoZSBwcmVkaWNhdGUKK2Z1bmN0aW9uIGluIHBhcmVudGhlc2VzOgorCitgYGAKK0FTU0VSVF9QUkVEMigqKEdyZWF0ZXJUaGFuPGludCwgaW50PikqLCA1LCAwKTsKK2BgYAorCisKKyMjIE15IGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCAiaWdub3JpbmcgcmV0dXJuIHZhbHVlIiB3aGVuIEkgY2FsbCBSVU5cX0FMTFxfVEVTVFMoKS4gV2h5PyAjIworCitTb21lIHBlb3BsZSBoYWQgYmVlbiBpZ25vcmluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBSVU5fQUxMX1RFU1RTKClgLiBUaGF0IGlzLAoraW5zdGVhZCBvZgorCitgYGAKK3JldHVybiBSVU5fQUxMX1RFU1RTKCk7CitgYGAKKwordGhleSB3cml0ZQorCitgYGAKK1JVTl9BTExfVEVTVFMoKTsKK2BgYAorCitUaGlzIGlzIHdyb25nIGFuZCBkYW5nZXJvdXMuIEEgdGVzdCBydW5uZXIgbmVlZHMgdG8gc2VlIHRoZSByZXR1cm4gdmFsdWUgb2YKK2BSVU5fQUxMX1RFU1RTKClgIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiBhIHRlc3QgaGFzIHBhc3NlZC4gSWYgeW91ciBgbWFpbigpYAorZnVuY3Rpb24gaWdub3JlcyBpdCwgeW91ciB0ZXN0IHdpbGwgYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsIGV2ZW4gaWYgaXQgaGFzIGEKK0dvb2dsZSBUZXN0IGFzc2VydGlvbiBmYWlsdXJlLiBWZXJ5IGJhZC4KKworVG8gaGVscCB0aGUgdXNlcnMgYXZvaWQgdGhpcyBkYW5nZXJvdXMgYnVnLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKK2BSVU5fQUxMX1RFU1RTKClgIGNhdXNlcyBnY2MgdG8gcmFpc2UgdGhpcyB3YXJuaW5nLCB3aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMKK2lnbm9yZWQuIElmIHlvdSBzZWUgdGhpcyB3YXJuaW5nLCB0aGUgZml4IGlzIHNpbXBsZToganVzdCBtYWtlIHN1cmUgaXRzIHZhbHVlCitpcyB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUgb2YgYG1haW4oKWAuCisKKyMjIE15IGNvbXBpbGVyIGNvbXBsYWlucyB0aGF0IGEgY29uc3RydWN0b3IgKG9yIGRlc3RydWN0b3IpIGNhbm5vdCByZXR1cm4gYSB2YWx1ZS4gV2hhdCdzIGdvaW5nIG9uPyAjIworCitEdWUgdG8gYSBwZWN1bGlhcml0eSBvZiBDKyssIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHN5bnRheCBmb3Igc3RyZWFtaW5nCittZXNzYWdlcyB0byBhbiBgQVNTRVJUXypgLCBlLmcuCisKK2BgYAorQVNTRVJUX0VRKDEsIEZvbygpKSA8PCAiYmxhaCBibGFoIiA8PCBmb287CitgYGAKKword2UgaGFkIHRvIGdpdmUgdXAgdXNpbmcgYEFTU0VSVCpgIGFuZCBgRkFJTCpgIChidXQgbm90IGBFWFBFQ1QqYCBhbmQKK2BBRERfRkFJTFVSRSpgKSBpbiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBUaGUgd29ya2Fyb3VuZCBpcyB0byBtb3ZlIHRoZQorY29udGVudCBvZiB5b3VyIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdG8gYSBwcml2YXRlIHZvaWQgbWVtYmVyIGZ1bmN0aW9uLCBvcgorc3dpdGNoIHRvIGBFWFBFQ1RfKigpYCBpZiB0aGF0IHdvcmtzLiBUaGlzIHNlY3Rpb24gaW4gdGhlIHVzZXIncyBndWlkZSBleHBsYWlucworaXQuCisKKyMjIE15IHNldC11cCBmdW5jdGlvbiBpcyBub3QgY2FsbGVkLiBXaHk/ICMjCisKK0MrKyBpcyBjYXNlLXNlbnNpdGl2ZS4gSXQgc2hvdWxkIGJlIHNwZWxsZWQgYXMgYFNldFVwKClgLiAgRGlkIHlvdQorc3BlbGwgaXQgYXMgYFNldHVwKClgPworCitTaW1pbGFybHksIHNvbWV0aW1lcyBwZW9wbGUgc3BlbGwgYFNldFVwVGVzdENhc2UoKWAgYXMgYFNldHVwVGVzdENhc2UoKWAgYW5kCit3b25kZXIgd2h5IGl0J3MgbmV2ZXIgY2FsbGVkLgorCisjIyBIb3cgZG8gSSBqdW1wIHRvIHRoZSBsaW5lIG9mIGEgZmFpbHVyZSBpbiBFbWFjcyBkaXJlY3RseT8gIyMKKworR29vZ2xlIFRlc3QncyBmYWlsdXJlIG1lc3NhZ2UgZm9ybWF0IGlzIHVuZGVyc3Rvb2QgYnkgRW1hY3MgYW5kIG1hbnkgb3RoZXIKK0lERXMsIGxpa2UgYWNtZSBhbmQgWENvZGUuIElmIGEgR29vZ2xlIFRlc3QgbWVzc2FnZSBpcyBpbiBhIGNvbXBpbGF0aW9uIGJ1ZmZlcgoraW4gRW1hY3MsIHRoZW4gaXQncyBjbGlja2FibGUuIFlvdSBjYW4gbm93IGhpdCBgZW50ZXJgIG9uIGEgbWVzc2FnZSB0byBqdW1wIHRvCit0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgb3IgdXNlIGBDLXggYGAgdG8ganVtcCB0byB0aGUgbmV4dCBmYWlsdXJlLgorCisjIyBJIGhhdmUgc2V2ZXJhbCB0ZXN0IGNhc2VzIHdoaWNoIHNoYXJlIHRoZSBzYW1lIHRlc3QgZml4dHVyZSBsb2dpYywgZG8gSSBoYXZlIHRvIGRlZmluZSBhIG5ldyB0ZXN0IGZpeHR1cmUgY2xhc3MgZm9yIGVhY2ggb2YgdGhlbT8gVGhpcyBzZWVtcyBwcmV0dHkgdGVkaW91cy4gIyMKKworWW91IGRvbid0IGhhdmUgdG8uIEluc3RlYWQgb2YKKworYGBgCitjbGFzcyBGb29UZXN0IDogcHVibGljIEJhc2VUZXN0IHt9OworCitURVNUX0YoRm9vVGVzdCwgQWJjKSB7IC4uLiB9CitURVNUX0YoRm9vVGVzdCwgRGVmKSB7IC4uLiB9CisKK2NsYXNzIEJhclRlc3QgOiBwdWJsaWMgQmFzZVRlc3Qge307CisKK1RFU1RfRihCYXJUZXN0LCBBYmMpIHsgLi4uIH0KK1RFU1RfRihCYXJUZXN0LCBEZWYpIHsgLi4uIH0KK2BgYAorCit5b3UgY2FuIHNpbXBseSBgdHlwZWRlZmAgdGhlIHRlc3QgZml4dHVyZXM6CitgYGAKK3R5cGVkZWYgQmFzZVRlc3QgRm9vVGVzdDsKKworVEVTVF9GKEZvb1Rlc3QsIEFiYykgeyAuLi4gfQorVEVTVF9GKEZvb1Rlc3QsIERlZikgeyAuLi4gfQorCit0eXBlZGVmIEJhc2VUZXN0IEJhclRlc3Q7CisKK1RFU1RfRihCYXJUZXN0LCBBYmMpIHsgLi4uIH0KK1RFU1RfRihCYXJUZXN0LCBEZWYpIHsgLi4uIH0KK2BgYAorCisjIyBUaGUgR29vZ2xlIFRlc3Qgb3V0cHV0IGlzIGJ1cmllZCBpbiBhIHdob2xlIGJ1bmNoIG9mIGxvZyBtZXNzYWdlcy4gV2hhdCBkbyBJIGRvPyAjIworCitUaGUgR29vZ2xlIFRlc3Qgb3V0cHV0IGlzIG1lYW50IHRvIGJlIGEgY29uY2lzZSBhbmQgaHVtYW4tZnJpZW5kbHkgcmVwb3J0LiBJZgoreW91ciB0ZXN0IGdlbmVyYXRlcyB0ZXh0dWFsIG91dHB1dCBpdHNlbGYsIGl0IHdpbGwgbWl4IHdpdGggdGhlIEdvb2dsZSBUZXN0CitvdXRwdXQsIG1ha2luZyBpdCBoYXJkIHRvIHJlYWQuIEhvd2V2ZXIsIHRoZXJlIGlzIGFuIGVhc3kgc29sdXRpb24gdG8gdGhpcworcHJvYmxlbS4KKworU2luY2UgbW9zdCBsb2cgbWVzc2FnZXMgZ28gdG8gc3RkZXJyLCB3ZSBkZWNpZGVkIHRvIGxldCBHb29nbGUgVGVzdCBvdXRwdXQgZ28KK3RvIHN0ZG91dC4gVGhpcyB3YXksIHlvdSBjYW4gZWFzaWx5IHNlcGFyYXRlIHRoZSB0d28gdXNpbmcgcmVkaXJlY3Rpb24uIEZvcgorZXhhbXBsZToKK2BgYAorLi9teV90ZXN0ID4gZ29vZ2xldGVzdF9vdXRwdXQudHh0CitgYGAKKworIyMgV2h5IHNob3VsZCBJIHByZWZlciB0ZXN0IGZpeHR1cmVzIG92ZXIgZ2xvYmFsIHZhcmlhYmxlcz8gIyMKKworVGhlcmUgYXJlIHNldmVyYWwgZ29vZCByZWFzb25zOgorICAxLiBJdCdzIGxpa2VseSB5b3VyIHRlc3QgbmVlZHMgdG8gY2hhbmdlIHRoZSBzdGF0ZXMgb2YgaXRzIGdsb2JhbCB2YXJpYWJsZXMuIFRoaXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGtlZXAgc2lkZSBlZmZlY3RzIGZyb20gZXNjYXBpbmcgb25lIHRlc3QgYW5kIGNvbnRhbWluYXRpbmcgb3RoZXJzLCBtYWtpbmcgZGVidWdnaW5nIGRpZmZpY3VsdC4gQnkgdXNpbmcgZml4dHVyZXMsIGVhY2ggdGVzdCBoYXMgYSBmcmVzaCBzZXQgb2YgdmFyaWFibGVzIHRoYXQncyBkaWZmZXJlbnQgKGJ1dCB3aXRoIHRoZSBzYW1lIG5hbWVzKS4gVGh1cywgdGVzdHMgYXJlIGtlcHQgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlci4KKyAgMS4gR2xvYmFsIHZhcmlhYmxlcyBwb2xsdXRlIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorICAxLiBUZXN0IGZpeHR1cmVzIGNhbiBiZSByZXVzZWQgdmlhIHN1YmNsYXNzaW5nLCB3aGljaCBjYW5ub3QgYmUgZG9uZSBlYXNpbHkgd2l0aCBnbG9iYWwgdmFyaWFibGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiBtYW55IHRlc3QgY2FzZXMgaGF2ZSBzb21ldGhpbmcgaW4gY29tbW9uLgorCisjIyBIb3cgZG8gSSB0ZXN0IHByaXZhdGUgY2xhc3MgbWVtYmVycyB3aXRob3V0IHdyaXRpbmcgRlJJRU5EXF9URVNUKClzPyAjIworCitZb3Ugc2hvdWxkIHRyeSB0byB3cml0ZSB0ZXN0YWJsZSBjb2RlLCB3aGljaCBtZWFucyBjbGFzc2VzIHNob3VsZCBiZSBlYXNpbHkKK3Rlc3RlZCBmcm9tIHRoZWlyIHB1YmxpYyBpbnRlcmZhY2UuIE9uZSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRoZSBQaW1wbCBpZGlvbToKK3lvdSBtb3ZlIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyBpbnRvIGEgaGVscGVyIGNsYXNzLCBhbmQgbWFrZSBhbGwKK21lbWJlcnMgb2YgdGhlIGhlbHBlciBjbGFzcyBwdWJsaWMuCisKK1lvdSBoYXZlIHNldmVyYWwgb3RoZXIgb3B0aW9ucyB0aGF0IGRvbid0IHJlcXVpcmUgdXNpbmcgYEZSSUVORF9URVNUYDoKKyAgKiBXcml0ZSB0aGUgdGVzdHMgYXMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzczoKK2BgYAorY2xhc3MgRm9vIHsKKyAgZnJpZW5kIGNsYXNzIEZvb1Rlc3Q7CisgIC4uLgorfTsKKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLi4uCisgIHZvaWQgVGVzdDEoKSB7Li4ufSAvLyBUaGlzIGFjY2Vzc2VzIHByaXZhdGUgbWVtYmVycyBvZiBjbGFzcyBGb28uCisgIHZvaWQgVGVzdDIoKSB7Li4ufSAvLyBTbyBkb2VzIHRoaXMgb25lLgorfTsKKworVEVTVF9GKEZvb1Rlc3QsIFRlc3QxKSB7CisgIFRlc3QxKCk7Cit9CisKK1RFU1RfRihGb29UZXN0LCBUZXN0MikgeworICBUZXN0MigpOworfQorYGBgCisgICogSW4gdGhlIGZpeHR1cmUgY2xhc3MsIHdyaXRlIGFjY2Vzc29ycyBmb3IgdGhlIHRlc3RlZCBjbGFzcycgcHJpdmF0ZSBtZW1iZXJzLCB0aGVuIHVzZSB0aGUgYWNjZXNzb3JzIGluIHlvdXIgdGVzdHM6CitgYGAKK2NsYXNzIEZvbyB7CisgIGZyaWVuZCBjbGFzcyBGb29UZXN0OworICAuLi4KK307CisKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC4uLgorICBUMSBnZXRfcHJpdmF0ZV9tZW1iZXIxKEZvbyogb2JqKSB7CisgICAgcmV0dXJuIG9iai0+cHJpdmF0ZV9tZW1iZXIxXzsKKyAgfQorfTsKKworVEVTVF9GKEZvb1Rlc3QsIFRlc3QxKSB7CisgIC4uLgorICBnZXRfcHJpdmF0ZV9tZW1iZXIxKHgpCisgIC4uLgorfQorYGBgCisgICogSWYgdGhlIG1ldGhvZHMgYXJlIGRlY2xhcmVkICoqcHJvdGVjdGVkKiosIHlvdSBjYW4gY2hhbmdlIHRoZWlyIGFjY2VzcyBsZXZlbCBpbiBhIHRlc3Qtb25seSBzdWJjbGFzczoKK2BgYAorY2xhc3MgWW91ckNsYXNzIHsKKyAgLi4uCisgcHJvdGVjdGVkOiAvLyBwcm90ZWN0ZWQgYWNjZXNzIGZvciB0ZXN0YWJpbGl0eS4KKyAgaW50IERvU29tZXRoaW5nUmV0dXJuaW5nSW50KCk7CisgIC4uLgorfTsKKworLy8gaW4gdGhlIHlvdXJfY2xhc3NfdGVzdC5jYyBmaWxlOgorY2xhc3MgVGVzdGFibGVZb3VyQ2xhc3MgOiBwdWJsaWMgWW91ckNsYXNzIHsKKyAgLi4uCisgcHVibGljOiB1c2luZyBZb3VyQ2xhc3M6OkRvU29tZXRoaW5nUmV0dXJuaW5nSW50OyAvLyBjaGFuZ2VzIGFjY2VzcyByaWdodHMKKyAgLi4uCit9OworCitURVNUX0YoWW91ckNsYXNzVGVzdCwgRG9Tb21ldGhpbmdUZXN0KSB7CisgIFRlc3RhYmxlWW91ckNsYXNzIG9iajsKKyAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX3ZhbHVlLCBvYmouRG9Tb21ldGhpbmdSZXR1cm5pbmdJbnQoKSk7Cit9CitgYGAKKworIyMgSG93IGRvIEkgdGVzdCBwcml2YXRlIGNsYXNzIHN0YXRpYyBtZW1iZXJzIHdpdGhvdXQgd3JpdGluZyBGUklFTkRcX1RFU1QoKXM/ICMjCisKK1dlIGZpbmQgcHJpdmF0ZSBzdGF0aWMgbWV0aG9kcyBjbHV0dGVyIHRoZSBoZWFkZXIgZmlsZS4gIFRoZXkgYXJlCitpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCBpZGVhbGx5IHNob3VsZCBiZSBrZXB0IG91dCBvZiBhIC5oLiBTbyBvZnRlbiBJIG1ha2UKK3RoZW0gZnJlZSBmdW5jdGlvbnMgaW5zdGVhZC4KKworSW5zdGVhZCBvZjoKK2BgYAorLy8gZm9vLmgKK2NsYXNzIEZvbyB7CisgIC4uLgorIHByaXZhdGU6CisgIHN0YXRpYyBib29sIEZ1bmMoaW50IG4pOworfTsKKworLy8gZm9vLmNjCitib29sIEZvbzo6RnVuYyhpbnQgbikgeyAuLi4gfQorCisvLyBmb29fdGVzdC5jYworRVhQRUNUX1RSVUUoRm9vOjpGdW5jKDEyMzQ1KSk7CitgYGAKKworWW91IHByb2JhYmx5IHNob3VsZCBiZXR0ZXIgd3JpdGU6CitgYGAKKy8vIGZvby5oCitjbGFzcyBGb28geworICAuLi4KK307CisKKy8vIGZvby5jYworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgYm9vbCBGdW5jKGludCBuKSB7IC4uLiB9Cit9CisKKy8vIGZvb190ZXN0LmNjCituYW1lc3BhY2UgaW50ZXJuYWwgeworICBib29sIEZ1bmMoaW50IG4pOworfQorCitFWFBFQ1RfVFJVRShpbnRlcm5hbDo6RnVuYygxMjM0NSkpOworYGBgCisKKyMjIEkgd291bGQgbGlrZSB0byBydW4gYSB0ZXN0IHNldmVyYWwgdGltZXMgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycy4gRG8gSSBuZWVkIHRvIHdyaXRlIHNldmVyYWwgc2ltaWxhciBjb3BpZXMgb2YgaXQ/ICMjCisKK05vLiBZb3UgY2FuIHVzZSBhIGZlYXR1cmUgY2FsbGVkIFt2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzXShWMV83X0FkdmFuY2VkR3VpZGUjVmFsdWVfUGFyYW1ldGVyaXplZF9UZXN0cy5tZCkgd2hpY2gKK2xldHMgeW91IHJlcGVhdCB5b3VyIHRlc3RzIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMsIHdpdGhvdXQgZGVmaW5pbmcgaXQgbW9yZSB0aGFuIG9uY2UuCisKKyMjIEhvdyBkbyBJIHRlc3QgYSBmaWxlIHRoYXQgZGVmaW5lcyBtYWluKCk/ICMjCisKK1RvIHRlc3QgYSBgZm9vLmNjYCBmaWxlLCB5b3UgbmVlZCB0byBjb21waWxlIGFuZCBsaW5rIGl0IGludG8geW91ciB1bml0IHRlc3QKK3Byb2dyYW0uIEhvd2V2ZXIsIHdoZW4gdGhlIGZpbGUgY29udGFpbnMgYSBkZWZpbml0aW9uIGZvciB0aGUgYG1haW4oKWAKK2Z1bmN0aW9uLCBpdCB3aWxsIGNsYXNoIHdpdGggdGhlIGBtYWluKClgIG9mIHlvdXIgdW5pdCB0ZXN0LCBhbmQgd2lsbCByZXN1bHQgaW4KK2EgYnVpbGQgZXJyb3IuCisKK1RoZSByaWdodCBzb2x1dGlvbiBpcyB0byBzcGxpdCBpdCBpbnRvIHRocmVlIGZpbGVzOgorICAxLiBgZm9vLmhgIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMsCisgIDEuIGBmb28uY2NgIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBleGNlcHQgYG1haW4oKWAsIGFuZAorICAxLiBgZm9vX21haW4uY2NgIHdoaWNoIGNvbnRhaW5zIG5vdGhpbmcgYnV0IHRoZSBkZWZpbml0aW9uIG9mIGBtYWluKClgLgorCitUaGVuIGBmb28uY2NgIGNhbiBiZSBlYXNpbHkgdGVzdGVkLgorCitJZiB5b3UgYXJlIGFkZGluZyB0ZXN0cyB0byBhbiBleGlzdGluZyBmaWxlIGFuZCBkb24ndCB3YW50IGFuIGludHJ1c2l2ZSBjaGFuZ2UKK2xpa2UgdGhpcywgdGhlcmUgaXMgYSBoYWNrOiBqdXN0IGluY2x1ZGUgdGhlIGVudGlyZSBgZm9vLmNjYCBmaWxlIGluIHlvdXIgdW5pdAordGVzdC4gRm9yIGV4YW1wbGU6CitgYGAKKy8vIEZpbGUgZm9vX3VuaXR0ZXN0LmNjCisKKy8vIFRoZSBoZWFkZXJzIHNlY3Rpb24KKy4uLgorCisvLyBSZW5hbWVzIG1haW4oKSBpbiBmb28uY2MgdG8gbWFrZSByb29tIGZvciB0aGUgdW5pdCB0ZXN0IG1haW4oKQorI2RlZmluZSBtYWluIEZvb01haW4KKworI2luY2x1ZGUgImEvYi9mb28uY2MiCisKKy8vIFRoZSB0ZXN0cyBzdGFydCBoZXJlLgorLi4uCitgYGAKKworCitIb3dldmVyLCBwbGVhc2UgcmVtZW1iZXIgdGhpcyBpcyBhIGhhY2sgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgdGhlIGxhc3QKK3Jlc29ydC4KKworIyMgV2hhdCBjYW4gdGhlIHN0YXRlbWVudCBhcmd1bWVudCBpbiBBU1NFUlRcX0RFQVRIKCkgYmU/ICMjCisKK2BBU1NFUlRfREVBVEgoX3N0YXRlbWVudF8sIF9yZWdleF8pYCAob3IgYW55IGRlYXRoIGFzc2VydGlvbiBtYWNybykgY2FuIGJlIHVzZWQKK3doZXJldmVyIGBfc3RhdGVtZW50X2AgaXMgdmFsaWQuIFNvIGJhc2ljYWxseSBgX3N0YXRlbWVudF9gIGNhbiBiZSBhbnkgQysrCitzdGF0ZW1lbnQgdGhhdCBtYWtlcyBzZW5zZSBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBJbiBwYXJ0aWN1bGFyLCBpdCBjYW4KK3JlZmVyZW5jZSBnbG9iYWwgYW5kL29yIGxvY2FsIHZhcmlhYmxlcywgYW5kIGNhbiBiZToKKyAgKiBhIHNpbXBsZSBmdW5jdGlvbiBjYWxsIChvZnRlbiB0aGUgY2FzZSksCisgICogYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yCisgICogYSBjb21wb3VuZCBzdGF0ZW1lbnQuCisKKz4gU29tZSBleGFtcGxlcyBhcmUgc2hvd24gaGVyZToKK2BgYAorLy8gQSBkZWF0aCB0ZXN0IGNhbiBiZSBhIHNpbXBsZSBmdW5jdGlvbiBjYWxsLgorVEVTVChNeURlYXRoVGVzdCwgRnVuY3Rpb25DYWxsKSB7CisgIEFTU0VSVF9ERUFUSChYeXooNSksICJYeXogZmFpbGVkIik7Cit9CisKKy8vIE9yIGEgY29tcGxleCBleHByZXNzaW9uIHRoYXQgcmVmZXJlbmNlcyB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucy4KK1RFU1QoTXlEZWF0aFRlc3QsIENvbXBsZXhFeHByZXNzaW9uKSB7CisgIGNvbnN0IGJvb2wgYyA9IENvbmRpdGlvbigpOworICBBU1NFUlRfREVBVEgoKGMgPyBGdW5jMSgwKSA6IG9iamVjdDIuTWV0aG9kKCJ0ZXN0IikpLAorICAgICAgICAgICAgICAgIihGdW5jMXxNZXRob2QpIGZhaWxlZCIpOworfQorCisvLyBEZWF0aCBhc3NlcnRpb25zIGNhbiBiZSB1c2VkIGFueSB3aGVyZSBpbiBhIGZ1bmN0aW9uLiBJbgorLy8gcGFydGljdWxhciwgdGhleSBjYW4gYmUgaW5zaWRlIGEgbG9vcC4KK1RFU1QoTXlEZWF0aFRlc3QsIEluc2lkZUxvb3ApIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCBGb28oMCksIEZvbygxKSwgLi4uLCBhbmQgRm9vKDQpIGFsbCBkaWUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgRVhQRUNUX0RFQVRIX00oRm9vKGkpLCAiRm9vIGhhcyBcXGQrIGVycm9ycyIsCisgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIndoZXJlIGkgaXMgIiA8PCBpKTsKKyAgfQorfQorCisvLyBBIGRlYXRoIGFzc2VydGlvbiBjYW4gY29udGFpbiBhIGNvbXBvdW5kIHN0YXRlbWVudC4KK1RFU1QoTXlEZWF0aFRlc3QsIENvbXBvdW5kU3RhdGVtZW50KSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgYXQgbGVhc2Ugb25lIG9mIEJhcigwKSwgQmFyKDEpLCAuLi4sIGFuZAorICAvLyBCYXIoNCkgZGllcy4KKyAgQVNTRVJUX0RFQVRIKHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgQmFyKGkpOworICAgIH0KKyAgfSwKKyAgIkJhciBoYXMgXFxkKyBlcnJvcnMiKTt9CitgYGAKKworYGdvb2dsZXRlc3RfdW5pdHRlc3QuY2NgIGNvbnRhaW5zIG1vcmUgZXhhbXBsZXMgaWYgeW91IGFyZSBpbnRlcmVzdGVkLgorCisjIyBXaGF0IHN5bnRheCBkb2VzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaW4gQVNTRVJUXF9ERUFUSCB1c2U/ICMjCisKK09uIFBPU0lYIHN5c3RlbXMsIEdvb2dsZSBUZXN0IHVzZXMgdGhlIFBPU0lYIEV4dGVuZGVkIHJlZ3VsYXIKK2V4cHJlc3Npb24gc3ludGF4CisoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWd1bGFyX2V4cHJlc3Npb24jUE9TSVhfRXh0ZW5kZWRfUmVndWxhcl9FeHByZXNzaW9ucykuCitPbiBXaW5kb3dzLCBpdCB1c2VzIGEgbGltaXRlZCB2YXJpYW50IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbgorc3ludGF4LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlCitbcmVndWxhciBleHByZXNzaW9uIHN5bnRheF0oVjFfN19BZHZhbmNlZEd1aWRlI1JlZ3VsYXJfRXhwcmVzc2lvbl9TeW50YXgubWQpLgorCisjIyBJIGhhdmUgYSBmaXh0dXJlIGNsYXNzIEZvbywgYnV0IFRFU1RcX0YoRm9vLCBCYXIpIGdpdmVzIG1lIGVycm9yICJubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbCB0byBGb286OkZvbygpIi4gV2h5PyAjIworCitHb29nbGUgVGVzdCBuZWVkcyB0byBiZSBhYmxlIHRvIGNyZWF0ZSBvYmplY3RzIG9mIHlvdXIgdGVzdCBmaXh0dXJlIGNsYXNzLCBzbworaXQgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gTm9ybWFsbHkgdGhlIGNvbXBpbGVyIHdpbGwgZGVmaW5lIG9uZSBmb3IKK3lvdS4gSG93ZXZlciwgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHlvdSBoYXZlIHRvIGRlZmluZSB5b3VyIG93bjoKKyAgKiBJZiB5b3UgZXhwbGljaXRseSBkZWNsYXJlIGEgbm9uLWRlZmF1bHQgY29uc3RydWN0b3IgZm9yIGNsYXNzIGBGb29gLCB0aGVuIHlvdSBuZWVkIHRvIGRlZmluZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGV2ZW4gaWYgaXQgd291bGQgYmUgZW1wdHkuCisgICogSWYgYEZvb2AgaGFzIGEgY29uc3Qgbm9uLXN0YXRpYyBkYXRhIG1lbWJlciwgdGhlbiB5b3UgaGF2ZSB0byBkZWZpbmUgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgX2FuZF8gaW5pdGlhbGl6ZSB0aGUgY29uc3QgbWVtYmVyIGluIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIHRoZSBjb25zdHJ1Y3Rvci4gKEVhcmx5IHZlcnNpb25zIG9mIGBnY2NgIGRvZXNuJ3QgZm9yY2UgeW91IHRvIGluaXRpYWxpemUgdGhlIGNvbnN0IG1lbWJlci4gSXQncyBhIGJ1ZyB0aGF0IGhhcyBiZWVuIGZpeGVkIGluIGBnY2MgNGAuKQorCisjIyBXaHkgZG9lcyBBU1NFUlRcX0RFQVRIIGNvbXBsYWluIGFib3V0IHByZXZpb3VzIHRocmVhZHMgdGhhdCB3ZXJlIGFscmVhZHkgam9pbmVkPyAjIworCitXaXRoIHRoZSBMaW51eCBwdGhyZWFkIGxpYnJhcnksIHRoZXJlIGlzIG5vIHR1cm5pbmcgYmFjayBvbmNlIHlvdSBjcm9zcyB0aGUKK2xpbmUgZnJvbSBzaW5nbGUgdGhyZWFkIHRvIG11bHRpcGxlIHRocmVhZHMuIFRoZSBmaXJzdCB0aW1lIHlvdSBjcmVhdGUgYQordGhyZWFkLCBhIG1hbmFnZXIgdGhyZWFkIGlzIGNyZWF0ZWQgaW4gYWRkaXRpb24sIHNvIHlvdSBnZXQgMywgbm90IDIsIHRocmVhZHMuCitMYXRlciB3aGVuIHRoZSB0aHJlYWQgeW91IGNyZWF0ZSBqb2lucyB0aGUgbWFpbiB0aHJlYWQsIHRoZSB0aHJlYWQgY291bnQKK2RlY3JlbWVudHMgYnkgMSwgYnV0IHRoZSBtYW5hZ2VyIHRocmVhZCB3aWxsIG5ldmVyIGJlIGtpbGxlZCwgc28geW91IHN0aWxsIGhhdmUKKzIgdGhyZWFkcywgd2hpY2ggbWVhbnMgeW91IGNhbm5vdCBzYWZlbHkgcnVuIGEgZGVhdGggdGVzdC4KKworVGhlIG5ldyBOUFRMIHRocmVhZCBsaWJyYXJ5IGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhpcyBwcm9ibGVtLCBhcyBpdCBkb2Vzbid0CitjcmVhdGUgYSBtYW5hZ2VyIHRocmVhZC4gSG93ZXZlciwgaWYgeW91IGRvbid0IGNvbnRyb2wgd2hpY2ggbWFjaGluZSB5b3VyIHRlc3QKK3J1bnMgb24sIHlvdSBzaG91bGRuJ3QgZGVwZW5kIG9uIHRoaXMuCisKKyMjIFdoeSBkb2VzIEdvb2dsZSBUZXN0IHJlcXVpcmUgdGhlIGVudGlyZSB0ZXN0IGNhc2UsIGluc3RlYWQgb2YgaW5kaXZpZHVhbCB0ZXN0cywgdG8gYmUgbmFtZWQgRk9PRGVhdGhUZXN0IHdoZW4gaXQgdXNlcyBBU1NFUlRcX0RFQVRIPyAjIworCitHb29nbGUgVGVzdCBkb2VzIG5vdCBpbnRlcmxlYXZlIHRlc3RzIGZyb20gZGlmZmVyZW50IHRlc3QgY2FzZXMuIFRoYXQgaXMsIGl0CitydW5zIGFsbCB0ZXN0cyBpbiBvbmUgdGVzdCBjYXNlIGZpcnN0LCBhbmQgdGhlbiBydW5zIGFsbCB0ZXN0cyBpbiB0aGUgbmV4dCB0ZXN0CitjYXNlLCBhbmQgc28gb24uIEdvb2dsZSBUZXN0IGRvZXMgdGhpcyBiZWNhdXNlIGl0IG5lZWRzIHRvIHNldCB1cCBhIHRlc3QgY2FzZQorYmVmb3JlIHRoZSBmaXJzdCB0ZXN0IGluIGl0IGlzIHJ1biwgYW5kIHRlYXIgaXQgZG93biBhZnRlcndvcmRzLiBTcGxpdHRpbmcgdXAKK3RoZSB0ZXN0IGNhc2Ugd291bGQgcmVxdWlyZSBtdWx0aXBsZSBzZXQtdXAgYW5kIHRlYXItZG93biBwcm9jZXNzZXMsIHdoaWNoIGlzCitpbmVmZmljaWVudCBhbmQgbWFrZXMgdGhlIHNlbWFudGljcyB1bmNsZWFuLgorCitJZiB3ZSB3ZXJlIHRvIGRldGVybWluZSB0aGUgb3JkZXIgb2YgdGVzdHMgYmFzZWQgb24gdGVzdCBuYW1lIGluc3RlYWQgb2YgdGVzdAorY2FzZSBuYW1lLCB0aGVuIHdlIHdvdWxkIGhhdmUgYSBwcm9ibGVtIHdpdGggdGhlIGZvbGxvd2luZyBzaXR1YXRpb246CisKK2BgYAorVEVTVF9GKEZvb1Rlc3QsIEFiY0RlYXRoVGVzdCkgeyAuLi4gfQorVEVTVF9GKEZvb1Rlc3QsIFV2dykgeyAuLi4gfQorCitURVNUX0YoQmFyVGVzdCwgRGVmRGVhdGhUZXN0KSB7IC4uLiB9CitURVNUX0YoQmFyVGVzdCwgWHl6KSB7IC4uLiB9CitgYGAKKworU2luY2UgYEZvb1Rlc3QuQWJjRGVhdGhUZXN0YCBuZWVkcyB0byBydW4gYmVmb3JlIGBCYXJUZXN0Llh5emAsIGFuZCB3ZSBkb24ndAoraW50ZXJsZWF2ZSB0ZXN0cyBmcm9tIGRpZmZlcmVudCB0ZXN0IGNhc2VzLCB3ZSBuZWVkIHRvIHJ1biBhbGwgdGVzdHMgaW4gdGhlCitgRm9vVGVzdGAgY2FzZSBiZWZvcmUgcnVubmluZyBhbnkgdGVzdCBpbiB0aGUgYEJhclRlc3RgIGNhc2UuIFRoaXMgY29udHJhZGljdHMKK3dpdGggdGhlIHJlcXVpcmVtZW50IHRvIHJ1biBgQmFyVGVzdC5EZWZEZWF0aFRlc3RgIGJlZm9yZSBgRm9vVGVzdC5VdndgLgorCisjIyBCdXQgSSBkb24ndCBsaWtlIGNhbGxpbmcgbXkgZW50aXJlIHRlc3QgY2FzZSBGT09EZWF0aFRlc3Qgd2hlbiBpdCBjb250YWlucyBib3RoIGRlYXRoIHRlc3RzIGFuZCBub24tZGVhdGggdGVzdHMuIFdoYXQgZG8gSSBkbz8gIyMKKworWW91IGRvbid0IGhhdmUgdG8sIGJ1dCBpZiB5b3UgbGlrZSwgeW91IG1heSBzcGxpdCB1cCB0aGUgdGVzdCBjYXNlIGludG8KK2BGb29UZXN0YCBhbmQgYEZvb0RlYXRoVGVzdGAsIHdoZXJlIHRoZSBuYW1lcyBtYWtlIGl0IGNsZWFyIHRoYXQgdGhleSBhcmUKK3JlbGF0ZWQ6CisKK2BgYAorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeyAuLi4gfTsKKworVEVTVF9GKEZvb1Rlc3QsIEFiYykgeyAuLi4gfQorVEVTVF9GKEZvb1Rlc3QsIERlZikgeyAuLi4gfQorCit0eXBlZGVmIEZvb1Rlc3QgRm9vRGVhdGhUZXN0OworCitURVNUX0YoRm9vRGVhdGhUZXN0LCBVdncpIHsgLi4uIEVYUEVDVF9ERUFUSCguLi4pIC4uLiB9CitURVNUX0YoRm9vRGVhdGhUZXN0LCBYeXopIHsgLi4uIEFTU0VSVF9ERUFUSCguLi4pIC4uLiB9CitgYGAKKworIyMgVGhlIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCAibm8gbWF0Y2ggZm9yICdvcGVyYXRvcjw8JyIgd2hlbiBJIHVzZSBhbiBhc3NlcnRpb24uIFdoYXQgZ2l2ZXM/ICMjCisKK0lmIHlvdSB1c2UgYSB1c2VyLWRlZmluZWQgdHlwZSBgRm9vVHlwZWAgaW4gYW4gYXNzZXJ0aW9uLCB5b3UgbXVzdCBtYWtlIHN1cmUKK3RoZXJlIGlzIGFuIGBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3QgRm9vVHlwZSYpYCBmdW5jdGlvbgorZGVmaW5lZCBzdWNoIHRoYXQgd2UgY2FuIHByaW50IGEgdmFsdWUgb2YgYEZvb1R5cGVgLgorCitJbiBhZGRpdGlvbiwgaWYgYEZvb1R5cGVgIGlzIGRlY2xhcmVkIGluIGEgbmFtZSBzcGFjZSwgdGhlIGA8PGAgb3BlcmF0b3IgYWxzbworbmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgX3NhbWVfIG5hbWUgc3BhY2UuCisKKyMjIEhvdyBkbyBJIHN1cHByZXNzIHRoZSBtZW1vcnkgbGVhayBtZXNzYWdlcyBvbiBXaW5kb3dzPyAjIworCitTaW5jZSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBHb29nbGUgVGVzdCBzaW5nbGV0b24gcmVxdWlyZXMgYWxsb2NhdGlvbnMgb24KK3RoZSBoZWFwLCB0aGUgVmlzdWFsIEMrKyBtZW1vcnkgbGVhayBkZXRlY3RvciB3aWxsIHJlcG9ydCBtZW1vcnkgbGVha3MgYXQgdGhlCitlbmQgb2YgdGhlIHByb2dyYW0gcnVuLiBUaGUgZWFzaWVzdCB3YXkgdG8gYXZvaWQgdGhpcyBpcyB0byB1c2UgdGhlCitgX0NydE1lbUNoZWNrcG9pbnRgIGFuZCBgX0NydE1lbUR1bXBBbGxPYmplY3RzU2luY2VgIGNhbGxzIHRvIG5vdCByZXBvcnQgYW55CitzdGF0aWNhbGx5IGluaXRpYWxpemVkIGhlYXAgb2JqZWN0cy4gU2VlIE1TRE4gZm9yIG1vcmUgZGV0YWlscyBhbmQgYWRkaXRpb25hbAoraGVhcCBjaGVjay9kZWJ1ZyByb3V0aW5lcy4KKworIyMgSSBhbSBidWlsZGluZyBteSBwcm9qZWN0IHdpdGggR29vZ2xlIFRlc3QgaW4gVmlzdWFsIFN0dWRpbyBhbmQgYWxsIEknbSBnZXR0aW5nIGlzIGEgYnVuY2ggb2YgbGlua2VyIGVycm9ycyAob3Igd2FybmluZ3MpLiBIZWxwISAjIworCitZb3UgbWF5IGdldCBhIG51bWJlciBvZiB0aGUgZm9sbG93aW5nIGxpbmtlciBlcnJvciBvciB3YXJuaW5ncyBpZiB5b3UKK2F0dGVtcHQgdG8gbGluayB5b3VyIHRlc3QgcHJvamVjdCB3aXRoIHRoZSBHb29nbGUgVGVzdCBsaWJyYXJ5IHdoZW4KK3lvdXIgcHJvamVjdCBhbmQgdGhlIGFyZSBub3QgYnVpbHQgdXNpbmcgdGhlIHNhbWUgY29tcGlsZXIgc2V0dGluZ3MuCisKKyAgKiBMTksyMDA1OiBzeW1ib2wgYWxyZWFkeSBkZWZpbmVkIGluIG9iamVjdAorICAqIExOSzQyMTc6IGxvY2FsbHkgZGVmaW5lZCBzeW1ib2wgJ3N5bWJvbCcgaW1wb3J0ZWQgaW4gZnVuY3Rpb24gJ2Z1bmN0aW9uJworICAqIExOSzQwNDk6IGxvY2FsbHkgZGVmaW5lZCBzeW1ib2wgJ3N5bWJvbCcgaW1wb3J0ZWQKKworVGhlIEdvb2dsZSBUZXN0IHByb2plY3QgKGd0ZXN0LnZjcHJvaikgaGFzIHRoZSBSdW50aW1lIExpYnJhcnkgb3B0aW9uCitzZXQgdG8gL01UICh1c2UgbXVsdGktdGhyZWFkZWQgc3RhdGljIGxpYnJhcmllcywgL01UZCBmb3IgZGVidWcpLiBJZgoreW91ciBwcm9qZWN0IHVzZXMgc29tZXRoaW5nIGVsc2UsIGZvciBleGFtcGxlIC9NRCAodXNlIG11bHRpLXRocmVhZGVkCitETExzLCAvTURkIGZvciBkZWJ1ZyksIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgc2V0dGluZyBpbiB0aGUgR29vZ2xlCitUZXN0IHByb2plY3QgdG8gbWF0Y2ggeW91ciBwcm9qZWN0J3MuCisKK1RvIHVwZGF0ZSB0aGlzIHNldHRpbmcgb3BlbiB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIGluIHRoZSBWaXN1YWwKK1N0dWRpbyBJREUgdGhlbiBzZWxlY3QgdGhlIGJyYW5jaCBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgfCBDL0MrKyB8CitDb2RlIEdlbmVyYXRpb24gYW5kIGNoYW5nZSB0aGUgb3B0aW9uICJSdW50aW1lIExpYnJhcnkiLiAgWW91IG1heSBhbHNvIHRyeQordXNpbmcgZ3Rlc3QtbWQudmNwcm9qIGluc3RlYWQgb2YgZ3Rlc3QudmNwcm9qLgorCisjIyBJIHB1dCBteSB0ZXN0cyBpbiBhIGxpYnJhcnkgYW5kIEdvb2dsZSBUZXN0IGRvZXNuJ3QgcnVuIHRoZW0uIFdoYXQncyBoYXBwZW5pbmc/ICMjCitIYXZlIHlvdSByZWFkIGEKK1t3YXJuaW5nXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL1YxXzdfUHJpbWVyI0ltcG9ydGFudF9ub3RlX2Zvcl9WaXN1YWxfQysrX3VzZXJzKSBvbgordGhlIEdvb2dsZSBUZXN0IFByaW1lciBwYWdlPworCisjIyBJIHdhbnQgdG8gdXNlIEdvb2dsZSBUZXN0IHdpdGggVmlzdWFsIFN0dWRpbyBidXQgZG9uJ3Qga25vdyB3aGVyZSB0byBzdGFydC4gIyMKK01hbnkgcGVvcGxlIGFyZSBpbiB5b3VyIHBvc2l0aW9uIGFuZCBvbmUgb2YgdGhlIHBvc3RlZCBoaXMgc29sdXRpb24gdG8KK291ciBtYWlsaW5nIGxpc3QuIEhlcmUgaXMgaGlzIGxpbms6CitodHRwOi8vaGFzc2FuamFtaWxhaG1hZC5ibG9nc3BvdC5jb20vMjAwOS8wNy9ndGVzdC1zdGFydGVycy1oZWxwLmh0bWwuCisKKyMjIEkgYW0gc2VlaW5nIGNvbXBpbGUgZXJyb3JzIG1lbnRpb25pbmcgc3RkOjp0eXBlXF90cmFpdHMgd2hlbiBJIHRyeSB0byB1c2UgR29vZ2xlIFRlc3Qgb24gU29sYXJpcy4gIyMKK0dvb2dsZSBUZXN0IHVzZXMgcGFydHMgb2YgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5IHRoYXQgU3VuU3R1ZGlvIGRvZXMgbm90IHN1cHBvcnQuCitPdXIgdXNlcnMgcmVwb3J0ZWQgc3VjY2VzcyB1c2luZyBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMuIFRyeSBydW5uaW5nIHRoZSBidWlsZCBhZnRlciBydW5pbmcgdGhpcyBjb21tYWQ6CisKK2BleHBvcnQgQ0M9Y2MgQ1hYPUNDIENYWEZMQUdTPSctbGlicmFyeT1zdGxwb3J0NCdgCisKKyMjIEhvdyBjYW4gbXkgY29kZSBkZXRlY3QgaWYgaXQgaXMgcnVubmluZyBpbiBhIHRlc3Q/ICMjCisKK0lmIHlvdSB3cml0ZSBjb2RlIHRoYXQgc25pZmZzIHdoZXRoZXIgaXQncyBydW5uaW5nIGluIGEgdGVzdCBhbmQgZG9lcworZGlmZmVyZW50IHRoaW5ncyBhY2NvcmRpbmdseSwgeW91IGFyZSBsZWFraW5nIHRlc3Qtb25seSBsb2dpYyBpbnRvCitwcm9kdWN0aW9uIGNvZGUgYW5kIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGVuc3VyZSB0aGF0IHRoZSB0ZXN0LW9ubHkKK2NvZGUgcGF0aHMgYXJlbid0IHJ1biBieSBtaXN0YWtlIGluIHByb2R1Y3Rpb24uICBTdWNoIGNsZXZlcm5lc3MgYWxzbworbGVhZHMgdG8KK1tIZWlzZW5idWdzXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VudXN1YWxfc29mdHdhcmVfYnVnI0hlaXNlbmJ1ZykuCitUaGVyZWZvcmUgd2Ugc3Ryb25nbHkgYWR2aXNlIGFnYWluc3QgdGhlIHByYWN0aWNlLCBhbmQgR29vZ2xlIFRlc3QgZG9lc24ndAorcHJvdmlkZSBhIHdheSB0byBkbyBpdC4KKworSW4gZ2VuZXJhbCwgdGhlIHJlY29tbWVuZGVkIHdheSB0byBjYXVzZSB0aGUgY29kZSB0byBiZWhhdmUKK2RpZmZlcmVudGx5IHVuZGVyIHRlc3QgaXMgW2RlcGVuZGVuY3kgaW5qZWN0aW9uXShodHRwOi8vamFtZXNzaG9yZS5jb20vQmxvZy9EZXBlbmRlbmN5LUluamVjdGlvbi1EZW15c3RpZmllZC5odG1sKS4KK1lvdSBjYW4gaW5qZWN0IGRpZmZlcmVudCBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIHRlc3QgYW5kIGZyb20gdGhlCitwcm9kdWN0aW9uIGNvZGUuICBTaW5jZSB5b3VyIHByb2R1Y3Rpb24gY29kZSBkb2Vzbid0IGxpbmsgaW4gdGhlCitmb3ItdGVzdCBsb2dpYyBhdCBhbGwsIHRoZXJlIGlzIG5vIGRhbmdlciBpbiBhY2NpZGVudGFsbHkgcnVubmluZyBpdC4KKworSG93ZXZlciwgaWYgeW91IF9yZWFsbHlfLCBfcmVhbGx5XywgX3JlYWxseV8gaGF2ZSBubyBjaG9pY2UsIGFuZCBpZgoreW91IGZvbGxvdyB0aGUgcnVsZSBvZiBlbmRpbmcgeW91ciB0ZXN0IHByb2dyYW0gbmFtZXMgd2l0aCBgX3Rlc3RgLAoreW91IGNhbiB1c2UgdGhlIF9ob3JyaWJsZV8gaGFjayBvZiBzbmlmZmluZyB5b3VyIGV4ZWN1dGFibGUgbmFtZQorKGBhcmd2WzBdYCBpbiBgbWFpbigpYCkgdG8ga25vdyB3aGV0aGVyIHRoZSBjb2RlIGlzIHVuZGVyIHRlc3QuCisKKyMjIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBtYWNybyB0aGF0IGNsYXNoZXMgd2l0aCBvbmUgZGVmaW5lZCBieSBhbm90aGVyIGxpYnJhcnkuIEhvdyBkbyBJIGRlYWwgd2l0aCB0aGF0PyAjIworCitJbiBDKyssIG1hY3JvcyBkb24ndCBvYmV5IG5hbWVzcGFjZXMuICBUaGVyZWZvcmUgdHdvIGxpYnJhcmllcyB0aGF0Citib3RoIGRlZmluZSBhIG1hY3JvIG9mIHRoZSBzYW1lIG5hbWUgd2lsbCBjbGFzaCBpZiB5b3UgI2luY2x1ZGUgYm90aAorZGVmaW5pdGlvbnMuICBJbiBjYXNlIGEgR29vZ2xlIFRlc3QgbWFjcm8gY2xhc2hlcyB3aXRoIGFub3RoZXIKK2xpYnJhcnksIHlvdSBjYW4gZm9yY2UgR29vZ2xlIFRlc3QgdG8gcmVuYW1lIGl0cyBtYWNybyB0byBhdm9pZCB0aGUKK2NvbmZsaWN0LgorCitTcGVjaWZpY2FsbHksIGlmIGJvdGggR29vZ2xlIFRlc3QgYW5kIHNvbWUgb3RoZXIgY29kZSBkZWZpbmUgbWFjcm8KK2BGT09gLCB5b3UgY2FuIGFkZAorYGBgCisgIC1ER1RFU1RfRE9OVF9ERUZJTkVfRk9PPTEKK2BgYAordG8gdGhlIGNvbXBpbGVyIGZsYWdzIHRvIHRlbGwgR29vZ2xlIFRlc3QgdG8gY2hhbmdlIHRoZSBtYWNybydzIG5hbWUKK2Zyb20gYEZPT2AgdG8gYEdURVNUX0ZPT2AuIEZvciBleGFtcGxlLCB3aXRoIGAtREdURVNUX0RPTlRfREVGSU5FX1RFU1Q9MWAsIHlvdSdsbCBuZWVkIHRvIHdyaXRlCitgYGAKKyAgR1RFU1RfVEVTVChTb21lVGVzdCwgRG9lc1RoaXMpIHsgLi4uIH0KK2BgYAoraW5zdGVhZCBvZgorYGBgCisgIFRFU1QoU29tZVRlc3QsIERvZXNUaGlzKSB7IC4uLiB9CitgYGAKK2luIG9yZGVyIHRvIGRlZmluZSBhIHRlc3QuCisKK0N1cnJlbnRseSwgdGhlIGZvbGxvd2luZyBgVEVTVGAsIGBGQUlMYCwgYFNVQ0NFRURgLCBhbmQgdGhlIGJhc2ljIGNvbXBhcmlzb24gYXNzZXJ0aW9uIG1hY3JvcyBjYW4gaGF2ZSBhbHRlcm5hdGl2ZSBuYW1lcy4gWW91IGNhbiBzZWUgdGhlIGZ1bGwgbGlzdCBvZiBjb3ZlcmVkIG1hY3JvcyBbaGVyZV0oaHR0cDovL3d3dy5nb29nbGUuY29tL2NvZGVzZWFyY2g/cT1pZishR1RFU1RfRE9OVF9ERUZJTkVfXHclMkIrcGFja2FnZTpodHRwOi8vZ29vZ2xldGVzdFwuZ29vZ2xlY29kZVwuY29tK2ZpbGU6L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCkuIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSAiQXZvaWRpbmcgTWFjcm8gTmFtZSBDbGFzaGVzIiBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZmlsZS4KKworCisjIyBJcyBpdCBPSyBpZiBJIGhhdmUgdHdvIHNlcGFyYXRlIGBURVNUKEZvbywgQmFyKWAgdGVzdCBtZXRob2RzIGRlZmluZWQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXM/ICMjCisKK1llcy4KKworVGhlIHJ1bGUgaXMgKiphbGwgdGVzdCBtZXRob2RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSBmaXh0dXJlIGNsYXNzKiouIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGlzICoqYWxsb3dlZCoqIGJlY2F1c2UgYm90aCB0ZXN0cyB1c2UgdGhlIHNhbWUgZml4dHVyZSBjbGFzcyAoYDo6dGVzdGluZzo6VGVzdGApLgorCitgYGAKK25hbWVzcGFjZSBmb28geworVEVTVChDb29sVGVzdCwgRG9Tb21ldGhpbmcpIHsKKyAgU1VDQ0VFRCgpOworfQorfSAgLy8gbmFtZXNwYWNlIGZvbworCituYW1lc3BhY2UgYmFyIHsKK1RFU1QoQ29vbFRlc3QsIERvU29tZXRoaW5nKSB7CisgIFNVQ0NFRUQoKTsKK30KK30gIC8vIG5hbWVzcGFjZSBmb28KK2BgYAorCitIb3dldmVyLCB0aGUgZm9sbG93aW5nIGNvZGUgaXMgKipub3QgYWxsb3dlZCoqIGFuZCB3aWxsIHByb2R1Y2UgYSBydW50aW1lIGVycm9yIGZyb20gR29vZ2xlIFRlc3QgYmVjYXVzZSB0aGUgdGVzdCBtZXRob2RzIGFyZSB1c2luZyBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSB0ZXN0IGNhc2UgbmFtZS4KKworYGBgCituYW1lc3BhY2UgZm9vIHsKK2NsYXNzIENvb2xUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7fTsgIC8vIEZpeHR1cmUgZm9vOjpDb29sVGVzdAorVEVTVF9GKENvb2xUZXN0LCBEb1NvbWV0aGluZykgeworICBTVUNDRUVEKCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgZm9vCisKK25hbWVzcGFjZSBiYXIgeworY2xhc3MgQ29vbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OyAgLy8gRml4dHVyZTogYmFyOjpDb29sVGVzdAorVEVTVF9GKENvb2xUZXN0LCBEb1NvbWV0aGluZykgeworICBTVUNDRUVEKCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgZm9vCitgYGAKKworIyMgSG93IGRvIEkgYnVpbGQgR29vZ2xlIFRlc3RpbmcgRnJhbWV3b3JrIHdpdGggWGNvZGUgND8gIyMKKworSWYgeW91IHRyeSB0byBidWlsZCBHb29nbGUgVGVzdCdzIFhjb2RlIHByb2plY3Qgd2l0aCBYY29kZSA0LjAgb3IgbGF0ZXIsIHlvdSBtYXkgZW5jb3VudGVyIGFuIGVycm9yIG1lc3NhZ2UgdGhhdCBsb29rcyBsaWtlCisiTWlzc2luZyBTREsgaW4gdGFyZ2V0IGd0ZXN0XF9mcmFtZXdvcms6IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsiLiBUaGF0IG1lYW5zIHRoYXQgWGNvZGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU0RLIHRoZSBwcm9qZWN0IGlzIHRhcmdldGluZy4gU2VlIHRoZSBYY29kZSBzZWN0aW9uIGluIHRoZSBbUkVBRE1FXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL1JFQURNRSkgZmlsZSBvbiBob3cgdG8gcmVzb2x2ZSB0aGlzLgorCisjIyBNeSBxdWVzdGlvbiBpcyBub3QgY292ZXJlZCBpbiB5b3VyIEZBUSEgIyMKKworSWYgeW91IGNhbm5vdCBmaW5kIHRoZSBhbnN3ZXIgdG8geW91ciBxdWVzdGlvbiBpbiB0aGlzIEZBUSwgdGhlcmUgYXJlCitzb21lIG90aGVyIHJlc291cmNlcyB5b3UgY2FuIHVzZToKKworICAxLiByZWFkIG90aGVyIFt3aWtpIHBhZ2VzXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93L2xpc3QpLAorICAxLiBzZWFyY2ggdGhlIG1haWxpbmcgbGlzdCBbYXJjaGl2ZV0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZXRlc3RmcmFtZXdvcmsvdG9waWNzKSwKKyAgMS4gYXNrIGl0IG9uIFtnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb21dKG1haWx0bzpnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20pIGFuZCBzb21lb25lIHdpbGwgYW5zd2VyIGl0ICh0byBwcmV2ZW50IHNwYW0sIHdlIHJlcXVpcmUgeW91IHRvIGpvaW4gdGhlIFtkaXNjdXNzaW9uIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ29vZ2xldGVzdGZyYW1ld29yaykgYmVmb3JlIHlvdSBjYW4gcG9zdC4pLgorCitQbGVhc2Ugbm90ZSB0aGF0IGNyZWF0aW5nIGFuIGlzc3VlIGluIHRoZQorW2lzc3VlIHRyYWNrZXJdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L2lzc3Vlcy9saXN0KSBpcyBfbm90XworYSBnb29kIHdheSB0byBnZXQgeW91ciBhbnN3ZXIsIGFzIGl0IGlzIG1vbml0b3JlZCBpbmZyZXF1ZW50bHkgYnkgYQordmVyeSBzbWFsbCBudW1iZXIgb2YgcGVvcGxlLgorCitXaGVuIGFza2luZyBhIHF1ZXN0aW9uLCBpdCdzIGhlbHBmdWwgdG8gcHJvdmlkZSBhcyBtdWNoIG9mIHRoZQorZm9sbG93aW5nIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIChwZW9wbGUgY2Fubm90IGhlbHAgeW91IGlmIHRoZXJlJ3MKK25vdCBlbm91Z2ggaW5mb3JtYXRpb24gaW4geW91ciBxdWVzdGlvbik6CisKKyAgKiB0aGUgdmVyc2lvbiAob3IgdGhlIHJldmlzaW9uIG51bWJlciBpZiB5b3UgY2hlY2sgb3V0IGZyb20gU1ZOIGRpcmVjdGx5KSBvZiBHb29nbGUgVGVzdCB5b3UgdXNlIChHb29nbGUgVGVzdCBpcyB1bmRlciBhY3RpdmUgZGV2ZWxvcG1lbnQsIHNvIGl0J3MgcG9zc2libGUgdGhhdCB5b3VyIHByb2JsZW0gaGFzIGJlZW4gc29sdmVkIGluIGEgbGF0ZXIgdmVyc2lvbiksCisgICogeW91ciBvcGVyYXRpbmcgc3lzdGVtLAorICAqIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHlvdXIgY29tcGlsZXIsCisgICogdGhlIGNvbXBsZXRlIGNvbW1hbmQgbGluZSBmbGFncyB5b3UgZ2l2ZSB0byB5b3VyIGNvbXBpbGVyLAorICAqIHRoZSBjb21wbGV0ZSBjb21waWxlciBlcnJvciBtZXNzYWdlcyAoaWYgdGhlIHF1ZXN0aW9uIGlzIGFib3V0IGNvbXBpbGF0aW9uKSwKKyAgKiB0aGUgX2FjdHVhbF8gY29kZSAoaWRlYWxseSwgYSBtaW5pbWFsIGJ1dCBjb21wbGV0ZSBwcm9ncmFtKSB0aGF0IGhhcyB0aGUgcHJvYmxlbSB5b3UgZW5jb3VudGVyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzdfUHJpbWVyLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvVjFfN19QcmltZXIubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlNTA4MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzdfUHJpbWVyLm1kCkBAIC0wLDAgKzEsNTAxIEBACisKKworIyBJbnRyb2R1Y3Rpb246IFdoeSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrPyAjCisKK19Hb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrXyBoZWxwcyB5b3Ugd3JpdGUgYmV0dGVyIEMrKyB0ZXN0cy4KKworTm8gbWF0dGVyIHdoZXRoZXIgeW91IHdvcmsgb24gTGludXgsIFdpbmRvd3MsIG9yIGEgTWFjLCBpZiB5b3Ugd3JpdGUgQysrIGNvZGUsCitHb29nbGUgVGVzdCBjYW4gaGVscCB5b3UuCisKK1NvIHdoYXQgbWFrZXMgYSBnb29kIHRlc3QsIGFuZCBob3cgZG9lcyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGZpdCBpbj8gV2UgYmVsaWV2ZToKKyAgMS4gVGVzdHMgc2hvdWxkIGJlIF9pbmRlcGVuZGVudF8gYW5kIF9yZXBlYXRhYmxlXy4gSXQncyBhIHBhaW4gdG8gZGVidWcgYSB0ZXN0IHRoYXQgc3VjY2VlZHMgb3IgZmFpbHMgYXMgYSByZXN1bHQgb2Ygb3RoZXIgdGVzdHMuICBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGlzb2xhdGVzIHRoZSB0ZXN0cyBieSBydW5uaW5nIGVhY2ggb2YgdGhlbSBvbiBhIGRpZmZlcmVudCBvYmplY3QuIFdoZW4gYSB0ZXN0IGZhaWxzLCBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGFsbG93cyB5b3UgdG8gcnVuIGl0IGluIGlzb2xhdGlvbiBmb3IgcXVpY2sgZGVidWdnaW5nLgorICAxLiBUZXN0cyBzaG91bGQgYmUgd2VsbCBfb3JnYW5pemVkXyBhbmQgcmVmbGVjdCB0aGUgc3RydWN0dXJlIG9mIHRoZSB0ZXN0ZWQgY29kZS4gIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgZ3JvdXBzIHJlbGF0ZWQgdGVzdHMgaW50byB0ZXN0IGNhc2VzIHRoYXQgY2FuIHNoYXJlIGRhdGEgYW5kIHN1YnJvdXRpbmVzLiBUaGlzIGNvbW1vbiBwYXR0ZXJuIGlzIGVhc3kgdG8gcmVjb2duaXplIGFuZCBtYWtlcyB0ZXN0cyBlYXN5IHRvIG1haW50YWluLiBTdWNoIGNvbnNpc3RlbmN5IGlzIGVzcGVjaWFsbHkgaGVscGZ1bCB3aGVuIHBlb3BsZSBzd2l0Y2ggcHJvamVjdHMgYW5kIHN0YXJ0IHRvIHdvcmsgb24gYSBuZXcgY29kZSBiYXNlLgorICAxLiBUZXN0cyBzaG91bGQgYmUgX3BvcnRhYmxlXyBhbmQgX3JldXNhYmxlXy4gVGhlIG9wZW4tc291cmNlIGNvbW11bml0eSBoYXMgYSBsb3Qgb2YgY29kZSB0aGF0IGlzIHBsYXRmb3JtLW5ldXRyYWwsIGl0cyB0ZXN0cyBzaG91bGQgYWxzbyBiZSBwbGF0Zm9ybS1uZXV0cmFsLiAgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayB3b3JrcyBvbiBkaWZmZXJlbnQgT1Nlcywgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXJzIChnY2MsIE1TVkMsIGFuZCBvdGhlcnMpLCB3aXRoIG9yIHdpdGhvdXQgZXhjZXB0aW9ucywgc28gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayB0ZXN0cyBjYW4gZWFzaWx5IHdvcmsgd2l0aCBhIHZhcmlldHkgb2YgY29uZmlndXJhdGlvbnMuICAoTm90ZSB0aGF0IHRoZSBjdXJyZW50IHJlbGVhc2Ugb25seSBjb250YWlucyBidWlsZCBzY3JpcHRzIGZvciBMaW51eCAtIHdlIGFyZSBhY3RpdmVseSB3b3JraW5nIG9uIHNjcmlwdHMgZm9yIG90aGVyIHBsYXRmb3Jtcy4pCisgIDEuIFdoZW4gdGVzdHMgZmFpbCwgdGhleSBzaG91bGQgcHJvdmlkZSBhcyBtdWNoIF9pbmZvcm1hdGlvbl8gYWJvdXQgdGhlIHByb2JsZW0gYXMgcG9zc2libGUuIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgZG9lc24ndCBzdG9wIGF0IHRoZSBmaXJzdCB0ZXN0IGZhaWx1cmUuIEluc3RlYWQsIGl0IG9ubHkgc3RvcHMgdGhlIGN1cnJlbnQgdGVzdCBhbmQgY29udGludWVzIHdpdGggdGhlIG5leHQuIFlvdSBjYW4gYWxzbyBzZXQgdXAgdGVzdHMgdGhhdCByZXBvcnQgbm9uLWZhdGFsIGZhaWx1cmVzIGFmdGVyIHdoaWNoIHRoZSBjdXJyZW50IHRlc3QgY29udGludWVzLiBUaHVzLCB5b3UgY2FuIGRldGVjdCBhbmQgZml4IG11bHRpcGxlIGJ1Z3MgaW4gYSBzaW5nbGUgcnVuLWVkaXQtY29tcGlsZSBjeWNsZS4KKyAgMS4gVGhlIHRlc3RpbmcgZnJhbWV3b3JrIHNob3VsZCBsaWJlcmF0ZSB0ZXN0IHdyaXRlcnMgZnJvbSBob3VzZWtlZXBpbmcgY2hvcmVzIGFuZCBsZXQgdGhlbSBmb2N1cyBvbiB0aGUgdGVzdCBfY29udGVudF8uICBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGF1dG9tYXRpY2FsbHkga2VlcHMgdHJhY2sgb2YgYWxsIHRlc3RzIGRlZmluZWQsIGFuZCBkb2Vzbid0IHJlcXVpcmUgdGhlIHVzZXIgdG8gZW51bWVyYXRlIHRoZW0gaW4gb3JkZXIgdG8gcnVuIHRoZW0uCisgIDEuIFRlc3RzIHNob3VsZCBiZSBfZmFzdF8uIFdpdGggR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaywgeW91IGNhbiByZXVzZSBzaGFyZWQgcmVzb3VyY2VzIGFjcm9zcyB0ZXN0cyBhbmQgcGF5IGZvciB0aGUgc2V0LXVwL3RlYXItZG93biBvbmx5IG9uY2UsIHdpdGhvdXQgbWFraW5nIHRlc3RzIGRlcGVuZCBvbiBlYWNoIG90aGVyLgorCitTaW5jZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGlzIGJhc2VkIG9uIHRoZSBwb3B1bGFyIHhVbml0CithcmNoaXRlY3R1cmUsIHlvdSdsbCBmZWVsIHJpZ2h0IGF0IGhvbWUgaWYgeW91J3ZlIHVzZWQgSlVuaXQgb3IgUHlVbml0IGJlZm9yZS4KK0lmIG5vdCwgaXQgd2lsbCB0YWtlIHlvdSBhYm91dCAxMCBtaW51dGVzIHRvIGxlYXJuIHRoZSBiYXNpY3MgYW5kIGdldCBzdGFydGVkLgorU28gbGV0J3MgZ28hCisKK19Ob3RlOl8gV2Ugc29tZXRpbWVzIHJlZmVyIHRvIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgaW5mb3JtYWxseQorYXMgX0dvb2dsZSBUZXN0Xy4KKworIyBTZXR0aW5nIHVwIGEgTmV3IFRlc3QgUHJvamVjdCAjCisKK1RvIHdyaXRlIGEgdGVzdCBwcm9ncmFtIHVzaW5nIEdvb2dsZSBUZXN0LCB5b3UgbmVlZCB0byBjb21waWxlIEdvb2dsZQorVGVzdCBpbnRvIGEgbGlicmFyeSBhbmQgbGluayB5b3VyIHRlc3Qgd2l0aCBpdC4gIFdlIHByb3ZpZGUgYnVpbGQKK2ZpbGVzIGZvciBzb21lIHBvcHVsYXIgYnVpbGQgc3lzdGVtczogYG1zdmMvYCBmb3IgVmlzdWFsIFN0dWRpbywKK2B4Y29kZS9gIGZvciBNYWMgWGNvZGUsIGBtYWtlL2AgZm9yIEdOVSBtYWtlLCBgY29kZWdlYXIvYCBmb3IgQm9ybGFuZAorQysrIEJ1aWxkZXIsIGFuZCB0aGUgYXV0b3Rvb2xzIHNjcmlwdCAoZGVwcmVjYXRlZCkgYW5kCitgQ01ha2VMaXN0cy50eHRgIGZvciBDTWFrZSAocmVjb21tZW5kZWQpIGluIHRoZSBHb29nbGUgVGVzdCByb290CitkaXJlY3RvcnkuICBJZiB5b3VyIGJ1aWxkIHN5c3RlbSBpcyBub3Qgb24gdGhpcyBsaXN0LCB5b3UgY2FuIHRha2UgYQorbG9vayBhdCBgbWFrZS9NYWtlZmlsZWAgdG8gbGVhcm4gaG93IEdvb2dsZSBUZXN0IHNob3VsZCBiZSBjb21waWxlZAorKGJhc2ljYWxseSB5b3Ugd2FudCB0byBjb21waWxlIGBzcmMvZ3Rlc3QtYWxsLmNjYCB3aXRoIGBHVEVTVF9ST09UYAorYW5kIGBHVEVTVF9ST09UL2luY2x1ZGVgIGluIHRoZSBoZWFkZXIgc2VhcmNoIHBhdGgsIHdoZXJlIGBHVEVTVF9ST09UYAoraXMgdGhlIEdvb2dsZSBUZXN0IHJvb3QgZGlyZWN0b3J5KS4KKworT25jZSB5b3UgYXJlIGFibGUgdG8gY29tcGlsZSB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSwgeW91IHNob3VsZAorY3JlYXRlIGEgcHJvamVjdCBvciBidWlsZCB0YXJnZXQgZm9yIHlvdXIgdGVzdCBwcm9ncmFtLiAgTWFrZSBzdXJlIHlvdQoraGF2ZSBgR1RFU1RfUk9PVC9pbmNsdWRlYCBpbiB0aGUgaGVhZGVyIHNlYXJjaCBwYXRoIHNvIHRoYXQgdGhlCitjb21waWxlciBjYW4gZmluZCBgImd0ZXN0L2d0ZXN0LmgiYCB3aGVuIGNvbXBpbGluZyB5b3VyIHRlc3QuICBTZXQgdXAKK3lvdXIgdGVzdCBwcm9qZWN0IHRvIGxpbmsgd2l0aCB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSAoZm9yIGV4YW1wbGUsCitpbiBWaXN1YWwgU3R1ZGlvLCB0aGlzIGlzIGRvbmUgYnkgYWRkaW5nIGEgZGVwZW5kZW5jeSBvbgorYGd0ZXN0LnZjcHJvamApLgorCitJZiB5b3Ugc3RpbGwgaGF2ZSBxdWVzdGlvbnMsIHRha2UgYSBsb29rIGF0IGhvdyBHb29nbGUgVGVzdCdzIG93bgordGVzdHMgYXJlIGJ1aWx0IGFuZCB1c2UgdGhlbSBhcyBleGFtcGxlcy4KKworIyBCYXNpYyBDb25jZXB0cyAjCisKK1doZW4gdXNpbmcgR29vZ2xlIFRlc3QsIHlvdSBzdGFydCBieSB3cml0aW5nIF9hc3NlcnRpb25zXywgd2hpY2ggYXJlIHN0YXRlbWVudHMKK3RoYXQgY2hlY2sgd2hldGhlciBhIGNvbmRpdGlvbiBpcyB0cnVlLiBBbiBhc3NlcnRpb24ncyByZXN1bHQgY2FuIGJlIF9zdWNjZXNzXywKK19ub25mYXRhbCBmYWlsdXJlXywgb3IgX2ZhdGFsIGZhaWx1cmVfLiBJZiBhIGZhdGFsIGZhaWx1cmUgb2NjdXJzLCBpdCBhYm9ydHMKK3RoZSBjdXJyZW50IGZ1bmN0aW9uOyBvdGhlcndpc2UgdGhlIHByb2dyYW0gY29udGludWVzIG5vcm1hbGx5LgorCitfVGVzdHNfIHVzZSBhc3NlcnRpb25zIHRvIHZlcmlmeSB0aGUgdGVzdGVkIGNvZGUncyBiZWhhdmlvci4gSWYgYSB0ZXN0IGNyYXNoZXMKK29yIGhhcyBhIGZhaWxlZCBhc3NlcnRpb24sIHRoZW4gaXQgX2ZhaWxzXzsgb3RoZXJ3aXNlIGl0IF9zdWNjZWVkc18uCisKK0EgX3Rlc3QgY2FzZV8gY29udGFpbnMgb25lIG9yIG1hbnkgdGVzdHMuIFlvdSBzaG91bGQgZ3JvdXAgeW91ciB0ZXN0cyBpbnRvIHRlc3QKK2Nhc2VzIHRoYXQgcmVmbGVjdCB0aGUgc3RydWN0dXJlIG9mIHRoZSB0ZXN0ZWQgY29kZS4gV2hlbiBtdWx0aXBsZSB0ZXN0cyBpbiBhCit0ZXN0IGNhc2UgbmVlZCB0byBzaGFyZSBjb21tb24gb2JqZWN0cyBhbmQgc3Vicm91dGluZXMsIHlvdSBjYW4gcHV0IHRoZW0gaW50byBhCitfdGVzdCBmaXh0dXJlXyBjbGFzcy4KKworQSBfdGVzdCBwcm9ncmFtXyBjYW4gY29udGFpbiBtdWx0aXBsZSB0ZXN0IGNhc2VzLgorCitXZSdsbCBub3cgZXhwbGFpbiBob3cgdG8gd3JpdGUgYSB0ZXN0IHByb2dyYW0sIHN0YXJ0aW5nIGF0IHRoZSBpbmRpdmlkdWFsCithc3NlcnRpb24gbGV2ZWwgYW5kIGJ1aWxkaW5nIHVwIHRvIHRlc3RzIGFuZCB0ZXN0IGNhc2VzLgorCisjIEFzc2VydGlvbnMgIworCitHb29nbGUgVGVzdCBhc3NlcnRpb25zIGFyZSBtYWNyb3MgdGhhdCByZXNlbWJsZSBmdW5jdGlvbiBjYWxscy4gWW91IHRlc3QgYQorY2xhc3Mgb3IgZnVuY3Rpb24gYnkgbWFraW5nIGFzc2VydGlvbnMgYWJvdXQgaXRzIGJlaGF2aW9yLiBXaGVuIGFuIGFzc2VydGlvbgorZmFpbHMsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUgYXNzZXJ0aW9uJ3Mgc291cmNlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGxvY2F0aW9uLAorYWxvbmcgd2l0aCBhIGZhaWx1cmUgbWVzc2FnZS4gWW91IG1heSBhbHNvIHN1cHBseSBhIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UKK3doaWNoIHdpbGwgYmUgYXBwZW5kZWQgdG8gR29vZ2xlIFRlc3QncyBtZXNzYWdlLgorCitUaGUgYXNzZXJ0aW9ucyBjb21lIGluIHBhaXJzIHRoYXQgdGVzdCB0aGUgc2FtZSB0aGluZyBidXQgaGF2ZSBkaWZmZXJlbnQKK2VmZmVjdHMgb24gdGhlIGN1cnJlbnQgZnVuY3Rpb24uIGBBU1NFUlRfKmAgdmVyc2lvbnMgZ2VuZXJhdGUgZmF0YWwgZmFpbHVyZXMKK3doZW4gdGhleSBmYWlsLCBhbmQgKiphYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbioqLiBgRVhQRUNUXypgIHZlcnNpb25zIGdlbmVyYXRlCitub25mYXRhbCBmYWlsdXJlcywgd2hpY2ggZG9uJ3QgYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFVzdWFsbHkgYEVYUEVDVF8qYAorYXJlIHByZWZlcnJlZCwgYXMgdGhleSBhbGxvdyBtb3JlIHRoYW4gb25lIGZhaWx1cmVzIHRvIGJlIHJlcG9ydGVkIGluIGEgdGVzdC4KK0hvd2V2ZXIsIHlvdSBzaG91bGQgdXNlIGBBU1NFUlRfKmAgaWYgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGNvbnRpbnVlIHdoZW4KK3RoZSBhc3NlcnRpb24gaW4gcXVlc3Rpb24gZmFpbHMuCisKK1NpbmNlIGEgZmFpbGVkIGBBU1NFUlRfKmAgcmV0dXJucyBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGltbWVkaWF0ZWx5LAorcG9zc2libHkgc2tpcHBpbmcgY2xlYW4tdXAgY29kZSB0aGF0IGNvbWVzIGFmdGVyIGl0LCBpdCBtYXkgY2F1c2UgYSBzcGFjZSBsZWFrLgorRGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgdGhlIGxlYWssIGl0IG1heSBvciBtYXkgbm90IGJlIHdvcnRoIGZpeGluZyAtIHNvCitrZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgZ2V0IGEgaGVhcCBjaGVja2VyIGVycm9yIGluIGFkZGl0aW9uIHRvIGFzc2VydGlvbgorZXJyb3JzLgorCitUbyBwcm92aWRlIGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZSwgc2ltcGx5IHN0cmVhbSBpdCBpbnRvIHRoZSBtYWNybyB1c2luZyB0aGUKK2A8PGAgb3BlcmF0b3IsIG9yIGEgc2VxdWVuY2Ugb2Ygc3VjaCBvcGVyYXRvcnMuIEFuIGV4YW1wbGU6CitgYGAKK0FTU0VSVF9FUSh4LnNpemUoKSwgeS5zaXplKCkpIDw8ICJWZWN0b3JzIHggYW5kIHkgYXJlIG9mIHVuZXF1YWwgbGVuZ3RoIjsKKworZm9yIChpbnQgaSA9IDA7IGkgPCB4LnNpemUoKTsgKytpKSB7CisgIEVYUEVDVF9FUSh4W2ldLCB5W2ldKSA8PCAiVmVjdG9ycyB4IGFuZCB5IGRpZmZlciBhdCBpbmRleCAiIDw8IGk7Cit9CitgYGAKKworQW55dGhpbmcgdGhhdCBjYW4gYmUgc3RyZWFtZWQgdG8gYW4gYG9zdHJlYW1gIGNhbiBiZSBzdHJlYW1lZCB0byBhbiBhc3NlcnRpb24KK21hY3JvLS1pbiBwYXJ0aWN1bGFyLCBDIHN0cmluZ3MgYW5kIGBzdHJpbmdgIG9iamVjdHMuIElmIGEgd2lkZSBzdHJpbmcKKyhgd2NoYXJfdCpgLCBgVENIQVIqYCBpbiBgVU5JQ09ERWAgbW9kZSBvbiBXaW5kb3dzLCBvciBgc3RkOjp3c3RyaW5nYCkgaXMKK3N0cmVhbWVkIHRvIGFuIGFzc2VydGlvbiwgaXQgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIFVURi04IHdoZW4gcHJpbnRlZC4KKworIyMgQmFzaWMgQXNzZXJ0aW9ucyAjIworCitUaGVzZSBhc3NlcnRpb25zIGRvIGJhc2ljIHRydWUvZmFsc2UgY29uZGl0aW9uIHRlc3RpbmcuCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfCBgQVNTRVJUX1RSVUUoYF9jb25kaXRpb25fYClgOyAgfCBgRVhQRUNUX1RSVUUoYF9jb25kaXRpb25fYClgOyAgIHwgX2NvbmRpdGlvbl8gaXMgdHJ1ZSB8Cit8IGBBU1NFUlRfRkFMU0UoYF9jb25kaXRpb25fYClgOyB8IGBFWFBFQ1RfRkFMU0UoYF9jb25kaXRpb25fYClgOyAgfCBfY29uZGl0aW9uXyBpcyBmYWxzZSB8CisKK1JlbWVtYmVyLCB3aGVuIHRoZXkgZmFpbCwgYEFTU0VSVF8qYCB5aWVsZHMgYSBmYXRhbCBmYWlsdXJlIGFuZAorcmV0dXJucyBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCB3aGlsZSBgRVhQRUNUXypgIHlpZWxkcyBhIG5vbmZhdGFsCitmYWlsdXJlLCBhbGxvd2luZyB0aGUgZnVuY3Rpb24gdG8gY29udGludWUgcnVubmluZy4gSW4gZWl0aGVyIGNhc2UsIGFuCithc3NlcnRpb24gZmFpbHVyZSBtZWFucyBpdHMgY29udGFpbmluZyB0ZXN0IGZhaWxzLgorCitfQXZhaWxhYmlsaXR5XzogTGludXgsIFdpbmRvd3MsIE1hYy4KKworIyMgQmluYXJ5IENvbXBhcmlzb24gIyMKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhc3NlcnRpb25zIHRoYXQgY29tcGFyZSB0d28gdmFsdWVzLgorCit8ICoqRmF0YWwgYXNzZXJ0aW9uKiogfCAqKk5vbmZhdGFsIGFzc2VydGlvbioqIHwgKipWZXJpZmllcyoqIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tfAorfGBBU1NFUlRfRVEoYF9leHBlY3RlZF9gLCBgX2FjdHVhbF9gKTtgfGBFWFBFQ1RfRVEoYF9leHBlY3RlZF9gLCBgX2FjdHVhbF9gKTtgfCBfZXhwZWN0ZWRfIGA9PWAgX2FjdHVhbF8gfAorfGBBU1NFUlRfTkUoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfGBFWFBFQ1RfTkUoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfCBfdmFsMV8gYCE9YCBfdmFsMl8gfAorfGBBU1NFUlRfTFQoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfGBFWFBFQ1RfTFQoYF92YWwxX2AsIGBfdmFsMl9gKTtgICAgICAgfCBfdmFsMV8gYDxgIF92YWwyXyB8Cit8YEFTU0VSVF9MRShgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8YEVYUEVDVF9MRShgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8IF92YWwxXyBgPD1gIF92YWwyXyB8Cit8YEFTU0VSVF9HVChgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8YEVYUEVDVF9HVChgX3ZhbDFfYCwgYF92YWwyX2ApO2AgICAgICB8IF92YWwxXyBgPmAgX3ZhbDJfIHwKK3xgQVNTRVJUX0dFKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHxgRVhQRUNUX0dFKGBfdmFsMV9gLCBgX3ZhbDJfYCk7YCAgICAgIHwgX3ZhbDFfIGA+PWAgX3ZhbDJfIHwKKworSW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZSwgR29vZ2xlIFRlc3QgcHJpbnRzIGJvdGggX3ZhbDFfIGFuZCBfdmFsMl8KKy4gSW4gYEFTU0VSVF9FUSpgIGFuZCBgRVhQRUNUX0VRKmAgKGFuZCBhbGwgb3RoZXIgZXF1YWxpdHkgYXNzZXJ0aW9ucword2UnbGwgaW50cm9kdWNlIGxhdGVyKSwgeW91IHNob3VsZCBwdXQgdGhlIGV4cHJlc3Npb24geW91IHdhbnQgdG8gdGVzdAoraW4gdGhlIHBvc2l0aW9uIG9mIF9hY3R1YWxfLCBhbmQgcHV0IGl0cyBleHBlY3RlZCB2YWx1ZSBpbiBfZXhwZWN0ZWRfLAorYXMgR29vZ2xlIFRlc3QncyBmYWlsdXJlIG1lc3NhZ2VzIGFyZSBvcHRpbWl6ZWQgZm9yIHRoaXMgY29udmVudGlvbi4KKworVmFsdWUgYXJndW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSBieSB0aGUgYXNzZXJ0aW9uJ3MgY29tcGFyaXNvbgorb3BlcmF0b3Igb3IgeW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yLiAgV2UgdXNlZCB0byByZXF1aXJlIHRoZQorYXJndW1lbnRzIHRvIHN1cHBvcnQgdGhlIGA8PGAgb3BlcmF0b3IgZm9yIHN0cmVhbWluZyB0byBhbiBgb3N0cmVhbWAsCitidXQgaXQncyBubyBsb25nZXIgbmVjZXNzYXJ5IHNpbmNlIHYxLjYuMCAoaWYgYDw8YCBpcyBzdXBwb3J0ZWQsIGl0Cit3aWxsIGJlIGNhbGxlZCB0byBwcmludCB0aGUgYXJndW1lbnRzIHdoZW4gdGhlIGFzc2VydGlvbiBmYWlsczsKK290aGVyd2lzZSBHb29nbGUgVGVzdCB3aWxsIGF0dGVtcHQgdG8gcHJpbnQgdGhlbSBpbiB0aGUgYmVzdCB3YXkgaXQKK2Nhbi4gRm9yIG1vcmUgZGV0YWlscyBhbmQgaG93IHRvIGN1c3RvbWl6ZSB0aGUgcHJpbnRpbmcgb2YgdGhlCithcmd1bWVudHMsIHNlZSB0aGlzIEdvb2dsZSBNb2NrIFtyZWNpcGVdKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2sjVGVhY2hpbmdfR29vZ2xlX01vY2tfSG93X3RvX1ByaW50X1lvdXJfVmFsdWVzKS4pLgorCitUaGVzZSBhc3NlcnRpb25zIGNhbiB3b3JrIHdpdGggYSB1c2VyLWRlZmluZWQgdHlwZSwgYnV0IG9ubHkgaWYgeW91IGRlZmluZSB0aGUKK2NvcnJlc3BvbmRpbmcgY29tcGFyaXNvbiBvcGVyYXRvciAoZS5nLiBgPT1gLCBgPGAsIGV0YykuICBJZiB0aGUgY29ycmVzcG9uZGluZworb3BlcmF0b3IgaXMgZGVmaW5lZCwgcHJlZmVyIHVzaW5nIHRoZSBgQVNTRVJUXyooKWAgbWFjcm9zIGJlY2F1c2UgdGhleSB3aWxsCitwcmludCBvdXQgbm90IG9ubHkgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiwgYnV0IHRoZSB0d28gb3BlcmFuZHMgYXMgd2VsbC4KKworQXJndW1lbnRzIGFyZSBhbHdheXMgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4gVGhlcmVmb3JlLCBpdCdzIE9LIGZvciB0aGUKK2FyZ3VtZW50cyB0byBoYXZlIHNpZGUgZWZmZWN0cy4gSG93ZXZlciwgYXMgd2l0aCBhbnkgb3JkaW5hcnkgQy9DKysgZnVuY3Rpb24sCit0aGUgYXJndW1lbnRzJyBldmFsdWF0aW9uIG9yZGVyIGlzIHVuZGVmaW5lZCAoaS5lLiB0aGUgY29tcGlsZXIgaXMgZnJlZSB0bworY2hvb3NlIGFueSBvcmRlcikgYW5kIHlvdXIgY29kZSBzaG91bGQgbm90IGRlcGVuZCBvbiBhbnkgcGFydGljdWxhciBhcmd1bWVudAorZXZhbHVhdGlvbiBvcmRlci4KKworYEFTU0VSVF9FUSgpYCBkb2VzIHBvaW50ZXIgZXF1YWxpdHkgb24gcG9pbnRlcnMuIElmIHVzZWQgb24gdHdvIEMgc3RyaW5ncywgaXQKK3Rlc3RzIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiwgbm90IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4KK1RoZXJlZm9yZSwgaWYgeW91IHdhbnQgdG8gY29tcGFyZSBDIHN0cmluZ3MgKGUuZy4gYGNvbnN0IGNoYXIqYCkgYnkgdmFsdWUsIHVzZQorYEFTU0VSVF9TVFJFUSgpYCAsIHdoaWNoIHdpbGwgYmUgZGVzY3JpYmVkIGxhdGVyIG9uLiBJbiBwYXJ0aWN1bGFyLCB0byBhc3NlcnQKK3RoYXQgYSBDIHN0cmluZyBpcyBgTlVMTGAsIHVzZSBgQVNTRVJUX1NUUkVRKE5VTEwsIGNfc3RyaW5nKWAgLiBIb3dldmVyLCB0bworY29tcGFyZSB0d28gYHN0cmluZ2Agb2JqZWN0cywgeW91IHNob3VsZCB1c2UgYEFTU0VSVF9FUWAuCisKK01hY3JvcyBpbiB0aGlzIHNlY3Rpb24gd29yayB3aXRoIGJvdGggbmFycm93IGFuZCB3aWRlIHN0cmluZyBvYmplY3RzIChgc3RyaW5nYAorYW5kIGB3c3RyaW5nYCkuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIyBTdHJpbmcgQ29tcGFyaXNvbiAjIworCitUaGUgYXNzZXJ0aW9ucyBpbiB0aGlzIGdyb3VwIGNvbXBhcmUgdHdvICoqQyBzdHJpbmdzKiouIElmIHlvdSB3YW50IHRvIGNvbXBhcmUKK3R3byBgc3RyaW5nYCBvYmplY3RzLCB1c2UgYEVYUEVDVF9FUWAsIGBFWFBFQ1RfTkVgLCBhbmQgZXRjIGluc3RlYWQuCisKK3wgKipGYXRhbCBhc3NlcnRpb24qKiB8ICoqTm9uZmF0YWwgYXNzZXJ0aW9uKiogfCAqKlZlcmlmaWVzKiogfAorfDotLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS18Cit8IGBBU1NFUlRfU1RSRVEoYF9leHBlY3RlZFxfc3RyX2AsIGBfYWN0dWFsXF9zdHJfYCk7YCAgICB8IGBFWFBFQ1RfU1RSRVEoYF9leHBlY3RlZFxfc3RyX2AsIGBfYWN0dWFsXF9zdHJfYCk7YCAgICAgfCB0aGUgdHdvIEMgc3RyaW5ncyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQgfAorfCBgQVNTRVJUX1NUUk5FKGBfc3RyMV9gLCBgX3N0cjJfYCk7YCAgICB8IGBFWFBFQ1RfU1RSTkUoYF9zdHIxX2AsIGBfc3RyMl9gKTtgICAgICB8IHRoZSB0d28gQyBzdHJpbmdzIGhhdmUgZGlmZmVyZW50IGNvbnRlbnQgfAorfCBgQVNTRVJUX1NUUkNBU0VFUShgX2V4cGVjdGVkXF9zdHJfYCwgYF9hY3R1YWxcX3N0cl9gKTtgfCBgRVhQRUNUX1NUUkNBU0VFUShgX2V4cGVjdGVkXF9zdHJfYCwgYF9hY3R1YWxcX3N0cl9gKTtgIHwgdGhlIHR3byBDIHN0cmluZ3MgaGF2ZSB0aGUgc2FtZSBjb250ZW50LCBpZ25vcmluZyBjYXNlIHwKK3wgYEFTU0VSVF9TVFJDQVNFTkUoYF9zdHIxX2AsIGBfc3RyMl9gKTtgfCBgRVhQRUNUX1NUUkNBU0VORShgX3N0cjFfYCwgYF9zdHIyX2ApO2AgfCB0aGUgdHdvIEMgc3RyaW5ncyBoYXZlIGRpZmZlcmVudCBjb250ZW50LCBpZ25vcmluZyBjYXNlIHwKKworTm90ZSB0aGF0ICJDQVNFIiBpbiBhbiBhc3NlcnRpb24gbmFtZSBtZWFucyB0aGF0IGNhc2UgaXMgaWdub3JlZC4KKworYCpTVFJFUSpgIGFuZCBgKlNUUk5FKmAgYWxzbyBhY2NlcHQgd2lkZSBDIHN0cmluZ3MgKGB3Y2hhcl90KmApLiBJZiBhCitjb21wYXJpc29uIG9mIHR3byB3aWRlIHN0cmluZ3MgZmFpbHMsIHRoZWlyIHZhbHVlcyB3aWxsIGJlIHByaW50ZWQgYXMgVVRGLTgKK25hcnJvdyBzdHJpbmdzLgorCitBIGBOVUxMYCBwb2ludGVyIGFuZCBhbiBlbXB0eSBzdHJpbmcgYXJlIGNvbnNpZGVyZWQgX2RpZmZlcmVudF8uCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCitTZWUgYWxzbzogRm9yIG1vcmUgc3RyaW5nIGNvbXBhcmlzb24gdHJpY2tzIChzdWJzdHJpbmcsIHByZWZpeCwgc3VmZml4LCBhbmQKK3JlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZywgZm9yIGV4YW1wbGUpLCBzZWUgdGhlIFtBZHZhbmNlZCBHb29nbGUgVGVzdCBHdWlkZV0oVjFfN19BZHZhbmNlZEd1aWRlLm1kKS4KKworIyBTaW1wbGUgVGVzdHMgIworCitUbyBjcmVhdGUgYSB0ZXN0OgorICAxLiBVc2UgdGhlIGBURVNUKClgIG1hY3JvIHRvIGRlZmluZSBhbmQgbmFtZSBhIHRlc3QgZnVuY3Rpb24sIFRoZXNlIGFyZSBvcmRpbmFyeSBDKysgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgcmV0dXJuIGEgdmFsdWUuCisgIDEuIEluIHRoaXMgZnVuY3Rpb24sIGFsb25nIHdpdGggYW55IHZhbGlkIEMrKyBzdGF0ZW1lbnRzIHlvdSB3YW50IHRvIGluY2x1ZGUsIHVzZSB0aGUgdmFyaW91cyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIHRvIGNoZWNrIHZhbHVlcy4KKyAgMS4gVGhlIHRlc3QncyByZXN1bHQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNzZXJ0aW9uczsgaWYgYW55IGFzc2VydGlvbiBpbiB0aGUgdGVzdCBmYWlscyAoZWl0aGVyIGZhdGFsbHkgb3Igbm9uLWZhdGFsbHkpLCBvciBpZiB0aGUgdGVzdCBjcmFzaGVzLCB0aGUgZW50aXJlIHRlc3QgZmFpbHMuIE90aGVyd2lzZSwgaXQgc3VjY2VlZHMuCisKK2BgYAorVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSB7CisgLi4uIHRlc3QgYm9keSAuLi4KK30KK2BgYAorCisKK2BURVNUKClgIGFyZ3VtZW50cyBnbyBmcm9tIGdlbmVyYWwgdG8gc3BlY2lmaWMuIFRoZSBfZmlyc3RfIGFyZ3VtZW50IGlzIHRoZQorbmFtZSBvZiB0aGUgdGVzdCBjYXNlLCBhbmQgdGhlIF9zZWNvbmRfIGFyZ3VtZW50IGlzIHRoZSB0ZXN0J3MgbmFtZSB3aXRoaW4gdGhlCit0ZXN0IGNhc2UuIEJvdGggbmFtZXMgbXVzdCBiZSB2YWxpZCBDKysgaWRlbnRpZmllcnMsIGFuZCB0aGV5IHNob3VsZCBub3QgY29udGFpbiB1bmRlcnNjb3JlIChgX2ApLiBBIHRlc3QncyBfZnVsbCBuYW1lXyBjb25zaXN0cyBvZiBpdHMgY29udGFpbmluZyB0ZXN0IGNhc2UgYW5kIGl0cworaW5kaXZpZHVhbCBuYW1lLiBUZXN0cyBmcm9tIGRpZmZlcmVudCB0ZXN0IGNhc2VzIGNhbiBoYXZlIHRoZSBzYW1lIGluZGl2aWR1YWwKK25hbWUuCisKK0ZvciBleGFtcGxlLCBsZXQncyB0YWtlIGEgc2ltcGxlIGludGVnZXIgZnVuY3Rpb246CitgYGAKK2ludCBGYWN0b3JpYWwoaW50IG4pOyAvLyBSZXR1cm5zIHRoZSBmYWN0b3JpYWwgb2YgbgorYGBgCisKK0EgdGVzdCBjYXNlIGZvciB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGxvb2sgbGlrZToKK2BgYAorLy8gVGVzdHMgZmFjdG9yaWFsIG9mIDAuCitURVNUKEZhY3RvcmlhbFRlc3QsIEhhbmRsZXNaZXJvSW5wdXQpIHsKKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgwKSk7Cit9CisKKy8vIFRlc3RzIGZhY3RvcmlhbCBvZiBwb3NpdGl2ZSBudW1iZXJzLgorVEVTVChGYWN0b3JpYWxUZXN0LCBIYW5kbGVzUG9zaXRpdmVJbnB1dCkgeworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDEpKTsKKyAgRVhQRUNUX0VRKDIsIEZhY3RvcmlhbCgyKSk7CisgIEVYUEVDVF9FUSg2LCBGYWN0b3JpYWwoMykpOworICBFWFBFQ1RfRVEoNDAzMjAsIEZhY3RvcmlhbCg4KSk7Cit9CitgYGAKKworR29vZ2xlIFRlc3QgZ3JvdXBzIHRoZSB0ZXN0IHJlc3VsdHMgYnkgdGVzdCBjYXNlcywgc28gbG9naWNhbGx5LXJlbGF0ZWQgdGVzdHMKK3Nob3VsZCBiZSBpbiB0aGUgc2FtZSB0ZXN0IGNhc2U7IGluIG90aGVyIHdvcmRzLCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlaXIKK2BURVNUKClgIHNob3VsZCBiZSB0aGUgc2FtZS4gSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHdlIGhhdmUgdHdvIHRlc3RzLAorYEhhbmRsZXNaZXJvSW5wdXRgIGFuZCBgSGFuZGxlc1Bvc2l0aXZlSW5wdXRgLCB0aGF0IGJlbG9uZyB0byB0aGUgc2FtZSB0ZXN0CitjYXNlIGBGYWN0b3JpYWxUZXN0YC4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKKyMgVGVzdCBGaXh0dXJlczogVXNpbmcgdGhlIFNhbWUgRGF0YSBDb25maWd1cmF0aW9uIGZvciBNdWx0aXBsZSBUZXN0cyAjCisKK0lmIHlvdSBmaW5kIHlvdXJzZWxmIHdyaXRpbmcgdHdvIG9yIG1vcmUgdGVzdHMgdGhhdCBvcGVyYXRlIG9uIHNpbWlsYXIgZGF0YSwKK3lvdSBjYW4gdXNlIGEgX3Rlc3QgZml4dHVyZV8uIEl0IGFsbG93cyB5b3UgdG8gcmV1c2UgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBvZgorb2JqZWN0cyBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgdGVzdHMuCisKK1RvIGNyZWF0ZSBhIGZpeHR1cmUsIGp1c3Q6CisgIDEuIERlcml2ZSBhIGNsYXNzIGZyb20gYDo6dGVzdGluZzo6VGVzdGAgLiBTdGFydCBpdHMgYm9keSB3aXRoIGBwcm90ZWN0ZWQ6YCBvciBgcHVibGljOmAgYXMgd2UnbGwgd2FudCB0byBhY2Nlc3MgZml4dHVyZSBtZW1iZXJzIGZyb20gc3ViLWNsYXNzZXMuCisgIDEuIEluc2lkZSB0aGUgY2xhc3MsIGRlY2xhcmUgYW55IG9iamVjdHMgeW91IHBsYW4gdG8gdXNlLgorICAxLiBJZiBuZWNlc3NhcnksIHdyaXRlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciBvciBgU2V0VXAoKWAgZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgb2JqZWN0cyBmb3IgZWFjaCB0ZXN0LiBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHNwZWxsIGBTZXRVcCgpYCBhcyBgU2V0dXAoKWAgd2l0aCBhIHNtYWxsIGB1YCAtIGRvbid0IGxldCB0aGF0IGhhcHBlbiB0byB5b3UuCisgIDEuIElmIG5lY2Vzc2FyeSwgd3JpdGUgYSBkZXN0cnVjdG9yIG9yIGBUZWFyRG93bigpYCBmdW5jdGlvbiB0byByZWxlYXNlIGFueSByZXNvdXJjZXMgeW91IGFsbG9jYXRlZCBpbiBgU2V0VXAoKWAgLiBUbyBsZWFybiB3aGVuIHlvdSBzaG91bGQgdXNlIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGFuZCB3aGVuIHlvdSBzaG91bGQgdXNlIGBTZXRVcCgpL1RlYXJEb3duKClgLCByZWFkIHRoaXMgW0ZBUSBlbnRyeV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9WMV83X0ZBUSNTaG91bGRfSV91c2VfdGhlX2NvbnN0cnVjdG9yL2Rlc3RydWN0b3Jfb2ZfdGhlX3Rlc3RfZml4dHVyZV9vcl90KS4KKyAgMS4gSWYgbmVlZGVkLCBkZWZpbmUgc3Vicm91dGluZXMgZm9yIHlvdXIgdGVzdHMgdG8gc2hhcmUuCisKK1doZW4gdXNpbmcgYSBmaXh0dXJlLCB1c2UgYFRFU1RfRigpYCBpbnN0ZWFkIG9mIGBURVNUKClgIGFzIGl0IGFsbG93cyB5b3UgdG8KK2FjY2VzcyBvYmplY3RzIGFuZCBzdWJyb3V0aW5lcyBpbiB0aGUgdGVzdCBmaXh0dXJlOgorYGBgCitURVNUX0YodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgeworIC4uLiB0ZXN0IGJvZHkgLi4uCit9CitgYGAKKworTGlrZSBgVEVTVCgpYCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSB0ZXN0IGNhc2UgbmFtZSwgYnV0IGZvciBgVEVTVF9GKClgCit0aGlzIG11c3QgYmUgdGhlIG5hbWUgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcy4gWW91J3ZlIHByb2JhYmx5IGd1ZXNzZWQ6IGBfRmAKK2lzIGZvciBmaXh0dXJlLgorCitVbmZvcnR1bmF0ZWx5LCB0aGUgQysrIG1hY3JvIHN5c3RlbSBkb2VzIG5vdCBhbGxvdyB1cyB0byBjcmVhdGUgYSBzaW5nbGUgbWFjcm8KK3RoYXQgY2FuIGhhbmRsZSBib3RoIHR5cGVzIG9mIHRlc3RzLiBVc2luZyB0aGUgd3JvbmcgbWFjcm8gY2F1c2VzIGEgY29tcGlsZXIKK2Vycm9yLgorCitBbHNvLCB5b3UgbXVzdCBmaXJzdCBkZWZpbmUgYSB0ZXN0IGZpeHR1cmUgY2xhc3MgYmVmb3JlIHVzaW5nIGl0IGluIGEKK2BURVNUX0YoKWAsIG9yIHlvdSdsbCBnZXQgdGhlIGNvbXBpbGVyIGVycm9yICJgdmlydHVhbCBvdXRzaWRlIGNsYXNzCitkZWNsYXJhdGlvbmAiLgorCitGb3IgZWFjaCB0ZXN0IGRlZmluZWQgd2l0aCBgVEVTVF9GKClgLCBHb29nbGUgVGVzdCB3aWxsOgorICAxLiBDcmVhdGUgYSBfZnJlc2hfIHRlc3QgZml4dHVyZSBhdCBydW50aW1lCisgIDEuIEltbWVkaWF0ZWx5IGluaXRpYWxpemUgaXQgdmlhIGBTZXRVcCgpYCAsCisgIDEuIFJ1biB0aGUgdGVzdAorICAxLiBDbGVhbiB1cCBieSBjYWxsaW5nIGBUZWFyRG93bigpYAorICAxLiBEZWxldGUgdGhlIHRlc3QgZml4dHVyZS4gIE5vdGUgdGhhdCBkaWZmZXJlbnQgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIGhhdmUgZGlmZmVyZW50IHRlc3QgZml4dHVyZSBvYmplY3RzLCBhbmQgR29vZ2xlIFRlc3QgYWx3YXlzIGRlbGV0ZXMgYSB0ZXN0IGZpeHR1cmUgYmVmb3JlIGl0IGNyZWF0ZXMgdGhlIG5leHQgb25lLiBHb29nbGUgVGVzdCBkb2VzIG5vdCByZXVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUgZm9yIG11bHRpcGxlIHRlc3RzLiBBbnkgY2hhbmdlcyBvbmUgdGVzdCBtYWtlcyB0byB0aGUgZml4dHVyZSBkbyBub3QgYWZmZWN0IG90aGVyIHRlc3RzLgorCitBcyBhbiBleGFtcGxlLCBsZXQncyB3cml0ZSB0ZXN0cyBmb3IgYSBGSUZPIHF1ZXVlIGNsYXNzIG5hbWVkIGBRdWV1ZWAsIHdoaWNoCitoYXMgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6CitgYGAKK3RlbXBsYXRlIDx0eXBlbmFtZSBFPiAvLyBFIGlzIHRoZSBlbGVtZW50IHR5cGUuCitjbGFzcyBRdWV1ZSB7CisgcHVibGljOgorICBRdWV1ZSgpOworICB2b2lkIEVucXVldWUoY29uc3QgRSYgZWxlbWVudCk7CisgIEUqIERlcXVldWUoKTsgLy8gUmV0dXJucyBOVUxMIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAgc2l6ZV90IHNpemUoKSBjb25zdDsKKyAgLi4uCit9OworYGBgCisKK0ZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzLiBCeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGdpdmUgaXQgdGhlIG5hbWUKK2BGb29UZXN0YCB3aGVyZSBgRm9vYCBpcyB0aGUgY2xhc3MgYmVpbmcgdGVzdGVkLgorYGBgCitjbGFzcyBRdWV1ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBxMV8uRW5xdWV1ZSgxKTsKKyAgICBxMl8uRW5xdWV1ZSgyKTsKKyAgICBxMl8uRW5xdWV1ZSgzKTsKKyAgfQorCisgIC8vIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHt9CisKKyAgUXVldWU8aW50PiBxMF87CisgIFF1ZXVlPGludD4gcTFfOworICBRdWV1ZTxpbnQ+IHEyXzsKK307CitgYGAKKworSW4gdGhpcyBjYXNlLCBgVGVhckRvd24oKWAgaXMgbm90IG5lZWRlZCBzaW5jZSB3ZSBkb24ndCBoYXZlIHRvIGNsZWFuIHVwIGFmdGVyCitlYWNoIHRlc3QsIG90aGVyIHRoYW4gd2hhdCdzIGFscmVhZHkgZG9uZSBieSB0aGUgZGVzdHJ1Y3Rvci4KKworTm93IHdlJ2xsIHdyaXRlIHRlc3RzIHVzaW5nIGBURVNUX0YoKWAgYW5kIHRoaXMgZml4dHVyZS4KK2BgYAorVEVTVF9GKFF1ZXVlVGVzdCwgSXNFbXB0eUluaXRpYWxseSkgeworICBFWFBFQ1RfRVEoMCwgcTBfLnNpemUoKSk7Cit9CisKK1RFU1RfRihRdWV1ZVRlc3QsIERlcXVldWVXb3JrcykgeworICBpbnQqIG4gPSBxMF8uRGVxdWV1ZSgpOworICBFWFBFQ1RfRVEoTlVMTCwgbik7CisKKyAgbiA9IHExXy5EZXF1ZXVlKCk7CisgIEFTU0VSVF9UUlVFKG4gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgxLCAqbik7CisgIEVYUEVDVF9FUSgwLCBxMV8uc2l6ZSgpKTsKKyAgZGVsZXRlIG47CisKKyAgbiA9IHEyXy5EZXF1ZXVlKCk7CisgIEFTU0VSVF9UUlVFKG4gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgyLCAqbik7CisgIEVYUEVDVF9FUSgxLCBxMl8uc2l6ZSgpKTsKKyAgZGVsZXRlIG47Cit9CitgYGAKKworVGhlIGFib3ZlIHVzZXMgYm90aCBgQVNTRVJUXypgIGFuZCBgRVhQRUNUXypgIGFzc2VydGlvbnMuIFRoZSBydWxlIG9mIHRodW1iIGlzCit0byB1c2UgYEVYUEVDVF8qYCB3aGVuIHlvdSB3YW50IHRoZSB0ZXN0IHRvIGNvbnRpbnVlIHRvIHJldmVhbCBtb3JlIGVycm9ycworYWZ0ZXIgdGhlIGFzc2VydGlvbiBmYWlsdXJlLCBhbmQgdXNlIGBBU1NFUlRfKmAgd2hlbiBjb250aW51aW5nIGFmdGVyIGZhaWx1cmUKK2RvZXNuJ3QgbWFrZSBzZW5zZS4gRm9yIGV4YW1wbGUsIHRoZSBzZWNvbmQgYXNzZXJ0aW9uIGluIHRoZSBgRGVxdWV1ZWAgdGVzdCBpcworYEFTU0VSVF9UUlVFKG4gIT0gTlVMTClgLCBhcyB3ZSBuZWVkIHRvIGRlcmVmZXJlbmNlIHRoZSBwb2ludGVyIGBuYCBsYXRlciwKK3doaWNoIHdvdWxkIGxlYWQgdG8gYSBzZWdmYXVsdCB3aGVuIGBuYCBpcyBgTlVMTGAuCisKK1doZW4gdGhlc2UgdGVzdHMgcnVuLCB0aGUgZm9sbG93aW5nIGhhcHBlbnM6CisgIDEuIEdvb2dsZSBUZXN0IGNvbnN0cnVjdHMgYSBgUXVldWVUZXN0YCBvYmplY3QgKGxldCdzIGNhbGwgaXQgYHQxYCApLgorICAxLiBgdDEuU2V0VXAoKWAgaW5pdGlhbGl6ZXMgYHQxYCAuCisgIDEuIFRoZSBmaXJzdCB0ZXN0ICggYElzRW1wdHlJbml0aWFsbHlgICkgcnVucyBvbiBgdDFgIC4KKyAgMS4gYHQxLlRlYXJEb3duKClgIGNsZWFucyB1cCBhZnRlciB0aGUgdGVzdCBmaW5pc2hlcy4KKyAgMS4gYHQxYCBpcyBkZXN0cnVjdGVkLgorICAxLiBUaGUgYWJvdmUgc3RlcHMgYXJlIHJlcGVhdGVkIG9uIGFub3RoZXIgYFF1ZXVlVGVzdGAgb2JqZWN0LCB0aGlzIHRpbWUgcnVubmluZyB0aGUgYERlcXVldWVXb3Jrc2AgdGVzdC4KKworX0F2YWlsYWJpbGl0eV86IExpbnV4LCBXaW5kb3dzLCBNYWMuCisKK19Ob3RlXzogR29vZ2xlIFRlc3QgYXV0b21hdGljYWxseSBzYXZlcyBhbGwgX0dvb2dsZSBUZXN0XyBmbGFncyB3aGVuIGEgdGVzdAorb2JqZWN0IGlzIGNvbnN0cnVjdGVkLCBhbmQgcmVzdG9yZXMgdGhlbSB3aGVuIGl0IGlzIGRlc3RydWN0ZWQuCisKKyMgSW52b2tpbmcgdGhlIFRlc3RzICMKKworYFRFU1QoKWAgYW5kIGBURVNUX0YoKWAgaW1wbGljaXRseSByZWdpc3RlciB0aGVpciB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0LiBTbywgdW5saWtlIHdpdGggbWFueSBvdGhlciBDKysgdGVzdGluZyBmcmFtZXdvcmtzLCB5b3UgZG9uJ3QgaGF2ZSB0byByZS1saXN0IGFsbCB5b3VyIGRlZmluZWQgdGVzdHMgaW4gb3JkZXIgdG8gcnVuIHRoZW0uCisKK0FmdGVyIGRlZmluaW5nIHlvdXIgdGVzdHMsIHlvdSBjYW4gcnVuIHRoZW0gd2l0aCBgUlVOX0FMTF9URVNUUygpYCAsIHdoaWNoIHJldHVybnMgYDBgIGlmIGFsbCB0aGUgdGVzdHMgYXJlIHN1Y2Nlc3NmdWwsIG9yIGAxYCBvdGhlcndpc2UuIE5vdGUgdGhhdCBgUlVOX0FMTF9URVNUUygpYCBydW5zIF9hbGwgdGVzdHNfIGluIHlvdXIgbGluayB1bml0IC0tIHRoZXkgY2FuIGJlIGZyb20gZGlmZmVyZW50IHRlc3QgY2FzZXMsIG9yIGV2ZW4gZGlmZmVyZW50IHNvdXJjZSBmaWxlcy4KKworV2hlbiBpbnZva2VkLCB0aGUgYFJVTl9BTExfVEVTVFMoKWAgbWFjcm86CisgIDEuIFNhdmVzIHRoZSBzdGF0ZSBvZiBhbGwgIEdvb2dsZSBUZXN0IGZsYWdzLgorICAxLiBDcmVhdGVzIGEgdGVzdCBmaXh0dXJlIG9iamVjdCBmb3IgdGhlIGZpcnN0IHRlc3QuCisgIDEuIEluaXRpYWxpemVzIGl0IHZpYSBgU2V0VXAoKWAuCisgIDEuIFJ1bnMgdGhlIHRlc3Qgb24gdGhlIGZpeHR1cmUgb2JqZWN0LgorICAxLiBDbGVhbnMgdXAgdGhlIGZpeHR1cmUgdmlhIGBUZWFyRG93bigpYC4KKyAgMS4gRGVsZXRlcyB0aGUgZml4dHVyZS4KKyAgMS4gUmVzdG9yZXMgdGhlIHN0YXRlIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncy4KKyAgMS4gUmVwZWF0cyB0aGUgYWJvdmUgc3RlcHMgZm9yIHRoZSBuZXh0IHRlc3QsIHVudGlsIGFsbCB0ZXN0cyBoYXZlIHJ1bi4KKworSW4gYWRkaXRpb24sIGlmIHRoZSB0ZXh0IGZpeHR1cmUncyBjb25zdHJ1Y3RvciBnZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlIGluCitzdGVwIDIsIHRoZXJlIGlzIG5vIHBvaW50IGZvciBzdGVwIDMgLSA1IGFuZCB0aGV5IGFyZSB0aHVzIHNraXBwZWQuIFNpbWlsYXJseSwKK2lmIHN0ZXAgMyBnZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlLCBzdGVwIDQgd2lsbCBiZSBza2lwcGVkLgorCitfSW1wb3J0YW50XzogWW91IG11c3Qgbm90IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGBSVU5fQUxMX1RFU1RTKClgLCBvciBgZ2NjYAord2lsbCBnaXZlIHlvdSBhIGNvbXBpbGVyIGVycm9yLiBUaGUgcmF0aW9uYWxlIGZvciB0aGlzIGRlc2lnbiBpcyB0aGF0IHRoZQorYXV0b21hdGVkIHRlc3Rpbmcgc2VydmljZSBkZXRlcm1pbmVzIHdoZXRoZXIgYSB0ZXN0IGhhcyBwYXNzZWQgYmFzZWQgb24gaXRzCitleGl0IGNvZGUsIG5vdCBvbiBpdHMgc3Rkb3V0L3N0ZGVyciBvdXRwdXQ7IHRodXMgeW91ciBgbWFpbigpYCBmdW5jdGlvbiBtdXN0CityZXR1cm4gdGhlIHZhbHVlIG9mIGBSVU5fQUxMX1RFU1RTKClgLgorCitBbHNvLCB5b3Ugc2hvdWxkIGNhbGwgYFJVTl9BTExfVEVTVFMoKWAgb25seSAqKm9uY2UqKi4gQ2FsbGluZyBpdCBtb3JlIHRoYW4gb25jZQorY29uZmxpY3RzIHdpdGggc29tZSBhZHZhbmNlZCBHb29nbGUgVGVzdCBmZWF0dXJlcyAoZS5nLiB0aHJlYWQtc2FmZSBkZWF0aAordGVzdHMpIGFuZCB0aHVzIGlzIG5vdCBzdXBwb3J0ZWQuCisKK19BdmFpbGFiaWxpdHlfOiBMaW51eCwgV2luZG93cywgTWFjLgorCisjIFdyaXRpbmcgdGhlIG1haW4oKSBGdW5jdGlvbiAjCisKK1lvdSBjYW4gc3RhcnQgZnJvbSB0aGlzIGJvaWxlcnBsYXRlOgorYGBgCisjaW5jbHVkZSAidGhpcy9wYWNrYWdlL2Zvby5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKKy8vIFRoZSBmaXh0dXJlIGZvciB0ZXN0aW5nIGNsYXNzIEZvby4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFlvdSBjYW4gcmVtb3ZlIGFueSBvciBhbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaWYgaXRzIGJvZHkKKyAgLy8gaXMgZW1wdHkuCisKKyAgRm9vVGVzdCgpIHsKKyAgICAvLyBZb3UgY2FuIGRvIHNldC11cCB3b3JrIGZvciBlYWNoIHRlc3QgaGVyZS4KKyAgfQorCisgIHZpcnR1YWwgfkZvb1Rlc3QoKSB7CisgICAgLy8gWW91IGNhbiBkbyBjbGVhbi11cCB3b3JrIHRoYXQgZG9lc24ndCB0aHJvdyBleGNlcHRpb25zIGhlcmUuCisgIH0KKworICAvLyBJZiB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgYXJlIG5vdCBlbm91Z2ggZm9yIHNldHRpbmcgdXAKKyAgLy8gYW5kIGNsZWFuaW5nIHVwIGVhY2ggdGVzdCwgeW91IGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBDb2RlIGhlcmUgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIChyaWdodAorICAgIC8vIGJlZm9yZSBlYWNoIHRlc3QpLgorICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIC8vIENvZGUgaGVyZSB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBlYWNoIHRlc3QgKHJpZ2h0CisgICAgLy8gYmVmb3JlIHRoZSBkZXN0cnVjdG9yKS4KKyAgfQorCisgIC8vIE9iamVjdHMgZGVjbGFyZWQgaGVyZSBjYW4gYmUgdXNlZCBieSBhbGwgdGVzdHMgaW4gdGhlIHRlc3QgY2FzZSBmb3IgRm9vLgorfTsKKworLy8gVGVzdHMgdGhhdCB0aGUgRm9vOjpCYXIoKSBtZXRob2QgZG9lcyBBYmMuCitURVNUX0YoRm9vVGVzdCwgTWV0aG9kQmFyRG9lc0FiYykgeworICBjb25zdCBzdHJpbmcgaW5wdXRfZmlsZXBhdGggPSAidGhpcy9wYWNrYWdlL3Rlc3RkYXRhL215aW5wdXRmaWxlLmRhdCI7CisgIGNvbnN0IHN0cmluZyBvdXRwdXRfZmlsZXBhdGggPSAidGhpcy9wYWNrYWdlL3Rlc3RkYXRhL215b3V0cHV0ZmlsZS5kYXQiOworICBGb28gZjsKKyAgRVhQRUNUX0VRKDAsIGYuQmFyKGlucHV0X2ZpbGVwYXRoLCBvdXRwdXRfZmlsZXBhdGgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBGb28gZG9lcyBYeXouCitURVNUX0YoRm9vVGVzdCwgRG9lc1h5eikgeworICAvLyBFeGVyY2lzZXMgdGhlIFh5eiBmZWF0dXJlIG9mIEZvby4KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KK2BgYAorCitUaGUgYDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKWAgZnVuY3Rpb24gcGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZQorVGVzdCBmbGFncywgYW5kIHJlbW92ZXMgYWxsIHJlY29nbml6ZWQgZmxhZ3MuIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgYQordGVzdCBwcm9ncmFtJ3MgYmVoYXZpb3IgdmlhIHZhcmlvdXMgZmxhZ3MsIHdoaWNoIHdlJ2xsIGNvdmVyIGluIFtBZHZhbmNlZEd1aWRlXShWMV83X0FkdmFuY2VkR3VpZGUubWQpLgorWW91IG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBjYWxsaW5nIGBSVU5fQUxMX1RFU1RTKClgLCBvciB0aGUgZmxhZ3MKK3dvbid0IGJlIHByb3Blcmx5IGluaXRpYWxpemVkLgorCitPbiBXaW5kb3dzLCBgSW5pdEdvb2dsZVRlc3QoKWAgYWxzbyB3b3JrcyB3aXRoIHdpZGUgc3RyaW5ncywgc28gaXQgY2FuIGJlIHVzZWQKK2luIHByb2dyYW1zIGNvbXBpbGVkIGluIGBVTklDT0RFYCBtb2RlIGFzIHdlbGwuCisKK0J1dCBtYXliZSB5b3UgdGhpbmsgdGhhdCB3cml0aW5nIGFsbCB0aG9zZSBtYWluKCkgZnVuY3Rpb25zIGlzIHRvbyBtdWNoIHdvcms/IFdlIGFncmVlIHdpdGggeW91IGNvbXBsZXRlbHkgYW5kIHRoYXQncyB3aHkgR29vZ2xlIFRlc3QgcHJvdmlkZXMgYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBtYWluKCkuIElmIGl0IGZpdHMgeW91ciBuZWVkcywgdGhlbiBqdXN0IGxpbmsgeW91ciB0ZXN0IHdpdGggZ3Rlc3RcX21haW4gbGlicmFyeSBhbmQgeW91IGFyZSBnb29kIHRvIGdvLgorCisjIyBJbXBvcnRhbnQgbm90ZSBmb3IgVmlzdWFsIEMrKyB1c2VycyAjIworSWYgeW91IHB1dCB5b3VyIHRlc3RzIGludG8gYSBsaWJyYXJ5IGFuZCB5b3VyIGBtYWluKClgIGZ1bmN0aW9uIGlzIGluIGEgZGlmZmVyZW50IGxpYnJhcnkgb3IgaW4geW91ciAuZXhlIGZpbGUsIHRob3NlIHRlc3RzIHdpbGwgbm90IHJ1bi4gVGhlIHJlYXNvbiBpcyBhIFtidWddKGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL2ZlZWRiYWNrL3ZpZXdmZWVkYmFjay5hc3B4P0ZlZWRiYWNrSUQ9MjQ0NDEwJnNpdGVpZD0yMTApIGluIFZpc3VhbCBDKysuIFdoZW4geW91IGRlZmluZSB5b3VyIHRlc3RzLCBHb29nbGUgVGVzdCBjcmVhdGVzIGNlcnRhaW4gc3RhdGljIG9iamVjdHMgdG8gcmVnaXN0ZXIgdGhlbS4gVGhlc2Ugb2JqZWN0cyBhcmUgbm90IHJlZmVyZW5jZWQgZnJvbSBlbHNld2hlcmUgYnV0IHRoZWlyIGNvbnN0cnVjdG9ycyBhcmUgc3RpbGwgc3VwcG9zZWQgdG8gcnVuLiBXaGVuIFZpc3VhbCBDKysgbGlua2VyIHNlZXMgdGhhdCBub3RoaW5nIGluIHRoZSBsaWJyYXJ5IGlzIHJlZmVyZW5jZWQgZnJvbSBvdGhlciBwbGFjZXMgaXQgdGhyb3dzIHRoZSBsaWJyYXJ5IG91dC4gWW91IGhhdmUgdG8gcmVmZXJlbmNlIHlvdXIgbGlicmFyeSB3aXRoIHRlc3RzIGZyb20geW91ciBtYWluIHByb2dyYW0gdG8ga2VlcCB0aGUgbGlua2VyIGZyb20gZGlzY2FyZGluZyBpdC4gSGVyZSBpcyBob3cgdG8gZG8gaXQuIFNvbWV3aGVyZSBpbiB5b3VyIGxpYnJhcnkgY29kZSBkZWNsYXJlIGEgZnVuY3Rpb246CitgYGAKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBpbnQgUHVsbEluTXlMaWJyYXJ5KCkgeyByZXR1cm4gMDsgfQorYGBgCitJZiB5b3UgcHV0IHlvdXIgdGVzdHMgaW4gYSBzdGF0aWMgbGlicmFyeSAobm90IERMTCkgdGhlbiBgX19kZWNsc3BlYyhkbGxleHBvcnQpYCBpcyBub3QgcmVxdWlyZWQuIE5vdywgaW4geW91ciBtYWluIHByb2dyYW0sIHdyaXRlIGEgY29kZSB0aGF0IGludm9rZXMgdGhhdCBmdW5jdGlvbjoKK2BgYAoraW50IFB1bGxJbk15TGlicmFyeSgpOworc3RhdGljIGludCBkdW1teSA9IFB1bGxJbk15TGlicmFyeSgpOworYGBgCitUaGlzIHdpbGwga2VlcCB5b3VyIHRlc3RzIHJlZmVyZW5jZWQgYW5kIHdpbGwgbWFrZSB0aGVtIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgYXQgc3RhcnR1cC4KKworSW4gYWRkaXRpb24sIGlmIHlvdSBkZWZpbmUgeW91ciB0ZXN0cyBpbiBhIHN0YXRpYyBsaWJyYXJ5LCBhZGQgYC9PUFQ6Tk9SRUZgIHRvIHlvdXIgbWFpbiBwcm9ncmFtIGxpbmtlciBvcHRpb25zLiBJZiB5b3UgdXNlIE1TVkMrKyBJREUsIGdvIHRvIHlvdXIgLmV4ZSBwcm9qZWN0IHByb3BlcnRpZXMvQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzL0xpbmtlci9PcHRpbWl6YXRpb24gYW5kIHNldCBSZWZlcmVuY2VzIHNldHRpbmcgdG8gYEtlZXAgVW5yZWZlcmVuY2VkIERhdGEgKC9PUFQ6Tk9SRUYpYC4gVGhpcyB3aWxsIGtlZXAgVmlzdWFsIEMrKyBsaW5rZXIgZnJvbSBkaXNjYXJkaW5nIGluZGl2aWR1YWwgc3ltYm9scyBnZW5lcmF0ZWQgYnkgeW91ciB0ZXN0cyBmcm9tIHRoZSBmaW5hbCBleGVjdXRhYmxlLgorCitUaGVyZSBpcyBvbmUgbW9yZSBwaXRmYWxsLCB0aG91Z2guIElmIHlvdSB1c2UgR29vZ2xlIFRlc3QgYXMgYSBzdGF0aWMgbGlicmFyeSAodGhhdCdzIGhvdyBpdCBpcyBkZWZpbmVkIGluIGd0ZXN0LnZjcHJvaikgeW91ciB0ZXN0cyBtdXN0IGFsc28gcmVzaWRlIGluIGEgc3RhdGljIGxpYnJhcnkuIElmIHlvdSBoYXZlIHRvIGhhdmUgdGhlbSBpbiBhIERMTCwgeW91IF9tdXN0XyBjaGFuZ2UgR29vZ2xlIFRlc3QgdG8gYnVpbGQgaW50byBhIERMTCBhcyB3ZWxsLiBPdGhlcndpc2UgeW91ciB0ZXN0cyB3aWxsIG5vdCBydW4gY29ycmVjdGx5IG9yIHdpbGwgbm90IHJ1biBhdCBhbGwuIFRoZSBnZW5lcmFsIGNvbmNsdXNpb24gaGVyZSBpczogbWFrZSB5b3VyIGxpZmUgZWFzaWVyIC0gZG8gbm90IHdyaXRlIHlvdXIgdGVzdHMgaW4gbGlicmFyaWVzIQorCisjIFdoZXJlIHRvIEdvIGZyb20gSGVyZSAjCisKK0NvbmdyYXR1bGF0aW9ucyEgWW91J3ZlIGxlYXJuZWQgdGhlIEdvb2dsZSBUZXN0IGJhc2ljcy4gWW91IGNhbiBzdGFydCB3cml0aW5nCithbmQgcnVubmluZyBHb29nbGUgVGVzdCB0ZXN0cywgcmVhZCBzb21lIFtzYW1wbGVzXShWMV83X1NhbXBsZXMubWQpLCBvciBjb250aW51ZSB3aXRoCitbQWR2YW5jZWRHdWlkZV0oVjFfN19BZHZhbmNlZEd1aWRlLm1kKSwgd2hpY2ggZGVzY3JpYmVzIG1hbnkgbW9yZSB1c2VmdWwgR29vZ2xlIFRlc3QgZmVhdHVyZXMuCisKKyMgS25vd24gTGltaXRhdGlvbnMgIworCitHb29nbGUgVGVzdCBpcyBkZXNpZ25lZCB0byBiZSB0aHJlYWQtc2FmZS4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcwordGhyZWFkLXNhZmUgb24gc3lzdGVtcyB3aGVyZSB0aGUgYHB0aHJlYWRzYCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4gIEl0CitpcyBjdXJyZW50bHkgX3Vuc2FmZV8gdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgZnJvbSB0d28gdGhyZWFkcworY29uY3VycmVudGx5IG9uIG90aGVyIHN5c3RlbXMgKGUuZy4gV2luZG93cykuICBJbiBtb3N0IHRlc3RzIHRoaXMgaXMKK25vdCBhbiBpc3N1ZSBhcyB1c3VhbGx5IHRoZSBhc3NlcnRpb25zIGFyZSBkb25lIGluIHRoZSBtYWluIHRocmVhZC4gSWYKK3lvdSB3YW50IHRvIGhlbHAsIHlvdSBjYW4gdm9sdW50ZWVyIHRvIGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5CitzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBpbiBgZ3Rlc3QtcG9ydC5oYCBmb3IgeW91ciBwbGF0Zm9ybS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV83X1B1bXBNYW51YWwubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV83X1B1bXBNYW51YWwubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2Y2Y1NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzdfUHVtcE1hbnVhbC5tZApAQCAtMCwwICsxLDE3NyBAQAorCisKKzxiPlA8L2I+dW1wIGlzIDxiPlU8L2I+c2VmdWwgZm9yIDxiPk08L2I+ZXRhIDxiPlA8L2I+cm9ncmFtbWluZy4KKworIyBUaGUgUHJvYmxlbSAjCisKK1RlbXBsYXRlIGFuZCBtYWNybyBsaWJyYXJpZXMgb2Z0ZW4gbmVlZCB0byBkZWZpbmUgbWFueSBjbGFzc2VzLAorZnVuY3Rpb25zLCBvciBtYWNyb3MgdGhhdCB2YXJ5IG9ubHkgKG9yIGFsbW9zdCBvbmx5KSBpbiB0aGUgbnVtYmVyIG9mCithcmd1bWVudHMgdGhleSB0YWtlLiBJdCdzIGEgbG90IG9mIHJlcGV0aXRpdmUsIG1lY2hhbmljYWwsIGFuZAorZXJyb3ItcHJvbmUgd29yay4KKworVmFyaWFkaWMgdGVtcGxhdGVzIGFuZCB2YXJpYWRpYyBtYWNyb3MgY2FuIGFsbGV2aWF0ZSB0aGUgcHJvYmxlbS4KK0hvd2V2ZXIsIHdoaWxlIGJvdGggYXJlIGJlaW5nIGNvbnNpZGVyZWQgYnkgdGhlIEMrKyBjb21taXR0ZWUsIG5laXRoZXIKK2lzIGluIHRoZSBzdGFuZGFyZCB5ZXQgb3Igd2lkZWx5IHN1cHBvcnRlZCBieSBjb21waWxlcnMuICBUaHVzIHRoZXkKK2FyZSBvZnRlbiBub3QgYSBnb29kIGNob2ljZSwgZXNwZWNpYWxseSB3aGVuIHlvdXIgY29kZSBuZWVkcyB0byBiZQorcG9ydGFibGUuIEFuZCB0aGVpciBjYXBhYmlsaXRpZXMgYXJlIHN0aWxsIGxpbWl0ZWQuCisKK0FzIGEgcmVzdWx0LCBhdXRob3JzIG9mIHN1Y2ggbGlicmFyaWVzIG9mdGVuIGhhdmUgdG8gd3JpdGUgc2NyaXB0cyB0bworZ2VuZXJhdGUgdGhlaXIgaW1wbGVtZW50YXRpb24uIEhvd2V2ZXIsIG91ciBleHBlcmllbmNlIGlzIHRoYXQgaXQncwordGVkaW91cyB0byB3cml0ZSBzdWNoIHNjcmlwdHMsIHdoaWNoIHRlbmQgdG8gcmVmbGVjdCB0aGUgc3RydWN0dXJlIG9mCit0aGUgZ2VuZXJhdGVkIGNvZGUgcG9vcmx5IGFuZCBhcmUgb2Z0ZW4gaGFyZCB0byByZWFkIGFuZCBlZGl0LiBGb3IKK2V4YW1wbGUsIGEgc21hbGwgY2hhbmdlIG5lZWRlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgbWF5IHJlcXVpcmUgc29tZQorbm9uLWludHVpdGl2ZSwgbm9uLXRyaXZpYWwgY2hhbmdlcyBpbiB0aGUgc2NyaXB0LiBUaGlzIGlzIGVzcGVjaWFsbHkKK3BhaW5mdWwgd2hlbiBleHBlcmltZW50aW5nIHdpdGggdGhlIGNvZGUuCisKKyMgT3VyIFNvbHV0aW9uICMKKworUHVtcCAoZm9yIFB1bXAgaXMgVXNlZnVsIGZvciBNZXRhIFByb2dyYW1taW5nLCBQcmV0dHkgVXNlZnVsIGZvciBNZXRhCitQcm9ncmFtbWluZywgb3IgUHJhY3RpY2FsIFV0aWxpdHkgZm9yIE1ldGEgUHJvZ3JhbW1pbmcsIHdoaWNoZXZlciB5b3UKK3ByZWZlcikgaXMgYSBzaW1wbGUgbWV0YS1wcm9ncmFtbWluZyB0b29sIGZvciBDKysuIFRoZSBpZGVhIGlzIHRoYXQgYQorcHJvZ3JhbW1lciB3cml0ZXMgYSBgZm9vLnB1bXBgIGZpbGUgd2hpY2ggY29udGFpbnMgQysrIGNvZGUgcGx1cyBtZXRhCitjb2RlIHRoYXQgbWFuaXB1bGF0ZXMgdGhlIEMrKyBjb2RlLiBUaGUgbWV0YSBjb2RlIGNhbiBoYW5kbGUKK2l0ZXJhdGlvbnMgb3ZlciBhIHJhbmdlLCBuZXN0ZWQgaXRlcmF0aW9ucywgbG9jYWwgbWV0YSB2YXJpYWJsZQorZGVmaW5pdGlvbnMsIHNpbXBsZSBhcml0aG1ldGljLCBhbmQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMuIFlvdSBjYW4KK3ZpZXcgaXQgYXMgYSBzbWFsbCBEb21haW4tU3BlY2lmaWMgTGFuZ3VhZ2UuIFRoZSBtZXRhIGxhbmd1YWdlIGlzCitkZXNpZ25lZCB0byBiZSBub24taW50cnVzaXZlIChzLnQuIGl0IHdvbid0IGNvbmZ1c2UgRW1hY3MnIEMrKyBtb2RlLAorZm9yIGV4YW1wbGUpIGFuZCBjb25jaXNlLCBtYWtpbmcgUHVtcCBjb2RlIGludHVpdGl2ZSBhbmQgZWFzeSB0bworbWFpbnRhaW4uCisKKyMjIEhpZ2hsaWdodHMgIyMKKworICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBhIHNpbmdsZSBQeXRob24gc2NyaXB0IGFuZCB0aHVzIHVsdHJhIHBvcnRhYmxlOiBubyBidWlsZCBvciBpbnN0YWxsYXRpb24gaXMgbmVlZGVkIGFuZCBpdCB3b3JrcyBjcm9zcyBwbGF0Zm9ybXMuCisgICogUHVtcCB0cmllcyB0byBiZSBzbWFydCB3aXRoIHJlc3BlY3QgdG8gW0dvb2dsZSdzIHN0eWxlIGd1aWRlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXN0eWxlZ3VpZGUvKTogaXQgYnJlYWtzIGxvbmcgbGluZXMgKGVhc3kgdG8gaGF2ZSB3aGVuIHRoZXkgYXJlIGdlbmVyYXRlZCkgYXQgYWNjZXB0YWJsZSBwbGFjZXMgdG8gZml0IHdpdGhpbiA4MCBjb2x1bW5zIGFuZCBpbmRlbnQgdGhlIGNvbnRpbnVhdGlvbiBsaW5lcyBjb3JyZWN0bHkuCisgICogVGhlIGZvcm1hdCBpcyBodW1hbi1yZWFkYWJsZSBhbmQgbW9yZSBjb25jaXNlIHRoYW4gWE1MLgorICAqIFRoZSBmb3JtYXQgd29ya3MgcmVsYXRpdmVseSB3ZWxsIHdpdGggRW1hY3MnIEMrKyBtb2RlLgorCisjIyBFeGFtcGxlcyAjIworCitUaGUgZm9sbG93aW5nIFB1bXAgY29kZSAod2hlcmUgbWV0YSBrZXl3b3JkcyBzdGFydCB3aXRoIGAkYCwgYFtbYCBhbmQgYF1dYCBhcmUgbWV0YSBicmFja2V0cywgYW5kIGAkJGAgc3RhcnRzIGEgbWV0YSBjb21tZW50IHRoYXQgZW5kcyB3aXRoIHRoZSBsaW5lKToKKworYGBgCiskdmFyIG4gPSAzICAgICAkJCBEZWZpbmVzIGEgbWV0YSB2YXJpYWJsZSBuLgorJHJhbmdlIGkgMC4ubiAgJCQgRGVjbGFyZXMgdGhlIHJhbmdlIG9mIG1ldGEgaXRlcmF0b3IgaSAoaW5jbHVzaXZlKS4KKyRmb3IgaSBbWworICAgICAgICAgICAgICAgJCQgTWV0YSBsb29wLgorLy8gRm9vJGkgZG9lcyBibGFoIGZvciAkaS1hcnkgcHJlZGljYXRlcy4KKyRyYW5nZSBqIDEuLmkKK3RlbXBsYXRlIDxzaXplX3QgTiAkZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dPgorY2xhc3MgRm9vJGkgeworJGlmIGkgPT0gMCBbWworICBibGFoIGE7CitdXSAkZWxpZiBpIDw9IDIgW1sKKyAgYmxhaCBiOworXV0gJGVsc2UgW1sKKyAgYmxhaCBjOworXV0KK307CisKK11dCitgYGAKKword2lsbCBiZSB0cmFuc2xhdGVkIGJ5IHRoZSBQdW1wIGNvbXBpbGVyIHRvOgorCitgYGAKKy8vIEZvbzAgZG9lcyBibGFoIGZvciAwLWFyeSBwcmVkaWNhdGVzLgordGVtcGxhdGUgPHNpemVfdCBOPgorY2xhc3MgRm9vMCB7CisgIGJsYWggYTsKK307CisKKy8vIEZvbzEgZG9lcyBibGFoIGZvciAxLWFyeSBwcmVkaWNhdGVzLgordGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBBMT4KK2NsYXNzIEZvbzEgeworICBibGFoIGI7Cit9OworCisvLyBGb28yIGRvZXMgYmxhaCBmb3IgMi1hcnkgcHJlZGljYXRlcy4KK3RlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgorY2xhc3MgRm9vMiB7CisgIGJsYWggYjsKK307CisKKy8vIEZvbzMgZG9lcyBibGFoIGZvciAzLWFyeSBwcmVkaWNhdGVzLgordGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgorY2xhc3MgRm9vMyB7CisgIGJsYWggYzsKK307CitgYGAKKworSW4gYW5vdGhlciBleGFtcGxlLAorCitgYGAKKyRyYW5nZSBpIDEuLm4KK0Z1bmMoJGZvciBpICsgW1thJGldXSk7CiskJCBUaGUgdGV4dCBiZXR3ZWVuIGkgYW5kIFtbIGlzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBpdGVyYXRpb25zLgorYGBgCisKK3dpbGwgZ2VuZXJhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGluZXMgKHdpdGhvdXQgdGhlIGNvbW1lbnRzKSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBgbmA6CisKK2BgYAorRnVuYygpOyAgICAgICAgICAgICAgLy8gSWYgbiBpcyAwLgorRnVuYyhhMSk7ICAgICAgICAgICAgLy8gSWYgbiBpcyAxLgorRnVuYyhhMSArIGEyKTsgICAgICAgLy8gSWYgbiBpcyAyLgorRnVuYyhhMSArIGEyICsgYTMpOyAgLy8gSWYgbiBpcyAzLgorLy8gQW5kIHNvIG9uLi4uCitgYGAKKworIyMgQ29uc3RydWN0cyAjIworCitXZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbWV0YSBwcm9ncmFtbWluZyBjb25zdHJ1Y3RzOgorCit8IGAkdmFyIGlkID0gZXhwYCB8IERlZmluZXMgYSBuYW1lZCBjb25zdGFudCB2YWx1ZS4gYCRpZGAgaXMgdmFsaWQgdXRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1ldGEgbGV4aWNhbCBibG9jay4gfAorfDotLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgYCRyYW5nZSBpZCBleHAuLmV4cGAgfCBTZXRzIHRoZSByYW5nZSBvZiBhbiBpdGVyYXRpb24gdmFyaWFibGUsIHdoaWNoIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgbG9vcHMgbGF0ZXIuICAgICAgICAgIHwKK3wgYCRmb3IgaWQgc2VwIFtbIGNvZGUgXV1gIHwgSXRlcmF0aW9uLiBUaGUgcmFuZ2Ugb2YgYGlkYCBtdXN0IGhhdmUgYmVlbiBkZWZpbmVkIGVhcmxpZXIuIGAkaWRgIGlzIHZhbGlkIGluIGBjb2RlYC4gICAgICAgICB8Cit8IGAkKCQpYCAgICAgICAgICB8IEdlbmVyYXRlcyBhIHNpbmdsZSBgJGAgY2hhcmFjdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgJGlkYCAgICAgICAgICAgfCBWYWx1ZSBvZiB0aGUgbmFtZWQgY29uc3RhbnQgb3IgaXRlcmF0aW9uIHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYCQoZXhwKWAgICAgICAgIHwgVmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGAkaWYgZXhwIFtbIGNvZGUgXV0gZWxzZV9icmFuY2hgIHwgQ29uZGl0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBbWyBjb2RlIF1dYCAgICB8IE1ldGEgbGV4aWNhbCBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBgY3BwX2NvZGVgICAgICAgfCBSYXcgQysrIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYCQkIGNvbW1lbnRgICAgIHwgTWV0YSBjb21tZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKyoqTm90ZToqKiBUbyBnaXZlIHRoZSB1c2VyIHNvbWUgZnJlZWRvbSBpbiBmb3JtYXR0aW5nIHRoZSBQdW1wIHNvdXJjZQorY29kZSwgUHVtcCBpZ25vcmVzIGEgbmV3LWxpbmUgY2hhcmFjdGVyIGlmIGl0J3MgcmlnaHQgYWZ0ZXIgYCRmb3IgZm9vYAorb3IgbmV4dCB0byBgW1tgIG9yIGBdXWAuIFdpdGhvdXQgdGhpcyBydWxlIHlvdSdsbCBvZnRlbiBiZSBmb3JjZWQgdG8gd3JpdGUKK3ZlcnkgbG9uZyBsaW5lcyB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0LiBUaGVyZWZvcmUgc29tZXRpbWVzIHlvdSBtYXkKK25lZWQgdG8gaW5zZXJ0IGFuIGV4dHJhIG5ldy1saW5lIGluIHN1Y2ggcGxhY2VzIGZvciBhIG5ldy1saW5lIHRvIHNob3cKK3VwIGluIHlvdXIgb3V0cHV0LgorCisjIyBHcmFtbWFyICMjCisKK2BgYAorY29kZSA6Oj0gYXRvbWljX2NvZGUqCithdG9taWNfY29kZSA6Oj0gJHZhciBpZCA9IGV4cAorICAgIHwgJHZhciBpZCA9IFtbIGNvZGUgXV0KKyAgICB8ICRyYW5nZSBpZCBleHAuLmV4cAorICAgIHwgJGZvciBpZCBzZXAgW1sgY29kZSBdXQorICAgIHwgJCgkKQorICAgIHwgJGlkCisgICAgfCAkKGV4cCkKKyAgICB8ICRpZiBleHAgW1sgY29kZSBdXSBlbHNlX2JyYW5jaAorICAgIHwgW1sgY29kZSBdXQorICAgIHwgY3BwX2NvZGUKK3NlcCA6Oj0gY3BwX2NvZGUgfCBlbXB0eV9zdHJpbmcKK2Vsc2VfYnJhbmNoIDo6PSAkZWxzZSBbWyBjb2RlIF1dCisgICAgfCAkZWxpZiBleHAgW1sgY29kZSBdXSBlbHNlX2JyYW5jaAorICAgIHwgZW1wdHlfc3RyaW5nCitleHAgOjo9IHNpbXBsZV9leHByZXNzaW9uX2luX1B5dGhvbl9zeW50YXgKK2BgYAorCisjIyBDb2RlICMjCisKK1lvdSBjYW4gZmluZCB0aGUgc291cmNlIGNvZGUgb2YgUHVtcCBpbiBbc2NyaXB0cy9wdW1wLnB5XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NjcmlwdHMvcHVtcC5weSkuIEl0IGlzIHN0aWxsCit2ZXJ5IHVucG9saXNoZWQgYW5kIGxhY2tzIGF1dG9tYXRlZCB0ZXN0cywgYWx0aG91Z2ggaXQgaGFzIGJlZW4KK3N1Y2Nlc3NmdWxseSB1c2VkIG1hbnkgdGltZXMuIElmIHlvdSBmaW5kIGEgY2hhbmNlIHRvIHVzZSBpdCBpbiB5b3VyCitwcm9qZWN0LCBwbGVhc2UgbGV0IHVzIGtub3cgd2hhdCB5b3UgdGhpbmshICBXZSBhbHNvIHdlbGNvbWUgaGVscCBvbgoraW1wcm92aW5nIFB1bXAuCisKKyMjIFJlYWwgRXhhbXBsZXMgIyMKKworWW91IGNhbiBmaW5kIHJlYWwtd29ybGQgYXBwbGljYXRpb25zIG9mIFB1bXAgaW4gW0dvb2dsZSBUZXN0XShodHRwOi8vd3d3Lmdvb2dsZS5jb20vY29kZXNlYXJjaD9xPWZpbGUlM0FcLnB1bXAlMjQrcGFja2FnZSUzQWh0dHAlM0ElMkYlMkZnb29nbGV0ZXN0XC5nb29nbGVjb2RlXC5jb20pIGFuZCBbR29vZ2xlIE1vY2tdKGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jb2Rlc2VhcmNoP3E9ZmlsZSUzQVwucHVtcCUyNCtwYWNrYWdlJTNBaHR0cCUzQSUyRiUyRmdvb2dsZW1vY2tcLmdvb2dsZWNvZGVcLmNvbSkuICBUaGUgc291cmNlIGZpbGUgYGZvby5oLnB1bXBgIGdlbmVyYXRlcyBgZm9vLmhgLgorCisjIyBUaXBzICMjCisKKyAgKiBJZiBhIG1ldGEgdmFyaWFibGUgaXMgZm9sbG93ZWQgYnkgYSBsZXR0ZXIgb3IgZGlnaXQsIHlvdSBjYW4gc2VwYXJhdGUgdGhlbSB1c2luZyBgW1tdXWAsIHdoaWNoIGluc2VydHMgYW4gZW1wdHkgc3RyaW5nLiBGb3IgZXhhbXBsZSBgRm9vJGpbW11dSGVscGVyYCBnZW5lcmF0ZSBgRm9vMUhlbHBlcmAgd2hlbiBgamAgaXMgMS4KKyAgKiBUbyBhdm9pZCBleHRyYS1sb25nIFB1bXAgc291cmNlIGxpbmVzLCB5b3UgY2FuIGJyZWFrIGEgbGluZSBhbnl3aGVyZSB5b3Ugd2FudCBieSBpbnNlcnRpbmcgYFtbXV1gIGZvbGxvd2VkIGJ5IGEgbmV3IGxpbmUuIFNpbmNlIGFueSBuZXctbGluZSBjaGFyYWN0ZXIgbmV4dCB0byBgW1tgIG9yIGBdXWAgaXMgaWdub3JlZCwgdGhlIGdlbmVyYXRlZCBjb2RlIHdvbid0IGNvbnRhaW4gdGhpcyBuZXcgbGluZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV83X1NhbXBsZXMubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV83X1NhbXBsZXMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyMjU2OQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzdfU2FtcGxlcy5tZApAQCAtMCwwICsxLDE0IEBACitJZiB5b3UncmUgbGlrZSB1cywgeW91J2QgbGlrZSB0byBsb29rIGF0IHNvbWUgR29vZ2xlIFRlc3Qgc2FtcGxlIGNvZGUuICBUaGUKK1tzYW1wbGVzIGZvbGRlcl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS8jc3ZuL3RydW5rL3NhbXBsZXMpIGhhcyBhIG51bWJlciBvZiB3ZWxsLWNvbW1lbnRlZCBzYW1wbGVzIHNob3dpbmcgaG93IHRvIHVzZSBhCit2YXJpZXR5IG9mIEdvb2dsZSBUZXN0IGZlYXR1cmVzLgorCisgICogW1NhbXBsZSAjMV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MpIHNob3dzIHRoZSBiYXNpYyBzdGVwcyBvZiB1c2luZyBHb29nbGUgVGVzdCB0byB0ZXN0IEMrKyBmdW5jdGlvbnMuCisgICogW1NhbXBsZSAjMl0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MpIHNob3dzIGEgbW9yZSBjb21wbGV4IHVuaXQgdGVzdCBmb3IgYSBjbGFzcyB3aXRoIG11bHRpcGxlIG1lbWJlciBmdW5jdGlvbnMuCisgICogW1NhbXBsZSAjM10oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MpIHVzZXMgYSB0ZXN0IGZpeHR1cmUuCisgICogW1NhbXBsZSAjNF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTRfdW5pdHRlc3QuY2MpIGlzIGFub3RoZXIgYmFzaWMgZXhhbXBsZSBvZiB1c2luZyBHb29nbGUgVGVzdC4KKyAgKiBbU2FtcGxlICM1XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYykgdGVhY2hlcyBob3cgdG8gcmV1c2UgYSB0ZXN0IGZpeHR1cmUgaW4gbXVsdGlwbGUgdGVzdCBjYXNlcyBieSBkZXJpdmluZyBzdWItZml4dHVyZXMgZnJvbSBpdC4KKyAgKiBbU2FtcGxlICM2XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jYykgZGVtb25zdHJhdGVzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgKiBbU2FtcGxlICM3XShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvYnJvd3NlL3RydW5rL3NhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYykgdGVhY2hlcyB0aGUgYmFzaWNzIG9mIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICogW1NhbXBsZSAjOF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MpIHNob3dzIHVzaW5nIGBDb21iaW5lKClgIGluIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICogW1NhbXBsZSAjOV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MpIHNob3dzIHVzZSBvZiB0aGUgbGlzdGVuZXIgQVBJIHRvIG1vZGlmeSBHb29nbGUgVGVzdCdzIGNvbnNvbGUgb3V0cHV0IGFuZCB0aGUgdXNlIG9mIGl0cyByZWZsZWN0aW9uIEFQSSB0byBpbnNwZWN0IHRlc3QgcmVzdWx0cy4KKyAgKiBbU2FtcGxlICMxMF0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvc291cmNlL2Jyb3dzZS90cnVuay9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjKSBzaG93cyB1c2Ugb2YgdGhlIGxpc3RlbmVyIEFQSSB0byBpbXBsZW1lbnQgYSBwcmltaXRpdmUgbWVtb3J5IGxlYWsgY2hlY2tlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV83X1hjb2RlR3VpZGUubWQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9WMV83X1hjb2RlR3VpZGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyNGJmNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9kb2NzL1YxXzdfWGNvZGVHdWlkZS5tZApAQCAtMCwwICsxLDkzIEBACisKKworVGhpcyBndWlkZSB3aWxsIGV4cGxhaW4gaG93IHRvIHVzZSB0aGUgR29vZ2xlIFRlc3RpbmcgRnJhbWV3b3JrIGluIHlvdXIgWGNvZGUgcHJvamVjdHMgb24gTWFjIE9TIFguIFRoaXMgdHV0b3JpYWwgYmVnaW5zIGJ5IHF1aWNrbHkgZXhwbGFpbmluZyB3aGF0IHRvIGRvIGZvciBleHBlcmllbmNlZCB1c2Vycy4gQWZ0ZXIgdGhlIHF1aWNrIHN0YXJ0LCB0aGUgZ3VpZGUgZ29lcyBwcm92aWRlcyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGFib3V0IGVhY2ggc3RlcC4KKworIyBRdWljayBTdGFydCAjCisKK0hlcmUgaXMgdGhlIHF1aWNrIGd1aWRlIGZvciB1c2luZyBHb29nbGUgVGVzdCBpbiB5b3VyIFhjb2RlIHByb2plY3QuCisKKyAgMS4gRG93bmxvYWQgdGhlIHNvdXJjZSBmcm9tIHRoZSBbd2Vic2l0ZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QpIHVzaW5nIHRoaXMgY29tbWFuZDogYHN2biBjaGVja291dCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvIGdvb2dsZXRlc3QtcmVhZC1vbmx5YAorICAxLiBPcGVuIHVwIHRoZSBgZ3Rlc3QueGNvZGVwcm9qYCBpbiB0aGUgYGdvb2dsZXRlc3QtcmVhZC1vbmx5L3hjb2RlL2AgZGlyZWN0b3J5IGFuZCBidWlsZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrLgorICAxLiBDcmVhdGUgYSBuZXcgIlNoZWxsIFRvb2wiIHRhcmdldCBpbiB5b3VyIFhjb2RlIHByb2plY3QgY2FsbGVkIHNvbWV0aGluZyBsaWtlICJVbml0VGVzdHMiCisgIDEuIEFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHlvdXIgcHJvamVjdCBhbmQgYWRkIGl0IHRvIHRoZSAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mICJVbml0VGVzdHMiCisgIDEuIEFkZCB5b3VyIHVuaXQgdGVzdCBzb3VyY2UgY29kZSB0byB0aGUgIkNvbXBpbGUgU291cmNlcyIgYnVpbGQgcGhhc2Ugb2YgIlVuaXRUZXN0cyIKKyAgMS4gRWRpdCB0aGUgIlVuaXRUZXN0cyIgZXhlY3V0YWJsZSBhbmQgYWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVkICJEWUxEXF9GUkFNRVdPUktcX1BBVEgiIHdpdGggYSB2YWx1ZSBlcXVhbCB0byB0aGUgcGF0aCB0byB0aGUgZnJhbWV3b3JrIGNvbnRhaW5pbmcgdGhlIGd0ZXN0LmZyYW1ld29yayByZWxhdGl2ZSB0byB0aGUgY29tcGlsZWQgZXhlY3V0YWJsZS4KKyAgMS4gQnVpbGQgYW5kIEdvCisKK1RoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZnVydGhlciBleHBsYWluIGVhY2ggb2YgdGhlIHN0ZXBzIGxpc3RlZCBhYm92ZSBpbiBkZXB0aCwgZGVzY3JpYmluZyBpbiBtb3JlIGRldGFpbCBob3cgdG8gY29tcGxldGUgaXQgaW5jbHVkaW5nIHNvbWUgdmFyaWF0aW9ucy4KKworIyBHZXQgdGhlIFNvdXJjZSAjCisKK0N1cnJlbnRseSwgdGhlIGd0ZXN0LmZyYW1ld29yayBkaXNjdXNzZWQgaGVyZSBpc24ndCBhdmFpbGFibGUgaW4gYSB0YWdnZWQgcmVsZWFzZSBvZiBHb29nbGUgVGVzdCwgaXQgaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIHRydW5rLiBBcyBleHBsYWluZWQgYXQgdGhlIEdvb2dsZSBUZXN0IFtzaXRlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvY2hlY2tvdXQiPnN2biksIHlvdSBjYW4gZ2V0IHRoZSBjb2RlIGZyb20gYW5vbnltb3VzIFNWTiB3aXRoIHRoaXMgY29tbWFuZDoKKworYGBgCitzdm4gY2hlY2tvdXQgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLyBnb29nbGV0ZXN0LXJlYWQtb25seQorYGBgCisKK0FsdGVybmF0aXZlbHksIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIFN1YnZlcnNpb24gaW4geW91ciBvd24gY29kZSBiYXNlLCB5b3UgY2FuIGFkZCBHb29nbGUgVGVzdCBhcyBhbiBleHRlcm5hbCBkZXBlbmRlbmN5IHRvIHlvdXIgb3duIFN1YnZlcnNpb24gcmVwb3NpdG9yeS4gQnkgZm9sbG93aW5nIHRoaXMgYXBwcm9hY2gsIGV2ZXJ5b25lIHRoYXQgY2hlY2tzIG91dCB5b3VyIHN2biByZXBvc2l0b3J5IHdpbGwgYWxzbyByZWNlaXZlIGEgY29weSBvZiBHb29nbGUgVGVzdCAoYSBzcGVjaWZpYyB2ZXJzaW9uLCBpZiB5b3Ugd2lzaCkgd2l0aG91dCBoYXZpbmcgdG8gY2hlY2sgaXQgb3V0IGV4cGxpY2l0bHkuIFRoaXMgbWFrZXMgdGhlIHNldCB1cCBvZiB5b3VyIHByb2plY3Qgc2ltcGxlciBhbmQgcmVkdWNlcyB0aGUgY29waWVkIGNvZGUgaW4gdGhlIHJlcG9zaXRvcnkuCisKK1RvIHVzZSBgc3ZuOmV4dGVybmFsc2AsIGRlY2lkZSB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBoYXZlIHRoZSBleHRlcm5hbCBzb3VyY2UgcmVzaWRlLiBZb3UgbWlnaHQgY2hvb3NlIHRvIHB1dCB0aGUgZXh0ZXJuYWwgc291cmNlIGluc2lkZSB0aGUgdHJ1bmssIGJlY2F1c2UgeW91IHdhbnQgaXQgdG8gYmUgcGFydCBvZiB0aGUgYnJhbmNoIHdoZW4geW91IG1ha2UgYSByZWxlYXNlLiBIb3dldmVyLCBrZWVwaW5nIGl0IG91dHNpZGUgdGhlIHRydW5rIGluIGEgdmVyc2lvbi10YWdnZWQgZGlyZWN0b3J5IGNhbGxlZCBzb21ldGhpbmcgbGlrZSBgdGhpcmQtcGFydHkvZ29vZ2xldGVzdC8xLjAuMWAsIGlzIGFub3RoZXIgb3B0aW9uLiBPbmNlIHRoZSBsb2NhdGlvbiBpcyBlc3RhYmxpc2hlZCwgdXNlIGBzdm4gcHJvcGVkaXQgc3ZuOmV4dGVybmFscyBfZGlyZWN0b3J5X2AgdG8gc2V0IHRoZSBzdm46ZXh0ZXJuYWxzIHByb3BlcnR5IG9uIGEgZGlyZWN0b3J5IGluIHlvdXIgcmVwb3NpdG9yeS4gVGhpcyBkaXJlY3Rvcnkgd29uJ3QgY29udGFpbiB0aGUgY29kZSwgYnV0IGJlIGl0cyB2ZXJzaW9uZWQgcGFyZW50IGRpcmVjdG9yeS4KKworVGhlIGNvbW1hbmQgYHN2biBwcm9wZWRpdGAgd2lsbCBicmluZyB1cCB5b3VyIFN1YnZlcnNpb24gZWRpdG9yLCBtYWtpbmcgZWRpdGluZyB0aGUgbG9uZywgKHBvdGVudGlhbGx5IG11bHRpLWxpbmUpIHByb3BlcnR5IHNpbXBsZXIuIFRoaXMgc2FtZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY2hlY2sgb3V0IGEgdGFnZ2VkIGJyYW5jaCwgYnkgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFVSTCAoZS5nLiBgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RhZ3MvcmVsZWFzZS0xLjAuMWApLiBBZGRpdGlvbmFsbHksIHRoZSBzdm46ZXh0ZXJuYWxzIHByb3BlcnR5IGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHBhcnRpY3VsYXIgcmV2aXNpb24gb2YgdGhlIHRydW5rIHdpdGggdGhlIGAtcl8jI19gIG9wdGlvbiAoZS5nLiBgZXh0ZXJuYWxzL3NyYy9nb29nbGV0ZXN0IC1yNjAgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rYCkuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyB0aGUgc3ZuOmV4dGVybmFscyBwcm9wZXJ0aWVzIG9uIGEgdHJ1bmsgKHJlYWQgdmlhIGBzdm4gcHJvcGdldGApIG9mIGEgcHJvamVjdC4gVGhpcyB2YWx1ZSBjaGVja3Mgb3V0IGEgY29weSBvZiBHb29nbGUgVGVzdCBpbnRvIHRoZSBgdHJ1bmsvZXh0ZXJuYWxzL3NyYy9nb29nbGV0ZXN0L2AgZGlyZWN0b3J5LgorCitgYGAKK1tDb21wdXRlcjpzdm5dIHVzZXIkIHN2biBwcm9wZ2V0IHN2bjpleHRlcm5hbHMgdHJ1bmsKK2V4dGVybmFscy9zcmMvZ29vZ2xldGVzdCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsKK2BgYAorCisjIEFkZCB0aGUgRnJhbWV3b3JrIHRvIFlvdXIgUHJvamVjdCAjCisKK1RoZSBuZXh0IHN0ZXAgaXMgdG8gYnVpbGQgYW5kIGFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHlvdXIgb3duIHByb2plY3QuIFRoaXMgZ3VpZGUgZGVzY3JpYmVzIHR3byBjb21tb24gd2F5cyBiZWxvdy4KKworICAqICoqT3B0aW9uIDEqKiAtLS0gVGhlIHNpbXBsZXN0IHdheSB0byBhZGQgR29vZ2xlIFRlc3QgdG8geW91ciBvd24gcHJvamVjdCwgaXMgdG8gb3BlbiBndGVzdC54Y29kZXByb2ogKGZvdW5kIGluIHRoZSB4Y29kZS8gZGlyZWN0b3J5IG9mIHRoZSBHb29nbGUgVGVzdCB0cnVuaykgYW5kIGJ1aWxkIHRoZSBmcmFtZXdvcmsgbWFudWFsbHkuIFRoZW4sIGFkZCB0aGUgYnVpbHQgZnJhbWV3b3JrIGludG8geW91ciBwcm9qZWN0IHVzaW5nIHRoZSAiQWRkLT5FeGlzdGluZyBGcmFtZXdvcmsuLi4iIGZyb20gdGhlIGNvbnRleHQgbWVudSBvciAiUHJvamVjdC0+QWRkLi4uIiBmcm9tIHRoZSBtYWluIG1lbnUuIFRoZSBndGVzdC5mcmFtZXdvcmsgaXMgcmVsb2NhdGFibGUgYW5kIGNvbnRhaW5zIHRoZSBoZWFkZXJzIGFuZCBvYmplY3QgY29kZSB0aGF0IHlvdSdsbCBuZWVkIHRvIG1ha2UgdGVzdHMuIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHJlYnVpbGRpbmcgZXZlcnkgdGltZSB5b3UgdXBncmFkZSBHb29nbGUgVGVzdCBpbiB5b3VyIHByb2plY3QuCisgICogKipPcHRpb24gMioqIC0tLSBJZiB5b3UgYXJlIGdvaW5nIHRvIGJlIGxpdmluZyBvZmYgdGhlIHRydW5rIG9mIEdvb2dsZSBUZXN0LCBpbmNvcnBvcmF0aW5nIGl0cyBsYXRlc3QgZmVhdHVyZXMgaW50byB5b3VyIHVuaXQgdGVzdHMgKG9yIGFyZSBhIEdvb2dsZSBUZXN0IGRldmVsb3BlciB5b3Vyc2VsZikuIFlvdSdsbCB3YW50IHRvIHJlYnVpbGQgdGhlIGZyYW1ld29yayBldmVyeSB0aW1lIHRoZSBzb3VyY2UgdXBkYXRlcy4gdG8gZG8gdGhpcywgeW91J2xsIG5lZWQgdG8gYWRkIHRoZSBndGVzdC54Y29kZXByb2ogZmlsZSwgbm90IHRoZSBmcmFtZXdvcmsgaXRzZWxmLCB0byB5b3VyIG93biBYY29kZSBwcm9qZWN0LiBUaGVuLCBmcm9tIHRoZSBidWlsZCBwcm9kdWN0cyB0aGF0IGFyZSByZXZlYWxlZCBieSB0aGUgcHJvamVjdCdzIGRpc2Nsb3N1cmUgdHJpYW5nbGUsIHlvdSBjYW4gZmluZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrLCB3aGljaCBjYW4gYmUgYWRkZWQgdG8geW91ciB0YXJnZXRzIChkaXNjdXNzZWQgYmVsb3cpLgorCisjIE1ha2UgYSBUZXN0IFRhcmdldCAjCisKK1RvIHN0YXJ0IHdyaXRpbmcgdGVzdHMsIG1ha2UgYSBuZXcgIlNoZWxsIFRvb2wiIHRhcmdldC4gVGhpcyB0YXJnZXQgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIHVuZGVyIEJTRCwgQ29jb2EsIG9yIENhcmJvbi4gQWRkIHlvdXIgdW5pdCB0ZXN0IHNvdXJjZSBjb2RlIHRvIHRoZSAiQ29tcGlsZSBTb3VyY2VzIiBidWlsZCBwaGFzZSBvZiB0aGUgdGFyZ2V0LgorCitOZXh0LCB5b3UnbGwgd2FudCB0byBhZGQgZ3Rlc3QuZnJhbWV3b3JrIGluIHR3byBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIHVwb24gd2hpY2ggb3B0aW9uIHlvdSBjaG9zZSBhYm92ZS4KKworICAqICoqT3B0aW9uIDEqKiAtLS0gRHVyaW5nIGNvbXBpbGF0aW9uLCBYY29kZSB3aWxsIG5lZWQgdG8ga25vdyB0aGF0IHlvdSBhcmUgbGlua2luZyBhZ2FpbnN0IHRoZSBndGVzdC5mcmFtZXdvcmsuIEFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHRoZSAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mIHlvdXIgdGVzdCB0YXJnZXQuIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBHb29nbGUgVGVzdCBoZWFkZXJzIGluIHlvdXIgaGVhZGVyIHNlYXJjaCBwYXRoLCBhbmQgd2lsbCB0ZWxsIHRoZSBsaW5rZXIgd2hlcmUgdG8gZmluZCB0aGUgbGlicmFyeS4KKyAgKiAqKk9wdGlvbiAyKiogLS0tIElmIHlvdXIgd29ya2luZyBvdXQgb2YgdGhlIHRydW5rLCB5b3UnbGwgYWxzbyB3YW50IHRvIGFkZCBndGVzdC5mcmFtZXdvcmsgdG8geW91ciAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mIHlvdXIgdGVzdCB0YXJnZXQuIEluIGFkZGl0aW9uLCB5b3UnbGwgIHdhbnQgdG8gYWRkIHRoZSBndGVzdC5mcmFtZXdvcmsgYXMgYSBkZXBlbmRlbmN5IHRvIHlvdXIgdW5pdCB0ZXN0IHRhcmdldC4gVGhpcyB3YXksIFhjb2RlIHdpbGwgbWFrZSBzdXJlIHRoYXQgZ3Rlc3QuZnJhbWV3b3JrIGlzIHVwIHRvIGRhdGUsIGV2ZXJ5IHRpbWUgeW91ciBidWlsZCB5b3VyIHRhcmdldC4gRmluYWxseSwgaWYgeW91IGRvbid0IHNoYXJlIGJ1aWxkIGRpcmVjdG9yaWVzIHdpdGggR29vZ2xlIFRlc3QsIHlvdSdsbCBoYXZlIHRvIGNvcHkgdGhlIGd0ZXN0LmZyYW1ld29yayBpbnRvIHlvdXIgb3duIGJ1aWxkIHByb2R1Y3RzIGRpcmVjdG9yeSB1c2luZyBhICJSdW4gU2NyaXB0IiBidWlsZCBwaGFzZS4KKworIyBTZXQgVXAgdGhlIEV4ZWN1dGFibGUgUnVuIEVudmlyb25tZW50ICMKKworU2luY2UgdGhlIHVuaXQgdGVzdCBleGVjdXRhYmxlIGlzIGEgc2hlbGwgdG9vbCwgaXQgZG9lc24ndCBoYXZlIGEgYnVuZGxlIHdpdGggYSBgQ29udGVudHMvRnJhbWV3b3Jrc2AgZGlyZWN0b3J5LCBpbiB3aGljaCB0byBwbGFjZSBndGVzdC5mcmFtZXdvcmsuIEluc3RlYWQsIHRoZSBkeW5hbWljIGxpbmtlciBtdXN0IGJlIHRvbGQgYXQgcnVudGltZSB0byBzZWFyY2ggZm9yIHRoZSBmcmFtZXdvcmsgaW4gYW5vdGhlciBsb2NhdGlvbi4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHNldHRpbmcgdGhlICJEWUxEXF9GUkFNRVdPUktcX1BBVEgiIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSAiRWRpdCBBY3RpdmUgRXhlY3V0YWJsZSAuLi4iIEFyZ3VtZW50cyB0YWIsIHVuZGVyICJWYXJpYWJsZXMgdG8gYmUgc2V0IGluIHRoZSBlbnZpcm9ubWVudDoiLiBUaGUgcGF0aCBmb3IgdGhpcyB2YWx1ZSBpcyB0aGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZ3Rlc3QuZnJhbWV3b3JrLgorCitJZiB5b3UgaGF2ZW4ndCBzZXQgdXAgdGhlIERZTERcX0ZSQU1FV09SS1xfUEFUSCwgY29ycmVjdGx5LCB5b3UgbWlnaHQgZ2V0IGEgbWVzc2FnZSBsaWtlIHRoaXM6CisKK2BgYAorW1Nlc3Npb24gc3RhcnRlZCBhdCAyMDA4LTA4LTE1IDA2OjIzOjU3IC0wNjAwLl0KKyAgZHlsZDogTGlicmFyeSBub3QgbG9hZGVkOiBAbG9hZGVyX3BhdGgvLi4vRnJhbWV3b3Jrcy9ndGVzdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9ndGVzdAorICAgIFJlZmVyZW5jZWQgZnJvbTogL1VzZXJzL3VzZXJuYW1lL0RvY3VtZW50cy9TYW5kYm94L2d0ZXN0U2FtcGxlL2J1aWxkL0RlYnVnL1dpZGdldEZyYW1ld29ya1Rlc3QKKyAgICBSZWFzb246IGltYWdlIG5vdCBmb3VuZAorYGBgCisKK1RvIGNvcnJlY3QgdGhpcyBwcm9ibGVtLCBnb3QgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIG5hbWVkIGluICJSZWZlcmVuY2VkIGZyb206IiB2YWx1ZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSBhYm92ZS4gVGhlbiwgd2l0aCB0aGUgdGVybWluYWwgaW4gdGhpcyBsb2NhdGlvbiwgZmluZCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGd0ZXN0LmZyYW1ld29yay4gVGhhdCBpcyB0aGUgdmFsdWUgeW91J2xsIG5lZWQgdG8gc2V0IGFzIHRoZSBEWUxEXF9GUkFNRVdPUktcX1BBVEguCisKKyMgQnVpbGQgYW5kIEdvICMKKworTm93LCB3aGVuIHlvdSBjbGljayAiQnVpbGQgYW5kIEdvIiwgdGhlIHRlc3Qgd2lsbCBiZSBleGVjdXRlZC4gRHVtcGluZyBvdXQgc29tZXRoaW5nIGxpa2UgdGhpczoKKworYGBgCitbU2Vzc2lvbiBzdGFydGVkIGF0IDIwMDgtMDgtMDYgMDY6MzY6MTMgLTA2MDAuXQorWz09PT09PT09PT1dIFJ1bm5pbmcgMiB0ZXN0cyBmcm9tIDEgdGVzdCBjYXNlLgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK1stLS0tLS0tLS0tXSAyIHRlc3RzIGZyb20gV2lkZ2V0SW5pdGlhbGl6ZXJUZXN0CitbIFJVTiAgICAgIF0gV2lkZ2V0SW5pdGlhbGl6ZXJUZXN0LlRlc3RDb25zdHJ1Y3RvcgorWyAgICAgICBPSyBdIFdpZGdldEluaXRpYWxpemVyVGVzdC5UZXN0Q29uc3RydWN0b3IKK1sgUlVOICAgICAgXSBXaWRnZXRJbml0aWFsaXplclRlc3QuVGVzdENvbnZlcnNpb24KK1sgICAgICAgT0sgXSBXaWRnZXRJbml0aWFsaXplclRlc3QuVGVzdENvbnZlcnNpb24KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK1s9PT09PT09PT09XSAyIHRlc3RzIGZyb20gMSB0ZXN0IGNhc2UgcmFuLgorWyAgUEFTU0VEICBdIDIgdGVzdHMuCisKK1RoZSBEZWJ1Z2dlciBoYXMgZXhpdGVkIHdpdGggc3RhdHVzIDAuICAKK2BgYAorCisjIFN1bW1hcnkgIworCitVbml0IHRlc3RpbmcgaXMgYSB2YWx1YWJsZSB3YXkgdG8gZW5zdXJlIHlvdXIgZGF0YSBtb2RlbCBzdGF5cyB2YWxpZCBldmVuIGR1cmluZyByYXBpZCBkZXZlbG9wbWVudCBvciByZWZhY3RvcmluZy4gVGhlIEdvb2dsZSBUZXN0aW5nIEZyYW1ld29yayBpcyBhIGdyZWF0IHVuaXQgdGVzdGluZyBmcmFtZXdvcmsgZm9yIEMgYW5kIEMrKyB3aGljaCBpbnRlZ3JhdGVzIHdlbGwgd2l0aCBhbiBYY29kZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvZG9jcy9YY29kZUd1aWRlLm1kIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvWGNvZGVHdWlkZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI0YmY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2RvY3MvWGNvZGVHdWlkZS5tZApAQCAtMCwwICsxLDkzIEBACisKKworVGhpcyBndWlkZSB3aWxsIGV4cGxhaW4gaG93IHRvIHVzZSB0aGUgR29vZ2xlIFRlc3RpbmcgRnJhbWV3b3JrIGluIHlvdXIgWGNvZGUgcHJvamVjdHMgb24gTWFjIE9TIFguIFRoaXMgdHV0b3JpYWwgYmVnaW5zIGJ5IHF1aWNrbHkgZXhwbGFpbmluZyB3aGF0IHRvIGRvIGZvciBleHBlcmllbmNlZCB1c2Vycy4gQWZ0ZXIgdGhlIHF1aWNrIHN0YXJ0LCB0aGUgZ3VpZGUgZ29lcyBwcm92aWRlcyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGFib3V0IGVhY2ggc3RlcC4KKworIyBRdWljayBTdGFydCAjCisKK0hlcmUgaXMgdGhlIHF1aWNrIGd1aWRlIGZvciB1c2luZyBHb29nbGUgVGVzdCBpbiB5b3VyIFhjb2RlIHByb2plY3QuCisKKyAgMS4gRG93bmxvYWQgdGhlIHNvdXJjZSBmcm9tIHRoZSBbd2Vic2l0ZV0oaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QpIHVzaW5nIHRoaXMgY29tbWFuZDogYHN2biBjaGVja291dCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvIGdvb2dsZXRlc3QtcmVhZC1vbmx5YAorICAxLiBPcGVuIHVwIHRoZSBgZ3Rlc3QueGNvZGVwcm9qYCBpbiB0aGUgYGdvb2dsZXRlc3QtcmVhZC1vbmx5L3hjb2RlL2AgZGlyZWN0b3J5IGFuZCBidWlsZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrLgorICAxLiBDcmVhdGUgYSBuZXcgIlNoZWxsIFRvb2wiIHRhcmdldCBpbiB5b3VyIFhjb2RlIHByb2plY3QgY2FsbGVkIHNvbWV0aGluZyBsaWtlICJVbml0VGVzdHMiCisgIDEuIEFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHlvdXIgcHJvamVjdCBhbmQgYWRkIGl0IHRvIHRoZSAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mICJVbml0VGVzdHMiCisgIDEuIEFkZCB5b3VyIHVuaXQgdGVzdCBzb3VyY2UgY29kZSB0byB0aGUgIkNvbXBpbGUgU291cmNlcyIgYnVpbGQgcGhhc2Ugb2YgIlVuaXRUZXN0cyIKKyAgMS4gRWRpdCB0aGUgIlVuaXRUZXN0cyIgZXhlY3V0YWJsZSBhbmQgYWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVkICJEWUxEXF9GUkFNRVdPUktcX1BBVEgiIHdpdGggYSB2YWx1ZSBlcXVhbCB0byB0aGUgcGF0aCB0byB0aGUgZnJhbWV3b3JrIGNvbnRhaW5pbmcgdGhlIGd0ZXN0LmZyYW1ld29yayByZWxhdGl2ZSB0byB0aGUgY29tcGlsZWQgZXhlY3V0YWJsZS4KKyAgMS4gQnVpbGQgYW5kIEdvCisKK1RoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZnVydGhlciBleHBsYWluIGVhY2ggb2YgdGhlIHN0ZXBzIGxpc3RlZCBhYm92ZSBpbiBkZXB0aCwgZGVzY3JpYmluZyBpbiBtb3JlIGRldGFpbCBob3cgdG8gY29tcGxldGUgaXQgaW5jbHVkaW5nIHNvbWUgdmFyaWF0aW9ucy4KKworIyBHZXQgdGhlIFNvdXJjZSAjCisKK0N1cnJlbnRseSwgdGhlIGd0ZXN0LmZyYW1ld29yayBkaXNjdXNzZWQgaGVyZSBpc24ndCBhdmFpbGFibGUgaW4gYSB0YWdnZWQgcmVsZWFzZSBvZiBHb29nbGUgVGVzdCwgaXQgaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIHRydW5rLiBBcyBleHBsYWluZWQgYXQgdGhlIEdvb2dsZSBUZXN0IFtzaXRlXShodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC9zb3VyY2UvY2hlY2tvdXQiPnN2biksIHlvdSBjYW4gZ2V0IHRoZSBjb2RlIGZyb20gYW5vbnltb3VzIFNWTiB3aXRoIHRoaXMgY29tbWFuZDoKKworYGBgCitzdm4gY2hlY2tvdXQgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLyBnb29nbGV0ZXN0LXJlYWQtb25seQorYGBgCisKK0FsdGVybmF0aXZlbHksIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIFN1YnZlcnNpb24gaW4geW91ciBvd24gY29kZSBiYXNlLCB5b3UgY2FuIGFkZCBHb29nbGUgVGVzdCBhcyBhbiBleHRlcm5hbCBkZXBlbmRlbmN5IHRvIHlvdXIgb3duIFN1YnZlcnNpb24gcmVwb3NpdG9yeS4gQnkgZm9sbG93aW5nIHRoaXMgYXBwcm9hY2gsIGV2ZXJ5b25lIHRoYXQgY2hlY2tzIG91dCB5b3VyIHN2biByZXBvc2l0b3J5IHdpbGwgYWxzbyByZWNlaXZlIGEgY29weSBvZiBHb29nbGUgVGVzdCAoYSBzcGVjaWZpYyB2ZXJzaW9uLCBpZiB5b3Ugd2lzaCkgd2l0aG91dCBoYXZpbmcgdG8gY2hlY2sgaXQgb3V0IGV4cGxpY2l0bHkuIFRoaXMgbWFrZXMgdGhlIHNldCB1cCBvZiB5b3VyIHByb2plY3Qgc2ltcGxlciBhbmQgcmVkdWNlcyB0aGUgY29waWVkIGNvZGUgaW4gdGhlIHJlcG9zaXRvcnkuCisKK1RvIHVzZSBgc3ZuOmV4dGVybmFsc2AsIGRlY2lkZSB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBoYXZlIHRoZSBleHRlcm5hbCBzb3VyY2UgcmVzaWRlLiBZb3UgbWlnaHQgY2hvb3NlIHRvIHB1dCB0aGUgZXh0ZXJuYWwgc291cmNlIGluc2lkZSB0aGUgdHJ1bmssIGJlY2F1c2UgeW91IHdhbnQgaXQgdG8gYmUgcGFydCBvZiB0aGUgYnJhbmNoIHdoZW4geW91IG1ha2UgYSByZWxlYXNlLiBIb3dldmVyLCBrZWVwaW5nIGl0IG91dHNpZGUgdGhlIHRydW5rIGluIGEgdmVyc2lvbi10YWdnZWQgZGlyZWN0b3J5IGNhbGxlZCBzb21ldGhpbmcgbGlrZSBgdGhpcmQtcGFydHkvZ29vZ2xldGVzdC8xLjAuMWAsIGlzIGFub3RoZXIgb3B0aW9uLiBPbmNlIHRoZSBsb2NhdGlvbiBpcyBlc3RhYmxpc2hlZCwgdXNlIGBzdm4gcHJvcGVkaXQgc3ZuOmV4dGVybmFscyBfZGlyZWN0b3J5X2AgdG8gc2V0IHRoZSBzdm46ZXh0ZXJuYWxzIHByb3BlcnR5IG9uIGEgZGlyZWN0b3J5IGluIHlvdXIgcmVwb3NpdG9yeS4gVGhpcyBkaXJlY3Rvcnkgd29uJ3QgY29udGFpbiB0aGUgY29kZSwgYnV0IGJlIGl0cyB2ZXJzaW9uZWQgcGFyZW50IGRpcmVjdG9yeS4KKworVGhlIGNvbW1hbmQgYHN2biBwcm9wZWRpdGAgd2lsbCBicmluZyB1cCB5b3VyIFN1YnZlcnNpb24gZWRpdG9yLCBtYWtpbmcgZWRpdGluZyB0aGUgbG9uZywgKHBvdGVudGlhbGx5IG11bHRpLWxpbmUpIHByb3BlcnR5IHNpbXBsZXIuIFRoaXMgc2FtZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY2hlY2sgb3V0IGEgdGFnZ2VkIGJyYW5jaCwgYnkgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFVSTCAoZS5nLiBgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RhZ3MvcmVsZWFzZS0xLjAuMWApLiBBZGRpdGlvbmFsbHksIHRoZSBzdm46ZXh0ZXJuYWxzIHByb3BlcnR5IGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHBhcnRpY3VsYXIgcmV2aXNpb24gb2YgdGhlIHRydW5rIHdpdGggdGhlIGAtcl8jI19gIG9wdGlvbiAoZS5nLiBgZXh0ZXJuYWxzL3NyYy9nb29nbGV0ZXN0IC1yNjAgaHR0cDovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rYCkuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyB0aGUgc3ZuOmV4dGVybmFscyBwcm9wZXJ0aWVzIG9uIGEgdHJ1bmsgKHJlYWQgdmlhIGBzdm4gcHJvcGdldGApIG9mIGEgcHJvamVjdC4gVGhpcyB2YWx1ZSBjaGVja3Mgb3V0IGEgY29weSBvZiBHb29nbGUgVGVzdCBpbnRvIHRoZSBgdHJ1bmsvZXh0ZXJuYWxzL3NyYy9nb29nbGV0ZXN0L2AgZGlyZWN0b3J5LgorCitgYGAKK1tDb21wdXRlcjpzdm5dIHVzZXIkIHN2biBwcm9wZ2V0IHN2bjpleHRlcm5hbHMgdHJ1bmsKK2V4dGVybmFscy9zcmMvZ29vZ2xldGVzdCBodHRwOi8vZ29vZ2xldGVzdC5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsKK2BgYAorCisjIEFkZCB0aGUgRnJhbWV3b3JrIHRvIFlvdXIgUHJvamVjdCAjCisKK1RoZSBuZXh0IHN0ZXAgaXMgdG8gYnVpbGQgYW5kIGFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHlvdXIgb3duIHByb2plY3QuIFRoaXMgZ3VpZGUgZGVzY3JpYmVzIHR3byBjb21tb24gd2F5cyBiZWxvdy4KKworICAqICoqT3B0aW9uIDEqKiAtLS0gVGhlIHNpbXBsZXN0IHdheSB0byBhZGQgR29vZ2xlIFRlc3QgdG8geW91ciBvd24gcHJvamVjdCwgaXMgdG8gb3BlbiBndGVzdC54Y29kZXByb2ogKGZvdW5kIGluIHRoZSB4Y29kZS8gZGlyZWN0b3J5IG9mIHRoZSBHb29nbGUgVGVzdCB0cnVuaykgYW5kIGJ1aWxkIHRoZSBmcmFtZXdvcmsgbWFudWFsbHkuIFRoZW4sIGFkZCB0aGUgYnVpbHQgZnJhbWV3b3JrIGludG8geW91ciBwcm9qZWN0IHVzaW5nIHRoZSAiQWRkLT5FeGlzdGluZyBGcmFtZXdvcmsuLi4iIGZyb20gdGhlIGNvbnRleHQgbWVudSBvciAiUHJvamVjdC0+QWRkLi4uIiBmcm9tIHRoZSBtYWluIG1lbnUuIFRoZSBndGVzdC5mcmFtZXdvcmsgaXMgcmVsb2NhdGFibGUgYW5kIGNvbnRhaW5zIHRoZSBoZWFkZXJzIGFuZCBvYmplY3QgY29kZSB0aGF0IHlvdSdsbCBuZWVkIHRvIG1ha2UgdGVzdHMuIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHJlYnVpbGRpbmcgZXZlcnkgdGltZSB5b3UgdXBncmFkZSBHb29nbGUgVGVzdCBpbiB5b3VyIHByb2plY3QuCisgICogKipPcHRpb24gMioqIC0tLSBJZiB5b3UgYXJlIGdvaW5nIHRvIGJlIGxpdmluZyBvZmYgdGhlIHRydW5rIG9mIEdvb2dsZSBUZXN0LCBpbmNvcnBvcmF0aW5nIGl0cyBsYXRlc3QgZmVhdHVyZXMgaW50byB5b3VyIHVuaXQgdGVzdHMgKG9yIGFyZSBhIEdvb2dsZSBUZXN0IGRldmVsb3BlciB5b3Vyc2VsZikuIFlvdSdsbCB3YW50IHRvIHJlYnVpbGQgdGhlIGZyYW1ld29yayBldmVyeSB0aW1lIHRoZSBzb3VyY2UgdXBkYXRlcy4gdG8gZG8gdGhpcywgeW91J2xsIG5lZWQgdG8gYWRkIHRoZSBndGVzdC54Y29kZXByb2ogZmlsZSwgbm90IHRoZSBmcmFtZXdvcmsgaXRzZWxmLCB0byB5b3VyIG93biBYY29kZSBwcm9qZWN0LiBUaGVuLCBmcm9tIHRoZSBidWlsZCBwcm9kdWN0cyB0aGF0IGFyZSByZXZlYWxlZCBieSB0aGUgcHJvamVjdCdzIGRpc2Nsb3N1cmUgdHJpYW5nbGUsIHlvdSBjYW4gZmluZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrLCB3aGljaCBjYW4gYmUgYWRkZWQgdG8geW91ciB0YXJnZXRzIChkaXNjdXNzZWQgYmVsb3cpLgorCisjIE1ha2UgYSBUZXN0IFRhcmdldCAjCisKK1RvIHN0YXJ0IHdyaXRpbmcgdGVzdHMsIG1ha2UgYSBuZXcgIlNoZWxsIFRvb2wiIHRhcmdldC4gVGhpcyB0YXJnZXQgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIHVuZGVyIEJTRCwgQ29jb2EsIG9yIENhcmJvbi4gQWRkIHlvdXIgdW5pdCB0ZXN0IHNvdXJjZSBjb2RlIHRvIHRoZSAiQ29tcGlsZSBTb3VyY2VzIiBidWlsZCBwaGFzZSBvZiB0aGUgdGFyZ2V0LgorCitOZXh0LCB5b3UnbGwgd2FudCB0byBhZGQgZ3Rlc3QuZnJhbWV3b3JrIGluIHR3byBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIHVwb24gd2hpY2ggb3B0aW9uIHlvdSBjaG9zZSBhYm92ZS4KKworICAqICoqT3B0aW9uIDEqKiAtLS0gRHVyaW5nIGNvbXBpbGF0aW9uLCBYY29kZSB3aWxsIG5lZWQgdG8ga25vdyB0aGF0IHlvdSBhcmUgbGlua2luZyBhZ2FpbnN0IHRoZSBndGVzdC5mcmFtZXdvcmsuIEFkZCB0aGUgZ3Rlc3QuZnJhbWV3b3JrIHRvIHRoZSAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mIHlvdXIgdGVzdCB0YXJnZXQuIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBHb29nbGUgVGVzdCBoZWFkZXJzIGluIHlvdXIgaGVhZGVyIHNlYXJjaCBwYXRoLCBhbmQgd2lsbCB0ZWxsIHRoZSBsaW5rZXIgd2hlcmUgdG8gZmluZCB0aGUgbGlicmFyeS4KKyAgKiAqKk9wdGlvbiAyKiogLS0tIElmIHlvdXIgd29ya2luZyBvdXQgb2YgdGhlIHRydW5rLCB5b3UnbGwgYWxzbyB3YW50IHRvIGFkZCBndGVzdC5mcmFtZXdvcmsgdG8geW91ciAiTGluayBCaW5hcnkgd2l0aCBMaWJyYXJpZXMiIGJ1aWxkIHBoYXNlIG9mIHlvdXIgdGVzdCB0YXJnZXQuIEluIGFkZGl0aW9uLCB5b3UnbGwgIHdhbnQgdG8gYWRkIHRoZSBndGVzdC5mcmFtZXdvcmsgYXMgYSBkZXBlbmRlbmN5IHRvIHlvdXIgdW5pdCB0ZXN0IHRhcmdldC4gVGhpcyB3YXksIFhjb2RlIHdpbGwgbWFrZSBzdXJlIHRoYXQgZ3Rlc3QuZnJhbWV3b3JrIGlzIHVwIHRvIGRhdGUsIGV2ZXJ5IHRpbWUgeW91ciBidWlsZCB5b3VyIHRhcmdldC4gRmluYWxseSwgaWYgeW91IGRvbid0IHNoYXJlIGJ1aWxkIGRpcmVjdG9yaWVzIHdpdGggR29vZ2xlIFRlc3QsIHlvdSdsbCBoYXZlIHRvIGNvcHkgdGhlIGd0ZXN0LmZyYW1ld29yayBpbnRvIHlvdXIgb3duIGJ1aWxkIHByb2R1Y3RzIGRpcmVjdG9yeSB1c2luZyBhICJSdW4gU2NyaXB0IiBidWlsZCBwaGFzZS4KKworIyBTZXQgVXAgdGhlIEV4ZWN1dGFibGUgUnVuIEVudmlyb25tZW50ICMKKworU2luY2UgdGhlIHVuaXQgdGVzdCBleGVjdXRhYmxlIGlzIGEgc2hlbGwgdG9vbCwgaXQgZG9lc24ndCBoYXZlIGEgYnVuZGxlIHdpdGggYSBgQ29udGVudHMvRnJhbWV3b3Jrc2AgZGlyZWN0b3J5LCBpbiB3aGljaCB0byBwbGFjZSBndGVzdC5mcmFtZXdvcmsuIEluc3RlYWQsIHRoZSBkeW5hbWljIGxpbmtlciBtdXN0IGJlIHRvbGQgYXQgcnVudGltZSB0byBzZWFyY2ggZm9yIHRoZSBmcmFtZXdvcmsgaW4gYW5vdGhlciBsb2NhdGlvbi4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHNldHRpbmcgdGhlICJEWUxEXF9GUkFNRVdPUktcX1BBVEgiIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSAiRWRpdCBBY3RpdmUgRXhlY3V0YWJsZSAuLi4iIEFyZ3VtZW50cyB0YWIsIHVuZGVyICJWYXJpYWJsZXMgdG8gYmUgc2V0IGluIHRoZSBlbnZpcm9ubWVudDoiLiBUaGUgcGF0aCBmb3IgdGhpcyB2YWx1ZSBpcyB0aGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZ3Rlc3QuZnJhbWV3b3JrLgorCitJZiB5b3UgaGF2ZW4ndCBzZXQgdXAgdGhlIERZTERcX0ZSQU1FV09SS1xfUEFUSCwgY29ycmVjdGx5LCB5b3UgbWlnaHQgZ2V0IGEgbWVzc2FnZSBsaWtlIHRoaXM6CisKK2BgYAorW1Nlc3Npb24gc3RhcnRlZCBhdCAyMDA4LTA4LTE1IDA2OjIzOjU3IC0wNjAwLl0KKyAgZHlsZDogTGlicmFyeSBub3QgbG9hZGVkOiBAbG9hZGVyX3BhdGgvLi4vRnJhbWV3b3Jrcy9ndGVzdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9ndGVzdAorICAgIFJlZmVyZW5jZWQgZnJvbTogL1VzZXJzL3VzZXJuYW1lL0RvY3VtZW50cy9TYW5kYm94L2d0ZXN0U2FtcGxlL2J1aWxkL0RlYnVnL1dpZGdldEZyYW1ld29ya1Rlc3QKKyAgICBSZWFzb246IGltYWdlIG5vdCBmb3VuZAorYGBgCisKK1RvIGNvcnJlY3QgdGhpcyBwcm9ibGVtLCBnb3QgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIG5hbWVkIGluICJSZWZlcmVuY2VkIGZyb206IiB2YWx1ZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSBhYm92ZS4gVGhlbiwgd2l0aCB0aGUgdGVybWluYWwgaW4gdGhpcyBsb2NhdGlvbiwgZmluZCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGd0ZXN0LmZyYW1ld29yay4gVGhhdCBpcyB0aGUgdmFsdWUgeW91J2xsIG5lZWQgdG8gc2V0IGFzIHRoZSBEWUxEXF9GUkFNRVdPUktcX1BBVEguCisKKyMgQnVpbGQgYW5kIEdvICMKKworTm93LCB3aGVuIHlvdSBjbGljayAiQnVpbGQgYW5kIEdvIiwgdGhlIHRlc3Qgd2lsbCBiZSBleGVjdXRlZC4gRHVtcGluZyBvdXQgc29tZXRoaW5nIGxpa2UgdGhpczoKKworYGBgCitbU2Vzc2lvbiBzdGFydGVkIGF0IDIwMDgtMDgtMDYgMDY6MzY6MTMgLTA2MDAuXQorWz09PT09PT09PT1dIFJ1bm5pbmcgMiB0ZXN0cyBmcm9tIDEgdGVzdCBjYXNlLgorWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK1stLS0tLS0tLS0tXSAyIHRlc3RzIGZyb20gV2lkZ2V0SW5pdGlhbGl6ZXJUZXN0CitbIFJVTiAgICAgIF0gV2lkZ2V0SW5pdGlhbGl6ZXJUZXN0LlRlc3RDb25zdHJ1Y3RvcgorWyAgICAgICBPSyBdIFdpZGdldEluaXRpYWxpemVyVGVzdC5UZXN0Q29uc3RydWN0b3IKK1sgUlVOICAgICAgXSBXaWRnZXRJbml0aWFsaXplclRlc3QuVGVzdENvbnZlcnNpb24KK1sgICAgICAgT0sgXSBXaWRnZXRJbml0aWFsaXplclRlc3QuVGVzdENvbnZlcnNpb24KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK1s9PT09PT09PT09XSAyIHRlc3RzIGZyb20gMSB0ZXN0IGNhc2UgcmFuLgorWyAgUEFTU0VEICBdIDIgdGVzdHMuCisKK1RoZSBEZWJ1Z2dlciBoYXMgZXhpdGVkIHdpdGggc3RhdHVzIDAuICAKK2BgYAorCisjIFN1bW1hcnkgIworCitVbml0IHRlc3RpbmcgaXMgYSB2YWx1YWJsZSB3YXkgdG8gZW5zdXJlIHlvdXIgZGF0YSBtb2RlbCBzdGF5cyB2YWxpZCBldmVuIGR1cmluZyByYXBpZCBkZXZlbG9wbWVudCBvciByZWZhY3RvcmluZy4gVGhlIEdvb2dsZSBUZXN0aW5nIEZyYW1ld29yayBpcyBhIGdyZWF0IHVuaXQgdGVzdGluZyBmcmFtZXdvcmsgZm9yIEMgYW5kIEMrKyB3aGljaCBpbnRlZ3JhdGVzIHdlbGwgd2l0aCBhbiBYY29kZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3YTY5YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaApAQCAtMCwwICsxLDI5NCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWMgQVBJIGZvciBkZWF0aCB0ZXN0cy4gIEl0IGlzCisvLyAjaW5jbHVkZWQgYnkgZ3Rlc3QuaCBzbyBhIHVzZXIgZG9lc24ndCBuZWVkIHRvIGluY2x1ZGUgdGhpcworLy8gZGlyZWN0bHkuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoaXMgZmxhZyBjb250cm9scyB0aGUgc3R5bGUgb2YgZGVhdGggdGVzdHMuICBWYWxpZCB2YWx1ZXMgYXJlICJ0aHJlYWRzYWZlIiwKKy8vIG1lYW5pbmcgdGhhdCB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHdpbGwgcmUtZXhlY3V0ZSB0aGUgdGVzdCBiaW5hcnkKKy8vIGZyb20gdGhlIHN0YXJ0LCBydW5uaW5nIG9ubHkgYSBzaW5nbGUgZGVhdGggdGVzdCwgb3IgImZhc3QiLAorLy8gbWVhbmluZyB0aGF0IHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgZXhlY3V0ZSB0aGUgdGVzdCBsb2dpYyBpbW1lZGlhdGVseQorLy8gYWZ0ZXIgZm9ya2luZy4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhkZWF0aF90ZXN0X3N0eWxlKTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFJldHVybnMgYSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2FsbGVyIGlzIGN1cnJlbnRseQorLy8gZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuICBUb29scyBzdWNoIGFzCisvLyBWYWxncmluZCBoZWFwIGNoZWNrZXJzIG1heSBuZWVkIHRoaXMgdG8gbW9kaWZ5IHRoZWlyIGJlaGF2aW9yIGluIGRlYXRoCisvLyB0ZXN0cy4gIElNUE9SVEFOVDogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5LiAgVXNpbmcgaXQgbWF5IGJyZWFrIHRoZQorLy8gaW1wbGVtZW50YXRpb24gb2YgZGVhdGggdGVzdHMuICBVc2VyIGNvZGUgTVVTVCBOT1QgdXNlIGl0LgorR1RFU1RfQVBJXyBib29sIEluRGVhdGhUZXN0Q2hpbGQoKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVhdGggdGVzdHMuCisKKy8vIEhlcmUncyB3aGF0IGhhcHBlbnMgd2hlbiBhbiBBU1NFUlRfREVBVEgqIG9yIEVYUEVDVF9ERUFUSCogaXMKKy8vIGV4ZWN1dGVkOgorLy8KKy8vICAgMS4gSXQgZ2VuZXJhdGVzIGEgd2FybmluZyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGFjdGl2ZQorLy8gICB0aHJlYWQuICBUaGlzIGlzIGJlY2F1c2UgaXQncyBzYWZlIHRvIGZvcmsoKSBvciBjbG9uZSgpIG9ubHkKKy8vICAgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB0aHJlYWQuCisvLworLy8gICAyLiBUaGUgcGFyZW50IHByb2Nlc3MgY2xvbmUoKXMgYSBzdWItcHJvY2VzcyBhbmQgcnVucyB0aGUgZGVhdGgKKy8vICAgdGVzdCBpbiBpdDsgdGhlIHN1Yi1wcm9jZXNzIGV4aXRzIHdpdGggY29kZSAwIGF0IHRoZSBlbmQgb2YgdGhlCisvLyAgIGRlYXRoIHRlc3QsIGlmIGl0IGhhc24ndCBleGl0ZWQgYWxyZWFkeS4KKy8vCisvLyAgIDMuIFRoZSBwYXJlbnQgcHJvY2VzcyB3YWl0cyBmb3IgdGhlIHN1Yi1wcm9jZXNzIHRvIHRlcm1pbmF0ZS4KKy8vCisvLyAgIDQuIFRoZSBwYXJlbnQgcHJvY2VzcyBjaGVja3MgdGhlIGV4aXQgY29kZSBhbmQgZXJyb3IgbWVzc2FnZSBvZgorLy8gICB0aGUgc3ViLXByb2Nlc3MuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBBU1NFUlRfREVBVEgoc2VydmVyLlNlbmRNZXNzYWdlKDU2LCAiSGVsbG8iKSwgIkludmFsaWQgcG9ydCBudW1iZXIiKTsKKy8vICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKy8vICAgICBFWFBFQ1RfREVBVEgoc2VydmVyLlByb2Nlc3NSZXF1ZXN0KGkpLAorLy8gICAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1ZXN0IC4qIGluIFByb2Nlc3NSZXF1ZXN0KCkiKQorLy8gICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGRpZSBvbiByZXF1ZXN0ICIgPDwgaTsKKy8vICAgfQorLy8KKy8vICAgQVNTRVJUX0VYSVQoc2VydmVyLkV4aXROb3coKSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIkV4aXRpbmciKTsKKy8vCisvLyAgIGJvb2wgS2lsbGVkQnlTSUdIVVAoaW50IGV4aXRfY29kZSkgeworLy8gICAgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X2NvZGUpICYmIFdURVJNU0lHKGV4aXRfY29kZSkgPT0gU0lHSFVQOworLy8gICB9CisvLworLy8gICBBU1NFUlRfRVhJVChjbGllbnQuSGFuZ1VwU2VydmVyKCksIEtpbGxlZEJ5U0lHSFVQLCAiSGFuZ2luZyB1cCEiKTsKKy8vCisvLyBPbiB0aGUgcmVndWxhciBleHByZXNzaW9ucyB1c2VkIGluIGRlYXRoIHRlc3RzOgorLy8KKy8vICAgT24gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMgKCpuaXgpLCB3ZSB1c2UgdGhlIDxyZWdleC5oPiBsaWJyYXJ5LAorLy8gICB3aGljaCB1c2VzIHRoZSBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguCisvLworLy8gICBPbiBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyksIHdlIG9ubHkgc3VwcG9ydCBhIHNpbXBsZSByZWdleAorLy8gICBzeW50YXggaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBHb29nbGUgVGVzdC4gIFRoaXMgbGltaXRlZAorLy8gICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZW5vdWdoIG1vc3Qgb2YgdGhlIHRpbWUgd2hlbiB3cml0aW5nCisvLyAgIGRlYXRoIHRlc3RzOyB0aG91Z2ggaXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUENSRQorLy8gICBvciBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydAorLy8gICB1bmlvbiAoInh8eSIpLCBncm91cGluZyAoIih4eSkiKSwgYnJhY2tldHMgKCJbeHldIiksIGFuZAorLy8gICByZXBldGl0aW9uIGNvdW50ICgieHs1LDd9IiksIGFtb25nIG90aGVycy4KKy8vCisvLyAgIEJlbG93IGlzIHRoZSBzeW50YXggdGhhdCB3ZSBkbyBzdXBwb3J0LiAgV2UgY2hvc2UgaXQgdG8gYmUgYQorLy8gICBzdWJzZXQgb2YgYm90aCBQQ1JFIGFuZCBQT1NJWCBleHRlbmRlZCByZWdleCwgc28gaXQncyBlYXN5IHRvCisvLyAgIGxlYXJuIHdoZXJldmVyIHlvdSBjb21lIGZyb20uICBJbiB0aGUgZm9sbG93aW5nOiAnQScgZGVub3RlcyBhCisvLyAgIGxpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKC4pLCBvciBhIHNpbmdsZSBcXCBlc2NhcGUgc2VxdWVuY2U7CisvLyAgICd4JyBhbmQgJ3knIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zOyAnbScgYW5kICduJyBhcmUgZm9yCisvLyAgIG5hdHVyYWwgbnVtYmVycy4KKy8vCisvLyAgICAgYyAgICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYworLy8gICAgIFxcZCAgIG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXEQgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXGYgICBtYXRjaGVzIFxmCisvLyAgICAgXFxuICAgbWF0Y2hlcyBcbgorLy8gICAgIFxcciAgIG1hdGNoZXMgXHIKKy8vICAgICBcXHMgICBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgXG4KKy8vICAgICBcXFMgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIHdoaXRlc3BhY2UKKy8vICAgICBcXHQgICBtYXRjaGVzIFx0CisvLyAgICAgXFx2ICAgbWF0Y2hlcyBcdgorLy8gICAgIFxcdyAgIG1hdGNoZXMgYW55IGxldHRlciwgXywgb3IgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcVyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IFxcdyBkb2Vzbid0IG1hdGNoCisvLyAgICAgXFxjICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYywgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uCisvLyAgICAgLiAgICAgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgXG4KKy8vICAgICBBPyAgICBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBBCisvLyAgICAgQSogICAgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQorLy8gICAgIEErICAgIG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIEEKKy8vICAgICBeICAgICBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICAkICAgICBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICB4eSAgICBtYXRjaGVzIHggZm9sbG93ZWQgYnkgeQorLy8KKy8vICAgSWYgeW91IGFjY2lkZW50YWxseSB1c2UgUENSRSBvciBQT1NJWCBleHRlbmRlZCByZWdleCBmZWF0dXJlcworLy8gICBub3QgaW1wbGVtZW50ZWQgYnkgdXMsIHlvdSB3aWxsIGdldCBhIHJ1bi10aW1lIGZhaWx1cmUuICBJbiB0aGF0CisvLyAgIGNhc2UsIHBsZWFzZSB0cnkgdG8gcmV3cml0ZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gdGhlCisvLyAgIGFib3ZlIHN5bnRheC4KKy8vCisvLyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgKm5vdCogbWVhbnQgdG8gYmUgYXMgaGlnaGx5IHR1bmVkIG9yIHJvYnVzdAorLy8gICBhcyBhIGNvbXBpbGVkIHJlZ2V4IGxpYnJhcnksIGJ1dCBzaG91bGQgcGVyZm9ybSB3ZWxsIGVub3VnaCBmb3IgYQorLy8gICBkZWF0aCB0ZXN0LCB3aGljaCBhbHJlYWR5IGluY3VycyBzaWduaWZpY2FudCBvdmVyaGVhZCBieSBsYXVuY2hpbmcKKy8vICAgYSBjaGlsZCBwcm9jZXNzLgorLy8KKy8vIEtub3duIGNhdmVhdHM6CisvLworLy8gICBBICJ0aHJlYWRzYWZlIiBzdHlsZSBkZWF0aCB0ZXN0IG9idGFpbnMgdGhlIHBhdGggdG8gdGhlIHRlc3QKKy8vICAgcHJvZ3JhbSBmcm9tIGFyZ3ZbMF0gYW5kIHJlLWV4ZWN1dGVzIGl0IGluIHRoZSBzdWItcHJvY2Vzcy4gIEZvcgorLy8gICBzaW1wbGljaXR5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSAorLy8gICB3aGVuIGxhdW5jaGluZyB0aGUgc3ViLXByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdAorLy8gICBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lCisvLyAgIHBhdGggc2VwYXJhdG9yIChlLmcuIHBhdGgvdG8vZm9vX3Rlc3QgYW5kCisvLyAgIC9hYnNvbHV0ZS9wYXRoL3RvL2Jhcl90ZXN0IGFyZSBmaW5lLCBidXQgZm9vX3Rlc3QgaXMgbm90KS4gIFRoaXMKKy8vICAgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBwZW9wbGUgdXN1YWxseSBkb24ndCBwdXQgdGhlIHRlc3QgYmluYXJ5CisvLyAgIGRpcmVjdG9yeSBpbiBQQVRILgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzIHNlYXJjaCB0aGUgUEFUSC4KKworLy8gQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gc3RhdGVtZW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0LCB3aXRoIGFuCisvLyBpbnRlZ2VyIGV4aXQgc3RhdHVzIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSwgYW5kIGVtaXR0aW5nIGVycm9yIG91dHB1dAorLy8gdGhhdCBtYXRjaGVzIHJlZ2V4LgorIyBkZWZpbmUgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcCisgICAgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gTGlrZSBBU1NFUlRfRVhJVCwgYnV0IGNvbnRpbnVlcyBvbiB0byBzdWNjZXNzaXZlIHRlc3RzIGluIHRoZQorLy8gdGVzdCBjYXNlLCBpZiBhbnk6CisjIGRlZmluZSBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKKyAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIGVpdGhlciBieQorLy8gZXhwbGljaXRseSBleGl0aW5nIHdpdGggYSBub256ZXJvIGV4aXQgY29kZSBvciBiZWluZyBraWxsZWQgYnkgYQorLy8gc2lnbmFsLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0IHRoYXQgbWF0Y2hlcyByZWdleC4KKyMgZGVmaW5lIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIExpa2UgQVNTRVJUX0RFQVRILCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCisvLyB0ZXN0IGNhc2UsIGlmIGFueToKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgRVhQRUNUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIFR3byBwcmVkaWNhdGUgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHtBU1NFUlQsRVhQRUNUfV9FWElUKjoKKworLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGEgbm9ybWFsIGV4aXQgd2l0aCBhIGdpdmVuIGV4aXQgY29kZS4KK2NsYXNzIEdURVNUX0FQSV8gRXhpdGVkV2l0aENvZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSk7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRXhpdGVkV2l0aENvZGUmIG90aGVyKTsKKworICBjb25zdCBpbnQgZXhpdF9jb2RlXzsKK307CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIFRlc3RzIHRoYXQgYW4gZXhpdCBjb2RlIGRlc2NyaWJlcyBhbiBleGl0IGR1ZSB0byB0ZXJtaW5hdGlvbiBieSBhCisvLyBnaXZlbiBzaWduYWwuCitjbGFzcyBHVEVTVF9BUElfIEtpbGxlZEJ5U2lnbmFsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEtpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pOworICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsKKyBwcml2YXRlOgorICBjb25zdCBpbnQgc2lnbnVtXzsKK307CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLgorLy8gVGhlIGRlYXRoIHRlc3RpbmcgZnJhbWV3b3JrIGNhdXNlcyB0aGlzIHRvIGhhdmUgaW50ZXJlc3Rpbmcgc2VtYW50aWNzLAorLy8gc2luY2UgdGhlIHNpZGVlZmZlY3RzIG9mIHRoZSBjYWxsIGFyZSBvbmx5IHZpc2libGUgaW4gb3B0IG1vZGUsIGFuZCBub3QKKy8vIGluIGRlYnVnIG1vZGUuCisvLworLy8gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBmdW5jdGlvbnMgdGhhdCB1dGlsaXplIHRoZQorLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToKKy8vCisvLyBpbnQgRGllSW5EZWJ1Z09yMTIoaW50KiBzaWRlZWZmZWN0KSB7CisvLyAgIGlmIChzaWRlZWZmZWN0KSB7CisvLyAgICAgKnNpZGVlZmZlY3QgPSAxMjsKKy8vICAgfQorLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOworLy8gICByZXR1cm4gMTI7CisvLyB9CisvLworLy8gVEVTVChUZXN0Q2FzZSwgVGVzdERpZU9yMTJXb3Jrc0luRGdiQW5kT3B0KSB7CisvLyAgIGludCBzaWRlZWZmZWN0ID0gMDsKKy8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4KKy8vICAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSwgImRlYXRoIik7CisvLworLy8gI2lmZGVmIE5ERUJVRworLy8gICAvLyBvcHQtbW9kZSBoYXMgc2lkZWVmZmVjdCB2aXNpYmxlLgorLy8gICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOworLy8gI2Vsc2UKKy8vICAgLy8gZGJnLW1vZGUgbm8gdmlzaWJsZSBzaWRlZWZmZWN0LgorLy8gICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisvLyAjZW5kaWYKKy8vIH0KKy8vCisvLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnCisvLyBtb2RlLCB1c3VhbGx5IGR1ZSB0byBhIERDSEVDSyBvciBMT0coREZBVEFMKSwgYnV0IHJldHVybnMgdGhlCisvLyBhcHByb3ByaWF0ZSBmYWxsYmFjayB2YWx1ZSAoMTIgaW4gdGhpcyBjYXNlKSBpbiBvcHQgbW9kZS4gSWYgeW91CisvLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0CisvLyBtb2RlLCBpbmNsdWRlIGFzc2VydGlvbnMgYWdhaW5zdCB0aGUgc2lkZS1lZmZlY3RzLiAgQSBnZW5lcmFsCisvLyBwYXR0ZXJuIGZvciB0aGlzIGlzOgorLy8KKy8vIEVYUEVDVF9ERUJVR19ERUFUSCh7CisvLyAgIC8vIFNpZGUtZWZmZWN0cyBoZXJlIHdpbGwgaGF2ZSBhbiBlZmZlY3QgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaW4KKy8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuCisvLyAgIEVYUEVDVF9FUSgxMiwgRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpKTsKKy8vIH0sICJkZWF0aCIpOworLy8KKyMgaWZkZWYgTkRFQlVHCisKKyMgIGRlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBHVEVTVF9FWEVDVVRFX1NUQVRFTUVOVF8oc3RhdGVtZW50LCByZWdleCkKKworIyAgZGVmaW5lIEFTU0VSVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KQorCisjIGVsc2UKKworIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorCisjICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCisKKyMgZW5kaWYgIC8vIE5ERUJVRyBmb3IgRVhQRUNUX0RFQlVHX0RFQVRICisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgYW5kCisvLyBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGV4cGFuZCB0byByZWFsIGRlYXRoIHRlc3RzIGlmCisvLyBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgdGhleSBqdXN0IGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMKKy8vIHVzZWZ1bCB3aGVuIHlvdSBhcmUgY29tYmluaW5nIGRlYXRoIHRlc3QgYXNzZXJ0aW9ucyB3aXRoIG5vcm1hbCB0ZXN0CisvLyBhc3NlcnRpb25zIGluIG9uZSB0ZXN0LgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisjIGRlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorI2Vsc2UKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsICkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHJldHVybikKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODc5YmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgTWVzc2FnZSBjbGFzcy4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKy8vIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3BlcmF0b3I8PCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKy8vIFNlZSBNZXNzYWdlJiBvcGVyYXRvcjw8KC4uLikgYmVsb3cgZm9yIHdoeS4KK3ZvaWQgb3BlcmF0b3I8PChjb25zdCB0ZXN0aW5nOjppbnRlcm5hbDo6U2VjcmV0JiwgaW50KTsKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUaGUgTWVzc2FnZSBjbGFzcyB3b3JrcyBsaWtlIGFuIG9zdHJlYW0gcmVwZWF0ZXIuCisvLworLy8gVHlwaWNhbCB1c2FnZToKKy8vCisvLyAgIDEuIFlvdSBzdHJlYW0gYSBidW5jaCBvZiB2YWx1ZXMgdG8gYSBNZXNzYWdlIG9iamVjdC4KKy8vICAgICAgSXQgd2lsbCByZW1lbWJlciB0aGUgdGV4dCBpbiBhIHN0cmluZ3N0cmVhbS4KKy8vICAgMi4gVGhlbiB5b3Ugc3RyZWFtIHRoZSBNZXNzYWdlIG9iamVjdCB0byBhbiBvc3RyZWFtLgorLy8gICAgICBUaGlzIGNhdXNlcyB0aGUgdGV4dCBpbiB0aGUgTWVzc2FnZSB0byBiZSBzdHJlYW1lZAorLy8gICAgICB0byB0aGUgb3N0cmVhbS4KKy8vCisvLyBGb3IgZXhhbXBsZTsKKy8vCisvLyAgIHRlc3Rpbmc6Ok1lc3NhZ2UgZm9vOworLy8gICBmb28gPDwgMSA8PCAiICE9ICIgPDwgMjsKKy8vICAgc3RkOjpjb3V0IDw8IGZvbzsKKy8vCisvLyB3aWxsIHByaW50ICIxICE9IDIiLgorLy8KKy8vIE1lc3NhZ2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGluaGVyaXRlZCBmcm9tLiAgSW4gcGFydGljdWxhciwgaXRzCisvLyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgorLy8KKy8vIE5vdGUgdGhhdCBzdHJpbmdzdHJlYW0gYmVoYXZlcyBkaWZmZXJlbnRseSBpbiBnY2MgYW5kIGluIE1TVkMuICBZb3UKKy8vIGNhbiBzdHJlYW0gYSBOVUxMIGNoYXIgcG9pbnRlciB0byBpdCBpbiB0aGUgZm9ybWVyLCBidXQgbm90IGluIHRoZQorLy8gbGF0dGVyIChpdCBjYXVzZXMgYW4gYWNjZXNzIHZpb2xhdGlvbiBpZiB5b3UgZG8pLiAgVGhlIE1lc3NhZ2UKKy8vIGNsYXNzIGhpZGVzIHRoaXMgZGlmZmVyZW5jZSBieSB0cmVhdGluZyBhIE5VTEwgY2hhciBwb2ludGVyIGFzCisvLyAiKG51bGwpIi4KK2NsYXNzIEdURVNUX0FQSV8gTWVzc2FnZSB7CisgcHJpdmF0ZToKKyAgLy8gVGhlIHR5cGUgb2YgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIChlbmRsLCBlbmRzLCBhbmQgZmx1c2gpIGZvcgorICAvLyBuYXJyb3cgc3RyZWFtcy4KKyAgdHlwZWRlZiBzdGQ6Om9zdHJlYW0mICgqQmFzaWNOYXJyb3dJb01hbmlwKShzdGQ6Om9zdHJlYW0mKTsKKworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBNZXNzYWdlLgorICBNZXNzYWdlKCk7CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtc2cpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7ICAvLyBOT0xJTlQKKyAgICAqc3NfIDw8IG1zZy5HZXRTdHJpbmcoKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdHMgYSBNZXNzYWdlIGZyb20gYSBDLXN0cmluZy4KKyAgZXhwbGljaXQgTWVzc2FnZShjb25zdCBjaGFyKiBzdHIpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7CisgICAgKnNzXyA8PCBzdHI7CisgIH0KKworI2lmIEdURVNUX09TX1NZTUJJQU4KKyAgLy8gU3RyZWFtcyBhIHZhbHVlIChlaXRoZXIgYSBwb2ludGVyIG9yIG5vdCkgdG8gdGhpcyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsdWUpIHsKKyAgICBTdHJlYW1IZWxwZXIodHlwZW5hbWUgaW50ZXJuYWw6OmlzX3BvaW50ZXI8VD46OnR5cGUoKSwgdmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorI2Vsc2UKKyAgLy8gU3RyZWFtcyBhIG5vbi1wb2ludGVyIHZhbHVlIHRvIHRoaXMgb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmIHZhbCkgeworICAgIC8vIFNvbWUgbGlicmFyaWVzIG92ZXJsb2FkIDw8IGZvciBTVEwgY29udGFpbmVycy4gIFRoZXNlCisgICAgLy8gb3ZlcmxvYWRzIGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGluc3RlYWQgb2YgOjpzdGQuCisgICAgLy8KKyAgICAvLyBDKysncyBzeW1ib2wgbG9va3VwIHJ1bGUgKGkuZS4gS29lbmlnIGxvb2t1cCkgc2F5cyB0aGF0IHRoZXNlCisgICAgLy8gb3ZlcmxvYWRzIGFyZSB2aXNpYmxlIGluIGVpdGhlciB0aGUgc3RkIG5hbWVzcGFjZSBvciB0aGUgZ2xvYmFsCisgICAgLy8gbmFtZXNwYWNlLCBidXQgbm90IG90aGVyIG5hbWVzcGFjZXMsIGluY2x1ZGluZyB0aGUgdGVzdGluZworICAgIC8vIG5hbWVzcGFjZSB3aGljaCBHb29nbGUgVGVzdCdzIE1lc3NhZ2UgY2xhc3MgaXMgaW4uCisgICAgLy8KKyAgICAvLyBUbyBhbGxvdyBTVEwgY29udGFpbmVycyAoYW5kIG90aGVyIHR5cGVzIHRoYXQgaGFzIGEgPDwgb3BlcmF0b3IKKyAgICAvLyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlKSB0byBiZSB1c2VkIGluIEdvb2dsZSBUZXN0CisgICAgLy8gYXNzZXJ0aW9ucywgdGVzdGluZzo6TWVzc2FnZSBtdXN0IGFjY2VzcyB0aGUgY3VzdG9tIDw8IG9wZXJhdG9yCisgICAgLy8gZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFdpdGggdGhpcyB1c2luZyBkZWNsYXJhdGlvbiwKKyAgICAvLyBvdmVybG9hZHMgb2YgPDwgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBhbmQgdGhvc2UKKyAgICAvLyB2aXNpYmxlIHZpYSBLb2VuaWcgbG9va3VwIGFyZSBib3RoIGV4cG9zZWQgaW4gdGhpcyBmdW5jdGlvbi4KKyAgICB1c2luZyA6Om9wZXJhdG9yIDw8OworICAgICpzc18gPDwgdmFsOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFN0cmVhbXMgYSBwb2ludGVyIHZhbHVlIHRvIHRoaXMgb2JqZWN0LgorICAvLworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGFuIG92ZXJsb2FkIG9mIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuIHlvdQorICAvLyBzdHJlYW0gYSBwb2ludGVyIHRvIGEgTWVzc2FnZSwgdGhpcyBkZWZpbml0aW9uIHdpbGwgYmUgdXNlZCBhcyBpdAorICAvLyBpcyBtb3JlIHNwZWNpYWxpemVkLiAgKFRoZSBDKysgU3RhbmRhcmQsIHNlY3Rpb24KKyAgLy8gW3RlbXAuZnVuYy5vcmRlcl0uKSAgSWYgeW91IHN0cmVhbSBhIG5vbi1wb2ludGVyLCB0aGVuIHRoZQorICAvLyBwcmV2aW91cyBkZWZpbml0aW9uIHdpbGwgYmUgdXNlZC4KKyAgLy8KKyAgLy8gVGhlIHJlYXNvbiBmb3IgdGhpcyBvdmVybG9hZCBpcyB0aGF0IHN0cmVhbWluZyBhIE5VTEwgcG9pbnRlciB0bworICAvLyBvc3RyZWFtIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4gIERlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIsIHlvdQorICAvLyBtYXkgZ2V0ICIwIiwgIihuaWwpIiwgIihudWxsKSIsIG9yIGFuIGFjY2VzcyB2aW9sYXRpb24uICBUbworICAvLyBlbnN1cmUgY29uc2lzdGVudCByZXN1bHQgYWNyb3NzIGNvbXBpbGVycywgd2UgYWx3YXlzIHRyZWF0IE5VTEwKKyAgLy8gYXMgIihudWxsKSIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoVCogY29uc3QmIHBvaW50ZXIpIHsgIC8vIE5PTElOVAorICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsKKyAgICAgICpzc18gPDwgIihudWxsKSI7CisgICAgfSBlbHNlIHsKKyAgICAgICpzc18gPDwgcG9pbnRlcjsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKworICAvLyBTaW5jZSB0aGUgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIGFyZSBvdmVybG9hZGVkIGZvciBib3RoIG5hcnJvdworICAvLyBhbmQgd2lkZSBzdHJlYW1zLCB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhpcyBzcGVjaWFsaXplZCBkZWZpbml0aW9uCisgIC8vIG9mIG9wZXJhdG9yIDw8LCBldmVuIHRob3VnaCBpdHMgYm9keSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgLy8gdGVtcGxhdGl6ZWQgdmVyc2lvbiBhYm92ZS4gIFdpdGhvdXQgdGhpcyBkZWZpbml0aW9uLCBzdHJlYW1pbmcKKyAgLy8gZW5kbCBvciBvdGhlciBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgdG8gTWVzc2FnZSB3aWxsIGNvbmZ1c2UgdGhlCisgIC8vIGNvbXBpbGVyLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChCYXNpY05hcnJvd0lvTWFuaXAgdmFsKSB7CisgICAgKnNzXyA8PCB2YWw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW5zdGVhZCBvZiAxLzAsIHdlIHdhbnQgdG8gc2VlIHRydWUvZmFsc2UgZm9yIGJvb2wgdmFsdWVzLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChib29sIGIpIHsKKyAgICByZXR1cm4gKnRoaXMgPDwgKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgfQorCisgIC8vIFRoZXNlIHR3byBvdmVybG9hZHMgYWxsb3cgc3RyZWFtaW5nIGEgd2lkZSBDIHN0cmluZyB0byBhIE1lc3NhZ2UKKyAgLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKKyAgTWVzc2FnZSYgb3BlcmF0b3IgPDwod2NoYXJfdCogd2lkZV9jX3N0cik7CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKyAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKyAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KKyAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjpzdGQ6OndzdHJpbmcmIHdzdHIpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworICAvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorICAvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCA6OndzdHJpbmcmIHdzdHIpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworICAvLyBHZXRzIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IHNvIGZhciBhcyBhbiBzdGQ6OnN0cmluZy4KKyAgLy8gRWFjaCAnXDAnIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCisgIC8vCisgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKyAgc3RkOjpzdHJpbmcgR2V0U3RyaW5nKCkgY29uc3Q7CisKKyBwcml2YXRlOgorCisjaWYgR1RFU1RfT1NfU1lNQklBTgorICAvLyBUaGVzZSBhcmUgbmVlZGVkIGFzIHRoZSBOb2tpYSBTeW1iaWFuIENvbXBpbGVyIGNhbm5vdCBkZWNpZGUgYmV0d2VlbgorICAvLyBjb25zdCBUJiBhbmQgY29uc3QgVCogaW4gYSBmdW5jdGlvbiB0ZW1wbGF0ZS4gVGhlIE5va2lhIGNvbXBpbGVyIF9jYW5fCisgIC8vIGRlY2lkZSBiZXR3ZWVuIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgVCBhbmQgVCosIHNvIGEKKyAgLy8gdHIxOjp0eXBlX3RyYWl0cy1saWtlIGlzX3BvaW50ZXIgd29ya3MsIGFuZCB3ZSBjYW4gb3ZlcmxvYWQgb24gdGhhdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkIFN0cmVhbUhlbHBlcihpbnRlcm5hbDo6dHJ1ZV90eXBlIC8qaXNfcG9pbnRlciovLCBUKiBwb2ludGVyKSB7CisgICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgKnNzXyA8PCAiKG51bGwpIjsKKyAgICB9IGVsc2UgeworICAgICAgKnNzXyA8PCBwb2ludGVyOworICAgIH0KKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIHZvaWQgU3RyZWFtSGVscGVyKGludGVybmFsOjpmYWxzZV90eXBlIC8qaXNfcG9pbnRlciovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdmFsdWUpIHsKKyAgICAvLyBTZWUgdGhlIGNvbW1lbnRzIGluIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmKSBhYm92ZSBmb3Igd2h5CisgICAgLy8gd2UgbmVlZCB0aGlzIHVzaW5nIHN0YXRlbWVudC4KKyAgICB1c2luZyA6Om9wZXJhdG9yIDw8OworICAgICpzc18gPDwgdmFsdWU7CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTgorCisgIC8vIFdlJ2xsIGhvbGQgdGhlIHRleHQgc3RyZWFtZWQgdG8gdGhpcyBvYmplY3QgaGVyZS4KKyAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6c3RkOjpzdHJpbmdzdHJlYW0+IHNzXzsKKworICAvLyBXZSBkZWNsYXJlIChidXQgZG9uJ3QgaW1wbGVtZW50KSB0aGlzIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCisgIC8vIGZyb20gaW1wbGVtZW50aW5nIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJik7Cit9OworCisvLyBTdHJlYW1zIGEgTWVzc2FnZSB0byBhbiBvc3RyZWFtLgoraW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTWVzc2FnZSYgc2IpIHsKKyAgcmV0dXJuIG9zIDw8IHNiLkdldFN0cmluZygpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYW4gc3RkOjpzdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcworLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKKy8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAorLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIFN0cmVhbWFibGVUb1N0cmluZyhjb25zdCBUJiBzdHJlYW1hYmxlKSB7CisgIHJldHVybiAoTWVzc2FnZSgpIDw8IHN0cmVhbWFibGUpLkdldFN0cmluZygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZjliYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaApAQCAtMCwwICsxLDE0NDQgQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBndGVzdC1wYXJhbS10ZXN0LmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBNYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGluIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworCisKKy8vIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYWxsb3cgeW91IHRvIHRlc3QgeW91ciBjb2RlIHdpdGggZGlmZmVyZW50CisvLyBwYXJhbWV0ZXJzIHdpdGhvdXQgd3JpdGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgdGVzdC4KKy8vCisvLyBIZXJlIGlzIGhvdyB5b3UgdXNlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHM6CisKKyNpZiAwCisKKy8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQorLy8gY2xhc3MuIEl0IGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD4gKHNlZSBiZWxvdyBmb3IKKy8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQKKy8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLgorLy8gVGVzdFdpdGhQYXJhbTxUPiBpcyBpdHNlbGYgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueQorLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKy8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKKyAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4KK307CisKKy8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGZvciB0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuIFRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIgorLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KKworVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKKyAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6CisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKKyAgLi4uCit9CisKK1RFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgeworICAuLi4KK30KKworLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKKy8vIGNhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIKKy8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAorLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaAorLy8gYXJlIGFsbCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2U6CisvLworLy8KKy8vICBSYW5nZShiZWdpbiwgZW5kIFssIHN0ZXBdKSAtIFlpZWxkcyB2YWx1ZXMge2JlZ2luLCBiZWdpbitzdGVwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4KKy8vICBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKSAgICAtIFlpZWxkcyB2YWx1ZXMge3YxLCB2MiwgLi4uLCB2Tn0uCisvLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwKKy8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLgorLy8gIEJvb2woKSAgICAgICAgICAgICAgICAgICAgIC0gWWllbGRzIHNlcXVlbmNlIHtmYWxzZSwgdHJ1ZX0uCisvLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgTiBnZW5lcmF0b3JzLgorLy8KKy8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93CisvLyBpbiB0aGlzIGZpbGUuCisvLworLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQorLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgIm1lZW55IiwgIm1pbnkiLCBhbmQgIm1vZSIuCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7CisKKy8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sICh5ZXMsIHlvdQorLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisvLyBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKKy8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUKKy8vIHRoZXNlIG5hbWVzOgorLy8KKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMiBmb3IgIm1vZSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMiBmb3IgIm1vZSIKKy8vCisvLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4KKy8vCisvLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gKKy8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6CisKK2NvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7CisKKy8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKKy8vCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJkb2ciCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cworLy8gaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgorLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4KKy8vCisvLyBQbGVhc2UgYWxzbyBub3RlIHRoYXQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgcGFyYW1ldGVycyB0byB0aGUKKy8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLgorLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcgorLy8gdG8gZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGEgc2V0IG9mIHRlc3RzIHRvIHJ1biBhbmQgb24gdGhlIG90aGVyIGhhbmQsCisvLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0CisvLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLgorLy8KKy8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCisvLyBmb3IgbW9yZSBleGFtcGxlcy4KKy8vCisvLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcgorLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbAorLy8gaW1wbGVtZW50YXRpb24gYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgorLy8KKy8vCisvLyBBIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QgYW5kIGZyb20KKy8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCisvLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UKKy8vIFRlc3RXaXRoUGFyYW08VD4gaW5oZXJpdHMgZnJvbSBib3RoIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9yZQorLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdAorLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6CisKK2NsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdAorICAvLyBmaXh0dXJlIGhlcmUuCit9OworCitjbGFzcyBEZXJpdmVkVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uCit9OworCitURVNUX0YoQmFzZVRlc3QsIEhhc0ZvbykgeworICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuCit9CisKK1RFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gR2V0UGFyYW0gd29ya3MganVzdCB0aGUgc2FtZSBoZXJlIGFzIGlmIHlvdSBpbmhlcml0IGZyb20gVGVzdFdpdGhQYXJhbS4KKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworfQorCisjZW5kaWYgIC8vIDAKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmICFHVEVTVF9PU19TWU1CSUFOCisjIGluY2x1ZGUgPHV0aWxpdHk+CisjZW5kaWYKKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQorLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZAorLy8gd2l0aCBhIHBhcnRpY3VsYXIgZ2VuZXJhdG9yLCBHb29nbGUgVGVzdCBjcmVhdGVzIGFuZCBydW5zIHRlc3RzCisvLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLgorLy8KKy8vIEluIHRoZSBmb2xsb3dpbmcgc2FtcGxlLCB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBGb29UZXN0IGFyZSBpbnN0YW50aWF0ZWQKKy8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4OgorLy8KKy8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsgLi4uIH07CisvLworLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7CisvLyB9CisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsKKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RTZXF1ZW5jZSwgRm9vVGVzdCwgVmFsdWVzKDMsIDUsIDgpKTsKKy8vCisKKy8vIFJhbmdlKCkgcmV0dXJucyBnZW5lcmF0b3JzIHByb3ZpZGluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIGluIGEgcmFuZ2UuCisvLworLy8gU3lub3BzaXM6CisvLyBSYW5nZShzdGFydCwgZW5kKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwKKy8vICAgICBzdGFydCsyLCAuLi4sIH0uCisvLyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwKKy8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4KKy8vIE5vdGVzOgorLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyB7MSwgMywgNSwgN30uCisvLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3IKKy8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOgorLy8gICAgICogSXQgbXVzdCBiZSBhc3NpZ25hYmxlIChoYXZlIG9wZXJhdG9yPSgpIGRlZmluZWQpLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yCisvLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4KKy8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcjwoKSBkZWZpbmVkLgorLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4KKy8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMKKy8vICAgICB0byBjb250YWluIGFueSBlbGVtZW50cy4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oCisgICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQpIHsKKyAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOworfQorCisvLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQorLy8gYSBjb250YWluZXIuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhIEMtc3R5bGUgYXJyYXkuCisvLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KKy8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlCisvLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzCisvLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6CisvLworLy8gY29uc3QgY2hhciogc3RyaW5nc1tdID0geyJmb28iLCAiYmFyIiwgImJheiJ9OworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdGxTdHJpbmdUZXN0CisvLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6CisvLworLy8gOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gR2V0UGFyYW1ldGVyU3RyaW5ncygpIHsKKy8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsKKy8vICAgdi5wdXNoX2JhY2soImEiKTsKKy8vICAgdi5wdXNoX2JhY2soImIiKTsKKy8vICAgcmV0dXJuIHY7CisvLyB9CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFBhcmFtZXRlclN0cmluZ3MoKSkpOworLy8KKy8vCisvLyBUaGlzIHdpbGwgYWxzbyBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIENoYXJUZXN0CisvLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoKKy8vCisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBHZXRQYXJhbWV0ZXJDaGFycygpIHsKKy8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2InKTsKKy8vICAgcmV0dXJuIGxpc3Q7CisvLyB9CisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBsID0gR2V0UGFyYW1ldGVyQ2hhcnMoKTsKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKGwuYmVnaW4oKSwgbC5lbmQoKSkpOworLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+CisgICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOworICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oCisgICAgICBuZXcgaW50ZXJuYWw6OlZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjxQYXJhbVR5cGU+KGJlZ2luLCBlbmQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKKyAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOworfQorCisvLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKKy8vIHBhcmFtZXRlcnMuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KKy8vCisvLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCisvLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KKy8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKKy8vCisvLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byA1MCBwYXJhbWV0ZXJzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4gVmFsdWVzKFQxIHYxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE8VDE+KHYxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+IFZhbHVlcyhUMSB2MSwgVDIgdjIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+KHYxLCB2Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzPFQxLCBUMiwgVDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4odjEsIHYyLCB2Myk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ8VDEsIFQyLCBUMywgVDQ+KHYxLCB2MiwgdjMsIHY0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NTxUMSwgVDIsIFQzLCBUNCwgVDU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4odjEsIHYyLCB2MywgdjQsIHY1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsCisgICAgICB2NiwgdjcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KHYxLCB2MiwgdjMsIHY0LAorICAgICAgdjUsIHY2LCB2NywgdjgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5Pih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBWYWx1ZXMoVDEgdjEsCisgICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwKKyAgICBUMTE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAorICAgICAgVDExPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgVDEyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgVDEzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCisgICAgICB2MTQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKKyAgICAgIHYxMywgdjE0LCB2MTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAorICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LAorICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKKyAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAorICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+KHYxLCB2MiwgdjMsIHY0LAorICAgICAgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCisgICAgICB2MjAsIHYyMSwgdjIyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4odjEsIHYyLCB2MywKKyAgICAgIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+KHYxLCB2MiwKKyAgICAgIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LAorICAgICAgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFZhbHVlcyhUMSB2MSwKKyAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsCisgICAgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwKKyAgICBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+KHYxLAorICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywKKyAgICAgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgVDI2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAorICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgVDI3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LAorICAgICAgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICBUMjg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCisgICAgICB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywKKyAgICAgIHYyOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKKyAgICAgIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LAorICAgICAgdjI3LCB2MjgsIHYyOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCisgICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCisgICAgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKKyAgICBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCisgICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwKKyAgICAgIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAorICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKKyAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKKyAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsCisgICAgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsCisgICAgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwKKyAgICBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLAorICAgIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAorICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsCisgICAgICB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwKKyAgICAgIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsCisgICAgICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCisgICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKKyAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAorICAgICAgdjM0LCB2MzUsIHYzNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCisgICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCisgICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKKyAgICBUMzcgdjM3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3Pih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2LCB2MzcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcsIFQzOCB2MzgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4odjEsIHYyLAorICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCisgICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwKKyAgICAgIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCisgICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKKyAgICBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAorICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsCisgICAgICB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVmFsdWVzKFQxIHYxLAorICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKKyAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAorICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsCisgICAgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwKKyAgICBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwKKyAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LAorICAgICAgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgIFQ0MT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCisgICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwKKyAgICAgIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgIFQ0Mj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICBUNDIgdjQyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAorICAgICAgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsCisgICAgICB2NDIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgVDQzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCisgICAgICB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwKKyAgICAgIHY0MSwgdjQyLCB2NDMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0ND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKKyAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAorICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksCisgICAgICB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAorICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCisgICAgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKKyAgICBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwKKyAgICAgIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LAorICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsCisgICAgICB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCisgICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksCisgICAgICB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKKyAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LAorICAgICAgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0Nik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCisgICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKKyAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAorICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCisgICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCisgICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LAorICAgIFQ0OCB2NDgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKKyAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LAorICAgICAgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsIHY0OCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAorICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCisgICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwKKyAgICBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LAorICAgIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKKyAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LAorICAgICAgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4LCB2NDkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCisgICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKKyAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LAorICAgIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsCisgICAgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSwgVDUwIHY1MCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAorICAgICAgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsCisgICAgICB2NDgsIHY0OSwgdjUwKTsKK30KKworLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgorLy8KKy8vIFN5bm9wc2lzOgorLy8gQm9vbCgpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KKy8vCisvLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucworLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCisvLyBDb21iaW5lKCkgZnVuY3Rpb24uCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0CisvLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKKy8vCitpbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7CisgIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisvLyBDb21iaW5lKCkgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbWJpbmUgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIHRvIHByb2R1Y2UKKy8vIHZhbHVlcyBvZiBhIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRob3NlIHNlcXVlbmNlcycgZWxlbWVudHMuCisvLworLy8gU3lub3BzaXM6CisvLyBDb21iaW5lKGdlbjEsIGdlbjIsIC4uLiwgZ2VuTikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQorLy8gICAgIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5CisvLyAgICAgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLiBUaGUgc2VxdWVuY2UgZWxlbWVudHMgd2lsbCBoYXZlIGEgdHlwZSBvZgorLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMKKy8vICAgICBvZiBlbGVtZW50cyBmcm9tIHNlcXVlbmNlcyBwcm9kdWNlcyBieSBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uCisvLworLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAxMCBhcmd1bWVudHMuIFRoaXMgbnVtYmVyIGlzIGN1cnJlbnRseSBsaW1pdGVkCisvLyBieSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHR1cGxlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgR29vZ2xlCisvLyBUZXN0LgorLy8KKy8vIEV4YW1wbGU6CisvLworLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIHRlc3QgY2FzZSBBbmltYWxUZXN0IGVhY2ggb25lIHdpdGgKKy8vIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHR1cGxlKCJjYXQiLCBCTEFDSyksIHR1cGxlKCJjYXQiLCBXSElURSksCisvLyB0dXBsZSgiZG9nIiwgQkxBQ0spLCBhbmQgdHVwbGUoImRvZyIsIFdISVRFKToKKy8vCisvLyBlbnVtIENvbG9yIHsgQkxBQ0ssIEdSQVksIFdISVRFIH07CisvLyBjbGFzcyBBbmltYWxUZXN0CisvLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxjb25zdCBjaGFyKiwgQ29sb3I+ID4gey4uLn07CisvLworLy8gVEVTVF9QKEFuaW1hbFRlc3QsIEFuaW1hbExvb2tzTmljZSkgey4uLn0KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbmltYWxWYXJpYXRpb25zLCBBbmltYWxUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShWYWx1ZXMoImNhdCIsICJkb2ciKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKEJMQUNLLCBXSElURSkpKTsKKy8vCisvLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gRmxhZ0RlcGVuZGVudFRlc3Qgd2l0aCBhbGwgdmFyaWF0aW9ucyBvZiB0d28KKy8vIEJvb2xlYW4gZmxhZ3M6CisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QKKy8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGJvb2wsIGJvb2w+ID4geworLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCisvLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7CisvLyAgIH0KKy8vIH07CisvLworLy8gVEVTVF9QKEZsYWdEZXBlbmRlbnRUZXN0LCBUZXN0RmVhdHVyZTEpIHsKKy8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4KKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFR3b0Jvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjI+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPigKKyAgICAgIGcxLCBnMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMykgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+KAorICAgICAgZzEsIGcyLCBnMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQ+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQ+KAorICAgICAgZzEsIGcyLCBnMywgZzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNz4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjc+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOD4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwKKyAgICBHZW5lcmF0b3I5PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgsIGc5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5LAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjEwPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksCisgICAgR2VuZXJhdG9yMTA+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKKyAgICAgIEdlbmVyYXRvcjEwPigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzksIGcxMCk7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisKKworIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKKyAgIHB1YmxpYzogXAorICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgIHByaXZhdGU6IFwKKyAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oXAorICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKSktPkFkZFRlc3RQYXR0ZXJuKFwKKyAgICAgICAgICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RNZXRhRmFjdG9yeTwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPigpKTsgXAorICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKyAgICBzdGF0aWMgaW50IGd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsgXAorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXAorICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTsgXAorICB9OyBcCisgIGludCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk6Omd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyA9IFwKKyAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OkFkZFRvUmVnaXN0cnkoKTsgXAorICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKKworLy8gVGhlIG9wdGlvbmFsIGxhc3QgYXJndW1lbnQgdG8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgYWxsb3dzIHRoZSB1c2VyCisvLyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IGdlbmVyYXRlcyBjdXN0b20gdGVzdCBuYW1lIHN1ZmZpeGVzCisvLyBiYXNlZCBvbiB0aGUgdGVzdCBwYXJhbWV0ZXJzLiBUaGUgZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBvbmUgYXJndW1lbnQgb2YKKy8vIHR5cGUgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzxjbGFzcyBQYXJhbVR5cGU+LCBhbmQgcmV0dXJuIHN0ZDo6c3RyaW5nLgorLy8KKy8vIHRlc3Rpbmc6OlByaW50VG9TdHJpbmdQYXJhbU5hbWUgaXMgYSBidWlsdGluIHRlc3Qgc3VmZml4IGdlbmVyYXRvciB0aGF0CisvLyByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLiBJdCBkb2VzIG5vdCB3b3JrCisvLyBmb3Igc3RkOjpzdHJpbmcgb3IgQyBzdHJpbmdzLgorLy8KKy8vIE5vdGU6IHRlc3QgbmFtZXMgbXVzdCBiZSBub24tZW1wdHksIHVuaXF1ZSwgYW5kIG1heSBvbmx5IGNvbnRhaW4gQVNDSUkKKy8vIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIHVuZGVyc2NvcmUuCisKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvciwgLi4uKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKKyAgICAgIGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfKCkgeyByZXR1cm4gZ2VuZXJhdG9yOyB9IFwKKyAgOjpzdGQ6OnN0cmluZyBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdGVOYW1lXyggXAorICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+JiBpbmZvKSB7IFwKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0UGFyYW1OYW1lR2VuPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKKyAgICAgICAgKF9fVkFfQVJHU19fKShpbmZvKTsgXAorICB9IFwKKyAgaW50IGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX2R1bW15XyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oXAorICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKSktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCisgICAgICAgICAgICAgICAgICAgICAgI3ByZWZpeCwgXAorICAgICAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXywgXAorICAgICAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdGVOYW1lXywgXAorICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc4ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAKQEAgLTAsMCArMSw1MTAgQEAKKyQkIC0qLSBtb2RlOiBjKys7IC0qLQorJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIFZhbHVlcyBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0LgorJHZhciBtYXh0dXBsZSA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiBDb21iaW5lIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBNYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGluIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworCisKKy8vIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYWxsb3cgeW91IHRvIHRlc3QgeW91ciBjb2RlIHdpdGggZGlmZmVyZW50CisvLyBwYXJhbWV0ZXJzIHdpdGhvdXQgd3JpdGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgdGVzdC4KKy8vCisvLyBIZXJlIGlzIGhvdyB5b3UgdXNlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHM6CisKKyNpZiAwCisKKy8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQorLy8gY2xhc3MuIEl0IGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD4gKHNlZSBiZWxvdyBmb3IKKy8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQKKy8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLgorLy8gVGVzdFdpdGhQYXJhbTxUPiBpcyBpdHNlbGYgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueQorLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKy8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKKyAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4KK307CisKKy8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGZvciB0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuIFRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIgorLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KKworVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKKyAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6CisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKKyAgLi4uCit9CisKK1RFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgeworICAuLi4KK30KKworLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKKy8vIGNhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIKKy8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAorLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaAorLy8gYXJlIGFsbCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2U6CisvLworLy8KKy8vICBSYW5nZShiZWdpbiwgZW5kIFssIHN0ZXBdKSAtIFlpZWxkcyB2YWx1ZXMge2JlZ2luLCBiZWdpbitzdGVwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4KKy8vICBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKSAgICAtIFlpZWxkcyB2YWx1ZXMge3YxLCB2MiwgLi4uLCB2Tn0uCisvLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwKKy8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLgorLy8gIEJvb2woKSAgICAgICAgICAgICAgICAgICAgIC0gWWllbGRzIHNlcXVlbmNlIHtmYWxzZSwgdHJ1ZX0uCisvLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgTiBnZW5lcmF0b3JzLgorLy8KKy8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93CisvLyBpbiB0aGlzIGZpbGUuCisvLworLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQorLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgIm1lZW55IiwgIm1pbnkiLCBhbmQgIm1vZSIuCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7CisKKy8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sICh5ZXMsIHlvdQorLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisvLyBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKKy8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUKKy8vIHRoZXNlIG5hbWVzOgorLy8KKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMiBmb3IgIm1vZSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMiBmb3IgIm1vZSIKKy8vCisvLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4KKy8vCisvLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gKKy8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6CisKK2NvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7CisKKy8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKKy8vCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJkb2ciCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cworLy8gaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgorLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4KKy8vCisvLyBQbGVhc2UgYWxzbyBub3RlIHRoYXQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgcGFyYW1ldGVycyB0byB0aGUKKy8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLgorLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcgorLy8gdG8gZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGEgc2V0IG9mIHRlc3RzIHRvIHJ1biBhbmQgb24gdGhlIG90aGVyIGhhbmQsCisvLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0CisvLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLgorLy8KKy8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCisvLyBmb3IgbW9yZSBleGFtcGxlcy4KKy8vCisvLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcgorLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbAorLy8gaW1wbGVtZW50YXRpb24gYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgorLy8KKy8vCisvLyBBIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QgYW5kIGZyb20KKy8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCisvLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UKKy8vIFRlc3RXaXRoUGFyYW08VD4gaW5oZXJpdHMgZnJvbSBib3RoIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9yZQorLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdAorLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6CisKK2NsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdAorICAvLyBmaXh0dXJlIGhlcmUuCit9OworCitjbGFzcyBEZXJpdmVkVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uCit9OworCitURVNUX0YoQmFzZVRlc3QsIEhhc0ZvbykgeworICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuCit9CisKK1RFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gR2V0UGFyYW0gd29ya3MganVzdCB0aGUgc2FtZSBoZXJlIGFzIGlmIHlvdSBpbmhlcml0IGZyb20gVGVzdFdpdGhQYXJhbS4KKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworfQorCisjZW5kaWYgIC8vIDAKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworI2lmICFHVEVTVF9PU19TWU1CSUFOCisjIGluY2x1ZGUgPHV0aWxpdHk+CisjZW5kaWYKKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQorLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZAorLy8gd2l0aCBhIHBhcnRpY3VsYXIgZ2VuZXJhdG9yLCBHb29nbGUgVGVzdCBjcmVhdGVzIGFuZCBydW5zIHRlc3RzCisvLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLgorLy8KKy8vIEluIHRoZSBmb2xsb3dpbmcgc2FtcGxlLCB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBGb29UZXN0IGFyZSBpbnN0YW50aWF0ZWQKKy8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4OgorLy8KKy8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsgLi4uIH07CisvLworLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7CisvLyB9CisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsKKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RTZXF1ZW5jZSwgRm9vVGVzdCwgVmFsdWVzKDMsIDUsIDgpKTsKKy8vCisKKy8vIFJhbmdlKCkgcmV0dXJucyBnZW5lcmF0b3JzIHByb3ZpZGluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIGluIGEgcmFuZ2UuCisvLworLy8gU3lub3BzaXM6CisvLyBSYW5nZShzdGFydCwgZW5kKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwKKy8vICAgICBzdGFydCsyLCAuLi4sIH0uCisvLyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwKKy8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4KKy8vIE5vdGVzOgorLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikKKy8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyB7MSwgMywgNSwgN30uCisvLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3IKKy8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOgorLy8gICAgICogSXQgbXVzdCBiZSBhc3NpZ25hYmxlIChoYXZlIG9wZXJhdG9yPSgpIGRlZmluZWQpLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yCisvLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4KKy8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcjwoKSBkZWZpbmVkLgorLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4KKy8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMKKy8vICAgICB0byBjb250YWluIGFueSBlbGVtZW50cy4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oCisgICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQpIHsKKyAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOworfQorCisvLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQorLy8gYSBjb250YWluZXIuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhIEMtc3R5bGUgYXJyYXkuCisvLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KKy8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlCisvLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzCisvLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6CisvLworLy8gY29uc3QgY2hhciogc3RyaW5nc1tdID0geyJmb28iLCAiYmFyIiwgImJheiJ9OworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdGxTdHJpbmdUZXN0CisvLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6CisvLworLy8gOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gR2V0UGFyYW1ldGVyU3RyaW5ncygpIHsKKy8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsKKy8vICAgdi5wdXNoX2JhY2soImEiKTsKKy8vICAgdi5wdXNoX2JhY2soImIiKTsKKy8vICAgcmV0dXJuIHY7CisvLyB9CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFBhcmFtZXRlclN0cmluZ3MoKSkpOworLy8KKy8vCisvLyBUaGlzIHdpbGwgYWxzbyBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIENoYXJUZXN0CisvLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoKKy8vCisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBHZXRQYXJhbWV0ZXJDaGFycygpIHsKKy8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsKKy8vICAgbGlzdC5wdXNoX2JhY2soJ2InKTsKKy8vICAgcmV0dXJuIGxpc3Q7CisvLyB9CisvLyA6OnN0ZDo6bGlzdDxjaGFyPiBsID0gR2V0UGFyYW1ldGVyQ2hhcnMoKTsKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKGwuYmVnaW4oKSwgbC5lbmQoKSkpOworLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+CisgICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOworICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oCisgICAgICBuZXcgaW50ZXJuYWw6OlZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjxQYXJhbVR5cGU+KGJlZ2luLCBlbmQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKKyAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCisgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKKyAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOworfQorCisvLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKKy8vIHBhcmFtZXRlcnMuCisvLworLy8gU3lub3BzaXM6CisvLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KKy8vCisvLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCisvLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KKy8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKKy8vCisvLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byAkbiBwYXJhbWV0ZXJzLgorLy8KKyRyYW5nZSBpIDEuLm4KKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkkaTwkZm9yIGosIFtbVCRqXV0+IFZhbHVlcygkZm9yIGosIFtbVCRqIHYkal1dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheSRpPCRmb3IgaiwgW1tUJGpdXT4oJGZvciBqLCBbW3Ykal1dKTsKK30KKworXV0KKworLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgorLy8KKy8vIFN5bm9wc2lzOgorLy8gQm9vbCgpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KKy8vCisvLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucworLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCisvLyBDb21iaW5lKCkgZnVuY3Rpb24uCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0CisvLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCisvLworLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisvLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKy8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKKy8vICAgfQorLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKKy8vCitpbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7CisgIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOworfQorCisjIGlmIEdURVNUX0hBU19DT01CSU5FCisvLyBDb21iaW5lKCkgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbWJpbmUgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIHRvIHByb2R1Y2UKKy8vIHZhbHVlcyBvZiBhIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRob3NlIHNlcXVlbmNlcycgZWxlbWVudHMuCisvLworLy8gU3lub3BzaXM6CisvLyBDb21iaW5lKGdlbjEsIGdlbjIsIC4uLiwgZ2VuTikKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQorLy8gICAgIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5CisvLyAgICAgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLiBUaGUgc2VxdWVuY2UgZWxlbWVudHMgd2lsbCBoYXZlIGEgdHlwZSBvZgorLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMKKy8vICAgICBvZiBlbGVtZW50cyBmcm9tIHNlcXVlbmNlcyBwcm9kdWNlcyBieSBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uCisvLworLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAkbWF4dHVwbGUgYXJndW1lbnRzLiBUaGlzIG51bWJlciBpcyBjdXJyZW50bHkgbGltaXRlZAorLy8gYnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0dXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IEdvb2dsZQorLy8gVGVzdC4KKy8vCisvLyBFeGFtcGxlOgorLy8KKy8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiB0ZXN0IGNhc2UgQW5pbWFsVGVzdCBlYWNoIG9uZSB3aXRoCisvLyB0aGUgcGFyYW1ldGVyIHZhbHVlcyB0dXBsZSgiY2F0IiwgQkxBQ0spLCB0dXBsZSgiY2F0IiwgV0hJVEUpLAorLy8gdHVwbGUoImRvZyIsIEJMQUNLKSwgYW5kIHR1cGxlKCJkb2ciLCBXSElURSk6CisvLworLy8gZW51bSBDb2xvciB7IEJMQUNLLCBHUkFZLCBXSElURSB9OworLy8gY2xhc3MgQW5pbWFsVGVzdAorLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Y29uc3QgY2hhciosIENvbG9yPiA+IHsuLi59OworLy8KKy8vIFRFU1RfUChBbmltYWxUZXN0LCBBbmltYWxMb29rc05pY2UpIHsuLi59CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5pbWFsVmFyaWF0aW9ucywgQW5pbWFsVGVzdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoVmFsdWVzKCJjYXQiLCAiZG9nIiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyhCTEFDSywgV0hJVEUpKSk7CisvLworLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIEZsYWdEZXBlbmRlbnRUZXN0IHdpdGggYWxsIHZhcmlhdGlvbnMgb2YgdHdvCisvLyBCb29sZWFuIGZsYWdzOgorLy8KKy8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0CisvLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxib29sLCBib29sPiA+IHsKKy8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworLy8gICAgIC8vIEFzc2lnbnMgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgdmFsdWVzIGZyb20gdGhlIHR1cGxlLgorLy8gICAgIHRpZShleHRlcm5hbF9mbGFnXzEsIGV4dGVybmFsX2ZsYWdfMikgPSBHZXRQYXJhbSgpOworLy8gICB9CisvLyB9OworLy8KKy8vIFRFU1RfUChGbGFnRGVwZW5kZW50VGVzdCwgVGVzdEZlYXR1cmUxKSB7CisvLyAgIC8vIFRlc3QgeW91ciBjb2RlIHVzaW5nIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIGhlcmUuCisvLyB9CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChUd29Cb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShCb29sKCksIEJvb2woKSkpOworLy8KKyRyYW5nZSBpIDIuLm1heHR1cGxlCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKwordGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBHZW5lcmF0b3Ikal1dPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIkaTwkZm9yIGosIFtbR2VuZXJhdG9yJGpdXT4gQ29tYmluZSgKKyAgICAkZm9yIGosIFtbY29uc3QgR2VuZXJhdG9yJGomIGckal1dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlciRpPCRmb3IgaiwgW1tHZW5lcmF0b3Ikal1dPigKKyAgICAgICRmb3IgaiwgW1tnJGpdXSk7Cit9CisKK11dCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisKKworIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKKyAgIHB1YmxpYzogXAorICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgIHByaXZhdGU6IFwKKyAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oXAorICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKSktPkFkZFRlc3RQYXR0ZXJuKFwKKyAgICAgICAgICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RNZXRhRmFjdG9yeTwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPigpKTsgXAorICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKyAgICBzdGF0aWMgaW50IGd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsgXAorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXAorICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTsgXAorICB9OyBcCisgIGludCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk6Omd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyA9IFwKKyAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OkFkZFRvUmVnaXN0cnkoKTsgXAorICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKKworLy8gVGhlIG9wdGlvbmFsIGxhc3QgYXJndW1lbnQgdG8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgYWxsb3dzIHRoZSB1c2VyCisvLyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IGdlbmVyYXRlcyBjdXN0b20gdGVzdCBuYW1lIHN1ZmZpeGVzCisvLyBiYXNlZCBvbiB0aGUgdGVzdCBwYXJhbWV0ZXJzLiBUaGUgZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBvbmUgYXJndW1lbnQgb2YKKy8vIHR5cGUgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzxjbGFzcyBQYXJhbVR5cGU+LCBhbmQgcmV0dXJuIHN0ZDo6c3RyaW5nLgorLy8KKy8vIHRlc3Rpbmc6OlByaW50VG9TdHJpbmdQYXJhbU5hbWUgaXMgYSBidWlsdGluIHRlc3Qgc3VmZml4IGdlbmVyYXRvciB0aGF0CisvLyByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLgorLy8KKy8vIE5vdGU6IHRlc3QgbmFtZXMgbXVzdCBiZSBub24tZW1wdHksIHVuaXF1ZSwgYW5kIG1heSBvbmx5IGNvbnRhaW4gQVNDSUkKKy8vIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIHVuZGVyc2NvcmUuIEJlY2F1c2UgUHJpbnRUb1N0cmluZyBhZGRzIHF1b3RlcworLy8gdG8gc3RkOjpzdHJpbmcgYW5kIEMgc3RyaW5ncywgaXQgd29uJ3Qgd29yayBmb3IgdGhlc2UgdHlwZXMuCisKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvciwgLi4uKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKKyAgICAgIGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfKCkgeyByZXR1cm4gZ2VuZXJhdG9yOyB9IFwKKyAgOjpzdGQ6OnN0cmluZyBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdGVOYW1lXyggXAorICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+JiBpbmZvKSB7IFwKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0UGFyYW1OYW1lR2VuPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKKyAgICAgICAgKF9fVkFfQVJHU19fKShpbmZvKTsgXAorICB9IFwKKyAgaW50IGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX2R1bW15XyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oXAorICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKSktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCisgICAgICAgICAgICAgICAgICAgICAgI3ByZWZpeCwgXAorICAgICAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXywgXAorICAgICAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdGVOYW1lXywgXAorICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzMzE2NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmgKQEAgLTAsMCArMSw5OTMgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGEKKy8vIHZhbHVlIG9mIGFueSB0eXBlIFQ6CisvLworLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7CisvLworLy8gQSB1c2VyIGNhbiB0ZWFjaCB0aGlzIGZ1bmN0aW9uIGhvdyB0byBwcmludCBhIGNsYXNzIHR5cGUgVCBieQorLy8gZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoKSBvciBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB0aGF0CisvLyBkZWZpbmVzIFQuICBNb3JlIHNwZWNpZmljYWxseSwgdGhlIEZJUlNUIGRlZmluZWQgZnVuY3Rpb24gaW4gdGhlCisvLyBmb2xsb3dpbmcgbGlzdCB3aWxsIGJlIHVzZWQgKGFzc3VtaW5nIFQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UKKy8vIGZvbyk6CisvLworLy8gICAxLiBmb286OlByaW50VG8oY29uc3QgVCYsIG9zdHJlYW0qKQorLy8gICAyLiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBUJikgZGVmaW5lZCBpbiBlaXRoZXIgZm9vIG9yIHRoZQorLy8gICAgICBnbG9iYWwgbmFtZXNwYWNlLgorLy8KKy8vIElmIG5vbmUgb2YgdGhlIGFib3ZlIGlzIGRlZmluZWQsIGl0IHdpbGwgcHJpbnQgdGhlIGRlYnVnIHN0cmluZyBvZgorLy8gdGhlIHZhbHVlIGlmIGl0IGlzIGEgcHJvdG9jb2wgYnVmZmVyLCBvciBwcmludCB0aGUgcmF3IGJ5dGVzIGluIHRoZQorLy8gdmFsdWUgb3RoZXJ3aXNlLgorLy8KKy8vIFRvIGFpZCBkZWJ1Z2dpbmc6IHdoZW4gVCBpcyBhIHJlZmVyZW5jZSB0eXBlLCB0aGUgYWRkcmVzcyBvZiB0aGUKKy8vIHZhbHVlIGlzIGFsc28gcHJpbnRlZDsgd2hlbiBUIGlzIGEgKGNvbnN0KSBjaGFyIHBvaW50ZXIsIGJvdGggdGhlCisvLyBwb2ludGVyIHZhbHVlIGFuZCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGl0IHBvaW50cyB0byBhcmUKKy8vIHByaW50ZWQuCisvLworLy8gV2UgYWxzbyBwcm92aWRlIHNvbWUgY29udmVuaWVudCB3cmFwcGVyczoKKy8vCisvLyAgIC8vIFByaW50cyBhIHZhbHVlIHRvIGEgc3RyaW5nLiAgRm9yIGEgKGNvbnN0IG9yIG5vdCkgY2hhcgorLy8gICAvLyBwb2ludGVyLCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcworLy8gICAvLyBwcmludGVkLgorLy8gICBzdGQ6OnN0cmluZyA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOworLy8KKy8vICAgLy8gUHJpbnRzIGEgdmFsdWUgdGVyc2VseTogZm9yIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSByZWZlcmVuY2VkCisvLyAgIC8vIHZhbHVlIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyCisvLyAgIC8vIHBvaW50ZXIsIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzCisvLyAgIC8vIHByaW50ZWQuCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgb3N0cmVhbSopOworLy8KKy8vICAgLy8gUHJpbnRzIHZhbHVlIHVzaW5nIHRoZSB0eXBlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIFRoZSBkaWZmZXJlbmNlCisvLyAgIC8vIGZyb20gVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBwcmludHMgYm90aCB0aGUKKy8vICAgLy8gcG9pbnRlciBhbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyIHBvaW50ZXIuCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIG9zdHJlYW0qKTsKKy8vCisvLyAgIC8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQorLy8gICAvLyBlbGVtZW50IGZvciBlYWNoIGZpZWxkLiBUdXBsZSBzdXBwb3J0IG11c3QgYmUgZW5hYmxlZCBpbgorLy8gICAvLyBndGVzdC1wb3J0LmguCisvLyAgIHN0ZDo6dmVjdG9yPHN0cmluZz4gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAorLy8gICAgICAgY29uc3QgVHVwbGUmIHZhbHVlKTsKKy8vCisvLyBLbm93biBsaW1pdGF0aW9uOgorLy8KKy8vIFRoZSBwcmludCBwcmltaXRpdmVzIHByaW50IHRoZSBlbGVtZW50cyBvZiBhbiBTVEwtc3R5bGUgY29udGFpbmVyCisvLyB1c2luZyB0aGUgY29tcGlsZXItaW5mZXJyZWQgdHlwZSBvZiAqaXRlciB3aGVyZSBpdGVyIGlzIGEKKy8vIGNvbnN0X2l0ZXJhdG9yIG9mIHRoZSBjb250YWluZXIuICBXaGVuIGNvbnN0X2l0ZXJhdG9yIGlzIGFuIGlucHV0CisvLyBpdGVyYXRvciBidXQgbm90IGEgZm9yd2FyZCBpdGVyYXRvciwgdGhpcyBpbmZlcnJlZCB0eXBlIG1heSBub3QKKy8vIG1hdGNoIHZhbHVlX3R5cGUsIGFuZCB0aGUgcHJpbnQgb3V0cHV0IG1heSBiZSBpbmNvcnJlY3QuICBJbgorLy8gcHJhY3RpY2UsIHRoaXMgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBmb3IgbW9zdCBjb250YWluZXJzCisvLyBjb25zdF9pdGVyYXRvciBpcyBhIGZvcndhcmQgaXRlcmF0b3IuICBXZSdsbCBmaXggdGhpcyBpZiB0aGVyZSdzIGFuCisvLyBhY3R1YWwgbmVlZCBmb3IgaXQuICBOb3RlIHRoYXQgdGhpcyBmaXggY2Fubm90IHJlbHkgb24gdmFsdWVfdHlwZQorLy8gYmVpbmcgZGVmaW5lZCBhcyBtYW55IHVzZXItZGVmaW5lZCBjb250YWluZXIgdHlwZXMgZG9uJ3QgaGF2ZQorLy8gdmFsdWVfdHlwZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSSU5URVJTX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KKworI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKKworI2lmIEdURVNUX0hBU19TVERfVFVQTEVfCisjIGluY2x1ZGUgPHR1cGxlPgorI2VuZGlmCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRGVmaW5pdGlvbnMgaW4gdGhlICdpbnRlcm5hbCcgYW5kICdpbnRlcm5hbDInIG5hbWUgc3BhY2VzIGFyZQorLy8gc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBETyBOT1QgVVNFIFRIRU0gSU4gVVNFUiBDT0RFIQorbmFtZXNwYWNlIGludGVybmFsMiB7CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIGdpdmVuCisvLyBvc3RyZWFtLgorR1RFU1RfQVBJXyB2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gRm9yIHNlbGVjdGluZyB3aGljaCBwcmludGVyIHRvIHVzZSB3aGVuIGEgZ2l2ZW4gdHlwZSBoYXMgbmVpdGhlciA8PAorLy8gbm9yIFByaW50VG8oKS4KK2VudW0gVHlwZUtpbmQgeworICBrUHJvdG9idWYsICAgICAgICAgICAgICAvLyBhIHByb3RvYnVmIHR5cGUKKyAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyLCAgLy8gYSB0eXBlIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhIG5hbWVkIG9yIHVubmFtZWQgZW51bSB0eXBlKQorICBrT3RoZXJUeXBlICAgICAgICAgICAgICAvLyBhbnl0aGluZyBlbHNlCit9OworCisvLyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrVHlwZUtpbmQ+OjpQcmludFZhbHVlKHZhbHVlLCBvcykgaXMgY2FsbGVkCisvLyBieSB0aGUgdW5pdmVyc2FsIHByaW50ZXIgdG8gcHJpbnQgYSB2YWx1ZSBvZiB0eXBlIFQgd2hlbiBuZWl0aGVyCisvLyBvcGVyYXRvcjw8IG5vciBQcmludFRvKCkgaXMgZGVmaW5lZCBmb3IgVCwgd2hlcmUga1R5cGVLaW5kIGlzIHRoZQorLy8gImtpbmQiIG9mIFQgYXMgZGVmaW5lZCBieSBlbnVtIFR5cGVLaW5kLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIFR5cGVLaW5kIGtUeXBlS2luZD4KK2NsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyIHsKKyBwdWJsaWM6CisgIC8vIFRoaXMgZGVmYXVsdCB2ZXJzaW9uIGlzIGNhbGxlZCB3aGVuIGtUeXBlS2luZCBpcyBrT3RoZXJUeXBlLgorICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBQcmludEJ5dGVzSW5PYmplY3RUbyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigmdmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZSksIG9zKTsKKyAgfQorfTsKKworLy8gV2UgcHJpbnQgYSBwcm90b2J1ZiB1c2luZyBpdHMgU2hvcnREZWJ1Z1N0cmluZygpIHdoZW4gdGhlIHN0cmluZworLy8gZG9lc24ndCBleGNlZWQgdGhpcyBtYW55IGNoYXJhY3RlcnM7IG90aGVyd2lzZSB3ZSBwcmludCBpdCB1c2luZworLy8gRGVidWdTdHJpbmcoKSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LgorY29uc3Qgc2l6ZV90IGtQcm90b2J1Zk9uZUxpbmVyTWF4TGVuZ3RoID0gNTA7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga1Byb3RvYnVmPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgc2hvcnRfc3RyID0gdmFsdWUuU2hvcnREZWJ1Z1N0cmluZygpOworICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBwcmV0dHlfc3RyID0KKyAgICAgICAgc2hvcnRfc3RyLmxlbmd0aCgpIDw9IGtQcm90b2J1Zk9uZUxpbmVyTWF4TGVuZ3RoID8KKyAgICAgICAgc2hvcnRfc3RyIDogKCJcbiIgKyB2YWx1ZS5EZWJ1Z1N0cmluZygpKTsKKyAgICAqb3MgPDwgKCI8IiArIHByZXR0eV9zdHIgKyAiPiIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtDb252ZXJ0aWJsZVRvSW50ZWdlcj4geworIHB1YmxpYzoKKyAgLy8gU2luY2UgVCBoYXMgbm8gPDwgb3BlcmF0b3Igb3IgUHJpbnRUbygpIGJ1dCBjYW4gYmUgaW1wbGljaXRseQorICAvLyBjb252ZXJ0ZWQgdG8gQmlnZ2VzdEludCwgd2UgcHJpbnQgaXQgYXMgYSBCaWdnZXN0SW50LgorICAvLworICAvLyBNb3N0IGxpa2VseSBUIGlzIGFuIGVudW0gdHlwZSAoZWl0aGVyIG5hbWVkIG9yIHVubmFtZWQpLCBpbiB3aGljaAorICAvLyBjYXNlIHByaW50aW5nIGl0IGFzIGFuIGludGVnZXIgaXMgdGhlIGRlc2lyZWQgYmVoYXZpb3IuICBJbiBjYXNlCisgIC8vIFQgaXMgbm90IGFuIGVudW0sIHByaW50aW5nIGl0IGFzIGFuIGludGVnZXIgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvCisgIC8vIGdpdmVuIHRoYXQgaXQgaGFzIG5vIHVzZXItZGVmaW5lZCBwcmludGVyLgorICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBjb25zdCBpbnRlcm5hbDo6QmlnZ2VzdEludCBrQmlnSW50ID0gdmFsdWU7CisgICAgKm9zIDw8IGtCaWdJbnQ7CisgIH0KK307CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uICBJZiB0aGUgdmFsdWUgaXMgYQorLy8gcHJvdG9jb2wgbWVzc2FnZSwgaXRzIGRlYnVnIHN0cmluZyBpcyBwcmludGVkOyBpZiBpdCdzIGFuIGVudW0gb3IKKy8vIG9mIGEgdHlwZSBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQsIGl0J3MgcHJpbnRlZCBhcyBhbgorLy8gaW50ZWdlcjsgb3RoZXJ3aXNlIHRoZSBieXRlcyBpbiB0aGUgdmFsdWUgYXJlIHByaW50ZWQuICBUaGlzIGlzCisvLyB3aGF0IFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZG9lcyB3aGVuIGl0IGtub3dzIG5vdGhpbmcgYWJvdXQKKy8vIHR5cGUgVCBhbmQgVCBoYXMgbmVpdGhlciA8PCBvcGVyYXRvciBub3IgUHJpbnRUbygpLgorLy8KKy8vIEEgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBmb3IgYSBjbGFzcyB0eXBlIEZvbyBieSBkZWZpbmluZworLy8gYSA8PCBvcGVyYXRvciBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLgorLy8KKy8vIFdlIHB1dCB0aGlzIG9wZXJhdG9yIGluIG5hbWVzcGFjZSAnaW50ZXJuYWwyJyBpbnN0ZWFkIG9mICdpbnRlcm5hbCcKKy8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiwgYXMgbXVjaCBjb2RlIGluICdpbnRlcm5hbCcgbmVlZHMgdG8KKy8vIHVzZSA8PCBpbiBTVEwsIHdoaWNoIHdvdWxkIGNvbmZsaWN0IHdpdGggb3VyIG93biA8PCB3ZXJlIGl0IGRlZmluZWQKKy8vIGluICdpbnRlcm5hbCcuCisvLworLy8gTm90ZSB0aGF0IHRoaXMgb3BlcmF0b3I8PCB0YWtlcyBhIGdlbmVyaWMgc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsCisvLyBDaGFyVHJhaXRzPiB0eXBlIGluc3RlYWQgb2YgdGhlIG1vcmUgcmVzdHJpY3RlZCBzdGQ6Om9zdHJlYW0uICBJZgorLy8gd2UgZGVmaW5lIGl0IHRvIHRha2UgYW4gc3RkOjpvc3RyZWFtIGluc3RlYWQsIHdlJ2xsIGdldCBhbgorLy8gImFtYmlndW91cyBvdmVybG9hZHMiIGNvbXBpbGVyIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHByaW50IGEgdHlwZQorLy8gRm9vIHRoYXQgc3VwcG9ydHMgc3RyZWFtaW5nIHRvIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLAorLy8gQ2hhclRyYWl0cz4sIGFzIHRoZSBjb21waWxlciBjYW5ub3QgdGVsbCB3aGV0aGVyCisvLyBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IFQmKSBvcgorLy8gb3BlcmF0b3I8PChzdGQ6OmJhc2ljX3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiwgY29uc3QgRm9vJikgaXMgbW9yZQorLy8gc3BlY2lmaWMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cywgdHlwZW5hbWUgVD4KKzo6c3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcGVyYXRvcjw8KAorICAgIDo6c3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcywgY29uc3QgVCYgeCkgeworICBUeXBlV2l0aG91dEZvcm1hdHRlcjxULAorICAgICAgKGludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlID8ga1Byb3RvYnVmIDoKKyAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQmLCBpbnRlcm5hbDo6QmlnZ2VzdEludD46OnZhbHVlID8KKyAgICAgICBrQ29udmVydGlibGVUb0ludGVnZXIgOiBrT3RoZXJUeXBlKT46OlByaW50VmFsdWUoeCwgJm9zKTsKKyAgcmV0dXJuIG9zOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwyCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBUaGlzIG5hbWVzcGFjZSBNVVNUIE5PVCBCRSBORVNURUQgSU4gOjp0ZXN0aW5nLCBvciB0aGUgbmFtZSBsb29rLXVwCisvLyBtYWdpYyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBVbml2ZXJzYWxQcmludGVyIHdvbid0IHdvcmsuCituYW1lc3BhY2UgdGVzdGluZ19pbnRlcm5hbCB7CisKKy8vIFVzZWQgdG8gcHJpbnQgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdoZW4gdGhlCisvLyB1c2VyIGRvZXNuJ3QgZGVmaW5lIFByaW50VG8oKSBmb3IgaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgRGVmYXVsdFByaW50Tm9uQ29udGFpbmVyVG8oY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBXaXRoIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50LCBkdXJpbmcgdW5xdWFsaWZpZWQgbmFtZSBsb29rdXAsCisgIC8vIHRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PCBhcHBlYXJzIGFzIGlmIGl0IHdhcyBkZWNsYXJlZCBpbgorICAvLyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgYm90aAorICAvLyA6OnRlc3RpbmdfaW50ZXJuYWwgYW5kIDo6dGVzdGluZzo6aW50ZXJuYWwyLCBpLmUuIHRoZSBnbG9iYWwKKyAgLy8gbmFtZXNwYWNlLiAgRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gdGhlIEMrKyBTdGFuZGFyZCBzZWN0aW9uCisgIC8vIDcuMy40LTEgW25hbWVzcGFjZS51ZGlyXS4gIFRoaXMgYWxsb3dzIHVzIHRvIGZhbGwgYmFjayBvbnRvCisgIC8vIHRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PCBpbiBjYXNlIFQgZG9lc24ndCBjb21lIHdpdGggYSA8PAorICAvLyBvcGVyYXRvci4KKyAgLy8KKyAgLy8gV2UgY2Fubm90IHdyaXRlICd1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PDsnLCB3aGljaAorICAvLyBnY2MgMy4zIGZhaWxzIHRvIGNvbXBpbGUgZHVlIHRvIGEgY29tcGlsZXIgYnVnLgorICB1c2luZyBuYW1lc3BhY2UgOjp0ZXN0aW5nOjppbnRlcm5hbDI7ICAvLyBOT0xJTlQKKworICAvLyBBc3N1bWluZyBUIGlzIGRlZmluZWQgaW4gbmFtZXNwYWNlIGZvbywgaW4gdGhlIG5leHQgc3RhdGVtZW50LAorICAvLyB0aGUgY29tcGlsZXIgd2lsbCBjb25zaWRlciBhbGwgb2Y6CisgIC8vCisgIC8vICAgMS4gZm9vOjpvcGVyYXRvcjw8ICh0aGFua3MgdG8gS29lbmlnIGxvb2stdXApLAorICAvLyAgIDIuIDo6b3BlcmF0b3I8PCAoYXMgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIGlzIGVuY2xvc2VkIGluIDo6KSwKKyAgLy8gICAzLiB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgKHRoYW5rcyB0byB0aGUgdXNpbmcgc3RhdGVtZW50IGFib3ZlKS4KKyAgLy8KKyAgLy8gVGhlIG9wZXJhdG9yPDwgd2hvc2UgdHlwZSBtYXRjaGVzIFQgYmVzdCB3aWxsIGJlIHBpY2tlZC4KKyAgLy8KKyAgLy8gV2UgZGVsaWJlcmF0ZWx5IGFsbG93ICMyIHRvIGJlIGEgY2FuZGlkYXRlLCBhcyBzb21ldGltZXMgaXQncworICAvLyBpbXBvc3NpYmxlIHRvIGRlZmluZSAjMSAoZS5nLiB3aGVuIGZvbyBpcyA6OnN0ZCwgZGVmaW5pbmcKKyAgLy8gYW55dGhpbmcgaW4gaXQgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIHVubGVzcyB5b3UgYXJlIGEgY29tcGlsZXIKKyAgLy8gdmVuZG9yLikuCisgICpvcyA8PCB2YWx1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRm9ybWF0Rm9yQ29tcGFyaXNvbjxUb1ByaW50LCBPdGhlck9wZXJhbmQ+OjpGb3JtYXQodmFsdWUpIGZvcm1hdHMgYQorLy8gdmFsdWUgb2YgdHlwZSBUb1ByaW50IHRoYXQgaXMgYW4gb3BlcmFuZCBvZiBhIGNvbXBhcmlzb24gYXNzZXJ0aW9uCisvLyAoZS5nLiBBU1NFUlRfRVEpLiAgT3RoZXJPcGVyYW5kIGlzIHRoZSB0eXBlIG9mIHRoZSBvdGhlciBvcGVyYW5kIGluCisvLyB0aGUgY29tcGFyaXNvbiwgYW5kIGlzIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGJlc3Qgd2F5IHRvCisvLyBmb3JtYXQgdGhlIHZhbHVlLiAgSW4gcGFydGljdWxhciwgd2hlbiB0aGUgdmFsdWUgaXMgYSBDIHN0cmluZworLy8gKGNoYXIgcG9pbnRlcikgYW5kIHRoZSBvdGhlciBvcGVyYW5kIGlzIGFuIFNUTCBzdHJpbmcgb2JqZWN0LCB3ZQorLy8gd2FudCB0byBmb3JtYXQgdGhlIEMgc3RyaW5nIGFzIGEgc3RyaW5nLCBzaW5jZSB3ZSBrbm93IGl0IGlzCisvLyBjb21wYXJlZCBieSB2YWx1ZSB3aXRoIHRoZSBzdHJpbmcgb2JqZWN0LiAgSWYgdGhlIHZhbHVlIGlzIGEgY2hhcgorLy8gcG9pbnRlciBidXQgdGhlIG90aGVyIG9wZXJhbmQgaXMgbm90IGFuIFNUTCBzdHJpbmcgb2JqZWN0LCB3ZSBkb24ndAorLy8ga25vdyB3aGV0aGVyIHRoZSBwb2ludGVyIGlzIHN1cHBvc2VkIHRvIHBvaW50IHRvIGEgTlVMLXRlcm1pbmF0ZWQKKy8vIHN0cmluZywgYW5kIHRodXMgd2FudCB0byBwcmludCBpdCBhcyBhIHBvaW50ZXIgdG8gYmUgc2FmZS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisKKy8vIFRoZSBkZWZhdWx0IGNhc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9QcmludCwgdHlwZW5hbWUgT3RoZXJPcGVyYW5kPgorY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbiB7CisgcHVibGljOgorICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3QgVG9QcmludCYgdmFsdWUpIHsKKyAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHZhbHVlKTsKKyAgfQorfTsKKworLy8gQXJyYXkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9QcmludCwgc2l6ZV90IE4sIHR5cGVuYW1lIE90aGVyT3BlcmFuZD4KK2NsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248VG9QcmludFtOXSwgT3RoZXJPcGVyYW5kPiB7CisgcHVibGljOgorICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3QgVG9QcmludCogdmFsdWUpIHsKKyAgICByZXR1cm4gRm9ybWF0Rm9yQ29tcGFyaXNvbjxjb25zdCBUb1ByaW50KiwgT3RoZXJPcGVyYW5kPjo6Rm9ybWF0KHZhbHVlKTsKKyAgfQorfTsKKworLy8gQnkgZGVmYXVsdCwgcHJpbnQgQyBzdHJpbmcgYXMgcG9pbnRlcnMgdG8gYmUgc2FmZSwgYXMgd2UgZG9uJ3Qga25vdworLy8gd2hldGhlciB0aGV5IGFjdHVhbGx5IHBvaW50IHRvIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLgorCisjZGVmaW5lIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKENoYXJUeXBlKSAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlck9wZXJhbmQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248Q2hhclR5cGUqLCBPdGhlck9wZXJhbmQ+IHsgICAgICAgICAgICAgICAgICBcCisgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KENoYXJUeXBlKiB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih2YWx1ZSkpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oY2hhcik7CitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhjb25zdCBjaGFyKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKHdjaGFyX3QpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oY29uc3Qgd2NoYXJfdCk7CisKKyN1bmRlZiBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXworCisvLyBJZiBhIEMgc3RyaW5nIGlzIGNvbXBhcmVkIHdpdGggYW4gU1RMIHN0cmluZyBvYmplY3QsIHdlIGtub3cgaXQncyBtZWFudAorLy8gdG8gcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcsIGFuZCB0aHVzIGNhbiBwcmludCBpdCBhcyBhIHN0cmluZy4KKworI2RlZmluZSBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKENoYXJUeXBlLCBPdGhlclN0cmluZ1R5cGUpIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbjxDaGFyVHlwZSosIE90aGVyU3RyaW5nVHlwZT4geyAgICAgICAgICAgICAgIFwKKyAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoQ2hhclR5cGUqIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNoYXIsIDo6c3RkOjpzdHJpbmcpOworR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCBjaGFyLCA6OnN0ZDo6c3RyaW5nKTsKKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNoYXIsIDo6c3RyaW5nKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3QgY2hhciwgOjpzdHJpbmcpOworI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18od2NoYXJfdCwgOjp3c3RyaW5nKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3Qgd2NoYXJfdCwgOjp3c3RyaW5nKTsKKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCitHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKHdjaGFyX3QsIDo6c3RkOjp3c3RyaW5nKTsKK0dURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3Qgd2NoYXJfdCwgOjpzdGQ6OndzdHJpbmcpOworI2VuZGlmCisKKyN1bmRlZiBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfCisKKy8vIEZvcm1hdHMgYSBjb21wYXJpc29uIGFzc2VydGlvbiAoZS5nLiBBU1NFUlRfRVEsIEVYUEVDVF9MVCwgYW5kIGV0YykKKy8vIG9wZXJhbmQgdG8gYmUgdXNlZCBpbiBhIGZhaWx1cmUgbWVzc2FnZS4gIFRoZSB0eXBlIChidXQgbm90IHZhbHVlKQorLy8gb2YgdGhlIG90aGVyIG9wZXJhbmQgbWF5IGFmZmVjdCB0aGUgZm9ybWF0LiAgVGhpcyBhbGxvd3MgdXMgdG8KKy8vIHByaW50IGEgY2hhciogYXMgYSByYXcgcG9pbnRlciB3aGVuIGl0IGlzIGNvbXBhcmVkIGFnYWluc3QgYW5vdGhlcgorLy8gY2hhciogb3Igdm9pZCosIGFuZCBwcmludCBpdCBhcyBhIEMgc3RyaW5nIHdoZW4gaXQgaXMgY29tcGFyZWQKKy8vIGFnYWluc3QgYW4gc3RkOjpzdHJpbmcgb2JqZWN0LCBmb3IgZXhhbXBsZS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RkOjpzdHJpbmcgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKAorICAgIGNvbnN0IFQxJiB2YWx1ZSwgY29uc3QgVDImIC8qIG90aGVyX29wZXJhbmQgKi8pIHsKKyAgcmV0dXJuIEZvcm1hdEZvckNvbXBhcmlzb248VDEsIFQyPjo6Rm9ybWF0KHZhbHVlKTsKK30KKworLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKSBwcmludHMgdGhlIGdpdmVuCisvLyB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4gIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdAorLy8gJ29zdHJlYW1fcHRyJyBpcyBub3QgTlVMTCwgb3IgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKy8vCisvLyBXZSBkZWZpbmUgVW5pdmVyc2FsUHJpbnRlciBhcyBhIGNsYXNzIHRlbXBsYXRlIChhcyBvcHBvc2VkIHRvIGEKKy8vIGZ1bmN0aW9uIHRlbXBsYXRlKSwgYXMgd2UgbmVlZCB0byBwYXJ0aWFsbHkgc3BlY2lhbGl6ZSBpdCBmb3IKKy8vIHJlZmVyZW5jZSB0eXBlcywgd2hpY2ggY2Fubm90IGJlIGRvbmUgd2l0aCBmdW5jdGlvbiB0ZW1wbGF0ZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gVXNlZCB0byBwcmludCBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUKKy8vIGEgUHJpbnRUbygpIGZvciBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDPgordm9pZCBEZWZhdWx0UHJpbnRUbyhJc0NvbnRhaW5lciAvKiBkdW1teSAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSAvKiBpcyBub3QgYSBwb2ludGVyICovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDJiBjb250YWluZXIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBjb25zdCBzaXplX3Qga01heENvdW50ID0gMzI7ICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcHJpbnQuCisgICpvcyA8PCAneyc7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIGZvciAodHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBjb250YWluZXIuZW5kKCk7ICsraXQsICsrY291bnQpIHsKKyAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAqb3MgPDwgJywnOworICAgICAgaWYgKGNvdW50ID09IGtNYXhDb3VudCkgeyAgLy8gRW5vdWdoIGhhcyBiZWVuIHByaW50ZWQuCisgICAgICAgICpvcyA8PCAiIC4uLiI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAqb3MgPDwgJyAnOworICAgIC8vIFdlIGNhbm5vdCBjYWxsIFByaW50VG8oKml0LCBvcykgaGVyZSBhcyBQcmludFRvKCkgZG9lc24ndAorICAgIC8vIGhhbmRsZSAqaXQgYmVpbmcgYSBuYXRpdmUgYXJyYXkuCisgICAgaW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KCppdCwgb3MpOworICB9CisKKyAgaWYgKGNvdW50ID4gMCkgeworICAgICpvcyA8PCAnICc7CisgIH0KKyAgKm9zIDw8ICd9JzsKK30KKworLy8gVXNlZCB0byBwcmludCBhIHBvaW50ZXIgdGhhdCBpcyBuZWl0aGVyIGEgY2hhciBwb2ludGVyIG5vciBhIG1lbWJlcgorLy8gcG9pbnRlciwgd2hlbiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LiAgKEEgbWVtYmVyCisvLyB2YXJpYWJsZSBwb2ludGVyIG9yIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIGRvZXNuJ3QgcmVhbGx5IHBvaW50IHRvCisvLyBhIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlLiAgVGhlaXIgcmVwcmVzZW50YXRpb24gaXMKKy8vIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBUaGVyZWZvcmUgdGhleSB3aWxsIGJlIHByaW50ZWQgYXMgcmF3CisvLyBieXRlcy4pCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgRGVmYXVsdFByaW50VG8oSXNOb3RDb250YWluZXIgLyogZHVtbXkgKi8sCisgICAgICAgICAgICAgICAgICAgIHRydWVfdHlwZSAvKiBpcyBhIHBvaW50ZXIgKi8sCisgICAgICAgICAgICAgICAgICAgIFQqIHAsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBpZiAocCA9PSBOVUxMKSB7CisgICAgKm9zIDw8ICJOVUxMIjsKKyAgfSBlbHNlIHsKKyAgICAvLyBDKysgZG9lc24ndCBhbGxvdyBjYXN0aW5nIGZyb20gYSBmdW5jdGlvbiBwb2ludGVyIHRvIGFueSBvYmplY3QKKyAgICAvLyBwb2ludGVyLgorICAgIC8vCisgICAgLy8gSXNUcnVlKCkgc2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLAorICAgIC8vICJ1bnJlYWNoYWJsZSBjb2RlIi4KKyAgICBpZiAoSXNUcnVlKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUKiwgY29uc3Qgdm9pZCo+Ojp2YWx1ZSkpIHsKKyAgICAgIC8vIFQgaXMgbm90IGEgZnVuY3Rpb24gdHlwZS4gIFdlIGp1c3QgY2FsbCA8PCB0byBwcmludCBwLAorICAgICAgLy8gcmVseWluZyBvbiBBREwgdG8gcGljayB1cCB1c2VyLWRlZmluZWQgPDwgZm9yIHRoZWlyIHBvaW50ZXIKKyAgICAgIC8vIHR5cGVzLCBpZiBhbnkuCisgICAgICAqb3MgPDwgcDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVCBpcyBhIGZ1bmN0aW9uIHR5cGUsIHNvICcqb3MgPDwgcCcgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQKKyAgICAgIC8vIChpdCBqdXN0IHByaW50cyBwIGFzIGJvb2wpLiAgV2Ugd2FudCB0byBwcmludCBwIGFzIGEgY29uc3QKKyAgICAgIC8vIHZvaWQqLiAgSG93ZXZlciwgd2UgY2Fubm90IGNhc3QgaXQgdG8gY29uc3Qgdm9pZCogZGlyZWN0bHksCisgICAgICAvLyBldmVuIHVzaW5nIHJlaW50ZXJwcmV0X2Nhc3QsIGFzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2NjCisgICAgICAvLyAoZS5nLiAzLjQuNSkgY2Fubm90IGNvbXBpbGUgdGhlIGNhc3Qgd2hlbiBwIGlzIGEgZnVuY3Rpb24KKyAgICAgIC8vIHBvaW50ZXIuICBDYXN0aW5nIHRvIFVJbnQ2NCBmaXJzdCBzb2x2ZXMgdGhlIHByb2JsZW0uCisgICAgICAqb3MgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6VUludDY0PihwKSk7CisgICAgfQorICB9Cit9CisKKy8vIFVzZWQgdG8gcHJpbnQgYSBub24tY29udGFpbmVyLCBub24tcG9pbnRlciB2YWx1ZSB3aGVuIHRoZSB1c2VyCisvLyBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICBmYWxzZV90eXBlIC8qIGlzIG5vdCBhIHBvaW50ZXIgKi8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgOjp0ZXN0aW5nX2ludGVybmFsOjpEZWZhdWx0UHJpbnROb25Db250YWluZXJUbyh2YWx1ZSwgb3MpOworfQorCisvLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIHRoZSA8PCBvcGVyYXRvciBpZiBpdCBoYXMgb25lOworLy8gb3RoZXJ3aXNlIHByaW50cyB0aGUgYnl0ZXMgaW4gaXQuICBUaGlzIGlzIHdoYXQKKy8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZG9lcyB3aGVuIFByaW50VG8oKSBpcyBub3Qgc3BlY2lhbGl6ZWQKKy8vIG9yIG92ZXJsb2FkZWQgZm9yIHR5cGUgVC4KKy8vCisvLyBBIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgZm9yIGEgY2xhc3MgdHlwZSBGb28gYnkgZGVmaW5pbmcKKy8vIGFuIG92ZXJsb2FkIG9mIFByaW50VG8oKSBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLiAgV2UKKy8vIGdpdmUgdGhlIHVzZXIgdGhpcyBvcHRpb24gYXMgc29tZXRpbWVzIGRlZmluaW5nIGEgPDwgb3BlcmF0b3IgZm9yCisvLyBGb28gaXMgbm90IGRlc2lyYWJsZSAoZS5nLiB0aGUgY29kaW5nIHN0eWxlIG1heSBwcmV2ZW50IGRvaW5nIGl0LAorLy8gb3IgdGhlcmUgaXMgYWxyZWFkeSBhIDw8IG9wZXJhdG9yIGJ1dCBpdCBkb2Vzbid0IGRvIHdoYXQgdGhlIHVzZXIKKy8vIHdhbnRzKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBQcmludFRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgLy8gRGVmYXVsdFByaW50VG8oKSBpcyBvdmVybG9hZGVkLiAgVGhlIHR5cGUgb2YgaXRzIGZpcnN0IHR3bworICAvLyBhcmd1bWVudHMgZGV0ZXJtaW5lIHdoaWNoIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQuICBJZiBUIGlzIGFuCisgIC8vIFNUTC1zdHlsZSBjb250YWluZXIsIHRoZSB2ZXJzaW9uIGZvciBjb250YWluZXIgd2lsbCBiZSBjYWxsZWQ7IGlmCisgIC8vIFQgaXMgYSBwb2ludGVyLCB0aGUgcG9pbnRlciB2ZXJzaW9uIHdpbGwgYmUgY2FsbGVkOyBvdGhlcndpc2UgdGhlCisgIC8vIGdlbmVyaWMgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHdlIGNoZWNrIGZvciBjb250YWluZXIgdHlwZXMgaGVyZSwgcHJpb3IgdG8gd2UgY2hlY2sKKyAgLy8gZm9yIHByb3RvY29sIG1lc3NhZ2UgdHlwZXMgaW4gb3VyIG9wZXJhdG9yPDwuICBUaGUgcmF0aW9uYWxlIGlzOgorICAvLworICAvLyBGb3IgcHJvdG9jb2wgbWVzc2FnZXMsIHdlIHdhbnQgdG8gZ2l2ZSBwZW9wbGUgYSBjaGFuY2UgdG8KKyAgLy8gb3ZlcnJpZGUgR29vZ2xlIE1vY2sncyBmb3JtYXQgYnkgZGVmaW5pbmcgYSBQcmludFRvKCkgb3IKKyAgLy8gb3BlcmF0b3I8PC4gIEZvciBTVEwgY29udGFpbmVycywgb3RoZXIgZm9ybWF0cyBjYW4gYmUKKyAgLy8gaW5jb21wYXRpYmxlIHdpdGggR29vZ2xlIE1vY2sncyBmb3JtYXQgZm9yIHRoZSBjb250YWluZXIKKyAgLy8gZWxlbWVudHM7IHRoZXJlZm9yZSB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUgdG8gZW5zdXJlCisgIC8vIHRoYXQgb3VyIGZvcm1hdCBpcyB1c2VkLgorICAvLworICAvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIERlZmF1bHRQcmludFRvKCkgaXMgbmVlZGVkIHRvIGJ5cGFzcyBhIGJ1ZworICAvLyBpbiBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIHRoYXQgcHJldmVudHMgaXQgZnJvbSBwaWNraW5nIHRoZSByaWdodAorICAvLyBvdmVybG9hZCBiZXR3ZWVuOgorICAvLworICAvLyAgIFByaW50VG8oY29uc3QgVCYgeCwgLi4uKTsKKyAgLy8gICBQcmludFRvKFQqIHgsIC4uLik7CisgIERlZmF1bHRQcmludFRvKElzQ29udGFpbmVyVGVzdDxUPigwKSwgaXNfcG9pbnRlcjxUPigpLCB2YWx1ZSwgb3MpOworfQorCisvLyBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgUHJpbnRUbygpIG92ZXJsb2FkcyB0ZWxscworLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBob3cgdG8gcHJpbnQgc3RhbmRhcmQgdHlwZXMgKGJ1aWx0LWluCisvLyB0eXBlcywgc3RyaW5ncywgcGxhaW4gYXJyYXlzLCBhbmQgcG9pbnRlcnMpLgorCisvLyBPdmVybG9hZHMgZm9yIHZhcmlvdXMgY2hhciB0eXBlcy4KK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKHNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIFdoZW4gcHJpbnRpbmcgYSBwbGFpbiBjaGFyLCB3ZSBhbHdheXMgdHJlYXQgaXQgYXMgdW5zaWduZWQuICBUaGlzCisgIC8vIHdheSwgdGhlIG91dHB1dCB3b24ndCBiZSBhZmZlY3RlZCBieSB3aGV0aGVyIHRoZSBjb21waWxlciB0aGlua3MKKyAgLy8gY2hhciBpcyBzaWduZWQgb3Igbm90LgorICBQcmludFRvKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpLCBvcyk7Cit9CisKKy8vIE92ZXJsb2FkcyBmb3Igb3RoZXIgc2ltcGxlIGJ1aWx0LWluIHR5cGVzLgoraW5saW5lIHZvaWQgUHJpbnRUbyhib29sIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgKHggPyAidHJ1ZSIgOiAiZmFsc2UiKTsKK30KKworLy8gT3ZlcmxvYWQgZm9yIHdjaGFyX3QgdHlwZS4KKy8vIFByaW50cyBhIHdjaGFyX3QgYXMgYSBzeW1ib2wgaWYgaXQgaXMgcHJpbnRhYmxlIG9yIGFzIGl0cyBpbnRlcm5hbAorLy8gY29kZSBvdGhlcndpc2UgYW5kIGFsc28gYXMgaXRzIGRlY2ltYWwgY29kZSAoZXhjZXB0IGZvciBMJ1wwJykuCisvLyBUaGUgTCdcMCcgY2hhciBpcyBwcmludGVkIGFzICJMJ1xcMCciLiBUaGUgZGVjaW1hbCBjb2RlIGlzIHByaW50ZWQKKy8vIGFzIHNpZ25lZCBpbnRlZ2VyIHdoZW4gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgY29tcGlsZXIKKy8vIGFzIGEgc2lnbmVkIHR5cGUgYW5kIGlzIHByaW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QKKy8vIGlzIGltcGxlbWVudGVkIGFzIGFuIHVuc2lnbmVkIHR5cGUuCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh3Y2hhcl90IHdjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBPdmVybG9hZHMgZm9yIEMgc3RyaW5ncy4KK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3QgY2hhcio+KHMpLCBvcyk7Cit9CisKKy8vIHNpZ25lZC91bnNpZ25lZCBjaGFyIGlzIG9mdGVuIHVzZWQgZm9yIHJlcHJlc2VudGluZyBiaW5hcnkgZGF0YSwgc28KKy8vIHdlIHByaW50IHBvaW50ZXJzIHRvIGl0IGFzIHZvaWQqIHRvIGJlIHNhZmUuCitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IHNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSwgb3MpOworfQoraW5saW5lIHZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgdW5zaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KK2lubGluZSB2b2lkIFByaW50VG8odW5zaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KKworLy8gTVNWQyBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2NoYXJfdCBhcyBhIHR5cGVkZWYgb2YgdW5zaWduZWQKKy8vIHNob3J0LiAgSXQgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCB3aGVuIHdjaGFyX3QgaXMgYSBuYXRpdmUKKy8vIHR5cGUuICBXaGVuIHdjaGFyX3QgaXMgYSB0eXBlZGVmLCBkZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3QKKy8vIHdjaGFyX3QqIHdvdWxkIGNhdXNlIHVuc2lnbmVkIHNob3J0KiBiZSBwcmludGVkIGFzIGEgd2lkZSBzdHJpbmcsCisvLyBwb3NzaWJseSBjYXVzaW5nIGludmFsaWQgbWVtb3J5IGFjY2Vzc2VzLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQorLy8gT3ZlcmxvYWRzIGZvciB3aWRlIEMgc3RyaW5ncworR1RFU1RfQVBJXyB2b2lkIFByaW50VG8oY29uc3Qgd2NoYXJfdCogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8od2NoYXJfdCogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB3Y2hhcl90Kj4ocyksIG9zKTsKK30KKyNlbmRpZgorCisvLyBPdmVybG9hZCBmb3IgQyBhcnJheXMuICBNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIHByaW50ZWQKKy8vIHByb3Blcmx5LgorCisvLyBQcmludHMgdGhlIGdpdmVuIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSwgd2l0aG91dCBwcmludGluZworLy8gdGhlIGN1cmx5IGJyYWNlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBQcmludFJhd0FycmF5VG8oY29uc3QgVCBhW10sIHNpemVfdCBjb3VudCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFByaW50KGFbMF0sIG9zKTsKKyAgZm9yIChzaXplX3QgaSA9IDE7IGkgIT0gY291bnQ7IGkrKykgeworICAgICpvcyA8PCAiLCAiOworICAgIFVuaXZlcnNhbFByaW50KGFbaV0sIG9zKTsKKyAgfQorfQorCisvLyBPdmVybG9hZHMgZm9yIDo6c3RyaW5nIGFuZCA6OnN0ZDo6c3RyaW5nLgorI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCitHVEVTVF9BUElfIHZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50U3RyaW5nVG8ocywgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCitHVEVTVF9BUElfIHZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFN0cmluZ1RvKHMsIG9zKTsKK30KKworLy8gT3ZlcmxvYWRzIGZvciA6OndzdHJpbmcgYW5kIDo6c3RkOjp3c3RyaW5nLgorI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6d3N0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OndzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCitHVEVTVF9BUElfIHZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRSB8fCBHVEVTVF9IQVNfU1REX1RVUExFXworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLiAgVCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoCisvLyBhIHR1cGxlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFQmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUgfHwgR1RFU1RfSEFTX1NURF9UVVBMRV8KKworI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKKy8vIE92ZXJsb2FkIGZvciA6OnN0ZDo6dHIxOjp0dXBsZS4gIE5lZWRlZCBmb3IgcHJpbnRpbmcgZnVuY3Rpb24gYXJndW1lbnRzLAorLy8gd2hpY2ggYXJlIHBhY2tlZCBhcyB0dXBsZXMuCisKKy8vIE92ZXJsb2FkZWQgUHJpbnRUbygpIGZvciB0dXBsZXMgb2YgdmFyaW91cyBhcml0aWVzLiAgV2Ugc3VwcG9ydAorLy8gdHVwbGVzIG9mIHVwLXRvIDEwIGZpZWxkcy4gIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gd29ya3MKKy8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0cjE6OnR1cGxlIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZQorLy8gbm9uLXN0YW5kYXJkIHZhcmlhZGljIHRlbXBsYXRlIGZlYXR1cmUgb3Igbm90LgorCitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPD4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDE+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4mIHQsCisgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Cit2b2lkIFByaW50VG8oCisgICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiYgdCwKKyAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCisjaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHVwbGU8VHlwZXMuLi4+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9UVVBMRV8KKworLy8gT3ZlcmxvYWQgZm9yIHN0ZDo6cGFpci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnBhaXI8VDEsIFQyPiYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgJygnOworICAvLyBXZSBjYW5ub3QgdXNlIFVuaXZlcnNhbFByaW50KHZhbHVlLmZpcnN0LCBvcykgaGVyZSwgYXMgVDEgbWF5IGJlCisgIC8vIGEgcmVmZXJlbmNlIHR5cGUuICBUaGUgc2FtZSBmb3IgcHJpbnRpbmcgdmFsdWUuc2Vjb25kLgorICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUuZmlyc3QsIG9zKTsKKyAgKm9zIDw8ICIsICI7CisgIFVuaXZlcnNhbFByaW50ZXI8VDI+OjpQcmludCh2YWx1ZS5zZWNvbmQsIG9zKTsKKyAgKm9zIDw8ICcpJzsKK30KKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIGJ5IGxldHRpbmcgdGhlIGNvbXBpbGVyCisvLyBwaWNrIHRoZSByaWdodCBvdmVybG9hZCBvZiBQcmludFRvKCkgZm9yIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXIgeworIHB1YmxpYzoKKyAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCisgIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCisgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQxODApCisKKyAgLy8gTm90ZTogd2UgZGVsaWJlcmF0ZWx5IGRvbid0IGNhbGwgdGhpcyBQcmludFRvKCksIGFzIHRoYXQgbmFtZQorICAvLyBjb25mbGljdHMgd2l0aCA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFRvIGluIHRoZSBib2R5IG9mIHRoZQorICAvLyBmdW5jdGlvbi4KKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIC8vIEJ5IGRlZmF1bHQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OlByaW50VG8oKSBpcyB1c2VkIGZvciBwcmludGluZworICAgIC8vIHRoZSB2YWx1ZS4KKyAgICAvLworICAgIC8vIFRoYW5rcyB0byBLb2VuaWcgbG9vay11cCwgaWYgVCBpcyBhIGNsYXNzIGFuZCBoYXMgaXRzIG93bgorICAgIC8vIFByaW50VG8oKSBmdW5jdGlvbiBkZWZpbmVkIGluIGl0cyBuYW1lc3BhY2UsIHRoYXQgZnVuY3Rpb24gd2lsbAorICAgIC8vIGJlIHZpc2libGUgaGVyZS4gIFNpbmNlIGl0IGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZ2VuZXJpYyBvbmVzCisgICAgLy8gaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCwgaXQgd2lsbCBiZSBwaWNrZWQgYnkgdGhlIGNvbXBpbGVyIGluIHRoZQorICAgIC8vIGZvbGxvd2luZyBzdGF0ZW1lbnQgLSBleGFjdGx5IHdoYXQgd2Ugd2FudC4KKyAgICBQcmludFRvKHZhbHVlLCBvcyk7CisgIH0KKworICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKK307CisKKy8vIFVuaXZlcnNhbFByaW50QXJyYXkoYmVnaW4sIGxlbiwgb3MpIHByaW50cyBhbiBhcnJheSBvZiAnbGVuJworLy8gZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IFQqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgKm9zIDw8ICJ7fSI7CisgIH0gZWxzZSB7CisgICAgKm9zIDw8ICJ7ICI7CisgICAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxODsKKyAgICBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDg7CisgICAgLy8gSWYgdGhlIGFycmF5IGhhcyBtb3JlIHRoYW4ga1RocmVzaG9sZCBlbGVtZW50cywgd2UnbGwgaGF2ZSB0bworICAgIC8vIG9taXQgc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdAorICAgIC8vIGtDaHVua1NpemUgZWxlbWVudHMuCisgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgorICAgIGlmIChsZW4gPD0ga1RocmVzaG9sZCkgeworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBsZW4sIG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBrQ2h1bmtTaXplLCBvcyk7CisgICAgICAqb3MgPDwgIiwgLi4uLCAiOworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luICsgbGVuIC0ga0NodW5rU2l6ZSwga0NodW5rU2l6ZSwgb3MpOworICAgIH0KKyAgICAqb3MgPDwgIiB9IjsKKyAgfQorfQorLy8gVGhpcyBvdmVybG9hZCBwcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgY29tcGFjdGx5LgorR1RFU1RfQVBJXyB2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoCisgICAgY29uc3QgY2hhciogYmVnaW4sIHNpemVfdCBsZW4sIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIFRoaXMgb3ZlcmxvYWQgcHJpbnRzIGEgKGNvbnN0KSB3Y2hhcl90IGFycmF5IGNvbXBhY3RseS4KK0dURVNUX0FQSV8gdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KAorICAgIGNvbnN0IHdjaGFyX3QqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBJbXBsZW1lbnRzIHByaW50aW5nIGFuIGFycmF5IHR5cGUgVFtOXS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXI8VFtOXT4geworIHB1YmxpYzoKKyAgLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSwgb21pdHRpbmcgc29tZSBlbGVtZW50cyB3aGVuIHRoZXJlIGFyZSB0b28KKyAgLy8gbWFueS4KKyAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCAoJmEpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludEFycmF5KGEsIE4sIG9zKTsKKyAgfQorfTsKKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhIHJlZmVyZW5jZSB0eXBlIFQmLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyPFQmPiB7CisgcHVibGljOgorICAvLyBNU1ZDIHdhcm5zIGFib3V0IGFkZGluZyBjb25zdCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNvIHdlIHdhbnQgdG8KKyAgLy8gZGlzYWJsZSB0aGUgd2FybmluZy4KKyAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDE4MCkKKworICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgLy8gUHJpbnRzIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZS4gIFdlIHVzZSByZWludGVycHJldF9jYXN0IGhlcmUKKyAgICAvLyBhcyBzdGF0aWNfY2FzdCBkb2Vzbid0IGNvbXBpbGUgd2hlbiBUIGlzIGEgZnVuY3Rpb24gdHlwZS4KKyAgICAqb3MgPDwgIkAiIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZ2YWx1ZSkgPDwgIiAiOworCisgICAgLy8gVGhlbiBwcmludHMgdGhlIHZhbHVlIGl0c2VsZi4KKyAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworICB9CisKKyAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCit9OworCisvLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQgdmFsdWUKKy8vIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhlCisvLyBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzIHByaW50ZWQuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxUZXJzZVByaW50ZXI8VCY+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPFRbTl0+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZ2YWx1ZSlbTl0sIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFByaW50ZXI8VFtOXT46OlByaW50KHZhbHVlLCBvcyk7CisgIH0KK307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IGNoYXIqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgKm9zIDw8ICJOVUxMIjsKKyAgICB9IGVsc2UgeworICAgICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nKHN0ciksIG9zKTsKKyAgICB9CisgIH0KK307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNoYXIqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCBjaGFyKj46OlByaW50KHN0ciwgb3MpOworICB9Cit9OworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IHdjaGFyX3QqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludChjb25zdCB3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgKm9zIDw8ICJOVUxMIjsKKyAgICB9IGVsc2UgeworICAgICAgVW5pdmVyc2FsUHJpbnQoOjpzdGQ6OndzdHJpbmcoc3RyKSwgb3MpOworICAgIH0KKyAgfQorfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8PgorY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPHdjaGFyX3QqPiB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBQcmludCh3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCB3Y2hhcl90Kj46OlByaW50KHN0ciwgb3MpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zKTsKK30KKworLy8gUHJpbnRzIGEgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlCisvLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgZm9yIGEKKy8vIChjb25zdCkgY2hhciBwb2ludGVyLCB0aGlzIHByaW50cyBib3RoIHRoZSBwb2ludGVyIGFuZCB0aGUKKy8vIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIEEgd29ya2Fyb25kIGZvciB0aGUgYnVnIGluIFZDKysgNy4xIHRoYXQgcHJldmVudHMgdXMgZnJvbSBpbnN0YW50aWF0aW5nCisgIC8vIFVuaXZlcnNhbFByaW50ZXIgd2l0aCBUIGRpcmVjdGx5LgorICB0eXBlZGVmIFQgVDE7CisgIFVuaXZlcnNhbFByaW50ZXI8VDE+OjpQcmludCh2YWx1ZSwgb3MpOworfQorCit0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8c3RyaW5nPiBTdHJpbmdzOworCisvLyBUdXBsZVBvbGljeTxUdXBsZVQ+IG11c3QgcHJvdmlkZToKKy8vIC0gdHVwbGVfc2l6ZQorLy8gICAgIHNpemUgb2YgdHVwbGUgVHVwbGVULgorLy8gLSBnZXQ8c2l6ZV90IEk+KGNvbnN0IFR1cGxlVCYgdCkKKy8vICAgICBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdGluZyBlbGVtZW50IEkgb2YgdHVwbGUgVHVwbGVULgorLy8gLSB0dXBsZV9lbGVtZW50PHNpemVfdCBJPjo6dHlwZQorLy8gICAgIHR5cGUgb2YgZWxlbWVudCBJIG9mIHR1cGxlIFR1cGxlVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZVQ+CitzdHJ1Y3QgVHVwbGVQb2xpY3k7CisKKyNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVUPgorc3RydWN0IFR1cGxlUG9saWN5IHsKKyAgdHlwZWRlZiBUdXBsZVQgVHVwbGU7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgdHVwbGVfc2l6ZSA9IDo6c3RkOjp0cjE6OnR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZSA8c2l6ZV90IEk+CisgIHN0cnVjdCB0dXBsZV9lbGVtZW50IDogOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT4ge307CisKKyAgdGVtcGxhdGUgPHNpemVfdCBJPgorICBzdGF0aWMgdHlwZW5hbWUgQWRkUmVmZXJlbmNlPAorICAgICAgY29uc3QgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT46OnR5cGU+Ojp0eXBlIGdldCgKKyAgICAgIGNvbnN0IFR1cGxlJiB0dXBsZSkgeworICAgIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8ST4odHVwbGUpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlVD4KK2NvbnN0IHNpemVfdCBUdXBsZVBvbGljeTxUdXBsZVQ+Ojp0dXBsZV9zaXplOworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCisKKyNpZiBHVEVTVF9IQVNfU1REX1RVUExFXwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFR5cGVzPgorc3RydWN0IFR1cGxlUG9saWN5PCA6OnN0ZDo6dHVwbGU8VHlwZXMuLi4+ID4geworICB0eXBlZGVmIDo6c3RkOjp0dXBsZTxUeXBlcy4uLj4gVHVwbGU7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgdHVwbGVfc2l6ZSA9IDo6c3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWU7CisKKyAgdGVtcGxhdGUgPHNpemVfdCBJPgorICBzdHJ1Y3QgdHVwbGVfZWxlbWVudCA6IDo6c3RkOjp0dXBsZV9lbGVtZW50PEksIFR1cGxlPiB7fTsKKworICB0ZW1wbGF0ZSA8c2l6ZV90IEk+CisgIHN0YXRpYyBjb25zdCB0eXBlbmFtZSA6OnN0ZDo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT46OnR5cGUmIGdldCgKKyAgICAgIGNvbnN0IFR1cGxlJiB0dXBsZSkgeworICAgIHJldHVybiA6OnN0ZDo6Z2V0PEk+KHR1cGxlKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KK2NvbnN0IHNpemVfdCBUdXBsZVBvbGljeTwgOjpzdGQ6OnR1cGxlPFR5cGVzLi4uPiA+Ojp0dXBsZV9zaXplOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1RVUExFXworCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRSB8fCBHVEVTVF9IQVNfU1REX1RVUExFXworLy8gVGhpcyBoZWxwZXIgdGVtcGxhdGUgYWxsb3dzIFByaW50VG8oKSBmb3IgdHVwbGVzIGFuZAorLy8gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKCkgdG8gYmUgZGVmaW5lZCBieQorLy8gaW5kdWN0aW9uIG9uIHRoZSBudW1iZXIgb2YgdHVwbGUgZmllbGRzLiAgVGhlIGlkZWEgaXMgdGhhdAorLy8gVHVwbGVQcmVmaXhQcmludGVyPE4+OjpQcmludFByZWZpeFRvKHQsIG9zKSBwcmludHMgdGhlIGZpcnN0IE4KKy8vIGZpZWxkcyBpbiB0dXBsZSB0LCBhbmQgY2FuIGJlIGRlZmluZWQgaW4gdGVybXMgb2YKKy8vIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT4uCisvLworLy8gVGhlIGluZHVjdGl2ZSBjYXNlLgordGVtcGxhdGUgPHNpemVfdCBOPgorc3RydWN0IFR1cGxlUHJlZml4UHJpbnRlciB7CisgIC8vIFByaW50cyB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgYSB0dXBsZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBQcmludFByZWZpeFRvKGNvbnN0IFR1cGxlJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+OjpQcmludFByZWZpeFRvKHQsIG9zKTsKKyAgICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BVU0hfKCkKKyAgICBpZiAoTiA+IDEpIHsKKyAgICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKQorICAgICAgKm9zIDw8ICIsICI7CisgICAgfQorICAgIFVuaXZlcnNhbFByaW50ZXI8CisgICAgICAgIHR5cGVuYW1lIFR1cGxlUG9saWN5PFR1cGxlPjo6dGVtcGxhdGUgdHVwbGVfZWxlbWVudDxOIC0gMT46OnR5cGU+CisgICAgICAgIDo6UHJpbnQoVHVwbGVQb2xpY3k8VHVwbGU+Ojp0ZW1wbGF0ZSBnZXQ8TiAtIDE+KHQpLCBvcyk7CisgIH0KKworICAvLyBUZXJzZWx5IHByaW50cyB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgYSB0dXBsZSB0byBhIHN0cmluZyB2ZWN0b3IsCisgIC8vIG9uZSBlbGVtZW50IGZvciBlYWNoIGZpZWxkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3MoY29uc3QgVHVwbGUmIHQsIFN0cmluZ3MqIHN0cmluZ3MpIHsKKyAgICBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+OjpUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKHQsIHN0cmluZ3MpOworICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgVW5pdmVyc2FsVGVyc2VQcmludChUdXBsZVBvbGljeTxUdXBsZT46OnRlbXBsYXRlIGdldDxOIC0gMT4odCksICZzcyk7CisgICAgc3RyaW5ncy0+cHVzaF9iYWNrKHNzLnN0cigpKTsKKyAgfQorfTsKKworLy8gQmFzZSBjYXNlLgordGVtcGxhdGUgPD4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXI8MD4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmLCA6OnN0ZDo6b3N0cmVhbSopIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiwgU3RyaW5ncyopIHt9Cit9OworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHByaW50aW5nIGEgdHVwbGUuCisvLyBUdXBsZSBtdXN0IGJlIGVpdGhlciBzdGQ6OnRyMTo6dHVwbGUgb3Igc3RkOjp0dXBsZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgordm9pZCBQcmludFR1cGxlVG8oY29uc3QgVHVwbGUmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgIigiOworICBUdXBsZVByZWZpeFByaW50ZXI8VHVwbGVQb2xpY3k8VHVwbGU+Ojp0dXBsZV9zaXplPjo6UHJpbnRQcmVmaXhUbyh0LCBvcyk7CisgICpvcyA8PCAiKSI7Cit9CisKKy8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQorLy8gZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4gIFNlZSB0aGUgY29tbWVudCBiZWZvcmUKKy8vIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBmb3IgaG93IHdlIGRlZmluZSAidGVyc2VseSIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CitTdHJpbmdzIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhjb25zdCBUdXBsZSYgdmFsdWUpIHsKKyAgU3RyaW5ncyByZXN1bHQ7CisgIFR1cGxlUHJlZml4UHJpbnRlcjxUdXBsZVBvbGljeTxUdXBsZT46OnR1cGxlX3NpemU+OjoKKyAgICAgIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3ModmFsdWUsICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFIHx8IEdURVNUX0hBU19TVERfVFVQTEVfCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKzo6c3RkOjpzdHJpbmcgUHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBpbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgJnNzKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisvLyBJbmNsdWRlIGFueSBjdXN0b20gcHJpbnRlciBhZGRlZCBieSB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLgorLy8gV2UgbXVzdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGF0IHRoZSBlbmQgdG8gbWFrZSBzdXJlIGl0IGNhbiB1c2UgdGhlCisvLyBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGZpbGUuCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXByaW50ZXJzLmgiCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjNmYTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVXRpbGl0aWVzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZiBhbmQgY29kZSB0aGF0IHVzZXMgR29vZ2xlIFRlc3QKKy8vIChlLmcuIGZyYW1ld29ya3MgYnVpbHQgb24gdG9wIG9mIEdvb2dsZSBUZXN0KS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBjYW4gYmUgdXNlZCB0byBtb2NrIG91dCBHb29nbGUgVGVzdCBmYWlsdXJlIHJlcG9ydGluZworLy8gc28gdGhhdCB3ZSBjYW4gdGVzdCBHb29nbGUgVGVzdCBvciBjb2RlIHRoYXQgYnVpbGRzIG9uIEdvb2dsZSBUZXN0LgorLy8KKy8vIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGFwcGVuZHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QgdG8gdGhlCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IG9iamVjdCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3Igd2hlbmV2ZXIgYSBHb29nbGUgVGVzdAorLy8gZmFpbHVyZSBpcyByZXBvcnRlZC4gSXQgY2FuIGVpdGhlciBpbnRlcmNlcHQgb25seSBmYWlsdXJlcyB0aGF0IGFyZQorLy8gZ2VuZXJhdGVkIGluIHRoZSBzYW1lIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhpcyBvYmplY3Qgb3IgaXQgY2FuIGludGVyY2VwdAorLy8gYWxsIGdlbmVyYXRlZCBmYWlsdXJlcy4gVGhlIHNjb3BlIG9mIHRoaXMgbW9jayBvYmplY3QgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aAorLy8gdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgdHdvIGFyZ3VtZW50cyBjb25zdHJ1Y3Rvci4KK2NsYXNzIEdURVNUX0FQSV8gU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSB0d28gcG9zc2libGUgbW9ja2luZyBtb2RlcyBvZiB0aGlzIG9iamVjdC4KKyAgZW51bSBJbnRlcmNlcHRNb2RlIHsKKyAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgIC8vIEludGVyY2VwdHMgb25seSB0aHJlYWQgbG9jYWwgZmFpbHVyZXMuCisgICAgSU5URVJDRVBUX0FMTF9USFJFQURTICAgICAgICAgICAvLyBJbnRlcmNlcHRzIGFsbCBmYWlsdXJlcy4KKyAgfTsKKworICAvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkCisgIC8vIGJ5IEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorICAvLyByZXN1bHRzLiBUaGlzIHJlcG9ydGVyIHdpbGwgb25seSBjYXRjaCBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQKKyAgLy8gdGhyZWFkLiBERVBSRUNBVEVECisgIGV4cGxpY2l0IFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHlvdSBjYW4gY2hvb3NlIHRoZSBpbnRlcmNlcHRpb24gc2NvcGUgb2YgdGhpcyBvYmplY3QuCisgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7CisKKyAgLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICB2aXJ0dWFsIH5TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOworCisgIC8vIEFwcGVuZHMgdGhlIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUgVGVzdFBhcnRSZXN1bHRBcnJheQorICAvLyByZWNlaXZlZCBpbiB0aGUgY29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UKKyAgLy8gaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgcHJpdmF0ZToKKyAgdm9pZCBJbml0KCk7CisKKyAgY29uc3QgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZV87CisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIG9sZF9yZXBvcnRlcl87CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIGNvbnN0IHJlc3VsdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBIGhlbHBlciBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgYW5kCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpLiAgSXRzIGRlc3RydWN0b3IgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KKy8vIFRlc3RQYXJ0UmVzdWx0QXJyYXkgY29udGFpbnMgZXhhY3RseSBvbmUgZmFpbHVyZSB0aGF0IGhhcyB0aGUgZ2l2ZW4KKy8vIHR5cGUgYW5kIGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuICBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCBhCisvLyBub24tZmF0YWwgZmFpbHVyZSB3aWxsIGJlIGdlbmVyYXRlZC4KK2NsYXNzIEdURVNUX0FQSV8gU2luZ2xlRmFpbHVyZUNoZWNrZXIgeworIHB1YmxpYzoKKyAgLy8gVGhlIGNvbnN0cnVjdG9yIHJlbWVtYmVycyB0aGUgYXJndW1lbnRzLgorICBTaW5nbGVGYWlsdXJlQ2hlY2tlcihjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1YnN0cik7CisgIH5TaW5nbGVGYWlsdXJlQ2hlY2tlcigpOworIHByaXZhdGU6CisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkqIGNvbnN0IHJlc3VsdHNfOworICBjb25zdCBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlXzsKKyAgY29uc3Qgc3RyaW5nIHN1YnN0cl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTaW5nbGVGYWlsdXJlQ2hlY2tlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gQSBzZXQgb2YgbWFjcm9zIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgb3IgY29kZSB0aGF0J3MgZXhwZWN0ZWQKKy8vIHRvIGdlbmVyYXRlIEdvb2dsZSBUZXN0IGZhdGFsIGZhaWx1cmVzLiAgSXQgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KKy8vIHN0YXRlbWVudCB3aWxsIGNhdXNlIGV4YWN0bHkgb25lIGZhdGFsIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2l0aCAnc3Vic3RyJworLy8gYmVpbmcgcGFydCBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoaXMgbWFjcm8uIEVYUEVDVF9GQVRBTF9GQUlMVVJFIG9ubHkKKy8vIGFmZmVjdHMgYW5kIGNvbnNpZGVycyBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZAorLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMgZG9lcyB0aGUgc2FtZSBidXQgZm9yIGFsbCB0aHJlYWRzLgorLy8KKy8vIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIGFzc2VydGlvbiBpcyBkb25lIGNvcnJlY3RseSBldmVuIHdoZW4gdGhlIHN0YXRlbWVudAorLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisvLworLy8gS25vd24gcmVzdHJpY3Rpb25zOgorLy8gICAtICdzdGF0ZW1lbnQnIGNhbm5vdCByZWZlcmVuY2UgbG9jYWwgbm9uLXN0YXRpYyB2YXJpYWJsZXMgb3IKKy8vICAgICBub24tc3RhdGljIG1lbWJlcnMgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LgorLy8gICAtICdzdGF0ZW1lbnQnIGNhbm5vdCByZXR1cm4gYSB2YWx1ZS4KKy8vICAgLSBZb3UgY2Fubm90IHN0cmVhbSBhIGZhaWx1cmUgbWVzc2FnZSB0byB0aGlzIG1hY3JvLgorLy8KKy8vIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdHdvCisvLyBtYWNyb3MgYXJlIG11Y2ggYWxpa2UsIHdlIGNhbm5vdCByZWZhY3RvciB0aGVtIHRvIHVzZSBhIGNvbW1vbgorLy8gaGVscGVyIG1hY3JvLCBkdWUgdG8gc29tZSBwZWN1bGlhcml0eSBpbiBob3cgdGhlIHByZXByb2Nlc3NvcgorLy8gd29ya3MuICBUaGUgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEgdGVzdCBpbgorLy8gZ3Rlc3RfdW5pdHRlc3QuY2Mgd2lsbCBmYWlsIHRvIGNvbXBpbGUgaWYgd2UgZG8gdGhhdC4KKyNkZWZpbmUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8geyBcCisgICAgY2xhc3MgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXIge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9O1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXI6OkV4ZWN1dGUoKTtcCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2RlZmluZSBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhzdGF0ZW1lbnQsIHN1YnN0cikgXAorICBkbyB7IFwKKyAgICBjbGFzcyBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlciB7XAorICAgICBwdWJsaWM6XAorICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZSgpIHsgc3RhdGVtZW50OyB9XAorICAgIH07XAorICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCisgICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgKHN1YnN0cikpO1wKKyAgICB7XAorICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCisgICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKKyAgICAgICAgICBJTlRFUkNFUFRfQUxMX1RIUkVBRFMsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXI6OkV4ZWN1dGUoKTtcCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworLy8gQSBtYWNybyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIG9yIGNvZGUgdGhhdCdzIGV4cGVjdGVkIHRvCisvLyBnZW5lcmF0ZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMuICBJdCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuCisvLyBzdGF0ZW1lbnQgd2lsbCBjYXVzZSBleGFjdGx5IG9uZSBub24tZmF0YWwgR29vZ2xlIFRlc3QgZmFpbHVyZSB3aXRoICdzdWJzdHInCisvLyBiZWluZyBwYXJ0IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCisvLworLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhpcyBtYWNyby4gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUgb25seQorLy8gYWZmZWN0cyBhbmQgY29uc2lkZXJzIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgYW5kCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyBkb2VzIHRoZSBzYW1lIGJ1dCBmb3IgYWxsIHRocmVhZHMuCisvLworLy8gJ3N0YXRlbWVudCcgaXMgYWxsb3dlZCB0byByZWZlcmVuY2UgbG9jYWwgdmFyaWFibGVzIGFuZCBtZW1iZXJzIG9mCisvLyB0aGUgY3VycmVudCBvYmplY3QuCisvLworLy8gVGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgYXNzZXJ0aW9uIGlzIGRvbmUgY29ycmVjdGx5IGV2ZW4gd2hlbiB0aGUgc3RhdGVtZW50CisvLyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9yIGFib3J0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KKy8vCisvLyBLbm93biByZXN0cmljdGlvbnM6CisvLyAgIC0gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhpcyBtYWNyby4KKy8vCisvLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHR3bworLy8gbWFjcm9zIGFyZSBtdWNoIGFsaWtlLCB3ZSBjYW5ub3QgcmVmYWN0b3IgdGhlbSB0byB1c2UgYSBjb21tb24KKy8vIGhlbHBlciBtYWNybywgZHVlIHRvIHNvbWUgcGVjdWxpYXJpdHkgaW4gaG93IHRoZSBwcmVwcm9jZXNzb3IKKy8vIHdvcmtzLiAgSWYgd2UgZG8gdGhhdCwgdGhlIGNvZGUgd29uJ3QgY29tcGlsZSB3aGVuIHRoZSB1c2VyIGdpdmVzCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGEgc3RhdGVtZW50IHRoYXQgY29udGFpbnMgYSBtYWNybyB0aGF0CisvLyBleHBhbmRzIHRvIGNvZGUgY29udGFpbmluZyBhbiB1bnByb3RlY3RlZCBjb21tYS4gIFRoZQorLy8gQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEgdGVzdCBpbiBndGVzdF91bml0dGVzdC5jYworLy8gY2F0Y2hlcyB0aGF0LgorLy8KKy8vIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIGhhdmUgdG8gd3JpdGUKKy8vICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH0KKy8vIGluc3RlYWQgb2YKKy8vICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpCisvLyB0byBhdm9pZCBhbiBNU1ZDIHdhcm5pbmcgb24gdW5yZWFjaGFibGUgY29kZS4KKyNkZWZpbmUgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8ge1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIFwKKyAgICAgICAgKHN1YnN0cikpO1wKKyAgICB7XAorICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCisgICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKKyAgICAgICAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgJmd0ZXN0X2ZhaWx1cmVzKTtcCisgICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9XAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisjZGVmaW5lIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCBcCisgICAgICAgIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9BTExfVEhSRUFEUywgXAorICAgICAgICAgICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH1cCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2ViODQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgKQEAgLTAsMCArMSwxNzkgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4KKy8vIGFzc2VydGlvbiBvciBhbiBleHBsaWNpdCBGQUlMKCksIEFERF9GQUlMVVJFKCksIG9yIFNVQ0NFU1MoKSkuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdCB7CisgcHVibGljOgorICAvLyBUaGUgcG9zc2libGUgb3V0Y29tZXMgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4gYXNzZXJ0aW9uIG9yIGFuCisgIC8vIGV4cGxpY2l0IFNVQ0NFRUQoKSwgRkFJTCgpLCBvciBBRERfRkFJTFVSRSgpKS4KKyAgZW51bSBUeXBlIHsKKyAgICBrU3VjY2VzcywgICAgICAgICAgLy8gU3VjY2VlZGVkLgorICAgIGtOb25GYXRhbEZhaWx1cmUsICAvLyBGYWlsZWQgYnV0IHRoZSB0ZXN0IGNhbiBjb250aW51ZS4KKyAgICBrRmF0YWxGYWlsdXJlICAgICAgLy8gRmFpbGVkIGFuZCB0aGUgdGVzdCBzaG91bGQgYmUgdGVybWluYXRlZC4KKyAgfTsKKworICAvLyBDJ3Rvci4gIFRlc3RQYXJ0UmVzdWx0IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAvLyBBbHdheXMgdXNlIHRoaXMgY29uc3RydWN0b3IgKHdpdGggcGFyYW1ldGVycykgdG8gY3JlYXRlIGEKKyAgLy8gVGVzdFBhcnRSZXN1bHQgb2JqZWN0LgorICBUZXN0UGFydFJlc3VsdChUeXBlIGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9maWxlX25hbWUsCisgICAgICAgICAgICAgICAgIGludCBhX2xpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX21lc3NhZ2UpCisgICAgICA6IHR5cGVfKGFfdHlwZSksCisgICAgICAgIGZpbGVfbmFtZV8oYV9maWxlX25hbWUgPT0gTlVMTCA/ICIiIDogYV9maWxlX25hbWUpLAorICAgICAgICBsaW5lX251bWJlcl8oYV9saW5lX251bWJlciksCisgICAgICAgIHN1bW1hcnlfKEV4dHJhY3RTdW1tYXJ5KGFfbWVzc2FnZSkpLAorICAgICAgICBtZXNzYWdlXyhhX21lc3NhZ2UpIHsKKyAgfQorCisgIC8vIEdldHMgdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgcGFydC4KKyAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vIE5VTEwgaWYgaXQncyB1bmtub3duLgorICBjb25zdCBjaGFyKiBmaWxlX25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbGVfbmFtZV8uZW1wdHkoKSA/IE5VTEwgOiBmaWxlX25hbWVfLmNfc3RyKCk7CisgIH0KKworICAvLyBHZXRzIHRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsCisgIC8vIG9yIC0xIGlmIGl0J3MgdW5rbm93bi4KKyAgaW50IGxpbmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbGluZV9udW1iZXJfOyB9CisKKyAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorICBjb25zdCBjaGFyKiBzdW1tYXJ5KCkgY29uc3QgeyByZXR1cm4gc3VtbWFyeV8uY19zdHIoKTsgfQorCisgIC8vIEdldHMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXN0IHBhcnQuCisgIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IHBhc3NlZC4KKyAgYm9vbCBwYXNzZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrU3VjY2VzczsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYWlsZWQuCisgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gIT0ga1N1Y2Nlc3M7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgorICBib29sIG5vbmZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga05vbkZhdGFsRmFpbHVyZTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KKyAgYm9vbCBmYXRhbGx5X2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtGYXRhbEZhaWx1cmU7IH0KKworIHByaXZhdGU6CisgIFR5cGUgdHlwZV87CisKKyAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlIGJ5IG9taXR0aW5nIHRoZSBzdGFjaworICAvLyB0cmFjZSBpbiBpdC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCisgIC8vIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vICIiIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyB1bmtub3duLgorICBzdGQ6OnN0cmluZyBmaWxlX25hbWVfOworICAvLyBUaGUgbGluZSBpbiB0aGUgc291cmNlIGZpbGUgd2hlcmUgdGhlIHRlc3QgcGFydCB0b29rIHBsYWNlLCBvciAtMQorICAvLyBpZiB0aGUgbGluZSBudW1iZXIgaXMgdW5rbm93bi4KKyAgaW50IGxpbmVfbnVtYmVyXzsKKyAgc3RkOjpzdHJpbmcgc3VtbWFyeV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIHN1bW1hcnkuCisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOyAgLy8gVGhlIHRlc3QgZmFpbHVyZSBtZXNzYWdlLgorfTsKKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisvLyBBbiBhcnJheSBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzLgorLy8KKy8vIERvbid0IGluaGVyaXQgZnJvbSBUZXN0UGFydFJlc3VsdEFycmF5IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdAorLy8gdmlydHVhbC4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdFBhcnRSZXN1bHRBcnJheSB7CisgcHVibGljOgorICBUZXN0UGFydFJlc3VsdEFycmF5KCkge30KKworICAvLyBBcHBlbmRzIHRoZSBnaXZlbiBUZXN0UGFydFJlc3VsdCB0byB0aGUgYXJyYXkuCisgIHZvaWQgQXBwZW5kKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgIC8vIFJldHVybnMgdGhlIFRlc3RQYXJ0UmVzdWx0IGF0IHRoZSBnaXZlbiBpbmRleCAoMC1iYXNlZCkuCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzIGluIHRoZSBhcnJheS4KKyAgaW50IHNpemUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiBhcnJheV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0UGFydFJlc3VsdEFycmF5KTsKK307CisKKy8vIFRoaXMgaW50ZXJmYWNlIGtub3dzIGhvdyB0byByZXBvcnQgYSB0ZXN0IHBhcnQgcmVzdWx0LgorY2xhc3MgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKCkge30KKworICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgPSAwOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgdXNlZCBieSB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRSB0byBjaGVjayBpZiBhCisvLyBzdGF0ZW1lbnQgZ2VuZXJhdGVzIG5ldyBmYXRhbCBmYWlsdXJlcy4gVG8gZG8gc28gaXQgcmVnaXN0ZXJzIGl0c2VsZiBhcyB0aGUKKy8vIGN1cnJlbnQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4gQmVzaWRlcyBjaGVja2luZyBpZiBmYXRhbCBmYWlsdXJlcyB3ZXJlCisvLyByZXBvcnRlZCwgaXQgb25seSBkZWxlZ2F0ZXMgdGhlIHJlcG9ydGluZyB0byB0aGUgZm9ybWVyIHJlc3VsdCByZXBvcnRlci4KKy8vIFRoZSBvcmlnaW5hbCByZXN1bHQgcmVwb3J0ZXIgaXMgcmVzdG9yZWQgaW4gdGhlIGRlc3RydWN0b3IuCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitjbGFzcyBHVEVTVF9BUElfIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcgorICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7CisgIHZpcnR1YWwgfkhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpOworICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgIGJvb2wgaGFzX25ld19mYXRhbF9mYWlsdXJlKCkgY29uc3QgeyByZXR1cm4gaGFzX25ld19mYXRhbF9mYWlsdXJlXzsgfQorIHByaXZhdGU6CisgIGJvb2wgaGFzX25ld19mYXRhbF9mYWlsdXJlXzsKKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogb3JpZ2luYWxfcmVwb3J0ZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2OWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaApAQCAtMCwwICsxLDI2MyBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KKworLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyB0eXBlZCB0ZXN0cyBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorCisvLyBUeXBlZCAoYWthIHR5cGUtZHJpdmVuKSB0ZXN0cyByZXBlYXQgdGhlIHNhbWUgdGVzdCBmb3IgdHlwZXMgaW4gYQorLy8gbGlzdC4gIFlvdSBtdXN0IGtub3cgd2hpY2ggdHlwZXMgeW91IHdhbnQgdG8gdGVzdCB3aXRoIHdoZW4gd3JpdGluZworLy8gdHlwZWQgdGVzdHMuIEhlcmUncyBob3cgeW91IGRvIGl0OgorCisjaWYgMAorCisvLyBGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEl0IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkCisvLyBieSBhIHR5cGUuICBSZW1lbWJlciB0byBkZXJpdmUgaXQgZnJvbSB0ZXN0aW5nOjpUZXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgLi4uCisgIHR5cGVkZWYgc3RkOjpsaXN0PFQ+IExpc3Q7CisgIHN0YXRpYyBUIHNoYXJlZF87CisgIFQgdmFsdWVfOworfTsKKworLy8gTmV4dCwgYXNzb2NpYXRlIGEgbGlzdCBvZiB0eXBlcyB3aXRoIHRoZSB0ZXN0IGNhc2UsIHdoaWNoIHdpbGwgYmUKKy8vIHJlcGVhdGVkIGZvciBlYWNoIHR5cGUgaW4gdGhlIGxpc3QuICBUaGUgdHlwZWRlZiBpcyBuZWNlc3NhcnkgZm9yCisvLyB0aGUgbWFjcm8gdG8gcGFyc2UgY29ycmVjdGx5LgordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxjaGFyLCBpbnQsIHVuc2lnbmVkIGludD4gTXlUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShGb29UZXN0LCBNeVR5cGVzKTsKKworLy8gSWYgdGhlIHR5cGUgbGlzdCBjb250YWlucyBvbmx5IG9uZSB0eXBlLCB5b3UgY2FuIHdyaXRlIHRoYXQgdHlwZQorLy8gZGlyZWN0bHkgd2l0aG91dCBUeXBlczwuLi4+OgorLy8gICBUWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgaW50KTsKKworLy8gVGhlbiwgdXNlIFRZUEVEX1RFU1QoKSBpbnN0ZWFkIG9mIFRFU1RfRigpIHRvIGRlZmluZSBhcyBtYW55IHR5cGVkCisvLyB0ZXN0cyBmb3IgdGhpcyB0ZXN0IGNhc2UgYXMgeW91IHdhbnQuCitUWVBFRF9URVNUKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIFR5cGVQYXJhbSB0byBnZXQgdGhlIHR5cGUgcGFyYW1ldGVyLgorICAvLyBTaW5jZSB3ZSBhcmUgaW5zaWRlIGEgZGVyaXZlZCBjbGFzcyB0ZW1wbGF0ZSwgQysrIHJlcXVpcmVzIHVzZSB0bworICAvLyB2aXNpdCB0aGUgbWVtYmVycyBvZiBGb29UZXN0IHZpYSAndGhpcycuCisgIFR5cGVQYXJhbSBuID0gdGhpcy0+dmFsdWVfOworCisgIC8vIFRvIHZpc2l0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlLCBhZGQgdGhlIFRlc3RGaXh0dXJlOjoKKyAgLy8gcHJlZml4LgorICBuICs9IFRlc3RGaXh0dXJlOjpzaGFyZWRfOworCisgIC8vIFRvIHJlZmVyIHRvIHR5cGVkZWZzIGluIHRoZSBmaXh0dXJlLCBhZGQgdGhlICJ0eXBlbmFtZQorICAvLyBUZXN0Rml4dHVyZTo6IiBwcmVmaXguCisgIHR5cGVuYW1lIFRlc3RGaXh0dXJlOjpMaXN0IHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjayhuKTsKKyAgLi4uCit9CisKK1RZUEVEX1RFU1QoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9CisKKyNlbmRpZiAgLy8gMAorCisvLyBUeXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGFic3RyYWN0IHRlc3QgcGF0dGVybnMgcGFyYW1ldGVyaXplZAorLy8gYnkgYSB0eXBlLiAgQ29tcGFyZWQgd2l0aCB0eXBlZCB0ZXN0cywgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyBhbGxvdyB5b3UgdG8gZGVmaW5lIHRoZSB0ZXN0IHBhdHRlcm4gd2l0aG91dCBrbm93aW5nIHdoYXQgdGhlIHR5cGUKKy8vIHBhcmFtZXRlcnMgYXJlLiAgVGhlIGRlZmluZWQgcGF0dGVybiBjYW4gYmUgaW5zdGFudGlhdGVkIHdpdGgKKy8vIGRpZmZlcmVudCB0eXBlcyBhbnkgbnVtYmVyIG9mIHRpbWVzLCBpbiBhbnkgbnVtYmVyIG9mIHRyYW5zbGF0aW9uCisvLyB1bml0cy4KKy8vCisvLyBJZiB5b3UgYXJlIGRlc2lnbmluZyBhbiBpbnRlcmZhY2Ugb3IgY29uY2VwdCwgeW91IGNhbiBkZWZpbmUgYQorLy8gc3VpdGUgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHRvIHZlcmlmeSBwcm9wZXJ0aWVzIHRoYXQgYW55CisvLyB2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlL2NvbmNlcHQgc2hvdWxkIGhhdmUuICBUaGVuLAorLy8gZWFjaCBpbXBsZW1lbnRhdGlvbiBjYW4gZWFzaWx5IGluc3RhbnRpYXRlIHRoZSB0ZXN0IHN1aXRlIHRvIHZlcmlmeQorLy8gdGhhdCBpdCBjb25mb3JtcyB0byB0aGUgcmVxdWlyZW1lbnRzLCB3aXRob3V0IGhhdmluZyB0byB3cml0ZQorLy8gc2ltaWxhciB0ZXN0cyByZXBlYXRlZGx5LiAgSGVyZSdzIGFuIGV4YW1wbGU6CisKKyNpZiAwCisKKy8vIEZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKKy8vIGJ5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIHRlc3Rpbmc6OlRlc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgIC4uLgorfTsKKworLy8gTmV4dCwgZGVjbGFyZSB0aGF0IHlvdSB3aWxsIGRlZmluZSBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UKKy8vICh0aGUgX1Agc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIgb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91CisvLyBwcmVmZXIpOgorVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCk7CisKKy8vIFRoZW4sIHVzZSBUWVBFRF9URVNUX1AoKSB0byBkZWZpbmUgYXMgbWFueSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGZvciB0aGlzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgYXMgeW91IHdhbnQuCitUWVBFRF9URVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuCisgIFR5cGVQYXJhbSBuID0gMDsKKyAgLi4uCit9CisKK1RZUEVEX1RFU1RfUChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KKworLy8gTm93IHRoZSB0cmlja3kgcGFydDogeW91IG5lZWQgdG8gcmVnaXN0ZXIgYWxsIHRlc3QgcGF0dGVybnMgYmVmb3JlCisvLyB5b3UgY2FuIGluc3RhbnRpYXRlIHRoZW0uICBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIG1hY3JvIGlzIHRoZQorLy8gdGVzdCBjYXNlIG5hbWU7IHRoZSByZXN0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIGluIHRoaXMgdGVzdAorLy8gY2FzZS4KK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKEZvb1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2VzQmxhaCwgSGFzUHJvcGVydHlBKTsKKworLy8gRmluYWxseSwgeW91IGFyZSBmcmVlIHRvIGluc3RhbnRpYXRlIHRoZSBwYXR0ZXJuIHdpdGggdGhlIHR5cGVzIHlvdQorLy8gd2FudC4gIElmIHlvdSBwdXQgdGhlIGFib3ZlIGNvZGUgaW4gYSBoZWFkZXIgZmlsZSwgeW91IGNhbiAjaW5jbHVkZQorLy8gaXQgaW4gbXVsdGlwbGUgQysrIHNvdXJjZSBmaWxlcyBhbmQgaW5zdGFudGlhdGUgaXQgbXVsdGlwbGUgdGltZXMuCisvLworLy8gVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgdGhlIGZpcnN0CisvLyBhcmd1bWVudCB0byB0aGUgSU5TVEFOVElBVEVfKiBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQKKy8vIHRvIHRoZSBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuICBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IKKy8vIGRpZmZlcmVudCBpbnN0YW5jZXMuCit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIE15VHlwZXMpOworCisvLyBJZiB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdSBjYW4gd3JpdGUgdGhhdCB0eXBlCisvLyBkaXJlY3RseSB3aXRob3V0IFR5cGVzPC4uLj46CisvLyAgIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBpbnQpOworCisjZW5kaWYgIC8vIDAKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaCIKKworLy8gSW1wbGVtZW50cyB0eXBlZCB0ZXN0cy4KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUKKy8vIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1RZUEVfUEFSQU1TXyhUZXN0Q2FzZU5hbWUpIGd0ZXN0X3R5cGVfcGFyYW1zXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0CisvLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQorLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKKyMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRShDYXNlTmFtZSwgVHlwZXMpIFwKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZSBcCisgICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpCisKKyMgZGVmaW5lIFRZUEVEX1RFU1QoQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCisgICAgICA6IHB1YmxpYyBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiB7IFwKKyAgIHByaXZhdGU6IFwKKyAgICB0eXBlZGVmIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IFRlc3RGaXh0dXJlOyBcCisgICAgdHlwZWRlZiBndGVzdF9UeXBlUGFyYW1fIFR5cGVQYXJhbTsgXAorICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCisgIH07IFwKKyAgYm9vbCBndGVzdF8jI0Nhc2VOYW1lIyNfIyNUZXN0TmFtZSMjX3JlZ2lzdGVyZWRfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0PCBcCisgICAgICAgICAgQ2FzZU5hbWUsIFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZVNlbDwgXAorICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk+LCBcCisgICAgICAgICAgR1RFU1RfVFlQRV9QQVJBTVNfKENhc2VOYW1lKT46OlJlZ2lzdGVyKFwKKyAgICAgICAgICAgICAgIiIsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLCBcCisgICAgICAgICAgICAgICNDYXNlTmFtZSwgI1Rlc3ROYW1lLCAwKTsgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKTxndGVzdF9UeXBlUGFyYW1fPjo6VGVzdEJvZHkoKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIEltcGxlbWVudHMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWVzcGFjZSBuYW1lIHRoYXQgdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBmb3IKKy8vIHRoZSBnaXZlbiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFyZSBkZWZpbmVkIGluLiAgVGhlIGV4YWN0CisvLyBuYW1lIG9mIHRoZSBuYW1lc3BhY2UgaXMgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisjIGRlZmluZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oVGVzdENhc2VOYW1lKSBcCisgIGd0ZXN0X2Nhc2VfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgorLy8gdGhlIGRlZmluZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfdHlwZWRfdGVzdF9jYXNlX3Bfc3RhdGVfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERSBESVJFQ1RMWS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgorLy8gdGhlIHJlZ2lzdGVyZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oVGVzdENhc2VOYW1lKSBcCisgIGd0ZXN0X3JlZ2lzdGVyZWRfdGVzdF9uYW1lc18jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBUaGUgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IG1hY3JvcyBhcmUKKy8vIHN0YXRpYyBhcyB0eXBpY2FsbHkgdGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIGEgLmggZmlsZSB0aGF0IGNhbiBiZQorLy8gI2luY2x1ZGVkIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4KKyMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lKSBcCisgIHN0YXRpYyA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlZFRlc3RDYXNlUFN0YXRlIFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkKKworIyBkZWZpbmUgVFlQRURfVEVTVF9QKENhc2VOYW1lLCBUZXN0TmFtZSkgXAorICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgY2xhc3MgVGVzdE5hbWUgOiBwdWJsaWMgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4geyBcCisgICBwcml2YXRlOiBcCisgICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXAorICAgIHR5cGVkZWYgZ3Rlc3RfVHlwZVBhcmFtXyBUeXBlUGFyYW07IFwKKyAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAorICB9OyBcCisgIHN0YXRpYyBib29sIGd0ZXN0XyMjVGVzdE5hbWUjI19kZWZpbmVkXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuQWRkVGVzdE5hbWUoXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI0Nhc2VOYW1lLCAjVGVzdE5hbWUpOyBcCisgIH0gXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICB2b2lkIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6OlRlc3ROYW1lPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCisKKyMgZGVmaW5lIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lLCAuLi4pIFwKKyAgbmFtZXNwYWNlIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSkgeyBcCisgIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVtcGxhdGVzPF9fVkFfQVJHU19fPjo6dHlwZSBndGVzdF9BbGxUZXN0c187IFwKKyAgfSBcCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKENhc2VOYW1lKSA9IFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcyhcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjX19WQV9BUkdTX18pCisKKy8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0CisvLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQorLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgQ2FzZU5hbWUsIFR5cGVzKSBcCisgIGJvb2wgZ3Rlc3RfIyNQcmVmaXgjI18jI0Nhc2VOYW1lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxDYXNlTmFtZSwgXAorICAgICAgICAgIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6Omd0ZXN0X0FsbFRlc3RzXywgXAorICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlPjo6UmVnaXN0ZXIoXAorICAgICAgICAgICAgICAjUHJlZml4LCBcCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLCBcCisgICAgICAgICAgICAgICZHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpLCBcCisgICAgICAgICAgICAgICNDYXNlTmFtZSwgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhDYXNlTmFtZSkpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1OWM0OQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKQEAgLTAsMCArMSwyMjQwIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIEdvb2dsZSBUZXN0LiAgSXQgc2hvdWxkIGJlCisvLyBpbmNsdWRlZCBieSBhbnkgdGVzdCBwcm9ncmFtIHRoYXQgdXNlcyBHb29nbGUgVGVzdC4KKy8vCisvLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bworLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCisvLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6CisvLworLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisvLworLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKKy8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgorLy8gcHJvZ3JhbSEKKy8vCisvLyBBY2tub3dsZWRnbWVudDogR29vZ2xlIFRlc3QgYm9ycm93ZWQgdGhlIGlkZWEgb2YgYXV0b21hdGljIHRlc3QKKy8vIHJlZ2lzdHJhdGlvbiBmcm9tIEJhcnRoZWxlbXkgRGFnZW5haXMnIChiYXJ0aGVsZW15QHByb2xvZ2lxdWUuY29tKQorLy8gZWFzeVVuaXQgZnJhbWV3b3JrLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3Byb2QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgiCisKKy8vIERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0sIGRpZmZlcmVudCBzdHJpbmcgY2xhc3NlcyBhcmUgYXZhaWxhYmxlLgorLy8gT24gTGludXgsIGluIGFkZGl0aW9uIHRvIDo6c3RkOjpzdHJpbmcsIEdvb2dsZSBhbHNvIG1ha2VzIHVzZSBvZgorLy8gY2xhc3MgOjpzdHJpbmcsIHdoaWNoIGhhcyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgOjpzdGQ6OnN0cmluZywgYnV0CisvLyBoYXMgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCisvLworLy8gWW91IGNhbiBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgdG8gMSB0byBpbmRpY2F0ZSB0aGF0CisvLyA6OnN0cmluZyBpcyBhdmFpbGFibGUgQU5EIGlzIGEgZGlzdGluY3QgdHlwZSB0byA6OnN0ZDo6c3RyaW5nLCBvcgorLy8gZGVmaW5lIGl0IHRvIDAgdG8gaW5kaWNhdGUgb3RoZXJ3aXNlLgorLy8KKy8vIElmIDo6c3RkOjpzdHJpbmcgYW5kIDo6c3RyaW5nIGFyZSB0aGUgc2FtZSBjbGFzcyBvbiB5b3VyIHBsYXRmb3JtCisvLyBkdWUgdG8gYWxpYXNpbmcsIHlvdSBzaG91bGQgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIHRvIDAuCisvLworLy8gSWYgeW91IGRvIG5vdCBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcsIGl0IGlzIGRlZmluZWQKKy8vIGhldXJpc3RpY2FsbHkuCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRGVjbGFyZXMgdGhlIGZsYWdzLgorCisvLyBUaGlzIGZsYWcgdGVtcG9yYXJ5IGVuYWJsZXMgdGhlIGRpc2FibGVkIHRlc3RzLgorR1RFU1RfREVDTEFSRV9ib29sXyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyk7CisKKy8vIFRoaXMgZmxhZyBicmluZ3MgdGhlIGRlYnVnZ2VyIG9uIGFuIGFzc2VydGlvbiBmYWlsdXJlLgorR1RFU1RfREVDTEFSRV9ib29sXyhicmVha19vbl9mYWlsdXJlKTsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgY2F0Y2hlcyBhbGwgdGVzdC10aHJvd24gZXhjZXB0aW9ucworLy8gYW5kIGxvZ3MgdGhlbSBhcyBmYWlsdXJlcy4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oY2F0Y2hfZXhjZXB0aW9ucyk7CisKKy8vIFRoaXMgZmxhZyBlbmFibGVzIHVzaW5nIGNvbG9ycyBpbiB0ZXJtaW5hbCBvdXRwdXQuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlCisvLyAieWVzIiB0byBlbmFibGUgY29sb3JzLCAibm8iIChkaXNhYmxlIGNvbG9ycyksIG9yICJhdXRvIiAodGhlIGRlZmF1bHQpCisvLyB0byBsZXQgR29vZ2xlIFRlc3QgZGVjaWRlLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKGNvbG9yKTsKKworLy8gVGhpcyBmbGFnIHNldHMgdXAgdGhlIGZpbHRlciB0byBzZWxlY3QgYnkgbmFtZSB1c2luZyBhIGdsb2IgcGF0dGVybgorLy8gdGhlIHRlc3RzIHRvIHJ1bi4gSWYgdGhlIGZpbHRlciBpcyBub3QgZ2l2ZW4gYWxsIHRlc3RzIGFyZSBleGVjdXRlZC4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOworCisvLyBUaGlzIGZsYWcgY2F1c2VzIHRoZSBHb29nbGUgVGVzdCB0byBsaXN0IHRlc3RzLiBOb25lIG9mIHRoZSB0ZXN0cyBsaXN0ZWQKKy8vIGFyZSBhY3R1YWxseSBydW4gaWYgdGhlIGZsYWcgaXMgcHJvdmlkZWQuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGxpc3RfdGVzdHMpOworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBlbWl0cyBhIGRldGFpbGVkIFhNTCByZXBvcnQgdG8gYSBmaWxlCisvLyBpbiBhZGRpdGlvbiB0byBpdHMgbm9ybWFsIHRleHR1YWwgb3V0cHV0LgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKG91dHB1dCk7CisKKy8vIFRoaXMgZmxhZ3MgY29udHJvbCB3aGV0aGVyIEdvb2dsZSBUZXN0IHByaW50cyB0aGUgZWxhcHNlZCB0aW1lIGZvciBlYWNoCisvLyB0ZXN0LgorR1RFU1RfREVDTEFSRV9ib29sXyhwcmludF90aW1lKTsKKworLy8gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgcmFuZG9tIG51bWJlciBzZWVkLgorR1RFU1RfREVDTEFSRV9pbnQzMl8ocmFuZG9tX3NlZWQpOworCisvLyBUaGlzIGZsYWcgc2V0cyBob3cgbWFueSB0aW1lcyB0aGUgdGVzdHMgYXJlIHJlcGVhdGVkLiBUaGUgZGVmYXVsdCB2YWx1ZQorLy8gaXMgMS4gSWYgdGhlIHZhbHVlIGlzIC0xIHRoZSB0ZXN0cyBhcmUgcmVwZWF0aW5nIGZvcmV2ZXIuCitHVEVTVF9ERUNMQVJFX2ludDMyXyhyZXBlYXQpOworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBpbmNsdWRlcyBHb29nbGUgVGVzdCBpbnRlcm5hbAorLy8gc3RhY2sgZnJhbWVzIGluIGZhaWx1cmUgc3RhY2sgdHJhY2VzLgorR1RFU1RfREVDTEFSRV9ib29sXyhzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcyk7CisKKy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGVzdHMnIG9yZGVyIGlzIHJhbmRvbWl6ZWQgb24gZXZlcnkgaXRlcmF0aW9uLgorR1RFU1RfREVDTEFSRV9ib29sXyhzaHVmZmxlKTsKKworLy8gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlCisvLyBwcmludGVkIGluIGEgZmFpbHVyZSBtZXNzYWdlLgorR1RFU1RfREVDTEFSRV9pbnQzMl8oc3RhY2tfdHJhY2VfZGVwdGgpOworCisvLyBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIGEgZmFpbGVkIGFzc2VydGlvbiB3aWxsIHRocm93IGFuCisvLyBleGNlcHRpb24gaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgb3IgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIGEKKy8vIG5vbi16ZXJvIGNvZGUgb3RoZXJ3aXNlLgorR1RFU1RfREVDTEFSRV9ib29sXyh0aHJvd19vbl9mYWlsdXJlKTsKKworLy8gV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHdpdGggYSAiaG9zdDpwb3J0IiBzdHJpbmcsIG9uIHN1cHBvcnRlZAorLy8gcGxhdGZvcm1zIHRlc3QgcmVzdWx0cyBhcmUgc3RyZWFtZWQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IG9uCisvLyB0aGUgc3BlY2lmaWVkIGhvc3QgbWFjaGluZS4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhzdHJlYW1fcmVzdWx0X3RvKTsKKworLy8gVGhlIHVwcGVyIGxpbWl0IGZvciB2YWxpZCBzdGFjayB0cmFjZSBkZXB0aHMuCitjb25zdCBpbnQga01heFN0YWNrVHJhY2VEZXB0aCA9IDEwMDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgQXNzZXJ0SGVscGVyOworY2xhc3MgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7CitjbGFzcyBFeGVjRGVhdGhUZXN0OworY2xhc3MgTm9FeGVjRGVhdGhUZXN0OworY2xhc3MgRmluYWxTdWNjZXNzQ2hlY2tlcjsKK2NsYXNzIEdUZXN0RmxhZ1NhdmVyOworY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXJUZXN0OworY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yOworY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I7CitjbGFzcyBUZXN0RXZlbnRSZXBlYXRlcjsKK2NsYXNzIFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0SGVscGVyOworY2xhc3MgV2luZG93c0RlYXRoVGVzdDsKK2NsYXNzIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCk7Cit2b2lkIFJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBmcmllbmQgcmVsYXRpb25zaGlwIG9mIHNvbWUgb2YgdGhlc2UgY2xhc3NlcyBpcyBjeWNsaWMuCisvLyBJZiB3ZSBkb24ndCBmb3J3YXJkIGRlY2xhcmUgdGhlbSB0aGUgY29tcGlsZXIgbWlnaHQgY29uZnVzZSB0aGUgY2xhc3NlcworLy8gaW4gZnJpZW5kc2hpcCBjbGF1c2VzIHdpdGggc2FtZSBuYW1lZCBjbGFzc2VzIG9uIHRoZSBzY29wZS4KK2NsYXNzIFRlc3Q7CitjbGFzcyBUZXN0Q2FzZTsKK2NsYXNzIFRlc3RJbmZvOworY2xhc3MgVW5pdFRlc3Q7CisKKy8vIEEgY2xhc3MgZm9yIGluZGljYXRpbmcgd2hldGhlciBhbiBhc3NlcnRpb24gd2FzIHN1Y2Nlc3NmdWwuICBXaGVuCisvLyB0aGUgYXNzZXJ0aW9uIHdhc24ndCBzdWNjZXNzZnVsLCB0aGUgQXNzZXJ0aW9uUmVzdWx0IG9iamVjdAorLy8gcmVtZW1iZXJzIGEgbm9uLWVtcHR5IG1lc3NhZ2UgdGhhdCBkZXNjcmliZXMgaG93IGl0IGZhaWxlZC4KKy8vCisvLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgdXNlIG9uZSBvZiB0aGUgZmFjdG9yeSBmdW5jdGlvbnMKKy8vIChBc3NlcnRpb25TdWNjZXNzKCkgYW5kIEFzc2VydGlvbkZhaWx1cmUoKSkuCisvLworLy8gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIHR3byBwdXJwb3NlczoKKy8vICAgMS4gRGVmaW5pbmcgcHJlZGljYXRlIGZ1bmN0aW9ucyB0byBiZSB1c2VkIHdpdGggQm9vbGVhbiB0ZXN0IGFzc2VydGlvbnMKKy8vICAgICAgRVhQRUNUX1RSVUUvRVhQRUNUX0ZBTFNFIGFuZCB0aGVpciBBU1NFUlRfIGNvdW50ZXJwYXJ0cworLy8gICAyLiBEZWZpbmluZyBwcmVkaWNhdGUtZm9ybWF0IGZ1bmN0aW9ucyB0byBiZQorLy8gICAgICB1c2VkIHdpdGggcHJlZGljYXRlIGFzc2VydGlvbnMgKEFTU0VSVF9QUkVEX0ZPUk1BVCosIGV0YykuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUgSXNFdmVuIHByZWRpY2F0ZToKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKy8vICAgICBlbHNlCisvLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOworLy8gICB9CisvLworLy8gVGhlbiB0aGUgZmFpbGVkIGV4cGVjdGF0aW9uIEVYUEVDVF9UUlVFKElzRXZlbihGaWIoNSkpKQorLy8gd2lsbCBwcmludCB0aGUgbWVzc2FnZQorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpCisvLyAgICAgQWN0dWFsOiBmYWxzZSAoNSBpcyBvZGQpCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW5zdGVhZCBvZiBhIG1vcmUgb3BhcXVlCisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig1KSkKKy8vICAgICBBY3R1YWw6IGZhbHNlCisvLyAgIEV4cGVjdGVkOiB0cnVlCisvLworLy8gaW4gY2FzZSBJc0V2ZW4gaXMgYSBzaW1wbGUgQm9vbGVhbiBwcmVkaWNhdGUuCisvLworLy8gSWYgeW91IGV4cGVjdCB5b3VyIHByZWRpY2F0ZSB0byBiZSByZXVzZWQgYW5kIHdhbnQgdG8gc3VwcG9ydCBpbmZvcm1hdGl2ZQorLy8gbWVzc2FnZXMgaW4gRVhQRUNUX0ZBTFNFIGFuZCBBU1NFUlRfRkFMU0UgKG5lZ2F0aXZlIGFzc2VydGlvbnMgc2hvdyB1cAorLy8gYWJvdXQgaGFsZiBhcyBvZnRlbiBhcyBwb3NpdGl2ZSBvbmVzIGluIG91ciB0ZXN0cyksIHN1cHBseSBtZXNzYWdlcyBmb3IKKy8vIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBjYXNlczoKKy8vCisvLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oaW50IG4pIHsKKy8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKSA8PCBuIDw8ICIgaXMgZXZlbiI7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKKy8vICAgfQorLy8KKy8vIFRoZW4gYSBzdGF0ZW1lbnQgRVhQRUNUX0ZBTFNFKElzRXZlbihGaWIoNikpKSB3aWxsIHByaW50CisvLworLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig2KSkKKy8vICAgICBBY3R1YWw6IHRydWUgKDggaXMgZXZlbikKKy8vICAgRXhwZWN0ZWQ6IGZhbHNlCisvLworLy8gTkI6IFByZWRpY2F0ZXMgdGhhdCBzdXBwb3J0IG5lZ2F0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucyBoYXZlIHJlZHVjZWQKKy8vIHBlcmZvcm1hbmNlIGluIHBvc2l0aXZlIG9uZXMgc28gYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRoZW0gaW4gdGVzdHMKKy8vIHRoYXQgaGF2ZSBsb3RzICh0ZW5zIG9mIHRob3VzYW5kcykgb2YgcG9zaXRpdmUgQm9vbGVhbiBhc3NlcnRpb25zLgorLy8KKy8vIFRvIHVzZSB0aGlzIGNsYXNzIHdpdGggRVhQRUNUX1BSRURfRk9STUFUIGFzc2VydGlvbnMgc3VjaCBhczoKKy8vCisvLyAgIC8vIFZlcmlmaWVzIHRoYXQgRm9vKCkgcmV0dXJucyBhbiBldmVuIG51bWJlci4KKy8vICAgRVhQRUNUX1BSRURfRk9STUFUMShJc0V2ZW4sIEZvbygpKTsKKy8vCisvLyB5b3UgbmVlZCB0byBkZWZpbmU6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGNvbnN0IGNoYXIqIGV4cHIsIGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorLy8gICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiIGlzIGV2ZW5cbiAgQWN0dWFsOiBpdCdzICIgPDwgbjsKKy8vICAgfQorLy8KKy8vIElmIEZvbygpIHJldHVybnMgNSwgeW91IHdpbGwgc2VlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKKy8vCisvLyAgIEV4cGVjdGVkOiBGb28oKSBpcyBldmVuCisvLyAgICAgQWN0dWFsOiBpdCdzIDUKKy8vCitjbGFzcyBHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCB7CisgcHVibGljOgorICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICAvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorICBBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcik7CisKKyAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDgwMCAvKiBmb3JjaW5nIHZhbHVlIHRvIGJvb2wgKi8pCisKKyAgLy8gVXNlZCBpbiB0aGUgRVhQRUNUX1RSVUUvRkFMU0UoYm9vbF9leHByZXNzaW9uKS4KKyAgLy8KKyAgLy8gVCBtdXN0IGJlIGNvbnRleHR1YWxseSBjb252ZXJ0aWJsZSB0byBib29sLgorICAvLworICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBwcmV2ZW50cyB0aGlzIG92ZXJsb2FkIGZyb20gYmVpbmcgY29uc2lkZXJlZCBpZgorICAvLyB0aGUgYXJndW1lbnQgaXMgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBBc3NlcnRpb25SZXN1bHQuIEluIHRoYXQgY2FzZQorICAvLyB3ZSB3YW50IEFzc2VydGlvblJlc3VsdCdzIGNvcHkgY29uc3RydWN0b3IgdG8gYmUgdXNlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGV4cGxpY2l0IEFzc2VydGlvblJlc3VsdCgKKyAgICAgIGNvbnN0IFQmIHN1Y2Nlc3MsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RW5hYmxlSWY8CisgICAgICAgICAgIWludGVybmFsOjpJbXBsaWNpdGx5Q29udmVydGlibGU8VCwgQXNzZXJ0aW9uUmVzdWx0Pjo6dmFsdWU+Ojp0eXBlKgorICAgICAgICAgIC8qZW5hYmxlciovID0gTlVMTCkKKyAgICAgIDogc3VjY2Vzc18oc3VjY2Vzcykge30KKworICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKKworICAvLyBBc3NpZ25tZW50IG9wZXJhdG9yLgorICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yPShBc3NlcnRpb25SZXN1bHQgb3RoZXIpIHsKKyAgICBzd2FwKG90aGVyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gc3VjY2VlZGVkLgorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc187IH0gIC8vIE5PTElOVAorCisgIC8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4KKyAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yISgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHRleHQgc3RyZWFtZWQgaW50byB0aGlzIEFzc2VydGlvblJlc3VsdC4gVGVzdCBhc3NlcnRpb25zCisgIC8vIHVzZSBpdCB3aGVuIHRoZXkgZmFpbCAoaS5lLiwgdGhlIHByZWRpY2F0ZSdzIG91dGNvbWUgZG9lc24ndCBtYXRjaCB0aGUKKyAgLy8gYXNzZXJ0aW9uJ3MgZXhwZWN0YXRpb24pLiBXaGVuIG5vdGhpbmcgaGFzIGJlZW4gc3RyZWFtZWQgaW50byB0aGUKKyAgLy8gb2JqZWN0LCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCA/ICBtZXNzYWdlXy0+Y19zdHIoKSA6ICIiOworICB9CisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlbW92ZSB0aGlzIGFmdGVyIG1ha2luZyBzdXJlIG5vIGNsaWVudHMgdXNlIGl0LgorICAvLyBEZXByZWNhdGVkOyBwbGVhc2UgdXNlIG1lc3NhZ2UoKSBpbnN0ZWFkLgorICBjb25zdCBjaGFyKiBmYWlsdXJlX21lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlKCk7IH0KKworICAvLyBTdHJlYW1zIGEgY3VzdG9tIGZhaWx1cmUgbWVzc2FnZSBpbnRvIHRoaXMgb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KGNvbnN0IFQmIHZhbHVlKSB7CisgICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgdmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEFsbG93cyBzdHJlYW1pbmcgYmFzaWMgb3V0cHV0IG1hbmlwdWxhdG9ycyBzdWNoIGFzIGVuZGwgb3IgZmx1c2ggaW50bworICAvLyB0aGlzIG9iamVjdC4KKyAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KAorICAgICAgOjpzdGQ6Om9zdHJlYW0mICgqYmFzaWNfbWFuaXB1bGF0b3IpKDo6c3RkOjpvc3RyZWFtJiBzdHJlYW0pKSB7CisgICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgYmFzaWNfbWFuaXB1bGF0b3IpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQXBwZW5kcyB0aGUgY29udGVudHMgb2YgbWVzc2FnZSB0byBtZXNzYWdlXy4KKyAgdm9pZCBBcHBlbmRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIGFfbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlXy5nZXQoKSA9PSBOVUxMKQorICAgICAgbWVzc2FnZV8ucmVzZXQobmV3IDo6c3RkOjpzdHJpbmcpOworICAgIG1lc3NhZ2VfLT5hcHBlbmQoYV9tZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOworICB9CisKKyAgLy8gU3dhcCB0aGUgY29udGVudHMgb2YgdGhpcyBBc3NlcnRpb25SZXN1bHQgd2l0aCBvdGhlci4KKyAgdm9pZCBzd2FwKEFzc2VydGlvblJlc3VsdCYgb3RoZXIpOworCisgIC8vIFN0b3JlcyByZXN1bHQgb2YgdGhlIGFzc2VydGlvbiBwcmVkaWNhdGUuCisgIGJvb2wgc3VjY2Vzc187CisgIC8vIFN0b3JlcyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24gaW4gY2FzZSB0aGUgZXhwZWN0YXRpb24KKyAgLy8gY29uc3RydWN0IGlzIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgcHJlZGljYXRlJ3Mgb3V0Y29tZS4KKyAgLy8gUmVmZXJlbmNlZCB2aWEgYSBwb2ludGVyIHRvIGF2b2lkIHRha2luZyB0b28gbXVjaCBzdGFjayBmcmFtZSBzcGFjZQorICAvLyB3aXRoIHRlc3QgYXNzZXJ0aW9ucy4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6c3RkOjpzdHJpbmc+IG1lc3NhZ2VfOworfTsKKworLy8gTWFrZXMgYSBzdWNjZXNzZnVsIGFzc2VydGlvbiByZXN1bHQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCk7CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCk7CisKKy8vIE1ha2VzIGEgZmFpbGVkIGFzc2VydGlvbiByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZmFpbHVyZSBtZXNzYWdlLgorLy8gRGVwcmVjYXRlZDsgdXNlIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2cuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKGNvbnN0IE1lc3NhZ2UmIG1zZyk7CisKKy8vIFRoZSBhYnN0cmFjdCBjbGFzcyB0aGF0IGFsbCB0ZXN0cyBpbmhlcml0IGZyb20uCisvLworLy8gSW4gR29vZ2xlIFRlc3QsIGEgdW5pdCB0ZXN0IHByb2dyYW0gY29udGFpbnMgb25lIG9yIG1hbnkgVGVzdENhc2VzLCBhbmQKKy8vIGVhY2ggVGVzdENhc2UgY29udGFpbnMgb25lIG9yIG1hbnkgVGVzdHMuCisvLworLy8gV2hlbiB5b3UgZGVmaW5lIGEgdGVzdCB1c2luZyB0aGUgVEVTVCBtYWNybywgeW91IGRvbid0IG5lZWQgdG8KKy8vIGV4cGxpY2l0bHkgZGVyaXZlIGZyb20gVGVzdCAtIHRoZSBURVNUIG1hY3JvIGF1dG9tYXRpY2FsbHkgZG9lcworLy8gdGhpcyBmb3IgeW91LgorLy8KKy8vIFRoZSBvbmx5IHRpbWUgeW91IGRlcml2ZSBmcm9tIFRlc3QgaXMgd2hlbiBkZWZpbmluZyBhIHRlc3QgZml4dHVyZQorLy8gdG8gYmUgdXNlZCBhIFRFU1RfRi4gIEZvciBleGFtcGxlOgorLy8KKy8vICAgY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgIHByb3RlY3RlZDoKKy8vICAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyAuLi4gfQorLy8gICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IC4uLiB9CisvLyAgICAgLi4uCisvLyAgIH07CisvLworLy8gICBURVNUX0YoRm9vVGVzdCwgQmFyKSB7IC4uLiB9CisvLyAgIFRFU1RfRihGb29UZXN0LCBCYXopIHsgLi4uIH0KKy8vCisvLyBUZXN0IGlzIG5vdCBjb3B5YWJsZS4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdCB7CisgcHVibGljOgorICBmcmllbmQgY2xhc3MgVGVzdEluZm87CisKKyAgLy8gRGVmaW5lcyB0eXBlcyBmb3IgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRoYXQgc2V0IHVwIGFuZCB0ZWFyIGRvd24KKyAgLy8gYSB0ZXN0IGNhc2UuCisgIHR5cGVkZWYgaW50ZXJuYWw6OlNldFVwVGVzdENhc2VGdW5jIFNldFVwVGVzdENhc2VGdW5jOworICB0eXBlZGVmIGludGVybmFsOjpUZWFyRG93blRlc3RDYXNlRnVuYyBUZWFyRG93blRlc3RDYXNlRnVuYzsKKworICAvLyBUaGUgZCd0b3IgaXMgdmlydHVhbCBhcyB3ZSBpbnRlbmQgdG8gaW5oZXJpdCBmcm9tIFRlc3QuCisgIHZpcnR1YWwgflRlc3QoKTsKKworICAvLyBTZXRzIHVwIHRoZSBzdHVmZiBzaGFyZWQgYnkgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICAvLworICAvLyBHb29nbGUgVGVzdCB3aWxsIGNhbGwgRm9vOjpTZXRVcFRlc3RDYXNlKCkgYmVmb3JlIHJ1bm5pbmcgdGhlIGZpcnN0CisgIC8vIHRlc3QgaW4gdGVzdCBjYXNlIEZvby4gIEhlbmNlIGEgc3ViLWNsYXNzIGNhbiBkZWZpbmUgaXRzIG93bgorICAvLyBTZXRVcFRlc3RDYXNlKCkgbWV0aG9kIHRvIHNoYWRvdyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIHN1cGVyCisgIC8vIGNsYXNzLgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkge30KKworICAvLyBUZWFycyBkb3duIHRoZSBzdHVmZiBzaGFyZWQgYnkgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICAvLworICAvLyBHb29nbGUgVGVzdCB3aWxsIGNhbGwgRm9vOjpUZWFyRG93blRlc3RDYXNlKCkgYWZ0ZXIgcnVubmluZyB0aGUgbGFzdAorICAvLyB0ZXN0IGluIHRlc3QgY2FzZSBGb28uICBIZW5jZSBhIHN1Yi1jbGFzcyBjYW4gZGVmaW5lIGl0cyBvd24KKyAgLy8gVGVhckRvd25UZXN0Q2FzZSgpIG1ldGhvZCB0byBzaGFkb3cgdGhlIG9uZSBkZWZpbmVkIGluIHRoZSBzdXBlcgorICAvLyBjbGFzcy4KKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIGZhdGFsIGZhaWx1cmUuCisgIHN0YXRpYyBib29sIEhhc0ZhdGFsRmFpbHVyZSgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KKyAgc3RhdGljIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIChlaXRoZXIgZmF0YWwgb3IKKyAgLy8gbm9uLWZhdGFsKSBmYWlsdXJlLgorICBzdGF0aWMgYm9vbCBIYXNGYWlsdXJlKCkgeyByZXR1cm4gSGFzRmF0YWxGYWlsdXJlKCkgfHwgSGFzTm9uZmF0YWxGYWlsdXJlKCk7IH0KKworICAvLyBMb2dzIGEgcHJvcGVydHkgZm9yIHRoZSBjdXJyZW50IHRlc3QsIHRlc3QgY2FzZSwgb3IgZm9yIHRoZSBlbnRpcmUKKyAgLy8gaW52b2NhdGlvbiBvZiB0aGUgdGVzdCBwcm9ncmFtIHdoZW4gdXNlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIGEKKyAgLy8gdGVzdCBjYXNlLiAgT25seSB0aGUgbGFzdCB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgaXMgcmVtZW1iZXJlZC4gIFRoZXNlCisgIC8vIGFyZSBwdWJsaWMgc3RhdGljIHNvIHRoZXkgY2FuIGJlIGNhbGxlZCBmcm9tIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlCisgIC8vIG5vdCBtZW1iZXJzIG9mIHRoZSB0ZXN0IGZpeHR1cmUuICBDYWxscyB0byBSZWNvcmRQcm9wZXJ0eSBtYWRlIGR1cmluZworICAvLyBsaWZlc3BhbiBvZiB0aGUgdGVzdCAoZnJvbSB0aGUgbW9tZW50IGl0cyBjb25zdHJ1Y3RvciBzdGFydHMgdG8gdGhlCisgIC8vIG1vbWVudCBpdHMgZGVzdHJ1Y3RvciBmaW5pc2hlcykgd2lsbCBiZSBvdXRwdXQgaW4gWE1MIGFzIGF0dHJpYnV0ZXMgb2YKKyAgLy8gdGhlIDx0ZXN0Y2FzZT4gZWxlbWVudC4gIFByb3BlcnRpZXMgcmVjb3JkZWQgZnJvbSBmaXh0dXJlJ3MKKyAgLy8gU2V0VXBUZXN0Q2FzZSBvciBUZWFyRG93blRlc3RDYXNlIGFyZSBsb2dnZWQgYXMgYXR0cmlidXRlcyBvZiB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyA8dGVzdHN1aXRlPiBlbGVtZW50LiAgQ2FsbHMgdG8gUmVjb3JkUHJvcGVydHkgbWFkZSBpbiB0aGUKKyAgLy8gZ2xvYmFsIGNvbnRleHQgKGJlZm9yZSBvciBhZnRlciBpbnZvY2F0aW9uIG9mIFJVTl9BTExfVEVTVFMgYW5kIGZyb20KKyAgLy8gU2V0VXAvVGVhckRvd24gbWV0aG9kIG9mIEVudmlyb25tZW50IG9iamVjdHMgcmVnaXN0ZXJlZCB3aXRoIEdvb2dsZQorICAvLyBUZXN0KSB3aWxsIGJlIG91dHB1dCBhcyBhdHRyaWJ1dGVzIG9mIHRoZSA8dGVzdHN1aXRlcz4gZWxlbWVudC4KKyAgc3RhdGljIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RhdGljIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKTsKKworIHByb3RlY3RlZDoKKyAgLy8gQ3JlYXRlcyBhIFRlc3Qgb2JqZWN0LgorICBUZXN0KCk7CisKKyAgLy8gU2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKKworICAvLyBUZWFycyBkb3duIHRoZSB0ZXN0IGZpeHR1cmUuCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOworCisgcHJpdmF0ZToKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyB0aGUgc2FtZSBmaXh0dXJlIGNsYXNzIGFzCisgIC8vIHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjdXJyZW50IHRlc3QgY2FzZS4KKyAgc3RhdGljIGJvb2wgSGFzU2FtZUZpeHR1cmVDbGFzcygpOworCisgIC8vIFJ1bnMgdGhlIHRlc3QgYWZ0ZXIgdGhlIHRlc3QgZml4dHVyZSBoYXMgYmVlbiBzZXQgdXAuCisgIC8vCisgIC8vIEEgc3ViLWNsYXNzIG11c3QgaW1wbGVtZW50IHRoaXMgdG8gZGVmaW5lIHRoZSB0ZXN0IGxvZ2ljLgorICAvLworICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBGVU5DVElPTiBESVJFQ1RMWSBJTiBBIFVTRVIgUFJPR1JBTS4KKyAgLy8gSW5zdGVhZCwgdXNlIHRoZSBURVNUIG9yIFRFU1RfRiBtYWNyby4KKyAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCkgPSAwOworCisgIC8vIFNldHMgdXAsIGV4ZWN1dGVzLCBhbmQgdGVhcnMgZG93biB0aGUgdGVzdC4KKyAgdm9pZCBSdW4oKTsKKworICAvLyBEZWxldGVzIHNlbGYuICBXZSBkZWxpYmVyYXRlbHkgcGljayBhbiB1bnVzdWFsIG5hbWUgZm9yIHRoaXMKKyAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIGF2b2lkIGNsYXNoaW5nIHdpdGggbmFtZXMgdXNlZCBpbiB1c2VyIFRFU1RzLgorICB2b2lkIERlbGV0ZVNlbGZfKCkgeyBkZWxldGUgdGhpczsgfQorCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPCBHVEVTVF9GTEFHX1NBVkVSXyA+IGd0ZXN0X2ZsYWdfc2F2ZXJfOworCisgIC8vIE9mdGVuIGEgdXNlciBtaXNzcGVsbHMgU2V0VXAoKSBhcyBTZXR1cCgpIGFuZCBzcGVuZHMgYSBsb25nIHRpbWUKKyAgLy8gd29uZGVyaW5nIHdoeSBpdCBpcyBuZXZlciBjYWxsZWQgYnkgR29vZ2xlIFRlc3QuICBUaGUgZGVjbGFyYXRpb24gb2YKKyAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgc29sZWx5IGZvciBjYXRjaGluZyBzdWNoIGFuIGVycm9yIGF0CisgIC8vIGNvbXBpbGUgdGltZToKKyAgLy8KKyAgLy8gICAtIFRoZSByZXR1cm4gdHlwZSBpcyBkZWxpYmVyYXRlbHkgY2hvc2VuIHRvIGJlIG5vdCB2b2lkLCBzbyBpdAorICAvLyAgIHdpbGwgYmUgYSBjb25mbGljdCBpZiB2b2lkIFNldHVwKCkgaXMgZGVjbGFyZWQgaW4gdGhlIHVzZXIncworICAvLyAgIHRlc3QgZml4dHVyZS4KKyAgLy8KKyAgLy8gICAtIFRoaXMgbWV0aG9kIGlzIHByaXZhdGUsIHNvIGl0IHdpbGwgYmUgYW5vdGhlciBjb21waWxlciBlcnJvcgorICAvLyAgIGlmIHRoZSBtZXRob2QgaXMgY2FsbGVkIGZyb20gdGhlIHVzZXIncyB0ZXN0IGZpeHR1cmUuCisgIC8vCisgIC8vIERPIE5PVCBPVkVSUklERSBUSElTIEZVTkNUSU9OLgorICAvLworICAvLyBJZiB5b3Ugc2VlIGFuIGVycm9yIGFib3V0IG92ZXJyaWRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBvcgorICAvLyBhYm91dCBpdCBiZWluZyBwcml2YXRlLCB5b3UgaGF2ZSBtaXMtc3BlbGxlZCBTZXRVcCgpIGFzIFNldHVwKCkuCisgIHN0cnVjdCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCB7fTsKKyAgdmlydHVhbCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCogU2V0dXAoKSB7IHJldHVybiBOVUxMOyB9CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0cy4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0KTsKK307CisKK3R5cGVkZWYgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBUaW1lSW5NaWxsaXM7CisKKy8vIEEgY29weWFibGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHVzZXIgc3BlY2lmaWVkIHRlc3QgcHJvcGVydHkgd2hpY2ggY2FuIGJlCisvLyBvdXRwdXQgYXMgYSBrZXkvdmFsdWUgc3RyaW5nIHBhaXIuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQcm9wZXJ0eSBhcyBpdHMgZGVzdHJ1Y3RvciBpcyBub3QgdmlydHVhbC4KK2NsYXNzIFRlc3RQcm9wZXJ0eSB7CisgcHVibGljOgorICAvLyBDJ3Rvci4gIFRlc3RQcm9wZXJ0eSBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgLy8gQWx3YXlzIHVzZSB0aGlzIGNvbnN0cnVjdG9yICh3aXRoIHBhcmFtZXRlcnMpIHRvIGNyZWF0ZSBhCisgIC8vIFRlc3RQcm9wZXJ0eSBvYmplY3QuCisgIFRlc3RQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgYV9rZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX3ZhbHVlKSA6CisgICAga2V5XyhhX2tleSksIHZhbHVlXyhhX3ZhbHVlKSB7CisgIH0KKworICAvLyBHZXRzIHRoZSB1c2VyIHN1cHBsaWVkIGtleS4KKyAgY29uc3QgY2hhcioga2V5KCkgY29uc3QgeworICAgIHJldHVybiBrZXlfLmNfc3RyKCk7CisgIH0KKworICAvLyBHZXRzIHRoZSB1c2VyIHN1cHBsaWVkIHZhbHVlLgorICBjb25zdCBjaGFyKiB2YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfLmNfc3RyKCk7CisgIH0KKworICAvLyBTZXRzIGEgbmV3IHZhbHVlLCBvdmVycmlkaW5nIHRoZSBvbmUgc3VwcGxpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICB2b2lkIFNldFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdfdmFsdWUpIHsKKyAgICB2YWx1ZV8gPSBuZXdfdmFsdWU7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFRoZSBrZXkgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCisgIHN0ZDo6c3RyaW5nIGtleV87CisgIC8vIFRoZSB2YWx1ZSBzdXBwbGllZCBieSB0aGUgdXNlci4KKyAgc3RkOjpzdHJpbmcgdmFsdWVfOworfTsKKworLy8gVGhlIHJlc3VsdCBvZiBhIHNpbmdsZSBUZXN0LiAgVGhpcyBpbmNsdWRlcyBhIGxpc3Qgb2YKKy8vIFRlc3RQYXJ0UmVzdWx0cywgYSBsaXN0IG9mIFRlc3RQcm9wZXJ0aWVzLCBhIGNvdW50IG9mIGhvdyBtYW55CisvLyBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUgaW4gdGhlIFRlc3QsIGFuZCBob3cgbXVjaCB0aW1lIGl0IHRvb2sgdG8gcnVuCisvLyB0aGUgVGVzdC4KKy8vCisvLyBUZXN0UmVzdWx0IGlzIG5vdCBjb3B5YWJsZS4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdFJlc3VsdCB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCisgIFRlc3RSZXN1bHQoKTsKKworICAvLyBEJ3Rvci4gIERvIG5vdCBpbmhlcml0IGZyb20gVGVzdFJlc3VsdC4KKyAgflRlc3RSZXN1bHQoKTsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcgorICAvLyBvZiBzdWNjZXNzZnVsIHRlc3QgcGFydHMgYW5kIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgcGFydHMuCisgIGludCB0b3RhbF9wYXJ0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB0ZXN0IHByb3BlcnRpZXMuCisgIGludCB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXNzZWQgKGkuZS4gbm8gdGVzdCBwYXJ0IGZhaWxlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYWlsZWQuCisgIGJvb2wgRmFpbGVkKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYXRhbGx5IGZhaWxlZC4KKyAgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwYXJ0IHJlc3VsdCBhbW9uZyBhbGwgdGhlIHJlc3VsdHMuIGkgY2FuIHJhbmdlCisgIC8vIGZyb20gMCB0byB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMKKyAgLy8gdGhlIHByb2dyYW0uCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBHZXRUZXN0UGFydFJlc3VsdChpbnQgaSkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzIHRoZQorICAvLyBwcm9ncmFtLgorICBjb25zdCBUZXN0UHJvcGVydHkmIEdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdEluZm87CisgIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKKyAgZnJpZW5kIGNsYXNzIFVuaXRUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkV4ZWNEZWF0aFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdFJlc3VsdEFjY2Vzc29yOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpXaW5kb3dzRGVhdGhUZXN0OworCisgIC8vIEdldHMgdGhlIHZlY3RvciBvZiBUZXN0UGFydFJlc3VsdHMuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiYgdGVzdF9wYXJ0X3Jlc3VsdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfcGFydF9yZXN1bHRzXzsKKyAgfQorCisgIC8vIEdldHMgdGhlIHZlY3RvciBvZiBUZXN0UHJvcGVydGllcy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiYgdGVzdF9wcm9wZXJ0aWVzKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3Byb3BlcnRpZXNfOworICB9CisKKyAgLy8gU2V0cyB0aGUgZWxhcHNlZCB0aW1lLgorICB2b2lkIHNldF9lbGFwc2VkX3RpbWUoVGltZUluTWlsbGlzIGVsYXBzZWQpIHsgZWxhcHNlZF90aW1lXyA9IGVsYXBzZWQ7IH0KKworICAvLyBBZGRzIGEgdGVzdCBwcm9wZXJ0eSB0byB0aGUgbGlzdC4gVGhlIHByb3BlcnR5IGlzIHZhbGlkYXRlZCBhbmQgbWF5IGFkZAorICAvLyBhIG5vbi1mYXRhbCBmYWlsdXJlIGlmIGludmFsaWQgKGUuZy4sIGlmIGl0IGNvbmZsaWN0cyB3aXRoIHJlc2VydmVkCisgIC8vIGtleSBuYW1lcykuIElmIGEgcHJvcGVydHkgaXMgYWxyZWFkeSByZWNvcmRlZCBmb3IgdGhlIHNhbWUga2V5LCB0aGUKKyAgLy8gdmFsdWUgd2lsbCBiZSB1cGRhdGVkLCByYXRoZXIgdGhhbiBzdG9yaW5nIG11bHRpcGxlIHZhbHVlcyBmb3IgdGhlIHNhbWUKKyAgLy8ga2V5LiAgeG1sX2VsZW1lbnQgc3BlY2lmaWVzIHRoZSBlbGVtZW50IGZvciB3aGljaCB0aGUgcHJvcGVydHkgaXMgYmVpbmcKKyAgLy8gcmVjb3JkZWQgYW5kIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24uCisgIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSk7CisKKyAgLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiBHb29nbGUgVGVzdAorICAvLyB0ZXN0Y2FzZSB0YWdzLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4KKyAgLy8gVE9ETyhydXNzcik6IFZhbGlkYXRlIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbGVnYWwgYW5kIGh1bWFuIHJlYWRhYmxlLgorICBzdGF0aWMgYm9vbCBWYWxpZGF0ZVRlc3RQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSk7CisKKyAgLy8gQWRkcyBhIHRlc3QgcGFydCByZXN1bHQgdG8gdGhlIGxpc3QuCisgIHZvaWQgQWRkVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpOworCisgIC8vIFJldHVybnMgdGhlIGRlYXRoIHRlc3QgY291bnQuCisgIGludCBkZWF0aF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gZGVhdGhfdGVzdF9jb3VudF87IH0KKworICAvLyBJbmNyZW1lbnRzIHRoZSBkZWF0aCB0ZXN0IGNvdW50LCByZXR1cm5pbmcgdGhlIG5ldyBjb3VudC4KKyAgaW50IGluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCkgeyByZXR1cm4gKytkZWF0aF90ZXN0X2NvdW50XzsgfQorCisgIC8vIENsZWFycyB0aGUgdGVzdCBwYXJ0IHJlc3VsdHMuCisgIHZvaWQgQ2xlYXJUZXN0UGFydFJlc3VsdHMoKTsKKworICAvLyBDbGVhcnMgdGhlIG9iamVjdC4KKyAgdm9pZCBDbGVhcigpOworCisgIC8vIFByb3RlY3RzIG11dGFibGUgc3RhdGUgb2YgdGhlIHByb3BlcnR5IHZlY3RvciBhbmQgb2Ygb3duZWQKKyAgLy8gcHJvcGVydGllcywgd2hvc2UgdmFsdWVzIG1heSBiZSB1cGRhdGVkLgorICBpbnRlcm5hbDo6TXV0ZXggdGVzdF9wcm9wZXJpdGVzX211dGV4XzsKKworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RQYXJ0UmVzdWx0cworICBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4gdGVzdF9wYXJ0X3Jlc3VsdHNfOworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RQcm9wZXJ0aWVzCisgIHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4gdGVzdF9wcm9wZXJ0aWVzXzsKKyAgLy8gUnVubmluZyBjb3VudCBvZiBkZWF0aCB0ZXN0cy4KKyAgaW50IGRlYXRoX3Rlc3RfY291bnRfOworICAvLyBUaGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOworCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdFJlc3VsdC4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0UmVzdWx0KTsKK307ICAvLyBjbGFzcyBUZXN0UmVzdWx0CisKKy8vIEEgVGVzdEluZm8gb2JqZWN0IHN0b3JlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgdGVzdDoKKy8vCisvLyAgIFRlc3QgY2FzZSBuYW1lCisvLyAgIFRlc3QgbmFtZQorLy8gICBXaGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4KKy8vICAgQSBmdW5jdGlvbiBwb2ludGVyIHRoYXQgY3JlYXRlcyB0aGUgdGVzdCBvYmplY3Qgd2hlbiBpbnZva2VkCisvLyAgIFRlc3QgcmVzdWx0CisvLworLy8gVGhlIGNvbnN0cnVjdG9yIG9mIFRlc3RJbmZvIHJlZ2lzdGVycyBpdHNlbGYgd2l0aCB0aGUgVW5pdFRlc3QKKy8vIHNpbmdsZXRvbiBzdWNoIHRoYXQgdGhlIFJVTl9BTExfVEVTVFMoKSBtYWNybyBrbm93cyB3aGljaCB0ZXN0cyB0bworLy8gcnVuLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0SW5mbyB7CisgcHVibGljOgorICAvLyBEZXN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB2aXJ0dWFsLCBzbworICAvLyBkb24ndCBpbmhlcml0IGZyb20gVGVzdEluZm8uCisgIH5UZXN0SW5mbygpOworCisgIC8vIFJldHVybnMgdGhlIHRlc3QgY2FzZSBuYW1lLgorICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfY2FzZV9uYW1lXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBuYW1lLgorICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZWQKKyAgLy8gb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgY2hhciogdHlwZV9wYXJhbSgpIGNvbnN0IHsKKyAgICBpZiAodHlwZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB0eXBlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIHBhcmFtZXRlciwgb3IgTlVMTCBpZiB0aGlzCisgIC8vIGlzIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0oKSBjb25zdCB7CisgICAgaWYgKHZhbHVlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQorICAgICAgcmV0dXJuIHZhbHVlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGZpbGUgbmFtZSB3aGVyZSB0aGlzIHRlc3QgaXMgZGVmaW5lZC4KKyAgY29uc3QgY2hhciogZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGxvY2F0aW9uXy5maWxlLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSBsaW5lIHdoZXJlIHRoaXMgdGVzdCBpcyBkZWZpbmVkLgorICBpbnQgbGluZSgpIGNvbnN0IHsgcmV0dXJuIGxvY2F0aW9uXy5saW5lOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdGVzdCBzaG91bGQgcnVuLCB0aGF0IGlzIGlmIHRoZSB0ZXN0IGlzIG5vdAorICAvLyBkaXNhYmxlZCAob3IgaXQgaXMgZGlzYWJsZWQgYnV0IHRoZSBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIGhhcworICAvLyBiZWVuIHNwZWNpZmllZCkgYW5kIGl0cyBmdWxsIG5hbWUgbWF0Y2hlcyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorICAvLworICAvLyBHb29nbGUgVGVzdCBhbGxvd3MgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSB0ZXN0cyBieSB0aGVpciBmdWxsIG5hbWVzLgorICAvLyBUaGUgZnVsbCBuYW1lIG9mIGEgdGVzdCBCYXIgaW4gdGVzdCBjYXNlIEZvbyBpcyBkZWZpbmVkIGFzCisgIC8vICJGb28uQmFyIi4gIE9ubHkgdGhlIHRlc3RzIHRoYXQgbWF0Y2ggdGhlIGZpbHRlciB3aWxsIHJ1bi4KKyAgLy8KKyAgLy8gQSBmaWx0ZXIgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBnbG9iIChub3QgcmVnZXgpIHBhdHRlcm5zLAorICAvLyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgJy0nIGFuZCBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mCisgIC8vIG5lZ2F0aXZlIHBhdHRlcm5zICh0ZXN0cyB0byBleGNsdWRlKS4gIEEgdGVzdCBpcyBydW4gaWYgaXQKKyAgLy8gbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YKKyAgLy8gdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgKkEqOkZvby4qIGlzIGEgZmlsdGVyIHRoYXQgbWF0Y2hlcyBhbnkgc3RyaW5nIHRoYXQKKyAgLy8gY29udGFpbnMgdGhlIGNoYXJhY3RlciAnQScgb3Igc3RhcnRzIHdpdGggIkZvby4iLgorICBib29sIHNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBzaG91bGRfcnVuXzsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyB0ZXN0IHdpbGwgYXBwZWFyIGluIHRoZSBYTUwgcmVwb3J0LgorICBib29sIGlzX3JlcG9ydGFibGUoKSBjb25zdCB7CisgICAgLy8gRm9yIG5vdywgdGhlIFhNTCByZXBvcnQgaW5jbHVkZXMgYWxsIHRlc3RzIG1hdGNoaW5nIHRoZSBmaWx0ZXIuCisgICAgLy8gSW4gdGhlIGZ1dHVyZSwgd2UgbWF5IHRyaW0gdGVzdHMgdGhhdCBhcmUgZXhjbHVkZWQgYmVjYXVzZSBvZgorICAgIC8vIHNoYXJkaW5nLgorICAgIHJldHVybiBtYXRjaGVzX2ZpbHRlcl87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuCisgIGNvbnN0IFRlc3RSZXN1bHQqIHJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICZyZXN1bHRfOyB9CisKKyBwcml2YXRlOgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RGVmYXVsdERlYXRoVGVzdEZhY3Rvcnk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisgIGZyaWVuZCBjbGFzcyBUZXN0OworICBmcmllbmQgY2xhc3MgVGVzdENhc2U7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlN0cmVhbWluZ0xpc3RlbmVyVGVzdDsKKyAgZnJpZW5kIFRlc3RJbmZvKiBpbnRlcm5hbDo6TWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sCisgICAgICBpbnRlcm5hbDo6Q29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24sCisgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKKworICAvLyBDb25zdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiBUaGUgbmV3bHkgY29uc3RydWN0ZWQgaW5zdGFuY2UgYXNzdW1lcworICAvLyBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0LgorICBUZXN0SW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sICAgLy8gTlVMTCBpZiBub3QgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdAorICAgICAgICAgICBjb25zdCBjaGFyKiBhX3ZhbHVlX3BhcmFtLCAgLy8gTlVMTCBpZiBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QKKyAgICAgICAgICAgaW50ZXJuYWw6OkNvZGVMb2NhdGlvbiBhX2NvZGVfbG9jYXRpb24sCisgICAgICAgICAgIGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKKyAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7CisKKyAgLy8gSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIGRlYXRoIHRlc3RzIGVuY291bnRlcmVkIGluIHRoaXMgdGVzdCBzbworICAvLyBmYXIuCisgIGludCBpbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpIHsKKyAgICByZXR1cm4gcmVzdWx0Xy5pbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpOworICB9CisKKyAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QsIHJ1bnMgaXQsIHJlY29yZHMgaXRzIHJlc3VsdCwgYW5kIHRoZW4KKyAgLy8gZGVsZXRlcyBpdC4KKyAgdm9pZCBSdW4oKTsKKworICBzdGF0aWMgdm9pZCBDbGVhclRlc3RSZXN1bHQoVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHRlc3RfaW5mby0+cmVzdWx0Xy5DbGVhcigpOworICB9CisKKyAgLy8gVGhlc2UgZmllbGRzIGFyZSBpbW11dGFibGUgcHJvcGVydGllcyBvZiB0aGUgdGVzdC4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgdGVzdF9jYXNlX25hbWVfOyAgICAgLy8gVGVzdCBjYXNlIG5hbWUKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV87ICAgICAgICAgICAgICAgLy8gVGVzdCBuYW1lCisgIC8vIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYQorICAvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8Y29uc3QgOjpzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbV87CisgIC8vIFRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIHBhcmFtZXRlciwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhCisgIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8Y29uc3QgOjpzdGQ6OnN0cmluZz4gdmFsdWVfcGFyYW1fOworICBpbnRlcm5hbDo6Q29kZUxvY2F0aW9uIGxvY2F0aW9uXzsKKyAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkXzsgICAvLyBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCisgIGJvb2wgc2hvdWxkX3J1bl87ICAgICAgICAgICAgICAgICAvLyBUcnVlIGlmZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1bgorICBib29sIGlzX2Rpc2FibGVkXzsgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZmYgdGhpcyB0ZXN0IGlzIGRpc2FibGVkCisgIGJvb2wgbWF0Y2hlc19maWx0ZXJfOyAgICAgICAgICAgICAvLyBUcnVlIGlmIHRoaXMgdGVzdCBtYXRjaGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlci1zcGVjaWZpZWQgZmlsdGVyLgorICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBjb25zdCBmYWN0b3J5XzsgIC8vIFRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXN0IG9iamVjdAorCisgIC8vIFRoaXMgZmllbGQgaXMgbXV0YWJsZSBhbmQgbmVlZHMgdG8gYmUgcmVzZXQgYmVmb3JlIHJ1bm5pbmcgdGhlCisgIC8vIHRlc3QgZm9yIHRoZSBzZWNvbmQgdGltZS4KKyAgVGVzdFJlc3VsdCByZXN1bHRfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEluZm8pOworfTsKKworLy8gQSB0ZXN0IGNhc2UsIHdoaWNoIGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RJbmZvcy4KKy8vCisvLyBUZXN0Q2FzZSBpcyBub3QgY29weWFibGUuCitjbGFzcyBHVEVTVF9BUElfIFRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAvLworICAvLyBUZXN0Q2FzZSBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIEFsd2F5cyB1c2UgdGhpcworICAvLyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBUZXN0Q2FzZSBvYmplY3QuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICBuYW1lOiAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorICAvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorICAvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKyAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICBUZXN0Q2FzZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKTsKKworICAvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorICB2aXJ0dWFsIH5UZXN0Q2FzZSgpOworCisgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRlc3RDYXNlLgorICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKyAgY29uc3QgY2hhciogdHlwZV9wYXJhbSgpIGNvbnN0IHsKKyAgICBpZiAodHlwZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB0eXBlX3BhcmFtXy0+Y19zdHIoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBzaG91bGRfcnVuXzsgfQorCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgaW50IHJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgaW50IHJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgcGFzc2VkLgorICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCisgIGJvb2wgRmFpbGVkKCkgY29uc3QgeyByZXR1cm4gZmFpbGVkX3Rlc3RfY291bnQoKSA+IDA7IH0KKworICAvLyBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdEluZm8qIEdldFRlc3RJbmZvKGludCBpKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IHRoYXQgaG9sZHMgdGVzdCBwcm9wZXJ0aWVzIHJlY29yZGVkIGR1cmluZworICAvLyBleGVjdXRpb24gb2YgU2V0VXBUZXN0Q2FzZSBhbmQgVGVhckRvd25UZXN0Q2FzZS4KKyAgY29uc3QgVGVzdFJlc3VsdCYgYWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gYWRfaG9jX3Rlc3RfcmVzdWx0XzsgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworCisgIC8vIEdldHMgdGhlIChtdXRhYmxlKSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoaXMgVGVzdENhc2UuCisgIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4mIHRlc3RfaW5mb19saXN0KCkgeyByZXR1cm4gdGVzdF9pbmZvX2xpc3RfOyB9CisKKyAgLy8gR2V0cyB0aGUgKGltbXV0YWJsZSkgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGlzIFRlc3RDYXNlLgorICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+JiB0ZXN0X2luZm9fbGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9pbmZvX2xpc3RfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIFRlc3RJbmZvKiBHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpOworCisgIC8vIFNldHMgdGhlIHNob3VsZF9ydW4gbWVtYmVyLgorICB2b2lkIHNldF9zaG91bGRfcnVuKGJvb2wgc2hvdWxkKSB7IHNob3VsZF9ydW5fID0gc2hvdWxkOyB9CisKKyAgLy8gQWRkcyBhIFRlc3RJbmZvIHRvIHRoaXMgdGVzdCBjYXNlLiAgV2lsbCBkZWxldGUgdGhlIFRlc3RJbmZvIHVwb24KKyAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIFRlc3RDYXNlIG9iamVjdC4KKyAgdm9pZCBBZGRUZXN0SW5mbyhUZXN0SW5mbyAqIHRlc3RfaW5mbyk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgdm9pZCBDbGVhclJlc3VsdCgpOworCisgIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0Q2FzZVJlc3VsdChUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgICAgdGVzdF9jYXNlLT5DbGVhclJlc3VsdCgpOworICB9CisKKyAgLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuCisgIHZvaWQgUnVuKCk7CisKKyAgLy8gUnVucyBTZXRVcFRlc3RDYXNlKCkgZm9yIHRoaXMgVGVzdENhc2UuICBUaGlzIHdyYXBwZXIgaXMgbmVlZGVkCisgIC8vIGZvciBjYXRjaGluZyBleGNlcHRpb25zIHRocm93biBmcm9tIFNldFVwVGVzdENhc2UoKS4KKyAgdm9pZCBSdW5TZXRVcFRlc3RDYXNlKCkgeyAoKnNldF91cF90Y18pKCk7IH0KKworICAvLyBSdW5zIFRlYXJEb3duVGVzdENhc2UoKSBmb3IgdGhpcyBUZXN0Q2FzZS4gIFRoaXMgd3JhcHBlciBpcworICAvLyBuZWVkZWQgZm9yIGNhdGNoaW5nIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gVGVhckRvd25UZXN0Q2FzZSgpLgorICB2b2lkIFJ1blRlYXJEb3duVGVzdENhc2UoKSB7ICgqdGVhcl9kb3duX3RjXykoKTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGVzdCBwYXNzZWQuCisgIHN0YXRpYyBib29sIFRlc3RQYXNzZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2luZm8tPnJlc3VsdCgpLT5QYXNzZWQoKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGVzdCBmYWlsZWQuCisgIHN0YXRpYyBib29sIFRlc3RGYWlsZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2luZm8tPnJlc3VsdCgpLT5GYWlsZWQoKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgaXMgZGlzYWJsZWQgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTAorICAvLyByZXBvcnQuCisgIHN0YXRpYyBib29sIFRlc3RSZXBvcnRhYmxlRGlzYWJsZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX3JlcG9ydGFibGUoKSAmJiB0ZXN0X2luZm8tPmlzX2Rpc2FibGVkXzsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGVzdCBpcyBkaXNhYmxlZC4KKyAgc3RhdGljIGJvb2wgVGVzdERpc2FibGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5pc19kaXNhYmxlZF87CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgdGVzdCB3aWxsIGFwcGVhciBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgc3RhdGljIGJvb2wgVGVzdFJlcG9ydGFibGUoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX3JlcG9ydGFibGUoKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGVzdCBzaG91bGQgcnVuLgorICBzdGF0aWMgYm9vbCBTaG91bGRSdW5UZXN0KGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCk7CisgIH0KKworICAvLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIHZvaWQgU2h1ZmZsZVRlc3RzKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSk7CisKKyAgLy8gUmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgdG8gYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgorICB2b2lkIFVuc2h1ZmZsZVRlc3RzKCk7CisKKyAgLy8gTmFtZSBvZiB0aGUgdGVzdCBjYXNlLgorICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgLy8gTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhCisgIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB0eXBlX3BhcmFtXzsKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuICBJdCBvd25zIHRoZQorICAvLyBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+IHRlc3RfaW5mb19saXN0XzsKKyAgLy8gUHJvdmlkZXMgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBmb3IgdGhlIHRlc3QgbGlzdCB0byBhbGxvdyBlYXN5CisgIC8vIHNodWZmbGluZyBhbmQgcmVzdG9yaW5nIHRoZSB0ZXN0IG9yZGVyLiAgVGhlIGktdGggZWxlbWVudCBpbiB0aGlzCisgIC8vIHZlY3RvciBpcyB0aGUgaW5kZXggb2YgdGhlIGktdGggdGVzdCBpbiB0aGUgc2h1ZmZsZWQgdGVzdCBsaXN0LgorICBzdGQ6OnZlY3RvcjxpbnQ+IHRlc3RfaW5kaWNlc187CisgIC8vIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlLgorICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGNfOworICAvLyBQb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZS4KKyAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjXzsKKyAgLy8gVHJ1ZSBpZmYgYW55IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2Ugc2hvdWxkIHJ1bi4KKyAgYm9vbCBzaG91bGRfcnVuXzsKKyAgLy8gRWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOworICAvLyBIb2xkcyB0ZXN0IHByb3BlcnRpZXMgcmVjb3JkZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBTZXRVcFRlc3RDYXNlIGFuZAorICAvLyBUZWFyRG93blRlc3RDYXNlLgorICBUZXN0UmVzdWx0IGFkX2hvY190ZXN0X3Jlc3VsdF87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0Q2FzZXMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdENhc2UpOworfTsKKworLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGlzIGNhcGFibGUgb2Ygc2V0dGluZyB1cCBhbmQgdGVhcmluZyBkb3duIGFuCisvLyBlbnZpcm9ubWVudC4gIFlvdSBzaG91bGQgc3ViY2xhc3MgdGhpcyB0byBkZWZpbmUgeW91ciBvd24KKy8vIGVudmlyb25tZW50KHMpLgorLy8KKy8vIEFuIEVudmlyb25tZW50IG9iamVjdCBkb2VzIHRoZSBzZXQtdXAgYW5kIHRlYXItZG93biBpbiB2aXJ0dWFsCisvLyBtZXRob2RzIFNldFVwKCkgYW5kIFRlYXJEb3duKCkgaW5zdGVhZCBvZiB0aGUgY29uc3RydWN0b3IgYW5kIHRoZQorLy8gZGVzdHJ1Y3RvciwgYXM6CisvLworLy8gICAxLiBZb3UgY2Fubm90IHNhZmVseSB0aHJvdyBmcm9tIGEgZGVzdHJ1Y3Rvci4gIFRoaXMgaXMgYSBwcm9ibGVtCisvLyAgICAgIGFzIGluIHNvbWUgY2FzZXMgR29vZ2xlIFRlc3QgaXMgdXNlZCB3aGVyZSBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBhbmQKKy8vICAgICAgd2UgbWF5IHdhbnQgdG8gaW1wbGVtZW50IEFTU0VSVF8qIHVzaW5nIGV4Y2VwdGlvbnMgd2hlcmUgdGhleSBhcmUKKy8vICAgICAgYXZhaWxhYmxlLgorLy8gICAyLiBZb3UgY2Fubm90IHVzZSBBU1NFUlRfKiBkaXJlY3RseSBpbiBhIGNvbnN0cnVjdG9yIG9yCisvLyAgICAgIGRlc3RydWN0b3IuCitjbGFzcyBFbnZpcm9ubWVudCB7CisgcHVibGljOgorICAvLyBUaGUgZCd0b3IgaXMgdmlydHVhbCBhcyB3ZSBuZWVkIHRvIHN1YmNsYXNzIEVudmlyb25tZW50LgorICB2aXJ0dWFsIH5FbnZpcm9ubWVudCgpIHt9CisKKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9CisKKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHRlYXIgZG93biB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHt9CisgcHJpdmF0ZToKKyAgLy8gSWYgeW91IHNlZSBhbiBlcnJvciBhYm91dCBvdmVycmlkaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gb3IKKyAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLgorICBzdHJ1Y3QgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAge307CisgIHZpcnR1YWwgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAqIFNldHVwKCkgeyByZXR1cm4gTlVMTDsgfQorfTsKKworLy8gVGhlIGludGVyZmFjZSBmb3IgdHJhY2luZyBleGVjdXRpb24gb2YgdGVzdHMuIFRoZSBtZXRob2RzIGFyZSBvcmdhbml6ZWQgaW4KKy8vIHRoZSBvcmRlciB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgYXJlIGZpcmVkLgorY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdEV2ZW50TGlzdGVuZXIoKSB7fQorCisgIC8vIEZpcmVkIGJlZm9yZSBhbnkgdGVzdCBhY3Rpdml0eSBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuICBUaGVyZSBtYXkgYmUgbW9yZSB0aGFuCisgIC8vIG9uZSBpdGVyYXRpb24gaWYgR1RFU1RfRkxBRyhyZXBlYXQpIGlzIHNldC4gaXRlcmF0aW9uIGlzIHRoZSBpdGVyYXRpb24KKyAgLy8gaW5kZXgsIHN0YXJ0aW5nIGZyb20gMC4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIGVudmlyb25tZW50IHNldC11cCBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlbnZpcm9ubWVudCBzZXQtdXAgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSB0aGUgdGVzdCBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgYSBmYWlsZWQgYXNzZXJ0aW9uIG9yIGEgU1VDQ0VFRCgpIGludm9jYXRpb24uCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgdGhlIHRlc3QgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgdGhlIHRlc3QgY2FzZSBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIGVudmlyb25tZW50IHRlYXItZG93biBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlbnZpcm9ubWVudCB0ZWFyLWRvd24gZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBmaW5pc2hlcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pID0gMDsKKworICAvLyBGaXJlZCBhZnRlciBhbGwgdGVzdCBhY3Rpdml0aWVzIGhhdmUgZW5kZWQuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKK307CisKKy8vIFRoZSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgdXNlcnMgd2hvIG5lZWQgdG8gb3ZlcnJpZGUganVzdCBvbmUgb3IgdHdvCisvLyBtZXRob2RzIGFuZCBhcmUgbm90IGNvbmNlcm5lZCB0aGF0IGEgcG9zc2libGUgY2hhbmdlIHRvIGEgc2lnbmF0dXJlIG9mCisvLyB0aGUgbWV0aG9kcyB0aGV5IG92ZXJyaWRlIHdpbGwgbm90IGJlIGNhdWdodCBkdXJpbmcgdGhlIGJ1aWxkLiAgRm9yCisvLyBjb21tZW50cyBhYm91dCBlYWNoIG1ldGhvZCBwbGVhc2Ugc2VlIHRoZSBkZWZpbml0aW9uIG9mIFRlc3RFdmVudExpc3RlbmVyCisvLyBhYm92ZS4KK2NsYXNzIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiAvKnRlc3RfcGFydF9yZXN1bHQqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIC8qdGVzdF9jYXNlKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KK307CisKKy8vIFRlc3RFdmVudExpc3RlbmVycyBsZXRzIHVzZXJzIGFkZCBsaXN0ZW5lcnMgdG8gdHJhY2sgZXZlbnRzIGluIEdvb2dsZSBUZXN0LgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0RXZlbnRMaXN0ZW5lcnMgeworIHB1YmxpYzoKKyAgVGVzdEV2ZW50TGlzdGVuZXJzKCk7CisgIH5UZXN0RXZlbnRMaXN0ZW5lcnMoKTsKKworICAvLyBBcHBlbmRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIEdvb2dsZSBUZXN0IGFzc3VtZXMKKyAgLy8gdGhlIG93bmVyc2hpcCBvZiB0aGUgbGlzdGVuZXIgKGkuZS4gaXQgd2lsbCBkZWxldGUgdGhlIGxpc3RlbmVyIHdoZW4KKyAgLy8gdGhlIHRlc3QgcHJvZ3JhbSBmaW5pc2hlcykuCisgIHZvaWQgQXBwZW5kKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIEl0IHRoZW4KKyAgLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucworICAvLyBOVUxMIGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3QuCisgIFRlc3RFdmVudExpc3RlbmVyKiBSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IGNvbnNvbGUKKyAgLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQKKyAgLy8gY29uc29sZSBvdXRwdXQuICBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdAorICAvLyB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlciBhbmQgbWFrZXMgdGhpcworICAvLyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dCB0aW1lLgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgWE1MIG91dHB1dAorICAvLyBjb250cm9sbGVkIGJ5IHRoZSAtLWd0ZXN0X291dHB1dD14bWwgZmxhZy4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlCisgIC8vIGxpc3RlbmVycyBsaXN0IGJ5IHVzZXJzIHdobyB3YW50IHRvIHNodXQgZG93biB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0CisgIC8vIGNvbnRyb2xsZWQgYnkgdGhpcyBmbGFnIGFuZCBzdWJzdGl0dXRlIGl0IHdpdGggY3VzdG9tIG9uZS4gIE5vdGUgdGhhdAorICAvLyByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0IHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzCisgIC8vIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyIGFuZCBtYWtlcyB0aGlzIGZ1bmN0aW9uIHJldHVybiBOVUxMIHRoZSBuZXh0CisgIC8vIHRpbWUuCisgIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl87CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKKyAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6Ok5vRXhlY0RlYXRoVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisKKyAgLy8gUmV0dXJucyByZXBlYXRlciB0aGF0IGJyb2FkY2FzdHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGV2ZW50cyB0byBhbGwKKyAgLy8gc3Vic2NyaWJlcnMuCisgIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlcigpOworCisgIC8vIFNldHMgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KKyAgLy8gVGhlIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisgIC8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisgIC8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisgIC8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KKyAgdm9pZCBTZXREZWZhdWx0UmVzdWx0UHJpbnRlcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFNldHMgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLiAgVGhlCisgIC8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisgIC8vIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KKyAgLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKKyAgLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgorICB2b2lkIFNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCBieSB0aGUgcmVwZWF0ZXIgdG8gdGhlCisgIC8vIGxpc3RlbmVycyBpbiB0aGUgbGlzdC4KKyAgYm9vbCBFdmVudEZvcndhcmRpbmdFbmFibGVkKCkgY29uc3Q7CisgIHZvaWQgU3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKworICAvLyBUaGUgYWN0dWFsIGxpc3Qgb2YgbGlzdGVuZXJzLgorICBpbnRlcm5hbDo6VGVzdEV2ZW50UmVwZWF0ZXIqIHJlcGVhdGVyXzsKKyAgLy8gTGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBzdGFuZGFyZCByZXN1bHQgb3V0cHV0LgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl87CisgIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFhNTCBvdXRwdXQgZmlsZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0RXZlbnRMaXN0ZW5lcnMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50TGlzdGVuZXJzKTsKK307CisKKy8vIEEgVW5pdFRlc3QgY29uc2lzdHMgb2YgYSB2ZWN0b3Igb2YgVGVzdENhc2VzLgorLy8KKy8vIFRoaXMgaXMgYSBzaW5nbGV0b24gY2xhc3MuICBUaGUgb25seSBpbnN0YW5jZSBvZiBVbml0VGVzdCBpcworLy8gY3JlYXRlZCB3aGVuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpIGlzIGZpcnN0IGNhbGxlZC4gIFRoaXMKKy8vIGluc3RhbmNlIGlzIG5ldmVyIGRlbGV0ZWQuCisvLworLy8gVW5pdFRlc3QgaXMgbm90IGNvcHlhYmxlLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgdGhyZWFkLXNhZmUgYXMgbG9uZyBhcyB0aGUgbWV0aG9kcyBhcmUgY2FsbGVkCisvLyBhY2NvcmRpbmcgdG8gdGhlaXIgc3BlY2lmaWNhdGlvbi4KK2NsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3QgeworIHB1YmxpYzoKKyAgLy8gR2V0cyB0aGUgc2luZ2xldG9uIFVuaXRUZXN0IG9iamVjdC4gIFRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kCisgIC8vIGlzIGNhbGxlZCwgYSBVbml0VGVzdCBvYmplY3QgaXMgY29uc3RydWN0ZWQgYW5kIHJldHVybmVkLgorICAvLyBDb25zZWN1dGl2ZSBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QuCisgIHN0YXRpYyBVbml0VGVzdCogR2V0SW5zdGFuY2UoKTsKKworICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCisgIC8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAvLworICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisgIGludCBSdW4oKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOworCisgIC8vIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKQorICAvLyB3YXMgZXhlY3V0ZWQuICBUaGUgVW5pdFRlc3Qgb2JqZWN0IG93bnMgdGhlIHN0cmluZy4KKyAgY29uc3QgY2hhciogb3JpZ2luYWxfd29ya2luZ19kaXIoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKyAgLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIGNvbnN0IFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0CisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworCisgIC8vIFJldHVybnMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAorICAvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKyAgY29uc3QgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7CisKKyAgLy8gUmV0dXJucyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBydW4uCisgIGludCByYW5kb21fc2VlZCgpIGNvbnN0OworCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gUmV0dXJucyB0aGUgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KKyAgLy8KKyAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpCisgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KKyAgaW50IGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCisgIGludCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0CisgIC8vIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCisgIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCisgIGludCByZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCisgIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCisgIGludCByZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgorICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgIC8vIFVOSVggZXBvY2guCisgIFRpbWVJbk1pbGxpcyBzdGFydF90aW1lc3RhbXAoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAorICAvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KKyAgYm9vbCBGYWlsZWQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gdGVzdCBmYWlsdXJlcyBhbmQKKyAgLy8gcHJvcGVydGllcyBsb2dnZWQgb3V0c2lkZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMuCisgIGNvbnN0IFRlc3RSZXN1bHQmIGFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzCisgIC8vIGluc2lkZSBHb29nbGUgVGVzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMoKTsKKworIHByaXZhdGU6CisgIC8vIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LiAgV2hlbiBhIHRlc3QKKyAgLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4KKyAgLy8gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLiAgQWZ0ZXIgYWxsIHRlc3RzIGluIHRoZSBwcm9ncmFtCisgIC8vIGhhdmUgZmluaXNoZWQsIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSB0b3JuLWRvd24gaW4KKyAgLy8gdGhlICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KKyAgLy8KKyAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50LgorICAvLworICAvLyBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCisgIEVudmlyb25tZW50KiBBZGRFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KTsKKworICAvLyBBZGRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuICBBbGwKKyAgLy8gR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIG1hY3JvcyAoZS5nLiBBU1NFUlRfVFJVRSwgRVhQRUNUX0VRLCBldGMpCisgIC8vIGV2ZW50dWFsbHkgY2FsbCB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZQorICAvLyBzaG91bGQgdXNlIHRoZSBhc3NlcnRpb24gbWFjcm9zIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5LgorICB2b2lkIEFkZFRlc3RQYXJ0UmVzdWx0KFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX3N0YWNrX3RyYWNlKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBmcm9tCisgIC8vIGluc2lkZSBhIHRlc3QsIHRvIGN1cnJlbnQgVGVzdENhc2UncyBhZF9ob2NfdGVzdF9yZXN1bHRfIHdoZW4gaW52b2tlZAorICAvLyBmcm9tIFNldFVwVGVzdENhc2Ugb3IgVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQKKyAgLy8gd2hlbiBpbnZva2VkIGVsc2V3aGVyZS4gIElmIHRoZSByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGgKKyAgLy8gdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgorICB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpOworCisgIC8vIEFjY2Vzc29ycyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9CisgIGNvbnN0IGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXzsgfQorCisgIC8vIFRoZXNlIGNsYXNzZXMgYW5kIGZ1bmNpb25zIGFyZSBmcmllbmRzIGFzIHRoZXkgbmVlZCB0byBhY2Nlc3MgcHJpdmF0ZQorICAvLyBtZW1iZXJzIG9mIFVuaXRUZXN0LgorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpBc3NlcnRIZWxwZXI7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U2NvcGVkVHJhY2U7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U3RyZWFtaW5nTGlzdGVuZXJUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0SGVscGVyOworICBmcmllbmQgRW52aXJvbm1lbnQqIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KTsKKyAgZnJpZW5kIGludGVybmFsOjpVbml0VGVzdEltcGwqIGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgZnJpZW5kIHZvaWQgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKKyAgICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCisgIC8vIENyZWF0ZXMgYW4gZW1wdHkgVW5pdFRlc3QuCisgIFVuaXRUZXN0KCk7CisKKyAgLy8gRCd0b3IKKyAgdmlydHVhbCB+VW5pdFRlc3QoKTsKKworICAvLyBQdXNoZXMgYSB0cmFjZSBkZWZpbmVkIGJ5IFNDT1BFRF9UUkFDRSgpIG9uIHRvIHRoZSBwZXItdGhyZWFkCisgIC8vIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgorICB2b2lkIFB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKQorICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKKworICAvLyBQb3BzIGEgdHJhY2UgZnJvbSB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgdm9pZCBQb3BHVGVzdFRyYWNlKCkKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7CisKKyAgLy8gUHJvdGVjdHMgbXV0YWJsZSBzdGF0ZSBpbiAqaW1wbF8uICBUaGlzIGlzIG11dGFibGUgYXMgc29tZSBjb25zdAorICAvLyBtZXRob2RzIG5lZWQgdG8gbG9jayBpdCB0b28uCisgIG11dGFibGUgaW50ZXJuYWw6Ok11dGV4IG11dGV4XzsKKworICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2JqZWN0LiAgVGhpcyBmaWVsZCBpcyBuZXZlciBjaGFuZ2VkIG9uY2UKKyAgLy8gdGhlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZC4gIFdlIGRvbid0IG1hcmsgaXQgYXMgY29uc3QgaGVyZSwgYXMKKyAgLy8gZG9pbmcgc28gd2lsbCBjYXVzZSBhIHdhcm5pbmcgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIFVuaXRUZXN0LgorICAvLyBNdXRhYmxlIHN0YXRlIGluICppbXBsXyBpcyBwcm90ZWN0ZWQgYnkgbXV0ZXhfLgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsXzsKKworICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFVuaXRUZXN0LgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0KTsKK307CisKKy8vIEEgY29udmVuaWVudCB3cmFwcGVyIGZvciBhZGRpbmcgYW4gZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0CisvLyBwcm9ncmFtLgorLy8KKy8vIFlvdSBzaG91bGQgY2FsbCB0aGlzIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgY2FsbGVkLCBwcm9iYWJseSBpbgorLy8gbWFpbigpLiAgSWYgeW91IHVzZSBndGVzdF9tYWluLCB5b3UgbmVlZCB0byBjYWxsIHRoaXMgYmVmb3JlIG1haW4oKQorLy8gc3RhcnRzIGZvciBpdCB0byB0YWtlIGVmZmVjdC4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBhIGdsb2JhbAorLy8gdmFyaWFibGUgbGlrZSB0aGlzOgorLy8KKy8vICAgdGVzdGluZzo6RW52aXJvbm1lbnQqIGNvbnN0IGZvb19lbnYgPQorLy8gICAgICAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBGb29FbnZpcm9ubWVudCk7CisvLworLy8gSG93ZXZlciwgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdSB0byB3cml0ZSB5b3VyIG93biBtYWluKCkgYW5kCisvLyBjYWxsIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpIHRoZXJlLCBhcyByZWx5aW5nIG9uIGluaXRpYWxpemF0aW9uCisvLyBvZiBnbG9iYWwgdmFyaWFibGVzIG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkIGFuZCBtYXkgY2F1c2UKKy8vIHByb2JsZW1zIHdoZW4geW91IHJlZ2lzdGVyIG11bHRpcGxlIGVudmlyb25tZW50cyBmcm9tIGRpZmZlcmVudAorLy8gdHJhbnNsYXRpb24gdW5pdHMgYW5kIHRoZSBlbnZpcm9ubWVudHMgaGF2ZSBkZXBlbmRlbmNpZXMgYW1vbmcgdGhlbQorLy8gKHJlbWVtYmVyIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBpbiB3aGljaAorLy8gZ2xvYmFsIHZhcmlhYmxlcyBmcm9tIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cyBhcmUgaW5pdGlhbGl6ZWQpLgoraW5saW5lIEVudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeworICByZXR1cm4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPkFkZEVudmlyb25tZW50KGVudik7Cit9CisKKy8vIEluaXRpYWxpemVzIEdvb2dsZSBUZXN0LiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZworLy8gUlVOX0FMTF9URVNUUygpLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIGEgY29tbWFuZCBsaW5lIGZvciB0aGUKKy8vIGZsYWdzIHRoYXQgR29vZ2xlIFRlc3QgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIFRlc3QgZmxhZyBpcworLy8gc2VlbiwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KKy8vCisvLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgVGVzdCBmbGFnIHZhcmlhYmxlcyBhcmUKKy8vIHVwZGF0ZWQuCisvLworLy8gQ2FsbGluZyB0aGUgZnVuY3Rpb24gZm9yIHRoZSBzZWNvbmQgdGltZSBoYXMgbm8gdXNlci12aXNpYmxlIGVmZmVjdC4KK0dURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKKworLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgorLy8gVU5JQ09ERSBtb2RlLgorR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTZXBhcmF0ZSB0aGUgZXJyb3IgZ2VuZXJhdGluZyBjb2RlIGZyb20gdGhlIGNvZGUgcGF0aCB0byByZWR1Y2UgdGhlIHN0YWNrCisvLyBmcmFtZSBzaXplIG9mIENtcEhlbHBlckVRLiBUaGlzIGhlbHBzIHJlZHVjZSB0aGUgb3ZlcmhlYWQgb2Ygc29tZSBzYW5pdGl6ZXJzCisvLyB3aGVuIGNhbGxpbmcgRVhQRUNUXyogaW4gYSB0aWdodCBsb29wLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUUZhaWx1cmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwgY29uc3QgVDImIGFjdHVhbCkgeworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShhY3R1YWwsIGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9FUS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIGFjdHVhbCkgeworR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDM4OSAvKiBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2ggKi8pCisgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CitHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKKworICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworfQorCisvLyBXaXRoIHRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uLCB3ZSBhbGxvdyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZAorLy8gaW4ge0FTU0VSVHxFWFBFQ1R9X0VRIHdoZW4gY29tcGlsZWQgd2l0aCBnY2MgNCwgYXMgYW5vbnltb3VzIGVudW1zCisvLyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGNsYXNzIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKKy8vIGxoc19pc19udWxsX2xpdGVyYWwgaXMgdHJ1ZSBpZmYgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpCisvLyBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLiAgVGhlIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzCisvLyBmb3IgbGhzX2lzX251bGxfbGl0ZXJhbCBiZWluZyBmYWxzZS4KK3RlbXBsYXRlIDxib29sIGxoc19pc19udWxsX2xpdGVyYWw+CitjbGFzcyBFcUhlbHBlciB7CisgcHVibGljOgorICAvLyBUaGlzIHRlbXBsYXRpemVkIHZlcnNpb24gaXMgZm9yIHRoZSBnZW5lcmFsIGNhc2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgYWN0dWFsKSB7CisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgfQorCisgIC8vIFdpdGggdGhpcyBvdmVybG9hZGVkIHZlcnNpb24sIHdlIGFsbG93IGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkCisgIC8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cworICAvLyBlbnVtcyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuCisgIC8vCisgIC8vIEV2ZW4gdGhvdWdoIGl0cyBib2R5IGxvb2tzIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSB2ZXJzaW9uLCB3ZQorICAvLyBjYW5ub3QgbWVyZ2UgdGhlIHR3bywgYXMgaXQgd2lsbCBtYWtlIGFub255bW91cyBlbnVtcyB1bmhhcHB5LgorICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKSB7CisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgfQorfTsKKworLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpCisvLyBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLCBsaWtlIE5VTEwsIGZhbHNlLCBvciAwLgordGVtcGxhdGUgPD4KK2NsYXNzIEVxSGVscGVyPHRydWU+IHsKKyBwdWJsaWM6CisgIC8vIFdlIGRlZmluZSB0d28gb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBDb21wYXJlKCkuICBUaGUgZmlyc3QKKyAgLy8gdmVyc2lvbiB3aWxsIGJlIHBpY2tlZCB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkgaXMKKyAgLy8gTk9UIGEgcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoMCwgQW5JbnRGdW5jdGlvbigpKSBvcgorICAvLyBFWFBFQ1RfRVEoZmFsc2UsIGFfYm9vbCkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwKKyAgICAgIGNvbnN0IFQyJiBhY3R1YWwsCisgICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgcHJldmVudHMgdGhpcyBvdmVybG9hZCBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgaWYgVDIKKyAgICAgIC8vIGlzIG5vdCBhIHBvaW50ZXIgdHlwZS4gIFdlIG5lZWQgdGhpcyBiZWNhdXNlIEFTU0VSVF9FUShOVUxMLCBteV9wdHIpCisgICAgICAvLyBleHBhbmRzIHRvIENvbXBhcmUoIiIsICIiLCBOVUxMLCBteV9wdHIpLCB3aGljaCByZXF1aXJlcyBhIGNvbnZlcnNpb24KKyAgICAgIC8vIHRvIG1hdGNoIHRoZSBTZWNyZXQqIGluIHRoZSBvdGhlciBvdmVybG9hZCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIG1ha2UKKyAgICAgIC8vIHRoaXMgdGVtcGxhdGUgbWF0Y2ggYmV0dGVyLgorICAgICAgdHlwZW5hbWUgRW5hYmxlSWY8IWlzX3BvaW50ZXI8VDI+Ojp2YWx1ZT46OnR5cGUqID0gMCkgeworICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgIH0KKworICAvLyBUaGlzIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzIGEKKyAgLy8gcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoTlVMTCwgYV9wb2ludGVyKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgIC8vIFdlIHVzZWQgdG8gaGF2ZSBhIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBTZWNyZXQqLiAgVGhhdAorICAgICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIHdvdWxkIGRlZHVjZSB0byAnbG9uZycsIG1ha2luZyB0aGlzIGEgYmV0dGVyIG1hdGNoCisgICAgICAvLyB0aGFuIHRoZSBmaXJzdCBvdmVybG9hZCBldmVuIHdpdGhvdXQgdGhlIGZpcnN0IG92ZXJsb2FkJ3MgRW5hYmxlSWYuCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBnY2Mgd2l0aCAtV2NvbnZlcnNpb24tbnVsbCB3YXJucyB3aGVuICJwYXNzaW5nIE5VTEwgdG8KKyAgICAgIC8vIG5vbi1wb2ludGVyIGFyZ3VtZW50IiAoZXZlbiBhIGRlZHVjZWQgaW50ZWdyYWwgYXJndW1lbnQpLCBzbyB0aGUgb2xkCisgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBjYXVzZWQgd2FybmluZ3MgaW4gdXNlciBjb2RlLgorICAgICAgU2VjcmV0KiAvKiBleHBlY3RlZCAoTlVMTCkgKi8sCisgICAgICBUKiBhY3R1YWwpIHsKKyAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhhdCAnZXhwZWN0ZWQnIGlzIGEgbnVsbCBwb2ludGVyLgorICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VCo+KE5VTEwpLCBhY3R1YWwpOworICB9Cit9OworCisvLyBTZXBhcmF0ZSB0aGUgZXJyb3IgZ2VuZXJhdGluZyBjb2RlIGZyb20gdGhlIGNvZGUgcGF0aCB0byByZWR1Y2UgdGhlIHN0YWNrCisvLyBmcmFtZSBzaXplIG9mIENtcEhlbHBlck9QLiBUaGlzIGhlbHBzIHJlZHVjZSB0aGUgb3ZlcmhlYWQgb2Ygc29tZSBzYW5pdGl6ZXJzCisvLyB3aGVuIGNhbGxpbmcgRVhQRUNUX09QIGluIGEgdGlnaHQgbG9vcC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyT3BGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHZhbDEsIGNvbnN0IFQyJiB2YWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcCkgeworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpICIgPDwgb3AgPDwgIiAoIiA8PCBleHByMgorICAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMikKKyAgICAgICAgIDw8ICIgdnMgIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMiwgdmFsMSk7Cit9CisKKy8vIEEgbWFjcm8gZm9yIGltcGxlbWVudGluZyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisvLyBBU1NFUlRfPz8gYW5kIEVYUEVDVF8/Py4gIEl0IGlzIGhlcmUganVzdCB0byBhdm9pZCBjb3B5LWFuZC1wYXN0ZQorLy8gb2Ygc2ltaWxhciBjb2RlLgorLy8KKy8vIEZvciBlYWNoIHRlbXBsYXRpemVkIGhlbHBlciBmdW5jdGlvbiwgd2UgYWxzbyBkZWZpbmUgYW4gb3ZlcmxvYWRlZAorLy8gdmVyc2lvbiBmb3IgQmlnZ2VzdEludCBpbiBvcmRlciB0byByZWR1Y2UgY29kZSBibG9hdCBhbmQgYWxsb3cKKy8vIGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkIHdpdGgge0FTU0VSVHxFWFBFQ1R9Xz8/IHdoZW4gY29tcGlsZWQKKy8vIHdpdGggZ2NjIDQuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorCisjZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXAordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj5cCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdmFsMSwgY29uc3QgVDImIHZhbDIpIHtcCisgIGlmICh2YWwxIG9wIHZhbDIpIHtcCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTtcCisgIH0gZWxzZSB7XAorICAgIHJldHVybiBDbXBIZWxwZXJPcEZhaWx1cmUoZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyLCAjb3ApO1wKKyAgfVwKK31cCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoXAorICAgIGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgQmlnZ2VzdEludCB2YWwxLCBCaWdnZXN0SW50IHZhbDIpCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTkUKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KTsKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xFCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExFLCA8PSk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVAorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMVCwgPCk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HRQorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1QKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR1QsID4pOworCisjdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCk7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhY3R1YWwpOworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZQorLy8gZmlyc3QgYXJndW1lbnQgdG8ge0VYUEVDVCxBU1NFUlR9X1BSRURfRk9STUFUMigpLCBub3QgYnkKKy8vIHRoZW1zZWx2ZXMuICBUaGV5IGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrCisvLyAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZiBvbmx5KSwgYW5kIHJldHVybiBhbgorLy8gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KKy8vCisvLyBUaGUge25lZWRsZSxoYXlzdGFja31fZXhwciBhcmd1bWVudHMgYXJlIHRoZSBzdHJpbmdpZmllZAorLy8gZXhwcmVzc2lvbnMgdGhhdCBnZW5lcmF0ZWQgdGhlIHR3byByZWFsIGFyZ3VtZW50cy4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKTsKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBIZWxwZXIgdGVtcGxhdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBmbG9hdGluZy1wb2ludHMuCisvLworLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgorLy8KKy8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckZsb2F0aW5nUG9pbnRFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBhY3R1YWwpIHsKKyAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHMoZXhwZWN0ZWQpLCByaHMoYWN0dWFsKTsKKworICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gZXhwZWN0ZWRfc3M7CisgIGV4cGVjdGVkX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKKyAgICAgICAgICAgICAgPDwgZXhwZWN0ZWQ7CisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBhY3R1YWxfc3M7CisgIGFjdHVhbF9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgICA8PCBhY3R1YWw7CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZleHBlY3RlZF9zcyksCisgICAgICAgICAgICAgICAgICAgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJmFjdHVhbF9zcyksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyBBU1NFUlRfTkVBUi4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVOZWFyUHJlZEZvcm1hdChjb25zdCBjaGFyKiBleHByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcik7CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLyBBIGNsYXNzIHRoYXQgZW5hYmxlcyBvbmUgdG8gc3RyZWFtIG1lc3NhZ2VzIHRvIGFzc2VydGlvbiBtYWNyb3MKK2NsYXNzIEdURVNUX0FQSV8gQXNzZXJ0SGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICBBc3NlcnRIZWxwZXIoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICBpbnQgbGluZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworICB+QXNzZXJ0SGVscGVyKCk7CisKKyAgLy8gTWVzc2FnZSBhc3NpZ25tZW50IGlzIGEgc2VtYW50aWMgdHJpY2sgdG8gZW5hYmxlIGFzc2VydGlvbgorICAvLyBzdHJlYW1pbmc7IHNlZSB0aGUgR1RFU1RfTUVTU0FHRV8gbWFjcm8gYmVsb3cuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gV2UgcHV0IG91ciBkYXRhIGluIGEgc3RydWN0IHNvIHRoYXQgdGhlIHNpemUgb2YgdGhlIEFzc2VydEhlbHBlciBjbGFzcyBjYW4KKyAgLy8gYmUgYXMgc21hbGwgYXMgcG9zc2libGUuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGdjYyBpcyBpbmNhcGFibGUgb2YKKyAgLy8gcmUtdXNpbmcgc3RhY2sgc3BhY2UgZXZlbiBmb3IgdGVtcG9yYXJ5IHZhcmlhYmxlcywgc28gZXZlcnkgRVhQRUNUX0VRCisgIC8vIHJlc2VydmVzIHN0YWNrIHNwYWNlIGZvciBhbm90aGVyIEFzc2VydEhlbHBlci4KKyAgc3RydWN0IEFzc2VydEhlbHBlckRhdGEgeworICAgIEFzc2VydEhlbHBlckRhdGEoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNyY2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9udW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtc2cpCisgICAgICAgIDogdHlwZSh0KSwgZmlsZShzcmNmaWxlKSwgbGluZShsaW5lX251bSksIG1lc3NhZ2UobXNnKSB7IH0KKworICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGNvbnN0IHR5cGU7CisgICAgY29uc3QgY2hhciogY29uc3QgZmlsZTsKKyAgICBpbnQgY29uc3QgbGluZTsKKyAgICBzdGQ6OnN0cmluZyBjb25zdCBtZXNzYWdlOworCisgICBwcml2YXRlOgorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyRGF0YSk7CisgIH07CisKKyAgQXNzZXJ0SGVscGVyRGF0YSogY29uc3QgZGF0YV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBc3NlcnRIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorLy8gVGhlIHB1cmUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgYWxsIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW5oZXJpdCBmcm9tLgorLy8gQSB2YWx1ZS1wYXJhbWV0ZXJpemVkIGNsYXNzIG11c3QgaW5oZXJpdCBmcm9tIGJvdGggOjp0ZXN0aW5nOjpUZXN0IGFuZAorLy8gOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vc3QgY2FzZXMgdGhhdCBqdXN0IG1lYW5zIGluaGVyaXRpbmcKKy8vIGZyb20gOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtLCBidXQgbW9yZSBjb21wbGljYXRlZCB0ZXN0IGhpZXJhcmNoaWVzCisvLyBtYXkgbmVlZCB0byBpbmhlcml0IGZyb20gVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlIGF0IGRpZmZlcmVudCBsZXZlbHMuCisvLworLy8gVGhpcyBpbnRlcmZhY2UgaGFzIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgdGVzdCBwYXJhbWV0ZXIgdmFsdWUgdmlhCisvLyB0aGUgR2V0UGFyYW0oKSBtZXRob2QuCisvLworLy8gVXNlIGl0IHdpdGggb25lIG9mIHRoZSBwYXJhbWV0ZXIgZ2VuZXJhdG9yIGRlZmluaW5nIGZ1bmN0aW9ucywgbGlrZSBSYW5nZSgpLAorLy8gVmFsdWVzKCksIFZhbHVlc0luKCksIEJvb2woKSwgYW5kIENvbWJpbmUoKS4KKy8vCisvLyBjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKKy8vICBwcm90ZWN0ZWQ6CisvLyAgIEZvb1Rlc3QoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB+Rm9vVGVzdCgpIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB2b2lkIFRlYXJEb3duIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gfTsKKy8vIFRFU1RfUChGb29UZXN0LCBEb2VzQmFyKSB7CisvLyAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBtZXRob2QgaGVyZS4KKy8vICAgRm9vIGZvbzsKKy8vICAgQVNTRVJUX1RSVUUoZm9vLkRvZXNCYXIoR2V0UGFyYW0oKSkpOworLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoT25lVG9UZW5SYW5nZSwgRm9vVGVzdCwgOjp0ZXN0aW5nOjpSYW5nZSgxLCAxMCkpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFdpdGhQYXJhbUludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIFQgUGFyYW1UeXBlOworICB2aXJ0dWFsIH5XaXRoUGFyYW1JbnRlcmZhY2UoKSB7fQorCisgIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZS4gSXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHRlc3QgZml4dHVyZSdzCisgIC8vIGNvbnN0cnVjdG9yLiBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBub24tc3RhdGljLCBldmVuIHRob3VnaCBpdCBvbmx5CisgIC8vIHJlZmVyZW5jZXMgc3RhdGljIGRhdGEsIHRvIHJlZHVjZSB0aGUgb3Bwb3J0dW5pdHkgZm9yIGluY29ycmVjdCB1c2VzCisgIC8vIGxpa2Ugd3JpdGluZyAnV2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+OjpHZXRQYXJhbSgpJyBmb3IgYSB0ZXN0IHRoYXQKKyAgLy8gdXNlcyBhIGZpeHR1cmUgd2hvc2UgcGFyYW1ldGVyIHR5cGUgaXMgaW50LgorICBjb25zdCBQYXJhbVR5cGUmIEdldFBhcmFtKCkgY29uc3QgeworICAgIEdURVNUX0NIRUNLXyhwYXJhbWV0ZXJfICE9IE5VTEwpCisgICAgICAgIDw8ICJHZXRQYXJhbSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QgIgorICAgICAgICA8PCAiLS0gZGlkIHlvdSBpbnRlbmQgdG8gd3JpdGUgVEVTVF9QIGluc3RlYWQgb2YgVEVTVF9GPyI7CisgICAgcmV0dXJuICpwYXJhbWV0ZXJfOworICB9CisKKyBwcml2YXRlOgorICAvLyBTZXRzIHBhcmFtZXRlciB2YWx1ZS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhlIHZhbHVlCisgIC8vIHJlbWFpbnMgYWxpdmUgYW5kIHVuY2hhbmdlZCB0aHJvdWdob3V0IHRoZSBjdXJyZW50IHRlc3QuCisgIHN0YXRpYyB2b2lkIFNldFBhcmFtKGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyKSB7CisgICAgcGFyYW1ldGVyXyA9IHBhcmFtZXRlcjsKKyAgfQorCisgIC8vIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBhY2Nlc3NpbmcgcGFyYW1ldGVyIGR1cmluZyBhIHRlc3QgbGlmZXRpbWUuCisgIHN0YXRpYyBjb25zdCBQYXJhbVR5cGUqIHBhcmFtZXRlcl87CisKKyAgLy8gVGVzdENsYXNzIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBXaXRoUGFyYW1JbnRlcmZhY2U8VD4gYW5kIFRlc3QuCisgIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+IGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdCBUKiBXaXRoUGFyYW1JbnRlcmZhY2U8VD46OnBhcmFtZXRlcl8gPSBOVUxMOworCisvLyBNb3N0IHZhbHVlLXBhcmFtZXRlcml6ZWQgY2xhc3NlcyBjYW4gaWdub3JlIHRoZSBleGlzdGVuY2Ugb2YKKy8vIFdpdGhQYXJhbUludGVyZmFjZSwgYW5kIGNhbiBqdXN0IGluaGVyaXQgZnJvbSA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW0uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGVzdFdpdGhQYXJhbSA6IHB1YmxpYyBUZXN0LCBwdWJsaWMgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IHsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gTWFjcm9zIGZvciBpbmRpY2F0aW5nIHN1Y2Nlc3MvZmFpbHVyZSBpbiB0ZXN0IGNvZGUuCisKKy8vIEFERF9GQUlMVVJFIHVuY29uZGl0aW9uYWxseSBhZGRzIGEgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LgorLy8gU1VDQ0VFRCBnZW5lcmF0ZXMgYSBzdWNjZXNzIC0gaXQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlCisvLyBjdXJyZW50IHRlc3Qgc3VjY2Vzc2Z1bCwgYXMgYSB0ZXN0IGlzIG9ubHkgc3VjY2Vzc2Z1bCB3aGVuIGl0IGhhcworLy8gbm8gZmFpbHVyZS4KKy8vCisvLyBFWFBFQ1RfKiB2ZXJpZmllcyB0aGF0IGEgY2VydGFpbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLiAgSWYgbm90LAorLy8gaXQgYmVoYXZlcyBsaWtlIEFERF9GQUlMVVJFLiAgSW4gcGFydGljdWxhcjoKKy8vCisvLyAgIEVYUEVDVF9UUlVFICB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgdHJ1ZS4KKy8vICAgRVhQRUNUX0ZBTFNFIHZlcmlmaWVzIHRoYXQgYSBCb29sZWFuIGNvbmRpdGlvbiBpcyBmYWxzZS4KKy8vCisvLyBGQUlMIGFuZCBBU1NFUlRfKiBhcmUgc2ltaWxhciB0byBBRERfRkFJTFVSRSBhbmQgRVhQRUNUXyosIGV4Y2VwdAorLy8gdGhhdCB0aGV5IHdpbGwgYWxzbyBhYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbiBvbiBmYWlsdXJlLiAgUGVvcGxlCisvLyB1c3VhbGx5IHdhbnQgdGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBGQUlMIGFuZCBBU1NFUlRfKiwgYnV0IHRob3NlCisvLyB3cml0aW5nIGRhdGEtZHJpdmVuIHRlc3RzIG9mdGVuIGZpbmQgdGhlbXNlbHZlcyB1c2luZyBBRERfRkFJTFVSRQorLy8gYW5kIEVYUEVDVF8qIG1vcmUuCisKKy8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KKyNkZWZpbmUgQUREX0ZBSUxVUkUoKSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXygiRmFpbGVkIikKKworLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZSBhdCB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gd2l0aAorLy8gYSBnZW5lcmljIG1lc3NhZ2UuCisjZGVmaW5lIEFERF9GQUlMVVJFX0FUKGZpbGUsIGxpbmUpIFwKKyAgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgIkZhaWxlZCIsIFwKKyAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKKworLy8gR2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9GQUlMKCkgR1RFU1RfRkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBGQUlMKCksIHdoaWNoIGlzIGEKKy8vIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9GQUlMCisjIGRlZmluZSBGQUlMKCkgR1RFU1RfRkFJTCgpCisjZW5kaWYKKworLy8gR2VuZXJhdGVzIGEgc3VjY2VzcyB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBHVEVTVF9TVUNDRUVEKCkgR1RFU1RfU1VDQ0VTU18oIlN1Y2NlZWRlZCIpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBTVUNDRUVEKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9TVUNDRUVECisjIGRlZmluZSBTVUNDRUVEKCkgR1RFU1RfU1VDQ0VFRCgpCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGV4Y2VwdGlvbnMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIHRoZSBleHBlY3RlZCBleGNlcHRpb24uCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9OT19USFJPVyhzdGF0ZW1lbnQpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgZG9lc24ndCB0aHJvdyBhbnkgZXhjZXB0aW9uLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fQU5ZX1RIUk9XKHN0YXRlbWVudCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorCisjZGVmaW5lIEVYUEVDVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAorICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAorICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKKyAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKy8vIEJvb2xlYW4gYXNzZXJ0aW9ucy4gQ29uZGl0aW9uIGNhbiBiZSBlaXRoZXIgYSBCb29sZWFuIGV4cHJlc3Npb24gb3IgYW4KKy8vIEFzc2VydGlvblJlc3VsdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBBc3NlcnRpb25SZXN1bHQgd2l0aAorLy8gdGhlc2UgbWFjcm9zIHNlZSBjb21tZW50cyBvbiB0aGF0IGNsYXNzLgorI2RlZmluZSBFWFBFQ1RfVFJVRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyhjb25kaXRpb24sICNjb25kaXRpb24sIGZhbHNlLCB0cnVlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9GQUxTRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyghKGNvbmRpdGlvbiksICNjb25kaXRpb24sIHRydWUsIGZhbHNlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9UUlVFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgZmFsc2UsIHRydWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX0ZBTFNFKGNvbmRpdGlvbikgXAorICBHVEVTVF9URVNUX0JPT0xFQU5fKCEoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gSW5jbHVkZXMgdGhlIGF1dG8tZ2VuZXJhdGVkIGhlYWRlciB0aGF0IGltcGxlbWVudHMgYSBmYW1pbHkgb2YKKy8vIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgiCisKKy8vIE1hY3JvcyBmb3IgdGVzdGluZyBlcXVhbGl0aWVzIGFuZCBpbmVxdWFsaXRpZXMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRVEoZXhwZWN0ZWQsIGFjdHVhbCk6IFRlc3RzIHRoYXQgZXhwZWN0ZWQgPT0gYWN0dWFsCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSAhPSB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTFQodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPCB2MgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTEUodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgPD0gdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0dUKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxID4gdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0dFKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxID49IHYyCisvLworLy8gV2hlbiB0aGV5IGFyZSBub3QsIEdvb2dsZSBUZXN0IHByaW50cyBib3RoIHRoZSB0ZXN0ZWQgZXhwcmVzc2lvbnMgYW5kCisvLyB0aGVpciBhY3R1YWwgdmFsdWVzLiAgVGhlIHZhbHVlcyBtdXN0IGJlIGNvbXBhdGlibGUgYnVpbHQtaW4gdHlwZXMsCisvLyBvciB5b3Ugd2lsbCBnZXQgYSBjb21waWxlciBlcnJvci4gIEJ5ICJjb21wYXRpYmxlIiB3ZSBtZWFuIHRoYXQgdGhlCisvLyB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIGJ5IHRoZSByZXNwZWN0aXZlIG9wZXJhdG9yLgorLy8KKy8vIE5vdGU6CisvLworLy8gICAxLiBJdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgdXNlci1kZWZpbmVkIHR5cGUgd29yayB3aXRoCisvLyAgIHtBU1NFUlR8RVhQRUNUfV8/PygpLCBidXQgdGhhdCByZXF1aXJlcyBvdmVybG9hZGluZyB0aGUKKy8vICAgY29tcGFyaXNvbiBvcGVyYXRvcnMgYW5kIGlzIHRodXMgZGlzY291cmFnZWQgYnkgdGhlIEdvb2dsZSBDKysKKy8vICAgVXNhZ2UgR3VpZGUuICBUaGVyZWZvcmUsIHlvdSBhcmUgYWR2aXNlZCB0byB1c2UgdGhlCisvLyAgIHtBU1NFUlR8RVhQRUNUfV9UUlVFKCkgbWFjcm8gdG8gYXNzZXJ0IHRoYXQgdHdvIG9iamVjdHMgYXJlCisvLyAgIGVxdWFsLgorLy8KKy8vICAgMi4gVGhlIHtBU1NFUlR8RVhQRUNUfV8/PygpIG1hY3JvcyBkbyBwb2ludGVyIGNvbXBhcmlzb25zIG9uCisvLyAgIHBvaW50ZXJzIChpbiBwYXJ0aWN1bGFyLCBDIHN0cmluZ3MpLiAgVGhlcmVmb3JlLCBpZiB5b3UgdXNlIGl0CisvLyAgIHdpdGggdHdvIEMgc3RyaW5ncywgeW91IGFyZSB0ZXN0aW5nIGhvdyB0aGVpciBsb2NhdGlvbnMgaW4gbWVtb3J5CisvLyAgIGFyZSByZWxhdGVkLCBub3QgaG93IHRoZWlyIGNvbnRlbnQgaXMgcmVsYXRlZC4gIFRvIGNvbXBhcmUgdHdvIEMKKy8vICAgc3RyaW5ncyBieSBjb250ZW50LCB1c2Uge0FTU0VSVHxFWFBFQ1R9X1NUUiooKS4KKy8vCisvLyAgIDMuIHtBU1NFUlR8RVhQRUNUfV9FUShleHBlY3RlZCwgYWN0dWFsKSBpcyBwcmVmZXJyZWQgdG8KKy8vICAge0FTU0VSVHxFWFBFQ1R9X1RSVUUoZXhwZWN0ZWQgPT0gYWN0dWFsKSwgYXMgdGhlIGZvcm1lciB0ZWxscyB5b3UKKy8vICAgd2hhdCB0aGUgYWN0dWFsIHZhbHVlIGlzIHdoZW4gaXQgZmFpbHMsIGFuZCBzaW1pbGFybHkgZm9yIHRoZQorLy8gICBvdGhlciBjb21wYXJpc29ucy4KKy8vCisvLyAgIDQuIERvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIGluIHdoaWNoIHtBU1NFUlR8RVhQRUNUfV8/PygpCisvLyAgIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cywgd2hpY2ggaXMgdW5kZWZpbmVkLgorLy8KKy8vICAgNS4gVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBFWFBFQ1RfTkUoNSwgRm9vKCkpOworLy8gICBFWFBFQ1RfRVEoTlVMTCwgYV9wb2ludGVyKTsKKy8vICAgQVNTRVJUX0xUKGksIGFycmF5X3NpemUpOworLy8gICBBU1NFUlRfR1QocmVjb3Jkcy5zaXplKCksIDApIDw8ICJUaGVyZSBpcyBubyByZWNvcmQgbGVmdC4iOworCisjZGVmaW5lIEVYUEVDVF9FUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6IFwKKyAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKGV4cGVjdGVkKT46OkNvbXBhcmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBFWFBFQ1RfTkUoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBFWFBFQ1RfTEUodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfTFQodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxULCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfR0UodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBFWFBFQ1RfR1QodmFsMSwgdmFsMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdULCB2YWwxLCB2YWwyKQorCisjZGVmaW5lIEdURVNUX0FTU0VSVF9FUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6IFwKKyAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKGV4cGVjdGVkKT46OkNvbXBhcmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTkUodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTEUodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxULCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfR0UodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQorI2RlZmluZSBHVEVTVF9BU1NFUlRfR1QodmFsMSwgdmFsMikgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdULCB2YWwxLCB2YWwyKQorCisvLyBEZWZpbmUgbWFjcm8gR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX1hZIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZgorLy8gQVNTRVJUX1hZKCksIHdoaWNoIGNsYXNoZXMgd2l0aCBzb21lIHVzZXJzJyBvd24gY29kZS4KKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfRVEKKyMgZGVmaW5lIEFTU0VSVF9FUSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfRVEodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9ORQorIyBkZWZpbmUgQVNTRVJUX05FKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9ORSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xFCisjIGRlZmluZSBBU1NFUlRfTEUodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0xFKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTFQKKyMgZGVmaW5lIEFTU0VSVF9MVCh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9HRQorIyBkZWZpbmUgQVNTRVJUX0dFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HRSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0dUCisjIGRlZmluZSBBU1NFUlRfR1QodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0dUKHZhbDEsIHZhbDIpCisjZW5kaWYKKworLy8gQy1zdHJpbmcgQ29tcGFyaXNvbnMuICBBbGwgdGVzdHMgdHJlYXQgTlVMTCBhbmQgYW55IG5vbi1OVUxMIHN0cmluZworLy8gYXMgZGlmZmVyZW50LiAgVHdvIE5VTExzIGFyZSBlcXVhbC4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJFUShzMSwgczIpOiAgICAgVGVzdHMgdGhhdCBzMSA9PSBzMgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSTkUoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgIT0gczIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUShzMSwgczIpOiBUZXN0cyB0aGF0IHMxID09IHMyLCBpZ25vcmluZyBjYXNlCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUoczEsIHMyKTogVGVzdHMgdGhhdCBzMSAhPSBzMiwgaWdub3JpbmcgY2FzZQorLy8KKy8vIEZvciB3aWRlIG9yIG5hcnJvdyBzdHJpbmcgb2JqZWN0cywgeW91IGNhbiB1c2UgdGhlCisvLyB7QVNTRVJUfEVYUEVDVH1fPz8oKSBtYWNyb3MuCisvLworLy8gRG9uJ3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQsCisvLyB3aGljaCBpcyB1bmRlZmluZWQuCisvLworLy8gVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCisKKyNkZWZpbmUgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJFUSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX1NUUk5FKHMxLCBzMikgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUk5FLCBzMSwgczIpCisjZGVmaW5lIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VFUSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX1NUUkNBU0VORShzMSwgczIpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VORSwgczEsIHMyKQorCisjZGVmaW5lIEFTU0VSVF9TVFJFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEFTU0VSVF9TVFJORShzMSwgczIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQorI2RlZmluZSBBU1NFUlRfU1RSQ0FTRUVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEFTU0VSVF9TVFJDQVNFTkUoczEsIHMyKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKKworLy8gTWFjcm9zIGZvciBjb21wYXJpbmcgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB0d28gZmxvYXQgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ET1VCTEVfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGRvdWJsZSB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbC4KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05FQVIodjEsIHYyLCBhYnNfZXJyb3IpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHYxIGFuZCB2MiBhcmUgd2l0aGluIHRoZSBnaXZlbiBkaXN0YW5jZSB0byBlYWNoIG90aGVyLgorLy8KKy8vIEdvb2dsZSBUZXN0IHVzZXMgVUxQLWJhc2VkIGNvbXBhcmlzb24gdG8gYXV0b21hdGljYWxseSBwaWNrIGEgZGVmYXVsdAorLy8gZXJyb3IgYm91bmQgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIG9wZXJhbmRzLiAgU2VlIHRoZQorLy8gRmxvYXRpbmdQb2ludCB0ZW1wbGF0ZSBjbGFzcyBpbiBndGVzdC1pbnRlcm5hbC5oIGlmIHlvdSBhcmUKKy8vIGludGVyZXN0ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisKKyNkZWZpbmUgRVhQRUNUX0ZMT0FUX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxmbG9hdD4sIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorCisjZGVmaW5lIEVYUEVDVF9ET1VCTEVfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGRvdWJsZT4sIFwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQorCisjZGVmaW5lIEFTU0VSVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBBU1NFUlRfRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBFWFBFQ1RfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCisgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQorCisjZGVmaW5lIEFTU0VSVF9ORUFSKHZhbDEsIHZhbDIsIGFic19lcnJvcilcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RG91YmxlTmVhclByZWRGb3JtYXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCBhYnNfZXJyb3IpCisKKy8vIFRoZXNlIHByZWRpY2F0ZSBmb3JtYXQgZnVuY3Rpb25zIHdvcmsgb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzLCBhbmQKKy8vIGNhbiBiZSB1c2VkIGluIHtBU1NFUlR8RVhQRUNUfV9QUkVEX0ZPUk1BVDIqKCksIGUuZy4KKy8vCisvLyAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6RG91YmxlTEUsIEZvbygpLCA1LjApOworCisvLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCisvLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEZsb2F0TEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IERvdWJsZUxFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLCBkb3VibGUgdmFsMik7CisKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworLy8gTWFjcm9zIHRoYXQgdGVzdCBmb3IgSFJFU1VMVCBmYWlsdXJlIGFuZCBzdWNjZXNzLCB0aGVzZSBhcmUgb25seSB1c2VmdWwKKy8vIG9uIFdpbmRvd3MsIGFuZCByZWx5IG9uIFdpbmRvd3MgU0RLIG1hY3JvcyBhbmQgQVBJcyB0byBjb21waWxlLgorLy8KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9KGV4cHIpCisvLworLy8gV2hlbiBleHByIHVuZXhwZWN0ZWRseSBmYWlscyBvciBzdWNjZWVkcywgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZQorLy8gZXhwZWN0ZWQgcmVzdWx0IGFuZCB0aGUgYWN0dWFsIHJlc3VsdCB3aXRoIGJvdGggYSBodW1hbi1yZWFkYWJsZQorLy8gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIHRoZQorLy8gaGV4IHJlc3VsdCBjb2RlLgorIyBkZWZpbmUgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKKworIyBkZWZpbmUgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKKworIyBkZWZpbmUgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKKworIyBkZWZpbmUgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIE1hY3JvcyB0aGF0IGV4ZWN1dGUgc3RhdGVtZW50IGFuZCBjaGVjayB0aGF0IGl0IGRvZXNuJ3QgZ2VuZXJhdGUgbmV3IGZhdGFsCisvLyBmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuCisvLworLy8gICAqIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCk7CisvLworLy8gRXhhbXBsZXM6CisvLworLy8gICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpOworLy8gICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpIDw8ICJQcm9jZXNzKCkgZmFpbGVkIjsKKy8vCisjZGVmaW5lIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAorICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50KSBcCisgICAgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBDYXVzZXMgYSB0cmFjZSAoaW5jbHVkaW5nIHRoZSBzb3VyY2UgZmlsZSBwYXRoLCB0aGUgY3VycmVudCBsaW5lCisvLyBudW1iZXIsIGFuZCB0aGUgZ2l2ZW4gbWVzc2FnZSkgdG8gYmUgaW5jbHVkZWQgaW4gZXZlcnkgdGVzdCBmYWlsdXJlCisvLyBtZXNzYWdlIGdlbmVyYXRlZCBieSBjb2RlIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgVGhlIGVmZmVjdCBpcworLy8gdW5kb25lIHdoZW4gdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBjdXJyZW50IHNjb3BlLgorLy8KKy8vIFRoZSBtZXNzYWdlIGFyZ3VtZW50IGNhbiBiZSBhbnl0aGluZyBzdHJlYW1hYmxlIHRvIHN0ZDo6b3N0cmVhbS4KKy8vCisvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24sIHdlIGluY2x1ZGUgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgYXMgcGFydAorLy8gb2YgdGhlIGR1bW15IHZhcmlhYmxlIG5hbWUsIHRodXMgYWxsb3dpbmcgbXVsdGlwbGUgU0NPUEVEX1RSQUNFKClzCisvLyB0byBhcHBlYXIgaW4gdGhlIHNhbWUgYmxvY2sgLSBhcyBsb25nIGFzIHRoZXkgYXJlIG9uIGRpZmZlcmVudAorLy8gbGluZXMuCisjZGVmaW5lIFNDT1BFRF9UUkFDRShtZXNzYWdlKSBcCisgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNjb3BlZFRyYWNlIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfdHJhY2VfLCBfX0xJTkVfXykoXAorICAgIF9fRklMRV9fLCBfX0xJTkVfXywgOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgKG1lc3NhZ2UpKQorCisvLyBDb21waWxlLXRpbWUgYXNzZXJ0aW9uIGZvciB0eXBlIGVxdWFsaXR5LgorLy8gU3RhdGljQXNzZXJ0VHlwZUVxPHR5cGUxLCB0eXBlMj4oKSBjb21waWxlcyBpZmYgdHlwZTEgYW5kIHR5cGUyIGFyZQorLy8gdGhlIHNhbWUgdHlwZS4gIFRoZSB2YWx1ZSBpdCByZXR1cm5zIGlzIG5vdCBpbnRlcmVzdGluZy4KKy8vCisvLyBJbnN0ZWFkIG9mIG1ha2luZyBTdGF0aWNBc3NlcnRUeXBlRXEgYSBjbGFzcyB0ZW1wbGF0ZSwgd2UgbWFrZSBpdCBhCisvLyBmdW5jdGlvbiB0ZW1wbGF0ZSB0aGF0IGludm9rZXMgYSBoZWxwZXIgY2xhc3MgdGVtcGxhdGUuICBUaGlzCisvLyBwcmV2ZW50cyBhIHVzZXIgZnJvbSBtaXN1c2luZyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPiBieQorLy8gZGVmaW5pbmcgb2JqZWN0cyBvZiB0aGF0IHR5cGUuCisvLworLy8gQ0FWRUFUOgorLy8KKy8vIFdoZW4gdXNlZCBpbnNpZGUgYSBtZXRob2Qgb2YgYSBjbGFzcyB0ZW1wbGF0ZSwKKy8vIFN0YXRpY0Fzc2VydFR5cGVFcTxUMSwgVDI+KCkgaXMgZWZmZWN0aXZlIE9OTFkgSUYgdGhlIG1ldGhvZCBpcworLy8gaW5zdGFudGlhdGVkLiAgRm9yIGV4YW1wbGUsIGdpdmVuOgorLy8KKy8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZvbyB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgdm9pZCBCYXIoKSB7IHRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIFQ+KCk7IH0KKy8vICAgfTsKKy8vCisvLyB0aGUgY29kZToKKy8vCisvLyAgIHZvaWQgVGVzdDEoKSB7IEZvbzxib29sPiBmb287IH0KKy8vCisvLyB3aWxsIE5PVCBnZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yLCBhcyBGb288Ym9vbD46OkJhcigpIGlzIG5ldmVyCisvLyBhY3R1YWxseSBpbnN0YW50aWF0ZWQuICBJbnN0ZWFkLCB5b3UgbmVlZDoKKy8vCisvLyAgIHZvaWQgVGVzdDIoKSB7IEZvbzxib29sPiBmb287IGZvby5CYXIoKTsgfQorLy8KKy8vIHRvIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBTdGF0aWNBc3NlcnRUeXBlRXEoKSB7CisgICh2b2lkKWludGVybmFsOjpTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VDEsIFQyPigpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRGVmaW5lcyBhIHRlc3QuCisvLworLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLCBhbmQgdGhlIHNlY29uZAorLy8gcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLgorLy8KKy8vIFRoZSBjb252ZW50aW9uIGlzIHRvIGVuZCB0aGUgdGVzdCBjYXNlIG5hbWUgd2l0aCAiVGVzdCIuICBGb3IKKy8vIGV4YW1wbGUsIGEgdGVzdCBjYXNlIGZvciB0aGUgRm9vIGNsYXNzIGNhbiBiZSBuYW1lZCBGb29UZXN0LgorLy8KKy8vIFRlc3QgY29kZSBzaG91bGQgYXBwZWFyIGJldHdlZW4gYnJhY2VzIGFmdGVyIGFuIGludm9jYXRpb24gb2YKKy8vIHRoaXMgbWFjcm8uICBFeGFtcGxlOgorLy8KKy8vICAgVEVTVChGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgeworLy8gICAgIEZvbyBmb287CisvLyAgICAgRVhQRUNUX1RSVUUoZm9vLlN0YXR1c0lzT0soKSk7CisvLyAgIH0KKworLy8gTm90ZSB0aGF0IHdlIGNhbGwgR2V0VGVzdFR5cGVJZCgpIGluc3RlYWQgb2YgR2V0VHlwZUlkPAorLy8gOjp0ZXN0aW5nOjpUZXN0PigpIGhlcmUgdG8gZ2V0IHRoZSB0eXBlIElEIG9mIHRlc3Rpbmc6OlRlc3QuICBUaGlzCisvLyBpcyB0byB3b3JrIGFyb3VuZCBhIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMKKy8vIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMgR2V0VHlwZUlkPAorLy8gOjp0ZXN0aW5nOjpUZXN0PigpIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyCisvLyB0aGUgY2FsbCBpcyBmcm9tIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsgaXRzZWxmIG9yIGZyb20gdXNlciB0ZXN0CisvLyBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZQorLy8gdmFsdWUsIGFzIGl0IGFsd2F5cyBjYWxscyBHZXRUeXBlSWQ8PigpIGZyb20gdGhlIEdvb2dsZSBUZXN0CisvLyBmcmFtZXdvcmsuCisjZGVmaW5lIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCisgIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIFwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRUZXN0VHlwZUlkKCkpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBURVNUKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9URVNUCisjIGRlZmluZSBURVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkKKyNlbmRpZgorCisvLyBEZWZpbmVzIGEgdGVzdCB0aGF0IHVzZXMgYSB0ZXN0IGZpeHR1cmUuCisvLworLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLCB3aGljaAorLy8gYWxzbyBkb3VibGVzIGFzIHRoZSB0ZXN0IGNhc2UgbmFtZS4gIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZQorLy8gbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KKy8vCisvLyBBIHRlc3QgZml4dHVyZSBjbGFzcyBtdXN0IGJlIGRlY2xhcmVkIGVhcmxpZXIuICBUaGUgdXNlciBzaG91bGQgcHV0CisvLyBoaXMgdGVzdCBjb2RlIGJldHdlZW4gYnJhY2VzIGFmdGVyIHVzaW5nIHRoaXMgbWFjcm8uICBFeGFtcGxlOgorLy8KKy8vICAgY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgIHByb3RlY3RlZDoKKy8vICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IGJfLkFkZEVsZW1lbnQoMyk7IH0KKy8vCisvLyAgICAgRm9vIGFfOworLy8gICAgIEZvbyBiXzsKKy8vICAgfTsKKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgeworLy8gICAgIEVYUEVDVF9UUlVFKGFfLlN0YXR1c0lzT0soKSk7CisvLyAgIH0KKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBSZXR1cm5zRWxlbWVudENvdW50Q29ycmVjdGx5KSB7CisvLyAgICAgRVhQRUNUX0VRKDAsIGFfLnNpemUoKSk7CisvLyAgICAgRVhQRUNUX0VRKDEsIGJfLnNpemUoKSk7CisvLyAgIH0KKworI2RlZmluZSBURVNUX0YodGVzdF9maXh0dXJlLCB0ZXN0X25hbWUpXAorICBHVEVTVF9URVNUXyh0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSwgdGVzdF9maXh0dXJlLCBcCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFR5cGVJZDx0ZXN0X2ZpeHR1cmU+KCkpCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKy8vIFVzZSB0aGlzIGZ1bmN0aW9uIGluIG1haW4oKSB0byBydW4gYWxsIHRlc3RzLiAgSXQgcmV0dXJucyAwIGlmIGFsbAorLy8gdGVzdHMgYXJlIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgorLy8KKy8vIFJVTl9BTExfVEVTVFMoKSBzaG91bGQgYmUgaW52b2tlZCBhZnRlciB0aGUgY29tbWFuZCBsaW5lIGhhcyBiZWVuCisvLyBwYXJzZWQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHdhcyBmb3JtZXJseSBhIG1hY3JvOyB0aHVzLCBpdCBpcyBpbiB0aGUgZ2xvYmFsCisvLyBuYW1lc3BhY2UgYW5kIGhhcyBhbiBhbGwtY2FwcyBuYW1lLgoraW50IFJVTl9BTExfVEVTVFMoKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOworCitpbmxpbmUgaW50IFJVTl9BTExfVEVTVFMoKSB7CisgIHJldHVybiA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWU3MTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaApAQCAtMCwwICsxLDM1OCBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gMTAvMzEvMjAxMSBieSBjb21tYW5kCisvLyAnZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSA1Jy4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gSW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCisKKy8vIE1ha2VzIHN1cmUgdGhpcyBoZWFkZXIgaXMgbm90IGluY2x1ZGVkIGJlZm9yZSBndGVzdC5oLgorI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisjIGVycm9yIERvIG5vdCBpbmNsdWRlIGd0ZXN0X3ByZWRfaW1wbC5oIGRpcmVjdGx5LiAgSW5jbHVkZSBndGVzdC5oIGluc3RlYWQuCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKworLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24KKy8vIG1hY3JvczoKKy8vCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKQorLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpCisvLyAgIC4uLgorLy8KKy8vIHdoZXJlIHByZWRfZm9ybWF0IGlzIGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHRha2VzIG4gKGluIHRoZQorLy8gY2FzZSBvZiBBU1NFUlRfUFJFRF9GT1JNQVRuKSB2YWx1ZXMgYW5kIHRoZWlyIHNvdXJjZSBleHByZXNzaW9uCisvLyB0ZXh0LCBhbmQgcmV0dXJucyBhIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdC4gIFNlZSB0aGUgZGVmaW5pdGlvbgorLy8gb2YgQVNTRVJUX0VRIGluIGd0ZXN0LmggZm9yIGFuIGV4YW1wbGUuCisvLworLy8gSWYgeW91IGRvbid0IGNhcmUgYWJvdXQgZm9ybWF0dGluZywgeW91IGNhbiB1c2UgdGhlIG1vcmUKKy8vIHJlc3RyaWN0aXZlIHZlcnNpb246CisvLworLy8gICBBU1NFUlRfUFJFRDEocHJlZCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpCisvLyAgIC4uLgorLy8KKy8vIHdoZXJlIHByZWQgaXMgYW4gbi1hcnkgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHJldHVybnMgYm9vbCwKKy8vIGFuZCB0aGUgdmFsdWVzIHYxLCB2MiwgLi4uLCBtdXN0IHN1cHBvcnQgdGhlIDw8IG9wZXJhdG9yIGZvcgorLy8gc3RyZWFtaW5nIHRvIHN0ZDo6b3N0cmVhbS4KKy8vCisvLyBXZSBhbHNvIGRlZmluZSB0aGUgRVhQRUNUXyogdmFyaWF0aW9ucy4KKy8vCisvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBwcmVkaWNhdGVzIHdob3NlIGFyaXR5IGlzIGF0IG1vc3QgNS4KKy8vIFBsZWFzZSBlbWFpbCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKKy8vIHN1cHBvcnQgZm9yIGhpZ2hlciBhcml0aWVzLgorCisvLyBHVEVTVF9BU1NFUlRfIGlzIHRoZSBiYXNpYyBzdGF0ZW1lbnQgdG8gd2hpY2ggYWxsIG9mIHRoZSBhc3NlcnRpb25zCisvLyBpbiB0aGlzIGZpbGUgcmVkdWNlLiAgRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorCisjZGVmaW5lIEdURVNUX0FTU0VSVF8oZXhwcmVzc2lvbiwgb25fZmFpbHVyZSkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmIChjb25zdCA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBndGVzdF9hciA9IChleHByZXNzaW9uKSkgXAorICAgIDsgXAorICBlbHNlIFwKKyAgICBvbl9mYWlsdXJlKGd0ZXN0X2FyLmZhaWx1cmVfbWVzc2FnZSgpKQorCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMS4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMT4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkMUhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSkgeworICBpZiAocHJlZCh2MSkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjE7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMS4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQxXyhwcmVkX2Zvcm1hdCwgdjEsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgdjEpLCBcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDEuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDFIZWxwZXIoI3ByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEpLCBvbl9mYWlsdXJlKQorCisvLyBVbmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQxXyhwcmVkX2Zvcm1hdCwgdjEsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDEocHJlZCwgdjEpIFwKKyAgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQxXyhwcmVkX2Zvcm1hdCwgdjEsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRDEocHJlZCwgdjEpIFwKKyAgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMi4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMj4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkMkhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIpIHsKKyAgaWYgKHByZWQodjEsIHYyKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjI7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMi4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgdjEsIHYyKSwgXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQyLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2Miwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMkhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiksIG9uX2ZhaWx1cmUpCisKKy8vIEJpbmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEMihwcmVkLCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2MiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRDIocHJlZCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQzLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQzSGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMpIHsKKyAgaWYgKHByZWQodjEsIHYyLCB2MykpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MzsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQzLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCB2MSwgdjIsIHYzKSwgXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQzLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDNIZWxwZXIoI3ByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMpLCBvbl9mYWlsdXJlKQorCisvLyBUZXJuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQzKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDMocHJlZCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2MywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDMocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENC4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMiwKKyAgICAgICAgICB0eXBlbmFtZSBUMywKKyAgICAgICAgICB0eXBlbmFtZSBUND4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkNEhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCkgeworICBpZiAocHJlZCh2MSwgdjIsIHYzLCB2NCkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTQgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGU0IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjQ7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNC4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQ0XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsICN2NCwgdjEsIHYyLCB2MywgdjQpLCBcCisgICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDQuICBEb24ndCB1c2UKKy8vIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDRIZWxwZXIoI3ByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjQpLCBvbl9mYWlsdXJlKQorCisvLyA0LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUNChwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQ0XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDQocHJlZCwgdjEsIHYyLCB2MywgdjQpIFwKKyAgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUNChwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQ0XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRDQocHJlZCwgdjEsIHYyLCB2MywgdjQpIFwKKyAgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENS4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMiwKKyAgICAgICAgICB0eXBlbmFtZSBUMywKKyAgICAgICAgICB0eXBlbmFtZSBUNCwKKyAgICAgICAgICB0eXBlbmFtZSBUNT4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkNUhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNSYgdjUpIHsKKyAgaWYgKHByZWQodjEsIHYyLCB2MywgdjQsIHY1KSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNCA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTUgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGU0IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGU1IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjU7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNS4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBvbl9mYWlsdXJlKVwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCAjdjQsICN2NSwgdjEsIHYyLCB2MywgdjQsIHY1KSwgXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ1LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNUhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NSksIG9uX2ZhaWx1cmUpCisKKy8vIDUtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQ1KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgRVhQRUNUX1BSRUQ1KHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUNShwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVENShwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4MGRkYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgZGVmaW5pdGlvbnMgdXNlZnVsIGluIHByb2R1Y3Rpb24gY29kZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCisKKy8vIFdoZW4geW91IG5lZWQgdG8gdGVzdCB0aGUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgbWVtYmVycyBvZiBhIGNsYXNzLAorLy8gdXNlIHRoZSBGUklFTkRfVEVTVCBtYWNybyB0byBkZWNsYXJlIHlvdXIgdGVzdHMgYXMgZnJpZW5kcyBvZiB0aGUKKy8vIGNsYXNzLiAgRm9yIGV4YW1wbGU6CisvLworLy8gY2xhc3MgTXlDbGFzcyB7CisvLyAgcHJpdmF0ZToKKy8vICAgdm9pZCBNeU1ldGhvZCgpOworLy8gICBGUklFTkRfVEVTVChNeUNsYXNzVGVzdCwgTXlNZXRob2QpOworLy8gfTsKKy8vCisvLyBjbGFzcyBNeUNsYXNzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgLy8gLi4uCisvLyB9OworLy8KKy8vIFRFU1RfRihNeUNsYXNzVGVzdCwgTXlNZXRob2QpIHsKKy8vICAgLy8gQ2FuIGNhbGwgTXlDbGFzczo6TXlNZXRob2QoKSBoZXJlLgorLy8gfQorCisjZGVmaW5lIEZSSUVORF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAorZnJpZW5kIGNsYXNzIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0CisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcG9ydC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc0NGJkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXBvcnQuaApAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gSW5qZWN0aW9uIHBvaW50IGZvciBjdXN0b20gdXNlciBjb25maWd1cmF0aW9ucy4KKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNhbiBiZSBkZWZpbmVkOgorLy8KKy8vICAgRmxhZyByZWxhdGVkIG1hY3JvczoKKy8vICAgICBHVEVTVF9GTEFHKGZsYWdfbmFtZSkKKy8vICAgICBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfICAtIERlZmluZSB0byAwIHdoZW4gdGhlIHN5c3RlbSBwcm92aWRlcyBpdHMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93biBmbGFnZmlsZSBmbGFnIHBhcnNpbmcuCisvLyAgICAgR1RFU1RfREVDTEFSRV9ib29sXyhuYW1lKQorLy8gICAgIEdURVNUX0RFQ0xBUkVfaW50MzJfKG5hbWUpCisvLyAgICAgR1RFU1RfREVDTEFSRV9zdHJpbmdfKG5hbWUpCisvLyAgICAgR1RFU1RfREVGSU5FX2Jvb2xfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpCisvLyAgICAgR1RFU1RfREVGSU5FX2ludDMyXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQorLy8gICAgIEdURVNUX0RFRklORV9zdHJpbmdfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpCisvLworLy8gICBUZXN0IGZpbHRlcmluZzoKKy8vICAgICBHVEVTVF9URVNUX0ZJTFRFUl9FTlZfVkFSXyAtIFRoZSBuYW1lIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBpZiAtLUdURVNUX0ZMQUcodGVzdF9maWx0ZXIpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgcHJvdmlkZWQuCisvLworLy8gICBMb2dnaW5nOgorLy8gICAgIEdURVNUX0xPR18oc2V2ZXJpdHkpCisvLyAgICAgR1RFU1RfQ0hFQ0tfKGNvbmRpdGlvbikKKy8vICAgICBGdW5jdGlvbnMgTG9nVG9TdGRlcnIoKSBhbmQgRmx1c2hJbmZvTG9nKCkgaGF2ZSB0byBiZSBwcm92aWRlZCB0b28uCisvLworLy8gICBUaHJlYWRpbmc6CisvLyAgICAgR1RFU1RfSEFTX05PVElGSUNBVElPTl8gLSBFbmFibGVkIGlmIE5vdGlmaWNhdGlvbiBpcyBhbHJlYWR5IHByb3ZpZGVkLgorLy8gICAgIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXyAtIEVuYWJsZWQgaWYgTXV0ZXggYW5kIFRocmVhZExvY2FsIGFyZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgcHJvdmlkZWQuCisvLyAgICAgTXVzdCBhbHNvIHByb3ZpZGUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBhbmQKKy8vICAgICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkKKy8vCisvLyAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGxvY2tzKQorLy8gICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGxvY2tzKQorLy8KKy8vICoqIEN1c3RvbSBpbXBsZW1lbnRhdGlvbiBzdGFydHMgaGVyZSAqKgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BPUlRfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9DVVNUT01fR1RFU1RfUE9SVF9IXworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wcmludGVycy5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXByaW50ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjMWVhMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wcmludGVycy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYW4gaW5qZWN0aW9uIHBvaW50IGZvciBjdXN0b20gcHJpbnRlcnMgaW4gYSBsb2NhbAorLy8gaW5zdGFsbGF0aW9uIG9mIGdUZXN0LgorLy8gSXQgd2lsbCBiZSBpbmNsdWRlZCBmcm9tIGd0ZXN0LXByaW50ZXJzLmggYW5kIHRoZSBvdmVycmlkZXMgaW4gdGhpcyBmaWxlCisvLyB3aWxsIGJlIHZpc2libGUgdG8gZXZlcnlvbmUuCisvLyBTZWUgZG9jdW1lbnRhdGlvbiBhdCBndGVzdC9ndGVzdC1wcmludGVycy5oIGZvciBkZXRhaWxzIG9uIGhvdyB0byBkZWZpbmUgYQorLy8gY3VzdG9tIHByaW50ZXIuCisvLworLy8gKiogQ3VzdG9tIGltcGxlbWVudGF0aW9uIHN0YXJ0cyBoZXJlICoqCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9DVVNUT01fR1RFU1RfUFJJTlRFUlNfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9DVVNUT01fR1RFU1RfUFJJTlRFUlNfSF8KKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QUklOVEVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjc0MTJhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEluamVjdGlvbiBwb2ludCBmb3IgY3VzdG9tIHVzZXIgY29uZmlndXJhdGlvbnMuCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgZGVmaW5lZDoKKy8vCisvLyBHVEVTVF9PU19TVEFDS19UUkFDRV9HRVRURVJfICAtIFRoZSBuYW1lIG9mIGFuIGltcGxlbWVudGF0aW9uIG9mCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZS4KKy8vCisvLyAqKiBDdXN0b20gaW1wbGVtZW50YXRpb24gc3RhcnRzIGhlcmUgKioKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9IXworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzYTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaApAQCAtMCwwICsxLDMxOSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCBlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIGludGVybmFsIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZworLy8gZGVhdGggdGVzdHMuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworR1RFU1RfREVDTEFSRV9zdHJpbmdfKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKKworLy8gTmFtZXMgb2YgdGhlIGZsYWdzIChuZWVkZWQgZm9yIHBhcnNpbmcgR29vZ2xlIFRlc3QgZmxhZ3MpLgorY29uc3QgY2hhciBrRGVhdGhUZXN0U3R5bGVGbGFnW10gPSAiZGVhdGhfdGVzdF9zdHlsZSI7Citjb25zdCBjaGFyIGtEZWF0aFRlc3RVc2VGb3JrW10gPSAiZGVhdGhfdGVzdF91c2VfZm9yayI7Citjb25zdCBjaGFyIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWdbXSA9ICJpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCI7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBEZWF0aFRlc3QgaXMgYSBjbGFzcyB0aGF0IGhpZGVzIG11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhlCisvLyBHVEVTVF9ERUFUSF9URVNUXyBtYWNyby4gIEl0IGlzIGFic3RyYWN0OyBpdHMgc3RhdGljIENyZWF0ZSBtZXRob2QKKy8vIHJldHVybnMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGRlcGVuZHMgb24gdGhlIHByZXZhaWxpbmcgZGVhdGggdGVzdAorLy8gc3R5bGUsIGFzIGRlZmluZWQgYnkgdGhlIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBhbmQvb3IKKy8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3MuCisKKy8vIEluIGRlc2NyaWJpbmcgdGhlIHJlc3VsdHMgb2YgZGVhdGggdGVzdHMsIHRoZXNlIHRlcm1zIGFyZSB1c2VkIHdpdGgKKy8vIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluaXRpb25zOgorLy8KKy8vIGV4aXQgc3RhdHVzOiAgVGhlIGludGVnZXIgZXhpdCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZAorLy8gICAgICAgICAgICAgICBieSB3YWl0KDIpCisvLyBleGl0IGNvZGU6ICAgIFRoZSBpbnRlZ2VyIGNvZGUgcGFzc2VkIHRvIGV4aXQoMyksIF9leGl0KDIpLCBvcgorLy8gICAgICAgICAgICAgICByZXR1cm5lZCBmcm9tIG1haW4oKQorY2xhc3MgR1RFU1RfQVBJXyBEZWF0aFRlc3QgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIHJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGRldGVybWluaW5nIHRoZQorICAvLyBhcHByb3ByaWF0ZSBhY3Rpb24gdG8gdGFrZSBmb3IgdGhlIGN1cnJlbnQgZGVhdGggdGVzdDsgZm9yIGV4YW1wbGUsCisgIC8vIGlmIHRoZSBndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGZsYWcgaXMgc2V0IHRvIGFuIGludmFsaWQgdmFsdWUuCisgIC8vIFRoZSBMYXN0TWVzc2FnZSBtZXRob2Qgd2lsbCByZXR1cm4gYSBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgaW4gdGhhdAorICAvLyBjYXNlLiAgT3RoZXJ3aXNlLCB0aGUgRGVhdGhUZXN0IHBvaW50ZXIgcG9pbnRlZCB0byBieSB0aGUgInRlc3QiCisgIC8vIGFyZ3VtZW50IGlzIHNldC4gIElmIHRoZSBkZWF0aCB0ZXN0IHNob3VsZCBiZSBza2lwcGVkLCB0aGUgcG9pbnRlcgorICAvLyBpcyBzZXQgdG8gTlVMTDsgb3RoZXJ3aXNlLCBpdCBpcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgYSBuZXcgY29uY3JldGUKKyAgLy8gRGVhdGhUZXN0IG9iamVjdCB0aGF0IGNvbnRyb2xzIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgdGVzdC4KKyAgc3RhdGljIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOworICBEZWF0aFRlc3QoKTsKKyAgdmlydHVhbCB+RGVhdGhUZXN0KCkgeyB9CisKKyAgLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBhYm9ydHMgYSBkZWF0aCB0ZXN0IHdoZW4gaXQncyBkZWxldGVkLgorICBjbGFzcyBSZXR1cm5TZW50aW5lbCB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgUmV0dXJuU2VudGluZWwoRGVhdGhUZXN0KiB0ZXN0KSA6IHRlc3RfKHRlc3QpIHsgfQorICAgIH5SZXR1cm5TZW50aW5lbCgpIHsgdGVzdF8tPkFib3J0KFRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCk7IH0KKyAgIHByaXZhdGU6CisgICAgRGVhdGhUZXN0KiBjb25zdCB0ZXN0XzsKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFJldHVyblNlbnRpbmVsKTsKKyAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKworICAvLyBBbiBlbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByb2xlcyB0aGF0IG1heSBiZSB0YWtlbiB3aGVuIGEgZGVhdGgKKyAgLy8gdGVzdCBpcyBlbmNvdW50ZXJlZC4gIEVYRUNVVEUgbWVhbnMgdGhhdCB0aGUgZGVhdGggdGVzdCBsb2dpYyBzaG91bGQKKyAgLy8gYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuICBPVkVSU0VFIG1lYW5zIHRoYXQgdGhlIHByb2dyYW0gc2hvdWxkIHByZXBhcmUKKyAgLy8gdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IGZvciBhIGNoaWxkIHByb2Nlc3MgdG8gZXhlY3V0ZSB0aGUgZGVhdGgKKyAgLy8gdGVzdCwgdGhlbiB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KKyAgZW51bSBUZXN0Um9sZSB7IE9WRVJTRUVfVEVTVCwgRVhFQ1VURV9URVNUIH07CisKKyAgLy8gQW4gZW51bWVyYXRpb24gb2YgdGhlIHRocmVlIHJlYXNvbnMgdGhhdCBhIHRlc3QgbWlnaHQgYmUgYWJvcnRlZC4KKyAgZW51bSBBYm9ydFJlYXNvbiB7CisgICAgVEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5ULAorICAgIFRFU1RfVEhSRVdfRVhDRVBUSU9OLAorICAgIFRFU1RfRElEX05PVF9ESUUKKyAgfTsKKworICAvLyBBc3N1bWVzIG9uZSBvZiB0aGUgYWJvdmUgcm9sZXMuCisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpID0gMDsKKworICAvLyBXYWl0cyBmb3IgdGhlIGRlYXRoIHRlc3QgdG8gZmluaXNoIGFuZCByZXR1cm5zIGl0cyBzdGF0dXMuCisgIHZpcnR1YWwgaW50IFdhaXQoKSA9IDA7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkZWF0aCB0ZXN0IHBhc3NlZDsgdGhhdCBpcywgdGhlIHRlc3QgcHJvY2VzcworICAvLyBleGl0ZWQgZHVyaW5nIHRoZSB0ZXN0LCBpdHMgZXhpdCBzdGF0dXMgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQKKyAgLy8gcHJlZGljYXRlLCBhbmQgaXRzIHN0ZGVyciBvdXRwdXQgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQgcmVndWxhcgorICAvLyBleHByZXNzaW9uLgorICAvLyBUaGUgdXNlci1zdXBwbGllZCBwcmVkaWNhdGUgbWF5IGJlIGEgbWFjcm8gZXhwcmVzc2lvbiByYXRoZXIKKyAgLy8gdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgZnVuY3Rvciwgb3IgZWxzZSBXYWl0IGFuZCBQYXNzZWQgY291bGQKKyAgLy8gYmUgY29tYmluZWQuCisgIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBleGl0X3N0YXR1c19vaykgPSAwOworCisgIC8vIFNpZ25hbHMgdGhhdCB0aGUgZGVhdGggdGVzdCBkaWQgbm90IGRpZSBhcyBleHBlY3RlZC4KKyAgdmlydHVhbCB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgPSAwOworCisgIC8vIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBvdXRjb21lIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBvdXRjb21lIG9mCisgIC8vIHRoZSBsYXN0IGRlYXRoIHRlc3QuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBMYXN0TWVzc2FnZSgpOworCisgIHN0YXRpYyB2b2lkIHNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7CisKKyBwcml2YXRlOgorICAvLyBBIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIG91dGNvbWUgb2YgdGhlIGxhc3QgZGVhdGggdGVzdC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlYXRoVGVzdCk7Cit9OworCisvLyBGYWN0b3J5IGludGVyZmFjZSBmb3IgZGVhdGggdGVzdHMuICBNYXkgYmUgbW9ja2VkIG91dCBmb3IgdGVzdGluZy4KK2NsYXNzIERlYXRoVGVzdEZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RGVhdGhUZXN0RmFjdG9yeSgpIHsgfQorICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSA9IDA7Cit9OworCisvLyBBIGNvbmNyZXRlIERlYXRoVGVzdEZhY3RvcnkgaW1wbGVtZW50YXRpb24gZm9yIG5vcm1hbCB1c2UuCitjbGFzcyBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeSA6IHB1YmxpYyBEZWF0aFRlc3RGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOworfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAorLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCitHVEVTVF9BUElfIGJvb2wgRXhpdGVkVW5zdWNjZXNzZnVsbHkoaW50IGV4aXRfc3RhdHVzKTsKKworLy8gVHJhcHMgQysrIGV4Y2VwdGlvbnMgZXNjYXBpbmcgc3RhdGVtZW50IGFuZCByZXBvcnRzIHRoZW0gYXMgdGVzdAorLy8gZmFpbHVyZXMuIE5vdGUgdGhhdCB0cmFwcGluZyBTRUggZXhjZXB0aW9ucyBpcyBub3QgaW1wbGVtZW50ZWQgaGVyZS4KKyMgaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGRlYXRoX3Rlc3QpIFwKKyAgdHJ5IHsgXAorICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAorICB9IGNhdGNoIChjb25zdCA6OnN0ZDo6ZXhjZXB0aW9uJiBndGVzdF9leGNlcHRpb24pIHsgXAorICAgIGZwcmludGYoXAorICAgICAgICBzdGRlcnIsIFwKKyAgICAgICAgIlxuJXM6IENhdWdodCBzdGQ6OmV4Y2VwdGlvbi1kZXJpdmVkIGV4Y2VwdGlvbiBlc2NhcGluZyB0aGUgIiBcCisgICAgICAgICJkZWF0aCB0ZXN0IHN0YXRlbWVudC4gRXhjZXB0aW9uIG1lc3NhZ2U6ICVzXG4iLCBcCisgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLmNfc3RyKCksIFwKKyAgICAgICAgZ3Rlc3RfZXhjZXB0aW9uLndoYXQoKSk7IFwKKyAgICBmZmx1c2goc3RkZXJyKTsgXAorICAgIGRlYXRoX3Rlc3QtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9USFJFV19FWENFUFRJT04pOyBcCisgIH0gY2F0Y2ggKC4uLikgeyBcCisgICAgZGVhdGhfdGVzdC0+QWJvcnQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpURVNUX1RIUkVXX0VYQ0VQVElPTik7IFwKKyAgfQorCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGRlYXRoX3Rlc3QpIFwKKyAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpCisKKyMgZW5kaWYKKworLy8gVGhpcyBtYWNybyBpcyBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ERUFUSCosIEVYUEVDVF9ERUFUSCosCisvLyBBU1NFUlRfRVhJVCosIGFuZCBFWFBFQ1RfRVhJVCouCisjIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpSRSYgZ3Rlc3RfcmVnZXggPSAocmVnZXgpOyBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0KiBndGVzdF9kdDsgXAorICAgIGlmICghOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpDcmVhdGUoI3N0YXRlbWVudCwgJmd0ZXN0X3JlZ2V4LCBcCisgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgJmd0ZXN0X2R0KSkgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgICBpZiAoZ3Rlc3RfZHQgIT0gTlVMTCkgeyBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyPCA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q+IFwKKyAgICAgICAgICBndGVzdF9kdF9wdHIoZ3Rlc3RfZHQpOyBcCisgICAgICBzd2l0Y2ggKGd0ZXN0X2R0LT5Bc3N1bWVSb2xlKCkpIHsgXAorICAgICAgICBjYXNlIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6T1ZFUlNFRV9URVNUOiBcCisgICAgICAgICAgaWYgKCFndGVzdF9kdC0+UGFzc2VkKHByZWRpY2F0ZShndGVzdF9kdC0+V2FpdCgpKSkpIHsgXAorICAgICAgICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcCisgICAgICAgICAgfSBcCisgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OkVYRUNVVEVfVEVTVDogeyBcCisgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpSZXR1cm5TZW50aW5lbCBcCisgICAgICAgICAgICAgIGd0ZXN0X3NlbnRpbmVsKGd0ZXN0X2R0KTsgXAorICAgICAgICAgIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZ3Rlc3RfZHQpOyBcCisgICAgICAgICAgZ3Rlc3RfZHQtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9ESURfTk9UX0RJRSk7IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgICAgZGVmYXVsdDogXAorICAgICAgICAgIGJyZWFrOyBcCisgICAgICB9IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6TGFzdE1lc3NhZ2UoKSkKKy8vIFRoZSBzeW1ib2wgImZhaWwiIGhlcmUgZXhwYW5kcyB0byBzb21ldGhpbmcgaW50byB3aGljaCBhIG1lc3NhZ2UKKy8vIGNhbiBiZSBzdHJlYW1lZC4KKworLy8gVGhpcyBtYWNybyBpcyBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVC9FWFBFQ1RfREVCVUdfREVBVEggd2hlbiBjb21waWxlZCBpbgorLy8gTkRFQlVHIG1vZGUuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRoZSBzdGF0ZW1lbnRzIHRvIGJlIGV4ZWN1dGVkLCB0aGUgcmVnZXggaXMKKy8vIGlnbm9yZWQsIGFuZCB0aGUgbWFjcm8gbXVzdCBhY2NlcHQgYSBzdHJlYW1lZCBtZXNzYWdlIGV2ZW4gdGhvdWdoIHRoZSBtZXNzYWdlCisvLyBpcyBuZXZlciBwcmludGVkLgorIyBkZWZpbmUgR1RFU1RfRVhFQ1VURV9TVEFURU1FTlRfKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKKyAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgIH0gZWxzZSBcCisgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKworLy8gQSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIHBhcnNlZCBjb250ZW50cyBvZiB0aGUKKy8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZywgYXMgaXQgZXhpc3RlZCB3aGVuCisvLyBSVU5fQUxMX1RFU1RTIHdhcyBjYWxsZWQuCitjbGFzcyBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgeworIHB1YmxpYzoKKyAgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYV9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFuX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfd3JpdGVfZmQpCisgICAgICA6IGZpbGVfKGFfZmlsZSksIGxpbmVfKGFfbGluZSksIGluZGV4Xyhhbl9pbmRleCksCisgICAgICAgIHdyaXRlX2ZkXyhhX3dyaXRlX2ZkKSB7fQorCisgIH5JbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7CisgICAgaWYgKHdyaXRlX2ZkXyA+PSAwKQorICAgICAgcG9zaXg6OkNsb3NlKHdyaXRlX2ZkXyk7CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9CisgIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KKyAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1cm4gaW5kZXhfOyB9CisgIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgZmlsZV87CisgIGludCBsaW5lXzsKKyAgaW50IGluZGV4XzsKKyAgaW50IHdyaXRlX2ZkXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyk7Cit9OworCisvLyBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgb2JqZWN0IHdpdGggZmllbGRzCisvLyBpbml0aWFsaXplZCBmcm9tIHRoZSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSBmbGFnIGlmCisvLyB0aGUgZmxhZyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSByZXR1cm5zIE5VTEwuCitJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCk7CisKKyNlbHNlICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGltcGxlbWVudGluZyBtYWNyb3Mgc3VjaCBhcworLy8gRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCBhbmQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBvbiBzeXN0ZW1zIHdoZXJlCisvLyBkZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4gVGhvc2UgbWFjcm9zIG11c3QgY29tcGlsZSBvbiBzdWNoIHN5c3RlbXMKKy8vIGlmZiBFWFBFQ1RfREVBVEggYW5kIEFTU0VSVF9ERUFUSCBjb21waWxlIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBvbgorLy8gc3lzdGVtcyB0aGF0IHN1cHBvcnQgZGVhdGggdGVzdHMuIFRoaXMgYWxsb3dzIG9uZSB0byB3cml0ZSBzdWNoIGEgbWFjcm8KKy8vIG9uIGEgc3lzdGVtIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBkZWF0aCB0ZXN0cyBhbmQgYmUgc3VyZSB0aGF0IGl0IHdpbGwKKy8vIGNvbXBpbGUgb24gYSBkZWF0aC10ZXN0IHN1cHBvcnRpbmcgc3lzdGVtLgorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgIHN0YXRlbWVudCAtICBBIHN0YXRlbWVudCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdGVzdAorLy8gICAgICAgICAgICAgICAgZm9yIHByb2dyYW0gdGVybWluYXRpb24uIFRoaXMgbWFjcm8gaGFzIHRvIG1ha2Ugc3VyZSB0aGlzCisvLyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgaXMgY29tcGlsZWQgYnV0IG5vdCBleGVjdXRlZCwgdG8gZW5zdXJlIHRoYXQKKy8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgY29tcGlsZXMgd2l0aCBhIGNlcnRhaW4KKy8vICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpZmYgRVhQRUNUX0RFQVRIIGNvbXBpbGVzIHdpdGggaXQuCisvLyAgIHJlZ2V4ICAgICAtICBBIHJlZ2V4IHRoYXQgYSBtYWNybyBzdWNoIGFzIEVYUEVDVF9ERUFUSCB3b3VsZCB1c2UgdG8gdGVzdAorLy8gICAgICAgICAgICAgICAgdGhlIG91dHB1dCBvZiBzdGF0ZW1lbnQuICBUaGlzIHBhcmFtZXRlciBoYXMgdG8gYmUKKy8vICAgICAgICAgICAgICAgIGNvbXBpbGVkIGJ1dCBub3QgZXZhbHVhdGVkIGJ5IHRoaXMgbWFjcm8sIHRvIGVuc3VyZSB0aGF0CisvLyAgICAgICAgICAgICAgICB0aGlzIG1hY3JvIG9ubHkgYWNjZXB0cyBleHByZXNzaW9ucyB0aGF0IGEgbWFjcm8gc3VjaCBhcworLy8gICAgICAgICAgICAgICAgRVhQRUNUX0RFQVRIIHdvdWxkIGFjY2VwdC4KKy8vICAgdGVybWluYXRvciAtIE11c3QgYmUgYW4gZW1wdHkgc3RhdGVtZW50IGZvciBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVECisvLyAgICAgICAgICAgICAgICBhbmQgYSByZXR1cm4gc3RhdGVtZW50IGZvciBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVELgorLy8gICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCB3aWxsIG5vdAorLy8gICAgICAgICAgICAgICAgY29tcGlsZSBpbnNpZGUgZnVuY3Rpb25zIHdoZXJlIEFTU0VSVF9ERUFUSCBkb2Vzbid0CisvLyAgICAgICAgICAgICAgICBjb21waWxlLgorLy8KKy8vICBUaGUgYnJhbmNoIHRoYXQgaGFzIGFuIGFsd2F5cyBmYWxzZSBjb25kaXRpb24gaXMgdXNlZCB0byBlbnN1cmUgdGhhdAorLy8gIHN0YXRlbWVudCBhbmQgcmVnZXggYXJlIGNvbXBpbGVkIChhbmQgdGh1cyBzeW50YWN0aWNhbGx5IGNvcnJlY3QpIGJ1dAorLy8gIG5ldmVyIGV4ZWN1dGVkLiBUaGUgdW5yZWFjaGFibGUgY29kZSBtYWNybyBwcm90ZWN0cyB0aGUgdGVybWluYXRvcgorLy8gIHN0YXRlbWVudCBmcm9tIGdlbmVyYXRpbmcgYW4gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgaW4gY2FzZQorLy8gIHN0YXRlbWVudCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJucyBvciB0aHJvd3MuIFRoZSBNZXNzYWdlIGNvbnN0cnVjdG9yIGF0CisvLyAgdGhlIGVuZCBhbGxvd3MgdGhlIHN5bnRheCBvZiBzdHJlYW1pbmcgYWRkaXRpb25hbCBtZXNzYWdlcyBpbnRvIHRoZQorLy8gIG1hY3JvLCBmb3IgY29tcGlsYXRpb25hbCBjb21wYXRpYmlsaXR5IHdpdGggRVhQRUNUX0RFQVRIL0FTU0VSVF9ERUFUSC4KKyMgZGVmaW5lIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHRlcm1pbmF0b3IpIFwKKyAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIFwKKyAgICAgICAgICA8PCAiRGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS5cbiIgXAorICAgICAgICAgIDw8ICJTdGF0ZW1lbnQgJyIgI3N0YXRlbWVudCAiJyBjYW5ub3QgYmUgdmVyaWZpZWQuIjsgXAorICAgIH0gZWxzZSBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkgeyBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpSRTo6UGFydGlhbE1hdGNoKCIuKiIsIChyZWdleCkpOyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICAgIHRlcm1pbmF0b3I7IFwKKyAgICB9IGVsc2UgXAorICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEzYjRiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaApAQCAtMCwwICsxLDIwNiBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIEdvb2dsZSBUZXN0IGZpbGVwYXRoIHV0aWxpdGllcworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQorLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KKy8vCisvLyBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGluIDxndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oPi4KKy8vIERvIG5vdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGZpbGUgc2VwYXJhdGVseSEKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBGaWxlUGF0aCAtIGEgY2xhc3MgZm9yIGZpbGUgYW5kIGRpcmVjdG9yeSBwYXRobmFtZSBtYW5pcHVsYXRpb24gd2hpY2gKKy8vIGhhbmRsZXMgcGxhdGZvcm0tc3BlY2lmaWMgY29udmVudGlvbnMgKGxpa2UgdGhlIHBhdGhuYW1lIHNlcGFyYXRvcikuCisvLyBVc2VkIGZvciBoZWxwZXIgZnVuY3Rpb25zIGZvciBuYW1pbmcgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZm9yIHhtbCBvdXRwdXQuCisvLyBFeGNlcHQgZm9yIFNldCBtZXRob2RzLCBhbGwgbWV0aG9kcyBhcmUgY29uc3Qgb3Igc3RhdGljLCB3aGljaCBwcm92aWRlcyBhbgorLy8gImltbXV0YWJsZSB2YWx1ZSBvYmplY3QiIC0tIHVzZWZ1bCBmb3IgcGVhY2Ugb2YgbWluZC4KKy8vIEEgRmlsZVBhdGggd2l0aCBhIHZhbHVlIGVuZGluZyBpbiBhIHBhdGggc2VwYXJhdG9yICgibGlrZS90aGlzLyIpIHJlcHJlc2VudHMKKy8vIGEgZGlyZWN0b3J5LCBvdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0byByZXByZXNlbnQgYSBmaWxlLiBJbiBlaXRoZXIgY2FzZSwKKy8vIGl0IG1heSBvciBtYXkgbm90IHJlcHJlc2VudCBhbiBhY3R1YWwgZmlsZSBvciBkaXJlY3RvcnkgaW4gdGhlIGZpbGUgc3lzdGVtLgorLy8gTmFtZXMgYXJlIE5PVCBjaGVja2VkIGZvciBzeW50YXggY29ycmVjdG5lc3MgLS0gbm8gY2hlY2tpbmcgZm9yIGlsbGVnYWwKKy8vIGNoYXJhY3RlcnMsIG1hbGZvcm1lZCBwYXRocywgZXRjLgorCitjbGFzcyBHVEVTVF9BUElfIEZpbGVQYXRoIHsKKyBwdWJsaWM6CisgIEZpbGVQYXRoKCkgOiBwYXRobmFtZV8oIiIpIHsgfQorICBGaWxlUGF0aChjb25zdCBGaWxlUGF0aCYgcmhzKSA6IHBhdGhuYW1lXyhyaHMucGF0aG5hbWVfKSB7IH0KKworICBleHBsaWNpdCBGaWxlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aG5hbWUpIDogcGF0aG5hbWVfKHBhdGhuYW1lKSB7CisgICAgTm9ybWFsaXplKCk7CisgIH0KKworICBGaWxlUGF0aCYgb3BlcmF0b3I9KGNvbnN0IEZpbGVQYXRoJiByaHMpIHsKKyAgICBTZXQocmhzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIFNldChjb25zdCBGaWxlUGF0aCYgcmhzKSB7CisgICAgcGF0aG5hbWVfID0gcmhzLnBhdGhuYW1lXzsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmcoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV87IH0KKyAgY29uc3QgY2hhciogY19zdHIoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yICIiIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgc3RhdGljIEZpbGVQYXRoIEdldEN1cnJlbnREaXIoKTsKKworICAvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgYmFzZV9uYW1lID0gInRlc3QiLCBudW1iZXIgPSAwLAorICAvLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXIKKyAgLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCisgIHN0YXRpYyBGaWxlUGF0aCBNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKTsKKworICAvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsCisgIC8vIHJldHVybnMgImRpci90ZXN0LnhtbCIuCisgIC8vIE9uIFdpbmRvd3MsIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCisgIHN0YXRpYyBGaWxlUGF0aCBDb25jYXRQYXRocyhjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpOworCisgIC8vIFJldHVybnMgYSBwYXRobmFtZSBmb3IgYSBmaWxlIHRoYXQgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiBUaGUgcGF0aG5hbWUKKyAgLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcgorICAvLyBkaXJlY3RvcnkvYmFzZV9uYW1lXzxudW1iZXI+LmV4dGVuc2lvbiBpZiBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbgorICAvLyBhbHJlYWR5IGV4aXN0cy4gVGhlIG51bWJlciB3aWxsIGJlIGluY3JlbWVudGVkIHVudGlsIGEgcGF0aG5hbWUgaXMgZm91bmQKKyAgLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICAvLyBFeGFtcGxlczogJ2Rpci9mb29fdGVzdC54bWwnIG9yICdkaXIvZm9vX3Rlc3RfMS54bWwnLgorICAvLyBUaGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGlmIHR3byBvciBtb3JlIHByb2Nlc3NlcyBhcmUgY2FsbGluZyB0aGlzCisgIC8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuCisgIHN0YXRpYyBGaWxlUGF0aCBHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgcGF0aCBpcyAiIi4KKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gcGF0aG5hbWVfLmVtcHR5KCk7IH0KKworICAvLyBJZiBpbnB1dCBuYW1lIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIsIHJlbW92ZXMgaXQgYW5kIHJldHVybnMKKyAgLy8gdGhlIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gdGhlIG5hbWUgc3RyaW5nIHVubW9kaWZpZWQuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yLCBvdGhlciBwbGF0Zm9ybXMgdXNlIC8uCisgIEZpbGVQYXRoIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpIGNvbnN0OworCisgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBkaXJlY3RvcnkgcGFydCByZW1vdmVkLgorICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpIHJldHVybnMKKyAgLy8gRmlsZVBhdGgoImZpbGUiKS4gSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IHBhcnQgKCJqdXN0X2FfZmlsZSIpLCBpdCByZXR1cm5zCisgIC8vIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLiBJZiB0aGVyZSBpcyBubyBmaWxlIHBhcnQgKCJqdXN0X2FfZGlyLyIpIGl0CisgIC8vIHJldHVybnMgYW4gZW1wdHkgRmlsZVBhdGggKCIiKS4KKyAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgJ1wnIGlzIHRoZSBwYXRoIHNlcGFyYXRvciwgb3RoZXJ3aXNlIGl0IGlzICcvJy4KKyAgRmlsZVBhdGggUmVtb3ZlRGlyZWN0b3J5TmFtZSgpIGNvbnN0OworCisgIC8vIFJlbW92ZUZpbGVOYW1lIHJldHVybnMgdGhlIGRpcmVjdG9yeSBwYXRoIHdpdGggdGhlIGZpbGVuYW1lIHJlbW92ZWQuCisgIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpIHJldHVybnMgInBhdGgvdG8vIi4KKyAgLy8gSWYgdGhlIEZpbGVQYXRoIGlzICJhX2ZpbGUiIG9yICIvYV9maWxlIiwgUmVtb3ZlRmlsZU5hbWUgcmV0dXJucworICAvLyBGaWxlUGF0aCgiLi8iKSBvciwgb24gV2luZG93cywgRmlsZVBhdGgoIi5cXCIpLiBJZiB0aGUgZmlsZXBhdGggZG9lcworICAvLyBub3QgaGF2ZSBhIGZpbGUsIGxpa2UgImp1c3QvYS9kaXIvIiwgaXQgcmV0dXJucyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4KKyAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgJ1wnIGlzIHRoZSBwYXRoIHNlcGFyYXRvciwgb3RoZXJ3aXNlIGl0IGlzICcvJy4KKyAgRmlsZVBhdGggUmVtb3ZlRmlsZU5hbWUoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gcmVtb3ZlZC4KKyAgLy8gRXhhbXBsZTogRmlsZVBhdGgoImRpci9maWxlLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiRVhFIikgcmV0dXJucworICAvLyBGaWxlUGF0aCgiZGlyL2ZpbGUiKS4gSWYgYSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiBpcyBub3QKKyAgLy8gZm91bmQsIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBGaWxlUGF0aC4KKyAgRmlsZVBhdGggUmVtb3ZlRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgY29uc3Q7CisKKyAgLy8gQ3JlYXRlcyBkaXJlY3RvcmllcyBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBpZgorICAvLyB0aGUgZGlyZWN0b3JpZXMgYWxyZWFkeSBleGlzdDsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlCisgIC8vIGRpcmVjdG9yaWVzIGZvciBhbnkgcmVhc29uLiBXaWxsIGFsc28gcmV0dXJuIGZhbHNlIGlmIHRoZSBGaWxlUGF0aCBkb2VzCisgIC8vIG5vdCByZXByZXNlbnQgYSBkaXJlY3RvcnkgKHRoYXQgaXMsIGl0IGRvZXNuJ3QgZW5kIHdpdGggYSBwYXRoIHNlcGFyYXRvcikuCisgIGJvb2wgQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGNvbnN0OworCisgIC8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yCisgIC8vIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHM7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUKKyAgLy8gZGlyZWN0b3J5IGZvciBhbnkgcmVhc29uLCBpbmNsdWRpbmcgaWYgdGhlIHBhcmVudCBkaXJlY3RvcnkgZG9lcyBub3QKKyAgLy8gZXhpc3QuIE5vdCBuYW1lZCAiQ3JlYXRlRGlyZWN0b3J5IiBiZWNhdXNlIHRoYXQncyBhIG1hY3JvIG9uIFdpbmRvd3MuCisgIGJvb2wgQ3JlYXRlRm9sZGVyKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGRlc2NyaWJlcyBzb21ldGhpbmcgaW4gdGhlIGZpbGUtc3lzdGVtLAorICAvLyBlaXRoZXIgYSBmaWxlLCBkaXJlY3RvcnksIG9yIHdoYXRldmVyLCBhbmQgdGhhdCBzb21ldGhpbmcgZXhpc3RzLgorICBib29sIEZpbGVPckRpcmVjdG9yeUV4aXN0cygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGUtc3lzdGVtCisgIC8vIHRoYXQgZXhpc3RzLgorICBib29sIERpcmVjdG9yeUV4aXN0cygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciwgd2hpY2ggaW5kaWNhdGVzIHRoYXQKKyAgLy8gaXQgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgZGlyZWN0b3J5LiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8gVGhpcyBkb2VzIE5PVCBjaGVjayB0aGF0IGEgZGlyZWN0b3J5IChvciBmaWxlKSBhY3R1YWxseSBleGlzdHMuCisgIGJvb2wgSXNEaXJlY3RvcnkoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgcm9vdCBkaXJlY3RvcnkuIChXaW5kb3dzIGhhcyBvbmUKKyAgLy8gcm9vdCBkaXJlY3RvcnkgcGVyIGRpc2sgZHJpdmUuKQorICBib29sIElzUm9vdERpcmVjdG9yeSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYW4gYWJzb2x1dGUgcGF0aC4KKyAgYm9vbCBJc0Fic29sdXRlUGF0aCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gUmVwbGFjZXMgbXVsdGlwbGUgY29uc2VjdXRpdmUgc2VwYXJhdG9ycyB3aXRoIGEgc2luZ2xlIHNlcGFyYXRvci4KKyAgLy8gRm9yIGV4YW1wbGUsICJiYXIvLy9mb28iIGJlY29tZXMgImJhci9mb28iLiBEb2VzIG5vdCBlbGltaW5hdGUgb3RoZXIKKyAgLy8gcmVkdW5kYW5jaWVzIHRoYXQgbWlnaHQgYmUgaW4gYSBwYXRobmFtZSBpbnZvbHZpbmcgIi4iIG9yICIuLiIuCisgIC8vCisgIC8vIEEgcGF0aG5hbWUgd2l0aCBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzIG1heSBvY2N1ciBlaXRoZXIgdGhyb3VnaAorICAvLyB1c2VyIGVycm9yIG9yIGFzIGEgcmVzdWx0IG9mIHNvbWUgc2NyaXB0cyBvciBBUElzIHRoYXQgZ2VuZXJhdGUgYSBwYXRobmFtZQorICAvLyB3aXRoIGEgdHJhaWxpbmcgc2VwYXJhdG9yLiBPbiBvdGhlciBwbGF0Zm9ybXMgdGhlIHNhbWUgQVBJIG9yIHNjcmlwdAorICAvLyBtYXkgTk9UIGdlbmVyYXRlIGEgcGF0aG5hbWUgd2l0aCBhIHRyYWlsaW5nICIvIi4gVGhlbiBlbHNld2hlcmUgdGhhdAorICAvLyBwYXRobmFtZSBtYXkgaGF2ZSBhbm90aGVyICIvIiBhbmQgcGF0aG5hbWUgY29tcG9uZW50cyBhZGRlZCB0byBpdCwKKyAgLy8gd2l0aG91dCBjaGVja2luZyBmb3IgdGhlIHNlcGFyYXRvciBhbHJlYWR5IGJlaW5nIHRoZXJlLgorICAvLyBUaGUgc2NyaXB0IGxhbmd1YWdlIGFuZCBvcGVyYXRpbmcgc3lzdGVtIG1heSBhbGxvdyBwYXRocyBsaWtlICJmb28vL2JhciIKKyAgLy8gYnV0IHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBpbiBGaWxlUGF0aCB3aWxsIG5vdCBoYW5kbGUgdGhhdCBjb3JyZWN0bHkuIEluCisgIC8vIHBhcnRpY3VsYXIsIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpIG9ubHkgcmVtb3ZlcyBvbmUgc2VwYXJhdG9yLCBhbmQKKyAgLy8gaXQgaXMgY2FsbGVkIGluIENyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSBhc3N1bWluZyB0aGF0IGl0IHdpbGwgY2hhbmdlCisgIC8vIGEgcGF0aG5hbWUgZnJvbSBkaXJlY3Rvcnkgc3ludGF4ICh0cmFpbGluZyBzZXBhcmF0b3IpIHRvIGZpbGVuYW1lIHN5bnRheC4KKyAgLy8KKyAgLy8gT24gV2luZG93cyB0aGlzIG1ldGhvZCBhbHNvIHJlcGxhY2VzIHRoZSBhbHRlcm5hdGUgcGF0aCBzZXBhcmF0b3IgJy8nIHdpdGgKKyAgLy8gdGhlIHByaW1hcnkgcGF0aCBzZXBhcmF0b3IgJ1xcJywgc28gdGhhdCBmb3IgZXhhbXBsZSAiYmFyXFwvXFxmb28iIGJlY29tZXMKKyAgLy8gImJhclxcZm9vIi4KKworICB2b2lkIE5vcm1hbGl6ZSgpOworCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiBhIHZhbGlkIHBhdGggc2VwYXJhdG9yIGluCisgIC8vIHRoZSBGaWxlUGF0aC4gT24gV2luZG93cywgZm9yIGV4YW1wbGUsIGJvdGggJy8nIGFuZCAnXCcgYXJlIHZhbGlkIHBhdGgKKyAgLy8gc2VwYXJhdG9ycy4gUmV0dXJucyBOVUxMIGlmIG5vIHBhdGggc2VwYXJhdG9yIHdhcyBmb3VuZC4KKyAgY29uc3QgY2hhciogRmluZExhc3RQYXRoU2VwYXJhdG9yKCkgY29uc3Q7CisKKyAgc3RkOjpzdHJpbmcgcGF0aG5hbWVfOworfTsgIC8vIGNsYXNzIEZpbGVQYXRoCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQxY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaApAQCAtMCwwICsxLDEyMzggQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaWYgR1RFU1RfT1NfTElOVVgKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvd2FpdC5oPgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisjIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oIgorCisvLyBEdWUgdG8gQysrIHByZXByb2Nlc3NvciB3ZWlyZG5lc3MsIHdlIG5lZWQgZG91YmxlIGluZGlyZWN0aW9uIHRvCisvLyBjb25jYXRlbmF0ZSB0d28gdG9rZW5zIHdoZW4gb25lIG9mIHRoZW0gaXMgX19MSU5FX18uICBXcml0aW5nCisvLworLy8gICBmb28gIyMgX19MSU5FX18KKy8vCisvLyB3aWxsIHJlc3VsdCBpbiB0aGUgdG9rZW4gZm9vX19MSU5FX18sIGluc3RlYWQgb2YgZm9vIGZvbGxvd2VkIGJ5CisvLyB0aGUgY3VycmVudCBsaW5lIG51bWJlci4gIEZvciBtb3JlIGRldGFpbHMsIHNlZQorLy8gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS9taXNjLXRlY2huaWNhbC1pc3N1ZXMuaHRtbCNmYXEtMzkuNgorI2RlZmluZSBHVEVTVF9DT05DQVRfVE9LRU5fKGZvbywgYmFyKSBHVEVTVF9DT05DQVRfVE9LRU5fSU1QTF8oZm9vLCBiYXIpCisjZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikgZm9vICMjIGJhcgorCitjbGFzcyBQcm90b2NvbE1lc3NhZ2U7CituYW1lc3BhY2UgcHJvdG8yIHsgY2xhc3MgTWVzc2FnZTsgfQorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorCitjbGFzcyBBc3NlcnRpb25SZXN1bHQ7ICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2YgYW4gYXNzZXJ0aW9uLgorY2xhc3MgTWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIGZhaWx1cmUgbWVzc2FnZS4KK2NsYXNzIFRlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcHJlc2VudHMgYSB0ZXN0LgorY2xhc3MgVGVzdEluZm87ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgYSB0ZXN0LgorY2xhc3MgVGVzdFBhcnRSZXN1bHQ7ICAgICAgICAgICAgICAgICAgLy8gUmVzdWx0IG9mIGEgdGVzdCBwYXJ0LgorY2xhc3MgVW5pdFRlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb2xsZWN0aW9uIG9mIHRlc3QgY2FzZXMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorOjpzdGQ6OnN0cmluZyBQcmludFRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworc3RydWN0IFRyYWNlSW5mbzsgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgYSB0cmFjZSBwb2ludC4KK2NsYXNzIFNjb3BlZFRyYWNlOyAgICAgICAgICAgICAgICAgICAgIC8vIEltcGxlbWVudHMgc2NvcGVkIHRyYWNlLgorY2xhc3MgVGVzdEluZm9JbXBsOyAgICAgICAgICAgICAgICAgICAgLy8gT3BhcXVlIGltcGxlbWVudGF0aW9uIG9mIFRlc3RJbmZvCitjbGFzcyBVbml0VGVzdEltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVW5pdFRlc3QKKworLy8gVGhlIHRleHQgdXNlZCBpbiBmYWlsdXJlIG1lc3NhZ2VzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiB0aGUKKy8vIHN0YWNrIHRyYWNlLgorR1RFU1RfQVBJXyBleHRlcm4gY29uc3QgY2hhciBrU3RhY2tUcmFjZU1hcmtlcltdOworCisvLyBUd28gb3ZlcmxvYWRlZCBoZWxwZXJzIGZvciBjaGVja2luZyBhdCBjb21waWxlIHRpbWUgd2hldGhlciBhbgorLy8gZXhwcmVzc2lvbiBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsIChpLmUuIE5VTEwgb3IgYW55IDAtdmFsdWVkCisvLyBjb21waWxlLXRpbWUgaW50ZWdyYWwgY29uc3RhbnQpLiAgVGhlaXIgcmV0dXJuIHZhbHVlcyBoYXZlCisvLyBkaWZmZXJlbnQgc2l6ZXMsIHNvIHdlIGNhbiB1c2Ugc2l6ZW9mKCkgdG8gdGVzdCB3aGljaCB2ZXJzaW9uIGlzCisvLyBwaWNrZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlc2UgaGVscGVycyBoYXZlIG5vIGltcGxlbWVudGF0aW9ucywgYXMKKy8vIHdlIG9ubHkgbmVlZCB0aGVpciBzaWduYXR1cmVzLgorLy8KKy8vIEdpdmVuIElzTnVsbExpdGVyYWxIZWxwZXIoeCksIHRoZSBjb21waWxlciB3aWxsIHBpY2sgdGhlIGZpcnN0CisvLyB2ZXJzaW9uIGlmIHggY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIFNlY3JldCosIGFuZCBwaWNrIHRoZQorLy8gc2Vjb25kIHZlcnNpb24gb3RoZXJ3aXNlLiAgU2luY2UgU2VjcmV0IGlzIGEgc2VjcmV0IGFuZCBpbmNvbXBsZXRlCisvLyB0eXBlLCB0aGUgb25seSBleHByZXNzaW9uIGEgdXNlciBjYW4gd3JpdGUgdGhhdCBoYXMgdHlwZSBTZWNyZXQqIGlzCisvLyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLiAgVGhlcmVmb3JlLCB3ZSBrbm93IHRoYXQgeCBpcyBhIG51bGwKKy8vIHBvaW50ZXIgbGl0ZXJhbCBpZiBhbmQgb25seSBpZiB0aGUgZmlyc3QgdmVyc2lvbiBpcyBwaWNrZWQgYnkgdGhlCisvLyBjb21waWxlci4KK2NoYXIgSXNOdWxsTGl0ZXJhbEhlbHBlcihTZWNyZXQqIHApOworY2hhciAoJklzTnVsbExpdGVyYWxIZWxwZXIoLi4uKSlbMl07ICAvLyBOT0xJTlQKKworLy8gQSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0IGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgeCBpcyBhCisvLyBudWxsIHBvaW50ZXIgbGl0ZXJhbCAoaS5lLiBOVUxMIG9yIGFueSAwLXZhbHVlZCBjb21waWxlLXRpbWUKKy8vIGludGVncmFsIGNvbnN0YW50KS4KKyNpZmRlZiBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfCisvLyBXZSBsb3NlIHN1cHBvcnQgZm9yIE5VTEwgZGV0ZWN0aW9uIHdoZXJlIHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UKKy8vIHBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikuCisjIGRlZmluZSBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIGZhbHNlCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBcCisgICAgKHNpemVvZig6OnRlc3Rpbmc6OmludGVybmFsOjpJc051bGxMaXRlcmFsSGVscGVyKHgpKSA9PSAxKQorI2VuZGlmICAvLyBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfCisKKy8vIEFwcGVuZHMgdGhlIHVzZXItc3VwcGxpZWQgbWVzc2FnZSB0byB0aGUgR29vZ2xlLVRlc3QtZ2VuZXJhdGVkIG1lc3NhZ2UuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEFwcGVuZFVzZXJNZXNzYWdlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBndGVzdF9tc2csIGNvbnN0IE1lc3NhZ2UmIHVzZXJfbXNnKTsKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieSAoYW5kIG9ubHkgYnkpIGEgZmFpbGVkIEdvb2dsZSBUZXN0CisvLyBhc3NlcnRpb24gd2hlbiBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpIGlzIHRydWUgKGlmIGV4Y2VwdGlvbnMKKy8vIGFyZSBlbmFibGVkKS4gIFdlIGRlcml2ZSBpdCBmcm9tIHN0ZDo6cnVudGltZV9lcnJvciwgd2hpY2ggaXMgZm9yCisvLyBlcnJvcnMgcHJlc3VtYWJseSBkZXRlY3RhYmxlIG9ubHkgYXQgcnVuIHRpbWUuICBTaW5jZQorLy8gc3RkOjpydW50aW1lX2Vycm9yIGluaGVyaXRzIGZyb20gc3RkOjpleGNlcHRpb24sIG1hbnkgdGVzdGluZworLy8gZnJhbWV3b3JrcyBrbm93IGhvdyB0byBleHRyYWN0IGFuZCBwcmludCB0aGUgbWVzc2FnZSBpbnNpZGUgaXQuCitjbGFzcyBHVEVTVF9BUElfIEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uIDogcHVibGljIDo6c3RkOjpydW50aW1lX2Vycm9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBmYWlsdXJlKTsKK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gQSBoZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIHNjb3BlZCB0cmFjZXMgaW4gdXNlciBwcm9ncmFtcy4KK2NsYXNzIEdURVNUX0FQSV8gU2NvcGVkVHJhY2UgeworIHB1YmxpYzoKKyAgLy8gVGhlIGMndG9yIHB1c2hlcyB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gYW5kIG1lc3NhZ2Ugb250bworICAvLyBhIHRyYWNlIHN0YWNrIG1haW50YWluZWQgYnkgR29vZ2xlIFRlc3QuCisgIFNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKworICAvLyBUaGUgZCd0b3IgcG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhlIGQndG9yIGlzIG5vdCB2aXJ0dWFsIGluIG9yZGVyIHRvIGJlIGVmZmljaWVudC4KKyAgLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFNjb3BlZFRyYWNlIQorICB+U2NvcGVkVHJhY2UoKTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkVHJhY2UpOworfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsgIC8vIEEgU2NvcGVkVHJhY2Ugb2JqZWN0IGRvZXMgaXRzIGpvYiBpbiBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjJ3RvciBhbmQgZCd0b3IuICBUaGVyZWZvcmUgaXQgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYmUgdXNlZCBvdGhlcndpc2UuCisKK25hbWVzcGFjZSBlZGl0X2Rpc3RhbmNlIHsKKy8vIFJldHVybnMgdGhlIG9wdGltYWwgZWRpdHMgdG8gZ28gZnJvbSAnbGVmdCcgdG8gJ3JpZ2h0Jy4KKy8vIEFsbCBlZGl0cyBjb3N0IHRoZSBzYW1lLCB3aXRoIHJlcGxhY2UgaGF2aW5nIGxvd2VyIHByaW9yaXR5IHRoYW4KKy8vIGFkZC9yZW1vdmUuCisvLyBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdhZ25lcuKAk0Zpc2NoZXIgYWxnb3JpdGhtLgorLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2FnbmVyLUZpc2NoZXJfYWxnb3JpdGhtCitlbnVtIEVkaXRUeXBlIHsga01hdGNoLCBrQWRkLCBrUmVtb3ZlLCBrUmVwbGFjZSB9OworR1RFU1RfQVBJXyBzdGQ6OnZlY3RvcjxFZGl0VHlwZT4gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIGxlZnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHJpZ2h0KTsKKworLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHRoZSBpbnB1dCBpcyByZXByZXNlbnRlZCBhcyBzdHJpbmdzLgorR1RFU1RfQVBJXyBzdGQ6OnZlY3RvcjxFZGl0VHlwZT4gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbGVmdCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJpZ2h0KTsKKworLy8gQ3JlYXRlIGEgZGlmZiBvZiB0aGUgaW5wdXQgc3RyaW5ncyBpbiBVbmlmaWVkIGRpZmYgZm9ybWF0LgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBDcmVhdGVVbmlmaWVkRGlmZihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb250ZXh0ID0gMik7CisKK30gIC8vIG5hbWVzcGFjZSBlZGl0X2Rpc3RhbmNlCisKKy8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuICdsZWZ0JyBhbmQgJ3JpZ2h0JyBhbmQgcmV0dXJuIGl0IGluIHVuaWZpZWQgZGlmZgorLy8gZm9ybWF0LgorLy8gSWYgbm90IG51bGwsIHN0b3JlcyBpbiAndG90YWxfbGluZV9jb3VudCcgdGhlIHRvdGFsIG51bWJlciBvZiBsaW5lcyBmb3VuZAorLy8gaW4gbGVmdCArIHJpZ2h0LgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBEaWZmU3RyaW5ncyhjb25zdCBzdGQ6OnN0cmluZyYgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHRvdGFsX2xpbmVfY291bnQpOworCisvLyBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGZvciBhbiBlcXVhbGl0eSBhc3NlcnRpb24KKy8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuCisvLworLy8gVGhlIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIGFzc2VydGlvbgorLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQorLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOgorLy8KKy8vICAgZXhwZWN0ZWRfZXhwcmVzc2lvbjogImZvbyIKKy8vICAgYWN0dWFsX2V4cHJlc3Npb246ICAgImJhciIKKy8vICAgZXhwZWN0ZWRfdmFsdWU6ICAgICAgIjUiCisvLyAgIGFjdHVhbF92YWx1ZTogICAgICAgICI2IgorLy8KKy8vIFRoZSBpZ25vcmluZ19jYXNlIHBhcmFtZXRlciBpcyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEKKy8vICpfU1RSQ0FTRUVRKi4gIFdoZW4gaXQncyB0cnVlLCB0aGUgc3RyaW5nICIgKGlnbm9yaW5nIGNhc2UpIiB3aWxsCisvLyBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3R1YWxfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKTsKKworLy8gQ29uc3RydWN0cyBhIGZhaWx1cmUgbWVzc2FnZSBmb3IgQm9vbGVhbiBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZSgKKyAgICBjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCisgICAgY29uc3QgY2hhciogZXhwcmVzc2lvbl90ZXh0LAorICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9wcmVkaWNhdGVfdmFsdWUsCisgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyByZXByZXNlbnRzIGFuIElFRUUgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisvLyAoZWl0aGVyIHNpbmdsZS1wcmVjaXNpb24gb3IgZG91YmxlLXByZWNpc2lvbiwgZGVwZW5kaW5nIG9uIHRoZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVycykuCisvLworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBkbyBtb3JlIHNvcGhpc3RpY2F0ZWQgbnVtYmVyCisvLyBjb21wYXJpc29uLiAgKER1ZSB0byByb3VuZC1vZmYgZXJyb3IsIGV0YywgaXQncyB2ZXJ5IHVubGlrZWx5IHRoYXQKKy8vIHR3byBmbG9hdGluZy1wb2ludHMgd2lsbCBiZSBlcXVhbCBleGFjdGx5LiAgSGVuY2UgYSBuYWl2ZQorLy8gY29tcGFyaXNvbiBieSB0aGUgPT0gb3BlcmF0aW9uIG9mdGVuIGRvZXNuJ3Qgd29yay4pCisvLworLy8gRm9ybWF0IG9mIElFRUUgZmxvYXRpbmctcG9pbnQ6CisvLworLy8gICBUaGUgbW9zdC1zaWduaWZpY2FudCBiaXQgYmVpbmcgdGhlIGxlZnRtb3N0LCBhbiBJRUVFCisvLyAgIGZsb2F0aW5nLXBvaW50IGxvb2tzIGxpa2UKKy8vCisvLyAgICAgc2lnbl9iaXQgZXhwb25lbnRfYml0cyBmcmFjdGlvbl9iaXRzCisvLworLy8gICBIZXJlLCBzaWduX2JpdCBpcyBhIHNpbmdsZSBiaXQgdGhhdCBkZXNpZ25hdGVzIHRoZSBzaWduIG9mIHRoZQorLy8gICBudW1iZXIuCisvLworLy8gICBGb3IgZmxvYXQsIHRoZXJlIGFyZSA4IGV4cG9uZW50IGJpdHMgYW5kIDIzIGZyYWN0aW9uIGJpdHMuCisvLworLy8gICBGb3IgZG91YmxlLCB0aGVyZSBhcmUgMTEgZXhwb25lbnQgYml0cyBhbmQgNTIgZnJhY3Rpb24gYml0cy4KKy8vCisvLyAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKKy8vICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JRUVFX2Zsb2F0aW5nLXBvaW50X3N0YW5kYXJkLgorLy8KKy8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKKy8vCisvLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorY2xhc3MgRmxvYXRpbmdQb2ludCB7CisgcHVibGljOgorICAvLyBEZWZpbmVzIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhhdCBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUKKyAgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVXaXRoU2l6ZTxzaXplb2YoUmF3VHlwZSk+OjpVSW50IEJpdHM7CisKKyAgLy8gQ29uc3RhbnRzLgorCisgIC8vICMgb2YgYml0cyBpbiBhIG51bWJlci4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrQml0Q291bnQgPSA4KnNpemVvZihSYXdUeXBlKTsKKworICAvLyAjIG9mIGZyYWN0aW9uIGJpdHMgaW4gYSBudW1iZXIuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYWN0aW9uQml0Q291bnQgPQorICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0cyAtIDE7CisKKyAgLy8gIyBvZiBleHBvbmVudCBiaXRzIGluIGEgbnVtYmVyLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtFeHBvbmVudEJpdENvdW50ID0ga0JpdENvdW50IC0gMSAtIGtGcmFjdGlvbkJpdENvdW50OworCisgIC8vIFRoZSBtYXNrIGZvciB0aGUgc2lnbiBiaXQuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtTaWduQml0TWFzayA9IHN0YXRpY19jYXN0PEJpdHM+KDEpIDw8IChrQml0Q291bnQgLSAxKTsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIGZyYWN0aW9uIGJpdHMuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtGcmFjdGlvbkJpdE1hc2sgPQorICAgIH5zdGF0aWNfY2FzdDxCaXRzPigwKSA+PiAoa0V4cG9uZW50Qml0Q291bnQgKyAxKTsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIGV4cG9uZW50IGJpdHMuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtFeHBvbmVudEJpdE1hc2sgPSB+KGtTaWduQml0TWFzayB8IGtGcmFjdGlvbkJpdE1hc2spOworCisgIC8vIEhvdyBtYW55IFVMUCdzIChVbml0cyBpbiB0aGUgTGFzdCBQbGFjZSkgd2Ugd2FudCB0byB0b2xlcmF0ZSB3aGVuCisgIC8vIGNvbXBhcmluZyB0d28gbnVtYmVycy4gIFRoZSBsYXJnZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSBlcnJvciB3ZQorICAvLyBhbGxvdy4gIEEgMCB2YWx1ZSBtZWFucyB0aGF0IHR3byBudW1iZXJzIG11c3QgYmUgZXhhY3RseSB0aGUgc2FtZQorICAvLyB0byBiZSBjb25zaWRlcmVkIGVxdWFsLgorICAvLworICAvLyBUaGUgbWF4aW11bSBlcnJvciBvZiBhIHNpbmdsZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gaXMgMC41CisgIC8vIHVuaXRzIGluIHRoZSBsYXN0IHBsYWNlLiAgT24gSW50ZWwgQ1BVJ3MsIGFsbCBmbG9hdGluZy1wb2ludAorICAvLyBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgd2l0aCA4MC1iaXQgcHJlY2lzaW9uLCB3aGlsZSBkb3VibGUgaGFzIDY0CisgIC8vIGJpdHMuICBUaGVyZWZvcmUsIDQgc2hvdWxkIGJlIGVub3VnaCBmb3Igb3JkaW5hcnkgdXNlLgorICAvLworICAvLyBTZWUgdGhlIGZvbGxvd2luZyBhcnRpY2xlIGZvciBtb3JlIGRldGFpbHMgb24gVUxQOgorICAvLyBodHRwOi8vcmFuZG9tYXNjaWkud29yZHByZXNzLmNvbS8yMDEyLzAyLzI1L2NvbXBhcmluZy1mbG9hdGluZy1wb2ludC1udW1iZXJzLTIwMTItZWRpdGlvbi8KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VWxwcyA9IDQ7CisKKyAgLy8gQ29uc3RydWN0cyBhIEZsb2F0aW5nUG9pbnQgZnJvbSBhIHJhdyBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIC8vCisgIC8vIE9uIGFuIEludGVsIENQVSwgcGFzc2luZyBhIG5vbi1ub3JtYWxpemVkIE5BTiAoTm90IGEgTnVtYmVyKQorICAvLyBhcm91bmQgbWF5IGNoYW5nZSBpdHMgYml0cywgYWx0aG91Z2ggdGhlIG5ldyB2YWx1ZSBpcyBndWFyYW50ZWVkCisgIC8vIHRvIGJlIGFsc28gYSBOQU4uICBUaGVyZWZvcmUsIGRvbid0IGV4cGVjdCB0aGlzIGNvbnN0cnVjdG9yIHRvCisgIC8vIHByZXNlcnZlIHRoZSBiaXRzIGluIHggd2hlbiB4IGlzIGEgTkFOLgorICBleHBsaWNpdCBGbG9hdGluZ1BvaW50KGNvbnN0IFJhd1R5cGUmIHgpIHsgdV8udmFsdWVfID0geDsgfQorCisgIC8vIFN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmVpbnRlcnByZXRzIGEgYml0IHBhdHRlcm4gYXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIC8vCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIHRlc3QgdGhlIEFsbW9zdEVxdWFscygpIG1ldGhvZC4KKyAgc3RhdGljIFJhd1R5cGUgUmVpbnRlcnByZXRCaXRzKGNvbnN0IEJpdHMgYml0cykgeworICAgIEZsb2F0aW5nUG9pbnQgZnAoMCk7CisgICAgZnAudV8uYml0c18gPSBiaXRzOworICAgIHJldHVybiBmcC51Xy52YWx1ZV87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgdGhhdCByZXByZXNlbnQgcG9zaXRpdmUgaW5maW5pdHkuCisgIHN0YXRpYyBSYXdUeXBlIEluZmluaXR5KCkgeworICAgIHJldHVybiBSZWludGVycHJldEJpdHMoa0V4cG9uZW50Qml0TWFzayk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgc3RhdGljIFJhd1R5cGUgTWF4KCk7CisKKyAgLy8gTm9uLXN0YXRpYyBtZXRob2RzCisKKyAgLy8gUmV0dXJucyB0aGUgYml0cyB0aGF0IHJlcHJlc2VudHMgdGhpcyBudW1iZXIuCisgIGNvbnN0IEJpdHMgJmJpdHMoKSBjb25zdCB7IHJldHVybiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGV4cG9uZW50IGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZXhwb25lbnRfYml0cygpIGNvbnN0IHsgcmV0dXJuIGtFeHBvbmVudEJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIGZyYWN0aW9uIGJpdHMgb2YgdGhpcyBudW1iZXIuCisgIEJpdHMgZnJhY3Rpb25fYml0cygpIGNvbnN0IHsgcmV0dXJuIGtGcmFjdGlvbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoaXMgbnVtYmVyLgorICBCaXRzIHNpZ25fYml0KCkgY29uc3QgeyByZXR1cm4ga1NpZ25CaXRNYXNrICYgdV8uYml0c187IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgTkFOIChub3QgYSBudW1iZXIpLgorICBib29sIGlzX25hbigpIGNvbnN0IHsKKyAgICAvLyBJdCdzIGEgTkFOIGlmIHRoZSBleHBvbmVudCBiaXRzIGFyZSBhbGwgb25lcyBhbmQgdGhlIGZyYWN0aW9uCisgICAgLy8gYml0cyBhcmUgbm90IGVudGlyZWx5IHplcm9zLgorICAgIHJldHVybiAoZXhwb25lbnRfYml0cygpID09IGtFeHBvbmVudEJpdE1hc2spICYmIChmcmFjdGlvbl9iaXRzKCkgIT0gMCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgbnVtYmVyIGlzIGF0IG1vc3Qga01heFVscHMgVUxQJ3MgYXdheSBmcm9tCisgIC8vIHJocy4gIEluIHBhcnRpY3VsYXIsIHRoaXMgZnVuY3Rpb246CisgIC8vCisgIC8vICAgLSByZXR1cm5zIGZhbHNlIGlmIGVpdGhlciBudW1iZXIgaXMgKG9yIGJvdGggYXJlKSBOQU4uCisgIC8vICAgLSB0cmVhdHMgcmVhbGx5IGxhcmdlIG51bWJlcnMgYXMgYWxtb3N0IGVxdWFsIHRvIGluZmluaXR5LgorICAvLyAgIC0gdGhpbmtzICswLjAgYW5kIC0wLjAgYXJlIDAgRExQJ3MgYXBhcnQuCisgIGJvb2wgQWxtb3N0RXF1YWxzKGNvbnN0IEZsb2F0aW5nUG9pbnQmIHJocykgY29uc3QgeworICAgIC8vIFRoZSBJRUVFIHN0YW5kYXJkIHNheXMgdGhhdCBhbnkgY29tcGFyaXNvbiBvcGVyYXRpb24gaW52b2x2aW5nCisgICAgLy8gYSBOQU4gbXVzdCByZXR1cm4gZmFsc2UuCisgICAgaWYgKGlzX25hbigpIHx8IHJocy5pc19uYW4oKSkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKHVfLmJpdHNfLCByaHMudV8uYml0c18pCisgICAgICAgIDw9IGtNYXhVbHBzOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIHVuaW9uIEZsb2F0aW5nUG9pbnRVbmlvbiB7CisgICAgUmF3VHlwZSB2YWx1ZV87ICAvLyBUaGUgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICBCaXRzIGJpdHNfOyAgICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBudW1iZXIuCisgIH07CisKKyAgLy8gQ29udmVydHMgYW4gaW50ZWdlciBmcm9tIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24gdG8KKyAgLy8gdGhlIGJpYXNlZCByZXByZXNlbnRhdGlvbi4gIE1vcmUgcHJlY2lzZWx5LCBsZXQgTiBiZSAyIHRvIHRoZQorICAvLyBwb3dlciBvZiAoa0JpdENvdW50IC0gMSksIGFuIGludGVnZXIgeCBpcyByZXByZXNlbnRlZCBieSB0aGUKKyAgLy8gdW5zaWduZWQgbnVtYmVyIHggKyBOLgorICAvLworICAvLyBGb3IgaW5zdGFuY2UsCisgIC8vCisgIC8vICAgLU4gKyAxICh0aGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZworICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDE7CisgIC8vICAgMCAgICAgIGlzIHJlcHJlc2VudGVkIGJ5IE47IGFuZAorICAvLyAgIE4gLSAxICAodGhlIGJpZ2dlc3QgbnVtYmVyIHJlcHJlc2VudGFibGUgdXNpbmcKKyAgLy8gICAgICAgICAgc2lnbi1hbmQtbWFnbml0dWRlKSBpcyByZXByZXNlbnRlZCBieSAyTiAtIDEuCisgIC8vCisgIC8vIFJlYWQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduZWRfbnVtYmVyX3JlcHJlc2VudGF0aW9ucworICAvLyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNpZ25lZCBudW1iZXIgcmVwcmVzZW50YXRpb25zLgorICBzdGF0aWMgQml0cyBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoY29uc3QgQml0cyAmc2FtKSB7CisgICAgaWYgKGtTaWduQml0TWFzayAmIHNhbSkgeworICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBuZWdhdGl2ZSBudW1iZXIuCisgICAgICByZXR1cm4gfnNhbSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHNhbSByZXByZXNlbnRzIGEgcG9zaXRpdmUgbnVtYmVyLgorICAgICAgcmV0dXJuIGtTaWduQml0TWFzayB8IHNhbTsKKyAgICB9CisgIH0KKworICAvLyBHaXZlbiB0d28gbnVtYmVycyBpbiB0aGUgc2lnbi1hbmQtbWFnbml0dWRlIHJlcHJlc2VudGF0aW9uLAorICAvLyByZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gYXMgYW4gdW5zaWduZWQgbnVtYmVyLgorICBzdGF0aWMgQml0cyBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyhjb25zdCBCaXRzICZzYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXRzICZzYW0yKSB7CisgICAgY29uc3QgQml0cyBiaWFzZWQxID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTEpOworICAgIGNvbnN0IEJpdHMgYmlhc2VkMiA9IFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChzYW0yKTsKKyAgICByZXR1cm4gKGJpYXNlZDEgPj0gYmlhc2VkMikgPyAoYmlhc2VkMSAtIGJpYXNlZDIpIDogKGJpYXNlZDIgLSBiaWFzZWQxKTsKKyAgfQorCisgIEZsb2F0aW5nUG9pbnRVbmlvbiB1XzsKK307CisKKy8vIFdlIGNhbm5vdCB1c2Ugc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgYXMgaXQgY2xhc2hlcyB3aXRoIHRoZSBtYXgoKQorLy8gbWFjcm8gZGVmaW5lZCBieSA8d2luZG93cy5oPi4KK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgRmxvYXRpbmdQb2ludDxmbG9hdD46Ok1heCgpIHsgcmV0dXJuIEZMVF9NQVg7IH0KK3RlbXBsYXRlIDw+CitpbmxpbmUgZG91YmxlIEZsb2F0aW5nUG9pbnQ8ZG91YmxlPjo6TWF4KCkgeyByZXR1cm4gREJMX01BWDsgfQorCisvLyBUeXBlZGVmcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBGbG9hdGluZ1BvaW50IHRlbXBsYXRlIGNsYXNzIHRoYXQgd2UKKy8vIGNhcmUgdG8gdXNlLgordHlwZWRlZiBGbG9hdGluZ1BvaW50PGZsb2F0PiBGbG9hdDsKK3R5cGVkZWYgRmxvYXRpbmdQb2ludDxkb3VibGU+IERvdWJsZTsKKworLy8gSW4gb3JkZXIgdG8gY2F0Y2ggdGhlIG1pc3Rha2Ugb2YgcHV0dGluZyB0ZXN0cyB0aGF0IHVzZSBkaWZmZXJlbnQKKy8vIHRlc3QgZml4dHVyZSBjbGFzc2VzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSwgd2UgbmVlZCB0byBhc3NpZ24KKy8vIHVuaXF1ZSBJRHMgdG8gZml4dHVyZSBjbGFzc2VzIGFuZCBjb21wYXJlIHRoZW0uICBUaGUgVHlwZUlkIHR5cGUgaXMKKy8vIHVzZWQgdG8gaG9sZCBzdWNoIElEcy4gIFRoZSB1c2VyIHNob3VsZCB0cmVhdCBUeXBlSWQgYXMgYW4gb3BhcXVlCisvLyB0eXBlOiB0aGUgb25seSBvcGVyYXRpb24gYWxsb3dlZCBvbiBUeXBlSWQgdmFsdWVzIGlzIHRvIGNvbXBhcmUKKy8vIHRoZW0gZm9yIGVxdWFsaXR5IHVzaW5nIHRoZSA9PSBvcGVyYXRvci4KK3R5cGVkZWYgY29uc3Qgdm9pZCogVHlwZUlkOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVJZEhlbHBlciB7CisgcHVibGljOgorICAvLyBkdW1teV8gbXVzdCBub3QgaGF2ZSBhIGNvbnN0IHR5cGUuICBPdGhlcndpc2UgYW4gb3Zlcmx5IGVhZ2VyCisgIC8vIGNvbXBpbGVyIChlLmcuIE1TVkMgNy4xICYgOC4wKSBtYXkgdHJ5IHRvIG1lcmdlCisgIC8vIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfIGZvciBkaWZmZXJlbnQgVHMgYXMgYW4gIm9wdGltaXphdGlvbiIuCisgIHN0YXRpYyBib29sIGR1bW15XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyA9IGZhbHNlOworCisvLyBHZXRUeXBlSWQ8VD4oKSByZXR1cm5zIHRoZSBJRCBvZiB0eXBlIFQuICBEaWZmZXJlbnQgdmFsdWVzIHdpbGwgYmUKKy8vIHJldHVybmVkIGZvciBkaWZmZXJlbnQgdHlwZXMuICBDYWxsaW5nIHRoZSBmdW5jdGlvbiB0d2ljZSB3aXRoIHRoZQorLy8gc2FtZSB0eXBlIGFyZ3VtZW50IGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lIElELgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUeXBlSWQgR2V0VHlwZUlkKCkgeworICAvLyBUaGUgY29tcGlsZXIgaXMgcmVxdWlyZWQgdG8gYWxsb2NhdGUgYSBkaWZmZXJlbnQKKyAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gdmFyaWFibGUgZm9yIGVhY2ggVCB1c2VkIHRvIGluc3RhbnRpYXRlCisgIC8vIHRoZSB0ZW1wbGF0ZS4gIFRoZXJlZm9yZSwgdGhlIGFkZHJlc3Mgb2YgZHVtbXlfIGlzIGd1YXJhbnRlZWQgdG8KKyAgLy8gYmUgdW5pcXVlLgorICByZXR1cm4gJihUeXBlSWRIZWxwZXI8VD46OmR1bW15Xyk7Cit9CisKKy8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgQWx3YXlzIGNhbGwgdGhpcyBpbnN0ZWFkCisvLyBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKKy8vIDo6dGVzdGluZzo6VGVzdCwgYXMgdGhlIGxhdHRlciBtYXkgZ2l2ZSB0aGUgd3JvbmcgcmVzdWx0IGR1ZSB0byBhCisvLyBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhcyBhIE1hYyBPUyBYCisvLyBmcmFtZXdvcmsuCitHVEVTVF9BUElfIFR5cGVJZCBHZXRUZXN0VHlwZUlkKCk7CisKKy8vIERlZmluZXMgdGhlIGFic3RyYWN0IGZhY3RvcnkgaW50ZXJmYWNlIHRoYXQgY3JlYXRlcyBpbnN0YW5jZXMKKy8vIG9mIGEgVGVzdCBvYmplY3QuCitjbGFzcyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdEZhY3RvcnlCYXNlKCkge30KKworICAvLyBDcmVhdGVzIGEgdGVzdCBpbnN0YW5jZSB0byBydW4uIFRoZSBpbnN0YW5jZSBpcyBib3RoIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZAorICAvLyB3aXRoaW4gVGVzdEluZm9JbXBsOjpSdW4oKQorICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIFRlc3RGYWN0b3J5QmFzZSgpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RGYWN0b3J5QmFzZSk7Cit9OworCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIFRlYXN0RmFjdG9yeUJhc2UgaW50ZXJmYWNlLgorLy8gSXQgaXMgdXNlZCBpbiBURVNUIGFuZCBURVNUX0YgbWFjcm9zLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KK2NsYXNzIFRlc3RGYWN0b3J5SW1wbCA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgeyByZXR1cm4gbmV3IFRlc3RDbGFzczsgfQorfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworLy8gUHJlZGljYXRlLWZvcm1hdHRlcnMgZm9yIGltcGxlbWVudGluZyB0aGUgSFJFU1VMVCBjaGVja2luZyBtYWNyb3MKKy8vIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfQorLy8gV2UgcGFzcyBhIGxvbmcgaW5zdGVhZCBvZiBIUkVTVUxUIHRvIGF2b2lkIGNhdXNpbmcgYW4KKy8vIGluY2x1ZGUgZGVwZW5kZW5jeSBmb3IgdGhlIEhSRVNVTFQgdHlwZS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFR5cGVzIG9mIFNldFVwVGVzdENhc2UoKSBhbmQgVGVhckRvd25UZXN0Q2FzZSgpIGZ1bmN0aW9ucy4KK3R5cGVkZWYgdm9pZCAoKlNldFVwVGVzdENhc2VGdW5jKSgpOwordHlwZWRlZiB2b2lkICgqVGVhckRvd25UZXN0Q2FzZUZ1bmMpKCk7CisKK3N0cnVjdCBDb2RlTG9jYXRpb24geworICBDb2RlTG9jYXRpb24oY29uc3Qgc3RyaW5nJiBhX2ZpbGUsIGludCBhX2xpbmUpIDogZmlsZShhX2ZpbGUpLCBsaW5lKGFfbGluZSkge30KKworICBzdHJpbmcgZmlsZTsKKyAgaW50IGxpbmU7Cit9OworCisvLyBDcmVhdGVzIGEgbmV3IFRlc3RJbmZvIG9iamVjdCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggR29vZ2xlIFRlc3Q7CisvLyByZXR1cm5zIHRoZSBjcmVhdGVkIG9iamVjdC4KKy8vCisvLyBBcmd1bWVudHM6CisvLworLy8gICB0ZXN0X2Nhc2VfbmFtZTogICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKy8vICAgbmFtZTogICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdAorLy8gICB0eXBlX3BhcmFtICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKy8vICAgdmFsdWVfcGFyYW0gICAgICAgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVzdCdzIHZhbHVlIHBhcmFtZXRlciwKKy8vICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICBjb2RlX2xvY2F0aW9uOiAgICBjb2RlIGxvY2F0aW9uIHdoZXJlIHRoZSB0ZXN0IGlzIGRlZmluZWQKKy8vICAgZml4dHVyZV9jbGFzc19pZDogSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcworLy8gICBzZXRfdXBfdGM6ICAgICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorLy8gICB0ZWFyX2Rvd25fdGM6ICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorLy8gICBmYWN0b3J5OiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBhIHRlc3Qgb2JqZWN0LgorLy8gICAgICAgICAgICAgICAgICAgICBUaGUgbmV3bHkgY3JlYXRlZCBUZXN0SW5mbyBpbnN0YW5jZSB3aWxsIGFzc3VtZQorLy8gICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0LgorR1RFU1RfQVBJXyBUZXN0SW5mbyogTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCisgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAorICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uLAorICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKKworLy8gSWYgKnBzdHIgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgbW9kaWZpZXMgKnBzdHIgdG8gYmUgcmlnaHQKKy8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZAorLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLgorR1RFU1RfQVBJXyBib29sIFNraXBQcmVmaXgoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiogcHN0cik7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIFN0YXRlIG9mIHRoZSBkZWZpbml0aW9uIG9mIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KK2NsYXNzIEdURVNUX0FQSV8gVHlwZWRUZXN0Q2FzZVBTdGF0ZSB7CisgcHVibGljOgorICBUeXBlZFRlc3RDYXNlUFN0YXRlKCkgOiByZWdpc3RlcmVkXyhmYWxzZSkge30KKworICAvLyBBZGRzIHRoZSBnaXZlbiB0ZXN0IG5hbWUgdG8gZGVmaW5lZF90ZXN0X25hbWVzXyBhbmQgcmV0dXJuIHRydWUKKyAgLy8gaWYgdGhlIHRlc3QgY2FzZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkOyBvdGhlcndpc2UgYWJvcnRzIHRoZQorICAvLyBwcm9ncmFtLgorICBib29sIEFkZFRlc3ROYW1lKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBjYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lKSB7CisgICAgaWYgKHJlZ2lzdGVyZWRfKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIFRlc3QgJXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSAiCisgICAgICAgICAgICAgICJSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCglcywgLi4uKS5cbiIsCisgICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLCB0ZXN0X25hbWUsIGNhc2VfbmFtZSk7CisgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgIHBvc2l4OjpBYm9ydCgpOworICAgIH0KKyAgICByZWdpc3RlcmVkX3Rlc3RzXy5pbnNlcnQoCisgICAgICAgIDo6c3RkOjptYWtlX3BhaXIodGVzdF9uYW1lLCBDb2RlTG9jYXRpb24oZmlsZSwgbGluZSkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgVGVzdEV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgdGVzdF9uYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZ2lzdGVyZWRfdGVzdHNfLmNvdW50KHRlc3RfbmFtZSkgPiAwOworICB9CisKKyAgY29uc3QgQ29kZUxvY2F0aW9uJiBHZXRDb2RlTG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RfbmFtZSkgY29uc3QgeworICAgIFJlZ2lzdGVyZWRUZXN0c01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWdpc3RlcmVkX3Rlc3RzXy5maW5kKHRlc3RfbmFtZSk7CisgICAgR1RFU1RfQ0hFQ0tfKGl0ICE9IHJlZ2lzdGVyZWRfdGVzdHNfLmVuZCgpKTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgorICAvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKyAgLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KKyAgY29uc3QgY2hhciogVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKKyAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKTsKKworIHByaXZhdGU6CisgIHR5cGVkZWYgOjpzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29kZUxvY2F0aW9uPiBSZWdpc3RlcmVkVGVzdHNNYXA7CisKKyAgYm9vbCByZWdpc3RlcmVkXzsKKyAgUmVnaXN0ZXJlZFRlc3RzTWFwIHJlZ2lzdGVyZWRfdGVzdHNfOworfTsKKworLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiAnc3RyJzsKKy8vIHJldHVybnMgTlVMTCBpZiBubyBjb21tYSBpcyBmb3VuZCBpbiAnc3RyJy4KK2lubGluZSBjb25zdCBjaGFyKiBTa2lwQ29tbWEoY29uc3QgY2hhciogc3RyKSB7CisgIGNvbnN0IGNoYXIqIGNvbW1hID0gc3RyY2hyKHN0ciwgJywnKTsKKyAgaWYgKGNvbW1hID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB3aGlsZSAoSXNTcGFjZSgqKCsrY29tbWEpKSkge30KKyAgcmV0dXJuIGNvbW1hOworfQorCisvLyBSZXR1cm5zIHRoZSBwcmVmaXggb2YgJ3N0cicgYmVmb3JlIHRoZSBmaXJzdCBjb21tYSBpbiBpdDsgcmV0dXJucworLy8gdGhlIGVudGlyZSBzdHJpbmcgaWYgaXQgY29udGFpbnMgbm8gY29tbWEuCitpbmxpbmUgc3RkOjpzdHJpbmcgR2V0UHJlZml4VW50aWxDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOworICByZXR1cm4gY29tbWEgPT0gTlVMTCA/IHN0ciA6IHN0ZDo6c3RyaW5nKHN0ciwgY29tbWEpOworfQorCisvLyBTcGxpdHMgYSBnaXZlbiBzdHJpbmcgb24gYSBnaXZlbiBkZWxpbWl0ZXIsIHBvcHVsYXRpbmcgYSBnaXZlbgorLy8gdmVjdG9yIHdpdGggdGhlIGZpZWxkcy4KK3ZvaWQgU3BsaXRTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjaGFyIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4qIGRlc3QpOworCisvLyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXM+OjpSZWdpc3RlcigpCisvLyByZWdpc3RlcnMgYSBsaXN0IG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0LiAgVGhlCisvLyByZXR1cm4gdmFsdWUgaXMgaW5zaWduaWZpY2FudCAtIHdlIGp1c3QgbmVlZCB0byByZXR1cm4gc29tZXRoaW5nCisvLyBzdWNoIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSBzY29wZS4KKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBUaGUgR1RFU1RfVEVNUExBVEVfIG1hY3JvIGRlY2xhcmVzIGEgdGVtcGxhdGUKKy8vIHRlbXBsYXRlIHBhcmFtZXRlci4gIEl0J3MgZGVmaW5lZCBpbiBndGVzdC10eXBlLXV0aWwuaC4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbCwgdHlwZW5hbWUgVHlwZXM+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3QgeworIHB1YmxpYzoKKyAgLy8gJ2luZGV4JyBpcyB0aGUgaW5kZXggb2YgdGhlIHRlc3QgaW4gdGhlIHR5cGUgbGlzdCAnVHlwZXMnCisgIC8vIHNwZWNpZmllZCBpbiBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChQcmVmaXgsIFRlc3RDYXNlLAorICAvLyBUeXBlcykuICBWYWxpZCB2YWx1ZXMgZm9yICdpbmRleCcgYXJlIFswLCBOIC0gMV0gd2hlcmUgTiBpcyB0aGUKKyAgLy8gbGVuZ3RoIG9mIFR5cGVzLgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYXNlX25hbWUsIGNvbnN0IGNoYXIqIHRlc3RfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM6OkhlYWQgVHlwZTsKKyAgICB0eXBlZGVmIEZpeHR1cmU8VHlwZT4gRml4dHVyZUNsYXNzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgR1RFU1RfQklORF8oVGVzdFNlbCwgVHlwZSkgVGVzdENsYXNzOworCisgICAgLy8gRmlyc3QsIHJlZ2lzdGVycyB0aGUgZmlyc3QgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgaW4gdGhlIHR5cGUKKyAgICAvLyBsaXN0LgorICAgIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgICAgICAoc3RkOjpzdHJpbmcocHJlZml4KSArIChwcmVmaXhbMF0gPT0gJ1wwJyA/ICIiIDogIi8iKSArIGNhc2VfbmFtZSArICIvIgorICAgICAgICAgKyBTdHJlYW1hYmxlVG9TdHJpbmcoaW5kZXgpKS5jX3N0cigpLAorICAgICAgICBTdHJpcFRyYWlsaW5nU3BhY2VzKEdldFByZWZpeFVudGlsQ29tbWEodGVzdF9uYW1lcykpLmNfc3RyKCksCisgICAgICAgIEdldFR5cGVOYW1lPFR5cGU+KCkuY19zdHIoKSwKKyAgICAgICAgTlVMTCwgIC8vIE5vIHZhbHVlIHBhcmFtZXRlci4KKyAgICAgICAgY29kZV9sb2NhdGlvbiwKKyAgICAgICAgR2V0VHlwZUlkPEZpeHR1cmVDbGFzcz4oKSwKKyAgICAgICAgVGVzdENsYXNzOjpTZXRVcFRlc3RDYXNlLAorICAgICAgICBUZXN0Q2xhc3M6OlRlYXJEb3duVGVzdENhc2UsCisgICAgICAgIG5ldyBUZXN0RmFjdG9yeUltcGw8VGVzdENsYXNzPik7CisKKyAgICAvLyBOZXh0LCByZWN1cnNlcyAoYXQgY29tcGlsZSB0aW1lKSB3aXRoIHRoZSB0YWlsIG9mIHRoZSB0eXBlIGxpc3QuCisgICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlczo6VGFpbD4KKyAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNvZGVfbG9jYXRpb24sIGNhc2VfbmFtZSwgdGVzdF9uYW1lcywgaW5kZXggKyAxKTsKKyAgfQorfTsKKworLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIGNsYXNzIFRlc3RTZWw+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXMwPiB7CisgcHVibGljOgorICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiAvKnByZWZpeCovLCBDb2RlTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppbmRleCovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKy8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgVGVzdHMsIFR5cGVzPjo6UmVnaXN0ZXIoKQorLy8gcmVnaXN0ZXJzICphbGwgY29tYmluYXRpb25zKiBvZiAnVGVzdHMnIGFuZCAnVHlwZXMnIHdpdGggR29vZ2xlCisvLyBUZXN0LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybgorLy8gc29tZXRoaW5nIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCB0eXBlbmFtZSBUZXN0cywgdHlwZW5hbWUgVHlwZXM+CitjbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGVkVGVzdENhc2VQU3RhdGUqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYXNlX25hbWUsIGNvbnN0IGNoYXIqIHRlc3RfbmFtZXMpIHsKKyAgICBzdGQ6OnN0cmluZyB0ZXN0X25hbWUgPSBTdHJpcFRyYWlsaW5nU3BhY2VzKAorICAgICAgICBHZXRQcmVmaXhVbnRpbENvbW1hKHRlc3RfbmFtZXMpKTsKKyAgICBpZiAoIXN0YXRlLT5UZXN0RXhpc3RzKHRlc3RfbmFtZSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCBjb2RlIGxvY2F0aW9uIGZvciB0ZXN0ICVzLiVzIGF0ICVzLiIsCisgICAgICAgICAgICAgIGNhc2VfbmFtZSwgdGVzdF9uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihjb2RlX2xvY2F0aW9uLmZpbGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbG9jYXRpb24ubGluZSkuY19zdHIoKSk7CisgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgIHBvc2l4OjpBYm9ydCgpOworICAgIH0KKyAgICBjb25zdCBDb2RlTG9jYXRpb24mIHRlc3RfbG9jYXRpb24gPSBzdGF0ZS0+R2V0Q29kZUxvY2F0aW9uKHRlc3RfbmFtZSk7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RzOjpIZWFkIEhlYWQ7CisKKyAgICAvLyBGaXJzdCwgcmVnaXN0ZXIgdGhlIGZpcnN0IHRlc3QgaW4gJ1Rlc3QnIGZvciBlYWNoIHR5cGUgaW4gJ1R5cGVzJy4KKyAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgSGVhZCwgVHlwZXM+OjpSZWdpc3RlcigKKyAgICAgICAgcHJlZml4LCB0ZXN0X2xvY2F0aW9uLCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIDApOworCisgICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdGVzdCBsaXN0LgorICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzOjpUYWlsLCBUeXBlcz4KKyAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNvZGVfbG9jYXRpb24sIHN0YXRlLAorICAgICAgICAgICAgICAgICAgIGNhc2VfbmFtZSwgU2tpcENvbW1hKHRlc3RfbmFtZXMpKTsKKyAgfQorfTsKKworLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFR5cGVzPgorY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZW1wbGF0ZXMwLCBUeXBlcz4geworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgQ29kZUxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlZFRlc3RDYXNlUFN0YXRlKiAvKnN0YXRlKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgorLy8KKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5CisvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCisvLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoCisgICAgVW5pdFRlc3QqIHVuaXRfdGVzdCwgaW50IHNraXBfY291bnQpOworCisvLyBIZWxwZXJzIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiB1bnJlYWNoYWJsZSBjb2RlIG9yIGNvbnN0YW50CisvLyBjb25kaXRpb24uCisKKy8vIEFsd2F5cyByZXR1cm5zIHRydWUuCitHVEVTVF9BUElfIGJvb2wgQWx3YXlzVHJ1ZSgpOworCisvLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KK2lubGluZSBib29sIEFsd2F5c0ZhbHNlKCkgeyByZXR1cm4gIUFsd2F5c1RydWUoKTsgfQorCisvLyBIZWxwZXIgZm9yIHN1cHByZXNzaW5nIGZhbHNlIHdhcm5pbmcgZnJvbSBDbGFuZyBvbiBhIGNvbnN0IGNoYXIqCisvLyB2YXJpYWJsZSBkZWNsYXJlZCBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYWx3YXlzIGJlaW5nIE5VTEwgaW4KKy8vIHRoZSBlbHNlIGJyYW5jaC4KK3N0cnVjdCBHVEVTVF9BUElfIENvbnN0Q2hhclB0ciB7CisgIENvbnN0Q2hhclB0cihjb25zdCBjaGFyKiBzdHIpIDogdmFsdWUoc3RyKSB7fQorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBjb25zdCBjaGFyKiB2YWx1ZTsKK307CisKKy8vIEEgc2ltcGxlIExpbmVhciBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHJhbmRvbQorLy8gbnVtYmVycyB3aXRoIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uICBVbmxpa2UgcmFuZCgpIGFuZCBzcmFuZCgpLCBpdAorLy8gZG9lc24ndCB1c2UgZ2xvYmFsIHN0YXRlIChhbmQgdGhlcmVmb3JlIGNhbid0IGludGVyZmVyZSB3aXRoIHVzZXIKKy8vIGNvZGUpLiAgVW5saWtlIHJhbmRfcigpLCBpdCdzIHBvcnRhYmxlLiAgQW4gTENHIGlzbid0IHZlcnkgcmFuZG9tLAorLy8gYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4KK2NsYXNzIEdURVNUX0FQSV8gUmFuZG9tIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBVSW50MzIga01heFJhbmdlID0gMXUgPDwgMzE7CisKKyAgZXhwbGljaXQgUmFuZG9tKFVJbnQzMiBzZWVkKSA6IHN0YXRlXyhzZWVkKSB7fQorCisgIHZvaWQgUmVzZWVkKFVJbnQzMiBzZWVkKSB7IHN0YXRlXyA9IHNlZWQ7IH0KKworICAvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcworICAvLyAwIG9yIGdyZWF0ZXIgdGhhbiBrTWF4UmFuZ2UuCisgIFVJbnQzMiBHZW5lcmF0ZShVSW50MzIgcmFuZ2UpOworCisgcHJpdmF0ZToKKyAgVUludDMyIHN0YXRlXzsKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSYW5kb20pOworfTsKKworLy8gRGVmaW5pbmcgYSB2YXJpYWJsZSBvZiB0eXBlIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBUMj4gd2lsbCBjYXVzZSBhCisvLyBjb21waWxlciBlcnJvciBpZmYgVDEgYW5kIFQyIGFyZSBkaWZmZXJlbnQgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxULCBUPiB7Cit9OworCisvLyBSZW1vdmVzIHRoZSByZWZlcmVuY2UgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSByZWZlcmVuY2UgdHlwZSwKKy8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcworLy8gdHIxOjpyZW1vdmVfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVSZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBhcm91bmQgUmVtb3ZlUmVmZXJlbmNlIHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKKy8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSBcCisgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlUmVmZXJlbmNlPFQ+Ojp0eXBlCisKKy8vIFJlbW92ZXMgY29uc3QgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSBjb25zdCB0eXBlLCBvdGhlcndpc2UgbGVhdmVzCisvLyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRyMTo6cmVtb3ZlX2NvbnN0LCB3aGljaCBpcyBub3QKKy8vIHdpZGVseSBhdmFpbGFibGUgeWV0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlQ29uc3QgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVD4geyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBNU1ZDIDguMCwgU3VuIEMrKywgYW5kIElCTSBYTCBDKysgaGF2ZSBhIGJ1ZyB3aGljaCBjYXVzZXMgdGhlIGFib3ZlCisvLyBkZWZpbml0aW9uIHRvIGZhaWwgdG8gcmVtb3ZlIHRoZSBjb25zdCBpbiAnY29uc3QgaW50WzNdJyBhbmQgJ2NvbnN0CisvLyBjaGFyWzNdWzRdJy4gIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gd29ya3MgYXJvdW5kIHRoZSBidWcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitzdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVFtOXT4geworICB0eXBlZGVmIHR5cGVuYW1lIFJlbW92ZUNvbnN0PFQ+Ojp0eXBlIHR5cGVbTl07Cit9OworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNDAwCisvLyBUaGlzIGlzIHRoZSBvbmx5IHNwZWNpYWxpemF0aW9uIHRoYXQgYWxsb3dzIFZDKysgNy4xIHRvIHJlbW92ZSBjb25zdCBpbgorLy8gJ2NvbnN0IGludFszXSBhbmQgJ2NvbnN0IGludFszXVs0XScuICBIb3dldmVyLCBpdCBjYXVzZXMgdHJvdWJsZSB3aXRoIEdDQworLy8gYW5kIHRodXMgbmVlZHMgdG8gYmUgY29uZGl0aW9uYWxseSBjb21waWxlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK3N0cnVjdCBSZW1vdmVDb25zdDxUW05dPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3Q8VD46OnR5cGUgdHlwZVtOXTsKK307CisjZW5kaWYKKworLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVDb25zdCB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50CisvLyBUIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyNkZWZpbmUgR1RFU1RfUkVNT1ZFX0NPTlNUXyhUKSBcCisgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlQ29uc3Q8VD46OnR5cGUKKworLy8gVHVybnMgY29uc3QgVSYsIFUmLCBjb25zdCBVLCBhbmQgVSBhbGwgaW50byBVLgorI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVCkgXAorICAgIEdURVNUX1JFTU9WRV9DT05TVF8oR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpCisKKy8vIEFkZHMgcmVmZXJlbmNlIHRvIGEgdHlwZSBpZiBpdCBpcyBub3QgYSByZWZlcmVuY2UgdHlwZSwKKy8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcworLy8gdHIxOjphZGRfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWZlcmVuY2UgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZmVyZW5jZTxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBBZGRSZWZlcmVuY2UgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBUCisvLyBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdURVNUX0FERF9SRUZFUkVOQ0VfKFQpIFwKKyAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpBZGRSZWZlcmVuY2U8VD46OnR5cGUKKworLy8gQWRkcyBhIHJlZmVyZW5jZSB0byBjb25zdCBvbiB0b3Agb2YgVCBhcyBuZWNlc3NhcnkuICBGb3IgZXhhbXBsZSwKKy8vIGl0IHRyYW5zZm9ybXMKKy8vCisvLyAgIGNoYXIgICAgICAgICA9PT4gY29uc3QgY2hhciYKKy8vICAgY29uc3QgY2hhciAgID09PiBjb25zdCBjaGFyJgorLy8gICBjaGFyJiAgICAgICAgPT0+IGNvbnN0IGNoYXImCisvLyAgIGNvbnN0IGNoYXImICA9PT4gY29uc3QgY2hhciYKKy8vCisvLyBUaGUgYXJndW1lbnQgVCBtdXN0IGRlcGVuZCBvbiBzb21lIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oVCkgXAorICAgIEdURVNUX0FERF9SRUZFUkVOQ0VfKGNvbnN0IEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpKQorCisvLyBJbXBsaWNpdGx5Q29udmVydGlibGU8RnJvbSwgVG8+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBib29sCisvLyBjb25zdGFudCB0aGF0J3MgdHJ1ZSBpZmYgdHlwZSBGcm9tIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bworLy8gdHlwZSBUby4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK2NsYXNzIEltcGxpY2l0bHlDb252ZXJ0aWJsZSB7CisgcHJpdmF0ZToKKyAgLy8gV2UgbmVlZCB0aGUgZm9sbG93aW5nIGhlbHBlciBmdW5jdGlvbnMgb25seSBmb3IgdGhlaXIgdHlwZXMuCisgIC8vIFRoZXkgaGF2ZSBubyBpbXBsZW1lbnRhdGlvbnMuCisKKyAgLy8gTWFrZUZyb20oKSBpcyBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgRnJvbS4gIFdlIGNhbm5vdCBzaW1wbHkKKyAgLy8gdXNlIEZyb20oKSwgYXMgdGhlIHR5cGUgRnJvbSBtYXkgbm90IGhhdmUgYSBwdWJsaWMgZGVmYXVsdAorICAvLyBjb25zdHJ1Y3Rvci4KKyAgc3RhdGljIHR5cGVuYW1lIEFkZFJlZmVyZW5jZTxGcm9tPjo6dHlwZSBNYWtlRnJvbSgpOworCisgIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIG92ZXJsb2FkZWQuICBHaXZlbiBhbiBleHByZXNzaW9uCisgIC8vIEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QgdmVyc2lvbiBpZiB4IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvOyBvdGhlcndpc2UgaXQgd2lsbCBwaWNrIHRoZQorICAvLyBzZWNvbmQgdmVyc2lvbi4KKyAgLy8KKyAgLy8gVGhlIGZpcnN0IHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMSwgYW5kIHRoZSBzZWNvbmQKKyAgLy8gdmVyc2lvbiByZXR1cm5zIGEgdmFsdWUgb2Ygc2l6ZSAyLiAgVGhlcmVmb3JlLCBieSBjaGVja2luZyB0aGUKKyAgLy8gc2l6ZSBvZiBIZWxwZXIoeCksIHdoaWNoIGNhbiBiZSBkb25lIGF0IGNvbXBpbGUgdGltZSwgd2UgY2FuIHRlbGwKKyAgLy8gd2hpY2ggdmVyc2lvbiBvZiBIZWxwZXIoKSBpcyB1c2VkLCBhbmQgaGVuY2Ugd2hldGhlciB4IGNhbiBiZQorICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvLgorICBzdGF0aWMgY2hhciBIZWxwZXIoVG8pOworICBzdGF0aWMgY2hhciAoJkhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAorCisgIC8vIFdlIGhhdmUgdG8gcHV0IHRoZSAncHVibGljJyBzZWN0aW9uIGFmdGVyIHRoZSAncHJpdmF0ZScgc2VjdGlvbiwKKyAgLy8gb3IgTVNWQyByZWZ1c2VzIHRvIGNvbXBpbGUgdGhlIGNvZGUuCisgcHVibGljOgorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBDKytCdWlsZGVyIGNhbm5vdCB1c2UgbWVtYmVyIG92ZXJsb2FkIHJlc29sdXRpb24gZHVyaW5nIHRlbXBsYXRlCisgIC8vIGluc3RhbnRpYXRpb24uICBUaGUgc2ltcGxlc3Qgd29ya2Fyb3VuZCBpcyB0byB1c2UgaXRzIEMrKzB4IHR5cGUgdHJhaXRzCisgIC8vIGZ1bmN0aW9ucyAoQysrQnVpbGRlciAyMDA5IGFuZCBhYm92ZSBvbmx5KS4KKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX2lzX2NvbnZlcnRpYmxlKEZyb20sIFRvKTsKKyNlbHNlCisgIC8vIE1TVkMgd2FybnMgYWJvdXQgaW1wbGljaXRseSBjb252ZXJ0aW5nIGZyb20gZG91YmxlIHRvIGludCBmb3IKKyAgLy8gcG9zc2libGUgbG9zcyBvZiBkYXRhLCBzbyB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlCisgIC8vIHdhcm5pbmcuCisgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQyNDQpCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgIHNpemVvZihIZWxwZXIoSW1wbGljaXRseUNvbnZlcnRpYmxlOjpNYWtlRnJvbSgpKSkgPT0gMTsKKyAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCisjZW5kaWYgIC8vIF9fQk9STEFORENfXworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK2NvbnN0IGJvb2wgSW1wbGljaXRseUNvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWU7CisKKy8vIElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0J3MKKy8vIHRydWUgaWZmIFQgaXMgdHlwZSBQcm90b2NvbE1lc3NhZ2UsIHByb3RvMjo6TWVzc2FnZSwgb3IgYSBzdWJjbGFzcworLy8gb2YgdGhvc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJc0FQcm90b2NvbE1lc3NhZ2UKKyAgICA6IHB1YmxpYyBib29sX2NvbnN0YW50PAorICBJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCosIGNvbnN0IDo6UHJvdG9jb2xNZXNzYWdlKj46OnZhbHVlIHx8CisgIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUKiwgY29uc3QgOjpwcm90bzI6Ok1lc3NhZ2UqPjo6dmFsdWU+IHsKK307CisKKy8vIFdoZW4gdGhlIGNvbXBpbGVyIHNlZXMgZXhwcmVzc2lvbiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCksIGlmIEMgaXMgYW4KKy8vIFNUTC1zdHlsZSBjb250YWluZXIgY2xhc3MsIHRoZSBmaXJzdCBvdmVybG9hZCBvZiBJc0NvbnRhaW5lclRlc3QKKy8vIHdpbGwgYmUgdmlhYmxlIChzaW5jZSBib3RoIEM6Oml0ZXJhdG9yKiBhbmQgQzo6Y29uc3RfaXRlcmF0b3IqIGFyZQorLy8gdmFsaWQgdHlwZXMgYW5kIE5VTEwgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHRoZW0pLiAgSXQgd2lsbAorLy8gYmUgcGlja2VkIG92ZXIgdGhlIHNlY29uZCBvdmVybG9hZCBhcyAnaW50JyBpcyBhIHBlcmZlY3QgbWF0Y2ggZm9yCisvLyB0aGUgdHlwZSBvZiBhcmd1bWVudCAwLiAgSWYgQzo6aXRlcmF0b3Igb3IgQzo6Y29uc3RfaXRlcmF0b3IgaXMgbm90CisvLyBhIHZhbGlkIHR5cGUsIHRoZSBmaXJzdCBvdmVybG9hZCBpcyBub3QgdmlhYmxlLCBhbmQgdGhlIHNlY29uZAorLy8gb3ZlcmxvYWQgd2lsbCBiZSBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciBDIGlzCisvLyBhIGNvbnRhaW5lciBjbGFzcyBieSBjaGVja2luZyB0aGUgdHlwZSBvZiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCkuCisvLyBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgaW5zaWduaWZpY2FudC4KKy8vCisvLyBOb3RlIHRoYXQgd2UgbG9vayBmb3IgYm90aCBDOjppdGVyYXRvciBhbmQgQzo6Y29uc3RfaXRlcmF0b3IuICBUaGUKKy8vIHJlYXNvbiBpcyB0aGF0IEMrKyBpbmplY3RzIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgYSBtZW1iZXIgb2YgdGhlCisvLyBjbGFzcyBpdHNlbGYgKGUuZy4geW91IGNhbiByZWZlciB0byBjbGFzcyBpdGVyYXRvciBhcyBlaXRoZXIKKy8vICdpdGVyYXRvcicgb3IgJ2l0ZXJhdG9yOjppdGVyYXRvcicpLiAgSWYgd2UgbG9vayBmb3IgQzo6aXRlcmF0b3IKKy8vIG9ubHksIGZvciBleGFtcGxlLCB3ZSB3b3VsZCBtaXN0YWtlbmx5IHRoaW5rIHRoYXQgYSBjbGFzcyBuYW1lZAorLy8gaXRlcmF0b3IgaXMgYW4gU1RMIGNvbnRhaW5lci4KKy8vCisvLyBBbHNvIG5vdGUgdGhhdCB0aGUgc2ltcGxlciBhcHByb2FjaCBvZiBvdmVybG9hZGluZworLy8gSXNDb250YWluZXJUZXN0KHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yKikgYW5kCisvLyBJc0NvbnRhaW5lclRlc3QoLi4uKSBkb2Vzbid0IHdvcmsgd2l0aCBWaXN1YWwgQWdlIEMrKyBhbmQgU3VuIEMrKy4KK3R5cGVkZWYgaW50IElzQ29udGFpbmVyOwordGVtcGxhdGUgPGNsYXNzIEM+CitJc0NvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QoaW50IC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yKiAvKiBpdCAqLyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqIC8qIGNvbnN0X2l0ICovID0gTlVMTCkgeworICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBjaGFyIElzTm90Q29udGFpbmVyOwordGVtcGxhdGUgPGNsYXNzIEM+CitJc05vdENvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QobG9uZyAvKiBkdW1teSAqLykgeyByZXR1cm4gJ1wwJzsgfQorCisvLyBFbmFibGVJZjxjb25kaXRpb24+Ojp0eXBlIGlzIHZvaWQgd2hlbiAnQ29uZCcgaXMgdHJ1ZSwgYW5kCisvLyB1bmRlZmluZWQgd2hlbiAnQ29uZCcgaXMgZmFsc2UuICBUbyB1c2UgU0ZJTkFFIHRvIG1ha2UgYSBmdW5jdGlvbgorLy8gb3ZlcmxvYWQgb25seSBhcHBseSB3aGVuIGEgcGFydGljdWxhciBleHByZXNzaW9uIGlzIHRydWUsIGFkZAorLy8gInR5cGVuYW1lIEVuYWJsZUlmPGV4cHJlc3Npb24+Ojp0eXBlKiA9IDAiIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4KK3RlbXBsYXRlPGJvb2w+IHN0cnVjdCBFbmFibGVJZjsKK3RlbXBsYXRlPD4gc3RydWN0IEVuYWJsZUlmPHRydWU+IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gVXRpbGl0aWVzIGZvciBuYXRpdmUgYXJyYXlzLgorCisvLyBBcnJheUVxKCkgY29tcGFyZXMgdHdvIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5cyB1c2luZyB0aGUKKy8vIGVsZW1lbnRzJyBvcGVyYXRvcj09LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzCisvLyAwLCBBcnJheUVxKCkgZGVnZW5lcmF0ZXMgaW50byBjb21wYXJpbmcgYSBzaW5nbGUgcGFpciBvZiB2YWx1ZXMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCBBcnJheUVxKGNvbnN0IFQqIGxocywgc2l6ZV90IHNpemUsIGNvbnN0IFUqIHJocyk7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSBib29sIEFycmF5RXEoY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMpIHsgcmV0dXJuIGxocyA9PSByaHM7IH0KKworLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHNpemVfdCBOPgoraW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUKCZsaHMpW05dLCBjb25zdCBVKCZyaHMpW05dKSB7CisgIHJldHVybiBpbnRlcm5hbDo6QXJyYXlFcShsaHMsIE4sIHJocyk7Cit9CisKKy8vIFRoaXMgaGVscGVyIHJlZHVjZXMgY29kZSBibG9hdC4gIElmIHdlIGluc3RlYWQgcHV0IGl0cyBsb2dpYyBpbnNpZGUKKy8vIHRoZSBwcmV2aW91cyBBcnJheUVxKCkgZnVuY3Rpb24sIGFycmF5cyB3aXRoIGRpZmZlcmVudCBzaXplcyB3b3VsZAorLy8gbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIEFycmF5RXEoY29uc3QgVCogbGhzLCBzaXplX3Qgc2l6ZSwgY29uc3QgVSogcmhzKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgeworICAgIGlmICghaW50ZXJuYWw6OkFycmF5RXEobGhzW2ldLCByaHNbaV0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpIHRoYXQKKy8vIGVxdWFscyBlbGVtLiAgRWxlbWVudCBtYXkgYmUgYSBuYXRpdmUgYXJyYXkgdHlwZSBpdHNlbGYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWUgRWxlbWVudD4KK0l0ZXIgQXJyYXlBd2FyZUZpbmQoSXRlciBiZWdpbiwgSXRlciBlbmQsIGNvbnN0IEVsZW1lbnQmIGVsZW0pIHsKKyAgZm9yIChJdGVyIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpbnRlcm5hbDo6QXJyYXlFcSgqaXQsIGVsZW0pKQorICAgICAgcmV0dXJuIGl0OworICB9CisgIHJldHVybiBlbmQ7Cit9CisKKy8vIENvcHlBcnJheSgpIGNvcGllcyBhIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5IHVzaW5nIHRoZSBlbGVtZW50cycKKy8vIG9wZXJhdG9yPSwgd2hlcmUgayBjYW4gYmUgYW55IGludGVnZXIgPj0gMC4gIFdoZW4gayBpcyAwLAorLy8gQ29weUFycmF5KCkgZGVnZW5lcmF0ZXMgaW50byBjb3B5aW5nIGEgc2luZ2xlIHZhbHVlLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3ZvaWQgQ29weUFycmF5KGNvbnN0IFQqIGZyb20sIHNpemVfdCBzaXplLCBVKiB0byk7CisKKy8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUJiBmcm9tLCBVKiB0bykgeyAqdG8gPSBmcm9tOyB9CisKKy8vIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZCB3aGVuIGsgPj0gMS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCBzaXplX3QgTj4KK2lubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUKCZmcm9tKVtOXSwgVSgqdG8pW05dKSB7CisgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbSwgTiwgKnRvKTsKK30KKworLy8gVGhpcyBoZWxwZXIgcmVkdWNlcyBjb2RlIGJsb2F0LiAgSWYgd2UgaW5zdGVhZCBwdXQgaXRzIGxvZ2ljIGluc2lkZQorLy8gdGhlIHByZXZpb3VzIENvcHlBcnJheSgpIGZ1bmN0aW9uLCBhcnJheXMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMKKy8vIHdvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGNvcGllcyBvZiB0aGUgdGVtcGxhdGUgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgordm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgeworICAgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbVtpXSwgdG8gKyBpKTsKKyAgfQorfQorCisvLyBUaGUgcmVsYXRpb24gYmV0d2VlbiBhbiBOYXRpdmVBcnJheSBvYmplY3QgKHNlZSBiZWxvdykgYW5kIHRoZQorLy8gbmF0aXZlIGFycmF5IGl0IHJlcHJlc2VudHMuCisvLyBXZSB1c2UgMiBkaWZmZXJlbnQgc3RydWN0cyB0byBhbGxvdyBub24tY29weWFibGUgdHlwZXMgdG8gYmUgdXNlZCwgYXMgbG9uZworLy8gYXMgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSgpIGlzIHBhc3NlZC4KK3N0cnVjdCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlIHt9Oworc3RydWN0IFJlbGF0aW9uVG9Tb3VyY2VDb3B5IHt9OworCisvLyBBZGFwdHMgYSBuYXRpdmUgYXJyYXkgdG8gYSByZWFkLW9ubHkgU1RMLXN0eWxlIGNvbnRhaW5lci4gIEluc3RlYWQKKy8vIG9mIHRoZSBjb21wbGV0ZSBTVEwgY29udGFpbmVyIGNvbmNlcHQsIHRoaXMgYWRhcHRvciBvbmx5IGltcGxlbWVudHMKKy8vIG1lbWJlcnMgdXNlZnVsIGZvciBHb29nbGUgTW9jaydzIGNvbnRhaW5lciBtYXRjaGVycy4gIE5ldyBtZW1iZXJzCisvLyBzaG91bGQgYmUgYWRkZWQgYXMgbmVlZGVkLiAgVG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBvbmx5CisvLyBzdXBwb3J0IEVsZW1lbnQgYmVpbmcgYSByYXcgdHlwZSAoaS5lLiBoYXZpbmcgbm8gdG9wLWxldmVsIGNvbnN0IG9yCisvLyByZWZlcmVuY2UgbW9kaWZpZXIpLiAgSXQncyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gc2F0aXNmeQorLy8gdGhpcyByZXF1aXJlbWVudC4gIEVsZW1lbnQgY2FuIGJlIGFuIGFycmF5IHR5cGUgaXRzZWxmIChoZW5jZQorLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBzdXBwb3J0ZWQpLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBOYXRpdmVBcnJheSB7CisgcHVibGljOgorICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIHR5cGVkZWZzLgorICB0eXBlZGVmIEVsZW1lbnQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdCBFbGVtZW50KiBjb25zdF9pdGVyYXRvcjsKKworICAvLyBDb25zdHJ1Y3RzIGZyb20gYSBuYXRpdmUgYXJyYXkuIFJlZmVyZW5jZXMgdGhlIHNvdXJjZS4KKyAgTmF0aXZlQXJyYXkoY29uc3QgRWxlbWVudCogYXJyYXksIHNpemVfdCBjb3VudCwgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSkgeworICAgIEluaXRSZWYoYXJyYXksIGNvdW50KTsKKyAgfQorCisgIC8vIENvbnN0cnVjdHMgZnJvbSBhIG5hdGl2ZSBhcnJheS4gQ29waWVzIHRoZSBzb3VyY2UuCisgIE5hdGl2ZUFycmF5KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgY291bnQsIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KSB7CisgICAgSW5pdENvcHkoYXJyYXksIGNvdW50KTsKKyAgfQorCisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIE5hdGl2ZUFycmF5KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIHsKKyAgICAodGhpcy0+KnJocy5jbG9uZV8pKHJocy5hcnJheV8sIHJocy5zaXplXyk7CisgIH0KKworICB+TmF0aXZlQXJyYXkoKSB7CisgICAgaWYgKGNsb25lXyAhPSAmTmF0aXZlQXJyYXk6OkluaXRSZWYpCisgICAgICBkZWxldGVbXSBhcnJheV87CisgIH0KKworICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIG1ldGhvZHMuCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcnJheV87IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfICsgc2l6ZV87IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZSgpID09IHJocy5zaXplKCkgJiYKKyAgICAgICAgQXJyYXlFcShiZWdpbigpLCBzaXplKCksIHJocy5iZWdpbigpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgZW51bSB7CisgICAga0NoZWNrVHlwZUlzTm90Q29uc3RPckFSZWZlcmVuY2UgPSBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8CisgICAgICAgIEVsZW1lbnQsIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhFbGVtZW50KT46OnZhbHVlLAorICB9OworCisgIC8vIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0IHdpdGggYSBjb3B5IG9mIHRoZSBpbnB1dC4KKyAgdm9pZCBJbml0Q29weShjb25zdCBFbGVtZW50KiBhcnJheSwgc2l6ZV90IGFfc2l6ZSkgeworICAgIEVsZW1lbnQqIGNvbnN0IGNvcHkgPSBuZXcgRWxlbWVudFthX3NpemVdOworICAgIENvcHlBcnJheShhcnJheSwgYV9zaXplLCBjb3B5KTsKKyAgICBhcnJheV8gPSBjb3B5OworICAgIHNpemVfID0gYV9zaXplOworICAgIGNsb25lXyA9ICZOYXRpdmVBcnJheTo6SW5pdENvcHk7CisgIH0KKworICAvLyBJbml0aWFsaXplcyB0aGlzIG9iamVjdCB3aXRoIGEgcmVmZXJlbmNlIG9mIHRoZSBpbnB1dC4KKyAgdm9pZCBJbml0UmVmKGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgYV9zaXplKSB7CisgICAgYXJyYXlfID0gYXJyYXk7CisgICAgc2l6ZV8gPSBhX3NpemU7CisgICAgY2xvbmVfID0gJk5hdGl2ZUFycmF5OjpJbml0UmVmOworICB9CisKKyAgY29uc3QgRWxlbWVudCogYXJyYXlfOworICBzaXplX3Qgc2l6ZV87CisgIHZvaWQgKE5hdGl2ZUFycmF5OjoqY2xvbmVfKShjb25zdCBFbGVtZW50Kiwgc2l6ZV90KTsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5hdGl2ZUFycmF5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2RlZmluZSBHVEVTVF9NRVNTQUdFX0FUXyhmaWxlLCBsaW5lLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpBc3NlcnRIZWxwZXIocmVzdWx0X3R5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpIFwKKyAgICA9IDo6dGVzdGluZzo6TWVzc2FnZSgpCisKKyNkZWZpbmUgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgcmVzdWx0X3R5cGUpIFwKKyAgR1RFU1RfTUVTU0FHRV9BVF8oX19GSUxFX18sIF9fTElORV9fLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkKKworI2RlZmluZSBHVEVTVF9GQVRBTF9GQUlMVVJFXyhtZXNzYWdlKSBcCisgIHJldHVybiBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlKQorCisjZGVmaW5lIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKG1lc3NhZ2UpIFwKKyAgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKKworI2RlZmluZSBHVEVTVF9TVUNDRVNTXyhtZXNzYWdlKSBcCisgIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKQorCisvLyBTdXBwcmVzc2VzIE1TVkMgd2FybmluZ3MgNDA3MiAodW5yZWFjaGFibGUgY29kZSkgZm9yIHRoZSBjb2RlIGZvbGxvd2luZworLy8gc3RhdGVtZW50IGlmIGl0IHJldHVybnMgb3IgdGhyb3dzIChvciBkb2Vzbid0IHJldHVybiBvciB0aHJvdyBpbiBzb21lCisvLyBzaXR1YXRpb25zKS4KKyNkZWZpbmUgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH0KKworI2RlZmluZSBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpDb25zdENoYXJQdHIgZ3Rlc3RfbXNnID0gIiIpIHsgXAorICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gZmFsc2U7IFwKKyAgICB0cnkgeyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICB9IFwKKyAgICBjYXRjaCAoZXhwZWN0ZWRfZXhjZXB0aW9uIGNvbnN0JikgeyBcCisgICAgICBndGVzdF9jYXVnaHRfZXhwZWN0ZWQgPSB0cnVlOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKC4uLikgeyBcCisgICAgICBndGVzdF9tc2cudmFsdWUgPSBcCisgICAgICAgICAgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCisgICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiI7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgICBpZiAoIWd0ZXN0X2NhdWdodF9leHBlY3RlZCkgeyBcCisgICAgICBndGVzdF9tc2cudmFsdWUgPSBcCisgICAgICAgICAgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCisgICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiI7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTogXAorICAgICAgZmFpbChndGVzdF9tc2cudmFsdWUpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKC4uLikgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vdGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub3Rocm93XywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24uXG4iIFwKKyAgICAgICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3MuIikKKworI2RlZmluZSBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgYm9vbCBndGVzdF9jYXVnaHRfYW55ID0gZmFsc2U7IFwKKyAgICB0cnkgeyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICB9IFwKKyAgICBjYXRjaCAoLi4uKSB7IFwKKyAgICAgIGd0ZXN0X2NhdWdodF9hbnkgPSB0cnVlOyBcCisgICAgfSBcCisgICAgaWYgKCFndGVzdF9jYXVnaHRfYW55KSB7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rhbnl0aHJvd18sIF9fTElORV9fKTogXAorICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24uXG4iIFwKKyAgICAgICAgICAgIiAgQWN0dWFsOiBpdCBkb2Vzbid0LiIpCisKKworLy8gSW1wbGVtZW50cyBCb29sZWFuIHRlc3QgYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLiBleHByZXNzaW9uIGNhbiBiZQorLy8gZWl0aGVyIGEgYm9vbGVhbiBleHByZXNzaW9uIG9yIGFuIEFzc2VydGlvblJlc3VsdC4gdGV4dCBpcyBhIHRleHR1YWwKKy8vIHJlcHJlc2VuYXRpb24gb2YgZXhwcmVzc2lvbiBhcyBpdCB3YXMgcGFzc2VkIGludG8gdGhlIEVYUEVDVF9UUlVFLgorI2RlZmluZSBHVEVTVF9URVNUX0JPT0xFQU5fKGV4cHJlc3Npb24sIHRleHQsIGFjdHVhbCwgZXhwZWN0ZWQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoY29uc3QgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgZ3Rlc3RfYXJfID0gXAorICAgICAgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQoZXhwcmVzc2lvbikpIFwKKyAgICA7IFwKKyAgZWxzZSBcCisgICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoXAorICAgICAgICBndGVzdF9hcl8sIHRleHQsICNhY3R1YWwsICNleHBlY3RlZCkuY19zdHIoKSkKKworI2RlZmluZSBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlciBndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXI7IFwKKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICBpZiAoZ3Rlc3RfZmF0YWxfZmFpbHVyZV9jaGVja2VyLmhhc19uZXdfZmF0YWxfZmFpbHVyZSgpKSB7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm9mYXRhbF8sIF9fTElORV9fKTsgXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vZmF0YWxfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiBkb2Vzbid0IGdlbmVyYXRlIG5ldyBmYXRhbCAiIFwKKyAgICAgICAgICAgImZhaWx1cmVzIGluIHRoZSBjdXJyZW50IHRocmVhZC5cbiIgXAorICAgICAgICAgICAiICBBY3R1YWw6IGl0IGRvZXMuIikKKworLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBnaXZlbiB0ZXN0LgorI2RlZmluZSBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgdGVzdF9jYXNlX25hbWUjI18jI3Rlc3RfbmFtZSMjX1Rlc3QKKworLy8gSGVscGVyIG1hY3JvIGZvciBkZWZpbmluZyB0ZXN0cy4KKyNkZWZpbmUgR1RFU1RfVEVTVF8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSwgcGFyZW50X2NsYXNzLCBwYXJlbnRfaWQpXAorY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSA6IHB1YmxpYyBwYXJlbnRfY2xhc3Mge1wKKyBwdWJsaWM6XAorICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge31cCisgcHJpdmF0ZTpcCisgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpO1wKKyAgc3RhdGljIDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mb18gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87XAorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKKyAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpO1wKK307XAorXAorOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKKyAgOjp0ZXN0X2luZm9fID1cCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oXAorICAgICAgICAjdGVzdF9jYXNlX25hbWUsICN0ZXN0X25hbWUsIE5VTEwsIE5VTEwsIFwKKyAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29kZUxvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXyksIFwKKyAgICAgICAgKHBhcmVudF9pZCksIFwKKyAgICAgICAgcGFyZW50X2NsYXNzOjpTZXRVcFRlc3RDYXNlLCBcCisgICAgICAgIHBhcmVudF9jbGFzczo6VGVhckRvd25UZXN0Q2FzZSwgXAorICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdEZhY3RvcnlJbXBsPFwKKyAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KTtcCit2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjAyOTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oCkBAIC0wLDAgKzEsMjQzIEBACisvLyBDb3B5cmlnaHQgMjAwMyBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBEYW4gRWdub3IgKGVnbm9yQGdvb2dsZS5jb20pCisvLworLy8gQSAic21hcnQiIHBvaW50ZXIgdHlwZSB3aXRoIHJlZmVyZW5jZSB0cmFja2luZy4gIEV2ZXJ5IHBvaW50ZXIgdG8gYQorLy8gcGFydGljdWxhciBvYmplY3QgaXMga2VwdCBvbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiAgV2hlbiB0aGUgbGFzdCBwb2ludGVyCisvLyB0byBhbiBvYmplY3QgaXMgZGVzdHJveWVkIG9yIHJlYXNzaWduZWQsIHRoZSBvYmplY3QgaXMgZGVsZXRlZC4KKy8vCisvLyBVc2VkIHByb3Blcmx5LCB0aGlzIGRlbGV0ZXMgdGhlIG9iamVjdCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBnb2VzIGF3YXkuCisvLyBUaGVyZSBhcmUgc2V2ZXJhbCBjYXZlYXRzOgorLy8gLSBMaWtlIGFsbCByZWZlcmVuY2UgY291bnRpbmcgc2NoZW1lcywgY3ljbGVzIGxlYWQgdG8gbGVha3MuCisvLyAtIEVhY2ggc21hcnQgcG9pbnRlciBpcyBhY3R1YWxseSB0d28gcG9pbnRlcnMgKDggYnl0ZXMgaW5zdGVhZCBvZiA0KS4KKy8vIC0gRXZlcnkgdGltZSBhIHBvaW50ZXIgaXMgYXNzaWduZWQsIHRoZSBlbnRpcmUgbGlzdCBvZiBwb2ludGVycyB0byB0aGF0CisvLyAgIG9iamVjdCBpcyB0cmF2ZXJzZWQuICBUaGlzIGNsYXNzIGlzIHRoZXJlZm9yZSBOT1QgU1VJVEFCTEUgd2hlbiB0aGVyZQorLy8gICB3aWxsIG9mdGVuIGJlIG1vcmUgdGhhbiB0d28gb3IgdGhyZWUgcG9pbnRlcnMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdC4KKy8vIC0gUmVmZXJlbmNlcyBhcmUgb25seSB0cmFja2VkIGFzIGxvbmcgYXMgbGlua2VkX3B0cjw+IG9iamVjdHMgYXJlIGNvcGllZC4KKy8vICAgSWYgYSBsaW5rZWRfcHRyPD4gaXMgY29udmVydGVkIHRvIGEgcmF3IHBvaW50ZXIgYW5kIGJhY2ssIEJBRCBUSElOR1MKKy8vICAgd2lsbCBoYXBwZW4gKGRvdWJsZSBkZWxldGlvbikuCisvLworLy8gQSBnb29kIHVzZSBvZiB0aGlzIGNsYXNzIGlzIHN0b3Jpbmcgb2JqZWN0IHJlZmVyZW5jZXMgaW4gU1RMIGNvbnRhaW5lcnMuCisvLyBZb3UgY2FuIHNhZmVseSBwdXQgbGlua2VkX3B0cjw+IGluIGEgdmVjdG9yPD4uCisvLyBPdGhlciB1c2VzIG1heSBub3QgYmUgYXMgZ29vZC4KKy8vCisvLyBOb3RlOiBJZiB5b3UgdXNlIGFuIGluY29tcGxldGUgdHlwZSB3aXRoIGxpbmtlZF9wdHI8PiwgdGhlIGNsYXNzCisvLyAqY29udGFpbmluZyogbGlua2VkX3B0cjw+IG11c3QgaGF2ZSBhIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIChldmVuCisvLyBpZiB0aGV5IGRvIG5vdGhpbmchKS4KKy8vCisvLyBCaWxsIEdpYmJvbnMgc3VnZ2VzdGVkIHdlIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzLgorLy8KKy8vIFRocmVhZCBTYWZldHk6CisvLyAgIFVubGlrZSBvdGhlciBsaW5rZWRfcHRyIGltcGxlbWVudGF0aW9ucywgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorLy8gICBhIGxpbmtlZF9wdHIgb2JqZWN0IGlzIHRocmVhZC1zYWZlIGluIHRoZSBzZW5zZSB0aGF0OgorLy8gICAgIC0gaXQncyBzYWZlIHRvIGNvcHkgbGlua2VkX3B0ciBvYmplY3RzIGNvbmN1cnJlbnRseSwKKy8vICAgICAtIGl0J3Mgc2FmZSB0byBjb3B5ICpmcm9tKiBhIGxpbmtlZF9wdHIgYW5kIHJlYWQgaXRzIHVuZGVybHlpbmcKKy8vICAgICAgIHJhdyBwb2ludGVyIChlLmcuIHZpYSBnZXQoKSkgY29uY3VycmVudGx5LCBhbmQKKy8vICAgICAtIGl0J3Mgc2FmZSB0byB3cml0ZSB0byB0d28gbGlua2VkX3B0cnMgdGhhdCBwb2ludCB0byB0aGUgc2FtZQorLy8gICAgICAgc2hhcmVkIG9iamVjdCBjb25jdXJyZW50bHkuCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVuYW1lIHRoaXMgdG8gc2FmZV9saW5rZWRfcHRyIHRvIGF2b2lkCisvLyBjb25mdXNpb24gd2l0aCBub3JtYWwgbGlua2VkX3B0ci4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUHJvdGVjdHMgY29weWluZyBvZiBhbGwgbGlua2VkX3B0ciBvYmplY3RzLgorR1RFU1RfQVBJXyBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKKworLy8gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgYWxsIGluc3RhbmNlcyBvZiBsaW5rZWRfcHRyPD4uICBJdCBuZWVkcyB0byBiZQorLy8gYSBub24tdGVtcGxhdGUgY2xhc3MgYmVjYXVzZSBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0cjw+IGNhbiByZWZlciB0bworLy8gdGhlIHNhbWUgb2JqZWN0IChsaW5rZWRfcHRyPFN1cGVyY2xhc3M+KG9iaikgdnMgbGlua2VkX3B0cjxTdWJjbGFzcz4ob2JqKSkuCisvLyBTbywgaXQgbmVlZHMgdG8gYmUgcG9zc2libGUgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyIHRvIHBhcnRpY2lwYXRlCisvLyBpbiB0aGUgc2FtZSBjaXJjdWxhciBsaW5rZWQgbGlzdCwgc28gd2UgbmVlZCBhIHNpbmdsZSBjbGFzcyB0eXBlIGhlcmUuCisvLworLy8gRE8gTk9UIFVTRSBUSElTIENMQVNTIERJUkVDVExZIFlPVVJTRUxGLiAgVXNlIGxpbmtlZF9wdHI8VD4uCitjbGFzcyBsaW5rZWRfcHRyX2ludGVybmFsIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhIG5ldyBjaXJjbGUgdGhhdCBpbmNsdWRlcyBvbmx5IHRoaXMgaW5zdGFuY2UuCisgIHZvaWQgam9pbl9uZXcoKSB7CisgICAgbmV4dF8gPSB0aGlzOworICB9CisKKyAgLy8gTWFueSBsaW5rZWRfcHRyIG9wZXJhdGlvbnMgbWF5IGNoYW5nZSBwLmxpbmtfIGZvciBzb21lIGxpbmtlZF9wdHIKKyAgLy8gdmFyaWFibGUgcCBpbiB0aGUgc2FtZSBjaXJjbGUgYXMgdGhpcyBvYmplY3QuICBUaGVyZWZvcmUgd2UgbmVlZAorICAvLyB0byBwcmV2ZW50IHR3byBzdWNoIG9wZXJhdGlvbnMgZnJvbSBvY2N1cnJpbmcgY29uY3VycmVudGx5LgorICAvLworICAvLyBOb3RlIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHIgb2JqZWN0cyBjYW4gY29leGlzdCBpbiBhCisgIC8vIGNpcmNsZSAoZS5nLiBsaW5rZWRfcHRyPEJhc2U+LCBsaW5rZWRfcHRyPERlcml2ZWQxPiwgYW5kCisgIC8vIGxpbmtlZF9wdHI8RGVyaXZlZDI+KS4gIFRoZXJlZm9yZSB3ZSBtdXN0IHVzZSBhIHNpbmdsZSBtdXRleCB0bworICAvLyBwcm90ZWN0IGFsbCBsaW5rZWRfcHRyIG9iamVjdHMuICBUaGlzIGNhbiBjcmVhdGUgc2VyaW91cworICAvLyBjb250ZW50aW9uIGluIHByb2R1Y3Rpb24gY29kZSwgYnV0IGlzIGFjY2VwdGFibGUgaW4gYSB0ZXN0aW5nCisgIC8vIGZyYW1ld29yay4KKworICAvLyBKb2luIGFuIGV4aXN0aW5nIGNpcmNsZS4KKyAgdm9pZCBqb2luKGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHB0cikKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfbGlua2VkX3B0cl9tdXRleCkgeworICAgIE11dGV4TG9jayBsb2NrKCZnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisgICAgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcCA9IHB0cjsKKyAgICB3aGlsZSAocC0+bmV4dF8gIT0gcHRyKSB7CisgICAgICBhc3NlcnQocC0+bmV4dF8gIT0gdGhpcyAmJgorICAgICAgICAgICAgICJUcnlpbmcgdG8gam9pbigpIGEgbGlua2VkIHJpbmcgd2UgYXJlIGFscmVhZHkgaW4uICIKKyAgICAgICAgICAgICAiSXMgR01vY2sgdGhyZWFkIHNhZmV0eSBlbmFibGVkPyIpOworICAgICAgcCA9IHAtPm5leHRfOworICAgIH0KKyAgICBwLT5uZXh0XyA9IHRoaXM7CisgICAgbmV4dF8gPSBwdHI7CisgIH0KKworICAvLyBMZWF2ZSB3aGF0ZXZlciBjaXJjbGUgd2UncmUgcGFydCBvZi4gIFJldHVybnMgdHJ1ZSBpZiB3ZSB3ZXJlIHRoZQorICAvLyBsYXN0IG1lbWJlciBvZiB0aGUgY2lyY2xlLiAgT25jZSB0aGlzIGlzIGRvbmUsIHlvdSBjYW4gam9pbigpIGFub3RoZXIuCisgIGJvb2wgZGVwYXJ0KCkKKyAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfbGlua2VkX3B0cl9tdXRleCkgeworICAgIE11dGV4TG9jayBsb2NrKCZnX2xpbmtlZF9wdHJfbXV0ZXgpOworCisgICAgaWYgKG5leHRfID09IHRoaXMpIHJldHVybiB0cnVlOworICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBuZXh0XzsKKyAgICB3aGlsZSAocC0+bmV4dF8gIT0gdGhpcykgeworICAgICAgYXNzZXJ0KHAtPm5leHRfICE9IG5leHRfICYmCisgICAgICAgICAgICAgIlRyeWluZyB0byBkZXBhcnQoKSBhIGxpbmtlZCByaW5nIHdlIGFyZSBub3QgaW4uICIKKyAgICAgICAgICAgICAiSXMgR01vY2sgdGhyZWFkIHNhZmV0eSBlbmFibGVkPyIpOworICAgICAgcCA9IHAtPm5leHRfOworICAgIH0KKyAgICBwLT5uZXh0XyA9IG5leHRfOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgbXV0YWJsZSBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBuZXh0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgbGlua2VkX3B0ciB7CisgcHVibGljOgorICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworCisgIC8vIFRha2Ugb3ZlciBvd25lcnNoaXAgb2YgYSByYXcgcG9pbnRlci4gIFRoaXMgc2hvdWxkIGhhcHBlbiBhcyBzb29uIGFzCisgIC8vIHBvc3NpYmxlIGFmdGVyIHRoZSBvYmplY3QgaXMgY3JlYXRlZC4KKyAgZXhwbGljaXQgbGlua2VkX3B0cihUKiBwdHIgPSBOVUxMKSB7IGNhcHR1cmUocHRyKTsgfQorICB+bGlua2VkX3B0cigpIHsgZGVwYXJ0KCk7IH0KKworICAvLyBDb3B5IGFuIGV4aXN0aW5nIGxpbmtlZF9wdHI8PiwgYWRkaW5nIG91cnNlbHZlcyB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gbGlua2VkX3B0cihsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIHsgY29weSgmcHRyKTsgfQorICBsaW5rZWRfcHRyKGxpbmtlZF9wdHIgY29uc3QmIHB0cikgeyAgLy8gTk9MSU5UCisgICAgYXNzZXJ0KCZwdHIgIT0gdGhpcyk7CisgICAgY29weSgmcHRyKTsKKyAgfQorCisgIC8vIEFzc2lnbm1lbnQgcmVsZWFzZXMgdGhlIG9sZCB2YWx1ZSBhbmQgYWNxdWlyZXMgdGhlIG5ldy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGxpbmtlZF9wdHImIG9wZXJhdG9yPShsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIHsKKyAgICBkZXBhcnQoKTsKKyAgICBjb3B5KCZwdHIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGxpbmtlZF9wdHImIG9wZXJhdG9yPShsaW5rZWRfcHRyIGNvbnN0JiBwdHIpIHsKKyAgICBpZiAoJnB0ciAhPSB0aGlzKSB7CisgICAgICBkZXBhcnQoKTsKKyAgICAgIGNvcHkoJnB0cik7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFNtYXJ0IHBvaW50ZXIgbWVtYmVycy4KKyAgdm9pZCByZXNldChUKiBwdHIgPSBOVUxMKSB7CisgICAgZGVwYXJ0KCk7CisgICAgY2FwdHVyZShwdHIpOworICB9CisgIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICp2YWx1ZV87IH0KKworICBib29sIG9wZXJhdG9yPT0oVCogcCkgY29uc3QgeyByZXR1cm4gdmFsdWVfID09IHA7IH0KKyAgYm9vbCBvcGVyYXRvciE9KFQqIHApIGNvbnN0IHsgcmV0dXJuIHZhbHVlXyAhPSBwOyB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBib29sIG9wZXJhdG9yPT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXyA9PSBwdHIuZ2V0KCk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGJvb2wgb3BlcmF0b3IhPShsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfICE9IHB0ci5nZXQoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGZyaWVuZCBjbGFzcyBsaW5rZWRfcHRyOworCisgIFQqIHZhbHVlXzsKKyAgbGlua2VkX3B0cl9pbnRlcm5hbCBsaW5rXzsKKworICB2b2lkIGRlcGFydCgpIHsKKyAgICBpZiAobGlua18uZGVwYXJ0KCkpIGRlbGV0ZSB2YWx1ZV87CisgIH0KKworICB2b2lkIGNhcHR1cmUoVCogcHRyKSB7CisgICAgdmFsdWVfID0gcHRyOworICAgIGxpbmtfLmpvaW5fbmV3KCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gdm9pZCBjb3B5KGxpbmtlZF9wdHI8VT4gY29uc3QqIHB0cikgeworICAgIHZhbHVlXyA9IHB0ci0+Z2V0KCk7CisgICAgaWYgKHZhbHVlXykKKyAgICAgIGxpbmtfLmpvaW4oJnB0ci0+bGlua18pOworICAgIGVsc2UKKyAgICAgIGxpbmtfLmpvaW5fbmV3KCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZQorYm9vbCBvcGVyYXRvcj09KFQqIHB0ciwgY29uc3QgbGlua2VkX3B0cjxUPiYgeCkgeworICByZXR1cm4gcHRyID09IHguZ2V0KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZQorYm9vbCBvcGVyYXRvciE9KFQqIHB0ciwgY29uc3QgbGlua2VkX3B0cjxUPiYgeCkgeworICByZXR1cm4gcHRyICE9IHguZ2V0KCk7Cit9CisKKy8vIEEgZnVuY3Rpb24gdG8gY29udmVydCBUKiBpbnRvIGxpbmtlZF9wdHI8VD4KKy8vIERvaW5nIGUuZy4gbWFrZV9saW5rZWRfcHRyKG5ldyBGb29CYXJCYXo8dHlwZT4oYXJnKSkgaXMgYSBzaG9ydGVyIG5vdGF0aW9uCisvLyBmb3IgbGlua2VkX3B0cjxGb29CYXJCYXo8dHlwZT4gPihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2xpbmtlZF9wdHI8VD4gbWFrZV9saW5rZWRfcHRyKFQqIHB0cikgeworICByZXR1cm4gbGlua2VkX3B0cjxUPihwdHIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFkODFkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaApAQCAtMCwwICsxLDUxNDYgQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUeXBlIGFuZCBmdW5jdGlvbiB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzLgorLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gQ3VycmVudGx5IEdvb2dsZSBUZXN0IHN1cHBvcnRzIGF0IG1vc3QgNTAgYXJndW1lbnRzIGluIFZhbHVlcywKKy8vIGFuZCBhdCBtb3N0IDEwIGFyZ3VtZW50cyBpbiBDb21iaW5lLiBQbGVhc2UgY29udGFjdAorLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkIG1vcmUuCisvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIENvbWJpbmUgaXMgbGltaXRlZAorLy8gYnkgdGhlIG1heGltdW0gYXJpdHkgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHR1cGxlIHdoaWNoIGlzCisvLyBjdXJyZW50bHkgc2V0IGF0IDEwLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIFZhbHVlc0luKCksIHdoaWNoIGlzIGltcGxlbWVudGVkIGluCisvLyBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSk7CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKKyAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVzZWQgaW4gdGhlIFZhbHVlcygpIGZ1bmN0aW9uIHRvIHByb3ZpZGUgcG9seW1vcnBoaWMgY2FwYWJpbGl0aWVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorY2xhc3MgVmFsdWVBcnJheTEgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVmFsdWVBcnJheTEoVDEgdjEpIDogdjFfKHYxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBWYWx1ZUFycmF5MiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MihUMSB2MSwgVDIgdjIpIDogdjFfKHYxKSwgdjJfKHYyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitjbGFzcyBWYWx1ZUFycmF5MyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MyhUMSB2MSwgVDIgdjIsIFQzIHYzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2Mykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorY2xhc3MgVmFsdWVBcnJheTQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorY2xhc3MgVmFsdWVBcnJheTUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCisgICAgICB2NF8odjQpLCB2NV8odjUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgorY2xhc3MgVmFsdWVBcnJheTYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NikgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2NsYXNzIFZhbHVlQXJyYXk3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorY2xhc3MgVmFsdWVBcnJheTggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCisgICAgICBUOCB2OCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5OCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK2NsYXNzIFZhbHVlQXJyYXk5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICAgIFQ5IHY5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2NsYXNzIFZhbHVlQXJyYXkxMCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorY2xhc3MgVmFsdWVBcnJheTExIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitjbGFzcyBWYWx1ZUFycmF5MTIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTEyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK2NsYXNzIFZhbHVlQXJyYXkxMyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KK2NsYXNzIFZhbHVlQXJyYXkxNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK2NsYXNzIFZhbHVlQXJyYXkxNSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2PgorY2xhc3MgVmFsdWVBcnJheTE2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNikgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3PgorY2xhc3MgVmFsdWVBcnJheTE3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICAgIFQxNyB2MTcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgorY2xhc3MgVmFsdWVBcnJheTE4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxOCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgorY2xhc3MgVmFsdWVBcnJheTE5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxOSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgorY2xhc3MgVmFsdWVBcnJheTIwIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxPgorY2xhc3MgVmFsdWVBcnJheTIxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorY2xhc3MgVmFsdWVBcnJheTIyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgorY2xhc3MgVmFsdWVBcnJheTIzIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK2NsYXNzIFZhbHVlQXJyYXkyNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitjbGFzcyBWYWx1ZUFycmF5MjUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKKyAgICAgIFQyNSB2MjUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjUmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjY+CitjbGFzcyBWYWx1ZUFycmF5MjYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitjbGFzcyBWYWx1ZUFycmF5MjcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4PgorY2xhc3MgVmFsdWVBcnJheTI4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCisgICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyOCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK2NsYXNzIFZhbHVlQXJyYXkyOSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAorICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCisgICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAorICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwKKyAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitjbGFzcyBWYWx1ZUFycmF5MzAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorY2xhc3MgVmFsdWVBcnJheTMxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxKSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KK2NsYXNzIFZhbHVlQXJyYXkzMiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMikgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKKyAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitjbGFzcyBWYWx1ZUFycmF5MzMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCisgICAgICBUMzMgdjMzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK2NsYXNzIFZhbHVlQXJyYXkzNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1PgorY2xhc3MgVmFsdWVBcnJheTM1IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAorICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKKyAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCisgICAgICB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLAorICAgICAgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK2NsYXNzIFZhbHVlQXJyYXkzNiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKKyAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksCisgICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitjbGFzcyBWYWx1ZUFycmF5MzcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwKKyAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksCisgICAgICB2MzZfKHYzNiksIHYzN18odjM3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK2NsYXNzIFZhbHVlQXJyYXkzOCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgorY2xhc3MgVmFsdWVBcnJheTM5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSkgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzOSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitjbGFzcyBWYWx1ZUFycmF5NDAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAorICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwKKyAgICAgIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksCisgICAgICB2NDBfKHY0MCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MT4KK2NsYXNzIFZhbHVlQXJyYXk0MSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsCisgICAgICBUNDEgdjQxKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCisgICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorY2xhc3MgVmFsdWVBcnJheTQyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKX07CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+CitjbGFzcyBWYWx1ZUFycmF5NDMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAorICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKKyAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCisgICAgICB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLAorICAgICAgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwKKyAgICAgIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0Mykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KK2NsYXNzIFZhbHVlQXJyYXk0NCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCisgICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLAorICAgICAgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwKKyAgICAgIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksCisgICAgICB2NDNfKHY0MyksIHY0NF8odjQ0KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK2NsYXNzIFZhbHVlQXJyYXk0NSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwKKyAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksCisgICAgICB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLAorICAgICAgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2PgorY2xhc3MgVmFsdWVBcnJheTQ2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLAorICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ2JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+CitjbGFzcyBWYWx1ZUFycmF5NDcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NykgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksCisgICAgICB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLAorICAgICAgdjQ3Xyh2NDcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitjbGFzcyBWYWx1ZUFycmF5NDggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCkgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKKyAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksCisgICAgICB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLAorICAgICAgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwKKyAgICAgIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ4Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitjbGFzcyBWYWx1ZUFycmF5NDkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwKKyAgICAgIFQ0OSB2NDkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksCisgICAgICB2NDVfKHY0NSksIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCksIHY0OV8odjQ5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKSwgc3RhdGljX2Nhc3Q8VD4odjQ5Xyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKKyAgY29uc3QgVDQ5IHY0OV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitjbGFzcyBWYWx1ZUFycmF5NTAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTUwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSwKKyAgICAgIFQ1MCB2NTApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksCisgICAgICB2NDVfKHY0NSksIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCksIHY0OV8odjQ5KSwgdjUwXyh2NTApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0OF8pLCBzdGF0aWNfY2FzdDxUPih2NDlfKSwgc3RhdGljX2Nhc3Q8VD4odjUwXyl9OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTUwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKKyAgY29uc3QgVDQ5IHY0OV87CisgIGNvbnN0IFQ1MCB2NTBfOworfTsKKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHZhbHVlcyBwcm9kdWNlZAorLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMihjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDJfOworICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMjo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyJiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzPiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzPiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKKyAgICAgICAgZzNfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzKQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDNfOworICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM187CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMzo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzJiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0CisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDRfOworICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDVfOworICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjU6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNSYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsCisgICAgICAgIFQ2PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNigpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NikgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50Nl87CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2Xyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCisgICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCisgICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKKyAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCisgICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCisgICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKKyAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCisgICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCisgICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKKyAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKKyAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNjo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNgorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNz4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCisgICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDdfOworICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICAgIFQ3LCBUOD4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCisgICAgICAgICAgZzhfKGc4KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sCisgICAgICAgIGc4Xy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDhfOworICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8CisgICAgICAgICAgY3VycmVudDhfID09IGVuZDhfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBiZWdpbjhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBjdXJyZW50OF87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjg6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDgsIFQ5PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzkpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOSgpIHt9CisKKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAorICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAorICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSwgZzlfLCBnOV8uYmVnaW4oKSk7CisgIH0KKyAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCisgICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sCisgICAgICAgIGc4Xy5lbmQoKSwgZzlfLCBnOV8uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciYgY3VycmVudDgsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciYgY3VycmVudDkpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCisgICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLAorICAgICAgICAgIGJlZ2luOF8oZzguYmVnaW4oKSksIGVuZDhfKGc4LmVuZCgpKSwgY3VycmVudDhfKGN1cnJlbnQ4KSwKKyAgICAgICAgICBiZWdpbjlfKGc5LmJlZ2luKCkpLCBlbmQ5XyhnOS5lbmQoKSksIGN1cnJlbnQ5XyhjdXJyZW50OSkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50OV87CisgICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7CisgICAgICAgIGN1cnJlbnQ5XyA9IGJlZ2luOV87CisgICAgICAgICsrY3VycmVudDhfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8gJiYKKyAgICAgICAgICBjdXJyZW50OV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ5Xyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCisgICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCisgICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKKyAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCisgICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCisgICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKKyAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCisgICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCisgICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKKyAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksCisgICAgICAgIGJlZ2luN18ob3RoZXIuYmVnaW43XyksCisgICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwKKyAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XyksCisgICAgICAgIGJlZ2luOF8ob3RoZXIuYmVnaW44XyksCisgICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwKKyAgICAgICAgY3VycmVudDhfKG90aGVyLmN1cnJlbnQ4XyksCisgICAgICAgIGJlZ2luOV8ob3RoZXIuYmVnaW45XyksCisgICAgICAgIGVuZDlfKG90aGVyLmVuZDlfKSwKKyAgICAgICAgY3VycmVudDlfKG90aGVyLmN1cnJlbnQ5XykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKKyAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8sICpjdXJyZW50N18sICpjdXJyZW50OF8sCisgICAgICAgICAgICAqY3VycmVudDlfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8CisgICAgICAgICAgY3VycmVudDhfID09IGVuZDhfIHx8CisgICAgICAgICAgY3VycmVudDlfID09IGVuZDlfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBiZWdpbjhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBjdXJyZW50OF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBiZWdpbjlfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgZW5kOV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBjdXJyZW50OV87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjk6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOSYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiBnOV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDgsIFQ5LCBUMTA+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpLCBnMTBfLCBnMTBfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAorICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpLCBnMTBfLCBnMTBfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDEwPiYgZzEwLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3ImIGN1cnJlbnQxMCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAorICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSwKKyAgICAgICAgICBiZWdpbjEwXyhnMTAuYmVnaW4oKSksIGVuZDEwXyhnMTAuZW5kKCkpLCBjdXJyZW50MTBfKGN1cnJlbnQxMCkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50MTBfOworICAgICAgaWYgKGN1cnJlbnQxMF8gPT0gZW5kMTBfKSB7CisgICAgICAgIGN1cnJlbnQxMF8gPSBiZWdpbjEwXzsKKyAgICAgICAgKytjdXJyZW50OV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7CisgICAgICAgIGN1cnJlbnQ5XyA9IGJlZ2luOV87CisgICAgICAgICsrY3VycmVudDhfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8gJiYKKyAgICAgICAgICBjdXJyZW50OV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ5XyAmJgorICAgICAgICAgIGN1cnJlbnQxMF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxMF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAorICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAorICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCisgICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pLAorICAgICAgICBiZWdpbjEwXyhvdGhlci5iZWdpbjEwXyksCisgICAgICAgIGVuZDEwXyhvdGhlci5lbmQxMF8pLAorICAgICAgICBjdXJyZW50MTBfKG90aGVyLmN1cnJlbnQxMF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAorICAgICAgICAgICAgKmN1cnJlbnQ5XywgKmN1cnJlbnQxMF8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKKyAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV8gfHwKKyAgICAgICAgICBjdXJyZW50MTBfID09IGVuZDEwXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGJlZ2luMTBfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGVuZDEwXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBjdXJyZW50MTBfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMDo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiBnOV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4gZzEwXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAKKworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEhlbHBlciBjbGFzc2VzIHByb3ZpZGluZyBDb21iaW5lKCkgd2l0aCBwb2x5bW9ycGhpYyBmZWF0dXJlcy4gVGhleSBhbGxvdworLy8gY2FzdGluZyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yTjxUPiB0byBQYXJhbUdlbmVyYXRvcjxVPiBpZiBUIGlzCisvLyBjb252ZXJ0aWJsZSB0byBVLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIyKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyPFQxLCBUMj4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMiYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMgorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzIHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDM+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDM+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMzxUMSwgVDIsIFQzPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIzJiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworICBjb25zdCBHZW5lcmF0b3IzIGczXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMworCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI0KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNDxUMSwgVDIsIFQzLCBUND4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjU+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTxUMSwgVDIsIFQzLCBUNCwgVDU+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDY+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI2JiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworICBjb25zdCBHZW5lcmF0b3IzIGczXzsKKyAgY29uc3QgR2VuZXJhdG9yNCBnNF87CisgIGNvbnN0IEdlbmVyYXRvcjUgZzVfOworICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNgorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI3KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgVDc+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNworCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjg+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKKyAgICAgICAgICBnOF8oZzgpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywKKyAgICAgIFQ4PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKKyAgICBjbGFzcyBHZW5lcmF0b3I4LCBjbGFzcyBHZW5lcmF0b3I5PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI5KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsCisgICAgY29uc3QgR2VuZXJhdG9yOSYgZzkpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgIFQ5PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICAgIFQ5PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ5PiA+KGc5XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOSYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87CisgIGNvbnN0IEdlbmVyYXRvcjcgZzdfOworICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKKyAgY29uc3QgR2VuZXJhdG9yOSBnOV87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKKyAgICBjbGFzcyBHZW5lcmF0b3I4LCBjbGFzcyBHZW5lcmF0b3I5LCBjbGFzcyBHZW5lcmF0b3IxMD4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMCB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsCisgICAgY29uc3QgR2VuZXJhdG9yOSYgZzksIGNvbnN0IEdlbmVyYXRvcjEwJiBnMTApCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCisgICAgICAgICAgZzlfKGc5KSwgZzEwXyhnMTApIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LAorICAgICAgVDEwPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LAorICAgICAgICBUMTA+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwKKyAgICAgICAgICAgIFQxMD4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ5PiA+KGc5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxMD4gPihnMTBfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87CisgIGNvbnN0IEdlbmVyYXRvcjcgZzdfOworICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKKyAgY29uc3QgR2VuZXJhdG9yOSBnOV87CisgIGNvbnN0IEdlbmVyYXRvcjEwIGcxMF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwCisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3YzQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcApAQCAtMCwwICsxLDI4NiBAQAorJCQgLSotIG1vZGU6IGMrKzsgLSotCiskdmFyIG4gPSA1MCAgJCQgTWF4aW11bSBsZW5ndGggb2YgVmFsdWVzIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCiskdmFyIG1heHR1cGxlID0gMTAgICQkIE1heGltdW0gbnVtYmVyIG9mIENvbWJpbmUgYXJndW1lbnRzIHdlIHdhbnQgdG8gc3VwcG9ydC4KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKy8vIEN1cnJlbnRseSBHb29nbGUgVGVzdCBzdXBwb3J0cyBhdCBtb3N0ICRuIGFyZ3VtZW50cyBpbiBWYWx1ZXMsCisvLyBhbmQgYXQgbW9zdCAkbWF4dHVwbGUgYXJndW1lbnRzIGluIENvbWJpbmUuIFBsZWFzZSBjb250YWN0CisvLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQgbW9yZS4KKy8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gQ29tYmluZSBpcyBsaW1pdGVkCisvLyBieSB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHVwbGUgd2hpY2ggaXMKKy8vIGN1cnJlbnRseSBzZXQgYXQgJG1heHR1cGxlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXworCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIFZhbHVlc0luKCksIHdoaWNoIGlzIGltcGxlbWVudGVkIGluCisvLyBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8CisgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+CitWYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSk7CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKKyAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcik7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVzZWQgaW4gdGhlIFZhbHVlcygpIGZ1bmN0aW9uIHRvIHByb3ZpZGUgcG9seW1vcnBoaWMgY2FwYWJpbGl0aWVzLgorJHJhbmdlIGkgMS4ubgorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCisKK3RlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+CitjbGFzcyBWYWx1ZUFycmF5JGkgeworIHB1YmxpYzoKKyAgJGlmIGk9PTEgW1tleHBsaWNpdCBdXVZhbHVlQXJyYXkkaSgkZm9yIGosIFtbVCRqIHYkal1dKSA6ICRmb3IgaiwgW1t2JChqKV8odiRqKV1dIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHskZm9yIGosIFtbc3RhdGljX2Nhc3Q8VD4odiQoailfKV1dfTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkkaSYgb3RoZXIpOworCiskZm9yIGogW1sKKworICBjb25zdCBUJGogdiQoailfOworXV0KKworfTsKKworXV0KKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHZhbHVlcyBwcm9kdWNlZAorLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuCisvLworJHJhbmdlIGkgMi4ubWF4dHVwbGUKKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHJhbmdlIGsgMi4uaQorCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8JGZvciBqLCBbW1Qkal1dPiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkoJGZvciBqLCBbW2NvbnN0IFBhcmFtR2VuZXJhdG9yPFQkaj4mIGckal1dKQorICAgICAgOiAkZm9yIGosIFtbZyQoailfKGckaildXSB7fQorICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsICRmb3IgaiwgW1tnJChqKV8sIGckKGopXy5iZWdpbigpXV0pOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCAkZm9yIGosIFtbZyQoailfLCBnJChqKV8uZW5kKCldXSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwgJGZvciBqLCBbWworCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUJGo+JiBnJGosCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUJGo+OjppdGVyYXRvciYgY3VycmVudCQoaildXSkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyRmb3IgaiwgW1sKKworICAgICAgICAgIGJlZ2luJChqKV8oZyRqLmJlZ2luKCkpLCBlbmQkKGopXyhnJGouZW5kKCkpLCBjdXJyZW50JChqKV8oY3VycmVudCRqKQorXV0gICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50JChpKV87CisKKyRmb3IgayBbWworICAgICAgaWYgKGN1cnJlbnQkKGkrMi1rKV8gPT0gZW5kJChpKzItaylfKSB7CisgICAgICAgIGN1cnJlbnQkKGkrMi1rKV8gPSBiZWdpbiQoaSsyLWspXzsKKyAgICAgICAgKytjdXJyZW50JChpKzItay0xKV87CisgICAgICB9CisKK11dCisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgkZm9yIGogICYmIFtbCisKKyAgICAgICAgICBjdXJyZW50JChqKV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQkKGopXworXV0pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLCAkZm9yIGosIFtbCisKKyAgICAgICAgYmVnaW4kKGopXyhvdGhlci5iZWdpbiQoailfKSwKKyAgICAgICAgZW5kJChqKV8ob3RoZXIuZW5kJChqKV8pLAorICAgICAgICBjdXJyZW50JChqKV8ob3RoZXIuY3VycmVudCQoailfKQorXV0geworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoJGZvciBqLCBbWypjdXJyZW50JChqKV9dXSk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorJGZvciBqICB8fCBbWworCisgICAgICAgICAgY3VycmVudCQoailfID09IGVuZCQoailfCitdXTsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorJGZvciBqIFtbCisKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUJGo+OjppdGVyYXRvciBiZWdpbiQoailfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGVuZCQoailfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGN1cnJlbnQkKGopXzsKK11dCisKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGk6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkmIG90aGVyKTsKKworCiskZm9yIGogW1sKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VCRqPiBnJChqKV87CisKK11dCit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpCisKKworXV0KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cKKy8vIGNhc3RpbmcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvck48VD4gdG8gUGFyYW1HZW5lcmF0b3I8VT4gaWYgVCBpcworLy8gY29udmVydGlibGUgdG8gVS4KKy8vCiskcmFuZ2UgaSAyLi5tYXh0dXBsZQorJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCisKK3RlbXBsYXRlIDwkZm9yIGosIFtbY2xhc3MgR2VuZXJhdG9yJGpdXT4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIkaSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpKCRmb3IgaiwgW1tjb25zdCBHZW5lcmF0b3IkaiYgZyRqXV0pCisgICAgICA6ICRmb3IgaiwgW1tnJChqKV8oZyRqKV1dIHt9CisgIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8JGZvciBqLCBbW1Qkal1dPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpPCRmb3IgaiwgW1tUJGpdXT4oCiskZm9yIGosW1sKKworICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUJGo+ID4oZyQoailfKQorXV0pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkmIG90aGVyKTsKKworCiskZm9yIGogW1sKKyAgY29uc3QgR2VuZXJhdG9yJGogZyQoailfOworCitdXQorfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIkaQorCitdXQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2FiOWIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgKQEAgLTAsMCArMSw3MzEgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBJbnB1dCB0byBhIHBhcmFtZXRlcml6ZWQgdGVzdCBuYW1lIGdlbmVyYXRvciwgZGVzY3JpYmluZyBhIHRlc3QgcGFyYW1ldGVyLgorLy8gQ29uc2lzdHMgb2YgdGhlIHBhcmFtZXRlciB2YWx1ZSBhbmQgdGhlIGludGVnZXIgcGFyYW1ldGVyIGluZGV4LgordGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KK3N0cnVjdCBUZXN0UGFyYW1JbmZvIHsKKyAgVGVzdFBhcmFtSW5mbyhjb25zdCBQYXJhbVR5cGUmIGFfcGFyYW0sIHNpemVfdCBhbl9pbmRleCkgOgorICAgIHBhcmFtKGFfcGFyYW0pLAorICAgIGluZGV4KGFuX2luZGV4KSB7fQorICBQYXJhbVR5cGUgcGFyYW07CisgIHNpemVfdCBpbmRleDsKK307CisKKy8vIEEgYnVpbHRpbiBwYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSBnZW5lcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mCisvLyB0ZXN0aW5nOjpQcmludFRvU3RyaW5nLgorc3RydWN0IFByaW50VG9TdHJpbmdQYXJhbU5hbWUgeworICB0ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgorICBzdGQ6OnN0cmluZyBvcGVyYXRvcigpKGNvbnN0IFRlc3RQYXJhbUluZm88UGFyYW1UeXBlPiYgaW5mbykgY29uc3QgeworICAgIHJldHVybiBQcmludFRvU3RyaW5nKGluZm8ucGFyYW0pOworICB9Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIE91dHB1dHMgYSBtZXNzYWdlIGV4cGxhaW5pbmcgaW52YWxpZCByZWdpc3RyYXRpb24gb2YgZGlmZmVyZW50CisvLyBmaXh0dXJlIGNsYXNzIGZvciB0aGUgc2FtZSB0ZXN0IGNhc2UuIFRoaXMgbWF5IGhhcHBlbiB3aGVuCisvLyBURVNUX1AgbWFjcm8gaXMgdXNlZCB0byBkZWZpbmUgdHdvIHRlc3RzIHdpdGggdGhlIHNhbWUgbmFtZQorLy8gYnV0IGluIGRpZmZlcmVudCBuYW1lc3BhY2VzLgorR1RFU1RfQVBJXyB2b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U7Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFBhcmFtR2VuZXJhdG9yOworCisvLyBJbnRlcmZhY2UgZm9yIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uCisvLyBvZiBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1JdGVyYXRvckludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5QYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKCkge30KKyAgLy8gQSBwb2ludGVyIHRvIHRoZSBiYXNlIGdlbmVyYXRvciBpbnN0YW5jZS4KKyAgLy8gVXNlZCBvbmx5IGZvciB0aGUgcHVycG9zZXMgb2YgaXRlcmF0b3IgY29tcGFyaXNvbgorICAvLyB0byBtYWtlIHN1cmUgdGhhdCB0d28gaXRlcmF0b3JzIGJlbG9uZyB0byB0aGUgc2FtZSBnZW5lcmF0b3IuCisgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCA9IDA7CisgIC8vIEFkdmFuY2VzIGl0ZXJhdG9yIHRvIHBvaW50IHRvIHRoZSBuZXh0IGVsZW1lbnQKKyAgLy8gcHJvdmlkZWQgYnkgdGhlIGdlbmVyYXRvci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICAvLyBmb3Igbm90IGNhbGxpbmcgQWR2YW5jZSgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvCisgIC8vIEJhc2VHZW5lcmF0b3IoKS0+RW5kKCkuCisgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgPSAwOworICAvLyBDbG9uZXMgdGhlIGl0ZXJhdG9yIG9iamVjdC4gVXNlZCBmb3IgaW1wbGVtZW50aW5nIGNvcHkgc2VtYW50aWNzCisgIC8vIG9mIFBhcmFtSXRlcmF0b3I8VD4uCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZSogQ2xvbmUoKSBjb25zdCA9IDA7CisgIC8vIERlcmVmZXJlbmNlcyB0aGUgY3VycmVudCBpdGVyYXRvciBhbmQgcHJvdmlkZXMgKHJlYWQtb25seSkgYWNjZXNzCisgIC8vIHRvIHRoZSBwb2ludGVkIHZhbHVlLiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgbm90IHRvIGNhbGwKKyAgLy8gQ3VycmVudCgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvIEJhc2VHZW5lcmF0b3IoKS0+RW5kKCkuCisgIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3IqKCkuCisgIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0ID0gMDsKKyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBpdGVyYXRvciBhbmQgb3RoZXIgcG9pbnQgdG8gdGhlIHNhbWUKKyAgLy8gZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IuCisgIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3I9PSgpLgorICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2UmIG90aGVyKSBjb25zdCA9IDA7Cit9OworCisvLyBDbGFzcyBpdGVyYXRpbmcgb3ZlciBlbGVtZW50cyBwcm92aWRlZCBieSBhbiBpbXBsZW1lbnRhdGlvbiBvZgorLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4uIEl0IHdyYXBzIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4KKy8vIGFuZCBpbXBsZW1lbnRzIHRoZSBjb25zdCBmb3J3YXJkIGl0ZXJhdG9yIGNvbmNlcHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgVCYgcmVmZXJlbmNlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyAgLy8gUGFyYW1JdGVyYXRvciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgaW1wbF8gcG9pbnRlci4KKyAgUGFyYW1JdGVyYXRvcihjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXy0+Q2xvbmUoKSkge30KKyAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSB7CisgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgaW1wbF8ucmVzZXQob3RoZXIuaW1wbF8tPkNsb25lKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICppbXBsXy0+Q3VycmVudCgpOyB9CisgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Q3VycmVudCgpOyB9CisgIC8vIFByZWZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuCisgIFBhcmFtSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgaW1wbF8tPkFkdmFuY2UoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgLy8gUG9zdGZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuCisgIFBhcmFtSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQgLyp1bnVzZWQqLykgeworICAgIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIGNsb25lID0gaW1wbF8tPkNsb25lKCk7CisgICAgaW1wbF8tPkFkdmFuY2UoKTsKKyAgICByZXR1cm4gUGFyYW1JdGVyYXRvcihjbG9uZSk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGltcGxfLmdldCgpID09IG90aGVyLmltcGxfLmdldCgpIHx8IGltcGxfLT5FcXVhbHMoKm90aGVyLmltcGxfKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQYXJhbUdlbmVyYXRvcjxUPjsKKyAgZXhwbGljaXQgUGFyYW1JdGVyYXRvcihQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisgIHNjb3BlZF9wdHI8UGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiA+IGltcGxfOworfTsKKworLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gaXMgdGhlIGJpbmFyeSBpbnRlcmZhY2UgdG8gYWNjZXNzIGdlbmVyYXRvcnMKKy8vIGRlZmluZWQgaW4gb3RoZXIgdHJhbnNsYXRpb24gdW5pdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBQYXJhbVR5cGU7CisKKyAgdmlydHVhbCB+UGFyYW1HZW5lcmF0b3JJbnRlcmZhY2UoKSB7fQorCisgIC8vIEdlbmVyYXRvciBpbnRlcmZhY2UgZGVmaW5pdGlvbgorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0ID0gMDsKK307CisKKy8vIFdyYXBzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGFuZCBwcm92aWRlcyBnZW5lcmFsIGdlbmVyYXRvciBzeW50YXgKKy8vIGNvbXBhdGlibGUgd2l0aCB0aGUgU1RMIENvbnRhaW5lciBjb25jZXB0LgorLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGNvcHkgaW5pdGlhbGl6YXRpb24gc2VtYW50aWNzIGFuZCB0aGUgY29udGFpbmVkCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpbnN0YW5jZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGNvcGllcworLy8gb2YgdGhlIG9yaWdpbmFsIG9iamVjdC4gVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIHRoYXQgaW5zdGFuY2UgaXMgaW1tdXRhYmxlLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUGFyYW1JdGVyYXRvcjxUPiBpdGVyYXRvcjsKKworICBleHBsaWNpdCBQYXJhbUdlbmVyYXRvcihQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQorICBQYXJhbUdlbmVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvciYgb3RoZXIpIDogaW1wbF8ob3RoZXIuaW1wbF8pIHt9CisKKyAgUGFyYW1HZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBQYXJhbUdlbmVyYXRvciYgb3RoZXIpIHsKKyAgICBpbXBsXyA9IG90aGVyLmltcGxfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKGltcGxfLT5FbmQoKSk7IH0KKworIHByaXZhdGU6CisgIGxpbmtlZF9wdHI8Y29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gPiBpbXBsXzsKK307CisKKy8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSBhIHJhbmdlIG9mIHR3byBjb21wYXJhYmxlIHZhbHVlcy4gQ2FuIGJlIHVzZWQgdG8KKy8vIGdlbmVyYXRlIHNlcXVlbmNlcyBvZiB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBpbXBsZW1lbnQgb3BlcmF0b3IrKCkgYW5kCisvLyBvcGVyYXRvcjwoKS4KKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0aGUgUmFuZ2UoKSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgorY2xhc3MgUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4geworIHB1YmxpYzoKKyAgUmFuZ2VHZW5lcmF0b3IoVCBiZWdpbiwgVCBlbmQsIEluY3JlbWVudFQgc3RlcCkKKyAgICAgIDogYmVnaW5fKGJlZ2luKSwgZW5kXyhlbmQpLAorICAgICAgICBzdGVwXyhzdGVwKSwgZW5kX2luZGV4XyhDYWxjdWxhdGVFbmRJbmRleChiZWdpbiwgZW5kLCBzdGVwKSkge30KKyAgdmlydHVhbCB+UmFuZ2VHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBiZWdpbl8sIDAsIHN0ZXBfKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGVuZF8sIGVuZF9pbmRleF8sIHN0ZXBfKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGJhc2UsIFQgdmFsdWUsIGludCBpbmRleCwKKyAgICAgICAgICAgICBJbmNyZW1lbnRUIHN0ZXApCisgICAgICAgIDogYmFzZV8oYmFzZSksIHZhbHVlXyh2YWx1ZSksIGluZGV4XyhpbmRleCksIHN0ZXBfKHN0ZXApIHt9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICB2YWx1ZV8gPSBzdGF0aWNfY2FzdDxUPih2YWx1ZV8gKyBzdGVwXyk7CisgICAgICBpbmRleF8rKzsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgaW50IG90aGVyX2luZGV4ID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlciktPmluZGV4XzsKKyAgICAgIHJldHVybiBpbmRleF8gPT0gb3RoZXJfaW5kZXg7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KCksCisgICAgICAgICAgYmFzZV8ob3RoZXIuYmFzZV8pLCB2YWx1ZV8ob3RoZXIudmFsdWVfKSwgaW5kZXhfKG90aGVyLmluZGV4XyksCisgICAgICAgICAgc3RlcF8ob3RoZXIuc3RlcF8pIHt9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBjb25zdCBiYXNlXzsKKyAgICBUIHZhbHVlXzsKKyAgICBpbnQgaW5kZXhfOworICAgIGNvbnN0IEluY3JlbWVudFQgc3RlcF87CisgIH07ICAvLyBjbGFzcyBSYW5nZUdlbmVyYXRvcjo6SXRlcmF0b3IKKworICBzdGF0aWMgaW50IENhbGN1bGF0ZUVuZEluZGV4KGNvbnN0IFQmIGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmNyZW1lbnRUJiBzdGVwKSB7CisgICAgaW50IGVuZF9pbmRleCA9IDA7CisgICAgZm9yIChUIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSA9IHN0YXRpY19jYXN0PFQ+KGkgKyBzdGVwKSkKKyAgICAgIGVuZF9pbmRleCsrOworICAgIHJldHVybiBlbmRfaW5kZXg7CisgIH0KKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFJhbmdlR2VuZXJhdG9yJiBvdGhlcik7CisKKyAgY29uc3QgVCBiZWdpbl87CisgIGNvbnN0IFQgZW5kXzsKKyAgY29uc3QgSW5jcmVtZW50VCBzdGVwXzsKKyAgLy8gVGhlIGluZGV4IGZvciB0aGUgZW5kKCkgaXRlcmF0b3IuIEFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIGdlbmVyYXRlZAorICAvLyBzZXF1ZW5jZSBhcmUgaW5kZXhlZCAoMC1iYXNlZCkgdG8gYWlkIGl0ZXJhdG9yIGNvbXBhcmlzb24uCisgIGNvbnN0IGludCBlbmRfaW5kZXhfOworfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yCisKKworLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcGFpciBvZiBTVEwtc3R5bGUgaXRlcmF0b3JzLiBVc2VkIGluIHRoZQorLy8gVmFsdWVzSW4oKSBmdW5jdGlvbi4gVGhlIGVsZW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgc291cmNlIHJhbmdlCisvLyBzaW5jZSB0aGUgc291cmNlIGNhbiBiZSBsb2NhdGVkIG9uIHRoZSBzdGFjaywgYW5kIHRoZSBnZW5lcmF0b3IKKy8vIGlzIGxpa2VseSB0byBwZXJzaXN0IGJleW9uZCB0aGF0IHN0YWNrIGZyYW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KKyAgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkKKyAgICAgIDogY29udGFpbmVyXyhiZWdpbiwgZW5kKSB7fQorICB2aXJ0dWFsIH5WYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBjb250YWluZXJfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxUPiBDb250YWluZXJUeXBlOworCisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBiYXNlLAorICAgICAgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yKQorICAgICAgICA6IGJhc2VfKGJhc2UpLCBpdGVyYXRvcl8oaXRlcmF0b3IpIHt9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICArK2l0ZXJhdG9yXzsKKyAgICAgIHZhbHVlXy5yZXNldCgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIC8vIFdlIG5lZWQgdG8gdXNlIGNhY2hlZCB2YWx1ZSByZWZlcmVuY2VkIGJ5IGl0ZXJhdG9yXyBiZWNhdXNlICppdGVyYXRvcl8KKyAgICAvLyBjYW4gcmV0dXJuIGEgdGVtcG9yYXJ5IG9iamVjdCAoYW5kIG9mIHR5cGUgb3RoZXIgdGhlbiBUKSwgc28ganVzdAorICAgIC8vIGhhdmluZyAicmV0dXJuICYqaXRlcmF0b3JfOyIgZG9lc24ndCB3b3JrLgorICAgIC8vIHZhbHVlXyBpcyB1cGRhdGVkIGhlcmUgYW5kIG5vdCBpbiBBZHZhbmNlKCkgYmVjYXVzZSBBZHZhbmNlKCkKKyAgICAvLyBjYW4gYWR2YW5jZSBpdGVyYXRvcl8gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJhbmdlLCBhbmQgd2UgY2Fubm90CisgICAgLy8gZGV0ZWN0IHRoYXQgZmFjdC4gVGhlIGNsaWVudCBjb2RlLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMKKyAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90IGNhbGxpbmcgQ3VycmVudCgpIG9uIGFuIG91dC1vZi1yYW5nZSBpdGVyYXRvci4KKyAgICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCB7CisgICAgICBpZiAodmFsdWVfLmdldCgpID09IE5VTEwpCisgICAgICAgIHZhbHVlXy5yZXNldChuZXcgVCgqaXRlcmF0b3JfKSk7CisgICAgICByZXR1cm4gdmFsdWVfLmdldCgpOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gaXRlcmF0b3JfID09CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpLT5pdGVyYXRvcl87CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgICAvLyBUaGUgZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCBzdXBwcmVzc2VzIGEgZmFsc2Ugd2FybmluZworICAgICAgICAgIC8vIGVtaXR0ZWQgYnkgZ2NjIHdoZW4gc3VwcGxpZWQgd2l0aCB0aGUgLVdleHRyYSBvcHRpb24uCisgICAgICAgIDogUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPigpLAorICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgICBpdGVyYXRvcl8ob3RoZXIuaXRlcmF0b3JfKSB7fQorCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGNvbnN0IGJhc2VfOworICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yXzsKKyAgICAvLyBBIGNhY2hlZCB2YWx1ZSBvZiAqaXRlcmF0b3JfLiBXZSBrZWVwIGl0IGhlcmUgdG8gYWxsb3cgYWNjZXNzIGJ5CisgICAgLy8gcG9pbnRlciBpbiB0aGUgd3JhcHBpbmcgaXRlcmF0b3IncyBvcGVyYXRvci0+KCkuCisgICAgLy8gdmFsdWVfIG5lZWRzIHRvIGJlIG11dGFibGUgdG8gYmUgYWNjZXNzZWQgaW4gQ3VycmVudCgpLgorICAgIC8vIFVzZSBvZiBzY29wZWRfcHRyIGhlbHBzIG1hbmFnZSBjYWNoZWQgdmFsdWUncyBsaWZldGltZSwKKyAgICAvLyB3aGljaCBpcyBib3VuZCBieSB0aGUgbGlmZXNwYW4gb2YgdGhlIGl0ZXJhdG9yIGl0c2VsZi4KKyAgICBtdXRhYmxlIHNjb3BlZF9wdHI8Y29uc3QgVD4gdmFsdWVfOworICB9OyAgLy8gY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yJiBvdGhlcik7CisKKyAgY29uc3QgQ29udGFpbmVyVHlwZSBjb250YWluZXJfOworfTsgIC8vIGNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcgorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIERlZmF1bHQgcGFyYW1ldGVyaXplZCB0ZXN0IG5hbWUgZ2VuZXJhdG9yLCByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCisvLyBpbnRlZ2VyIHRlc3QgcGFyYW1ldGVyIGluZGV4LgordGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KK3N0ZDo6c3RyaW5nIERlZmF1bHRQYXJhbU5hbWUoY29uc3QgVGVzdFBhcmFtSW5mbzxQYXJhbVR5cGU+JiBpbmZvKSB7CisgIE1lc3NhZ2UgbmFtZV9zdHJlYW07CisgIG5hbWVfc3RyZWFtIDw8IGluZm8uaW5kZXg7CisgIHJldHVybiBuYW1lX3N0cmVhbS5HZXRTdHJpbmcoKTsKK30KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSBvdmVybG9hZCBoZWxwZXJzLCB3aGljaCBoZWxwIHRoZQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gY2hvb3NlIGJldHdlZW4gdGhlIGRlZmF1bHQgcGFyYW1ldGVyaXplZAorLy8gdGVzdCBuYW1lIGdlbmVyYXRvciBhbmQgdXNlciBwYXJhbSBuYW1lIGdlbmVyYXRvci4KK3RlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGUsIGNsYXNzIFBhcmFtTmFtZUdlbkZ1bmN0b3I+CitQYXJhbU5hbWVHZW5GdW5jdG9yIEdldFBhcmFtTmFtZUdlbihQYXJhbU5hbWVHZW5GdW5jdG9yIGZ1bmMpIHsKKyAgcmV0dXJuIGZ1bmM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+CitzdHJ1Y3QgUGFyYW1OYW1lR2VuRnVuYyB7CisgIHR5cGVkZWYgc3RkOjpzdHJpbmcgVHlwZShjb25zdCBUZXN0UGFyYW1JbmZvPFBhcmFtVHlwZT4mKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+Cit0eXBlbmFtZSBQYXJhbU5hbWVHZW5GdW5jPFBhcmFtVHlwZT46OlR5cGUgKkdldFBhcmFtTmFtZUdlbigpIHsKKyAgcmV0dXJuIERlZmF1bHRQYXJhbU5hbWU7Cit9CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gU3RvcmVzIGEgcGFyYW1ldGVyIHZhbHVlIGFuZCBsYXRlciBjcmVhdGVzIHRlc3RzIHBhcmFtZXRlcml6ZWQgd2l0aCB0aGF0CisvLyB2YWx1ZS4KK3RlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+CitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkgOiBwdWJsaWMgVGVzdEZhY3RvcnlCYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENsYXNzOjpQYXJhbVR5cGUgUGFyYW1UeXBlOworICBleHBsaWNpdCBQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgOgorICAgICAgcGFyYW1ldGVyXyhwYXJhbWV0ZXIpIHt9CisgIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpIHsKKyAgICBUZXN0Q2xhc3M6OlNldFBhcmFtKCZwYXJhbWV0ZXJfKTsKKyAgICByZXR1cm4gbmV3IFRlc3RDbGFzcygpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBQYXJhbVR5cGUgcGFyYW1ldGVyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeSk7Cit9OworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFRlc3RNZXRhRmFjdG9yeUJhc2UgaXMgYSBiYXNlIGNsYXNzIGZvciBtZXRhLWZhY3RvcmllcyB0aGF0IGNyZWF0ZQorLy8gdGVzdCBmYWN0b3JpZXMgZm9yIHBhc3NpbmcgaW50byBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyBmdW5jdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+CitjbGFzcyBUZXN0TWV0YUZhY3RvcnlCYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RNZXRhRmFjdG9yeUJhc2UoKSB7fQorCisgIHZpcnR1YWwgVGVzdEZhY3RvcnlCYXNlKiBDcmVhdGVUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSA9IDA7Cit9OworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFRlc3RNZXRhRmFjdG9yeSBjcmVhdGVzIHRlc3QgZmFjdG9yaWVzIGZvciBwYXNzaW5nIGludG8KKy8vIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIGZ1bmN0aW9uLiBTaW5jZSBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyByZWNlaXZlcworLy8gb3duZXJzaGlwIG9mIHRlc3QgZmFjdG9yeSBwb2ludGVyLCBzYW1lIGZhY3Rvcnkgb2JqZWN0IGNhbm5vdCBiZSBwYXNzZWQKKy8vIGludG8gdGhhdCBtZXRob2QgdHdpY2UuIEJ1dCBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGlzIGdvaW5nIHRvIGNhbGwKKy8vIGl0IGZvciBlYWNoIFRlc3QvUGFyYW1ldGVyIHZhbHVlIGNvbWJpbmF0aW9uLiBUaHVzIGl0IG5lZWRzIG1ldGEgZmFjdG9yeQorLy8gY3JlYXRvciBjbGFzcy4KK3RlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KK2NsYXNzIFRlc3RNZXRhRmFjdG9yeQorICAgIDogcHVibGljIFRlc3RNZXRhRmFjdG9yeUJhc2U8dHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKKworICBUZXN0TWV0YUZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgVGVzdEZhY3RvcnlCYXNlKiBDcmVhdGVUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSB7CisgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkVGVzdEZhY3Rvcnk8VGVzdENhc2U+KHBhcmFtZXRlcik7CisgIH0KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdE1ldGFGYWN0b3J5KTsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgaXMgYSBnZW5lcmljIGludGVyZmFjZQorLy8gdG8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBjbGFzc2VzLiBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZQorLy8gYWNjdW11bGF0ZXMgdGVzdCBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBURVNUX1AgbWFjcm8gaW52b2NhdGlvbnMKKy8vIGFuZCBnZW5lcmF0b3JzIHByb3ZpZGVkIGJ5IElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGludm9jYXRpb25zCisvLyBhbmQgdXNlcyB0aGF0IGluZm9ybWF0aW9uIHRvIHJlZ2lzdGVyIGFsbCByZXN1bHRpbmcgdGVzdCBpbnN0YW5jZXMKKy8vIGluIFJlZ2lzdGVyVGVzdHMgbWV0aG9kLiBUaGUgUGFyYW1ldGVyaXplVGVzdENhc2VSZWdpc3RyeSBjbGFzcyBob2xkcworLy8gYSBjb2xsZWN0aW9uIG9mIHBvaW50ZXJzIHRvIHRoZSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIG9iamVjdHMKKy8vIGFuZCBjYWxscyBSZWdpc3RlclRlc3RzKCkgb24gZWFjaCBvZiB0aGVtIHdoZW4gYXNrZWQuCitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5QYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSgpIHt9CisKKyAgLy8gQmFzZSBwYXJ0IG9mIHRlc3QgY2FzZSBuYW1lIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0VGVzdENhc2VOYW1lKCkgY29uc3QgPSAwOworICAvLyBUZXN0IGNhc2UgaWQgdG8gdmVyaWZ5IGlkZW50aXR5LgorICB2aXJ0dWFsIFR5cGVJZCBHZXRUZXN0Q2FzZVR5cGVJZCgpIGNvbnN0ID0gMDsKKyAgLy8gVW5pdFRlc3QgY2xhc3MgaW52b2tlcyB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0ZXN0cyBpbiB0aGlzCisgIC8vIHRlc3QgY2FzZSByaWdodCBiZWZvcmUgcnVubmluZyB0aGVtIGluIFJVTl9BTExfVEVTVFMgbWFjcm8uCisgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlIG9uIGFueSBzaW5nbGUKKyAgLy8gaW5zdGFuY2Ugb2YgYSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBkZXJpdmVkIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpID0gMDsKKworIHByb3RlY3RlZDoKKyAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UoKSB7fQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSk7Cit9OworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gYWNjdW11bGF0ZXMgdGVzdHMgb2J0YWluZWQgZnJvbSBURVNUX1AKKy8vIG1hY3JvIGludm9jYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgdGVzdCBjYXNlIGFuZCBnZW5lcmF0b3JzCisvLyBvYnRhaW5lZCBmcm9tIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGludm9jYXRpb25zIGZvciB0aGF0CisvLyB0ZXN0IGNhc2UuIEl0IHJlZ2lzdGVycyB0ZXN0cyB3aXRoIGFsbCB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGFsbAorLy8gZ2VuZXJhdG9ycyB3aGVuIGFza2VkLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgorY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyA6IHB1YmxpYyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSB7CisgcHVibGljOgorICAvLyBQYXJhbVR5cGUgYW5kIEdlbmVyYXRvckNyZWF0aW9uRnVuYyBhcmUgcHJpdmF0ZSB0eXBlcyBidXQgYXJlIHJlcXVpcmVkCisgIC8vIGZvciBkZWNsYXJhdGlvbnMgb2YgcHVibGljIG1ldGhvZHMgQWRkVGVzdFBhdHRlcm4oKSBhbmQKKyAgLy8gQWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKCkuCisgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZSBQYXJhbVR5cGU7CisgIC8vIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGFwcHJvcHJpYXRlIGdlbmVyYXRvciB0eXBlLgorICB0eXBlZGVmIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oR2VuZXJhdG9yQ3JlYXRpb25GdW5jKSgpOworICB0eXBlZGVmIHR5cGVuYW1lIFBhcmFtTmFtZUdlbkZ1bmM8UGFyYW1UeXBlPjo6VHlwZSBQYXJhbU5hbWVHZW5lcmF0b3JGdW5jOworCisgIGV4cGxpY2l0IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8oCisgICAgICBjb25zdCBjaGFyKiBuYW1lLCBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbikKKyAgICAgIDogdGVzdF9jYXNlX25hbWVfKG5hbWUpLCBjb2RlX2xvY2F0aW9uXyhjb2RlX2xvY2F0aW9uKSB7fQorCisgIC8vIFRlc3QgY2FzZSBiYXNlIG5hbWUgZm9yIGRpc3BsYXkgcHVycG9zZXMuCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCB7IHJldHVybiB0ZXN0X2Nhc2VfbmFtZV87IH0KKyAgLy8gVGVzdCBjYXNlIGlkIHRvIHZlcmlmeSBpZGVudGl0eS4KKyAgdmlydHVhbCBUeXBlSWQgR2V0VGVzdENhc2VUeXBlSWQoKSBjb25zdCB7IHJldHVybiBHZXRUeXBlSWQ8VGVzdENhc2U+KCk7IH0KKyAgLy8gVEVTVF9QIG1hY3JvIHVzZXMgQWRkVGVzdFBhdHRlcm4oKSB0byByZWNvcmQgaW5mb3JtYXRpb24KKyAgLy8gYWJvdXQgYSBzaW5nbGUgdGVzdCBpbiBhIExvY2FsVGVzdEluZm8gc3RydWN0dXJlLgorICAvLyB0ZXN0X2Nhc2VfbmFtZSBpcyB0aGUgYmFzZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgKHdpdGhvdXQgaW52b2NhdGlvbgorICAvLyBwcmVmaXgpLiB0ZXN0X2Jhc2VfbmFtZSBpcyB0aGUgbmFtZSBvZiBhbiBpbmRpdmlkdWFsIHRlc3Qgd2l0aG91dAorICAvLyBwYXJhbWV0ZXIgaW5kZXguIEZvciB0aGUgdGVzdCBTZXF1ZW5jZUEvRm9vVGVzdC5Eb0Jhci8xIEZvb1Rlc3QgaXMKKyAgLy8gdGVzdCBjYXNlIGJhc2UgbmFtZSBhbmQgRG9CYXIgaXMgdGVzdCBiYXNlIG5hbWUuCisgIHZvaWQgQWRkVGVzdFBhdHRlcm4oY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9iYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgVGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+KiBtZXRhX2ZhY3RvcnkpIHsKKyAgICB0ZXN0c18ucHVzaF9iYWNrKGxpbmtlZF9wdHI8VGVzdEluZm8+KG5ldyBUZXN0SW5mbyh0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2ZhY3RvcnkpKSk7CisgIH0KKyAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gdXNlcyBBZGRHZW5lcmF0b3IoKSB0byByZWNvcmQgaW5mb3JtYXRpb24KKyAgLy8gYWJvdXQgYSBnZW5lcmF0b3IuCisgIGludCBBZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oY29uc3Qgc3RyaW5nJiBpbnN0YW50aWF0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtTmFtZUdlbmVyYXRvckZ1bmMqIG5hbWVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgICAgaW5zdGFudGlhdGlvbnNfLnB1c2hfYmFjaygKKyAgICAgICAgSW5zdGFudGlhdGlvbkluZm8oaW5zdGFudGlhdGlvbl9uYW1lLCBmdW5jLCBuYW1lX2Z1bmMsIGZpbGUsIGxpbmUpKTsKKyAgICByZXR1cm4gMDsgIC8vIFJldHVybiB2YWx1ZSB1c2VkIG9ubHkgdG8gcnVuIHRoaXMgbWV0aG9kIGluIG5hbWVzcGFjZSBzY29wZS4KKyAgfQorICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlCisgIC8vIHRlc3QgY2FzZXMgcmlnaHQgYmVmb3JlIHJ1bm5pbmcgdGVzdHMgaW4gUlVOX0FMTF9URVNUUyBtYWNyby4KKyAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQorICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuCisgIC8vIFVuaXRUZXN0IGhhcyBhIGd1YXJkIHRvIHByZXZlbnQgZnJvbSBjYWxsaW5nIHRoaXMgbWV0aG9kIG1vcmUgdGhlbiBvbmNlLgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpIHsKKyAgICBmb3IgKHR5cGVuYW1lIFRlc3RJbmZvQ29udGFpbmVyOjppdGVyYXRvciB0ZXN0X2l0ID0gdGVzdHNfLmJlZ2luKCk7CisgICAgICAgICB0ZXN0X2l0ICE9IHRlc3RzXy5lbmQoKTsgKyt0ZXN0X2l0KSB7CisgICAgICBsaW5rZWRfcHRyPFRlc3RJbmZvPiB0ZXN0X2luZm8gPSAqdGVzdF9pdDsKKyAgICAgIGZvciAodHlwZW5hbWUgSW5zdGFudGlhdGlvbkNvbnRhaW5lcjo6aXRlcmF0b3IgZ2VuX2l0ID0KKyAgICAgICAgICAgICAgIGluc3RhbnRpYXRpb25zXy5iZWdpbigpOyBnZW5faXQgIT0gaW5zdGFudGlhdGlvbnNfLmVuZCgpOworICAgICAgICAgICAgICAgKytnZW5faXQpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiBpbnN0YW50aWF0aW9uX25hbWUgPSBnZW5faXQtPm5hbWU7CisgICAgICAgIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4gZ2VuZXJhdG9yKCgqZ2VuX2l0LT5nZW5lcmF0b3IpKCkpOworICAgICAgICBQYXJhbU5hbWVHZW5lcmF0b3JGdW5jKiBuYW1lX2Z1bmMgPSBnZW5faXQtPm5hbWVfZnVuYzsKKyAgICAgICAgY29uc3QgY2hhciogZmlsZSA9IGdlbl9pdC0+ZmlsZTsKKyAgICAgICAgaW50IGxpbmUgPSBnZW5faXQtPmxpbmU7CisKKyAgICAgICAgc3RyaW5nIHRlc3RfY2FzZV9uYW1lOworICAgICAgICBpZiAoICFpbnN0YW50aWF0aW9uX25hbWUuZW1wdHkoKSApCisgICAgICAgICAgdGVzdF9jYXNlX25hbWUgPSBpbnN0YW50aWF0aW9uX25hbWUgKyAiLyI7CisgICAgICAgIHRlc3RfY2FzZV9uYW1lICs9IHRlc3RfaW5mby0+dGVzdF9jYXNlX2Jhc2VfbmFtZTsKKworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0ZXN0X3BhcmFtX25hbWVzOworICAgICAgICBmb3IgKHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT46Oml0ZXJhdG9yIHBhcmFtX2l0ID0KKyAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmJlZ2luKCk7CisgICAgICAgICAgICAgcGFyYW1faXQgIT0gZ2VuZXJhdG9yLmVuZCgpOyArK3BhcmFtX2l0LCArK2kpIHsKKyAgICAgICAgICBNZXNzYWdlIHRlc3RfbmFtZV9zdHJlYW07CisKKyAgICAgICAgICBzdGQ6OnN0cmluZyBwYXJhbV9uYW1lID0gbmFtZV9mdW5jKAorICAgICAgICAgICAgICBUZXN0UGFyYW1JbmZvPFBhcmFtVHlwZT4oKnBhcmFtX2l0LCBpKSk7CisKKyAgICAgICAgICBHVEVTVF9DSEVDS18oSXNWYWxpZFBhcmFtTmFtZShwYXJhbV9uYW1lKSkKKyAgICAgICAgICAgICAgPDwgIlBhcmFtZXRlcml6ZWQgdGVzdCBuYW1lICciIDw8IHBhcmFtX25hbWUKKyAgICAgICAgICAgICAgPDwgIicgaXMgaW52YWxpZCwgaW4gIiA8PCBmaWxlCisgICAgICAgICAgICAgIDw8ICIgbGluZSAiIDw8IGxpbmUgPDwgc3RkOjplbmRsOworCisgICAgICAgICAgR1RFU1RfQ0hFQ0tfKHRlc3RfcGFyYW1fbmFtZXMuY291bnQocGFyYW1fbmFtZSkgPT0gMCkKKyAgICAgICAgICAgICAgPDwgIkR1cGxpY2F0ZSBwYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSAnIiA8PCBwYXJhbV9uYW1lCisgICAgICAgICAgICAgIDw8ICInLCBpbiAiIDw8IGZpbGUgPDwgIiBsaW5lICIgPDwgbGluZSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgICB0ZXN0X3BhcmFtX25hbWVzLmluc2VydChwYXJhbV9uYW1lKTsKKworICAgICAgICAgIHRlc3RfbmFtZV9zdHJlYW0gPDwgdGVzdF9pbmZvLT50ZXN0X2Jhc2VfbmFtZSA8PCAiLyIgPDwgcGFyYW1fbmFtZTsKKyAgICAgICAgICBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgdGVzdF9uYW1lX3N0cmVhbS5HZXRTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICBOVUxMLCAgLy8gTm8gdHlwZSBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoKnBhcmFtX2l0KS5jX3N0cigpLAorICAgICAgICAgICAgICBjb2RlX2xvY2F0aW9uXywKKyAgICAgICAgICAgICAgR2V0VGVzdENhc2VUeXBlSWQoKSwKKyAgICAgICAgICAgICAgVGVzdENhc2U6OlNldFVwVGVzdENhc2UsCisgICAgICAgICAgICAgIFRlc3RDYXNlOjpUZWFyRG93blRlc3RDYXNlLAorICAgICAgICAgICAgICB0ZXN0X2luZm8tPnRlc3RfbWV0YV9mYWN0b3J5LT5DcmVhdGVUZXN0RmFjdG9yeSgqcGFyYW1faXQpKTsKKyAgICAgICAgfSAgLy8gZm9yIHBhcmFtX2l0CisgICAgICB9ICAvLyBmb3IgZ2VuX2l0CisgICAgfSAgLy8gZm9yIHRlc3RfaXQKKyAgfSAgLy8gUmVnaXN0ZXJUZXN0cworCisgcHJpdmF0ZToKKyAgLy8gTG9jYWxUZXN0SW5mbyBzdHJ1Y3R1cmUga2VlcHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgdGVzdCByZWdpc3RlcmVkCisgIC8vIHdpdGggVEVTVF9QIG1hY3JvLgorICBzdHJ1Y3QgVGVzdEluZm8geworICAgIFRlc3RJbmZvKGNvbnN0IGNoYXIqIGFfdGVzdF9jYXNlX2Jhc2VfbmFtZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3Rlc3RfYmFzZV9uYW1lLAorICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogYV90ZXN0X21ldGFfZmFjdG9yeSkgOgorICAgICAgICB0ZXN0X2Nhc2VfYmFzZV9uYW1lKGFfdGVzdF9jYXNlX2Jhc2VfbmFtZSksCisgICAgICAgIHRlc3RfYmFzZV9uYW1lKGFfdGVzdF9iYXNlX25hbWUpLAorICAgICAgICB0ZXN0X21ldGFfZmFjdG9yeShhX3Rlc3RfbWV0YV9mYWN0b3J5KSB7fQorCisgICAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9iYXNlX25hbWU7CisgICAgY29uc3Qgc3RyaW5nIHRlc3RfYmFzZV9uYW1lOworICAgIGNvbnN0IHNjb3BlZF9wdHI8VGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+ID4gdGVzdF9tZXRhX2ZhY3Rvcnk7CisgIH07CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxsaW5rZWRfcHRyPFRlc3RJbmZvPiA+IFRlc3RJbmZvQ29udGFpbmVyOworICAvLyBSZWNvcmRzIGRhdGEgcmVjZWl2ZWQgZnJvbSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNyb3M6CisgIC8vICA8SW5zdGFudGlhdGlvbiBuYW1lLCBTZXF1ZW5jZSBnZW5lcmF0b3IgY3JlYXRpb24gZnVuY3Rpb24sCisgIC8vICAgICBOYW1lIGdlbmVyYXRvciBmdW5jdGlvbiwgU291cmNlIGZpbGUsIFNvdXJjZSBsaW5lPgorICBzdHJ1Y3QgSW5zdGFudGlhdGlvbkluZm8geworICAgICAgSW5zdGFudGlhdGlvbkluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWVfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMqIGdlbmVyYXRvcl9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtTmFtZUdlbmVyYXRvckZ1bmMqIG5hbWVfZnVuY19pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9pbikKKyAgICAgICAgICA6IG5hbWUobmFtZV9pbiksCisgICAgICAgICAgICBnZW5lcmF0b3IoZ2VuZXJhdG9yX2luKSwKKyAgICAgICAgICAgIG5hbWVfZnVuYyhuYW1lX2Z1bmNfaW4pLAorICAgICAgICAgICAgZmlsZShmaWxlX2luKSwKKyAgICAgICAgICAgIGxpbmUobGluZV9pbikge30KKworICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgIEdlbmVyYXRvckNyZWF0aW9uRnVuYyogZ2VuZXJhdG9yOworICAgICAgUGFyYW1OYW1lR2VuZXJhdG9yRnVuYyogbmFtZV9mdW5jOworICAgICAgY29uc3QgY2hhciogZmlsZTsKKyAgICAgIGludCBsaW5lOworICB9OworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8SW5zdGFudGlhdGlvbkluZm8+IEluc3RhbnRpYXRpb25Db250YWluZXI7CisKKyAgc3RhdGljIGJvb2wgSXNWYWxpZFBhcmFtTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIC8vIENoZWNrIGZvciBlbXB0eSBzdHJpbmcKKyAgICBpZiAobmFtZS5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgY2hhcmFjdGVycworICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpbmRleCA9IDA7IGluZGV4IDwgbmFtZS5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgIGlmICghaXNhbG51bShuYW1lW2luZGV4XSkgJiYgbmFtZVtpbmRleF0gIT0gJ18nKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBzdHJpbmcgdGVzdF9jYXNlX25hbWVfOworICBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbl87CisgIFRlc3RJbmZvQ29udGFpbmVyIHRlc3RzXzsKKyAgSW5zdGFudGlhdGlvbkNvbnRhaW5lciBpbnN0YW50aWF0aW9uc187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvKTsKK307ICAvLyBjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgY29udGFpbnMgYSBtYXAgb2YgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UKKy8vIGNsYXNzZXMgYWNjZXNzZWQgYnkgdGVzdCBjYXNlIG5hbWVzLiBURVNUX1AgYW5kIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QCisvLyBtYWNyb3MgdXNlIGl0IHRvIGxvY2F0ZSB0aGVpciBjb3JyZXNwb25kaW5nIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8KKy8vIGRlc2NyaXB0b3JzLgorY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgeworIHB1YmxpYzoKKyAgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkoKSB7fQorICB+UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkoKSB7CisgICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgeworICAgICAgZGVsZXRlICppdDsKKyAgICB9CisgIH0KKworICAvLyBMb29rcyB1cCBvciBjcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQKKyAgLy8gdGVzdHMgYW5kIGluc3RhbnRpYXRpb25zIG9mIGEgcGFydGljdWxhciB0ZXN0IGNhc2UuCisgIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KKyAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4qIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcigKKyAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24pIHsKKyAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogdHlwZWRfdGVzdF9pbmZvID0gTlVMTDsKKyAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7CisgICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlTmFtZSgpID09IHRlc3RfY2FzZV9uYW1lKSB7CisgICAgICAgIGlmICgoKml0KS0+R2V0VGVzdENhc2VUeXBlSWQoKSAhPSBHZXRUeXBlSWQ8VGVzdENhc2U+KCkpIHsKKyAgICAgICAgICAvLyBDb21wbGFpbiBhYm91dCBpbmNvcnJlY3QgdXNhZ2Ugb2YgR29vZ2xlIFRlc3QgZmFjaWxpdGllcworICAgICAgICAgIC8vIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gc2luY2Ugd2UgY2Fubm90IGd1YXJhbnR5IGNvcnJlY3QKKyAgICAgICAgICAvLyB0ZXN0IGNhc2Ugc2V0dXAgYW5kIHRlYXItZG93biBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZSh0ZXN0X2Nhc2VfbmFtZSwgY29kZV9sb2NhdGlvbik7CisgICAgICAgICAgcG9zaXg6OkFib3J0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBvYmplY3Qgd2UgZm91bmQgaXMgb2YgdGhlIHNhbWUKKyAgICAgICAgICAvLyB0eXBlIHdlIGFyZSBsb29raW5nIGZvciwgc28gd2UgZG93bmNhc3QgaXQgdG8gdGhhdCB0eXBlCisgICAgICAgICAgLy8gd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy4KKyAgICAgICAgICB0eXBlZF90ZXN0X2luZm8gPSBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8CisgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+ID4oKml0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGVkX3Rlc3RfaW5mbyA9PSBOVUxMKSB7CisgICAgICB0eXBlZF90ZXN0X2luZm8gPSBuZXcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4oCisgICAgICAgICAgdGVzdF9jYXNlX25hbWUsIGNvZGVfbG9jYXRpb24pOworICAgICAgdGVzdF9jYXNlX2luZm9zXy5wdXNoX2JhY2sodHlwZWRfdGVzdF9pbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVkX3Rlc3RfaW5mbzsKKyAgfQorICB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7CisgICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgeworICAgICAgKCppdCktPlJlZ2lzdGVyVGVzdHMoKTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSo+IFRlc3RDYXNlSW5mb0NvbnRhaW5lcjsKKworICBUZXN0Q2FzZUluZm9Db250YWluZXIgdGVzdF9jYXNlX2luZm9zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC1hcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhYjk0OQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBHVEVTVF9PU18qIG1hY3JvLgorLy8gSXQgaXMgc2VwYXJhdGUgZnJvbSBndGVzdC1wb3J0Lmggc28gdGhhdCBjdXN0b20vZ3Rlc3QtcG9ydC5oIGNhbiBpbmNsdWRlIGl0LgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9BUkNIX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9BUkNIX0hfCisKKy8vIERldGVybWluZXMgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIEdvb2dsZSBUZXN0IGlzIGNvbXBpbGVkLgorI2lmZGVmIF9fQ1lHV0lOX18KKyMgZGVmaW5lIEdURVNUX09TX0NZR1dJTiAxCisjZWxpZiBkZWZpbmVkIF9fU1lNQklBTjMyX18KKyMgZGVmaW5lIEdURVNUX09TX1NZTUJJQU4gMQorI2VsaWYgZGVmaW5lZCBfV0lOMzIKKyMgZGVmaW5lIEdURVNUX09TX1dJTkRPV1MgMQorIyBpZmRlZiBfV0lOMzJfV0NFCisjICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgMQorIyBlbGlmIGRlZmluZWQoX19NSU5HV19fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgMQorIyBlbGlmIGRlZmluZWQoV0lOQVBJX0ZBTUlMWSkKKyMgIGluY2x1ZGUgPHdpbmFwaWZhbWlseS5oPgorIyAgaWYgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QKQorIyAgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgMQorIyAgZWxpZiBXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX1BIT05FX0FQUCkKKyMgICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19QSE9ORSAxCisjICBlbGlmIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fQVBQKQorIyAgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX1JUIDEKKyMgIGVsc2UKKyAgICAvLyBXSU5BUElfRkFNSUxZIGRlZmluZWQgYnV0IG5vIGtub3duIHBhcnRpdGlvbiBtYXRjaGVkLgorICAgIC8vIERlZmF1bHQgdG8gZGVza3RvcC4KKyMgICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QIDEKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgMQorIyBlbmRpZiAgLy8gX1dJTjMyX1dDRQorI2VsaWYgZGVmaW5lZCBfX0FQUExFX18KKyMgZGVmaW5lIEdURVNUX09TX01BQyAxCisjIGlmIFRBUkdFVF9PU19JUEhPTkUKKyMgIGRlZmluZSBHVEVTVF9PU19JT1MgMQorIyBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXworIyBkZWZpbmUgR1RFU1RfT1NfRlJFRUJTRCAxCisjZWxpZiBkZWZpbmVkIF9fbGludXhfXworIyBkZWZpbmUgR1RFU1RfT1NfTElOVVggMQorIyBpZiBkZWZpbmVkIF9fQU5EUk9JRF9fCisjICBkZWZpbmUgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAxCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fTVZTX18KKyMgZGVmaW5lIEdURVNUX09TX1pPUyAxCisjZWxpZiBkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fU1ZSNCkKKyMgZGVmaW5lIEdURVNUX09TX1NPTEFSSVMgMQorI2VsaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgR1RFU1RfT1NfQUlYIDEKKyNlbGlmIGRlZmluZWQoX19ocHV4KQorIyBkZWZpbmUgR1RFU1RfT1NfSFBVWCAxCisjZWxpZiBkZWZpbmVkIF9fbmF0aXZlX2NsaWVudF9fCisjIGRlZmluZSBHVEVTVF9PU19OQUNMIDEKKyNlbGlmIGRlZmluZWQgX19PcGVuQlNEX18KKyMgZGVmaW5lIEdURVNUX09TX09QRU5CU0QgMQorI2VsaWYgZGVmaW5lZCBfX1FOWF9fCisjIGRlZmluZSBHVEVTVF9PU19RTlggMQorI2VuZGlmICAvLyBfX0NZR1dJTl9fCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0FSQ0hfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDFkNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCkBAIC0wLDAgKzEsMjU1OSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gTG93LWxldmVsIHR5cGVzIGFuZCB1dGlsaXRpZXMgZm9yIHBvcnRpbmcgR29vZ2xlIFRlc3QgdG8gdmFyaW91cworLy8gcGxhdGZvcm1zLiAgQWxsIG1hY3JvcyBlbmRpbmcgd2l0aCBfIGFuZCBzeW1ib2xzIGRlZmluZWQgaW4gYW4KKy8vIGludGVybmFsIG5hbWVzcGFjZSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBDb2RlCisvLyBvdXRzaWRlIEdvb2dsZSBUZXN0IE1VU1QgTk9UIFVTRSBUSEVNIERJUkVDVExZLiAgTWFjcm9zIHRoYXQgZG9uJ3QKKy8vIGVuZCB3aXRoIF8gYXJlIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBwdWJsaWMgQVBJIGFuZCBjYW4gYmUgdXNlZCBieQorLy8gY29kZSBvdXRzaWRlIEdvb2dsZSBUZXN0LgorLy8KKy8vIFRoaXMgZmlsZSBpcyBmdW5kYW1lbnRhbCB0byBHb29nbGUgVGVzdC4gIEFsbCBvdGhlciBHb29nbGUgVGVzdCBzb3VyY2UKKy8vIGZpbGVzIGFyZSBleHBlY3RlZCB0byAjaW5jbHVkZSB0aGlzLiAgVGhlcmVmb3JlLCBpdCBjYW5ub3QgI2luY2x1ZGUKKy8vIGFueSBvdGhlciBHb29nbGUgVGVzdCBoZWFkZXIuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXworCisvLyBFbnZpcm9ubWVudC1kZXNjcmliaW5nIG1hY3JvcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBHb29nbGUgVGVzdCBjYW4gYmUgdXNlZCBpbiBtYW55IGRpZmZlcmVudCBlbnZpcm9ubWVudHMuICBNYWNyb3MgaW4KKy8vIHRoaXMgc2VjdGlvbiB0ZWxsIEdvb2dsZSBUZXN0IHdoYXQga2luZCBvZiBlbnZpcm9ubWVudCBpdCBpcyBiZWluZworLy8gdXNlZCBpbiwgc3VjaCB0aGF0IEdvb2dsZSBUZXN0IGNhbiBwcm92aWRlIGVudmlyb25tZW50LXNwZWNpZmljCisvLyBmZWF0dXJlcyBhbmQgaW1wbGVtZW50YXRpb25zLgorLy8KKy8vIEdvb2dsZSBUZXN0IHRyaWVzIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSBwcm9wZXJ0aWVzIG9mIGl0cworLy8gZW52aXJvbm1lbnQsIHNvIHVzZXJzIHVzdWFsbHkgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGVzZQorLy8gbWFjcm9zLiAgSG93ZXZlciwgdGhlIGF1dG9tYXRpYyBkZXRlY3Rpb24gaXMgbm90IHBlcmZlY3QuCisvLyBTb21ldGltZXMgaXQncyBuZWNlc3NhcnkgZm9yIGEgdXNlciB0byBkZWZpbmUgc29tZSBvZiB0aGUgZm9sbG93aW5nCisvLyBtYWNyb3MgaW4gdGhlIGJ1aWxkIHNjcmlwdCB0byBvdmVycmlkZSBHb29nbGUgVGVzdCdzIGRlY2lzaW9ucy4KKy8vCisvLyBJZiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZSBhIG1hY3JvIGluIHRoZSBsaXN0LCBHb29nbGUgVGVzdCB3aWxsCisvLyBwcm92aWRlIGEgZGVmYXVsdCBkZWZpbml0aW9uLiAgQWZ0ZXIgdGhpcyBoZWFkZXIgaXMgI2luY2x1ZGVkLCBhbGwKKy8vIG1hY3JvcyBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBkZWZpbmVkIHRvIGVpdGhlciAxIG9yIDAuCisvLworLy8gTm90ZXMgdG8gbWFpbnRhaW5lcnM6CisvLyAgIC0gRWFjaCBtYWNybyBoZXJlIGlzIGEgdXNlci10d2Vha2FibGUga25vYjsgZG8gbm90IGdyb3cgdGhlIGxpc3QKKy8vICAgICBsaWdodGx5LgorLy8gICAtIFVzZSAjaWYgdG8ga2V5IG9mZiB0aGVzZSBtYWNyb3MuICBEb24ndCB1c2UgI2lmZGVmIG9yICIjaWYKKy8vICAgICBkZWZpbmVkKC4uLikiLCB3aGljaCB3aWxsIG5vdCB3b3JrIGFzIHRoZXNlIG1hY3JvcyBhcmUgQUxXQVlTCisvLyAgICAgZGVmaW5lZC4KKy8vCisvLyAgIEdURVNUX0hBU19DTE9ORSAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBjbG9uZSgyKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19FWENFUFRJT05TICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBleGNlcHRpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RyaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgdG8gc3RkOjpzdHJpbmcpLgorLy8gICBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6d3N0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6d3N0cmluZykuCisvLyAgIEdURVNUX0hBU19QT1NJWF9SRSAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBQT1NJWCByZWd1bGFyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZS9hcmVuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfUFRIUkVBRCAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgPHB0aHJlYWQuaD4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfUlRUSSAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgUlRUSSBpcy9pc24ndAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLgorLy8gICBHVEVTVF9IQVNfU1REX1dTVFJJTkcgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIGRvZXMvZG9lc24ndCB3b3JrIChHb29nbGUgVGVzdCBjYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB3aGVyZSBzdGQ6OndzdHJpbmcgaXMgdW5hdmFpbGFibGUpLgorLy8gICBHVEVTVF9IQVNfVFIxX1RVUExFICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRyMTo6dHVwbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgorLy8gICBHVEVTVF9IQVNfU0VIICAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzICJTdHJ1Y3R1cmVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBIYW5kbGluZyIuCisvLyAgIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSBzdXBwb3J0cyBJL08gc3RyZWFtIHJlZGlyZWN0aW9uIHVzaW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cCgpIGFuZCBkdXAyKCkuCisvLyAgIEdURVNUX1VTRV9PV05fVFIxX1RVUExFICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciBHb29nbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuICBVbnVzZWQgd2hlbiB0aGUgdXNlciBzZXRzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0hBU19UUjFfVFVQTEUgdG8gMC4KKy8vICAgR1RFU1RfTEFOR19DWFgxMSAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IEdvb2dsZSBUZXN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGJ1aWxkaW5nIGluIEMrKzExL0MrKzk4IG1vZGUuCisvLyAgIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyB0ZXN0cyB0aGF0IHVzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGUgVGVzdCBhcyBhIHNoYXJlZCBsaWJyYXJ5IChrbm93biBhcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETEwgb24gV2luZG93cykuCisvLyAgIEdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBpdHNlbGYKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBzaGFyZWQgbGlicmFyeS4KKworLy8gUGxhdGZvcm0taW5kaWNhdGluZyBtYWNyb3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTWFjcm9zIGluZGljYXRpbmcgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIEdvb2dsZSBUZXN0IGlzIGJlaW5nIHVzZWQKKy8vIChhIG1hY3JvIGlzIGRlZmluZWQgdG8gMSBpZiBjb21waWxlZCBvbiB0aGUgZ2l2ZW4gcGxhdGZvcm07CisvLyBvdGhlcndpc2UgVU5ERUZJTkVEIC0tIGl0J3MgbmV2ZXIgZGVmaW5lZCB0byAwLikuICBHb29nbGUgVGVzdAorLy8gZGVmaW5lcyB0aGVzZSBtYWNyb3MgYXV0b21hdGljYWxseS4gIENvZGUgb3V0c2lkZSBHb29nbGUgVGVzdCBNVVNUCisvLyBOT1QgZGVmaW5lIHRoZW0uCisvLworLy8gICBHVEVTVF9PU19BSVggICAgICAtIElCTSBBSVgKKy8vICAgR1RFU1RfT1NfQ1lHV0lOICAgLSBDeWd3aW4KKy8vICAgR1RFU1RfT1NfRlJFRUJTRCAgLSBGcmVlQlNECisvLyAgIEdURVNUX09TX0hQVVggICAgIC0gSFAtVVgKKy8vICAgR1RFU1RfT1NfTElOVVggICAgLSBMaW51eAorLy8gICAgIEdURVNUX09TX0xJTlVYX0FORFJPSUQgLSBHb29nbGUgQW5kcm9pZAorLy8gICBHVEVTVF9PU19NQUMgICAgICAtIE1hYyBPUyBYCisvLyAgICAgR1RFU1RfT1NfSU9TICAgIC0gaU9TCisvLyAgIEdURVNUX09TX05BQ0wgICAgIC0gR29vZ2xlIE5hdGl2ZSBDbGllbnQgKE5hQ2wpCisvLyAgIEdURVNUX09TX09QRU5CU0QgIC0gT3BlbkJTRAorLy8gICBHVEVTVF9PU19RTlggICAgICAtIFFOWAorLy8gICBHVEVTVF9PU19TT0xBUklTICAtIFN1biBTb2xhcmlzCisvLyAgIEdURVNUX09TX1NZTUJJQU4gIC0gU3ltYmlhbgorLy8gICBHVEVTVF9PU19XSU5ET1dTICAtIFdpbmRvd3MgKERlc2t0b3AsIE1pbkdXLCBvciBNb2JpbGUpCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICAtIFdpbmRvd3MgRGVza3RvcAorLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgICAgLSBNaW5HVworLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAgLSBXaW5kb3dzIE1vYmlsZQorLy8gICAgIEdURVNUX09TX1dJTkRPV1NfUEhPTkUgICAgLSBXaW5kb3dzIFBob25lCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19SVCAgICAgICAtIFdpbmRvd3MgU3RvcmUgQXBwL1dpblJUCisvLyAgIEdURVNUX09TX1pPUyAgICAgIC0gei9PUworLy8KKy8vIEFtb25nIHRoZSBwbGF0Zm9ybXMsIEN5Z3dpbiwgTGludXgsIE1heCBPUyBYLCBhbmQgV2luZG93cyBoYXZlIHRoZQorLy8gbW9zdCBzdGFibGUgc3VwcG9ydC4gIFNpbmNlIGNvcmUgbWVtYmVycyBvZiB0aGUgR29vZ2xlIFRlc3QgcHJvamVjdAorLy8gZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gb3RoZXIgcGxhdGZvcm1zLCBzdXBwb3J0IGZvciB0aGVtIG1heSBiZSBsZXNzCisvLyBzdGFibGUuICBJZiB5b3Ugbm90aWNlIGFueSBwcm9ibGVtcyBvbiB5b3VyIHBsYXRmb3JtLCBwbGVhc2Ugbm90aWZ5CisvLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gKHBhdGNoZXMgZm9yIGZpeGluZyB0aGVtIGFyZQorLy8gZXZlbiBtb3JlIHdlbGNvbWUhKS4KKy8vCisvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IG5vbmUgb2YgdGhlIEdURVNUX09TXyogbWFjcm9zIGFyZSBkZWZpbmVkLgorCisvLyBGZWF0dXJlLWluZGljYXRpbmcgbWFjcm9zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTWFjcm9zIGluZGljYXRpbmcgd2hpY2ggR29vZ2xlIFRlc3QgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSAoYSBtYWNybworLy8gaXMgZGVmaW5lZCB0byAxIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgc3VwcG9ydGVkOworLy8gb3RoZXJ3aXNlIFVOREVGSU5FRCAtLSBpdCdzIG5ldmVyIGRlZmluZWQgdG8gMC4pLiAgR29vZ2xlIFRlc3QKKy8vIGRlZmluZXMgdGhlc2UgbWFjcm9zIGF1dG9tYXRpY2FsbHkuICBDb2RlIG91dHNpZGUgR29vZ2xlIFRlc3QgTVVTVAorLy8gTk9UIGRlZmluZSB0aGVtLgorLy8KKy8vIFRoZXNlIG1hY3JvcyBhcmUgcHVibGljIHNvIHRoYXQgcG9ydGFibGUgdGVzdHMgY2FuIGJlIHdyaXR0ZW4uCisvLyBTdWNoIHRlc3RzIHR5cGljYWxseSBzdXJyb3VuZCBjb2RlIHVzaW5nIGEgZmVhdHVyZSB3aXRoIGFuICNpZgorLy8gd2hpY2ggY29udHJvbHMgdGhhdCBjb2RlLiAgRm9yIGV4YW1wbGU6CisvLworLy8gI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisvLyAgIEVYUEVDVF9ERUFUSChEb1NvbWV0aGluZ0RlYWRseSgpKTsKKy8vICNlbmRpZgorLy8KKy8vICAgR1RFU1RfSEFTX0NPTUJJTkUgICAgICAtIHRoZSBDb21iaW5lKCkgZnVuY3Rpb24gKGZvciB2YWx1ZS1wYXJhbWV0ZXJpemVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykKKy8vICAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgICAtIGRlYXRoIHRlc3RzCisvLyAgIEdURVNUX0hBU19QQVJBTV9URVNUICAgLSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyAgIEdURVNUX0hBU19UWVBFRF9URVNUICAgLSB0eXBlZCB0ZXN0cworLy8gICBHVEVTVF9IQVNfVFlQRURfVEVTVF9QIC0gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyAgIEdURVNUX0lTX1RIUkVBRFNBRkUgICAgLSBHb29nbGUgVGVzdCBpcyB0aHJlYWQtc2FmZS4KKy8vICAgR1RFU1RfVVNFU19QT1NJWF9SRSAgICAtIGVuaGFuY2VkIFBPU0lYIHJlZ2V4IGlzIHVzZWQuIERvIG5vdCBjb25mdXNlIHdpdGgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0hBU19QT1NJWF9SRSAoc2VlIGFib3ZlKSB3aGljaCB1c2VycyBjYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSB0aGVtc2VsdmVzLgorLy8gICBHVEVTVF9VU0VTX1NJTVBMRV9SRSAgIC0gb3VyIG93biBzaW1wbGUgcmVnZXggaXMgdXNlZDsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhYm92ZSB0d28gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKy8vICAgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTCAtIGFjY2VwdHMgdW50eXBlZCBOVUxMIGluIEVYUEVDVF9FUSgpLgorCisvLyBNaXNjIHB1YmxpYyBtYWNyb3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgR1RFU1RfRkxBRyhmbGFnX25hbWUpICAtIHJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBHb29nbGUgVGVzdCBmbGFnLgorCisvLyBJbnRlcm5hbCB1dGlsaXRpZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFuZCB1dGlsaXRpZXMgYXJlIGZvciBHb29nbGUgVGVzdCdzIElOVEVSTkFMCisvLyB1c2Ugb25seS4gIENvZGUgb3V0c2lkZSBHb29nbGUgVGVzdCBNVVNUIE5PVCBVU0UgVEhFTSBESVJFQ1RMWS4KKy8vCisvLyBNYWNyb3MgZm9yIGJhc2ljIEMrKyBjb2Rpbmc6CisvLyAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIC0gZm9yIGRpc2FibGluZyBhIGdjYyB3YXJuaW5nLgorLy8gICBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyAgLSBkZWNsYXJlcyB0aGF0IGEgY2xhc3MnIGluc3RhbmNlcyBvciBhCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGRvbid0IGhhdmUgdG8gYmUgdXNlZC4KKy8vICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyAgIC0gZGlzYWJsZXMgb3BlcmF0b3I9LgorLy8gICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fIC0gZGlzYWJsZXMgY29weSBjdG9yIGFuZCBvcGVyYXRvcj0uCisvLyAgIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gICAtIGRlY2xhcmVzIHRoYXQgYSBmdW5jdGlvbidzIHJlc3VsdCBtdXN0IGJlIHVzZWQuCisvLyAgIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUFVTSF8gLSBzdGFydCBjb2RlIHNlY3Rpb24gd2hlcmUgTVNWQyBDNDEyNyBpcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NlZCAoY29uc3RhbnQgY29uZGl0aW9uYWwpLgorLy8gICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8gIC0gZmluaXNoIGNvZGUgc2VjdGlvbiB3aGVyZSBNU1ZDIEM0MTI3CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzdXBwcmVzc2VkLgorLy8KKy8vIEMrKzExIGZlYXR1cmUgd3JhcHBlcnM6CisvLworLy8gICB0ZXN0aW5nOjppbnRlcm5hbDo6bW92ZSAgLSBwb3J0YWJpbGl0eSB3cmFwcGVyIGZvciBzdGQ6Om1vdmUuCisvLworLy8gU3luY2hyb25pemF0aW9uOgorLy8gICBNdXRleCwgTXV0ZXhMb2NrLCBUaHJlYWRMb2NhbCwgR2V0VGhyZWFkQ291bnQoKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKy8vCisvLyBUZW1wbGF0ZSBtZXRhIHByb2dyYW1taW5nOgorLy8gICBpc19wb2ludGVyICAgICAtIGFzIGluIFRSMTsgbmVlZGVkIG9uIFN5bWJpYW4gYW5kIElCTSBYTCBDL0MrKyBvbmx5LgorLy8gICBJdGVyYXRvclRyYWl0cyAtIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjppdGVyYXRvcl90cmFpdHMsIHdoaWNoCisvLyAgICAgICAgICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZSBpbiBsaWJDc3RkIHdoZW4gY29tcGlsZWQgd2l0aCBTdW4gQysrLgorLy8KKy8vIFNtYXJ0IHBvaW50ZXJzOgorLy8gICBzY29wZWRfcHRyICAgICAtIGFzIGluIFRSMi4KKy8vCisvLyBSZWd1bGFyIGV4cHJlc3Npb25zOgorLy8gICBSRSAgICAgICAgICAgICAtIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjbGFzcyB1c2luZyB0aGUgUE9TSVgKKy8vICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4IG9uIFVOSVgtbGlrZQorLy8gICAgICAgICAgICAgICAgICAgIHBsYXRmb3Jtcywgb3IgYSByZWR1Y2VkIHJlZ3VsYXIgZXhjZXB0aW9uIHN5bnRheCBvbgorLy8gICAgICAgICAgICAgICAgICAgIG90aGVyIHBsYXRmb3JtcywgaW5jbHVkaW5nIFdpbmRvd3MuCisvLworLy8gTG9nZ2luZzoKKy8vICAgR1RFU1RfTE9HXygpICAgLSBsb2dzIG1lc3NhZ2VzIGF0IHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgbGV2ZWwuCisvLyAgIExvZ1RvU3RkZXJyKCkgIC0gZGlyZWN0cyBhbGwgbG9nIG1lc3NhZ2VzIHRvIHN0ZGVyci4KKy8vICAgRmx1c2hJbmZvTG9nKCkgLSBmbHVzaGVzIGluZm9ybWF0aW9uYWwgbG9nIG1lc3NhZ2VzLgorLy8KKy8vIFN0ZG91dCBhbmQgc3RkZXJyIGNhcHR1cmluZzoKKy8vICAgQ2FwdHVyZVN0ZG91dCgpICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0LgorLy8gICBHZXRDYXB0dXJlZFN0ZG91dCgpIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4KKy8vICAgQ2FwdHVyZVN0ZGVycigpICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgorLy8gICBHZXRDYXB0dXJlZFN0ZGVycigpIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4KKy8vCisvLyBJbnRlZ2VyIHR5cGVzOgorLy8gICBUeXBlV2l0aFNpemUgICAtIG1hcHMgYW4gaW50ZWdlciB0byBhIGludCB0eXBlLgorLy8gICBJbnQzMiwgVUludDMyLCBJbnQ2NCwgVUludDY0LCBUaW1lSW5NaWxsaXMKKy8vICAgICAgICAgICAgICAgICAgLSBpbnRlZ2VycyBvZiBrbm93biBzaXplcy4KKy8vICAgQmlnZ2VzdEludCAgICAgLSB0aGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlLgorLy8KKy8vIENvbW1hbmQtbGluZSB1dGlsaXRpZXM6CisvLyAgIEdURVNUX0RFQ0xBUkVfKigpICAtIGRlY2xhcmVzIGEgZmxhZy4KKy8vICAgR1RFU1RfREVGSU5FXyooKSAgIC0gZGVmaW5lcyBhIGZsYWcuCisvLyAgIEdldEluamVjdGFibGVBcmd2cygpIC0gcmV0dXJucyB0aGUgY29tbWFuZCBsaW5lIGFzIGEgdmVjdG9yIG9mIHN0cmluZ3MuCisvLworLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdXRpbGl0aWVzOgorLy8gICBHZXRFbnYoKSAgICAgICAgICAgICAtIGdldHMgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBCb29sRnJvbUdUZXN0RW52KCkgICAtIHBhcnNlcyBhIGJvb2wgZW52aXJvbm1lbnQgdmFyaWFibGUuCisvLyAgIEludDMyRnJvbUdUZXN0RW52KCkgIC0gcGFyc2VzIGFuIEludDMyIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBTdHJpbmdGcm9tR1Rlc3RFbnYoKSAtIHBhcnNlcyBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworI2luY2x1ZGUgPGN0eXBlLmg+ICAgLy8gZm9yIGlzc3BhY2UsIGV0YworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLy8gZm9yIHB0cmRpZmZfdAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisKKyNpZiBkZWZpbmVkIF9fQVBQTEVfXworIyBpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KKyMgaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFsZ29yaXRobT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPGlvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHN0cmluZz4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPiAgLy8gTk9MSU5UCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LWFyY2guaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcG9ydC5oIgorCisjaWYgIWRlZmluZWQoR1RFU1RfREVWX0VNQUlMXykKKyMgZGVmaW5lIEdURVNUX0RFVl9FTUFJTF8gImdvb2dsZXRlc3RmcmFtZXdvcmtAQGdvb2dsZWdyb3Vwcy5jb20iCisjIGRlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF8gImd0ZXN0XyIKKyMgZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfICJndGVzdC0iCisjIGRlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIkdURVNUXyIKKyMgZGVmaW5lIEdURVNUX05BTUVfICJHb29nbGUgVGVzdCIKKyMgZGVmaW5lIEdURVNUX1BST0pFQ1RfVVJMXyAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3QvIgorI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9ERVZfRU1BSUxfKQorCisjaWYgIWRlZmluZWQoR1RFU1RfSU5JVF9HT09HTEVfVEVTVF9OQU1FXykKKyMgZGVmaW5lIEdURVNUX0lOSVRfR09PR0xFX1RFU1RfTkFNRV8gInRlc3Rpbmc6OkluaXRHb29nbGVUZXN0IgorI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9JTklUX0dPT0dMRV9URVNUX05BTUVfKQorCisvLyBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIGdjYyB0aGF0IGlzIHVzZWQgdG8gY29tcGlsZSB0aGlzLgorI2lmZGVmIF9fR05VQ19fCisvLyA0MDMwMiBtZWFucyB2ZXJzaW9uIDQuMy4yLgorIyBkZWZpbmUgR1RFU1RfR0NDX1ZFUl8gXAorICAgIChfX0dOVUNfXyoxMDAwMCArIF9fR05VQ19NSU5PUl9fKjEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisjZW5kaWYgIC8vIF9fR05VQ19fCisKKy8vIE1hY3JvcyBmb3IgZGlzYWJsaW5nIE1pY3Jvc29mdCBWaXN1YWwgQysrIHdhcm5pbmdzLgorLy8KKy8vICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDgwMCA0Mzg1KQorLy8gICAvKiBjb2RlIHRoYXQgdHJpZ2dlcnMgd2FybmluZ3MgQzQ4MDAgYW5kIEM0Mzg1ICovCisvLyAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQorI2lmIF9NU0NfVkVSID49IDE1MDAKKyMgZGVmaW5lIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKHdhcm5pbmdzKSBcCisgICAgX19wcmFnbWEod2FybmluZyhwdXNoKSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19wcmFnbWEod2FybmluZyhkaXNhYmxlOiB3YXJuaW5ncykpCisjIGRlZmluZSBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkgICAgICAgICAgXAorICAgIF9fcHJhZ21hKHdhcm5pbmcocG9wKSkKKyNlbHNlCisvLyBPbGRlciB2ZXJzaW9ucyBvZiBNU1ZDIGRvbid0IGhhdmUgX19wcmFnbWEuCisjIGRlZmluZSBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyh3YXJuaW5ncykKKyMgZGVmaW5lIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQorI2VuZGlmCisKKyNpZm5kZWYgR1RFU1RfTEFOR19DWFgxMQorLy8gZ2NjIGFuZCBjbGFuZyBkZWZpbmUgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gd2hlbgorLy8gLXN0ZD17YyxnbnV9Kyt7MHgsMTF9IGlzIHBhc3NlZC4gIFRoZSBDKysxMSBzdGFuZGFyZCBzcGVjaWZpZXMgYQorLy8gdmFsdWUgZm9yIF9fY3BsdXNwbHVzLCBhbmQgcmVjZW50IHZlcnNpb25zIG9mIGNsYW5nLCBnY2MsIGFuZAorLy8gcHJvYmFibHkgb3RoZXIgY29tcGlsZXJzIHNldCB0aGF0IHRvbyBpbiBDKysxMSBtb2RlLgorIyBpZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBDb21waWxpbmcgaW4gYXQgbGVhc3QgQysrMTEgbW9kZS4KKyMgIGRlZmluZSBHVEVTVF9MQU5HX0NYWDExIDEKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0xBTkdfQ1hYMTEgMAorIyBlbmRpZgorI2VuZGlmCisKKy8vIERpc3RpbmN0IGZyb20gQysrMTEgbGFuZ3VhZ2Ugc3VwcG9ydCwgc29tZSBlbnZpcm9ubWVudHMgZG9uJ3QgcHJvdmlkZQorLy8gcHJvcGVyIEMrKzExIGxpYnJhcnkgc3VwcG9ydC4gTm90YWJseSwgaXQncyBwb3NzaWJsZSB0byBidWlsZCBpbgorLy8gQysrMTEgbW9kZSB3aGVuIHRhcmdldGluZyBNYWMgT1MgWCAxMC42LCB3aGljaCBoYXMgYW4gb2xkIGxpYnN0ZGMrKworLy8gd2l0aCBubyBDKysxMSBzdXBwb3J0LgorLy8KKy8vIGxpYnN0ZGMrKyBoYXMgc3VmZmljaWVudCBDKysxMSBzdXBwb3J0IGFzIG9mIEdDQyA0LjYuMCwgX19HTElCQ1hYX18KKy8vIDIwMTEwMzI1LCBidXQgbWFpbnRlbmFuY2UgcmVsZWFzZXMgaW4gdGhlIDQuNCBhbmQgNC41IHNlcmllcyBmb2xsb3dlZAorLy8gdGhpcyBkYXRlLCBzbyBjaGVjayBmb3IgdGhvc2UgdmVyc2lvbnMgYnkgdGhlaXIgZGF0ZSBzdGFtcHMuCisvLyBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9hYmkuaHRtbCNhYmkudmVyc2lvbmluZworI2lmIEdURVNUX0xBTkdfQ1hYMTEgJiYgXAorICAgICghZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgKCBcCisgICAgICAgIF9fR0xJQkNYWF9fID49IDIwMTEwMzI1dWwgJiYgIC8qIEdDQyA+PSA0LjYuMCAqLyBcCisgICAgICAgIC8qIEJsYWNrbGlzdCBvZiBwYXRjaCByZWxlYXNlcyBvZiBvbGRlciBicmFuY2hlczogKi8gXAorICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDExMDQxNnVsICYmICAvKiBHQ0MgNC40LjYgKi8gXAorICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDEyMDMxM3VsICYmICAvKiBHQ0MgNC40LjcgKi8gXAorICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDExMDQyOHVsICYmICAvKiBHQ0MgNC41LjMgKi8gXAorICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDEyMDcwMnVsKSkgICAvKiBHQ0MgNC41LjQgKi8KKyMgZGVmaW5lIEdURVNUX1NURExJQl9DWFgxMSAxCisjZW5kaWYKKworLy8gT25seSB1c2UgQysrMTEgbGlicmFyeSBmZWF0dXJlcyBpZiB0aGUgbGlicmFyeSBwcm92aWRlcyB0aGVtLgorI2lmIEdURVNUX1NURExJQl9DWFgxMQorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9CRUdJTl9BTkRfRU5EXyAxCisjIGRlZmluZSBHVEVTVF9IQVNfU1REX0ZPUldBUkRfTElTVF8gMQorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8gMQorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXyAxCisjIGRlZmluZSBHVEVTVF9IQVNfU1REX01PVkVfIDEKKyMgZGVmaW5lIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8gMQorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9TSEFSRURfUFRSXyAxCisjZW5kaWYKKworLy8gQysrMTEgc3BlY2lmaWVzIHRoYXQgPHR1cGxlPiBwcm92aWRlcyBzdGQ6OnR1cGxlLgorLy8gU29tZSBwbGF0Zm9ybXMgc3RpbGwgbWlnaHQgbm90IGhhdmUgaXQsIGhvd2V2ZXIuCisjaWYgR1RFU1RfTEFOR19DWFgxMQorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9UVVBMRV8gMQorIyBpZiBkZWZpbmVkKF9fY2xhbmdfXykKKy8vIEluc3BpcmVkIGJ5IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5odG1sI19faGFzX2luY2x1ZGUKKyMgIGlmIGRlZmluZWQoX19oYXNfaW5jbHVkZSkgJiYgIV9faGFzX2luY2x1ZGUoPHR1cGxlPikKKyMgICB1bmRlZiBHVEVTVF9IQVNfU1REX1RVUExFXworIyAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gSW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL3N0ZGxpYi9kaW5rdW13YXJlLmhwcAorIyAgaWYgZGVmaW5lZChfQ1BQTElCX1ZFUikgJiYgX0NQUExJQl9WRVIgPCA1MjAKKyMgICB1bmRlZiBHVEVTVF9IQVNfU1REX1RVUExFXworIyAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9fR0xJQkNYWF9fKQorLy8gSW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL3N0ZGxpYi9saWJzdGRjcHAzLmhwcCwKKy8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9nY2MtNC4yL2NoYW5nZXMuaHRtbCBhbmQKKy8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDFjaDAxLmh0bWwjbWFudWFsLmludHJvLnN0YXR1cy5zdGFuZGFyZC4yMDB4CisjICBpZiBfX0dOVUNfXyA8IDQgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPCAyKQorIyAgIHVuZGVmIEdURVNUX0hBU19TVERfVFVQTEVfCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8vIEJyaW5ncyBpbiBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeAorLy8gbmFtZXNwYWNlIChyZWFkLCB3cml0ZSwgY2xvc2UsIGNoZGlyLCBpc2F0dHksIHN0YXQpLiBXZSBkbyBub3QgY3VycmVudGx5CisvLyB1c2UgdGhlbSBvbiBXaW5kb3dzIE1vYmlsZS4KKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjICBpbmNsdWRlIDxpby5oPgorIyBlbmRpZgorLy8gSW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGluY2x1ZGUgPHdpbmRvd3MuaD4sIHVzZSBmb3J3YXJkIGRlY2xhcmF0aW9uCisvLyBhc3N1bWluZyBDUklUSUNBTF9TRUNUSU9OIGlzIGEgdHlwZWRlZiBvZiBfUlRMX0NSSVRJQ0FMX1NFQ1RJT04uCisvLyBUaGlzIGFzc3VtcHRpb24gaXMgdmVyaWZpZWQgYnkKKy8vIFdpbmRvd3NUeXBlc1Rlc3QuQ1JJVElDQUxfU0VDVElPTklzX1JUTF9DUklUSUNBTF9TRUNUSU9OLgorc3RydWN0IF9SVExfQ1JJVElDQUxfU0VDVElPTjsKKyNlbHNlCisvLyBUaGlzIGFzc3VtZXMgdGhhdCBub24tV2luZG93cyBPU2VzIHByb3ZpZGUgdW5pc3RkLmguIEZvciBPU2VzIHdoZXJlIHRoaXMKKy8vIGlzIG5vdCB0aGUgY2FzZSwgd2UgbmVlZCB0byBpbmNsdWRlIGhlYWRlcnMgdGhhdCBwcm92aWRlIHRoZSBmdW5jdGlvbnMKKy8vIG1lbnRpb25lZCBhYm92ZS4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorLy8gVXNlZCB0byBkZWZpbmUgX19BTkRST0lEX0FQSV9fIG1hdGNoaW5nIHRoZSB0YXJnZXQgTkRLIEFQSSBsZXZlbC4KKyMgIGluY2x1ZGUgPGFuZHJvaWQvYXBpLWxldmVsLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisvLyBEZWZpbmVzIHRoaXMgdG8gdHJ1ZSBpZmYgR29vZ2xlIFRlc3QgY2FuIHVzZSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb25zLgorI2lmbmRlZiBHVEVTVF9IQVNfUE9TSVhfUkUKKyMgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorLy8gT24gQW5kcm9pZCwgPHJlZ2V4Lmg+IGlzIG9ubHkgYXZhaWxhYmxlIHN0YXJ0aW5nIHdpdGggR2luZ2VyYnJlYWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX1BPU0lYX1JFIChfX0FORFJPSURfQVBJX18gPj0gOSkKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0hBU19QT1NJWF9SRSAoIUdURVNUX09TX1dJTkRPV1MpCisjIGVuZGlmCisjZW5kaWYKKworI2lmIEdURVNUX1VTRVNfUENSRQorLy8gVGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5jbHVkZWQuCisKKyNlbGlmIEdURVNUX0hBU19QT1NJWF9SRQorCisvLyBPbiBzb21lIHBsYXRmb3JtcywgPHJlZ2V4Lmg+IG5lZWRzIHNvbWVvbmUgdG8gZGVmaW5lIHNpemVfdCwgYW5kCisvLyB3b24ndCBjb21waWxlIG90aGVyd2lzZS4gIFdlIGNhbiAjaW5jbHVkZSBpdCBoZXJlIGFzIHdlIGFscmVhZHkKKy8vIGluY2x1ZGVkIDxzdGRsaWIuaD4sIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gZGVmaW5lIHNpemVfdCB0aHJvdWdoCisvLyA8c3RkZGVmLmg+LgorIyBpbmNsdWRlIDxyZWdleC5oPiAgLy8gTk9MSU5UCisKKyMgZGVmaW5lIEdURVNUX1VTRVNfUE9TSVhfUkUgMQorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisKKy8vIDxyZWdleC5oPiBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuICBVc2Ugb3VyIG93biBzaW1wbGUgcmVnZXgKKy8vIGltcGxlbWVudGF0aW9uIGluc3RlYWQuCisjIGRlZmluZSBHVEVTVF9VU0VTX1NJTVBMRV9SRSAxCisKKyNlbHNlCisKKy8vIDxyZWdleC5oPiBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLiAgVXNlIG91ciBvd24KKy8vIHNpbXBsZSByZWdleCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgorIyBkZWZpbmUgR1RFU1RfVVNFU19TSU1QTEVfUkUgMQorCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfUENSRQorCisjaWZuZGVmIEdURVNUX0hBU19FWENFUFRJT05TCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisjIGlmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorLy8gTVNWQydzIGFuZCBDKytCdWlsZGVyJ3MgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTVEwgdXNlIHRoZSBfSEFTX0VYQ0VQVElPTlMKKy8vIG1hY3JvIHRvIGVuYWJsZSBleGNlcHRpb25zLCBzbyB3ZSdsbCBkbyB0aGUgc2FtZS4KKy8vIEFzc3VtZXMgdGhhdCBleGNlcHRpb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCisjICBpZm5kZWYgX0hBU19FWENFUFRJT05TCisjICAgZGVmaW5lIF9IQVNfRVhDRVBUSU9OUyAxCisjICBlbmRpZiAgLy8gX0hBU19FWENFUFRJT05TCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgX0hBU19FWENFUFRJT05TCisjIGVsaWYgZGVmaW5lZChfX2NsYW5nX18pCisvLyBjbGFuZyBkZWZpbmVzIF9fRVhDRVBUSU9OUyBpZmYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBiZWZvcmUgY2xhbmcgMjIwNzE0LAorLy8gYnV0IGlmZiBjbGVhbnVwcyBhcmUgZW5hYmxlZCBhZnRlciB0aGF0LiBJbiBPYmotQysrIGZpbGVzLCB0aGVyZSBjYW4gYmUKKy8vIGNsZWFudXBzIGZvciBPYmpDIGV4Y2VwdGlvbnMgd2hpY2ggYWxzbyBuZWVkIGNsZWFudXBzLCBldmVuIGlmIEMrKyBleGNlcHRpb25zCisvLyBhcmUgZGlzYWJsZWQuIGNsYW5nIGhhcyBfX2hhc19mZWF0dXJlKGN4eF9leGNlcHRpb25zKSB3aGljaCBjaGVja3MgZm9yIEMrKworLy8gZXhjZXB0aW9ucyBzdGFydGluZyBhdCBjbGFuZyByMjA2MzUyLCBidXQgd2hpY2ggY2hlY2tlZCBmb3IgY2xlYW51cHMgcHJpb3IgdG8KKy8vIHRoYXQuIFRvIHJlbGlhYmx5IGNoZWNrIGZvciBDKysgZXhjZXB0aW9uIGF2YWlsYWJpbGl0eSB3aXRoIGNsYW5nLCBjaGVjayBmb3IKKy8vIF9fRVhDRVBUSU9OUyAmJiBfX2hhc19mZWF0dXJlKGN4eF9leGNlcHRpb25zKS4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAoX19FWENFUFRJT05TICYmIF9faGFzX2ZlYXR1cmUoY3h4X2V4Y2VwdGlvbnMpKQorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fRVhDRVBUSU9OUworLy8gZ2NjIGRlZmluZXMgX19FWENFUFRJT05TIHRvIDEgaWZmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBTdW4gUHJvIENDIHN1cHBvcnRzIGV4Y2VwdGlvbnMuICBIb3dldmVyLCB0aGVyZSBpcyBubyBjb21waWxlLXRpbWUgd2F5IG9mCisvLyBkZXRlY3Rpbmcgd2hldGhlciB0aGV5IGFyZSBlbmFibGVkIG9yIG5vdC4gIFRoZXJlZm9yZSwgd2UgYXNzdW1lIHRoYXQKKy8vIHRoZXkgYXJlIGVuYWJsZWQgdW5sZXNzIHRoZSB1c2VyIHRlbGxzIHVzIG90aGVyd2lzZS4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCisjIGVsaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiBfX0VYQ0VQVElPTlMKKy8vIHhsQyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorLy8gRXhjZXB0aW9uIGhhbmRsaW5nIGlzIGluIGVmZmVjdCBieSBkZWZhdWx0IGluIEhQIGFDQyBjb21waWxlci4gSXQgaGFzIHRvCisvLyBiZSB0dXJuZWQgb2YgYnkgK25vZWggY29tcGlsZXIgb3B0aW9uIGlmIGRlc2lyZWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbHNlCisvLyBGb3Igb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQgdG8gYmUKKy8vIGNvbnNlcnZhdGl2ZS4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAwCisjIGVuZGlmICAvLyBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworI2lmICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQorLy8gRXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgbWFjcm8gYW55IGxvbmdlciwgd2Uga2VlcCBpdCBpbiBjYXNlCisvLyBzb21lIGNsaWVudHMgc3RpbGwgZGVwZW5kIG9uIGl0LgorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9TVFJJTkcgMQorI2VsaWYgIUdURVNUX0hBU19TVERfU1RSSU5HCisvLyBUaGUgdXNlciB0b2xkIHVzIHRoYXQgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuCisjIGVycm9yICJHb29nbGUgVGVzdCBjYW5ub3QgYmUgdXNlZCB3aGVyZSA6OnN0ZDo6c3RyaW5nIGlzbid0IGF2YWlsYWJsZS4iCisjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQorCisjaWZuZGVmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKworIyBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgMAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyNpZm5kZWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiB1c2VzIGF1dG9jb25mIHRvIGRldGVjdCB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nCisvLyAgIGlzIGF2YWlsYWJsZS4KKworLy8gQ3lnd2luIDEuNyBhbmQgYmVsb3cgZG9lc24ndCBzdXBwb3J0IDo6c3RkOjp3c3RyaW5nLgorLy8gU29sYXJpcycgbGliYysrIGRvZXNuJ3Qgc3VwcG9ydCBpdCBlaXRoZXIuICBBbmRyb2lkIGhhcworLy8gbm8gc3VwcG9ydCBmb3IgaXQgYXQgbGVhc3QgYXMgcmVjZW50IGFzIEZyb3lvICgyLjIpLgorIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9XU1RSSU5HIFwKKyAgICAoIShHVEVTVF9PU19MSU5VWF9BTkRST0lEIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TT0xBUklTKSkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKyMgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyBcCisgICAgKEdURVNUX0hBU19TVERfV1NUUklORyAmJiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORykKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIERldGVybWluZXMgd2hldGhlciBSVFRJIGlzIGF2YWlsYWJsZS4KKyNpZm5kZWYgR1RFU1RfSEFTX1JUVEkKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLCBzbyB3ZSBuZWVkIHRvCisvLyBmaWd1cmUgaXQgb3V0LgorCisjIGlmZGVmIF9NU0NfVkVSCisKKyMgIGlmZGVmIF9DUFBSVFRJICAvLyBNU1ZDIGRlZmluZXMgdGhpcyBtYWNybyBpZmYgUlRUSSBpcyBlbmFibGVkLgorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCisjICBlbHNlCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKKyMgIGVuZGlmCisKKy8vIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiA0LjMuMiwgZ2NjIGRlZmluZXMgX19HWFhfUlRUSSBpZmYgUlRUSSBpcyBlbmFibGVkLgorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDMwMikKKworIyAgaWZkZWYgX19HWFhfUlRUSQorLy8gV2hlbiBidWlsZGluZyBhZ2FpbnN0IFNUTHBvcnQgd2l0aCB0aGUgQW5kcm9pZCBOREsgYW5kIHdpdGgKKy8vIC1mcnR0aSAtZm5vLWV4Y2VwdGlvbnMsIHRoZSBidWlsZCBmYWlscyBhdCBsaW5rIHRpbWUgd2l0aCB1bmRlZmluZWQKKy8vIHJlZmVyZW5jZXMgdG8gX19jeGFfYmFkX3R5cGVpZC4gTm90ZSBzdXJlIGlmIFNUTCBvciB0b29sY2hhaW4gYnVnLAorLy8gc28gZGlzYWJsZSBSVFRJIHdoZW4gZGV0ZWN0ZWQuCisjICAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBkZWZpbmVkKF9TVExQT1JUX01BSk9SKSAmJiBcCisgICAgICAgIWRlZmluZWQoX19FWENFUFRJT05TKQorIyAgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgIGVsc2UKKyMgICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBfX1NUTFBPUlRfTUFKT1IgJiYgIV9fRVhDRVBUSU9OUworIyAgZWxzZQorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCisjICBlbmRpZiAgLy8gX19HWFhfUlRUSQorCisvLyBDbGFuZyBkZWZpbmVzIF9fR1hYX1JUVEkgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDMuMCwgYnV0IGl0cyBtYW51YWwgcmVjb21tZW5kcworLy8gdXNpbmcgaGFzX2ZlYXR1cmUgaW5zdGVhZC4gaGFzX2ZlYXR1cmUoY3h4X3J0dGkpIGlzIHN1cHBvcnRlZCBzaW5jZSAyLjcsIHRoZQorLy8gZmlyc3QgdmVyc2lvbiB3aXRoIEMrKyBzdXBwb3J0LgorIyBlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorCisjICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgX19oYXNfZmVhdHVyZShjeHhfcnR0aSkKKworLy8gU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDkuMCBJQk0gVmlzdWFsIEFnZSBkZWZpbmVzIF9fUlRUSV9BTExfXyB0byAxIGlmCisvLyBib3RoIHRoZSB0eXBlaWQgYW5kIGR5bmFtaWNfY2FzdCBmZWF0dXJlcyBhcmUgcHJlc2VudC4KKyMgZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fID49IDkwMCkKKworIyAgaWZkZWYgX19SVFRJX0FMTF9fCisjICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKyMgIGVsc2UKKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAorIyAgZW5kaWYKKworIyBlbHNlCisKKy8vIEZvciBhbGwgb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgUlRUSSBpcyBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKKworIyBlbmRpZiAgLy8gX01TQ19WRVIKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQorCisvLyBJdCdzIHRoaXMgaGVhZGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgPHR5cGVpbmZvPiB3aGVuIFJUVEkKKy8vIGlzIGVuYWJsZWQuCisjaWYgR1RFU1RfSEFTX1JUVEkKKyMgaW5jbHVkZSA8dHlwZWluZm8+CisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdGhlIHB0aHJlYWRzIGxpYnJhcnkuCisjaWZuZGVmIEdURVNUX0hBU19QVEhSRUFECisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyBleHBsaWNpdGx5LCBzbyB3ZSBtYWtlIHJlYXNvbmFibGUgYXNzdW1wdGlvbnMgYWJvdXQKKy8vIHdoaWNoIHBsYXRmb3JtcyBoYXZlIHB0aHJlYWRzIHN1cHBvcnQuCisvLworLy8gVG8gZGlzYWJsZSB0aHJlYWRpbmcgc3VwcG9ydCBpbiBHb29nbGUgVGVzdCwgYWRkIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAorLy8gdG8geW91ciBjb21waWxlciBmbGFncy4KKyMgZGVmaW5lIEdURVNUX0hBU19QVEhSRUFEIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfSFBVWCBcCisgICAgfHwgR1RFU1RfT1NfUU5YIHx8IEdURVNUX09TX0ZSRUVCU0QgfHwgR1RFU1RfT1NfTkFDTCkKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworI2lmIEdURVNUX0hBU19QVEhSRUFECisvLyBndGVzdC1wb3J0LmggZ3VhcmFudGVlcyB0byAjaW5jbHVkZSA8cHRocmVhZC5oPiB3aGVuIEdURVNUX0hBU19QVEhSRUFEIGlzCisvLyB0cnVlLgorIyBpbmNsdWRlIDxwdGhyZWFkLmg+ICAvLyBOT0xJTlQKKworLy8gRm9yIHRpbWVzcGVjIGFuZCBuYW5vc2xlZXAsIHVzZWQgYmVsb3cuCisjIGluY2x1ZGUgPHRpbWUuaD4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIERldGVybWluZXMgaWYgaGFzaF9tYXAvaGFzaF9zZXQgYXJlIGF2YWlsYWJsZS4KKy8vIE9ubHkgdXNlZCBmb3IgdGVzdGluZyBhZ2FpbnN0IHRob3NlIGNvbnRhaW5lcnMuCisjaWYgIWRlZmluZWQoR1RFU1RfSEFTX0hBU0hfTUFQXykKKyMgaWYgX01TQ19WRVIKKyMgIGRlZmluZSBHVEVTVF9IQVNfSEFTSF9NQVBfIDEgIC8vIEluZGljYXRlcyB0aGF0IGhhc2hfbWFwIGlzIGF2YWlsYWJsZS4KKyMgIGRlZmluZSBHVEVTVF9IQVNfSEFTSF9TRVRfIDEgIC8vIEluZGljYXRlcyB0aGF0IGhhc2hfc2V0IGlzIGF2YWlsYWJsZS4KKyMgZW5kaWYgIC8vIF9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0hBU19IQVNIX01BUF8pCisKKy8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRyMS90dXBsZS4gIFlvdSBjYW4gZGVmaW5lCisvLyB0aGlzIG1hY3JvIHRvIDAgdG8gcHJldmVudCBHb29nbGUgVGVzdCBmcm9tIHVzaW5nIHR1cGxlIChhbnkKKy8vIGZlYXR1cmUgZGVwZW5kaW5nIG9uIHR1cGxlIHdpdGggYmUgZGlzYWJsZWQgaW4gdGhpcyBtb2RlKS4KKyNpZm5kZWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorIyBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lEICYmIGRlZmluZWQoX1NUTFBPUlRfTUFKT1IpCisvLyBTVExwb3J0LCBwcm92aWRlZCB3aXRoIHRoZSBBbmRyb2lkIE5ESywgaGFzIG5laXRoZXIgPHRyMS90dXBsZT4gb3IgPHR1cGxlPi4KKyMgIGRlZmluZSBHVEVTVF9IQVNfVFIxX1RVUExFIDAKKyMgZWxzZQorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgbm90IHRvIGRvIGl0LCBzbyB3ZSBhc3N1bWUgaXQncyBPSy4KKyMgIGRlZmluZSBHVEVTVF9IQVNfVFIxX1RVUExFIDEKKyMgZW5kaWYKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgR29vZ2xlIFRlc3QncyBvd24gdHIxIHR1cGxlIGltcGxlbWVudGF0aW9uCisvLyBzaG91bGQgYmUgdXNlZC4KKyNpZm5kZWYgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCisKKy8vIFdlIHVzZSBvdXIgb3duIFRSMSB0dXBsZSBpZiB3ZSBhcmVuJ3Qgc3VyZSB0aGUgdXNlciBoYXMgYW4KKy8vIGltcGxlbWVudGF0aW9uIG9mIGl0IGFscmVhZHkuICBBdCB0aGlzIHRpbWUsIGxpYnN0ZGMrKyA0LjAuMCsgYW5kCisvLyBNU1ZDIDIwMTAgYXJlIHRoZSBvbmx5IG1haW5zdHJlYW0gc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgY29tZQorLy8gd2l0aCBhIFRSMSB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gIE5WSURJQSdzIENVREEgTlZDQyBjb21waWxlcgorLy8gcHJldGVuZHMgdG8gYmUgR0NDIGJ5IGRlZmluaW5nIF9fR05VQ19fIGFuZCBmcmllbmRzLCBidXQgY2Fubm90CisvLyBjb21waWxlIEdDQydzIHR1cGxlIGltcGxlbWVudGF0aW9uLiAgTVNWQyAyMDA4ICg5LjApIHByb3ZpZGVzIFRSMQorLy8gdHVwbGUgaW4gYSAzMjMgTUIgRmVhdHVyZSBQYWNrIGRvd25sb2FkLCB3aGljaCB3ZSBjYW5ub3QgYXNzdW1lIHRoZQorLy8gdXNlciBoYXMuICBRTlgncyBRQ0MgY29tcGlsZXIgaXMgYSBtb2RpZmllZCBHQ0MgYnV0IGl0IGRvZXNuJ3QKKy8vIHN1cHBvcnQgVFIxIHR1cGxlLiAgbGliYysrIG9ubHkgcHJvdmlkZXMgc3RkOjp0dXBsZSwgaW4gQysrMTEgbW9kZSwKKy8vIGFuZCBpdCBjYW4gYmUgdXNlZCB3aXRoIHNvbWUgY29tcGlsZXJzIHRoYXQgZGVmaW5lIF9fR05VQ19fLgorIyBpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19DVURBQ0NfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMDAwKSBcCisgICAgICAmJiAhR1RFU1RfT1NfUU5YICYmICFkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikpIHx8IF9NU0NfVkVSID49IDE2MDAKKyMgIGRlZmluZSBHVEVTVF9FTlZfSEFTX1RSMV9UVVBMRV8gMQorIyBlbmRpZgorCisvLyBDKysxMSBzcGVjaWZpZXMgdGhhdCA8dHVwbGU+IHByb3ZpZGVzIHN0ZDo6dHVwbGUuIFVzZSB0aGF0IGlmIGd0ZXN0IGlzIHVzZWQKKy8vIGluIEMrKzExIG1vZGUgYW5kIGxpYnN0ZGMrKyBpc24ndCB2ZXJ5IG9sZCAoYmluYXJpZXMgdGFyZ2V0aW5nIE9TIFggMTAuNgorLy8gY2FuIGJ1aWxkIHdpdGggY2xhbmcgYnV0IG5lZWQgdG8gdXNlIGdjYzQuMidzIGxpYnN0ZGMrKykuCisjIGlmIEdURVNUX0xBTkdfQ1hYMTEgJiYgKCFkZWZpbmVkKF9fR0xJQkNYWF9fKSB8fCBfX0dMSUJDWFhfXyA+IDIwMTEwMzI1KQorIyAgZGVmaW5lIEdURVNUX0VOVl9IQVNfU1REX1RVUExFXyAxCisjIGVuZGlmCisKKyMgaWYgR1RFU1RfRU5WX0hBU19UUjFfVFVQTEVfIHx8IEdURVNUX0VOVl9IQVNfU1REX1RVUExFXworIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDAKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDEKKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorCisvLyBUbyBhdm9pZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBldmVyeXdoZXJlLCB3ZSBtYWtlIGl0CisvLyBndGVzdC1wb3J0LmgncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSB0aGUgaGVhZGVyIGltcGxlbWVudGluZworLy8gdHVwbGUuCisjaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KKyMgaW5jbHVkZSA8dHVwbGU+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjIGRlZmluZSBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfIDo6c3RkCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfVFVQTEVfCisKKy8vIFdlIGluY2x1ZGUgdHIxOjp0dXBsZSBldmVuIGlmIHN0ZDo6dHVwbGUgaXMgYXZhaWxhYmxlIHRvIGRlZmluZSBwcmludGVycyBmb3IKKy8vIHRoZW0uCisjaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQorIyBpZm5kZWYgR1RFU1RfVFVQTEVfTkFNRVNQQUNFXworIyAgZGVmaW5lIEdURVNUX1RVUExFX05BTUVTUEFDRV8gOjpzdGQ6OnRyMQorIyBlbmRpZiAgLy8gR1RFU1RfVFVQTEVfTkFNRVNQQUNFXworCisjIGlmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisjICBpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oIiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCAgLy8gTk9MSU5UCisjIGVsaWYgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfCisjICBpbmNsdWRlIDx0dXBsZT4KKy8vIEMrKzExIHB1dHMgaXRzIHR1cGxlIGludG8gdGhlIDo6c3RkIG5hbWVzcGFjZSByYXRoZXIgdGhhbgorLy8gOjpzdGQ6OnRyMS4gIGd0ZXN0IGV4cGVjdHMgdHVwbGUgdG8gbGl2ZSBpbiA6OnN0ZDo6dHIxLCBzbyBwdXQgaXQgdGhlcmUuCisvLyBUaGlzIGNhdXNlcyB1bmRlZmluZWQgYmVoYXZpb3IsIGJ1dCBzdXBwb3J0ZWQgY29tcGlsZXJzIHJlYWN0IGluCisvLyB0aGUgd2F5IHdlIGludGVuZC4KK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIHRyMSB7Cit1c2luZyA6OnN0ZDo6Z2V0OwordXNpbmcgOjpzdGQ6Om1ha2VfdHVwbGU7Cit1c2luZyA6OnN0ZDo6dHVwbGU7Cit1c2luZyA6OnN0ZDo6dHVwbGVfZWxlbWVudDsKK3VzaW5nIDo6c3RkOjp0dXBsZV9zaXplOworfQorfQorCisjIGVsaWYgR1RFU1RfT1NfU1lNQklBTgorCisvLyBPbiBTeW1iaWFuLCBCT09TVF9IQVNfVFIxX1RVUExFIGNhdXNlcyBCb29zdCdzIFRSMSB0dXBsZSBsaWJyYXJ5IHRvCisvLyB1c2UgU1RMcG9ydCdzIHR1cGxlIGltcGxlbWVudGF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QKKy8vIHdvcmsgYXMgdGhlIGNvcHkgb2YgU1RMcG9ydCBkaXN0cmlidXRlZCB3aXRoIFN5bWJpYW4gaXMgaW5jb21wbGV0ZS4KKy8vIEJ5IG1ha2luZyBzdXJlIEJPT1NUX0hBU19UUjFfVFVQTEUgaXMgdW5kZWZpbmVkLCB3ZSBmb3JjZSBCb29zdCB0bworLy8gdXNlIGl0cyBvd24gdHVwbGUgaW1wbGVtZW50YXRpb24uCisjICBpZmRlZiBCT09TVF9IQVNfVFIxX1RVUExFCisjICAgdW5kZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQorIyAgZW5kaWYgIC8vIEJPT1NUX0hBU19UUjFfVFVQTEUKKworLy8gVGhpcyBwcmV2ZW50cyA8Ym9vc3QvdHIxL2RldGFpbC9jb25maWcuaHBwPiwgd2hpY2ggZGVmaW5lcworLy8gQk9PU1RfSEFTX1RSMV9UVVBMRSwgZnJvbSBiZWluZyAjaW5jbHVkZWQgYnkgQm9vc3QncyA8dHVwbGU+LgorIyAgZGVmaW5lIEJPT1NUX1RSMV9ERVRBSUxfQ09ORklHX0hQUF9JTkNMVURFRAorIyAgaW5jbHVkZSA8dHVwbGU+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0ICAvLyBOT0xJTlQKKworIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDAwMCkKKy8vIEdDQyA0LjArIGltcGxlbWVudHMgdHIxL3R1cGxlIGluIHRoZSA8dHIxL3R1cGxlPiBoZWFkZXIuICBUaGlzIGRvZXMKKy8vIG5vdCBjb25mb3JtIHRvIHRoZSBUUjEgc3BlYywgd2hpY2ggcmVxdWlyZXMgdGhlIGhlYWRlciB0byBiZSA8dHVwbGU+LgorCisjICBpZiAhR1RFU1RfSEFTX1JUVEkgJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDMwMgorLy8gVW50aWwgdmVyc2lvbiA0LjMuMiwgZ2NjIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyA8dHIxL2Z1bmN0aW9uYWw+LAorLy8gd2hpY2ggaXMgI2luY2x1ZGVkIGJ5IDx0cjEvdHVwbGU+LCB0byBub3QgY29tcGlsZSB3aGVuIFJUVEkgaXMKKy8vIGRpc2FibGVkLiAgX1RSMV9GVU5DVElPTkFMIGlzIHRoZSBoZWFkZXIgZ3VhcmQgZm9yCisvLyA8dHIxL2Z1bmN0aW9uYWw+LiAgSGVuY2UgdGhlIGZvbGxvd2luZyAjZGVmaW5lIGlzIGEgaGFjayB0byBwcmV2ZW50CisvLyA8dHIxL2Z1bmN0aW9uYWw+IGZyb20gYmVpbmcgaW5jbHVkZWQuCisjICAgZGVmaW5lIF9UUjFfRlVOQ1RJT05BTCAxCisjICAgaW5jbHVkZSA8dHIxL3R1cGxlPgorIyAgIHVuZGVmIF9UUjFfRlVOQ1RJT05BTCAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvICNpbmNsdWRlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyA8dHIxL2Z1bmN0aW9uYWw+IGlmIGhlIGNob29zZXMgdG8uCisjICBlbHNlCisjICAgaW5jbHVkZSA8dHIxL3R1cGxlPiAgLy8gTk9MSU5UCisjICBlbmRpZiAgLy8gIUdURVNUX0hBU19SVFRJICYmIEdURVNUX0dDQ19WRVJfIDwgNDAzMDIKKworIyBlbHNlCisvLyBJZiB0aGUgY29tcGlsZXIgaXMgbm90IEdDQyA0LjArLCB3ZSBhc3N1bWUgdGhlIHVzZXIgaXMgdXNpbmcgYQorLy8gc3BlYy1jb25mb3JtaW5nIFRSMSBpbXBsZW1lbnRhdGlvbi4KKyMgIGluY2x1ZGUgPHR1cGxlPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCAgLy8gTk9MSU5UCisjIGVuZGlmICAvLyBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGNsb25lKDIpIGlzIHN1cHBvcnRlZC4KKy8vIFVzdWFsbHkgaXQgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBvbiBMaW51eCwgZXhjbHVkaW5nCisvLyBMaW51eCBvbiB0aGUgSXRhbml1bSBhcmNoaXRlY3R1cmUuCisvLyBBbHNvIHNlZSBodHRwOi8vbGludXguZGllLm5ldC9tYW4vMi9jbG9uZS4KKyNpZm5kZWYgR1RFU1RfSEFTX0NMT05FCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cywgc28gd2UgbmVlZCB0byBmaWd1cmUgaXQgb3V0LgorCisjIGlmIEdURVNUX09TX0xJTlVYICYmICFkZWZpbmVkKF9faWE2NF9fKQorIyAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAorLy8gT24gQW5kcm9pZCwgY2xvbmUoKSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBBUk0gc3RhcnRpbmcgd2l0aCBHaW5nZXJicmVhZC4KKyMgICAgaWYgZGVmaW5lZChfX2FybV9fKSAmJiBfX0FORFJPSURfQVBJX18gPj0gOQorIyAgICAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAxCisjICAgIGVsc2UKKyMgICAgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMAorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMQorIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAwCisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfQ0xPTkUKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgc3RyZWFtIHJlZGlyZWN0aW9uLiBUaGlzIGlzIHVzZWQgdG8gdGVzdAorLy8gb3V0cHV0IGNvcnJlY3RuZXNzIGFuZCB0byBpbXBsZW1lbnQgZGVhdGggdGVzdHMuCisjaWZuZGVmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKy8vIEJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IHN0cmVhbSByZWRpcmVjdGlvbiBpcyBzdXBwb3J0ZWQgb24gYWxsCisvLyBwbGF0Zm9ybXMgZXhjZXB0IGtub3duIG1vYmlsZSBvbmVzLgorIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IFwKKyAgICBHVEVTVF9PU19XSU5ET1dTX1BIT05FIHx8IEdURVNUX09TX1dJTkRPV1NfUlQKKyMgIGRlZmluZSBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OIDAKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04gMQorIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19TWU1CSUFOCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgZGVhdGggdGVzdHMuCisvLyBHb29nbGUgVGVzdCBkb2VzIG5vdCBzdXBwb3J0IGRlYXRoIHRlc3RzIGZvciBWQyA3LjEgYW5kIGVhcmxpZXIgYXMKKy8vIGFib3J0KCkgaW4gYSBWQyA3LjEgYXBwbGljYXRpb24gY29tcGlsZWQgYXMgR1VJIGluIGRlYnVnIGNvbmZpZworLy8gcG9wcyB1cCBhIGRpYWxvZyB3aW5kb3cgdGhhdCBjYW5ub3QgYmUgc3VwcHJlc3NlZCBwcm9ncmFtbWF0aWNhbGx5LgorI2lmIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUyB8fCBcCisgICAgIChHVEVTVF9PU19NQUMgJiYgIUdURVNUX09TX0lPUykgfHwgXAorICAgICAoR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICYmIF9NU0NfVkVSID49IDE0MDApIHx8IFwKKyAgICAgR1RFU1RfT1NfV0lORE9XU19NSU5HVyB8fCBHVEVTVF9PU19BSVggfHwgR1RFU1RfT1NfSFBVWCB8fCBcCisgICAgIEdURVNUX09TX09QRU5CU0QgfHwgR1RFU1RfT1NfUU5YIHx8IEdURVNUX09TX0ZSRUVCU0QpCisjIGRlZmluZSBHVEVTVF9IQVNfREVBVEhfVEVTVCAxCisjZW5kaWYKKworLy8gV2UgZG9uJ3Qgc3VwcG9ydCBNU1ZDIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQgbm93LiAgVGhlcmVmb3JlCisvLyBhbGwgdGhlIGNvbXBpbGVycyB3ZSBjYXJlIGFib3V0IGFyZSBhZGVxdWF0ZSBmb3Igc3VwcG9ydGluZworLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyNkZWZpbmUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgMQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCB0eXBlLWRyaXZlbiB0ZXN0cy4KKworLy8gVHlwZWQgdGVzdHMgbmVlZCA8dHlwZWluZm8+IGFuZCB2YXJpYWRpYyBtYWNyb3MsIHdoaWNoIEdDQywgVkMrKyA4LjAsCisvLyBTdW4gUHJvIENDLCBJQk0gVmlzdWFsIEFnZSwgYW5kIEhQIGFDQyBzdXBwb3J0LgorI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IChfTVNDX1ZFUiA+PSAxNDAwKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKSB8fCBcCisgICAgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkKF9fSFBfYUNDKQorIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1QgMQorIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCAxCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgQ29tYmluZSgpLiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbgorLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0CisvLyB3b3JrIG9uIFN1biBTdHVkaW8gc2luY2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIHRlbXBsYXRlZCBjb252ZXJzaW9uCisvLyBvcGVyYXRvcnMuCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QgJiYgR1RFU1RfSEFTX1RSMV9UVVBMRSAmJiAhZGVmaW5lZChfX1NVTlBST19DQykKKyMgZGVmaW5lIEdURVNUX0hBU19DT01CSU5FIDEKKyNlbmRpZgorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN5c3RlbSBjb21waWxlciB1c2VzIFVURi0xNiBmb3IgZW5jb2Rpbmcgd2lkZSBzdHJpbmdzLgorI2RlZmluZSBHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XyBcCisgICAgKEdURVNUX09TX1dJTkRPV1MgfHwgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfQUlYKQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGVzdCByZXN1bHRzIGNhbiBiZSBzdHJlYW1lZCB0byBhIHNvY2tldC4KKyNpZiBHVEVTVF9PU19MSU5VWAorIyBkZWZpbmUgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXyAxCisjZW5kaWYKKworLy8gRGVmaW5lcyBzb21lIHV0aWxpdHkgbWFjcm9zLgorCisvLyBUaGUgR05VIGNvbXBpbGVyIGVtaXRzIGEgd2FybmluZyBpZiBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIGFyZSBmb2xsb3dlZCBieQorLy8gYW4gImVsc2UiIHN0YXRlbWVudCBhbmQgYnJhY2VzIGFyZSBub3QgdXNlZCB0byBleHBsaWNpdGx5IGRpc2FtYmlndWF0ZSB0aGUKKy8vICJlbHNlIiBiaW5kaW5nLiAgVGhpcyBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIGNvZGUgbGlrZToKKy8vCisvLyAgIGlmIChnYXRlKQorLy8gICAgIEFTU0VSVF8qKGNvbmRpdGlvbikgPDwgIlNvbWUgbWVzc2FnZSI7CisvLworLy8gVGhlICJzd2l0Y2ggKDApIGNhc2UgMDoiIGlkaW9tIGlzIHVzZWQgdG8gc3VwcHJlc3MgdGhpcy4KKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXworI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIHN3aXRjaCAoMCkgY2FzZSAwOiBkZWZhdWx0OiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gVXNlIHRoaXMgYW5ub3RhdGlvbiBhdCB0aGUgZW5kIG9mIGEgc3RydWN0L2NsYXNzIGRlZmluaXRpb24gdG8KKy8vIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc3RhbmNlcyB0aGF0IGFyZSBuZXZlcgorLy8gdXNlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gYWxsIGludGVyZXN0aW5nIGxvZ2ljIGhhcHBlbnMgaW5zaWRlIHRoZQorLy8gYyd0b3IgYW5kIC8gb3IgZCd0b3IuICBFeGFtcGxlOgorLy8KKy8vICAgc3RydWN0IEZvbyB7CisvLyAgICAgRm9vKCkgeyAuLi4gfQorLy8gICB9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOworLy8KKy8vIEFsc28gdXNlIGl0IGFmdGVyIGEgdmFyaWFibGUgb3IgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIHRvIHRlbGwgdGhlCisvLyBjb21waWxlciB0aGUgdmFyaWFibGUvcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUgdG8gYmUgdXNlZC4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCisjIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorIyBpZiBfX2hhc19hdHRyaWJ1dGUodW51c2VkKQorIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIEdURVNUX0FUVFJJQlVURV9VTlVTRURfCisjIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXworI2VuZGlmCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgb3BlcmF0b3I9CisvLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCisjZGVmaW5lIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSlcCisgIHZvaWQgb3BlcmF0b3I9KHR5cGUgY29uc3QgJikKKworLy8gQSBtYWNybyB0byBkaXNhbGxvdyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KKy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHByaXZhdGU6IGRlY2xhcmF0aW9ucyBmb3IgYSBjbGFzcy4KKyNkZWZpbmUgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyh0eXBlKVwKKyAgdHlwZSh0eXBlIGNvbnN0ICYpO1wKKyAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyh0eXBlKQorCisvLyBUZWxsIHRoZSBjb21waWxlciB0byB3YXJuIGFib3V0IHVudXNlZCByZXR1cm4gdmFsdWVzIGZvciBmdW5jdGlvbnMgZGVjbGFyZWQKKy8vIHdpdGggdGhpcyBtYWNyby4gIFRoZSBtYWNybyBzaG91bGQgYmUgdXNlZCBvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKy8vIGZvbGxvd2luZyB0aGUgYXJndW1lbnQgbGlzdDoKKy8vCisvLyAgIFNwcm9ja2V0KiBBbGxvY2F0ZVNwcm9ja2V0KCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFkZWZpbmVkKENPTVBJTEVSX0lDQykKKyMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXworI2VuZGlmICAvLyBfX0dOVUNfXyAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFDT01QSUxFUl9JQ0MKKworLy8gTVMgQysrIGNvbXBpbGVyIGVtaXRzIHdhcm5pbmcgd2hlbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29tcGlsZSB0aW1lCisvLyBjb25zdGFudC4gSW4gc29tZSBjb250ZXh0cyB0aGlzIHdhcm5pbmcgaXMgZmFsc2UgcG9zaXRpdmUgYW5kIG5lZWRzIHRvIGJlCisvLyBzdXBwcmVzc2VkLiBVc2UgdGhlIGZvbGxvd2luZyB0d28gbWFjcm9zIGluIHN1Y2ggY2FzZXM6CisvLworLy8gR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXygpCisvLyB3aGlsZSAodHJ1ZSkgeworLy8gR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QT1BfKCkKKy8vIH0KKyMgZGVmaW5lIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUFVTSF8oKSBcCisgICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDEyNykKKyMgZGVmaW5lIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUE9QXygpIFwKKyAgICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzIFN0cnVjdHVyZWQgRXhjZXB0aW9uCisvLyBIYW5kbGluZy4gIFRoaXMgaXMgc3VwcG9ydGVkIGJ5IHNldmVyYWwgV2luZG93cyBjb21waWxlcnMgYnV0IGdlbmVyYWxseQorLy8gZG9lcyBub3QgZXhpc3Qgb24gYW55IG90aGVyIHN5c3RlbS4KKyNpZm5kZWYgR1RFU1RfSEFTX1NFSAorLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KKworIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIFRoZXNlIHR3byBjb21waWxlcnMgYXJlIGtub3duIHRvIHN1cHBvcnQgU0VILgorIyAgZGVmaW5lIEdURVNUX0hBU19TRUggMQorIyBlbHNlCisvLyBBc3N1bWUgbm8gU0VILgorIyAgZGVmaW5lIEdURVNUX0hBU19TRUggMAorIyBlbmRpZgorCisjZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgXAorICAgIChHVEVTVF9IQVNfTVVURVhfQU5EX1RIUkVBRF9MT0NBTF8gXAorICAgICB8fCAoR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVCkgXAorICAgICB8fCBHVEVTVF9IQVNfUFRIUkVBRCkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyNpZmRlZiBfTVNDX1ZFUgorCisjIGlmIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQorIyAgZGVmaW5lIEdURVNUX0FQSV8gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjIGVsaWYgR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZCisjICBkZWZpbmUgR1RFU1RfQVBJXyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgZW5kaWYKKworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIEdURVNUX0FQSV8KKyMgZGVmaW5lIEdURVNUX0FQSV8KKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKy8vIEFzayB0aGUgY29tcGlsZXIgdG8gbmV2ZXIgaW5saW5lIGEgZ2l2ZW4gZnVuY3Rpb24uCisjIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfCisjZW5kaWYKKworLy8gX0xJQkNQUF9WRVJTSU9OIGlzIGRlZmluZWQgYnkgdGhlIGxpYmMrKyBsaWJyYXJ5IGZyb20gdGhlIExMVk0gcHJvamVjdC4KKyNpZiBkZWZpbmVkKF9fR0xJQkNYWF9fKSB8fCBkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikKKyMgZGVmaW5lIEdURVNUX0hBU19DWFhBQklfSF8gMQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0hBU19DWFhBQklfSF8gMAorI2VuZGlmCisKKy8vIEEgZnVuY3Rpb24gbGV2ZWwgYXR0cmlidXRlIHRvIGRpc2FibGUgY2hlY2tpbmcgZm9yIHVzZSBvZiB1bmluaXRpYWxpemVkCisvLyBtZW1vcnkgd2hlbiBidWlsdCB3aXRoIE1lbW9yeVNhbml0aXplci4KKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyMgaWYgX19oYXNfZmVhdHVyZShtZW1vcnlfc2FuaXRpemVyKQorIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9NRU1PUllfIFwKKyAgICAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV9tZW1vcnkpKQorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX01FTU9SWV8KKyMgZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUobWVtb3J5X3Nhbml0aXplcikKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXworI2VuZGlmICAvLyBfX2NsYW5nX18KKworLy8gQSBmdW5jdGlvbiBsZXZlbCBhdHRyaWJ1dGUgdG8gZGlzYWJsZSBBZGRyZXNzU2FuaXRpemVyIGluc3RydW1lbnRhdGlvbi4KKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyMgaWYgX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikKKyMgIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18gXAorICAgICAgIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX2FkZHJlc3MpKQorIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfCisjIGVuZGlmICAvLyBfX2hhc19mZWF0dXJlKGFkZHJlc3Nfc2FuaXRpemVyKQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXworI2VuZGlmICAvLyBfX2NsYW5nX18KKworLy8gQSBmdW5jdGlvbiBsZXZlbCBhdHRyaWJ1dGUgdG8gZGlzYWJsZSBUaHJlYWRTYW5pdGl6ZXIgaW5zdHJ1bWVudGF0aW9uLgorI2lmIGRlZmluZWQoX19jbGFuZ19fKQorIyBpZiBfX2hhc19mZWF0dXJlKHRocmVhZF9zYW5pdGl6ZXIpCisjICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX1RIUkVBRF8gXAorICAgICAgIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX3RocmVhZCkpCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXworIyBlbmRpZiAgLy8gX19oYXNfZmVhdHVyZSh0aHJlYWRfc2FuaXRpemVyKQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9USFJFQURfCisjZW5kaWYgIC8vIF9fY2xhbmdfXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1lc3NhZ2U7CisKKyNpZiBkZWZpbmVkKEdURVNUX1RVUExFX05BTUVTUEFDRV8pCisvLyBJbXBvcnQgdHVwbGUgYW5kIGZyaWVuZHMgaW50byB0aGUgOjp0ZXN0aW5nIG5hbWVzcGFjZS4KKy8vIEl0IGlzIHBhcnQgb2Ygb3VyIGludGVyZmFjZSwgaGF2aW5nIHRoZW0gaW4gOjp0ZXN0aW5nIGFsbG93cyB1cyB0byBjaGFuZ2UKKy8vIHRoZWlyIHR5cGVzIGFzIG5lZWRlZC4KK3VzaW5nIEdURVNUX1RVUExFX05BTUVTUEFDRV86OmdldDsKK3VzaW5nIEdURVNUX1RVUExFX05BTUVTUEFDRV86Om1ha2VfdHVwbGU7Cit1c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjp0dXBsZTsKK3VzaW5nIEdURVNUX1RVUExFX05BTUVTUEFDRV86OnR1cGxlX3NpemU7Cit1c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjp0dXBsZV9lbGVtZW50OworI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX1RVUExFX05BTUVTUEFDRV8pCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEEgc2VjcmV0IHR5cGUgdGhhdCBHb29nbGUgVGVzdCB1c2VycyBkb24ndCBrbm93IGFib3V0LiAgSXQgaGFzIG5vCisvLyBkZWZpbml0aW9uIG9uIHB1cnBvc2UuICBUaGVyZWZvcmUgaXQncyBpbXBvc3NpYmxlIHRvIGNyZWF0ZSBhCisvLyBTZWNyZXQgb2JqZWN0LCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuCitjbGFzcyBTZWNyZXQ7CisKKy8vIFRoZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8gbWFjcm8gY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBjb21waWxlIHRpbWUKKy8vIGV4cHJlc3Npb24gaXMgdHJ1ZS4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgaXQgdG8gdmVyaWZ5IHRoZQorLy8gc2l6ZSBvZiBhIHN0YXRpYyBhcnJheToKKy8vCisvLyAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhHVEVTVF9BUlJBWV9TSVpFXyhuYW1lcykgPT0gTlVNX05BTUVTLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfaW5jb3JyZWN0X3NpemUpOworLy8KKy8vIG9yIHRvIG1ha2Ugc3VyZSBhIHN0cnVjdCBpcyBzbWFsbGVyIHRoYW4gYSBjZXJ0YWluIHNpemU6CisvLworLy8gICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oc2l6ZW9mKGZvbykgPCAxMjgsIGZvb190b29fbGFyZ2UpOworLy8KKy8vIFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIG1hY3JvIGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gSWYKKy8vIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLCBtb3N0IGNvbXBpbGVycyB3aWxsIGlzc3VlIGEgd2FybmluZy9lcnJvcgorLy8gY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuCisKKyNpZiBHVEVTVF9MQU5HX0NYWDExCisjIGRlZmluZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZXhwciwgbXNnKSBzdGF0aWNfYXNzZXJ0KGV4cHIsICNtc2cpCisjZWxzZSAgLy8gIUdURVNUX0xBTkdfQ1hYMTEKK3RlbXBsYXRlIDxib29sPgorICBzdHJ1Y3QgQ29tcGlsZUFzc2VydCB7Cit9OworCisjIGRlZmluZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZXhwciwgbXNnKSBcCisgIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29tcGlsZUFzc2VydDwoc3RhdGljX2Nhc3Q8Ym9vbD4oZXhwcikpPiBcCisgICAgICBtc2dbc3RhdGljX2Nhc3Q8Ym9vbD4oZXhwcikgPyAxIDogLTFdIEdURVNUX0FUVFJJQlVURV9VTlVTRURfCisjZW5kaWYgIC8vICFHVEVTVF9MQU5HX0NYWDExCisKKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgR1RFU1RfQ09NUElMRV9BU1NFUlRfOgorLy8KKy8vIChJbiBDKysxMSwgd2Ugc2ltcGx5IHVzZSBzdGF0aWNfYXNzZXJ0IGluc3RlYWQgb2YgdGhlIGZvbGxvd2luZykKKy8vCisvLyAtIEdURVNUX0NPTVBJTEVfQVNTRVJUXyB3b3JrcyBieSBkZWZpbmluZyBhbiBhcnJheSB0eXBlIHRoYXQgaGFzIC0xCisvLyAgIGVsZW1lbnRzIChhbmQgdGh1cyBpcyBpbnZhbGlkKSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLgorLy8KKy8vIC0gVGhlIHNpbXBsZXIgZGVmaW5pdGlvbgorLy8KKy8vICAgICNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgdHlwZWRlZiBjaGFyIG1zZ1soZXhwcikgPyAxIDogLTFdCisvLworLy8gICBkb2VzIG5vdCB3b3JrLCBhcyBnY2Mgc3VwcG9ydHMgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyB3aG9zZSBzaXplcworLy8gICBhcmUgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSAodGhpcyBpcyBnY2MncyBleHRlbnNpb24gYW5kIG5vdCBwYXJ0CisvLyAgIG9mIHRoZSBDKysgc3RhbmRhcmQpLiAgQXMgYSByZXN1bHQsIGdjYyBmYWlscyB0byByZWplY3QgdGhlCisvLyAgIGZvbGxvd2luZyBjb2RlIHdpdGggdGhlIHNpbXBsZSBkZWZpbml0aW9uOgorLy8KKy8vICAgICBpbnQgZm9vOworLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhmb28sIG1zZyk7IC8vIG5vdCBzdXBwb3NlZCB0byBjb21waWxlIGFzIGZvbyBpcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KKy8vCisvLyAtIEJ5IHVzaW5nIHRoZSB0eXBlIENvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiwgd2UgZW5zdXJlcyB0aGF0CisvLyAgIGV4cHIgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuICAoVGVtcGxhdGUgYXJndW1lbnRzIG11c3QgYmUKKy8vICAgZGV0ZXJtaW5lZCBhdCBjb21waWxlLXRpbWUuKQorLy8KKy8vIC0gVGhlIG91dHRlciBwYXJlbnRoZXNlcyBpbiBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gYXJlIG5lY2Vzc2FyeQorLy8gICB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMy40LjQgYW5kIDQuMC4xLiAgSWYgd2UgaGFkIHdyaXR0ZW4KKy8vCisvLyAgICAgQ29tcGlsZUFzc2VydDxib29sKGV4cHIpPgorLy8KKy8vICAgaW5zdGVhZCwgdGhlc2UgY29tcGlsZXJzIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUKKy8vCisvLyAgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKDUgPiAwLCBzb21lX21lc3NhZ2UpOworLy8KKy8vICAgKFRoZXkgc2VlbSB0byB0aGluayB0aGUgIj4iIGluICI1ID4gMCIgbWFya3MgdGhlIGVuZCBvZiB0aGUKKy8vICAgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4pCisvLworLy8gLSBUaGUgYXJyYXkgc2l6ZSBpcyAoYm9vbChleHByKSA/IDEgOiAtMSksIGluc3RlYWQgb2Ygc2ltcGx5CisvLworLy8gICAgICgoZXhwcikgPyAxIDogLTEpLgorLy8KKy8vICAgVGhpcyBpcyB0byBhdm9pZCBydW5uaW5nIGludG8gYSBidWcgaW4gTVMgVkMgNy4xLCB3aGljaAorLy8gICBjYXVzZXMgKCgwLjApID8gMSA6IC0xKSB0byBpbmNvcnJlY3RseSBldmFsdWF0ZSB0byAxLgorCisvLyBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXIgaXMgdXNlZCBieSBTdGF0aWNBc3NlcnRUeXBlRXEgZGVmaW5lZCBpbiBndGVzdC5oLgorLy8KKy8vIFRoaXMgdGVtcGxhdGUgaXMgZGVjbGFyZWQsIGJ1dCBpbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VCwgVD4geworICBlbnVtIHsgdmFsdWUgPSB0cnVlIH07Cit9OworCisvLyBFdmFsdWF0ZXMgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiAnYXJyYXknLgorI2RlZmluZSBHVEVTVF9BUlJBWV9TSVpFXyhhcnJheSkgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK3R5cGVkZWYgOjpzdHJpbmcgc3RyaW5nOworI2Vsc2UKK3R5cGVkZWYgOjpzdGQ6OnN0cmluZyBzdHJpbmc7CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK3R5cGVkZWYgOjp3c3RyaW5nIHdzdHJpbmc7CisjZWxpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK3R5cGVkZWYgOjpzdGQ6OndzdHJpbmcgd3N0cmluZzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIEEgaGVscGVyIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiBjb25zdGFudCBjb25kaXRpb24uICBJdCBqdXN0CisvLyByZXR1cm5zICdjb25kaXRpb24nLgorR1RFU1RfQVBJXyBib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbik7CisKKy8vIERlZmluZXMgc2NvcGVkX3B0ci4KKworLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBzY29wZWRfcHRyIGlzIFBBUlRJQUwgLSBpdCBvbmx5IGNvbnRhaW5zCisvLyBlbm91Z2ggc3R1ZmYgdG8gc2F0aXNmeSBHb29nbGUgVGVzdCdzIG5lZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIHNjb3BlZF9wdHIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKKworICBleHBsaWNpdCBzY29wZWRfcHRyKFQqIHAgPSBOVUxMKSA6IHB0cl8ocCkge30KKyAgfnNjb3BlZF9wdHIoKSB7IHJlc2V0KCk7IH0KKworICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcHRyXzsgfQorICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQorICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisKKyAgVCogcmVsZWFzZSgpIHsKKyAgICBUKiBjb25zdCBwdHIgPSBwdHJfOworICAgIHB0cl8gPSBOVUxMOworICAgIHJldHVybiBwdHI7CisgIH0KKworICB2b2lkIHJlc2V0KFQqIHAgPSBOVUxMKSB7CisgICAgaWYgKHAgIT0gcHRyXykgeworICAgICAgaWYgKElzVHJ1ZShzaXplb2YoVCkgPiAwKSkgeyAgLy8gTWFrZXMgc3VyZSBUIGlzIGEgY29tcGxldGUgdHlwZS4KKyAgICAgICAgZGVsZXRlIHB0cl87CisgICAgICB9CisgICAgICBwdHJfID0gcDsKKyAgICB9CisgIH0KKworICBmcmllbmQgdm9pZCBzd2FwKHNjb3BlZF9wdHImIGEsIHNjb3BlZF9wdHImIGIpIHsKKyAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgc3dhcChhLnB0cl8sIGIucHRyXyk7CisgIH0KKworIHByaXZhdGU6CisgIFQqIHB0cl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhzY29wZWRfcHRyKTsKK307CisKKy8vIERlZmluZXMgUkUuCisKKy8vIEEgc2ltcGxlIEMrKyB3cmFwcGVyIGZvciA8cmVnZXguaD4uICBJdCB1c2VzIHRoZSBQT1NJWCBFeHRlbmRlZAorLy8gUmVndWxhciBFeHByZXNzaW9uIHN5bnRheC4KK2NsYXNzIEdURVNUX0FQSV8gUkUgeworIHB1YmxpYzoKKyAgLy8gQSBjb3B5IGNvbnN0cnVjdG9yIGlzIHJlcXVpcmVkIGJ5IHRoZSBTdGFuZGFyZCB0byBpbml0aWFsaXplIG9iamVjdAorICAvLyByZWZlcmVuY2VzIGZyb20gci12YWx1ZXMuCisgIFJFKGNvbnN0IFJFJiBvdGhlcikgeyBJbml0KG90aGVyLnBhdHRlcm4oKSk7IH0KKworICAvLyBDb25zdHJ1Y3RzIGFuIFJFIGZyb20gYSBzdHJpbmcuCisgIFJFKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHJlZ2V4KSB7IEluaXQocmVnZXguY19zdHIoKSk7IH0gIC8vIE5PTElOVAorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBSRShjb25zdCA6OnN0cmluZyYgcmVnZXgpIHsgSW5pdChyZWdleC5jX3N0cigpKTsgfSAgLy8gTk9MSU5UCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBSRShjb25zdCBjaGFyKiByZWdleCkgeyBJbml0KHJlZ2V4KTsgfSAgLy8gTk9MSU5UCisgIH5SRSgpOworCisgIC8vIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVnZXguCisgIGNvbnN0IGNoYXIqIHBhdHRlcm4oKSBjb25zdCB7IHJldHVybiBwYXR0ZXJuXzsgfQorCisgIC8vIEZ1bGxNYXRjaChzdHIsIHJlKSByZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzCisgIC8vIHRoZSBlbnRpcmUgc3RyLgorICAvLyBQYXJ0aWFsTWF0Y2goc3RyLCByZSkgcmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUKKyAgLy8gbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIgKGluY2x1ZGluZyBzdHIgaXRzZWxmKS4KKyAgLy8KKyAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG1ha2UgRnVsbE1hdGNoKCkgYW5kIFBhcnRpYWxNYXRjaCgpIHdvcmsKKyAgLy8gd2hlbiBzdHIgY29udGFpbnMgTlVMIGNoYXJhY3RlcnMuCisgIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgeworICAgIHJldHVybiBGdWxsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKKyAgfQorICBzdGF0aWMgYm9vbCBQYXJ0aWFsTWF0Y2goY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gUGFydGlhbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgeworICAgIHJldHVybiBGdWxsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKKyAgfQorICBzdGF0aWMgYm9vbCBQYXJ0aWFsTWF0Y2goY29uc3QgOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIFBhcnRpYWxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpOworICBzdGF0aWMgYm9vbCBQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpOworCisgcHJpdmF0ZToKKyAgdm9pZCBJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KTsKKworICAvLyBXZSB1c2UgYSBjb25zdCBjaGFyKiBpbnN0ZWFkIG9mIGFuIHN0ZDo6c3RyaW5nLCBhcyBHb29nbGUgVGVzdCB1c2VkIHRvIGJlCisgIC8vIHVzZWQgd2hlcmUgc3RkOjpzdHJpbmcgaXMgbm90IGF2YWlsYWJsZS4gIFRPRE8od2FuQGdvb2dsZS5jb20pOiBjaGFuZ2UgdG8KKyAgLy8gc3RkOjpzdHJpbmcuCisgIGNvbnN0IGNoYXIqIHBhdHRlcm5fOworICBib29sIGlzX3ZhbGlkXzsKKworI2lmIEdURVNUX1VTRVNfUE9TSVhfUkUKKworICByZWdleF90IGZ1bGxfcmVnZXhfOyAgICAgLy8gRm9yIEZ1bGxNYXRjaCgpLgorICByZWdleF90IHBhcnRpYWxfcmVnZXhfOyAgLy8gRm9yIFBhcnRpYWxNYXRjaCgpLgorCisjZWxzZSAgLy8gR1RFU1RfVVNFU19TSU1QTEVfUkUKKworICBjb25zdCBjaGFyKiBmdWxsX3BhdHRlcm5fOyAgLy8gRm9yIEZ1bGxNYXRjaCgpOworCisjZW5kaWYKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJFKTsKK307CisKKy8vIEZvcm1hdHMgYSBzb3VyY2UgZmlsZSBwYXRoIGFuZCBhIGxpbmUgbnVtYmVyIGFzIHRoZXkgd291bGQgYXBwZWFyCisvLyBpbiBhbiBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSB0aGlzIGNvZGUuCitHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKKworLy8gRm9ybWF0cyBhIGZpbGUgbG9jYXRpb24gZm9yIGNvbXBpbGVyLWluZGVwZW5kZW50IFhNTCBvdXRwdXQuCisvLyBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBwbGF0Zm9ybSBkZXBlbmRlbnQsIHdlIHB1dCBpdCBuZXh0IHRvCisvLyBGb3JtYXRGaWxlTG9jYXRpb24gaW4gb3JkZXIgdG8gY29udHJhc3QgdGhlIHR3byBmdW5jdGlvbnMuCitHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbihjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpOworCisvLyBEZWZpbmVzIGxvZ2dpbmcgdXRpbGl0aWVzOgorLy8gICBHVEVTVF9MT0dfKHNldmVyaXR5KSAtIGxvZ3MgbWVzc2FnZXMgYXQgdGhlIHNwZWNpZmllZCBzZXZlcml0eSBsZXZlbC4gVGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBpdHNlbGYgaXMgc3RyZWFtZWQgaW50byB0aGUgbWFjcm8uCisvLyAgIExvZ1RvU3RkZXJyKCkgIC0gZGlyZWN0cyBhbGwgbG9nIG1lc3NhZ2VzIHRvIHN0ZGVyci4KKy8vICAgRmx1c2hJbmZvTG9nKCkgLSBmbHVzaGVzIGluZm9ybWF0aW9uYWwgbG9nIG1lc3NhZ2VzLgorCitlbnVtIEdUZXN0TG9nU2V2ZXJpdHkgeworICBHVEVTVF9JTkZPLAorICBHVEVTVF9XQVJOSU5HLAorICBHVEVTVF9FUlJPUiwKKyAgR1RFU1RfRkFUQUwKK307CisKKy8vIEZvcm1hdHMgbG9nIGVudHJ5IHNldmVyaXR5LCBwcm92aWRlcyBhIHN0cmVhbSBvYmplY3QgZm9yIHN0cmVhbWluZyB0aGUKKy8vIGxvZyBtZXNzYWdlLCBhbmQgdGVybWluYXRlcyB0aGUgbWVzc2FnZSB3aXRoIGEgbmV3bGluZSB3aGVuIGdvaW5nIG91dCBvZgorLy8gc2NvcGUuCitjbGFzcyBHVEVTVF9BUElfIEdUZXN0TG9nIHsKKyBwdWJsaWM6CisgIEdUZXN0TG9nKEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKKworICAvLyBGbHVzaGVzIHRoZSBidWZmZXJzIGFuZCwgaWYgc2V2ZXJpdHkgaXMgR1RFU1RfRkFUQUwsIGFib3J0cyB0aGUgcHJvZ3JhbS4KKyAgfkdUZXN0TG9nKCk7CisKKyAgOjpzdGQ6Om9zdHJlYW0mIEdldFN0cmVhbSgpIHsgcmV0dXJuIDo6c3RkOjpjZXJyOyB9CisKKyBwcml2YXRlOgorICBjb25zdCBHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEdUZXN0TG9nKTsKK307CisKKyNpZiAhZGVmaW5lZChHVEVTVF9MT0dfKQorCisjIGRlZmluZSBHVEVTVF9MT0dfKHNldmVyaXR5KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RMb2coOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1RFU1RfIyNzZXZlcml0eSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykuR2V0U3RyZWFtKCkKKworaW5saW5lIHZvaWQgTG9nVG9TdGRlcnIoKSB7fQoraW5saW5lIHZvaWQgRmx1c2hJbmZvTG9nKCkgeyBmZmx1c2goTlVMTCk7IH0KKworI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9MT0dfKQorCisjaWYgIWRlZmluZWQoR1RFU1RfQ0hFQ0tfKQorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFLgorLy8KKy8vIEdURVNUX0NIRUNLXyBpcyBhbiBhbGwtbW9kZSBhc3NlcnQuIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgY29uZGl0aW9uCisvLyBpcyBub3Qgc2F0aXNmaWVkLgorLy8gIFN5bm9wc3lzOgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKTsKKy8vICAgICBvcgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKSA8PCAiQWRkaXRpb25hbCBtZXNzYWdlIjsKKy8vCisvLyAgICBUaGlzIGNoZWNrcyB0aGUgY29uZGl0aW9uIGFuZCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKKy8vICAgIGl0IHByaW50cyBtZXNzYWdlIGFib3V0IHRoZSBjb25kaXRpb24gdmlvbGF0aW9uLCBpbmNsdWRpbmcgdGhlCisvLyAgICBjb25kaXRpb24gaXRzZWxmLCBwbHVzIGFkZGl0aW9uYWwgbWVzc2FnZSBzdHJlYW1lZCBpbnRvIGl0LCBpZiBhbnksCisvLyAgICBhbmQgdGhlbiBpdCBhYm9ydHMgdGhlIHByb2dyYW0uIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpcnJlc3BlY3RpdmUgb2YKKy8vICAgIHdoZXRoZXIgaXQgaXMgYnVpbHQgaW4gdGhlIGRlYnVnIG1vZGUgb3Igbm90LgorIyBkZWZpbmUgR1RFU1RfQ0hFQ0tfKGNvbmRpdGlvbikgXAorICAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGNvbmRpdGlvbikpIFwKKyAgICAgIDsgXAorICAgIGVsc2UgXAorICAgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkNvbmRpdGlvbiAiICNjb25kaXRpb24gIiBmYWlsZWQuICIKKyNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfQ0hFQ0tfKQorCisvLyBBbiBhbGwtbW9kZSBhc3NlcnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFBPU0lYLXN0eWxlIGZ1bmN0aW9uCisvLyBjYWxsIHJldHVybnMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKS4gIEtub3duIGxpbWl0YXRpb246IHRoaXMKKy8vIGRvZXNuJ3QgZXhwYW5kIHRvIGEgYmFsYW5jZWQgJ2lmJyBzdGF0ZW1lbnQsIHNvIGVuY2xvc2UgdGhlIG1hY3JvCisvLyBpbiB7fSBpZiB5b3UgbmVlZCB0byB1c2UgaXQgYXMgdGhlIG9ubHkgc3RhdGVtZW50IGluIGFuICdpZicKKy8vIGJyYW5jaC4KKyNkZWZpbmUgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocG9zaXhfY2FsbCkgXAorICBpZiAoY29uc3QgaW50IGd0ZXN0X2Vycm9yID0gKHBvc2l4X2NhbGwpKSBcCisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgI3Bvc2l4X2NhbGwgPDwgImZhaWxlZCB3aXRoIGVycm9yICIgXAorICAgICAgICAgICAgICAgICAgICAgIDw8IGd0ZXN0X2Vycm9yCisKKyNpZiBHVEVTVF9IQVNfU1REX01PVkVfCit1c2luZyBzdGQ6Om1vdmU7CisjZWxzZSAgLy8gR1RFU1RfSEFTX1NURF9NT1ZFXwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citjb25zdCBUJiBtb3ZlKGNvbnN0IFQmIHQpIHsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfTU9WRV8KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBVc2UgSW1wbGljaXRDYXN0XyBhcyBhIHNhZmUgdmVyc2lvbiBvZiBzdGF0aWNfY2FzdCBmb3IgdXBjYXN0aW5nIGluCisvLyB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4gY2FzdGluZyBhIEZvbyogdG8gYSBTdXBlcmNsYXNzT2ZGb28qIG9yIGEKKy8vIGNvbnN0IEZvbyopLiAgV2hlbiB5b3UgdXNlIEltcGxpY2l0Q2FzdF8sIHRoZSBjb21waWxlciBjaGVja3MgdGhhdAorLy8gdGhlIGNhc3QgaXMgc2FmZS4gIFN1Y2ggZXhwbGljaXQgSW1wbGljaXRDYXN0X3MgYXJlIG5lY2Vzc2FyeSBpbgorLy8gc3VycHJpc2luZ2x5IG1hbnkgc2l0dWF0aW9ucyB3aGVyZSBDKysgZGVtYW5kcyBhbiBleGFjdCB0eXBlIG1hdGNoCisvLyBpbnN0ZWFkIG9mIGFuIGFyZ3VtZW50IHR5cGUgY29udmVydGFibGUgdG8gYSB0YXJnZXQgdHlwZS4KKy8vCisvLyBUaGUgc3ludGF4IGZvciB1c2luZyBJbXBsaWNpdENhc3RfIGlzIHRoZSBzYW1lIGFzIGZvciBzdGF0aWNfY2FzdDoKKy8vCisvLyAgIEltcGxpY2l0Q2FzdF88VG9UeXBlPihleHByKQorLy8KKy8vIEltcGxpY2l0Q2FzdF8gd291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5LAorLy8gYnV0IHRoZSBwcm9wb3NhbCB3YXMgc3VibWl0dGVkIHRvbyBsYXRlLiAgSXQgd2lsbCBwcm9iYWJseSBtYWtlCisvLyBpdHMgd2F5IGludG8gdGhlIGxhbmd1YWdlIGluIHRoZSBmdXR1cmUuCisvLworLy8gVGhpcyByZWxhdGl2ZWx5IHVnbHkgbmFtZSBpcyBpbnRlbnRpb25hbC4gSXQgcHJldmVudHMgY2xhc2hlcyB3aXRoCisvLyBzaW1pbGFyIGZ1bmN0aW9ucyB1c2VycyBtYXkgaGF2ZSAoZS5nLiwgaW1wbGljaXRfY2FzdCkuIFRoZSBpbnRlcm5hbAorLy8gbmFtZXNwYWNlIGFsb25lIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGJ5IEFETC4KK3RlbXBsYXRlPHR5cGVuYW1lIFRvPgoraW5saW5lIFRvIEltcGxpY2l0Q2FzdF8oVG8geCkgeyByZXR1cm4geDsgfQorCisvLyBXaGVuIHlvdSB1cGNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20gdHlwZSBGb28gdG8gdHlwZQorLy8gU3VwZXJjbGFzc09mRm9vKSwgaXQncyBmaW5lIHRvIHVzZSBJbXBsaWNpdENhc3RfPD4sIHNpbmNlIHVwY2FzdHMKKy8vIGFsd2F5cyBzdWNjZWVkLiAgV2hlbiB5b3UgZG93bmNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20KKy8vIHR5cGUgRm9vIHRvIHR5cGUgU3ViY2xhc3NPZkZvbyksIHN0YXRpY19jYXN0PD4gaXNuJ3Qgc2FmZSwgYmVjYXVzZQorLy8gaG93IGRvIHlvdSBrbm93IHRoZSBwb2ludGVyIGlzIHJlYWxseSBvZiB0eXBlIFN1YmNsYXNzT2ZGb28/ICBJdAorLy8gY291bGQgYmUgYSBiYXJlIEZvbywgb3Igb2YgdHlwZSBEaWZmZXJlbnRTdWJjbGFzc09mRm9vLiAgVGh1cywKKy8vIHdoZW4geW91IGRvd25jYXN0LCB5b3Ugc2hvdWxkIHVzZSB0aGlzIG1hY3JvLiAgSW4gZGVidWcgbW9kZSwgd2UKKy8vIHVzZSBkeW5hbWljX2Nhc3Q8PiB0byBkb3VibGUtY2hlY2sgdGhlIGRvd25jYXN0IGlzIGxlZ2FsICh3ZSBkaWUKKy8vIGlmIGl0J3Mgbm90KS4gIEluIG5vcm1hbCBtb2RlLCB3ZSBkbyB0aGUgZWZmaWNpZW50IHN0YXRpY19jYXN0PD4KKy8vIGluc3RlYWQuICBUaHVzLCBpdCdzIGltcG9ydGFudCB0byB0ZXN0IGluIGRlYnVnIG1vZGUgdG8gbWFrZSBzdXJlCisvLyB0aGUgY2FzdCBpcyBsZWdhbCEKKy8vICAgIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgaW4gdGhlIGNvZGUgd2Ugc2hvdWxkIHVzZSBkeW5hbWljX2Nhc3Q8Pi4KKy8vIEluIHBhcnRpY3VsYXIsIHlvdSBTSE9VTEROJ1QgYmUgdXNpbmcgZHluYW1pY19jYXN0PD4gaW4gb3JkZXIgdG8KKy8vIGRvIFJUVEkgKGVnIGNvZGUgbGlrZSB0aGlzOgorLy8gICAgaWYgKGR5bmFtaWNfY2FzdDxTdWJjbGFzczE+KGZvbykpIEhhbmRsZUFTdWJjbGFzczFPYmplY3QoZm9vKTsKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MyPihmb28pKSBIYW5kbGVBU3ViY2xhc3MyT2JqZWN0KGZvbyk7CisvLyBZb3Ugc2hvdWxkIGRlc2lnbiB0aGUgY29kZSBzb21lIG90aGVyIHdheSBub3QgdG8gbmVlZCB0aGlzLgorLy8KKy8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAorLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGRvd25fY2FzdCkuIFRoZSBpbnRlcm5hbAorLy8gbmFtZXNwYWNlIGFsb25lIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGJ5IEFETC4KK3RlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiAgLy8gdXNlIGxpa2UgdGhpczogRG93bkNhc3RfPFQqPihmb28pOworaW5saW5lIFRvIERvd25DYXN0XyhGcm9tKiBmKSB7ICAvLyBzbyB3ZSBvbmx5IGFjY2VwdCBwb2ludGVycworICAvLyBFbnN1cmVzIHRoYXQgVG8gaXMgYSBzdWItdHlwZSBvZiBGcm9tICouICBUaGlzIHRlc3QgaXMgaGVyZSBvbmx5CisgIC8vIGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZywgYW5kIGhhcyBubyBvdmVyaGVhZCBpbiBhbgorICAvLyBvcHRpbWl6ZWQgYnVpbGQgYXQgcnVuLXRpbWUsIGFzIGl0IHdpbGwgYmUgb3B0aW1pemVkIGF3YXkKKyAgLy8gY29tcGxldGVseS4KKyAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXygpCisgIGlmIChmYWxzZSkgeworICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKQorICAgIGNvbnN0IFRvIHRvID0gTlVMTDsKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEZyb20qPih0byk7CisgIH0KKworI2lmIEdURVNUX0hBU19SVFRJCisgIC8vIFJUVEk6IGRlYnVnIG1vZGUgb25seSEKKyAgR1RFU1RfQ0hFQ0tfKGYgPT0gTlVMTCB8fCBkeW5hbWljX2Nhc3Q8VG8+KGYpICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBzdGF0aWNfY2FzdDxUbz4oZik7Cit9CisKKy8vIERvd25jYXN0cyB0aGUgcG9pbnRlciBvZiB0eXBlIEJhc2UgdG8gRGVyaXZlZC4KKy8vIERlcml2ZWQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEJhc2UuIFRoZSBwYXJhbWV0ZXIgTVVTVAorLy8gcG9pbnQgdG8gYSBjbGFzcyBvZiB0eXBlIERlcml2ZWQsIG5vdCBhbnkgc3ViY2xhc3Mgb2YgaXQuCisvLyBXaGVuIFJUVEkgaXMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgYSBydW50aW1lCisvLyBjaGVjayB0byBlbmZvcmNlIHRoaXMuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgQmFzZT4KK0Rlcml2ZWQqIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZShCYXNlKiBiYXNlKSB7CisjaWYgR1RFU1RfSEFTX1JUVEkKKyAgR1RFU1RfQ0hFQ0tfKHR5cGVpZCgqYmFzZSkgPT0gdHlwZWlkKERlcml2ZWQpKTsKKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX0RPV05DQVNUXworICByZXR1cm4gOjpkb3duX2Nhc3Q8RGVyaXZlZCo+KGJhc2UpOworI2VsaWYgR1RFU1RfSEFTX1JUVEkKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBOT0xJTlQKKyNlbHNlCisgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBQb29yIG1hbidzIGRvd25jYXN0LgorI2VuZGlmCit9CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIERlZmluZXMgdGhlIHN0ZGVyciBjYXB0dXJlcjoKKy8vICAgQ2FwdHVyZVN0ZG91dCAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KKy8vICAgR2V0Q2FwdHVyZWRTdGRvdXQgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCisvLyAgIENhcHR1cmVTdGRlcnIgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCisvLyAgIEdldENhcHR1cmVkU3RkZXJyIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorLy8KK0dURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3Rkb3V0KCk7CitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCk7CitHVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZGVycigpOworR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKworLy8gUmV0dXJucyBhIHBhdGggdG8gdGVtcG9yYXJ5IGRpcmVjdG9yeS4KK0dURVNUX0FQSV8gc3RkOjpzdHJpbmcgVGVtcERpcigpOworCisvLyBSZXR1cm5zIHRoZSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlLgorR1RFU1RfQVBJXyBzaXplX3QgR2V0RmlsZVNpemUoRklMRSogZmlsZSk7CisKKy8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGZpbGUgYXMgYSBzdHJpbmcuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpOworCisvLyBBbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK0dURVNUX0FQSV8gY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0QXJndnMoKTsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKK2NvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEluamVjdGFibGVBcmd2cygpOwordm9pZCBTZXRJbmplY3RhYmxlQXJndnMoY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FyZ3ZzKTsKKworCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIERlZmluZXMgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorIyBpZiBHVEVTVF9IQVNfUFRIUkVBRAorLy8gU2xlZXBzIGZvciAocm91Z2hseSkgbiBtaWxsaXNlY29uZHMuICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIHRlc3RpbmcKKy8vIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuICBEb24ndCB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyCisvLyBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgoraW5saW5lIHZvaWQgU2xlZXBNaWxsaXNlY29uZHMoaW50IG4pIHsKKyAgY29uc3QgdGltZXNwZWMgdGltZSA9IHsKKyAgICAwLCAgICAgICAgICAgICAgICAgIC8vIDAgc2Vjb25kcy4KKyAgICBuICogMTAwMEwgKiAxMDAwTCwgIC8vIEFuZCBuIG1zLgorICB9OworICBuYW5vc2xlZXAoJnRpbWUsIE5VTEwpOworfQorIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworIyBpZiBHVEVTVF9IQVNfTk9USUZJQ0FUSU9OXworLy8gTm90aWZpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgbmFtZXNwYWNlLgorLy8gTm90aGluZyB0byBkbyBoZXJlLgorCisjIGVsaWYgR1RFU1RfSEFTX1BUSFJFQUQKKy8vIEFsbG93cyBhIGNvbnRyb2xsZXIgdGhyZWFkIHRvIHBhdXNlIGV4ZWN1dGlvbiBvZiBuZXdseSBjcmVhdGVkCisvLyB0aHJlYWRzIHVudGlsIG5vdGlmaWVkLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjcmVhdGVkCisvLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8gbm90CisvLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitjbGFzcyBOb3RpZmljYXRpb24geworIHB1YmxpYzoKKyAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOworICB9CisgIH5Ob3RpZmljYXRpb24oKSB7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pOworICB9CisKKyAgLy8gTm90aWZpZXMgYWxsIHRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uIHRvIHN0YXJ0LiBNdXN0CisgIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKyAgdm9pZCBOb3RpZnkoKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOworICAgIG5vdGlmaWVkXyA9IHRydWU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7CisgIH0KKworICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdAorICAvLyB0aHJlYWQuCisgIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7CisgICAgICBjb25zdCBib29sIG5vdGlmaWVkID0gbm90aWZpZWRfOworICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7CisgICAgICBpZiAobm90aWZpZWQpCisgICAgICAgIGJyZWFrOworICAgICAgU2xlZXBNaWxsaXNlY29uZHMoMTApOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKKyAgYm9vbCBub3RpZmllZF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOworfTsKKworIyBlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKKworR1RFU1RfQVBJXyB2b2lkIFNsZWVwTWlsbGlzZWNvbmRzKGludCBuKTsKKworLy8gUHJvdmlkZXMgbGVhay1zYWZlIFdpbmRvd3Mga2VybmVsIGhhbmRsZSBvd25lcnNoaXAuCisvLyBVc2VkIGluIGRlYXRoIHRlc3RzIGFuZCBpbiB0aHJlYWRpbmcgc3VwcG9ydC4KK2NsYXNzIEdURVNUX0FQSV8gQXV0b0hhbmRsZSB7CisgcHVibGljOgorICAvLyBBc3N1bWUgdGhhdCBXaW4zMiBIQU5ETEUgdHlwZSBpcyBlcXVpdmFsZW50IHRvIHZvaWQqLiBEb2luZyBzbyBhbGxvd3MgdXMgdG8KKyAgLy8gYXZvaWQgaW5jbHVkaW5nIDx3aW5kb3dzLmg+IGluIHRoaXMgaGVhZGVyIGZpbGUuIEluY2x1ZGluZyA8d2luZG93cy5oPiBpcworICAvLyB1bmRlc2lyYWJsZSBiZWNhdXNlIGl0IGRlZmluZXMgYSBsb3Qgb2Ygc3ltYm9scyBhbmQgbWFjcm9zIHRoYXQgdGVuZCB0bworICAvLyBjb25mbGljdCB3aXRoIGNsaWVudCBjb2RlLiBUaGlzIGFzc3VtcHRpb24gaXMgdmVyaWZpZWQgYnkKKyAgLy8gV2luZG93c1R5cGVzVGVzdC5IQU5ETEVJc1ZvaWRTdGFyLgorICB0eXBlZGVmIHZvaWQqIEhhbmRsZTsKKyAgQXV0b0hhbmRsZSgpOworICBleHBsaWNpdCBBdXRvSGFuZGxlKEhhbmRsZSBoYW5kbGUpOworCisgIH5BdXRvSGFuZGxlKCk7CisKKyAgSGFuZGxlIEdldCgpIGNvbnN0OworICB2b2lkIFJlc2V0KCk7CisgIHZvaWQgUmVzZXQoSGFuZGxlIGhhbmRsZSk7CisKKyBwcml2YXRlOgorICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBoYW5kbGUgaXMgYSB2YWxpZCBoYW5kbGUgb2JqZWN0IHRoYXQgY2FuIGJlIGNsb3NlZC4KKyAgYm9vbCBJc0Nsb3NlYWJsZSgpIGNvbnN0OworCisgIEhhbmRsZSBoYW5kbGVfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXV0b0hhbmRsZSk7Cit9OworCisvLyBBbGxvd3MgYSBjb250cm9sbGVyIHRocmVhZCB0byBwYXVzZSBleGVjdXRpb24gb2YgbmV3bHkgY3JlYXRlZAorLy8gdGhyZWFkcyB1bnRpbCBub3RpZmllZC4gIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG11c3QgYmUgY3JlYXRlZAorLy8gYW5kIGRlc3Ryb3llZCBpbiB0aGUgY29udHJvbGxlciB0aHJlYWQuCisvLworLy8gVGhpcyBjbGFzcyBpcyBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvIG5vdAorLy8gdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgorY2xhc3MgR1RFU1RfQVBJXyBOb3RpZmljYXRpb24geworIHB1YmxpYzoKKyAgTm90aWZpY2F0aW9uKCk7CisgIHZvaWQgTm90aWZ5KCk7CisgIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpOworCisgcHJpdmF0ZToKKyAgQXV0b0hhbmRsZSBldmVudF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOworfTsKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19OT1RJRklDQVRJT05fCisKKy8vIE9uIE1pbkdXLCB3ZSBjYW4gaGF2ZSBib3RoIEdURVNUX09TX1dJTkRPV1MgYW5kIEdURVNUX0hBU19QVEhSRUFECisvLyBkZWZpbmVkLCBidXQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgTWluR1cncyBwdGhyZWFkcyBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKKy8vIGhhcyBjb25mb3JtYW5jZSBwcm9ibGVtcyB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgdGhlIFBPU0lYIHN0YW5kYXJkLgorIyBpZiBHVEVTVF9IQVNfUFRIUkVBRCAmJiAhR1RFU1RfT1NfV0lORE9XU19NSU5HVworCisvLyBBcyBhIEMtZnVuY3Rpb24sIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UgY2Fubm90IGJlIHRlbXBsYXRlZCBpdHNlbGYuCisvLyBDb25zZXF1ZW50bHksIGl0IGNhbm5vdCBzZWxlY3QgYSBjb3JyZWN0IGluc3RhbnRpYXRpb24gb2YgVGhyZWFkV2l0aFBhcmFtCisvLyBpbiBvcmRlciB0byBjYWxsIGl0cyBSdW4oKS4gSW50cm9kdWNpbmcgVGhyZWFkV2l0aFBhcmFtQmFzZSBhcyBhCisvLyBub24tdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIFRocmVhZFdpdGhQYXJhbSBhbGxvd3MgdXMgdG8gYnlwYXNzIHRoaXMKKy8vIHByb2JsZW0uCitjbGFzcyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbUJhc2UoKSB7fQorICB2aXJ0dWFsIHZvaWQgUnVuKCkgPSAwOworfTsKKworLy8gcHRocmVhZF9jcmVhdGUoKSBhY2NlcHRzIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHR5cGUgd2l0aCB0aGUgQyBsaW5rYWdlLgorLy8gQWNjb3JkaW5nIHRvIHRoZSBTdGFuZGFyZCAoNy41LzEpLCBmdW5jdGlvbiB0eXBlcyB3aXRoIGRpZmZlcmVudCBsaW5rYWdlcworLy8gYXJlIGRpZmZlcmVudCBldmVuIGlmIHRoZXkgYXJlIG90aGVyd2lzZSBpZGVudGljYWwuICBTb21lIGNvbXBpbGVycyAoZm9yCisvLyBleGFtcGxlLCBTdW5TdHVkaW8pIHRyZWF0IHRoZW0gYXMgZGlmZmVyZW50IHR5cGVzLiAgU2luY2UgY2xhc3MgbWV0aG9kcworLy8gY2Fubm90IGJlIGRlZmluZWQgd2l0aCBDLWxpbmthZ2Ugd2UgbmVlZCB0byBkZWZpbmUgYSBmcmVlIEMtZnVuY3Rpb24gdG8KKy8vIHBhc3MgaW50byBwdGhyZWFkX2NyZWF0ZSgpLgorZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCogVGhyZWFkRnVuY1dpdGhDTGlua2FnZSh2b2lkKiB0aHJlYWQpIHsKKyAgc3RhdGljX2Nhc3Q8VGhyZWFkV2l0aFBhcmFtQmFzZSo+KHRocmVhZCktPlJ1bigpOworICByZXR1cm4gTlVMTDsKK30KKworLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3MgbXVsdGktdGhyZWFkaW5nIGNvbnN0cnVjdHMuCisvLyBUbyB1c2UgaXQsIHdyaXRlOgorLy8KKy8vICAgdm9pZCBUaHJlYWRGdW5jKGludCBwYXJhbSkgeyAvKiBEbyB0aGluZ3Mgd2l0aCBwYXJhbSAqLyB9CisvLyAgIE5vdGlmaWNhdGlvbiB0aHJlYWRfY2FuX3N0YXJ0OworLy8gICAuLi4KKy8vICAgLy8gVGhlIHRocmVhZF9jYW5fc3RhcnQgcGFyYW1ldGVyIGlzIG9wdGlvbmFsOyB5b3UgY2FuIHN1cHBseSBOVUxMLgorLy8gICBUaHJlYWRXaXRoUGFyYW08aW50PiB0aHJlYWQoJlRocmVhZEZ1bmMsIDUsICZ0aHJlYWRfY2FuX3N0YXJ0KTsKKy8vICAgdGhyZWFkX2Nhbl9zdGFydC5Ob3RpZnkoKTsKKy8vCisvLyBUaGVzZSBjbGFzc2VzIGFyZSBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvCisvLyBub3QgdXNlIHRoZW0gaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZFdpdGhQYXJhbSA6IHB1YmxpYyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCBVc2VyVGhyZWFkRnVuYyhUKTsKKworICBUaHJlYWRXaXRoUGFyYW0oVXNlclRocmVhZEZ1bmMqIGZ1bmMsIFQgcGFyYW0sIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKKyAgICAgIDogZnVuY18oZnVuYyksCisgICAgICAgIHBhcmFtXyhwYXJhbSksCisgICAgICAgIHRocmVhZF9jYW5fc3RhcnRfKHRocmVhZF9jYW5fc3RhcnQpLAorICAgICAgICBmaW5pc2hlZF8oZmFsc2UpIHsKKyAgICBUaHJlYWRXaXRoUGFyYW1CYXNlKiBjb25zdCBiYXNlID0gdGhpczsKKyAgICAvLyBUaGUgdGhyZWFkIGNhbiBiZSBjcmVhdGVkIG9ubHkgYWZ0ZXIgYWxsIGZpZWxkcyBleGNlcHQgdGhyZWFkXworICAgIC8vIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXygKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZF8sIDAsICZUaHJlYWRGdW5jV2l0aENMaW5rYWdlLCBiYXNlKSk7CisgIH0KKyAgflRocmVhZFdpdGhQYXJhbSgpIHsgSm9pbigpOyB9CisKKyAgdm9pZCBKb2luKCkgeworICAgIGlmICghZmluaXNoZWRfKSB7CisgICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX2pvaW4odGhyZWFkXywgMCkpOworICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHZvaWQgUnVuKCkgeworICAgIGlmICh0aHJlYWRfY2FuX3N0YXJ0XyAhPSBOVUxMKQorICAgICAgdGhyZWFkX2Nhbl9zdGFydF8tPldhaXRGb3JOb3RpZmljYXRpb24oKTsKKyAgICBmdW5jXyhwYXJhbV8pOworICB9CisKKyBwcml2YXRlOgorICBVc2VyVGhyZWFkRnVuYyogY29uc3QgZnVuY187ICAvLyBVc2VyLXN1cHBsaWVkIHRocmVhZCBmdW5jdGlvbi4KKyAgY29uc3QgVCBwYXJhbV87ICAvLyBVc2VyLXN1cHBsaWVkIHBhcmFtZXRlciB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorICAvLyBXaGVuIG5vbi1OVUxMLCB1c2VkIHRvIGJsb2NrIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY29udHJvbGxlciB0aHJlYWQKKyAgLy8gbm90aWZpZXMuCisgIE5vdGlmaWNhdGlvbiogY29uc3QgdGhyZWFkX2Nhbl9zdGFydF87CisgIGJvb2wgZmluaXNoZWRfOyAgLy8gdHJ1ZSBpZmYgd2Uga25vdyB0aGF0IHRoZSB0aHJlYWQgZnVuY3Rpb24gaGFzIGZpbmlzaGVkLgorICBwdGhyZWFkX3QgdGhyZWFkXzsgIC8vIFRoZSBuYXRpdmUgdGhyZWFkIG9iamVjdC4KKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbSk7Cit9OworIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MgJiYgR1RFU1RfSEFTX1BUSFJFQUQgfHwKKyAgICAgICAgIC8vIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXworCisjIGlmIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXworLy8gTXV0ZXggYW5kIFRocmVhZExvY2FsIGhhdmUgYWxyZWFkeSBiZWVuIGltcG9ydGVkIGludG8gdGhlIG5hbWVzcGFjZS4KKy8vIE5vdGhpbmcgdG8gZG8gaGVyZS4KKworIyBlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKKworLy8gTXV0ZXggaW1wbGVtZW50cyBtdXRleCBvbiBXaW5kb3dzIHBsYXRmb3Jtcy4gIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24KKy8vIHdpdGggY2xhc3MgTXV0ZXhMb2NrOgorLy8KKy8vICAgTXV0ZXggbXV0ZXg7CisvLyAgIC4uLgorLy8gICBNdXRleExvY2sgbG9jaygmbXV0ZXgpOyAgLy8gQWNxdWlyZXMgdGhlIG11dGV4IGFuZCByZWxlYXNlcyBpdCBhdCB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgY3VycmVudCBzY29wZS4KKy8vCisvLyBBIHN0YXRpYyBNdXRleCAqbXVzdCogYmUgZGVmaW5lZCBvciBkZWNsYXJlZCB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZworLy8gbWFjcm9zOgorLy8gICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOworLy8gICBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19zb21lX211dGV4KTsKKy8vCisvLyAoQSBub24tc3RhdGljIE11dGV4IGlzIGRlZmluZWQvZGVjbGFyZWQgaW4gdGhlIHVzdWFsIHdheSkuCitjbGFzcyBHVEVTVF9BUElfIE11dGV4IHsKKyBwdWJsaWM6CisgIGVudW0gTXV0ZXhUeXBlIHsga1N0YXRpYyA9IDAsIGtEeW5hbWljID0gMSB9OworICAvLyBXZSByZWx5IG9uIGtTdGF0aWNNdXRleCBiZWluZyAwIGFzIGl0IGlzIHRvIHdoYXQgdGhlIGxpbmtlciBpbml0aWFsaXplcworICAvLyB0eXBlXyBpbiBzdGF0aWMgbXV0ZXhlcy4gIGNyaXRpY2FsX3NlY3Rpb25fIHdpbGwgYmUgaW5pdGlhbGl6ZWQgbGF6aWx5CisgIC8vIGluIFRocmVhZFNhZmVMYXp5SW5pdCgpLgorICBlbnVtIFN0YXRpY0NvbnN0cnVjdG9yU2VsZWN0b3IgeyBrU3RhdGljTXV0ZXggPSAwIH07CisKKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpbnRlbnRpb25hbGx5IGRvZXMgbm90aGluZy4gIEl0IHJlbGllcyBvbiB0eXBlXyBiZWluZworICAvLyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIDAgKGVmZmVjdGl2ZWx5IHNldHRpbmcgaXQgdG8ga1N0YXRpYykgYW5kIG9uCisgIC8vIFRocmVhZFNhZmVMYXp5SW5pdCgpIHRvIGxhemlseSBpbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBtZW1iZXJzLgorICBleHBsaWNpdCBNdXRleChTdGF0aWNDb25zdHJ1Y3RvclNlbGVjdG9yIC8qZHVtbXkqLykge30KKworICBNdXRleCgpOworICB+TXV0ZXgoKTsKKworICB2b2lkIExvY2soKTsKKworICB2b2lkIFVubG9jaygpOworCisgIC8vIERvZXMgbm90aGluZyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIG11dGV4LiBPdGhlcndpc2UsIGNyYXNoZXMKKyAgLy8gd2l0aCBoaWdoIHByb2JhYmlsaXR5LgorICB2b2lkIEFzc2VydEhlbGQoKTsKKworIHByaXZhdGU6CisgIC8vIEluaXRpYWxpemVzIG93bmVyX3RocmVhZF9pZF8gYW5kIGNyaXRpY2FsX3NlY3Rpb25fIGluIHN0YXRpYyBtdXRleGVzLgorICB2b2lkIFRocmVhZFNhZmVMYXp5SW5pdCgpOworCisgIC8vIFBlciBodHRwOi8vYmxvZ3MubXNkbi5jb20vYi9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDIvMjMvNzgzOTUuYXNweCwKKyAgLy8gd2UgYXNzdW1lIHRoYXQgMCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aHJlYWQgSURzLgorICB1bnNpZ25lZCBpbnQgb3duZXJfdGhyZWFkX2lkXzsKKworICAvLyBGb3Igc3RhdGljIG11dGV4ZXMsIHdlIHJlbHkgb24gdGhlc2UgbWVtYmVycyBiZWluZyBpbml0aWFsaXplZCB0byB6ZXJvcworICAvLyBieSB0aGUgbGlua2VyLgorICBNdXRleFR5cGUgdHlwZV87CisgIGxvbmcgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXzsgIC8vIE5PTElOVAorICBfUlRMX0NSSVRJQ0FMX1NFQ1RJT04qIGNyaXRpY2FsX3NlY3Rpb25fOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTXV0ZXgpOworfTsKKworIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgICAgZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4CisKKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgoOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXg6OmtTdGF0aWNNdXRleCkKKworLy8gV2UgY2Fubm90IG5hbWUgdGhpcyBjbGFzcyBNdXRleExvY2sgYmVjYXVzZSB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAorLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCisvLyBwbGF0Zm9ybXMuIFRoYXQgbWFjcm8gaXMgdXNlZCBhcyBhIGRlZmVuc2l2ZSBtZWFzdXJlIHRvIHByZXZlbnQgYWdhaW5zdAorLy8gaW5hZHZlcnRlbnQgbWlzdXNlcyBvZiBNdXRleExvY2sgbGlrZSAiTXV0ZXhMb2NrKCZtdSkiIHJhdGhlciB0aGFuCisvLyAiTXV0ZXhMb2NrIGwoJm11KSIuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KK2NsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4KiBtdXRleCkKKyAgICAgIDogbXV0ZXhfKG11dGV4KSB7IG11dGV4Xy0+TG9jaygpOyB9CisKKyAgfkdUZXN0TXV0ZXhMb2NrKCkgeyBtdXRleF8tPlVubG9jaygpOyB9CisKKyBwcml2YXRlOgorICBNdXRleCogY29uc3QgbXV0ZXhfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RNdXRleExvY2spOworfTsKKwordHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7CisKKy8vIEJhc2UgY2xhc3MgZm9yIFZhbHVlSG9sZGVyPFQ+LiAgQWxsb3dzIGEgY2FsbGVyIHRvIGhvbGQgYW5kIGRlbGV0ZSBhIHZhbHVlCisvLyB3aXRob3V0IGtub3dpbmcgaXRzIHR5cGUuCitjbGFzcyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5UaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSgpIHt9Cit9OworCisvLyBQcm92aWRlcyBhIHdheSBmb3IgYSB0aHJlYWQgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvIGEgVGhyZWFkTG9jYWwKKy8vIHJlZ2FyZGxlc3Mgb2YgaXRzIHBhcmFtZXRlciB0eXBlLgorY2xhc3MgVGhyZWFkTG9jYWxCYXNlIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBuZXcgVmFsdWVIb2xkZXI8VD4gb2JqZWN0IGhvbGRpbmcgYSBkZWZhdWx0IHZhbHVlIHBhc3NlZCB0bworICAvLyB0aGlzIFRocmVhZExvY2FsPFQ+J3MgY29uc3RydWN0b3IgYW5kIHJldHVybnMgaXQuICBJdCBpcyB0aGUgY2FsbGVyJ3MKKyAgLy8gcmVzcG9uc2liaWxpdHkgbm90IHRvIGNhbGwgdGhpcyB3aGVuIHRoZSBUaHJlYWRMb2NhbDxUPiBpbnN0YW5jZSBhbHJlYWR5CisgIC8vIGhhcyBhIHZhbHVlIG9uIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgdmlydHVhbCBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogTmV3VmFsdWVGb3JDdXJyZW50VGhyZWFkKCkgY29uc3QgPSAwOworCisgcHJvdGVjdGVkOgorICBUaHJlYWRMb2NhbEJhc2UoKSB7fQorICB2aXJ0dWFsIH5UaHJlYWRMb2NhbEJhc2UoKSB7fQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRMb2NhbEJhc2UpOworfTsKKworLy8gTWFwcyBhIHRocmVhZCB0byBhIHNldCBvZiBUaHJlYWRMb2NhbHMgdGhhdCBoYXZlIHZhbHVlcyBpbnN0YW50aWF0ZWQgb24gdGhhdAorLy8gdGhyZWFkIGFuZCBub3RpZmllcyB0aGVtIHdoZW4gdGhlIHRocmVhZCBleGl0cy4gIEEgVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMKKy8vIGV4cGVjdGVkIHRvIHBlcnNpc3QgdW50aWwgYWxsIHRocmVhZHMgaXQgaGFzIHZhbHVlcyBvbiBoYXZlIHRlcm1pbmF0ZWQuCitjbGFzcyBHVEVTVF9BUElfIFRocmVhZExvY2FsUmVnaXN0cnkgeworIHB1YmxpYzoKKyAgLy8gUmVnaXN0ZXJzIHRocmVhZF9sb2NhbF9pbnN0YW5jZSBhcyBoYXZpbmcgdmFsdWUgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAvLyBSZXR1cm5zIGEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgdGhyZWFkIGZyb20gb3RoZXIgdGhyZWFkcy4KKyAgc3RhdGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKKyAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKTsKKworICAvLyBJbnZva2VkIHdoZW4gYSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuCisgIHN0YXRpYyB2b2lkIE9uVGhyZWFkTG9jYWxEZXN0cm95ZWQoCisgICAgICBjb25zdCBUaHJlYWRMb2NhbEJhc2UqIHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Cit9OworCitjbGFzcyBHVEVTVF9BUElfIFRocmVhZFdpdGhQYXJhbUJhc2UgeworIHB1YmxpYzoKKyAgdm9pZCBKb2luKCk7CisKKyBwcm90ZWN0ZWQ6CisgIGNsYXNzIFJ1bm5hYmxlIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5SdW5uYWJsZSgpIHt9CisgICAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKKyAgfTsKKworICBUaHJlYWRXaXRoUGFyYW1CYXNlKFJ1bm5hYmxlICpydW5uYWJsZSwgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KTsKKyAgdmlydHVhbCB+VGhyZWFkV2l0aFBhcmFtQmFzZSgpOworCisgcHJpdmF0ZToKKyAgQXV0b0hhbmRsZSB0aHJlYWRfOworfTsKKworLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3MgbXVsdGktdGhyZWFkaW5nIGNvbnN0cnVjdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZFdpdGhQYXJhbSA6IHB1YmxpYyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCBVc2VyVGhyZWFkRnVuYyhUKTsKKworICBUaHJlYWRXaXRoUGFyYW0oVXNlclRocmVhZEZ1bmMqIGZ1bmMsIFQgcGFyYW0sIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKKyAgICAgIDogVGhyZWFkV2l0aFBhcmFtQmFzZShuZXcgUnVubmFibGVJbXBsKGZ1bmMsIHBhcmFtKSwgdGhyZWFkX2Nhbl9zdGFydCkgeworICB9CisgIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbSgpIHt9CisKKyBwcml2YXRlOgorICBjbGFzcyBSdW5uYWJsZUltcGwgOiBwdWJsaWMgUnVubmFibGUgeworICAgcHVibGljOgorICAgIFJ1bm5hYmxlSW1wbChVc2VyVGhyZWFkRnVuYyogZnVuYywgVCBwYXJhbSkKKyAgICAgICAgOiBmdW5jXyhmdW5jKSwKKyAgICAgICAgICBwYXJhbV8ocGFyYW0pIHsKKyAgICB9CisgICAgdmlydHVhbCB+UnVubmFibGVJbXBsKCkge30KKyAgICB2aXJ0dWFsIHZvaWQgUnVuKCkgeworICAgICAgZnVuY18ocGFyYW1fKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgVXNlclRocmVhZEZ1bmMqIGNvbnN0IGZ1bmNfOworICAgIGNvbnN0IFQgcGFyYW1fOworCisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSdW5uYWJsZUltcGwpOworICB9OworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkV2l0aFBhcmFtKTsKK307CisKKy8vIEltcGxlbWVudHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2Ugb24gV2luZG93cyBzeXN0ZW1zLgorLy8KKy8vICAgLy8gVGhyZWFkIDEKKy8vICAgVGhyZWFkTG9jYWw8aW50PiB0bCgxMDApOyAgLy8gMTAwIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHRocmVhZC4KKy8vCisvLyAgIC8vIFRocmVhZCAyCisvLyAgIHRsLnNldCgxNTApOyAgLy8gQ2hhbmdlcyB0aGUgdmFsdWUgZm9yIHRocmVhZCAyIG9ubHkuCisvLyAgIEVYUEVDVF9FUSgxNTAsIHRsLmdldCgpKTsKKy8vCisvLyAgIC8vIFRocmVhZCAxCisvLyAgIEVYUEVDVF9FUSgxMDAsIHRsLmdldCgpKTsgIC8vIEluIHRocmVhZCAxLCB0bCBoYXMgdGhlIG9yaWdpbmFsIHZhbHVlLgorLy8gICB0bC5zZXQoMjAwKTsKKy8vICAgRVhQRUNUX0VRKDIwMCwgdGwuZ2V0KCkpOworLy8KKy8vIFRoZSB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50IFQgbXVzdCBoYXZlIGEgcHVibGljIGNvcHkgY29uc3RydWN0b3IuCisvLyBJbiBhZGRpdGlvbiwgdGhlIGRlZmF1bHQgVGhyZWFkTG9jYWwgY29uc3RydWN0b3IgcmVxdWlyZXMgVCB0byBoYXZlCisvLyBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorLy8KKy8vIFRoZSB1c2VycyBvZiBhIFRoZWFkTG9jYWwgaW5zdGFuY2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgYnV0IG9uZQorLy8gdGhyZWFkcyAoaW5jbHVkaW5nIHRoZSBtYWluIG9uZSkgdXNpbmcgdGhhdCBpbnN0YW5jZSBoYXZlIGV4aXRlZCBiZWZvcmUKKy8vIGRlc3Ryb3lpbmcgaXQuIE90aGVyd2lzZSwgdGhlIHBlci10aHJlYWQgb2JqZWN0cyBtYW5hZ2VkIGZvciB0aGVtIGJ5IHRoZQorLy8gVGhyZWFkTG9jYWwgaW5zdGFuY2UgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGRlc3Ryb3llZCBvbiBhbGwgcGxhdGZvcm1zLgorLy8KKy8vIEdvb2dsZSBUZXN0IG9ubHkgdXNlcyBnbG9iYWwgVGhyZWFkTG9jYWwgb2JqZWN0cy4gIFRoYXQgbWVhbnMgdGhleQorLy8gd2lsbCBkaWUgYWZ0ZXIgbWFpbigpIGhhcyByZXR1cm5lZC4gIFRoZXJlZm9yZSwgbm8gcGVyLXRocmVhZAorLy8gb2JqZWN0IG1hbmFnZWQgYnkgR29vZ2xlIFRlc3Qgd2lsbCBiZSBsZWFrZWQgYXMgbG9uZyBhcyBhbGwgdGhyZWFkcworLy8gdXNpbmcgR29vZ2xlIFRlc3QgaGF2ZSBleGl0ZWQgd2hlbiBtYWluKCkgcmV0dXJucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGhyZWFkTG9jYWwgOiBwdWJsaWMgVGhyZWFkTG9jYWxCYXNlIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkgOiBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBEZWZhdWx0VmFsdWVIb2xkZXJGYWN0b3J5KCkpIHt9CisgIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKQorICAgICAgOiBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSh2YWx1ZSkpIHt9CisKKyAgflRocmVhZExvY2FsKCkgeyBUaHJlYWRMb2NhbFJlZ2lzdHJ5OjpPblRocmVhZExvY2FsRGVzdHJveWVkKHRoaXMpOyB9CisKKyAgVCogcG9pbnRlcigpIHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZSgpOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyKCk7IH0KKyAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgKnBvaW50ZXIoKSA9IHZhbHVlOyB9CisKKyBwcml2YXRlOgorICAvLyBIb2xkcyBhIHZhbHVlIG9mIFQuICBDYW4gYmUgZGVsZXRlZCB2aWEgaXRzIGJhc2UgY2xhc3Mgd2l0aG91dCB0aGUgY2FsbGVyCisgIC8vIGtub3dpbmcgdGhlIHR5cGUgb2YgVC4KKyAgY2xhc3MgVmFsdWVIb2xkZXIgOiBwdWJsaWMgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgeworICAgcHVibGljOgorICAgIFZhbHVlSG9sZGVyKCkgOiB2YWx1ZV8oKSB7fQorICAgIGV4cGxpY2l0IFZhbHVlSG9sZGVyKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKworICAgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisKKyAgIHByaXZhdGU6CisgICAgVCB2YWx1ZV87CisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWYWx1ZUhvbGRlcik7CisgIH07CisKKworICBUKiBHZXRPckNyZWF0ZVZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxWYWx1ZUhvbGRlcio+KAorICAgICAgICBUaHJlYWRMb2NhbFJlZ2lzdHJ5OjpHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCh0aGlzKSktPnBvaW50ZXIoKTsKKyAgfQorCisgIHZpcnR1YWwgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIE5ld1ZhbHVlRm9yQ3VycmVudFRocmVhZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmYXVsdF9mYWN0b3J5Xy0+TWFrZU5ld0hvbGRlcigpOworICB9CisKKyAgY2xhc3MgVmFsdWVIb2xkZXJGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQorICAgIHZpcnR1YWwgflZhbHVlSG9sZGVyRmFjdG9yeSgpIHt9CisgICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0ID0gMDsKKworICAgcHJpdmF0ZToKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFZhbHVlSG9sZGVyRmFjdG9yeSk7CisgIH07CisKKyAgY2xhc3MgRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSA6IHB1YmxpYyBWYWx1ZUhvbGRlckZhY3RvcnkgeworICAgcHVibGljOgorICAgIERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQorICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCB7IHJldHVybiBuZXcgVmFsdWVIb2xkZXIoKTsgfQorCisgICBwcml2YXRlOgorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSk7CisgIH07CisKKyAgY2xhc3MgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkgOiBwdWJsaWMgVmFsdWVIb2xkZXJGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeShjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgVmFsdWVIb2xkZXIodmFsdWVfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgVCB2YWx1ZV87ICAvLyBUaGUgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgorCisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSk7CisgIH07CisKKyAgc2NvcGVkX3B0cjxWYWx1ZUhvbGRlckZhY3Rvcnk+IGRlZmF1bHRfZmFjdG9yeV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRMb2NhbCk7Cit9OworCisjIGVsaWYgR1RFU1RfSEFTX1BUSFJFQUQKKworLy8gTXV0ZXhCYXNlIGFuZCBNdXRleCBpbXBsZW1lbnQgbXV0ZXggb24gcHRocmVhZHMtYmFzZWQgcGxhdGZvcm1zLgorY2xhc3MgTXV0ZXhCYXNlIHsKKyBwdWJsaWM6CisgIC8vIEFjcXVpcmVzIHRoaXMgbXV0ZXguCisgIHZvaWQgTG9jaygpIHsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2xvY2soJm11dGV4XykpOworICAgIG93bmVyXyA9IHB0aHJlYWRfc2VsZigpOworICAgIGhhc19vd25lcl8gPSB0cnVlOworICB9CisKKyAgLy8gUmVsZWFzZXMgdGhpcyBtdXRleC4KKyAgdm9pZCBVbmxvY2soKSB7CisgICAgLy8gU2luY2UgdGhlIGxvY2sgaXMgYmVpbmcgcmVsZWFzZWQgdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgbm8gbG9uZ2VyIGJlCisgICAgLy8gY29uc2lkZXJlZCB2YWxpZC4gV2UgZG9uJ3QgcHJvdGVjdCB3cml0aW5nIHRvIGhhc19vd25lcl8gaGVyZSwgYXMgaXQncworICAgIC8vIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCisgICAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KKyAgICBoYXNfb3duZXJfID0gZmFsc2U7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4XykpOworICB9CisKKyAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcworICAvLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCisgIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHsKKyAgICBHVEVTVF9DSEVDS18oaGFzX293bmVyXyAmJiBwdGhyZWFkX2VxdWFsKG93bmVyXywgcHRocmVhZF9zZWxmKCkpKQorICAgICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOworICB9CisKKyAgLy8gQSBzdGF0aWMgbXV0ZXggbWF5IGJlIHVzZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLiAgSXQgbWF5IGV2ZW4KKyAgLy8gYmUgdXNlZCBiZWZvcmUgdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gc3RhZ2UuICBUaGVyZWZvcmUgd2UKKyAgLy8gbXVzdCBiZSBhYmxlIHRvIGluaXRpYWxpemUgYSBzdGF0aWMgbXV0ZXggb2JqZWN0IGF0IGxpbmsgdGltZS4KKyAgLy8gVGhpcyBtZWFucyBNdXRleEJhc2UgaGFzIHRvIGJlIGEgUE9EIGFuZCBpdHMgbWVtYmVyIHZhcmlhYmxlcworICAvLyBoYXZlIHRvIGJlIHB1YmxpYy4KKyBwdWJsaWM6CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87ICAvLyBUaGUgdW5kZXJseWluZyBwdGhyZWFkIG11dGV4LgorICAvLyBoYXNfb3duZXJfIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvd25lcl8gZmllbGQgYmVsb3cgY29udGFpbnMgYSB2YWxpZCB0aHJlYWQKKyAgLy8gSUQgYW5kIGlzIHRoZXJlZm9yZSBzYWZlIHRvIGluc3BlY3QgKGUuZy4sIHRvIHVzZSBpbiBwdGhyZWFkX2VxdWFsKCkpLiBBbGwKKyAgLy8gYWNjZXNzZXMgdG8gdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IGEgY2hlY2sgb2YgdGhpcyBmaWVsZC4KKyAgLy8gQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gbWVtc2V0KCkgb3duZXJfIHRvIGFsbCB6ZXJvcywgYnV0IHRoZXJlJ3Mgbm8KKyAgLy8gZ3VhcmFudGVlIHRoYXQgYSB6ZXJvJ2QgcHRocmVhZF90IGlzIG5lY2Vzc2FyaWx5IGludmFsaWQgb3IgZXZlbiBkaWZmZXJlbnQKKyAgLy8gZnJvbSBwdGhyZWFkX3NlbGYoKS4KKyAgYm9vbCBoYXNfb3duZXJfOworICBwdGhyZWFkX3Qgb3duZXJfOyAgLy8gVGhlIHRocmVhZCBob2xkaW5nIHRoZSBtdXRleC4KK307CisKKy8vIEZvcndhcmQtZGVjbGFyZXMgYSBzdGF0aWMgbXV0ZXguCisjICBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgICAgIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleEJhc2UgbXV0ZXgKKworLy8gRGVmaW5lcyBhbmQgc3RhdGljYWxseSAoaS5lLiBhdCBsaW5rIHRpbWUpIGluaXRpYWxpemVzIGEgc3RhdGljIG11dGV4LgorLy8gVGhlIGluaXRpYWxpemF0aW9uIGxpc3QgaGVyZSBkb2VzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemUgZWFjaCBmaWVsZCwKKy8vIGluc3RlYWQgcmVseWluZyBvbiBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGZvciB0aGUgdW5zcGVjaWZpZWQgZmllbGRzLiBJbgorLy8gcGFydGljdWxhciwgdGhlIG93bmVyXyBmaWVsZCAoYSBwdGhyZWFkX3QpIGlzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemVkLgorLy8gVGhpcyBhbGxvd3MgaW5pdGlhbGl6YXRpb24gdG8gd29yayB3aGV0aGVyIHB0aHJlYWRfdCBpcyBhIHNjYWxhciBvciBzdHJ1Y3QuCisvLyBUaGUgZmxhZyAtV21pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIG11c3Qgbm90IGJlIHNwZWNpZmllZCBmb3IgdGhpcyB0byB3b3JrLgorIyAgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4QmFzZSBtdXRleCA9IHsgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiwgZmFsc2UgfQorCisvLyBUaGUgTXV0ZXggY2xhc3MgY2FuIG9ubHkgYmUgdXNlZCBmb3IgbXV0ZXhlcyBjcmVhdGVkIGF0IHJ1bnRpbWUuIEl0CisvLyBzaGFyZXMgaXRzIEFQSSB3aXRoIE11dGV4QmFzZSBvdGhlcndpc2UuCitjbGFzcyBNdXRleCA6IHB1YmxpYyBNdXRleEJhc2UgeworIHB1YmxpYzoKKyAgTXV0ZXgoKSB7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpKTsKKyAgICBoYXNfb3duZXJfID0gZmFsc2U7CisgIH0KKyAgfk11dGV4KCkgeworICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXhfKSk7CisgIH0KKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTXV0ZXgpOworfTsKKworLy8gV2UgY2Fubm90IG5hbWUgdGhpcyBjbGFzcyBNdXRleExvY2sgYmVjYXVzZSB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAorLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCisvLyBwbGF0Zm9ybXMuIFRoYXQgbWFjcm8gaXMgdXNlZCBhcyBhIGRlZmVuc2l2ZSBtZWFzdXJlIHRvIHByZXZlbnQgYWdhaW5zdAorLy8gaW5hZHZlcnRlbnQgbWlzdXNlcyBvZiBNdXRleExvY2sgbGlrZSAiTXV0ZXhMb2NrKCZtdSkiIHJhdGhlciB0aGFuCisvLyAiTXV0ZXhMb2NrIGwoJm11KSIuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KK2NsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4QmFzZSogbXV0ZXgpCisgICAgICA6IG11dGV4XyhtdXRleCkgeyBtdXRleF8tPkxvY2soKTsgfQorCisgIH5HVGVzdE11dGV4TG9jaygpIHsgbXV0ZXhfLT5VbmxvY2soKTsgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXhCYXNlKiBjb25zdCBtdXRleF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdE11dGV4TG9jayk7Cit9OworCit0eXBlZGVmIEdUZXN0TXV0ZXhMb2NrIE11dGV4TG9jazsKKworLy8gSGVscGVycyBmb3IgVGhyZWFkTG9jYWwuCisKKy8vIHB0aHJlYWRfa2V5X2NyZWF0ZSgpIHJlcXVpcmVzIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB0byBoYXZlCisvLyBDLWxpbmthZ2UuICBUaGVyZWZvcmUgaXQgY2Fubm90IGJlIHRlbXBsYXRpemVkIHRvIGFjY2VzcworLy8gVGhyZWFkTG9jYWw8VD4uICBIZW5jZSB0aGUgbmVlZCBmb3IgY2xhc3MKKy8vIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlLgorY2xhc3MgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UoKSB7fQorfTsKKworLy8gQ2FsbGVkIGJ5IHB0aHJlYWQgdG8gZGVsZXRlIHRocmVhZC1sb2NhbCBkYXRhIHN0b3JlZCBieQorLy8gcHRocmVhZF9zZXRzcGVjaWZpYygpLgorZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHZvaWQqIHZhbHVlX2hvbGRlcikgeworICBkZWxldGUgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPih2YWx1ZV9ob2xkZXIpOworfQorCisvLyBJbXBsZW1lbnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlIG9uIHB0aHJlYWRzLWJhc2VkIHN5c3RlbXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkKKyAgICAgIDoga2V5XyhDcmVhdGVLZXkoKSksIGRlZmF1bHRfZmFjdG9yeV8obmV3IERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkoKSkge30KKyAgZXhwbGljaXQgVGhyZWFkTG9jYWwoY29uc3QgVCYgdmFsdWUpCisgICAgICA6IGtleV8oQ3JlYXRlS2V5KCkpLAorICAgICAgICBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSh2YWx1ZSkpIHt9CisKKyAgflRocmVhZExvY2FsKCkgeworICAgIC8vIERlc3Ryb3lzIHRoZSBtYW5hZ2VkIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBpZiBhbnkuCisgICAgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZShwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKworICAgIC8vIFJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4gIFRoaXMgd2lsbCAqbm90KgorICAgIC8vIGRlbGV0ZSBtYW5hZ2VkIG9iamVjdHMgZm9yIG90aGVyIHRocmVhZHMuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9rZXlfZGVsZXRlKGtleV8pKTsKKyAgfQorCisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KKyAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcigpOyB9CisgIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpwb2ludGVyKCkgPSB2YWx1ZTsgfQorCisgcHJpdmF0ZToKKyAgLy8gSG9sZHMgYSB2YWx1ZSBvZiB0eXBlIFQuCisgIGNsYXNzIFZhbHVlSG9sZGVyIDogcHVibGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBWYWx1ZUhvbGRlcigpIDogdmFsdWVfKCkge30KKyAgICBleHBsaWNpdCBWYWx1ZUhvbGRlcihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisKKyAgICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQorCisgICBwcml2YXRlOgorICAgIFQgdmFsdWVfOworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXIpOworICB9OworCisgIHN0YXRpYyBwdGhyZWFkX2tleV90IENyZWF0ZUtleSgpIHsKKyAgICBwdGhyZWFkX2tleV90IGtleTsKKyAgICAvLyBXaGVuIGEgdGhyZWFkIGV4aXRzLCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKCkgd2lsbCBiZSBjYWxsZWQgb24KKyAgICAvLyB0aGUgb2JqZWN0IG1hbmFnZWQgZm9yIHRoYXQgdGhyZWFkLgorICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmtleSwgJkRlbGV0ZVRocmVhZExvY2FsVmFsdWUpKTsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgVCogR2V0T3JDcmVhdGVWYWx1ZSgpIGNvbnN0IHsKKyAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPihwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKyAgICBpZiAoaG9sZGVyICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8VmFsdWVIb2xkZXI+KGhvbGRlciktPnBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBWYWx1ZUhvbGRlciogY29uc3QgbmV3X2hvbGRlciA9IGRlZmF1bHRfZmFjdG9yeV8tPk1ha2VOZXdIb2xkZXIoKTsKKyAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyX2Jhc2UgPSBuZXdfaG9sZGVyOworICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5XywgaG9sZGVyX2Jhc2UpKTsKKyAgICByZXR1cm4gbmV3X2hvbGRlci0+cG9pbnRlcigpOworICB9CisKKyAgY2xhc3MgVmFsdWVIb2xkZXJGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQorICAgIHZpcnR1YWwgflZhbHVlSG9sZGVyRmFjdG9yeSgpIHt9CisgICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0ID0gMDsKKworICAgcHJpdmF0ZToKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFZhbHVlSG9sZGVyRmFjdG9yeSk7CisgIH07CisKKyAgY2xhc3MgRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSA6IHB1YmxpYyBWYWx1ZUhvbGRlckZhY3RvcnkgeworICAgcHVibGljOgorICAgIERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQorICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCB7IHJldHVybiBuZXcgVmFsdWVIb2xkZXIoKTsgfQorCisgICBwcml2YXRlOgorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSk7CisgIH07CisKKyAgY2xhc3MgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkgOiBwdWJsaWMgVmFsdWVIb2xkZXJGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeShjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgVmFsdWVIb2xkZXIodmFsdWVfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgVCB2YWx1ZV87ICAvLyBUaGUgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgorCisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSk7CisgIH07CisKKyAgLy8gQSBrZXkgcHRocmVhZHMgdXNlcyBmb3IgbG9va2luZyB1cCBwZXItdGhyZWFkIHZhbHVlcy4KKyAgY29uc3QgcHRocmVhZF9rZXlfdCBrZXlfOworICBzY29wZWRfcHRyPFZhbHVlSG9sZGVyRmFjdG9yeT4gZGVmYXVsdF9mYWN0b3J5XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZExvY2FsKTsKK307CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXworCisjZWxzZSAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQorCisvLyBBIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIChtdXRleCwgbG9jaywKKy8vIGFuZCB0aHJlYWQtbG9jYWwgdmFyaWFibGUpLiAgTmVjZXNzYXJ5IGZvciBjb21waWxpbmcgR29vZ2xlIFRlc3Qgd2hlcmUKKy8vIG11dGV4IGlzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBHb29nbGUgVGVzdCBpbiBtdWx0aXBsZSB0aHJlYWRzIGlzIG5vdAorLy8gc3VwcG9ydGVkIG9uIHN1Y2ggcGxhdGZvcm1zLgorCitjbGFzcyBNdXRleCB7CisgcHVibGljOgorICBNdXRleCgpIHt9CisgIHZvaWQgTG9jaygpIHt9CisgIHZvaWQgVW5sb2NrKCkge30KKyAgdm9pZCBBc3NlcnRIZWxkKCkgY29uc3Qge30KK307CisKKyMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAorICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgKKworIyBkZWZpbmUgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8obXV0ZXgpIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4CisKKy8vIFdlIGNhbm5vdCBuYW1lIHRoaXMgY2xhc3MgTXV0ZXhMb2NrIGJlY2F1c2UgdGhlIGN0b3IgZGVjbGFyYXRpb24gd291bGQKKy8vIGNvbmZsaWN0IHdpdGggYSBtYWNybyBuYW1lZCBNdXRleExvY2ssIHdoaWNoIGlzIGRlZmluZWQgb24gc29tZQorLy8gcGxhdGZvcm1zLiBUaGF0IG1hY3JvIGlzIHVzZWQgYXMgYSBkZWZlbnNpdmUgbWVhc3VyZSB0byBwcmV2ZW50IGFnYWluc3QKKy8vIGluYWR2ZXJ0ZW50IG1pc3VzZXMgb2YgTXV0ZXhMb2NrIGxpa2UgIk11dGV4TG9jaygmbXUpIiByYXRoZXIgdGhhbgorLy8gIk11dGV4TG9jayBsKCZtdSkiLiAgSGVuY2UgdGhlIHR5cGVkZWYgdHJpY2sgYmVsb3cuCitjbGFzcyBHVGVzdE11dGV4TG9jayB7CisgcHVibGljOgorICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleCopIHt9ICAvLyBOT0xJTlQKK307CisKK3R5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZExvY2FsIHsKKyBwdWJsaWM6CisgIFRocmVhZExvY2FsKCkgOiB2YWx1ZV8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9CisgIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorIHByaXZhdGU6CisgIFQgdmFsdWVfOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK0dURVNUX0FQSV8gc2l6ZV90IEdldFRocmVhZENvdW50KCk7CisKKy8vIFBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikgY3Jhc2hlcyB0aGUgQVJNCisvLyBjb21waWxlciBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBpbiBTdW4gU3R1ZGlvLiAgVGhlIE5va2lhIFN5bWJpYW4KKy8vIGFuZCB0aGUgSUJNIFhMIEMvQysrIGNvbXBpbGVyIHRyeSB0byBpbnN0YW50aWF0ZSBhIGNvcHkgY29uc3RydWN0b3IKKy8vIGZvciBvYmplY3RzIHBhc3NlZCB0aHJvdWdoIGVsbGlwc2lzICguLi4pLCBmYWlsaW5nIGZvciB1bmNvcHlhYmxlCisvLyBvYmplY3RzLiAgV2UgZGVmaW5lIHRoaXMgdG8gZW5zdXJlIHRoYXQgb25seSBQT0QgaXMgcGFzc2VkIHRocm91Z2gKKy8vIGVsbGlwc2lzIG9uIHRoZXNlIHN5c3RlbXMuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisvLyBXZSBsb3NlIHN1cHBvcnQgZm9yIE5VTEwgZGV0ZWN0aW9uIHdoZXJlIHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UKKy8vIHBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikuCisjIGRlZmluZSBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfIDEKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIDEKKyNlbmRpZgorCisvLyBUaGUgTm9raWEgU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIGNvbXBpbGVycyBjYW5ub3QgZGVjaWRlIGJldHdlZW4KKy8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgVGhlc2UgY29tcGlsZXJzCisvLyBfY2FuXyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLAorLy8gc28gYSB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3Jrcy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykKKyMgZGVmaW5lIEdURVNUX05FRURTX0lTX1BPSU5URVJfIDEKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Ym9vbCBib29sX3ZhbHVlPgorc3RydWN0IGJvb2xfY29uc3RhbnQgeworICB0eXBlZGVmIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT4gdHlwZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBib29sX3ZhbHVlOworfTsKK3RlbXBsYXRlIDxib29sIGJvb2xfdmFsdWU+IGNvbnN0IGJvb2wgYm9vbF9jb25zdGFudDxib29sX3ZhbHVlPjo6dmFsdWU7CisKK3R5cGVkZWYgYm9vbF9jb25zdGFudDxmYWxzZT4gZmFsc2VfdHlwZTsKK3R5cGVkZWYgYm9vbF9jb25zdGFudDx0cnVlPiB0cnVlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3BvaW50ZXIgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfcG9pbnRlcjxUKj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CitzdHJ1Y3QgSXRlcmF0b3JUcmFpdHMgeworICB0eXBlZGVmIHR5cGVuYW1lIEl0ZXJhdG9yOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJdGVyYXRvclRyYWl0czxUKj4geworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEl0ZXJhdG9yVHJhaXRzPGNvbnN0IFQqPiB7CisgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiXFwiCisjIGRlZmluZSBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXyAxCisvLyBUaGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlIHRoZSBjb21waWxlciBzdXBwb3J0cy4KK3R5cGVkZWYgX19pbnQ2NCBCaWdnZXN0SW50OworI2Vsc2UKKyMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiLyIKKyMgZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDAKK3R5cGVkZWYgbG9uZyBsb25nIEJpZ2dlc3RJbnQ7ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXRpZXMgZm9yIGNoYXIuCisKKy8vIGlzc3BhY2UoaW50IGNoKSBhbmQgZnJpZW5kcyBhY2NlcHQgYW4gdW5zaWduZWQgY2hhciBvciBFT0YuICBjaGFyCisvLyBtYXkgYmUgc2lnbmVkLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyIChvciBjb21waWxlciBmbGFncykuCisvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjYXN0IGEgY2hhciB0byB1bnNpZ25lZCBjaGFyIGJlZm9yZSBjYWxsaW5nCisvLyBpc3NwYWNlKCksIGV0Yy4KKworaW5saW5lIGJvb2wgSXNBbHBoYShjaGFyIGNoKSB7CisgIHJldHVybiBpc2FscGhhKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzQWxOdW0oY2hhciBjaCkgeworICByZXR1cm4gaXNhbG51bShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc0RpZ2l0KGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNMb3dlcihjaGFyIGNoKSB7CisgIHJldHVybiBpc2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzU3BhY2UoY2hhciBjaCkgeworICByZXR1cm4gaXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc1VwcGVyKGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQoY2hhciBjaCkgeworICByZXR1cm4gaXN4ZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNYRGlnaXQod2NoYXJfdCBjaCkgeworICBjb25zdCB1bnNpZ25lZCBjaGFyIGxvd19ieXRlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpOworICByZXR1cm4gY2ggPT0gbG93X2J5dGUgJiYgaXN4ZGlnaXQobG93X2J5dGUpICE9IDA7Cit9CisKK2lubGluZSBjaGFyIFRvTG93ZXIoY2hhciBjaCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4odG9sb3dlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKK30KK2lubGluZSBjaGFyIFRvVXBwZXIoY2hhciBjaCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4odG91cHBlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIFN0cmlwVHJhaWxpbmdTcGFjZXMoc3RkOjpzdHJpbmcgc3RyKSB7CisgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpdCA9IHN0ci5lbmQoKTsKKyAgd2hpbGUgKGl0ICE9IHN0ci5iZWdpbigpICYmIElzU3BhY2UoKi0taXQpKQorICAgIGl0ID0gc3RyLmVyYXNlKGl0KTsKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gVGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeCBuYW1lc3BhY2UgaG9sZHMgd3JhcHBlcnMgZm9yIGNvbW1vbgorLy8gUE9TSVggZnVuY3Rpb25zLiAgVGhlc2Ugd3JhcHBlcnMgaGlkZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorLy8gV2luZG93cy9NU1ZDIGFuZCBQT1NJWCBzeXN0ZW1zLiAgU2luY2Ugc29tZSBjb21waWxlcnMgZGVmaW5lIHRoZXNlCisvLyBzdGFuZGFyZCBmdW5jdGlvbnMgYXMgbWFjcm9zLCB0aGUgd3JhcHBlciBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBuYW1lCisvLyBhcyB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KKworbmFtZXNwYWNlIHBvc2l4IHsKKworLy8gRnVuY3Rpb25zIHdpdGggYSBkaWZmZXJlbnQgbmFtZSBvbiBXaW5kb3dzLgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCit0eXBlZGVmIHN0cnVjdCBfc3RhdCBTdGF0U3RydWN0OworCisjIGlmZGVmIF9fQk9STEFORENfXworaW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBpc2F0dHkoZmQpOyB9CitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBzdHJpY21wKHMxLCBzMik7Cit9CitpbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gc3RyZHVwKHNyYyk7IH0KKyMgZWxzZSAgLy8gIV9fQk9STEFORENfXworIyAgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgSXNBVFRZKGludCAvKiBmZCAqLykgeyByZXR1cm4gMDsgfQorIyAgZWxzZQoraW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBfaXNhdHR5KGZkKTsgfQorIyAgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgIHJldHVybiBfc3RyaWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIF9zdHJkdXAoc3JjKTsgfQorIyBlbmRpZiAgLy8gX19CT1JMQU5EQ19fCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50PihfZmlsZW5vKGZpbGUpKTsgfQorLy8gU3RhdCgpLCBSbURpcigpLCBhbmQgSXNEaXIoKSBhcmUgbm90IG5lZWRlZCBvbiBXaW5kb3dzIENFIGF0IHRoaXMKKy8vIHRpbWUgYW5kIHRodXMgbm90IGRlZmluZWQgdGhlcmUuCisjIGVsc2UKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIF9maWxlbm8oZmlsZSk7IH0KK2lubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIF9zdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBfcm1kaXIoZGlyKTsgfQoraW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsKKyAgcmV0dXJuIChfU19JRkRJUiAmIHN0LnN0X21vZGUpICE9IDA7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjZWxzZQorCit0eXBlZGVmIHN0cnVjdCBzdGF0IFN0YXRTdHJ1Y3Q7CisKK2lubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIGZpbGVubyhmaWxlKTsgfQoraW5saW5lIGludCBJc0FUVFkoaW50IGZkKSB7IHJldHVybiBpc2F0dHkoZmQpOyB9CitpbmxpbmUgaW50IFN0YXQoY29uc3QgY2hhciogcGF0aCwgU3RhdFN0cnVjdCogYnVmKSB7IHJldHVybiBzdGF0KHBhdGgsIGJ1Zik7IH0KK2lubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgcmV0dXJuIHN0cmNhc2VjbXAoczEsIHMyKTsKK30KK2lubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBzdHJkdXAoc3JjKTsgfQoraW5saW5lIGludCBSbURpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIHJtZGlyKGRpcik7IH0KK2lubGluZSBib29sIElzRGlyKGNvbnN0IFN0YXRTdHJ1Y3QmIHN0KSB7IHJldHVybiBTX0lTRElSKHN0LnN0X21vZGUpOyB9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBGdW5jdGlvbnMgZGVwcmVjYXRlZCBieSBNU1ZDIDguMC4KKworR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDk5NiAvKiBkZXByZWNhdGVkIGZ1bmN0aW9uICovKQorCitpbmxpbmUgY29uc3QgY2hhciogU3RyTkNweShjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBzcmMsIHNpemVfdCBuKSB7CisgIHJldHVybiBzdHJuY3B5KGRlc3QsIHNyYywgbik7Cit9CisKKy8vIENoRGlyKCksIEZSZW9wZW4oKSwgRkRPcGVuKCksIFJlYWQoKSwgV3JpdGUoKSwgQ2xvc2UoKSwgYW5kCisvLyBTdHJFcnJvcigpIGFyZW4ndCBuZWVkZWQgb24gV2luZG93cyBDRSBhdCB0aGlzIHRpbWUgYW5kIHRodXMgbm90CisvLyBkZWZpbmVkIHRoZXJlLgorCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19XSU5ET1dTX1BIT05FICYmICFHVEVTVF9PU19XSU5ET1dTX1JUCitpbmxpbmUgaW50IENoRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gY2hkaXIoZGlyKTsgfQorI2VuZGlmCitpbmxpbmUgRklMRSogRk9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSkgeworICByZXR1cm4gZm9wZW4ocGF0aCwgbW9kZSk7Cit9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgRklMRSAqRlJlb3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlLCBGSUxFKiBzdHJlYW0pIHsKKyAgcmV0dXJuIGZyZW9wZW4ocGF0aCwgbW9kZSwgc3RyZWFtKTsKK30KK2lubGluZSBGSUxFKiBGRE9wZW4oaW50IGZkLCBjb25zdCBjaGFyKiBtb2RlKSB7IHJldHVybiBmZG9wZW4oZmQsIG1vZGUpOyB9CisjZW5kaWYKK2lubGluZSBpbnQgRkNsb3NlKEZJTEUqIGZwKSB7IHJldHVybiBmY2xvc2UoZnApOyB9CisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitpbmxpbmUgaW50IFJlYWQoaW50IGZkLCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihyZWFkKGZkLCBidWYsIGNvdW50KSk7Cit9CitpbmxpbmUgaW50IFdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4od3JpdGUoZmQsIGJ1ZiwgY291bnQpKTsKK30KK2lubGluZSBpbnQgQ2xvc2UoaW50IGZkKSB7IHJldHVybiBjbG9zZShmZCk7IH0KK2lubGluZSBjb25zdCBjaGFyKiBTdHJFcnJvcihpbnQgZXJybnVtKSB7IHJldHVybiBzdHJlcnJvcihlcnJudW0pOyB9CisjZW5kaWYKK2lubGluZSBjb25zdCBjaGFyKiBHZXRFbnYoY29uc3QgY2hhciogbmFtZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1dJTkRPV1NfUEhPTkUgfCBHVEVTVF9PU19XSU5ET1dTX1JUCisgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLCB3aGljaCBoYXMgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICBzdGF0aWNfY2FzdDx2b2lkPihuYW1lKTsgIC8vIFRvIHByZXZlbnQgJ3VudXNlZCBhcmd1bWVudCcgd2FybmluZy4KKyAgcmV0dXJuIE5VTEw7CisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1N1bk9TXzVfOCkgfHwgZGVmaW5lZChfX1N1bk9TXzVfOSkKKyAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIHdoaWNoIHdlIHByb2dyYW1tYXRpY2FsbHkgY2xlYXIgd2lsbCBiZSBzZXQgdG8gdGhlCisgIC8vIGVtcHR5IHN0cmluZyByYXRoZXIgdGhhbiB1bnNldCAoTlVMTCkuICBIYW5kbGUgdGhhdCBjYXNlLgorICBjb25zdCBjaGFyKiBjb25zdCBlbnYgPSBnZXRlbnYobmFtZSk7CisgIHJldHVybiAoZW52ICE9IE5VTEwgJiYgZW52WzBdICE9ICdcMCcpID8gZW52IDogTlVMTDsKKyNlbHNlCisgIHJldHVybiBnZXRlbnYobmFtZSk7CisjZW5kaWYKK30KKworR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gV2luZG93cyBDRSBoYXMgbm8gQyBsaWJyYXJ5LiBUaGUgYWJvcnQoKSBmdW5jdGlvbiBpcyB1c2VkIGluCisvLyBzZXZlcmFsIHBsYWNlcyBpbiBHb29nbGUgVGVzdC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIHJlYXNvbmFibGUKKy8vIGltaXRhdGlvbiBvZiBzdGFuZGFyZCBiZWhhdmlvdXIuCit2b2lkIEFib3J0KCk7CisjZWxzZQoraW5saW5lIHZvaWQgQWJvcnQoKSB7IGFib3J0KCk7IH0KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworfSAgLy8gbmFtZXNwYWNlIHBvc2l4CisKKy8vIE1TVkMgImRlcHJlY2F0ZXMiIHNucHJpbnRmIGFuZCBpc3N1ZXMgd2FybmluZ3Mgd2hlcmV2ZXIgaXQgaXMgdXNlZC4gIEluCisvLyBvcmRlciB0byBhdm9pZCB0aGVzZSB3YXJuaW5ncywgd2UgbmVlZCB0byB1c2UgX3NucHJpbnRmIG9yIF9zbnByaW50Zl9zIG9uCisvLyBNU1ZDLWJhc2VkIHBsYXRmb3Jtcy4gIFdlIG1hcCB0aGUgR1RFU1RfU05QUklOVEZfIG1hY3JvIHRvIHRoZSBhcHByb3ByaWF0ZQorLy8gZnVuY3Rpb24gaW4gb3JkZXIgdG8gYWNoaWV2ZSB0aGF0LiAgV2UgdXNlIG1hY3JvIGRlZmluaXRpb24gaGVyZSBiZWNhdXNlCisvLyBzbnByaW50ZiBpcyBhIHZhcmlhZGljIGZ1bmN0aW9uLgorI2lmIF9NU0NfVkVSID49IDE0MDAgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBNU1ZDIDIwMDUgYW5kIGFib3ZlIHN1cHBvcnQgdmFyaWFkaWMgbWFjcm9zLgorIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfKGJ1ZmZlciwgc2l6ZSwgZm9ybWF0LCAuLi4pIFwKKyAgICAgX3NucHJpbnRmX3MoYnVmZmVyLCBzaXplLCBzaXplLCBmb3JtYXQsIF9fVkFfQVJHU19fKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKy8vIFdpbmRvd3MgQ0UgZG9lcyBub3QgZGVmaW5lIF9zbnByaW50Zl9zIGFuZCBNU1ZDIHByaW9yIHRvIDIwMDUgZG9lc24ndAorLy8gY29tcGxhaW4gYWJvdXQgX3NucHJpbnRmLgorIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfIF9zbnByaW50ZgorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX1NOUFJJTlRGXyBzbnByaW50ZgorI2VuZGlmCisKKy8vIFRoZSBtYXhpbXVtIG51bWJlciBhIEJpZ2dlc3RJbnQgY2FuIHJlcHJlc2VudC4gIFRoaXMgZGVmaW5pdGlvbgorLy8gd29ya3Mgbm8gbWF0dGVyIEJpZ2dlc3RJbnQgaXMgcmVwcmVzZW50ZWQgaW4gb25lJ3MgY29tcGxlbWVudCBvcgorLy8gdHdvJ3MgY29tcGxlbWVudC4KKy8vCisvLyBXZSBjYW5ub3QgcmVseSBvbiBudW1lcmljX2xpbWl0cyBpbiBTVEwsIGFzIF9faW50NjQgYW5kIGxvbmcgbG9uZworLy8gYXJlIG5vdCBwYXJ0IG9mIHN0YW5kYXJkIEMrKyBhbmQgbnVtZXJpY19saW1pdHMgZG9lc24ndCBuZWVkIHRvIGJlCisvLyBkZWZpbmVkIGZvciB0aGVtLgorY29uc3QgQmlnZ2VzdEludCBrTWF4QmlnZ2VzdEludCA9CisgICAgfihzdGF0aWNfY2FzdDxCaWdnZXN0SW50PigxKSA8PCAoOCpzaXplb2YoQmlnZ2VzdEludCkgLSAxKSk7CisKKy8vIFRoaXMgdGVtcGxhdGUgY2xhc3Mgc2VydmVzIGFzIGEgY29tcGlsZS10aW1lIGZ1bmN0aW9uIGZyb20gc2l6ZSB0bworLy8gdHlwZS4gIEl0IG1hcHMgYSBzaXplIGluIGJ5dGVzIHRvIGEgcHJpbWl0aXZlIHR5cGUgd2l0aCB0aGF0CisvLyBzaXplLiBlLmcuCisvLworLy8gICBUeXBlV2l0aFNpemU8ND46OlVJbnQKKy8vCisvLyBpcyB0eXBlZGVmLWVkIHRvIGJlIHVuc2lnbmVkIGludCAodW5zaWduZWQgaW50ZWdlciBtYWRlIHVwIG9mIDQKKy8vIGJ5dGVzKS4KKy8vCisvLyBTdWNoIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlbG9uZyB0byBTVEwsIGJ1dCBJIGNhbm5vdCBmaW5kIGl0CisvLyB0aGVyZS4KKy8vCisvLyBHb29nbGUgVGVzdCB1c2VzIHRoaXMgY2xhc3MgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIGZsb2F0aW5nLXBvaW50CisvLyBjb21wYXJpc29uLgorLy8KKy8vIEZvciBub3cgaXQgb25seSBoYW5kbGVzIFVJbnQgKHVuc2lnbmVkIGludCkgYXMgdGhhdCdzIGFsbCBHb29nbGUgVGVzdAorLy8gbmVlZHMuICBPdGhlciB0eXBlcyBjYW4gYmUgZWFzaWx5IGFkZGVkIGluIHRoZSBmdXR1cmUgaWYgbmVlZAorLy8gYXJpc2VzLgordGVtcGxhdGUgPHNpemVfdCBzaXplPgorY2xhc3MgVHlwZVdpdGhTaXplIHsKKyBwdWJsaWM6CisgIC8vIFRoaXMgcHJldmVudHMgdGhlIHVzZXIgZnJvbSB1c2luZyBUeXBlV2l0aFNpemU8Tj4gd2l0aCBpbmNvcnJlY3QKKyAgLy8gdmFsdWVzIG9mIE4uCisgIHR5cGVkZWYgdm9pZCBVSW50OworfTsKKworLy8gVGhlIHNwZWNpYWxpemF0aW9uIGZvciBzaXplIDQuCit0ZW1wbGF0ZSA8PgorY2xhc3MgVHlwZVdpdGhTaXplPDQ+IHsKKyBwdWJsaWM6CisgIC8vIHVuc2lnbmVkIGludCBoYXMgc2l6ZSA0IGluIGJvdGggZ2NjIGFuZCBNU1ZDLgorICAvLworICAvLyBBcyBiYXNlL2Jhc2ljdHlwZXMuaCBkb2Vzbid0IGNvbXBpbGUgb24gV2luZG93cywgd2UgY2Fubm90IHVzZQorICAvLyB1aW50MzIsIHVpbnQ2NCwgYW5kIGV0YyBoZXJlLgorICB0eXBlZGVmIGludCBJbnQ7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50IFVJbnQ7Cit9OworCisvLyBUaGUgc3BlY2lhbGl6YXRpb24gZm9yIHNpemUgOC4KK3RlbXBsYXRlIDw+CitjbGFzcyBUeXBlV2l0aFNpemU8OD4geworIHB1YmxpYzoKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHR5cGVkZWYgX19pbnQ2NCBJbnQ7CisgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSW50OworI2Vsc2UKKyAgdHlwZWRlZiBsb25nIGxvbmcgSW50OyAgLy8gTk9MSU5UCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJbnQ7ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworfTsKKworLy8gSW50ZWdlciB0eXBlcyBvZiBrbm93biBzaXplcy4KK3R5cGVkZWYgVHlwZVdpdGhTaXplPDQ+OjpJbnQgSW50MzI7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw0Pjo6VUludCBVSW50MzI7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6SW50IEludDY0OwordHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OlVJbnQgVUludDY0OwordHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OkludCBUaW1lSW5NaWxsaXM7ICAvLyBSZXByZXNlbnRzIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorCisvLyBVdGlsaXRpZXMgZm9yIGNvbW1hbmQgbGluZSBmbGFncyBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCisvLyBNYWNybyBmb3IgcmVmZXJlbmNpbmcgZmxhZ3MuCisjaWYgIWRlZmluZWQoR1RFU1RfRkxBRykKKyMgZGVmaW5lIEdURVNUX0ZMQUcobmFtZSkgRkxBR1NfZ3Rlc3RfIyNuYW1lCisjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0ZMQUcpCisKKyNpZiAhZGVmaW5lZChHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfKQorIyBkZWZpbmUgR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXyAxCisjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18pCisKKyNpZiAhZGVmaW5lZChHVEVTVF9ERUNMQVJFX2Jvb2xfKQorIyBkZWZpbmUgR1RFU1RfRkxBR19TQVZFUl8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXIKKworLy8gTWFjcm9zIGZvciBkZWNsYXJpbmcgZmxhZ3MuCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX2Jvb2xfKG5hbWUpIEdURVNUX0FQSV8gZXh0ZXJuIGJvb2wgR1RFU1RfRkxBRyhuYW1lKQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9pbnQzMl8obmFtZSkgXAorICAgIEdURVNUX0FQSV8gZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkludDMyIEdURVNUX0ZMQUcobmFtZSkKKyNkZWZpbmUgR1RFU1RfREVDTEFSRV9zdHJpbmdfKG5hbWUpIFwKKyAgICBHVEVTVF9BUElfIGV4dGVybiA6OnN0ZDo6c3RyaW5nIEdURVNUX0ZMQUcobmFtZSkKKworLy8gTWFjcm9zIGZvciBkZWZpbmluZyBmbGFncy4KKyNkZWZpbmUgR1RFU1RfREVGSU5FX2Jvb2xfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKKyAgICBHVEVTVF9BUElfIGJvb2wgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKKyNkZWZpbmUgR1RFU1RfREVGSU5FX2ludDMyXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorI2RlZmluZSBHVEVTVF9ERUZJTkVfc3RyaW5nXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisKKyNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfREVDTEFSRV9ib29sXykKKworLy8gVGhyZWFkIGFubm90YXRpb25zCisjaWYgIWRlZmluZWQoR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKQorIyBkZWZpbmUgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGxvY2tzKQorIyBkZWZpbmUgR1RFU1RfTE9DS19FWENMVURFRF8obG9ja3MpCisjZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXykKKworLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcyB0aGUgcmVzdWx0CisvLyB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUgdW5jaGFuZ2VkIGFuZCByZXR1cm5zCisvLyBmYWxzZS4KKy8vIFRPRE8oY2hhbmRsZXJjKTogRmluZCBhIGJldHRlciB3YXkgdG8gcmVmYWN0b3IgZmxhZyBhbmQgZW52aXJvbm1lbnQgcGFyc2luZworLy8gb3V0IG9mIGJvdGggZ3Rlc3QtcG9ydC5jYyBhbmQgZ3Rlc3QuY2MgdG8gYXZvaWQgZXhwb3J0aW5nIHRoaXMgdXRpbGl0eQorLy8gZnVuY3Rpb24uCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKTsKKworLy8gUGFyc2VzIGEgYm9vbC9JbnQzMi9zdHJpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEdvb2dsZSBUZXN0IGZsYWcuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbCk7CitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIEludDMyIGRlZmF1bHRfdmFsKTsKK2NvbnN0IGNoYXIqIFN0cmluZ0Zyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbCk7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YxYTdmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgdGhlIFN0cmluZyBjbGFzcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQorLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gVGhleSBzaG91bGQgbm90IHVzZWQKKy8vIGJ5IGNvZGUgZXh0ZXJuYWwgdG8gR29vZ2xlIFRlc3QuCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBpcyAjaW5jbHVkZWQgYnkgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+LgorLy8gSXQgc2hvdWxkIG5vdCBiZSAjaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gc3RyaW5nLmggaXMgbm90IGd1YXJhbnRlZWQgdG8gcHJvdmlkZSBzdHJjcHkgb24gQysrIEJ1aWxkZXIuCisjIGluY2x1ZGUgPG1lbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFN0cmluZyAtIGFuIGFic3RyYWN0IGNsYXNzIGhvbGRpbmcgc3RhdGljIHN0cmluZyB1dGlsaXRpZXMuCitjbGFzcyBHVEVTVF9BUElfIFN0cmluZyB7CisgcHVibGljOgorICAvLyBTdGF0aWMgdXRpbGl0eSBtZXRob2RzCisKKyAgLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuICBUaGUKKyAgLy8gY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuIHZhbHVlIHVzaW5nCisgIC8vIGRlbGV0ZVtdLiAgUmV0dXJucyB0aGUgY2xvbmVkIHN0cmluZywgb3IgTlVMTCBpZiB0aGUgaW5wdXQgaXMKKyAgLy8gTlVMTC4KKyAgLy8KKyAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBzdHJkdXAoKSBpbiBzdHJpbmcuaCwgd2hpY2ggYWxsb2NhdGVzCisgIC8vIG1lbW9yeSB1c2luZyBtYWxsb2MoKS4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIENsb25lQ1N0cmluZyhjb25zdCBjaGFyKiBjX3N0cik7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXaW5kb3dzIENFIGRvZXMgbm90IGhhdmUgdGhlICdBTlNJJyB2ZXJzaW9ucyBvZiBXaW4zMiBBUElzLiBUbyBiZQorICAvLyBhYmxlIHRvIHBhc3Mgc3RyaW5ncyB0byBXaW4zMiBBUElzIG9uIENFIHdlIG5lZWQgdG8gY29udmVydCB0aGVtCisgIC8vIHRvICdVbmljb2RlJywgVVRGLTE2LgorCisgIC8vIENyZWF0ZXMgYSBVVEYtMTYgd2lkZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gQU5TSSBzdHJpbmcsIGFsbG9jYXRpbmcKKyAgLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorICAvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgd2lkZSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCisgIC8vIGlucHV0IGlzIE5VTEwuCisgIC8vCisgIC8vIFRoZSB3aWRlIHN0cmluZyBpcyBjcmVhdGVkIHVzaW5nIHRoZSBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApIHRvCisgIC8vIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFOU0kgdmVyc2lvbnMgb2YgV2luMzIgY2FsbHMgYW5kIHRoZQorICAvLyBDIHJ1bnRpbWUuCisgIHN0YXRpYyBMUENXU1RSIEFuc2lUb1V0ZjE2KGNvbnN0IGNoYXIqIGNfc3RyKTsKKworICAvLyBDcmVhdGVzIGFuIEFOU0kgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHdpZGUgc3RyaW5nLCBhbGxvY2F0aW5nCisgIC8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKyAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIEFOU0kgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorICAvLyBpbnB1dCBpcyBOVUxMLgorICAvLworICAvLyBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIEFOU0kgY29kZXBhZ2UgKENQX0FDUCkgdG8KKyAgLy8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiB0aGUgQU5TSSB2ZXJzaW9ucyBvZiBXaW4zMiBjYWxscyBhbmQgdGhlCisgIC8vIEMgcnVudGltZS4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIFV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKTsKKyNlbmRpZgorCisgIC8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugc3RyY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQorICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIHN0YXRpYyBib29sIENTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLCBjb25zdCBjaGFyKiByaHMpOworCisgIC8vIENvbnZlcnRzIGEgd2lkZSBDIHN0cmluZyB0byBhIFN0cmluZyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCisgIC8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcKKyAgLy8gdGhlIGNvbnZlcnNpb24sICIoZmFpbGVkIHRvIGNvbnZlcnQgZnJvbSB3aWRlIHN0cmluZykiIGlzCisgIC8vIHJldHVybmVkLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgU2hvd1dpZGVDU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHdpZGVfY19zdHIpOworCisgIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCisgIC8vIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCisgIC8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgc3RhdGljIGJvb2wgV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCB3Y2hhcl90KiByaHMpOworCisgIC8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIHN0YXRpYyBib29sIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJocyk7CisKKyAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5CisgIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHdjc2Nhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCisgIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgd2lkZSBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIC8vIE5COiBUaGUgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgc2xpZ2h0bHkgZGlmZmVyLgorICAvLyBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCB1c2VzIF93Y3NpY21wIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRQorICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gT24gR05VIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHVzZXMgd2NzY2FzZWNtcAorICAvLyB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgorICAvLyBPbiBNYWNPUyBYLCBpdCB1c2VzIHRvd2xvd2VyLCB3aGljaCBhbHNvIHVzZXMgTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlCisgIC8vIGN1cnJlbnQgbG9jYWxlLgorICBzdGF0aWMgYm9vbCBDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocyk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBpZ25vcmluZworICAvLyBjYXNlLiBBbnkgc3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYW4gZW1wdHkgc3VmZml4LgorICBzdGF0aWMgYm9vbCBFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpOworCisgIC8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlMDJkIi4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEludFdpZHRoMihpbnQgdmFsdWUpOyAgLy8gIiUwMmQiIGZvciB3aWR0aCA9PSAyCisKKyAgLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiVYIi4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEhleEludChpbnQgdmFsdWUpOworCisgIC8vIEZvcm1hdHMgYSBieXRlIGFzICIlMDJYIi4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEJ5dGUodW5zaWduZWQgY2hhciB2YWx1ZSk7CisKKyBwcml2YXRlOgorICBTdHJpbmcoKTsgIC8vIE5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQuCit9OyAgLy8gY2xhc3MgU3RyaW5nCisKKy8vIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmluZ3N0cmVhbSdzIGJ1ZmZlciBhcyBhbiBzdGQ6OnN0cmluZy4gIEVhY2ggJ1wwJworLy8gY2hhcmFjdGVyIGluIHRoZSBidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KK0dURVNUX0FQSV8gc3RkOjpzdHJpbmcgU3RyaW5nU3RyZWFtVG9TdHJpbmcoOjpzdGQ6OnN0cmluZ3N0cmVhbSogc3RyZWFtKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWI0MDUzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaApAQCAtMCwwICsxLDEwMjAgQEAKKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBndGVzdC10dXBsZS5oLnB1bXAKKy8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKKworLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBJbXBsZW1lbnRzIGEgc3Vic2V0IG9mIFRSMSB0dXBsZSBuZWVkZWQgYnkgR29vZ2xlIFRlc3QgYW5kIEdvb2dsZSBNb2NrLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXworCisjaW5jbHVkZSA8dXRpbGl0eT4gIC8vIEZvciA6OnN0ZDo6cGFpci4KKworLy8gVGhlIGNvbXBpbGVyIHVzZWQgaW4gU3ltYmlhbiBoYXMgYSBidWcgdGhhdCBwcmV2ZW50cyB1cyBmcm9tIGRlY2xhcmluZyB0aGUKKy8vIHR1cGxlIHRlbXBsYXRlIGFzIGEgZnJpZW5kIChpdCBjb21wbGFpbnMgdGhhdCB0dXBsZSBpcyByZWRlZmluZWQpLiAgVGhpcworLy8gaGFjayBieXBhc3NlcyB0aGUgYnVnIGJ5IGRlY2xhcmluZyB0aGUgbWVtYmVycyB0aGF0IHNob3VsZCBvdGhlcndpc2UgYmUKKy8vIHByaXZhdGUgYXMgcHVibGljLgorLy8gU3VuIFN0dWRpbyB2ZXJzaW9ucyA8IDEyIGFsc28gaGF2ZSB0aGUgYWJvdmUgYnVnLgorI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgKGRlZmluZWQoX19TVU5QUk9fQ0MpICYmIF9fU1VOUFJPX0NDIDwgMHg1OTApCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gcHVibGljOgorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBcCisgICAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+IGZyaWVuZCBjbGFzcyB0dXBsZTsgXAorICAgcHJpdmF0ZToKKyNlbmRpZgorCisvLyBWaXN1YWwgU3R1ZGlvIDIwMTAsIDIwMTIsIGFuZCAyMDEzIGRlZmluZSBzeW1ib2xzIGluIHN0ZDo6dHIxIHRoYXQgY29uZmxpY3QKKy8vIHdpdGggb3VyIG93biBkZWZpbml0aW9ucy4gVGhlcmVmb3JlIHVzaW5nIG91ciBvd24gdHVwbGUgZG9lcyBub3Qgd29yayBvbgorLy8gdGhvc2UgY29tcGlsZXJzLgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE2MDAgIC8qIDE2MDAgaXMgVmlzdWFsIFN0dWRpbyAyMDEwICovCisjIGVycm9yICJndGVzdCdzIHR1cGxlIGRvZXNuJ3QgY29tcGlsZSBvbiBWaXN1YWwgU3R1ZGlvIDIwMTAgb3IgbGF0ZXIuIFwKK0dURVNUX1VTRV9PV05fVFIxX1RVUExFIG11c3QgYmUgc2V0IHRvIDAgb24gdGhvc2UgY29tcGlsZXJzLiIKKyNlbmRpZgorCisvLyBHVEVTVF9uX1RVUExFXyhUKSBpcyB0aGUgdHlwZSBvZiBhbiBuLXR1cGxlLgorI2RlZmluZSBHVEVTVF8wX1RVUExFXyhUKSB0dXBsZTw+CisjZGVmaW5lIEdURVNUXzFfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF8yX1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfM19UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzRfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF81X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfNl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzdfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF84X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgVCMjNywgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfOV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIFQjIzcsIFQjIzgsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzEwX1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgVCMjNywgVCMjOCwgVCMjOT4KKworLy8gR1RFU1Rfbl9UWVBFTkFNRVNfKFQpIGRlY2xhcmVzIGEgbGlzdCBvZiBuIHR5cGVuYW1lcy4KKyNkZWZpbmUgR1RFU1RfMF9UWVBFTkFNRVNfKFQpCisjZGVmaW5lIEdURVNUXzFfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwCisjZGVmaW5lIEdURVNUXzJfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxCisjZGVmaW5lIEdURVNUXzNfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyCisjZGVmaW5lIEdURVNUXzRfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMworI2RlZmluZSBHVEVTVF81X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQKKyNkZWZpbmUgR1RFU1RfNl9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1CisjZGVmaW5lIEdURVNUXzdfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNgorI2RlZmluZSBHVEVTVF84X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYsIHR5cGVuYW1lIFQjIzcKKyNkZWZpbmUgR1RFU1RfOV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCBcCisgICAgdHlwZW5hbWUgVCMjNywgdHlwZW5hbWUgVCMjOAorI2RlZmluZSBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCBcCisgICAgdHlwZW5hbWUgVCMjNywgdHlwZW5hbWUgVCMjOCwgdHlwZW5hbWUgVCMjOQorCisvLyBJbiB0aGVvcnksIGRlZmluaW5nIHN0dWZmIGluIHRoZSA6OnN0ZCBuYW1lc3BhY2UgaXMgdW5kZWZpbmVkCisvLyBiZWhhdmlvci4gIFdlIGNhbiBkbyB0aGlzIGFzIHdlIGFyZSBwbGF5aW5nIHRoZSByb2xlIG9mIGEgc3RhbmRhcmQKKy8vIGxpYnJhcnkgdmVuZG9yLgorbmFtZXNwYWNlIHN0ZCB7CituYW1lc3BhY2UgdHIxIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQwID0gdm9pZCwgdHlwZW5hbWUgVDEgPSB2b2lkLCB0eXBlbmFtZSBUMiA9IHZvaWQsCisgICAgdHlwZW5hbWUgVDMgPSB2b2lkLCB0eXBlbmFtZSBUNCA9IHZvaWQsIHR5cGVuYW1lIFQ1ID0gdm9pZCwKKyAgICB0eXBlbmFtZSBUNiA9IHZvaWQsIHR5cGVuYW1lIFQ3ID0gdm9pZCwgdHlwZW5hbWUgVDggPSB2b2lkLAorICAgIHR5cGVuYW1lIFQ5ID0gdm9pZD4KK2NsYXNzIHR1cGxlOworCisvLyBBbnl0aGluZyBpbiBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgaXMgR29vZ2xlIFRlc3QncyBJTlRFUk5BTAorLy8gSU1QTEVNRU5UQVRJT04gREVUQUlMIGFuZCBNVVNUIE5PVCBCRSBVU0VEIERJUkVDVExZIGluIHVzZXIgY29kZS4KK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKKy8vIEJ5UmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgY29uc3QgVCYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCeVJlZiB7IHR5cGVkZWYgY29uc3QgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQnlSZWY8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBmb3IgQnlSZWYuCisjZGVmaW5lIEdURVNUX0JZX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkJ5UmVmPFQ+Ojp0eXBlCisKKy8vIEFkZFJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIFQmLiAgVGhpcworLy8gaXMgdGhlIHNhbWUgYXMgdHIxOjphZGRfcmVmZXJlbmNlPFQ+Ojp0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmIHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWY8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBmb3IgQWRkUmVmLgorI2RlZmluZSBHVEVTVF9BRERfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QWRkUmVmPFQ+Ojp0eXBlCisKKy8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgZ2V0PGs+KCkuCit0ZW1wbGF0ZSA8aW50IGs+IGNsYXNzIEdldDsKKworLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyB0dXBsZV9lbGVtZW50PGssIFQ+LiAga0luZGV4VmFsaWQgaXMgdHJ1ZQorLy8gaWZmIGsgPCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0dXBsZSB0eXBlIFQuCit0ZW1wbGF0ZSA8Ym9vbCBrSW5kZXhWYWxpZCwgaW50IGtJbmRleCwgY2xhc3MgVHVwbGU+CitzdHJ1Y3QgVHVwbGVFbGVtZW50OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMCwgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMSwgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQxIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMiwgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQyIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMywgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQzIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNCwgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQ0IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNSwgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQ1IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNiwgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQ2IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNywgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQ3IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgOCwgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQ4IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgOSwgR1RFU1RfMTBfVFVQTEVfKFQpID4geworICB0eXBlZGVmIFQ5IHR5cGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPD4KK2NsYXNzIHR1cGxlPD4geworIHB1YmxpYzoKKyAgdHVwbGUoKSB7fQorICB0dXBsZShjb25zdCB0dXBsZSYgLyogdCAqLykgIHt9CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIC8qIHQgKi8pIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfMV9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCkgOiBmMF8oZjApIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfMV9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfMl9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxKSA6IGYwXyhmMCksCisgICAgICBmMV8oZjEpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUwLCB0eXBlbmFtZSBVMT4KKyAgdHVwbGUoY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgOiBmMF8ocC5maXJzdCksIGYxXyhwLnNlY29uZCkge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMl9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUwLCB0eXBlbmFtZSBVMT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSB7CisgICAgZjBfID0gcC5maXJzdDsKKyAgICBmMV8gPSBwLnNlY29uZDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfMl9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF8zX1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzNfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzNfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF80X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMykgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLAorICAgICAgZjNfKGYzKSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF80X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF80X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF80X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF81X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ0KSBmNCkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF81X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF81X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF81X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzZfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKKyAgICAgIGY1XyhmNSkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzZfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzZfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzZfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF83X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKKyAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNikge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzdfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzdfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzdfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzhfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpLCBmN18oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ3KSBmNykgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpLAorICAgICAgZjVfKGY1KSwgZjZfKGY2KSwgZjdfKGY3KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfOF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfOF9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfOF9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICBmNl8gPSB0LmY2XzsKKyAgICBmN18gPSB0LmY3XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworICBUNiBmNl87CisgIFQ3IGY3XzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF85X1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCksIGY4XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwgR1RFU1RfQllfUkVGXyhUNykgZjcsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ4KSBmOCkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpLAorICAgICAgZjVfKGY1KSwgZjZfKGY2KSwgZjdfKGY3KSwgZjhfKGY4KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfOV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfOV9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfOV9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICBmNl8gPSB0LmY2XzsKKyAgICBmN18gPSB0LmY3XzsKKyAgICBmOF8gPSB0LmY4XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworICBUNiBmNl87CisgIFQ3IGY3XzsKKyAgVDggZjhfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitjbGFzcyB0dXBsZSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCksIGY4XygpLAorICAgICAgZjlfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LCBHVEVTVF9CWV9SRUZfKFQ3KSBmNywKKyAgICAgIEdURVNUX0JZX1JFRl8oVDgpIGY4LCBHVEVTVF9CWV9SRUZfKFQ5KSBmOSkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLAorICAgICAgZjNfKGYzKSwgZjRfKGY0KSwgZjVfKGY1KSwgZjZfKGY2KSwgZjdfKGY3KSwgZjhfKGY4KSwgZjlfKGY5KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pLCBmOV8odC5mOV8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSwKKyAgICAgIGY5Xyh0LmY5Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgZjVfID0gdC5mNV87CisgICAgZjZfID0gdC5mNl87CisgICAgZjdfID0gdC5mN187CisgICAgZjhfID0gdC5mOF87CisgICAgZjlfID0gdC5mOV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87CisgIFQ1IGY1XzsKKyAgVDYgZjZfOworICBUNyBmN187CisgIFQ4IGY4XzsKKyAgVDkgZjlfOworfTsKKworLy8gNi4xLjMuMiBUdXBsZSBjcmVhdGlvbiBmdW5jdGlvbnMuCisKKy8vIEtub3duIGxpbWl0YXRpb25zOiB3ZSBkb24ndCBzdXBwb3J0IHBhc3NpbmcgYW4KKy8vIHN0ZDo6dHIxOjpyZWZlcmVuY2Vfd3JhcHBlcjxUPiB0byBtYWtlX3R1cGxlKCkuICBBbmQgd2UgZG9uJ3QKKy8vIGltcGxlbWVudCB0aWUoKS4KKworaW5saW5lIHR1cGxlPD4gbWFrZV90dXBsZSgpIHsgcmV0dXJuIHR1cGxlPD4oKTsgfQorCit0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzFfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwKSB7CisgIHJldHVybiBHVEVTVF8xX1RVUExFXyhUKShmMCk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfMl9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSkgeworICByZXR1cm4gR1RFU1RfMl9UVVBMRV8oVCkoZjAsIGYxKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8zX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIpIHsKKyAgcmV0dXJuIEdURVNUXzNfVFVQTEVfKFQpKGYwLCBmMSwgZjIpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzRfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMpIHsKKyAgcmV0dXJuIEdURVNUXzRfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF81X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQpIHsKKyAgcmV0dXJuIEdURVNUXzVfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfNl9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUpIHsKKyAgcmV0dXJuIEdURVNUXzZfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzdfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYpIHsKKyAgcmV0dXJuIEdURVNUXzdfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF84X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2LCBjb25zdCBUNyYgZjcpIHsKKyAgcmV0dXJuIEdURVNUXzhfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNyk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfOV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LAorICAgIGNvbnN0IFQ4JiBmOCkgeworICByZXR1cm4gR1RFU1RfOV9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzEwX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2LCBjb25zdCBUNyYgZjcsCisgICAgY29uc3QgVDgmIGY4LCBjb25zdCBUOSYgZjkpIHsKKyAgcmV0dXJuIEdURVNUXzEwX1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4LCBmOSk7Cit9CisKKy8vIDYuMS4zLjMgVHVwbGUgaGVscGVyIGNsYXNzZXMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4gc3RydWN0IHR1cGxlX3NpemU7CisKK3RlbXBsYXRlIDxHVEVTVF8wX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8wX1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDA7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMV9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxOworfTsKKwordGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzJfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMjsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8zX1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDM7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNF9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA0OworfTsKKwordGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzVfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNTsKK307CisKK3RlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF82X1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDY7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfN19UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA3OworfTsKKwordGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzhfVFVQTEVfKFQpID4geworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gODsKK307CisKK3RlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF85X1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDk7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzEwX1RVUExFXyhUKSA+IHsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDEwOworfTsKKwordGVtcGxhdGUgPGludCBrLCBjbGFzcyBUdXBsZT4KK3N0cnVjdCB0dXBsZV9lbGVtZW50IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBndGVzdF9pbnRlcm5hbDo6VHVwbGVFbGVtZW50PAorICAgICAgayA8ICh0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpLCBrLCBUdXBsZT46OnR5cGUgdHlwZTsKK307CisKKyNkZWZpbmUgR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgVHVwbGUpIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8aywgVHVwbGUgPjo6dHlwZQorCisvLyA2LjEuMy40IEVsZW1lbnQgYWNjZXNzLgorCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDA+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDAsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjBfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDAsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMF87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8MT4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMSwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMV87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMSwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYxXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwyPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygyLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYyXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygyLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjJfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDM+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDMsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjNfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDMsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mM187IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8ND4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNCwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNF87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNCwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY0XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw1PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg1LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY1XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg1LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjVfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDY+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDYsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjZfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDYsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNl87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Nz4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNywgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mN187IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNywgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY3XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw4PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg4LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY4XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg4LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjhfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDk+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDksIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjlfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDksIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mOV87IH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8aW50IGssIEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBHVEVTVF8xMF9UVVBMRV8oVCkpKQorZ2V0KEdURVNUXzEwX1RVUExFXyhUKSYgdCkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6RmllbGQodCk7Cit9CisKK3RlbXBsYXRlIDxpbnQgaywgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK0dURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgIEdURVNUXzEwX1RVUExFXyhUKSkpCitnZXQoY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6R2V0PGs+OjpDb25zdEZpZWxkKHQpOworfQorCisvLyA2LjEuMy41IFJlbGF0aW9uYWwgb3BlcmF0b3JzCisKKy8vIFdlIG9ubHkgaW1wbGVtZW50ID09IGFuZCAhPSwgYXMgd2UgZG9uJ3QgaGF2ZSBhIG5lZWQgZm9yIHRoZSByZXN0IHlldC4KKworbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKworLy8gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8aywgaz46OkVxKHQxLCB0MikgcmV0dXJucyB0cnVlIGlmIHRoZQorLy8gZmlyc3QgayBmaWVsZHMgb2YgdDEgZXF1YWxzIHRoZSBmaXJzdCBrIGZpZWxkcyBvZiB0Mi4KKy8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yKGsxLCBrMikgd291bGQgYmUgYSBjb21waWxlciBlcnJvciBpZgorLy8gazEgIT0gazIuCit0ZW1wbGF0ZSA8aW50IGtTaXplMSwgaW50IGtTaXplMj4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwwLCAwPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZTEsIGNsYXNzIFR1cGxlMj4KKyAgc3RhdGljIGJvb2wgRXEoY29uc3QgVHVwbGUxJiAvKiB0MSAqLywgY29uc3QgVHVwbGUyJiAvKiB0MiAqLykgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8aW50IGs+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8aywgaz4geworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+CisgIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgdDEsIGNvbnN0IFR1cGxlMiYgdDIpIHsKKyAgICByZXR1cm4gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8ayAtIDEsIGsgLSAxPjo6RXEodDEsIHQyKSAmJgorICAgICAgICA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQxKSA9PSA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQyKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVCkmIHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdSkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OlNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPAorICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVCkgPjo6dmFsdWUsCisgICAgICB0dXBsZV9zaXplPEdURVNUXzEwX1RVUExFXyhVKSA+Ojp2YWx1ZT46OkVxKHQsIHUpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKSwgR1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHUpIHsgcmV0dXJuICEodCA9PSB1KTsgfQorCisvLyA2LjEuNCBQYWlycy4KKy8vIFVuaW1wbGVtZW50ZWQuCisKK30gIC8vIG5hbWVzcGFjZSB0cjEKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworI3VuZGVmIEdURVNUXzBfVFVQTEVfCisjdW5kZWYgR1RFU1RfMV9UVVBMRV8KKyN1bmRlZiBHVEVTVF8yX1RVUExFXworI3VuZGVmIEdURVNUXzNfVFVQTEVfCisjdW5kZWYgR1RFU1RfNF9UVVBMRV8KKyN1bmRlZiBHVEVTVF81X1RVUExFXworI3VuZGVmIEdURVNUXzZfVFVQTEVfCisjdW5kZWYgR1RFU1RfN19UVVBMRV8KKyN1bmRlZiBHVEVTVF84X1RVUExFXworI3VuZGVmIEdURVNUXzlfVFVQTEVfCisjdW5kZWYgR1RFU1RfMTBfVFVQTEVfCisKKyN1bmRlZiBHVEVTVF8wX1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF8xX1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF8yX1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF8zX1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF80X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF81X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF82X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF83X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF84X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF85X1RZUEVOQU1FU18KKyN1bmRlZiBHVEVTVF8xMF9UWVBFTkFNRVNfCisKKyN1bmRlZiBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKyN1bmRlZiBHVEVTVF9CWV9SRUZfCisjdW5kZWYgR1RFU1RfQUREX1JFRl8KKyN1bmRlZiBHVEVTVF9UVVBMRV9FTEVNRU5UXworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjlkZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wCkBAIC0wLDAgKzEsMzQ3IEBACiskJCAtKi0gbW9kZTogYysrOyAtKi0KKyR2YXIgbiA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiB0dXBsZSBmaWVsZHMgd2Ugd2FudCB0byBzdXBwb3J0LgorJCQgVGhpcyBtZXRhIGNvbW1lbnQgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBpbiBFbWFjcy4gfX0KKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3IgOjpzdGQ6OnBhaXIuCisKKy8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlCisvLyB0dXBsZSB0ZW1wbGF0ZSBhcyBhIGZyaWVuZCAoaXQgY29tcGxhaW5zIHRoYXQgdHVwbGUgaXMgcmVkZWZpbmVkKS4gIFRoaXMKKy8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlCisvLyBwcml2YXRlIGFzIHB1YmxpYy4KKy8vIFN1biBTdHVkaW8gdmVyc2lvbnMgPCAxMiBhbHNvIGhhdmUgdGhlIGFib3ZlIGJ1Zy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXAorICAgIHRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVSk+IGZyaWVuZCBjbGFzcyB0dXBsZTsgXAorICAgcHJpdmF0ZToKKyNlbmRpZgorCisvLyBWaXN1YWwgU3R1ZGlvIDIwMTAsIDIwMTIsIGFuZCAyMDEzIGRlZmluZSBzeW1ib2xzIGluIHN0ZDo6dHIxIHRoYXQgY29uZmxpY3QKKy8vIHdpdGggb3VyIG93biBkZWZpbml0aW9ucy4gVGhlcmVmb3JlIHVzaW5nIG91ciBvd24gdHVwbGUgZG9lcyBub3Qgd29yayBvbgorLy8gdGhvc2UgY29tcGlsZXJzLgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE2MDAgIC8qIDE2MDAgaXMgVmlzdWFsIFN0dWRpbyAyMDEwICovCisjIGVycm9yICJndGVzdCdzIHR1cGxlIGRvZXNuJ3QgY29tcGlsZSBvbiBWaXN1YWwgU3R1ZGlvIDIwMTAgb3IgbGF0ZXIuIFwKK0dURVNUX1VTRV9PV05fVFIxX1RVUExFIG11c3QgYmUgc2V0IHRvIDAgb24gdGhvc2UgY29tcGlsZXJzLiIKKyNlbmRpZgorCisKKyRyYW5nZSBpIDAuLm4tMQorJHJhbmdlIGogMC4ubgorJHJhbmdlIGsgMS4ubgorLy8gR1RFU1Rfbl9UVVBMRV8oVCkgaXMgdGhlIHR5cGUgb2YgYW4gbi10dXBsZS4KKyNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8PgorCiskZm9yIGsgW1sKKyRyYW5nZSBtIDAuLmstMQorJHJhbmdlIG0yIGsuLm4tMQorI2RlZmluZSBHVEVTVF8kKGspX1RVUExFXyhUKSB0dXBsZTwkZm9yIG0sIFtbVCMjJG1dXSRmb3IgbTIgW1ssIHZvaWRdXT4KKworXV0KKworLy8gR1RFU1Rfbl9UWVBFTkFNRVNfKFQpIGRlY2xhcmVzIGEgbGlzdCBvZiBuIHR5cGVuYW1lcy4KKworJGZvciBqIFtbCiskcmFuZ2UgbSAwLi5qLTEKKyNkZWZpbmUgR1RFU1RfJChqKV9UWVBFTkFNRVNfKFQpICRmb3IgbSwgW1t0eXBlbmFtZSBUIyMkbV1dCisKKworXV0KKworLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZAorLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkCisvLyBsaWJyYXJ5IHZlbmRvci4KK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIHRyMSB7CisKK3RlbXBsYXRlIDwkZm9yIGksIFtbdHlwZW5hbWUgVCRpID0gdm9pZF1dPgorY2xhc3MgdHVwbGU7CisKKy8vIEFueXRoaW5nIGluIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCBpcyBHb29nbGUgVGVzdCdzIElOVEVSTkFMCisvLyBJTVBMRU1FTlRBVElPTiBERVRBSUwgYW5kIE1VU1QgTk9UIEJFIFVTRUQgRElSRUNUTFkgaW4gdXNlciBjb2RlLgorbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKworLy8gQnlSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBjb25zdCBUJi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ5UmVmIHsgdHlwZWRlZiBjb25zdCBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCeVJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGZvciBCeVJlZi4KKyNkZWZpbmUgR1RFU1RfQllfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QnlSZWY8VD46OnR5cGUKKworLy8gQWRkUmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgVCYuICBUaGlzCisvLyBpcyB0aGUgc2FtZSBhcyB0cjE6OmFkZF9yZWZlcmVuY2U8VD46OnR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWYgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKKworLy8gQSBoYW5keSB3cmFwcGVyIGZvciBBZGRSZWYuCisjZGVmaW5lIEdURVNUX0FERF9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpBZGRSZWY8VD46OnR5cGUKKworLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyBnZXQ8az4oKS4KK3RlbXBsYXRlIDxpbnQgaz4gY2xhc3MgR2V0OworCisvLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIHR1cGxlX2VsZW1lbnQ8aywgVD4uICBrSW5kZXhWYWxpZCBpcyB0cnVlCisvLyBpZmYgayA8IHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlIHR5cGUgVC4KK3RlbXBsYXRlIDxib29sIGtJbmRleFZhbGlkLCBpbnQga0luZGV4LCBjbGFzcyBUdXBsZT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ7CisKKworJGZvciBpIFtbCit0ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAkaSwgR1RFU1RfJChuKV9UVVBMRV8oVCkgPiB7CisgIHR5cGVkZWYgVCRpIHR5cGU7Cit9OworCisKK11dCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPD4KK2NsYXNzIHR1cGxlPD4geworIHB1YmxpYzoKKyAgdHVwbGUoKSB7fQorICB0dXBsZShjb25zdCB0dXBsZSYgLyogdCAqLykgIHt9CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIC8qIHQgKi8pIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCisKKyRmb3IgayBbWworJHJhbmdlIG0gMC4uay0xCit0ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFQpPgorY2xhc3MgJGlmIGsgPCBuIFtbR1RFU1RfJChrKV9UVVBMRV8oVCldXSAkZWxzZSBbW3R1cGxlXV0geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogJGZvciBtLCBbW2YkKG0pXygpXV0ge30KKworICBleHBsaWNpdCB0dXBsZSgkZm9yIG0sIFtbR1RFU1RfQllfUkVGXyhUJG0pIGYkbV1dKSA6IFtbXV0KKyRmb3IgbSwgW1tmJChtKV8oZiRtKV1dIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogJGZvciBtLCBbW2YkKG0pXyh0LmYkKG0pXyldXSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXyQoaylfVFVQTEVfKFUpJiB0KSA6ICRmb3IgbSwgW1tmJChtKV8odC5mJChtKV8pXV0ge30KKworJGlmIGsgPT0gMiBbWworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgorICB0dXBsZShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSA6IGYwXyhwLmZpcnN0KSwgZjFfKHAuc2Vjb25kKSB7fQorCitdXQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8kKGspX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCiskaWYgayA9PSAyIFtbCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgeworICAgIGYwXyA9IHAuZmlyc3Q7CisgICAgZjFfID0gcC5zZWNvbmQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK11dCisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXyQoaylfVFVQTEVfKFUpJiB0KSB7CisKKyRmb3IgbSBbWworICAgIGYkKG0pXyA9IHQuZiQobSlfOworCitdXQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisKKyRmb3IgbSBbWworICBUJG0gZiQobSlfOworCitdXQorfTsKKworCitdXQorLy8gNi4xLjMuMiBUdXBsZSBjcmVhdGlvbiBmdW5jdGlvbnMuCisKKy8vIEtub3duIGxpbWl0YXRpb25zOiB3ZSBkb24ndCBzdXBwb3J0IHBhc3NpbmcgYW4KKy8vIHN0ZDo6dHIxOjpyZWZlcmVuY2Vfd3JhcHBlcjxUPiB0byBtYWtlX3R1cGxlKCkuICBBbmQgd2UgZG9uJ3QKKy8vIGltcGxlbWVudCB0aWUoKS4KKworaW5saW5lIHR1cGxlPD4gbWFrZV90dXBsZSgpIHsgcmV0dXJuIHR1cGxlPD4oKTsgfQorCiskZm9yIGsgW1sKKyRyYW5nZSBtIDAuLmstMQorCit0ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXyQoaylfVFVQTEVfKFQpIG1ha2VfdHVwbGUoJGZvciBtLCBbW2NvbnN0IFQkbSYgZiRtXV0pIHsKKyAgcmV0dXJuIEdURVNUXyQoaylfVFVQTEVfKFQpKCRmb3IgbSwgW1tmJG1dXSk7Cit9CisKK11dCisKKy8vIDYuMS4zLjMgVHVwbGUgaGVscGVyIGNsYXNzZXMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4gc3RydWN0IHR1cGxlX3NpemU7CisKKworJGZvciBqIFtbCit0ZW1wbGF0ZSA8R1RFU1RfJChqKV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfJChqKV9UVVBMRV8oVCkgPiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAkajsKK307CisKKworXV0KK3RlbXBsYXRlIDxpbnQgaywgY2xhc3MgVHVwbGU+CitzdHJ1Y3QgdHVwbGVfZWxlbWVudCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgZ3Rlc3RfaW50ZXJuYWw6OlR1cGxlRWxlbWVudDwKKyAgICAgIGsgPCAodHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKSwgaywgVHVwbGU+Ojp0eXBlIHR5cGU7Cit9OworCisjZGVmaW5lIEdURVNUX1RVUExFX0VMRU1FTlRfKGssIFR1cGxlKSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PGssIFR1cGxlID46OnR5cGUKKworLy8gNi4xLjMuNCBFbGVtZW50IGFjY2Vzcy4KKworbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKworCiskZm9yIGkgW1sKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8JGk+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKCRpLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYkKGkpXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygkaSwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYkKGkpXzsgfQorfTsKKworCitdXQorfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCisKK3RlbXBsYXRlIDxpbnQgaywgR1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpPgorR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgR1RFU1RfJChuKV9UVVBMRV8oVCkpKQorZ2V0KEdURVNUXyQobilfVFVQTEVfKFQpJiB0KSB7CisgIHJldHVybiBndGVzdF9pbnRlcm5hbDo6R2V0PGs+OjpGaWVsZCh0KTsKK30KKwordGVtcGxhdGUgPGludCBrLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCk+CitHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssICBHVEVTVF8kKG4pX1RVUExFXyhUKSkpCitnZXQoY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkNvbnN0RmllbGQodCk7Cit9CisKKy8vIDYuMS4zLjUgUmVsYXRpb25hbCBvcGVyYXRvcnMKKworLy8gV2Ugb25seSBpbXBsZW1lbnQgPT0gYW5kICE9LCBhcyB3ZSBkb24ndCBoYXZlIGEgbmVlZCBmb3IgdGhlIHJlc3QgeWV0LgorCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCisvLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPjo6RXEodDEsIHQyKSByZXR1cm5zIHRydWUgaWYgdGhlCisvLyBmaXJzdCBrIGZpZWxkcyBvZiB0MSBlcXVhbHMgdGhlIGZpcnN0IGsgZmllbGRzIG9mIHQyLgorLy8gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3IoazEsIGsyKSB3b3VsZCBiZSBhIGNvbXBpbGVyIGVycm9yIGlmCisvLyBrMSAhPSBrMi4KK3RlbXBsYXRlIDxpbnQga1NpemUxLCBpbnQga1NpemUyPgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yOworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPDAsIDA+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgorICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIC8qIHQxICovLCBjb25zdCBUdXBsZTImIC8qIHQyICovKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDxpbnQgaz4KK3N0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPiB7CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZTEsIGNsYXNzIFR1cGxlMj4KKyAgc3RhdGljIGJvb2wgRXEoY29uc3QgVHVwbGUxJiB0MSwgY29uc3QgVHVwbGUyJiB0MikgeworICAgIHJldHVybiBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrIC0gMSwgayAtIDE+OjpFcSh0MSwgdDIpICYmCisgICAgICAgIDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDEpID09IDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDIpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPEdURVNUXyQobilfVFlQRU5BTUVTXyhUKSwgR1RFU1RfJChuKV9UWVBFTkFNRVNfKFUpPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVSkmIHUpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwKKyAgICAgIHR1cGxlX3NpemU8R1RFU1RfJChuKV9UVVBMRV8oVCkgPjo6dmFsdWUsCisgICAgICB0dXBsZV9zaXplPEdURVNUXyQobilfVFVQTEVfKFUpID46OnZhbHVlPjo6RXEodCwgdSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCksIEdURVNUXyQobilfVFlQRU5BTUVTXyhVKT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0KKworLy8gNi4xLjQgUGFpcnMuCisvLyBVbmltcGxlbWVudGVkLgorCit9ICAvLyBuYW1lc3BhY2UgdHIxCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKworJGZvciBqIFtbCisjdW5kZWYgR1RFU1RfJChqKV9UVVBMRV8KKworXV0KKworCiskZm9yIGogW1sKKyN1bmRlZiBHVEVTVF8kKGopX1RZUEVOQU1FU18KKworXV0KKworI3VuZGVmIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworI3VuZGVmIEdURVNUX0JZX1JFRl8KKyN1bmRlZiBHVEVTVF9BRERfUkVGXworI3VuZGVmIEdURVNUX1RVUExFX0VMRU1FTlRfCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZmN2NmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKQEAgLTAsMCArMSwzMzMxIEBACisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHlwZS11dGlsLmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFR5cGUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHR5cGVkIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQKKy8vIHRlc3RzLiAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gQ3VycmVudGx5IHdlIHN1cHBvcnQgYXQgbW9zdCA1MCB0eXBlcyBpbiBhIGxpc3QsIGFuZCBhdCBtb3N0IDUwCisvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW4gb25lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyBQbGVhc2UgY29udGFjdCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKKy8vIG1vcmUuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworLy8gI2lmZGVmIF9fR05VQ19fIGlzIHRvbyBnZW5lcmFsIGhlcmUuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgZ2NjIHdpdGhvdXQgdXNpbmcKKy8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuCisjIGlmIEdURVNUX0hBU19DWFhBQklfSF8KKyMgIGluY2x1ZGUgPGN4eGFiaS5oPgorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisjICBpbmNsdWRlIDxhY3h4X2RlbWFuZ2xlLmg+CisjIGVuZGlmICAvLyBHVEVTVF9IQVNIX0NYWEFCSV9IXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KKy8vIE5COiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBpbiBHb29nbGUgTW9jaywgc28gZG9uJ3QgbW92ZSBpdCBpbnNpZGUgb2YKKy8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSB7CisjIGlmIEdURVNUX0hBU19SVFRJCisKKyAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7CisjICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IGRlZmluZWQoX19IUF9hQ0MpCisgIGludCBzdGF0dXMgPSAwOworICAvLyBnY2MncyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlaWQoVCkubmFtZSgpIG1hbmdsZXMgdGhlIHR5cGUgbmFtZSwKKyAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4KKyMgICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCisgIHVzaW5nIGFiaTo6X19jeGFfZGVtYW5nbGU7CisjICAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8KKyAgY2hhciogY29uc3QgcmVhZGFibGVfbmFtZSA9IF9fY3hhX2RlbWFuZ2xlKG5hbWUsIDAsIDAsICZzdGF0dXMpOworICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lX3N0cihzdGF0dXMgPT0gMCA/IHJlYWRhYmxlX25hbWUgOiBuYW1lKTsKKyAgZnJlZShyZWFkYWJsZV9uYW1lKTsKKyAgcmV0dXJuIG5hbWVfc3RyOworIyAgZWxzZQorICByZXR1cm4gbmFtZTsKKyMgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IF9fSFBfYUNDCisKKyMgZWxzZQorCisgIHJldHVybiAiPHR5cGU+IjsKKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKK30KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUKKy8vIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY29tcGlsZS10aW1lIGFzc2VydGlvbiB0byBlbnN1cmUgdGhhdAorLy8gdHdvIHR5cGVzIGFyZSBlcXVhbC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBBc3NlcnRUeXBlRXE7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFzc2VydFR5cGVFcTxULCBUPiB7CisgIHR5cGVkZWYgYm9vbCB0eXBlOworfTsKKworLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzCisvLyB0ZW1wbGF0ZSBUeXBlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlIHZhcmlhZGljIHRlbXBsYXRlcworLy8gKGUuZy4gVHlwZXM8aW50PiwgVHlwZTxpbnQsIGRvdWJsZT4sIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndAorLy8gc3VwcG9ydCBkaXJlY3RseS4KK3N0cnVjdCBOb25lIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KKy8vIHJlcHJlc2VudCB0eXBlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVHlwZXNOPFQxLCBUMiwgLi4uLCBUTj4KKy8vIHJlcHJlc2VudHMgYSB0eXBlIGxpc3Qgd2l0aCBOIHR5cGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKSBpbiBpdC4KKy8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBsaXN0LCBhbmQgVGFpbCBmb3IgdGhlIHJlc3Qgb2YgdGhlCisvLyBsaXN0LgorCisvLyBUaGUgZW1wdHkgdHlwZSBsaXN0Lgorc3RydWN0IFR5cGVzMCB7fTsKKworLy8gVHlwZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitzdHJ1Y3QgVHlwZXMxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgVHlwZXMyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTxUMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorc3RydWN0IFR5cGVzMyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI8VDIsIFQzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgorc3RydWN0IFR5cGVzNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM8VDIsIFQzLCBUND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CitzdHJ1Y3QgVHlwZXM1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitzdHJ1Y3QgVHlwZXM2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK3N0cnVjdCBUeXBlczcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitzdHJ1Y3QgVHlwZXM4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitzdHJ1Y3QgVHlwZXM5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitzdHJ1Y3QgVHlwZXMxMCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorc3RydWN0IFR5cGVzMTEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgorc3RydWN0IFR5cGVzMTIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK3N0cnVjdCBUeXBlczEzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pgorc3RydWN0IFR5cGVzMTQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgorc3RydWN0IFR5cGVzMTUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNj4KK3N0cnVjdCBUeXBlczE2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgorc3RydWN0IFR5cGVzMTcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgorc3RydWN0IFR5cGVzMTggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KK3N0cnVjdCBUeXBlczE5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgorc3RydWN0IFR5cGVzMjAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjE+CitzdHJ1Y3QgVHlwZXMyMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+CitzdHJ1Y3QgVHlwZXMyMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgorc3RydWN0IFR5cGVzMjMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+CitzdHJ1Y3QgVHlwZXMyNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitzdHJ1Y3QgVHlwZXMyNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjY+CitzdHJ1Y3QgVHlwZXMyNiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3Pgorc3RydWN0IFR5cGVzMjcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitzdHJ1Y3QgVHlwZXMyOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+CitzdHJ1Y3QgVHlwZXMyOSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK3N0cnVjdCBUeXBlczMwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorc3RydWN0IFR5cGVzMzEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgorc3RydWN0IFR5cGVzMzIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KK3N0cnVjdCBUeXBlczMzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0Pgorc3RydWN0IFR5cGVzMzQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pgorc3RydWN0IFR5cGVzMzUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2Pgorc3RydWN0IFR5cGVzMzYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK3N0cnVjdCBUeXBlczM3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pgorc3RydWN0IFR5cGVzMzggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pgorc3RydWN0IFR5cGVzMzkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK3N0cnVjdCBUeXBlczQwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitzdHJ1Y3QgVHlwZXM0MSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KK3N0cnVjdCBUeXBlczQyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK3N0cnVjdCBUeXBlczQzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pgorc3RydWN0IFR5cGVzNDQgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgorc3RydWN0IFR5cGVzNDUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2Pgorc3RydWN0IFR5cGVzNDYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK3N0cnVjdCBUeXBlczQ3IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pgorc3RydWN0IFR5cGVzNDggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgorc3RydWN0IFR5cGVzNDkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK3N0cnVjdCBUeXBlczUwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVHlwZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoCisvLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCisvLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKKy8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+CisvLyB3aWxsIGFwcGVhciBhcyBUeXBlczxpbnQsIE5vbmUsIE5vbmUsIC4uLiwgTm9uZT4gaW4gdGhlIGNvbXBpbGVyCisvLyBlcnJvcnMpLgorLy8KKy8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCisvLyB1c2VyIHdvdWxkIHdyaXRlIFR5cGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCisvLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQorLy8gVHlwZXMgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDEzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDE5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDI1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDMwID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDMxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDM3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0NSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ1MCA9IGludGVybmFsOjpOb25lPgorc3RydWN0IFR5cGVzIHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVHlwZXM8aW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3N0cnVjdCBUeXBlczxUMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxPFQxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjxUMSwgVDI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM8VDEsIFQyLCBUMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzE+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0Mj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBUNDcsIFQ0OCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAorICAgIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzCisKKy8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvCisvLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUKKy8vIHBhcmFtZXRlciwgYXMgYSB0eXBlLiAgVGVtcGxhdGVTZWw8VG1wbD46OkJpbmQ8VD46OnR5cGUgaXMgZGVmaW5lZAorLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQorLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4KKy8vCisvLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsCisvLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUbXBsPgorc3RydWN0IFRlbXBsYXRlU2VsIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBCaW5kIHsKKyAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsKKyAgfTsKK307CisKKyMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKKyAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQorCisvLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisvLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKKy8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKKy8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTm9uZVQge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKKy8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKKy8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCisvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgorc3RydWN0IFRlbXBsYXRlczAge307CisKKy8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+CitzdHJ1Y3QgVGVtcGxhdGVzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4KK3N0cnVjdCBUZW1wbGF0ZXMyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+CitzdHJ1Y3QgVGVtcGxhdGVzMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjxUMiwgVDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzxUMiwgVDMsIFQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzNSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+CitzdHJ1Y3QgVGVtcGxhdGVzNiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNz4KK3N0cnVjdCBUZW1wbGF0ZXM3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+CitzdHJ1Y3QgVGVtcGxhdGVzOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMD4KK3N0cnVjdCBUZW1wbGF0ZXMxMCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPgorc3RydWN0IFRlbXBsYXRlczExIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+CitzdHJ1Y3QgVGVtcGxhdGVzMTIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+CitzdHJ1Y3QgVGVtcGxhdGVzMTMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KK3N0cnVjdCBUZW1wbGF0ZXMxNCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgorc3RydWN0IFRlbXBsYXRlczE1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczE2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+CitzdHJ1Y3QgVGVtcGxhdGVzMTcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgorc3RydWN0IFRlbXBsYXRlczE4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzMTkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgorc3RydWN0IFRlbXBsYXRlczIwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgorc3RydWN0IFRlbXBsYXRlczIxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXMyMiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KK3N0cnVjdCBUZW1wbGF0ZXMyMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgorc3RydWN0IFRlbXBsYXRlczI0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczI1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+CitzdHJ1Y3QgVGVtcGxhdGVzMjYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgorc3RydWN0IFRlbXBsYXRlczI3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjg+CitzdHJ1Y3QgVGVtcGxhdGVzMjggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXMyOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzMzAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KK3N0cnVjdCBUZW1wbGF0ZXMzMSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+CitzdHJ1Y3QgVGVtcGxhdGVzMzIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzMzMgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgorc3RydWN0IFRlbXBsYXRlczM0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgorc3RydWN0IFRlbXBsYXRlczM1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzMzYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+CitzdHJ1Y3QgVGVtcGxhdGVzMzcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KK3N0cnVjdCBUZW1wbGF0ZXMzOCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzMzkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KK3N0cnVjdCBUZW1wbGF0ZXM0MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+CitzdHJ1Y3QgVGVtcGxhdGVzNDEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+CitzdHJ1Y3QgVGVtcGxhdGVzNDIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0Mj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM0MyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzNDQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+CitzdHJ1Y3QgVGVtcGxhdGVzNDUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczQ2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczQ3IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+CitzdHJ1Y3QgVGVtcGxhdGVzNDggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzNDkgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0OSwgR1RFU1RfVEVNUExBVEVfIFQ1MD4KK3N0cnVjdCBUZW1wbGF0ZXM1MCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKK307CisKKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVGVtcGxhdGVzPC4uLj4gaXMgbXVjaAorLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQorLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCisvLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVGVtcGxhdGVzPGxpc3Q+CisvLyB3aWxsIGFwcGVhciBhcyBUZW1wbGF0ZXM8bGlzdCwgTm9uZVQsIE5vbmVULCAuLi4sIE5vbmVUPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFRlbXBsYXRlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcworLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKKy8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ4ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDExID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDAgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDQgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDYgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNTAgPSBOb25lVD4KK3N0cnVjdCBUZW1wbGF0ZXMgeworICB0eXBlZGVmIFRlbXBsYXRlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUZW1wbGF0ZXM8Tm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTxUMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyPFQxLCBUMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQxLCBUMiwgVDM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjk+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0Mz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCisgICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Cit9OworCisvLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCisvLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKKy8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVMaXN0IHsKKyAgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK3N0cnVjdCBUeXBlTGlzdDxUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+Ojp0eXBlIHR5cGU7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTFmZGYwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcApAQCAtMCwwICsxLDI5NyBAQAorJCQgLSotIG1vZGU6IGMrKzsgLSotCiskdmFyIG4gPSA1MCAgJCQgTWF4aW11bSBsZW5ndGggb2YgdHlwZSBsaXN0cyB3ZSB3YW50IHRvIHN1cHBvcnQuCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFR5cGUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHR5cGVkIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQKKy8vIHRlc3RzLiAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gQ3VycmVudGx5IHdlIHN1cHBvcnQgYXQgbW9zdCAkbiB0eXBlcyBpbiBhIGxpc3QsIGFuZCBhdCBtb3N0ICRuCisvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW4gb25lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyBQbGVhc2UgY29udGFjdCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKKy8vIG1vcmUuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworLy8gI2lmZGVmIF9fR05VQ19fIGlzIHRvbyBnZW5lcmFsIGhlcmUuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgZ2NjIHdpdGhvdXQgdXNpbmcKKy8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuCisjIGlmIEdURVNUX0hBU19DWFhBQklfSF8KKyMgIGluY2x1ZGUgPGN4eGFiaS5oPgorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisjICBpbmNsdWRlIDxhY3h4X2RlbWFuZ2xlLmg+CisjIGVuZGlmICAvLyBHVEVTVF9IQVNIX0NYWEFCSV9IXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KKy8vIE5COiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBpbiBHb29nbGUgTW9jaywgc28gZG9uJ3QgbW92ZSBpdCBpbnNpZGUgb2YKKy8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSB7CisjIGlmIEdURVNUX0hBU19SVFRJCisKKyAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7CisjICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IGRlZmluZWQoX19IUF9hQ0MpCisgIGludCBzdGF0dXMgPSAwOworICAvLyBnY2MncyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlaWQoVCkubmFtZSgpIG1hbmdsZXMgdGhlIHR5cGUgbmFtZSwKKyAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4KKyMgICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCisgIHVzaW5nIGFiaTo6X19jeGFfZGVtYW5nbGU7CisjICAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8KKyAgY2hhciogY29uc3QgcmVhZGFibGVfbmFtZSA9IF9fY3hhX2RlbWFuZ2xlKG5hbWUsIDAsIDAsICZzdGF0dXMpOworICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lX3N0cihzdGF0dXMgPT0gMCA/IHJlYWRhYmxlX25hbWUgOiBuYW1lKTsKKyAgZnJlZShyZWFkYWJsZV9uYW1lKTsKKyAgcmV0dXJuIG5hbWVfc3RyOworIyAgZWxzZQorICByZXR1cm4gbmFtZTsKKyMgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IF9fSFBfYUNDCisKKyMgZWxzZQorCisgIHJldHVybiAiPHR5cGU+IjsKKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKK30KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUKKy8vIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY29tcGlsZS10aW1lIGFzc2VydGlvbiB0byBlbnN1cmUgdGhhdAorLy8gdHdvIHR5cGVzIGFyZSBlcXVhbC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBBc3NlcnRUeXBlRXE7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFzc2VydFR5cGVFcTxULCBUPiB7CisgIHR5cGVkZWYgYm9vbCB0eXBlOworfTsKKworLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzCisvLyB0ZW1wbGF0ZSBUeXBlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlIHZhcmlhZGljIHRlbXBsYXRlcworLy8gKGUuZy4gVHlwZXM8aW50PiwgVHlwZTxpbnQsIGRvdWJsZT4sIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndAorLy8gc3VwcG9ydCBkaXJlY3RseS4KK3N0cnVjdCBOb25lIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KKy8vIHJlcHJlc2VudCB0eXBlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVHlwZXNOPFQxLCBUMiwgLi4uLCBUTj4KKy8vIHJlcHJlc2VudHMgYSB0eXBlIGxpc3Qgd2l0aCBOIHR5cGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKSBpbiBpdC4KKy8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKKy8vIEhlYWQgZm9yIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBsaXN0LCBhbmQgVGFpbCBmb3IgdGhlIHJlc3Qgb2YgdGhlCisvLyBsaXN0LgorCisvLyBUaGUgZW1wdHkgdHlwZSBsaXN0Lgorc3RydWN0IFR5cGVzMCB7fTsKKworLy8gVHlwZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitzdHJ1Y3QgVHlwZXMxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMCBUYWlsOworfTsKKworJHJhbmdlIGkgMi4ubgorCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKyRyYW5nZSBrIDIuLmkKK3RlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+CitzdHJ1Y3QgVHlwZXMkaSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlcyQoaS0xKTwkZm9yIGssIFtbVCRrXV0+IFRhaWw7Cit9OworCisKK11dCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBXZSBkb24ndCB3YW50IHRvIHJlcXVpcmUgdGhlIHVzZXJzIHRvIHdyaXRlIFR5cGVzTjwuLi4+IGRpcmVjdGx5LAorLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFR5cGVzPC4uLj4gaXMgbXVjaAorLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQorLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCisvLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVHlwZXM8aW50PgorLy8gd2lsbCBhcHBlYXIgYXMgVHlwZXM8aW50LCBOb25lLCBOb25lLCAuLi4sIE5vbmU+IGluIHRoZSBjb21waWxlcgorLy8gZXJyb3JzKS4KKy8vCisvLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQorLy8gdXNlciB3b3VsZCB3cml0ZSBUeXBlczxUMSwgLi4uLCBUTj4sIGFuZCBHb29nbGUgVGVzdCB3aWxsIHRyYW5zbGF0ZQorLy8gdGhhdCB0byBUeXBlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcworLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKKy8vIFR5cGVzIHRlbXBsYXRlLgorCiskcmFuZ2UgaSAxLi5uCit0ZW1wbGF0ZSA8JGZvciBpLCBbW3R5cGVuYW1lIFQkaSA9IGludGVybmFsOjpOb25lXV0+CitzdHJ1Y3QgVHlwZXMgeworICB0eXBlZGVmIGludGVybmFsOjpUeXBlcyRuPCRmb3IgaSwgW1tUJGldXT4gdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVHlwZXM8JGZvciBpLCBbW2ludGVybmFsOjpOb25lXV0+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMwIHR5cGU7Cit9OworCiskcmFuZ2UgaSAxLi5uLTEKKyRmb3IgaSBbWworJHJhbmdlIGogMS4uaQorJHJhbmdlIGsgaSsxLi5uCit0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgorc3RydWN0IFR5cGVzPCRmb3IgaiwgW1tUJGpdXSRmb3Iga1tbLCBpbnRlcm5hbDo6Tm9uZV1dPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzJGk8JGZvciBqLCBbW1Qkal1dPiB0eXBlOworfTsKKworXV0KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworIyBkZWZpbmUgR1RFU1RfVEVNUExBVEVfIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcworCisvLyBUaGUgdGVtcGxhdGUgInNlbGVjdG9yIiBzdHJ1Y3QgVGVtcGxhdGVTZWw8VG1wbD4gaXMgdXNlZCB0bworLy8gcmVwcmVzZW50IFRtcGwsIHdoaWNoIG11c3QgYmUgYSBjbGFzcyB0ZW1wbGF0ZSB3aXRoIG9uZSB0eXBlCisvLyBwYXJhbWV0ZXIsIGFzIGEgdHlwZS4gIFRlbXBsYXRlU2VsPFRtcGw+OjpCaW5kPFQ+Ojp0eXBlIGlzIGRlZmluZWQKKy8vIGFzIHRoZSB0eXBlIFRtcGw8VD4uICBUaGlzIGFsbG93cyB1cyB0byBhY3R1YWxseSBpbnN0YW50aWF0ZSB0aGUKKy8vIHRlbXBsYXRlICJzZWxlY3RlZCIgYnkgVGVtcGxhdGVTZWw8VG1wbD4uCisvLworLy8gVGhpcyB0cmljayBpcyBuZWNlc3NhcnkgZm9yIHNpbXVsYXRpbmcgdHlwZWRlZiBmb3IgY2xhc3MgdGVtcGxhdGVzLAorLy8gd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4KK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVG1wbD4KK3N0cnVjdCBUZW1wbGF0ZVNlbCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgQmluZCB7CisgICAgdHlwZWRlZiBUbXBsPFQ+IHR5cGU7CisgIH07Cit9OworCisjIGRlZmluZSBHVEVTVF9CSU5EXyhUbXBsU2VsLCBUKSBcCisgIFRtcGxTZWw6OnRlbXBsYXRlIEJpbmQ8VD46OnR5cGUKKworLy8gQSB1bmlxdWUgc3RydWN0IHRlbXBsYXRlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQorLy8gYXJndW1lbnRzIG9mIGNsYXNzIHRlbXBsYXRlIFRlbXBsYXRlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlCisvLyB2YXJpYWRpYyB0ZW1wbGF0ZXMgKGUuZy4gVGVtcGxhdGVzPGludD4sIFRlbXBsYXRlczxpbnQsIGRvdWJsZT4sCisvLyBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IE5vbmVUIHt9OworCisvLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KKy8vIHJlcHJlc2VudCB0ZW1wbGF0ZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFRlbXBsYXRlc048VDEsIFQyLCAuLi4sCisvLyBUTj4gcmVwcmVzZW50cyBhIGxpc3Qgb2YgTiB0ZW1wbGF0ZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pLiAgRXhjZXB0CisvLyBmb3IgVGVtcGxhdGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6CisvLyBIZWFkIGZvciB0aGUgc2VsZWN0b3Igb2YgdGhlIGZpcnN0IHRlbXBsYXRlIGluIHRoZSBsaXN0LCBhbmQgVGFpbAorLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBsaXN0LgorCisvLyBUaGUgZW1wdHkgdGVtcGxhdGUgbGlzdC4KK3N0cnVjdCBUZW1wbGF0ZXMwIHt9OworCisvLyBUZW1wbGF0ZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgorCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgorc3RydWN0IFRlbXBsYXRlczEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczAgVGFpbDsKK307CisKKyRyYW5nZSBpIDIuLm4KKworJGZvciBpIFtbCiskcmFuZ2UgaiAxLi5pCiskcmFuZ2UgayAyLi5pCit0ZW1wbGF0ZSA8JGZvciBqLCBbW0dURVNUX1RFTVBMQVRFXyBUJGpdXT4KK3N0cnVjdCBUZW1wbGF0ZXMkaSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzJChpLTEpPCRmb3IgaywgW1tUJGtdXT4gVGFpbDsKK307CisKKworXV0KKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksCisvLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVGVtcGxhdGVzPC4uLj4gaXMgbXVjaAorLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQorLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCisvLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVGVtcGxhdGVzPGxpc3Q+CisvLyB3aWxsIGFwcGVhciBhcyBUZW1wbGF0ZXM8bGlzdCwgTm9uZVQsIE5vbmVULCAuLi4sIE5vbmVUPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCisvLyB0aGF0IHRvIFRlbXBsYXRlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcworLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKKy8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4KKworJHJhbmdlIGkgMS4ubgordGVtcGxhdGUgPCRmb3IgaSwgW1tHVEVTVF9URU1QTEFURV8gVCRpID0gTm9uZVRdXT4KK3N0cnVjdCBUZW1wbGF0ZXMgeworICB0eXBlZGVmIFRlbXBsYXRlcyRuPCRmb3IgaSwgW1tUJGldXT4gdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVGVtcGxhdGVzPCRmb3IgaSwgW1tOb25lVF1dPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMCB0eXBlOworfTsKKworJHJhbmdlIGkgMS4ubi0xCiskZm9yIGkgW1sKKyRyYW5nZSBqIDEuLmkKKyRyYW5nZSBrIGkrMS4ubgordGVtcGxhdGUgPCRmb3IgaiwgW1tHVEVTVF9URU1QTEFURV8gVCRqXV0+CitzdHJ1Y3QgVGVtcGxhdGVzPCRmb3IgaiwgW1tUJGpdXSRmb3Iga1tbLCBOb25lVF1dPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzJGk8JGZvciBqLCBbW1Qkal1dPiB0eXBlOworfTsKKworXV0KKworLy8gVGhlIFR5cGVMaXN0IHRlbXBsYXRlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBlaXRoZXIgYSBzaW5nbGUgdHlwZQorLy8gb3IgYSBUeXBlczwuLi4+IGxpc3QgaW4gVFlQRURfVEVTVF9DQVNFKCkgYW5kCisvLyBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUCgpLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBUeXBlTGlzdCB7CisgIHR5cGVkZWYgVHlwZXMxPFQ+IHR5cGU7Cit9OworCisKKyRyYW5nZSBpIDEuLm4KK3RlbXBsYXRlIDwkZm9yIGksIFtbdHlwZW5hbWUgVCRpXV0+CitzdHJ1Y3QgVHlwZUxpc3Q8VHlwZXM8JGZvciBpLCBbW1QkaV1dPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlczwkZm9yIGksIFtbVCRpXV0+Ojp0eXBlIHR5cGU7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbTQvYWN4X3B0aHJlYWQubTQgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbTQvYWN4X3B0aHJlYWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMjBkZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tNC9hY3hfcHRocmVhZC5tNApAQCAtMCwwICsxLDM2MyBAQAorIyBUaGlzIHdhcyByZXRyaWV2ZWQgZnJvbQorIyAgICBodHRwOi8vc3ZuLjBwb2ludGVyLmRlL3ZpZXd2Yy90cnVuay9jb21tb24vYWN4X3B0aHJlYWQubTQ/cmV2aXNpb249MTI3NyZyb290PWF2YWhpCisjIFNlZSBhbHNvIChwZXJoYXBzIGZvciBuZXcgdmVyc2lvbnM/KQorIyAgICBodHRwOi8vc3ZuLjBwb2ludGVyLmRlL3ZpZXd2Yy90cnVuay9jb21tb24vYWN4X3B0aHJlYWQubTQ/cm9vdD1hdmFoaQorIworIyBXZSd2ZSByZXdyaXR0ZW4gdGhlIGluY29uc2lzdGVuY3kgY2hlY2sgY29kZSAoZnJvbSBhdmFoaSksIHRvIHdvcmsKKyMgbW9yZSBicm9hZGx5LiAgSW4gcGFydGljdWxhciwgaXQgbm8gbG9uZ2VyIGFzc3VtZXMgbGQgYWNjZXB0cyAtemRlZnMuCisjIFRoaXMgY2F1c2VkIGEgcmVzdHJ1Y3Rpbmcgb2YgdGhlIGNvZGUsIGJ1dCB0aGUgZnVuY3Rpb25hbGl0eSBoYXMgb25seQorIyBjaGFuZ2VkIGEgbGl0dGxlLgorCitkbmwgQHN5bm9wc2lzIEFDWF9QVEhSRUFEKFtBQ1RJT04tSUYtRk9VTkRbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwKK2RubCBAc3VtbWFyeSBmaWd1cmUgb3V0IGhvdyB0byBidWlsZCBDIHByb2dyYW1zIHVzaW5nIFBPU0lYIHRocmVhZHMKK2RubAorZG5sIFRoaXMgbWFjcm8gZmlndXJlcyBvdXQgaG93IHRvIGJ1aWxkIEMgcHJvZ3JhbXMgdXNpbmcgUE9TSVggdGhyZWFkcy4KK2RubCBJdCBzZXRzIHRoZSBQVEhSRUFEX0xJQlMgb3V0cHV0IHZhcmlhYmxlIHRvIHRoZSB0aHJlYWRzIGxpYnJhcnkgYW5kCitkbmwgbGlua2VyIGZsYWdzLCBhbmQgdGhlIFBUSFJFQURfQ0ZMQUdTIG91dHB1dCB2YXJpYWJsZSB0byBhbnkgc3BlY2lhbAorZG5sIEMgY29tcGlsZXIgZmxhZ3MgdGhhdCBhcmUgbmVlZGVkLiAoVGhlIHVzZXIgY2FuIGFsc28gZm9yY2UgY2VydGFpbgorZG5sIGNvbXBpbGVyIGZsYWdzL2xpYnMgdG8gYmUgdGVzdGVkIGJ5IHNldHRpbmcgdGhlc2UgZW52aXJvbm1lbnQKK2RubCB2YXJpYWJsZXMuKQorZG5sCitkbmwgQWxzbyBzZXRzIFBUSFJFQURfQ0MgdG8gYW55IHNwZWNpYWwgQyBjb21waWxlciB0aGF0IGlzIG5lZWRlZCBmb3IKK2RubCBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcyAoZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIENDIG90aGVyd2lzZSkuCitkbmwgKFRoaXMgaXMgbmVjZXNzYXJ5IG9uIEFJWCB0byB1c2UgdGhlIHNwZWNpYWwgY2NfciBjb21waWxlciBhbGlhcy4pCitkbmwKK2RubCBOT1RFOiBZb3UgYXJlIGFzc3VtZWQgdG8gbm90IG9ubHkgY29tcGlsZSB5b3VyIHByb2dyYW0gd2l0aCB0aGVzZQorZG5sIGZsYWdzLCBidXQgYWxzbyBsaW5rIGl0IHdpdGggdGhlbSBhcyB3ZWxsLiBlLmcuIHlvdSBzaG91bGQgbGluaworZG5sIHdpdGggJFBUSFJFQURfQ0MgJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MgJExERkxBR1MgLi4uICRQVEhSRUFEX0xJQlMKK2RubCAkTElCUworZG5sCitkbmwgSWYgeW91IGFyZSBvbmx5IGJ1aWxkaW5nIHRocmVhZHMgcHJvZ3JhbXMsIHlvdSBtYXkgd2lzaCB0byB1c2UKK2RubCB0aGVzZSB2YXJpYWJsZXMgaW4geW91ciBkZWZhdWx0IExJQlMsIENGTEFHUywgYW5kIENDOgorZG5sCitkbmwgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCitkbmwgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCitkbmwgICAgICAgIENDPSIkUFRIUkVBRF9DQyIKK2RubAorZG5sIEluIGFkZGl0aW9uLCBpZiB0aGUgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgdGhyZWFkLWF0dHJpYnV0ZQorZG5sIGNvbnN0YW50IGhhcyBhIG5vbnN0YW5kYXJkIG5hbWUsIGRlZmluZXMgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgdG8KK2RubCB0aGF0IG5hbWUgKGUuZy4gUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRCBvbiBBSVgpLgorZG5sCitkbmwgQUNUSU9OLUlGLUZPVU5EIGlzIGEgbGlzdCBvZiBzaGVsbCBjb21tYW5kcyB0byBydW4gaWYgYSB0aHJlYWRzCitkbmwgbGlicmFyeSBpcyBmb3VuZCwgYW5kIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgYSBsaXN0IG9mIGNvbW1hbmRzIHRvCitkbmwgcnVuIGl0IGlmIGl0IGlzIG5vdCBmb3VuZC4gSWYgQUNUSU9OLUlGLUZPVU5EIGlzIG5vdCBzcGVjaWZpZWQsIHRoZQorZG5sIGRlZmF1bHQgYWN0aW9uIHdpbGwgZGVmaW5lIEhBVkVfUFRIUkVBRC4KK2RubAorZG5sIFBsZWFzZSBsZXQgdGhlIGF1dGhvcnMga25vdyBpZiB0aGlzIG1hY3JvIGZhaWxzIG9uIGFueSBwbGF0Zm9ybSwgb3IKK2RubCBpZiB5b3UgaGF2ZSBhbnkgb3RoZXIgc3VnZ2VzdGlvbnMgb3IgY29tbWVudHMuIFRoaXMgbWFjcm8gd2FzIGJhc2VkCitkbmwgb24gd29yayBieSBTR0ogb24gYXV0b2NvbmYgc2NyaXB0cyBmb3IgRkZUVyAod3d3LmZmdHcub3JnKSAod2l0aAorZG5sIGhlbHAgZnJvbSBNLiBGcmlnbyksIGFzIHdlbGwgYXMgYWNfcHRocmVhZCBhbmQgaGJfcHRocmVhZCBtYWNyb3MKK2RubCBwb3N0ZWQgYnkgQWxlamFuZHJvIEZvcmVybyBDdWVydm8gdG8gdGhlIGF1dG9jb25mIG1hY3JvIHJlcG9zaXRvcnkuCitkbmwgV2UgYXJlIGFsc28gZ3JhdGVmdWwgZm9yIHRoZSBoZWxwZnVsIGZlZWRiYWNrIG9mIG51bWVyb3VzIHVzZXJzLgorZG5sCitkbmwgQGNhdGVnb3J5IEluc3RhbGxlZFBhY2thZ2VzCitkbmwgQGF1dGhvciBTdGV2ZW4gRy4gSm9obnNvbiA8c3RldmVuakBhbHVtLm1pdC5lZHU+CitkbmwgQHZlcnNpb24gMjAwNi0wNS0yOQorZG5sIEBsaWNlbnNlIEdQTFdpdGhBQ0V4Y2VwdGlvbgorZG5sIAorZG5sIENoZWNrcyBmb3IgR0NDIHNoYXJlZC9wdGhyZWFkIGluY29uc2lzdGVuY3kgYmFzZWQgb24gd29yayBieQorZG5sIE1hcmNpbiBPd3NpYW55IDxtYXJjaW5Ab3dzaWFueS5wbD4KKworCitBQ19ERUZVTihbQUNYX1BUSFJFQURdLCBbCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCitBQ19MQU5HX1NBVkUKK0FDX0xBTkdfQworYWN4X3B0aHJlYWRfb2s9bm8KKworIyBXZSB1c2VkIHRvIGNoZWNrIGZvciBwdGhyZWFkLmggZmlyc3QsIGJ1dCB0aGlzIGZhaWxzIGlmIHB0aHJlYWQuaAorIyByZXF1aXJlcyBzcGVjaWFsIGNvbXBpbGVyIGZsYWdzIChlLmcuIG9uIFRydWU2NCBvciBTZXF1ZW50KS4KKyMgSXQgZ2V0cyBjaGVja2VkIGZvciBpbiB0aGUgbGluayB0ZXN0IGFueXdheS4KKworIyBGaXJzdCBvZiBhbGwsIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyBzZXQgYW55IG9mIHRoZSBQVEhSRUFEX0xJQlMsCisjIGV0Y2V0ZXJhIGVudmlyb25tZW50IHZhcmlhYmxlcywgYW5kIGlmIHRocmVhZHMgbGlua2luZyB3b3JrcyB1c2luZworIyB0aGVtOgoraWYgdGVzdCB4IiRQVEhSRUFEX0xJQlMkUFRIUkVBRF9DRkxBR1MiICE9IHg7IHRoZW4KKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTXSkKKyAgICAgICAgQUNfVFJZX0xJTktfRlVOQyhwdGhyZWFkX2pvaW4sIGFjeF9wdGhyZWFkX29rPXllcykKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkYWN4X3B0aHJlYWRfb2spCisgICAgICAgIGlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSIiCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKKyAgICAgICAgZmkKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCitmaQorCisjIFdlIG11c3QgY2hlY2sgZm9yIHRoZSB0aHJlYWRzIGxpYnJhcnkgdW5kZXIgYSBudW1iZXIgb2YgZGlmZmVyZW50CisjIG5hbWVzOyB0aGUgb3JkZXJpbmcgaXMgdmVyeSBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHN5c3RlbXMKKyMgKGUuZy4gREVDKSBoYXZlIGJvdGggLWxwdGhyZWFkIGFuZCAtbHB0aHJlYWRzLCB3aGVyZSBvbmUgb2YgdGhlCisjIGxpYnJhcmllcyBpcyBicm9rZW4gKG5vbi1QT1NJWCkuCisKKyMgQ3JlYXRlIGEgbGlzdCBvZiB0aHJlYWQgZmxhZ3MgdG8gdHJ5LiAgSXRlbXMgc3RhcnRpbmcgd2l0aCBhICItIiBhcmUKKyMgQyBjb21waWxlciBmbGFncywgYW5kIG90aGVyIGl0ZW1zIGFyZSBsaWJyYXJ5IG5hbWVzLCBleGNlcHQgZm9yICJub25lIgorIyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZSB0cnkgd2l0aG91dCBhbnkgZmxhZ3MgYXQgYWxsLCBhbmQgInB0aHJlYWQtY29uZmlnIgorIyB3aGljaCBpcyBhIHByb2dyYW0gcmV0dXJuaW5nIHRoZSBmbGFncyBmb3IgdGhlIFB0aCBlbXVsYXRpb24gbGlicmFyeS4KKworYWN4X3B0aHJlYWRfZmxhZ3M9InB0aHJlYWRzIG5vbmUgLUt0aHJlYWQgLWt0aHJlYWQgbHRocmVhZCAtcHRocmVhZCAtcHRocmVhZHMgLW10aHJlYWRzIHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQgcHRocmVhZC1jb25maWciCisKKyMgVGhlIG9yZGVyaW5nICppcyogKHNvbWV0aW1lcykgaW1wb3J0YW50LiAgU29tZSBub3RlcyBvbiB0aGUKKyMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisKKyMgcHRocmVhZHM6IEFJWCAobXVzdCBjaGVjayB0aGlzIGJlZm9yZSAtbHB0aHJlYWQpCisjIG5vbmU6IGluIGNhc2UgdGhyZWFkcyBhcmUgaW4gbGliYzsgc2hvdWxkIGJlIHRyaWVkIGJlZm9yZSAtS3RocmVhZCBhbmQKKyMgICAgICAgb3RoZXIgY29tcGlsZXIgZmxhZ3MgdG8gcHJldmVudCBjb250aW51YWwgY29tcGlsZXIgd2FybmluZ3MKKyMgLUt0aHJlYWQ6IFNlcXVlbnQgKHRocmVhZHMgaW4gbGliYywgYnV0IC1LdGhyZWFkIG5lZWRlZCBmb3IgcHRocmVhZC5oKQorIyAta3RocmVhZDogRnJlZUJTRCBrZXJuZWwgdGhyZWFkcyAocHJlZmVycmVkIHRvIC1wdGhyZWFkIHNpbmNlIFNNUC1hYmxlKQorIyBsdGhyZWFkOiBMaW51eFRocmVhZHMgcG9ydCBvbiBGcmVlQlNEIChhbHNvIHByZWZlcnJlZCB0byAtcHRocmVhZCkKKyMgLXB0aHJlYWQ6IExpbnV4L2djYyAoa2VybmVsIHRocmVhZHMpLCBCU0QvZ2NjICh1c2VybGFuZCB0aHJlYWRzKQorIyAtcHRocmVhZHM6IFNvbGFyaXMvZ2NjCisjIC1tdGhyZWFkczogTWluZ3czMi9nY2MsIEx5bngvZ2NjCisjIC1tdDogU3VuIFdvcmtzaG9wIEMgKG1heSBvbmx5IGxpbmsgU3VuT1MgdGhyZWFkcyBbLWx0aHJlYWRdLCBidXQgaXQKKyMgICAgICBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgc2luY2UgdGhpcyBzb21ldGltZXMgZGVmaW5lcyBwdGhyZWFkcyB0b287CisjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyMgICAgICAuLi4gLW10IGlzIGFsc28gdGhlIHB0aHJlYWRzIGZsYWcgZm9yIEhQL2FDQworIyBwdGhyZWFkOiBMaW51eCwgZXRjZXRlcmEKKyMgLS10aHJlYWQtc2FmZTogS0FJIEMrKworIyBwdGhyZWFkLWNvbmZpZzogdXNlIHB0aHJlYWQtY29uZmlnIHByb2dyYW0gKGZvciBHTlUgUHRoIGxpYnJhcnkpCisKK2Nhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCisgICAgICAgICpzb2xhcmlzKikKKworICAgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAgICMgdGVzdHMgd2lsbCBlcnJvbmVvdXNseSBzdWNjZWVkLiAgKFdlIG5lZWQgdG8gbGluayB3aXRoIC1wdGhyZWFkcy8tbXQvCisgICAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICAgIyB3aG8ga25vd3Mgd2hldGhlciB0aGV5J2xsIHN0dWIgdGhhdCB0b28gaW4gYSBmdXR1cmUgbGliYy4pICBTbywKKyAgICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorCisgICAgICAgIGFjeF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZHMgcHRocmVhZCAtbXQgLXB0aHJlYWQgJGFjeF9wdGhyZWFkX2ZsYWdzIgorICAgICAgICA7OworZXNhYworCitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorZm9yIGZsYWcgaW4gJGFjeF9wdGhyZWFkX2ZsYWdzOyBkbworCisgICAgICAgIGNhc2UgJGZsYWcgaW4KKyAgICAgICAgICAgICAgICBub25lKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzXSkKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgLSopCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aCAkZmxhZ10pCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisKKwkJcHRocmVhZC1jb25maWcpCisJCUFDX0NIRUNLX1BST0coYWN4X3B0aHJlYWRfY29uZmlnLCBwdGhyZWFkLWNvbmZpZywgeWVzLCBubykKKwkJaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9jb25maWciID0geG5vOyB0aGVuIGNvbnRpbnVlOyBmaQorCQlQVEhSRUFEX0NGTEFHUz0iYHB0aHJlYWQtY29uZmlnIC0tY2ZsYWdzYCIKKwkJUFRIUkVBRF9MSUJTPSJgcHRocmVhZC1jb25maWcgLS1sZGZsYWdzYCBgcHRocmVhZC1jb25maWcgLS1saWJzYCIKKwkJOzsKKworICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGhlIHB0aHJlYWRzIGxpYnJhcnkgLWwkZmxhZ10pCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSItbCRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIENoZWNrIGZvciB2YXJpb3VzIGZ1bmN0aW9ucy4gIFdlIG11c3QgaW5jbHVkZSBwdGhyZWFkLmgsCisgICAgICAgICMgc2luY2Ugc29tZSBmdW5jdGlvbnMgbWF5IGJlIG1hY3Jvcy4gIChPbiB0aGUgU2VxdWVudCwgd2UKKyAgICAgICAgIyBuZWVkIGEgc3BlY2lhbCBmbGFnIC1LdGhyZWFkIHRvIG1ha2UgdGhpcyBoZWFkZXIgY29tcGlsZS4pCisgICAgICAgICMgV2UgY2hlY2sgZm9yIHB0aHJlYWRfam9pbiBiZWNhdXNlIGl0IGlzIGluIC1scHRocmVhZCBvbiBJUklYCisgICAgICAgICMgd2hpbGUgcHRocmVhZF9jcmVhdGUgaXMgaW4gbGliYy4gIFdlIGNoZWNrIGZvciBwdGhyZWFkX2F0dHJfaW5pdAorICAgICAgICAjIGR1ZSB0byBERUMgY3JhemluZXNzIHdpdGggLWxwdGhyZWFkcy4gIFdlIGNoZWNrIGZvcgorICAgICAgICAjIHB0aHJlYWRfY2xlYW51cF9wdXNoIGJlY2F1c2UgaXQgaXMgb25lIG9mIHRoZSBmZXcgcHRocmVhZAorICAgICAgICAjIGZ1bmN0aW9ucyBvbiBTb2xhcmlzIHRoYXQgZG9lc24ndCBoYXZlIGEgbm9uLWZ1bmN0aW9uYWwgbGliYyBzdHViLgorICAgICAgICAjIFdlIHRyeSBwdGhyZWFkX2NyZWF0ZSBvbiBnZW5lcmFsIHByaW5jaXBsZXMuCisgICAgICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisgICAgICAgICAgICAgICAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKKyAgICAgICAgICAgICAgICAgICAgW2FjeF9wdGhyZWFkX29rPXllc10pCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkYWN4X3B0aHJlYWRfb2spCisgICAgICAgIGlmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaQorCisgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorZG9uZQorZmkKKworIyBWYXJpb3VzIG90aGVyIGNoZWNrczoKK2lmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIERldGVjdCBBSVggbG9zc2FnZTogSk9JTkFCTEUgYXR0cmlidXRlIGlzIGNhbGxlZCBVTkRFVEFDSEVELgorCUFDX01TR19DSEVDS0lORyhbZm9yIGpvaW5hYmxlIHB0aHJlYWQgYXR0cmlidXRlXSkKKwlhdHRyX25hbWU9dW5rbm93bgorCWZvciBhdHRyIGluIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQ7IGRvCisJICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sIFtpbnQgYXR0cj0kYXR0cjsgcmV0dXJuIGF0dHI7XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyX25hbWU9JGF0dHI7IGJyZWFrXSkKKwlkb25lCisgICAgICAgIEFDX01TR19SRVNVTFQoJGF0dHJfbmFtZSkKKyAgICAgICAgaWYgdGVzdCAiJGF0dHJfbmFtZSIgIT0gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEU7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSwgJGF0dHJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIG5lY2Vzc2FyeSBzeW1ib2wgaWYgdGhpcyBjb25zdGFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VzIGEgbm9uLXN0YW5kYXJkIG5hbWUgb24geW91ciBzeXN0ZW0uXSkKKyAgICAgICAgZmkKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIG1vcmUgc3BlY2lhbCBmbGFncyBhcmUgcmVxdWlyZWQgZm9yIHB0aHJlYWRzXSkKKyAgICAgICAgZmxhZz1ubworICAgICAgICBjYXNlICIke2hvc3RfY3B1fS0ke2hvc3Rfb3N9IiBpbgorICAgICAgICAgICAgKi1haXgqIHwgKi1mcmVlYnNkKiB8ICotZGFyd2luKikgZmxhZz0iLURfVEhSRUFEX1NBRkUiOzsKKyAgICAgICAgICAgICpzb2xhcmlzKiB8ICotb3NmKiB8ICotaHB1eCopIGZsYWc9Ii1EX1JFRU5UUkFOVCI7OworICAgICAgICBlc2FjCisgICAgICAgIEFDX01TR19SRVNVTFQoJHtmbGFnfSkKKyAgICAgICAgaWYgdGVzdCAieCRmbGFnIiAhPSB4bm87IHRoZW4KKyAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIGZpCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgICAgICAgICMgTW9yZSBBSVggbG9zc2FnZTogbXVzdCBjb21waWxlIHdpdGggeGxjX3Igb3IgY2NfcgorCWlmIHRlc3QgeCIkR0NDIiAhPSB4eWVzOyB0aGVuCisgICAgICAgICAgQUNfQ0hFQ0tfUFJPR1MoUFRIUkVBRF9DQywgeGxjX3IgY2NfciwgJHtDQ30pCisgICAgICAgIGVsc2UKKyAgICAgICAgICBQVEhSRUFEX0NDPSRDQworCWZpCisKKwkjIFRoZSBuZXh0IHBhcnQgdHJpZXMgdG8gZGV0ZWN0IEdDQyBpbmNvbnNpc3RlbmN5IHdpdGggLXNoYXJlZCBvbiBzb21lCisJIyBhcmNoaXRlY3R1cmVzIGFuZCBzeXN0ZW1zLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGluIGNlcnRhaW4KKwkjIGNvbmZpZ3VyYXRpb25zLCB3aGVuIC1zaGFyZWQgaXMgc3BlY2lmaWVkLCBHQ0MgImZvcmdldHMiIHRvCisJIyBpbnRlcm5hbGx5IHVzZSB2YXJpb3VzIGZsYWdzIHdoaWNoIGFyZSBzdGlsbCBuZWNlc3NhcnkuCisJCisJIworCSMgUHJlcGFyZSB0aGUgZmxhZ3MKKwkjCisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJc2F2ZV9MSUJTPSIkTElCUyIKKwlzYXZlX0NDPSIkQ0MiCisJCisJIyBUcnkgd2l0aCB0aGUgZmxhZ3MgZGV0ZXJtaW5lZCBieSB0aGUgZWFybGllciBjaGVja3MuCisJIworCSMgLVdsLC16LGRlZnMgZm9yY2VzIGxpbmstdGltZSBzeW1ib2wgcmVzb2x1dGlvbiwgc28gdGhhdCB0aGUKKwkjIGxpbmtpbmcgY2hlY2tzIHdpdGggLXNoYXJlZCBhY3R1YWxseSBoYXZlIGFueSB2YWx1ZQorCSMKKwkjIEZJWE1FOiAtZlBJQyBpcyByZXF1aXJlZCBmb3IgLXNoYXJlZCBvbiBtYW55IGFyY2hpdGVjdHVyZXMsCisJIyBzbyB3ZSBzcGVjaWZ5IGl0IGhlcmUsIGJ1dCB0aGUgcmlnaHQgd2F5IHdvdWxkIHByb2JhYmx5IGJlIHRvCisJIyBwcm9wZXJseSBkZXRlY3Qgd2hldGhlciBpdCBpcyBhY3R1YWxseSByZXF1aXJlZC4KKwlDRkxBR1M9Ii1zaGFyZWQgLWZQSUMgLVdsLC16LGRlZnMgJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisJTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKwlDQz0iJFBUSFJFQURfQ0MiCisJCisJIyBJbiBvcmRlciBub3QgdG8gY3JlYXRlIHNldmVyYWwgbGV2ZWxzIG9mIGluZGVudGF0aW9uLCB3ZSB0ZXN0CisJIyB0aGUgdmFsdWUgb2YgIiRkb25lIiB1bnRpbCB3ZSBmaW5kIHRoZSBjdXJlIG9yIHJ1biBvdXQgb2YgaWRlYXMuCisJZG9uZT0ibm8iCisJCisJIyBGaXJzdCwgbWFrZSBzdXJlIHRoZSBDRkxBR1Mgd2UgYWRkZWQgYXJlIGFjdHVhbGx5IGFjY2VwdGVkIGJ5IG91cgorCSMgY29tcGlsZXIuICBJZiBub3QgKGFuZCBPUyBYJ3MgbGQsIGZvciBpbnN0YW5jZSwgZG9lcyBub3QgYWNjZXB0IC16KSwKKwkjIHRoZW4gd2UgY2FuJ3QgZG8gdGhpcyB0ZXN0LgorCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KKwkgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gY2hlY2sgZm9yIEdDQyBwdGhyZWFkL3NoYXJlZCBpbmNvbnNpc3RlbmNpZXNdKQorCSAgIEFDX1RSWV9MSU5LKCwsICwgW2RvbmU9eWVzXSkKKwkKKwkgICBpZiB0ZXN0ICJ4JGRvbmUiID0geHllcyA7IHRoZW4KKwkgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisJICAgZWxzZQorCSAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisJICAgZmkKKwlmaQorCQorCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KKwkgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLXB0aHJlYWQgaXMgc3VmZmljaWVudCB3aXRoIC1zaGFyZWRdKQorCSAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisJICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKwkgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisJICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7IF0sCisJICAgICAgW2RvbmU9eWVzXSkKKwkgICAKKwkgICBpZiB0ZXN0ICJ4JGRvbmUiID0geHllczsgdGhlbgorCSAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisJICAgZWxzZQorCSAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKwkgICBmaQorCWZpCisJCisJIworCSMgTGludXggZ2NjIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyBzdWNoIGFzIG1pcHMvbWlwc2VsIGZvcmdldHMKKwkjIGFib3V0IC1scHRocmVhZAorCSMKKwlpZiB0ZXN0IHgiJGRvbmUiID0geG5vOyB0aGVuCisJICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1scHRocmVhZCBmaXhlcyB0aGF0XSkKKwkgICBMSUJTPSItbHB0aHJlYWQgJFBUSFJFQURfTElCUyAkc2F2ZV9MSUJTIgorCSAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisJICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKwkgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisJICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7IF0sCisJICAgICAgW2RvbmU9eWVzXSkKKwkKKwkgICBpZiB0ZXN0ICJ4JGRvbmUiID0geHllczsgdGhlbgorCSAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisJICAgICAgUFRIUkVBRF9MSUJTPSItbHB0aHJlYWQgJFBUSFJFQURfTElCUyIKKwkgICBlbHNlCisJICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorCSAgIGZpCisJZmkKKwkjCisJIyBGcmVlQlNEIDQuMTAgZ2NjIGZvcmdldHMgdG8gdXNlIC1sY19yIGluc3RlYWQgb2YgLWxjCisJIworCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KKwkgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxjX3IgZml4ZXMgdGhhdF0pCisJICAgTElCUz0iLWxjX3IgJFBUSFJFQURfTElCUyAkc2F2ZV9MSUJTIgorCSAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisJICAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisJICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisJICAgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKKwkgICAgICAgW2RvbmU9eWVzXSkKKwkKKwkgICBpZiB0ZXN0ICJ4JGRvbmUiID0geHllczsgdGhlbgorCSAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisJICAgICAgUFRIUkVBRF9MSUJTPSItbGNfciAkUFRIUkVBRF9MSUJTIgorCSAgIGVsc2UKKwkgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisJICAgZmkKKwlmaQorCWlmIHRlc3QgeCIkZG9uZSIgPSB4bm87IHRoZW4KKwkgICAjIE9LLCB3ZSBoYXZlIHJ1biBvdXQgb2YgaWRlYXMKKwkgICBBQ19NU0dfV0FSTihbSW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgaG93IHRvIHVzZSBwdGhyZWFkcyB3aXRoIHNoYXJlZCBsaWJyYXJpZXNdKQorCQorCSAgICMgc28gaXQncyBub3Qgc2FmZSB0byBhc3N1bWUgdGhhdCB3ZSBtYXkgdXNlIHB0aHJlYWRzCisJICAgYWN4X3B0aHJlYWRfb2s9bm8KKwlmaQorCQorCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCUxJQlM9IiRzYXZlX0xJQlMiCisJQ0M9IiRzYXZlX0NDIgorZWxzZQorICAgICAgICBQVEhSRUFEX0NDPSIkQ0MiCitmaQorCitBQ19TVUJTVChQVEhSRUFEX0xJQlMpCitBQ19TVUJTVChQVEhSRUFEX0NGTEFHUykKK0FDX1NVQlNUKFBUSFJFQURfQ0MpCisKKyMgRmluYWxseSwgZXhlY3V0ZSBBQ1RJT04tSUYtRk9VTkQvQUNUSU9OLUlGLU5PVC1GT1VORDoKK2lmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBpZmVsc2UoWyQxXSwsQUNfREVGSU5FKEhBVkVfUFRIUkVBRCwxLFtEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy5dKSxbJDFdKQorICAgICAgICA6CitlbHNlCisgICAgICAgIGFjeF9wdGhyZWFkX29rPW5vCisgICAgICAgICQyCitmaQorQUNfTEFOR19SRVNUT1JFCitdKWRubCBBQ1hfUFRIUkVBRApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L200L2d0ZXN0Lm00IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L200L2d0ZXN0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OThiYTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbTQvZ3Rlc3QubTQKQEAgLTAsMCArMSw3NCBAQAorZG5sIEdURVNUX0xJQl9DSEVDSyhbbWluaW11bSB2ZXJzaW9uIFssCitkbmwgICAgICAgICAgICAgICAgICBhY3Rpb24gaWYgZm91bmQgWyxhY3Rpb24gaWYgbm90IGZvdW5kXV1dKQorZG5sCitkbmwgQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgR29vZ2xlIFRlc3QgbGlicmFyeSwgb3B0aW9uYWxseSBhdCBhIG1pbmltdW0KK2RubCB2ZXJzaW9uLCBhbmQgaW5kaWNhdGUgYSB2aWFibGUgdmVyc2lvbiB3aXRoIHRoZSBIQVZFX0dURVNUIGZsYWcuIEl0IGRlZmluZXMKK2RubCBzdGFuZGFyZCB2YXJpYWJsZXMgZm9yIHN1YnN0aXR1dGlvbiBpbmNsdWRpbmcgR1RFU1RfQ1BQRkxBR1MsCitkbmwgR1RFU1RfQ1hYRkxBR1MsIEdURVNUX0xERkxBR1MsIGFuZCBHVEVTVF9MSUJTLiBJdCBhbHNvIGRlZmluZXMKK2RubCBHVEVTVF9WRVJTSU9OIGFzIHRoZSB2ZXJzaW9uIG9mIEdvb2dsZSBUZXN0IGZvdW5kLiBGaW5hbGx5LCBpdCBwcm92aWRlcworZG5sIG9wdGlvbmFsIGN1c3RvbSBhY3Rpb24gc2xvdHMgaW4gdGhlIGV2ZW50IEdURVNUIGlzIGZvdW5kIG9yIG5vdC4KK0FDX0RFRlVOKFtHVEVTVF9MSUJfQ0hFQ0tdLAorWworZG5sIFByb3ZpZGUgYSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIEdvb2dsZSBUZXN0IHVzYWdlLgorQUNfQVJHX0VOQUJMRShbZ3Rlc3RdLAorICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWd0ZXN0XSwKKyAgICAgICAgICAgICAgICAgIFtFbmFibGUgdGVzdHMgdXNpbmcgdGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsuCisgICAgICAgICAgICAgICAgICAoRGVmYXVsdCBpcyBlbmFibGVkLildKV0sCisgIFtdLAorICBbZW5hYmxlX2d0ZXN0PV0pCitBQ19BUkdfVkFSKFtHVEVTVF9DT05GSUddLAorICAgICAgICAgICBbVGhlIGV4YWN0IHBhdGggb2YgR29vZ2xlIFRlc3QncyAnZ3Rlc3QtY29uZmlnJyBzY3JpcHQuXSkKK0FDX0FSR19WQVIoW0dURVNUX0NQUEZMQUdTXSwKKyAgICAgICAgICAgW0MtbGlrZSBwcmVwcm9jZXNzb3IgZmxhZ3MgZm9yIEdvb2dsZSBUZXN0Ll0pCitBQ19BUkdfVkFSKFtHVEVTVF9DWFhGTEFHU10sCisgICAgICAgICAgIFtDKysgY29tcGlsZSBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKK0FDX0FSR19WQVIoW0dURVNUX0xERkxBR1NdLAorICAgICAgICAgICBbTGlua2VyIHBhdGggYW5kIG9wdGlvbiBmbGFncyBmb3IgR29vZ2xlIFRlc3QuXSkKK0FDX0FSR19WQVIoW0dURVNUX0xJQlNdLAorICAgICAgICAgICBbTGlicmFyeSBsaW5raW5nIGZsYWdzIGZvciBHb29nbGUgVGVzdC5dKQorQUNfQVJHX1ZBUihbR1RFU1RfVkVSU0lPTl0sCisgICAgICAgICAgIFtUaGUgdmVyc2lvbiBvZiBHb29nbGUgVGVzdCBhdmFpbGFibGUuXSkKK0hBVkVfR1RFU1Q9Im5vIgorQVNfSUYoW3Rlc3QgIngke2VuYWJsZV9ndGVzdH0iICE9ICJ4bm8iXSwKKyAgW0FDX01TR19DSEVDS0lORyhbZm9yICdndGVzdC1jb25maWcnXSkKKyAgIEFTX0lGKFt0ZXN0ICJ4JHtlbmFibGVfZ3Rlc3R9IiAhPSAieHllcyJdLAorICAgICBbQVNfSUYoW3Rlc3QgLXggIiR7ZW5hYmxlX2d0ZXN0fS9zY3JpcHRzL2d0ZXN0LWNvbmZpZyJdLAorICAgICAgICBbR1RFU1RfQ09ORklHPSIke2VuYWJsZV9ndGVzdH0vc2NyaXB0cy9ndGVzdC1jb25maWciXSwKKyAgICAgICAgW0dURVNUX0NPTkZJRz0iJHtlbmFibGVfZ3Rlc3R9L2Jpbi9ndGVzdC1jb25maWciXSkKKyAgICAgIEFTX0lGKFt0ZXN0IC14ICIke0dURVNUX0NPTkZJR30iXSwgW10sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICBBQ19NU0dfRVJST1IoW2RubAorVW5hYmxlIHRvIGxvY2F0ZSBlaXRoZXIgYSBidWlsdCBvciBpbnN0YWxsZWQgR29vZ2xlIFRlc3QuCitUaGUgc3BlY2lmaWMgbG9jYXRpb24gJyR7ZW5hYmxlX2d0ZXN0fScgd2FzIHByb3ZpZGVkIGZvciBhIGJ1aWx0IG9yIGluc3RhbGxlZAorR29vZ2xlIFRlc3QsIGJ1dCBubyAnZ3Rlc3QtY29uZmlnJyBzY3JpcHQgY291bGQgYmUgZm91bmQgYXQgdGhpcyBsb2NhdGlvbi5dKQorICAgICAgICAgXSldLAorICAgICBbQUNfUEFUSF9QUk9HKFtHVEVTVF9DT05GSUddLCBbZ3Rlc3QtY29uZmlnXSldKQorICAgQVNfSUYoW3Rlc3QgLXggIiR7R1RFU1RfQ09ORklHfSJdLAorICAgICBbQUNfTVNHX1JFU1VMVChbJHtHVEVTVF9DT05GSUd9XSkKKyAgICAgIG00X2lmdmFsKFskMV0sCisgICAgICAgIFtfZ3Rlc3RfbWluX3ZlcnNpb249Ii0tbWluLXZlcnNpb249JDEiCisgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHb29nbGUgVGVzdCBhdCBsZWFzdCB2ZXJzaW9uID49ICQxXSldLAorICAgICAgICBbX2d0ZXN0X21pbl92ZXJzaW9uPSItLW1pbi12ZXJzaW9uPTAiCisgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHb29nbGUgVGVzdF0pXSkKKyAgICAgIEFTX0lGKFske0dURVNUX0NPTkZJR30gJHtfZ3Rlc3RfbWluX3ZlcnNpb259XSwKKyAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICBIQVZFX0dURVNUPSd5ZXMnXSwKKyAgICAgICAgW0FDX01TR19SRVNVTFQoW25vXSldKV0sCisgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSkKKyAgIEFTX0lGKFt0ZXN0ICJ4JHtIQVZFX0dURVNUfSIgPSAieHllcyJdLAorICAgICBbR1RFU1RfQ1BQRkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWNwcGZsYWdzYAorICAgICAgR1RFU1RfQ1hYRkxBR1M9YCR7R1RFU1RfQ09ORklHfSAtLWN4eGZsYWdzYAorICAgICAgR1RFU1RfTERGTEFHUz1gJHtHVEVTVF9DT05GSUd9IC0tbGRmbGFnc2AKKyAgICAgIEdURVNUX0xJQlM9YCR7R1RFU1RfQ09ORklHfSAtLWxpYnNgCisgICAgICBHVEVTVF9WRVJTSU9OPWAke0dURVNUX0NPTkZJR30gLS12ZXJzaW9uYAorICAgICAgQUNfREVGSU5FKFtIQVZFX0dURVNUXSxbMV0sW0RlZmluZWQgd2hlbiBHb29nbGUgVGVzdCBpcyBhdmFpbGFibGUuXSldLAorICAgICBbQVNfSUYoW3Rlc3QgIngke2VuYWJsZV9ndGVzdH0iID0gInh5ZXMiXSwKKyAgICAgICAgW0FDX01TR19FUlJPUihbZG5sCitHb29nbGUgVGVzdCB3YXMgZW5hYmxlZCwgYnV0IG5vIHZpYWJsZSB2ZXJzaW9uIGNvdWxkIGJlIGZvdW5kLl0pCisgICAgICAgICBdKV0pXSkKK0FDX1NVQlNUKFtIQVZFX0dURVNUXSkKK0FNX0NPTkRJVElPTkFMKFtIQVZFX0dURVNUXSxbdGVzdCAieCRIQVZFX0dURVNUIiA9ICJ4eWVzIl0pCitBU19JRihbdGVzdCAieCRIQVZFX0dURVNUIiA9ICJ4eWVzIl0sCisgIFttNF9pZnZhbChbJDJdLCBbJDJdKV0sCisgIFttNF9pZnZhbChbJDNdLCBbJDNdKV0pCitdKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21ha2UvTWFrZWZpbGUgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbWFrZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWM3NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21ha2UvTWFrZWZpbGUKQEAgLTAsMCArMSw4MiBAQAorIyBBIHNhbXBsZSBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QgYW5kIHVzaW5nIGl0IGluIHVzZXIKKyMgdGVzdHMuICBQbGVhc2UgdHdlYWsgaXQgdG8gc3VpdCB5b3VyIGVudmlyb25tZW50IGFuZCBwcm9qZWN0LiAgWW91CisjIG1heSB3YW50IHRvIG1vdmUgaXQgdG8geW91ciBwcm9qZWN0J3Mgcm9vdCBkaXJlY3RvcnkuCisjCisjIFNZTk9QU0lTOgorIworIyAgIG1ha2UgW2FsbF0gIC0gbWFrZXMgZXZlcnl0aGluZy4KKyMgICBtYWtlIFRBUkdFVCAtIG1ha2VzIHRoZSBnaXZlbiB0YXJnZXQuCisjICAgbWFrZSBjbGVhbiAgLSByZW1vdmVzIGFsbCBmaWxlcyBnZW5lcmF0ZWQgYnkgbWFrZS4KKworIyBQbGVhc2UgdHdlYWsgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBkZWZpbml0aW9ucyBhcyBuZWVkZWQgYnkgeW91cgorIyBwcm9qZWN0LCBleGNlcHQgR1RFU1RfSEVBREVSUywgd2hpY2ggeW91IGNhbiB1c2UgaW4geW91ciBvd24gdGFyZ2V0cworIyBidXQgc2hvdWxkbid0IG1vZGlmeS4KKworIyBQb2ludHMgdG8gdGhlIHJvb3Qgb2YgR29vZ2xlIFRlc3QsIHJlbGF0aXZlIHRvIHdoZXJlIHRoaXMgZmlsZSBpcy4KKyMgUmVtZW1iZXIgdG8gdHdlYWsgdGhpcyBpZiB5b3UgbW92ZSB0aGlzIGZpbGUuCitHVEVTVF9ESVIgPSAuLgorCisjIFdoZXJlIHRvIGZpbmQgdXNlciBjb2RlLgorVVNFUl9ESVIgPSAuLi9zYW1wbGVzCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBwcmVwcm9jZXNzb3IuCisjIFNldCBHb29nbGUgVGVzdCdzIGhlYWRlciBkaXJlY3RvcnkgYXMgYSBzeXN0ZW0gZGlyZWN0b3J5LCBzdWNoIHRoYXQKKyMgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgZ2VuZXJhdGUgd2FybmluZ3MgaW4gR29vZ2xlIFRlc3QgaGVhZGVycy4KK0NQUEZMQUdTICs9IC1pc3lzdGVtICQoR1RFU1RfRElSKS9pbmNsdWRlCisKKyMgRmxhZ3MgcGFzc2VkIHRvIHRoZSBDKysgY29tcGlsZXIuCitDWFhGTEFHUyArPSAtZyAtV2FsbCAtV2V4dHJhIC1wdGhyZWFkCisKKyMgQWxsIHRlc3RzIHByb2R1Y2VkIGJ5IHRoaXMgTWFrZWZpbGUuICBSZW1lbWJlciB0byBhZGQgbmV3IHRlc3RzIHlvdQorIyBjcmVhdGVkIHRvIHRoZSBsaXN0LgorVEVTVFMgPSBzYW1wbGUxX3VuaXR0ZXN0CisKKyMgQWxsIEdvb2dsZSBUZXN0IGhlYWRlcnMuICBVc3VhbGx5IHlvdSBzaG91bGRuJ3QgY2hhbmdlIHRoaXMKKyMgZGVmaW5pdGlvbi4KK0dURVNUX0hFQURFUlMgPSAkKEdURVNUX0RJUikvaW5jbHVkZS9ndGVzdC8qLmggXAorICAgICAgICAgICAgICAgICQoR1RFU1RfRElSKS9pbmNsdWRlL2d0ZXN0L2ludGVybmFsLyouaAorCisjIEhvdXNlLWtlZXBpbmcgYnVpbGQgdGFyZ2V0cy4KKworYWxsIDogJChURVNUUykKKworY2xlYW4gOgorCXJtIC1mICQoVEVTVFMpIGd0ZXN0LmEgZ3Rlc3RfbWFpbi5hICoubworCisjIEJ1aWxkcyBndGVzdC5hIGFuZCBndGVzdF9tYWluLmEuCisKKyMgVXN1YWxseSB5b3Ugc2hvdWxkbid0IHR3ZWFrIHN1Y2ggaW50ZXJuYWwgdmFyaWFibGVzLCBpbmRpY2F0ZWQgYnkgYQorIyB0cmFpbGluZyBfLgorR1RFU1RfU1JDU18gPSAkKEdURVNUX0RJUikvc3JjLyouY2MgJChHVEVTVF9ESVIpL3NyYy8qLmggJChHVEVTVF9IRUFERVJTKQorCisjIEZvciBzaW1wbGljaXR5IGFuZCB0byBhdm9pZCBkZXBlbmRpbmcgb24gR29vZ2xlIFRlc3QncworIyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCB0aGUgZGVwZW5kZW5jaWVzIHNwZWNpZmllZCBiZWxvdyBhcmUKKyMgY29uc2VydmF0aXZlIGFuZCBub3Qgb3B0aW1pemVkLiAgVGhpcyBpcyBmaW5lIGFzIEdvb2dsZSBUZXN0CisjIGNvbXBpbGVzIGZhc3QgYW5kIGZvciBvcmRpbmFyeSB1c2VycyBpdHMgc291cmNlIHJhcmVseSBjaGFuZ2VzLgorZ3Rlc3QtYWxsLm8gOiAkKEdURVNUX1NSQ1NfKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAtSSQoR1RFU1RfRElSKSAkKENYWEZMQUdTKSAtYyBcCisgICAgICAgICAgICAkKEdURVNUX0RJUikvc3JjL2d0ZXN0LWFsbC5jYworCitndGVzdF9tYWluLm8gOiAkKEdURVNUX1NSQ1NfKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAtSSQoR1RFU1RfRElSKSAkKENYWEZMQUdTKSAtYyBcCisgICAgICAgICAgICAkKEdURVNUX0RJUikvc3JjL2d0ZXN0X21haW4uY2MKKworZ3Rlc3QuYSA6IGd0ZXN0LWFsbC5vCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitndGVzdF9tYWluLmEgOiBndGVzdC1hbGwubyBndGVzdF9tYWluLm8KKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKKyMgQnVpbGRzIGEgc2FtcGxlIHRlc3QuICBBIHRlc3Qgc2hvdWxkIGxpbmsgd2l0aCBlaXRoZXIgZ3Rlc3QuYSBvcgorIyBndGVzdF9tYWluLmEsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGRlZmluZXMgaXRzIG93biBtYWluKCkKKyMgZnVuY3Rpb24uCisKK3NhbXBsZTEubyA6ICQoVVNFUl9ESVIpL3NhbXBsZTEuY2MgJChVU0VSX0RJUikvc2FtcGxlMS5oICQoR1RFU1RfSEVBREVSUykKKwkkKENYWCkgJChDUFBGTEFHUykgJChDWFhGTEFHUykgLWMgJChVU0VSX0RJUikvc2FtcGxlMS5jYworCitzYW1wbGUxX3VuaXR0ZXN0Lm8gOiAkKFVTRVJfRElSKS9zYW1wbGUxX3VuaXR0ZXN0LmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICQoVVNFUl9ESVIpL3NhbXBsZTEuaCAkKEdURVNUX0hFQURFUlMpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoVVNFUl9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MKKworc2FtcGxlMV91bml0dGVzdCA6IHNhbXBsZTEubyBzYW1wbGUxX3VuaXR0ZXN0Lm8gZ3Rlc3RfbWFpbi5hCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1scHRocmVhZCAkXiAtbyAkQApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3QtbWQuc2xuIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3QtbWQuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OTA4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdC1tZC5zbG4KQEAgLTAsMCArMSw0NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOC4wMA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3QtbWQiLCAiZ3Rlc3QtbWQudmNwcm9qIiwgIntDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfbWFpbi1tZCIsICJndGVzdF9tYWluLW1kLnZjcHJvaiIsICJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImd0ZXN0X3Byb2RfdGVzdC1tZCIsICJndGVzdF9wcm9kX3Rlc3QtbWQudmNwcm9qIiwgInsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfdW5pdHRlc3QtbWQiLCAiZ3Rlc3RfdW5pdHRlc3QtbWQudmNwcm9qIiwgIns0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvbikgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWcgPSBEZWJ1Zw0KKwkJUmVsZWFzZSA9IFJlbGVhc2UNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTh9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU4fS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNCfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQn0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTJ9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUEyfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlBZGRJbnMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdC1tZC52Y3Byb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdC1tZC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzNWMzYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0LW1kLnZjcHJvagpAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0LW1kIg0KKwlQcm9qZWN0R1VJRD0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdGQubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlSZWZlcmVuY2VzUGF0aD0iJnF1b3Q7Li5caW5jbHVkZSZxdW90OzsmcXVvdDsuLiZxdW90OyI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfTElCIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3QubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0LWFsbC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdC5zbG4gYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0YjA1NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0LnNsbgpAQCAtMCwwICsxLDQ1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA4LjAwDQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdCIsICJndGVzdC52Y3Byb2oiLCAie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJndGVzdF9tYWluIiwgImd0ZXN0X21haW4udmNwcm9qIiwgInszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfdW5pdHRlc3QiLCAiZ3Rlc3RfdW5pdHRlc3QudmNwcm9qIiwgIns0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ3Rlc3RfcHJvZF90ZXN0IiwgImd0ZXN0X3Byb2RfdGVzdC52Y3Byb2oiLCAiezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1ZyA9IERlYnVnDQorCQlSZWxlYXNlID0gUmVsZWFzZQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb24pID0gcG9zdFNvbHV0aW9uDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFN30uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDOEY2QzE3Mi01NkYyLTRFNzYtQjVGQS1DM0I0MjNCMzFCRTd9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9LkRlYnVnLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMyfS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9LlJlbGVhc2UuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0uUmVsZWFzZS5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0uRGVidWcuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs0RDlGREZCNS05ODZBLTQxMzktODIzQy1GNEVFMEVENDgxQTF9LkRlYnVnLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfS5SZWxlYXNlLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNBfS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezI0ODQ4NTUxLUVGNEYtNDdFOC05QTlELUVBNEQ0OUJDM0VDQX0uRGVidWcuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MjQ4NDg1NTEtRUY0Ri00N0U4LTlBOUQtRUE0RDQ5QkMzRUNBfS5SZWxlYXNlLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUFkZElucykgPSBwb3N0U29sdXRpb24NCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0LnZjcHJvaiBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODM3M2NlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3QudmNwcm9qCkBAIC0wLDAgKzEsMTI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ3Rlc3QiDQorCVByb2plY3RHVUlEPSJ7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlSZWZlcmVuY2VzUGF0aD0iIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0xJQiINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0ZC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSImcXVvdDsuLlxpbmNsdWRlJnF1b3Q7OyZxdW90Oy4uJnF1b3Q7Ij4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19MSUIiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdC5saWIiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ3Rlc3QtYWxsLmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3RfbWFpbi1tZC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzNzlmZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0X21haW4tbWQudmNwcm9qCkBAIC0wLDAgKzEsMTI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ3Rlc3RfbWFpbi1tZCINCisJUHJvamVjdEdVSUQ9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzN9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVJlZmVyZW5jZXNQYXRoPSIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfTElCIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvJChQcm9qZWN0TmFtZSlkLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiZxdW90Oy4uXGluY2x1ZGUmcXVvdDs7JnF1b3Q7Li4mcXVvdDsiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0xJQiINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpLmxpYiIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0ie0M4RjZDMTcyLTU2RjItNEU3Ni1CNUZBLUMzQjQyM0IzMUJFOH0iDQorCQkJTmFtZT0iZ3Rlc3QtbWQiLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXGd0ZXN0X21haW4uY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3RfbWFpbi52Y3Byb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdF9tYWluLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGI3NjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3RfbWFpbi52Y3Byb2oKQEAgLTAsMCArMSwxMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjEwIg0KKwlOYW1lPSJndGVzdF9tYWluIg0KKwlQcm9qZWN0R1VJRD0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJUmVmZXJlbmNlc1BhdGg9IiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19MSUIiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKWQubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlSZWZlcmVuY2VzUGF0aD0iJnF1b3Q7Li5caW5jbHVkZSZxdW90OzsmcXVvdDsuLiZxdW90OyI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfTElCIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkubGliIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJCTxQcm9qZWN0UmVmZXJlbmNlDQorCQkJUmVmZXJlbmNlZFByb2plY3RJZGVudGlmaWVyPSJ7QzhGNkMxNzItNTZGMi00RTc2LUI1RkEtQzNCNDIzQjMxQkU3fSINCisJCQlOYW1lPSJndGVzdCIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcZ3Rlc3RfbWFpbi5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ii8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ij4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdF9wcm9kX3Rlc3QtbWQudmNwcm9qIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWIwNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3RfcHJvZF90ZXN0LW1kLnZjcHJvagpAQCAtMCwwICsxLDE2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3Byb2RfdGVzdC1tZCINCisJUHJvamVjdEdVSUQ9InsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0J9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzM30iDQorCQkJTmFtZT0iZ3Rlc3RfbWFpbi1tZCIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3Byb2RfdGVzdC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmgiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdF9wcm9kX3Rlc3QudmNwcm9qIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3RfcHJvZF90ZXN0LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdhMmYwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3RfcHJvZF90ZXN0LnZjcHJvagpAQCAtMCwwICsxLDE2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3Byb2RfdGVzdCINCisJUHJvamVjdEdVSUQ9InsyNDg0ODU1MS1FRjRGLTQ3RTgtOUE5RC1FQTRENDlCQzNFQ0F9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI1Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ii8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF9wcm9kX3Rlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3Byb2RfdGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNCINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfcHJvZF90ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCQk8UHJvamVjdFJlZmVyZW5jZQ0KKwkJCVJlZmVyZW5jZWRQcm9qZWN0SWRlbnRpZmllcj0iezNBRjU0QzhBLTEwQkYtNDMzMi05MTQ3LUY2OEVEOTg2MjAzMn0iDQorCQkJTmFtZT0iZ3Rlc3RfbWFpbiIvPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSI+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlx0ZXN0XGd0ZXN0X3Byb2RfdGVzdC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmNjIj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxwcm9kdWN0aW9uLmgiPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdF91bml0dGVzdC1tZC52Y3Byb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvbXN2Yy9ndGVzdF91bml0dGVzdC1tZC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNWU1NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LW1kLnZjcHJvagpAQCAtMCwwICsxLDE0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjcuMTAiDQorCU5hbWU9Imd0ZXN0X3VuaXR0ZXN0LW1kIg0KKwlQcm9qZWN0R1VJRD0iezREOUZERkI1LTk4NkEtNDEzOS04MjNDLUY0RUUwRUQ0ODFBMn0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiI+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiIvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iRkFMU0UiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9ndGVzdF91bml0dGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uTmFtZSkvJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikvJChQcm9qZWN0TmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIj4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJCTxQcm9qZWN0UmVmZXJlbmNlDQorCQkJUmVmZXJlbmNlZFByb2plY3RJZGVudGlmaWVyPSJ7M0FGNTRDOEEtMTBCRi00MzMyLTkxNDctRjY4RUQ5ODYyMDMzfSINCisJCQlOYW1lPSJndGVzdF9tYWluLW1kIi8+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ij4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHRlc3RcZ3Rlc3RfdW5pdHRlc3QuY2MiPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIj4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPcHRpbWl6YXRpb249IjEiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90Oy4uJnF1b3Q7OyZxdW90Oy4uXGluY2x1ZGUmcXVvdDsiDQorCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvaiBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9tc3ZjL2d0ZXN0X3VuaXR0ZXN0LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFmNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L21zdmMvZ3Rlc3RfdW5pdHRlc3QudmNwcm9qCkBAIC0wLDAgKzEsMTQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iNy4xMCINCisJTmFtZT0iZ3Rlc3RfdW5pdHRlc3QiDQorCVByb2plY3RHVUlEPSJ7NEQ5RkRGQjUtOTg2QS00MTM5LTgyM0MtRjRFRTBFRDQ4MUExfSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbk5hbWUpLyQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpLyQoUHJvamVjdE5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiI+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iVFJVRSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iNSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJGQUxTRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvZ3Rlc3RfdW5pdHRlc3QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL2d0ZXN0X3VuaXR0ZXN0LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25OYW1lKS8kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKS8kKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSI0Ig0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IkZBTFNFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9ndGVzdF91bml0dGVzdC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwkJPFByb2plY3RSZWZlcmVuY2UNCisJCQlSZWZlcmVuY2VkUHJvamVjdElkZW50aWZpZXI9InszQUY1NEM4QS0xMEJGLTQzMzItOTE0Ny1GNjhFRDk4NjIwMzJ9Ig0KKwkJCU5hbWU9Imd0ZXN0X21haW4iLz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cdGVzdFxndGVzdF91bml0dGVzdC5jYyI+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9wdGltaXphdGlvbj0iMSINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDsuLiZxdW90OzsmcXVvdDsuLlxpbmNsdWRlJnF1b3Q7Ig0KKwkJCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIi8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiI+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7Li4mcXVvdDs7JnF1b3Q7Li5caW5jbHVkZSZxdW90OyINCisJCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSI+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvcHJpbWVfdGFibGVzLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9wcmltZV90YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNlMTZhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvcHJpbWVfdGFibGVzLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVGhpcyBwcm92aWRlcyBpbnRlcmZhY2UgUHJpbWVUYWJsZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIG51bWJlciBpcyBhCisvLyBwcmltZSBhbmQgZGV0ZXJtaW5lcyBhIG5leHQgcHJpbWUgbnVtYmVyLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkCisvLyBpbiBHb29nbGUgVGVzdCBzYW1wbGVzIGRlbW9uc3RyYXRpbmcgdXNlIG9mIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisKKyNpZm5kZWYgR1RFU1RfU0FNUExFU19QUklNRV9UQUJMRVNfSF8KKyNkZWZpbmUgR1RFU1RfU0FNUExFU19QUklNRV9UQUJMRVNfSF8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLy8gVGhlIHByaW1lIHRhYmxlIGludGVyZmFjZS4KK2NsYXNzIFByaW1lVGFibGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+UHJpbWVUYWJsZSgpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiBuIGlzIGEgcHJpbWUgbnVtYmVyLgorICB2aXJ0dWFsIGJvb2wgSXNQcmltZShpbnQgbikgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgdGhlIHNtYWxsZXN0IHByaW1lIG51bWJlciBncmVhdGVyIHRoYW4gcDsgb3IgcmV0dXJucyAtMQorICAvLyBpZiB0aGUgbmV4dCBwcmltZSBpcyBiZXlvbmQgdGhlIGNhcGFjaXR5IG9mIHRoZSB0YWJsZS4KKyAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCA9IDA7Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiAjMSBjYWxjdWxhdGVzIHRoZSBwcmltZXMgb24tdGhlLWZseS4KK2NsYXNzIE9uVGhlRmx5UHJpbWVUYWJsZSA6IHB1YmxpYyBQcmltZVRhYmxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBJc1ByaW1lKGludCBuKSBjb25zdCB7CisgICAgaWYgKG4gPD0gMSkgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDI7IGkqaSA8PSBuOyBpKyspIHsKKyAgICAgIC8vIG4gaXMgZGl2aXNpYmxlIGJ5IGFuIGludGVnZXIgb3RoZXIgdGhhbiAxIGFuZCBpdHNlbGYuCisgICAgICBpZiAoKG4gJSBpKSA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2aXJ0dWFsIGludCBHZXROZXh0UHJpbWUoaW50IHApIGNvbnN0IHsKKyAgICBmb3IgKGludCBuID0gcCArIDE7IG4gPiAwOyBuKyspIHsKKyAgICAgIGlmIChJc1ByaW1lKG4pKSByZXR1cm4gbjsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7CisgIH0KK307CisKKy8vIEltcGxlbWVudGF0aW9uICMyIHByZS1jYWxjdWxhdGVzIHRoZSBwcmltZXMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0CisvLyBpbiBhbiBhcnJheS4KK2NsYXNzIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlIDogcHVibGljIFByaW1lVGFibGUgeworIHB1YmxpYzoKKyAgLy8gJ21heCcgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciB0aGUgcHJpbWUgdGFibGUgaG9sZHMuCisgIGV4cGxpY2l0IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKGludCBtYXgpCisgICAgICA6IGlzX3ByaW1lX3NpemVfKG1heCArIDEpLCBpc19wcmltZV8obmV3IGJvb2xbbWF4ICsgMV0pIHsKKyAgICBDYWxjdWxhdGVQcmltZXNVcFRvKG1heCk7CisgIH0KKyAgdmlydHVhbCB+UHJlQ2FsY3VsYXRlZFByaW1lVGFibGUoKSB7IGRlbGV0ZVtdIGlzX3ByaW1lXzsgfQorCisgIHZpcnR1YWwgYm9vbCBJc1ByaW1lKGludCBuKSBjb25zdCB7CisgICAgcmV0dXJuIDAgPD0gbiAmJiBuIDwgaXNfcHJpbWVfc2l6ZV8gJiYgaXNfcHJpbWVfW25dOworICB9CisKKyAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCB7CisgICAgZm9yIChpbnQgbiA9IHAgKyAxOyBuIDwgaXNfcHJpbWVfc2l6ZV87IG4rKykgeworICAgICAgaWYgKGlzX3ByaW1lX1tuXSkgcmV0dXJuIG47CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIENhbGN1bGF0ZVByaW1lc1VwVG8oaW50IG1heCkgeworICAgIDo6c3RkOjpmaWxsKGlzX3ByaW1lXywgaXNfcHJpbWVfICsgaXNfcHJpbWVfc2l6ZV8sIHRydWUpOworICAgIGlzX3ByaW1lX1swXSA9IGlzX3ByaW1lX1sxXSA9IGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbWF4OyBpKyspIHsKKyAgICAgIGlmICghaXNfcHJpbWVfW2ldKSBjb250aW51ZTsKKworICAgICAgLy8gTWFya3MgYWxsIG11bHRpcGxlcyBvZiBpIChleGNlcHQgaSBpdHNlbGYpIGFzIG5vbi1wcmltZS4KKyAgICAgIGZvciAoaW50IGogPSAyKmk7IGogPD0gbWF4OyBqICs9IGkpIHsKKyAgICAgICAgaXNfcHJpbWVfW2pdID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgY29uc3QgaW50IGlzX3ByaW1lX3NpemVfOworICBib29sKiBjb25zdCBpc19wcmltZV87CisKKyAgLy8gRGlzYWJsZXMgY29tcGlsZXIgd2FybmluZyAiYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLiIKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUmIHJocyk7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfUFJJTUVfVEFCTEVTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGUxLmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlMS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcxZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlMS5jYwpAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgInNhbXBsZTEuaCIKKworLy8gUmV0dXJucyBuISAodGhlIGZhY3RvcmlhbCBvZiBuKS4gIEZvciBuZWdhdGl2ZSBuLCBuISBpcyBkZWZpbmVkIHRvIGJlIDEuCitpbnQgRmFjdG9yaWFsKGludCBuKSB7CisgIGludCByZXN1bHQgPSAxOworICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKKyAgICByZXN1bHQgKj0gaTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgbiBpcyBhIHByaW1lIG51bWJlci4KK2Jvb2wgSXNQcmltZShpbnQgbikgeworICAvLyBUcml2aWFsIGNhc2UgMTogc21hbGwgbnVtYmVycworICBpZiAobiA8PSAxKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gVHJpdmlhbCBjYXNlIDI6IGV2ZW4gbnVtYmVycworICBpZiAobiAlIDIgPT0gMCkgcmV0dXJuIG4gPT0gMjsKKworICAvLyBOb3csIHdlIGhhdmUgdGhhdCBuIGlzIG9kZCBhbmQgbiA+PSAzLgorCisgIC8vIFRyeSB0byBkaXZpZGUgbiBieSBldmVyeSBvZGQgbnVtYmVyIGksIHN0YXJ0aW5nIGZyb20gMworICBmb3IgKGludCBpID0gMzsgOyBpICs9IDIpIHsKKyAgICAvLyBXZSBvbmx5IGhhdmUgdG8gdHJ5IGkgdXAgdG8gdGhlIHNxdXJlIHJvb3Qgb2YgbgorICAgIGlmIChpID4gbi9pKSBicmVhazsKKworICAgIC8vIE5vdywgd2UgaGF2ZSBpIDw9IG4vaSA8IG4uCisgICAgLy8gSWYgbiBpcyBkaXZpc2libGUgYnkgaSwgbiBpcyBub3QgcHJpbWUuCisgICAgaWYgKG4gJSBpID09IDApIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIG4gaGFzIG5vIGludGVnZXIgZmFjdG9yIGluIHRoZSByYW5nZSAoMSwgbiksIGFuZCB0aHVzIGlzIHByaW1lLgorICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTEuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZlYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlMS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFMV9IXworI2RlZmluZSBHVEVTVF9TQU1QTEVTX1NBTVBMRTFfSF8KKworLy8gUmV0dXJucyBuISAodGhlIGZhY3RvcmlhbCBvZiBuKS4gIEZvciBuZWdhdGl2ZSBuLCBuISBpcyBkZWZpbmVkIHRvIGJlIDEuCitpbnQgRmFjdG9yaWFsKGludCBuKTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiBuIGlzIGEgcHJpbWUgbnVtYmVyLgorYm9vbCBJc1ByaW1lKGludCBuKTsKKworI2VuZGlmICAvLyBHVEVTVF9TQU1QTEVTX1NBTVBMRTFfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlMTBfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1MWNkNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTEwX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTQ0IEBACisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHVzZSBHb29nbGUgVGVzdCBsaXN0ZW5lciBBUEkgdG8gaW1wbGVtZW50CisvLyBhIHByaW1pdGl2ZSBsZWFrIGNoZWNrZXIuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwordXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdENhc2U7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyczsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEluZm87Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwordXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKKworbmFtZXNwYWNlIHsKKworLy8gV2Ugd2lsbCB0cmFjayBtZW1vcnkgdXNlZCBieSB0aGlzIGNsYXNzLgorY2xhc3MgV2F0ZXIgeworIHB1YmxpYzoKKyAgLy8gTm9ybWFsIFdhdGVyIGRlY2xhcmF0aW9ucyBnbyBoZXJlLgorCisgIC8vIG9wZXJhdG9yIG5ldyBhbmQgb3BlcmF0b3IgZGVsZXRlIGhlbHAgdXMgY29udHJvbCB3YXRlciBhbGxvY2F0aW9uLgorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IGFsbG9jYXRpb25fc2l6ZSkgeworICAgIGFsbG9jYXRlZF8rKzsKKyAgICByZXR1cm4gbWFsbG9jKGFsbG9jYXRpb25fc2l6ZSk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBibG9jaywgc2l6ZV90IC8qIGFsbG9jYXRpb25fc2l6ZSAqLykgeworICAgIGFsbG9jYXRlZF8tLTsKKyAgICBmcmVlKGJsb2NrKTsKKyAgfQorCisgIHN0YXRpYyBpbnQgYWxsb2NhdGVkKCkgeyByZXR1cm4gYWxsb2NhdGVkXzsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBhbGxvY2F0ZWRfOworfTsKKworaW50IFdhdGVyOjphbGxvY2F0ZWRfID0gMDsKKworLy8gVGhpcyBldmVudCBsaXN0ZW5lciBtb25pdG9ycyBob3cgbWFueSBXYXRlciBvYmplY3RzIGFyZSBjcmVhdGVkIGFuZAorLy8gZGVzdHJveWVkIGJ5IGVhY2ggdGVzdCwgYW5kIHJlcG9ydHMgYSBmYWlsdXJlIGlmIGEgdGVzdCBsZWFrcyBzb21lIFdhdGVyCisvLyBvYmplY3RzLiBJdCBkb2VzIHRoaXMgYnkgY29tcGFyaW5nIHRoZSBudW1iZXIgb2YgbGl2ZSBXYXRlciBvYmplY3RzIGF0CisvLyB0aGUgYmVnaW5uaW5nIG9mIGEgdGVzdCBhbmQgYXQgdGhlIGVuZCBvZiBhIHRlc3QuCitjbGFzcyBMZWFrQ2hlY2tlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwcml2YXRlOgorICAvLyBDYWxsZWQgYmVmb3JlIGEgdGVzdCBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyogdGVzdF9pbmZvICovKSB7CisgICAgaW5pdGlhbGx5X2FsbG9jYXRlZF8gPSBXYXRlcjo6YWxsb2NhdGVkKCk7CisgIH0KKworICAvLyBDYWxsZWQgYWZ0ZXIgYSB0ZXN0IGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qIHRlc3RfaW5mbyAqLykgeworICAgIGludCBkaWZmZXJlbmNlID0gV2F0ZXI6OmFsbG9jYXRlZCgpIC0gaW5pdGlhbGx5X2FsbG9jYXRlZF87CisKKyAgICAvLyBZb3UgY2FuIGdlbmVyYXRlIGEgZmFpbHVyZSBpbiBhbnkgZXZlbnQgaGFuZGxlciBleGNlcHQKKyAgICAvLyBPblRlc3RQYXJ0UmVzdWx0LiBKdXN0IHVzZSBhbiBhcHByb3ByaWF0ZSBHb29nbGUgVGVzdCBhc3NlcnRpb24gdG8gZG8KKyAgICAvLyBpdC4KKyAgICBFWFBFQ1RfTEUoZGlmZmVyZW5jZSwgMCkgPDwgIkxlYWtlZCAiIDw8IGRpZmZlcmVuY2UgPDwgIiB1bml0KHMpIG9mIFdhdGVyISI7CisgIH0KKworICBpbnQgaW5pdGlhbGx5X2FsbG9jYXRlZF87Cit9OworCitURVNUKExpc3RlbmVyc1Rlc3QsIERvZXNOb3RMZWFrKSB7CisgIFdhdGVyKiB3YXRlciA9IG5ldyBXYXRlcjsKKyAgZGVsZXRlIHdhdGVyOworfQorCisvLyBUaGlzIHNob3VsZCBmYWlsIHdoZW4gdGhlIC0tY2hlY2tfZm9yX2xlYWtzIGNvbW1hbmQgbGluZSBmbGFnIGlzCisvLyBzcGVjaWZpZWQuCitURVNUKExpc3RlbmVyc1Rlc3QsIExlYWtzV2F0ZXIpIHsKKyAgV2F0ZXIqIHdhdGVyID0gbmV3IFdhdGVyOworICBFWFBFQ1RfVFJVRSh3YXRlciAhPSBOVUxMKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgYm9vbCBjaGVja19mb3JfbGVha3MgPSBmYWxzZTsKKyAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLS1jaGVja19mb3JfbGVha3MiKSA9PSAwICkKKyAgICBjaGVja19mb3JfbGVha3MgPSB0cnVlOworICBlbHNlCisgICAgcHJpbnRmKCIlc1xuIiwgIlJ1biB0aGlzIHByb2dyYW0gd2l0aCAtLWNoZWNrX2Zvcl9sZWFrcyB0byBlbmFibGUgIgorICAgICAgICAgICAiY3VzdG9tIGxlYWsgY2hlY2tpbmcgaW4gdGhlIHRlc3RzLiIpOworCisgIC8vIElmIHdlIGFyZSBnaXZlbiB0aGUgLS1jaGVja19mb3JfbGVha3MgY29tbWFuZCBsaW5lIGZsYWcsIGluc3RhbGxzIHRoZQorICAvLyBsZWFrIGNoZWNrZXIuCisgIGlmIChjaGVja19mb3JfbGVha3MpIHsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKKworICAgIC8vIEFkZHMgdGhlIGxlYWsgY2hlY2tlciB0byB0aGUgZW5kIG9mIHRoZSB0ZXN0IGV2ZW50IGxpc3RlbmVyIGxpc3QsCisgICAgLy8gYWZ0ZXIgdGhlIGRlZmF1bHQgdGV4dCBvdXRwdXQgcHJpbnRlciBhbmQgdGhlIGRlZmF1bHQgWE1MIHJlcG9ydAorICAgIC8vIGdlbmVyYXRvci4KKyAgICAvLworICAgIC8vIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQgLSBpdCBlbnN1cmVzIHRoYXQgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZQorICAgIC8vIGxlYWsgY2hlY2tlcidzIE9uVGVzdEVuZCgpIG1ldGhvZCBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSB0ZXh0IGFuZCBYTUwKKyAgICAvLyBwcmludGVycyAqYmVmb3JlKiB0aGVpciBPblRlc3RFbmQoKSBtZXRob2RzIGFyZSBjYWxsZWQsIHN1Y2ggdGhhdAorICAgIC8vIHRoZXkgYXJlIGF0dHJpYnV0ZWQgdG8gdGhlIHJpZ2h0IHRlc3QuIFJlbWVtYmVyIHRoYXQgYSBsaXN0ZW5lcgorICAgIC8vIHJlY2VpdmVzIGFuIE9uWHl6U3RhcnQgZXZlbnQgKmFmdGVyKiBsaXN0ZW5lcnMgcHJlY2VkaW5nIGl0IGluIHRoZQorICAgIC8vIGxpc3QgcmVjZWl2ZWQgdGhhdCBldmVudCwgYW5kIHJlY2VpdmVzIGFuIE9uWHl6RW5kIGV2ZW50ICpiZWZvcmUqCisgICAgLy8gbGlzdGVuZXJzIHByZWNlZGluZyBpdC4KKyAgICAvLworICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgZGVsZXRpbmcgdGhlIG5ldyBsaXN0ZW5lciBsYXRlciwgYXMKKyAgICAvLyBHb29nbGUgVGVzdCB3aWxsIGRvIGl0LgorICAgIGxpc3RlbmVycy5BcHBlbmQobmV3IExlYWtDaGVja2VyKTsKKyAgfQorICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlMV91bml0dGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmYzRmMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTFfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxNTMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB3cml0ZSBhIHNpbXBsZSB1bml0IHRlc3QgZm9yIGEgZnVuY3Rpb24sCisvLyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIFdyaXRpbmcgYSB1bml0IHRlc3QgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yayBpcyBlYXN5IGFzIDEtMi0zOgorCisKKy8vIFN0ZXAgMS4gSW5jbHVkZSBuZWNlc3NhcnkgaGVhZGVyIGZpbGVzIHN1Y2ggdGhhdCB0aGUgc3R1ZmYgeW91cgorLy8gdGVzdCBsb2dpYyBuZWVkcyBpcyBkZWNsYXJlZC4KKy8vCisvLyBEb24ndCBmb3JnZXQgZ3Rlc3QuaCwgd2hpY2ggZGVjbGFyZXMgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAic2FtcGxlMS5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKworLy8gU3RlcCAyLiBVc2UgdGhlIFRFU1QgbWFjcm8gdG8gZGVmaW5lIHlvdXIgdGVzdHMuCisvLworLy8gVEVTVCBoYXMgdHdvIHBhcmFtZXRlcnM6IHRoZSB0ZXN0IGNhc2UgbmFtZSBhbmQgdGhlIHRlc3QgbmFtZS4KKy8vIEFmdGVyIHVzaW5nIHRoZSBtYWNybywgeW91IHNob3VsZCBkZWZpbmUgeW91ciB0ZXN0IGxvZ2ljIGJldHdlZW4gYQorLy8gcGFpciBvZiBicmFjZXMuICBZb3UgY2FuIHVzZSBhIGJ1bmNoIG9mIG1hY3JvcyB0byBpbmRpY2F0ZSB0aGUKKy8vIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBhIHRlc3QuICBFWFBFQ1RfVFJVRSBhbmQgRVhQRUNUX0VRIGFyZQorLy8gZXhhbXBsZXMgb2Ygc3VjaCBtYWNyb3MuICBGb3IgYSBjb21wbGV0ZSBsaXN0LCBzZWUgZ3Rlc3QuaC4KKy8vCisvLyA8VGVjaG5pY2FsRGV0YWlscz4KKy8vCisvLyBJbiBHb29nbGUgVGVzdCwgdGVzdHMgYXJlIGdyb3VwZWQgaW50byB0ZXN0IGNhc2VzLiAgVGhpcyBpcyBob3cgd2UKKy8vIGtlZXAgdGVzdCBjb2RlIG9yZ2FuaXplZC4gIFlvdSBzaG91bGQgcHV0IGxvZ2ljYWxseSByZWxhdGVkIHRlc3RzCisvLyBpbnRvIHRoZSBzYW1lIHRlc3QgY2FzZS4KKy8vCisvLyBUaGUgdGVzdCBjYXNlIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUgc2hvdWxkIGJvdGggYmUgdmFsaWQgQysrCisvLyBpZGVudGlmaWVycy4gIEFuZCB5b3Ugc2hvdWxkIG5vdCB1c2UgdW5kZXJzY29yZSAoXykgaW4gdGhlIG5hbWVzLgorLy8KKy8vIEdvb2dsZSBUZXN0IGd1YXJhbnRlZXMgdGhhdCBlYWNoIHRlc3QgeW91IGRlZmluZSBpcyBydW4gZXhhY3RseQorLy8gb25jZSwgYnV0IGl0IG1ha2VzIG5vIGd1YXJhbnRlZSBvbiB0aGUgb3JkZXIgdGhlIHRlc3RzIGFyZQorLy8gZXhlY3V0ZWQuICBUaGVyZWZvcmUsIHlvdSBzaG91bGQgd3JpdGUgeW91ciB0ZXN0cyBpbiBzdWNoIGEgd2F5CisvLyB0aGF0IHRoZWlyIHJlc3VsdHMgZG9uJ3QgZGVwZW5kIG9uIHRoZWlyIG9yZGVyLgorLy8KKy8vIDwvVGVjaG5pY2FsRGV0YWlscz4KKworCisvLyBUZXN0cyBGYWN0b3JpYWwoKS4KKworLy8gVGVzdHMgZmFjdG9yaWFsIG9mIG5lZ2F0aXZlIG51bWJlcnMuCitURVNUKEZhY3RvcmlhbFRlc3QsIE5lZ2F0aXZlKSB7CisgIC8vIFRoaXMgdGVzdCBpcyBuYW1lZCAiTmVnYXRpdmUiLCBhbmQgYmVsb25ncyB0byB0aGUgIkZhY3RvcmlhbFRlc3QiCisgIC8vIHRlc3QgY2FzZS4KKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgtNSkpOworICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKC0xKSk7CisgIEVYUEVDVF9HVChGYWN0b3JpYWwoLTEwKSwgMCk7CisKKyAgLy8gPFRlY2huaWNhbERldGFpbHM+CisgIC8vCisgIC8vIEVYUEVDVF9FUShleHBlY3RlZCwgYWN0dWFsKSBpcyB0aGUgc2FtZSBhcworICAvLworICAvLyAgIEVYUEVDVF9UUlVFKChleHBlY3RlZCkgPT0gKGFjdHVhbCkpCisgIC8vCisgIC8vIGV4Y2VwdCB0aGF0IGl0IHdpbGwgcHJpbnQgYm90aCB0aGUgZXhwZWN0ZWQgdmFsdWUgYW5kIHRoZSBhY3R1YWwKKyAgLy8gdmFsdWUgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiAgVGhpcyBpcyB2ZXJ5IGhlbHBmdWwgZm9yCisgIC8vIGRlYnVnZ2luZy4gIFRoZXJlZm9yZSBpbiB0aGlzIGNhc2UgRVhQRUNUX0VRIGlzIHByZWZlcnJlZC4KKyAgLy8KKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIEVYUEVDVF9UUlVFIGFjY2VwdHMgYW55IEJvb2xlYW4gZXhwcmVzc2lvbiwKKyAgLy8gYW5kIGlzIHRodXMgbW9yZSBnZW5lcmFsLgorICAvLworICAvLyA8L1RlY2huaWNhbERldGFpbHM+Cit9CisKKy8vIFRlc3RzIGZhY3RvcmlhbCBvZiAwLgorVEVTVChGYWN0b3JpYWxUZXN0LCBaZXJvKSB7CisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoMCkpOworfQorCisvLyBUZXN0cyBmYWN0b3JpYWwgb2YgcG9zaXRpdmUgbnVtYmVycy4KK1RFU1QoRmFjdG9yaWFsVGVzdCwgUG9zaXRpdmUpIHsKKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgxKSk7CisgIEVYUEVDVF9FUSgyLCBGYWN0b3JpYWwoMikpOworICBFWFBFQ1RfRVEoNiwgRmFjdG9yaWFsKDMpKTsKKyAgRVhQRUNUX0VRKDQwMzIwLCBGYWN0b3JpYWwoOCkpOworfQorCisKKy8vIFRlc3RzIElzUHJpbWUoKQorCisvLyBUZXN0cyBuZWdhdGl2ZSBpbnB1dC4KK1RFU1QoSXNQcmltZVRlc3QsIE5lZ2F0aXZlKSB7CisgIC8vIFRoaXMgdGVzdCBiZWxvbmdzIHRvIHRoZSBJc1ByaW1lVGVzdCB0ZXN0IGNhc2UuCisKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoLTEpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoLTIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoSU5UX01JTikpOworfQorCisvLyBUZXN0cyBzb21lIHRyaXZpYWwgY2FzZXMuCitURVNUKElzUHJpbWVUZXN0LCBUcml2aWFsKSB7CisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoMSkpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDIpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSgzKSk7Cit9CisKKy8vIFRlc3RzIHBvc2l0aXZlIGlucHV0LgorVEVTVChJc1ByaW1lVGVzdCwgUG9zaXRpdmUpIHsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoNCkpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDUpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoNikpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDIzKSk7Cit9CisKKy8vIFN0ZXAgMy4gQ2FsbCBSVU5fQUxMX1RFU1RTKCkgaW4gbWFpbigpLgorLy8KKy8vIFdlIGRvIHRoaXMgYnkgbGlua2luZyBpbiBzcmMvZ3Rlc3RfbWFpbi5jYyBmaWxlLCB3aGljaCBjb25zaXN0cyBvZgorLy8gYSBtYWluKCkgZnVuY3Rpb24gd2hpY2ggY2FsbHMgUlVOX0FMTF9URVNUUygpIGZvciB1cy4KKy8vCisvLyBUaGlzIHJ1bnMgYWxsIHRoZSB0ZXN0cyB5b3UndmUgZGVmaW5lZCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAorLy8gcmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgorLy8KKy8vIERpZCB5b3Ugbm90aWNlIHRoYXQgd2UgZGlkbid0IHJlZ2lzdGVyIHRoZSB0ZXN0cz8gIFRoZQorLy8gUlVOX0FMTF9URVNUUygpIG1hY3JvIG1hZ2ljYWxseSBrbm93cyBhYm91dCBhbGwgdGhlIHRlc3RzIHdlCisvLyBkZWZpbmVkLiAgSXNuJ3QgdGhpcyBjb252ZW5pZW50PwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlMi5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3NjNiOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTIuY2MKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBIHNhbXBsZSBwcm9ncmFtIGRlbW9uc3RyYXRpbmcgdXNpbmcgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJzYW1wbGUyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuCitjb25zdCBjaGFyKiBNeVN0cmluZzo6Q2xvbmVDU3RyaW5nKGNvbnN0IGNoYXIqIGFfY19zdHJpbmcpIHsKKyAgaWYgKGFfY19zdHJpbmcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgY29uc3Qgc2l6ZV90IGxlbiA9IHN0cmxlbihhX2Nfc3RyaW5nKTsKKyAgY2hhciogY29uc3QgY2xvbmUgPSBuZXcgY2hhclsgbGVuICsgMSBdOworICBtZW1jcHkoY2xvbmUsIGFfY19zdHJpbmcsIGxlbiArIDEpOworCisgIHJldHVybiBjbG9uZTsKK30KKworLy8gU2V0cyB0aGUgMC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRoaXMgTXlTdHJpbmcgb2JqZWN0CisvLyByZXByZXNlbnRzLgordm9pZCBNeVN0cmluZzo6U2V0KGNvbnN0IGNoYXIqIGFfY19zdHJpbmcpIHsKKyAgLy8gTWFrZXMgc3VyZSB0aGlzIHdvcmtzIHdoZW4gY19zdHJpbmcgPT0gY19zdHJpbmdfCisgIGNvbnN0IGNoYXIqIGNvbnN0IHRlbXAgPSBNeVN0cmluZzo6Q2xvbmVDU3RyaW5nKGFfY19zdHJpbmcpOworICBkZWxldGVbXSBjX3N0cmluZ187CisgIGNfc3RyaW5nXyA9IHRlbXA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGUyLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGUyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0ODVjNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTIuaApAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9TQU1QTEVTX1NBTVBMRTJfSF8KKyNkZWZpbmUgR1RFU1RfU0FNUExFU19TQU1QTEUyX0hfCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvLyBBIHNpbXBsZSBzdHJpbmcgY2xhc3MuCitjbGFzcyBNeVN0cmluZyB7CisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogY19zdHJpbmdfOworICBjb25zdCBNeVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IE15U3RyaW5nJiByaHMpOworCisgcHVibGljOgorICAvLyBDbG9uZXMgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHVzaW5nIG5ldy4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIENsb25lQ1N0cmluZyhjb25zdCBjaGFyKiBhX2Nfc3RyaW5nKTsKKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8KKyAgLy8gQyd0b3JzCisKKyAgLy8gVGhlIGRlZmF1bHQgYyd0b3IgY29uc3RydWN0cyBhIE5VTEwgc3RyaW5nLgorICBNeVN0cmluZygpIDogY19zdHJpbmdfKE5VTEwpIHt9CisKKyAgLy8gQ29uc3RydWN0cyBhIE15U3RyaW5nIGJ5IGNsb25pbmcgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcuCisgIGV4cGxpY2l0IE15U3RyaW5nKGNvbnN0IGNoYXIqIGFfY19zdHJpbmcpIDogY19zdHJpbmdfKE5VTEwpIHsKKyAgICBTZXQoYV9jX3N0cmluZyk7CisgIH0KKworICAvLyBDb3B5IGMndG9yCisgIE15U3RyaW5nKGNvbnN0IE15U3RyaW5nJiBzdHJpbmcpIDogY19zdHJpbmdfKE5VTEwpIHsKKyAgICBTZXQoc3RyaW5nLmNfc3RyaW5nXyk7CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8KKyAgLy8gRCd0b3IuICBNeVN0cmluZyBpcyBpbnRlbmRlZCB0byBiZSBhIGZpbmFsIGNsYXNzLCBzbyB0aGUgZCd0b3IKKyAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHZpcnR1YWwuCisgIH5NeVN0cmluZygpIHsgZGVsZXRlW10gY19zdHJpbmdfOyB9CisKKyAgLy8gR2V0cyB0aGUgMC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRoaXMgTXlTdHJpbmcgb2JqZWN0IHJlcHJlc2VudHMuCisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gY19zdHJpbmdfOyB9CisKKyAgc2l6ZV90IExlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY19zdHJpbmdfID09IE5VTEwgPyAwIDogc3RybGVuKGNfc3RyaW5nXyk7CisgIH0KKworICAvLyBTZXRzIHRoZSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcgdGhpcyBNeVN0cmluZyBvYmplY3QgcmVwcmVzZW50cy4KKyAgdm9pZCBTZXQoY29uc3QgY2hhciogY19zdHJpbmcpOworfTsKKworCisjZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFMl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlMl91bml0dGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhMTliNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMDkgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB3cml0ZSBhIG1vcmUgY29tcGxleCB1bml0IHRlc3QgZm9yIGEgY2xhc3MKKy8vIHRoYXQgaGFzIG11bHRpcGxlIG1lbWJlciBmdW5jdGlvbnMuCisvLworLy8gVXN1YWxseSwgaXQncyBhIGdvb2QgaWRlYSB0byBoYXZlIG9uZSB0ZXN0IGZvciBlYWNoIG1ldGhvZCBpbiB5b3VyCisvLyBjbGFzcy4gIFlvdSBkb24ndCBoYXZlIHRvIGRvIHRoYXQgZXhhY3RseSwgYnV0IGl0IGhlbHBzIHRvIGtlZXAKKy8vIHlvdXIgdGVzdHMgb3JnYW5pemVkLiAgWW91IG1heSBhbHNvIHRocm93IGluIGFkZGl0aW9uYWwgdGVzdHMgYXMKKy8vIG5lZWRlZC4KKworI2luY2x1ZGUgInNhbXBsZTIuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBJbiB0aGlzIGV4YW1wbGUsIHdlIHRlc3QgdGhlIE15U3RyaW5nIGNsYXNzIChhIHNpbXBsZSBzdHJpbmcpLgorCisvLyBUZXN0cyB0aGUgZGVmYXVsdCBjJ3Rvci4KK1RFU1QoTXlTdHJpbmcsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICBjb25zdCBNeVN0cmluZyBzOworCisgIC8vIEFzc2VydHMgdGhhdCBzLmNfc3RyaW5nKCkgcmV0dXJucyBOVUxMLgorICAvLworICAvLyA8VGVjaG5pY2FsRGV0YWlscz4KKyAgLy8KKyAgLy8gSWYgd2Ugd3JpdGUgTlVMTCBpbnN0ZWFkIG9mCisgIC8vCisgIC8vICAgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihOVUxMKQorICAvLworICAvLyBpbiB0aGlzIGFzc2VydGlvbiwgaXQgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcgb24gZ2NjIDMuNC4gIFRoZQorICAvLyByZWFzb24gaXMgdGhhdCBFWFBFQ1RfRVEgbmVlZHMgdG8ga25vdyB0aGUgdHlwZXMgb2YgaXRzCisgIC8vIGFyZ3VtZW50cyBpbiBvcmRlciB0byBwcmludCB0aGVtIHdoZW4gaXQgZmFpbHMuICBTaW5jZSBOVUxMIGlzCisgIC8vICNkZWZpbmVkIGFzIDAsIHRoZSBjb21waWxlciB3aWxsIHVzZSB0aGUgZm9ybWF0dGVyIGZ1bmN0aW9uIGZvcgorICAvLyBpbnQgdG8gcHJpbnQgaXQuICBIb3dldmVyLCBnY2MgdGhpbmtzIHRoYXQgTlVMTCBzaG91bGQgYmUgdXNlZCBhcworICAvLyBhIHBvaW50ZXIsIG5vdCBhbiBpbnQsIGFuZCB0aGVyZWZvcmUgY29tcGxhaW5zLgorICAvLworICAvLyBUaGUgcm9vdCBvZiB0aGUgcHJvYmxlbSBpcyBDKysncyBsYWNrIG9mIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlCisgIC8vIGludGVnZXIgbnVtYmVyIDAgYW5kIHRoZSBudWxsIHBvaW50ZXIgY29uc3RhbnQuICBVbmZvcnR1bmF0ZWx5LAorICAvLyB3ZSBoYXZlIHRvIGxpdmUgd2l0aCB0aGlzIGZhY3QuCisgIC8vCisgIC8vIDwvVGVjaG5pY2FsRGV0YWlscz4KKyAgRVhQRUNUX1NUUkVRKE5VTEwsIHMuY19zdHJpbmcoKSk7CisKKyAgRVhQRUNUX0VRKDB1LCBzLkxlbmd0aCgpKTsKK30KKworY29uc3QgY2hhciBrSGVsbG9TdHJpbmdbXSA9ICJIZWxsbywgd29ybGQhIjsKKworLy8gVGVzdHMgdGhlIGMndG9yIHRoYXQgYWNjZXB0cyBhIEMgc3RyaW5nLgorVEVTVChNeVN0cmluZywgQ29uc3RydWN0b3JGcm9tQ1N0cmluZykgeworICBjb25zdCBNeVN0cmluZyBzKGtIZWxsb1N0cmluZyk7CisgIEVYUEVDVF9FUSgwLCBzdHJjbXAocy5jX3N0cmluZygpLCBrSGVsbG9TdHJpbmcpKTsKKyAgRVhQRUNUX0VRKHNpemVvZihrSGVsbG9TdHJpbmcpL3NpemVvZihrSGVsbG9TdHJpbmdbMF0pIC0gMSwKKyAgICAgICAgICAgIHMuTGVuZ3RoKCkpOworfQorCisvLyBUZXN0cyB0aGUgY29weSBjJ3Rvci4KK1RFU1QoTXlTdHJpbmcsIENvcHlDb25zdHJ1Y3RvcikgeworICBjb25zdCBNeVN0cmluZyBzMShrSGVsbG9TdHJpbmcpOworICBjb25zdCBNeVN0cmluZyBzMiA9IHMxOworICBFWFBFQ1RfRVEoMCwgc3RyY21wKHMyLmNfc3RyaW5nKCksIGtIZWxsb1N0cmluZykpOworfQorCisvLyBUZXN0cyB0aGUgU2V0IG1ldGhvZC4KK1RFU1QoTXlTdHJpbmcsIFNldCkgeworICBNeVN0cmluZyBzOworCisgIHMuU2V0KGtIZWxsb1N0cmluZyk7CisgIEVYUEVDVF9FUSgwLCBzdHJjbXAocy5jX3N0cmluZygpLCBrSGVsbG9TdHJpbmcpKTsKKworICAvLyBTZXQgc2hvdWxkIHdvcmsgd2hlbiB0aGUgaW5wdXQgcG9pbnRlciBpcyB0aGUgc2FtZSBhcyB0aGUgb25lCisgIC8vIGFscmVhZHkgaW4gdGhlIE15U3RyaW5nIG9iamVjdC4KKyAgcy5TZXQocy5jX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDAsIHN0cmNtcChzLmNfc3RyaW5nKCksIGtIZWxsb1N0cmluZykpOworCisgIC8vIENhbiB3ZSBzZXQgdGhlIE15U3RyaW5nIHRvIE5VTEw/CisgIHMuU2V0KE5VTEwpOworICBFWFBFQ1RfU1RSRVEoTlVMTCwgcy5jX3N0cmluZygpKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTMtaW5sLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGUzLWlubC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzA4NGQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGUzLWlubC5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9TQU1QTEVTX1NBTVBMRTNfSU5MX0hfCisjZGVmaW5lIEdURVNUX1NBTVBMRVNfU0FNUExFM19JTkxfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8vIFF1ZXVlIGlzIGEgc2ltcGxlIHF1ZXVlIGltcGxlbWVudGVkIGFzIGEgc2luZ2xlZC1saW5rZWQgbGlzdC4KKy8vCisvLyBUaGUgZWxlbWVudCB0eXBlIG11c3Qgc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+ICAvLyBFIGlzIHRoZSBlbGVtZW50IHR5cGUKK2NsYXNzIFF1ZXVlOworCisvLyBRdWV1ZU5vZGUgaXMgYSBub2RlIGluIGEgUXVldWUsIHdoaWNoIGNvbnNpc3RzIG9mIGFuIGVsZW1lbnQgb2YKKy8vIHR5cGUgRSBhbmQgYSBwb2ludGVyIHRvIHRoZSBuZXh0IG5vZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4gIC8vIEUgaXMgdGhlIGVsZW1lbnQgdHlwZQorY2xhc3MgUXVldWVOb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFF1ZXVlPEU+OworCisgcHVibGljOgorICAvLyBHZXRzIHRoZSBlbGVtZW50IGluIHRoaXMgbm9kZS4KKyAgY29uc3QgRSYgZWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGVsZW1lbnRfOyB9CisKKyAgLy8gR2V0cyB0aGUgbmV4dCBub2RlIGluIHRoZSBxdWV1ZS4KKyAgUXVldWVOb2RlKiBuZXh0KCkgeyByZXR1cm4gbmV4dF87IH0KKyAgY29uc3QgUXVldWVOb2RlKiBuZXh0KCkgY29uc3QgeyByZXR1cm4gbmV4dF87IH0KKworIHByaXZhdGU6CisgIC8vIENyZWF0ZXMgYSBub2RlIHdpdGggYSBnaXZlbiBlbGVtZW50IHZhbHVlLiAgVGhlIG5leHQgcG9pbnRlciBpcworICAvLyBzZXQgdG8gTlVMTC4KKyAgZXhwbGljaXQgUXVldWVOb2RlKGNvbnN0IEUmIGFuX2VsZW1lbnQpIDogZWxlbWVudF8oYW5fZWxlbWVudCksIG5leHRfKE5VTEwpIHt9CisKKyAgLy8gV2UgZGlzYWJsZSB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IG9wZXJhdG9yIGFuZCBjb3B5IGMndG9yLgorICBjb25zdCBRdWV1ZU5vZGUmIG9wZXJhdG9yID0gKGNvbnN0IFF1ZXVlTm9kZSYpOworICBRdWV1ZU5vZGUoY29uc3QgUXVldWVOb2RlJik7CisKKyAgRSBlbGVtZW50XzsKKyAgUXVldWVOb2RlKiBuZXh0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFPiAgLy8gRSBpcyB0aGUgZWxlbWVudCB0eXBlLgorY2xhc3MgUXVldWUgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBxdWV1ZS4KKyAgUXVldWUoKSA6IGhlYWRfKE5VTEwpLCBsYXN0XyhOVUxMKSwgc2l6ZV8oMCkge30KKworICAvLyBEJ3Rvci4gIENsZWFycyB0aGUgcXVldWUuCisgIH5RdWV1ZSgpIHsgQ2xlYXIoKTsgfQorCisgIC8vIENsZWFycyB0aGUgcXVldWUuCisgIHZvaWQgQ2xlYXIoKSB7CisgICAgaWYgKHNpemVfID4gMCkgeworICAgICAgLy8gMS4gRGVsZXRlcyBldmVyeSBub2RlLgorICAgICAgUXVldWVOb2RlPEU+KiBub2RlID0gaGVhZF87CisgICAgICBRdWV1ZU5vZGU8RT4qIG5leHQgPSBub2RlLT5uZXh0KCk7CisgICAgICBmb3IgKDsgOykgeworICAgICAgICBkZWxldGUgbm9kZTsKKyAgICAgICAgbm9kZSA9IG5leHQ7CisgICAgICAgIGlmIChub2RlID09IE5VTEwpIGJyZWFrOworICAgICAgICBuZXh0ID0gbm9kZS0+bmV4dCgpOworICAgICAgfQorCisgICAgICAvLyAyLiBSZXNldHMgdGhlIG1lbWJlciB2YXJpYWJsZXMuCisgICAgICBoZWFkXyA9IGxhc3RfID0gTlVMTDsKKyAgICAgIHNpemVfID0gMDsKKyAgICB9CisgIH0KKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgIHNpemVfdCBTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworICAvLyBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgb3IgTlVMTCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgIFF1ZXVlTm9kZTxFPiogSGVhZCgpIHsgcmV0dXJuIGhlYWRfOyB9CisgIGNvbnN0IFF1ZXVlTm9kZTxFPiogSGVhZCgpIGNvbnN0IHsgcmV0dXJuIGhlYWRfOyB9CisKKyAgLy8gR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgb3IgTlVMTCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuCisgIFF1ZXVlTm9kZTxFPiogTGFzdCgpIHsgcmV0dXJuIGxhc3RfOyB9CisgIGNvbnN0IFF1ZXVlTm9kZTxFPiogTGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfOyB9CisKKyAgLy8gQWRkcyBhbiBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLiAgQSBjb3B5IG9mIHRoZSBlbGVtZW50IGlzCisgIC8vIGNyZWF0ZWQgdXNpbmcgdGhlIGNvcHkgY29uc3RydWN0b3IsIGFuZCB0aGVuIHN0b3JlZCBpbiB0aGUgcXVldWUuCisgIC8vIENoYW5nZXMgbWFkZSB0byB0aGUgZWxlbWVudCBpbiB0aGUgcXVldWUgZG9lc24ndCBhZmZlY3QgdGhlIHNvdXJjZQorICAvLyBvYmplY3QsIGFuZCB2aWNlIHZlcnNhLgorICB2b2lkIEVucXVldWUoY29uc3QgRSYgZWxlbWVudCkgeworICAgIFF1ZXVlTm9kZTxFPiogbmV3X25vZGUgPSBuZXcgUXVldWVOb2RlPEU+KGVsZW1lbnQpOworCisgICAgaWYgKHNpemVfID09IDApIHsKKyAgICAgIGhlYWRfID0gbGFzdF8gPSBuZXdfbm9kZTsKKyAgICAgIHNpemVfID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgbGFzdF8tPm5leHRfID0gbmV3X25vZGU7CisgICAgICBsYXN0XyA9IG5ld19ub2RlOworICAgICAgc2l6ZV8rKzsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmVzIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJucyBpdC4gIFJldHVybnMgTlVMTCBpZgorICAvLyB0aGUgcXVldWUgaXMgZW1wdHkuCisgIEUqIERlcXVldWUoKSB7CisgICAgaWYgKHNpemVfID09IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IFF1ZXVlTm9kZTxFPiogY29uc3Qgb2xkX2hlYWQgPSBoZWFkXzsKKyAgICBoZWFkXyA9IGhlYWRfLT5uZXh0XzsKKyAgICBzaXplXy0tOworICAgIGlmIChzaXplXyA9PSAwKSB7CisgICAgICBsYXN0XyA9IE5VTEw7CisgICAgfQorCisgICAgRSogZWxlbWVudCA9IG5ldyBFKG9sZF9oZWFkLT5lbGVtZW50KCkpOworICAgIGRlbGV0ZSBvbGRfaGVhZDsKKworICAgIHJldHVybiBlbGVtZW50OworICB9CisKKyAgLy8gQXBwbGllcyBhIGZ1bmN0aW9uL2Z1bmN0b3Igb24gZWFjaCBlbGVtZW50IG9mIHRoZSBxdWV1ZSwgYW5kCisgIC8vIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIG5ldyBxdWV1ZS4gIFRoZSBvcmlnaW5hbCBxdWV1ZSBpcyBub3QKKyAgLy8gYWZmZWN0ZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBRdWV1ZSogTWFwKEYgZnVuY3Rpb24pIGNvbnN0IHsKKyAgICBRdWV1ZSogbmV3X3F1ZXVlID0gbmV3IFF1ZXVlKCk7CisgICAgZm9yIChjb25zdCBRdWV1ZU5vZGU8RT4qIG5vZGUgPSBoZWFkXzsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dF8pIHsKKyAgICAgIG5ld19xdWV1ZS0+RW5xdWV1ZShmdW5jdGlvbihub2RlLT5lbGVtZW50KCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3X3F1ZXVlOworICB9CisKKyBwcml2YXRlOgorICBRdWV1ZU5vZGU8RT4qIGhlYWRfOyAgLy8gVGhlIGZpcnN0IG5vZGUgb2YgdGhlIHF1ZXVlLgorICBRdWV1ZU5vZGU8RT4qIGxhc3RfOyAgLy8gVGhlIGxhc3Qgbm9kZSBvZiB0aGUgcXVldWUuCisgIHNpemVfdCBzaXplXzsgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLgorCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgYSBxdWV1ZS4KKyAgUXVldWUoY29uc3QgUXVldWUmKTsKKyAgY29uc3QgUXVldWUmIG9wZXJhdG9yID0gKGNvbnN0IFF1ZXVlJik7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX1NBTVBMRVNfU0FNUExFM19JTkxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTNfdW5pdHRlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGUzX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzg3N2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGUzX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTUxIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworCisvLyBJbiB0aGlzIGV4YW1wbGUsIHdlIHVzZSBhIG1vcmUgYWR2YW5jZWQgZmVhdHVyZSBvZiBHb29nbGUgVGVzdCBjYWxsZWQKKy8vIHRlc3QgZml4dHVyZS4KKy8vCisvLyBBIHRlc3QgZml4dHVyZSBpcyBhIHBsYWNlIHRvIGhvbGQgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIHNoYXJlZCBieQorLy8gYWxsIHRlc3RzIGluIGEgdGVzdCBjYXNlLiAgVXNpbmcgYSB0ZXN0IGZpeHR1cmUgYXZvaWRzIGR1cGxpY2F0aW5nCisvLyB0aGUgdGVzdCBjb2RlIG5lY2Vzc2FyeSB0byBpbml0aWFsaXplIGFuZCBjbGVhbnVwIHRob3NlIGNvbW1vbgorLy8gb2JqZWN0cyBmb3IgZWFjaCB0ZXN0LiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIGRlZmluaW5nIHN1Yi1yb3V0aW5lcworLy8gdGhhdCB5b3VyIHRlc3RzIG5lZWQgdG8gaW52b2tlIGEgbG90LgorLy8KKy8vIDxUZWNobmljYWxEZXRhaWxzPgorLy8KKy8vIFRoZSB0ZXN0cyBzaGFyZSB0aGUgdGVzdCBmaXh0dXJlIGluIHRoZSBzZW5zZSBvZiBjb2RlIHNoYXJpbmcsIG5vdAorLy8gZGF0YSBzaGFyaW5nLiAgRWFjaCB0ZXN0IGlzIGdpdmVuIGl0cyBvd24gZnJlc2ggY29weSBvZiB0aGUKKy8vIGZpeHR1cmUuICBZb3UgY2Fubm90IGV4cGVjdCB0aGUgZGF0YSBtb2RpZmllZCBieSBvbmUgdGVzdCB0byBiZQorLy8gcGFzc2VkIG9uIHRvIGFub3RoZXIgdGVzdCwgd2hpY2ggaXMgYSBiYWQgaWRlYS4KKy8vCisvLyBUaGUgcmVhc29uIGZvciB0aGlzIGRlc2lnbiBpcyB0aGF0IHRlc3RzIHNob3VsZCBiZSBpbmRlcGVuZGVudCBhbmQKKy8vIHJlcGVhdGFibGUuICBJbiBwYXJ0aWN1bGFyLCBhIHRlc3Qgc2hvdWxkIG5vdCBmYWlsIGFzIHRoZSByZXN1bHQgb2YKKy8vIGFub3RoZXIgdGVzdCdzIGZhaWx1cmUuICBJZiBvbmUgdGVzdCBkZXBlbmRzIG9uIGluZm8gcHJvZHVjZWQgYnkKKy8vIGFub3RoZXIgdGVzdCwgdGhlbiB0aGUgdHdvIHRlc3RzIHNob3VsZCByZWFsbHkgYmUgb25lIGJpZyB0ZXN0LgorLy8KKy8vIFRoZSBtYWNyb3MgZm9yIGluZGljYXRpbmcgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBvZiBhIHRlc3QKKy8vIChFWFBFQ1RfVFJVRSwgRkFJTCwgZXRjKSBuZWVkIHRvIGtub3cgd2hhdCB0aGUgY3VycmVudCB0ZXN0IGlzCisvLyAod2hlbiBHb29nbGUgVGVzdCBwcmludHMgdGhlIHRlc3QgcmVzdWx0LCBpdCB0ZWxscyB5b3Ugd2hpY2ggdGVzdAorLy8gZWFjaCBmYWlsdXJlIGJlbG9uZ3MgdG8pLiAgVGVjaG5pY2FsbHksIHRoZXNlIG1hY3JvcyBpbnZva2UgYQorLy8gbWVtYmVyIGZ1bmN0aW9uIG9mIHRoZSBUZXN0IGNsYXNzLiAgVGhlcmVmb3JlLCB5b3UgY2Fubm90IHVzZSB0aGVtCisvLyBpbiBhIGdsb2JhbCBmdW5jdGlvbi4gIFRoYXQncyB3aHkgeW91IHNob3VsZCBwdXQgdGVzdCBzdWItcm91dGluZXMKKy8vIGluIGEgdGVzdCBmaXh0dXJlLgorLy8KKy8vIDwvVGVjaG5pY2FsRGV0YWlscz4KKworI2luY2x1ZGUgInNhbXBsZTMtaW5sLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVG8gdXNlIGEgdGVzdCBmaXh0dXJlLCBkZXJpdmUgYSBjbGFzcyBmcm9tIHRlc3Rpbmc6OlRlc3QuCitjbGFzcyBRdWV1ZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOiAgLy8gWW91IHNob3VsZCBtYWtlIHRoZSBtZW1iZXJzIHByb3RlY3RlZCBzLnQuIHRoZXkgY2FuIGJlCisgICAgICAgICAgICAgLy8gYWNjZXNzZWQgZnJvbSBzdWItY2xhc3Nlcy4KKworICAvLyB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0IGlzIHJ1bi4gIFlvdQorICAvLyBzaG91bGQgZGVmaW5lIGl0IGlmIHlvdSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIHZhcmFpYmxlcy4KKyAgLy8gT3RoZXJ3aXNlLCB0aGlzIGNhbiBiZSBza2lwcGVkLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcTFfLkVucXVldWUoMSk7CisgICAgcTJfLkVucXVldWUoMik7CisgICAgcTJfLkVucXVldWUoMyk7CisgIH0KKworICAvLyB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB3aWxsIGJlIGNhbGxlZCBhZnRlciBlYWNoIHRlc3QgaXMgcnVuLgorICAvLyBZb3Ugc2hvdWxkIGRlZmluZSBpdCBpZiB0aGVyZSBpcyBjbGVhbnVwIHdvcmsgdG8gZG8uICBPdGhlcndpc2UsCisgIC8vIHlvdSBkb24ndCBoYXZlIHRvIHByb3ZpZGUgaXQuCisgIC8vCisgIC8vIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgLy8gfQorCisgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgc29tZSB0ZXN0IHVzZXMuCisgIHN0YXRpYyBpbnQgRG91YmxlKGludCBuKSB7CisgICAgcmV0dXJuIDIqbjsKKyAgfQorCisgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIFF1ZXVlOjpNYXAoKS4KKyAgdm9pZCBNYXBUZXN0ZXIoY29uc3QgUXVldWU8aW50PiAqIHEpIHsKKyAgICAvLyBDcmVhdGVzIGEgbmV3IHF1ZXVlLCB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgdHdpY2UgYXMgYmlnIGFzIHRoZQorICAgIC8vIGNvcnJlc3BvbmRpbmcgb25lIGluIHEuCisgICAgY29uc3QgUXVldWU8aW50PiAqIGNvbnN0IG5ld19xID0gcS0+TWFwKERvdWJsZSk7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBuZXcgcXVldWUgaGFzIHRoZSBzYW1lIHNpemUgYXMgcS4KKyAgICBBU1NFUlRfRVEocS0+U2l6ZSgpLCBuZXdfcS0+U2l6ZSgpKTsKKworICAgIC8vIFZlcmlmaWVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZWxlbWVudHMgb2YgdGhlIHR3byBxdWV1ZXMuCisgICAgZm9yICggY29uc3QgUXVldWVOb2RlPGludD4gKiBuMSA9IHEtPkhlYWQoKSwgKiBuMiA9IG5ld19xLT5IZWFkKCk7CisgICAgICAgICAgbjEgIT0gTlVMTDsgbjEgPSBuMS0+bmV4dCgpLCBuMiA9IG4yLT5uZXh0KCkgKSB7CisgICAgICBFWFBFQ1RfRVEoMiAqIG4xLT5lbGVtZW50KCksIG4yLT5lbGVtZW50KCkpOworICAgIH0KKworICAgIGRlbGV0ZSBuZXdfcTsKKyAgfQorCisgIC8vIERlY2xhcmVzIHRoZSB2YXJpYWJsZXMgeW91ciB0ZXN0cyB3YW50IHRvIHVzZS4KKyAgUXVldWU8aW50PiBxMF87CisgIFF1ZXVlPGludD4gcTFfOworICBRdWV1ZTxpbnQ+IHEyXzsKK307CisKKy8vIFdoZW4geW91IGhhdmUgYSB0ZXN0IGZpeHR1cmUsIHlvdSBkZWZpbmUgYSB0ZXN0IHVzaW5nIFRFU1RfRgorLy8gaW5zdGVhZCBvZiBURVNULgorCisvLyBUZXN0cyB0aGUgZGVmYXVsdCBjJ3Rvci4KK1RFU1RfRihRdWV1ZVRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICAvLyBZb3UgY2FuIGFjY2VzcyBkYXRhIGluIHRoZSB0ZXN0IGZpeHR1cmUgaGVyZS4KKyAgRVhQRUNUX0VRKDB1LCBxMF8uU2l6ZSgpKTsKK30KKworLy8gVGVzdHMgRGVxdWV1ZSgpLgorVEVTVF9GKFF1ZXVlVGVzdCwgRGVxdWV1ZSkgeworICBpbnQgKiBuID0gcTBfLkRlcXVldWUoKTsKKyAgRVhQRUNUX1RSVUUobiA9PSBOVUxMKTsKKworICBuID0gcTFfLkRlcXVldWUoKTsKKyAgQVNTRVJUX1RSVUUobiAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDEsICpuKTsKKyAgRVhQRUNUX0VRKDB1LCBxMV8uU2l6ZSgpKTsKKyAgZGVsZXRlIG47CisKKyAgbiA9IHEyXy5EZXF1ZXVlKCk7CisgIEFTU0VSVF9UUlVFKG4gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgyLCAqbik7CisgIEVYUEVDVF9FUSgxdSwgcTJfLlNpemUoKSk7CisgIGRlbGV0ZSBuOworfQorCisvLyBUZXN0cyB0aGUgUXVldWU6Ok1hcCgpIGZ1bmN0aW9uLgorVEVTVF9GKFF1ZXVlVGVzdCwgTWFwKSB7CisgIE1hcFRlc3RlcigmcTBfKTsKKyAgTWFwVGVzdGVyKCZxMV8pOworICBNYXBUZXN0ZXIoJnEyXyk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlNC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQ0YmRhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlNC5jYwpAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEEgc2FtcGxlIHByb2dyYW0gZGVtb25zdHJhdGluZyB1c2luZyBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJzYW1wbGU0LmgiCisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZSwgYW5kIGluY3JlbWVudHMgaXQuCitpbnQgQ291bnRlcjo6SW5jcmVtZW50KCkgeworICByZXR1cm4gY291bnRlcl8rKzsKK30KKworLy8gUHJpbnRzIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgdG8gU1RET1VULgordm9pZCBDb3VudGVyOjpQcmludCgpIGNvbnN0IHsKKyAgcHJpbnRmKCIlZCIsIGNvdW50ZXJfKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTQuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYwZjBkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlNC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIHVzaW5nIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaWZuZGVmIEdURVNUX1NBTVBMRVNfU0FNUExFNF9IXworI2RlZmluZSBHVEVTVF9TQU1QTEVTX1NBTVBMRTRfSF8KKworLy8gQSBzaW1wbGUgbW9ub3RvbmljIGNvdW50ZXIuCitjbGFzcyBDb3VudGVyIHsKKyBwcml2YXRlOgorICBpbnQgY291bnRlcl87CisKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBjb3VudGVyIHRoYXQgc3RhcnRzIGF0IDAuCisgIENvdW50ZXIoKSA6IGNvdW50ZXJfKDApIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlLCBhbmQgaW5jcmVtZW50cyBpdC4KKyAgaW50IEluY3JlbWVudCgpOworCisgIC8vIFByaW50cyB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlIHRvIFNURE9VVC4KKyAgdm9pZCBQcmludCgpIGNvbnN0OworfTsKKworI2VuZGlmICAvLyBHVEVTVF9TQU1QTEVTX1NBTVBMRTRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTRfdW5pdHRlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWFmYzcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInNhbXBsZTQuaCIKKworLy8gVGVzdHMgdGhlIEluY3JlbWVudCgpIG1ldGhvZC4KK1RFU1QoQ291bnRlciwgSW5jcmVtZW50KSB7CisgIENvdW50ZXIgYzsKKworICAvLyBFWFBFQ1RfRVEoKSBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UsIHNvIHRoZXkKKyAgLy8gY2FuIGhhdmUgc2lkZSBlZmZlY3RzLgorCisgIEVYUEVDVF9FUSgwLCBjLkluY3JlbWVudCgpKTsKKyAgRVhQRUNUX0VRKDEsIGMuSW5jcmVtZW50KCkpOworICBFWFBFQ1RfRVEoMiwgYy5JbmNyZW1lbnQoKSk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU1X3VuaXR0ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q4ZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlNV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE5OSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGhpcyBzYW1wbGUgdGVhY2hlcyBob3cgdG8gcmV1c2UgYSB0ZXN0IGZpeHR1cmUgaW4gbXVsdGlwbGUgdGVzdAorLy8gY2FzZXMgYnkgZGVyaXZpbmcgc3ViLWZpeHR1cmVzIGZyb20gaXQuCisvLworLy8gV2hlbiB5b3UgZGVmaW5lIGEgdGVzdCBmaXh0dXJlLCB5b3Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgdGVzdAorLy8gY2FzZSB0aGF0IHdpbGwgdXNlIHRoaXMgZml4dHVyZS4gIFRoZXJlZm9yZSwgYSB0ZXN0IGZpeHR1cmUgY2FuCisvLyBiZSB1c2VkIGJ5IG9ubHkgb25lIHRlc3QgY2FzZS4KKy8vCisvLyBTb21ldGltZXMsIG1vcmUgdGhhbiBvbmUgdGVzdCBjYXNlcyBtYXkgd2FudCB0byB1c2UgdGhlIHNhbWUgb3IKKy8vIHNsaWdodGx5IGRpZmZlcmVudCB0ZXN0IGZpeHR1cmVzLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkgd2FudCB0bworLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHRlc3RzIGZvciBhIEdVSSBsaWJyYXJ5IGRvbid0IGxlYWsgaW1wb3J0YW50CisvLyBzeXN0ZW0gcmVzb3VyY2VzIGxpa2UgZm9udHMgYW5kIGJydXNoZXMuICBJbiBHb29nbGUgVGVzdCwgeW91IGRvCisvLyB0aGlzIGJ5IHB1dHRpbmcgdGhlIHNoYXJlZCBsb2dpYyBpbiBhIHN1cGVyIChhcyBpbiAic3VwZXIgY2xhc3MiKQorLy8gdGVzdCBmaXh0dXJlLCBhbmQgdGhlbiBoYXZlIGVhY2ggdGVzdCBjYXNlIHVzZSBhIGZpeHR1cmUgZGVyaXZlZAorLy8gZnJvbSB0aGlzIHN1cGVyIGZpeHR1cmUuCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAic2FtcGxlMy1pbmwuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInNhbXBsZTEuaCIKKworLy8gSW4gdGhpcyBzYW1wbGUsIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgZXZlcnkgdGVzdCBmaW5pc2hlcyB3aXRoaW4KKy8vIH41IHNlY29uZHMuICBJZiBhIHRlc3QgdGFrZXMgbG9uZ2VyIHRvIHJ1biwgd2UgY29uc2lkZXIgaXQgYQorLy8gZmFpbHVyZS4KKy8vCisvLyBXZSBwdXQgdGhlIGNvZGUgZm9yIHRpbWluZyBhIHRlc3QgaW4gYSB0ZXN0IGZpeHR1cmUgY2FsbGVkCisvLyAiUXVpY2tUZXN0Ii4gIFF1aWNrVGVzdCBpcyBpbnRlbmRlZCB0byBiZSB0aGUgc3VwZXIgZml4dHVyZSB0aGF0CisvLyBvdGhlciBmaXh0dXJlcyBkZXJpdmUgZnJvbSwgdGhlcmVmb3JlIHRoZXJlIGlzIG5vIHRlc3QgY2FzZSB3aXRoCisvLyB0aGUgbmFtZSAiUXVpY2tUZXN0Ii4gIFRoaXMgaXMgT0suCisvLworLy8gTGF0ZXIsIHdlIHdpbGwgZGVyaXZlIG11bHRpcGxlIHRlc3QgZml4dHVyZXMgZnJvbSBRdWlja1Rlc3QuCitjbGFzcyBRdWlja1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBSZW1lbWJlciB0aGF0IFNldFVwKCkgaXMgcnVuIGltbWVkaWF0ZWx5IGJlZm9yZSBhIHRlc3Qgc3RhcnRzLgorICAvLyBUaGlzIGlzIGEgZ29vZCBwbGFjZSB0byByZWNvcmQgdGhlIHN0YXJ0IHRpbWUuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBzdGFydF90aW1lXyA9IHRpbWUoTlVMTCk7CisgIH0KKworICAvLyBUZWFyRG93bigpIGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSB0ZXN0IGZpbmlzaGVzLiAgSGVyZSB3ZQorICAvLyBjaGVjayBpZiB0aGUgdGVzdCB3YXMgdG9vIHNsb3cuCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBHZXRzIHRoZSB0aW1lIHdoZW4gdGhlIHRlc3QgZmluaXNoZXMKKyAgICBjb25zdCB0aW1lX3QgZW5kX3RpbWUgPSB0aW1lKE5VTEwpOworCisgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSB0ZXN0IHRvb2sgbm8gbW9yZSB0aGFuIH41IHNlY29uZHMuICBEaWQgeW91CisgICAgLy8ga25vdyB0aGF0IHlvdSBjYW4gdXNlIGFzc2VydGlvbnMgaW4gU2V0VXAoKSBhbmQgVGVhckRvd24oKSBhcworICAgIC8vIHdlbGw/CisgICAgRVhQRUNUX1RSVUUoZW5kX3RpbWUgLSBzdGFydF90aW1lXyA8PSA1KSA8PCAiVGhlIHRlc3QgdG9vayB0b28gbG9uZy4iOworICB9CisKKyAgLy8gVGhlIFVUQyB0aW1lIChpbiBzZWNvbmRzKSB3aGVuIHRoZSB0ZXN0IHN0YXJ0cworICB0aW1lX3Qgc3RhcnRfdGltZV87Cit9OworCisKKy8vIFdlIGRlcml2ZSBhIGZpeHR1cmUgbmFtZWQgSW50ZWdlckZ1bmN0aW9uVGVzdCBmcm9tIHRoZSBRdWlja1Rlc3QKKy8vIGZpeHR1cmUuICBBbGwgdGVzdHMgdXNpbmcgdGhpcyBmaXh0dXJlIHdpbGwgYmUgYXV0b21hdGljYWxseQorLy8gcmVxdWlyZWQgdG8gYmUgcXVpY2suCitjbGFzcyBJbnRlZ2VyRnVuY3Rpb25UZXN0IDogcHVibGljIFF1aWNrVGVzdCB7CisgIC8vIFdlIGRvbid0IG5lZWQgYW55IG1vcmUgbG9naWMgdGhhbiBhbHJlYWR5IGluIHRoZSBRdWlja1Rlc3QgZml4dHVyZS4KKyAgLy8gVGhlcmVmb3JlIHRoZSBib2R5IGlzIGVtcHR5LgorfTsKKworCisvLyBOb3cgd2UgY2FuIHdyaXRlIHRlc3RzIGluIHRoZSBJbnRlZ2VyRnVuY3Rpb25UZXN0IHRlc3QgY2FzZS4KKworLy8gVGVzdHMgRmFjdG9yaWFsKCkKK1RFU1RfRihJbnRlZ2VyRnVuY3Rpb25UZXN0LCBGYWN0b3JpYWwpIHsKKyAgLy8gVGVzdHMgZmFjdG9yaWFsIG9mIG5lZ2F0aXZlIG51bWJlcnMuCisgIEVYUEVDVF9FUSgxLCBGYWN0b3JpYWwoLTUpKTsKKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgtMSkpOworICBFWFBFQ1RfR1QoRmFjdG9yaWFsKC0xMCksIDApOworCisgIC8vIFRlc3RzIGZhY3RvcmlhbCBvZiAwLgorICBFWFBFQ1RfRVEoMSwgRmFjdG9yaWFsKDApKTsKKworICAvLyBUZXN0cyBmYWN0b3JpYWwgb2YgcG9zaXRpdmUgbnVtYmVycy4KKyAgRVhQRUNUX0VRKDEsIEZhY3RvcmlhbCgxKSk7CisgIEVYUEVDVF9FUSgyLCBGYWN0b3JpYWwoMikpOworICBFWFBFQ1RfRVEoNiwgRmFjdG9yaWFsKDMpKTsKKyAgRVhQRUNUX0VRKDQwMzIwLCBGYWN0b3JpYWwoOCkpOworfQorCisKKy8vIFRlc3RzIElzUHJpbWUoKQorVEVTVF9GKEludGVnZXJGdW5jdGlvblRlc3QsIElzUHJpbWUpIHsKKyAgLy8gVGVzdHMgbmVnYXRpdmUgaW5wdXQuCisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKC0xKSk7CisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKC0yKSk7CisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKElOVF9NSU4pKTsKKworICAvLyBUZXN0cyBzb21lIHRyaXZpYWwgY2FzZXMuCisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKElzUHJpbWUoMSkpOworICBFWFBFQ1RfVFJVRShJc1ByaW1lKDIpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSgzKSk7CisKKyAgLy8gVGVzdHMgcG9zaXRpdmUgaW5wdXQuCisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKDQpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSg1KSk7CisgIEVYUEVDVF9GQUxTRShJc1ByaW1lKDYpKTsKKyAgRVhQRUNUX1RSVUUoSXNQcmltZSgyMykpOworfQorCisKKy8vIFRoZSBuZXh0IHRlc3QgY2FzZSAobmFtZWQgIlF1ZXVlVGVzdCIpIGFsc28gbmVlZHMgdG8gYmUgcXVpY2ssIHNvCisvLyB3ZSBkZXJpdmUgYW5vdGhlciBmaXh0dXJlIGZyb20gUXVpY2tUZXN0LgorLy8KKy8vIFRoZSBRdWV1ZVRlc3QgdGVzdCBmaXh0dXJlIGhhcyBzb21lIGxvZ2ljIGFuZCBzaGFyZWQgb2JqZWN0cyBpbgorLy8gYWRkaXRpb24gdG8gd2hhdCdzIGluIFF1aWNrVGVzdCBhbHJlYWR5LiAgV2UgZGVmaW5lIHRoZSBhZGRpdGlvbmFsCisvLyBzdHVmZiBpbnNpZGUgdGhlIGJvZHkgb2YgdGhlIHRlc3QgZml4dHVyZSwgYXMgdXN1YWwuCitjbGFzcyBRdWV1ZVRlc3QgOiBwdWJsaWMgUXVpY2tUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBzZXQgdXAgdGhlIHN1cGVyIGZpeHR1cmUgKFF1aWNrVGVzdCkuCisgICAgUXVpY2tUZXN0OjpTZXRVcCgpOworCisgICAgLy8gU2Vjb25kLCBzb21lIGFkZGl0aW9uYWwgc2V0dXAgZm9yIHRoaXMgZml4dHVyZS4KKyAgICBxMV8uRW5xdWV1ZSgxKTsKKyAgICBxMl8uRW5xdWV1ZSgyKTsKKyAgICBxMl8uRW5xdWV1ZSgzKTsKKyAgfQorCisgIC8vIEJ5IGRlZmF1bHQsIFRlYXJEb3duKCkgaW5oZXJpdHMgdGhlIGJlaGF2aW9yIG9mCisgIC8vIFF1aWNrVGVzdDo6VGVhckRvd24oKS4gIEFzIHdlIGhhdmUgbm8gYWRkaXRpb25hbCBjbGVhbmluZyB3b3JrCisgIC8vIGZvciBRdWV1ZVRlc3QsIHdlIG9taXQgaXQgaGVyZS4KKyAgLy8KKyAgLy8gdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAvLyAgIFF1aWNrVGVzdDo6VGVhckRvd24oKTsKKyAgLy8gfQorCisgIFF1ZXVlPGludD4gcTBfOworICBRdWV1ZTxpbnQ+IHExXzsKKyAgUXVldWU8aW50PiBxMl87Cit9OworCisKKy8vIE5vdywgbGV0J3Mgd3JpdGUgdGVzdHMgdXNpbmcgdGhlIFF1ZXVlVGVzdCBmaXh0dXJlLgorCisvLyBUZXN0cyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KK1RFU1RfRihRdWV1ZVRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICBFWFBFQ1RfRVEoMHUsIHEwXy5TaXplKCkpOworfQorCisvLyBUZXN0cyBEZXF1ZXVlKCkuCitURVNUX0YoUXVldWVUZXN0LCBEZXF1ZXVlKSB7CisgIGludCogbiA9IHEwXy5EZXF1ZXVlKCk7CisgIEVYUEVDVF9UUlVFKG4gPT0gTlVMTCk7CisKKyAgbiA9IHExXy5EZXF1ZXVlKCk7CisgIEVYUEVDVF9UUlVFKG4gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgxLCAqbik7CisgIEVYUEVDVF9FUSgwdSwgcTFfLlNpemUoKSk7CisgIGRlbGV0ZSBuOworCisgIG4gPSBxMl8uRGVxdWV1ZSgpOworICBFWFBFQ1RfVFJVRShuICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMiwgKm4pOworICBFWFBFQ1RfRVEoMXUsIHEyXy5TaXplKCkpOworICBkZWxldGUgbjsKK30KKworLy8gSWYgbmVjZXNzYXJ5LCB5b3UgY2FuIGRlcml2ZSBmdXJ0aGVyIHRlc3QgZml4dHVyZXMgZnJvbSBhIGRlcml2ZWQKKy8vIGZpeHR1cmUgaXRzZWxmLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVyaXZlIGFub3RoZXIgZml4dHVyZSBmcm9tCisvLyBRdWV1ZVRlc3QuICBHb29nbGUgVGVzdCBpbXBvc2VzIG5vIGxpbWl0IG9uIGhvdyBkZWVwIHRoZSBoaWVyYXJjaHkKKy8vIGNhbiBiZS4gIEluIHByYWN0aWNlLCBob3dldmVyLCB5b3UgcHJvYmFibHkgZG9uJ3Qgd2FudCBpdCB0byBiZSB0b28KKy8vIGRlZXAgYXMgdG8gYmUgY29uZnVzaW5nLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlNl91bml0dGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyMDM2YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTZfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwyMjQgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHRlc3QgY29tbW9uIHByb3BlcnRpZXMgb2YgbXVsdGlwbGUKKy8vIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBpbnRlcmZhY2UgKGFrYSBpbnRlcmZhY2UgdGVzdHMpLgorCisvLyBUaGUgaW50ZXJmYWNlIGFuZCBpdHMgaW1wbGVtZW50YXRpb25zIGFyZSBpbiB0aGlzIGhlYWRlci4KKyNpbmNsdWRlICJwcmltZV90YWJsZXMuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIEZpcnN0LCB3ZSBkZWZpbmUgc29tZSBmYWN0b3J5IGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mCisvLyB0aGUgaW1wbGVtZW50YXRpb25zLiAgWW91IG1heSBiZSBhYmxlIHRvIHNraXAgdGhpcyBzdGVwIGlmIGFsbCB5b3VyCisvLyBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIGNvbnN0cnVjdGVkIHRoZSBzYW1lIHdheS4KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitQcmltZVRhYmxlKiBDcmVhdGVQcmltZVRhYmxlKCk7CisKK3RlbXBsYXRlIDw+CitQcmltZVRhYmxlKiBDcmVhdGVQcmltZVRhYmxlPE9uVGhlRmx5UHJpbWVUYWJsZT4oKSB7CisgIHJldHVybiBuZXcgT25UaGVGbHlQcmltZVRhYmxlOworfQorCit0ZW1wbGF0ZSA8PgorUHJpbWVUYWJsZSogQ3JlYXRlUHJpbWVUYWJsZTxQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZT4oKSB7CisgIHJldHVybiBuZXcgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUoMTAwMDApOworfQorCisvLyBUaGVuIHdlIGRlZmluZSBhIHRlc3QgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgUHJpbWVUYWJsZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBUaGUgY3RvciBjYWxscyB0aGUgZmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBwcmltZSB0YWJsZQorICAvLyBpbXBsZW1lbnRlZCBieSBULgorICBQcmltZVRhYmxlVGVzdCgpIDogdGFibGVfKENyZWF0ZVByaW1lVGFibGU8VD4oKSkge30KKworICB2aXJ0dWFsIH5QcmltZVRhYmxlVGVzdCgpIHsgZGVsZXRlIHRhYmxlXzsgfQorCisgIC8vIE5vdGUgdGhhdCB3ZSB0ZXN0IGFuIGltcGxlbWVudGF0aW9uIHZpYSB0aGUgYmFzZSBpbnRlcmZhY2UKKyAgLy8gaW5zdGVhZCBvZiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgVGhpcyBpcyBpbXBvcnRhbnQKKyAgLy8gZm9yIGtlZXBpbmcgdGhlIHRlc3RzIGNsb3NlIHRvIHRoZSByZWFsIHdvcmxkIHNjZW5hcmlvLCB3aGVyZSB0aGUKKyAgLy8gaW1wbGVtZW50YXRpb24gaXMgaW52b2tlZCB2aWEgdGhlIGJhc2UgaW50ZXJmYWNlLiAgSXQgYXZvaWRzCisgIC8vIGdvdC15YXMgd2hlcmUgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGhhcyBhIG1ldGhvZCB0aGF0IHNoYWRvd3MKKyAgLy8gYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIChidXQgc2xpZ2h0bHkgZGlmZmVyZW50IGFyZ3VtZW50CisgIC8vIHR5cGVzKSBpbiB0aGUgYmFzZSBpbnRlcmZhY2UsIGZvciBleGFtcGxlLgorICBQcmltZVRhYmxlKiBjb25zdCB0YWJsZV87Cit9OworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKwordXNpbmcgdGVzdGluZzo6VHlwZXM7CisKKy8vIEdvb2dsZSBUZXN0IG9mZmVycyB0d28gd2F5cyBmb3IgcmV1c2luZyB0ZXN0cyBmb3IgZGlmZmVyZW50IHR5cGVzLgorLy8gVGhlIGZpcnN0IGlzIGNhbGxlZCAidHlwZWQgdGVzdHMiLiAgWW91IHNob3VsZCB1c2UgaXQgaWYgeW91CisvLyBhbHJlYWR5IGtub3cgKmFsbCogdGhlIHR5cGVzIHlvdSBhcmUgZ29ubmEgZXhlcmNpc2Ugd2hlbiB5b3Ugd3JpdGUKKy8vIHRoZSB0ZXN0cy4KKworLy8gVG8gd3JpdGUgYSB0eXBlZCB0ZXN0IGNhc2UsIGZpcnN0IHVzZQorLy8KKy8vICAgVFlQRURfVEVTVF9DQVNFKFRlc3RDYXNlTmFtZSwgVHlwZUxpc3QpOworLy8KKy8vIHRvIGRlY2xhcmUgaXQgYW5kIHNwZWNpZnkgdGhlIHR5cGUgcGFyYW1ldGVycy4gIEFzIHdpdGggVEVTVF9GLAorLy8gVGVzdENhc2VOYW1lIG11c3QgbWF0Y2ggdGhlIHRlc3QgZml4dHVyZSBuYW1lLgorCisvLyBUaGUgbGlzdCBvZiB0eXBlcyB3ZSB3YW50IHRvIHRlc3QuCit0eXBlZGVmIFR5cGVzPE9uVGhlRmx5UHJpbWVUYWJsZSwgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGU+IEltcGxlbWVudGF0aW9uczsKKworVFlQRURfVEVTVF9DQVNFKFByaW1lVGFibGVUZXN0LCBJbXBsZW1lbnRhdGlvbnMpOworCisvLyBUaGVuIHVzZSBUWVBFRF9URVNUKFRlc3RDYXNlTmFtZSwgVGVzdE5hbWUpIHRvIGRlZmluZSBhIHR5cGVkIHRlc3QsCisvLyBzaW1pbGFyIHRvIFRFU1RfRi4KK1RZUEVEX1RFU1QoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgeworICAvLyBJbnNpZGUgdGhlIHRlc3QgYm9keSwgeW91IGNhbiByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIgYnkKKyAgLy8gVHlwZVBhcmFtLCBhbmQgcmVmZXIgdG8gdGhlIGZpeHR1cmUgY2xhc3MgYnkgVGVzdEZpeHR1cmUuICBXZQorICAvLyBkb24ndCBuZWVkIHRoZW0gaW4gdGhpcyBleGFtcGxlLgorCisgIC8vIFNpbmNlIHdlIGFyZSBpbiB0aGUgdGVtcGxhdGUgd29ybGQsIEMrKyByZXF1aXJlcyBleHBsaWNpdGx5CisgIC8vIHdyaXRpbmcgJ3RoaXMtPicgd2hlbiByZWZlcnJpbmcgdG8gbWVtYmVycyBvZiB0aGUgZml4dHVyZSBjbGFzcy4KKyAgLy8gVGhpcyBpcyBzb21ldGhpbmcgeW91IGhhdmUgdG8gbGVhcm4gdG8gbGl2ZSB3aXRoLgorICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKC01KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg0KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNikpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEwMCkpOworfQorCitUWVBFRF9URVNUKFByaW1lVGFibGVUZXN0LCBSZXR1cm5zVHJ1ZUZvclByaW1lcykgeworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMykpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNSkpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNykpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTEpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEzMSkpOworfQorCitUWVBFRF9URVNUKFByaW1lVGFibGVUZXN0LCBDYW5HZXROZXh0UHJpbWUpIHsKKyAgRVhQRUNUX0VRKDIsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDApKTsKKyAgRVhQRUNUX0VRKDMsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDIpKTsKKyAgRVhQRUNUX0VRKDUsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDMpKTsKKyAgRVhQRUNUX0VRKDcsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDUpKTsKKyAgRVhQRUNUX0VRKDExLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSg3KSk7CisgIEVYUEVDVF9FUSgxMzEsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDEyOCkpOworfQorCisvLyBUaGF0J3MgaXQhICBHb29nbGUgVGVzdCB3aWxsIHJlcGVhdCBlYWNoIFRZUEVEX1RFU1QgZm9yIGVhY2ggdHlwZQorLy8gaW4gdGhlIHR5cGUgbGlzdCBzcGVjaWZpZWQgaW4gVFlQRURfVEVTVF9DQVNFLiAgU2l0IGJhY2sgYW5kIGJlCisvLyBoYXBweSB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGRlZmluZSB0aGVtIG11bHRpcGxlIHRpbWVzLgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK3VzaW5nIHRlc3Rpbmc6OlR5cGVzOworCisvLyBTb21ldGltZXMsIGhvd2V2ZXIsIHlvdSBkb24ndCB5ZXQga25vdyBhbGwgdGhlIHR5cGVzIHRoYXQgeW91IHdhbnQKKy8vIHRvIHRlc3Qgd2hlbiB5b3Ugd3JpdGUgdGhlIHRlc3RzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdGhlCisvLyBhdXRob3Igb2YgYW4gaW50ZXJmYWNlIGFuZCBleHBlY3Qgb3RoZXIgcGVvcGxlIHRvIGltcGxlbWVudCBpdCwgeW91CisvLyBtaWdodCB3YW50IHRvIHdyaXRlIGEgc2V0IG9mIHRlc3RzIHRvIG1ha2Ugc3VyZSBlYWNoIGltcGxlbWVudGF0aW9uCisvLyBjb25mb3JtcyB0byBzb21lIGJhc2ljIHJlcXVpcmVtZW50cywgYnV0IHlvdSBkb24ndCBrbm93IHdoYXQKKy8vIGltcGxlbWVudGF0aW9ucyB3aWxsIGJlIHdyaXR0ZW4gaW4gdGhlIGZ1dHVyZS4KKy8vCisvLyBIb3cgY2FuIHlvdSB3cml0ZSB0aGUgdGVzdHMgd2l0aG91dCBjb21taXR0aW5nIHRvIHRoZSB0eXBlCisvLyBwYXJhbWV0ZXJzPyAgVGhhdCdzIHdoYXQgInR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyIgY2FuIGRvIGZvciB5b3UuCisvLyBJdCBpcyBhIGJpdCBtb3JlIGludm9sdmVkIHRoYW4gdHlwZWQgdGVzdHMsIGJ1dCBpbiByZXR1cm4geW91IGdldCBhCisvLyB0ZXN0IHBhdHRlcm4gdGhhdCBjYW4gYmUgcmV1c2VkIGluIG1hbnkgY29udGV4dHMsIHdoaWNoIGlzIGEgYmlnCisvLyB3aW4uICBIZXJlJ3MgaG93IHlvdSBkbyBpdDoKKworLy8gRmlyc3QsIGRlZmluZSBhIHRlc3QgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEhlcmUgd2UganVzdCByZXVzZQorLy8gdGhlIFByaW1lVGFibGVUZXN0IGZpeHR1cmUgZGVmaW5lZCBlYXJsaWVyOgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIFByaW1lVGFibGVUZXN0MiA6IHB1YmxpYyBQcmltZVRhYmxlVGVzdDxUPiB7Cit9OworCisvLyBUaGVuLCBkZWNsYXJlIHRoZSB0ZXN0IGNhc2UuICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QKKy8vIGZpeHR1cmUsIGFuZCBhbHNvIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgKGFzIHVzdWFsKS4gIFRoZSBfUAorLy8gc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIgb3IgInBhdHRlcm4iLgorVFlQRURfVEVTVF9DQVNFX1AoUHJpbWVUYWJsZVRlc3QyKTsKKworLy8gTmV4dCwgdXNlIFRZUEVEX1RFU1RfUChUZXN0Q2FzZU5hbWUsIFRlc3ROYW1lKSB0byBkZWZpbmUgYSB0ZXN0LAorLy8gc2ltaWxhciB0byB3aGF0IHlvdSBkbyB3aXRoIFRFU1RfRi4KK1RZUEVEX1RFU1RfUChQcmltZVRhYmxlVGVzdDIsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgeworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKC01KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHRoaXMtPnRhYmxlXy0+SXNQcmltZSg0KSk7CisgIEVYUEVDVF9GQUxTRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNikpOworICBFWFBFQ1RfRkFMU0UodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEwMCkpOworfQorCitUWVBFRF9URVNUX1AoUHJpbWVUYWJsZVRlc3QyLCBSZXR1cm5zVHJ1ZUZvclByaW1lcykgeworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMykpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNSkpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoNykpOworICBFWFBFQ1RfVFJVRSh0aGlzLT50YWJsZV8tPklzUHJpbWUoMTEpKTsKKyAgRVhQRUNUX1RSVUUodGhpcy0+dGFibGVfLT5Jc1ByaW1lKDEzMSkpOworfQorCitUWVBFRF9URVNUX1AoUHJpbWVUYWJsZVRlc3QyLCBDYW5HZXROZXh0UHJpbWUpIHsKKyAgRVhQRUNUX0VRKDIsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDApKTsKKyAgRVhQRUNUX0VRKDMsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDIpKTsKKyAgRVhQRUNUX0VRKDUsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDMpKTsKKyAgRVhQRUNUX0VRKDcsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDUpKTsKKyAgRVhQRUNUX0VRKDExLCB0aGlzLT50YWJsZV8tPkdldE5leHRQcmltZSg3KSk7CisgIEVYUEVDVF9FUSgxMzEsIHRoaXMtPnRhYmxlXy0+R2V0TmV4dFByaW1lKDEyOCkpOworfQorCisvLyBUeXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW52b2x2ZSBvbmUgZXh0cmEgc3RlcDogeW91IGhhdmUgdG8KKy8vIGVudW1lcmF0ZSB0aGUgdGVzdHMgeW91IGRlZmluZWQ6CitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCgKKyAgICBQcmltZVRhYmxlVGVzdDIsICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHRlc3QgY2FzZSBuYW1lLgorICAgIC8vIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgYXJlIHRoZSB0ZXN0IG5hbWVzLgorICAgIFJldHVybnNGYWxzZUZvck5vblByaW1lcywgUmV0dXJuc1RydWVGb3JQcmltZXMsIENhbkdldE5leHRQcmltZSk7CisKKy8vIEF0IHRoaXMgcG9pbnQgdGhlIHRlc3QgcGF0dGVybiBpcyBkb25lLiAgSG93ZXZlciwgeW91IGRvbid0IGhhdmUKKy8vIGFueSByZWFsIHRlc3QgeWV0IGFzIHlvdSBoYXZlbid0IHNhaWQgd2hpY2ggdHlwZXMgeW91IHdhbnQgdG8gcnVuCisvLyB0aGUgdGVzdHMgd2l0aC4KKworLy8gVG8gdHVybiB0aGUgYWJzdHJhY3QgdGVzdCBwYXR0ZXJuIGludG8gcmVhbCB0ZXN0cywgeW91IGluc3RhbnRpYXRlCisvLyBpdCB3aXRoIGEgbGlzdCBvZiB0eXBlcy4gIFVzdWFsbHkgdGhlIHRlc3QgcGF0dGVybiB3aWxsIGJlIGRlZmluZWQKKy8vIGluIGEgLmggZmlsZSwgYW5kIGFueW9uZSBjYW4gI2luY2x1ZGUgYW5kIGluc3RhbnRpYXRlIGl0LiAgWW91IGNhbgorLy8gZXZlbiBpbnN0YW50aWF0ZSBpdCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSBwcm9ncmFtLiAgVG8gdGVsbAorLy8gZGlmZmVyZW50IGluc3RhbmNlcyBhcGFydCwgeW91IGdpdmUgZWFjaCBvZiB0aGVtIGEgbmFtZSwgd2hpY2ggd2lsbAorLy8gYmVjb21lIHBhcnQgb2YgdGhlIHRlc3QgY2FzZSBuYW1lIGFuZCBjYW4gYmUgdXNlZCBpbiB0ZXN0IGZpbHRlcnMuCisKKy8vIFRoZSBsaXN0IG9mIHR5cGVzIHdlIHdhbnQgdG8gdGVzdC4gIE5vdGUgdGhhdCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUKKy8vIGRlZmluZWQgYXQgdGhlIHRpbWUgd2Ugd3JpdGUgdGhlIFRZUEVEX1RFU1RfUCgpcy4KK3R5cGVkZWYgVHlwZXM8T25UaGVGbHlQcmltZVRhYmxlLCBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZT4KKyAgICBQcmltZVRhYmxlSW1wbGVtZW50YXRpb25zOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoT25UaGVGbHlBbmRQcmVDYWxjdWxhdGVkLCAgICAvLyBJbnN0YW5jZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltZVRhYmxlVGVzdDIsICAgICAgICAgICAgIC8vIFRlc3QgY2FzZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltZVRhYmxlSW1wbGVtZW50YXRpb25zKTsgIC8vIFR5cGUgbGlzdAorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjUxYTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTMwIEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB0ZXN0IGNvbW1vbiBwcm9wZXJ0aWVzIG9mIG11bHRpcGxlCisvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYW4gaW50ZXJmYWNlIChha2EgaW50ZXJmYWNlIHRlc3RzKSB1c2luZworLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4gRWFjaCB0ZXN0IGluIHRoZSB0ZXN0IGNhc2UgaGFzCisvLyBhIHBhcmFtZXRlciB0aGF0IGlzIGFuIGludGVyZmFjZSBwb2ludGVyIHRvIGFuIGltcGxlbWVudGF0aW9uCisvLyB0ZXN0ZWQuCisKKy8vIFRoZSBpbnRlcmZhY2UgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbnMgYXJlIGluIHRoaXMgaGVhZGVyLgorI2luY2x1ZGUgInByaW1lX3RhYmxlcy5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKK3VzaW5nIDo6dGVzdGluZzo6VmFsdWVzOworCisvLyBBcyBhIGdlbmVyYWwgcnVsZSwgdG8gcHJldmVudCBhIHRlc3QgZnJvbSBhZmZlY3RpbmcgdGhlIHRlc3RzIHRoYXQgY29tZQorLy8gYWZ0ZXIgaXQsIHlvdSBzaG91bGQgY3JlYXRlIGFuZCBkZXN0cm95IHRoZSB0ZXN0ZWQgb2JqZWN0cyBmb3IgZWFjaCB0ZXN0CisvLyBpbnN0ZWFkIG9mIHJldXNpbmcgdGhlbS4gIEluIHRoaXMgc2FtcGxlIHdlIHdpbGwgZGVmaW5lIGEgc2ltcGxlIGZhY3RvcnkKKy8vIGZ1bmN0aW9uIGZvciBQcmltZVRhYmxlIG9iamVjdHMuICBXZSB3aWxsIGluc3RhbnRpYXRlIG9iamVjdHMgaW4gdGVzdCdzCisvLyBTZXRVcCgpIG1ldGhvZCBhbmQgZGVsZXRlIHRoZW0gaW4gVGVhckRvd24oKSBtZXRob2QuCit0eXBlZGVmIFByaW1lVGFibGUqIENyZWF0ZVByaW1lVGFibGVGdW5jKCk7CisKK1ByaW1lVGFibGUqIENyZWF0ZU9uVGhlRmx5UHJpbWVUYWJsZSgpIHsKKyAgcmV0dXJuIG5ldyBPblRoZUZseVByaW1lVGFibGUoKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBtYXhfcHJlY2FsY3VsYXRlZD4KK1ByaW1lVGFibGUqIENyZWF0ZVByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKCkgeworICByZXR1cm4gbmV3IFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKG1heF9wcmVjYWxjdWxhdGVkKTsKK30KKworLy8gSW5zaWRlIHRoZSB0ZXN0IGJvZHksIGZpeHR1cmUgY29uc3RydWN0b3IsIFNldFVwKCksIGFuZCBUZWFyRG93bigpIHlvdQorLy8gY2FuIHJlZmVyIHRvIHRoZSB0ZXN0IHBhcmFtZXRlciBieSBHZXRQYXJhbSgpLiAgSW4gdGhpcyBjYXNlLCB0aGUgdGVzdAorLy8gcGFyYW1ldGVyIGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCB3ZSBjYWxsIGluIGZpeHR1cmUncyBTZXRVcCgpIHRvCisvLyBjcmVhdGUgYW5kIHN0b3JlIGFuIGluc3RhbmNlIG9mIFByaW1lVGFibGUuCitjbGFzcyBQcmltZVRhYmxlVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPENyZWF0ZVByaW1lVGFibGVGdW5jKj4geworIHB1YmxpYzoKKyAgdmlydHVhbCB+UHJpbWVUYWJsZVRlc3QoKSB7IGRlbGV0ZSB0YWJsZV87IH0KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyB0YWJsZV8gPSAoKkdldFBhcmFtKCkpKCk7IH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGRlbGV0ZSB0YWJsZV87CisgICAgdGFibGVfID0gTlVMTDsKKyAgfQorCisgcHJvdGVjdGVkOgorICBQcmltZVRhYmxlKiB0YWJsZV87Cit9OworCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNGYWxzZUZvck5vblByaW1lcykgeworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKC01KSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoMCkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDEpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSg0KSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoNikpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDEwMCkpOworfQorCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIFJldHVybnNUcnVlRm9yUHJpbWVzKSB7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgyKSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgzKSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSg1KSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSg3KSk7CisgIEVYUEVDVF9UUlVFKHRhYmxlXy0+SXNQcmltZSgxMSkpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMTMxKSk7Cit9CisKK1RFU1RfUChQcmltZVRhYmxlVGVzdCwgQ2FuR2V0TmV4dFByaW1lKSB7CisgIEVYUEVDVF9FUSgyLCB0YWJsZV8tPkdldE5leHRQcmltZSgwKSk7CisgIEVYUEVDVF9FUSgzLCB0YWJsZV8tPkdldE5leHRQcmltZSgyKSk7CisgIEVYUEVDVF9FUSg1LCB0YWJsZV8tPkdldE5leHRQcmltZSgzKSk7CisgIEVYUEVDVF9FUSg3LCB0YWJsZV8tPkdldE5leHRQcmltZSg1KSk7CisgIEVYUEVDVF9FUSgxMSwgdGFibGVfLT5HZXROZXh0UHJpbWUoNykpOworICBFWFBFQ1RfRVEoMTMxLCB0YWJsZV8tPkdldE5leHRQcmltZSgxMjgpKTsKK30KKworLy8gSW4gb3JkZXIgdG8gcnVuIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIHlvdSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZW0sCisvLyBvciBiaW5kIHRoZW0gdG8gYSBsaXN0IG9mIHZhbHVlcyB3aGljaCB3aWxsIGJlIHVzZWQgYXMgdGVzdCBwYXJhbWV0ZXJzLgorLy8gWW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtIGluIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIG1vZHVsZSwgb3IgZXZlbgorLy8gaW5zdGFudGlhdGUgdGhlbSBzZXZlcmFsIHRpbWVzLgorLy8KKy8vIEhlcmUsIHdlIGluc3RhbnRpYXRlIG91ciB0ZXN0cyB3aXRoIGEgbGlzdCBvZiB0d28gUHJpbWVUYWJsZSBvYmplY3QKKy8vIGZhY3RvcnkgZnVuY3Rpb25zOgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgT25UaGVGbHlBbmRQcmVDYWxjdWxhdGVkLAorICAgIFByaW1lVGFibGVUZXN0LAorICAgIFZhbHVlcygmQ3JlYXRlT25UaGVGbHlQcmltZVRhYmxlLCAmQ3JlYXRlUHJlQ2FsY3VsYXRlZFByaW1lVGFibGU8MTAwMD4pKTsKKworI2Vsc2UKKworLy8gR29vZ2xlIFRlc3QgbWF5IG5vdCBzdXBwb3J0IHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgd2l0aCBzb21lCisvLyBjb21waWxlcnMuIElmIHdlIHVzZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byBjb21waWxlIG91dCBhbGwKKy8vIGNvZGUgcmVmZXJyaW5nIHRvIHRoZSBndGVzdF9tYWluIGxpYnJhcnksIE1TVkMgbGlua2VyIHdpbGwgbm90IGxpbmsKKy8vIHRoYXQgbGlicmFyeSBhdCBhbGwgYW5kIGNvbnNlcXVlbnRseSBjb21wbGFpbiBhYm91dCBtaXNzaW5nIGVudHJ5CisvLyBwb2ludCBkZWZpbmVkIGluIHRoYXQgbGlicmFyeSAoZmF0YWwgZXJyb3IgTE5LMTU2MTogZW50cnkgcG9pbnQKKy8vIG11c3QgYmUgZGVmaW5lZCkuIFRoaXMgZHVtbXkgdGVzdCBrZWVwcyBndGVzdF9tYWluIGxpbmtlZCBpbi4KK1RFU1QoRHVtbXlUZXN0LCBWYWx1ZVBhcmFtZXRlcml6ZWRUZXN0c0FyZU5vdFN1cHBvcnRlZE9uVGhpc1BsYXRmb3JtKSB7fQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc0MzM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE3MyBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdGVzdCBjb2RlIHJlbHlpbmcgb24gc29tZSBnbG9iYWwgZmxhZyB2YXJpYWJsZXMuCisvLyBDb21iaW5lKCkgaGVscHMgd2l0aCBnZW5lcmF0aW5nIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2Ygc3VjaCBmbGFncywKKy8vIGFuZCBlYWNoIHRlc3QgaXMgZ2l2ZW4gb25lIGNvbWJpbmF0aW9uIGFzIGEgcGFyYW1ldGVyLgorCisvLyBVc2UgY2xhc3MgZGVmaW5pdGlvbnMgdG8gdGVzdCBmcm9tIHRoaXMgaGVhZGVyLgorI2luY2x1ZGUgInByaW1lX3RhYmxlcy5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19DT01CSU5FCisKKy8vIFN1cHBvc2Ugd2Ugd2FudCB0byBpbnRyb2R1Y2UgYSBuZXcsIGltcHJvdmVkIGltcGxlbWVudGF0aW9uIG9mIFByaW1lVGFibGUKKy8vIHdoaWNoIGNvbWJpbmVzIHNwZWVkIG9mIFByZWNhbGNQcmltZVRhYmxlIGFuZCB2ZXJzYXRpbGl0eSBvZgorLy8gT25UaGVGbHlQcmltZVRhYmxlIChzZWUgcHJpbWVfdGFibGVzLmgpLiBJbnNpZGUgaXQgaW5zdGFudGlhdGVzIGJvdGgKKy8vIFByZWNhbGNQcmltZVRhYmxlIGFuZCBPblRoZUZseVByaW1lVGFibGUgYW5kIHVzZXMgdGhlIG9uZSB0aGF0IGlzIG1vcmUKKy8vIGFwcHJvcHJpYXRlIHVuZGVyIHRoZSBjaXJjdW1zdGFuY2VzLiBCdXQgaW4gbG93IG1lbW9yeSBjb25kaXRpb25zLCBpdCBjYW4gYmUKKy8vIHRvbGQgdG8gaW5zdGFudGlhdGUgd2l0aG91dCBQcmVjYWxjUHJpbWVUYWJsZSBpbnN0YW5jZSBhdCBhbGwgYW5kIHVzZSBvbmx5CisvLyBPblRoZUZseVByaW1lVGFibGUuCitjbGFzcyBIeWJyaWRQcmltZVRhYmxlIDogcHVibGljIFByaW1lVGFibGUgeworIHB1YmxpYzoKKyAgSHlicmlkUHJpbWVUYWJsZShib29sIGZvcmNlX29uX3RoZV9mbHksIGludCBtYXhfcHJlY2FsY3VsYXRlZCkKKyAgICAgIDogb25fdGhlX2ZseV9pbXBsXyhuZXcgT25UaGVGbHlQcmltZVRhYmxlKSwKKyAgICAgICAgcHJlY2FsY19pbXBsXyhmb3JjZV9vbl90aGVfZmx5ID8gTlVMTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZShtYXhfcHJlY2FsY3VsYXRlZCkpLAorICAgICAgICBtYXhfcHJlY2FsY3VsYXRlZF8obWF4X3ByZWNhbGN1bGF0ZWQpIHt9CisgIHZpcnR1YWwgfkh5YnJpZFByaW1lVGFibGUoKSB7CisgICAgZGVsZXRlIG9uX3RoZV9mbHlfaW1wbF87CisgICAgZGVsZXRlIHByZWNhbGNfaW1wbF87CisgIH0KKworICB2aXJ0dWFsIGJvb2wgSXNQcmltZShpbnQgbikgY29uc3QgeworICAgIGlmIChwcmVjYWxjX2ltcGxfICE9IE5VTEwgJiYgbiA8IG1heF9wcmVjYWxjdWxhdGVkXykKKyAgICAgIHJldHVybiBwcmVjYWxjX2ltcGxfLT5Jc1ByaW1lKG4pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBvbl90aGVfZmx5X2ltcGxfLT5Jc1ByaW1lKG4pOworICB9CisKKyAgdmlydHVhbCBpbnQgR2V0TmV4dFByaW1lKGludCBwKSBjb25zdCB7CisgICAgaW50IG5leHRfcHJpbWUgPSAtMTsKKyAgICBpZiAocHJlY2FsY19pbXBsXyAhPSBOVUxMICYmIHAgPCBtYXhfcHJlY2FsY3VsYXRlZF8pCisgICAgICBuZXh0X3ByaW1lID0gcHJlY2FsY19pbXBsXy0+R2V0TmV4dFByaW1lKHApOworCisgICAgcmV0dXJuIG5leHRfcHJpbWUgIT0gLTEgPyBuZXh0X3ByaW1lIDogb25fdGhlX2ZseV9pbXBsXy0+R2V0TmV4dFByaW1lKHApOworICB9CisKKyBwcml2YXRlOgorICBPblRoZUZseVByaW1lVGFibGUqIG9uX3RoZV9mbHlfaW1wbF87CisgIFByZUNhbGN1bGF0ZWRQcmltZVRhYmxlKiBwcmVjYWxjX2ltcGxfOworICBpbnQgbWF4X3ByZWNhbGN1bGF0ZWRfOworfTsKKwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtOwordXNpbmcgOjp0ZXN0aW5nOjpCb29sOwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7Cit1c2luZyA6OnRlc3Rpbmc6OkNvbWJpbmU7CisKKy8vIFRvIHRlc3QgYWxsIGNvZGUgcGF0aHMgZm9yIEh5YnJpZFByaW1lVGFibGUgd2UgbXVzdCB0ZXN0IGl0IHdpdGggbnVtYmVycworLy8gYm90aCB3aXRoaW4gYW5kIG91dHNpZGUgUHJlQ2FsY3VsYXRlZFByaW1lVGFibGUncyBjYXBhY2l0eSBhbmQgYWxzbyB3aXRoCisvLyBQcmVDYWxjdWxhdGVkUHJpbWVUYWJsZSBkaXNhYmxlZC4gV2UgZG8gdGhpcyBieSBkZWZpbmluZyBmaXh0dXJlIHdoaWNoIHdpbGwKKy8vIGFjY2VwdCBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHBhcmFtZXRlcnMgZm9yIGluc3RhbnRpYXRpbmcgYQorLy8gSHlicmlkUHJpbWVUYWJsZSBpbnN0YW5jZS4KK2NsYXNzIFByaW1lVGFibGVUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08IDo6dGVzdGluZzo6dHVwbGU8Ym9vbCwgaW50PiA+IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBUaGlzIGNhbiBiZSB3cml0dGVuIGFzCisgICAgLy8KKyAgICAvLyBib29sIGZvcmNlX29uX3RoZV9mbHk7CisgICAgLy8gaW50IG1heF9wcmVjYWxjdWxhdGVkOworICAgIC8vIHRpZShmb3JjZV9vbl90aGVfZmx5LCBtYXhfcHJlY2FsY3VsYXRlZCkgPSBHZXRQYXJhbSgpOworICAgIC8vCisgICAgLy8gb25jZSB0aGUgR29vZ2xlIEMrKyBTdHlsZSBHdWlkZSBhbGxvd3MgdXNlIG9mIDo6c3RkOjp0cjE6OnRpZS4KKyAgICAvLworICAgIGJvb2wgZm9yY2Vfb25fdGhlX2ZseSA9IDo6dGVzdGluZzo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgIGludCBtYXhfcHJlY2FsY3VsYXRlZCA9IDo6dGVzdGluZzo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgIHRhYmxlXyA9IG5ldyBIeWJyaWRQcmltZVRhYmxlKGZvcmNlX29uX3RoZV9mbHksIG1heF9wcmVjYWxjdWxhdGVkKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgZGVsZXRlIHRhYmxlXzsKKyAgICB0YWJsZV8gPSBOVUxMOworICB9CisgIEh5YnJpZFByaW1lVGFibGUqIHRhYmxlXzsKK307CisKK1RFU1RfUChQcmltZVRhYmxlVGVzdCwgUmV0dXJuc0ZhbHNlRm9yTm9uUHJpbWVzKSB7CisgIC8vIEluc2lkZSB0aGUgdGVzdCBib2R5LCB5b3UgY2FuIHJlZmVyIHRvIHRoZSB0ZXN0IHBhcmFtZXRlciBieSBHZXRQYXJhbSgpLgorICAvLyBJbiB0aGlzIGNhc2UsIHRoZSB0ZXN0IHBhcmFtZXRlciBpcyBhIFByaW1lVGFibGUgaW50ZXJmYWNlIHBvaW50ZXIgd2hpY2gKKyAgLy8gd2UgY2FuIHVzZSBkaXJlY3RseS4KKyAgLy8gUGxlYXNlIG5vdGUgdGhhdCB5b3UgY2FuIGFsc28gc2F2ZSBpdCBpbiB0aGUgZml4dHVyZSdzIFNldFVwKCkgbWV0aG9kCisgIC8vIG9yIGNvbnN0cnVjdG9yIGFuZCB1c2Ugc2F2ZWQgY29weSBpbiB0aGUgdGVzdHMuCisKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgtNSkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDApKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgxKSk7CisgIEVYUEVDVF9GQUxTRSh0YWJsZV8tPklzUHJpbWUoNCkpOworICBFWFBFQ1RfRkFMU0UodGFibGVfLT5Jc1ByaW1lKDYpKTsKKyAgRVhQRUNUX0ZBTFNFKHRhYmxlXy0+SXNQcmltZSgxMDApKTsKK30KKworVEVTVF9QKFByaW1lVGFibGVUZXN0LCBSZXR1cm5zVHJ1ZUZvclByaW1lcykgeworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMikpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMykpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoNSkpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoNykpOworICBFWFBFQ1RfVFJVRSh0YWJsZV8tPklzUHJpbWUoMTEpKTsKKyAgRVhQRUNUX1RSVUUodGFibGVfLT5Jc1ByaW1lKDEzMSkpOworfQorCitURVNUX1AoUHJpbWVUYWJsZVRlc3QsIENhbkdldE5leHRQcmltZSkgeworICBFWFBFQ1RfRVEoMiwgdGFibGVfLT5HZXROZXh0UHJpbWUoMCkpOworICBFWFBFQ1RfRVEoMywgdGFibGVfLT5HZXROZXh0UHJpbWUoMikpOworICBFWFBFQ1RfRVEoNSwgdGFibGVfLT5HZXROZXh0UHJpbWUoMykpOworICBFWFBFQ1RfRVEoNywgdGFibGVfLT5HZXROZXh0UHJpbWUoNSkpOworICBFWFBFQ1RfRVEoMTEsIHRhYmxlXy0+R2V0TmV4dFByaW1lKDcpKTsKKyAgRVhQRUNUX0VRKDEzMSwgdGFibGVfLT5HZXROZXh0UHJpbWUoMTI4KSk7Cit9CisKKy8vIEluIG9yZGVyIHRvIHJ1biB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCB5b3UgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGVtLAorLy8gb3IgYmluZCB0aGVtIHRvIGEgbGlzdCBvZiB2YWx1ZXMgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRlc3QgcGFyYW1ldGVycy4KKy8vIFlvdSBjYW4gaW5zdGFudGlhdGUgdGhlbSBpbiBhIGRpZmZlcmVudCB0cmFuc2xhdGlvbiBtb2R1bGUsIG9yIGV2ZW4KKy8vIGluc3RhbnRpYXRlIHRoZW0gc2V2ZXJhbCB0aW1lcy4KKy8vCisvLyBIZXJlLCB3ZSBpbnN0YW50aWF0ZSBvdXIgdGVzdHMgd2l0aCBhIGxpc3Qgb2YgcGFyYW1ldGVycy4gV2UgbXVzdCBjb21iaW5lCisvLyBhbGwgdmFyaWF0aW9ucyBvZiB0aGUgYm9vbGVhbiBmbGFnIHN1cHByZXNzaW5nIFByZWNhbGNQcmltZVRhYmxlIGFuZCBzb21lCisvLyBtZWFuaW5nZnVsIHZhbHVlcyBmb3IgdGVzdHMuIFdlIGNob29zZSBhIHNtYWxsIHZhbHVlICgxKSwgYW5kIGEgdmFsdWUgdGhhdAorLy8gd2lsbCBwdXQgc29tZSBvZiB0aGUgdGVzdGVkIG51bWJlcnMgYmV5b25kIHRoZSBjYXBhYmlsaXR5IG9mIHRoZQorLy8gUHJlY2FsY1ByaW1lVGFibGUgaW5zdGFuY2UgYW5kIHNvbWUgaW5zaWRlIGl0ICgxMCkuIENvbWJpbmUgd2lsbCBwcm9kdWNlIGFsbAorLy8gcG9zc2libGUgY29tYmluYXRpb25zLgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVhbmluZ2Z1bFRlc3RQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWVUYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgVmFsdWVzKDEsIDEwKSkpOworCisjZWxzZQorCisvLyBHb29nbGUgVGVzdCBtYXkgbm90IHN1cHBvcnQgQ29tYmluZSgpIHdpdGggc29tZSBjb21waWxlcnMuIElmIHdlCisvLyB1c2UgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gY29tcGlsZSBvdXQgYWxsIGNvZGUgcmVmZXJyaW5nIHRvCisvLyB0aGUgZ3Rlc3RfbWFpbiBsaWJyYXJ5LCBNU1ZDIGxpbmtlciB3aWxsIG5vdCBsaW5rIHRoYXQgbGlicmFyeSBhdAorLy8gYWxsIGFuZCBjb25zZXF1ZW50bHkgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBlbnRyeSBwb2ludCBkZWZpbmVkIGluCisvLyB0aGF0IGxpYnJhcnkgKGZhdGFsIGVycm9yIExOSzE1NjE6IGVudHJ5IHBvaW50IG11c3QgYmUKKy8vIGRlZmluZWQpLiBUaGlzIGR1bW15IHRlc3Qga2VlcHMgZ3Rlc3RfbWFpbiBsaW5rZWQgaW4uCitURVNUKER1bW15VGVzdCwgQ29tYmluZUlzTm90U3VwcG9ydGVkT25UaGlzUGxhdGZvcm0pIHt9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zYW1wbGVzL3NhbXBsZTlfdW5pdHRlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTIwNzkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2FtcGxlcy9zYW1wbGU5X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTYwIEBACisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKworLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIHVzZSBHb29nbGUgVGVzdCBsaXN0ZW5lciBBUEkgdG8gaW1wbGVtZW50CisvLyBhbiBhbHRlcm5hdGl2ZSBjb25zb2xlIG91dHB1dCBhbmQgaG93IHRvIHVzZSB0aGUgVW5pdFRlc3QgcmVmbGVjdGlvbiBBUEkKKy8vIHRvIGVudW1lcmF0ZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyBhbmQgdG8gaW5zcGVjdCB0aGVpciByZXN1bHRzLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIDo6dGVzdGluZzo6RW1wdHlUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RDYXNlOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnM7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RJbmZvOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDsKK3VzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7CisKK25hbWVzcGFjZSB7CisKKy8vIFByb3ZpZGVzIGFsdGVybmF0aXZlIG91dHB1dCBtb2RlIHdoaWNoIHByb2R1Y2VzIG1pbmltYWwgYW1vdW50IG9mCisvLyBpbmZvcm1hdGlvbiBhYm91dCB0ZXN0cy4KK2NsYXNzIFRlcnNlUHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwcml2YXRlOgorICAvLyBDYWxsZWQgYmVmb3JlIGFueSB0ZXN0IGFjdGl2aXR5IHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovKSB7fQorCisgIC8vIENhbGxlZCBhZnRlciBhbGwgdGVzdCBhY3Rpdml0aWVzIGhhdmUgZW5kZWQuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwgIlRFU1QgJXNcbiIsIHVuaXRfdGVzdC5QYXNzZWQoKSA/ICJQQVNTRUQiIDogIkZBSUxFRCIpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9CisKKyAgLy8gQ2FsbGVkIGJlZm9yZSBhIHRlc3Qgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIGZwcmludGYoc3Rkb3V0LAorICAgICAgICAgICAgIioqKiBUZXN0ICVzLiVzIHN0YXJ0aW5nLlxuIiwKKyAgICAgICAgICAgIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLAorICAgICAgICAgICAgdGVzdF9pbmZvLm5hbWUoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgIH0KKworICAvLyBDYWxsZWQgYWZ0ZXIgYSBmYWlsZWQgYXNzZXJ0aW9uIG9yIGEgU1VDQ0VFRCgpIGludm9jYXRpb24uCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgICAgZnByaW50ZihzdGRvdXQsCisgICAgICAgICAgICAiJXMgaW4gJXM6JWRcbiVzXG4iLAorICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5mYWlsZWQoKSA/ICIqKiogRmFpbHVyZSIgOiAiU3VjY2VzcyIsCisgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpLAorICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpLAorICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5zdW1tYXJ5KCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9CisKKyAgLy8gQ2FsbGVkIGFmdGVyIGEgdGVzdCBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwKKyAgICAgICAgICAgICIqKiogVGVzdCAlcy4lcyBlbmRpbmcuXG4iLAorICAgICAgICAgICAgdGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksCisgICAgICAgICAgICB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgfQorfTsgIC8vIGNsYXNzIFRlcnNlUHJpbnRlcgorCitURVNUKEN1c3RvbU91dHB1dFRlc3QsIFByaW50c01lc3NhZ2UpIHsKKyAgcHJpbnRmKCJQcmludGluZyBzb21ldGhpbmcgZnJvbSB0aGUgdGVzdCBib2R5Li4uXG4iKTsKK30KKworVEVTVChDdXN0b21PdXRwdXRUZXN0LCBTdWNjZWVkcykgeworICBTVUNDRUVEKCkgPDwgIlNVQ0NFRUQoKSBoYXMgYmVlbiBpbnZva2VkIGZyb20gaGVyZSI7Cit9CisKK1RFU1QoQ3VzdG9tT3V0cHV0VGVzdCwgRmFpbHMpIHsKKyAgRVhQRUNUX0VRKDEsIDIpCisgICAgICA8PCAiVGhpcyB0ZXN0IGZhaWxzIGluIG9yZGVyIHRvIGRlbW9uc3RyYXRlIGFsdGVybmF0aXZlIGZhaWx1cmUgbWVzc2FnZXMiOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBib29sIHRlcnNlX291dHB1dCA9IGZhbHNlOworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItLXRlcnNlX291dHB1dCIpID09IDAgKQorICAgIHRlcnNlX291dHB1dCA9IHRydWU7CisgIGVsc2UKKyAgICBwcmludGYoIiVzXG4iLCAiUnVuIHRoaXMgcHJvZ3JhbSB3aXRoIC0tdGVyc2Vfb3V0cHV0IHRvIGNoYW5nZSB0aGUgd2F5ICIKKyAgICAgICAgICAgIml0IHByaW50cyBpdHMgb3V0cHV0LiIpOworCisgIFVuaXRUZXN0JiB1bml0X3Rlc3QgPSAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisKKyAgLy8gSWYgd2UgYXJlIGdpdmVuIHRoZSAtLXRlcnNlX291dHB1dCBjb21tYW5kIGxpbmUgZmxhZywgc3VwcHJlc3NlcyB0aGUKKyAgLy8gc3RhbmRhcmQgb3V0cHV0IGFuZCBhdHRhY2hlcyBvd24gcmVzdWx0IHByaW50ZXIuCisgIGlmICh0ZXJzZV9vdXRwdXQpIHsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycyA9IHVuaXRfdGVzdC5saXN0ZW5lcnMoKTsKKworICAgIC8vIFJlbW92ZXMgdGhlIGRlZmF1bHQgY29uc29sZSBvdXRwdXQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBzbyBpdCB3aWxsCisgICAgLy8gbm90IHJlY2VpdmUgZXZlbnRzIGZyb20gR29vZ2xlIFRlc3QgYW5kIHdvbid0IHByaW50IGFueSBvdXRwdXQuIFNpbmNlCisgICAgLy8gdGhpcyBvcGVyYXRpb24gdHJhbnNmZXJzIG93bmVyc2hpcCBvZiB0aGUgbGlzdGVuZXIgdG8gdGhlIGNhbGxlciB3ZQorICAgIC8vIGhhdmUgdG8gZGVsZXRlIGl0IGFzIHdlbGwuCisgICAgZGVsZXRlIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkpOworCisgICAgLy8gQWRkcyB0aGUgY3VzdG9tIG91dHB1dCBsaXN0ZW5lciB0byB0aGUgbGlzdC4gSXQgd2lsbCBub3cgcmVjZWl2ZQorICAgIC8vIGV2ZW50cyBmcm9tIEdvb2dsZSBUZXN0IGFuZCBwcmludCB0aGUgYWx0ZXJuYXRpdmUgb3V0cHV0LiBXZSBkb24ndAorICAgIC8vIGhhdmUgdG8gd29ycnkgYWJvdXQgZGVsZXRpbmcgaXQgc2luY2UgR29vZ2xlIFRlc3QgYXNzdW1lcyBvd25lcnNoaXAKKyAgICAvLyBvdmVyIGl0IGFmdGVyIGFkZGluZyBpdCB0byB0aGUgbGlzdC4KKyAgICBsaXN0ZW5lcnMuQXBwZW5kKG5ldyBUZXJzZVByaW50ZXIpOworICB9CisgIGludCByZXRfdmFsID0gUlVOX0FMTF9URVNUUygpOworCisgIC8vIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyB0aGUgVW5pdFRlc3QgcmVmbGVjdGlvbiBBUEkgdG8gaW5zcGVjdCB0ZXN0CisgIC8vIHJlc3VsdHMuIEhlcmUgd2UgZGlzY291bnQgZmFpbHVyZXMgZnJvbSB0aGUgdGVzdHMgd2UgZXhwZWN0ZWQgdG8gZmFpbC4KKyAgaW50IHVuZXhwZWN0ZWRseV9mYWlsZWRfdGVzdHMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9ICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2opIHsKKyAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8gPSAqdGVzdF9jYXNlLkdldFRlc3RJbmZvKGopOworICAgICAgLy8gQ291bnRzIGZhaWxlZCB0ZXN0cyB0aGF0IHdlcmUgbm90IG1lYW50IHRvIGZhaWwgKHRob3NlIHdpdGhvdXQKKyAgICAgIC8vICdGYWlscycgaW4gdGhlIG5hbWUpLgorICAgICAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+RmFpbGVkKCkgJiYKKyAgICAgICAgICBzdHJjbXAodGVzdF9pbmZvLm5hbWUoKSwgIkZhaWxzIikgIT0gMCkgeworICAgICAgICB1bmV4cGVjdGVkbHlfZmFpbGVkX3Rlc3RzKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVGVzdCB0aGF0IHdlcmUgbWVhbnQgdG8gZmFpbCBzaG91bGQgbm90IGFmZmVjdCB0aGUgdGVzdCBwcm9ncmFtIG91dGNvbWUuCisgIGlmICh1bmV4cGVjdGVkbHlfZmFpbGVkX3Rlc3RzID09IDApCisgICAgcmV0X3ZhbCA9IDA7CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy9jb21tb24ucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy9jb21tb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwMzQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL2NvbW1vbi5weQpAQCAtMCwwICsxLDgzIEBACisjIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJTaGFyZWQgdXRpbGl0aWVzIGZvciB3cml0aW5nIHNjcmlwdHMgZm9yIEdvb2dsZSBUZXN0L01vY2suIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKKworCisjIE1hdGNoZXMgdGhlIGxpbmUgZnJvbSAnc3ZuIGluZm8gLicgb3V0cHV0IHRoYXQgZGVzY3JpYmVzIHdoYXQgU1ZOCisjIHBhdGggdGhlIGN1cnJlbnQgbG9jYWwgZGlyZWN0b3J5IGNvcnJlc3BvbmRzIHRvLiAgRm9yIGV4YW1wbGUsIGluCisjIGEgZ29vZ2xldGVzdCBTVk4gd29ya3NwYWNlJ3MgdHJ1bmsvdGVzdCBkaXJlY3RvcnksIHRoZSBvdXRwdXQgd2lsbCBiZToKKyMKKyMgVVJMOiBodHRwczovL2dvb2dsZXRlc3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL3Rlc3QKK19TVk5fSU5GT19VUkxfUkUgPSByZS5jb21waWxlKHInXlVSTDogaHR0cHM6Ly8oXHcrKVwuZ29vZ2xlY29kZVwuY29tL3N2biguKiknKQorCisKK2RlZiBHZXRDb21tYW5kT3V0cHV0KGNvbW1hbmQpOgorICAiIiJSdW5zIHRoZSBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm5zIGl0cyBzdGRvdXQgYXMgYSBsaXN0IG9mIGxpbmVzLiIiIgorCisgIGYgPSBvcy5wb3Blbihjb21tYW5kLCAncicpCisgIGxpbmVzID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBmLnJlYWRsaW5lcygpXQorICBmLmNsb3NlKCkKKyAgcmV0dXJuIGxpbmVzCisKKworZGVmIEdldFN2bkluZm8oKToKKyAgIiIiUmV0dXJucyB0aGUgcHJvamVjdCBuYW1lIGFuZCB0aGUgY3VycmVudCBTVk4gd29ya3NwYWNlJ3Mgcm9vdCBwYXRoLiIiIgorCisgIGZvciBsaW5lIGluIEdldENvbW1hbmRPdXRwdXQoJ3N2biBpbmZvIC4nKToKKyAgICBtID0gX1NWTl9JTkZPX1VSTF9SRS5tYXRjaChsaW5lKQorICAgIGlmIG06CisgICAgICBwcm9qZWN0ID0gbS5ncm91cCgxKSAgIyBnb29nbGV0ZXN0IG9yIGdvb2dsZW1vY2sKKyAgICAgIHJlbF9wYXRoID0gbS5ncm91cCgyKQorICAgICAgcm9vdCA9IG9zLnBhdGgucmVhbHBhdGgocmVsX3BhdGguY291bnQoJy8nKSAqICcuLi8nKQorICAgICAgcmV0dXJuIHByb2plY3QsIHJvb3QKKworICByZXR1cm4gTm9uZSwgTm9uZQorCisKK2RlZiBHZXRTdm5UcnVuaygpOgorICAiIiJSZXR1cm5zIHRoZSBjdXJyZW50IFNWTiB3b3Jrc3BhY2UncyB0cnVuayByb290IHBhdGguIiIiCisKKyAgXywgcm9vdCA9IEdldFN2bkluZm8oKQorICByZXR1cm4gcm9vdCArICcvdHJ1bmsnIGlmIHJvb3QgZWxzZSBOb25lCisKKworZGVmIElzSW5HVGVzdFN2bigpOgorICBwcm9qZWN0LCBfID0gR2V0U3ZuSW5mbygpCisgIHJldHVybiBwcm9qZWN0ID09ICdnb29nbGV0ZXN0JworCisKK2RlZiBJc0luR01vY2tTdm4oKToKKyAgcHJvamVjdCwgXyA9IEdldFN2bkluZm8oKQorICByZXR1cm4gcHJvamVjdCA9PSAnZ29vZ2xlbW9jaycKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL2Z1c2VfZ3Rlc3RfZmlsZXMucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3ZWY3MmYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy9mdXNlX2d0ZXN0X2ZpbGVzLnB5CkBAIC0wLDAgKzEsMjUwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJmdXNlX2d0ZXN0X2ZpbGVzLnB5IHYwLjIuMAorRnVzZXMgR29vZ2xlIFRlc3Qgc291cmNlIGNvZGUgaW50byBhIC5oIGZpbGUgYW5kIGEgLmNjIGZpbGUuCisKK1NZTk9QU0lTCisgICAgICAgZnVzZV9ndGVzdF9maWxlcy5weSBbR1RFU1RfUk9PVF9ESVJdIE9VVFBVVF9ESVIKKworICAgICAgIFNjYW5zIEdURVNUX1JPT1RfRElSIGZvciBHb29nbGUgVGVzdCBzb3VyY2UgY29kZSwgYW5kIGdlbmVyYXRlcworICAgICAgIHR3byBmaWxlczogT1VUUFVUX0RJUi9ndGVzdC9ndGVzdC5oIGFuZCBPVVRQVVRfRElSL2d0ZXN0L2d0ZXN0LWFsbC5jYy4KKyAgICAgICBUaGVuIHlvdSBjYW4gYnVpbGQgeW91ciB0ZXN0cyBieSBhZGRpbmcgT1VUUFVUX0RJUiB0byB0aGUgaW5jbHVkZQorICAgICAgIHNlYXJjaCBwYXRoIGFuZCBsaW5raW5nIHdpdGggT1VUUFVUX0RJUi9ndGVzdC9ndGVzdC1hbGwuY2MuICBUaGVzZQorICAgICAgIHR3byBmaWxlcyBjb250YWluIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gdXNlIEdvb2dsZSBUZXN0LiAgSGVuY2UKKyAgICAgICB5b3UgY2FuICJpbnN0YWxsIiBHb29nbGUgVGVzdCBieSBjb3B5aW5nIHRoZW0gdG8gd2hlcmV2ZXIgeW91IHdhbnQuCisKKyAgICAgICBHVEVTVF9ST09UX0RJUiBjYW4gYmUgb21pdHRlZCBhbmQgZGVmYXVsdHMgdG8gdGhlIHBhcmVudAorICAgICAgIGRpcmVjdG9yeSBvZiB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgdGhpcyBzY3JpcHQuCisKK0VYQU1QTEVTCisgICAgICAgLi9mdXNlX2d0ZXN0X2ZpbGVzLnB5IGZ1c2VkX2d0ZXN0CisgICAgICAgLi9mdXNlX2d0ZXN0X2ZpbGVzLnB5IHBhdGgvdG8vdW5wYWNrZWQvZ3Rlc3QgZnVzZWRfZ3Rlc3QKKworVGhpcyB0b29sIGlzIGV4cGVyaW1lbnRhbC4gIEluIHBhcnRpY3VsYXIsIGl0IGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBubworY29uZGl0aW9uYWwgaW5jbHVzaW9uIG9mIEdvb2dsZSBUZXN0IGhlYWRlcnMuICBQbGVhc2UgcmVwb3J0IGFueQorcHJvYmxlbXMgdG8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tLiAgWW91IGNhbiByZWFkCitodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3RBZHZhbmNlZEd1aWRlIGZvcgorbW9yZSBpbmZvcm1hdGlvbi4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNldHMKK2ltcG9ydCBzeXMKKworIyBXZSBhc3N1bWUgdGhhdCB0aGlzIGZpbGUgaXMgaW4gdGhlIHNjcmlwdHMvIGRpcmVjdG9yeSBpbiB0aGUgR29vZ2xlCisjIFRlc3Qgcm9vdCBkaXJlY3RvcnkuCitERUZBVUxUX0dURVNUX1JPT1RfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicpCisKKyMgUmVnZXggZm9yIG1hdGNoaW5nICcjaW5jbHVkZSAiZ3Rlc3QvLi4uIicuCitJTkNMVURFX0dURVNUX0ZJTEVfUkVHRVggPSByZS5jb21waWxlKHInXlxzKiNccyppbmNsdWRlXHMqIihndGVzdC8uKykiJykKKworIyBSZWdleCBmb3IgbWF0Y2hpbmcgJyNpbmNsdWRlICJzcmMvLi4uIicuCitJTkNMVURFX1NSQ19GSUxFX1JFR0VYID0gcmUuY29tcGlsZShyJ15ccyojXHMqaW5jbHVkZVxzKiIoc3JjLy4rKSInKQorCisjIFdoZXJlIHRvIGZpbmQgdGhlIHNvdXJjZSBzZWVkIGZpbGVzLgorR1RFU1RfSF9TRUVEID0gJ2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCcKK0dURVNUX1NQSV9IX1NFRUQgPSAnaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaCcKK0dURVNUX0FMTF9DQ19TRUVEID0gJ3NyYy9ndGVzdC1hbGwuY2MnCisKKyMgV2hlcmUgdG8gcHV0IHRoZSBnZW5lcmF0ZWQgZmlsZXMuCitHVEVTVF9IX09VVFBVVCA9ICdndGVzdC9ndGVzdC5oJworR1RFU1RfQUxMX0NDX09VVFBVVCA9ICdndGVzdC9ndGVzdC1hbGwuY2MnCisKKworZGVmIFZlcmlmeUZpbGVFeGlzdHMoZGlyZWN0b3J5LCByZWxhdGl2ZV9wYXRoKToKKyAgIiIiVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gZmlsZSBleGlzdHM7IGFib3J0cyBvbiBmYWlsdXJlLgorCisgIHJlbGF0aXZlX3BhdGggaXMgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICAiIiIKKworICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKGRpcmVjdG9yeSwgcmVsYXRpdmVfcGF0aCkpOgorICAgIHByaW50ICdFUlJPUjogQ2Fubm90IGZpbmQgJXMgaW4gZGlyZWN0b3J5ICVzLicgJSAocmVsYXRpdmVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSkKKyAgICBwcmludCAoJ1BsZWFzZSBlaXRoZXIgc3BlY2lmeSBhIHZhbGlkIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkgJworICAgICAgICAgICAnb3Igb21pdCBpdCBvbiB0aGUgY29tbWFuZCBsaW5lLicpCisgICAgc3lzLmV4aXQoMSkKKworCitkZWYgVmFsaWRhdGVHVGVzdFJvb3REaXIoZ3Rlc3Rfcm9vdCk6CisgICIiIk1ha2VzIHN1cmUgZ3Rlc3Rfcm9vdCBwb2ludHMgdG8gYSB2YWxpZCBndGVzdCByb290IGRpcmVjdG9yeS4KKworICBUaGUgZnVuY3Rpb24gYWJvcnRzIHRoZSBwcm9ncmFtIG9uIGZhaWx1cmUuCisgICIiIgorCisgIFZlcmlmeUZpbGVFeGlzdHMoZ3Rlc3Rfcm9vdCwgR1RFU1RfSF9TRUVEKQorICBWZXJpZnlGaWxlRXhpc3RzKGd0ZXN0X3Jvb3QsIEdURVNUX0FMTF9DQ19TRUVEKQorCisKK2RlZiBWZXJpZnlPdXRwdXRGaWxlKG91dHB1dF9kaXIsIHJlbGF0aXZlX3BhdGgpOgorICAiIiJWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBvdXRwdXQgZmlsZSBwYXRoIGlzIHZhbGlkLgorCisgIHJlbGF0aXZlX3BhdGggaXMgcmVsYXRpdmUgdG8gdGhlIG91dHB1dF9kaXIgZGlyZWN0b3J5LgorICAiIiIKKworICAjIE1ha2VzIHN1cmUgdGhlIG91dHB1dCBmaWxlIGVpdGhlciBkb2Vzbid0IGV4aXN0IG9yIGNhbiBiZSBvdmVyd3JpdHRlbi4KKyAgb3V0cHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgcmVsYXRpdmVfcGF0aCkKKyAgaWYgb3MucGF0aC5leGlzdHMob3V0cHV0X2ZpbGUpOgorICAgICMgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IFRoZSBmb2xsb3dpbmcgdXNlci1pbnRlcmFjdGlvbiBkb2Vzbid0CisgICAgIyB3b3JrIHdpdGggYXV0b21hdGVkIHByb2Nlc3Nlcy4gIFdlIHNob3VsZCBwcm92aWRlIGEgd2F5IGZvciB0aGUKKyAgICAjIE1ha2VmaWxlIHRvIGZvcmNlIG92ZXJ3cml0aW5nIHRoZSBmaWxlcy4KKyAgICBwcmludCAoJyVzIGFscmVhZHkgZXhpc3RzIGluIGRpcmVjdG9yeSAlcyAtIG92ZXJ3cml0ZSBpdD8gKHkvTikgJyAlCisgICAgICAgICAgIChyZWxhdGl2ZV9wYXRoLCBvdXRwdXRfZGlyKSkKKyAgICBhbnN3ZXIgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKS5zdHJpcCgpCisgICAgaWYgYW5zd2VyIG5vdCBpbiBbJ3knLCAnWSddOgorICAgICAgcHJpbnQgJ0FCT1JURUQuJworICAgICAgc3lzLmV4aXQoMSkKKworICAjIE1ha2VzIHN1cmUgdGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoZSBvdXRwdXQgZmlsZSBleGlzdHM7IGNyZWF0ZXMKKyAgIyBpdCBhbmQgYWxsIGl0cyBhbmNlc3RvcnMgaWYgbmVjZXNzYXJ5LgorICBwYXJlbnRfZGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlKQorICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXJlbnRfZGlyZWN0b3J5KToKKyAgICBvcy5tYWtlZGlycyhwYXJlbnRfZGlyZWN0b3J5KQorCisKK2RlZiBWYWxpZGF0ZU91dHB1dERpcihvdXRwdXRfZGlyKToKKyAgIiIiTWFrZXMgc3VyZSBvdXRwdXRfZGlyIHBvaW50cyB0byBhIHZhbGlkIG91dHB1dCBkaXJlY3RvcnkuCisKKyAgVGhlIGZ1bmN0aW9uIGFib3J0cyB0aGUgcHJvZ3JhbSBvbiBmYWlsdXJlLgorICAiIiIKKworICBWZXJpZnlPdXRwdXRGaWxlKG91dHB1dF9kaXIsIEdURVNUX0hfT1VUUFVUKQorICBWZXJpZnlPdXRwdXRGaWxlKG91dHB1dF9kaXIsIEdURVNUX0FMTF9DQ19PVVRQVVQpCisKKworZGVmIEZ1c2VHVGVzdEgoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2Rpcik6CisgICIiIlNjYW5zIGZvbGRlciBndGVzdF9yb290IHRvIGdlbmVyYXRlIGd0ZXN0L2d0ZXN0LmggaW4gb3V0cHV0X2Rpci4iIiIKKworICBvdXRwdXRfZmlsZSA9IGZpbGUob3MucGF0aC5qb2luKG91dHB1dF9kaXIsIEdURVNUX0hfT1VUUFVUKSwgJ3cnKQorICBwcm9jZXNzZWRfZmlsZXMgPSBzZXRzLlNldCgpICAjIEhvbGRzIGFsbCBndGVzdCBoZWFkZXJzIHdlJ3ZlIHByb2Nlc3NlZC4KKworICBkZWYgUHJvY2Vzc0ZpbGUoZ3Rlc3RfaGVhZGVyX3BhdGgpOgorICAgICIiIlByb2Nlc3NlcyB0aGUgZ2l2ZW4gZ3Rlc3QgaGVhZGVyIGZpbGUuIiIiCisKKyAgICAjIFdlIGRvbid0IHByb2Nlc3MgdGhlIHNhbWUgaGVhZGVyIHR3aWNlLgorICAgIGlmIGd0ZXN0X2hlYWRlcl9wYXRoIGluIHByb2Nlc3NlZF9maWxlczoKKyAgICAgIHJldHVybgorCisgICAgcHJvY2Vzc2VkX2ZpbGVzLmFkZChndGVzdF9oZWFkZXJfcGF0aCkKKworICAgICMgUmVhZHMgZWFjaCBsaW5lIGluIHRoZSBnaXZlbiBndGVzdCBoZWFkZXIuCisgICAgZm9yIGxpbmUgaW4gZmlsZShvcy5wYXRoLmpvaW4oZ3Rlc3Rfcm9vdCwgZ3Rlc3RfaGVhZGVyX3BhdGgpLCAncicpOgorICAgICAgbSA9IElOQ0xVREVfR1RFU1RfRklMRV9SRUdFWC5tYXRjaChsaW5lKQorICAgICAgaWYgbToKKyAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAiZ3Rlc3QvLi4uIicgLSBsZXQncyBwcm9jZXNzIGl0IHJlY3Vyc2l2ZWx5LgorICAgICAgICBQcm9jZXNzRmlsZSgnaW5jbHVkZS8nICsgbS5ncm91cCgxKSkKKyAgICAgIGVsc2U6CisgICAgICAgICMgT3RoZXJ3aXNlIHdlIGNvcHkgdGhlIGxpbmUgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUobGluZSkKKworICBQcm9jZXNzRmlsZShHVEVTVF9IX1NFRUQpCisgIG91dHB1dF9maWxlLmNsb3NlKCkKKworCitkZWYgRnVzZUdUZXN0QWxsQ2NUb0ZpbGUoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2ZpbGUpOgorICAiIiJTY2FucyBmb2xkZXIgZ3Rlc3Rfcm9vdCB0byBnZW5lcmF0ZSBndGVzdC9ndGVzdC1hbGwuY2MgaW4gb3V0cHV0X2ZpbGUuIiIiCisKKyAgcHJvY2Vzc2VkX2ZpbGVzID0gc2V0cy5TZXQoKQorCisgIGRlZiBQcm9jZXNzRmlsZShndGVzdF9zb3VyY2VfZmlsZSk6CisgICAgIiIiUHJvY2Vzc2VzIHRoZSBnaXZlbiBndGVzdCBzb3VyY2UgZmlsZS4iIiIKKworICAgICMgV2UgZG9uJ3QgcHJvY2VzcyB0aGUgc2FtZSAjaW5jbHVkZWQgZmlsZSB0d2ljZS4KKyAgICBpZiBndGVzdF9zb3VyY2VfZmlsZSBpbiBwcm9jZXNzZWRfZmlsZXM6CisgICAgICByZXR1cm4KKworICAgIHByb2Nlc3NlZF9maWxlcy5hZGQoZ3Rlc3Rfc291cmNlX2ZpbGUpCisKKyAgICAjIFJlYWRzIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gZ3Rlc3Qgc291cmNlIGZpbGUuCisgICAgZm9yIGxpbmUgaW4gZmlsZShvcy5wYXRoLmpvaW4oZ3Rlc3Rfcm9vdCwgZ3Rlc3Rfc291cmNlX2ZpbGUpLCAncicpOgorICAgICAgbSA9IElOQ0xVREVfR1RFU1RfRklMRV9SRUdFWC5tYXRjaChsaW5lKQorICAgICAgaWYgbToKKyAgICAgICAgaWYgJ2luY2x1ZGUvJyArIG0uZ3JvdXAoMSkgPT0gR1RFU1RfU1BJX0hfU0VFRDoKKyAgICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCInLiAgVGhpcyBmaWxlIGlzIG5vdAorICAgICAgICAgICMgI2luY2x1ZGVkIGJ5ICJndGVzdC9ndGVzdC5oIiwgc28gd2UgbmVlZCB0byBwcm9jZXNzIGl0LgorICAgICAgICAgIFByb2Nlc3NGaWxlKEdURVNUX1NQSV9IX1NFRUQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgIyBJdCdzICcjaW5jbHVkZSAiZ3Rlc3QvZm9vLmgiJyB3aGVyZSBmb28gaXMgbm90IGd0ZXN0LXNwaS4KKyAgICAgICAgICAjIFdlIHRyZWF0IGl0IGFzICcjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCInLCBhcyBhbGwgb3RoZXIKKyAgICAgICAgICAjIGd0ZXN0IGhlYWRlcnMgYXJlIGJlaW5nIGZ1c2VkIGludG8gZ3Rlc3QuaCBhbmQgY2Fubm90IGJlCisgICAgICAgICAgIyAjaW5jbHVkZWQgZGlyZWN0bHkuCisKKyAgICAgICAgICAjIFRoZXJlIGlzIG5vIG5lZWQgdG8gI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICAgIGlmIG5vdCBHVEVTVF9IX1NFRUQgaW4gcHJvY2Vzc2VkX2ZpbGVzOgorICAgICAgICAgICAgcHJvY2Vzc2VkX2ZpbGVzLmFkZChHVEVTVF9IX1NFRUQpCisgICAgICAgICAgICBvdXRwdXRfZmlsZS53cml0ZSgnI2luY2x1ZGUgIiVzIlxuJyAlIChHVEVTVF9IX09VVFBVVCwpKQorICAgICAgZWxzZToKKyAgICAgICAgbSA9IElOQ0xVREVfU1JDX0ZJTEVfUkVHRVgubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAjIEl0J3MgJyNpbmNsdWRlICJzcmMvZm9vIicgLSBsZXQncyBwcm9jZXNzIGl0IHJlY3Vyc2l2ZWx5LgorICAgICAgICAgIFByb2Nlc3NGaWxlKG0uZ3JvdXAoMSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUobGluZSkKKworICBQcm9jZXNzRmlsZShHVEVTVF9BTExfQ0NfU0VFRCkKKworCitkZWYgRnVzZUdUZXN0QWxsQ2MoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2Rpcik6CisgICIiIlNjYW5zIGZvbGRlciBndGVzdF9yb290IHRvIGdlbmVyYXRlIGd0ZXN0L2d0ZXN0LWFsbC5jYyBpbiBvdXRwdXRfZGlyLiIiIgorCisgIG91dHB1dF9maWxlID0gZmlsZShvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgR1RFU1RfQUxMX0NDX09VVFBVVCksICd3JykKKyAgRnVzZUdUZXN0QWxsQ2NUb0ZpbGUoZ3Rlc3Rfcm9vdCwgb3V0cHV0X2ZpbGUpCisgIG91dHB1dF9maWxlLmNsb3NlKCkKKworCitkZWYgRnVzZUdUZXN0KGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpOgorICAiIiJGdXNlcyBndGVzdC5oIGFuZCBndGVzdC1hbGwuY2MuIiIiCisKKyAgVmFsaWRhdGVHVGVzdFJvb3REaXIoZ3Rlc3Rfcm9vdCkKKyAgVmFsaWRhdGVPdXRwdXREaXIob3V0cHV0X2RpcikKKworICBGdXNlR1Rlc3RIKGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpCisgIEZ1c2VHVGVzdEFsbENjKGd0ZXN0X3Jvb3QsIG91dHB1dF9kaXIpCisKKworZGVmIG1haW4oKToKKyAgYXJnYyA9IGxlbihzeXMuYXJndikKKyAgaWYgYXJnYyA9PSAyOgorICAgICMgZnVzZV9ndGVzdF9maWxlcy5weSBPVVRQVVRfRElSCisgICAgRnVzZUdUZXN0KERFRkFVTFRfR1RFU1RfUk9PVF9ESVIsIHN5cy5hcmd2WzFdKQorICBlbGlmIGFyZ2MgPT0gMzoKKyAgICAjIGZ1c2VfZ3Rlc3RfZmlsZXMucHkgR1RFU1RfUk9PVF9ESVIgT1VUUFVUX0RJUgorICAgIEZ1c2VHVGVzdChzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMl0pCisgIGVsc2U6CisgICAgcHJpbnQgX19kb2NfXworICAgIHN5cy5leGl0KDEpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy9nZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTdhYjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NjcmlwdHMvZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weQpAQCAtMCwwICsxLDczMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSB2MC4xCisKK0dlbmVyYXRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgR29vZ2xlIFRlc3QgcHJlZGljYXRlIGFzc2VydGlvbnMgYW5kCithY2NvbXBhbnlpbmcgdGVzdHMuCisKK1VzYWdlOgorCisgIGdlbl9ndGVzdF9wcmVkX2ltcGwucHkgTUFYX0FSSVRZCisKK3doZXJlIE1BWF9BUklUWSBpcyBhIHBvc2l0aXZlIGludGVnZXIuCisKK1RoZSBjb21tYW5kIGdlbmVyYXRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdXAtdG8gTUFYX0FSSVRZLWFyeQorcHJlZGljYXRlIGFzc2VydGlvbnMsIGFuZCB3cml0ZXMgaXQgdG8gZmlsZSBndGVzdF9wcmVkX2ltcGwuaCBpbiB0aGUKK2RpcmVjdG9yeSB3aGVyZSB0aGUgc2NyaXB0IGlzLiAgSXQgYWxzbyBnZW5lcmF0ZXMgdGhlIGFjY29tcGFueWluZwordW5pdCB0ZXN0IGluIGZpbGUgZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjLgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworIyBXaGVyZSB0aGlzIHNjcmlwdCBpcy4KK1NDUklQVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pCisKKyMgV2hlcmUgdG8gc3RvcmUgdGhlIGdlbmVyYXRlZCBoZWFkZXIuCitIRUFERVIgPSBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgJy4uL2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmgnKQorCisjIFdoZXJlIHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgdW5pdCB0ZXN0LgorVU5JVF9URVNUID0gb3MucGF0aC5qb2luKFNDUklQVF9ESVIsICcuLi90ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYycpCisKKworZGVmIEhlYWRlclByZWFtYmxlKG4pOgorICAiIiJSZXR1cm5zIHRoZSBwcmVhbWJsZSBmb3IgdGhlIGhlYWRlciBmaWxlLgorCisgIEFyZ3M6CisgICAgbjogIHRoZSBtYXhpbXVtIGFyaXR5IG9mIHRoZSBwcmVkaWNhdGUgbWFjcm9zIHRvIGJlIGdlbmVyYXRlZC4KKyAgIiIiCisKKyAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSBwcmVhbWJsZSB0ZW1wbGF0ZS4KKyAgREVGUyA9IHsKKyAgICAndG9kYXknIDogdGltZS5zdHJmdGltZSgnJW0vJWQvJVknKSwKKyAgICAneWVhcicgOiB0aW1lLnN0cmZ0aW1lKCclWScpLAorICAgICdjb21tYW5kJyA6ICclcyAlcycgJSAob3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSksIG4pLAorICAgICduJyA6IG4KKyAgICB9CisKKyAgcmV0dXJuICgKKyIiIi8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGlzIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIG9uICUodG9kYXkpcyBieSBjb21tYW5kCisvLyAnJShjb21tYW5kKXMnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBJbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KKworLy8gTWFrZXMgc3VyZSB0aGlzIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgYmVmb3JlIGd0ZXN0LmguCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKyMgZXJyb3IgRG8gbm90IGluY2x1ZGUgZ3Rlc3RfcHJlZF9pbXBsLmggZGlyZWN0bHkuICBJbmNsdWRlIGd0ZXN0LmggaW5zdGVhZC4KKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXworCisvLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbgorLy8gbWFjcm9zOgorLy8KKy8vICAgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZF9mb3JtYXQgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgdGFrZXMgbiAoaW4gdGhlCisvLyBjYXNlIG9mIEFTU0VSVF9QUkVEX0ZPUk1BVG4pIHZhbHVlcyBhbmQgdGhlaXIgc291cmNlIGV4cHJlc3Npb24KKy8vIHRleHQsIGFuZCByZXR1cm5zIGEgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0LiAgU2VlIHRoZSBkZWZpbml0aW9uCisvLyBvZiBBU1NFUlRfRVEgaW4gZ3Rlc3QuaCBmb3IgYW4gZXhhbXBsZS4KKy8vCisvLyBJZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBmb3JtYXR0aW5nLCB5b3UgY2FuIHVzZSB0aGUgbW9yZQorLy8gcmVzdHJpY3RpdmUgdmVyc2lvbjoKKy8vCisvLyAgIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkKKy8vICAgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikKKy8vICAgLi4uCisvLworLy8gd2hlcmUgcHJlZCBpcyBhbiBuLWFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgcmV0dXJucyBib29sLAorLy8gYW5kIHRoZSB2YWx1ZXMgdjEsIHYyLCAuLi4sIG11c3Qgc3VwcG9ydCB0aGUgPDwgb3BlcmF0b3IgZm9yCisvLyBzdHJlYW1pbmcgdG8gc3RkOjpvc3RyZWFtLgorLy8KKy8vIFdlIGFsc28gZGVmaW5lIHRoZSBFWFBFQ1RfKiB2YXJpYXRpb25zLgorLy8KKy8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IHByZWRpY2F0ZXMgd2hvc2UgYXJpdHkgaXMgYXQgbW9zdCAlKG4pcy4KKy8vIFBsZWFzZSBlbWFpbCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKKy8vIHN1cHBvcnQgZm9yIGhpZ2hlciBhcml0aWVzLgorCisvLyBHVEVTVF9BU1NFUlRfIGlzIHRoZSBiYXNpYyBzdGF0ZW1lbnQgdG8gd2hpY2ggYWxsIG9mIHRoZSBhc3NlcnRpb25zCisvLyBpbiB0aGlzIGZpbGUgcmVkdWNlLiAgRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorCisjZGVmaW5lIEdURVNUX0FTU0VSVF8oZXhwcmVzc2lvbiwgb25fZmFpbHVyZSkgXFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXFwKKyAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyID0gKGV4cHJlc3Npb24pKSBcXAorICAgIDsgXFwKKyAgZWxzZSBcXAorICAgIG9uX2ZhaWx1cmUoZ3Rlc3RfYXIuZmFpbHVyZV9tZXNzYWdlKCkpCisiIiIgJSBERUZTKQorCisKK2RlZiBBcml0eShuKToKKyAgIiIiUmV0dXJucyB0aGUgRW5nbGlzaCBuYW1lIG9mIHRoZSBnaXZlbiBhcml0eS4iIiIKKworICBpZiBuIDwgMDoKKyAgICByZXR1cm4gTm9uZQorICBlbGlmIG4gPD0gMzoKKyAgICByZXR1cm4gWydudWxsYXJ5JywgJ3VuYXJ5JywgJ2JpbmFyeScsICd0ZXJuYXJ5J11bbl0KKyAgZWxzZToKKyAgICByZXR1cm4gJyVzLWFyeScgJSBuCisKKworZGVmIFRpdGxlKHdvcmQpOgorICAiIiJSZXR1cm5zIHRoZSBnaXZlbiB3b3JkIGluIHRpdGxlIGNhc2UuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgIHRoaXMgYW5kIHN0cmluZydzIHRpdGxlKCkgbWV0aG9kIGlzIHRoYXQgVGl0bGUoJzQtYXJ5JykgaXMgJzQtYXJ5JworICB3aGlsZSAnNC1hcnknLnRpdGxlKCkgaXMgJzQtQXJ5Jy4iIiIKKworICByZXR1cm4gd29yZFswXS51cHBlcigpICsgd29yZFsxOl0KKworCitkZWYgT25lVG8obik6CisgICIiIlJldHVybnMgdGhlIGxpc3QgWzEsIDIsIDMsIC4uLiwgbl0uIiIiCisKKyAgcmV0dXJuIHJhbmdlKDEsIG4gKyAxKQorCisKK2RlZiBJdGVyKG4sIGZvcm1hdCwgc2VwPScnKToKKyAgIiIiR2l2ZW4gYSBwb3NpdGl2ZSBpbnRlZ2VyIG4sIGEgZm9ybWF0IHN0cmluZyB0aGF0IGNvbnRhaW5zIDAgb3IKKyAgbW9yZSAnJXMnIGZvcm1hdCBzcGVjcywgYW5kIG9wdGlvbmFsbHkgYSBzZXBhcmF0b3Igc3RyaW5nLCByZXR1cm5zCisgIHRoZSBqb2luIG9mIG4gc3RyaW5ncywgZWFjaCBmb3JtYXR0ZWQgd2l0aCB0aGUgZm9ybWF0IHN0cmluZyBvbiBhbgorICBpdGVyYXRvciByYW5nZWQgZnJvbSAxIHRvIG4uCisKKyAgRXhhbXBsZToKKworICBJdGVyKDMsICd2JXMnLCBzZXA9JywgJykgcmV0dXJucyAndjEsIHYyLCB2MycuCisgICIiIgorCisgICMgSG93IG1hbnkgJyVzJyBzcGVjcyBhcmUgaW4gZm9ybWF0PworICBzcGVjX2NvdW50ID0gbGVuKGZvcm1hdC5zcGxpdCgnJXMnKSkgLSAxCisgIHJldHVybiBzZXAuam9pbihbZm9ybWF0ICUgKHNwZWNfY291bnQgKiAoaSwpKSBmb3IgaSBpbiBPbmVUbyhuKV0pCisKKworZGVmIEltcGxlbWVudGF0aW9uRm9yQXJpdHkobik6CisgICIiIlJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIG4tYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgICMgQSBtYXAgdGhlIGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiB0ZW1wbGF0ZS4KKyAgREVGUyA9IHsKKyAgICAnbicgOiBzdHIobiksCisgICAgJ3ZzJyA6IEl0ZXIobiwgJ3YlcycsIHNlcD0nLCAnKSwKKyAgICAndnRzJyA6IEl0ZXIobiwgJyN2JXMnLCBzZXA9JywgJyksCisgICAgJ2FyaXR5JyA6IEFyaXR5KG4pLAorICAgICdBcml0eScgOiBUaXRsZShBcml0eShuKSkKKyAgICB9CisKKyAgaW1wbCA9ICIiIgorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRCUobilzLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkIiIiICUgREVGUworCisgIGltcGwgKz0gSXRlcihuLCAiIiIsCisgICAgICAgICAgdHlwZW5hbWUgVCVzIiIiKQorCisgIGltcGwgKz0gIiIiPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQlKG4pc0hlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQiIiIgJSBERUZTCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlJXMiIiIpCisKKyAgaW1wbCArPSAiIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkIiIiCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJXMmIHYlcyIiIikKKworICBpbXBsICs9ICIiIikgeworICBpZiAocHJlZCglKHZzKXMpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisiIiIgJSBERUZTCisKKyAgaW1wbCArPSAnICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCInCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUlcyIiIiwgc2VwPScgPDwgIiwgIicpCisKKyAgaW1wbCArPSAnIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiJworCisgIGltcGwgKz0gSXRlcihuLCAiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXFxuIiA8PCBlJXMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2JXMiIiIpCisKKyAgaW1wbCArPSAiIiI7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUJShuKXMuCisvLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRURfRk9STUFUJShuKXNfKHByZWRfZm9ybWF0LCAlKHZzKXMsIG9uX2ZhaWx1cmUpXFwKKyAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCglKHZ0cylzLCAlKHZzKXMpLCBcXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQlKG4pcy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQlKG4pc18ocHJlZCwgJSh2cylzLCBvbl9mYWlsdXJlKVxcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkJShuKXNIZWxwZXIoI3ByZWQiIiIgJSBERUZTCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwgXFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2JXMiIiIpCisKKyAgaW1wbCArPSAiIiIsIFxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkIiIiCisKKyAgaW1wbCArPSBJdGVyKG4sICIiIiwgXFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYlcyIiIikKKworICBpbXBsICs9ICIiIiksIG9uX2ZhaWx1cmUpCisKKy8vICUoQXJpdHkpcyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUJShuKXMocHJlZF9mb3JtYXQsICUodnMpcykgXFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQlKG4pc18ocHJlZF9mb3JtYXQsICUodnMpcywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEJShuKXMocHJlZCwgJSh2cylzKSBcXAorICBHVEVTVF9QUkVEJShuKXNfKHByZWQsICUodnMpcywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVCUobilzKHByZWRfZm9ybWF0LCAlKHZzKXMpIFxcCisgIEdURVNUX1BSRURfRk9STUFUJShuKXNfKHByZWRfZm9ybWF0LCAlKHZzKXMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRCUobilzKHByZWQsICUodnMpcykgXFwKKyAgR1RFU1RfUFJFRCUobilzXyhwcmVkLCAlKHZzKXMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisiIiIgJSBERUZTCisKKyAgcmV0dXJuIGltcGwKKworCitkZWYgSGVhZGVyUG9zdGFtYmxlKCk6CisgICIiIlJldHVybnMgdGhlIHBvc3RhbWJsZSBmb3IgdGhlIGhlYWRlciBmaWxlLiIiIgorCisgIHJldHVybiAiIiIKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworIiIiCisKKworZGVmIEdlbmVyYXRlRmlsZShwYXRoLCBjb250ZW50KToKKyAgIiIiR2l2ZW4gYSBmaWxlIHBhdGggYW5kIGEgY29udGVudCBzdHJpbmcsIG92ZXJ3cml0ZXMgaXQgd2l0aCB0aGUKKyAgZ2l2ZW4gY29udGVudC4iIiIKKworICBwcmludCAnVXBkYXRpbmcgZmlsZSAlcyAuIC4gLicgJSBwYXRoCisKKyAgZiA9IGZpbGUocGF0aCwgJ3crJykKKyAgcHJpbnQgPj5mLCBjb250ZW50LAorICBmLmNsb3NlKCkKKworICBwcmludCAnRmlsZSAlcyBoYXMgYmVlbiB1cGRhdGVkLicgJSBwYXRoCisKKworZGVmIEdlbmVyYXRlSGVhZGVyKG4pOgorICAiIiJHaXZlbiB0aGUgbWF4aW11bSBhcml0eSBuLCB1cGRhdGVzIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGltcGxlbWVudHMKKyAgdGhlIHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgIEdlbmVyYXRlRmlsZShIRUFERVIsCisgICAgICAgICAgICAgICBIZWFkZXJQcmVhbWJsZShuKQorICAgICAgICAgICAgICAgKyAnJy5qb2luKFtJbXBsZW1lbnRhdGlvbkZvckFyaXR5KGkpIGZvciBpIGluIE9uZVRvKG4pXSkKKyAgICAgICAgICAgICAgICsgSGVhZGVyUG9zdGFtYmxlKCkpCisKKworZGVmIFVuaXRUZXN0UHJlYW1ibGUoKToKKyAgIiIiUmV0dXJucyB0aGUgcHJlYW1ibGUgZm9yIHRoZSB1bml0IHRlc3QgZmlsZS4iIiIKKworICAjIEEgbWFwIHRoYXQgZGVmaW5lcyB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIHByZWFtYmxlIHRlbXBsYXRlLgorICBERUZTID0geworICAgICd0b2RheScgOiB0aW1lLnN0cmZ0aW1lKCclbS8lZC8lWScpLAorICAgICd5ZWFyJyA6IHRpbWUuc3RyZnRpbWUoJyVZJyksCisgICAgJ2NvbW1hbmQnIDogJyVzICVzJyAlIChvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSwgc3lzLmFyZ3ZbMV0pLAorICAgIH0KKworICByZXR1cm4gKAorIiIiLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gJSh0b2RheSlzIGJ5IGNvbW1hbmQKKy8vICclKGNvbW1hbmQpcycuICBETyBOT1QgRURJVCBCWSBIQU5EIQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGd0ZXN0X3ByZWRfaW1wbC5oCisvLworLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIHNjcmlwdCBhbmQgcXVpdGUgbG9uZy4gIElmIHlvdSBpbnRlbmQgdG8KKy8vIGxlYXJuIGhvdyBHb29nbGUgVGVzdCB3b3JrcyBieSByZWFkaW5nIGl0cyB1bml0IHRlc3RzLCByZWFkCisvLyBndGVzdF91bml0dGVzdC5jYyBpbnN0ZWFkLgorLy8KKy8vIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoZSBHb29nbGUgVGVzdCBwcmVkaWNhdGUKKy8vIGFzc2VydGlvbnMuICBXZSBjb21waWxlIGl0IGFzIHBhcnQgb2YgdGhlIGd0ZXN0X3VuaXR0ZXN0IHRhcmdldAorLy8gb25seSB0byBrZWVwIHRoZSBpbXBsZW1lbnRhdGlvbiB0aWR5IGFuZCBjb21wYWN0LCBhcyBpdCBpcyBxdWl0ZQorLy8gaW52b2x2ZWQgdG8gc2V0IHVwIHRoZSBzdGFnZSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCB1c2luZyBHb29nbGUKKy8vIFRlc3QgaXRzZWxmLgorLy8KKy8vIEN1cnJlbnRseSwgZ3Rlc3RfdW5pdHRlc3QgdGFrZXMgfjExIHNlY29uZHMgdG8gcnVuIGluIHRoZSB0ZXN0aW5nCisvLyBkYWVtb24uICBJbiB0aGUgZnV0dXJlLCBpZiBpdCBncm93cyB0b28gbGFyZ2UgYW5kIG5lZWRzIG11Y2ggbW9yZQorLy8gdGltZSB0byBmaW5pc2gsIHdlIHNob3VsZCBjb25zaWRlciBzZXBhcmF0aW5nIHRoaXMgZmlsZSBpbnRvIGEKKy8vIHN0YW5kLWFsb25lIHJlZ3Jlc3Npb24gdGVzdC4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworLy8gQSB1c2VyLWRlZmluZWQgZGF0YSB0eXBlLgorc3RydWN0IEJvb2wgeworICBleHBsaWNpdCBCb29sKGludCB2YWwpIDogdmFsdWUodmFsICE9IDApIHt9CisKKyAgYm9vbCBvcGVyYXRvcj4oaW50IG4pIGNvbnN0IHsgcmV0dXJuIHZhbHVlID4gQm9vbChuKS52YWx1ZTsgfQorCisgIEJvb2wgb3BlcmF0b3IrKGNvbnN0IEJvb2wmIHJocykgY29uc3QgeyByZXR1cm4gQm9vbCh2YWx1ZSArIHJocy52YWx1ZSk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQm9vbCYgcmhzKSBjb25zdCB7IHJldHVybiB2YWx1ZSA9PSByaHMudmFsdWU7IH0KKworICBib29sIHZhbHVlOworfTsKKworLy8gRW5hYmxlcyBCb29sIHRvIGJlIHVzZWQgaW4gYXNzZXJ0aW9ucy4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCb29sJiB4KSB7CisgIHJldHVybiBvcyA8PCAoeC52YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworfQorCisiIiIgJSBERUZTKQorCisKK2RlZiBUZXN0c0ZvckFyaXR5KG4pOgorICAiIiJSZXR1cm5zIHRoZSB0ZXN0cyBmb3Igbi1hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuIiIiCisKKyAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRlc3RzLgorICBERUZTID0geworICAgICduJyA6IG4sCisgICAgJ2VzJyA6IEl0ZXIobiwgJ2UlcycsIHNlcD0nLCAnKSwKKyAgICAndnMnIDogSXRlcihuLCAndiVzJywgc2VwPScsICcpLAorICAgICd2dHMnIDogSXRlcihuLCAnI3YlcycsIHNlcD0nLCAnKSwKKyAgICAndHZzJyA6IEl0ZXIobiwgJ1QlcyB2JXMnLCBzZXA9JywgJyksCisgICAgJ2ludF92cycgOiBJdGVyKG4sICdpbnQgdiVzJywgc2VwPScsICcpLAorICAgICdCb29sX3ZzJyA6IEl0ZXIobiwgJ0Jvb2wgdiVzJywgc2VwPScsICcpLAorICAgICd0eXBlcycgOiBJdGVyKG4sICd0eXBlbmFtZSBUJXMnLCBzZXA9JywgJyksCisgICAgJ3Zfc3VtJyA6IEl0ZXIobiwgJ3YlcycsIHNlcD0nICsgJyksCisgICAgJ2FyaXR5JyA6IEFyaXR5KG4pLAorICAgICdBcml0eScgOiBUaXRsZShBcml0eShuKSksCisgICAgfQorCisgIHRlc3RzID0gKAorIiIiLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyAlKGFyaXR5KXMgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIEEgJShhcml0eSlzIHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDwlKHR5cGVzKXM+Citib29sIFByZWRGdW5jdGlvbiUobilzKCUodHZzKXMpIHsKKyAgcmV0dXJuICUodl9zdW0pcyA+IDA7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIHRvIGNpcmN1bXZlbnQgYSBidWcgaW4KKy8vIGdjYyAyLjk1LjMsIHdoaWNoIHNvbWV0aW1lcyBoYXMgcHJvYmxlbSB3aXRoIHRoZSBhYm92ZSB0ZW1wbGF0ZQorLy8gZnVuY3Rpb24uCitib29sIFByZWRGdW5jdGlvbiUobilzSW50KCUoaW50X3ZzKXMpIHsKKyAgcmV0dXJuICUodl9zdW0pcyA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbiUobilzQm9vbCglKEJvb2xfdnMpcykgeworICByZXR1cm4gJSh2X3N1bSlzID4gMDsKK30KKyIiIiAlIERFRlMpCisKKyAgdGVzdHMgKz0gIiIiCisvLyBBICUoYXJpdHkpcyBwcmVkaWNhdGUgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRnVuY3RvciUobilzIHsKKyAgdGVtcGxhdGUgPCUodHlwZXMpcz4KKyAgYm9vbCBvcGVyYXRvcigpKCIiIiAlIERFRlMKKworICB0ZXN0cyArPSBJdGVyKG4sICdjb25zdCBUJXMmIHYlcycsIHNlcD0iIiIsCisgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgdGVzdHMgKz0gIiIiKSB7CisgICAgcmV0dXJuICUodl9zdW0pcyA+IDA7CisgIH0KK307CisiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gIiIiCisvLyBBICUoYXJpdHkpcyBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPCUodHlwZXMpcz4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb24lKG4pcygiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAnY29uc3QgY2hhciogZSVzJywgc2VwPSIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIikKKworICB0ZXN0cyArPSBJdGVyKG4sICIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQlcyYgdiVzIiIiKQorCisgIHRlc3RzICs9ICIiIikgeworICBpZiAoUHJlZEZ1bmN0aW9uJShuKXMoJSh2cylzKSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICIiIiAlIERFRlMKKworICB0ZXN0cyArPSBJdGVyKG4sICdlJXMnLCBzZXA9JyA8PCAiICsgIiA8PCAnKQorCisgIHRlc3RzICs9ICIiIgorICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCAlKHZfc3VtKXMgPDwgIi4iOworfQorIiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorLy8gQSAlKGFyaXR5KXMgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdG9yLgorc3RydWN0IFByZWRGb3JtYXRGdW5jdG9yJShuKXMgeworICB0ZW1wbGF0ZSA8JSh0eXBlcylzPgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKSgiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAnY29uc3QgY2hhciogZSVzJywgc2VwPSIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCisgIHRlc3RzICs9IEl0ZXIobiwgIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJXMmIHYlcyIiIikKKworICB0ZXN0cyArPSAiIiIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uJShuKXMoJShlcylzLCAlKHZzKXMpOworICB9Cit9OworIiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVCUobilzLgorCitjbGFzcyBQcmVkaWNhdGUlKG4pc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7IiIiICUgREVGUworCisgIHRlc3RzICs9ICIiIgorICAgICIiIiArIEl0ZXIobiwgJ24lc18gPSAnKSArICIiIjA7CisgIH0KKyIiIgorCisgIHRlc3RzICs9ICIiIgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAorICAgIC8vIGV4YWN0bHkgb25jZS4iIiIKKworICB0ZXN0cyArPSAnJy5qb2luKFsiIiIKKyAgICBFWFBFQ1RfRVEoMSwgbiVzXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAlcyAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsiIiIgJSAoaSwgaSArIDEpIGZvciBpIGluIE9uZVRvKG4pXSkKKworICB0ZXN0cyArPSAiIiIKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworIiIiICUgREVGUworCisgIHRlc3RzICs9IEl0ZXIobiwgIiIiCisgIHN0YXRpYyBpbnQgbiVzXzsiIiIpCisKKyAgdGVzdHMgKz0gIiIiCit9OworCitib29sIFByZWRpY2F0ZSUobilzVGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlJShuKXNUZXN0OjpmaW5pc2hlZF87CisiIiIgJSBERUZTCisKKyAgdGVzdHMgKz0gSXRlcihuLCAiIiJpbnQgUHJlZGljYXRlJSUobilzVGVzdDo6biVzXzsKKyIiIikgJSBERUZTCisKKyAgdGVzdHMgKz0gIiIiCit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQlKG4pc1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQlKG4pc1Rlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZSUobilzVGVzdCBFWFBFQ1RfUFJFRCUobilzVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlJShuKXNUZXN0IEFTU0VSVF9QUkVEJShuKXNUZXN0OworIiIiICUgREVGUworCisgIGRlZiBHZW5UZXN0KHVzZV9mb3JtYXQsIHVzZV9hc3NlcnQsIGV4cGVjdF9mYWlsdXJlLAorICAgICAgICAgICAgICB1c2VfZnVuY3RvciwgdXNlX3VzZXJfdHlwZSk6CisgICAgIiIiUmV0dXJucyB0aGUgdGVzdCBmb3IgYSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3JvLgorCisgICAgQXJnczoKKyAgICAgIHVzZV9mb3JtYXQ6ICAgICB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEgKl9QUkVEX0ZPUk1BVCouCisgICAgICB1c2VfYXNzZXJ0OiAgICAgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhIEFTU0VSVF8qLgorICAgICAgZXhwZWN0X2ZhaWx1cmU6IHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgZXhwZWN0ZWQgdG8gZmFpbC4KKyAgICAgIHVzZV9mdW5jdG9yOiAgICB0cnVlIGlmZiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGFzc2VydGlvbiBpcworICAgICAgICAgICAgICAgICAgICAgIGEgZnVuY3RvciAoYXMgb3Bwb3NlZCB0byBhIGZ1bmN0aW9uKQorICAgICAgdXNlX3VzZXJfdHlwZTogIHRydWUgaWZmIHRoZSBwcmVkaWNhdGUgZnVuY3Rvci9mdW5jdGlvbiB0YWtlcworICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50KHMpIG9mIGEgdXNlci1kZWZpbmVkIHR5cGUuCisKKyAgICBFeGFtcGxlOgorCisgICAgICBHZW5UZXN0KDEsIDAsIDAsIDEsIDApIHJldHVybnMgYSB0ZXN0IHRoYXQgdGVzdHMgdGhlIGJlaGF2aW9yCisgICAgICBvZiBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUbigpIHRoYXQgdGFrZXMgYSBmdW5jdG9yCisgICAgICB3aG9zZSBhcmd1bWVudHMgaGF2ZSBidWlsdC1pbiB0eXBlcy4iIiIKKworICAgIGlmIHVzZV9hc3NlcnQ6CisgICAgICBhc3NydCA9ICdBU1NFUlQnICAjICdhc3NlcnQnIGlzIHJlc2VydmVkLCBzbyB3ZSBjYW5ub3QgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoYXQgaWRlbnRpZmllciBoZXJlLgorICAgIGVsc2U6CisgICAgICBhc3NydCA9ICdFWFBFQ1QnCisKKyAgICBhc3NlcnRpb24gPSBhc3NydCArICdfUFJFRCcKKworICAgIGlmIHVzZV9mb3JtYXQ6CisgICAgICBwcmVkX2Zvcm1hdCA9ICdQcmVkRm9ybWF0JworICAgICAgYXNzZXJ0aW9uICs9ICdfRk9STUFUJworICAgIGVsc2U6CisgICAgICBwcmVkX2Zvcm1hdCA9ICdQcmVkJworCisgICAgYXNzZXJ0aW9uICs9ICclKG4pcycgJSBERUZTCisKKyAgICBpZiB1c2VfZnVuY3RvcjoKKyAgICAgIHByZWRfZm9ybWF0X3R5cGUgPSAnZnVuY3RvcicKKyAgICAgIHByZWRfZm9ybWF0ICs9ICdGdW5jdG9yJShuKXMoKScKKyAgICBlbHNlOgorICAgICAgcHJlZF9mb3JtYXRfdHlwZSA9ICdmdW5jdGlvbicKKyAgICAgIHByZWRfZm9ybWF0ICs9ICdGdW5jdGlvbiUobilzJworICAgICAgaWYgbm90IHVzZV9mb3JtYXQ6CisgICAgICAgIGlmIHVzZV91c2VyX3R5cGU6CisgICAgICAgICAgcHJlZF9mb3JtYXQgKz0gJ0Jvb2wnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcHJlZF9mb3JtYXQgKz0gJ0ludCcKKworICAgIHRlc3RfbmFtZSA9IHByZWRfZm9ybWF0X3R5cGUudGl0bGUoKQorCisgICAgaWYgdXNlX3VzZXJfdHlwZToKKyAgICAgIGFyZ190eXBlID0gJ3VzZXItZGVmaW5lZCB0eXBlIChCb29sKScKKyAgICAgIHRlc3RfbmFtZSArPSAnT25Vc2VyVHlwZScKKyAgICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgICBhcmcgPSAnQm9vbChuJXNfKyspJworICAgICAgZWxzZToKKyAgICAgICAgYXJnID0gJ0Jvb2woKytuJXNfKScKKyAgICBlbHNlOgorICAgICAgYXJnX3R5cGUgPSAnYnVpbHQtaW4gdHlwZSAoaW50KScKKyAgICAgIHRlc3RfbmFtZSArPSAnT25CdWlsdEluVHlwZScKKyAgICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgICBhcmcgPSAnbiVzXysrJworICAgICAgZWxzZToKKyAgICAgICAgYXJnID0gJysrbiVzXycKKworICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgc3VjY2Vzc2Z1bF9vcl9mYWlsZWQgPSAnZmFpbGVkJworICAgICAgZXhwZWN0ZWRfb3Jfbm90ID0gJ2V4cGVjdGVkLicKKyAgICAgIHRlc3RfbmFtZSArPSAgJ0ZhaWx1cmUnCisgICAgZWxzZToKKyAgICAgIHN1Y2Nlc3NmdWxfb3JfZmFpbGVkID0gJ3N1Y2Nlc3NmdWwnCisgICAgICBleHBlY3RlZF9vcl9ub3QgPSAnVU5FWFBFQ1RFRCEnCisgICAgICB0ZXN0X25hbWUgKz0gICdTdWNjZXNzJworCisgICAgIyBBIG1hcCB0aGF0IGRlZmluZXMgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSB0ZXN0IHRlbXBsYXRlLgorICAgIGRlZnMgPSBERUZTLmNvcHkoKQorICAgIGRlZnMudXBkYXRlKHsKKyAgICAgICdhc3NlcnQnIDogYXNzcnQsCisgICAgICAnYXNzZXJ0aW9uJyA6IGFzc2VydGlvbiwKKyAgICAgICd0ZXN0X25hbWUnIDogdGVzdF9uYW1lLAorICAgICAgJ3BmX3R5cGUnIDogcHJlZF9mb3JtYXRfdHlwZSwKKyAgICAgICdwZicgOiBwcmVkX2Zvcm1hdCwKKyAgICAgICdhcmdfdHlwZScgOiBhcmdfdHlwZSwKKyAgICAgICdhcmcnIDogYXJnLAorICAgICAgJ3N1Y2Nlc3NmdWwnIDogc3VjY2Vzc2Z1bF9vcl9mYWlsZWQsCisgICAgICAnZXhwZWN0ZWQnIDogZXhwZWN0ZWRfb3Jfbm90LAorICAgICAgfSkKKworICAgIHRlc3QgPSAiIiIKKy8vIFRlc3RzIGEgJShzdWNjZXNzZnVsKXMgJShhc3NlcnRpb24pcyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSAlKHBmX3R5cGUpcyBvbiBhICUoYXJnX3R5cGUpcy4KK1RFU1RfRiglKGFzc2VydGlvbilzVGVzdCwgJSh0ZXN0X25hbWUpcykgeyIiIiAlIGRlZnMKKworICAgIGluZGVudCA9IChsZW4oYXNzZXJ0aW9uKSArIDMpKicgJworICAgIGV4dHJhX2luZGVudCA9ICcnCisKKyAgICBpZiBleHBlY3RfZmFpbHVyZToKKyAgICAgIGV4dHJhX2luZGVudCA9ICcgICcKKyAgICAgIGlmIHVzZV9hc3NlcnQ6CisgICAgICAgIHRlc3QgKz0gIiIiCisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UIiIiCisgICAgICBlbHNlOgorICAgICAgICB0ZXN0ICs9ICIiIgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQiIiIKKworICAgIHRlc3QgKz0gJ1xuJyArIGV4dHJhX2luZGVudCArICIiIiAgJShhc3NlcnRpb24pcyglKHBmKXMiIiIgJSBkZWZzCisKKyAgICB0ZXN0ID0gdGVzdCAlIGRlZnMKKyAgICB0ZXN0ICs9IEl0ZXIobiwgJyxcbicgKyBpbmRlbnQgKyBleHRyYV9pbmRlbnQgKyAnJShhcmcpcycgJSBkZWZzKQorICAgIHRlc3QgKz0gJyk7XG4nICsgZXh0cmFfaW5kZW50ICsgJyAgZmluaXNoZWRfID0gdHJ1ZTtcbicKKworICAgIGlmIGV4cGVjdF9mYWlsdXJlOgorICAgICAgdGVzdCArPSAnICB9LCAiIik7XG4nCisKKyAgICB0ZXN0ICs9ICd9XG4nCisgICAgcmV0dXJuIHRlc3QKKworICAjIEdlbmVyYXRlcyB0ZXN0cyBmb3IgYWxsIDIqKjYgPSA2NCBjb21iaW5hdGlvbnMuCisgIHRlc3RzICs9ICcnLmpvaW4oW0dlblRlc3QodXNlX2Zvcm1hdCwgdXNlX2Fzc2VydCwgZXhwZWN0X2ZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2Z1bmN0b3IsIHVzZV91c2VyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIGZvciB1c2VfZm9ybWF0IGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBmb3IgdXNlX2Fzc2VydCBpbiBbMCwgMV0KKyAgICAgICAgICAgICAgICAgICAgZm9yIGV4cGVjdF9mYWlsdXJlIGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBmb3IgdXNlX2Z1bmN0b3IgaW4gWzAsIDFdCisgICAgICAgICAgICAgICAgICAgIGZvciB1c2VfdXNlcl90eXBlIGluIFswLCAxXQorICAgICAgICAgICAgICAgICAgICBdKQorCisgIHJldHVybiB0ZXN0cworCisKK2RlZiBVbml0VGVzdFBvc3RhbWJsZSgpOgorICAiIiJSZXR1cm5zIHRoZSBwb3N0YW1ibGUgZm9yIHRoZSB0ZXN0cy4iIiIKKworICByZXR1cm4gJycKKworCitkZWYgR2VuZXJhdGVVbml0VGVzdChuKToKKyAgIiIiUmV0dXJucyB0aGUgdGVzdHMgZm9yIHVwLXRvIG4tYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLiIiIgorCisgIEdlbmVyYXRlRmlsZShVTklUX1RFU1QsCisgICAgICAgICAgICAgICBVbml0VGVzdFByZWFtYmxlKCkKKyAgICAgICAgICAgICAgICsgJycuam9pbihbVGVzdHNGb3JBcml0eShpKSBmb3IgaSBpbiBPbmVUbyhuKV0pCisgICAgICAgICAgICAgICArIFVuaXRUZXN0UG9zdGFtYmxlKCkpCisKKworZGVmIF9NYWluKCk6CisgICIiIlRoZSBlbnRyeSBwb2ludCBvZiB0aGUgc2NyaXB0LiAgR2VuZXJhdGVzIHRoZSBoZWFkZXIgZmlsZSBhbmQgaXRzCisgIHVuaXQgdGVzdC4iIiIKKworICBpZiBsZW4oc3lzLmFyZ3YpICE9IDI6CisgICAgcHJpbnQgX19kb2NfXworICAgIHByaW50ICdBdXRob3I6ICcgKyBfX2F1dGhvcl9fCisgICAgc3lzLmV4aXQoMSkKKworICBuID0gaW50KHN5cy5hcmd2WzFdKQorICBHZW5lcmF0ZUhlYWRlcihuKQorICBHZW5lcmF0ZVVuaXRUZXN0KG4pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgX01haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NjcmlwdHMvZ3Rlc3QtY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4MGY4NDMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy9ndGVzdC1jb25maWcuaW4KQEAgLTAsMCArMSwyNzQgQEAKKyMhL2Jpbi9zaAorCisjIFRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBmaWxsZWQgaW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCituYW1lPSJAUEFDS0FHRV9UQVJOQU1FQCIKK3ZlcnNpb249IkBQQUNLQUdFX1ZFUlNJT05AIgorCitzaG93X3VzYWdlKCkKK3sKKyAgZWNobyAiVXNhZ2U6IGd0ZXN0LWNvbmZpZyBbT1BUSU9OUy4uLl0iCit9CisKK3Nob3dfaGVscCgpCit7CisgIHNob3dfdXNhZ2UKKyAgY2F0IDw8XEVPRgorCitUaGUgYGd0ZXN0LWNvbmZpZycgc2NyaXB0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbmVjZXNzYXJ5IGNvbXBpbGUgYW5kIGxpbmtpbmcKK2ZsYWdzIHRvIGNvbm5lY3Qgd2l0aCBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLCBib3RoIGluIGEgYnVpbGQgcHJpb3IgdG8KK2luc3RhbGxhdGlvbiwgYW5kIG9uIHRoZSBzeXN0ZW0gcHJvcGVyIGFmdGVyIGluc3RhbGxhdGlvbi4gVGhlIGluc3RhbGxhdGlvbgorb3ZlcnJpZGVzIG1heSBiZSBpc3N1ZWQgaW4gY29tYmluYXRpb24gd2l0aCBhbnkgb3RoZXIgcXVlcmllcywgYnV0IHdpbGwgb25seQorYWZmZWN0IGluc3RhbGxhdGlvbiBxdWVyaWVzIGlmIGNhbGxlZCBvbiBhIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkIGd0ZXN0LiBUaGUKK2luc3RhbGxhdGlvbiBxdWVyaWVzIG1heSBub3QgYmUgaXNzdWVkIHdpdGggYW55IG90aGVyIHR5cGVzIG9mIHF1ZXJpZXMsIGFuZAorb25seSBvbmUgaW5zdGFsbGF0aW9uIHF1ZXJ5IG1heSBiZSBtYWRlIGF0IGEgdGltZS4gVGhlIHZlcnNpb24gcXVlcmllcyBhbmQKK2NvbXBpbGVyIGZsYWcgcXVlcmllcyBtYXkgYmUgY29tYmluZWQgYXMgZGVzaXJlZCBidXQgbm90IG1peGVkLiBEaWZmZXJlbnQKK3ZlcnNpb24gcXVlcmllcyBhcmUgYWx3YXlzIGNvbWJpbmVkIHdpdGggbG9naWNhbCAiYW5kIiBzZW1hbnRpY3MsIGFuZCBvbmx5IHRoZQorbGFzdCBvZiBhbnkgcGFydGljdWxhciBxdWVyeSBpcyB1c2VkIHdoaWxlIGFsbCBwcmV2aW91cyBvbmVzIGlnbm9yZWQuIEFsbAordmVyc2lvbnMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1iZXJzIHNlcGFyYXRlZCBieSBwZXJpb2RzLgorQ29tcGlsZXIgZmxhZyBxdWVyaWVzIG91dHB1dCB0aGUgdW5pb24gb2YgdGhlIHNldHMgb2YgZmxhZ3Mgd2hlbiBjb21iaW5lZC4KKworIEV4YW1wbGVzOgorICBndGVzdC1jb25maWcgLS1taW4tdmVyc2lvbj0xLjAgfHwgZWNobyAiSW5zdWZmaWNpZW50IEdvb2dsZSBUZXN0IHZlcnNpb24uIgorCisgIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWNwcGZsYWdzIC0tY3h4ZmxhZ3MpIC1vIGZvby5vIC1jIGZvby5jcHAKKyAgZysrICQoZ3Rlc3QtY29uZmlnIC0tbGRmbGFncyAtLWxpYnMpIC1vIGZvbyBmb28ubworCisgICMgV2hlbiB1c2luZyBhIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkIEdvb2dsZSBUZXN0OgorICBnKysgJCguLi8uLi9teV9ndGVzdF9idWlsZC9zY3JpcHRzL2d0ZXN0LWNvbmZpZyAuLi4pIC4uLgorCisgICMgV2hlbiB1c2luZyBhbiBpbnN0YWxsZWQgR29vZ2xlIFRlc3QsIGJ1dCB3aXRoIGluc3RhbGxhdGlvbiBvdmVycmlkZXM6CisgIGV4cG9ydCBHVEVTVF9QUkVGSVg9Ii9vcHQiCisgIGcrKyAkKGd0ZXN0LWNvbmZpZyAtLWxpYmRpcj0iL29wdC9saWI2NCIgLi4uKSAuLi4KKworIEhlbHA6CisgIC0tdXNhZ2UgICAgICAgICAgICAgICAgICAgIGJyaWVmIHVzYWdlIGluZm9ybWF0aW9uCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UKKworIEluc3RhbGxhdGlvbiBPdmVycmlkZXM6CisgIC0tcHJlZml4PTxkaXI+ICAgICAgICAgICAgIG92ZXJyaWRlcyB0aGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWV4ZWMtcHJlZml4PTxkaXI+ICAgICAgICBvdmVycmlkZXMgdGhlIGV4ZWN1dGFibGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWxpYmRpcj08ZGlyPiAgICAgICAgICAgICBvdmVycmlkZXMgdGhlIGxpYnJhcnkgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWluY2x1ZGVkaXI9PGRpcj4gICAgICAgICBvdmVycmlkZXMgdGhlIGhlYWRlciBmaWxlIGluc3RhbGxhdGlvbiBwcmVmaXgKKworIEluc3RhbGxhdGlvbiBRdWVyaWVzOgorICAtLXByZWZpeCAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24gcHJlZml4CisgIC0tZXhlYy1wcmVmaXggICAgICAgICAgICAgIGV4ZWN1dGFibGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICAtLWxpYmRpciAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKKyAgLS1pbmNsdWRlZGlyICAgICAgICAgICAgICAgaGVhZGVyIGZpbGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQorICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgR29vZ2xlIFRlc3QgaW5zdGFsbGF0aW9uCisKKyBWZXJzaW9uIFF1ZXJpZXM6CisgIC0tbWluLXZlcnNpb249VkVSU0lPTiAgICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGF0IGxlYXN0IFZFUlNJT04KKyAgLS1leGFjdC12ZXJzaW9uPVZFUlNJT04gICAgcmV0dXJuIDAgaWYgdGhlIHZlcnNpb24gaXMgZXhhY3RseSBWRVJTSU9OCisgIC0tbWF4LXZlcnNpb249VkVSU0lPTiAgICAgIHJldHVybiAwIGlmIHRoZSB2ZXJzaW9uIGlzIGF0IG1vc3QgVkVSU0lPTgorCisgQ29tcGlsYXRpb24gRmxhZyBRdWVyaWVzOgorICAtLWNwcGZsYWdzICAgICAgICAgICAgICAgICBjb21waWxlIGZsYWdzIHNwZWNpZmljIHRvIHRoZSBDLWxpa2UgcHJlcHJvY2Vzc29ycworICAtLWN4eGZsYWdzICAgICAgICAgICAgICAgICBjb21waWxlIGZsYWdzIGFwcHJvcHJpYXRlIGZvciBDKysgcHJvZ3JhbXMKKyAgLS1sZGZsYWdzICAgICAgICAgICAgICAgICAgbGlua2VyIGZsYWdzCisgIC0tbGlicyAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyBmb3IgbGlua2luZworCitFT0YKK30KKworIyBUaGlzIGZ1bmN0aW9uIGJvdW5kcyBvdXIgdmVyc2lvbiB3aXRoIGEgbWluIGFuZCBhIG1heC4gSXQgdXNlcyBzb21lIGNsZXZlcgorIyBQT1NJWC1jb21wbGlhbnQgdmFyaWFibGUgZXhwYW5zaW9uIHRvIHBvcnRhYmx5IGRvIGFsbCB0aGUgd29yayBpbiB0aGUgc2hlbGwKKyMgYW5kIGF2b2lkIGFueSBkZXBlbmRlbmN5IG9uIGEgcGFydGljdWxhciAic2VkIiBvciAiYXdrIiBpbXBsZW1lbnRhdGlvbi4KKyMgTm90YWJsZSBpcyB0aGF0IGl0IHdpbGwgb25seSBldmVyIGNvbXBhcmUgdGhlIGZpcnN0IDMgY29tcG9uZW50cyBvZiB2ZXJzaW9ucy4KKyMgRnVydGhlciBjb21wb25lbnRzIHdpbGwgYmUgY2xlYW5seSBzdHJpcHBlZCBvZmYuIEFsbCB2ZXJzaW9ucyBtdXN0IGJlCisjIHVuYWRvcm5lZCwgc28gInYxLjAiIHdpbGwgKm5vdCogd29yay4gVGhlIG1pbmltdW0gdmVyc2lvbiBtdXN0IGJlIGluICQxLCBhbmQKKyMgdGhlIG1heCBpbiAkMi4gVE9ETyhjaGFuZGxlcmNAZ29vZ2xlLmNvbSk6IElmIHRoaXMgZXZlciBicmVha3MsIHdlIHNob3VsZAorIyBpbnZlc3RpZ2F0ZSBleHBhbmRpbmcgdGhpcyB2aWEgYXV0b200dGUgZnJvbSBBU19WRVJTSU9OX0NPTVBBUkUgcmF0aGVyIHRoYW4KKyMgY29udGludWluZyB0byBtYWludGFpbiBvdXIgb3duIHNoZWxsIHZlcnNpb24uCitjaGVja192ZXJzaW9ucygpCit7CisgIG1ham9yX3ZlcnNpb249JHt2ZXJzaW9uJSUuKn0KKyAgbWlub3JfdmVyc2lvbj0iMCIKKyAgcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHt2ZXJzaW9uIyoufSIgIT0gIiR7dmVyc2lvbn0iOyB0aGVuCisgICAgbWlub3JfdmVyc2lvbj0ke3ZlcnNpb24jKi59CisgICAgbWlub3JfdmVyc2lvbj0ke21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke3ZlcnNpb24jKi4qLn0iICE9ICIke3ZlcnNpb259IjsgdGhlbgorICAgIHBvaW50X3ZlcnNpb249JHt2ZXJzaW9uIyouKi59CisgICAgcG9pbnRfdmVyc2lvbj0ke3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIG1pbl92ZXJzaW9uPSIkMSIKKyAgbWluX21ham9yX3ZlcnNpb249JHttaW5fdmVyc2lvbiUlLip9CisgIG1pbl9taW5vcl92ZXJzaW9uPSIwIgorICBtaW5fcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHttaW5fdmVyc2lvbiMqLn0iICE9ICIke21pbl92ZXJzaW9ufSI7IHRoZW4KKyAgICBtaW5fbWlub3JfdmVyc2lvbj0ke21pbl92ZXJzaW9uIyoufQorICAgIG1pbl9taW5vcl92ZXJzaW9uPSR7bWluX21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke21pbl92ZXJzaW9uIyouKi59IiAhPSAiJHttaW5fdmVyc2lvbn0iOyB0aGVuCisgICAgbWluX3BvaW50X3ZlcnNpb249JHttaW5fdmVyc2lvbiMqLioufQorICAgIG1pbl9wb2ludF92ZXJzaW9uPSR7bWluX3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIG1heF92ZXJzaW9uPSIkMiIKKyAgbWF4X21ham9yX3ZlcnNpb249JHttYXhfdmVyc2lvbiUlLip9CisgIG1heF9taW5vcl92ZXJzaW9uPSIwIgorICBtYXhfcG9pbnRfdmVyc2lvbj0iMCIKKyAgaWYgdGVzdCAiJHttYXhfdmVyc2lvbiMqLn0iICE9ICIke21heF92ZXJzaW9ufSI7IHRoZW4KKyAgICBtYXhfbWlub3JfdmVyc2lvbj0ke21heF92ZXJzaW9uIyoufQorICAgIG1heF9taW5vcl92ZXJzaW9uPSR7bWF4X21pbm9yX3ZlcnNpb24lJS4qfQorICBmaQorICBpZiB0ZXN0ICIke21heF92ZXJzaW9uIyouKi59IiAhPSAiJHttYXhfdmVyc2lvbn0iOyB0aGVuCisgICAgbWF4X3BvaW50X3ZlcnNpb249JHttYXhfdmVyc2lvbiMqLioufQorICAgIG1heF9wb2ludF92ZXJzaW9uPSR7bWF4X3BvaW50X3ZlcnNpb24lJS4qfQorICBmaQorCisgIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9tYWpvcl92ZXJzaW9uKSkgJiYgZXhpdCAxCisgIGlmIHRlc3QgJCgoJG1ham9yX3ZlcnNpb24pKSAtZXEgJCgoJG1pbl9tYWpvcl92ZXJzaW9uKSk7IHRoZW4KKyAgICB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWx0ICQoKCRtaW5fbWlub3JfdmVyc2lvbikpICYmIGV4aXQgMQorICAgIGlmIHRlc3QgJCgoJG1pbm9yX3ZlcnNpb24pKSAtZXEgJCgoJG1pbl9taW5vcl92ZXJzaW9uKSk7IHRoZW4KKyAgICAgIHRlc3QgJCgoJHBvaW50X3ZlcnNpb24pKSAtbHQgJCgoJG1pbl9wb2ludF92ZXJzaW9uKSkgJiYgZXhpdCAxCisgICAgZmkKKyAgZmkKKworICB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfbWFqb3JfdmVyc2lvbikpICYmIGV4aXQgMQorICBpZiB0ZXN0ICQoKCRtYWpvcl92ZXJzaW9uKSkgLWVxICQoKCRtYXhfbWFqb3JfdmVyc2lvbikpOyB0aGVuCisgICAgdGVzdCAkKCgkbWlub3JfdmVyc2lvbikpIC1ndCAkKCgkbWF4X21pbm9yX3ZlcnNpb24pKSAmJiBleGl0IDEKKyAgICBpZiB0ZXN0ICQoKCRtaW5vcl92ZXJzaW9uKSkgLWVxICQoKCRtYXhfbWlub3JfdmVyc2lvbikpOyB0aGVuCisgICAgICB0ZXN0ICQoKCRwb2ludF92ZXJzaW9uKSkgLWd0ICQoKCRtYXhfcG9pbnRfdmVyc2lvbikpICYmIGV4aXQgMQorICAgIGZpCisgIGZpCisKKyAgZXhpdCAwCit9CisKKyMgU2hvdyB0aGUgdXNhZ2UgbGluZSB3aGVuIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLgoraWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBzaG93X3VzYWdlCisgIGV4aXQgMQorZmkKKword2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdXNhZ2UpICAgICAgICAgIHNob3dfdXNhZ2U7ICAgICAgICAgZXhpdCAwOzsKKyAgICAtLWhlbHApICAgICAgICAgICBzaG93X2hlbHA7ICAgICAgICAgIGV4aXQgMDs7CisKKyAgICAjIEluc3RhbGxhdGlvbiBvdmVycmlkZXMKKyAgICAtLXByZWZpeD0qKSAgICAgICBHVEVTVF9QUkVGSVg9JHsxIy0tcHJlZml4PX07OworICAgIC0tZXhlYy1wcmVmaXg9KikgIEdURVNUX0VYRUNfUFJFRklYPSR7MSMtLWV4ZWMtcHJlZml4PX07OworICAgIC0tbGliZGlyPSopICAgICAgIEdURVNUX0xJQkRJUj0kezEjLS1saWJkaXI9fTs7CisgICAgLS1pbmNsdWRlZGlyPSopICAgR1RFU1RfSU5DTFVERURJUj0kezEjLS1pbmNsdWRlZGlyPX07OworCisgICAgIyBJbnN0YWxsYXRpb24gcXVlcmllcworICAgIC0tcHJlZml4fC0tZXhlYy1wcmVmaXh8LS1saWJkaXJ8LS1pbmNsdWRlZGlyfC0tdmVyc2lvbikKKyAgICAgIGlmIHRlc3QgLW4gIiR7ZG9fcXVlcnl9IjsgdGhlbgorICAgICAgICBzaG93X3VzYWdlCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKyAgICAgIGRvX3F1ZXJ5PSR7MSMtLX0KKyAgICAgIDs7CisKKyAgICAjIFZlcnNpb24gY2hlY2tpbmcKKyAgICAtLW1pbi12ZXJzaW9uPSopCisgICAgICBkb19jaGVja192ZXJzaW9ucz15ZXMKKyAgICAgIG1pbl92ZXJzaW9uPSR7MSMtLW1pbi12ZXJzaW9uPX0KKyAgICAgIDs7CisgICAgLS1tYXgtdmVyc2lvbj0qKQorICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCisgICAgICBtYXhfdmVyc2lvbj0kezEjLS1tYXgtdmVyc2lvbj19CisgICAgICA7OworICAgIC0tZXhhY3QtdmVyc2lvbj0qKQorICAgICAgZG9fY2hlY2tfdmVyc2lvbnM9eWVzCisgICAgICBleGFjdF92ZXJzaW9uPSR7MSMtLWV4YWN0LXZlcnNpb249fQorICAgICAgOzsKKworICAgICMgQ29tcGlsZXIgZmxhZyBvdXRwdXQKKyAgICAtLWNwcGZsYWdzKSAgICAgICBlY2hvX2NwcGZsYWdzPXllczs7CisgICAgLS1jeHhmbGFncykgICAgICAgZWNob19jeHhmbGFncz15ZXM7OworICAgIC0tbGRmbGFncykgICAgICAgIGVjaG9fbGRmbGFncz15ZXM7OworICAgIC0tbGlicykgICAgICAgICAgIGVjaG9fbGlicz15ZXM7OworCisgICAgIyBFdmVyeXRoaW5nIGVsc2UgaXMgYW4gZXJyb3IKKyAgICAqKSAgICAgICAgICAgICAgICBzaG93X3VzYWdlOyAgICAgICAgIGV4aXQgMTs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworIyBUaGVzZSBoYXZlIGRlZmF1bHRzIGZpbGxlZCBpbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBidXQgY2FuIGFsc28gYmUKKyMgb3ZlcnJpZGRlbiBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCitwcmVmaXg9IiR7R1RFU1RfUFJFRklYOi1AcHJlZml4QH0iCitleGVjX3ByZWZpeD0iJHtHVEVTVF9FWEVDX1BSRUZJWDotQGV4ZWNfcHJlZml4QH0iCitsaWJkaXI9IiR7R1RFU1RfTElCRElSOi1AbGliZGlyQH0iCitpbmNsdWRlZGlyPSIke0dURVNUX0lOQ0xVREVESVI6LUBpbmNsdWRlZGlyQH0iCisKKyMgV2UgdHJ5IGFuZCBkZXRlY3QgaWYgb3VyIGJpbmFyeSBpcyBub3QgbG9jYXRlZCBhdCBpdHMgaW5zdGFsbGVkIGxvY2F0aW9uLiBJZgorIyBpdCdzIG5vdCwgd2UgcHJvdmlkZSB2YXJpYWJsZXMgcG9pbnRpbmcgdG8gdGhlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZSByYXRoZXIKKyMgdGhhbiB0byB0aGUgaW5zdGFsbCB0cmVlLiBUaGlzIGFsbG93cyBidWlsZGluZyBhZ2FpbnN0IGEganVzdC1idWlsdCBndGVzdAorIyByYXRoZXIgdGhhbiBhbiBpbnN0YWxsZWQgZ3Rlc3QuCitiaW5kaXI9IkBiaW5kaXJAIgordGhpc19yZWxhdGl2ZV9iaW5kaXI9YGRpcm5hbWUgJDBgCit0aGlzX2JpbmRpcj1gY2QgJHt0aGlzX3JlbGF0aXZlX2JpbmRpcn07IHB3ZCAtUGAKK2lmIHRlc3QgIiR7dGhpc19iaW5kaXJ9IiA9ICIke3RoaXNfYmluZGlyJSR7YmluZGlyfX0iOyB0aGVuCisgICMgVGhlIHBhdGggdG8gdGhlIHNjcmlwdCBkb2Vzbid0IGVuZCBpbiB0aGUgYmluZGlyIHNlcXVlbmNlIGZyb20gQXV0b2NvbmYsCisgICMgYXNzdW1lIHRoYXQgd2UgYXJlIGluIGEgYnVpbGQgdHJlZS4KKyAgYnVpbGRfZGlyPWBkaXJuYW1lICR7dGhpc19iaW5kaXJ9YAorICBzcmNfZGlyPWBjZCAke3RoaXNfYmluZGlyfTsgY2QgQHRvcF9zcmNkaXJAOyBwd2QgLVBgCisKKyAgIyBUT0RPKGNoYW5kbGVyY0Bnb29nbGUuY29tKTogVGhpcyBpcyBhIGRhbmdlcm91cyBkZXBlbmRlbmN5IG9uIGxpYnRvb2wsIHdlCisgICMgc2hvdWxkIHdvcmsgdG8gcmVtb3ZlIGl0LCBhbmQvb3IgcmVtb3ZlIGxpYnRvb2wgYWx0b2dldGhlciwgcmVwbGFjaW5nIGl0CisgICMgd2l0aCBkaXJlY3QgcmVmZXJlbmNlcyB0byB0aGUgbGlicmFyeSBhbmQgYSBsaW5rIHBhdGguCisgIGd0ZXN0X2xpYnM9IiR7YnVpbGRfZGlyfS9saWIvbGliZ3Rlc3QubGEgQFBUSFJFQURfQ0ZMQUdTQCBAUFRIUkVBRF9MSUJTQCIKKyAgZ3Rlc3RfbGRmbGFncz0iIgorCisgICMgV2UgcHJvdmlkZSBob29rcyB0byBpbmNsdWRlIGZyb20gZWl0aGVyIHRoZSBzb3VyY2Ugb3IgYnVpbGQgZGlyLCB3aGVyZSB0aGUKKyAgIyBidWlsZCBkaXIgaXMgYWx3YXlzIHByZWZlcnJlZC4gVGhpcyB3aWxsIHBvdGVudGlhbGx5IGFsbG93IHVzIHRvIHdyaXRlCisgICMgYnVpbGQgcnVsZXMgZm9yIGdlbmVyYXRlZCBoZWFkZXJzIGFuZCBoYXZlIHRoZW0gYXV0b21hdGljYWxseSBiZSBwcmVmZXJyZWQKKyAgIyBvdmVyIHByb3ZpZGVkIHZlcnNpb25zLgorICBndGVzdF9jcHBmbGFncz0iLUkke2J1aWxkX2Rpcn0vaW5jbHVkZSAtSSR7c3JjX2Rpcn0vaW5jbHVkZSIKKyAgZ3Rlc3RfY3h4ZmxhZ3M9IkBQVEhSRUFEX0NGTEFHU0AiCitlbHNlCisgICMgV2UncmUgdXNpbmcgYW4gaW5zdGFsbGVkIGd0ZXN0LCBhbHRob3VnaCBpdCBtYXkgYmUgc3RhZ2VkIHVuZGVyIHNvbWUKKyAgIyBwcmVmaXguIEFzc3VtZSAoYXMgb3VyIG93biBsaWJyYXJpZXMgZG8pIHRoYXQgd2UgY2FuIHJlc29sdmUgdGhlIHByZWZpeCwKKyAgIyBhbmQgYXJlIHByZXNlbnQgaW4gdGhlIGR5bmFtaWMgbGluayBwYXRocy4KKyAgZ3Rlc3RfbGRmbGFncz0iLUwke2xpYmRpcn0iCisgIGd0ZXN0X2xpYnM9Ii1sJHtuYW1lfSBAUFRIUkVBRF9DRkxBR1NAIEBQVEhSRUFEX0xJQlNAIgorICBndGVzdF9jcHBmbGFncz0iLUkke2luY2x1ZGVkaXJ9IgorICBndGVzdF9jeHhmbGFncz0iQFBUSFJFQURfQ0ZMQUdTQCIKK2ZpCisKKyMgRG8gYW4gaW5zdGFsbGF0aW9uIHF1ZXJ5IGlmIHJlcXVlc3RlZC4KK2lmIHRlc3QgLW4gIiRkb19xdWVyeSI7IHRoZW4KKyAgY2FzZSAkZG9fcXVlcnkgaW4KKyAgICBwcmVmaXgpICAgICAgICAgICBlY2hvICRwcmVmaXg7ICAgICAgIGV4aXQgMDs7CisgICAgZXhlYy1wcmVmaXgpICAgICAgZWNobyAkZXhlY19wcmVmaXg7ICBleGl0IDA7OworICAgIGxpYmRpcikgICAgICAgICAgIGVjaG8gJGxpYmRpcjsgICAgICAgZXhpdCAwOzsKKyAgICBpbmNsdWRlZGlyKSAgICAgICBlY2hvICRpbmNsdWRlZGlyOyAgIGV4aXQgMDs7CisgICAgdmVyc2lvbikgICAgICAgICAgZWNobyAkdmVyc2lvbjsgICAgICBleGl0IDA7OworICAgICopICAgICAgICAgICAgICAgIHNob3dfdXNhZ2U7ICAgICAgICAgZXhpdCAxOzsKKyAgZXNhYworZmkKKworIyBEbyBhIHZlcnNpb24gY2hlY2sgaWYgcmVxdWVzdGVkLgoraWYgdGVzdCAiJGRvX2NoZWNrX3ZlcnNpb25zIiA9ICJ5ZXMiOyB0aGVuCisgICMgTWFrZSBzdXJlIHdlIGRpZG4ndCByZWNlaXZlIGEgYmFkIGNvbWJpbmF0aW9uIG9mIHBhcmFtZXRlcnMuCisgIHRlc3QgIiRlY2hvX2NwcGZsYWdzIiA9ICJ5ZXMiICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCisgIHRlc3QgIiRlY2hvX2N4eGZsYWdzIiA9ICJ5ZXMiICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCisgIHRlc3QgIiRlY2hvX2xkZmxhZ3MiID0gInllcyIgICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCisgIHRlc3QgIiRlY2hvX2xpYnMiID0gInllcyIgICAgICYmIHNob3dfdXNhZ2UgJiYgZXhpdCAxCisKKyAgaWYgdGVzdCAiJGV4YWN0X3ZlcnNpb24iICE9ICIiOyB0aGVuCisgICAgY2hlY2tfdmVyc2lvbnMgJGV4YWN0X3ZlcnNpb24gJGV4YWN0X3ZlcnNpb24KKyAgICAjIHVucmVhY2hhYmxlCisgIGVsc2UKKyAgICBjaGVja192ZXJzaW9ucyAke21pbl92ZXJzaW9uOi0wLjAuMH0gJHttYXhfdmVyc2lvbjotOTk5OS45OTk5Ljk5OTl9CisgICAgIyB1bnJlYWNoYWJsZQorICBmaQorZmkKKworIyBEbyB0aGUgb3V0cHV0IGluIHRoZSBjb3JyZWN0IG9yZGVyIHNvIHRoYXQgdGhlc2UgY2FuIGJlIHVzZWQgaW4tbGluZSBvZgorIyBhIGNvbXBpbGVyIGludm9jYXRpb24uCitvdXRwdXQ9IiIKK3Rlc3QgIiRlY2hvX2NwcGZsYWdzIiA9ICJ5ZXMiICYmIG91dHB1dD0iJG91dHB1dCAkZ3Rlc3RfY3BwZmxhZ3MiCit0ZXN0ICIkZWNob19jeHhmbGFncyIgPSAieWVzIiAmJiBvdXRwdXQ9IiRvdXRwdXQgJGd0ZXN0X2N4eGZsYWdzIgordGVzdCAiJGVjaG9fbGRmbGFncyIgPSAieWVzIiAgJiYgb3V0cHV0PSIkb3V0cHV0ICRndGVzdF9sZGZsYWdzIgordGVzdCAiJGVjaG9fbGlicyIgPSAieWVzIiAgICAgJiYgb3V0cHV0PSIkb3V0cHV0ICRndGVzdF9saWJzIgorZWNobyAkb3V0cHV0CisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NjcmlwdHMvcHVtcC5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL3B1bXAucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWVmYjY1MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL3B1bXAucHkKQEAgLTAsMCArMSw4NTUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiInB1bXAgdjAuMi4wIC0gUHJldHR5IFVzZWZ1bCBmb3IgTWV0YSBQcm9ncmFtbWluZy4KKworQSB0b29sIGZvciBwcmVwcm9jZXNzb3IgbWV0YSBwcm9ncmFtbWluZy4gIFVzZWZ1bCBmb3IgZ2VuZXJhdGluZworcmVwZXRpdGl2ZSBib2lsZXJwbGF0ZSBjb2RlLiAgRXNwZWNpYWxseSB1c2VmdWwgZm9yIHdyaXRpbmcgQysrCitjbGFzc2VzLCBmdW5jdGlvbnMsIG1hY3JvcywgYW5kIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gd29yayB3aXRoCit2YXJpb3VzIG51bWJlciBvZiBhcmd1bWVudHMuCisKK1VTQUdFOgorICAgICAgIHB1bXAucHkgU09VUkNFX0ZJTEUKKworRVhBTVBMRVM6CisgICAgICAgcHVtcC5weSBmb28uY2MucHVtcAorICAgICAgICAgQ29udmVydHMgZm9vLmNjLnB1bXAgdG8gZm9vLmNjLgorCitHUkFNTUFSOgorICAgICAgIENPREUgOjo9IEFUT01JQ19DT0RFKgorICAgICAgIEFUT01JQ19DT0RFIDo6PSAkdmFyIElEID0gRVhQUkVTU0lPTgorICAgICAgICAgICB8ICR2YXIgSUQgPSBbWyBDT0RFIF1dCisgICAgICAgICAgIHwgJHJhbmdlIElEIEVYUFJFU1NJT04uLkVYUFJFU1NJT04KKyAgICAgICAgICAgfCAkZm9yIElEIFNFUEFSQVRPUiBbWyBDT0RFIF1dCisgICAgICAgICAgIHwgJCgkKQorICAgICAgICAgICB8ICRJRAorICAgICAgICAgICB8ICQoRVhQUkVTU0lPTikKKyAgICAgICAgICAgfCAkaWYgRVhQUkVTU0lPTiBbWyBDT0RFIF1dIEVMU0VfQlJBTkNICisgICAgICAgICAgIHwgW1sgQ09ERSBdXQorICAgICAgICAgICB8IFJBV19DT0RFCisgICAgICAgU0VQQVJBVE9SIDo6PSBSQVdfQ09ERSB8IEVNUFRZCisgICAgICAgRUxTRV9CUkFOQ0ggOjo9ICRlbHNlIFtbIENPREUgXV0KKyAgICAgICAgICAgfCAkZWxpZiBFWFBSRVNTSU9OIFtbIENPREUgXV0gRUxTRV9CUkFOQ0gKKyAgICAgICAgICAgfCBFTVBUWQorICAgICAgIEVYUFJFU1NJT04gaGFzIFB5dGhvbiBzeW50YXguCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworCitUT0tFTl9UQUJMRSA9IFsKKyAgICAocmUuY29tcGlsZShyJ1wkdmFyXHMrJyksICckdmFyJyksCisgICAgKHJlLmNvbXBpbGUocidcJGVsaWZccysnKSwgJyRlbGlmJyksCisgICAgKHJlLmNvbXBpbGUocidcJGVsc2VccysnKSwgJyRlbHNlJyksCisgICAgKHJlLmNvbXBpbGUocidcJGZvclxzKycpLCAnJGZvcicpLAorICAgIChyZS5jb21waWxlKHInXCRpZlxzKycpLCAnJGlmJyksCisgICAgKHJlLmNvbXBpbGUocidcJHJhbmdlXHMrJyksICckcmFuZ2UnKSwKKyAgICAocmUuY29tcGlsZShyJ1wkW19BLVphLXpdXHcqJyksICckaWQnKSwKKyAgICAocmUuY29tcGlsZShyJ1wkXChcJFwpJyksICckKCQpJyksCisgICAgKHJlLmNvbXBpbGUocidcJCcpLCAnJCcpLAorICAgIChyZS5jb21waWxlKHInXFtcW1xuPycpLCAnW1snKSwKKyAgICAocmUuY29tcGlsZShyJ1xdXF1cbj8nKSwgJ11dJyksCisgICAgXQorCisKK2NsYXNzIEN1cnNvcjoKKyAgIiIiUmVwcmVzZW50cyBhIHBvc2l0aW9uIChsaW5lIGFuZCBjb2x1bW4pIGluIGEgdGV4dCBmaWxlLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lPS0xLCBjb2x1bW49LTEpOgorICAgIHNlbGYubGluZSA9IGxpbmUKKyAgICBzZWxmLmNvbHVtbiA9IGNvbHVtbgorCisgIGRlZiBfX2VxX18oc2VsZiwgcmhzKToKKyAgICByZXR1cm4gc2VsZi5saW5lID09IHJocy5saW5lIGFuZCBzZWxmLmNvbHVtbiA9PSByaHMuY29sdW1uCisKKyAgZGVmIF9fbmVfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiBub3Qgc2VsZiA9PSByaHMKKworICBkZWYgX19sdF9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHNlbGYubGluZSA8IHJocy5saW5lIG9yICgKKyAgICAgICAgc2VsZi5saW5lID09IHJocy5saW5lIGFuZCBzZWxmLmNvbHVtbiA8IHJocy5jb2x1bW4pCisKKyAgZGVmIF9fbGVfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiBzZWxmIDwgcmhzIG9yIHNlbGYgPT0gcmhzCisKKyAgZGVmIF9fZ3RfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiByaHMgPCBzZWxmCisKKyAgZGVmIF9fZ2VfXyhzZWxmLCByaHMpOgorICAgIHJldHVybiByaHMgPD0gc2VsZgorCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIGlmIHNlbGYgPT0gRW9mKCk6CisgICAgICByZXR1cm4gJ0VPRicKKyAgICBlbHNlOgorICAgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYubGluZSArIDEsIHNlbGYuY29sdW1uKQorCisgIGRlZiBfX2FkZF9fKHNlbGYsIG9mZnNldCk6CisgICAgcmV0dXJuIEN1cnNvcihzZWxmLmxpbmUsIHNlbGYuY29sdW1uICsgb2Zmc2V0KQorCisgIGRlZiBfX3N1Yl9fKHNlbGYsIG9mZnNldCk6CisgICAgcmV0dXJuIEN1cnNvcihzZWxmLmxpbmUsIHNlbGYuY29sdW1uIC0gb2Zmc2V0KQorCisgIGRlZiBDbG9uZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgY29weSBvZiBzZWxmLiIiIgorCisgICAgcmV0dXJuIEN1cnNvcihzZWxmLmxpbmUsIHNlbGYuY29sdW1uKQorCisKKyMgU3BlY2lhbCBjdXJzb3IgdG8gaW5kaWNhdGUgdGhlIGVuZC1vZi1maWxlLgorZGVmIEVvZigpOgorICAiIiJSZXR1cm5zIHRoZSBzcGVjaWFsIGN1cnNvciB0byBkZW5vdGUgdGhlIGVuZC1vZi1maWxlLiIiIgorICByZXR1cm4gQ3Vyc29yKC0xLCAtMSkKKworCitjbGFzcyBUb2tlbjoKKyAgIiIiUmVwcmVzZW50cyBhIHRva2VuIGluIGEgUHVtcCBzb3VyY2UgZmlsZS4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQ9Tm9uZSwgZW5kPU5vbmUsIHZhbHVlPU5vbmUsIHRva2VuX3R5cGU9Tm9uZSk6CisgICAgaWYgc3RhcnQgaXMgTm9uZToKKyAgICAgIHNlbGYuc3RhcnQgPSBFb2YoKQorICAgIGVsc2U6CisgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKKyAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgIHNlbGYuZW5kID0gRW9mKCkKKyAgICBlbHNlOgorICAgICAgc2VsZi5lbmQgPSBlbmQKKyAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICBzZWxmLnRva2VuX3R5cGUgPSB0b2tlbl90eXBlCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgcmV0dXJuICdUb2tlbiBAJXM6IFwnJXNcJyB0eXBlPSVzJyAlICgKKyAgICAgICAgc2VsZi5zdGFydCwgc2VsZi52YWx1ZSwgc2VsZi50b2tlbl90eXBlKQorCisgIGRlZiBDbG9uZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgY29weSBvZiBzZWxmLiIiIgorCisgICAgcmV0dXJuIFRva2VuKHNlbGYuc3RhcnQuQ2xvbmUoKSwgc2VsZi5lbmQuQ2xvbmUoKSwgc2VsZi52YWx1ZSwKKyAgICAgICAgICAgICAgICAgc2VsZi50b2tlbl90eXBlKQorCisKK2RlZiBTdGFydHNXaXRoKGxpbmVzLCBwb3MsIHN0cmluZyk6CisgICIiIlJldHVybnMgVHJ1ZSBpZmYgdGhlIGdpdmVuIHBvc2l0aW9uIGluIGxpbmVzIHN0YXJ0cyB3aXRoICdzdHJpbmcnLiIiIgorCisgIHJldHVybiBsaW5lc1twb3MubGluZV1bcG9zLmNvbHVtbjpdLnN0YXJ0c3dpdGgoc3RyaW5nKQorCisKK2RlZiBGaW5kRmlyc3RJbkxpbmUobGluZSwgdG9rZW5fdGFibGUpOgorICBiZXN0X21hdGNoX3N0YXJ0ID0gLTEKKyAgZm9yIChyZWdleCwgdG9rZW5fdHlwZSkgaW4gdG9rZW5fdGFibGU6CisgICAgbSA9IHJlZ2V4LnNlYXJjaChsaW5lKQorICAgIGlmIG06CisgICAgICAjIFdlIGZvdW5kIHJlZ2V4IGluIGxpbmVzCisgICAgICBpZiBiZXN0X21hdGNoX3N0YXJ0IDwgMCBvciBtLnN0YXJ0KCkgPCBiZXN0X21hdGNoX3N0YXJ0OgorICAgICAgICBiZXN0X21hdGNoX3N0YXJ0ID0gbS5zdGFydCgpCisgICAgICAgIGJlc3RfbWF0Y2hfbGVuZ3RoID0gbS5lbmQoKSAtIG0uc3RhcnQoKQorICAgICAgICBiZXN0X21hdGNoX3Rva2VuX3R5cGUgPSB0b2tlbl90eXBlCisKKyAgaWYgYmVzdF9tYXRjaF9zdGFydCA8IDA6CisgICAgcmV0dXJuIE5vbmUKKworICByZXR1cm4gKGJlc3RfbWF0Y2hfc3RhcnQsIGJlc3RfbWF0Y2hfbGVuZ3RoLCBiZXN0X21hdGNoX3Rva2VuX3R5cGUpCisKKworZGVmIEZpbmRGaXJzdChsaW5lcywgdG9rZW5fdGFibGUsIGN1cnNvcik6CisgICIiIkZpbmRzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFueSBzdHJpbmcgaW4gc3RyaW5ncyBpbiBsaW5lcy4iIiIKKworICBzdGFydCA9IGN1cnNvci5DbG9uZSgpCisgIGN1cl9saW5lX251bWJlciA9IGN1cnNvci5saW5lCisgIGZvciBsaW5lIGluIGxpbmVzW3N0YXJ0LmxpbmU6XToKKyAgICBpZiBjdXJfbGluZV9udW1iZXIgPT0gc3RhcnQubGluZToKKyAgICAgIGxpbmUgPSBsaW5lW3N0YXJ0LmNvbHVtbjpdCisgICAgbSA9IEZpbmRGaXJzdEluTGluZShsaW5lLCB0b2tlbl90YWJsZSkKKyAgICBpZiBtOgorICAgICAgIyBXZSBmb3VuZCBhIHJlZ2V4IGluIGxpbmUuCisgICAgICAoc3RhcnRfY29sdW1uLCBsZW5ndGgsIHRva2VuX3R5cGUpID0gbQorICAgICAgaWYgY3VyX2xpbmVfbnVtYmVyID09IHN0YXJ0LmxpbmU6CisgICAgICAgIHN0YXJ0X2NvbHVtbiArPSBzdGFydC5jb2x1bW4KKyAgICAgIGZvdW5kX3N0YXJ0ID0gQ3Vyc29yKGN1cl9saW5lX251bWJlciwgc3RhcnRfY29sdW1uKQorICAgICAgZm91bmRfZW5kID0gZm91bmRfc3RhcnQgKyBsZW5ndGgKKyAgICAgIHJldHVybiBNYWtlVG9rZW4obGluZXMsIGZvdW5kX3N0YXJ0LCBmb3VuZF9lbmQsIHRva2VuX3R5cGUpCisgICAgY3VyX2xpbmVfbnVtYmVyICs9IDEKKyAgIyBXZSBmYWlsZWQgdG8gZmluZCBzdHIgaW4gbGluZXMKKyAgcmV0dXJuIE5vbmUKKworCitkZWYgU3ViU3RyaW5nKGxpbmVzLCBzdGFydCwgZW5kKToKKyAgIiIiUmV0dXJucyBhIHN1YnN0cmluZyBpbiBsaW5lcy4iIiIKKworICBpZiBlbmQgPT0gRW9mKCk6CisgICAgZW5kID0gQ3Vyc29yKGxlbihsaW5lcykgLSAxLCBsZW4obGluZXNbLTFdKSkKKworICBpZiBzdGFydCA+PSBlbmQ6CisgICAgcmV0dXJuICcnCisKKyAgaWYgc3RhcnQubGluZSA9PSBlbmQubGluZToKKyAgICByZXR1cm4gbGluZXNbc3RhcnQubGluZV1bc3RhcnQuY29sdW1uOmVuZC5jb2x1bW5dCisKKyAgcmVzdWx0X2xpbmVzID0gKFtsaW5lc1tzdGFydC5saW5lXVtzdGFydC5jb2x1bW46XV0gKworICAgICAgICAgICAgICAgICAgbGluZXNbc3RhcnQubGluZSArIDE6ZW5kLmxpbmVdICsKKyAgICAgICAgICAgICAgICAgIFtsaW5lc1tlbmQubGluZV1bOmVuZC5jb2x1bW5dXSkKKyAgcmV0dXJuICcnLmpvaW4ocmVzdWx0X2xpbmVzKQorCisKK2RlZiBTdHJpcE1ldGFDb21tZW50cyhzdHIpOgorICAiIiJTdHJpcCBtZXRhIGNvbW1lbnRzIGZyb20gZWFjaCBsaW5lIGluIHRoZSBnaXZlbiBzdHJpbmcuIiIiCisKKyAgIyBGaXJzdCwgY29tcGxldGVseSByZW1vdmUgbGluZXMgY29udGFpbmluZyBub3RoaW5nIGJ1dCBhIG1ldGEKKyAgIyBjb21tZW50LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIFxuLgorICBzdHIgPSByZS5zdWIocideXHMqXCRcJC4qXG4nLCAnJywgc3RyKQorCisgICMgVGhlbiwgcmVtb3ZlIG1ldGEgY29tbWVudHMgZnJvbSBjb250ZW50ZnVsIGxpbmVzLgorICByZXR1cm4gcmUuc3ViKHInXHMqXCRcJC4qJywgJycsIHN0cikKKworCitkZWYgTWFrZVRva2VuKGxpbmVzLCBzdGFydCwgZW5kLCB0b2tlbl90eXBlKToKKyAgIiIiQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBUb2tlbi4iIiIKKworICByZXR1cm4gVG9rZW4oc3RhcnQsIGVuZCwgU3ViU3RyaW5nKGxpbmVzLCBzdGFydCwgZW5kKSwgdG9rZW5fdHlwZSkKKworCitkZWYgUGFyc2VUb2tlbihsaW5lcywgcG9zLCByZWdleCwgdG9rZW5fdHlwZSk6CisgIGxpbmUgPSBsaW5lc1twb3MubGluZV1bcG9zLmNvbHVtbjpdCisgIG0gPSByZWdleC5zZWFyY2gobGluZSkKKyAgaWYgbSBhbmQgbm90IG0uc3RhcnQoKToKKyAgICByZXR1cm4gTWFrZVRva2VuKGxpbmVzLCBwb3MsIHBvcyArIG0uZW5kKCksIHRva2VuX3R5cGUpCisgIGVsc2U6CisgICAgcHJpbnQgJ0VSUk9SOiAlcyBleHBlY3RlZCBhdCAlcy4nICUgKHRva2VuX3R5cGUsIHBvcykKKyAgICBzeXMuZXhpdCgxKQorCisKK0lEX1JFR0VYID0gcmUuY29tcGlsZShyJ1tfQS1aYS16XVx3KicpCitFUV9SRUdFWCA9IHJlLmNvbXBpbGUocic9JykKK1JFU1RfT0ZfTElORV9SRUdFWCA9IHJlLmNvbXBpbGUocicuKj8oPz0kfFwkXCQpJykKK09QVElPTkFMX1dISVRFX1NQQUNFU19SRUdFWCA9IHJlLmNvbXBpbGUocidccyonKQorV0hJVEVfU1BBQ0VfUkVHRVggPSByZS5jb21waWxlKHInXHMnKQorRE9UX0RPVF9SRUdFWCA9IHJlLmNvbXBpbGUocidcLlwuJykKKworCitkZWYgU2tpcChsaW5lcywgcG9zLCByZWdleCk6CisgIGxpbmUgPSBsaW5lc1twb3MubGluZV1bcG9zLmNvbHVtbjpdCisgIG0gPSByZS5zZWFyY2gocmVnZXgsIGxpbmUpCisgIGlmIG0gYW5kIG5vdCBtLnN0YXJ0KCk6CisgICAgcmV0dXJuIHBvcyArIG0uZW5kKCkKKyAgZWxzZToKKyAgICByZXR1cm4gcG9zCisKKworZGVmIFNraXBVbnRpbChsaW5lcywgcG9zLCByZWdleCwgdG9rZW5fdHlwZSk6CisgIGxpbmUgPSBsaW5lc1twb3MubGluZV1bcG9zLmNvbHVtbjpdCisgIG0gPSByZS5zZWFyY2gocmVnZXgsIGxpbmUpCisgIGlmIG06CisgICAgcmV0dXJuIHBvcyArIG0uc3RhcnQoKQorICBlbHNlOgorICAgIHByaW50ICgnRVJST1I6ICVzIGV4cGVjdGVkIG9uIGxpbmUgJXMgYWZ0ZXIgY29sdW1uICVzLicgJQorICAgICAgICAgICAodG9rZW5fdHlwZSwgcG9zLmxpbmUgKyAxLCBwb3MuY29sdW1uKSkKKyAgICBzeXMuZXhpdCgxKQorCisKK2RlZiBQYXJzZUV4cFRva2VuSW5QYXJlbnMobGluZXMsIHBvcyk6CisgIGRlZiBQYXJzZUluUGFyZW5zKHBvcyk6CisgICAgcG9zID0gU2tpcChsaW5lcywgcG9zLCBPUFRJT05BTF9XSElURV9TUEFDRVNfUkVHRVgpCisgICAgcG9zID0gU2tpcChsaW5lcywgcG9zLCByJ1woJykKKyAgICBwb3MgPSBQYXJzZShwb3MpCisgICAgcG9zID0gU2tpcChsaW5lcywgcG9zLCByJ1wpJykKKyAgICByZXR1cm4gcG9zCisKKyAgZGVmIFBhcnNlKHBvcyk6CisgICAgcG9zID0gU2tpcFVudGlsKGxpbmVzLCBwb3MsIHInXCh8XCknLCAnKScpCisgICAgaWYgU3ViU3RyaW5nKGxpbmVzLCBwb3MsIHBvcyArIDEpID09ICcoJzoKKyAgICAgIHBvcyA9IFBhcnNlKHBvcyArIDEpCisgICAgICBwb3MgPSBTa2lwKGxpbmVzLCBwb3MsIHInXCknKQorICAgICAgcmV0dXJuIFBhcnNlKHBvcykKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIHBvcworCisgIHN0YXJ0ID0gcG9zLkNsb25lKCkKKyAgcG9zID0gUGFyc2VJblBhcmVucyhwb3MpCisgIHJldHVybiBNYWtlVG9rZW4obGluZXMsIHN0YXJ0LCBwb3MsICdleHAnKQorCisKK2RlZiBSU3RyaXBOZXdMaW5lRnJvbVRva2VuKHRva2VuKToKKyAgaWYgdG9rZW4udmFsdWUuZW5kc3dpdGgoJ1xuJyk6CisgICAgcmV0dXJuIFRva2VuKHRva2VuLnN0YXJ0LCB0b2tlbi5lbmQsIHRva2VuLnZhbHVlWzotMV0sIHRva2VuLnRva2VuX3R5cGUpCisgIGVsc2U6CisgICAgcmV0dXJuIHRva2VuCisKKworZGVmIFRva2VuaXplTGluZXMobGluZXMsIHBvcyk6CisgIHdoaWxlIFRydWU6CisgICAgZm91bmQgPSBGaW5kRmlyc3QobGluZXMsIFRPS0VOX1RBQkxFLCBwb3MpCisgICAgaWYgbm90IGZvdW5kOgorICAgICAgeWllbGQgTWFrZVRva2VuKGxpbmVzLCBwb3MsIEVvZigpLCAnY29kZScpCisgICAgICByZXR1cm4KKworICAgIGlmIGZvdW5kLnN0YXJ0ID09IHBvczoKKyAgICAgIHByZXZfdG9rZW4gPSBOb25lCisgICAgICBwcmV2X3Rva2VuX3JzdHJpcHBlZCA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgcHJldl90b2tlbiA9IE1ha2VUb2tlbihsaW5lcywgcG9zLCBmb3VuZC5zdGFydCwgJ2NvZGUnKQorICAgICAgcHJldl90b2tlbl9yc3RyaXBwZWQgPSBSU3RyaXBOZXdMaW5lRnJvbVRva2VuKHByZXZfdG9rZW4pCisKKyAgICBpZiBmb3VuZC50b2tlbl90eXBlID09ICckdmFyJzoKKyAgICAgIGlmIHByZXZfdG9rZW5fcnN0cmlwcGVkOgorICAgICAgICB5aWVsZCBwcmV2X3Rva2VuX3JzdHJpcHBlZAorICAgICAgeWllbGQgZm91bmQKKyAgICAgIGlkX3Rva2VuID0gUGFyc2VUb2tlbihsaW5lcywgZm91bmQuZW5kLCBJRF9SRUdFWCwgJ2lkJykKKyAgICAgIHlpZWxkIGlkX3Rva2VuCisgICAgICBwb3MgPSBTa2lwKGxpbmVzLCBpZF90b2tlbi5lbmQsIE9QVElPTkFMX1dISVRFX1NQQUNFU19SRUdFWCkKKworICAgICAgZXFfdG9rZW4gPSBQYXJzZVRva2VuKGxpbmVzLCBwb3MsIEVRX1JFR0VYLCAnPScpCisgICAgICB5aWVsZCBlcV90b2tlbgorICAgICAgcG9zID0gU2tpcChsaW5lcywgZXFfdG9rZW4uZW5kLCByJ1xzKicpCisKKyAgICAgIGlmIFN1YlN0cmluZyhsaW5lcywgcG9zLCBwb3MgKyAyKSAhPSAnW1snOgorICAgICAgICBleHBfdG9rZW4gPSBQYXJzZVRva2VuKGxpbmVzLCBwb3MsIFJFU1RfT0ZfTElORV9SRUdFWCwgJ2V4cCcpCisgICAgICAgIHlpZWxkIGV4cF90b2tlbgorICAgICAgICBwb3MgPSBDdXJzb3IoZXhwX3Rva2VuLmVuZC5saW5lICsgMSwgMCkKKyAgICBlbGlmIGZvdW5kLnRva2VuX3R5cGUgPT0gJyRmb3InOgorICAgICAgaWYgcHJldl90b2tlbl9yc3RyaXBwZWQ6CisgICAgICAgIHlpZWxkIHByZXZfdG9rZW5fcnN0cmlwcGVkCisgICAgICB5aWVsZCBmb3VuZAorICAgICAgaWRfdG9rZW4gPSBQYXJzZVRva2VuKGxpbmVzLCBmb3VuZC5lbmQsIElEX1JFR0VYLCAnaWQnKQorICAgICAgeWllbGQgaWRfdG9rZW4KKyAgICAgIHBvcyA9IFNraXAobGluZXMsIGlkX3Rva2VuLmVuZCwgV0hJVEVfU1BBQ0VfUkVHRVgpCisgICAgZWxpZiBmb3VuZC50b2tlbl90eXBlID09ICckcmFuZ2UnOgorICAgICAgaWYgcHJldl90b2tlbl9yc3RyaXBwZWQ6CisgICAgICAgIHlpZWxkIHByZXZfdG9rZW5fcnN0cmlwcGVkCisgICAgICB5aWVsZCBmb3VuZAorICAgICAgaWRfdG9rZW4gPSBQYXJzZVRva2VuKGxpbmVzLCBmb3VuZC5lbmQsIElEX1JFR0VYLCAnaWQnKQorICAgICAgeWllbGQgaWRfdG9rZW4KKyAgICAgIHBvcyA9IFNraXAobGluZXMsIGlkX3Rva2VuLmVuZCwgT1BUSU9OQUxfV0hJVEVfU1BBQ0VTX1JFR0VYKQorCisgICAgICBkb3RzX3BvcyA9IFNraXBVbnRpbChsaW5lcywgcG9zLCBET1RfRE9UX1JFR0VYLCAnLi4nKQorICAgICAgeWllbGQgTWFrZVRva2VuKGxpbmVzLCBwb3MsIGRvdHNfcG9zLCAnZXhwJykKKyAgICAgIHlpZWxkIE1ha2VUb2tlbihsaW5lcywgZG90c19wb3MsIGRvdHNfcG9zICsgMiwgJy4uJykKKyAgICAgIHBvcyA9IGRvdHNfcG9zICsgMgorICAgICAgbmV3X3BvcyA9IEN1cnNvcihwb3MubGluZSArIDEsIDApCisgICAgICB5aWVsZCBNYWtlVG9rZW4obGluZXMsIHBvcywgbmV3X3BvcywgJ2V4cCcpCisgICAgICBwb3MgPSBuZXdfcG9zCisgICAgZWxpZiBmb3VuZC50b2tlbl90eXBlID09ICckJzoKKyAgICAgIGlmIHByZXZfdG9rZW46CisgICAgICAgIHlpZWxkIHByZXZfdG9rZW4KKyAgICAgIHlpZWxkIGZvdW5kCisgICAgICBleHBfdG9rZW4gPSBQYXJzZUV4cFRva2VuSW5QYXJlbnMobGluZXMsIGZvdW5kLmVuZCkKKyAgICAgIHlpZWxkIGV4cF90b2tlbgorICAgICAgcG9zID0gZXhwX3Rva2VuLmVuZAorICAgIGVsaWYgKGZvdW5kLnRva2VuX3R5cGUgPT0gJ11dJyBvciBmb3VuZC50b2tlbl90eXBlID09ICckaWYnIG9yCisgICAgICAgICAgZm91bmQudG9rZW5fdHlwZSA9PSAnJGVsaWYnIG9yIGZvdW5kLnRva2VuX3R5cGUgPT0gJyRlbHNlJyk6CisgICAgICBpZiBwcmV2X3Rva2VuX3JzdHJpcHBlZDoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbl9yc3RyaXBwZWQKKyAgICAgIHlpZWxkIGZvdW5kCisgICAgICBwb3MgPSBmb3VuZC5lbmQKKyAgICBlbHNlOgorICAgICAgaWYgcHJldl90b2tlbjoKKyAgICAgICAgeWllbGQgcHJldl90b2tlbgorICAgICAgeWllbGQgZm91bmQKKyAgICAgIHBvcyA9IGZvdW5kLmVuZAorCisKK2RlZiBUb2tlbml6ZShzKToKKyAgIiIiQSBnZW5lcmF0b3IgdGhhdCB5aWVsZHMgdGhlIHRva2VucyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiIiIgorICBpZiBzICE9ICcnOgorICAgIGxpbmVzID0gcy5zcGxpdGxpbmVzKFRydWUpCisgICAgZm9yIHRva2VuIGluIFRva2VuaXplTGluZXMobGluZXMsIEN1cnNvcigwLCAwKSk6CisgICAgICB5aWVsZCB0b2tlbgorCisKK2NsYXNzIENvZGVOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgYXRvbWljX2NvZGVfbGlzdD1Ob25lKToKKyAgICBzZWxmLmF0b21pY19jb2RlID0gYXRvbWljX2NvZGVfbGlzdAorCisKK2NsYXNzIFZhck5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZGVudGlmaWVyPU5vbmUsIGF0b21pY19jb2RlPU5vbmUpOgorICAgIHNlbGYuaWRlbnRpZmllciA9IGlkZW50aWZpZXIKKyAgICBzZWxmLmF0b21pY19jb2RlID0gYXRvbWljX2NvZGUKKworCitjbGFzcyBSYW5nZU5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZGVudGlmaWVyPU5vbmUsIGV4cDE9Tm9uZSwgZXhwMj1Ob25lKToKKyAgICBzZWxmLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyCisgICAgc2VsZi5leHAxID0gZXhwMQorICAgIHNlbGYuZXhwMiA9IGV4cDIKKworCitjbGFzcyBGb3JOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgaWRlbnRpZmllcj1Ob25lLCBzZXA9Tm9uZSwgY29kZT1Ob25lKToKKyAgICBzZWxmLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyCisgICAgc2VsZi5zZXAgPSBzZXAKKyAgICBzZWxmLmNvZGUgPSBjb2RlCisKKworY2xhc3MgRWxzZU5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBlbHNlX2JyYW5jaD1Ob25lKToKKyAgICBzZWxmLmVsc2VfYnJhbmNoID0gZWxzZV9icmFuY2gKKworCitjbGFzcyBJZk5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBleHA9Tm9uZSwgdGhlbl9icmFuY2g9Tm9uZSwgZWxzZV9icmFuY2g9Tm9uZSk6CisgICAgc2VsZi5leHAgPSBleHAKKyAgICBzZWxmLnRoZW5fYnJhbmNoID0gdGhlbl9icmFuY2gKKyAgICBzZWxmLmVsc2VfYnJhbmNoID0gZWxzZV9icmFuY2gKKworCitjbGFzcyBSYXdDb2RlTm9kZToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuPU5vbmUpOgorICAgIHNlbGYucmF3X2NvZGUgPSB0b2tlbgorCisKK2NsYXNzIExpdGVyYWxEb2xsYXJOb2RlOgorICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW4pOgorICAgIHNlbGYudG9rZW4gPSB0b2tlbgorCisKK2NsYXNzIEV4cE5vZGU6CisgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlbiwgcHl0aG9uX2V4cCk6CisgICAgc2VsZi50b2tlbiA9IHRva2VuCisgICAgc2VsZi5weXRob25fZXhwID0gcHl0aG9uX2V4cAorCisKK2RlZiBQb3BGcm9udChhX2xpc3QpOgorICBoZWFkID0gYV9saXN0WzBdCisgIGFfbGlzdFs6MV0gPSBbXQorICByZXR1cm4gaGVhZAorCisKK2RlZiBQdXNoRnJvbnQoYV9saXN0LCBlbGVtKToKKyAgYV9saXN0WzowXSA9IFtlbGVtXQorCisKK2RlZiBQb3BUb2tlbihhX2xpc3QsIHRva2VuX3R5cGU9Tm9uZSk6CisgIHRva2VuID0gUG9wRnJvbnQoYV9saXN0KQorICBpZiB0b2tlbl90eXBlIGlzIG5vdCBOb25lIGFuZCB0b2tlbi50b2tlbl90eXBlICE9IHRva2VuX3R5cGU6CisgICAgcHJpbnQgJ0VSUk9SOiAlcyBleHBlY3RlZCBhdCAlcycgJSAodG9rZW5fdHlwZSwgdG9rZW4uc3RhcnQpCisgICAgcHJpbnQgJ0VSUk9SOiAlcyBmb3VuZCBpbnN0ZWFkJyAlICh0b2tlbiwpCisgICAgc3lzLmV4aXQoMSkKKworICByZXR1cm4gdG9rZW4KKworCitkZWYgUGVla1Rva2VuKGFfbGlzdCk6CisgIGlmIG5vdCBhX2xpc3Q6CisgICAgcmV0dXJuIE5vbmUKKworICByZXR1cm4gYV9saXN0WzBdCisKKworZGVmIFBhcnNlRXhwTm9kZSh0b2tlbik6CisgIHB5dGhvbl9leHAgPSByZS5zdWIocicoW19BLVphLXpdXHcqKScsIHInc2VsZi5HZXRWYWx1ZSgiXDEiKScsIHRva2VuLnZhbHVlKQorICByZXR1cm4gRXhwTm9kZSh0b2tlbiwgcHl0aG9uX2V4cCkKKworCitkZWYgUGFyc2VFbHNlTm9kZSh0b2tlbnMpOgorICBkZWYgUG9wKHRva2VuX3R5cGU9Tm9uZSk6CisgICAgcmV0dXJuIFBvcFRva2VuKHRva2VucywgdG9rZW5fdHlwZSkKKworICBuZXh0ID0gUGVla1Rva2VuKHRva2VucykKKyAgaWYgbm90IG5leHQ6CisgICAgcmV0dXJuIE5vbmUKKyAgaWYgbmV4dC50b2tlbl90eXBlID09ICckZWxzZSc6CisgICAgUG9wKCckZWxzZScpCisgICAgUG9wKCdbWycpCisgICAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCisgICAgUG9wKCddXScpCisgICAgcmV0dXJuIGNvZGVfbm9kZQorICBlbGlmIG5leHQudG9rZW5fdHlwZSA9PSAnJGVsaWYnOgorICAgIFBvcCgnJGVsaWYnKQorICAgIGV4cCA9IFBvcCgnY29kZScpCisgICAgUG9wKCdbWycpCisgICAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCisgICAgUG9wKCddXScpCisgICAgaW5uZXJfZWxzZV9ub2RlID0gUGFyc2VFbHNlTm9kZSh0b2tlbnMpCisgICAgcmV0dXJuIENvZGVOb2RlKFtJZk5vZGUoUGFyc2VFeHBOb2RlKGV4cCksIGNvZGVfbm9kZSwgaW5uZXJfZWxzZV9ub2RlKV0pCisgIGVsaWYgbm90IG5leHQudmFsdWUuc3RyaXAoKToKKyAgICBQb3AoJ2NvZGUnKQorICAgIHJldHVybiBQYXJzZUVsc2VOb2RlKHRva2VucykKKyAgZWxzZToKKyAgICByZXR1cm4gTm9uZQorCisKK2RlZiBQYXJzZUF0b21pY0NvZGVOb2RlKHRva2Vucyk6CisgIGRlZiBQb3AodG9rZW5fdHlwZT1Ob25lKToKKyAgICByZXR1cm4gUG9wVG9rZW4odG9rZW5zLCB0b2tlbl90eXBlKQorCisgIGhlYWQgPSBQb3BGcm9udCh0b2tlbnMpCisgIHQgPSBoZWFkLnRva2VuX3R5cGUKKyAgaWYgdCA9PSAnY29kZSc6CisgICAgcmV0dXJuIFJhd0NvZGVOb2RlKGhlYWQpCisgIGVsaWYgdCA9PSAnJHZhcic6CisgICAgaWRfdG9rZW4gPSBQb3AoJ2lkJykKKyAgICBQb3AoJz0nKQorICAgIG5leHQgPSBQZWVrVG9rZW4odG9rZW5zKQorICAgIGlmIG5leHQudG9rZW5fdHlwZSA9PSAnZXhwJzoKKyAgICAgIGV4cF90b2tlbiA9IFBvcCgpCisgICAgICByZXR1cm4gVmFyTm9kZShpZF90b2tlbiwgUGFyc2VFeHBOb2RlKGV4cF90b2tlbikpCisgICAgUG9wKCdbWycpCisgICAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCisgICAgUG9wKCddXScpCisgICAgcmV0dXJuIFZhck5vZGUoaWRfdG9rZW4sIGNvZGVfbm9kZSkKKyAgZWxpZiB0ID09ICckZm9yJzoKKyAgICBpZF90b2tlbiA9IFBvcCgnaWQnKQorICAgIG5leHRfdG9rZW4gPSBQZWVrVG9rZW4odG9rZW5zKQorICAgIGlmIG5leHRfdG9rZW4udG9rZW5fdHlwZSA9PSAnY29kZSc6CisgICAgICBzZXBfdG9rZW4gPSBuZXh0X3Rva2VuCisgICAgICBQb3AoJ2NvZGUnKQorICAgIGVsc2U6CisgICAgICBzZXBfdG9rZW4gPSBOb25lCisgICAgUG9wKCdbWycpCisgICAgY29kZV9ub2RlID0gUGFyc2VDb2RlTm9kZSh0b2tlbnMpCisgICAgUG9wKCddXScpCisgICAgcmV0dXJuIEZvck5vZGUoaWRfdG9rZW4sIHNlcF90b2tlbiwgY29kZV9ub2RlKQorICBlbGlmIHQgPT0gJyRpZic6CisgICAgZXhwX3Rva2VuID0gUG9wKCdjb2RlJykKKyAgICBQb3AoJ1tbJykKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICBlbHNlX25vZGUgPSBQYXJzZUVsc2VOb2RlKHRva2VucykKKyAgICByZXR1cm4gSWZOb2RlKFBhcnNlRXhwTm9kZShleHBfdG9rZW4pLCBjb2RlX25vZGUsIGVsc2Vfbm9kZSkKKyAgZWxpZiB0ID09ICckcmFuZ2UnOgorICAgIGlkX3Rva2VuID0gUG9wKCdpZCcpCisgICAgZXhwMV90b2tlbiA9IFBvcCgnZXhwJykKKyAgICBQb3AoJy4uJykKKyAgICBleHAyX3Rva2VuID0gUG9wKCdleHAnKQorICAgIHJldHVybiBSYW5nZU5vZGUoaWRfdG9rZW4sIFBhcnNlRXhwTm9kZShleHAxX3Rva2VuKSwKKyAgICAgICAgICAgICAgICAgICAgIFBhcnNlRXhwTm9kZShleHAyX3Rva2VuKSkKKyAgZWxpZiB0ID09ICckaWQnOgorICAgIHJldHVybiBQYXJzZUV4cE5vZGUoVG9rZW4oaGVhZC5zdGFydCArIDEsIGhlYWQuZW5kLCBoZWFkLnZhbHVlWzE6XSwgJ2lkJykpCisgIGVsaWYgdCA9PSAnJCgkKSc6CisgICAgcmV0dXJuIExpdGVyYWxEb2xsYXJOb2RlKGhlYWQpCisgIGVsaWYgdCA9PSAnJCc6CisgICAgZXhwX3Rva2VuID0gUG9wKCdleHAnKQorICAgIHJldHVybiBQYXJzZUV4cE5vZGUoZXhwX3Rva2VuKQorICBlbGlmIHQgPT0gJ1tbJzoKKyAgICBjb2RlX25vZGUgPSBQYXJzZUNvZGVOb2RlKHRva2VucykKKyAgICBQb3AoJ11dJykKKyAgICByZXR1cm4gY29kZV9ub2RlCisgIGVsc2U6CisgICAgUHVzaEZyb250KHRva2VucywgaGVhZCkKKyAgICByZXR1cm4gTm9uZQorCisKK2RlZiBQYXJzZUNvZGVOb2RlKHRva2Vucyk6CisgIGF0b21pY19jb2RlX2xpc3QgPSBbXQorICB3aGlsZSBUcnVlOgorICAgIGlmIG5vdCB0b2tlbnM6CisgICAgICBicmVhaworICAgIGF0b21pY19jb2RlX25vZGUgPSBQYXJzZUF0b21pY0NvZGVOb2RlKHRva2VucykKKyAgICBpZiBhdG9taWNfY29kZV9ub2RlOgorICAgICAgYXRvbWljX2NvZGVfbGlzdC5hcHBlbmQoYXRvbWljX2NvZGVfbm9kZSkKKyAgICBlbHNlOgorICAgICAgYnJlYWsKKyAgcmV0dXJuIENvZGVOb2RlKGF0b21pY19jb2RlX2xpc3QpCisKKworZGVmIFBhcnNlVG9BU1QocHVtcF9zcmNfdGV4dCk6CisgICIiIkNvbnZlcnQgdGhlIGdpdmVuIFB1bXAgc291cmNlIHRleHQgaW50byBhbiBBU1QuIiIiCisgIHRva2VucyA9IGxpc3QoVG9rZW5pemUocHVtcF9zcmNfdGV4dCkpCisgIGNvZGVfbm9kZSA9IFBhcnNlQ29kZU5vZGUodG9rZW5zKQorICByZXR1cm4gY29kZV9ub2RlCisKKworY2xhc3MgRW52OgorICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi52YXJpYWJsZXMgPSBbXQorICAgIHNlbGYucmFuZ2VzID0gW10KKworICBkZWYgQ2xvbmUoc2VsZik6CisgICAgY2xvbmUgPSBFbnYoKQorICAgIGNsb25lLnZhcmlhYmxlcyA9IHNlbGYudmFyaWFibGVzWzpdCisgICAgY2xvbmUucmFuZ2VzID0gc2VsZi5yYW5nZXNbOl0KKyAgICByZXR1cm4gY2xvbmUKKworICBkZWYgUHVzaFZhcmlhYmxlKHNlbGYsIHZhciwgdmFsdWUpOgorICAgICMgSWYgdmFsdWUgbG9va3MgbGlrZSBhbiBpbnQsIHN0b3JlIGl0IGFzIGFuIGludC4KKyAgICB0cnk6CisgICAgICBpbnRfdmFsdWUgPSBpbnQodmFsdWUpCisgICAgICBpZiAoJyVzJyAlIGludF92YWx1ZSkgPT0gdmFsdWU6CisgICAgICAgIHZhbHVlID0gaW50X3ZhbHVlCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgIHBhc3MKKyAgICBzZWxmLnZhcmlhYmxlc1s6MF0gPSBbKHZhciwgdmFsdWUpXQorCisgIGRlZiBQb3BWYXJpYWJsZShzZWxmKToKKyAgICBzZWxmLnZhcmlhYmxlc1s6MV0gPSBbXQorCisgIGRlZiBQdXNoUmFuZ2Uoc2VsZiwgdmFyLCBsb3dlciwgdXBwZXIpOgorICAgIHNlbGYucmFuZ2VzWzowXSA9IFsodmFyLCBsb3dlciwgdXBwZXIpXQorCisgIGRlZiBQb3BSYW5nZShzZWxmKToKKyAgICBzZWxmLnJhbmdlc1s6MV0gPSBbXQorCisgIGRlZiBHZXRWYWx1ZShzZWxmLCBpZGVudGlmaWVyKToKKyAgICBmb3IgKHZhciwgdmFsdWUpIGluIHNlbGYudmFyaWFibGVzOgorICAgICAgaWYgaWRlbnRpZmllciA9PSB2YXI6CisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgcHJpbnQgJ0VSUk9SOiBtZXRhIHZhcmlhYmxlICVzIGlzIHVuZGVmaW5lZC4nICUgKGlkZW50aWZpZXIsKQorICAgIHN5cy5leGl0KDEpCisKKyAgZGVmIEV2YWxFeHAoc2VsZiwgZXhwKToKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBldmFsKGV4cC5weXRob25fZXhwKQorICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICBwcmludCAnRVJST1I6IGNhdWdodCBleGNlcHRpb24gJXM6ICVzJyAlIChlLl9fY2xhc3NfXy5fX25hbWVfXywgZSkKKyAgICAgIHByaW50ICgnRVJST1I6IGZhaWxlZCB0byBldmFsdWF0ZSBtZXRhIGV4cHJlc3Npb24gJXMgYXQgJXMnICUKKyAgICAgICAgICAgICAoZXhwLnB5dGhvbl9leHAsIGV4cC50b2tlbi5zdGFydCkpCisgICAgICBzeXMuZXhpdCgxKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgR2V0UmFuZ2Uoc2VsZiwgaWRlbnRpZmllcik6CisgICAgZm9yICh2YXIsIGxvd2VyLCB1cHBlcikgaW4gc2VsZi5yYW5nZXM6CisgICAgICBpZiBpZGVudGlmaWVyID09IHZhcjoKKyAgICAgICAgcmV0dXJuIChsb3dlciwgdXBwZXIpCisKKyAgICBwcmludCAnRVJST1I6IHJhbmdlICVzIGlzIHVuZGVmaW5lZC4nICUgKGlkZW50aWZpZXIsKQorICAgIHN5cy5leGl0KDEpCisKKworY2xhc3MgT3V0cHV0OgorICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi5zdHJpbmcgPSAnJworCisgIGRlZiBHZXRMYXN0TGluZShzZWxmKToKKyAgICBpbmRleCA9IHNlbGYuc3RyaW5nLnJmaW5kKCdcbicpCisgICAgaWYgaW5kZXggPCAwOgorICAgICAgcmV0dXJuICcnCisKKyAgICByZXR1cm4gc2VsZi5zdHJpbmdbaW5kZXggKyAxOl0KKworICBkZWYgQXBwZW5kKHNlbGYsIHMpOgorICAgIHNlbGYuc3RyaW5nICs9IHMKKworCitkZWYgUnVuQXRvbWljQ29kZShlbnYsIG5vZGUsIG91dHB1dCk6CisgIGlmIGlzaW5zdGFuY2Uobm9kZSwgVmFyTm9kZSk6CisgICAgaWRlbnRpZmllciA9IG5vZGUuaWRlbnRpZmllci52YWx1ZS5zdHJpcCgpCisgICAgcmVzdWx0ID0gT3V0cHV0KCkKKyAgICBSdW5BdG9taWNDb2RlKGVudi5DbG9uZSgpLCBub2RlLmF0b21pY19jb2RlLCByZXN1bHQpCisgICAgdmFsdWUgPSByZXN1bHQuc3RyaW5nCisgICAgZW52LlB1c2hWYXJpYWJsZShpZGVudGlmaWVyLCB2YWx1ZSkKKyAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFJhbmdlTm9kZSk6CisgICAgaWRlbnRpZmllciA9IG5vZGUuaWRlbnRpZmllci52YWx1ZS5zdHJpcCgpCisgICAgbG93ZXIgPSBpbnQoZW52LkV2YWxFeHAobm9kZS5leHAxKSkKKyAgICB1cHBlciA9IGludChlbnYuRXZhbEV4cChub2RlLmV4cDIpKQorICAgIGVudi5QdXNoUmFuZ2UoaWRlbnRpZmllciwgbG93ZXIsIHVwcGVyKQorICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgRm9yTm9kZSk6CisgICAgaWRlbnRpZmllciA9IG5vZGUuaWRlbnRpZmllci52YWx1ZS5zdHJpcCgpCisgICAgaWYgbm9kZS5zZXAgaXMgTm9uZToKKyAgICAgIHNlcCA9ICcnCisgICAgZWxzZToKKyAgICAgIHNlcCA9IG5vZGUuc2VwLnZhbHVlCisgICAgKGxvd2VyLCB1cHBlcikgPSBlbnYuR2V0UmFuZ2UoaWRlbnRpZmllcikKKyAgICBmb3IgaSBpbiByYW5nZShsb3dlciwgdXBwZXIgKyAxKToKKyAgICAgIG5ld19lbnYgPSBlbnYuQ2xvbmUoKQorICAgICAgbmV3X2Vudi5QdXNoVmFyaWFibGUoaWRlbnRpZmllciwgaSkKKyAgICAgIFJ1bkNvZGUobmV3X2Vudiwgbm9kZS5jb2RlLCBvdXRwdXQpCisgICAgICBpZiBpICE9IHVwcGVyOgorICAgICAgICBvdXRwdXQuQXBwZW5kKHNlcCkKKyAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFJhd0NvZGVOb2RlKToKKyAgICBvdXRwdXQuQXBwZW5kKG5vZGUucmF3X2NvZGUudmFsdWUpCisgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBJZk5vZGUpOgorICAgIGNvbmQgPSBlbnYuRXZhbEV4cChub2RlLmV4cCkKKyAgICBpZiBjb25kOgorICAgICAgUnVuQ29kZShlbnYuQ2xvbmUoKSwgbm9kZS50aGVuX2JyYW5jaCwgb3V0cHV0KQorICAgIGVsaWYgbm9kZS5lbHNlX2JyYW5jaCBpcyBub3QgTm9uZToKKyAgICAgIFJ1bkNvZGUoZW52LkNsb25lKCksIG5vZGUuZWxzZV9icmFuY2gsIG91dHB1dCkKKyAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIEV4cE5vZGUpOgorICAgIHZhbHVlID0gZW52LkV2YWxFeHAobm9kZSkKKyAgICBvdXRwdXQuQXBwZW5kKCclcycgJSAodmFsdWUsKSkKKyAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIExpdGVyYWxEb2xsYXJOb2RlKToKKyAgICBvdXRwdXQuQXBwZW5kKCckJykKKyAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIENvZGVOb2RlKToKKyAgICBSdW5Db2RlKGVudi5DbG9uZSgpLCBub2RlLCBvdXRwdXQpCisgIGVsc2U6CisgICAgcHJpbnQgJ0JBRCcKKyAgICBwcmludCBub2RlCisgICAgc3lzLmV4aXQoMSkKKworCitkZWYgUnVuQ29kZShlbnYsIGNvZGVfbm9kZSwgb3V0cHV0KToKKyAgZm9yIGF0b21pY19jb2RlIGluIGNvZGVfbm9kZS5hdG9taWNfY29kZToKKyAgICBSdW5BdG9taWNDb2RlKGVudiwgYXRvbWljX2NvZGUsIG91dHB1dCkKKworCitkZWYgSXNTaW5nbGVMaW5lQ29tbWVudChjdXJfbGluZSk6CisgIHJldHVybiAnLy8nIGluIGN1cl9saW5lCisKKworZGVmIElzSW5QcmVwcm9jZXNzb3JEaXJlY3RpdmUocHJldl9saW5lcywgY3VyX2xpbmUpOgorICBpZiBjdXJfbGluZS5sc3RyaXAoKS5zdGFydHN3aXRoKCcjJyk6CisgICAgcmV0dXJuIFRydWUKKyAgcmV0dXJuIHByZXZfbGluZXMgYW5kIHByZXZfbGluZXNbLTFdLmVuZHN3aXRoKCdcXCcpCisKKworZGVmIFdyYXBDb21tZW50KGxpbmUsIG91dHB1dCk6CisgIGxvYyA9IGxpbmUuZmluZCgnLy8nKQorICBiZWZvcmVfY29tbWVudCA9IGxpbmVbOmxvY10ucnN0cmlwKCkKKyAgaWYgYmVmb3JlX2NvbW1lbnQgPT0gJyc6CisgICAgaW5kZW50ID0gbG9jCisgIGVsc2U6CisgICAgb3V0cHV0LmFwcGVuZChiZWZvcmVfY29tbWVudCkKKyAgICBpbmRlbnQgPSBsZW4oYmVmb3JlX2NvbW1lbnQpIC0gbGVuKGJlZm9yZV9jb21tZW50LmxzdHJpcCgpKQorICBwcmVmaXggPSBpbmRlbnQqJyAnICsgJy8vICcKKyAgbWF4X2xlbiA9IDgwIC0gbGVuKHByZWZpeCkKKyAgY29tbWVudCA9IGxpbmVbbG9jICsgMjpdLnN0cmlwKCkKKyAgc2VncyA9IFtzZWcgZm9yIHNlZyBpbiByZS5zcGxpdChyJyhcdytcVyopJywgY29tbWVudCkgaWYgc2VnICE9ICcnXQorICBjdXJfbGluZSA9ICcnCisgIGZvciBzZWcgaW4gc2VnczoKKyAgICBpZiBsZW4oKGN1cl9saW5lICsgc2VnKS5yc3RyaXAoKSkgPCBtYXhfbGVuOgorICAgICAgY3VyX2xpbmUgKz0gc2VnCisgICAgZWxzZToKKyAgICAgIGlmIGN1cl9saW5lLnN0cmlwKCkgIT0gJyc6CisgICAgICAgIG91dHB1dC5hcHBlbmQocHJlZml4ICsgY3VyX2xpbmUucnN0cmlwKCkpCisgICAgICBjdXJfbGluZSA9IHNlZy5sc3RyaXAoKQorICBpZiBjdXJfbGluZS5zdHJpcCgpICE9ICcnOgorICAgIG91dHB1dC5hcHBlbmQocHJlZml4ICsgY3VyX2xpbmUuc3RyaXAoKSkKKworCitkZWYgV3JhcENvZGUobGluZSwgbGluZV9jb25jYXQsIG91dHB1dCk6CisgIGluZGVudCA9IGxlbihsaW5lKSAtIGxlbihsaW5lLmxzdHJpcCgpKQorICBwcmVmaXggPSBpbmRlbnQqJyAnICAjIFByZWZpeCBvZiB0aGUgY3VycmVudCBsaW5lCisgIG1heF9sZW4gPSA4MCAtIGluZGVudCAtIGxlbihsaW5lX2NvbmNhdCkgICMgTWF4aW11bSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgbGluZQorICBuZXdfcHJlZml4ID0gcHJlZml4ICsgNConICcgICMgUHJlZml4IG9mIGEgY29udGludWF0aW9uIGxpbmUKKyAgbmV3X21heF9sZW4gPSBtYXhfbGVuIC0gNCAgIyBNYXhpbXVtIGxlbmd0aCBvZiBhIGNvbnRpbnVhdGlvbiBsaW5lCisgICMgUHJlZmVycyB0byB3cmFwIGEgbGluZSBhZnRlciBhICcsJyBvciAnOycuCisgIHNlZ3MgPSBbc2VnIGZvciBzZWcgaW4gcmUuc3BsaXQocicoW14sO10rWyw7XT8pJywgbGluZS5zdHJpcCgpKSBpZiBzZWcgIT0gJyddCisgIGN1cl9saW5lID0gJycgICMgVGhlIGN1cnJlbnQgbGluZSB3aXRob3V0IGxlYWRpbmcgc3BhY2VzLgorICBmb3Igc2VnIGluIHNlZ3M6CisgICAgIyBJZiB0aGUgbGluZSBpcyBzdGlsbCB0b28gbG9uZywgd3JhcCBhdCBhIHNwYWNlLgorICAgIHdoaWxlIGN1cl9saW5lID09ICcnIGFuZCBsZW4oc2VnLnN0cmlwKCkpID4gbWF4X2xlbjoKKyAgICAgIHNlZyA9IHNlZy5sc3RyaXAoKQorICAgICAgc3BsaXRfYXQgPSBzZWcucmZpbmQoJyAnLCAwLCBtYXhfbGVuKQorICAgICAgb3V0cHV0LmFwcGVuZChwcmVmaXggKyBzZWdbOnNwbGl0X2F0XS5zdHJpcCgpICsgbGluZV9jb25jYXQpCisgICAgICBzZWcgPSBzZWdbc3BsaXRfYXQgKyAxOl0KKyAgICAgIHByZWZpeCA9IG5ld19wcmVmaXgKKyAgICAgIG1heF9sZW4gPSBuZXdfbWF4X2xlbgorCisgICAgaWYgbGVuKChjdXJfbGluZSArIHNlZykucnN0cmlwKCkpIDwgbWF4X2xlbjoKKyAgICAgIGN1cl9saW5lID0gKGN1cl9saW5lICsgc2VnKS5sc3RyaXAoKQorICAgIGVsc2U6CisgICAgICBvdXRwdXQuYXBwZW5kKHByZWZpeCArIGN1cl9saW5lLnJzdHJpcCgpICsgbGluZV9jb25jYXQpCisgICAgICBwcmVmaXggPSBuZXdfcHJlZml4CisgICAgICBtYXhfbGVuID0gbmV3X21heF9sZW4KKyAgICAgIGN1cl9saW5lID0gc2VnLmxzdHJpcCgpCisgIGlmIGN1cl9saW5lLnN0cmlwKCkgIT0gJyc6CisgICAgb3V0cHV0LmFwcGVuZChwcmVmaXggKyBjdXJfbGluZS5zdHJpcCgpKQorCisKK2RlZiBXcmFwUHJlcHJvY2Vzc29yRGlyZWN0aXZlKGxpbmUsIG91dHB1dCk6CisgIFdyYXBDb2RlKGxpbmUsICcgXFwnLCBvdXRwdXQpCisKKworZGVmIFdyYXBQbGFpbkNvZGUobGluZSwgb3V0cHV0KToKKyAgV3JhcENvZGUobGluZSwgJycsIG91dHB1dCkKKworCitkZWYgSXNNdWx0aUxpbmVJV1lVUHJhZ21hKGxpbmUpOgorICByZXR1cm4gcmUuc2VhcmNoKHInL1wqIElXWVUgcHJhZ21hOiAnLCBsaW5lKQorCisKK2RlZiBJc0hlYWRlckd1YXJkSW5jbHVkZU9yT25lTGluZUlXWVVQcmFnbWEobGluZSk6CisgIHJldHVybiAocmUubWF0Y2gocideIyhpZm5kZWZ8ZGVmaW5lfGVuZGlmXHMqLy8pXHMqW1x3X10rXHMqJCcsIGxpbmUpIG9yCisgICAgICAgICAgcmUubWF0Y2gocideI2luY2x1ZGVccycsIGxpbmUpIG9yCisgICAgICAgICAgIyBEb24ndCBicmVhayBJV1lVIHByYWdtYXMsIGVpdGhlcjsgdGhhdCBjYXVzZXMgaXd5dS5weSBwcm9ibGVtcy4KKyAgICAgICAgICByZS5zZWFyY2gocicvLyBJV1lVIHByYWdtYTogJywgbGluZSkpCisKKworZGVmIFdyYXBMb25nTGluZShsaW5lLCBvdXRwdXQpOgorICBsaW5lID0gbGluZS5yc3RyaXAoKQorICBpZiBsZW4obGluZSkgPD0gODA6CisgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorICBlbGlmIElzU2luZ2xlTGluZUNvbW1lbnQobGluZSk6CisgICAgaWYgSXNIZWFkZXJHdWFyZEluY2x1ZGVPck9uZUxpbmVJV1lVUHJhZ21hKGxpbmUpOgorICAgICAgIyBUaGUgc3R5bGUgZ3VpZGUgbWFkZSBhbiBleGNlcHRpb24gdG8gYWxsb3cgbG9uZyBoZWFkZXIgZ3VhcmQgbGluZXMsCisgICAgICAjIGluY2x1ZGVzIGFuZCBJV1lVIHByYWdtYXMuCisgICAgICBvdXRwdXQuYXBwZW5kKGxpbmUpCisgICAgZWxzZToKKyAgICAgIFdyYXBDb21tZW50KGxpbmUsIG91dHB1dCkKKyAgZWxpZiBJc0luUHJlcHJvY2Vzc29yRGlyZWN0aXZlKG91dHB1dCwgbGluZSk6CisgICAgaWYgSXNIZWFkZXJHdWFyZEluY2x1ZGVPck9uZUxpbmVJV1lVUHJhZ21hKGxpbmUpOgorICAgICAgIyBUaGUgc3R5bGUgZ3VpZGUgbWFkZSBhbiBleGNlcHRpb24gdG8gYWxsb3cgbG9uZyBoZWFkZXIgZ3VhcmQgbGluZXMsCisgICAgICAjIGluY2x1ZGVzIGFuZCBJV1lVIHByYWdtYXMuCisgICAgICBvdXRwdXQuYXBwZW5kKGxpbmUpCisgICAgZWxzZToKKyAgICAgIFdyYXBQcmVwcm9jZXNzb3JEaXJlY3RpdmUobGluZSwgb3V0cHV0KQorICBlbGlmIElzTXVsdGlMaW5lSVdZVVByYWdtYShsaW5lKToKKyAgICBvdXRwdXQuYXBwZW5kKGxpbmUpCisgIGVsc2U6CisgICAgV3JhcFBsYWluQ29kZShsaW5lLCBvdXRwdXQpCisKKworZGVmIEJlYXV0aWZ5Q29kZShzdHJpbmcpOgorICBsaW5lcyA9IHN0cmluZy5zcGxpdGxpbmVzKCkKKyAgb3V0cHV0ID0gW10KKyAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgV3JhcExvbmdMaW5lKGxpbmUsIG91dHB1dCkKKyAgb3V0cHV0MiA9IFtsaW5lLnJzdHJpcCgpIGZvciBsaW5lIGluIG91dHB1dF0KKyAgcmV0dXJuICdcbicuam9pbihvdXRwdXQyKSArICdcbicKKworCitkZWYgQ29udmVydEZyb21QdW1wU291cmNlKHNyY190ZXh0KToKKyAgIiIiUmV0dXJuIHRoZSB0ZXh0IGdlbmVyYXRlZCBmcm9tIHRoZSBnaXZlbiBQdW1wIHNvdXJjZSB0ZXh0LiIiIgorICBhc3QgPSBQYXJzZVRvQVNUKFN0cmlwTWV0YUNvbW1lbnRzKHNyY190ZXh0KSkKKyAgb3V0cHV0ID0gT3V0cHV0KCkKKyAgUnVuQ29kZShFbnYoKSwgYXN0LCBvdXRwdXQpCisgIHJldHVybiBCZWF1dGlmeUNvZGUob3V0cHV0LnN0cmluZykKKworCitkZWYgbWFpbihhcmd2KToKKyAgaWYgbGVuKGFyZ3YpID09IDE6CisgICAgcHJpbnQgX19kb2NfXworICAgIHN5cy5leGl0KDEpCisKKyAgZmlsZV9wYXRoID0gYXJndlstMV0KKyAgb3V0cHV0X3N0ciA9IENvbnZlcnRGcm9tUHVtcFNvdXJjZShmaWxlKGZpbGVfcGF0aCwgJ3InKS5yZWFkKCkpCisgIGlmIGZpbGVfcGF0aC5lbmRzd2l0aCgnLnB1bXAnKToKKyAgICBvdXRwdXRfZmlsZV9wYXRoID0gZmlsZV9wYXRoWzotNV0KKyAgZWxzZToKKyAgICBvdXRwdXRfZmlsZV9wYXRoID0gJy0nCisgIGlmIG91dHB1dF9maWxlX3BhdGggPT0gJy0nOgorICAgIHByaW50IG91dHB1dF9zdHIsCisgIGVsc2U6CisgICAgb3V0cHV0X2ZpbGUgPSBmaWxlKG91dHB1dF9maWxlX3BhdGgsICd3JykKKyAgICBvdXRwdXRfZmlsZS53cml0ZSgnLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDpcbicpCisgICAgb3V0cHV0X2ZpbGUud3JpdGUoJy8vICAgICAlcyAlc1xuJyAlCisgICAgICAgICAgICAgICAgICAgICAgKG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVfcGF0aCkpKQorICAgIG91dHB1dF9maWxlLndyaXRlKCcvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhXG5cbicpCisgICAgb3V0cHV0X2ZpbGUud3JpdGUob3V0cHV0X3N0cikKKyAgICBvdXRwdXRfZmlsZS5jbG9zZSgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL3JlbGVhc2VfZG9jcy5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL3JlbGVhc2VfZG9jcy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjkxMzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NjcmlwdHMvcmVsZWFzZV9kb2NzLnB5CkBAIC0wLDAgKzEsMTU4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlNjcmlwdCBmb3IgYnJhbmNoaW5nIEdvb2dsZSBUZXN0L01vY2sgd2lraSBwYWdlcyBmb3IgYSBuZXcgdmVyc2lvbi4KKworU1lOT1BTSVMKKyAgICAgICByZWxlYXNlX2RvY3MucHkgTkVXX1JFTEVBU0VfVkVSU0lPTgorCisgICAgICAgR29vZ2xlIFRlc3QgYW5kIEdvb2dsZSBNb2NrJ3MgZXh0ZXJuYWwgdXNlciBkb2N1bWVudGF0aW9uIGlzIGluCisgICAgICAgaW50ZXJsaW5rZWQgd2lraSBmaWxlcy4gIFdoZW4gd2UgcmVsZWFzZSBhIG5ldyB2ZXJzaW9uIG9mCisgICAgICAgR29vZ2xlIFRlc3Qgb3IgR29vZ2xlIE1vY2ssIHdlIG5lZWQgdG8gYnJhbmNoIHRoZSB3aWtpIGZpbGVzCisgICAgICAgc3VjaCB0aGF0IHVzZXJzIG9mIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBHb29nbGUgVGVzdC9Nb2NrIGNhbgorICAgICAgIGxvb2sgdXAgZG9jdW1lbmF0aW9uIHJlbGV2YW50IGZvciB0aGF0IHZlcnNpb24uICBUaGlzIHNjcmlwdAorICAgICAgIGF1dG9tYXRlcyB0aGF0IHByb2Nlc3MgYnk6CisKKyAgICAgICAgIC0gYnJhbmNoaW5nIHRoZSBjdXJyZW50IHdpa2kgcGFnZXMgKHdoaWNoIGRvY3VtZW50IHRoZQorICAgICAgICAgICBiZWhhdmlvciBvZiB0aGUgU1ZOIHRydW5rIGhlYWQpIHRvIHBhZ2VzIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgIHZlcnNpb24gKGUuZy4gYnJhbmNoaW5nIEZBUS53aWtpIHRvIFYyXzZfRkFRLndpa2kgd2hlbgorICAgICAgICAgICBORVdfUkVMRUFTRV9WRVJTSU9OIGlzIDIuNik7CisgICAgICAgICAtIHVwZGF0aW5nIHRoZSBsaW5rcyBpbiB0aGUgYnJhbmNoZWQgZmlsZXMgdG8gcG9pbnQgdG8gdGhlIGJyYW5jaGVkCisgICAgICAgICAgIHZlcnNpb24gKGUuZy4gYSBsaW5rIGluIFYyXzZfRkFRLndpa2kgdGhhdCBwb2ludGVkIHRvCisgICAgICAgICAgIFByaW1lci53aWtpI0FuY2hvciB3aWxsIG5vdyBwb2ludCB0byBWMl82X1ByaW1lci53aWtpI0FuY2hvcikuCisKKyAgICAgICBOT1RFOiBORVdfUkVMRUFTRV9WRVJTSU9OIG11c3QgYmUgYSBORVcgdmVyc2lvbiBudW1iZXIgZm9yCisgICAgICAgd2hpY2ggdGhlIHdpa2kgcGFnZXMgZG9uJ3QgeWV0IGV4aXN0OyBvdGhlcndpc2UgeW91J2xsIGdldCBTVk4KKyAgICAgICBlcnJvcnMgbGlrZSAic3ZuOiBQYXRoICdWMV83X1B1bXBNYW51YWwud2lraScgaXMgbm90IGEKKyAgICAgICBkaXJlY3RvcnkiIHdoZW4gcnVubmluZyB0aGUgc2NyaXB0LgorCitFWEFNUExFCisgICAgICAgJCBjZCBQQVRIL1RPL0dURVNUX1NWTl9XT1JLU1BBQ0UvdHJ1bmsKKyAgICAgICAkIHNjcmlwdHMvcmVsZWFzZV9kb2NzLnB5IDIuNiAgIyBjcmVhdGUgd2lraSBwYWdlcyBmb3IgdjIuNgorICAgICAgICQgc3ZuIHN0YXR1cyAgICAgICAgICAgICAgICAgICAjIHZlcmlmeSB0aGUgZmlsZSBsaXN0CisgICAgICAgJCBzdm4gZGlmZiAgICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IHRoZSBmaWxlIGNvbnRlbnRzCisgICAgICAgJCBzdm4gY29tbWl0IC1tICJyZWxlYXNlIHdpa2kgcGFnZXMgZm9yIHYyLjYiCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworaW1wb3J0IGNvbW1vbgorCisKKyMgV2lraSBwYWdlcyB0aGF0IHNob3VsZG4ndCBiZSBicmFuY2hlZCBmb3IgZXZlcnkgZ3Rlc3QvZ21vY2sgcmVsZWFzZS4KK0dURVNUX1VOVkVSU0lPTkVEX1dJS0lTID0gWydEZXZHdWlkZS53aWtpJ10KK0dNT0NLX1VOVkVSU0lPTkVEX1dJS0lTID0gWworICAgICdEZXNpZ25Eb2Mud2lraScsCisgICAgJ0Rldkd1aWRlLndpa2knLAorICAgICdLbm93bklzc3Vlcy53aWtpJworICAgIF0KKworCitkZWYgRHJvcFdpa2lTdWZmaXgod2lraV9maWxlbmFtZSk6CisgICIiIlJlbW92ZXMgdGhlIC53aWtpIHN1ZmZpeCAoaWYgYW55KSBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZS4iIiIKKworICByZXR1cm4gKHdpa2lfZmlsZW5hbWVbOi1sZW4oJy53aWtpJyldIGlmIHdpa2lfZmlsZW5hbWUuZW5kc3dpdGgoJy53aWtpJykKKyAgICAgICAgICBlbHNlIHdpa2lfZmlsZW5hbWUpCisKKworY2xhc3MgV2lraUJyYW5jaGVyKG9iamVjdCk6CisgICIiIkJyYW5jaGVzIC4uLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBkb3RfdmVyc2lvbik6CisgICAgc2VsZi5wcm9qZWN0LCBzdm5fcm9vdF9wYXRoID0gY29tbW9uLkdldFN2bkluZm8oKQorICAgIGlmIHNlbGYucHJvamVjdCBub3QgaW4gKCdnb29nbGV0ZXN0JywgJ2dvb2dsZW1vY2snKToKKyAgICAgIHN5cy5leGl0KCdUaGlzIHNjcmlwdCBtdXN0IGJlIHJ1biBpbiBhIGd0ZXN0IG9yIGdtb2NrIFNWTiB3b3Jrc3BhY2UuJykKKyAgICBzZWxmLndpa2lfZGlyID0gc3ZuX3Jvb3RfcGF0aCArICcvd2lraScKKyAgICAjIFR1cm4gJzIuNicgdG8gJ1YyXzZfJy4KKyAgICBzZWxmLnZlcnNpb25fcHJlZml4ID0gJ1YnICsgZG90X3ZlcnNpb24ucmVwbGFjZSgnLicsICdfJykgKyAnXycKKyAgICBzZWxmLmZpbGVzX3RvX2JyYW5jaCA9IHNlbGYuR2V0RmlsZXNUb0JyYW5jaCgpCisgICAgcGFnZV9uYW1lcyA9IFtEcm9wV2lraVN1ZmZpeChmKSBmb3IgZiBpbiBzZWxmLmZpbGVzX3RvX2JyYW5jaF0KKyAgICAjIEEgbGluayB0byBGb28ud2lraSBpcyBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAgICAjICAgW0ZvbyB3b3Jkc10KKyAgICAjICAgW0ZvbyNBbmNob3Igd29yZHNdCisgICAgIyAgIFtodHRwOi8vY29kZS5nb29nbGUuY29tLy4uLi93aWtpL0ZvbyB3b3Jkc10KKyAgICAjICAgW2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vLi4uL3dpa2kvRm9vI0FuY2hvciB3b3Jkc10KKyAgICAjIFdlIHdhbnQgdG8gcmVwbGFjZSAnRm9vJyB3aXRoICdWMl82X0ZvbycgaW4gdGhlIGFib3ZlIGNhc2VzLgorICAgIHNlbGYuc2VhcmNoX2Zvcl9yZSA9IHJlLmNvbXBpbGUoCisgICAgICAgICMgVGhpcyByZWdleCBtYXRjaGVzIGVpdGhlcgorICAgICAgICAjICAgW0ZvbworICAgICAgICAjIG9yCisgICAgICAgICMgICAvd2lraS9Gb28KKyAgICAgICAgIyBmb2xsb3dlZCBieSBhIHNwYWNlIG9yIGEgIywgd2hlcmUgRm9vIGlzIHRoZSBuYW1lIG9mIGFuCisgICAgICAgICMgdW52ZXJzaW9uZWQgd2lraSBwYWdlLgorICAgICAgICByJyhcW3wvd2lraS8pKCVzKShbICNdKScgJSAnfCcuam9pbihwYWdlX25hbWVzKSkKKyAgICBzZWxmLnJlcGxhY2Vfd2l0aCA9IHInXDElc1wyXDMnICUgKHNlbGYudmVyc2lvbl9wcmVmaXgsKQorCisgIGRlZiBHZXRGaWxlc1RvQnJhbmNoKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBsaXN0IG9mIC53aWtpIGZpbGUgbmFtZXMgdGhhdCBuZWVkIHRvIGJlIGJyYW5jaGVkLiIiIgorCisgICAgdW52ZXJzaW9uZWRfd2lraXMgPSAoR1RFU1RfVU5WRVJTSU9ORURfV0lLSVMgaWYgc2VsZi5wcm9qZWN0ID09ICdnb29nbGV0ZXN0JworICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgR01PQ0tfVU5WRVJTSU9ORURfV0lLSVMpCisgICAgcmV0dXJuIFtmIGZvciBmIGluIG9zLmxpc3RkaXIoc2VsZi53aWtpX2RpcikKKyAgICAgICAgICAgIGlmIChmLmVuZHN3aXRoKCcud2lraScpIGFuZAorICAgICAgICAgICAgICAgIG5vdCByZS5tYXRjaChyJ15WXGQnLCBmKSBhbmQgICMgRXhjbHVkZWQgdmVyc2lvbmVkIC53aWtpIGZpbGVzLgorICAgICAgICAgICAgICAgIGYgbm90IGluIHVudmVyc2lvbmVkX3dpa2lzKV0KKworICBkZWYgQnJhbmNoRmlsZXMoc2VsZik6CisgICAgIiIiQnJhbmNoZXMgdGhlIC53aWtpIGZpbGVzIG5lZWRlZCB0byBiZSBicmFuY2hlZC4iIiIKKworICAgIHByaW50ICdCcmFuY2hpbmcgJWQgLndpa2kgZmlsZXM6JyAlIChsZW4oc2VsZi5maWxlc190b19icmFuY2gpLCkKKyAgICBvcy5jaGRpcihzZWxmLndpa2lfZGlyKQorICAgIGZvciBmIGluIHNlbGYuZmlsZXNfdG9fYnJhbmNoOgorICAgICAgY29tbWFuZCA9ICdzdm4gY3AgJXMgJXMlcycgJSAoZiwgc2VsZi52ZXJzaW9uX3ByZWZpeCwgZikKKyAgICAgIHByaW50IGNvbW1hbmQKKyAgICAgIG9zLnN5c3RlbShjb21tYW5kKQorCisgIGRlZiBVcGRhdGVMaW5rc0luQnJhbmNoZWRGaWxlcyhzZWxmKToKKworICAgIGZvciBmIGluIHNlbGYuZmlsZXNfdG9fYnJhbmNoOgorICAgICAgc291cmNlX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi53aWtpX2RpciwgZikKKyAgICAgIHZlcnNpb25lZF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYud2lraV9kaXIsIHNlbGYudmVyc2lvbl9wcmVmaXggKyBmKQorICAgICAgcHJpbnQgJ1VwZGF0aW5nIGxpbmtzIGluICVzLicgJSAodmVyc2lvbmVkX2ZpbGUsKQorICAgICAgdGV4dCA9IGZpbGUoc291cmNlX2ZpbGUsICdyJykucmVhZCgpCisgICAgICBuZXdfdGV4dCA9IHNlbGYuc2VhcmNoX2Zvcl9yZS5zdWIoc2VsZi5yZXBsYWNlX3dpdGgsIHRleHQpCisgICAgICBmaWxlKHZlcnNpb25lZF9maWxlLCAndycpLndyaXRlKG5ld190ZXh0KQorCisKK2RlZiBtYWluKCk6CisgIGlmIGxlbihzeXMuYXJndikgIT0gMjoKKyAgICBzeXMuZXhpdChfX2RvY19fKQorCisgIGJyYW5jaGVyID0gV2lraUJyYW5jaGVyKHN5cy5hcmd2WzFdKQorICBicmFuY2hlci5CcmFuY2hGaWxlcygpCisgIGJyYW5jaGVyLlVwZGF0ZUxpbmtzSW5CcmFuY2hlZEZpbGVzKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL3Rlc3QvTWFrZWZpbGUgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy90ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZmY1ODQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy90ZXN0L01ha2VmaWxlCkBAIC0wLDAgKzEsNTkgQEAKKyMgQSBNYWtlZmlsZSBmb3IgZnVzaW5nIEdvb2dsZSBUZXN0IGFuZCBidWlsZGluZyBhIHNhbXBsZSB0ZXN0IGFnYWluc3QgaXQuCisjCisjIFNZTk9QU0lTOgorIworIyAgIG1ha2UgW2FsbF0gIC0gbWFrZXMgZXZlcnl0aGluZy4KKyMgICBtYWtlIFRBUkdFVCAtIG1ha2VzIHRoZSBnaXZlbiB0YXJnZXQuCisjICAgbWFrZSBjaGVjayAgLSBtYWtlcyBldmVyeXRoaW5nIGFuZCBydW5zIHRoZSBidWlsdCBzYW1wbGUgdGVzdC4KKyMgICBtYWtlIGNsZWFuICAtIHJlbW92ZXMgYWxsIGZpbGVzIGdlbmVyYXRlZCBieSBtYWtlLgorCisjIFBvaW50cyB0byB0aGUgcm9vdCBvZiBmdXNlZCBHb29nbGUgVGVzdCwgcmVsYXRpdmUgdG8gd2hlcmUgdGhpcyBmaWxlIGlzLgorRlVTRURfR1RFU1RfRElSID0gb3V0cHV0CisKKyMgUGF0aHMgdG8gdGhlIGZ1c2VkIGd0ZXN0IGZpbGVzLgorRlVTRURfR1RFU1RfSCA9ICQoRlVTRURfR1RFU1RfRElSKS9ndGVzdC9ndGVzdC5oCitGVVNFRF9HVEVTVF9BTExfQ0MgPSAkKEZVU0VEX0dURVNUX0RJUikvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCisKKyMgV2hlcmUgdG8gZmluZCB0aGUgc2FtcGxlIHRlc3QuCitTQU1QTEVfRElSID0gLi4vLi4vc2FtcGxlcworCisjIFdoZXJlIHRvIGZpbmQgZ3Rlc3RfbWFpbi5jYy4KK0dURVNUX01BSU5fQ0MgPSAuLi8uLi9zcmMvZ3Rlc3RfbWFpbi5jYworCisjIEZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yLgorIyBXZSBoYXZlIG5vIGlkZWEgaGVyZSB3aGV0aGVyIHB0aHJlYWRzIGlzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLCBzbworIyBkaXNhYmxlIGl0cyB1c2UuCitDUFBGTEFHUyArPSAtSSQoRlVTRURfR1RFU1RfRElSKSAtREdURVNUX0hBU19QVEhSRUFEPTAKKworIyBGbGFncyBwYXNzZWQgdG8gdGhlIEMrKyBjb21waWxlci4KK0NYWEZMQUdTICs9IC1nCisKK2FsbCA6IHNhbXBsZTFfdW5pdHRlc3QKKworY2hlY2sgOiBhbGwKKwkuL3NhbXBsZTFfdW5pdHRlc3QKKworY2xlYW4gOgorCXJtIC1yZiAkKEZVU0VEX0dURVNUX0RJUikgc2FtcGxlMV91bml0dGVzdCAqLm8KKworJChGVVNFRF9HVEVTVF9IKSA6CisJLi4vZnVzZV9ndGVzdF9maWxlcy5weSAkKEZVU0VEX0dURVNUX0RJUikKKworJChGVVNFRF9HVEVTVF9BTExfQ0MpIDoKKwkuLi9mdXNlX2d0ZXN0X2ZpbGVzLnB5ICQoRlVTRURfR1RFU1RfRElSKQorCitndGVzdC1hbGwubyA6ICQoRlVTRURfR1RFU1RfSCkgJChGVVNFRF9HVEVTVF9BTExfQ0MpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoRlVTRURfR1RFU1RfRElSKS9ndGVzdC9ndGVzdC1hbGwuY2MKKworZ3Rlc3RfbWFpbi5vIDogJChGVVNFRF9HVEVTVF9IKSAkKEdURVNUX01BSU5fQ0MpCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoR1RFU1RfTUFJTl9DQykKKworc2FtcGxlMS5vIDogJChTQU1QTEVfRElSKS9zYW1wbGUxLmNjICQoU0FNUExFX0RJUikvc2FtcGxlMS5oCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpIC1jICQoU0FNUExFX0RJUikvc2FtcGxlMS5jYworCitzYW1wbGUxX3VuaXR0ZXN0Lm8gOiAkKFNBTVBMRV9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MgXAorICAgICAgICAgICAgICAgICAgICAgJChTQU1QTEVfRElSKS9zYW1wbGUxLmggJChGVVNFRF9HVEVTVF9IKQorCSQoQ1hYKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAtYyAkKFNBTVBMRV9ESVIpL3NhbXBsZTFfdW5pdHRlc3QuY2MKKworc2FtcGxlMV91bml0dGVzdCA6IHNhbXBsZTEubyBzYW1wbGUxX3VuaXR0ZXN0Lm8gZ3Rlc3QtYWxsLm8gZ3Rlc3RfbWFpbi5vCisJJChDWFgpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpICReIC1vICRACmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy91cGxvYWQucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy91cGxvYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU2ZjlhMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL3VwbG9hZC5weQpAQCAtMCwwICsxLDEzODcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJUb29sIGZvciB1cGxvYWRpbmcgZGlmZnMgZnJvbSBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gdG8gdGhlIGNvZGVyZXZpZXcgYXBwLgorCitVc2FnZSBzdW1tYXJ5OiB1cGxvYWQucHkgW29wdGlvbnNdIFstLSBkaWZmX29wdGlvbnNdCisKK0RpZmYgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBkaWZmIGNvbW1hbmQgb2YgdGhlIHVuZGVybHlpbmcgc3lzdGVtLgorCitTdXBwb3J0ZWQgdmVyc2lvbiBjb250cm9sIHN5c3RlbXM6CisgIEdpdAorICBNZXJjdXJpYWwKKyAgU3VidmVyc2lvbgorCitJdCBpcyBpbXBvcnRhbnQgZm9yIEdpdC9NZXJjdXJpYWwgdXNlcnMgdG8gc3BlY2lmeSBhIHRyZWUvbm9kZS9icmFuY2ggdG8gZGlmZgorYWdhaW5zdCBieSB1c2luZyB0aGUgJy0tcmV2JyBvcHRpb24uCisiIiIKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBhcHBjZmcucHkgaW4gdGhlIEFwcCBFbmdpbmUgU0RLIChvcGVuIHNvdXJjZSksCisjIGFuZCBmcm9tIEFTUE4gcmVjaXBlICMxNDYzMDYuCisKK2ltcG9ydCBjb29raWVsaWIKK2ltcG9ydCBnZXRwYXNzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG1kNQoraW1wb3J0IG1pbWV0eXBlcworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB1cmxsaWIyCitpbXBvcnQgdXJscGFyc2UKKwordHJ5OgorICBpbXBvcnQgcmVhZGxpbmUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgcGFzcworCisjIFRoZSBsb2dnaW5nIHZlcmJvc2l0eToKKyMgIDA6IEVycm9ycyBvbmx5LgorIyAgMTogU3RhdHVzIG1lc3NhZ2VzLgorIyAgMjogSW5mbyBsb2dzLgorIyAgMzogRGVidWcgbG9ncy4KK3ZlcmJvc2l0eSA9IDEKKworIyBNYXggc2l6ZSBvZiBwYXRjaCBvciBiYXNlIGZpbGUuCitNQVhfVVBMT0FEX1NJWkUgPSA5MDAgKiAxMDI0CisKKworZGVmIEdldEVtYWlsKHByb21wdCk6CisgICIiIlByb21wdHMgdGhlIHVzZXIgZm9yIHRoZWlyIGVtYWlsIGFkZHJlc3MgYW5kIHJldHVybnMgaXQuCisKKyAgVGhlIGxhc3QgdXNlZCBlbWFpbCBhZGRyZXNzIGlzIHNhdmVkIHRvIGEgZmlsZSBhbmQgb2ZmZXJlZCB1cCBhcyBhIHN1Z2dlc3Rpb24KKyAgdG8gdGhlIHVzZXIuIElmIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIgd2l0aG91dCB0eXBpbmcgaW4gYW55dGhpbmcgdGhlIGxhc3QKKyAgdXNlZCBlbWFpbCBhZGRyZXNzIGlzIHVzZWQuIElmIHRoZSB1c2VyIGVudGVycyBhIG5ldyBhZGRyZXNzLCBpdCBpcyBzYXZlZAorICBmb3IgbmV4dCB0aW1lIHdlIHByb21wdC4KKworICAiIiIKKyAgbGFzdF9lbWFpbF9maWxlX25hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxhc3RfY29kZXJldmlld19lbWFpbF9hZGRyZXNzIikKKyAgbGFzdF9lbWFpbCA9ICIiCisgIGlmIG9zLnBhdGguZXhpc3RzKGxhc3RfZW1haWxfZmlsZV9uYW1lKToKKyAgICB0cnk6CisgICAgICBsYXN0X2VtYWlsX2ZpbGUgPSBvcGVuKGxhc3RfZW1haWxfZmlsZV9uYW1lLCAiciIpCisgICAgICBsYXN0X2VtYWlsID0gbGFzdF9lbWFpbF9maWxlLnJlYWRsaW5lKCkuc3RyaXAoIlxuIikKKyAgICAgIGxhc3RfZW1haWxfZmlsZS5jbG9zZSgpCisgICAgICBwcm9tcHQgKz0gIiBbJXNdIiAlIGxhc3RfZW1haWwKKyAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgIHBhc3MKKyAgZW1haWwgPSByYXdfaW5wdXQocHJvbXB0ICsgIjogIikuc3RyaXAoKQorICBpZiBlbWFpbDoKKyAgICB0cnk6CisgICAgICBsYXN0X2VtYWlsX2ZpbGUgPSBvcGVuKGxhc3RfZW1haWxfZmlsZV9uYW1lLCAidyIpCisgICAgICBsYXN0X2VtYWlsX2ZpbGUud3JpdGUoZW1haWwpCisgICAgICBsYXN0X2VtYWlsX2ZpbGUuY2xvc2UoKQorICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgcGFzcworICBlbHNlOgorICAgIGVtYWlsID0gbGFzdF9lbWFpbAorICByZXR1cm4gZW1haWwKKworCitkZWYgU3RhdHVzVXBkYXRlKG1zZyk6CisgICIiIlByaW50IGEgc3RhdHVzIG1lc3NhZ2UgdG8gc3Rkb3V0LgorCisgIElmICd2ZXJib3NpdHknIGlzIGdyZWF0ZXIgdGhhbiAwLCBwcmludCB0aGUgbWVzc2FnZS4KKworICBBcmdzOgorICAgIG1zZzogVGhlIHN0cmluZyB0byBwcmludC4KKyAgIiIiCisgIGlmIHZlcmJvc2l0eSA+IDA6CisgICAgcHJpbnQgbXNnCisKKworZGVmIEVycm9yRXhpdChtc2cpOgorICAiIiJQcmludCBhbiBlcnJvciBtZXNzYWdlIHRvIHN0ZGVyciBhbmQgZXhpdC4iIiIKKyAgcHJpbnQgPj5zeXMuc3RkZXJyLCBtc2cKKyAgc3lzLmV4aXQoMSkKKworCitjbGFzcyBDbGllbnRMb2dpbkVycm9yKHVybGxpYjIuSFRUUEVycm9yKToKKyAgIiIiUmFpc2VkIHRvIGluZGljYXRlIHRoZXJlIHdhcyBhbiBlcnJvciBhdXRoZW50aWNhdGluZyB3aXRoIENsaWVudExvZ2luLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGNvZGUsIG1zZywgaGVhZGVycywgYXJncyk6CisgICAgdXJsbGliMi5IVFRQRXJyb3IuX19pbml0X18oc2VsZiwgdXJsLCBjb2RlLCBtc2csIGhlYWRlcnMsIE5vbmUpCisgICAgc2VsZi5hcmdzID0gYXJncworICAgIHNlbGYucmVhc29uID0gYXJnc1siRXJyb3IiXQorCisKK2NsYXNzIEFic3RyYWN0UnBjU2VydmVyKG9iamVjdCk6CisgICIiIlByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZSBmb3IgYSBzaW1wbGUgUlBDIHNlcnZlci4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgYXV0aF9mdW5jdGlvbiwgaG9zdF9vdmVycmlkZT1Ob25lLCBleHRyYV9oZWFkZXJzPXt9LAorICAgICAgICAgICAgICAgc2F2ZV9jb29raWVzPUZhbHNlKToKKyAgICAiIiJDcmVhdGVzIGEgbmV3IEh0dHBScGNTZXJ2ZXIuCisKKyAgICBBcmdzOgorICAgICAgaG9zdDogVGhlIGhvc3QgdG8gc2VuZCByZXF1ZXN0cyB0by4KKyAgICAgIGF1dGhfZnVuY3Rpb246IEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4KKyAgICAgICAgKGVtYWlsLCBwYXNzd29yZCkgdHVwbGUgd2hlbiBjYWxsZWQuIFdpbGwgYmUgY2FsbGVkIGlmIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGlzIHJlcXVpcmVkLgorICAgICAgaG9zdF9vdmVycmlkZTogVGhlIGhvc3QgaGVhZGVyIHRvIHNlbmQgdG8gdGhlIHNlcnZlciAoZGVmYXVsdHMgdG8gaG9zdCkuCisgICAgICBleHRyYV9oZWFkZXJzOiBBIGRpY3Qgb2YgZXh0cmEgaGVhZGVycyB0byBhcHBlbmQgdG8gZXZlcnkgcmVxdWVzdC4KKyAgICAgIHNhdmVfY29va2llczogSWYgVHJ1ZSwgc2F2ZSB0aGUgYXV0aGVudGljYXRpb24gY29va2llcyB0byBsb2NhbCBkaXNrLgorICAgICAgICBJZiBGYWxzZSwgdXNlIGFuIGluLW1lbW9yeSBjb29raWVqYXIgaW5zdGVhZC4gIFN1YmNsYXNzZXMgbXVzdAorICAgICAgICBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5LiAgRGVmYXVsdHMgdG8gRmFsc2UuCisgICAgIiIiCisgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgIHNlbGYuaG9zdF9vdmVycmlkZSA9IGhvc3Rfb3ZlcnJpZGUKKyAgICBzZWxmLmF1dGhfZnVuY3Rpb24gPSBhdXRoX2Z1bmN0aW9uCisgICAgc2VsZi5hdXRoZW50aWNhdGVkID0gRmFsc2UKKyAgICBzZWxmLmV4dHJhX2hlYWRlcnMgPSBleHRyYV9oZWFkZXJzCisgICAgc2VsZi5zYXZlX2Nvb2tpZXMgPSBzYXZlX2Nvb2tpZXMKKyAgICBzZWxmLm9wZW5lciA9IHNlbGYuX0dldE9wZW5lcigpCisgICAgaWYgc2VsZi5ob3N0X292ZXJyaWRlOgorICAgICAgbG9nZ2luZy5pbmZvKCJTZXJ2ZXI6ICVzOyBIb3N0OiAlcyIsIHNlbGYuaG9zdCwgc2VsZi5ob3N0X292ZXJyaWRlKQorICAgIGVsc2U6CisgICAgICBsb2dnaW5nLmluZm8oIlNlcnZlcjogJXMiLCBzZWxmLmhvc3QpCisKKyAgZGVmIF9HZXRPcGVuZXIoc2VsZik6CisgICAgIiIiUmV0dXJucyBhbiBPcGVuZXJEaXJlY3RvciBmb3IgbWFraW5nIEhUVFAgcmVxdWVzdHMuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yIG9iamVjdC4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICBkZWYgX0NyZWF0ZVJlcXVlc3Qoc2VsZiwgdXJsLCBkYXRhPU5vbmUpOgorICAgICIiIkNyZWF0ZXMgYSBuZXcgdXJsbGliIHJlcXVlc3QuIiIiCisgICAgbG9nZ2luZy5kZWJ1ZygiQ3JlYXRpbmcgcmVxdWVzdCBmb3I6ICclcycgd2l0aCBwYXlsb2FkOlxuJXMiLCB1cmwsIGRhdGEpCisgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KHVybCwgZGF0YT1kYXRhKQorICAgIGlmIHNlbGYuaG9zdF9vdmVycmlkZToKKyAgICAgIHJlcS5hZGRfaGVhZGVyKCJIb3N0Iiwgc2VsZi5ob3N0X292ZXJyaWRlKQorICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuZXh0cmFfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgIHJlcS5hZGRfaGVhZGVyKGtleSwgdmFsdWUpCisgICAgcmV0dXJuIHJlcQorCisgIGRlZiBfR2V0QXV0aFRva2VuKHNlbGYsIGVtYWlsLCBwYXNzd29yZCk6CisgICAgIiIiVXNlcyBDbGllbnRMb2dpbiB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIHJldHVybmluZyBhbiBhdXRoIHRva2VuLgorCisgICAgQXJnczoKKyAgICAgIGVtYWlsOiAgICBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MKKyAgICAgIHBhc3N3b3JkOiBUaGUgdXNlcidzIHBhc3N3b3JkCisKKyAgICBSYWlzZXM6CisgICAgICBDbGllbnRMb2dpbkVycm9yOiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYXV0aGVudGljYXRpbmcgd2l0aCBDbGllbnRMb2dpbi4KKyAgICAgIEhUVFBFcnJvcjogSWYgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZm9ybSBvZiBIVFRQIGVycm9yLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiByZXR1cm5lZCBieSBDbGllbnRMb2dpbi4KKyAgICAiIiIKKyAgICBhY2NvdW50X3R5cGUgPSAiR09PR0xFIgorICAgIGlmIHNlbGYuaG9zdC5lbmRzd2l0aCgiLmdvb2dsZS5jb20iKToKKyAgICAgICMgTmVlZGVkIGZvciB1c2UgaW5zaWRlIEdvb2dsZS4KKyAgICAgIGFjY291bnRfdHlwZSA9ICJIT1NURUQiCisgICAgcmVxID0gc2VsZi5fQ3JlYXRlUmVxdWVzdCgKKyAgICAgICAgdXJsPSJodHRwczovL3d3dy5nb29nbGUuY29tL2FjY291bnRzL0NsaWVudExvZ2luIiwKKyAgICAgICAgZGF0YT11cmxsaWIudXJsZW5jb2RlKHsKKyAgICAgICAgICAgICJFbWFpbCI6IGVtYWlsLAorICAgICAgICAgICAgIlBhc3N3ZCI6IHBhc3N3b3JkLAorICAgICAgICAgICAgInNlcnZpY2UiOiAiYWgiLAorICAgICAgICAgICAgInNvdXJjZSI6ICJyaWV0dmVsZC1jb2RlcmV2aWV3LXVwbG9hZCIsCisgICAgICAgICAgICAiYWNjb3VudFR5cGUiOiBhY2NvdW50X3R5cGUsCisgICAgICAgIH0pLAorICAgICkKKyAgICB0cnk6CisgICAgICByZXNwb25zZSA9IHNlbGYub3BlbmVyLm9wZW4ocmVxKQorICAgICAgcmVzcG9uc2VfYm9keSA9IHJlc3BvbnNlLnJlYWQoKQorICAgICAgcmVzcG9uc2VfZGljdCA9IGRpY3QoeC5zcGxpdCgiPSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiByZXNwb25zZV9ib2R5LnNwbGl0KCJcbiIpIGlmIHgpCisgICAgICByZXR1cm4gcmVzcG9uc2VfZGljdFsiQXV0aCJdCisgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCBlOgorICAgICAgaWYgZS5jb2RlID09IDQwMzoKKyAgICAgICAgYm9keSA9IGUucmVhZCgpCisgICAgICAgIHJlc3BvbnNlX2RpY3QgPSBkaWN0KHguc3BsaXQoIj0iLCAxKSBmb3IgeCBpbiBib2R5LnNwbGl0KCJcbiIpIGlmIHgpCisgICAgICAgIHJhaXNlIENsaWVudExvZ2luRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCBlLmNvZGUsIGUubXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGVhZGVycywgcmVzcG9uc2VfZGljdCkKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlCisKKyAgZGVmIF9HZXRBdXRoQ29va2llKHNlbGYsIGF1dGhfdG9rZW4pOgorICAgICIiIkZldGNoZXMgYXV0aGVudGljYXRpb24gY29va2llcyBmb3IgYW4gYXV0aGVudGljYXRpb24gdG9rZW4uCisKKyAgICBBcmdzOgorICAgICAgYXV0aF90b2tlbjogVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHJldHVybmVkIGJ5IENsaWVudExvZ2luLgorCisgICAgUmFpc2VzOgorICAgICAgSFRUUEVycm9yOiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgZmV0Y2hpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMuCisgICAgIiIiCisgICAgIyBUaGlzIGlzIGEgZHVtbXkgdmFsdWUgdG8gYWxsb3cgdXMgdG8gaWRlbnRpZnkgd2hlbiB3ZSdyZSBzdWNjZXNzZnVsLgorICAgIGNvbnRpbnVlX2xvY2F0aW9uID0gImh0dHA6Ly9sb2NhbGhvc3QvIgorICAgIGFyZ3MgPSB7ImNvbnRpbnVlIjogY29udGludWVfbG9jYXRpb24sICJhdXRoIjogYXV0aF90b2tlbn0KKyAgICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KCJodHRwOi8vJXMvX2FoL2xvZ2luPyVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCB1cmxsaWIudXJsZW5jb2RlKGFyZ3MpKSkKKyAgICB0cnk6CisgICAgICByZXNwb25zZSA9IHNlbGYub3BlbmVyLm9wZW4ocmVxKQorICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKKyAgICAgIHJlc3BvbnNlID0gZQorICAgIGlmIChyZXNwb25zZS5jb2RlICE9IDMwMiBvcgorICAgICAgICByZXNwb25zZS5pbmZvKClbImxvY2F0aW9uIl0gIT0gY29udGludWVfbG9jYXRpb24pOgorICAgICAgcmFpc2UgdXJsbGliMi5IVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCByZXNwb25zZS5jb2RlLCByZXNwb25zZS5tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5mcCkKKyAgICBzZWxmLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisKKyAgZGVmIF9BdXRoZW50aWNhdGUoc2VsZik6CisgICAgIiIiQXV0aGVudGljYXRlcyB0aGUgdXNlci4KKworICAgIFRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIHdvcmtzIGFzIGZvbGxvd3M6CisgICAgIDEpIFdlIGdldCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmcm9tIHRoZSB1c2VyCisgICAgIDIpIFdlIHVzZSBDbGllbnRMb2dpbiB0byBvYnRhaW4gYW4gQVVUSCB0b2tlbiBmb3IgdGhlIHVzZXIKKyAgICAgICAgKHNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvYWNjb3VudHMvQXV0aEZvckluc3RhbGxlZEFwcHMuaHRtbCkuCisgICAgIDMpIFdlIHBhc3MgdGhlIGF1dGggdG9rZW4gdG8gL19haC9sb2dpbiBvbiB0aGUgc2VydmVyIHRvIG9idGFpbiBhbgorICAgICAgICBhdXRoZW50aWNhdGlvbiBjb29raWUuIElmIGxvZ2luIHdhcyBzdWNjZXNzZnVsLCBpdCB0cmllcyB0byByZWRpcmVjdAorICAgICAgICB1cyB0byB0aGUgVVJMIHdlIHByb3ZpZGVkLgorCisgICAgSWYgd2UgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIHVwbG9hZCBBUEkgd2l0aG91dCBmaXJzdCBvYnRhaW5pbmcgYW4KKyAgICBhdXRoZW50aWNhdGlvbiBjb29raWUsIGl0IHJldHVybnMgYSA0MDEgcmVzcG9uc2UgYW5kIGRpcmVjdHMgdXMgdG8KKyAgICBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHdpdGggQ2xpZW50TG9naW4uCisgICAgIiIiCisgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICBjcmVkZW50aWFscyA9IHNlbGYuYXV0aF9mdW5jdGlvbigpCisgICAgICB0cnk6CisgICAgICAgIGF1dGhfdG9rZW4gPSBzZWxmLl9HZXRBdXRoVG9rZW4oY3JlZGVudGlhbHNbMF0sIGNyZWRlbnRpYWxzWzFdKQorICAgICAgZXhjZXB0IENsaWVudExvZ2luRXJyb3IsIGU6CisgICAgICAgIGlmIGUucmVhc29uID09ICJCYWRBdXRoZW50aWNhdGlvbiI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZC4iCisgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIkNhcHRjaGFSZXF1aXJlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCisgICAgICAgICAgICAgICJQbGVhc2UgZ28gdG9cbiIKKyAgICAgICAgICAgICAgImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvRGlzcGxheVVubG9ja0NhcHRjaGFcbiIKKyAgICAgICAgICAgICAgImFuZCB2ZXJpZnkgeW91IGFyZSBhIGh1bWFuLiAgVGhlbiB0cnkgYWdhaW4uIikKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiTm90VmVyaWZpZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkFjY291bnQgbm90IHZlcmlmaWVkLiIKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiVGVybXNOb3RBZ3JlZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlVzZXIgaGFzIG5vdCBhZ3JlZWQgdG8gVE9TLiIKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiQWNjb3VudERlbGV0ZWQiOgorICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlRoZSB1c2VyIGFjY291bnQgaGFzIGJlZW4gZGVsZXRlZC4iCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIkFjY291bnREaXNhYmxlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVGhlIHVzZXIgYWNjb3VudCBoYXMgYmVlbiBkaXNhYmxlZC4iCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZS5yZWFzb24gPT0gIlNlcnZpY2VEaXNhYmxlZCI6CisgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoIlRoZSB1c2VyJ3MgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIGhhcyBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQuIikKKyAgICAgICAgICBicmVhaworICAgICAgICBpZiBlLnJlYXNvbiA9PSAiU2VydmljZVVuYXZhaWxhYmxlIjoKKyAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJUaGUgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlOyB0cnkgYWdhaW4gbGF0ZXIuIgorICAgICAgICAgIGJyZWFrCisgICAgICAgIHJhaXNlCisgICAgICBzZWxmLl9HZXRBdXRoQ29va2llKGF1dGhfdG9rZW4pCisgICAgICByZXR1cm4KKworICBkZWYgU2VuZChzZWxmLCByZXF1ZXN0X3BhdGgsIHBheWxvYWQ9Tm9uZSwKKyAgICAgICAgICAgY29udGVudF90eXBlPSJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLAorICAgICAgICAgICB0aW1lb3V0PU5vbmUsCisgICAgICAgICAgICoqa3dhcmdzKToKKyAgICAiIiJTZW5kcyBhbiBSUEMgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlLgorCisgICAgQXJnczoKKyAgICAgIHJlcXVlc3RfcGF0aDogVGhlIHBhdGggdG8gc2VuZCB0aGUgcmVxdWVzdCB0bywgZWcgL2FwaS9hcHB2ZXJzaW9uL2NyZWF0ZS4KKyAgICAgIHBheWxvYWQ6IFRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LCBvciBOb25lIHRvIHNlbmQgYW4gZW1wdHkgcmVxdWVzdC4KKyAgICAgIGNvbnRlbnRfdHlwZTogVGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgdG8gdXNlLgorICAgICAgdGltZW91dDogdGltZW91dCBpbiBzZWNvbmRzOyBkZWZhdWx0IE5vbmUgaS5lLiBubyB0aW1lb3V0LgorICAgICAgICAoTm90ZTogZm9yIGxhcmdlIHJlcXVlc3RzIG9uIE9TIFgsIHRoZSB0aW1lb3V0IGRvZXNuJ3Qgd29yayByaWdodC4pCisgICAgICBrd2FyZ3M6IEFueSBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIGludG8gcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIHJlc3BvbnNlIGJvZHksIGFzIGEgc3RyaW5nLgorICAgICIiIgorICAgICMgVE9ETzogRG9uJ3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIExldCB0aGUgc2VydmVyIHNheQorICAgICMgd2hldGhlciBpdCBpcyBuZWNlc3NhcnkuCisgICAgaWYgbm90IHNlbGYuYXV0aGVudGljYXRlZDoKKyAgICAgIHNlbGYuX0F1dGhlbnRpY2F0ZSgpCisKKyAgICBvbGRfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCisgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVvdXQpCisgICAgdHJ5OgorICAgICAgdHJpZXMgPSAwCisgICAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cmllcyArPSAxCisgICAgICAgIGFyZ3MgPSBkaWN0KGt3YXJncykKKyAgICAgICAgdXJsID0gImh0dHA6Ly8lcyVzIiAlIChzZWxmLmhvc3QsIHJlcXVlc3RfcGF0aCkKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICB1cmwgKz0gIj8iICsgdXJsbGliLnVybGVuY29kZShhcmdzKQorICAgICAgICByZXEgPSBzZWxmLl9DcmVhdGVSZXF1ZXN0KHVybD11cmwsIGRhdGE9cGF5bG9hZCkKKyAgICAgICAgcmVxLmFkZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIGNvbnRlbnRfdHlwZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgIGYgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSkKKyAgICAgICAgICByZXNwb25zZSA9IGYucmVhZCgpCisgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKKyAgICAgICAgICBpZiB0cmllcyA+IDM6CisgICAgICAgICAgICByYWlzZQorICAgICAgICAgIGVsaWYgZS5jb2RlID09IDQwMToKKyAgICAgICAgICAgIHNlbGYuX0F1dGhlbnRpY2F0ZSgpCisjIyAgICAgICAgICAgZWxpZiBlLmNvZGUgPj0gNTAwIGFuZCBlLmNvZGUgPCA2MDA6CisjIyAgICAgICAgICAgICAjIFNlcnZlciBFcnJvciAtIHRyeSBhZ2Fpbi4KKyMjICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgZmluYWxseToKKyAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKKworCitjbGFzcyBIdHRwUnBjU2VydmVyKEFic3RyYWN0UnBjU2VydmVyKToKKyAgIiIiUHJvdmlkZXMgYSBzaW1wbGlmaWVkIFJQQy1zdHlsZSBpbnRlcmZhY2UgZm9yIEhUVFAgcmVxdWVzdHMuIiIiCisKKyAgZGVmIF9BdXRoZW50aWNhdGUoc2VsZik6CisgICAgIiIiU2F2ZSB0aGUgY29va2llIGphciBhZnRlciBhdXRoZW50aWNhdGlvbi4iIiIKKyAgICBzdXBlcihIdHRwUnBjU2VydmVyLCBzZWxmKS5fQXV0aGVudGljYXRlKCkKKyAgICBpZiBzZWxmLnNhdmVfY29va2llczoKKyAgICAgIFN0YXR1c1VwZGF0ZSgiU2F2aW5nIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMgdG8gJXMiICUgc2VsZi5jb29raWVfZmlsZSkKKyAgICAgIHNlbGYuY29va2llX2phci5zYXZlKCkKKworICBkZWYgX0dldE9wZW5lcihzZWxmKToKKyAgICAiIiJSZXR1cm5zIGFuIE9wZW5lckRpcmVjdG9yIHRoYXQgc3VwcG9ydHMgY29va2llcyBhbmQgaWdub3JlcyByZWRpcmVjdHMuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yIG9iamVjdC4KKyAgICAiIiIKKyAgICBvcGVuZXIgPSB1cmxsaWIyLk9wZW5lckRpcmVjdG9yKCkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5Qcm94eUhhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5Vbmtub3duSGFuZGxlcigpKQorICAgIG9wZW5lci5hZGRfaGFuZGxlcih1cmxsaWIyLkhUVFBIYW5kbGVyKCkpCisgICAgb3BlbmVyLmFkZF9oYW5kbGVyKHVybGxpYjIuSFRUUERlZmF1bHRFcnJvckhhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQU0hhbmRsZXIoKSkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQRXJyb3JQcm9jZXNzb3IoKSkKKyAgICBpZiBzZWxmLnNhdmVfY29va2llczoKKyAgICAgIHNlbGYuY29va2llX2ZpbGUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmNvZGVyZXZpZXdfdXBsb2FkX2Nvb2tpZXMiKQorICAgICAgc2VsZi5jb29raWVfamFyID0gY29va2llbGliLk1vemlsbGFDb29raWVKYXIoc2VsZi5jb29raWVfZmlsZSkKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuY29va2llX2ZpbGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgc2VsZi5jb29raWVfamFyLmxvYWQoKQorICAgICAgICAgIHNlbGYuYXV0aGVudGljYXRlZCA9IFRydWUKKyAgICAgICAgICBTdGF0dXNVcGRhdGUoIkxvYWRlZCBhdXRoZW50aWNhdGlvbiBjb29raWVzIGZyb20gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb29raWVfZmlsZSkKKyAgICAgICAgZXhjZXB0IChjb29raWVsaWIuTG9hZEVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAjIEZhaWxlZCB0byBsb2FkIGNvb2tpZXMgLSBqdXN0IGlnbm9yZSB0aGVtLgorICAgICAgICAgIHBhc3MKKyAgICAgIGVsc2U6CisgICAgICAgICMgQ3JlYXRlIGFuIGVtcHR5IGNvb2tpZSBmaWxlIHdpdGggbW9kZSA2MDAKKyAgICAgICAgZmQgPSBvcy5vcGVuKHNlbGYuY29va2llX2ZpbGUsIG9zLk9fQ1JFQVQsIDA2MDApCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgIyBBbHdheXMgY2htb2QgdGhlIGNvb2tpZSBmaWxlCisgICAgICBvcy5jaG1vZChzZWxmLmNvb2tpZV9maWxlLCAwNjAwKQorICAgIGVsc2U6CisgICAgICAjIERvbid0IHNhdmUgY29va2llcyBhY3Jvc3MgcnVucyBvZiB1cGRhdGUucHkuCisgICAgICBzZWxmLmNvb2tpZV9qYXIgPSBjb29raWVsaWIuQ29va2llSmFyKCkKKyAgICBvcGVuZXIuYWRkX2hhbmRsZXIodXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKHNlbGYuY29va2llX2phcikpCisgICAgcmV0dXJuIG9wZW5lcgorCisKK3BhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcih1c2FnZT0iJXByb2cgW29wdGlvbnNdIFstLSBkaWZmX29wdGlvbnNdIikKK3BhcnNlci5hZGRfb3B0aW9uKCIteSIsICItLWFzc3VtZV95ZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgZGVzdD0iYXNzdW1lX3llcyIsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICBoZWxwPSJBc3N1bWUgdGhhdCB0aGUgYW5zd2VyIHRvIHllcy9ubyBxdWVzdGlvbnMgaXMgJ3llcycuIikKKyMgTG9nZ2luZworZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiTG9nZ2luZyBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGhlbHA9IlByaW50IGVycm9ycyBvbmx5LiIpCitncm91cC5hZGRfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGRlZmF1bHQ9MSwKKyAgICAgICAgICAgICAgICAgaGVscD0iUHJpbnQgaW5mbyBsZXZlbCBsb2dzIChkZWZhdWx0KS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1ub2lzeSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD0zLAorICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgaGVscD0iUHJpbnQgYWxsIGxvZ3MuIikKKyMgUmV2aWV3IHNlcnZlcgorZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiUmV2aWV3IHNlcnZlciBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1zIiwgIi0tc2VydmVyIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InNlcnZlciIsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImNvZGVyZXZpZXcuYXBwc3BvdC5jb20iLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJTRVJWRVIiLAorICAgICAgICAgICAgICAgICBoZWxwPSgiVGhlIHNlcnZlciB0byB1cGxvYWQgdG8uIFRoZSBmb3JtYXQgaXMgaG9zdFs6cG9ydF0uICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHRzIHRvICdjb2RlcmV2aWV3LmFwcHNwb3QuY29tJy4iKSkKK2dyb3VwLmFkZF9vcHRpb24oIi1lIiwgIi0tZW1haWwiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iZW1haWwiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJFTUFJTCIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iVGhlIHVzZXJuYW1lIHRvIHVzZS4gV2lsbCBwcm9tcHQgaWYgb21pdHRlZC4iKQorZ3JvdXAuYWRkX29wdGlvbigiLUgiLCAiLS1ob3N0IiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9Imhvc3QiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJIT1NUIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJPdmVycmlkZXMgdGhlIEhvc3QgaGVhZGVyIHNlbnQgd2l0aCBhbGwgUlBDcy4iKQorZ3JvdXAuYWRkX29wdGlvbigiLS1ub19jb29raWVzIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCisgICAgICAgICAgICAgICAgIGRlc3Q9InNhdmVfY29va2llcyIsIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iRG8gbm90IHNhdmUgYXV0aGVudGljYXRpb24gY29va2llcyB0byBsb2NhbCBkaXNrLiIpCisjIElzc3VlCitncm91cCA9IHBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKCJJc3N1ZSBvcHRpb25zIikKK2dyb3VwLmFkZF9vcHRpb24oIi1kIiwgIi0tZGVzY3JpcHRpb24iLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJERVNDUklQVElPTiIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iT3B0aW9uYWwgZGVzY3JpcHRpb24gd2hlbiBjcmVhdGluZyBhbiBpc3N1ZS4iKQorZ3JvdXAuYWRkX29wdGlvbigiLWYiLCAiLS1kZXNjcmlwdGlvbl9maWxlIiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgIGRlc3Q9ImRlc2NyaXB0aW9uX2ZpbGUiLCBtZXRhdmFyPSJERVNDUklQVElPTl9GSUxFIiwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJPcHRpb25hbCBwYXRoIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zICIKKyAgICAgICAgICAgICAgICAgICAgICAidGhlIGRlc2NyaXB0aW9uIHdoZW4gY3JlYXRpbmcgYW4gaXNzdWUuIikKK2dyb3VwLmFkZF9vcHRpb24oIi1yIiwgIi0tcmV2aWV3ZXJzIiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InJldmlld2VycyIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9IlJFVklFV0VSUyIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQWRkIHJldmlld2VycyAoY29tbWEgc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcykuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tY2MiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0iY2MiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJDQyIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQWRkIENDIChjb21tYSBzZXBhcmF0ZWQgZW1haWwgYWRkcmVzc2VzKS4iKQorIyBVcGxvYWQgb3B0aW9ucworZ3JvdXAgPSBwYXJzZXIuYWRkX29wdGlvbl9ncm91cCgiUGF0Y2ggb3B0aW9ucyIpCitncm91cC5hZGRfb3B0aW9uKCItbSIsICItLW1lc3NhZ2UiLCBhY3Rpb249InN0b3JlIiwgZGVzdD0ibWVzc2FnZSIsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9Ik1FU1NBR0UiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIGhlbHA9IkEgbWVzc2FnZSB0byBpZGVudGlmeSB0aGUgcGF0Y2guICIKKyAgICAgICAgICAgICAgICAgICAgICAiV2lsbCBwcm9tcHQgaWYgb21pdHRlZC4iKQorZ3JvdXAuYWRkX29wdGlvbigiLWkiLCAiLS1pc3N1ZSIsIHR5cGU9ImludCIsIGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPSJJU1NVRSIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iSXNzdWUgbnVtYmVyIHRvIHdoaWNoIHRvIGFkZC4gRGVmYXVsdHMgdG8gbmV3IGlzc3VlLiIpCitncm91cC5hZGRfb3B0aW9uKCItLWRvd25sb2FkX2Jhc2UiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICBkZXN0PSJkb3dubG9hZF9iYXNlIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iQmFzZSBmaWxlcyB3aWxsIGJlIGRvd25sb2FkZWQgYnkgdGhlIHNlcnZlciAiCisgICAgICAgICAgICAgICAgICIoc2lkZS1ieS1zaWRlIGRpZmZzIG1heSBub3Qgd29yayBvbiBmaWxlcyB3aXRoIENScykuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tcmV2IiwgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InJldmlzaW9uIiwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj0iUkVWIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBoZWxwPSJCcmFuY2gvdHJlZS9yZXZpc2lvbiB0byBkaWZmIGFnYWluc3QgKHVzZWQgYnkgRFZDUykuIikKK2dyb3VwLmFkZF9vcHRpb24oIi0tc2VuZF9tYWlsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgZGVzdD0ic2VuZF9tYWlsIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD0iU2VuZCBub3RpZmljYXRpb24gZW1haWwgdG8gcmV2aWV3ZXJzLiIpCisKKworZGVmIEdldFJwY1NlcnZlcihvcHRpb25zKToKKyAgIiIiUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhbiBBYnN0cmFjdFJwY1NlcnZlci4KKworICBSZXR1cm5zOgorICAgIEEgbmV3IEFic3RyYWN0UnBjU2VydmVyLCBvbiB3aGljaCBSUEMgY2FsbHMgY2FuIGJlIG1hZGUuCisgICIiIgorCisgIHJwY19zZXJ2ZXJfY2xhc3MgPSBIdHRwUnBjU2VydmVyCisKKyAgZGVmIEdldFVzZXJDcmVkZW50aWFscygpOgorICAgICIiIlByb21wdHMgdGhlIHVzZXIgZm9yIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiIiIgorICAgIGVtYWlsID0gb3B0aW9ucy5lbWFpbAorICAgIGlmIGVtYWlsIGlzIE5vbmU6CisgICAgICBlbWFpbCA9IEdldEVtYWlsKCJFbWFpbCAobG9naW4gZm9yIHVwbG9hZGluZyB0byAlcykiICUgb3B0aW9ucy5zZXJ2ZXIpCisgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoIlBhc3N3b3JkIGZvciAlczogIiAlIGVtYWlsKQorICAgIHJldHVybiAoZW1haWwsIHBhc3N3b3JkKQorCisgICMgSWYgdGhpcyBpcyB0aGUgZGV2X2FwcHNlcnZlciwgdXNlIGZha2UgYXV0aGVudGljYXRpb24uCisgIGhvc3QgPSAob3B0aW9ucy5ob3N0IG9yIG9wdGlvbnMuc2VydmVyKS5sb3dlcigpCisgIGlmIGhvc3QgPT0gImxvY2FsaG9zdCIgb3IgaG9zdC5zdGFydHN3aXRoKCJsb2NhbGhvc3Q6Iik6CisgICAgZW1haWwgPSBvcHRpb25zLmVtYWlsCisgICAgaWYgZW1haWwgaXMgTm9uZToKKyAgICAgIGVtYWlsID0gInRlc3RAZXhhbXBsZS5jb20iCisgICAgICBsb2dnaW5nLmluZm8oIlVzaW5nIGRlYnVnIHVzZXIgJXMuICBPdmVycmlkZSB3aXRoIC0tZW1haWwiICUgZW1haWwpCisgICAgc2VydmVyID0gcnBjX3NlcnZlcl9jbGFzcygKKyAgICAgICAgb3B0aW9ucy5zZXJ2ZXIsCisgICAgICAgIGxhbWJkYTogKGVtYWlsLCAicGFzc3dvcmQiKSwKKyAgICAgICAgaG9zdF9vdmVycmlkZT1vcHRpb25zLmhvc3QsCisgICAgICAgIGV4dHJhX2hlYWRlcnM9eyJDb29raWUiOgorICAgICAgICAgICAgICAgICAgICAgICAnZGV2X2FwcHNlcnZlcl9sb2dpbj0iJXM6RmFsc2UiJyAlIGVtYWlsfSwKKyAgICAgICAgc2F2ZV9jb29raWVzPW9wdGlvbnMuc2F2ZV9jb29raWVzKQorICAgICMgRG9uJ3QgdHJ5IHRvIHRhbGsgdG8gQ2xpZW50TG9naW4uCisgICAgc2VydmVyLmF1dGhlbnRpY2F0ZWQgPSBUcnVlCisgICAgcmV0dXJuIHNlcnZlcgorCisgIHJldHVybiBycGNfc2VydmVyX2NsYXNzKG9wdGlvbnMuc2VydmVyLCBHZXRVc2VyQ3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Rfb3ZlcnJpZGU9b3B0aW9ucy5ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX2Nvb2tpZXM9b3B0aW9ucy5zYXZlX2Nvb2tpZXMpCisKKworZGVmIEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZpZWxkcywgZmlsZXMpOgorICAiIiJFbmNvZGUgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydC9mb3JtLWRhdGEuCisKKyAgQXJnczoKKyAgICBmaWVsZHM6IEEgc2VxdWVuY2Ugb2YgKG5hbWUsIHZhbHVlKSBlbGVtZW50cyBmb3IgcmVndWxhciBmb3JtIGZpZWxkcy4KKyAgICBmaWxlczogQSBzZXF1ZW5jZSBvZiAobmFtZSwgZmlsZW5hbWUsIHZhbHVlKSBlbGVtZW50cyBmb3IgZGF0YSB0byBiZQorICAgICAgICAgICB1cGxvYWRlZCBhcyBmaWxlcy4KKyAgUmV0dXJuczoKKyAgICAoY29udGVudF90eXBlLCBib2R5KSByZWFkeSBmb3IgaHR0cGxpYi5IVFRQIGluc3RhbmNlLgorCisgIFNvdXJjZToKKyAgICBodHRwOi8vYXNwbi5hY3RpdmVzdGF0ZS5jb20vQVNQTi9Db29rYm9vay9QeXRob24vUmVjaXBlLzE0NjMwNgorICAiIiIKKyAgQk9VTkRBUlkgPSAnLU0tQS1HLUktQy0tLUItTy1VLU4tRC1BLVItWS0nCisgIENSTEYgPSAnXHJcbicKKyAgbGluZXMgPSBbXQorICBmb3IgKGtleSwgdmFsdWUpIGluIGZpZWxkczoKKyAgICBsaW5lcy5hcHBlbmQoJy0tJyArIEJPVU5EQVJZKQorICAgIGxpbmVzLmFwcGVuZCgnQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInICUga2V5KQorICAgIGxpbmVzLmFwcGVuZCgnJykKKyAgICBsaW5lcy5hcHBlbmQodmFsdWUpCisgIGZvciAoa2V5LCBmaWxlbmFtZSwgdmFsdWUpIGluIGZpbGVzOgorICAgIGxpbmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkpCisgICAgbGluZXMuYXBwZW5kKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIjsgZmlsZW5hbWU9IiVzIicgJQorICAgICAgICAgICAgIChrZXksIGZpbGVuYW1lKSkKKyAgICBsaW5lcy5hcHBlbmQoJ0NvbnRlbnQtVHlwZTogJXMnICUgR2V0Q29udGVudFR5cGUoZmlsZW5hbWUpKQorICAgIGxpbmVzLmFwcGVuZCgnJykKKyAgICBsaW5lcy5hcHBlbmQodmFsdWUpCisgIGxpbmVzLmFwcGVuZCgnLS0nICsgQk9VTkRBUlkgKyAnLS0nKQorICBsaW5lcy5hcHBlbmQoJycpCisgIGJvZHkgPSBDUkxGLmpvaW4obGluZXMpCisgIGNvbnRlbnRfdHlwZSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcycgJSBCT1VOREFSWQorICByZXR1cm4gY29udGVudF90eXBlLCBib2R5CisKKworZGVmIEdldENvbnRlbnRUeXBlKGZpbGVuYW1lKToKKyAgIiIiSGVscGVyIHRvIGd1ZXNzIHRoZSBjb250ZW50LXR5cGUgZnJvbSB0aGUgZmlsZW5hbWUuIiIiCisgIHJldHVybiBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxlbmFtZSlbMF0gb3IgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScKKworCisjIFVzZSBhIHNoZWxsIGZvciBzdWJjb21tYW5kcyBvbiBXaW5kb3dzIHRvIGdldCBhIFBBVEggc2VhcmNoLgordXNlX3NoZWxsID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpCisKK2RlZiBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNvbW1hbmQsIHByaW50X291dHB1dD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKToKKyAgIiIiRXhlY3V0ZXMgYSBjb21tYW5kIGFuZCByZXR1cm5zIHRoZSBvdXRwdXQgZnJvbSBzdGRvdXQgYW5kIHRoZSByZXR1cm4gY29kZS4KKworICBBcmdzOgorICAgIGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZS4KKyAgICBwcmludF9vdXRwdXQ6IElmIFRydWUsIHRoZSBvdXRwdXQgaXMgcHJpbnRlZCB0byBzdGRvdXQuCisgICAgICAgICAgICAgICAgICBJZiBGYWxzZSwgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgaWdub3JlZC4KKyAgICB1bml2ZXJzYWxfbmV3bGluZXM6IFVzZSB1bml2ZXJzYWxfbmV3bGluZXMgZmxhZyAoZGVmYXVsdDogVHJ1ZSkuCisKKyAgUmV0dXJuczoKKyAgICBUdXBsZSAob3V0cHV0LCByZXR1cm4gY29kZSkKKyAgIiIiCisgIGxvZ2dpbmcuaW5mbygiUnVubmluZyAlcyIsIGNvbW1hbmQpCisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsPXVzZV9zaGVsbCwgdW5pdmVyc2FsX25ld2xpbmVzPXVuaXZlcnNhbF9uZXdsaW5lcykKKyAgaWYgcHJpbnRfb3V0cHV0OgorICAgIG91dHB1dF9hcnJheSA9IFtdCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIGxpbmUgPSBwLnN0ZG91dC5yZWFkbGluZSgpCisgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgYnJlYWsKKyAgICAgIHByaW50IGxpbmUuc3RyaXAoIlxuIikKKyAgICAgIG91dHB1dF9hcnJheS5hcHBlbmQobGluZSkKKyAgICBvdXRwdXQgPSAiIi5qb2luKG91dHB1dF9hcnJheSkKKyAgZWxzZToKKyAgICBvdXRwdXQgPSBwLnN0ZG91dC5yZWFkKCkKKyAgcC53YWl0KCkKKyAgZXJyb3V0ID0gcC5zdGRlcnIucmVhZCgpCisgIGlmIHByaW50X291dHB1dCBhbmQgZXJyb3V0OgorICAgIHByaW50ID4+c3lzLnN0ZGVyciwgZXJyb3V0CisgIHAuc3Rkb3V0LmNsb3NlKCkKKyAgcC5zdGRlcnIuY2xvc2UoKQorICByZXR1cm4gb3V0cHV0LCBwLnJldHVybmNvZGUKKworCitkZWYgUnVuU2hlbGwoY29tbWFuZCwgc2lsZW50X29rPUZhbHNlLCB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKKyAgICAgICAgICAgICBwcmludF9vdXRwdXQ9RmFsc2UpOgorICBkYXRhLCByZXRjb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjb21tYW5kLCBwcmludF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcykKKyAgaWYgcmV0Y29kZToKKyAgICBFcnJvckV4aXQoIkdvdCBlcnJvciBzdGF0dXMgZnJvbSAlczpcbiVzIiAlIChjb21tYW5kLCBkYXRhKSkKKyAgaWYgbm90IHNpbGVudF9vayBhbmQgbm90IGRhdGE6CisgICAgRXJyb3JFeGl0KCJObyBvdXRwdXQgZnJvbSAlcyIgJSBjb21tYW5kKQorICByZXR1cm4gZGF0YQorCisKK2NsYXNzIFZlcnNpb25Db250cm9sU3lzdGVtKG9iamVjdCk6CisgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byB0aGUgVkNTLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zKToKKyAgICAiIiJDb25zdHJ1Y3Rvci4KKworICAgIEFyZ3M6CisgICAgICBvcHRpb25zOiBDb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAiIiIKKyAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCisKKyAgZGVmIEdlbmVyYXRlRGlmZihzZWxmLCBhcmdzKToKKyAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZGlmZiBhcyBhIHN0cmluZy4KKworICAgIEFyZ3M6CisgICAgICBhcmdzOiBFeHRyYSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZGlmZiBjb21tYW5kLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKKworICBkZWYgR2V0VW5rbm93bkZpbGVzKHNlbGYpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZmlsZXMgdW5rbm93biB0byB0aGUgVkNTLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKKworICBkZWYgQ2hlY2tGb3JVbmtub3duRmlsZXMoc2VsZik6CisgICAgIiIiU2hvdyBhbiAiYXJlIHlvdSBzdXJlPyIgcHJvbXB0IGlmIHRoZXJlIGFyZSB1bmtub3duIGZpbGVzLiIiIgorICAgIHVua25vd25fZmlsZXMgPSBzZWxmLkdldFVua25vd25GaWxlcygpCisgICAgaWYgdW5rbm93bl9maWxlczoKKyAgICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBub3QgYWRkZWQgdG8gdmVyc2lvbiBjb250cm9sOiIKKyAgICAgIGZvciBsaW5lIGluIHVua25vd25fZmlsZXM6CisgICAgICAgIHByaW50IGxpbmUKKyAgICAgIHByb21wdCA9ICJBcmUgeW91IHN1cmUgdG8gY29udGludWU/KHkvTikgIgorICAgICAgYW5zd2VyID0gcmF3X2lucHV0KHByb21wdCkuc3RyaXAoKQorICAgICAgaWYgYW5zd2VyICE9ICJ5IjoKKyAgICAgICAgRXJyb3JFeGl0KCJVc2VyIGFib3J0ZWQiKQorCisgIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgIiIiR2V0IHRoZSBjb250ZW50IG9mIHRoZSB1cHN0cmVhbSB2ZXJzaW9uIG9mIGEgZmlsZS4KKworICAgIFJldHVybnM6CisgICAgICBBIHR1cGxlIChiYXNlX2NvbnRlbnQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cykKKyAgICAgICAgYmFzZV9jb250ZW50OiBUaGUgY29udGVudHMgb2YgdGhlIGJhc2UgZmlsZS4KKyAgICAgICAgbmV3X2NvbnRlbnQ6IEZvciB0ZXh0IGZpbGVzLCB0aGlzIGlzIGVtcHR5LiAgRm9yIGJpbmFyeSBmaWxlcywgdGhpcyBpcworICAgICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IGZpbGUsIHNpbmNlIHRoZSBkaWZmIG91dHB1dCB3b24ndCBjb250YWluCisgICAgICAgICAgaW5mb3JtYXRpb24gdG8gcmVjb25zdHJ1Y3QgdGhlIGN1cnJlbnQgZmlsZS4KKyAgICAgICAgaXNfYmluYXJ5OiBUcnVlIGlmZiB0aGUgZmlsZSBpcyBiaW5hcnkuCisgICAgICAgIHN0YXR1czogVGhlIHN0YXR1cyBvZiB0aGUgZmlsZS4KKyAgICAiIiIKKworICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXykKKworCisgIGRlZiBHZXRCYXNlRmlsZXMoc2VsZiwgZGlmZik6CisgICAgIiIiSGVscGVyIHRoYXQgY2FsbHMgR2V0QmFzZSBmaWxlIGZvciBlYWNoIGZpbGUgaW4gdGhlIHBhdGNoLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgZGljdGlvbmFyeSB0aGF0IG1hcHMgZnJvbSBmaWxlbmFtZSB0byBHZXRCYXNlRmlsZSdzIHR1cGxlLiAgRmlsZW5hbWVzCisgICAgICBhcmUgcmV0cmlldmVkIGJhc2VkIG9uIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCAiSW5kZXg6IiBvcgorICAgICAgIlByb3BlcnR5IGNoYW5nZXMgb246Ii4KKyAgICAiIiIKKyAgICBmaWxlcyA9IHt9CisgICAgZm9yIGxpbmUgaW4gZGlmZi5zcGxpdGxpbmVzKFRydWUpOgorICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdJbmRleDonKSBvciBsaW5lLnN0YXJ0c3dpdGgoJ1Byb3BlcnR5IGNoYW5nZXMgb246Jyk6CisgICAgICAgIHVudXNlZCwgZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKKyAgICAgICAgIyBPbiBXaW5kb3dzIGlmIGEgZmlsZSBoYXMgcHJvcGVydHkgY2hhbmdlcyBpdHMgZmlsZW5hbWUgdXNlcyAnXCcKKyAgICAgICAgIyBpbnN0ZWFkIG9mICcvJy4KKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQorICAgICAgICBmaWxlc1tmaWxlbmFtZV0gPSBzZWxmLkdldEJhc2VGaWxlKGZpbGVuYW1lKQorICAgIHJldHVybiBmaWxlcworCisKKyAgZGVmIFVwbG9hZEJhc2VGaWxlcyhzZWxmLCBpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hfbGlzdCwgcGF0Y2hzZXQsIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZXMpOgorICAgICIiIlVwbG9hZHMgdGhlIGJhc2UgZmlsZXMgKGFuZCBpZiBuZWNlc3NhcnksIHRoZSBjdXJyZW50IG9uZXMgYXMgd2VsbCkuIiIiCisKKyAgICBkZWYgVXBsb2FkRmlsZShmaWxlbmFtZSwgZmlsZV9pZCwgY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMsIGlzX2Jhc2UpOgorICAgICAgIiIiVXBsb2FkcyBhIGZpbGUgdG8gdGhlIHNlcnZlci4iIiIKKyAgICAgIGZpbGVfdG9vX2xhcmdlID0gRmFsc2UKKyAgICAgIGlmIGlzX2Jhc2U6CisgICAgICAgIHR5cGUgPSAiYmFzZSIKKyAgICAgIGVsc2U6CisgICAgICAgIHR5cGUgPSAiY3VycmVudCIKKyAgICAgIGlmIGxlbihjb250ZW50KSA+IE1BWF9VUExPQURfU0laRToKKyAgICAgICAgcHJpbnQgKCJOb3QgdXBsb2FkaW5nIHRoZSAlcyBmaWxlIGZvciAlcyBiZWNhdXNlIGl0J3MgdG9vIGxhcmdlLiIgJQorICAgICAgICAgICAgICAgKHR5cGUsIGZpbGVuYW1lKSkKKyAgICAgICAgZmlsZV90b29fbGFyZ2UgPSBUcnVlCisgICAgICAgIGNvbnRlbnQgPSAiIgorICAgICAgY2hlY2tzdW0gPSBtZDUubmV3KGNvbnRlbnQpLmhleGRpZ2VzdCgpCisgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwIGFuZCBub3QgZmlsZV90b29fbGFyZ2U6CisgICAgICAgIHByaW50ICJVcGxvYWRpbmcgJXMgZmlsZSBmb3IgJXMiICUgKHR5cGUsIGZpbGVuYW1lKQorICAgICAgdXJsID0gIi8lZC91cGxvYWRfY29udGVudC8lZC8lZCIgJSAoaW50KGlzc3VlKSwgaW50KHBhdGNoc2V0KSwgZmlsZV9pZCkKKyAgICAgIGZvcm1fZmllbGRzID0gWygiZmlsZW5hbWUiLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAoInN0YXR1cyIsIHN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAoImNoZWNrc3VtIiwgY2hlY2tzdW0pLAorICAgICAgICAgICAgICAgICAgICAgKCJpc19iaW5hcnkiLCBzdHIoaXNfYmluYXJ5KSksCisgICAgICAgICAgICAgICAgICAgICAoImlzX2N1cnJlbnQiLCBzdHIobm90IGlzX2Jhc2UpKSwKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgaWYgZmlsZV90b29fbGFyZ2U6CisgICAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoImZpbGVfdG9vX2xhcmdlIiwgIjEiKSkKKyAgICAgIGlmIG9wdGlvbnMuZW1haWw6CisgICAgICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInVzZXIiLCBvcHRpb25zLmVtYWlsKSkKKyAgICAgIGN0eXBlLCBib2R5ID0gRW5jb2RlTXVsdGlwYXJ0Rm9ybURhdGEoZm9ybV9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoImRhdGEiLCBmaWxlbmFtZSwgY29udGVudCldKQorICAgICAgcmVzcG9uc2VfYm9keSA9IHJwY19zZXJ2ZXIuU2VuZCh1cmwsIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZT1jdHlwZSkKKyAgICAgIGlmIG5vdCByZXNwb25zZV9ib2R5LnN0YXJ0c3dpdGgoIk9LIik6CisgICAgICAgIFN0YXR1c1VwZGF0ZSgiICAtLT4gJXMiICUgcmVzcG9uc2VfYm9keSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIHBhdGNoZXMgPSBkaWN0KCkKKyAgICBbcGF0Y2hlcy5zZXRkZWZhdWx0KHYsIGspIGZvciBrLCB2IGluIHBhdGNoX2xpc3RdCisgICAgZm9yIGZpbGVuYW1lIGluIHBhdGNoZXMua2V5cygpOgorICAgICAgYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMgPSBmaWxlc1tmaWxlbmFtZV0KKyAgICAgIGZpbGVfaWRfc3RyID0gcGF0Y2hlcy5nZXQoZmlsZW5hbWUpCisgICAgICBpZiBmaWxlX2lkX3N0ci5maW5kKCJub2Jhc2UiKSAhPSAtMToKKyAgICAgICAgYmFzZV9jb250ZW50ID0gTm9uZQorICAgICAgICBmaWxlX2lkX3N0ciA9IGZpbGVfaWRfc3RyW2ZpbGVfaWRfc3RyLnJmaW5kKCJfIikgKyAxOl0KKyAgICAgIGZpbGVfaWQgPSBpbnQoZmlsZV9pZF9zdHIpCisgICAgICBpZiBiYXNlX2NvbnRlbnQgIT0gTm9uZToKKyAgICAgICAgVXBsb2FkRmlsZShmaWxlbmFtZSwgZmlsZV9pZCwgYmFzZV9jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgVHJ1ZSkKKyAgICAgIGlmIG5ld19jb250ZW50ICE9IE5vbmU6CisgICAgICAgIFVwbG9hZEZpbGUoZmlsZW5hbWUsIGZpbGVfaWQsIG5ld19jb250ZW50LCBpc19iaW5hcnksIHN0YXR1cywgRmFsc2UpCisKKyAgZGVmIElzSW1hZ2Uoc2VsZiwgZmlsZW5hbWUpOgorICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgaGFzIGFuIGltYWdlIGV4dGVuc2lvbi4iIiIKKyAgICBtaW1ldHlwZSA9ICBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxlbmFtZSlbMF0KKyAgICBpZiBub3QgbWltZXR5cGU6CisgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gbWltZXR5cGUuc3RhcnRzd2l0aCgiaW1hZ2UvIikKKworCitjbGFzcyBTdWJ2ZXJzaW9uVkNTKFZlcnNpb25Db250cm9sU3lzdGVtKToKKyAgIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIFZlcnNpb25Db250cm9sU3lzdGVtIGludGVyZmFjZSBmb3IgU3VidmVyc2lvbi4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6CisgICAgc3VwZXIoU3VidmVyc2lvblZDUywgc2VsZikuX19pbml0X18ob3B0aW9ucykKKyAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiKFxkKykoOihcZCspKT8iLCBzZWxmLm9wdGlvbnMucmV2aXNpb24pCisgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgIEVycm9yRXhpdCgiSW52YWxpZCBTdWJ2ZXJzaW9uIHJldmlzaW9uICVzLiIgJSBzZWxmLm9wdGlvbnMucmV2aXNpb24pCisgICAgICBzZWxmLnJldl9zdGFydCA9IG1hdGNoLmdyb3VwKDEpCisgICAgICBzZWxmLnJldl9lbmQgPSBtYXRjaC5ncm91cCgzKQorICAgIGVsc2U6CisgICAgICBzZWxmLnJldl9zdGFydCA9IHNlbGYucmV2X2VuZCA9IE5vbmUKKyAgICAjIENhY2hlIG91dHB1dCBmcm9tICJzdm4gbGlzdCAtciBSRVZOTyBkaXJuYW1lIi4KKyAgICAjIEtleXM6IGRpcm5hbWUsIFZhbHVlczogMi10dXBsZSAob3VwdXQgZm9yIHN0YXJ0IHJldiBhbmQgZW5kIHJldikuCisgICAgc2VsZi5zdm5sc19jYWNoZSA9IHt9CisgICAgIyBTVk4gYmFzZSBVUkwgaXMgcmVxdWlyZWQgdG8gZmV0Y2ggZmlsZXMgZGVsZXRlZCBpbiBhbiBvbGRlciByZXZpc2lvbi4KKyAgICAjIFJlc3VsdCBpcyBjYWNoZWQgdG8gbm90IGd1ZXNzIGl0IG92ZXIgYW5kIG92ZXIgYWdhaW4gaW4gR2V0QmFzZUZpbGUoKS4KKyAgICByZXF1aXJlZCA9IHNlbGYub3B0aW9ucy5kb3dubG9hZF9iYXNlIG9yIHNlbGYub3B0aW9ucy5yZXZpc2lvbiBpcyBub3QgTm9uZQorICAgIHNlbGYuc3ZuX2Jhc2UgPSBzZWxmLl9HdWVzc0Jhc2UocmVxdWlyZWQpCisKKyAgZGVmIEd1ZXNzQmFzZShzZWxmLCByZXF1aXJlZCk6CisgICAgIiIiV3JhcHBlciBmb3IgX0d1ZXNzQmFzZS4iIiIKKyAgICByZXR1cm4gc2VsZi5zdm5fYmFzZQorCisgIGRlZiBfR3Vlc3NCYXNlKHNlbGYsIHJlcXVpcmVkKToKKyAgICAiIiJSZXR1cm5zIHRoZSBTVk4gYmFzZSBVUkwuCisKKyAgICBBcmdzOgorICAgICAgcmVxdWlyZWQ6IElmIHRydWUsIGV4aXRzIGlmIHRoZSB1cmwgY2FuJ3QgYmUgZ3Vlc3NlZCwgb3RoZXJ3aXNlIE5vbmUgaXMKKyAgICAgICAgcmV0dXJuZWQuCisgICAgIiIiCisgICAgaW5mbyA9IFJ1blNoZWxsKFsic3ZuIiwgImluZm8iXSkKKyAgICBmb3IgbGluZSBpbiBpbmZvLnNwbGl0bGluZXMoKToKKyAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICBpZiBsZW4od29yZHMpID09IDIgYW5kIHdvcmRzWzBdID09ICJVUkw6IjoKKyAgICAgICAgdXJsID0gd29yZHNbMV0KKyAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgICAgICB1c2VybmFtZSwgbmV0bG9jID0gdXJsbGliLnNwbGl0dXNlcihuZXRsb2MpCisgICAgICAgIGlmIHVzZXJuYW1lOgorICAgICAgICAgIGxvZ2dpbmcuaW5mbygiUmVtb3ZlZCB1c2VybmFtZSBmcm9tIGJhc2UgVVJMIikKKyAgICAgICAgaWYgbmV0bG9jLmVuZHN3aXRoKCJzdm4ucHl0aG9uLm9yZyIpOgorICAgICAgICAgIGlmIG5ldGxvYyA9PSAic3ZuLnB5dGhvbi5vcmciOgorICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCIvcHJvamVjdHMvIik6CisgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzk6XQorICAgICAgICAgIGVsaWYgbmV0bG9jICE9ICJweXRob25kZXZAc3ZuLnB5dGhvbi5vcmciOgorICAgICAgICAgICAgRXJyb3JFeGl0KCJVbnJlY29nbml6ZWQgUHl0aG9uIFVSTDogJXMiICUgdXJsKQorICAgICAgICAgIGJhc2UgPSAiaHR0cDovL3N2bi5weXRob24ub3JnL3ZpZXcvKmNoZWNrb3V0KiVzLyIgJSBwYXRoCisgICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIFB5dGhvbiBiYXNlID0gJXMiLCBiYXNlKQorICAgICAgICBlbGlmIG5ldGxvYy5lbmRzd2l0aCgic3ZuLmNvbGxhYi5uZXQiKToKKyAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoIi9yZXBvcy8iKToKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzY6XQorICAgICAgICAgIGJhc2UgPSAiaHR0cDovL3N2bi5jb2xsYWIubmV0L3ZpZXd2Yy8qY2hlY2tvdXQqJXMvIiAlIHBhdGgKKyAgICAgICAgICBsb2dnaW5nLmluZm8oIkd1ZXNzZWQgQ29sbGFiTmV0IGJhc2UgPSAlcyIsIGJhc2UpCisgICAgICAgIGVsaWYgbmV0bG9jLmVuZHN3aXRoKCIuZ29vZ2xlY29kZS5jb20iKToKKyAgICAgICAgICBwYXRoID0gcGF0aCArICIvIgorICAgICAgICAgIGJhc2UgPSB1cmxwYXJzZS51cmx1bnBhcnNlKCgiaHR0cCIsIG5ldGxvYywgcGF0aCwgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwgZnJhZ21lbnQpKQorICAgICAgICAgIGxvZ2dpbmcuaW5mbygiR3Vlc3NlZCBHb29nbGUgQ29kZSBiYXNlID0gJXMiLCBiYXNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHBhdGggPSBwYXRoICsgIi8iCisgICAgICAgICAgYmFzZSA9IHVybHBhcnNlLnVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBmcmFnbWVudCkpCisgICAgICAgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIGJhc2UgPSAlcyIsIGJhc2UpCisgICAgICAgIHJldHVybiBiYXNlCisgICAgaWYgcmVxdWlyZWQ6CisgICAgICBFcnJvckV4aXQoIkNhbid0IGZpbmQgVVJMIGluIG91dHB1dCBmcm9tIHN2biBpbmZvIikKKyAgICByZXR1cm4gTm9uZQorCisgIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgYXJncyk6CisgICAgY21kID0gWyJzdm4iLCAiZGlmZiJdCisgICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgorICAgICAgY21kICs9IFsiLXIiLCBzZWxmLm9wdGlvbnMucmV2aXNpb25dCisgICAgY21kLmV4dGVuZChhcmdzKQorICAgIGRhdGEgPSBSdW5TaGVsbChjbWQpCisgICAgY291bnQgPSAwCisgICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCk6CisgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIkluZGV4OiIpIG9yIGxpbmUuc3RhcnRzd2l0aCgiUHJvcGVydHkgY2hhbmdlcyBvbjoiKToKKyAgICAgICAgY291bnQgKz0gMQorICAgICAgICBsb2dnaW5nLmluZm8obGluZSkKKyAgICBpZiBub3QgY291bnQ6CisgICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20gc3ZuIGRpZmYiKQorICAgIHJldHVybiBkYXRhCisKKyAgZGVmIF9Db2xsYXBzZUtleXdvcmRzKHNlbGYsIGNvbnRlbnQsIGtleXdvcmRfc3RyKToKKyAgICAiIiJDb2xsYXBzZXMgU1ZOIGtleXdvcmRzLiIiIgorICAgICMgc3ZuIGNhdCB0cmFuc2xhdGVzIGtleXdvcmRzIGJ1dCBzdm4gZGlmZiBkb2Vzbid0LiBBcyBhIHJlc3VsdCBvZiB0aGlzCisgICAgIyBiZWhhdmlvciBwYXRjaGluZy5QYXRjaENodW5rcygpIGZhaWxzIHdpdGggYSBjaHVuayBtaXNtYXRjaCBlcnJvci4KKyAgICAjIFRoaXMgcGFydCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IHRoZSBSZXZpZXcgQm9hcmQgZGV2ZWxvcG1lbnQgdGVhbQorICAgICMgd2hvIGhhZCB0aGUgc2FtZSBwcm9ibGVtIChodHRwOi8vcmV2aWV3cy5yZXZpZXctYm9hcmQub3JnL3IvMjc2LykuCisgICAgIyBNYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtub3duIGFsaWFzZXMKKyAgICBzdm5fa2V5d29yZHMgPSB7CisgICAgICAjIFN0YW5kYXJkIGtleXdvcmRzCisgICAgICAnRGF0ZSc6ICAgICAgICAgICAgICAgIFsnRGF0ZScsICdMYXN0Q2hhbmdlZERhdGUnXSwKKyAgICAgICdSZXZpc2lvbic6ICAgICAgICAgICAgWydSZXZpc2lvbicsICdMYXN0Q2hhbmdlZFJldmlzaW9uJywgJ1JldiddLAorICAgICAgJ0F1dGhvcic6ICAgICAgICAgICAgICBbJ0F1dGhvcicsICdMYXN0Q2hhbmdlZEJ5J10sCisgICAgICAnSGVhZFVSTCc6ICAgICAgICAgICAgIFsnSGVhZFVSTCcsICdVUkwnXSwKKyAgICAgICdJZCc6ICAgICAgICAgICAgICAgICAgWydJZCddLAorCisgICAgICAjIEFsaWFzZXMKKyAgICAgICdMYXN0Q2hhbmdlZERhdGUnOiAgICAgWydMYXN0Q2hhbmdlZERhdGUnLCAnRGF0ZSddLAorICAgICAgJ0xhc3RDaGFuZ2VkUmV2aXNpb24nOiBbJ0xhc3RDaGFuZ2VkUmV2aXNpb24nLCAnUmV2JywgJ1JldmlzaW9uJ10sCisgICAgICAnTGFzdENoYW5nZWRCeSc6ICAgICAgIFsnTGFzdENoYW5nZWRCeScsICdBdXRob3InXSwKKyAgICAgICdVUkwnOiAgICAgICAgICAgICAgICAgWydVUkwnLCAnSGVhZFVSTCddLAorICAgIH0KKworICAgIGRlZiByZXBsKG0pOgorICAgICAgIGlmIG0uZ3JvdXAoMik6CisgICAgICAgICByZXR1cm4gIiQlczo6JXMkIiAlIChtLmdyb3VwKDEpLCAiICIgKiBsZW4obS5ncm91cCgzKSkpCisgICAgICAgcmV0dXJuICIkJXMkIiAlIG0uZ3JvdXAoMSkKKyAgICBrZXl3b3JkcyA9IFtrZXl3b3JkCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4ga2V5d29yZF9zdHIuc3BsaXQoIiAiKQorICAgICAgICAgICAgICAgIGZvciBrZXl3b3JkIGluIHN2bl9rZXl3b3Jkcy5nZXQobmFtZSwgW10pXQorICAgIHJldHVybiByZS5zdWIociJcJCglcyk6KDo/KShbXlwkXSspXCQiICUgJ3wnLmpvaW4oa2V5d29yZHMpLCByZXBsLCBjb250ZW50KQorCisgIGRlZiBHZXRVbmtub3duRmlsZXMoc2VsZik6CisgICAgc3RhdHVzID0gUnVuU2hlbGwoWyJzdm4iLCAic3RhdHVzIiwgIi0taWdub3JlLWV4dGVybmFscyJdLCBzaWxlbnRfb2s9VHJ1ZSkKKyAgICB1bmtub3duX2ZpbGVzID0gW10KKyAgICBmb3IgbGluZSBpbiBzdGF0dXMuc3BsaXQoIlxuIik6CisgICAgICBpZiBsaW5lIGFuZCBsaW5lWzBdID09ICI/IjoKKyAgICAgICAgdW5rbm93bl9maWxlcy5hcHBlbmQobGluZSkKKyAgICByZXR1cm4gdW5rbm93bl9maWxlcworCisgIGRlZiBSZWFkRmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJucyB0aGUgY29udGVudHMgb2YgYSBmaWxlLiIiIgorICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lLCAncmInKQorICAgIHJlc3VsdCA9ICIiCisgICAgdHJ5OgorICAgICAgcmVzdWx0ID0gZmlsZS5yZWFkKCkKKyAgICBmaW5hbGx5OgorICAgICAgZmlsZS5jbG9zZSgpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBHZXRTdGF0dXMoc2VsZiwgZmlsZW5hbWUpOgorICAgICIiIlJldHVybnMgdGhlIHN0YXR1cyBvZiBhIGZpbGUuIiIiCisgICAgaWYgbm90IHNlbGYub3B0aW9ucy5yZXZpc2lvbjoKKyAgICAgIHN0YXR1cyA9IFJ1blNoZWxsKFsic3ZuIiwgInN0YXR1cyIsICItLWlnbm9yZS1leHRlcm5hbHMiLCBmaWxlbmFtZV0pCisgICAgICBpZiBub3Qgc3RhdHVzOgorICAgICAgICBFcnJvckV4aXQoInN2biBzdGF0dXMgcmV0dXJuZWQgbm8gb3V0cHV0IGZvciAlcyIgJSBmaWxlbmFtZSkKKyAgICAgIHN0YXR1c19saW5lcyA9IHN0YXR1cy5zcGxpdGxpbmVzKCkKKyAgICAgICMgSWYgZmlsZSBpcyBpbiBhIGNsLCB0aGUgb3V0cHV0IHdpbGwgYmVnaW4gd2l0aAorICAgICAgIyAiXG4tLS0gQ2hhbmdlbGlzdCAnY2xfbmFtZSc6XG4iLiAgU2VlCisgICAgICAjIGh0dHA6Ly9zdm4uY29sbGFiLm5ldC9yZXBvcy9zdm4vdHJ1bmsvbm90ZXMvY2hhbmdlbGlzdC1kZXNpZ24udHh0CisgICAgICBpZiAobGVuKHN0YXR1c19saW5lcykgPT0gMyBhbmQKKyAgICAgICAgICBub3Qgc3RhdHVzX2xpbmVzWzBdIGFuZAorICAgICAgICAgIHN0YXR1c19saW5lc1sxXS5zdGFydHN3aXRoKCItLS0gQ2hhbmdlbGlzdCIpKToKKyAgICAgICAgc3RhdHVzID0gc3RhdHVzX2xpbmVzWzJdCisgICAgICBlbHNlOgorICAgICAgICBzdGF0dXMgPSBzdGF0dXNfbGluZXNbMF0KKyAgICAjIElmIHdlIGhhdmUgYSByZXZpc2lvbiB0byBkaWZmIGFnYWluc3Qgd2UgbmVlZCB0byBydW4gInN2biBsaXN0IgorICAgICMgZm9yIHRoZSBvbGQgYW5kIHRoZSBuZXcgcmV2aXNpb24gYW5kIGNvbXBhcmUgdGhlIHJlc3VsdHMgdG8gZ2V0CisgICAgIyB0aGUgY29ycmVjdCBzdGF0dXMgZm9yIGEgZmlsZS4KKyAgICBlbHNlOgorICAgICAgZGlybmFtZSwgcmVsZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQorICAgICAgaWYgZGlybmFtZSBub3QgaW4gc2VsZi5zdm5sc19jYWNoZToKKyAgICAgICAgY21kID0gWyJzdm4iLCAibGlzdCIsICItciIsIHNlbGYucmV2X3N0YXJ0LCBkaXJuYW1lIG9yICIuIl0KKyAgICAgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisgICAgICAgIGlmIHJldHVybmNvZGU6CisgICAgICAgICAgRXJyb3JFeGl0KCJGYWlsZWQgdG8gZ2V0IHN0YXR1cyBmb3IgJXMuIiAlIGZpbGVuYW1lKQorICAgICAgICBvbGRfZmlsZXMgPSBvdXQuc3BsaXRsaW5lcygpCisgICAgICAgIGFyZ3MgPSBbInN2biIsICJsaXN0Il0KKyAgICAgICAgaWYgc2VsZi5yZXZfZW5kOgorICAgICAgICAgIGFyZ3MgKz0gWyItciIsIHNlbGYucmV2X2VuZF0KKyAgICAgICAgY21kID0gYXJncyArIFtkaXJuYW1lIG9yICIuIl0KKyAgICAgICAgb3V0LCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisgICAgICAgIGlmIHJldHVybmNvZGU6CisgICAgICAgICAgRXJyb3JFeGl0KCJGYWlsZWQgdG8gcnVuIGNvbW1hbmQgJXMiICUgY21kKQorICAgICAgICBzZWxmLnN2bmxzX2NhY2hlW2Rpcm5hbWVdID0gKG9sZF9maWxlcywgb3V0LnNwbGl0bGluZXMoKSkKKyAgICAgIG9sZF9maWxlcywgbmV3X2ZpbGVzID0gc2VsZi5zdm5sc19jYWNoZVtkaXJuYW1lXQorICAgICAgaWYgcmVsZmlsZW5hbWUgaW4gb2xkX2ZpbGVzIGFuZCByZWxmaWxlbmFtZSBub3QgaW4gbmV3X2ZpbGVzOgorICAgICAgICBzdGF0dXMgPSAiRCAgICIKKyAgICAgIGVsaWYgcmVsZmlsZW5hbWUgaW4gb2xkX2ZpbGVzIGFuZCByZWxmaWxlbmFtZSBpbiBuZXdfZmlsZXM6CisgICAgICAgIHN0YXR1cyA9ICJNICAgIgorICAgICAgZWxzZToKKyAgICAgICAgc3RhdHVzID0gIkEgICAiCisgICAgcmV0dXJuIHN0YXR1cworCisgIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgc3RhdHVzID0gc2VsZi5HZXRTdGF0dXMoZmlsZW5hbWUpCisgICAgYmFzZV9jb250ZW50ID0gTm9uZQorICAgIG5ld19jb250ZW50ID0gTm9uZQorCisgICAgIyBJZiBhIGZpbGUgaXMgY29waWVkIGl0cyBzdGF0dXMgd2lsbCBiZSAiQSAgKyIsIHdoaWNoIHNpZ25pZmllcworICAgICMgImFkZGl0aW9uLXdpdGgtaGlzdG9yeSIuICBTZWUgInN2biBzdCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBXZSBuZWVkIHRvCisgICAgIyB1cGxvYWQgdGhlIG9yaWdpbmFsIGZpbGUgb3IgZWxzZSBkaWZmIHBhcnNpbmcgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIHdhcworICAgICMgZWRpdGVkLgorICAgIGlmIHN0YXR1c1swXSA9PSAiQSIgYW5kIHN0YXR1c1szXSAhPSAiKyI6CisgICAgICAjIFdlJ2xsIG5lZWQgdG8gdXBsb2FkIHRoZSBuZXcgY29udGVudCBpZiB3ZSdyZSBhZGRpbmcgYSBiaW5hcnkgZmlsZQorICAgICAgIyBzaW5jZSBkaWZmJ3Mgb3V0cHV0IHdvbid0IGNvbnRhaW4gaXQuCisgICAgICBtaW1ldHlwZSA9IFJ1blNoZWxsKFsic3ZuIiwgInByb3BnZXQiLCAic3ZuOm1pbWUtdHlwZSIsIGZpbGVuYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCisgICAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgICAgaXNfYmluYXJ5ID0gbWltZXR5cGUgYW5kIG5vdCBtaW1ldHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIpCisgICAgICBpZiBpc19iaW5hcnkgYW5kIHNlbGYuSXNJbWFnZShmaWxlbmFtZSk6CisgICAgICAgIG5ld19jb250ZW50ID0gc2VsZi5SZWFkRmlsZShmaWxlbmFtZSkKKyAgICBlbGlmIChzdGF0dXNbMF0gaW4gKCJNIiwgIkQiLCAiUiIpIG9yCisgICAgICAgICAgKHN0YXR1c1swXSA9PSAiQSIgYW5kIHN0YXR1c1szXSA9PSAiKyIpIG9yICAjIENvcGllZCBmaWxlLgorICAgICAgICAgIChzdGF0dXNbMF0gPT0gIiAiIGFuZCBzdGF0dXNbMV0gPT0gIk0iKSk6ICAjIFByb3BlcnR5IGNoYW5nZS4KKyAgICAgIGFyZ3MgPSBbXQorICAgICAgaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uOgorICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKKyAgICAgIGVsc2U6CisgICAgICAgICMgRG9uJ3QgY2hhbmdlIGZpbGVuYW1lLCBpdCdzIG5lZWRlZCBsYXRlci4KKyAgICAgICAgdXJsID0gZmlsZW5hbWUKKyAgICAgICAgYXJncyArPSBbIi1yIiwgIkJBU0UiXQorICAgICAgY21kID0gWyJzdm4iXSArIGFyZ3MgKyBbInByb3BnZXQiLCAic3ZuOm1pbWUtdHlwZSIsIHVybF0KKyAgICAgIG1pbWV0eXBlLCByZXR1cm5jb2RlID0gUnVuU2hlbGxXaXRoUmV0dXJuQ29kZShjbWQpCisgICAgICBpZiByZXR1cm5jb2RlOgorICAgICAgICAjIEZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHJlcXVlc3RlZCByZXZpc2lvbi4KKyAgICAgICAgIyBSZXNldCBtaW1ldHlwZSwgaXQgY29udGFpbnMgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgbWltZXR5cGUgPSAiIgorICAgICAgZ2V0X2Jhc2UgPSBGYWxzZQorICAgICAgaXNfYmluYXJ5ID0gbWltZXR5cGUgYW5kIG5vdCBtaW1ldHlwZS5zdGFydHN3aXRoKCJ0ZXh0LyIpCisgICAgICBpZiBzdGF0dXNbMF0gPT0gIiAiOgorICAgICAgICAjIEVtcHR5IGJhc2UgY29udGVudCBqdXN0IHRvIGZvcmNlIGFuIHVwbG9hZC4KKyAgICAgICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICAgIGVsaWYgaXNfYmluYXJ5OgorICAgICAgICBpZiBzZWxmLklzSW1hZ2UoZmlsZW5hbWUpOgorICAgICAgICAgIGdldF9iYXNlID0gVHJ1ZQorICAgICAgICAgIGlmIHN0YXR1c1swXSA9PSAiTSI6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZXZfZW5kOgorICAgICAgICAgICAgICBuZXdfY29udGVudCA9IHNlbGYuUmVhZEZpbGUoZmlsZW5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9lbmQpCisgICAgICAgICAgICAgIG5ld19jb250ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgdXJsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwgc2lsZW50X29rPVRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgYmFzZV9jb250ZW50ID0gIiIKKyAgICAgIGVsc2U6CisgICAgICAgIGdldF9iYXNlID0gVHJ1ZQorCisgICAgICBpZiBnZXRfYmFzZToKKyAgICAgICAgaWYgaXNfYmluYXJ5OgorICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcyA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzID0gVHJ1ZQorICAgICAgICBpZiBzZWxmLnJldl9zdGFydDoKKyAgICAgICAgICAjICJzdm4gY2F0IC1yIFJFViBkZWxldGVfZmlsZS50eHQiIGRvZXNuJ3Qgd29yay4gY2F0IHJlcXVpcmVzCisgICAgICAgICAgIyB0aGUgZnVsbCBVUkwgd2l0aCAiQFJFViIgYXBwZW5kZWQgaW5zdGVhZCBvZiB1c2luZyAiLXIiIG9wdGlvbi4KKyAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKKyAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbInN2biIsICJjYXQiLCB1cmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgYmFzZV9jb250ZW50ID0gUnVuU2hlbGwoWyJzdm4iLCAiY2F0IiwgZmlsZW5hbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz11bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50X29rPVRydWUpCisgICAgICAgIGlmIG5vdCBpc19iaW5hcnk6CisgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgaWYgc2VsZi5yZXZfc3RhcnQ6CisgICAgICAgICAgICB1cmwgPSAiJXMvJXNAJXMiICUgKHNlbGYuc3ZuX2Jhc2UsIGZpbGVuYW1lLCBzZWxmLnJldl9zdGFydCkKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXJsID0gZmlsZW5hbWUKKyAgICAgICAgICAgIGFyZ3MgKz0gWyItciIsICJCQVNFIl0KKyAgICAgICAgICBjbWQgPSBbInN2biJdICsgYXJncyArIFsicHJvcGdldCIsICJzdm46a2V5d29yZHMiLCB1cmxdCisgICAgICAgICAga2V5d29yZHMsIHJldHVybmNvZGUgPSBSdW5TaGVsbFdpdGhSZXR1cm5Db2RlKGNtZCkKKyAgICAgICAgICBpZiBrZXl3b3JkcyBhbmQgbm90IHJldHVybmNvZGU6CisgICAgICAgICAgICBiYXNlX2NvbnRlbnQgPSBzZWxmLl9Db2xsYXBzZUtleXdvcmRzKGJhc2VfY29udGVudCwga2V5d29yZHMpCisgICAgZWxzZToKKyAgICAgIFN0YXR1c1VwZGF0ZSgic3ZuIHN0YXR1cyByZXR1cm5lZCB1bmV4cGVjdGVkIG91dHB1dDogJXMiICUgc3RhdHVzKQorICAgICAgc3lzLmV4aXQoMSkKKyAgICByZXR1cm4gYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXNbMDo1XQorCisKK2NsYXNzIEdpdFZDUyhWZXJzaW9uQ29udHJvbFN5c3RlbSk6CisgICIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnRlcmZhY2UgZm9yIEdpdC4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6CisgICAgc3VwZXIoR2l0VkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQorICAgICMgTWFwIG9mIGZpbGVuYW1lIC0+IGhhc2ggb2YgYmFzZSBmaWxlLgorICAgIHNlbGYuYmFzZV9oYXNoZXMgPSB7fQorCisgIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgZXh0cmFfYXJncyk6CisgICAgIyBUaGlzIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBzdm4ncyBHZW5lcmF0ZURpZmYgYmVjYXVzZSB3ZSBtdXN0IGNvbnZlcnQKKyAgICAjIHRoZSBkaWZmIG91dHB1dCB0byBpbmNsdWRlIGFuIHN2bi1zdHlsZSAiSW5kZXg6IiBsaW5lIGFzIHdlbGwgYXMgcmVjb3JkCisgICAgIyB0aGUgaGFzaGVzIG9mIHRoZSBiYXNlIGZpbGVzLCBzbyB3ZSBjYW4gdXBsb2FkIHRoZW0gYWxvbmcgd2l0aCBvdXIgZGlmZi4KKyAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICBleHRyYV9hcmdzID0gW3NlbGYub3B0aW9ucy5yZXZpc2lvbl0gKyBleHRyYV9hcmdzCisgICAgZ2l0ZGlmZiA9IFJ1blNoZWxsKFsiZ2l0IiwgImRpZmYiLCAiLS1mdWxsLWluZGV4Il0gKyBleHRyYV9hcmdzKQorICAgIHN2bmRpZmYgPSBbXQorICAgIGZpbGVjb3VudCA9IDAKKyAgICBmaWxlbmFtZSA9IE5vbmUKKyAgICBmb3IgbGluZSBpbiBnaXRkaWZmLnNwbGl0bGluZXMoKToKKyAgICAgIG1hdGNoID0gcmUubWF0Y2gociJkaWZmIC0tZ2l0IGEvKC4qKSBiLy4qJCIsIGxpbmUpCisgICAgICBpZiBtYXRjaDoKKyAgICAgICAgZmlsZWNvdW50ICs9IDEKKyAgICAgICAgZmlsZW5hbWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICBzdm5kaWZmLmFwcGVuZCgiSW5kZXg6ICVzXG4iICUgZmlsZW5hbWUpCisgICAgICBlbHNlOgorICAgICAgICAjIFRoZSAiaW5kZXgiIGxpbmUgaW4gYSBnaXQgZGlmZiBsb29rcyBsaWtlIHRoaXMgKGxvbmcgaGFzaGVzIGVsaWRlZCk6CisgICAgICAgICMgICBpbmRleCA4MmMwZDQ0Li5iMmNlZTNmIDEwMDc1NQorICAgICAgICAjIFdlIHdhbnQgdG8gc2F2ZSB0aGUgbGVmdCBoYXNoLCBhcyB0aGF0IGlkZW50aWZpZXMgdGhlIGJhc2UgZmlsZS4KKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyImluZGV4IChcdyspXC5cLiIsIGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgIHNlbGYuYmFzZV9oYXNoZXNbZmlsZW5hbWVdID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgIHN2bmRpZmYuYXBwZW5kKGxpbmUgKyAiXG4iKQorICAgIGlmIG5vdCBmaWxlY291bnQ6CisgICAgICBFcnJvckV4aXQoIk5vIHZhbGlkIHBhdGNoZXMgZm91bmQgaW4gb3V0cHV0IGZyb20gZ2l0IGRpZmYiKQorICAgIHJldHVybiAiIi5qb2luKHN2bmRpZmYpCisKKyAgZGVmIEdldFVua25vd25GaWxlcyhzZWxmKToKKyAgICBzdGF0dXMgPSBSdW5TaGVsbChbImdpdCIsICJscy1maWxlcyIsICItLWV4Y2x1ZGUtc3RhbmRhcmQiLCAiLS1vdGhlcnMiXSwKKyAgICAgICAgICAgICAgICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICByZXR1cm4gc3RhdHVzLnNwbGl0bGluZXMoKQorCisgIGRlZiBHZXRCYXNlRmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgaGFzaCA9IHNlbGYuYmFzZV9oYXNoZXNbZmlsZW5hbWVdCisgICAgYmFzZV9jb250ZW50ID0gTm9uZQorICAgIG5ld19jb250ZW50ID0gTm9uZQorICAgIGlzX2JpbmFyeSA9IEZhbHNlCisgICAgaWYgaGFzaCA9PSAiMCIgKiA0MDogICMgQWxsLXplcm8gaGFzaCBpbmRpY2F0ZXMgbm8gYmFzZSBmaWxlLgorICAgICAgc3RhdHVzID0gIkEiCisgICAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgIGVsc2U6CisgICAgICBzdGF0dXMgPSAiTSIKKyAgICAgIGJhc2VfY29udGVudCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJnaXQiLCAic2hvdyIsIGhhc2hdKQorICAgICAgaWYgcmV0dXJuY29kZToKKyAgICAgICAgRXJyb3JFeGl0KCJHb3QgZXJyb3Igc3RhdHVzIGZyb20gJ2dpdCBzaG93ICVzJyIgJSBoYXNoKQorICAgIHJldHVybiAoYmFzZV9jb250ZW50LCBuZXdfY29udGVudCwgaXNfYmluYXJ5LCBzdGF0dXMpCisKKworY2xhc3MgTWVyY3VyaWFsVkNTKFZlcnNpb25Db250cm9sU3lzdGVtKToKKyAgIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIFZlcnNpb25Db250cm9sU3lzdGVtIGludGVyZmFjZSBmb3IgTWVyY3VyaWFsLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCByZXBvX2Rpcik6CisgICAgc3VwZXIoTWVyY3VyaWFsVkNTLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zKQorICAgICMgQWJzb2x1dGUgcGF0aCB0byByZXBvc2l0b3J5ICh3ZSBjYW4gYmUgaW4gYSBzdWJkaXIpCisgICAgc2VsZi5yZXBvX2RpciA9IG9zLnBhdGgubm9ybXBhdGgocmVwb19kaXIpCisgICAgIyBDb21wdXRlIHRoZSBzdWJkaXIKKyAgICBjd2QgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLmdldGN3ZCgpKQorICAgIGFzc2VydCBjd2Quc3RhcnRzd2l0aChzZWxmLnJlcG9fZGlyKQorICAgIHNlbGYuc3ViZGlyID0gY3dkW2xlbihzZWxmLnJlcG9fZGlyKTpdLmxzdHJpcChyIlwvIikKKyAgICBpZiBzZWxmLm9wdGlvbnMucmV2aXNpb246CisgICAgICBzZWxmLmJhc2VfcmV2ID0gc2VsZi5vcHRpb25zLnJldmlzaW9uCisgICAgZWxzZToKKyAgICAgIHNlbGYuYmFzZV9yZXYgPSBSdW5TaGVsbChbImhnIiwgInBhcmVudCIsICItcSJdKS5zcGxpdCgnOicpWzFdLnN0cmlwKCkKKworICBkZWYgX0dldFJlbFBhdGgoc2VsZiwgZmlsZW5hbWUpOgorICAgICIiIkdldCByZWxhdGl2ZSBwYXRoIG9mIGEgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAorICAgIGdpdmVuIGl0cyBsb2dpY2FsIHBhdGggaW4gdGhlIHJlcG8uIiIiCisgICAgYXNzZXJ0IGZpbGVuYW1lLnN0YXJ0c3dpdGgoc2VsZi5zdWJkaXIpLCBmaWxlbmFtZQorICAgIHJldHVybiBmaWxlbmFtZVtsZW4oc2VsZi5zdWJkaXIpOl0ubHN0cmlwKHIiXC8iKQorCisgIGRlZiBHZW5lcmF0ZURpZmYoc2VsZiwgZXh0cmFfYXJncyk6CisgICAgIyBJZiBubyBmaWxlIHNwZWNpZmllZCwgcmVzdHJpY3QgdG8gdGhlIGN1cnJlbnQgc3ViZGlyCisgICAgZXh0cmFfYXJncyA9IGV4dHJhX2FyZ3Mgb3IgWyIuIl0KKyAgICBjbWQgPSBbImhnIiwgImRpZmYiLCAiLS1naXQiLCAiLXIiLCBzZWxmLmJhc2VfcmV2XSArIGV4dHJhX2FyZ3MKKyAgICBkYXRhID0gUnVuU2hlbGwoY21kLCBzaWxlbnRfb2s9VHJ1ZSkKKyAgICBzdm5kaWZmID0gW10KKyAgICBmaWxlY291bnQgPSAwCisgICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCk6CisgICAgICBtID0gcmUubWF0Y2goImRpZmYgLS1naXQgYS8oXFMrKSBiLyhcUyspIiwgbGluZSkKKyAgICAgIGlmIG06CisgICAgICAgICMgTW9kaWZ5IGxpbmUgdG8gbWFrZSBpdCBsb29rIGxpa2UgYXMgaXQgY29tZXMgZnJvbSBzdm4gZGlmZi4KKyAgICAgICAgIyBXaXRoIHRoaXMgbW9kaWZpY2F0aW9uIG5vIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlIGFyZSByZXF1aXJlZAorICAgICAgICAjIHRvIG1ha2UgdXBsb2FkLnB5IHdvcmsgd2l0aCBNZXJjdXJpYWwgcmVwb3MuCisgICAgICAgICMgTk9URTogZm9yIHByb3BlciBoYW5kbGluZyBvZiBtb3ZlZC9jb3BpZWQgZmlsZXMsIHdlIGhhdmUgdG8gdXNlCisgICAgICAgICMgdGhlIHNlY29uZCBmaWxlbmFtZS4KKyAgICAgICAgZmlsZW5hbWUgPSBtLmdyb3VwKDIpCisgICAgICAgIHN2bmRpZmYuYXBwZW5kKCJJbmRleDogJXMiICUgZmlsZW5hbWUpCisgICAgICAgIHN2bmRpZmYuYXBwZW5kKCI9IiAqIDY3KQorICAgICAgICBmaWxlY291bnQgKz0gMQorICAgICAgICBsb2dnaW5nLmluZm8obGluZSkKKyAgICAgIGVsc2U6CisgICAgICAgIHN2bmRpZmYuYXBwZW5kKGxpbmUpCisgICAgaWYgbm90IGZpbGVjb3VudDoKKyAgICAgIEVycm9yRXhpdCgiTm8gdmFsaWQgcGF0Y2hlcyBmb3VuZCBpbiBvdXRwdXQgZnJvbSBoZyBkaWZmIikKKyAgICByZXR1cm4gIlxuIi5qb2luKHN2bmRpZmYpICsgIlxuIgorCisgIGRlZiBHZXRVbmtub3duRmlsZXMoc2VsZik6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBmaWxlcyB1bmtub3duIHRvIHRoZSBWQ1MuIiIiCisgICAgYXJncyA9IFtdCisgICAgc3RhdHVzID0gUnVuU2hlbGwoWyJoZyIsICJzdGF0dXMiLCAiLS1yZXYiLCBzZWxmLmJhc2VfcmV2LCAiLXUiLCAiLiJdLAorICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICB1bmtub3duX2ZpbGVzID0gW10KKyAgICBmb3IgbGluZSBpbiBzdGF0dXMuc3BsaXRsaW5lcygpOgorICAgICAgc3QsIGZuID0gbGluZS5zcGxpdCgiICIsIDEpCisgICAgICBpZiBzdCA9PSAiPyI6CisgICAgICAgIHVua25vd25fZmlsZXMuYXBwZW5kKGZuKQorICAgIHJldHVybiB1bmtub3duX2ZpbGVzCisKKyAgZGVmIEdldEJhc2VGaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAjICJoZyBzdGF0dXMiIGFuZCAiaGcgY2F0IiBib3RoIHRha2UgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHN1YmRpcgorICAgICMgcmF0aGVyIHRoYW4gdG8gdGhlIHJlcG8gcm9vdCwgYnV0ICJoZyBkaWZmIiBoYXMgZ2l2ZW4gdXMgdGhlIGZ1bGwgcGF0aAorICAgICMgdG8gdGhlIHJlcG8gcm9vdC4KKyAgICBiYXNlX2NvbnRlbnQgPSAiIgorICAgIG5ld19jb250ZW50ID0gTm9uZQorICAgIGlzX2JpbmFyeSA9IEZhbHNlCisgICAgb2xkcmVscGF0aCA9IHJlbHBhdGggPSBzZWxmLl9HZXRSZWxQYXRoKGZpbGVuYW1lKQorICAgICMgImhnIHN0YXR1cyAtQyIgcmV0dXJucyB0d28gbGluZXMgZm9yIG1vdmVkL2NvcGllZCBmaWxlcywgb25lIG90aGVyd2lzZQorICAgIG91dCA9IFJ1blNoZWxsKFsiaGciLCAic3RhdHVzIiwgIi1DIiwgIi0tcmV2Iiwgc2VsZi5iYXNlX3JldiwgcmVscGF0aF0pCisgICAgb3V0ID0gb3V0LnNwbGl0bGluZXMoKQorICAgICMgSEFDSzogc3RyaXAgZXJyb3IgbWVzc2FnZSBhYm91dCBtaXNzaW5nIGZpbGUvZGlyZWN0b3J5IGlmIGl0IGlzbid0IGluCisgICAgIyB0aGUgd29ya2luZyBjb3B5CisgICAgaWYgb3V0WzBdLnN0YXJ0c3dpdGgoJyVzOiAnICUgcmVscGF0aCk6CisgICAgICBvdXQgPSBvdXRbMTpdCisgICAgaWYgbGVuKG91dCkgPiAxOgorICAgICAgIyBNb3ZlZC9jb3BpZWQgPT4gY29uc2lkZXJlZCBhcyBtb2RpZmllZCwgdXNlIG9sZCBmaWxlbmFtZSB0bworICAgICAgIyByZXRyaWV2ZSBiYXNlIGNvbnRlbnRzCisgICAgICBvbGRyZWxwYXRoID0gb3V0WzFdLnN0cmlwKCkKKyAgICAgIHN0YXR1cyA9ICJNIgorICAgIGVsc2U6CisgICAgICBzdGF0dXMsIF8gPSBvdXRbMF0uc3BsaXQoJyAnLCAxKQorICAgIGlmIHN0YXR1cyAhPSAiQSI6CisgICAgICBiYXNlX2NvbnRlbnQgPSBSdW5TaGVsbChbImhnIiwgImNhdCIsICItciIsIHNlbGYuYmFzZV9yZXYsIG9sZHJlbHBhdGhdLAorICAgICAgICBzaWxlbnRfb2s9VHJ1ZSkKKyAgICAgIGlzX2JpbmFyeSA9ICJcMCIgaW4gYmFzZV9jb250ZW50ICAjIE1lcmN1cmlhbCdzIGhldXJpc3RpYworICAgIGlmIHN0YXR1cyAhPSAiUiI6CisgICAgICBuZXdfY29udGVudCA9IG9wZW4ocmVscGF0aCwgInJiIikucmVhZCgpCisgICAgICBpc19iaW5hcnkgPSBpc19iaW5hcnkgb3IgIlwwIiBpbiBuZXdfY29udGVudAorICAgIGlmIGlzX2JpbmFyeSBhbmQgYmFzZV9jb250ZW50OgorICAgICAgIyBGZXRjaCBhZ2FpbiB3aXRob3V0IGNvbnZlcnRpbmcgbmV3bGluZXMKKyAgICAgIGJhc2VfY29udGVudCA9IFJ1blNoZWxsKFsiaGciLCAiY2F0IiwgIi1yIiwgc2VsZi5iYXNlX3Jldiwgb2xkcmVscGF0aF0sCisgICAgICAgIHNpbGVudF9vaz1UcnVlLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UpCisgICAgaWYgbm90IGlzX2JpbmFyeSBvciBub3Qgc2VsZi5Jc0ltYWdlKHJlbHBhdGgpOgorICAgICAgbmV3X2NvbnRlbnQgPSBOb25lCisgICAgcmV0dXJuIGJhc2VfY29udGVudCwgbmV3X2NvbnRlbnQsIGlzX2JpbmFyeSwgc3RhdHVzCisKKworIyBOT1RFOiBUaGUgU3BsaXRQYXRjaCBmdW5jdGlvbiBpcyBkdXBsaWNhdGVkIGluIGVuZ2luZS5weSwga2VlcCB0aGVtIGluIHN5bmMuCitkZWYgU3BsaXRQYXRjaChkYXRhKToKKyAgIiIiU3BsaXRzIGEgcGF0Y2ggaW50byBzZXBhcmF0ZSBwaWVjZXMgZm9yIGVhY2ggZmlsZS4KKworICBBcmdzOgorICAgIGRhdGE6IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG91dHB1dCBvZiBzdm4gZGlmZi4KKworICBSZXR1cm5zOgorICAgIEEgbGlzdCBvZiAyLXR1cGxlIChmaWxlbmFtZSwgdGV4dCkgd2hlcmUgdGV4dCBpcyB0aGUgc3ZuIGRpZmYgb3V0cHV0CisgICAgICBwZXJ0YWluaW5nIHRvIGZpbGVuYW1lLgorICAiIiIKKyAgcGF0Y2hlcyA9IFtdCisgIGZpbGVuYW1lID0gTm9uZQorICBkaWZmID0gW10KKyAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKFRydWUpOgorICAgIG5ld19maWxlbmFtZSA9IE5vbmUKKyAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0luZGV4OicpOgorICAgICAgdW51c2VkLCBuZXdfZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKKyAgICAgIG5ld19maWxlbmFtZSA9IG5ld19maWxlbmFtZS5zdHJpcCgpCisgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoJ1Byb3BlcnR5IGNoYW5nZXMgb246Jyk6CisgICAgICB1bnVzZWQsIHRlbXBfZmlsZW5hbWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKKyAgICAgICMgV2hlbiBhIGZpbGUgaXMgbW9kaWZpZWQsIHBhdGhzIHVzZSAnLycgYmV0d2VlbiBkaXJlY3RvcmllcywgaG93ZXZlcgorICAgICAgIyB3aGVuIGEgcHJvcGVydHkgaXMgbW9kaWZpZWQgJ1wnIGlzIHVzZWQgb24gV2luZG93cy4gIE1ha2UgdGhlbSB0aGUgc2FtZQorICAgICAgIyBvdGhlcndpc2UgdGhlIGZpbGUgc2hvd3MgdXAgdHdpY2UuCisgICAgICB0ZW1wX2ZpbGVuYW1lID0gdGVtcF9maWxlbmFtZS5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQorICAgICAgaWYgdGVtcF9maWxlbmFtZSAhPSBmaWxlbmFtZToKKyAgICAgICAgIyBGaWxlIGhhcyBwcm9wZXJ0eSBjaGFuZ2VzIGJ1dCBubyBtb2RpZmljYXRpb25zLCBjcmVhdGUgYSBuZXcgZGlmZi4KKyAgICAgICAgbmV3X2ZpbGVuYW1lID0gdGVtcF9maWxlbmFtZQorICAgIGlmIG5ld19maWxlbmFtZToKKyAgICAgIGlmIGZpbGVuYW1lIGFuZCBkaWZmOgorICAgICAgICBwYXRjaGVzLmFwcGVuZCgoZmlsZW5hbWUsICcnLmpvaW4oZGlmZikpKQorICAgICAgZmlsZW5hbWUgPSBuZXdfZmlsZW5hbWUKKyAgICAgIGRpZmYgPSBbbGluZV0KKyAgICAgIGNvbnRpbnVlCisgICAgaWYgZGlmZiBpcyBub3QgTm9uZToKKyAgICAgIGRpZmYuYXBwZW5kKGxpbmUpCisgIGlmIGZpbGVuYW1lIGFuZCBkaWZmOgorICAgIHBhdGNoZXMuYXBwZW5kKChmaWxlbmFtZSwgJycuam9pbihkaWZmKSkpCisgIHJldHVybiBwYXRjaGVzCisKKworZGVmIFVwbG9hZFNlcGFyYXRlUGF0Y2hlcyhpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hzZXQsIGRhdGEsIG9wdGlvbnMpOgorICAiIiJVcGxvYWRzIGEgc2VwYXJhdGUgcGF0Y2ggZm9yIGVhY2ggZmlsZSBpbiB0aGUgZGlmZiBvdXRwdXQuCisKKyAgUmV0dXJucyBhIGxpc3Qgb2YgW3BhdGNoX2tleSwgZmlsZW5hbWVdIGZvciBlYWNoIGZpbGUuCisgICIiIgorICBwYXRjaGVzID0gU3BsaXRQYXRjaChkYXRhKQorICBydiA9IFtdCisgIGZvciBwYXRjaCBpbiBwYXRjaGVzOgorICAgIGlmIGxlbihwYXRjaFsxXSkgPiBNQVhfVVBMT0FEX1NJWkU6CisgICAgICBwcmludCAoIk5vdCB1cGxvYWRpbmcgdGhlIHBhdGNoIGZvciAiICsgcGF0Y2hbMF0gKworICAgICAgICAgICAgICIgYmVjYXVzZSB0aGUgZmlsZSBpcyB0b28gbGFyZ2UuIikKKyAgICAgIGNvbnRpbnVlCisgICAgZm9ybV9maWVsZHMgPSBbKCJmaWxlbmFtZSIsIHBhdGNoWzBdKV0KKyAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiY29udGVudF91cGxvYWQiLCAiMSIpKQorICAgIGZpbGVzID0gWygiZGF0YSIsICJkYXRhLmRpZmYiLCBwYXRjaFsxXSldCisgICAgY3R5cGUsIGJvZHkgPSBFbmNvZGVNdWx0aXBhcnRGb3JtRGF0YShmb3JtX2ZpZWxkcywgZmlsZXMpCisgICAgdXJsID0gIi8lZC91cGxvYWRfcGF0Y2gvJWQiICUgKGludChpc3N1ZSksIGludChwYXRjaHNldCkpCisgICAgcHJpbnQgIlVwbG9hZGluZyBwYXRjaCBmb3IgIiArIHBhdGNoWzBdCisgICAgcmVzcG9uc2VfYm9keSA9IHJwY19zZXJ2ZXIuU2VuZCh1cmwsIGJvZHksIGNvbnRlbnRfdHlwZT1jdHlwZSkKKyAgICBsaW5lcyA9IHJlc3BvbnNlX2JvZHkuc3BsaXRsaW5lcygpCisgICAgaWYgbm90IGxpbmVzIG9yIGxpbmVzWzBdICE9ICJPSyI6CisgICAgICBTdGF0dXNVcGRhdGUoIiAgLS0+ICVzIiAlIHJlc3BvbnNlX2JvZHkpCisgICAgICBzeXMuZXhpdCgxKQorICAgIHJ2LmFwcGVuZChbbGluZXNbMV0sIHBhdGNoWzBdXSkKKyAgcmV0dXJuIHJ2CisKKworZGVmIEd1ZXNzVkNTKG9wdGlvbnMpOgorICAiIiJIZWxwZXIgdG8gZ3Vlc3MgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCisKKyAgVGhpcyBleGFtaW5lcyB0aGUgY3VycmVudCBkaXJlY3RvcnksIGd1ZXNzZXMgd2hpY2ggVmVyc2lvbkNvbnRyb2xTeXN0ZW0KKyAgd2UncmUgdXNpbmcsIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBjbGFzcy4gIEV4aXQgd2l0aCBhbgorICBlcnJvciBpZiB3ZSBjYW4ndCBmaWd1cmUgaXQgb3V0LgorCisgIFJldHVybnM6CisgICAgQSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbnN0YW5jZS4gRXhpdHMgaWYgdGhlIFZDUyBjYW4ndCBiZSBndWVzc2VkLgorICAiIiIKKyAgIyBNZXJjdXJpYWwgaGFzIGEgY29tbWFuZCB0byBnZXQgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIGEgcmVwb3NpdG9yeQorICAjIFRyeSBydW5uaW5nIGl0LCBidXQgZG9uJ3QgZGllIGlmIHdlIGRvbid0IGhhdmUgaGcgaW5zdGFsbGVkLgorICAjIE5PVEU6IHdlIHRyeSBNZXJjdXJpYWwgZmlyc3QgYXMgaXQgY2FuIHNpdCBvbiB0b3Agb2YgYW4gU1ZOIHdvcmtpbmcgY29weS4KKyAgdHJ5OgorICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJoZyIsICJyb290Il0pCisgICAgaWYgcmV0dXJuY29kZSA9PSAwOgorICAgICAgcmV0dXJuIE1lcmN1cmlhbFZDUyhvcHRpb25zLCBvdXQuc3RyaXAoKSkKKyAgZXhjZXB0IE9TRXJyb3IsIChlcnJubywgbWVzc2FnZSk6CisgICAgaWYgZXJybm8gIT0gMjogICMgRU5PRU5UIC0tIHRoZXkgZG9uJ3QgaGF2ZSBoZyBpbnN0YWxsZWQuCisgICAgICByYWlzZQorCisgICMgU3VidmVyc2lvbiBoYXMgYSAuc3ZuIGluIGFsbCB3b3JraW5nIGRpcmVjdG9yaWVzLgorICBpZiBvcy5wYXRoLmlzZGlyKCcuc3ZuJyk6CisgICAgbG9nZ2luZy5pbmZvKCJHdWVzc2VkIFZDUyA9IFN1YnZlcnNpb24iKQorICAgIHJldHVybiBTdWJ2ZXJzaW9uVkNTKG9wdGlvbnMpCisKKyAgIyBHaXQgaGFzIGEgY29tbWFuZCB0byB0ZXN0IGlmIHlvdSdyZSBpbiBhIGdpdCB0cmVlLgorICAjIFRyeSBydW5uaW5nIGl0LCBidXQgZG9uJ3QgZGllIGlmIHdlIGRvbid0IGhhdmUgZ2l0IGluc3RhbGxlZC4KKyAgdHJ5OgorICAgIG91dCwgcmV0dXJuY29kZSA9IFJ1blNoZWxsV2l0aFJldHVybkNvZGUoWyJnaXQiLCAicmV2LXBhcnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1pcy1pbnNpZGUtd29yay10cmVlIl0pCisgICAgaWYgcmV0dXJuY29kZSA9PSAwOgorICAgICAgcmV0dXJuIEdpdFZDUyhvcHRpb25zKQorICBleGNlcHQgT1NFcnJvciwgKGVycm5vLCBtZXNzYWdlKToKKyAgICBpZiBlcnJubyAhPSAyOiAgIyBFTk9FTlQgLS0gdGhleSBkb24ndCBoYXZlIGdpdCBpbnN0YWxsZWQuCisgICAgICByYWlzZQorCisgIEVycm9yRXhpdCgoIkNvdWxkIG5vdCBndWVzcyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLiAiCisgICAgICAgICAgICAgIkFyZSB5b3UgaW4gYSB3b3JraW5nIGNvcHkgZGlyZWN0b3J5PyIpKQorCisKK2RlZiBSZWFsTWFpbihhcmd2LCBkYXRhPU5vbmUpOgorICAiIiJUaGUgcmVhbCBtYWluIGZ1bmN0aW9uLgorCisgIEFyZ3M6CisgICAgYXJndjogQ29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICBkYXRhOiBEaWZmIGNvbnRlbnRzLiBJZiBOb25lIChkZWZhdWx0KSB0aGUgZGlmZiBpcyBnZW5lcmF0ZWQgYnkKKyAgICAgIHRoZSBWZXJzaW9uQ29udHJvbFN5c3RlbSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBieSBHdWVzc1ZDUygpLgorCisgIFJldHVybnM6CisgICAgQSAyLXR1cGxlIChpc3N1ZSBpZCwgcGF0Y2hzZXQgaWQpLgorICAgIFRoZSBwYXRjaHNldCBpZCBpcyBOb25lIGlmIHRoZSBiYXNlIGZpbGVzIGFyZSBub3QgdXBsb2FkZWQgYnkgdGhpcworICAgIHNjcmlwdCAoYXBwbGllcyBvbmx5IHRvIFNWTiBjaGVja291dHMpLgorICAiIiIKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZyhmb3JtYXQ9KCIlKGFzY3RpbWUpLjE5cyAlKGxldmVsbmFtZSlzICUoZmlsZW5hbWUpczoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJShsaW5lbm8pcyAlKG1lc3NhZ2UpcyAiKSkKKyAgb3MuZW52aXJvblsnTENfQUxMJ10gPSAnQycKKyAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3ZbMTpdKQorICBnbG9iYWwgdmVyYm9zaXR5CisgIHZlcmJvc2l0eSA9IG9wdGlvbnMudmVyYm9zZQorICBpZiB2ZXJib3NpdHkgPj0gMzoKKyAgICBsb2dnaW5nLmdldExvZ2dlcigpLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCisgIGVsaWYgdmVyYm9zaXR5ID49IDI6CisgICAgbG9nZ2luZy5nZXRMb2dnZXIoKS5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgIHZjcyA9IEd1ZXNzVkNTKG9wdGlvbnMpCisgIGlmIGlzaW5zdGFuY2UodmNzLCBTdWJ2ZXJzaW9uVkNTKToKKyAgICAjIGJhc2UgZmllbGQgaXMgb25seSBhbGxvd2VkIGZvciBTdWJ2ZXJzaW9uLgorICAgICMgTm90ZTogRmV0Y2hpbmcgYmFzZSBmaWxlcyBtYXkgYmVjb21lIGRlcHJlY2F0ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgorICAgIGJhc2UgPSB2Y3MuR3Vlc3NCYXNlKG9wdGlvbnMuZG93bmxvYWRfYmFzZSkKKyAgZWxzZToKKyAgICBiYXNlID0gTm9uZQorICBpZiBub3QgYmFzZSBhbmQgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgIG9wdGlvbnMuZG93bmxvYWRfYmFzZSA9IFRydWUKKyAgICBsb2dnaW5nLmluZm8oIkVuYWJsZWQgdXBsb2FkIG9mIGJhc2UgZmlsZSIpCisgIGlmIG5vdCBvcHRpb25zLmFzc3VtZV95ZXM6CisgICAgdmNzLkNoZWNrRm9yVW5rbm93bkZpbGVzKCkKKyAgaWYgZGF0YSBpcyBOb25lOgorICAgIGRhdGEgPSB2Y3MuR2VuZXJhdGVEaWZmKGFyZ3MpCisgIGZpbGVzID0gdmNzLkdldEJhc2VGaWxlcyhkYXRhKQorICBpZiB2ZXJib3NpdHkgPj0gMToKKyAgICBwcmludCAiVXBsb2FkIHNlcnZlcjoiLCBvcHRpb25zLnNlcnZlciwgIihjaGFuZ2Ugd2l0aCAtcy8tLXNlcnZlcikiCisgIGlmIG9wdGlvbnMuaXNzdWU6CisgICAgcHJvbXB0ID0gIk1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIHBhdGNoIHNldDogIgorICBlbHNlOgorICAgIHByb21wdCA9ICJOZXcgaXNzdWUgc3ViamVjdDogIgorICBtZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlIG9yIHJhd19pbnB1dChwcm9tcHQpLnN0cmlwKCkKKyAgaWYgbm90IG1lc3NhZ2U6CisgICAgRXJyb3JFeGl0KCJBIG5vbi1lbXB0eSBtZXNzYWdlIGlzIHJlcXVpcmVkIikKKyAgcnBjX3NlcnZlciA9IEdldFJwY1NlcnZlcihvcHRpb25zKQorICBmb3JtX2ZpZWxkcyA9IFsoInN1YmplY3QiLCBtZXNzYWdlKV0KKyAgaWYgYmFzZToKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJiYXNlIiwgYmFzZSkpCisgIGlmIG9wdGlvbnMuaXNzdWU6CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiaXNzdWUiLCBzdHIob3B0aW9ucy5pc3N1ZSkpKQorICBpZiBvcHRpb25zLmVtYWlsOgorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInVzZXIiLCBvcHRpb25zLmVtYWlsKSkKKyAgaWYgb3B0aW9ucy5yZXZpZXdlcnM6CisgICAgZm9yIHJldmlld2VyIGluIG9wdGlvbnMucmV2aWV3ZXJzLnNwbGl0KCcsJyk6CisgICAgICBpZiAiQCIgaW4gcmV2aWV3ZXIgYW5kIG5vdCByZXZpZXdlci5zcGxpdCgiQCIpWzFdLmNvdW50KCIuIikgPT0gMToKKyAgICAgICAgRXJyb3JFeGl0KCJJbnZhbGlkIGVtYWlsIGFkZHJlc3M6ICVzIiAlIHJldmlld2VyKQorICAgIGZvcm1fZmllbGRzLmFwcGVuZCgoInJldmlld2VycyIsIG9wdGlvbnMucmV2aWV3ZXJzKSkKKyAgaWYgb3B0aW9ucy5jYzoKKyAgICBmb3IgY2MgaW4gb3B0aW9ucy5jYy5zcGxpdCgnLCcpOgorICAgICAgaWYgIkAiIGluIGNjIGFuZCBub3QgY2Muc3BsaXQoIkAiKVsxXS5jb3VudCgiLiIpID09IDE6CisgICAgICAgIEVycm9yRXhpdCgiSW52YWxpZCBlbWFpbCBhZGRyZXNzOiAlcyIgJSBjYykKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJjYyIsIG9wdGlvbnMuY2MpKQorICBkZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb24KKyAgaWYgb3B0aW9ucy5kZXNjcmlwdGlvbl9maWxlOgorICAgIGlmIG9wdGlvbnMuZGVzY3JpcHRpb246CisgICAgICBFcnJvckV4aXQoIkNhbid0IHNwZWNpZnkgZGVzY3JpcHRpb24gYW5kIGRlc2NyaXB0aW9uX2ZpbGUiKQorICAgIGZpbGUgPSBvcGVuKG9wdGlvbnMuZGVzY3JpcHRpb25fZmlsZSwgJ3InKQorICAgIGRlc2NyaXB0aW9uID0gZmlsZS5yZWFkKCkKKyAgICBmaWxlLmNsb3NlKCkKKyAgaWYgZGVzY3JpcHRpb246CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbikpCisgICMgU2VuZCBhIGhhc2ggb2YgYWxsIHRoZSBiYXNlIGZpbGUgc28gdGhlIHNlcnZlciBjYW4gZGV0ZXJtaW5lIGlmIGEgY29weQorICAjIGFscmVhZHkgZXhpc3RzIGluIGFuIGVhcmxpZXIgcGF0Y2hzZXQuCisgIGJhc2VfaGFzaGVzID0gIiIKKyAgZm9yIGZpbGUsIGluZm8gaW4gZmlsZXMuaXRlcml0ZW1zKCk6CisgICAgaWYgbm90IGluZm9bMF0gaXMgTm9uZToKKyAgICAgIGNoZWNrc3VtID0gbWQ1Lm5ldyhpbmZvWzBdKS5oZXhkaWdlc3QoKQorICAgICAgaWYgYmFzZV9oYXNoZXM6CisgICAgICAgIGJhc2VfaGFzaGVzICs9ICJ8IgorICAgICAgYmFzZV9oYXNoZXMgKz0gY2hlY2tzdW0gKyAiOiIgKyBmaWxlCisgIGZvcm1fZmllbGRzLmFwcGVuZCgoImJhc2VfaGFzaGVzIiwgYmFzZV9oYXNoZXMpKQorICAjIElmIHdlJ3JlIHVwbG9hZGluZyBiYXNlIGZpbGVzLCBkb24ndCBzZW5kIHRoZSBlbWFpbCBiZWZvcmUgdGhlIHVwbG9hZHMsIHNvCisgICMgdGhhdCBpdCBjb250YWlucyB0aGUgZmlsZSBzdGF0dXMuCisgIGlmIG9wdGlvbnMuc2VuZF9tYWlsIGFuZCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgZm9ybV9maWVsZHMuYXBwZW5kKCgic2VuZF9tYWlsIiwgIjEiKSkKKyAgaWYgbm90IG9wdGlvbnMuZG93bmxvYWRfYmFzZToKKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJjb250ZW50X3VwbG9hZCIsICIxIikpCisgIGlmIGxlbihkYXRhKSA+IE1BWF9VUExPQURfU0laRToKKyAgICBwcmludCAiUGF0Y2ggaXMgbGFyZ2UsIHNvIHVwbG9hZGluZyBmaWxlIHBhdGNoZXMgc2VwYXJhdGVseS4iCisgICAgdXBsb2FkZWRfZGlmZl9maWxlID0gW10KKyAgICBmb3JtX2ZpZWxkcy5hcHBlbmQoKCJzZXBhcmF0ZV9wYXRjaGVzIiwgIjEiKSkKKyAgZWxzZToKKyAgICB1cGxvYWRlZF9kaWZmX2ZpbGUgPSBbKCJkYXRhIiwgImRhdGEuZGlmZiIsIGRhdGEpXQorICBjdHlwZSwgYm9keSA9IEVuY29kZU11bHRpcGFydEZvcm1EYXRhKGZvcm1fZmllbGRzLCB1cGxvYWRlZF9kaWZmX2ZpbGUpCisgIHJlc3BvbnNlX2JvZHkgPSBycGNfc2VydmVyLlNlbmQoIi91cGxvYWQiLCBib2R5LCBjb250ZW50X3R5cGU9Y3R5cGUpCisgIHBhdGNoc2V0ID0gTm9uZQorICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlIG9yIG5vdCB1cGxvYWRlZF9kaWZmX2ZpbGU6CisgICAgbGluZXMgPSByZXNwb25zZV9ib2R5LnNwbGl0bGluZXMoKQorICAgIGlmIGxlbihsaW5lcykgPj0gMjoKKyAgICAgIG1zZyA9IGxpbmVzWzBdCisgICAgICBwYXRjaHNldCA9IGxpbmVzWzFdLnN0cmlwKCkKKyAgICAgIHBhdGNoZXMgPSBbeC5zcGxpdCgiICIsIDEpIGZvciB4IGluIGxpbmVzWzI6XV0KKyAgICBlbHNlOgorICAgICAgbXNnID0gcmVzcG9uc2VfYm9keQorICBlbHNlOgorICAgIG1zZyA9IHJlc3BvbnNlX2JvZHkKKyAgU3RhdHVzVXBkYXRlKG1zZykKKyAgaWYgbm90IHJlc3BvbnNlX2JvZHkuc3RhcnRzd2l0aCgiSXNzdWUgY3JlYXRlZC4iKSBhbmQgXAorICBub3QgcmVzcG9uc2VfYm9keS5zdGFydHN3aXRoKCJJc3N1ZSB1cGRhdGVkLiIpOgorICAgIHN5cy5leGl0KDApCisgIGlzc3VlID0gbXNnW21zZy5yZmluZCgiLyIpKzE6XQorCisgIGlmIG5vdCB1cGxvYWRlZF9kaWZmX2ZpbGU6CisgICAgcmVzdWx0ID0gVXBsb2FkU2VwYXJhdGVQYXRjaGVzKGlzc3VlLCBycGNfc2VydmVyLCBwYXRjaHNldCwgZGF0YSwgb3B0aW9ucykKKyAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9iYXNlOgorICAgICAgcGF0Y2hlcyA9IHJlc3VsdAorCisgIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2Jhc2U6CisgICAgdmNzLlVwbG9hZEJhc2VGaWxlcyhpc3N1ZSwgcnBjX3NlcnZlciwgcGF0Y2hlcywgcGF0Y2hzZXQsIG9wdGlvbnMsIGZpbGVzKQorICAgIGlmIG9wdGlvbnMuc2VuZF9tYWlsOgorICAgICAgcnBjX3NlcnZlci5TZW5kKCIvIiArIGlzc3VlICsgIi9tYWlsIiwgcGF5bG9hZD0iIikKKyAgcmV0dXJuIGlzc3VlLCBwYXRjaHNldAorCisKK2RlZiBtYWluKCk6CisgIHRyeToKKyAgICBSZWFsTWFpbihzeXMuYXJndikKKyAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgIHByaW50CisgICAgU3RhdHVzVXBkYXRlKCJJbnRlcnJ1cHRlZC4iKQorICAgIHN5cy5leGl0KDEpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy91cGxvYWRfZ3Rlc3QucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc2NyaXB0cy91cGxvYWRfZ3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmUxOWFlOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zY3JpcHRzL3VwbG9hZF9ndGVzdC5weQpAQCAtMCwwICsxLDc4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJ1cGxvYWRfZ3Rlc3QucHkgdjAuMS4wIC0tIHVwbG9hZHMgYSBHb29nbGUgVGVzdCBwYXRjaCBmb3IgcmV2aWV3LgorCitUaGlzIHNpbXBsZSB3cmFwcGVyIHBhc3NlcyBhbGwgY29tbWFuZCBsaW5lIGZsYWdzIGFuZAorLS1jYz1nb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gdG8gdXBsb2FkLnB5LgorCitVU0FHRTogdXBsb2FkX2d0ZXN0LnB5IFtvcHRpb25zIGZvciB1cGxvYWQucHldCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK0NDX0ZMQUcgPSAnLS1jYz0nCitHVEVTVF9HUk9VUCA9ICdnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20nCisKKworZGVmIG1haW4oKToKKyAgIyBGaW5kcyB0aGUgcGF0aCB0byB1cGxvYWQucHksIGFzc3VtaW5nIGl0IGlzIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorICAjIGFzIHRoaXMgZmlsZS4KKyAgbXlfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCisgIHVwbG9hZF9weV9wYXRoID0gb3MucGF0aC5qb2luKG15X2RpciwgJ3VwbG9hZC5weScpCisKKyAgIyBBZGRzIEdvb2dsZSBUZXN0IGRpc2N1c3Npb24gZ3JvdXAgdG8gdGhlIGNjIGxpbmUgaWYgaXQncyBub3QgdGhlcmUKKyAgIyBhbHJlYWR5LgorICB1cGxvYWRfcHlfYXJndiA9IFt1cGxvYWRfcHlfcGF0aF0KKyAgZm91bmRfY2NfZmxhZyA9IEZhbHNlCisgIGZvciBhcmcgaW4gc3lzLmFyZ3ZbMTpdOgorICAgIGlmIGFyZy5zdGFydHN3aXRoKENDX0ZMQUcpOgorICAgICAgZm91bmRfY2NfZmxhZyA9IFRydWUKKyAgICAgIGNjX2xpbmUgPSBhcmdbbGVuKENDX0ZMQUcpOl0KKyAgICAgIGNjX2xpc3QgPSBbYWRkciBmb3IgYWRkciBpbiBjY19saW5lLnNwbGl0KCcsJykgaWYgYWRkcl0KKyAgICAgIGlmIEdURVNUX0dST1VQIG5vdCBpbiBjY19saXN0OgorICAgICAgICBjY19saXN0LmFwcGVuZChHVEVTVF9HUk9VUCkKKyAgICAgIHVwbG9hZF9weV9hcmd2LmFwcGVuZChDQ19GTEFHICsgJywnLmpvaW4oY2NfbGlzdCkpCisgICAgZWxzZToKKyAgICAgIHVwbG9hZF9weV9hcmd2LmFwcGVuZChhcmcpCisKKyAgaWYgbm90IGZvdW5kX2NjX2ZsYWc6CisgICAgdXBsb2FkX3B5X2FyZ3YuYXBwZW5kKENDX0ZMQUcgKyBHVEVTVF9HUk9VUCkKKworICAjIEludm9rZXMgdXBsb2FkLnB5IHdpdGggdGhlIG1vZGlmaWVkIGNvbW1hbmQgbGluZSBmbGFncy4KKyAgb3MuZXhlY3YodXBsb2FkX3B5X3BhdGgsIHVwbG9hZF9weV9hcmd2KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC1hbGwuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LWFsbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTljZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC1hbGwuY2MKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBTb21ldGltZXMgaXQncyBkZXNpcmFibGUgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYnkgY29tcGlsaW5nIGEgc2luZ2xlIGZpbGUuCisvLyBUaGlzIGZpbGUgc2VydmVzIHRoaXMgcHVycG9zZS4KKworLy8gVGhpcyBsaW5lIGVuc3VyZXMgdGhhdCBndGVzdC5oIGNhbiBiZSBjb21waWxlZCBvbiBpdHMgb3duLCBldmVuCisvLyB3aGVuIGl0J3MgZnVzZWQuCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwdWxsIGluIHRoZSByZWFsIGd0ZXN0ICouY2MgZmlsZXMuCisjaW5jbHVkZSAic3JjL2d0ZXN0LmNjIgorI2luY2x1ZGUgInNyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIgorI2luY2x1ZGUgInNyYy9ndGVzdC1maWxlcGF0aC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtcG9ydC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtcHJpbnRlcnMuY2MiCisjaW5jbHVkZSAic3JjL2d0ZXN0LXRlc3QtcGFydC5jYyIKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDc2ZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCkBAIC0wLDAgKzEsMTM0MCBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZGVhdGggdGVzdHMuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworIyBpZiBHVEVTVF9PU19NQUMKKyMgIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKKworIyBpbmNsdWRlIDxlcnJuby5oPgorIyBpbmNsdWRlIDxmY250bC5oPgorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKworIyBpZiBHVEVTVF9PU19MSU5VWAorIyAgaW5jbHVkZSA8c2lnbmFsLmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgIGluY2x1ZGUgPHN5cy93YWl0Lmg+CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyMgaWYgR1RFU1RfT1NfUU5YCisjICBpbmNsdWRlIDxzcGF3bi5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBleGlzdHMgdG8KKy8vIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgaW5jbHVzaW9uIG9mIGd0ZXN0LWludGVybmFsLWlubC5oIGluIHRoZQorLy8gdXNlcidzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIENvbnN0YW50cy4KKworLy8gVGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGVbXSA9ICJmYXN0IjsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgZGVhdGhfdGVzdF9zdHlsZSwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3N0eWxlIiwga0RlZmF1bHREZWF0aFRlc3RTdHlsZSksCisgICAgIkluZGljYXRlcyBob3cgdG8gcnVuIGEgZGVhdGggdGVzdCBpbiBhIGZvcmtlZCBjaGlsZCBwcm9jZXNzOiAiCisgICAgIlwidGhyZWFkc2FmZVwiIChjaGlsZCBwcm9jZXNzIHJlLWV4ZWN1dGVzIHRoZSB0ZXN0IGJpbmFyeSAiCisgICAgImZyb20gdGhlIGJlZ2lubmluZywgcnVubmluZyBvbmx5IHRoZSBzcGVjaWZpYyBkZWF0aCB0ZXN0KSBvciAiCisgICAgIlwiZmFzdFwiIChjaGlsZCBwcm9jZXNzIHJ1bnMgdGhlIGRlYXRoIHRlc3QgaW1tZWRpYXRlbHkgIgorICAgICJhZnRlciBmb3JraW5nKS4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmssCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3RfdXNlX2ZvcmsiLCBmYWxzZSksCisgICAgIkluc3RydWN0cyB0byB1c2UgZm9yaygpL19leGl0KCkgaW5zdGVhZCBvZiBjbG9uZSgpIGluIGRlYXRoIHRlc3RzLiAiCisgICAgIklnbm9yZWQgYW5kIGFsd2F5cyB1c2VzIGZvcmsoKSBvbiBQT1NJWCBzeXN0ZW1zIHdoZXJlIGNsb25lKCkgaXMgbm90ICIKKyAgICAiaW1wbGVtZW50ZWQuIFVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgdmFsZ3JpbmQgb3Igc2ltaWxhciB0b29scyBpZiAiCisgICAgInRob3NlIGRvIG5vdCBzdXBwb3J0IGNsb25lKCkuIFZhbGdyaW5kIDMuMy4xIHdpbGwganVzdCBmYWlsIGlmICIKKyAgICAiaXQgc2VlcyBhbiB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBjbG9uZSgpIGZsYWdzLiAiCisgICAgIkl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmbGFnIHcvbyB2YWxncmluZCB0aG91Z2ggaXQgd2lsbCAiCisgICAgIndvcmsgaW4gOTklIG9mIHRoZSBjYXNlcy4gT25jZSB2YWxncmluZCBpcyBmaXhlZCwgdGhpcyBmbGFnIHdpbGwgIgorICAgICJtb3N0IGxpa2VseSBiZSByZW1vdmVkLiIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QsICIiLAorICAgICJJbmRpY2F0ZXMgdGhlIGZpbGUsIGxpbmUgbnVtYmVyLCB0ZW1wb3JhbCBpbmRleCBvZiAiCisgICAgInRoZSBzaW5nbGUgZGVhdGggdGVzdCB0byBydW4sIGFuZCBhIGZpbGUgZGVzY3JpcHRvciB0byAiCisgICAgIndoaWNoIGEgc3VjY2VzcyBjb2RlIG1heSBiZSBzZW50LCBhbGwgc2VwYXJhdGVkIGJ5ICIKKyAgICAidGhlICd8JyBjaGFyYWN0ZXJzLiAgVGhpcyBmbGFnIGlzIHNwZWNpZmllZCBpZiBhbmQgb25seSBpZiB0aGUgY3VycmVudCAiCisgICAgInByb2Nlc3MgaXMgYSBzdWItcHJvY2VzcyBsYXVuY2hlZCBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlICIKKyAgICAiZGVhdGggdGVzdC4gIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4iKTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVmFsaWQgb25seSBmb3IgZmFzdCBkZWF0aCB0ZXN0cy4gSW5kaWNhdGVzIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gdGhlCisvLyBjaGlsZCBwcm9jZXNzIG9mIGEgZmFzdCBzdHlsZSBkZWF0aCB0ZXN0Lgorc3RhdGljIGJvb2wgZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQgPSBmYWxzZTsKKworLy8gUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgY3VycmVudGx5CisvLyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4gIFRvb2xzIHN1Y2ggYXMKKy8vIFZhbGdyaW5kIGhlYXAgY2hlY2tlcnMgbWF5IG5lZWQgdGhpcyB0byBtb2RpZnkgdGhlaXIgYmVoYXZpb3IgaW4gZGVhdGgKKy8vIHRlc3RzLiAgSU1QT1JUQU5UOiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkuICBVc2luZyBpdCBtYXkgYnJlYWsgdGhlCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBkZWF0aCB0ZXN0cy4gIFVzZXIgY29kZSBNVVNUIE5PVCB1c2UgaXQuCitib29sIEluRGVhdGhUZXN0Q2hpbGQoKSB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICAvLyBPbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyBhcmUgdGhyZWFkLXNhZmUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlCisgIC8vIGRlYXRoX3Rlc3Rfc3R5bGUgZmxhZy4KKyAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOworCisjIGVsc2UKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpCisgICAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOworICBlbHNlCisgICAgcmV0dXJuIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBFeGl0ZWRXaXRoQ29kZSBjb25zdHJ1Y3Rvci4KK0V4aXRlZFdpdGhDb2RlOjpFeGl0ZWRXaXRoQ29kZShpbnQgZXhpdF9jb2RlKSA6IGV4aXRfY29kZV8oZXhpdF9jb2RlKSB7Cit9CisKKy8vIEV4aXRlZFdpdGhDb2RlIGZ1bmN0aW9uLWNhbGwgb3BlcmF0b3IuCitib29sIEV4aXRlZFdpdGhDb2RlOjpvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3QgeworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIGV4aXRfc3RhdHVzID09IGV4aXRfY29kZV87CisKKyMgZWxzZQorCisgIHJldHVybiBXSUZFWElURUQoZXhpdF9zdGF0dXMpICYmIFdFWElUU1RBVFVTKGV4aXRfc3RhdHVzKSA9PSBleGl0X2NvZGVfOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIEtpbGxlZEJ5U2lnbmFsIGNvbnN0cnVjdG9yLgorS2lsbGVkQnlTaWduYWw6OktpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pIDogc2lnbnVtXyhzaWdudW0pIHsKK30KKworLy8gS2lsbGVkQnlTaWduYWwgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KK2Jvb2wgS2lsbGVkQnlTaWduYWw6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7CisjICBpZiBkZWZpbmVkKEdURVNUX0tJTExFRF9CWV9TSUdOQUxfT1ZFUlJJREVfKQorICB7CisgICAgYm9vbCByZXN1bHQ7CisgICAgaWYgKEdURVNUX0tJTExFRF9CWV9TSUdOQUxfT1ZFUlJJREVfKHNpZ251bV8sIGV4aXRfc3RhdHVzLCAmcmVzdWx0KSkgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKyMgIGVuZGlmICAvLyBkZWZpbmVkKEdURVNUX0tJTExFRF9CWV9TSUdOQUxfT1ZFUlJJREVfKQorICByZXR1cm4gV0lGU0lHTkFMRUQoZXhpdF9zdGF0dXMpICYmIFdURVJNU0lHKGV4aXRfc3RhdHVzKSA9PSBzaWdudW1fOworfQorIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVXRpbGl0aWVzIG5lZWRlZCBmb3IgZGVhdGggdGVzdHMuCisKKy8vIEdlbmVyYXRlcyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgYSBnaXZlbiBleGl0IGNvZGUsIGluIHRoZSBmb3JtYXQKKy8vIHNwZWNpZmllZCBieSB3YWl0KDIpLgorc3RhdGljIHN0ZDo6c3RyaW5nIEV4aXRTdW1tYXJ5KGludCBleGl0X2NvZGUpIHsKKyAgTWVzc2FnZSBtOworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IGV4aXRfY29kZTsKKworIyBlbHNlCisKKyAgaWYgKFdJRkVYSVRFRChleGl0X2NvZGUpKSB7CisgICAgbSA8PCAiRXhpdGVkIHdpdGggZXhpdCBzdGF0dXMgIiA8PCBXRVhJVFNUQVRVUyhleGl0X2NvZGUpOworICB9IGVsc2UgaWYgKFdJRlNJR05BTEVEKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICJUZXJtaW5hdGVkIGJ5IHNpZ25hbCAiIDw8IFdURVJNU0lHKGV4aXRfY29kZSk7CisgIH0KKyMgIGlmZGVmIFdDT1JFRFVNUAorICBpZiAoV0NPUkVEVU1QKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICIgKGNvcmUgZHVtcGVkKSI7CisgIH0KKyMgIGVuZGlmCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIG0uR2V0U3RyaW5nKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBleGl0X3N0YXR1cyBkZXNjcmliZXMgYSBwcm9jZXNzIHRoYXQgd2FzIHRlcm1pbmF0ZWQKKy8vIGJ5IGEgc2lnbmFsLCBvciBleGl0ZWQgbm9ybWFsbHkgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlLgorYm9vbCBFeGl0ZWRVbnN1Y2Nlc3NmdWxseShpbnQgZXhpdF9zdGF0dXMpIHsKKyAgcmV0dXJuICFFeGl0ZWRXaXRoQ29kZSgwKShleGl0X3N0YXR1cyk7Cit9CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIEdlbmVyYXRlcyBhIHRleHR1YWwgZmFpbHVyZSBtZXNzYWdlIHdoZW4gYSBkZWF0aCB0ZXN0IGZpbmRzIG1vcmUgdGhhbgorLy8gb25lIHRocmVhZCBydW5uaW5nLCBvciBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhyZWFkcywgcHJpb3IKKy8vIHRvIGV4ZWN1dGluZyB0aGUgZ2l2ZW4gc3RhdGVtZW50LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQorLy8gY2FsbGVyIG5vdCB0byBwYXNzIGEgdGhyZWFkX2NvdW50IG9mIDEuCitzdGF0aWMgc3RkOjpzdHJpbmcgRGVhdGhUZXN0VGhyZWFkV2FybmluZyhzaXplX3QgdGhyZWFkX2NvdW50KSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIkRlYXRoIHRlc3RzIHVzZSBmb3JrKCksIHdoaWNoIGlzIHVuc2FmZSBwYXJ0aWN1bGFybHkiCisgICAgICA8PCAiIGluIGEgdGhyZWFkZWQgY29udGV4dC4gRm9yIHRoaXMgdGVzdCwgIiA8PCBHVEVTVF9OQU1FXyA8PCAiICI7CisgIGlmICh0aHJlYWRfY291bnQgPT0gMCkKKyAgICBtc2cgPDwgImNvdWxkbid0IGRldGVjdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIjsKKyAgZWxzZQorICAgIG1zZyA8PCAiZGV0ZWN0ZWQgIiA8PCB0aHJlYWRfY291bnQgPDwgIiB0aHJlYWRzLiI7CisgIHJldHVybiBtc2cuR2V0U3RyaW5nKCk7Cit9CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBGbGFnIGNoYXJhY3RlcnMgZm9yIHJlcG9ydGluZyBhIGRlYXRoIHRlc3QgdGhhdCBkaWQgbm90IGRpZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RMaXZlZCA9ICdMJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RSZXR1cm5lZCA9ICdSJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RUaHJldyA9ICdUJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yID0gJ0knOworCisvLyBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgcG9zc2libGUgd2F5cyB0aGF0IGEgZGVhdGggdGVzdCBjYW4KKy8vIGNvbmNsdWRlLiAgRElFRCBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGRpZWQgd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0CisvLyBjb2RlOyBMSVZFRCBtZWFucyB0aGF0IHByb2Nlc3MgbGl2ZWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHRlc3QgY29kZTsKKy8vIFJFVFVSTkVEIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50IGF0dGVtcHRlZCB0byBleGVjdXRlIGEgcmV0dXJuCisvLyBzdGF0ZW1lbnQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkOyBUSFJFVyBtZWFucyB0aGF0IHRoZSB0ZXN0IHN0YXRlbWVudAorLy8gcmV0dXJuZWQgY29udHJvbCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24uICBJTl9QUk9HUkVTUyBtZWFucyB0aGUgdGVzdAorLy8gaGFzIG5vdCB5ZXQgY29uY2x1ZGVkLgorLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogVW5pZnkgbmFtZXMgYW5kIHBvc3NpYmx5IHZhbHVlcyBmb3IKKy8vIEFib3J0UmVhc29uLCBEZWF0aFRlc3RPdXRjb21lLCBhbmQgZmxhZyBjaGFyYWN0ZXJzIGFib3ZlLgorZW51bSBEZWF0aFRlc3RPdXRjb21lIHsgSU5fUFJPR1JFU1MsIERJRUQsIExJVkVELCBSRVRVUk5FRCwgVEhSRVcgfTsKKworLy8gUm91dGluZSBmb3IgYWJvcnRpbmcgdGhlIHByb2dyYW0gd2hpY2ggaXMgc2FmZSB0byBjYWxsIGZyb20gYW4KKy8vIGV4ZWMtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCBpbiB3aGljaCBjYXNlIHRoZSBlcnJvcgorLy8gbWVzc2FnZSBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCB0aGUKKy8vIG1lc3NhZ2UgaXMgc2ltcGx5IHByaW50ZWQgdG8gc3RkZXJyLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBwcm9ncmFtCisvLyB0aGVuIGV4aXRzIHdpdGggc3RhdHVzIDEuCit2b2lkIERlYXRoVGVzdEFib3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIC8vIE9uIGEgUE9TSVggc3lzdGVtLCB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBhIHRocmVhZHNhZmUtc3R5bGUKKyAgLy8gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCB3aGljaCBvcGVyYXRlcyBvbiBhIHZlcnkgc21hbGwgc3RhY2suICBVc2UKKyAgLy8gdGhlIGhlYXAgZm9yIGFueSBhZGRpdGlvbmFsIG5vbi1taW51c2N1bGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIEdldFVuaXRUZXN0SW1wbCgpLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICBGSUxFKiBwYXJlbnQgPSBwb3NpeDo6RkRPcGVuKGZsYWctPndyaXRlX2ZkKCksICJ3Iik7CisgICAgZnB1dGMoa0RlYXRoVGVzdEludGVybmFsRXJyb3IsIHBhcmVudCk7CisgICAgZnByaW50ZihwYXJlbnQsICIlcyIsIG1lc3NhZ2UuY19zdHIoKSk7CisgICAgZmZsdXNoKHBhcmVudCk7CisgICAgX2V4aXQoMSk7CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIG1lc3NhZ2UuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkFib3J0KCk7CisgIH0KK30KKworLy8gQSByZXBsYWNlbWVudCBmb3IgQ0hFQ0sgdGhhdCBjYWxscyBEZWF0aFRlc3RBYm9ydCBpZiB0aGUgYXNzZXJ0aW9uCisvLyBmYWlscy4KKyMgZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGV4cHJlc3Npb24pIFwKKyAgZG8geyBcCisgICAgaWYgKCE6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoZXhwcmVzc2lvbikpIHsgXAorICAgICAgRGVhdGhUZXN0QWJvcnQoIFwKKyAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJDSEVDSyBmYWlsZWQ6IEZpbGUgIikgKyBfX0ZJTEVfXyArICAiLCBsaW5lICIgXAorICAgICAgICAgICsgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKF9fTElORV9fKSArICI6ICIgXAorICAgICAgICAgICsgI2V4cHJlc3Npb24pOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIFRoaXMgbWFjcm8gaXMgc2ltaWxhciB0byBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXywgYnV0IGl0IGlzIG1lYW50IGZvcgorLy8gZXZhbHVhdGluZyBhbnkgc3lzdGVtIGNhbGwgdGhhdCBmdWxmaWxscyB0d28gY29uZGl0aW9uczogaXQgbXVzdCByZXR1cm4KKy8vIC0xIG9uIGZhaWx1cmUsIGFuZCBzZXQgZXJybm8gdG8gRUlOVFIgd2hlbiBpdCBpcyBpbnRlcnJ1cHRlZCBhbmQKKy8vIHNob3VsZCBiZSB0cmllZCBhZ2Fpbi4gIFRoZSBtYWNybyBleHBhbmRzIHRvIGEgbG9vcCB0aGF0IHJlcGVhdGVkbHkKKy8vIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhcyBsb25nIGFzIGl0IGV2YWx1YXRlcyB0byAtMSBhbmQgc2V0cworLy8gZXJybm8gdG8gRUlOVFIuICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gLTEgYnV0IGVycm5vIGlzCisvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBFSU5UUiwgRGVhdGhUZXN0QWJvcnQgaXMgY2FsbGVkLgorIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhleHByZXNzaW9uKSBcCisgIGRvIHsgXAorICAgIGludCBndGVzdF9yZXR2YWw7IFwKKyAgICBkbyB7IFwKKyAgICAgIGd0ZXN0X3JldHZhbCA9IChleHByZXNzaW9uKTsgXAorICAgIH0gd2hpbGUgKGd0ZXN0X3JldHZhbCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwKKyAgICBpZiAoZ3Rlc3RfcmV0dmFsID09IC0xKSB7IFwKKyAgICAgIERlYXRoVGVzdEFib3J0KCBcCisgICAgICAgICAgOjpzdGQ6OnN0cmluZygiQ0hFQ0sgZmFpbGVkOiBGaWxlICIpICsgX19GSUxFX18gKyAiLCBsaW5lICIgXAorICAgICAgICAgICsgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKF9fTElORV9fKSArICI6ICIgXAorICAgICAgICAgICsgI2V4cHJlc3Npb24gKyAiICE9IC0xIik7IFwKKyAgICB9IFwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworLy8gUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBsYXN0IHN5c3RlbSBlcnJvciBpbiBlcnJuby4KK3N0ZDo6c3RyaW5nIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkgeworICAgIHJldHVybiBlcnJubyA9PSAwID8gIiIgOiBwb3NpeDo6U3RyRXJyb3IoZXJybm8pOworfQorCisvLyBUaGlzIGlzIGNhbGxlZCBmcm9tIGEgZGVhdGggdGVzdCBwYXJlbnQgcHJvY2VzcyB0byByZWFkIGEgZmFpbHVyZQorLy8gbWVzc2FnZSBmcm9tIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgYW5kIGxvZyBpdCB3aXRoIHRoZSBGQVRBTAorLy8gc2V2ZXJpdHkuIE9uIFdpbmRvd3MsIHRoZSBtZXNzYWdlIGlzIHJlYWQgZnJvbSBhIHBpcGUgaGFuZGxlLiBPbiBvdGhlcgorLy8gcGxhdGZvcm1zLCBpdCBpcyByZWFkIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IuCitzdGF0aWMgdm9pZCBGYWlsRnJvbUludGVybmFsRXJyb3IoaW50IGZkKSB7CisgIE1lc3NhZ2UgZXJyb3I7CisgIGNoYXIgYnVmZmVyWzI1Nl07CisgIGludCBudW1fcmVhZDsKKworICBkbyB7CisgICAgd2hpbGUgKChudW1fcmVhZCA9IHBvc2l4OjpSZWFkKGZkLCBidWZmZXIsIDI1NSkpID4gMCkgeworICAgICAgYnVmZmVyW251bV9yZWFkXSA9ICdcMCc7CisgICAgICBlcnJvciA8PCBidWZmZXI7CisgICAgfQorICB9IHdoaWxlIChudW1fcmVhZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKG51bV9yZWFkID09IDApIHsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCBlcnJvci5HZXRTdHJpbmcoKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBpbnQgbGFzdF9lcnJvciA9IGVycm5vOworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJFcnJvciB3aGlsZSByZWFkaW5nIGRlYXRoIHRlc3QgaW50ZXJuYWw6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpIDw8ICIgWyIgPDwgbGFzdF9lcnJvciA8PCAiXSI7CisgIH0KK30KKworLy8gRGVhdGggdGVzdCBjb25zdHJ1Y3Rvci4gIEluY3JlbWVudHMgdGhlIHJ1bm5pbmcgZGVhdGggdGVzdCBjb3VudAorLy8gZm9yIHRoZSBjdXJyZW50IHRlc3QuCitEZWF0aFRlc3Q6OkRlYXRoVGVzdCgpIHsKKyAgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIERlYXRoVGVzdEFib3J0KCJDYW5ub3QgcnVuIGEgZGVhdGggdGVzdCBvdXRzaWRlIG9mIGEgVEVTVCBvciAiCisgICAgICAgICAgICAgICAgICAgIlRFU1RfRiBjb25zdHJ1Y3QiKTsKKyAgfQorfQorCisvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgZGVhdGggdGVzdCBieSBkaXNwYXRjaGluZyB0byB0aGUgY3VycmVudAorLy8gZGVhdGggdGVzdCBmYWN0b3J5LgorYm9vbCBEZWF0aFRlc3Q6OkNyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpIHsKKyAgcmV0dXJuIEdldFVuaXRUZXN0SW1wbCgpLT5kZWF0aF90ZXN0X2ZhY3RvcnkoKS0+Q3JlYXRlKAorICAgICAgc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSwgdGVzdCk7Cit9CisKK2NvbnN0IGNoYXIqIERlYXRoVGVzdDo6TGFzdE1lc3NhZ2UoKSB7CisgIHJldHVybiBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV8uY19zdHIoKTsKK30KKwordm9pZCBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV8gPSBtZXNzYWdlOworfQorCitzdGQ6OnN0cmluZyBEZWF0aFRlc3Q6Omxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKKworLy8gUHJvdmlkZXMgY3Jvc3MgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgZGVhdGggZnVuY3Rpb25hbGl0eS4KK2NsYXNzIERlYXRoVGVzdEltcGwgOiBwdWJsaWMgRGVhdGhUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIERlYXRoVGVzdEltcGwoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQorICAgICAgOiBzdGF0ZW1lbnRfKGFfc3RhdGVtZW50KSwKKyAgICAgICAgcmVnZXhfKGFfcmVnZXgpLAorICAgICAgICBzcGF3bmVkXyhmYWxzZSksCisgICAgICAgIHN0YXR1c18oLTEpLAorICAgICAgICBvdXRjb21lXyhJTl9QUk9HUkVTUyksCisgICAgICAgIHJlYWRfZmRfKC0xKSwKKyAgICAgICAgd3JpdGVfZmRfKC0xKSB7fQorCisgIC8vIHJlYWRfZmRfIGlzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZCBhbmQgY2xlYXJlZCBieSBhIGRlcml2ZWQgY2xhc3MuCisgIH5EZWF0aFRlc3RJbXBsKCkgeyBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhyZWFkX2ZkXyA9PSAtMSk7IH0KKworICB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbik7CisgIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBzdGF0dXNfb2spOworCisgIGNvbnN0IGNoYXIqIHN0YXRlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlbWVudF87IH0KKyAgY29uc3QgUkUqIHJlZ2V4KCkgY29uc3QgeyByZXR1cm4gcmVnZXhfOyB9CisgIGJvb2wgc3Bhd25lZCgpIGNvbnN0IHsgcmV0dXJuIHNwYXduZWRfOyB9CisgIHZvaWQgc2V0X3NwYXduZWQoYm9vbCBpc19zcGF3bmVkKSB7IHNwYXduZWRfID0gaXNfc3Bhd25lZDsgfQorICBpbnQgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gc3RhdHVzXzsgfQorICB2b2lkIHNldF9zdGF0dXMoaW50IGFfc3RhdHVzKSB7IHN0YXR1c18gPSBhX3N0YXR1czsgfQorICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWUoKSBjb25zdCB7IHJldHVybiBvdXRjb21lXzsgfQorICB2b2lkIHNldF9vdXRjb21lKERlYXRoVGVzdE91dGNvbWUgYW5fb3V0Y29tZSkgeyBvdXRjb21lXyA9IGFuX291dGNvbWU7IH0KKyAgaW50IHJlYWRfZmQoKSBjb25zdCB7IHJldHVybiByZWFkX2ZkXzsgfQorICB2b2lkIHNldF9yZWFkX2ZkKGludCBmZCkgeyByZWFkX2ZkXyA9IGZkOyB9CisgIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQorICB2b2lkIHNldF93cml0ZV9mZChpbnQgZmQpIHsgd3JpdGVfZmRfID0gZmQ7IH0KKworICAvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKKyAgLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXworICAvLyBtZW1iZXIsIGFuZCBjbG9zZXMgcmVhZF9mZF8uICBPdXRwdXRzIGRpYWdub3N0aWNzIGFuZCB0ZXJtaW5hdGVzIGluCisgIC8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KKyAgdm9pZCBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgcHJpdmF0ZToKKyAgLy8gVGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY29kZSB0aGlzIG9iamVjdCBpcyB0ZXN0aW5nLiAgVGhpcyBjbGFzcworICAvLyBkb2Vzbid0IG93biB0aGlzIHN0cmluZyBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KKyAgY29uc3QgY2hhciogY29uc3Qgc3RhdGVtZW50XzsKKyAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCB0ZXN0IG91dHB1dCBtdXN0IG1hdGNoLiAgRGVhdGhUZXN0SW1wbAorICAvLyBkb2Vzbid0IG93biB0aGlzIG9iamVjdCBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KKyAgY29uc3QgUkUqIGNvbnN0IHJlZ2V4XzsKKyAgLy8gVHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzcGF3bmVkLgorICBib29sIHNwYXduZWRfOworICAvLyBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuCisgIGludCBzdGF0dXNfOworICAvLyBIb3cgdGhlIGRlYXRoIHRlc3QgY29uY2x1ZGVkLgorICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWVfOworICAvLyBEZXNjcmlwdG9yIHRvIHRoZSByZWFkIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4gIEl0IGlzCisgIC8vIGFsd2F5cyAtMSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gIFRoZSBjaGlsZCBrZWVwcyBpdHMgd3JpdGUgZW5kIG9mIHRoZQorICAvLyBwaXBlIGluIHdyaXRlX2ZkXy4KKyAgaW50IHJlYWRfZmRfOworICAvLyBEZXNjcmlwdG9yIHRvIHRoZSBjaGlsZCdzIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgcGFyZW50IHByb2Nlc3MuCisgIC8vIEl0IGlzIGFsd2F5cyAtMSBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICBUaGUgcGFyZW50IGtlZXBzIGl0cyBlbmQgb2YgdGhlCisgIC8vIHBpcGUgaW4gcmVhZF9mZF8uCisgIGludCB3cml0ZV9mZF87Cit9OworCisvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKKy8vIHRlc3QgY2hpbGQgcHJvY2VzcyB2aWEgYSBwaXBlLCBpbnRlcnByZXRzIGl0IHRvIHNldCB0aGUgb3V0Y29tZV8KKy8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KKy8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KK3ZvaWQgRGVhdGhUZXN0SW1wbDo6UmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKSB7CisgIGNoYXIgZmxhZzsKKyAgaW50IGJ5dGVzX3JlYWQ7CisKKyAgLy8gVGhlIHJlYWQoKSBoZXJlIGJsb2NrcyB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZSAoc2lnbmlmeWluZyB0aGUKKyAgLy8gZmFpbHVyZSBvZiB0aGUgZGVhdGggdGVzdCkgb3IgdW50aWwgdGhlIHBpcGUgaXMgY2xvc2VkIChzaWduaWZ5aW5nCisgIC8vIGl0cyBzdWNjZXNzKSwgc28gaXQncyBva2F5IHRvIGNhbGwgdGhpcyBpbiB0aGUgcGFyZW50IGJlZm9yZQorICAvLyB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgZXhpdGVkLgorICBkbyB7CisgICAgYnl0ZXNfcmVhZCA9IHBvc2l4OjpSZWFkKHJlYWRfZmQoKSwgJmZsYWcsIDEpOworICB9IHdoaWxlIChieXRlc19yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgc2V0X291dGNvbWUoRElFRCk7CisgIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAxKSB7CisgICAgc3dpdGNoIChmbGFnKSB7CisgICAgICBjYXNlIGtEZWF0aFRlc3RSZXR1cm5lZDoKKyAgICAgICAgc2V0X291dGNvbWUoUkVUVVJORUQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdFRocmV3OgorICAgICAgICBzZXRfb3V0Y29tZShUSFJFVyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrRGVhdGhUZXN0TGl2ZWQ6CisgICAgICAgIHNldF9vdXRjb21lKExJVkVEKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yOgorICAgICAgICBGYWlsRnJvbUludGVybmFsRXJyb3IocmVhZF9mZCgpKTsgIC8vIERvZXMgbm90IHJldHVybi4KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHJlcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInVuZXhwZWN0ZWQgc3RhdHVzIGJ5dGUgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihmbGFnKSA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJSZWFkIGZyb20gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCk7CisgIH0KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhwb3NpeDo6Q2xvc2UocmVhZF9mZCgpKSk7CisgIHNldF9yZWFkX2ZkKC0xKTsKK30KKworLy8gU2lnbmFscyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNvZGUgd2hpY2ggc2hvdWxkIGhhdmUgZXhpdGVkLCBkaWRuJ3QuCisvLyBTaG91bGQgYmUgY2FsbGVkIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisvLyBXcml0ZXMgYSBzdGF0dXMgYnl0ZSB0byB0aGUgY2hpbGQncyBzdGF0dXMgZmlsZSBkZXNjcmlwdG9yLCB0aGVuCisvLyBjYWxscyBfZXhpdCgxKS4KK3ZvaWQgRGVhdGhUZXN0SW1wbDo6QWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKSB7CisgIC8vIFRoZSBwYXJlbnQgcHJvY2VzcyBjb25zaWRlcnMgdGhlIGRlYXRoIHRlc3QgdG8gYmUgYSBmYWlsdXJlIGlmCisgIC8vIGl0IGZpbmRzIGFueSBkYXRhIGluIG91ciBwaXBlLiAgU28sIGhlcmUgd2Ugd3JpdGUgYSBzaW5nbGUgZmxhZyBieXRlCisgIC8vIHRvIHRoZSBwaXBlLCB0aGVuIGV4aXQuCisgIGNvbnN0IGNoYXIgc3RhdHVzX2NoID0KKyAgICAgIHJlYXNvbiA9PSBURVNUX0RJRF9OT1RfRElFID8ga0RlYXRoVGVzdExpdmVkIDoKKyAgICAgIHJlYXNvbiA9PSBURVNUX1RIUkVXX0VYQ0VQVElPTiA/IGtEZWF0aFRlc3RUaHJldyA6IGtEZWF0aFRlc3RSZXR1cm5lZDsKKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpXcml0ZSh3cml0ZV9mZCgpLCAmc3RhdHVzX2NoLCAxKSk7CisgIC8vIFdlIGFyZSBsZWFraW5nIHRoZSBkZXNjcmlwdG9yIGhlcmUgYmVjYXVzZSBvbiBzb21lIHBsYXRmb3JtcyAoaS5lLiwKKyAgLy8gd2hlbiBidWlsdCBhcyBXaW5kb3dzIERMTCksIGRlc3RydWN0b3JzIG9mIGdsb2JhbCBvYmplY3RzIHdpbGwgc3RpbGwKKyAgLy8gcnVuIGFmdGVyIGNhbGxpbmcgX2V4aXQoKS4gT24gc3VjaCBzeXN0ZW1zLCB3cml0ZV9mZF8gd2lsbCBiZQorICAvLyBpbmRpcmVjdGx5IGNsb3NlZCBmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFVuaXRUZXN0SW1wbCwgY2F1c2luZyBkb3VibGUKKyAgLy8gY2xvc2UgaWYgaXQgaXMgYWxzbyBjbG9zZWQgaGVyZS4gT24gZGVidWcgY29uZmlndXJhdGlvbnMsIGRvdWJsZSBjbG9zZQorICAvLyBtYXkgYXNzZXJ0LiBBcyB0aGVyZSBhcmUgbm8gaW4tcHJvY2VzcyBidWZmZXJzIHRvIGZsdXNoIGhlcmUsIHdlIGFyZQorICAvLyByZWx5aW5nIG9uIHRoZSBPUyB0byBjbG9zZSB0aGUgZGVzY3JpcHRvciBhZnRlciB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzCisgIC8vIHdoZW4gdGhlIGRlc3RydWN0b3JzIGFyZSBub3QgcnVuLgorICBfZXhpdCgxKTsgIC8vIEV4aXRzIHcvbyBhbnkgbm9ybWFsIGV4aXQgaG9va3MgKHdlIHdlcmUgc3VwcG9zZWQgdG8gY3Jhc2gpCit9CisKKy8vIFJldHVybnMgYW4gaW5kZW50ZWQgY29weSBvZiBzdGRlcnIgb3V0cHV0IGZvciBhIGRlYXRoIHRlc3QuCisvLyBUaGlzIG1ha2VzIGRpc3Rpbmd1aXNoaW5nIGRlYXRoIHRlc3Qgb3V0cHV0IGxpbmVzIGZyb20gcmVndWxhciBsb2cgbGluZXMKKy8vIG11Y2ggZWFzaWVyLgorc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIG91dHB1dCkgeworICA6OnN0ZDo6c3RyaW5nIHJldDsKKyAgZm9yIChzaXplX3QgYXQgPSAwOyA7ICkgeworICAgIGNvbnN0IHNpemVfdCBsaW5lX2VuZCA9IG91dHB1dC5maW5kKCdcbicsIGF0KTsKKyAgICByZXQgKz0gIlsgIERFQVRIICAgXSAiOworICAgIGlmIChsaW5lX2VuZCA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0ICs9IG91dHB1dC5zdWJzdHIoYXQsIGxpbmVfZW5kICsgMSAtIGF0KTsKKyAgICBhdCA9IGxpbmVfZW5kICsgMTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBBc3Nlc3NlcyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIGEgZGVhdGggdGVzdCwgdXNpbmcgYm90aCBwcml2YXRlCisvLyBtZW1iZXJzIHdoaWNoIGhhdmUgcHJldmlvdXNseSBiZWVuIHNldCwgYW5kIG9uZSBhcmd1bWVudDoKKy8vCisvLyBQcml2YXRlIGRhdGEgbWVtYmVyczoKKy8vICAgb3V0Y29tZTogIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBkZWF0aCB0ZXN0CisvLyAgICAgICAgICAgICBjb25jbHVkZWQ6IERJRUQsIExJVkVELCBUSFJFVywgb3IgUkVUVVJORUQuICBUaGUgZGVhdGggdGVzdAorLy8gICAgICAgICAgICAgZmFpbHMgaW4gdGhlIGxhdHRlciB0aHJlZSBjYXNlcy4KKy8vICAgc3RhdHVzOiAgIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4gT24gKm5peCwgaXQgaXMgaW4gdGhlCisvLyAgICAgICAgICAgICBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB3YWl0KDIpLiBPbiBXaW5kb3dzLCB0aGlzIGlzIHRoZQorLy8gICAgICAgICAgICAgdmFsdWUgc3VwcGxpZWQgdG8gdGhlIEV4aXRQcm9jZXNzKCkgQVBJIG9yIGEgbnVtZXJpYyBjb2RlCisvLyAgICAgICAgICAgICBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgdGVybWluYXRlZCB0aGUgcHJvZ3JhbS4KKy8vICAgcmVnZXg6ICAgIEEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCB0byBiZSBhcHBsaWVkIHRvCisvLyAgICAgICAgICAgICB0aGUgdGVzdCdzIGNhcHR1cmVkIHN0YW5kYXJkIGVycm9yIG91dHB1dDsgdGhlIGRlYXRoIHRlc3QKKy8vICAgICAgICAgICAgIGZhaWxzIGlmIGl0IGRvZXMgbm90IG1hdGNoLgorLy8KKy8vIEFyZ3VtZW50OgorLy8gICBzdGF0dXNfb2s6IHRydWUgaWYgZXhpdF9zdGF0dXMgaXMgYWNjZXB0YWJsZSBpbiB0aGUgY29udGV4dCBvZgorLy8gICAgICAgICAgICAgIHRoaXMgcGFydGljdWxhciBkZWF0aCB0ZXN0LCB3aGljaCBmYWlscyBpZiBpdCBpcyBmYWxzZQorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBtZXQuICBPdGhlcndpc2UsIHRoZQorLy8gZmlyc3QgZmFpbGluZyBjb25kaXRpb24sIGluIHRoZSBvcmRlciBnaXZlbiBhYm92ZSwgaXMgdGhlIG9uZSB0aGF0IGlzCisvLyByZXBvcnRlZC4gQWxzbyBzZXRzIHRoZSBsYXN0IGRlYXRoIHRlc3QgbWVzc2FnZSBzdHJpbmcuCitib29sIERlYXRoVGVzdEltcGw6OlBhc3NlZChib29sIHN0YXR1c19vaykgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXJyb3JfbWVzc2FnZSA9IEdldENhcHR1cmVkU3RkZXJyKCk7CisKKyAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgIE1lc3NhZ2UgYnVmZmVyOworCisgIGJ1ZmZlciA8PCAiRGVhdGggdGVzdDogIiA8PCBzdGF0ZW1lbnQoKSA8PCAiXG4iOworICBzd2l0Y2ggKG91dGNvbWUoKSkgeworICAgIGNhc2UgTElWRUQ6CisgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGZhaWxlZCB0byBkaWUuXG4iCisgICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEhSRVc6CisgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IHRocmV3IGFuIGV4Y2VwdGlvbi5cbiIKKyAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRVRVUk5FRDoKKyAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogaWxsZWdhbCByZXR1cm4gaW4gdGVzdCBzdGF0ZW1lbnQuXG4iCisgICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElFRDoKKyAgICAgIGlmIChzdGF0dXNfb2spIHsKKyAgICAgICAgY29uc3QgYm9vbCBtYXRjaGVkID0gUkU6OlBhcnRpYWxNYXRjaChlcnJvcl9tZXNzYWdlLmNfc3RyKCksICpyZWdleCgpKTsKKyAgICAgICAgaWYgKG1hdGNoZWQpIHsKKyAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGVycm9yLlxuIgorICAgICAgICAgICAgICAgICA8PCAiICBFeHBlY3RlZDogIiA8PCByZWdleCgpLT5wYXR0ZXJuKCkgPDwgIlxuIgorICAgICAgICAgICAgICAgICA8PCAiQWN0dWFsIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGV4aXQgY29kZTpcbiIKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAiIDw8IEV4aXRTdW1tYXJ5KHN0YXR1cygpKSA8PCAiXG4iCisgICAgICAgICAgICAgICA8PCAiQWN0dWFsIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJTl9QUk9HUkVTUzoKKyAgICBkZWZhdWx0OgorICAgICAgR1RFU1RfTE9HXyhGQVRBTCkKKyAgICAgICAgICA8PCAiRGVhdGhUZXN0OjpQYXNzZWQgc29tZWhvdyBjYWxsZWQgYmVmb3JlIGNvbmNsdXNpb24gb2YgdGVzdCI7CisgIH0KKworICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShidWZmZXIuR2V0U3RyaW5nKCkpOworICByZXR1cm4gc3VjY2VzczsKK30KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBXaW5kb3dzRGVhdGhUZXN0IGltcGxlbWVudHMgZGVhdGggdGVzdHMgb24gV2luZG93cy4gRHVlIHRvIHRoZQorLy8gc3BlY2lmaWNzIG9mIHN0YXJ0aW5nIG5ldyBwcm9jZXNzZXMgb24gV2luZG93cywgZGVhdGggdGVzdHMgdGhlcmUgYXJlCisvLyBhbHdheXMgdGhyZWFkc2FmZSwgYW5kIEdvb2dsZSBUZXN0IGNvbnNpZGVycyB0aGUKKy8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT1mYXN0IHNldHRpbmcgdG8gYmUgZXF1aXZhbGVudCB0bworLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPXRocmVhZHNhZmUgdGhlcmUuCisvLworLy8gQSBmZXcgaW1wbGVtZW50YXRpb24gbm90ZXM6ICBMaWtlIHRoZSBMaW51eCB2ZXJzaW9uLCB0aGUgV2luZG93cworLy8gaW1wbGVtZW50YXRpb24gdXNlcyBwaXBlcyBmb3IgY2hpbGQtdG8tcGFyZW50IGNvbW11bmljYXRpb24uIEJ1dCBkdWUgdG8KKy8vIHRoZSBzcGVjaWZpY3Mgb2YgcGlwZXMgb24gV2luZG93cywgc29tZSBleHRyYSBzdGVwcyBhcmUgcmVxdWlyZWQ6CisvLworLy8gMS4gVGhlIHBhcmVudCBjcmVhdGVzIGEgY29tbXVuaWNhdGlvbiBwaXBlIGFuZCBzdG9yZXMgaGFuZGxlcyB0byBib3RoCisvLyAgICBlbmRzIG9mIGl0LgorLy8gMi4gVGhlIHBhcmVudCBzdGFydHMgdGhlIGNoaWxkIGFuZCBwcm92aWRlcyBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbgorLy8gICAgbmVjZXNzYXJ5IHRvIGFjcXVpcmUgdGhlIGhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLgorLy8gMy4gVGhlIGNoaWxkIGFjcXVpcmVzIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgYW5kIHNpZ25hbHMgdGhlIHBhcmVudAorLy8gICAgdXNpbmcgYSBXaW5kb3dzIGV2ZW50LgorLy8gNC4gTm93IHRoZSBwYXJlbnQgY2FuIHJlbGVhc2UgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBvbiBpdHMgc2lkZS4gSWYKKy8vICAgIHRoaXMgaXMgZG9uZSBiZWZvcmUgc3RlcCAzLCB0aGUgb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IGdvZXMgZG93biB0bworLy8gICAgMCBhbmQgaXQgaXMgZGVzdHJveWVkLCBwcmV2ZW50aW5nIHRoZSBjaGlsZCBmcm9tIGFjcXVpcmluZyBpdC4gVGhlCisvLyAgICBwYXJlbnQgbm93IGhhcyB0byByZWxlYXNlIGl0LCBvciByZWFkIG9wZXJhdGlvbnMgb24gdGhlIHJlYWQgZW5kIG9mCisvLyAgICB0aGUgcGlwZSB3aWxsIG5vdCByZXR1cm4gd2hlbiB0aGUgY2hpbGQgdGVybWluYXRlcy4KKy8vIDUuIFRoZSBwYXJlbnQgcmVhZHMgY2hpbGQncyBvdXRwdXQgdGhyb3VnaCB0aGUgcGlwZSAob3V0Y29tZSBjb2RlIGFuZAorLy8gICAgYW55IHBvc3NpYmxlIGVycm9yIG1lc3NhZ2VzKSBmcm9tIHRoZSBwaXBlLCBhbmQgaXRzIHN0ZGVyciBhbmQgdGhlbgorLy8gICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGZhaWwgdGhlIHRlc3QuCisvLworLy8gTm90ZTogdG8gZGlzdGluZ3Vpc2ggV2luMzIgQVBJIGNhbGxzIGZyb20gdGhlIGxvY2FsIG1ldGhvZCBhbmQgZnVuY3Rpb24KKy8vIGNhbGxzLCB0aGUgZm9ybWVyIGFyZSBleHBsaWNpdGx5IHJlc29sdmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorLy8KK2NsYXNzIFdpbmRvd3NEZWF0aFRlc3QgOiBwdWJsaWMgRGVhdGhUZXN0SW1wbCB7CisgcHVibGljOgorICBXaW5kb3dzRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFKiBhX3JlZ2V4LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpCisgICAgICA6IERlYXRoVGVzdEltcGwoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLCBmaWxlXyhmaWxlKSwgbGluZV8obGluZSkge30KKworICAvLyBBbGwgb2YgdGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIERlYXRoVGVzdC4KKyAgdmlydHVhbCBpbnQgV2FpdCgpOworICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKKworIHByaXZhdGU6CisgIC8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfOworICAvLyBUaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgaW50IGxpbmVfOworICAvLyBIYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4KKyAgQXV0b0hhbmRsZSB3cml0ZV9oYW5kbGVfOworICAvLyBDaGlsZCBwcm9jZXNzIGhhbmRsZS4KKyAgQXV0b0hhbmRsZSBjaGlsZF9oYW5kbGVfOworICAvLyBFdmVudCB0aGUgY2hpbGQgcHJvY2VzcyB1c2VzIHRvIHNpZ25hbCB0aGUgcGFyZW50IHRoYXQgaXQgaGFzCisgIC8vIGFjcXVpcmVkIHRoZSBoYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4gQWZ0ZXIgc2VlaW5nIHRoaXMKKyAgLy8gZXZlbnQgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIGhhbmRsZXMgdG8gbWFrZSBzdXJlIGl0cworICAvLyBSZWFkRmlsZSgpIGNhbGxzIHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLgorICBBdXRvSGFuZGxlIGV2ZW50X2hhbmRsZV87Cit9OworCisvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIGluIGEgZGVhdGggdGVzdCB0byBleGl0LCByZXR1cm5pbmcgaXRzIGV4aXQKKy8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlCisvLyBvdXRjb21lIGRhdGEgbWVtYmVyLgoraW50IFdpbmRvd3NEZWF0aFRlc3Q6OldhaXQoKSB7CisgIGlmICghc3Bhd25lZCgpKQorICAgIHJldHVybiAwOworCisgIC8vIFdhaXQgdW50aWwgdGhlIGNoaWxkIGVpdGhlciBzaWduYWxzIHRoYXQgaXQgaGFzIGFjcXVpcmVkIHRoZSB3cml0ZSBlbmQKKyAgLy8gb2YgdGhlIHBpcGUgb3IgaXQgZGllcy4KKyAgY29uc3QgSEFORExFIHdhaXRfaGFuZGxlc1syXSA9IHsgY2hpbGRfaGFuZGxlXy5HZXQoKSwgZXZlbnRfaGFuZGxlXy5HZXQoKSB9OworICBzd2l0Y2ggKDo6V2FpdEZvck11bHRpcGxlT2JqZWN0cygyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2hhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gV2FpdHMgZm9yIGFueSBvZiB0aGUgaGFuZGxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpKSB7CisgICAgY2FzZSBXQUlUX09CSkVDVF8wOgorICAgIGNhc2UgV0FJVF9PQkpFQ1RfMCArIDE6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZmFsc2UpOyAgLy8gU2hvdWxkIG5vdCBnZXQgaGVyZS4KKyAgfQorCisgIC8vIFRoZSBjaGlsZCBoYXMgYWNxdWlyZWQgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBvciBleGl0ZWQuCisgIC8vIFdlIHJlbGVhc2UgdGhlIGhhbmRsZSBvbiBvdXIgc2lkZSBhbmQgY29udGludWUuCisgIHdyaXRlX2hhbmRsZV8uUmVzZXQoKTsKKyAgZXZlbnRfaGFuZGxlXy5SZXNldCgpOworCisgIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7CisKKyAgLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQgaWYgaXQgaGF2ZW4ndCBhbHJlYWR5LiBUaGlzCisgIC8vIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgdGhlIGNoaWxkIGhhcyBhbHJlYWR5IGV4aXRlZCwgcmVnYXJkbGVzcyBvZgorICAvLyB3aGV0aGVyIHByZXZpb3VzIGNhbGxzIHRvIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMgc3luY2hyb25pemVkIG9uIHRoaXMKKyAgLy8gaGFuZGxlIG9yIG5vdC4KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICBXQUlUX09CSkVDVF8wID09IDo6V2FpdEZvclNpbmdsZU9iamVjdChjaGlsZF9oYW5kbGVfLkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpKTsKKyAgRFdPUkQgc3RhdHVzX2NvZGU7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAorICAgICAgOjpHZXRFeGl0Q29kZVByb2Nlc3MoY2hpbGRfaGFuZGxlXy5HZXQoKSwgJnN0YXR1c19jb2RlKSAhPSBGQUxTRSk7CisgIGNoaWxkX2hhbmRsZV8uUmVzZXQoKTsKKyAgc2V0X3N0YXR1cyhzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1c19jb2RlKSk7CisgIHJldHVybiBzdGF0dXMoKTsKK30KKworLy8gVGhlIEFzc3VtZVJvbGUgcHJvY2VzcyBmb3IgYSBXaW5kb3dzIGRlYXRoIHRlc3QuICBJdCBjcmVhdGVzIGEgY2hpbGQKKy8vIHByb2Nlc3Mgd2l0aCB0aGUgc2FtZSBleGVjdXRhYmxlIGFzIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gcnVuIHRoZQorLy8gZGVhdGggdGVzdC4gIFRoZSBjaGlsZCBwcm9jZXNzIGlzIGdpdmVuIHRoZSAtLWd0ZXN0X2ZpbHRlciBhbmQKKy8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3Mgc3VjaCB0aGF0IGl0IGtub3dzIHRvIHJ1biB0aGUKKy8vIGN1cnJlbnQgZGVhdGggdGVzdCBvbmx5LgorRGVhdGhUZXN0OjpUZXN0Um9sZSBXaW5kb3dzRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIC8vIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgaGFzIHBlcmZvcm1lZCBhbGwgdGhlIG5lY2Vzc2FyeQorICAgIC8vIHByb2Nlc3NpbmcuCisgICAgc2V0X3dyaXRlX2ZkKGZsYWctPndyaXRlX2ZkKCkpOworICAgIHJldHVybiBFWEVDVVRFX1RFU1Q7CisgIH0KKworICAvLyBXaW5kb3dzRGVhdGhUZXN0IHVzZXMgYW4gYW5vbnltb3VzIHBpcGUgdG8gY29tbXVuaWNhdGUgcmVzdWx0cyBvZgorICAvLyBhIGRlYXRoIHRlc3QuCisgIFNFQ1VSSVRZX0FUVFJJQlVURVMgaGFuZGxlc19hcmVfaW5oZXJpdGFibGUgPSB7CisgICAgc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpLCBOVUxMLCBUUlVFIH07CisgIEhBTkRMRSByZWFkX2hhbmRsZSwgd3JpdGVfaGFuZGxlOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIDo6Q3JlYXRlUGlwZSgmcmVhZF9oYW5kbGUsICZ3cml0ZV9oYW5kbGUsICZoYW5kbGVzX2FyZV9pbmhlcml0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAwKSAgLy8gRGVmYXVsdCBidWZmZXIgc2l6ZS4KKyAgICAgICE9IEZBTFNFKTsKKyAgc2V0X3JlYWRfZmQoOjpfb3Blbl9vc2ZoYW5kbGUocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4ocmVhZF9oYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JET05MWSkpOworICB3cml0ZV9oYW5kbGVfLlJlc2V0KHdyaXRlX2hhbmRsZSk7CisgIGV2ZW50X2hhbmRsZV8uUmVzZXQoOjpDcmVhdGVFdmVudCgKKyAgICAgICZoYW5kbGVzX2FyZV9pbmhlcml0YWJsZSwKKyAgICAgIFRSVUUsICAgIC8vIFRoZSBldmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8gbm9uLXNpZ25hbGVkIHN0YXRlLgorICAgICAgRkFMU0UsICAgLy8gVGhlIGluaXRpYWwgc3RhdGUgaXMgbm9uLXNpZ25hbGxlZC4KKyAgICAgIE5VTEwpKTsgIC8vIFRoZSBldmVuIGlzIHVubmFtZWQuCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGV2ZW50X2hhbmRsZV8uR2V0KCkgIT0gTlVMTCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbHRlcl9mbGFnID0KKyAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ZpbHRlckZsYWcgKyAiPSIgKworICAgICAgaW5mby0+dGVzdF9jYXNlX25hbWUoKSArICIuIiArIGluZm8tPm5hbWUoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgaW50ZXJuYWxfZmxhZyA9CisgICAgICBzdGQ6OnN0cmluZygiLS0iKSArIEdURVNUX0ZMQUdfUFJFRklYXyArIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgKworICAgICAgIj0iICsgZmlsZV8gKyAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZV8pICsgInwiICsKKyAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhkZWF0aF90ZXN0X2luZGV4KSArICJ8IiArCisgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pig6OkdldEN1cnJlbnRQcm9jZXNzSWQoKSkpICsKKyAgICAgIC8vIHNpemVfdCBoYXMgdGhlIHNhbWUgd2lkdGggYXMgcG9pbnRlcnMgb24gYm90aCAzMi1iaXQgYW5kIDY0LWJpdAorICAgICAgLy8gV2luZG93cyBwbGF0Zm9ybXMuCisgICAgICAvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3RjeGYxZHc2LmFzcHguCisgICAgICAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHdyaXRlX2hhbmRsZSkpICsKKyAgICAgICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhyZWludGVycHJldF9jYXN0PHNpemVfdD4oZXZlbnRfaGFuZGxlXy5HZXQoKSkpOworCisgIGNoYXIgZXhlY3V0YWJsZV9wYXRoW19NQVhfUEFUSCArIDFdOyAgLy8gTk9MSU5UCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAorICAgICAgX01BWF9QQVRIICsgMSAhPSA6OkdldE1vZHVsZUZpbGVOYW1lQShOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NQVhfUEFUSCkpOworCisgIHN0ZDo6c3RyaW5nIGNvbW1hbmRfbGluZSA9CisgICAgICBzdGQ6OnN0cmluZyg6OkdldENvbW1hbmRMaW5lQSgpKSArICIgIiArIGZpbHRlcl9mbGFnICsgIiBcIiIgKworICAgICAgaW50ZXJuYWxfZmxhZyArICJcIiI7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gRmx1c2ggdGhlIGxvZyBidWZmZXJzIHNpbmNlIHRoZSBsb2cgc3RyZWFtcyBhcmUgc2hhcmVkIHdpdGggdGhlIGNoaWxkLgorICBGbHVzaEluZm9Mb2coKTsKKworICAvLyBUaGUgY2hpbGQgcHJvY2VzcyB3aWxsIHNoYXJlIHRoZSBzdGFuZGFyZCBoYW5kbGVzIHdpdGggdGhlIHBhcmVudC4KKyAgU1RBUlRVUElORk9BIHN0YXJ0dXBfaW5mbzsKKyAgbWVtc2V0KCZzdGFydHVwX2luZm8sIDAsIHNpemVvZihTVEFSVFVQSU5GTykpOworICBzdGFydHVwX2luZm8uZHdGbGFncyA9IFNUQVJURl9VU0VTVERIQU5ETEVTOworICBzdGFydHVwX2luZm8uaFN0ZElucHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSk7CisgIHN0YXJ0dXBfaW5mby5oU3RkT3V0cHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworICBzdGFydHVwX2luZm8uaFN0ZEVycm9yID0gOjpHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzX2luZm87CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKDo6Q3JlYXRlUHJvY2Vzc0EoCisgICAgICBleGVjdXRhYmxlX3BhdGgsCisgICAgICBjb25zdF9jYXN0PGNoYXIqPihjb21tYW5kX2xpbmUuY19zdHIoKSksCisgICAgICBOVUxMLCAgIC8vIFJldHVuZWQgcHJvY2VzcyBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgorICAgICAgTlVMTCwgICAvLyBSZXR1bmVkIHRocmVhZCBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgorICAgICAgVFJVRSwgICAvLyBDaGlsZCBpbmhlcml0cyBhbGwgaW5oZXJpdGFibGUgaGFuZGxlcyAoZm9yIHdyaXRlX2hhbmRsZV8pLgorICAgICAgMHgwLCAgICAvLyBEZWZhdWx0IGNyZWF0aW9uIGZsYWdzLgorICAgICAgTlVMTCwgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBlbnZpcm9ubWVudC4KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpLAorICAgICAgJnN0YXJ0dXBfaW5mbywKKyAgICAgICZwcm9jZXNzX2luZm8pICE9IEZBTFNFKTsKKyAgY2hpbGRfaGFuZGxlXy5SZXNldChwcm9jZXNzX2luZm8uaFByb2Nlc3MpOworICA6OkNsb3NlSGFuZGxlKHByb2Nlc3NfaW5mby5oVGhyZWFkKTsKKyAgc2V0X3NwYXduZWQodHJ1ZSk7CisgIHJldHVybiBPVkVSU0VFX1RFU1Q7Cit9CisjIGVsc2UgIC8vIFdlIGFyZSBub3Qgb24gV2luZG93cy4KKworLy8gRm9ya2luZ0RlYXRoVGVzdCBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIG1vc3Qgb2YgdGhlIGFic3RyYWN0CisvLyBtZXRob2RzIG9mIHRoZSBEZWF0aFRlc3QgaW50ZXJmYWNlLiAgT25seSB0aGUgQXNzdW1lUm9sZSBtZXRob2QgaXMKKy8vIGxlZnQgdW5kZWZpbmVkLgorY2xhc3MgRm9ya2luZ0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKKyBwdWJsaWM6CisgIEZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgpOworCisgIC8vIEFsbCBvZiB0aGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gRGVhdGhUZXN0LgorICB2aXJ0dWFsIGludCBXYWl0KCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgc2V0X2NoaWxkX3BpZChwaWRfdCBjaGlsZF9waWQpIHsgY2hpbGRfcGlkXyA9IGNoaWxkX3BpZDsgfQorCisgcHJpdmF0ZToKKyAgLy8gUElEIG9mIGNoaWxkIHByb2Nlc3MgZHVyaW5nIGRlYXRoIHRlc3Q7IDAgaW4gdGhlIGNoaWxkIHByb2Nlc3MgaXRzZWxmLgorICBwaWRfdCBjaGlsZF9waWRfOworfTsKKworLy8gQ29uc3RydWN0cyBhIEZvcmtpbmdEZWF0aFRlc3QuCitGb3JraW5nRGVhdGhUZXN0OjpGb3JraW5nRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkKKyAgICA6IERlYXRoVGVzdEltcGwoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLAorICAgICAgY2hpbGRfcGlkXygtMSkge30KKworLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0CisvLyBzdGF0dXMsIG9yIDAgaWYgbm8gY2hpbGQgcHJvY2VzcyBleGlzdHMuICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHRoZQorLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4KK2ludCBGb3JraW5nRGVhdGhUZXN0OjpXYWl0KCkgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gMDsKKworICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgIGludCBzdGF0dXNfdmFsdWU7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8od2FpdHBpZChjaGlsZF9waWRfLCAmc3RhdHVzX3ZhbHVlLCAwKSk7CisgIHNldF9zdGF0dXMoc3RhdHVzX3ZhbHVlKTsKKyAgcmV0dXJuIHN0YXR1c192YWx1ZTsKK30KKworLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MsIHRoZW4gaW1tZWRpYXRlbHkgcnVucyB0aGUgdGVzdAorLy8gaW4gdGhlIGNoaWxkIHByb2Nlc3MuCitjbGFzcyBOb0V4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7CisgcHVibGljOgorICBOb0V4ZWNEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KSA6CisgICAgICBGb3JraW5nRGVhdGhUZXN0KGFfc3RhdGVtZW50LCBhX3JlZ2V4KSB7IH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7Cit9OworCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLXJ1biBkZWF0aCB0ZXN0LiAgSXQgaW1wbGVtZW50cyBhCisvLyBzdHJhaWdodGZvcndhcmQgZm9yaywgd2l0aCBhIHNpbXBsZSBwaXBlIHRvIHRyYW5zbWl0IHRoZSBzdGF0dXMgYnl0ZS4KK0RlYXRoVGVzdDo6VGVzdFJvbGUgTm9FeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBzaXplX3QgdGhyZWFkX2NvdW50ID0gR2V0VGhyZWFkQ291bnQoKTsKKyAgaWYgKHRocmVhZF9jb3VudCAhPSAxKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCBEZWF0aFRlc3RUaHJlYWRXYXJuaW5nKHRocmVhZF9jb3VudCk7CisgIH0KKworICBpbnQgcGlwZV9mZFsyXTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocGlwZShwaXBlX2ZkKSAhPSAtMSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIC8vIFdoZW4gd2UgZm9yayB0aGUgcHJvY2VzcyBiZWxvdywgdGhlIGxvZyBmaWxlIGJ1ZmZlcnMgYXJlIGNvcGllZCwgYnV0IHRoZQorICAvLyBmaWxlIGRlc2NyaXB0b3JzIGFyZSBzaGFyZWQuICBXZSBmbHVzaCBhbGwgbG9nIGZpbGVzIGhlcmUgc28gdGhhdCBjbG9zaW5nCisgIC8vIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGluIHRoZSBjaGlsZCBwcm9jZXNzIGRvZXNuJ3QgdGhyb3cgb2ZmIHRoZQorICAvLyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBkZXNjcmlwdG9ycyBhbmQgYnVmZmVycyBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCisgIC8vIFRoaXMgaXMgYXMgY2xvc2UgdG8gdGhlIGZvcmsgYXMgcG9zc2libGUgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiBjYXNlCisgIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIHJ1bm5pbmcgYmVmb3JlIHRoZSBkZWF0aCB0ZXN0LCBhbmQgYW5vdGhlcgorICAvLyB0aHJlYWQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZS4KKyAgRmx1c2hJbmZvTG9nKCk7CisKKyAgY29uc3QgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7CisgIGlmIChjaGlsZF9waWQgPT0gMCkgeworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFswXSkpOworICAgIHNldF93cml0ZV9mZChwaXBlX2ZkWzFdKTsKKyAgICAvLyBSZWRpcmVjdHMgYWxsIGxvZ2dpbmcgdG8gc3RkZXJyIGluIHRoZSBjaGlsZCBwcm9jZXNzIHRvIHByZXZlbnQKKyAgICAvLyBjb25jdXJyZW50IHdyaXRlcyB0byB0aGUgbG9nIGZpbGVzLiAgV2UgY2FwdHVyZSBzdGRlcnIgaW4gdGhlIHBhcmVudAorICAgIC8vIHByb2Nlc3MgYW5kIGFwcGVuZCB0aGUgY2hpbGQgcHJvY2Vzcycgb3V0cHV0IHRvIGEgbG9nLgorICAgIExvZ1RvU3RkZXJyKCk7CisgICAgLy8gRXZlbnQgZm9yd2FyZGluZyB0byB0aGUgbGlzdGVuZXJzIG9mIGV2ZW50IGxpc3RlbmVyIEFQSSBtdXNoIGJlIHNodXQKKyAgICAvLyBkb3duIGluIGRlYXRoIHRlc3Qgc3VicHJvY2Vzc2VzLgorICAgIEdldFVuaXRUZXN0SW1wbCgpLT5saXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKyAgICBnX2luX2Zhc3RfZGVhdGhfdGVzdF9jaGlsZCA9IHRydWU7CisgICAgcmV0dXJuIEVYRUNVVEVfVEVTVDsKKyAgfSBlbHNlIHsKKyAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKHBpcGVfZmRbMV0pKTsKKyAgICBzZXRfcmVhZF9mZChwaXBlX2ZkWzBdKTsKKyAgICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgICByZXR1cm4gT1ZFUlNFRV9URVNUOworICB9Cit9CisKKy8vIEEgY29uY3JldGUgZGVhdGggdGVzdCBjbGFzcyB0aGF0IGZvcmtzIGFuZCByZS1leGVjdXRlcyB0aGUgbWFpbgorLy8gcHJvZ3JhbSBmcm9tIHRoZSBiZWdpbm5pbmcsIHdpdGggY29tbWFuZC1saW5lIGZsYWdzIHNldCB0aGF0IGNhdXNlCisvLyBvbmx5IHRoaXMgc3BlY2lmaWMgZGVhdGggdGVzdCB0byBiZSBydW4uCitjbGFzcyBFeGVjRGVhdGhUZXN0IDogcHVibGljIEZvcmtpbmdEZWF0aFRlc3QgeworIHB1YmxpYzoKKyAgRXhlY0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIDoKKyAgICAgIEZvcmtpbmdEZWF0aFRlc3QoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLCBmaWxlXyhmaWxlKSwgbGluZV8obGluZSkgeyB9CisgIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOworIHByaXZhdGU6CisgIHN0YXRpYyA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+CisgIEdldEFyZ3ZzRm9yRGVhdGhUZXN0Q2hpbGRQcm9jZXNzKCkgeworICAgIDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4gYXJncyA9IEdldEluamVjdGFibGVBcmd2cygpOworIyAgaWYgZGVmaW5lZChHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NPTU1BTkRfTElORV9BUkdTXykKKyAgICA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGV4dHJhX2FyZ3MgPQorICAgICAgICBHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NPTU1BTkRfTElORV9BUkdTXygpOworICAgIGFyZ3MuaW5zZXJ0KGFyZ3MuZW5kKCksIGV4dHJhX2FyZ3MuYmVnaW4oKSwgZXh0cmFfYXJncy5lbmQoKSk7CisjICBlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NPTU1BTkRfTElORV9BUkdTXykKKyAgICByZXR1cm4gYXJnczsKKyAgfQorICAvLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsKKyAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCisgIGNvbnN0IGludCBsaW5lXzsKK307CisKKy8vIFV0aWxpdHkgY2xhc3MgZm9yIGFjY3VtdWxhdGluZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorY2xhc3MgQXJndW1lbnRzIHsKKyBwdWJsaWM6CisgIEFyZ3VtZW50cygpIHsKKyAgICBhcmdzXy5wdXNoX2JhY2soTlVMTCk7CisgIH0KKworICB+QXJndW1lbnRzKCkgeworICAgIGZvciAoc3RkOjp2ZWN0b3I8Y2hhcio+OjppdGVyYXRvciBpID0gYXJnc18uYmVnaW4oKTsgaSAhPSBhcmdzXy5lbmQoKTsKKyAgICAgICAgICsraSkgeworICAgICAgZnJlZSgqaSk7CisgICAgfQorICB9CisgIHZvaWQgQWRkQXJndW1lbnQoY29uc3QgY2hhciogYXJndW1lbnQpIHsKKyAgICBhcmdzXy5pbnNlcnQoYXJnc18uZW5kKCkgLSAxLCBwb3NpeDo6U3RyRHVwKGFyZ3VtZW50KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyPgorICB2b2lkIEFkZEFyZ3VtZW50cyhjb25zdCA6OnN0ZDo6dmVjdG9yPFN0cj4mIGFyZ3VtZW50cykgeworICAgIGZvciAodHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxTdHI+Ojpjb25zdF9pdGVyYXRvciBpID0gYXJndW1lbnRzLmJlZ2luKCk7CisgICAgICAgICBpICE9IGFyZ3VtZW50cy5lbmQoKTsKKyAgICAgICAgICsraSkgeworICAgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChpLT5jX3N0cigpKSk7CisgICAgfQorICB9CisgIGNoYXIqIGNvbnN0KiBBcmd2KCkgeworICAgIHJldHVybiAmYXJnc19bMF07CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPGNoYXIqPiBhcmdzXzsKK307CisKKy8vIEEgc3RydWN0IHRoYXQgZW5jb21wYXNzZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY2hpbGQgcHJvY2VzcyBvZiBhCisvLyB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3QgcHJvY2Vzcy4KK3N0cnVjdCBFeGVjRGVhdGhUZXN0QXJncyB7CisgIGNoYXIqIGNvbnN0KiBhcmd2OyAgLy8gQ29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgdGhlIGNoaWxkJ3MgY2FsbCB0byBleGVjCisgIGludCBjbG9zZV9mZDsgICAgICAgLy8gRmlsZSBkZXNjcmlwdG9yIHRvIGNsb3NlOyB0aGUgcmVhZCBlbmQgb2YgYSBwaXBlCit9OworCisjICBpZiBHVEVTVF9PU19NQUMKK2lubGluZSBjaGFyKiogR2V0RW52aXJvbigpIHsKKyAgLy8gV2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBhIGZyYW1ld29yayBvbiBNYWNPUyBYLCB0aGUgZW52aXJvbiB2YXJpYWJsZQorICAvLyBpcyB1bmF2YWlsYWJsZS4gQXBwbGUncyBkb2N1bWVudGF0aW9uIChtYW4gZW52aXJvbikgcmVjb21tZW5kcyB1c2luZworICAvLyBfTlNHZXRFbnZpcm9uKCkgaW5zdGVhZC4KKyAgcmV0dXJuICpfTlNHZXRFbnZpcm9uKCk7Cit9CisjICBlbHNlCisvLyBTb21lIFBPU0lYIHBsYXRmb3JtcyBleHBlY3QgeW91IHRvIGRlY2xhcmUgZW52aXJvbi4gZXh0ZXJuICJDIiBtYWtlcworLy8gaXQgcmVzaWRlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorZXh0ZXJuICJDIiBjaGFyKiogZW52aXJvbjsKK2lubGluZSBjaGFyKiogR2V0RW52aXJvbigpIHsgcmV0dXJuIGVudmlyb247IH0KKyMgIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKKworIyAgaWYgIUdURVNUX09TX1FOWAorLy8gVGhlIG1haW4gZnVuY3Rpb24gZm9yIGEgdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhIGNsb25lKCktZWQgcHJvY2VzcyBhbmQgdGh1cyBtdXN0IGF2b2lkCisvLyBhbnkgcG90ZW50aWFsbHkgdW5zYWZlIG9wZXJhdGlvbnMgbGlrZSBtYWxsb2Mgb3IgbGliYyBmdW5jdGlvbnMuCitzdGF0aWMgaW50IEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4odm9pZCogY2hpbGRfYXJnKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzKiBjb25zdCBhcmdzID0gc3RhdGljX2Nhc3Q8RXhlY0RlYXRoVGVzdEFyZ3MqPihjaGlsZF9hcmcpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKGFyZ3MtPmNsb3NlX2ZkKSk7CisKKyAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSB0ZXN0IHByb2dyYW0gaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgd2hlcmUKKyAgLy8gaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZC4gIFRoZXJlZm9yZSB3ZSBjaGFuZ2UgdG8gdGhlIG9yaWdpbmFsCisgIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LgorICBjb25zdCBjaGFyKiBjb25zdCBvcmlnaW5hbF9kaXIgPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCk7CisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuCisgIGlmIChjaGRpcihvcmlnaW5hbF9kaXIpICE9IDApIHsKKyAgICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiY2hkaXIoXCIiKSArIG9yaWdpbmFsX2RpciArICJcIikgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGV4ZWN2ZSgpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuICBXZQorICAvLyBjYW5ub3QgdXNlIGV4ZWN2cCgpIGFzIGl0J3MgYSBsaWJjIGZ1bmN0aW9uIGFuZCB0aHVzIHBvdGVudGlhbGx5CisgIC8vIHVuc2FmZS4gIFNpbmNlIGV4ZWN2ZSgpIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRILCB0aGUgdXNlciBtdXN0CisgIC8vIGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHZpYSBhIHZhbGlkIHBhdGggdGhhdCBjb250YWlucyBhdCBsZWFzdAorICAvLyBvbmUgcGF0aCBzZXBhcmF0b3IuCisgIGV4ZWN2ZShhcmdzLT5hcmd2WzBdLCBhcmdzLT5hcmd2LCBHZXRFbnZpcm9uKCkpOworICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiZXhlY3ZlKCIpICsgYXJncy0+YXJndlswXSArICIsIC4uLikgaW4gIiArCisgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2RpciArICIgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7CisgIHJldHVybiBFWElUX0ZBSUxVUkU7Cit9CisjICBlbmRpZiAgLy8gIUdURVNUX09TX1FOWAorCisvLyBUd28gdXRpbGl0eSByb3V0aW5lcyB0aGF0IHRvZ2V0aGVyIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIHRoZSBzdGFjaworLy8gZ3Jvd3MuCisvLyBUaGlzIGNvdWxkIGJlIGFjY29tcGxpc2hlZCBtb3JlIGVsZWdhbnRseSBieSBhIHNpbmdsZSByZWN1cnNpdmUKKy8vIGZ1bmN0aW9uLCBidXQgd2Ugd2FudCB0byBndWFyZCBhZ2FpbnN0IHRoZSB1bmxpa2VseSBwb3NzaWJpbGl0eSBvZgorLy8gYSBzbWFydCBjb21waWxlciBvcHRpbWl6aW5nIHRoZSByZWN1cnNpb24gYXdheS4KKy8vCisvLyBHVEVTVF9OT19JTkxJTkVfIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgR0NDIDQuNiBmcm9tIGlubGluaW5nCisvLyBTdGFja0xvd2VyVGhhbkFkZHJlc3MgaW50byBTdGFja0dyb3dzRG93biwgd2hpY2ggdGhlbiBkb2Vzbid0IGdpdmUKKy8vIGNvcnJlY3QgYW5zd2VyLgordm9pZCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyLCBib29sKiByZXN1bHQpIEdURVNUX05PX0lOTElORV87Cit2b2lkIFN0YWNrTG93ZXJUaGFuQWRkcmVzcyhjb25zdCB2b2lkKiBwdHIsIGJvb2wqIHJlc3VsdCkgeworICBpbnQgZHVtbXk7CisgICpyZXN1bHQgPSAoJmR1bW15IDwgcHRyKTsKK30KKworLy8gTWFrZSBzdXJlIEFkZHJlc3NTYW5pdGl6ZXIgZG9lcyBub3QgdGFtcGVyIHdpdGggdGhlIHN0YWNrIGhlcmUuCitHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18KK2Jvb2wgU3RhY2tHcm93c0Rvd24oKSB7CisgIGludCBkdW1teTsKKyAgYm9vbCByZXN1bHQ7CisgIFN0YWNrTG93ZXJUaGFuQWRkcmVzcygmZHVtbXksICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIGluCisvLyBhIHRocmVhZC1zYWZlIG1hbm5lciBhbmQgaW5zdHJ1Y3RzIGl0IHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoZQorLy8gaW1wbGVtZW50YXRpb24gdXNlcyBmb3JrKDIpICsgZXhlYy4gIE9uIHN5c3RlbXMgd2hlcmUgY2xvbmUoMikgaXMKKy8vIGF2YWlsYWJsZSwgaXQgaXMgdXNlZCBpbnN0ZWFkLCBiZWluZyBzbGlnaHRseSBtb3JlIHRocmVhZC1zYWZlLiAgT24gUU5YLAorLy8gZm9yayBzdXBwb3J0cyBvbmx5IHNpbmdsZS10aHJlYWRlZCBlbnZpcm9ubWVudHMsIHNvIHRoaXMgZnVuY3Rpb24gdXNlcworLy8gc3Bhd24oMikgdGhlcmUgaW5zdGVhZC4gIFRoZSBmdW5jdGlvbiBkaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZgorLy8gYW55dGhpbmcgZ29lcyB3cm9uZy4KK3N0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzIGFyZ3MgPSB7IGFyZ3YsIGNsb3NlX2ZkIH07CisgIHBpZF90IGNoaWxkX3BpZCA9IC0xOworCisjICBpZiBHVEVTVF9PU19RTlgKKyAgLy8gT2J0YWlucyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHNldHMgaXQgdG8gYmUgY2xvc2VkIGluIHRoZSBjaGlsZAorICAvLyBwcm9jZXNzLgorICBjb25zdCBpbnQgY3dkX2ZkID0gb3BlbigiLiIsIE9fUkRPTkxZKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oY3dkX2ZkICE9IC0xKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjd2RfZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpKTsKKyAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSB0ZXN0IHByb2dyYW0gaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgd2hlcmUKKyAgLy8gaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZC4gIFRoZXJlZm9yZSB3ZSBjaGFuZ2UgdG8gdGhlIG9yaWdpbmFsCisgIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LgorICBjb25zdCBjaGFyKiBjb25zdCBvcmlnaW5hbF9kaXIgPQorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCk7CisgIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuCisgIGlmIChjaGRpcihvcmlnaW5hbF9kaXIpICE9IDApIHsKKyAgICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiY2hkaXIoXCIiKSArIG9yaWdpbmFsX2RpciArICJcIikgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgaW50IGZkX2ZsYWdzOworICAvLyBTZXQgY2xvc2VfZmQgdG8gYmUgY2xvc2VkIGFmdGVyIHNwYXduLgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZkX2ZsYWdzID0gZmNudGwoY2xvc2VfZmQsIEZfR0VURkQpKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjbG9zZV9mZCwgRl9TRVRGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9mbGFncyB8IEZEX0NMT0VYRUMpKTsKKyAgc3RydWN0IGluaGVyaXRhbmNlIGluaGVyaXQgPSB7MH07CisgIC8vIHNwYXduIGlzIGEgc3lzdGVtIGNhbGwuCisgIGNoaWxkX3BpZCA9IHNwYXduKGFyZ3MuYXJndlswXSwgMCwgTlVMTCwgJmluaGVyaXQsIGFyZ3MuYXJndiwgR2V0RW52aXJvbigpKTsKKyAgLy8gUmVzdG9yZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZjaGRpcihjd2RfZmQpICE9IC0xKTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShjd2RfZmQpKTsKKworIyAgZWxzZSAgIC8vIEdURVNUX09TX1FOWAorIyAgIGlmIEdURVNUX09TX0xJTlVYCisgIC8vIFdoZW4gYSBTSUdQUk9GIHNpZ25hbCBpcyByZWNlaXZlZCB3aGlsZSBmb3JrKCkgb3IgY2xvbmUoKSBhcmUgZXhlY3V0aW5nLAorICAvLyB0aGUgcHJvY2VzcyBtYXkgaGFuZy4gVG8gYXZvaWQgdGhpcywgd2UgaWdub3JlIFNJR1BST0YgaGVyZSBhbmQgcmUtZW5hYmxlCisgIC8vIGl0IGFmdGVyIHRoZSBjYWxsIHRvIGZvcmsoKS9jbG9uZSgpIGlzIGNvbXBsZXRlLgorICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhdmVkX3NpZ3Byb2ZfYWN0aW9uOworICBzdHJ1Y3Qgc2lnYWN0aW9uIGlnbm9yZV9zaWdwcm9mX2FjdGlvbjsKKyAgbWVtc2V0KCZpZ25vcmVfc2lncHJvZl9hY3Rpb24sIDAsIHNpemVvZihpZ25vcmVfc2lncHJvZl9hY3Rpb24pKTsKKyAgc2lnZW1wdHlzZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbi5zYV9tYXNrKTsKKyAgaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHNpZ2FjdGlvbigKKyAgICAgIFNJR1BST0YsICZpZ25vcmVfc2lncHJvZl9hY3Rpb24sICZzYXZlZF9zaWdwcm9mX2FjdGlvbikpOworIyAgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjICAgaWYgR1RFU1RfSEFTX0NMT05FCisgIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworCisgIGlmICghdXNlX2ZvcmspIHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBzdGFja19ncm93c19kb3duID0gU3RhY2tHcm93c0Rvd24oKTsKKyAgICBjb25zdCBzaXplX3Qgc3RhY2tfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgLy8gTU1BUF9BTk9OWU1PVVMgaXMgbm90IGRlZmluZWQgb24gTWFjLCBzbyB3ZSB1c2UgTUFQX0FOT04gaW5zdGVhZC4KKyAgICB2b2lkKiBjb25zdCBzdGFjayA9IG1tYXAoTlVMTCwgc3RhY2tfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0FOT04gfCBNQVBfUFJJVkFURSwgLTEsIDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrICE9IE1BUF9GQUlMRUQpOworCisgICAgLy8gTWF4aW11bSBzdGFjayBhbGlnbm1lbnQgaW4gYnl0ZXM6ICBGb3IgYSBkb3dud2FyZC1ncm93aW5nIHN0YWNrLCB0aGlzCisgICAgLy8gYW1vdW50IGlzIHN1YnRyYWN0ZWQgZnJvbSBzaXplIG9mIHRoZSBzdGFjayBzcGFjZSB0byBnZXQgYW4gYWRkcmVzcworICAgIC8vIHRoYXQgaXMgd2l0aGluIHRoZSBzdGFjayBzcGFjZSBhbmQgaXMgYWxpZ25lZCBvbiBhbGwgc3lzdGVtcyB3ZSBjYXJlCisgICAgLy8gYWJvdXQuICBBcyBmYXIgYXMgSSBrbm93IHRoZXJlIGlzIG5vIEFCSSB3aXRoIHN0YWNrIGFsaWdubWVudCBncmVhdGVyCisgICAgLy8gdGhhbiA2NC4gIFdlIGFzc3VtZSBzdGFjayBhbmQgc3RhY2tfc2l6ZSBhbHJlYWR5IGhhdmUgYWxpZ25tZW50IG9mCisgICAgLy8ga01heFN0YWNrQWxpZ25tZW50LgorICAgIGNvbnN0IHNpemVfdCBrTWF4U3RhY2tBbGlnbm1lbnQgPSA2NDsKKyAgICB2b2lkKiBjb25zdCBzdGFja190b3AgPQorICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhY2spICsKKyAgICAgICAgICAgIChzdGFja19ncm93c19kb3duID8gc3RhY2tfc2l6ZSAtIGtNYXhTdGFja0FsaWdubWVudCA6IDApOworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrX3NpemUgPiBrTWF4U3RhY2tBbGlnbm1lbnQgJiYKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oc3RhY2tfdG9wKSAlIGtNYXhTdGFja0FsaWdubWVudCA9PSAwKTsKKworICAgIGNoaWxkX3BpZCA9IGNsb25lKCZFeGVjRGVhdGhUZXN0Q2hpbGRNYWluLCBzdGFja190b3AsIFNJR0NITEQsICZhcmdzKTsKKworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKG11bm1hcChzdGFjaywgc3RhY2tfc2l6ZSkgIT0gLTEpOworICB9CisjICAgZWxzZQorICBjb25zdCBib29sIHVzZV9mb3JrID0gdHJ1ZTsKKyMgICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCisKKyAgaWYgKHVzZV9mb3JrICYmIChjaGlsZF9waWQgPSBmb3JrKCkpID09IDApIHsKKyAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOworICAgICAgX2V4aXQoMCk7CisgIH0KKyMgIGVuZGlmICAvLyBHVEVTVF9PU19RTlgKKyMgIGlmIEdURVNUX09TX0xJTlVYCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oCisgICAgICBzaWdhY3Rpb24oU0lHUFJPRiwgJnNhdmVkX3NpZ3Byb2ZfYWN0aW9uLCBOVUxMKSk7CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICByZXR1cm4gY2hpbGRfcGlkOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLWV4ZWMgZGVhdGggdGVzdC4gIEl0IHJlLWV4ZWN1dGVzIHRoZQorLy8gbWFpbiBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgc2V0dGluZyB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgdG8gYmUgcmUtcnVuLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBFeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgaW50IHBpcGVfZmRbMl07CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOworICAvLyBDbGVhciB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIG9uIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUsIGxlc3QKKyAgLy8gaXQgYmUgY2xvc2VkIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lcyBhbiBleGVjOgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQorICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9IgorICAgICAgKyBpbmZvLT50ZXN0X2Nhc2VfbmFtZSgpICsgIi4iICsgaW5mby0+bmFtZSgpOworICBjb25zdCBzdGQ6OnN0cmluZyBpbnRlcm5hbF9mbGFnID0KKyAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArICI9IgorICAgICAgKyBmaWxlXyArICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lXykgKyAifCIKKyAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKGRlYXRoX3Rlc3RfaW5kZXgpICsgInwiCisgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhwaXBlX2ZkWzFdKTsKKyAgQXJndW1lbnRzIGFyZ3M7CisgIGFyZ3MuQWRkQXJndW1lbnRzKEdldEFyZ3ZzRm9yRGVhdGhUZXN0Q2hpbGRQcm9jZXNzKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGZpbHRlcl9mbGFnLmNfc3RyKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGludGVybmFsX2ZsYWcuY19zdHIoKSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gU2VlIHRoZSBjb21tZW50IGluIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSBmb3Igd2h5IHRoZSBuZXh0IGxpbmUKKyAgLy8gaXMgbmVjZXNzYXJ5LgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChhcmdzLkFyZ3YoKSwgcGlwZV9mZFswXSk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7CisgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKK30KKworIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKKworLy8gQ3JlYXRlcyBhIGNvbmNyZXRlIERlYXRoVGVzdC1kZXJpdmVkIGNsYXNzIHRoYXQgZGVwZW5kcyBvbiB0aGUKKy8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnLCBhbmQgc2V0cyB0aGUgcG9pbnRlciBwb2ludGVkIHRvCisvLyBieSB0aGUgInRlc3QiIGFyZ3VtZW50IHRvIGl0cyBhZGRyZXNzLiAgSWYgdGhlIHRlc3Qgc2hvdWxkIGJlCisvLyBza2lwcGVkLCBzZXRzIHRoYXQgcG9pbnRlciB0byBOVUxMLiAgUmV0dXJucyB0cnVlLCB1bmxlc3MgdGhlCisvLyBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgorYm9vbCBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKQorICAgICAgLT5pbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpOworCisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICBpZiAoZGVhdGhfdGVzdF9pbmRleCA+IGZsYWctPmluZGV4KCkpIHsKKyAgICAgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKAorICAgICAgICAgICJEZWF0aCB0ZXN0IGNvdW50ICgiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGRlYXRoX3Rlc3RfaW5kZXgpCisgICAgICAgICAgKyAiKSBzb21laG93IGV4Y2VlZGVkIGV4cGVjdGVkIG1heGltdW0gKCIKKyAgICAgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhmbGFnLT5pbmRleCgpKSArICIpIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCEoZmxhZy0+ZmlsZSgpID09IGZpbGUgJiYgZmxhZy0+bGluZSgpID09IGxpbmUgJiYKKyAgICAgICAgICBmbGFnLT5pbmRleCgpID09IGRlYXRoX3Rlc3RfaW5kZXgpKSB7CisgICAgICAqdGVzdCA9IE5VTEw7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiIHx8CisgICAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgeworICAgICp0ZXN0ID0gbmV3IFdpbmRvd3NEZWF0aFRlc3Qoc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSk7CisgIH0KKworIyBlbHNlCisKKyAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiKSB7CisgICAgKnRlc3QgPSBuZXcgRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKKyAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgeworICAgICp0ZXN0ID0gbmV3IE5vRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4KTsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgZWxzZSB7ICAvLyBOT0xJTlQgLSB0aGlzIGlzIG1vcmUgcmVhZGFibGUgdGhhbiB1bmJhbGFuY2VkIGJyYWNrZXRzIGluc2lkZSAjaWYuCisgICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoCisgICAgICAgICJVbmtub3duIGRlYXRoIHRlc3Qgc3R5bGUgXCIiICsgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKQorICAgICAgICArICJcIiBlbmNvdW50ZXJlZCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFJlY3JlYXRlcyB0aGUgcGlwZSBhbmQgZXZlbnQgaGFuZGxlcyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLAorLy8gc2lnbmFscyB0aGUgZXZlbnQsIGFuZCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHdyYXBwZWQgYXJvdW5kIHRoZSBwaXBlCisvLyBoYW5kbGUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBjaGlsZCBwcm9jZXNzIG9ubHkuCitpbnQgR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IodW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBldmVudF9oYW5kbGVfYXNfc2l6ZV90KSB7CisgIEF1dG9IYW5kbGUgcGFyZW50X3Byb2Nlc3NfaGFuZGxlKDo6T3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBOb24taW5oZXJpdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcHJvY2Vzc19pZCkpOworICBpZiAocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIlVuYWJsZSB0byBvcGVuIHBhcmVudCBwcm9jZXNzICIgKworICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVwbGFjZSB0aGUgZm9sbG93aW5nIGNoZWNrIHdpdGggYQorICAvLyBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHdoZW4gYXZhaWxhYmxlLgorICBHVEVTVF9DSEVDS18oc2l6ZW9mKEhBTkRMRSkgPD0gc2l6ZW9mKHNpemVfdCkpOworCisgIGNvbnN0IEhBTkRMRSB3cml0ZV9oYW5kbGUgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KHdyaXRlX2hhbmRsZV9hc19zaXplX3QpOworICBIQU5ETEUgZHVwX3dyaXRlX2hhbmRsZTsKKworICAvLyBUaGUgbmV3bHkgaW5pdGlhbGl6ZWQgaGFuZGxlIGlzIGFjY2Vzc2libGUgb25seSBpbiBpbiB0aGUgcGFyZW50CisgIC8vIHByb2Nlc3MuIFRvIG9idGFpbiBvbmUgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIGNoaWxkLCB3ZSBuZWVkIHRvIHVzZQorICAvLyBEdXBsaWNhdGVIYW5kbGUuCisgIGlmICghOjpEdXBsaWNhdGVIYW5kbGUocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpLCB3cml0ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmZHVwX3dyaXRlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDAsICAgIC8vIFJlcXVlc3RlZCBwcml2aWxlZ2VzIGlnbm9yZWQgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERVUExJQ0FURV9TQU1FX0FDQ0VTUyBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gUmVxdWVzdCBub24taW5oZXJpdGFibGUgaGFuZGxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIHBpcGUgaGFuZGxlICIgKworICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KSArCisgICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAiICsKKyAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcocGFyZW50X3Byb2Nlc3NfaWQpKTsKKyAgfQorCisgIGNvbnN0IEhBTkRMRSBldmVudF9oYW5kbGUgPSByZWludGVycHJldF9jYXN0PEhBTkRMRT4oZXZlbnRfaGFuZGxlX2FzX3NpemVfdCk7CisgIEhBTkRMRSBkdXBfZXZlbnRfaGFuZGxlOworCisgIGlmICghOjpEdXBsaWNhdGVIYW5kbGUocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpLCBldmVudF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmZHVwX2V2ZW50X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTKSkgeworICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBldmVudCBoYW5kbGUgIiArCisgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKGV2ZW50X2hhbmRsZV9hc19zaXplX3QpICsKKyAgICAgICAgICAgICAgICAgICAiIGZyb20gdGhlIHBhcmVudCBwcm9jZXNzICIgKworICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgY29uc3QgaW50IHdyaXRlX2ZkID0KKyAgICAgIDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGR1cF93cml0ZV9oYW5kbGUpLCBPX0FQUEVORCk7CisgIGlmICh3cml0ZV9mZCA9PSAtMSkgeworICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gY29udmVydCBwaXBlIGhhbmRsZSAiICsKKyAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcod3JpdGVfaGFuZGxlX2FzX3NpemVfdCkgKworICAgICAgICAgICAgICAgICAgICIgdG8gYSBmaWxlIGRlc2NyaXB0b3IiKTsKKyAgfQorCisgIC8vIFNpZ25hbHMgdGhlIHBhcmVudCB0aGF0IHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgaGFzIGJlZW4gYWNxdWlyZWQKKyAgLy8gc28gdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIHdyaXRlIGVuZC4KKyAgOjpTZXRFdmVudChkdXBfZXZlbnRfaGFuZGxlKTsKKworICByZXR1cm4gd3JpdGVfZmQ7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFJldHVybnMgYSBuZXdseSBjcmVhdGVkIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyBvYmplY3Qgd2l0aCBmaWVsZHMKKy8vIGluaXRpYWxpemVkIGZyb20gdGhlIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpIGZsYWcgaWYKKy8vIHRoZSBmbGFnIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KK0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7CisgIGlmIChHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSA9PSAiIikgcmV0dXJuIE5VTEw7CisKKyAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUgOjpzdGQ6OnN0cmluZywgc28gd2UKKyAgLy8gY2FuIHVzZSBpdCBoZXJlLgorICBpbnQgbGluZSA9IC0xOworICBpbnQgaW5kZXggPSAtMTsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gZmllbGRzOworICBTcGxpdFN0cmluZyhHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpLCAnfCcsICZmaWVsZHMpOworICBpbnQgd3JpdGVfZmQgPSAtMTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgdW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkID0gMDsKKyAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QgPSAwOworICBzaXplX3QgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCA9IDA7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNgorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMV0sICZsaW5lKQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmcGFyZW50X3Byb2Nlc3NfaWQpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s0XSwgJndyaXRlX2hhbmRsZV9hc19zaXplX3QpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s1XSwgJmV2ZW50X2hhbmRsZV9hc19zaXplX3QpKSB7CisgICAgRGVhdGhUZXN0QWJvcnQoIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICIgKworICAgICAgICAgICAgICAgICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKTsKKyAgfQorICB3cml0ZV9mZCA9IEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yKHBhcmVudF9wcm9jZXNzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCk7CisjIGVsc2UKKworICBpZiAoZmllbGRzLnNpemUoKSAhPSA0CisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbM10sICZ3cml0ZV9mZCkpIHsKKyAgICBEZWF0aFRlc3RBYm9ydCgiQmFkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZzogIgorICAgICAgICArIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKTsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyAgcmV0dXJuIG5ldyBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoZmllbGRzWzBdLCBsaW5lLCBpbmRleCwgd3JpdGVfZmQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC1maWxlcGF0aC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5MmRjMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MKQEAgLTAsMCArMSwzODcgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxpZiBHVEVTVF9PU19TWU1CSUFOCisvLyBTeW1iaWFuIE9wZW5DIGhhcyBQQVRIX01BWCBpbiBzeXMvc3lzbGltaXRzLmgKKyMgaW5jbHVkZSA8c3lzL3N5c2xpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjIGluY2x1ZGUgPGNsaW1pdHM+ICAvLyBTb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgZGVmaW5lIFBBVEhfTUFYIGhlcmUuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX01BWF9QQVRICisjZWxpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIFBBVEhfTUFYCisjZWxpZiBkZWZpbmVkKF9YT1BFTl9QQVRIX01BWCkKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfWE9QRU5fUEFUSF9NQVgKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1BPU0lYX1BBVEhfTUFYCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gT24gV2luZG93cywgJ1xcJyBpcyB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IsIGJ1dCBtYW55IHRvb2xzIGFuZCB0aGUKKy8vIFdpbmRvd3MgQVBJIGFsc28gYWNjZXB0ICcvJyBhcyBhbiBhbHRlcm5hdGUgcGF0aCBzZXBhcmF0b3IuIFVubGVzcyBvdGhlcndpc2UKKy8vIG5vdGVkLCBhIGZpbGUgcGF0aCBjYW4gY29udGFpbiBlaXRoZXIga2luZCBvZiBwYXRoIHNlcGFyYXRvcnMsIG9yIGEgbWl4dHVyZQorLy8gb2YgdGhlbS4KK2NvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3IgPSAnXFwnOworY29uc3QgY2hhciBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvciA9ICcvJzsKK2NvbnN0IGNoYXIga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICIvIjsKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnkuIFlvdSBzaG91bGQgbm90IHVzZQorLy8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluIHRlc3RzIG9uIFdpbmRvd3MgQ0UsIGJ1dCB0aGlzIGF0IGxlYXN0CisvLyBwcm92aWRlcyBhIHJlYXNvbmFibGUgZmFsbGJhY2suCitjb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiXFwiOworLy8gV2luZG93cyBDRSBkb2Vzbid0IGRlZmluZSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUworY29uc3QgRFdPUkQga0ludmFsaWRGaWxlQXR0cmlidXRlcyA9IDB4ZmZmZmZmZmY7CisjIGVsc2UKK2NvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuXFwiOworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyNlbHNlCitjb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJy8nOworY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIi4vIjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIHZhbGlkIHBhdGggc2VwYXJhdG9yLgorc3RhdGljIGJvb2wgSXNQYXRoU2VwYXJhdG9yKGNoYXIgYykgeworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIHJldHVybiAoYyA9PSBrUGF0aFNlcGFyYXRvcikgfHwgKGMgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOworI2Vsc2UKKyAgcmV0dXJuIGMgPT0ga1BhdGhTZXBhcmF0b3I7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgorRmlsZVBhdGggRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfV0lORE9XU19QSE9ORSB8fCBHVEVTVF9PU19XSU5ET1dTX1JUCisgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGp1c3QgcmV0dXJuCisgIC8vIHNvbWV0aGluZyByZWFzb25hYmxlLgorICByZXR1cm4gRmlsZVBhdGgoa0N1cnJlbnREaXJlY3RvcnlTdHJpbmcpOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OworICByZXR1cm4gRmlsZVBhdGgoX2dldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOworI2Vsc2UKKyAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsKKyAgY2hhciogcmVzdWx0ID0gZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpOworIyBpZiBHVEVTVF9PU19OQUNMCisgIC8vIGdldGN3ZCB3aWxsIGxpa2VseSBmYWlsIGluIE5hQ2wgZHVlIHRvIHRoZSBzYW5kYm94LCBzbyByZXR1cm4gc29tZXRoaW5nCisgIC8vIHJlYXNvbmFibGUuIFRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIGEgc2hpbSBpbXBsZW1lbnRhdGlvbiBmb3IgZ2V0Y3dkLAorICAvLyBob3dldmVyLCBzbyBmYWxsYmFjayBvbmx5IHdoZW4gZmFpbHVyZSBpcyBkZXRlY3RlZC4KKyAgcmV0dXJuIEZpbGVQYXRoKHJlc3VsdCA9PSBOVUxMID8ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmcgOiBjd2QpOworIyBlbmRpZiAgLy8gR1RFU1RfT1NfTkFDTAorICByZXR1cm4gRmlsZVBhdGgocmVzdWx0ID09IE5VTEwgPyAiIiA6IGN3ZCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCit9CisKKy8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoImRpci9maWxlLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiRVhFIikgcmV0dXJucworLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90CisvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZG90X2V4dGVuc2lvbiA9IHN0ZDo6c3RyaW5nKCIuIikgKyBleHRlbnNpb247CisgIGlmIChTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKHBhdGhuYW1lXywgZG90X2V4dGVuc2lvbikpIHsKKyAgICByZXR1cm4gRmlsZVBhdGgocGF0aG5hbWVfLnN1YnN0cigKKyAgICAgICAgMCwgcGF0aG5hbWVfLmxlbmd0aCgpIC0gZG90X2V4dGVuc2lvbi5sZW5ndGgoKSkpOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KKy8vIHRoZSBGaWxlUGF0aC4gT24gV2luZG93cywgZm9yIGV4YW1wbGUsIGJvdGggJy8nIGFuZCAnXCcgYXJlIHZhbGlkIHBhdGgKKy8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCitjb25zdCBjaGFyKiBGaWxlUGF0aDo6RmluZExhc3RQYXRoU2VwYXJhdG9yKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga1BhdGhTZXBhcmF0b3IpOworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3RfYWx0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOworICAvLyBDb21wYXJpbmcgdHdvIHBvaW50ZXJzIG9mIHdoaWNoIG9ubHkgb25lIGlzIE5VTEwgaXMgdW5kZWZpbmVkLgorICBpZiAobGFzdF9hbHRfc2VwICE9IE5VTEwgJiYKKyAgICAgIChsYXN0X3NlcCA9PSBOVUxMIHx8IGxhc3RfYWx0X3NlcCA+IGxhc3Rfc2VwKSkgeworICAgIHJldHVybiBsYXN0X2FsdF9zZXA7CisgIH0KKyNlbmRpZgorICByZXR1cm4gbGFzdF9zZXA7Cit9CisKKy8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBkaXJlY3RvcnkgcGFydCByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCisvLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKKy8vIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLiBJZiB0aGVyZSBpcyBubyBmaWxlIHBhcnQgKCJqdXN0X2FfZGlyLyIpIGl0CisvLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7CisgIHJldHVybiBsYXN0X3NlcCA/IEZpbGVQYXRoKGxhc3Rfc2VwICsgMSkgOiAqdGhpczsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KKy8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpIHJldHVybnMgInBhdGgvdG8vIi4KKy8vIElmIHRoZSBGaWxlUGF0aCBpcyAiYV9maWxlIiBvciAiL2FfZmlsZSIsIFJlbW92ZUZpbGVOYW1lIHJldHVybnMKKy8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCisvLyBub3QgaGF2ZSBhIGZpbGUsIGxpa2UgImp1c3QvYS9kaXIvIiwgaXQgcmV0dXJucyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRmlsZU5hbWUoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7CisgIHN0ZDo6c3RyaW5nIGRpcjsKKyAgaWYgKGxhc3Rfc2VwKSB7CisgICAgZGlyID0gc3RkOjpzdHJpbmcoY19zdHIoKSwgbGFzdF9zZXAgKyAxIC0gY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgZGlyID0ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmc7CisgIH0KKyAgcmV0dXJuIEZpbGVQYXRoKGRpcik7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KKworLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKKy8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgorLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorRmlsZVBhdGggRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pIHsKKyAgc3RkOjpzdHJpbmcgZmlsZTsKKyAgaWYgKG51bWJlciA9PSAwKSB7CisgICAgZmlsZSA9IGJhc2VfbmFtZS5zdHJpbmcoKSArICIuIiArIGV4dGVuc2lvbjsKKyAgfSBlbHNlIHsKKyAgICBmaWxlID0gYmFzZV9uYW1lLnN0cmluZygpICsgIl8iICsgU3RyZWFtYWJsZVRvU3RyaW5nKG51bWJlcikKKyAgICAgICAgKyAiLiIgKyBleHRlbnNpb247CisgIH0KKyAgcmV0dXJuIENvbmNhdFBhdGhzKGRpcmVjdG9yeSwgRmlsZVBhdGgoZmlsZSkpOworfQorCisvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuCisvLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorRmlsZVBhdGggRmlsZVBhdGg6OkNvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKKyAgaWYgKGRpcmVjdG9yeS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHJlbGF0aXZlX3BhdGg7CisgIGNvbnN0IEZpbGVQYXRoIGRpcihkaXJlY3RvcnkuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworICByZXR1cm4gRmlsZVBhdGgoZGlyLnN0cmluZygpICsga1BhdGhTZXBhcmF0b3IgKyByZWxhdGl2ZV9wYXRoLnN0cmluZygpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBzb21ldGhpbmcgZmluZGFibGUgaW4gdGhlIGZpbGUtc3lzdGVtLAorLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlci4KK2Jvb2wgRmlsZVBhdGg6OkZpbGVPckRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGhuYW1lXy5jX3N0cigpKTsKKyAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOworICBkZWxldGUgW10gdW5pY29kZTsKKyAgcmV0dXJuIGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlczsKKyNlbHNlCisgIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKKyAgcmV0dXJuIHBvc2l4OjpTdGF0KHBhdGhuYW1lXy5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQorLy8gdGhhdCBleGlzdHMuCitib29sIEZpbGVQYXRoOjpEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7CisgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBEb24ndCBzdHJpcCBvZmYgdHJhaWxpbmcgc2VwYXJhdG9yIGlmIHBhdGggaXMgYSByb290IGRpcmVjdG9yeSBvbgorICAvLyBXaW5kb3dzIChsaWtlICJDOlxcIikuCisgIGNvbnN0IEZpbGVQYXRoJiBwYXRoKElzUm9vdERpcmVjdG9yeSgpID8gKnRoaXMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKyNlbHNlCisgIGNvbnN0IEZpbGVQYXRoJiBwYXRoKCp0aGlzKTsKKyNlbmRpZgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRoLmNfc3RyKCkpOworICBjb25zdCBEV09SRCBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXModW5pY29kZSk7CisgIGRlbGV0ZSBbXSB1bmljb2RlOworICBpZiAoKGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlcykgJiYKKyAgICAgIChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkgeworICAgIHJlc3VsdCA9IHRydWU7CisgIH0KKyNlbHNlCisgIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKKyAgcmVzdWx0ID0gcG9zaXg6OlN0YXQocGF0aC5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwICYmCisgICAgICBwb3NpeDo6SXNEaXIoZmlsZV9zdGF0KTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgcm9vdCBkaXJlY3RvcnkuIChXaW5kb3dzIGhhcyBvbmUKKy8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKK2Jvb2wgRmlsZVBhdGg6OklzUm9vdERpcmVjdG9yeSgpIGNvbnN0IHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIGEgbmV0d29yayBzaGFyZSBsaWtlCisgIC8vIFxcc2VydmVyXHNoYXJlIGNhbiBiZSBhIHJvb3QgZGlyZWN0b3J5LCBhbHRob3VnaCBpdCBjYW5ub3QgYmUgdGhlCisgIC8vIGN1cnJlbnQgZGlyZWN0b3J5LiAgSGFuZGxlIHRoaXMgcHJvcGVybHkuCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMyAmJiBJc0Fic29sdXRlUGF0aCgpOworI2Vsc2UKKyAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAxICYmIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVswXSk7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgorYm9vbCBGaWxlUGF0aDo6SXNBYnNvbHV0ZVBhdGgoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSBwYXRobmFtZV8uY19zdHIoKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPj0gMyAmJgorICAgICAoKG5hbWVbMF0gPj0gJ2EnICYmIG5hbWVbMF0gPD0gJ3onKSB8fAorICAgICAgKG5hbWVbMF0gPj0gJ0EnICYmIG5hbWVbMF0gPD0gJ1onKSkgJiYKKyAgICAgbmFtZVsxXSA9PSAnOicgJiYKKyAgICAgSXNQYXRoU2VwYXJhdG9yKG5hbWVbMl0pOworI2Vsc2UKKyAgcmV0dXJuIElzUGF0aFNlcGFyYXRvcihuYW1lWzBdKTsKKyNlbmRpZgorfQorCisvLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lCisvLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCisvLyBkaXJlY3RvcnkvYmFzZV9uYW1lXzxudW1iZXI+LmV4dGVuc2lvbiBpZiBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbgorLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kCisvLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisvLyBFeGFtcGxlczogJ2Rpci9mb29fdGVzdC54bWwnIG9yICdkaXIvZm9vX3Rlc3RfMS54bWwnLgorLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcworLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KK0ZpbGVQYXRoIEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7CisgIEZpbGVQYXRoIGZ1bGxfcGF0aG5hbWU7CisgIGludCBudW1iZXIgPSAwOworICBkbyB7CisgICAgZnVsbF9wYXRobmFtZS5TZXQoTWFrZUZpbGVOYW1lKGRpcmVjdG9yeSwgYmFzZV9uYW1lLCBudW1iZXIrKywgZXh0ZW5zaW9uKSk7CisgIH0gd2hpbGUgKGZ1bGxfcGF0aG5hbWUuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOworICByZXR1cm4gZnVsbF9wYXRobmFtZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAorLy8gaXQgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgZGlyZWN0b3J5LiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKy8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgorYm9vbCBGaWxlUGF0aDo6SXNEaXJlY3RvcnkoKSBjb25zdCB7CisgIHJldHVybiAhcGF0aG5hbWVfLmVtcHR5KCkgJiYKKyAgICAgICAgIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVtwYXRobmFtZV8ubGVuZ3RoKCkgLSAxXSk7Cit9CisKKy8vIENyZWF0ZSBkaXJlY3RvcmllcyBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBpZgorLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcmllcworLy8gZm9yIGFueSByZWFzb24uCitib29sIEZpbGVQYXRoOjpDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3QgeworICBpZiAoIXRoaXMtPklzRGlyZWN0b3J5KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAocGF0aG5hbWVfLmxlbmd0aCgpID09IDAgfHwgdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IEZpbGVQYXRoIHBhcmVudCh0aGlzLT5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5SZW1vdmVGaWxlTmFtZSgpKTsKKyAgcmV0dXJuIHBhcmVudC5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgJiYgdGhpcy0+Q3JlYXRlRm9sZGVyKCk7Cit9CisKKy8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yCisvLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCisvLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAorLy8gZXhpc3QuIE5vdCBuYW1lZCAiQ3JlYXRlRGlyZWN0b3J5IiBiZWNhdXNlIHRoYXQncyBhIG1hY3JvIG9uIFdpbmRvd3MuCitib29sIEZpbGVQYXRoOjpDcmVhdGVGb2xkZXIoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgRmlsZVBhdGggcmVtb3ZlZF9zZXAodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOworICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHJlbW92ZWRfc2VwLmNfc3RyKCkpOworICBpbnQgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5KHVuaWNvZGUsIE5VTEwpID8gMCA6IC0xOworICBkZWxldGUgW10gdW5pY29kZTsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyAgaW50IHJlc3VsdCA9IF9ta2RpcihwYXRobmFtZV8uY19zdHIoKSk7CisjZWxzZQorICBpbnQgcmVzdWx0ID0gbWtkaXIocGF0aG5hbWVfLmNfc3RyKCksIDA3NzcpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICByZXR1cm4gdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCk7ICAvLyBBbiBlcnJvciBpcyBPSyBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgfQorICByZXR1cm4gdHJ1ZTsgIC8vIE5vIGVycm9yLgorfQorCisvLyBJZiBpbnB1dCBuYW1lIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIsIHJlbW92ZSBpdCBhbmQgcmV0dXJuIHRoZQorLy8gbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yLCBvdGhlciBwbGF0Zm9ybXMgdXNlIC8uCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3QgeworICByZXR1cm4gSXNEaXJlY3RvcnkoKQorICAgICAgPyBGaWxlUGF0aChwYXRobmFtZV8uc3Vic3RyKDAsIHBhdGhuYW1lXy5sZW5ndGgoKSAtIDEpKQorICAgICAgOiAqdGhpczsKK30KKworLy8gUmVtb3ZlcyBhbnkgcmVkdW5kYW50IHNlcGFyYXRvcnMgdGhhdCBtaWdodCBiZSBpbiB0aGUgcGF0aG5hbWUuCisvLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgorLy8gcmVkdW5kYW5jaWVzIHRoYXQgbWlnaHQgYmUgaW4gYSBwYXRobmFtZSBpbnZvbHZpbmcgIi4iIG9yICIuLiIuCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogaGFuZGxlIFdpbmRvd3MgbmV0d29yayBzaGFyZXMgKGUuZy4gXFxzZXJ2ZXJcc2hhcmUpLgordm9pZCBGaWxlUGF0aDo6Tm9ybWFsaXplKCkgeworICBpZiAocGF0aG5hbWVfLmNfc3RyKCkgPT0gTlVMTCkgeworICAgIHBhdGhuYW1lXyA9ICIiOworICAgIHJldHVybjsKKyAgfQorICBjb25zdCBjaGFyKiBzcmMgPSBwYXRobmFtZV8uY19zdHIoKTsKKyAgY2hhciogY29uc3QgZGVzdCA9IG5ldyBjaGFyW3BhdGhuYW1lXy5sZW5ndGgoKSArIDFdOworICBjaGFyKiBkZXN0X3B0ciA9IGRlc3Q7CisgIG1lbXNldChkZXN0X3B0ciwgMCwgcGF0aG5hbWVfLmxlbmd0aCgpICsgMSk7CisKKyAgd2hpbGUgKCpzcmMgIT0gJ1wwJykgeworICAgICpkZXN0X3B0ciA9ICpzcmM7CisgICAgaWYgKCFJc1BhdGhTZXBhcmF0b3IoKnNyYykpIHsKKyAgICAgIHNyYysrOworICAgIH0gZWxzZSB7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgICAgIGlmICgqZGVzdF9wdHIgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpIHsKKyAgICAgICAgKmRlc3RfcHRyID0ga1BhdGhTZXBhcmF0b3I7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHdoaWxlIChJc1BhdGhTZXBhcmF0b3IoKnNyYykpCisgICAgICAgIHNyYysrOworICAgIH0KKyAgICBkZXN0X3B0cisrOworICB9CisgICpkZXN0X3B0ciA9ICdcMCc7CisgIHBhdGhuYW1lXyA9IGRlc3Q7CisgIGRlbGV0ZVtdIGRlc3Q7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzhhMjAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oCkBAIC0wLDAgKzEsMTE4MyBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB1c2VkIGJ5IHRoZSBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcHVyZWx5IEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uICBQbGVhc2UKKy8vIERPIE5PVCAjSU5DTFVERSBJVCBJTiBBIFVTRVIgUFJPR1JBTS4KKworI2lmbmRlZiBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCisjZGVmaW5lIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KKworLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fIGlzIGRlZmluZWQgdG8gMSBpZmYgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdCBpcworLy8gcGFydCBvZiBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uOyBvdGhlcndpc2UgaXQncyB1bmRlZmluZWQuCisjaWYgIUdURVNUX0lNUExFTUVOVEFUSU9OXworLy8gSWYgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGZyb20gdGhlIHVzZXIncyBjb2RlLCBqdXN0IHNheSBuby4KKyMgZXJyb3IgImd0ZXN0LWludGVybmFsLWlubC5oIGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbi4iCisjIGVycm9yICJJdCBtdXN0IG5vdCBiZSBpbmNsdWRlZCBleGNlcHQgYnkgR29vZ2xlIFRlc3QgaXRzZWxmLiIKKyNlbmRpZiAgLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZm5kZWYgX1dJTjMyX1dDRQorIyBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmICAvLyAhX1dJTjMyX1dDRQorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gRm9yIHN0cnRvbGwvX3N0cnRvdWw2NC9tYWxsb2MvZnJlZS4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIEZvciBtZW1tb3ZlLgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIgIC8vIE5PTElOVAorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIERlY2xhcmVzIHRoZSBmbGFncy4KKy8vCisvLyBXZSBkb24ndCB3YW50IHRoZSB1c2VycyB0byBtb2RpZnkgdGhpcyBmbGFnIGluIHRoZSBjb2RlLCBidXQgd2FudAorLy8gR29vZ2xlIFRlc3QncyBvd24gdW5pdCB0ZXN0cyB0byBiZSBhYmxlIHRvIGFjY2VzcyBpdC4gVGhlcmVmb3JlIHdlCisvLyBkZWNsYXJlIGl0IGhlcmUgYXMgb3Bwb3NlZCB0byBpbiBndGVzdC5oLgorR1RFU1RfREVDTEFSRV9ib29sXyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhlIHZhbHVlIG9mIEdldFRlc3RUeXBlSWQoKSBhcyBzZWVuIGZyb20gd2l0aGluIHRoZSBHb29nbGUgVGVzdAorLy8gbGlicmFyeS4gIFRoaXMgaXMgc29sZWx5IGZvciB0ZXN0aW5nIEdldFRlc3RUeXBlSWQoKS4KK0dURVNUX0FQSV8gZXh0ZXJuIGNvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdDsKKworLy8gTmFtZXMgb2YgdGhlIGZsYWdzIChuZWVkZWQgZm9yIHBhcnNpbmcgR29vZ2xlIFRlc3QgZmxhZ3MpLgorY29uc3QgY2hhciBrQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnW10gPSAiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMiOworY29uc3QgY2hhciBrQnJlYWtPbkZhaWx1cmVGbGFnW10gPSAiYnJlYWtfb25fZmFpbHVyZSI7Citjb25zdCBjaGFyIGtDYXRjaEV4Y2VwdGlvbnNGbGFnW10gPSAiY2F0Y2hfZXhjZXB0aW9ucyI7Citjb25zdCBjaGFyIGtDb2xvckZsYWdbXSA9ICJjb2xvciI7Citjb25zdCBjaGFyIGtGaWx0ZXJGbGFnW10gPSAiZmlsdGVyIjsKK2NvbnN0IGNoYXIga0xpc3RUZXN0c0ZsYWdbXSA9ICJsaXN0X3Rlc3RzIjsKK2NvbnN0IGNoYXIga091dHB1dEZsYWdbXSA9ICJvdXRwdXQiOworY29uc3QgY2hhciBrUHJpbnRUaW1lRmxhZ1tdID0gInByaW50X3RpbWUiOworY29uc3QgY2hhciBrUmFuZG9tU2VlZEZsYWdbXSA9ICJyYW5kb21fc2VlZCI7Citjb25zdCBjaGFyIGtSZXBlYXRGbGFnW10gPSAicmVwZWF0IjsKK2NvbnN0IGNoYXIga1NodWZmbGVGbGFnW10gPSAic2h1ZmZsZSI7Citjb25zdCBjaGFyIGtTdGFja1RyYWNlRGVwdGhGbGFnW10gPSAic3RhY2tfdHJhY2VfZGVwdGgiOworY29uc3QgY2hhciBrU3RyZWFtUmVzdWx0VG9GbGFnW10gPSAic3RyZWFtX3Jlc3VsdF90byI7Citjb25zdCBjaGFyIGtUaHJvd09uRmFpbHVyZUZsYWdbXSA9ICJ0aHJvd19vbl9mYWlsdXJlIjsKK2NvbnN0IGNoYXIga0ZsYWdmaWxlRmxhZ1tdID0gImZsYWdmaWxlIjsKKworLy8gQSB2YWxpZCByYW5kb20gc2VlZCBtdXN0IGJlIGluIFsxLCBrTWF4UmFuZG9tU2VlZF0uCitjb25zdCBpbnQga01heFJhbmRvbVNlZWQgPSA5OTk5OTsKKworLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcworLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitHVEVTVF9BUElfIGV4dGVybiBib29sIGdfaGVscF9mbGFnOworCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorR1RFU1RfQVBJXyBUaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgR29vZ2xlIFRlc3Qgc2hvdWxkIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRVc2VDb2xvcihib29sIHN0ZG91dF9pc190dHkpOworCisvLyBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBzZWNvbmRzLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoVGltZUluTWlsbGlzIG1zKTsKKworLy8gQ29udmVydHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBzdHJpbmcgaW4gdGhlIElTTyA4NjAxCisvLyBmb3JtYXQsIHdpdGhvdXQgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uLiAgTi5CLjogZHVlIHRvIHRoZSB1c2UgdGhlCisvLyBub24tcmVlbnRyYW50IGxvY2FsdGltZSgpIGZ1bmN0aW9uLCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4gIERvCisvLyBub3QgdXNlIGl0IGluIGFueSBjb2RlIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKFRpbWVJbk1pbGxpcyBtcyk7CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYW4gSW50MzIgZmxhZywgaW4gdGhlIGZvcm0gb2YgIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK0dURVNUX0FQSV8gYm9vbCBQYXJzZUludDMyRmxhZygKKyAgICBjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIEludDMyKiB2YWx1ZSk7CisKKy8vIFJldHVybnMgYSByYW5kb20gc2VlZCBpbiByYW5nZSBbMSwga01heFJhbmRvbVNlZWRdIGJhc2VkIG9uIHRoZQorLy8gZ2l2ZW4gLS1ndGVzdF9yYW5kb21fc2VlZCBmbGFnIHZhbHVlLgoraW5saW5lIGludCBHZXRSYW5kb21TZWVkRnJvbUZsYWcoSW50MzIgcmFuZG9tX3NlZWRfZmxhZykgeworICBjb25zdCB1bnNpZ25lZCBpbnQgcmF3X3NlZWQgPSAocmFuZG9tX3NlZWRfZmxhZyA9PSAwKSA/CisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KEdldFRpbWVJbk1pbGxpcygpKSA6CisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHJhbmRvbV9zZWVkX2ZsYWcpOworCisgIC8vIE5vcm1hbGl6ZXMgdGhlIGFjdHVhbCBzZWVkIHRvIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gc3VjaCB0aGF0CisgIC8vIGl0J3MgZWFzeSB0byB0eXBlLgorICBjb25zdCBpbnQgbm9ybWFsaXplZF9zZWVkID0KKyAgICAgIHN0YXRpY19jYXN0PGludD4oKHJhd19zZWVkIC0gMVUpICUKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihrTWF4UmFuZG9tU2VlZCkpICsgMTsKKyAgcmV0dXJuIG5vcm1hbGl6ZWRfc2VlZDsKK30KKworLy8gUmV0dXJucyB0aGUgZmlyc3QgdmFsaWQgcmFuZG9tIHNlZWQgYWZ0ZXIgJ3NlZWQnLiAgVGhlIGJlaGF2aW9yIGlzCisvLyB1bmRlZmluZWQgaWYgJ3NlZWQnIGlzIGludmFsaWQuICBUaGUgc2VlZCBhZnRlciBrTWF4UmFuZG9tU2VlZCBpcworLy8gY29uc2lkZXJlZCB0byBiZSAxLgoraW5saW5lIGludCBHZXROZXh0UmFuZG9tU2VlZChpbnQgc2VlZCkgeworICBHVEVTVF9DSEVDS18oMSA8PSBzZWVkICYmIHNlZWQgPD0ga01heFJhbmRvbVNlZWQpCisgICAgICA8PCAiSW52YWxpZCByYW5kb20gc2VlZCAiIDw8IHNlZWQgPDwgIiAtIG11c3QgYmUgaW4gWzEsICIKKyAgICAgIDw8IGtNYXhSYW5kb21TZWVkIDw8ICJdLiI7CisgIGNvbnN0IGludCBuZXh0X3NlZWQgPSBzZWVkICsgMTsKKyAgcmV0dXJuIChuZXh0X3NlZWQgPiBrTWF4UmFuZG9tU2VlZCkgPyAxIDogbmV4dF9zZWVkOworfQorCisvLyBUaGlzIGNsYXNzIHNhdmVzIHRoZSB2YWx1ZXMgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzIGluIGl0cyBjJ3RvciwgYW5kCisvLyByZXN0b3JlcyB0aGVtIGluIGl0cyBkJ3Rvci4KK2NsYXNzIEdUZXN0RmxhZ1NhdmVyIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjJ3Rvci4KKyAgR1Rlc3RGbGFnU2F2ZXIoKSB7CisgICAgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfID0gR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyk7CisgICAgYnJlYWtfb25fZmFpbHVyZV8gPSBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpOworICAgIGNhdGNoX2V4Y2VwdGlvbnNfID0gR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKTsKKyAgICBjb2xvcl8gPSBHVEVTVF9GTEFHKGNvbG9yKTsKKyAgICBkZWF0aF90ZXN0X3N0eWxlXyA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSk7CisgICAgZGVhdGhfdGVzdF91c2VfZm9ya18gPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworICAgIGZpbHRlcl8gPSBHVEVTVF9GTEFHKGZpbHRlcik7CisgICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfID0gR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCk7CisgICAgbGlzdF90ZXN0c18gPSBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpOworICAgIG91dHB1dF8gPSBHVEVTVF9GTEFHKG91dHB1dCk7CisgICAgcHJpbnRfdGltZV8gPSBHVEVTVF9GTEFHKHByaW50X3RpbWUpOworICAgIHJhbmRvbV9zZWVkXyA9IEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpOworICAgIHJlcGVhdF8gPSBHVEVTVF9GTEFHKHJlcGVhdCk7CisgICAgc2h1ZmZsZV8gPSBHVEVTVF9GTEFHKHNodWZmbGUpOworICAgIHN0YWNrX3RyYWNlX2RlcHRoXyA9IEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpOworICAgIHN0cmVhbV9yZXN1bHRfdG9fID0gR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsKKyAgICB0aHJvd19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7CisgIH0KKworICAvLyBUaGUgZCd0b3IgaXMgbm90IHZpcnR1YWwuICBETyBOT1QgSU5IRVJJVCBGUk9NIFRISVMgQ0xBU1MuCisgIH5HVGVzdEZsYWdTYXZlcigpIHsKKyAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXzsKKyAgICBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpID0gYnJlYWtfb25fZmFpbHVyZV87CisgICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IGNhdGNoX2V4Y2VwdGlvbnNfOworICAgIEdURVNUX0ZMQUcoY29sb3IpID0gY29sb3JfOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSBkZWF0aF90ZXN0X3N0eWxlXzsKKyAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gZGVhdGhfdGVzdF91c2VfZm9ya187CisgICAgR1RFU1RfRkxBRyhmaWx0ZXIpID0gZmlsdGVyXzsKKyAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSA9IGludGVybmFsX3J1bl9kZWF0aF90ZXN0XzsKKyAgICBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpID0gbGlzdF90ZXN0c187CisgICAgR1RFU1RfRkxBRyhvdXRwdXQpID0gb3V0cHV0XzsKKyAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gcHJpbnRfdGltZV87CisgICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSByYW5kb21fc2VlZF87CisgICAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0XzsKKyAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gc2h1ZmZsZV87CisgICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSBzdGFja190cmFjZV9kZXB0aF87CisgICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSA9IHN0cmVhbV9yZXN1bHRfdG9fOworICAgIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSB0aHJvd19vbl9mYWlsdXJlXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gRmllbGRzIGZvciBzYXZpbmcgdGhlIG9yaWdpbmFsIHZhbHVlcyBvZiBmbGFncy4KKyAgYm9vbCBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c187CisgIGJvb2wgYnJlYWtfb25fZmFpbHVyZV87CisgIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187CisgIHN0ZDo6c3RyaW5nIGNvbG9yXzsKKyAgc3RkOjpzdHJpbmcgZGVhdGhfdGVzdF9zdHlsZV87CisgIGJvb2wgZGVhdGhfdGVzdF91c2VfZm9ya187CisgIHN0ZDo6c3RyaW5nIGZpbHRlcl87CisgIHN0ZDo6c3RyaW5nIGludGVybmFsX3J1bl9kZWF0aF90ZXN0XzsKKyAgYm9vbCBsaXN0X3Rlc3RzXzsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0XzsKKyAgYm9vbCBwcmludF90aW1lXzsKKyAgaW50ZXJuYWw6OkludDMyIHJhbmRvbV9zZWVkXzsKKyAgaW50ZXJuYWw6OkludDMyIHJlcGVhdF87CisgIGJvb2wgc2h1ZmZsZV87CisgIGludGVybmFsOjpJbnQzMiBzdGFja190cmFjZV9kZXB0aF87CisgIHN0ZDo6c3RyaW5nIHN0cmVhbV9yZXN1bHRfdG9fOworICBib29sIHRocm93X29uX2ZhaWx1cmVfOworfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKworLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKKy8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgorLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50CisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIGNvbnZlcnRlZAorLy8gdG8gIihJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCkiLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQpOworCisvLyBDb252ZXJ0cyBhIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KKy8vIFRoZSB3aWRlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKKy8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpCisvLyAgIFVURi0zMiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gNCAob24gTGludXgpCisvLyBQYXJhbWV0ZXIgc3RyIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZCB3aWRlIHN0cmluZy4KKy8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyCisvLyBvZiB3Y2hhcl90IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLiAtMSBpcyB1c2VkIHdoZW4gdGhlIGVudGlyZSBzdHJpbmcKKy8vIHNob3VsZCBiZSBwcm9jZXNzZWQuCisvLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzCisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSB0aGV5IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuIElmIHRoZSBzdHJpbmcgaXMgaW4gVVRGMTYgZW5jb2RpbmcKKy8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycworLy8gd2lsbCBiZSBlbmNvZGVkIGFzIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXJzIGZyb20gQmFzaWMgTm9ybWFsIFBsYW5lLgorR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycyk7CisKKy8vIFJlYWRzIHRoZSBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYW5kIGNyZWF0ZXMgdGhlIGZpbGUKKy8vIGlmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LiBJZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbiwgdGhpcworLy8gZnVuY3Rpb24gd2lsbCB3cml0ZSBvdmVyIGl0LiBJZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudCwgYnV0IHRoZSBmaWxlIGNhbm5vdAorLy8gYmUgY3JlYXRlZCwgcHJpbnRzIGFuIGVycm9yIGFuZCBleGl0cy4KK3ZvaWQgV3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCk7CisKKy8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAorLy8gYnV0IGluY29uc2lzdGVudCAoZS5nLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCisvLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCisvLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0CisvLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRTaGFyZChjb25zdCBjaGFyKiB0b3RhbF9zaGFyZHNfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJkX2luZGV4X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpOworCisvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHZhciBhcyBhbiBJbnQzMi4gSWYgaXQgaXMgdW5zZXQsCisvLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvciBhbmQKKy8vIGFuZCBhYm9ydHMuCitHVEVTVF9BUElfIEludDMyIEludDMyRnJvbUVudk9yRGllKGNvbnN0IGNoYXIqIGVudl92YXIsIEludDMyIGRlZmF1bHRfdmFsKTsKKworLy8gR2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMsIHRoZSBzaGFyZCBpbmRleCwgYW5kIHRoZSB0ZXN0IGlkLAorLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBzaG91bGQgYmUgcnVuIG9uIHRoaXMgc2hhcmQuIFRoZSB0ZXN0IGlkIGlzCisvLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdAorLy8gbWV0aG9kLiBBc3N1bWVzIHRoYXQgMCA8PSBzaGFyZF9pbmRleCA8IHRvdGFsX3NoYXJkcy4KK0dURVNUX0FQSV8gYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZCgKKyAgICBpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKTsKKworLy8gU1RMIGNvbnRhaW5lciB1dGlsaXRpZXMuCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyIHRoYXQgc2F0aXNmeQorLy8gdGhlIGdpdmVuIHByZWRpY2F0ZS4KK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIFByZWRpY2F0ZT4KK2lubGluZSBpbnQgQ291bnRJZihjb25zdCBDb250YWluZXImIGMsIFByZWRpY2F0ZSBwcmVkaWNhdGUpIHsKKyAgLy8gSW1wbGVtZW50ZWQgYXMgYW4gZXhwbGljaXQgbG9vcCBzaW5jZSBzdGQ6OmNvdW50X2lmKCkgaW4gbGliQ3N0ZCBvbgorICAvLyBTb2xhcmlzIGhhcyBhIG5vbi1zdGFuZGFyZCBzaWduYXR1cmUuCisgIGludCBjb3VudCA9IDA7CisgIGZvciAodHlwZW5hbWUgQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IGMuYmVnaW4oKTsgaXQgIT0gYy5lbmQoKTsgKytpdCkgeworICAgIGlmIChwcmVkaWNhdGUoKml0KSkKKyAgICAgICsrY291bnQ7CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCisvLyBBcHBsaWVzIGEgZnVuY3Rpb24vZnVuY3RvciB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4KK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIEZ1bmN0b3I+Cit2b2lkIEZvckVhY2goY29uc3QgQ29udGFpbmVyJiBjLCBGdW5jdG9yIGZ1bmN0b3IpIHsKKyAgc3RkOjpmb3JfZWFjaChjLmJlZ2luKCksIGMuZW5kKCksIGZ1bmN0b3IpOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIGVsZW1lbnQgb2YgdGhlIHZlY3Rvciwgb3IgZGVmYXVsdF92YWx1ZSBpZiBpIGlzIG5vdAorLy8gaW4gcmFuZ2UgWzAsIHYuc2l6ZSgpKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPgoraW5saW5lIEUgR2V0RWxlbWVudE9yKGNvbnN0IHN0ZDo6dmVjdG9yPEU+JiB2LCBpbnQgaSwgRSBkZWZhdWx0X3ZhbHVlKSB7CisgIHJldHVybiAoaSA8IDAgfHwgaSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHYuc2l6ZSgpKSkgPyBkZWZhdWx0X3ZhbHVlIDogdltpXTsKK30KKworLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiBhIHJhbmdlIG9mIHRoZSB2ZWN0b3IncyBlbGVtZW50cy4KKy8vICdiZWdpbicgYW5kICdlbmQnIGFyZSBlbGVtZW50IGluZGljZXMgYXMgYW4gU1RMLXN0eWxlIHJhbmdlOworLy8gaS5lLiBbYmVnaW4sIGVuZCkgYXJlIHNodWZmbGVkLCB3aGVyZSAnZW5kJyA9PSBzaXplKCkgbWVhbnMgdG8KKy8vIHNodWZmbGUgdG8gdGhlIGVuZCBvZiB0aGUgdmVjdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+Cit2b2lkIFNodWZmbGVSYW5nZShpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20sIGludCBiZWdpbiwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEU+KiB2KSB7CisgIGNvbnN0IGludCBzaXplID0gc3RhdGljX2Nhc3Q8aW50Pih2LT5zaXplKCkpOworICBHVEVTVF9DSEVDS18oMCA8PSBiZWdpbiAmJiBiZWdpbiA8PSBzaXplKQorICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBzdGFydCAiIDw8IGJlZ2luIDw8ICI6IG11c3QgYmUgaW4gcmFuZ2UgWzAsICIKKyAgICAgIDw8IHNpemUgPDwgIl0uIjsKKyAgR1RFU1RfQ0hFQ0tfKGJlZ2luIDw9IGVuZCAmJiBlbmQgPD0gc2l6ZSkKKyAgICAgIDw8ICJJbnZhbGlkIHNodWZmbGUgcmFuZ2UgZmluaXNoICIgPDwgZW5kIDw8ICI6IG11c3QgYmUgaW4gcmFuZ2UgWyIKKyAgICAgIDw8IGJlZ2luIDw8ICIsICIgPDwgc2l6ZSA8PCAiXS4iOworCisgIC8vIEZpc2hlci1ZYXRlcyBzaHVmZmxlLCBmcm9tCisgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUKKyAgZm9yIChpbnQgcmFuZ2Vfd2lkdGggPSBlbmQgLSBiZWdpbjsgcmFuZ2Vfd2lkdGggPj0gMjsgcmFuZ2Vfd2lkdGgtLSkgeworICAgIGNvbnN0IGludCBsYXN0X2luX3JhbmdlID0gYmVnaW4gKyByYW5nZV93aWR0aCAtIDE7CisgICAgY29uc3QgaW50IHNlbGVjdGVkID0gYmVnaW4gKyByYW5kb20tPkdlbmVyYXRlKHJhbmdlX3dpZHRoKTsKKyAgICBzdGQ6OnN3YXAoKCp2KVtzZWxlY3RlZF0sICgqdilbbGFzdF9pbl9yYW5nZV0pOworICB9Cit9CisKKy8vIFBlcmZvcm1zIGFuIGluLXBsYWNlIHNodWZmbGUgb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+CitpbmxpbmUgdm9pZCBTaHVmZmxlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSwgMCwgc3RhdGljX2Nhc3Q8aW50Pih2LT5zaXplKCkpLCB2KTsKK30KKworLy8gQSBmdW5jdGlvbiBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LiAgSGFuZHkgZm9yIGJlaW5nIHVzZWQgYXMgYQorLy8gZnVuY3Rvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgRGVsZXRlKFQqIHgpIHsKKyAgZGVsZXRlIHg7Cit9CisKKy8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSBrZXkgb2YgYSBUZXN0UHJvcGVydHkgYWdhaW5zdCBhIGtub3duIGtleS4KKy8vCisvLyBUZXN0UHJvcGVydHlLZXlJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3RQcm9wZXJ0eUtleUlzIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yLgorICAvLworICAvLyBUZXN0UHJvcGVydHlLZXlJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdFByb3BlcnR5S2V5SXMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgOiBrZXlfKGtleSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdCBwcm9wZXJ0eSBtYXRjaGVzIG9uIGtleV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIGNvbnN0IHsKKyAgICByZXR1cm4gdGVzdF9wcm9wZXJ0eS5rZXkoKSA9PSBrZXlfOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBrZXlfOworfTsKKworLy8gQ2xhc3MgVW5pdFRlc3RPcHRpb25zLgorLy8KKy8vIFRoaXMgY2xhc3MgY29udGFpbnMgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIG9wdGlvbnMgdGhlIHVzZXIKKy8vIHNwZWNpZmllcyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLiAgSXQgaGFzIG9ubHkgc3RhdGljIG1lbWJlcnMuCisvLworLy8gSW4gbW9zdCBjYXNlcywgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYW4gb3B0aW9uIHVzaW5nIGVpdGhlciBhbgorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYSBjb21tYW5kIGxpbmUgZmxhZy4gIEUuZy4geW91IGNhbiBzZXQgdGhlCisvLyB0ZXN0IGZpbHRlciB1c2luZyBlaXRoZXIgR1RFU1RfRklMVEVSIG9yIC0tZ3Rlc3RfZmlsdGVyLiAgSWYgYm90aAorLy8gdGhlIHZhcmlhYmxlIGFuZCB0aGUgZmxhZyBhcmUgcHJlc2VudCwgdGhlIGxhdHRlciBvdmVycmlkZXMgdGhlCisvLyBmb3JtZXIuCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0T3B0aW9ucyB7CisgcHVibGljOgorICAvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLgorCisgIC8vIFJldHVybnMgdGhlIG91dHB1dCBmb3JtYXQsIG9yICIiIGZvciBub3JtYWwgcHJpbnRlZCBvdXRwdXQuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRPdXRwdXRGb3JtYXQoKTsKKworICAvLyBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZQorICAvLyBkZWZhdWx0ICh0ZXN0X2RldGFpbC54bWwgaW4gdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5KSBpZgorICAvLyBub25lIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOworCisgIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3RfZmlsdGVyIGZsYWcuCisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKyAgLy8gZmlyc3QgJzonIG9yICdcMCcgY2hhcmFjdGVyIGluIHBhdHRlcm4gbWFya3MgdGhlIGVuZCBvZiBpdC4KKyAgLy8KKyAgLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisgIC8vIHdvcmtzIHdlbGwgZW5vdWdoIGZvciBtYXRjaGluZyB0ZXN0IG5hbWVzLCB3aGljaCBhcmUgc2hvcnQuCisgIHN0YXRpYyBib29sIFBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKnN0cik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIG1hdGNoZXMgdGhlIHRlc3QgY2FzZQorICAvLyBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorICBzdGF0aWMgYm9vbCBGaWx0ZXJNYXRjaGVzVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X25hbWUpOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBGdW5jdGlvbiBmb3Igc3VwcG9ydGluZyB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uIGZsYWcuCisKKyAgLy8gUmV0dXJucyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIGlmIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgdGhlCisgIC8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLgorICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhcyBhbiBfX2V4Y2VwdCBjb25kaXRpb24uCisgIHN0YXRpYyBpbnQgR1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiAibmFtZSIgbWF0Y2hlcyB0aGUgJzonIHNlcGFyYXRlZCBsaXN0IG9mIGdsb2Itc3R5bGUKKyAgLy8gZmlsdGVycyBpbiAiZmlsdGVyIi4KKyAgc3RhdGljIGJvb2wgTWF0Y2hlc0ZpbHRlcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogZmlsdGVyKTsKK307CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24ncyBuYW1lLCByZW1vdmluZyBkaXJlY3RvcnkgcGF0aCBpZiB0aGF0CisvLyBpcyBwcmVzZW50LiAgVXNlZCBieSBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZpbGUuCitHVEVTVF9BUElfIEZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpOworCisvLyBUaGUgcm9sZSBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIE9TIHN0YWNrIHRyYWNlIGFzIGEgc3RyaW5nLgorY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9CisgIHZpcnR1YWwgfk9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9CisKKyAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4gIFBhcmFtZXRlcnM6CisgIC8vCisgIC8vICAgbWF4X2RlcHRoICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQKKyAgLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLgorICAvLyAgIHNraXBfY291bnQgLSB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZDsgZG9lc24ndCBjb3VudAorICAvLyAgICAgICAgICAgICAgICBhZ2FpbnN0IG1heF9kZXB0aC4KKyAgdmlydHVhbCBzdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpID0gMDsKKworICAvLyBVcG9uTGVhdmluZ0dUZXN0KCkgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgR29vZ2xlIFRlc3QgY2FsbHMKKyAgLy8gdXNlciBjb2RlLiBJdCBzYXZlcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YWNrIHRoYXQKKyAgLy8gQ3VycmVudFN0YWNrVHJhY2UoKSB3aWxsIHVzZSB0byBmaW5kIGFuZCBoaWRlIEdvb2dsZSBUZXN0IHN0YWNrIGZyYW1lcy4KKyAgdmlydHVhbCB2b2lkIFVwb25MZWF2aW5nR1Rlc3QoKSA9IDA7CisKKyAgLy8gVGhpcyBzdHJpbmcgaXMgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2Ygc3RhY2sgZnJhbWVzIHRoYXQgYXJlIHBhcnQgb2YKKyAgLy8gR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbi4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFbGlkZWRGcmFtZXNNYXJrZXI7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSk7Cit9OworCisvLyBBIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSBpbnRlcmZhY2UuCitjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIgOiBwdWJsaWMgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIE9zU3RhY2tUcmFjZUdldHRlcigpIHt9CisKKyAgdmlydHVhbCBzdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpOworICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhPc1N0YWNrVHJhY2VHZXR0ZXIpOworfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBHb29nbGUgVGVzdCB0cmFjZSBwb2ludC4KK3N0cnVjdCBUcmFjZUluZm8geworICBjb25zdCBjaGFyKiBmaWxlOworICBpbnQgbGluZTsKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKK307CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbiBVbml0VGVzdEltcGwuCisvLyBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgVW5pdFRlc3RJbXBsLgorY2xhc3MgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihVbml0VGVzdEltcGwqIHVuaXRfdGVzdCk7CisgIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFJlcG9ydHMgdGhlIHRlc3QgcGFydAorICAvLyByZXN1bHQgaW4gdGhlIGN1cnJlbnQgdGVzdC4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgcHJpdmF0ZToKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCB1bml0X3Rlc3RfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBwZXIgdGhyZWFkIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbgorLy8gVW5pdFRlc3RJbXBsLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgVW5pdFRlc3RJbXBsLgorY2xhc3MgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsKKyAgLy8gSW1wbGVtZW50cyB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZS4gVGhlIGltcGxlbWVudGF0aW9uIGp1c3QKKyAgLy8gZGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIG9mICp1bml0X3Rlc3RfLgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyBwcml2YXRlOgorICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCisvLyBUaGUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5pdFRlc3QgY2xhc3MuICBXZSBkb24ndCBwcm90ZWN0CisvLyB0aGUgbWV0aG9kcyB1bmRlciBhIG11dGV4LCBhcyB0aGlzIGNsYXNzIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IGEKKy8vIHVzZXIgYW5kIHRoZSBVbml0VGVzdCBjbGFzcyB0aGF0IGRlbGVnYXRlcyB3b3JrIHRvIHRoaXMgY2xhc3MgZG9lcworLy8gcHJvcGVyIGxvY2tpbmcuCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0SW1wbCB7CisgcHVibGljOgorICBleHBsaWNpdCBVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCk7CisgIHZpcnR1YWwgflVuaXRUZXN0SW1wbCgpOworCisgIC8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgdG8gcmVnaXN0ZXIgeW91ciBvd24gVGVzdFBhcnRSZXN1bHRSZXBvcnRlci4KKyAgLy8gWW91IGNhbiByZWdpc3RlciB5b3VyIG93biByZXBvdGVyIHRvIGxpc3RlbiBlaXRoZXIgb25seSBmb3IgdGVzdCByZXN1bHRzCisgIC8vIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkIG9yIGZvciByZXN1bHRzIGZyb20gYWxsIHRocmVhZHMuCisgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggcGVyLXRocmVhZCB0ZXN0IHJlc3VsdCByZXBvdGVyIGp1c3QgcGFzc2VzIGEgbmV3CisgIC8vIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBnbG9iYWwgdGVzdCByZXN1bHQgcmVwb3J0ZXIsIHdoaWNoIHJlZ2lzdGVycyB0aGUKKyAgLy8gdGVzdCBwYXJ0IHJlc3VsdCBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuCisKKyAgLy8gUmV0dXJucyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIEdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKKworICAvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KKyAgdm9pZCBTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpOworCisgIC8vIFJldHVybnMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogR2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKTsKKworICAvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIHZvaWQgU2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgorICBpbnQgZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KKyAgaW50IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKKyAgLy8gdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KKyAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgaW50IHJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KKyAgaW50IHJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCisgIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gVU5JWCBlcG9jaC4KKyAgVGltZUluTWlsbGlzIHN0YXJ0X3RpbWVzdGFtcCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0X3RpbWVzdGFtcF87IH0KKworICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCisgIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKKyAgLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCisgIGJvb2wgRmFpbGVkKCkgY29uc3QgeworICAgIHJldHVybiBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgPiAwIHx8IGFkX2hvY190ZXN0X3Jlc3VsdCgpLT5GYWlsZWQoKTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBjb25zdCBUZXN0Q2FzZSogR2V0VGVzdENhc2UoaW50IGkpIGNvbnN0IHsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9jYXNlX2luZGljZXNfLCBpLCAtMSk7CisgICAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2Nhc2VzX1tpXTsKKyAgfQorCisgIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorICBUZXN0Q2FzZSogR2V0TXV0YWJsZVRlc3RDYXNlKGludCBpKSB7CisgICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOworICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baW5kZXhdOworICB9CisKKyAgLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lciBsaXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycygpIHsgcmV0dXJuICZsaXN0ZW5lcnNfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgorICAvLyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0IGlmIG5vIHRlc3QgaXMgcnVubmluZy4KKyAgVGVzdFJlc3VsdCogY3VycmVudF90ZXN0X3Jlc3VsdCgpOworCisgIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdC4KKyAgY29uc3QgVGVzdFJlc3VsdCogYWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gJmFkX2hvY190ZXN0X3Jlc3VsdF87IH0KKworICAvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisgIC8vCisgIC8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlcgorICAvLyBhcmUgdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlCisgIC8vIGlucHV0IHRoZSBjdXJyZW50IGdldHRlci4KKyAgdm9pZCBzZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBpZiBpdCBpcyBub3QgTlVMTDsKKyAgLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKyAgLy8gZ2V0dGVyLCBhbmQgcmV0dXJucyBpdC4KKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXIoKTsKKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgorICAvLworICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorICAvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorICAvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKyAgLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKyAgLy8KKyAgLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisgIC8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisgIC8vIHRyYWNlIGJ1dCBCYXIoKSBhbmQgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0LgorICBzdGQ6OnN0cmluZyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKGludCBza2lwX2NvdW50KSBHVEVTVF9OT19JTkxJTkVfOworCisgIC8vIEZpbmRzIGFuZCByZXR1cm5zIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG9uZSBkb2Vzbid0CisgIC8vIGV4aXN0LCBjcmVhdGVzIG9uZSBhbmQgcmV0dXJucyBpdC4KKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0eXBlX3BhcmFtOiAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorICAvLyAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIC8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVhcl9kb3duX3RjOiAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisgIFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpOworCisgIC8vIEFkZHMgYSBUZXN0SW5mbyB0byB0aGUgdW5pdCB0ZXN0LgorICAvLworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZXN0X2luZm86ICAgIHRoZSBUZXN0SW5mbyBvYmplY3QKKyAgdm9pZCBBZGRUZXN0SW5mbyhUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgICAgICAgICAgICAgICAgIFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzLCB3ZSBuZWVkIHRvCisgICAgLy8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIHRlc3QgcHJvZ3JhbQorICAgIC8vIHdhcyBmaXJzdCBpbnZva2VkLiAgV2UgY2Fubm90IGRvIHRoaXMgaW4gUlVOX0FMTF9URVNUUygpLCBhcworICAgIC8vIHRoZSB1c2VyIG1heSBoYXZlIGNoYW5nZWQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGJlZm9yZSBjYWxsaW5nCisgICAgLy8gUlVOX0FMTF9URVNUUygpLiAgVGhlcmVmb3JlIHdlIGNhcHR1cmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluCisgICAgLy8gQWRkVGVzdEluZm8oKSwgd2hpY2ggaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGEgVEVTVCBvciBURVNUX0YKKyAgICAvLyBiZWZvcmUgbWFpbigpIGlzIHJlYWNoZWQuCisgICAgaWYgKG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpIHsKKyAgICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5TZXQoRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSk7CisgICAgICBHVEVTVF9DSEVDS18oIW9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpCisgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIjsKKyAgICB9CisKKyAgICBHZXRUZXN0Q2FzZSh0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCksCisgICAgICAgICAgICAgICAgdGVzdF9pbmZvLT50eXBlX3BhcmFtKCksCisgICAgICAgICAgICAgICAgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgIHRlYXJfZG93bl90YyktPkFkZFRlc3RJbmZvKHRlc3RfaW5mbyk7CisgIH0KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKSB7CisgICAgcmV0dXJuIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV87CisgIH0KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBTZXRzIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZy4KKyAgdm9pZCBzZXRfY3VycmVudF90ZXN0X2Nhc2UoVGVzdENhc2UqIGFfY3VycmVudF90ZXN0X2Nhc2UpIHsKKyAgICBjdXJyZW50X3Rlc3RfY2FzZV8gPSBhX2N1cnJlbnRfdGVzdF9jYXNlOworICB9CisKKyAgLy8gU2V0cyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcuICBJZgorICAvLyBjdXJyZW50X3Rlc3RfaW5mbyBpcyBOVUxMLCB0aGUgYXNzZXJ0aW9uIHJlc3VsdHMgd2lsbCBiZSBzdG9yZWQgaW4KKyAgLy8gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4KKyAgdm9pZCBzZXRfY3VycmVudF90ZXN0X2luZm8oVGVzdEluZm8qIGFfY3VycmVudF90ZXN0X2luZm8pIHsKKyAgICBjdXJyZW50X3Rlc3RfaW5mb18gPSBhX2N1cnJlbnRfdGVzdF9pbmZvOworICB9CisKKyAgLy8gUmVnaXN0ZXJzIGFsbCBwYXJhbWV0ZXJpemVkIHRlc3RzIGRlZmluZWQgdXNpbmcgVEVTVF9QIGFuZAorICAvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCwgY3JlYXRpbmcgcmVndWxhciB0ZXN0cyBmb3IgZWFjaCB0ZXN0L3BhcmFtZXRlcgorICAvLyBjb21iaW5hdGlvbi4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZTsgaXQgaGFzIGd1YXJkcworICAvLyBwcm90ZWN0aW5nIGZyb20gcmVnaXN0ZXJpbmcgdGhlIHRlc3RzIG1vcmUgdGhlbiBvbmNlLiAgSWYKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZGlzYWJsZWQsIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzIGlzCisgIC8vIHByZXNlbnQgYnV0IGRvZXMgbm90aGluZy4KKyAgdm9pZCBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpOworCisgIC8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisgIC8vIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgYXJlIHN1Y2Nlc3NmdWwuICBJZiBhbnkgZXhjZXB0aW9uIGlzCisgIC8vIHRocm93biBkdXJpbmcgYSB0ZXN0LCB0aGlzIHRlc3QgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dAorICAvLyB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBzdGlsbCBiZSBydW4uCisgIGJvb2wgUnVuQWxsVGVzdHMoKTsKKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzLCBleGNlcHQgdGhlIGFkIGhvYyB0ZXN0cy4KKyAgdm9pZCBDbGVhck5vbkFkSG9jVGVzdFJlc3VsdCgpIHsKKyAgICBGb3JFYWNoKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZTo6Q2xlYXJUZXN0Q2FzZVJlc3VsdCk7CisgIH0KKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWQtaG9jIHRlc3QgYXNzZXJ0aW9ucy4KKyAgdm9pZCBDbGVhckFkSG9jVGVzdFJlc3VsdCgpIHsKKyAgICBhZF9ob2NfdGVzdF9yZXN1bHRfLkNsZWFyKCk7CisgIH0KKworICAvLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBpbiBhCisgIC8vIGNvbnRleHQgb2YgYSB0ZXN0IG9yIGEgdGVzdCBjYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldC4gSWYgdGhlCisgIC8vIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksIHRoZSB2YWx1ZSB3aWxsIGJlCisgIC8vIHVwZGF0ZWQuCisgIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKKworICBlbnVtIFJlYWN0aW9uVG9TaGFyZGluZyB7CisgICAgSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsCisgICAgSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MCisgIH07CisKKyAgLy8gTWF0Y2hlcyB0aGUgZnVsbCBuYW1lIG9mIGVhY2ggdGVzdCBhZ2FpbnN0IHRoZSB1c2VyLXNwZWNpZmllZAorICAvLyBmaWx0ZXIgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIHJ1biwgdGhlbiByZWNvcmRzIHRoZQorICAvLyByZXN1bHQgaW4gZWFjaCBUZXN0Q2FzZSBhbmQgVGVzdEluZm8gb2JqZWN0LgorICAvLyBJZiBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCwgZnVydGhlciBmaWx0ZXJzIHRlc3RzCisgIC8vIGJhc2VkIG9uIHNoYXJkaW5nIHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQuCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCBGaWx0ZXJUZXN0cyhSZWFjdGlvblRvU2hhcmRpbmcgc2hhcmRfdGVzdHMpOworCisgIC8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4KKyAgdm9pZCBMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpOworCisgIGNvbnN0IFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9jYXNlXzsgfQorICBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSB7IHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb187IH0KKyAgY29uc3QgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdmVjdG9yIG9mIGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gYmUgc2V0LXVwL3Rvcm4tZG93bgorICAvLyBiZWZvcmUvYWZ0ZXIgdGhlIHRlc3RzIGFyZSBydW4uCisgIHN0ZDo6dmVjdG9yPEVudmlyb25tZW50Kj4mIGVudmlyb25tZW50cygpIHsgcmV0dXJuIGVudmlyb25tZW50c187IH0KKworICAvLyBHZXR0ZXJzIGZvciB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgc3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiYgZ3Rlc3RfdHJhY2Vfc3RhY2soKSB7CisgICAgcmV0dXJuICooZ3Rlc3RfdHJhY2Vfc3RhY2tfLnBvaW50ZXIoKSk7CisgIH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiYgZ3Rlc3RfdHJhY2Vfc3RhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIGd0ZXN0X3RyYWNlX3N0YWNrXy5nZXQoKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgdm9pZCBJbml0RGVhdGhUZXN0U3VicHJvY2Vzc0NvbnRyb2xJbmZvKCkgeworICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLnJlc2V0KFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkpOworICB9CisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdAorICAvLyBmbGFnLCBvciBOVUxMIGlmIHRoYXQgZmxhZyB3YXMgbm90IHNwZWNpZmllZC4KKyAgLy8gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgb25seSBpbiBhIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KKyAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBhIGNhbGwgdG8gSW5pdEdvb2dsZVRlc3QuCisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCk7CisgIH0KKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBkZWF0aCB0ZXN0IGZhY3RvcnkuCisgIGludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5KiBkZWF0aF90ZXN0X2ZhY3RvcnkoKSB7CisgICAgcmV0dXJuIGRlYXRoX3Rlc3RfZmFjdG9yeV8uZ2V0KCk7CisgIH0KKworICB2b2lkIFN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCk7CisKKyAgZnJpZW5kIGNsYXNzIFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5OworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIC8vIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lciBwZXJmb3JtaW5nIFhNTCBvdXRwdXQgYXMgc3BlY2lmaWVkIGJ5CisgIC8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KKyAgdm9pZCBDb25maWd1cmVYbWxPdXRwdXQoKTsKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyAgLy8gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIHRvIGEgc29ja2V0LgorICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0LgorICB2b2lkIENvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpOworI2VuZGlmCisKKyAgLy8gUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gZGVwZW5kZW50IHVwb24gZmxhZyB2YWx1ZXMgb2J0YWluZWQgaW4KKyAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSW4gY2FzZSBhIHVzZXIgbmVnbGVjdHMgdG8gY2FsbCBJbml0R29vZ2xlVGVzdAorICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorICAvLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50LgorICB2b2lkIFBvc3RGbGFnUGFyc2luZ0luaXQoKTsKKworICAvLyBHZXRzIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IGl0ZXJhdGlvbi4KKyAgaW50IHJhbmRvbV9zZWVkKCkgY29uc3QgeyByZXR1cm4gcmFuZG9tX3NlZWRfOyB9CisKKyAgLy8gR2V0cyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgIGludGVybmFsOjpSYW5kb20qIHJhbmRvbSgpIHsgcmV0dXJuICZyYW5kb21fOyB9CisKKyAgLy8gU2h1ZmZsZXMgYWxsIHRlc3QgY2FzZXMsIGFuZCB0aGUgdGVzdHMgd2l0aGluIGVhY2ggdGVzdCBjYXNlLAorICAvLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCisgIHZvaWQgU2h1ZmZsZVRlc3RzKCk7CisKKyAgLy8gUmVzdG9yZXMgdGhlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIHRvIHRoZWlyIG9yZGVyIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KKyAgdm9pZCBVbnNodWZmbGVUZXN0cygpOworCisgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudAorICAvLyBVbml0VGVzdDo6UnVuKCkgc3RhcnRzLgorICBib29sIGNhdGNoX2V4Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiBjYXRjaF9leGNlcHRpb25zXzsgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6VW5pdFRlc3Q7CisKKyAgLy8gVXNlZCBieSBVbml0VGVzdDo6UnVuKCkgdG8gY2FwdHVyZSB0aGUgc3RhdGUgb2YKKyAgLy8gR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50IGl0IHN0YXJ0cy4KKyAgdm9pZCBzZXRfY2F0Y2hfZXhjZXB0aW9ucyhib29sIHZhbHVlKSB7IGNhdGNoX2V4Y2VwdGlvbnNfID0gdmFsdWU7IH0KKworICAvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRoYXQgb3ducyB0aGlzIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgVW5pdFRlc3QqIGNvbnN0IHBhcmVudF87CisKKyAgLy8gVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKSB3YXMKKyAgLy8gZXhlY3V0ZWQuCisgIGludGVybmFsOjpGaWxlUGF0aCBvcmlnaW5hbF93b3JraW5nX2Rpcl87CisKKyAgLy8gVGhlIGRlZmF1bHQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlcnMuCisgIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworICBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworCisgIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworCisgIC8vIFByb3RlY3RzIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uCisgIGludGVybmFsOjpNdXRleCBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl9tdXRleF87CisKKyAgLy8gUG9pbnRzIHRvIChidXQgZG9lc24ndCBvd24pIHRoZSBwZXItdGhyZWFkIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIGludGVybmFsOjpUaHJlYWRMb2NhbDxUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKj4KKyAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87CisKKyAgLy8gVGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24KKyAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLgorICBzdGQ6OnZlY3RvcjxFbnZpcm9ubWVudCo+IGVudmlyb25tZW50c187CisKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0Q2FzZXMgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuICBJdCBvd25zIHRoZQorICAvLyBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZSo+IHRlc3RfY2FzZXNfOworCisgIC8vIFByb3ZpZGVzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIHRoZSB0ZXN0IGNhc2UgbGlzdCB0byBhbGxvdworICAvLyBlYXN5IHNodWZmbGluZyBhbmQgcmVzdG9yaW5nIHRoZSB0ZXN0IGNhc2Ugb3JkZXIuICBUaGUgaS10aAorICAvLyBlbGVtZW50IG9mIHRoaXMgdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGNhc2UgaW4gdGhlCisgIC8vIHNodWZmbGVkIG9yZGVyLgorICBzdGQ6OnZlY3RvcjxpbnQ+IHRlc3RfY2FzZV9pbmRpY2VzXzsKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFBhcmFtZXRlcml6ZWRUZXN0UmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8gcmVnaXN0ZXIgdmFsdWUtcGFyYW1ldGVyaXplZAorICAvLyB0ZXN0cy4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV87CisKKyAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKSBoYXMgYmVlbiBjYWxsZWQgYWxyZWFkeS4KKyAgYm9vbCBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIC8vIEluZGV4IG9mIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZSByZWdpc3RlcmVkLiAgSW5pdGlhbGx5IC0xLgorICBpbnQgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfOworCisgIC8vIFRoaXMgcG9pbnRzIHRvIHRoZSBUZXN0Q2FzZSBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuICBJdAorICAvLyBjaGFuZ2VzIGFzIEdvb2dsZSBUZXN0IGdvZXMgdGhyb3VnaCBvbmUgdGVzdCBjYXNlIGFmdGVyIGFub3RoZXIuCisgIC8vIFdoZW4gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdAorICAvLyBzdG9yZXMgYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLgorICBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2VfOworCisgIC8vIFRoaXMgcG9pbnRzIHRvIHRoZSBUZXN0SW5mbyBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuICBJdAorICAvLyBjaGFuZ2VzIGFzIEdvb2dsZSBUZXN0IGdvZXMgdGhyb3VnaCBvbmUgdGVzdCBhZnRlciBhbm90aGVyLiAgV2hlbgorICAvLyBubyB0ZXN0IGlzIHJ1bm5pbmcsIHRoaXMgaXMgc2V0IHRvIE5VTEwgYW5kIEdvb2dsZSBUZXN0IHN0b3JlcworICAvLyBhc3NlcnRpb24gcmVzdWx0cyBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLiAgSW5pdGlhbGx5IE5VTEwuCisgIFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mb187CisKKyAgLy8gTm9ybWFsbHksIGEgdXNlciBvbmx5IHdyaXRlcyBhc3NlcnRpb25zIGluc2lkZSBhIFRFU1Qgb3IgVEVTVF9GLAorICAvLyBvciBpbnNpZGUgYSBmdW5jdGlvbiBjYWxsZWQgYnkgYSBURVNUIG9yIFRFU1RfRi4gIFNpbmNlIEdvb2dsZQorICAvLyBUZXN0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIHRlc3QgaXMgY3VycmVudCBydW5uaW5nLCBpdCBjYW4KKyAgLy8gYXNzb2NpYXRlIHN1Y2ggYW4gYXNzZXJ0aW9uIHdpdGggdGhlIHRlc3QgaXQgYmVsb25ncyB0by4KKyAgLy8KKyAgLy8gSWYgYW4gYXNzZXJ0aW9uIGlzIGVuY291bnRlcmVkIHdoZW4gbm8gVEVTVCBvciBURVNUX0YgaXMgcnVubmluZywKKyAgLy8gR29vZ2xlIFRlc3QgYXR0cmlidXRlcyB0aGUgYXNzZXJ0aW9uIHJlc3VsdCB0byBhbiBpbWFnaW5hcnkgImFkIGhvYyIKKyAgLy8gdGVzdCwgYW5kIHJlY29yZHMgdGhlIHJlc3VsdCBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLgorICBUZXN0UmVzdWx0IGFkX2hvY190ZXN0X3Jlc3VsdF87CisKKyAgLy8gVGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzIGluc2lkZQorICAvLyBHb29nbGUgVGVzdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyc187CisKKyAgLy8gVGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4gIFdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZSBVbml0VGVzdAorICAvLyBvYmplY3QgaXMgZGVzdHJ1Y3RlZC4gIEJ5IGRlZmF1bHQsIGFuIE9zU3RhY2tUcmFjZUdldHRlciBpcyB1c2VkLAorICAvLyBidXQgdGhlIHVzZXIgY2FuIHNldCB0aGlzIGZpZWxkIHRvIHVzZSBhIGN1c3RvbSBnZXR0ZXIgaWYgdGhhdCBpcworICAvLyBkZXNpcmVkLgorICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87CisKKyAgLy8gVHJ1ZSBpZmYgUG9zdEZsYWdQYXJzaW5nSW5pdCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgYm9vbCBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfOworCisgIC8vIFRoZSByYW5kb20gbnVtYmVyIHNlZWQgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0IHJ1bi4KKyAgaW50IHJhbmRvbV9zZWVkXzsKKworICAvLyBPdXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgIGludGVybmFsOjpSYW5kb20gcmFuZG9tXzsKKworICAvLyBUaGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gVU5JWCBlcG9jaC4KKyAgVGltZUluTWlsbGlzIHN0YXJ0X3RpbWVzdGFtcF87CisKKyAgLy8gSG93IGxvbmcgdGhlIHRlc3QgdG9vayB0byBydW4sIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAvLyBUaGUgZGVjb21wb3NlZCBjb21wb25lbnRzIG9mIHRoZSBndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLAorICAvLyBwYXJzZWQgd2hlbiBSVU5fQUxMX1RFU1RTIGlzIGNhbGxlZC4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnPiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXzsKKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8aW50ZXJuYWw6OkRlYXRoVGVzdEZhY3Rvcnk+IGRlYXRoX3Rlc3RfZmFjdG9yeV87CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgLy8gQSBwZXItdGhyZWFkIHN0YWNrIG9mIHRyYWNlcyBjcmVhdGVkIGJ5IHRoZSBTQ09QRURfVFJBQ0UoKSBtYWNyby4KKyAgaW50ZXJuYWw6OlRocmVhZExvY2FsPHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4gPiBndGVzdF90cmFjZV9zdGFja187CisKKyAgLy8gVGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBSdW5BbGxUZXN0cygpCisgIC8vIHN0YXJ0cy4KKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0SW1wbCk7Cit9OyAgLy8gY2xhc3MgVW5pdFRlc3RJbXBsCisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhY2Nlc3NpbmcgdGhlIGdsb2JhbCBVbml0VGVzdAorLy8gaW1wbGVtZW50YXRpb24gb2JqZWN0LgoraW5saW5lIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCkgeworICByZXR1cm4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKTsKK30KKworI2lmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyB0aGUgc2ltcGxlIHJlZ3VsYXIKKy8vIGV4cHJlc3Npb24gbWF0Y2hlci4KK0dURVNUX0FQSV8gYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaURpZ2l0KGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc1JlcGVhdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpV2hpdGVTcGFjZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpV29yZENoYXIoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNWYWxpZEVzY2FwZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBBdG9tTWF0Y2hlc0NoYXIoYm9vbCBlc2NhcGVkLCBjaGFyIHBhdHRlcm4sIGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBdEhlYWQoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoCisgICAgYm9vbCBlc2NhcGVkLCBjaGFyIGNoLCBjaGFyIHJlcGVhdCwgY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgTWF0Y2hSZWdleEFueXdoZXJlKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKKy8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0LgorR1RFU1RfQVBJXyB2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKK0dURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yLCByZWdhcmRsZXNzIG9mIHRoZQorLy8gcGxhdGZvcm0uCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCk7CisKKy8vIEF0dGVtcHRzIHRvIHBhcnNlIGEgc3RyaW5nIGludG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIHBvaW50ZWQgdG8gYnkgdGhlCisvLyBudW1iZXIgcGFyYW1ldGVyLiAgUmV0dXJucyB0cnVlIGlmIHRoYXQgaXMgcG9zc2libGUuCisvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZSA6OnN0ZDo6c3RyaW5nLCBzbyB3ZSBjYW4gdXNlCisvLyBpdCBoZXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIEludGVnZXI+Citib29sIFBhcnNlTmF0dXJhbE51bWJlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIEludGVnZXIqIG51bWJlcikgeworICAvLyBGYWlsIGZhc3QgaWYgdGhlIGdpdmVuIHN0cmluZyBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgZGlnaXQ7CisgIC8vIHRoaXMgYnlwYXNzZXMgc3RydG9YWFgncyAib3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBwbHVzCisgIC8vIG9yIG1pbnVzIHNpZ24iIHNlbWFudGljcywgd2hpY2ggYXJlIHVuZGVzaXJhYmxlIGhlcmUuCisgIGlmIChzdHIuZW1wdHkoKSB8fCAhSXNEaWdpdChzdHJbMF0pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGVycm5vID0gMDsKKworICBjaGFyKiBlbmQ7CisgIC8vIEJpZ2dlc3RDb252ZXJ0aWJsZSBpcyB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHR5cGUgdGhhdCBzeXN0ZW0tcHJvdmlkZWQKKyAgLy8gc3RyaW5nLXRvLW51bWJlciBjb252ZXJzaW9uIHJvdXRpbmVzIGNhbiByZXR1cm4uCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhZGVmaW5lZChfX0dOVUNfXykKKworICAvLyBNU1ZDIGFuZCBDKysgQnVpbGRlciBkZWZpbmUgX19pbnQ2NCBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBsb25nIGxvbmcuCisgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBCaWdnZXN0Q29udmVydGlibGU7CisgIGNvbnN0IEJpZ2dlc3RDb252ZXJ0aWJsZSBwYXJzZWQgPSBfc3RydG91aTY0KHN0ci5jX3N0cigpLCAmZW5kLCAxMCk7CisKKyMgZWxzZQorCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIEJpZ2dlc3RDb252ZXJ0aWJsZTsgIC8vIE5PTElOVAorICBjb25zdCBCaWdnZXN0Q29udmVydGlibGUgcGFyc2VkID0gc3RydG91bGwoc3RyLmNfc3RyKCksICZlbmQsIDEwKTsKKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhZGVmaW5lZChfX0dOVUNfXykKKworICBjb25zdCBib29sIHBhcnNlX3N1Y2Nlc3MgPSAqZW5kID09ICdcMCcgJiYgZXJybm8gPT0gMDsKKworICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBDb252ZXJ0IHRoaXMgdG8gY29tcGlsZSB0aW1lIGFzc2VydGlvbiB3aGVuIGl0IGlzCisgIC8vIGF2YWlsYWJsZS4KKyAgR1RFU1RfQ0hFQ0tfKHNpemVvZihJbnRlZ2VyKSA8PSBzaXplb2YocGFyc2VkKSk7CisKKyAgY29uc3QgSW50ZWdlciByZXN1bHQgPSBzdGF0aWNfY2FzdDxJbnRlZ2VyPihwYXJzZWQpOworICBpZiAocGFyc2Vfc3VjY2VzcyAmJiBzdGF0aWNfY2FzdDxCaWdnZXN0Q29udmVydGlibGU+KHJlc3VsdCkgPT0gcGFyc2VkKSB7CisgICAgKm51bWJlciA9IHJlc3VsdDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFRlc3RSZXN1bHQgY29udGFpbnMgc29tZSBwcml2YXRlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20KKy8vIEdvb2dsZSBUZXN0IHVzZXIgYnV0IGFyZSByZXF1aXJlZCBmb3IgdGVzdGluZy4gVGhpcyBjbGFzcyBhbGxvdyBvdXIgdGVzdHMKKy8vIHRvIGFjY2VzcyB0aGVtLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgc3VwcGxpZWQgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93bgorLy8gY29uc3RydWN0cy4gRG8gbm90IHVzZSBpdCBpbiB1c2VyIHRlc3RzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KK2NsYXNzIFRlc3RSZXN1bHRBY2Nlc3NvciB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShUZXN0UmVzdWx0KiB0ZXN0X3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5KSB7CisgICAgdGVzdF9yZXN1bHQtPlJlY29yZFByb3BlcnR5KHhtbF9lbGVtZW50LCBwcm9wZXJ0eSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBDbGVhclRlc3RQYXJ0UmVzdWx0cyhUZXN0UmVzdWx0KiB0ZXN0X3Jlc3VsdCkgeworICAgIHRlc3RfcmVzdWx0LT5DbGVhclRlc3RQYXJ0UmVzdWx0cygpOworICB9CisKKyAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0PiYgdGVzdF9wYXJ0X3Jlc3VsdHMoCisgICAgICBjb25zdCBUZXN0UmVzdWx0JiB0ZXN0X3Jlc3VsdCkgeworICAgIHJldHVybiB0ZXN0X3Jlc3VsdC50ZXN0X3BhcnRfcmVzdWx0cygpOworICB9Cit9OworCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworCisvLyBTdHJlYW1zIHRlc3QgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gcG9ydCBvbiB0aGUgZ2l2ZW4gaG9zdCBtYWNoaW5lLgorY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICAvLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB3cml0aW5nIHN0cmluZ3MgdG8gYSBzb2NrZXQuCisgIGNsYXNzIEFic3RyYWN0U29ja2V0V3JpdGVyIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5BYnN0cmFjdFNvY2tldFdyaXRlcigpIHt9CisKKyAgICAvLyBTZW5kcyBhIHN0cmluZyB0byB0aGUgc29ja2V0LgorICAgIHZpcnR1YWwgdm9pZCBTZW5kKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgPSAwOworCisgICAgLy8gQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAgdmlydHVhbCB2b2lkIENsb3NlQ29ubmVjdGlvbigpIHt9CisKKyAgICAvLyBTZW5kcyBhIHN0cmluZyBhbmQgYSBuZXdsaW5lIHRvIHRoZSBzb2NrZXQuCisgICAgdm9pZCBTZW5kTG4oY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgICBTZW5kKG1lc3NhZ2UgKyAiXG4iKTsKKyAgICB9CisgIH07CisKKyAgLy8gQ29uY3JldGUgY2xhc3MgZm9yIGFjdHVhbGx5IHdyaXRpbmcgc3RyaW5ncyB0byBhIHNvY2tldC4KKyAgY2xhc3MgU29ja2V0V3JpdGVyIDogcHVibGljIEFic3RyYWN0U29ja2V0V3JpdGVyIHsKKyAgIHB1YmxpYzoKKyAgICBTb2NrZXRXcml0ZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBzdHJpbmcmIHBvcnQpCisgICAgICAgIDogc29ja2ZkXygtMSksIGhvc3RfbmFtZV8oaG9zdCksIHBvcnRfbnVtXyhwb3J0KSB7CisgICAgICBNYWtlQ29ubmVjdGlvbigpOworICAgIH0KKworICAgIHZpcnR1YWwgflNvY2tldFdyaXRlcigpIHsKKyAgICAgIGlmIChzb2NrZmRfICE9IC0xKQorICAgICAgICBDbG9zZUNvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICAvLyBTZW5kcyBhIHN0cmluZyB0byB0aGUgc29ja2V0LgorICAgIHZpcnR1YWwgdm9pZCBTZW5kKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgICAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gIT0gLTEpCisgICAgICAgICAgPDwgIlNlbmQoKSBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uIjsKKworICAgICAgY29uc3QgaW50IGxlbiA9IHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5sZW5ndGgoKSk7CisgICAgICBpZiAod3JpdGUoc29ja2ZkXywgbWVzc2FnZS5jX3N0cigpLCBsZW4pICE9IGxlbikgeworICAgICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpCisgICAgICAgICAgICA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIHN0cmVhbSB0byAiCisgICAgICAgICAgICA8PCBob3N0X25hbWVfIDw8ICI6IiA8PCBwb3J0X251bV87CisgICAgICB9CisgICAgfQorCisgICBwcml2YXRlOgorICAgIC8vIENyZWF0ZXMgYSBjbGllbnQgc29ja2V0IGFuZCBjb25uZWN0cyB0byB0aGUgc2VydmVyLgorICAgIHZvaWQgTWFrZUNvbm5lY3Rpb24oKTsKKworICAgIC8vIENsb3NlcyB0aGUgc29ja2V0LgorICAgIHZvaWQgQ2xvc2VDb25uZWN0aW9uKCkgeworICAgICAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gIT0gLTEpCisgICAgICAgICAgPDwgIkNsb3NlQ29ubmVjdGlvbigpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOworCisgICAgICBjbG9zZShzb2NrZmRfKTsKKyAgICAgIHNvY2tmZF8gPSAtMTsKKyAgICB9CisKKyAgICBpbnQgc29ja2ZkXzsgIC8vIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgICBjb25zdCBzdHJpbmcgaG9zdF9uYW1lXzsKKyAgICBjb25zdCBzdHJpbmcgcG9ydF9udW1fOworCisgICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTb2NrZXRXcml0ZXIpOworICB9OyAgLy8gY2xhc3MgU29ja2V0V3JpdGVyCisKKyAgLy8gRXNjYXBlcyAnPScsICcmJywgJyUnLCBhbmQgJ1xuJyBjaGFyYWN0ZXJzIGluIHN0ciBhcyAiJXh4Ii4KKyAgc3RhdGljIHN0cmluZyBVcmxFbmNvZGUoY29uc3QgY2hhciogc3RyKTsKKworICBTdHJlYW1pbmdMaXN0ZW5lcihjb25zdCBzdHJpbmcmIGhvc3QsIGNvbnN0IHN0cmluZyYgcG9ydCkKKyAgICAgIDogc29ja2V0X3dyaXRlcl8obmV3IFNvY2tldFdyaXRlcihob3N0LCBwb3J0KSkgeyBTdGFydCgpOyB9CisKKyAgZXhwbGljaXQgU3RyZWFtaW5nTGlzdGVuZXIoQWJzdHJhY3RTb2NrZXRXcml0ZXIqIHNvY2tldF93cml0ZXIpCisgICAgICA6IHNvY2tldF93cml0ZXJfKHNvY2tldF93cml0ZXIpIHsgU3RhcnQoKTsgfQorCisgIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8pIHsKKyAgICBTZW5kTG4oImV2ZW50PVRlc3RQcm9ncmFtU3RhcnQiKTsKKyAgfQorCisgIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7CisgICAgLy8gTm90ZSB0aGF0IEdvb2dsZSBUZXN0IGN1cnJlbnQgb25seSByZXBvcnQgZWxhcHNlZCB0aW1lIGZvciBlYWNoCisgICAgLy8gdGVzdCBpdGVyYXRpb24sIG5vdCBmb3IgdGhlIGVudGlyZSB0ZXN0IHByb2dyYW0uCisgICAgU2VuZExuKCJldmVudD1UZXN0UHJvZ3JhbUVuZCZwYXNzZWQ9IiArIEZvcm1hdEJvb2wodW5pdF90ZXN0LlBhc3NlZCgpKSk7CisKKyAgICAvLyBOb3RpZnkgdGhlIHN0cmVhbWluZyBzZXJ2ZXIgdG8gc3RvcC4KKyAgICBzb2NrZXRfd3JpdGVyXy0+Q2xvc2VDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8sIGludCBpdGVyYXRpb24pIHsKKyAgICBTZW5kTG4oImV2ZW50PVRlc3RJdGVyYXRpb25TdGFydCZpdGVyYXRpb249IiArCisgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhpdGVyYXRpb24pKTsKKyAgfQorCisgIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCAvKiBpdGVyYXRpb24gKi8pIHsKKyAgICBTZW5kTG4oImV2ZW50PVRlc3RJdGVyYXRpb25FbmQmcGFzc2VkPSIgKworICAgICAgICAgICBGb3JtYXRCb29sKHVuaXRfdGVzdC5QYXNzZWQoKSkgKyAiJmVsYXBzZWRfdGltZT0iICsKKyAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkgKyAibXMiKTsKKyAgfQorCisgIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgICBTZW5kTG4oc3RkOjpzdHJpbmcoImV2ZW50PVRlc3RDYXNlU3RhcnQmbmFtZT0iKSArIHRlc3RfY2FzZS5uYW1lKCkpOworICB9CisKKyAgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgICBTZW5kTG4oImV2ZW50PVRlc3RDYXNlRW5kJnBhc3NlZD0iICsgRm9ybWF0Qm9vbCh0ZXN0X2Nhc2UuUGFzc2VkKCkpCisgICAgICAgICAgICsgIiZlbGFwc2VkX3RpbWU9IiArIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpCisgICAgICAgICAgICsgIm1zIik7CisgIH0KKworICB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgICBTZW5kTG4oc3RkOjpzdHJpbmcoImV2ZW50PVRlc3RTdGFydCZuYW1lPSIpICsgdGVzdF9pbmZvLm5hbWUoKSk7CisgIH0KKworICB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgU2VuZExuKCJldmVudD1UZXN0RW5kJnBhc3NlZD0iICsKKyAgICAgICAgICAgRm9ybWF0Qm9vbCgodGVzdF9pbmZvLnJlc3VsdCgpKS0+UGFzc2VkKCkpICsKKyAgICAgICAgICAgIiZlbGFwc2VkX3RpbWU9IiArCisgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZygodGVzdF9pbmZvLnJlc3VsdCgpKS0+ZWxhcHNlZF90aW1lKCkpICsgIm1zIik7CisgIH0KKworICB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUgPSB0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpOworICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCkKKyAgICAgIGZpbGVfbmFtZSA9ICIiOworICAgIFNlbmRMbigiZXZlbnQ9VGVzdFBhcnRSZXN1bHQmZmlsZT0iICsgVXJsRW5jb2RlKGZpbGVfbmFtZSkgKworICAgICAgICAgICAiJmxpbmU9IiArIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpICsKKyAgICAgICAgICAgIiZtZXNzYWdlPSIgKyBVcmxFbmNvZGUodGVzdF9wYXJ0X3Jlc3VsdC5tZXNzYWdlKCkpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gU2VuZHMgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGEgbmV3bGluZSB0byB0aGUgc29ja2V0LgorICB2b2lkIFNlbmRMbihjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsgc29ja2V0X3dyaXRlcl8tPlNlbmRMbihtZXNzYWdlKTsgfQorCisgIC8vIENhbGxlZCBhdCB0aGUgc3RhcnQgb2Ygc3RyZWFtaW5nIHRvIG5vdGlmeSB0aGUgcmVjZWl2ZXIgd2hhdAorICAvLyBwcm90b2NvbCB3ZSBhcmUgdXNpbmcuCisgIHZvaWQgU3RhcnQoKSB7IFNlbmRMbigiZ3Rlc3Rfc3RyZWFtaW5nX3Byb3RvY29sX3ZlcnNpb249MS4wIik7IH0KKworICBzdHJpbmcgRm9ybWF0Qm9vbChib29sIHZhbHVlKSB7IHJldHVybiB2YWx1ZSA/ICIxIiA6ICIwIjsgfQorCisgIGNvbnN0IHNjb3BlZF9wdHI8QWJzdHJhY3RTb2NrZXRXcml0ZXI+IHNvY2tldF93cml0ZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyZWFtaW5nTGlzdGVuZXIpOworfTsgIC8vIGNsYXNzIFN0cmVhbWluZ0xpc3RlbmVyCisKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDJjNDEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LXBvcnQuY2MKQEAgLTAsMCArMSwxMjIxIEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGluY2x1ZGUgPGlvLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjIGluY2x1ZGUgPG1hcD4gIC8vIFVzZWQgaW4gVGhyZWFkTG9jYWwuCisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjaWYgR1RFU1RfT1NfTUFDCisjIGluY2x1ZGUgPG1hY2gvbWFjaF9pbml0Lmg+CisjIGluY2x1ZGUgPG1hY2gvdGFzay5oPgorIyBpbmNsdWRlIDxtYWNoL3ZtX21hcC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19NQUMKKworI2lmIEdURVNUX09TX1FOWAorIyBpbmNsdWRlIDxkZXZjdGwuaD4KKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyMgaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19RTlgKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGV4aXN0cyB0bworLy8gcHJldmVudCB0aGUgYWNjaWRlbnRhbCBpbmNsdXNpb24gb2YgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4gdGhlCisvLyB1c2VyJ3MgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIE1TVkMgYW5kIEMrK0J1aWxkZXIgZG8gbm90IHByb3ZpZGUgYSBkZWZpbml0aW9uIG9mIFNUREVSUl9GSUxFTk8uCitjb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IDE7Citjb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IDI7CisjZWxzZQorY29uc3QgaW50IGtTdGRPdXRGaWxlbm8gPSBTVERPVVRfRklMRU5POworY29uc3QgaW50IGtTdGRFcnJGaWxlbm8gPSBTVERFUlJfRklMRU5POworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWYgR1RFU1RfT1NfTElOVVgKKworbmFtZXNwYWNlIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBSZWFkUHJvY0ZpbGVGaWVsZChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgZmllbGQpIHsKKyAgc3RkOjpzdHJpbmcgZHVtbXk7CisgIHN0ZDo6aWZzdHJlYW0gZmlsZShmaWxlbmFtZS5jX3N0cigpKTsKKyAgd2hpbGUgKGZpZWxkLS0gPiAwKSB7CisgICAgZmlsZSA+PiBkdW1teTsKKyAgfQorICBUIG91dHB1dCA9IDA7CisgIGZpbGUgPj4gb3V0cHV0OworICByZXR1cm4gb3V0cHV0OworfQorfSAgLy8gbmFtZXNwYWNlCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywgb3IgMCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLgorc2l6ZV90IEdldFRocmVhZENvdW50KCkgeworICBjb25zdCBzdHJpbmcgZmlsZW5hbWUgPQorICAgICAgKE1lc3NhZ2UoKSA8PCAiL3Byb2MvIiA8PCBnZXRwaWQoKSA8PCAiL3N0YXQiKS5HZXRTdHJpbmcoKTsKKyAgcmV0dXJuIFJlYWRQcm9jRmlsZUZpZWxkPGludD4oZmlsZW5hbWUsIDE5KTsKK30KKworI2VsaWYgR1RFU1RfT1NfTUFDCisKK3NpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKKyAgY29uc3QgdGFza190IHRhc2sgPSBtYWNoX3Rhc2tfc2VsZigpOworICBtYWNoX21zZ190eXBlX251bWJlcl90IHRocmVhZF9jb3VudDsKKyAgdGhyZWFkX2FjdF9hcnJheV90IHRocmVhZF9saXN0OworICBjb25zdCBrZXJuX3JldHVybl90IHN0YXR1cyA9IHRhc2tfdGhyZWFkcyh0YXNrLCAmdGhyZWFkX2xpc3QsICZ0aHJlYWRfY291bnQpOworICBpZiAoc3RhdHVzID09IEtFUk5fU1VDQ0VTUykgeworICAgIC8vIHRhc2tfdGhyZWFkcyBhbGxvY2F0ZXMgcmVzb3VyY2VzIGluIHRocmVhZF9saXN0IGFuZCB3ZSBuZWVkIHRvIGZyZWUgdGhlbQorICAgIC8vIHRvIGF2b2lkIGxlYWtzLgorICAgIHZtX2RlYWxsb2NhdGUodGFzaywKKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm1fYWRkcmVzc190Pih0aHJlYWRfbGlzdCksCisgICAgICAgICAgICAgICAgICBzaXplb2YodGhyZWFkX3QpICogdGhyZWFkX2NvdW50KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0aHJlYWRfY291bnQpOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKKyNlbGlmIEdURVNUX09TX1FOWAorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBydW5uaW5nIGluIHRoZSBwcm9jZXNzLCBvciAwIHRvIGluZGljYXRlIHRoYXQKKy8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuCitzaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7CisgIGNvbnN0IGludCBmZCA9IG9wZW4oIi9wcm9jL3NlbGYvYXMiLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwcm9jZnNfaW5mbyBwcm9jZXNzX2luZm87CisgIGNvbnN0IGludCBzdGF0dXMgPQorICAgICAgZGV2Y3RsKGZkLCBEQ01EX1BST0NfSU5GTywgJnByb2Nlc3NfaW5mbywgc2l6ZW9mKHByb2Nlc3NfaW5mbyksIE5VTEwpOworICBjbG9zZShmZCk7CisgIGlmIChzdGF0dXMgPT0gRU9LKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4ocHJvY2Vzc19pbmZvLm51bV90aHJlYWRzKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisjZWxzZQorCitzaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7CisgIC8vIFRoZXJlJ3Mgbm8gcG9ydGFibGUgd2F5IHRvIGRldGVjdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMsIHNvIHdlIGp1c3QKKyAgLy8gcmV0dXJuIDAgdG8gaW5kaWNhdGUgdGhhdCB3ZSBjYW5ub3QgZGV0ZWN0IGl0LgorICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRSAmJiBHVEVTVF9PU19XSU5ET1dTCisKK3ZvaWQgU2xlZXBNaWxsaXNlY29uZHMoaW50IG4pIHsKKyAgOjpTbGVlcChuKTsKK30KKworQXV0b0hhbmRsZTo6QXV0b0hhbmRsZSgpCisgICAgOiBoYW5kbGVfKElOVkFMSURfSEFORExFX1ZBTFVFKSB7fQorCitBdXRvSGFuZGxlOjpBdXRvSGFuZGxlKEhhbmRsZSBoYW5kbGUpCisgICAgOiBoYW5kbGVfKGhhbmRsZSkge30KKworQXV0b0hhbmRsZTo6fkF1dG9IYW5kbGUoKSB7CisgIFJlc2V0KCk7Cit9CisKK0F1dG9IYW5kbGU6OkhhbmRsZSBBdXRvSGFuZGxlOjpHZXQoKSBjb25zdCB7CisgIHJldHVybiBoYW5kbGVfOworfQorCit2b2lkIEF1dG9IYW5kbGU6OlJlc2V0KCkgeworICBSZXNldChJTlZBTElEX0hBTkRMRV9WQUxVRSk7Cit9CisKK3ZvaWQgQXV0b0hhbmRsZTo6UmVzZXQoSEFORExFIGhhbmRsZSkgeworICAvLyBSZXNldHRpbmcgd2l0aCB0aGUgc2FtZSBoYW5kbGUgd2UgYWxyZWFkeSBvd24gaXMgaW52YWxpZC4KKyAgaWYgKGhhbmRsZV8gIT0gaGFuZGxlKSB7CisgICAgaWYgKElzQ2xvc2VhYmxlKCkpIHsKKyAgICAgIDo6Q2xvc2VIYW5kbGUoaGFuZGxlXyk7CisgICAgfQorICAgIGhhbmRsZV8gPSBoYW5kbGU7CisgIH0gZWxzZSB7CisgICAgR1RFU1RfQ0hFQ0tfKCFJc0Nsb3NlYWJsZSgpKQorICAgICAgICA8PCAiUmVzZXR0aW5nIGEgdmFsaWQgaGFuZGxlIHRvIGl0c2VsZiBpcyBsaWtlbHkgYSBwcm9ncmFtbWVyIGVycm9yICIKKyAgICAgICAgICAgICJhbmQgdGh1cyBub3QgYWxsb3dlZC4iOworICB9Cit9CisKK2Jvb2wgQXV0b0hhbmRsZTo6SXNDbG9zZWFibGUoKSBjb25zdCB7CisgIC8vIERpZmZlcmVudCBXaW5kb3dzIEFQSXMgbWF5IHVzZSBlaXRoZXIgb2YgdGhlc2UgdmFsdWVzIHRvIHJlcHJlc2VudCBhbgorICAvLyBpbnZhbGlkIGhhbmRsZS4KKyAgcmV0dXJuIGhhbmRsZV8gIT0gTlVMTCAmJiBoYW5kbGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCitOb3RpZmljYXRpb246Ok5vdGlmaWNhdGlvbigpCisgICAgOiBldmVudF8oOjpDcmVhdGVFdmVudChOVUxMLCAgIC8vIERlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsICAgLy8gRG8gbm90IHJlc2V0IGF1dG9tYXRpY2FsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIEluaXRpYWxseSB1bnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7ICAvLyBBbm9ueW1vdXMgZXZlbnQuCisgIEdURVNUX0NIRUNLXyhldmVudF8uR2V0KCkgIT0gTlVMTCk7Cit9CisKK3ZvaWQgTm90aWZpY2F0aW9uOjpOb3RpZnkoKSB7CisgIEdURVNUX0NIRUNLXyg6OlNldEV2ZW50KGV2ZW50Xy5HZXQoKSkgIT0gRkFMU0UpOworfQorCit2b2lkIE5vdGlmaWNhdGlvbjo6V2FpdEZvck5vdGlmaWNhdGlvbigpIHsKKyAgR1RFU1RfQ0hFQ0tfKAorICAgICAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGV2ZW50Xy5HZXQoKSwgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApOworfQorCitNdXRleDo6TXV0ZXgoKQorICAgIDogb3duZXJfdGhyZWFkX2lkXygwKSwKKyAgICAgIHR5cGVfKGtEeW5hbWljKSwKKyAgICAgIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8oMCksCisgICAgICBjcml0aWNhbF9zZWN0aW9uXyhuZXcgQ1JJVElDQUxfU0VDVElPTikgeworICA6OkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oY3JpdGljYWxfc2VjdGlvbl8pOworfQorCitNdXRleDo6fk11dGV4KCkgeworICAvLyBTdGF0aWMgbXV0ZXhlcyBhcmUgbGVha2VkIGludGVudGlvbmFsbHkuIEl0IGlzIG5vdCB0aHJlYWQtc2FmZSB0byB0cnkKKyAgLy8gdG8gY2xlYW4gdGhlbSB1cC4KKyAgLy8gVE9ETyh5dWthd2EpOiBTd2l0Y2ggdG8gU2xpbSBSZWFkZXIvV3JpdGVyIChTUlcpIExvY2tzLCB3aGljaCByZXF1aXJlcworICAvLyBub3RoaW5nIHRvIGNsZWFuIGl0IHVwIGJ1dCBpcyBhdmFpbGFibGUgb25seSBvbiBWaXN0YSBhbmQgbGF0ZXIuCisgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvYWE5MDQ5MzcuYXNweAorICBpZiAodHlwZV8gPT0ga0R5bmFtaWMpIHsKKyAgICA6OkRlbGV0ZUNyaXRpY2FsU2VjdGlvbihjcml0aWNhbF9zZWN0aW9uXyk7CisgICAgZGVsZXRlIGNyaXRpY2FsX3NlY3Rpb25fOworICAgIGNyaXRpY2FsX3NlY3Rpb25fID0gTlVMTDsKKyAgfQorfQorCit2b2lkIE11dGV4OjpMb2NrKCkgeworICBUaHJlYWRTYWZlTGF6eUluaXQoKTsKKyAgOjpFbnRlckNyaXRpY2FsU2VjdGlvbihjcml0aWNhbF9zZWN0aW9uXyk7CisgIG93bmVyX3RocmVhZF9pZF8gPSA6OkdldEN1cnJlbnRUaHJlYWRJZCgpOworfQorCit2b2lkIE11dGV4OjpVbmxvY2soKSB7CisgIFRocmVhZFNhZmVMYXp5SW5pdCgpOworICAvLyBXZSBkb24ndCBwcm90ZWN0IHdyaXRpbmcgdG8gb3duZXJfdGhyZWFkX2lkXyBoZXJlLCBhcyBpdCdzIHRoZQorICAvLyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCisgIC8vIG11dGV4IHdoZW4gdGhpcyBpcyBjYWxsZWQuCisgIG93bmVyX3RocmVhZF9pZF8gPSAwOworICA6OkxlYXZlQ3JpdGljYWxTZWN0aW9uKGNyaXRpY2FsX3NlY3Rpb25fKTsKK30KKworLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcworLy8gd2l0aCBoaWdoIHByb2JhYmlsaXR5Lgordm9pZCBNdXRleDo6QXNzZXJ0SGVsZCgpIHsKKyAgVGhyZWFkU2FmZUxhenlJbml0KCk7CisgIEdURVNUX0NIRUNLXyhvd25lcl90aHJlYWRfaWRfID09IDo6R2V0Q3VycmVudFRocmVhZElkKCkpCisgICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOworfQorCisvLyBJbml0aWFsaXplcyBvd25lcl90aHJlYWRfaWRfIGFuZCBjcml0aWNhbF9zZWN0aW9uXyBpbiBzdGF0aWMgbXV0ZXhlcy4KK3ZvaWQgTXV0ZXg6OlRocmVhZFNhZmVMYXp5SW5pdCgpIHsKKyAgLy8gRHluYW1pYyBtdXRleGVzIGFyZSBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3IuCisgIGlmICh0eXBlXyA9PSBrU3RhdGljKSB7CisgICAgc3dpdGNoICgKKyAgICAgICAgOjpJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgmY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXywgMUwsIDBMKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICAvLyBJZiBjcml0aWNhbF9zZWN0aW9uX2luaXRfcGhhc2VfIHdhcyAwIGJlZm9yZSB0aGUgZXhjaGFuZ2UsIHdlCisgICAgICAgIC8vIGFyZSB0aGUgZmlyc3QgdG8gdGVzdCBpdCBhbmQgbmVlZCB0byBwZXJmb3JtIHRoZSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgb3duZXJfdGhyZWFkX2lkXyA9IDA7CisgICAgICAgIGNyaXRpY2FsX3NlY3Rpb25fID0gbmV3IENSSVRJQ0FMX1NFQ1RJT047CisgICAgICAgIDo6SW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcml0aWNhbF9zZWN0aW9uXyk7CisgICAgICAgIC8vIFVwZGF0ZXMgdGhlIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8gdG8gMiB0byBzaWduYWwKKyAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gY29tcGxldGUuCisgICAgICAgIEdURVNUX0NIRUNLXyg6OkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXywgMkwsIDFMKSA9PQorICAgICAgICAgICAgICAgICAgICAgIDFMKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIC8vIFNvbWVib2R5IGVsc2UgaXMgYWxyZWFkeSBpbml0aWFsaXppbmcgdGhlIG11dGV4OyBzcGluIHVudGlsIHRoZXkKKyAgICAgICAgLy8gYXJlIGRvbmUuCisgICAgICAgIHdoaWxlICg6OkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZjcml0aWNhbF9zZWN0aW9uX2luaXRfcGhhc2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMkwpICE9IDJMKSB7CisgICAgICAgICAgLy8gUG9zc2libHkgeWllbGRzIHRoZSByZXN0IG9mIHRoZSB0aHJlYWQncyB0aW1lIHNsaWNlIHRvIG90aGVyCisgICAgICAgICAgLy8gdGhyZWFkcy4KKyAgICAgICAgICA6OlNsZWVwKDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI6CisgICAgICAgIGJyZWFrOyAgLy8gVGhlIG11dGV4IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UuCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdURVNUX0NIRUNLXyhmYWxzZSkKKyAgICAgICAgICAgIDw8ICJVbmV4cGVjdGVkIHZhbHVlIG9mIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8gIgorICAgICAgICAgICAgPDwgIndoaWxlIGluaXRpYWxpemluZyBhIHN0YXRpYyBtdXRleC4iOworICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgeworCitjbGFzcyBUaHJlYWRXaXRoUGFyYW1TdXBwb3J0IDogcHVibGljIFRocmVhZFdpdGhQYXJhbUJhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEhBTkRMRSBDcmVhdGVUaHJlYWQoUnVubmFibGUqIHJ1bm5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpIHsKKyAgICBUaHJlYWRNYWluUGFyYW0qIHBhcmFtID0gbmV3IFRocmVhZE1haW5QYXJhbShydW5uYWJsZSwgdGhyZWFkX2Nhbl9zdGFydCk7CisgICAgRFdPUkQgdGhyZWFkX2lkOworICAgIC8vIFRPRE8oeXVrYXdhKTogQ29uc2lkZXIgdG8gdXNlIF9iZWdpbnRocmVhZGV4IGluc3RlYWQuCisgICAgSEFORExFIHRocmVhZF9oYW5kbGUgPSA6OkNyZWF0ZVRocmVhZCgKKyAgICAgICAgTlVMTCwgICAgLy8gRGVmYXVsdCBzZWN1cml0eS4KKyAgICAgICAgMCwgICAgICAgLy8gRGVmYXVsdCBzdGFjayBzaXplLgorICAgICAgICAmVGhyZWFkV2l0aFBhcmFtU3VwcG9ydDo6VGhyZWFkTWFpbiwKKyAgICAgICAgcGFyYW0sICAgLy8gUGFyYW1ldGVyIHRvIFRocmVhZE1haW5TdGF0aWMKKyAgICAgICAgMHgwLCAgICAgLy8gRGVmYXVsdCBjcmVhdGlvbiBmbGFncy4KKyAgICAgICAgJnRocmVhZF9pZCk7ICAvLyBOZWVkIGEgdmFsaWQgcG9pbnRlciBmb3IgdGhlIGNhbGwgdG8gd29yayB1bmRlciBXaW45OC4KKyAgICBHVEVTVF9DSEVDS18odGhyZWFkX2hhbmRsZSAhPSBOVUxMKSA8PCAiQ3JlYXRlVGhyZWFkIGZhaWxlZCB3aXRoIGVycm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA6OkdldExhc3RFcnJvcigpIDw8ICIuIjsKKyAgICBpZiAodGhyZWFkX2hhbmRsZSA9PSBOVUxMKSB7CisgICAgICBkZWxldGUgcGFyYW07CisgICAgfQorICAgIHJldHVybiB0aHJlYWRfaGFuZGxlOworICB9CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgVGhyZWFkTWFpblBhcmFtIHsKKyAgICBUaHJlYWRNYWluUGFyYW0oUnVubmFibGUqIHJ1bm5hYmxlLCBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpCisgICAgICAgIDogcnVubmFibGVfKHJ1bm5hYmxlKSwKKyAgICAgICAgICB0aHJlYWRfY2FuX3N0YXJ0Xyh0aHJlYWRfY2FuX3N0YXJ0KSB7CisgICAgfQorICAgIHNjb3BlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKKyAgICAvLyBEb2VzIG5vdCBvd24uCisgICAgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0XzsKKyAgfTsKKworICBzdGF0aWMgRFdPUkQgV0lOQVBJIFRocmVhZE1haW4odm9pZCogcHRyKSB7CisgICAgLy8gVHJhbnNmZXJzIG93bmVyc2hpcC4KKyAgICBzY29wZWRfcHRyPFRocmVhZE1haW5QYXJhbT4gcGFyYW0oc3RhdGljX2Nhc3Q8VGhyZWFkTWFpblBhcmFtKj4ocHRyKSk7CisgICAgaWYgKHBhcmFtLT50aHJlYWRfY2FuX3N0YXJ0XyAhPSBOVUxMKQorICAgICAgcGFyYW0tPnRocmVhZF9jYW5fc3RhcnRfLT5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7CisgICAgcGFyYW0tPnJ1bm5hYmxlXy0+UnVuKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBQcm9oaWJpdCBpbnN0YW50aWF0aW9uLgorICBUaHJlYWRXaXRoUGFyYW1TdXBwb3J0KCk7CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRXaXRoUGFyYW1TdXBwb3J0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitUaHJlYWRXaXRoUGFyYW1CYXNlOjpUaHJlYWRXaXRoUGFyYW1CYXNlKFJ1bm5hYmxlICpydW5uYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KQorICAgICAgOiB0aHJlYWRfKFRocmVhZFdpdGhQYXJhbVN1cHBvcnQ6OkNyZWF0ZVRocmVhZChydW5uYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2Nhbl9zdGFydCkpIHsKK30KKworVGhyZWFkV2l0aFBhcmFtQmFzZTo6flRocmVhZFdpdGhQYXJhbUJhc2UoKSB7CisgIEpvaW4oKTsKK30KKwordm9pZCBUaHJlYWRXaXRoUGFyYW1CYXNlOjpKb2luKCkgeworICBHVEVTVF9DSEVDS18oOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZF8uR2V0KCksIElORklOSVRFKSA9PSBXQUlUX09CSkVDVF8wKQorICAgICAgPDwgIkZhaWxlZCB0byBqb2luIHRoZSB0aHJlYWQgd2l0aCBlcnJvciAiIDw8IDo6R2V0TGFzdEVycm9yKCkgPDwgIi4iOworfQorCisvLyBNYXBzIGEgdGhyZWFkIHRvIGEgc2V0IG9mIFRocmVhZElkVG9UaHJlYWRMb2NhbHMgdGhhdCBoYXZlIHZhbHVlcworLy8gaW5zdGFudGlhdGVkIG9uIHRoYXQgdGhyZWFkIGFuZCBub3RpZmllcyB0aGVtIHdoZW4gdGhlIHRocmVhZCBleGl0cy4gIEEKKy8vIFRocmVhZExvY2FsIGluc3RhbmNlIGlzIGV4cGVjdGVkIHRvIHBlcnNpc3QgdW50aWwgYWxsIHRocmVhZHMgaXQgaGFzCisvLyB2YWx1ZXMgb24gaGF2ZSB0ZXJtaW5hdGVkLgorY2xhc3MgVGhyZWFkTG9jYWxSZWdpc3RyeUltcGwgeworIHB1YmxpYzoKKyAgLy8gUmVnaXN0ZXJzIHRocmVhZF9sb2NhbF9pbnN0YW5jZSBhcyBoYXZpbmcgdmFsdWUgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAvLyBSZXR1cm5zIGEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgdGhyZWFkIGZyb20gb3RoZXIgdGhyZWFkcy4KKyAgc3RhdGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKKyAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKSB7CisgICAgRFdPUkQgY3VycmVudF90aHJlYWQgPSA6OkdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIE11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICAgIFRocmVhZElkVG9UaHJlYWRMb2NhbHMqIGNvbnN0IHRocmVhZF90b190aHJlYWRfbG9jYWxzID0KKyAgICAgICAgR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCk7CisgICAgVGhyZWFkSWRUb1RocmVhZExvY2Fsczo6aXRlcmF0b3IgdGhyZWFkX2xvY2FsX3BvcyA9CisgICAgICAgIHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5maW5kKGN1cnJlbnRfdGhyZWFkKTsKKyAgICBpZiAodGhyZWFkX2xvY2FsX3BvcyA9PSB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZW5kKCkpIHsKKyAgICAgIHRocmVhZF9sb2NhbF9wb3MgPSB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+aW5zZXJ0KAorICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGN1cnJlbnRfdGhyZWFkLCBUaHJlYWRMb2NhbFZhbHVlcygpKSkuZmlyc3Q7CisgICAgICBTdGFydFdhdGNoZXJUaHJlYWRGb3IoY3VycmVudF90aHJlYWQpOworICAgIH0KKyAgICBUaHJlYWRMb2NhbFZhbHVlcyYgdGhyZWFkX2xvY2FsX3ZhbHVlcyA9IHRocmVhZF9sb2NhbF9wb3MtPnNlY29uZDsKKyAgICBUaHJlYWRMb2NhbFZhbHVlczo6aXRlcmF0b3IgdmFsdWVfcG9zID0KKyAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcy5maW5kKHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7CisgICAgaWYgKHZhbHVlX3BvcyA9PSB0aHJlYWRfbG9jYWxfdmFsdWVzLmVuZCgpKSB7CisgICAgICB2YWx1ZV9wb3MgPQorICAgICAgICAgIHRocmVhZF9sb2NhbF92YWx1ZXMKKyAgICAgICAgICAgICAgLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgIHRocmVhZF9sb2NhbF9pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIGxpbmtlZF9wdHI8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2U+KAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9sb2NhbF9pbnN0YW5jZS0+TmV3VmFsdWVGb3JDdXJyZW50VGhyZWFkKCkpKSkKKyAgICAgICAgICAgICAgLmZpcnN0OworICAgIH0KKyAgICByZXR1cm4gdmFsdWVfcG9zLT5zZWNvbmQuZ2V0KCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBPblRocmVhZExvY2FsRGVzdHJveWVkKAorICAgICAgY29uc3QgVGhyZWFkTG9jYWxCYXNlKiB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpIHsKKyAgICBzdGQ6OnZlY3RvcjxsaW5rZWRfcHRyPFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlPiA+IHZhbHVlX2hvbGRlcnM7CisgICAgLy8gQ2xlYW4gdXAgdGhlIFRocmVhZExvY2FsVmFsdWVzIGRhdGEgc3RydWN0dXJlIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2ssIGJ1dAorICAgIC8vIGRlZmVyIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2VzLgorICAgIHsKKyAgICAgIE11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICAgICAgVGhyZWFkSWRUb1RocmVhZExvY2FscyogY29uc3QgdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMgPQorICAgICAgICAgIEdldFRocmVhZExvY2Fsc01hcExvY2tlZCgpOworICAgICAgZm9yIChUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOjppdGVyYXRvciBpdCA9CisgICAgICAgICAgdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMtPmJlZ2luKCk7CisgICAgICAgICAgaXQgIT0gdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMtPmVuZCgpOworICAgICAgICAgICsraXQpIHsKKyAgICAgICAgVGhyZWFkTG9jYWxWYWx1ZXMmIHRocmVhZF9sb2NhbF92YWx1ZXMgPSBpdC0+c2Vjb25kOworICAgICAgICBUaHJlYWRMb2NhbFZhbHVlczo6aXRlcmF0b3IgdmFsdWVfcG9zID0KKyAgICAgICAgICAgIHRocmVhZF9sb2NhbF92YWx1ZXMuZmluZCh0aHJlYWRfbG9jYWxfaW5zdGFuY2UpOworICAgICAgICBpZiAodmFsdWVfcG9zICE9IHRocmVhZF9sb2NhbF92YWx1ZXMuZW5kKCkpIHsKKyAgICAgICAgICB2YWx1ZV9ob2xkZXJzLnB1c2hfYmFjayh2YWx1ZV9wb3MtPnNlY29uZCk7CisgICAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcy5lcmFzZSh2YWx1ZV9wb3MpOworICAgICAgICAgIC8vIFRoaXMgJ2lmJyBjYW4gb25seSBiZSBzdWNjZXNzZnVsIGF0IG1vc3Qgb25jZSwgc28gdGhlb3JldGljYWxseSB3ZQorICAgICAgICAgIC8vIGNvdWxkIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBoZXJlLCBidXQgd2UgZG9uJ3QgYm90aGVyIGRvaW5nIHNvLgorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vIE91dHNpZGUgdGhlIGxvY2ssIGxldCB0aGUgZGVzdHJ1Y3RvciBmb3IgJ3ZhbHVlX2hvbGRlcnMnIGRlYWxsb2NhdGUgdGhlCisgICAgLy8gVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2VzLgorICB9CisKKyAgc3RhdGljIHZvaWQgT25UaHJlYWRFeGl0KERXT1JEIHRocmVhZF9pZCkgeworICAgIEdURVNUX0NIRUNLXyh0aHJlYWRfaWQgIT0gMCkgPDwgOjpHZXRMYXN0RXJyb3IoKTsKKyAgICBzdGQ6OnZlY3RvcjxsaW5rZWRfcHRyPFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlPiA+IHZhbHVlX2hvbGRlcnM7CisgICAgLy8gQ2xlYW4gdXAgdGhlIFRocmVhZElkVG9UaHJlYWRMb2NhbHMgZGF0YSBzdHJ1Y3R1cmUgd2hpbGUgaG9sZGluZyB0aGUKKyAgICAvLyBsb2NrLCBidXQgZGVmZXIgdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZXMuCisgICAgeworICAgICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgICAgICBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzKiBjb25zdCB0aHJlYWRfdG9fdGhyZWFkX2xvY2FscyA9CisgICAgICAgICAgR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCk7CisgICAgICBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOjppdGVyYXRvciB0aHJlYWRfbG9jYWxfcG9zID0KKyAgICAgICAgICB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZmluZCh0aHJlYWRfaWQpOworICAgICAgaWYgKHRocmVhZF9sb2NhbF9wb3MgIT0gdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMtPmVuZCgpKSB7CisgICAgICAgIFRocmVhZExvY2FsVmFsdWVzJiB0aHJlYWRfbG9jYWxfdmFsdWVzID0gdGhyZWFkX2xvY2FsX3Bvcy0+c2Vjb25kOworICAgICAgICBmb3IgKFRocmVhZExvY2FsVmFsdWVzOjppdGVyYXRvciB2YWx1ZV9wb3MgPQorICAgICAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcy5iZWdpbigpOworICAgICAgICAgICAgdmFsdWVfcG9zICE9IHRocmVhZF9sb2NhbF92YWx1ZXMuZW5kKCk7CisgICAgICAgICAgICArK3ZhbHVlX3BvcykgeworICAgICAgICAgIHZhbHVlX2hvbGRlcnMucHVzaF9iYWNrKHZhbHVlX3Bvcy0+c2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZXJhc2UodGhyZWFkX2xvY2FsX3Bvcyk7CisgICAgICB9CisgICAgfQorICAgIC8vIE91dHNpZGUgdGhlIGxvY2ssIGxldCB0aGUgZGVzdHJ1Y3RvciBmb3IgJ3ZhbHVlX2hvbGRlcnMnIGRlYWxsb2NhdGUgdGhlCisgICAgLy8gVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2VzLgorICB9CisKKyBwcml2YXRlOgorICAvLyBJbiBhIHBhcnRpY3VsYXIgdGhyZWFkLCBtYXBzIGEgVGhyZWFkTG9jYWwgb2JqZWN0IHRvIGl0cyB2YWx1ZS4KKyAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBUaHJlYWRMb2NhbEJhc2UqLAorICAgICAgICAgICAgICAgICAgIGxpbmtlZF9wdHI8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2U+ID4gVGhyZWFkTG9jYWxWYWx1ZXM7CisgIC8vIFN0b3JlcyBhbGwgVGhyZWFkSWRUb1RocmVhZExvY2FscyBoYXZpbmcgdmFsdWVzIGluIGEgdGhyZWFkLCBpbmRleGVkIGJ5CisgIC8vIHRocmVhZCdzIElELgorICB0eXBlZGVmIHN0ZDo6bWFwPERXT1JELCBUaHJlYWRMb2NhbFZhbHVlcz4gVGhyZWFkSWRUb1RocmVhZExvY2FsczsKKworICAvLyBIb2xkcyB0aGUgdGhyZWFkIGlkIGFuZCB0aHJlYWQgaGFuZGxlIHRoYXQgd2UgcGFzcyBmcm9tCisgIC8vIFN0YXJ0V2F0Y2hlclRocmVhZEZvciB0byBXYXRjaGVyVGhyZWFkRnVuYy4KKyAgdHlwZWRlZiBzdGQ6OnBhaXI8RFdPUkQsIEhBTkRMRT4gVGhyZWFkSWRBbmRIYW5kbGU7CisKKyAgc3RhdGljIHZvaWQgU3RhcnRXYXRjaGVyVGhyZWFkRm9yKERXT1JEIHRocmVhZF9pZCkgeworICAgIC8vIFRoZSByZXR1cm5lZCBoYW5kbGUgd2lsbCBiZSBrZXB0IGluIHRocmVhZF9tYXAgYW5kIGNsb3NlZCBieQorICAgIC8vIHdhdGNoZXJfdGhyZWFkIGluIFdhdGNoZXJUaHJlYWRGdW5jLgorICAgIEhBTkRMRSB0aHJlYWQgPSA6Ok9wZW5UaHJlYWQoU1lOQ0hST05JWkUgfCBUSFJFQURfUVVFUllfSU5GT1JNQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9pZCk7CisgICAgR1RFU1RfQ0hFQ0tfKHRocmVhZCAhPSBOVUxMKTsKKyAgICAvLyBXZSBuZWVkIHRvIHRvIHBhc3MgYSB2YWxpZCB0aHJlYWQgSUQgcG9pbnRlciBpbnRvIENyZWF0ZVRocmVhZCBmb3IgaXQKKyAgICAvLyB0byB3b3JrIGNvcnJlY3RseSB1bmRlciBXaW45OC4KKyAgICBEV09SRCB3YXRjaGVyX3RocmVhZF9pZDsKKyAgICBIQU5ETEUgd2F0Y2hlcl90aHJlYWQgPSA6OkNyZWF0ZVRocmVhZCgKKyAgICAgICAgTlVMTCwgICAvLyBEZWZhdWx0IHNlY3VyaXR5LgorICAgICAgICAwLCAgICAgIC8vIERlZmF1bHQgc3RhY2sgc2l6ZQorICAgICAgICAmVGhyZWFkTG9jYWxSZWdpc3RyeUltcGw6OldhdGNoZXJUaHJlYWRGdW5jLAorICAgICAgICByZWludGVycHJldF9jYXN0PExQVk9JRD4obmV3IFRocmVhZElkQW5kSGFuZGxlKHRocmVhZF9pZCwgdGhyZWFkKSksCisgICAgICAgIENSRUFURV9TVVNQRU5ERUQsCisgICAgICAgICZ3YXRjaGVyX3RocmVhZF9pZCk7CisgICAgR1RFU1RfQ0hFQ0tfKHdhdGNoZXJfdGhyZWFkICE9IE5VTEwpOworICAgIC8vIEdpdmUgdGhlIHdhdGNoZXIgdGhyZWFkIHRoZSBzYW1lIHByaW9yaXR5IGFzIG91cnMgdG8gYXZvaWQgYmVpbmcKKyAgICAvLyBibG9ja2VkIGJ5IGl0LgorICAgIDo6U2V0VGhyZWFkUHJpb3JpdHkod2F0Y2hlcl90aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICA6OkdldFRocmVhZFByaW9yaXR5KDo6R2V0Q3VycmVudFRocmVhZCgpKSk7CisgICAgOjpSZXN1bWVUaHJlYWQod2F0Y2hlcl90aHJlYWQpOworICAgIDo6Q2xvc2VIYW5kbGUod2F0Y2hlcl90aHJlYWQpOworICB9CisKKyAgLy8gTW9uaXRvcnMgZXhpdCBmcm9tIGEgZ2l2ZW4gdGhyZWFkIGFuZCBub3RpZmllcyB0aG9zZQorICAvLyBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzIGFib3V0IHRocmVhZCB0ZXJtaW5hdGlvbi4KKyAgc3RhdGljIERXT1JEIFdJTkFQSSBXYXRjaGVyVGhyZWFkRnVuYyhMUFZPSUQgcGFyYW0pIHsKKyAgICBjb25zdCBUaHJlYWRJZEFuZEhhbmRsZSogdGFoID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUaHJlYWRJZEFuZEhhbmRsZSo+KHBhcmFtKTsKKyAgICBHVEVTVF9DSEVDS18oCisgICAgICAgIDo6V2FpdEZvclNpbmdsZU9iamVjdCh0YWgtPnNlY29uZCwgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApOworICAgIE9uVGhyZWFkRXhpdCh0YWgtPmZpcnN0KTsKKyAgICA6OkNsb3NlSGFuZGxlKHRhaC0+c2Vjb25kKTsKKyAgICBkZWxldGUgdGFoOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gUmV0dXJucyBtYXAgb2YgdGhyZWFkIGxvY2FsIGluc3RhbmNlcy4KKyAgc3RhdGljIFRocmVhZElkVG9UaHJlYWRMb2NhbHMqIEdldFRocmVhZExvY2Fsc01hcExvY2tlZCgpIHsKKyAgICBtdXRleF8uQXNzZXJ0SGVsZCgpOworICAgIHN0YXRpYyBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzKiBtYXAgPSBuZXcgVGhyZWFkSWRUb1RocmVhZExvY2FsczsKKyAgICByZXR1cm4gbWFwOworICB9CisKKyAgLy8gUHJvdGVjdHMgYWNjZXNzIHRvIEdldFRocmVhZExvY2Fsc01hcExvY2tlZCgpIGFuZCBpdHMgcmV0dXJuIHZhbHVlLgorICBzdGF0aWMgTXV0ZXggbXV0ZXhfOworICAvLyBQcm90ZWN0cyBhY2Nlc3MgdG8gR2V0VGhyZWFkTWFwTG9ja2VkKCkgYW5kIGl0cyByZXR1cm4gdmFsdWUuCisgIHN0YXRpYyBNdXRleCB0aHJlYWRfbWFwX211dGV4XzsKK307CisKK011dGV4IFRocmVhZExvY2FsUmVnaXN0cnlJbXBsOjptdXRleF8oTXV0ZXg6OmtTdGF0aWNNdXRleCk7CitNdXRleCBUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbDo6dGhyZWFkX21hcF9tdXRleF8oTXV0ZXg6OmtTdGF0aWNNdXRleCk7CisKK1RocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBUaHJlYWRMb2NhbFJlZ2lzdHJ5OjpHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKKyAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKSB7CisgIHJldHVybiBUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbDo6R2V0VmFsdWVPbkN1cnJlbnRUaHJlYWQoCisgICAgICB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpOworfQorCit2b2lkIFRocmVhZExvY2FsUmVnaXN0cnk6Ok9uVGhyZWFkTG9jYWxEZXN0cm95ZWQoCisgICAgICBjb25zdCBUaHJlYWRMb2NhbEJhc2UqIHRocmVhZF9sb2NhbF9pbnN0YW5jZSkgeworICBUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbDo6T25UaHJlYWRMb2NhbERlc3Ryb3llZCh0aHJlYWRfbG9jYWxfaW5zdGFuY2UpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUgJiYgR1RFU1RfT1NfV0lORE9XUworCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisvLyBJbXBsZW1lbnRzIFJFLiAgQ3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KKworUkU6On5SRSgpIHsKKyAgaWYgKGlzX3ZhbGlkXykgeworICAgIC8vIHJlZ2ZyZWUnaW5nIGFuIGludmFsaWQgcmVnZXggbWlnaHQgY3Jhc2ggYmVjYXVzZSB0aGUgY29udGVudAorICAgIC8vIG9mIHRoZSByZWdleCBpcyB1bmRlZmluZWQuIFNpbmNlIHRoZSByZWdleCdzIGFyZSBlc3NlbnRpYWxseQorICAgIC8vIHRoZSBzYW1lLCBvbmUgY2Fubm90IGJlIHZhbGlkIChvciBpbnZhbGlkKSB3aXRob3V0IHRoZSBvdGhlcgorICAgIC8vIGJlaW5nIHNvIHRvby4KKyAgICByZWdmcmVlKCZwYXJ0aWFsX3JlZ2V4Xyk7CisgICAgcmVnZnJlZSgmZnVsbF9yZWdleF8pOworICB9CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyB0aGUgZW50aXJlIHN0ci4KK2Jvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOworCisgIHJlZ21hdGNoX3QgbWF0Y2g7CisgIHJldHVybiByZWdleGVjKCZyZS5mdWxsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCisvLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7CisKKyAgcmVnbWF0Y2hfdCBtYXRjaDsKKyAgcmV0dXJuIHJlZ2V4ZWMoJnJlLnBhcnRpYWxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKK30KKworLy8gSW5pdGlhbGl6ZXMgYW4gUkUgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgordm9pZCBSRTo6SW5pdChjb25zdCBjaGFyKiByZWdleCkgeworICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOworCisgIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQorICAvLyBmdWxsIG1hdGNoLgorICBjb25zdCBzaXplX3QgZnVsbF9yZWdleF9sZW4gPSBzdHJsZW4ocmVnZXgpICsgMTA7CisgIGNoYXIqIGNvbnN0IGZ1bGxfcGF0dGVybiA9IG5ldyBjaGFyW2Z1bGxfcmVnZXhfbGVuXTsKKworICBzbnByaW50ZihmdWxsX3BhdHRlcm4sIGZ1bGxfcmVnZXhfbGVuLCAiXiglcykkIiwgcmVnZXgpOworICBpc192YWxpZF8gPSByZWdjb21wKCZmdWxsX3JlZ2V4XywgZnVsbF9wYXR0ZXJuLCBSRUdfRVhURU5ERUQpID09IDA7CisgIC8vIFdlIHdhbnQgdG8gY2FsbCByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgLi4uKSBldmVuIGlmIHRoZQorICAvLyBwcmV2aW91cyBleHByZXNzaW9uIHJldHVybnMgZmFsc2UuICBPdGhlcndpc2UgcGFydGlhbF9yZWdleF8gbWF5CisgIC8vIG5vdCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCBjYW4gbWF5IGNhdXNlIHRyb3VibGUgd2hlbiBpdCdzCisgIC8vIGZyZWVkLgorICAvLworICAvLyBTb21lIGltcGxlbWVudGF0aW9uIG9mIFBPU0lYIHJlZ2V4IChlLmcuIG9uIGF0IGxlYXN0IHNvbWUKKyAgLy8gdmVyc2lvbnMgb2YgQ3lnd2luKSBkb2Vzbid0IGFjY2VwdCB0aGUgZW1wdHkgc3RyaW5nIGFzIGEgdmFsaWQKKyAgLy8gcmVnZXguICBXZSBjaGFuZ2UgaXQgdG8gYW4gZXF1aXZhbGVudCBmb3JtICIoKSIgdG8gYmUgc2FmZS4KKyAgaWYgKGlzX3ZhbGlkXykgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0IHBhcnRpYWxfcmVnZXggPSAoKnJlZ2V4ID09ICdcMCcpID8gIigpIiA6IHJlZ2V4OworICAgIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCBwYXJ0aWFsX3JlZ2V4LCBSRUdfRVhURU5ERUQpID09IDA7CisgIH0KKyAgRVhQRUNUX1RSVUUoaXNfdmFsaWRfKQorICAgICAgPDwgIlJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXgKKyAgICAgIDw8ICJcIiBpcyBub3QgYSB2YWxpZCBQT1NJWCBFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24uIjsKKworICBkZWxldGVbXSBmdWxsX3BhdHRlcm47Cit9CisKKyNlbGlmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYXBwZWFycyBhbnl3aGVyZSBpbiBzdHIgKGV4Y2x1ZGluZyB0aGUKKy8vIHRlcm1pbmF0aW5nICdcMCcgY2hhcmFjdGVyKS4KK2Jvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIGNoICE9ICdcMCcgJiYgc3RyY2hyKHN0ciwgY2gpICE9IE5VTEw7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3NpZmljYXRpb24uICBVbmxpa2UKKy8vIHNpbWlsYXIgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiwgdGhlc2UgYXJlbid0IGFmZmVjdGVkIGJ5IHRoZQorLy8gY3VycmVudCBsb2NhbGUuCitib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKSB7IHJldHVybiAnMCcgPD0gY2ggJiYgY2ggPD0gJzknOyB9Citib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKSB7CisgIHJldHVybiBJc0luU2V0KGNoLCAiXi0hXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXV9ge3x9fiIpOworfQorYm9vbCBJc1JlcGVhdChjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiPyorIik7IH0KK2Jvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIiBcZlxuXHJcdFx2Iik7IH0KK2Jvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpIHsKKyAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgfHwKKyAgICAgICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCBjaCA9PSAnXyc7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgIlxcYyIgaXMgYSBzdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlLgorYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgYykgeworICByZXR1cm4gKElzQXNjaWlQdW5jdChjKSB8fCBJc0luU2V0KGMsICJkRGZucnNTdHZ3VyIpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gYXRvbSAoc3BlY2lmaWVkIGJ5IGVzY2FwZWQgYW5kIHBhdHRlcm4pCisvLyBtYXRjaGVzIGNoLiAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgdGhlIGF0b20gaXMgaW52YWxpZC4KK2Jvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuX2NoYXIsIGNoYXIgY2gpIHsKKyAgaWYgKGVzY2FwZWQpIHsgIC8vICJcXHAiIHdoZXJlIHAgaXMgcGF0dGVybl9jaGFyLgorICAgIHN3aXRjaCAocGF0dGVybl9jaGFyKSB7CisgICAgICBjYXNlICdkJzogcmV0dXJuIElzQXNjaWlEaWdpdChjaCk7CisgICAgICBjYXNlICdEJzogcmV0dXJuICFJc0FzY2lpRGlnaXQoY2gpOworICAgICAgY2FzZSAnZic6IHJldHVybiBjaCA9PSAnXGYnOworICAgICAgY2FzZSAnbic6IHJldHVybiBjaCA9PSAnXG4nOworICAgICAgY2FzZSAncic6IHJldHVybiBjaCA9PSAnXHInOworICAgICAgY2FzZSAncyc6IHJldHVybiBJc0FzY2lpV2hpdGVTcGFjZShjaCk7CisgICAgICBjYXNlICdTJzogcmV0dXJuICFJc0FzY2lpV2hpdGVTcGFjZShjaCk7CisgICAgICBjYXNlICd0JzogcmV0dXJuIGNoID09ICdcdCc7CisgICAgICBjYXNlICd2JzogcmV0dXJuIGNoID09ICdcdic7CisgICAgICBjYXNlICd3JzogcmV0dXJuIElzQXNjaWlXb3JkQ2hhcihjaCk7CisgICAgICBjYXNlICdXJzogcmV0dXJuICFJc0FzY2lpV29yZENoYXIoY2gpOworICAgIH0KKyAgICByZXR1cm4gSXNBc2NpaVB1bmN0KHBhdHRlcm5fY2hhcikgJiYgcGF0dGVybl9jaGFyID09IGNoOworICB9CisKKyAgcmV0dXJuIChwYXR0ZXJuX2NoYXIgPT0gJy4nICYmIGNoICE9ICdcbicpIHx8IHBhdHRlcm5fY2hhciA9PSBjaDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgVmFsaWRhdGVSZWdleCgpIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlcy4KK3N0ZDo6c3RyaW5nIEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IoY29uc3QgY2hhciogcmVnZXgsIGludCBpbmRleCkgeworICByZXR1cm4gKE1lc3NhZ2UoKSA8PCAiU3ludGF4IGVycm9yIGF0IGluZGV4ICIgPDwgaW5kZXgKKyAgICAgICAgICA8PCAiIGluIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4IDw8ICJcIjogIikuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEdlbmVyYXRlcyBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgcmVnZXggaXMgaW52YWxpZDsKKy8vIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCitib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpIHsKKyAgaWYgKHJlZ2V4ID09IE5VTEwpIHsKKyAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogZml4IHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBpbiB0aGUKKyAgICAvLyBhc3NlcnRpb24gZmFpbHVyZXMgdG8gbWF0Y2ggd2hlcmUgdGhlIHJlZ2V4IGlzIHVzZWQgaW4gdXNlcgorICAgIC8vIGNvZGUuCisgICAgQUREX0ZBSUxVUkUoKSA8PCAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc192YWxpZCA9IHRydWU7CisKKyAgLy8gVHJ1ZSBpZmYgPywgKiwgb3IgKyBjYW4gZm9sbG93IHRoZSBwcmV2aW91cyBhdG9tLgorICBib29sIHByZXZfcmVwZWF0YWJsZSA9IGZhbHNlOworICBmb3IgKGludCBpID0gMDsgcmVnZXhbaV07IGkrKykgeworICAgIGlmIChyZWdleFtpXSA9PSAnXFwnKSB7ICAvLyBBbiBlc2NhcGUgc2VxdWVuY2UKKyAgICAgIGkrKzsKKyAgICAgIGlmIChyZWdleFtpXSA9PSAnXDAnKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFJc1ZhbGlkRXNjYXBlKHJlZ2V4W2ldKSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcIlxcIiA8PCByZWdleFtpXSA8PCAiXCIuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHByZXZfcmVwZWF0YWJsZSA9IHRydWU7CisgICAgfSBlbHNlIHsgIC8vIE5vdCBhbiBlc2NhcGUgc2VxdWVuY2UuCisgICAgICBjb25zdCBjaGFyIGNoID0gcmVnZXhbaV07CisKKyAgICAgIGlmIChjaCA9PSAnXicgJiYgaSA+IDApIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyQnICYmIHJlZ2V4W2kgKyAxXSAhPSAnXDAnKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKElzSW5TZXQoY2gsICIoKVtde318IikpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCBjaCA8PCAiJyBpcyB1bnN1cHBvcnRlZC4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChJc1JlcGVhdChjaCkgJiYgIXByZXZfcmVwZWF0YWJsZSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4uIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHJldl9yZXBlYXRhYmxlID0gIUlzSW5TZXQoY2gsICJeJD8qKyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpc192YWxpZDsKK30KKworLy8gTWF0Y2hlcyBhIHJlcGVhdGVkIHJlZ2V4IGF0b20gZm9sbG93ZWQgYnkgYSB2YWxpZCBzaW1wbGUgcmVndWxhcgorLy8gZXhwcmVzc2lvbi4gIFRoZSByZWdleCBhdG9tIGlzIGRlZmluZWQgYXMgYyBpZiBlc2NhcGVkIGlzIGZhbHNlLAorLy8gb3IgXGMgb3RoZXJ3aXNlLiAgcmVwZWF0IGlzIHRoZSByZXBldGl0aW9uIG1ldGEgY2hhcmFjdGVyICg/LCAqLAorLy8gb3IgKykuICBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHN0ciBjb250YWlucyB0b28gbWFueQorLy8gY2hhcmFjdGVycyB0byBiZSBpbmRleGFibGUgYnkgc2l6ZV90LCBpbiB3aGljaCBjYXNlIHRoZSB0ZXN0IHdpbGwKKy8vIHByb2JhYmx5IHRpbWUgb3V0IGFueXdheS4gIFdlIGFyZSBmaW5lIHdpdGggdGhpcyBsaW1pdGF0aW9uIGFzCisvLyBzdGQ6OnN0cmluZyBoYXMgaXQgdG9vLgorYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKKyAgICBib29sIGVzY2FwZWQsIGNoYXIgYywgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LAorICAgIGNvbnN0IGNoYXIqIHN0cikgeworICBjb25zdCBzaXplX3QgbWluX2NvdW50ID0gKHJlcGVhdCA9PSAnKycpID8gMSA6IDA7CisgIGNvbnN0IHNpemVfdCBtYXhfY291bnQgPSAocmVwZWF0ID09ICc/JykgPyAxIDoKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oLTEpIC0gMTsKKyAgLy8gV2UgY2Fubm90IGNhbGwgbnVtZXJpY19saW1pdHM6Om1heCgpIGFzIGl0IGNvbmZsaWN0cyB3aXRoIHRoZQorICAvLyBtYXgoKSBtYWNybyBvbiBXaW5kb3dzLgorCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IG1heF9jb3VudDsgKytpKSB7CisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBhdG9tIG1hdGNoZXMgZWFjaCBvZiB0aGUgZmlyc3QgaSBjaGFyYWN0ZXJzIGluIHN0ci4KKyAgICBpZiAoaSA+PSBtaW5fY291bnQgJiYgTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyICsgaSkpIHsKKyAgICAgIC8vIFdlIGhhdmUgZW5vdWdoIG1hdGNoZXMgYXQgdGhlIGhlYWQsIGFuZCB0aGUgdGFpbCBtYXRjaGVzIHRvby4KKyAgICAgIC8vIFNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dCAqd2hldGhlciogdGhlIHBhdHRlcm4gbWF0Y2hlcyBzdHIKKyAgICAgIC8vIChhcyBvcHBvc2VkIHRvICpob3cqIGl0IG1hdGNoZXMpLCB0aGVyZSBpcyBubyBuZWVkIHRvIGZpbmQgYQorICAgICAgLy8gZ3JlZWR5IG1hdGNoLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChzdHJbaV0gPT0gJ1wwJyB8fCAhQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsIGMsIHN0cltpXSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2Ygc3RyLiAgcmVnZXggbXVzdCBiZSBhCisvLyB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBub3Qgc3RhcnQgd2l0aCAiXiIsIG9yIHRoZQorLy8gcmVzdWx0IGlzIHVuZGVmaW5lZC4KK2Jvb2wgTWF0Y2hSZWdleEF0SGVhZChjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7CisgIGlmICgqcmVnZXggPT0gJ1wwJykgIC8vIEFuIGVtcHR5IHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2YgYW55dGhpbmcuCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gIiQiIG9ubHkgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nLiAgTm90ZSB0aGF0IHJlZ2V4IGJlaW5nCisgIC8vIHZhbGlkIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSdzIG5vdGhpbmcgYWZ0ZXIgIiQiIGluIGl0LgorICBpZiAoKnJlZ2V4ID09ICckJykKKyAgICByZXR1cm4gKnN0ciA9PSAnXDAnOworCisgIC8vIElzIHRoZSBmaXJzdCB0aGluZyBpbiByZWdleCBhbiBlc2NhcGUgc2VxdWVuY2U/CisgIGNvbnN0IGJvb2wgZXNjYXBlZCA9ICpyZWdleCA9PSAnXFwnOworICBpZiAoZXNjYXBlZCkKKyAgICArK3JlZ2V4OworICBpZiAoSXNSZXBlYXQocmVnZXhbMV0pKSB7CisgICAgLy8gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoKSBjYWxscyBNYXRjaFJlZ2V4QXRIZWFkKCksIHNvCisgICAgLy8gaGVyZSdzIGFuIGluZGlyZWN0IHJlY3Vyc2lvbi4gIEl0IHRlcm1pbmF0ZXMgYXMgdGhlIHJlZ2V4IGdldHMKKyAgICAvLyBzaG9ydGVyIGluIGVhY2ggcmVjdXJzaW9uLgorICAgIHJldHVybiBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKKyAgICAgICAgZXNjYXBlZCwgcmVnZXhbMF0sIHJlZ2V4WzFdLCByZWdleCArIDIsIHN0cik7CisgIH0gZWxzZSB7CisgICAgLy8gcmVnZXggaXNuJ3QgZW1wdHksIGlzbid0ICIkIiwgYW5kIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhCisgICAgLy8gcmVwZXRpdGlvbi4gIFdlIG1hdGNoIHRoZSBmaXJzdCBhdG9tIG9mIHJlZ2V4IHdpdGggdGhlIGZpcnN0CisgICAgLy8gY2hhcmFjdGVyIG9mIHN0ciBhbmQgcmVjdXJzZS4KKyAgICByZXR1cm4gKCpzdHIgIT0gJ1wwJykgJiYgQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsICpyZWdleCwgKnN0cikgJiYKKyAgICAgICAgTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0ciArIDEpOworICB9Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhbnkgc3Vic3RyaW5nIG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUKKy8vIGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisvLworLy8gVGhlIGFsZ29yaXRobSBpcyByZWN1cnNpdmUsIGJ1dCB0aGUgcmVjdXJzaW9uIGRlcHRoIGRvZXNuJ3QgZXhjZWVkCisvLyB0aGUgcmVnZXggbGVuZ3RoLCBzbyB3ZSB3b24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJ1bm5pbmcgb3V0IG9mCisvLyBzdGFjayBzcGFjZSBub3JtYWxseS4gIEluIHJhcmUgY2FzZXMgdGhlIHRpbWUgY29tcGxleGl0eSBjYW4gYmUKKy8vIGV4cG9uZW50aWFsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVnZXggbGVuZ3RoICsgdGhlIHN0cmluZyBsZW5ndGgsCisvLyBidXQgdXN1YWxseSBpdCdzIG11c3QgZmFzdGVyIChvZnRlbiBjbG9zZSB0byBsaW5lYXIpLgorYm9vbCBNYXRjaFJlZ2V4QW55d2hlcmUoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cikgeworICBpZiAocmVnZXggPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCpyZWdleCA9PSAnXicpCisgICAgcmV0dXJuIE1hdGNoUmVnZXhBdEhlYWQocmVnZXggKyAxLCBzdHIpOworCisgIC8vIEEgc3VjY2Vzc2Z1bCBtYXRjaCBjYW4gYmUgYW55d2hlcmUgaW4gc3RyLgorICBkbyB7CisgICAgaWYgKE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0cikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfSB3aGlsZSAoKnN0cisrICE9ICdcMCcpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEltcGxlbWVudHMgdGhlIFJFIGNsYXNzLgorCitSRTo6flJFKCkgeworICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhdHRlcm5fKSk7CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZnVsbF9wYXR0ZXJuXykpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgorYm9vbCBSRTo6RnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLmZ1bGxfcGF0dGVybl8sIHN0cik7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCisvLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLnBhdHRlcm5fLCBzdHIpOworfQorCisvLyBJbml0aWFsaXplcyBhbiBSRSBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCit2b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7CisgIHBhdHRlcm5fID0gZnVsbF9wYXR0ZXJuXyA9IE5VTEw7CisgIGlmIChyZWdleCAhPSBOVUxMKSB7CisgICAgcGF0dGVybl8gPSBwb3NpeDo6U3RyRHVwKHJlZ2V4KTsKKyAgfQorCisgIGlzX3ZhbGlkXyA9IFZhbGlkYXRlUmVnZXgocmVnZXgpOworICBpZiAoIWlzX3ZhbGlkXykgeworICAgIC8vIE5vIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdHRlcm4gd2hlbiB0aGUgcmVnZXggaXMgaW52YWxpZC4KKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKHJlZ2V4KTsKKyAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCisgIC8vIGZ1bGwgbWF0Y2g6IHdlIG5lZWQgc3BhY2UgdG8gcHJlcGVuZCBhICdeJywgYXBwZW5kIGEgJyQnLCBhbmQKKyAgLy8gdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCAnXDAnLgorICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obWFsbG9jKGxlbiArIDMpKTsKKyAgZnVsbF9wYXR0ZXJuXyA9IGJ1ZmZlcjsKKworICBpZiAoKnJlZ2V4ICE9ICdeJykKKyAgICAqYnVmZmVyKysgPSAnXic7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gc3RhcnRzIHdpdGggJ14nLgorCisgIC8vIFdlIGRvbid0IHVzZSBzbnByaW50ZiBvciBzdHJuY3B5LCBhcyB0aGV5IHRyaWdnZXIgYSB3YXJuaW5nIHdoZW4KKyAgLy8gY29tcGlsZWQgd2l0aCBWQysrIDguMC4KKyAgbWVtY3B5KGJ1ZmZlciwgcmVnZXgsIGxlbik7CisgIGJ1ZmZlciArPSBsZW47CisKKyAgaWYgKGxlbiA9PSAwIHx8IHJlZ2V4W2xlbiAtIDFdICE9ICckJykKKyAgICAqYnVmZmVyKysgPSAnJCc7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gZW5kcyB3aXRoICckJy4KKworICAqYnVmZmVyID0gJ1wwJzsKK30KKworI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFCisKK2NvbnN0IGNoYXIga1Vua25vd25GaWxlW10gPSAidW5rbm93biBmaWxlIjsKKworLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKKy8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lKGZpbGUgPT0gTlVMTCA/IGtVbmtub3duRmlsZSA6IGZpbGUpOworCisgIGlmIChsaW5lIDwgMCkgeworICAgIHJldHVybiBmaWxlX25hbWUgKyAiOiI7CisgIH0KKyNpZmRlZiBfTVNDX1ZFUgorICByZXR1cm4gZmlsZV9uYW1lICsgIigiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpICsgIik6IjsKKyNlbHNlCisgIHJldHVybiBmaWxlX25hbWUgKyAiOiIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZSkgKyAiOiI7CisjZW5kaWYgIC8vIF9NU0NfVkVSCit9CisKKy8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgorLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bworLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgorLy8gTm90ZSB0aGF0IEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oKSBkb2VzIE5PVCBhcHBlbmQgY29sb24KKy8vIHRvIHRoZSBmaWxlIGxvY2F0aW9uIGl0IHByb2R1Y2VzLCB1bmxpa2UgRm9ybWF0RmlsZUxvY2F0aW9uKCkuCitHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKKyAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUoZmlsZSA9PSBOVUxMID8ga1Vua25vd25GaWxlIDogZmlsZSk7CisKKyAgaWYgKGxpbmUgPCAwKQorICAgIHJldHVybiBmaWxlX25hbWU7CisgIGVsc2UKKyAgICByZXR1cm4gZmlsZV9uYW1lICsgIjoiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpOworfQorCitHVGVzdExvZzo6R1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCisgICAgOiBzZXZlcml0eV8oc2V2ZXJpdHkpIHsKKyAgY29uc3QgY2hhciogY29uc3QgbWFya2VyID0KKyAgICAgIHNldmVyaXR5ID09IEdURVNUX0lORk8gPyAgICAiWyAgSU5GTyBdIiA6CisgICAgICBzZXZlcml0eSA9PSBHVEVTVF9XQVJOSU5HID8gIltXQVJOSU5HXSIgOgorICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfRVJST1IgPyAgICJbIEVSUk9SIF0iIDogIlsgRkFUQUwgXSI7CisgIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsIDw8IG1hcmtlciA8PCAiICIKKyAgICAgICAgICAgICAgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCkgPDwgIjogIjsKK30KKworLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCitHVGVzdExvZzo6fkdUZXN0TG9nKCkgeworICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbDsKKyAgaWYgKHNldmVyaXR5XyA9PSBHVEVTVF9GQVRBTCkgeworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHBvc2l4OjpBYm9ydCgpOworICB9Cit9CisvLyBEaXNhYmxlIE1pY3Jvc29mdCBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgUE9TSVggZnVuY3Rpb25zIGNhbGxlZCBmcm9tCisvLyB0aGlzIGNsYXNzIChjcmVhdCwgZHVwLCBkdXAyLCBhbmQgY2xvc2UpCitHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2KQorCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisvLyBPYmplY3QgdGhhdCBjYXB0dXJlcyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KK2NsYXNzIENhcHR1cmVkU3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjdG9yIHJlZGlyZWN0cyB0aGUgc3RyZWFtIHRvIGEgdGVtcG9yYXJ5IGZpbGUuCisgIGV4cGxpY2l0IENhcHR1cmVkU3RyZWFtKGludCBmZCkgOiBmZF8oZmQpLCB1bmNhcHR1cmVkX2ZkXyhkdXAoZmQpKSB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKyAgICBjaGFyIHRlbXBfZGlyX3BhdGhbTUFYX1BBVEggKyAxXSA9IHsgJ1wwJyB9OyAgLy8gTk9MSU5UCisgICAgY2hhciB0ZW1wX2ZpbGVfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKKworICAgIDo6R2V0VGVtcFBhdGhBKHNpemVvZih0ZW1wX2Rpcl9wYXRoKSwgdGVtcF9kaXJfcGF0aCk7CisgICAgY29uc3QgVUlOVCBzdWNjZXNzID0gOjpHZXRUZW1wRmlsZU5hbWVBKHRlbXBfZGlyX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndGVzdF9yZWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBHZW5lcmF0ZSB1bmlxdWUgZmlsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfcGF0aCk7CisgICAgR1RFU1RfQ0hFQ0tfKHN1Y2Nlc3MgIT0gMCkKKyAgICAgICAgPDwgIlVuYWJsZSB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiAiIDw8IHRlbXBfZGlyX3BhdGg7CisgICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gY3JlYXQodGVtcF9maWxlX3BhdGgsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKKyAgICBHVEVTVF9DSEVDS18oY2FwdHVyZWRfZmQgIT0gLTEpIDw8ICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZW1wX2ZpbGVfcGF0aDsKKyAgICBmaWxlbmFtZV8gPSB0ZW1wX2ZpbGVfcGF0aDsKKyMgZWxzZQorICAgIC8vIFRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYSB0ZXN0IGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQKKyAgICAvLyBkaXJlY3RvcnksIHNvIHdlIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIC90bXAgZGlyZWN0b3J5CisgICAgLy8gaW5zdGVhZC4gV2UgdXNlIC90bXAgb24gbW9zdCBzeXN0ZW1zLCBhbmQgL3NkY2FyZCBvbiBBbmRyb2lkLgorICAgIC8vIFRoYXQncyBiZWNhdXNlIEFuZHJvaWQgZG9lc24ndCBoYXZlIC90bXAuCisjICBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECisgICAgLy8gTm90ZTogQW5kcm9pZCBhcHBsaWNhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGNhbGwgdGhlIGZyYW1ld29yaydzCisgICAgLy8gQ29udGV4dC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSBtZXRob2QgdGhyb3VnaCBKTkkgdG8gZ2V0CisgICAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3b3JsZC13cml0YWJsZSBTRCBDYXJkIGRpcmVjdG9yeS4gSG93ZXZlciwKKyAgICAvLyB0aGlzIHJlcXVpcmVzIGEgQ29udGV4dCBoYW5kbGUsIHdoaWNoIGNhbm5vdCBiZSByZXRyaWV2ZWQKKyAgICAvLyBnbG9iYWxseSBmcm9tIG5hdGl2ZSBjb2RlLiBEb2luZyBzbyBhbHNvIHByZWNsdWRlcyBydW5uaW5nIHRoZQorICAgIC8vIGNvZGUgYXMgcGFydCBvZiBhIHJlZ3VsYXIgc3RhbmRhbG9uZSBleGVjdXRhYmxlLCB3aGljaCBkb2Vzbid0CisgICAgLy8gcnVuIGluIGEgRGFsdmlrIHByb2Nlc3MgKGUuZy4gd2hlbiBydW5uaW5nIGl0IHRocm91Z2ggJ2FkYiBzaGVsbCcpLgorICAgIC8vCisgICAgLy8gVGhlIGxvY2F0aW9uIC9zZGNhcmQgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIG5hdGl2ZSBjb2RlCisgICAgLy8gYW5kIGlzIHRoZSBvbmx5IGxvY2F0aW9uICh1bm9mZmljaWFsbHkpIHN1cHBvcnRlZCBieSB0aGUgQW5kcm9pZAorICAgIC8vIHRlYW0uIEl0J3MgZ2VuZXJhbGx5IGEgc3ltbGluayB0byB0aGUgcmVhbCBTRCBDYXJkIG1vdW50IHBvaW50CisgICAgLy8gd2hpY2ggY2FuIGJlIC9tbnQvc2RjYXJkLCAvbW50L3NkY2FyZDAsIC9zeXN0ZW0vbWVkaWEvc2RjYXJkLCBvcgorICAgIC8vIG90aGVyIE9FTS1jdXN0b21pemVkIGxvY2F0aW9ucy4gTmV2ZXIgcmVseSBvbiB0aGVzZSwgYW5kIGFsd2F5cworICAgIC8vIHVzZSAvc2RjYXJkLgorICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi9zZGNhcmQvZ3Rlc3RfY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7CisjICBlbHNlCisgICAgY2hhciBuYW1lX3RlbXBsYXRlW10gPSAiL3RtcC9jYXB0dXJlZF9zdHJlYW0uWFhYWFhYIjsKKyMgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWF9BTkRST0lECisgICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gbWtzdGVtcChuYW1lX3RlbXBsYXRlKTsKKyAgICBmaWxlbmFtZV8gPSBuYW1lX3RlbXBsYXRlOworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICAgIGZmbHVzaChOVUxMKTsKKyAgICBkdXAyKGNhcHR1cmVkX2ZkLCBmZF8pOworICAgIGNsb3NlKGNhcHR1cmVkX2ZkKTsKKyAgfQorCisgIH5DYXB0dXJlZFN0cmVhbSgpIHsKKyAgICByZW1vdmUoZmlsZW5hbWVfLmNfc3RyKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdHJpbmcoKSB7CisgICAgaWYgKHVuY2FwdHVyZWRfZmRfICE9IC0xKSB7CisgICAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyZWFtLgorICAgICAgZmZsdXNoKE5VTEwpOworICAgICAgZHVwMih1bmNhcHR1cmVkX2ZkXywgZmRfKTsKKyAgICAgIGNsb3NlKHVuY2FwdHVyZWRfZmRfKTsKKyAgICAgIHVuY2FwdHVyZWRfZmRfID0gLTE7CisgICAgfQorCisgICAgRklMRSogY29uc3QgZmlsZSA9IHBvc2l4OjpGT3BlbihmaWxlbmFtZV8uY19zdHIoKSwgInIiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50ID0gUmVhZEVudGlyZUZpbGUoZmlsZSk7CisgICAgcG9zaXg6OkZDbG9zZShmaWxlKTsKKyAgICByZXR1cm4gY29udGVudDsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgaW50IGZkXzsgIC8vIEEgc3RyZWFtIHRvIGNhcHR1cmUuCisgIGludCB1bmNhcHR1cmVkX2ZkXzsKKyAgLy8gTmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaG9sZGluZyB0aGUgc3RkZXJyIG91dHB1dC4KKyAgOjpzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhDYXB0dXJlZFN0cmVhbSk7Cit9OworCitHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKKworc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZGVyciA9IE5VTEw7CitzdGF0aWMgQ2FwdHVyZWRTdHJlYW0qIGdfY2FwdHVyZWRfc3Rkb3V0ID0gTlVMTDsKKworLy8gU3RhcnRzIGNhcHR1cmluZyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KK3ZvaWQgQ2FwdHVyZVN0cmVhbShpbnQgZmQsIGNvbnN0IGNoYXIqIHN0cmVhbV9uYW1lLCBDYXB0dXJlZFN0cmVhbSoqIHN0cmVhbSkgeworICBpZiAoKnN0cmVhbSAhPSBOVUxMKSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIk9ubHkgb25lICIgPDwgc3RyZWFtX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGNhcHR1cmVyIGNhbiBleGlzdCBhdCBhIHRpbWUuIjsKKyAgfQorICAqc3RyZWFtID0gbmV3IENhcHR1cmVkU3RyZWFtKGZkKTsKK30KKworLy8gU3RvcHMgY2FwdHVyaW5nIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0cmVhbShDYXB0dXJlZFN0cmVhbSoqIGNhcHR1cmVkX3N0cmVhbSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50ID0gKCpjYXB0dXJlZF9zdHJlYW0pLT5HZXRDYXB0dXJlZFN0cmluZygpOworCisgIGRlbGV0ZSAqY2FwdHVyZWRfc3RyZWFtOworICAqY2FwdHVyZWRfc3RyZWFtID0gTlVMTDsKKworICByZXR1cm4gY29udGVudDsKK30KKworLy8gU3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCit2b2lkIENhcHR1cmVTdGRvdXQoKSB7CisgIENhcHR1cmVTdHJlYW0oa1N0ZE91dEZpbGVubywgInN0ZG91dCIsICZnX2NhcHR1cmVkX3N0ZG91dCk7Cit9CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgordm9pZCBDYXB0dXJlU3RkZXJyKCkgeworICBDYXB0dXJlU3RyZWFtKGtTdGRFcnJGaWxlbm8sICJzdGRlcnIiLCAmZ19jYXB0dXJlZF9zdGRlcnIpOworfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZG91dCgpIHsKKyAgcmV0dXJuIEdldENhcHR1cmVkU3RyZWFtKCZnX2NhcHR1cmVkX3N0ZG91dCk7Cit9CisKKy8vIFN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KK3N0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RkZXJyKCkgeworICByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3RkZXJyKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKK3N0ZDo6c3RyaW5nIFRlbXBEaXIoKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgcmV0dXJuICJcXHRlbXBcXCI7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgIGNvbnN0IGNoYXIqIHRlbXBfZGlyID0gcG9zaXg6OkdldEVudigiVEVNUCIpOworICBpZiAodGVtcF9kaXIgPT0gTlVMTCB8fCB0ZW1wX2RpclswXSA9PSAnXDAnKQorICAgIHJldHVybiAiXFx0ZW1wXFwiOworICBlbHNlIGlmICh0ZW1wX2RpcltzdHJsZW4odGVtcF9kaXIpIC0gMV0gPT0gJ1xcJykKKyAgICByZXR1cm4gdGVtcF9kaXI7CisgIGVsc2UKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcodGVtcF9kaXIpICsgIlxcIjsKKyNlbGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKKyAgcmV0dXJuICIvc2RjYXJkLyI7CisjZWxzZQorICByZXR1cm4gIi90bXAvIjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK30KKworc2l6ZV90IEdldEZpbGVTaXplKEZJTEUqIGZpbGUpIHsKKyAgZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihmdGVsbChmaWxlKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpIHsKKyAgY29uc3Qgc2l6ZV90IGZpbGVfc2l6ZSA9IEdldEZpbGVTaXplKGZpbGUpOworICBjaGFyKiBjb25zdCBidWZmZXIgPSBuZXcgY2hhcltmaWxlX3NpemVdOworCisgIHNpemVfdCBieXRlc19sYXN0X3JlYWQgPSAwOyAgLy8gIyBvZiBieXRlcyByZWFkIGluIHRoZSBsYXN0IGZyZWFkKCkKKyAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOyAgICAgICAvLyAjIG9mIGJ5dGVzIHJlYWQgc28gZmFyCisKKyAgZnNlZWsoZmlsZSwgMCwgU0VFS19TRVQpOworCisgIC8vIEtlZXBzIHJlYWRpbmcgdGhlIGZpbGUgdW50aWwgd2UgY2Fubm90IHJlYWQgZnVydGhlciBvciB0aGUKKyAgLy8gcHJlLWRldGVybWluZWQgZmlsZSBzaXplIGlzIHJlYWNoZWQuCisgIGRvIHsKKyAgICBieXRlc19sYXN0X3JlYWQgPSBmcmVhZChidWZmZXIrYnl0ZXNfcmVhZCwgMSwgZmlsZV9zaXplLWJ5dGVzX3JlYWQsIGZpbGUpOworICAgIGJ5dGVzX3JlYWQgKz0gYnl0ZXNfbGFzdF9yZWFkOworICB9IHdoaWxlIChieXRlc19sYXN0X3JlYWQgPiAwICYmIGJ5dGVzX3JlYWQgPCBmaWxlX3NpemUpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQoYnVmZmVyLCBieXRlc19yZWFkKTsKKyAgZGVsZXRlW10gYnVmZmVyOworCisgIHJldHVybiBjb250ZW50OworfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworc3RhdGljIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qIGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTDsgIC8vIE93bmVkLgorCit2b2lkIFNldEluamVjdGFibGVBcmd2cyhjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KiBhcmd2cykgeworICBpZiAoZ19pbmplY3RlZF90ZXN0X2FyZ3ZzICE9IGFyZ3ZzKQorICAgIGRlbGV0ZSBnX2luamVjdGVkX3Rlc3RfYXJndnM7CisgIGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyA9IGFyZ3ZzOworfQorCitjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+JiBHZXRJbmplY3RhYmxlQXJndnMoKSB7CisgIGlmIChnX2luamVjdGVkX3Rlc3RfYXJndnMgIT0gTlVMTCkgeworICAgIHJldHVybiAqZ19pbmplY3RlZF90ZXN0X2FyZ3ZzOworICB9CisgIHJldHVybiBHZXRBcmd2cygpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK25hbWVzcGFjZSBwb3NpeCB7Cit2b2lkIEFib3J0KCkgeworICBEZWJ1Z0JyZWFrKCk7CisgIFRlcm1pbmF0ZVByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgMSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgcG9zaXgKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUKKy8vIGdpdmVuIGZsYWcuICBGb3IgZXhhbXBsZSwgRmxhZ1RvRW52VmFyKCJmb28iKSB3aWxsIHJldHVybgorLy8gIkdURVNUX0ZPTyIgaW4gdGhlIG9wZW4tc291cmNlIHZlcnNpb24uCitzdGF0aWMgc3RkOjpzdHJpbmcgRmxhZ1RvRW52VmFyKGNvbnN0IGNoYXIqIGZsYWcpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZnVsbF9mbGFnID0KKyAgICAgIChNZXNzYWdlKCkgPDwgR1RFU1RfRkxBR19QUkVGSVhfIDw8IGZsYWcpLkdldFN0cmluZygpOworCisgIE1lc3NhZ2UgZW52X3ZhcjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gZnVsbF9mbGFnLmxlbmd0aCgpOyBpKyspIHsKKyAgICBlbnZfdmFyIDw8IFRvVXBwZXIoZnVsbF9mbGFnLmNfc3RyKClbaV0pOworICB9CisKKyAgcmV0dXJuIGVudl92YXIuR2V0U3RyaW5nKCk7Cit9CisKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMKKy8vIHRoZSByZXN1bHQgdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlCisvLyB1bmNoYW5nZWQgYW5kIHJldHVybnMgZmFsc2UuCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKSB7CisgIC8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgYSBkZWNpbWFsIGludGVnZXIuCisgIGNoYXIqIGVuZCA9IE5VTEw7CisgIGNvbnN0IGxvbmcgbG9uZ192YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDEwKTsgIC8vIE5PTElOVAorCisgIC8vIEhhcyBzdHJ0b2woKSBjb25zdW1lZCBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nPworICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgLy8gTm8gLSBhbiBpbnZhbGlkIGNoYXJhY3RlciB3YXMgZW5jb3VudGVyZWQuCisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0CisgICAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgYnV0IGFjdHVhbGx5IgorICAgICAgICA8PCAiIGhhcyB2YWx1ZSBcIiIgPDwgc3RyIDw8ICJcIi5cbiI7CisgICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJcyB0aGUgcGFyc2VkIHZhbHVlIGluIHRoZSByYW5nZSBvZiBhbiBJbnQzMj8KKyAgY29uc3QgSW50MzIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50MzI+KGxvbmdfdmFsdWUpOworICBpZiAobG9uZ192YWx1ZSA9PSBMT05HX01BWCB8fCBsb25nX3ZhbHVlID09IExPTkdfTUlOIHx8CisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhIGxvbmcuICAoc3RydG9sKCkgcmV0dXJucworICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikKKyAgICAgIHJlc3VsdCAhPSBsb25nX3ZhbHVlCisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KKyAgICAgICkgeworICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAorICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKKyAgICAgICAgPDwgIiBoYXMgdmFsdWUgIiA8PCBzdHIgPDwgIiwgd2hpY2ggb3ZlcmZsb3dzLlxuIjsKKyAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBCb29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KKy8vCisvLyBUaGUgdmFsdWUgaXMgY29uc2lkZXJlZCB0cnVlIGlmZiBpdCdzIG5vdCAiMCIuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7CisjaWYgZGVmaW5lZChHVEVTVF9HRVRfQk9PTF9GUk9NX0VOVl8pCisgIHJldHVybiBHVEVTVF9HRVRfQk9PTF9GUk9NX0VOVl8oZmxhZywgZGVmYXVsdF92YWx1ZSk7CisjZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfR0VUX0JPT0xfRlJPTV9FTlZfKQorICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOworICBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdfdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiBzdHJpbmdfdmFsdWUgPT0gTlVMTCA/CisgICAgICBkZWZhdWx0X3ZhbHVlIDogc3RyY21wKHN0cmluZ192YWx1ZSwgIjAiKSAhPSAwOworfQorCisvLyBSZWFkcyBhbmQgcmV0dXJucyBhIDMyLWJpdCBpbnRlZ2VyIHN0b3JlZCBpbiB0aGUgZW52aXJvbm1lbnQKKy8vIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0IGlzbid0IHNldCBvcgorLy8gZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCAzMi1iaXQgaW50ZWdlciwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgorSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWx1ZSkgeworI2lmIGRlZmluZWQoR1RFU1RfR0VUX0lOVDMyX0ZST01fRU5WXykKKyAgcmV0dXJuIEdURVNUX0dFVF9JTlQzMl9GUk9NX0VOVl8oZmxhZywgZGVmYXVsdF92YWx1ZSk7CisjZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfR0VUX0lOVDMyX0ZST01fRU5WXykKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOworICBpZiAoc3RyaW5nX3ZhbHVlID09IE5VTEwpIHsKKyAgICAvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC4KKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorCisgIEludDMyIHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7CisgIGlmICghUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIkVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZSwgJnJlc3VsdCkpIHsKKyAgICBwcmludGYoIlRoZSBkZWZhdWx0IHZhbHVlICVzIGlzIHVzZWQuXG4iLAorICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGRlZmF1bHRfdmFsdWUpLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCisvLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCitjb25zdCBjaGFyKiBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgeworI2lmIGRlZmluZWQoR1RFU1RfR0VUX1NUUklOR19GUk9NX0VOVl8pCisgIHJldHVybiBHVEVTVF9HRVRfU1RSSU5HX0ZST01fRU5WXyhmbGFnLCBkZWZhdWx0X3ZhbHVlKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9HRVRfU1RSSU5HX0ZST01fRU5WXykKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiB2YWx1ZSA9PSBOVUxMID8gZGVmYXVsdF92YWx1ZSA6IHZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LXByaW50ZXJzLmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC1wcmludGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmRmNDEyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC1wcmludGVycy5jYwpAQCAtMCwwICsxLDM3MyBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIFRlc3QgLSBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgdGhhdCBjYW4gcHJpbnQgYQorLy8gdmFsdWUgb2YgYW55IHR5cGUgVDoKKy8vCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKTsKKy8vCisvLyBJdCB1c2VzIHRoZSA8PCBvcGVyYXRvciB3aGVuIHBvc3NpYmxlLCBhbmQgcHJpbnRzIHRoZSBieXRlcyBpbiB0aGUKKy8vIG9iamVjdCBvdGhlcndpc2UuICBBIHVzZXIgY2FuIG92ZXJyaWRlIGl0cyBiZWhhdmlvciBmb3IgYSBjbGFzcworLy8gdHlwZSBGb28gYnkgZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mLCBjb25zdCBGb28mKQorLy8gb3Igdm9pZCBQcmludFRvKGNvbnN0IEZvbyYsIDo6c3RkOjpvc3RyZWFtKikgaW4gdGhlIG5hbWVzcGFjZSB0aGF0CisvLyBkZWZpbmVzIEZvby4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN3Y2hhcj4KKyNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCit1c2luZyA6OnN0ZDo6b3N0cmVhbTsKKworLy8gUHJpbnRzIGEgc2VnbWVudCBvZiBieXRlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgorR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX01FTU9SWV8KK0dURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXworR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX1RIUkVBRF8KK3ZvaWQgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgb3N0cmVhbSogb3MpIHsKKyAgY2hhciB0ZXh0WzVdID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKyAgICBjb25zdCBzaXplX3QgaiA9IHN0YXJ0ICsgaTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAvLyBPcmdhbml6ZXMgdGhlIGJ5dGVzIGludG8gZ3JvdXBzIG9mIDIgZm9yIGVhc3kgcGFyc2luZyBieQorICAgICAgLy8gaHVtYW4uCisgICAgICBpZiAoKGogJSAyKSA9PSAwKQorICAgICAgICAqb3MgPDwgJyAnOworICAgICAgZWxzZQorICAgICAgICAqb3MgPDwgJy0nOworICAgIH0KKyAgICBHVEVTVF9TTlBSSU5URl8odGV4dCwgc2l6ZW9mKHRleHQpLCAiJTAyWCIsIG9ial9ieXRlc1tqXSk7CisgICAgKm9zIDw8IHRleHQ7CisgIH0KK30KKworLy8gUHJpbnRzIHRoZSBieXRlcyBpbiB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uCit2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvSW1wbChjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0qIG9zKSB7CisgIC8vIFRlbGxzIHRoZSB1c2VyIGhvdyBiaWcgdGhlIG9iamVjdCBpcy4KKyAgKm9zIDw8IGNvdW50IDw8ICItYnl0ZSBvYmplY3QgPCI7CisKKyAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxMzI7CisgIGNvbnN0IHNpemVfdCBrQ2h1bmtTaXplID0gNjQ7CisgIC8vIElmIHRoZSBvYmplY3Qgc2l6ZSBpcyBiaWdnZXIgdGhhbiBrVGhyZXNob2xkLCB3ZSdsbCBoYXZlIHRvIG9taXQKKyAgLy8gc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBrQ2h1bmtTaXplCisgIC8vIGJ5dGVzLgorICAvLyBUT0RPKHdhbik6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgorICBpZiAoY291bnQgPCBrVGhyZXNob2xkKSB7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCAwLCBjb3VudCwgb3MpOworICB9IGVsc2UgeworICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgMCwga0NodW5rU2l6ZSwgb3MpOworICAgICpvcyA8PCAiIC4uLiAiOworICAgIC8vIFJvdW5kcyB1cCB0byAyLWJ5dGUgYm91bmRhcnkuCisgICAgY29uc3Qgc2l6ZV90IHJlc3VtZV9wb3MgPSAoY291bnQgLSBrQ2h1bmtTaXplICsgMSkvMioyOworICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgcmVzdW1lX3BvcywgY291bnQgLSByZXN1bWVfcG9zLCBvcyk7CisgIH0KKyAgKm9zIDw8ICI+IjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbDIgeworCisvLyBEZWxlZ2F0ZXMgdG8gUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKCkgdG8gcHJpbnQgdGhlIGJ5dGVzIGluIHRoZQorLy8gZ2l2ZW4gb2JqZWN0LiAgVGhlIGRlbGVnYXRpb24gc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24sIHdoaWNoCisvLyB1c2VzIHRoZSA8PCBvcGVyYXRvciBhbmQgdGh1cyBpcyBlYXNpZXIgZG9uZSBvdXRzaWRlIG9mIHRoZQorLy8gOjp0ZXN0aW5nOjppbnRlcm5hbCBuYW1lc3BhY2UsIHdoaWNoIGNvbnRhaW5zIGEgPDwgb3BlcmF0b3IgdGhhdAorLy8gc29tZXRpbWVzIGNvbmZsaWN0cyB3aXRoIHRoZSBvbmUgaW4gU1RMLgordm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKG9ial9ieXRlcywgY291bnQsIG9zKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGEgY2hhciAob3Igd2NoYXJfdCksIHdlIHByaW50IGl0IGluIG9uZQorLy8gb2YgdGhyZWUgZm9ybWF0czoKKy8vICAgLSBhcyBpcyBpZiBpdCdzIGEgcHJpbnRhYmxlIEFTQ0lJIChlLmcuICdhJywgJzInLCAnICcpLAorLy8gICAtIGFzIGEgaGV4aWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdceDdGJyksIG9yCisvLyAgIC0gYXMgYSBzcGVjaWFsIGVzY2FwZSBzZXF1ZW5jZSAoZS5nLiAnXHInLCAnXG4nKS4KK2VudW0gQ2hhckZvcm1hdCB7CisgIGtBc0lzLAorICBrSGV4RXNjYXBlLAorICBrU3BlY2lhbEVzY2FwZQorfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIGMgaXMgYSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyLiAgV2UgdGVzdCB0aGUKKy8vIHZhbHVlIG9mIGMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIGlzcHJpbnQoKSwgd2hpY2ggaXMgYnVnZ3kgb24KKy8vIFdpbmRvd3MgTW9iaWxlLgoraW5saW5lIGJvb2wgSXNQcmludGFibGVBc2NpaSh3Y2hhcl90IGMpIHsKKyAgcmV0dXJuIDB4MjAgPD0gYyAmJiBjIDw9IDB4N0U7Cit9CisKKy8vIFByaW50cyBhIHdpZGUgb3IgbmFycm93IGNoYXIgYyBhcyBhIGNoYXJhY3RlciBsaXRlcmFsIHdpdGhvdXQgdGhlCisvLyBxdW90ZXMsIGVzY2FwaW5nIGl0IHdoZW4gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCisvLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgVW5zaWduZWRDaGFyIGlzIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIENoYXIsCisvLyB3aGljaCBpcyB0aGUgdHlwZSBvZiBjLgordGVtcGxhdGUgPHR5cGVuYW1lIFVuc2lnbmVkQ2hhciwgdHlwZW5hbWUgQ2hhcj4KK3N0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNDaGFyTGl0ZXJhbFRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsKKyAgc3dpdGNoIChzdGF0aWNfY2FzdDx3Y2hhcl90PihjKSkgeworICAgIGNhc2UgTCdcMCc6CisgICAgICAqb3MgPDwgIlxcMCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXCcnOgorICAgICAgKm9zIDw8ICJcXCciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xcJzoKKyAgICAgICpvcyA8PCAiXFxcXCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXGEnOgorICAgICAgKm9zIDw8ICJcXGEiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xiJzoKKyAgICAgICpvcyA8PCAiXFxiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcZic6CisgICAgICAqb3MgPDwgIlxcZiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXG4nOgorICAgICAgKm9zIDw8ICJcXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xyJzoKKyAgICAgICpvcyA8PCAiXFxyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcdCc6CisgICAgICAqb3MgPDwgIlxcdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXHYnOgorICAgICAgKm9zIDw8ICJcXHYiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChJc1ByaW50YWJsZUFzY2lpKGMpKSB7CisgICAgICAgICpvcyA8PCBzdGF0aWNfY2FzdDxjaGFyPihjKTsKKyAgICAgICAgcmV0dXJuIGtBc0lzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKm9zIDw8ICJcXHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSk7CisgICAgICAgIHJldHVybiBrSGV4RXNjYXBlOworICAgICAgfQorICB9CisgIHJldHVybiBrU3BlY2lhbEVzY2FwZTsKK30KKworLy8gUHJpbnRzIGEgd2NoYXJfdCBjIGFzIGlmIGl0J3MgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGluZyBpdCB3aGVuCisvLyBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KK3N0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNTdHJpbmdMaXRlcmFsVG8od2NoYXJfdCBjLCBvc3RyZWFtKiBvcykgeworICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlIEwnXCcnOgorICAgICAgKm9zIDw8ICInIjsKKyAgICAgIHJldHVybiBrQXNJczsKKyAgICBjYXNlIEwnIic6CisgICAgICAqb3MgPDwgIlxcXCIiOworICAgICAgcmV0dXJuIGtTcGVjaWFsRXNjYXBlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gUHJpbnRBc0NoYXJMaXRlcmFsVG88d2NoYXJfdD4oYywgb3MpOworICB9Cit9CisKKy8vIFByaW50cyBhIGNoYXIgYyBhcyBpZiBpdCdzIHBhcnQgb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZXNjYXBpbmcgaXQgd2hlbgorLy8gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCitzdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKGNoYXIgYywgb3N0cmVhbSogb3MpIHsKKyAgcmV0dXJuIFByaW50QXNTdHJpbmdMaXRlcmFsVG8oCisgICAgICBzdGF0aWNfY2FzdDx3Y2hhcl90PihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSksIG9zKTsKK30KKworLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhcmFjdGVyIGMgYW5kIGl0cyBjb2RlLiAgJ1wwJyBpcyBwcmludGVkCisvLyBhcyAiJ1xcMCciLCBvdGhlciB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBhbHNvIHByb3Blcmx5IGVzY2FwZWQKKy8vIHVzaW5nIHRoZSBzdGFuZGFyZCBDKysgZXNjYXBlIHNlcXVlbmNlLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50CisvLyBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgYy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBVbnNpZ25lZENoYXIsIHR5cGVuYW1lIENoYXI+Cit2b2lkIFByaW50Q2hhckFuZENvZGVUbyhDaGFyIGMsIG9zdHJlYW0qIG9zKSB7CisgIC8vIEZpcnN0LCBwcmludCBjIGFzIGEgbGl0ZXJhbCBpbiB0aGUgbW9zdCByZWFkYWJsZSBmb3JtIHdlIGNhbiBmaW5kLgorICAqb3MgPDwgKChzaXplb2YoYykgPiAxKSA/ICJMJyIgOiAiJyIpOworICBjb25zdCBDaGFyRm9ybWF0IGZvcm1hdCA9IFByaW50QXNDaGFyTGl0ZXJhbFRvPFVuc2lnbmVkQ2hhcj4oYywgb3MpOworICAqb3MgPDwgIiciOworCisgIC8vIFRvIGFpZCB1c2VyIGRlYnVnZ2luZywgd2UgYWxzbyBwcmludCBjJ3MgY29kZSBpbiBkZWNpbWFsLCB1bmxlc3MKKyAgLy8gaXQncyAwIChpbiB3aGljaCBjYXNlIGMgd2FzIHByaW50ZWQgYXMgJ1xcMCcsIG1ha2luZyB0aGUgY29kZQorICAvLyBvYnZpb3VzKS4KKyAgaWYgKGMgPT0gMCkKKyAgICByZXR1cm47CisgICpvcyA8PCAiICgiIDw8IHN0YXRpY19jYXN0PGludD4oYyk7CisKKyAgLy8gRm9yIG1vcmUgY29udmVuaWVuY2UsIHdlIHByaW50IGMncyBjb2RlIGFnYWluIGluIGhleGlkZWNpbWFsLAorICAvLyB1bmxlc3MgYyB3YXMgYWxyZWFkeSBwcmludGVkIGluIHRoZSBmb3JtICdceCMjJyBvciB0aGUgY29kZSBpcyBpbgorICAvLyBbMSwgOV0uCisgIGlmIChmb3JtYXQgPT0ga0hleEVzY2FwZSB8fCAoMSA8PSBjICYmIGMgPD0gOSkpIHsKKyAgICAvLyBEbyBub3RoaW5nLgorICB9IGVsc2UgeworICAgICpvcyA8PCAiLCAweCIgPDwgU3RyaW5nOjpGb3JtYXRIZXhJbnQoc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSk7CisgIH0KKyAgKm9zIDw8ICIpIjsKK30KKwordm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhckFuZENvZGVUbzx1bnNpZ25lZCBjaGFyPihjLCBvcyk7Cit9Cit2b2lkIFByaW50VG8oc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhckFuZENvZGVUbzx1bnNpZ25lZCBjaGFyPihjLCBvcyk7Cit9CisKKy8vIFByaW50cyBhIHdjaGFyX3QgYXMgYSBzeW1ib2wgaWYgaXQgaXMgcHJpbnRhYmxlIG9yIGFzIGl0cyBpbnRlcm5hbAorLy8gY29kZSBvdGhlcndpc2UgYW5kIGFsc28gYXMgaXRzIGNvZGUuICBMJ1wwJyBpcyBwcmludGVkIGFzICJMJ1xcMCciLgordm9pZCBQcmludFRvKHdjaGFyX3Qgd2MsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhckFuZENvZGVUbzx3Y2hhcl90Pih3Yywgb3MpOworfQorCisvLyBQcmludHMgdGhlIGdpdmVuIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gdGhlIG9zdHJlYW0uICBDaGFyVHlwZSBtdXN0IGJlIGVpdGhlcgorLy8gY2hhciBvciB3Y2hhcl90LgorLy8gVGhlIGFycmF5IHN0YXJ0cyBhdCBiZWdpbiwgdGhlIGxlbmd0aCBpcyBsZW4sIGl0IG1heSBpbmNsdWRlICdcMCcgY2hhcmFjdGVycworLy8gYW5kIG1heSBub3QgYmUgTlVMLXRlcm1pbmF0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CitHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXworR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfCitHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXworc3RhdGljIHZvaWQgUHJpbnRDaGFyc0FzU3RyaW5nVG8oCisgICAgY29uc3QgQ2hhclR5cGUqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgeworICBjb25zdCBjaGFyKiBjb25zdCBrUXVvdGVCZWdpbiA9IHNpemVvZihDaGFyVHlwZSkgPT0gMSA/ICJcIiIgOiAiTFwiIjsKKyAgKm9zIDw8IGtRdW90ZUJlZ2luOworICBib29sIGlzX3ByZXZpb3VzX2hleCA9IGZhbHNlOworICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbGVuOyArK2luZGV4KSB7CisgICAgY29uc3QgQ2hhclR5cGUgY3VyID0gYmVnaW5baW5kZXhdOworICAgIGlmIChpc19wcmV2aW91c19oZXggJiYgSXNYRGlnaXQoY3VyKSkgeworICAgICAgLy8gUHJldmlvdXMgY2hhcmFjdGVyIGlzIG9mICdceC4uJyBmb3JtIGFuZCB0aGlzIGNoYXJhY3RlciBjYW4gYmUKKyAgICAgIC8vIGludGVycHJldGVkIGFzIGFub3RoZXIgaGV4YWRlY2ltYWwgZGlnaXQgaW4gaXRzIG51bWJlci4gQnJlYWsgc3RyaW5nIHRvCisgICAgICAvLyBkaXNhbWJpZ3VhdGUuCisgICAgICAqb3MgPDwgIlwiICIgPDwga1F1b3RlQmVnaW47CisgICAgfQorICAgIGlzX3ByZXZpb3VzX2hleCA9IFByaW50QXNTdHJpbmdMaXRlcmFsVG8oY3VyLCBvcykgPT0ga0hleEVzY2FwZTsKKyAgfQorICAqb3MgPDwgIlwiIjsKK30KKworLy8gUHJpbnRzIGEgKGNvbnN0KSBjaGFyL3djaGFyX3QgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MKKy8vICdiZWdpbicuICBDaGFyVHlwZSBtdXN0IGJlIGVpdGhlciBjaGFyIG9yIHdjaGFyX3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CitHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXworR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfCitHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXworc3RhdGljIHZvaWQgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoCisgICAgY29uc3QgQ2hhclR5cGUqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgeworICAvLyBUaGUgY29kZQorICAvLyAgIGNvbnN0IGNoYXIga0Zvb1tdID0gImZvbyI7CisgIC8vIGdlbmVyYXRlcyBhbiBhcnJheSBvZiA0LCBub3QgMywgZWxlbWVudHMsIHdpdGggdGhlIGxhc3Qgb25lIGJlaW5nICdcMCcuCisgIC8vCisgIC8vIFRoZXJlZm9yZSB3aGVuIHByaW50aW5nIGEgY2hhciBhcnJheSwgd2UgZG9uJ3QgcHJpbnQgdGhlIGxhc3QgZWxlbWVudCBpZgorICAvLyBpdCdzICdcMCcsIHN1Y2ggdGhhdCB0aGUgb3V0cHV0IG1hdGNoZXMgdGhlIHN0cmluZyBsaXRlcmFsIGFzIGl0J3MKKyAgLy8gd3JpdHRlbiBpbiB0aGUgc291cmNlIGNvZGUuCisgIGlmIChsZW4gPiAwICYmIGJlZ2luW2xlbiAtIDFdID09ICdcMCcpIHsKKyAgICBQcmludENoYXJzQXNTdHJpbmdUbyhiZWdpbiwgbGVuIC0gMSwgb3MpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmLCBob3dldmVyLCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBub3QgJ1wwJywgZS5nLgorICAvLyAgICBjb25zdCBjaGFyIGtGb29bXSA9IHsgJ2YnLCAnbycsICdvJyB9OworICAvLyB3ZSBtdXN0IHByaW50IHRoZSBlbnRpcmUgYXJyYXkuICBXZSBhbHNvIHByaW50IGEgbWVzc2FnZSB0byBpbmRpY2F0ZQorICAvLyB0aGF0IHRoZSBhcnJheSBpcyBub3QgTlVMLXRlcm1pbmF0ZWQuCisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKGJlZ2luLCBsZW4sIG9zKTsKKyAgKm9zIDw8ICIgKG5vIHRlcm1pbmF0aW5nIE5VTCkiOworfQorCisvLyBQcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KK3ZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCBjaGFyKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoYmVnaW4sIGxlbiwgb3MpOworfQorCisvLyBQcmludHMgYSAoY29uc3QpIHdjaGFyX3QgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MKKy8vICdiZWdpbicuCit2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3Qgd2NoYXJfdCogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7CisgIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KGJlZ2luLCBsZW4sIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBDIHN0cmluZyB0byB0aGUgb3N0cmVhbS4KK3ZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCBvc3RyZWFtKiBvcykgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgKm9zIDw8ICJOVUxMIjsKKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocykgPDwgIiBwb2ludGluZyB0byAiOworICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMsIHN0cmxlbihzKSwgb3MpOworICB9Cit9CisKKy8vIE1TVkMgY29tcGlsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdoYXJfdCBhcyBhIHR5cGVkZWYKKy8vIG9mIHVuc2lnbmVkIHNob3J0LiBEZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3Qgd2NoYXJfdCogaW4gdGhhdCBjYXNlCisvLyB3b3VsZCBjYXVzZSBwb2ludGVycyB0byB1bnNpZ25lZCBzaG9ydHMgYmUgcHJpbnRlZCBhcyB3aWRlIHN0cmluZ3MsCisvLyBwb3NzaWJseSBhY2Nlc3NpbmcgbW9yZSBtZW1vcnkgdGhhbiBpbnRlbmRlZCBhbmQgY2F1c2luZyBpbnZhbGlkCisvLyBtZW1vcnkgYWNjZXNzZXMuIE1TVkMgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCBzeW1ib2wgd2hlbgorLy8gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBhcyBhIG5hdGl2ZSB0eXBlLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQorLy8gUHJpbnRzIHRoZSBnaXZlbiB3aWRlIEMgc3RyaW5nIHRvIHRoZSBvc3RyZWFtLgordm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIG9zdHJlYW0qIG9zKSB7CisgIGlmIChzID09IE5VTEwpIHsKKyAgICAqb3MgPDwgIk5VTEwiOworICB9IGVsc2UgeworICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7CisgICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocywgc3RkOjp3Y3NsZW4ocyksIG9zKTsKKyAgfQorfQorI2VuZGlmICAvLyB3Y2hhcl90IGlzIG5hdGl2ZQorCisvLyBQcmludHMgYSA6OnN0cmluZyBvYmplY3QuCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK3ZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKK3ZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKworLy8gUHJpbnRzIGEgOjp3c3RyaW5nIG9iamVjdC4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK3ZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK3ZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LXRlc3QtcGFydC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGUzNTQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LXRlc3QtcGFydC5jYwpAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBleGlzdHMgdG8KKy8vIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgaW5jbHVzaW9uIG9mIGd0ZXN0LWludGVybmFsLWlubC5oIGluIHRoZQorLy8gdXNlcidzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKK3VzaW5nIGludGVybmFsOjpHZXRVbml0VGVzdEltcGw7CisKKy8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZSBieSBvbWl0dGluZyB0aGUgc3RhY2sgdHJhY2UKKy8vIGluIGl0Lgorc3RkOjpzdHJpbmcgVGVzdFBhcnRSZXN1bHQ6OkV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RhY2tfdHJhY2UgPSBzdHJzdHIobWVzc2FnZSwgaW50ZXJuYWw6OmtTdGFja1RyYWNlTWFya2VyKTsKKyAgcmV0dXJuIHN0YWNrX3RyYWNlID09IE5VTEwgPyBtZXNzYWdlIDoKKyAgICAgIHN0ZDo6c3RyaW5nKG1lc3NhZ2UsIHN0YWNrX3RyYWNlKTsKK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgcmV0dXJuIG9zCisgICAgICA8PCByZXN1bHQuZmlsZV9uYW1lKCkgPDwgIjoiIDw8IHJlc3VsdC5saW5lX251bWJlcigpIDw8ICI6ICIKKyAgICAgIDw8IChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcyA/ICJTdWNjZXNzIiA6CisgICAgICAgICAgcmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/ICJGYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgIk5vbi1mYXRhbCBmYWlsdXJlIikgPDwgIjpcbiIKKyAgICAgIDw8IHJlc3VsdC5tZXNzYWdlKCkgPDwgc3RkOjplbmRsOworfQorCisvLyBBcHBlbmRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGFycmF5Lgordm9pZCBUZXN0UGFydFJlc3VsdEFycmF5OjpBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICBhcnJheV8ucHVzaF9iYWNrKHJlc3VsdCk7Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RQYXJ0UmVzdWx0IGF0IHRoZSBnaXZlbiBpbmRleCAoMC1iYXNlZCkuCitjb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFBhcnRSZXN1bHRBcnJheTo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGluZGV4KSBjb25zdCB7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSgpKSB7CisgICAgcHJpbnRmKCJcbkludmFsaWQgaW5kZXggKCVkKSBpbnRvIFRlc3RQYXJ0UmVzdWx0QXJyYXkuXG4iLCBpbmRleCk7CisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICB9CisKKyAgcmV0dXJuIGFycmF5X1tpbmRleF07Cit9CisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzIGluIHRoZSBhcnJheS4KK2ludCBUZXN0UGFydFJlc3VsdEFycmF5OjpzaXplKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihhcnJheV8uc2l6ZSgpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKQorICAgIDogaGFzX25ld19mYXRhbF9mYWlsdXJlXyhmYWxzZSksCisgICAgICBvcmlnaW5hbF9yZXBvcnRlcl8oR2V0VW5pdFRlc3RJbXBsKCktPgorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkpIHsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKHRoaXMpOworfQorCitIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6On5IYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKSB7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgKKyAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyk7Cit9CisKK3ZvaWQgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIGlmIChyZXN1bHQuZmF0YWxseV9mYWlsZWQoKSkKKyAgICBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfID0gdHJ1ZTsKKyAgb3JpZ2luYWxfcmVwb3J0ZXJfLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjFlZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjCkBAIC0wLDAgKzEsMTE4IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGluIHN0ci4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgc3RyCisvLyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KK3N0YXRpYyBjb25zdCBjaGFyKiBTa2lwU3BhY2VzKGNvbnN0IGNoYXIqIHN0cikgeworICB3aGlsZSAoSXNTcGFjZSgqc3RyKSkKKyAgICBzdHIrKzsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTcGxpdEludG9UZXN0TmFtZXMoY29uc3QgY2hhciogc3JjKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lX3ZlYzsKKyAgc3JjID0gU2tpcFNwYWNlcyhzcmMpOworICBmb3IgKDsgc3JjICE9IE5VTEw7IHNyYyA9IFNraXBDb21tYShzcmMpKSB7CisgICAgbmFtZV92ZWMucHVzaF9iYWNrKFN0cmlwVHJhaWxpbmdTcGFjZXMoR2V0UHJlZml4VW50aWxDb21tYShzcmMpKSk7CisgIH0KKyAgcmV0dXJuIG5hbWVfdmVjOworfQorCisvLyBWZXJpZmllcyB0aGF0IHJlZ2lzdGVyZWRfdGVzdHMgbWF0Y2ggdGhlIHRlc3QgbmFtZXMgaW4KKy8vIHJlZ2lzdGVyZWRfdGVzdHNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKy8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuCitjb25zdCBjaGFyKiBUeXBlZFRlc3RDYXNlUFN0YXRlOjpWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKAorICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKSB7CisgIHR5cGVkZWYgUmVnaXN0ZXJlZFRlc3RzTWFwOjpjb25zdF9pdGVyYXRvciBSZWdpc3RlcmVkVGVzdEl0ZXI7CisgIHJlZ2lzdGVyZWRfID0gdHJ1ZTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZV92ZWMgPSBTcGxpdEludG9UZXN0TmFtZXMocmVnaXN0ZXJlZF90ZXN0cyk7CisKKyAgTWVzc2FnZSBlcnJvcnM7CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRlc3RzOworICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbmFtZV9pdCA9IG5hbWVfdmVjLmJlZ2luKCk7CisgICAgICAgbmFtZV9pdCAhPSBuYW1lX3ZlYy5lbmQoKTsgKytuYW1lX2l0KSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSAqbmFtZV9pdDsKKyAgICBpZiAodGVzdHMuY291bnQobmFtZSkgIT0gMCkgeworICAgICAgZXJyb3JzIDw8ICJUZXN0ICIgPDwgbmFtZSA8PCAiIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZS5cbiI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yIChSZWdpc3RlcmVkVGVzdEl0ZXIgaXQgPSByZWdpc3RlcmVkX3Rlc3RzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gcmVnaXN0ZXJlZF90ZXN0c18uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBpZiAobmFtZSA9PSBpdC0+Zmlyc3QpIHsKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmQpIHsKKyAgICAgIHRlc3RzLmluc2VydChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgZXJyb3JzIDw8ICJObyB0ZXN0IG5hbWVkICIgPDwgbmFtZQorICAgICAgICAgICAgIDw8ICIgY2FuIGJlIGZvdW5kIGluIHRoaXMgdGVzdCBjYXNlLlxuIjsKKyAgICB9CisgIH0KKworICBmb3IgKFJlZ2lzdGVyZWRUZXN0SXRlciBpdCA9IHJlZ2lzdGVyZWRfdGVzdHNfLmJlZ2luKCk7CisgICAgICAgaXQgIT0gcmVnaXN0ZXJlZF90ZXN0c18uZW5kKCk7CisgICAgICAgKytpdCkgeworICAgIGlmICh0ZXN0cy5jb3VudChpdC0+Zmlyc3QpID09IDApIHsKKyAgICAgIGVycm9ycyA8PCAiWW91IGZvcmdvdCB0byBsaXN0IHRlc3QgIiA8PCBpdC0+Zmlyc3QgPDwgIi5cbiI7CisgICAgfQorICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yc19zdHIgPSBlcnJvcnMuR2V0U3RyaW5nKCk7CisgIGlmIChlcnJvcnNfc3RyICE9ICIiKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyAlcyIsIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLAorICAgICAgICAgICAgZXJyb3JzX3N0ci5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBwb3NpeDo6QWJvcnQoKTsKKyAgfQorCisgIHJldHVybiByZWdpc3RlcmVkX3Rlc3RzOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3MGU1YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3QuY2MKQEAgLTAsMCArMSw1Mzg2IEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx3Y2hhci5oPgorI2luY2x1ZGUgPHdjdHlwZS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmIEdURVNUX09TX0xJTlVYCisKKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gZ2V0dGltZW9mZGF5KCkuCisjIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisKKyMgaW5jbHVkZSA8ZmNudGwuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxsaW1pdHMuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzY2hlZC5oPiAgLy8gTk9MSU5UCisvLyBEZWNsYXJlcyB2c25wcmludGYoKS4gIFRoaXMgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KKyMgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy9tbWFuLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzdHJpbmc+CisKKyNlbGlmIEdURVNUX09TX1NZTUJJQU4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorCisjZWxpZiBHVEVTVF9PU19aT1MKKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorCisvLyBPbiB6L09TIHdlIGFkZGl0aW9uYWxseSBuZWVkIHN0cmluZ3MuaCBmb3Igc3RyY2FzZWNtcC4KKyMgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCisKKyNlbGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAvLyBXZSBhcmUgb24gV2luZG93cyBDRS4KKworIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyMgdW5kZWYgbWluCisKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIHByb3Blci4KKworIyBpbmNsdWRlIDxpby5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90aW1lYi5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBOT0xJTlQKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTX01JTkdXCisvLyBNaW5HVyBoYXMgZ2V0dGltZW9mZGF5KCkgYnV0IG5vdCBfZnRpbWU2NCgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyAgIGdldHRpbWVvZmRheSgpLgorLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgdGltZSBvbgorLy8gICBXaW5kb3dzLCBsaWtlIEdldFRpY2tDb3VudCgpIG9yIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCkuICBNaW5HVworLy8gICBzdXBwb3J0cyB0aGVzZS4gIGNvbnNpZGVyIHVzaW5nIHRoZW0gaW5zdGVhZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01JTkdXCisKKy8vIGNwcGxpbnQgdGhpbmtzIHRoYXQgdGhlIGhlYWRlciBpcyBhbHJlYWR5IGluY2x1ZGVkLCBzbyB3ZSB3YW50IHRvCisvLyBzaWxlbmNlIGl0LgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyMgdW5kZWYgbWluCisKKyNlbHNlCisKKy8vIEFzc3VtZSBvdGhlciBwbGF0Zm9ybXMgaGF2ZSBnZXR0aW1lb2ZkYXkoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gICBnZXR0aW1lb2ZkYXkoKS4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKworLy8gY3BwbGludCB0aGlua3MgdGhhdCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHdlIHdhbnQgdG8KKy8vIHNpbGVuY2UgaXQuCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyMgaW5jbHVkZSA8c3RkZXhjZXB0PgorI2VuZGlmCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordXNpbmcgaW50ZXJuYWw6OkNvdW50SWY7Cit1c2luZyBpbnRlcm5hbDo6Rm9yRWFjaDsKK3VzaW5nIGludGVybmFsOjpHZXRFbGVtZW50T3I7Cit1c2luZyBpbnRlcm5hbDo6U2h1ZmZsZTsKKworLy8gQ29uc3RhbnRzLgorCisvLyBBIHRlc3Qgd2hvc2UgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMKKy8vIGRpc2FibGVkIGFuZCBub3QgcnVuLgorc3RhdGljIGNvbnN0IGNoYXIga0Rpc2FibGVUZXN0RmlsdGVyW10gPSAiRElTQUJMRURfKjoqL0RJU0FCTEVEXyoiOworCisvLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMgY29uc2lkZXJlZCBhIGRlYXRoCisvLyB0ZXN0IGNhc2UgYW5kIHdpbGwgYmUgcnVuIGJlZm9yZSB0ZXN0IGNhc2VzIHdob3NlIG5hbWUgZG9lc24ndAorLy8gbWF0Y2ggdGhpcyBmaWx0ZXIuCitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0Q2FzZUZpbHRlcltdID0gIipEZWF0aFRlc3Q6KkRlYXRoVGVzdC8qIjsKKworLy8gQSB0ZXN0IGZpbHRlciB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZy4KK3N0YXRpYyBjb25zdCBjaGFyIGtVbml2ZXJzYWxGaWx0ZXJbXSA9ICIqIjsKKworLy8gVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9yIFhNTCBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdE91dHB1dEZpbGVbXSA9ICJ0ZXN0X2RldGFpbC54bWwiOworCisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgaW5kZXguCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkSW5kZXhbXSA9ICJHVEVTVF9TSEFSRF9JTkRFWCI7CisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0IHNoYXJkcy4KK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0VG90YWxTaGFyZHNbXSA9ICJHVEVTVF9UT1RBTF9TSEFSRFMiOworLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlLgorc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZFN0YXR1c0ZpbGVbXSA9ICJHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK2NvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXSA9ICJcblN0YWNrIHRyYWNlOlxuIjsKKworLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcworLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitib29sIGdfaGVscF9mbGFnID0gZmFsc2U7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitzdGF0aWMgY29uc3QgY2hhciogR2V0RGVmYXVsdEZpbHRlcigpIHsKKyNpZmRlZiBHVEVTVF9URVNUX0ZJTFRFUl9FTlZfVkFSXworICBjb25zdCBjaGFyKiBjb25zdCB0ZXN0YnJpZGdlX3Rlc3Rfb25seSA9IGdldGVudihHVEVTVF9URVNUX0ZJTFRFUl9FTlZfVkFSXyk7CisgIGlmICh0ZXN0YnJpZGdlX3Rlc3Rfb25seSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHRlc3RicmlkZ2VfdGVzdF9vbmx5OworICB9CisjZW5kaWYgIC8vIEdURVNUX1RFU1RfRklMVEVSX0VOVl9WQVJfCisgIHJldHVybiBrVW5pdmVyc2FsRmlsdGVyOworfQorCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwgZmFsc2UpLAorICAgICJSdW4gZGlzYWJsZWQgdGVzdHMgdG9vLCBpbiBhZGRpdGlvbiB0byB0aGUgdGVzdHMgbm9ybWFsbHkgYmVpbmcgcnVuLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgYnJlYWtfb25fZmFpbHVyZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYnJlYWtfb25fZmFpbHVyZSIsIGZhbHNlKSwKKyAgICAiVHJ1ZSBpZmYgYSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCBiZSBhIGRlYnVnZ2VyIGJyZWFrLXBvaW50LiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgY2F0Y2hfZXhjZXB0aW9ucywKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiY2F0Y2hfZXhjZXB0aW9ucyIsIHRydWUpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyB0ZXN0IGZhaWx1cmVzLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBjb2xvciwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJjb2xvciIsICJhdXRvIiksCisgICAgIldoZXRoZXIgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LiAgVmFsaWQgdmFsdWVzOiB5ZXMsIG5vLCAiCisgICAgImFuZCBhdXRvLiAgJ2F1dG8nIG1lYW5zIHRvIHVzZSBjb2xvcnMgaWYgdGhlIG91dHB1dCBpcyAiCisgICAgImJlaW5nIHNlbnQgdG8gYSB0ZXJtaW5hbCBhbmQgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgIgorICAgICJpcyBzZXQgdG8gYSB0ZXJtaW5hbCB0eXBlIHRoYXQgc3VwcG9ydHMgY29sb3JzLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBmaWx0ZXIsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZmlsdGVyIiwgR2V0RGVmYXVsdEZpbHRlcigpKSwKKyAgICAiQSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBnbG9iIChub3QgcmVnZXgpIHBhdHRlcm5zICIKKyAgICAiZm9yIGZpbHRlcmluZyB0aGUgdGVzdHMgdG8gcnVuLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgIgorICAgICInLScgYW5kIGEgOiBzZXBhcmF0ZWQgbGlzdCBvZiBuZWdhdGl2ZSBwYXR0ZXJucyAodGVzdHMgdG8gIgorICAgICJleGNsdWRlKS4gIEEgdGVzdCBpcyBydW4gaWYgaXQgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlICIKKyAgICAicGF0dGVybnMgYW5kIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgbmVnYXRpdmUgcGF0dGVybnMuIik7CisKK0dURVNUX0RFRklORV9ib29sXyhsaXN0X3Rlc3RzLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAiTGlzdCBhbGwgdGVzdHMgd2l0aG91dCBydW5uaW5nIHRoZW0uIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIG91dHB1dCwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJvdXRwdXQiLCAiIiksCisgICAgIkEgZm9ybWF0IChjdXJyZW50bHkgbXVzdCBiZSBcInhtbFwiKSwgb3B0aW9uYWxseSBmb2xsb3dlZCAiCisgICAgImJ5IGEgY29sb24gYW5kIGFuIG91dHB1dCBmaWxlIG5hbWUgb3IgZGlyZWN0b3J5LiBBIGRpcmVjdG9yeSAiCisgICAgImlzIGluZGljYXRlZCBieSBhIHRyYWlsaW5nIHBhdGhuYW1lIHNlcGFyYXRvci4gIgorICAgICJFeGFtcGxlczogXCJ4bWw6ZmlsZW5hbWUueG1sXCIsIFwieG1sOjpkaXJlY3RvcnluYW1lL1wiLiAiCisgICAgIklmIGEgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgb3V0cHV0IGZpbGVzIHdpbGwgYmUgY3JlYXRlZCAiCisgICAgIndpdGhpbiB0aGF0IGRpcmVjdG9yeSwgd2l0aCBmaWxlLW5hbWVzIGJhc2VkIG9uIHRoZSB0ZXN0ICIKKyAgICAiZXhlY3V0YWJsZSdzIG5hbWUgYW5kLCBpZiBuZWNlc3NhcnksIG1hZGUgdW5pcXVlIGJ5IGFkZGluZyAiCisgICAgImRpZ2l0cy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHByaW50X3RpbWUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInByaW50X3RpbWUiLCB0cnVlKSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXworICAgICIgc2hvdWxkIGRpc3BsYXkgZWxhcHNlZCB0aW1lIGluIHRleHQgb3V0cHV0LiIpOworCitHVEVTVF9ERUZJTkVfaW50MzJfKAorICAgIHJhbmRvbV9zZWVkLAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigicmFuZG9tX3NlZWQiLCAwKSwKKyAgICAiUmFuZG9tIG51bWJlciBzZWVkIHRvIHVzZSB3aGVuIHNodWZmbGluZyB0ZXN0IG9yZGVycy4gIE11c3QgYmUgaW4gcmFuZ2UgIgorICAgICJbMSwgOTk5OTldLCBvciAwIHRvIHVzZSBhIHNlZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZS4iKTsKKworR1RFU1RfREVGSU5FX2ludDMyXygKKyAgICByZXBlYXQsCisgICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyZXBlYXQiLCAxKSwKKyAgICAiSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IGVhY2ggdGVzdC4gIFNwZWNpZnkgYSBuZWdhdGl2ZSBudW1iZXIgIgorICAgICJmb3IgcmVwZWF0aW5nIGZvcmV2ZXIuICBVc2VmdWwgZm9yIHNoYWtpbmcgb3V0IGZsYWt5IHRlc3RzLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMsIGZhbHNlLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfICIgc2hvdWxkIGluY2x1ZGUgaW50ZXJuYWwgc3RhY2sgZnJhbWVzIHdoZW4gIgorICAgICJwcmludGluZyB0ZXN0IGZhaWx1cmUgc3RhY2sgdHJhY2VzLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgc2h1ZmZsZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigic2h1ZmZsZSIsIGZhbHNlKSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXworICAgICIgc2hvdWxkIHJhbmRvbWl6ZSB0ZXN0cycgb3JkZXIgb24gZXZlcnkgcnVuLiIpOworCitHVEVTVF9ERUZJTkVfaW50MzJfKAorICAgIHN0YWNrX3RyYWNlX2RlcHRoLAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigic3RhY2tfdHJhY2VfZGVwdGgiLCBrTWF4U3RhY2tUcmFjZURlcHRoKSwKKyAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBwcmludCB3aGVuIGFuICIKKyAgICAiYXNzZXJ0aW9uIGZhaWxzLiAgVGhlIHZhbGlkIHJhbmdlIGlzIDAgdGhyb3VnaCAxMDAsIGluY2x1c2l2ZS4iKTsKKworR1RFU1RfREVGSU5FX3N0cmluZ18oCisgICAgc3RyZWFtX3Jlc3VsdF90bywKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJzdHJlYW1fcmVzdWx0X3RvIiwgIiIpLAorICAgICJUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB0byBzdHJlYW0gIgorICAgICJ0ZXN0IHJlc3VsdHMuIEV4YW1wbGU6IFwibG9jYWxob3N0OjU1NVwiLiBUaGUgZmxhZyBpcyBlZmZlY3RpdmUgb25seSBvbiAiCisgICAgIkxpbnV4LiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgdGhyb3dfb25fZmFpbHVyZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigidGhyb3dfb25fZmFpbHVyZSIsIGZhbHNlKSwKKyAgICAiV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCBhIGZhaWxlZCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gIgorICAgICJpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhIG5vbi16ZXJvIGNvZGUgIgorICAgICJvdGhlcndpc2UuIik7CisKKyNpZiBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBmbGFnZmlsZSwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJmbGFnZmlsZSIsICIiKSwKKyAgICAiVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgZmxhZ2ZpbGUgdG8gcmVhZCBjb21tYW5kLWxpbmUgZmxhZ3MgZnJvbS4iKTsKKyNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKSwgdXNpbmcgYSBMaW5lYXIKKy8vIENvbmdydWVudGlhbCBHZW5lcmF0b3IgKExDRykuICBDcmFzaGVzIGlmICdyYW5nZScgaXMgMCBvciBncmVhdGVyCisvLyB0aGFuIGtNYXhSYW5nZS4KK1VJbnQzMiBSYW5kb206OkdlbmVyYXRlKFVJbnQzMiByYW5nZSkgeworICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHRoZSBzYW1lIGFzIGFyZSB1c2VkIGluIGdsaWJjJ3MgcmFuZCgzKS4KKyAgc3RhdGVfID0gKDExMDM1MTUyNDVVKnN0YXRlXyArIDEyMzQ1VSkgJSBrTWF4UmFuZ2U7CisKKyAgR1RFU1RfQ0hFQ0tfKHJhbmdlID4gMCkKKyAgICAgIDw8ICJDYW5ub3QgZ2VuZXJhdGUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLCAwKS4iOworICBHVEVTVF9DSEVDS18ocmFuZ2UgPD0ga01heFJhbmdlKQorICAgICAgPDwgIkdlbmVyYXRpb24gb2YgYSBudW1iZXIgaW4gWzAsICIgPDwgcmFuZ2UgPDwgIikgd2FzIHJlcXVlc3RlZCwgIgorICAgICAgPDwgImJ1dCB0aGlzIGNhbiBvbmx5IGdlbmVyYXRlIG51bWJlcnMgaW4gWzAsICIgPDwga01heFJhbmdlIDw8ICIpLiI7CisKKyAgLy8gQ29udmVydGluZyB2aWEgbW9kdWx1cyBpbnRyb2R1Y2VzIGEgYml0IG9mIGRvd253YXJkIGJpYXMsIGJ1dAorICAvLyBpdCdzIHNpbXBsZSwgYW5kIGEgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgaXNuJ3QgdG9vIGdvb2QKKyAgLy8gdG8gYmVnaW4gd2l0aC4KKyAgcmV0dXJuIHN0YXRlXyAlIHJhbmdlOworfQorCisvLyBHVGVzdElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBpbml0aWFsaXplZAorLy8gR29vZ2xlIFRlc3QuICBVc2VmdWwgZm9yIGNhdGNoaW5nIHRoZSB1c2VyIG1pc3Rha2Ugb2Ygbm90IGluaXRpYWxpemluZworLy8gR29vZ2xlIFRlc3QgYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLgorc3RhdGljIGJvb2wgR1Rlc3RJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gR2V0QXJndnMoKS5zaXplKCkgPiAwOyB9CisKKy8vIEl0ZXJhdGVzIG92ZXIgYSB2ZWN0b3Igb2YgVGVzdENhc2VzLCBrZWVwaW5nIGEgcnVubmluZyBzdW0gb2YgdGhlCisvLyByZXN1bHRzIG9mIGNhbGxpbmcgYSBnaXZlbiBpbnQtcmV0dXJuaW5nIG1ldGhvZCBvbiBlYWNoLgorLy8gUmV0dXJucyB0aGUgc3VtLgorc3RhdGljIGludCBTdW1PdmVyVGVzdENhc2VMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4mIGNhc2VfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKFRlc3RDYXNlOjoqbWV0aG9kKSgpIGNvbnN0KSB7CisgIGludCBzdW0gPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhc2VfbGlzdC5zaXplKCk7IGkrKykgeworICAgIHN1bSArPSAoY2FzZV9saXN0W2ldLT4qbWV0aG9kKSgpOworICB9CisgIHJldHVybiBzdW07Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuCitzdGF0aWMgYm9vbCBUZXN0Q2FzZVBhc3NlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPlBhc3NlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgZmFpbGVkLgorc3RhdGljIGJvb2wgVGVzdENhc2VGYWlsZWQoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9jYXNlLT5GYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0X2Nhc2UgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRlc3QgdGhhdCBzaG91bGQKKy8vIHJ1bi4KK3N0YXRpYyBib29sIFNob3VsZFJ1blRlc3RDYXNlKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpOworfQorCisvLyBBc3NlcnRIZWxwZXIgY29uc3RydWN0b3IuCitBc3NlcnRIZWxwZXI6OkFzc2VydEhlbHBlcihUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSkKKyAgICA6IGRhdGFfKG5ldyBBc3NlcnRIZWxwZXJEYXRhKHR5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpKSB7Cit9CisKK0Fzc2VydEhlbHBlcjo6fkFzc2VydEhlbHBlcigpIHsKKyAgZGVsZXRlIGRhdGFfOworfQorCisvLyBNZXNzYWdlIGFzc2lnbm1lbnQsIGZvciBhc3NlcnRpb24gc3RyZWFtaW5nIHN1cHBvcnQuCit2b2lkIEFzc2VydEhlbHBlcjo6b3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPgorICAgIEFkZFRlc3RQYXJ0UmVzdWx0KGRhdGFfLT50eXBlLCBkYXRhXy0+ZmlsZSwgZGF0YV8tPmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kVXNlck1lc3NhZ2UoZGF0YV8tPm1lc3NhZ2UsIG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCkKKyAgICAgICAgICAgICAgICAgICAgICAtPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSkKKyAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgZnVuY3Rpb24gaXRzZWxmLgorICAgICAgICAgICAgICAgICAgICAgICk7ICAvLyBOT0xJTlQKK30KKworLy8gTXV0ZXggZm9yIGxpbmtlZCBwb2ludGVycy4KK0dURVNUX0FQSV8gR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKKworLy8gQSBjb3B5IG9mIGFsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgU2V0IGJ5IEluaXRHb29nbGVUZXN0KCkuCis6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGdfYXJndnM7CisKK2NvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEFyZ3ZzKCkgeworI2lmIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0dFVF9BUkdWU18pCisgIHJldHVybiBHVEVTVF9DVVNUT01fR0VUX0FSR1ZTXygpOworI2Vsc2UgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0dFVF9BUkdWU18pCisgIHJldHVybiBnX2FyZ3ZzOworI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9HRVRfQVJHVlNfKQorfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uJ3MgbmFtZSwgcmVtb3ZpbmcgZGlyZWN0b3J5IHBhdGggaWYgdGhhdAorLy8gaXMgcHJlc2VudC4KK0ZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpIHsKKyAgRmlsZVBhdGggcmVzdWx0OworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICByZXN1bHQuU2V0KEZpbGVQYXRoKEdldEFyZ3ZzKClbMF0pLlJlbW92ZUV4dGVuc2lvbigiZXhlIikpOworI2Vsc2UKKyAgcmVzdWx0LlNldChGaWxlUGF0aChHZXRBcmd2cygpWzBdKSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gcmVzdWx0LlJlbW92ZURpcmVjdG9yeU5hbWUoKTsKK30KKworLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9vdXRwdXQgZmxhZy4KKworLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KK3N0ZDo6c3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOworICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkgcmV0dXJuIHN0ZDo6c3RyaW5nKCIiKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBjb2xvbiA9IHN0cmNocihndGVzdF9vdXRwdXRfZmxhZywgJzonKTsKKyAgcmV0dXJuIChjb2xvbiA9PSBOVUxMKSA/CisgICAgICBzdGQ6OnN0cmluZyhndGVzdF9vdXRwdXRfZmxhZykgOgorICAgICAgc3RkOjpzdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcsIGNvbG9uIC0gZ3Rlc3Rfb3V0cHV0X2ZsYWcpOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vbmUKKy8vIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KK3N0ZDo6c3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOworICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkKKyAgICByZXR1cm4gIiI7CisKKyAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7CisgIGlmIChjb2xvbiA9PSBOVUxMKQorICAgIHJldHVybiBpbnRlcm5hbDo6RmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoCisgICAgICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChrRGVmYXVsdE91dHB1dEZpbGUpKS5zdHJpbmcoKTsKKworICBpbnRlcm5hbDo6RmlsZVBhdGggb3V0cHV0X25hbWUoY29sb24gKyAxKTsKKyAgaWYgKCFvdXRwdXRfbmFtZS5Jc0Fic29sdXRlUGF0aCgpKQorICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIFxzb21lXHBhdGggaXMgbm90IGFuIGFic29sdXRlCisgICAgLy8gcGF0aCAoYXMgaXRzIG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBkcml2ZSksIHlldCB0aGUKKyAgICAvLyBmb2xsb3dpbmcgbG9naWMgZm9yIHR1cm5pbmcgaXQgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlzIHdyb25nLgorICAgIC8vIEZpeCBpdC4KKyAgICBvdXRwdXRfbmFtZSA9IGludGVybmFsOjpGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChjb2xvbiArIDEpKTsKKworICBpZiAoIW91dHB1dF9uYW1lLklzRGlyZWN0b3J5KCkpCisgICAgcmV0dXJuIG91dHB1dF9uYW1lLnN0cmluZygpOworCisgIGludGVybmFsOjpGaWxlUGF0aCByZXN1bHQoaW50ZXJuYWw6OkZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKAorICAgICAgb3V0cHV0X25hbWUsIGludGVybmFsOjpHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSwKKyAgICAgIEdldE91dHB1dEZvcm1hdCgpLmNfc3RyKCkpKTsKKyAgcmV0dXJuIHJlc3VsdC5zdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKKy8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuCisvLworLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCisvLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0LgorYm9vbCBVbml0VGVzdE9wdGlvbnM6OlBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyKSB7CisgIHN3aXRjaCAoKnBhdHRlcm4pIHsKKyAgICBjYXNlICdcMCc6CisgICAgY2FzZSAnOic6ICAvLyBFaXRoZXIgJzonIG9yICdcMCcgbWFya3MgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4KKyAgICAgIHJldHVybiAqc3RyID09ICdcMCc7CisgICAgY2FzZSAnPyc6ICAvLyBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAgcmV0dXJuICpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgICAgY2FzZSAnKic6ICAvLyBNYXRjaGVzIGFueSBzdHJpbmcgKHBvc3NpYmx5IGVtcHR5KSBvZiBjaGFyYWN0ZXJzLgorICAgICAgcmV0dXJuICgqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiwgc3RyICsgMSkpIHx8CisgICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0cik7CisgICAgZGVmYXVsdDogIC8vIE5vbi1zcGVjaWFsIGNoYXJhY3Rlci4gIE1hdGNoZXMgaXRzZWxmLgorICAgICAgcmV0dXJuICpwYXR0ZXJuID09ICpzdHIgJiYKKyAgICAgICAgICBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7CisgIH0KK30KKworYm9vbCBVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIGZpbHRlcikgeworICBjb25zdCBjaGFyICpjdXJfcGF0dGVybiA9IGZpbHRlcjsKKyAgZm9yICg7OykgeworICAgIGlmIChQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjdXJfcGF0dGVybiwgbmFtZS5jX3N0cigpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRmluZHMgdGhlIG5leHQgcGF0dGVybiBpbiB0aGUgZmlsdGVyLgorICAgIGN1cl9wYXR0ZXJuID0gc3RyY2hyKGN1cl9wYXR0ZXJuLCAnOicpOworCisgICAgLy8gUmV0dXJucyBpZiBubyBtb3JlIHBhdHRlcm4gY2FuIGJlIGZvdW5kLgorICAgIGlmIChjdXJfcGF0dGVybiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2tpcHMgdGhlIHBhdHRlcm4gc2VwYXJhdGVyICh0aGUgJzonIGNoYXJhY3RlcikuCisgICAgY3VyX3BhdHRlcm4rKzsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCisvLyBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgorYm9vbCBVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9uYW1lKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUgPSB0ZXN0X2Nhc2VfbmFtZSArICIuIiArIHRlc3RfbmFtZS5jX3N0cigpOworCisgIC8vIFNwbGl0IC0tZ3Rlc3RfZmlsdGVyIGF0ICctJywgaWYgdGhlcmUgaXMgb25lLCB0byBzZXBhcmF0ZSBpbnRvCisgIC8vIHBvc2l0aXZlIGZpbHRlciBhbmQgbmVnYXRpdmUgZmlsdGVyIHBvcnRpb25zCisgIGNvbnN0IGNoYXIqIGNvbnN0IHAgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3QgZGFzaCA9IHN0cmNocihwLCAnLScpOworICBzdGQ6OnN0cmluZyBwb3NpdGl2ZTsKKyAgc3RkOjpzdHJpbmcgbmVnYXRpdmU7CisgIGlmIChkYXNoID09IE5VTEwpIHsKKyAgICBwb3NpdGl2ZSA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOyAgLy8gV2hvbGUgc3RyaW5nIGlzIGEgcG9zaXRpdmUgZmlsdGVyCisgICAgbmVnYXRpdmUgPSAiIjsKKyAgfSBlbHNlIHsKKyAgICBwb3NpdGl2ZSA9IHN0ZDo6c3RyaW5nKHAsIGRhc2gpOyAgIC8vIEV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGRhc2gKKyAgICBuZWdhdGl2ZSA9IHN0ZDo6c3RyaW5nKGRhc2ggKyAxKTsgIC8vIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGRhc2gKKyAgICBpZiAocG9zaXRpdmUuZW1wdHkoKSkgeworICAgICAgLy8gVHJlYXQgJy10ZXN0MScgYXMgdGhlIHNhbWUgYXMgJyotdGVzdDEnCisgICAgICBwb3NpdGl2ZSA9IGtVbml2ZXJzYWxGaWx0ZXI7CisgICAgfQorICB9CisKKyAgLy8gQSBmaWx0ZXIgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucy4gIEl0IG1hdGNoZXMgYQorICAvLyB0ZXN0IGlmIGFueSBwYXR0ZXJuIGluIGl0IG1hdGNoZXMgdGhlIHRlc3QuCisgIHJldHVybiAoTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIHBvc2l0aXZlLmNfc3RyKCkpICYmCisgICAgICAgICAgIU1hdGNoZXNGaWx0ZXIoZnVsbF9uYW1lLCBuZWdhdGl2ZS5jX3N0cigpKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU0VICisvLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKKy8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLgorLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgYXMgYW4gX19leGNlcHQgY29uZGl0aW9uLgoraW50IFVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKSB7CisgIC8vIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgYSBTRUggZXhjZXB0aW9uIGlmOgorICAvLyAgIDEuIHRoZSB1c2VyIHdhbnRzIGl0IHRvLCBBTkQKKyAgLy8gICAyLiB0aGlzIGlzIG5vdCBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLCBBTkQKKyAgLy8gICAzLiB0aGlzIGlzIG5vdCBhIEMrKyBleGNlcHRpb24gKFZDKysgaW1wbGVtZW50cyB0aGVtIHZpYSBTRUgsCisgIC8vICAgICAgYXBwYXJlbnRseSkuCisgIC8vCisgIC8vIFNFSCBleGNlcHRpb24gY29kZSBmb3IgQysrIGV4Y2VwdGlvbnMuCisgIC8vIChzZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xODUyOTQgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgorICBjb25zdCBEV09SRCBrQ3h4RXhjZXB0aW9uQ29kZSA9IDB4ZTA2ZDczNjM7CisKKyAgYm9vbCBzaG91bGRfaGFuZGxlID0gdHJ1ZTsKKworICBpZiAoIUdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpCisgICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOworICBlbHNlIGlmIChleGNlcHRpb25fY29kZSA9PSBFWENFUFRJT05fQlJFQUtQT0lOVCkKKyAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7CisgIGVsc2UgaWYgKGV4Y2VwdGlvbl9jb2RlID09IGtDeHhFeGNlcHRpb25Db2RlKQorICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKKworICByZXR1cm4gc2hvdWxkX2hhbmRsZSA/IEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgOiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKKy8vIHJlc3VsdHMuIEludGVyY2VwdHMgb25seSBmYWlsdXJlcyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZC4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpCisgICAgOiBpbnRlcmNlcHRfbW9kZV8oSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQpLAorICAgICAgcmVzdWx0XyhyZXN1bHQpIHsKKyAgSW5pdCgpOworfQorCisvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKKy8vIHJlc3VsdHMuCitTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZSwgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KQorICAgIDogaW50ZXJjZXB0X21vZGVfKGludGVyY2VwdF9tb2RlKSwKKyAgICAgIHJlc3VsdF8ocmVzdWx0KSB7CisgIEluaXQoKTsKK30KKwordm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SW5pdCgpIHsKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaWYgKGludGVyY2VwdF9tb2RlXyA9PSBJTlRFUkNFUFRfQUxMX1RIUkVBRFMpIHsKKyAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOworICAgIGltcGwtPlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIodGhpcyk7CisgIH0gZWxzZSB7CisgICAgb2xkX3JlcG9ydGVyXyA9IGltcGwtPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7CisgICAgaW1wbC0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQodGhpcyk7CisgIH0KK30KKworLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkgR29vZ2xlIFRlc3QKKy8vIGJlZm9yZS4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjp+U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGlmIChpbnRlcmNlcHRfbW9kZV8gPT0gSU5URVJDRVBUX0FMTF9USFJFQURTKSB7CisgICAgaW1wbC0+U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihvbGRfcmVwb3J0ZXJfKTsKKyAgfSBlbHNlIHsKKyAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZChvbGRfcmVwb3J0ZXJfKTsKKyAgfQorfQorCisvLyBJbmNyZW1lbnRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IGNvdW50IGFuZCByZW1lbWJlcnMgdGhlIHJlc3VsdC4KKy8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgaW50ZXJmYWNlLgordm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXN1bHRfLT5BcHBlbmQocmVzdWx0KTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUmV0dXJucyB0aGUgdHlwZSBJRCBvZiA6OnRlc3Rpbmc6OlRlc3QuICBXZSBzaG91bGQgYWx3YXlzIGNhbGwgdGhpcworLy8gaW5zdGVhZCBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKKy8vIHRlc3Rpbmc6OlRlc3QuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGEgc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbgorLy8gdXNpbmcgR29vZ2xlIFRlc3QgYXMgYSBmcmFtZXdvcmsgb24gTWFjIE9TIFguICBUaGUgYnVnIGNhdXNlcworLy8gR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgZGVwZW5kaW5nCisvLyBvbiB3aGV0aGVyIHRoZSBjYWxsIGlzIGZyb20gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yayBpdHNlbGYgb3IKKy8vIGZyb20gdXNlciB0ZXN0IGNvZGUuICBHZXRUZXN0VHlwZUlkKCkgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMKKy8vIHJldHVybiB0aGUgc2FtZSB2YWx1ZSwgYXMgaXQgYWx3YXlzIGNhbGxzIEdldFR5cGVJZDw+KCkgZnJvbSB0aGUKKy8vIGd0ZXN0LmNjLCB3aGljaCBpcyB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yay4KK1R5cGVJZCBHZXRUZXN0VHlwZUlkKCkgeworICByZXR1cm4gR2V0VHlwZUlkPFRlc3Q+KCk7Cit9CisKKy8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QKKy8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuCitleHRlcm4gY29uc3QgVHlwZUlkIGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0ID0gR2V0VGVzdFR5cGVJZCgpOworCisvLyBUaGlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIgY2hlY2tzIHRoYXQgJ3Jlc3VsdHMnIGNvbnRhaW5zIGEgdGVzdCBwYXJ0CisvLyBmYWlsdXJlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMgdGhlCisvLyBnaXZlbiBzdWJzdHJpbmcuCitBc3NlcnRpb25SZXN1bHQgSGFzT25lRmFpbHVyZShjb25zdCBjaGFyKiAvKiByZXN1bHRzX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiB0eXBlX2V4cHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBzdWJzdHJfZXhwciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkmIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWQodHlwZSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBmYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBub24tZmF0YWwgZmFpbHVyZSIpOworICBNZXNzYWdlIG1zZzsKKyAgaWYgKHJlc3VsdHMuc2l6ZSgpICE9IDEpIHsKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IHJlc3VsdHMuc2l6ZSgpIDw8ICIgZmFpbHVyZXMiOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgeworICAgICAgbXNnIDw8ICJcbiIgPDwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICB9CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCYgciA9IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCk7CisgIGlmIChyLnR5cGUoKSAhPSB0eXBlKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIGlmIChzdHJzdHIoci5tZXNzYWdlKCksIHN1YnN0ci5jX3N0cigpKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBjb250YWluaW5nIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3Vic3RyIDw8ICJcIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKKy8vIFRoZSBjb25zdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciByZW1lbWJlcnMgd2hlcmUgdG8gbG9vayB1cAorLy8gdGVzdCBwYXJ0IHJlc3VsdHMsIHdoYXQgdHlwZSBvZiBmYWlsdXJlIHdlIGV4cGVjdCwgYW5kIHdoYXQKKy8vIHN1YnN0cmluZyB0aGUgZmFpbHVyZSBtZXNzYWdlIHNob3VsZCBjb250YWluLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6OiBTaW5nbGVGYWlsdXJlQ2hlY2tlcigKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpCisgICAgOiByZXN1bHRzXyhyZXN1bHRzKSwKKyAgICAgIHR5cGVfKHR5cGUpLAorICAgICAgc3Vic3RyXyhzdWJzdHIpIHt9CisKKy8vIFRoZSBkZXN0cnVjdG9yIG9mIFNpbmdsZUZhaWx1cmVDaGVja2VyIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCisvLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQorLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCitTaW5nbGVGYWlsdXJlQ2hlY2tlcjo6flNpbmdsZUZhaWx1cmVDaGVja2VyKCkgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKEhhc09uZUZhaWx1cmUsICpyZXN1bHRzXywgdHlwZV8sIHN1YnN0cl8pOworfQorCitEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5BZGRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworICB1bml0X3Rlc3RfLT5saXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKS0+T25UZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCitEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCisvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK1Rlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCitVbml0VGVzdEltcGw6OkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgcmV0dXJuIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworfQorCisvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8gPSByZXBvcnRlcjsKK30KKworLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoKK1VuaXRUZXN0SW1wbDo6R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSB7CisgIHJldHVybiBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLmdldCgpOworfQorCisvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpIHsKKyAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5zZXQocmVwb3J0ZXIpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZVBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZUZhaWxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFNob3VsZFJ1blRlc3RDYXNlKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgoraW50IFVuaXRUZXN0SW1wbDo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRlc3RDYXNlOjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCitpbnQgVW5pdFRlc3RJbXBsOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnJlcG9ydGFibGVfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0b3RhbF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdEltcGw6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCisvLworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKy8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKy8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisvLyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorLy8gdHJhY2UgYnV0IEJhcigpIGFuZCBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitzdGQ6OnN0cmluZyBVbml0VGVzdEltcGw6OkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIHsKKyAgcmV0dXJuIG9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5DdXJyZW50U3RhY2tUcmFjZSgKKyAgICAgIHN0YXRpY19jYXN0PGludD4oR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpLAorICAgICAgc2tpcF9jb3VudCArIDEKKyAgICAgIC8vIFNraXBzIHRoZSB1c2VyLXNwZWNpZmllZCBudW1iZXIgb2YgZnJhbWVzIHBsdXMgdGhpcyBmdW5jdGlvbgorICAgICAgLy8gaXRzZWxmLgorICAgICAgKTsgIC8vIE5PTElOVAorfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorVGltZUluTWlsbGlzIEdldFRpbWVJbk1pbGxpcygpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgLy8gRGlmZmVyZW5jZSBiZXR3ZWVuIDE5NzAtMDEtMDEgYW5kIDE2MDEtMDEtMDEgaW4gbWlsbGlzZWNvbmRzLgorICAvLyBodHRwOi8vYW5hbG9nb3VzLmJsb2dzcG90LmNvbS8yMDA1LzA0L2Vwb2NoLmh0bWwKKyAgY29uc3QgVGltZUluTWlsbGlzIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGEgPQorICAgIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4oMTE2NDQ0NzM2VUwpICogMTAwMDAwVUw7CisgIGNvbnN0IERXT1JEIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQgPSAxMDAwMDsKKworICBTWVNURU1USU1FIG5vd19zeXN0aW1lOworICBGSUxFVElNRSBub3dfZmlsZXRpbWU7CisgIFVMQVJHRV9JTlRFR0VSIG5vd19pbnQ2NDsKKyAgLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFNob3VsZG4ndCB0aGlzIGp1c3QgdXNlCisgIC8vICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoKT8KKyAgR2V0U3lzdGVtVGltZSgmbm93X3N5c3RpbWUpOworICBpZiAoU3lzdGVtVGltZVRvRmlsZVRpbWUoJm5vd19zeXN0aW1lLCAmbm93X2ZpbGV0aW1lKSkgeworICAgIG5vd19pbnQ2NC5Mb3dQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3TG93RGF0ZVRpbWU7CisgICAgbm93X2ludDY0LkhpZ2hQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3SGlnaERhdGVUaW1lOworICAgIG5vd19pbnQ2NC5RdWFkUGFydCA9IChub3dfaW50NjQuUXVhZFBhcnQgLyBrVGVudGhNaWNyb3NJbk1pbGxpU2Vjb25kKSAtCisgICAgICBrSmF2YUVwb2NoVG9XaW5GaWxlVGltZURlbHRhOworICAgIHJldHVybiBub3dfaW50NjQuUXVhZFBhcnQ7CisgIH0KKyAgcmV0dXJuIDA7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9IQVNfR0VUVElNRU9GREFZXworICBfX3RpbWViNjQgbm93OworCisgIC8vIE1TVkMgOCBkZXByZWNhdGVzIF9mdGltZTY0KCksIHNvIHdlIHdhbnQgdG8gc3VwcHJlc3Mgd2FybmluZyA0OTk2CisgIC8vIChkZXByZWNhdGVkIGZ1bmN0aW9uKSB0aGVyZS4KKyAgLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBHZXRUaWNrQ291bnQoKT8gIE9yIHVzZQorICAvLyAgIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKCkKKyAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDk5NikKKyAgX2Z0aW1lNjQoJm5vdyk7CisgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQorCisgIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50aW1lKSAqIDEwMDAgKyBub3cubWlsbGl0bTsKKyNlbGlmIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCisgIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPihub3cudHZfc2VjKSAqIDEwMDAgKyBub3cudHZfdXNlYyAvIDEwMDA7CisjZWxzZQorIyBlcnJvciAiRG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgb24geW91ciBzeXN0ZW0uIgorI2VuZGlmCit9CisKKy8vIFV0aWxpdGllcworCisvLyBjbGFzcyBTdHJpbmcuCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZworLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorLy8gaW5wdXQgaXMgTlVMTC4KK0xQQ1dTVFIgU3RyaW5nOjpBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBhbnNpKSB7CisgIGlmICghYW5zaSkgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBsZW5ndGggPSBzdHJsZW4oYW5zaSk7CisgIGNvbnN0IGludCB1bmljb2RlX2xlbmd0aCA9CisgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKKyAgV0NIQVIqIHVuaWNvZGUgPSBuZXcgV0NIQVJbdW5pY29kZV9sZW5ndGggKyAxXTsKKyAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCB1bmljb2RlX2xlbmd0aCk7CisgIHVuaWNvZGVbdW5pY29kZV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIHVuaWNvZGU7Cit9CisKKy8vIENyZWF0ZXMgYW4gQU5TSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcsIGFsbG9jYXRpbmcKKy8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKy8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKy8vIGlucHV0IGlzIE5VTEwuCitjb25zdCBjaGFyKiBTdHJpbmc6OlV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKSAgeworICBpZiAoIXV0ZjE2X3N0cikgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBhbnNpX2xlbmd0aCA9CisgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgIGNoYXIqIGFuc2kgPSBuZXcgY2hhclthbnNpX2xlbmd0aCArIDFdOworICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICBhbnNpLCBhbnNpX2xlbmd0aCwgTlVMTCwgTlVMTCk7CisgIGFuc2lbYW5zaV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIGFuc2k7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisvLworLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTAorLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmICggbGhzID09IE5VTEwgKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKCByaHMgPT0gTlVMTCApIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gc3RyY21wKGxocywgcmhzKSA9PSAwOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBDb252ZXJ0cyBhbiBhcnJheSBvZiB3aWRlIGNoYXJzIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoZSBnaXZlbiBNZXNzYWdlIG9iamVjdC4KK3N0YXRpYyB2b2lkIFN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZShjb25zdCB3Y2hhcl90KiB3c3RyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1zZykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBsZW5ndGg7ICkgeyAgLy8gTk9MSU5UCisgICAgaWYgKHdzdHJbaV0gIT0gTCdcMCcpIHsKKyAgICAgICptc2cgPDwgV2lkZVN0cmluZ1RvVXRmOCh3c3RyICsgaSwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGggLSBpKSk7CisgICAgICB3aGlsZSAoaSAhPSBsZW5ndGggJiYgd3N0cltpXSAhPSBMJ1wwJykKKyAgICAgICAgaSsrOworICAgIH0gZWxzZSB7CisgICAgICAqbXNnIDw8ICdcMCc7CisgICAgICBpKys7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCit2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY2hhciBkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+KiBkZXN0KSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IHBhcnNlZDsKKyAgOjpzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7CisgIHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBzdHIuZmluZChkZWxpbWl0ZXIsIHBvcyk7CisgICAgaWYgKGNvbG9uID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhcnNlZC5wdXNoX2JhY2soc3RyLnN1YnN0cihwb3MpKTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBwYXJzZWQucHVzaF9iYWNrKHN0ci5zdWJzdHIocG9zLCBjb2xvbiAtIHBvcykpOworICAgICAgcG9zID0gY29sb24gKyAxOworICAgIH0KKyAgfQorICBkZXN0LT5zd2FwKHBhcnNlZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IE1lc3NhZ2UuCisvLyBXZSBhbGxvY2F0ZSB0aGUgc3RyaW5nc3RyZWFtIHNlcGFyYXRlbHkgYmVjYXVzZSBvdGhlcndpc2UgZWFjaCB1c2Ugb2YKKy8vIEFTU0VSVC9FWFBFQ1QgaW4gYSBwcm9jZWR1cmUgYWRkcyBvdmVyIDIwMCBieXRlcyB0byB0aGUgcHJvY2VkdXJlJ3MKKy8vIHN0YWNrIGZyYW1lIGxlYWRpbmcgdG8gaHVnZSBzdGFjayBmcmFtZXMgaW4gc29tZSBjYXNlczsgZ2NjIGRvZXMgbm90IHJldXNlCisvLyB0aGUgc3RhY2sgc3BhY2UuCitNZXNzYWdlOjpNZXNzYWdlKCkgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsKKyAgLy8gQnkgZGVmYXVsdCwgd2Ugd2FudCB0aGVyZSB0byBiZSBlbm91Z2ggcHJlY2lzaW9uIHdoZW4gcHJpbnRpbmcKKyAgLy8gYSBkb3VibGUgdG8gYSBNZXNzYWdlLgorICAqc3NfIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAyKTsKK30KKworLy8gVGhlc2UgdHdvIG92ZXJsb2FkcyBhbGxvdyBzdHJlYW1pbmcgYSB3aWRlIEMgc3RyaW5nIHRvIGEgTWVzc2FnZQorLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cikgeworICByZXR1cm4gKnRoaXMgPDwgaW50ZXJuYWw6OlN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKHdpZGVfY19zdHIpOworfQorTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwod2NoYXJfdCogd2lkZV9jX3N0cikgeworICByZXR1cm4gKnRoaXMgPDwgaW50ZXJuYWw6OlN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKHdpZGVfY19zdHIpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KK01lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKSB7CisgIGludGVybmFsOjpTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2Uod3N0ci5jX3N0cigpLCB3c3RyLmxlbmd0aCgpLCB0aGlzKTsKKyAgcmV0dXJuICp0aGlzOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCitNZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCA6OndzdHJpbmcmIHdzdHIpIHsKKyAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOworICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBHZXRzIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IHNvIGZhciBhcyBhbiBzdGQ6OnN0cmluZy4KKy8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorc3RkOjpzdHJpbmcgTWVzc2FnZTo6R2V0U3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gaW50ZXJuYWw6OlN0cmluZ1N0cmVhbVRvU3RyaW5nKHNzXy5nZXQoKSk7Cit9CisKKy8vIEFzc2VydGlvblJlc3VsdCBjb25zdHJ1Y3RvcnMuCisvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcikKKyAgICA6IHN1Y2Nlc3NfKG90aGVyLnN1Y2Nlc3NfKSwKKyAgICAgIG1lc3NhZ2VfKG90aGVyLm1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPworICAgICAgICAgICAgICAgbmV3IDo6c3RkOjpzdHJpbmcoKm90aGVyLm1lc3NhZ2VfKSA6CisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KE5VTEwpKSB7Cit9CisKKy8vIFN3YXBzIHR3byBBc3NlcnRpb25SZXN1bHRzLgordm9pZCBBc3NlcnRpb25SZXN1bHQ6OnN3YXAoQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcikgeworICB1c2luZyBzdGQ6OnN3YXA7CisgIHN3YXAoc3VjY2Vzc18sIG90aGVyLnN1Y2Nlc3NfKTsKKyAgc3dhcChtZXNzYWdlXywgb3RoZXIubWVzc2FnZV8pOworfQorCisvLyBSZXR1cm5zIHRoZSBhc3NlcnRpb24ncyBuZWdhdGlvbi4gVXNlZCB3aXRoIEVYUEVDVC9BU1NFUlRfRkFMU0UuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uUmVzdWx0OjpvcGVyYXRvciEoKSBjb25zdCB7CisgIEFzc2VydGlvblJlc3VsdCBuZWdhdGlvbighc3VjY2Vzc18pOworICBpZiAobWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCkKKyAgICBuZWdhdGlvbiA8PCAqbWVzc2FnZV87CisgIHJldHVybiBuZWdhdGlvbjsKK30KKworLy8gTWFrZXMgYSBzdWNjZXNzZnVsIGFzc2VydGlvbiByZXN1bHQuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpIHsKKyAgcmV0dXJuIEFzc2VydGlvblJlc3VsdCh0cnVlKTsKK30KKworLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCkgeworICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KGZhbHNlKTsKK30KKworLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBmYWlsdXJlIG1lc3NhZ2UuCisvLyBEZXByZWNhdGVkOyB1c2UgQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2UuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbWVzc2FnZTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlIGVkaXRfZGlzdGFuY2Ugeworc3RkOjp2ZWN0b3I8RWRpdFR5cGU+IENhbGN1bGF0ZU9wdGltYWxFZGl0cyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiByaWdodCkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxkb3VibGU+ID4gY29zdHMoCisgICAgICBsZWZ0LnNpemUoKSArIDEsIHN0ZDo6dmVjdG9yPGRvdWJsZT4ocmlnaHQuc2l6ZSgpICsgMSkpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxFZGl0VHlwZT4gPiBiZXN0X21vdmUoCisgICAgICBsZWZ0LnNpemUoKSArIDEsIHN0ZDo6dmVjdG9yPEVkaXRUeXBlPihyaWdodC5zaXplKCkgKyAxKSk7CisKKyAgLy8gUG9wdWxhdGUgZm9yIGVtcHR5IHJpZ2h0LgorICBmb3IgKHNpemVfdCBsX2kgPSAwOyBsX2kgPCBjb3N0cy5zaXplKCk7ICsrbF9pKSB7CisgICAgY29zdHNbbF9pXVswXSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obF9pKTsKKyAgICBiZXN0X21vdmVbbF9pXVswXSA9IGtSZW1vdmU7CisgIH0KKyAgLy8gUG9wdWxhdGUgZm9yIGVtcHR5IGxlZnQuCisgIGZvciAoc2l6ZV90IHJfaSA9IDE7IHJfaSA8IGNvc3RzWzBdLnNpemUoKTsgKytyX2kpIHsKKyAgICBjb3N0c1swXVtyX2ldID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihyX2kpOworICAgIGJlc3RfbW92ZVswXVtyX2ldID0ga0FkZDsKKyAgfQorCisgIGZvciAoc2l6ZV90IGxfaSA9IDA7IGxfaSA8IGxlZnQuc2l6ZSgpOyArK2xfaSkgeworICAgIGZvciAoc2l6ZV90IHJfaSA9IDA7IHJfaSA8IHJpZ2h0LnNpemUoKTsgKytyX2kpIHsKKyAgICAgIGlmIChsZWZ0W2xfaV0gPT0gcmlnaHRbcl9pXSkgeworICAgICAgICAvLyBGb3VuZCBhIG1hdGNoLiBDb25zdW1lIGl0LgorICAgICAgICBjb3N0c1tsX2kgKyAxXVtyX2kgKyAxXSA9IGNvc3RzW2xfaV1bcl9pXTsKKyAgICAgICAgYmVzdF9tb3ZlW2xfaSArIDFdW3JfaSArIDFdID0ga01hdGNoOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgY29uc3QgZG91YmxlIGFkZCA9IGNvc3RzW2xfaSArIDFdW3JfaV07CisgICAgICBjb25zdCBkb3VibGUgcmVtb3ZlID0gY29zdHNbbF9pXVtyX2kgKyAxXTsKKyAgICAgIGNvbnN0IGRvdWJsZSByZXBsYWNlID0gY29zdHNbbF9pXVtyX2ldOworICAgICAgaWYgKGFkZCA8IHJlbW92ZSAmJiBhZGQgPCByZXBsYWNlKSB7CisgICAgICAgIGNvc3RzW2xfaSArIDFdW3JfaSArIDFdID0gYWRkICsgMTsKKyAgICAgICAgYmVzdF9tb3ZlW2xfaSArIDFdW3JfaSArIDFdID0ga0FkZDsKKyAgICAgIH0gZWxzZSBpZiAocmVtb3ZlIDwgYWRkICYmIHJlbW92ZSA8IHJlcGxhY2UpIHsKKyAgICAgICAgY29zdHNbbF9pICsgMV1bcl9pICsgMV0gPSByZW1vdmUgKyAxOworICAgICAgICBiZXN0X21vdmVbbF9pICsgMV1bcl9pICsgMV0gPSBrUmVtb3ZlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UgbWFrZSByZXBsYWNlIGEgbGl0dGxlIG1vcmUgZXhwZW5zaXZlIHRoYW4gYWRkL3JlbW92ZSB0byBsb3dlcgorICAgICAgICAvLyB0aGVpciBwcmlvcml0eS4KKyAgICAgICAgY29zdHNbbF9pICsgMV1bcl9pICsgMV0gPSByZXBsYWNlICsgMS4wMDAwMTsKKyAgICAgICAgYmVzdF9tb3ZlW2xfaSArIDFdW3JfaSArIDFdID0ga1JlcGxhY2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUmVjb25zdHJ1Y3QgdGhlIGJlc3QgcGF0aC4gV2UgZG8gaXQgaW4gcmV2ZXJzZSBvcmRlci4KKyAgc3RkOjp2ZWN0b3I8RWRpdFR5cGU+IGJlc3RfcGF0aDsKKyAgZm9yIChzaXplX3QgbF9pID0gbGVmdC5zaXplKCksIHJfaSA9IHJpZ2h0LnNpemUoKTsgbF9pID4gMCB8fCByX2kgPiAwOykgeworICAgIEVkaXRUeXBlIG1vdmUgPSBiZXN0X21vdmVbbF9pXVtyX2ldOworICAgIGJlc3RfcGF0aC5wdXNoX2JhY2sobW92ZSk7CisgICAgbF9pIC09IG1vdmUgIT0ga0FkZDsKKyAgICByX2kgLT0gbW92ZSAhPSBrUmVtb3ZlOworICB9CisgIHN0ZDo6cmV2ZXJzZShiZXN0X3BhdGguYmVnaW4oKSwgYmVzdF9wYXRoLmVuZCgpKTsKKyAgcmV0dXJuIGJlc3RfcGF0aDsKK30KKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGNsYXNzIHRvIGNvbnZlcnQgc3RyaW5nIGludG8gaWRzIHdpdGggZGVkdXBsaWNhdGlvbi4KK2NsYXNzIEludGVybmFsU3RyaW5ncyB7CisgcHVibGljOgorICBzaXplX3QgR2V0SWQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIElkTWFwOjppdGVyYXRvciBpdCA9IGlkc18uZmluZChzdHIpOworICAgIGlmIChpdCAhPSBpZHNfLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZDsKKyAgICBzaXplX3QgaWQgPSBpZHNfLnNpemUoKTsKKyAgICByZXR1cm4gaWRzX1tzdHJdID0gaWQ7CisgIH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHNpemVfdD4gSWRNYXA7CisgIElkTWFwIGlkc187Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjp2ZWN0b3I8RWRpdFR5cGU+IENhbGN1bGF0ZU9wdGltYWxFZGl0cygKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGxlZnQsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByaWdodCkgeworICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGxlZnRfaWRzLCByaWdodF9pZHM7CisgIHsKKyAgICBJbnRlcm5hbFN0cmluZ3MgaW50ZXJuX3RhYmxlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVmdC5zaXplKCk7ICsraSkgeworICAgICAgbGVmdF9pZHMucHVzaF9iYWNrKGludGVybl90YWJsZS5HZXRJZChsZWZ0W2ldKSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmlnaHQuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHJpZ2h0X2lkcy5wdXNoX2JhY2soaW50ZXJuX3RhYmxlLkdldElkKHJpZ2h0W2ldKSk7CisgICAgfQorICB9CisgIHJldHVybiBDYWxjdWxhdGVPcHRpbWFsRWRpdHMobGVmdF9pZHMsIHJpZ2h0X2lkcyk7Cit9CisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBjbGFzcyB0aGF0IGhvbGRzIHRoZSBzdGF0ZSBmb3Igb25lIGh1bmsgYW5kIHByaW50cyBpdCBvdXQgdG8gdGhlCisvLyBzdHJlYW0uCisvLyBJdCByZW9yZGVycyBhZGRzL3JlbW92ZXMgd2hlbiBwb3NzaWJsZSB0byBncm91cCBhbGwgcmVtb3ZlcyBiZWZvcmUgYWxsCisvLyBhZGRzLiBJdCBhbHNvIGFkZHMgdGhlIGh1bmsgaGVhZGVyIGJlZm9yZSBwcmludGludCBpbnRvIHRoZSBzdHJlYW0uCitjbGFzcyBIdW5rIHsKKyBwdWJsaWM6CisgIEh1bmsoc2l6ZV90IGxlZnRfc3RhcnQsIHNpemVfdCByaWdodF9zdGFydCkKKyAgICAgIDogbGVmdF9zdGFydF8obGVmdF9zdGFydCksCisgICAgICAgIHJpZ2h0X3N0YXJ0XyhyaWdodF9zdGFydCksCisgICAgICAgIGFkZHNfKCksCisgICAgICAgIHJlbW92ZXNfKCksCisgICAgICAgIGNvbW1vbl8oKSB7fQorCisgIHZvaWQgUHVzaExpbmUoY2hhciBlZGl0LCBjb25zdCBjaGFyKiBsaW5lKSB7CisgICAgc3dpdGNoIChlZGl0KSB7CisgICAgICBjYXNlICcgJzoKKyAgICAgICAgKytjb21tb25fOworICAgICAgICBGbHVzaEVkaXRzKCk7CisgICAgICAgIGh1bmtfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcignICcsIGxpbmUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICctJzoKKyAgICAgICAgKytyZW1vdmVzXzsKKyAgICAgICAgaHVua19yZW1vdmVzXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoJy0nLCBsaW5lKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnKyc6CisgICAgICAgICsrYWRkc187CisgICAgICAgIGh1bmtfYWRkc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCcrJywgbGluZSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICB2b2lkIFByaW50VG8oc3RkOjpvc3RyZWFtKiBvcykgeworICAgIFByaW50SGVhZGVyKG9zKTsKKyAgICBGbHVzaEVkaXRzKCk7CisgICAgZm9yIChzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNoYXIsIGNvbnN0IGNoYXIqPiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgaHVua18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGh1bmtfLmVuZCgpOyArK2l0KSB7CisgICAgICAqb3MgPDwgaXQtPmZpcnN0IDw8IGl0LT5zZWNvbmQgPDwgIlxuIjsKKyAgICB9CisgIH0KKworICBib29sIGhhc19lZGl0cygpIGNvbnN0IHsgcmV0dXJuIGFkZHNfIHx8IHJlbW92ZXNfOyB9CisKKyBwcml2YXRlOgorICB2b2lkIEZsdXNoRWRpdHMoKSB7CisgICAgaHVua18uc3BsaWNlKGh1bmtfLmVuZCgpLCBodW5rX3JlbW92ZXNfKTsKKyAgICBodW5rXy5zcGxpY2UoaHVua18uZW5kKCksIGh1bmtfYWRkc18pOworICB9CisKKyAgLy8gUHJpbnQgYSB1bmlmaWVkIGRpZmYgaGVhZGVyIGZvciBvbmUgaHVuay4KKyAgLy8gVGhlIGZvcm1hdCBpcworICAvLyAgICJAQCAtPGxlZnRfc3RhcnQ+LDxsZWZ0X2xlbmd0aD4gKzxyaWdodF9zdGFydD4sPHJpZ2h0X2xlbmd0aD4gQEAiCisgIC8vIHdoZXJlIHRoZSBsZWZ0L3JpZ2h0IHBhcnRzIGFyZSBvbW1pdHRlZCBpZiB1bm5lY2Vzc2FyeS4KKyAgdm9pZCBQcmludEhlYWRlcihzdGQ6Om9zdHJlYW0qIHNzKSBjb25zdCB7CisgICAgKnNzIDw8ICJAQCAiOworICAgIGlmIChyZW1vdmVzXykgeworICAgICAgKnNzIDw8ICItIiA8PCBsZWZ0X3N0YXJ0XyA8PCAiLCIgPDwgKHJlbW92ZXNfICsgY29tbW9uXyk7CisgICAgfQorICAgIGlmIChyZW1vdmVzXyAmJiBhZGRzXykgeworICAgICAgKnNzIDw8ICIgIjsKKyAgICB9CisgICAgaWYgKGFkZHNfKSB7CisgICAgICAqc3MgPDwgIisiIDw8IHJpZ2h0X3N0YXJ0XyA8PCAiLCIgPDwgKGFkZHNfICsgY29tbW9uXyk7CisgICAgfQorICAgICpzcyA8PCAiIEBAXG4iOworICB9CisKKyAgc2l6ZV90IGxlZnRfc3RhcnRfLCByaWdodF9zdGFydF87CisgIHNpemVfdCBhZGRzXywgcmVtb3Zlc18sIGNvbW1vbl87CisgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y2hhciwgY29uc3QgY2hhcio+ID4gaHVua18sIGh1bmtfYWRkc18sIGh1bmtfcmVtb3Zlc187Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQ3JlYXRlIGEgbGlzdCBvZiBkaWZmIGh1bmtzIGluIFVuaWZpZWQgZGlmZiBmb3JtYXQuCisvLyBFYWNoIGh1bmsgaGFzIGEgaGVhZGVyIGdlbmVyYXRlZCBieSBQcmludEhlYWRlciBhYm92ZSBwbHVzIGEgYm9keSB3aXRoCisvLyBsaW5lcyBwcmVmaXhlZCB3aXRoICcgJyBmb3Igbm8gY2hhbmdlLCAnLScgZm9yIGRlbGV0aW9uIGFuZCAnKycgZm9yCisvLyBhZGRpdGlvbi4KKy8vICdjb250ZXh0JyByZXByZXNlbnRzIHRoZSBkZXNpcmVkIHVuY2hhbmdlZCBwcmVmaXgvc3VmZml4IGFyb3VuZCB0aGUgZGlmZi4KKy8vIElmIHR3byBodW5rcyBhcmUgY2xvc2UgZW5vdWdoIHRoYXQgdGhlaXIgY29udGV4dHMgb3ZlcmxhcCwgdGhlbiB0aGV5IGFyZQorLy8gam9pbmVkIGludG8gb25lIGh1bmsuCitzdGQ6OnN0cmluZyBDcmVhdGVVbmlmaWVkRGlmZihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnRleHQpIHsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8RWRpdFR5cGU+IGVkaXRzID0gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKGxlZnQsIHJpZ2h0KTsKKworICBzaXplX3QgbF9pID0gMCwgcl9pID0gMCwgZWRpdF9pID0gMDsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHdoaWxlIChlZGl0X2kgPCBlZGl0cy5zaXplKCkpIHsKKyAgICAvLyBGaW5kIGZpcnN0IGVkaXQuCisgICAgd2hpbGUgKGVkaXRfaSA8IGVkaXRzLnNpemUoKSAmJiBlZGl0c1tlZGl0X2ldID09IGtNYXRjaCkgeworICAgICAgKytsX2k7CisgICAgICArK3JfaTsKKyAgICAgICsrZWRpdF9pOworICAgIH0KKworICAgIC8vIEZpbmQgdGhlIGZpcnN0IGxpbmUgdG8gaW5jbHVkZSBpbiB0aGUgaHVuay4KKyAgICBjb25zdCBzaXplX3QgcHJlZml4X2NvbnRleHQgPSBzdGQ6Om1pbihsX2ksIGNvbnRleHQpOworICAgIEh1bmsgaHVuayhsX2kgLSBwcmVmaXhfY29udGV4dCArIDEsIHJfaSAtIHByZWZpeF9jb250ZXh0ICsgMSk7CisgICAgZm9yIChzaXplX3QgaSA9IHByZWZpeF9jb250ZXh0OyBpID4gMDsgLS1pKSB7CisgICAgICBodW5rLlB1c2hMaW5lKCcgJywgbGVmdFtsX2kgLSBpXS5jX3N0cigpKTsKKyAgICB9CisKKyAgICAvLyBJdGVyYXRlIHRoZSBlZGl0cyB1bnRpbCB3ZSBmb3VuZCBlbm91Z2ggc3VmZml4IGZvciB0aGUgaHVuayBvciB0aGUgaW5wdXQKKyAgICAvLyBpcyBvdmVyLgorICAgIHNpemVfdCBuX3N1ZmZpeCA9IDA7CisgICAgZm9yICg7IGVkaXRfaSA8IGVkaXRzLnNpemUoKTsgKytlZGl0X2kpIHsKKyAgICAgIGlmIChuX3N1ZmZpeCA+PSBjb250ZXh0KSB7CisgICAgICAgIC8vIENvbnRpbnVlIG9ubHkgaWYgdGhlIG5leHQgaHVuayBpcyB2ZXJ5IGNsb3NlLgorICAgICAgICBzdGQ6OnZlY3RvcjxFZGl0VHlwZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZWRpdHMuYmVnaW4oKSArIGVkaXRfaTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IGVkaXRzLmVuZCgpICYmICppdCA9PSBrTWF0Y2gpICsraXQ7CisgICAgICAgIGlmIChpdCA9PSBlZGl0cy5lbmQoKSB8fCAoaXQgLSBlZGl0cy5iZWdpbigpKSAtIGVkaXRfaSA+PSBjb250ZXh0KSB7CisgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmV4dCBlZGl0IG9yIGl0IGlzIHRvbyBmYXIgYXdheS4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBFZGl0VHlwZSBlZGl0ID0gZWRpdHNbZWRpdF9pXTsKKyAgICAgIC8vIFJlc2V0IGNvdW50IHdoZW4gYSBub24gbWF0Y2ggaXMgZm91bmQuCisgICAgICBuX3N1ZmZpeCA9IGVkaXQgPT0ga01hdGNoID8gbl9zdWZmaXggKyAxIDogMDsKKworICAgICAgaWYgKGVkaXQgPT0ga01hdGNoIHx8IGVkaXQgPT0ga1JlbW92ZSB8fCBlZGl0ID09IGtSZXBsYWNlKSB7CisgICAgICAgIGh1bmsuUHVzaExpbmUoZWRpdCA9PSBrTWF0Y2ggPyAnICcgOiAnLScsIGxlZnRbbF9pXS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGlmIChlZGl0ID09IGtBZGQgfHwgZWRpdCA9PSBrUmVwbGFjZSkgeworICAgICAgICBodW5rLlB1c2hMaW5lKCcrJywgcmlnaHRbcl9pXS5jX3N0cigpKTsKKyAgICAgIH0KKworICAgICAgLy8gQWR2YW5jZSBpbmRpY2VzLCBkZXBlbmRpbmcgb24gZWRpdCB0eXBlLgorICAgICAgbF9pICs9IGVkaXQgIT0ga0FkZDsKKyAgICAgIHJfaSArPSBlZGl0ICE9IGtSZW1vdmU7CisgICAgfQorCisgICAgaWYgKCFodW5rLmhhc19lZGl0cygpKSB7CisgICAgICAvLyBXZSBhcmUgZG9uZS4gV2UgZG9uJ3Qgd2FudCB0aGlzIGh1bmsuCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBodW5rLlByaW50VG8oJnNzKTsKKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlZGl0X2Rpc3RhbmNlCisKK25hbWVzcGFjZSB7CisKKy8vIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlcyByZWNlaXZlZCBpbiBFcUZhaWx1cmUoKSBhcmUgYWxyZWFkeQorLy8gZXNjYXBlZC4gU3BsaXQgdGhlbSBvbiBlc2NhcGVkICdcbicgYm91bmRhcmllcy4gTGVhdmUgYWxsIG90aGVyIGVzY2FwZWQKKy8vIGNoYXJhY3RlcnMgdGhlIHNhbWUuCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3BsaXRFc2NhcGVkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOworICBzaXplX3Qgc3RhcnQgPSAwLCBlbmQgPSBzdHIuc2l6ZSgpOworICBpZiAoZW5kID4gMiAmJiBzdHJbMF0gPT0gJyInICYmIHN0cltlbmQgLSAxXSA9PSAnIicpIHsKKyAgICArK3N0YXJ0OworICAgIC0tZW5kOworICB9CisgIGJvb2wgZXNjYXBlZCA9IGZhbHNlOworICBmb3IgKHNpemVfdCBpID0gc3RhcnQ7IGkgKyAxIDwgZW5kOyArK2kpIHsKKyAgICBpZiAoZXNjYXBlZCkgeworICAgICAgZXNjYXBlZCA9IGZhbHNlOworICAgICAgaWYgKHN0cltpXSA9PSAnbicpIHsKKyAgICAgICAgbGluZXMucHVzaF9iYWNrKHN0ci5zdWJzdHIoc3RhcnQsIGkgLSBzdGFydCAtIDEpKTsKKyAgICAgICAgc3RhcnQgPSBpICsgMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZXNjYXBlZCA9IHN0cltpXSA9PSAnXFwnOworICAgIH0KKyAgfQorICBsaW5lcy5wdXNoX2JhY2soc3RyLnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpKTsKKyAgcmV0dXJuIGxpbmVzOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQ29uc3RydWN0cyBhbmQgcmV0dXJucyB0aGUgbWVzc2FnZSBmb3IgYW4gZXF1YWxpdHkgYXNzZXJ0aW9uCisvLyAoZS5nLiBBU1NFUlRfRVEsIEVYUEVDVF9TVFJFUSwgZXRjKSBmYWlsdXJlLgorLy8KKy8vIFRoZSBmaXJzdCBmb3VyIHBhcmFtZXRlcnMgYXJlIHRoZSBleHByZXNzaW9ucyB1c2VkIGluIHRoZSBhc3NlcnRpb24KKy8vIGFuZCB0aGVpciB2YWx1ZXMsIGFzIHN0cmluZ3MuICBGb3IgZXhhbXBsZSwgZm9yIEFTU0VSVF9FUShmb28sIGJhcikKKy8vIHdoZXJlIGZvbyBpcyA1IGFuZCBiYXIgaXMgNiwgd2UgaGF2ZToKKy8vCisvLyAgIGV4cGVjdGVkX2V4cHJlc3Npb246ICJmb28iCisvLyAgIGFjdHVhbF9leHByZXNzaW9uOiAgICJiYXIiCisvLyAgIGV4cGVjdGVkX3ZhbHVlOiAgICAgICI1IgorLy8gICBhY3R1YWxfdmFsdWU6ICAgICAgICAiNiIKKy8vCisvLyBUaGUgaWdub3JpbmdfY2FzZSBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhCisvLyAqX1NUUkNBU0VFUSouICBXaGVuIGl0J3MgdHJ1ZSwgdGhlIHN0cmluZyAiIChpZ25vcmluZyBjYXNlKSIgd2lsbAorLy8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KK0Fzc2VydGlvblJlc3VsdCBFcUZhaWx1cmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFjdHVhbF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIlZhbHVlIG9mOiAiIDw8IGFjdHVhbF9leHByZXNzaW9uOworICBpZiAoYWN0dWFsX3ZhbHVlICE9IGFjdHVhbF9leHByZXNzaW9uKSB7CisgICAgbXNnIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF92YWx1ZTsKKyAgfQorCisgIG1zZyA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZF9leHByZXNzaW9uOworICBpZiAoaWdub3JpbmdfY2FzZSkgeworICAgIG1zZyA8PCAiIChpZ25vcmluZyBjYXNlKSI7CisgIH0KKyAgaWYgKGV4cGVjdGVkX3ZhbHVlICE9IGV4cGVjdGVkX2V4cHJlc3Npb24pIHsKKyAgICBtc2cgPDwgIlxuV2hpY2ggaXM6ICIgPDwgZXhwZWN0ZWRfdmFsdWU7CisgIH0KKworICBpZiAoIWV4cGVjdGVkX3ZhbHVlLmVtcHR5KCkgJiYgIWFjdHVhbF92YWx1ZS5lbXB0eSgpKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGV4cGVjdGVkX2xpbmVzID0KKyAgICAgICAgU3BsaXRFc2NhcGVkU3RyaW5nKGV4cGVjdGVkX3ZhbHVlKTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWN0dWFsX2xpbmVzID0KKyAgICAgICAgU3BsaXRFc2NhcGVkU3RyaW5nKGFjdHVhbF92YWx1ZSk7CisgICAgaWYgKGV4cGVjdGVkX2xpbmVzLnNpemUoKSA+IDEgfHwgYWN0dWFsX2xpbmVzLnNpemUoKSA+IDEpIHsKKyAgICAgIG1zZyA8PCAiXG5XaXRoIGRpZmY6XG4iCisgICAgICAgICAgPDwgZWRpdF9kaXN0YW5jZTo6Q3JlYXRlVW5pZmllZERpZmYoZXhwZWN0ZWRfbGluZXMsIGFjdHVhbF9saW5lcyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7Cit9CisKKy8vIENvbnN0cnVjdHMgYSBmYWlsdXJlIG1lc3NhZ2UgZm9yIEJvb2xlYW4gYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLgorc3RkOjpzdHJpbmcgR2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKAorICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCYgYXNzZXJ0aW9uX3Jlc3VsdCwKKyAgICBjb25zdCBjaGFyKiBleHByZXNzaW9uX3RleHQsCisgICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKKyAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWUpIHsKKyAgY29uc3QgY2hhciogYWN0dWFsX21lc3NhZ2UgPSBhc3NlcnRpb25fcmVzdWx0Lm1lc3NhZ2UoKTsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAiVmFsdWUgb2Y6ICIgPDwgZXhwcmVzc2lvbl90ZXh0CisgICAgICA8PCAiXG4gIEFjdHVhbDogIiA8PCBhY3R1YWxfcHJlZGljYXRlX3ZhbHVlOworICBpZiAoYWN0dWFsX21lc3NhZ2VbMF0gIT0gJ1wwJykKKyAgICBtc2cgPDwgIiAoIiA8PCBhY3R1YWxfbWVzc2FnZSA8PCAiKSI7CisgIG1zZyA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWU7CisgIHJldHVybiBtc2cuR2V0U3RyaW5nKCk7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ORUFSLgorQXNzZXJ0aW9uUmVzdWx0IERvdWJsZU5lYXJQcmVkRm9ybWF0KGNvbnN0IGNoYXIqIGV4cHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpIHsKKyAgY29uc3QgZG91YmxlIGRpZmYgPSBmYWJzKHZhbDEgLSB2YWwyKTsKKyAgaWYgKGRpZmYgPD0gYWJzX2Vycm9yKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIC8vIFRPRE8od2FuKTogZG8gbm90IHByaW50IHRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uIGlmIGl0J3MKKyAgLy8gYWxyZWFkeSBhIGxpdGVyYWwuCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICIgPDwgZXhwcjEgPDwgIiBhbmQgIiA8PCBleHByMgorICAgICAgPDwgIiBpcyAiIDw8IGRpZmYgPDwgIiwgd2hpY2ggZXhjZWVkcyAiIDw8IGFic19lcnJvcl9leHByIDw8ICIsIHdoZXJlXG4iCisgICAgICA8PCBleHByMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHZhbDEgPDwgIixcbiIKKyAgICAgIDw8IGV4cHIyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdmFsMiA8PCAiLCBhbmRcbiIKKyAgICAgIDw8IGFic19lcnJvcl9leHByIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgYWJzX2Vycm9yIDw8ICIuIjsKK30KKworCisvLyBIZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBGbG9hdExFKCkgYW5kIERvdWJsZUxFKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK0Fzc2VydGlvblJlc3VsdCBGbG9hdGluZ1BvaW50TEUoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgdmFsMikgeworICAvLyBSZXR1cm5zIHN1Y2Nlc3MgaWYgdmFsMSBpcyBsZXNzIHRoYW4gdmFsMiwKKyAgaWYgKHZhbDEgPCB2YWwyKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vIG9yIGlmIHZhbDEgaXMgYWxtb3N0IGVxdWFsIHRvIHZhbDIuCisgIGNvbnN0IEZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gbGhzKHZhbDEpLCByaHModmFsMik7CisgIGlmIChsaHMuQWxtb3N0RXF1YWxzKHJocykpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBhYm92ZSB0d28gY2hlY2tzIHdpbGwgYm90aCBmYWlsIGlmIGVpdGhlciB2YWwxIG9yCisgIC8vIHZhbDIgaXMgTmFOLCBhcyB0aGUgSUVFRSBmbG9hdGluZy1wb2ludCBzdGFuZGFyZCByZXF1aXJlcyB0aGF0CisgIC8vIGFueSBwcmVkaWNhdGUgaW52b2x2aW5nIGEgTmFOIG11c3QgcmV0dXJuIGZhbHNlLgorCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gdmFsMV9zczsKKyAgdmFsMV9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgPDwgdmFsMTsKKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHZhbDJfc3M7CisgIHZhbDJfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgIDw8IHZhbDI7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSA8PSAoIiA8PCBleHByMiA8PCAiKVxuIgorICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZ2YWwxX3NzKSA8PCAiIHZzICIKKyAgICAgIDw8IFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZ2YWwyX3NzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKKy8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgorQXNzZXJ0aW9uUmVzdWx0IEZsb2F0TEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nUG9pbnRMRTxmbG9hdD4oZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyKTsKK30KKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitBc3NlcnRpb25SZXN1bHQgRG91YmxlTEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLCBkb3VibGUgdmFsMikgeworICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nUG9pbnRMRTxkb3VibGU+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9FUSB3aXRoIGludCBvciBlbnVtCisvLyBhcmd1bWVudHMuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKSB7CisgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoYWN0dWFsLCBleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8gd2l0aCBpbnRlZ2VyIG9yIGVudW0gYXJndW1lbnRzLiAgSXQgaXMgaGVyZQorLy8ganVzdCB0byBhdm9pZCBjb3B5LWFuZC1wYXN0ZSBvZiBzaW1pbGFyIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXAorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCB2YWwxLCBCaWdnZXN0SW50IHZhbDIpIHtcCisgIGlmICh2YWwxIG9wIHZhbDIpIHtcCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTtcCisgIH0gZWxzZSB7XAorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgXAorICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpICIgI29wICIgKCIgPDwgZXhwcjJcCisgICAgICAgIDw8ICIpLCBhY3R1YWw6ICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDEsIHZhbDIpXAorICAgICAgICA8PCAiIHZzICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDIsIHZhbDEpO1wKKyAgfVwKK30KKworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTkUgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhORSwgIT0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRSB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExFLCA8PSkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xUIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwgKQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR0Ugd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HVCB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdULCA+ICkKKworI3VuZGVmIEdURVNUX0lNUExfQ01QX0hFTFBFUl8KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkVRLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKSB7CisgIGlmIChTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRUVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKSB7CisgIGlmIChTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICB0cnVlKTsKK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUk5FLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMikgeworICBpZiAoIVN0cmluZzo6Q1N0cmluZ0VxdWFscyhzMSwgczIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSwgYWN0dWFsOiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMxIDw8ICJcIiB2cyBcIiIgPDwgczIgPDwgIlwiIjsKKyAgfQorfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKKyAgaWYgKCFTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKKyAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSAoaWdub3JpbmcgY2FzZSksIGFjdHVhbDogXCIiCisgICAgICAgIDw8IHMxIDw8ICJcIiB2cyBcIiIgPDwgczIgPDwgIlwiIjsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIElzU3ViU3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkuCisKKy8vIFRoaXMgZ3JvdXAgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbnMgcmV0dXJuIHRydWUgaWZmIG5lZWRsZSBpcyBhCisvLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2suICBOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmCisvLyBvbmx5LgorCitib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7CisgIGlmIChuZWVkbGUgPT0gTlVMTCB8fCBoYXlzdGFjayA9PSBOVUxMKQorICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7CisKKyAgcmV0dXJuIHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKSAhPSBOVUxMOworfQorCitib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIGlmIChuZWVkbGUgPT0gTlVMTCB8fCBoYXlzdGFjayA9PSBOVUxMKQorICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7CisKKyAgcmV0dXJuIHdjc3N0cihoYXlzdGFjaywgbmVlZGxlKSAhPSBOVUxMOworfQorCisvLyBTdHJpbmdUeXBlIGhlcmUgY2FuIGJlIGVpdGhlciA6OnN0ZDo6c3RyaW5nIG9yIDo6c3RkOjp3c3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Citib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBTdHJpbmdUeXBlJiBuZWVkbGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdUeXBlJiBoYXlzdGFjaykgeworICByZXR1cm4gaGF5c3RhY2suZmluZChuZWVkbGUpICE9IFN0cmluZ1R5cGU6Om5wb3M7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBlaXRoZXIgSXNTdWJzdHJpbmcoKSBvciBJc05vdFN1YnN0cmluZygpLAorLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nIHBhcmFtZXRlci4KKy8vIFN0cmluZ1R5cGUgaGVyZSBjYW4gYmUgY29uc3QgY2hhciosIGNvbnN0IHdjaGFyX3QqLCA6OnN0ZDo6c3RyaW5nLAorLy8gb3IgOjpzdGQ6OndzdHJpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZ0ltcGwoCisgICAgYm9vbCBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcsCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLCBjb25zdCBTdHJpbmdUeXBlJiBoYXlzdGFjaykgeworICBpZiAoSXNTdWJzdHJpbmdQcmVkKG5lZWRsZSwgaGF5c3RhY2spID09IGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZykKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIGNvbnN0IGJvb2wgaXNfd2lkZV9zdHJpbmcgPSBzaXplb2YobmVlZGxlWzBdKSA+IDE7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGJlZ2luX3N0cmluZ19xdW90ZSA9IGlzX3dpZGVfc3RyaW5nID8gIkxcIiIgOiAiXCIiOworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiVmFsdWUgb2Y6ICIgPDwgbmVlZGxlX2V4cHIgPDwgIlxuIgorICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBuZWVkbGUgPDwgIlwiXG4iCisgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgKGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyA/ICIiIDogIm5vdCAiKQorICAgICAgPDwgImEgc3Vic3RyaW5nIG9mICIgPDwgaGF5c3RhY2tfZXhwciA8PCAiXG4iCisgICAgICA8PCAiV2hpY2ggaXM6ICIgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IGhheXN0YWNrIDw8ICJcIiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEKKy8vIHN1YnN0cmluZyBvZiBoYXlzdGFjayAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgorLy8gb25seSksIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWYgR1RFU1RfT1NfV0lORE9XUworCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIElzSFJFU1VMVHtTdWNjZXNzRmFpbHVyZX0gcHJlZGljYXRlcworQXNzZXJ0aW9uUmVzdWx0IEhSRVNVTFRGYWlsdXJlSGVscGVyKGNvbnN0IGNoYXIqIGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocikgeyAgLy8gTk9MSU5UCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgLy8gV2luZG93cyBDRSBkb2Vzbid0IHN1cHBvcnQgRm9ybWF0TWVzc2FnZS4KKyAgY29uc3QgY2hhciBlcnJvcl90ZXh0W10gPSAiIjsKKworIyBlbHNlCisKKyAgLy8gTG9va3MgdXAgdGhlIGh1bWFuLXJlYWRhYmxlIHN5c3RlbSBtZXNzYWdlIGZvciB0aGUgSFJFU1VMVCBjb2RlCisgIC8vIGFuZCBzaW5jZSB3ZSdyZSBub3QgcGFzc2luZyBhbnkgcGFyYW1zIHRvIEZvcm1hdE1lc3NhZ2UsIHdlIGRvbid0CisgIC8vIHdhbnQgaW5zZXJ0cyBleHBhbmRlZC4KKyAgY29uc3QgRFdPUkQga0ZsYWdzID0gRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUzsKKyAgY29uc3QgRFdPUkQga0J1ZlNpemUgPSA0MDk2OworICAvLyBHZXRzIHRoZSBzeXN0ZW0ncyBodW1hbiByZWFkYWJsZSBtZXNzYWdlIHN0cmluZyBmb3IgdGhpcyBIUkVTVUxULgorICBjaGFyIGVycm9yX3RleHRba0J1ZlNpemVdID0geyAnXDAnIH07CisgIERXT1JEIG1lc3NhZ2VfbGVuZ3RoID0gOjpGb3JtYXRNZXNzYWdlQShrRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gbm8gc291cmNlLCB3ZSdyZSBhc2tpbmcgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBociwgIC8vIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vIGxpbmUgd2lkdGggcmVzdHJpY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0LCAgLy8gb3V0cHV0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0J1ZlNpemUsICAvLyBidWYgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvLyBubyBhcmd1bWVudHMgZm9yIGluc2VydHMKKyAgLy8gVHJpbXMgdGFpbGluZyB3aGl0ZSBzcGFjZSAoRm9ybWF0TWVzc2FnZSBsZWF2ZXMgYSB0cmFpbGluZyBDUi1MRikKKyAgZm9yICg7IG1lc3NhZ2VfbGVuZ3RoICYmIElzU3BhY2UoZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdKTsKKyAgICAgICAgICAtLW1lc3NhZ2VfbGVuZ3RoKSB7CisgICAgZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdID0gJ1wwJzsKKyAgfQorCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVycm9yX2hleCgiMHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoaHIpKTsKKyAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiICIgPDwgZXhwZWN0ZWQgPDwgIi5cbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBlcnJvcl9oZXggPDwgIiAiIDw8IGVycm9yX3RleHQgPDwgIlxuIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0Fzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRTdWNjZXNzKGNvbnN0IGNoYXIqIGV4cHIsIGxvbmcgaHIpIHsgIC8vIE5PTElOVAorICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKyAgcmV0dXJuIEhSRVNVTFRGYWlsdXJlSGVscGVyKGV4cHIsICJzdWNjZWVkcyIsIGhyKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgImZhaWxzIiwgaHIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIFVuaWNvZGUgdGV4dCAod2lkZSBzdHJpbmdzKSBpbgorLy8gVVRGLTguCisKKy8vIEEgVW5pY29kZSBjb2RlLXBvaW50IGNhbiBoYXZlIHVwdG8gMjEgYml0cywgYW5kIGlzIGVuY29kZWQgaW4gVVRGLTgKKy8vIGxpa2UgdGhpczoKKy8vCisvLyBDb2RlLXBvaW50IGxlbmd0aCAgIEVuY29kaW5nCisvLyAgIDAgLSAgNyBiaXRzICAgICAgIDB4eHh4eHh4CisvLyAgIDggLSAxMSBiaXRzICAgICAgIDExMHh4eHh4IDEweHh4eHh4CisvLyAgMTIgLSAxNiBiaXRzICAgICAgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4CisvLyAgMTcgLSAyMSBiaXRzICAgICAgIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4CisKKy8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSBvbmUtYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgorY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQxID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgIDcpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHR3by1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDIgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNSArIDYpKSAtIDE7CisKKy8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSB0aHJlZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDMgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNCArIDIqNikpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIGZvdXItYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgorY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQ0ID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgKDMgKyAzKjYpKSAtIDE7CisKKy8vIENob3BzIG9mZiB0aGUgbiBsb3dlc3QgYml0cyBmcm9tIGEgYml0IHBhdHRlcm4uICBSZXR1cm5zIHRoZSBuCisvLyBsb3dlc3QgYml0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBvcmlnaW5hbCBiaXQgcGF0dGVybiB3aWxsIGJlCisvLyBzaGlmdGVkIHRvIHRoZSByaWdodCBieSBuIGJpdHMuCitpbmxpbmUgVUludDMyIENob3BMb3dCaXRzKFVJbnQzMiogYml0cywgaW50IG4pIHsKKyAgY29uc3QgVUludDMyIGxvd19iaXRzID0gKmJpdHMgJiAoKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgbikgLSAxKTsKKyAgKmJpdHMgPj49IG47CisgIHJldHVybiBsb3dfYml0czsKK30KKworLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgorLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKKy8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgorLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50CisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIGNvbnZlcnRlZAorLy8gdG8gIihJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCkiLgorc3RkOjpzdHJpbmcgQ29kZVBvaW50VG9VdGY4KFVJbnQzMiBjb2RlX3BvaW50KSB7CisgIGlmIChjb2RlX3BvaW50ID4ga01heENvZGVQb2ludDQpIHsKKyAgICByZXR1cm4gIihJbnZhbGlkIFVuaWNvZGUgMHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoY29kZV9wb2ludCkgKyAiKSI7CisgIH0KKworICBjaGFyIHN0cls1XTsgIC8vIEJpZyBlbm91Z2ggZm9yIHRoZSBsYXJnZXN0IHZhbGlkIGNvZGUgcG9pbnQuCisgIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQxKSB7CisgICAgc3RyWzFdID0gJ1wwJzsKKyAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4eHh4eHh4CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MikgeworICAgIHN0clsyXSA9ICdcMCc7CisgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4QzAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTEweHh4eHgKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQzKSB7CisgICAgc3RyWzNdID0gJ1wwJzsKKyAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RTAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMHh4eHgKKyAgfSBlbHNlIHsgIC8vIGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDQKKyAgICBzdHJbNF0gPSAnXDAnOworICAgIHN0clszXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RjAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMTB4eHgKKyAgfQorICByZXR1cm4gc3RyOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgb25seSBtYWtlIHNlbnNlIGlmIHRoZSB0aGUgc3lzdGVtCisvLyB1c2VzIFVURi0xNiBmb3Igd2lkZSBzdHJpbmcgZW5jb2RpbmcuIEFsbCBzdXBwb3J0ZWQgc3lzdGVtcworLy8gd2l0aCAxNiBiaXQgd2NoYXJfdCAoV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKSBkbyB1c2UgVVRGLTE2LgorCisvLyBEZXRlcm1pbmVzIGlmIHRoZSBhcmd1bWVudHMgY29uc3RpdHV0ZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKKy8vIGFuZCB0aHVzIHNob3VsZCBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIFVuaWNvZGUgY29kZSBwb2ludAorLy8gdXNpbmcgQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpci4KK2lubGluZSBib29sIElzVXRmMTZTdXJyb2dhdGVQYWlyKHdjaGFyX3QgZmlyc3QsIHdjaGFyX3Qgc2Vjb25kKSB7CisgIHJldHVybiBzaXplb2Yod2NoYXJfdCkgPT0gMiAmJgorICAgICAgKGZpcnN0ICYgMHhGQzAwKSA9PSAweEQ4MDAgJiYgKHNlY29uZCAmIDB4RkMwMCkgPT0gMHhEQzAwOworfQorCisvLyBDcmVhdGVzIGEgVW5pY29kZSBjb2RlIHBvaW50IGZyb20gVVRGMTYgc3Vycm9nYXRlIHBhaXIuCitpbmxpbmUgVUludDMyIENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIod2NoYXJfdCBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHNlY29uZCkgeworICBjb25zdCBVSW50MzIgbWFzayA9ICgxIDw8IDEwKSAtIDE7CisgIHJldHVybiAoc2l6ZW9mKHdjaGFyX3QpID09IDIpID8KKyAgICAgICgoKGZpcnN0ICYgbWFzaykgPDwgMTApIHwgKHNlY29uZCAmIG1hc2spKSArIDB4MTAwMDAgOgorICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBjb25kaXRpb24gaXMKKyAgICAgIC8vIGZhbHNlLCBidXQgd2UgcHJvdmlkZSBhIHNlbnNpYmxlIGRlZmF1bHQgaW4gY2FzZSBpdCBpcy4KKyAgICAgIHN0YXRpY19jYXN0PFVJbnQzMj4oZmlyc3QpOworfQorCisvLyBDb252ZXJ0cyBhIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KKy8vIFRoZSB3aWRlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKKy8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpCisvLyAgIFVURi0zMiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gNCAob24gTGludXgpCisvLyBQYXJhbWV0ZXIgc3RyIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZCB3aWRlIHN0cmluZy4KKy8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyCisvLyBvZiB3Y2hhcl90IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLiAtMSBpcyB1c2VkIHdoZW4gdGhlIGVudGlyZSBzdHJpbmcKKy8vIHNob3VsZCBiZSBwcm9jZXNzZWQuCisvLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzCisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSB0aGV5IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuIElmIHRoZSBzdHJpbmcgaXMgaW4gVVRGMTYgZW5jb2RpbmcKKy8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycworLy8gd2lsbCBiZSBlbmNvZGVkIGFzIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXJzIGZyb20gQmFzaWMgTm9ybWFsIFBsYW5lLgorc3RkOjpzdHJpbmcgV2lkZVN0cmluZ1RvVXRmOChjb25zdCB3Y2hhcl90KiBzdHIsIGludCBudW1fY2hhcnMpIHsKKyAgaWYgKG51bV9jaGFycyA9PSAtMSkKKyAgICBudW1fY2hhcnMgPSBzdGF0aWNfY2FzdDxpbnQ+KHdjc2xlbihzdHIpKTsKKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY2hhcnM7ICsraSkgeworICAgIFVJbnQzMiB1bmljb2RlX2NvZGVfcG9pbnQ7CisKKyAgICBpZiAoc3RyW2ldID09IEwnXDAnKSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGkgKyAxIDwgbnVtX2NoYXJzICYmIElzVXRmMTZTdXJyb2dhdGVQYWlyKHN0cltpXSwgc3RyW2kgKyAxXSkpIHsKKyAgICAgIHVuaWNvZGVfY29kZV9wb2ludCA9IENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJbaSArIDFdKTsKKyAgICAgIGkrKzsKKyAgICB9IGVsc2UgeworICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gc3RhdGljX2Nhc3Q8VUludDMyPihzdHJbaV0pOworICAgIH0KKworICAgIHN0cmVhbSA8PCBDb2RlUG9pbnRUb1V0ZjgodW5pY29kZV9jb2RlX3BvaW50KTsKKyAgfQorICByZXR1cm4gU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnN0cmVhbSk7Cit9CisKKy8vIENvbnZlcnRzIGEgd2lkZSBDIHN0cmluZyB0byBhbiBzdGQ6OnN0cmluZyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCisvLyBOVUxMIHdpbGwgYmUgY29udmVydGVkIHRvICIobnVsbCkiLgorc3RkOjpzdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCAqIHdpZGVfY19zdHIpIHsKKyAgaWYgKHdpZGVfY19zdHIgPT0gTlVMTCkgIHJldHVybiAiKG51bGwpIjsKKworICByZXR1cm4gaW50ZXJuYWw6OldpZGVTdHJpbmdUb1V0Zjgod2lkZV9jX3N0ciwgLTEpOworfQorCisvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZQorLy8gY29udGVudC4KKy8vCisvLyBVbmxpa2Ugd2NzY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQSBOVUxMCisvLyBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KK2Jvb2wgU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90ICogbGhzLCBjb25zdCB3Y2hhcl90ICogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkgcmV0dXJuIHJocyA9PSBOVUxMOworCisgIGlmIChyaHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB3Y3NjbXAobGhzLCByaHMpID09IDA7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhY3R1YWwpIHsKKyAgaWYgKFN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJORSBvbiB3aWRlIHN0cmluZ3MuCitBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMyKSB7CisgIGlmICghU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhzMSwgczIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSwgYWN0dWFsOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUHJpbnRUb1N0cmluZyhzMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHZzICIgPDwgUHJpbnRUb1N0cmluZyhzMik7Cit9CisKKy8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZQorLy8gdGhlIHNhbWUgY29udGVudC4KKy8vCisvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKy8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gcmhzID09IE5VTEw7CisgIGlmIChyaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwb3NpeDo6U3RyQ2FzZUNtcChsaHMsIHJocykgPT0gMDsKK30KKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCB3aWRlIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgLy8gTkI6IFRoZSBpbXBsZW1lbnRhdGlvbnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBzbGlnaHRseSBkaWZmZXIuCisgIC8vIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIHVzZXMgX3djc2ljbXAgd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFCisgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBPbiBHTlUgcGxhdGZvcm0gdGhpcyBtZXRob2QgdXNlcyB3Y3NjYXNlY21wCisgIC8vIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgIC8vIE9uIE1hY09TIFgsIGl0IHVzZXMgdG93bG93ZXIsIHdoaWNoIGFsc28gdXNlcyBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUKKyAgLy8gY3VycmVudCBsb2NhbGUuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocykgeworICBpZiAobGhzID09IE5VTEwpIHJldHVybiByaHMgPT0gTlVMTDsKKworICBpZiAocmhzID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmV0dXJuIF93Y3NpY21wKGxocywgcmhzKSA9PSAwOworI2VsaWYgR1RFU1RfT1NfTElOVVggJiYgIUdURVNUX09TX0xJTlVYX0FORFJPSUQKKyAgcmV0dXJuIHdjc2Nhc2VjbXAobGhzLCByaHMpID09IDA7CisjZWxzZQorICAvLyBBbmRyb2lkLCBNYWMgT1MgWCBhbmQgQ3lnd2luIGRvbid0IGRlZmluZSB3Y3NjYXNlY21wLgorICAvLyBPdGhlciB1bmtub3duIE9TZXMgbWF5IG5vdCBkZWZpbmUgaXQgZWl0aGVyLgorICB3aW50X3QgbGVmdCwgcmlnaHQ7CisgIGRvIHsKKyAgICBsZWZ0ID0gdG93bG93ZXIoKmxocysrKTsKKyAgICByaWdodCA9IHRvd2xvd2VyKCpyaHMrKyk7CisgIH0gd2hpbGUgKGxlZnQgJiYgbGVmdCA9PSByaWdodCk7CisgIHJldHVybiBsZWZ0ID09IHJpZ2h0OworI2VuZGlmICAvLyBPUyBzZWxlY3RvcgorfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHN0ciBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgaWdub3JpbmcgY2FzZS4KKy8vIEFueSBzdHJpbmcgaXMgY29uc2lkZXJlZCB0byBlbmQgd2l0aCBhbiBlbXB0eSBzdWZmaXguCitib29sIFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCkgeworICBjb25zdCBzaXplX3Qgc3RyX2xlbiA9IHN0ci5sZW5ndGgoKTsKKyAgY29uc3Qgc2l6ZV90IHN1ZmZpeF9sZW4gPSBzdWZmaXgubGVuZ3RoKCk7CisgIHJldHVybiAoc3RyX2xlbiA+PSBzdWZmaXhfbGVuKSAmJgorICAgICAgICAgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhzdHIuY19zdHIoKSArIHN0cl9sZW4gLSBzdWZmaXhfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXguY19zdHIoKSk7Cit9CisKKy8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlMDJkIi4KK3N0ZDo6c3RyaW5nIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKGludCB2YWx1ZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IHZhbHVlOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlWCIuCitzdGQ6OnN0cmluZyBTdHJpbmc6OkZvcm1hdEhleEludChpbnQgdmFsdWUpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHZhbHVlOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vIEZvcm1hdHMgYSBieXRlIGFzICIlMDJYIi4KK3N0ZDo6c3RyaW5nIFN0cmluZzo6Rm9ybWF0Qnl0ZSh1bnNpZ25lZCBjaGFyIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjpoZXggPDwgc3RkOjp1cHBlcmNhc2UKKyAgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pih2YWx1ZSk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gQ29udmVydHMgdGhlIGJ1ZmZlciBpbiBhIHN0cmluZ3N0cmVhbSB0byBhbiBzdGQ6OnN0cmluZywgY29udmVydGluZyBOVUwKKy8vIGJ5dGVzIHRvICJcXDAiIGFsb25nIHRoZSB3YXkuCitzdGQ6OnN0cmluZyBTdHJpbmdTdHJlYW1Ub1N0cmluZyg6OnN0ZDo6c3RyaW5nc3RyZWFtKiBzcykgeworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIgPSBzcy0+c3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXJ0ID0gc3RyLmNfc3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyLmxlbmd0aCgpOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoMiAqIChlbmQgLSBzdGFydCkpOworICBmb3IgKGNvbnN0IGNoYXIqIGNoID0gc3RhcnQ7IGNoICE9IGVuZDsgKytjaCkgeworICAgIGlmICgqY2ggPT0gJ1wwJykgeworICAgICAgcmVzdWx0ICs9ICJcXDAiOyAgLy8gUmVwbGFjZXMgTlVMIHdpdGggIlxcMCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAqY2g7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQXBwZW5kcyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlIHRvIHRoZSBHb29nbGUtVGVzdC1nZW5lcmF0ZWQgbWVzc2FnZS4KK3N0ZDo6c3RyaW5nIEFwcGVuZFVzZXJNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBndGVzdF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiB1c2VyX21zZykgeworICAvLyBBcHBlbmRzIHRoZSB1c2VyIG1lc3NhZ2UgaWYgaXQncyBub24tZW1wdHkuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHVzZXJfbXNnX3N0cmluZyA9IHVzZXJfbXNnLkdldFN0cmluZygpOworICBpZiAodXNlcl9tc2dfc3RyaW5nLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gZ3Rlc3RfbXNnOworICB9CisKKyAgcmV0dXJuIGd0ZXN0X21zZyArICJcbiIgKyB1c2VyX21zZ19zdHJpbmc7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBjbGFzcyBUZXN0UmVzdWx0CisKKy8vIENyZWF0ZXMgYW4gZW1wdHkgVGVzdFJlc3VsdC4KK1Rlc3RSZXN1bHQ6OlRlc3RSZXN1bHQoKQorICAgIDogZGVhdGhfdGVzdF9jb3VudF8oMCksCisgICAgICBlbGFwc2VkX3RpbWVfKDApIHsKK30KKworLy8gRCd0b3IuCitUZXN0UmVzdWx0Ojp+VGVzdFJlc3VsdCgpIHsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHBhcnQgcmVzdWx0IGFtb25nIGFsbCB0aGUgcmVzdWx0cy4gaSBjYW4KKy8vIHJhbmdlIGZyb20gMCB0byB0b3RhbF9wYXJ0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLAorLy8gYWJvcnRzIHRoZSBwcm9ncmFtLgorY29uc3QgVGVzdFBhcnRSZXN1bHQmIFRlc3RSZXN1bHQ6OkdldFRlc3RQYXJ0UmVzdWx0KGludCBpKSBjb25zdCB7CisgIGlmIChpIDwgMCB8fCBpID49IHRvdGFsX3BhcnRfY291bnQoKSkKKyAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIHJldHVybiB0ZXN0X3BhcnRfcmVzdWx0c18uYXQoaSk7Cit9CisKKy8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwcm9wZXJ0eS4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMgdGhlCisvLyBwcm9ncmFtLgorY29uc3QgVGVzdFByb3BlcnR5JiBUZXN0UmVzdWx0OjpHZXRUZXN0UHJvcGVydHkoaW50IGkpIGNvbnN0IHsKKyAgaWYgKGkgPCAwIHx8IGkgPj0gdGVzdF9wcm9wZXJ0eV9jb3VudCgpKQorICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgcmV0dXJuIHRlc3RfcHJvcGVydGllc18uYXQoaSk7Cit9CisKKy8vIENsZWFycyB0aGUgdGVzdCBwYXJ0IHJlc3VsdHMuCit2b2lkIFRlc3RSZXN1bHQ6OkNsZWFyVGVzdFBhcnRSZXN1bHRzKCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsKK30KKworLy8gQWRkcyBhIHRlc3QgcGFydCByZXN1bHQgdG8gdGhlIGxpc3QuCit2b2lkIFRlc3RSZXN1bHQ6OkFkZFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5wdXNoX2JhY2sodGVzdF9wYXJ0X3Jlc3VsdCk7Cit9CisKKy8vIEFkZHMgYSB0ZXN0IHByb3BlcnR5IHRvIHRoZSBsaXN0LiBJZiBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5IGFzIHRoZQorLy8gc3VwcGxpZWQgcHJvcGVydHkgaXMgYWxyZWFkeSByZXByZXNlbnRlZCwgdGhlIHZhbHVlIG9mIHRoaXMgdGVzdF9wcm9wZXJ0eQorLy8gcmVwbGFjZXMgdGhlIG9sZCB2YWx1ZSBmb3IgdGhhdCBrZXkuCit2b2lkIFRlc3RSZXN1bHQ6OlJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7CisgIGlmICghVmFsaWRhdGVUZXN0UHJvcGVydHkoeG1sX2VsZW1lbnQsIHRlc3RfcHJvcGVydHkpKSB7CisgICAgcmV0dXJuOworICB9CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmdGVzdF9wcm9wZXJpdGVzX211dGV4Xyk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT46Oml0ZXJhdG9yIHByb3BlcnR5X3dpdGhfbWF0Y2hpbmdfa2V5ID0KKyAgICAgIHN0ZDo6ZmluZF9pZih0ZXN0X3Byb3BlcnRpZXNfLmJlZ2luKCksIHRlc3RfcHJvcGVydGllc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RQcm9wZXJ0eUtleUlzKHRlc3RfcHJvcGVydHkua2V5KCkpKTsKKyAgaWYgKHByb3BlcnR5X3dpdGhfbWF0Y2hpbmdfa2V5ID09IHRlc3RfcHJvcGVydGllc18uZW5kKCkpIHsKKyAgICB0ZXN0X3Byb3BlcnRpZXNfLnB1c2hfYmFjayh0ZXN0X3Byb3BlcnR5KTsKKyAgICByZXR1cm47CisgIH0KKyAgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXktPlNldFZhbHVlKHRlc3RfcHJvcGVydHkudmFsdWUoKSk7Cit9CisKKy8vIFRoZSBsaXN0IG9mIHJlc2VydmVkIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgPHRlc3RzdWl0ZXM+IGVsZW1lbnQgb2YgWE1MCisvLyBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1Jlc2VydmVkVGVzdFN1aXRlc0F0dHJpYnV0ZXNbXSA9IHsKKyAgImRpc2FibGVkIiwKKyAgImVycm9ycyIsCisgICJmYWlsdXJlcyIsCisgICJuYW1lIiwKKyAgInJhbmRvbV9zZWVkIiwKKyAgInRlc3RzIiwKKyAgInRpbWUiLAorICAidGltZXN0YW1wIgorfTsKKworLy8gVGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgYXR0cmlidXRlcyB1c2VkIGluIHRoZSA8dGVzdHN1aXRlPiBlbGVtZW50IG9mIFhNTAorLy8gb3V0cHV0Lgorc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtSZXNlcnZlZFRlc3RTdWl0ZUF0dHJpYnV0ZXNbXSA9IHsKKyAgImRpc2FibGVkIiwKKyAgImVycm9ycyIsCisgICJmYWlsdXJlcyIsCisgICJuYW1lIiwKKyAgInRlc3RzIiwKKyAgInRpbWUiCit9OworCisvLyBUaGUgbGlzdCBvZiByZXNlcnZlZCBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIDx0ZXN0Y2FzZT4gZWxlbWVudCBvZiBYTUwgb3V0cHV0Lgorc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtSZXNlcnZlZFRlc3RDYXNlQXR0cmlidXRlc1tdID0geworICAiY2xhc3NuYW1lIiwKKyAgIm5hbWUiLAorICAic3RhdHVzIiwKKyAgInRpbWUiLAorICAidHlwZV9wYXJhbSIsCisgICJ2YWx1ZV9wYXJhbSIKK307CisKK3RlbXBsYXRlIDxpbnQga1NpemU+CitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJyYXlBc1ZlY3Rvcihjb25zdCBjaGFyKiBjb25zdCAoJmFycmF5KVtrU2l6ZV0pIHsKKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPihhcnJheSwgYXJyYXkgKyBrU2l6ZSk7Cit9CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0UmVzZXJ2ZWRBdHRyaWJ1dGVzRm9yRWxlbWVudCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQpIHsKKyAgaWYgKHhtbF9lbGVtZW50ID09ICJ0ZXN0c3VpdGVzIikgeworICAgIHJldHVybiBBcnJheUFzVmVjdG9yKGtSZXNlcnZlZFRlc3RTdWl0ZXNBdHRyaWJ1dGVzKTsKKyAgfSBlbHNlIGlmICh4bWxfZWxlbWVudCA9PSAidGVzdHN1aXRlIikgeworICAgIHJldHVybiBBcnJheUFzVmVjdG9yKGtSZXNlcnZlZFRlc3RTdWl0ZUF0dHJpYnV0ZXMpOworICB9IGVsc2UgaWYgKHhtbF9lbGVtZW50ID09ICJ0ZXN0Y2FzZSIpIHsKKyAgICByZXR1cm4gQXJyYXlBc1ZlY3RvcihrUmVzZXJ2ZWRUZXN0Q2FzZUF0dHJpYnV0ZXMpOworICB9IGVsc2UgeworICAgIEdURVNUX0NIRUNLXyhmYWxzZSkgPDwgIlVucmVjb2duaXplZCB4bWxfZWxlbWVudCBwcm92aWRlZDogIiA8PCB4bWxfZWxlbWVudDsKKyAgfQorICAvLyBUaGlzIGNvZGUgaXMgdW5yZWFjaGFibGUgYnV0IHNvbWUgY29tcGlsZXJzIG1heSBub3QgcmVhbGl6ZXMgdGhhdC4KKyAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0V29yZExpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB3b3JkcykgeworICBNZXNzYWdlIHdvcmRfbGlzdDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3b3Jkcy5zaXplKCk7ICsraSkgeworICAgIGlmIChpID4gMCAmJiB3b3Jkcy5zaXplKCkgPiAyKSB7CisgICAgICB3b3JkX2xpc3QgPDwgIiwgIjsKKyAgICB9CisgICAgaWYgKGkgPT0gd29yZHMuc2l6ZSgpIC0gMSkgeworICAgICAgd29yZF9saXN0IDw8ICJhbmQgIjsKKyAgICB9CisgICAgd29yZF9saXN0IDw8ICInIiA8PCB3b3Jkc1tpXSA8PCAiJyI7CisgIH0KKyAgcmV0dXJuIHdvcmRfbGlzdC5HZXRTdHJpbmcoKTsKK30KKworYm9vbCBWYWxpZGF0ZVRlc3RQcm9wZXJ0eU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlc2VydmVkX25hbWVzKSB7CisgIGlmIChzdGQ6OmZpbmQocmVzZXJ2ZWRfbmFtZXMuYmVnaW4oKSwgcmVzZXJ2ZWRfbmFtZXMuZW5kKCksIHByb3BlcnR5X25hbWUpICE9CisgICAgICAgICAgcmVzZXJ2ZWRfbmFtZXMuZW5kKCkpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJSZXNlcnZlZCBrZXkgdXNlZCBpbiBSZWNvcmRQcm9wZXJ0eSgpOiAiIDw8IHByb3BlcnR5X25hbWUKKyAgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgRm9ybWF0V29yZExpc3QocmVzZXJ2ZWRfbmFtZXMpCisgICAgICAgICAgICAgICAgICA8PCAiIGFyZSByZXNlcnZlZCBieSAiIDw8IEdURVNUX05BTUVfIDw8ICIpIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEFkZHMgYSBmYWlsdXJlIGlmIHRoZSBrZXkgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQgbmFtZWQKKy8vIHhtbF9lbGVtZW50LiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4KK2Jvb2wgVGVzdFJlc3VsdDo6VmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsKKyAgcmV0dXJuIFZhbGlkYXRlVGVzdFByb3BlcnR5TmFtZSh0ZXN0X3Byb3BlcnR5LmtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFJlc2VydmVkQXR0cmlidXRlc0ZvckVsZW1lbnQoeG1sX2VsZW1lbnQpKTsKK30KKworLy8gQ2xlYXJzIHRoZSBvYmplY3QuCit2b2lkIFRlc3RSZXN1bHQ6OkNsZWFyKCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsKKyAgdGVzdF9wcm9wZXJ0aWVzXy5jbGVhcigpOworICBkZWF0aF90ZXN0X2NvdW50XyA9IDA7CisgIGVsYXBzZWRfdGltZV8gPSAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KK2Jvb2wgVGVzdFJlc3VsdDo6RmFpbGVkKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEdldFRlc3RQYXJ0UmVzdWx0KGkpLmZhaWxlZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgZmF0YWxseSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0UGFydEZhdGFsbHlGYWlsZWQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXR1cm4gcmVzdWx0LmZhdGFsbHlfZmFpbGVkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuCitib29sIFRlc3RSZXN1bHQ6Okhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9wYXJ0X3Jlc3VsdHNfLCBUZXN0UGFydEZhdGFsbHlGYWlsZWQpID4gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IG5vbi1mYXRhbGx5IGZhaWxlZC4KK3N0YXRpYyBib29sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiByZXN1bHQubm9uZmF0YWxseV9mYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdFJlc3VsdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZCkgPiAwOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcgorLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLgoraW50IFRlc3RSZXN1bHQ6OnRvdGFsX3BhcnRfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcGFydF9yZXN1bHRzXy5zaXplKCkpOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KK2ludCBUZXN0UmVzdWx0Ojp0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X3Byb3BlcnRpZXNfLnNpemUoKSk7Cit9CisKKy8vIGNsYXNzIFRlc3QKKworLy8gQ3JlYXRlcyBhIFRlc3Qgb2JqZWN0LgorCisvLyBUaGUgYyd0b3Igc2F2ZXMgdGhlIHN0YXRlcyBvZiBhbGwgZmxhZ3MuCitUZXN0OjpUZXN0KCkKKyAgICA6IGd0ZXN0X2ZsYWdfc2F2ZXJfKG5ldyBHVEVTVF9GTEFHX1NBVkVSXykgeworfQorCisvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHN0YXRlcyBvZiBhbGwgZmxhZ3MuICBUaGUgYWN0dWFsIHdvcmsgaXMKKy8vIGRvbmUgYnkgdGhlIGQndG9yIG9mIHRoZSBndGVzdF9mbGFnX3NhdmVyXyBmaWVsZCwgYW5kIHRodXMgbm90CisvLyB2aXNpYmxlIGhlcmUuCitUZXN0Ojp+VGVzdCgpIHsKK30KKworLy8gU2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpTZXRVcCgpIHsKK30KKworLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpUZWFyRG93bigpIHsKK30KKworLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCit2b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZSk7Cit9CisKKy8vIEFsbG93cyB1c2VyIHN1cHBsaWVkIGtleSB2YWx1ZSBwYWlycyB0byBiZSByZWNvcmRlZCBmb3IgbGF0ZXIgb3V0cHV0Lgordm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpIHsKKyAgTWVzc2FnZSB2YWx1ZV9tZXNzYWdlOworICB2YWx1ZV9tZXNzYWdlIDw8IHZhbHVlOworICBSZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlX21lc3NhZ2UuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgUmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIGZyaWVuZCBvZiBVbml0VGVzdCBhbmQgYXMgc3VjaCBoYXMgYWNjZXNzIHRvCisgIC8vIEFkZFRlc3RQYXJ0UmVzdWx0LgorICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+QWRkVGVzdFBhcnRSZXN1bHQoCisgICAgICByZXN1bHRfdHlwZSwKKyAgICAgIE5VTEwsICAvLyBObyBpbmZvIGFib3V0IHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAgLTEsICAgIC8vIFdlIGhhdmUgbm8gaW5mbyBvbiB3aGljaCBsaW5lIGNhdXNlZCB0aGUgZXhjZXB0aW9uLgorICAgICAgbWVzc2FnZSwKKyAgICAgICIiKTsgICAvLyBObyBzdGFjayB0cmFjZSwgZWl0aGVyLgorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gR29vZ2xlIFRlc3QgcmVxdWlyZXMgYWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSB0byB1c2UgdGhlIHNhbWUgdGVzdAorLy8gZml4dHVyZSBjbGFzcy4gIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjdXJyZW50IHRlc3QgaGFzIHRoZQorLy8gc2FtZSBmaXh0dXJlIGNsYXNzIGFzIHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjdXJyZW50IHRlc3QgY2FzZS4gIElmCisvLyB5ZXMsIGl0IHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGl0IGdlbmVyYXRlcyBhIEdvb2dsZSBUZXN0IGZhaWx1cmUgYW5kCisvLyByZXR1cm5zIGZhbHNlLgorYm9vbCBUZXN0OjpIYXNTYW1lRml4dHVyZUNsYXNzKCkgeworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gaW1wbC0+Y3VycmVudF90ZXN0X2Nhc2UoKTsKKworICAvLyBJbmZvIGFib3V0IHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjdXJyZW50IHRlc3QgY2FzZS4KKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGZpcnN0X3Rlc3RfaW5mbyA9IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVswXTsKKyAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCBmaXJzdF9maXh0dXJlX2lkID0gZmlyc3RfdGVzdF9pbmZvLT5maXh0dXJlX2NsYXNzX2lkXzsKKyAgY29uc3QgY2hhciogY29uc3QgZmlyc3RfdGVzdF9uYW1lID0gZmlyc3RfdGVzdF9pbmZvLT5uYW1lKCk7CisKKyAgLy8gSW5mbyBhYm91dCB0aGUgY3VycmVudCB0ZXN0LgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGhpc190ZXN0X2luZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIHRoaXNfZml4dHVyZV9pZCA9IHRoaXNfdGVzdF9pbmZvLT5maXh0dXJlX2NsYXNzX2lkXzsKKyAgY29uc3QgY2hhciogY29uc3QgdGhpc190ZXN0X25hbWUgPSB0aGlzX3Rlc3RfaW5mby0+bmFtZSgpOworCisgIGlmICh0aGlzX2ZpeHR1cmVfaWQgIT0gZmlyc3RfZml4dHVyZV9pZCkgeworICAgIC8vIElzIHRoZSBmaXJzdCB0ZXN0IGRlZmluZWQgdXNpbmcgVEVTVD8KKyAgICBjb25zdCBib29sIGZpcnN0X2lzX1RFU1QgPSBmaXJzdF9maXh0dXJlX2lkID09IGludGVybmFsOjpHZXRUZXN0VHlwZUlkKCk7CisgICAgLy8gSXMgdGhpcyB0ZXN0IGRlZmluZWQgdXNpbmcgVEVTVD8KKyAgICBjb25zdCBib29sIHRoaXNfaXNfVEVTVCA9IHRoaXNfZml4dHVyZV9pZCA9PSBpbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpOworCisgICAgaWYgKGZpcnN0X2lzX1RFU1QgfHwgdGhpc19pc19URVNUKSB7CisgICAgICAvLyBCb3RoIFRFU1QgYW5kIFRFU1RfRiBhcHBlYXIgaW4gc2FtZSB0ZXN0IGNhc2UsIHdoaWNoIGlzIGluY29ycmVjdC4KKyAgICAgIC8vIFRlbGwgdGhlIHVzZXIgaG93IHRvIGZpeCB0aGlzLgorCisgICAgICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBURVNUIGFuZCB0aGUgbmFtZSBvZiB0aGUgVEVTVF9GLiAgTm90ZQorICAgICAgLy8gdGhhdCBmaXJzdF9pc19URVNUIGFuZCB0aGlzX2lzX1RFU1QgY2Fubm90IGJvdGggYmUgdHJ1ZSwgYXMKKyAgICAgIC8vIHRoZSBmaXh0dXJlIElEcyBhcmUgZGlmZmVyZW50IGZvciB0aGUgdHdvIHRlc3RzLgorICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9uYW1lID0KKyAgICAgICAgICBmaXJzdF9pc19URVNUID8gZmlyc3RfdGVzdF9uYW1lIDogdGhpc190ZXN0X25hbWU7CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBURVNUX0ZfbmFtZSA9CisgICAgICAgICAgZmlyc3RfaXNfVEVTVCA/IHRoaXNfdGVzdF9uYW1lIDogZmlyc3RfdGVzdF9uYW1lOworCisgICAgICBBRERfRkFJTFVSRSgpCisgICAgICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCisgICAgICAgICAgPDwgImNsYXNzLCBzbyBtaXhpbmcgVEVTVF9GIGFuZCBURVNUIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBpc1xuIgorICAgICAgICAgIDw8ICJpbGxlZ2FsLiAgSW4gdGVzdCBjYXNlICIgPDwgdGhpc190ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkKKyAgICAgICAgICA8PCAiLFxuIgorICAgICAgICAgIDw8ICJ0ZXN0ICIgPDwgVEVTVF9GX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1RfRiBidXRcbiIKKyAgICAgICAgICA8PCAidGVzdCAiIDw8IFRFU1RfbmFtZSA8PCAiIGlzIGRlZmluZWQgdXNpbmcgVEVTVC4gIFlvdSBwcm9iYWJseVxuIgorICAgICAgICAgIDw8ICJ3YW50IHRvIGNoYW5nZSB0aGUgVEVTVCB0byBURVNUX0Ygb3IgbW92ZSBpdCB0byBhbm90aGVyIHRlc3RcbiIKKyAgICAgICAgICA8PCAiY2FzZS4iOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUd28gZml4dHVyZSBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhcHBlYXIgaW4gdHdvIGRpZmZlcmVudAorICAgICAgLy8gbmFtZXNwYWNlcywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIFRlbGwgdGhlIHVzZXIgaG93IHRvIGZpeCB0aGlzLgorICAgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgICAgIDw8ICJjbGFzcy4gIEhvd2V2ZXIsIGluIHRlc3QgY2FzZSAiCisgICAgICAgICAgPDwgdGhpc190ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkgPDwgIixcbiIKKyAgICAgICAgICA8PCAieW91IGRlZmluZWQgdGVzdCAiIDw8IGZpcnN0X3Rlc3RfbmFtZQorICAgICAgICAgIDw8ICIgYW5kIHRlc3QgIiA8PCB0aGlzX3Rlc3RfbmFtZSA8PCAiXG4iCisgICAgICAgICAgPDwgInVzaW5nIHR3byBkaWZmZXJlbnQgdGVzdCBmaXh0dXJlIGNsYXNzZXMuICBUaGlzIGNhbiBoYXBwZW4gaWZcbiIKKyAgICAgICAgICA8PCAidGhlIHR3byBjbGFzc2VzIGFyZSBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzIG9yIHRyYW5zbGF0aW9uXG4iCisgICAgICAgICAgPDwgInVuaXRzIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUuICBZb3Ugc2hvdWxkIHByb2JhYmx5IHJlbmFtZSBvbmVcbiIKKyAgICAgICAgICA8PCAib2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudCB0ZXN0IGNhc2VzLiI7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisjaWYgR1RFU1RfSEFTX1NFSAorCisvLyBBZGRzIGFuICJleGNlcHRpb24gdGhyb3duIiBmYXRhbCBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuICBUaGlzCisvLyBmdW5jdGlvbiByZXR1cm5zIGl0cyByZXN1bHQgdmlhIGFuIG91dHB1dCBwYXJhbWV0ZXIgcG9pbnRlciBiZWNhdXNlIFZDKysKKy8vIHByb2hpYml0cyBjcmVhdGlvbiBvZiBvYmplY3RzIHdpdGggZGVzdHJ1Y3RvcnMgb24gc3RhY2sgaW4gZnVuY3Rpb25zCisvLyB1c2luZyBfX3RyeSAoc2VlIGVycm9yIEMyNzEyKS4KK3N0YXRpYyBzdGQ6OnN0cmluZyogRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZShEV09SRCBleGNlcHRpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICBNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UgPDwgIlNFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4IiA8PCBzdGQ6OnNldGJhc2UoMTYpIDw8CisgICAgZXhjZXB0aW9uX2NvZGUgPDwgc3RkOjpzZXRiYXNlKDEwKSA8PCAiIHRocm93biBpbiAiIDw8IGxvY2F0aW9uIDw8ICIuIjsKKworICByZXR1cm4gbmV3IHN0ZDo6c3RyaW5nKG1lc3NhZ2UuR2V0U3RyaW5nKCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIEFkZHMgYW4gImV4Y2VwdGlvbiB0aHJvd24iIGZhdGFsIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyAgTWVzc2FnZSBtZXNzYWdlOworICBpZiAoZGVzY3JpcHRpb24gIT0gTlVMTCkgeworICAgIG1lc3NhZ2UgPDwgIkMrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiBcIiIgPDwgZGVzY3JpcHRpb24gPDwgIlwiIjsKKyAgfSBlbHNlIHsKKyAgICBtZXNzYWdlIDw8ICJVbmtub3duIEMrKyBleGNlcHRpb24iOworICB9CisgIG1lc3NhZ2UgPDwgIiB0aHJvd24gaW4gIiA8PCBsb2NhdGlvbiA8PCAiLiI7CisKKyAgcmV0dXJuIG1lc3NhZ2UuR2V0U3RyaW5nKCk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpOworCitHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbjo6R29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24oCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIGZhaWx1cmUpCisgICAgOiA6OnN0ZDo6cnVudGltZV9lcnJvcihQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoZmFpbHVyZSkuY19zdHIoKSkge30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBXZSBwdXQgdGhlc2UgaGVscGVyIGZ1bmN0aW9ucyBpbiB0aGUgaW50ZXJuYWwgbmFtZXNwYWNlIGFzIElCTSdzIHhsQworLy8gY29tcGlsZXIgcmVqZWN0cyB0aGUgY29kZSBpZiB0aGV5IHdlcmUgZGVjbGFyZWQgc3RhdGljLgorCisvLyBSdW5zIHRoZSBnaXZlbiBtZXRob2QgYW5kIGhhbmRsZXMgU0VIIGV4Y2VwdGlvbnMgaXQgdGhyb3dzLCB3aGVuCisvLyBTRUggaXMgc3VwcG9ydGVkOyByZXR1cm5zIHRoZSAwLXZhbHVlIGZvciB0eXBlIFJlc3VsdCBpbiBjYXNlIG9mIGFuCisvLyBTRUggZXhjZXB0aW9uLiAgKE1pY3Jvc29mdCBjb21waWxlcnMgY2Fubm90IGhhbmRsZSBTRUggYW5kIEMrKworLy8gZXhjZXB0aW9ucyBpbiB0aGUgc2FtZSBmdW5jdGlvbi4gIFRoZXJlZm9yZSwgd2UgcHJvdmlkZSBhIHNlcGFyYXRlCisvLyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBTRUggZXhjZXB0aW9ucy4pCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdHlwZW5hbWUgUmVzdWx0PgorUmVzdWx0IEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgIFQqIG9iamVjdCwgUmVzdWx0IChUOjoqbWV0aG9kKSgpLCBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworI2lmIEdURVNUX0hBU19TRUgKKyAgX190cnkgeworICAgIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOworICB9IF9fZXhjZXB0IChpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoICAvLyBOT0xJTlQKKyAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSkpIHsKKyAgICAvLyBXZSBjcmVhdGUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIG9uIHRoZSBoZWFwIGJlY2F1c2UgVkMrKyBwcm9oaWJpdHMKKyAgICAvLyBjcmVhdGlvbiBvZiBvYmplY3RzIHdpdGggZGVzdHJ1Y3RvcnMgb24gc3RhY2sgaW4gZnVuY3Rpb25zIHVzaW5nIF9fdHJ5CisgICAgLy8gKHNlZSBlcnJvciBDMjcxMikuCisgICAgc3RkOjpzdHJpbmcqIGV4Y2VwdGlvbl9tZXNzYWdlID0gRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZSgKKyAgICAgICAgR2V0RXhjZXB0aW9uQ29kZSgpLCBsb2NhdGlvbik7CisgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleGNlcHRpb25fbWVzc2FnZSk7CisgICAgZGVsZXRlIGV4Y2VwdGlvbl9tZXNzYWdlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOworICB9CisjZWxzZQorICAodm9pZClsb2NhdGlvbjsKKyAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKK30KKworLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBjYXRjaGVzIGFuZCByZXBvcnRzIEMrKyBhbmQvb3IgU0VILXN0eWxlCisvLyBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQ7IHJldHVybnMgdGhlIDAtdmFsdWUgZm9yIHR5cGUKKy8vIFJlc3VsdCBpbiBjYXNlIG9mIGFuIFNFSCBleGNlcHRpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdHlwZW5hbWUgUmVzdWx0PgorUmVzdWx0IEhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgIFQqIG9iamVjdCwgUmVzdWx0IChUOjoqbWV0aG9kKSgpLCBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICAvLyBOT1RFOiBUaGUgdXNlciBjb2RlIGNhbiBhZmZlY3QgdGhlIHdheSBpbiB3aGljaCBHb29nbGUgVGVzdCBoYW5kbGVzCisgIC8vIGV4Y2VwdGlvbnMgYnkgc2V0dGluZyBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpLCBidXQgb25seSBiZWZvcmUKKyAgLy8gUlVOX0FMTF9URVNUUygpIHN0YXJ0cy4gSXQgaXMgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8gY2hlY2sgdGhlIGZsYWcKKyAgLy8gYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYW5kIGVpdGhlciByZXBvcnQgb3IgcmUtdGhyb3cgdGhlCisgIC8vIGV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgZmxhZydzIHZhbHVlOgorICAvLworICAvLyB0cnkgeworICAvLyAgIC8vIFBlcmZvcm0gdGhlIHRlc3QgbWV0aG9kLgorICAvLyB9IGNhdGNoICguLi4pIHsKKyAgLy8gICBpZiAoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkKKyAgLy8gICAgIC8vIFJlcG9ydCB0aGUgZXhjZXB0aW9uIGFzIGZhaWx1cmUuCisgIC8vICAgZWxzZQorICAvLyAgICAgdGhyb3c7ICAvLyBSZS10aHJvd3MgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi4KKyAgLy8gfQorICAvLworICAvLyBIb3dldmVyLCB0aGUgcHVycG9zZSBvZiB0aGlzIGZsYWcgaXMgdG8gYWxsb3cgdGhlIHByb2dyYW0gdG8gZHJvcCBpbnRvCisgIC8vIHRoZSBkZWJ1Z2dlciB3aGVuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBPbiBtb3N0IHBsYXRmb3Jtcywgb25jZSB0aGUKKyAgLy8gY29udHJvbCBlbnRlcnMgdGhlIGNhdGNoIGJsb2NrLCB0aGUgZXhjZXB0aW9uIG9yaWdpbiBpbmZvcm1hdGlvbiBpcworICAvLyBsb3N0IGFuZCB0aGUgZGVidWdnZXIgd2lsbCBzdG9wIHRoZSBwcm9ncmFtIGF0IHRoZSBwb2ludCBvZiB0aGUKKyAgLy8gcmUtdGhyb3cgaW4gdGhpcyBmdW5jdGlvbiAtLSBpbnN0ZWFkIG9mIGF0IHRoZSBwb2ludCBvZiB0aGUgb3JpZ2luYWwKKyAgLy8gdGhyb3cgc3RhdGVtZW50IGluIHRoZSBjb2RlIHVuZGVyIHRlc3QuICBGb3IgdGhpcyByZWFzb24sIHdlIHBlcmZvcm0KKyAgLy8gdGhlIGNoZWNrIGVhcmx5LCBzYWNyaWZpY2luZyB0aGUgYWJpbGl0eSB0byBhZmZlY3QgR29vZ2xlIFRlc3QncworICAvLyBleGNlcHRpb24gaGFuZGxpbmcgaW4gdGhlIG1ldGhvZCB3aGVyZSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgaWYgKGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y2F0Y2hfZXhjZXB0aW9ucygpKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgICB0cnkgeworICAgICAgcmV0dXJuIEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKG9iamVjdCwgbWV0aG9kLCBsb2NhdGlvbik7CisgICAgfSBjYXRjaCAoY29uc3QgaW50ZXJuYWw6Okdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uJikgeyAgLy8gTk9MSU5UCisgICAgICAvLyBUaGlzIGV4Y2VwdGlvbiB0eXBlIGNhbiBvbmx5IGJlIHRocm93biBieSBhIGZhaWxlZCBHb29nbGUKKyAgICAgIC8vIFRlc3QgYXNzZXJ0aW9uIHdpdGggdGhlIGludGVudGlvbiBvZiBsZXR0aW5nIGFub3RoZXIgdGVzdGluZworICAgICAgLy8gZnJhbWV3b3JrIGNhdGNoIGl0LiAgVGhlcmVmb3JlIHdlIGp1c3QgcmUtdGhyb3cgaXQuCisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeyAgLy8gTk9MSU5UCisgICAgICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAorICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoZS53aGF0KCksIGxvY2F0aW9uKSk7CisgICAgfSBjYXRjaCAoLi4uKSB7ICAvLyBOT0xJTlQKKyAgICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCisgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShOVUxMLCBsb2NhdGlvbikpOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PigwKTsKKyNlbHNlCisgICAgcmV0dXJuIEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKG9iamVjdCwgbWV0aG9kLCBsb2NhdGlvbik7CisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFJ1bnMgdGhlIHRlc3QgYW5kIHVwZGF0ZXMgdGhlIHRlc3QgcmVzdWx0Lgordm9pZCBUZXN0OjpSdW4oKSB7CisgIGlmICghSGFzU2FtZUZpeHR1cmVDbGFzcygpKSByZXR1cm47CisKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKHRoaXMsICZUZXN0OjpTZXRVcCwgIlNldFVwKCkiKTsKKyAgLy8gV2Ugd2lsbCBydW4gdGhlIHRlc3Qgb25seSBpZiBTZXRVcCgpIHdhcyBzdWNjZXNzZnVsLgorICBpZiAoIUhhc0ZhdGFsRmFpbHVyZSgpKSB7CisgICAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICAgIHRoaXMsICZUZXN0OjpUZXN0Qm9keSwgInRoZSB0ZXN0IGJvZHkiKTsKKyAgfQorCisgIC8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gY2xlYW4gdXAgYXMgbXVjaCBhcyBwb3NzaWJsZS4gIEhlbmNlIHdlIHdpbGwKKyAgLy8gYWx3YXlzIGNhbGwgVGVhckRvd24oKSwgZXZlbiBpZiBTZXRVcCgpIG9yIHRoZSB0ZXN0IGJvZHkgaGFzCisgIC8vIGZhaWxlZC4KKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGhpcywgJlRlc3Q6OlRlYXJEb3duLCAiVGVhckRvd24oKSIpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkgeworICByZXR1cm4gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPkhhc0ZhdGFsRmFpbHVyZSgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCitib29sIFRlc3Q6Okhhc05vbmZhdGFsRmFpbHVyZSgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT4KKyAgICAgIEhhc05vbmZhdGFsRmFpbHVyZSgpOworfQorCisvLyBjbGFzcyBUZXN0SW5mbworCisvLyBDb25zdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiBJdCBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgdGVzdCBmYWN0b3J5CisvLyBvYmplY3QuCitUZXN0SW5mbzo6VGVzdEluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIGFfdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV92YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6Q29kZUxvY2F0aW9uIGFfY29kZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkKKyAgICA6IHRlc3RfY2FzZV9uYW1lXyhhX3Rlc3RfY2FzZV9uYW1lKSwKKyAgICAgIG5hbWVfKGFfbmFtZSksCisgICAgICB0eXBlX3BhcmFtXyhhX3R5cGVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV90eXBlX3BhcmFtKSA6IE5VTEwpLAorICAgICAgdmFsdWVfcGFyYW1fKGFfdmFsdWVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV92YWx1ZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIGxvY2F0aW9uXyhhX2NvZGVfbG9jYXRpb24pLAorICAgICAgZml4dHVyZV9jbGFzc19pZF8oZml4dHVyZV9jbGFzc19pZCksCisgICAgICBzaG91bGRfcnVuXyhmYWxzZSksCisgICAgICBpc19kaXNhYmxlZF8oZmFsc2UpLAorICAgICAgbWF0Y2hlc19maWx0ZXJfKGZhbHNlKSwKKyAgICAgIGZhY3RvcnlfKGZhY3RvcnkpLAorICAgICAgcmVzdWx0XygpIHt9CisKKy8vIERlc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4KK1Rlc3RJbmZvOjp+VGVzdEluZm8oKSB7IGRlbGV0ZSBmYWN0b3J5XzsgfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBDcmVhdGVzIGEgbmV3IFRlc3RJbmZvIG9iamVjdCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggR29vZ2xlIFRlc3Q7CisvLyByZXR1cm5zIHRoZSBjcmVhdGVkIG9iamVjdC4KKy8vCisvLyBBcmd1bWVudHM6CisvLworLy8gICB0ZXN0X2Nhc2VfbmFtZTogICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKy8vICAgbmFtZTogICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdAorLy8gICB0eXBlX3BhcmFtOiAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKy8vICAgdmFsdWVfcGFyYW06ICAgICAgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVzdCdzIHZhbHVlIHBhcmFtZXRlciwKKy8vICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKy8vICAgY29kZV9sb2NhdGlvbjogICAgY29kZSBsb2NhdGlvbiB3aGVyZSB0aGUgdGVzdCBpcyBkZWZpbmVkCisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK1Rlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCisgICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sCisgICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24sCisgICAgVHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgU2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgIFRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKKyAgICBUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpIHsKKyAgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgICBuZXcgVGVzdEluZm8odGVzdF9jYXNlX25hbWUsIG5hbWUsIHR5cGVfcGFyYW0sIHZhbHVlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIGNvZGVfbG9jYXRpb24sIGZpeHR1cmVfY2xhc3NfaWQsIGZhY3RvcnkpOworICBHZXRVbml0VGVzdEltcGwoKS0+QWRkVGVzdEluZm8oc2V0X3VwX3RjLCB0ZWFyX2Rvd25fdGMsIHRlc3RfaW5mbyk7CisgIHJldHVybiB0ZXN0X2luZm87Cit9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAordm9pZCBSZXBvcnRJbnZhbGlkVGVzdENhc2VUeXBlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uKSB7CisgIE1lc3NhZ2UgZXJyb3JzOworICBlcnJvcnMKKyAgICAgIDw8ICJBdHRlbXB0ZWQgcmVkZWZpbml0aW9uIG9mIHRlc3QgY2FzZSAiIDw8IHRlc3RfY2FzZV9uYW1lIDw8ICIuXG4iCisgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKKyAgICAgIDw8ICJjbGFzcy4gIEhvd2V2ZXIsIGluIHRlc3QgY2FzZSAiIDw8IHRlc3RfY2FzZV9uYW1lIDw8ICIsIHlvdSB0cmllZFxuIgorICAgICAgPDwgInRvIGRlZmluZSBhIHRlc3QgdXNpbmcgYSBmaXh0dXJlIGNsYXNzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmVcbiIKKyAgICAgIDw8ICJ1c2VkIGVhcmxpZXIuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgdHdvIGZpeHR1cmUgY2xhc3NlcyBhcmVcbiIKKyAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUuIFlvdSBzaG91bGRcbiIKKyAgICAgIDw8ICJwcm9iYWJseSByZW5hbWUgb25lIG9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnRcbiIKKyAgICAgIDw8ICJ0ZXN0IGNhc2VzLiI7CisKKyAgZnByaW50ZihzdGRlcnIsICIlcyAlcyIsCisgICAgICAgICAgRm9ybWF0RmlsZUxvY2F0aW9uKGNvZGVfbG9jYXRpb24uZmlsZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2xvY2F0aW9uLmxpbmUpLmNfc3RyKCksCisgICAgICAgICAgZXJyb3JzLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIHsKKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIHRlc3QgbmFtZSBvZiBhIFRlc3RJbmZvIGFnYWluc3QgYSBrbm93bgorLy8gdmFsdWUuCisvLworLy8gVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVzdENhc2UgY2xhc3Mgb25seS4gIFdlIHB1dAorLy8gaXQgaW4gdGhlIGFub255bW91cyBuYW1lc3BhY2UgdG8gcHJldmVudCBwb2xsdXRpbmcgdGhlIG91dGVyCisvLyBuYW1lc3BhY2UuCisvLworLy8gVGVzdE5hbWVJcyBpcyBjb3B5YWJsZS4KK2NsYXNzIFRlc3ROYW1lSXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRlc3ROYW1lSXMgaGFzIE5PIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIGV4cGxpY2l0IFRlc3ROYW1lSXMoY29uc3QgY2hhciogbmFtZSkKKyAgICAgIDogbmFtZV8obmFtZSkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdF9pbmZvIG1hdGNoZXMgbmFtZV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0SW5mbyAqIHRlc3RfaW5mbykgY29uc3QgeworICAgIHJldHVybiB0ZXN0X2luZm8gJiYgdGVzdF9pbmZvLT5uYW1lKCkgPT0gbmFtZV87CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoaXMgbWV0aG9kIGV4cGFuZHMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgcmVnaXN0ZXJlZCB3aXRoIG1hY3JvcyBURVNUX1AKKy8vIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBpbnRvIHJlZ3VsYXIgdGVzdHMgYW5kIHJlZ2lzdGVycyB0aG9zZS4KKy8vIFRoaXMgd2lsbCBiZSBkb25lIGp1c3Qgb25jZSBkdXJpbmcgdGhlIHByb2dyYW0gcnVudGltZS4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIHsKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBpZiAoIXBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8pIHsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfLlJlZ2lzdGVyVGVzdHMoKTsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfID0gdHJ1ZTsKKyAgfQorI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgorLy8gZGVsZXRlcyBpdC4KK3ZvaWQgVGVzdEluZm86OlJ1bigpIHsKKyAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHdoZXJlIHRvIHN0b3JlIHRlc3QgcmVzdWx0LgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8odGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHRlc3QgaXMgYWJvdXQgdG8gc3RhcnQuCisgIHJlcGVhdGVyLT5PblRlc3RTdGFydCgqdGhpcyk7CisKKyAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpOworCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisKKyAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QuCisgIFRlc3QqIGNvbnN0IHRlc3QgPSBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICBmYWN0b3J5XywgJmludGVybmFsOjpUZXN0RmFjdG9yeUJhc2U6OkNyZWF0ZVRlc3QsCisgICAgICAidGhlIHRlc3QgZml4dHVyZSdzIGNvbnN0cnVjdG9yIik7CisKKyAgLy8gUnVucyB0aGUgdGVzdCBvbmx5IGlmIHRoZSB0ZXN0IG9iamVjdCB3YXMgY3JlYXRlZCBhbmQgaXRzCisgIC8vIGNvbnN0cnVjdG9yIGRpZG4ndCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUuCisgIGlmICgodGVzdCAhPSBOVUxMKSAmJiAhVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICAvLyBUaGlzIGRvZXNuJ3QgdGhyb3cgYXMgYWxsIHVzZXIgY29kZSB0aGF0IGNhbiB0aHJvdyBhcmUgd3JhcHBlZCBpbnRvCisgICAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUuCisgICAgdGVzdC0+UnVuKCk7CisgIH0KKworICAvLyBEZWxldGVzIHRoZSB0ZXN0IG9iamVjdC4KKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGVzdCwgJlRlc3Q6OkRlbGV0ZVNlbGZfLCAidGhlIHRlc3QgZml4dHVyZSdzIGRlc3RydWN0b3IiKTsKKworICByZXN1bHRfLnNldF9lbGFwc2VkX3RpbWUoaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQpOworCisgIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCBhIHRlc3QgaGFzIGp1c3QgZmluaXNoZWQuCisgIHJlcGVhdGVyLT5PblRlc3RFbmQoKnRoaXMpOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHRvIHN0b3AgYXNzb2NpYXRpbmcgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gdGhpcworICAvLyB0ZXN0LgorICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8oTlVMTCk7Cit9CisKKy8vIGNsYXNzIFRlc3RDYXNlCisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgoraW50IFRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCitpbnQgVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RGYWlsZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgoraW50IFRlc3RDYXNlOjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFJlcG9ydGFibGVEaXNhYmxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK2ludCBUZXN0Q2FzZTo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0RGlzYWJsZWQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KK2ludCBUZXN0Q2FzZTo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RSZXBvcnRhYmxlKTsKK30KKworLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgoraW50IFRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBTaG91bGRSdW5UZXN0KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9pbmZvX2xpc3RfLnNpemUoKSk7Cit9CisKKy8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2U6OlRlc3RDYXNlKGNvbnN0IGNoYXIqIGFfbmFtZSwgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpCisgICAgOiBuYW1lXyhhX25hbWUpLAorICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIHNldF91cF90Y18oc2V0X3VwX3RjKSwKKyAgICAgIHRlYXJfZG93bl90Y18odGVhcl9kb3duX3RjKSwKKyAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorVGVzdENhc2U6On5UZXN0Q2FzZSgpIHsKKyAgLy8gRGVsZXRlcyBldmVyeSBUZXN0IGluIHRoZSBjb2xsZWN0aW9uLgorICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0SW5mbz4pOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitjb25zdCBUZXN0SW5mbyogVGVzdENhc2U6OkdldFRlc3RJbmZvKGludCBpKSBjb25zdCB7CisgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7CisgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9pbmZvX2xpc3RfW2luZGV4XTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpIHsKKyAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKKyAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOworfQorCisvLyBBZGRzIGEgdGVzdCB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSB0ZXN0IHVwb24KKy8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCit2b2lkIFRlc3RDYXNlOjpBZGRUZXN0SW5mbyhUZXN0SW5mbyAqIHRlc3RfaW5mbykgeworICB0ZXN0X2luZm9fbGlzdF8ucHVzaF9iYWNrKHRlc3RfaW5mbyk7CisgIHRlc3RfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9pbmRpY2VzXy5zaXplKCkpKTsKK30KKworLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuCit2b2lkIFRlc3RDYXNlOjpSdW4oKSB7CisgIGlmICghc2hvdWxkX3J1bl8pIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2Nhc2UodGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgcmVwZWF0ZXItPk9uVGVzdENhc2VTdGFydCgqdGhpcyk7CisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuU2V0VXBUZXN0Q2FzZSwgIlNldFVwVGVzdENhc2UoKSIpOworCisgIGNvbnN0IGludGVybmFsOjpUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfdGVzdF9jb3VudCgpOyBpKyspIHsKKyAgICBHZXRNdXRhYmxlVGVzdEluZm8oaSktPlJ1bigpOworICB9CisgIGVsYXBzZWRfdGltZV8gPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKKworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdENhc2U6OlJ1blRlYXJEb3duVGVzdENhc2UsICJUZWFyRG93blRlc3RDYXNlKCkiKTsKKworICByZXBlYXRlci0+T25UZXN0Q2FzZUVuZCgqdGhpcyk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZShOVUxMKTsKK30KKworLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OkNsZWFyUmVzdWx0KCkgeworICBhZF9ob2NfdGVzdF9yZXN1bHRfLkNsZWFyKCk7CisgIEZvckVhY2godGVzdF9pbmZvX2xpc3RfLCBUZXN0SW5mbzo6Q2xlYXJUZXN0UmVzdWx0KTsKK30KKworLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgordm9pZCBUZXN0Q2FzZTo6U2h1ZmZsZVRlc3RzKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSkgeworICBTaHVmZmxlKHJhbmRvbSwgJnRlc3RfaW5kaWNlc18pOworfQorCisvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCit2b2lkIFRlc3RDYXNlOjpVbnNodWZmbGVUZXN0cygpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2luZGljZXNfLnNpemUoKTsgaSsrKSB7CisgICAgdGVzdF9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7CisgIH0KK30KKworLy8gRm9ybWF0cyBhIGNvdW50YWJsZSBub3VuLiAgRGVwZW5kaW5nIG9uIGl0cyBxdWFudGl0eSwgZWl0aGVyIHRoZQorLy8gc2luZ3VsYXIgZm9ybSBvciB0aGUgcGx1cmFsIGZvcm0gaXMgdXNlZC4gZS5nLgorLy8KKy8vIEZvcm1hdENvdW50YWJsZU5vdW4oMSwgImZvcm11bGEiLCAiZm9ybXVsaSIpIHJldHVybnMgIjEgZm9ybXVsYSIuCisvLyBGb3JtYXRDb3VudGFibGVOb3VuKDUsICJib29rIiwgImJvb2tzIikgcmV0dXJucyAiNSBib29rcyIuCitzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q291bnRhYmxlTm91bihpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogc2luZ3VsYXJfZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBwbHVyYWxfZm9ybSkgeworICByZXR1cm4gaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhjb3VudCkgKyAiICIgKworICAgICAgKGNvdW50ID09IDEgPyBzaW5ndWxhcl9mb3JtIDogcGx1cmFsX2Zvcm0pOworfQorCisvLyBGb3JtYXRzIHRoZSBjb3VudCBvZiB0ZXN0cy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUZXN0Q291bnQoaW50IHRlc3RfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jb3VudCwgInRlc3QiLCAidGVzdHMiKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdCBjYXNlcy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRUZXN0Q2FzZUNvdW50KGludCB0ZXN0X2Nhc2VfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlX2NvdW50LCAidGVzdCBjYXNlIiwgInRlc3QgY2FzZXMiKTsKK30KKworLy8gQ29udmVydHMgYSBUZXN0UGFydFJlc3VsdDo6VHlwZSBlbnVtIHRvIGh1bWFuLWZyaWVuZGx5IHN0cmluZworLy8gcmVwcmVzZW50YXRpb24uICBCb3RoIGtOb25GYXRhbEZhaWx1cmUgYW5kIGtGYXRhbEZhaWx1cmUgYXJlIHRyYW5zbGF0ZWQKKy8vIHRvICJGYWlsdXJlIiwgYXMgdGhlIHVzZXIgdXN1YWxseSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UKKy8vIGJldHdlZW4gdGhlIHR3byB3aGVuIHZpZXdpbmcgdGhlIHRlc3QgcmVzdWx0Lgorc3RhdGljIGNvbnN0IGNoYXIgKiBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyhUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzOgorICAgICAgcmV0dXJuICJTdWNjZXNzIjsKKworICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmU6CisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZToKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgcmV0dXJuICJlcnJvcjogIjsKKyNlbHNlCisgICAgICByZXR1cm4gIkZhaWx1cmVcbiI7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJVbmtub3duIHJlc3VsdCB0eXBlIjsKKyAgfQorfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCB0byBhbiBzdGQ6OnN0cmluZy4KK3N0YXRpYyBzdGQ6OnN0cmluZyBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgcmV0dXJuIChNZXNzYWdlKCkKKyAgICAgICAgICA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpCisgICAgICAgICAgPDwgIiAiIDw8IFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQudHlwZSgpKQorICAgICAgICAgIDw8IHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKS5HZXRTdHJpbmcoKTsKK30KKworLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQuCitzdGF0aWMgdm9pZCBQcmludFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXN1bHQgPQorICAgICAgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQpOworICBwcmludGYoIiVzXG4iLCByZXN1bHQuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworICAvLyBJZiB0aGUgdGVzdCBwcm9ncmFtIHJ1bnMgaW4gVmlzdWFsIFN0dWRpbyBvciBhIGRlYnVnZ2VyLCB0aGUKKyAgLy8gZm9sbG93aW5nIHN0YXRlbWVudHMgYWRkIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIE91dHB1dAorICAvLyB3aW5kb3cgc3VjaCB0aGF0IHRoZSB1c2VyIGNhbiBkb3VibGUtY2xpY2sgb24gaXQgdG8ganVtcCB0byB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBsb2NhdGlvbjsgb3RoZXJ3aXNlIHRoZXkgZG8gbm90aGluZy4KKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXZSBkb24ndCBjYWxsIE91dHB1dERlYnVnU3RyaW5nKigpIG9uIFdpbmRvd3MgTW9iaWxlLCBhcyBwcmludGluZworICAvLyB0byBzdGRvdXQgaXMgZG9uZSBieSBPdXRwdXREZWJ1Z1N0cmluZygpIHRoZXJlIGFscmVhZHkgLSB3ZSBkb24ndAorICAvLyB3YW50IHRoZSBzYW1lIG1lc3NhZ2UgcHJpbnRlZCB0d2ljZS4KKyAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EocmVzdWx0LmNfc3RyKCkpOworICA6Ok91dHB1dERlYnVnU3RyaW5nQSgiXG4iKTsKKyNlbmRpZgorfQorCisvLyBjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworZW51bSBHVGVzdENvbG9yIHsKKyAgQ09MT1JfREVGQVVMVCwKKyAgQ09MT1JfUkVELAorICBDT0xPUl9HUkVFTiwKKyAgQ09MT1JfWUVMTE9XCit9OworCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgJiYgXAorICAgICFHVEVTVF9PU19XSU5ET1dTX1BIT05FICYmICFHVEVTVF9PU19XSU5ET1dTX1JUCisKKy8vIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBjb2xvci4KK1dPUkQgR2V0Q29sb3JBdHRyaWJ1dGUoR1Rlc3RDb2xvciBjb2xvcikgeworICBzd2l0Y2ggKGNvbG9yKSB7CisgICAgY2FzZSBDT0xPUl9SRUQ6ICAgIHJldHVybiBGT1JFR1JPVU5EX1JFRDsKKyAgICBjYXNlIENPTE9SX0dSRUVOOiAgcmV0dXJuIEZPUkVHUk9VTkRfR1JFRU47CisgICAgY2FzZSBDT0xPUl9ZRUxMT1c6IHJldHVybiBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfR1JFRU47CisgICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiAwOworICB9Cit9CisKKyNlbHNlCisKKy8vIFJldHVybnMgdGhlIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIGNvbG9yLiAgQ09MT1JfREVGQVVMVCBpcworLy8gYW4gaW52YWxpZCBpbnB1dC4KK2NvbnN0IGNoYXIqIEdldEFuc2lDb2xvckNvZGUoR1Rlc3RDb2xvciBjb2xvcikgeworICBzd2l0Y2ggKGNvbG9yKSB7CisgICAgY2FzZSBDT0xPUl9SRUQ6ICAgICByZXR1cm4gIjEiOworICAgIGNhc2UgQ09MT1JfR1JFRU46ICAgcmV0dXJuICIyIjsKKyAgICBjYXNlIENPTE9SX1lFTExPVzogIHJldHVybiAiMyI7CisgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgfTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBSZXR1cm5zIHRydWUgaWZmIEdvb2dsZSBUZXN0IHNob3VsZCB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCitib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9jb2xvciA9IEdURVNUX0ZMQUcoY29sb3IpLmNfc3RyKCk7CisKKyAgaWYgKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgImF1dG8iKSkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgICAvLyBPbiBXaW5kb3dzIHRoZSBURVJNIHZhcmlhYmxlIGlzIHVzdWFsbHkgbm90IHNldCwgYnV0IHRoZQorICAgIC8vIGNvbnNvbGUgdGhlcmUgZG9lcyBzdXBwb3J0IGNvbG9ycy4KKyAgICByZXR1cm4gc3Rkb3V0X2lzX3R0eTsKKyNlbHNlCisgICAgLy8gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBURVJNIHZhcmlhYmxlLgorICAgIGNvbnN0IGNoYXIqIGNvbnN0IHRlcm0gPSBwb3NpeDo6R2V0RW52KCJURVJNIik7CisgICAgY29uc3QgYm9vbCB0ZXJtX3N1cHBvcnRzX2NvbG9yID0KKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybSIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0tY29sb3IiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtLTI1NmNvbG9yIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJzY3JlZW4iKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInNjcmVlbi0yNTZjb2xvciIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAicnh2dC11bmljb2RlIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJyeHZ0LXVuaWNvZGUtMjU2Y29sb3IiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImxpbnV4IikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJjeWd3aW4iKTsKKyAgICByZXR1cm4gc3Rkb3V0X2lzX3R0eSAmJiB0ZXJtX3N1cHBvcnRzX2NvbG9yOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgIH0KKworICByZXR1cm4gU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAieWVzIikgfHwKKyAgICAgIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInRydWUiKSB8fAorICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidCIpIHx8CisgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICIxIik7CisgIC8vIFdlIHRha2UgInllcyIsICJ0cnVlIiwgInQiLCBhbmQgIjEiIGFzIG1lYW5pbmcgInllcyIuICBJZiB0aGUKKyAgLy8gdmFsdWUgaXMgbmVpdGhlciBvbmUgb2YgdGhlc2Ugbm9yICJhdXRvIiwgd2UgdHJlYXQgaXQgYXMgIm5vIiB0bworICAvLyBiZSBjb25zZXJ2YXRpdmUuCit9CisKKy8vIEhlbHBlcnMgZm9yIHByaW50aW5nIGNvbG9yZWQgc3RyaW5ncyB0byBzdGRvdXQuIE5vdGUgdGhhdCBvbiBXaW5kb3dzLCB3ZQorLy8gY2Fubm90IHNpbXBseSBlbWl0IHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgaGF2ZSB0aGUgdGVybWluYWwgY2hhbmdlIGNvbG9ycy4KKy8vIFRoaXMgcm91dGluZSBtdXN0IGFjdHVhbGx5IGVtaXQgdGhlIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gcmV0dXJuIGEgc3RyaW5nCisvLyB0aGF0IHdvdWxkIGJlIGNvbG9yZWQgd2hlbiBwcmludGVkLCBhcyBjYW4gYmUgZG9uZSBvbiBMaW51eC4KK3ZvaWQgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUyB8fCBcCisgICAgR1RFU1RfT1NfSU9TIHx8IEdURVNUX09TX1dJTkRPV1NfUEhPTkUgfHwgR1RFU1RfT1NfV0lORE9XU19SVAorICBjb25zdCBib29sIHVzZV9jb2xvciA9IEFsd2F5c0ZhbHNlKCk7CisjZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCBpbl9jb2xvcl9tb2RlID0KKyAgICAgIFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkocG9zaXg6OkZpbGVObyhzdGRvdXQpKSAhPSAwKTsKKyAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBpbl9jb2xvcl9tb2RlICYmIChjb2xvciAhPSBDT0xPUl9ERUZBVUxUKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBHVEVTVF9PU19aT1MKKyAgLy8gVGhlICchPSAwJyBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IE1TVkMgNy4xLgorCisgIGlmICghdXNlX2NvbG9yKSB7CisgICAgdnByaW50ZihmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmIFwKKyAgICAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVAorICBjb25zdCBIQU5ETEUgc3Rkb3V0X2hhbmRsZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisKKyAgLy8gR2V0cyB0aGUgY3VycmVudCB0ZXh0IGNvbG9yLgorICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBidWZmZXJfaW5mbzsKKyAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oc3Rkb3V0X2hhbmRsZSwgJmJ1ZmZlcl9pbmZvKTsKKyAgY29uc3QgV09SRCBvbGRfY29sb3JfYXR0cnMgPSBidWZmZXJfaW5mby53QXR0cmlidXRlczsKKworICAvLyBXZSBuZWVkIHRvIGZsdXNoIHRoZSBzdHJlYW0gYnVmZmVycyBpbnRvIHRoZSBjb25zb2xlIGJlZm9yZSBlYWNoCisgIC8vIFNldENvbnNvbGVUZXh0QXR0cmlidXRlIGNhbGwgbGVzdCBpdCBhZmZlY3QgdGhlIHRleHQgdGhhdCBpcyBhbHJlYWR5CisgIC8vIHByaW50ZWQgYnV0IGhhcyBub3QgeWV0IHJlYWNoZWQgdGhlIGNvbnNvbGUuCisgIGZmbHVzaChzdGRvdXQpOworICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb2xvckF0dHJpYnV0ZShjb2xvcikgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKworICBmZmx1c2goc3Rkb3V0KTsKKyAgLy8gUmVzdG9yZXMgdGhlIHRleHQgY29sb3IuCisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsIG9sZF9jb2xvcl9hdHRycyk7CisjZWxzZQorICBwcmludGYoIlwwMzNbMDszJXNtIiwgR2V0QW5zaUNvbG9yQ29kZShjb2xvcikpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHByaW50ZigiXDAzM1ttIik7ICAvLyBSZXNldHMgdGhlIHRlcm1pbmFsIHRvIGRlZmF1bHQuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIHZhX2VuZChhcmdzKTsKK30KKworLy8gVGV4dCBwcmludGVkIGluIEdvb2dsZSBUZXN0J3MgdGV4dCBvdXRwdXQgYW5kIC0tZ3VuaXRfbGlzdF90ZXN0cworLy8gb3V0cHV0IHRvIGxhYmVsIHRoZSB0eXBlIHBhcmFtZXRlciBhbmQgdmFsdWUgcGFyYW1ldGVyIGZvciBhIHRlc3QuCitzdGF0aWMgY29uc3QgY2hhciBrVHlwZVBhcmFtTGFiZWxbXSA9ICJUeXBlUGFyYW0iOworc3RhdGljIGNvbnN0IGNoYXIga1ZhbHVlUGFyYW1MYWJlbFtdID0gIkdldFBhcmFtKCkiOworCit2b2lkIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgY29uc3QgY2hhciogY29uc3QgdHlwZV9wYXJhbSA9IHRlc3RfaW5mby50eXBlX3BhcmFtKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3BhcmFtID0gdGVzdF9pbmZvLnZhbHVlX3BhcmFtKCk7CisKKyAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCB8fCB2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgcHJpbnRmKCIsIHdoZXJlICIpOworICAgIGlmICh0eXBlX3BhcmFtICE9IE5VTEwpIHsKKyAgICAgIHByaW50ZigiJXMgPSAlcyIsIGtUeXBlUGFyYW1MYWJlbCwgdHlwZV9wYXJhbSk7CisgICAgICBpZiAodmFsdWVfcGFyYW0gIT0gTlVMTCkKKyAgICAgICAgcHJpbnRmKCIgYW5kICIpOworICAgIH0KKyAgICBpZiAodmFsdWVfcGFyYW0gIT0gTlVMTCkgeworICAgICAgcHJpbnRmKCIlcyA9ICVzIiwga1ZhbHVlUGFyYW1MYWJlbCwgdmFsdWVfcGFyYW0pOworICAgIH0KKyAgfQorfQorCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGludGVyZmFjZS4KKy8vCisvLyBDbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIgaXMgY29weWFibGUuCitjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyKCkge30KKyAgc3RhdGljIHZvaWQgUHJpbnRUZXN0TmFtZShjb25zdCBjaGFyICogdGVzdF9jYXNlLCBjb25zdCBjaGFyICogdGVzdCkgeworICAgIHByaW50ZigiJXMuJXMiLCB0ZXN0X2Nhc2UsIHRlc3QpOworICB9CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIG92ZXJyaWRlIHdoYXQncyBpbiB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworfTsKKworICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLgordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvblN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKEdURVNUX0ZMQUcocmVwZWF0KSAhPSAxKQorICAgIHByaW50ZigiXG5SZXBlYXRpbmcgYWxsIHRlc3RzIChpdGVyYXRpb24gJWQpIC4gLiAuXG5cbiIsIGl0ZXJhdGlvbiArIDEpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbHRlciA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOworCisgIC8vIFByaW50cyB0aGUgZmlsdGVyIGlmIGl0J3Mgbm90ICouICBUaGlzIHJlbWluZHMgdGhlIHVzZXIgdGhhdCBzb21lCisgIC8vIHRlc3RzIG1heSBiZSBza2lwcGVkLgorICBpZiAoIVN0cmluZzo6Q1N0cmluZ0VxdWFscyhmaWx0ZXIsIGtVbml2ZXJzYWxGaWx0ZXIpKSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogJXMgZmlsdGVyID0gJXNcbiIsIEdURVNUX05BTUVfLCBmaWx0ZXIpOworICB9CisKKyAgaWYgKGludGVybmFsOjpTaG91bGRTaGFyZChrVGVzdFRvdGFsU2hhcmRzLCBrVGVzdFNoYXJkSW5kZXgsIGZhbHNlKSkgeworICAgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RTaGFyZEluZGV4LCAtMSk7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogVGhpcyBpcyB0ZXN0IHNoYXJkICVkIG9mICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2hhcmRfaW5kZXgpICsgMSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwb3NpeDo6R2V0RW52KGtUZXN0VG90YWxTaGFyZHMpKTsKKyAgfQorCisgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogUmFuZG9taXppbmcgdGVzdHMnIG9yZGVycyB3aXRoIGEgc2VlZCBvZiAlZCAuXG4iLAorICAgICAgICAgICAgICAgICAgdW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpOworICB9CisKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbPT09PT09PT09PV0gIik7CisgIHByaW50ZigiUnVubmluZyAlcyBmcm9tICVzLlxuIiwKKyAgICAgICAgIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3QudGVzdF90b19ydW5fY291bnQoKSkuY19zdHIoKSwKKyAgICAgICAgIEZvcm1hdFRlc3RDYXNlQ291bnQodW5pdF90ZXN0LnRlc3RfY2FzZV90b19ydW5fY291bnQoKSkuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC5cbiIpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9CisgICAgICBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZS50ZXN0X3RvX3J1bl9jb3VudCgpLCAidGVzdCIsICJ0ZXN0cyIpOworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIiVzIGZyb20gJXMiLCBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlLm5hbWUoKSk7CisgIGlmICh0ZXN0X2Nhc2UudHlwZV9wYXJhbSgpID09IE5VTEwpIHsKKyAgICBwcmludGYoIlxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCIsIHdoZXJlICVzID0gJXNcbiIsIGtUeXBlUGFyYW1MYWJlbCwgdGVzdF9jYXNlLnR5cGVfcGFyYW0oKSk7CisgIH0KKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWyBSVU4gICAgICBdICIpOworICBQcmludFRlc3ROYW1lKHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgcHJpbnRmKCJcbiIpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKworLy8gQ2FsbGVkIGFmdGVyIGFuIGFzc2VydGlvbiBmYWlsdXJlLgordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdFBhcnRSZXN1bHQoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICAvLyBJZiB0aGUgdGVzdCBwYXJ0IHN1Y2NlZWRlZCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KKyAgaWYgKHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKQorICAgIHJldHVybjsKKworICAvLyBQcmludCBmYWlsdXJlIG1lc3NhZ2UgZnJvbSB0aGUgYXNzZXJ0aW9uIChlLmcuIGV4cGVjdGVkIHRoaXMgYW5kIGdvdCB0aGF0KS4KKyAgUHJpbnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgIGlmICh0ZXN0X2luZm8ucmVzdWx0KCktPlBhc3NlZCgpKSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgIlsgICAgICAgT0sgXSAiKTsKKyAgfSBlbHNlIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgIlsgIEZBSUxFRCAgXSAiKTsKKyAgfQorICBQcmludFRlc3ROYW1lKHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+RmFpbGVkKCkpCisgICAgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQodGVzdF9pbmZvKTsKKworICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgeworICAgIHByaW50ZigiICglcyBtcylcbiIsIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoCisgICAgICAgICAgIHRlc3RfaW5mby5yZXN1bHQoKS0+ZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOworICB9IGVsc2UgeworICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICBpZiAoIUdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHJldHVybjsKKworICBjb25zdCBzdGQ6OnN0cmluZyBjb3VudHMgPQorICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgIlstLS0tLS0tLS0tXSAiKTsKKyAgcHJpbnRmKCIlcyBmcm9tICVzICglcyBtcyB0b3RhbClcblxuIiwKKyAgICAgICAgIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2UubmFtZSgpLAorICAgICAgICAgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCgKKyAgICBjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlstLS0tLS0tLS0tXSAiKTsKKyAgcHJpbnRmKCJHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd25cbiIpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKworLy8gSW50ZXJuYWwgaGVscGVyIGZvciBwcmludGluZyB0aGUgbGlzdCBvZiBmYWlsZWQgdGVzdHMuCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UHJpbnRGYWlsZWRUZXN0cyhjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7CisgIGNvbnN0IGludCBmYWlsZWRfdGVzdF9jb3VudCA9IHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpOworICBpZiAoZmFpbGVkX3Rlc3RfY291bnQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlID0gKnVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKTsKKyAgICBpZiAoIXRlc3RfY2FzZS5zaG91bGRfcnVuKCkgfHwgKHRlc3RfY2FzZS5mYWlsZWRfdGVzdF9jb3VudCgpID09IDApKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2opIHsKKyAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8gPSAqdGVzdF9jYXNlLkdldFRlc3RJbmZvKGopOworICAgICAgaWYgKCF0ZXN0X2luZm8uc2hvdWxkX3J1bigpIHx8IHRlc3RfaW5mby5yZXN1bHQoKS0+UGFzc2VkKCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgIlsgIEZBSUxFRCAgXSAiKTsKKyAgICAgIHByaW50ZigiJXMuJXMiLCB0ZXN0X2Nhc2UubmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgICAgIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KHRlc3RfaW5mbyk7CisgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbPT09PT09PT09PV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyByYW4uIiwKKyAgICAgICAgIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3QudGVzdF90b19ydW5fY291bnQoKSkuY19zdHIoKSwKKyAgICAgICAgIEZvcm1hdFRlc3RDYXNlQ291bnQodW5pdF90ZXN0LnRlc3RfY2FzZV90b19ydW5fY291bnQoKSkuY19zdHIoKSk7CisgIGlmIChHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB7CisgICAgcHJpbnRmKCIgKCVzIG1zIHRvdGFsKSIsCisgICAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgfQorICBwcmludGYoIlxuIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWyAgUEFTU0VEICBdICIpOworICBwcmludGYoIiVzLlxuIiwgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSkuY19zdHIoKSk7CisKKyAgaW50IG51bV9mYWlsdXJlcyA9IHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpOworICBpZiAoIXVuaXRfdGVzdC5QYXNzZWQoKSkgeworICAgIGNvbnN0IGludCBmYWlsZWRfdGVzdF9jb3VudCA9IHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpOworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAgIlsgIEZBSUxFRCAgXSAiKTsKKyAgICBwcmludGYoIiVzLCBsaXN0ZWQgYmVsb3c6XG4iLCBGb3JtYXRUZXN0Q291bnQoZmFpbGVkX3Rlc3RfY291bnQpLmNfc3RyKCkpOworICAgIFByaW50RmFpbGVkVGVzdHModW5pdF90ZXN0KTsKKyAgICBwcmludGYoIlxuJTJkIEZBSUxFRCAlc1xuIiwgbnVtX2ZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2ZhaWx1cmVzID09IDEgPyAiVEVTVCIgOiAiVEVTVFMiKTsKKyAgfQorCisgIGludCBudW1fZGlzYWJsZWQgPSB1bml0X3Rlc3QucmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCk7CisgIGlmIChudW1fZGlzYWJsZWQgJiYgIUdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKSB7CisgICAgaWYgKCFudW1fZmFpbHVyZXMpIHsKKyAgICAgIHByaW50ZigiXG4iKTsgIC8vIEFkZCBhIHNwYWNlciBpZiBubyBGQUlMVVJFIGJhbm5lciBpcyBkaXNwbGF5ZWQuCisgICAgfQorICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAorICAgICAgICAgICAgICAgICAgIiAgWU9VIEhBVkUgJWQgRElTQUJMRUQgJXNcblxuIiwKKyAgICAgICAgICAgICAgICAgIG51bV9kaXNhYmxlZCwKKyAgICAgICAgICAgICAgICAgIG51bV9kaXNhYmxlZCA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CisgIH0KKyAgLy8gRW5zdXJlIHRoYXQgR29vZ2xlIFRlc3Qgb3V0cHV0IGlzIHByaW50ZWQgYmVmb3JlLCBlLmcuLCBoZWFwY2hlY2tlciBvdXRwdXQuCisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBFbmQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyCisKKy8vIGNsYXNzIFRlc3RFdmVudFJlcGVhdGVyCisvLworLy8gVGhpcyBjbGFzcyBmb3J3YXJkcyBldmVudHMgdG8gb3RoZXIgZXZlbnQgbGlzdGVuZXJzLgorY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgVGVzdEV2ZW50UmVwZWF0ZXIoKSA6IGZvcndhcmRpbmdfZW5hYmxlZF8odHJ1ZSkge30KKyAgdmlydHVhbCB+VGVzdEV2ZW50UmVwZWF0ZXIoKTsKKyAgdm9pZCBBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIFJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCB0byBsaXN0ZW5lcnNfLiBTZXQgdG8gZmFsc2UKKyAgLy8gaW4gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzZXMuCisgIGJvb2wgZm9yd2FyZGluZ19lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZm9yd2FyZGluZ19lbmFibGVkXzsgfQorICB2b2lkIHNldF9mb3J3YXJkaW5nX2VuYWJsZWQoYm9vbCBlbmFibGUpIHsgZm9yd2FyZGluZ19lbmFibGVkXyA9IGVuYWJsZTsgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisKKyBwcml2YXRlOgorICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCB0byBsaXN0ZW5lcnNfLiBTZXQgdG8gZmFsc2UKKyAgLy8gaW4gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzZXMuCisgIGJvb2wgZm9yd2FyZGluZ19lbmFibGVkXzsKKyAgLy8gVGhlIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgcmVjZWl2ZSBldmVudHMuCisgIHN0ZDo6dmVjdG9yPFRlc3RFdmVudExpc3RlbmVyKj4gbGlzdGVuZXJzXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudFJlcGVhdGVyKTsKK307CisKK1Rlc3RFdmVudFJlcGVhdGVyOjp+VGVzdEV2ZW50UmVwZWF0ZXIoKSB7CisgIEZvckVhY2gobGlzdGVuZXJzXywgRGVsZXRlPFRlc3RFdmVudExpc3RlbmVyPik7Cit9CisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpIHsKKyAgbGlzdGVuZXJzXy5wdXNoX2JhY2sobGlzdGVuZXIpOworfQorCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBGYWN0b3IgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IGludG8gVmVjdG9yOjpGaW5kLgorVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudFJlcGVhdGVyOjpSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcikgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobGlzdGVuZXJzX1tpXSA9PSBsaXN0ZW5lcikgeworICAgICAgbGlzdGVuZXJzXy5lcmFzZShsaXN0ZW5lcnNfLmJlZ2luKCkgKyBpKTsKKyAgICAgIHJldHVybiBsaXN0ZW5lcjsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLy8gU2luY2UgbW9zdCBtZXRob2RzIGFyZSB2ZXJ5IHNpbWlsYXIsIHVzZSBtYWNyb3MgdG8gcmVkdWNlIGJvaWxlcnBsYXRlLgorLy8gVGhpcyBkZWZpbmVzIGEgbWVtYmVyIHRoYXQgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYWxsIGxpc3RlbmVycy4KKyNkZWZpbmUgR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhOYW1lLCBUeXBlKSBcCit2b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpOYW1lKGNvbnN0IFR5cGUmIHBhcmFtZXRlcikgeyBcCisgIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7IFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsgXAorICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcCisgICAgfSBcCisgIH0gXAorfQorLy8gVGhpcyBkZWZpbmVzIGEgbWVtYmVyIHRoYXQgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYWxsIGxpc3RlbmVycyBpbiByZXZlcnNlCisvLyBvcmRlci4KKyNkZWZpbmUgR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE5hbWUsIFR5cGUpIFwKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok5hbWUoY29uc3QgVHlwZSYgcGFyYW1ldGVyKSB7IFwKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXAorICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RlbmVyc18uc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7IFwKKyAgICAgIGxpc3RlbmVyc19baV0tPk5hbWUocGFyYW1ldGVyKTsgXAorICAgIH0gXAorICB9IFwKK30KKworR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1NldFVwU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlU3RhcnQsIFRlc3RDYXNlKQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RTdGFydCwgVGVzdEluZm8pCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFBhcnRSZXN1bHQsIFRlc3RQYXJ0UmVzdWx0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBFbmQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdEVuZCwgVGVzdEluZm8pCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0Q2FzZUVuZCwgVGVzdENhc2UpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UHJvZ3JhbUVuZCwgVW5pdFRlc3QpCisKKyN1bmRlZiBHVEVTVF9SRVBFQVRFUl9NRVRIT0RfCisjdW5kZWYgR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfCisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7CisgIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgaSsrKSB7CisgICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25TdGFydCh1bml0X3Rlc3QsIGl0ZXJhdGlvbik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsKKyAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihsaXN0ZW5lcnNfLnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgbGlzdGVuZXJzX1tpXS0+T25UZXN0SXRlcmF0aW9uRW5kKHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKworLy8gRW5kIFRlc3RFdmVudFJlcGVhdGVyCisKKy8vIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIGFuIFhNTCBvdXRwdXQgZmlsZS4KK2NsYXNzIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSk7CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKworIHByaXZhdGU6CisgIC8vIElzIGMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciB0aGF0IGlzIG5vcm1hbGl6ZWQgdG8gYSBzcGFjZSBjaGFyYWN0ZXIKKyAgLy8gd2hlbiBpdCBhcHBlYXJzIGluIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWU/CisgIHN0YXRpYyBib29sIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA9PSAweDkgfHwgYyA9PSAweEEgfHwgYyA9PSAweEQ7CisgIH0KKworICAvLyBNYXkgYyBhcHBlYXIgaW4gYSB3ZWxsLWZvcm1lZCBYTUwgZG9jdW1lbnQ/CisgIHN0YXRpYyBib29sIElzVmFsaWRYbWxDaGFyYWN0ZXIoY2hhciBjKSB7CisgICAgcmV0dXJuIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjKSB8fCBjID49IDB4MjA7CisgIH0KKworICAvLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZgorICAvLyBpc19hdHRyaWJ1dGUgaXMgdHJ1ZSwgdGhlIHRleHQgaXMgbWVhbnQgdG8gYXBwZWFyIGFzIGFuIGF0dHJpYnV0ZQorICAvLyB2YWx1ZSwgYW5kIG5vcm1hbGl6YWJsZSB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCBieSByZXBsYWNpbmcgaXQKKyAgLy8gd2l0aCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbChjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBib29sIGlzX2F0dHJpYnV0ZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIGNoYXJhY3RlcnMgaW52YWxpZCBpbiBYTUwgcmVtb3ZlZC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIFJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIEVzY2FwZVhtbCB3aGVuIHN0ciBpcyBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBFc2NhcGVYbWxBdHRyaWJ1dGUoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBFc2NhcGVYbWwoc3RyLCB0cnVlKTsKKyAgfQorCisgIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIEVzY2FwZVhtbCB3aGVuIHN0ciBpcyBub3QgYW4gYXR0cmlidXRlIHZhbHVlLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sVGV4dChjb25zdCBjaGFyKiBzdHIpIHsKKyAgICByZXR1cm4gRXNjYXBlWG1sKHN0ciwgZmFsc2UpOworICB9CisKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gYXR0cmlidXRlIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQgYW5kCisgIC8vIHN0cmVhbXMgdGhlIGF0dHJpYnV0ZSBhcyBYTUwuCisgIHN0YXRpYyB2b2lkIE91dHB1dFhtbEF0dHJpYnV0ZShzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisKKyAgLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgorICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZGF0YSk7CisKKyAgLy8gU3RyZWFtcyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuCisgIHN0YXRpYyB2b2lkIE91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKworICAvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdENhc2Ugb2JqZWN0CisgIHN0YXRpYyB2b2lkIFByaW50WG1sVGVzdENhc2UoOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKworICAvLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0LgorICBzdGF0aWMgdm9pZCBQcmludFhtbFVuaXRUZXN0KDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisKKyAgLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXN0IHByb3BlcnRpZXMgaW4gYSByZXN1bHQgYXMgc3BhY2UKKyAgLy8gZGVsaW1pdGVkIFhNTCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBrZXk9InZhbHVlIiBwYWlycy4KKyAgLy8gV2hlbiB0aGUgc3RkOjpzdHJpbmcgaXMgbm90IGVtcHR5LCBpdCBpbmNsdWRlcyBhIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcsCisgIC8vIHRvIGRlbGltaXQgdGhpcyBhdHRyaWJ1dGUgZnJvbSBwcmlvciBhdHRyaWJ1dGVzLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMoY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0KTsKKworICAvLyBUaGUgb3V0cHV0IGZpbGUuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dHB1dF9maWxlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcik7Cit9OworCisvLyBDcmVhdGVzIGEgbmV3IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlci4KK1htbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6WG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKGNvbnN0IGNoYXIqIG91dHB1dF9maWxlKQorICAgIDogb3V0cHV0X2ZpbGVfKG91dHB1dF9maWxlKSB7CisgIGlmIChvdXRwdXRfZmlsZV8uY19zdHIoKSA9PSBOVUxMIHx8IG91dHB1dF9maWxlXy5lbXB0eSgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJYTUwgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBudWxsXG4iKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KK30KKworLy8gQ2FsbGVkIGFmdGVyIHRoZSB1bml0IHRlc3QgZW5kcy4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHsKKyAgRklMRSogeG1sb3V0ID0gTlVMTDsKKyAgRmlsZVBhdGggb3V0cHV0X2ZpbGUob3V0cHV0X2ZpbGVfKTsKKyAgRmlsZVBhdGggb3V0cHV0X2RpcihvdXRwdXRfZmlsZS5SZW1vdmVGaWxlTmFtZSgpKTsKKworICBpZiAob3V0cHV0X2Rpci5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpIHsKKyAgICB4bWxvdXQgPSBwb3NpeDo6Rk9wZW4ob3V0cHV0X2ZpbGVfLmNfc3RyKCksICJ3Iik7CisgIH0KKyAgaWYgKHhtbG91dCA9PSBOVUxMKSB7CisgICAgLy8gVE9ETyh3YW4pOiByZXBvcnQgdGhlIHJlYXNvbiBvZiB0aGUgZmFpbHVyZS4KKyAgICAvLworICAgIC8vIFdlIGRvbid0IGRvIGl0IGZvciBub3cgYXM6CisgICAgLy8KKyAgICAvLyAgIDEuIFRoZXJlIGlzIG5vIHVyZ2VudCBuZWVkIGZvciBpdC4KKyAgICAvLyAgIDIuIEl0J3MgYSBiaXQgaW52b2x2ZWQgdG8gbWFrZSB0aGUgZXJybm8gdmFyaWFibGUgdGhyZWFkLXNhZmUgb24KKyAgICAvLyAgICAgIGFsbCB0aHJlZSBvcGVyYXRpbmcgc3lzdGVtcyAoTGludXgsIFdpbmRvd3MsIGFuZCBNYWMgT1MpLgorICAgIC8vICAgMy4gVG8gaW50ZXJwcmV0IHRoZSBtZWFuaW5nIG9mIGVycm5vIGluIGEgdGhyZWFkLXNhZmUgd2F5LAorICAgIC8vICAgICAgd2UgbmVlZCB0aGUgc3RyZXJyb3JfcigpIGZ1bmN0aW9uLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIG9uCisgICAgLy8gICAgICBXaW5kb3dzLgorICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLAorICAgICAgICAgICAgb3V0cHV0X2ZpbGVfLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgIFByaW50WG1sVW5pdFRlc3QoJnN0cmVhbSwgdW5pdF90ZXN0KTsKKyAgZnByaW50Zih4bWxvdXQsICIlcyIsIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pLmNfc3RyKCkpOworICBmY2xvc2UoeG1sb3V0KTsKK30KKworLy8gUmV0dXJucyBhbiBYTUwtZXNjYXBlZCBjb3B5IG9mIHRoZSBpbnB1dCBzdHJpbmcgc3RyLiAgSWYgaXNfYXR0cmlidXRlCisvLyBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlIHZhbHVlLCBhbmQKKy8vIG5vcm1hbGl6YWJsZSB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCBieSByZXBsYWNpbmcgaXQgd2l0aCBjaGFyYWN0ZXIKKy8vIHJlZmVyZW5jZXMuCisvLworLy8gSW52YWxpZCBYTUwgY2hhcmFjdGVycyBpbiBzdHIsIGlmIGFueSwgYXJlIHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dC4KKy8vIEl0IGlzIGV4cGVjdGVkIHRoYXQgbW9zdCwgaWYgbm90IGFsbCwgb2YgdGhlIHRleHQgcHJvY2Vzc2VkIGJ5IHRoaXMKKy8vIG1vZHVsZSB3aWxsIGNvbnNpc3Qgb2Ygb3JkaW5hcnkgRW5nbGlzaCB0ZXh0LgorLy8gSWYgdGhpcyBtb2R1bGUgaXMgZXZlciBtb2RpZmllZCB0byBwcm9kdWNlIHZlcnNpb24gMS4xIFhNTCBvdXRwdXQsCisvLyBtb3N0IGludmFsaWQgY2hhcmFjdGVycyBjYW4gYmUgcmV0YWluZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCisvLyBUT0RPKHdhbik6IEl0IG1pZ2h0IGJlIG5pY2UgdG8gaGF2ZSBhIG1pbmltYWxseSBpbnZhc2l2ZSwgaHVtYW4tcmVhZGFibGUKKy8vIGVzY2FwaW5nIHNjaGVtZSBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzLCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGVtLgorc3RkOjpzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpFc2NhcGVYbWwoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBpc19hdHRyaWJ1dGUpIHsKKyAgTWVzc2FnZSBtOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgY2hhciBjaCA9IHN0cltpXTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlICc8JzoKKyAgICAgICAgbSA8PCAiJmx0OyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6CisgICAgICAgIG0gPDwgIiZndDsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyYnOgorICAgICAgICBtIDw8ICImYW1wOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCcnOgorICAgICAgICBpZiAoaXNfYXR0cmlidXRlKQorICAgICAgICAgIG0gPDwgIiZhcG9zOyI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtIDw8ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIic6CisgICAgICAgIGlmIChpc19hdHRyaWJ1dGUpCisgICAgICAgICAgbSA8PCAiJnF1b3Q7IjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG0gPDwgJyInOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChJc1ZhbGlkWG1sQ2hhcmFjdGVyKGNoKSkgeworICAgICAgICAgIGlmIChpc19hdHRyaWJ1dGUgJiYgSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGNoKSkKKyAgICAgICAgICAgIG0gPDwgIiYjeCIgPDwgU3RyaW5nOjpGb3JtYXRCeXRlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkKKyAgICAgICAgICAgICAgPDwgIjsiOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG0gPDwgY2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG0uR2V0U3RyaW5nKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuCisvLyBDdXJyZW50bHkgaW52YWxpZCBjaGFyYWN0ZXJzIGFyZSBkcm9wcGVkIGZyb20gdGhlIHN0cmluZy4gQW4KKy8vIGFsdGVybmF0aXZlIGlzIHRvIHJlcGxhY2UgdGhlbSB3aXRoIGNlcnRhaW4gY2hhcmFjdGVycyBzdWNoIGFzIC4gb3IgPy4KK3N0ZDo6c3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIG91dHB1dC5yZXNlcnZlKHN0ci5zaXplKCkpOworICBmb3IgKHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0ci5iZWdpbigpOyBpdCAhPSBzdHIuZW5kKCk7ICsraXQpCisgICAgaWYgKElzVmFsaWRYbWxDaGFyYWN0ZXIoKml0KSkKKyAgICAgIG91dHB1dC5wdXNoX2JhY2soKml0KTsKKworICByZXR1cm4gb3V0cHV0OworfQorCisvLyBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGdlbmVyYXRlIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFVuaXRUZXN0CisvLyBvYmplY3QuCisvLworLy8gVGhpcyBpcyBob3cgR29vZ2xlIFRlc3QgY29uY2VwdHMgbWFwIHRvIHRoZSBEVEQ6CisvLworLy8gPHRlc3RzdWl0ZXMgbmFtZT0iQWxsVGVzdHMiPiAgICAgICAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVW5pdFRlc3Qgb2JqZWN0CisvLyAgIDx0ZXN0c3VpdGUgbmFtZT0idGVzdGNhc2UtbmFtZSI+ICA8LS0gY29ycmVzcG9uZHMgdG8gYSBUZXN0Q2FzZSBvYmplY3QKKy8vICAgICA8dGVzdGNhc2UgbmFtZT0idGVzdC1uYW1lIj4gICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFRlc3RJbmZvIG9iamVjdAorLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+CisvLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KKy8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tIGluZGl2aWR1YWwgYXNzZXJ0aW9uIGZhaWx1cmVzCisvLyAgICAgPC90ZXN0Y2FzZT4KKy8vICAgPC90ZXN0c3VpdGU+CisvLyA8L3Rlc3RzdWl0ZXM+CisKKy8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuCitzdGQ6OnN0cmluZyBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoVGltZUluTWlsbGlzIG1zKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IChzdGF0aWNfY2FzdDxkb3VibGU+KG1zKSAqIDFlLTMpOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3N0YXRpYyBib29sIFBvcnRhYmxlTG9jYWx0aW1lKHRpbWVfdCBzZWNvbmRzLCBzdHJ1Y3QgdG0qIG91dCkgeworI2lmIGRlZmluZWQoX01TQ19WRVIpCisgIHJldHVybiBsb2NhbHRpbWVfcyhvdXQsICZzZWNvbmRzKSA9PSAwOworI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX01JTkdXNjRfXykKKyAgLy8gTUlOR1cgPHRpbWUuaD4gcHJvdmlkZXMgbmVpdGhlciBsb2NhbHRpbWVfciBub3IgbG9jYWx0aW1lX3MsIGJ1dCB1c2VzCisgIC8vIFdpbmRvd3MnIGxvY2FsdGltZSgpLCB3aGljaCBoYXMgYSB0aHJlYWQtbG9jYWwgdG0gYnVmZmVyLgorICBzdHJ1Y3QgdG0qIHRtX3B0ciA9IGxvY2FsdGltZSgmc2Vjb25kcyk7ICAvLyBOT0xJTlQKKyAgaWYgKHRtX3B0ciA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgKm91dCA9ICp0bV9wdHI7CisgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgcmV0dXJuIGxvY2FsdGltZV9yKCZzZWNvbmRzLCBvdXQpICE9IE5VTEw7CisjZW5kaWYKK30KKworLy8gQ29udmVydHMgdGhlIGdpdmVuIGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBzdHJpbmcgaW4gdGhlIElTTworLy8gODYwMSBmb3JtYXQsIHdpdGhvdXQgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uLgorc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKSB7CisgIHN0cnVjdCB0bSB0aW1lX3N0cnVjdDsKKyAgaWYgKCFQb3J0YWJsZUxvY2FsdGltZShzdGF0aWNfY2FzdDx0aW1lX3Q+KG1zIC8gMTAwMCksICZ0aW1lX3N0cnVjdCkpCisgICAgcmV0dXJuICIiOworICAvLyBZWVlZLU1NLUREVGhoOm1tOnNzCisgIHJldHVybiBTdHJlYW1hYmxlVG9TdHJpbmcodGltZV9zdHJ1Y3QudG1feWVhciArIDE5MDApICsgIi0iICsKKyAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX21vbiArIDEpICsgIi0iICsKKyAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX21kYXkpICsgIlQiICsKKyAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX2hvdXIpICsgIjoiICsKKyAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX21pbikgKyAiOiIgKworICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QudG1fc2VjKTsKK30KKworLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbENEYXRhU2VjdGlvbig6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhKSB7CisgIGNvbnN0IGNoYXIqIHNlZ21lbnQgPSBkYXRhOworICAqc3RyZWFtIDw8ICI8IVtDREFUQVsiOworICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciogY29uc3QgbmV4dF9zZWdtZW50ID0gc3Ryc3RyKHNlZ21lbnQsICJdXT4iKTsKKyAgICBpZiAobmV4dF9zZWdtZW50ICE9IE5VTEwpIHsKKyAgICAgIHN0cmVhbS0+d3JpdGUoCisgICAgICAgICAgc2VnbWVudCwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihuZXh0X3NlZ21lbnQgLSBzZWdtZW50KSk7CisgICAgICAqc3RyZWFtIDw8ICJdXT5dXSZndDs8IVtDREFUQVsiOworICAgICAgc2VnbWVudCA9IG5leHRfc2VnbWVudCArIHN0cmxlbigiXV0+Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICpzdHJlYW0gPDwgc2VnbWVudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAqc3RyZWFtIDw8ICJdXT4iOworfQorCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T3V0cHV0WG1sQXR0cmlidXRlKAorICAgIHN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYWxsb3dlZF9uYW1lcyA9CisgICAgICBHZXRSZXNlcnZlZEF0dHJpYnV0ZXNGb3JFbGVtZW50KGVsZW1lbnRfbmFtZSk7CisKKyAgR1RFU1RfQ0hFQ0tfKHN0ZDo6ZmluZChhbGxvd2VkX25hbWVzLmJlZ2luKCksIGFsbG93ZWRfbmFtZXMuZW5kKCksIG5hbWUpICE9CisgICAgICAgICAgICAgICAgICAgYWxsb3dlZF9uYW1lcy5lbmQoKSkKKyAgICAgIDw8ICJBdHRyaWJ1dGUgIiA8PCBuYW1lIDw8ICIgaXMgbm90IGFsbG93ZWQgZm9yIGVsZW1lbnQgPCIgPDwgZWxlbWVudF9uYW1lCisgICAgICA8PCAiPi4iOworCisgICpzdHJlYW0gPDwgIiAiIDw8IG5hbWUgPDwgIj1cIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHZhbHVlKSA8PCAiXCIiOworfQorCisvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgorLy8gVE9ETyh3YW4pOiBUaGVyZSBpcyBhbHNvIHZhbHVlIGluIHByaW50aW5nIHByb3BlcnRpZXMgd2l0aCB0aGUgcGxhaW4gcHJpbnRlci4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0ID0gKnRlc3RfaW5mby5yZXN1bHQoKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RjYXNlID0gInRlc3RjYXNlIjsKKworICAqc3RyZWFtIDw8ICIgICAgPHRlc3RjYXNlIjsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAibmFtZSIsIHRlc3RfaW5mby5uYW1lKCkpOworCisgIGlmICh0ZXN0X2luZm8udmFsdWVfcGFyYW0oKSAhPSBOVUxMKSB7CisgICAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAidmFsdWVfcGFyYW0iLAorICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZm8udmFsdWVfcGFyYW0oKSk7CisgIH0KKyAgaWYgKHRlc3RfaW5mby50eXBlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInR5cGVfcGFyYW0iLCB0ZXN0X2luZm8udHlwZV9wYXJhbSgpKTsKKyAgfQorCisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInN0YXR1cyIsCisgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZm8uc2hvdWxkX3J1bigpID8gInJ1biIgOiAibm90cnVuIik7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInRpbWUiLAorICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHJlc3VsdC5lbGFwc2VkX3RpbWUoKSkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJjbGFzc25hbWUiLCB0ZXN0X2Nhc2VfbmFtZSk7CisgICpzdHJlYW0gPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMocmVzdWx0KTsKKworICBpbnQgZmFpbHVyZXMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC50b3RhbF9wYXJ0X2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBwYXJ0ID0gcmVzdWx0LkdldFRlc3RQYXJ0UmVzdWx0KGkpOworICAgIGlmIChwYXJ0LmZhaWxlZCgpKSB7CisgICAgICBpZiAoKytmYWlsdXJlcyA9PSAxKSB7CisgICAgICAgICpzdHJlYW0gPDwgIj5cbiI7CisgICAgICB9CisgICAgICBjb25zdCBzdHJpbmcgbG9jYXRpb24gPSBpbnRlcm5hbDo6Rm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKKyAgICAgICAgICBwYXJ0LmZpbGVfbmFtZSgpLCBwYXJ0LmxpbmVfbnVtYmVyKCkpOworICAgICAgY29uc3Qgc3RyaW5nIHN1bW1hcnkgPSBsb2NhdGlvbiArICJcbiIgKyBwYXJ0LnN1bW1hcnkoKTsKKyAgICAgICpzdHJlYW0gPDwgIiAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9XCIiCisgICAgICAgICAgICAgIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZShzdW1tYXJ5LmNfc3RyKCkpCisgICAgICAgICAgICAgIDw8ICJcIiB0eXBlPVwiXCI+IjsKKyAgICAgIGNvbnN0IHN0cmluZyBkZXRhaWwgPSBsb2NhdGlvbiArICJcbiIgKyBwYXJ0Lm1lc3NhZ2UoKTsKKyAgICAgIE91dHB1dFhtbENEYXRhU2VjdGlvbihzdHJlYW0sIFJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGRldGFpbCkuY19zdHIoKSk7CisgICAgICAqc3RyZWFtIDw8ICI8L2ZhaWx1cmU+XG4iOworICAgIH0KKyAgfQorCisgIGlmIChmYWlsdXJlcyA9PSAwKQorICAgICpzdHJlYW0gPDwgIiAvPlxuIjsKKyAgZWxzZQorICAgICpzdHJlYW0gPDwgIiAgICA8L3Rlc3RjYXNlPlxuIjsKK30KKworLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdAordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50WG1sVGVzdENhc2Uoc3RkOjpvc3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0c3VpdGUgPSAidGVzdHN1aXRlIjsKKyAgKnN0cmVhbSA8PCAiICA8IiA8PCBrVGVzdHN1aXRlOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAibmFtZSIsIHRlc3RfY2FzZS5uYW1lKCkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAidGVzdHMiLAorICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKSkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAiZmFpbHVyZXMiLAorICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5mYWlsZWRfdGVzdF9jb3VudCgpKSk7CisgIE91dHB1dFhtbEF0dHJpYnV0ZSgKKyAgICAgIHN0cmVhbSwga1Rlc3RzdWl0ZSwgImRpc2FibGVkIiwKKyAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UucmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgImVycm9ycyIsICIwIik7CisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJ0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpKTsKKyAgKnN0cmVhbSA8PCBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyh0ZXN0X2Nhc2UuYWRfaG9jX3Rlc3RfcmVzdWx0KCkpCisgICAgICAgICAgPDwgIj5cbiI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAodGVzdF9jYXNlLkdldFRlc3RJbmZvKGkpLT5pc19yZXBvcnRhYmxlKCkpCisgICAgICBPdXRwdXRYbWxUZXN0SW5mbyhzdHJlYW0sIHRlc3RfY2FzZS5uYW1lKCksICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaSkpOworICB9CisgICpzdHJlYW0gPDwgIiAgPC8iIDw8IGtUZXN0c3VpdGUgPDwgIj5cbiI7Cit9CisKKy8vIFByaW50cyBhbiBYTUwgc3VtbWFyeSBvZiB1bml0X3Rlc3QgdG8gb3V0cHV0IHN0cmVhbSBvdXQuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UHJpbnRYbWxVbml0VGVzdChzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RzdWl0ZXMgPSAidGVzdHN1aXRlcyI7CisKKyAgKnN0cmVhbSA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iOworICAqc3RyZWFtIDw8ICI8IiA8PCBrVGVzdHN1aXRlczsKKworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgInRlc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QucmVwb3J0YWJsZV90ZXN0X2NvdW50KCkpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJmYWlsdXJlcyIsCisgICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCkpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKAorICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlcywgImRpc2FibGVkIiwKKyAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QucmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkpKTsKKyAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJlcnJvcnMiLCAiMCIpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoCisgICAgICBzdHJlYW0sIGtUZXN0c3VpdGVzLCAidGltZXN0YW1wIiwKKyAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKHVuaXRfdGVzdC5zdGFydF90aW1lc3RhbXAoKSkpOworICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgInRpbWUiLAorICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkpOworCisgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJyYW5kb21fc2VlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSkpOworICB9CisKKyAgKnN0cmVhbSA8PCBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyh1bml0X3Rlc3QuYWRfaG9jX3Rlc3RfcmVzdWx0KCkpOworCisgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAibmFtZSIsICJBbGxUZXN0cyIpOworICAqc3RyZWFtIDw8ICI+XG4iOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAodW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpLT5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKSA+IDApCisgICAgICBQcmludFhtbFRlc3RDYXNlKHN0cmVhbSwgKnVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKSk7CisgIH0KKyAgKnN0cmVhbSA8PCAiPC8iIDw8IGtUZXN0c3VpdGVzIDw8ICI+XG4iOworfQorCisvLyBQcm9kdWNlcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRlc3QgcHJvcGVydGllcyBpbiBhIHJlc3VsdCBhcyBzcGFjZQorLy8gZGVsaW1pdGVkIFhNTCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBrZXk9InZhbHVlIiBwYWlycy4KK3N0ZDo6c3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6VGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMoCisgICAgY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0KSB7CisgIE1lc3NhZ2UgYXR0cmlidXRlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5ID0gcmVzdWx0LkdldFRlc3RQcm9wZXJ0eShpKTsKKyAgICBhdHRyaWJ1dGVzIDw8ICIgIiA8PCBwcm9wZXJ0eS5rZXkoKSA8PCAiPSIKKyAgICAgICAgPDwgIlwiIiA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUocHJvcGVydHkudmFsdWUoKSkgPDwgIlwiIjsKKyAgfQorICByZXR1cm4gYXR0cmlidXRlcy5HZXRTdHJpbmcoKTsKK30KKworLy8gRW5kIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcgorCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworCisvLyBDaGVja3MgaWYgc3RyIGNvbnRhaW5zICc9JywgJyYnLCAnJScgb3IgJ1xuJyBjaGFyYWN0ZXJzLiBJZiB5ZXMsCisvLyByZXBsYWNlcyB0aGVtIGJ5ICIleHgiIHdoZXJlIHh4IGlzIHRoZWlyIGhleGFkZWNpbWFsIHZhbHVlLiBGb3IKKy8vIGV4YW1wbGUsIHJlcGxhY2VzICI9IiB3aXRoICIlM0QiLiAgVGhpcyBhbGdvcml0aG0gaXMgTyhzdHJsZW4oc3RyKSkKKy8vIGluIGJvdGggdGltZSBhbmQgc3BhY2UgLS0gaW1wb3J0YW50IGFzIHRoZSBpbnB1dCBzdHIgbWF5IGNvbnRhaW4gYW4KKy8vIGFyYml0cmFyaWx5IGxvbmcgdGVzdCBmYWlsdXJlIG1lc3NhZ2UgYW5kIHN0YWNrIHRyYWNlLgorc3RyaW5nIFN0cmVhbWluZ0xpc3RlbmVyOjpVcmxFbmNvZGUoY29uc3QgY2hhciogc3RyKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKHN0cmxlbihzdHIpICsgMSk7CisgIGZvciAoY2hhciBjaCA9ICpzdHI7IGNoICE9ICdcMCc7IGNoID0gKisrc3RyKSB7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSAnJSc6CisgICAgICBjYXNlICc9JzoKKyAgICAgIGNhc2UgJyYnOgorICAgICAgY2FzZSAnXG4nOgorICAgICAgICByZXN1bHQuYXBwZW5kKCIlIiArIFN0cmluZzo6Rm9ybWF0Qnl0ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXN1bHQucHVzaF9iYWNrKGNoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgU3RyZWFtaW5nTGlzdGVuZXI6OlNvY2tldFdyaXRlcjo6TWFrZUNvbm5lY3Rpb24oKSB7CisgIEdURVNUX0NIRUNLXyhzb2NrZmRfID09IC0xKQorICAgICAgPDwgIk1ha2VDb25uZWN0aW9uKCkgY2FuJ3QgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24uIjsKKworICBhZGRyaW5mbyBoaW50czsKKyAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgICAgLy8gVG8gYWxsb3cgYm90aCBJUHY0IGFuZCBJUHY2IGFkZHJlc3Nlcy4KKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgYWRkcmluZm8qIHNlcnZpbmZvID0gTlVMTDsKKworICAvLyBVc2UgdGhlIGdldGFkZHJpbmZvKCkgdG8gZ2V0IGEgbGlua2VkIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIGZvcgorICAvLyB0aGUgZ2l2ZW4gaG9zdCBuYW1lLgorICBjb25zdCBpbnQgZXJyb3JfbnVtID0gZ2V0YWRkcmluZm8oCisgICAgICBob3N0X25hbWVfLmNfc3RyKCksIHBvcnRfbnVtXy5jX3N0cigpLCAmaGludHMsICZzZXJ2aW5mbyk7CisgIGlmIChlcnJvcl9udW0gIT0gMCkgeworICAgIEdURVNUX0xPR18oV0FSTklORykgPDwgInN0cmVhbV9yZXN1bHRfdG86IGdldGFkZHJpbmZvKCkgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBnYWlfc3RyZXJyb3IoZXJyb3JfbnVtKTsKKyAgfQorCisgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHJlc3VsdHMgYW5kIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHdlIGNhbi4KKyAgZm9yIChhZGRyaW5mbyogY3VyX2FkZHIgPSBzZXJ2aW5mbzsgc29ja2ZkXyA9PSAtMSAmJiBjdXJfYWRkciAhPSBOVUxMOworICAgICAgIGN1cl9hZGRyID0gY3VyX2FkZHItPmFpX25leHQpIHsKKyAgICBzb2NrZmRfID0gc29ja2V0KAorICAgICAgICBjdXJfYWRkci0+YWlfZmFtaWx5LCBjdXJfYWRkci0+YWlfc29ja3R5cGUsIGN1cl9hZGRyLT5haV9wcm90b2NvbCk7CisgICAgaWYgKHNvY2tmZF8gIT0gLTEpIHsKKyAgICAgIC8vIENvbm5lY3QgdGhlIGNsaWVudCBzb2NrZXQgdG8gdGhlIHNlcnZlciBzb2NrZXQuCisgICAgICBpZiAoY29ubmVjdChzb2NrZmRfLCBjdXJfYWRkci0+YWlfYWRkciwgY3VyX2FkZHItPmFpX2FkZHJsZW4pID09IC0xKSB7CisgICAgICAgIGNsb3NlKHNvY2tmZF8pOworICAgICAgICBzb2NrZmRfID0gLTE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnJlZWFkZHJpbmZvKHNlcnZpbmZvKTsgIC8vIGFsbCBkb25lIHdpdGggdGhpcyBzdHJ1Y3R1cmUKKworICBpZiAoc29ja2ZkXyA9PSAtMSkgeworICAgIEdURVNUX0xPR18oV0FSTklORykgPDwgInN0cmVhbV9yZXN1bHRfdG86IGZhaWxlZCB0byBjb25uZWN0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGhvc3RfbmFtZV8gPDwgIjoiIDw8IHBvcnRfbnVtXzsKKyAgfQorfQorCisvLyBFbmQgb2YgY2xhc3MgU3RyZWFtaW5nIExpc3RlbmVyCisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU19fCisKKy8vIENsYXNzIFNjb3BlZFRyYWNlCisKKy8vIFB1c2hlcyB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gYW5kIG1lc3NhZ2Ugb250byBhIHBlci10aHJlYWQKKy8vIHRyYWNlIHN0YWNrIG1haW50YWluZWQgYnkgR29vZ2xlIFRlc3QuCitTY29wZWRUcmFjZTo6U2NvcGVkVHJhY2UoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8oJlVuaXRUZXN0OjptdXRleF8pIHsKKyAgVHJhY2VJbmZvIHRyYWNlOworICB0cmFjZS5maWxlID0gZmlsZTsKKyAgdHJhY2UubGluZSA9IGxpbmU7CisgIHRyYWNlLm1lc3NhZ2UgPSBtZXNzYWdlLkdldFN0cmluZygpOworCisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5QdXNoR1Rlc3RUcmFjZSh0cmFjZSk7Cit9CisKKy8vIFBvcHMgdGhlIGluZm8gcHVzaGVkIGJ5IHRoZSBjJ3Rvci4KK1Njb3BlZFRyYWNlOjp+U2NvcGVkVHJhY2UoKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKCZVbml0VGVzdDo6bXV0ZXhfKSB7CisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5Qb3BHVGVzdFRyYWNlKCk7Cit9CisKKworLy8gY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVyCisKK2NvbnN0IGNoYXIqIGNvbnN0IE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZTo6a0VsaWRlZEZyYW1lc01hcmtlciA9CisgICAgIi4uLiAiIEdURVNUX05BTUVfICIgaW50ZXJuYWwgZnJhbWVzIC4uLiI7CisKK3N0cmluZyBPc1N0YWNrVHJhY2VHZXR0ZXI6OkN1cnJlbnRTdGFja1RyYWNlKGludCAvKm1heF9kZXB0aCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qc2tpcF9jb3VudCovKSB7CisgIHJldHVybiAiIjsKK30KKwordm9pZCBPc1N0YWNrVHJhY2VHZXR0ZXI6OlVwb25MZWF2aW5nR1Rlc3QoKSB7fQorCisvLyBBIGhlbHBlciBjbGFzcyB0aGF0IGNyZWF0ZXMgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgaW4gaXRzCisvLyBjb25zdHJ1Y3RvciBhbmQgZGVsZXRlcyB0aGUgZmlsZSBpbiBpdHMgZGVzdHJ1Y3Rvci4KK2NsYXNzIFNjb3BlZFByZW1hdHVyZUV4aXRGaWxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNjb3BlZFByZW1hdHVyZUV4aXRGaWxlKGNvbnN0IGNoYXIqIHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoKQorICAgICAgOiBwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8ocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGgpIHsKKyAgICAvLyBJZiBhIHBhdGggdG8gdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgaXMgc3BlY2lmaWVkLi4uCisgICAgaWYgKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoICE9IE5VTEwgJiYgKnByZW1hdHVyZV9leGl0X2ZpbGVwYXRoICE9ICdcMCcpIHsKKyAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZSB3aXRoIGEgc2luZ2xlICIwIiBjaGFyYWN0ZXIgaW4gaXQuICBJL08KKyAgICAgIC8vIGVycm9ycyBhcmUgaWdub3JlZCBhcyB0aGVyZSdzIG5vdGhpbmcgYmV0dGVyIHdlIGNhbiBkbyBhbmQgd2UKKyAgICAgIC8vIGRvbid0IHdhbnQgdG8gZmFpbCB0aGUgdGVzdCBiZWNhdXNlIG9mIHRoaXMuCisgICAgICBGSUxFKiBwZmlsZSA9IHBvc2l4OjpGT3BlbihwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCwgInciKTsKKyAgICAgIGZ3cml0ZSgiMCIsIDEsIDEsIHBmaWxlKTsKKyAgICAgIGZjbG9zZShwZmlsZSk7CisgICAgfQorICB9CisKKyAgflNjb3BlZFByZW1hdHVyZUV4aXRGaWxlKCkgeworICAgIGlmIChwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8gIT0gTlVMTCAmJiAqcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfICE9ICdcMCcpIHsKKyAgICAgIHJlbW92ZShwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8pOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogY29uc3QgcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGNsYXNzIFRlc3RFdmVudExpc3RlbmVycworCitUZXN0RXZlbnRMaXN0ZW5lcnM6OlRlc3RFdmVudExpc3RlbmVycygpCisgICAgOiByZXBlYXRlcl8obmV3IGludGVybmFsOjpUZXN0RXZlbnRSZXBlYXRlcigpKSwKKyAgICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKE5VTEwpLAorICAgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyhOVUxMKSB7Cit9CisKK1Rlc3RFdmVudExpc3RlbmVyczo6flRlc3RFdmVudExpc3RlbmVycygpIHsgZGVsZXRlIHJlcGVhdGVyXzsgfQorCisvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgY29uc29sZQorLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQKKy8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKKy8vIHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzIG93bmVyc2hpcCB0byB0aGUgdXNlci4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIHJlcGVhdGVyXy0+QXBwZW5kKGxpc3RlbmVyKTsKK30KKworLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIEl0IHRoZW4KKy8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMKKy8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KK1Rlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgIGlmIChsaXN0ZW5lciA9PSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXykKKyAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyA9IE5VTEw7CisgIGVsc2UgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pCisgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyA9IE5VTEw7CisgIHJldHVybiByZXBlYXRlcl8tPlJlbGVhc2UobGlzdGVuZXIpOworfQorCisvLyBSZXR1cm5zIHJlcGVhdGVyIHRoYXQgYnJvYWRjYXN0cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgZXZlbnRzIHRvIGFsbAorLy8gc3Vic2NyaWJlcnMuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50TGlzdGVuZXJzOjpyZXBlYXRlcigpIHsgcmV0dXJuIHJlcGVhdGVyXzsgfQorCisvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisvLyBUaGUgbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKKy8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gIT0gbGlzdGVuZXIpIHsKKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBwYXNzIHRoaXMgbWV0aG9kIGEgbGlzdGVuZXIgdGhhdCBpcyBhbHJlYWR5IGluIHRoZQorICAgIC8vIGxpc3QuCisgICAgZGVsZXRlIFJlbGVhc2UoZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8pOworICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gbGlzdGVuZXI7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpCisgICAgICBBcHBlbmQobGlzdGVuZXIpOworICB9Cit9CisKKy8vIFNldHMgdGhlIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLiAgVGhlCisvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworLy8gZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKKy8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAoZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyAhPSBsaXN0ZW5lcikgeworICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCisgICAgLy8gbGlzdC4KKyAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3htbF9nZW5lcmF0b3JfKTsKKyAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gbGlzdGVuZXI7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpCisgICAgICBBcHBlbmQobGlzdGVuZXIpOworICB9Cit9CisKKy8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIGJ5IHRoZSByZXBlYXRlciB0byB0aGUKKy8vIGxpc3RlbmVycyBpbiB0aGUgbGlzdC4KK2Jvb2wgVGVzdEV2ZW50TGlzdGVuZXJzOjpFdmVudEZvcndhcmRpbmdFbmFibGVkKCkgY29uc3QgeworICByZXR1cm4gcmVwZWF0ZXJfLT5mb3J3YXJkaW5nX2VuYWJsZWQoKTsKK30KKwordm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCkgeworICByZXBlYXRlcl8tPnNldF9mb3J3YXJkaW5nX2VuYWJsZWQoZmFsc2UpOworfQorCisvLyBjbGFzcyBVbml0VGVzdAorCisvLyBHZXRzIHRoZSBzaW5nbGV0b24gVW5pdFRlc3Qgb2JqZWN0LiAgVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMKKy8vIGNhbGxlZCwgYSBVbml0VGVzdCBvYmplY3QgaXMgY29uc3RydWN0ZWQgYW5kIHJldHVybmVkLiAgQ29uc2VjdXRpdmUKKy8vIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIG9iamVjdC4KKy8vCisvLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfIGFzIGEgdXNlciBpcyBub3Qgc3VwcG9zZWQgdG8KKy8vIGNhbGwgdGhpcyBiZWZvcmUgbWFpbigpIHN0YXJ0cywgZnJvbSB3aGljaCBwb2ludCBvbiB0aGUgcmV0dXJuCisvLyB2YWx1ZSB3aWxsIG5ldmVyIGNoYW5nZS4KK1VuaXRUZXN0KiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSB7CisgIC8vIFdoZW4gY29tcGlsZWQgd2l0aCBNU1ZDIDcuMSBpbiBvcHRpbWl6ZWQgbW9kZSwgZGVzdHJveWluZyB0aGUKKyAgLy8gVW5pdFRlc3Qgb2JqZWN0IHVwb24gZXhpdGluZyB0aGUgcHJvZ3JhbSBtZXNzZXMgdXAgdGhlIGV4aXQgY29kZSwKKyAgLy8gY2F1c2luZyBzdWNjZXNzZnVsIHRlc3RzIHRvIGFwcGVhciBmYWlsZWQuICBXZSBoYXZlIHRvIHVzZSBhCisgIC8vIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNhc2UgdG8gYnlwYXNzIHRoZSBjb21waWxlciBidWcuCisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5LCBhdCB0aGUgY29zdCBvZgorICAvLyBsZWFraW5nIHRoZSBVbml0VGVzdCBvYmplY3QuCisKKyAgLy8gQ29kZUdlYXIgQysrQnVpbGRlciBpbnNpc3RzIG9uIGEgcHVibGljIGRlc3RydWN0b3IgZm9yIHRoZQorICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiAgVXNlIHRoaXMgaW1wbGVtZW50YXRpb24gdG8ga2VlcCBnb29kIE9PCisgIC8vIGRlc2lnbiB3aXRoIHByaXZhdGUgZGVzdHJ1Y3Rvci4KKworI2lmIChfTVNDX1ZFUiA9PSAxMzEwICYmICFkZWZpbmVkKF9ERUJVRykpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICBzdGF0aWMgVW5pdFRlc3QqIGNvbnN0IGluc3RhbmNlID0gbmV3IFVuaXRUZXN0OworICByZXR1cm4gaW5zdGFuY2U7CisjZWxzZQorICBzdGF0aWMgVW5pdFRlc3QgaW5zdGFuY2U7CisgIHJldHVybiAmaW5zdGFuY2U7CisjZW5kaWYgIC8vIChfTVNDX1ZFUiA9PSAxMzEwICYmICFkZWZpbmVkKF9ERUJVRykpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0OjpzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0OjpmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5mYWlsZWRfdGVzdF9jYXNlX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0Ojp0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgoraW50IFVuaXRUZXN0OjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgoraW50IFVuaXRUZXN0OjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+ZmFpbGVkX3Rlc3RfY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgoraW50IFVuaXRUZXN0OjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmRpc2FibGVkX3Rlc3RfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCitpbnQgVW5pdFRlc3Q6OnJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+cmVwb3J0YWJsZV90ZXN0X2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPnRvdGFsX3Rlc3RfY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0Ojp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dGVzdF90b19ydW5fY291bnQoKTsgfQorCisvLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorLy8gVU5JWCBlcG9jaC4KK2ludGVybmFsOjpUaW1lSW5NaWxsaXMgVW5pdFRlc3Q6OnN0YXJ0X3RpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW1wbCgpLT5zdGFydF90aW1lc3RhbXAoKTsKK30KKworLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCitpbnRlcm5hbDo6VGltZUluTWlsbGlzIFVuaXRUZXN0OjplbGFwc2VkX3RpbWUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmVsYXBzZWRfdGltZSgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCitib29sIFVuaXRUZXN0OjpQYXNzZWQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPlBhc3NlZCgpOyB9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCisvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KK2Jvb2wgVW5pdFRlc3Q6OkZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+RmFpbGVkKCk7IH0KKworLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5HZXRUZXN0Q2FzZShpKTsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIHRlc3QgZmFpbHVyZXMgYW5kCisvLyBwcm9wZXJ0aWVzIGxvZ2dlZCBvdXRzaWRlIG9mIGluZGl2aWR1YWwgdGVzdCBjYXNlcy4KK2NvbnN0IFRlc3RSZXN1bHQmIFVuaXRUZXN0OjphZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7CisgIHJldHVybiAqaW1wbCgpLT5hZF9ob2NfdGVzdF9yZXN1bHQoKTsKK30KKworLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdENhc2UqIFVuaXRUZXN0OjpHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpIHsKKyAgcmV0dXJuIGltcGwoKS0+R2V0TXV0YWJsZVRlc3RDYXNlKGkpOworfQorCisvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cworLy8gaW5zaWRlIEdvb2dsZSBUZXN0LgorVGVzdEV2ZW50TGlzdGVuZXJzJiBVbml0VGVzdDo6bGlzdGVuZXJzKCkgeworICByZXR1cm4gKmltcGwoKS0+bGlzdGVuZXJzKCk7Cit9CisKKy8vIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LiAgV2hlbiBhIHRlc3QKKy8vIHByb2dyYW0gaXMgcnVuLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgc2V0LXVwIGluIHRoZQorLy8gb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuICBBZnRlciBhbGwgdGVzdHMgaW4gdGhlIHByb2dyYW0gaGF2ZQorLy8gZmluaXNoZWQsIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSB0b3JuLWRvd24gaW4gdGhlCisvLyAqcmV2ZXJzZSogb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisvLworLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50LgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8sIGFzIHdlIG9ubHkgc3VwcG9ydCBjYWxsaW5nIGl0CisvLyBmcm9tIHRoZSBtYWluIHRocmVhZC4KK0Vudmlyb25tZW50KiBVbml0VGVzdDo6QWRkRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeworICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGltcGxfLT5lbnZpcm9ubWVudHMoKS5wdXNoX2JhY2soZW52KTsKKyAgcmV0dXJuIGVudjsKK30KKworLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsIEdvb2dsZSBUZXN0CisvLyBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykgZXZlbnR1YWxseSBjYWxsCisvLyB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZSBzaG91bGQgdXNlIHRoZQorLy8gYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KK3ZvaWQgVW5pdFRlc3Q6OkFkZFRlc3RQYXJ0UmVzdWx0KAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwKKyAgICBpbnQgbGluZV9udW1iZXIsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX3N0YWNrX3RyYWNlKSBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBtZXNzYWdlOworCisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaWYgKGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSA+IDApIHsKKyAgICBtc2cgPDwgIlxuIiA8PCBHVEVTVF9OQU1FXyA8PCAiIHRyYWNlOiI7CisKKyAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5zaXplKCkpOworICAgICAgICAgaSA+IDA7IC0taSkgeworICAgICAgY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UgPSBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKVtpIC0gMV07CisgICAgICBtc2cgPDwgIlxuIiA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRyYWNlLmZpbGUsIHRyYWNlLmxpbmUpCisgICAgICAgICAgPDwgIiAiIDw8IHRyYWNlLm1lc3NhZ2U7CisgICAgfQorICB9CisKKyAgaWYgKG9zX3N0YWNrX3RyYWNlLmNfc3RyKCkgIT0gTlVMTCAmJiAhb3Nfc3RhY2tfdHJhY2UuZW1wdHkoKSkgeworICAgIG1zZyA8PCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIgPDwgb3Nfc3RhY2tfdHJhY2U7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCByZXN1bHQgPQorICAgIFRlc3RQYXJ0UmVzdWx0KHJlc3VsdF90eXBlLCBmaWxlX25hbWUsIGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgaW1wbF8tPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCktPgorICAgICAgUmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKKworICBpZiAocmVzdWx0X3R5cGUgIT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKSB7CisgICAgLy8gZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKKyAgICAvLyBndGVzdF90aHJvd19vbl9mYWlsdXJlLiAgVGhpcyBhbGxvd3MgYSB1c2VyIHRvIHNldCB0aGUgbGF0dGVyCisgICAgLy8gaW4gdGhlIGNvZGUgKHBlcmhhcHMgaW4gb3JkZXIgdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMKKyAgICAvLyB3aXRoIGFub3RoZXIgdGVzdGluZyBmcmFtZXdvcmspIGFuZCBzcGVjaWZ5IHRoZSBmb3JtZXIgb24gdGhlCisgICAgLy8gY29tbWFuZCBsaW5lIGZvciBkZWJ1Z2dpbmcuCisgICAgaWYgKEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX1BIT05FICYmICFHVEVTVF9PU19XSU5ET1dTX1JUCisgICAgICAvLyBVc2luZyBEZWJ1Z0JyZWFrIG9uIFdpbmRvd3MgYWxsb3dzIGd0ZXN0IHRvIHN0aWxsIGJyZWFrIGludG8gYSBkZWJ1Z2dlcgorICAgICAgLy8gd2hlbiBhIGZhaWx1cmUgaGFwcGVucyBhbmQgYm90aCB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGFuZAorICAgICAgLy8gdGhlIC0tZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBmbGFncyBhcmUgc3BlY2lmaWVkLgorICAgICAgRGVidWdCcmVhaygpOworI2Vsc2UKKyAgICAgIC8vIERlcmVmZXJlbmNlIE5VTEwgdGhyb3VnaCBhIHZvbGF0aWxlIHBvaW50ZXIgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKKyAgICAgIC8vIGZyb20gcmVtb3ZpbmcuIFdlIHVzZSB0aGlzIHJhdGhlciB0aGFuIGFib3J0KCkgb3IgX19idWlsdGluX3RyYXAoKSBmb3IKKyAgICAgIC8vIHBvcnRhYmlsaXR5OiBTeW1iaWFuIGRvZXNuJ3QgaW1wbGVtZW50IGFib3J0KCkgd2VsbCwgYW5kIHNvbWUgZGVidWdnZXJzCisgICAgICAvLyBkb24ndCBjb3JyZWN0bHkgdHJhcCBhYm9ydCgpLgorICAgICAgKnN0YXRpY19jYXN0PHZvbGF0aWxlIGludCo+KE5VTEwpID0gMTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICAgIH0gZWxzZSBpZiAoR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSkgeworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisgICAgICB0aHJvdyBpbnRlcm5hbDo6R29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24ocmVzdWx0KTsKKyNlbHNlCisgICAgICAvLyBXZSBjYW5ub3QgY2FsbCBhYm9ydCgpIGFzIGl0IGdlbmVyYXRlcyBhIHBvcC11cCBpbiBkZWJ1ZyBtb2RlCisgICAgICAvLyB0aGF0IGNhbm5vdCBiZSBzdXBwcmVzc2VkIGluIFZDIDcuMSBvciBiZWxvdy4KKyAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICB9CisgIH0KK30KKworLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgZnJvbQorLy8gaW5zaWRlIGEgdGVzdCwgdG8gY3VycmVudCBUZXN0Q2FzZSdzIGFkX2hvY190ZXN0X3Jlc3VsdF8gd2hlbiBpbnZva2VkCisvLyBmcm9tIFNldFVwVGVzdENhc2Ugb3IgVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQKKy8vIHdoZW4gaW52b2tlZCBlbHNld2hlcmUuICBJZiB0aGUgcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoCisvLyB0aGUgc2FtZSBrZXksIHRoZSB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQuCit2b2lkIFVuaXRUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGltcGxfLT5SZWNvcmRQcm9wZXJ0eShUZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSkpOworfQorCisvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCisvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisvLworLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKKy8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgoraW50IFVuaXRUZXN0OjpSdW4oKSB7CisgIGNvbnN0IGJvb2wgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzID0KKyAgICAgIGludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5sZW5ndGgoKSA+IDA7CisKKyAgLy8gR29vZ2xlIFRlc3QgaW1wbGVtZW50cyB0aGlzIHByb3RvY29sIGZvciBjYXRjaGluZyB0aGF0IGEgdGVzdAorICAvLyBwcm9ncmFtIGV4aXRzIGJlZm9yZSByZXR1cm5pbmcgY29udHJvbCB0byBHb29nbGUgVGVzdDoKKyAgLy8KKyAgLy8gICAxLiBVcG9uIHN0YXJ0LCBHb29nbGUgVGVzdCBjcmVhdGVzIGEgZmlsZSB3aG9zZSBhYnNvbHV0ZSBwYXRoCisgIC8vICAgICAgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAvLyAgICAgIFRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRS4KKyAgLy8gICAyLiBXaGVuIEdvb2dsZSBUZXN0IGhhcyBmaW5pc2hlZCBpdHMgd29yaywgaXQgZGVsZXRlcyB0aGUgZmlsZS4KKyAgLy8KKyAgLy8gVGhpcyBhbGxvd3MgYSB0ZXN0IHJ1bm5lciB0byBzZXQgVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFIGJlZm9yZQorICAvLyBydW5uaW5nIGEgR29vZ2xlLVRlc3QtYmFzZWQgdGVzdCBwcm9ncmFtIGFuZCBjaGVjayB0aGUgZXhpc3RlbmNlCisgIC8vIG9mIHRoZSBmaWxlIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QgZXhlY3V0aW9uIHRvIHNlZSBpZiBpdCBoYXMKKyAgLy8gZXhpdGVkIHByZW1hdHVyZWx5LgorCisgIC8vIElmIHdlIGFyZSBpbiB0aGUgY2hpbGQgcHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QsIGRvbid0CisgIC8vIGNyZWF0ZS9kZWxldGUgdGhlIHByZW1hdHVyZSBleGl0IGZpbGUsIGFzIGRvaW5nIHNvIGlzIHVubmVjZXNzYXJ5CisgIC8vIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBjcmVhdGUvZGVsZXRlCisgIC8vIHRoZSBmaWxlIHVwb24gZW50ZXJpbmcvbGVhdmluZyB0aGlzIGZ1bmN0aW9uLiAgSWYgdGhlIHByb2dyYW0KKyAgLy8gc29tZWhvdyBleGl0cyBiZWZvcmUgdGhpcyBmdW5jdGlvbiBoYXMgYSBjaGFuY2UgdG8gcmV0dXJuLCB0aGUKKyAgLy8gcHJlbWF0dXJlLWV4aXQgZmlsZSB3aWxsIGJlIGxlZnQgdW5kZWxldGVkLCBjYXVzaW5nIGEgdGVzdCBydW5uZXIKKyAgLy8gdGhhdCB1bmRlcnN0YW5kcyB0aGUgcHJlbWF0dXJlLWV4aXQtZmlsZSBwcm90b2NvbCB0byByZXBvcnQgdGhlCisgIC8vIHRlc3QgYXMgaGF2aW5nIGZhaWxlZC4KKyAgY29uc3QgaW50ZXJuYWw6OlNjb3BlZFByZW1hdHVyZUV4aXRGaWxlIHByZW1hdHVyZV9leGl0X2ZpbGUoCisgICAgICBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MgPworICAgICAgTlVMTCA6IGludGVybmFsOjpwb3NpeDo6R2V0RW52KCJURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUiKSk7CisKKyAgLy8gQ2FwdHVyZXMgdGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykuICBUaGlzIHZhbHVlIHdpbGwgYmUKKyAgLy8gdXNlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcm9ncmFtLgorICBpbXBsKCktPnNldF9jYXRjaF9leGNlcHRpb25zKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpOworCisjaWYgR1RFU1RfSEFTX1NFSAorICAvLyBFaXRoZXIgdGhlIHVzZXIgd2FudHMgR29vZ2xlIFRlc3QgdG8gY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlCisgIC8vIHRlc3RzIG9yIHRoaXMgaXMgZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIGRlYXRoIHRlc3QgY2hpbGQKKyAgLy8gcHJvY2Vzcy4gSW4gZWl0aGVyIGNhc2UgdGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0byBzZWUgcG9wLXVwIGRpYWxvZ3MKKyAgLy8gYWJvdXQgY3Jhc2hlcyAtIHRoZXkgYXJlIGV4cGVjdGVkLgorICBpZiAoaW1wbCgpLT5jYXRjaF9leGNlcHRpb25zKCkgfHwgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzKSB7CisjIGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVAorICAgIC8vIFNldEVycm9yTW9kZSBkb2Vzbid0IGV4aXN0IG9uIENFLgorICAgIFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTIHwgU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFQgfAorICAgICAgICAgICAgICAgICBTRU1fTk9HUEZBVUxURVJST1JCT1ggfCBTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisjIGlmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBHVEVTVF9PU19XSU5ET1dTX01JTkdXKSAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBEZWF0aCB0ZXN0IGNoaWxkcmVuIGNhbiBiZSB0ZXJtaW5hdGVkIHdpdGggX2Fib3J0KCkuICBPbiBXaW5kb3dzLAorICAgIC8vIF9hYm9ydCgpIGNhbiBzaG93IGEgZGlhbG9nIHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIGZvcmNlcyB0aGUKKyAgICAvLyBhYm9ydCBtZXNzYWdlIHRvIGdvIHRvIHN0ZGVyciBpbnN0ZWFkLgorICAgIF9zZXRfZXJyb3JfbW9kZShfT1VUX1RPX1NUREVSUik7CisjIGVuZGlmCisKKyMgaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBJbiB0aGUgZGVidWcgdmVyc2lvbiwgVmlzdWFsIFN0dWRpbyBwb3BzIHVwIGEgc2VwYXJhdGUgZGlhbG9nCisgICAgLy8gb2ZmZXJpbmcgYSBjaG9pY2UgdG8gZGVidWcgdGhlIGFib3J0ZWQgcHJvZ3JhbS4gV2UgbmVlZCB0byBzdXBwcmVzcworICAgIC8vIHRoaXMgZGlhbG9nIG9yIGl0IHdpbGwgcG9wIHVwIGZvciBldmVyeSBFWFBFQ1QvQVNTRVJUX0RFQVRIIHN0YXRlbWVudAorICAgIC8vIGV4ZWN1dGVkLiBHb29nbGUgVGVzdCB3aWxsIG5vdGlmeSB0aGUgdXNlciBvZiBhbnkgdW5leHBlY3RlZAorICAgIC8vIGZhaWx1cmUgdmlhIHN0ZGVyci4KKyAgICAvLworICAgIC8vIFZDKysgZG9lc24ndCBkZWZpbmUgX3NldF9hYm9ydF9iZWhhdmlvcigpIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDguMC4KKyAgICAvLyBVc2VycyBvZiBwcmlvciBWQyB2ZXJzaW9ucyBzaGFsbCBzdWZmZXIgdGhlIGFnb255IGFuZCBwYWluIG9mCisgICAgLy8gY2xpY2tpbmcgdGhyb3VnaCB0aGUgY291bnRsZXNzIGRlYnVnIGRpYWxvZ3MuCisgICAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogZmluZCBhIHdheSB0byBzdXBwcmVzcyB0aGUgYWJvcnQgZGlhbG9nKCkgaW4gdGhlCisgICAgLy8gZGVidWcgbW9kZSB3aGVuIGNvbXBpbGVkIHdpdGggVkMgNy4xIG9yIGxvd2VyLgorICAgIGlmICghR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkKKyAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoCisgICAgICAgICAgMHgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgX1dSSVRFX0FCT1JUX01TRyB8IF9DQUxMX1JFUE9SVEZBVUxUKTsgIC8vIHBvcC11cCB3aW5kb3csIGNvcmUgZHVtcC4KKyMgZW5kaWYKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyAgcmV0dXJuIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIGltcGwoKSwKKyAgICAgICZpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cywKKyAgICAgICJhdXhpbGlhcnkgdGVzdCBjb2RlIChlbnZpcm9ubWVudHMgb3IgZXZlbnQgbGlzdGVuZXJzKSIpID8gMCA6IDE7Cit9CisKKy8vIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKSB3YXMKKy8vIGV4ZWN1dGVkLgorY29uc3QgY2hhciogVW5pdFRlc3Q6Om9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPm9yaWdpbmFsX3dvcmtpbmdfZGlyXy5jX3N0cigpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKy8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0CisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKy8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorY29uc3QgVGVzdEluZm8qIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0CisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfaW5mbygpOworfQorCisvLyBSZXR1cm5zIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KK2ludCBVbml0VGVzdDo6cmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+cmFuZG9tX3NlZWQoKTsgfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKy8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCitpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmCisgICAgVW5pdFRlc3Q6OnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpCisgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICByZXR1cm4gaW1wbF8tPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgorVW5pdFRlc3Q6OlVuaXRUZXN0KCkgeworICBpbXBsXyA9IG5ldyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKHRoaXMpOworfQorCisvLyBEZXN0cnVjdG9yIG9mIFVuaXRUZXN0LgorVW5pdFRlc3Q6On5Vbml0VGVzdCgpIHsKKyAgZGVsZXRlIGltcGxfOworfQorCisvLyBQdXNoZXMgYSB0cmFjZSBkZWZpbmVkIGJ5IFNDT1BFRF9UUkFDRSgpIG9uIHRvIHRoZSBwZXItdGhyZWFkCisvLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KK3ZvaWQgVW5pdFRlc3Q6OlB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKQorICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnB1c2hfYmFjayh0cmFjZSk7Cit9CisKKy8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgordm9pZCBVbml0VGVzdDo6UG9wR1Rlc3RUcmFjZSgpCisgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkucG9wX2JhY2soKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworVW5pdFRlc3RJbXBsOjpVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCkKKyAgICA6IHBhcmVudF8ocGFyZW50KSwKKyAgICAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQzNTUgLyogdXNpbmcgdGhpcyBpbiBpbml0aWFsaXplciAqLykKKyAgICAgIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorICAgICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCisgICAgICBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXygKKyAgICAgICAgICAmZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLAorICAgICAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXygKKyAgICAgICAgICAmZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKSwKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAgICAgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XygpLAorICAgICAgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXyhmYWxzZSksCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisgICAgICBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8oLTEpLAorICAgICAgY3VycmVudF90ZXN0X2Nhc2VfKE5VTEwpLAorICAgICAgY3VycmVudF90ZXN0X2luZm9fKE5VTEwpLAorICAgICAgYWRfaG9jX3Rlc3RfcmVzdWx0XygpLAorICAgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyhOVUxMKSwKKyAgICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8oZmFsc2UpLAorICAgICAgcmFuZG9tX3NlZWRfKDApLCAgLy8gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmbGFnIGJlZm9yZSBmaXJzdCB1c2UuCisgICAgICByYW5kb21fKDApLCAgLy8gV2lsbCBiZSByZXNlZWRlZCBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgc3RhcnRfdGltZXN0YW1wXygwKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCksCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgICAgIGRlYXRoX3Rlc3RfZmFjdG9yeV8obmV3IERlZmF1bHREZWF0aFRlc3RGYWN0b3J5KSwKKyNlbmRpZgorICAgICAgLy8gV2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmbGFnIGJlZm9yZSBmaXJzdCB1c2UuCisgICAgICBjYXRjaF9leGNlcHRpb25zXyhmYWxzZSkgeworICBsaXN0ZW5lcnMoKS0+U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIobmV3IFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcik7Cit9CisKK1VuaXRUZXN0SW1wbDo6flVuaXRUZXN0SW1wbCgpIHsKKyAgLy8gRGVsZXRlcyBldmVyeSBUZXN0Q2FzZS4KKyAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0Q2FzZT4pOworCisgIC8vIERlbGV0ZXMgZXZlcnkgRW52aXJvbm1lbnQuCisgIEZvckVhY2goZW52aXJvbm1lbnRzXywgaW50ZXJuYWw6OkRlbGV0ZTxFbnZpcm9ubWVudD4pOworCisgIGRlbGV0ZSBvc19zdGFja190cmFjZV9nZXR0ZXJfOworfQorCisvLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBpbiBhCisvLyBjb250ZXh0IG9mIGEgdGVzdCwgdG8gY3VycmVudCB0ZXN0IGNhc2UncyBhZF9ob2NfdGVzdF9yZXN1bHQgd2hlbiBpbnZva2UKKy8vIGZyb20gU2V0VXBUZXN0Q2FzZS9UZWFyRG93blRlc3RDYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldAorLy8gb3RoZXJ3aXNlLiAgSWYgdGhlIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksCisvLyB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgordm9pZCBVbml0VGVzdEltcGw6OlJlY29yZFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgeworICBzdGQ6OnN0cmluZyB4bWxfZWxlbWVudDsKKyAgVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQ7ICAvLyBUZXN0UmVzdWx0IGFwcHJvcHJpYXRlIGZvciBwcm9wZXJ0eSByZWNvcmRpbmcuCisKKyAgaWYgKGN1cnJlbnRfdGVzdF9pbmZvXyAhPSBOVUxMKSB7CisgICAgeG1sX2VsZW1lbnQgPSAidGVzdGNhc2UiOworICAgIHRlc3RfcmVzdWx0ID0gJihjdXJyZW50X3Rlc3RfaW5mb18tPnJlc3VsdF8pOworICB9IGVsc2UgaWYgKGN1cnJlbnRfdGVzdF9jYXNlXyAhPSBOVUxMKSB7CisgICAgeG1sX2VsZW1lbnQgPSAidGVzdHN1aXRlIjsKKyAgICB0ZXN0X3Jlc3VsdCA9ICYoY3VycmVudF90ZXN0X2Nhc2VfLT5hZF9ob2NfdGVzdF9yZXN1bHRfKTsKKyAgfSBlbHNlIHsKKyAgICB4bWxfZWxlbWVudCA9ICJ0ZXN0c3VpdGVzIjsKKyAgICB0ZXN0X3Jlc3VsdCA9ICZhZF9ob2NfdGVzdF9yZXN1bHRfOworICB9CisgIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eSh4bWxfZWxlbWVudCwgdGVzdF9wcm9wZXJ0eSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorLy8gRGlzYWJsZXMgZXZlbnQgZm9yd2FyZGluZyBpZiB0aGUgY29udHJvbCBpcyBjdXJyZW50bHkgaW4gYSBkZWF0aCB0ZXN0CisvLyBzdWJwcm9jZXNzLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OlN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCkgeworICBpZiAoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCkgIT0gTlVMTCkKKyAgICBsaXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gSW5pdGlhbGl6ZXMgZXZlbnQgbGlzdGVuZXJzIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkKKy8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpDb25maWd1cmVYbWxPdXRwdXQoKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZm9ybWF0ID0gVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKTsKKyAgaWYgKG91dHB1dF9mb3JtYXQgPT0gInhtbCIpIHsKKyAgICBsaXN0ZW5lcnMoKS0+U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihuZXcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKAorICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpLmNfc3RyKCkpKTsKKyAgfSBlbHNlIGlmIChvdXRwdXRfZm9ybWF0ICE9ICIiKSB7CisgICAgcHJpbnRmKCJXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3V0cHV0IGZvcm1hdCBcIiVzXCIgaWdub3JlZC5cbiIsCisgICAgICAgICAgIG91dHB1dF9mb3JtYXQuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgIH0KK30KKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKy8vIEluaXRpYWxpemVzIGV2ZW50IGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyBpbiBzdHJpbmcgZm9ybS4KKy8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCit2b2lkIFVuaXRUZXN0SW1wbDo6Q29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCkgeworICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0ID0gR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsKKyAgaWYgKCF0YXJnZXQuZW1wdHkoKSkgeworICAgIGNvbnN0IHNpemVfdCBwb3MgPSB0YXJnZXQuZmluZCgnOicpOworICAgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGxpc3RlbmVycygpLT5BcHBlbmQobmV3IFN0cmVhbWluZ0xpc3RlbmVyKHRhcmdldC5zdWJzdHIoMCwgcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdWJzdHIocG9zKzEpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIHN0cmVhbWluZyB0YXJnZXQgXCIlc1wiIGlnbm9yZWQuXG4iLAorICAgICAgICAgICAgIHRhcmdldC5jX3N0cigpKTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworICAgIH0KKyAgfQorfQorI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisKKy8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluCisvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJcyBjYWxsZWQgZnJvbSBJbml0R29vZ2xlVGVzdCBhZnRlciB0aGUgY2FsbCB0bworLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSW4gY2FzZSBhIHVzZXIgbmVnbGVjdHMgdG8gY2FsbCBJbml0R29vZ2xlVGVzdAorLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKy8vIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaXQgaGFzIHRvIGJlIGlkZW1wb3RlbnQuCit2b2lkIFVuaXRUZXN0SW1wbDo6UG9zdEZsYWdQYXJzaW5nSW5pdCgpIHsKKyAgLy8gRW5zdXJlcyB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZXhlY3V0ZSBtb3JlIHRoYW4gb25jZS4KKyAgaWYgKCFwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfKSB7CisgICAgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXyA9IHRydWU7CisKKyNpZiBkZWZpbmVkKEdURVNUX0NVU1RPTV9URVNUX0VWRU5UX0xJU1RFTkVSXykKKyAgICAvLyBSZWdpc3RlciB0byBzZW5kIG5vdGlmaWNhdGlvbnMgYWJvdXQga2V5IHByb2Nlc3Mgc3RhdGUgY2hhbmdlcy4KKyAgICBsaXN0ZW5lcnMoKS0+QXBwZW5kKG5ldyBHVEVTVF9DVVNUT01fVEVTVF9FVkVOVF9MSVNURU5FUl8oKSk7CisjZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX1RFU1RfRVZFTlRfTElTVEVORVJfKQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgICBJbml0RGVhdGhUZXN0U3VicHJvY2Vzc0NvbnRyb2xJbmZvKCk7CisgICAgU3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICAgIC8vIFJlZ2lzdGVycyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBUaGlzIG1ha2VzIHBhcmFtZXRlcml6ZWQgdGVzdHMKKyAgICAvLyBhdmFpbGFibGUgdG8gdGhlIFVuaXRUZXN0IHJlZmxlY3Rpb24gQVBJIHdpdGhvdXQgcnVubmluZworICAgIC8vIFJVTl9BTExfVEVTVFMuCisgICAgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKTsKKworICAgIC8vIENvbmZpZ3VyZXMgbGlzdGVuZXJzIGZvciBYTUwgb3V0cHV0LiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB1c2VycworICAgIC8vIHRvIHNodXQgZG93biB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0IGJlZm9yZSBpbnZva2luZyBSVU5fQUxMX1RFU1RTLgorICAgIENvbmZpZ3VyZVhtbE91dHB1dCgpOworCisjaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworICAgIC8vIENvbmZpZ3VyZXMgbGlzdGVuZXJzIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyLgorICAgIENvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpOworI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisgIH0KK30KKworLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIG5hbWUgb2YgYSBUZXN0Q2FzZSBhZ2FpbnN0IGEga25vd24KKy8vIHZhbHVlLgorLy8KKy8vIFRoaXMgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzIG9ubHkuICBXZSBwdXQKKy8vIGl0IGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlIHRvIHByZXZlbnQgcG9sbHV0aW5nIHRoZSBvdXRlcgorLy8gbmFtZXNwYWNlLgorLy8KKy8vIFRlc3RDYXNlTmFtZUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdENhc2VOYW1lSXMgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IuCisgIGV4cGxpY2l0IFRlc3RDYXNlTmFtZUlzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICAgICAgOiBuYW1lXyhuYW1lKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG5hbWUgb2YgdGVzdF9jYXNlIG1hdGNoZXMgbmFtZV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfY2FzZSAhPSBOVUxMICYmIHN0cmNtcCh0ZXN0X2Nhc2UtPm5hbWUoKSwgbmFtZV8uY19zdHIoKSkgPT0gMDsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCisvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndAorLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0LiAgSXQncyB0aGUgQ0FMTEVSJ1MKKy8vIFJFU1BPTlNJQklMSVRZIHRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgV0hFTiBUSEUKKy8vIFRFU1RTIEFSRSBOT1QgU0hVRkZMRUQuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICB0eXBlX3BhcmFtOiAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KKy8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2UqIFVuaXRUZXN0SW1wbDo6R2V0VGVzdENhc2UoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKSB7CisgIC8vIENhbiB3ZSBmaW5kIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZT8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPjo6Y29uc3RfaXRlcmF0b3IgdGVzdF9jYXNlID0KKyAgICAgIHN0ZDo6ZmluZF9pZih0ZXN0X2Nhc2VzXy5iZWdpbigpLCB0ZXN0X2Nhc2VzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZU5hbWVJcyh0ZXN0X2Nhc2VfbmFtZSkpOworCisgIGlmICh0ZXN0X2Nhc2UgIT0gdGVzdF9jYXNlc18uZW5kKCkpCisgICAgcmV0dXJuICp0ZXN0X2Nhc2U7CisKKyAgLy8gTm8uICBMZXQncyBjcmVhdGUgb25lLgorICBUZXN0Q2FzZSogY29uc3QgbmV3X3Rlc3RfY2FzZSA9CisgICAgICBuZXcgVGVzdENhc2UodGVzdF9jYXNlX25hbWUsIHR5cGVfcGFyYW0sIHNldF91cF90YywgdGVhcl9kb3duX3RjKTsKKworICAvLyBJcyB0aGlzIGEgZGVhdGggdGVzdCBjYXNlPworICBpZiAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlYXRoVGVzdENhc2VGaWx0ZXIpKSB7CisgICAgLy8gWWVzLiAgSW5zZXJ0cyB0aGUgdGVzdCBjYXNlIGFmdGVyIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZQorICAgIC8vIGRlZmluZWQgc28gZmFyLiAgVGhpcyBvbmx5IHdvcmtzIHdoZW4gdGhlIHRlc3QgY2FzZXMgaGF2ZW4ndAorICAgIC8vIGJlZW4gc2h1ZmZsZWQuICBPdGhlcndpc2Ugd2UgbWF5IGVuZCB1cCBydW5uaW5nIGEgZGVhdGggdGVzdAorICAgIC8vIGFmdGVyIGEgbm9uLWRlYXRoIHRlc3QuCisgICAgKytsYXN0X2RlYXRoX3Rlc3RfY2FzZV87CisgICAgdGVzdF9jYXNlc18uaW5zZXJ0KHRlc3RfY2FzZXNfLmJlZ2luKCkgKyBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8sCisgICAgICAgICAgICAgICAgICAgICAgIG5ld190ZXN0X2Nhc2UpOworICB9IGVsc2UgeworICAgIC8vIE5vLiAgQXBwZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgIHRlc3RfY2FzZXNfLnB1c2hfYmFjayhuZXdfdGVzdF9jYXNlKTsKKyAgfQorCisgIHRlc3RfY2FzZV9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VfaW5kaWNlc18uc2l6ZSgpKSk7CisgIHJldHVybiBuZXdfdGVzdF9jYXNlOworfQorCisvLyBIZWxwZXJzIGZvciBzZXR0aW5nIHVwIC8gdGVhcmluZyBkb3duIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4gIFRoZXkKKy8vIGFyZSBmb3IgdXNlIGluIHRoZSBGb3JFYWNoKCkgZnVuY3Rpb24uCitzdGF0aWMgdm9pZCBTZXRVcEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5TZXRVcCgpOyB9CitzdGF0aWMgdm9pZCBUZWFyRG93bkVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5UZWFyRG93bigpOyB9CisKKy8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisvLyByZXR1cm5zIHRydWUgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLiAgSWYgYW55IGV4Y2VwdGlvbiBpcworLy8gdGhyb3duIGR1cmluZyBhIHRlc3QsIHRoZSB0ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQgdGhlCisvLyByZXN0IG9mIHRoZSB0ZXN0cyB3aWxsIHN0aWxsIGJlIHJ1bi4KKy8vCisvLyBXaGVuIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQsIGl0IGV4cGFuZHMgYW5kIHJlZ2lzdGVycworLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBmaXJzdCBpbiBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpLgorLy8gQWxsIG90aGVyIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cygpIG1heSBzYWZlbHkgYXNzdW1lIHRoYXQKKy8vIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIHJlYWR5IHRvIGJlIGNvdW50ZWQgYW5kIHJ1bi4KK2Jvb2wgVW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cygpIHsKKyAgLy8gTWFrZXMgc3VyZSBJbml0R29vZ2xlVGVzdCgpIHdhcyBjYWxsZWQuCisgIGlmICghR1Rlc3RJc0luaXRpYWxpemVkKCkpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIlxuVGhpcyB0ZXN0IHByb2dyYW0gZGlkIE5PVCBjYWxsIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QgIgorICAgICAgICAgICAiYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLiAgUGxlYXNlIGZpeCBpdC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIERvIG5vdCBydW4gYW55IHRlc3QgaWYgdGhlIC0taGVscCBmbGFnIHdhcyBzcGVjaWZpZWQuCisgIGlmIChnX2hlbHBfZmxhZykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBSZXBlYXRzIHRoZSBjYWxsIHRvIHRoZSBwb3N0LWZsYWcgcGFyc2luZyBpbml0aWFsaXphdGlvbiBpbiBjYXNlIHRoZQorICAvLyB1c2VyIGRpZG4ndCBjYWxsIEluaXRHb29nbGVUZXN0LgorICBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7CisKKyAgLy8gRXZlbiBpZiBzaGFyZGluZyBpcyBub3Qgb24sIHRlc3QgcnVubmVycyBtYXkgd2FudCB0byB1c2UgdGhlCisgIC8vIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIHRvIHF1ZXJ5IHdoZXRoZXIgdGhlIHRlc3Qgc3VwcG9ydHMgdGhlIHNoYXJkaW5nCisgIC8vIHByb3RvY29sLgorICBpbnRlcm5hbDo6V3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCk7CisKKyAgLy8gVHJ1ZSBpZmYgd2UgYXJlIGluIGEgc3VicHJvY2VzcyBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlLXN0eWxlCisgIC8vIGRlYXRoIHRlc3QuCisgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IGZhbHNlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IChpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKSAhPSBOVUxMKTsKKyMgaWYgZGVmaW5lZChHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NISUxEX1NFVFVQXykKKyAgaWYgKGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKKyAgICBHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NISUxEX1NFVFVQXygpOworICB9CisjIGVuZGlmICAvLyBkZWZpbmVkKEdURVNUX0VYVFJBX0RFQVRIX1RFU1RfQ0hJTERfU0VUVVBfKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIGNvbnN0IGJvb2wgc2hvdWxkX3NoYXJkID0gU2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpOworCisgIC8vIENvbXBhcmVzIHRoZSBmdWxsIHRlc3QgbmFtZXMgd2l0aCB0aGUgZmlsdGVyIHRvIGRlY2lkZSB3aGljaAorICAvLyB0ZXN0cyB0byBydW4uCisgIGNvbnN0IGJvb2wgaGFzX3Rlc3RzX3RvX3J1biA9IEZpbHRlclRlc3RzKHNob3VsZF9zaGFyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IElHTk9SRV9TSEFSRElOR19QUk9UT0NPTCkgPiAwOworCisgIC8vIExpc3RzIHRoZSB0ZXN0cyBhbmQgZXhpdHMgaWYgdGhlIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnIHdhcyBzcGVjaWZpZWQuCisgIGlmIChHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKSB7CisgICAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqIEZpbHRlclRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkLgorICAgIExpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByYW5kb21fc2VlZF8gPSBHVEVTVF9GTEFHKHNodWZmbGUpID8KKyAgICAgIEdldFJhbmRvbVNlZWRGcm9tRmxhZyhHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgOiAwOworCisgIC8vIFRydWUgaWZmIGF0IGxlYXN0IG9uZSB0ZXN0IGhhcyBmYWlsZWQuCisgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gbGlzdGVuZXJzKCktPnJlcGVhdGVyKCk7CisKKyAgc3RhcnRfdGltZXN0YW1wXyA9IEdldFRpbWVJbk1pbGxpcygpOworICByZXBlYXRlci0+T25UZXN0UHJvZ3JhbVN0YXJ0KCpwYXJlbnRfKTsKKworICAvLyBIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIHRlc3RzPyAgV2UgZG9uJ3Qgd2FudCB0byByZXBlYXQgdGhlbQorICAvLyB3aGVuIHdlIGFyZSBpbnNpZGUgdGhlIHN1YnByb2Nlc3Mgb2YgYSBkZWF0aCB0ZXN0LgorICBjb25zdCBpbnQgcmVwZWF0ID0gaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA/IDEgOiBHVEVTVF9GTEFHKHJlcGVhdCk7CisgIC8vIFJlcGVhdHMgZm9yZXZlciBpZiB0aGUgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLgorICBjb25zdCBib29sIGZvcmV2ZXIgPSByZXBlYXQgPCAwOworICBmb3IgKGludCBpID0gMDsgZm9yZXZlciB8fCBpICE9IHJlcGVhdDsgaSsrKSB7CisgICAgLy8gV2Ugd2FudCB0byBwcmVzZXJ2ZSBmYWlsdXJlcyBnZW5lcmF0ZWQgYnkgYWQtaG9jIHRlc3QKKyAgICAvLyBhc3NlcnRpb25zIGV4ZWN1dGVkIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkuCisgICAgQ2xlYXJOb25BZEhvY1Rlc3RSZXN1bHQoKTsKKworICAgIGNvbnN0IFRpbWVJbk1pbGxpcyBzdGFydCA9IEdldFRpbWVJbk1pbGxpcygpOworCisgICAgLy8gU2h1ZmZsZXMgdGVzdCBjYXNlcyBhbmQgdGVzdHMgaWYgcmVxdWVzdGVkLgorICAgIGlmIChoYXNfdGVzdHNfdG9fcnVuICYmIEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICAgIHJhbmRvbSgpLT5SZXNlZWQocmFuZG9tX3NlZWRfKTsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgT25UZXN0SXRlcmF0aW9uU3RhcnQoKSwKKyAgICAgIC8vIHN1Y2ggdGhhdCBhIHRlc3QgZXZlbnQgbGlzdGVuZXIgY2FuIHNlZSB0aGUgYWN0dWFsIHRlc3Qgb3JkZXIKKyAgICAgIC8vIGluIHRoZSBldmVudC4KKyAgICAgIFNodWZmbGVUZXN0cygpOworICAgIH0KKworICAgIC8vIFRlbGxzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXJzIHRoYXQgdGhlIHRlc3RzIGFyZSBhYm91dCB0byBzdGFydC4KKyAgICByZXBlYXRlci0+T25UZXN0SXRlcmF0aW9uU3RhcnQoKnBhcmVudF8sIGkpOworCisgICAgLy8gUnVucyBlYWNoIHRlc3QgY2FzZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdGVzdCB0byBydW4uCisgICAgaWYgKGhhc190ZXN0c190b19ydW4pIHsKKyAgICAgIC8vIFNldHMgdXAgYWxsIGVudmlyb25tZW50cyBiZWZvcmVoYW5kLgorICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCgqcGFyZW50Xyk7CisgICAgICBGb3JFYWNoKGVudmlyb25tZW50c18sIFNldFVwRW52aXJvbm1lbnQpOworICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzU2V0VXBFbmQoKnBhcmVudF8pOworCisgICAgICAvLyBSdW5zIHRoZSB0ZXN0cyBvbmx5IGlmIHRoZXJlIHdhcyBubyBmYXRhbCBmYWlsdXJlIGR1cmluZyBnbG9iYWwKKyAgICAgIC8vIHNldC11cC4KKyAgICAgIGlmICghVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICAgICAgZm9yIChpbnQgdGVzdF9pbmRleCA9IDA7IHRlc3RfaW5kZXggPCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsKKyAgICAgICAgICAgICB0ZXN0X2luZGV4KyspIHsKKyAgICAgICAgICBHZXRNdXRhYmxlVGVzdENhc2UodGVzdF9pbmRleCktPlJ1bigpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRlYXJzIGRvd24gYWxsIGVudmlyb25tZW50cyBpbiByZXZlcnNlIG9yZGVyIGFmdGVyd2FyZHMuCisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KCpwYXJlbnRfKTsKKyAgICAgIHN0ZDo6Zm9yX2VhY2goZW52aXJvbm1lbnRzXy5yYmVnaW4oKSwgZW52aXJvbm1lbnRzXy5yZW5kKCksCisgICAgICAgICAgICAgICAgICAgIFRlYXJEb3duRW52aXJvbm1lbnQpOworICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoKnBhcmVudF8pOworICAgIH0KKworICAgIGVsYXBzZWRfdGltZV8gPSBHZXRUaW1lSW5NaWxsaXMoKSAtIHN0YXJ0OworCisgICAgLy8gVGVsbHMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lciB0aGF0IHRoZSB0ZXN0cyBoYXZlIGp1c3QgZmluaXNoZWQuCisgICAgcmVwZWF0ZXItPk9uVGVzdEl0ZXJhdGlvbkVuZCgqcGFyZW50XywgaSk7CisKKyAgICAvLyBHZXRzIHRoZSByZXN1bHQgYW5kIGNsZWFycyBpdC4KKyAgICBpZiAoIVBhc3NlZCgpKSB7CisgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIFJlc3RvcmVzIHRoZSBvcmlnaW5hbCB0ZXN0IG9yZGVyIGFmdGVyIHRoZSBpdGVyYXRpb24uICBUaGlzCisgICAgLy8gYWxsb3dzIHRoZSB1c2VyIHRvIHF1aWNrbHkgcmVwcm8gYSBmYWlsdXJlIHRoYXQgaGFwcGVucyBpbiB0aGUKKyAgICAvLyBOLXRoIGl0ZXJhdGlvbiB3aXRob3V0IHJlcGVhdGluZyB0aGUgZmlyc3QgKE4gLSAxKSBpdGVyYXRpb25zLgorICAgIC8vIFRoaXMgaXMgbm90IGVuY2xvc2VkIGluICJpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeyAuLi4gfSIsIGluCisgICAgLy8gY2FzZSB0aGUgdXNlciBzb21laG93IGNoYW5nZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHNvbWV3aGVyZQorICAgIC8vIChpdCdzIGFsd2F5cyBzYWZlIHRvIHVuc2h1ZmZsZSB0aGUgdGVzdHMpLgorICAgIFVuc2h1ZmZsZVRlc3RzKCk7CisKKyAgICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgeworICAgICAgLy8gUGlja3MgYSBuZXcgcmFuZG9tIHNlZWQgZm9yIGVhY2ggaXRlcmF0aW9uLgorICAgICAgcmFuZG9tX3NlZWRfID0gR2V0TmV4dFJhbmRvbVNlZWQocmFuZG9tX3NlZWRfKTsKKyAgICB9CisgIH0KKworICByZXBlYXRlci0+T25UZXN0UHJvZ3JhbUVuZCgqcGFyZW50Xyk7CisKKyAgcmV0dXJuICFmYWlsZWQ7Cit9CisKKy8vIFJlYWRzIHRoZSBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYW5kIGNyZWF0ZXMgdGhlIGZpbGUKKy8vIGlmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LiBJZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbiwgdGhpcworLy8gZnVuY3Rpb24gd2lsbCB3cml0ZSBvdmVyIGl0LiBJZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudCwgYnV0IHRoZSBmaWxlIGNhbm5vdAorLy8gYmUgY3JlYXRlZCwgcHJpbnRzIGFuIGVycm9yIGFuZCBleGl0cy4KK3ZvaWQgV3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCkgeworICBjb25zdCBjaGFyKiBjb25zdCB0ZXN0X3NoYXJkX2ZpbGUgPSBwb3NpeDo6R2V0RW52KGtUZXN0U2hhcmRTdGF0dXNGaWxlKTsKKyAgaWYgKHRlc3Rfc2hhcmRfZmlsZSAhPSBOVUxMKSB7CisgICAgRklMRSogY29uc3QgZmlsZSA9IHBvc2l4OjpGT3Blbih0ZXN0X3NoYXJkX2ZpbGUsICJ3Iik7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgdG8gdGhlIHRlc3Qgc2hhcmQgc3RhdHVzIGZpbGUgXCIlc1wiICIKKyAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllZCBieSB0aGUgJXMgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3NoYXJkX2ZpbGUsIGtUZXN0U2hhcmRTdGF0dXNGaWxlKTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgICBmY2xvc2UoZmlsZSk7CisgIH0KK30KKworLy8gQ2hlY2tzIHdoZXRoZXIgc2hhcmRpbmcgaXMgZW5hYmxlZCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50CisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsCisvLyBidXQgaW5jb25zaXN0ZW50IChpLmUuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMKKy8vIGFuIGVycm9yIGFuZCBleGl0cy4gSWYgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCwgc2hhcmRpbmcgaXMKKy8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QKKy8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLgorYm9vbCBTaG91bGRTaGFyZChjb25zdCBjaGFyKiB0b3RhbF9zaGFyZHNfZW52LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGFyZF9pbmRleF9lbnYsCisgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgeworICBpZiAoaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IEludDMyRnJvbUVudk9yRGllKHRvdGFsX3NoYXJkc19lbnYsIC0xKTsKKyAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShzaGFyZF9pbmRleF9lbnYsIC0xKTsKKworICBpZiAodG90YWxfc2hhcmRzID09IC0xICYmIHNoYXJkX2luZGV4ID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyA9PSAtMSAmJiBzaGFyZF9pbmRleCAhPSAtMSkgeworICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCisgICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKKyAgICAgIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiID0gIiA8PCBzaGFyZF9pbmRleAorICAgICAgPDwgIiwgYnV0IGhhdmUgbGVmdCAiIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiB1bnNldC5cbiI7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0gZWxzZSBpZiAodG90YWxfc2hhcmRzICE9IC0xICYmIHNoYXJkX2luZGV4ID09IC0xKSB7CisgICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKKyAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogeW91IGhhdmUgIgorICAgICAgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiID0gIiA8PCB0b3RhbF9zaGFyZHMKKyAgICAgIDw8ICIsIGJ1dCBoYXZlIGxlZnQgIiA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiB1bnNldC5cbiI7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0gZWxzZSBpZiAoc2hhcmRfaW5kZXggPCAwIHx8IHNoYXJkX2luZGV4ID49IHRvdGFsX3NoYXJkcykgeworICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCisgICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHdlIHJlcXVpcmUgMCA8PSAiCisgICAgICA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiA8ICIgPDwga1Rlc3RUb3RhbFNoYXJkcworICAgICAgPDwgIiwgYnV0IHlvdSBoYXZlICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICI9IiA8PCBzaGFyZF9pbmRleAorICAgICAgPDwgIiwgIiA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICI9IiA8PCB0b3RhbF9zaGFyZHMgPDwgIi5cbiI7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKworICByZXR1cm4gdG90YWxfc2hhcmRzID4gMTsKK30KKworLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YXIgYXMgYW4gSW50MzIuIElmIGl0IGlzIHVuc2V0LAorLy8gcmV0dXJucyBkZWZhdWx0X3ZhbC4gSWYgaXQgaXMgbm90IGFuIEludDMyLCBwcmludHMgYW4gZXJyb3IKKy8vIGFuZCBhYm9ydHMuCitJbnQzMiBJbnQzMkZyb21FbnZPckRpZShjb25zdCBjaGFyKiB2YXIsIEludDMyIGRlZmF1bHRfdmFsKSB7CisgIGNvbnN0IGNoYXIqIHN0cl92YWwgPSBwb3NpeDo6R2V0RW52KHZhcik7CisgIGlmIChzdHJfdmFsID09IE5VTEwpIHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWw7CisgIH0KKworICBJbnQzMiByZXN1bHQ7CisgIGlmICghUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIlRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSAiIDw8IHZhciwKKyAgICAgICAgICAgICAgICAgIHN0cl92YWwsICZyZXN1bHQpKSB7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzLCB0aGUgc2hhcmQgaW5kZXgsIGFuZCB0aGUgdGVzdCBpZCwKKy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biBvbiB0aGlzIHNoYXJkLiBUaGUgdGVzdCBpZCBpcworLy8gc29tZSBhcmJpdHJhcnkgYnV0IHVuaXF1ZSBub24tbmVnYXRpdmUgaW50ZWdlciBhc3NpZ25lZCB0byBlYWNoIHRlc3QKKy8vIG1ldGhvZC4gQXNzdW1lcyB0aGF0IDAgPD0gc2hhcmRfaW5kZXggPCB0b3RhbF9zaGFyZHMuCitib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKGludCB0b3RhbF9zaGFyZHMsIGludCBzaGFyZF9pbmRleCwgaW50IHRlc3RfaWQpIHsKKyAgcmV0dXJuICh0ZXN0X2lkICUgdG90YWxfc2hhcmRzKSA9PSBzaGFyZF9pbmRleDsKK30KKworLy8gQ29tcGFyZXMgdGhlIG5hbWUgb2YgZWFjaCB0ZXN0IHdpdGggdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciB0bworLy8gZGVjaWRlIHdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biwgdGhlbiByZWNvcmRzIHRoZSByZXN1bHQgaW4KKy8vIGVhY2ggVGVzdENhc2UgYW5kIFRlc3RJbmZvIG9iamVjdC4KKy8vIElmIHNoYXJkX3Rlc3RzID09IHRydWUsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cyBiYXNlZCBvbiBzaGFyZGluZworLy8gdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudCAtIHNlZQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZXRlc3Qvd2lraS9Hb29nbGVUZXN0QWR2YW5jZWRHdWlkZS4KKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCitpbnQgVW5pdFRlc3RJbXBsOjpGaWx0ZXJUZXN0cyhSZWFjdGlvblRvU2hhcmRpbmcgc2hhcmRfdGVzdHMpIHsKKyAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPworICAgICAgSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RUb3RhbFNoYXJkcywgLTEpIDogLTE7CisgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPworICAgICAgSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RTaGFyZEluZGV4LCAtMSkgOiAtMTsKKworICAvLyBudW1fcnVubmFibGVfdGVzdHMgYXJlIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCB3aWxsCisgIC8vIHJ1biBhY3Jvc3MgYWxsIHNoYXJkcyAoaS5lLiwgbWF0Y2ggZmlsdGVyIGFuZCBhcmUgbm90IGRpc2FibGVkKS4KKyAgLy8gbnVtX3NlbGVjdGVkX3Rlc3RzIGFyZSB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHJ1biBvbgorICAvLyB0aGlzIHNoYXJkLgorICBpbnQgbnVtX3J1bm5hYmxlX3Rlc3RzID0gMDsKKyAgaW50IG51bV9zZWxlY3RlZF90ZXN0cyA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gdGVzdF9jYXNlc19baV07CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfY2FzZV9uYW1lID0gdGVzdF9jYXNlLT5uYW1lKCk7CisgICAgdGVzdF9jYXNlLT5zZXRfc2hvdWxkX3J1bihmYWxzZSk7CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKS5zaXplKCk7IGorKykgeworICAgICAgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVtqXTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRlc3RfbmFtZSh0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICAvLyBBIHRlc3QgaXMgZGlzYWJsZWQgaWYgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMKKyAgICAgIC8vIGtEaXNhYmxlVGVzdEZpbHRlci4KKyAgICAgIGNvbnN0IGJvb2wgaXNfZGlzYWJsZWQgPQorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpIHx8CisgICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpOworICAgICAgdGVzdF9pbmZvLT5pc19kaXNhYmxlZF8gPSBpc19kaXNhYmxlZDsKKworICAgICAgY29uc3QgYm9vbCBtYXRjaGVzX2ZpbHRlciA9CisgICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QodGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lKTsKKyAgICAgIHRlc3RfaW5mby0+bWF0Y2hlc19maWx0ZXJfID0gbWF0Y2hlc19maWx0ZXI7CisKKyAgICAgIGNvbnN0IGJvb2wgaXNfcnVubmFibGUgPQorICAgICAgICAgIChHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSB8fCAhaXNfZGlzYWJsZWQpICYmCisgICAgICAgICAgbWF0Y2hlc19maWx0ZXI7CisKKyAgICAgIGNvbnN0IGJvb2wgaXNfc2VsZWN0ZWQgPSBpc19ydW5uYWJsZSAmJgorICAgICAgICAgIChzaGFyZF90ZXN0cyA9PSBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wgfHwKKyAgICAgICAgICAgU2hvdWxkUnVuVGVzdE9uU2hhcmQodG90YWxfc2hhcmRzLCBzaGFyZF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3J1bm5hYmxlX3Rlc3RzKSk7CisKKyAgICAgIG51bV9ydW5uYWJsZV90ZXN0cyArPSBpc19ydW5uYWJsZTsKKyAgICAgIG51bV9zZWxlY3RlZF90ZXN0cyArPSBpc19zZWxlY3RlZDsKKworICAgICAgdGVzdF9pbmZvLT5zaG91bGRfcnVuXyA9IGlzX3NlbGVjdGVkOworICAgICAgdGVzdF9jYXNlLT5zZXRfc2hvdWxkX3J1bih0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSB8fCBpc19zZWxlY3RlZCk7CisgICAgfQorICB9CisgIHJldHVybiBudW1fc2VsZWN0ZWRfdGVzdHM7Cit9CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gQy1zdHJpbmcgb24gYSBzaW5nbGUgbGluZSBieSByZXBsYWNpbmcgYWxsICdcbicKKy8vIGNoYXJhY3RlcnMgd2l0aCBzdHJpbmcgIlxcbiIuICBJZiB0aGUgb3V0cHV0IHRha2VzIG1vcmUgdGhhbgorLy8gbWF4X2xlbmd0aCBjaGFyYWN0ZXJzLCBvbmx5IHByaW50cyB0aGUgZmlyc3QgbWF4X2xlbmd0aCBjaGFyYWN0ZXJzCisvLyBhbmQgIi4uLiIuCitzdGF0aWMgdm9pZCBQcmludE9uT25lTGluZShjb25zdCBjaGFyKiBzdHIsIGludCBtYXhfbGVuZ3RoKSB7CisgIGlmIChzdHIgIT0gTlVMTCkgeworICAgIGZvciAoaW50IGkgPSAwOyAqc3RyICE9ICdcMCc7ICsrc3RyKSB7CisgICAgICBpZiAoaSA+PSBtYXhfbGVuZ3RoKSB7CisgICAgICAgIHByaW50ZigiLi4uIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCpzdHIgPT0gJ1xuJykgeworICAgICAgICBwcmludGYoIlxcbiIpOworICAgICAgICBpICs9IDI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVjIiwgKnN0cik7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gUHJpbnRzIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgbWF0Y2hpbmcgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBmbGFnLgordm9pZCBVbml0VGVzdEltcGw6Okxpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCkgeworICAvLyBQcmludCBhdCBtb3N0IHRoaXMgbWFueSBjaGFyYWN0ZXJzIGZvciBlYWNoIHR5cGUvdmFsdWUgcGFyYW1ldGVyLgorICBjb25zdCBpbnQga01heFBhcmFtTGVuZ3RoID0gMjUwOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gdGVzdF9jYXNlc19baV07CisgICAgYm9vbCBwcmludGVkX3Rlc3RfY2FzZV9uYW1lID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKS5zaXplKCk7IGorKykgeworICAgICAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgICAgICAgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpW2pdOworICAgICAgaWYgKHRlc3RfaW5mby0+bWF0Y2hlc19maWx0ZXJfKSB7CisgICAgICAgIGlmICghcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSkgeworICAgICAgICAgIHByaW50ZWRfdGVzdF9jYXNlX25hbWUgPSB0cnVlOworICAgICAgICAgIHByaW50ZigiJXMuIiwgdGVzdF9jYXNlLT5uYW1lKCkpOworICAgICAgICAgIGlmICh0ZXN0X2Nhc2UtPnR5cGVfcGFyYW0oKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGYoIiAgIyAlcyA9ICIsIGtUeXBlUGFyYW1MYWJlbCk7CisgICAgICAgICAgICAvLyBXZSBwcmludCB0aGUgdHlwZSBwYXJhbWV0ZXIgb24gYSBzaW5nbGUgbGluZSB0byBtYWtlCisgICAgICAgICAgICAvLyB0aGUgb3V0cHV0IGVhc3kgdG8gcGFyc2UgYnkgYSBwcm9ncmFtLgorICAgICAgICAgICAgUHJpbnRPbk9uZUxpbmUodGVzdF9jYXNlLT50eXBlX3BhcmFtKCksIGtNYXhQYXJhbUxlbmd0aCk7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiAgJXMiLCB0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICAgIGlmICh0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgICAgICAgIHByaW50ZigiICAjICVzID0gIiwga1ZhbHVlUGFyYW1MYWJlbCk7CisgICAgICAgICAgLy8gV2UgcHJpbnQgdGhlIHZhbHVlIHBhcmFtZXRlciBvbiBhIHNpbmdsZSBsaW5lIHRvIG1ha2UgdGhlCisgICAgICAgICAgLy8gb3V0cHV0IGVhc3kgdG8gcGFyc2UgYnkgYSBwcm9ncmFtLgorICAgICAgICAgIFByaW50T25PbmVMaW5lKHRlc3RfaW5mby0+dmFsdWVfcGFyYW0oKSwga01heFBhcmFtTGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgICB9CisgICAgfQorICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisvLworLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhbmQgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGFyZQorLy8gdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlIGlucHV0IHRoZQorLy8gY3VycmVudCBnZXR0ZXIuCit2b2lkIFVuaXRUZXN0SW1wbDo6c2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcigKKyAgICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcikgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyAhPSBnZXR0ZXIpIHsKKyAgICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKKyAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gZ2V0dGVyOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOworLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKy8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCitPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIFVuaXRUZXN0SW1wbDo6b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCkgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9PSBOVUxMKSB7CisjaWZkZWYgR1RFU1RfT1NfU1RBQ0tfVFJBQ0VfR0VUVEVSXworICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPSBuZXcgR1RFU1RfT1NfU1RBQ0tfVFJBQ0VfR0VUVEVSXzsKKyNlbHNlCisgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IG5ldyBPc1N0YWNrVHJhY2VHZXR0ZXI7CisjZW5kaWYgIC8vIEdURVNUX09TX1NUQUNLX1RSQUNFX0dFVFRFUl8KKyAgfQorCisgIHJldHVybiBvc19zdGFja190cmFjZV9nZXR0ZXJfOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsIG9yCisvLyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0IGlmIG5vIHRlc3QgaXMgcnVubmluZy4KK1Rlc3RSZXN1bHQqIFVuaXRUZXN0SW1wbDo6Y3VycmVudF90ZXN0X3Jlc3VsdCgpIHsKKyAgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXyA/CisgICAgICAmKGN1cnJlbnRfdGVzdF9pbmZvXy0+cmVzdWx0XykgOiAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsKK30KKworLy8gU2h1ZmZsZXMgYWxsIHRlc3QgY2FzZXMsIGFuZCB0aGUgdGVzdHMgd2l0aGluIGVhY2ggdGVzdCBjYXNlLAorLy8gbWFraW5nIHN1cmUgdGhhdCBkZWF0aCB0ZXN0cyBhcmUgc3RpbGwgcnVuIGZpcnN0Lgordm9pZCBVbml0VGVzdEltcGw6OlNodWZmbGVUZXN0cygpIHsKKyAgLy8gU2h1ZmZsZXMgdGhlIGRlYXRoIHRlc3QgY2FzZXMuCisgIFNodWZmbGVSYW5nZShyYW5kb20oKSwgMCwgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfICsgMSwgJnRlc3RfY2FzZV9pbmRpY2VzXyk7CisKKyAgLy8gU2h1ZmZsZXMgdGhlIG5vbi1kZWF0aCB0ZXN0IGNhc2VzLgorICBTaHVmZmxlUmFuZ2UocmFuZG9tKCksIGxhc3RfZGVhdGhfdGVzdF9jYXNlXyArIDEsCisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZXNfLnNpemUoKSksICZ0ZXN0X2Nhc2VfaW5kaWNlc18pOworCisgIC8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbnNpZGUgZWFjaCB0ZXN0IGNhc2UuCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICB0ZXN0X2Nhc2VzX1tpXS0+U2h1ZmZsZVRlc3RzKHJhbmRvbSgpKTsKKyAgfQorfQorCisvLyBSZXN0b3JlcyB0aGUgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdG8gdGhlaXIgb3JkZXIgYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgordm9pZCBVbml0VGVzdEltcGw6OlVuc2h1ZmZsZVRlc3RzKCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgLy8gVW5zaHVmZmxlcyB0aGUgdGVzdHMgaW4gZWFjaCB0ZXN0IGNhc2UuCisgICAgdGVzdF9jYXNlc19baV0tPlVuc2h1ZmZsZVRlc3RzKCk7CisgICAgLy8gUmVzZXRzIHRoZSBpbmRleCBvZiBlYWNoIHRlc3QgY2FzZS4KKyAgICB0ZXN0X2Nhc2VfaW5kaWNlc19baV0gPSBzdGF0aWNfY2FzdDxpbnQ+KGkpOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCisvLworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKy8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKy8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisvLyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKC4uLiwgMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4KKy8vIHRoZSB0cmFjZSBidXQgQmFyKCkgYW5kIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK3N0ZDo6c3RyaW5nIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoVW5pdFRlc3QqIC8qdW5pdF90ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lwX2NvdW50KSB7CisgIC8vIFdlIHBhc3Mgc2tpcF9jb3VudCArIDEgdG8gc2tpcCB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gaW4gYWRkaXRpb24KKyAgLy8gdG8gd2hhdCB0aGUgdXNlciByZWFsbHkgd2FudHMgdG8gc2tpcC4KKyAgcmV0dXJuIEdldFVuaXRUZXN0SW1wbCgpLT5DdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKHNraXBfY291bnQgKyAxKTsKK30KKworLy8gVXNlZCBieSB0aGUgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyBtYWNybyB0bworLy8gc3VwcHJlc3MgdW5yZWFjaGFibGUgY29kZSB3YXJuaW5ncy4KK25hbWVzcGFjZSB7CitjbGFzcyBDbGFzc1VuaXF1ZVRvQWx3YXlzVHJ1ZSB7fTsKK30KKworYm9vbCBJc1RydWUoYm9vbCBjb25kaXRpb24pIHsgcmV0dXJuIGNvbmRpdGlvbjsgfQorCitib29sIEFsd2F5c1RydWUoKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgLy8gVGhpcyBjb25kaXRpb24gaXMgYWx3YXlzIGZhbHNlIHNvIEFsd2F5c1RydWUoKSBuZXZlciBhY3R1YWxseSB0aHJvd3MsCisgIC8vIGJ1dCBpdCBtYWtlcyB0aGUgY29tcGlsZXIgdGhpbmsgdGhhdCBpdCBtYXkgdGhyb3cuCisgIGlmIChJc1RydWUoZmFsc2UpKQorICAgIHRocm93IENsYXNzVW5pcXVlVG9BbHdheXNUcnVlKCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisgIHJldHVybiB0cnVlOworfQorCisvLyBJZiAqcHN0ciBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBtb2RpZmllcyAqcHN0ciB0byBiZSByaWdodAorLy8gcGFzdCB0aGUgcHJlZml4IGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnBzdHIgdW5jaGFuZ2VkCisvLyBhbmQgcmV0dXJucyBmYWxzZS4gIE5vbmUgb2YgcHN0ciwgKnBzdHIsIGFuZCBwcmVmaXggY2FuIGJlIE5VTEwuCitib29sIFNraXBQcmVmaXgoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiogcHN0cikgeworICBjb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOworICBpZiAoc3RybmNtcCgqcHN0ciwgcHJlZml4LCBwcmVmaXhfbGVuKSA9PSAwKSB7CisgICAgKnBzdHIgKz0gcHJlZml4X2xlbjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBhcyBhIGNvbW1hbmQgbGluZSBmbGFnLiAgVGhlIHN0cmluZyBzaG91bGQgaGF2ZQorLy8gdGhlIGZvcm1hdCAiLS1mbGFnPXZhbHVlIi4gIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIHRoZSAiPXZhbHVlIgorLy8gcGFydCBjYW4gYmUgb21pdHRlZC4KKy8vCisvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZywgb3IgTlVMTCBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCitjb25zdCBjaGFyKiBQYXJzZUZsYWdWYWx1ZShjb25zdCBjaGFyKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZfb3B0aW9uYWwpIHsKKyAgLy8gc3RyIGFuZCBmbGFnIG11c3Qgbm90IGJlIE5VTEwuCisgIGlmIChzdHIgPT0gTlVMTCB8fCBmbGFnID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIC8vIFRoZSBmbGFnIG11c3Qgc3RhcnQgd2l0aCAiLS0iIGZvbGxvd2VkIGJ5IEdURVNUX0ZMQUdfUFJFRklYXy4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmxhZ19zdHIgPSBzdGQ6OnN0cmluZygiLS0iKSArIEdURVNUX0ZMQUdfUFJFRklYXyArIGZsYWc7CisgIGNvbnN0IHNpemVfdCBmbGFnX2xlbiA9IGZsYWdfc3RyLmxlbmd0aCgpOworICBpZiAoc3RybmNtcChzdHIsIGZsYWdfc3RyLmNfc3RyKCksIGZsYWdfbGVuKSAhPSAwKSByZXR1cm4gTlVMTDsKKworICAvLyBTa2lwcyB0aGUgZmxhZyBuYW1lLgorICBjb25zdCBjaGFyKiBmbGFnX2VuZCA9IHN0ciArIGZsYWdfbGVuOworCisgIC8vIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIGl0J3MgT0sgdG8gbm90IGhhdmUgYSAiPXZhbHVlIiBwYXJ0LgorICBpZiAoZGVmX29wdGlvbmFsICYmIChmbGFnX2VuZFswXSA9PSAnXDAnKSkgeworICAgIHJldHVybiBmbGFnX2VuZDsKKyAgfQorCisgIC8vIElmIGRlZl9vcHRpb25hbCBpcyB0cnVlIGFuZCB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIGFmdGVyIHRoZQorICAvLyBmbGFnIG5hbWUsIG9yIGlmIGRlZl9vcHRpb25hbCBpcyBmYWxzZSwgdGhlcmUgbXVzdCBiZSBhICc9JyBhZnRlcgorICAvLyB0aGUgZmxhZyBuYW1lLgorICBpZiAoZmxhZ19lbmRbMF0gIT0gJz0nKSByZXR1cm4gTlVMTDsKKworICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgYWZ0ZXIgIj0iLgorICByZXR1cm4gZmxhZ19lbmQgKyAxOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGEgYm9vbCBmbGFnLCBpbiB0aGUgZm9ybSBvZiBlaXRoZXIKKy8vICItLWZsYWc9dmFsdWUiIG9yICItLWZsYWciLgorLy8KKy8vIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIHZhbHVlIGlzIHRha2VuIGFzIHRydWUgYXMgbG9uZyBhcyBpdCBkb2VzCisvLyBub3Qgc3RhcnQgd2l0aCAnMCcsICdmJywgb3IgJ0YnLgorLy8KKy8vIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHZhbHVlIGlzIHRha2VuIGFzIHRydWUuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VCb29sRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIHRydWUpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdmFsdWUgdG8gYSBib29sLgorICAqdmFsdWUgPSAhKCp2YWx1ZV9zdHIgPT0gJzAnIHx8ICp2YWx1ZV9zdHIgPT0gJ2YnIHx8ICp2YWx1ZV9zdHIgPT0gJ0YnKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYW4gSW50MzIgZmxhZywgaW4gdGhlIGZvcm0gb2YKKy8vICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlSW50MzJGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgSW50MzIqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCisgIHJldHVybiBQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiVGhlIHZhbHVlIG9mIGZsYWcgLS0iIDw8IGZsYWcsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX3N0ciwgdmFsdWUpOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGEgc3RyaW5nIGZsYWcsIGluIHRoZSBmb3JtIG9mCisvLyAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZVN0cmluZ0ZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBzdGQ6OnN0cmluZyogdmFsdWUpIHsKKyAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KKyAgKnZhbHVlID0gdmFsdWVfc3RyOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3RyaW5nIGhhcyBhIHByZWZpeCB0aGF0IEdvb2dsZSBUZXN0IHVzZXMgZm9yIGl0cworLy8gZmxhZ3MsIGkuZS4sIHN0YXJ0cyB3aXRoIEdURVNUX0ZMQUdfUFJFRklYXyBvciBHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXy4KKy8vIElmIEdvb2dsZSBUZXN0IGRldGVjdHMgdGhhdCBhIGNvbW1hbmQgbGluZSBmbGFnIGhhcyBpdHMgcHJlZml4IGJ1dCBpcyBub3QKKy8vIHJlY29nbml6ZWQsIGl0IHdpbGwgcHJpbnQgaXRzIGhlbHAgbWVzc2FnZS4gRmxhZ3Mgc3RhcnRpbmcgd2l0aAorLy8gR1RFU1RfSU5URVJOQUxfUFJFRklYXyBmb2xsb3dlZCBieSAiaW50ZXJuYWxfIiBhcmUgY29uc2lkZXJlZCBHb29nbGUgVGVzdAorLy8gaW50ZXJuYWwgZmxhZ3MgYW5kIGRvIG5vdCB0cmlnZ2VyIHRoZSBoZWxwIG1lc3NhZ2UuCitzdGF0aWMgYm9vbCBIYXNHb29nbGVUZXN0RmxhZ1ByZWZpeChjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIChTa2lwUHJlZml4KCItLSIsICZzdHIpIHx8CisgICAgICAgICAgU2tpcFByZWZpeCgiLSIsICZzdHIpIHx8CisgICAgICAgICAgU2tpcFByZWZpeCgiLyIsICZzdHIpKSAmJgorICAgICAgICAgIVNraXBQcmVmaXgoR1RFU1RfRkxBR19QUkVGSVhfICJpbnRlcm5hbF8iLCAmc3RyKSAmJgorICAgICAgICAgKFNraXBQcmVmaXgoR1RFU1RfRkxBR19QUkVGSVhfLCAmc3RyKSB8fAorICAgICAgICAgIFNraXBQcmVmaXgoR1RFU1RfRkxBR19QUkVGSVhfREFTSF8sICZzdHIpKTsKK30KKworLy8gUHJpbnRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgY29kZS1lbmNvZGVkIHRleHQuICBUaGUgZm9sbG93aW5nIGVzY2FwZQorLy8gc2VxdWVuY2VzIGNhbiBiZSB1c2VkIGluIHRoZSBzdHJpbmcgdG8gY29udHJvbCB0aGUgdGV4dCBjb2xvcjoKKy8vCisvLyAgIEBAICAgIHByaW50cyBhIHNpbmdsZSAnQCcgY2hhcmFjdGVyLgorLy8gICBAUiAgICBjaGFuZ2VzIHRoZSBjb2xvciB0byByZWQuCisvLyAgIEBHICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIGdyZWVuLgorLy8gICBAWSAgICBjaGFuZ2VzIHRoZSBjb2xvciB0byB5ZWxsb3cuCisvLyAgIEBEICAgIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgdGVybWluYWwgdGV4dCBjb2xvci4KKy8vCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogV3JpdGUgdGVzdHMgZm9yIHRoaXMgb25jZSB3ZSBhZGQgc3Rkb3V0CisvLyBjYXB0dXJpbmcgdG8gR29vZ2xlIFRlc3QuCitzdGF0aWMgdm9pZCBQcmludENvbG9yRW5jb2RlZChjb25zdCBjaGFyKiBzdHIpIHsKKyAgR1Rlc3RDb2xvciBjb2xvciA9IENPTE9SX0RFRkFVTFQ7ICAvLyBUaGUgY3VycmVudCBjb2xvci4KKworICAvLyBDb25jZXB0dWFsbHksIHdlIHNwbGl0IHRoZSBzdHJpbmcgaW50byBzZWdtZW50cyBkaXZpZGVkIGJ5IGVzY2FwZQorICAvLyBzZXF1ZW5jZXMuICBUaGVuIHdlIHByaW50IG9uZSBzZWdtZW50IGF0IGEgdGltZS4gIEF0IHRoZSBlbmQgb2YKKyAgLy8gZWFjaCBpdGVyYXRpb24sIHRoZSBzdHIgcG9pbnRlciBhZHZhbmNlcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAvLyBuZXh0IHNlZ21lbnQuCisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyKiBwID0gc3RyY2hyKHN0ciwgJ0AnKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICBDb2xvcmVkUHJpbnRmKGNvbG9yLCAiJXMiLCBzdHIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENvbG9yZWRQcmludGYoY29sb3IsICIlcyIsIHN0ZDo6c3RyaW5nKHN0ciwgcCkuY19zdHIoKSk7CisKKyAgICBjb25zdCBjaGFyIGNoID0gcFsxXTsKKyAgICBzdHIgPSBwICsgMjsKKyAgICBpZiAoY2ggPT0gJ0AnKSB7CisgICAgICBDb2xvcmVkUHJpbnRmKGNvbG9yLCAiQCIpOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ0QnKSB7CisgICAgICBjb2xvciA9IENPTE9SX0RFRkFVTFQ7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnUicpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfUkVEOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ0cnKSB7CisgICAgICBjb2xvciA9IENPTE9SX0dSRUVOOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1knKSB7CisgICAgICBjb2xvciA9IENPTE9SX1lFTExPVzsKKyAgICB9IGVsc2UgeworICAgICAgLS1zdHI7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGtDb2xvckVuY29kZWRIZWxwTWVzc2FnZVtdID0KKyJUaGlzIHByb2dyYW0gY29udGFpbnMgdGVzdHMgd3JpdHRlbiB1c2luZyAiIEdURVNUX05BTUVfICIuIFlvdSBjYW4gdXNlIHRoZVxuIgorImZvbGxvd2luZyBjb21tYW5kIGxpbmUgZmxhZ3MgdG8gY29udHJvbCBpdHMgYmVoYXZpb3I6XG4iCisiXG4iCisiVGVzdCBTZWxlY3Rpb246XG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImxpc3RfdGVzdHNARFxuIgorIiAgICAgIExpc3QgdGhlIG5hbWVzIG9mIGFsbCB0ZXN0cyBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlbS4gVGhlIG5hbWUgb2ZcbiIKKyIgICAgICBURVNUKEZvbywgQmFyKSBpcyBcIkZvby5CYXJcIi5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiZmlsdGVyPUBZUE9TVElWRV9QQVRURVJOUyIKKyAgICAiW0BHLUBZTkVHQVRJVkVfUEFUVEVSTlNdQERcbiIKKyIgICAgICBSdW4gb25seSB0aGUgdGVzdHMgd2hvc2UgbmFtZSBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgcGF0dGVybnMgYnV0XG4iCisiICAgICAgbm9uZSBvZiB0aGUgbmVnYXRpdmUgcGF0dGVybnMuICc/JyBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyOyAnKidcbiIKKyIgICAgICBtYXRjaGVzIGFueSBzdWJzdHJpbmc7ICc6JyBzZXBhcmF0ZXMgdHdvIHBhdHRlcm5zLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c0BEXG4iCisiICAgICAgUnVuIGFsbCBkaXNhYmxlZCB0ZXN0cyB0b28uXG4iCisiXG4iCisiVGVzdCBFeGVjdXRpb246XG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInJlcGVhdD1AWVtDT1VOVF1ARFxuIgorIiAgICAgIFJ1biB0aGUgdGVzdHMgcmVwZWF0ZWRseTsgdXNlIGEgbmVnYXRpdmUgY291bnQgdG8gcmVwZWF0IGZvcmV2ZXIuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInNodWZmbGVARFxuIgorIiAgICAgIFJhbmRvbWl6ZSB0ZXN0cycgb3JkZXJzIG9uIGV2ZXJ5IGl0ZXJhdGlvbi5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAicmFuZG9tX3NlZWQ9QFlbTlVNQkVSXUBEXG4iCisiICAgICAgUmFuZG9tIG51bWJlciBzZWVkIHRvIHVzZSBmb3Igc2h1ZmZsaW5nIHRlc3Qgb3JkZXJzIChiZXR3ZWVuIDEgYW5kXG4iCisiICAgICAgOTk5OTksIG9yIDAgdG8gdXNlIGEgc2VlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lKS5cbiIKKyJcbiIKKyJUZXN0IE91dHB1dDpcbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiY29sb3I9QFkoQEd5ZXNAWXxAR25vQFl8QEdhdXRvQFkpQERcbiIKKyIgICAgICBFbmFibGUvZGlzYWJsZSBjb2xvcmVkIG91dHB1dC4gVGhlIGRlZmF1bHQgaXMgQEdhdXRvQEQuXG4iCisiICAtQEctIiBHVEVTVF9GTEFHX1BSRUZJWF8gInByaW50X3RpbWU9MEBEXG4iCisiICAgICAgRG9uJ3QgcHJpbnQgdGhlIGVsYXBzZWQgdGltZSBvZiBlYWNoIHRlc3QuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gIm91dHB1dD14bWxAWVtARzpAWURJUkVDVE9SWV9QQVRIQEciCisgICAgR1RFU1RfUEFUSF9TRVBfICJAWXxARzpAWUZJTEVfUEFUSF1ARFxuIgorIiAgICAgIEdlbmVyYXRlIGFuIFhNTCByZXBvcnQgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSBvciB3aXRoIHRoZSBnaXZlbiBmaWxlXG4iCisiICAgICAgbmFtZS4gQFlGSUxFX1BBVEhARCBkZWZhdWx0cyB0byBAR3Rlc3RfZGV0YWlscy54bWxARC5cbiIKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInN0cmVhbV9yZXN1bHRfdG89QFlIT1NUQEc6QFlQT1JUQERcbiIKKyIgICAgICBTdHJlYW0gdGVzdCByZXN1bHRzIHRvIHRoZSBnaXZlbiBzZXJ2ZXIuXG4iCisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyJcbiIKKyJBc3NlcnRpb24gQmVoYXZpb3I6XG4iCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QgJiYgIUdURVNUX09TX1dJTkRPV1MKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiZGVhdGhfdGVzdF9zdHlsZT1AWShAR2Zhc3RAWXxAR3RocmVhZHNhZmVAWSlARFxuIgorIiAgICAgIFNldCB0aGUgZGVmYXVsdCBkZWF0aCB0ZXN0IHN0eWxlLlxuIgorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhR1RFU1RfT1NfV0lORE9XUworIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJicmVha19vbl9mYWlsdXJlQERcbiIKKyIgICAgICBUdXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvIGRlYnVnZ2VyIGJyZWFrLXBvaW50cy5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAidGhyb3dfb25fZmFpbHVyZUBEXG4iCisiICAgICAgVHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50byBDKysgZXhjZXB0aW9ucy5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiY2F0Y2hfZXhjZXB0aW9ucz0wQERcbiIKKyIgICAgICBEbyBub3QgcmVwb3J0IGV4Y2VwdGlvbnMgYXMgdGVzdCBmYWlsdXJlcy4gSW5zdGVhZCwgYWxsb3cgdGhlbVxuIgorIiAgICAgIHRvIGNyYXNoIHRoZSBwcm9ncmFtIG9yIHRocm93IGEgcG9wLXVwIChvbiBXaW5kb3dzKS5cbiIKKyJcbiIKKyJFeGNlcHQgZm9yIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAibGlzdF90ZXN0c0BELCB5b3UgY2FuIGFsdGVybmF0aXZlbHkgc2V0ICIKKyAgICAidGhlIGNvcnJlc3BvbmRpbmdcbiIKKyJlbnZpcm9ubWVudCB2YXJpYWJsZSBvZiBhIGZsYWcgKGFsbCBsZXR0ZXJzIGluIHVwcGVyLWNhc2UpLiBGb3IgZXhhbXBsZSwgdG9cbiIKKyJkaXNhYmxlIGNvbG9yZWQgdGV4dCBvdXRwdXQsIHlvdSBjYW4gZWl0aGVyIHNwZWNpZnkgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfCisgICAgImNvbG9yPW5vQEQgb3Igc2V0XG4iCisidGhlIEBHIiBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIkNPTE9SQEQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gQEdub0BELlxuIgorIlxuIgorIkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCB0aGUgIiBHVEVTVF9OQU1FXyAiIGRvY3VtZW50YXRpb24gYXRcbiIKKyJARyIgR1RFU1RfUFJPSkVDVF9VUkxfICJARC4gSWYgeW91IGZpbmQgYSBidWcgaW4gIiBHVEVTVF9OQU1FXyAiXG4iCisiKG5vdCBvbmUgaW4geW91ciBvd24gY29kZSBvciB0ZXN0cyksIHBsZWFzZSByZXBvcnQgaXQgdG9cbiIKKyJARzwiIEdURVNUX0RFVl9FTUFJTF8gIj5ARC5cbiI7CisKK2Jvb2wgUGFyc2VHb29nbGVUZXN0RmxhZyhjb25zdCBjaGFyKiBjb25zdCBhcmcpIHsKKyAgcmV0dXJuIFBhcnNlQm9vbEZsYWcoYXJnLCBrQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHx8CisgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0JyZWFrT25GYWlsdXJlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpIHx8CisgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0NhdGNoRXhjZXB0aW9uc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKSB8fAorICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0NvbG9yRmxhZywgJkdURVNUX0ZMQUcoY29sb3IpKSB8fAorICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0RlYXRoVGVzdFN0eWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSkgfHwKKyAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrRGVhdGhUZXN0VXNlRm9yaywKKyAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpIHx8CisgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRmlsdGVyRmxhZywgJkdURVNUX0ZMQUcoZmlsdGVyKSkgfHwKKyAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKSB8fAorICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtMaXN0VGVzdHNGbGFnLCAmR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSkgfHwKKyAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtPdXRwdXRGbGFnLCAmR1RFU1RfRkxBRyhvdXRwdXQpKSB8fAorICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtQcmludFRpbWVGbGFnLCAmR1RFU1RfRkxBRyhwcmludF90aW1lKSkgfHwKKyAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JhbmRvbVNlZWRGbGFnLCAmR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpIHx8CisgICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtSZXBlYXRGbGFnLCAmR1RFU1RfRkxBRyhyZXBlYXQpKSB8fAorICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtTaHVmZmxlRmxhZywgJkdURVNUX0ZMQUcoc2h1ZmZsZSkpIHx8CisgICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtTdGFja1RyYWNlRGVwdGhGbGFnLAorICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpKSB8fAorICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga1N0cmVhbVJlc3VsdFRvRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSkgfHwKKyAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrVGhyb3dPbkZhaWx1cmVGbGFnLAorICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSk7Cit9CisKKyNpZiBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCit2b2lkIExvYWRGbGFnc0Zyb21GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgIEZJTEUqIGZsYWdmaWxlID0gcG9zaXg6OkZPcGVuKHBhdGguY19zdHIoKSwgInIiKTsKKyAgaWYgKCFmbGFnZmlsZSkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLAorICAgICAgICAgICAgR1RFU1RfRkxBRyhmbGFnZmlsZSkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKFJlYWRFbnRpcmVGaWxlKGZsYWdmaWxlKSk7CisgIHBvc2l4OjpGQ2xvc2UoZmxhZ2ZpbGUpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgIFNwbGl0U3RyaW5nKGNvbnRlbnRzLCAnXG4nLCAmbGluZXMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpbmVzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKGxpbmVzW2ldLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIVBhcnNlR29vZ2xlVGVzdEZsYWcobGluZXNbaV0uY19zdHIoKSkpCisgICAgICBnX2hlbHBfZmxhZyA9IHRydWU7CisgIH0KK30KKyNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXworCisvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCisvLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4gIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvciB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgKmFyZ2M7IGkrKykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFyZ19zdHJpbmcgPSBTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSk7CisgICAgY29uc3QgY2hhciogY29uc3QgYXJnID0gYXJnX3N0cmluZy5jX3N0cigpOworCisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlQm9vbEZsYWc7CisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlSW50MzJGbGFnOworICAgIHVzaW5nIGludGVybmFsOjpQYXJzZVN0cmluZ0ZsYWc7CisKKyAgICBib29sIHJlbW92ZV9mbGFnID0gZmFsc2U7CisgICAgaWYgKFBhcnNlR29vZ2xlVGVzdEZsYWcoYXJnKSkgeworICAgICAgcmVtb3ZlX2ZsYWcgPSB0cnVlOworI2lmIEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18KKyAgICB9IGVsc2UgaWYgKFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtGbGFnZmlsZUZsYWcsICZHVEVTVF9GTEFHKGZsYWdmaWxlKSkpIHsKKyAgICAgIExvYWRGbGFnc0Zyb21GaWxlKEdURVNUX0ZMQUcoZmxhZ2ZpbGUpKTsKKyAgICAgIHJlbW92ZV9mbGFnID0gdHJ1ZTsKKyNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXworICAgIH0gZWxzZSBpZiAoYXJnX3N0cmluZyA9PSAiLS1oZWxwIiB8fCBhcmdfc3RyaW5nID09ICItaCIgfHwKKyAgICAgICAgICAgICAgIGFyZ19zdHJpbmcgPT0gIi0/IiB8fCBhcmdfc3RyaW5nID09ICIvPyIgfHwKKyAgICAgICAgICAgICAgIEhhc0dvb2dsZVRlc3RGbGFnUHJlZml4KGFyZykpIHsKKyAgICAgIC8vIEJvdGggaGVscCBmbGFnIGFuZCB1bnJlY29nbml6ZWQgR29vZ2xlIFRlc3QgZmxhZ3MgKGV4Y2x1ZGluZworICAgICAgLy8gaW50ZXJuYWwgb25lcykgdHJpZ2dlciBoZWxwIGRpc3BsYXkuCisgICAgICBnX2hlbHBfZmxhZyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHJlbW92ZV9mbGFnKSB7CisgICAgICAvLyBTaGlmdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcmd2IGxpc3QgbGVmdCBieSBvbmUuICBOb3RlCisgICAgICAvLyB0aGF0IGFyZ3YgaGFzICgqYXJnYyArIDEpIGVsZW1lbnRzLCB0aGUgbGFzdCBvbmUgYWx3YXlzIGJlaW5nCisgICAgICAvLyBOVUxMLiAgVGhlIGZvbGxvd2luZyBsb29wIG1vdmVzIHRoZSB0cmFpbGluZyBOVUxMIGVsZW1lbnQgYXMKKyAgICAgIC8vIHdlbGwuCisgICAgICBmb3IgKGludCBqID0gaTsgaiAhPSAqYXJnYzsgaisrKSB7CisgICAgICAgIGFyZ3Zbal0gPSBhcmd2W2ogKyAxXTsKKyAgICAgIH0KKworICAgICAgLy8gRGVjcmVtZW50cyB0aGUgYXJndW1lbnQgY291bnQuCisgICAgICAoKmFyZ2MpLS07CisKKyAgICAgIC8vIFdlIGFsc28gbmVlZCB0byBkZWNyZW1lbnQgdGhlIGl0ZXJhdG9yIGFzIHdlIGp1c3QgcmVtb3ZlZAorICAgICAgLy8gYW4gZWxlbWVudC4KKyAgICAgIGktLTsKKyAgICB9CisgIH0KKworICBpZiAoZ19oZWxwX2ZsYWcpIHsKKyAgICAvLyBXZSBwcmludCB0aGUgaGVscCBoZXJlIGluc3RlYWQgb2YgaW4gUlVOX0FMTF9URVNUUygpLCBhcyB0aGUKKyAgICAvLyBsYXR0ZXIgbWF5IG5vdCBiZSBjYWxsZWQgYXQgYWxsIGlmIHRoZSB1c2VyIGlzIHVzaW5nIEdvb2dsZQorICAgIC8vIFRlc3Qgd2l0aCBhbm90aGVyIHRlc3RpbmcgZnJhbWV3b3JrLgorICAgIFByaW50Q29sb3JFbmNvZGVkKGtDb2xvckVuY29kZWRIZWxwTWVzc2FnZSk7CisgIH0KK30KKworLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZworLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuCit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7Cit9Cit2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7CisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7Cit9CisKKy8vIFRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBJbml0R29vZ2xlVGVzdCgpLgorLy8KKy8vIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yCisvLyB3Y2hhcl90LgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgordm9pZCBJbml0R29vZ2xlVGVzdEltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBydW4gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUgdHdpY2UuCisgIGlmIChHVGVzdElzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuOworCisgIGlmICgqYXJnYyA8PSAwKSByZXR1cm47CisKKyAgZ19hcmd2cy5jbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSAhPSAqYXJnYzsgaSsrKSB7CisgICAgZ19hcmd2cy5wdXNoX2JhY2soU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pKTsKKyAgfQorCisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShhcmdjLCBhcmd2KTsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPlBvc3RGbGFnUGFyc2luZ0luaXQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEluaXRpYWxpemVzIEdvb2dsZSBUZXN0LiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZworLy8gUlVOX0FMTF9URVNUUygpLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIGEgY29tbWFuZCBsaW5lIGZvciB0aGUKKy8vIGZsYWdzIHRoYXQgR29vZ2xlIFRlc3QgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIFRlc3QgZmxhZyBpcworLy8gc2VlbiwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KKy8vCisvLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgVGVzdCBmbGFnIHZhcmlhYmxlcyBhcmUKKy8vIHVwZGF0ZWQuCisvLworLy8gQ2FsbGluZyB0aGUgZnVuY3Rpb24gZm9yIHRoZSBzZWNvbmQgdGltZSBoYXMgbm8gdXNlci12aXNpYmxlIGVmZmVjdC4KK3ZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCBjaGFyKiogYXJndikgeworI2lmIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKQorICBHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8oYXJnYywgYXJndik7CisjZWxzZSAgLy8gZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCisgIGludGVybmFsOjpJbml0R29vZ2xlVGVzdEltcGwoYXJnYywgYXJndik7CisjZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKQorfQorCisvLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluCisvLyBVTklDT0RFIG1vZGUuCit2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsKKyNpZiBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKKyAgR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKGFyZ2MsIGFyZ3YpOworI2Vsc2UgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKQorICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOworI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3RfbWFpbi5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9zcmMvZ3Rlc3RfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzAyODIyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3NyYy9ndGVzdF9tYWluLmNjCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCitHVEVTVF9BUElfIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBwcmludGYoIlJ1bm5pbmcgbWFpbigpIGZyb20gZ3Rlc3RfbWFpbi5jY1xuIik7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfZXhfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBhMTNkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdF9leF90ZXN0LmNjCkBAIC0wLDAgKzEsOTMgQEAKKy8vIENvcHlyaWdodCAyMDEwLCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGVzdHMgdGhhdCB2ZXJpZnkgaW50ZXJhY3Rpb24gb2YgZXhjZXB0aW9ucyBhbmQgZGVhdGggdGVzdHMuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyMgaWYgR1RFU1RfSEFTX1NFSAorIyAgaW5jbHVkZSA8d2luZG93cy5oPiAgICAgICAgICAvLyBGb3IgUmFpc2VFeGNlcHRpb24oKS4KKyMgZW5kaWYKKworIyBpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworIyBpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisjICBpbmNsdWRlIDxleGNlcHRpb24+ICAvLyBGb3Igc3RkOjpleGNlcHRpb24uCisKKy8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgcmVwb3J0IHRocm93biBleGNlcHRpb25zIGFzIGZhaWx1cmVzIGFuZCB0aGF0IHRoZQorLy8gZXhjZXB0aW9ucyBkbyBub3QgZXNjYXBlIGRlYXRoIHRlc3QgbWFjcm9zLgorVEVTVChDeHhFeGNlcHRpb25EZWF0aFRlc3QsIEV4Y2VwdGlvbklzRmFpbHVyZSkgeworICB0cnkgeworICAgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSCh0aHJvdyAxLCAiIiksICJ0aHJldyBhbiBleGNlcHRpb24iKTsKKyAgfSBjYXRjaCAoLi4uKSB7ICAvLyBOT0xJTlQKKyAgICBGQUlMKCkgPDwgIkFuIGV4Y2VwdGlvbiBlc2NhcGVkIGEgZGVhdGggdGVzdCBtYWNybyBpbnZvY2F0aW9uICIKKyAgICAgICAgICAgPDwgIndpdGggY2F0Y2hfZXhjZXB0aW9ucyAiCisgICAgICAgICAgIDw8ICh0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisgIH0KK30KKworY2xhc3MgVGVzdEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7CisgcHVibGljOgorICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuICJleGNlcHRpb25hbCBtZXNzYWdlIjsgfQorfTsKKworVEVTVChDeHhFeGNlcHRpb25EZWF0aFRlc3QsIFByaW50c01lc3NhZ2VGb3JTdGRFeGNlcHRpb25zKSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGlzIHF1b3RlZCBpbiB0aGUgZmFpbHVyZSB0ZXh0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgodGhyb3cgVGVzdEV4Y2VwdGlvbigpLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb25hbCBtZXNzYWdlIik7CisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGxvY2F0aW9uIGlzIG1lbnRpb25lZCBpbiB0aGUgZmFpbHVyZSB0ZXh0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgodGhyb3cgVGVzdEV4Y2VwdGlvbigpLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJndGVzdC1kZWF0aC10ZXN0X2V4X3Rlc3QuY2MiKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKyMgaWYgR1RFU1RfSEFTX1NFSAorLy8gVGVzdHMgdGhhdCBlbmFibGluZyBpbnRlcmNlcHRpb24gb2YgU0VIIGV4Y2VwdGlvbnMgd2l0aCB0aGUKKy8vIGNhdGNoX2V4Y2VwdGlvbnMgZmxhZyBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBTRUggZXhjZXB0aW9ucyBiZWluZworLy8gdHJlYXRlZCBhcyBkZWF0aCBieSBkZWF0aCB0ZXN0cy4KK1RFU1QoU2VoRXhjZXB0aW9uRGVhc1Rlc3QsIENhdGNoRXhjZXB0aW9uc0RvZXNOb3RJbnRlcmZlcmUpIHsKKyAgRVhQRUNUX0RFQVRIKFJhaXNlRXhjZXB0aW9uKDQyLCAweDAsIDAsIE5VTEwpLCAiIikKKyAgICAgIDw8ICJ3aXRoIGNhdGNoX2V4Y2VwdGlvbnMgIgorICAgICAgPDwgKHRlc3Rpbmc6OkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKK30KKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gR1RFU1RfRU5BQkxFX0NBVENIX0VYQ0VQVElPTlNfICE9IDA7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1kZWF0aC10ZXN0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0YTNkMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LWRlYXRoLXRlc3RfdGVzdC5jYwpAQCAtMCwwICsxLDE0MjcgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGVzdHMgZm9yIGRlYXRoIHRlc3RzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIKKwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWU7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKyMgIGluY2x1ZGUgPGRpcmVjdC5oPiAgICAgICAgICAvLyBGb3IgY2hkaXIoKS4KKyMgZWxzZQorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjICBpbmNsdWRlIDxzeXMvd2FpdC5oPiAgICAgICAgLy8gRm9yIHdhaXRwaWQuCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjIGluY2x1ZGUgPHNpZ25hbC5oPgorIyBpbmNsdWRlIDxzdGRpby5oPgorCisjIGlmIEdURVNUX09TX0xJTlVYCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworIyBpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyMgZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjIGluY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyMgdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSBwb3NpeCA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OworCit1c2luZyB0ZXN0aW5nOjpNZXNzYWdlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZpbGVQYXRoOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldExhc3RFcnJub0Rlc2NyaXB0aW9uOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbDsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbkRlYXRoVGVzdENoaWxkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlBhcnNlTmF0dXJhbE51bWJlcjsKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBoZWxwZXIgY2xhc3Mgd2hvc2Ugb2JqZWN0cyByZXBsYWNlIHRoZSBkZWF0aCB0ZXN0IGZhY3RvcnkgZm9yIGEKKy8vIHNpbmdsZSBVbml0VGVzdCBvYmplY3QgZHVyaW5nIHRoZWlyIGxpZmV0aW1lcy4KK2NsYXNzIFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KERlYXRoVGVzdEZhY3RvcnkqIG5ld19mYWN0b3J5KQorICAgICAgOiB1bml0X3Rlc3RfaW1wbF8oR2V0VW5pdFRlc3RJbXBsKCkpIHsKKyAgICBvbGRfZmFjdG9yeV8gPSB1bml0X3Rlc3RfaW1wbF8tPmRlYXRoX3Rlc3RfZmFjdG9yeV8ucmVsZWFzZSgpOworICAgIHVuaXRfdGVzdF9pbXBsXy0+ZGVhdGhfdGVzdF9mYWN0b3J5Xy5yZXNldChuZXdfZmFjdG9yeSk7CisgIH0KKworICB+UmVwbGFjZURlYXRoVGVzdEZhY3RvcnkoKSB7CisgICAgdW5pdF90ZXN0X2ltcGxfLT5kZWF0aF90ZXN0X2ZhY3RvcnlfLnJlbGVhc2UoKTsKKyAgICB1bml0X3Rlc3RfaW1wbF8tPmRlYXRoX3Rlc3RfZmFjdG9yeV8ucmVzZXQob2xkX2ZhY3RvcnlfKTsKKyAgfQorIHByaXZhdGU6CisgIC8vIFByZXZlbnRzIGNvcHlpbmcgUmVwbGFjZURlYXRoVGVzdEZhY3Rvcnkgb2JqZWN0cy4KKyAgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkoY29uc3QgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkmKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUmVwbGFjZURlYXRoVGVzdEZhY3RvcnkmKTsKKworICBVbml0VGVzdEltcGwqIHVuaXRfdGVzdF9pbXBsXzsKKyAgRGVhdGhUZXN0RmFjdG9yeSogb2xkX2ZhY3RvcnlfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCit2b2lkIERpZVdpdGhNZXNzYWdlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgZnByaW50ZihzdGRlcnIsICIlcyIsIG1lc3NhZ2UuY19zdHIoKSk7CisgIGZmbHVzaChzdGRlcnIpOyAgLy8gTWFrZSBzdXJlIHRoZSB0ZXh0IGlzIHByaW50ZWQgYmVmb3JlIHRoZSBwcm9jZXNzIGV4aXRzLgorCisgIC8vIFdlIGNhbGwgX2V4aXQoKSBpbnN0ZWFkIG9mIGV4aXQoKSwgYXMgdGhlIGZvcm1lciBpcyBhIGRpcmVjdAorICAvLyBzeXN0ZW0gY2FsbCBhbmQgdGh1cyBzYWZlciBpbiB0aGUgcHJlc2VuY2Ugb2YgdGhyZWFkcy4gIGV4aXQoKQorICAvLyB3aWxsIGludm9rZSB1c2VyLWRlZmluZWQgZXhpdC1ob29rcywgd2hpY2ggbWF5IGRvIGRhbmdlcm91cworICAvLyB0aGluZ3MgdGhhdCBjb25mbGljdCB3aXRoIGRlYXRoIHRlc3RzLgorICAvLworICAvLyBTb21lIGNvbXBpbGVycyBjYW4gcmVjb2duaXplIHRoYXQgX2V4aXQoKSBuZXZlciByZXR1cm5zIGFuZCBpc3N1ZSB0aGUKKyAgLy8gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgZm9yIGNvZGUgZm9sbG93aW5nIHRoaXMgZnVuY3Rpb24sIHVubGVzcworICAvLyBmb29sZWQgYnkgYSBmYWtlIGNvbmRpdGlvbi4KKyAgaWYgKEFsd2F5c1RydWUoKSkKKyAgICBfZXhpdCgxKTsKK30KKwordm9pZCBEaWVJbnNpZGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgZnVuY3Rpb24pIHsKKyAgRGllV2l0aE1lc3NhZ2UoImRlYXRoIGluc2lkZSAiICsgZnVuY3Rpb24gKyAiKCkuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgd29yay4KKworY2xhc3MgVGVzdEZvckRlYXRoVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFRlc3RGb3JEZWF0aFRlc3QoKSA6IG9yaWdpbmFsX2Rpcl8oRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSkge30KKworICB2aXJ0dWFsIH5UZXN0Rm9yRGVhdGhUZXN0KCkgeworICAgIHBvc2l4OjpDaERpcihvcmlnaW5hbF9kaXJfLmNfc3RyKCkpOworICB9CisKKyAgLy8gQSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIHRoYXQncyBleHBlY3RlZCB0byBkaWUuCisgIHN0YXRpYyB2b2lkIFN0YXRpY01lbWJlckZ1bmN0aW9uKCkgeyBEaWVJbnNpZGUoIlN0YXRpY01lbWJlckZ1bmN0aW9uIik7IH0KKworICAvLyBBIG1ldGhvZCBvZiB0aGUgdGVzdCBmaXh0dXJlIHRoYXQgbWF5IGRpZS4KKyAgdm9pZCBNZW1iZXJGdW5jdGlvbigpIHsKKyAgICBpZiAoc2hvdWxkX2RpZV8pCisgICAgICBEaWVJbnNpZGUoIk1lbWJlckZ1bmN0aW9uIik7CisgIH0KKworICAvLyBUcnVlIGlmZiBNZW1iZXJGdW5jdGlvbigpIHNob3VsZCBkaWUuCisgIGJvb2wgc2hvdWxkX2RpZV87CisgIGNvbnN0IEZpbGVQYXRoIG9yaWdpbmFsX2Rpcl87Cit9OworCisvLyBBIGNsYXNzIHdpdGggYSBtZW1iZXIgZnVuY3Rpb24gdGhhdCBtYXkgZGllLgorY2xhc3MgTWF5RGllIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE1heURpZShib29sIHNob3VsZF9kaWUpIDogc2hvdWxkX2RpZV8oc2hvdWxkX2RpZSkge30KKworICAvLyBBIG1lbWJlciBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCisgIHZvaWQgTWVtYmVyRnVuY3Rpb24oKSBjb25zdCB7CisgICAgaWYgKHNob3VsZF9kaWVfKQorICAgICAgRGllSW5zaWRlKCJNYXlEaWU6Ok1lbWJlckZ1bmN0aW9uIik7CisgIH0KKworIHByaXZhdGU6CisgIC8vIFRydWUgaWZmIE1lbWJlckZ1bmN0aW9uKCkgc2hvdWxkIGRpZS4KKyAgYm9vbCBzaG91bGRfZGllXzsKK307CisKKy8vIEEgZ2xvYmFsIGZ1bmN0aW9uIHRoYXQncyBleHBlY3RlZCB0byBkaWUuCit2b2lkIEdsb2JhbEZ1bmN0aW9uKCkgeyBEaWVJbnNpZGUoIkdsb2JhbEZ1bmN0aW9uIik7IH0KKworLy8gQSBub24tdm9pZCBmdW5jdGlvbiB0aGF0J3MgZXhwZWN0ZWQgdG8gZGllLgoraW50IE5vblZvaWRGdW5jdGlvbigpIHsKKyAgRGllSW5zaWRlKCJOb25Wb2lkRnVuY3Rpb24iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEEgdW5hcnkgZnVuY3Rpb24gdGhhdCBtYXkgZGllLgordm9pZCBEaWVJZihib29sIHNob3VsZF9kaWUpIHsKKyAgaWYgKHNob3VsZF9kaWUpCisgICAgRGllSW5zaWRlKCJEaWVJZiIpOworfQorCisvLyBBIGJpbmFyeSBmdW5jdGlvbiB0aGF0IG1heSBkaWUuCitib29sIERpZUlmTGVzc1RoYW4oaW50IHgsIGludCB5KSB7CisgIGlmICh4IDwgeSkgeworICAgIERpZUluc2lkZSgiRGllSWZMZXNzVGhhbiIpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBUZXN0cyB0aGF0IEFTU0VSVF9ERUFUSCBjYW4gYmUgdXNlZCBvdXRzaWRlIGEgVEVTVCwgVEVTVF9GLCBvciB0ZXN0IGZpeHR1cmUuCit2b2lkIERlYXRoVGVzdFN1YnJvdXRpbmUoKSB7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCAiZGVhdGguKkdsb2JhbEZ1bmN0aW9uIik7CisgIEFTU0VSVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCAiZGVhdGguKkdsb2JhbEZ1bmN0aW9uIik7Cit9CisKKy8vIERlYXRoIGluIGRiZywgbm90IG9wdC4KK2ludCBEaWVJbkRlYnVnRWxzZTEyKGludCogc2lkZWVmZmVjdCkgeworICBpZiAoc2lkZWVmZmVjdCkgKnNpZGVlZmZlY3QgPSAxMjsKKworIyBpZm5kZWYgTkRFQlVHCisKKyAgRGllSW5zaWRlKCJEaWVJbkRlYnVnRWxzZTEyIik7CisKKyMgZW5kaWYgIC8vIE5ERUJVRworCisgIHJldHVybiAxMjsKK30KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIHRoZSBFeGl0ZWRXaXRoQ29kZSBwcmVkaWNhdGUuCitURVNUKEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0LCBFeGl0ZWRXaXRoQ29kZSkgeworICAvLyBPbiBXaW5kb3dzLCB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpcyB0aGUgc2FtZSBhcyBpdHMgZXhpdCBzdGF0dXMsCisgIC8vIHNvIHRoZSBwcmVkaWNhdGUganVzdCBjb21wYXJlcyB0aGUgaXRzIGlucHV0IHdpdGggaXRzIHBhcmFtZXRlci4KKyAgRVhQRUNUX1RSVUUodGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCkoMCkpOworICBFWFBFQ1RfVFJVRSh0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSgxKSk7CisgIEVYUEVDVF9UUlVFKHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDQyKSg0MikpOworICBFWFBFQ1RfRkFMU0UodGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCkoMSkpOworICBFWFBFQ1RfRkFMU0UodGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMSkoMCkpOworfQorCisjIGVsc2UKKworLy8gUmV0dXJucyB0aGUgZXhpdCBzdGF0dXMgb2YgYSBwcm9jZXNzIHRoYXQgY2FsbHMgX2V4aXQoMikgd2l0aCBhCisvLyBnaXZlbiBleGl0IGNvZGUuICBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUKKy8vIEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0IHRlc3Qgc3VpdGUuCitzdGF0aWMgaW50IE5vcm1hbEV4aXRTdGF0dXMoaW50IGV4aXRfY29kZSkgeworICBwaWRfdCBjaGlsZF9waWQgPSBmb3JrKCk7CisgIGlmIChjaGlsZF9waWQgPT0gMCkgeworICAgIF9leGl0KGV4aXRfY29kZSk7CisgIH0KKyAgaW50IHN0YXR1czsKKyAgd2FpdHBpZChjaGlsZF9waWQsICZzdGF0dXMsIDApOworICByZXR1cm4gc3RhdHVzOworfQorCisvLyBSZXR1cm5zIHRoZSBleGl0IHN0YXR1cyBvZiBhIHByb2Nlc3MgdGhhdCByYWlzZXMgYSBnaXZlbiBzaWduYWwuCisvLyBJZiB0aGUgc2lnbmFsIGRvZXMgbm90IGNhdXNlIHRoZSBwcm9jZXNzIHRvIGRpZSwgdGhlbiBpdCByZXR1cm5zCisvLyBpbnN0ZWFkIHRoZSBleGl0IHN0YXR1cyBvZiBhIHByb2Nlc3MgdGhhdCBleGl0cyBub3JtYWxseSB3aXRoIGV4aXQKKy8vIGNvZGUgMS4gIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBFeGl0U3RhdHVzUHJlZGljYXRlVGVzdAorLy8gdGVzdCBzdWl0ZS4KK3N0YXRpYyBpbnQgS2lsbGVkRXhpdFN0YXR1cyhpbnQgc2lnbnVtKSB7CisgIHBpZF90IGNoaWxkX3BpZCA9IGZvcmsoKTsKKyAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgcmFpc2Uoc2lnbnVtKTsKKyAgICBfZXhpdCgxKTsKKyAgfQorICBpbnQgc3RhdHVzOworICB3YWl0cGlkKGNoaWxkX3BpZCwgJnN0YXR1cywgMCk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIFRlc3RzIHRoZSBFeGl0ZWRXaXRoQ29kZSBwcmVkaWNhdGUuCitURVNUKEV4aXRTdGF0dXNQcmVkaWNhdGVUZXN0LCBFeGl0ZWRXaXRoQ29kZSkgeworICBjb25zdCBpbnQgc3RhdHVzMCAgPSBOb3JtYWxFeGl0U3RhdHVzKDApOworICBjb25zdCBpbnQgc3RhdHVzMSAgPSBOb3JtYWxFeGl0U3RhdHVzKDEpOworICBjb25zdCBpbnQgc3RhdHVzNDIgPSBOb3JtYWxFeGl0U3RhdHVzKDQyKTsKKyAgY29uc3QgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUgcHJlZDAoMCk7CisgIGNvbnN0IHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlIHByZWQxKDEpOworICBjb25zdCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSBwcmVkNDIoNDIpOworICBFWFBFQ1RfUFJFRDEocHJlZDAsICBzdGF0dXMwKTsKKyAgRVhQRUNUX1BSRUQxKHByZWQxLCAgc3RhdHVzMSk7CisgIEVYUEVDVF9QUkVEMShwcmVkNDIsIHN0YXR1czQyKTsKKyAgRVhQRUNUX0ZBTFNFKHByZWQwKHN0YXR1czEpKTsKKyAgRVhQRUNUX0ZBTFNFKHByZWQ0MihzdGF0dXMwKSk7CisgIEVYUEVDVF9GQUxTRShwcmVkMShzdGF0dXM0MikpOworfQorCisvLyBUZXN0cyB0aGUgS2lsbGVkQnlTaWduYWwgcHJlZGljYXRlLgorVEVTVChFeGl0U3RhdHVzUHJlZGljYXRlVGVzdCwgS2lsbGVkQnlTaWduYWwpIHsKKyAgY29uc3QgaW50IHN0YXR1c19zZWd2ID0gS2lsbGVkRXhpdFN0YXR1cyhTSUdTRUdWKTsKKyAgY29uc3QgaW50IHN0YXR1c19raWxsID0gS2lsbGVkRXhpdFN0YXR1cyhTSUdLSUxMKTsKKyAgY29uc3QgdGVzdGluZzo6S2lsbGVkQnlTaWduYWwgcHJlZF9zZWd2KFNJR1NFR1YpOworICBjb25zdCB0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbCBwcmVkX2tpbGwoU0lHS0lMTCk7CisgIEVYUEVDVF9QUkVEMShwcmVkX3NlZ3YsIHN0YXR1c19zZWd2KTsKKyAgRVhQRUNUX1BSRUQxKHByZWRfa2lsbCwgc3RhdHVzX2tpbGwpOworICBFWFBFQ1RfRkFMU0UocHJlZF9zZWd2KHN0YXR1c19raWxsKSk7CisgIEVYUEVDVF9GQUxTRShwcmVkX2tpbGwoc3RhdHVzX3NlZ3YpKTsKK30KKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyB0aGF0IHRoZSBkZWF0aCB0ZXN0IG1hY3JvcyBleHBhbmQgdG8gY29kZSB3aGljaCBtYXkgb3IgbWF5IG5vdAorLy8gYmUgZm9sbG93ZWQgYnkgb3BlcmF0b3I8PCwgYW5kIHRoYXQgaW4gZWl0aGVyIGNhc2UgdGhlIGNvbXBsZXRlIHRleHQKKy8vIGNvbXByaXNlcyBvbmx5IGEgc2luZ2xlIEMrKyBzdGF0ZW1lbnQuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgU2luZ2xlU3RhdGVtZW50KSB7CisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIC8vIFRoaXMgd291bGQgZmFpbCBpZiBleGVjdXRlZDsgdGhpcyBpcyBhIGNvbXBpbGF0aW9uIHRlc3Qgb25seQorICAgIEFTU0VSVF9ERUFUSChyZXR1cm4sICIiKTsKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOworICBlbHNlCisgICAgLy8gVGhpcyBlbXB0eSAiZWxzZSIgYnJhbmNoIGlzIG1lYW50IHRvIGVuc3VyZSB0aGF0IEVYUEVDVF9ERUFUSAorICAgIC8vIGRvZXNuJ3QgZXhwYW5kIGludG8gYW4gImlmIiBzdGF0ZW1lbnQgd2l0aG91dCBhbiAiZWxzZSIKKyAgICA7CisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgQVNTRVJUX0RFQVRIKHJldHVybiwgIiIpIDw8ICJkaWQgbm90IGRpZSI7CisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgOworICBlbHNlCisgICAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIikgPDwgMSA8PCAyIDw8IDM7Cit9CisKK3ZvaWQgRGllV2l0aEVtYmVkZGVkTnVsKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIkhlbGxvJWNteSBudWxsIHdvcmxkLlxuIiwgJ1wwJyk7CisgIGZmbHVzaChzdGRlcnIpOworICBfZXhpdCgxKTsKK30KKworIyBpZiBHVEVTVF9VU0VTX1BDUkUKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQVRIIGFuZCBBU1NFUlRfREVBVEggd29yayB3aGVuIHRoZSBlcnJvcgorLy8gbWVzc2FnZSBoYXMgYSBOVUwgY2hhcmFjdGVyIGluIGl0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEVtYmVkZGVkTnVsSW5NZXNzYWdlKSB7CisgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiA8cmVnZXguaD4gZG9lc24ndCBzdXBwb3J0IG1hdGNoaW5nIHN0cmluZ3MKKyAgLy8gd2l0aCBlbWJlZGRlZCBOVUwgY2hhcmFjdGVycyAtIGZpbmQgYSB3YXkgdG8gd29ya2Fyb3VuZCBpdC4KKyAgRVhQRUNUX0RFQVRIKERpZVdpdGhFbWJlZGRlZE51bCgpLCAibXkgbnVsbCB3b3JsZCIpOworICBBU1NFUlRfREVBVEgoRGllV2l0aEVtYmVkZGVkTnVsKCksICJteSBudWxsIHdvcmxkIik7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9VU0VTX1BDUkUKKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0IG1hY3JvcyBleHBhbmQgdG8gY29kZSB3aGljaCBpbnRlcmFjdHMgd2VsbCB3aXRoIHN3aXRjaAorLy8gc3RhdGVtZW50cy4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBTd2l0Y2hTdGF0ZW1lbnQpIHsKKyAgLy8gTWljcm9zb2Z0IGNvbXBpbGVyIHVzdWFsbHkgY29tcGxhaW5zIGFib3V0IHN3aXRjaCBzdGF0ZW1lbnRzIHdpdGhvdXQKKyAgLy8gY2FzZSBsYWJlbHMuIFdlIHN1cHByZXNzIHRoYXQgd2FybmluZyBmb3IgdGhpcyB0ZXN0LgorICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0MDY1KQorCisgIHN3aXRjaCAoMCkKKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUX0RFQVRIKF9leGl0KDEpLCAiIikgPDwgImV4aXQgaW4gZGVmYXVsdCBzd2l0Y2ggaGFuZGxlciI7CisKKyAgc3dpdGNoICgwKQorICAgIGNhc2UgMDoKKyAgICAgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJleGl0IGluIHN3aXRjaCBjYXNlIjsKKworICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKK30KKworLy8gVGVzdHMgdGhhdCBhIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gYSAiZmFzdCIgc3R5bGUKKy8vIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgU3RhdGljTWVtYmVyRnVuY3Rpb25GYXN0U3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgQVNTRVJUX0RFQVRIKFN0YXRpY01lbWJlckZ1bmN0aW9uKCksICJkZWF0aC4qU3RhdGljTWVtYmVyIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBtZXRob2Qgb2YgdGhlIHRlc3QgZml4dHVyZSBjYW4gYmUgdXNlZCBpbiBhICJmYXN0IgorLy8gc3R5bGUgZGVhdGggdGVzdC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBNZW1iZXJGdW5jdGlvbkZhc3RTdHlsZSkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBzaG91bGRfZGllXyA9IHRydWU7CisgIEVYUEVDVF9ERUFUSChNZW1iZXJGdW5jdGlvbigpLCAiaW5zaWRlLipNZW1iZXJGdW5jdGlvbiIpOworfQorCit2b2lkIENoYW5nZVRvUm9vdERpcigpIHsgcG9zaXg6OkNoRGlyKEdURVNUX1BBVEhfU0VQXyk7IH0KKworLy8gVGVzdHMgdGhhdCBkZWF0aCB0ZXN0cyB3b3JrIGV2ZW4gaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGhhcyBiZWVuCisvLyBjaGFuZ2VkLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEZhc3REZWF0aFRlc3RJbkNoYW5nZWREaXIpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKworICBDaGFuZ2VUb1Jvb3REaXIoKTsKKyAgRVhQRUNUX0VYSVQoX2V4aXQoMSksIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDEpLCAiIik7CisKKyAgQ2hhbmdlVG9Sb290RGlyKCk7CisgIEFTU0VSVF9ERUFUSChfZXhpdCgxKSwgIiIpOworfQorCisjIGlmIEdURVNUX09TX0xJTlVYCit2b2lkIFNpZ3Byb2ZBY3Rpb24oaW50LCBzaWdpbmZvX3QqLCB2b2lkKikgeyAvKiBubyBvcCAqLyB9CisKKy8vIFNldHMgU0lHUFJPRiBhY3Rpb24gYW5kIElUSU1FUl9QUk9GIHRpbWVyIChpbnRlcnZhbDogMW1zKS4KK3ZvaWQgU2V0U2lncHJvZkFjdGlvbkFuZFRpbWVyKCkgeworICBzdHJ1Y3QgaXRpbWVydmFsIHRpbWVyOworICB0aW1lci5pdF9pbnRlcnZhbC50dl9zZWMgPSAwOworICB0aW1lci5pdF9pbnRlcnZhbC50dl91c2VjID0gMTsKKyAgdGltZXIuaXRfdmFsdWUgPSB0aW1lci5pdF9pbnRlcnZhbDsKKyAgQVNTRVJUX0VRKDAsIHNldGl0aW1lcihJVElNRVJfUFJPRiwgJnRpbWVyLCBOVUxMKSk7CisgIHN0cnVjdCBzaWdhY3Rpb24gc2lnbmFsX2FjdGlvbjsKKyAgbWVtc2V0KCZzaWduYWxfYWN0aW9uLCAwLCBzaXplb2Yoc2lnbmFsX2FjdGlvbikpOworICBzaWdlbXB0eXNldCgmc2lnbmFsX2FjdGlvbi5zYV9tYXNrKTsKKyAgc2lnbmFsX2FjdGlvbi5zYV9zaWdhY3Rpb24gPSBTaWdwcm9mQWN0aW9uOworICBzaWduYWxfYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTVEFSVCB8IFNBX1NJR0lORk87CisgIEFTU0VSVF9FUSgwLCBzaWdhY3Rpb24oU0lHUFJPRiwgJnNpZ25hbF9hY3Rpb24sIE5VTEwpKTsKK30KKworLy8gRGlzYWJsZXMgSVRJTUVSX1BST0YgdGltZXIgYW5kIGlnbm9yZXMgU0lHUFJPRiBzaWduYWwuCit2b2lkIERpc2FibGVTaWdwcm9mQWN0aW9uQW5kVGltZXIoc3RydWN0IHNpZ2FjdGlvbiogb2xkX3NpZ25hbF9hY3Rpb24pIHsKKyAgc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKKyAgdGltZXIuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKyAgdGltZXIuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDA7CisgIHRpbWVyLml0X3ZhbHVlID0gdGltZXIuaXRfaW50ZXJ2YWw7CisgIEFTU0VSVF9FUSgwLCBzZXRpdGltZXIoSVRJTUVSX1BST0YsICZ0aW1lciwgTlVMTCkpOworICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ25hbF9hY3Rpb247CisgIG1lbXNldCgmc2lnbmFsX2FjdGlvbiwgMCwgc2l6ZW9mKHNpZ25hbF9hY3Rpb24pKTsKKyAgc2lnZW1wdHlzZXQoJnNpZ25hbF9hY3Rpb24uc2FfbWFzayk7CisgIHNpZ25hbF9hY3Rpb24uc2FfaGFuZGxlciA9IFNJR19JR047CisgIEFTU0VSVF9FUSgwLCBzaWdhY3Rpb24oU0lHUFJPRiwgJnNpZ25hbF9hY3Rpb24sIG9sZF9zaWduYWxfYWN0aW9uKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgd29yayB3aGVuIFNJR1BST0YgaGFuZGxlciBhbmQgdGltZXIgYXJlIHNldC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBGYXN0U2lncHJvZkFjdGlvblNldCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBTZXRTaWdwcm9mQWN0aW9uQW5kVGltZXIoKTsKKyAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7CisgIHN0cnVjdCBzaWdhY3Rpb24gb2xkX3NpZ25hbF9hY3Rpb247CisgIERpc2FibGVTaWdwcm9mQWN0aW9uQW5kVGltZXIoJm9sZF9zaWduYWxfYWN0aW9uKTsKKyAgRVhQRUNUX1RSVUUob2xkX3NpZ25hbF9hY3Rpb24uc2Ffc2lnYWN0aW9uID09IFNpZ3Byb2ZBY3Rpb24pOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGhyZWFkU2FmZVNpZ3Byb2ZBY3Rpb25TZXQpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgU2V0U2lncHJvZkFjdGlvbkFuZFRpbWVyKCk7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpOworICBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZF9zaWduYWxfYWN0aW9uOworICBEaXNhYmxlU2lncHJvZkFjdGlvbkFuZFRpbWVyKCZvbGRfc2lnbmFsX2FjdGlvbik7CisgIEVYUEVDVF9UUlVFKG9sZF9zaWduYWxfYWN0aW9uLnNhX3NpZ2FjdGlvbiA9PSBTaWdwcm9mQWN0aW9uKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCisKKy8vIFJlcGVhdHMgYSByZXByZXNlbnRhdGl2ZSBzYW1wbGUgb2YgZGVhdGggdGVzdHMgaW4gdGhlICJ0aHJlYWRzYWZlIiBzdHlsZToKKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFN0YXRpY01lbWJlckZ1bmN0aW9uVGhyZWFkc2FmZVN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIEFTU0VSVF9ERUFUSChTdGF0aWNNZW1iZXJGdW5jdGlvbigpLCAiZGVhdGguKlN0YXRpY01lbWJlciIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWVtYmVyRnVuY3Rpb25UaHJlYWRzYWZlU3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgc2hvdWxkX2RpZV8gPSB0cnVlOworICBFWFBFQ1RfREVBVEgoTWVtYmVyRnVuY3Rpb24oKSwgImluc2lkZS4qTWVtYmVyRnVuY3Rpb24iKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFRocmVhZHNhZmVEZWF0aFRlc3RJbkxvb3ApIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkKKyAgICBFWFBFQ1RfRVhJVChfZXhpdChpKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoaSksICIiKSA8PCAiOiBpID0gIiA8PCBpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgVGhyZWFkc2FmZURlYXRoVGVzdEluQ2hhbmdlZERpcikgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOworCisgIENoYW5nZVRvUm9vdERpcigpOworICBFWFBFQ1RfRVhJVChfZXhpdCgxKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMSksICIiKTsKKworICBDaGFuZ2VUb1Jvb3REaXIoKTsKKyAgQVNTRVJUX0RFQVRIKF9leGl0KDEpLCAiIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBNaXhlZFN0eWxlcykgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gInRocmVhZHNhZmUiOworICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJmYXN0IjsKKyAgRVhQRUNUX0RFQVRIKF9leGl0KDEpLCAiIik7Cit9CisKKyMgaWYgR1RFU1RfSEFTX0NMT05FICYmIEdURVNUX0hBU19QVEhSRUFECisKK25hbWVzcGFjZSB7CisKK2Jvb2wgcHRocmVhZF9mbGFnOworCit2b2lkIFNldFB0aHJlYWRGbGFnKCkgeworICBwdGhyZWFkX2ZsYWcgPSB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERvZXNOb3RFeGVjdXRlQXRmb3JrSG9va3MpIHsKKyAgaWYgKCF0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspKSB7CisgICAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgICBwdGhyZWFkX2ZsYWcgPSBmYWxzZTsKKyAgICBBU1NFUlRfRVEoMCwgcHRocmVhZF9hdGZvcmsoJlNldFB0aHJlYWRGbGFnLCBOVUxMLCBOVUxMKSk7CisgICAgQVNTRVJUX0RFQVRIKF9leGl0KDEpLCAiIik7CisgICAgQVNTRVJUX0ZBTFNFKHB0aHJlYWRfZmxhZyk7CisgIH0KK30KKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FICYmIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFRlc3RzIHRoYXQgYSBtZXRob2Qgb2YgYW5vdGhlciBjbGFzcyBjYW4gYmUgdXNlZCBpbiBhIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgTWV0aG9kT2ZBbm90aGVyQ2xhc3MpIHsKKyAgY29uc3QgTWF5RGllIHgodHJ1ZSk7CisgIEFTU0VSVF9ERUFUSCh4Lk1lbWJlckZ1bmN0aW9uKCksICJNYXlEaWVcXDpcXDpNZW1iZXJGdW5jdGlvbiIpOworfQorCisvLyBUZXN0cyB0aGF0IGEgZ2xvYmFsIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgZGVhdGggdGVzdC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBHbG9iYWxGdW5jdGlvbikgeworICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgIkdsb2JhbEZ1bmN0aW9uIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYW55IHZhbHVlIGNvbnZlcnRpYmxlIHRvIGFuIFJFIHdvcmtzIGFzIGEgc2Vjb25kCisvLyBhcmd1bWVudCB0byBFWFBFQ1RfREVBVEguCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQWNjZXB0c0FueXRoaW5nQ29udmVydGlibGVUb1JFKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIHJlZ2V4X2Nfc3RyW10gPSAiR2xvYmFsRnVuY3Rpb24iOworICBFWFBFQ1RfREVBVEgoR2xvYmFsRnVuY3Rpb24oKSwgcmVnZXhfY19zdHIpOworCisgIGNvbnN0IHRlc3Rpbmc6OmludGVybmFsOjpSRSByZWdleChyZWdleF9jX3N0cik7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCByZWdleCk7CisKKyMgaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBjb25zdCBzdHJpbmcgcmVnZXhfc3RyKHJlZ2V4X2Nfc3RyKTsKKyAgRVhQRUNUX0RFQVRIKEdsb2JhbEZ1bmN0aW9uKCksIHJlZ2V4X3N0cik7CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKKyMgaWYgIUdURVNUX1VTRVNfUENSRQorCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcgcmVnZXhfc3RkX3N0cihyZWdleF9jX3N0cik7CisgIEVYUEVDVF9ERUFUSChHbG9iYWxGdW5jdGlvbigpLCByZWdleF9zdGRfc3RyKTsKKworIyBlbmRpZiAgLy8gIUdURVNUX1VTRVNfUENSRQorfQorCisvLyBUZXN0cyB0aGF0IGEgbm9uLXZvaWQgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gYSBkZWF0aCB0ZXN0LgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIE5vblZvaWRGdW5jdGlvbikgeworICBBU1NFUlRfREVBVEgoTm9uVm9pZEZ1bmN0aW9uKCksICJOb25Wb2lkRnVuY3Rpb24iKTsKK30KKworLy8gVGVzdHMgdGhhdCBmdW5jdGlvbnMgdGhhdCB0YWtlIHBhcmFtZXRlcihzKSBjYW4gYmUgdXNlZCBpbiBhIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRnVuY3Rpb25XaXRoUGFyYW1ldGVyKSB7CisgIEVYUEVDVF9ERUFUSChEaWVJZih0cnVlKSwgIkRpZUlmXFwoXFwpIik7CisgIEVYUEVDVF9ERUFUSChEaWVJZkxlc3NUaGFuKDIsIDMpLCAiRGllSWZMZXNzVGhhbiIpOworfQorCisvLyBUZXN0cyB0aGF0IEFTU0VSVF9ERUFUSCBjYW4gYmUgdXNlZCBvdXRzaWRlIGEgVEVTVCwgVEVTVF9GLCBvciB0ZXN0IGZpeHR1cmUuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgT3V0c2lkZUZpeHR1cmUpIHsKKyAgRGVhdGhUZXN0U3Vicm91dGluZSgpOworfQorCisvLyBUZXN0cyB0aGF0IGRlYXRoIHRlc3RzIGNhbiBiZSBkb25lIGluc2lkZSBhIGxvb3AuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgSW5zaWRlTG9vcCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgIEVYUEVDVF9ERUFUSChEaWVJZkxlc3NUaGFuKC0xLCBpKSwgIkRpZUlmTGVzc1RoYW4iKSA8PCAid2hlcmUgaSA9PSAiIDw8IGk7CisgIH0KK30KKworLy8gVGVzdHMgdGhhdCBhIGNvbXBvdW5kIHN0YXRlbWVudCBjYW4gYmUgdXNlZCBpbiBhIGRlYXRoIHRlc3QuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQ29tcG91bmRTdGF0ZW1lbnQpIHsKKyAgRVhQRUNUX0RFQVRIKHsgIC8vIE5PTElOVAorICAgIGNvbnN0IGludCB4ID0gMjsKKyAgICBjb25zdCBpbnQgeSA9IHggKyAxOworICAgIERpZUlmTGVzc1RoYW4oeCwgeSk7CisgIH0sCisgICJEaWVJZkxlc3NUaGFuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgY29kZSB0aGF0IGRvZXNuJ3QgZGllIGNhdXNlcyBhIGRlYXRoIHRlc3QgdG8gZmFpbC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEb2VzTm90RGllKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSChEaWVJZihmYWxzZSksICJEaWVJZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRpZSIpOworfQorCisvLyBUZXN0cyB0aGF0IGEgZGVhdGggdGVzdCBmYWlscyB3aGVuIHRoZSBlcnJvciBtZXNzYWdlIGlzbid0IGV4cGVjdGVkLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEVycm9yTWVzc2FnZU1pc21hdGNoKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9ERUFUSChEaWVJZih0cnVlKSwgIkRpZUlmTGVzc1RoYW4iKSA8PCAiRW5kIG9mIGRlYXRoIHRlc3QgbWVzc2FnZS4iOworICB9LCAiZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXJyb3IiKTsKK30KKworLy8gT24gZXhpdCwgKmFib3J0ZWQgd2lsbCBiZSB0cnVlIGlmZiB0aGUgRVhQRUNUX0RFQVRIKCkgc3RhdGVtZW50CisvLyBhYm9ydGVkIHRoZSBmdW5jdGlvbi4KK3ZvaWQgRXhwZWN0RGVhdGhUZXN0SGVscGVyKGJvb2wqIGFib3J0ZWQpIHsKKyAgKmFib3J0ZWQgPSB0cnVlOworICBFWFBFQ1RfREVBVEgoRGllSWYoZmFsc2UpLCAiRGllSWYiKTsgIC8vIFRoaXMgYXNzZXJ0aW9uIHNob3VsZCBmYWlsLgorICAqYWJvcnRlZCA9IGZhbHNlOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9ERUFUSCBkb2Vzbid0IGFib3J0IHRoZSB0ZXN0IG9uIGZhaWx1cmUuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRVhQRUNUX0RFQVRIKSB7CisgIGJvb2wgYWJvcnRlZCA9IHRydWU7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEV4cGVjdERlYXRoVGVzdEhlbHBlcigmYWJvcnRlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZGllIik7CisgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKK30KKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVBVEggZG9lcyBhYm9ydCB0aGUgdGVzdCBvbiBmYWlsdXJlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFTU0VSVF9ERUFUSCkgeworICBzdGF0aWMgYm9vbCBhYm9ydGVkOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBhYm9ydGVkID0gdHJ1ZTsKKyAgICBBU1NFUlRfREVBVEgoRGllSWYoZmFsc2UpLCAiRGllSWYiKTsgIC8vIFRoaXMgYXNzZXJ0aW9uIHNob3VsZCBmYWlsLgorICAgIGFib3J0ZWQgPSBmYWxzZTsKKyAgfSwgImZhaWxlZCB0byBkaWUiKTsKKyAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQVRIIGV2YWx1YXRlcyB0aGUgYXJndW1lbnRzIGV4YWN0bHkgb25jZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBTaW5nbGVFdmFsdWF0aW9uKSB7CisgIGludCB4ID0gMzsKKyAgRVhQRUNUX0RFQVRIKERpZUlmKCgrK3gpID09IDQpLCAiRGllSWYiKTsKKworICBjb25zdCBjaGFyKiByZWdleCA9ICJEaWVJZiI7CisgIGNvbnN0IGNoYXIqIHJlZ2V4X3NhdmUgPSByZWdleDsKKyAgRVhQRUNUX0RFQVRIKERpZUlmTGVzc1RoYW4oMywgNCksIHJlZ2V4KyspOworICBFWFBFQ1RfRVEocmVnZXhfc2F2ZSArIDEsIHJlZ2V4KTsKK30KKworLy8gVGVzdHMgdGhhdCBydW4tYXdheSBkZWF0aCB0ZXN0cyBhcmUgcmVwb3J0ZWQgYXMgZmFpbHVyZXMuCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgUnVuYXdheUlzRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfREVBVEgoc3RhdGljX2Nhc3Q8dm9pZD4oMCksICJGb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBkaWUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgZGVhdGggdGVzdHMgcmVwb3J0IGV4ZWN1dGluZyAncmV0dXJuJyBpbiB0aGUgc3RhdGVtZW50IGFzCisvLyBmYWlsdXJlLgorVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIFJldHVybklzRmFpbHVyZSkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfREVBVEgocmV0dXJuLCAiQmFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHJldHVybiBpbiB0ZXN0IHN0YXRlbWVudC4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVCVUdfREVBVEggd29ya3MgYXMgZXhwZWN0ZWQsIHRoYXQgaXMsIHlvdSBjYW4gc3RyZWFtIGEKKy8vIG1lc3NhZ2UgdG8gaXQsIGFuZCBpbiBkZWJ1ZyBtb2RlIGl0OgorLy8gMS4gQXNzZXJ0cyBvbiBkZWF0aC4KKy8vIDIuIEhhcyBubyBzaWRlIGVmZmVjdC4KKy8vCisvLyBBbmQgaW4gb3B0IG1vZGUsIGl0OgorLy8gMS4gIEhhcyBzaWRlIGVmZmVjdHMgYnV0IGRvZXMgbm90IGFzc2VydC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBUZXN0RXhwZWN0RGVidWdEZWF0aCkgeworICBpbnQgc2lkZWVmZmVjdCA9IDA7CisKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdFbHNlMTIoJnNpZGVlZmZlY3QpLCAiZGVhdGguKkRpZUluRGVidWdFbHNlMTIiKQorICAgICAgPDwgIk11c3QgYWNjZXB0IGEgc3RyZWFtZWQgbWVzc2FnZSI7CisKKyMgaWZkZWYgTkRFQlVHCisKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIGFzc2lnbm1lbnQgb2NjdXJzIGluIG9wdCBtb2RlIChzaWRlZWZmZWN0KS4KKyAgRVhQRUNUX0VRKDEyLCBzaWRlZWZmZWN0KTsKKworIyBlbHNlCisKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIGFzc2lnbm1lbnQgZG9lcyBub3Qgb2NjdXIgaW4gZGJnIG1vZGUgKG5vIHNpZGVlZmZlY3QpLgorICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisKKyMgZW5kaWYKK30KKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfREVCVUdfREVBVEggd29ya3MgYXMgZXhwZWN0ZWQsIHRoYXQgaXMsIHlvdSBjYW4gc3RyZWFtIGEKKy8vIG1lc3NhZ2UgdG8gaXQsIGFuZCBpbiBkZWJ1ZyBtb2RlIGl0OgorLy8gMS4gQXNzZXJ0cyBvbiBkZWF0aC4KKy8vIDIuIEhhcyBubyBzaWRlIGVmZmVjdC4KKy8vCisvLyBBbmQgaW4gb3B0IG1vZGUsIGl0OgorLy8gMS4gIEhhcyBzaWRlIGVmZmVjdHMgYnV0IGRvZXMgbm90IGFzc2VydC4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBUZXN0QXNzZXJ0RGVidWdEZWF0aCkgeworICBpbnQgc2lkZWVmZmVjdCA9IDA7CisKKyAgQVNTRVJUX0RFQlVHX0RFQVRIKERpZUluRGVidWdFbHNlMTIoJnNpZGVlZmZlY3QpLCAiZGVhdGguKkRpZUluRGVidWdFbHNlMTIiKQorICAgICAgPDwgIk11c3QgYWNjZXB0IGEgc3RyZWFtZWQgbWVzc2FnZSI7CisKKyMgaWZkZWYgTkRFQlVHCisKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIGFzc2lnbm1lbnQgb2NjdXJzIGluIG9wdCBtb2RlIChzaWRlZWZmZWN0KS4KKyAgRVhQRUNUX0VRKDEyLCBzaWRlZWZmZWN0KTsKKworIyBlbHNlCisKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIGFzc2lnbm1lbnQgZG9lcyBub3Qgb2NjdXIgaW4gZGJnIG1vZGUgKG5vIHNpZGVlZmZlY3QpLgorICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisKKyMgZW5kaWYKK30KKworIyBpZm5kZWYgTkRFQlVHCisKK3ZvaWQgRXhwZWN0RGVidWdEZWF0aEhlbHBlcihib29sKiBhYm9ydGVkKSB7CisgICphYm9ydGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKHJldHVybiwgIiIpIDw8ICJUaGlzIGlzIGV4cGVjdGVkIHRvIGZhaWwuIjsKKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworIyAgaWYgR1RFU1RfT1NfV0lORE9XUworVEVTVChQb3BVcERlYXRoVGVzdCwgRG9lc05vdFNob3dQb3BVcE9uQWJvcnQpIHsKKyAgcHJpbnRmKCJUaGlzIHRlc3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmFpbGluZyBpZiBpdCBzaG93cyAiCisgICAgICAgICAiYW55IHBvcC11cCBkaWFsb2dzLlxuIik7CisgIGZmbHVzaChzdGRvdXQpOworCisgIEVYUEVDVF9ERUFUSCh7CisgICAgdGVzdGluZzo6R1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IGZhbHNlOworICAgIGFib3J0KCk7CisgIH0sICIiKTsKK30KKyMgIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQlVHX0RFQVRIIGluIGRlYnVnIG1vZGUgZG9lcyBub3QgYWJvcnQKKy8vIHRoZSBmdW5jdGlvbi4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBFeHBlY3REZWJ1Z0RlYXRoRG9lc05vdEFib3J0KSB7CisgIGJvb2wgYWJvcnRlZCA9IHRydWU7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEV4cGVjdERlYnVnRGVhdGhIZWxwZXIoJmFib3J0ZWQpLCAiIik7CisgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKK30KKwordm9pZCBBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKGJvb2wqIGFib3J0ZWQpIHsKKyAgKmFib3J0ZWQgPSB0cnVlOworICBHVEVTVF9MT0dfKElORk8pIDw8ICJCZWZvcmUgQVNTRVJUX0RFQlVHX0RFQVRIIjsKKyAgQVNTRVJUX0RFQlVHX0RFQVRIKEdURVNUX0xPR18oSU5GTykgPDwgIkluIEFTU0VSVF9ERUJVR19ERUFUSCI7IHJldHVybiwgIiIpCisgICAgICA8PCAiVGhpcyBpcyBleHBlY3RlZCB0byBmYWlsLiI7CisgIEdURVNUX0xPR18oSU5GTykgPDwgIkFmdGVyIEFTU0VSVF9ERUJVR19ERUFUSCI7CisgICphYm9ydGVkID0gZmFsc2U7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQlVHX0RFQVRIIGluIGRlYnVnIG1vZGUgYWJvcnRzIHRoZSBmdW5jdGlvbiBvbgorLy8gZmFpbHVyZS4KK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBc3NlcnREZWJ1Z0RlYXRoQWJvcnRzKSB7CisgIHN0YXRpYyBib29sIGFib3J0ZWQ7CisgIGFib3J0ZWQgPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQXNzZXJ0RGVidWdEZWF0aEhlbHBlcigmYWJvcnRlZCksICIiKTsKKyAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBc3NlcnREZWJ1Z0RlYXRoQWJvcnRzMikgeworICBzdGF0aWMgYm9vbCBhYm9ydGVkOworICBhYm9ydGVkID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFzc2VydERlYnVnRGVhdGhIZWxwZXIoJmFib3J0ZWQpLCAiIik7CisgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQXNzZXJ0RGVidWdEZWF0aEFib3J0czMpIHsKKyAgc3RhdGljIGJvb2wgYWJvcnRlZDsKKyAgYWJvcnRlZCA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOworICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFzc2VydERlYnVnRGVhdGhBYm9ydHM0KSB7CisgIHN0YXRpYyBib29sIGFib3J0ZWQ7CisgIGFib3J0ZWQgPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQXNzZXJ0RGVidWdEZWF0aEhlbHBlcigmYWJvcnRlZCksICIiKTsKKyAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBc3NlcnREZWJ1Z0RlYXRoQWJvcnRzNSkgeworICBzdGF0aWMgYm9vbCBhYm9ydGVkOworICBhYm9ydGVkID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFzc2VydERlYnVnRGVhdGhIZWxwZXIoJmFib3J0ZWQpLCAiIik7CisgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQXNzZXJ0RGVidWdEZWF0aEFib3J0czYpIHsKKyAgc3RhdGljIGJvb2wgYWJvcnRlZDsKKyAgYWJvcnRlZCA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOworICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFzc2VydERlYnVnRGVhdGhBYm9ydHM3KSB7CisgIHN0YXRpYyBib29sIGFib3J0ZWQ7CisgIGFib3J0ZWQgPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQXNzZXJ0RGVidWdEZWF0aEhlbHBlcigmYWJvcnRlZCksICIiKTsKKyAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBBc3NlcnREZWJ1Z0RlYXRoQWJvcnRzOCkgeworICBzdGF0aWMgYm9vbCBhYm9ydGVkOworICBhYm9ydGVkID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFzc2VydERlYnVnRGVhdGhIZWxwZXIoJmFib3J0ZWQpLCAiIik7CisgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgQXNzZXJ0RGVidWdEZWF0aEFib3J0czkpIHsKKyAgc3RhdGljIGJvb2wgYWJvcnRlZDsKKyAgYWJvcnRlZCA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBc3NlcnREZWJ1Z0RlYXRoSGVscGVyKCZhYm9ydGVkKSwgIiIpOworICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIEFzc2VydERlYnVnRGVhdGhBYm9ydHMxMCkgeworICBzdGF0aWMgYm9vbCBhYm9ydGVkOworICBhYm9ydGVkID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFzc2VydERlYnVnRGVhdGhIZWxwZXIoJmFib3J0ZWQpLCAiIik7CisgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworfQorCisjIGVuZGlmICAvLyBfTkRFQlVHCisKKy8vIFRlc3RzIHRoZSAqX0VYSVQgZmFtaWx5IG9mIG1hY3JvcywgdXNpbmcgYSB2YXJpZXR5IG9mIHByZWRpY2F0ZXMuCitzdGF0aWMgdm9pZCBUZXN0RXhpdE1hY3JvcygpIHsKKyAgRVhQRUNUX0VYSVQoX2V4aXQoMSksICB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgxKSwgICIiKTsKKyAgQVNTRVJUX0VYSVQoX2V4aXQoNDIpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSg0MiksICIiKTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgLy8gT2YgYWxsIHNpZ25hbHMgZWZmZWN0cyBvbiB0aGUgcHJvY2VzcyBleGl0IGNvZGUsIG9ubHkgdGhvc2Ugb2YgU0lHQUJSVAorICAvLyBhcmUgZG9jdW1lbnRlZCBvbiBXaW5kb3dzLgorICAvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2R3d3prdDRjKFZTLjcxKS5hc3B4LgorICBFWFBFQ1RfRVhJVChyYWlzZShTSUdBQlJUKSwgdGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMyksICIiKSA8PCAiYl9hciI7CisKKyMgZWxzZQorCisgIEVYUEVDVF9FWElUKHJhaXNlKFNJR0tJTEwpLCB0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdLSUxMKSwgIiIpIDw8ICJmb28iOworICBBU1NFUlRfRVhJVChyYWlzZShTSUdVU1IyKSwgdGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHVVNSMiksICIiKSA8PCAiYmFyIjsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfRVhJVChfZXhpdCgwKSwgdGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHU0VHViksICIiKQorICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgdG9vLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIHRvby4iKTsKKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9FWElUKHJhaXNlKFNJR1NFR1YpLCB0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpCisgICAgICA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBFeGl0TWFjcm9zKSB7CisgIFRlc3RFeGl0TWFjcm9zKCk7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBFeGl0TWFjcm9zVXNpbmdGb3JrKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSB0cnVlOworICBUZXN0RXhpdE1hY3JvcygpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgSW52YWxpZFN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAicm9jb2NvIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0RFQVRIKF9leGl0KDApLCAiIikgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworfQorCitURVNUX0YoVGVzdEZvckRlYXRoVGVzdCwgRGVhdGhUZXN0RmFpbGVkT3V0cHV0KSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0RFQVRIKERpZVdpdGhNZXNzYWdlKCJkZWF0aFxuIiksCisgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIG1lc3NhZ2UiKSwKKyAgICAgICJBY3R1YWwgbXNnOlxuIgorICAgICAgIlsgIERFQVRIICAgXSBkZWF0aFxuIik7Cit9CisKK1RFU1RfRihUZXN0Rm9yRGVhdGhUZXN0LCBEZWF0aFRlc3RVbmV4cGVjdGVkUmV0dXJuT3V0cHV0KSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0RFQVRIKHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJldHVybmluZ1xuIik7CisgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9LCAiIiksCisgICAgICAiICAgIFJlc3VsdDogaWxsZWdhbCByZXR1cm4gaW4gdGVzdCBzdGF0ZW1lbnQuXG4iCisgICAgICAiIEVycm9yIG1zZzpcbiIKKyAgICAgICJbICBERUFUSCAgIF0gcmV0dXJuaW5nXG4iKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERlYXRoVGVzdEJhZEV4aXRDb2RlT3V0cHV0KSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0VYSVQoRGllV2l0aE1lc3NhZ2UoImV4aXRpbmcgd2l0aCByYyAxXG4iKSwKKyAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDMpLAorICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIG1lc3NhZ2UiKSwKKyAgICAgICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBleGl0IGNvZGU6XG4iCisgICAgICAiICAgICAgICAgICAgRXhpdGVkIHdpdGggZXhpdCBzdGF0dXMgMVxuIgorICAgICAgIkFjdHVhbCBtc2c6XG4iCisgICAgICAiWyAgREVBVEggICBdIGV4aXRpbmcgd2l0aCByYyAxXG4iKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERlYXRoVGVzdE11bHRpTGluZU1hdGNoRmFpbCkgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9ERUFUSChEaWVXaXRoTWVzc2FnZSgibGluZSAxXG5saW5lIDJcbmxpbmUgM1xuIiksCisgICAgICAgICAgICAgICAgICAgImxpbmUgMVxueHl6XG5saW5lIDNcbiIpLAorICAgICAgIkFjdHVhbCBtc2c6XG4iCisgICAgICAiWyAgREVBVEggICBdIGxpbmUgMVxuIgorICAgICAgIlsgIERFQVRIICAgXSBsaW5lIDJcbiIKKyAgICAgICJbICBERUFUSCAgIF0gbGluZSAzXG4iKTsKK30KKworVEVTVF9GKFRlc3RGb3JEZWF0aFRlc3QsIERlYXRoVGVzdE11bHRpTGluZU1hdGNoUGFzcykgeworICB0ZXN0aW5nOjpHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfREVBVEgoRGllV2l0aE1lc3NhZ2UoImxpbmUgMVxubGluZSAyXG5saW5lIDNcbiIpLAorICAgICAgICAgICAgICAgImxpbmUgMVxubGluZSAyXG5saW5lIDNcbiIpOworfQorCisvLyBBIERlYXRoVGVzdEZhY3RvcnkgdGhhdCByZXR1cm5zIE1vY2tEZWF0aFRlc3RzLgorY2xhc3MgTW9ja0RlYXRoVGVzdEZhY3RvcnkgOiBwdWJsaWMgRGVhdGhUZXN0RmFjdG9yeSB7CisgcHVibGljOgorICBNb2NrRGVhdGhUZXN0RmFjdG9yeSgpOworICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOworCisgIC8vIFNldHMgdGhlIHBhcmFtZXRlcnMgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gQ3JlYXRlLgorICB2b2lkIFNldFBhcmFtZXRlcnMoYm9vbCBjcmVhdGUsIERlYXRoVGVzdDo6VGVzdFJvbGUgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMsIGJvb2wgcGFzc2VkKTsKKworICAvLyBBY2Nlc3NvcnMuCisgIGludCBBc3N1bWVSb2xlQ2FsbHMoKSBjb25zdCB7IHJldHVybiBhc3N1bWVfcm9sZV9jYWxsc187IH0KKyAgaW50IFdhaXRDYWxscygpIGNvbnN0IHsgcmV0dXJuIHdhaXRfY2FsbHNfOyB9CisgIHNpemVfdCBQYXNzZWRDYWxscygpIGNvbnN0IHsgcmV0dXJuIHBhc3NlZF9hcmdzXy5zaXplKCk7IH0KKyAgYm9vbCBQYXNzZWRBcmd1bWVudChpbnQgbikgY29uc3QgeyByZXR1cm4gcGFzc2VkX2FyZ3NfW25dOyB9CisgIHNpemVfdCBBYm9ydENhbGxzKCkgY29uc3QgeyByZXR1cm4gYWJvcnRfYXJnc18uc2l6ZSgpOyB9CisgIERlYXRoVGVzdDo6QWJvcnRSZWFzb24gQWJvcnRBcmd1bWVudChpbnQgbikgY29uc3QgeworICAgIHJldHVybiBhYm9ydF9hcmdzX1tuXTsKKyAgfQorICBib29sIFRlc3REZWxldGVkKCkgY29uc3QgeyByZXR1cm4gdGVzdF9kZWxldGVkXzsgfQorCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIE1vY2tEZWF0aFRlc3Q7CisgIC8vIElmIHRydWUsIENyZWF0ZSB3aWxsIHJldHVybiBhIE1vY2tEZWF0aFRlc3Q7IG90aGVyd2lzZSBpdCByZXR1cm5zCisgIC8vIE5VTEwuCisgIGJvb2wgY3JlYXRlXzsKKyAgLy8gVGhlIHZhbHVlIGEgTW9ja0RlYXRoVGVzdCB3aWxsIHJldHVybiBmcm9tIGl0cyBBc3N1bWVSb2xlIG1ldGhvZC4KKyAgRGVhdGhUZXN0OjpUZXN0Um9sZSByb2xlXzsKKyAgLy8gVGhlIHZhbHVlIGEgTW9ja0RlYXRoVGVzdCB3aWxsIHJldHVybiBmcm9tIGl0cyBXYWl0IG1ldGhvZC4KKyAgaW50IHN0YXR1c187CisgIC8vIFRoZSB2YWx1ZSBhIE1vY2tEZWF0aFRlc3Qgd2lsbCByZXR1cm4gZnJvbSBpdHMgUGFzc2VkIG1ldGhvZC4KKyAgYm9vbCBwYXNzZWRfOworCisgIC8vIE51bWJlciBvZiB0aW1lcyBBc3N1bWVSb2xlIHdhcyBjYWxsZWQuCisgIGludCBhc3N1bWVfcm9sZV9jYWxsc187CisgIC8vIE51bWJlciBvZiB0aW1lcyBXYWl0IHdhcyBjYWxsZWQuCisgIGludCB3YWl0X2NhbGxzXzsKKyAgLy8gVGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbHMgdG8gUGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KKyAgLy8gU2V0UGFyYW1ldGVycy4KKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gcGFzc2VkX2FyZ3NfOworICAvLyBUaGUgYXJndW1lbnRzIHRvIHRoZSBjYWxscyB0byBBYm9ydCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisgIC8vIFNldFBhcmFtZXRlcnMuCisgIHN0ZDo6dmVjdG9yPERlYXRoVGVzdDo6QWJvcnRSZWFzb24+IGFib3J0X2FyZ3NfOworICAvLyBUcnVlIGlmIHRoZSBsYXN0IE1vY2tEZWF0aFRlc3QgcmV0dXJuZWQgYnkgQ3JlYXRlIGhhcyBiZWVuCisgIC8vIGRlbGV0ZWQuCisgIGJvb2wgdGVzdF9kZWxldGVkXzsKK307CisKKworLy8gQSBEZWF0aFRlc3QgaW1wbGVtZW50YXRpb24gdXNlZnVsIGluIHRlc3RpbmcuICBJdCByZXR1cm5zIHZhbHVlcyBzZXQKKy8vIGF0IGl0cyBjcmVhdGlvbiBmcm9tIGl0cyB2YXJpb3VzIGluaGVyaXRlZCBEZWF0aFRlc3QgbWV0aG9kcywgYW5kCisvLyByZXBvcnRzIGNhbGxzIHRvIHRob3NlIG1ldGhvZHMgdG8gaXRzIHBhcmVudCBNb2NrRGVhdGhUZXN0RmFjdG9yeQorLy8gb2JqZWN0LgorY2xhc3MgTW9ja0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3QgeworIHB1YmxpYzoKKyAgTW9ja0RlYXRoVGVzdChNb2NrRGVhdGhUZXN0RmFjdG9yeSAqcGFyZW50LAorICAgICAgICAgICAgICAgIFRlc3RSb2xlIHJvbGUsIGludCBzdGF0dXMsIGJvb2wgcGFzc2VkKSA6CisgICAgICBwYXJlbnRfKHBhcmVudCksIHJvbGVfKHJvbGUpLCBzdGF0dXNfKHN0YXR1cyksIHBhc3NlZF8ocGFzc2VkKSB7CisgIH0KKyAgdmlydHVhbCB+TW9ja0RlYXRoVGVzdCgpIHsKKyAgICBwYXJlbnRfLT50ZXN0X2RlbGV0ZWRfID0gdHJ1ZTsKKyAgfQorICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKSB7CisgICAgKytwYXJlbnRfLT5hc3N1bWVfcm9sZV9jYWxsc187CisgICAgcmV0dXJuIHJvbGVfOworICB9CisgIHZpcnR1YWwgaW50IFdhaXQoKSB7CisgICAgKytwYXJlbnRfLT53YWl0X2NhbGxzXzsKKyAgICByZXR1cm4gc3RhdHVzXzsKKyAgfQorICB2aXJ0dWFsIGJvb2wgUGFzc2VkKGJvb2wgZXhpdF9zdGF0dXNfb2spIHsKKyAgICBwYXJlbnRfLT5wYXNzZWRfYXJnc18ucHVzaF9iYWNrKGV4aXRfc3RhdHVzX29rKTsKKyAgICByZXR1cm4gcGFzc2VkXzsKKyAgfQorICB2aXJ0dWFsIHZvaWQgQWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKSB7CisgICAgcGFyZW50Xy0+YWJvcnRfYXJnc18ucHVzaF9iYWNrKHJlYXNvbik7CisgIH0KKworIHByaXZhdGU6CisgIE1vY2tEZWF0aFRlc3RGYWN0b3J5KiBjb25zdCBwYXJlbnRfOworICBjb25zdCBUZXN0Um9sZSByb2xlXzsKKyAgY29uc3QgaW50IHN0YXR1c187CisgIGNvbnN0IGJvb2wgcGFzc2VkXzsKK307CisKKworLy8gTW9ja0RlYXRoVGVzdEZhY3RvcnkgY29uc3RydWN0b3IuCitNb2NrRGVhdGhUZXN0RmFjdG9yeTo6TW9ja0RlYXRoVGVzdEZhY3RvcnkoKQorICAgIDogY3JlYXRlXyh0cnVlKSwKKyAgICAgIHJvbGVfKERlYXRoVGVzdDo6T1ZFUlNFRV9URVNUKSwKKyAgICAgIHN0YXR1c18oMCksCisgICAgICBwYXNzZWRfKHRydWUpLAorICAgICAgYXNzdW1lX3JvbGVfY2FsbHNfKDApLAorICAgICAgd2FpdF9jYWxsc18oMCksCisgICAgICBwYXNzZWRfYXJnc18oKSwKKyAgICAgIGFib3J0X2FyZ3NfKCkgeworfQorCisKKy8vIFNldHMgdGhlIHBhcmFtZXRlcnMgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gQ3JlYXRlLgordm9pZCBNb2NrRGVhdGhUZXN0RmFjdG9yeTo6U2V0UGFyYW1ldGVycyhib29sIGNyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhdGhUZXN0OjpUZXN0Um9sZSByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBib29sIHBhc3NlZCkgeworICBjcmVhdGVfID0gY3JlYXRlOworICByb2xlXyA9IHJvbGU7CisgIHN0YXR1c18gPSBzdGF0dXM7CisgIHBhc3NlZF8gPSBwYXNzZWQ7CisKKyAgYXNzdW1lX3JvbGVfY2FsbHNfID0gMDsKKyAgd2FpdF9jYWxsc18gPSAwOworICBwYXNzZWRfYXJnc18uY2xlYXIoKTsKKyAgYWJvcnRfYXJnc18uY2xlYXIoKTsKK30KKworCisvLyBTZXRzIHRlc3QgdG8gTlVMTCAoaWYgY3JlYXRlXyBpcyBmYWxzZSkgb3IgdG8gdGhlIGFkZHJlc3Mgb2YgYSBuZXcKKy8vIE1vY2tEZWF0aFRlc3Qgb2JqZWN0IHdpdGggcGFyYW1ldGVycyB0YWtlbiBmcm9tIHRoZSBsYXN0IGNhbGwKKy8vIHRvIFNldFBhcmFtZXRlcnMgKGlmIGNyZWF0ZV8gaXMgdHJ1ZSkuICBBbHdheXMgcmV0dXJucyB0cnVlLgorYm9vbCBNb2NrRGVhdGhUZXN0RmFjdG9yeTo6Q3JlYXRlKGNvbnN0IGNoYXIqIC8qc3RhdGVtZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUqIC8qcmVnZXgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKmZpbGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypsaW5lKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhdGhUZXN0KiogdGVzdCkgeworICB0ZXN0X2RlbGV0ZWRfID0gZmFsc2U7CisgIGlmIChjcmVhdGVfKSB7CisgICAgKnRlc3QgPSBuZXcgTW9ja0RlYXRoVGVzdCh0aGlzLCByb2xlXywgc3RhdHVzXywgcGFzc2VkXyk7CisgIH0gZWxzZSB7CisgICAgKnRlc3QgPSBOVUxMOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBBIHRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyB0aGUgbG9naWMgb2YgdGhlIEdURVNUX0RFQVRIX1RFU1RfIG1hY3JvLgorLy8gSXQgaW5zdGFsbHMgYSBNb2NrRGVhdGhUZXN0RmFjdG9yeSB0aGF0IGlzIHVzZWQgZm9yIHRoZSBkdXJhdGlvbgorLy8gb2YgdGhlIHRlc3QgY2FzZS4KK2NsYXNzIE1hY3JvTG9naWNEZWF0aFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgdGVzdGluZzo6aW50ZXJuYWw6OlJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KiByZXBsYWNlcl87CisgIHN0YXRpYyBNb2NrRGVhdGhUZXN0RmFjdG9yeSogZmFjdG9yeV87CisKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBmYWN0b3J5XyA9IG5ldyBNb2NrRGVhdGhUZXN0RmFjdG9yeTsKKyAgICByZXBsYWNlcl8gPSBuZXcgdGVzdGluZzo6aW50ZXJuYWw6OlJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KGZhY3RvcnlfKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgZGVsZXRlIHJlcGxhY2VyXzsKKyAgICByZXBsYWNlcl8gPSBOVUxMOworICAgIGRlbGV0ZSBmYWN0b3J5XzsKKyAgICBmYWN0b3J5XyA9IE5VTEw7CisgIH0KKworICAvLyBSdW5zIGEgZGVhdGggdGVzdCB0aGF0IGJyZWFrcyB0aGUgcnVsZXMgYnkgcmV0dXJuaW5nLiAgU3VjaCBhIGRlYXRoCisgIC8vIHRlc3QgY2Fubm90IGJlIHJ1biBkaXJlY3RseSBmcm9tIGEgdGVzdCByb3V0aW5lIHRoYXQgdXNlcyBhCisgIC8vIE1vY2tEZWF0aFRlc3QsIG9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHJvdXRpbmUgd2lsbCBub3QgYmUgZXhlY3V0ZWQuCisgIHN0YXRpYyB2b2lkIFJ1blJldHVybmluZ0RlYXRoVGVzdChib29sKiBmbGFnKSB7CisgICAgQVNTRVJUX0RFQVRIKHsgIC8vIE5PTElOVAorICAgICAgKmZsYWcgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0sICIiKTsKKyAgfQorfTsKKwordGVzdGluZzo6aW50ZXJuYWw6OlJlcGxhY2VEZWF0aFRlc3RGYWN0b3J5KiBNYWNyb0xvZ2ljRGVhdGhUZXN0OjpyZXBsYWNlcl8KKyAgICA9IE5VTEw7CitNb2NrRGVhdGhUZXN0RmFjdG9yeSogTWFjcm9Mb2dpY0RlYXRoVGVzdDo6ZmFjdG9yeV8gPSBOVUxMOworCisKKy8vIFRlc3QgdGhhdCBub3RoaW5nIGhhcHBlbnMgd2hlbiB0aGUgZmFjdG9yeSBkb2Vzbid0IHJldHVybiBhIERlYXRoVGVzdDoKK1RFU1RfRihNYWNyb0xvZ2ljRGVhdGhUZXN0LCBOb3RoaW5nSGFwcGVucykgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnMoZmFsc2UsIERlYXRoVGVzdDo6T1ZFUlNFRV9URVNULCAwLCB0cnVlKTsKKyAgRVhQRUNUX0RFQVRIKGZsYWcgPSB0cnVlLCAiIik7CisgIEVYUEVDVF9GQUxTRShmbGFnKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7CisgIEVYUEVDVF9FUSgwLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOworICBFWFBFQ1RfRVEoMFUsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKKyAgRVhQRUNUX0VRKDBVLCBmYWN0b3J5Xy0+QWJvcnRDYWxscygpKTsKKyAgRVhQRUNUX0ZBTFNFKGZhY3RvcnlfLT5UZXN0RGVsZXRlZCgpKTsKK30KKworLy8gVGVzdCB0aGF0IHRoZSBwYXJlbnQgcHJvY2VzcyBkb2Vzbid0IHJ1biB0aGUgZGVhdGggdGVzdCBjb2RlLAorLy8gYW5kIHRoYXQgdGhlIFBhc3NlZCBtZXRob2QgcmV0dXJucyBmYWxzZSB3aGVuIHRoZSAoc2ltdWxhdGVkKQorLy8gY2hpbGQgcHJvY2VzcyBleGl0cyB3aXRoIHN0YXR1cyAwOgorVEVTVF9GKE1hY3JvTG9naWNEZWF0aFRlc3QsIENoaWxkRXhpdHNTdWNjZXNzZnVsbHkpIHsKKyAgYm9vbCBmbGFnID0gZmFsc2U7CisgIGZhY3RvcnlfLT5TZXRQYXJhbWV0ZXJzKHRydWUsIERlYXRoVGVzdDo6T1ZFUlNFRV9URVNULCAwLCB0cnVlKTsKKyAgRVhQRUNUX0RFQVRIKGZsYWcgPSB0cnVlLCAiIik7CisgIEVYUEVDVF9GQUxTRShmbGFnKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5Bc3N1bWVSb2xlQ2FsbHMoKSk7CisgIEVYUEVDVF9FUSgxLCBmYWN0b3J5Xy0+V2FpdENhbGxzKCkpOworICBBU1NFUlRfRVEoMVUsIGZhY3RvcnlfLT5QYXNzZWRDYWxscygpKTsKKyAgRVhQRUNUX0ZBTFNFKGZhY3RvcnlfLT5QYXNzZWRBcmd1bWVudCgwKSk7CisgIEVYUEVDVF9FUSgwVSwgZmFjdG9yeV8tPkFib3J0Q2FsbHMoKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5UZXN0RGVsZXRlZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgUGFzc2VkIG1ldGhvZCB3YXMgZ2l2ZW4gdGhlIGFyZ3VtZW50ICJ0cnVlIiB3aGVuCisvLyB0aGUgKHNpbXVsYXRlZCkgY2hpbGQgcHJvY2VzcyBleGl0cyB3aXRoIHN0YXR1cyAxOgorVEVTVF9GKE1hY3JvTG9naWNEZWF0aFRlc3QsIENoaWxkRXhpdHNVbnN1Y2Nlc3NmdWxseSkgeworICBib29sIGZsYWcgPSBmYWxzZTsKKyAgZmFjdG9yeV8tPlNldFBhcmFtZXRlcnModHJ1ZSwgRGVhdGhUZXN0OjpPVkVSU0VFX1RFU1QsIDEsIHRydWUpOworICBFWFBFQ1RfREVBVEgoZmxhZyA9IHRydWUsICIiKTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWcpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFzc3VtZVJvbGVDYWxscygpKTsKKyAgRVhQRUNUX0VRKDEsIGZhY3RvcnlfLT5XYWl0Q2FsbHMoKSk7CisgIEFTU0VSVF9FUSgxVSwgZmFjdG9yeV8tPlBhc3NlZENhbGxzKCkpOworICBFWFBFQ1RfVFJVRShmYWN0b3J5Xy0+UGFzc2VkQXJndW1lbnQoMCkpOworICBFWFBFQ1RfRVEoMFUsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOworICBFWFBFQ1RfVFJVRShmYWN0b3J5Xy0+VGVzdERlbGV0ZWQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIChzaW11bGF0ZWQpIGNoaWxkIHByb2Nlc3MgZXhlY3V0ZXMgdGhlIGRlYXRoIHRlc3QKKy8vIGNvZGUsIGFuZCBpcyBhYm9ydGVkIHdpdGggdGhlIGNvcnJlY3QgQWJvcnRSZWFzb24gaWYgaXQKKy8vIGV4ZWN1dGVzIGEgcmV0dXJuIHN0YXRlbWVudC4KK1RFU1RfRihNYWNyb0xvZ2ljRGVhdGhUZXN0LCBDaGlsZFBlcmZvcm1zUmV0dXJuKSB7CisgIGJvb2wgZmxhZyA9IGZhbHNlOworICBmYWN0b3J5Xy0+U2V0UGFyYW1ldGVycyh0cnVlLCBEZWF0aFRlc3Q6OkVYRUNVVEVfVEVTVCwgMCwgdHJ1ZSk7CisgIFJ1blJldHVybmluZ0RlYXRoVGVzdCgmZmxhZyk7CisgIEVYUEVDVF9UUlVFKGZsYWcpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFzc3VtZVJvbGVDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5XYWl0Q2FsbHMoKSk7CisgIEVYUEVDVF9FUSgwVSwgZmFjdG9yeV8tPlBhc3NlZENhbGxzKCkpOworICBFWFBFQ1RfRVEoMVUsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOworICBFWFBFQ1RfRVEoRGVhdGhUZXN0OjpURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQsCisgICAgICAgICAgICBmYWN0b3J5Xy0+QWJvcnRBcmd1bWVudCgwKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5UZXN0RGVsZXRlZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgKHNpbXVsYXRlZCkgY2hpbGQgcHJvY2VzcyBpcyBhYm9ydGVkIHdpdGggdGhlCisvLyBjb3JyZWN0IEFib3J0UmVhc29uIGlmIGl0IGRvZXMgbm90IGRpZS4KK1RFU1RfRihNYWNyb0xvZ2ljRGVhdGhUZXN0LCBDaGlsZERvZXNOb3REaWUpIHsKKyAgYm9vbCBmbGFnID0gZmFsc2U7CisgIGZhY3RvcnlfLT5TZXRQYXJhbWV0ZXJzKHRydWUsIERlYXRoVGVzdDo6RVhFQ1VURV9URVNULCAwLCB0cnVlKTsKKyAgRVhQRUNUX0RFQVRIKGZsYWcgPSB0cnVlLCAiIik7CisgIEVYUEVDVF9UUlVFKGZsYWcpOworICBFWFBFQ1RfRVEoMSwgZmFjdG9yeV8tPkFzc3VtZVJvbGVDYWxscygpKTsKKyAgRVhQRUNUX0VRKDAsIGZhY3RvcnlfLT5XYWl0Q2FsbHMoKSk7CisgIEVYUEVDVF9FUSgwVSwgZmFjdG9yeV8tPlBhc3NlZENhbGxzKCkpOworICAvLyBUaGlzIHRpbWUgdGhlcmUgYXJlIHR3byBjYWxscyB0byBBYm9ydDogb25lIHNpbmNlIHRoZSB0ZXN0IGRpZG4ndAorICAvLyBkaWUsIGFuZCBhbm90aGVyIGZyb20gdGhlIFJldHVyblNlbnRpbmVsIHdoZW4gaXQncyBkZXN0cm95ZWQuICBUaGUKKyAgLy8gc2VudGluZWwgbm9ybWFsbHkgaXNuJ3QgZGVzdHJveWVkIGlmIGEgdGVzdCBkb2Vzbid0IGRpZSwgc2luY2UKKyAgLy8gX2V4aXQoMikgaXMgY2FsbGVkIGluIHRoYXQgY2FzZSBieSBGb3JraW5nRGVhdGhUZXN0LCBidXQgbm90IGJ5CisgIC8vIG91ciBNb2NrRGVhdGhUZXN0LgorICBBU1NFUlRfRVEoMlUsIGZhY3RvcnlfLT5BYm9ydENhbGxzKCkpOworICBFWFBFQ1RfRVEoRGVhdGhUZXN0OjpURVNUX0RJRF9OT1RfRElFLAorICAgICAgICAgICAgZmFjdG9yeV8tPkFib3J0QXJndW1lbnQoMCkpOworICBFWFBFQ1RfRVEoRGVhdGhUZXN0OjpURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQsCisgICAgICAgICAgICBmYWN0b3J5Xy0+QWJvcnRBcmd1bWVudCgxKSk7CisgIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5UZXN0RGVsZXRlZCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIHN1Y2Nlc3NmdWwgZGVhdGggdGVzdCBkb2VzIG5vdCByZWdpc3RlciBhIHN1Y2Nlc3NmdWwKKy8vIHRlc3QgcGFydC4KK1RFU1QoU3VjY2Vzc1JlZ2lzdHJhdGlvbkRlYXRoVGVzdCwgTm9TdWNjZXNzUGFydCkgeworICBFWFBFQ1RfREVBVEgoX2V4aXQoMSksICIiKTsKKyAgRVhQRUNUX0VRKDAsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc0RlYXRoVGVzdCwgRGVhdGhUZXN0KSB7CisgIEVYUEVDVF9ERUFUSChfZXhpdCgxKSwgIiIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfREVBVEgoX2V4aXQoMSksICIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0RFQVRIKF9leGl0KDApLCAiIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiOworICB9LCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfREVBVEgoX2V4aXQoMCksICIiKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSI7CisgIH0sICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUKKy8vIGxhc3QgZXJyb3IgaXMgMCBhbmQgbm9uLWVtcHR5IHN0cmluZyB3aGVuIGl0IGlzIG5vbi16ZXJvLgorVEVTVChHZXRMYXN0RXJybm9EZXNjcmlwdGlvbiwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb25Xb3JrcykgeworICBlcnJubyA9IEVOT0VOVDsKKyAgRVhQRUNUX1NUUk5FKCIiLCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICBlcnJubyA9IDA7CisgIEVYUEVDVF9TVFJFUSgiIiwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKS5jX3N0cigpKTsKK30KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCitURVNUKEF1dG9IYW5kbGVUZXN0LCBBdXRvSGFuZGxlV29ya3MpIHsKKyAgSEFORExFIGhhbmRsZSA9IDo6Q3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgQVNTRVJUX05FKElOVkFMSURfSEFORExFX1ZBTFVFLCBoYW5kbGUpOworCisgIC8vIFRlc3RzIHRoYXQgdGhlIEF1dG9IYW5kbGUgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIHdpdGggYSBoYW5kbGUuCisgIHRlc3Rpbmc6OmludGVybmFsOjpBdXRvSGFuZGxlIGF1dG9faGFuZGxlKGhhbmRsZSk7CisgIEVYUEVDVF9FUShoYW5kbGUsIGF1dG9faGFuZGxlLkdldCgpKTsKKworICAvLyBUZXN0cyB0aGF0IFJlc2V0IGFzc2lnbnMgSU5WQUxJRF9IQU5ETEVfVkFMVUUuCisgIC8vIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCB2ZXJpZnkgd2hldGhlciB0aGUgb3JpZ2luYWwgaGFuZGxlIGlzIGNsb3NlZC4KKyAgYXV0b19oYW5kbGUuUmVzZXQoKTsKKyAgRVhQRUNUX0VRKElOVkFMSURfSEFORExFX1ZBTFVFLCBhdXRvX2hhbmRsZS5HZXQoKSk7CisKKyAgLy8gVGVzdHMgdGhhdCBSZXNldCBhc3NpZ25zIHRoZSBuZXcgaGFuZGxlLgorICAvLyBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgdmVyaWZ5IHdoZXRoZXIgdGhlIG9yaWdpbmFsIGhhbmRsZSBpcyBjbG9zZWQuCisgIGhhbmRsZSA9IDo6Q3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgQVNTRVJUX05FKElOVkFMSURfSEFORExFX1ZBTFVFLCBoYW5kbGUpOworICBhdXRvX2hhbmRsZS5SZXNldChoYW5kbGUpOworICBFWFBFQ1RfRVEoaGFuZGxlLCBhdXRvX2hhbmRsZS5HZXQoKSk7CisKKyAgLy8gVGVzdHMgdGhhdCBBdXRvSGFuZGxlIGNvbnRhaW5zIElOVkFMSURfSEFORExFX1ZBTFVFIGJ5IGRlZmF1bHQuCisgIHRlc3Rpbmc6OmludGVybmFsOjpBdXRvSGFuZGxlIGF1dG9faGFuZGxlMjsKKyAgRVhQRUNUX0VRKElOVkFMSURfSEFORExFX1ZBTFVFLCBhdXRvX2hhbmRsZTIuR2V0KCkpOworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBCaWdnZXN0UGFyc2FibGU7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IEJpZ2dlc3RTaWduZWRQYXJzYWJsZTsKKyMgZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdFBhcnNhYmxlOwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIEJpZ2dlc3RTaWduZWRQYXJzYWJsZTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gV2UgY2Fubm90IHVzZSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSBhcyBpdCBjbGFzaGVzIHdpdGggdGhlCisvLyBtYXgoKSBtYWNybyBkZWZpbmVkIGJ5IDx3aW5kb3dzLmg+LgorY29uc3QgQmlnZ2VzdFBhcnNhYmxlIGtCaWdnZXN0UGFyc2FibGVNYXggPSBVTExPTkdfTUFYOworY29uc3QgQmlnZ2VzdFNpZ25lZFBhcnNhYmxlIGtCaWdnZXN0U2lnbmVkUGFyc2FibGVNYXggPSBMTE9OR19NQVg7CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgUmVqZWN0c0ludmFsaWRGb3JtYXQpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgLy8gUmVqZWN0cyBub24tbnVtYmVycy4KKyAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigibm9uLW51bWJlciBzdHJpbmciLCAmcmVzdWx0KSk7CisKKyAgLy8gUmVqZWN0cyBudW1iZXJzIHdpdGggd2hpdGVzcGFjZSBwcmVmaXguCisgIEVYUEVDVF9GQUxTRShQYXJzZU5hdHVyYWxOdW1iZXIoIiAxMjMiLCAmcmVzdWx0KSk7CisKKyAgLy8gUmVqZWN0cyBuZWdhdGl2ZSBudW1iZXJzLgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCItMTIzIiwgJnJlc3VsdCkpOworCisgIC8vIFJlamVjdHMgbnVtYmVycyBzdGFydGluZyB3aXRoIGEgcGx1cyBzaWduLgorICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCIrMTIzIiwgJnJlc3VsdCkpOworICBlcnJubyA9IDA7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgUmVqZWN0c092ZXJmbG93bk51bWJlcnMpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlTmF0dXJhbE51bWJlcigiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiLCAmcmVzdWx0KSk7CisKKyAgc2lnbmVkIGNoYXIgY2hhcl9yZXN1bHQgPSAwOworICBFWFBFQ1RfRkFMU0UoUGFyc2VOYXR1cmFsTnVtYmVyKCIyMDAiLCAmY2hhcl9yZXN1bHQpKTsKKyAgZXJybm8gPSAwOworfQorCitURVNUKFBhcnNlTmF0dXJhbE51bWJlclRlc3QsIEFjY2VwdHNWYWxpZE51bWJlcnMpIHsKKyAgQmlnZ2VzdFBhcnNhYmxlIHJlc3VsdCA9IDA7CisKKyAgcmVzdWx0ID0gMDsKKyAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIxMjMiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgxMjNVLCByZXN1bHQpOworCisgIC8vIENoZWNrIDAgYXMgYW4gZWRnZSBjYXNlLgorICByZXN1bHQgPSAxOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjAiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgwVSwgcmVzdWx0KTsKKworICByZXN1bHQgPSAxOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjAwMDAwIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfRVEoMFUsIHJlc3VsdCk7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgQWNjZXB0c1R5cGVMaW1pdHMpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBrQmlnZ2VzdFBhcnNhYmxlTWF4OworCisgIEJpZ2dlc3RQYXJzYWJsZSByZXN1bHQgPSAwOworICBFWFBFQ1RfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIobXNnLkdldFN0cmluZygpLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUShrQmlnZ2VzdFBhcnNhYmxlTWF4LCByZXN1bHQpOworCisgIE1lc3NhZ2UgbXNnMjsKKyAgbXNnMiA8PCBrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4OworCisgIEJpZ2dlc3RTaWduZWRQYXJzYWJsZSBzaWduZWRfcmVzdWx0ID0gMDsKKyAgRVhQRUNUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKG1zZzIuR2V0U3RyaW5nKCksICZzaWduZWRfcmVzdWx0KSk7CisgIEVYUEVDVF9FUShrQmlnZ2VzdFNpZ25lZFBhcnNhYmxlTWF4LCBzaWduZWRfcmVzdWx0KTsKKworICBNZXNzYWdlIG1zZzM7CisgIG1zZzMgPDwgSU5UX01BWDsKKworICBpbnQgaW50X3Jlc3VsdCA9IDA7CisgIEVYUEVDVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcihtc2czLkdldFN0cmluZygpLCAmaW50X3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoSU5UX01BWCwgaW50X3Jlc3VsdCk7CisKKyAgTWVzc2FnZSBtc2c0OworICBtc2c0IDw8IFVJTlRfTUFYOworCisgIHVuc2lnbmVkIGludCB1aW50X3Jlc3VsdCA9IDA7CisgIEVYUEVDVF9UUlVFKFBhcnNlTmF0dXJhbE51bWJlcihtc2c0LkdldFN0cmluZygpLCAmdWludF9yZXN1bHQpKTsKKyAgRVhQRUNUX0VRKFVJTlRfTUFYLCB1aW50X3Jlc3VsdCk7Cit9CisKK1RFU1QoUGFyc2VOYXR1cmFsTnVtYmVyVGVzdCwgV29ya3NGb3JTaG9ydGVySW50ZWdlcnMpIHsKKyAgc2hvcnQgc2hvcnRfcmVzdWx0ID0gMDsKKyAgQVNTRVJUX1RSVUUoUGFyc2VOYXR1cmFsTnVtYmVyKCIxMjMiLCAmc2hvcnRfcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgxMjMsIHNob3J0X3Jlc3VsdCk7CisKKyAgc2lnbmVkIGNoYXIgY2hhcl9yZXN1bHQgPSAwOworICBBU1NFUlRfVFJVRShQYXJzZU5hdHVyYWxOdW1iZXIoIjEyMyIsICZjaGFyX3Jlc3VsdCkpOworICBFWFBFQ1RfRVEoMTIzLCBjaGFyX3Jlc3VsdCk7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworVEVTVChFbnZpcm9ubWVudFRlc3QsIEhhbmRsZUZpdHNJbnRvU2l6ZVQpIHsKKyAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVtb3ZlIHRoaXMgdGVzdCBhZnRlciB0aGlzIGNvbmRpdGlvbiBpcyB2ZXJpZmllZAorICAvLyBpbiBhIHN0YXRpYyBhc3NlcnRpb24gaW4gZ3Rlc3QtZGVhdGgtdGVzdC5jYyBpbiB0aGUgZnVuY3Rpb24KKyAgLy8gR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IuCisgIEFTU0VSVF9UUlVFKHNpemVvZihIQU5ETEUpIDw9IHNpemVvZihzaXplX3QpKTsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEL0FTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgdHJpZ2dlcgorLy8gZmFpbHVyZXMgd2hlbiBkZWF0aCB0ZXN0cyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0uCitURVNUKENvbmRpdGlvbmFsRGVhdGhNYWNyb3NEZWF0aFRlc3QsIEV4cGVjdHNEZWF0aFdoZW5EZWF0aFRlc3RzQXZhaWxhYmxlKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoRGllSW5zaWRlKCJDb25kRGVhdGhUZXN0RXhwZWN0TWFjcm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVhdGggaW5zaWRlIENvbmREZWF0aFRlc3RFeHBlY3RNYWNybyIpOworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKERpZUluc2lkZSgiQ29uZERlYXRoVGVzdEFzc2VydE1hY3JvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlYXRoIGluc2lkZSBDb25kRGVhdGhUZXN0QXNzZXJ0TWFjcm8iKTsKKworICAvLyBFbXB0eSBzdGF0ZW1lbnQgd2lsbCBub3QgY3Jhc2gsIHdoaWNoIG11c3QgdHJpZ2dlciBhIGZhaWx1cmUuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpLCAiIik7Cit9CisKK1RFU1QoSW5EZWF0aFRlc3RDaGlsZERlYXRoVGVzdCwgUmVwb3J0c0RlYXRoVGVzdENvcnJlY3RseUluRmFzdFN0eWxlKSB7CisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAiZmFzdCI7CisgIEVYUEVDVF9GQUxTRShJbkRlYXRoVGVzdENoaWxkKCkpOworICBFWFBFQ1RfREVBVEgoeworICAgIGZwcmludGYoc3RkZXJyLCBJbkRlYXRoVGVzdENoaWxkKCkgPyAiSW5zaWRlIiA6ICJPdXRzaWRlIik7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgX2V4aXQoMSk7CisgIH0sICJJbnNpZGUiKTsKK30KKworVEVTVChJbkRlYXRoVGVzdENoaWxkRGVhdGhUZXN0LCBSZXBvcnRzRGVhdGhUZXN0Q29ycmVjdGx5SW5UaHJlYWRTYWZlU3R5bGUpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9ICJ0aHJlYWRzYWZlIjsKKyAgRVhQRUNUX0ZBTFNFKEluRGVhdGhUZXN0Q2hpbGQoKSk7CisgIEVYUEVDVF9ERUFUSCh7CisgICAgZnByaW50ZihzdGRlcnIsIEluRGVhdGhUZXN0Q2hpbGQoKSA/ICJJbnNpZGUiIDogIk91dHNpZGUiKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBfZXhpdCgxKTsKKyAgfSwgIkluc2lkZSIpOworfQorCisjZWxzZSAgLy8gIUdURVNUX0hBU19ERUFUSF9URVNUIGZvbGxvd3MKKwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNhcHR1cmVTdGRlcnI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q2FwdHVyZWRTdGRlcnI7CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRC9BU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEIGFyZSBzdGlsbAorLy8gZGVmaW5lZCBidXQgZG8gbm90IHRyaWdnZXIgZmFpbHVyZXMgd2hlbiBkZWF0aCB0ZXN0cyBhcmUgbm90IGF2YWlsYWJsZSBvbgorLy8gdGhlIHN5c3RlbS4KK1RFU1QoQ29uZGl0aW9uYWxEZWF0aE1hY3Jvc1Rlc3QsIFdhcm5zV2hlbkRlYXRoVGVzdHNOb3RBdmFpbGFibGUpIHsKKyAgLy8gRW1wdHkgc3RhdGVtZW50IHdpbGwgbm90IGNyYXNoLCBidXQgdGhhdCBzaG91bGQgbm90IHRyaWdnZXIgYSBmYWlsdXJlCisgIC8vIHdoZW4gZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCg7LCAiIik7CisgIHN0ZDo6c3RyaW5nIG91dHB1dCA9IEdldENhcHR1cmVkU3RkZXJyKCk7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gc3Ryc3RyKG91dHB1dC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSBzdHJzdHIob3V0cHV0LmNfc3RyKCksICI7IikpOworCisgIC8vIFRoZSBzdHJlYW1lZCBtZXNzYWdlIHNob3VsZCBub3QgYmUgcHJpbnRlZCBhcyB0aGVyZSBpcyBubyB0ZXN0IGZhaWx1cmUuCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCg7LCAiIikgPDwgInN0cmVhbWVkIG1lc3NhZ2UiOworICBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBBU1NFUlRfVFJVRShOVUxMID09IHN0cnN0cihvdXRwdXQuY19zdHIoKSwgInN0cmVhbWVkIG1lc3NhZ2UiKSk7CisKKyAgQ2FwdHVyZVN0ZGVycigpOworICBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKDssICIiKTsgIC8vIE5PTElOVAorICBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHN0cnN0cihvdXRwdXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKSk7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gc3Ryc3RyKG91dHB1dC5jX3N0cigpLCAiOyIpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoOywgIiIpIDw8ICJzdHJlYW1lZCBtZXNzYWdlIjsgIC8vIE5PTElOVAorICBvdXRwdXQgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworICBBU1NFUlRfVFJVRShOVUxMID09IHN0cnN0cihvdXRwdXQuY19zdHIoKSwgInN0cmVhbWVkIG1lc3NhZ2UiKSk7Cit9CisKK3ZvaWQgRnVuY1dpdGhBc3NlcnQoaW50KiBuKSB7CisgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQocmV0dXJuOywgIiIpOworICAoKm4pKys7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBkb2VzIG5vdCByZXR1cm4gZnJvbSB0aGUgY3VycmVudAorLy8gZnVuY3Rpb24gKGFzIEFTU0VSVF9ERUFUSCBkb2VzKSBpZiBkZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4KK1RFU1QoQ29uZGl0aW9uYWxEZWF0aE1hY3Jvc1Rlc3QsIEFzc2VydERlYXREb2VzTm90UmV0dXJuaElmVW5zdXBwb3J0ZWQpIHsKKyAgaW50IG4gPSAwOworICBGdW5jV2l0aEFzc2VydCgmbik7CisgIEVYUEVDVF9FUSgxLCBuKTsKK30KKworI2VuZGlmICAvLyAhR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGVzdHMgdGhhdCB0aGUgZGVhdGggdGVzdCBtYWNyb3MgZXhwYW5kIHRvIGNvZGUgd2hpY2ggbWF5IG9yIG1heSBub3QKKy8vIGJlIGZvbGxvd2VkIGJ5IG9wZXJhdG9yPDwsIGFuZCB0aGF0IGluIGVpdGhlciBjYXNlIHRoZSBjb21wbGV0ZSB0ZXh0CisvLyBjb21wcmlzZXMgb25seSBhIHNpbmdsZSBDKysgc3RhdGVtZW50LgorLy8KKy8vIFRoZSBzeW50YXggc2hvdWxkIHdvcmsgd2hldGhlciBkZWF0aCB0ZXN0cyBhcmUgYXZhaWxhYmxlIG9yIG5vdC4KK1RFU1QoQ29uZGl0aW9uYWxEZWF0aE1hY3Jvc1N5bnRheERlYXRoVGVzdCwgU2luZ2xlU3RhdGVtZW50KSB7CisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIC8vIFRoaXMgd291bGQgZmFpbCBpZiBleGVjdXRlZDsgdGhpcyBpcyBhIGNvbXBpbGF0aW9uIHRlc3Qgb25seQorICAgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQocmV0dXJuLCAiIik7CisKKyAgaWYgKEFsd2F5c1RydWUoKSkKKyAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKF9leGl0KDEpLCAiIik7CisgIGVsc2UKKyAgICAvLyBUaGlzIGVtcHR5ICJlbHNlIiBicmFuY2ggaXMgbWVhbnQgdG8gZW5zdXJlIHRoYXQgRVhQRUNUX0RFQVRICisgICAgLy8gZG9lc24ndCBleHBhbmQgaW50byBhbiAiaWYiIHN0YXRlbWVudCB3aXRob3V0IGFuICJlbHNlIgorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQocmV0dXJuLCAiIikgPDwgImRpZCBub3QgZGllIjsKKworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICA7ICAvLyBOT0xJTlQKKyAgZWxzZQorICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoX2V4aXQoMSksICIiKSA8PCAxIDw8IDIgPDwgMzsKK30KKworLy8gVGVzdHMgdGhhdCBjb25kaXRpb25hbCBkZWF0aCB0ZXN0IG1hY3JvcyBleHBhbmQgdG8gY29kZSB3aGljaCBpbnRlcmFjdHMKKy8vIHdlbGwgd2l0aCBzd2l0Y2ggc3RhdGVtZW50cy4KK1RFU1QoQ29uZGl0aW9uYWxEZWF0aE1hY3Jvc1N5bnRheERlYXRoVGVzdCwgU3dpdGNoU3RhdGVtZW50KSB7CisgIC8vIE1pY3Jvc29mdCBjb21waWxlciB1c3VhbGx5IGNvbXBsYWlucyBhYm91dCBzd2l0Y2ggc3RhdGVtZW50cyB3aXRob3V0CisgIC8vIGNhc2UgbGFiZWxzLiBXZSBzdXBwcmVzcyB0aGF0IHdhcm5pbmcgZm9yIHRoaXMgdGVzdC4KKyAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDA2NSkKKworICBzd2l0Y2ggKDApCisgICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoX2V4aXQoMSksICIiKQorICAgICAgICAgIDw8ICJleGl0IGluIGRlZmF1bHQgc3dpdGNoIGhhbmRsZXIiOworCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKF9leGl0KDEpLCAiIikgPDwgImV4aXQgaW4gc3dpdGNoIGNhc2UiOworCisgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQorfQorCisvLyBUZXN0cyB0aGF0IGEgdGVzdCBjYXNlIHdob3NlIG5hbWUgZW5kcyB3aXRoICJEZWF0aFRlc3QiIHdvcmtzIGZpbmUKKy8vIG9uIFdpbmRvd3MuCitURVNUKE5vdEFEZWF0aFRlc3QsIFRlc3QpIHsKKyAgU1VDQ0VFRCgpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3Mjk4NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LWZpbGVwYXRoX3Rlc3QuY2MKQEAgLTAsMCArMSw2NjIgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisvLworLy8gR29vZ2xlIFRlc3QgZmlsZXBhdGggdXRpbGl0aWVzCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBmcm9tIGd0ZXN0X3VuaXR0ZXN0LmNjLCB0byBhdm9pZCBjaGFuZ2luZworLy8gYnVpbGQgb3IgbWFrZS1maWxlcyBmb3Igc29tZSBleGlzdGluZyBHb29nbGUgVGVzdCBjbGllbnRzLiBEbyBub3QKKy8vICNpbmNsdWRlIHRoaXMgZmlsZSBhbnl3aGVyZSBlbHNlIQorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAorI2VsaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDxkaXJlY3QuaD4gIC8vIE5PTElOVAorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogTW92ZSB0aGVzZSB0byB0aGUgUE9TSVggYWRhcHRlciBzZWN0aW9uIGluCisvLyBndGVzdC1wb3J0LmguCisKKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIHRoZSByZW1vdmUgQyBmdW5jdGlvbi4KK2ludCByZW1vdmUoY29uc3QgY2hhciogcGF0aCkgeworICBMUENXU1RSIHdwYXRoID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRoKTsKKyAgaW50IHJldCA9IERlbGV0ZUZpbGUod3BhdGgpID8gMCA6IC0xOworICBkZWxldGUgW10gd3BhdGg7CisgIHJldHVybiByZXQ7Cit9CisvLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSB0aGUgX3JtZGlyIEMgZnVuY3Rpb24uCitpbnQgX3JtZGlyKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgRmlsZVBhdGggZmlsZXBhdGgocGF0aCk7CisgIExQQ1dTVFIgd3BhdGggPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KAorICAgICAgZmlsZXBhdGguUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuY19zdHIoKSk7CisgIGludCByZXQgPSBSZW1vdmVEaXJlY3Rvcnkod3BhdGgpID8gMCA6IC0xOworICBkZWxldGUgW10gd3BhdGg7CisgIHJldHVybiByZXQ7Cit9CisKKyNlbHNlCisKK1RFU1QoR2V0Q3VycmVudERpclRlc3QsIFJldHVybnNDdXJyZW50RGlyKSB7CisgIGNvbnN0IEZpbGVQYXRoIG9yaWdpbmFsX2RpciA9IEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCk7CisgIEVYUEVDVF9GQUxTRShvcmlnaW5hbF9kaXIuSXNFbXB0eSgpKTsKKworICBwb3NpeDo6Q2hEaXIoR1RFU1RfUEFUSF9TRVBfKTsKKyAgY29uc3QgRmlsZVBhdGggY3dkID0gRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKTsKKyAgcG9zaXg6OkNoRGlyKG9yaWdpbmFsX2Rpci5jX3N0cigpKTsKKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisKKyAgLy8gU2tpcHMgdGhlICI6Ii4KKyAgY29uc3QgY2hhciogY29uc3QgY3dkX3dpdGhvdXRfZHJpdmUgPSBzdHJjaHIoY3dkLmNfc3RyKCksICc6Jyk7CisgIEFTU0VSVF9UUlVFKGN3ZF93aXRob3V0X2RyaXZlICE9IE5VTEwpOworICBFWFBFQ1RfU1RSRVEoR1RFU1RfUEFUSF9TRVBfLCBjd2Rfd2l0aG91dF9kcml2ZSArIDEpOworCisjIGVsc2UKKworICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfLCBjd2Quc3RyaW5nKCkpOworCisjIGVuZGlmCit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworVEVTVChJc0VtcHR5VGVzdCwgUmV0dXJuc1RydWVGb3JFbXB0eVBhdGgpIHsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIiIpLklzRW1wdHkoKSk7Cit9CisKK1RFU1QoSXNFbXB0eVRlc3QsIFJldHVybnNGYWxzZUZvck5vbkVtcHR5UGF0aCkgeworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImEiKS5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIi4iKS5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImEvYiIpLklzRW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYVxcYlxcIikuSXNFbXB0eSgpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSAiIiAtPiAiIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgV2hlbkVtcHR5TmFtZSkgeworICBFWFBFQ1RfRVEoIiIsIEZpbGVQYXRoKCIiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lICJhZmlsZSIgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgQnV0Tm9EaXJlY3RvcnkpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsCisgICAgICBGaWxlUGF0aCgiYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lICIvYWZpbGUiIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFJvb3RGaWxlU2hvdWxkR2l2ZUZpbGVOYW1lKSB7CisgIEVYUEVDVF9FUSgiYWZpbGUiLAorICAgICAgRmlsZVBhdGgoR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFkaXIvIiAtPiAiIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgV2hlcmVUaGVyZUlzTm9GaWxlTmFtZSkgeworICBFWFBFQ1RfRVEoIiIsCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lICJhZGlyL2FmaWxlIiAtPiAiYWZpbGUiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBTaG91bGRHaXZlRmlsZU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJhZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZURpcmVjdG9yeU5hbWUgImFkaXIvc3ViZGlyL2FmaWxlIiAtPiAiYWZpbGUiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBTaG91bGRBbHNvR2l2ZUZpbGVOYW1lKSB7CisgIEVYUEVDVF9FUSgiYWZpbGUiLAorICAgICAgRmlsZVBhdGgoImFkaXIiIEdURVNUX1BBVEhfU0VQXyAic3ViZGlyIiBHVEVTVF9QQVRIX1NFUF8gImFmaWxlIikKKyAgICAgIC5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKworLy8gVGVzdHMgdGhhdCBSZW1vdmVEaXJlY3RvcnlOYW1lKCkgd29ya3Mgd2l0aCB0aGUgYWx0ZXJuYXRlIHNlcGFyYXRvcgorLy8gb24gV2luZG93cy4KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSgiL2FmaWxlIikgLT4gImFmaWxlIgorVEVTVChSZW1vdmVEaXJlY3RvcnlOYW1lVGVzdCwgUm9vdEZpbGVTaG91bGRHaXZlRmlsZU5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsIEZpbGVQYXRoKCIvYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCJhZGlyLyIpIC0+ICIiCitURVNUKFJlbW92ZURpcmVjdG9yeU5hbWVUZXN0LCBXaGVyZVRoZXJlSXNOb0ZpbGVOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiIiwgRmlsZVBhdGgoImFkaXIvIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRGlyZWN0b3J5TmFtZSgiYWRpci9hZmlsZSIpIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEdpdmVGaWxlTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImFmaWxlIiwgRmlsZVBhdGgoImFkaXIvYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVEaXJlY3RvcnlOYW1lKCJhZGlyL3N1YmRpci9hZmlsZSIpIC0+ICJhZmlsZSIKK1RFU1QoUmVtb3ZlRGlyZWN0b3J5TmFtZVRlc3QsIFNob3VsZEFsc29HaXZlRmlsZU5hbWVGb3JBbHRlcm5hdGVTZXBhcmF0b3IpIHsKKyAgRVhQRUNUX0VRKCJhZmlsZSIsCisgICAgICAgICAgICBGaWxlUGF0aCgiYWRpci9zdWJkaXIvYWZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkuc3RyaW5nKCkpOworfQorCisjZW5kaWYKKworLy8gUmVtb3ZlRmlsZU5hbWUgIiIgLT4gIi4vIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEVtcHR5TmFtZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIE9uIFdpbmRvd3MgQ0UsIHdlIHVzZSB0aGUgcm9vdCBhcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8sIEZpbGVQYXRoKCIiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKKyNlbHNlCisgIEVYUEVDVF9FUSgiLiIgR1RFU1RfUEFUSF9TRVBfLCBGaWxlUGF0aCgiIikuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7CisjZW5kaWYKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUgImFkaXIvIiAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgQnV0Tm9GaWxlKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgRmlsZVBhdGgoImFkaXIiIEdURVNUX1BBVEhfU0VQXykuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lICJhZGlyL2FmaWxlIiAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJOYW1lKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIiIEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlRmlsZU5hbWUgImFkaXIvc3ViZGlyL2FmaWxlIiAtPiAiYWRpci9zdWJkaXIvIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEdpdmVzRGlyQW5kU3ViRGlyTmFtZSkgeworICBFWFBFQ1RfRVEoImFkaXIiIEdURVNUX1BBVEhfU0VQXyAic3ViZGlyIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICBGaWxlUGF0aCgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKQorICAgICAgLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSAiL2FmaWxlIiAtPiAiLyIKK1RFU1QoUmVtb3ZlRmlsZU5hbWVUZXN0LCBHaXZlc1Jvb3REaXIpIHsKKyAgRVhQRUNUX0VRKEdURVNUX1BBVEhfU0VQXywKKyAgICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyAiYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisKKy8vIFRlc3RzIHRoYXQgUmVtb3ZlRmlsZU5hbWUoKSB3b3JrcyB3aXRoIHRoZSBhbHRlcm5hdGUgc2VwYXJhdG9yIG9uCisvLyBXaW5kb3dzLgorCisvLyBSZW1vdmVGaWxlTmFtZSgiYWRpci8iKSAtPiAiYWRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgQnV0Tm9GaWxlRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfLAorICAgICAgICAgICAgRmlsZVBhdGgoImFkaXIvIikuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lKCJhZGlyL2FmaWxlIikgLT4gImFkaXIvIgorVEVTVChSZW1vdmVGaWxlTmFtZVRlc3QsIEdpdmVzRGlyTmFtZUZvckFsdGVybmF0ZVNlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImFkaXIiIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJhZGlyL2FmaWxlIikuUmVtb3ZlRmlsZU5hbWUoKS5zdHJpbmcoKSk7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lKCJhZGlyL3N1YmRpci9hZmlsZSIpIC0+ICJhZGlyL3N1YmRpci8iCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNEaXJBbmRTdWJEaXJOYW1lRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUSgiYWRpciIgR1RFU1RfUEFUSF9TRVBfICJzdWJkaXIiIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJhZGlyL3N1YmRpci9hZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVGaWxlTmFtZSgiL2FmaWxlIikgLT4gIlwiCitURVNUKFJlbW92ZUZpbGVOYW1lVGVzdCwgR2l2ZXNSb290RGlyRm9yQWx0ZXJuYXRlU2VwYXJhdG9yKSB7CisgIEVYUEVDVF9FUShHVEVTVF9QQVRIX1NFUF8sIEZpbGVQYXRoKCIvYWZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpLnN0cmluZygpKTsKK30KKworI2VuZGlmCisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVXaGVuTnVtYmVySXNaZXJvKSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoRmlsZVBhdGgoImZvbyIpLCBGaWxlUGF0aCgiYmFyIiksCisgICAgICAwLCAieG1sIik7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlRmlsZU5hbWVOdW1iZXJHdFplcm8pIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiksIEZpbGVQYXRoKCJiYXIiKSwKKyAgICAgIDEyLCAieG1sIik7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhcl8xMi54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlRmlsZU5hbWVXaXRoU2xhc2hOdW1iZXJJc1plcm8pIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLAorICAgICAgRmlsZVBhdGgoImJhciIpLCAwLCAieG1sIik7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKE1ha2VGaWxlTmFtZVRlc3QsIEdlbmVyYXRlRmlsZU5hbWVXaXRoU2xhc2hOdW1iZXJHdFplcm8pIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLAorICAgICAgRmlsZVBhdGgoImJhciIpLCAxMiwgInhtbCIpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXJfMTIueG1sIiwgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChNYWtlRmlsZU5hbWVUZXN0LCBHZW5lcmF0ZVdoZW5OdW1iZXJJc1plcm9BbmREaXJJc0VtcHR5KSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoRmlsZVBhdGgoIiIpLCBGaWxlUGF0aCgiYmFyIiksCisgICAgICAwLCAieG1sIik7CisgIEVYUEVDVF9FUSgiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoTWFrZUZpbGVOYW1lVGVzdCwgR2VuZXJhdGVXaGVuTnVtYmVySXNOb3RaZXJvQW5kRGlySXNFbXB0eSkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKEZpbGVQYXRoKCIiKSwgRmlsZVBhdGgoImJhciIpLAorICAgICAgMTQsICJ4bWwiKTsKKyAgRVhQRUNUX0VRKCJiYXJfMTQueG1sIiwgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChDb25jYXRQYXRoc1Rlc3QsIFdvcmtzV2hlbkRpckRvZXNOb3RFbmRXaXRoUGF0aFNlcCkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoRmlsZVBhdGgoImZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImJhci54bWwiKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhci54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgV29ya3NXaGVuUGF0aDFFbmRzV2l0aFBhdGhTZXApIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCgiYmFyLnhtbCIpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBQYXRoMUJlaW5nRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJiYXIueG1sIikpOworICBFWFBFQ1RfRVEoImJhci54bWwiLCBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDJCZWluZ0VtcHR5KSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aCgiZm9vIiksIEZpbGVQYXRoKCIiKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8sIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBCb3RoUGF0aEJlaW5nRW1wdHkpIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCIiKSk7CisgIEVYUEVDVF9FUSgiIiwgYWN0dWFsLnN0cmluZygpKTsKK30KKworVEVTVChDb25jYXRQYXRoc1Rlc3QsIFBhdGgxQ29udGFpbnNQYXRoU2VwKSB7CisgIEZpbGVQYXRoIGFjdHVhbCA9IEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVBhdGgoImZvb2Jhci54bWwiKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIgR1RFU1RfUEFUSF9TRVBfICJmb29iYXIueG1sIiwKKyAgICAgICAgICAgIGFjdHVhbC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoQ29uY2F0UGF0aHNUZXN0LCBQYXRoMkNvbnRhaW5zUGF0aFNlcCkgeworICBGaWxlUGF0aCBhY3R1YWwgPSBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCisgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLAorICAgICAgRmlsZVBhdGgoImJhciIgR1RFU1RfUEFUSF9TRVBfICJiYXIueG1sIikpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiIEdURVNUX1BBVEhfU0VQXyAiYmFyLnhtbCIsCisgICAgICAgICAgICBhY3R1YWwuc3RyaW5nKCkpOworfQorCitURVNUKENvbmNhdFBhdGhzVGVzdCwgUGF0aDJFbmRzV2l0aFBhdGhTZXApIHsKKyAgRmlsZVBhdGggYWN0dWFsID0gRmlsZVBhdGg6OkNvbmNhdFBhdGhzKEZpbGVQYXRoKCJmb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJiYXIiIEdURVNUX1BBVEhfU0VQXykpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiIEdURVNUX1BBVEhfU0VQXywgYWN0dWFsLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICIiIC0+ICIiCitURVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIEVtcHR5U3RyaW5nKSB7CisgIEVYUEVDVF9FUSgiIiwgRmlsZVBhdGgoIiIpLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICJmb28iIC0+ICJmb28iCitURVNUKFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvclRlc3QsIEZpbGVOb1NsYXNoU3RyaW5nKSB7CisgIEVYUEVDVF9FUSgiZm9vIiwgRmlsZVBhdGgoImZvbyIpLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLnN0cmluZygpKTsKK30KKworLy8gUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yICJmb28vIiAtPiAiZm9vIgorVEVTVChSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JUZXN0LCBTaG91bGRSZW1vdmVUcmFpbGluZ1NlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImZvbyIsCisgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8pLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLnN0cmluZygpKTsKKyNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXworICBFWFBFQ1RfRVEoImZvbyIsIEZpbGVQYXRoKCJmb28vIikuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOworI2VuZGlmCit9CisKKy8vIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvciAiZm9vL2Jhci8iIC0+ICJmb28vYmFyLyIKK1RFU1QoUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yVGVzdCwgU2hvdWxkUmVtb3ZlTGFzdFNlcGFyYXRvcikgeworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgICAgICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiIEdURVNUX1BBVEhfU0VQXykKKyAgICAgICAgICAgICAgICAuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuc3RyaW5nKCkpOworfQorCisvLyBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IgImZvby9iYXIiIC0+ICJmb28vYmFyIgorVEVTVChSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JUZXN0LCBTaG91bGRSZXR1cm5Vbm1vZGlmaWVkKSB7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIpCisgICAgICAgICAgICAgICAgLlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpLnN0cmluZygpKTsKK30KKworVEVTVChEaXJlY3RvcnlUZXN0LCBSb290RGlyZWN0b3J5RXhpc3RzKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUyAgLy8gV2UgYXJlIG9uIFdpbmRvd3MuCisgIGNoYXIgY3VycmVudF9kcml2ZVtfTUFYX1BBVEhdOyAgLy8gTk9MSU5UCisgIGN1cnJlbnRfZHJpdmVbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihfZ2V0ZHJpdmUoKSArICdBJyAtIDEpOworICBjdXJyZW50X2RyaXZlWzFdID0gJzonOworICBjdXJyZW50X2RyaXZlWzJdID0gJ1xcJzsKKyAgY3VycmVudF9kcml2ZVszXSA9ICdcMCc7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKGN1cnJlbnRfZHJpdmUpLkRpcmVjdG9yeUV4aXN0cygpKTsKKyNlbHNlCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCIvIikuRGlyZWN0b3J5RXhpc3RzKCkpOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCit9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCitURVNUKERpcmVjdG9yeVRlc3QsIFJvb3RPZldyb25nRHJpdmVEb2VzTm90RXhpc3RzKSB7CisgIGNvbnN0IGludCBzYXZlZF9kcml2ZV8gPSBfZ2V0ZHJpdmUoKTsKKyAgLy8gRmluZCBhIGRyaXZlIHRoYXQgZG9lc24ndCBleGlzdC4gU3RhcnQgd2l0aCAnWicgdG8gYXZvaWQgY29tbW9uIG9uZXMuCisgIGZvciAoY2hhciBkcml2ZSA9ICdaJzsgZHJpdmUgPj0gJ0EnOyBkcml2ZS0tKQorICAgIGlmIChfY2hkcml2ZShkcml2ZSAtICdBJyArIDEpID09IC0xKSB7CisgICAgICBjaGFyIG5vbl9kcml2ZVtfTUFYX1BBVEhdOyAgLy8gTk9MSU5UCisgICAgICBub25fZHJpdmVbMF0gPSBkcml2ZTsKKyAgICAgIG5vbl9kcml2ZVsxXSA9ICc6JzsKKyAgICAgIG5vbl9kcml2ZVsyXSA9ICdcXCc7CisgICAgICBub25fZHJpdmVbM10gPSAnXDAnOworICAgICAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKG5vbl9kcml2ZSkuRGlyZWN0b3J5RXhpc3RzKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICBfY2hkcml2ZShzYXZlZF9kcml2ZV8pOworfQorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIFdpbmRvd3MgQ0UgX2RvZXNfIGNvbnNpZGVyIGFuIGVtcHR5IGRpcmVjdG9yeSB0byBleGlzdC4KK1RFU1QoRGlyZWN0b3J5VGVzdCwgRW1wdHlQYXRoRGlyZWN0b3J5RG9lc05vdEV4aXN0KSB7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiIikuRGlyZWN0b3J5RXhpc3RzKCkpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworVEVTVChEaXJlY3RvcnlUZXN0LCBDdXJyZW50RGlyZWN0b3J5RXhpc3RzKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUyAgLy8gV2UgYXJlIG9uIFdpbmRvd3MuCisjIGlmbmRlZiBfV0lOMzJfQ0UgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnkuCisKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi4iKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCIuXFwiKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisKKyMgZW5kaWYgIC8vIF9XSU4zMl9DRQorI2Vsc2UKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi4iKS5EaXJlY3RvcnlFeGlzdHMoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCIuLyIpLkRpcmVjdG9yeUV4aXN0cygpKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworfQorCisvLyAiZm9vL2JhciIgPT0gZm9vLy9iYXIiID09ICJmb28vLy9iYXIiCitURVNUKE5vcm1hbGl6ZVRlc3QsIE11bHRpcGxlQ29uc2VjdXRpdmVTZXBhcGFyYXRvcnNJbk1pZHN0cmluZykgeworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgICAgICAgICAgRmlsZVBhdGgoImZvbyIgR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfICJiYXIiKS5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gImJhciIsCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfCisgICAgICAgICAgICAgICAgICAgICBHVEVTVF9QQVRIX1NFUF8gImJhciIpLnN0cmluZygpKTsKK30KKworLy8gIi9iYXIiID09IC8vYmFyIiA9PSAiLy8vYmFyIgorVEVTVChOb3JtYWxpemVUZXN0LCBNdWx0aXBsZUNvbnNlY3V0aXZlU2VwYXBhcmF0b3JzQXRTdHJpbmdTdGFydCkgeworICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyAiYmFyIikuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoR1RFU1RfUEFUSF9TRVBfICJiYXIiLAorICAgIEZpbGVQYXRoKEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8gImJhciIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKEdURVNUX1BBVEhfU0VQXyAiYmFyIiwKKyAgICBGaWxlUGF0aChHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuc3RyaW5nKCkpOworfQorCisvLyAiZm9vLyIgPT0gZm9vLy8iID09ICJmb28vLy8iCitURVNUKE5vcm1hbGl6ZVRlc3QsIE11bHRpcGxlQ29uc2VjdXRpdmVTZXBhcGFyYXRvcnNBdFN0cmluZ0VuZCkgeworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXykuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImZvbyIgR1RFU1RfUEFUSF9TRVBfLAorICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyBHVEVTVF9QQVRIX1NFUF8pLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICBGaWxlUGF0aCgiZm9vIiBHVEVTVF9QQVRIX1NFUF8gR1RFU1RfUEFUSF9TRVBfIEdURVNUX1BBVEhfU0VQXykuc3RyaW5nKCkpOworfQorCisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKworLy8gVGVzdHMgdGhhdCBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBhcmUgbm9ybWFsaXplZAorLy8gcmVnYXJkbGVzcyBvZiB0aGVpciBjb21iaW5hdGlvbiAoZS5nLiAiZm9vXCIgPT0iZm9vL1wiID09CisvLyAiZm9vXFwvIikuCitURVNUKE5vcm1hbGl6ZVRlc3QsIE1peEFsdGVybmF0ZVNlcGFyYXRvckF0U3RyaW5nRW5kKSB7CisgIEVYUEVDVF9FUSgiZm9vIiBHVEVTVF9QQVRIX1NFUF8sCisgICAgICAgICAgICBGaWxlUGF0aCgiZm9vLyIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJmb28iIEdURVNUX1BBVEhfU0VQXyAiLyIpLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJmb28iIEdURVNUX1BBVEhfU0VQXywKKyAgICAgICAgICAgIEZpbGVQYXRoKCJmb28vLyIgR1RFU1RfUEFUSF9TRVBfKS5zdHJpbmcoKSk7Cit9CisKKyNlbmRpZgorCitURVNUKEFzc2lnbm1lbnRPcGVyYXRvclRlc3QsIERlZmF1bHRBc3NpZ25lZFRvTm9uRGVmYXVsdCkgeworICBGaWxlUGF0aCBkZWZhdWx0X3BhdGg7CisgIEZpbGVQYXRoIG5vbl9kZWZhdWx0X3BhdGgoInBhdGgiKTsKKyAgbm9uX2RlZmF1bHRfcGF0aCA9IGRlZmF1bHRfcGF0aDsKKyAgRVhQRUNUX0VRKCIiLCBub25fZGVmYXVsdF9wYXRoLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCIiLCBkZWZhdWx0X3BhdGguc3RyaW5nKCkpOyAgLy8gUkhTIHZhciBpcyB1bmNoYW5nZWQuCit9CisKK1RFU1QoQXNzaWdubWVudE9wZXJhdG9yVGVzdCwgTm9uRGVmYXVsdEFzc2lnbmVkVG9EZWZhdWx0KSB7CisgIEZpbGVQYXRoIG5vbl9kZWZhdWx0X3BhdGgoInBhdGgiKTsKKyAgRmlsZVBhdGggZGVmYXVsdF9wYXRoOworICBkZWZhdWx0X3BhdGggPSBub25fZGVmYXVsdF9wYXRoOworICBFWFBFQ1RfRVEoInBhdGgiLCBkZWZhdWx0X3BhdGguc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoInBhdGgiLCBub25fZGVmYXVsdF9wYXRoLnN0cmluZygpKTsgIC8vIFJIUyB2YXIgaXMgdW5jaGFuZ2VkLgorfQorCitURVNUKEFzc2lnbm1lbnRPcGVyYXRvclRlc3QsIENvbnN0QXNzaWduZWRUb05vbkNvbnN0KSB7CisgIGNvbnN0IEZpbGVQYXRoIGNvbnN0X2RlZmF1bHRfcGF0aCgiY29uc3RfcGF0aCIpOworICBGaWxlUGF0aCBub25fZGVmYXVsdF9wYXRoKCJwYXRoIik7CisgIG5vbl9kZWZhdWx0X3BhdGggPSBjb25zdF9kZWZhdWx0X3BhdGg7CisgIEVYUEVDVF9FUSgiY29uc3RfcGF0aCIsIG5vbl9kZWZhdWx0X3BhdGguc3RyaW5nKCkpOworfQorCitjbGFzcyBEaXJlY3RvcnlDcmVhdGlvblRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgdGVzdGRhdGFfcGF0aF8uU2V0KEZpbGVQYXRoKAorICAgICAgICBUZW1wRGlyKCkgKyBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArCisgICAgICAgICJfZGlyZWN0b3J5X2NyZWF0aW9uIiBHVEVTVF9QQVRIX1NFUF8gInRlc3QiIEdURVNUX1BBVEhfU0VQXykpOworICAgIHRlc3RkYXRhX2ZpbGVfLlNldCh0ZXN0ZGF0YV9wYXRoXy5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisKKyAgICB1bmlxdWVfZmlsZTBfLlNldChGaWxlUGF0aDo6TWFrZUZpbGVOYW1lKHRlc3RkYXRhX3BhdGhfLCBGaWxlUGF0aCgidW5pcXVlIiksCisgICAgICAgIDAsICJ0eHQiKSk7CisgICAgdW5pcXVlX2ZpbGUxXy5TZXQoRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZSh0ZXN0ZGF0YV9wYXRoXywgRmlsZVBhdGgoInVuaXF1ZSIpLAorICAgICAgICAxLCAidHh0IikpOworCisgICAgcmVtb3ZlKHRlc3RkYXRhX2ZpbGVfLmNfc3RyKCkpOworICAgIHJlbW92ZSh1bmlxdWVfZmlsZTBfLmNfc3RyKCkpOworICAgIHJlbW92ZSh1bmlxdWVfZmlsZTFfLmNfc3RyKCkpOworICAgIHBvc2l4OjpSbURpcih0ZXN0ZGF0YV9wYXRoXy5jX3N0cigpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICByZW1vdmUodGVzdGRhdGFfZmlsZV8uY19zdHIoKSk7CisgICAgcmVtb3ZlKHVuaXF1ZV9maWxlMF8uY19zdHIoKSk7CisgICAgcmVtb3ZlKHVuaXF1ZV9maWxlMV8uY19zdHIoKSk7CisgICAgcG9zaXg6OlJtRGlyKHRlc3RkYXRhX3BhdGhfLmNfc3RyKCkpOworICB9CisKKyAgdm9pZCBDcmVhdGVUZXh0RmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSkgeworICAgIEZJTEUqIGYgPSBwb3NpeDo6Rk9wZW4oZmlsZW5hbWUsICJ3Iik7CisgICAgZnByaW50ZihmLCAidGV4dFxuIik7CisgICAgZmNsb3NlKGYpOworICB9CisKKyAgLy8gU3RyaW5ncyByZXByZXNlbnRpbmcgYSBkaXJlY3RvcnkgYW5kIGEgZmlsZSwgd2l0aCBpZGVudGljYWwgcGF0aHMKKyAgLy8gZXhjZXB0IGZvciB0aGUgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciB0aGF0IGRpc3RpbnF1aXNoZXMKKyAgLy8gYSBkaXJlY3RvcnkgbmFtZWQgJ3Rlc3QnIGZyb20gYSBmaWxlIG5hbWVkICd0ZXN0Jy4gRXhhbXBsZSBuYW1lczoKKyAgRmlsZVBhdGggdGVzdGRhdGFfcGF0aF87ICAvLyAiL3RtcC9kaXJlY3RvcnlfY3JlYXRpb24vdGVzdC8iCisgIEZpbGVQYXRoIHRlc3RkYXRhX2ZpbGVfOyAgLy8gIi90bXAvZGlyZWN0b3J5X2NyZWF0aW9uL3Rlc3QiCisgIEZpbGVQYXRoIHVuaXF1ZV9maWxlMF87ICAvLyAiL3RtcC9kaXJlY3RvcnlfY3JlYXRpb24vdGVzdC91bmlxdWUudHh0IgorICBGaWxlUGF0aCB1bmlxdWVfZmlsZTFfOyAgLy8gIi90bXAvZGlyZWN0b3J5X2NyZWF0aW9uL3Rlc3QvdW5pcXVlXzEudHh0IgorfTsKKworVEVTVF9GKERpcmVjdG9yeUNyZWF0aW9uVGVzdCwgQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSkgeworICBFWFBFQ1RfRkFMU0UodGVzdGRhdGFfcGF0aF8uRGlyZWN0b3J5RXhpc3RzKCkpIDw8IHRlc3RkYXRhX3BhdGhfLnN0cmluZygpOworICBFWFBFQ1RfVFJVRSh0ZXN0ZGF0YV9wYXRoXy5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpOworICBFWFBFQ1RfVFJVRSh0ZXN0ZGF0YV9wYXRoXy5EaXJlY3RvcnlFeGlzdHMoKSk7Cit9CisKK1RFU1RfRihEaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZURpcmVjdG9yaWVzRm9yQWxyZWFkeUV4aXN0aW5nUGF0aCkgeworICBFWFBFQ1RfRkFMU0UodGVzdGRhdGFfcGF0aF8uRGlyZWN0b3J5RXhpc3RzKCkpIDw8IHRlc3RkYXRhX3BhdGhfLnN0cmluZygpOworICBFWFBFQ1RfVFJVRSh0ZXN0ZGF0YV9wYXRoXy5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpOworICAvLyBDYWxsICdjcmVhdGUnIGFnYWluLi4uIHNob3VsZCBzdGlsbCBzdWNjZWVkLgorICBFWFBFQ1RfVFJVRSh0ZXN0ZGF0YV9wYXRoXy5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpOworfQorCitURVNUX0YoRGlyZWN0b3J5Q3JlYXRpb25UZXN0LCBDcmVhdGVEaXJlY3Rvcmllc0FuZFVuaXF1ZUZpbGVuYW1lKSB7CisgIEZpbGVQYXRoIGZpbGVfcGF0aChGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZSh0ZXN0ZGF0YV9wYXRoXywKKyAgICAgIEZpbGVQYXRoKCJ1bmlxdWUiKSwgInR4dCIpKTsKKyAgRVhQRUNUX0VRKHVuaXF1ZV9maWxlMF8uc3RyaW5nKCksIGZpbGVfcGF0aC5zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShmaWxlX3BhdGguRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOyAgLy8gZmlsZSBub3QgdGhlcmUKKworICB0ZXN0ZGF0YV9wYXRoXy5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCk7CisgIEVYUEVDVF9GQUxTRShmaWxlX3BhdGguRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOyAgLy8gZmlsZSBzdGlsbCBub3QgdGhlcmUKKyAgQ3JlYXRlVGV4dEZpbGUoZmlsZV9wYXRoLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShmaWxlX3BhdGguRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOworCisgIEZpbGVQYXRoIGZpbGVfcGF0aDIoRmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUodGVzdGRhdGFfcGF0aF8sCisgICAgICBGaWxlUGF0aCgidW5pcXVlIiksICJ0eHQiKSk7CisgIEVYUEVDVF9FUSh1bmlxdWVfZmlsZTFfLnN0cmluZygpLCBmaWxlX3BhdGgyLnN0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKGZpbGVfcGF0aDIuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOyAgLy8gZmlsZSBub3QgdGhlcmUKKyAgQ3JlYXRlVGV4dEZpbGUoZmlsZV9wYXRoMi5jX3N0cigpKTsKKyAgRVhQRUNUX1RSVUUoZmlsZV9wYXRoMi5GaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSk7Cit9CisKK1RFU1RfRihEaXJlY3RvcnlDcmVhdGlvblRlc3QsIENyZWF0ZURpcmVjdG9yaWVzRmFpbCkgeworICAvLyBmb3JjZSBhIGZhaWx1cmUgYnkgcHV0dGluZyBhIGZpbGUgd2hlcmUgd2Ugd2lsbCB0cnkgdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgorICBDcmVhdGVUZXh0RmlsZSh0ZXN0ZGF0YV9maWxlXy5jX3N0cigpKTsKKyAgRVhQRUNUX1RSVUUodGVzdGRhdGFfZmlsZV8uRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOworICBFWFBFQ1RfRkFMU0UodGVzdGRhdGFfZmlsZV8uRGlyZWN0b3J5RXhpc3RzKCkpOworICBFWFBFQ1RfRkFMU0UodGVzdGRhdGFfZmlsZV8uQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKTsKK30KKworVEVTVChOb0RpcmVjdG9yeUNyZWF0aW9uVGVzdCwgQ3JlYXRlTm9EaXJlY3Rvcmllc0ZvckRlZmF1bHRYbWxGaWxlKSB7CisgIGNvbnN0IEZpbGVQYXRoIHRlc3RfZGV0YWlsX3htbCgidGVzdF9kZXRhaWwueG1sIik7CisgIEVYUEVDVF9GQUxTRSh0ZXN0X2RldGFpbF94bWwuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICBGaWxlUGF0aCBmcDsKKyAgRVhQRUNUX0VRKCIiLCBmcC5zdHJpbmcoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBDaGFyQW5kQ29weUNvbnN0cnVjdG9ycykgeworICBjb25zdCBGaWxlUGF0aCBmcCgic3BpY3kiKTsKKyAgRVhQRUNUX0VRKCJzcGljeSIsIGZwLnN0cmluZygpKTsKKworICBjb25zdCBGaWxlUGF0aCBmcF9jb3B5KGZwKTsKKyAgRVhQRUNUX0VRKCJzcGljeSIsIGZwX2NvcHkuc3RyaW5nKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgU3RyaW5nQ29uc3RydWN0b3IpIHsKKyAgY29uc3QgRmlsZVBhdGggZnAoc3RkOjpzdHJpbmcoImNpZGVyIikpOworICBFWFBFQ1RfRVEoImNpZGVyIiwgZnAuc3RyaW5nKCkpOworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgU2V0KSB7CisgIGNvbnN0IEZpbGVQYXRoIGFwcGxlKCJhcHBsZSIpOworICBGaWxlUGF0aCBtYWMoIm1hYyIpOworICBtYWMuU2V0KGFwcGxlKTsgIC8vIEltcGxlbWVudCBTZXQoKSBzaW5jZSBvdmVybG9hZGluZyBvcGVyYXRvcj0gaXMgZm9yYmlkZGVuLgorICBFWFBFQ1RfRVEoImFwcGxlIiwgbWFjLnN0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJhcHBsZSIsIGFwcGxlLnN0cmluZygpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIFRvU3RyaW5nKSB7CisgIGNvbnN0IEZpbGVQYXRoIGZpbGUoImRyaW5rIik7CisgIEVYUEVDVF9FUSgiZHJpbmsiLCBmaWxlLnN0cmluZygpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIFJlbW92ZUV4dGVuc2lvbikgeworICBFWFBFQ1RfRVEoImFwcCIsIEZpbGVQYXRoKCJhcHAuY2MiKS5SZW1vdmVFeHRlbnNpb24oImNjIikuc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImFwcCIsIEZpbGVQYXRoKCJhcHAuZXhlIikuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKS5zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiQVBQIiwgRmlsZVBhdGgoIkFQUC5FWEUiKS5SZW1vdmVFeHRlbnNpb24oImV4ZSIpLnN0cmluZygpKTsKK30KKworVEVTVChGaWxlUGF0aFRlc3QsIFJlbW92ZUV4dGVuc2lvbldoZW5UaGVyZUlzTm9FeHRlbnNpb24pIHsKKyAgRVhQRUNUX0VRKCJhcHAiLCBGaWxlUGF0aCgiYXBwIikuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKS5zdHJpbmcoKSk7Cit9CisKK1RFU1QoRmlsZVBhdGhUZXN0LCBJc0RpcmVjdG9yeSkgeworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImNvbGEiKS5Jc0RpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImtvYWxhIiBHVEVTVF9QQVRIX1NFUF8pLklzRGlyZWN0b3J5KCkpOworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJrb2FsYS8iKS5Jc0RpcmVjdG9yeSgpKTsKKyNlbmRpZgorfQorCitURVNUKEZpbGVQYXRoVGVzdCwgSXNBYnNvbHV0ZVBhdGgpIHsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCJpcyIgR1RFU1RfUEFUSF9TRVBfICJyZWxhdGl2ZSIpLklzQWJzb2x1dGVQYXRoKCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoIiIpLklzQWJzb2x1dGVQYXRoKCkpOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImM6XFwiIEdURVNUX1BBVEhfU0VQXyAiaXNfbm90IgorICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9QQVRIX1NFUF8gInJlbGF0aXZlIikuSXNBYnNvbHV0ZVBhdGgoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiYzpmb28iIEdURVNUX1BBVEhfU0VQXyAiYmFyIikuSXNBYnNvbHV0ZVBhdGgoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCJjOi8iIEdURVNUX1BBVEhfU0VQXyAiaXNfbm90IgorICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9QQVRIX1NFUF8gInJlbGF0aXZlIikuSXNBYnNvbHV0ZVBhdGgoKSk7CisjZWxzZQorICBFWFBFQ1RfVFJVRShGaWxlUGF0aChHVEVTVF9QQVRIX1NFUF8gImlzX25vdCIgR1RFU1RfUEFUSF9TRVBfICJyZWxhdGl2ZSIpCisgICAgICAgICAgICAgIC5Jc0Fic29sdXRlUGF0aCgpKTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworfQorCitURVNUKEZpbGVQYXRoVGVzdCwgSXNSb290RGlyZWN0b3J5KSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBFWFBFQ1RfVFJVRShGaWxlUGF0aCgiYTpcXCIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIlo6LyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoImU6Ly8iKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiIikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImI6IikuSXNSb290RGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoRmlsZVBhdGgoImI6YSIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCI4Oi8iKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiY3wvIikuSXNSb290RGlyZWN0b3J5KCkpOworI2Vsc2UKKyAgRVhQRUNUX1RSVUUoRmlsZVBhdGgoIi8iKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9UUlVFKEZpbGVQYXRoKCIvLyIpLklzUm9vdERpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZpbGVQYXRoKCIiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiXFwiKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShGaWxlUGF0aCgiL3giKS5Jc1Jvb3REaXJlY3RvcnkoKSk7CisjZW5kaWYKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1saW5rZWRfcHRyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjZjUxMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYwpAQCAtMCwwICsxLDE1NCBAQAorLy8gQ29weXJpZ2h0IDIwMDMsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IERhbiBFZ25vciAoZWdub3JAZ29vZ2xlLmNvbSkKKy8vIFBvcnRlZCB0byBXaW5kb3dzOiBWYWRpbSBCZXJtYW4gKHZhZGltYkBnb29nbGUuY29tKQorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordXNpbmcgdGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyOworCitpbnQgbnVtOworTWVzc2FnZSogaGlzdG9yeSA9IE5VTEw7CisKKy8vIENsYXNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgorY2xhc3MgQSB7CisgcHVibGljOgorICBBKCk6IG15bnVtKG51bSsrKSB7ICpoaXN0b3J5IDw8ICJBIiA8PCBteW51bSA8PCAiIGN0b3JcbiI7IH0KKyAgdmlydHVhbCB+QSgpIHsgKmhpc3RvcnkgPDwgIkEiIDw8IG15bnVtIDw8ICIgZHRvclxuIjsgfQorICB2aXJ0dWFsIHZvaWQgVXNlKCkgeyAqaGlzdG9yeSA8PCAiQSIgPDwgbXludW0gPDwgIiB1c2VcbiI7IH0KKyBwcm90ZWN0ZWQ6CisgIGludCBteW51bTsKK307CisKKy8vIFN1YmNsYXNzCitjbGFzcyBCIDogcHVibGljIEEgeworIHB1YmxpYzoKKyAgQigpIHsgKmhpc3RvcnkgPDwgIkIiIDw8IG15bnVtIDw8ICIgY3RvclxuIjsgfQorICB+QigpIHsgKmhpc3RvcnkgPDwgIkIiIDw8IG15bnVtIDw8ICIgZHRvclxuIjsgfQorICB2aXJ0dWFsIHZvaWQgVXNlKCkgeyAqaGlzdG9yeSA8PCAiQiIgPDwgbXludW0gPDwgIiB1c2VcbiI7IH0KK307CisKK2NsYXNzIExpbmtlZFB0clRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBMaW5rZWRQdHJUZXN0KCkgeworICAgIG51bSA9IDA7CisgICAgaGlzdG9yeSA9IG5ldyBNZXNzYWdlOworICB9CisKKyAgdmlydHVhbCB+TGlua2VkUHRyVGVzdCgpIHsKKyAgICBkZWxldGUgaGlzdG9yeTsKKyAgICBoaXN0b3J5ID0gTlVMTDsKKyAgfQorfTsKKworVEVTVF9GKExpbmtlZFB0clRlc3QsIEdlbmVyYWxUZXN0KSB7CisgIHsKKyAgICBsaW5rZWRfcHRyPEE+IGEwLCBhMSwgYTI7CisgICAgLy8gVXNlIGV4cGxpY2l0IGZ1bmN0aW9uIGNhbGwgbm90YXRpb24gaGVyZSB0byBzdXBwcmVzcyBzZWxmLWFzc2lnbiB3YXJuaW5nLgorICAgIGEwLm9wZXJhdG9yPShhMCk7CisgICAgYTEgPSBhMjsKKyAgICBBU1NFUlRfRVEoYTAuZ2V0KCksIHN0YXRpY19jYXN0PEEqPihOVUxMKSk7CisgICAgQVNTRVJUX0VRKGExLmdldCgpLCBzdGF0aWNfY2FzdDxBKj4oTlVMTCkpOworICAgIEFTU0VSVF9FUShhMi5nZXQoKSwgc3RhdGljX2Nhc3Q8QSo+KE5VTEwpKTsKKyAgICBBU1NFUlRfVFJVRShhMCA9PSBOVUxMKTsKKyAgICBBU1NFUlRfVFJVRShhMSA9PSBOVUxMKTsKKyAgICBBU1NFUlRfVFJVRShhMiA9PSBOVUxMKTsKKworICAgIHsKKyAgICAgIGxpbmtlZF9wdHI8QT4gYTMobmV3IEEpOworICAgICAgYTAgPSBhMzsKKyAgICAgIEFTU0VSVF9UUlVFKGEwID09IGEzKTsKKyAgICAgIEFTU0VSVF9UUlVFKGEwICE9IE5VTEwpOworICAgICAgQVNTRVJUX1RSVUUoYTAuZ2V0KCkgPT0gYTMpOworICAgICAgQVNTRVJUX1RSVUUoYTAgPT0gYTMuZ2V0KCkpOworICAgICAgbGlua2VkX3B0cjxBPiBhNChhMCk7CisgICAgICBhMSA9IGE0OworICAgICAgbGlua2VkX3B0cjxBPiBhNShuZXcgQSk7CisgICAgICBBU1NFUlRfVFJVRShhNS5nZXQoKSAhPSBhMyk7CisgICAgICBBU1NFUlRfVFJVRShhNSAhPSBhMy5nZXQoKSk7CisgICAgICBhMiA9IGE1OworICAgICAgbGlua2VkX3B0cjxCPiBiMChuZXcgQik7CisgICAgICBsaW5rZWRfcHRyPEE+IGE2KGIwKTsKKyAgICAgIEFTU0VSVF9UUlVFKGIwID09IGE2KTsKKyAgICAgIEFTU0VSVF9UUlVFKGE2ID09IGIwKTsKKyAgICAgIEFTU0VSVF9UUlVFKGIwICE9IE5VTEwpOworICAgICAgYTUgPSBiMDsKKyAgICAgIGE1ID0gYjA7CisgICAgICBhMy0+VXNlKCk7CisgICAgICBhNC0+VXNlKCk7CisgICAgICBhNS0+VXNlKCk7CisgICAgICBhNi0+VXNlKCk7CisgICAgICBiMC0+VXNlKCk7CisgICAgICAoKmIwKS5Vc2UoKTsKKyAgICAgIGIwLmdldCgpLT5Vc2UoKTsKKyAgICB9CisKKyAgICBhMC0+VXNlKCk7CisgICAgYTEtPlVzZSgpOworICAgIGEyLT5Vc2UoKTsKKworICAgIGExID0gYTI7CisgICAgYTIucmVzZXQobmV3IEEpOworICAgIGEwLnJlc2V0KCk7CisKKyAgICBsaW5rZWRfcHRyPEE+IGE3OworICB9CisKKyAgQVNTRVJUX1NUUkVRKAorICAgICJBMCBjdG9yXG4iCisgICAgIkExIGN0b3JcbiIKKyAgICAiQTIgY3RvclxuIgorICAgICJCMiBjdG9yXG4iCisgICAgIkEwIHVzZVxuIgorICAgICJBMCB1c2VcbiIKKyAgICAiQjIgdXNlXG4iCisgICAgIkIyIHVzZVxuIgorICAgICJCMiB1c2VcbiIKKyAgICAiQjIgdXNlXG4iCisgICAgIkIyIHVzZVxuIgorICAgICJCMiBkdG9yXG4iCisgICAgIkEyIGR0b3JcbiIKKyAgICAiQTAgdXNlXG4iCisgICAgIkEwIHVzZVxuIgorICAgICJBMSB1c2VcbiIKKyAgICAiQTMgY3RvclxuIgorICAgICJBMCBkdG9yXG4iCisgICAgIkEzIGR0b3JcbiIKKyAgICAiQTEgZHRvclxuIiwKKyAgICBoaXN0b3J5LT5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworfSAgLy8gVW5uYW1lZCBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LWxpc3RlbmVyX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzQ3NjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1saXN0ZW5lcl90ZXN0LmNjCkBAIC0wLDAgKzEsMzExIEBACisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBmaWxlIHZlcmlmaWVzIEdvb2dsZSBUZXN0IGV2ZW50IGxpc3RlbmVycyByZWNlaXZlIGV2ZW50cyBhdCB0aGUKKy8vIHJpZ2h0IHRpbWVzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3VzaW5nIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50OwordXNpbmcgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudDsKK3VzaW5nIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RDYXNlOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcjsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEluZm87Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwordXNpbmcgOjp0ZXN0aW5nOjpVbml0VGVzdDsKKworLy8gVXNlZCBieSB0ZXN0cyB0byByZWdpc3RlciB0aGVpciBldmVudHMuCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGdfZXZlbnRzID0gTlVMTDsKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgRXZlbnRSZWNvcmRpbmdMaXN0ZW5lciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBleHBsaWNpdCBFdmVudFJlY29yZGluZ0xpc3RlbmVyKGNvbnN0IGNoYXIqIG5hbWUpIDogbmFtZV8obmFtZSkge30KKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdFByb2dyYW1TdGFydCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgICBNZXNzYWdlIG1lc3NhZ2U7CisgICAgbWVzc2FnZSA8PCBHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0SXRlcmF0aW9uU3RhcnQiKQorICAgICAgICAgICAgPDwgIigiIDw8IGl0ZXJhdGlvbiA8PCAiKSI7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhtZXNzYWdlLkdldFN0cmluZygpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPbkVudmlyb25tZW50c1NldFVwU3RhcnQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uRW52aXJvbm1lbnRzU2V0VXBFbmQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0Q2FzZVN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0U3RhcnQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgLyp0ZXN0X3BhcnRfcmVzdWx0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RQYXJ0UmVzdWx0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uVGVzdEVuZCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjayhHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0Q2FzZUVuZCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soR2V0RnVsbE1ldGhvZE5hbWUoIk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQiKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgICBNZXNzYWdlIG1lc3NhZ2U7CisgICAgbWVzc2FnZSA8PCBHZXRGdWxsTWV0aG9kTmFtZSgiT25UZXN0SXRlcmF0aW9uRW5kIikKKyAgICAgICAgICAgIDw8ICIoIiAgPDwgaXRlcmF0aW9uIDw8ICIpIjsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKG1lc3NhZ2UuR2V0U3RyaW5nKCkpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKEdldEZ1bGxNZXRob2ROYW1lKCJPblRlc3RQcm9ncmFtRW5kIikpOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyBHZXRGdWxsTWV0aG9kTmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgcmV0dXJuIG5hbWVfICsgIi4iICsgbmFtZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKworY2xhc3MgRW52aXJvbm1lbnRJbnZvY2F0aW9uQ2F0Y2hlciA6IHB1YmxpYyBFbnZpcm9ubWVudCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjaygiRW52aXJvbm1lbnQ6OlNldFVwIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjaygiRW52aXJvbm1lbnQ6OlRlYXJEb3duIik7CisgIH0KK307CisKK2NsYXNzIExpc3RlbmVyVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgZ19ldmVudHMtPnB1c2hfYmFjaygiTGlzdGVuZXJUZXN0OjpTZXRVcFRlc3RDYXNlIik7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkxpc3RlbmVyVGVzdDo6VGVhckRvd25UZXN0Q2FzZSIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkxpc3RlbmVyVGVzdDo6U2V0VXAiKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIik7CisgIH0KK307CisKK1RFU1RfRihMaXN0ZW5lclRlc3QsIERvZXNGb28pIHsKKyAgLy8gVGVzdCBleGVjdXRpb24gb3JkZXIgd2l0aGluIGEgdGVzdCBjYXNlIGlzIG5vdCBndWFyYW50ZWVkIHNvIHdlIGFyZSBub3QKKyAgLy8gcmVjb3JkaW5nIHRoZSB0ZXN0IG5hbWUuCisgIGdfZXZlbnRzLT5wdXNoX2JhY2soIkxpc3RlbmVyVGVzdDo6KiBUZXN0IEJvZHkiKTsKKyAgU1VDQ0VFRCgpOyAgLy8gVHJpZ2dlcnMgT25UZXN0UGFydFJlc3VsdC4KK30KKworVEVTVF9GKExpc3RlbmVyVGVzdCwgRG9lc0JhcikgeworICBnX2V2ZW50cy0+cHVzaF9iYWNrKCJMaXN0ZW5lclRlc3Q6OiogVGVzdCBCb2R5Iik7CisgIFNVQ0NFRUQoKTsgIC8vIFRyaWdnZXJzIE9uVGVzdFBhcnRSZXN1bHQuCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpFbnZpcm9ubWVudEludm9jYXRpb25DYXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RXZlbnRSZWNvcmRpbmdMaXN0ZW5lcjsKKwordm9pZCBWZXJpZnlSZXN1bHRzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogZXhwZWN0ZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRfZGF0YV9zaXplKSB7CisgIGNvbnN0IHNpemVfdCBhY3R1YWxfc2l6ZSA9IGRhdGEuc2l6ZSgpOworICAvLyBJZiB0aGUgZm9sbG93aW5nIGFzc2VydGlvbiBmYWlscywgYSBuZXcgZW50cnkgd2lsbCBiZSBhcHBlbmRlZCB0bworICAvLyBkYXRhLiAgSGVuY2Ugd2Ugc2F2ZSBkYXRhLnNpemUoKSBmaXJzdC4KKyAgRVhQRUNUX0VRKGV4cGVjdGVkX2RhdGFfc2l6ZSwgYWN0dWFsX3NpemUpOworCisgIC8vIENvbXBhcmVzIHRoZSBjb21tb24gcHJlZml4LgorICBjb25zdCBzaXplX3Qgc2hvcnRlcl9zaXplID0gZXhwZWN0ZWRfZGF0YV9zaXplIDw9IGFjdHVhbF9zaXplID8KKyAgICAgIGV4cGVjdGVkX2RhdGFfc2l6ZSA6IGFjdHVhbF9zaXplOworICBzaXplX3QgaSA9IDA7CisgIGZvciAoOyBpIDwgc2hvcnRlcl9zaXplOyArK2kpIHsKKyAgICBBU1NFUlRfU1RSRVEoZXhwZWN0ZWRfZGF0YVtpXSwgZGF0YVtpXS5jX3N0cigpKQorICAgICAgICA8PCAiYXQgcG9zaXRpb24gIiA8PCBpOworICB9CisKKyAgLy8gUHJpbnRzIGV4dHJhIGVsZW1lbnRzIGluIHRoZSBhY3R1YWwgZGF0YS4KKyAgZm9yICg7IGkgPCBhY3R1YWxfc2l6ZTsgKytpKSB7CisgICAgcHJpbnRmKCIgIEFjdHVhbCBldmVudCAjJWx1OiAlc1xuIiwKKyAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oaSksIGRhdGFbaV0uY19zdHIoKSk7CisgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBldmVudHM7CisgIGdfZXZlbnRzID0gJmV2ZW50czsKKyAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5BcHBlbmQoCisgICAgICBuZXcgRXZlbnRSZWNvcmRpbmdMaXN0ZW5lcigiMXN0IikpOworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkuQXBwZW5kKAorICAgICAgbmV3IEV2ZW50UmVjb3JkaW5nTGlzdGVuZXIoIjJuZCIpKTsKKworICBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEVudmlyb25tZW50SW52b2NhdGlvbkNhdGNoZXIpOworCisgIEdURVNUX0NIRUNLXyhldmVudHMuc2l6ZSgpID09IDApCisgICAgICA8PCAiQWRkR2xvYmFsVGVzdEVudmlyb25tZW50IHNob3VsZCBub3QgZ2VuZXJhdGUgYW55IGV2ZW50cyBpdHNlbGYuIjsKKworICA6OnRlc3Rpbmc6OkdURVNUX0ZMQUcocmVwZWF0KSA9IDI7CisgIGludCByZXRfdmFsID0gUlVOX0FMTF9URVNUUygpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGV4cGVjdGVkX2V2ZW50c1tdID0geworICAgICIxc3QuT25UZXN0UHJvZ3JhbVN0YXJ0IiwKKyAgICAiMm5kLk9uVGVzdFByb2dyYW1TdGFydCIsCisgICAgIjFzdC5PblRlc3RJdGVyYXRpb25TdGFydCgwKSIsCisgICAgIjJuZC5PblRlc3RJdGVyYXRpb25TdGFydCgwKSIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1NldFVwU3RhcnQiLAorICAgICIybmQuT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0IiwKKyAgICAiRW52aXJvbm1lbnQ6OlNldFVwIiwKKyAgICAiMm5kLk9uRW52aXJvbm1lbnRzU2V0VXBFbmQiLAorICAgICIxc3QuT25FbnZpcm9ubWVudHNTZXRVcEVuZCIsCisgICAgIjFzdC5PblRlc3RDYXNlU3RhcnQiLAorICAgICIybmQuT25UZXN0Q2FzZVN0YXJ0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcFRlc3RDYXNlIiwKKyAgICAiMXN0Lk9uVGVzdFN0YXJ0IiwKKyAgICAiMm5kLk9uVGVzdFN0YXJ0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcCIsCisgICAgIkxpc3RlbmVyVGVzdDo6KiBUZXN0IEJvZHkiLAorICAgICIxc3QuT25UZXN0UGFydFJlc3VsdCIsCisgICAgIjJuZC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93biIsCisgICAgIjJuZC5PblRlc3RFbmQiLAorICAgICIxc3QuT25UZXN0RW5kIiwKKyAgICAiMXN0Lk9uVGVzdFN0YXJ0IiwKKyAgICAiMm5kLk9uVGVzdFN0YXJ0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpTZXRVcCIsCisgICAgIkxpc3RlbmVyVGVzdDo6KiBUZXN0IEJvZHkiLAorICAgICIxc3QuT25UZXN0UGFydFJlc3VsdCIsCisgICAgIjJuZC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93biIsCisgICAgIjJuZC5PblRlc3RFbmQiLAorICAgICIxc3QuT25UZXN0RW5kIiwKKyAgICAiTGlzdGVuZXJUZXN0OjpUZWFyRG93blRlc3RDYXNlIiwKKyAgICAiMm5kLk9uVGVzdENhc2VFbmQiLAorICAgICIxc3QuT25UZXN0Q2FzZUVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQiLAorICAgICIybmQuT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0IiwKKyAgICAiRW52aXJvbm1lbnQ6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQiLAorICAgICIxc3QuT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCIsCisgICAgIjJuZC5PblRlc3RJdGVyYXRpb25FbmQoMCkiLAorICAgICIxc3QuT25UZXN0SXRlcmF0aW9uRW5kKDApIiwKKyAgICAiMXN0Lk9uVGVzdEl0ZXJhdGlvblN0YXJ0KDEpIiwKKyAgICAiMm5kLk9uVGVzdEl0ZXJhdGlvblN0YXJ0KDEpIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1NldFVwU3RhcnQiLAorICAgICJFbnZpcm9ubWVudDo6U2V0VXAiLAorICAgICIybmQuT25FbnZpcm9ubWVudHNTZXRVcEVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1NldFVwRW5kIiwKKyAgICAiMXN0Lk9uVGVzdENhc2VTdGFydCIsCisgICAgIjJuZC5PblRlc3RDYXNlU3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwVGVzdENhc2UiLAorICAgICIxc3QuT25UZXN0U3RhcnQiLAorICAgICIybmQuT25UZXN0U3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwIiwKKyAgICAiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIsCisgICAgIjFzdC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiMm5kLk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RFbmQiLAorICAgICIxc3QuT25UZXN0U3RhcnQiLAorICAgICIybmQuT25UZXN0U3RhcnQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlNldFVwIiwKKyAgICAiTGlzdGVuZXJUZXN0OjoqIFRlc3QgQm9keSIsCisgICAgIjFzdC5PblRlc3RQYXJ0UmVzdWx0IiwKKyAgICAiMm5kLk9uVGVzdFBhcnRSZXN1bHQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duIiwKKyAgICAiMm5kLk9uVGVzdEVuZCIsCisgICAgIjFzdC5PblRlc3RFbmQiLAorICAgICJMaXN0ZW5lclRlc3Q6OlRlYXJEb3duVGVzdENhc2UiLAorICAgICIybmQuT25UZXN0Q2FzZUVuZCIsCisgICAgIjFzdC5PblRlc3RDYXNlRW5kIiwKKyAgICAiMXN0Lk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCIsCisgICAgIjJuZC5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQiLAorICAgICJFbnZpcm9ubWVudDo6VGVhckRvd24iLAorICAgICIybmQuT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCIsCisgICAgIjFzdC5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kIiwKKyAgICAiMm5kLk9uVGVzdEl0ZXJhdGlvbkVuZCgxKSIsCisgICAgIjFzdC5PblRlc3RJdGVyYXRpb25FbmQoMSkiLAorICAgICIybmQuT25UZXN0UHJvZ3JhbUVuZCIsCisgICAgIjFzdC5PblRlc3RQcm9ncmFtRW5kIgorICB9OworICBWZXJpZnlSZXN1bHRzKGV2ZW50cywKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9ldmVudHMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGV4cGVjdGVkX2V2ZW50cykvc2l6ZW9mKGV4cGVjdGVkX2V2ZW50c1swXSkpOworCisgIC8vIFdlIG5lZWQgdG8gY2hlY2sgbWFudWFsbHkgZm9yIGFkIGhvYyB0ZXN0IGZhaWx1cmVzIHRoYXQgaGFwcGVuIGFmdGVyCisgIC8vIFJVTl9BTExfVEVTVFMgZmluaXNoZXMuCisgIGlmIChVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+RmFpbGVkKCkpCisgICAgcmV0X3ZhbCA9IDE7CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1tZXNzYWdlX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1tZXNzYWdlX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1MjM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYwpAQCAtMCwwICsxLDE1OSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyBmb3IgdGhlIE1lc3NhZ2UgY2xhc3MuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCit1c2luZyA6OnRlc3Rpbmc6Ok1lc3NhZ2U7CisKKy8vIFRlc3RzIHRoZSB0ZXN0aW5nOjpNZXNzYWdlIGNsYXNzCisKKy8vIFRlc3RzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorVEVTVChNZXNzYWdlVGVzdCwgRGVmYXVsdENvbnN0cnVjdG9yKSB7CisgIGNvbnN0IE1lc3NhZ2UgbXNnOworICBFWFBFQ1RfRVEoIiIsIG1zZy5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBjb3B5IGNvbnN0cnVjdG9yLgorVEVTVChNZXNzYWdlVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIGNvbnN0IE1lc3NhZ2UgbXNnMSgiSGVsbG8iKTsKKyAgY29uc3QgTWVzc2FnZSBtc2cyKG1zZzEpOworICBFWFBFQ1RfRVEoIkhlbGxvIiwgbXNnMi5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIGNvbnN0cnVjdGluZyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLgorVEVTVChNZXNzYWdlVGVzdCwgQ29uc3RydWN0c0Zyb21DU3RyaW5nKSB7CisgIE1lc3NhZ2UgbXNnKCJIZWxsbyIpOworICBFWFBFQ1RfRVEoIkhlbGxvIiwgbXNnLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgZmxvYXQuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zRmxvYXQpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcyA9IChNZXNzYWdlKCkgPDwgMS4yMzQ1NkYgPDwgIiAiIDw8IDIuMzQ1NjdGKS5HZXRTdHJpbmcoKTsKKyAgLy8gQm90aCBudW1iZXJzIHNob3VsZCBiZSBwcmludGVkIHdpdGggZW5vdWdoIHByZWNpc2lvbi4KKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIjEuMjM0NTYwIiwgcy5jX3N0cigpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIiAyLjM0NTY2OSIsIHMuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIGRvdWJsZS4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNEb3VibGUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcyA9IChNZXNzYWdlKCkgPDwgMTI2MDU3MDg4MC40NTU1NDk3IDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDEyNjA1NzIyNjUuMTk1NDUzNCkuR2V0U3RyaW5nKCk7CisgIC8vIEJvdGggbnVtYmVycyBzaG91bGQgYmUgcHJpbnRlZCB3aXRoIGVub3VnaCBwcmVjaXNpb24uCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICIxMjYwNTcwODgwLjQ1Iiwgcy5jX3N0cigpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIiAxMjYwNTcyMjY1LjE5Iiwgcy5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgbm9uLWNoYXIgcG9pbnRlci4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNQb2ludGVyKSB7CisgIGludCBuID0gMDsKKyAgaW50KiBwID0gJm47CisgIEVYUEVDVF9ORSgiKG51bGwpIiwgKE1lc3NhZ2UoKSA8PCBwKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIE5VTEwgbm9uLWNoYXIgcG9pbnRlci4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNOdWxsUG9pbnRlcikgeworICBpbnQqIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIihudWxsKSIsIChNZXNzYWdlKCkgPDwgcCkuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBDIHN0cmluZy4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNDU3RyaW5nKSB7CisgIEVYUEVDVF9FUSgiRm9vIiwgKE1lc3NhZ2UoKSA8PCAiRm9vIikuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSBOVUxMIEMgc3RyaW5nLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc051bGxDU3RyaW5nKSB7CisgIGNoYXIqIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIihudWxsKSIsIChNZXNzYWdlKCkgPDwgcCkuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgc3RkOjpzdHJpbmcuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zU3RyaW5nKSB7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcgc3RyKCJIZWxsbyIpOworICBFWFBFQ1RfRVEoIkhlbGxvIiwgKE1lc3NhZ2UoKSA8PCBzdHIpLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gb3V0cHV0IHN0cmluZ3MgY29udGFpbmluZyBlbWJlZGRlZCBOVUxzLgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc1N0cmluZ1dpdGhFbWJlZGRlZE5VTCkgeworICBjb25zdCBjaGFyIGNoYXJfYXJyYXlfd2l0aF9udWxbXSA9CisgICAgICAiSGVyZSdzIGEgTlVMXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciOworICBjb25zdCA6OnN0ZDo6c3RyaW5nIHN0cmluZ193aXRoX251bChjaGFyX2FycmF5X3dpdGhfbnVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcl9hcnJheV93aXRoX251bCkgLSAxKTsKKyAgRVhQRUNUX0VRKCJIZXJlJ3MgYSBOVUxcXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciLAorICAgICAgICAgICAgKE1lc3NhZ2UoKSA8PCBzdHJpbmdfd2l0aF9udWwpLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgTlVMIGNoYXIuCitURVNUKE1lc3NhZ2VUZXN0LCBTdHJlYW1zTlVMQ2hhcikgeworICBFWFBFQ1RfRVEoIlxcMCIsIChNZXNzYWdlKCkgPDwgJ1wwJykuR2V0U3RyaW5nKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgaW50LgorVEVTVChNZXNzYWdlVGVzdCwgU3RyZWFtc0ludCkgeworICBFWFBFQ1RfRVEoIjEyMyIsIChNZXNzYWdlKCkgPDwgMTIzKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIChlbmRsLCBlbmRzLCBhbmQgZmx1c2gpIGNhbiBiZQorLy8gc3RyZWFtZWQgdG8gTWVzc2FnZS4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNCYXNpY0lvTWFuaXApIHsKKyAgRVhQRUNUX0VRKCJMaW5lIDEuXG5BIE5VTCBjaGFyIFxcMCBpbiBsaW5lIDIuIiwKKyAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgIkxpbmUgMS4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJBIE5VTCBjaGFyICIgPDwgc3RkOjplbmRzIDw8IHN0ZDo6Zmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGluIGxpbmUgMi4iKS5HZXRTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3RzIE1lc3NhZ2U6OkdldFN0cmluZygpCitURVNUKE1lc3NhZ2VUZXN0LCBHZXRTdHJpbmcpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCAxIDw8ICIgbGFtYiI7CisgIEVYUEVDVF9FUSgiMSBsYW1iIiwgbXNnLkdldFN0cmluZygpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgTWVzc2FnZSBvYmplY3QgdG8gYW4gb3N0cmVhbS4KK1RFU1QoTWVzc2FnZVRlc3QsIFN0cmVhbXNUb09TdHJlYW0pIHsKKyAgTWVzc2FnZSBtc2coIkhlbGxvIik7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IG1zZzsKKyAgRVhQRUNUX0VRKCJIZWxsbyIsIHRlc3Rpbmc6OmludGVybmFsOjpTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3MpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIE1lc3NhZ2Ugb2JqZWN0IGRvZXNuJ3QgdGFrZSB1cCB0b28gbXVjaCBzdGFjayBzcGFjZS4KK1RFU1QoTWVzc2FnZVRlc3QsIERvZXNOb3RUYWtlVXBNdWNoU3RhY2tTcGFjZSkgeworICBFWFBFQ1RfTEUoc2l6ZW9mKE1lc3NhZ2UpLCAxNlUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg2ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Qtb3B0aW9uc190ZXN0LmNjCkBAIC0wLDAgKzEsMjE1IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIEdvb2dsZSBUZXN0IFVuaXRUZXN0T3B0aW9ucyB0ZXN0cworLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorLy8KKy8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgZnJvbSBndGVzdC5jYywgdG8gYXZvaWQgY2hhbmdpbmcgYnVpbGQgb3IKKy8vIG1ha2UtZmlsZXMgb24gV2luZG93cyBhbmQgb3RoZXIgcGxhdGZvcm1zLiBEbyBub3QgI2luY2x1ZGUgdGhpcyBmaWxlCisvLyBhbnl3aGVyZSBlbHNlIQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworLy8gVHVybnMgdGhlIGdpdmVuIHJlbGF0aXZlIHBhdGggaW50byBhbiBhYnNvbHV0ZSBwYXRoLgorRmlsZVBhdGggR2V0QWJzb2x1dGVQYXRoT2YoY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKKyAgcmV0dXJuIEZpbGVQYXRoOjpDb25jYXRQYXRocyhGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpLCByZWxhdGl2ZV9wYXRoKTsKK30KKworLy8gVGVzdGluZyBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdC9HZXRPdXRwdXRGaWxlLgorCitURVNUKFhtbE91dHB1dFRlc3QsIEdldE91dHB1dEZvcm1hdERlZmF1bHQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgIEVYUEVDVF9TVFJFUSgiIiwgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGb3JtYXQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbDpmaWxlbmFtZSI7CisgIEVYUEVDVF9TVFJFUSgieG1sIiwgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKS5jX3N0cigpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlRGVmYXVsdCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKKyAgRVhQRUNUX0VRKEdldEFic29sdXRlUGF0aE9mKEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVChYbWxPdXRwdXRUZXN0LCBHZXRPdXRwdXRGaWxlU2luZ2xlRmlsZSkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmZpbGVuYW1lLmFiYyI7CisgIEVYUEVDVF9FUShHZXRBYnNvbHV0ZVBhdGhPZihGaWxlUGF0aCgiZmlsZW5hbWUuYWJjIikpLnN0cmluZygpLAorICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSk7Cit9CisKK1RFU1QoWG1sT3V0cHV0VGVzdCwgR2V0T3V0cHV0RmlsZUZyb21EaXJlY3RvcnlQYXRoKSB7CisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6cGF0aCIgR1RFU1RfUEFUSF9TRVBfOworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfZmlsZSA9CisgICAgICBHZXRBYnNvbHV0ZVBhdGhPZigKKyAgICAgICAgICBGaWxlUGF0aChzdGQ6OnN0cmluZygicGF0aCIpICsgR1RFU1RfUEFUSF9TRVBfICsKKyAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArICIueG1sIikpLnN0cmluZygpOworICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2ZpbGUgPQorICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZWxzZQorICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2VuZGlmCit9CisKK1RFU1QoT3V0cHV0RmlsZUhlbHBlcnNUZXN0LCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhlX3N0ciA9IEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLnN0cmluZygpOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgY29uc3QgYm9vbCBzdWNjZXNzID0KKyAgICAgIF9zdHJjbXBpKCJndGVzdC1vcHRpb25zX3Rlc3QiLCBleGVfc3RyLmNfc3RyKCkpID09IDAgfHwKKyAgICAgIF9zdHJjbXBpKCJndGVzdC1vcHRpb25zLWV4X3Rlc3QiLCBleGVfc3RyLmNfc3RyKCkpID09IDAgfHwKKyAgICAgIF9zdHJjbXBpKCJndGVzdF9hbGxfdGVzdCIsIGV4ZV9zdHIuY19zdHIoKSkgPT0gMCB8fAorICAgICAgX3N0cmNtcGkoImd0ZXN0X2RsbF90ZXN0IiwgZXhlX3N0ci5jX3N0cigpKSA9PSAwOworI2Vsc2UKKyAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbW92ZSB0aGUgaGFyZC1jb2RlZCAibHQtIiBwcmVmaXggd2hlbgorICAvLyAgIENoYW5kbGVyIENhcnJ1dGgncyBsaWJ0b29sIHJlcGxhY2VtZW50IGlzIHJlYWR5LgorICBjb25zdCBib29sIHN1Y2Nlc3MgPQorICAgICAgZXhlX3N0ciA9PSAiZ3Rlc3Qtb3B0aW9uc190ZXN0IiB8fAorICAgICAgZXhlX3N0ciA9PSAiZ3Rlc3RfYWxsX3Rlc3QiIHx8CisgICAgICBleGVfc3RyID09ICJsdC1ndGVzdF9hbGxfdGVzdCIgfHwKKyAgICAgIGV4ZV9zdHIgPT0gImd0ZXN0X2RsbF90ZXN0IjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICBpZiAoIXN1Y2Nlc3MpCisgICAgRkFJTCgpIDw8ICJHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSByZXR1cm5zICIgPDwgZXhlX3N0cjsKK30KKworY2xhc3MgWG1sT3V0cHV0Q2hhbmdlRGlyVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBvcmlnaW5hbF93b3JraW5nX2Rpcl8gPSBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpOworICAgIHBvc2l4OjpDaERpcigiLi4iKTsKKyAgICAvLyBUaGlzIHdpbGwgbWFrZSB0aGUgdGVzdCBmYWlsIGlmIHJ1biBmcm9tIHRoZSByb290IGRpcmVjdG9yeS4KKyAgICBFWFBFQ1RfTkUob3JpZ2luYWxfd29ya2luZ19kaXJfLnN0cmluZygpLAorICAgICAgICAgICAgICBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpLnN0cmluZygpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwb3NpeDo6Q2hEaXIob3JpZ2luYWxfd29ya2luZ19kaXJfLnN0cmluZygpLmNfc3RyKCkpOworICB9CisKKyAgRmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOworfTsKKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aERlZmF1bHQpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aERlZmF1bHRYTUwpIHsKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0gInhtbCI7CisgIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJ0ZXN0X2RldGFpbC54bWwiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aFJlbGF0aXZlRmlsZSkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOmZpbGVuYW1lLmFiYyI7CisgIEVYUEVDVF9FUShGaWxlUGF0aDo6Q29uY2F0UGF0aHMob3JpZ2luYWxfd29ya2luZ19kaXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQYXRoKCJmaWxlbmFtZS5hYmMiKSkuc3RyaW5nKCksCisgICAgICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpKTsKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aFJlbGF0aXZlUGF0aCkgeworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOnBhdGgiIEdURVNUX1BBVEhfU0VQXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfb3V0cHV0X2ZpbGUgPQorICAgICAgRmlsZVBhdGg6OkNvbmNhdFBhdGhzKAorICAgICAgICAgIG9yaWdpbmFsX3dvcmtpbmdfZGlyXywKKyAgICAgICAgICBGaWxlUGF0aChzdGQ6OnN0cmluZygicGF0aCIpICsgR1RFU1RfUEFUSF9TRVBfICsKKyAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArICIueG1sIikpLnN0cmluZygpOworICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2ZpbGUgPQorICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUuY19zdHIoKSwgb3V0cHV0X2ZpbGUuY19zdHIoKSk7CisjZWxzZQorICBFWFBFQ1RfRVEoZXhwZWN0ZWRfb3V0cHV0X2ZpbGUsIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2VuZGlmCit9CisKK1RFU1RfRihYbWxPdXRwdXRDaGFuZ2VEaXJUZXN0LCBQcmVzZXJ2ZU9yaWdpbmFsV29ya2luZ0RpcldpdGhBYnNvbHV0ZUZpbGUpIHsKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6YzpcXHRtcFxcZmlsZW5hbWUuYWJjIjsKKyAgRVhQRUNUX0VRKEZpbGVQYXRoKCJjOlxcdG1wXFxmaWxlbmFtZS5hYmMiKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkpOworI2Vsc2UKKyAgR1RFU1RfRkxBRyhvdXRwdXQpID0ieG1sOi90bXAvZmlsZW5hbWUuYWJjIjsKKyAgRVhQRUNUX0VRKEZpbGVQYXRoKCIvdG1wL2ZpbGVuYW1lLmFiYyIpLnN0cmluZygpLAorICAgICAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSk7CisjZW5kaWYKK30KKworVEVTVF9GKFhtbE91dHB1dENoYW5nZURpclRlc3QsIFByZXNlcnZlT3JpZ2luYWxXb3JraW5nRGlyV2l0aEFic29sdXRlUGF0aCkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9ICJjOlxcdG1wXFwiOworI2Vsc2UKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9ICIvdG1wLyI7CisjZW5kaWYKKworICBHVEVTVF9GTEFHKG91dHB1dCkgPSAieG1sOiIgKyBwYXRoOworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9vdXRwdXRfZmlsZSA9CisgICAgICBwYXRoICsgR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCkuc3RyaW5nKCkgKyAiLnhtbCI7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZmlsZSA9CisgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpOworCisjaWYgR1RFU1RfT1NfV0lORE9XUworICBFWFBFQ1RfU1RSQ0FTRUVRKGV4cGVjdGVkX291dHB1dF9maWxlLmNfc3RyKCksIG91dHB1dF9maWxlLmNfc3RyKCkpOworI2Vsc2UKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX291dHB1dF9maWxlLCBvdXRwdXRfZmlsZS5jX3N0cigpKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3QyX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzgyZmUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC1wYXJhbS10ZXN0Ml90ZXN0LmNjCkBAIC0wLDAgKzEsNjUgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBUZXN0IGl0c2VsZi4gIFRoaXMgdmVyaWZpZXMgdGhhdCB0aGUgYmFzaWMgY29uc3RydWN0cyBvZgorLy8gR29vZ2xlIFRlc3Qgd29yay4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjsKKworLy8gVGVzdHMgdGhhdCBnZW5lcmF0b3JzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdAorLy8gYXJlIGZ1bmN0aW9uYWwuIFRoZSB0ZXN0IHVzaW5nIGV4dGVybl9nZW4gaXMgZGVmaW5lZAorLy8gaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjLgorUGFyYW1HZW5lcmF0b3I8aW50PiBleHRlcm5fZ2VuID0gVmFsdWVzKDMzKTsKKworLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBkZWZpbmVkIGluIG9uZSB0cmFuc2xhdGlvbiB1bml0CisvLyBhbmQgaW5zdGFudGlhdGVkIGluIGFub3RoZXIuIFRoZSB0ZXN0IGlzIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjCisvLyBhbmQgRXh0ZXJuYWxJbnN0YW50aWF0aW9uVGVzdCBmaXh0dXJlIGNsYXNzIGlzIGRlZmluZWQgaW4KKy8vIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oLgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTXVsdGlwbGVzT2YzMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsSW5zdGFudGlhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMzMsIDY2KSk7CisKKy8vIFRlc3RzIHRoYXQgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUgaW5zdGFudGlhdGVkCisvLyBpbiBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cy4gQW5vdGhlciBpbnN0YW50aWF0aW9uIGlzIGRlZmluZWQKKy8vIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyBhbmQgSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0CisvLyBmaXh0dXJlIGlzIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYWlvblVuaXRzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg0MiozLCA0Mio0LCA0Mio1KSk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI3OGJiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmNjCkBAIC0wLDAgKzEsMTA1NSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmLiBUaGlzIGZpbGUgdmVyaWZpZXMgdGhhdCB0aGUgcGFyYW1ldGVyCisvLyBnZW5lcmF0b3JzIG9iamVjdHMgcHJvZHVjZSBjb3JyZWN0IHBhcmFtZXRlciBzZXF1ZW5jZXMgYW5kIHRoYXQKKy8vIEdvb2dsZSBUZXN0IHJ1bnRpbWUgaW5zdGFudGlhdGVzIGNvcnJlY3QgdGVzdHMgZnJvbSB0aG9zZSBzZXF1ZW5jZXMuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworIyBpbmNsdWRlIDxhbGdvcml0aG0+CisjIGluY2x1ZGUgPGlvc3RyZWFtPgorIyBpbmNsdWRlIDxsaXN0PgorIyBpbmNsdWRlIDxzc3RyZWFtPgorIyBpbmNsdWRlIDxzdHJpbmc+CisjIGluY2x1ZGUgPHZlY3Rvcj4KKworLy8gVG8gaW5jbHVkZSBndGVzdC1pbnRlcm5hbC1pbmwuaC4KKyMgZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjIGluY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIgIC8vIGZvciBVbml0VGVzdE9wdGlvbnMKKyMgdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyMgaW5jbHVkZSAidGVzdC9ndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaCIKKwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKK3VzaW5nIDo6c3RkOjpzb3J0OworCit1c2luZyA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudDsKK3VzaW5nIDo6dGVzdGluZzo6Qm9vbDsKK3VzaW5nIDo6dGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIDo6dGVzdGluZzo6UmFuZ2U7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW07Cit1c2luZyA6OnRlc3Rpbmc6OlZhbHVlczsKK3VzaW5nIDo6dGVzdGluZzo6VmFsdWVzSW47CisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKK3VzaW5nIDo6dGVzdGluZzo6Q29tYmluZTsKK3VzaW5nIDo6dGVzdGluZzo6Z2V0OwordXNpbmcgOjp0ZXN0aW5nOjptYWtlX3R1cGxlOwordXNpbmcgOjp0ZXN0aW5nOjp0dXBsZTsKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOworCisvLyBQcmludHMgYSB2YWx1ZSB0byBhIHN0cmluZy4KKy8vCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVtb3ZlIFByaW50VmFsdWUoKSB3aGVuIHdlIG1vdmUgbWF0Y2hlcnMgYW5kCisvLyBFWFBFQ1RfVEhBVCgpIGZyb20gR29vZ2xlIE1vY2sgdG8gR29vZ2xlIFRlc3QuICBBdCB0aGF0IHRpbWUsIHdlCisvLyBjYW4gd3JpdGUgRVhQRUNUX1RIQVQoeCwgRXEoeSkpIHRvIGNvbXBhcmUgdHdvIHR1cGxlcyB4IGFuZCB5LCBhcworLy8gRVhQRUNUX1RIQVQoKSBhbmQgdGhlIG1hdGNoZXJzIGtub3cgaG93IHRvIHByaW50IHR1cGxlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorOjpzdGQ6OnN0cmluZyBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBzdHJlYW0gPDwgdmFsdWU7CisgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKKworLy8gVGhlc2Ugb3ZlcmxvYWRzIGFsbG93IHByaW50aW5nIHR1cGxlcyBpbiBvdXIgdGVzdHMuICBXZSBjYW5ub3QKKy8vIGRlZmluZSBhbiBvcGVyYXRvcjw8IGZvciB0dXBsZXMsIGFzIHRoYXQgZGVmaW5pdGlvbiBuZWVkcyB0byBiZSBpbgorLy8gdGhlIHN0ZCBuYW1lc3BhY2UgaW4gb3JkZXIgdG8gYmUgcGlja2VkIHVwIGJ5IEdvb2dsZSBUZXN0IHZpYQorLy8gQXJndW1lbnQtRGVwZW5kZW50IExvb2t1cCwgeWV0IGRlZmluaW5nIGFueXRoaW5nIGluIHRoZSBzdGQKKy8vIG5hbWVzcGFjZSBpbiBub24tU1RMIGNvZGUgaXMgdW5kZWZpbmVkIGJlaGF2aW9yLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorOjpzdGQ6OnN0cmluZyBQcmludFZhbHVlKGNvbnN0IHR1cGxlPFQxLCBUMj4mIHZhbHVlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBzdHJlYW0gPDwgIigiIDw8IGdldDwwPih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8MT4odmFsdWUpIDw8ICIpIjsKKyAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Cis6OnN0ZDo6c3RyaW5nIFByaW50VmFsdWUoY29uc3QgdHVwbGU8VDEsIFQyLCBUMz4mIHZhbHVlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBzdHJlYW0gPDwgIigiIDw8IGdldDwwPih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8MT4odmFsdWUpCisgICAgICAgICA8PCAiLCAiPDwgZ2V0PDI+KHZhbHVlKSA8PCAiKSI7CisgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KKzo6c3RkOjpzdHJpbmcgUHJpbnRWYWx1ZSgKKyAgICBjb25zdCB0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+JiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgc3RyZWFtIDw8ICIoIiA8PCBnZXQ8MD4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDE+KHZhbHVlKQorICAgICAgICAgPDwgIiwgIjw8IGdldDwyPih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8Mz4odmFsdWUpCisgICAgICAgICA8PCAiLCAiPDwgZ2V0PDQ+KHZhbHVlKSA8PCAiLCAiIDw8IGdldDw1Pih2YWx1ZSkKKyAgICAgICAgIDw8ICIsICI8PCBnZXQ8Nj4odmFsdWUpIDw8ICIsICIgPDwgZ2V0PDc+KHZhbHVlKQorICAgICAgICAgPDwgIiwgIjw8IGdldDw4Pih2YWx1ZSkgPDwgIiwgIiA8PCBnZXQ8OT4odmFsdWUpIDw8ICIpIjsKKyAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKK30KKworIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKKworLy8gVmVyaWZpZXMgdGhhdCBhIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgZ2VuZXJhdG9yIGFuZCBhY2Nlc3NlZAorLy8gdmlhIHRoZSBpdGVyYXRvciBvYmplY3QgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgb25lIHVzaW5nIEdvb2dsZSBUZXN0CisvLyBhc3NlcnRpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgordm9pZCBWZXJpZnlHZW5lcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3I8VD4mIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQgKCZleHBlY3RlZF92YWx1ZXMpW05dKSB7CisgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ+OjppdGVyYXRvciBpdCA9IGdlbmVyYXRvci5iZWdpbigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE47ICsraSkgeworICAgIEFTU0VSVF9GQUxTRShpdCA9PSBnZW5lcmF0b3IuZW5kKCkpCisgICAgICAgIDw8ICJBdCBlbGVtZW50ICIgPDwgaSA8PCAiIHdoZW4gYWNjZXNzaW5nIHZpYSBhbiBpdGVyYXRvciAiCisgICAgICAgIDw8ICJjcmVhdGVkIHdpdGggdGhlIGNvcHkgY29uc3RydWN0b3IuXG4iOworICAgIC8vIFdlIGNhbm5vdCB1c2UgRVhQRUNUX0VRKCkgaGVyZSBhcyB0aGUgdmFsdWVzIG1heSBiZSB0dXBsZXMsCisgICAgLy8gd2hpY2ggZG9uJ3Qgc3VwcG9ydCA8PC4KKyAgICBFWFBFQ1RfVFJVRShleHBlY3RlZF92YWx1ZXNbaV0gPT0gKml0KQorICAgICAgICA8PCAid2hlcmUgaSBpcyAiIDw8IGkKKyAgICAgICAgPDwgIiwgZXhwZWN0ZWRfdmFsdWVzW2ldIGlzICIgPDwgUHJpbnRWYWx1ZShleHBlY3RlZF92YWx1ZXNbaV0pCisgICAgICAgIDw8ICIsICppdCBpcyAiIDw8IFByaW50VmFsdWUoKml0KQorICAgICAgICA8PCAiLCBhbmQgJ2l0JyBpcyBhbiBpdGVyYXRvciBjcmVhdGVkIHdpdGggdGhlIGNvcHkgY29uc3RydWN0b3IuXG4iOworICAgIGl0Kys7CisgIH0KKyAgRVhQRUNUX1RSVUUoaXQgPT0gZ2VuZXJhdG9yLmVuZCgpKQorICAgICAgICA8PCAiQXQgdGhlIHByZXN1bWVkIGVuZCBvZiBzZXF1ZW5jZSB3aGVuIGFjY2Vzc2luZyB2aWEgYW4gaXRlcmF0b3IgIgorICAgICAgICA8PCAiY3JlYXRlZCB3aXRoIHRoZSBjb3B5IGNvbnN0cnVjdG9yLlxuIjsKKworICAvLyBUZXN0IHRoZSBpdGVyYXRvciBhc3NpZ25tZW50LiBUaGUgZm9sbG93aW5nIGxpbmVzIHZlcmlmeSB0aGF0CisgIC8vIHRoZSBzZXF1ZW5jZSBhY2Nlc3NlZCB2aWEgYW4gaXRlcmF0b3IgaW5pdGlhbGl6ZWQgdmlhIHRoZQorICAvLyBhc3NpZ25tZW50IG9wZXJhdG9yIChhcyBvcHBvc2VkIHRvIGEgY29weSBjb25zdHJ1Y3RvcikgbWF0Y2hlcworICAvLyBqdXN0IHRoZSBzYW1lLgorICBpdCA9IGdlbmVyYXRvci5iZWdpbigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE47ICsraSkgeworICAgIEFTU0VSVF9GQUxTRShpdCA9PSBnZW5lcmF0b3IuZW5kKCkpCisgICAgICAgIDw8ICJBdCBlbGVtZW50ICIgPDwgaSA8PCAiIHdoZW4gYWNjZXNzaW5nIHZpYSBhbiBpdGVyYXRvciAiCisgICAgICAgIDw8ICJjcmVhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IuXG4iOworICAgIEVYUEVDVF9UUlVFKGV4cGVjdGVkX3ZhbHVlc1tpXSA9PSAqaXQpCisgICAgICAgIDw8ICJ3aGVyZSBpIGlzICIgPDwgaQorICAgICAgICA8PCAiLCBleHBlY3RlZF92YWx1ZXNbaV0gaXMgIiA8PCBQcmludFZhbHVlKGV4cGVjdGVkX3ZhbHVlc1tpXSkKKyAgICAgICAgPDwgIiwgKml0IGlzICIgPDwgUHJpbnRWYWx1ZSgqaXQpCisgICAgICAgIDw8ICIsIGFuZCAnaXQnIGlzIGFuIGl0ZXJhdG9yIGNyZWF0ZWQgd2l0aCB0aGUgY29weSBjb25zdHJ1Y3Rvci5cbiI7CisgICAgaXQrKzsKKyAgfQorICBFWFBFQ1RfVFJVRShpdCA9PSBnZW5lcmF0b3IuZW5kKCkpCisgICAgICAgIDw8ICJBdCB0aGUgcHJlc3VtZWQgZW5kIG9mIHNlcXVlbmNlIHdoZW4gYWNjZXNzaW5nIHZpYSBhbiBpdGVyYXRvciAiCisgICAgICAgIDw8ICJjcmVhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IuXG4iOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVmVyaWZ5R2VuZXJhdG9ySXNFbXB0eShjb25zdCBQYXJhbUdlbmVyYXRvcjxUPiYgZ2VuZXJhdG9yKSB7CisgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ+OjppdGVyYXRvciBpdCA9IGdlbmVyYXRvci5iZWdpbigpOworICBFWFBFQ1RfVFJVRShpdCA9PSBnZW5lcmF0b3IuZW5kKCkpOworCisgIGl0ID0gZ2VuZXJhdG9yLmJlZ2luKCk7CisgIEVYUEVDVF9UUlVFKGl0ID09IGdlbmVyYXRvci5lbmQoKSk7Cit9CisKKy8vIEdlbmVyYXRvciB0ZXN0cy4gVGhleSB0ZXN0IHRoYXQgZWFjaCBvZiB0aGUgcHJvdmlkZWQgZ2VuZXJhdG9yIGZ1bmN0aW9ucworLy8gZ2VuZXJhdGVzIGFuIGV4cGVjdGVkIHNlcXVlbmNlIG9mIHZhbHVlcy4gVGhlIGdlbmVyYWwgdGVzdCBwYXR0ZXJuCisvLyBpbnN0YW50aWF0ZXMgYSBnZW5lcmF0b3IgdXNpbmcgb25lIG9mIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb25zLAorLy8gY2hlY2tzIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yIHVzaW5nIGl0cyBpdGVyYXRvciBBUEksCisvLyBhbmQgdGhlbiByZXNldHMgdGhlIGl0ZXJhdG9yIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VxdWVuY2UKKy8vIGFuZCBjaGVja3MgdGhlIHNlcXVlbmNlIGFnYWluLgorCisvLyBUZXN0cyB0aGF0IGl0ZXJhdG9ycyBwcm9kdWNlZCBieSBnZW5lcmF0b3IgZnVuY3Rpb25zIGNvbmZvcm0gdG8gdGhlCisvLyBGb3J3YXJkSXRlcmF0b3IgY29uY2VwdC4KK1RFU1QoSXRlcmF0b3JUZXN0LCBQYXJhbUl0ZXJhdG9yQ29uZm9ybXNUb0ZvcndhcmRJdGVyYXRvckNvbmNlcHQpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBSYW5nZSgwLCAxMCk7CisgIFBhcmFtR2VuZXJhdG9yPGludD46Oml0ZXJhdG9yIGl0ID0gZ2VuLmJlZ2luKCk7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBpdGVyYXRvciBpbml0aWFsaXphdGlvbiB3b3JrcyBhcyBleHBlY3RlZC4KKyAgUGFyYW1HZW5lcmF0b3I8aW50Pjo6aXRlcmF0b3IgaXQyID0gaXQ7CisgIEVYUEVDVF9UUlVFKCppdCA9PSAqaXQyKSA8PCAiSW5pdGlhbGl6ZWQgaXRlcmF0b3JzIG11c3QgcG9pbnQgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJlbGVtZW50IHNhbWUgYXMgaXRzIHNvdXJjZSBwb2ludHMgdG8iOworCisgIC8vIFZlcmlmaWVzIHRoYXQgaXRlcmF0b3IgYXNzaWdubWVudCB3b3JrcyBhcyBleHBlY3RlZC4KKyAgaXQrKzsKKyAgRVhQRUNUX0ZBTFNFKCppdCA9PSAqaXQyKTsKKyAgaXQyID0gaXQ7CisgIEVYUEVDVF9UUlVFKCppdCA9PSAqaXQyKSA8PCAiQXNzaWduZWQgaXRlcmF0b3JzIG11c3QgcG9pbnQgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJlbGVtZW50IHNhbWUgYXMgaXRzIHNvdXJjZSBwb2ludHMgdG8iOworCisgIC8vIFZlcmlmaWVzIHRoYXQgcHJlZml4IG9wZXJhdG9yKysoKSByZXR1cm5zICp0aGlzLgorICBFWFBFQ1RfRVEoJml0LCAmKCsraXQpKSA8PCAiUmVzdWx0IG9mIHRoZSBwcmVmaXggb3BlcmF0b3IrKyBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlZmVyIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QiOworCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHJlc3VsdCBvZiB0aGUgcG9zdGZpeCBvcGVyYXRvcisrIHBvaW50cyB0byB0aGUgdmFsdWUKKyAgLy8gcG9pbnRlZCB0byBieSB0aGUgb3JpZ2luYWwgaXRlcmF0b3IuCisgIGludCBvcmlnaW5hbF92YWx1ZSA9ICppdDsgIC8vIEhhdmUgdG8gY29tcHV0ZSBpdCBvdXRzaWRlIG9mIG1hY3JvIGNhbGwgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5hZmZlY3RlZCBieSB0aGUgcGFyYW1ldGVyIGV2YWx1YXRpb24gb3JkZXIuCisgIEVYUEVDVF9FUShvcmlnaW5hbF92YWx1ZSwgKihpdCsrKSk7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBwcmVmaXggYW5kIHBvc3RmaXggb3BlcmF0b3IrKygpIGFkdmFuY2UgYW4gaXRlcmF0b3IKKyAgLy8gYWxsIHRoZSBzYW1lLgorICBpdDIgPSBpdDsKKyAgaXQrKzsKKyAgKytpdDI7CisgIEVYUEVDVF9UUlVFKCppdCA9PSAqaXQyKTsKK30KKworLy8gVGVzdHMgdGhhdCBSYW5nZSgpIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKFJhbmdlVGVzdCwgSW50UmFuZ2VXaXRoRGVmYXVsdFN0ZXApIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBSYW5nZSgwLCAzKTsKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezAsIDEsIDJ9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBFZGdlIGNhc2UuIFRlc3RzIHRoYXQgUmFuZ2UoKSBnZW5lcmF0ZXMgdGhlIHNpbmdsZSBlbGVtZW50IHNlcXVlbmNlCisvLyBhcyBleHBlY3RlZCB3aGVuIHByb3ZpZGVkIHdpdGggcmFuZ2UgbGltaXRzIHRoYXQgYXJlIGVxdWFsLgorVEVTVChSYW5nZVRlc3QsIEludFJhbmdlU2luZ2xlVmFsdWUpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBSYW5nZSgwLCAxKTsKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezB9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBFZGdlIGNhc2UuIFRlc3RzIHRoYXQgUmFuZ2UoKSB3aXRoIGdlbmVyYXRlcyBlbXB0eSBzZXF1ZW5jZSB3aGVuCisvLyBzdXBwbGllZCB3aXRoIGFuIGVtcHR5IHJhbmdlLgorVEVTVChSYW5nZVRlc3QsIEludFJhbmdlRW1wdHkpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBSYW5nZSgwLCAwKTsKKyAgVmVyaWZ5R2VuZXJhdG9ySXNFbXB0eShnZW4pOworfQorCisvLyBUZXN0cyB0aGF0IFJhbmdlKCkgd2l0aCBjdXN0b20gc3RlcCAoZ3JlYXRlciB0aGVuIG9uZSkgZ2VuZXJhdGVzCisvLyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKFJhbmdlVGVzdCwgSW50UmFuZ2VXaXRoQ3VzdG9tU3RlcCkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFJhbmdlKDAsIDksIDMpOworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MCwgMywgNn07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUmFuZ2UoKSB3aXRoIGN1c3RvbSBzdGVwIChncmVhdGVyIHRoZW4gb25lKSBnZW5lcmF0ZXMKKy8vIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgZG9lcyBub3QgZmFsbCBvbiB0aGUKKy8vIHVwcGVyIHJhbmdlIGxpbWl0LiBTZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5IFJhbmdlKCkgbXVzdCBub3QgaGF2ZQorLy8gZWxlbWVudHMgYmV5b25kIHRoZSByYW5nZSBsaW1pdHMuCitURVNUKFJhbmdlVGVzdCwgSW50UmFuZ2VXaXRoQ3VzdG9tU3RlcE92ZXJVcHBlckJvdW5kKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gUmFuZ2UoMCwgNCwgMyk7CisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHswLCAzfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBSYW5nZSB3b3JrcyB3aXRoIHVzZXItZGVmaW5lZCB0eXBlcyB0aGF0IGRlZmluZQorLy8gY29weSBjb25zdHJ1Y3Rvciwgb3BlcmF0b3I9KCksIG9wZXJhdG9yKygpLCBhbmQgb3BlcmF0b3I8KCkuCitjbGFzcyBEb2dBZGRlciB7CisgcHVibGljOgorICBleHBsaWNpdCBEb2dBZGRlcihjb25zdCBjaGFyKiBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorICBEb2dBZGRlcihjb25zdCBEb2dBZGRlciYgb3RoZXIpIDogdmFsdWVfKG90aGVyLnZhbHVlXy5jX3N0cigpKSB7fQorCisgIERvZ0FkZGVyIG9wZXJhdG9yPShjb25zdCBEb2dBZGRlciYgb3RoZXIpIHsKKyAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisgICAgICB2YWx1ZV8gPSBvdGhlci52YWx1ZV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIERvZ0FkZGVyIG9wZXJhdG9yKyhjb25zdCBEb2dBZGRlciYgb3RoZXIpIGNvbnN0IHsKKyAgICBNZXNzYWdlIG1zZzsKKyAgICBtc2cgPDwgdmFsdWVfLmNfc3RyKCkgPDwgb3RoZXIudmFsdWVfLmNfc3RyKCk7CisgICAgcmV0dXJuIERvZ0FkZGVyKG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBEb2dBZGRlciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfIDwgb3RoZXIudmFsdWVfOworICB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgdmFsdWVfOworfTsKKworVEVTVChSYW5nZVRlc3QsIFdvcmtzV2l0aEFDdXN0b21UeXBlKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPERvZ0FkZGVyPiBnZW4gPQorICAgICAgUmFuZ2UoRG9nQWRkZXIoImNhdCIpLCBEb2dBZGRlcigiY2F0ZG9nZG9nIiksIERvZ0FkZGVyKCJkb2ciKSk7CisgIFBhcmFtR2VuZXJhdG9yPERvZ0FkZGVyPjo6aXRlcmF0b3IgaXQgPSBnZW4uYmVnaW4oKTsKKworICBBU1NFUlRfRkFMU0UoaXQgPT0gZ2VuLmVuZCgpKTsKKyAgRVhQRUNUX1NUUkVRKCJjYXQiLCBpdC0+dmFsdWUoKS5jX3N0cigpKTsKKworICBBU1NFUlRfRkFMU0UoKytpdCA9PSBnZW4uZW5kKCkpOworICBFWFBFQ1RfU1RSRVEoImNhdGRvZyIsIGl0LT52YWx1ZSgpLmNfc3RyKCkpOworCisgIEVYUEVDVF9UUlVFKCsraXQgPT0gZ2VuLmVuZCgpKTsKK30KKworY2xhc3MgSW50V3JhcHBlciB7CisgcHVibGljOgorICBleHBsaWNpdCBJbnRXcmFwcGVyKGludCBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorICBJbnRXcmFwcGVyKGNvbnN0IEludFdyYXBwZXImIG90aGVyKSA6IHZhbHVlXyhvdGhlci52YWx1ZV8pIHt9CisKKyAgSW50V3JhcHBlciBvcGVyYXRvcj0oY29uc3QgSW50V3JhcHBlciYgb3RoZXIpIHsKKyAgICB2YWx1ZV8gPSBvdGhlci52YWx1ZV87CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vIG9wZXJhdG9yKygpIGFkZHMgYSBkaWZmZXJlbnQgdHlwZS4KKyAgSW50V3JhcHBlciBvcGVyYXRvcisoaW50IG90aGVyKSBjb25zdCB7IHJldHVybiBJbnRXcmFwcGVyKHZhbHVlXyArIG90aGVyKTsgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBJbnRXcmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8gPCBvdGhlci52YWx1ZV87CisgIH0KKyAgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICBpbnQgdmFsdWVfOworfTsKKworVEVTVChSYW5nZVRlc3QsIFdvcmtzV2l0aEFDdXN0b21UeXBlV2l0aERpZmZlcmVudEluY3JlbWVudFR5cGUpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8SW50V3JhcHBlcj4gZ2VuID0gUmFuZ2UoSW50V3JhcHBlcigwKSwgSW50V3JhcHBlcigyKSk7CisgIFBhcmFtR2VuZXJhdG9yPEludFdyYXBwZXI+OjppdGVyYXRvciBpdCA9IGdlbi5iZWdpbigpOworCisgIEFTU0VSVF9GQUxTRShpdCA9PSBnZW4uZW5kKCkpOworICBFWFBFQ1RfRVEoMCwgaXQtPnZhbHVlKCkpOworCisgIEFTU0VSVF9GQUxTRSgrK2l0ID09IGdlbi5lbmQoKSk7CisgIEVYUEVDVF9FUSgxLCBpdC0+dmFsdWUoKSk7CisKKyAgRVhQRUNUX1RSVUUoKytpdCA9PSBnZW4uZW5kKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFZhbHVlc0luKCkgd2l0aCBhbiBhcnJheSBwYXJhbWV0ZXIgZ2VuZXJhdGVzCisvLyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5BcnJheSkgeworICBpbnQgYXJyYXlbXSA9IHszLCA1LCA4fTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbihhcnJheSk7CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGFycmF5KTsKK30KKworLy8gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIHdpdGggYSBjb25zdCBhcnJheSBwYXJhbWV0ZXIgZ2VuZXJhdGVzCisvLyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5Db25zdEFycmF5KSB7CisgIGNvbnN0IGludCBhcnJheVtdID0gezMsIDUsIDh9OworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKGFycmF5KTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgYXJyYXkpOworfQorCisvLyBFZGdlIGNhc2UuIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSB3aXRoIGFuIGFycmF5IHBhcmFtZXRlciBjb250YWluaW5nIGEKKy8vIHNpbmdsZSBlbGVtZW50IGdlbmVyYXRlcyB0aGUgc2luZ2xlIGVsZW1lbnQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5TaW5nbGVFbGVtZW50QXJyYXkpIHsKKyAgaW50IGFycmF5W10gPSB7NDJ9OworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKGFycmF5KTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgYXJyYXkpOworfQorCisvLyBUZXN0cyB0aGF0IFZhbHVlc0luKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBmb3IgYW4gU1RMCisvLyBjb250YWluZXIgKHZlY3RvcikuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5WZWN0b3IpIHsKKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGludD4gQ29udGFpbmVyVHlwZTsKKyAgQ29udGFpbmVyVHlwZSB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2soMyk7CisgIHZhbHVlcy5wdXNoX2JhY2soNSk7CisgIHZhbHVlcy5wdXNoX2JhY2soOCk7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4odmFsdWVzKTsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MywgNSwgOH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVmFsdWVzSW4oKSBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHNlcXVlbmNlLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luSXRlcmF0b3JSYW5nZSkgeworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8aW50PiBDb250YWluZXJUeXBlOworICBDb250YWluZXJUeXBlIHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjaygzKTsKKyAgdmFsdWVzLnB1c2hfYmFjayg1KTsKKyAgdmFsdWVzLnB1c2hfYmFjayg4KTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXNJbih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKworICBjb25zdCBpbnQgZXhwZWN0ZWRfdmFsdWVzW10gPSB7MywgNSwgOH07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBWYWx1ZXNJbigpIHByb3ZpZGVkIHdpdGggYW4gaXRlcmF0b3IgcmFuZ2Ugc3BlY2lmeWluZyBhCisvLyBzaW5nbGUgdmFsdWUgZ2VuZXJhdGVzIGEgc2luZ2xlLWVsZW1lbnQgc2VxdWVuY2UuCitURVNUKFZhbHVlc0luVGVzdCwgVmFsdWVzSW5TaW5nbGVFbGVtZW50SXRlcmF0b3JSYW5nZSkgeworICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8aW50PiBDb250YWluZXJUeXBlOworICBDb250YWluZXJUeXBlIHZhbHVlczsKKyAgdmFsdWVzLnB1c2hfYmFjayg0Mik7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGludD4gZ2VuID0gVmFsdWVzSW4odmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezQyfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlLiBUZXN0cyB0aGF0IFZhbHVlc0luKCkgcHJvdmlkZWQgd2l0aCBhbiBlbXB0eSBpdGVyYXRvciByYW5nZQorLy8gZ2VuZXJhdGVzIGFuIGVtcHR5IHNlcXVlbmNlLgorVEVTVChWYWx1ZXNJblRlc3QsIFZhbHVlc0luRW1wdHlJdGVyYXRvclJhbmdlKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxpbnQ+IENvbnRhaW5lclR5cGU7CisgIENvbnRhaW5lclR5cGUgdmFsdWVzOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlc0luKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworCisgIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoZ2VuKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgVmFsdWVzKCkgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoVmFsdWVzVGVzdCwgVmFsdWVzV29ya3MpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXMoMywgNSwgOCk7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0gezMsIDUsIDh9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IFZhbHVlcygpIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2VzIGZyb20gZWxlbWVudHMgb2YKKy8vIGRpZmZlcmVudCB0eXBlcyBjb252ZXJ0aWJsZSB0byBQYXJhbUdlbmVyYXRvcidzIHBhcmFtZXRlciB0eXBlLgorVEVTVChWYWx1ZXNUZXN0LCBWYWx1ZXNXb3Jrc0ZvclZhbHVlc09mQ29tcGF0aWJsZVR5cGVzKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGRvdWJsZT4gZ2VuID0gVmFsdWVzKDMsIDUuMGYsIDguMCk7CisKKyAgY29uc3QgZG91YmxlIGV4cGVjdGVkX3ZhbHVlc1tdID0gezMuMCwgNS4wLCA4LjB9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCitURVNUKFZhbHVlc1Rlc3QsIFZhbHVlc1dvcmtzRm9yTWF4TGVuZ3RoTGlzdCkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlcygKKyAgICAgIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgOTAsIDEwMCwKKyAgICAgIDExMCwgMTIwLCAxMzAsIDE0MCwgMTUwLCAxNjAsIDE3MCwgMTgwLCAxOTAsIDIwMCwKKyAgICAgIDIxMCwgMjIwLCAyMzAsIDI0MCwgMjUwLCAyNjAsIDI3MCwgMjgwLCAyOTAsIDMwMCwKKyAgICAgIDMxMCwgMzIwLCAzMzAsIDM0MCwgMzUwLCAzNjAsIDM3MCwgMzgwLCAzOTAsIDQwMCwKKyAgICAgIDQxMCwgNDIwLCA0MzAsIDQ0MCwgNDUwLCA0NjAsIDQ3MCwgNDgwLCA0OTAsIDUwMCk7CisKKyAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbHVlc1tdID0geworICAgICAgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwLAorICAgICAgMTEwLCAxMjAsIDEzMCwgMTQwLCAxNTAsIDE2MCwgMTcwLCAxODAsIDE5MCwgMjAwLAorICAgICAgMjEwLCAyMjAsIDIzMCwgMjQwLCAyNTAsIDI2MCwgMjcwLCAyODAsIDI5MCwgMzAwLAorICAgICAgMzEwLCAzMjAsIDMzMCwgMzQwLCAzNTAsIDM2MCwgMzcwLCAzODAsIDM5MCwgNDAwLAorICAgICAgNDEwLCA0MjAsIDQzMCwgNDQwLCA0NTAsIDQ2MCwgNDcwLCA0ODAsIDQ5MCwgNTAwfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gRWRnZSBjYXNlIHRlc3QuIFRlc3RzIHRoYXQgc2luZ2xlLXBhcmFtZXRlciBWYWx1ZXMoKSBnZW5lcmF0ZXMgdGhlIHNlcXVlbmNlCisvLyB3aXRoIHRoZSBzaW5nbGUgdmFsdWUuCitURVNUKFZhbHVlc1Rlc3QsIFZhbHVlc1dpdGhTaW5nbGVQYXJhbWV0ZXIpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4gPSBWYWx1ZXMoNDIpOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHs0Mn07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQm9vbCgpIGdlbmVyYXRlcyBzZXF1ZW5jZSAoZmFsc2UsIHRydWUpLgorVEVTVChCb29sVGVzdCwgQm9vbFdvcmtzKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPGJvb2w+IGdlbiA9IEJvb2woKTsKKworICBjb25zdCBib29sIGV4cGVjdGVkX3ZhbHVlc1tdID0ge2ZhbHNlLCB0cnVlfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorCisvLyBUZXN0cyB0aGF0IENvbWJpbmUoKSB3aXRoIHR3byBwYXJhbWV0ZXJzIGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2UuCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aFR3b1BhcmFtZXRlcnMpIHsKKyAgY29uc3QgY2hhciogZm9vID0gImZvbyI7CisgIGNvbnN0IGNoYXIqIGJhciA9ICJiYXIiOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxjb25zdCBjaGFyKiwgaW50PiA+IGdlbiA9CisgICAgICBDb21iaW5lKFZhbHVlcyhmb28sIGJhciksIFZhbHVlcygzLCA0KSk7CisKKyAgdHVwbGU8Y29uc3QgY2hhciosIGludD4gZXhwZWN0ZWRfdmFsdWVzW10gPSB7CisgICAgbWFrZV90dXBsZShmb28sIDMpLCBtYWtlX3R1cGxlKGZvbywgNCksCisgICAgbWFrZV90dXBsZShiYXIsIDMpLCBtYWtlX3R1cGxlKGJhciwgNCl9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisvLyBUZXN0cyB0aGF0IENvbWJpbmUoKSB3aXRoIHRocmVlIHBhcmFtZXRlcnMgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZS4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoVGhyZWVQYXJhbWV0ZXJzKSB7CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPHR1cGxlPGludCwgaW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoMywgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoNSwgNikpOworICB0dXBsZTxpbnQsIGludCwgaW50PiBleHBlY3RlZF92YWx1ZXNbXSA9IHsKKyAgICBtYWtlX3R1cGxlKDAsIDMsIDUpLCBtYWtlX3R1cGxlKDAsIDMsIDYpLAorICAgIG1ha2VfdHVwbGUoMCwgNCwgNSksIG1ha2VfdHVwbGUoMCwgNCwgNiksCisgICAgbWFrZV90dXBsZSgxLCAzLCA1KSwgbWFrZV90dXBsZSgxLCAzLCA2KSwKKyAgICBtYWtlX3R1cGxlKDEsIDQsIDUpLCBtYWtlX3R1cGxlKDEsIDQsIDYpfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgQ29tYmluZSgpIHdpdGggdGhlIGZpcnN0IHBhcmFtZXRlciBnZW5lcmF0aW5nIGEgc2luZ2xlIHZhbHVlCisvLyBzZXF1ZW5jZSBnZW5lcmF0ZXMgYSBzZXF1ZW5jZSB3aXRoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXF1YWwgdG8gdGhlCisvLyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlci4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoRmlyc3RQYXJhbWV0ZXJTaW5nbGVWYWx1ZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFZhbHVlcyg0MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDAsIDEpKTsKKworICB0dXBsZTxpbnQsIGludD4gZXhwZWN0ZWRfdmFsdWVzW10gPSB7bWFrZV90dXBsZSg0MiwgMCksIG1ha2VfdHVwbGUoNDIsIDEpfTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgQ29tYmluZSgpIHdpdGggdGhlIHNlY29uZCBwYXJhbWV0ZXIgZ2VuZXJhdGluZyBhIHNpbmdsZSB2YWx1ZQorLy8gc2VxdWVuY2UgZ2VuZXJhdGVzIGEgc2VxdWVuY2Ugd2l0aCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVxdWFsIHRvIHRoZQorLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGZpcnN0IHBhcmFtZXRlci4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoU2Vjb25kUGFyYW1ldGVyU2luZ2xlVmFsdWUpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8aW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKDQyKSk7CisKKyAgdHVwbGU8aW50LCBpbnQ+IGV4cGVjdGVkX3ZhbHVlc1tdID0ge21ha2VfdHVwbGUoMCwgNDIpLCBtYWtlX3R1cGxlKDEsIDQyKX07CisgIFZlcmlmeUdlbmVyYXRvcihnZW4sIGV4cGVjdGVkX3ZhbHVlcyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiB0aGUgZmlyc3QgcGFyYW1ldGVyIHByb2R1Y2VzIGFuIGVtcHR5IHNlcXVlbmNlLAorLy8gQ29tYmluZSgpIHByb2R1Y2VzIGFuIGVtcHR5IHNlcXVlbmNlLCB0b28uCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aEZpcnN0UGFyYW1ldGVyRW1wdHlSYW5nZSkgeworICBjb25zdCBQYXJhbUdlbmVyYXRvcjx0dXBsZTxpbnQsIGludD4gPiBnZW4gPSBDb21iaW5lKFJhbmdlKDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygwLCAxKSk7CisgIFZlcmlmeUdlbmVyYXRvcklzRW1wdHkoZ2VuKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aGVuIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHByb2R1Y2VzIGFuIGVtcHR5IHNlcXVlbmNlLAorLy8gQ29tYmluZSgpIHByb2R1Y2VzIGFuIGVtcHR5IHNlcXVlbmNlLCB0b28uCitURVNUKENvbWJpbmVUZXN0LCBDb21iaW5lV2l0aFNlY29uZFBhcmFtZXRlckVtcHR5UmFuZ2UpIHsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8aW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UoMSwgMSkpOworICBWZXJpZnlHZW5lcmF0b3JJc0VtcHR5KGdlbik7Cit9CisKKy8vIEVkZ2UgY2FzZS4gVGVzdHMgdGhhdCBjb21iaW5lIHdvcmtzIHdpdGggdGhlIG1heGltdW0gbnVtYmVyCisvLyBvZiBwYXJhbWV0ZXJzIHN1cHBvcnRlZCBieSBHb29nbGUgVGVzdCAoY3VycmVudGx5IDEwKS4KK1RFU1QoQ29tYmluZVRlc3QsIENvbWJpbmVXaXRoTWF4TnVtYmVyT2ZQYXJhbWV0ZXJzKSB7CisgIGNvbnN0IGNoYXIqIGZvbyA9ICJmb28iOworICBjb25zdCBjaGFyKiBiYXIgPSAiYmFyIjsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8dHVwbGU8Y29uc3QgY2hhciosIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQ+ID4gZ2VuID0gQ29tYmluZShWYWx1ZXMoZm9vLCBiYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygxKSwgVmFsdWVzKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygzKSwgVmFsdWVzKDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg1KSwgVmFsdWVzKDYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg3KSwgVmFsdWVzKDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg5KSk7CisKKyAgdHVwbGU8Y29uc3QgY2hhciosIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQ+CisgICAgICBleHBlY3RlZF92YWx1ZXNbXSA9IHttYWtlX3R1cGxlKGZvbywgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKGJhciwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSl9OworICBWZXJpZnlHZW5lcmF0b3IoZ2VuLCBleHBlY3RlZF92YWx1ZXMpOworfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisvLyBUZXN0cyB0aGF0IGFuIGdlbmVyYXRvciBwcm9kdWNlcyBjb3JyZWN0IHNlcXVlbmNlIGFmdGVyIGJlaW5nCisvLyBhc3NpZ25lZCBmcm9tIGFub3RoZXIgZ2VuZXJhdG9yLgorVEVTVChQYXJhbUdlbmVyYXRvclRlc3QsIEFzc2lnbm1lbnRXb3JrcykgeworICBQYXJhbUdlbmVyYXRvcjxpbnQ+IGdlbiA9IFZhbHVlcygxLCAyKTsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8aW50PiBnZW4yID0gVmFsdWVzKDMsIDQpOworICBnZW4gPSBnZW4yOworCisgIGNvbnN0IGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHszLCA0fTsKKyAgVmVyaWZ5R2VuZXJhdG9yKGdlbiwgZXhwZWN0ZWRfdmFsdWVzKTsKK30KKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIHRlc3RzIGFyZSBleHBhbmRlZCBhbmQgcnVuIGFzIHNwZWNpZmllZDoKKy8vIG9uZSB0ZXN0IHBlciBlbGVtZW50IGZyb20gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IKKy8vIHNwZWNpZmllZCBpbiBJTlNUQU5USUFURV9URVNUX0NBU0VfUC4gSXQgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSB0ZXN0J3MKKy8vIGZpeHR1cmUgY29uc3RydWN0b3IsIFNldFVwKCksIGFuZCBUZWFyRG93bigpIGhhdmUgcnVuIGFuZCBoYXZlIGJlZW4KKy8vIHN1cHBsaWVkIHdpdGggdGhlIGNvcnJlY3QgcGFyYW1ldGVycy4KKworLy8gVGhlIHVzZSBvZiBlbnZpcm9ubWVudCBvYmplY3QgYWxsb3dzIGRldGVjdGlvbiBvZiB0aGUgY2FzZSB3aGVyZSBubyB0ZXN0CisvLyBjYXNlIGZ1bmN0aW9uYWxpdHkgaXMgcnVuIGF0IGFsbC4gSW4gdGhpcyBjYXNlIFRlc3RDYXNlVGVhckRvd24gd2lsbCBub3QKKy8vIGJlIGFibGUgdG8gZGV0ZWN0IG1pc3NpbmcgdGVzdHMsIG5hdHVyYWxseS4KK3RlbXBsYXRlIDxpbnQga0V4cGVjdGVkQ2FsbHM+CitjbGFzcyBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgc3RhdGljIFRlc3RHZW5lcmF0aW9uRW52aXJvbm1lbnQqIEluc3RhbmNlKCkgeworICAgIHN0YXRpYyBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50KiBpbnN0YW5jZSA9IG5ldyBUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50OworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfQorCisgIHZvaWQgRml4dHVyZUNvbnN0cnVjdG9yRXhlY3V0ZWQoKSB7IGZpeHR1cmVfY29uc3RydWN0b3JfY291bnRfKys7IH0KKyAgdm9pZCBTZXRVcEV4ZWN1dGVkKCkgeyBzZXRfdXBfY291bnRfKys7IH0KKyAgdm9pZCBUZWFyRG93bkV4ZWN1dGVkKCkgeyB0ZWFyX2Rvd25fY291bnRfKys7IH0KKyAgdm9pZCBUZXN0Qm9keUV4ZWN1dGVkKCkgeyB0ZXN0X2JvZHlfY291bnRfKys7IH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gSWYgYWxsIE11bHRpcGxlVGVzdEdlbmVyYXRpb25UZXN0IHRlc3RzIGhhdmUgYmVlbiBkZS1zZWxlY3RlZAorICAgIC8vIGJ5IHRoZSBmaWx0ZXIgZmxhZywgdGhlIGZvbGxvd2luZyBjaGVja3MgbWFrZSBubyBzZW5zZS4KKyAgICBib29sIHBlcmZvcm1fY2hlY2sgPSBmYWxzZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0V4cGVjdGVkQ2FsbHM7ICsraSkgeworICAgICAgTWVzc2FnZSBtc2c7CisgICAgICBtc2cgPDwgIlRlc3RzRXhwYW5kZWRBbmRSdW4vIiA8PCBpOworICAgICAgaWYgKFVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QoCisgICAgICAgICAgICAgIlRlc3RFeHBhbnNpb25Nb2R1bGUvTXVsdGlwbGVUZXN0R2VuZXJhdGlvblRlc3QiLAorICAgICAgICAgICAgICBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSkpIHsKKyAgICAgICAgcGVyZm9ybV9jaGVjayA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChwZXJmb3JtX2NoZWNrKSB7CisgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkQ2FsbHMsIGZpeHR1cmVfY29uc3RydWN0b3JfY291bnRfKQorICAgICAgICAgIDw8ICJGaXh0dXJlIGNvbnN0cnVjdG9yIG9mIFBhcmFtVGVzdEdlbmVyYXRpb25UZXN0IHRlc3QgY2FzZSAiCisgICAgICAgICAgPDwgImhhcyBub3QgYmVlbiBydW4gYXMgZXhwZWN0ZWQuIjsKKyAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRDYWxscywgc2V0X3VwX2NvdW50XykKKyAgICAgICAgICA8PCAiRml4dHVyZSBTZXRVcCBtZXRob2Qgb2YgUGFyYW1UZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlICIKKyAgICAgICAgICA8PCAiaGFzIG5vdCBiZWVuIHJ1biBhcyBleHBlY3RlZC4iOworICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZENhbGxzLCB0ZWFyX2Rvd25fY291bnRfKQorICAgICAgICAgIDw8ICJGaXh0dXJlIFRlYXJEb3duIG1ldGhvZCBvZiBQYXJhbVRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8ICJoYXMgbm90IGJlZW4gcnVuIGFzIGV4cGVjdGVkLiI7CisgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkQ2FsbHMsIHRlc3RfYm9keV9jb3VudF8pCisgICAgICAgICAgPDwgIlRlc3QgaW4gUGFyYW1UZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlICIKKyAgICAgICAgICA8PCAiaGFzIG5vdCBiZWVuIHJ1biBhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudCgpIDogZml4dHVyZV9jb25zdHJ1Y3Rvcl9jb3VudF8oMCksIHNldF91cF9jb3VudF8oMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJfZG93bl9jb3VudF8oMCksIHRlc3RfYm9keV9jb3VudF8oMCkge30KKworICBpbnQgZml4dHVyZV9jb25zdHJ1Y3Rvcl9jb3VudF87CisgIGludCBzZXRfdXBfY291bnRfOworICBpbnQgdGVhcl9kb3duX2NvdW50XzsKKyAgaW50IHRlc3RfYm9keV9jb3VudF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0R2VuZXJhdGlvbkVudmlyb25tZW50KTsKK307CisKK2NvbnN0IGludCB0ZXN0X2dlbmVyYXRpb25fcGFyYW1zW10gPSB7MzYsIDQyLCA3Mn07CisKK2NsYXNzIFRlc3RHZW5lcmF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geworIHB1YmxpYzoKKyAgZW51bSB7CisgICAgUEFSQU1FVEVSX0NPVU5UID0KKyAgICAgICAgc2l6ZW9mKHRlc3RfZ2VuZXJhdGlvbl9wYXJhbXMpL3NpemVvZih0ZXN0X2dlbmVyYXRpb25fcGFyYW1zWzBdKQorICB9OworCisgIHR5cGVkZWYgVGVzdEdlbmVyYXRpb25FbnZpcm9ubWVudDxQQVJBTUVURVJfQ09VTlQ+IEVudmlyb25tZW50OworCisgIFRlc3RHZW5lcmF0aW9uVGVzdCgpIHsKKyAgICBFbnZpcm9ubWVudDo6SW5zdGFuY2UoKS0+Rml4dHVyZUNvbnN0cnVjdG9yRXhlY3V0ZWQoKTsKKyAgICBjdXJyZW50X3BhcmFtZXRlcl8gPSBHZXRQYXJhbSgpOworICB9CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBFbnZpcm9ubWVudDo6SW5zdGFuY2UoKS0+U2V0VXBFeGVjdXRlZCgpOworICAgIEVYUEVDVF9FUShjdXJyZW50X3BhcmFtZXRlcl8sIEdldFBhcmFtKCkpOworICB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBFbnZpcm9ubWVudDo6SW5zdGFuY2UoKS0+VGVhckRvd25FeGVjdXRlZCgpOworICAgIEVYUEVDVF9FUShjdXJyZW50X3BhcmFtZXRlcl8sIEdldFBhcmFtKCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKKyAgICBib29sIGFsbF90ZXN0c19pbl90ZXN0X2Nhc2Vfc2VsZWN0ZWQgPSB0cnVlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQQVJBTUVURVJfQ09VTlQ7ICsraSkgeworICAgICAgTWVzc2FnZSB0ZXN0X25hbWU7CisgICAgICB0ZXN0X25hbWUgPDwgIlRlc3RzRXhwYW5kZWRBbmRSdW4vIiA8PCBpOworICAgICAgaWYgKCAhVW5pdFRlc3RPcHRpb25zOjpGaWx0ZXJNYXRjaGVzVGVzdCgKKyAgICAgICAgICAgICAgICAiVGVzdEV4cGFuc2lvbk1vZHVsZS9NdWx0aXBsZVRlc3RHZW5lcmF0aW9uVGVzdCIsCisgICAgICAgICAgICAgICAgdGVzdF9uYW1lLkdldFN0cmluZygpKSkgeworICAgICAgICBhbGxfdGVzdHNfaW5fdGVzdF9jYXNlX3NlbGVjdGVkID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9UUlVFKGFsbF90ZXN0c19pbl90ZXN0X2Nhc2Vfc2VsZWN0ZWQpCisgICAgICAgIDw8ICJXaGVuIHJ1bm5pbmcgdGhlIFRlc3RHZW5lcmF0aW9uVGVzdCB0ZXN0IGNhc2UgYWxsIG9mIGl0cyB0ZXN0c1xuIgorICAgICAgICA8PCAibXVzdCBiZSBzZWxlY3RlZCBieSB0aGUgZmlsdGVyIGZsYWcgZm9yIHRoZSB0ZXN0IGNhc2UgdG8gcGFzcy5cbiIKKyAgICAgICAgPDwgIklmIG5vdCBhbGwgb2YgdGhlbSBhcmUgZW5hYmxlZCwgd2UgY2FuJ3QgcmVsaWFibHkgY29uY2x1ZGVcbiIKKyAgICAgICAgPDwgInRoYXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHRlc3RzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuIjsKKworICAgIGNvbGxlY3RlZF9wYXJhbWV0ZXJzXy5jbGVhcigpOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICB2ZWN0b3I8aW50PiBleHBlY3RlZF92YWx1ZXModGVzdF9nZW5lcmF0aW9uX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9nZW5lcmF0aW9uX3BhcmFtcyArIFBBUkFNRVRFUl9DT1VOVCk7CisgICAgLy8gVGVzdCBleGVjdXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgYnkgR29vZ2xlIFRlc3QsCisgICAgLy8gc28gdGhlIG9yZGVyIG9mIHZhbHVlcyBpbiBjb2xsZWN0ZWRfcGFyYW1ldGVyc18gY2FuIGJlCisgICAgLy8gZGlmZmVyZW50IGFuZCB3ZSBoYXZlIHRvIHNvcnQgdG8gY29tcGFyZS4KKyAgICBzb3J0KGV4cGVjdGVkX3ZhbHVlcy5iZWdpbigpLCBleHBlY3RlZF92YWx1ZXMuZW5kKCkpOworICAgIHNvcnQoY29sbGVjdGVkX3BhcmFtZXRlcnNfLmJlZ2luKCksIGNvbGxlY3RlZF9wYXJhbWV0ZXJzXy5lbmQoKSk7CisKKyAgICBFWFBFQ1RfVFJVRShjb2xsZWN0ZWRfcGFyYW1ldGVyc18gPT0gZXhwZWN0ZWRfdmFsdWVzKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBpbnQgY3VycmVudF9wYXJhbWV0ZXJfOworICBzdGF0aWMgdmVjdG9yPGludD4gY29sbGVjdGVkX3BhcmFtZXRlcnNfOworCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0R2VuZXJhdGlvblRlc3QpOworfTsKK3ZlY3RvcjxpbnQ+IFRlc3RHZW5lcmF0aW9uVGVzdDo6Y29sbGVjdGVkX3BhcmFtZXRlcnNfOworCitURVNUX1AoVGVzdEdlbmVyYXRpb25UZXN0LCBUZXN0c0V4cGFuZGVkQW5kUnVuKSB7CisgIEVudmlyb25tZW50OjpJbnN0YW5jZSgpLT5UZXN0Qm9keUV4ZWN1dGVkKCk7CisgIEVYUEVDVF9FUShjdXJyZW50X3BhcmFtZXRlcl8sIEdldFBhcmFtKCkpOworICBjb2xsZWN0ZWRfcGFyYW1ldGVyc18ucHVzaF9iYWNrKEdldFBhcmFtKCkpOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdEV4cGFuc2lvbk1vZHVsZSwgVGVzdEdlbmVyYXRpb25UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4odGVzdF9nZW5lcmF0aW9uX3BhcmFtcykpOworCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgZWxlbWVudCBzZXF1ZW5jZSAodGhpcmQgcGFyYW1ldGVyIG9mCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCkgaXMgZXZhbHVhdGVkIGluIEluaXRHb29nbGVUZXN0KCkgYW5kIG5laXRoZXIgYXQKKy8vIHRoZSBjYWxsIHNpdGUgb2YgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agbm9yIGluIFJVTl9BTExfVEVTVFMoKS4gIEZvcgorLy8gdGhhdCwgd2UgZGVjbGFyZSBwYXJhbV92YWx1ZV8gdG8gYmUgYSBzdGF0aWMgbWVtYmVyIG9mCisvLyBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCBhbmQgaW5pdGlhbGl6ZSBpdCB0byAwLiAgV2Ugc2V0IGl0IHRvIDEgaW4KKy8vIG1haW4oKSwganVzdCBiZWZvcmUgaW52b2NhdGlvbiBvZiBJbml0R29vZ2xlVGVzdCgpLiAgQWZ0ZXIgY2FsbGluZworLy8gSW5pdEdvb2dsZVRlc3QoKSwgd2Ugc2V0IHRoZSB2YWx1ZSB0byAyLiAgSWYgdGhlIHNlcXVlbmNlIGlzIGV2YWx1YXRlZAorLy8gYmVmb3JlIG9yIGFmdGVyIEluaXRHb29nbGVUZXN0LCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGNyZWF0ZSBhCisvLyB0ZXN0IHdpdGggcGFyYW1ldGVyIG90aGVyIHRoYW4gMSwgYW5kIHRoZSB0ZXN0IGJvZHkgd2lsbCBmYWlsIHRoZQorLy8gYXNzZXJ0aW9uLgorY2xhc3MgR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbnQgcGFyYW1fdmFsdWUoKSB7IHJldHVybiBwYXJhbV92YWx1ZV87IH0KKyAgc3RhdGljIHZvaWQgc2V0X3BhcmFtX3ZhbHVlKGludCBwYXJhbV92YWx1ZSkgeyBwYXJhbV92YWx1ZV8gPSBwYXJhbV92YWx1ZTsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBwYXJhbV92YWx1ZV87Cit9OworaW50IEdlbmVyYXRvckV2YWx1YXRpb25UZXN0OjpwYXJhbV92YWx1ZV8gPSAwOworCitURVNUX1AoR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QsIEdlbmVyYXRvcnNFdmFsdWF0ZWRJbk1haW4pIHsKKyAgRVhQRUNUX0VRKDEsIEdldFBhcmFtKCkpOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoR2VuRXZhbE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKEdlbmVyYXRvckV2YWx1YXRpb25UZXN0OjpwYXJhbV92YWx1ZSgpKSk7CisKKy8vIFRlc3RzIHRoYXQgZ2VuZXJhdG9ycyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXQgYXJlCisvLyBmdW5jdGlvbmFsLiBHZW5lcmF0b3IgZXh0ZXJuX2dlbiBpcyBkZWZpbmVkIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdDIuY2MuCitleHRlcm4gUGFyYW1HZW5lcmF0b3I8aW50PiBleHRlcm5fZ2VuOworY2xhc3MgRXh0ZXJuYWxHZW5lcmF0b3JUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7fTsKK1RFU1RfUChFeHRlcm5hbEdlbmVyYXRvclRlc3QsIEV4dGVybmFsR2VuZXJhdG9yKSB7CisgIC8vIFNlcXVlbmNlIHByb2R1Y2VkIGJ5IGV4dGVybl9nZW4gY29udGFpbnMgb25seSBhIHNpbmdsZSB2YWx1ZQorICAvLyB3aGljaCB3ZSB2ZXJpZnkgaGVyZS4KKyAgRVhQRUNUX0VRKEdldFBhcmFtKCksIDMzKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEV4dGVybmFsR2VuZXJhdG9yTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxHZW5lcmF0b3JUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuX2dlbik7CisKKy8vIFRlc3RzIHRoYXQgYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUgZGVmaW5lZCBpbiBvbmUgdHJhbnNsYXRpb24KKy8vIHVuaXQgYW5kIGluc3RhbnRpYXRlZCBpbiBhbm90aGVyLiBUaGlzIHRlc3Qgd2lsbCBiZSBpbnN0YW50aWF0ZWQgaW4KKy8vIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdDIuY2MuIEV4dGVybmFsSW5zdGFudGlhdGlvblRlc3QgZml4dHVyZSBjbGFzcyBpcworLy8gZGVmaW5lZCBpbiBndGVzdC1wYXJhbS10ZXN0X3Rlc3QuaC4KK1RFU1RfUChFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0LCBJc011bHRpcGxlT2YzMykgeworICBFWFBFQ1RfRVEoMCwgR2V0UGFyYW0oKSAlIDMzKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBtdWx0aXBsZQorLy8gZ2VuZXJhdG9ycy4KK2NsYXNzIE11bHRpcGxlSW5zdGFudGlhdGlvblRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworVEVTVF9QKE11bHRpcGxlSW5zdGFudGlhdGlvblRlc3QsIEFsbG93c011bHRpcGxlSW5zdGFuY2VzKSB7Cit9CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXF1ZW5jZTEsIE11bHRpcGxlSW5zdGFudGlhdGlvblRlc3QsIFZhbHVlcygxLCAyKSk7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXF1ZW5jZTIsIE11bHRpcGxlSW5zdGFudGlhdGlvblRlc3QsIFJhbmdlKDMsIDUpKTsKKworLy8gVGVzdHMgdGhhdCBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGNhbiBiZSBpbnN0YW50aWF0ZWQKKy8vIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzLiBUaGlzIHRlc3Qgd2lsbCBiZSBpbnN0YW50aWF0ZWQKKy8vIGhlcmUgYW5kIGluIGd0ZXN0LXBhcmFtLXRlc3RfdGVzdDIuY2MuCisvLyBJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGF0aW9uVW5pdHNUZXN0IGZpeHR1cmUgY2xhc3MKKy8vIGlzIGRlZmluZWQgaW4gZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmguCitURVNUX1AoSW5zdGFudGlhdGlvbkluTXVsdGlwbGVUcmFuc2xhaW9uVW5pdHNUZXN0LCBJc011bHRpcGxlT2Y0MikgeworICBFWFBFQ1RfRVEoMCwgR2V0UGFyYW0oKSAlIDQyKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbnRpYXRpb25Jbk11bHRpcGxlVHJhbnNsYWlvblVuaXRzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyg0MiwgNDIqMikpOworCisvLyBUZXN0cyB0aGF0IGVhY2ggaXRlcmF0aW9uIG9mIHBhcmFtZXRlcml6ZWQgdGVzdCBydW5zIGluIGEgc2VwYXJhdGUgdGVzdAorLy8gb2JqZWN0LgorY2xhc3MgU2VwYXJhdGVJbnN0YW5jZVRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsKKyBwdWJsaWM6CisgIFNlcGFyYXRlSW5zdGFuY2VUZXN0KCkgOiBjb3VudF8oMCkge30KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIEVYUEVDVF9HRShnbG9iYWxfY291bnRfLCAyKQorICAgICAgICA8PCAiSWYgc29tZSAoYnV0IG5vdCBhbGwpIFNlcGFyYXRlSW5zdGFuY2VUZXN0IHRlc3RzIGhhdmUgYmVlbiAiCisgICAgICAgIDw8ICJmaWx0ZXJlZCBvdXQgdGhpcyB0ZXN0IHdpbGwgZmFpbC4gTWFrZSBzdXJlIHRoYXQgYWxsICIKKyAgICAgICAgPDwgIkdlbmVyYXRvckV2YWx1YXRpb25UZXN0IGFyZSBzZWxlY3RlZCBvciBkZS1zZWxlY3RlZCB0b2dldGhlciAiCisgICAgICAgIDw8ICJieSB0aGUgdGVzdCBmaWx0ZXIuIjsKKyAgfQorCisgcHJvdGVjdGVkOgorICBpbnQgY291bnRfOworICBzdGF0aWMgaW50IGdsb2JhbF9jb3VudF87Cit9OworaW50IFNlcGFyYXRlSW5zdGFuY2VUZXN0OjpnbG9iYWxfY291bnRfID0gMDsKKworVEVTVF9QKFNlcGFyYXRlSW5zdGFuY2VUZXN0LCBUZXN0c1J1bkluU2VwYXJhdGVJbnN0YW5jZXMpIHsKKyAgRVhQRUNUX0VRKDAsIGNvdW50XysrKTsKKyAgZ2xvYmFsX2NvdW50XysrOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRm91ckVsZW1TZXF1ZW5jZSwgU2VwYXJhdGVJbnN0YW5jZVRlc3QsIFJhbmdlKDEsIDQpKTsKKworLy8gVGVzdHMgdGhhdCBhbGwgaW5zdGFudGlhdGlvbnMgb2YgYSB0ZXN0IGhhdmUgbmFtZWQgYXBwcm9wcmlhdGVseS4gVGVzdAorLy8gZGVmaW5lZCB3aXRoIFRFU1RfUChUZXN0Q2FzZU5hbWUsIFRlc3ROYW1lKSBhbmQgaW5zdGFudGlhdGVkIHdpdGgKKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNlcXVlbmNlTmFtZSwgVGVzdENhc2VOYW1lLCBnZW5lcmF0b3IpIG11c3QgYmUgbmFtZWQKKy8vIFNlcXVlbmNlTmFtZS9UZXN0Q2FzZU5hbWUuVGVzdE5hbWUvaSwgd2hlcmUgaSBpcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUKKy8vIHNlcXVlbmNlIGVsZW1lbnQgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgdGVzdC4KK2NsYXNzIE5hbWluZ1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworCitURVNUX1AoTmFtaW5nVGVzdCwgVGVzdHNSZXBvcnRDb3JyZWN0TmFtZXNBbmRQYXJhbWV0ZXJzKSB7CisgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisKKyAgRVhQRUNUX1NUUkVRKCJaZXJvVG9GaXZlU2VxdWVuY2UvTmFtaW5nVGVzdCIsIHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSk7CisKKyAgTWVzc2FnZSBpbmRleF9zdHJlYW07CisgIGluZGV4X3N0cmVhbSA8PCAiVGVzdHNSZXBvcnRDb3JyZWN0TmFtZXNBbmRQYXJhbWV0ZXJzLyIgPDwgR2V0UGFyYW0oKTsKKyAgRVhQRUNUX1NUUkVRKGluZGV4X3N0cmVhbS5HZXRTdHJpbmcoKS5jX3N0cigpLCB0ZXN0X2luZm8tPm5hbWUoKSk7CisKKyAgRVhQRUNUX0VRKDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhHZXRQYXJhbSgpKSwgdGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoWmVyb1RvRml2ZVNlcXVlbmNlLCBOYW1pbmdUZXN0LCBSYW5nZSgwLCA1KSk7CisKKy8vIFRlc3RzIHRoYXQgdXNlciBzdXBwbGllZCBjdXN0b20gcGFyYW1ldGVyIG5hbWVzIGFyZSB3b3JraW5nIGNvcnJlY3RseS4KKy8vIFJ1bnMgdGhlIHRlc3Qgd2l0aCBhIGJ1aWx0aW4gaGVscGVyIG1ldGhvZCB3aGljaCB1c2VzIFByaW50VG9TdHJpbmcsCisvLyBhcyB3ZWxsIGFzIGEgY3VzdG9tIGZ1bmN0aW9uIGFuZCBjdXN0b20gZnVuY3RvciB0byBlbnN1cmUgYWxsIHBvc3NpYmxlCisvLyB1c2VzIHdvcmsgY29ycmVjdGx5LgorY2xhc3MgQ3VzdG9tRnVuY3Rvck5hbWluZ1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxzdGQ6OnN0cmluZz4ge307CitURVNUX1AoQ3VzdG9tRnVuY3Rvck5hbWluZ1Rlc3QsIEN1c3RvbVRlc3ROYW1lcykge30KKworc3RydWN0IEN1c3RvbVBhcmFtTmFtZUZ1bmN0b3IgeworICBzdGQ6OnN0cmluZyBvcGVyYXRvcigpKGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxzdGQ6OnN0cmluZz4mIGluZm8pIHsKKyAgICByZXR1cm4gaW5mby5wYXJhbTsKKyAgfQorfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ3VzdG9tUGFyYW1OYW1lRnVuY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUZ1bmN0b3JOYW1pbmdUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKHN0ZDo6c3RyaW5nKCJGdW5jdG9yTmFtZSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbVBhcmFtTmFtZUZ1bmN0b3IoKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFsbEFsbG93ZWRDaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tRnVuY3Rvck5hbWluZ1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5MF8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbVBhcmFtTmFtZUZ1bmN0b3IoKSk7CisKK2lubGluZSBzdGQ6OnN0cmluZyBDdXN0b21QYXJhbU5hbWVGdW5jdGlvbigKKyAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88c3RkOjpzdHJpbmc+JiBpbmZvKSB7CisgIHJldHVybiBpbmZvLnBhcmFtOworfQorCitjbGFzcyBDdXN0b21GdW5jdGlvbk5hbWluZ1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxzdGQ6OnN0cmluZz4ge307CitURVNUX1AoQ3VzdG9tRnVuY3Rpb25OYW1pbmdUZXN0LCBDdXN0b21UZXN0TmFtZXMpIHt9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEN1c3RvbVBhcmFtTmFtZUZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tRnVuY3Rpb25OYW1pbmdUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKHN0ZDo6c3RyaW5nKCJGdW5jdGlvbk5hbWUiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21QYXJhbU5hbWVGdW5jdGlvbik7CisKKyNpZiBHVEVTVF9MQU5HX0NYWDExCisKKy8vIFRlc3QgY3VzdG9tIG5hbWluZyB3aXRoIGEgbGFtYmRhCisKK2NsYXNzIEN1c3RvbUxhbWJkYU5hbWluZ1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxzdGQ6OnN0cmluZz4ge307CitURVNUX1AoQ3VzdG9tTGFtYmRhTmFtaW5nVGVzdCwgQ3VzdG9tVGVzdE5hbWVzKSB7fQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChDdXN0b21QYXJhbU5hbWVMYW1iZGEsCisgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21MYW1iZGFOYW1pbmdUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKHN0ZDo6c3RyaW5nKCJMYW1iZGFOYW1lIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHN0ZDo6c3RyaW5nPiYgaW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mby5wYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKKworVEVTVChDdXN0b21OYW1pbmdUZXN0LCBDaGVja05hbWVSZWdpc3RyeSkgeworICA6OnRlc3Rpbmc6OlVuaXRUZXN0KiB1bml0X3Rlc3QgPSA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGVzdF9uYW1lczsKKyAgZm9yIChpbnQgY2FzZV9udW0gPSAwOworICAgICAgIGNhc2VfbnVtIDwgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsKKyAgICAgICArK2Nhc2VfbnVtKSB7CisgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0Q2FzZSogdGVzdF9jYXNlID0gdW5pdF90ZXN0LT5HZXRUZXN0Q2FzZShjYXNlX251bSk7CisgICAgZm9yIChpbnQgdGVzdF9udW0gPSAwOworICAgICAgICAgdGVzdF9udW0gPCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKTsKKyAgICAgICAgICsrdGVzdF9udW0pIHsKKyAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+R2V0VGVzdEluZm8odGVzdF9udW0pOworICAgICAgdGVzdF9uYW1lcy5pbnNlcnQoc3RkOjpzdHJpbmcodGVzdF9pbmZvLT5uYW1lKCkpKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX0VRKDF1LCB0ZXN0X25hbWVzLmNvdW50KCJDdXN0b21UZXN0TmFtZXMvRnVuY3Rvck5hbWUiKSk7CisgIEVYUEVDVF9FUSgxdSwgdGVzdF9uYW1lcy5jb3VudCgiQ3VzdG9tVGVzdE5hbWVzL0Z1bmN0aW9uTmFtZSIpKTsKKyNpZiBHVEVTVF9MQU5HX0NYWDExCisgIEVYUEVDVF9FUSgxdSwgdGVzdF9uYW1lcy5jb3VudCgiQ3VzdG9tVGVzdE5hbWVzL0xhbWJkYU5hbWUiKSk7CisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKK30KKworLy8gVGVzdCBhIG51bWVyaWMgbmFtZSB0byBlbnN1cmUgUHJpbnRUb1N0cmluZ1BhcmFtTmFtZSB3b3JrcyBjb3JyZWN0bHkuCisKK2NsYXNzIEN1c3RvbUludGVnZXJOYW1pbmdUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7fTsKKworVEVTVF9QKEN1c3RvbUludGVnZXJOYW1pbmdUZXN0LCBUZXN0c1JlcG9ydENvcnJlY3ROYW1lcykgeworICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBNZXNzYWdlIHRlc3RfbmFtZV9zdHJlYW07CisgIHRlc3RfbmFtZV9zdHJlYW0gPDwgIlRlc3RzUmVwb3J0Q29ycmVjdE5hbWVzLyIgPDwgR2V0UGFyYW0oKTsKKyAgRVhQRUNUX1NUUkVRKHRlc3RfbmFtZV9zdHJlYW0uR2V0U3RyaW5nKCkuY19zdHIoKSwgdGVzdF9pbmZvLT5uYW1lKCkpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChQcmludFRvU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW50ZWdlck5hbWluZ1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSgwLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZ1BhcmFtTmFtZSgpKTsKKworLy8gVGVzdCBhIGN1c3RvbSBzdHJ1Y3Qgd2l0aCBQcmludFRvU3RyaW5nLgorCitzdHJ1Y3QgQ3VzdG9tU3RydWN0IHsKKyAgZXhwbGljaXQgQ3VzdG9tU3RydWN0KGludCB2YWx1ZSkgOiB4KHZhbHVlKSB7fQorICBpbnQgeDsKK307CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIHN0cmVhbSwgY29uc3QgQ3VzdG9tU3RydWN0JiB2YWwpIHsKKyAgc3RyZWFtIDw8IHZhbC54OworICByZXR1cm4gc3RyZWFtOworfQorCitjbGFzcyBDdXN0b21TdHJ1Y3ROYW1pbmdUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08Q3VzdG9tU3RydWN0PiB7fTsKKworVEVTVF9QKEN1c3RvbVN0cnVjdE5hbWluZ1Rlc3QsIFRlc3RzUmVwb3J0Q29ycmVjdE5hbWVzKSB7CisgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIE1lc3NhZ2UgdGVzdF9uYW1lX3N0cmVhbTsKKyAgdGVzdF9uYW1lX3N0cmVhbSA8PCAiVGVzdHNSZXBvcnRDb3JyZWN0TmFtZXMvIiA8PCBHZXRQYXJhbSgpOworICBFWFBFQ1RfU1RSRVEodGVzdF9uYW1lX3N0cmVhbS5HZXRTdHJpbmcoKS5jX3N0cigpLCB0ZXN0X2luZm8tPm5hbWUoKSk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFByaW50VG9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21TdHJ1Y3ROYW1pbmdUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKEN1c3RvbVN0cnVjdCgwKSwgQ3VzdG9tU3RydWN0KDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZ1BhcmFtTmFtZSgpKTsKKworLy8gVGVzdCB0aGF0IHVzaW5nIGEgc3RhdGVmdWwgcGFyYW1ldGVyIG5hbWluZyBmdW5jdGlvbiB3b3JrcyBhcyBleHBlY3RlZC4KKworc3RydWN0IFN0YXRlZnVsTmFtaW5nRnVuY3RvciB7CisgIFN0YXRlZnVsTmFtaW5nRnVuY3RvcigpIDogc3VtKDApIHt9CisgIHN0ZDo6c3RyaW5nIG9wZXJhdG9yKCkoY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPGludD4mIGluZm8pIHsKKyAgICBpbnQgdmFsdWUgPSBpbmZvLnBhcmFtICsgc3VtOworICAgIHN1bSArPSBpbmZvLnBhcmFtOworICAgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUpOworICB9CisgIGludCBzdW07Cit9OworCitjbGFzcyBTdGF0ZWZ1bE5hbWluZ1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4geworIHByb3RlY3RlZDoKKyAgU3RhdGVmdWxOYW1pbmdUZXN0KCkgOiBzdW1fKDApIHt9CisgIGludCBzdW1fOworfTsKKworVEVTVF9QKFN0YXRlZnVsTmFtaW5nVGVzdCwgVGVzdHNSZXBvcnRDb3JyZWN0TmFtZXMpIHsKKyAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KKyAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgc3VtXyArPSBHZXRQYXJhbSgpOworICBNZXNzYWdlIHRlc3RfbmFtZV9zdHJlYW07CisgIHRlc3RfbmFtZV9zdHJlYW0gPDwgIlRlc3RzUmVwb3J0Q29ycmVjdE5hbWVzLyIgPDwgc3VtXzsKKyAgRVhQRUNUX1NUUkVRKHRlc3RfbmFtZV9zdHJlYW0uR2V0U3RyaW5nKCkuY19zdHIoKSwgdGVzdF9pbmZvLT5uYW1lKCkpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdGF0ZWZ1bE5hbWluZ0Z1bmN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZWZ1bE5hbWluZ1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSgwLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlZnVsTmFtaW5nRnVuY3RvcigpKTsKKworLy8gQ2xhc3MgdGhhdCBjYW5ub3QgYmUgc3RyZWFtZWQgaW50byBhbiBvc3RyZWFtLiAgSXQgbmVlZHMgdG8gYmUgY29weWFibGUKKy8vIChhbmQsIGluIGNhc2Ugb2YgTVNWQywgYWxzbyBhc3NpZ25hYmxlKSBpbiBvcmRlciB0byBiZSBhIHRlc3QgcGFyYW1ldGVyCisvLyB0eXBlLiAgSXRzIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBkbyBleGFjdGx5CisvLyB3aGF0IHdlIG5lZWQuCitjbGFzcyBVbnN0cmVhbWFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5zdHJlYW1hYmxlKGludCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisKKyBwcml2YXRlOgorICBpbnQgdmFsdWVfOworfTsKKworY2xhc3MgQ29tbWVudFRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxVbnN0cmVhbWFibGU+IHt9OworCitURVNUX1AoQ29tbWVudFRlc3QsIFRlc3RzQ29ycmVjdGx5UmVwb3J0VW5zdHJlYW1hYmxlUGFyYW1zKSB7CisgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisKKyAgRVhQRUNUX0VRKDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhHZXRQYXJhbSgpKSwgdGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbldpdGhDb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKFVuc3RyZWFtYWJsZSgxKSkpOworCisvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgaGllcmFyY2h5IG9mIHRlc3QgZml4dHVyZXMsIHdoZXJlIHRoZSBiYXNlCisvLyBjbGFzcyBmaXh0dXJlIGlzIG5vdCBwYXJhbWV0ZXJpemVkIGFuZCB0aGUgZGVyaXZlZCBjbGFzcyBpcy4gSW4gdGhpcyBjYXNlCisvLyBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QgaW5oZXJpdHMgZnJvbSBOb25QYXJhbWV0ZXJpemVkQmFzZVRlc3QuICBXZQorLy8gcGVyZm9ybSBzaW1wbGUgdGVzdHMgb24gYm90aC4KK2NsYXNzIE5vblBhcmFtZXRlcml6ZWRCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0KCkgOiBuXygxNykgeyB9CisgcHJvdGVjdGVkOgorICBpbnQgbl87Cit9OworCitjbGFzcyBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QgOiBwdWJsaWMgTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworIHByb3RlY3RlZDoKKyAgUGFyYW1ldGVyaXplZERlcml2ZWRUZXN0KCkgOiBjb3VudF8oMCkgeyB9CisgIGludCBjb3VudF87CisgIHN0YXRpYyBpbnQgZ2xvYmFsX2NvdW50XzsKK307CisKK2ludCBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3Q6Omdsb2JhbF9jb3VudF8gPSAwOworCitURVNUX0YoTm9uUGFyYW1ldGVyaXplZEJhc2VUZXN0LCBGaXh0dXJlSXNJbml0aWFsaXplZCkgeworICBFWFBFQ1RfRVEoMTcsIG5fKTsKK30KKworVEVTVF9QKFBhcmFtZXRlcml6ZWREZXJpdmVkVGVzdCwgU2Vlc1NlcXVlbmNlKSB7CisgIEVYUEVDVF9FUSgxNywgbl8pOworICBFWFBFQ1RfRVEoMCwgY291bnRfKyspOworICBFWFBFQ1RfRVEoR2V0UGFyYW0oKSwgZ2xvYmFsX2NvdW50XysrKTsKK30KKworY2xhc3MgUGFyYW1ldGVyaXplZERlYXRoVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7IH07CisKK1RFU1RfRihQYXJhbWV0ZXJpemVkRGVhdGhUZXN0LCBHZXRQYXJhbURpZXNGcm9tVGVzdEYpIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChHZXRQYXJhbSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QgLioiKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUmFuZ2VaZXJvVG9GaXZlLCBQYXJhbWV0ZXJpemVkRGVyaXZlZFRlc3QsIFJhbmdlKDAsIDUpKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCitURVNUKENvbXBpbGVUZXN0LCBDb21iaW5lSXNEZWZpbmVkT25seVdoZW5HdGVzdEhhc1BhcmFtVGVzdElzRGVmaW5lZCkgeworI2lmIEdURVNUX0hBU19DT01CSU5FICYmICFHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBGQUlMKCkgPDwgIkdURVNUX0hBU19DT01CSU5FIGlzIGRlZmluZWQgd2hpbGUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgaXMgbm90XG4iCisjZW5kaWYKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gVXNlZCBpbiBUZXN0R2VuZXJhdGlvblRlc3QgdGVzdCBjYXNlLgorICBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoVGVzdEdlbmVyYXRpb25UZXN0OjpFbnZpcm9ubWVudDo6SW5zdGFuY2UoKSk7CisgIC8vIFVzZWQgaW4gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QgdGVzdCBjYXNlLiBUZXN0cyB0aGF0IHRoZSB1cGRhdGVkIHZhbHVlCisgIC8vIHdpbGwgYmUgcGlja2VkIHVwIGZvciBpbnN0YW50aWF0aW5nIHRlc3RzIGluIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0LgorICBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdDo6c2V0X3BhcmFtX3ZhbHVlKDEpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgLy8gVXNlZCBpbiBHZW5lcmF0b3JFdmFsdWF0aW9uVGVzdCB0ZXN0IGNhc2UuIFRlc3RzIHRoYXQgdmFsdWUgdXBkYXRlZAorICAvLyBoZXJlIHdpbGwgTk9UIGJlIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgdGVzdHMgaW4KKyAgLy8gR2VuZXJhdG9yRXZhbHVhdGlvblRlc3QuCisgIEdlbmVyYXRvckV2YWx1YXRpb25UZXN0OjpzZXRfcGFyYW1fdmFsdWUoMik7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdF90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlYTEyMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXBhcmFtLXRlc3RfdGVzdC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIHByb3ZpZGVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkKKy8vIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGl0c2VsZi4KKworI2lmbmRlZiBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXworI2RlZmluZSBHVEVTVF9URVNUX0dURVNUX1BBUkFNX1RFU1RfVEVTVF9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIFRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBkZWZpbml0aW9uIGFuZCBpbnN0YW50aWF0aW9uIG9mIGEgdGVzdAorLy8gaW4gc2VwYXJhdGUgdHJhbnNsYXRpb24gdW5pdHMuCitjbGFzcyBFeHRlcm5hbEluc3RhbnRpYXRpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKK307CisKKy8vIFRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyBpbnN0YW50aWF0aW9uIG9mIGEgdGVzdCBpbiBtdWx0aXBsZQorLy8gdHJhbnNsYXRpb24gdW5pdHMuCitjbGFzcyBJbnN0YW50aWF0aW9uSW5NdWx0aXBsZVRyYW5zbGFpb25Vbml0c1Rlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyNlbmRpZiAgLy8gR1RFU1RfVEVTVF9HVEVTVF9QQVJBTV9URVNUX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXBvcnRfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXBvcnRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdiYWQwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtcG9ydF90ZXN0LmNjCkBAIC0wLDAgKzEsMTMwNCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpLCB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgaW50ZXJuYWwgY3Jvc3MtcGxhdGZvcm0gc3VwcG9ydCB1dGlsaXRpZXMuCisKKyNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWYgR1RFU1RfT1NfTUFDCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3Igc3RkOjpwYWlyIGFuZCBzdGQ6Om1ha2VfcGFpci4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKwordXNpbmcgc3RkOjptYWtlX3BhaXI7Cit1c2luZyBzdGQ6OnBhaXI7CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK1RFU1QoSXNYRGlnaXRUZXN0LCBXb3Jrc0Zvck5hcnJvd0FzY2lpKSB7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KCcwJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdCgnOScpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoJ0EnKSk7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KCdGJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdCgnYScpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoJ2YnKSk7CisKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KCctJykpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoJ2cnKSk7CisgIEVYUEVDVF9GQUxTRShJc1hEaWdpdCgnRycpKTsKK30KKworVEVTVChJc1hEaWdpdFRlc3QsIFJldHVybnNGYWxzZUZvck5hcnJvd05vbkFzY2lpKSB7CisgIEVYUEVDVF9GQUxTRShJc1hEaWdpdChzdGF0aWNfY2FzdDxjaGFyPigweDgwKSkpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnIHwgMHg4MCkpKTsKK30KKworVEVTVChJc1hEaWdpdFRlc3QsIFdvcmtzRm9yV2lkZUFzY2lpKSB7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KEwnMCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoTCc5JykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdChMJ0EnKSk7CisgIEVYUEVDVF9UUlVFKElzWERpZ2l0KEwnRicpKTsKKyAgRVhQRUNUX1RSVUUoSXNYRGlnaXQoTCdhJykpOworICBFWFBFQ1RfVFJVRShJc1hEaWdpdChMJ2YnKSk7CisKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KEwnLScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KEwnZycpKTsKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KEwnRycpKTsKK30KKworVEVTVChJc1hEaWdpdFRlc3QsIFJldHVybnNGYWxzZUZvcldpZGVOb25Bc2NpaSkgeworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg4MCkpKTsKKyAgRVhQRUNUX0ZBTFNFKElzWERpZ2l0KHN0YXRpY19jYXN0PHdjaGFyX3Q+KEwnMCcgfCAweDgwKSkpOworICBFWFBFQ1RfRkFMU0UoSXNYRGlnaXQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oTCcwJyB8IDB4MTAwKSkpOworfQorCitjbGFzcyBCYXNlIHsKKyBwdWJsaWM6CisgIC8vIENvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgZG8gZXhhY3RseSB3aGF0IHdlIG5lZWQsIHNvIHdlCisgIC8vIHVzZSB0aGVtLgorICBCYXNlKCkgOiBtZW1iZXJfKDApIHt9CisgIGV4cGxpY2l0IEJhc2UoaW50IG4pIDogbWVtYmVyXyhuKSB7fQorICB2aXJ0dWFsIH5CYXNlKCkge30KKyAgaW50IG1lbWJlcigpIHsgcmV0dXJuIG1lbWJlcl87IH0KKworIHByaXZhdGU6CisgIGludCBtZW1iZXJfOworfTsKKworY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERlcml2ZWQoaW50IG4pIDogQmFzZShuKSB7fQorfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDb252ZXJ0c1BvaW50ZXJzKSB7CisgIERlcml2ZWQgZGVyaXZlZCgwKTsKKyAgRVhQRUNUX1RSVUUoJmRlcml2ZWQgPT0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlKj4oJmRlcml2ZWQpKTsKK30KKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5Vc2VJbmhlcml0YW5jZSkgeworICBEZXJpdmVkIGRlcml2ZWQoMSk7CisgIEJhc2UgYmFzZSA9IDo6dGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88QmFzZT4oZGVyaXZlZCk7CisgIEVYUEVDVF9FUShkZXJpdmVkLm1lbWJlcigpLCBiYXNlLm1lbWJlcigpKTsKK30KKworY2xhc3MgQ2FzdGFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ2FzdGFibGUoYm9vbCogY29udmVydGVkKSA6IGNvbnZlcnRlZF8oY29udmVydGVkKSB7fQorICBvcGVyYXRvciBCYXNlKCkgeworICAgICpjb252ZXJ0ZWRfID0gdHJ1ZTsKKyAgICByZXR1cm4gQmFzZSgpOworICB9CisKKyBwcml2YXRlOgorICBib29sKiBjb252ZXJ0ZWRfOworfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5Vc2VOb25Db25zdENhc3RPcGVyYXRvcikgeworICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICBDYXN0YWJsZSBjYXN0YWJsZSgmY29udmVydGVkKTsKKyAgQmFzZSBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihjYXN0YWJsZSk7CisgIEVYUEVDVF9UUlVFKGNvbnZlcnRlZCk7Cit9CisKK2NsYXNzIENvbnN0Q2FzdGFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ29uc3RDYXN0YWJsZShib29sKiBjb252ZXJ0ZWQpIDogY29udmVydGVkXyhjb252ZXJ0ZWQpIHt9CisgIG9wZXJhdG9yIEJhc2UoKSBjb25zdCB7CisgICAgKmNvbnZlcnRlZF8gPSB0cnVlOworICAgIHJldHVybiBCYXNlKCk7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wqIGNvbnZlcnRlZF87Cit9OworCitURVNUKEltcGxpY2l0Q2FzdFRlc3QsIENhblVzZUNvbnN0Q2FzdE9wZXJhdG9yT25Db25zdFZhbHVlcykgeworICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICBjb25zdCBDb25zdENhc3RhYmxlIGNvbnN0X2Nhc3RhYmxlKCZjb252ZXJ0ZWQpOworICBCYXNlIGJhc2UgPSA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEJhc2U+KGNvbnN0X2Nhc3RhYmxlKTsKKyAgRVhQRUNUX1RSVUUoY29udmVydGVkKTsKK30KKworY2xhc3MgQ29uc3RBbmROb25Db25zdENhc3RhYmxlIHsKKyBwdWJsaWM6CisgIENvbnN0QW5kTm9uQ29uc3RDYXN0YWJsZShib29sKiBjb252ZXJ0ZWQsIGJvb2wqIGNvbnN0X2NvbnZlcnRlZCkKKyAgICAgIDogY29udmVydGVkXyhjb252ZXJ0ZWQpLCBjb25zdF9jb252ZXJ0ZWRfKGNvbnN0X2NvbnZlcnRlZCkge30KKyAgb3BlcmF0b3IgQmFzZSgpIHsKKyAgICAqY29udmVydGVkXyA9IHRydWU7CisgICAgcmV0dXJuIEJhc2UoKTsKKyAgfQorICBvcGVyYXRvciBCYXNlKCkgY29uc3QgeworICAgICpjb25zdF9jb252ZXJ0ZWRfID0gdHJ1ZTsKKyAgICByZXR1cm4gQmFzZSgpOworICB9CisKKyBwcml2YXRlOgorICBib29sKiBjb252ZXJ0ZWRfOworICBib29sKiBjb25zdF9jb252ZXJ0ZWRfOworfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5TZWxlY3RCZXR3ZWVuQ29uc3RBbmROb25Db25zdENhc3JBcHByb3ByaWF0ZWx5KSB7CisgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgIGJvb2wgY29uc3RfY29udmVydGVkID0gZmFsc2U7CisgIENvbnN0QW5kTm9uQ29uc3RDYXN0YWJsZSBjYXN0YWJsZSgmY29udmVydGVkLCAmY29uc3RfY29udmVydGVkKTsKKyAgQmFzZSBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihjYXN0YWJsZSk7CisgIEVYUEVDVF9UUlVFKGNvbnZlcnRlZCk7CisgIEVYUEVDVF9GQUxTRShjb25zdF9jb252ZXJ0ZWQpOworCisgIGNvbnZlcnRlZCA9IGZhbHNlOworICBjb25zdF9jb252ZXJ0ZWQgPSBmYWxzZTsKKyAgY29uc3QgQ29uc3RBbmROb25Db25zdENhc3RhYmxlIGNvbnN0X2Nhc3RhYmxlKCZjb252ZXJ0ZWQsICZjb25zdF9jb252ZXJ0ZWQpOworICBiYXNlID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxCYXNlPihjb25zdF9jYXN0YWJsZSk7CisgIEVYUEVDVF9GQUxTRShjb252ZXJ0ZWQpOworICBFWFBFQ1RfVFJVRShjb25zdF9jb252ZXJ0ZWQpOworfQorCitjbGFzcyBUbyB7CisgcHVibGljOgorICBUbyhib29sKiBjb252ZXJ0ZWQpIHsgKmNvbnZlcnRlZCA9IHRydWU7IH0gIC8vIE5PTElOVAorfTsKKworVEVTVChJbXBsaWNpdENhc3RUZXN0LCBDYW5Vc2VJbXBsaWNpdENvbnN0cnVjdG9yKSB7CisgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgIFRvIHRvID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxUbz4oJmNvbnZlcnRlZCk7CisgICh2b2lkKXRvOworICBFWFBFQ1RfVFJVRShjb252ZXJ0ZWQpOworfQorCitURVNUKEl0ZXJhdG9yVHJhaXRzVGVzdCwgV29ya3NGb3JTVExDb250YWluZXJJdGVyYXRvcnMpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCwKKyAgICAgIEl0ZXJhdG9yVHJhaXRzPCA6OnN0ZDo6dmVjdG9yPGludD46OmNvbnN0X2l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGJvb2wsCisgICAgICBJdGVyYXRvclRyYWl0czwgOjpzdGQ6Omxpc3Q8Ym9vbD46Oml0ZXJhdG9yPjo6dmFsdWVfdHlwZT4oKTsKK30KKworVEVTVChJdGVyYXRvclRyYWl0c1Rlc3QsIFdvcmtzRm9yUG9pbnRlclRvTm9uQ29uc3QpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNoYXIsIEl0ZXJhdG9yVHJhaXRzPGNoYXIqPjo6dmFsdWVfdHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNvbnN0IHZvaWQqLCBJdGVyYXRvclRyYWl0czxjb25zdCB2b2lkKio+Ojp2YWx1ZV90eXBlPigpOworfQorCitURVNUKEl0ZXJhdG9yVHJhaXRzVGVzdCwgV29ya3NGb3JQb2ludGVyVG9Db25zdCkgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y2hhciwgSXRlcmF0b3JUcmFpdHM8Y29uc3QgY2hhcio+Ojp2YWx1ZV90eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3Qgdm9pZCosCisgICAgICBJdGVyYXRvclRyYWl0czxjb25zdCB2b2lkKiBjb25zdCo+Ojp2YWx1ZV90eXBlPigpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBlbGVtZW50X3R5cGUgdHlwZWRlZiBpcyBhdmFpbGFibGUgaW4gc2NvcGVkX3B0ciBhbmQgcmVmZXJzCisvLyB0byB0aGUgcGFyYW1ldGVyIHR5cGUuCitURVNUKFNjb3BlZFB0clRlc3QsIERlZmluZXNFbGVtZW50VHlwZSkgeworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyPGludD46OmVsZW1lbnRfdHlwZT4oKTsKK30KKworLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogSW1wbGVtZW50IFRIRSBSRVNUIG9mIHNjb3BlZF9wdHIgdGVzdHMuCisKK1RFU1QoR3Rlc3RDaGVja1N5bnRheFRlc3QsIEJlaGF2ZXNMaWtlQVNpbmdsZVN0YXRlbWVudCkgeworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBHVEVTVF9DSEVDS18oZmFsc2UpIDw8ICJUaGlzIHNob3VsZCBuZXZlciBiZSBleGVjdXRlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0J3MgYSBjb21waWxhdGlvbiB0ZXN0IG9ubHkuIjsKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEdURVNUX0NIRUNLXyh0cnVlKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIDsgIC8vIE5PTElOVAorICBlbHNlCisgICAgR1RFU1RfQ0hFQ0tfKHRydWUpIDw8ICIiOworfQorCitURVNUKEd0ZXN0Q2hlY2tTeW50YXhUZXN0LCBXb3Jrc1dpdGhTd2l0Y2gpIHsKKyAgc3dpdGNoICgwKSB7CisgICAgY2FzZSAxOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdURVNUX0NIRUNLXyh0cnVlKTsKKyAgfQorCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBHVEVTVF9DSEVDS18odHJ1ZSkgPDwgIkNoZWNrIGZhaWxlZCBpbiBzd2l0Y2ggY2FzZSI7Cit9CisKKy8vIFZlcmlmaWVzIGJlaGF2aW9yIG9mIEZvcm1hdEZpbGVMb2NhdGlvbi4KK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c0ZpbGVMb2NhdGlvbikgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiZm9vLmNjIiwgRm9ybWF0RmlsZUxvY2F0aW9uKCJmb28uY2MiLCA0MikpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiNDIiLCBGb3JtYXRGaWxlTG9jYXRpb24oImZvby5jYyIsIDQyKSk7Cit9CisKK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vua25vd25GaWxlKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoCisgICAgICBJc1N1YnN0cmluZywgInVua25vd24gZmlsZSIsIEZvcm1hdEZpbGVMb2NhdGlvbihOVUxMLCA0MikpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKElzU3Vic3RyaW5nLCAiNDIiLCBGb3JtYXRGaWxlTG9jYXRpb24oTlVMTCwgNDIpKTsKK30KKworVEVTVChGb3JtYXRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duTGluZSkgeworICBFWFBFQ1RfRVEoImZvby5jYzoiLCBGb3JtYXRGaWxlTG9jYXRpb24oImZvby5jYyIsIC0xKSk7Cit9CisKK1RFU1QoRm9ybWF0RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkZpbGVBbmRMaW5lKSB7CisgIEVYUEVDVF9FUSgidW5rbm93biBmaWxlOiIsIEZvcm1hdEZpbGVMb2NhdGlvbihOVUxMLCAtMSkpOworfQorCisvLyBWZXJpZmllcyBiZWhhdmlvciBvZiBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uLgorVEVTVChGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c0ZpbGVMb2NhdGlvbikgeworICBFWFBFQ1RfRVEoImZvby5jYzo0MiIsIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oImZvby5jYyIsIDQyKSk7Cit9CisKK1RFU1QoRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvblRlc3QsIEZvcm1hdHNVa25vd25GaWxlKSB7CisgIEVYUEVDVF9FUSgidW5rbm93biBmaWxlOjQyIiwKKyAgICAgICAgICAgIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oTlVMTCwgNDIpKTsKK30KKworVEVTVChGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uVGVzdCwgRm9ybWF0c1Vrbm93bkxpbmUpIHsKKyAgRVhQRUNUX0VRKCJmb28uY2MiLCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKCJmb28uY2MiLCAtMSkpOworfQorCitURVNUKEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb25UZXN0LCBGb3JtYXRzVWtub3duRmlsZUFuZExpbmUpIHsKKyAgRVhQRUNUX0VRKCJ1bmtub3duIGZpbGUiLCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKE5VTEwsIC0xKSk7Cit9CisKKyNpZiBHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfUU5YCit2b2lkKiBUaHJlYWRGdW5jKHZvaWQqIGRhdGEpIHsKKyAgaW50ZXJuYWw6Ok11dGV4KiBtdXRleCA9IHN0YXRpY19jYXN0PGludGVybmFsOjpNdXRleCo+KGRhdGEpOworICBtdXRleC0+TG9jaygpOworICBtdXRleC0+VW5sb2NrKCk7CisgIHJldHVybiBOVUxMOworfQorCitURVNUKEdldFRocmVhZENvdW50VGVzdCwgUmV0dXJuc0NvcnJlY3RWYWx1ZSkgeworICBjb25zdCBzaXplX3Qgc3RhcnRpbmdfY291bnQgPSBHZXRUaHJlYWRDb3VudCgpOworICBwdGhyZWFkX3QgICAgICAgdGhyZWFkX2lkOworCisgIGludGVybmFsOjpNdXRleCBtdXRleDsKKyAgeworICAgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXgpOworICAgIHB0aHJlYWRfYXR0cl90ICBhdHRyOworICAgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cikpOworICAgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKSk7CisKKyAgICBjb25zdCBpbnQgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZF9pZCwgJmF0dHIsICZUaHJlYWRGdW5jLCAmbXV0ZXgpOworICAgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cikpOworICAgIEFTU0VSVF9FUSgwLCBzdGF0dXMpOworICAgIEVYUEVDVF9FUShzdGFydGluZ19jb3VudCArIDEsIEdldFRocmVhZENvdW50KCkpOworICB9CisKKyAgdm9pZCogZHVtbXk7CisgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2pvaW4odGhyZWFkX2lkLCAmZHVtbXkpKTsKKworICAvLyBUaGUgT1MgbWF5IG5vdCBpbW1lZGlhdGVseSByZXBvcnQgdGhlIHVwZGF0ZWQgdGhyZWFkIGNvdW50IGFmdGVyCisgIC8vIGpvaW5pbmcgYSB0aHJlYWQsIGNhdXNpbmcgZmxha2luZXNzIGluIHRoaXMgdGVzdC4gVG8gY291bnRlciB0aGF0LCB3ZQorICAvLyB3YWl0IGZvciB1cCB0byAuNSBzZWNvbmRzIGZvciB0aGUgT1MgdG8gcmVwb3J0IHRoZSBjb3JyZWN0IHZhbHVlLgorICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIGlmIChHZXRUaHJlYWRDb3VudCgpID09IHN0YXJ0aW5nX2NvdW50KQorICAgICAgYnJlYWs7CisKKyAgICBTbGVlcE1pbGxpc2Vjb25kcygxMDApOworICB9CisKKyAgRVhQRUNUX0VRKHN0YXJ0aW5nX2NvdW50LCBHZXRUaHJlYWRDb3VudCgpKTsKK30KKyNlbHNlCitURVNUKEdldFRocmVhZENvdW50VGVzdCwgUmV0dXJuc1plcm9XaGVuVW5hYmxlVG9Db3VudFRocmVhZHMpIHsKKyAgRVhQRUNUX0VRKDBVLCBHZXRUaHJlYWRDb3VudCgpKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX1FOWAorCitURVNUKEd0ZXN0Q2hlY2tEZWF0aFRlc3QsIERpZXNXaXRoQ29ycmVjdE91dHB1dE9uRmFpbHVyZSkgeworICBjb25zdCBib29sIGFfZmFsc2VfY29uZGl0aW9uID0gZmFsc2U7CisgIGNvbnN0IGNoYXIgcmVnZXhbXSA9CisjaWZkZWYgX01TQ19WRVIKKyAgICAgImd0ZXN0LXBvcnRfdGVzdFxcLmNjXFwoXFxkK1xcKToiCisjZWxpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCisgICAgICJndGVzdC1wb3J0X3Rlc3RcXC5jYzpbMC05XSsiCisjZWxzZQorICAgICAiZ3Rlc3QtcG9ydF90ZXN0XFwuY2M6XFxkKyIKKyNlbmRpZiAgLy8gX01TQ19WRVIKKyAgICAgIi4qYV9mYWxzZV9jb25kaXRpb24uKkV4dHJhIGluZm8uKiI7CisKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChHVEVTVF9DSEVDS18oYV9mYWxzZV9jb25kaXRpb24pIDw8ICJFeHRyYSBpbmZvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleCk7Cit9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCitURVNUKEd0ZXN0Q2hlY2tEZWF0aFRlc3QsIExpdmVzU2lsZW50bHlPblN1Y2Nlc3MpIHsKKyAgRVhQRUNUX0VYSVQoeworICAgICAgR1RFU1RfQ0hFQ0tfKHRydWUpIDw8ICJFeHRyYSBpbmZvIjsKKyAgICAgIDo6c3RkOjpjZXJyIDw8ICJTdWNjZXNzXG4iOworICAgICAgZXhpdCgwKTsgfSwKKyAgICAgIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICJTdWNjZXNzIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVmVyaWZpZXMgdGhhdCBHb29nbGUgVGVzdCBjaG9vc2UgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBhcHByb3ByaWF0ZSB0bworLy8gdGhlIHBsYXRmb3JtLiBUaGUgdGVzdCB3aWxsIHByb2R1Y2UgY29tcGlsZXIgZXJyb3JzIGluIGNhc2Ugb2YgZmFpbHVyZS4KKy8vIEZvciBzaW1wbGljaXR5LCB3ZSBvbmx5IGNvdmVyIHRoZSBtb3N0IGltcG9ydGFudCBwbGF0Zm9ybXMgaGVyZS4KK1RFU1QoUmVnZXhFbmdpbmVTZWxlY3Rpb25UZXN0LCBTZWxlY3RzQ29ycmVjdFJlZ2V4RW5naW5lKSB7CisjaWYgIUdURVNUX1VTRVNfUENSRQorIyBpZiBHVEVTVF9IQVNfUE9TSVhfUkUKKworICBFWFBFQ1RfVFJVRShHVEVTVF9VU0VTX1BPU0lYX1JFKTsKKworIyBlbHNlCisKKyAgRVhQRUNUX1RSVUUoR1RFU1RfVVNFU19TSU1QTEVfUkUpOworCisjIGVuZGlmCisjZW5kaWYgIC8vICFHVEVTVF9VU0VTX1BDUkUKK30KKworI2lmIEdURVNUX1VTRVNfUE9TSVhfUkUKKworIyBpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyPgorY2xhc3MgUkVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7fTsKKworLy8gRGVmaW5lcyBTdHJpbmdUeXBlcyBhcyB0aGUgbGlzdCBvZiBhbGwgc3RyaW5nIHR5cGVzIHRoYXQgY2xhc3MgUkUKKy8vIHN1cHBvcnRzLgordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczwKKyAgICA6OnN0ZDo6c3RyaW5nLAorIyAgaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKyAgICA6OnN0cmluZywKKyMgIGVuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworICAgIGNvbnN0IGNoYXIqPiBTdHJpbmdUeXBlczsKKworVFlQRURfVEVTVF9DQVNFKFJFVGVzdCwgU3RyaW5nVHlwZXMpOworCisvLyBUZXN0cyBSRSdzIGltcGxpY2l0IGNvbnN0cnVjdG9ycy4KK1RZUEVEX1RFU1QoUkVUZXN0LCBJbXBsaWNpdENvbnN0cnVjdG9yV29ya3MpIHsKKyAgY29uc3QgUkUgZW1wdHkoVHlwZVBhcmFtKCIiKSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgZW1wdHkucGF0dGVybigpKTsKKworICBjb25zdCBSRSBzaW1wbGUoVHlwZVBhcmFtKCJoZWxsbyIpKTsKKyAgRVhQRUNUX1NUUkVRKCJoZWxsbyIsIHNpbXBsZS5wYXR0ZXJuKCkpOworCisgIGNvbnN0IFJFIG5vcm1hbChUeXBlUGFyYW0oIi4qKFxcdyspIikpOworICBFWFBFQ1RfU1RSRVEoIi4qKFxcdyspIiwgbm9ybWFsLnBhdHRlcm4oKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUkUncyBjb25zdHJ1Y3RvcnMgcmVqZWN0IGludmFsaWQgcmVndWxhciBleHByZXNzaW9ucy4KK1RZUEVEX1RFU1QoUkVUZXN0LCBSZWplY3RzSW52YWxpZFJlZ2V4KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBjb25zdCBSRSBpbnZhbGlkKFR5cGVQYXJhbSgiPyIpKTsKKyAgfSwgIlwiP1wiIGlzIG5vdCBhIHZhbGlkIFBPU0lYIEV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4iKTsKK30KKworLy8gVGVzdHMgUkU6OkZ1bGxNYXRjaCgpLgorVFlQRURfVEVTVChSRVRlc3QsIEZ1bGxNYXRjaFdvcmtzKSB7CisgIGNvbnN0IFJFIGVtcHR5KFR5cGVQYXJhbSgiIikpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiIiksIGVtcHR5KSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYSIpLCBlbXB0eSkpOworCisgIGNvbnN0IFJFIHJlKFR5cGVQYXJhbSgiYS4qeiIpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OkZ1bGxNYXRjaChUeXBlUGFyYW0oImF6IiksIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goVHlwZVBhcmFtKCJheHl6IiksIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYmF6IiksIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6RnVsbE1hdGNoKFR5cGVQYXJhbSgiYXp5IiksIHJlKSk7Cit9CisKKy8vIFRlc3RzIFJFOjpQYXJ0aWFsTWF0Y2goKS4KK1RZUEVEX1RFU1QoUkVUZXN0LCBQYXJ0aWFsTWF0Y2hXb3JrcykgeworICBjb25zdCBSRSBlbXB0eShUeXBlUGFyYW0oIiIpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oIiIpLCBlbXB0eSkpOworICBFWFBFQ1RfVFJVRShSRTo6UGFydGlhbE1hdGNoKFR5cGVQYXJhbSgiYSIpLCBlbXB0eSkpOworCisgIGNvbnN0IFJFIHJlKFR5cGVQYXJhbSgiYS4qeiIpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oImF6IiksIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJheHl6IiksIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goVHlwZVBhcmFtKCJiYXoiKSwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oImF6eSIpLCByZSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OlBhcnRpYWxNYXRjaChUeXBlUGFyYW0oInp6YSIpLCByZSkpOworfQorCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisjZWxpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCitURVNUKElzSW5TZXRUZXN0LCBOdWxDaGFySXNOb3RJbkFueVNldCkgeworICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnXDAnLCAiIikpOworICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnXDAnLCAiXDAiKSk7CisgIEVYUEVDVF9GQUxTRShJc0luU2V0KCdcMCcsICJhIikpOworfQorCitURVNUKElzSW5TZXRUZXN0LCBXb3Jrc0Zvck5vbk51bENoYXJzKSB7CisgIEVYUEVDVF9GQUxTRShJc0luU2V0KCdhJywgIkFiIikpOworICBFWFBFQ1RfRkFMU0UoSXNJblNldCgnYycsICIiKSk7CisKKyAgRVhQRUNUX1RSVUUoSXNJblNldCgnYicsICJiY2QiKSk7CisgIEVYUEVDVF9UUlVFKElzSW5TZXQoJ2InLCAiYWIiKSk7Cit9CisKK1RFU1QoSXNBc2NpaURpZ2l0VGVzdCwgSXNGYWxzZUZvck5vbkRpZ2l0KSB7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpRGlnaXQoJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCcgJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCcrJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCctJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCcuJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaURpZ2l0KCdhJykpOworfQorCitURVNUKElzQXNjaWlEaWdpdFRlc3QsIElzVHJ1ZUZvckRpZ2l0KSB7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlEaWdpdCgnMCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaURpZ2l0KCcxJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpRGlnaXQoJzUnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlEaWdpdCgnOScpKTsKK30KKworVEVTVChJc0FzY2lpUHVuY3RUZXN0LCBJc0ZhbHNlRm9yTm9uUHVuY3QpIHsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlQdW5jdCgnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpUHVuY3QoJyAnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpUHVuY3QoJ1xuJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCdhJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVB1bmN0KCcwJykpOworfQorCitURVNUKElzQXNjaWlQdW5jdFRlc3QsIElzVHJ1ZUZvclB1bmN0KSB7CisgIGZvciAoY29uc3QgY2hhciogcCA9ICJeLSFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxdX2B7fH1+IjsgKnA7IHArKykgeworICAgIEVYUEVDVF9QUkVEMShJc0FzY2lpUHVuY3QsICpwKTsKKyAgfQorfQorCitURVNUKElzUmVwZWF0VGVzdCwgSXNGYWxzZUZvck5vblJlcGVhdENoYXIpIHsKKyAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCcgJykpOworICBFWFBFQ1RfRkFMU0UoSXNSZXBlYXQoJ2EnKSk7CisgIEVYUEVDVF9GQUxTRShJc1JlcGVhdCgnMScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzUmVwZWF0KCctJykpOworfQorCitURVNUKElzUmVwZWF0VGVzdCwgSXNUcnVlRm9yUmVwZWF0Q2hhcikgeworICBFWFBFQ1RfVFJVRShJc1JlcGVhdCgnPycpKTsKKyAgRVhQRUNUX1RSVUUoSXNSZXBlYXQoJyonKSk7CisgIEVYUEVDVF9UUlVFKElzUmVwZWF0KCcrJykpOworfQorCitURVNUKElzQXNjaWlXaGl0ZVNwYWNlVGVzdCwgSXNGYWxzZUZvck5vbldoaXRlU3BhY2UpIHsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCdhJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdoaXRlU3BhY2UoJzEnKSk7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV2hpdGVTcGFjZSgnKycpKTsKKyAgRVhQRUNUX0ZBTFNFKElzQXNjaWlXaGl0ZVNwYWNlKCdfJykpOworfQorCitURVNUKElzQXNjaWlXaGl0ZVNwYWNlVGVzdCwgSXNUcnVlRm9yV2hpdGVTcGFjZSkgeworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnICcpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1xuJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnXHInKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXaGl0ZVNwYWNlKCdcdCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdoaXRlU3BhY2UoJ1x2JykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV2hpdGVTcGFjZSgnXGYnKSk7Cit9CisKK1RFU1QoSXNBc2NpaVdvcmRDaGFyVGVzdCwgSXNGYWxzZUZvck5vbldvcmRDaGFyKSB7CisgIEVYUEVDVF9GQUxTRShJc0FzY2lpV29yZENoYXIoJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCcrJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCcuJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCcgJykpOworICBFWFBFQ1RfRkFMU0UoSXNBc2NpaVdvcmRDaGFyKCdcbicpKTsKK30KKworVEVTVChJc0FzY2lpV29yZENoYXJUZXN0LCBJc1RydWVGb3JMZXR0ZXIpIHsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCdhJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJ2InKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignQScpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCdaJykpOworfQorCitURVNUKElzQXNjaWlXb3JkQ2hhclRlc3QsIElzVHJ1ZUZvckRpZ2l0KSB7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignMCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNBc2NpaVdvcmRDaGFyKCcxJykpOworICBFWFBFQ1RfVFJVRShJc0FzY2lpV29yZENoYXIoJzcnKSk7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignOScpKTsKK30KKworVEVTVChJc0FzY2lpV29yZENoYXJUZXN0LCBJc1RydWVGb3JVbmRlcnNjb3JlKSB7CisgIEVYUEVDVF9UUlVFKElzQXNjaWlXb3JkQ2hhcignXycpKTsKK30KKworVEVTVChJc1ZhbGlkRXNjYXBlVGVzdCwgSXNGYWxzZUZvck5vblByaW50YWJsZSkgeworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCdcMDA3JykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc0ZhbHNlRm9yRGlnaXQpIHsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJzAnKSk7CisgIEVYUEVDVF9GQUxTRShJc1ZhbGlkRXNjYXBlKCc5JykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc0ZhbHNlRm9yV2hpdGVTcGFjZSkgeworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnICcpKTsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ1xuJykpOworfQorCitURVNUKElzVmFsaWRFc2NhcGVUZXN0LCBJc0ZhbHNlRm9yU29tZUxldHRlcikgeworICBFWFBFQ1RfRkFMU0UoSXNWYWxpZEVzY2FwZSgnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKElzVmFsaWRFc2NhcGUoJ1onKSk7Cit9CisKK1RFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzVHJ1ZUZvclB1bmN0KSB7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJy4nKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJy0nKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ14nKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJyQnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJygnKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ10nKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ3snKSk7CisgIEVYUEVDVF9UUlVFKElzVmFsaWRFc2NhcGUoJ3wnKSk7Cit9CisKK1RFU1QoSXNWYWxpZEVzY2FwZVRlc3QsIElzVHJ1ZUZvclNvbWVMZXR0ZXIpIHsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnZCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnRCcpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgncycpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnUycpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgndycpKTsKKyAgRVhQRUNUX1RSVUUoSXNWYWxpZEVzY2FwZSgnVycpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkUHVuY3QpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnXFwnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1xcJywgJyAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ18nLCAnLicpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnLicsICdhJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnXFwnLCAnXFwnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnXycsICdfJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJysnLCAnKycpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICcuJywgJy4nKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF9kKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZCcsICcuJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZCcsICcwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2QnLCAnOScpKTsKK30KKworVEVTVChBdG9tTWF0Y2hlc0NoYXJUZXN0LCBFc2NhcGVkX0QpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnRCcsICcwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJzknKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJ1wwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ0QnLCAnYScpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdEJywgJy0nKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF9zKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3MnLCAnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICcuJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJzknKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJyAnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAncycsICdcbicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdzJywgJ1x0JykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfUykgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJyAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1MnLCAnXHInKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJ1wwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1MnLCAnYScpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdTJywgJzknKSk7Cit9CisKK1RFU1QoQXRvbU1hdGNoZXNDaGFyVGVzdCwgRXNjYXBlZF93KSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnKycpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICcgJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ1xuJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICcwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3cnLCAnYicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd3JywgJ0MnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndycsICdfJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRfVykgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ0EnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnYicpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnVycsICc5JykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ18nKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ1wwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ1cnLCAnKicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICdXJywgJ1xuJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIEVzY2FwZWRXaGl0ZVNwYWNlKSB7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2YnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ2YnLCAnXG4nKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ24nLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ24nLCAnXHInKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3InLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3InLCAnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndCcsICdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndCcsICd0JykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd2JywgJ1wwJykpOworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd2JywgJ1xmJykpOworCisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAnZicsICdcZicpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICduJywgJ1xuJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIodHJ1ZSwgJ3InLCAnXHInKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcih0cnVlLCAndCcsICdcdCcpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKHRydWUsICd2JywgJ1x2JykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIFVuZXNjYXBlZERvdCkgeworICBFWFBFQ1RfRkFMU0UoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICdcbicpKTsKKworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICcuJywgJ1wwJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICcuJywgJy4nKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJy4nLCAnYScpKTsKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnLicsICcgJykpOworfQorCitURVNUKEF0b21NYXRjaGVzQ2hhclRlc3QsIFVuZXNjYXBlZENoYXIpIHsKKyAgRVhQRUNUX0ZBTFNFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJ2EnLCAnXDAnKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICdhJywgJ2InKSk7CisgIEVYUEVDVF9GQUxTRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICckJywgJ2EnKSk7CisKKyAgRVhQRUNUX1RSVUUoQXRvbU1hdGNoZXNDaGFyKGZhbHNlLCAnJCcsICckJykpOworICBFWFBFQ1RfVFJVRShBdG9tTWF0Y2hlc0NoYXIoZmFsc2UsICc1JywgJzUnKSk7CisgIEVYUEVDVF9UUlVFKEF0b21NYXRjaGVzQ2hhcihmYWxzZSwgJ1onLCAnWicpKTsKK30KKworVEVTVChWYWxpZGF0ZVJlZ2V4VGVzdCwgR2VuZXJhdGVzRmFpbHVyZUFuZFJldHVybnNGYWxzZUZvckludmFsaWQpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoTlVMTCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoImFcXCIpKSwKKyAgICAgICJTeW50YXggZXJyb3IgYXQgaW5kZXggMSBpbiBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIFwiYVxcXCI6ICIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYVxcIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ1xcJyBjYW5ub3QgYXBwZWFyIGF0IHRoZSBlbmQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIlxcblxcIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ1xcJyBjYW5ub3QgYXBwZWFyIGF0IHRoZSBlbmQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIlxcc1xcaGIiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcIlxcaFwiIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJeXiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIideJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiLipeYiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIideJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiJCQiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInJCcgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIl4kYSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIickJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGVuZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYShiIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJygnIGlzIHVuc3VwcG9ydGVkIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCJhYikiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICInKScgaXMgdW5zdXBwb3J0ZWQiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIlthYiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIidbJyBpcyB1bnN1cHBvcnRlZCIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoVmFsaWRhdGVSZWdleCgiYXsyIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3snIGlzIHVuc3VwcG9ydGVkIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRShWYWxpZGF0ZVJlZ2V4KCI/IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJz8nIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIl4qIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJyonIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFZhbGlkYXRlUmVnZXgoIjUqKyIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIicrJyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuIik7Cit9CisKK1RFU1QoVmFsaWRhdGVSZWdleFRlc3QsIFJldHVybnNUcnVlRm9yVmFsaWQpIHsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCJhIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCIuKiIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiXmFfKyIpKTsKKyAgRVhQRUNUX1RSVUUoVmFsaWRhdGVSZWdleCgiXmFcXHRcXCY/IikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCIwOSokIikpOworICBFWFBFQ1RfVFJVRShWYWxpZGF0ZVJlZ2V4KCJeWiQiKSk7CisgIEVYUEVDVF9UUlVFKFZhbGlkYXRlUmVnZXgoImFcXF5aXFwkXFwoXFwpXFx8XFxbXFxdXFx7XFx9IikpOworfQorCitURVNUKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NGb3JaZXJvT3JPbmUpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnYScsICc/JywgImEiLCAiYmEiKSk7CisgIC8vIFJlcGVhdGluZyBtb3JlIHRoYW4gb25jZS4KKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnYScsICc/JywgImIiLCAiYWFiIikpOworCisgIC8vIFJlcGVhdGluZyB6ZXJvIHRpbWVzLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJ2EnLCAnPycsICJiIiwgImJhIikpOworICAvLyBSZXBlYXRpbmcgb25jZS4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICdhJywgJz8nLCAiYiIsICJhYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcjJywgJz8nLCAiLiIsICIjIyIpKTsKK30KKworVEVTVChNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZFRlc3QsIFdvcmtzRm9yWmVyb09yTWFueSkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJyonLCAiYSQiLCAiYmFhYiIpKTsKKworICAvLyBSZXBlYXRpbmcgemVybyB0aW1lcy4KKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJyonLCAiYiIsICJiYyIpKTsKKyAgLy8gUmVwZWF0aW5nIG9uY2UuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKGZhbHNlLCAnLicsICcqJywgImIiLCAiYWJjIikpOworICAvLyBSZXBlYXRpbmcgbW9yZSB0aGFuIG9uY2UuCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKHRydWUsICd3JywgJyonLCAiLSIsICJhYl8xLWciKSk7Cit9CisKK1RFU1QoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc0Zvck9uZU9yTWFueSkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoZmFsc2UsICcuJywgJysnLCAiYSQiLCAiYmFhYiIpKTsKKyAgLy8gUmVwZWF0aW5nIHplcm8gdGltZXMuCisgIEVYUEVDVF9GQUxTRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKycsICJiIiwgImJjIikpOworCisgIC8vIFJlcGVhdGluZyBvbmNlLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZChmYWxzZSwgJy4nLCAnKycsICJiIiwgImFiYyIpKTsKKyAgLy8gUmVwZWF0aW5nIG1vcmUgdGhhbiBvbmNlLgorICBFWFBFQ1RfVFJVRShNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCh0cnVlLCAndycsICcrJywgIi0iLCAiYWJfMS1nIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBSZXR1cm5zVHJ1ZUZvckVtcHR5UmVnZXgpIHsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiIiwgIiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiIiwgImFiIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc1doZW5Eb2xsYXJJc0luUmVnZXgpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIiQiLCAiYSIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCIkIiwgIiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiYSQiLCAiYSIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwgV29ya3NXaGVuUmVnZXhTdGFydHNXaXRoRXNjYXBlU2VxdWVuY2UpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoIlxcdyIsICIrIikpOworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiXFxXIiwgImFiIikpOworCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcc2EiLCAiXG5hYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFxkIiwgIjFhIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBdEhlYWRUZXN0LCBXb3Jrc1doZW5SZWdleFN0YXJ0c1dpdGhSZXBldGl0aW9uKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCIuK2EiLCAiYWJjIikpOworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEF0SGVhZCgiYT9iIiwgImFhYiIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCIuKmEiLCAiYmMxMi1hYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiYT9iIiwgImIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoImE/YiIsICJhYiIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QXRIZWFkVGVzdCwKKyAgICAgV29ya3NXaGVuUmVnZXhTdGFydHNXaXRoUmVwZXRpb25PZkVzY2FwZVNlcXVlbmNlKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJcXC4rYSIsICJhYmMiKSk7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QXRIZWFkKCJcXHM/YiIsICIgIGIiKSk7CisKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFwoKmEiLCAiKCgoKGFiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QXRIZWFkKCJcXF4/YiIsICJeYiIpKTsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEF0SGVhZCgiXFxcXD9iIiwgImIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoIlxcXFw/YiIsICJcXGIiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEF0SGVhZFRlc3QsIE1hdGNoZXNTZXF1ZW50aWFsbHkpIHsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBdEhlYWQoImFiLipjIiwgImFjYWJjIikpOworCisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBdEhlYWQoImFiLipjIiwgImFiLWZzYyIpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBSZXR1cm5zRmFsc2VXaGVuU3RyaW5nSXNOdWxsKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoIiIsIE5VTEwpKTsKK30KKworVEVTVChNYXRjaFJlZ2V4QW55d2hlcmVUZXN0LCBXb3Jrc1doZW5SZWdleFN0YXJ0c1dpdGhDYXJldCkgeworICBFWFBFQ1RfRkFMU0UoTWF0Y2hSZWdleEFueXdoZXJlKCJeYSIsICJiYSIpKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXiQiLCAiYSIpKTsKKworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIl5hIiwgImFiIikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIl4iLCAiYWIiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXiQiLCAiIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBbnl3aGVyZVRlc3QsIFJldHVybnNGYWxzZVdoZW5Ob01hdGNoKSB7CisgIEVYUEVDVF9GQUxTRShNYXRjaFJlZ2V4QW55d2hlcmUoImEiLCAiYmNkZTEyMyIpKTsKKyAgRVhQRUNUX0ZBTFNFKE1hdGNoUmVnZXhBbnl3aGVyZSgiYS4rYSIsICItLWFhODg4ODg4ODgiKSk7Cit9CisKK1RFU1QoTWF0Y2hSZWdleEFueXdoZXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuTWF0Y2hpbmdQcmVmaXgpIHsKKyAgRVhQRUNUX1RSVUUoTWF0Y2hSZWdleEFueXdoZXJlKCJcXHcrIiwgImFiMV8gLSA1IikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoIi4qPSIsICI9IikpOworICBFWFBFQ1RfVFJVRShNYXRjaFJlZ2V4QW55d2hlcmUoInguKmFiPy4qYmMiLCAieGFhYWJjIikpOworfQorCitURVNUKE1hdGNoUmVnZXhBbnl3aGVyZVRlc3QsIFJldHVybnNUcnVlV2hlbk1hdGNoaW5nTm9uUHJlZml4KSB7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXFx3KyIsICIkJCQgYWIxXyAtIDUiKSk7CisgIEVYUEVDVF9UUlVFKE1hdGNoUmVnZXhBbnl3aGVyZSgiXFwuKz0iLCAiPSAgLi4uPSIpKTsKK30KKworLy8gVGVzdHMgUkUncyBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMuCitURVNUKFJFVGVzdCwgSW1wbGljaXRDb25zdHJ1Y3RvcldvcmtzKSB7CisgIGNvbnN0IFJFIGVtcHR5KCIiKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBlbXB0eS5wYXR0ZXJuKCkpOworCisgIGNvbnN0IFJFIHNpbXBsZSgiaGVsbG8iKTsKKyAgRVhQRUNUX1NUUkVRKCJoZWxsbyIsIHNpbXBsZS5wYXR0ZXJuKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFJFJ3MgY29uc3RydWN0b3JzIHJlamVjdCBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCitURVNUKFJFVGVzdCwgUmVqZWN0c0ludmFsaWRSZWdleCkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgY29uc3QgUkUgbm9ybWFsKE5VTEwpOworICB9LCAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIik7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIGNvbnN0IFJFIG5vcm1hbCgiLiooXFx3KyIpOworICB9LCAiJygnIGlzIHVuc3VwcG9ydGVkIik7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIGNvbnN0IFJFIGludmFsaWQoIl4/Iik7CisgIH0sICInPycgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbiIpOworfQorCisvLyBUZXN0cyBSRTo6RnVsbE1hdGNoKCkuCitURVNUKFJFVGVzdCwgRnVsbE1hdGNoV29ya3MpIHsKKyAgY29uc3QgUkUgZW1wdHkoIiIpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKCIiLCBlbXB0eSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaCgiYSIsIGVtcHR5KSk7CisKKyAgY29uc3QgUkUgcmUxKCJhIik7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goImEiLCByZTEpKTsKKworICBjb25zdCBSRSByZSgiYS4qeiIpOworICBFWFBFQ1RfVFJVRShSRTo6RnVsbE1hdGNoKCJheiIsIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpGdWxsTWF0Y2goImF4eXoiLCByZSkpOworICBFWFBFQ1RfRkFMU0UoUkU6OkZ1bGxNYXRjaCgiYmF6IiwgcmUpKTsKKyAgRVhQRUNUX0ZBTFNFKFJFOjpGdWxsTWF0Y2goImF6eSIsIHJlKSk7Cit9CisKKy8vIFRlc3RzIFJFOjpQYXJ0aWFsTWF0Y2goKS4KK1RFU1QoUkVUZXN0LCBQYXJ0aWFsTWF0Y2hXb3JrcykgeworICBjb25zdCBSRSBlbXB0eSgiIik7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goIiIsIGVtcHR5KSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImEiLCBlbXB0eSkpOworCisgIGNvbnN0IFJFIHJlKCJhLip6Iik7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImF6IiwgcmUpKTsKKyAgRVhQRUNUX1RSVUUoUkU6OlBhcnRpYWxNYXRjaCgiYXh5eiIsIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImJheiIsIHJlKSk7CisgIEVYUEVDVF9UUlVFKFJFOjpQYXJ0aWFsTWF0Y2goImF6eSIsIHJlKSk7CisgIEVYUEVDVF9GQUxTRShSRTo6UGFydGlhbE1hdGNoKCJ6emEiLCByZSkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfUE9TSVhfUkUKKworI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCitURVNUKENhcHR1cmVUZXN0LCBDYXB0dXJlc1N0ZG91dCkgeworICBDYXB0dXJlU3Rkb3V0KCk7CisgIGZwcmludGYoc3Rkb3V0LCAiYWJjIik7CisgIEVYUEVDVF9TVFJFUSgiYWJjIiwgR2V0Q2FwdHVyZWRTdGRvdXQoKS5jX3N0cigpKTsKKworICBDYXB0dXJlU3Rkb3V0KCk7CisgIGZwcmludGYoc3Rkb3V0LCAiZGVmJWNnaGkiLCAnXDAnKTsKKyAgRVhQRUNUX0VRKDo6c3RkOjpzdHJpbmcoImRlZlwwZ2hpIiwgNyksIDo6c3RkOjpzdHJpbmcoR2V0Q2FwdHVyZWRTdGRvdXQoKSkpOworfQorCitURVNUKENhcHR1cmVUZXN0LCBDYXB0dXJlc1N0ZGVycikgeworICBDYXB0dXJlU3RkZXJyKCk7CisgIGZwcmludGYoc3RkZXJyLCAiamtsIik7CisgIEVYUEVDVF9TVFJFUSgiamtsIiwgR2V0Q2FwdHVyZWRTdGRlcnIoKS5jX3N0cigpKTsKKworICBDYXB0dXJlU3RkZXJyKCk7CisgIGZwcmludGYoc3RkZXJyLCAiamtsJWNtbm8iLCAnXDAnKTsKKyAgRVhQRUNUX0VRKDo6c3RkOjpzdHJpbmcoImprbFwwbW5vIiwgNyksIDo6c3RkOjpzdHJpbmcoR2V0Q2FwdHVyZWRTdGRlcnIoKSkpOworfQorCisvLyBUZXN0cyB0aGF0IHN0ZG91dCBhbmQgc3RkZXJyIGNhcHR1cmUgZG9uJ3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlci4KK1RFU1QoQ2FwdHVyZVRlc3QsIENhcHR1cmVzU3Rkb3V0QW5kU3RkZXJyKSB7CisgIENhcHR1cmVTdGRvdXQoKTsKKyAgQ2FwdHVyZVN0ZGVycigpOworICBmcHJpbnRmKHN0ZG91dCwgInBxciIpOworICBmcHJpbnRmKHN0ZGVyciwgInN0dSIpOworICBFWFBFQ1RfU1RSRVEoInBxciIsIEdldENhcHR1cmVkU3Rkb3V0KCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgic3R1IiwgR2V0Q2FwdHVyZWRTdGRlcnIoKS5jX3N0cigpKTsKK30KKworVEVTVChDYXB0dXJlRGVhdGhUZXN0LCBDYW5ub3RSZWVudGVyU3Rkb3V0Q2FwdHVyZSkgeworICBDYXB0dXJlU3Rkb3V0KCk7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoQ2FwdHVyZVN0ZG91dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmx5IG9uZSBzdGRvdXQgY2FwdHVyZXIgY2FuIGV4aXN0IGF0IGEgdGltZSIpOworICBHZXRDYXB0dXJlZFN0ZG91dCgpOworCisgIC8vIFdlIGNhbm5vdCB0ZXN0IHN0ZGVyciBjYXB0dXJpbmcgdXNpbmcgZGVhdGggdGVzdHMgYXMgdGhleSB1c2UgaXQKKyAgLy8gdGhlbXNlbHZlcy4KK30KKworI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvckluaXRpYWxpemVzVG9EZWZhdWx0VmFsdWVzKSB7CisgIFRocmVhZExvY2FsPGludD4gdDE7CisgIEVYUEVDVF9FUSgwLCB0MS5nZXQoKSk7CisKKyAgVGhyZWFkTG9jYWw8dm9pZCo+IHQyOworICBFWFBFQ1RfVFJVRSh0Mi5nZXQoKSA9PSBOVUxMKTsKK30KKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIFNpbmdsZVBhcmFtQ29uc3RydWN0b3JJbml0aWFsaXplc1RvUGFyYW0pIHsKKyAgVGhyZWFkTG9jYWw8aW50PiB0MSgxMjMpOworICBFWFBFQ1RfRVEoMTIzLCB0MS5nZXQoKSk7CisKKyAgaW50IGkgPSAwOworICBUaHJlYWRMb2NhbDxpbnQqPiB0MigmaSk7CisgIEVYUEVDVF9FUSgmaSwgdDIuZ2V0KCkpOworfQorCitjbGFzcyBOb0RlZmF1bHRDb250cnVjdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE5vRGVmYXVsdENvbnRydWN0b3IoY29uc3QgY2hhciopIHt9CisgIE5vRGVmYXVsdENvbnRydWN0b3IoY29uc3QgTm9EZWZhdWx0Q29udHJ1Y3RvciYpIHt9Cit9OworCitURVNUKFRocmVhZExvY2FsVGVzdCwgVmFsdWVEZWZhdWx0Q29udHJ1Y3RvcklzTm90UmVxdWlyZWRGb3JQYXJhbVZlcnNpb24pIHsKKyAgVGhyZWFkTG9jYWw8Tm9EZWZhdWx0Q29udHJ1Y3Rvcj4gYmFyKE5vRGVmYXVsdENvbnRydWN0b3IoImZvbyIpKTsKKyAgYmFyLnBvaW50ZXIoKTsKK30KKworVEVTVChUaHJlYWRMb2NhbFRlc3QsIEdldEFuZFBvaW50ZXJSZXR1cm5TYW1lVmFsdWUpIHsKKyAgVGhyZWFkTG9jYWw8c3RkOjpzdHJpbmc+IHRocmVhZF9sb2NhbF9zdHJpbmc7CisKKyAgRVhQRUNUX0VRKHRocmVhZF9sb2NhbF9zdHJpbmcucG9pbnRlcigpLCAmKHRocmVhZF9sb2NhbF9zdHJpbmcuZ2V0KCkpKTsKKworICAvLyBWZXJpZmllcyB0aGUgY29uZGl0aW9uIHN0aWxsIGhvbGRzIGFmdGVyIGNhbGxpbmcgc2V0LgorICB0aHJlYWRfbG9jYWxfc3RyaW5nLnNldCgiZm9vIik7CisgIEVYUEVDVF9FUSh0aHJlYWRfbG9jYWxfc3RyaW5nLnBvaW50ZXIoKSwgJih0aHJlYWRfbG9jYWxfc3RyaW5nLmdldCgpKSk7Cit9CisKK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBQb2ludGVyQW5kQ29uc3RQb2ludGVyUmV0dXJuU2FtZVZhbHVlKSB7CisgIFRocmVhZExvY2FsPHN0ZDo6c3RyaW5nPiB0aHJlYWRfbG9jYWxfc3RyaW5nOworICBjb25zdCBUaHJlYWRMb2NhbDxzdGQ6OnN0cmluZz4mIGNvbnN0X3RocmVhZF9sb2NhbF9zdHJpbmcgPQorICAgICAgdGhyZWFkX2xvY2FsX3N0cmluZzsKKworICBFWFBFQ1RfRVEodGhyZWFkX2xvY2FsX3N0cmluZy5wb2ludGVyKCksIGNvbnN0X3RocmVhZF9sb2NhbF9zdHJpbmcucG9pbnRlcigpKTsKKworICB0aHJlYWRfbG9jYWxfc3RyaW5nLnNldCgiZm9vIik7CisgIEVYUEVDVF9FUSh0aHJlYWRfbG9jYWxfc3RyaW5nLnBvaW50ZXIoKSwgY29uc3RfdGhyZWFkX2xvY2FsX3N0cmluZy5wb2ludGVyKCkpOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCit2b2lkIEFkZFR3byhpbnQqIHBhcmFtKSB7ICpwYXJhbSArPSAyOyB9CisKK1RFU1QoVGhyZWFkV2l0aFBhcmFtVGVzdCwgQ29uc3RydWN0b3JFeGVjdXRlc1RocmVhZEZ1bmMpIHsKKyAgaW50IGkgPSA0MDsKKyAgVGhyZWFkV2l0aFBhcmFtPGludCo+IHRocmVhZCgmQWRkVHdvLCAmaSwgTlVMTCk7CisgIHRocmVhZC5Kb2luKCk7CisgIEVYUEVDVF9FUSg0MiwgaSk7Cit9CisKK1RFU1QoTXV0ZXhEZWF0aFRlc3QsIEFzc2VydEhlbGRTaG91bGRBc3NlcnRXaGVuTm90TG9ja2VkKSB7CisgIC8vIEFzc2VydEhlbGQoKSBpcyBmbGFreSBvbmx5IGluIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSB0aHJlYWRzIGFjY2Vzc2luZworICAvLyB0aGUgbG9jay4gSW4gdGhpcyBjYXNlLCB0aGUgdGVzdCBpcyByb2J1c3QuCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoeworICAgIE11dGV4IG07CisgICAgeyBNdXRleExvY2sgbG9jaygmbSk7IH0KKyAgICBtLkFzc2VydEhlbGQoKTsKKyAgfSwKKyAgInRocmVhZCAuKmhvbGQiKTsKK30KKworVEVTVChNdXRleFRlc3QsIEFzc2VydEhlbGRTaG91bGROb3RBc3NlcnRXaGVuTG9ja2VkKSB7CisgIE11dGV4IG07CisgIE11dGV4TG9jayBsb2NrKCZtKTsKKyAgbS5Bc3NlcnRIZWxkKCk7Cit9CisKK2NsYXNzIEF0b21pY0NvdW50ZXJXaXRoTXV0ZXggeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQXRvbWljQ291bnRlcldpdGhNdXRleChNdXRleCogbXV0ZXgpIDoKKyAgICB2YWx1ZV8oMCksIG11dGV4XyhtdXRleCksIHJhbmRvbV8oNDIpIHt9CisKKyAgdm9pZCBJbmNyZW1lbnQoKSB7CisgICAgTXV0ZXhMb2NrIGxvY2sobXV0ZXhfKTsKKyAgICBpbnQgdGVtcCA9IHZhbHVlXzsKKyAgICB7CisgICAgICAvLyBXZSBuZWVkIHRvIHB1dCB1cCBhIG1lbW9yeSBiYXJyaWVyIHRvIHByZXZlbnQgcmVhZHMgYW5kIHdyaXRlcyB0bworICAgICAgLy8gdmFsdWVfIHJlYXJyYW5nZWQgd2l0aCB0aGUgY2FsbCB0byBTbGVlcE1pbGxpc2Vjb25kcyB3aGVuIG9ic2VydmVkCisgICAgICAvLyBmcm9tIG90aGVyIHRocmVhZHMuCisjaWYgR1RFU1RfSEFTX1BUSFJFQUQKKyAgICAgIC8vIE9uIFBPU0lYLCBsb2NraW5nIGEgbXV0ZXggcHV0cyB1cCBhIG1lbW9yeSBiYXJyaWVyLiAgV2UgY2Fubm90IHVzZQorICAgICAgLy8gTXV0ZXggYW5kIE11dGV4TG9jayBoZXJlIG9yIHJlbHkgb24gdGhlaXIgbWVtb3J5IGJhcnJpZXIKKyAgICAgIC8vIGZ1bmN0aW9uYWxpdHkgYXMgd2UgYXJlIHRlc3RpbmcgdGhlbSBoZXJlLgorICAgICAgcHRocmVhZF9tdXRleF90IG1lbW9yeV9iYXJyaWVyX211dGV4OworICAgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18oCisgICAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZtZW1vcnlfYmFycmllcl9tdXRleCwgTlVMTCkpOworICAgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9sb2NrKCZtZW1vcnlfYmFycmllcl9tdXRleCkpOworCisgICAgICBTbGVlcE1pbGxpc2Vjb25kcyhyYW5kb21fLkdlbmVyYXRlKDMwKSk7CisKKyAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtZW1vcnlfYmFycmllcl9tdXRleCkpOworICAgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9kZXN0cm95KCZtZW1vcnlfYmFycmllcl9tdXRleCkpOworI2VsaWYgR1RFU1RfT1NfV0lORE9XUworICAgICAgLy8gT24gV2luZG93cywgcGVyZm9ybWluZyBhbiBpbnRlcmxvY2tlZCBhY2Nlc3MgcHV0cyB1cCBhIG1lbW9yeSBiYXJyaWVyLgorICAgICAgdm9sYXRpbGUgTE9ORyBkdW1teSA9IDA7CisgICAgICA6OkludGVybG9ja2VkSW5jcmVtZW50KCZkdW1teSk7CisgICAgICBTbGVlcE1pbGxpc2Vjb25kcyhyYW5kb21fLkdlbmVyYXRlKDMwKSk7CisgICAgICA6OkludGVybG9ja2VkSW5jcmVtZW50KCZkdW1teSk7CisjZWxzZQorIyBlcnJvciAiTWVtb3J5IGJhcnJpZXIgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0uIgorI2VuZGlmICAvLyBHVEVTVF9IQVNfUFRIUkVBRAorICAgIH0KKyAgICB2YWx1ZV8gPSB0ZW1wICsgMTsKKyAgfQorICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworIHByaXZhdGU6CisgIHZvbGF0aWxlIGludCB2YWx1ZV87CisgIE11dGV4KiBjb25zdCBtdXRleF87ICAvLyBQcm90ZWN0cyB2YWx1ZV8uCisgIFJhbmRvbSAgICAgICByYW5kb21fOworfTsKKwordm9pZCBDb3VudGluZ1RocmVhZEZ1bmMocGFpcjxBdG9taWNDb3VudGVyV2l0aE11dGV4KiwgaW50PiBwYXJhbSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtLnNlY29uZDsgKytpKQorICAgICAgcGFyYW0uZmlyc3QtPkluY3JlbWVudCgpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBtdXRleCBvbmx5IGxldHMgb25lIHRocmVhZCBhdCBhIHRpbWUgdG8gbG9jayBpdC4KK1RFU1QoTXV0ZXhUZXN0LCBPbmx5T25lVGhyZWFkQ2FuTG9ja0F0QVRpbWUpIHsKKyAgTXV0ZXggbXV0ZXg7CisgIEF0b21pY0NvdW50ZXJXaXRoTXV0ZXggbG9ja2VkX2NvdW50ZXIoJm11dGV4KTsKKworICB0eXBlZGVmIFRocmVhZFdpdGhQYXJhbTxwYWlyPEF0b21pY0NvdW50ZXJXaXRoTXV0ZXgqLCBpbnQ+ID4gVGhyZWFkVHlwZTsKKyAgY29uc3QgaW50IGtDeWNsZUNvdW50ID0gMjA7CisgIGNvbnN0IGludCBrVGhyZWFkQ291bnQgPSA3OworICBzY29wZWRfcHRyPFRocmVhZFR5cGU+IGNvdW50aW5nX3RocmVhZHNba1RocmVhZENvdW50XTsKKyAgTm90aWZpY2F0aW9uIHRocmVhZHNfY2FuX3N0YXJ0OworICAvLyBDcmVhdGVzIGFuZCBydW5zIGtUaHJlYWRDb3VudCB0aHJlYWRzIHRoYXQgaW5jcmVtZW50IGxvY2tlZF9jb3VudGVyCisgIC8vIGtDeWNsZUNvdW50IHRpbWVzIGVhY2guCisgIGZvciAoaW50IGkgPSAwOyBpIDwga1RocmVhZENvdW50OyArK2kpIHsKKyAgICBjb3VudGluZ190aHJlYWRzW2ldLnJlc2V0KG5ldyBUaHJlYWRUeXBlKCZDb3VudGluZ1RocmVhZEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoJmxvY2tlZF9jb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDeWNsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRzX2Nhbl9zdGFydCkpOworICB9CisgIHRocmVhZHNfY2FuX3N0YXJ0Lk5vdGlmeSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRDb3VudDsgKytpKQorICAgIGNvdW50aW5nX3RocmVhZHNbaV0tPkpvaW4oKTsKKworICAvLyBJZiB0aGUgbXV0ZXggbGV0cyBtb3JlIHRoYW4gb25lIHRocmVhZCB0byBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgYXQgYQorICAvLyB0aW1lLCB0aGV5IGFyZSBsaWtlbHkgdG8gZW5jb3VudGVyIGEgcmFjZSBjb25kaXRpb24gYW5kIGhhdmUgc29tZQorICAvLyBpbmNyZW1lbnRzIG92ZXJ3cml0dGVuLCByZXN1bHRpbmcgaW4gdGhlIGxvd2VyIHRoZW4gZXhwZWN0ZWQgY291bnRlcgorICAvLyB2YWx1ZS4KKyAgRVhQRUNUX0VRKGtDeWNsZUNvdW50ICoga1RocmVhZENvdW50LCBsb2NrZWRfY291bnRlci52YWx1ZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFJ1bkZyb21UaHJlYWQodm9pZCAoZnVuYykoVCksIFQgcGFyYW0pIHsKKyAgVGhyZWFkV2l0aFBhcmFtPFQ+IHRocmVhZChmdW5jLCBwYXJhbSwgTlVMTCk7CisgIHRocmVhZC5Kb2luKCk7Cit9CisKK3ZvaWQgUmV0cmlldmVUaHJlYWRMb2NhbFZhbHVlKAorICAgIHBhaXI8VGhyZWFkTG9jYWw8c3RkOjpzdHJpbmc+Kiwgc3RkOjpzdHJpbmcqPiBwYXJhbSkgeworICAqcGFyYW0uc2Vjb25kID0gcGFyYW0uZmlyc3QtPmdldCgpOworfQorCitURVNUKFRocmVhZExvY2FsVGVzdCwgUGFyYW1ldGVyaXplZENvbnN0cnVjdG9yU2V0c0RlZmF1bHQpIHsKKyAgVGhyZWFkTG9jYWw8c3RkOjpzdHJpbmc+IHRocmVhZF9sb2NhbF9zdHJpbmcoImZvbyIpOworICBFWFBFQ1RfU1RSRVEoImZvbyIsIHRocmVhZF9sb2NhbF9zdHJpbmcuZ2V0KCkuY19zdHIoKSk7CisKKyAgdGhyZWFkX2xvY2FsX3N0cmluZy5zZXQoImJhciIpOworICBFWFBFQ1RfU1RSRVEoImJhciIsIHRocmVhZF9sb2NhbF9zdHJpbmcuZ2V0KCkuY19zdHIoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBSdW5Gcm9tVGhyZWFkKCZSZXRyaWV2ZVRocmVhZExvY2FsVmFsdWUsCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCZ0aHJlYWRfbG9jYWxfc3RyaW5nLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9TVFJFUSgiZm9vIiwgcmVzdWx0LmNfc3RyKCkpOworfQorCisvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIG9mIGRlc3RydWN0b3JzIGJlaW5nIGNhbGxlZCBvbiBpbnN0YW5jZXMgb2YKKy8vIERlc3RydWN0b3JUcmFja2VyLiAgT24gV2luZG93cywgd2FpdHMgZm9yIHRoZSBkZXN0cnVjdG9yIGNhbGwgcmVwb3J0cy4KK2NsYXNzIERlc3RydWN0b3JDYWxsIHsKKyBwdWJsaWM6CisgIERlc3RydWN0b3JDYWxsKCkgeworICAgIGludm9rZWRfID0gZmFsc2U7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAgIHdhaXRfZXZlbnRfLlJlc2V0KDo6Q3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpKTsKKyAgICBHVEVTVF9DSEVDS18od2FpdF9ldmVudF8uR2V0KCkgIT0gTlVMTCk7CisjZW5kaWYKKyAgfQorCisgIGJvb2wgQ2hlY2tEZXN0cm95ZWQoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAgIGlmICg6OldhaXRGb3JTaW5nbGVPYmplY3Qod2FpdF9ldmVudF8uR2V0KCksIDEwMDApICE9IFdBSVRfT0JKRUNUXzApCisgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gaW52b2tlZF87CisgIH0KKworICB2b2lkIFJlcG9ydERlc3Ryb3llZCgpIHsKKyAgICBpbnZva2VkXyA9IHRydWU7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAgIDo6U2V0RXZlbnQod2FpdF9ldmVudF8uR2V0KCkpOworI2VuZGlmCisgIH0KKworICBzdGF0aWMgc3RkOjp2ZWN0b3I8RGVzdHJ1Y3RvckNhbGwqPiYgTGlzdCgpIHsgcmV0dXJuICpsaXN0XzsgfQorCisgIHN0YXRpYyB2b2lkIFJlc2V0TGlzdCgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RfLT5zaXplKCk7ICsraSkgeworICAgICAgZGVsZXRlIGxpc3RfLT5hdChpKTsKKyAgICB9CisgICAgbGlzdF8tPmNsZWFyKCk7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wgaW52b2tlZF87CisjaWYgR1RFU1RfT1NfV0lORE9XUworICBBdXRvSGFuZGxlIHdhaXRfZXZlbnRfOworI2VuZGlmCisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxEZXN0cnVjdG9yQ2FsbCo+KiBjb25zdCBsaXN0XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlc3RydWN0b3JDYWxsKTsKK307CisKK3N0ZDo6dmVjdG9yPERlc3RydWN0b3JDYWxsKj4qIGNvbnN0IERlc3RydWN0b3JDYWxsOjpsaXN0XyA9CisgICAgbmV3IHN0ZDo6dmVjdG9yPERlc3RydWN0b3JDYWxsKj47CisKKy8vIERlc3RydWN0b3JUcmFja2VyIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgaXRzIGluc3RhbmNlcyBoYXZlIGJlZW4KKy8vIGRlc3Ryb3llZC4KK2NsYXNzIERlc3RydWN0b3JUcmFja2VyIHsKKyBwdWJsaWM6CisgIERlc3RydWN0b3JUcmFja2VyKCkgOiBpbmRleF8oR2V0TmV3SW5kZXgoKSkge30KKyAgRGVzdHJ1Y3RvclRyYWNrZXIoY29uc3QgRGVzdHJ1Y3RvclRyYWNrZXImIC8qIHJocyAqLykKKyAgICAgIDogaW5kZXhfKEdldE5ld0luZGV4KCkpIHt9CisgIH5EZXN0cnVjdG9yVHJhY2tlcigpIHsKKyAgICAvLyBXZSBuZXZlciBhY2Nlc3MgRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKSBjb25jdXJyZW50bHksIHNvIHdlIGRvbid0IG5lZWQKKyAgICAvLyB0byBwcm90ZWN0IHRoaXMgYWNjY2VzcyB3aXRoIGEgbXV0ZXguCisgICAgRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKVtpbmRleF9dLT5SZXBvcnREZXN0cm95ZWQoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIHNpemVfdCBHZXROZXdJbmRleCgpIHsKKyAgICBEZXN0cnVjdG9yQ2FsbDo6TGlzdCgpLnB1c2hfYmFjayhuZXcgRGVzdHJ1Y3RvckNhbGwpOworICAgIHJldHVybiBEZXN0cnVjdG9yQ2FsbDo6TGlzdCgpLnNpemUoKSAtIDE7CisgIH0KKyAgY29uc3Qgc2l6ZV90IGluZGV4XzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKERlc3RydWN0b3JUcmFja2VyKTsKK307CisKK3R5cGVkZWYgVGhyZWFkTG9jYWw8RGVzdHJ1Y3RvclRyYWNrZXI+KiBUaHJlYWRQYXJhbTsKKwordm9pZCBDYWxsVGhyZWFkTG9jYWxHZXQoVGhyZWFkUGFyYW0gdGhyZWFkX2xvY2FsX3BhcmFtKSB7CisgIHRocmVhZF9sb2NhbF9wYXJhbS0+Z2V0KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBhIFRocmVhZExvY2FsIG9iamVjdCBkaWVzIGluIGEgdGhyZWFkLCBpdCBkZXN0cm95cworLy8gdGhlIG1hbmFnZWQgb2JqZWN0IGZvciB0aGF0IHRocmVhZC4KK1RFU1QoVGhyZWFkTG9jYWxUZXN0LCBEZXN0cm95c01hbmFnZWRPYmplY3RGb3JPd25UaHJlYWRXaGVuRHlpbmcpIHsKKyAgRGVzdHJ1Y3RvckNhbGw6OlJlc2V0TGlzdCgpOworCisgIHsKKyAgICBUaHJlYWRMb2NhbDxEZXN0cnVjdG9yVHJhY2tlcj4gdGhyZWFkX2xvY2FsX3RyYWNrZXI7CisgICAgQVNTRVJUX0VRKDBVLCBEZXN0cnVjdG9yQ2FsbDo6TGlzdCgpLnNpemUoKSk7CisKKyAgICAvLyBUaGlzIGNyZWF0ZXMgYW5vdGhlciBEZXN0cnVjdG9yVHJhY2tlciBvYmplY3QgZm9yIHRoZSBtYWluIHRocmVhZC4KKyAgICB0aHJlYWRfbG9jYWxfdHJhY2tlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoMVUsIERlc3RydWN0b3JDYWxsOjpMaXN0KCkuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UoRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKVswXS0+Q2hlY2tEZXN0cm95ZWQoKSk7CisgIH0KKworICAvLyBOb3cgdGhyZWFkX2xvY2FsX3RyYWNrZXIgaGFzIGRpZWQuCisgIEFTU0VSVF9FUSgxVSwgRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKS5zaXplKCkpOworICBFWFBFQ1RfVFJVRShEZXN0cnVjdG9yQ2FsbDo6TGlzdCgpWzBdLT5DaGVja0Rlc3Ryb3llZCgpKTsKKworICBEZXN0cnVjdG9yQ2FsbDo6UmVzZXRMaXN0KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgd2hlbiBhIHRocmVhZCBleGl0cywgdGhlIHRocmVhZC1sb2NhbCBvYmplY3QgZm9yIHRoYXQKKy8vIHRocmVhZCBpcyBkZXN0cm95ZWQuCitURVNUKFRocmVhZExvY2FsVGVzdCwgRGVzdHJveXNNYW5hZ2VkT2JqZWN0QXRUaHJlYWRFeGl0KSB7CisgIERlc3RydWN0b3JDYWxsOjpSZXNldExpc3QoKTsKKworICB7CisgICAgVGhyZWFkTG9jYWw8RGVzdHJ1Y3RvclRyYWNrZXI+IHRocmVhZF9sb2NhbF90cmFja2VyOworICAgIEFTU0VSVF9FUSgwVSwgRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKS5zaXplKCkpOworCisgICAgLy8gVGhpcyBjcmVhdGVzIGFub3RoZXIgRGVzdHJ1Y3RvclRyYWNrZXIgb2JqZWN0IGluIHRoZSBuZXcgdGhyZWFkLgorICAgIFRocmVhZFdpdGhQYXJhbTxUaHJlYWRQYXJhbT4gdGhyZWFkKAorICAgICAgICAmQ2FsbFRocmVhZExvY2FsR2V0LCAmdGhyZWFkX2xvY2FsX3RyYWNrZXIsIE5VTEwpOworICAgIHRocmVhZC5Kb2luKCk7CisKKyAgICAvLyBUaGUgdGhyZWFkIGhhcyBleGl0ZWQsIGFuZCB3ZSBzaG91bGQgaGF2ZSBhIERlc3Ryb3llZFRyYWNrZXIKKyAgICAvLyBpbnN0YW5jZSBjcmVhdGVkIGZvciBpdC4gQnV0IGl0IG1heSBub3QgaGF2ZSBiZWVuIGRlc3Ryb3llZCB5ZXQuCisgICAgQVNTRVJUX0VRKDFVLCBEZXN0cnVjdG9yQ2FsbDo6TGlzdCgpLnNpemUoKSk7CisgIH0KKworICAvLyBUaGUgdGhyZWFkIGhhcyBleGl0ZWQgYW5kIHRocmVhZF9sb2NhbF90cmFja2VyIGhhcyBkaWVkLgorICBBU1NFUlRfRVEoMVUsIERlc3RydWN0b3JDYWxsOjpMaXN0KCkuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoRGVzdHJ1Y3RvckNhbGw6Okxpc3QoKVswXS0+Q2hlY2tEZXN0cm95ZWQoKSk7CisKKyAgRGVzdHJ1Y3RvckNhbGw6OlJlc2V0TGlzdCgpOworfQorCitURVNUKFRocmVhZExvY2FsVGVzdCwgVGhyZWFkTG9jYWxNdXRhdGlvbnNBZmZlY3RPbmx5Q3VycmVudFRocmVhZCkgeworICBUaHJlYWRMb2NhbDxzdGQ6OnN0cmluZz4gdGhyZWFkX2xvY2FsX3N0cmluZzsKKyAgdGhyZWFkX2xvY2FsX3N0cmluZy5zZXQoIkZvbyIpOworICBFWFBFQ1RfU1RSRVEoIkZvbyIsIHRocmVhZF9sb2NhbF9zdHJpbmcuZ2V0KCkuY19zdHIoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBSdW5Gcm9tVGhyZWFkKCZSZXRyaWV2ZVRocmVhZExvY2FsVmFsdWUsCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCZ0aHJlYWRfbG9jYWxfc3RyaW5nLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKHJlc3VsdC5lbXB0eSgpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCitURVNUKFdpbmRvd3NUeXBlc1Rlc3QsIEhBTkRMRUlzVm9pZFN0YXIpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPEhBTkRMRSwgdm9pZCo+KCk7Cit9CisKK1RFU1QoV2luZG93c1R5cGVzVGVzdCwgQ1JJVElDQUxfU0VDVElPTklzX1JUTF9DUklUSUNBTF9TRUNUSU9OKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxDUklUSUNBTF9TRUNUSU9OLCBfUlRMX0NSSVRJQ0FMX1NFQ1RJT04+KCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtcHJpbnRlcnNfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5N2NjMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXByaW50ZXJzX3Rlc3QuY2MKQEAgLTAsMCArMSwxNjM1IEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBHb29nbGUgVGVzdCAtIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlci4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBoYXNoX21hcCBhbmQgaGFzaF9zZXQgYXJlIGF2YWlsYWJsZSB1bmRlciBWaXN1YWwgQysrLCBvciBvbiBMaW51eC4KKyNpZiBHVEVTVF9IQVNfSEFTSF9NQVBfCisjIGluY2x1ZGUgPGhhc2hfbWFwPiAgICAgICAgICAgIC8vIE5PTElOVAorI2VuZGlmICAvLyBHVEVTVF9IQVNfSEFTSF9NQVBfCisjaWYgR1RFU1RfSEFTX0hBU0hfU0VUXworIyBpbmNsdWRlIDxoYXNoX3NldD4gICAgICAgICAgICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0hBU0hfU0VUXworCisjaWYgR1RFU1RfSEFTX1NURF9GT1JXQVJEX0xJU1RfCisjIGluY2x1ZGUgPGZvcndhcmRfbGlzdD4gLy8gTk9MSU5UCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRk9SV0FSRF9MSVNUXworCisvLyBTb21lIHVzZXItZGVmaW5lZCB0eXBlcyBmb3IgdGVzdGluZyB0aGUgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIuCisKKy8vIEFuIGFub255bW91cyBlbnVtIHR5cGUuCitlbnVtIEFub255bW91c0VudW0geworICBrQUUxID0gLTEsCisgIGtBRTIgPSAxCit9OworCisvLyBBbiBlbnVtIHdpdGhvdXQgYSB1c2VyLWRlZmluZWQgcHJpbnRlci4KK2VudW0gRW51bVdpdGhvdXRQcmludGVyIHsKKyAga0VXUDEgPSAtMiwKKyAga0VXUDIgPSA0MgorfTsKKworLy8gQW4gZW51bSB3aXRoIGEgPDwgb3BlcmF0b3IuCitlbnVtIEVudW1XaXRoU3RyZWFtaW5nIHsKKyAga0VXUzEgPSAxMAorfTsKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIEVudW1XaXRoU3RyZWFtaW5nIGUpIHsKKyAgcmV0dXJuIG9zIDw8IChlID09IGtFV1MxID8gImtFV1MxIiA6ICJpbnZhbGlkIik7Cit9CisKKy8vIEFuIGVudW0gd2l0aCBhIFByaW50VG8oKSBmdW5jdGlvbi4KK2VudW0gRW51bVdpdGhQcmludFRvIHsKKyAga0VXUFQxID0gMQorfTsKKwordm9pZCBQcmludFRvKEVudW1XaXRoUHJpbnRUbyBlLCBzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCAoZSA9PSBrRVdQVDEgPyAia0VXUFQxIiA6ICJpbnZhbGlkIik7Cit9CisKKy8vIEEgY2xhc3MgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50LgorY2xhc3MgQmlnZ2VzdEludENvbnZlcnRpYmxlIHsKKyBwdWJsaWM6CisgIG9wZXJhdG9yIDo6dGVzdGluZzo6aW50ZXJuYWw6OkJpZ2dlc3RJbnQoKSBjb25zdCB7IHJldHVybiA0MjsgfQorfTsKKworLy8gQSB1c2VyLWRlZmluZWQgdW5wcmludGFibGUgY2xhc3MgdGVtcGxhdGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVucHJpbnRhYmxlVGVtcGxhdGVJbkdsb2JhbCB7CisgcHVibGljOgorICBVbnByaW50YWJsZVRlbXBsYXRlSW5HbG9iYWwoKSA6IHZhbHVlXygpIHt9CisgcHJpdmF0ZToKKyAgVCB2YWx1ZV87Cit9OworCisvLyBBIHVzZXItZGVmaW5lZCBzdHJlYW1hYmxlIHR5cGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitjbGFzcyBTdHJlYW1hYmxlSW5HbG9iYWwgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+U3RyZWFtYWJsZUluR2xvYmFsKCkge30KK307CisKK2lubGluZSB2b2lkIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdHJlYW1hYmxlSW5HbG9iYWwmIC8qIHggKi8pIHsKKyAgb3MgPDwgIlN0cmVhbWFibGVJbkdsb2JhbCI7Cit9CisKK3ZvaWQgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0cmVhbWFibGVJbkdsb2JhbCogLyogeCAqLykgeworICBvcyA8PCAiU3RyZWFtYWJsZUluR2xvYmFsKiI7Cit9CisKK25hbWVzcGFjZSBmb28geworCisvLyBBIHVzZXItZGVmaW5lZCB1bnByaW50YWJsZSB0eXBlIGluIGEgdXNlciBuYW1lc3BhY2UuCitjbGFzcyBVbnByaW50YWJsZUluRm9vIHsKKyBwdWJsaWM6CisgIFVucHJpbnRhYmxlSW5Gb28oKSA6IHpfKDApIHsgbWVtY3B5KHh5XywgIlx4RUZceDEyXHgwXHgwXHgzNFx4QUJceDBceDAiLCA4KTsgfQorICBkb3VibGUgeigpIGNvbnN0IHsgcmV0dXJuIHpfOyB9CisgcHJpdmF0ZToKKyAgY2hhciB4eV9bOF07CisgIGRvdWJsZSB6XzsKK307CisKKy8vIEEgdXNlci1kZWZpbmVkIHByaW50YWJsZSB0eXBlIGluIGEgdXNlci1jaG9zZW4gbmFtZXNwYWNlLgorc3RydWN0IFByaW50YWJsZVZpYVByaW50VG8geworICBQcmludGFibGVWaWFQcmludFRvKCkgOiB2YWx1ZSgpIHt9CisgIGludCB2YWx1ZTsKK307CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBQcmludGFibGVWaWFQcmludFRvJiB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICJQcmludGFibGVWaWFQcmludFRvOiAiIDw8IHgudmFsdWU7Cit9CisKKy8vIEEgdHlwZSB3aXRoIGEgdXNlci1kZWZpbmVkIDw8IGZvciBwcmludGluZyBpdHMgcG9pbnRlci4KK3N0cnVjdCBQb2ludGVyUHJpbnRhYmxlIHsKK307CisKKzo6c3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJQcmludGFibGUqIC8qIHggKi8pIHsKKyAgcmV0dXJuIG9zIDw8ICJQb2ludGVyUHJpbnRhYmxlKiI7Cit9CisKKy8vIEEgdXNlci1kZWZpbmVkIHByaW50YWJsZSBjbGFzcyB0ZW1wbGF0ZSBpbiBhIHVzZXItY2hvc2VuIG5hbWVzcGFjZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZShjb25zdCBUJiBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorCisgIGNvbnN0IFQmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgcHJpdmF0ZToKKyAgVCB2YWx1ZV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUbyhjb25zdCBQcmludGFibGVWaWFQcmludFRvVGVtcGxhdGU8VD4mIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgIlByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZTogIiA8PCB4LnZhbHVlKCk7Cit9CisKKy8vIEEgdXNlci1kZWZpbmVkIHN0cmVhbWFibGUgY2xhc3MgdGVtcGxhdGUgaW4gYSB1c2VyIG5hbWVzcGFjZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU3RyZWFtYWJsZVRlbXBsYXRlSW5Gb28geworIHB1YmxpYzoKKyAgU3RyZWFtYWJsZVRlbXBsYXRlSW5Gb28oKSA6IHZhbHVlXygpIHt9CisKKyAgY29uc3QgVCYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyBwcml2YXRlOgorICBUIHZhbHVlXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIDo6c3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1hYmxlVGVtcGxhdGVJbkZvbzxUPiYgeCkgeworICByZXR1cm4gb3MgPDwgIlN0cmVhbWFibGVUZW1wbGF0ZUluRm9vOiAiIDw8IHgudmFsdWUoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZvbworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgZ3Rlc3RfcHJpbnRlcnNfdGVzdCB7CisKK3VzaW5nIDo6c3RkOjpkZXF1ZTsKK3VzaW5nIDo6c3RkOjpsaXN0OwordXNpbmcgOjpzdGQ6Om1ha2VfcGFpcjsKK3VzaW5nIDo6c3RkOjptYXA7Cit1c2luZyA6OnN0ZDo6bXVsdGltYXA7Cit1c2luZyA6OnN0ZDo6bXVsdGlzZXQ7Cit1c2luZyA6OnN0ZDo6cGFpcjsKK3VzaW5nIDo6c3RkOjpzZXQ7Cit1c2luZyA6OnN0ZDo6dmVjdG9yOwordXNpbmcgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok5hdGl2ZUFycmF5OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkU7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlOwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nczsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50OwordXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnQ7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3M7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc7CisKKy8vIFRoZSBoYXNoXyogY2xhc3NlcyBhcmUgbm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZC4gIFNUTHBvcnQKKy8vIGRlZmluZXMgdGhlbSBpbiBuYW1lc3BhY2Ugc3RkLiAgTVNWQyBkZWZpbmVzIHRoZW0gaW4gOjpzdGRleHQuICBHQ0MKKy8vIGRlZmluZXMgdGhlbSBpbiA6Oi4KKyNpZmRlZiBfU1RMUF9IQVNIX01BUCAgLy8gV2UgZ290IDxoYXNoX21hcD4gZnJvbSBTVExwb3J0LgordXNpbmcgOjpzdGQ6Omhhc2hfbWFwOwordXNpbmcgOjpzdGQ6Omhhc2hfc2V0OwordXNpbmcgOjpzdGQ6Omhhc2hfbXVsdGltYXA7Cit1c2luZyA6OnN0ZDo6aGFzaF9tdWx0aXNldDsKKyNlbGlmIF9NU0NfVkVSCit1c2luZyA6OnN0ZGV4dDo6aGFzaF9tYXA7Cit1c2luZyA6OnN0ZGV4dDo6aGFzaF9zZXQ7Cit1c2luZyA6OnN0ZGV4dDo6aGFzaF9tdWx0aW1hcDsKK3VzaW5nIDo6c3RkZXh0OjpoYXNoX211bHRpc2V0OworI2VuZGlmCisKKy8vIFByaW50cyBhIHZhbHVlIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlci4gIFRoaXMKKy8vIGlzIGEgaGVscGVyIGZvciB0ZXN0aW5nIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZm9yIHZhcmlvdXMgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cmluZyBQcmludChjb25zdCBUJiB2YWx1ZSkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgJnNzKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLyBQcmludHMgYSB2YWx1ZSBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGEgc3RyaW5nLCB1c2luZyB0aGUgdW5pdmVyc2FsCisvLyB2YWx1ZSBwcmludGVyLiAgVGhpcyBpcyBhIGhlbHBlciBmb3IgdGVzdGluZworLy8gVW5pdmVyc2FsUHJpbnRlcjxUJj46OlByaW50KCkgZm9yIHZhcmlvdXMgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cmluZyBQcmludEJ5UmVmKGNvbnN0IFQmIHZhbHVlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIFVuaXZlcnNhbFByaW50ZXI8VCY+OjpQcmludCh2YWx1ZSwgJnNzKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLyBUZXN0cyBwcmludGluZyB2YXJpb3VzIGVudW0gdHlwZXMuCisKK1RFU1QoUHJpbnRFbnVtVGVzdCwgQW5vbnltb3VzRW51bSkgeworICBFWFBFQ1RfRVEoIi0xIiwgUHJpbnQoa0FFMSkpOworICBFWFBFQ1RfRVEoIjEiLCBQcmludChrQUUyKSk7Cit9CisKK1RFU1QoUHJpbnRFbnVtVGVzdCwgRW51bVdpdGhvdXRQcmludGVyKSB7CisgIEVYUEVDVF9FUSgiLTIiLCBQcmludChrRVdQMSkpOworICBFWFBFQ1RfRVEoIjQyIiwgUHJpbnQoa0VXUDIpKTsKK30KKworVEVTVChQcmludEVudW1UZXN0LCBFbnVtV2l0aFN0cmVhbWluZykgeworICBFWFBFQ1RfRVEoImtFV1MxIiwgUHJpbnQoa0VXUzEpKTsKKyAgRVhQRUNUX0VRKCJpbnZhbGlkIiwgUHJpbnQoc3RhdGljX2Nhc3Q8RW51bVdpdGhTdHJlYW1pbmc+KDApKSk7Cit9CisKK1RFU1QoUHJpbnRFbnVtVGVzdCwgRW51bVdpdGhQcmludFRvKSB7CisgIEVYUEVDVF9FUSgia0VXUFQxIiwgUHJpbnQoa0VXUFQxKSk7CisgIEVYUEVDVF9FUSgiaW52YWxpZCIsIFByaW50KHN0YXRpY19jYXN0PEVudW1XaXRoUHJpbnRUbz4oMCkpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgYSBjbGFzcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQuCisKK1RFU1QoUHJpbnRDbGFzc1Rlc3QsIEJpZ2dlc3RJbnRDb252ZXJ0aWJsZSkgeworICBFWFBFQ1RfRVEoIjQyIiwgUHJpbnQoQmlnZ2VzdEludENvbnZlcnRpYmxlKCkpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgdmFyaW91cyBjaGFyIHR5cGVzLgorCisvLyBjaGFyLgorVEVTVChQcmludENoYXJUZXN0LCBQbGFpbkNoYXIpIHsKKyAgRVhQRUNUX0VRKCInXFwwJyIsIFByaW50KCdcMCcpKTsKKyAgRVhQRUNUX0VRKCInXFwnJyAoMzksIDB4MjcpIiwgUHJpbnQoJ1wnJykpOworICBFWFBFQ1RfRVEoIidcIicgKDM0LCAweDIyKSIsIFByaW50KCciJykpOworICBFWFBFQ1RfRVEoIic/JyAoNjMsIDB4M0YpIiwgUHJpbnQoJz8nKSk7CisgIEVYUEVDVF9FUSgiJ1xcXFwnICg5MiwgMHg1QykiLCBQcmludCgnXFwnKSk7CisgIEVYUEVDVF9FUSgiJ1xcYScgKDcpIiwgUHJpbnQoJ1xhJykpOworICBFWFBFQ1RfRVEoIidcXGInICg4KSIsIFByaW50KCdcYicpKTsKKyAgRVhQRUNUX0VRKCInXFxmJyAoMTIsIDB4QykiLCBQcmludCgnXGYnKSk7CisgIEVYUEVDVF9FUSgiJ1xcbicgKDEwLCAweEEpIiwgUHJpbnQoJ1xuJykpOworICBFWFBFQ1RfRVEoIidcXHInICgxMywgMHhEKSIsIFByaW50KCdccicpKTsKKyAgRVhQRUNUX0VRKCInXFx0JyAoOSkiLCBQcmludCgnXHQnKSk7CisgIEVYUEVDVF9FUSgiJ1xcdicgKDExLCAweEIpIiwgUHJpbnQoJ1x2JykpOworICBFWFBFQ1RfRVEoIidcXHg3RicgKDEyNykiLCBQcmludCgnXHg3RicpKTsKKyAgRVhQRUNUX0VRKCInXFx4RkYnICgyNTUpIiwgUHJpbnQoJ1x4RkYnKSk7CisgIEVYUEVDVF9FUSgiJyAnICgzMiwgMHgyMCkiLCBQcmludCgnICcpKTsKKyAgRVhQRUNUX0VRKCInYScgKDk3LCAweDYxKSIsIFByaW50KCdhJykpOworfQorCisvLyBzaWduZWQgY2hhci4KK1RFU1QoUHJpbnRDaGFyVGVzdCwgU2lnbmVkQ2hhcikgeworICBFWFBFQ1RfRVEoIidcXDAnIiwgUHJpbnQoc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KCdcMCcpKSk7CisgIEVYUEVDVF9FUSgiJ1xceENFJyAoLTUwKSIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oLTUwKSkpOworfQorCisvLyB1bnNpZ25lZCBjaGFyLgorVEVTVChQcmludENoYXJUZXN0LCBVbnNpZ25lZENoYXIpIHsKKyAgRVhQRUNUX0VRKCInXFwwJyIsIFByaW50KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCdcMCcpKSk7CisgIEVYUEVDVF9FUSgiJ2InICg5OCwgMHg2MikiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oJ2InKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBvdGhlciBzaW1wbGUsIGJ1aWx0LWluIHR5cGVzLgorCisvLyBib29sLgorVEVTVChQcmludEJ1aWx0SW5UeXBlVGVzdCwgQm9vbCkgeworICBFWFBFQ1RfRVEoImZhbHNlIiwgUHJpbnQoZmFsc2UpKTsKKyAgRVhQRUNUX0VRKCJ0cnVlIiwgUHJpbnQodHJ1ZSkpOworfQorCisvLyB3Y2hhcl90LgorVEVTVChQcmludEJ1aWx0SW5UeXBlVGVzdCwgV2NoYXJfdCkgeworICBFWFBFQ1RfRVEoIkwnXFwwJyIsIFByaW50KEwnXDAnKSk7CisgIEVYUEVDVF9FUSgiTCdcXCcnICgzOSwgMHgyNykiLCBQcmludChMJ1wnJykpOworICBFWFBFQ1RfRVEoIkwnXCInICgzNCwgMHgyMikiLCBQcmludChMJyInKSk7CisgIEVYUEVDVF9FUSgiTCc/JyAoNjMsIDB4M0YpIiwgUHJpbnQoTCc/JykpOworICBFWFBFQ1RfRVEoIkwnXFxcXCcgKDkyLCAweDVDKSIsIFByaW50KEwnXFwnKSk7CisgIEVYUEVDVF9FUSgiTCdcXGEnICg3KSIsIFByaW50KEwnXGEnKSk7CisgIEVYUEVDVF9FUSgiTCdcXGInICg4KSIsIFByaW50KEwnXGInKSk7CisgIEVYUEVDVF9FUSgiTCdcXGYnICgxMiwgMHhDKSIsIFByaW50KEwnXGYnKSk7CisgIEVYUEVDVF9FUSgiTCdcXG4nICgxMCwgMHhBKSIsIFByaW50KEwnXG4nKSk7CisgIEVYUEVDVF9FUSgiTCdcXHInICgxMywgMHhEKSIsIFByaW50KEwnXHInKSk7CisgIEVYUEVDVF9FUSgiTCdcXHQnICg5KSIsIFByaW50KEwnXHQnKSk7CisgIEVYUEVDVF9FUSgiTCdcXHYnICgxMSwgMHhCKSIsIFByaW50KEwnXHYnKSk7CisgIEVYUEVDVF9FUSgiTCdcXHg3RicgKDEyNykiLCBQcmludChMJ1x4N0YnKSk7CisgIEVYUEVDVF9FUSgiTCdcXHhGRicgKDI1NSkiLCBQcmludChMJ1x4RkYnKSk7CisgIEVYUEVDVF9FUSgiTCcgJyAoMzIsIDB4MjApIiwgUHJpbnQoTCcgJykpOworICBFWFBFQ1RfRVEoIkwnYScgKDk3LCAweDYxKSIsIFByaW50KEwnYScpKTsKKyAgRVhQRUNUX0VRKCJMJ1xceDU3NicgKDEzOTgpIiwgUHJpbnQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg1NzYpKSk7CisgIEVYUEVDVF9FUSgiTCdcXHhDNzREJyAoNTEwMjEpIiwgUHJpbnQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHhDNzREKSkpOworfQorCisvLyBUZXN0IHRoYXQgSW50NjQgcHJvdmlkZXMgbW9yZSBzdG9yYWdlIHRoYW4gd2NoYXJfdC4KK1RFU1QoUHJpbnRUeXBlU2l6ZVRlc3QsIFdjaGFyX3QpIHsKKyAgRVhQRUNUX0xUKHNpemVvZih3Y2hhcl90KSwgc2l6ZW9mKHRlc3Rpbmc6OmludGVybmFsOjpJbnQ2NCkpOworfQorCisvLyBWYXJpb3VzIGludGVnZXIgdHlwZXMuCitURVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBJbnRlZ2VyKSB7CisgIEVYUEVDVF9FUSgiJ1xceEZGJyAoMjU1KSIsIFByaW50KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDI1NSkpKTsgIC8vIHVpbnQ4CisgIEVYUEVDVF9FUSgiJ1xceDgwJyAoLTEyOCkiLCBQcmludChzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oLTEyOCkpKTsgIC8vIGludDgKKyAgRVhQRUNUX0VRKCI2NTUzNSIsIFByaW50KFVTSFJUX01BWCkpOyAgLy8gdWludDE2CisgIEVYUEVDVF9FUSgiLTMyNzY4IiwgUHJpbnQoU0hSVF9NSU4pKTsgIC8vIGludDE2CisgIEVYUEVDVF9FUSgiNDI5NDk2NzI5NSIsIFByaW50KFVJTlRfTUFYKSk7ICAvLyB1aW50MzIKKyAgRVhQRUNUX0VRKCItMjE0NzQ4MzY0OCIsIFByaW50KElOVF9NSU4pKTsgIC8vIGludDMyCisgIEVYUEVDVF9FUSgiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8dGVzdGluZzo6aW50ZXJuYWw6OlVJbnQ2ND4oLTEpKSk7ICAvLyB1aW50NjQKKyAgRVhQRUNUX0VRKCItOTIyMzM3MjAzNjg1NDc3NTgwOCIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDx0ZXN0aW5nOjppbnRlcm5hbDo6SW50NjQ+KDEpIDw8IDYzKSk7ICAvLyBpbnQ2NAorfQorCisvLyBTaXplIHR5cGVzLgorVEVTVChQcmludEJ1aWx0SW5UeXBlVGVzdCwgU2l6ZV90KSB7CisgIEVYUEVDVF9FUSgiMSIsIFByaW50KHNpemVvZignYScpKSk7ICAvLyBzaXplX3QuCisjaWYgIUdURVNUX09TX1dJTkRPV1MKKyAgLy8gV2luZG93cyBoYXMgbm8gc3NpemVfdCB0eXBlLgorICBFWFBFQ1RfRVEoIi0yIiwgUHJpbnQoc3RhdGljX2Nhc3Q8c3NpemVfdD4oLTIpKSk7ICAvLyBzc2l6ZV90LgorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworfQorCisvLyBGbG9hdGluZy1wb2ludHMuCitURVNUKFByaW50QnVpbHRJblR5cGVUZXN0LCBGbG9hdGluZ1BvaW50cykgeworICBFWFBFQ1RfRVEoIjEuNSIsIFByaW50KDEuNWYpKTsgICAvLyBmbG9hdAorICBFWFBFQ1RfRVEoIi0yLjUiLCBQcmludCgtMi41KSk7ICAvLyBkb3VibGUKK30KKworLy8gU2luY2UgOjpzdGQ6OnN0cmluZ3N0cmVhbTo6b3BlcmF0b3I8PChjb25zdCB2b2lkICopIGZvcm1hdHMgdGhlIHBvaW50ZXIKKy8vIG91dHB1dCBkaWZmZXJlbnRseSB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMsIHdlIGhhdmUgdG8gY3JlYXRlIHRoZSBleHBlY3RlZAorLy8gb3V0cHV0IGZpcnN0IGFuZCB1c2UgaXQgYXMgb3VyIGV4cGVjdGF0aW9uLgorc3RhdGljIHN0cmluZyBQcmludFBvaW50ZXIoY29uc3Qgdm9pZCAqcCkgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGV4cGVjdGVkX3Jlc3VsdF9zdHJlYW07CisgIGV4cGVjdGVkX3Jlc3VsdF9zdHJlYW0gPDwgcDsKKyAgcmV0dXJuIGV4cGVjdGVkX3Jlc3VsdF9zdHJlYW0uc3RyKCk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIEMgc3RyaW5ncy4KKworLy8gY29uc3QgY2hhciouCitURVNUKFByaW50Q1N0cmluZ1Rlc3QsIENvbnN0KSB7CisgIGNvbnN0IGNoYXIqIHAgPSAiV29ybGQiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApICsgIiBwb2ludGluZyB0byBcIldvcmxkXCIiLCBQcmludChwKSk7Cit9CisKKy8vIGNoYXIqLgorVEVTVChQcmludENTdHJpbmdUZXN0LCBOb25Db25zdCkgeworICBjaGFyIHBbXSA9ICJIaSI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIFwiSGlcIiIsCisgICAgICAgICAgICBQcmludChzdGF0aWNfY2FzdDxjaGFyKj4ocCkpKTsKK30KKworLy8gTlVMTCBDIHN0cmluZy4KK1RFU1QoUHJpbnRDU3RyaW5nVGVzdCwgTnVsbCkgeworICBjb25zdCBjaGFyKiBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBUZXN0cyB0aGF0IEMgc3RyaW5ncyBhcmUgZXNjYXBlZCBwcm9wZXJseS4KK1RFU1QoUHJpbnRDU3RyaW5nVGVzdCwgRXNjYXBlc1Byb3Blcmx5KSB7CisgIGNvbnN0IGNoYXIqIHAgPSAiJ1wiP1xcXGFcYlxmXG5cclx0XHZceDdGXHhGRiBhIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSArICIgcG9pbnRpbmcgdG8gXCInXFxcIj9cXFxcXFxhXFxiXFxmIgorICAgICAgICAgICAgIlxcblxcclxcdFxcdlxceDdGXFx4RkYgYVwiIiwKKyAgICAgICAgICAgIFByaW50KHApKTsKK30KKworLy8gTVNWQyBjb21waWxlciBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2hhcl90IGFzIGEgdHlwZWRlZgorLy8gb2YgdW5zaWduZWQgc2hvcnQuIERlZmluaW5nIGFuIG92ZXJsb2FkIGZvciBjb25zdCB3Y2hhcl90KiBpbiB0aGF0IGNhc2UKKy8vIHdvdWxkIGNhdXNlIHBvaW50ZXJzIHRvIHVuc2lnbmVkIHNob3J0cyBiZSBwcmludGVkIGFzIHdpZGUgc3RyaW5ncywKKy8vIHBvc3NpYmx5IGFjY2Vzc2luZyBtb3JlIG1lbW9yeSB0aGFuIGludGVuZGVkIGFuZCBjYXVzaW5nIGludmFsaWQKKy8vIG1lbW9yeSBhY2Nlc3Nlcy4gTVNWQyBkZWZpbmVzIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEIHN5bWJvbCB3aGVuCisvLyB3Y2hhcl90IGlzIGltcGxlbWVudGVkIGFzIGEgbmF0aXZlIHR5cGUuCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX05BVElWRV9XQ0hBUl9UX0RFRklORUQpCisKKy8vIGNvbnN0IHdjaGFyX3QqLgorVEVTVChQcmludFdpZGVDU3RyaW5nVGVzdCwgQ29uc3QpIHsKKyAgY29uc3Qgd2NoYXJfdCogcCA9IEwiV29ybGQiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApICsgIiBwb2ludGluZyB0byBMXCJXb3JsZFwiIiwgUHJpbnQocCkpOworfQorCisvLyB3Y2hhcl90Ki4KK1RFU1QoUHJpbnRXaWRlQ1N0cmluZ1Rlc3QsIE5vbkNvbnN0KSB7CisgIHdjaGFyX3QgcFtdID0gTCJIaSI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCkgKyAiIHBvaW50aW5nIHRvIExcIkhpXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RhdGljX2Nhc3Q8d2NoYXJfdCo+KHApKSk7Cit9CisKKy8vIE5VTEwgd2lkZSBDIHN0cmluZy4KK1RFU1QoUHJpbnRXaWRlQ1N0cmluZ1Rlc3QsIE51bGwpIHsKKyAgY29uc3Qgd2NoYXJfdCogcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gVGVzdHMgdGhhdCB3aWRlIEMgc3RyaW5ncyBhcmUgZXNjYXBlZCBwcm9wZXJseS4KK1RFU1QoUHJpbnRXaWRlQ1N0cmluZ1Rlc3QsIEVzY2FwZXNQcm9wZXJseSkgeworICBjb25zdCB3Y2hhcl90IHNbXSA9IHsnXCcnLCAnIicsICc/JywgJ1xcJywgJ1xhJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ1x0JywgJ1x2JywgMHhEMywgMHg1NzYsIDB4OEQzLCAweEM3NEQsICcgJywgJ2EnLCAnXDAnfTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzKSArICIgcG9pbnRpbmcgdG8gTFwiJ1xcXCI/XFxcXFxcYVxcYlxcZiIKKyAgICAgICAgICAgICJcXG5cXHJcXHRcXHZcXHhEM1xceDU3NlxceDhEM1xceEM3NEQgYVwiIiwKKyAgICAgICAgICAgIFByaW50KHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QqPihzKSkpOworfQorI2VuZGlmICAvLyBuYXRpdmUgd2NoYXJfdAorCisvLyBUZXN0cyBwcmludGluZyBwb2ludGVycyB0byBvdGhlciBjaGFyIHR5cGVzLgorCisvLyBzaWduZWQgY2hhciouCitURVNUKFByaW50Q2hhclBvaW50ZXJUZXN0LCBTaWduZWRDaGFyKSB7CisgIHNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDxzaWduZWQgY2hhcio+KDB4MTIzNCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gY29uc3Qgc2lnbmVkIGNoYXIqLgorVEVTVChQcmludENoYXJQb2ludGVyVGVzdCwgQ29uc3RTaWduZWRDaGFyKSB7CisgIHNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDxzaWduZWQgY2hhcio+KDB4MTIzNCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gdW5zaWduZWQgY2hhciouCitURVNUKFByaW50Q2hhclBvaW50ZXJUZXN0LCBVbnNpZ25lZENoYXIpIHsKKyAgdW5zaWduZWQgY2hhciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KDB4MTIzNCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gY29uc3QgdW5zaWduZWQgY2hhciouCitURVNUKFByaW50Q2hhclBvaW50ZXJUZXN0LCBDb25zdFVuc2lnbmVkQ2hhcikgeworICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oMHgxMjM0KTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBUZXN0cyBwcmludGluZyBwb2ludGVycyB0byBzaW1wbGUsIGJ1aWx0LWluIHR5cGVzLgorCisvLyBib29sKi4KK1RFU1QoUHJpbnRQb2ludGVyVG9CdWlsdEluVHlwZVRlc3QsIEJvb2wpIHsKKyAgYm9vbCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Ym9vbCo+KDB4QUJDRCk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocCksIFByaW50KHApKTsKKyAgcCA9IE5VTEw7CisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gdm9pZCouCitURVNUKFByaW50UG9pbnRlclRvQnVpbHRJblR5cGVUZXN0LCBWb2lkKSB7CisgIHZvaWQqIHAgPSByZWludGVycHJldF9jYXN0PHZvaWQqPigweEFCQ0QpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIGNvbnN0IHZvaWQqLgorVEVTVChQcmludFBvaW50ZXJUb0J1aWx0SW5UeXBlVGVzdCwgQ29uc3RWb2lkKSB7CisgIGNvbnN0IHZvaWQqIHAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigweEFCQ0QpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHApLCBQcmludChwKSk7CisgIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoIk5VTEwiLCBQcmludChwKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIHBvaW50ZXJzIHRvIHBvaW50ZXJzLgorVEVTVChQcmludFBvaW50ZXJUb1BvaW50ZXJUZXN0LCBJbnRQb2ludGVyUG9pbnRlcikgeworICBpbnQqKiBwID0gcmVpbnRlcnByZXRfY2FzdDxpbnQqKj4oMHhBQkNEKTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihwKSwgUHJpbnQocCkpOworICBwID0gTlVMTDsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgUHJpbnQocCkpOworfQorCisvLyBUZXN0cyBwcmludGluZyAobm9uLW1lbWJlcikgZnVuY3Rpb24gcG9pbnRlcnMuCisKK3ZvaWQgTXlGdW5jdGlvbihpbnQgLyogbiAqLykge30KKworVEVTVChQcmludFBvaW50ZXJUZXN0LCBOb25NZW1iZXJGdW5jdGlvblBvaW50ZXIpIHsKKyAgLy8gV2UgY2Fubm90IGRpcmVjdGx5IGNhc3QgJk15RnVuY3Rpb24gdG8gY29uc3Qgdm9pZCogYmVjYXVzZSB0aGUKKyAgLy8gc3RhbmRhcmQgZGlzYWxsb3dzIGNhc3RpbmcgYmV0d2VlbiBwb2ludGVycyB0byBmdW5jdGlvbnMgYW5kCisgIC8vIHBvaW50ZXJzIHRvIG9iamVjdHMsIGFuZCBzb21lIGNvbXBpbGVycyAoZS5nLiBHQ0MgMy40KSBlbmZvcmNlCisgIC8vIHRoaXMgbGltaXRhdGlvbi4KKyAgRVhQRUNUX0VRKAorICAgICAgUHJpbnRQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OkJpZ2dlc3RJbnQ+KCZNeUZ1bmN0aW9uKSkpLAorICAgICAgUHJpbnQoJk15RnVuY3Rpb24pKTsKKyAgaW50ICgqcCkoYm9vbCkgPSBOVUxMOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9FUSgiTlVMTCIsIFByaW50KHApKTsKK30KKworLy8gQW4gYXNzZXJ0aW9uIHByZWRpY2F0ZSBkZXRlcm1pbmluZyB3aGV0aGVyIGEgb25lIHN0cmluZyBpcyBhIHByZWZpeCBmb3IKKy8vIGFub3RoZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KK0Fzc2VydGlvblJlc3VsdCBIYXNQcmVmaXgoY29uc3QgU3RyaW5nVHlwZSYgc3RyLCBjb25zdCBTdHJpbmdUeXBlJiBwcmVmaXgpIHsKKyAgaWYgKHN0ci5maW5kKHByZWZpeCwgMCkgPT0gMCkKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIGNvbnN0IGJvb2wgaXNfd2lkZV9zdHJpbmcgPSBzaXplb2YocHJlZml4WzBdKSA+IDE7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGJlZ2luX3N0cmluZ19xdW90ZSA9IGlzX3dpZGVfc3RyaW5nID8gIkxcIiIgOiAiXCIiOworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgcHJlZml4IDw8ICJcIiBpcyBub3QgYSBwcmVmaXggb2YgIgorICAgICAgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IHN0ciA8PCAiXCJcbiI7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIG1lbWJlciB2YXJpYWJsZSBwb2ludGVycy4gIEFsdGhvdWdoIHRoZXkgYXJlIGNhbGxlZAorLy8gcG9pbnRlcnMsIHRoZXkgZG9uJ3QgcG9pbnQgdG8gYSBsb2NhdGlvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4KKy8vIFRoZWlyIHJlcHJlc2VudGF0aW9uIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBUaHVzIHRoZXkgd2lsbCBiZQorLy8gcHJpbnRlZCBhcyByYXcgYnl0ZXMuCisKK3N0cnVjdCBGb28geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Rm9vKCkge30KKyAgaW50IE15TWV0aG9kKGNoYXIgeCkgeyByZXR1cm4geCArIDE7IH0KKyAgdmlydHVhbCBjaGFyIE15VmlydHVhbE1ldGhvZChpbnQgLyogbiAqLykgeyByZXR1cm4gJ2EnOyB9CisKKyAgaW50IHZhbHVlOworfTsKKworVEVTVChQcmludFBvaW50ZXJUZXN0LCBNZW1iZXJWYXJpYWJsZVBvaW50ZXIpIHsKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KFByaW50KCZGb286OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50KHNpemVvZigmRm9vOjp2YWx1ZSkpICsgIi1ieXRlIG9iamVjdCAiKSk7CisgIGludCAoRm9vOjoqcCkgPSBOVUxMOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeChQcmludChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50KHNpemVvZihwKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLiAgQWx0aG91Z2ggdGhleSBhcmUgY2FsbGVkCisvLyBwb2ludGVycywgdGhleSBkb24ndCBwb2ludCB0byBhIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlLgorLy8gVGhlaXIgcmVwcmVzZW50YXRpb24gaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIFRodXMgdGhleSB3aWxsIGJlCisvLyBwcmludGVkIGFzIHJhdyBieXRlcy4KK1RFU1QoUHJpbnRQb2ludGVyVGVzdCwgTWVtYmVyRnVuY3Rpb25Qb2ludGVyKSB7CisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeChQcmludCgmRm9vOjpNeU1ldGhvZCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcmludChzaXplb2YoJkZvbzo6TXlNZXRob2QpKSArICItYnl0ZSBvYmplY3QgIikpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEhhc1ByZWZpeChQcmludCgmRm9vOjpNeVZpcnR1YWxNZXRob2QpLAorICAgICAgICAgICAgICAgIFByaW50KHNpemVvZigoJkZvbzo6TXlWaXJ0dWFsTWV0aG9kKSkpICsgIi1ieXRlIG9iamVjdCAiKSk7CisgIGludCAoRm9vOjoqcCkoY2hhcikgPSBOVUxMOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeChQcmludChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByaW50KHNpemVvZihwKSkgKyAiLWJ5dGUgb2JqZWN0ICIpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgQyBhcnJheXMuCisKKy8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgUHJpbnQoKSBpcyB0aGF0IGl0IGVuc3VyZXMgdGhhdCB0aGUKKy8vIGFyZ3VtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorc3RyaW5nIFByaW50QXJyYXlIZWxwZXIoVCAoJmEpW05dKSB7CisgIHJldHVybiBQcmludChhKTsKK30KKworLy8gT25lLWRpbWVuc2lvbmFsIGFycmF5LgorVEVTVChQcmludEFycmF5VGVzdCwgT25lRGltZW5zaW9uYWxBcnJheSkgeworICBpbnQgYVs1XSA9IHsgMSwgMiwgMywgNCwgNSB9OworICBFWFBFQ1RfRVEoInsgMSwgMiwgMywgNCwgNSB9IiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIFR3by1kaW1lbnNpb25hbCBhcnJheS4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIFR3b0RpbWVuc2lvbmFsQXJyYXkpIHsKKyAgaW50IGFbMl1bNV0gPSB7CisgICAgeyAxLCAyLCAzLCA0LCA1IH0sCisgICAgeyA2LCA3LCA4LCA5LCAwIH0KKyAgfTsKKyAgRVhQRUNUX0VRKCJ7IHsgMSwgMiwgMywgNCwgNSB9LCB7IDYsIDcsIDgsIDksIDAgfSB9IiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIEFycmF5IG9mIGNvbnN0IGVsZW1lbnRzLgorVEVTVChQcmludEFycmF5VGVzdCwgQ29uc3RBcnJheSkgeworICBjb25zdCBib29sIGFbMV0gPSB7IGZhbHNlIH07CisgIEVYUEVDVF9FUSgieyBmYWxzZSB9IiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIGNoYXIgYXJyYXkgd2l0aG91dCB0ZXJtaW5hdGluZyBOVUwuCitURVNUKFByaW50QXJyYXlUZXN0LCBDaGFyQXJyYXlXaXRoTm9UZXJtaW5hdGluZ051bCkgeworICAvLyBBcnJheSBhIGNvbnRhaW5zICdcMCcgaW4gdGhlIG1pZGRsZSBhbmQgZG9lc24ndCBlbmQgd2l0aCAnXDAnLgorICBjaGFyIGFbXSA9IHsgJ0gnLCAnXDAnLCAnaScgfTsKKyAgRVhQRUNUX0VRKCJcIkhcXDBpXCIgKG5vIHRlcm1pbmF0aW5nIE5VTCkiLCBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gY29uc3QgY2hhciBhcnJheSB3aXRoIHRlcm1pbmF0aW5nIE5VTC4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIENvbnN0Q2hhckFycmF5V2l0aFRlcm1pbmF0aW5nTnVsKSB7CisgIGNvbnN0IGNoYXIgYVtdID0gIlwwSGkiOworICBFWFBFQ1RfRVEoIlwiXFwwSGlcIiIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBjb25zdCB3Y2hhcl90IGFycmF5IHdpdGhvdXQgdGVybWluYXRpbmcgTlVMLgorVEVTVChQcmludEFycmF5VGVzdCwgV0NoYXJBcnJheVdpdGhOb1Rlcm1pbmF0aW5nTnVsKSB7CisgIC8vIEFycmF5IGEgY29udGFpbnMgJ1wwJyBpbiB0aGUgbWlkZGxlIGFuZCBkb2Vzbid0IGVuZCB3aXRoICdcMCcuCisgIGNvbnN0IHdjaGFyX3QgYVtdID0geyBMJ0gnLCBMJ1wwJywgTCdpJyB9OworICBFWFBFQ1RfRVEoIkxcIkhcXDBpXCIgKG5vIHRlcm1pbmF0aW5nIE5VTCkiLCBQcmludEFycmF5SGVscGVyKGEpKTsKK30KKworLy8gd2NoYXJfdCBhcnJheSB3aXRoIHRlcm1pbmF0aW5nIE5VTC4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIFdDb25zdENoYXJBcnJheVdpdGhUZXJtaW5hdGluZ051bCkgeworICBjb25zdCB3Y2hhcl90IGFbXSA9IEwiXDBIaSI7CisgIEVYUEVDVF9FUSgiTFwiXFwwSGlcIiIsIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBBcnJheSBvZiBvYmplY3RzLgorVEVTVChQcmludEFycmF5VGVzdCwgT2JqZWN0QXJyYXkpIHsKKyAgc3RyaW5nIGFbM10gPSB7ICJIaSIsICJIZWxsbyIsICJOaSBoYW8iIH07CisgIEVYUEVDVF9FUSgieyBcIkhpXCIsIFwiSGVsbG9cIiwgXCJOaSBoYW9cIiB9IiwgUHJpbnRBcnJheUhlbHBlcihhKSk7Cit9CisKKy8vIEFycmF5IHdpdGggbWFueSBlbGVtZW50cy4KK1RFU1QoUHJpbnRBcnJheVRlc3QsIEJpZ0FycmF5KSB7CisgIGludCBhWzEwMF0gPSB7IDEsIDIsIDMgfTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDIsIDMsIDAsIDAsIDAsIDAsIDAsIC4uLiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9IiwKKyAgICAgICAgICAgIFByaW50QXJyYXlIZWxwZXIoYSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyA6OnN0cmluZyBhbmQgOjpzdGQ6OnN0cmluZy4KKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisvLyA6OnN0cmluZy4KK1RFU1QoUHJpbnRTdHJpbmdUZXN0LCBTdHJpbmdJbkdsb2JhbE5hbWVzcGFjZSkgeworICBjb25zdCBjaGFyIHNbXSA9ICInXCI/XFxcYVxiXGZcblwwXHJcdFx2XHg3Rlx4RkYgYSI7CisgIGNvbnN0IDo6c3RyaW5nIHN0cihzLCBzaXplb2YocykpOworICBFWFBFQ1RfRVEoIlwiJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcMFxcclxcdFxcdlxceDdGXFx4RkYgYVxcMFwiIiwKKyAgICAgICAgICAgIFByaW50KHN0cikpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisvLyA6OnN0ZDo6c3RyaW5nLgorVEVTVChQcmludFN0cmluZ1Rlc3QsIFN0cmluZ0luU3RkTmFtZXNwYWNlKSB7CisgIGNvbnN0IGNoYXIgc1tdID0gIidcIj9cXFxhXGJcZlxuXDBcclx0XHZceDdGXHhGRiBhIjsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIocywgc2l6ZW9mKHMpKTsKKyAgRVhQRUNUX0VRKCJcIidcXFwiP1xcXFxcXGFcXGJcXGZcXG5cXDBcXHJcXHRcXHZcXHg3RlxceEZGIGFcXDBcIiIsCisgICAgICAgICAgICBQcmludChzdHIpKTsKK30KKworVEVTVChQcmludFN0cmluZ1Rlc3QsIFN0cmluZ0FtYmlndW91c0hleCkgeworICAvLyAiXHg2QkFOQU5BIiBpcyBhbWJpZ3VvdXMsIGl0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBzdGFydGluZyB3aXRoIGVpdGhlciBvZjoKKyAgLy8gJ1x4NicsICdceDZCJywgb3IgJ1x4NkJBJy4KKworICAvLyBhIGhleCBlc2NhcGluZyBzZXF1ZW5jZSBmb2xsb3dpbmcgYnkgYSBkZWNpbWFsIGRpZ2l0CisgIEVYUEVDVF9FUSgiXCIwXFx4MTJcIiBcIjNcIiIsIFByaW50KDo6c3RkOjpzdHJpbmcoIjBceDEyIiAiMyIpKSk7CisgIC8vIGEgaGV4IGVzY2FwaW5nIHNlcXVlbmNlIGZvbGxvd2luZyBieSBhIGhleCBkaWdpdCAobG93ZXItY2FzZSkKKyAgRVhQRUNUX0VRKCJcIm1tXFx4NlwiIFwiYmFuYW5hc1wiIiwgUHJpbnQoOjpzdGQ6OnN0cmluZygibW1ceDYiICJiYW5hbmFzIikpKTsKKyAgLy8gYSBoZXggZXNjYXBpbmcgc2VxdWVuY2UgZm9sbG93aW5nIGJ5IGEgaGV4IGRpZ2l0ICh1cHBlci1jYXNlKQorICBFWFBFQ1RfRVEoIlwiTk9NXFx4NlwiIFwiQkFOQU5BXCIiLCBQcmludCg6OnN0ZDo6c3RyaW5nKCJOT01ceDYiICJCQU5BTkEiKSkpOworICAvLyBhIGhleCBlc2NhcGluZyBzZXF1ZW5jZSBmb2xsb3dpbmcgYnkgYSBub24teGRpZ2l0CisgIEVYUEVDVF9FUSgiXCIhXFx4NS0hXCIiLCBQcmludCg6OnN0ZDo6c3RyaW5nKCIhXHg1LSEiKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyA6OndzdHJpbmcgYW5kIDo6c3RkOjp3c3RyaW5nLgorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyA6OndzdHJpbmcuCitURVNUKFByaW50V2lkZVN0cmluZ1Rlc3QsIFN0cmluZ0luR2xvYmFsTmFtZXNwYWNlKSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0gTCInXCI/XFxcYVxiXGZcblwwXHJcdFx2XHhEM1x4NTc2XHg4RDNceEM3NEQgYSI7CisgIGNvbnN0IDo6d3N0cmluZyBzdHIocywgc2l6ZW9mKHMpL3NpemVvZih3Y2hhcl90KSk7CisgIEVYUEVDVF9FUSgiTFwiJ1xcXCI/XFxcXFxcYVxcYlxcZlxcblxcMFxcclxcdFxcdiIKKyAgICAgICAgICAgICJcXHhEM1xceDU3NlxceDhEM1xceEM3NEQgYVxcMFwiIiwKKyAgICAgICAgICAgIFByaW50KHN0cikpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gOjpzdGQ6OndzdHJpbmcuCitURVNUKFByaW50V2lkZVN0cmluZ1Rlc3QsIFN0cmluZ0luU3RkTmFtZXNwYWNlKSB7CisgIGNvbnN0IHdjaGFyX3Qgc1tdID0gTCInXCI/XFxcYVxiXGZcblwwXHJcdFx2XHhEM1x4NTc2XHg4RDNceEM3NEQgYSI7CisgIGNvbnN0IDo6c3RkOjp3c3RyaW5nIHN0cihzLCBzaXplb2Yocykvc2l6ZW9mKHdjaGFyX3QpKTsKKyAgRVhQRUNUX0VRKCJMXCInXFxcIj9cXFxcXFxhXFxiXFxmXFxuXFwwXFxyXFx0XFx2IgorICAgICAgICAgICAgIlxceEQzXFx4NTc2XFx4OEQzXFx4Qzc0RCBhXFwwXCIiLAorICAgICAgICAgICAgUHJpbnQoc3RyKSk7Cit9CisKK1RFU1QoUHJpbnRXaWRlU3RyaW5nVGVzdCwgU3RyaW5nQW1iaWd1b3VzSGV4KSB7CisgIC8vIHNhbWUgZm9yIHdpZGUgc3RyaW5ncy4KKyAgRVhQRUNUX0VRKCJMXCIwXFx4MTJcIiBMXCIzXCIiLCBQcmludCg6OnN0ZDo6d3N0cmluZyhMIjBceDEyIiBMIjMiKSkpOworICBFWFBFQ1RfRVEoIkxcIm1tXFx4NlwiIExcImJhbmFuYXNcIiIsCisgICAgICAgICAgICBQcmludCg6OnN0ZDo6d3N0cmluZyhMIm1tXHg2IiBMImJhbmFuYXMiKSkpOworICBFWFBFQ1RfRVEoIkxcIk5PTVxceDZcIiBMXCJCQU5BTkFcIiIsCisgICAgICAgICAgICBQcmludCg6OnN0ZDo6d3N0cmluZyhMIk5PTVx4NiIgTCJCQU5BTkEiKSkpOworICBFWFBFQ1RfRVEoIkxcIiFcXHg1LSFcIiIsIFByaW50KDo6c3RkOjp3c3RyaW5nKEwiIVx4NS0hIikpKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIFRlc3RzIHByaW50aW5nIHR5cGVzIHRoYXQgc3VwcG9ydCBnZW5lcmljIHN0cmVhbWluZyAoaS5lLiBzdHJlYW1pbmcKKy8vIHRvIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiBmb3IgYW55IHZhbGlkIENoYXIgYW5kCisvLyBDaGFyVHJhaXRzIHR5cGVzKS4KKworLy8gVGVzdHMgcHJpbnRpbmcgYSBub24tdGVtcGxhdGUgdHlwZSB0aGF0IHN1cHBvcnRzIGdlbmVyaWMgc3RyZWFtaW5nLgorCitjbGFzcyBBbGxvd3NHZW5lcmljU3RyZWFtaW5nIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cz4KK3N0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9zLAorICAgIGNvbnN0IEFsbG93c0dlbmVyaWNTdHJlYW1pbmcmIC8qIGEgKi8pIHsKKyAgcmV0dXJuIG9zIDw8ICJBbGxvd3NHZW5lcmljU3RyZWFtaW5nIjsKK30KKworVEVTVChQcmludFR5cGVXaXRoR2VuZXJpY1N0cmVhbWluZ1Rlc3QsIE5vblRlbXBsYXRlVHlwZSkgeworICBBbGxvd3NHZW5lcmljU3RyZWFtaW5nIGE7CisgIEVYUEVDVF9FUSgiQWxsb3dzR2VuZXJpY1N0cmVhbWluZyIsIFByaW50KGEpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgYSB0ZW1wbGF0ZSB0eXBlIHRoYXQgc3VwcG9ydHMgZ2VuZXJpYyBzdHJlYW1pbmcuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cywgdHlwZW5hbWUgVD4KK3N0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9zLAorICAgIGNvbnN0IEFsbG93c0dlbmVyaWNTdHJlYW1pbmdUZW1wbGF0ZTxUPiYgLyogYSAqLykgeworICByZXR1cm4gb3MgPDwgIkFsbG93c0dlbmVyaWNTdHJlYW1pbmdUZW1wbGF0ZSI7Cit9CisKK1RFU1QoUHJpbnRUeXBlV2l0aEdlbmVyaWNTdHJlYW1pbmdUZXN0LCBUZW1wbGF0ZVR5cGUpIHsKKyAgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ1RlbXBsYXRlPGludD4gYTsKKyAgRVhQRUNUX0VRKCJBbGxvd3NHZW5lcmljU3RyZWFtaW5nVGVtcGxhdGUiLCBQcmludChhKSk7Cit9CisKKy8vIFRlc3RzIHByaW50aW5nIGEgdHlwZSB0aGF0IHN1cHBvcnRzIGdlbmVyaWMgc3RyZWFtaW5nIGFuZCBjYW4gYmUKKy8vIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGFub3RoZXIgcHJpbnRhYmxlIHR5cGUuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQWxsb3dzR2VuZXJpY1N0cmVhbWluZ0FuZEltcGxpY2l0Q29udmVyc2lvblRlbXBsYXRlIHsKKyBwdWJsaWM6CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHMsIHR5cGVuYW1lIFQ+CitzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9wZXJhdG9yPDwoCisgICAgc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcywKKyAgICBjb25zdCBBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGU8VD4mIC8qIGEgKi8pIHsKKyAgcmV0dXJuIG9zIDw8ICJBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGUiOworfQorCitURVNUKFByaW50VHlwZVdpdGhHZW5lcmljU3RyZWFtaW5nVGVzdCwgVHlwZUltcGxpY2l0bHlDb252ZXJ0aWJsZSkgeworICBBbGxvd3NHZW5lcmljU3RyZWFtaW5nQW5kSW1wbGljaXRDb252ZXJzaW9uVGVtcGxhdGU8aW50PiBhOworICBFWFBFQ1RfRVEoIkFsbG93c0dlbmVyaWNTdHJlYW1pbmdBbmRJbXBsaWNpdENvbnZlcnNpb25UZW1wbGF0ZSIsIFByaW50KGEpKTsKK30KKworI2lmIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCisKKy8vIFRlc3RzIHByaW50aW5nIFN0cmluZ1BpZWNlLgorCitURVNUKFByaW50U3RyaW5nUGllY2VUZXN0LCBTaW1wbGVTdHJpbmdQaWVjZSkgeworICBjb25zdCBTdHJpbmdQaWVjZSBzcCA9ICJIZWxsbyI7CisgIEVYUEVDVF9FUSgiXCJIZWxsb1wiIiwgUHJpbnQoc3ApKTsKK30KKworVEVTVChQcmludFN0cmluZ1BpZWNlVGVzdCwgVW5wcmludGFibGVDaGFyYWN0ZXJzKSB7CisgIGNvbnN0IGNoYXIgc3RyW10gPSAiTlVMIChcMCkgYW5kIFxyXHQiOworICBjb25zdCBTdHJpbmdQaWVjZSBzcChzdHIsIHNpemVvZihzdHIpIC0gMSk7CisgIEVYUEVDVF9FUSgiXCJOVUwgKFxcMCkgYW5kIFxcclxcdFwiIiwgUHJpbnQoc3ApKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXworCisvLyBUZXN0cyBwcmludGluZyBTVEwgY29udGFpbmVycy4KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIEVtcHR5RGVxdWUpIHsKKyAgZGVxdWU8Y2hhcj4gZW1wdHk7CisgIEVYUEVDVF9FUSgie30iLCBQcmludChlbXB0eSkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTm9uRW1wdHlEZXF1ZSkgeworICBkZXF1ZTxpbnQ+IG5vbl9lbXB0eTsKKyAgbm9uX2VtcHR5LnB1c2hfYmFjaygxKTsKKyAgbm9uX2VtcHR5LnB1c2hfYmFjaygzKTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDMgfSIsIFByaW50KG5vbl9lbXB0eSkpOworfQorCisjaWYgR1RFU1RfSEFTX0hBU0hfTUFQXworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgT25lRWxlbWVudEhhc2hNYXApIHsKKyAgaGFzaF9tYXA8aW50LCBjaGFyPiBtYXAxOworICBtYXAxWzFdID0gJ2EnOworICBFWFBFQ1RfRVEoInsgKDEsICdhJyAoOTcsIDB4NjEpKSB9IiwgUHJpbnQobWFwMSkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgSGFzaE11bHRpTWFwKSB7CisgIGhhc2hfbXVsdGltYXA8aW50LCBib29sPiBtYXAxOworICBtYXAxLmluc2VydChtYWtlX3BhaXIoNSwgdHJ1ZSkpOworICBtYXAxLmluc2VydChtYWtlX3BhaXIoNSwgZmFsc2UpKTsKKworICAvLyBFbGVtZW50cyBvZiBoYXNoX211bHRpbWFwIGNhbiBiZSBwcmludGVkIGluIGFueSBvcmRlci4KKyAgY29uc3Qgc3RyaW5nIHJlc3VsdCA9IFByaW50KG1hcDEpOworICBFWFBFQ1RfVFJVRShyZXN1bHQgPT0gInsgKDUsIHRydWUpLCAoNSwgZmFsc2UpIH0iIHx8CisgICAgICAgICAgICAgIHJlc3VsdCA9PSAieyAoNSwgZmFsc2UpLCAoNSwgdHJ1ZSkgfSIpCisgICAgICAgICAgICAgICAgICA8PCAiIHdoZXJlIFByaW50KG1hcDEpIHJldHVybnMgXCIiIDw8IHJlc3VsdCA8PCAiXCIuIjsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfSEFTSF9NQVBfCisKKyNpZiBHVEVTVF9IQVNfSEFTSF9TRVRfCisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBIYXNoU2V0KSB7CisgIGhhc2hfc2V0PHN0cmluZz4gc2V0MTsKKyAgc2V0MS5pbnNlcnQoImhlbGxvIik7CisgIEVYUEVDVF9FUSgieyBcImhlbGxvXCIgfSIsIFByaW50KHNldDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIEhhc2hNdWx0aVNldCkgeworICBjb25zdCBpbnQga1NpemUgPSA1OworICBpbnQgYVtrU2l6ZV0gPSB7IDEsIDEsIDIsIDUsIDEgfTsKKyAgaGFzaF9tdWx0aXNldDxpbnQ+IHNldDEoYSwgYSArIGtTaXplKTsKKworICAvLyBFbGVtZW50cyBvZiBoYXNoX211bHRpc2V0IGNhbiBiZSBwcmludGVkIGluIGFueSBvcmRlci4KKyAgY29uc3Qgc3RyaW5nIHJlc3VsdCA9IFByaW50KHNldDEpOworICBjb25zdCBzdHJpbmcgZXhwZWN0ZWRfcGF0dGVybiA9ICJ7IGQsIGQsIGQsIGQsIGQgfSI7ICAvLyBkIG1lYW5zIGEgZGlnaXQuCisKKyAgLy8gVmVyaWZpZXMgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBleHBlY3RlZCBwYXR0ZXJuOyBhbHNvIGV4dHJhY3RzCisgIC8vIHRoZSBudW1iZXJzIGluIHRoZSByZXN1bHQuCisgIEFTU0VSVF9FUShleHBlY3RlZF9wYXR0ZXJuLmxlbmd0aCgpLCByZXN1bHQubGVuZ3RoKCkpOworICBzdGQ6OnZlY3RvcjxpbnQ+IG51bWJlcnM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHJlc3VsdC5sZW5ndGgoKTsgaSsrKSB7CisgICAgaWYgKGV4cGVjdGVkX3BhdHRlcm5baV0gPT0gJ2QnKSB7CisgICAgICBBU1NFUlRfTkUoaXNkaWdpdChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihyZXN1bHRbaV0pKSwgMCk7CisgICAgICBudW1iZXJzLnB1c2hfYmFjayhyZXN1bHRbaV0gLSAnMCcpOworICAgIH0gZWxzZSB7CisgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcGF0dGVybltpXSwgcmVzdWx0W2ldKSA8PCAiIHdoZXJlIHJlc3VsdCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQ7CisgICAgfQorICB9CisKKyAgLy8gTWFrZXMgc3VyZSB0aGUgcmVzdWx0IGNvbnRhaW5zIHRoZSByaWdodCBudW1iZXJzLgorICBzdGQ6OnNvcnQobnVtYmVycy5iZWdpbigpLCBudW1iZXJzLmVuZCgpKTsKKyAgc3RkOjpzb3J0KGEsIGEgKyBrU2l6ZSk7CisgIEVYUEVDVF9UUlVFKHN0ZDo6ZXF1YWwoYSwgYSArIGtTaXplLCBudW1iZXJzLmJlZ2luKCkpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfSEFTSF9TRVRfCisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBMaXN0KSB7CisgIGNvbnN0IHN0cmluZyBhW10gPSB7CisgICAgImhlbGxvIiwKKyAgICAid29ybGQiCisgIH07CisgIGNvbnN0IGxpc3Q8c3RyaW5nPiBzdHJpbmdzKGEsIGEgKyAyKTsKKyAgRVhQRUNUX0VRKCJ7IFwiaGVsbG9cIiwgXCJ3b3JsZFwiIH0iLCBQcmludChzdHJpbmdzKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBNYXApIHsKKyAgbWFwPGludCwgYm9vbD4gbWFwMTsKKyAgbWFwMVsxXSA9IHRydWU7CisgIG1hcDFbNV0gPSBmYWxzZTsKKyAgbWFwMVszXSA9IHRydWU7CisgIEVYUEVDVF9FUSgieyAoMSwgdHJ1ZSksICgzLCB0cnVlKSwgKDUsIGZhbHNlKSB9IiwgUHJpbnQobWFwMSkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTXVsdGlNYXApIHsKKyAgbXVsdGltYXA8Ym9vbCwgaW50PiBtYXAxOworICAvLyBUaGUgbWFrZV9wYWlyIHRlbXBsYXRlIGZ1bmN0aW9uIHdvdWxkIGRlZHVjZSB0aGUgdHlwZSBhcworICAvLyBwYWlyPGJvb2wsIGludD4gaGVyZSwgYW5kIHNpbmNlIHRoZSBrZXkgcGFydCBpbiBhIG11bHRpbWFwIGhhcyB0bworICAvLyBiZSBjb25zdGFudCwgd2l0aG91dCBhIHRlbXBsYXRlZCBjdG9yIGluIHRoZSBwYWlyIGNsYXNzIChhcyBpbgorICAvLyBsaWJDc3RkIG9uIFNvbGFyaXMpLCBtYWtlX3BhaXIgY2FsbCB3b3VsZCBmYWlsIHRvIGNvbXBpbGUgYXMgbm8KKyAgLy8gaW1wbGljaXQgY29udmVyc2lvbiBpcyBmb3VuZC4gIFRodXMgZXhwbGljaXQgdHlwZW5hbWUgaXMgdXNlZAorICAvLyBoZXJlIGluc3RlYWQuCisgIG1hcDEuaW5zZXJ0KHBhaXI8Y29uc3QgYm9vbCwgaW50Pih0cnVlLCAwKSk7CisgIG1hcDEuaW5zZXJ0KHBhaXI8Y29uc3QgYm9vbCwgaW50Pih0cnVlLCAxKSk7CisgIG1hcDEuaW5zZXJ0KHBhaXI8Y29uc3QgYm9vbCwgaW50PihmYWxzZSwgMikpOworICBFWFBFQ1RfRVEoInsgKGZhbHNlLCAyKSwgKHRydWUsIDApLCAodHJ1ZSwgMSkgfSIsIFByaW50KG1hcDEpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIFNldCkgeworICBjb25zdCB1bnNpZ25lZCBpbnQgYVtdID0geyAzLCAwLCA1IH07CisgIHNldDx1bnNpZ25lZCBpbnQ+IHNldDEoYSwgYSArIDMpOworICBFWFBFQ1RfRVEoInsgMCwgMywgNSB9IiwgUHJpbnQoc2V0MSkpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTXVsdGlTZXQpIHsKKyAgY29uc3QgaW50IGFbXSA9IHsgMSwgMSwgMiwgNSwgMSB9OworICBtdWx0aXNldDxpbnQ+IHNldDEoYSwgYSArIDUpOworICBFWFBFQ1RfRVEoInsgMSwgMSwgMSwgMiwgNSB9IiwgUHJpbnQoc2V0MSkpOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9GT1JXQVJEX0xJU1RfCisvLyA8c2xpc3Q+IGlzIGF2YWlsYWJsZSBvbiBMaW51eCBpbiB0aGUgZ29vZ2xlMyBtb2RlLCBidXQgbm90IG9uCisvLyBXaW5kb3dzIG9yIE1hYyBPUyBYLgorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgU2luZ2x5TGlua2VkTGlzdCkgeworICBpbnQgYVtdID0geyA5LCAyLCA4IH07CisgIGNvbnN0IHN0ZDo6Zm9yd2FyZF9saXN0PGludD4gaW50cyhhLCBhICsgMyk7CisgIEVYUEVDVF9FUSgieyA5LCAyLCA4IH0iLCBQcmludChpbnRzKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRk9SV0FSRF9MSVNUXworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgUGFpcikgeworICBwYWlyPGNvbnN0IGJvb2wsIGludD4gcCh0cnVlLCA1KTsKKyAgRVhQRUNUX0VRKCIodHJ1ZSwgNSkiLCBQcmludChwKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBWZWN0b3IpIHsKKyAgdmVjdG9yPGludD4gdjsKKyAgdi5wdXNoX2JhY2soMSk7CisgIHYucHVzaF9iYWNrKDIpOworICBFWFBFQ1RfRVEoInsgMSwgMiB9IiwgUHJpbnQodikpOworfQorCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgTG9uZ1NlcXVlbmNlKSB7CisgIGNvbnN0IGludCBhWzEwMF0gPSB7IDEsIDIsIDMgfTsKKyAgY29uc3QgdmVjdG9yPGludD4gdihhLCBhICsgMTAwKTsKKyAgRVhQRUNUX0VRKCJ7IDEsIDIsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICIKKyAgICAgICAgICAgICIwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAuLi4gfSIsIFByaW50KHYpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE5lc3RlZENvbnRhaW5lcikgeworICBjb25zdCBpbnQgYTFbXSA9IHsgMSwgMiB9OworICBjb25zdCBpbnQgYTJbXSA9IHsgMywgNCwgNSB9OworICBjb25zdCBsaXN0PGludD4gbDEoYTEsIGExICsgMik7CisgIGNvbnN0IGxpc3Q8aW50PiBsMihhMiwgYTIgKyAzKTsKKworICB2ZWN0b3I8bGlzdDxpbnQ+ID4gdjsKKyAgdi5wdXNoX2JhY2sobDEpOworICB2LnB1c2hfYmFjayhsMik7CisgIEVYUEVDVF9FUSgieyB7IDEsIDIgfSwgeyAzLCA0LCA1IH0gfSIsIFByaW50KHYpKTsKK30KKworVEVTVChQcmludFN0bENvbnRhaW5lclRlc3QsIE9uZURpbWVuc2lvbmFsTmF0aXZlQXJyYXkpIHsKKyAgY29uc3QgaW50IGFbM10gPSB7IDEsIDIsIDMgfTsKKyAgTmF0aXZlQXJyYXk8aW50PiBiKGEsIDMsIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7CisgIEVYUEVDVF9FUSgieyAxLCAyLCAzIH0iLCBQcmludChiKSk7Cit9CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBUd29EaW1lbnNpb25hbE5hdGl2ZUFycmF5KSB7CisgIGNvbnN0IGludCBhWzJdWzNdID0geyB7IDEsIDIsIDMgfSwgeyA0LCA1LCA2IH0gfTsKKyAgTmF0aXZlQXJyYXk8aW50WzNdPiBiKGEsIDIsIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7CisgIEVYUEVDVF9FUSgieyB7IDEsIDIsIDMgfSwgeyA0LCA1LCA2IH0gfSIsIFByaW50KGIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGNsYXNzIG5hbWVkIGl0ZXJhdG9yIGlzbid0IHRyZWF0ZWQgYXMgYSBjb250YWluZXIuCisKK3N0cnVjdCBpdGVyYXRvciB7CisgIGNoYXIgeDsKK307CisKK1RFU1QoUHJpbnRTdGxDb250YWluZXJUZXN0LCBJdGVyYXRvcikgeworICBpdGVyYXRvciBpdCA9IHt9OworICBFWFBFQ1RfRVEoIjEtYnl0ZSBvYmplY3QgPDAwPiIsIFByaW50KGl0KSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBjbGFzcyBuYW1lZCBjb25zdF9pdGVyYXRvciBpc24ndCB0cmVhdGVkIGFzIGEgY29udGFpbmVyLgorCitzdHJ1Y3QgY29uc3RfaXRlcmF0b3IgeworICBjaGFyIHg7Cit9OworCitURVNUKFByaW50U3RsQ29udGFpbmVyVGVzdCwgQ29uc3RJdGVyYXRvcikgeworICBjb25zdF9pdGVyYXRvciBpdCA9IHt9OworICBFWFBFQ1RfRVEoIjEtYnl0ZSBvYmplY3QgPDAwPiIsIFByaW50KGl0KSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCisvLyBUZXN0cyBwcmludGluZyA6OnN0ZDo6dHIxOjp0dXBsZXMuCisKKy8vIFR1cGxlcyBvZiB2YXJpb3VzIGFyaXRpZXMuCitURVNUKFByaW50VHIxVHVwbGVUZXN0LCBWYXJpb3VzU2l6ZXMpIHsKKyAgOjpzdGQ6OnRyMTo6dHVwbGU8PiB0MDsKKyAgRVhQRUNUX0VRKCIoKSIsIFByaW50KHQwKSk7CisKKyAgOjpzdGQ6OnRyMTo6dHVwbGU8aW50PiB0MSg1KTsKKyAgRVhQRUNUX0VRKCIoNSkiLCBQcmludCh0MSkpOworCisgIDo6c3RkOjp0cjE6OnR1cGxlPGNoYXIsIGJvb2w+IHQyKCdhJywgdHJ1ZSk7CisgIEVYUEVDVF9FUSgiKCdhJyAoOTcsIDB4NjEpLCB0cnVlKSIsIFByaW50KHQyKSk7CisKKyAgOjpzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgaW50LCBpbnQ+IHQzKGZhbHNlLCAyLCAzKTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMpIiwgUHJpbnQodDMpKTsKKworICA6OnN0ZDo6dHIxOjp0dXBsZTxib29sLCBpbnQsIGludCwgaW50PiB0NChmYWxzZSwgMiwgMywgNCk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0KSIsIFByaW50KHQ0KSk7CisKKyAgOjpzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbD4gdDUoZmFsc2UsIDIsIDMsIDQsIHRydWUpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSkiLCBQcmludCh0NSkpOworCisgIDo6c3RkOjp0cjE6OnR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludD4gdDYoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNikiLCBQcmludCh0NikpOworCisgIDo6c3RkOjp0cjE6OnR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50PiB0NygKKyAgICAgIGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3KTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcpIiwgUHJpbnQodDcpKTsKKworICA6OnN0ZDo6dHIxOjp0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sLCBpbnQsIGludCwgYm9vbD4gdDgoCisgICAgICBmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3LCB0cnVlKSIsIFByaW50KHQ4KSk7CisKKyAgOjpzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbCwgaW50LCBpbnQsIGJvb2wsIGludD4gdDkoCisgICAgICBmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSwgOSk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3LCB0cnVlLCA5KSIsIFByaW50KHQ5KSk7CisKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gIjgiOworICAvLyBWQysrIDIwMTAncyBpbXBsZW1lbnRhdGlvbiBvZiB0dXBsZSBvZiBDKysweCBpcyBkZWZpY2llbnQsIHJlcXVpcmluZworICAvLyBhbiBleHBsaWNpdCB0eXBlIGNhc3Qgb2YgTlVMTCB0byBiZSB1c2VkLgorICA6OnN0ZDo6dHIxOjp0dXBsZTxib29sLCBjaGFyLCBzaG9ydCwgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyLCAgLy8gTk9MSU5UCisgICAgICB0ZXN0aW5nOjppbnRlcm5hbDo6SW50NjQsIGZsb2F0LCBkb3VibGUsIGNvbnN0IGNoYXIqLCB2b2lkKiwgc3RyaW5nPgorICAgICAgdDEwKGZhbHNlLCAnYScsIDMsIDQsIDUsIDEuNUYsIC0yLjUsIHN0ciwKKyAgICAgICAgICBJbXBsaWNpdENhc3RfPHZvaWQqPihOVUxMKSwgIjEwIik7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAnYScgKDk3LCAweDYxKSwgMywgNCwgNSwgMS41LCAtMi41LCAiICsgUHJpbnRQb2ludGVyKHN0cikgKworICAgICAgICAgICAgIiBwb2ludGluZyB0byBcIjhcIiwgTlVMTCwgXCIxMFwiKSIsCisgICAgICAgICAgICBQcmludCh0MTApKTsKK30KKworLy8gTmVzdGVkIHR1cGxlcy4KK1RFU1QoUHJpbnRUcjFUdXBsZVRlc3QsIE5lc3RlZFR1cGxlKSB7CisgIDo6c3RkOjp0cjE6OnR1cGxlPCA6OnN0ZDo6dHIxOjp0dXBsZTxpbnQsIGJvb2w+LCBjaGFyPiBuZXN0ZWQoCisgICAgICA6OnN0ZDo6dHIxOjptYWtlX3R1cGxlKDUsIHRydWUpLCAnYScpOworICBFWFBFQ1RfRVEoIigoNSwgdHJ1ZSksICdhJyAoOTcsIDB4NjEpKSIsIFByaW50KG5lc3RlZCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworI2lmIEdURVNUX0hBU19TVERfVFVQTEVfCisvLyBUZXN0cyBwcmludGluZyA6OnN0ZDo6dHVwbGVzLgorCisvLyBUdXBsZXMgb2YgdmFyaW91cyBhcml0aWVzLgorVEVTVChQcmludFN0ZFR1cGxlVGVzdCwgVmFyaW91c1NpemVzKSB7CisgIDo6c3RkOjp0dXBsZTw+IHQwOworICBFWFBFQ1RfRVEoIigpIiwgUHJpbnQodDApKTsKKworICA6OnN0ZDo6dHVwbGU8aW50PiB0MSg1KTsKKyAgRVhQRUNUX0VRKCIoNSkiLCBQcmludCh0MSkpOworCisgIDo6c3RkOjp0dXBsZTxjaGFyLCBib29sPiB0MignYScsIHRydWUpOworICBFWFBFQ1RfRVEoIignYScgKDk3LCAweDYxKSwgdHJ1ZSkiLCBQcmludCh0MikpOworCisgIDo6c3RkOjp0dXBsZTxib29sLCBpbnQsIGludD4gdDMoZmFsc2UsIDIsIDMpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMykiLCBQcmludCh0MykpOworCisgIDo6c3RkOjp0dXBsZTxib29sLCBpbnQsIGludCwgaW50PiB0NChmYWxzZSwgMiwgMywgNCk7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0KSIsIFByaW50KHQ0KSk7CisKKyAgOjpzdGQ6OnR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2w+IHQ1KGZhbHNlLCAyLCAzLCA0LCB0cnVlKTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUpIiwgUHJpbnQodDUpKTsKKworICA6OnN0ZDo6dHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbCwgaW50PiB0NihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNik7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2KSIsIFByaW50KHQ2KSk7CisKKyAgOjpzdGQ6OnR1cGxlPGJvb2wsIGludCwgaW50LCBpbnQsIGJvb2wsIGludCwgaW50PiB0NygKKyAgICAgIGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3KTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcpIiwgUHJpbnQodDcpKTsKKworICA6OnN0ZDo6dHVwbGU8Ym9vbCwgaW50LCBpbnQsIGludCwgYm9vbCwgaW50LCBpbnQsIGJvb2w+IHQ4KAorICAgICAgZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUpOworICBFWFBFQ1RfRVEoIihmYWxzZSwgMiwgMywgNCwgdHJ1ZSwgNiwgNywgdHJ1ZSkiLCBQcmludCh0OCkpOworCisgIDo6c3RkOjp0dXBsZTxib29sLCBpbnQsIGludCwgaW50LCBib29sLCBpbnQsIGludCwgYm9vbCwgaW50PiB0OSgKKyAgICAgIGZhbHNlLCAyLCAzLCA0LCB0cnVlLCA2LCA3LCB0cnVlLCA5KTsKKyAgRVhQRUNUX0VRKCIoZmFsc2UsIDIsIDMsIDQsIHRydWUsIDYsIDcsIHRydWUsIDkpIiwgUHJpbnQodDkpKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBzdHIgPSAiOCI7CisgIC8vIFZDKysgMjAxMCdzIGltcGxlbWVudGF0aW9uIG9mIHR1cGxlIG9mIEMrKzB4IGlzIGRlZmljaWVudCwgcmVxdWlyaW5nCisgIC8vIGFuIGV4cGxpY2l0IHR5cGUgY2FzdCBvZiBOVUxMIHRvIGJlIHVzZWQuCisgIDo6c3RkOjp0dXBsZTxib29sLCBjaGFyLCBzaG9ydCwgdGVzdGluZzo6aW50ZXJuYWw6OkludDMyLCAgLy8gTk9MSU5UCisgICAgICB0ZXN0aW5nOjppbnRlcm5hbDo6SW50NjQsIGZsb2F0LCBkb3VibGUsIGNvbnN0IGNoYXIqLCB2b2lkKiwgc3RyaW5nPgorICAgICAgdDEwKGZhbHNlLCAnYScsIDMsIDQsIDUsIDEuNUYsIC0yLjUsIHN0ciwKKyAgICAgICAgICBJbXBsaWNpdENhc3RfPHZvaWQqPihOVUxMKSwgIjEwIik7CisgIEVYUEVDVF9FUSgiKGZhbHNlLCAnYScgKDk3LCAweDYxKSwgMywgNCwgNSwgMS41LCAtMi41LCAiICsgUHJpbnRQb2ludGVyKHN0cikgKworICAgICAgICAgICAgIiBwb2ludGluZyB0byBcIjhcIiwgTlVMTCwgXCIxMFwiKSIsCisgICAgICAgICAgICBQcmludCh0MTApKTsKK30KKworLy8gTmVzdGVkIHR1cGxlcy4KK1RFU1QoUHJpbnRTdGRUdXBsZVRlc3QsIE5lc3RlZFR1cGxlKSB7CisgIDo6c3RkOjp0dXBsZTwgOjpzdGQ6OnR1cGxlPGludCwgYm9vbD4sIGNoYXI+IG5lc3RlZCgKKyAgICAgIDo6c3RkOjptYWtlX3R1cGxlKDUsIHRydWUpLCAnYScpOworICBFWFBFQ1RfRVEoIigoNSwgdHJ1ZSksICdhJyAoOTcsIDB4NjEpKSIsIFByaW50KG5lc3RlZCkpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKKworLy8gVGVzdHMgcHJpbnRpbmcgdXNlci1kZWZpbmVkIHVucHJpbnRhYmxlIHR5cGVzLgorCisvLyBVbnByaW50YWJsZSB0eXBlcyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK1RFU1QoUHJpbnRVbnByaW50YWJsZVR5cGVUZXN0LCBJbkdsb2JhbE5hbWVzcGFjZSkgeworICBFWFBFQ1RfRVEoIjEtYnl0ZSBvYmplY3QgPDAwPiIsCisgICAgICAgICAgICBQcmludChVbnByaW50YWJsZVRlbXBsYXRlSW5HbG9iYWw8Y2hhcj4oKSkpOworfQorCisvLyBVbnByaW50YWJsZSB0eXBlcyBpbiBhIHVzZXIgbmFtZXNwYWNlLgorVEVTVChQcmludFVucHJpbnRhYmxlVHlwZVRlc3QsIEluVXNlck5hbWVzcGFjZSkgeworICBFWFBFQ1RfRVEoIjE2LWJ5dGUgb2JqZWN0IDxFRi0xMiAwMC0wMCAzNC1BQiAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMD4iLAorICAgICAgICAgICAgUHJpbnQoOjpmb286OlVucHJpbnRhYmxlSW5Gb28oKSkpOworfQorCisvLyBVbnByaW50YWJsZSB0eXBlcyBhcmUgdGhhdCB0b28gYmlnIHRvIGJlIHByaW50ZWQgY29tcGxldGVseS4KKworc3RydWN0IEJpZyB7CisgIEJpZygpIHsgbWVtc2V0KGFycmF5LCAwLCBzaXplb2YoYXJyYXkpKTsgfQorICBjaGFyIGFycmF5WzI1N107Cit9OworCitURVNUKFByaW50VW5wcml0YWJsZVR5cGVUZXN0LCBCaWdPYmplY3QpIHsKKyAgRVhQRUNUX0VRKCIyNTctYnl0ZSBvYmplY3QgPDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwICIKKyAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAiCisgICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgIgorICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIC4uLiAwMC0wMCAwMC0wMCAwMC0wMCAiCisgICAgICAgICAgICAiMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgMDAtMDAgIgorICAgICAgICAgICAgIjAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwICIKKyAgICAgICAgICAgICIwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMC0wMCAwMD4iLAorICAgICAgICAgICAgUHJpbnQoQmlnKCkpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgdXNlci1kZWZpbmVkIHN0cmVhbWFibGUgdHlwZXMuCisKKy8vIFN0cmVhbWFibGUgdHlwZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitURVNUKFByaW50U3RyZWFtYWJsZVR5cGVUZXN0LCBJbkdsb2JhbE5hbWVzcGFjZSkgeworICBTdHJlYW1hYmxlSW5HbG9iYWwgeDsKKyAgRVhQRUNUX0VRKCJTdHJlYW1hYmxlSW5HbG9iYWwiLCBQcmludCh4KSk7CisgIEVYUEVDVF9FUSgiU3RyZWFtYWJsZUluR2xvYmFsKiIsIFByaW50KCZ4KSk7Cit9CisKKy8vIFByaW50YWJsZSB0ZW1wbGF0ZSB0eXBlcyBpbiBhIHVzZXIgbmFtZXNwYWNlLgorVEVTVChQcmludFN0cmVhbWFibGVUeXBlVGVzdCwgVGVtcGxhdGVUeXBlSW5Vc2VyTmFtZXNwYWNlKSB7CisgIEVYUEVDVF9FUSgiU3RyZWFtYWJsZVRlbXBsYXRlSW5Gb286IDAiLAorICAgICAgICAgICAgUHJpbnQoOjpmb286OlN0cmVhbWFibGVUZW1wbGF0ZUluRm9vPGludD4oKSkpOworfQorCisvLyBUZXN0cyBwcmludGluZyB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBoYXZlIGEgUHJpbnRUbygpIGZ1bmN0aW9uLgorVEVTVChQcmludFByaW50YWJsZVR5cGVUZXN0LCBJblVzZXJOYW1lc3BhY2UpIHsKKyAgRVhQRUNUX0VRKCJQcmludGFibGVWaWFQcmludFRvOiAwIiwKKyAgICAgICAgICAgIFByaW50KDo6Zm9vOjpQcmludGFibGVWaWFQcmludFRvKCkpKTsKK30KKworLy8gVGVzdHMgcHJpbnRpbmcgYSBwb2ludGVyIHRvIGEgdXNlci1kZWZpbmVkIHR5cGUgdGhhdCBoYXMgYSA8PAorLy8gb3BlcmF0b3IgZm9yIGl0cyBwb2ludGVyLgorVEVTVChQcmludFByaW50YWJsZVR5cGVUZXN0LCBQb2ludGVySW5Vc2VyTmFtZXNwYWNlKSB7CisgIDo6Zm9vOjpQb2ludGVyUHJpbnRhYmxlIHg7CisgIEVYUEVDVF9FUSgiUG9pbnRlclByaW50YWJsZSoiLCBQcmludCgmeCkpOworfQorCisvLyBUZXN0cyBwcmludGluZyB1c2VyLWRlZmluZWQgY2xhc3MgdGVtcGxhdGUgdGhhdCBoYXZlIGEgUHJpbnRUbygpIGZ1bmN0aW9uLgorVEVTVChQcmludFByaW50YWJsZVR5cGVUZXN0LCBUZW1wbGF0ZUluVXNlck5hbWVzcGFjZSkgeworICBFWFBFQ1RfRVEoIlByaW50YWJsZVZpYVByaW50VG9UZW1wbGF0ZTogNSIsCisgICAgICAgICAgICBQcmludCg6OmZvbzo6UHJpbnRhYmxlVmlhUHJpbnRUb1RlbXBsYXRlPGludD4oNSkpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgdW5pdmVyc2FsIHByaW50ZXIgcHJpbnRzIGJvdGggdGhlIGFkZHJlc3MgYW5kIHRoZQorLy8gdmFsdWUgb2YgYSByZWZlcmVuY2UuCitURVNUKFByaW50UmVmZXJlbmNlVGVzdCwgUHJpbnRzQWRkcmVzc0FuZFZhbHVlKSB7CisgIGludCBuID0gNTsKKyAgRVhQRUNUX0VRKCJAIiArIFByaW50UG9pbnRlcigmbikgKyAiIDUiLCBQcmludEJ5UmVmKG4pKTsKKworICBpbnQgYVsyXVszXSA9IHsKKyAgICB7IDAsIDEsIDIgfSwKKyAgICB7IDMsIDQsIDUgfQorICB9OworICBFWFBFQ1RfRVEoIkAiICsgUHJpbnRQb2ludGVyKGEpICsgIiB7IHsgMCwgMSwgMiB9LCB7IDMsIDQsIDUgfSB9IiwKKyAgICAgICAgICAgIFByaW50QnlSZWYoYSkpOworCisgIGNvbnN0IDo6Zm9vOjpVbnByaW50YWJsZUluRm9vIHg7CisgIEVYUEVDVF9FUSgiQCIgKyBQcmludFBvaW50ZXIoJngpICsgIiAxNi1ieXRlIG9iamVjdCAiCisgICAgICAgICAgICAiPEVGLTEyIDAwLTAwIDM0LUFCIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwIDAwLTAwPiIsCisgICAgICAgICAgICBQcmludEJ5UmVmKHgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgdW5pdmVyc2FsIHByaW50ZXIgcHJpbnRzIGEgZnVuY3Rpb24gcG9pbnRlciBwYXNzZWQgYnkKKy8vIHJlZmVyZW5jZS4KK1RFU1QoUHJpbnRSZWZlcmVuY2VUZXN0LCBIYW5kbGVzRnVuY3Rpb25Qb2ludGVyKSB7CisgIHZvaWQgKCpmcCkoaW50IG4pID0gJk15RnVuY3Rpb247CisgIGNvbnN0IHN0cmluZyBmcF9wb2ludGVyX3N0cmluZyA9CisgICAgICBQcmludFBvaW50ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJmZwKSk7CisgIC8vIFdlIGNhbm5vdCBkaXJlY3RseSBjYXN0ICZNeUZ1bmN0aW9uIHRvIGNvbnN0IHZvaWQqIGJlY2F1c2UgdGhlCisgIC8vIHN0YW5kYXJkIGRpc2FsbG93cyBjYXN0aW5nIGJldHdlZW4gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGFuZAorICAvLyBwb2ludGVycyB0byBvYmplY3RzLCBhbmQgc29tZSBjb21waWxlcnMgKGUuZy4gR0NDIDMuNCkgZW5mb3JjZQorICAvLyB0aGlzIGxpbWl0YXRpb24uCisgIGNvbnN0IHN0cmluZyBmcF9zdHJpbmcgPSBQcmludFBvaW50ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oCisgICAgICByZWludGVycHJldF9jYXN0PGludGVybmFsOjpCaWdnZXN0SW50PihmcCkpKTsKKyAgRVhQRUNUX0VRKCJAIiArIGZwX3BvaW50ZXJfc3RyaW5nICsgIiAiICsgZnBfc3RyaW5nLAorICAgICAgICAgICAgUHJpbnRCeVJlZihmcCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSB1bml2ZXJzYWwgcHJpbnRlciBwcmludHMgYSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcgorLy8gcGFzc2VkIGJ5IHJlZmVyZW5jZS4KK1RFU1QoUHJpbnRSZWZlcmVuY2VUZXN0LCBIYW5kbGVzTWVtYmVyRnVuY3Rpb25Qb2ludGVyKSB7CisgIGludCAoRm9vOjoqcCkoY2hhciBjaCkgPSAmRm9vOjpNeU1ldGhvZDsKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KAorICAgICAgUHJpbnRCeVJlZihwKSwKKyAgICAgICJAIiArIFByaW50UG9pbnRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmcCkpICsgIiAiICsKKyAgICAgICAgICBQcmludChzaXplb2YocCkpICsgIi1ieXRlIG9iamVjdCAiKSk7CisKKyAgY2hhciAoRm9vOjoqcDIpKGludCBuKSA9ICZGb286Ok15VmlydHVhbE1ldGhvZDsKKyAgRVhQRUNUX1RSVUUoSGFzUHJlZml4KAorICAgICAgUHJpbnRCeVJlZihwMiksCisgICAgICAiQCIgKyBQcmludFBvaW50ZXIocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJnAyKSkgKyAiICIgKworICAgICAgICAgIFByaW50KHNpemVvZihwMikpICsgIi1ieXRlIG9iamVjdCAiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIHVuaXZlcnNhbCBwcmludGVyIHByaW50cyBhIG1lbWJlciB2YXJpYWJsZSBwb2ludGVyCisvLyBwYXNzZWQgYnkgcmVmZXJlbmNlLgorVEVTVChQcmludFJlZmVyZW5jZVRlc3QsIEhhbmRsZXNNZW1iZXJWYXJpYWJsZVBvaW50ZXIpIHsKKyAgaW50IChGb286OipwKSA9ICZGb286OnZhbHVlOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9UUlVFKEhhc1ByZWZpeCgKKyAgICAgIFByaW50QnlSZWYocCksCisgICAgICAiQCIgKyBQcmludFBvaW50ZXIoJnApICsgIiAiICsgUHJpbnQoc2l6ZW9mKHApKSArICItYnl0ZSBvYmplY3QgIikpOworfQorCisvLyBUZXN0cyB0aGF0IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgpLCB3aGljaCBpcyB1c2VkIHRvIHByaW50CisvLyBhbiBvcGVyYW5kIGluIGEgY29tcGFyaXNvbiBhc3NlcnRpb24gKGUuZy4gQVNTRVJUX0VRKSB3aGVuIHRoZSBhc3NlcnRpb24KKy8vIGZhaWxzLCBmb3JtYXRzIHRoZSBvcGVyYW5kIGluIHRoZSBkZXNpcmVkIHdheS4KKworLy8gc2NhbGFyCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yU2NhbGFyKSB7CisgIEVYUEVDVF9TVFJFUSgiMTIzIiwKKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgxMjMsIDEyNCkuY19zdHIoKSk7Cit9CisKKy8vIG5vbi1jaGFyIHBvaW50ZXIKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JOb25DaGFyUG9pbnRlcikgeworICBpbnQgbiA9IDA7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoJm4pLAorICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKCZuLCAmbikuY19zdHIoKSk7Cit9CisKKy8vIG5vbi1jaGFyIGFycmF5CitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIEZvcm1hdHNOb25DaGFyQXJyYXlBc1BvaW50ZXIpIHsKKyAgLy8gSW4gZXhwcmVzc2lvbiAnYXJyYXkgPT0geCcsICdhcnJheScgaXMgY29tcGFyZWQgYnkgcG9pbnRlci4KKyAgLy8gVGhlcmVmb3JlIHdlIHdhbnQgdG8gcHJpbnQgYW4gYXJyYXkgb3BlcmFuZCBhcyBhIHBvaW50ZXIuCisgIGludCBuW10gPSB7IDEsIDIsIDMgfTsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihuKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShuLCBuKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgZm9ybWF0dGluZyBhIGNoYXIgcG9pbnRlciB3aGVuIGl0J3MgY29tcGFyZWQgd2l0aCBhbm90aGVyIHBvaW50ZXIuCisvLyBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBwcmludCBpdCBhcyBhIHJhdyBwb2ludGVyLCBhcyB0aGUgY29tcGFyaXNpb24gaXMgYnkKKy8vIHBvaW50ZXIuCisKKy8vIGNoYXIgcG9pbnRlciB2cyBwb2ludGVyCitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhclBvaW50ZXJWc1BvaW50ZXIpIHsKKyAgLy8gSW4gZXhwcmVzc2lvbiAncCA9PSB4Jywgd2hlcmUgJ3AnIGFuZCAneCcgYXJlIChjb25zdCBvciBub3QpIGNoYXIKKyAgLy8gcG9pbnRlcnMsIHRoZSBvcGVyYW5kcyBhcmUgY29tcGFyZWQgYnkgcG9pbnRlci4gIFRoZXJlZm9yZSB3ZQorICAvLyB3YW50IHRvIHByaW50ICdwJyBhcyBhIHBvaW50ZXIgaW5zdGVhZCBvZiBhIEMgc3RyaW5nICh3ZSBkb24ndAorICAvLyBldmVuIGtub3cgaWYgaXQncyBzdXBwb3NlZCB0byBwb2ludCB0byBhIHZhbGlkIEMgc3RyaW5nKS4KKworICAvLyBjb25zdCBjaGFyKgorICBjb25zdCBjaGFyKiBzID0gImhlbGxvIjsKKyAgRVhQRUNUX0VRKFByaW50UG9pbnRlcihzKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzLCBzKS5jX3N0cigpKTsKKworICAvLyBjaGFyKgorICBjaGFyIGNoID0gJ2EnOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKCZjaCksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoJmNoLCAmY2gpLmNfc3RyKCkpOworfQorCisvLyB3Y2hhcl90IHBvaW50ZXIgdnMgcG9pbnRlcgorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyUG9pbnRlclZzUG9pbnRlcikgeworICAvLyBJbiBleHByZXNzaW9uICdwID09IHgnLCB3aGVyZSAncCcgYW5kICd4JyBhcmUgKGNvbnN0IG9yIG5vdCkgY2hhcgorICAvLyBwb2ludGVycywgdGhlIG9wZXJhbmRzIGFyZSBjb21wYXJlZCBieSBwb2ludGVyLiAgVGhlcmVmb3JlIHdlCisgIC8vIHdhbnQgdG8gcHJpbnQgJ3AnIGFzIGEgcG9pbnRlciBpbnN0ZWFkIG9mIGEgd2lkZSBDIHN0cmluZyAod2UgZG9uJ3QKKyAgLy8gZXZlbiBrbm93IGlmIGl0J3Mgc3VwcG9zZWQgdG8gcG9pbnQgdG8gYSB2YWxpZCB3aWRlIEMgc3RyaW5nKS4KKworICAvLyBjb25zdCB3Y2hhcl90KgorICBjb25zdCB3Y2hhcl90KiBzID0gTCJoZWxsbyI7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIocyksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocywgcykuY19zdHIoKSk7CisKKyAgLy8gd2NoYXJfdCoKKyAgd2NoYXJfdCBjaCA9IEwnYSc7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoJmNoKSwKKyAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgmY2gsICZjaCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIGZvcm1hdHRpbmcgYSBjaGFyIHBvaW50ZXIgd2hlbiBpdCdzIGNvbXBhcmVkIHRvIGEgc3RyaW5nIG9iamVjdC4KKy8vIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHByaW50IHRoZSBjaGFyIHBvaW50ZXIgYXMgYSBDIHN0cmluZy4KKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisvLyBjaGFyIHBvaW50ZXIgdnMgOjpzdHJpbmcKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyUG9pbnRlclZzU3RyaW5nKSB7CisgIGNvbnN0IGNoYXIqIHMgPSAiaGVsbG8gXCJ3b3JsZCI7CisgIEVYUEVDVF9TVFJFUSgiXCJoZWxsbyBcXFwid29ybGRcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocywgOjpzdHJpbmcoKSkuY19zdHIoKSk7CisKKyAgLy8gY2hhcioKKyAgY2hhciBzdHJbXSA9ICJoaVwxIjsKKyAgY2hhciogcCA9IHN0cjsKKyAgRVhQRUNUX1NUUkVRKCJcImhpXFx4MVwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShwLCA6OnN0cmluZygpKS5jX3N0cigpKTsKK30KKyNlbmRpZgorCisvLyBjaGFyIHBvaW50ZXIgdnMgc3RkOjpzdHJpbmcKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JDaGFyUG9pbnRlclZzU3RkU3RyaW5nKSB7CisgIGNvbnN0IGNoYXIqIHMgPSAiaGVsbG8gXCJ3b3JsZCI7CisgIEVYUEVDVF9TVFJFUSgiXCJoZWxsbyBcXFwid29ybGRcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocywgOjpzdGQ6OnN0cmluZygpKS5jX3N0cigpKTsKKworICAvLyBjaGFyKgorICBjaGFyIHN0cltdID0gImhpXDEiOworICBjaGFyKiBwID0gc3RyOworICBFWFBFQ1RfU1RSRVEoIlwiaGlcXHgxXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHAsIDo6c3RkOjpzdHJpbmcoKSkuY19zdHIoKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIHdjaGFyX3QgcG9pbnRlciB2cyA6OndzdHJpbmcKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JXQ2hhclBvaW50ZXJWc1dTdHJpbmcpIHsKKyAgY29uc3Qgd2NoYXJfdCogcyA9IEwiaGkgXCJ3b3JsZCI7CisgIEVYUEVDVF9TVFJFUSgiTFwiaGkgXFxcIndvcmxkXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHMsIDo6d3N0cmluZygpKS5jX3N0cigpKTsKKworICAvLyB3Y2hhcl90KgorICB3Y2hhcl90IHN0cltdID0gTCJoaVwxIjsKKyAgd2NoYXJfdCogcCA9IHN0cjsKKyAgRVhQRUNUX1NUUkVRKCJMXCJoaVxceDFcIiIsICAvLyBUaGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocCwgOjp3c3RyaW5nKCkpLmNfc3RyKCkpOworfQorI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKy8vIHdjaGFyX3QgcG9pbnRlciB2cyBzdGQ6OndzdHJpbmcKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JXQ2hhclBvaW50ZXJWc1N0ZFdTdHJpbmcpIHsKKyAgY29uc3Qgd2NoYXJfdCogcyA9IEwiaGkgXCJ3b3JsZCI7CisgIEVYUEVDVF9TVFJFUSgiTFwiaGkgXFxcIndvcmxkXCIiLCAgLy8gVGhlIHN0cmluZyBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHMsIDo6c3RkOjp3c3RyaW5nKCkpLmNfc3RyKCkpOworCisgIC8vIHdjaGFyX3QqCisgIHdjaGFyX3Qgc3RyW10gPSBMImhpXDEiOworICB3Y2hhcl90KiBwID0gc3RyOworICBFWFBFQ1RfU1RSRVEoIkxcImhpXFx4MVwiIiwgIC8vIFRoZSBzdHJpbmcgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShwLCA6OnN0ZDo6d3N0cmluZygpKS5jX3N0cigpKTsKK30KKyNlbmRpZgorCisvLyBUZXN0cyBmb3JtYXR0aW5nIGEgY2hhciBhcnJheSB3aGVuIGl0J3MgY29tcGFyZWQgd2l0aCBhIHBvaW50ZXIgb3IgYXJyYXkuCisvLyBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBwcmludCB0aGUgYXJyYXkgYXMgYSByb3cgcG9pbnRlciwgYXMgdGhlIGNvbXBhcmlzb24KKy8vIGlzIGJ5IHBvaW50ZXIuCisKKy8vIGNoYXIgYXJyYXkgdnMgcG9pbnRlcgorVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJBcnJheVZzUG9pbnRlcikgeworICBjaGFyIHN0cltdID0gImhpIFwid29ybGRcIiI7CisgIGNoYXIqIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHN0ciksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCBwKS5jX3N0cigpKTsKK30KKworLy8gY2hhciBhcnJheSB2cyBjaGFyIGFycmF5CitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yQ2hhckFycmF5VnNDaGFyQXJyYXkpIHsKKyAgY29uc3QgY2hhciBzdHJbXSA9ICJoaSBcIndvcmxkXCIiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHN0ciksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCBzdHIpLmNfc3RyKCkpOworfQorCisvLyB3Y2hhcl90IGFycmF5IHZzIHBvaW50ZXIKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JXQ2hhckFycmF5VnNQb2ludGVyKSB7CisgIHdjaGFyX3Qgc3RyW10gPSBMImhpIFwid29ybGRcIiI7CisgIHdjaGFyX3QqIHAgPSBOVUxMOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHN0ciksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCBwKS5jX3N0cigpKTsKK30KKworLy8gd2NoYXJfdCBhcnJheSB2cyB3Y2hhcl90IGFycmF5CitURVNUKEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZVRlc3QsIFdvcmtzRm9yV0NoYXJBcnJheVZzV0NoYXJBcnJheSkgeworICBjb25zdCB3Y2hhcl90IHN0cltdID0gTCJoaSBcIndvcmxkXCIiOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHN0ciksCisgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCBzdHIpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBmb3JtYXR0aW5nIGEgY2hhciBhcnJheSB3aGVuIGl0J3MgY29tcGFyZWQgd2l0aCBhIHN0cmluZyBvYmplY3QuCisvLyBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBwcmludCB0aGUgYXJyYXkgYXMgYSBDIHN0cmluZy4KKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisvLyBjaGFyIGFycmF5IHZzIHN0cmluZworVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJBcnJheVZzU3RyaW5nKSB7CisgIGNvbnN0IGNoYXIgc3RyW10gPSAiaGkgXCJ3XDBybGRcIiI7CisgIEVYUEVDVF9TVFJFUSgiXCJoaSBcXFwid1wiIiwgIC8vIFRoZSBjb250ZW50IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbWJlZGRlZCBOVUwgdGVybWluYXRlcyB0aGUgc3RyaW5nLgorICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHN0ciwgOjpzdHJpbmcoKSkuY19zdHIoKSk7Cit9CisjZW5kaWYKKworLy8gY2hhciBhcnJheSB2cyBzdGQ6OnN0cmluZworVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvckNoYXJBcnJheVZzU3RkU3RyaW5nKSB7CisgIGNvbnN0IGNoYXIgc3RyW10gPSAiaGkgXCJ3b3JsZFwiIjsKKyAgRVhQRUNUX1NUUkVRKCJcImhpIFxcXCJ3b3JsZFxcXCJcIiIsICAvLyBUaGUgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShzdHIsIDo6c3RkOjpzdHJpbmcoKSkuY19zdHIoKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKy8vIHdjaGFyX3QgYXJyYXkgdnMgd3N0cmluZworVEVTVChGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2VUZXN0LCBXb3Jrc0ZvcldDaGFyQXJyYXlWc1dTdHJpbmcpIHsKKyAgY29uc3Qgd2NoYXJfdCBzdHJbXSA9IEwiaGkgXCJ3b3JsZFwiIjsKKyAgRVhQRUNUX1NUUkVRKCJMXCJoaSBcXFwid29ybGRcXFwiXCIiLCAgLy8gVGhlIGNvbnRlbnQgc2hvdWxkIGJlIGVzY2FwZWQuCisgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCA6OndzdHJpbmcoKSkuY19zdHIoKSk7Cit9CisjZW5kaWYKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gd2NoYXJfdCBhcnJheSB2cyBzdGQ6OndzdHJpbmcKK1RFU1QoRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlVGVzdCwgV29ya3NGb3JXQ2hhckFycmF5VnNTdGRXU3RyaW5nKSB7CisgIGNvbnN0IHdjaGFyX3Qgc3RyW10gPSBMImhpIFwid1wwcmxkXCIiOworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiTFwiaGkgXFxcIndcIiIsICAvLyBUaGUgY29udGVudCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtYmVkZGVkIE5VTCB0ZXJtaW5hdGVzIHRoZSBzdHJpbmcuCisgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2Uoc3RyLCA6OnN0ZDo6d3N0cmluZygpKS5jX3N0cigpKTsKK30KKyNlbmRpZgorCisvLyBVc2VmdWwgZm9yIHRlc3RpbmcgUHJpbnRUb1N0cmluZygpLiAgV2UgY2Fubm90IHVzZSBFWFBFQ1RfRVEoKQorLy8gdGhlcmUgYXMgaXRzIGltcGxlbWVudGF0aW9uIHVzZXMgUHJpbnRUb1N0cmluZygpLiAgVGhlIGNhbGxlciBtdXN0CisvLyBlbnN1cmUgdGhhdCAndmFsdWUnIGhhcyBubyBzaWRlIGVmZmVjdC4KKyNkZWZpbmUgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18odmFsdWUsIGV4cGVjdGVkX3N0cmluZykgICAgICAgICBcCisgIEVYUEVDVF9UUlVFKFByaW50VG9TdHJpbmcodmFsdWUpID09IChleHBlY3RlZF9zdHJpbmcpKSAgICAgICAgXAorICAgICAgPDwgIiB3aGVyZSAiICN2YWx1ZSAiIHByaW50cyBhcyAiIDw8IChQcmludFRvU3RyaW5nKHZhbHVlKSkKKworVEVTVChQcmludFRvU3RyaW5nVGVzdCwgV29ya3NGb3JTY2FsYXIpIHsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18oMTIzLCAiMTIzIik7Cit9CisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yUG9pbnRlclRvQ29uc3RDaGFyKSB7CisgIGNvbnN0IGNoYXIqIHAgPSAiaGVsbG8iOworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhwLCAiXCJoZWxsb1wiIik7Cit9CisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIFdvcmtzRm9yUG9pbnRlclRvTm9uQ29uc3RDaGFyKSB7CisgIGNoYXIgc1tdID0gImhlbGxvIjsKKyAgY2hhciogcCA9IHM7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHAsICJcImhlbGxvXCIiKTsKK30KKworVEVTVChQcmludFRvU3RyaW5nVGVzdCwgRXNjYXBlc0ZvclBvaW50ZXJUb0NvbnN0Q2hhcikgeworICBjb25zdCBjaGFyKiBwID0gImhlbGxvXG4iOworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhwLCAiXCJoZWxsb1xcblwiIik7Cit9CisKK1RFU1QoUHJpbnRUb1N0cmluZ1Rlc3QsIEVzY2FwZXNGb3JQb2ludGVyVG9Ob25Db25zdENoYXIpIHsKKyAgY2hhciBzW10gPSAiaGVsbG9cMSI7CisgIGNoYXIqIHAgPSBzOworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhwLCAiXCJoZWxsb1xceDFcIiIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvckFycmF5KSB7CisgIGludCBuWzNdID0geyAxLCAyLCAzIH07CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKG4sICJ7IDEsIDIsIDMgfSIpOworfQorCitURVNUKFByaW50VG9TdHJpbmdUZXN0LCBXb3Jrc0ZvckNoYXJBcnJheSkgeworICBjaGFyIHNbXSA9ICJoZWxsbyI7CisgIEVYUEVDVF9QUklOVF9UT19TVFJJTkdfKHMsICJcImhlbGxvXCIiKTsKK30KKworVEVTVChQcmludFRvU3RyaW5nVGVzdCwgV29ya3NGb3JDaGFyQXJyYXlXaXRoRW1iZWRkZWROdWwpIHsKKyAgY29uc3QgY2hhciBzdHJfd2l0aF9udWxbXSA9ICJoZWxsb1wwIHdvcmxkIjsKKyAgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18oc3RyX3dpdGhfbnVsLCAiXCJoZWxsb1xcMCB3b3JsZFwiIik7CisKKyAgY2hhciBtdXRhYmxlX3N0cl93aXRoX251bFtdID0gImhlbGxvXDAgd29ybGQiOworICBFWFBFQ1RfUFJJTlRfVE9fU1RSSU5HXyhtdXRhYmxlX3N0cl93aXRoX251bCwgIlwiaGVsbG9cXDAgd29ybGRcIiIpOworfQorCisjdW5kZWYgRVhQRUNUX1BSSU5UX1RPX1NUUklOR18KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VGVzdCwgV29ya3NGb3JOb25SZWZlcmVuY2UpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgVW5pdmVyc2FsVGVyc2VQcmludCgxMjMsICZzcyk7CisgIEVYUEVDVF9FUSgiMTIzIiwgc3Muc3RyKCkpOworfQorCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUZXN0LCBXb3Jrc0ZvclJlZmVyZW5jZSkgeworICBjb25zdCBpbnQmIG4gPSAxMjM7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIFVuaXZlcnNhbFRlcnNlUHJpbnQobiwgJnNzKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBzcy5zdHIoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFRlc3QsIFdvcmtzRm9yQ1N0cmluZykgeworICBjb25zdCBjaGFyKiBzMSA9ICJhYmMiOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMTsKKyAgVW5pdmVyc2FsVGVyc2VQcmludChzMSwgJnNzMSk7CisgIEVYUEVDVF9FUSgiXCJhYmNcIiIsIHNzMS5zdHIoKSk7CisKKyAgY2hhciogczIgPSBjb25zdF9jYXN0PGNoYXIqPihzMSk7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MyOworICBVbml2ZXJzYWxUZXJzZVByaW50KHMyLCAmc3MyKTsKKyAgRVhQRUNUX0VRKCJcImFiY1wiIiwgc3MyLnN0cigpKTsKKworICBjb25zdCBjaGFyKiBzMyA9IE5VTEw7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MzOworICBVbml2ZXJzYWxUZXJzZVByaW50KHMzLCAmc3MzKTsKKyAgRVhQRUNUX0VRKCJOVUxMIiwgc3MzLnN0cigpKTsKK30KKworVEVTVChVbml2ZXJzYWxQcmludFRlc3QsIFdvcmtzRm9yTm9uUmVmZXJlbmNlKSB7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIFVuaXZlcnNhbFByaW50KDEyMywgJnNzKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBzcy5zdHIoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsUHJpbnRUZXN0LCBXb3Jrc0ZvclJlZmVyZW5jZSkgeworICBjb25zdCBpbnQmIG4gPSAxMjM7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIFVuaXZlcnNhbFByaW50KG4sICZzcyk7CisgIEVYUEVDVF9FUSgiMTIzIiwgc3Muc3RyKCkpOworfQorCitURVNUKFVuaXZlcnNhbFByaW50VGVzdCwgV29ya3NGb3JDU3RyaW5nKSB7CisgIGNvbnN0IGNoYXIqIHMxID0gImFiYyI7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MxOworICBVbml2ZXJzYWxQcmludChzMSwgJnNzMSk7CisgIEVYUEVDVF9FUShQcmludFBvaW50ZXIoczEpICsgIiBwb2ludGluZyB0byBcImFiY1wiIiwgc3RyaW5nKHNzMS5zdHIoKSkpOworCisgIGNoYXIqIHMyID0gY29uc3RfY2FzdDxjaGFyKj4oczEpOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMjsKKyAgVW5pdmVyc2FsUHJpbnQoczIsICZzczIpOworICBFWFBFQ1RfRVEoUHJpbnRQb2ludGVyKHMyKSArICIgcG9pbnRpbmcgdG8gXCJhYmNcIiIsIHN0cmluZyhzczIuc3RyKCkpKTsKKworICBjb25zdCBjaGFyKiBzMyA9IE5VTEw7CisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3MzOworICBVbml2ZXJzYWxQcmludChzMywgJnNzMyk7CisgIEVYUEVDVF9FUSgiTlVMTCIsIHNzMy5zdHIoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsUHJpbnRUZXN0LCBXb3Jrc0ZvckNoYXJBcnJheSkgeworICBjb25zdCBjaGFyIHN0cltdID0gIlwiTGluZVwwIDFcIlxuTGluZSAyIjsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczE7CisgIFVuaXZlcnNhbFByaW50KHN0ciwgJnNzMSk7CisgIEVYUEVDVF9FUSgiXCJcXFwiTGluZVxcMCAxXFxcIlxcbkxpbmUgMlwiIiwgc3MxLnN0cigpKTsKKworICBjb25zdCBjaGFyIG11dGFibGVfc3RyW10gPSAiXCJMaW5lXDAgMVwiXG5MaW5lIDIiOworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzMjsKKyAgVW5pdmVyc2FsUHJpbnQobXV0YWJsZV9zdHIsICZzczIpOworICBFWFBFQ1RfRVEoIlwiXFxcIkxpbmVcXDAgMVxcXCJcXG5MaW5lIDJcIiIsIHNzMi5zdHIoKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdFdpdGhUcjEsIFByaW50c0VtcHR5VHVwbGUpIHsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCisgICAgICA6OnN0ZDo6dHIxOjptYWtlX3R1cGxlKCkpOworICBFWFBFQ1RfRVEoMHUsIHJlc3VsdC5zaXplKCkpOworfQorCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5nc1Rlc3RXaXRoVHIxLCBQcmludHNPbmVUdXBsZSkgeworICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygKKyAgICAgIDo6c3RkOjp0cjE6Om1ha2VfdHVwbGUoMSkpOworICBBU1NFUlRfRVEoMXUsIHJlc3VsdC5zaXplKCkpOworICBFWFBFQ1RfRVEoIjEiLCByZXN1bHRbMF0pOworfQorCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5nc1Rlc3RXaXRoVHIxLCBQcmludHNUd29UdXBsZSkgeworICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygKKyAgICAgIDo6c3RkOjp0cjE6Om1ha2VfdHVwbGUoMSwgJ2EnKSk7CisgIEFTU0VSVF9FUSgydSwgcmVzdWx0LnNpemUoKSk7CisgIEVYUEVDVF9FUSgiMSIsIHJlc3VsdFswXSk7CisgIEVYUEVDVF9FUSgiJ2EnICg5NywgMHg2MSkiLCByZXN1bHRbMV0pOworfQorCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5nc1Rlc3RXaXRoVHIxLCBQcmludHNUZXJzZWx5KSB7CisgIGNvbnN0IGludCBuID0gMTsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCisgICAgICA6OnN0ZDo6dHIxOjp0dXBsZTxjb25zdCBpbnQmLCBjb25zdCBjaGFyKj4obiwgImEiKSk7CisgIEFTU0VSVF9FUSgydSwgcmVzdWx0LnNpemUoKSk7CisgIEVYUEVDVF9FUSgiMSIsIHJlc3VsdFswXSk7CisgIEVYUEVDVF9FUSgiXCJhXCIiLCByZXN1bHRbMV0pOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworI2lmIEdURVNUX0hBU19TVERfVFVQTEVfCisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdFdpdGhTdGQsIFByaW50c0VtcHR5VHVwbGUpIHsKKyAgU3RyaW5ncyByZXN1bHQgPSBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoOjpzdGQ6Om1ha2VfdHVwbGUoKSk7CisgIEVYUEVDVF9FUSgwdSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK1RFU1QoVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzVGVzdFdpdGhTdGQsIFByaW50c09uZVR1cGxlKSB7CisgIFN0cmluZ3MgcmVzdWx0ID0gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAorICAgICAgOjpzdGQ6Om1ha2VfdHVwbGUoMSkpOworICBBU1NFUlRfRVEoMXUsIHJlc3VsdC5zaXplKCkpOworICBFWFBFQ1RfRVEoIjEiLCByZXN1bHRbMF0pOworfQorCitURVNUKFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5nc1Rlc3RXaXRoU3RkLCBQcmludHNUd29UdXBsZSkgeworICBTdHJpbmdzIHJlc3VsdCA9IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygKKyAgICAgIDo6c3RkOjptYWtlX3R1cGxlKDEsICdhJykpOworICBBU1NFUlRfRVEoMnUsIHJlc3VsdC5zaXplKCkpOworICBFWFBFQ1RfRVEoIjEiLCByZXN1bHRbMF0pOworICBFWFBFQ1RfRVEoIidhJyAoOTcsIDB4NjEpIiwgcmVzdWx0WzFdKTsKK30KKworVEVTVChVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3NUZXN0V2l0aFN0ZCwgUHJpbnRzVGVyc2VseSkgeworICBjb25zdCBpbnQgbiA9IDE7CisgIFN0cmluZ3MgcmVzdWx0ID0gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAorICAgICAgOjpzdGQ6OnR1cGxlPGNvbnN0IGludCYsIGNvbnN0IGNoYXIqPihuLCAiYSIpKTsKKyAgQVNTRVJUX0VRKDJ1LCByZXN1bHQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCIxIiwgcmVzdWx0WzBdKTsKKyAgRVhQRUNUX0VRKCJcImFcIiIsIHJlc3VsdFsxXSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9UVVBMRV8KKworfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X3ByaW50ZXJzX3Rlc3QKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4YmE5MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjCkBAIC0wLDAgKzEsMjA4IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyB0ZXN0aW5nOjpNZXNzYWdlOwordXNpbmcgdGVzdGluZzo6VGVzdDsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheTsKKworbmFtZXNwYWNlIHsKKworLy8gVGVzdHMgdGhlIFRlc3RQYXJ0UmVzdWx0IGNsYXNzLgorCisvLyBUaGUgdGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIFRlc3RQYXJ0UmVzdWx0LgorY2xhc3MgVGVzdFBhcnRSZXN1bHRUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgVGVzdFBhcnRSZXN1bHRUZXN0KCkKKyAgICAgIDogcjFfKFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcywgImZvby9iYXIuY2MiLCAxMCwgIlN1Y2Nlc3MhIiksCisgICAgICAgIHIyXyhUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgImZvby9iYXIuY2MiLCAtMSwgIkZhaWx1cmUhIiksCisgICAgICAgIHIzXyhUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgTlVMTCwgLTEsICJGYWlsdXJlISIpIHt9CisKKyAgVGVzdFBhcnRSZXN1bHQgcjFfLCByMl8sIHIzXzsKK307CisKKworVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgQ29uc3RydWN0b3JXb3JrcykgeworICBNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UgPDwgInNvbWV0aGluZyBpcyB0ZXJyaWJseSB3cm9uZyI7CisgIG1lc3NhZ2UgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHRlc3Rpbmc6OmludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlcik7CisgIG1lc3NhZ2UgPDwgInNvbWUgdW5pbXBvcnRhbnQgc3RhY2sgdHJhY2UiOworCisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHJlc3VsdChUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb21lX2ZpbGUuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOworCisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgcmVzdWx0LnR5cGUoKSk7CisgIEVYUEVDVF9TVFJFUSgic29tZV9maWxlLmNjIiwgcmVzdWx0LmZpbGVfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKDQyLCByZXN1bHQubGluZV9udW1iZXIoKSk7CisgIEVYUEVDVF9TVFJFUShtZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCksIHJlc3VsdC5tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoInNvbWV0aGluZyBpcyB0ZXJyaWJseSB3cm9uZyIsIHJlc3VsdC5zdW1tYXJ5KCkpOworfQorCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBSZXN1bHRBY2Nlc3NvcnNXb3JrKSB7CisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHN1Y2Nlc3MoVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlLmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIpOworICBFWFBFQ1RfVFJVRShzdWNjZXNzLnBhc3NlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3MuZmFpbGVkKCkpOworICBFWFBFQ1RfRkFMU0Uoc3VjY2Vzcy5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Y2Nlc3MuZmF0YWxseV9mYWlsZWQoKSk7CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQgbm9uZmF0YWxfZmFpbHVyZShUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiKTsKKyAgRVhQRUNUX0ZBTFNFKG5vbmZhdGFsX2ZhaWx1cmUucGFzc2VkKCkpOworICBFWFBFQ1RfVFJVRShub25mYXRhbF9mYWlsdXJlLmZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUobm9uZmF0YWxfZmFpbHVyZS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG5vbmZhdGFsX2ZhaWx1cmUuZmF0YWxseV9mYWlsZWQoKSk7CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQgZmF0YWxfZmFpbHVyZShUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiKTsKKyAgRVhQRUNUX0ZBTFNFKGZhdGFsX2ZhaWx1cmUucGFzc2VkKCkpOworICBFWFBFQ1RfVFJVRShmYXRhbF9mYWlsdXJlLmZhaWxlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGZhdGFsX2ZhaWx1cmUubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKGZhdGFsX2ZhaWx1cmUuZmF0YWxseV9mYWlsZWQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0Ojp0eXBlKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCB0eXBlKSB7CisgIEVYUEVDVF9FUShUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MsIHIxXy50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIHIyXy50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIHIzXy50eXBlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6ZmlsZV9uYW1lKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBmaWxlX25hbWUpIHsKKyAgRVhQRUNUX1NUUkVRKCJmb28vYmFyLmNjIiwgcjFfLmZpbGVfbmFtZSgpKTsKKyAgRVhQRUNUX1NUUkVRKE5VTEwsIHIzXy5maWxlX25hbWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpsaW5lX251bWJlcigpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgbGluZV9udW1iZXIpIHsKKyAgRVhQRUNUX0VRKDEwLCByMV8ubGluZV9udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgtMSwgcjJfLmxpbmVfbnVtYmVyKCkpOworfQorCisvLyBUZXN0cyBUZXN0UGFydFJlc3VsdDo6bWVzc2FnZSgpLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0VGVzdCwgbWVzc2FnZSkgeworICBFWFBFQ1RfU1RSRVEoIlN1Y2Nlc3MhIiwgcjFfLm1lc3NhZ2UoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpwYXNzZWQoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIFBhc3NlZCkgeworICBFWFBFQ1RfVFJVRShyMV8ucGFzc2VkKCkpOworICBFWFBFQ1RfRkFMU0UocjJfLnBhc3NlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHIzXy5wYXNzZWQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RQYXJ0UmVzdWx0OjpmYWlsZWQoKS4KK1RFU1RfRihUZXN0UGFydFJlc3VsdFRlc3QsIEZhaWxlZCkgeworICBFWFBFQ1RfRkFMU0UocjFfLmZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocjJfLmZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocjNfLmZhaWxlZCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6OmZhdGFsbHlfZmFpbGVkKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBGYXRhbGx5RmFpbGVkKSB7CisgIEVYUEVDVF9GQUxTRShyMV8uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9GQUxTRShyMl8uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHIzXy5mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFBhcnRSZXN1bHQ6Om5vbmZhdGFsbHlfZmFpbGVkKCkuCitURVNUX0YoVGVzdFBhcnRSZXN1bHRUZXN0LCBOb25mYXRhbGx5RmFpbGVkKSB7CisgIEVYUEVDVF9GQUxTRShyMV8ubm9uZmF0YWxseV9mYWlsZWQoKSk7CisgIEVYUEVDVF9UUlVFKHIyXy5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHIzXy5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworLy8gVGVzdHMgdGhlIFRlc3RQYXJ0UmVzdWx0QXJyYXkgY2xhc3MuCisKK2NsYXNzIFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgVGVzdFBhcnRSZXN1bHRBcnJheVRlc3QoKQorICAgICAgOiByMV8oVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsICJmb28vYmFyLmNjIiwgLTEsICJGYWlsdXJlIDEiKSwKKyAgICAgICAgcjJfKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAiZm9vL2Jhci5jYyIsIC0xLCAiRmFpbHVyZSAyIikge30KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCByMV8sIHIyXzsKK307CisKKy8vIFRlc3RzIHRoYXQgVGVzdFBhcnRSZXN1bHRBcnJheSBpbml0aWFsbHkgaGFzIHNpemUgMC4KK1RFU1RfRihUZXN0UGFydFJlc3VsdEFycmF5VGVzdCwgSW5pdGlhbFNpemVJc1plcm8pIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOworICBFWFBFQ1RfRVEoMCwgcmVzdWx0cy5zaXplKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFRlc3RQYXJ0UmVzdWx0QXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0CisvLyBhZnRlciBvbmUgQXBwZW5kKCkgb3BlcmF0aW9uLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0LCBDb250YWluc0dpdmVuUmVzdWx0QWZ0ZXJBcHBlbmQpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOworICByZXN1bHRzLkFwcGVuZChyMV8pOworICBFWFBFQ1RfRVEoMSwgcmVzdWx0cy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIkZhaWx1cmUgMSIsIHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIHRoZSBnaXZlbiBUZXN0UGFydFJlc3VsdHMKKy8vIGFmdGVyIHR3byBBcHBlbmQoKSBvcGVyYXRpb25zLgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0QXJyYXlUZXN0LCBDb250YWluc0dpdmVuUmVzdWx0c0FmdGVyVHdvQXBwZW5kcykgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHJlc3VsdHMuQXBwZW5kKHIxXyk7CisgIHJlc3VsdHMuQXBwZW5kKHIyXyk7CisgIEVYUEVDVF9FUSgyLCByZXN1bHRzLnNpemUoKSk7CisgIEVYUEVDVF9TVFJFUSgiRmFpbHVyZSAxIiwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoIkZhaWx1cmUgMiIsIHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKK30KKwordHlwZWRlZiBUZXN0UGFydFJlc3VsdEFycmF5VGVzdCBUZXN0UGFydFJlc3VsdEFycmF5RGVhdGhUZXN0OworCisvLyBUZXN0cyB0aGF0IHRoZSBwcm9ncmFtIGRpZXMgd2hlbiBHZXRUZXN0UGFydFJlc3VsdCgpIGlzIGNhbGxlZCB3aXRoCisvLyBhbiBpbnZhbGlkIGluZGV4LgorVEVTVF9GKFRlc3RQYXJ0UmVzdWx0QXJyYXlEZWF0aFRlc3QsIERpZXNXaGVuSW5kZXhJc091dE9mQm91bmQpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSByZXN1bHRzOworICByZXN1bHRzLkFwcGVuZChyMV8pOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgtMSksICIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChyZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLCAiIik7Cit9CisKKy8vIFRPRE8obWhldWxlQGdvb2dsZS5jb20pOiBBZGQgYSB0ZXN0IGZvciB0aGUgY2xhc3MgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyLgorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXR1cGxlX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWEzZTAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC10dXBsZV90ZXN0LmNjCkBAIC0wLDAgKzEsMzIwIEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIDo6c3RkOjp0cjE6OmdldDsKK3VzaW5nIDo6c3RkOjp0cjE6Om1ha2VfdHVwbGU7Cit1c2luZyA6OnN0ZDo6dHIxOjp0dXBsZTsKK3VzaW5nIDo6c3RkOjp0cjE6OnR1cGxlX2VsZW1lbnQ7Cit1c2luZyA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplOwordXNpbmcgOjp0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE7CisKKy8vIFRlc3RzIHRoYXQgdHVwbGVfZWxlbWVudDxLLCB0dXBsZTxUMCwgVDEsIC4uLiwgVE4+ID46OnR5cGUgcmV0dXJucyBUSy4KK1RFU1QodHVwbGVfZWxlbWVudF9UZXN0LCBSZXR1cm5zRWxlbWVudFR5cGUpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGludCwgdHVwbGVfZWxlbWVudDwwLCB0dXBsZTxpbnQsIGNoYXI+ID46OnR5cGU+KCk7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQmLCB0dXBsZV9lbGVtZW50PDEsIHR1cGxlPGRvdWJsZSwgaW50Jj4gPjo6dHlwZT4oKTsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGJvb2wsIHR1cGxlX2VsZW1lbnQ8MiwgdHVwbGU8ZG91YmxlLCBpbnQsIGJvb2w+ID46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdHVwbGVfc2l6ZTxUPjo6dmFsdWUgZ2l2ZXMgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdHVwbGUKKy8vIHR5cGUgVC4KK1RFU1QodHVwbGVfc2l6ZV9UZXN0LCBSZXR1cm5zTnVtYmVyT2ZGaWVsZHMpIHsKKyAgRVhQRUNUX0VRKDAsICt0dXBsZV9zaXplPHR1cGxlPD4gPjo6dmFsdWUpOworICBFWFBFQ1RfRVEoMSwgK3R1cGxlX3NpemU8dHVwbGU8dm9pZCo+ID46OnZhbHVlKTsKKyAgRVhQRUNUX0VRKDEsICt0dXBsZV9zaXplPHR1cGxlPGNoYXI+ID46OnZhbHVlKTsKKyAgRVhQRUNUX0VRKDEsICsodHVwbGVfc2l6ZTx0dXBsZTx0dXBsZTxpbnQsIGRvdWJsZT4gPiA+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRVEoMiwgKyh0dXBsZV9zaXplPHR1cGxlPGludCYsIGNvbnN0IGNoYXI+ID46OnZhbHVlKSk7CisgIEVYUEVDVF9FUSgzLCArKHR1cGxlX3NpemU8dHVwbGU8Y2hhciosIHZvaWQsIGNvbnN0IGJvb2wmPiA+Ojp2YWx1ZSkpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgYSB0dXBsZSB3aXRoIGl0c2VsZi4KK1RFU1QoQ29tcGFyaXNvblRlc3QsIENvbXBhcmVzV2l0aFNlbGYpIHsKKyAgY29uc3QgdHVwbGU8aW50LCBjaGFyLCBib29sPiBhKDUsICdhJywgZmFsc2UpOworCisgIEVYUEVDVF9UUlVFKGEgPT0gYSk7CisgIEVYUEVDVF9GQUxTRShhICE9IGEpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgdHdvIHR1cGxlcyB3aXRoIHRoZSBzYW1lIHZhbHVlLgorVEVTVChDb21wYXJpc29uVGVzdCwgQ29tcGFyZXNFcXVhbFR1cGxlcykgeworICBjb25zdCB0dXBsZTxpbnQsIGJvb2w+IGEoNSwgdHJ1ZSksIGIoNSwgdHJ1ZSk7CisKKyAgRVhQRUNUX1RSVUUoYSA9PSBiKTsKKyAgRVhQRUNUX0ZBTFNFKGEgIT0gYik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyB0d28gZGlmZmVyZW50IHR1cGxlcyB0aGF0IGhhdmUgbm8gcmVmZXJlbmNlIGZpZWxkcy4KK1RFU1QoQ29tcGFyaXNvblRlc3QsIENvbXBhcmVzVW5lcXVhbFR1cGxlc1dpdGhvdXRSZWZlcmVuY2VGaWVsZHMpIHsKKyAgdHlwZWRlZiB0dXBsZTxjb25zdCBpbnQsIGNoYXI+IEZvb1R1cGxlOworCisgIGNvbnN0IEZvb1R1cGxlIGEoMCwgJ3gnKTsKKyAgY29uc3QgRm9vVHVwbGUgYigxLCAnYScpOworCisgIEVYUEVDVF9UUlVFKGEgIT0gYik7CisgIEVYUEVDVF9GQUxTRShhID09IGIpOworCisgIGNvbnN0IEZvb1R1cGxlIGMoMSwgJ2InKTsKKworICBFWFBFQ1RfVFJVRShiICE9IGMpOworICBFWFBFQ1RfRkFMU0UoYiA9PSBjKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIHR3byBkaWZmZXJlbnQgdHVwbGVzIHRoYXQgaGF2ZSByZWZlcmVuY2UgZmllbGRzLgorVEVTVChDb21wYXJpc29uVGVzdCwgQ29tcGFyZXNVbmVxdWFsVHVwbGVzV2l0aFJlZmVyZW5jZUZpZWxkcykgeworICB0eXBlZGVmIHR1cGxlPGludCYsIGNvbnN0IGNoYXImPiBGb29UdXBsZTsKKworICBpbnQgaSA9IDU7CisgIGNvbnN0IGNoYXIgY2ggPSAnYSc7CisgIGNvbnN0IEZvb1R1cGxlIGEoaSwgY2gpOworCisgIGludCBqID0gNjsKKyAgY29uc3QgRm9vVHVwbGUgYihqLCBjaCk7CisKKyAgRVhQRUNUX1RSVUUoYSAhPSBiKTsKKyAgRVhQRUNUX0ZBTFNFKGEgPT0gYik7CisKKyAgaiA9IDU7CisgIGNvbnN0IGNoYXIgY2gyID0gJ2InOworICBjb25zdCBGb29UdXBsZSBjKGosIGNoMik7CisKKyAgRVhQRUNUX1RSVUUoYiAhPSBjKTsKKyAgRVhQRUNUX0ZBTFNFKGIgPT0gYyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSB0dXBsZSBmaWVsZCB3aXRoIGEgcmVmZXJlbmNlIHR5cGUgaXMgYW4gYWxpYXMgb2YgdGhlCisvLyB2YXJpYWJsZSBpdCdzIHN1cHBvc2VkIHRvIHJlZmVyZW5jZS4KK1RFU1QoUmVmZXJlbmNlRmllbGRUZXN0LCBJc0FsaWFzT2ZSZWZlcmVuY2VkVmFyaWFibGUpIHsKKyAgaW50IG4gPSAwOworICB0dXBsZTxib29sLCBpbnQmPiB0KHRydWUsIG4pOworCisgIG4gPSAxOworICBFWFBFQ1RfRVEobiwgZ2V0PDE+KHQpKQorICAgICAgPDwgIkNoYW5naW5nIGEgdW5kZXJseWluZyB2YXJpYWJsZSBzaG91bGQgdXBkYXRlIHRoZSByZWZlcmVuY2UgZmllbGQuIjsKKworICAvLyBNYWtlcyBzdXJlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcgZnVubnkgd2l0aAorICAvLyB0aGUgJiBvcGVyYXRvciBmb3IgdGhlIHJldHVybiB0eXBlIG9mIGdldDw+KCkuCisgIEVYUEVDVF9FUSgmbiwgJihnZXQ8MT4odCkpKQorICAgICAgPDwgIlRoZSBhZGRyZXNzIG9mIGEgcmVmZXJlbmNlIGZpZWxkIHNob3VsZCBlcXVhbCB0aGUgYWRkcmVzcyBvZiAiCisgICAgICA8PCAidGhlIHVuZGVybHlpbmcgdmFyaWFibGUuIjsKKworICBnZXQ8MT4odCkgPSAyOworICBFWFBFQ1RfRVEoMiwgbikKKyAgICAgIDw8ICJDaGFuZ2luZyBhIHJlZmVyZW5jZSBmaWVsZCBzaG91bGQgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHZhcmlhYmxlLiI7Cit9CisKKy8vIFRlc3RzIHRoYXQgdHVwbGUncyBkZWZhdWx0IGNvbnN0cnVjdG9yIGRlZmF1bHQgaW5pdGlhbGl6ZXMgZWFjaCBmaWVsZC4KKy8vIFRoaXMgdGVzdCBuZWVkcyB0byBjb21waWxlIHdpdGhvdXQgZ2VuZXJhdGluZyB3YXJuaW5ncy4KK1RFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIERlZmF1bHRDb25zdHJ1Y3RvckRlZmF1bHRJbml0aWFsaXplc0VhY2hGaWVsZCkgeworICAvLyBUaGUgVFIxIHJlcG9ydCByZXF1aXJlcyB0aGF0IHR1cGxlJ3MgZGVmYXVsdCBjb25zdHJ1Y3RvciBkZWZhdWx0CisgIC8vIGluaXRpYWxpemVzIGVhY2ggZmllbGQsIGV2ZW4gaWYgaXQncyBhIHByaW1pdGl2ZSB0eXBlLiAgSWYgdGhlCisgIC8vIGltcGxlbWVudGF0aW9uIGZvcmdldHMgdG8gZG8gdGhpcywgdGhpcyB0ZXN0IHdpbGwgY2F0Y2ggaXQgYnkKKyAgLy8gZ2VuZXJhdGluZyB3YXJuaW5ncyBhYm91dCB1c2luZyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyAoYXNzdW1pbmcKKyAgLy8gYSBkZWNlbnQgY29tcGlsZXIpLgorCisgIHR1cGxlPD4gZW1wdHk7CisKKyAgdHVwbGU8aW50PiBhMSwgYjE7CisgIGIxID0gYTE7CisgIEVYUEVDVF9FUSgwLCBnZXQ8MD4oYjEpKTsKKworICB0dXBsZTxpbnQsIGRvdWJsZT4gYTIsIGIyOworICBiMiA9IGEyOworICBFWFBFQ1RfRVEoMCwgZ2V0PDA+KGIyKSk7CisgIEVYUEVDVF9FUSgwLjAsIGdldDwxPihiMikpOworCisgIHR1cGxlPGRvdWJsZSwgY2hhciwgYm9vbCo+IGEzLCBiMzsKKyAgYjMgPSBhMzsKKyAgRVhQRUNUX0VRKDAuMCwgZ2V0PDA+KGIzKSk7CisgIEVYUEVDVF9FUSgnXDAnLCBnZXQ8MT4oYjMpKTsKKyAgRVhQRUNUX1RSVUUoZ2V0PDI+KGIzKSA9PSBOVUxMKTsKKworICB0dXBsZTxpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQ+IGExMCwgYjEwOworICBiMTAgPSBhMTA7CisgIEVYUEVDVF9FUSgwLCBnZXQ8MD4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8MT4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8Mj4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8Mz4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8ND4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8NT4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8Nj4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8Nz4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8OD4oYjEwKSk7CisgIEVYUEVDVF9FUSgwLCBnZXQ8OT4oYjEwKSk7Cit9CisKKy8vIFRlc3RzIGNvbnN0cnVjdGluZyBhIHR1cGxlIGZyb20gaXRzIGZpZWxkcy4KK1RFU1QoVHVwbGVDb25zdHJ1Y3RvclRlc3QsIENvbnN0cnVjdHNGcm9tRmllbGRzKSB7CisgIGludCBuID0gMTsKKyAgLy8gUmVmZXJlbmNlIGZpZWxkLgorICB0dXBsZTxpbnQmPiBhKG4pOworICBFWFBFQ1RfRVEoJm4sICYoZ2V0PDA+KGEpKSk7CisKKyAgLy8gTm9uLXJlZmVyZW5jZSBmaWVsZHMuCisgIHR1cGxlPGludCwgY2hhcj4gYig1LCAnYScpOworICBFWFBFQ1RfRVEoNSwgZ2V0PDA+KGIpKTsKKyAgRVhQRUNUX0VRKCdhJywgZ2V0PDE+KGIpKTsKKworICAvLyBDb25zdCByZWZlcmVuY2UgZmllbGQuCisgIGNvbnN0IGludCBtID0gMjsKKyAgdHVwbGU8Ym9vbCwgY29uc3QgaW50Jj4gYyh0cnVlLCBtKTsKKyAgRVhQRUNUX1RSVUUoZ2V0PDA+KGMpKTsKKyAgRVhQRUNUX0VRKCZtLCAmKGdldDwxPihjKSkpOworfQorCisvLyBUZXN0cyB0dXBsZSdzIGNvcHkgY29uc3RydWN0b3IuCitURVNUKFR1cGxlQ29uc3RydWN0b3JUZXN0LCBDb3B5Q29uc3RydWN0b3IpIHsKKyAgdHVwbGU8ZG91YmxlLCBib29sPiBhKDAuMCwgdHJ1ZSk7CisgIHR1cGxlPGRvdWJsZSwgYm9vbD4gYihhKTsKKworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgZ2V0PDA+KGIpKTsKKyAgRVhQRUNUX1RSVUUoZ2V0PDE+KGIpKTsKK30KKworLy8gVGVzdHMgY29uc3RydWN0aW5nIGEgdHVwbGUgZnJvbSBhbm90aGVyIHR1cGxlIHRoYXQgaGFzIGEgY29tcGF0aWJsZQorLy8gYnV0IGRpZmZlcmVudCB0eXBlLgorVEVTVChUdXBsZUNvbnN0cnVjdG9yVGVzdCwgQ29uc3RydWN0c0Zyb21EaWZmZXJlbnRUdXBsZVR5cGUpIHsKKyAgdHVwbGU8aW50LCBpbnQsIGNoYXI+IGEoMCwgMSwgJ2EnKTsKKyAgdHVwbGU8ZG91YmxlLCBsb25nLCBpbnQ+IGIoYSk7CisKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIGdldDwwPihiKSk7CisgIEVYUEVDVF9FUSgxLCBnZXQ8MT4oYikpOworICBFWFBFQ1RfRVEoJ2EnLCBnZXQ8Mj4oYikpOworfQorCisvLyBUZXN0cyBjb25zdHJ1Y3RpbmcgYSAyLXR1cGxlIGZyb20gYW4gc3RkOjpwYWlyLgorVEVTVChUdXBsZUNvbnN0cnVjdG9yVGVzdCwgQ29uc3RydWN0c0Zyb21QYWlyKSB7CisgIDo6c3RkOjpwYWlyPGludCwgY2hhcj4gYSgxLCAnYScpOworICB0dXBsZTxpbnQsIGNoYXI+IGIoYSk7CisgIHR1cGxlPGludCwgY29uc3QgY2hhciY+IGMoYSk7Cit9CisKKy8vIFRlc3RzIGFzc2lnbmluZyBhIHR1cGxlIHRvIGFub3RoZXIgdHVwbGUgd2l0aCB0aGUgc2FtZSB0eXBlLgorVEVTVChUdXBsZUFzc2lnbm1lbnRUZXN0LCBBc3NpZ25zVG9TYW1lVHVwbGVUeXBlKSB7CisgIGNvbnN0IHR1cGxlPGludCwgbG9uZz4gYSg1LCA3TCk7CisgIHR1cGxlPGludCwgbG9uZz4gYjsKKyAgYiA9IGE7CisgIEVYUEVDVF9FUSg1LCBnZXQ8MD4oYikpOworICBFWFBFQ1RfRVEoN0wsIGdldDwxPihiKSk7Cit9CisKKy8vIFRlc3RzIGFzc2lnbmluZyBhIHR1cGxlIHRvIGFub3RoZXIgdHVwbGUgd2l0aCBhIGRpZmZlcmVudCBidXQKKy8vIGNvbXBhdGlibGUgdHlwZS4KK1RFU1QoVHVwbGVBc3NpZ25tZW50VGVzdCwgQXNzaWduc1RvRGlmZmVyZW50VHVwbGVUeXBlKSB7CisgIGNvbnN0IHR1cGxlPGludCwgbG9uZywgYm9vbD4gYSgxLCA3TCwgdHJ1ZSk7CisgIHR1cGxlPGxvbmcsIGludCwgYm9vbD4gYjsKKyAgYiA9IGE7CisgIEVYUEVDVF9FUSgxTCwgZ2V0PDA+KGIpKTsKKyAgRVhQRUNUX0VRKDcsIGdldDwxPihiKSk7CisgIEVYUEVDVF9UUlVFKGdldDwyPihiKSk7Cit9CisKKy8vIFRlc3RzIGFzc2lnbmluZyBhbiBzdGQ6OnBhaXIgdG8gYSAyLXR1cGxlLgorVEVTVChUdXBsZUFzc2lnbm1lbnRUZXN0LCBBc3NpZ25zRnJvbVBhaXIpIHsKKyAgY29uc3QgOjpzdGQ6OnBhaXI8aW50LCBib29sPiBhKDUsIHRydWUpOworICB0dXBsZTxpbnQsIGJvb2w+IGI7CisgIGIgPSBhOworICBFWFBFQ1RfRVEoNSwgZ2V0PDA+KGIpKTsKKyAgRVhQRUNUX1RSVUUoZ2V0PDE+KGIpKTsKKworICB0dXBsZTxsb25nLCBib29sPiBjOworICBjID0gYTsKKyAgRVhQRUNUX0VRKDVMLCBnZXQ8MD4oYykpOworICBFWFBFQ1RfVFJVRShnZXQ8MT4oYykpOworfQorCisvLyBBIGZpeHR1cmUgZm9yIHRlc3RpbmcgYmlnIHR1cGxlcy4KK2NsYXNzIEJpZ1R1cGxlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdHVwbGU8aW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PiBCaWdUdXBsZTsKKworICBCaWdUdXBsZVRlc3QoKSA6CisgICAgICBhXygxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyKSwKKyAgICAgIGJfKDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMpIHt9CisKKyAgQmlnVHVwbGUgYV8sIGJfOworfTsKKworLy8gVGVzdHMgY29uc3RydWN0aW5nIGJpZyB0dXBsZXMuCitURVNUX0YoQmlnVHVwbGVUZXN0LCBDb25zdHJ1Y3Rpb24pIHsKKyAgQmlnVHVwbGUgYTsKKyAgQmlnVHVwbGUgYihiXyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZ2V0PE4+KHQpIHJldHVybnMgdGhlIE4tdGggKDAtYmFzZWQpIGZpZWxkIG9mIHR1cGxlIHQuCitURVNUX0YoQmlnVHVwbGVUZXN0LCBnZXQpIHsKKyAgRVhQRUNUX0VRKDEsIGdldDwwPihhXykpOworICBFWFBFQ1RfRVEoMiwgZ2V0PDk+KGFfKSk7CisKKyAgLy8gVGVzdHMgdGhhdCBnZXQoKSB3b3JrcyBvbiBhIGNvbnN0IHR1cGxlIHRvby4KKyAgY29uc3QgQmlnVHVwbGUgYShhXyk7CisgIEVYUEVDVF9FUSgxLCBnZXQ8MD4oYSkpOworICBFWFBFQ1RfRVEoMiwgZ2V0PDk+KGEpKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIGJpZyB0dXBsZXMuCitURVNUX0YoQmlnVHVwbGVUZXN0LCBDb21wYXJpc29ucykgeworICBFWFBFQ1RfVFJVRShhXyA9PSBhXyk7CisgIEVYUEVDVF9GQUxTRShhXyAhPSBhXyk7CisKKyAgRVhQRUNUX1RSVUUoYV8gIT0gYl8pOworICBFWFBFQ1RfRkFMU0UoYV8gPT0gYl8pOworfQorCitURVNUKE1ha2VUdXBsZVRlc3QsIFdvcmtzRm9yU2NhbGFyVHlwZXMpIHsKKyAgdHVwbGU8Ym9vbCwgaW50PiBhOworICBhID0gbWFrZV90dXBsZSh0cnVlLCA1KTsKKyAgRVhQRUNUX1RSVUUoZ2V0PDA+KGEpKTsKKyAgRVhQRUNUX0VRKDUsIGdldDwxPihhKSk7CisKKyAgdHVwbGU8Y2hhciwgaW50LCBsb25nPiBiOworICBiID0gbWFrZV90dXBsZSgnYScsICdiJywgNSk7CisgIEVYUEVDVF9FUSgnYScsIGdldDwwPihiKSk7CisgIEVYUEVDVF9FUSgnYicsIGdldDwxPihiKSk7CisgIEVYUEVDVF9FUSg1LCBnZXQ8Mj4oYikpOworfQorCitURVNUKE1ha2VUdXBsZVRlc3QsIFdvcmtzRm9yUG9pbnRlcnMpIHsKKyAgaW50IGFbXSA9IHsgMSwgMiwgMywgNCB9OworICBjb25zdCBjaGFyKiBjb25zdCBzdHIgPSAiaGkiOworICBpbnQqIGNvbnN0IHAgPSBhOworCisgIHR1cGxlPGNvbnN0IGNoYXIqLCBpbnQqPiB0OworICB0ID0gbWFrZV90dXBsZShzdHIsIHApOworICBFWFBFQ1RfRVEoc3RyLCBnZXQ8MD4odCkpOworICBFWFBFQ1RfRVEocCwgZ2V0PDE+KHQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC10eXBlZC10ZXN0Ml90ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg0NzAwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYwpAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIFRlc3RzIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgorLy8gKENvbnRhaW5lclRlc3QgaXMgYWxzbyBpbnN0YW50aWF0ZWQgaW4gZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjLikKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFZlY3RvciwgQ29udGFpbmVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlR5cGVzPHN0ZDo6dmVjdG9yPGludD4gPik7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjI4YmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuY2MKQEAgLTAsMCArMSwzODAgQEAKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmgiCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgdGVzdGluZzo6VGVzdDsKKworLy8gVXNlZCBmb3IgdGVzdGluZyB0aGF0IFNldFVwVGVzdENhc2UoKS9UZWFyRG93blRlc3RDYXNlKCksIGZpeHR1cmUKKy8vIGN0b3IvZHRvciwgYW5kIFNldFVwKCkvVGVhckRvd24oKSB3b3JrIGNvcnJlY3RseSBpbiB0eXBlZCB0ZXN0cyBhbmQKKy8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDb21tb25UZXN0IDogcHVibGljIFRlc3QgeworICAvLyBGb3Igc29tZSB0ZWNobmljYWwgcmVhc29uLCBTZXRVcFRlc3RDYXNlKCkgYW5kIFRlYXJEb3duVGVzdENhc2UoKQorICAvLyBtdXN0IGJlIHB1YmxpYy4KKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgc2hhcmVkXyA9IG5ldyBUKDUpOworICB9CisKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICBkZWxldGUgc2hhcmVkXzsKKyAgICBzaGFyZWRfID0gTlVMTDsKKyAgfQorCisgIC8vIFRoaXMgJ3Byb3RlY3RlZDonIGlzIG9wdGlvbmFsLiAgVGhlcmUncyBubyBoYXJtIGluIG1ha2luZyBhbGwKKyAgLy8gbWVtYmVycyBvZiB0aGlzIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgcHVibGljLgorIHByb3RlY3RlZDoKKyAgLy8gV2UgdXNlZCB0byB1c2Ugc3RkOjpsaXN0IGhlcmUsIGJ1dCBzd2l0Y2hlZCB0byBzdGQ6OnZlY3RvciBzaW5jZQorICAvLyBNU1ZDJ3MgPGxpc3Q+IGRvZXNuJ3QgY29tcGlsZSBjbGVhbmx5IHdpdGggL1c0LgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFQ+IFZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnNldDxpbnQ+IEludFNldDsKKworICBDb21tb25UZXN0KCkgOiB2YWx1ZV8oMSkge30KKworICB2aXJ0dWFsIH5Db21tb25UZXN0KCkgeyBFWFBFQ1RfRVEoMywgdmFsdWVfKTsgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBFWFBFQ1RfRVEoMSwgdmFsdWVfKTsKKyAgICB2YWx1ZV8rKzsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBFWFBFQ1RfRVEoMiwgdmFsdWVfKTsKKyAgICB2YWx1ZV8rKzsKKyAgfQorCisgIFQgdmFsdWVfOworICBzdGF0aWMgVCogc2hhcmVkXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCogQ29tbW9uVGVzdDxUPjo6c2hhcmVkXyA9IE5VTEw7CisKKy8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHR5cGVkIHRlc3RzLgorI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisKK3VzaW5nIHRlc3Rpbmc6OlR5cGVzOworCisvLyBUZXN0cyB0aGF0IFNldFVwVGVzdENhc2UoKS9UZWFyRG93blRlc3RDYXNlKCksIGZpeHR1cmUgY3Rvci9kdG9yLAorLy8gYW5kIFNldFVwKCkvVGVhckRvd24oKSB3b3JrIGNvcnJlY3RseSBpbiB0eXBlZCB0ZXN0cworCit0eXBlZGVmIFR5cGVzPGNoYXIsIGludD4gVHdvVHlwZXM7CitUWVBFRF9URVNUX0NBU0UoQ29tbW9uVGVzdCwgVHdvVHlwZXMpOworCitUWVBFRF9URVNUKENvbW1vblRlc3QsIFZhbHVlc0FyZUNvcnJlY3QpIHsKKyAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhCisgIC8vIHRoZSBUZXN0Rml4dHVyZTo6IHByZWZpeC4KKyAgRVhQRUNUX0VRKDUsICpUZXN0Rml4dHVyZTo6c2hhcmVkXyk7CisKKyAgLy8gVHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhIHRoZQorICAvLyAidHlwZW5hbWUgVGVzdEZpeHR1cmU6OiIgcHJlZml4LgorICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6VmVjdG9yIGVtcHR5OworICBFWFBFQ1RfRVEoMFUsIGVtcHR5LnNpemUoKSk7CisKKyAgdHlwZW5hbWUgVGVzdEZpeHR1cmU6OkludFNldCBlbXB0eTI7CisgIEVYUEVDVF9FUSgwVSwgZW1wdHkyLnNpemUoKSk7CisKKyAgLy8gTm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzIG11c3QgYmUgdmlzaXRlZCB2aWEKKyAgLy8gJ3RoaXMnLCBhcyByZXF1aXJlZCBieSBDKysgZm9yIGNsYXNzIHRlbXBsYXRlcy4KKyAgRVhQRUNUX0VRKDIsIHRoaXMtPnZhbHVlXyk7Cit9CisKKy8vIFRoZSBzZWNvbmQgdGVzdCBtYWtlcyBzdXJlIHNoYXJlZF8gaXMgbm90IGRlbGV0ZWQgYWZ0ZXIgdGhlIGZpcnN0CisvLyB0ZXN0LgorVFlQRURfVEVTVChDb21tb25UZXN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpIHsKKyAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGFsc28gYmUgdmlzaXRlZAorICAvLyB2aWEgJ3RoaXMnLgorICBBU1NFUlRfVFJVRSh0aGlzLT5zaGFyZWRfICE9IE5VTEwpOworICBFWFBFQ1RfRVEoNSwgKnRoaXMtPnNoYXJlZF8pOworCisgIC8vIFR5cGVQYXJhbSBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgdHlwZSBwYXJhbWV0ZXIuCisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxUeXBlUGFyYW0+KDIpLCB0aGlzLT52YWx1ZV8pOworfQorCisvLyBUZXN0cyB0aGF0IG11bHRpcGxlIFRZUEVEX1RFU1RfQ0FTRSdzIGNhbiBiZSBkZWZpbmVkIGluIHRoZSBzYW1lCisvLyB0cmFuc2xhdGlvbiB1bml0LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdDEgOiBwdWJsaWMgVGVzdCB7Cit9OworCisvLyBWZXJpZmllcyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgVFlQRURfVEVTVF9DQVNFIGNhbiBiZSBhCisvLyBzaW5nbGUgdHlwZS4KK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QxLCBpbnQpOworVFlQRURfVEVTVChUeXBlZFRlc3QxLCBBKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdDIgOiBwdWJsaWMgVGVzdCB7Cit9OworCisvLyBWZXJpZmllcyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgVFlQRURfVEVTVF9DQVNFIGNhbiBiZSBhCisvLyBUeXBlczwuLi4+IHR5cGUgbGlzdC4KK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QyLCBUeXBlczxpbnQ+KTsKKworLy8gVGhpcyBhbHNvIHZlcmlmaWVzIHRoYXQgdGVzdHMgZnJvbSBkaWZmZXJlbnQgdHlwZWQgdGVzdCBjYXNlcyBjYW4KKy8vIHNoYXJlIHRoZSBzYW1lIG5hbWUuCitUWVBFRF9URVNUKFR5cGVkVGVzdDIsIEEpIHt9CisKKy8vIFRlc3RzIHRoYXQgYSB0eXBlZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgaW4gYSBuYW1lc3BhY2UuCisKK25hbWVzcGFjZSBsaWJyYXJ5MSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTnVtZXJpY1Rlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCit0eXBlZGVmIFR5cGVzPGludCwgbG9uZz4gTnVtZXJpY1R5cGVzOworVFlQRURfVEVTVF9DQVNFKE51bWVyaWNUZXN0LCBOdW1lcmljVHlwZXMpOworCitUWVBFRF9URVNUKE51bWVyaWNUZXN0LCBEZWZhdWx0SXNaZXJvKSB7CisgIEVYUEVDVF9FUSgwLCBUeXBlUGFyYW0oKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsaWJyYXJ5MQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK3VzaW5nIHRlc3Rpbmc6OlR5cGVzOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlR5cGVkVGVzdENhc2VQU3RhdGU7CisKKy8vIFRlc3RzIFR5cGVkVGVzdENhc2VQU3RhdGUuCisKK2NsYXNzIFR5cGVkVGVzdENhc2VQU3RhdGVUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQSIpOworICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQiIpOworICAgIHN0YXRlXy5BZGRUZXN0TmFtZSgiZm9vLmNjIiwgMCwgIkZvb1Rlc3QiLCAiQyIpOworICB9CisKKyAgVHlwZWRUZXN0Q2FzZVBTdGF0ZSBzdGF0ZV87Cit9OworCitURVNUX0YoVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QsIFN1Y2NlZWRzRm9yTWF0Y2hpbmdMaXN0KSB7CisgIGNvbnN0IGNoYXIqIHRlc3RzID0gIkEsIEIsIEMiOworICBFWFBFQ1RfRVEodGVzdHMsCisgICAgICAgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgdGVzdHMpKTsKK30KKworLy8gTWFrZXMgc3VyZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgdGVzdHMgYW5kIHNwYWNlcyBhcm91bmQgdGhlIG5hbWVzCisvLyBkb24ndCBtYXR0ZXIuCitURVNUX0YoVHlwZWRUZXN0Q2FzZVBTdGF0ZVRlc3QsIElnbm9yZXNPcmRlckFuZFNwYWNlcykgeworICBjb25zdCBjaGFyKiB0ZXN0cyA9ICJBLEMsICAgQiI7CisgIEVYUEVDVF9FUSh0ZXN0cywKKyAgICAgICAgICAgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCB0ZXN0cykpOworfQorCit0eXBlZGVmIFR5cGVkVGVzdENhc2VQU3RhdGVUZXN0IFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3Q7CisKK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzRHVwbGljYXRlcykgeworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgc3RhdGVfLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoImZvby5jYyIsIDEsICJBLCBCLCBBLCBDIiksCisgICAgICAiZm9vXFwuY2MuMS4/OiBUZXN0IEEgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlXFwuIik7Cit9CisKK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzRXh0cmFUZXN0KSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgIkEsIEIsIEMsIEQiKSwKKyAgICAgICJmb29cXC5jYy4xLj86IE5vIHRlc3QgbmFtZWQgRCBjYW4gYmUgZm91bmQgaW4gdGhpcyB0ZXN0IGNhc2VcXC4iKTsKK30KKworVEVTVF9GKFR5cGVkVGVzdENhc2VQU3RhdGVEZWF0aFRlc3QsIERldGVjdHNNaXNzZWRUZXN0KSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBzdGF0ZV8uVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygiZm9vLmNjIiwgMSwgIkEsIEMiKSwKKyAgICAgICJmb29cXC5jYy4xLj86IFlvdSBmb3Jnb3QgdG8gbGlzdCB0ZXN0IEJcXC4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBkZWZpbmluZyBhIHRlc3QgZm9yIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgZ2VuZXJhdGVzCisvLyBhIHJ1bi10aW1lIGVycm9yIGlmIHRoZSB0ZXN0IGNhc2UgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KK1RFU1RfRihUeXBlZFRlc3RDYXNlUFN0YXRlRGVhdGhUZXN0LCBEZXRlY3RzVGVzdEFmdGVyUmVnaXN0cmF0aW9uKSB7CisgIHN0YXRlXy5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKCJmb28uY2MiLCAxLCAiQSwgQiwgQyIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgc3RhdGVfLkFkZFRlc3ROYW1lKCJmb28uY2MiLCAyLCAiRm9vVGVzdCIsICJEIiksCisgICAgICAiZm9vXFwuY2MuMi4/OiBUZXN0IEQgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCIKKyAgICAgICJcXChGb29UZXN0LCBcXC5cXC5cXC5cXClcXC4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBTZXRVcFRlc3RDYXNlKCkvVGVhckRvd25UZXN0Q2FzZSgpLCBmaXh0dXJlIGN0b3IvZHRvciwKKy8vIGFuZCBTZXRVcCgpL1RlYXJEb3duKCkgd29yayBjb3JyZWN0bHkgaW4gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIERlcml2ZWRUZXN0IDogcHVibGljIENvbW1vblRlc3Q8VD4geworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoRGVyaXZlZFRlc3QpOworCitUWVBFRF9URVNUX1AoRGVyaXZlZFRlc3QsIFZhbHVlc0FyZUNvcnJlY3QpIHsKKyAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHZpc2l0ZWQgdmlhCisgIC8vIHRoZSBUZXN0Rml4dHVyZTo6IHByZWZpeC4KKyAgRVhQRUNUX0VRKDUsICpUZXN0Rml4dHVyZTo6c2hhcmVkXyk7CisKKyAgLy8gTm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlIGNsYXNzIG11c3QgYmUgdmlzaXRlZCB2aWEKKyAgLy8gJ3RoaXMnLCBhcyByZXF1aXJlZCBieSBDKysgZm9yIGNsYXNzIHRlbXBsYXRlcy4KKyAgRVhQRUNUX0VRKDIsIHRoaXMtPnZhbHVlXyk7Cit9CisKKy8vIFRoZSBzZWNvbmQgdGVzdCBtYWtlcyBzdXJlIHNoYXJlZF8gaXMgbm90IGRlbGV0ZWQgYWZ0ZXIgdGhlIGZpcnN0CisvLyB0ZXN0LgorVFlQRURfVEVTVF9QKERlcml2ZWRUZXN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpIHsKKyAgLy8gU3RhdGljIG1lbWJlcnMgb2YgdGhlIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUgY2FuIGFsc28gYmUgdmlzaXRlZAorICAvLyB2aWEgJ3RoaXMnLgorICBBU1NFUlRfVFJVRSh0aGlzLT5zaGFyZWRfICE9IE5VTEwpOworICBFWFBFQ1RfRVEoNSwgKnRoaXMtPnNoYXJlZF8pOworICBFWFBFQ1RfRVEoMiwgdGhpcy0+dmFsdWVfKTsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoRGVyaXZlZFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNBcmVDb3JyZWN0LCBWYWx1ZXNBcmVTdGlsbENvcnJlY3QpOworCit0eXBlZGVmIFR5cGVzPHNob3J0LCBsb25nPiBNeVR3b1R5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIERlcml2ZWRUZXN0LCBNeVR3b1R5cGVzKTsKKworLy8gVGVzdHMgdGhhdCBtdWx0aXBsZSBUWVBFRF9URVNUX0NBU0VfUCdzIGNhbiBiZSBkZWZpbmVkIGluIHRoZSBzYW1lCisvLyB0cmFuc2xhdGlvbiB1bml0LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdFAxIDogcHVibGljIFRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UDEpOworCisvLyBGb3IgdGVzdGluZyB0aGF0IHRoZSBjb2RlIGJldHdlZW4gVFlQRURfVEVTVF9DQVNFX1AoKSBhbmQKKy8vIFRZUEVEX1RFU1RfUCgpIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG5hbWVzcGFjZS4KK3R5cGVkZWYgaW50IEludEFmdGVyVHlwZWRUZXN0Q2FzZVA7CisKK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQMSwgQSkge30KK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQMSwgQikge30KKworLy8gRm9yIHRlc3RpbmcgdGhhdCB0aGUgY29kZSBiZXR3ZWVuIFRZUEVEX1RFU1RfUCgpIGFuZAorLy8gUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoKSBpcyBub3QgZW5jbG9zZWQgaW4gYSBuYW1lc3BhY2UuCit0eXBlZGVmIGludCBJbnRCZWZvcmVSZWdpc3RlclR5cGVkVGVzdENhc2VQOworCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMSwgQSwgQik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0UDIgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQMik7CisKKy8vIFRoaXMgYWxzbyB2ZXJpZmllcyB0aGF0IHRlc3RzIGZyb20gZGlmZmVyZW50IHR5cGUtcGFyYW1ldGVyaXplZAorLy8gdGVzdCBjYXNlcyBjYW4gc2hhcmUgdGhlIHNhbWUgbmFtZS4KK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQMiwgQSkge30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UDIsIEEpOworCisvLyBWZXJpZmllcyB0aGF0IHRoZSBjb2RlIGJldHdlZW4gVFlQRURfVEVTVF9DQVNFX1AoKSBhbmQKKy8vIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKCkgaXMgbm90IGVuY2xvc2VkIGluIGEgbmFtZXNwYWNlLgorSW50QWZ0ZXJUeXBlZFRlc3RDYXNlUCBhZnRlciA9IDA7CitJbnRCZWZvcmVSZWdpc3RlclR5cGVkVGVzdENhc2VQIGJlZm9yZSA9IDA7CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGxhc3QgYXJndW1lbnQgb2YgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoKQorLy8gY2FuIGJlIGVpdGhlciBhIHNpbmdsZSB0eXBlIG9yIGEgVHlwZXM8Li4uPiB0eXBlIGxpc3QuCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChJbnQsIFR5cGVkVGVzdFAxLCBpbnQpOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoSW50LCBUeXBlZFRlc3RQMiwgVHlwZXM8aW50Pik7CisKKy8vIFRlc3RzIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSB0cmFuc2xhdGlvbiB1bml0LgorSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoRG91YmxlLCBUeXBlZFRlc3RQMiwgVHlwZXM8ZG91YmxlPik7CisKKy8vIFRlc3RzIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgorLy8gKENvbnRhaW5lclRlc3QgaXMgYWxzbyBpbnN0YW50aWF0ZWQgaW4gZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjLikKK3R5cGVkZWYgVHlwZXM8c3RkOjp2ZWN0b3I8ZG91YmxlPiwgc3RkOjpzZXQ8Y2hhcj4gPiBNeUNvbnRhaW5lcnM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgQ29udGFpbmVyVGVzdCwgTXlDb250YWluZXJzKTsKKworLy8gVGVzdHMgdGhhdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgY2FuIGJlIGRlZmluZWQgYW5kCisvLyBpbnN0YW50aWF0ZWQgaW4gYSBuYW1lc3BhY2UuCisKK25hbWVzcGFjZSBsaWJyYXJ5MiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTnVtZXJpY1Rlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChOdW1lcmljVGVzdCk7CisKK1RZUEVEX1RFU1RfUChOdW1lcmljVGVzdCwgRGVmYXVsdElzWmVybykgeworICBFWFBFQ1RfRVEoMCwgVHlwZVBhcmFtKCkpOworfQorCitUWVBFRF9URVNUX1AoTnVtZXJpY1Rlc3QsIFplcm9Jc0xlc3NUaGFuT25lKSB7CisgIEVYUEVDVF9MVChUeXBlUGFyYW0oMCksIFR5cGVQYXJhbSgxKSk7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKE51bWVyaWNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElzWmVybywgWmVyb0lzTGVzc1RoYW5PbmUpOwordHlwZWRlZiBUeXBlczxpbnQsIGRvdWJsZT4gTnVtZXJpY1R5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIE51bWVyaWNUZXN0LCBOdW1lcmljVHlwZXMpOworCitzdGF0aWMgY29uc3QgY2hhciogR2V0VGVzdE5hbWUoKSB7CisgIHJldHVybiB0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKS0+bmFtZSgpOworfQorLy8gVGVzdCB0aGUgc3RyaXBwaW5nIG9mIHNwYWNlIGZyb20gdGVzdCBuYW1lcwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFRyaW1tZWRUZXN0IDogcHVibGljIFRlc3QgeyB9OworVFlQRURfVEVTVF9DQVNFX1AoVHJpbW1lZFRlc3QpOworVFlQRURfVEVTVF9QKFRyaW1tZWRUZXN0LCBUZXN0MSkgeyBFWFBFQ1RfU1RSRVEoIlRlc3QxIiwgR2V0VGVzdE5hbWUoKSk7IH0KK1RZUEVEX1RFU1RfUChUcmltbWVkVGVzdCwgVGVzdDIpIHsgRVhQRUNUX1NUUkVRKCJUZXN0MiIsIEdldFRlc3ROYW1lKCkpOyB9CitUWVBFRF9URVNUX1AoVHJpbW1lZFRlc3QsIFRlc3QzKSB7IEVYUEVDVF9TVFJFUSgiVGVzdDMiLCBHZXRUZXN0TmFtZSgpKTsgfQorVFlQRURfVEVTVF9QKFRyaW1tZWRUZXN0LCBUZXN0NCkgeyBFWFBFQ1RfU1RSRVEoIlRlc3Q0IiwgR2V0VGVzdE5hbWUoKSk7IH0KK1RZUEVEX1RFU1RfUChUcmltbWVkVGVzdCwgVGVzdDUpIHsgRVhQRUNUX1NUUkVRKCJUZXN0NSIsIEdldFRlc3ROYW1lKCkpOyB9CitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCgKKyAgICBUcmltbWVkVGVzdCwKKyAgICBUZXN0MSwgVGVzdDIsVGVzdDMgLCBUZXN0NCAsVGVzdDUgKTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gc3RydWN0IE15UGFpciB7fTsKKy8vIEJlIHN1cmUgdG8gdHJ5IGEgdHlwZSB3aXRoIGEgY29tbWEgaW4gaXRzIG5hbWUganVzdCBpbiBjYXNlIGl0IG1hdHRlcnMuCit0eXBlZGVmIFR5cGVzPGludCwgZG91YmxlLCBNeVBhaXI8aW50LCBpbnQ+ID4gVHJpbVR5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIFRyaW1tZWRUZXN0LCBUcmltVHlwZXMpOworCit9ICAvLyBuYW1lc3BhY2UgbGlicmFyeTIKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKyNpZiAhZGVmaW5lZChHVEVTVF9IQVNfVFlQRURfVEVTVCkgJiYgIWRlZmluZWQoR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCkKKworLy8gR29vZ2xlIFRlc3QgbWF5IG5vdCBzdXBwb3J0IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIHNvbWUKKy8vIGNvbXBpbGVycy4gSWYgd2UgdXNlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIGNvbXBpbGUgb3V0IGFsbAorLy8gY29kZSByZWZlcnJpbmcgdG8gdGhlIGd0ZXN0X21haW4gbGlicmFyeSwgTVNWQyBsaW5rZXIgd2lsbCBub3QgbGluaworLy8gdGhhdCBsaWJyYXJ5IGF0IGFsbCBhbmQgY29uc2VxdWVudGx5IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZW50cnkKKy8vIHBvaW50IGRlZmluZWQgaW4gdGhhdCBsaWJyYXJ5IChmYXRhbCBlcnJvciBMTksxNTYxOiBlbnRyeSBwb2ludAorLy8gbXVzdCBiZSBkZWZpbmVkKS4gVGhpcyBkdW1teSB0ZXN0IGtlZXBzIGd0ZXN0X21haW4gbGlua2VkIGluLgorVEVTVChEdW1teVRlc3QsIFR5cGVkVGVzdHNBcmVOb3RTdXBwb3J0ZWRPblRoaXNQbGF0Zm9ybSkge30KKworI2VuZGlmICAvLyAjaWYgIWRlZmluZWQoR1RFU1RfSEFTX1RZUEVEX1RFU1QpICYmICFkZWZpbmVkKEdURVNUX0hBU19UWVBFRF9URVNUX1ApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0LXR5cGVkLXRlc3RfdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDc1NzAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC10eXBlZC10ZXN0X3Rlc3QuaApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpZm5kZWYgR1RFU1RfVEVTVF9HVEVTVF9UWVBFRF9URVNUX1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfVEVTVF9HVEVTVF9UWVBFRF9URVNUX1RFU1RfSF8KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK3VzaW5nIHRlc3Rpbmc6OlRlc3Q7CisKKy8vIEZvciB0ZXN0aW5nIHRoYXQgdGhlIHNhbWUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBjYW4gYmUKKy8vIGluc3RhbnRpYXRlZCBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgbGlua2VkIHRvZ2V0aGVyLgorLy8gQ29udGFpbmVyVGVzdCB3aWxsIGJlIGluc3RhbnRpYXRlZCBpbiBib3RoIGd0ZXN0LXR5cGVkLXRlc3RfdGVzdC5jYworLy8gYW5kIGd0ZXN0LXR5cGVkLXRlc3QyX3Rlc3QuY2MuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQ29udGFpbmVyVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKENvbnRhaW5lclRlc3QpOworCitUWVBFRF9URVNUX1AoQ29udGFpbmVyVGVzdCwgQ2FuQmVEZWZhdWx0Q29uc3RydWN0ZWQpIHsKKyAgVHlwZVBhcmFtIGNvbnRhaW5lcjsKK30KKworVFlQRURfVEVTVF9QKENvbnRhaW5lclRlc3QsIEluaXRpYWxTaXplSXNaZXJvKSB7CisgIFR5cGVQYXJhbSBjb250YWluZXI7CisgIEVYUEVDVF9FUSgwVSwgY29udGFpbmVyLnNpemUoKSk7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENvbnRhaW5lclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5CZURlZmF1bHRDb25zdHJ1Y3RlZCwgSW5pdGlhbFNpemVJc1plcm8pOworCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2VuZGlmICAvLyBHVEVTVF9URVNUX0dURVNUX1RZUEVEX1RFU1RfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdC11bml0dGVzdC1hcGlfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY1MTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3QtdW5pdHRlc3QtYXBpX3Rlc3QuY2MKQEAgLTAsMCArMSwzNDEgQEAKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRlc3RzIHZlcmlmeWluZyBjb3JyZWN0bmVzcyBvZiBkYXRhIHByb3ZpZGVkIHZpYQorLy8gVW5pdFRlc3QncyBwdWJsaWMgbWV0aG9kcy4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIEZvciBzdHJjbXAuCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBMZXNzQnlOYW1lIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQqIGEsIGNvbnN0IFQqIGIpIHsKKyAgICByZXR1cm4gc3RyY21wKGEtPm5hbWUoKSwgYi0+bmFtZSgpKSA8IDA7CisgIH0KK307CisKK2NsYXNzIFVuaXRUZXN0SGVscGVyIHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgdGhlIGFycmF5IG9mIHBvaW50ZXJzIHRvIGFsbCB0ZXN0IGNhc2VzIHNvcnRlZCBieSB0aGUgdGVzdCBjYXNlCisgIC8vIG5hbWUuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgYXJyYXkuCisgIHN0YXRpYyBUZXN0Q2FzZSBjb25zdCoqIEdldFNvcnRlZFRlc3RDYXNlcygpIHsKKyAgICBVbml0VGVzdCYgdW5pdF90ZXN0ID0gKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworICAgIFRlc3RDYXNlIGNvbnN0KiogY29uc3QgdGVzdF9jYXNlcyA9CisgICAgICAgIG5ldyBjb25zdCBUZXN0Q2FzZSpbdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpXTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pdF90ZXN0LnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOyArK2kpCisgICAgICB0ZXN0X2Nhc2VzW2ldID0gdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworCisgICAgc3RkOjpzb3J0KHRlc3RfY2FzZXMsCisgICAgICAgICAgICAgIHRlc3RfY2FzZXMgKyB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCksCisgICAgICAgICAgICAgIExlc3NCeU5hbWU8VGVzdENhc2U+KCkpOworICAgIHJldHVybiB0ZXN0X2Nhc2VzOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIGJ5IGl0cyBuYW1lLiAgVGhlIGNhbGxlciBkb2Vzbid0IG93biB0aGUgcmV0dXJuZWQKKyAgLy8gcG9pbnRlci4KKyAgc3RhdGljIGNvbnN0IFRlc3RDYXNlKiBGaW5kVGVzdENhc2UoY29uc3QgY2hhciogbmFtZSkgeworICAgIFVuaXRUZXN0JiB1bml0X3Rlc3QgPSAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgICAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IHVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKTsKKyAgICAgIGlmICgwID09IHN0cmNtcCh0ZXN0X2Nhc2UtPm5hbWUoKSwgbmFtZSkpCisgICAgICAgIHJldHVybiB0ZXN0X2Nhc2U7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIHRlc3RzIGluIGEgcGFydGljdWxhciB0ZXN0IGNhc2UKKyAgLy8gc29ydGVkIGJ5IHRoZSB0ZXN0IG5hbWUuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUKKyAgLy8gYXJyYXkuCisgIHN0YXRpYyBUZXN0SW5mbyBjb25zdCoqIEdldFNvcnRlZFRlc3RzKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgICBUZXN0SW5mbyBjb25zdCoqIGNvbnN0IHRlc3RzID0KKyAgICAgICAgbmV3IGNvbnN0IFRlc3RJbmZvKlt0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKV07CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpOyArK2kpCisgICAgICB0ZXN0c1tpXSA9IHRlc3RfY2FzZS0+R2V0VGVzdEluZm8oaSk7CisKKyAgICBzdGQ6OnNvcnQodGVzdHMsIHRlc3RzICsgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCksCisgICAgICAgICAgICAgIExlc3NCeU5hbWU8VGVzdEluZm8+KCkpOworICAgIHJldHVybiB0ZXN0czsKKyAgfQorfTsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgVGVzdENhc2VXaXRoQ29tbWVudFRlc3QgOiBwdWJsaWMgVGVzdCB7fTsKK1RZUEVEX1RFU1RfQ0FTRShUZXN0Q2FzZVdpdGhDb21tZW50VGVzdCwgVHlwZXM8aW50Pik7CitUWVBFRF9URVNUKFRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LCBEdW1teSkge30KKworY29uc3QgaW50IGtUeXBlZFRlc3RDYXNlcyA9IDE7Citjb25zdCBpbnQga1R5cGVkVGVzdHMgPSAxOworI2Vsc2UKK2NvbnN0IGludCBrVHlwZWRUZXN0Q2FzZXMgPSAwOworY29uc3QgaW50IGtUeXBlZFRlc3RzID0gMDsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gV2UgY2FuIG9ubHkgdGVzdCB0aGUgYWNjZXNzb3JzIHRoYXQgZG8gbm90IGNoYW5nZSB2YWx1ZSB3aGlsZSB0ZXN0cyBydW4uCisvLyBTaW5jZSB0ZXN0cyBjYW4gYmUgcnVuIGluIGFueSBvcmRlciwgdGhlIHZhbHVlcyB0aGUgYWNjZXNzb3JzIHRoYXQgdHJhY2sKKy8vIHRlc3QgZXhlY3V0aW9uIChzdWNoIGFzIGZhaWxlZF90ZXN0X2NvdW50KSBjYW4gbm90IGJlIHByZWRpY3RlZC4KK1RFU1QoQXBpVGVzdCwgVW5pdFRlc3RJbW11dGFibGVBY2Nlc3NvcnNXb3JrKSB7CisgIFVuaXRUZXN0KiB1bml0X3Rlc3QgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKKworICBBU1NFUlRfRVEoMiArIGtUeXBlZFRlc3RDYXNlcywgdW5pdF90ZXN0LT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxICsga1R5cGVkVGVzdENhc2VzLCB1bml0X3Rlc3QtPnRlc3RfY2FzZV90b19ydW5fY291bnQoKSk7CisgIEVYUEVDVF9FUSgyLCB1bml0X3Rlc3QtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIEVYUEVDVF9FUSg1ICsga1R5cGVkVGVzdHMsIHVuaXRfdGVzdC0+dG90YWxfdGVzdF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDMgKyBrVHlwZWRUZXN0cywgdW5pdF90ZXN0LT50ZXN0X3RvX3J1bl9jb3VudCgpKTsKKworICBjb25zdCBUZXN0Q2FzZSoqIGNvbnN0IHRlc3RfY2FzZXMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdENhc2VzKCk7CisKKyAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdF9jYXNlc1swXS0+bmFtZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9jYXNlc1sxXS0+bmFtZSgpKTsKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0X2Nhc2VzWzJdLT5uYW1lKCkpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisgIGRlbGV0ZVtdIHRlc3RfY2FzZXM7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBpbml0aWF0ZSBhY3Rpb25zIHRvIHZlcmlmeSBjZXJ0YWluIG1ldGhvZHMgaW4KKyAgLy8gRmluYWxTdWNjZXNzQ2hlY2tlcjo6VGVhckRvd24uCisKKyAgLy8gUmVjb3JkcyBhIHRlc3QgcHJvcGVydHkgdG8gdmVyaWZ5IFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eSgpLgorICBSZWNvcmRQcm9wZXJ0eSgia2V5IiwgInZhbHVlIik7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc051bGwoY29uc3QgY2hhciogc3RyKSB7CisgIGlmIChzdHIgIT0gTlVMTCkgeworICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgImFyZ3VtZW50IGlzICIgPDwgc3RyOworICB9CisgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKK1RFU1QoQXBpVGVzdCwgVGVzdENhc2VJbW11dGFibGVBY2Nlc3NvcnNXb3JrKSB7CisgIGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UgPSBVbml0VGVzdEhlbHBlcjo6RmluZFRlc3RDYXNlKCJBcGlUZXN0Iik7CisgIEFTU0VSVF9UUlVFKHRlc3RfY2FzZSAhPSBOVUxMKTsKKworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0X2Nhc2UtPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSk7CisgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2UtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIEVYUEVDVF9FUSgzLCB0ZXN0X2Nhc2UtPnRlc3RfdG9fcnVuX2NvdW50KCkpOworICBBU1NFUlRfRVEoNCwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCkpOworCisgIGNvbnN0IFRlc3RJbmZvKiogdGVzdHMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdHModGVzdF9jYXNlKTsKKworICBFWFBFQ1RfU1RSRVEoIkRJU0FCTEVEX0R1bW15MSIsIHRlc3RzWzBdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1swXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMF0tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfRkFMU0UodGVzdHNbMF0tPnNob3VsZF9ydW4oKSk7CisKKyAgRVhQRUNUX1NUUkVRKCJUZXN0Q2FzZURpc2FibGVkQWNjZXNzb3JzV29yayIsIHRlc3RzWzFdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1sxXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1sxXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMV0tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRSh0ZXN0c1sxXS0+c2hvdWxkX3J1bigpKTsKKworICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlSW1tdXRhYmxlQWNjZXNzb3JzV29yayIsIHRlc3RzWzJdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1syXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1syXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMl0tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRSh0ZXN0c1syXS0+c2hvdWxkX3J1bigpKTsKKworICBFWFBFQ1RfU1RSRVEoIlVuaXRUZXN0SW1tdXRhYmxlQWNjZXNzb3JzV29yayIsIHRlc3RzWzNdLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1szXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgIEVYUEVDVF9UUlVFKElzTnVsbCh0ZXN0c1szXS0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbM10tPnR5cGVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRSh0ZXN0c1szXS0+c2hvdWxkX3J1bigpKTsKKworICBkZWxldGVbXSB0ZXN0czsKKyAgdGVzdHMgPSBOVUxMOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKyAgdGVzdF9jYXNlID0gVW5pdFRlc3RIZWxwZXI6OkZpbmRUZXN0Q2FzZSgiVGVzdENhc2VXaXRoQ29tbWVudFRlc3QvMCIpOworICBBU1NFUlRfVFJVRSh0ZXN0X2Nhc2UgIT0gTlVMTCk7CisKKyAgRVhQRUNUX1NUUkVRKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIiwgdGVzdF9jYXNlLT5uYW1lKCkpOworICBFWFBFQ1RfU1RSRVEoR2V0VHlwZU5hbWU8aW50PigpLmNfc3RyKCksIHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpKTsKKyAgRVhQRUNUX1RSVUUodGVzdF9jYXNlLT5zaG91bGRfcnVuKCkpOworICBFWFBFQ1RfRVEoMCwgdGVzdF9jYXNlLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgdGVzdF9jYXNlLT50ZXN0X3RvX3J1bl9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDEsIHRlc3RfY2FzZS0+dG90YWxfdGVzdF9jb3VudCgpKTsKKworICB0ZXN0cyA9IFVuaXRUZXN0SGVscGVyOjpHZXRTb3J0ZWRUZXN0cyh0ZXN0X2Nhc2UpOworCisgIEVYUEVDVF9TVFJFUSgiRHVtbXkiLCB0ZXN0c1swXS0+bmFtZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIiwgdGVzdHNbMF0tPnRlc3RfY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMF0tPnZhbHVlX3BhcmFtKCkpKTsKKyAgRVhQRUNUX1NUUkVRKEdldFR5cGVOYW1lPGludD4oKS5jX3N0cigpLCB0ZXN0c1swXS0+dHlwZV9wYXJhbSgpKTsKKyAgRVhQRUNUX1RSVUUodGVzdHNbMF0tPnNob3VsZF9ydW4oKSk7CisKKyAgZGVsZXRlW10gdGVzdHM7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCit9CisKK1RFU1QoQXBpVGVzdCwgVGVzdENhc2VEaXNhYmxlZEFjY2Vzc29yc1dvcmspIHsKKyAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIkRJU0FCTEVEX1Rlc3QiKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9jYXNlICE9IE5VTEwpOworCisgIEVYUEVDVF9TVFJFUSgiRElTQUJMRURfVGVzdCIsIHRlc3RfY2FzZS0+bmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpKSk7CisgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSk7CisgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2UtPmRpc2FibGVkX3Rlc3RfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2UtPnRlc3RfdG9fcnVuX2NvdW50KCkpOworICBBU1NFUlRfRVEoMSwgdGVzdF9jYXNlLT50b3RhbF90ZXN0X2NvdW50KCkpOworCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPkdldFRlc3RJbmZvKDApOworICBFWFBFQ1RfU1RSRVEoIkR1bW15MiIsIHRlc3RfaW5mby0+bmFtZSgpKTsKKyAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9UZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfaW5mby0+dmFsdWVfcGFyYW0oKSkpOworICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9pbmZvLT50eXBlX3BhcmFtKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKHRlc3RfaW5mby0+c2hvdWxkX3J1bigpKTsKK30KKworLy8gVGhlc2UgdHdvIHRlc3RzIGFyZSBoZXJlIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGVzdGluZworLy8gdGVzdF9jYXNlX3RvX3J1bl9jb3VudCwgZGlzYWJsZWRfdGVzdF9jb3VudCwgYW5kIHRlc3RfdG9fcnVuX2NvdW50LgorVEVTVChBcGlUZXN0LCBESVNBQkxFRF9EdW1teTEpIHt9CitURVNUKERJU0FCTEVEX1Rlc3QsIER1bW15Mikge30KKworY2xhc3MgRmluYWxTdWNjZXNzQ2hlY2tlciA6IHB1YmxpYyBFbnZpcm9ubWVudCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgVW5pdFRlc3QqIHVuaXRfdGVzdCA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpOworCisgICAgRVhQRUNUX0VRKDEgKyBrVHlwZWRUZXN0Q2FzZXMsIHVuaXRfdGVzdC0+c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDMgKyBrVHlwZWRUZXN0cywgdW5pdF90ZXN0LT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHVuaXRfdGVzdC0+ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdW5pdF90ZXN0LT5mYWlsZWRfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh1bml0X3Rlc3QtPlBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodW5pdF90ZXN0LT5GYWlsZWQoKSk7CisgICAgQVNTRVJUX0VRKDIgKyBrVHlwZWRUZXN0Q2FzZXMsIHVuaXRfdGVzdC0+dG90YWxfdGVzdF9jYXNlX2NvdW50KCkpOworCisgICAgY29uc3QgVGVzdENhc2UqKiBjb25zdCB0ZXN0X2Nhc2VzID0gVW5pdFRlc3RIZWxwZXI6OkdldFNvcnRlZFRlc3RDYXNlcygpOworCisgICAgRVhQRUNUX1NUUkVRKCJBcGlUZXN0IiwgdGVzdF9jYXNlc1swXS0+bmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdF9jYXNlc1swXS0+dHlwZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdF9jYXNlc1swXS0+c2hvdWxkX3J1bigpKTsKKyAgICBFWFBFQ1RfRVEoMSwgdGVzdF9jYXNlc1swXS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoNCwgdGVzdF9jYXNlc1swXS0+dG90YWxfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMywgdGVzdF9jYXNlc1swXS0+c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2VzWzBdLT5mYWlsZWRfdGVzdF9jb3VudCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2VzWzBdLT5QYXNzZWQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZXNbMF0tPkZhaWxlZCgpKTsKKworICAgIEVYUEVDVF9TVFJFUSgiRElTQUJMRURfVGVzdCIsIHRlc3RfY2FzZXNbMV0tPm5hbWUoKSk7CisgICAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RfY2FzZXNbMV0tPnR5cGVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2VzWzFdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2VzWzFdLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICAgIEFTU0VSVF9FUSgxLCB0ZXN0X2Nhc2VzWzFdLT50b3RhbF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2VzWzFdLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMV0tPmZhaWxlZF90ZXN0X2NvdW50KCkpOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKyAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0X2Nhc2VzWzJdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUShHZXRUeXBlTmFtZTxpbnQ+KCkuY19zdHIoKSwgdGVzdF9jYXNlc1syXS0+dHlwZV9wYXJhbSgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2Nhc2VzWzJdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0X2Nhc2VzWzJdLT5kaXNhYmxlZF90ZXN0X2NvdW50KCkpOworICAgIEFTU0VSVF9FUSgxLCB0ZXN0X2Nhc2VzWzJdLT50b3RhbF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0X2Nhc2VzWzJdLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRlc3RfY2FzZXNbMl0tPmZhaWxlZF90ZXN0X2NvdW50KCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZXNbMl0tPlBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodGVzdF9jYXNlc1syXS0+RmFpbGVkKCkpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisgICAgY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSA9IFVuaXRUZXN0SGVscGVyOjpGaW5kVGVzdENhc2UoIkFwaVRlc3QiKTsKKyAgICBjb25zdCBUZXN0SW5mbyoqIHRlc3RzID0gVW5pdFRlc3RIZWxwZXI6OkdldFNvcnRlZFRlc3RzKHRlc3RfY2FzZSk7CisgICAgRVhQRUNUX1NUUkVRKCJESVNBQkxFRF9EdW1teTEiLCB0ZXN0c1swXS0+bmFtZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkFwaVRlc3QiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRlc3RzWzBdLT5zaG91bGRfcnVuKCkpOworCisgICAgRVhQRUNUX1NUUkVRKCJUZXN0Q2FzZURpc2FibGVkQWNjZXNzb3JzV29yayIsIHRlc3RzWzFdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzFdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMV0tPnZhbHVlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMV0tPnR5cGVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzFdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzFdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0c1sxXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlSW1tdXRhYmxlQWNjZXNzb3JzV29yayIsIHRlc3RzWzJdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzJdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMl0tPnZhbHVlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbMl0tPnR5cGVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzJdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzJdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9FUSgwLCB0ZXN0c1syXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIlVuaXRUZXN0SW1tdXRhYmxlQWNjZXNzb3JzV29yayIsIHRlc3RzWzNdLT5uYW1lKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXBpVGVzdCIsIHRlc3RzWzNdLT50ZXN0X2Nhc2VfbmFtZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbM10tPnZhbHVlX3BhcmFtKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShJc051bGwodGVzdHNbM10tPnR5cGVfcGFyYW0oKSkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzNdLT5zaG91bGRfcnVuKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RzWzNdLT5yZXN1bHQoKS0+UGFzc2VkKCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0c1szXS0+cmVzdWx0KCktPnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSA9IHRlc3RzWzNdLT5yZXN1bHQoKS0+R2V0VGVzdFByb3BlcnR5KDApOworICAgIEVYUEVDVF9TVFJFUSgia2V5IiwgcHJvcGVydHkua2V5KCkpOworICAgIEVYUEVDVF9TVFJFUSgidmFsdWUiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKKworICAgIGRlbGV0ZVtdIHRlc3RzOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKyAgICB0ZXN0X2Nhc2UgPSBVbml0VGVzdEhlbHBlcjo6RmluZFRlc3RDYXNlKCJUZXN0Q2FzZVdpdGhDb21tZW50VGVzdC8wIik7CisgICAgdGVzdHMgPSBVbml0VGVzdEhlbHBlcjo6R2V0U29ydGVkVGVzdHModGVzdF9jYXNlKTsKKworICAgIEVYUEVDVF9TVFJFUSgiRHVtbXkiLCB0ZXN0c1swXS0+bmFtZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRlc3RDYXNlV2l0aENvbW1lbnRUZXN0LzAiLCB0ZXN0c1swXS0+dGVzdF9jYXNlX25hbWUoKSk7CisgICAgRVhQRUNUX1RSVUUoSXNOdWxsKHRlc3RzWzBdLT52YWx1ZV9wYXJhbSgpKSk7CisgICAgRVhQRUNUX1NUUkVRKEdldFR5cGVOYW1lPGludD4oKS5jX3N0cigpLCB0ZXN0c1swXS0+dHlwZV9wYXJhbSgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0c1swXS0+c2hvdWxkX3J1bigpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0c1swXS0+cmVzdWx0KCktPlBhc3NlZCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGVzdHNbMF0tPnJlc3VsdCgpLT50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworCisgICAgZGVsZXRlW10gdGVzdHM7CisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisgICAgZGVsZXRlW10gdGVzdF9jYXNlczsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgdGVzdGluZzo6aW50ZXJuYWw6OkZpbmFsU3VjY2Vzc0NoZWNrZXIoKSk7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfYWxsX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1YWE2MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2FsbF90ZXN0LmNjCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFNvbWV0aW1lcyBpdCdzIGRlc2lyYWJsZSB0byBidWlsZCBtb3N0IG9mIEdvb2dsZSBUZXN0J3Mgb3duIHRlc3RzCisvLyBieSBjb21waWxpbmcgYSBzaW5nbGUgZmlsZS4gIFRoaXMgZmlsZSBzZXJ2ZXMgdGhpcyBwdXJwb3NlLgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtZmlsZXBhdGhfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LWxpbmtlZF9wdHJfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LW1lc3NhZ2VfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LW9wdGlvbnNfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXBvcnRfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3ByZWRfaW1wbF91bml0dGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0LXRlc3QtcGFydF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdF90ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvZ3Rlc3QtdHlwZWQtdGVzdDJfdGVzdC5jYyIKKyNpbmNsdWRlICJ0ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjIgorI2luY2x1ZGUgInRlc3QvcHJvZHVjdGlvbi5jYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3QucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4ZjNlMGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMjEyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgYnJlYWstb24tZmFpbHVyZSBtb2RlLgorCitBIHVzZXIgY2FuIGFzayBHb29nbGUgVGVzdCB0byBzZWctZmF1bHQgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHMsIHVzaW5nCitlaXRoZXIgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlCistLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZy4gIFRoaXMgc2NyaXB0IHRlc3RzIHN1Y2ggZnVuY3Rpb25hbGl0eQorYnkgaW52b2tpbmcgZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8gKGEgcHJvZ3JhbSB3cml0dGVuIHdpdGgKK0dvb2dsZSBUZXN0KSB3aXRoIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgYW5kIGNvbW1hbmQgbGluZSBmbGFncy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKKworIyBDb25zdGFudHMuCisKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKKworIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgYnJlYWstb24tZmFpbHVyZSBtb2RlLgorQlJFQUtfT05fRkFJTFVSRV9FTlZfVkFSID0gJ0dURVNUX0JSRUFLX09OX0ZBSUxVUkUnCisKKyMgVGhlIGNvbW1hbmQgbGluZSBmbGFnIGZvciBlbmFibGluZy9kaXNhYmxpbmcgdGhlIGJyZWFrLW9uLWZhaWx1cmUgbW9kZS4KK0JSRUFLX09OX0ZBSUxVUkVfRkxBRyA9ICdndGVzdF9icmVha19vbl9mYWlsdXJlJworCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUuCitUSFJPV19PTl9GQUlMVVJFX0VOVl9WQVIgPSAnR1RFU1RfVEhST1dfT05fRkFJTFVSRScKKworIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgY2F0Y2gtZXhjZXB0aW9ucyBtb2RlLgorQ0FUQ0hfRVhDRVBUSU9OU19FTlZfVkFSID0gJ0dURVNUX0NBVENIX0VYQ0VQVElPTlMnCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZV91bml0dGVzdF8gcHJvZ3JhbS4KK0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCisgICAgJ2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfJykKKworCitlbnZpcm9uID0gZ3Rlc3RfdGVzdF91dGlscy5lbnZpcm9uCitTZXRFbnZWYXIgPSBndGVzdF90ZXN0X3V0aWxzLlNldEVudlZhcgorCisjIFRlc3RzIGluIHRoaXMgZmlsZSBydW4gYSBHb29nbGUtVGVzdC1iYXNlZCB0ZXN0IHByb2dyYW0gYW5kIGV4cGVjdCBpdAorIyB0byB0ZXJtaW5hdGUgcHJlbWF0dXJlbHkuICBUaGVyZWZvcmUgdGhleSBhcmUgaW5jb21wYXRpYmxlIHdpdGgKKyMgdGhlIHByZW1hdHVyZS1leGl0LWZpbGUgcHJvdG9jb2wgYnkgZGVzaWduLiAgVW5zZXQgdGhlCisjIHByZW1hdHVyZS1leGl0IGZpbGVwYXRoIHRvIHByZXZlbnQgR29vZ2xlIFRlc3QgZnJvbSBjcmVhdGluZworIyB0aGUgZmlsZS4KK1NldEVudlZhcihndGVzdF90ZXN0X3V0aWxzLlBSRU1BVFVSRV9FWElUX0ZJTEVfRU5WX1ZBUiwgTm9uZSkKKworCitkZWYgUnVuKGNvbW1hbmQpOgorICAiIiJSdW5zIGEgY29tbWFuZDsgcmV0dXJucyAxIGlmIGl0IHdhcyBraWxsZWQgYnkgYSBzaWduYWwsIG9yIDAgb3RoZXJ3aXNlLiIiIgorCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCwgZW52PWVudmlyb24pCisgIGlmIHAudGVybWluYXRlZF9ieV9zaWduYWw6CisgICAgcmV0dXJuIDEKKyAgZWxzZToKKyAgICByZXR1cm4gMAorCisKKyMgVGhlIHRlc3RzLgorCisKK2NsYXNzIEdUZXN0QnJlYWtPbkZhaWx1cmVVbml0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgdXNpbmcgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IKKyAgdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnIHRvIHR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8KKyAgc2VnbWVudGF0aW9uIGZhdWx0cy4KKyAgIiIiCisKKyAgZGVmIFJ1bkFuZFZlcmlmeShzZWxmLCBlbnZfdmFyX3ZhbHVlLCBmbGFnX3ZhbHVlLCBleHBlY3Rfc2VnX2ZhdWx0KToKKyAgICAiIiJSdW5zIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfIGFuZCB2ZXJpZmllcyB0aGF0IGl0IGRvZXMKKyAgICAob3IgZG9lcyBub3QpIGhhdmUgYSBzZWctZmF1bHQuCisKKyAgICBBcmdzOgorICAgICAgZW52X3Zhcl92YWx1ZTogICAgdmFsdWUgb2YgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOyBOb25lIGlmIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgdW5zZXQuCisgICAgICBmbGFnX3ZhbHVlOiAgICAgICB2YWx1ZSBvZiB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGZsYWc7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHRoZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC4KKyAgICAgIGV4cGVjdF9zZWdfZmF1bHQ6IDEgaWYgdGhlIHByb2dyYW0gaXMgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgYSBzZWctZmF1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAwIG90aGVyd2lzZS4KKyAgICAiIiIKKworICAgIFNldEVudlZhcihCUkVBS19PTl9GQUlMVVJFX0VOVl9WQVIsIGVudl92YXJfdmFsdWUpCisKKyAgICBpZiBlbnZfdmFyX3ZhbHVlIGlzIE5vbmU6CisgICAgICBlbnZfdmFyX3ZhbHVlX21zZyA9ICcgaXMgbm90IHNldCcKKyAgICBlbHNlOgorICAgICAgZW52X3Zhcl92YWx1ZV9tc2cgPSAnPScgKyBlbnZfdmFyX3ZhbHVlCisKKyAgICBpZiBmbGFnX3ZhbHVlIGlzIE5vbmU6CisgICAgICBmbGFnID0gJycKKyAgICBlbGlmIGZsYWdfdmFsdWUgPT0gJzAnOgorICAgICAgZmxhZyA9ICctLSVzPTAnICUgQlJFQUtfT05fRkFJTFVSRV9GTEFHCisgICAgZWxzZToKKyAgICAgIGZsYWcgPSAnLS0lcycgJSBCUkVBS19PTl9GQUlMVVJFX0ZMQUcKKworICAgIGNvbW1hbmQgPSBbRVhFX1BBVEhdCisgICAgaWYgZmxhZzoKKyAgICAgIGNvbW1hbmQuYXBwZW5kKGZsYWcpCisKKyAgICBpZiBleHBlY3Rfc2VnX2ZhdWx0OgorICAgICAgc2hvdWxkX29yX25vdCA9ICdzaG91bGQnCisgICAgZWxzZToKKyAgICAgIHNob3VsZF9vcl9ub3QgPSAnc2hvdWxkIG5vdCcKKworICAgIGhhc19zZWdfZmF1bHQgPSBSdW4oY29tbWFuZCkKKworICAgIFNldEVudlZhcihCUkVBS19PTl9GQUlMVVJFX0VOVl9WQVIsIE5vbmUpCisKKyAgICBtc2cgPSAoJ3doZW4gJXMlcywgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaW4gIiVzIiAlcyBjYXVzZSBhIHNlZy1mYXVsdC4nICUKKyAgICAgICAgICAgKEJSRUFLX09OX0ZBSUxVUkVfRU5WX1ZBUiwgZW52X3Zhcl92YWx1ZV9tc2csICcgJy5qb2luKGNvbW1hbmQpLAorICAgICAgICAgICAgc2hvdWxkX29yX25vdCkpCisgICAgc2VsZi5hc3NlcnRfKGhhc19zZWdfZmF1bHQgPT0gZXhwZWN0X3NlZ19mYXVsdCwgbXNnKQorCisgIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBtb2RlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTApCisKKyAgZGVmIHRlc3RFbnZWYXIoc2VsZik6CisgICAgIiIiVGVzdHMgdXNpbmcgdGhlIEdURVNUX0JSRUFLX09OX0ZBSUxVUkUgZW52aXJvbm1lbnQgdmFyaWFibGUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisKKyAgZGVmIHRlc3RGbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTApCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKKworICBkZWYgdGVzdEZsYWdPdmVycmlkZXNFbnZWYXIoc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCB0aGUgZmxhZyBvdmVycmlkZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0wKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zZWdfZmF1bHQ9MSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTApCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3NlZ19mYXVsdD0xKQorCisgIGRlZiB0ZXN0QnJlYWtPbkZhaWx1cmVPdmVycmlkZXNUaHJvd09uRmFpbHVyZShzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgb3ZlcnJpZGVzIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuIiIiCisKKyAgICBTZXRFbnZWYXIoVEhST1dfT05fRkFJTFVSRV9FTlZfVkFSLCAnMScpCisgICAgdHJ5OgorICAgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisgICAgZmluYWxseToKKyAgICAgIFNldEVudlZhcihUSFJPV19PTl9GQUlMVVJFX0VOVl9WQVIsIE5vbmUpCisKKyAgaWYgSVNfV0lORE9XUzoKKyAgICBkZWYgdGVzdENhdGNoRXhjZXB0aW9uc0RvZXNOb3RJbnRlcmZlcmUoc2VsZik6CisgICAgICAiIiJUZXN0cyB0aGF0IGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMgZG9lc24ndCBpbnRlcmZlcmUuIiIiCisKKyAgICAgIFNldEVudlZhcihDQVRDSF9FWENFUFRJT05TX0VOVl9WQVIsICcxJykKKyAgICAgIHRyeToKKyAgICAgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc2VnX2ZhdWx0PTEpCisgICAgICBmaW5hbGx5OgorICAgICAgICBTZXRFbnZWYXIoQ0FUQ0hfRVhDRVBUSU9OU19FTlZfVkFSLCBOb25lKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2JyZWFrX29uX2ZhaWx1cmVfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDc0NzgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0Xy5jYwpAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgYnJlYWstb24tZmFpbHVyZSBtb2RlLgorLy8KKy8vIEEgdXNlciBjYW4gYXNrIEdvb2dsZSBUZXN0IHRvIHNlZy1mYXVsdCB3aGVuIGFuIGFzc2VydGlvbiBmYWlscywgdXNpbmcKKy8vIGVpdGhlciB0aGUgR1RFU1RfQlJFQUtfT05fRkFJTFVSRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUKKy8vIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnLiAgVGhpcyBmaWxlIGlzIHVzZWQgZm9yIHRlc3Rpbmcgc3VjaAorLy8gZnVuY3Rpb25hbGl0eS4KKy8vCisvLyBUaGlzIHByb2dyYW0gd2lsbCBiZSBpbnZva2VkIGZyb20gYSBQeXRob24gdW5pdCB0ZXN0LiAgSXQgaXMKKy8vIGV4cGVjdGVkIHRvIGZhaWwuICBEb24ndCBydW4gaXQgZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSB7CisKKy8vIEEgdGVzdCB0aGF0J3MgZXhwZWN0ZWQgdG8gZmFpbC4KK1RFU1QoRm9vLCBCYXIpIHsKKyAgRVhQRUNUX0VRKDIsIDMpOworfQorCisjaWYgR1RFU1RfSEFTX1NFSCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIE9uIFdpbmRvd3MgTW9iaWxlIGdsb2JhbCBleGNlcHRpb24gaGFuZGxlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuCitMT05HIFdJTkFQSSBFeGl0V2l0aEV4Y2VwdGlvbkNvZGUoCisgICAgc3RydWN0IF9FWENFUFRJT05fUE9JTlRFUlMqIGV4Y2VwdGlvbl9wb2ludGVycykgeworICBleGl0KGV4Y2VwdGlvbl9wb2ludGVycy0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBTdXBwcmVzc2VzIGRpc3BsYXkgb2YgdGhlIFdpbmRvd3MgZXJyb3IgZGlhbG9nIHVwb24gZW5jb3VudGVyaW5nCisgIC8vIGEgZ2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0IChzZWdtZW50IHZpb2xhdGlvbikuCisgIFNldEVycm9yTW9kZShTRU1fTk9HUEZBVUxURVJST1JCT1ggfCBTRU1fRkFJTENSSVRJQ0FMRVJST1JTKTsKKworIyBpZiBHVEVTVF9IQVNfU0VIICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIC8vIFRoZSBkZWZhdWx0IHVuaGFuZGxlZCBleGNlcHRpb24gZmlsdGVyIGRvZXMgbm90IGFsd2F5cyBleGl0CisgIC8vIHdpdGggdGhlIGV4Y2VwdGlvbiBjb2RlIGFzIGV4aXQgY29kZSAtIGZvciBleGFtcGxlIGl0IGV4aXRzIHdpdGgKKyAgLy8gMCBmb3IgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04gYW5kIDEgZm9yIEVYQ0VQVElPTl9CUkVBS1BPSU5UCisgIC8vIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlLiBUaHVzIHdlIHVzZSBvdXIgb3duCisgIC8vIGZpbHRlciB3aGljaCBhbHdheXMgZXhpdHMgd2l0aCB0aGUgZXhjZXB0aW9uIGNvZGUgZm9yIHVuaGFuZGxlZAorICAvLyBleGNlcHRpb25zLgorICBTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIoRXhpdFdpdGhFeGNlcHRpb25Db2RlKTsKKworIyBlbmRpZgorI2VuZGlmCisKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTZmYzIyZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdC5weQpAQCAtMCwwICsxLDIzNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgR29vZ2xlIFRlc3QncyBleGNlcHRpb24gY2F0Y2hpbmcgYmVoYXZpb3IuCisKK1RoaXMgc2NyaXB0IGludm9rZXMgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0XyBhbmQKK2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfZXhfdGVzdF8gKHByb2dyYW1zIHdyaXR0ZW4gd2l0aAorR29vZ2xlIFRlc3QpIGFuZCB2ZXJpZmllcyB0aGVpciBvdXRwdXQuCisiIiIKKworX19hdXRob3JfXyA9ICd2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KScKKworaW1wb3J0IG9zCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKyMgQ29uc3RhbnRzLgorRkxBR19QUkVGSVggPSAnLS1ndGVzdF8nCitMSVNUX1RFU1RTX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdsaXN0X3Rlc3RzJworTk9fQ0FUQ0hfRVhDRVBUSU9OU19GTEFHID0gRkxBR19QUkVGSVggKyAnY2F0Y2hfZXhjZXB0aW9ucz0wJworRklMVEVSX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdmaWx0ZXInCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XyBiaW5hcnksIGNvbXBpbGVkIHdpdGgKKyMgZXhjZXB0aW9ucyBlbmFibGVkLgorRVhfRVhFX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKKyAgICAnZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc19leF90ZXN0XycpCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9uc190ZXN0XyBiaW5hcnksIGNvbXBpbGVkIHdpdGgKKyMgZXhjZXB0aW9ucyBkaXNhYmxlZC4KK0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoCisgICAgJ2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfbm9fZXhfdGVzdF8nKQorCitlbnZpcm9uID0gZ3Rlc3RfdGVzdF91dGlscy5lbnZpcm9uCitTZXRFbnZWYXIgPSBndGVzdF90ZXN0X3V0aWxzLlNldEVudlZhcgorCisjIFRlc3RzIGluIHRoaXMgZmlsZSBydW4gYSBHb29nbGUtVGVzdC1iYXNlZCB0ZXN0IHByb2dyYW0gYW5kIGV4cGVjdCBpdAorIyB0byB0ZXJtaW5hdGUgcHJlbWF0dXJlbHkuICBUaGVyZWZvcmUgdGhleSBhcmUgaW5jb21wYXRpYmxlIHdpdGgKKyMgdGhlIHByZW1hdHVyZS1leGl0LWZpbGUgcHJvdG9jb2wgYnkgZGVzaWduLiAgVW5zZXQgdGhlCisjIHByZW1hdHVyZS1leGl0IGZpbGVwYXRoIHRvIHByZXZlbnQgR29vZ2xlIFRlc3QgZnJvbSBjcmVhdGluZworIyB0aGUgZmlsZS4KK1NldEVudlZhcihndGVzdF90ZXN0X3V0aWxzLlBSRU1BVFVSRV9FWElUX0ZJTEVfRU5WX1ZBUiwgTm9uZSkKKworVEVTVF9MSVNUID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtFWEVfUEFUSCwgTElTVF9URVNUU19GTEFHXSwgZW52PWVudmlyb24pLm91dHB1dAorCitTVVBQT1JUU19TRUhfRVhDRVBUSU9OUyA9ICdUaHJvd3NTZWhFeGNlcHRpb24nIGluIFRFU1RfTElTVAorCitpZiBTVVBQT1JUU19TRUhfRVhDRVBUSU9OUzoKKyAgQklOQVJZX09VVFBVVCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhbRVhFX1BBVEhdLCBlbnY9ZW52aXJvbikub3V0cHV0CisKK0VYX0JJTkFSWV9PVVRQVVQgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoCisgICAgW0VYX0VYRV9QQVRIXSwgZW52PWVudmlyb24pLm91dHB1dAorCisKKyMgVGhlIHRlc3RzLgoraWYgU1VQUE9SVFNfU0VIX0VYQ0VQVElPTlM6CisgICMgcHlsaW50OmRpc2FibGUtbXNnPUM2MzAyCisgIGNsYXNzIENhdGNoU2VoRXhjZXB0aW9uc1Rlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZXhjZXB0aW9uLWNhdGNoaW5nIGJlaGF2aW9yLiIiIgorCisKKyAgICBkZWYgVGVzdFNlaEV4Y2VwdGlvbnMoc2VsZiwgdGVzdF9vdXRwdXQpOgorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biAnCisgICAgICAgICAgICAgICAgICAgJ2luIHRoZSB0ZXN0IGZpeHR1cmVcJ3MgY29uc3RydWN0b3InCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duICcKKyAgICAgICAgICAgICAgICAgICAnaW4gdGhlIHRlc3QgZml4dHVyZVwncyBkZXN0cnVjdG9yJworICAgICAgICAgICAgICAgICAgIGluIHRlc3Rfb3V0cHV0KQorICAgICAgc2VsZi5hc3NlcnRfKCdTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweDJhIHRocm93biBpbiBTZXRVcFRlc3RDYXNlKCknCisgICAgICAgICAgICAgICAgICAgaW4gdGVzdF9vdXRwdXQpCisgICAgICBzZWxmLmFzc2VydF8oJ1NFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4MmEgdGhyb3duIGluIFRlYXJEb3duVGVzdENhc2UoKScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gU2V0VXAoKScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gVGVhckRvd24oKScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgyYSB0aHJvd24gaW4gdGhlIHRlc3QgYm9keScKKyAgICAgICAgICAgICAgICAgICBpbiB0ZXN0X291dHB1dCkKKworICAgIGRlZiB0ZXN0Q2F0Y2hlc1NlaEV4Y2VwdGlvbnNXaXRoQ3h4RXhjZXB0aW9uc0VuYWJsZWQoc2VsZik6CisgICAgICBzZWxmLlRlc3RTZWhFeGNlcHRpb25zKEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgICBkZWYgdGVzdENhdGNoZXNTZWhFeGNlcHRpb25zV2l0aEN4eEV4Y2VwdGlvbnNEaXNhYmxlZChzZWxmKToKKyAgICAgIHNlbGYuVGVzdFNlaEV4Y2VwdGlvbnMoQklOQVJZX09VVFBVVCkKKworCitjbGFzcyBDYXRjaEN4eEV4Y2VwdGlvbnNUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiJUZXN0cyBDKysgZXhjZXB0aW9uLWNhdGNoaW5nIGJlaGF2aW9yLgorCisgICAgIFRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHZlcmlmeSB0aGF0OgorICAgICAqIEMrKyBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIGxvZ2dlZCBhcyBDKysgKG5vdCBTRUgpIGV4Y2VwdGlvbnMKKyAgICAgKiBFeGNlcHRpb24gdGhyb3duIGFmZmVjdCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0IHdvcmsgZmxvdyBpbiB0aGUKKyAgICAgICBleHBlY3RlZCBtYW5uZXIuCisgICIiIgorCisgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJbkZpeHR1cmVDb25zdHJ1Y3RvcihzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAnCisgICAgICAgICAgICAgICAgICciU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIgdGhyb3duICcKKyAgICAgICAgICAgICAgICAgJ2luIHRoZSB0ZXN0IGZpeHR1cmVcJ3MgY29uc3RydWN0b3InCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCd1bmV4cGVjdGVkJyBub3QgaW4gRVhfQklOQVJZX09VVFBVVCwKKyAgICAgICAgICAgICAgICAgJ1RoaXMgZmFpbHVyZSBiZWxvbmdzIGluIHRoaXMgdGVzdCBvbmx5IGlmICcKKyAgICAgICAgICAgICAgICAgJyJDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCIgKG5vIHF1b3RlcykgJworICAgICAgICAgICAgICAgICAnYXBwZWFycyBvbiB0aGUgc2FtZSBsaW5lIGFzIHdvcmRzICJjYWxsZWQgdW5leHBlY3RlZGx5IicpCisKKyAgaWYgKCdDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0LlRocm93c0V4Y2VwdGlvbkluRGVzdHJ1Y3RvcicgaW4KKyAgICAgIEVYX0JJTkFSWV9PVVRQVVQpOgorCisgICAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luRml4dHVyZURlc3RydWN0b3Ioc2VsZik6CisgICAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAnCisgICAgICAgICAgICAgICAgICAgJyJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIiB0aHJvd24gJworICAgICAgICAgICAgICAgICAgICdpbiB0aGUgdGVzdCBmaXh0dXJlXCdzIGRlc3RydWN0b3InCisgICAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICAgIHNlbGYuYXNzZXJ0XygnQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKKyAgICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJblNldFVwVGVzdENhc2Uoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iJworICAgICAgICAgICAgICAgICAnIHRocm93biBpbiBTZXRVcFRlc3RDYXNlKCknCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IGNvbnN0cnVjdG9yICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IGRlc3RydWN0b3IgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlNldFVwKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlRlYXJEb3duKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgdGVzdCBib2R5ICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgZGVmIHRlc3RDYXRjaGVzQ3h4RXhjZXB0aW9uc0luVGVhckRvd25UZXN0Q2FzZShzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCisgICAgICAgICAgICAgICAgICcgdGhyb3duIGluIFRlYXJEb3duVGVzdENhc2UoKScKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKworICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5TZXRVcChzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCisgICAgICAgICAgICAgICAgICcgdGhyb3duIGluIFNldFVwKCknCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdCBkZXN0cnVjdG9yICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblNldFVwVGVzdDo6VGVhckRvd24oKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorICAgIHNlbGYuYXNzZXJ0XygndW5leHBlY3RlZCcgbm90IGluIEVYX0JJTkFSWV9PVVRQVVQsCisgICAgICAgICAgICAgICAgICdUaGlzIGZhaWx1cmUgYmVsb25ncyBpbiB0aGlzIHRlc3Qgb25seSBpZiAnCisgICAgICAgICAgICAgICAgICciQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QiIChubyBxdW90ZXMpICcKKyAgICAgICAgICAgICAgICAgJ2FwcGVhcnMgb24gdGhlIHNhbWUgbGluZSBhcyB3b3JkcyAiY2FsbGVkIHVuZXhwZWN0ZWRseSInKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc0N4eEV4Y2VwdGlvbnNJblRlYXJEb3duKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XygnQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uICJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIicKKyAgICAgICAgICAgICAgICAgJyB0aHJvd24gaW4gVGVhckRvd24oKScKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKyAgICBzZWxmLmFzc2VydF8oJ0N4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0IGRlc3RydWN0b3IgJworICAgICAgICAgICAgICAgICAnY2FsbGVkIGFzIGV4cGVjdGVkLicKKyAgICAgICAgICAgICAgICAgaW4gRVhfQklOQVJZX09VVFBVVCkKKworICBkZWYgdGVzdENhdGNoZXNDeHhFeGNlcHRpb25zSW5UZXN0Qm9keShzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oJ0MrKyBleGNlcHRpb24gd2l0aCBkZXNjcmlwdGlvbiAiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiInCisgICAgICAgICAgICAgICAgICcgdGhyb3duIGluIHRoZSB0ZXN0IGJvZHknCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdCBkZXN0cnVjdG9yICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBhcyBleHBlY3RlZC4nCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisgICAgc2VsZi5hc3NlcnRfKCdDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdDo6VGVhckRvd24oKSAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQgYXMgZXhwZWN0ZWQuJworICAgICAgICAgICAgICAgICBpbiBFWF9CSU5BUllfT1VUUFVUKQorCisgIGRlZiB0ZXN0Q2F0Y2hlc05vblN0ZEN4eEV4Y2VwdGlvbnMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRfKCdVbmtub3duIEMrKyBleGNlcHRpb24gdGhyb3duIGluIHRoZSB0ZXN0IGJvZHknCisgICAgICAgICAgICAgICAgIGluIEVYX0JJTkFSWV9PVVRQVVQpCisKKyAgZGVmIHRlc3RVbmhhbmRsZWRDeHhFeGNlcHRpb25zQWJvcnRUaGVQcm9ncmFtKHNlbGYpOgorICAgICMgRmlsdGVycyBvdXQgU0VIIGV4Y2VwdGlvbiB0ZXN0cyBvbiBXaW5kb3dzLiBVbmhhbmRsZWQgU0VIIGV4Y2VwdGlvbnMKKyAgICAjIGNhdXNlIHRlc3RzIHRvIHNob3cgcG9wLXVwIHdpbmRvd3MgdGhlcmUuCisgICAgRklUTEVSX09VVF9TRUhfVEVTVFNfRkxBRyA9IEZJTFRFUl9GTEFHICsgJz0tKlNlaConCisgICAgIyBCeSBkZWZhdWx0LCBHb29nbGUgVGVzdCBkb2Vzbid0IGNhdGNoIHRoZSBleGNlcHRpb25zLgorICAgIHVuY2F1Z2h0X2V4Y2VwdGlvbnNfZXhfYmluYXJ5X291dHB1dCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKKyAgICAgICAgW0VYX0VYRV9QQVRILAorICAgICAgICAgTk9fQ0FUQ0hfRVhDRVBUSU9OU19GTEFHLAorICAgICAgICAgRklUTEVSX09VVF9TRUhfVEVTVFNfRkxBR10sCisgICAgICAgIGVudj1lbnZpcm9uKS5vdXRwdXQKKworICAgIHNlbGYuYXNzZXJ0XygnVW5oYW5kbGVkIEMrKyBleGNlcHRpb24gdGVybWluYXRpbmcgdGhlIHByb2dyYW0nCisgICAgICAgICAgICAgICAgIGluIHVuY2F1Z2h0X2V4Y2VwdGlvbnNfZXhfYmluYXJ5X291dHB1dCkKKyAgICBzZWxmLmFzc2VydF8oJ3VuZXhwZWN0ZWQnIG5vdCBpbiB1bmNhdWdodF9leGNlcHRpb25zX2V4X2JpbmFyeV9vdXRwdXQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2NhdGNoX2V4Y2VwdGlvbnNfdGVzdF8uY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZmM4MmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3RfLmNjCkBAIC0wLDAgKzEsMzExIEBACisvLyBDb3B5cmlnaHQgMjAxMCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYuIFRlc3RzIGluIHRoaXMgZmlsZSB0aHJvdyBDKysgb3IgU0VICisvLyBleGNlcHRpb25zLCBhbmQgdGhlIG91dHB1dCBpcyB2ZXJpZmllZCBieSBndGVzdF9jYXRjaF9leGNlcHRpb25zX3Rlc3QucHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gRm9yIGV4aXQoKS4KKworI2lmIEdURVNUX0hBU19TRUgKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworIyBpbmNsdWRlIDxleGNlcHRpb24+ICAvLyBGb3Igc2V0X3Rlcm1pbmF0ZSgpLgorIyBpbmNsdWRlIDxzdGRleGNlcHQ+CisjZW5kaWYKKwordXNpbmcgdGVzdGluZzo6VGVzdDsKKworI2lmIEdURVNUX0hBU19TRUgKKworY2xhc3MgU2VoRXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBTZWhFeGNlcHRpb25JbkNvbnN0cnVjdG9yVGVzdCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QsIFRocm93c0V4Y2VwdGlvbkluQ29uc3RydWN0b3IpIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICB+U2VoRXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5EZXN0cnVjdG9yKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93blRlc3RDYXNlKSB7fQorCitjbGFzcyBTZWhFeGNlcHRpb25JblNldFVwVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOyB9Cit9OworCitURVNUX0YoU2VoRXhjZXB0aW9uSW5TZXRVcFRlc3QsIFRocm93c0V4Y2VwdGlvbkluU2V0VXApIHt9CisKK2NsYXNzIFNlaEV4Y2VwdGlvbkluVGVhckRvd25UZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeyBSYWlzZUV4Y2VwdGlvbig0MiwgMCwgMCwgTlVMTCk7IH0KK307CisKK1RFU1RfRihTZWhFeGNlcHRpb25JblRlYXJEb3duVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93bikge30KKworVEVTVChTZWhFeGNlcHRpb25UZXN0LCBUaHJvd3NTZWhFeGNlcHRpb24pIHsKKyAgUmFpc2VFeGNlcHRpb24oNDIsIDAsIDAsIE5VTEwpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QoKSB7CisgICAgLy8gV2l0aG91dCB0aGlzIG1hY3JvIFZDKysgY29tcGxhaW5zIGFib3V0IHVucmVhY2hhYmxlIGNvZGUgYXQgdGhlIGVuZCBvZgorICAgIC8vIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKAorICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3QgZGVzdHJ1Y3RvciAiCisgICAgICAgICAgICAgICAgICA8PCAiY2FsbGVkIHVuZXhwZWN0ZWRseS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0OjpTZXRVcCgpICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjYWxsZWQgdW5leHBlY3RlZGx5LiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5Db25zdHJ1Y3RvclRlc3Q6OlRlYXJEb3duKCkgIgorICAgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0LCBUaHJvd3NFeGNlcHRpb25JbkNvbnN0cnVjdG9yKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIkN4eEV4Y2VwdGlvbkluQ29uc3RydWN0b3JUZXN0IHRlc3QgYm9keSAiCisgICAgICAgICAgICAgICAgPDwgImNhbGxlZCB1bmV4cGVjdGVkbHkuIjsKK30KKworLy8gRXhjZXB0aW9ucyBpbiBkZXN0cnVjdG9ycyBhcmUgbm90IHN1cHBvcnRlZCBpbiBDKysxMS4KKyNpZiAhZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykgJiYgIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorY2xhc3MgQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JbkRlc3RydWN0b3JUZXN0OjpUZWFyRG93blRlc3RDYXNlKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworIHByb3RlY3RlZDoKKyAgfkN4eEV4Y2VwdGlvbkluRGVzdHJ1Y3RvclRlc3QoKSB7CisgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXygKKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIikpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5EZXN0cnVjdG9yVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5EZXN0cnVjdG9yKSB7fQorI2VuZGlmICAvLyBDKysxMSBtb2RlCisKK2NsYXNzIEN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0KCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCBjb25zdHJ1Y3RvciAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7CisgIH0KKworICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIH5DeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0KCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCBkZXN0cnVjdG9yICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdDo6U2V0VXAoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0Q2FzZVRlc3Q6OlRlYXJEb3duKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JblNldFVwVGVzdENhc2VUZXN0LCBUaHJvd3NFeGNlcHRpb25JblNldFVwVGVzdENhc2UpIHsKKyAgcHJpbnRmKCIlcyIsCisgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3RDYXNlVGVzdCB0ZXN0IGJvZHkgIgorICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworfQorCitjbGFzcyBDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKTsKKyAgfQorfTsKKworVEVTVF9GKEN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0Q2FzZVRlc3QsIFRocm93c0V4Y2VwdGlvbkluVGVhckRvd25UZXN0Q2FzZSkge30KKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblNldFVwVGVzdCBkZXN0cnVjdG9yICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlN0YW5kYXJkIEMrKyBleGNlcHRpb24iKTsgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluU2V0VXBUZXN0OjpUZWFyRG93bigpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9Cit9OworCitURVNUX0YoQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QsIFRocm93c0V4Y2VwdGlvbkluU2V0VXApIHsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiQ3h4RXhjZXB0aW9uSW5TZXRVcFRlc3QgdGVzdCBib2R5ICIKKyAgICAgICAgICAgICAgICA8PCAiY2FsbGVkIHVuZXhwZWN0ZWRseS4iOworfQorCitjbGFzcyBDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdDo6VGVhckRvd25UZXN0Q2FzZSgpICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIH5DeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCgpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkN4eEV4Y2VwdGlvbkluVGVhckRvd25UZXN0IGRlc3RydWN0b3IgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJTdGFuZGFyZCBDKysgZXhjZXB0aW9uIik7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JblRlYXJEb3duVGVzdCwgVGhyb3dzRXhjZXB0aW9uSW5UZWFyRG93bikge30KKworY2xhc3MgQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3Q6OlRlYXJEb3duVGVzdENhc2UoKSAiCisgICAgICAgICAgICJjYWxsZWQgYXMgZXhwZWN0ZWQuXG4iKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB+Q3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3QoKSB7CisgICAgcHJpbnRmKCIlcyIsCisgICAgICAgICAgICJDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdCBkZXN0cnVjdG9yICIKKyAgICAgICAgICAgImNhbGxlZCBhcyBleHBlY3RlZC5cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIHByaW50ZigiJXMiLAorICAgICAgICAgICAiQ3h4RXhjZXB0aW9uSW5UZXN0Qm9keVRlc3Q6OlRlYXJEb3duKCkgIgorICAgICAgICAgICAiY2FsbGVkIGFzIGV4cGVjdGVkLlxuIik7CisgIH0KK307CisKK1RFU1RfRihDeHhFeGNlcHRpb25JblRlc3RCb2R5VGVzdCwgVGhyb3dzU3RkQ3h4RXhjZXB0aW9uKSB7CisgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiU3RhbmRhcmQgQysrIGV4Y2VwdGlvbiIpOworfQorCitURVNUKEN4eEV4Y2VwdGlvblRlc3QsIFRocm93c05vblN0ZEN4eEV4Y2VwdGlvbikgeworICB0aHJvdyAiQy1zdHJpbmciOworfQorCisvLyBUaGlzIHRlcm1pbmF0ZSBoYW5kbGVyIGFib3J0cyB0aGUgcHJvZ3JhbSB1c2luZyBleGl0KCkgcmF0aGVyIHRoYW4gYWJvcnQoKS4KKy8vIFRoaXMgYXZvaWRzIHNob3dpbmcgcG9wLXVwcyBvbiBXaW5kb3dzIHN5c3RlbXMgYW5kIGNvcmUgZHVtcHMgb24gVW5peC1saWtlCisvLyBvbmVzLgordm9pZCBUZXJtaW5hdGVIYW5kbGVyKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCAiVW5oYW5kbGVkIEMrKyBleGNlcHRpb24gdGVybWluYXRpbmcgdGhlIHByb2dyYW0uIik7CisgIGZmbHVzaChOVUxMKTsKKyAgZXhpdCgzKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICBzdGQ6OnNldF90ZXJtaW5hdGUoJlRlcm1pbmF0ZUhhbmRsZXIpOworI2VuZGlmCisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2NvbG9yX3Rlc3QucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwMmE1M2UKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9jb2xvcl90ZXN0LnB5CkBAIC0wLDAgKzEsMTMwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IGNvcnJlY3RseSBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGNvbG9ycy4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID0gJ250JworCitDT0xPUl9FTlZfVkFSID0gJ0dURVNUX0NPTE9SJworQ09MT1JfRkxBRyA9ICdndGVzdF9jb2xvcicKK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3RfY29sb3JfdGVzdF8nKQorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIHRoZSBlbnYgdmFyaWFibGUgdG8gJ3ZhbHVlJzsgdW5zZXRzIGl0IHdoZW4gJ3ZhbHVlJyBpcyBOb25lLiIiIgorCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIG9zLmVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gb3MuZW52aXJvbjoKKyAgICBkZWwgb3MuZW52aXJvbltlbnZfdmFyXQorCisKK2RlZiBVc2VzQ29sb3IodGVybSwgY29sb3JfZW52X3ZhciwgY29sb3JfZmxhZyk6CisgICIiIlJ1bnMgZ3Rlc3RfY29sb3JfdGVzdF8gYW5kIHJldHVybnMgaXRzIGV4aXQgY29kZS4iIiIKKworICBTZXRFbnZWYXIoJ1RFUk0nLCB0ZXJtKQorICBTZXRFbnZWYXIoQ09MT1JfRU5WX1ZBUiwgY29sb3JfZW52X3ZhcikKKworICBpZiBjb2xvcl9mbGFnIGlzIE5vbmU6CisgICAgYXJncyA9IFtdCisgIGVsc2U6CisgICAgYXJncyA9IFsnLS0lcz0lcycgJSAoQ09MT1JfRkxBRywgY29sb3JfZmxhZyldCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0NPTU1BTkRdICsgYXJncykKKyAgcmV0dXJuIG5vdCBwLmV4aXRlZCBvciBwLmV4aXRfY29kZQorCisKK2NsYXNzIEdUZXN0Q29sb3JUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICBkZWYgdGVzdE5vRW52VmFyTm9GbGFnKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlcmUncyBuZWl0aGVyIEdURVNUX0NPTE9SIG5vciAtLWd0ZXN0X2NvbG9yLiIiIgorCisgICAgaWYgbm90IElTX1dJTkRPV1M6CisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZHVtYicsIE5vbmUsIE5vbmUpKQorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2VtYWNzJywgTm9uZSwgTm9uZSkpCisgICAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0tbW9ubycsIE5vbmUsIE5vbmUpKQorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3Vua25vd24nLCBOb25lLCBOb25lKSkKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKE5vbmUsIE5vbmUsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2xpbnV4JywgTm9uZSwgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignY3lnd2luJywgTm9uZSwgTm9uZSkpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsIE5vbmUsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLTI1NmNvbG9yJywgTm9uZSwgTm9uZSkpCisKKyAgZGVmIHRlc3RGbGFnT25seShzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB3aGVuIHRoZXJlJ3MgLS1ndGVzdF9jb2xvciBidXQgbm90IEdURVNUX0NPTE9SLiIiIgorCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAnbm8nKSkKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0tY29sb3InLCBOb25lLCAnbm8nKSkKKyAgICBpZiBub3QgSVNfV0lORE9XUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCdlbWFjcycsIE5vbmUsICdhdXRvJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAnYXV0bycpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAneWVzJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAneWVzJykpCisKKyAgZGVmIHRlc3RFbnZWYXJPbmx5KHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlcmUncyBHVEVTVF9DT0xPUiBidXQgbm90IC0tZ3Rlc3RfY29sb3IuIiIiCisKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcignZHVtYicsICdubycsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsICdubycsIE5vbmUpKQorICAgIGlmIG5vdCBJU19XSU5ET1dTOgorICAgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ2R1bWInLCAnYXV0bycsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ2F1dG8nLCBOb25lKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCdkdW1iJywgJ3llcycsIE5vbmUpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ3llcycsIE5vbmUpKQorCisgIGRlZiB0ZXN0RW52VmFyQW5kRmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB3aGVuIHRoZXJlIGFyZSBib3RoIEdURVNUX0NPTE9SIGFuZCAtLWd0ZXN0X2NvbG9yLiIiIgorCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtLWNvbG9yJywgJ25vJywgJ25vJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsICdubycsICd5ZXMnKSkKKyAgICBzZWxmLmFzc2VydF8oVXNlc0NvbG9yKCd4dGVybS1jb2xvcicsICdubycsICdhdXRvJykpCisKKyAgZGVmIHRlc3RBbGlhc2VzT2ZZZXNBbmRObyhzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyBhbGlhc2VzIGluIHNwZWNpZnlpbmcgLS1ndGVzdF9jb2xvci4iIiIKKworICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAndHJ1ZScpKQorICAgIHNlbGYuYXNzZXJ0XyhVc2VzQ29sb3IoJ2R1bWInLCBOb25lLCAnWUVTJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICdUJykpCisgICAgc2VsZi5hc3NlcnRfKFVzZXNDb2xvcignZHVtYicsIE5vbmUsICcxJykpCisKKyAgICBzZWxmLmFzc2VydF8obm90IFVzZXNDb2xvcigneHRlcm0nLCBOb25lLCAnZicpKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICdmYWxzZScpKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgVXNlc0NvbG9yKCd4dGVybScsIE5vbmUsICcwJykpCisgICAgc2VsZi5hc3NlcnRfKG5vdCBVc2VzQ29sb3IoJ3h0ZXJtJywgTm9uZSwgJ3Vua25vd24nKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9jb2xvcl90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFlYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfY29sb3JfdGVzdF8uY2MKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gQSBoZWxwZXIgcHJvZ3JhbSBmb3IgdGVzdGluZyBob3cgR29vZ2xlIFRlc3QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZQorLy8gY29sb3JzIGluIHRoZSBvdXRwdXQuICBJdCBwcmludHMgIllFUyIgYW5kIHJldHVybnMgMSBpZiBHb29nbGUgVGVzdAorLy8gZGVjaWRlcyB0byB1c2UgY29sb3JzLCBhbmQgcHJpbnRzICJOTyIgYW5kIHJldHVybnMgMCBvdGhlcndpc2UuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpTaG91bGRVc2VDb2xvcjsKKworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgVW5pdFRlc3Qgc2luZ2xldG9uIGlzCisvLyBjcmVhdGVkIGJlZm9yZSBtYWluKCkgaXMgZW50ZXJlZCwgYW5kIHRodXMgdGhhdCBTaG91bGRVc2VDb2xvcigpCisvLyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgaW4gYSByZWFsIEdvb2dsZS1UZXN0LWJhc2VkIHRlc3QuICBXZSBkb24ndCBhY3R1YWwKKy8vIHJ1biB0aGUgVEVTVCBpdHNlbGYuCitURVNUKEdUZXN0Q29sb3JUZXN0LCBEdW1teSkgeworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIGlmIChTaG91bGRVc2VDb2xvcih0cnVlKSkgeworICAgIC8vIEdvb2dsZSBUZXN0IGRlY2lkZXMgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0IChhc3N1bWluZyBpdAorICAgIC8vIGdvZXMgdG8gYSBUVFkpLgorICAgIHByaW50ZigiWUVTXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICAvLyBHb29nbGUgVGVzdCBkZWNpZGVzIG5vdCB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCisgICAgcHJpbnRmKCJOT1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdC5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYzI0MzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfZW52X3Zhcl90ZXN0LnB5CkBAIC0wLDAgKzEsMTAzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IEdvb2dsZSBUZXN0IGNvcnJlY3RseSBwYXJzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworSVNfTElOVVggPSBvcy5uYW1lID09ICdwb3NpeCcgYW5kIG9zLnVuYW1lKClbMF0gPT0gJ0xpbnV4JworCitDT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2Vudl92YXJfdGVzdF8nKQorCitlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKworCitkZWYgQXNzZXJ0RXEoZXhwZWN0ZWQsIGFjdHVhbCk6CisgIGlmIGV4cGVjdGVkICE9IGFjdHVhbDoKKyAgICBwcmludCAnRXhwZWN0ZWQ6ICVzJyAlIChleHBlY3RlZCwpCisgICAgcHJpbnQgJyAgQWN0dWFsOiAlcycgJSAoYWN0dWFsLCkKKyAgICByYWlzZSBBc3NlcnRpb25FcnJvcgorCisKK2RlZiBTZXRFbnZWYXIoZW52X3ZhciwgdmFsdWUpOgorICAiIiJTZXRzIHRoZSBlbnYgdmFyaWFibGUgdG8gJ3ZhbHVlJzsgdW5zZXRzIGl0IHdoZW4gJ3ZhbHVlJyBpcyBOb25lLiIiIgorCisgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgIGVudmlyb25bZW52X3Zhcl0gPSB2YWx1ZQorICBlbGlmIGVudl92YXIgaW4gZW52aXJvbjoKKyAgICBkZWwgZW52aXJvbltlbnZfdmFyXQorCisKK2RlZiBHZXRGbGFnKGZsYWcpOgorICAiIiJSdW5zIGd0ZXN0X2Vudl92YXJfdGVzdF8gYW5kIHJldHVybnMgaXRzIG91dHB1dC4iIiIKKworICBhcmdzID0gW0NPTU1BTkRdCisgIGlmIGZsYWcgaXMgbm90IE5vbmU6CisgICAgYXJncyArPSBbZmxhZ10KKyAgcmV0dXJuIGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhhcmdzLCBlbnY9ZW52aXJvbikub3V0cHV0CisKKworZGVmIFRlc3RGbGFnKGZsYWcsIHRlc3RfdmFsLCBkZWZhdWx0X3ZhbCk6CisgICIiIlZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIGZsYWcgaXMgYWZmZWN0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZW52IHZhci4iIiIKKworICBlbnZfdmFyID0gJ0dURVNUXycgKyBmbGFnLnVwcGVyKCkKKyAgU2V0RW52VmFyKGVudl92YXIsIHRlc3RfdmFsKQorICBBc3NlcnRFcSh0ZXN0X3ZhbCwgR2V0RmxhZyhmbGFnKSkKKyAgU2V0RW52VmFyKGVudl92YXIsIE5vbmUpCisgIEFzc2VydEVxKGRlZmF1bHRfdmFsLCBHZXRGbGFnKGZsYWcpKQorCisKK2NsYXNzIEdUZXN0RW52VmFyVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgZGVmIHRlc3RFbnZWYXJBZmZlY3RzRmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlIHNob3VsZCBhZmZlY3QgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZy4iIiIKKworICAgIFRlc3RGbGFnKCdicmVha19vbl9mYWlsdXJlJywgJzEnLCAnMCcpCisgICAgVGVzdEZsYWcoJ2NvbG9yJywgJ3llcycsICdhdXRvJykKKyAgICBUZXN0RmxhZygnZmlsdGVyJywgJ0Zvb1Rlc3QuQmFyJywgJyonKQorICAgIFRlc3RGbGFnKCdvdXRwdXQnLCAneG1sOnRtcC9mb28ueG1sJywgJycpCisgICAgVGVzdEZsYWcoJ3ByaW50X3RpbWUnLCAnMCcsICcxJykKKyAgICBUZXN0RmxhZygncmVwZWF0JywgJzk5OScsICcxJykKKyAgICBUZXN0RmxhZygndGhyb3dfb25fZmFpbHVyZScsICcxJywgJzAnKQorICAgIFRlc3RGbGFnKCdkZWF0aF90ZXN0X3N0eWxlJywgJ3RocmVhZHNhZmUnLCAnZmFzdCcpCisgICAgVGVzdEZsYWcoJ2NhdGNoX2V4Y2VwdGlvbnMnLCAnMCcsICcxJykKKworICAgIGlmIElTX0xJTlVYOgorICAgICAgVGVzdEZsYWcoJ2RlYXRoX3Rlc3RfdXNlX2ZvcmsnLCAnMScsICcwJykKKyAgICAgIFRlc3RGbGFnKCdzdGFja190cmFjZV9kZXB0aCcsICcwJywgJzEwMCcpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2Vudl92YXJfdGVzdF8uY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWFmYzkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9lbnZfdmFyX3Rlc3RfLmNjCkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBBIGhlbHBlciBwcm9ncmFtIGZvciB0ZXN0aW5nIHRoYXQgR29vZ2xlIFRlc3QgcGFyc2VzIHRoZSBlbnZpcm9ubWVudAorLy8gdmFyaWFibGVzIGNvcnJlY3RseS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKwordXNpbmcgOjpzdGQ6OmNvdXQ7CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBtYWtlIHRoZSB0ZXN0IG1vcmUgcmVhbGlzdGljIGJ5IGVuc3VyaW5nCisvLyB0aGF0IHRoZSBVbml0VGVzdCBzaW5nbGV0b24gaXMgY3JlYXRlZCBiZWZvcmUgbWFpbigpIGlzIGVudGVyZWQuCisvLyBXZSBkb24ndCBhY3R1YWwgcnVuIHRoZSBURVNUIGl0c2VsZi4KK1RFU1QoR1Rlc3RFbnZWYXJUZXN0LCBEdW1teSkgeworfQorCit2b2lkIFByaW50RmxhZyhjb25zdCBjaGFyKiBmbGFnKSB7CisgIGlmIChzdHJjbXAoZmxhZywgImJyZWFrX29uX2ZhaWx1cmUiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgImNhdGNoX2V4Y2VwdGlvbnMiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgImNvbG9yIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhjb2xvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAiZGVhdGhfdGVzdF9zdHlsZSIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAiZGVhdGhfdGVzdF91c2VfZm9yayIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAiZmlsdGVyIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhmaWx0ZXIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdHJjbXAoZmxhZywgIm91dHB1dCIpID09IDApIHsKKyAgICBjb3V0IDw8IEdURVNUX0ZMQUcob3V0cHV0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJwcmludF90aW1lIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyhwcmludF90aW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJyZXBlYXQiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKHJlcGVhdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNtcChmbGFnLCAic3RhY2tfdHJhY2VfZGVwdGgiKSA9PSAwKSB7CisgICAgY291dCA8PCBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RyY21wKGZsYWcsICJ0aHJvd19vbl9mYWlsdXJlIikgPT0gMCkgeworICAgIGNvdXQgPDwgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb3V0IDw8ICJJbnZhbGlkIGZsYWcgbmFtZSAiIDw8IGZsYWcKKyAgICAgICA8PCAiLiAgVmFsaWQgbmFtZXMgYXJlIGJyZWFrX29uX2ZhaWx1cmUsIGNvbG9yLCBmaWx0ZXIsIGV0Yy5cbiI7CisgIGV4aXQoMSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgaWYgKGFyZ2MgIT0gMikgeworICAgIGNvdXQgPDwgIlVzYWdlOiBndGVzdF9lbnZfdmFyX3Rlc3RfIE5BTUVfT0ZfRkxBR1xuIjsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHRlc3Rpbmc6OlByaW50RmxhZyhhcmd2WzFdKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9lbnZpcm9ubWVudF90ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2ZmMTllCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfZW52aXJvbm1lbnRfdGVzdC5jYwpAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUZXN0cyB1c2luZyBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMuCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEgIC8vIFJlcXVpcmVkIGZvciB0aGUgbmV4dCAjaW5jbHVkZS4KKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOworfQorCituYW1lc3BhY2UgeworCitlbnVtIEZhaWx1cmVUeXBlIHsKKyAgTk9fRkFJTFVSRSwgTk9OX0ZBVEFMX0ZBSUxVUkUsIEZBVEFMX0ZBSUxVUkUKK307CisKKy8vIEZvciB0ZXN0aW5nIHVzaW5nIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cy4KK2NsYXNzIE15RW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgTXlFbnZpcm9ubWVudCgpIHsgUmVzZXQoKTsgfQorCisgIC8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgZmFpbHVyZV9pbl9zZXRfdXBfLCBTZXRVcCgpIHdpbGwKKyAgLy8gZ2VuZXJhdGUgYSBub24tZmF0YWwgZmFpbHVyZSwgZ2VuZXJhdGUgYSBmYXRhbCBmYWlsdXJlLCBvcgorICAvLyBzdWNjZWVkLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgc2V0X3VwX3dhc19ydW5fID0gdHJ1ZTsKKworICAgIHN3aXRjaCAoZmFpbHVyZV9pbl9zZXRfdXBfKSB7CisgICAgICBjYXNlIE5PTl9GQVRBTF9GQUlMVVJFOgorICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSBpbiBnbG9iYWwgc2V0LXVwLiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGQVRBTF9GQUlMVVJFOgorICAgICAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUgaW4gZ2xvYmFsIHNldC11cC4iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgdGVhcl9kb3duX3dhc19ydW5fID0gdHJ1ZTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSBpbiBnbG9iYWwgdGVhci1kb3duLiI7CisgIH0KKworICAvLyBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSBlbnZpcm9ubWVudCBzLnQuIGl0IGNhbiBiZSByZXVzZWQuCisgIHZvaWQgUmVzZXQoKSB7CisgICAgZmFpbHVyZV9pbl9zZXRfdXBfID0gTk9fRkFJTFVSRTsKKyAgICBzZXRfdXBfd2FzX3J1bl8gPSBmYWxzZTsKKyAgICB0ZWFyX2Rvd25fd2FzX3J1bl8gPSBmYWxzZTsKKyAgfQorCisgIC8vIFdlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIHR5cGUgb2YgZmFpbHVyZSBTZXRVcCgpIHNob3VsZAorICAvLyBnZW5lcmF0ZS4KKyAgdm9pZCBzZXRfZmFpbHVyZV9pbl9zZXRfdXAoRmFpbHVyZVR5cGUgdHlwZSkgeworICAgIGZhaWx1cmVfaW5fc2V0X3VwXyA9IHR5cGU7CisgIH0KKworICAvLyBXYXMgU2V0VXAoKSBydW4/CisgIGJvb2wgc2V0X3VwX3dhc19ydW4oKSBjb25zdCB7IHJldHVybiBzZXRfdXBfd2FzX3J1bl87IH0KKworICAvLyBXYXMgVGVhckRvd24oKSBydW4/CisgIGJvb2wgdGVhcl9kb3duX3dhc19ydW4oKSBjb25zdCB7IHJldHVybiB0ZWFyX2Rvd25fd2FzX3J1bl87IH0KKworIHByaXZhdGU6CisgIEZhaWx1cmVUeXBlIGZhaWx1cmVfaW5fc2V0X3VwXzsKKyAgYm9vbCBzZXRfdXBfd2FzX3J1bl87CisgIGJvb2wgdGVhcl9kb3duX3dhc19ydW5fOworfTsKKworLy8gV2FzIHRoZSBURVNUIHJ1bj8KK2Jvb2wgdGVzdF93YXNfcnVuOworCisvLyBUaGUgc29sZSBwdXJwb3NlIG9mIHRoaXMgVEVTVCBpcyB0byBlbmFibGUgdXMgdG8gY2hlY2sgd2hldGhlciBpdAorLy8gd2FzIHJ1bi4KK1RFU1QoRm9vVGVzdCwgQmFyKSB7CisgIHRlc3Rfd2FzX3J1biA9IHRydWU7Cit9CisKKy8vIFByaW50cyB0aGUgbWVzc2FnZSBhbmQgYWJvcnRzIHRoZSBwcm9ncmFtIGlmIGNvbmRpdGlvbiBpcyBmYWxzZS4KK3ZvaWQgQ2hlY2soYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIG1zZykgeworICBpZiAoIWNvbmRpdGlvbikgeworICAgIHByaW50ZigiRkFJTEVEOiAlc1xuIiwgbXNnKTsKKyAgICB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7CisgIH0KK30KKworLy8gUnVucyB0aGUgdGVzdHMuICBSZXR1cm4gdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKy8vCisvLyBUaGUgJ2ZhaWx1cmUnIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgZmFpbHVyZSB0aGF0IHNob3VsZAorLy8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBnbG9iYWwgc2V0LXVwLgoraW50IFJ1bkFsbFRlc3RzKE15RW52aXJvbm1lbnQqIGVudiwgRmFpbHVyZVR5cGUgZmFpbHVyZSkgeworICBlbnYtPlJlc2V0KCk7CisgIGVudi0+c2V0X2ZhaWx1cmVfaW5fc2V0X3VwKGZhaWx1cmUpOworICB0ZXN0X3dhc19ydW4gPSBmYWxzZTsKKyAgdGVzdGluZzo6aW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5DbGVhckFkSG9jVGVzdFJlc3VsdCgpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAvLyBSZWdpc3RlcnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudCwgYW5kIHZlcmlmaWVzIHRoYXQgdGhlCisgIC8vIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiByZXR1cm5zIGl0cyBhcmd1bWVudC4KKyAgTXlFbnZpcm9ubWVudCogY29uc3QgZW52ID0gbmV3IE15RW52aXJvbm1lbnQ7CisgIENoZWNrKHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChlbnYpID09IGVudiwKKyAgICAgICAgIkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpIHNob3VsZCByZXR1cm4gaXRzIGFyZ3VtZW50LiIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIHJ1bnMgdGhlIHRlc3RzIHdoZW4gdGhlIGdsb2JhbAorICAvLyBzZXQtdXAgaXMgc3VjY2Vzc2Z1bC4KKyAgQ2hlY2soUnVuQWxsVGVzdHMoZW52LCBOT19GQUlMVVJFKSAhPSAwLAorICAgICAgICAiUlVOX0FMTF9URVNUUygpIHNob3VsZCByZXR1cm4gbm9uLXplcm8sIGFzIHRoZSBnbG9iYWwgdGVhci1kb3duICIKKyAgICAgICAgInNob3VsZCBnZW5lcmF0ZSBhIGZhaWx1cmUuIik7CisgIENoZWNrKHRlc3Rfd2FzX3J1biwKKyAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCBzaG91bGQgZ2VuZXJhdGUgbm8gIgorICAgICAgICAiZmFpbHVyZSIpOworICBDaGVjayhlbnYtPnRlYXJfZG93bl93YXNfcnVuKCksCisgICAgICAgICJUaGUgZ2xvYmFsIHRlYXItZG93biBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCB3YXMgcnVuLiIpOworCisgIC8vIFZlcmlmaWVzIHRoYXQgUlVOX0FMTF9URVNUUygpIHJ1bnMgdGhlIHRlc3RzIHdoZW4gdGhlIGdsb2JhbAorICAvLyBzZXQtdXAgZ2VuZXJhdGVzIG5vIGZhdGFsIGZhaWx1cmUuCisgIENoZWNrKFJ1bkFsbFRlc3RzKGVudiwgTk9OX0ZBVEFMX0ZBSUxVUkUpICE9IDAsCisgICAgICAgICJSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIHJldHVybiBub24temVybywgYXMgYm90aCB0aGUgZ2xvYmFsIHNldC11cCAiCisgICAgICAgICJhbmQgdGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIGdlbmVyYXRlIGEgbm9uLWZhdGFsIGZhaWx1cmUuIik7CisgIENoZWNrKHRlc3Rfd2FzX3J1biwKKyAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgcnVuLCBhcyB0aGUgZ2xvYmFsIHNldC11cCBzaG91bGQgZ2VuZXJhdGUgbm8gIgorICAgICAgICAiZmF0YWwgZmFpbHVyZS4iKTsKKyAgQ2hlY2soZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAorICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgd2FzIHJ1bi4iKTsKKworICAvLyBWZXJpZmllcyB0aGF0IFJVTl9BTExfVEVTVFMoKSBydW5zIG5vIHRlc3Qgd2hlbiB0aGUgZ2xvYmFsIHNldC11cAorICAvLyBnZW5lcmF0ZXMgYSBmYXRhbCBmYWlsdXJlLgorICBDaGVjayhSdW5BbGxUZXN0cyhlbnYsIEZBVEFMX0ZBSUxVUkUpICE9IDAsCisgICAgICAgICJSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIHJldHVybiBub24temVybywgYXMgdGhlIGdsb2JhbCBzZXQtdXAgIgorICAgICAgICAic2hvdWxkIGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZS4iKTsKKyAgQ2hlY2soIXRlc3Rfd2FzX3J1biwKKyAgICAgICAgIlRoZSB0ZXN0cyBzaG91bGQgbm90IHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgc2hvdWxkIGdlbmVyYXRlICIKKyAgICAgICAgImEgZmF0YWwgZmFpbHVyZS4iKTsKKyAgQ2hlY2soZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAorICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIHJ1biwgYXMgdGhlIGdsb2JhbCBzZXQtdXAgd2FzIHJ1bi4iKTsKKworICAvLyBWZXJpZmllcyB0aGF0IFJVTl9BTExfVEVTVFMoKSBkb2Vzbid0IGRvIGdsb2JhbCBzZXQtdXAgb3IKKyAgLy8gdGVhci1kb3duIHdoZW4gdGhlcmUgaXMgbm8gdGVzdCB0byBydW4uCisgIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKSA9ICItKiI7CisgIENoZWNrKFJ1bkFsbFRlc3RzKGVudiwgTk9fRkFJTFVSRSkgPT0gMCwKKyAgICAgICAgIlJVTl9BTExfVEVTVFMoKSBzaG91bGQgcmV0dXJuIHplcm8sIGFzIHRoZXJlIGlzIG5vIHRlc3QgdG8gcnVuLiIpOworICBDaGVjayghZW52LT5zZXRfdXBfd2FzX3J1bigpLAorICAgICAgICAiVGhlIGdsb2JhbCBzZXQtdXAgc2hvdWxkIG5vdCBydW4sIGFzIHRoZXJlIGlzIG5vIHRlc3QgdG8gcnVuLiIpOworICBDaGVjayghZW52LT50ZWFyX2Rvd25fd2FzX3J1bigpLAorICAgICAgICAiVGhlIGdsb2JhbCB0ZWFyLWRvd24gc2hvdWxkIG5vdCBydW4sICIKKyAgICAgICAgImFzIHRoZSBnbG9iYWwgc2V0LXVwIHdhcyBub3QgcnVuLiIpOworCisgIHByaW50ZigiUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0LnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkMWE3NzAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSw2MzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCB0ZXN0IGZpbHRlcnMuCisKK0EgdXNlciBjYW4gc3BlY2lmeSB3aGljaCB0ZXN0KHMpIGluIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSB0byBydW4gdmlhIGVpdGhlcgordGhlIEdURVNUX0ZJTFRFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUgLS1ndGVzdF9maWx0ZXIgZmxhZy4KK1RoaXMgc2NyaXB0IHRlc3RzIHN1Y2ggZnVuY3Rpb25hbGl0eSBieSBpbnZva2luZworZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0XyAoYSBwcm9ncmFtIHdyaXR0ZW4gd2l0aCBHb29nbGUgVGVzdCkgd2l0aCBkaWZmZXJlbnQKK2Vudmlyb25tZW50cyBhbmQgY29tbWFuZCBsaW5lIGZsYWdzLgorCitOb3RlIHRoYXQgdGVzdCBzaGFyZGluZyBtYXkgYWxzbyBpbmZsdWVuY2Ugd2hpY2ggdGVzdHMgYXJlIGZpbHRlcmVkLiBUaGVyZWZvcmUsCit3ZSB0ZXN0IHRoYXQgaGVyZSBhbHNvLgorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc2V0cworaW1wb3J0IHN5cworCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisjIENvbnN0YW50cy4KKworIyBDaGVja3MgaWYgdGhpcyBwbGF0Zm9ybSBjYW4gcGFzcyBlbXB0eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gY2hpbGQKKyMgcHJvY2Vzc2VzLiAgV2Ugc2V0IGFuIGVudiB2YXJpYWJsZSB0byBhbiBlbXB0eSBzdHJpbmcgYW5kIGludm9rZSBhIHB5dGhvbgorIyBzY3JpcHQgaW4gYSBzdWJwcm9jZXNzIHRvIHByaW50IHdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIFNUSUxMIGluCisjIG9zLmVudmlyb24uICBXZSB0aGVuIHVzZSAnZXZhbCcgdG8gcGFyc2UgdGhlIGNoaWxkJ3Mgb3V0cHV0IHNvIHRoYXQgYW4KKyMgZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgaW5wdXQgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiAnVHJ1ZScgbm9yICdGYWxzZScuCitvcy5lbnZpcm9uWydFTVBUWV9WQVInXSA9ICcnCitjaGlsZCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKKyAgICBbc3lzLmV4ZWN1dGFibGUsICctYycsICdpbXBvcnQgb3M7IHByaW50IFwnRU1QVFlfVkFSXCcgaW4gb3MuZW52aXJvbiddKQorQ0FOX1BBU1NfRU1QVFlfRU5WID0gZXZhbChjaGlsZC5vdXRwdXQpCisKKworIyBDaGVjayBpZiB0aGlzIHBsYXRmb3JtIGNhbiB1bnNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gY2hpbGQgcHJvY2Vzc2VzLgorIyBXZSBzZXQgYW4gZW52IHZhcmlhYmxlIHRvIGEgbm9uLWVtcHR5IHN0cmluZywgdW5zZXQgaXQsIGFuZCBpbnZva2UKKyMgYSBweXRob24gc2NyaXB0IGluIGEgc3VicHJvY2VzcyB0byBwcmludCB3aGV0aGVyIHRoZSB2YXJpYWJsZQorIyBpcyBOTyBMT05HRVIgaW4gb3MuZW52aXJvbi4KKyMgV2UgdXNlICdldmFsJyB0byBwYXJzZSB0aGUgY2hpbGQncyBvdXRwdXQgc28gdGhhdCBhbiBleGNlcHRpb24KKyMgaXMgdGhyb3duIGlmIHRoZSBpbnB1dCBpcyBuZWl0aGVyICdUcnVlJyBub3IgJ0ZhbHNlJy4KK29zLmVudmlyb25bJ1VOU0VUX1ZBUiddID0gJ1gnCitkZWwgb3MuZW52aXJvblsnVU5TRVRfVkFSJ10KK2NoaWxkID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgJ2ltcG9ydCBvczsgcHJpbnQgXCdVTlNFVF9WQVJcJyBub3QgaW4gb3MuZW52aXJvbiddKQorQ0FOX1VOU0VUX0VOViA9IGV2YWwoY2hpbGQub3V0cHV0KQorCisKKyMgQ2hlY2tzIGlmIHdlIHNob3VsZCB0ZXN0IHdpdGggYW4gZW1wdHkgZmlsdGVyLiBUaGlzIGRvZXNuJ3QKKyMgbWFrZSBzZW5zZSBvbiBwbGF0Zm9ybXMgdGhhdCBjYW5ub3QgcGFzcyBlbXB0eSBlbnYgdmFyaWFibGVzIChXaW4zMikKKyMgYW5kIG9uIHBsYXRmb3JtcyB0aGF0IGNhbm5vdCB1bnNldCB2YXJpYWJsZXMgKHNpbmNlIHdlIGNhbm5vdCB0ZWxsCisjIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIiIgYW5kIE5VTEwgLS0gQm9ybGFuZCBhbmQgU29sYXJpcyA8IDUuMTApCitDQU5fVEVTVF9FTVBUWV9GSUxURVIgPSAoQ0FOX1BBU1NfRU1QVFlfRU5WIGFuZCBDQU5fVU5TRVRfRU5WKQorCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBzcGVjaWZ5aW5nIHRoZSB0ZXN0IGZpbHRlcnMuCitGSUxURVJfRU5WX1ZBUiA9ICdHVEVTVF9GSUxURVInCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGVzdCBzaGFyZGluZy4KK1RPVEFMX1NIQVJEU19FTlZfVkFSID0gJ0dURVNUX1RPVEFMX1NIQVJEUycKK1NIQVJEX0lOREVYX0VOVl9WQVIgPSAnR1RFU1RfU0hBUkRfSU5ERVgnCitTSEFSRF9TVEFUVVNfRklMRV9FTlZfVkFSID0gJ0dURVNUX1NIQVJEX1NUQVRVU19GSUxFJworCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBmb3Igc3BlY2lmeWluZyB0aGUgdGVzdCBmaWx0ZXJzLgorRklMVEVSX0ZMQUcgPSAnZ3Rlc3RfZmlsdGVyJworCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBmb3IgaW5jbHVkaW5nIGRpc2FibGVkIHRlc3RzLgorQUxTT19SVU5fRElTQUJFRF9URVNUU19GTEFHID0gJ2d0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzJworCisjIENvbW1hbmQgdG8gcnVuIHRoZSBndGVzdF9maWx0ZXJfdW5pdHRlc3RfIHByb2dyYW0uCitDT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8nKQorCisjIFJlZ2V4IGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQgaW4gdGhlIGJpbmFyeS4KK1BBUkFNX1RFU1RfUkVHRVggPSByZS5jb21waWxlKHInL1BhcmFtVGVzdCcpCisKKyMgUmVnZXggZm9yIHBhcnNpbmcgdGVzdCBjYXNlIG5hbWVzIGZyb20gR29vZ2xlIFRlc3QncyBvdXRwdXQuCitURVNUX0NBU0VfUkVHRVggPSByZS5jb21waWxlKHInXlxbXC0rXF0gXGQrIHRlc3RzPyBmcm9tIChcdysoL1x3Kyk/KScpCisKKyMgUmVnZXggZm9yIHBhcnNpbmcgdGVzdCBuYW1lcyBmcm9tIEdvb2dsZSBUZXN0J3Mgb3V0cHV0LgorVEVTVF9SRUdFWCA9IHJlLmNvbXBpbGUocideXFtccypSVU5ccypcXS4qXC4oXHcrKC9cdyspPyknKQorCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyB0byB0ZWxsIEdvb2dsZSBUZXN0IHRvIG91dHB1dCB0aGUgbGlzdCBvZiB0ZXN0cyBpdAorIyB3aWxsIHJ1bi4KK0xJU1RfVEVTVFNfRkxBRyA9ICctLWd0ZXN0X2xpc3RfdGVzdHMnCisKKyMgSW5kaWNhdGVzIHdoZXRoZXIgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgZGVhdGggdGVzdHMuCitTVVBQT1JUU19ERUFUSF9URVNUUyA9ICdIYXNEZWF0aFRlc3QnIGluIGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKKyAgICBbQ09NTUFORCwgTElTVF9URVNUU19GTEFHXSkub3V0cHV0CisKKyMgRnVsbCBuYW1lcyBvZiBhbGwgdGVzdHMgaW4gZ3Rlc3RfZmlsdGVyX3VuaXR0ZXN0c18uCitQQVJBTV9URVNUUyA9IFsKKyAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMCcsCisgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzEnLAorICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8wJywKKyAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFkvMScsCisgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RYLzAnLAorICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WC8xJywKKyAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFkvMCcsCisgICAgJ1NlcVEvUGFyYW1UZXN0LlRlc3RZLzEnLAorICAgIF0KKworRElTQUJMRURfVEVTVFMgPSBbCisgICAgJ0JhclRlc3QuRElTQUJMRURfVGVzdEZvdXInLAorICAgICdCYXJUZXN0LkRJU0FCTEVEX1Rlc3RGaXZlJywKKyAgICAnQmF6VGVzdC5ESVNBQkxFRF9UZXN0QycsCisgICAgJ0RJU0FCTEVEX0Zvb2JhclRlc3QuVGVzdDEnLAorICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LkRJU0FCTEVEX1Rlc3QyJywKKyAgICAnRElTQUJMRURfRm9vYmFyYmF6VGVzdC5UZXN0QScsCisgICAgXQorCitpZiBTVVBQT1JUU19ERUFUSF9URVNUUzoKKyAgREVBVEhfVEVTVFMgPSBbCisgICAgJ0hhc0RlYXRoVGVzdC5UZXN0MScsCisgICAgJ0hhc0RlYXRoVGVzdC5UZXN0MicsCisgICAgXQorZWxzZToKKyAgREVBVEhfVEVTVFMgPSBbXQorCisjIEFsbCB0aGUgbm9uLWRpc2FibGVkIHRlc3RzLgorQUNUSVZFX1RFU1RTID0gWworICAgICdGb29UZXN0LkFiYycsCisgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICdCYXJUZXN0LlRlc3RPbmUnLAorICAgICdCYXJUZXN0LlRlc3RUd28nLAorICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisKKyAgICAnQmF6VGVzdC5UZXN0T25lJywKKyAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgJ0JhelRlc3QuVGVzdEInLAorICAgIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTCisKK3BhcmFtX3Rlc3RzX3ByZXNlbnQgPSBOb25lCisKKyMgVXRpbGl0aWVzLgorCitlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKworCitkZWYgU2V0RW52VmFyKGVudl92YXIsIHZhbHVlKToKKyAgIiIiU2V0cyB0aGUgZW52IHZhcmlhYmxlIHRvICd2YWx1ZSc7IHVuc2V0cyBpdCB3aGVuICd2YWx1ZScgaXMgTm9uZS4iIiIKKworICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICBlbnZpcm9uW2Vudl92YXJdID0gdmFsdWUKKyAgZWxpZiBlbnZfdmFyIGluIGVudmlyb246CisgICAgZGVsIGVudmlyb25bZW52X3Zhcl0KKworCitkZWYgUnVuQW5kUmV0dXJuT3V0cHV0KGFyZ3MgPSBOb25lKToKKyAgIiIiUnVucyB0aGUgdGVzdCBwcm9ncmFtIGFuZCByZXR1cm5zIGl0cyBvdXRwdXQuIiIiCisKKyAgcmV0dXJuIGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhbQ09NTUFORF0gKyAoYXJncyBvciBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudmlyb24pLm91dHB1dAorCisKK2RlZiBSdW5BbmRFeHRyYWN0VGVzdExpc3QoYXJncyA9IE5vbmUpOgorICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgaXRzIGV4aXQgY29kZSBhbmQgYSBsaXN0IG9mIHRlc3RzIHJ1bi4iIiIKKworICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtDT01NQU5EXSArIChhcmdzIG9yIFtdKSwgZW52PWVudmlyb24pCisgIHRlc3RzX3J1biA9IFtdCisgIHRlc3RfY2FzZSA9ICcnCisgIHRlc3QgPSAnJworICBmb3IgbGluZSBpbiBwLm91dHB1dC5zcGxpdCgnXG4nKToKKyAgICBtYXRjaCA9IFRFU1RfQ0FTRV9SRUdFWC5tYXRjaChsaW5lKQorICAgIGlmIG1hdGNoIGlzIG5vdCBOb25lOgorICAgICAgdGVzdF9jYXNlID0gbWF0Y2guZ3JvdXAoMSkKKyAgICBlbHNlOgorICAgICAgbWF0Y2ggPSBURVNUX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKKyAgICAgICAgdGVzdCA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIHRlc3RzX3J1bi5hcHBlbmQodGVzdF9jYXNlICsgJy4nICsgdGVzdCkKKyAgcmV0dXJuICh0ZXN0c19ydW4sIHAuZXhpdF9jb2RlKQorCisKK2RlZiBJbnZva2VXaXRoTW9kaWZpZWRFbnYoZXh0cmFfZW52LCBmdW5jdGlvbiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgIiIiUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYW5kIGFyZ3VtZW50cyBpbiBhIG1vZGlmaWVkIGVudmlyb25tZW50LiIiIgorICB0cnk6CisgICAgb3JpZ2luYWxfZW52ID0gZW52aXJvbi5jb3B5KCkKKyAgICBlbnZpcm9uLnVwZGF0ZShleHRyYV9lbnYpCisgICAgcmV0dXJuIGZ1bmN0aW9uKCphcmdzLCAqKmt3YXJncykKKyAgZmluYWxseToKKyAgICBlbnZpcm9uLmNsZWFyKCkKKyAgICBlbnZpcm9uLnVwZGF0ZShvcmlnaW5hbF9lbnYpCisKKworZGVmIFJ1bldpdGhTaGFyZGluZyh0b3RhbF9zaGFyZHMsIHNoYXJkX2luZGV4LCBjb21tYW5kKToKKyAgIiIiUnVucyBhIHRlc3QgcHJvZ3JhbSBzaGFyZCBhbmQgcmV0dXJucyBleGl0IGNvZGUgYW5kIGEgbGlzdCBvZiB0ZXN0cyBydW4uIiIiCisKKyAgZXh0cmFfZW52ID0ge1NIQVJEX0lOREVYX0VOVl9WQVI6IHN0cihzaGFyZF9pbmRleCksCisgICAgICAgICAgICAgICBUT1RBTF9TSEFSRFNfRU5WX1ZBUjogc3RyKHRvdGFsX3NoYXJkcyl9CisgIHJldHVybiBJbnZva2VXaXRoTW9kaWZpZWRFbnYoZXh0cmFfZW52LCBSdW5BbmRFeHRyYWN0VGVzdExpc3QsIGNvbW1hbmQpCisKKyMgVGhlIHVuaXQgdGVzdC4KKworCitjbGFzcyBHVGVzdEZpbHRlclVuaXRUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiJUZXN0cyB0aGUgZW52IHZhcmlhYmxlIG9yIHRoZSBjb21tYW5kIGxpbmUgZmxhZyB0byBmaWx0ZXIgdGVzdHMuIiIiCisKKyAgIyBVdGlsaXRpZXMuCisKKyAgZGVmIEFzc2VydFNldEVxdWFsKHNlbGYsIGxocywgcmhzKToKKyAgICAiIiJBc3NlcnRzIHRoYXQgdHdvIHNldHMgYXJlIGVxdWFsLiIiIgorCisgICAgZm9yIGVsZW0gaW4gbGhzOgorICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gaW4gcmhzLCAnJXMgaW4gJXMnICUgKGVsZW0sIHJocykpCisKKyAgICBmb3IgZWxlbSBpbiByaHM6CisgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBsaHMsICclcyBpbiAlcycgJSAoZWxlbSwgbGhzKSkKKworICBkZWYgQXNzZXJ0UGFydGl0aW9uSXNWYWxpZChzZWxmLCBzZXRfdmFyLCBsaXN0X29mX3NldHMpOgorICAgICIiIkFzc2VydHMgdGhhdCBsaXN0X29mX3NldHMgaXMgYSB2YWxpZCBwYXJ0aXRpb24gb2Ygc2V0X3Zhci4iIiIKKworICAgIGZ1bGxfcGFydGl0aW9uID0gW10KKyAgICBmb3Igc2xpY2VfdmFyIGluIGxpc3Rfb2Zfc2V0czoKKyAgICAgIGZ1bGxfcGFydGl0aW9uLmV4dGVuZChzbGljZV92YXIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0X3ZhciksIGxlbihmdWxsX3BhcnRpdGlvbikpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZXRzLlNldChzZXRfdmFyKSwgc2V0cy5TZXQoZnVsbF9wYXJ0aXRpb24pKQorCisgIGRlZiBBZGp1c3RGb3JQYXJhbWV0ZXJpemVkVGVzdHMoc2VsZiwgdGVzdHNfdG9fcnVuKToKKyAgICAiIiJBZGp1c3QgdGVzdHNfdG9fcnVuIGluIGNhc2UgdmFsdWUgcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZGlzYWJsZWQuIiIiCisKKyAgICBnbG9iYWwgcGFyYW1fdGVzdHNfcHJlc2VudAorICAgIGlmIG5vdCBwYXJhbV90ZXN0c19wcmVzZW50OgorICAgICAgcmV0dXJuIGxpc3Qoc2V0cy5TZXQodGVzdHNfdG9fcnVuKSAtIHNldHMuU2V0KFBBUkFNX1RFU1RTKSkKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIHRlc3RzX3RvX3J1bgorCisgIGRlZiBSdW5BbmRWZXJpZnkoc2VsZiwgZ3Rlc3RfZmlsdGVyLCB0ZXN0c190b19ydW4pOgorICAgICIiIkNoZWNrcyB0aGF0IHRoZSBiaW5hcnkgcnVucyBjb3JyZWN0IHNldCBvZiB0ZXN0cyBmb3IgYSBnaXZlbiBmaWx0ZXIuIiIiCisKKyAgICB0ZXN0c190b19ydW4gPSBzZWxmLkFkanVzdEZvclBhcmFtZXRlcml6ZWRUZXN0cyh0ZXN0c190b19ydW4pCisKKyAgICAjIEZpcnN0LCB0ZXN0cyB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyAgICAjIFdpbmRvd3MgcmVtb3ZlcyBlbXB0eSB2YXJpYWJsZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQgd2hlbiBwYXNzaW5nIGl0CisgICAgIyB0byBhIG5ldyBwcm9jZXNzLiAgVGhpcyBtZWFucyBpdCBpcyBpbXBvc3NpYmxlIHRvIHBhc3MgYW4gZW1wdHkgZmlsdGVyCisgICAgIyBpbnRvIGEgcHJvY2VzcyB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuICBIb3dldmVyLCB3ZSBjYW4gc3RpbGwKKyAgICAjIHRlc3QgdGhlIGNhc2Ugd2hlbiB0aGUgdmFyaWFibGUgaXMgbm90IHN1cHBsaWVkIChpLmUuLCBndGVzdF9maWx0ZXIgaXMKKyAgICAjIE5vbmUpLgorICAgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjQwMworICAgIGlmIENBTl9URVNUX0VNUFRZX0ZJTFRFUiBvciBndGVzdF9maWx0ZXIgIT0gJyc6CisgICAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsIGd0ZXN0X2ZpbHRlcikKKyAgICAgIHRlc3RzX3J1biA9IFJ1bkFuZEV4dHJhY3RUZXN0TGlzdCgpWzBdCisgICAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsIE5vbmUpCisgICAgICBzZWxmLkFzc2VydFNldEVxdWFsKHRlc3RzX3J1biwgdGVzdHNfdG9fcnVuKQorICAgICMgcHlsaW50OiBlbmFibGUtbXNnPUM2NDAzCisKKyAgICAjIE5leHQsIHRlc3RzIHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgZmxhZy4KKworICAgIGlmIGd0ZXN0X2ZpbHRlciBpcyBOb25lOgorICAgICAgYXJncyA9IFtdCisgICAgZWxzZToKKyAgICAgIGFyZ3MgPSBbJy0tJXM9JXMnICUgKEZJTFRFUl9GTEFHLCBndGVzdF9maWx0ZXIpXQorCisgICAgdGVzdHNfcnVuID0gUnVuQW5kRXh0cmFjdFRlc3RMaXN0KGFyZ3MpWzBdCisgICAgc2VsZi5Bc3NlcnRTZXRFcXVhbCh0ZXN0c19ydW4sIHRlc3RzX3RvX3J1bikKKworICBkZWYgUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKHNlbGYsIGd0ZXN0X2ZpbHRlciwgdG90YWxfc2hhcmRzLCB0ZXN0c190b19ydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz1Ob25lLCBjaGVja19leGl0XzA9RmFsc2UpOgorICAgICIiIkNoZWNrcyB0aGF0IGJpbmFyeSBydW5zIGNvcnJlY3QgdGVzdHMgZm9yIHRoZSBnaXZlbiBmaWx0ZXIgYW5kIHNoYXJkLgorCisgICAgUnVucyBhbGwgc2hhcmRzIG9mIGd0ZXN0X2ZpbHRlcl91bml0dGVzdF8gd2l0aCB0aGUgZ2l2ZW4gZmlsdGVyLCBhbmQKKyAgICB2ZXJpZmllcyB0aGF0IHRoZSByaWdodCBzZXQgb2YgdGVzdHMgd2VyZSBydW4uIFRoZSB1bmlvbiBvZiB0ZXN0cyBydW4KKyAgICBvbiBlYWNoIHNoYXJkIHNob3VsZCBiZSBpZGVudGljYWwgdG8gdGVzdHNfdG9fcnVuLCB3aXRob3V0IGR1cGxpY2F0ZXMuCisKKyAgICBBcmdzOgorICAgICAgZ3Rlc3RfZmlsdGVyOiBBIGZpbHRlciB0byBhcHBseSB0byB0aGUgdGVzdHMuCisgICAgICB0b3RhbF9zaGFyZHM6IEEgdG90YWwgbnVtYmVyIG9mIHNoYXJkcyB0byBzcGxpdCB0ZXN0IHJ1biBpbnRvLgorICAgICAgdGVzdHNfdG9fcnVuOiBBIHNldCBvZiB0ZXN0cyBleHBlY3RlZCB0byBydW4uCisgICAgICBhcmdzICAgOiAgICAgIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0byB0aGUgdGVzdCBiaW5hcnkuCisgICAgICBjaGVja19leGl0XzA6IFdoZW4gc2V0IHRvIGEgdHJ1ZSB2YWx1ZSwgbWFrZSBzdXJlIHRoYXQgYWxsIHNoYXJkcworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMC4KKyAgICAiIiIKKworICAgIHRlc3RzX3RvX3J1biA9IHNlbGYuQWRqdXN0Rm9yUGFyYW1ldGVyaXplZFRlc3RzKHRlc3RzX3RvX3J1bikKKworICAgICMgV2luZG93cyByZW1vdmVzIGVtcHR5IHZhcmlhYmxlcyBmcm9tIHRoZSBlbnZpcm9ubWVudCB3aGVuIHBhc3NpbmcgaXQKKyAgICAjIHRvIGEgbmV3IHByb2Nlc3MuICBUaGlzIG1lYW5zIGl0IGlzIGltcG9zc2libGUgdG8gcGFzcyBhbiBlbXB0eSBmaWx0ZXIKKyAgICAjIGludG8gYSBwcm9jZXNzIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEhvd2V2ZXIsIHdlIGNhbiBzdGlsbAorICAgICMgdGVzdCB0aGUgY2FzZSB3aGVuIHRoZSB2YXJpYWJsZSBpcyBub3Qgc3VwcGxpZWQgKGkuZS4sIGd0ZXN0X2ZpbHRlciBpcworICAgICMgTm9uZSkuCisgICAgIyBweWxpbnQ6IGRpc2FibGUtbXNnPUM2NDAzCisgICAgaWYgQ0FOX1RFU1RfRU1QVFlfRklMVEVSIG9yIGd0ZXN0X2ZpbHRlciAhPSAnJzoKKyAgICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgZ3Rlc3RfZmlsdGVyKQorICAgICAgcGFydGl0aW9uID0gW10KKyAgICAgIGZvciBpIGluIHJhbmdlKDAsIHRvdGFsX3NoYXJkcyk6CisgICAgICAgICh0ZXN0c19ydW4sIGV4aXRfY29kZSkgPSBSdW5XaXRoU2hhcmRpbmcodG90YWxfc2hhcmRzLCBpLCBhcmdzKQorICAgICAgICBpZiBjaGVja19leGl0XzA6CisgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBleGl0X2NvZGUpCisgICAgICAgIHBhcnRpdGlvbi5hcHBlbmQodGVzdHNfcnVuKQorCisgICAgICBzZWxmLkFzc2VydFBhcnRpdGlvbklzVmFsaWQodGVzdHNfdG9fcnVuLCBwYXJ0aXRpb24pCisgICAgICBTZXRFbnZWYXIoRklMVEVSX0VOVl9WQVIsIE5vbmUpCisgICAgIyBweWxpbnQ6IGVuYWJsZS1tc2c9QzY0MDMKKworICBkZWYgUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZChzZWxmLCBndGVzdF9maWx0ZXIsIHRlc3RzX3RvX3J1bik6CisgICAgIiIiQ2hlY2tzIHRoYXQgdGhlIGJpbmFyeSBydW5zIGNvcnJlY3Qgc2V0IG9mIHRlc3RzIGZvciB0aGUgZ2l2ZW4gZmlsdGVyLgorCisgICAgUnVucyBndGVzdF9maWx0ZXJfdW5pdHRlc3RfIHdpdGggdGhlIGdpdmVuIGZpbHRlciwgYW5kIGVuYWJsZXMKKyAgICBkaXNhYmxlZCB0ZXN0cy4gVmVyaWZpZXMgdGhhdCB0aGUgcmlnaHQgc2V0IG9mIHRlc3RzIHdlcmUgcnVuLgorCisgICAgQXJnczoKKyAgICAgIGd0ZXN0X2ZpbHRlcjogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gdGhlIHRlc3RzLgorICAgICAgdGVzdHNfdG9fcnVuOiBBIHNldCBvZiB0ZXN0cyBleHBlY3RlZCB0byBydW4uCisgICAgIiIiCisKKyAgICB0ZXN0c190b19ydW4gPSBzZWxmLkFkanVzdEZvclBhcmFtZXRlcml6ZWRUZXN0cyh0ZXN0c190b19ydW4pCisKKyAgICAjIENvbnN0cnVjdCB0aGUgY29tbWFuZCBsaW5lLgorICAgIGFyZ3MgPSBbJy0tJXMnICUgQUxTT19SVU5fRElTQUJFRF9URVNUU19GTEFHXQorICAgIGlmIGd0ZXN0X2ZpbHRlciBpcyBub3QgTm9uZToKKyAgICAgIGFyZ3MuYXBwZW5kKCctLSVzPSVzJyAlIChGSUxURVJfRkxBRywgZ3Rlc3RfZmlsdGVyKSkKKworICAgIHRlc3RzX3J1biA9IFJ1bkFuZEV4dHJhY3RUZXN0TGlzdChhcmdzKVswXQorICAgIHNlbGYuQXNzZXJ0U2V0RXF1YWwodGVzdHNfcnVuLCB0ZXN0c190b19ydW4pCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgICIiIlNldHMgdXAgdGVzdCBjYXNlLgorCisgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQgaW4gdGhlIGJpbmFyeSBhbmQKKyAgICBzZXRzIHRoZSBmbGFncyBhY2NvcmRpbmdseS4KKyAgICAiIiIKKworICAgIGdsb2JhbCBwYXJhbV90ZXN0c19wcmVzZW50CisgICAgaWYgcGFyYW1fdGVzdHNfcHJlc2VudCBpcyBOb25lOgorICAgICAgcGFyYW1fdGVzdHNfcHJlc2VudCA9IFBBUkFNX1RFU1RfUkVHRVguc2VhcmNoKAorICAgICAgICAgIFJ1bkFuZFJldHVybk91dHB1dCgpKSBpcyBub3QgTm9uZQorCisgIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBiZWhhdmlvciBvZiBub3Qgc3BlY2lmeWluZyB0aGUgZmlsdGVyLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoTm9uZSwgQUNUSVZFX1RFU1RTKQorCisgIGRlZiB0ZXN0RGVmYXVsdEJlaGF2aW9yV2l0aFNoYXJkcyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgYmVoYXZpb3Igd2l0aG91dCB0aGUgZmlsdGVyLCB3aXRoIHNoYXJkaW5nIGVuYWJsZWQuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhOb25lLCAxLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgMiwgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKE5vbmUsIGxlbihBQ1RJVkVfVEVTVFMpIC0gMSwgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKE5vbmUsIGxlbihBQ1RJVkVfVEVTVFMpLCBBQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoTm9uZSwgbGVuKEFDVElWRV9URVNUUykgKyAxLCBBQ1RJVkVfVEVTVFMpCisKKyAgZGVmIHRlc3RFbXB0eUZpbHRlcihzZWxmKToKKyAgICAiIiJUZXN0cyBhbiBlbXB0eSBmaWx0ZXIuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnJywgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlXaXRoU2hhcmRpbmcoJycsIDEsIFtdKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKCcnLCAyLCBbXSkKKworICBkZWYgdGVzdEJhZEZpbHRlcihzZWxmKToKKyAgICAiIiJUZXN0cyBhIGZpbHRlciB0aGF0IG1hdGNoZXMgbm90aGluZy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdCYWRGaWx0ZXInLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0JhZEZpbHRlcicsIFtdKQorCisgIGRlZiB0ZXN0RnVsbE5hbWUoc2VsZik6CisgICAgIiIiVGVzdHMgZmlsdGVyaW5nIGJ5IGZ1bGwgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdGb29UZXN0Llh5eicsIFsnRm9vVGVzdC5YeXonXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJ0Zvb1Rlc3QuWHl6JywgWydGb29UZXN0Llh5eiddKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKCdGb29UZXN0Llh5eicsIDUsIFsnRm9vVGVzdC5YeXonXSkKKworICBkZWYgdGVzdFVuaXZlcnNhbEZpbHRlcnMoc2VsZik6CisgICAgIiIiVGVzdHMgZmlsdGVycyB0aGF0IG1hdGNoIGV2ZXJ5dGhpbmcuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKicsIEFDVElWRV9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi4qJywgQUNUSVZFX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKCcqLionLCBsZW4oQUNUSVZFX1RFU1RTKSAtIDMsIEFDVElWRV9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJyonLCBBQ1RJVkVfVEVTVFMgKyBESVNBQkxFRF9URVNUUykKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJyouKicsIEFDVElWRV9URVNUUyArIERJU0FCTEVEX1RFU1RTKQorCisgIGRlZiB0ZXN0RmlsdGVyQnlUZXN0Q2FzZShzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJpbmcgYnkgdGVzdCBjYXNlIG5hbWUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnRm9vVGVzdC4qJywgWydGb29UZXN0LkFiYycsICdGb29UZXN0Llh5eiddKQorCisgICAgQkFaX1RFU1RTID0gWydCYXpUZXN0LlRlc3RPbmUnLCAnQmF6VGVzdC5UZXN0QScsICdCYXpUZXN0LlRlc3RCJ10KKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnQmF6VGVzdC4qJywgQkFaX1RFU1RTKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5QWxsb3dpbmdEaXNhYmxlZCgnQmF6VGVzdC4qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFaX1RFU1RTICsgWydCYXpUZXN0LkRJU0FCTEVEX1Rlc3RDJ10pCisKKyAgZGVmIHRlc3RGaWx0ZXJCeVRlc3Qoc2VsZik6CisgICAgIiIiVGVzdHMgZmlsdGVyaW5nIGJ5IHRlc3QgbmFtZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLlRlc3RPbmUnLCBbJ0JhclRlc3QuVGVzdE9uZScsICdCYXpUZXN0LlRlc3RPbmUnXSkKKworICBkZWYgdGVzdEZpbHRlckRpc2FibGVkVGVzdHMoc2VsZik6CisgICAgIiIiU2VsZWN0IG9ubHkgdGhlIGRpc2FibGVkIHRlc3RzIHRvIHJ1bi4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJywgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCdESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydESVNBQkxFRF9Gb29iYXJUZXN0LlRlc3QxJ10pCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKkRJU0FCTEVEXyonLCBbXSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeUFsbG93aW5nRGlzYWJsZWQoJypESVNBQkxFRF8qJywgRElTQUJMRURfVEVTVFMpCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi5ESVNBQkxFRF8qJywgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCcqLkRJU0FCTEVEXyonLCBbCisgICAgICAgICdCYXJUZXN0LkRJU0FCTEVEX1Rlc3RGb3VyJywKKyAgICAgICAgJ0JhclRlc3QuRElTQUJMRURfVGVzdEZpdmUnLAorICAgICAgICAnQmF6VGVzdC5ESVNBQkxFRF9UZXN0QycsCisgICAgICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LkRJU0FCTEVEX1Rlc3QyJywKKyAgICAgICAgXSkKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCdESVNBQkxFRF8qJywgW10pCisgICAgc2VsZi5SdW5BbmRWZXJpZnlBbGxvd2luZ0Rpc2FibGVkKCdESVNBQkxFRF8qJywgWworICAgICAgICAnRElTQUJMRURfRm9vYmFyVGVzdC5UZXN0MScsCisgICAgICAgICdESVNBQkxFRF9Gb29iYXJUZXN0LkRJU0FCTEVEX1Rlc3QyJywKKyAgICAgICAgJ0RJU0FCTEVEX0Zvb2JhcmJhelRlc3QuVGVzdEEnLAorICAgICAgICBdKQorCisgIGRlZiB0ZXN0V2lsZGNhcmRJblRlc3RDYXNlTmFtZShzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyB3aWxkY2FyZCBpbiB0aGUgdGVzdCBjYXNlIG5hbWUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKmEqLionLCBbCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmFyVGVzdC5UZXN0VHdvJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFRocmVlJywKKworICAgICAgICAnQmF6VGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhelRlc3QuVGVzdEEnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QicsIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTKQorCisgIGRlZiB0ZXN0V2lsZGNhcmRJblRlc3ROYW1lKHNlbGYpOgorICAgICIiIlRlc3RzIHVzaW5nIHdpbGRjYXJkIGluIHRoZSB0ZXN0IG5hbWUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi4qQSonLCBbJ0Zvb1Rlc3QuQWJjJywgJ0JhelRlc3QuVGVzdEEnXSkKKworICBkZWYgdGVzdEZpbHRlcldpdGhvdXREb3Qoc2VsZik6CisgICAgIiIiVGVzdHMgYSBmaWx0ZXIgdGhhdCBoYXMgbm8gJy4nIGluIGl0LiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJyp6KicsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmF6VGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhelRlc3QuVGVzdEEnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QicsCisgICAgICAgIF0pCisKKyAgZGVmIHRlc3RUd29QYXR0ZXJucyhzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJzIHRoYXQgY29uc2lzdCBvZiB0d28gcGF0dGVybnMuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnRm9vKi4qOipBKicsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgICAgIF0pCisKKyAgICAjIEFuIGVtcHR5IHBhdHRlcm4gKyBhIG5vbi1lbXB0eSBvbmUKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnOipBKicsIFsnRm9vVGVzdC5BYmMnLCAnQmF6VGVzdC5UZXN0QSddKQorCisgIGRlZiB0ZXN0VGhyZWVQYXR0ZXJucyhzZWxmKToKKyAgICAiIiJUZXN0cyBmaWx0ZXJzIHRoYXQgY29uc2lzdCBvZiB0aHJlZSBwYXR0ZXJucy4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqb28qOipBKjoqT25lJywgWworICAgICAgICAnRm9vVGVzdC5BYmMnLAorICAgICAgICAnRm9vVGVzdC5YeXonLAorCisgICAgICAgICdCYXJUZXN0LlRlc3RPbmUnLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RPbmUnLAorICAgICAgICAnQmF6VGVzdC5UZXN0QScsCisgICAgICAgIF0pCisKKyAgICAjIFRoZSAybmQgcGF0dGVybiBpcyBlbXB0eS4KKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKm9vKjo6Kk9uZScsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKKworICAgICAgICAnQmF6VGVzdC5UZXN0T25lJywKKyAgICAgICAgXSkKKworICAgICMgVGhlIGxhc3QgMiBwYXR0ZXJucyBhcmUgZW1wdHkuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJypvbyo6OicsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuQWJjJywKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKyAgICAgICAgXSkKKworICBkZWYgdGVzdE5lZ2F0aXZlRmlsdGVycyhzZWxmKToKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeSgnKi1CYXpUZXN0LlRlc3RPbmUnLCBbCisgICAgICAgICdGb29UZXN0LkFiYycsCisgICAgICAgICdGb29UZXN0Llh5eicsCisKKyAgICAgICAgJ0JhclRlc3QuVGVzdE9uZScsCisgICAgICAgICdCYXJUZXN0LlRlc3RUd28nLAorICAgICAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAorCisgICAgICAgICdCYXpUZXN0LlRlc3RBJywKKyAgICAgICAgJ0JhelRlc3QuVGVzdEInLAorICAgICAgICBdICsgREVBVEhfVEVTVFMgKyBQQVJBTV9URVNUUykKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLUZvb1Rlc3QuQWJjOkJhelRlc3QuKicsIFsKKyAgICAgICAgJ0Zvb1Rlc3QuWHl6JywKKworICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisgICAgICAgIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTKQorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ0JhclRlc3QuKi1CYXJUZXN0LlRlc3RPbmUnLCBbCisgICAgICAgICdCYXJUZXN0LlRlc3RUd28nLAorICAgICAgICAnQmFyVGVzdC5UZXN0VGhyZWUnLAorICAgICAgICBdKQorCisgICAgIyBUZXN0cyB3aXRob3V0IGxlYWRpbmcgJyonLgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCctRm9vVGVzdC5BYmM6Rm9vVGVzdC5YeXo6QmF6VGVzdC4qJywgWworICAgICAgICAnQmFyVGVzdC5UZXN0T25lJywKKyAgICAgICAgJ0JhclRlc3QuVGVzdFR3bycsCisgICAgICAgICdCYXJUZXN0LlRlc3RUaHJlZScsCisgICAgICAgIF0gKyBERUFUSF9URVNUUyArIFBBUkFNX1RFU1RTKQorCisgICAgIyBWYWx1ZSBwYXJhbWV0ZXJpemVkIHRlc3RzLgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLyonLCBQQVJBTV9URVNUUykKKworICAgICMgVmFsdWUgcGFyYW1ldGVyaXplZCB0ZXN0cyBmaWx0ZXJpbmcgYnkgdGhlIHNlcXVlbmNlIG5hbWUuCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoJ1NlcVAvKicsIFsKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RYLzAnLAorICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMScsCisgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8wJywKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzEnLAorICAgICAgICBdKQorCisgICAgIyBWYWx1ZSBwYXJhbWV0ZXJpemVkIHRlc3RzIGZpbHRlcmluZyBieSB0aGUgdGVzdCBuYW1lLgorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KCcqLzAnLCBbCisgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8wJywKKyAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICAgICAnU2VxUS9QYXJhbVRlc3QuVGVzdFgvMCcsCisgICAgICAgICdTZXFRL1BhcmFtVGVzdC5UZXN0WS8wJywKKyAgICAgICAgXSkKKworICBkZWYgdGVzdEZsYWdPdmVycmlkZXNFbnZWYXIoc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCB0aGUgZmlsdGVyIGZsYWcgb3ZlcnJpZGVzIHRoZSBmaWx0ZXJpbmcgZW52LiB2YXJpYWJsZS4iIiIKKworICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgJ0ZvbyonKQorICAgIGFyZ3MgPSBbJy0tJXM9JXMnICUgKEZJTFRFUl9GTEFHLCAnKk9uZScpXQorICAgIHRlc3RzX3J1biA9IFJ1bkFuZEV4dHJhY3RUZXN0TGlzdChhcmdzKVswXQorICAgIFNldEVudlZhcihGSUxURVJfRU5WX1ZBUiwgTm9uZSkKKworICAgIHNlbGYuQXNzZXJ0U2V0RXF1YWwodGVzdHNfcnVuLCBbJ0JhclRlc3QuVGVzdE9uZScsICdCYXpUZXN0LlRlc3RPbmUnXSkKKworICBkZWYgdGVzdFNoYXJkU3RhdHVzRmlsZUlzQ3JlYXRlZChzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHRoZSBzaGFyZCBmaWxlIGlzIGNyZWF0ZWQgaWYgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudC4iIiIKKworICAgIHNoYXJkX3N0YXR1c19maWxlID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGFyZF9zdGF0dXNfZmlsZScpCisgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzaGFyZF9zdGF0dXNfZmlsZSkpCisKKyAgICBleHRyYV9lbnYgPSB7U0hBUkRfU1RBVFVTX0ZJTEVfRU5WX1ZBUjogc2hhcmRfc3RhdHVzX2ZpbGV9CisgICAgdHJ5OgorICAgICAgSW52b2tlV2l0aE1vZGlmaWVkRW52KGV4dHJhX2VudiwgUnVuQW5kUmV0dXJuT3V0cHV0KQorICAgIGZpbmFsbHk6CisgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoc2hhcmRfc3RhdHVzX2ZpbGUpKQorICAgICAgb3MucmVtb3ZlKHNoYXJkX3N0YXR1c19maWxlKQorCisgIGRlZiB0ZXN0U2hhcmRTdGF0dXNGaWxlSXNDcmVhdGVkV2l0aExpc3RUZXN0cyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHRoZSBzaGFyZCBmaWxlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgImxpc3RfdGVzdHMiIGZsYWcuIiIiCisKKyAgICBzaGFyZF9zdGF0dXNfZmlsZSA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhcmRfc3RhdHVzX2ZpbGUyJykKKyAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHNoYXJkX3N0YXR1c19maWxlKSkKKworICAgIGV4dHJhX2VudiA9IHtTSEFSRF9TVEFUVVNfRklMRV9FTlZfVkFSOiBzaGFyZF9zdGF0dXNfZmlsZX0KKyAgICB0cnk6CisgICAgICBvdXRwdXQgPSBJbnZva2VXaXRoTW9kaWZpZWRFbnYoZXh0cmFfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkFuZFJldHVybk91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTElTVF9URVNUU19GTEFHXSkKKyAgICBmaW5hbGx5OgorICAgICAgIyBUaGlzIGFzc2VydGlvbiBlbnN1cmVzIHRoYXQgR29vZ2xlIFRlc3QgZW51bWVyYXRlZCB0aGUgdGVzdHMgYXMKKyAgICAgICMgb3Bwb3NlZCB0byBydW5uaW5nIHRoZW0uCisgICAgICBzZWxmLmFzc2VydF8oJ1s9PT09PT09PT09XScgbm90IGluIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBvdXRwdXQgZHVyaW5nIHRlc3QgZW51bWVyYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBlbnN1cmUgdGhhdCBMSVNUX1RFU1RTX0ZMQUcgaXMgYXNzaWduZWQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ2NvcnJlY3QgZmxhZyB2YWx1ZSBmb3IgbGlzdGluZyBHb29nbGUgVGVzdCB0ZXN0cy4nKQorCisgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoc2hhcmRfc3RhdHVzX2ZpbGUpKQorICAgICAgb3MucmVtb3ZlKHNoYXJkX3N0YXR1c19maWxlKQorCisgIGlmIFNVUFBPUlRTX0RFQVRIX1RFU1RTOgorICAgIGRlZiB0ZXN0U2hhcmRpbmdXb3Jrc1dpdGhEZWF0aFRlc3RzKHNlbGYpOgorICAgICAgIiIiVGVzdHMgaW50ZWdyYXRpb24gd2l0aCBkZWF0aCB0ZXN0cyBhbmQgc2hhcmRpbmcuIiIiCisKKyAgICAgIGd0ZXN0X2ZpbHRlciA9ICdIYXNEZWF0aFRlc3QuKjpTZXFQLyonCisgICAgICBleHBlY3RlZF90ZXN0cyA9IFsKKyAgICAgICAgICAnSGFzRGVhdGhUZXN0LlRlc3QxJywKKyAgICAgICAgICAnSGFzRGVhdGhUZXN0LlRlc3QyJywKKworICAgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WC8wJywKKyAgICAgICAgICAnU2VxUC9QYXJhbVRlc3QuVGVzdFgvMScsCisgICAgICAgICAgJ1NlcVAvUGFyYW1UZXN0LlRlc3RZLzAnLAorICAgICAgICAgICdTZXFQL1BhcmFtVGVzdC5UZXN0WS8xJywKKyAgICAgICAgICBdCisKKyAgICAgIGZvciBmbGFnIGluIFsnLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPXRocmVhZHNhZmUnLAorICAgICAgICAgICAgICAgICAgICctLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9ZmFzdCddOgorICAgICAgICBzZWxmLlJ1bkFuZFZlcmlmeVdpdGhTaGFyZGluZyhndGVzdF9maWx0ZXIsIDMsIGV4cGVjdGVkX3Rlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGl0XzA9VHJ1ZSwgYXJncz1bZmxhZ10pCisgICAgICAgIHNlbGYuUnVuQW5kVmVyaWZ5V2l0aFNoYXJkaW5nKGd0ZXN0X2ZpbHRlciwgNSwgZXhwZWN0ZWRfdGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2V4aXRfMD1UcnVlLCBhcmdzPVtmbGFnXSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2ZpbHRlcl91bml0dGVzdF8uY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGVmZmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9maWx0ZXJfdW5pdHRlc3RfLmNjCkBAIC0wLDAgKzEsMTQwIEBACisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0IHRlc3QgZmlsdGVycy4KKy8vCisvLyBBIHVzZXIgY2FuIHNwZWNpZnkgd2hpY2ggdGVzdChzKSBpbiBhIEdvb2dsZSBUZXN0IHByb2dyYW0gdG8gcnVuIHZpYQorLy8gZWl0aGVyIHRoZSBHVEVTVF9GSUxURVIgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlIC0tZ3Rlc3RfZmlsdGVyCisvLyBmbGFnLiAgVGhpcyBpcyB1c2VkIGZvciB0ZXN0aW5nIHN1Y2ggZnVuY3Rpb25hbGl0eS4KKy8vCisvLyBUaGUgcHJvZ3JhbSB3aWxsIGJlIGludm9rZWQgZnJvbSBhIFB5dGhvbiB1bml0IHRlc3QuICBEb24ndCBydW4gaXQKKy8vIGRpcmVjdGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworLy8gVGVzdCBjYXNlIEZvb1Rlc3QuCisKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoRm9vVGVzdCwgQWJjKSB7Cit9CisKK1RFU1RfRihGb29UZXN0LCBYeXopIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3QgY2FzZSBCYXJUZXN0LgorCitURVNUKEJhclRlc3QsIFRlc3RPbmUpIHsKK30KKworVEVTVChCYXJUZXN0LCBUZXN0VHdvKSB7Cit9CisKK1RFU1QoQmFyVGVzdCwgVGVzdFRocmVlKSB7Cit9CisKK1RFU1QoQmFyVGVzdCwgRElTQUJMRURfVGVzdEZvdXIpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKK1RFU1QoQmFyVGVzdCwgRElTQUJMRURfVGVzdEZpdmUpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3QgY2FzZSBCYXpUZXN0LgorCitURVNUKEJhelRlc3QsIFRlc3RPbmUpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKK1RFU1QoQmF6VGVzdCwgVGVzdEEpIHsKK30KKworVEVTVChCYXpUZXN0LCBUZXN0QikgeworfQorCitURVNUKEJhelRlc3QsIERJU0FCTEVEX1Rlc3RDKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iOworfQorCisvLyBUZXN0IGNhc2UgSGFzRGVhdGhUZXN0CisKK1RFU1QoSGFzRGVhdGhUZXN0LCBUZXN0MSkgeworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKGV4aXQoMSksICIuKiIpOworfQorCisvLyBXZSBuZWVkIGF0IGxlYXN0IHR3byBkZWF0aCB0ZXN0cyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYWxsIGRlYXRoIHRlc3RzCisvLyBhcmVuJ3Qgb24gdGhlIGZpcnN0IHNoYXJkLgorVEVTVChIYXNEZWF0aFRlc3QsIFRlc3QyKSB7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoZXhpdCgxKSwgIi4qIik7Cit9CisKKy8vIFRlc3QgY2FzZSBGb29iYXJUZXN0CisKK1RFU1QoRElTQUJMRURfRm9vYmFyVGVzdCwgVGVzdDEpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKK1RFU1QoRElTQUJMRURfRm9vYmFyVGVzdCwgRElTQUJMRURfVGVzdDIpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3QgY2FzZSBGb29iYXJiYXpUZXN0CisKK1RFU1QoRElTQUJMRURfRm9vYmFyYmF6VGVzdCwgVGVzdEEpIHsKKyAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlLiI7Cit9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorY2xhc3MgUGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Cit9OworCitURVNUX1AoUGFyYW1UZXN0LCBUZXN0WCkgeworfQorCitURVNUX1AoUGFyYW1UZXN0LCBUZXN0WSkgeworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXFQLCBQYXJhbVRlc3QsIHRlc3Rpbmc6OlZhbHVlcygxLCAyKSk7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTZXFRLCBQYXJhbVRlc3QsIHRlc3Rpbmc6OlZhbHVlcyg1LCA2KSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdC5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOTNjODM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfaGVscF90ZXN0LnB5CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJUZXN0cyB0aGUgLS1oZWxwIGZsYWcgb2YgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yay4KKworU1lOT1BTSVMKKyAgICAgICBndGVzdF9oZWxwX3Rlc3QucHkgLS1idWlsZF9kaXI9QlVJTEQvRElSCisgICAgICAgICAjIHdoZXJlIEJVSUxEL0RJUiBjb250YWlucyB0aGUgYnVpbHQgZ3Rlc3RfaGVscF90ZXN0XyBmaWxlLgorICAgICAgIGd0ZXN0X2hlbHBfdGVzdC5weQorIiIiCisKK19fYXV0aG9yX18gPSAnd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiknCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKK0lTX0xJTlVYID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCBvcy51bmFtZSgpWzBdID09ICdMaW51eCcKK0lTX1dJTkRPV1MgPSBvcy5uYW1lID09ICdudCcKKworUFJPR1JBTV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2hlbHBfdGVzdF8nKQorRkxBR19QUkVGSVggPSAnLS1ndGVzdF8nCitERUFUSF9URVNUX1NUWUxFX0ZMQUcgPSBGTEFHX1BSRUZJWCArICdkZWF0aF90ZXN0X3N0eWxlJworU1RSRUFNX1JFU1VMVF9UT19GTEFHID0gRkxBR19QUkVGSVggKyAnc3RyZWFtX3Jlc3VsdF90bycKK1VOS05PV05fRkxBRyA9IEZMQUdfUFJFRklYICsgJ3Vua25vd25fZmxhZ19mb3JfdGVzdGluZycKK0xJU1RfVEVTVFNfRkxBRyA9IEZMQUdfUFJFRklYICsgJ2xpc3RfdGVzdHMnCitJTkNPUlJFQ1RfRkxBR19WQVJJQU5UUyA9IFtyZS5zdWIoJ14tLScsICctJywgTElTVF9URVNUU19GTEFHKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLnN1YignXi0tJywgJy8nLCBMSVNUX1RFU1RTX0ZMQUcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuc3ViKCdfJywgJy0nLCBMSVNUX1RFU1RTX0ZMQUcpXQorSU5URVJOQUxfRkxBR19GT1JfVEVTVElORyA9IEZMQUdfUFJFRklYICsgJ2ludGVybmFsX2ZsYWdfZm9yX3Rlc3RpbmcnCisKK1NVUFBPUlRTX0RFQVRIX1RFU1RTID0gIkRlYXRoVGVzdCIgaW4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtQUk9HUkFNX1BBVEgsIExJU1RfVEVTVFNfRkxBR10pLm91dHB1dAorCisjIFRoZSBoZWxwIG1lc3NhZ2UgbXVzdCBtYXRjaCB0aGlzIHJlZ2V4LgorSEVMUF9SRUdFWCA9IHJlLmNvbXBpbGUoCisgICAgRkxBR19QUkVGSVggKyByJ2xpc3RfdGVzdHMuKicgKworICAgIEZMQUdfUFJFRklYICsgcidmaWx0ZXI9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHInYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMuKicgKworICAgIEZMQUdfUFJFRklYICsgcidyZXBlYXQ9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHInc2h1ZmZsZS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ3JhbmRvbV9zZWVkPS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ2NvbG9yPS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ3ByaW50X3RpbWUuKicgKworICAgIEZMQUdfUFJFRklYICsgcidvdXRwdXQ9LionICsKKyAgICBGTEFHX1BSRUZJWCArIHInYnJlYWtfb25fZmFpbHVyZS4qJyArCisgICAgRkxBR19QUkVGSVggKyByJ3Rocm93X29uX2ZhaWx1cmUuKicgKworICAgIEZMQUdfUFJFRklYICsgcidjYXRjaF9leGNlcHRpb25zPTAuKicsCisgICAgcmUuRE9UQUxMKQorCisKK2RlZiBSdW5XaXRoRmxhZyhmbGFnKToKKyAgIiIiUnVucyBndGVzdF9oZWxwX3Rlc3RfIHdpdGggdGhlIGdpdmVuIGZsYWcuCisKKyAgUmV0dXJuczoKKyAgICB0aGUgZXhpdCBjb2RlIGFuZCB0aGUgdGV4dCBvdXRwdXQgYXMgYSB0dXBsZS4KKyAgQXJnczoKKyAgICBmbGFnOiB0aGUgY29tbWFuZC1saW5lIGZsYWcgdG8gcGFzcyB0byBndGVzdF9oZWxwX3Rlc3RfLCBvciBOb25lLgorICAiIiIKKworICBpZiBmbGFnIGlzIE5vbmU6CisgICAgY29tbWFuZCA9IFtQUk9HUkFNX1BBVEhdCisgIGVsc2U6CisgICAgY29tbWFuZCA9IFtQUk9HUkFNX1BBVEgsIGZsYWddCisgIGNoaWxkID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCisgIHJldHVybiBjaGlsZC5leGl0X2NvZGUsIGNoaWxkLm91dHB1dAorCisKK2NsYXNzIEdUZXN0SGVscFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRoZSAtLWhlbHAgZmxhZyBhbmQgaXRzIGVxdWl2YWxlbnQgZm9ybXMuIiIiCisKKyAgZGVmIFRlc3RIZWxwRmxhZyhzZWxmLCBmbGFnKToKKyAgICAiIiJWZXJpZmllcyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gaGVscCBmbGFnIGlzIHNwZWNpZmllZC4KKworICAgIFRoZSByaWdodCBtZXNzYWdlIG11c3QgYmUgcHJpbnRlZCBhbmQgdGhlIHRlc3RzIG11c3QKKyAgICBza2lwcGVkIHdoZW4gdGhlIGdpdmVuIGZsYWcgaXMgc3BlY2lmaWVkLgorCisgICAgQXJnczoKKyAgICAgIGZsYWc6ICBBIGZsYWcgdG8gcGFzcyB0byB0aGUgYmluYXJ5IG9yIE5vbmUuCisgICAgIiIiCisKKyAgICBleGl0X2NvZGUsIG91dHB1dCA9IFJ1bldpdGhGbGFnKGZsYWcpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgZXhpdF9jb2RlKQorICAgIHNlbGYuYXNzZXJ0XyhIRUxQX1JFR0VYLnNlYXJjaChvdXRwdXQpLCBvdXRwdXQpCisKKyAgICBpZiBJU19MSU5VWDoKKyAgICAgIHNlbGYuYXNzZXJ0XyhTVFJFQU1fUkVTVUxUX1RPX0ZMQUcgaW4gb3V0cHV0LCBvdXRwdXQpCisgICAgZWxzZToKKyAgICAgIHNlbGYuYXNzZXJ0XyhTVFJFQU1fUkVTVUxUX1RPX0ZMQUcgbm90IGluIG91dHB1dCwgb3V0cHV0KQorCisgICAgaWYgU1VQUE9SVFNfREVBVEhfVEVTVFMgYW5kIG5vdCBJU19XSU5ET1dTOgorICAgICAgc2VsZi5hc3NlcnRfKERFQVRIX1RFU1RfU1RZTEVfRkxBRyBpbiBvdXRwdXQsIG91dHB1dCkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKERFQVRIX1RFU1RfU1RZTEVfRkxBRyBub3QgaW4gb3V0cHV0LCBvdXRwdXQpCisKKyAgZGVmIFRlc3ROb25IZWxwRmxhZyhzZWxmLCBmbGFnKToKKyAgICAiIiJWZXJpZmllcyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gbm8gaGVscCBmbGFnIGlzIHNwZWNpZmllZC4KKworICAgIFZlcmlmaWVzIHRoYXQgd2hlbiBubyBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgdGVzdHMgYXJlIHJ1bgorICAgIGFuZCB0aGUgaGVscCBtZXNzYWdlIGlzIG5vdCBwcmludGVkLgorCisgICAgQXJnczoKKyAgICAgIGZsYWc6ICBBIGZsYWcgdG8gcGFzcyB0byB0aGUgYmluYXJ5IG9yIE5vbmUuCisgICAgIiIiCisKKyAgICBleGl0X2NvZGUsIG91dHB1dCA9IFJ1bldpdGhGbGFnKGZsYWcpCisgICAgc2VsZi5hc3NlcnRfKGV4aXRfY29kZSAhPSAwKQorICAgIHNlbGYuYXNzZXJ0Xyhub3QgSEVMUF9SRUdFWC5zZWFyY2gob3V0cHV0KSwgb3V0cHV0KQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhGdWxsRmxhZyhzZWxmKToKKyAgICBzZWxmLlRlc3RIZWxwRmxhZygnLS1oZWxwJykKKworICBkZWYgdGVzdFByaW50c0hlbHBXaXRoU2hvcnRGbGFnKHNlbGYpOgorICAgIHNlbGYuVGVzdEhlbHBGbGFnKCctaCcpCisKKyAgZGVmIHRlc3RQcmludHNIZWxwV2l0aFF1ZXN0aW9uRmxhZyhzZWxmKToKKyAgICBzZWxmLlRlc3RIZWxwRmxhZygnLT8nKQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhXaW5kb3dzU3R5bGVRdWVzdGlvbkZsYWcoc2VsZik6CisgICAgc2VsZi5UZXN0SGVscEZsYWcoJy8/JykKKworICBkZWYgdGVzdFByaW50c0hlbHBXaXRoVW5yZWNvZ25pemVkR29vZ2xlVGVzdEZsYWcoc2VsZik6CisgICAgc2VsZi5UZXN0SGVscEZsYWcoVU5LTk9XTl9GTEFHKQorCisgIGRlZiB0ZXN0UHJpbnRzSGVscFdpdGhJbmNvcnJlY3RGbGFnU3R5bGUoc2VsZik6CisgICAgZm9yIGluY29ycmVjdF9mbGFnIGluIElOQ09SUkVDVF9GTEFHX1ZBUklBTlRTOgorICAgICAgc2VsZi5UZXN0SGVscEZsYWcoaW5jb3JyZWN0X2ZsYWcpCisKKyAgZGVmIHRlc3RSdW5zVGVzdHNXaXRob3V0SGVscEZsYWcoc2VsZik6CisgICAgIiIiVmVyaWZpZXMgdGhhdCB3aGVuIG5vIGhlbHAgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSB0ZXN0cyBhcmUgcnVuCisgICAgYW5kIHRoZSBoZWxwIG1lc3NhZ2UgaXMgbm90IHByaW50ZWQuIiIiCisKKyAgICBzZWxmLlRlc3ROb25IZWxwRmxhZyhOb25lKQorCisgIGRlZiB0ZXN0UnVuc1Rlc3RzV2l0aEd0ZXN0SW50ZXJuYWxGbGFnKHNlbGYpOgorICAgICIiIlZlcmlmaWVzIHRoYXQgdGhlIHRlc3RzIGFyZSBydW4gYW5kIG5vIGhlbHAgbWVzc2FnZSBpcyBwcmludGVkIHdoZW4KKyAgICBhIGZsYWcgc3RhcnRpbmcgd2l0aCBHb29nbGUgVGVzdCBwcmVmaXggYW5kICdpbnRlcm5hbF8nIGlzIHN1cHBsaWVkLiIiIgorCisgICAgc2VsZi5UZXN0Tm9uSGVscEZsYWcoSU5URVJOQUxfRkxBR19GT1JfVEVTVElORykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfaGVscF90ZXN0Xy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmNzhjMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2hlbHBfdGVzdF8uY2MKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMDksIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gVGhpcyBwcm9ncmFtIGlzIG1lYW50IHRvIGJlIHJ1biBieSBndGVzdF9oZWxwX3Rlc3QucHkuICBEbyBub3QgcnVuCisvLyBpdCBkaXJlY3RseS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFdoZW4gYSBoZWxwIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGlzIHByb2dyYW0gc2hvdWxkIHNraXAgdGhlIHRlc3RzCisvLyBhbmQgZXhpdCB3aXRoIDA7IG90aGVyd2lzZSB0aGUgZm9sbG93aW5nIHRlc3Qgd2lsbCBiZSBleGVjdXRlZCwKKy8vIGNhdXNpbmcgdGhpcyBwcm9ncmFtIHRvIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGNvZGUuCitURVNUKEhlbHBGbGFnVGVzdCwgU2hvdWxkTm90QmVSdW4pIHsKKyAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJUZXN0cyBzaG91bGRuJ3QgYmUgcnVuIHdoZW4gLS1oZWxwIGlzIHNwZWNpZmllZC4iOworfQorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKK1RFU1QoRGVhdGhUZXN0LCBVc2VkQnlQeXRob25TY3JpcHRUb0RldGVjdFN1cHBvcnRGb3JEZWF0aFRlc3RzSW5UaGlzQmluYXJ5KSB7fQorI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0LnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MjViMDlkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdC5weQpAQCAtMCwwICsxLDIwNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIC0tZ3Rlc3RfbGlzdF90ZXN0cyBmbGFnLgorCitBIHVzZXIgY2FuIGFzayBHb29nbGUgVGVzdCB0byBsaXN0IGFsbCB0ZXN0cyBieSBzcGVjaWZ5aW5nIHRoZQorLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcuICBUaGlzIHNjcmlwdCB0ZXN0cyBzdWNoIGZ1bmN0aW9uYWxpdHkKK2J5IGludm9raW5nIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIChhIHByb2dyYW0gd3JpdHRlbiB3aXRoCitHb29nbGUgVGVzdCkgdGhlIGNvbW1hbmQgbGluZSBmbGFncy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3BoYW5uYUBnb29nbGUuY29tIChQYXRyaWNrIEhhbm5hKScKKworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKK2ltcG9ydCByZQorCisKKyMgQ29uc3RhbnRzLgorCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIGxpc3RpbmcgYWxsIHRlc3RzLgorTElTVF9URVNUU19GTEFHID0gJ2d0ZXN0X2xpc3RfdGVzdHMnCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gcHJvZ3JhbS4KK0VYRV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfJykKKworIyBUaGUgZXhwZWN0ZWQgb3V0cHV0IHdoZW4gcnVubmluZyBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyB3aXRoCisjIC0tZ3Rlc3RfbGlzdF90ZXN0cworRVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUl9SRSA9IHJlLmNvbXBpbGUociIiIkZvb0RlYXRoVGVzdFwuCisgIFRlc3QxCitGb29cLgorICBCYXIxCisgIEJhcjIKKyAgRElTQUJMRURfQmFyMworQWJjXC4KKyAgWHl6CisgIERlZgorRm9vQmFyXC4KKyAgQmF6CitGb29UZXN0XC4KKyAgVGVzdDEKKyAgRElTQUJMRURfVGVzdDIKKyAgVGVzdDMKK1R5cGVkVGVzdC8wXC4gICMgVHlwZVBhcmFtID0gKFZlcnlMb3syNDV9fGNsYXNzIFZlcnlMb3syMzl9KVwuXC5cLgorICBUZXN0QQorICBUZXN0QgorVHlwZWRUZXN0LzFcLiAgIyBUeXBlUGFyYW0gPSBpbnRccypcKgorICBUZXN0QQorICBUZXN0QgorVHlwZWRUZXN0LzJcLiAgIyBUeXBlUGFyYW0gPSAuKk15QXJyYXk8Ym9vbCxccyo0Mj4KKyAgVGVzdEEKKyAgVGVzdEIKK015L1R5cGVQYXJhbVRlc3QvMFwuICAjIFR5cGVQYXJhbSA9IChWZXJ5TG97MjQ1fXxjbGFzcyBWZXJ5TG97MjM5fSlcLlwuXC4KKyAgVGVzdEEKKyAgVGVzdEIKK015L1R5cGVQYXJhbVRlc3QvMVwuICAjIFR5cGVQYXJhbSA9IGludFxzKlwqCisgIFRlc3RBCisgIFRlc3RCCitNeS9UeXBlUGFyYW1UZXN0LzJcLiAgIyBUeXBlUGFyYW0gPSAuKk15QXJyYXk8Ym9vbCxccyo0Mj4KKyAgVGVzdEEKKyAgVGVzdEIKK015SW5zdGFudGlhdGlvbi9WYWx1ZVBhcmFtVGVzdFwuCisgIFRlc3RBLzAgICMgR2V0UGFyYW1cKFwpID0gb25lIGxpbmUKKyAgVGVzdEEvMSAgIyBHZXRQYXJhbVwoXCkgPSB0d29cXG5saW5lcworICBUZXN0QS8yICAjIEdldFBhcmFtXChcKSA9IGEgdmVyeVxcbmxvezI0MX1cLlwuXC4KKyAgVGVzdEIvMCAgIyBHZXRQYXJhbVwoXCkgPSBvbmUgbGluZQorICBUZXN0Qi8xICAjIEdldFBhcmFtXChcKSA9IHR3b1xcbmxpbmVzCisgIFRlc3RCLzIgICMgR2V0UGFyYW1cKFwpID0gYSB2ZXJ5XFxubG97MjQxfVwuXC5cLgorIiIiKQorCisjIFRoZSBleHBlY3RlZCBvdXRwdXQgd2hlbiBydW5uaW5nIGd0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfIHdpdGgKKyMgLS1ndGVzdF9saXN0X3Rlc3RzIGFuZCAtLWd0ZXN0X2ZpbHRlcj1Gb28qLgorRVhQRUNURURfT1VUUFVUX0ZJTFRFUl9GT09fUkUgPSByZS5jb21waWxlKHIiIiJGb29EZWF0aFRlc3RcLgorICBUZXN0MQorRm9vXC4KKyAgQmFyMQorICBCYXIyCisgIERJU0FCTEVEX0JhcjMKK0Zvb0JhclwuCisgIEJhegorRm9vVGVzdFwuCisgIFRlc3QxCisgIERJU0FCTEVEX1Rlc3QyCisgIFRlc3QzCisiIiIpCisKKyMgVXRpbGl0aWVzLgorCisKK2RlZiBSdW4oYXJncyk6CisgICIiIlJ1bnMgZ3Rlc3RfbGlzdF90ZXN0c191bml0dGVzdF8gYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgdGVzdHMgcHJpbnRlZC4iIiIKKworICByZXR1cm4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKFtFWEVfUEFUSF0gKyBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVfc3RkZXJyPUZhbHNlKS5vdXRwdXQKKworCisjIFRoZSB1bml0IHRlc3QuCisKK2NsYXNzIEdUZXN0TGlzdFRlc3RzVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHVzaW5nIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB0byBsaXN0IGFsbCB0ZXN0cy4iIiIKKworICBkZWYgUnVuQW5kVmVyaWZ5KHNlbGYsIGZsYWdfdmFsdWUsIGV4cGVjdGVkX291dHB1dF9yZSwgb3RoZXJfZmxhZyk6CisgICAgIiIiUnVucyBndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0XyBhbmQgdmVyaWZpZXMgdGhhdCBpdCBwcmludHMKKyAgICB0aGUgY29ycmVjdCB0ZXN0cy4KKworICAgIEFyZ3M6CisgICAgICBmbGFnX3ZhbHVlOiAgICAgICAgIHZhbHVlIG9mIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSBpZiB0aGUgZmxhZyBzaG91bGQgbm90IGJlIHByZXNlbnQuCisgICAgICBleHBlY3RlZF9vdXRwdXRfcmU6IHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhZnRlciBydW5uaW5nIGNvbW1hbmQ7CisgICAgICBvdGhlcl9mbGFnOiAgICAgICAgIGEgZGlmZmVyZW50IGZsYWcgdG8gYmUgcGFzc2VkIHRvIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWxvbmcgd2l0aCBndGVzdF9saXN0X3Rlc3RzOworICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHRoZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC4KKyAgICAiIiIKKworICAgIGlmIGZsYWdfdmFsdWUgaXMgTm9uZToKKyAgICAgIGZsYWcgPSAnJworICAgICAgZmxhZ19leHByZXNzaW9uID0gJ25vdCBzZXQnCisgICAgZWxpZiBmbGFnX3ZhbHVlID09ICcwJzoKKyAgICAgIGZsYWcgPSAnLS0lcz0wJyAlIExJU1RfVEVTVFNfRkxBRworICAgICAgZmxhZ19leHByZXNzaW9uID0gJzAnCisgICAgZWxzZToKKyAgICAgIGZsYWcgPSAnLS0lcycgJSBMSVNUX1RFU1RTX0ZMQUcKKyAgICAgIGZsYWdfZXhwcmVzc2lvbiA9ICcxJworCisgICAgYXJncyA9IFtmbGFnXQorCisgICAgaWYgb3RoZXJfZmxhZyBpcyBub3QgTm9uZToKKyAgICAgIGFyZ3MgKz0gW290aGVyX2ZsYWddCisKKyAgICBvdXRwdXQgPSBSdW4oYXJncykKKworICAgIGlmIGV4cGVjdGVkX291dHB1dF9yZToKKyAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmUubWF0Y2gob3V0cHV0KSwKKyAgICAgICAgICAoJ3doZW4gJXMgaXMgJXMsIHRoZSBvdXRwdXQgb2YgIiVzIiBpcyAiJXMiLFxuJworICAgICAgICAgICAnd2hpY2ggZG9lcyBub3QgbWF0Y2ggcmVnZXggIiVzIicgJQorICAgICAgICAgICAoTElTVF9URVNUU19GTEFHLCBmbGFnX2V4cHJlc3Npb24sICcgJy5qb2luKGFyZ3MpLCBvdXRwdXQsCisgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmUucGF0dGVybikpKQorICAgIGVsc2U6CisgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgbm90IEVYUEVDVEVEX09VVFBVVF9OT19GSUxURVJfUkUubWF0Y2gob3V0cHV0KSwKKyAgICAgICAgICAoJ3doZW4gJXMgaXMgJXMsIHRoZSBvdXRwdXQgb2YgIiVzIiBpcyAiJXMiJyUKKyAgICAgICAgICAgKExJU1RfVEVTVFNfRkxBRywgZmxhZ19leHByZXNzaW9uLCAnICcuam9pbihhcmdzKSwgb3V0cHV0KSkpCisKKyAgZGVmIHRlc3REZWZhdWx0QmVoYXZpb3Ioc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IG1vZGUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0X3JlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmxhZz1Ob25lKQorCisgIGRlZiB0ZXN0RmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyB0aGUgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPU5vbmUpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0X3JlPUVYUEVDVEVEX09VVFBVVF9OT19GSUxURVJfUkUsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmxhZz1Ob25lKQorCisgIGRlZiB0ZXN0T3ZlcnJpZGVOb25GaWx0ZXJGbGFncyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IC0tZ3Rlc3RfbGlzdF90ZXN0cyBvdmVycmlkZXMgdGhlIG5vbi1maWx0ZXIgZmxhZ3MuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXRfcmU9RVhQRUNURURfT1VUUFVUX05PX0ZJTFRFUl9SRSwKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9mbGFnPSctLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUnKQorCisgIGRlZiB0ZXN0V2l0aEZpbHRlckZsYWdzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoYXQgLS1ndGVzdF9saXN0X3Rlc3RzIHRha2VzIGludG8gYWNjb3VudCB0aGUKKyAgICAtLWd0ZXN0X2ZpbHRlciBmbGFnLiIiIgorCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZmxhZ192YWx1ZT0nMScsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0X3JlPUVYUEVDVEVEX09VVFBVVF9GSUxURVJfRk9PX1JFLAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZsYWc9Jy0tZ3Rlc3RfZmlsdGVyPUZvbyonKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X2xpc3RfdGVzdHNfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2MxNzYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9saXN0X3Rlc3RzX3VuaXR0ZXN0Xy5jYwpAQCAtMCwwICsxLDE1NyBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcGhhbm5hQGdvb2dsZS5jb20gKFBhdHJpY2sgSGFubmEpCisKKy8vIFVuaXQgdGVzdCBmb3IgR29vZ2xlIFRlc3QncyAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZy4KKy8vCisvLyBBIHVzZXIgY2FuIGFzayBHb29nbGUgVGVzdCB0byBsaXN0IGFsbCB0ZXN0cyB0aGF0IHdpbGwgcnVuCisvLyBzbyB0aGF0IHdoZW4gdXNpbmcgYSBmaWx0ZXIsIGEgdXNlciB3aWxsIGtub3cgd2hhdAorLy8gdGVzdHMgdG8gbG9vayBmb3IuIFRoZSB0ZXN0cyB3aWxsIG5vdCBiZSBydW4gYWZ0ZXIgbGlzdGluZy4KKy8vCisvLyBUaGlzIHByb2dyYW0gd2lsbCBiZSBpbnZva2VkIGZyb20gYSBQeXRob24gdW5pdCB0ZXN0LgorLy8gRG9uJ3QgcnVuIGl0IGRpcmVjdGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gU2V2ZXJhbCBkaWZmZXJlbnQgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdGhhdCB3aWxsIGJlIGxpc3RlZC4KK1RFU1QoRm9vLCBCYXIxKSB7Cit9CisKK1RFU1QoRm9vLCBCYXIyKSB7Cit9CisKK1RFU1QoRm9vLCBESVNBQkxFRF9CYXIzKSB7Cit9CisKK1RFU1QoQWJjLCBYeXopIHsKK30KKworVEVTVChBYmMsIERlZikgeworfQorCitURVNUKEZvb0JhciwgQmF6KSB7Cit9CisKK2NsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoRm9vVGVzdCwgVGVzdDEpIHsKK30KKworVEVTVF9GKEZvb1Rlc3QsIERJU0FCTEVEX1Rlc3QyKSB7Cit9CisKK1RFU1RfRihGb29UZXN0LCBUZXN0MykgeworfQorCitURVNUKEZvb0RlYXRoVGVzdCwgVGVzdDEpIHsKK30KKworLy8gQSBncm91cCBvZiB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorCitjbGFzcyBNeVR5cGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTXlUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX3ZhbHVlKSA6IHZhbHVlXyhhX3ZhbHVlKSB7fQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgdmFsdWVfOworfTsKKworLy8gVGVhY2hlcyBHb29nbGUgVGVzdCBob3cgdG8gcHJpbnQgYSBNeVR5cGUuCit2b2lkIFByaW50VG8oY29uc3QgTXlUeXBlJiB4LCBzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICpvcyA8PCB4LnZhbHVlKCk7Cit9CisKK2NsYXNzIFZhbHVlUGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08TXlUeXBlPiB7Cit9OworCitURVNUX1AoVmFsdWVQYXJhbVRlc3QsIFRlc3RBKSB7Cit9CisKK1RFU1RfUChWYWx1ZVBhcmFtVGVzdCwgVGVzdEIpIHsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgTXlJbnN0YW50aWF0aW9uLCBWYWx1ZVBhcmFtVGVzdCwKKyAgICB0ZXN0aW5nOjpWYWx1ZXMoTXlUeXBlKCJvbmUgbGluZSIpLAorICAgICAgICAgICAgICAgICAgICBNeVR5cGUoInR3b1xubGluZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgTXlUeXBlKCJhIHZlcnlcbmxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmcgbGluZSIpKSk7ICAvLyBOT0xJTlQKKworLy8gQSBncm91cCBvZiB0eXBlZCB0ZXN0cy4KKworLy8gQSBkZWxpYmVyYXRlbHkgbG9uZyB0eXBlIG5hbWUgZm9yIHRlc3RpbmcgdGhlIGxpbmUtdHJ1bmNhdGluZworLy8gYmVoYXZpb3Igd2hlbiBwcmludGluZyBhIHR5cGUgcGFyYW1ldGVyLgorY2xhc3MgVmVyeUxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vZ05hbWUgeyAgLy8gTk9MSU5UCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQga1NpemU+CitjbGFzcyBNeUFycmF5IHsKK307CisKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8VmVyeUxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vZ05hbWUsICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiwgTXlBcnJheTxib29sLCA0Mj4gPiBNeVR5cGVzOworCitUWVBFRF9URVNUX0NBU0UoVHlwZWRUZXN0LCBNeVR5cGVzKTsKKworVFlQRURfVEVTVChUeXBlZFRlc3QsIFRlc3RBKSB7Cit9CisKK1RZUEVEX1RFU1QoVHlwZWRUZXN0LCBUZXN0QikgeworfQorCisvLyBBIGdyb3VwIG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlUGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoVHlwZVBhcmFtVGVzdCk7CisKK1RZUEVEX1RFU1RfUChUeXBlUGFyYW1UZXN0LCBUZXN0QSkgeworfQorCitUWVBFRF9URVNUX1AoVHlwZVBhcmFtVGVzdCwgVGVzdEIpIHsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoVHlwZVBhcmFtVGVzdCwgVGVzdEEsIFRlc3RCKTsKKworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIFR5cGVQYXJhbVRlc3QsIE15VHlwZXMpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X21haW5fdW5pdHRlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9tYWluX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZDliYjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9tYWluX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisvLyBUZXN0cyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZGVmaW5lIG1haW4oKSB3aGVuIHdlIGxpbmsgdG8KKy8vIGd0ZXN0X21haW4gaW5zdGVhZCBvZiBndGVzdC4KKworbmFtZXNwYWNlIHsKKworVEVTVChHVGVzdE1haW5UZXN0LCBTaG91bGRTdWNjZWVkKSB7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBXZSBhcmUgdXNpbmcgdGhlIG1haW4oKSBmdW5jdGlvbiBkZWZpbmVkIGluIHNyYy9ndGVzdF9tYWluLmNjLCBzbworLy8gd2UgZG9uJ3QgZGVmaW5lIGl0IGhlcmUuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9ub190ZXN0X3VuaXR0ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI1OTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Rfbm9fdGVzdF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRlc3RzIHRoYXQgYSBHb29nbGUgVGVzdCBwcm9ncmFtIHRoYXQgaGFzIG5vIHRlc3QgZGVmaW5lZCBjYW4gcnVuCisvLyBzdWNjZXNzZnVsbHkuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAvLyBBbiBhZC1ob2MgYXNzZXJ0aW9uIG91dHNpZGUgb2YgYWxsIHRlc3RzLgorICAvLworICAvLyBUaGlzIHNlcnZlcyB0aHJlZSBwdXJwb3NlczoKKyAgLy8KKyAgLy8gMS4gSXQgdmVyaWZpZXMgdGhhdCBhbiBhZC1ob2MgYXNzZXJ0aW9uIGNhbiBiZSBleGVjdXRlZCBldmVuIGlmCisgIC8vICAgIG5vIHRlc3QgaXMgZGVmaW5lZC4KKyAgLy8gMi4gSXQgdmVyaWZpZXMgdGhhdCBhIGZhaWxlZCBhZC1ob2MgYXNzZXJ0aW9uIGNhdXNlcyB0aGUgdGVzdAorICAvLyAgICBwcm9ncmFtIHRvIGZhaWwuCisgIC8vIDMuIFdlIGhhZCBhIGJ1ZyB3aGVyZSB0aGUgWE1MIG91dHB1dCB3b24ndCBiZSBnZW5lcmF0ZWQgaWYgYW4KKyAgLy8gICAgYXNzZXJ0aW9uIGlzIGV4ZWN1dGVkIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgY2FsbGVkLCBldmVuCisgIC8vICAgIHRob3VnaCAtLWd0ZXN0X291dHB1dD14bWwgaXMgc3BlY2lmaWVkLiAgVGhpcyBtYWtlcyBzdXJlIHRoZQorICAvLyAgICBidWcgaXMgZml4ZWQgYW5kIGRvZXNuJ3QgcmVncmVzcy4KKyAgRVhQRUNUX0VRKDEsIDIpOworCisgIC8vIFRoZSBhYm92ZSBFWFBFQ1RfRVEoKSBzaG91bGQgY2F1c2UgUlVOX0FMTF9URVNUUygpIHRvIHJldHVybiBub24temVyby4KKyAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKSA/IDAgOiAxOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9vdXRwdXRfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWM2MzdiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkKQEAgLTAsMCArMSwzNDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIHRoZSB0ZXh0IG91dHB1dCBvZiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrLgorCitTWU5PUFNJUworICAgICAgIGd0ZXN0X291dHB1dF90ZXN0LnB5IC0tYnVpbGRfZGlyPUJVSUxEL0RJUiAtLWdlbmdvbGRlbgorICAgICAgICAgIyB3aGVyZSBCVUlMRC9ESVIgY29udGFpbnMgdGhlIGJ1aWx0IGd0ZXN0X291dHB1dF90ZXN0XyBmaWxlLgorICAgICAgIGd0ZXN0X291dHB1dF90ZXN0LnB5IC0tZ2VuZ29sZGVuCisgICAgICAgZ3Rlc3Rfb3V0cHV0X3Rlc3QucHkKKyIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworIyBUaGUgZmxhZyBmb3IgZ2VuZXJhdGluZyB0aGUgZ29sZGVuIGZpbGUKK0dFTkdPTERFTl9GTEFHID0gJy0tZ2VuZ29sZGVuJworQ0FUQ0hfRVhDRVBUSU9OU19FTlZfVkFSX05BTUUgPSAnR1RFU1RfQ0FUQ0hfRVhDRVBUSU9OUycKKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworCisjIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IHJlbW92ZSB0aGUgX2xpbiBzdWZmaXguCitHT0xERU5fTkFNRSA9ICdndGVzdF9vdXRwdXRfdGVzdF9nb2xkZW5fbGluLnR4dCcKKworUFJPR1JBTV9QQVRIID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X291dHB1dF90ZXN0XycpCisKKyMgQXQgbGVhc3Qgb25lIGNvbW1hbmQgd2UgZXhlcmNpc2UgbXVzdCBub3QgaGF2ZSB0aGUKKyMgJ2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycgYXJndW1lbnQuCitDT01NQU5EX0xJU1RfVEVTVFMgPSAoe30sIFtQUk9HUkFNX1BBVEgsICctLWd0ZXN0X2xpc3RfdGVzdHMnXSkKK0NPTU1BTkRfV0lUSF9DT0xPUiA9ICh7fSwgW1BST0dSQU1fUEFUSCwgJy0tZ3Rlc3RfY29sb3I9eWVzJ10pCitDT01NQU5EX1dJVEhfVElNRSA9ICh7fSwgW1BST0dSQU1fUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tZ3Rlc3RfcHJpbnRfdGltZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1ndGVzdF9maWx0ZXI9RmF0YWxGYWlsdXJlVGVzdC4qOkxvZ2dpbmdUZXN0LionXSkKK0NPTU1BTkRfV0lUSF9ESVNBQkxFRCA9ICgKKyAgICB7fSwgW1BST0dSQU1fUEFUSCwKKyAgICAgICAgICctLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzJywKKyAgICAgICAgICdpbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMnLAorICAgICAgICAgJy0tZ3Rlc3RfZmlsdGVyPSpESVNBQkxFRF8qJ10pCitDT01NQU5EX1dJVEhfU0hBUkRJTkcgPSAoCisgICAgeydHVEVTVF9TSEFSRF9JTkRFWCc6ICcxJywgJ0dURVNUX1RPVEFMX1NIQVJEUyc6ICcyJ30sCisgICAgW1BST0dSQU1fUEFUSCwKKyAgICAgJ2ludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cycsCisgICAgICctLWd0ZXN0X2ZpbHRlcj1QYXNzaW5nVGVzdC4qJ10pCisKK0dPTERFTl9QQVRIID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksIEdPTERFTl9OQU1FKQorCisKK2RlZiBUb1VuaXhMaW5lRW5kaW5nKHMpOgorICAiIiJDaGFuZ2VzIGFsbCBXaW5kb3dzL01hYyBsaW5lIGVuZGluZ3MgaW4gcyB0byBVTklYIGxpbmUgZW5kaW5ncy4iIiIKKworICByZXR1cm4gcy5yZXBsYWNlKCdcclxuJywgJ1xuJykucmVwbGFjZSgnXHInLCAnXG4nKQorCisKK2RlZiBSZW1vdmVMb2NhdGlvbnModGVzdF9vdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCBmaWxlIGxvY2F0aW9uIGluZm8gZnJvbSBhIEdvb2dsZSBUZXN0IHByb2dyYW0ncyBvdXRwdXQuCisKKyAgQXJnczoKKyAgICAgICB0ZXN0X291dHB1dDogIHRoZSBvdXRwdXQgb2YgYSBHb29nbGUgVGVzdCBwcm9ncmFtLgorCisgIFJldHVybnM6CisgICAgICAgb3V0cHV0IHdpdGggYWxsIGZpbGUgbG9jYXRpb24gaW5mbyAoaW4gdGhlIGZvcm0gb2YKKyAgICAgICAnRElSRUNUT1JZL0ZJTEVfTkFNRTpMSU5FX05VTUJFUjogJ29yCisgICAgICAgJ0RJUkVDVE9SWVxcRklMRV9OQU1FKExJTkVfTlVNQkVSKTogJykgcmVwbGFjZWQgYnkKKyAgICAgICAnRklMRV9OQU1FOiM6ICcuCisgICIiIgorCisgIHJldHVybiByZS5zdWIocicuKlsvXFxdKC4rKShcOlxkK3xcKFxkK1wpKVw6ICcsIHInXDE6IzogJywgdGVzdF9vdXRwdXQpCisKKworZGVmIFJlbW92ZVN0YWNrVHJhY2VEZXRhaWxzKG91dHB1dCk6CisgICIiIlJlbW92ZXMgYWxsIHN0YWNrIHRyYWNlcyBmcm9tIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbSdzIG91dHB1dC4iIiIKKworICAjICo/IG1lYW5zICJmaW5kIHRoZSBzaG9ydGVzdCBzdHJpbmcgdGhhdCBtYXRjaGVzIi4KKyAgcmV0dXJuIHJlLnN1YihyJ1N0YWNrIHRyYWNlOigufFxuKSo/XG5cbicsCisgICAgICAgICAgICAgICAgJ1N0YWNrIHRyYWNlOiAob21pdHRlZClcblxuJywgb3V0cHV0KQorCisKK2RlZiBSZW1vdmVTdGFja1RyYWNlcyhvdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCB0cmFjZXMgb2Ygc3RhY2sgdHJhY2VzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgICMgKj8gbWVhbnMgImZpbmQgdGhlIHNob3J0ZXN0IHN0cmluZyB0aGF0IG1hdGNoZXMiLgorICByZXR1cm4gcmUuc3ViKHInU3RhY2sgdHJhY2U6KC58XG4pKj9cblxuJywgJycsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlVGltZShvdXRwdXQpOgorICAiIiJSZW1vdmVzIGFsbCB0aW1lIGluZm9ybWF0aW9uIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgIHJldHVybiByZS5zdWIocidcKFxkKyBtcycsICcoPyBtcycsIG91dHB1dCkKKworCitkZWYgUmVtb3ZlVHlwZUluZm9EZXRhaWxzKHRlc3Rfb3V0cHV0KToKKyAgIiIiUmVtb3ZlcyBjb21waWxlci1zcGVjaWZpYyB0eXBlIGluZm8gZnJvbSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgorCisgIEFyZ3M6CisgICAgICAgdGVzdF9vdXRwdXQ6ICB0aGUgb3V0cHV0IG9mIGEgR29vZ2xlIFRlc3QgcHJvZ3JhbS4KKworICBSZXR1cm5zOgorICAgICAgIG91dHB1dCB3aXRoIHR5cGUgaW5mb3JtYXRpb24gbm9ybWFsaXplZCB0byBjYW5vbmljYWwgZm9ybS4KKyAgIiIiCisKKyAgIyBzb21lIGNvbXBpbGVycyBvdXRwdXQgdGhlIG5hbWUgb2YgdHlwZSAndW5zaWduZWQgaW50JyBhcyAndW5zaWduZWQnCisgIHJldHVybiByZS5zdWIocid1bnNpZ25lZCBpbnQnLCAndW5zaWduZWQnLCB0ZXN0X291dHB1dCkKKworCitkZWYgTm9ybWFsaXplVG9DdXJyZW50UGxhdGZvcm0odGVzdF9vdXRwdXQpOgorICAiIiJOb3JtYWxpemVzIHBsYXRmb3JtIHNwZWNpZmljIG91dHB1dCBkZXRhaWxzIGZvciBlYXNpZXIgY29tcGFyaXNvbi4iIiIKKworICBpZiBJU19XSU5ET1dTOgorICAgICMgUmVtb3ZlcyB0aGUgY29sb3IgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcHJlc2VudCBvbiBXaW5kb3dzLgorICAgIHRlc3Rfb3V0cHV0ID0gcmUuc3ViKCdceDFiXFxbKDA7M1xkKT9tJywgJycsIHRlc3Rfb3V0cHV0KQorICAgICMgQ2hhbmdlcyBmYWlsdXJlIG1lc3NhZ2UgaGVhZGVycyBpbnRvIHRoZSBXaW5kb3dzIGZvcm1hdC4KKyAgICB0ZXN0X291dHB1dCA9IHJlLnN1YihyJzogRmFpbHVyZVxuJywgcic6IGVycm9yOiAnLCB0ZXN0X291dHB1dCkKKyAgICAjIENoYW5nZXMgZmlsZShsaW5lX251bWJlcikgdG8gZmlsZTpsaW5lX251bWJlci4KKyAgICB0ZXN0X291dHB1dCA9IHJlLnN1YihyJygoXHd8XC4pKylcKChcZCspXCk6JywgcidcMTpcMzonLCB0ZXN0X291dHB1dCkKKworICByZXR1cm4gdGVzdF9vdXRwdXQKKworCitkZWYgUmVtb3ZlVGVzdENvdW50cyhvdXRwdXQpOgorICAiIiJSZW1vdmVzIHRlc3QgY291bnRzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LiIiIgorCisgIG91dHB1dCA9IHJlLnN1YihyJ1xkKyB0ZXN0cz8sIGxpc3RlZCBiZWxvdycsCisgICAgICAgICAgICAgICAgICAnPyB0ZXN0cywgbGlzdGVkIGJlbG93Jywgb3V0cHV0KQorICBvdXRwdXQgPSByZS5zdWIocidcZCsgRkFJTEVEIFRFU1RTJywKKyAgICAgICAgICAgICAgICAgICc/IEZBSUxFRCBURVNUUycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIHRlc3RzPyBmcm9tIFxkKyB0ZXN0IGNhc2VzPycsCisgICAgICAgICAgICAgICAgICAnPyB0ZXN0cyBmcm9tID8gdGVzdCBjYXNlcycsIG91dHB1dCkKKyAgb3V0cHV0ID0gcmUuc3ViKHInXGQrIHRlc3RzPyBmcm9tIChbYS16QS1aX10pJywKKyAgICAgICAgICAgICAgICAgIHInPyB0ZXN0cyBmcm9tIFwxJywgb3V0cHV0KQorICByZXR1cm4gcmUuc3ViKHInXGQrIHRlc3RzP1wuJywgJz8gdGVzdHMuJywgb3V0cHV0KQorCisKK2RlZiBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCBwYXR0ZXJuKToKKyAgIiIiUmVtb3ZlcyBvdXRwdXQgb2Ygc3BlY2lmaWVkIHRlc3RzIGZyb20gYSBHb29nbGUgVGVzdCBwcm9ncmFtJ3Mgb3V0cHV0LgorCisgIFRoaXMgZnVuY3Rpb24gc3RyaXBzIG5vdCBvbmx5IHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgYSB0ZXN0IGJ1dCBhbHNvCisgIGFsbCBvdXRwdXQgaW4gYmV0d2Vlbi4KKworICBBcmdzOgorICAgIHRlc3Rfb3V0cHV0OiAgICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSB0ZXN0IG91dHB1dC4KKyAgICBwYXR0ZXJuOiAgICAgICAgICAgQSByZWdleCBzdHJpbmcgdGhhdCBtYXRjaGVzIG5hbWVzIG9mIHRlc3QgY2FzZXMgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMgdG8gcmVtb3ZlLgorCisgIFJldHVybnM6CisgICAgQ29udGVudHMgb2YgdGVzdF9vdXRwdXQgd2l0aCB0ZXN0cyB3aG9zZSBuYW1lcyBtYXRjaCBwYXR0ZXJuIHJlbW92ZWQuCisgICIiIgorCisgIHRlc3Rfb3V0cHV0ID0gcmUuc3ViKAorICAgICAgcicuKlxbIFJVTiAgICAgIFxdIC4qJXMoLnxcbikqP1xbKCAgRkFJTEVEICB8ICAgICAgIE9LIClcXSAuKiVzLipcbicgJSAoCisgICAgICAgICAgcGF0dGVybiwgcGF0dGVybiksCisgICAgICAnJywKKyAgICAgIHRlc3Rfb3V0cHV0KQorICByZXR1cm4gcmUuc3ViKHInLiolcy4qXG4nICUgcGF0dGVybiwgJycsIHRlc3Rfb3V0cHV0KQorCisKK2RlZiBOb3JtYWxpemVPdXRwdXQob3V0cHV0KToKKyAgIiIiTm9ybWFsaXplcyBvdXRwdXQgKHRoZSBvdXRwdXQgb2YgZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmV4ZSkuIiIiCisKKyAgb3V0cHV0ID0gVG9Vbml4TGluZUVuZGluZyhvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZUxvY2F0aW9ucyhvdXRwdXQpCisgIG91dHB1dCA9IFJlbW92ZVN0YWNrVHJhY2VEZXRhaWxzKG91dHB1dCkKKyAgb3V0cHV0ID0gUmVtb3ZlVGltZShvdXRwdXQpCisgIHJldHVybiBvdXRwdXQKKworCitkZWYgR2V0U2hlbGxDb21tYW5kT3V0cHV0KGVudl9jbWQpOgorICAiIiJSdW5zIGEgY29tbWFuZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgcmV0dXJucyBpdHMgb3V0cHV0IGluIGEgc3RyaW5nLgorCisgIEFyZ3M6CisgICAgZW52X2NtZDogVGhlIHNoZWxsIGNvbW1hbmQuIEEgMi10dXBsZSB3aGVyZSBlbGVtZW50IDAgaXMgYSBkaWN0IG9mIGV4dHJhCisgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCwgYW5kIGVsZW1lbnQgMSBpcyBhIHN0cmluZyB3aXRoCisgICAgICAgICAgICAgdGhlIGNvbW1hbmQgYW5kIGFueSBmbGFncy4KKworICBSZXR1cm5zOgorICAgIEEgc3RyaW5nIHdpdGggdGhlIGNvbW1hbmQncyBjb21iaW5lZCBzdGFuZGFyZCBhbmQgZGlhZ25vc3RpYyBvdXRwdXQuCisgICIiIgorCisgICMgU3Bhd25zIGNtZCBpbiBhIHN1Yi1wcm9jZXNzLCBhbmQgZ2V0cyBpdHMgc3RhbmRhcmQgSS9PIGZpbGUgb2JqZWN0cy4KKyAgIyBTZXQgYW5kIHNhdmUgdGhlIGVudmlyb25tZW50IHByb3Blcmx5LgorICBlbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgZW52aXJvbi51cGRhdGUoZW52X2NtZFswXSkKKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcyhlbnZfY21kWzFdLCBlbnY9ZW52aXJvbikKKworICByZXR1cm4gcC5vdXRwdXQKKworCitkZWYgR2V0Q29tbWFuZE91dHB1dChlbnZfY21kKToKKyAgIiIiUnVucyBhIGNvbW1hbmQgYW5kIHJldHVybnMgaXRzIG91dHB1dCB3aXRoIGFsbCBmaWxlIGxvY2F0aW9uCisgIGluZm8gc3RyaXBwZWQgb2ZmLgorCisgIEFyZ3M6CisgICAgZW52X2NtZDogIFRoZSBzaGVsbCBjb21tYW5kLiBBIDItdHVwbGUgd2hlcmUgZWxlbWVudCAwIGlzIGEgZGljdCBvZiBleHRyYQorICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0LCBhbmQgZWxlbWVudCAxIGlzIGEgc3RyaW5nIHdpdGgKKyAgICAgICAgICAgICAgdGhlIGNvbW1hbmQgYW5kIGFueSBmbGFncy4KKyAgIiIiCisKKyAgIyBEaXNhYmxlcyBleGNlcHRpb24gcG9wLXVwcyBvbiBXaW5kb3dzLgorICBlbnZpcm9uLCBjbWRsaW5lID0gZW52X2NtZAorICBlbnZpcm9uID0gZGljdChlbnZpcm9uKSAgIyBFbnN1cmVzIHdlIGFyZSBtb2RpZnlpbmcgYSBjb3B5LgorICBlbnZpcm9uW0NBVENIX0VYQ0VQVElPTlNfRU5WX1ZBUl9OQU1FXSA9ICcxJworICByZXR1cm4gTm9ybWFsaXplT3V0cHV0KEdldFNoZWxsQ29tbWFuZE91dHB1dCgoZW52aXJvbiwgY21kbGluZSkpKQorCisKK2RlZiBHZXRPdXRwdXRPZkFsbENvbW1hbmRzKCk6CisgICIiIlJldHVybnMgY29uY2F0ZW5hdGVkIG91dHB1dCBmcm9tIHNldmVyYWwgcmVwcmVzZW50YXRpdmUgY29tbWFuZHMuIiIiCisKKyAgcmV0dXJuIChHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9DT0xPUikgKworICAgICAgICAgIEdldENvbW1hbmRPdXRwdXQoQ09NTUFORF9XSVRIX1RJTUUpICsKKyAgICAgICAgICBHZXRDb21tYW5kT3V0cHV0KENPTU1BTkRfV0lUSF9ESVNBQkxFRCkgKworICAgICAgICAgIEdldENvbW1hbmRPdXRwdXQoQ09NTUFORF9XSVRIX1NIQVJESU5HKSkKKworCit0ZXN0X2xpc3QgPSBHZXRTaGVsbENvbW1hbmRPdXRwdXQoQ09NTUFORF9MSVNUX1RFU1RTKQorU1VQUE9SVFNfREVBVEhfVEVTVFMgPSAnRGVhdGhUZXN0JyBpbiB0ZXN0X2xpc3QKK1NVUFBPUlRTX1RZUEVEX1RFU1RTID0gJ1R5cGVkVGVzdCcgaW4gdGVzdF9saXN0CitTVVBQT1JUU19USFJFQURTID0gJ0V4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QnIGluIHRlc3RfbGlzdAorU1VQUE9SVFNfU1RBQ0tfVFJBQ0VTID0gRmFsc2UKKworQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFID0gKFNVUFBPUlRTX0RFQVRIX1RFU1RTIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRTX1RZUEVEX1RFU1RTIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRTX1RIUkVBRFMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IElTX1dJTkRPV1MpCisKK2NsYXNzIEdUZXN0T3V0cHV0VGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgZGVmIFJlbW92ZVVuc3VwcG9ydGVkVGVzdHMoc2VsZiwgdGVzdF9vdXRwdXQpOgorICAgIGlmIG5vdCBTVVBQT1JUU19ERUFUSF9URVNUUzoKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ0RlYXRoVGVzdCcpCisgICAgaWYgbm90IFNVUFBPUlRTX1RZUEVEX1RFU1RTOgorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LCAnVHlwZWRUZXN0JykKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ1R5cGVkRGVhdGhUZXN0JykKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlTWF0Y2hpbmdUZXN0cyh0ZXN0X291dHB1dCwgJ1R5cGVQYXJhbURlYXRoVGVzdCcpCisgICAgaWYgbm90IFNVUFBPUlRTX1RIUkVBRFM6CisgICAgICB0ZXN0X291dHB1dCA9IFJlbW92ZU1hdGNoaW5nVGVzdHModGVzdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QnKQorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QnKQorICAgICAgdGVzdF9vdXRwdXQgPSBSZW1vdmVNYXRjaGluZ1Rlc3RzKHRlc3Rfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3Jrc0NvbmN1cnJlbnRseScpCisgICAgaWYgbm90IFNVUFBPUlRTX1NUQUNLX1RSQUNFUzoKKyAgICAgIHRlc3Rfb3V0cHV0ID0gUmVtb3ZlU3RhY2tUcmFjZXModGVzdF9vdXRwdXQpCisKKyAgICByZXR1cm4gdGVzdF9vdXRwdXQKKworICBkZWYgdGVzdE91dHB1dChzZWxmKToKKyAgICBvdXRwdXQgPSBHZXRPdXRwdXRPZkFsbENvbW1hbmRzKCkKKworICAgIGdvbGRlbl9maWxlID0gb3BlbihHT0xERU5fUEFUSCwgJ3JiJykKKyAgICAjIEEgbWlzLWNvbmZpZ3VyZWQgc291cmNlIGNvbnRyb2wgc3lzdGVtIGNhbiBjYXVzZSBcciBhcHBlYXIgaW4gRU9MCisgICAgIyBzZXF1ZW5jZXMgd2hlbiB3ZSByZWFkIHRoZSBnb2xkZW4gZmlsZSBpcnJlc3BlY3RpdmUgb2YgYW4gb3BlcmF0aW5nCisgICAgIyBzeXN0ZW0gdXNlZC4gVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIHN0cmlwIHRob3NlIFxyJ3MgZnJvbSBuZXdsaW5lcworICAgICMgdW5jb25kaXRpb25hbGx5LgorICAgIGdvbGRlbiA9IFRvVW5peExpbmVFbmRpbmcoZ29sZGVuX2ZpbGUucmVhZCgpKQorICAgIGdvbGRlbl9maWxlLmNsb3NlKCkKKworICAgICMgV2Ugd2FudCB0aGUgdGVzdCB0byBwYXNzIHJlZ2FyZGxlc3Mgb2YgY2VydGFpbiBmZWF0dXJlcyBiZWluZworICAgICMgc3VwcG9ydGVkIG9yIG5vdC4KKworICAgICMgV2Ugc3RpbGwgaGF2ZSB0byByZW1vdmUgdHlwZSBuYW1lIHNwZWNpZmljcyBpbiBhbGwgY2FzZXMuCisgICAgbm9ybWFsaXplZF9hY3R1YWwgPSBSZW1vdmVUeXBlSW5mb0RldGFpbHMob3V0cHV0KQorICAgIG5vcm1hbGl6ZWRfZ29sZGVuID0gUmVtb3ZlVHlwZUluZm9EZXRhaWxzKGdvbGRlbikKKworICAgIGlmIENBTl9HRU5FUkFURV9HT0xERU5fRklMRToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybWFsaXplZF9nb2xkZW4sIG5vcm1hbGl6ZWRfYWN0dWFsLAorICAgICAgICAgICAgICAgICAgICAgICAnXG4nLmpvaW4oZGlmZmxpYi51bmlmaWVkX2RpZmYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkX2dvbGRlbi5zcGxpdCgnXG4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsLnNwbGl0KCdcbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvbGRlbicsICdhY3R1YWwnKSkpCisgICAgZWxzZToKKyAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsID0gTm9ybWFsaXplVG9DdXJyZW50UGxhdGZvcm0oCisgICAgICAgICAgUmVtb3ZlVGVzdENvdW50cyhub3JtYWxpemVkX2FjdHVhbCkpCisgICAgICBub3JtYWxpemVkX2dvbGRlbiA9IE5vcm1hbGl6ZVRvQ3VycmVudFBsYXRmb3JtKAorICAgICAgICAgIFJlbW92ZVRlc3RDb3VudHMoc2VsZi5SZW1vdmVVbnN1cHBvcnRlZFRlc3RzKG5vcm1hbGl6ZWRfZ29sZGVuKSkpCisKKyAgICAgICMgVGhpcyBjb2RlIGlzIHZlcnkgaGFuZHkgd2hlbiBkZWJ1Z2dpbmcgZ29sZGVuIGZpbGUgZGlmZmVyZW5jZXM6CisgICAgICBpZiBvcy5nZXRlbnYoJ0RFQlVHX0dURVNUX09VVFBVVF9URVNUJyk6CisgICAgICAgIG9wZW4ob3MucGF0aC5qb2luKAorICAgICAgICAgICAgZ3Rlc3RfdGVzdF91dGlscy5HZXRTb3VyY2VEaXIoKSwKKyAgICAgICAgICAgICdfZ3Rlc3Rfb3V0cHV0X3Rlc3Rfbm9ybWFsaXplZF9hY3R1YWwudHh0JyksICd3YicpLndyaXRlKAorICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfYWN0dWFsKQorICAgICAgICBvcGVuKG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIGd0ZXN0X3Rlc3RfdXRpbHMuR2V0U291cmNlRGlyKCksCisgICAgICAgICAgICAnX2d0ZXN0X291dHB1dF90ZXN0X25vcm1hbGl6ZWRfZ29sZGVuLnR4dCcpLCAnd2InKS53cml0ZSgKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkX2dvbGRlbikKKworICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtYWxpemVkX2dvbGRlbiwgbm9ybWFsaXplZF9hY3R1YWwpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgaWYgc3lzLmFyZ3ZbMTpdID09IFtHRU5HT0xERU5fRkxBR106CisgICAgaWYgQ0FOX0dFTkVSQVRFX0dPTERFTl9GSUxFOgorICAgICAgb3V0cHV0ID0gR2V0T3V0cHV0T2ZBbGxDb21tYW5kcygpCisgICAgICBnb2xkZW5fZmlsZSA9IG9wZW4oR09MREVOX1BBVEgsICd3YicpCisgICAgICBnb2xkZW5fZmlsZS53cml0ZShvdXRwdXQpCisgICAgICBnb2xkZW5fZmlsZS5jbG9zZSgpCisgICAgZWxzZToKKyAgICAgIG1lc3NhZ2UgPSAoCisgICAgICAgICAgIiIiVW5hYmxlIHRvIHdyaXRlIGEgZ29sZGVuIGZpbGUgd2hlbiBjb21waWxlZCBpbiBhbiBlbnZpcm9ubWVudAordGhhdCBkb2VzIG5vdCBzdXBwb3J0IGFsbCB0aGUgcmVxdWlyZWQgZmVhdHVyZXMgKGRlYXRoIHRlc3RzLCB0eXBlZCB0ZXN0cywKK2FuZCBtdWx0aXBsZSB0aHJlYWRzKS4gIFBsZWFzZSBnZW5lcmF0ZSB0aGUgZ29sZGVuIGZpbGUgdXNpbmcgYSBiaW5hcnkgYnVpbHQKK3dpdGggdGhvc2UgZmVhdHVyZXMgZW5hYmxlZC4iIiIpCisKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUobWVzc2FnZSkKKyAgICAgIHN5cy5leGl0KDEpCisgIGVsc2U6CisgICAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X291dHB1dF90ZXN0Xy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X291dHB1dF90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDcwYTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjCkBAIC0wLDAgKzEsMTA2MiBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBnZW5lcmF0ZSBHb29nbGUgVGVzdCBvdXRwdXQgdW5kZXIKKy8vIHZhcmlvdXMgY29uZGl0aW9ucy4gIFRoZSBvdXRwdXQgd2lsbCB0aGVuIGJlIHZlcmlmaWVkIGJ5CisvLyBndGVzdF9vdXRwdXRfdGVzdC5weSB0byBlbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBnZW5lcmF0ZXMgdGhlCisvLyBkZXNpcmVkIG1lc3NhZ2VzLiAgVGhlcmVmb3JlLCBtb3N0IHRlc3RzIGluIHRoaXMgZmlsZSBhcmUgTUVBTlQgVE8KKy8vIEZBSUwuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKK3VzaW5nIHRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheTsKKwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6Ok5vdGlmaWNhdGlvbjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUaHJlYWRXaXRoUGFyYW07CisjZW5kaWYKKworbmFtZXNwYWNlIHBvc2l4ID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg7CisKKy8vIFRlc3RzIGNhdGNoaW5nIGZhdGFsIGZhaWx1cmVzLgorCisvLyBBIHN1YnJvdXRpbmUgdXNlZCBieSB0aGUgZm9sbG93aW5nIHRlc3QuCit2b2lkIFRlc3RFcTEoaW50IHgpIHsKKyAgQVNTRVJUX0VRKDEsIHgpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgdGVzdCBzdWJyb3V0aW5lLCBjYXRjaGVzIHRoZSBmYXRhbCBmYWlsdXJlIGl0CisvLyBnZW5lcmF0ZXMsIGFuZCB0aGVuIHJldHVybnMgZWFybHkuCit2b2lkIFRyeVRlc3RTdWJyb3V0aW5lKCkgeworICAvLyBDYWxscyBhIHN1YnJvdW50aW5lIHRoYXQgeWllbGRzIGEgZmF0YWwgZmFpbHVyZS4KKyAgVGVzdEVxMSgyKTsKKworICAvLyBDYXRjaGVzIHRoZSBmYXRhbCBmYWlsdXJlIGFuZCBhYm9ydHMgdGhlIHRlc3QuCisgIC8vCisgIC8vIFRoZSB0ZXN0aW5nOjpUZXN0OjogcHJlZml4IGlzIG5lY2Vzc2FyeSB3aGVuIGNhbGxpbmcKKyAgLy8gSGFzRmF0YWxGYWlsdXJlKCkgb3V0c2lkZSBvZiBhIFRFU1QsIFRFU1RfRiwgb3IgdGVzdCBmaXh0dXJlLgorICBpZiAodGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKworICAvLyBJZiB3ZSBnZXQgaGVyZSwgc29tZXRoaW5nIGlzIHdyb25nLgorICBGQUlMKCkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQuIjsKK30KKworVEVTVChQYXNzaW5nVGVzdCwgUGFzc2luZ1Rlc3QxKSB7Cit9CisKK1RFU1QoUGFzc2luZ1Rlc3QsIFBhc3NpbmdUZXN0MikgeworfQorCisvLyBUZXN0cyB0aGF0IHBhcmFtZXRlcnMgb2YgZmFpbGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBwcmludGVkIGluIHRoZQorLy8gZmFpbGluZyB0ZXN0IHN1bW1hcnkuCitjbGFzcyBGYWlsaW5nUGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7fTsKKworVEVTVF9QKEZhaWxpbmdQYXJhbVRlc3QsIEZhaWxzKSB7CisgIEVYUEVDVF9FUSgxLCBHZXRQYXJhbSgpKTsKK30KKworLy8gVGhpcyBnZW5lcmF0ZXMgYSB0ZXN0IHdoaWNoIHdpbGwgZmFpbC4gR29vZ2xlIFRlc3QgaXMgZXhwZWN0ZWQgdG8gcHJpbnQKKy8vIGl0cyBwYXJhbWV0ZXIgd2hlbiBpdCBvdXRwdXRzIHRoZSBsaXN0IG9mIGFsbCBmYWlsZWQgdGVzdHMuCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChQcmludGluZ0ZhaWxpbmdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBGYWlsaW5nUGFyYW1UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKDIpKTsKKworc3RhdGljIGNvbnN0IGNoYXIga0dvbGRlblN0cmluZ1tdID0gIlwiTGluZVwwIDFcIlxuTGluZSAyIjsKKworVEVTVChOb25mYXRhbEZhaWx1cmVUZXN0LCBFc2NhcGVzU3RyaW5nT3BlcmFuZHMpIHsKKyAgc3RkOjpzdHJpbmcgYWN0dWFsID0gImFjdHVhbCBcInN0cmluZ1wiIjsKKyAgRVhQRUNUX0VRKGtHb2xkZW5TdHJpbmcsIGFjdHVhbCk7CisKKyAgY29uc3QgY2hhciogZ29sZGVuID0ga0dvbGRlblN0cmluZzsKKyAgRVhQRUNUX0VRKGdvbGRlbiwgYWN0dWFsKTsKK30KKworVEVTVChOb25mYXRhbEZhaWx1cmVUZXN0LCBEaWZmRm9yTG9uZ1N0cmluZ3MpIHsKKyAgc3RkOjpzdHJpbmcgZ29sZGVuX3N0cihrR29sZGVuU3RyaW5nLCBzaXplb2Yoa0dvbGRlblN0cmluZykgLSAxKTsKKyAgRVhQRUNUX0VRKGdvbGRlbl9zdHIsICJMaW5lIDIiKTsKK30KKworLy8gVGVzdHMgY2F0Y2hpbmcgYSBmYXRhbCBmYWlsdXJlIGluIGEgc3Vicm91dGluZS4KK1RFU1QoRmF0YWxGYWlsdXJlVGVzdCwgRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKVxuIik7CisKKyAgVHJ5VGVzdFN1YnJvdXRpbmUoKTsKK30KKworLy8gVGVzdHMgY2F0Y2hpbmcgYSBmYXRhbCBmYWlsdXJlIGluIGEgbmVzdGVkIHN1YnJvdXRpbmUuCitURVNUKEZhdGFsRmFpbHVyZVRlc3QsIEZhdGFsRmFpbHVyZUluTmVzdGVkU3Vicm91dGluZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSlcbiIpOworCisgIC8vIENhbGxzIGEgc3Vicm91bnRpbmUgdGhhdCB5aWVsZHMgYSBmYXRhbCBmYWlsdXJlLgorICBUcnlUZXN0U3Vicm91dGluZSgpOworCisgIC8vIENhdGNoZXMgdGhlIGZhdGFsIGZhaWx1cmUgYW5kIGFib3J0cyB0aGUgdGVzdC4KKyAgLy8KKyAgLy8gV2hlbiBjYWxsaW5nIEhhc0ZhdGFsRmFpbHVyZSgpIGluc2lkZSBhIFRFU1QsIFRFU1RfRiwgb3IgdGVzdAorICAvLyBmaXh0dXJlLCB0aGUgdGVzdGluZzo6VGVzdDo6IHByZWZpeCBpcyBub3QgbmVlZGVkLgorICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKworICAvLyBJZiB3ZSBnZXQgaGVyZSwgc29tZXRoaW5nIGlzIHdyb25nLgorICBGQUlMKCkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQuIjsKK30KKworLy8gVGVzdHMgSGFzRmF0YWxGYWlsdXJlKCkgYWZ0ZXIgYSBmYWlsZWQgRVhQRUNUIGNoZWNrLgorVEVTVChGYXRhbEZhaWx1cmVUZXN0LCBOb25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSBvbiBmYWxzZSlcbiIpOworICBFWFBFQ1RfVFJVRShmYWxzZSk7ICAvLyBHZW5lcmF0ZXMgYSBub25mYXRhbCBmYWlsdXJlCisgIEFTU0VSVF9GQUxTRShIYXNGYXRhbEZhaWx1cmUoKSk7ICAvLyBUaGlzIHNob3VsZCBzdWNjZWVkLgorfQorCisvLyBUZXN0cyBpbnRlcmxlYXZpbmcgdXNlciBsb2dnaW5nIGFuZCBHb29nbGUgVGVzdCBhc3NlcnRpb25zLgorVEVTVChMb2dnaW5nVGVzdCwgSW50ZXJsZWF2aW5nTG9nZ2luZ0FuZEFzc2VydGlvbnMpIHsKKyAgc3RhdGljIGNvbnN0IGludCBhWzRdID0geworICAgIDMsIDksIDIsIDYKKyAgfTsKKworICBwcmludGYoIihleHBlY3RpbmcgMiBmYWlsdXJlcyBvbiAoMykgPj0gKGFbaV0pKVxuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoYSkvc2l6ZW9mKCphKSk7IGkrKykgeworICAgIHByaW50ZigiaSA9PSAlZFxuIiwgaSk7CisgICAgRVhQRUNUX0dFKDMsIGFbaV0pOworICB9Cit9CisKKy8vIFRlc3RzIHRoZSBTQ09QRURfVFJBQ0UgbWFjcm8uCisKKy8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIFNDT1BFRF9UUkFDRS4KK3ZvaWQgU3ViV2l0aG91dFRyYWNlKGludCBuKSB7CisgIEVYUEVDVF9FUSgxLCBuKTsKKyAgQVNTRVJUX0VRKDIsIG4pOworfQorCisvLyBBbm90aGVyIGhlbHBlciBmdW5jdGlvbiBmb3IgdGVzdGluZyBTQ09QRURfVFJBQ0UuCit2b2lkIFN1YldpdGhUcmFjZShpbnQgbikgeworICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpIDw8ICJuID0gIiA8PCBuKTsKKworICBTdWJXaXRob3V0VHJhY2Uobik7Cit9CisKKy8vIFRlc3RzIHRoYXQgU0NPUEVEX1RSQUNFKCkgb2JleXMgbGV4aWNhbCBzY29wZXMuCitURVNUKFNDT1BFRF9UUkFDRVRlc3QsIE9iZXlzU2NvcGVzKSB7CisgIHByaW50ZigiKGV4cGVjdGVkIHRvIGZhaWwpXG4iKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gdHJhY2UgYmVmb3JlIFNDT1BFRF9UUkFDRSgpIGlzIGludm9rZWQuCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZG4ndCBoYXZlIGEgdHJhY2UuIjsKKworICB7CisgICAgU0NPUEVEX1RSQUNFKCJFeHBlY3RlZCB0cmFjZSIpOworICAgIC8vIEFmdGVyIFNDT1BFRF9UUkFDRSgpLCBhIGZhaWx1cmUgaW4gdGhlIGN1cnJlbnQgc2NvcGUgc2hvdWxkIGNvbnRhaW4KKyAgICAvLyB0aGUgdHJhY2UuCisgICAgQUREX0ZBSUxVUkUoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkIGhhdmUgYSB0cmFjZS4iOworICB9CisKKyAgLy8gT25jZSB0aGUgY29udHJvbCBsZWF2ZXMgdGhlIHNjb3BlIG9mIHRoZSBTQ09QRURfVFJBQ0UoKSwgdGhlcmUKKyAgLy8gc2hvdWxkIGJlIG5vIHRyYWNlIGFnYWluLgorICBBRERfRkFJTFVSRSgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGRuJ3QgaGF2ZSBhIHRyYWNlLiI7Cit9CisKKy8vIFRlc3RzIHRoYXQgU0NPUEVEX1RSQUNFIHdvcmtzIGluc2lkZSBhIGxvb3AuCitURVNUKFNDT1BFRF9UUkFDRVRlc3QsIFdvcmtzSW5Mb29wKSB7CisgIHByaW50ZigiKGV4cGVjdGVkIHRvIGZhaWwpXG4iKTsKKworICBmb3IgKGludCBpID0gMTsgaSA8PSAyOyBpKyspIHsKKyAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpIDw8ICJpID0gIiA8PCBpKTsKKworICAgIFN1YldpdGhvdXRUcmFjZShpKTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSB3b3JrcyBpbiBhIHN1YnJvdXRpbmUuCitURVNUKFNDT1BFRF9UUkFDRVRlc3QsIFdvcmtzSW5TdWJyb3V0aW5lKSB7CisgIHByaW50ZigiKGV4cGVjdGVkIHRvIGZhaWwpXG4iKTsKKworICBTdWJXaXRoVHJhY2UoMSk7CisgIFN1YldpdGhUcmFjZSgyKTsKK30KKworLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0UgY2FuIGJlIG5lc3RlZC4KK1RFU1QoU0NPUEVEX1RSQUNFVGVzdCwgQ2FuQmVOZXN0ZWQpIHsKKyAgcHJpbnRmKCIoZXhwZWN0ZWQgdG8gZmFpbClcbiIpOworCisgIFNDT1BFRF9UUkFDRSgiIik7ICAvLyBBIHRyYWNlIHdpdGhvdXQgYSBtZXNzYWdlLgorCisgIFN1YldpdGhUcmFjZSgyKTsKK30KKworLy8gVGVzdHMgdGhhdCBtdWx0aXBsZSBTQ09QRURfVFJBQ0VzIGNhbiBiZSB1c2VkIGluIHRoZSBzYW1lIHNjb3BlLgorVEVTVChTQ09QRURfVFJBQ0VUZXN0LCBDYW5CZVJlcGVhdGVkKSB7CisgIHByaW50ZigiKGV4cGVjdGVkIHRvIGZhaWwpXG4iKTsKKworICBTQ09QRURfVFJBQ0UoIkEiKTsKKyAgQUREX0ZBSUxVUkUoKQorICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluIHRyYWNlIHBvaW50IEEuIjsKKworICBTQ09QRURfVFJBQ0UoIkIiKTsKKyAgQUREX0ZBSUxVUkUoKQorICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluIHRyYWNlIHBvaW50IEEgYW5kIEIuIjsKKworICB7CisgICAgU0NPUEVEX1RSQUNFKCJDIik7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjb250YWluIHRyYWNlIHBvaW50IEEsIEIsIGFuZCBDLiI7CisgIH0KKworICBTQ09QRURfVFJBQ0UoIkQiKTsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkICIKKyAgICAgICAgICAgICAgICA8PCAiY29udGFpbiB0cmFjZSBwb2ludCBBLCBCLCBhbmQgRC4iOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorLy8gVGVzdHMgdGhhdCBTQ09QRURfVFJBQ0UoKXMgY2FuIGJlIHVzZWQgY29uY3VycmVudGx5IGZyb20gbXVsdGlwbGUKKy8vIHRocmVhZHMuICBOYW1lbHksIGFuIGFzc2VydGlvbiBzaG91bGQgYmUgYWZmZWN0ZWQgYnkKKy8vIFNDT1BFRF9UUkFDRSgpcyBpbiBpdHMgb3duIHRocmVhZCBvbmx5LgorCisvLyBIZXJlJ3MgdGhlIHNlcXVlbmNlIG9mIGFjdGlvbnMgdGhhdCBoYXBwZW4gaW4gdGhlIHRlc3Q6CisvLworLy8gICBUaHJlYWQgQSAobWFpbikgICAgICAgICAgICAgICAgfCBUaHJlYWQgQiAoc3Bhd25lZCkKKy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBzcGF3bnMgdGhyZWFkIEIgICAgICAgICAgICAgICAgfAorLy8gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHdhaXRzIGZvciBuMSAgICAgICAgICAgICAgICAgICB8IFNDT1BFRF9UUkFDRSgiVHJhY2UgQiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZXMgZmFpbHVyZSAjMQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBub3RpZmllcyBuMQorLy8gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIFNDT1BFRF9UUkFDRSgiVHJhY2UgQSIpOyAgICAgICB8IHdhaXRzIGZvciBuMgorLy8gICBnZW5lcmF0ZXMgZmFpbHVyZSAjMiAgICAgICAgICAgfAorLy8gICBub3RpZmllcyBuMiAgICAgICAgICAgICAgICAgICAgfAorLy8gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIHdhaXRzIGZvciBuMyAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlcyBmYWlsdXJlICMzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYWNlIEIgZGllcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZXMgZmFpbHVyZSAjNAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBub3RpZmllcyBuMworLy8gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIGdlbmVyYXRlcyBmYWlsdXJlICM1ICAgICAgICAgICB8IGZpbmlzaGVzCisvLyAgIHRyYWNlIEEgZGllcyAgICAgICAgICAgICAgICAgICB8CisvLyAgIGdlbmVyYXRlcyBmYWlsdXJlICM2ICAgICAgICAgICB8CisvLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgd2FpdHMgZm9yIHRocmVhZCBCIHRvIGZpbmlzaCAgIHwKKworc3RydWN0IENoZWNrUG9pbnRzIHsKKyAgTm90aWZpY2F0aW9uIG4xOworICBOb3RpZmljYXRpb24gbjI7CisgIE5vdGlmaWNhdGlvbiBuMzsKK307CisKK3N0YXRpYyB2b2lkIFRocmVhZFdpdGhTY29wZWRUcmFjZShDaGVja1BvaW50cyogY2hlY2tfcG9pbnRzKSB7CisgIHsKKyAgICBTQ09QRURfVFJBQ0UoIlRyYWNlIEIiKTsKKyAgICBBRERfRkFJTFVSRSgpCisgICAgICAgIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMxIChpbiB0aHJlYWQgQiwgb25seSB0cmFjZSBCIGFsaXZlKS4iOworICAgIGNoZWNrX3BvaW50cy0+bjEuTm90aWZ5KCk7CisgICAgY2hlY2tfcG9pbnRzLT5uMi5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7CisKKyAgICBBRERfRkFJTFVSRSgpCisgICAgICAgIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzIChpbiB0aHJlYWQgQiwgdHJhY2UgQSAmIEIgYm90aCBhbGl2ZSkuIjsKKyAgfSAgLy8gVHJhY2UgQiBkaWVzIGhlcmUuCisgIEFERF9GQUlMVVJFKCkKKyAgICAgIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM0IChpbiB0aHJlYWQgQiwgb25seSB0cmFjZSBBIGFsaXZlKS4iOworICBjaGVja19wb2ludHMtPm4zLk5vdGlmeSgpOworfQorCitURVNUKFNDT1BFRF9UUkFDRVRlc3QsIFdvcmtzQ29uY3VycmVudGx5KSB7CisgIHByaW50ZigiKGV4cGVjdGluZyA2IGZhaWx1cmVzKVxuIik7CisKKyAgQ2hlY2tQb2ludHMgY2hlY2tfcG9pbnRzOworICBUaHJlYWRXaXRoUGFyYW08Q2hlY2tQb2ludHMqPiB0aHJlYWQoJlRocmVhZFdpdGhTY29wZWRUcmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGVja19wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgY2hlY2tfcG9pbnRzLm4xLldhaXRGb3JOb3RpZmljYXRpb24oKTsKKworICB7CisgICAgU0NPUEVEX1RSQUNFKCJUcmFjZSBBIik7CisgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMiAoaW4gdGhyZWFkIEEsIHRyYWNlIEEgJiBCIGJvdGggYWxpdmUpLiI7CisgICAgY2hlY2tfcG9pbnRzLm4yLk5vdGlmeSgpOworICAgIGNoZWNrX3BvaW50cy5uMy5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7CisKKyAgICBBRERfRkFJTFVSRSgpCisgICAgICAgIDw8ICJFeHBlY3RlZCBmYWlsdXJlICM1IChpbiB0aHJlYWQgQSwgb25seSB0cmFjZSBBIGFsaXZlKS4iOworICB9ICAvLyBUcmFjZSBBIGRpZXMgaGVyZS4KKyAgQUREX0ZBSUxVUkUoKQorICAgICAgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzYgKGluIHRocmVhZCBBLCBubyB0cmFjZSBhbGl2ZSkuIjsKKyAgdGhyZWFkLkpvaW4oKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQorCitURVNUKERpc2FibGVkVGVzdHNXYXJuaW5nVGVzdCwKKyAgICAgRElTQUJMRURfQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnU3VwcHJlc3Nlc1dhcm5pbmcpIHsKKyAgLy8gVGhpcyB0ZXN0IGJvZHkgaXMgaW50ZW50aW9uYWxseSBlbXB0eS4gIEl0cyBzb2xlIHB1cnBvc2UgaXMgZm9yCisgIC8vIHZlcmlmeWluZyB0aGF0IHRoZSAtLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcKKyAgLy8gc3VwcHJlc3NlcyB0aGUgIllPVSBIQVZFIDEyIERJU0FCTEVEIFRFU1RTIiB3YXJuaW5nIGF0IHRoZSBlbmQgb2YKKyAgLy8gdGhlIHRlc3Qgb3V0cHV0LgorfQorCisvLyBUZXN0cyB1c2luZyBhc3NlcnRpb25zIG91dHNpZGUgb2YgVEVTVCBhbmQgVEVTVF9GLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0d28gZmFpbHVyZXMgaW50ZW50aW9uYWxseS4KK3ZvaWQgQWRIb2NUZXN0KCkgeworICBwcmludGYoIlRoZSBub24tdGVzdCBwYXJ0IG9mIHRoZSBjb2RlIGlzIGV4cGVjdGVkIHRvIGhhdmUgMiBmYWlsdXJlcy5cblxuIik7CisgIEVYUEVDVF9UUlVFKGZhbHNlKTsKKyAgRVhQRUNUX0VRKDIsIDMpOworfQorCisvLyBSdW5zIGFsbCBURVNUcywgYWxsIFRFU1RfRnMsIGFuZCB0aGUgYWQgaG9jIHRlc3QuCitpbnQgUnVuQWxsVGVzdHMoKSB7CisgIEFkSG9jVGVzdCgpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorCisvLyBUZXN0cyBub24tZmF0YWwgZmFpbHVyZXMgaW4gdGhlIGZpeHR1cmUgY29uc3RydWN0b3IuCitjbGFzcyBOb25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBOb25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgcHJpbnRmKCIoZXhwZWN0aW5nIDUgZmFpbHVyZXMpXG4iKTsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGMndG9yLiI7CisgIH0KKworICB+Tm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0KCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzUsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiBTZXRVcCgpLiI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNCwgaW4gVGVhckRvd24uIjsKKyAgfQorfTsKKworVEVTVF9GKE5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCwgRmFpbHVyZUluQ29uc3RydWN0b3IpIHsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gdGhlIHRlc3QgYm9keS4iOworfQorCisvLyBUZXN0cyBmYXRhbCBmYWlsdXJlcyBpbiB0aGUgZml4dHVyZSBjb25zdHJ1Y3Rvci4KK2NsYXNzIEZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICBwcmludGYoIihleHBlY3RpbmcgMiBmYWlsdXJlcylcbiIpOworICAgIEluaXQoKTsKKyAgfQorCisgIH5GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIlVORVhQRUNURUQgZmFpbHVyZSBpbiBTZXRVcCgpLiAgIgorICAgICAgICAgICAgICAgICAgPDwgIldlIHNob3VsZCBuZXZlciBnZXQgaGVyZSwgYXMgdGhlIHRlc3QgZml4dHVyZSBjJ3RvciAiCisgICAgICAgICAgICAgICAgICA8PCAiaGFkIGEgZmF0YWwgZmFpbHVyZS4iOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgIlVORVhQRUNURUQgZmFpbHVyZSBpbiBUZWFyRG93bigpLiAgIgorICAgICAgICAgICAgICAgICAgPDwgIldlIHNob3VsZCBuZXZlciBnZXQgaGVyZSwgYXMgdGhlIHRlc3QgZml4dHVyZSBjJ3RvciAiCisgICAgICAgICAgICAgICAgICA8PCAiaGFkIGEgZmF0YWwgZmFpbHVyZS4iOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIEluaXQoKSB7CisgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGMndG9yLiI7CisgIH0KK307CisKK1RFU1RfRihGYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QsIEZhaWx1cmVJbkNvbnN0cnVjdG9yKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIlVORVhQRUNURUQgZmFpbHVyZSBpbiB0aGUgdGVzdCBib2R5LiAgIgorICAgICAgICAgICAgICAgIDw8ICJXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGFzIHRoZSB0ZXN0IGZpeHR1cmUgYyd0b3IgIgorICAgICAgICAgICAgICAgIDw8ICJoYWQgYSBmYXRhbCBmYWlsdXJlLiI7Cit9CisKKy8vIFRlc3RzIG5vbi1mYXRhbCBmYWlsdXJlcyBpbiBTZXRVcCgpLgorY2xhc3MgTm9uRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5Ob25GYXRhbEZhaWx1cmVJblNldFVwVGVzdCgpIHsKKyAgICBEZWluaXQoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBwcmludGYoIihleHBlY3RpbmcgNCBmYWlsdXJlcylcbiIpOworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIFNldFVwKCkuIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzMsIGluIFRlYXJEb3duKCkuIjsKKyAgfQorIHByaXZhdGU6CisgIHZvaWQgRGVpbml0KCkgeworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNCwgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4iOworICB9Cit9OworCitURVNUX0YoTm9uRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QsIEZhaWx1cmVJblNldFVwKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gdGhlIHRlc3QgZnVuY3Rpb24uIjsKK30KKworLy8gVGVzdHMgZmF0YWwgZmFpbHVyZXMgaW4gU2V0VXAoKS4KK2NsYXNzIEZhdGFsRmFpbHVyZUluU2V0VXBUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB+RmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QoKSB7CisgICAgRGVpbml0KCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcHJpbnRmKCIoZXhwZWN0aW5nIDMgZmFpbHVyZXMpXG4iKTsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzEsIGluIFNldFVwKCkuIjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzIsIGluIFRlYXJEb3duKCkuIjsKKyAgfQorIHByaXZhdGU6CisgIHZvaWQgRGVpbml0KCkgeworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4iOworICB9Cit9OworCitURVNUX0YoRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QsIEZhaWx1cmVJblNldFVwKSB7CisgIEZBSUwoKSA8PCAiVU5FWFBFQ1RFRCBmYWlsdXJlIGluIHRoZSB0ZXN0IGZ1bmN0aW9uLiAgIgorICAgICAgICAgPDwgIldlIHNob3VsZCBuZXZlciBnZXQgaGVyZSwgYXMgU2V0VXAoKSBmYWlsZWQuIjsKK30KKworVEVTVChBZGRGYWlsdXJlQXRUZXN0LCBNZXNzYWdlQ29udGFpbnNTcGVjaWZpZWRGaWxlQW5kTGluZU51bWJlcikgeworICBBRERfRkFJTFVSRV9BVCgiZm9vLmNjIiwgNDIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIGluIGZvby5jYyI7Cit9CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCisKKy8vIEEgdW5hcnkgZnVuY3Rpb24gdGhhdCBtYXkgZGllLgordm9pZCBEaWVJZihib29sIHNob3VsZF9kaWUpIHsKKyAgR1RFU1RfQ0hFQ0tfKCFzaG91bGRfZGllKSA8PCAiIC0gZGVhdGggaW5zaWRlIERpZUlmKCkuIjsKK30KKworLy8gVGVzdHMgcnVubmluZyBkZWF0aCB0ZXN0cyBpbiBhIG11bHRpLXRocmVhZGVkIGNvbnRleHQuCisKKy8vIFVzZWQgZm9yIGNvb3JkaW5hdGlvbiBiZXR3ZWVuIHRoZSBtYWluIGFuZCB0aGUgc3Bhd24gdGhyZWFkLgorc3RydWN0IFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucyB7CisgIFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucygpIHt9CisKKyAgTm90aWZpY2F0aW9uIHNwYXduX3RocmVhZF9zdGFydGVkOworICBOb3RpZmljYXRpb24gc3Bhd25fdGhyZWFkX29rX3RvX3Rlcm1pbmF0ZTsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3Bhd25UaHJlYWROb3RpZmljYXRpb25zKTsKK307CisKKy8vIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpbiB0aGUgdGhyZWFkIHNwYXduIGJ5IHRoZQorLy8gTXVsdGlwbGVUaHJlYWRzIHRlc3QgKGJlbG93KS4KK3N0YXRpYyB2b2lkIFRocmVhZFJvdXRpbmUoU3Bhd25UaHJlYWROb3RpZmljYXRpb25zKiBub3RpZmljYXRpb25zKSB7CisgIC8vIFNpZ25hbHMgdGhlIG1haW4gdGhyZWFkIHRoYXQgdGhpcyB0aHJlYWQgaGFzIHN0YXJ0ZWQuCisgIG5vdGlmaWNhdGlvbnMtPnNwYXduX3RocmVhZF9zdGFydGVkLk5vdGlmeSgpOworCisgIC8vIFdhaXRzIGZvciBwZXJtaXNzaW9uIHRvIGZpbmlzaCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgbm90aWZpY2F0aW9ucy0+c3Bhd25fdGhyZWFkX29rX3RvX3Rlcm1pbmF0ZS5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7Cit9CisKKy8vIFRoaXMgaXMgYSBkZWF0aC10ZXN0IHRlc3QsIGJ1dCBpdCdzIG5vdCBuYW1lZCB3aXRoIGEgRGVhdGhUZXN0CisvLyBzdWZmaXguICBJdCBzdGFydHMgdGhyZWFkcyB3aGljaCBtaWdodCBpbnRlcmZlcmUgd2l0aCBsYXRlcgorLy8gZGVhdGggdGVzdHMsIHNvIGl0IG11c3QgcnVuIGFmdGVyIGFsbCBvdGhlciBkZWF0aCB0ZXN0cy4KK2NsYXNzIERlYXRoVGVzdEFuZE11bHRpVGhyZWFkc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBTdGFydHMgYSB0aHJlYWQgYW5kIHdhaXRzIGZvciBpdCB0byBiZWdpbi4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIHRocmVhZF8ucmVzZXQobmV3IFRocmVhZFdpdGhQYXJhbTxTcGF3blRocmVhZE5vdGlmaWNhdGlvbnMqPigKKyAgICAgICAgJlRocmVhZFJvdXRpbmUsICZub3RpZmljYXRpb25zXywgTlVMTCkpOworICAgIG5vdGlmaWNhdGlvbnNfLnNwYXduX3RocmVhZF9zdGFydGVkLldhaXRGb3JOb3RpZmljYXRpb24oKTsKKyAgfQorICAvLyBUZWxscyB0aGUgdGhyZWFkIHRvIGZpbmlzaCwgYW5kIHJlYXBzIGl0LgorICAvLyBEZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgdGhlIHRocmVhZCBsaWJyYXJ5IGluIHVzZSwKKyAgLy8gYSBtYW5hZ2VyIHRocmVhZCBtaWdodCBzdGlsbCBiZSBsZWZ0IHJ1bm5pbmcgdGhhdCB3aWxsIGludGVyZmVyZQorICAvLyB3aXRoIGxhdGVyIGRlYXRoIHRlc3RzLiAgVGhpcyBpcyB1bmZvcnR1bmF0ZSwgYnV0IHRoaXMgY2xhc3MKKyAgLy8gY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBhcyBiZXN0IGl0IGNhbi4KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIG5vdGlmaWNhdGlvbnNfLnNwYXduX3RocmVhZF9va190b190ZXJtaW5hdGUuTm90aWZ5KCk7CisgIH0KKworIHByaXZhdGU6CisgIFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucyBub3RpZmljYXRpb25zXzsKKyAgdGVzdGluZzo6aW50ZXJuYWw6OnNjb3BlZF9wdHI8VGhyZWFkV2l0aFBhcmFtPFNwYXduVGhyZWFkTm90aWZpY2F0aW9ucyo+ID4KKyAgICAgIHRocmVhZF87Cit9OworCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gVGhlIE1peGVkVXBUZXN0Q2FzZVRlc3QgdGVzdCBjYXNlIHZlcmlmaWVzIHRoYXQgR29vZ2xlIFRlc3Qgd2lsbCBmYWlsIGEKKy8vIHRlc3QgaWYgaXQgdXNlcyBhIGRpZmZlcmVudCBmaXh0dXJlIGNsYXNzIHRoYW4gd2hhdCBvdGhlciB0ZXN0cyBpbgorLy8gdGhlIHNhbWUgdGVzdCBjYXNlIHVzZS4gIEl0IGRlbGliZXJhdGVseSBjb250YWlucyB0d28gZml4dHVyZQorLy8gY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRlZmluZWQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuCisKKy8vIFRoZSBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCB0ZXN0IGNhc2UgdmVyaWZpZXMgdGhhdAorLy8gd2hlbiB0aGUgdXNlciBkZWZpbmVzIHR3byB0ZXN0cyB3aXRoIHRoZSBzYW1lIHRlc3QgY2FzZSBuYW1lIEFORAorLy8gc2FtZSB0ZXN0IG5hbWUgKGJ1dCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyksIHRoZSBzZWNvbmQgdGVzdCB3aWxsCisvLyBmYWlsLgorCituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgTWl4ZWRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihNaXhlZFVwVGVzdENhc2VUZXN0LCBGaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vKSB7fQorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFNlY29uZFRlc3RGcm9tTmFtZXNwYWNlRm9vKSB7fQorCitjbGFzcyBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCwKKyAgICAgICBUaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbCkge30KKworfSAgLy8gbmFtZXNwYWNlIGZvbworCituYW1lc3BhY2UgYmFyIHsKKworY2xhc3MgTWl4ZWRVcFRlc3RDYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUKKy8vIGdvbGRlbiBmaWxlIHRvIGNoZWNrIHRoYXQgR29vZ2xlIFRlc3QgZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFRoaXNTaG91bGRGYWlsKSB7fQorVEVTVF9GKE1peGVkVXBUZXN0Q2FzZVRlc3QsIFRoaXNTaG91bGRGYWlsVG9vKSB7fQorCitjbGFzcyBNaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKKy8vIEV4cGVjdGVkIHRvIGZhaWwuICBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0CisvLyBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UuCitURVNUX0YoTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QsCisgICAgICAgVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBiYXIKKworLy8gVGhlIGZvbGxvd2luZyB0d28gdGVzdCBjYXNlcyB2ZXJpZnkgdGhhdCBHb29nbGUgVGVzdCBjYXRjaGVzIHRoZSB1c2VyCisvLyBlcnJvciBvZiBtaXhpbmcgVEVTVCBhbmQgVEVTVF9GIGluIHRoZSBzYW1lIHRlc3QgY2FzZS4gIFRoZSBmaXJzdAorLy8gdGVzdCBjYXNlIGNoZWNrcyB0aGUgc2NlbmFyaW8gd2hlcmUgVEVTVF9GIGFwcGVhcnMgYmVmb3JlIFRFU1QsIGFuZAorLy8gdGhlIHNlY29uZCBvbmUgY2hlY2tzIHdoZXJlIFRFU1QgYXBwZWFycyBiZWZvcmUgVEVTVF9GLgorCitjbGFzcyBURVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLCBEZWZpbmVkVXNpbmdURVNUX0YpIHt9CisKKy8vIEV4cGVjdGVkIHRvIGZhaWwuICBXZSByZWx5IG9uIHRoZSBnb2xkZW4gZmlsZSB0byBjaGVjayB0aGF0IEdvb2dsZSBUZXN0CisvLyBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UuCitURVNUKFRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwpIHt9CisKK2NsYXNzIFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1QoVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLCBEZWZpbmVkVXNpbmdURVNUKSB7fQorCisvLyBFeHBlY3RlZCB0byBmYWlsLiAgV2UgcmVseSBvbiB0aGUgZ29sZGVuIGZpbGUgdG8gY2hlY2sgdGhhdCBHb29nbGUgVGVzdAorLy8gZ2VuZXJhdGVzIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLgorVEVTVF9GKFRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZSwgRGVmaW5lZFVzaW5nVEVTVF9GQW5kU2hvdWxkRmFpbCkgeworfQorCisvLyBVc2VkIGZvciB0ZXN0aW5nIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgYW5kIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkuCitpbnQgZ2xvYmFsX2ludGVnZXIgPSAwOworCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBnbG9iYWwgdmFyaWFibGVzLgorVEVTVChFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBDYW5SZWZlcmVuY2VHbG9iYWxWYXJpYWJsZXMpIHsKKyAgZ2xvYmFsX2ludGVnZXIgPSAwOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgRVhQRUNUX0VRKDEsIGdsb2JhbF9pbnRlZ2VyKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBsb2NhbCB2YXJpYWJsZXMKKy8vIChzdGF0aWMgb3Igbm90KS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlTG9jYWxWYXJpYWJsZXMpIHsKKyAgaW50IG0gPSAwOworICBzdGF0aWMgaW50IG47CisgIG4gPSAxOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgRVhQRUNUX0VRKG0sIG4pIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iOworICB9LCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBzdWNjZWVkcyB3aGVuIHRoZXJlIGlzIGV4YWN0bHkKKy8vIG9uZSBub24tZmF0YWwgZmFpbHVyZSBhbmQgbm8gZmF0YWwgZmFpbHVyZS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgU3VjY2VlZHNXaGVuVGhlcmVJc09uZU5vbmZhdGFsRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBpcyBubworLy8gbm9uLWZhdGFsIGZhaWx1cmUuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBhcmUgdHdvCisvLyBub24tZmF0YWwgZmFpbHVyZXMuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBBRERfRkFJTFVSRSgpIDw8ICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSAxLiI7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgMi4iOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG9uZSBmYXRhbAorLy8gZmFpbHVyZS4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZSkgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCisvLyB0ZXN0ZWQgcmV0dXJucy4KK1RFU1QoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsKKyAgICByZXR1cm47CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZSBzdGF0ZW1lbnQgYmVpbmcKKy8vIHRlc3RlZCB0aHJvd3MuCitURVNUKEV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFRocm93cykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIHRyeSB7CisgICAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgICAgdGhyb3cgMDsKKyAgICB9LCAiIik7CisgIH0gY2F0Y2goaW50KSB7ICAvLyBOT0xJTlQKKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBjYW4gcmVmZXJlbmNlIGdsb2JhbCB2YXJpYWJsZXMuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhblJlZmVyZW5jZUdsb2JhbFZhcmlhYmxlcykgeworICBnbG9iYWxfaW50ZWdlciA9IDA7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBBU1NFUlRfRVEoMSwgZ2xvYmFsX2ludGVnZXIpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiI7CisgIH0sICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgY2FuIHJlZmVyZW5jZSBsb2NhbCBzdGF0aWMKKy8vIHZhcmlhYmxlcy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2FuUmVmZXJlbmNlTG9jYWxTdGF0aWNWYXJpYWJsZXMpIHsKKyAgc3RhdGljIGludCBuOworICBuID0gMTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgIEFTU0VSVF9FUSgwLCBuKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworICB9LCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIHN1Y2NlZWRzIHdoZW4gdGhlcmUgaXMgZXhhY3RseQorLy8gb25lIGZhdGFsIGZhaWx1cmUgYW5kIG5vIG5vbi1mYXRhbCBmYWlsdXJlLgorVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBTdWNjZWVkc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBGQUlMKCkgPDwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG5vIGZhdGFsCisvLyBmYWlsdXJlLgorVEVTVChFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBGYWlsc1doZW5UaGVyZUlzTm9GYXRhbEZhaWx1cmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgIH0sICIiKTsKK30KKworLy8gQSBoZWxwZXIgZm9yIGdlbmVyYXRpbmcgYSBmYXRhbCBmYWlsdXJlLgordm9pZCBGYXRhbEZhaWx1cmUoKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGVyZSBhcmUgdHdvCisvLyBmYXRhbCBmYWlsdXJlcy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyBhIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgIEZhdGFsRmFpbHVyZSgpOworICAgIEZhdGFsRmFpbHVyZSgpOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZXJlIGlzIG9uZSBub24tZmF0YWwKKy8vIGZhaWx1cmUuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIGEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgZmFpbHMgd2hlbiB0aGUgc3RhdGVtZW50IGJlaW5nCisvLyB0ZXN0ZWQgcmV0dXJucy4KK1RFU1QoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICByZXR1cm47CisgIH0sICIiKTsKK30KKworI2lmIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRlc3RzIHRoYXQgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBmYWlscyB3aGVuIHRoZSBzdGF0ZW1lbnQgYmVpbmcKKy8vIHRlc3RlZCB0aHJvd3MuCitURVNUKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEZhaWxzV2hlblN0YXRlbWVudFRocm93cykgeworICBwcmludGYoIihleHBlY3RpbmcgYSBmYWlsdXJlKVxuIik7CisgIHRyeSB7CisgICAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeworICAgICAgdGhyb3cgMDsKKyAgICB9LCAiIik7CisgIH0gY2F0Y2goaW50KSB7ICAvLyBOT0xJTlQKKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKy8vIFRoaXMgI2lmZGVmIGJsb2NrIHRlc3RzIHRoZSBvdXRwdXQgb2YgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK3N0ZDo6c3RyaW5nIFBhcmFtTmFtZUZ1bmMoY29uc3QgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzxzdGQ6OnN0cmluZz4mIGluZm8pIHsKKyAgcmV0dXJuIGluZm8ucGFyYW07Cit9CisKK2NsYXNzIFBhcmFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6c3RyaW5nPiB7Cit9OworCitURVNUX1AoUGFyYW1UZXN0LCBTdWNjZXNzKSB7CisgIEVYUEVDVF9FUSgiYSIsIEdldFBhcmFtKCkpOworfQorCitURVNUX1AoUGFyYW1UZXN0LCBGYWlsdXJlKSB7CisgIEVYUEVDVF9FUSgiYiIsIEdldFBhcmFtKCkpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUHJpbnRpbmdTdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKHN0ZDo6c3RyaW5nKCJhIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1OYW1lRnVuYyk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworLy8gVGhpcyAjaWZkZWYgYmxvY2sgdGVzdHMgdGhlIG91dHB1dCBvZiB0eXBlZCB0ZXN0cy4KKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QsIHRlc3Rpbmc6OlR5cGVzPGludD4pOworCitUWVBFRF9URVNUKFR5cGVkVGVzdCwgU3VjY2VzcykgeworICBFWFBFQ1RfRVEoMCwgVHlwZVBhcmFtKCkpOworfQorCitUWVBFRF9URVNUKFR5cGVkVGVzdCwgRmFpbHVyZSkgeworICBFWFBFQ1RfRVEoMSwgVHlwZVBhcmFtKCkpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAorCisvLyBUaGlzICNpZmRlZiBibG9jayB0ZXN0cyB0aGUgb3V0cHV0IG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVHlwZWRUZXN0UCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVkVGVzdFApOworCitUWVBFRF9URVNUX1AoVHlwZWRUZXN0UCwgU3VjY2VzcykgeworICBFWFBFQ1RfRVEoMFUsIFR5cGVQYXJhbSgpKTsKK30KKworVFlQRURfVEVTVF9QKFR5cGVkVGVzdFAsIEZhaWx1cmUpIHsKKyAgRVhQRUNUX0VRKDFVLCBUeXBlUGFyYW0oKSkgPDwgIkV4cGVjdGVkIGZhaWx1cmUiOworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQLCBTdWNjZXNzLCBGYWlsdXJlKTsKKwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczx1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBpbnQ+IFVuc2lnbmVkVHlwZXM7CitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChVbnNpZ25lZCwgVHlwZWRUZXN0UCwgVW5zaWduZWRUeXBlcyk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gV2UgcmVseSBvbiB0aGUgZ29sZGVuIGZpbGUgdG8gdmVyaWZ5IHRoYXQgdGVzdHMgd2hvc2UgdGVzdCBjYXNlCisvLyBuYW1lIGVuZHMgd2l0aCBEZWF0aFRlc3QgYXJlIHJ1biBmaXJzdC4KKworVEVTVChBRGVhdGhUZXN0LCBTaG91bGRSdW5GaXJzdCkgeworfQorCisjIGlmIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIFdlIHJlbHkgb24gdGhlIGdvbGRlbiBmaWxlIHRvIHZlcmlmeSB0aGF0IHR5cGVkIHRlc3RzIHdob3NlIHRlc3QKKy8vIGNhc2UgbmFtZSBlbmRzIHdpdGggRGVhdGhUZXN0IGFyZSBydW4gZmlyc3QuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgQVR5cGVkRGVhdGhUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworfTsKKwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxpbnQsIGRvdWJsZT4gTnVtZXJpY1R5cGVzOworVFlQRURfVEVTVF9DQVNFKEFUeXBlZERlYXRoVGVzdCwgTnVtZXJpY1R5cGVzKTsKKworVFlQRURfVEVTVChBVHlwZWREZWF0aFRlc3QsIFNob3VsZFJ1bkZpcnN0KSB7Cit9CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKyMgaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisKKy8vIFdlIHJlbHkgb24gdGhlIGdvbGRlbiBmaWxlIHRvIHZlcmlmeSB0aGF0IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gd2hvc2UgdGVzdCBjYXNlIG5hbWUgZW5kcyB3aXRoIERlYXRoVGVzdCBhcmUgcnVuIGZpcnN0LgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEFUeXBlUGFyYW1EZWF0aFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChBVHlwZVBhcmFtRGVhdGhUZXN0KTsKKworVFlQRURfVEVTVF9QKEFUeXBlUGFyYW1EZWF0aFRlc3QsIFNob3VsZFJ1bkZpcnN0KSB7Cit9CisKK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKEFUeXBlUGFyYW1EZWF0aFRlc3QsIFNob3VsZFJ1bkZpcnN0KTsKKworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEFUeXBlUGFyYW1EZWF0aFRlc3QsIE51bWVyaWNUeXBlcyk7CisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBUZXN0cyB2YXJpb3VzIGZhaWx1cmUgY29uZGl0aW9ucyBvZgorLy8gRVhQRUNUX3ssTk9OfUZBVEFMX0ZBSUxVUkV7LF9PTl9BTExfVEhSRUFEU30uCitjbGFzcyBFeHBlY3RGYWlsdXJlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6ICAvLyBNdXN0IGJlIHB1YmxpYyBhbmQgbm90IHByb3RlY3RlZCBkdWUgdG8gYSBidWcgaW4gZysrIDMuNC4yLgorICBlbnVtIEZhaWx1cmVNb2RlIHsKKyAgICBGQVRBTF9GQUlMVVJFLAorICAgIE5PTkZBVEFMX0ZBSUxVUkUKKyAgfTsKKyAgc3RhdGljIHZvaWQgQWRkRmFpbHVyZShGYWlsdXJlTW9kZSBmYWlsdXJlKSB7CisgICAgaWYgKGZhaWx1cmUgPT0gRkFUQUxfRkFJTFVSRSkgeworICAgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiI7CisgICAgfSBlbHNlIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7CisgICAgfQorICB9Cit9OworCitURVNUX0YoRXhwZWN0RmFpbHVyZVRlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZSkgeworICAvLyBFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLCBidXQgc3VjY2VlZHMuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpLCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKKyAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IGdvdCBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksICJFeHBlY3RlZCBub24tZmF0YWwgIgorICAgICAgICAgICAgICAgICAgICAgICAiZmFpbHVyZS4iKTsKKyAgLy8gV3JvbmcgbWVzc2FnZS4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBZGRGYWlsdXJlKEZBVEFMX0ZBSUxVUkUpLCAiU29tZSBvdGhlciBmYXRhbCBmYWlsdXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLiIpOworfQorCitURVNUX0YoRXhwZWN0RmFpbHVyZVRlc3QsIEV4cGVjdE5vbkZhdGFsRmFpbHVyZSkgeworICAvLyBFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworICAvLyBFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSwgYnV0IGdvdCBhIGZhdGFsIGZhaWx1cmUuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7CisgIC8vIFdyb25nIG1lc3NhZ2UuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKSwgIlNvbWUgb3RoZXIgbm9uLWZhdGFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWx1cmUuIik7Cit9CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCisKK2NsYXNzIEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QgOiBwdWJsaWMgRXhwZWN0RmFpbHVyZVRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRmFpbHVyZU1vZGUgZmFpbHVyZSkgeworICAgIFRocmVhZFdpdGhQYXJhbTxGYWlsdXJlTW9kZT4gdGhyZWFkKCZBZGRGYWlsdXJlLCBmYWlsdXJlLCBOVUxMKTsKKyAgICB0aHJlYWQuSm9pbigpOworICB9Cit9OworCitURVNUX0YoRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCwgRXhwZWN0RmF0YWxGYWlsdXJlKSB7CisgIC8vIFdlIG9ubHkgaW50ZXJjZXB0IHRoZSBjdXJyZW50IHRocmVhZC4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgZmFpbHVyZXMpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoRkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCitURVNUX0YoRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdCwgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlKSB7CisgIC8vIFdlIG9ubHkgaW50ZXJjZXB0IHRoZSBjdXJyZW50IHRocmVhZC4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgZmFpbHVyZXMpXG4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoQWRkRmFpbHVyZUluT3RoZXJUaHJlYWQoTk9ORkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKK30KKwordHlwZWRlZiBFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0IFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdDsKKworLy8gVGVzdHMgdGhhdCB0aGUgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgb25seSBjYXRjaGVzIGZhaWx1cmVzIGZyb20KKy8vIHRoZSBjdXJyZW50IHRocmVhZCBpZiBpdCBpcyBpbnN0YW50aWF0ZWQgd2l0aCBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRC4KK1RFU1RfRihTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QsIEludGVyY2VwdE9ubHlDdXJyZW50VGhyZWFkKSB7CisgIHByaW50ZigiKGV4cGVjdGluZyAyIGZhaWx1cmVzKVxuIik7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgeworICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKAorICAgICAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsCisgICAgICAgICZyZXN1bHRzKTsKKyAgICBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChGQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChOT05GQVRBTF9GQUlMVVJFKTsKKyAgfQorICAvLyBUaGUgdHdvIGZhaWx1cmVzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGludGVyY2VwdGVkLgorICBFWFBFQ1RfRVEoMCwgcmVzdWx0cy5zaXplKCkpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQorCitURVNUX0YoRXhwZWN0RmFpbHVyZVRlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICAvLyBFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLCBidXQgc3VjY2VlZHMuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoU1VDQ0VFRCgpLCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKKyAgLy8gRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZSwgYnV0IGdvdCBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhaWx1cmUoTk9ORkFUQUxfRkFJTFVSRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKTsKKyAgLy8gV3JvbmcgbWVzc2FnZS4KKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDEgZmFpbHVyZSlcbiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYWlsdXJlKEZBVEFMX0ZBSUxVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29tZSBvdGhlciBmYXRhbCBmYWlsdXJlIGV4cGVjdGVkLiIpOworfQorCitURVNUX0YoRXhwZWN0RmFpbHVyZVRlc3QsIEV4cGVjdE5vbkZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICAvLyBFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSwgYnV0IHN1Y2NlZWRzLgorICBwcmludGYoIihleHBlY3RpbmcgMSBmYWlsdXJlKVxuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKFNVQ0NFRUQoKSwgIkV4cGVjdGVkIG5vbi1mYXRhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsdXJlLiIpOworICAvLyBFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSwgYnV0IGdvdCBhIGZhdGFsIGZhaWx1cmUuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkRmFpbHVyZShGQVRBTF9GQUlMVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7CisgIC8vIFdyb25nIG1lc3NhZ2UuCisgIHByaW50ZigiKGV4cGVjdGluZyAxIGZhaWx1cmUpXG4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgb3RoZXIgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKKworLy8gVHdvIHRlc3QgZW52aXJvbm1lbnRzIGZvciB0ZXN0aW5nIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpLgorCitjbGFzcyBGb29FbnZpcm9ubWVudCA6IHB1YmxpYyB0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcHJpbnRmKCIlcyIsICJGb29FbnZpcm9ubWVudDo6U2V0VXAoKSBjYWxsZWQuXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwcmludGYoIiVzIiwgIkZvb0Vudmlyb25tZW50OjpUZWFyRG93bigpIGNhbGxlZC5cbiIpOworICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworICB9Cit9OworCitjbGFzcyBCYXJFbnZpcm9ubWVudCA6IHB1YmxpYyB0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcHJpbnRmKCIlcyIsICJCYXJFbnZpcm9ubWVudDo6U2V0VXAoKSBjYWxsZWQuXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBwcmludGYoIiVzIiwgIkJhckVudmlyb25tZW50OjpUZWFyRG93bigpIGNhbGxlZC5cbiIpOworICAgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7CisgIH0KK307CisKKy8vIFRoZSBtYWluIGZ1bmN0aW9uLgorLy8KKy8vIFRoZSBpZGVhIGlzIHRvIHVzZSBHb29nbGUgVGVzdCB0byBydW4gYWxsIHRoZSB0ZXN0cyB3ZSBoYXZlIGRlZmluZWQgKHNvbWUKKy8vIG9mIHRoZW0gYXJlIGludGVuZGVkIHRvIGZhaWwpLCBhbmQgdGhlbiBjb21wYXJlIHRoZSB0ZXN0IHJlc3VsdHMKKy8vIHdpdGggdGhlICJnb2xkZW4iIGZpbGUuCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyhwcmludF90aW1lKSA9IGZhbHNlOworCisgIC8vIFdlIGp1c3QgcnVuIHRoZSB0ZXN0cywga25vd2luZyBzb21lIG9mIHRoZW0gYXJlIGludGVuZGVkIHRvIGZhaWwuCisgIC8vIFdlIHdpbGwgdXNlIGEgc2VwYXJhdGUgUHl0aG9uIHNjcmlwdCB0byBjb21wYXJlIHRoZSBvdXRwdXQgb2YKKyAgLy8gdGhpcyBwcm9ncmFtIHdpdGggdGhlIGdvbGRlbiBmaWxlLgorCisgIC8vIEl0J3MgaGFyZCB0byB0ZXN0IEluaXRHb29nbGVUZXN0KCkgZGlyZWN0bHksIGFzIGl0IGhhcyBtYW55CisgIC8vIGdsb2JhbCBzaWRlIGVmZmVjdHMuICBUaGUgZm9sbG93aW5nIGxpbmUgc2VydmVzIGFzIGEgc2FuaXR5IHRlc3QKKyAgLy8gZm9yIGl0LgorICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGJvb2wgaW50ZXJuYWxfc2tpcF9lbnZpcm9ubWVudF9hbmRfYWRfaG9jX3Rlc3RzID0KKyAgICAgIHN0ZDo6Y291bnQoYXJndiwgYXJndiArIGFyZ2MsCisgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJpbnRlcm5hbF9za2lwX2Vudmlyb25tZW50X2FuZF9hZF9ob2NfdGVzdHMiKSkgPiAwOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgaWYgKHRlc3Rpbmc6OmludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSAhPSAiIikgeworICAgIC8vIFNraXAgdGhlIHVzdWFsIG91dHB1dCBjYXB0dXJpbmcgaWYgd2UncmUgcnVubmluZyBhcyB0aGUgY2hpbGQKKyAgICAvLyBwcm9jZXNzIG9mIGFuIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdC4KKyMgaWYgR1RFU1RfT1NfV0lORE9XUworICAgIHBvc2l4OjpGUmVvcGVuKCJudWw6IiwgInciLCBzdGRvdXQpOworIyBlbHNlCisgICAgcG9zaXg6OkZSZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3Rkb3V0KTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgaWYgKGludGVybmFsX3NraXBfZW52aXJvbm1lbnRfYW5kX2FkX2hvY190ZXN0cykKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworCisgIC8vIFJlZ2lzdGVycyB0d28gZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzLgorICAvLyBUaGUgZ29sZGVuIGZpbGUgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBzZXQgdXAgaW4gdGhlIG9yZGVyIHRoZXkKKyAgLy8gYXJlIHJlZ2lzdGVyZWQsIGFuZCB0b3JuIGRvd24gaW4gdGhlIHJldmVyc2Ugb3JkZXIuCisgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEJhckVudmlyb25tZW50KTsKKworICByZXR1cm4gUnVuQWxsVGVzdHMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Rfb3V0cHV0X3Rlc3RfZ29sZGVuX2xpbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmZjg1MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X291dHB1dF90ZXN0X2dvbGRlbl9saW4udHh0CkBAIC0wLDAgKzEsNzQzIEBACitUaGUgbm9uLXRlc3QgcGFydCBvZiB0aGUgY29kZSBpcyBleHBlY3RlZCB0byBoYXZlIDIgZmFpbHVyZXMuCisKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogZmFsc2UKKyAgQWN0dWFsOiBmYWxzZQorRXhwZWN0ZWQ6IHRydWUKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogMworRXhwZWN0ZWQ6IDIKKxtbMDszMm1bPT09PT09PT09PV0gG1ttUnVubmluZyA2NiB0ZXN0cyBmcm9tIDI5IHRlc3QgY2FzZXMuCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbUdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC4KK0Zvb0Vudmlyb25tZW50OjpTZXRVcCgpIGNhbGxlZC4KK0JhckVudmlyb25tZW50OjpTZXRVcCgpIGNhbGxlZC4KKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQURlYXRoVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21BRGVhdGhUZXN0LlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUFEZWF0aFRlc3QuU2hvdWxkUnVuRmlyc3QKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQVR5cGVkRGVhdGhUZXN0LzAsIHdoZXJlIFR5cGVQYXJhbSA9IGludAorG1swOzMybVsgUlVOICAgICAgXSAbW21BVHlwZWREZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVsgICAgICAgT0sgXSAbW21BVHlwZWREZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBBVHlwZWREZWF0aFRlc3QvMSwgd2hlcmUgVHlwZVBhcmFtID0gZG91YmxlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUFUeXBlZERlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUFUeXBlZERlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMCwgd2hlcmUgVHlwZVBhcmFtID0gaW50CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMC5TaG91bGRSdW5GaXJzdAorG1swOzMybVsgICAgICAgT0sgXSAbW21NeS9BVHlwZVBhcmFtRGVhdGhUZXN0LzAuU2hvdWxkUnVuRmlyc3QKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLCB3aGVyZSBUeXBlUGFyYW0gPSBkb3VibGUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTXkvQVR5cGVQYXJhbURlYXRoVGVzdC8xLlNob3VsZFJ1bkZpcnN0CisbWzA7MzJtWyAgICAgICBPSyBdIBtbbU15L0FUeXBlUGFyYW1EZWF0aFRlc3QvMS5TaG91bGRSdW5GaXJzdAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gUGFzc2luZ1Rlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QxCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVBhc3NpbmdUZXN0LlBhc3NpbmdUZXN0MQorG1swOzMybVsgUlVOICAgICAgXSAbW21QYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttUGFzc2luZ1Rlc3QuUGFzc2luZ1Rlc3QyCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBOb25mYXRhbEZhaWx1cmVUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU5vbmZhdGFsRmFpbHVyZVRlc3QuRXNjYXBlc1N0cmluZ09wZXJhbmRzCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IGFjdHVhbAorICBBY3R1YWw6ICJhY3R1YWwgXCJzdHJpbmdcIiIKK0V4cGVjdGVkOiBrR29sZGVuU3RyaW5nCitXaGljaCBpczogIlwiTGluZSIKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogYWN0dWFsCisgIEFjdHVhbDogImFjdHVhbCBcInN0cmluZ1wiIgorRXhwZWN0ZWQ6IGdvbGRlbgorV2hpY2ggaXM6ICJcIkxpbmUiCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbmZhdGFsRmFpbHVyZVRlc3QuRXNjYXBlc1N0cmluZ09wZXJhbmRzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU5vbmZhdGFsRmFpbHVyZVRlc3QuRGlmZkZvckxvbmdTdHJpbmdzCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6ICJMaW5lIDIiCitFeHBlY3RlZDogZ29sZGVuX3N0cgorV2hpY2ggaXM6ICJcIkxpbmVcMCAxXCJcbkxpbmUgMiIKK1dpdGggZGlmZjoKK0BAIC0xLDIgQEAKKy1cIkxpbmVcMCAxXCIKKyBMaW5lIDIKKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25mYXRhbEZhaWx1cmVUZXN0LkRpZmZGb3JMb25nU3RyaW5ncworG1swOzMybVstLS0tLS0tLS0tXSAbW20zIHRlc3RzIGZyb20gRmF0YWxGYWlsdXJlVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21GYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorKGV4cGVjdGluZyBhIGZhaWx1cmUgdGhhdCB4IHNob3VsZCBiZSAxKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiB4CisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogeAorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisoZXhwZWN0aW5nIGEgZmFpbHVyZSBvbiBmYWxzZSkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogZmFsc2UKKyAgQWN0dWFsOiBmYWxzZQorRXhwZWN0ZWQ6IHRydWUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gTG9nZ2luZ1Rlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTG9nZ2luZ1Rlc3QuSW50ZXJsZWF2aW5nTG9nZ2luZ0FuZEFzc2VydGlvbnMKKyhleHBlY3RpbmcgMiBmYWlsdXJlcyBvbiAoMykgPj0gKGFbaV0pKQoraSA9PSAwCitpID09IDEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogKDMpID49IChhW2ldKSwgYWN0dWFsOiAzIHZzIDkKK2kgPT0gMgoraSA9PSAzCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6ICgzKSA+PSAoYVtpXSksIGFjdHVhbDogMyB2cyA2CisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUxvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTYgdGVzdHMgZnJvbSBTQ09QRURfVFJBQ0VUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuT2JleXNTY29wZXMKKyhleHBlY3RlZCB0byBmYWlsKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkbid0IGhhdmUgYSB0cmFjZS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBoYXZlIGEgdHJhY2UuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBFeHBlY3RlZCB0cmFjZQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLCBhbmQgc2hvdWxkbid0IGhhdmUgYSB0cmFjZS4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5PYmV5c1Njb3BlcworG1swOzMybVsgUlVOICAgICAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5Mb29wCisoZXhwZWN0ZWQgdG8gZmFpbCkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogbgorICBBY3R1YWw6IDEKK0V4cGVjdGVkOiAyCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBpID0gMQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBuCisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IGkgPSAyCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NJbkxvb3AKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luU3Vicm91dGluZQorKGV4cGVjdGVkIHRvIGZhaWwpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IG4KKyAgQWN0dWFsOiAxCitFeHBlY3RlZDogMgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogbiA9IDEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogbgorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBuID0gMgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5TdWJyb3V0aW5lCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuQ2FuQmVOZXN0ZWQKKyhleHBlY3RlZCB0byBmYWlsKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBuCisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IG4gPSAyCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuQ2FuQmVOZXN0ZWQKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZVJlcGVhdGVkCisoZXhwZWN0ZWQgdG8gZmFpbCkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluIHRyYWNlIHBvaW50IEEuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBBCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBIGFuZCBCLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEEKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK1RoaXMgZmFpbHVyZSBpcyBleHBlY3RlZCwgYW5kIHNob3VsZCBjb250YWluIHRyYWNlIHBvaW50IEEsIEIsIGFuZCBDLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEIKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBBCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQsIGFuZCBzaG91bGQgY29udGFpbiB0cmFjZSBwb2ludCBBLCBCLCBhbmQgRC4KK0dvb2dsZSBUZXN0IHRyYWNlOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEQKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBCCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogQQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LkNhbkJlUmVwZWF0ZWQKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0NvbmN1cnJlbnRseQorKGV4cGVjdGluZyA2IGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMSAoaW4gdGhyZWFkIEIsIG9ubHkgdHJhY2UgQiBhbGl2ZSkuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBUcmFjZSBCCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMyIChpbiB0aHJlYWQgQSwgdHJhY2UgQSAmIEIgYm90aCBhbGl2ZSkuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBUcmFjZSBBCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMzIChpbiB0aHJlYWQgQiwgdHJhY2UgQSAmIEIgYm90aCBhbGl2ZSkuCitHb29nbGUgVGVzdCB0cmFjZToKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBUcmFjZSBCCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICM0IChpbiB0aHJlYWQgQiwgb25seSB0cmFjZSBBIGFsaXZlKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzUgKGluIHRocmVhZCBBLCBvbmx5IHRyYWNlIEEgYWxpdmUpLgorR29vZ2xlIFRlc3QgdHJhY2U6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogVHJhY2UgQQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjNiAoaW4gdGhyZWFkIEEsIG5vIHRyYWNlIGFsaXZlKS4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0NvbmN1cnJlbnRseQorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBOb25GYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCisoZXhwZWN0aW5nIDUgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGMndG9yLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gU2V0VXAoKS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzMsIGluIHRoZSB0ZXN0IGJvZHkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICM0LCBpbiBUZWFyRG93bi4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzUsIGluIHRoZSB0ZXN0IGZpeHR1cmUgZCd0b3IuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorG1swOzMybVstLS0tLS0tLS0tXSAbW20xIHRlc3QgZnJvbSBGYXRhbEZhaWx1cmVJbkZpeHR1cmVDb25zdHJ1Y3RvclRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCisoZXhwZWN0aW5nIDIgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiB0aGUgdGVzdCBmaXh0dXJlIGMndG9yLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTEgdGVzdCBmcm9tIE5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU5vbkZhdGFsRmFpbHVyZUluU2V0VXBUZXN0LkZhaWx1cmVJblNldFVwCisoZXhwZWN0aW5nIDQgZmFpbHVyZXMpCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMxLCBpbiBTZXRVcCgpLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMiwgaW4gdGhlIHRlc3QgZnVuY3Rpb24uCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMzLCBpbiBUZWFyRG93bigpLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjNCwgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QuRmFpbHVyZUluU2V0VXAKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QuRmFpbHVyZUluU2V0VXAKKyhleHBlY3RpbmcgMyBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhaWx1cmUgIzEsIGluIFNldFVwKCkuCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorRmFpbGVkCitFeHBlY3RlZCBmYWlsdXJlICMyLCBpbiBUZWFyRG93bigpLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSAjMywgaW4gdGhlIHRlc3QgZml4dHVyZSBkJ3Rvci4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRmF0YWxGYWlsdXJlSW5TZXRVcFRlc3QuRmFpbHVyZUluU2V0VXAKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gQWRkRmFpbHVyZUF0VGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21BZGRGYWlsdXJlQXRUZXN0Lk1lc3NhZ2VDb250YWluc1NwZWNpZmllZEZpbGVBbmRMaW5lTnVtYmVyCitmb28uY2M6NDI6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmFpbHVyZSBpbiBmb28uY2MKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttQWRkRmFpbHVyZUF0VGVzdC5NZXNzYWdlQ29udGFpbnNTcGVjaWZpZWRGaWxlQW5kTGluZU51bWJlcgorG1swOzMybVstLS0tLS0tLS0tXSAbW200IHRlc3RzIGZyb20gTWl4ZWRVcFRlc3RDYXNlVGVzdAorG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LkZpcnN0VGVzdEZyb21OYW1lc3BhY2VGb28KKxtbMDszMm1bICAgICAgIE9LIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5GaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuU2Vjb25kVGVzdEZyb21OYW1lc3BhY2VGb28KKxtbMDszMm1bICAgICAgIE9LIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5TZWNvbmRUZXN0RnJvbU5hbWVzcGFjZUZvbworG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsCitndGVzdC5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0FsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlCitjbGFzcy4gIEhvd2V2ZXIsIGluIHRlc3QgY2FzZSBNaXhlZFVwVGVzdENhc2VUZXN0LAoreW91IGRlZmluZWQgdGVzdCBGaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vIGFuZCB0ZXN0IFRoaXNTaG91bGRGYWlsCit1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmCit0aGUgdHdvIGNsYXNzZXMgYXJlIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgb3IgdHJhbnNsYXRpb24KK3VuaXRzIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUuICBZb3Ugc2hvdWxkIHByb2JhYmx5IHJlbmFtZSBvbmUKK29mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbAorG1swOzMybVsgUlVOICAgICAgXSAbW21NaXhlZFVwVGVzdENhc2VUZXN0LlRoaXNTaG91bGRGYWlsVG9vCitndGVzdC5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0FsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlCitjbGFzcy4gIEhvd2V2ZXIsIGluIHRlc3QgY2FzZSBNaXhlZFVwVGVzdENhc2VUZXN0LAoreW91IGRlZmluZWQgdGVzdCBGaXJzdFRlc3RGcm9tTmFtZXNwYWNlRm9vIGFuZCB0ZXN0IFRoaXNTaG91bGRGYWlsVG9vCit1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmCit0aGUgdHdvIGNsYXNzZXMgYXJlIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgb3IgdHJhbnNsYXRpb24KK3VuaXRzIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUuICBZb3Ugc2hvdWxkIHByb2JhYmx5IHJlbmFtZSBvbmUKK29mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbFRvbworG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QuVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QuVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlV2l0aFNhbWVUZXN0TmFtZVRlc3QuVGhlU2Vjb25kVGVzdFdpdGhUaGlzTmFtZVNob3VsZEZhaWwKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUKK2NsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlIE1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LAoreW91IGRlZmluZWQgdGVzdCBUaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbCBhbmQgdGVzdCBUaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAordXNpbmcgdHdvIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3Nlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZgordGhlIHR3byBjbGFzc2VzIGFyZSBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzIG9yIHRyYW5zbGF0aW9uCit1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lCitvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50IHRlc3QgY2FzZXMuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVdpdGhTYW1lVGVzdE5hbWVUZXN0LlRoZVNlY29uZFRlc3RXaXRoVGhpc05hbWVTaG91bGRGYWlsCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBURVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RfRgorG1swOzMybVsgICAgICAgT0sgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVF9GCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUQW5kU2hvdWxkRmFpbAorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRmFpbGVkCitBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZQorY2xhc3MsIHNvIG1peGluZyBURVNUX0YgYW5kIFRFU1QgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIGlzCitpbGxlZ2FsLiAgSW4gdGVzdCBjYXNlIFRFU1RfRl9iZWZvcmVfVEVTVF9pbl9zYW1lX3Rlc3RfY2FzZSwKK3Rlc3QgRGVmaW5lZFVzaW5nVEVTVF9GIGlzIGRlZmluZWQgdXNpbmcgVEVTVF9GIGJ1dAordGVzdCBEZWZpbmVkVXNpbmdURVNUQW5kU2hvdWxkRmFpbCBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHkKK3dhbnQgdG8gY2hhbmdlIHRoZSBURVNUIHRvIFRFU1RfRiBvciBtb3ZlIGl0IHRvIGFub3RoZXIgdGVzdAorY2FzZS4KKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVEVTVF9GX2JlZm9yZV9URVNUX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RBbmRTaG91bGRGYWlsCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTIgdGVzdHMgZnJvbSBURVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1QKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RfRkFuZFNob3VsZEZhaWwKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmUKK2NsYXNzLCBzbyBtaXhpbmcgVEVTVF9GIGFuZCBURVNUIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBpcworaWxsZWdhbC4gIEluIHRlc3QgY2FzZSBURVNUX2JlZm9yZV9URVNUX0ZfaW5fc2FtZV90ZXN0X2Nhc2UsCit0ZXN0IERlZmluZWRVc2luZ1RFU1RfRkFuZFNob3VsZEZhaWwgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0Cit0ZXN0IERlZmluZWRVc2luZ1RFU1QgaXMgZGVmaW5lZCB1c2luZyBURVNULiAgWW91IHByb2JhYmx5Cit3YW50IHRvIGNoYW5nZSB0aGUgVEVTVCB0byBURVNUX0Ygb3IgbW92ZSBpdCB0byBhbm90aGVyIHRlc3QKK2Nhc2UuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVRFU1RfYmVmb3JlX1RFU1RfRl9pbl9zYW1lX3Rlc3RfY2FzZS5EZWZpbmVkVXNpbmdURVNUX0ZBbmRTaG91bGRGYWlsCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTggdGVzdHMgZnJvbSBFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlR2xvYmFsVmFyaWFibGVzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlR2xvYmFsVmFyaWFibGVzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlTG9jYWxWYXJpYWJsZXMKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VMb2NhbFZhcmlhYmxlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LlN1Y2NlZWRzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5TdWNjZWVkc1doZW5UaGVyZUlzT25lTm9uZmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc05vTm9uZmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb05vbmZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvTm9uZmF0YWxGYWlsdXJlcworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDIgZmFpbHVyZXMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBOb24tZmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUgMS4KKworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZSAyLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29Ob25mYXRhbEZhaWx1cmVzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc09uZUZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFJldHVybnMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRUaHJvd3MKKyhleHBlY3RpbmcgYSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisbWzA7MzJtWy0tLS0tLS0tLS1dIBtbbTggdGVzdHMgZnJvbSBFeHBlY3RGYXRhbEZhaWx1cmVUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlR2xvYmFsVmFyaWFibGVzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlR2xvYmFsVmFyaWFibGVzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuQ2FuUmVmZXJlbmNlTG9jYWxTdGF0aWNWYXJpYWJsZXMKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5DYW5SZWZlcmVuY2VMb2NhbFN0YXRpY1ZhcmlhYmxlcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LlN1Y2NlZWRzV2hlblRoZXJlSXNPbmVGYXRhbEZhaWx1cmUKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5TdWNjZWVkc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc05vRmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVJc05vRmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuVGhlcmVBcmVUd29GYXRhbEZhaWx1cmVzCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAyIGZhaWx1cmVzCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b0ZhdGFsRmFpbHVyZXMKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lTm9uZmF0YWxGYWlsdXJlCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisoZXhwZWN0aW5nIGEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOiAwIGZhaWx1cmVzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFRocm93cworKGV4cGVjdGluZyBhIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFRocm93cworG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gVHlwZWRUZXN0LzAsIHdoZXJlIFR5cGVQYXJhbSA9IGludAorG1swOzMybVsgUlVOICAgICAgXSAbW21UeXBlZFRlc3QvMC5TdWNjZXNzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVR5cGVkVGVzdC8wLlN1Y2Nlc3MKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVHlwZWRUZXN0LzAuRmFpbHVyZQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBUeXBlUGFyYW0oKQorICBBY3R1YWw6IDAKK0V4cGVjdGVkOiAxCitFeHBlY3RlZCBmYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVR5cGVkVGVzdC8wLkZhaWx1cmUsIHdoZXJlIFR5cGVQYXJhbSA9IGludAorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gVW5zaWduZWQvVHlwZWRUZXN0UC8wLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBjaGFyCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMC5TdWNjZXNzCisbWzA7MzJtWyAgICAgICBPSyBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMC5TdWNjZXNzCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMC5GYWlsdXJlCitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmFpbHVyZQorVmFsdWUgb2Y6IFR5cGVQYXJhbSgpCisgIEFjdHVhbDogJ1wwJworRXhwZWN0ZWQ6IDFVCitXaGljaCBpczogMQorRXhwZWN0ZWQgZmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgY2hhcgorG1swOzMybVstLS0tLS0tLS0tXSAbW20yIHRlc3RzIGZyb20gVW5zaWduZWQvVHlwZWRUZXN0UC8xLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBpbnQKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8xLlN1Y2Nlc3MKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8xLlN1Y2Nlc3MKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttVW5zaWduZWQvVHlwZWRUZXN0UC8xLkZhaWx1cmUKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogVHlwZVBhcmFtKCkKKyAgQWN0dWFsOiAwCitFeHBlY3RlZDogMVUKK1doaWNoIGlzOiAxCitFeHBlY3RlZCBmYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVVuc2lnbmVkL1R5cGVkVGVzdFAvMS5GYWlsdXJlLCB3aGVyZSBUeXBlUGFyYW0gPSB1bnNpZ25lZCBpbnQKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttNCB0ZXN0cyBmcm9tIEV4cGVjdEZhaWx1cmVUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBTdWNjZXNzOgorU3VjY2VlZGVkCisKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUgY29udGFpbmluZyAiU29tZSBvdGhlciBmYXRhbCBmYWlsdXJlIGV4cGVjdGVkLiIKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCisKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlCisbWzA7MzJtWyBSVU4gICAgICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogU3VjY2VzczoKK1N1Y2NlZWRlZAorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIG5vbi1mYXRhbCBmYWlsdXJlIGNvbnRhaW5pbmcgIlNvbWUgb3RoZXIgbm9uLWZhdGFsIGZhaWx1cmUuIgorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogTm9uLWZhdGFsIGZhaWx1cmU6CitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogU3VjY2VzczoKK1N1Y2NlZWRlZAorCisoZXhwZWN0aW5nIDEgZmFpbHVyZSkKK2d0ZXN0LmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAxIGZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlIGNvbnRhaW5pbmcgIlNvbWUgb3RoZXIgZmF0YWwgZmFpbHVyZSBleHBlY3RlZC4iCisgIEFjdHVhbDoKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLgorCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcworG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMKKyhleHBlY3RpbmcgMSBmYWlsdXJlKQorZ3Rlc3QuY2M6IzogRmFpbHVyZQorRXhwZWN0ZWQ6IDEgbm9uLWZhdGFsIGZhaWx1cmUKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IFN1Y2Nlc3M6CitTdWNjZWVkZWQKKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6CitndGVzdF9vdXRwdXRfdGVzdF8uY2M6IzogRmF0YWwgZmFpbHVyZToKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKworKGV4cGVjdGluZyAxIGZhaWx1cmUpCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZSBjb250YWluaW5nICJTb21lIG90aGVyIG5vbi1mYXRhbCBmYWlsdXJlLiIKKyAgQWN0dWFsOgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IE5vbi1mYXRhbCBmYWlsdXJlOgorRmFpbGVkCitFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4KKworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdC5FeHBlY3RGYXRhbEZhaWx1cmUKKyhleHBlY3RpbmcgMiBmYWlsdXJlcykKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIGZhdGFsIGZhaWx1cmUuCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBmYXRhbCBmYWlsdXJlCisgIEFjdHVhbDogMCBmYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorG1swOzMybVsgUlVOICAgICAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQorKGV4cGVjdGluZyAyIGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuCitndGVzdC5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogMSBub24tZmF0YWwgZmFpbHVyZQorICBBY3R1YWw6IDAgZmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJUZXN0CisbWzA7MzJtWyBSVU4gICAgICBdIBtbbVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdC5JbnRlcmNlcHRPbmx5Q3VycmVudFRocmVhZAorKGV4cGVjdGluZyAyIGZhaWx1cmVzKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QuSW50ZXJjZXB0T25seUN1cnJlbnRUaHJlYWQKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMSB0ZXN0IGZyb20gUHJpbnRpbmdGYWlsaW5nUGFyYW1zL0ZhaWxpbmdQYXJhbVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttUHJpbnRpbmdGYWlsaW5nUGFyYW1zL0ZhaWxpbmdQYXJhbVRlc3QuRmFpbHMvMAorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBHZXRQYXJhbSgpCisgIEFjdHVhbDogMgorRXhwZWN0ZWQ6IDEKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttUHJpbnRpbmdGYWlsaW5nUGFyYW1zL0ZhaWxpbmdQYXJhbVRlc3QuRmFpbHMvMCwgd2hlcmUgR2V0UGFyYW0oKSA9IDIKKxtbMDszMm1bLS0tLS0tLS0tLV0gG1ttMiB0ZXN0cyBmcm9tIFByaW50aW5nU3RyaW5ncy9QYXJhbVRlc3QKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttUHJpbnRpbmdTdHJpbmdzL1BhcmFtVGVzdC5TdWNjZXNzL2EKKxtbMDszMm1bICAgICAgIE9LIF0gG1ttUHJpbnRpbmdTdHJpbmdzL1BhcmFtVGVzdC5TdWNjZXNzL2EKKxtbMDszMm1bIFJVTiAgICAgIF0gG1ttUHJpbnRpbmdTdHJpbmdzL1BhcmFtVGVzdC5GYWlsdXJlL2EKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogR2V0UGFyYW0oKQorICBBY3R1YWw6ICJhIgorRXhwZWN0ZWQ6ICJiIgorRXhwZWN0ZWQgZmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21QcmludGluZ1N0cmluZ3MvUGFyYW1UZXN0LkZhaWx1cmUvYSwgd2hlcmUgR2V0UGFyYW0oKSA9ICJhIgorG1swOzMybVstLS0tLS0tLS0tXSAbW21HbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK0JhckVudmlyb25tZW50OjpUZWFyRG93bigpIGNhbGxlZC4KK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitGYWlsZWQKK0V4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLgorRm9vRW52aXJvbm1lbnQ6OlRlYXJEb3duKCkgY2FsbGVkLgorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0ZhaWxlZAorRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4KKxtbMDszMm1bPT09PT09PT09PV0gG1ttNjYgdGVzdHMgZnJvbSAyOSB0ZXN0IGNhc2VzIHJhbi4KKxtbMDszMm1bICBQQVNTRUQgIF0gG1ttMjIgdGVzdHMuCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbTQ0IHRlc3RzLCBsaXN0ZWQgYmVsb3c6CisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbmZhdGFsRmFpbHVyZVRlc3QuRXNjYXBlc1N0cmluZ09wZXJhbmRzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU5vbmZhdGFsRmFpbHVyZVRlc3QuRGlmZkZvckxvbmdTdHJpbmdzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZVRlc3QuTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUxvZ2dpbmdUZXN0LkludGVybGVhdmluZ0xvZ2dpbmdBbmRBc3NlcnRpb25zCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuT2JleXNTY29wZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5Xb3Jrc0luTG9vcAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TQ09QRURfVFJBQ0VUZXN0LldvcmtzSW5TdWJyb3V0aW5lCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuQ2FuQmVOZXN0ZWQKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttU0NPUEVEX1RSQUNFVGVzdC5DYW5CZVJlcGVhdGVkCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVNDT1BFRF9UUkFDRVRlc3QuV29ya3NDb25jdXJyZW50bHkKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTm9uRmF0YWxGYWlsdXJlSW5GaXh0dXJlQ29uc3RydWN0b3JUZXN0LkZhaWx1cmVJbkNvbnN0cnVjdG9yCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUZhdGFsRmFpbHVyZUluRml4dHVyZUNvbnN0cnVjdG9yVGVzdC5GYWlsdXJlSW5Db25zdHJ1Y3RvcgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21Ob25GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21GYXRhbEZhaWx1cmVJblNldFVwVGVzdC5GYWlsdXJlSW5TZXRVcAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21BZGRGYWlsdXJlQXRUZXN0Lk1lc3NhZ2VDb250YWluc1NwZWNpZmllZEZpbGVBbmRMaW5lTnVtYmVyCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbU1peGVkVXBUZXN0Q2FzZVRlc3QuVGhpc1Nob3VsZEZhaWwKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttTWl4ZWRVcFRlc3RDYXNlVGVzdC5UaGlzU2hvdWxkRmFpbFRvbworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21NaXhlZFVwVGVzdENhc2VXaXRoU2FtZVRlc3ROYW1lVGVzdC5UaGVTZWNvbmRUZXN0V2l0aFRoaXNOYW1lU2hvdWxkRmFpbAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21URVNUX0ZfYmVmb3JlX1RFU1RfaW5fc2FtZV90ZXN0X2Nhc2UuRGVmaW5lZFVzaW5nVEVTVEFuZFNob3VsZEZhaWwKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttVEVTVF9iZWZvcmVfVEVTVF9GX2luX3NhbWVfdGVzdF9jYXNlLkRlZmluZWRVc2luZ1RFU1RfRkFuZFNob3VsZEZhaWwKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzTm9Ob25mYXRhbEZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUFyZVR3b05vbmZhdGFsRmFpbHVyZXMKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5UaGVyZUlzT25lRmF0YWxGYWlsdXJlCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdE5vbmZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50UmV0dXJucworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblN0YXRlbWVudFRocm93cworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNOb0ZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlQXJlVHdvRmF0YWxGYWlsdXJlcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYXRhbEZhaWx1cmVUZXN0LkZhaWxzV2hlblRoZXJlSXNPbmVOb25mYXRhbEZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmF0YWxGYWlsdXJlVGVzdC5GYWlsc1doZW5TdGF0ZW1lbnRSZXR1cm5zCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhdGFsRmFpbHVyZVRlc3QuRmFpbHNXaGVuU3RhdGVtZW50VGhyb3dzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbVR5cGVkVGVzdC8wLkZhaWx1cmUsIHdoZXJlIFR5cGVQYXJhbSA9IGludAorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzAuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgY2hhcgorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21VbnNpZ25lZC9UeXBlZFRlc3RQLzEuRmFpbHVyZSwgd2hlcmUgVHlwZVBhcmFtID0gdW5zaWduZWQgaW50CisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlVGVzdC5FeHBlY3ROb25GYXRhbEZhaWx1cmUKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttRXhwZWN0RmFpbHVyZVRlc3QuRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzCisbWzA7MzFtWyAgRkFJTEVEICBdIBtbbUV4cGVjdEZhaWx1cmVUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcworG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdEZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21FeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LkV4cGVjdE5vbkZhdGFsRmFpbHVyZQorG1swOzMxbVsgIEZBSUxFRCAgXSAbW21TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QuSW50ZXJjZXB0T25seUN1cnJlbnRUaHJlYWQKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttUHJpbnRpbmdGYWlsaW5nUGFyYW1zL0ZhaWxpbmdQYXJhbVRlc3QuRmFpbHMvMCwgd2hlcmUgR2V0UGFyYW0oKSA9IDIKKxtbMDszMW1bICBGQUlMRUQgIF0gG1ttUHJpbnRpbmdTdHJpbmdzL1BhcmFtVGVzdC5GYWlsdXJlL2EsIHdoZXJlIEdldFBhcmFtKCkgPSAiYSIKKworNDQgRkFJTEVEIFRFU1RTCisbWzA7MzNtICBZT1UgSEFWRSAxIERJU0FCTEVEIFRFU1QKKworG1ttTm90ZTogR29vZ2xlIFRlc3QgZmlsdGVyID0gRmF0YWxGYWlsdXJlVGVzdC4qOkxvZ2dpbmdUZXN0LioKK1s9PT09PT09PT09XSBSdW5uaW5nIDQgdGVzdHMgZnJvbSAyIHRlc3QgY2FzZXMuCitbLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLgorWy0tLS0tLS0tLS1dIDMgdGVzdHMgZnJvbSBGYXRhbEZhaWx1cmVUZXN0CitbIFJVTiAgICAgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogeAorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUgKD8gbXMpCitbIFJVTiAgICAgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIHRoYXQgeCBzaG91bGQgYmUgMSkKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitWYWx1ZSBvZjogeAorICBBY3R1YWw6IDIKK0V4cGVjdGVkOiAxCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5GYXRhbEZhaWx1cmVJbk5lc3RlZFN1YnJvdXRpbmUgKD8gbXMpCitbIFJVTiAgICAgIF0gRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKKyhleHBlY3RpbmcgYSBmYWlsdXJlIG9uIGZhbHNlKQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK1ZhbHVlIG9mOiBmYWxzZQorICBBY3R1YWw6IGZhbHNlCitFeHBlY3RlZDogdHJ1ZQorWyAgRkFJTEVEICBdIEZhdGFsRmFpbHVyZVRlc3QuTm9uZmF0YWxGYWlsdXJlSW5TdWJyb3V0aW5lICg/IG1zKQorWy0tLS0tLS0tLS1dIDMgdGVzdHMgZnJvbSBGYXRhbEZhaWx1cmVUZXN0ICg/IG1zIHRvdGFsKQorCitbLS0tLS0tLS0tLV0gMSB0ZXN0IGZyb20gTG9nZ2luZ1Rlc3QKK1sgUlVOICAgICAgXSBMb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucworKGV4cGVjdGluZyAyIGZhaWx1cmVzIG9uICgzKSA+PSAoYVtpXSkpCitpID09IDAKK2kgPT0gMQorZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjOiM6IEZhaWx1cmUKK0V4cGVjdGVkOiAoMykgPj0gKGFbaV0pLCBhY3R1YWw6IDMgdnMgOQoraSA9PSAyCitpID09IDMKK2d0ZXN0X291dHB1dF90ZXN0Xy5jYzojOiBGYWlsdXJlCitFeHBlY3RlZDogKDMpID49IChhW2ldKSwgYWN0dWFsOiAzIHZzIDYKK1sgIEZBSUxFRCAgXSBMb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucyAoPyBtcykKK1stLS0tLS0tLS0tXSAxIHRlc3QgZnJvbSBMb2dnaW5nVGVzdCAoPyBtcyB0b3RhbCkKKworWy0tLS0tLS0tLS1dIEdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93bgorWz09PT09PT09PT1dIDQgdGVzdHMgZnJvbSAyIHRlc3QgY2FzZXMgcmFuLiAoPyBtcyB0b3RhbCkKK1sgIFBBU1NFRCAgXSAwIHRlc3RzLgorWyAgRkFJTEVEICBdIDQgdGVzdHMsIGxpc3RlZCBiZWxvdzoKK1sgIEZBSUxFRCAgXSBGYXRhbEZhaWx1cmVUZXN0LkZhdGFsRmFpbHVyZUluU3Vicm91dGluZQorWyAgRkFJTEVEICBdIEZhdGFsRmFpbHVyZVRlc3QuRmF0YWxGYWlsdXJlSW5OZXN0ZWRTdWJyb3V0aW5lCitbICBGQUlMRUQgIF0gRmF0YWxGYWlsdXJlVGVzdC5Ob25mYXRhbEZhaWx1cmVJblN1YnJvdXRpbmUKK1sgIEZBSUxFRCAgXSBMb2dnaW5nVGVzdC5JbnRlcmxlYXZpbmdMb2dnaW5nQW5kQXNzZXJ0aW9ucworCisgNCBGQUlMRUQgVEVTVFMKK05vdGU6IEdvb2dsZSBUZXN0IGZpbHRlciA9ICpESVNBQkxFRF8qCitbPT09PT09PT09PV0gUnVubmluZyAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZS4KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuCitbLS0tLS0tLS0tLV0gMSB0ZXN0IGZyb20gRGlzYWJsZWRUZXN0c1dhcm5pbmdUZXN0CitbIFJVTiAgICAgIF0gRGlzYWJsZWRUZXN0c1dhcm5pbmdUZXN0LkRJU0FCTEVEX0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1N1cHByZXNzZXNXYXJuaW5nCitbICAgICAgIE9LIF0gRGlzYWJsZWRUZXN0c1dhcm5pbmdUZXN0LkRJU0FCTEVEX0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1N1cHByZXNzZXNXYXJuaW5nCitbLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duCitbPT09PT09PT09PV0gMSB0ZXN0IGZyb20gMSB0ZXN0IGNhc2UgcmFuLgorWyAgUEFTU0VEICBdIDEgdGVzdC4KK05vdGU6IEdvb2dsZSBUZXN0IGZpbHRlciA9IFBhc3NpbmdUZXN0LioKK05vdGU6IFRoaXMgaXMgdGVzdCBzaGFyZCAyIG9mIDIuCitbPT09PT09PT09PV0gUnVubmluZyAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZS4KK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuCitbLS0tLS0tLS0tLV0gMSB0ZXN0IGZyb20gUGFzc2luZ1Rlc3QKK1sgUlVOICAgICAgXSBQYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKK1sgICAgICAgT0sgXSBQYXNzaW5nVGVzdC5QYXNzaW5nVGVzdDIKK1stLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCB0ZWFyLWRvd24KK1s9PT09PT09PT09XSAxIHRlc3QgZnJvbSAxIHRlc3QgY2FzZSByYW4uCitbICBQQVNTRUQgIF0gMSB0ZXN0LgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGVmZjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwyNDI3IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAxMC8zMS8yMDExIGJ5IGNvbW1hbmQKKy8vICdnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IDUnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBndGVzdF9wcmVkX2ltcGwuaAorLy8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBzY3JpcHQgYW5kIHF1aXRlIGxvbmcuICBJZiB5b3UgaW50ZW5kIHRvCisvLyBsZWFybiBob3cgR29vZ2xlIFRlc3Qgd29ya3MgYnkgcmVhZGluZyBpdHMgdW5pdCB0ZXN0cywgcmVhZAorLy8gZ3Rlc3RfdW5pdHRlc3QuY2MgaW5zdGVhZC4KKy8vCisvLyBUaGlzIGlzIGludGVuZGVkIGFzIGEgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgR29vZ2xlIFRlc3QgcHJlZGljYXRlCisvLyBhc3NlcnRpb25zLiAgV2UgY29tcGlsZSBpdCBhcyBwYXJ0IG9mIHRoZSBndGVzdF91bml0dGVzdCB0YXJnZXQKKy8vIG9ubHkgdG8ga2VlcCB0aGUgaW1wbGVtZW50YXRpb24gdGlkeSBhbmQgY29tcGFjdCwgYXMgaXQgaXMgcXVpdGUKKy8vIGludm9sdmVkIHRvIHNldCB1cCB0aGUgc3RhZ2UgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgdXNpbmcgR29vZ2xlCisvLyBUZXN0IGl0c2VsZi4KKy8vCisvLyBDdXJyZW50bHksIGd0ZXN0X3VuaXR0ZXN0IHRha2VzIH4xMSBzZWNvbmRzIHRvIHJ1biBpbiB0aGUgdGVzdGluZworLy8gZGFlbW9uLiAgSW4gdGhlIGZ1dHVyZSwgaWYgaXQgZ3Jvd3MgdG9vIGxhcmdlIGFuZCBuZWVkcyBtdWNoIG1vcmUKKy8vIHRpbWUgdG8gZmluaXNoLCB3ZSBzaG91bGQgY29uc2lkZXIgc2VwYXJhdGluZyB0aGlzIGZpbGUgaW50byBhCisvLyBzdGFuZC1hbG9uZSByZWdyZXNzaW9uIHRlc3QuCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCisKKy8vIEEgdXNlci1kZWZpbmVkIGRhdGEgdHlwZS4KK3N0cnVjdCBCb29sIHsKKyAgZXhwbGljaXQgQm9vbChpbnQgdmFsKSA6IHZhbHVlKHZhbCAhPSAwKSB7fQorCisgIGJvb2wgb3BlcmF0b3I+KGludCBuKSBjb25zdCB7IHJldHVybiB2YWx1ZSA+IEJvb2wobikudmFsdWU7IH0KKworICBCb29sIG9wZXJhdG9yKyhjb25zdCBCb29sJiByaHMpIGNvbnN0IHsgcmV0dXJuIEJvb2wodmFsdWUgKyByaHMudmFsdWUpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJvb2wmIHJocykgY29uc3QgeyByZXR1cm4gdmFsdWUgPT0gcmhzLnZhbHVlOyB9CisKKyAgYm9vbCB2YWx1ZTsKK307CisKKy8vIEVuYWJsZXMgQm9vbCB0byBiZSB1c2VkIGluIGFzc2VydGlvbnMuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQm9vbCYgeCkgeworICByZXR1cm4gb3MgPDwgKHgudmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKK30KKworLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KKworLy8gQSB1bmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Citib29sIFByZWRGdW5jdGlvbjEoVDEgdjEpIHsKKyAgcmV0dXJuIHYxID4gMDsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgorLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCisvLyBmdW5jdGlvbi4KK2Jvb2wgUHJlZEZ1bmN0aW9uMUludChpbnQgdjEpIHsKKyAgcmV0dXJuIHYxID4gMDsKK30KK2Jvb2wgUHJlZEZ1bmN0aW9uMUJvb2woQm9vbCB2MSkgeworICByZXR1cm4gdjEgPiAwOworfQorCisvLyBBIHVuYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgorc3RydWN0IFByZWRGdW5jdG9yMSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSkgeworICAgIHJldHVybiB2MSA+IDA7CisgIH0KK307CisKKy8vIEEgdW5hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb24xKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxKSB7CisgIGlmIChQcmVkRnVuY3Rpb24xKHYxKSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8IGUxCisgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKKyAgICAgIDw8IHYxIDw8ICIuIjsKK30KKworLy8gQSB1bmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3IxIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxKSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjEoZTEsIHYxKTsKKyAgfQorfTsKKworLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDEuCisKK2NsYXNzIFByZWRpY2F0ZTFUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOworICAgIGZpbmlzaGVkXyA9IGZhbHNlOworICAgIG4xXyA9IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAorICAgIC8vIGV4YWN0bHkgb25jZS4KKyAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCisgICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOworICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgorICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKKworICBzdGF0aWMgaW50IG4xXzsKK307CisKK2Jvb2wgUHJlZGljYXRlMVRlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Citib29sIFByZWRpY2F0ZTFUZXN0OjpmaW5pc2hlZF87CitpbnQgUHJlZGljYXRlMVRlc3Q6Om4xXzsKKwordHlwZWRlZiBQcmVkaWNhdGUxVGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMVRlc3QgQVNTRVJUX1BSRURfRk9STUFUMVRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTFUZXN0IEVYUEVDVF9QUkVEMVRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTFUZXN0IEFTU0VSVF9QUkVEMVRlc3Q7CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdGlvbjFJbnQsCisgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0aW9uMUJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDEoUHJlZEZ1bmN0aW9uMUludCwKKyAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQxKFByZWRGdW5jdGlvbjFCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0aW9uMUludCwKKyAgICAgICAgICAgICAgICsrbjFfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3Rpb24xQm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMShQcmVkRnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdGlvbjFJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdGlvbjFCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQxKFByZWRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDEoUHJlZEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0b3IxKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoUHJlZEZvcm1hdEZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKFByZWRGb3JtYXRGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQxIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDFUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDEgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQxVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMShQcmVkRm9ybWF0RnVuY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIGJpbmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KKworLy8gQSBiaW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2Jvb2wgUHJlZEZ1bmN0aW9uMihUMSB2MSwgVDIgdjIpIHsKKyAgcmV0dXJuIHYxICsgdjIgPiAwOworfQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG5lZWRlZCB0byBjaXJjdW12ZW50IGEgYnVnIGluCisvLyBnY2MgMi45NS4zLCB3aGljaCBzb21ldGltZXMgaGFzIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgdGVtcGxhdGUKKy8vIGZ1bmN0aW9uLgorYm9vbCBQcmVkRnVuY3Rpb24ySW50KGludCB2MSwgaW50IHYyKSB7CisgIHJldHVybiB2MSArIHYyID4gMDsKK30KK2Jvb2wgUHJlZEZ1bmN0aW9uMkJvb2woQm9vbCB2MSwgQm9vbCB2MikgeworICByZXR1cm4gdjEgKyB2MiA+IDA7Cit9CisKKy8vIEEgYmluYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgorc3RydWN0IFByZWRGdW5jdG9yMiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIpIHsKKyAgICByZXR1cm4gdjEgKyB2MiA+IDA7CisgIH0KK307CisKKy8vIEEgYmluYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IFByZWRGb3JtYXRGdW5jdGlvbjIoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgeworICBpZiAoUHJlZEZ1bmN0aW9uMih2MSwgdjIpKQorICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgZTEgPDwgIiArICIgPDwgZTIKKyAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBldmFsdWF0ZXMgdG8gIgorICAgICAgPDwgdjEgKyB2MiA8PCAiLiI7Cit9CisKKy8vIEEgYmluYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rvci4KK3N0cnVjdCBQcmVkRm9ybWF0RnVuY3RvcjIgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjIoZTEsIGUyLCB2MSwgdjIpOworICB9Cit9OworCisvLyBUZXN0cyBmb3Ige0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMi4KKworY2xhc3MgUHJlZGljYXRlMlRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IHRydWU7CisgICAgZmluaXNoZWRfID0gZmFsc2U7CisgICAgbjFfID0gbjJfID0gMDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAvLyBWZXJpZmllcyB0aGF0IGVhY2ggb2YgdGhlIHByZWRpY2F0ZSdzIGFyZ3VtZW50cyB3YXMgZXZhbHVhdGVkCisgICAgLy8gZXhhY3RseSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBuMV8pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgMiAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjJfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDMgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCisgICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOworICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgorICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKKworICBzdGF0aWMgaW50IG4xXzsKKyAgc3RhdGljIGludCBuMl87Cit9OworCitib29sIFByZWRpY2F0ZTJUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOworYm9vbCBQcmVkaWNhdGUyVGVzdDo6ZmluaXNoZWRfOworaW50IFByZWRpY2F0ZTJUZXN0OjpuMV87CitpbnQgUHJlZGljYXRlMlRlc3Q6Om4yXzsKKwordHlwZWRlZiBQcmVkaWNhdGUyVGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlMlRlc3QgQVNTRVJUX1BSRURfRk9STUFUMlRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTJUZXN0IEVYUEVDVF9QUkVEMlRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTJUZXN0IEFTU0VSVF9QUkVEMlRlc3Q7CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdGlvbjJJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3Rpb24yQm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMihQcmVkRnVuY3Rpb24ySW50LAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdGlvbjJCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDIoUHJlZEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQyKFByZWRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0aW9uMkludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdGlvbjJCb29sLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDIoUHJlZEZ1bmN0aW9uMkludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDJUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQyKFByZWRGdW5jdGlvbjJCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMihQcmVkRnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3Rpb24yLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUMlRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDIgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0b3IyKCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQyIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoUHJlZEZvcm1hdEZ1bmN0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQyVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMihQcmVkRm9ybWF0RnVuY3RvcjIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMiB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDJUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQyKFByZWRGb3JtYXRGdW5jdG9yMigpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyB0ZXJuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBIHRlcm5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Citib29sIFByZWRGdW5jdGlvbjMoVDEgdjEsIFQyIHYyLCBUMyB2MykgeworICByZXR1cm4gdjEgKyB2MiArIHYzID4gMDsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgorLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCisvLyBmdW5jdGlvbi4KK2Jvb2wgUHJlZEZ1bmN0aW9uM0ludChpbnQgdjEsIGludCB2MiwgaW50IHYzKSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgPiAwOworfQorYm9vbCBQcmVkRnVuY3Rpb24zQm9vbChCb29sIHYxLCBCb29sIHYyLCBCb29sIHYzKSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgPiAwOworfQorCisvLyBBIHRlcm5hcnkgcHJlZGljYXRlIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZ1bmN0b3IzIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMpIHsKKyAgICByZXR1cm4gdjEgKyB2MiArIHYzID4gMDsKKyAgfQorfTsKKworLy8gQSB0ZXJuYXJ5IHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb24zKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgeworICBpZiAoUHJlZEZ1bmN0aW9uMyh2MSwgdjIsIHYzKSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzCisgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKKyAgICAgIDw8IHYxICsgdjIgKyB2MyA8PCAiLiI7Cit9CisKKy8vIEEgdGVybmFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3IzIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZEZvcm1hdEZ1bmN0aW9uMyhlMSwgZTIsIGUzLCB2MSwgdjIsIHYzKTsKKyAgfQorfTsKKworLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDMuCisKK2NsYXNzIFByZWRpY2F0ZTNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOworICAgIGZpbmlzaGVkXyA9IGZhbHNlOworICAgIG4xXyA9IG4yXyA9IG4zXyA9IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAorICAgIC8vIGV4YWN0bHkgb25jZS4KKyAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4yXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAzICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuM18pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNCAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZC4KKyAgICBpZiAoZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiAhZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIHVuZXhwYWN0ZWRseSBhYm9ydGVkIHRoZSB0ZXN0LiI7CisgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRfdG9fZmluaXNoXyAmJiBmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIGZhaWxlZCBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBhYm9ydCB0aGUgdGVzdCAiCisgICAgICAgICAgICAgICAgImFzIGV4cGVjdGVkLiI7CisgICAgfQorICB9CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZXhwZWN0ZWRfdG9fZmluaXNoXzsKKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBkaWQgcnVuIHRvIGZpbmlzaC4KKyAgc3RhdGljIGJvb2wgZmluaXNoZWRfOworCisgIHN0YXRpYyBpbnQgbjFfOworICBzdGF0aWMgaW50IG4yXzsKKyAgc3RhdGljIGludCBuM187Cit9OworCitib29sIFByZWRpY2F0ZTNUZXN0OjpleHBlY3RlZF90b19maW5pc2hfOworYm9vbCBQcmVkaWNhdGUzVGVzdDo6ZmluaXNoZWRfOworaW50IFByZWRpY2F0ZTNUZXN0OjpuMV87CitpbnQgUHJlZGljYXRlM1Rlc3Q6Om4yXzsKK2ludCBQcmVkaWNhdGUzVGVzdDo6bjNfOworCit0eXBlZGVmIFByZWRpY2F0ZTNUZXN0IEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0OwordHlwZWRlZiBQcmVkaWNhdGUzVGVzdCBBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlM1Rlc3QgRVhQRUNUX1BSRUQzVGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlM1Rlc3QgQVNTRVJUX1BSRUQzVGVzdDsKKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0aW9uM0ludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0aW9uM0Jvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0aW9uM0ludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0aW9uM0Jvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3Rpb24zSW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3Rpb24zQm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQzVGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQzKFByZWRGdW5jdGlvbjNJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0aW9uM0Jvb2wsCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEMyhQcmVkRnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDNUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDMoUHJlZEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3Rpb24zLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUM1Rlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdGlvbjMsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUMyB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDMoUHJlZEZvcm1hdEZ1bmN0aW9uMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQzIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDNUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQzKFByZWRGb3JtYXRGdW5jdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4zXysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDMgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQzVGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMyhQcmVkRm9ybWF0RnVuY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorLy8gU2FtcGxlIGZ1bmN0aW9ucy9mdW5jdG9ycyBmb3IgdGVzdGluZyA0LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucy4KKworLy8gQSA0LWFyeSBwcmVkaWNhdGUgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Citib29sIFByZWRGdW5jdGlvbjQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ID4gMDsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgorLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCisvLyBmdW5jdGlvbi4KK2Jvb2wgUHJlZEZ1bmN0aW9uNEludChpbnQgdjEsIGludCB2MiwgaW50IHYzLCBpbnQgdjQpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ID4gMDsKK30KK2Jvb2wgUHJlZEZ1bmN0aW9uNEJvb2woQm9vbCB2MSwgQm9vbCB2MiwgQm9vbCB2MywgQm9vbCB2NCkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgPiAwOworfQorCisvLyBBIDQtYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgorc3RydWN0IFByZWRGdW5jdG9yNCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCkgeworICAgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCA+IDA7CisgIH0KK307CisKKy8vIEEgNC1hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK3Rlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmVkRm9ybWF0RnVuY3Rpb240KGNvbnN0IGNoYXIqIGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSB7CisgIGlmIChQcmVkRnVuY3Rpb240KHYxLCB2MiwgdjMsIHY0KSkKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzIDw8ICIgKyAiIDw8IGU0CisgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgZXZhbHVhdGVzIHRvICIKKyAgICAgIDw8IHYxICsgdjIgKyB2MyArIHY0IDw8ICIuIjsKK30KKworLy8gQSA0LWFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3I0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSBjb25zdCB7CisgICAgcmV0dXJuIFByZWRGb3JtYXRGdW5jdGlvbjQoZTEsIGUyLCBlMywgZTQsIHYxLCB2MiwgdjMsIHY0KTsKKyAgfQorfTsKKworLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDQuCisKK2NsYXNzIFByZWRpY2F0ZTRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOworICAgIGZpbmlzaGVkXyA9IGZhbHNlOworICAgIG4xXyA9IG4yXyA9IG4zXyA9IG40XyA9IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAorICAgIC8vIGV4YWN0bHkgb25jZS4KKyAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4yXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAzICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuM18pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNCAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjRfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDUgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisKKyAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250cm9sIGZsb3cgaW4gdGhlIHRlc3QgZnVuY3Rpb24gaXMgZXhwZWN0ZWQuCisgICAgaWYgKGV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgIWZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiB1bmV4cGFjdGVkbHkgYWJvcnRlZCB0aGUgdGVzdC4iOworICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkX3RvX2ZpbmlzaF8gJiYgZmluaXNoZWRfKSB7CisgICAgICBGQUlMKCkgPDwgIlRoZSBmYWlsZWQgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgYWJvcnQgdGhlIHRlc3QgIgorICAgICAgICAgICAgICAgICJhcyBleHBlY3RlZC4iOworICAgIH0KKyAgfQorCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGV4cGVjdGVkX3RvX2ZpbmlzaF87CisKKyAgLy8gdHJ1ZSBpZmYgdGhlIHRlc3QgZnVuY3Rpb24gZGlkIHJ1biB0byBmaW5pc2guCisgIHN0YXRpYyBib29sIGZpbmlzaGVkXzsKKworICBzdGF0aWMgaW50IG4xXzsKKyAgc3RhdGljIGludCBuMl87CisgIHN0YXRpYyBpbnQgbjNfOworICBzdGF0aWMgaW50IG40XzsKK307CisKK2Jvb2wgUHJlZGljYXRlNFRlc3Q6OmV4cGVjdGVkX3RvX2ZpbmlzaF87Citib29sIFByZWRpY2F0ZTRUZXN0OjpmaW5pc2hlZF87CitpbnQgUHJlZGljYXRlNFRlc3Q6Om4xXzsKK2ludCBQcmVkaWNhdGU0VGVzdDo6bjJfOworaW50IFByZWRpY2F0ZTRUZXN0OjpuM187CitpbnQgUHJlZGljYXRlNFRlc3Q6Om40XzsKKwordHlwZWRlZiBQcmVkaWNhdGU0VGVzdCBFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdDsKK3R5cGVkZWYgUHJlZGljYXRlNFRlc3QgQVNTRVJUX1BSRURfRk9STUFUNFRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTRUZXN0IEVYUEVDVF9QUkVENFRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTRUZXN0IEFTU0VSVF9QUkVENFRlc3Q7CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdGlvbjRJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0aW9uNEJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDQoUHJlZEZ1bmN0aW9uNEludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVENFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ0KFByZWRGdW5jdGlvbjRCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0aW9uNEludCwKKyAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICsrbjRfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENChQcmVkRnVuY3Rpb240Qm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENChQcmVkRnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdGlvbjRJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdGlvbjRCb29sLAorICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG40XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRUQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ0KFByZWRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDQoUHJlZEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICAgICAgICAgKytuMl8sCisgICAgICAgICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICAgICAgICAgKytuNF8pOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0b3I0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDQoUHJlZEZvcm1hdEZ1bmN0aW9uNCwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdG9yNCgpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNFRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ0KFByZWRGb3JtYXRGdW5jdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNF8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRF9GT1JNQVQ0IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDRUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3Rpb240LAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNCB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDQgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ0VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNChQcmVkRm9ybWF0RnVuY3RvcjQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisvLyBTYW1wbGUgZnVuY3Rpb25zL2Z1bmN0b3JzIGZvciB0ZXN0aW5nIDUtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zLgorCisvLyBBIDUtYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Citib29sIFByZWRGdW5jdGlvbjUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1KSB7CisgIHJldHVybiB2MSArIHYyICsgdjMgKyB2NCArIHY1ID4gMDsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gY2lyY3VtdmVudCBhIGJ1ZyBpbgorLy8gZ2NjIDIuOTUuMywgd2hpY2ggc29tZXRpbWVzIGhhcyBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIHRlbXBsYXRlCisvLyBmdW5jdGlvbi4KK2Jvb2wgUHJlZEZ1bmN0aW9uNUludChpbnQgdjEsIGludCB2MiwgaW50IHYzLCBpbnQgdjQsIGludCB2NSkgeworICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgKyB2NSA+IDA7Cit9Citib29sIFByZWRGdW5jdGlvbjVCb29sKEJvb2wgdjEsIEJvb2wgdjIsIEJvb2wgdjMsIEJvb2wgdjQsIEJvb2wgdjUpIHsKKyAgcmV0dXJuIHYxICsgdjIgKyB2MyArIHY0ICsgdjUgPiAwOworfQorCisvLyBBIDUtYXJ5IHByZWRpY2F0ZSBmdW5jdG9yLgorc3RydWN0IFByZWRGdW5jdG9yNSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCisgICAgICAgICAgICAgICAgICBjb25zdCBUNSYgdjUpIHsKKyAgICByZXR1cm4gdjEgKyB2MiArIHYzICsgdjQgKyB2NSA+IDA7CisgIH0KK307CisKKy8vIEEgNS1hcnkgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Cit0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJlZEZvcm1hdEZ1bmN0aW9uNShjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSB7CisgIGlmIChQcmVkRnVuY3Rpb241KHYxLCB2MiwgdjMsIHY0LCB2NSkpCisgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKKworICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCBlMSA8PCAiICsgIiA8PCBlMiA8PCAiICsgIiA8PCBlMyA8PCAiICsgIiA8PCBlNCA8PCAiICsgIiA8PCBlNQorICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGV2YWx1YXRlcyB0byAiCisgICAgICA8PCB2MSArIHYyICsgdjMgKyB2NCArIHY1IDw8ICIuIjsKK30KKworLy8gQSA1LWFyeSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IuCitzdHJ1Y3QgUHJlZEZvcm1hdEZ1bmN0b3I1IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KKyAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgY29uc3QgeworICAgIHJldHVybiBQcmVkRm9ybWF0RnVuY3Rpb241KGUxLCBlMiwgZTMsIGU0LCBlNSwgdjEsIHYyLCB2MywgdjQsIHY1KTsKKyAgfQorfTsKKworLy8gVGVzdHMgZm9yIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDUuCisKK2NsYXNzIFByZWRpY2F0ZTVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSB0cnVlOworICAgIGZpbmlzaGVkXyA9IGZhbHNlOworICAgIG4xXyA9IG4yXyA9IG4zXyA9IG40XyA9IG41XyA9IDA7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCBlYWNoIG9mIHRoZSBwcmVkaWNhdGUncyBhcmd1bWVudHMgd2FzIGV2YWx1YXRlZAorICAgIC8vIGV4YWN0bHkgb25jZS4KKyAgICBFWFBFQ1RfRVEoMSwgbjFfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDIgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG4yXykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCAzICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworICAgIEVYUEVDVF9FUSgxLCBuM18pIDw8CisgICAgICAgICJUaGUgcHJlZGljYXRlIGFzc2VydGlvbiBkaWRuJ3QgZXZhbHVhdGUgYXJndW1lbnQgNCAiCisgICAgICAgICJleGFjdGx5IG9uY2UuIjsKKyAgICBFWFBFQ1RfRVEoMSwgbjRfKSA8PAorICAgICAgICAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGV2YWx1YXRlIGFyZ3VtZW50IDUgIgorICAgICAgICAiZXhhY3RseSBvbmNlLiI7CisgICAgRVhQRUNUX0VRKDEsIG41XykgPDwKKyAgICAgICAgIlRoZSBwcmVkaWNhdGUgYXNzZXJ0aW9uIGRpZG4ndCBldmFsdWF0ZSBhcmd1bWVudCA2ICIKKyAgICAgICAgImV4YWN0bHkgb25jZS4iOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgY29udHJvbCBmbG93IGluIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIGV4cGVjdGVkLgorICAgIGlmIChleHBlY3RlZF90b19maW5pc2hfICYmICFmaW5pc2hlZF8pIHsKKyAgICAgIEZBSUwoKSA8PCAiVGhlIHByZWRpY2F0ZSBhc3NlcnRpb24gdW5leHBhY3RlZGx5IGFib3J0ZWQgdGhlIHRlc3QuIjsKKyAgICB9IGVsc2UgaWYgKCFleHBlY3RlZF90b19maW5pc2hfICYmIGZpbmlzaGVkXykgeworICAgICAgRkFJTCgpIDw8ICJUaGUgZmFpbGVkIHByZWRpY2F0ZSBhc3NlcnRpb24gZGlkbid0IGFib3J0IHRoZSB0ZXN0ICIKKyAgICAgICAgICAgICAgICAiYXMgZXhwZWN0ZWQuIjsKKyAgICB9CisgIH0KKworICAvLyB0cnVlIGlmZiB0aGUgdGVzdCBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBleHBlY3RlZF90b19maW5pc2hfOworCisgIC8vIHRydWUgaWZmIHRoZSB0ZXN0IGZ1bmN0aW9uIGRpZCBydW4gdG8gZmluaXNoLgorICBzdGF0aWMgYm9vbCBmaW5pc2hlZF87CisKKyAgc3RhdGljIGludCBuMV87CisgIHN0YXRpYyBpbnQgbjJfOworICBzdGF0aWMgaW50IG4zXzsKKyAgc3RhdGljIGludCBuNF87CisgIHN0YXRpYyBpbnQgbjVfOworfTsKKworYm9vbCBQcmVkaWNhdGU1VGVzdDo6ZXhwZWN0ZWRfdG9fZmluaXNoXzsKK2Jvb2wgUHJlZGljYXRlNVRlc3Q6OmZpbmlzaGVkXzsKK2ludCBQcmVkaWNhdGU1VGVzdDo6bjFfOworaW50IFByZWRpY2F0ZTVUZXN0OjpuMl87CitpbnQgUHJlZGljYXRlNVRlc3Q6Om4zXzsKK2ludCBQcmVkaWNhdGU1VGVzdDo6bjRfOworaW50IFByZWRpY2F0ZTVUZXN0OjpuNV87CisKK3R5cGVkZWYgUHJlZGljYXRlNVRlc3QgRVhQRUNUX1BSRURfRk9STUFUNVRlc3Q7Cit0eXBlZGVmIFByZWRpY2F0ZTVUZXN0IEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0OwordHlwZWRlZiBQcmVkaWNhdGU1VGVzdCBFWFBFQ1RfUFJFRDVUZXN0OwordHlwZWRlZiBQcmVkaWNhdGU1VGVzdCBBU1NFUlRfUFJFRDVUZXN0OworCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVENShQcmVkRnVuY3Rpb241SW50LAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICArK241Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0aW9uNUJvb2wsCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgKytuMV8sCisgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgKytuNF8sCisgICAgICAgICAgICAgICArK241Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBFWFBFQ1RfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDUoUHJlZEZ1bmN0aW9uNUludCwKKyAgICAgICAgICAgICAgICAgbjFfKyssCisgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgbjRfKyssCisgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENShQcmVkRnVuY3Rpb241Qm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQ1KFByZWRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgIG4zXysrLAorICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRUQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVENShQcmVkRnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdGlvbjVJbnQsCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVENShQcmVkRnVuY3Rpb241Qm9vbCwKKyAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgKytuM18sCisgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVENVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRUQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRUQ1KFByZWRGdW5jdGlvbjVJbnQsCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRUQ1VGVzdCwgRnVuY3Rpb25PblVzZXJUeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVENShQcmVkRnVuY3Rpb241Qm9vbCwKKyAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVENSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICBuMl8rKywKKyAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICBuNV8rKyk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBBU1NFUlRfUFJFRDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDUoUHJlZEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIHN1Y2Nlc3NmdWwgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZVN1Y2Nlc3MpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlU3VjY2VzcykgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgICsrbjFfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjJfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjNfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjRfLAorICAgICAgICAgICAgICAgICAgICAgICsrbjVfKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24xXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24yXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK24zXyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK240XyksCisgICAgICAgICAgICAgICAgICAgICAgQm9vbCgrK241XykpOworICBmaW5pc2hlZF8gPSB0cnVlOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgYnVpbHQtaW4gdHlwZSAoaW50KS4KK1RFU1RfRihFWFBFQ1RfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rpb25PbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEVYUEVDVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoRVhQRUNUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3Rpb241LAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMV8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4yXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjNfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNF8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG41XysrKSk7CisgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBhIGZhaWxlZCBFWFBFQ1RfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjJfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuM18rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG40XysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjVfKyspOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgRVhQRUNUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdG9yIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEVYUEVDVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KKworLy8gVGVzdHMgYSBzdWNjZXNzZnVsIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uQnVpbHRJblR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICAgICAgICArK241Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0aW9uIG9uIGEgdXNlci1kZWZpbmVkIHR5cGUgKEJvb2wpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdGlvbk9uVXNlclR5cGVTdWNjZXNzKSB7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjFfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjJfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjNfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjRfKSwKKyAgICAgICAgICAgICAgICAgICAgICBCb29sKCsrbjVfKSk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSBidWlsdC1pbiB0eXBlIChpbnQpLgorVEVTVF9GKEFTU0VSVF9QUkVEX0ZPUk1BVDVUZXN0LCBGdW5jdG9yT25CdWlsdEluVHlwZVN1Y2Nlc3MpIHsKKyAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICArK24xXywKKyAgICAgICAgICAgICAgICAgICAgICArK24yXywKKyAgICAgICAgICAgICAgICAgICAgICArK24zXywKKyAgICAgICAgICAgICAgICAgICAgICArK240XywKKyAgICAgICAgICAgICAgICAgICAgICArK241Xyk7CisgIGZpbmlzaGVkXyA9IHRydWU7Cit9CisKKy8vIFRlc3RzIGEgc3VjY2Vzc2Z1bCBBU1NFUlRfUFJFRF9GT1JNQVQ1IHdoZXJlIHRoZQorLy8gcHJlZGljYXRlLWZvcm1hdHRlciBpcyBhIGZ1bmN0b3Igb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPblVzZXJUeXBlU3VjY2VzcykgeworICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdG9yNSgpLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMV8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuMl8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuM18pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNF8pLAorICAgICAgICAgICAgICAgICAgICAgIEJvb2woKytuNV8pKTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKK30KKworLy8gVGVzdHMgYSBmYWlsZWQgQVNTRVJUX1BSRURfRk9STUFUNSB3aGVyZSB0aGUKKy8vIHByZWRpY2F0ZS1mb3JtYXR0ZXIgaXMgYSBmdW5jdGlvbiBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25CdWlsdEluVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3Rpb24gb24gYSB1c2VyLWRlZmluZWQgdHlwZSAoQm9vbCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0aW9uT25Vc2VyVHlwZUZhaWx1cmUpIHsKKyAgZXhwZWN0ZWRfdG9fZmluaXNoXyA9IGZhbHNlOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQ1KFByZWRGb3JtYXRGdW5jdGlvbjUsCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4xXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjJfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuM18rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG40XysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjVfKyspKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIGJ1aWx0LWluIHR5cGUgKGludCkuCitURVNUX0YoQVNTRVJUX1BSRURfRk9STUFUNVRlc3QsIEZ1bmN0b3JPbkJ1aWx0SW5UeXBlRmFpbHVyZSkgeworICBleHBlY3RlZF90b19maW5pc2hfID0gZmFsc2U7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoUHJlZEZvcm1hdEZ1bmN0b3I1KCksCisgICAgICAgICAgICAgICAgICAgICAgICBuMV8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4yXysrLAorICAgICAgICAgICAgICAgICAgICAgICAgbjNfKyssCisgICAgICAgICAgICAgICAgICAgICAgICBuNF8rKywKKyAgICAgICAgICAgICAgICAgICAgICAgIG41XysrKTsKKyAgICBmaW5pc2hlZF8gPSB0cnVlOworICB9LCAiIik7Cit9CisKKy8vIFRlc3RzIGEgZmFpbGVkIEFTU0VSVF9QUkVEX0ZPUk1BVDUgd2hlcmUgdGhlCisvLyBwcmVkaWNhdGUtZm9ybWF0dGVyIGlzIGEgZnVuY3RvciBvbiBhIHVzZXItZGVmaW5lZCB0eXBlIChCb29sKS4KK1RFU1RfRihBU1NFUlRfUFJFRF9GT1JNQVQ1VGVzdCwgRnVuY3Rvck9uVXNlclR5cGVGYWlsdXJlKSB7CisgIGV4cGVjdGVkX3RvX2ZpbmlzaF8gPSBmYWxzZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUNShQcmVkRm9ybWF0RnVuY3RvcjUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjFfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuMl8rKyksCisgICAgICAgICAgICAgICAgICAgICAgICBCb29sKG4zXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wobjRfKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9vbChuNV8rKykpOworICAgIGZpbmlzaGVkXyA9IHRydWU7CisgIH0sICIiKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3ByZW1hdHVyZV9leGl0X3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9wcmVtYXR1cmVfZXhpdF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGRjN2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9wcmVtYXR1cmVfZXhpdF90ZXN0LmNjCkBAIC0wLDAgKzEsMTI3IEBACisvLyBDb3B5cmlnaHQgMjAxMywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgbWFuaXB1bGF0ZXMgdGhlIHByZW1hdHVyZS1leGl0LWRldGVjdGlvbgorLy8gZmlsZSBjb3JyZWN0bHkuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpHZXRFbnY7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpwb3NpeDo6U3RhdDsKK3VzaW5nIDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpTdGF0U3RydWN0OworCituYW1lc3BhY2UgeworCitjbGFzcyBQcmVtYXR1cmVFeGl0VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6CisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIGZpbGUgZXhpc3RzLgorICBzdGF0aWMgYm9vbCBGaWxlRXhpc3RzKGNvbnN0IGNoYXIqIGZpbGVwYXRoKSB7CisgICAgU3RhdFN0cnVjdCBzdGF0OworICAgIHJldHVybiBTdGF0KGZpbGVwYXRoLCAmc3RhdCkgPT0gMDsKKyAgfQorCisgcHJvdGVjdGVkOgorICBQcmVtYXR1cmVFeGl0VGVzdCgpIHsKKyAgICBwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfID0gR2V0RW52KCJURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUiKTsKKworICAgIC8vIE5vcm1hbGl6ZSBOVUxMIHRvICIiIGZvciBlYXNlIG9mIGhhbmRsaW5nLgorICAgIGlmIChwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfID09IE5VTEwpIHsKKyAgICAgIHByZW1hdHVyZV9leGl0X2ZpbGVfcGF0aF8gPSAiIjsKKyAgICB9CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBwcmVtYXR1cmUtZXhpdCBmaWxlIGV4aXN0cy4KKyAgYm9vbCBQcmVtYXR1cmVFeGl0RmlsZUV4aXN0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmlsZUV4aXN0cyhwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfKTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIHByZW1hdHVyZV9leGl0X2ZpbGVfcGF0aF87Cit9OworCit0eXBlZGVmIFByZW1hdHVyZUV4aXRUZXN0IFByZW1hdHVyZUV4aXREZWF0aFRlc3Q7CisKKy8vIFRlc3RzIHRoYXQ6CisvLyAgIC0gdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgZXhpc3RzIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGEKKy8vICAgICBkZWF0aCB0ZXN0IChFWFBFQ1RfREVBVEgqKSwgYW5kCisvLyAgIC0gYSBkZWF0aCB0ZXN0IGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggdGhlIG1haW4gdGVzdCBwcm9jZXNzJ3MKKy8vICAgICBoYW5kbGluZyBvZiB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZS4KK1RFU1RfRihQcmVtYXR1cmVFeGl0RGVhdGhUZXN0LCBGaWxlRXhpc3RzRHVyaW5nRXhlY3V0aW9uT2ZEZWF0aFRlc3QpIHsKKyAgaWYgKCpwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfID09ICdcMCcpIHsKKyAgICByZXR1cm47CisgIH0KKworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKKyAgICAgIC8vIElmIHRoZSBmaWxlIGV4aXN0cywgY3Jhc2ggdGhlIHByb2Nlc3Mgc3VjaCB0aGF0IHRoZSBtYWluIHRlc3QKKyAgICAgIC8vIHByb2Nlc3Mgd2lsbCBjYXRjaCB0aGUgKGV4cGVjdGVkKSBjcmFzaCBhbmQgcmVwb3J0IGEgc3VjY2VzczsKKyAgICAgIC8vIG90aGVyd2lzZSBkb24ndCBjcmFzaCwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgbWFpbiB0ZXN0IHByb2Nlc3MKKyAgICAgIC8vIHRvIHJlcG9ydCB0aGF0IHRoZSBkZWF0aCB0ZXN0IGhhcyBmYWlsZWQuCisgICAgICBpZiAoUHJlbWF0dXJlRXhpdEZpbGVFeGlzdHMoKSkgeworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgIH0sICIiKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBleGlzdHMgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYQorLy8gbm9ybWFsIChub24tZGVhdGgpIHRlc3QuCitURVNUX0YoUHJlbWF0dXJlRXhpdFRlc3QsIFByZW1hdHVyZUV4aXRGaWxlRXhpc3RzRHVyaW5nVGVzdEV4ZWN1dGlvbikgeworICBpZiAoKnByZW1hdHVyZV9leGl0X2ZpbGVfcGF0aF8gPT0gJ1wwJykgeworICAgIHJldHVybjsKKyAgfQorCisgIEVYUEVDVF9UUlVFKFByZW1hdHVyZUV4aXRGaWxlRXhpc3RzKCkpCisgICAgICA8PCAiIGZpbGUgIiA8PCBwcmVtYXR1cmVfZXhpdF9maWxlX3BhdGhfCisgICAgICA8PCAiIHNob3VsZCBleGlzdCBkdXJpbmcgdGVzdCBleGVjdXRpb24sIGJ1dCBkb2Vzbid0LiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgSW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBjb25zdCBpbnQgZXhpdF9jb2RlID0gUlVOX0FMTF9URVNUUygpOworCisgIC8vIFRlc3QgdGhhdCB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBpcyBkZWxldGVkIHVwb24gcmV0dXJuIGZyb20KKyAgLy8gUlVOX0FMTF9URVNUUygpLgorICBjb25zdCBjaGFyKiBjb25zdCBmaWxlcGF0aCA9IEdldEVudigiVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFIik7CisgIGlmIChmaWxlcGF0aCAhPSBOVUxMICYmICpmaWxlcGF0aCAhPSAnXDAnKSB7CisgICAgaWYgKFByZW1hdHVyZUV4aXRUZXN0OjpGaWxlRXhpc3RzKGZpbGVwYXRoKSkgeworICAgICAgcHJpbnRmKAorICAgICAgICAgICJGaWxlICVzIHNob3VsZG4ndCBleGlzdCBhZnRlciB0aGUgdGVzdCBwcm9ncmFtIGZpbmlzaGVzLCBidXQgZG9lcy4iLAorICAgICAgICAgIGZpbGVwYXRoKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHJldHVybiBleGl0X2NvZGU7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9wcm9kX3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9wcm9kX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwYWJjZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3Byb2RfdGVzdC5jYwpAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFVuaXQgdGVzdCBmb3IgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmguCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3QvcHJvZHVjdGlvbi5oIgorCisvLyBUZXN0cyB0aGF0IHByaXZhdGUgbWVtYmVycyBjYW4gYmUgYWNjZXNzZWQgZnJvbSBhIFRFU1QgZGVjbGFyZWQgYXMKKy8vIGEgZnJpZW5kIG9mIHRoZSBjbGFzcy4KK1RFU1QoUHJpdmF0ZUNvZGVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycykgeworICBQcml2YXRlQ29kZSBhOworICBFWFBFQ1RfRVEoMCwgYS54Xyk7CisKKyAgYS5zZXRfeCgxKTsKKyAgRVhQRUNUX0VRKDEsIGEueF8pOworfQorCit0eXBlZGVmIHRlc3Rpbmc6OlRlc3QgUHJpdmF0ZUNvZGVGaXh0dXJlVGVzdDsKKworLy8gVGVzdHMgdGhhdCBwcml2YXRlIG1lbWJlcnMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gYSBURVNUX0YgZGVjbGFyZWQKKy8vIGFzIGEgZnJpZW5kIG9mIHRoZSBjbGFzcy4KK1RFU1RfRihQcml2YXRlQ29kZUZpeHR1cmVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycykgeworICBQcml2YXRlQ29kZSBhOworICBFWFBFQ1RfRVEoMCwgYS54Xyk7CisKKyAgYS5zZXRfeCgyKTsKKyAgRVhQRUNUX0VRKDIsIGEueF8pOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfcmVwZWF0X3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9yZXBlYXRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODEwMTJhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfcmVwZWF0X3Rlc3QuY2MKQEAgLTAsMCArMSwyNTMgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFRlc3RzIHRoZSAtLWd0ZXN0X3JlcGVhdD1udW1iZXIgZmxhZy4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCituYW1lc3BhY2UgdGVzdGluZyB7CisKK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhkZWF0aF90ZXN0X3N0eWxlKTsKK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOworR1RFU1RfREVDTEFSRV9pbnQzMl8ocmVwZWF0KTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcocmVwZWF0KTsKKworbmFtZXNwYWNlIHsKKworLy8gV2UgbmVlZCB0aGlzIHdoZW4gd2UgYXJlIHRlc3RpbmcgR29vZ2xlIFRlc3QgaXRzZWxmIGFuZCB0aGVyZWZvcmUKKy8vIGNhbm5vdCB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucy4KKyNkZWZpbmUgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgYWN0dWFsKSBcCisgIGRvIHtcCisgICAgY29uc3QgaW50IGV4cGVjdGVkX3ZhbCA9IChleHBlY3RlZCk7XAorICAgIGNvbnN0IGludCBhY3R1YWxfdmFsID0gKGFjdHVhbCk7XAorICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoZXhwZWN0ZWRfdmFsICE9IGFjdHVhbF92YWwpKSB7XAorICAgICAgOjpzdGQ6OmNvdXQgPDwgIlZhbHVlIG9mOiAiICNhY3R1YWwgIlxuIlwKKyAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBhY3R1YWxfdmFsIDw8ICJcbiJcCisgICAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgI2V4cGVjdGVkICJcbiJcCisgICAgICAgICAgICAgICAgICA8PCAiV2hpY2ggaXM6ICIgPDwgZXhwZWN0ZWRfdmFsIDw8ICJcbiI7XAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7XAorICAgIH1cCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKworLy8gVXNlZCBmb3IgdmVyaWZ5aW5nIHRoYXQgZ2xvYmFsIGVudmlyb25tZW50IHNldC11cCBhbmQgdGVhci1kb3duIGFyZQorLy8gaW5zaWRlIHRoZSBndGVzdF9yZXBlYXQgbG9vcC4KKworaW50IGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50ID0gMDsKK2ludCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCA9IDA7CisKK2NsYXNzIE15RW52aXJvbm1lbnQgOiBwdWJsaWMgdGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgTXlFbnZpcm9ubWVudCgpIHt9CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgZ19lbnZpcm9ubWVudF9zZXRfdXBfY291bnQrKzsgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50Kys7IH0KK307CisKKy8vIEEgdGVzdCB0aGF0IHNob3VsZCBmYWlsLgorCitpbnQgZ19zaG91bGRfZmFpbF9jb3VudCA9IDA7CisKK1RFU1QoRm9vVGVzdCwgU2hvdWxkRmFpbCkgeworICBnX3Nob3VsZF9mYWlsX2NvdW50Kys7CisgIEVYUEVDVF9FUSgwLCAxKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iOworfQorCisvLyBBIHRlc3QgdGhhdCBzaG91bGQgcGFzcy4KKworaW50IGdfc2hvdWxkX3Bhc3NfY291bnQgPSAwOworCitURVNUKEZvb1Rlc3QsIFNob3VsZFBhc3MpIHsKKyAgZ19zaG91bGRfcGFzc19jb3VudCsrOworfQorCisvLyBBIHRlc3QgdGhhdCBjb250YWlucyBhIHRocmVhZC1zYWZlIGRlYXRoIHRlc3QgYW5kIGEgZmFzdCBkZWF0aAorLy8gdGVzdC4gIEl0IHNob3VsZCBwYXNzLgorCitpbnQgZ19kZWF0aF90ZXN0X2NvdW50ID0gMDsKKworVEVTVChCYXJEZWF0aFRlc3QsIFRocmVhZFNhZmVBbmRGYXN0KSB7CisgIGdfZGVhdGhfdGVzdF9jb3VudCsrOworCisgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPSAidGhyZWFkc2FmZSI7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OkFib3J0KCksICIiKTsKKworICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gImZhc3QiOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKDo6dGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpLCAiIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAoraW50IGdfcGFyYW1fdGVzdF9jb3VudCA9IDA7CisKK2NvbnN0IGludCBrTnVtYmVyT2ZQYXJhbVRlc3RzID0gMTA7CisKK2NsYXNzIE15UGFyYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7fTsKKworVEVTVF9QKE15UGFyYW1UZXN0LCBTaG91bGRQYXNzKSB7CisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IE1ha2UgcGFyYW1ldGVyIHZhbHVlIGNoZWNraW5nIHJvYnVzdAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBXUlQgb3JkZXIgb2YgdGVzdHMuCisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZ19wYXJhbV90ZXN0X2NvdW50ICUga051bWJlck9mUGFyYW1UZXN0cywgR2V0UGFyYW0oKSk7CisgIGdfcGFyYW1fdGVzdF9jb3VudCsrOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTXlQYXJhbVNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXlQYXJhbVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpSYW5nZSgwLCBrTnVtYmVyT2ZQYXJhbVRlc3RzKSk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIFJlc2V0cyB0aGUgY291bnQgZm9yIGVhY2ggdGVzdC4KK3ZvaWQgUmVzZXRDb3VudHMoKSB7CisgIGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50ID0gMDsKKyAgZ19lbnZpcm9ubWVudF90ZWFyX2Rvd25fY291bnQgPSAwOworICBnX3Nob3VsZF9mYWlsX2NvdW50ID0gMDsKKyAgZ19zaG91bGRfcGFzc19jb3VudCA9IDA7CisgIGdfZGVhdGhfdGVzdF9jb3VudCA9IDA7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgZ19wYXJhbV90ZXN0X2NvdW50ID0gMDsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKK30KKworLy8gQ2hlY2tzIHRoYXQgdGhlIGNvdW50IGZvciBlYWNoIHRlc3QgaXMgZXhwZWN0ZWQuCit2b2lkIENoZWNrQ291bnRzKGludCBleHBlY3RlZCkgeworICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhleHBlY3RlZCwgZ19zaG91bGRfZmFpbF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQsIGdfc2hvdWxkX3Bhc3NfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKGV4cGVjdGVkLCBnX2RlYXRoX3Rlc3RfY291bnQpOworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIEdURVNUX0NIRUNLX0lOVF9FUV8oZXhwZWN0ZWQgKiBrTnVtYmVyT2ZQYXJhbVRlc3RzLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCisvLyBUZXN0cyB0aGUgYmVoYXZpb3Igb2YgR29vZ2xlIFRlc3Qgd2hlbiAtLWd0ZXN0X3JlcGVhdCBpcyBub3Qgc3BlY2lmaWVkLgordm9pZCBUZXN0UmVwZWF0VW5zcGVjaWZpZWQoKSB7CisgIFJlc2V0Q291bnRzKCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMSwgUlVOX0FMTF9URVNUUygpKTsKKyAgQ2hlY2tDb3VudHMoMSk7Cit9CisKKy8vIFRlc3RzIHRoZSBiZWhhdmlvciBvZiBHb29nbGUgVGVzdCB3aGVuIC0tZ3Rlc3RfcmVwZWF0IGhhcyB0aGUgZ2l2ZW4gdmFsdWUuCit2b2lkIFRlc3RSZXBlYXQoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisKKyAgUmVzZXRDb3VudHMoKTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQgPiAwID8gMSA6IDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIENoZWNrQ291bnRzKHJlcGVhdCk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIC0tZ3Rlc3RfcmVwZWF0IHdoZW4gLS1ndGVzdF9maWx0ZXIgc3BlY2lmaWVzIGFuIGVtcHR5CisvLyBzZXQgb2YgdGVzdHMuCit2b2lkIFRlc3RSZXBlYXRXaXRoRW1wdHlGaWx0ZXIoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICJOb25lIjsKKworICBSZXNldENvdW50cygpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIENoZWNrQ291bnRzKDApOworfQorCisvLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhIHNldCBvZgorLy8gc3VjY2Vzc2Z1bCB0ZXN0cy4KK3ZvaWQgVGVzdFJlcGVhdFdpdGhGaWx0ZXJGb3JTdWNjZXNzZnVsVGVzdHMoaW50IHJlcGVhdCkgeworICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXQ7CisgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICIqLSpTaG91bGRGYWlsIjsKKworICBSZXNldENvdW50cygpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIFJVTl9BTExfVEVTVFMoKSk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3NldF91cF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX2Vudmlyb25tZW50X3RlYXJfZG93bl9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMCwgZ19zaG91bGRfZmFpbF9jb3VudCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8ocmVwZWF0LCBnX3Nob3VsZF9wYXNzX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZGVhdGhfdGVzdF9jb3VudCk7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQgKiBrTnVtYmVyT2ZQYXJhbVRlc3RzLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCisvLyBUZXN0cyB1c2luZyAtLWd0ZXN0X3JlcGVhdCB3aGVuIC0tZ3Rlc3RfZmlsdGVyIHNwZWNpZmllcyBhIHNldCBvZgorLy8gZmFpbGVkIHRlc3RzLgordm9pZCBUZXN0UmVwZWF0V2l0aEZpbHRlckZvckZhaWxlZFRlc3RzKGludCByZXBlYXQpIHsKKyAgR1RFU1RfRkxBRyhyZXBlYXQpID0gcmVwZWF0OworICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiKlNob3VsZEZhaWwiOworCisgIFJlc2V0Q291bnRzKCk7CisgIEdURVNUX0NIRUNLX0lOVF9FUV8oMSwgUlVOX0FMTF9URVNUUygpKTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZW52aXJvbm1lbnRfc2V0X3VwX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfZW52aXJvbm1lbnRfdGVhcl9kb3duX2NvdW50KTsKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXyhyZXBlYXQsIGdfc2hvdWxkX2ZhaWxfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfc2hvdWxkX3Bhc3NfY291bnQpOworICBHVEVTVF9DSEVDS19JTlRfRVFfKDAsIGdfZGVhdGhfdGVzdF9jb3VudCk7CisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgR1RFU1RfQ0hFQ0tfSU5UX0VRXygwLCBnX3BhcmFtX3Rlc3RfY291bnQpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBNeUVudmlyb25tZW50KTsKKworICBUZXN0UmVwZWF0VW5zcGVjaWZpZWQoKTsKKyAgVGVzdFJlcGVhdCgwKTsKKyAgVGVzdFJlcGVhdCgxKTsKKyAgVGVzdFJlcGVhdCg1KTsKKworICBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKDIpOworICBUZXN0UmVwZWF0V2l0aEVtcHR5RmlsdGVyKDMpOworCisgIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yU3VjY2Vzc2Z1bFRlc3RzKDMpOworCisgIFRlc3RSZXBlYXRXaXRoRmlsdGVyRm9yRmFpbGVkVGVzdHMoNCk7CisKKyAgLy8gSXQgd291bGQgYmUgbmljZSB0byB2ZXJpZnkgdGhhdCB0aGUgdGVzdHMgaW5kZWVkIGxvb3AgZm9yZXZlcgorICAvLyB3aGVuIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBuZWdhdGl2ZSwgYnV0IHRoaXMgdGVzdCB3aWxsIGJlIHF1aXRlCisgIC8vIGNvbXBsaWNhdGVkIHRvIHdyaXRlLiAgU2luY2UgdGhpcyBmbGFnIGlzIGZvciBpbnRlcmFjdGl2ZQorICAvLyBkZWJ1Z2dpbmcgb25seSBhbmQgZG9lc24ndCBhZmZlY3QgdGhlIG5vcm1hbCB0ZXN0IHJlc3VsdCwgc3VjaCBhCisgIC8vIHRlc3Qgd291bGQgYmUgYW4gb3ZlcmtpbGwuCisKKyAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3QucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzBkMDMwMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdC5weQpAQCAtMCwwICsxLDMyNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJWZXJpZmllcyB0aGF0IHRlc3Qgc2h1ZmZsaW5nIHdvcmtzLiIiIgorCitfX2F1dGhvcl9fID0gJ3dhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pJworCitpbXBvcnQgb3MKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKyMgQ29tbWFuZCB0byBydW4gdGhlIGd0ZXN0X3NodWZmbGVfdGVzdF8gcHJvZ3JhbS4KK0NPTU1BTkQgPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgnZ3Rlc3Rfc2h1ZmZsZV90ZXN0XycpCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGVzdCBzaGFyZGluZy4KK1RPVEFMX1NIQVJEU19FTlZfVkFSID0gJ0dURVNUX1RPVEFMX1NIQVJEUycKK1NIQVJEX0lOREVYX0VOVl9WQVIgPSAnR1RFU1RfU0hBUkRfSU5ERVgnCisKK1RFU1RfRklMVEVSID0gJ0EqLkE6QSouQjpDKicKKworQUxMX1RFU1RTID0gW10KK0FDVElWRV9URVNUUyA9IFtdCitGSUxURVJFRF9URVNUUyA9IFtdCitTSEFSREVEX1RFU1RTID0gW10KKworU0hVRkZMRURfQUxMX1RFU1RTID0gW10KK1NIVUZGTEVEX0FDVElWRV9URVNUUyA9IFtdCitTSFVGRkxFRF9GSUxURVJFRF9URVNUUyA9IFtdCitTSFVGRkxFRF9TSEFSREVEX1RFU1RTID0gW10KKworCitkZWYgQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnKCk6CisgIHJldHVybiAnLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cycKKworCitkZWYgRmlsdGVyRmxhZyh0ZXN0X2ZpbHRlcik6CisgIHJldHVybiAnLS1ndGVzdF9maWx0ZXI9JXMnICUgKHRlc3RfZmlsdGVyLCkKKworCitkZWYgUmVwZWF0RmxhZyhuKToKKyAgcmV0dXJuICctLWd0ZXN0X3JlcGVhdD0lcycgJSAobiwpCisKKworZGVmIFNodWZmbGVGbGFnKCk6CisgIHJldHVybiAnLS1ndGVzdF9zaHVmZmxlJworCisKK2RlZiBSYW5kb21TZWVkRmxhZyhuKToKKyAgcmV0dXJuICctLWd0ZXN0X3JhbmRvbV9zZWVkPSVzJyAlIChuLCkKKworCitkZWYgUnVuQW5kUmV0dXJuT3V0cHV0KGV4dHJhX2VudiwgYXJncyk6CisgICIiIlJ1bnMgdGhlIHRlc3QgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgb3V0cHV0LiIiIgorCisgIGVudmlyb25fY29weSA9IG9zLmVudmlyb24uY29weSgpCisgIGVudmlyb25fY29weS51cGRhdGUoZXh0cmFfZW52KQorCisgIHJldHVybiBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoW0NPTU1BTkRdICsgYXJncywgZW52PWVudmlyb25fY29weSkub3V0cHV0CisKKworZGVmIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyhleHRyYV9lbnYsIGFyZ3MpOgorICAiIiJSdW5zIHRoZSB0ZXN0IHByb2dyYW0gYW5kIHJldHVybnMgYSBsaXN0IG9mIHRlc3QgbGlzdHMuCisKKyAgQXJnczoKKyAgICBleHRyYV9lbnY6IGEgbWFwIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRoZWlyIHZhbHVlcworICAgIGFyZ3M6IGNvbW1hbmQgbGluZSBmbGFncyB0byBwYXNzIHRvIGd0ZXN0X3NodWZmbGVfdGVzdF8KKworICBSZXR1cm5zOgorICAgIEEgbGlzdCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IGlzIHRoZSBsaXN0IG9mIHRlc3RzIHJ1biBpbiB0aGUgaS10aAorICAgIHRlc3QgaXRlcmF0aW9uLgorICAiIiIKKworICB0ZXN0X2l0ZXJhdGlvbnMgPSBbXQorICBmb3IgbGluZSBpbiBSdW5BbmRSZXR1cm5PdXRwdXQoZXh0cmFfZW52LCBhcmdzKS5zcGxpdCgnXG4nKToKKyAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy0tLS0nKToKKyAgICAgIHRlc3RzID0gW10KKyAgICAgIHRlc3RfaXRlcmF0aW9ucy5hcHBlbmQodGVzdHMpCisgICAgZWxpZiBsaW5lLnN0cmlwKCk6CisgICAgICB0ZXN0cy5hcHBlbmQobGluZS5zdHJpcCgpKSAgIyAnVGVzdENhc2VOYW1lLlRlc3ROYW1lJworCisgIHJldHVybiB0ZXN0X2l0ZXJhdGlvbnMKKworCitkZWYgR2V0VGVzdENhc2VzKHRlc3RzKToKKyAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgdGVzdCBjYXNlcyBpbiB0aGUgZ2l2ZW4gZnVsbCB0ZXN0IG5hbWVzLgorCisgIEFyZ3M6CisgICAgdGVzdHM6IGEgbGlzdCBvZiBmdWxsIHRlc3QgbmFtZXMKKworICBSZXR1cm5zOgorICAgIEEgbGlzdCBvZiB0ZXN0IGNhc2VzIGZyb20gJ3Rlc3RzJywgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuCisgICAgQ29uc2VjdXRpdmUgZHVwbGljYXRlcyBhcmUgcmVtb3ZlZC4KKyAgIiIiCisKKyAgdGVzdF9jYXNlcyA9IFtdCisgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgIHRlc3RfY2FzZSA9IHRlc3Quc3BsaXQoJy4nKVswXQorICAgIGlmIG5vdCB0ZXN0X2Nhc2UgaW4gdGVzdF9jYXNlczoKKyAgICAgIHRlc3RfY2FzZXMuYXBwZW5kKHRlc3RfY2FzZSkKKworICByZXR1cm4gdGVzdF9jYXNlcworCisKK2RlZiBDYWxjdWxhdGVUZXN0TGlzdHMoKToKKyAgIiIiQ2FsY3VsYXRlcyB0aGUgbGlzdCBvZiB0ZXN0cyBydW4gdW5kZXIgZGlmZmVyZW50IGZsYWdzLiIiIgorCisgIGlmIG5vdCBBTExfVEVTVFM6CisgICAgQUxMX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnKCldKVswXSkKKworICBpZiBub3QgQUNUSVZFX1RFU1RTOgorICAgIEFDVElWRV9URVNUUy5leHRlbmQoR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbXSlbMF0pCisKKyAgaWYgbm90IEZJTFRFUkVEX1RFU1RTOgorICAgIEZJTFRFUkVEX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHt9LCBbRmlsdGVyRmxhZyhURVNUX0ZJTFRFUildKVswXSkKKworICBpZiBub3QgU0hBUkRFRF9URVNUUzoKKyAgICBTSEFSREVEX1RFU1RTLmV4dGVuZCgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQVJEX0lOREVYX0VOVl9WQVI6ICcxJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX0FMTF9URVNUUzoKKyAgICBTSFVGRkxFRF9BTExfVEVTVFMuZXh0ZW5kKEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAge30sIFtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcoKSwgU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSldKVswXSkKKworICBpZiBub3QgU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgIFNIVUZGTEVEX0FDVElWRV9URVNUUy5leHRlbmQoR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTOgorICAgIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTLmV4dGVuZChHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSksIEZpbHRlckZsYWcoVEVTVF9GSUxURVIpXSlbMF0pCisKKyAgaWYgbm90IFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgU0hVRkZMRURfU0hBUkRFRF9URVNUUy5leHRlbmQoCisgICAgICAgIEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpXSlbMF0pCisKKworY2xhc3MgR1Rlc3RTaHVmZmxlVW5pdFRlc3QoZ3Rlc3RfdGVzdF91dGlscy5UZXN0Q2FzZSk6CisgICIiIlRlc3RzIHRlc3Qgc2h1ZmZsaW5nLiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBDYWxjdWxhdGVUZXN0TGlzdHMoKQorCisgIGRlZiB0ZXN0U2h1ZmZsZVByZXNlcnZlc051bWJlck9mVGVzdHMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQUxMX1RFU1RTKSwgbGVuKFNIVUZGTEVEX0FMTF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQUNUSVZFX1RFU1RTKSwgbGVuKFNIVUZGTEVEX0FDVElWRV9URVNUUykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oRklMVEVSRURfVEVTVFMpLCBsZW4oU0hVRkZMRURfRklMVEVSRURfVEVTVFMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFNIQVJERURfVEVTVFMpLCBsZW4oU0hVRkZMRURfU0hBUkRFRF9URVNUUykpCisKKyAgZGVmIHRlc3RTaHVmZmxlQ2hhbmdlc1Rlc3RPcmRlcihzZWxmKToKKyAgICBzZWxmLmFzc2VydF8oU0hVRkZMRURfQUxMX1RFU1RTICE9IEFMTF9URVNUUywgU0hVRkZMRURfQUxMX1RFU1RTKQorICAgIHNlbGYuYXNzZXJ0XyhTSFVGRkxFRF9BQ1RJVkVfVEVTVFMgIT0gQUNUSVZFX1RFU1RTLCBTSFVGRkxFRF9BQ1RJVkVfVEVTVFMpCisgICAgc2VsZi5hc3NlcnRfKFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTICE9IEZJTFRFUkVEX1RFU1RTLAorICAgICAgICAgICAgICAgICBTSFVGRkxFRF9GSUxURVJFRF9URVNUUykKKyAgICBzZWxmLmFzc2VydF8oU0hVRkZMRURfU0hBUkRFRF9URVNUUyAhPSBTSEFSREVEX1RFU1RTLAorICAgICAgICAgICAgICAgICBTSFVGRkxFRF9TSEFSREVEX1RFU1RTKQorCisgIGRlZiB0ZXN0U2h1ZmZsZUNoYW5nZXNUZXN0Q2FzZU9yZGVyKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0XyhHZXRUZXN0Q2FzZXMoU0hVRkZMRURfQUxMX1RFU1RTKSAhPSBHZXRUZXN0Q2FzZXMoQUxMX1RFU1RTKSwKKyAgICAgICAgICAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FMTF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfQUNUSVZFX1RFU1RTKSAhPSBHZXRUZXN0Q2FzZXMoQUNUSVZFX1RFU1RTKSwKKyAgICAgICAgR2V0VGVzdENhc2VzKFNIVUZGTEVEX0FDVElWRV9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfRklMVEVSRURfVEVTVFMpICE9IEdldFRlc3RDYXNlcyhGSUxURVJFRF9URVNUUyksCisgICAgICAgIEdldFRlc3RDYXNlcyhTSFVGRkxFRF9GSUxURVJFRF9URVNUUykpCisgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfU0hBUkRFRF9URVNUUykgIT0gR2V0VGVzdENhc2VzKFNIQVJERURfVEVTVFMpLAorICAgICAgICBHZXRUZXN0Q2FzZXMoU0hVRkZMRURfU0hBUkRFRF9URVNUUykpCisKKyAgZGVmIHRlc3RTaHVmZmxlRG9lc05vdFJlcGVhdFRlc3Qoc2VsZik6CisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUxMX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9BTExfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBTSFVGRkxFRF9BQ1RJVkVfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFNIVUZGTEVEX0ZJTFRFUkVEX1RFU1RTLmNvdW50KHRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAnJXMgYXBwZWFycyBtb3JlIHRoYW4gb25jZScgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFNIVUZGTEVEX1NIQVJERURfVEVTVFMuY291bnQodGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICclcyBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlJyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlRG9lc05vdENyZWF0ZU5ld1Rlc3Qoc2VsZik6CisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUxMX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gQUxMX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gQUNUSVZFX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBGSUxURVJFRF9URVNUUywgJyVzIGlzIGFuIGludmFsaWQgdGVzdCcgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBTSEFSREVEX1RFU1RTLCAnJXMgaXMgYW4gaW52YWxpZCB0ZXN0JyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlSW5jbHVkZXNBbGxUZXN0cyhzZWxmKToKKyAgICBmb3IgdGVzdCBpbiBBTExfVEVTVFM6CisgICAgICBzZWxmLmFzc2VydF8odGVzdCBpbiBTSFVGRkxFRF9BTExfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gQUNUSVZFX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hVRkZMRURfQUNUSVZFX1RFU1RTLCAnJXMgaXMgbWlzc2luZycgJSAodGVzdCwpKQorICAgIGZvciB0ZXN0IGluIEZJTFRFUkVEX1RFU1RTOgorICAgICAgc2VsZi5hc3NlcnRfKHRlc3QgaW4gU0hVRkZMRURfRklMVEVSRURfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisgICAgZm9yIHRlc3QgaW4gU0hBUkRFRF9URVNUUzoKKyAgICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0IGluIFNIVUZGTEVEX1NIQVJERURfVEVTVFMsICclcyBpcyBtaXNzaW5nJyAlICh0ZXN0LCkpCisKKyAgZGVmIHRlc3RTaHVmZmxlTGVhdmVzRGVhdGhUZXN0c0F0RnJvbnQoc2VsZik6CisgICAgbm9uX2RlYXRoX3Rlc3RfZm91bmQgPSBGYWxzZQorICAgIGZvciB0ZXN0IGluIFNIVUZGTEVEX0FDVElWRV9URVNUUzoKKyAgICAgIGlmICdEZWF0aFRlc3QuJyBpbiB0ZXN0OgorICAgICAgICBzZWxmLmFzc2VydF8obm90IG5vbl9kZWF0aF90ZXN0X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgJyVzIGFwcGVhcnMgYWZ0ZXIgYSBub24tZGVhdGggdGVzdCcgJSAodGVzdCwpKQorICAgICAgZWxzZToKKyAgICAgICAgbm9uX2RlYXRoX3Rlc3RfZm91bmQgPSBUcnVlCisKKyAgZGVmIF9WZXJpZnlUZXN0Q2FzZXNEb05vdEludGVybGVhdmUoc2VsZiwgdGVzdHMpOgorICAgIHRlc3RfY2FzZXMgPSBbXQorICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgW3Rlc3RfY2FzZSwgX10gPSB0ZXN0LnNwbGl0KCcuJykKKyAgICAgIGlmIHRlc3RfY2FzZXMgYW5kIHRlc3RfY2FzZXNbLTFdICE9IHRlc3RfY2FzZToKKyAgICAgICAgdGVzdF9jYXNlcy5hcHBlbmQodGVzdF9jYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHRlc3RfY2FzZXMuY291bnQodGVzdF9jYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdCBjYXNlICVzIGlzIG5vdCBncm91cGVkIHRvZ2V0aGVyIGluICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfY2FzZSwgdGVzdHMpKQorCisgIGRlZiB0ZXN0U2h1ZmZsZURvZXNOb3RJbnRlcmxlYXZlVGVzdENhc2VzKHNlbGYpOgorICAgIHNlbGYuX1ZlcmlmeVRlc3RDYXNlc0RvTm90SW50ZXJsZWF2ZShTSFVGRkxFRF9BTExfVEVTVFMpCisgICAgc2VsZi5fVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKFNIVUZGTEVEX0FDVElWRV9URVNUUykKKyAgICBzZWxmLl9WZXJpZnlUZXN0Q2FzZXNEb05vdEludGVybGVhdmUoU0hVRkZMRURfRklMVEVSRURfVEVTVFMpCisgICAgc2VsZi5fVmVyaWZ5VGVzdENhc2VzRG9Ob3RJbnRlcmxlYXZlKFNIVUZGTEVEX1NIQVJERURfVEVTVFMpCisKKyAgZGVmIHRlc3RTaHVmZmxlUmVzdG9yZXNPcmRlckFmdGVyRWFjaEl0ZXJhdGlvbihzZWxmKToKKyAgICAjIEdldCB0aGUgdGVzdCBsaXN0cyBpbiBhbGwgMyBpdGVyYXRpb25zLCB1c2luZyByYW5kb20gc2VlZCAxLCAyLAorICAgICMgYW5kIDMgcmVzcGVjdGl2ZWx5LiAgR29vZ2xlIFRlc3QgcGlja3MgYSBkaWZmZXJlbnQgc2VlZCBpbiBlYWNoCisgICAgIyBpdGVyYXRpb24sIGFuZCB0aGlzIHRlc3QgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgICMgcGlja2luZyBzdWNjZXNzaXZlIG51bWJlcnMuICBUaGlzIGRlcGVuZGVuY3kgaXMgbm90IGlkZWFsLCBidXQKKyAgICAjIG1ha2VzIHRoZSB0ZXN0IG11Y2ggZWFzaWVyIHRvIHdyaXRlLgorICAgIFt0ZXN0c19pbl9pdGVyYXRpb24xLCB0ZXN0c19pbl9pdGVyYXRpb24yLCB0ZXN0c19pbl9pdGVyYXRpb24zXSA9ICgKKyAgICAgICAgR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKSwgUmVwZWF0RmxhZygzKV0pKQorCisgICAgIyBNYWtlIHN1cmUgcnVubmluZyB0aGUgdGVzdHMgd2l0aCByYW5kb20gc2VlZCAxIGdldHMgdGhlIHNhbWUKKyAgICAjIG9yZGVyIGFzIGluIGl0ZXJhdGlvbiAxIGFib3ZlLgorICAgIFt0ZXN0c193aXRoX3NlZWQxXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucygKKyAgICAgICAge30sIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygxKV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0c19pbl9pdGVyYXRpb24xLCB0ZXN0c193aXRoX3NlZWQxKQorCisgICAgIyBNYWtlIHN1cmUgcnVubmluZyB0aGUgdGVzdHMgd2l0aCByYW5kb20gc2VlZCAyIGdldHMgdGhlIHNhbWUKKyAgICAjIG9yZGVyIGFzIGluIGl0ZXJhdGlvbiAyIGFib3ZlLiAgU3VjY2VzcyBtZWFucyB0aGF0IEdvb2dsZSBUZXN0CisgICAgIyBjb3JyZWN0bHkgcmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgYmVmb3JlIHJlLXNodWZmbGluZyBhdCB0aGUKKyAgICAjIGJlZ2lubmluZyBvZiBpdGVyYXRpb24gMi4KKyAgICBbdGVzdHNfd2l0aF9zZWVkMl0gPSBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgIHt9LCBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMildKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdHNfaW5faXRlcmF0aW9uMiwgdGVzdHNfd2l0aF9zZWVkMikKKworICAgICMgTWFrZSBzdXJlIHJ1bm5pbmcgdGhlIHRlc3RzIHdpdGggcmFuZG9tIHNlZWQgMyBnZXRzIHRoZSBzYW1lCisgICAgIyBvcmRlciBhcyBpbiBpdGVyYXRpb24gMyBhYm92ZS4gIFN1Y2Nlc3MgbWVhbnMgdGhhdCBHb29nbGUgVGVzdAorICAgICMgY29ycmVjdGx5IHJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIGJlZm9yZSByZS1zaHVmZmxpbmcgYXQgdGhlCisgICAgIyBiZWdpbm5pbmcgb2YgaXRlcmF0aW9uIDMuCisgICAgW3Rlc3RzX3dpdGhfc2VlZDNdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKAorICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDMpXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RzX2luX2l0ZXJhdGlvbjMsIHRlc3RzX3dpdGhfc2VlZDMpCisKKyAgZGVmIHRlc3RTaHVmZmxlR2VuZXJhdGVzTmV3T3JkZXJJbkVhY2hJdGVyYXRpb24oc2VsZik6CisgICAgW3Rlc3RzX2luX2l0ZXJhdGlvbjEsIHRlc3RzX2luX2l0ZXJhdGlvbjIsIHRlc3RzX2luX2l0ZXJhdGlvbjNdID0gKAorICAgICAgICBHZXRUZXN0c0ZvckFsbEl0ZXJhdGlvbnMoCisgICAgICAgICAgICB7fSwgW1NodWZmbGVGbGFnKCksIFJhbmRvbVNlZWRGbGFnKDEpLCBSZXBlYXRGbGFnKDMpXSkpCisKKyAgICBzZWxmLmFzc2VydF8odGVzdHNfaW5faXRlcmF0aW9uMSAhPSB0ZXN0c19pbl9pdGVyYXRpb24yLAorICAgICAgICAgICAgICAgICB0ZXN0c19pbl9pdGVyYXRpb24xKQorICAgIHNlbGYuYXNzZXJ0Xyh0ZXN0c19pbl9pdGVyYXRpb24xICE9IHRlc3RzX2luX2l0ZXJhdGlvbjMsCisgICAgICAgICAgICAgICAgIHRlc3RzX2luX2l0ZXJhdGlvbjEpCisgICAgc2VsZi5hc3NlcnRfKHRlc3RzX2luX2l0ZXJhdGlvbjIgIT0gdGVzdHNfaW5faXRlcmF0aW9uMywKKyAgICAgICAgICAgICAgICAgdGVzdHNfaW5faXRlcmF0aW9uMikKKworICBkZWYgdGVzdFNodWZmbGVTaGFyZGVkVGVzdHNQcmVzZXJ2ZXNQYXJ0aXRpb24oc2VsZik6CisgICAgIyBJZiB3ZSBydW4gTSB0ZXN0cyBvbiBOIHNoYXJkcywgdGhlIHNhbWUgTSB0ZXN0cyBzaG91bGQgYmUgcnVuIGluCisgICAgIyB0b3RhbCwgcmVnYXJkbGVzcyBvZiB0aGUgcmFuZG9tIHNlZWRzIHVzZWQgYnkgdGhlIHNoYXJkcy4KKyAgICBbdGVzdHMxXSA9IEdldFRlc3RzRm9yQWxsSXRlcmF0aW9ucyh7VE9UQUxfU0hBUkRTX0VOVl9WQVI6ICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkRfSU5ERVhfRU5WX1ZBUjogJzAnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2h1ZmZsZUZsYWcoKSwgUmFuZG9tU2VlZEZsYWcoMSldKQorICAgIFt0ZXN0czJdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygyMCldKQorICAgIFt0ZXN0czNdID0gR2V0VGVzdHNGb3JBbGxJdGVyYXRpb25zKHtUT1RBTF9TSEFSRFNfRU5WX1ZBUjogJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRF9JTkRFWF9FTlZfVkFSOiAnMid9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTaHVmZmxlRmxhZygpLCBSYW5kb21TZWVkRmxhZygyNSldKQorICAgIHNvcnRlZF9zaGFyZGVkX3Rlc3RzID0gdGVzdHMxICsgdGVzdHMyICsgdGVzdHMzCisgICAgc29ydGVkX3NoYXJkZWRfdGVzdHMuc29ydCgpCisgICAgc29ydGVkX2FjdGl2ZV90ZXN0cyA9IFtdCisgICAgc29ydGVkX2FjdGl2ZV90ZXN0cy5leHRlbmQoQUNUSVZFX1RFU1RTKQorICAgIHNvcnRlZF9hY3RpdmVfdGVzdHMuc29ydCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWRfYWN0aXZlX3Rlc3RzLCBzb3J0ZWRfc2hhcmRlZF90ZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3NodWZmbGVfdGVzdF8uY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjQ0MWIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF9zaHVmZmxlX3Rlc3RfLmNjCkBAIC0wLDAgKzEsMTAzIEBACisvLyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBWZXJpZmllcyB0aGF0IHRlc3Qgc2h1ZmZsaW5nIHdvcmtzLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwordXNpbmcgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6TWVzc2FnZTsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdDsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0SW5mbzsKK3VzaW5nIDo6dGVzdGluZzo6VW5pdFRlc3Q7Cit1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyOworCisvLyBUaGUgdGVzdCBtZXRob2RzIGFyZSBlbXB0eSwgYXMgdGhlIHNvbGUgcHVycG9zZSBvZiB0aGlzIHByb2dyYW0gaXMKKy8vIHRvIHByaW50IHRoZSB0ZXN0IG5hbWVzIGJlZm9yZS9hZnRlciBzaHVmZmxpbmcuCisKK2NsYXNzIEEgOiBwdWJsaWMgVGVzdCB7fTsKK1RFU1RfRihBLCBBKSB7fQorVEVTVF9GKEEsIEIpIHt9CisKK1RFU1QoQURlYXRoVGVzdCwgQSkge30KK1RFU1QoQURlYXRoVGVzdCwgQikge30KK1RFU1QoQURlYXRoVGVzdCwgQykge30KKworVEVTVChCLCBBKSB7fQorVEVTVChCLCBCKSB7fQorVEVTVChCLCBDKSB7fQorVEVTVChCLCBESVNBQkxFRF9EKSB7fQorVEVTVChCLCBESVNBQkxFRF9FKSB7fQorCitURVNUKEJEZWF0aFRlc3QsIEEpIHt9CitURVNUKEJEZWF0aFRlc3QsIEIpIHt9CisKK1RFU1QoQywgQSkge30KK1RFU1QoQywgQikge30KK1RFU1QoQywgQykge30KK1RFU1QoQywgRElTQUJMRURfRCkge30KKworVEVTVChDRGVhdGhUZXN0LCBBKSB7fQorCitURVNUKERJU0FCTEVEX0QsIEEpIHt9CitURVNUKERJU0FCTEVEX0QsIERJU0FCTEVEX0IpIHt9CisKKy8vIFRoaXMgcHJpbnRlciBwcmludHMgdGhlIGZ1bGwgdGVzdCBuYW1lcyBvbmx5LCBzdGFydGluZyBlYWNoIHRlc3QKKy8vIGl0ZXJhdGlvbiB3aXRoIGEgIi0tLS0iIG1hcmtlci4KK2NsYXNzIFRlc3ROYW1lUHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGl0ZXJhdGlvbiAqLykgeworICAgIHByaW50ZigiLS0tLVxuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIHByaW50ZigiJXMuJXNcbiIsIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgLy8gUmVwbGFjZXMgdGhlIGRlZmF1bHQgcHJpbnRlciB3aXRoIFRlc3ROYW1lUHJpbnRlciwgd2hpY2ggcHJpbnRzCisgIC8vIHRoZSB0ZXN0IG5hbWUgb25seS4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCk7CisgIGRlbGV0ZSBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpKTsKKyAgbGlzdGVuZXJzLkFwcGVuZChuZXcgVGVzdE5hbWVQcmludGVyKTsKKworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Rfc29sZV9oZWFkZXJfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkMDkxYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3NvbGVfaGVhZGVyX3Rlc3QuY2MKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBHb29nbGUgVGVzdCBieSBpbmNsdWRpbmcKKy8vIHRoZSBndGVzdC5oIGhlYWRlciBmaWxlIGFsb25lLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKwordm9pZCBTdWJyb3V0aW5lKCkgeworICBFWFBFQ1RfRVEoNDIsIDQyKTsKK30KKworVEVTVChOb0ZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdE5vRmF0YWxGYWlsdXJlKSB7CisgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKDspOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTVUNDRUVEKCkpOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShTdWJyb3V0aW5lKCkpOworICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRSh7IFNVQ0NFRUQoKTsgfSk7Cit9CisKK1RFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBBc3NlcnROb0ZhdGFsRmFpbHVyZSkgeworICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSg7KTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3Vicm91dGluZSgpKTsKKyAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoeyBTVUNDRUVEKCk7IH0pOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3N0cmVzc190ZXN0LmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3Rfc3RyZXNzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkYWE0MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3N0cmVzc190ZXN0LmNjCkBAIC0wLDAgKzEsMjU2IEBACisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBUZXN0cyB0aGF0IFNDT1BFRF9UUkFDRSgpIGFuZCB2YXJpb3VzIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgY2FuIGJlCisvLyB1c2VkIGluIGEgbGFyZ2UgbnVtYmVyIG9mIHRocmVhZHMgY29uY3VycmVudGx5LgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gV2UgbXVzdCBkZWZpbmUgdGhpcyBtYWNybyBpbiBvcmRlciB0byAjaW5jbHVkZQorLy8gZ3Rlc3QtaW50ZXJuYWwtaW5sLmguICBUaGlzIGlzIGhvdyBHb29nbGUgVGVzdCBwcmV2ZW50cyBhIHVzZXIgZnJvbQorLy8gYWNjaWRlbnRhbGx5IGRlcGVuZGluZyBvbiBpdHMgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgorI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXworCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgeworCit1c2luZyBpbnRlcm5hbDo6Tm90aWZpY2F0aW9uOwordXNpbmcgaW50ZXJuYWw6OlRlc3RQcm9wZXJ0eUtleUlzOwordXNpbmcgaW50ZXJuYWw6OlRocmVhZFdpdGhQYXJhbTsKK3VzaW5nIGludGVybmFsOjpzY29wZWRfcHRyOworCisvLyBJbiBvcmRlciB0byBydW4gdGVzdHMgaW4gdGhpcyBmaWxlLCBmb3IgcGxhdGZvcm1zIHdoZXJlIEdvb2dsZSBUZXN0IGlzCisvLyB0aHJlYWQgc2FmZSwgaW1wbGVtZW50IFRocmVhZFdpdGhQYXJhbS4gU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBpdHMgQVBJCisvLyBpbiBndGVzdC1wb3J0LmgsIHdoZXJlIGl0IGlzIGRlZmluZWQgZm9yIGFscmVhZHkgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKworLy8gSG93IG1hbnkgdGhyZWFkcyB0byBjcmVhdGU/Citjb25zdCBpbnQga1RocmVhZENvdW50ID0gNTA7CisKK3N0ZDo6c3RyaW5nIElkVG9LZXkoaW50IGlkLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgTWVzc2FnZSBrZXk7CisgIGtleSA8PCAia2V5XyIgPDwgaWQgPDwgIl8iIDw8IHN1ZmZpeDsKKyAgcmV0dXJuIGtleS5HZXRTdHJpbmcoKTsKK30KKworc3RkOjpzdHJpbmcgSWRUb1N0cmluZyhpbnQgaWQpIHsKKyAgTWVzc2FnZSBpZF9tZXNzYWdlOworICBpZF9tZXNzYWdlIDw8IGlkOworICByZXR1cm4gaWRfbWVzc2FnZS5HZXRTdHJpbmcoKTsKK30KKwordm9pZCBFeHBlY3RLZXlBbmRWYWx1ZVdlcmVSZWNvcmRlZEZvcklkKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4mIHByb3BlcnRpZXMsCisgICAgaW50IGlkLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgVGVzdFByb3BlcnR5S2V5SXMgbWF0Y2hlc19rZXkoSWRUb0tleShpZCwgc3VmZml4KS5jX3N0cigpKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6Y29uc3RfaXRlcmF0b3IgcHJvcGVydHkgPQorICAgICAgc3RkOjpmaW5kX2lmKHByb3BlcnRpZXMuYmVnaW4oKSwgcHJvcGVydGllcy5lbmQoKSwgbWF0Y2hlc19rZXkpOworICBBU1NFUlRfVFJVRShwcm9wZXJ0eSAhPSBwcm9wZXJ0aWVzLmVuZCgpKQorICAgICAgPDwgImV4cGVjdGluZyAiIDw8IHN1ZmZpeCA8PCAiIHZhbHVlIGZvciBpZCAiIDw8IGlkOworICBFWFBFQ1RfU1RSRVEoSWRUb1N0cmluZyhpZCkuY19zdHIoKSwgcHJvcGVydHktPnZhbHVlKCkpOworfQorCisvLyBDYWxscyBhIGxhcmdlIG51bWJlciBvZiBHb29nbGUgVGVzdCBhc3NlcnRpb25zLCB3aGVyZSBleGFjdGx5IG9uZSBvZiB0aGVtCisvLyB3aWxsIGZhaWwuCit2b2lkIE1hbnlBc3NlcnRzKGludCBpZCkgeworICBHVEVTVF9MT0dfKElORk8pIDw8ICJUaHJlYWQgIyIgPDwgaWQgPDwgIiBydW5uaW5nLi4uIjsKKworICBTQ09QRURfVFJBQ0UoTWVzc2FnZSgpIDw8ICJUaHJlYWQgIyIgPDwgaWQpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga1RocmVhZENvdW50OyBpKyspIHsKKyAgICBTQ09QRURfVFJBQ0UoTWVzc2FnZSgpIDw8ICJJdGVyYXRpb24gIyIgPDwgaSk7CisKKyAgICAvLyBBIGJ1bmNoIG9mIGFzc2VydGlvbnMgdGhhdCBzaG91bGQgc3VjY2VlZC4KKyAgICBFWFBFQ1RfVFJVRSh0cnVlKTsKKyAgICBBU1NFUlRfRkFMU0UoZmFsc2UpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7CisgICAgRVhQRUNUX1NUUkVRKCJhIiwgImEiKTsKKyAgICBBU1NFUlRfTEUoNSwgNik7CisgICAgRVhQRUNUX0VRKGksIGkpIDw8ICJUaGlzIHNob3VsZG4ndCBmYWlsLiI7CisKKyAgICAvLyBSZWNvcmRQcm9wZXJ0eSgpIHNob3VsZCBpbnRlcmFjdCBzYWZlbHkgd2l0aCBvdGhlciB0aHJlYWRzIGFzIHdlbGwuCisgICAgLy8gVGhlIHNoYXJlZF9rZXkgZm9yY2VzIHByb3BlcnR5IHVwZGF0ZXMuCisgICAgVGVzdDo6UmVjb3JkUHJvcGVydHkoSWRUb0tleShpZCwgInN0cmluZyIpLmNfc3RyKCksIElkVG9TdHJpbmcoaWQpLmNfc3RyKCkpOworICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KElkVG9LZXkoaWQsICJpbnQiKS5jX3N0cigpLCBpZCk7CisgICAgVGVzdDo6UmVjb3JkUHJvcGVydHkoInNoYXJlZF9rZXkiLCBJZFRvU3RyaW5nKGlkKS5jX3N0cigpKTsKKworICAgIC8vIFRoaXMgYXNzZXJ0aW9uIHNob3VsZCBmYWlsIGtUaHJlYWRDb3VudCB0aW1lcyBwZXIgdGhyZWFkLiAgSXQKKyAgICAvLyBpcyBmb3IgdGVzdGluZyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiBoYW5kbGUgZmFpbGVkIGFzc2VydGlvbnMgaW4gYQorICAgIC8vIG11bHRpLXRocmVhZGVkIGNvbnRleHQuCisgICAgRVhQRUNUX0xUKGksIDApIDw8ICJUaGlzIHNob3VsZCBhbHdheXMgZmFpbC4iOworICB9Cit9CisKK3ZvaWQgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KGludCBleHBlY3RlZF9mYWlsdXJlcykgeworICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBUZXN0UmVzdWx0KiBjb25zdCByZXN1bHQgPSBpbmZvLT5yZXN1bHQoKTsKKyAgR1RFU1RfQ0hFQ0tfKGV4cGVjdGVkX2ZhaWx1cmVzID09IHJlc3VsdC0+dG90YWxfcGFydF9jb3VudCgpKQorICAgICAgPDwgIkxvZ2dlZCAiIDw8IHJlc3VsdC0+dG90YWxfcGFydF9jb3VudCgpIDw8ICIgZmFpbHVyZXMgIgorICAgICAgPDwgIiB2cy4gIiA8PCBleHBlY3RlZF9mYWlsdXJlcyA8PCAiIGV4cGVjdGVkIjsKK30KKworLy8gVGVzdHMgdXNpbmcgU0NPUEVEX1RSQUNFKCkgYW5kIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4gbWFueSB0aHJlYWRzCisvLyBjb25jdXJyZW50bHkuCitURVNUKFN0cmVzc1Rlc3QsIENhblVzZVNjb3BlZFRyYWNlQW5kQXNzZXJ0aW9uc0luTWFueVRocmVhZHMpIHsKKyAgeworICAgIHNjb3BlZF9wdHI8VGhyZWFkV2l0aFBhcmFtPGludD4gPiB0aHJlYWRzW2tUaHJlYWRDb3VudF07CisgICAgTm90aWZpY2F0aW9uIHRocmVhZHNfY2FuX3N0YXJ0OworICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGtUaHJlYWRDb3VudDsgaSsrKQorICAgICAgdGhyZWFkc1tpXS5yZXNldChuZXcgVGhyZWFkV2l0aFBhcmFtPGludD4oJk1hbnlBc3NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRzX2Nhbl9zdGFydCkpOworCisgICAgdGhyZWFkc19jYW5fc3RhcnQuTm90aWZ5KCk7CisKKyAgICAvLyBCbG9ja3MgdW50aWwgYWxsIHRoZSB0aHJlYWRzIGFyZSBkb25lLgorICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGtUaHJlYWRDb3VudDsgaSsrKQorICAgICAgdGhyZWFkc1tpXS0+Sm9pbigpOworICB9CisKKyAgLy8gRW5zdXJlcyB0aGF0IGtUaHJlYWRDb3VudCprVGhyZWFkQ291bnQgZmFpbHVyZXMgaGF2ZSBiZWVuIHJlcG9ydGVkLgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBUZXN0UmVzdWx0KiBjb25zdCByZXN1bHQgPSBpbmZvLT5yZXN1bHQoKTsKKworICBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+IHByb3BlcnRpZXM7CisgIC8vIFdlIGhhdmUgbm8gYWNjZXNzIHRvIHRoZSBUZXN0UmVzdWx0J3MgbGlzdCBvZiBwcm9wZXJ0aWVzIGJ1dCB3ZSBjYW4KKyAgLy8gY29weSB0aGVtIG9uZSBieSBvbmUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT50ZXN0X3Byb3BlcnR5X2NvdW50KCk7ICsraSkKKyAgICBwcm9wZXJ0aWVzLnB1c2hfYmFjayhyZXN1bHQtPkdldFRlc3RQcm9wZXJ0eShpKSk7CisKKyAgRVhQRUNUX0VRKGtUaHJlYWRDb3VudCAqIDIgKyAxLCByZXN1bHQtPnRlc3RfcHJvcGVydHlfY291bnQoKSkKKyAgICAgIDw8ICJTdHJpbmcgYW5kIGludCB2YWx1ZXMgcmVjb3JkZWQgb24gZWFjaCB0aHJlYWQsICIKKyAgICAgIDw8ICJhcyB3ZWxsIGFzIG9uZSBzaGFyZWRfa2V5IjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkQ291bnQ7ICsraSkgeworICAgIEV4cGVjdEtleUFuZFZhbHVlV2VyZVJlY29yZGVkRm9ySWQocHJvcGVydGllcywgaSwgInN0cmluZyIpOworICAgIEV4cGVjdEtleUFuZFZhbHVlV2VyZVJlY29yZGVkRm9ySWQocHJvcGVydGllcywgaSwgImludCIpOworICB9CisgIENoZWNrVGVzdEZhaWx1cmVDb3VudChrVGhyZWFkQ291bnQqa1RocmVhZENvdW50KTsKK30KKwordm9pZCBGYWlsaW5nVGhyZWFkKGJvb2wgaXNfZmF0YWwpIHsKKyAgaWYgKGlzX2ZhdGFsKQorICAgIEZBSUwoKSA8PCAiRmF0YWwgZmFpbHVyZSBpbiBzb21lIG90aGVyIHRocmVhZC4gIgorICAgICAgICAgICA8PCAiKFRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4pIjsKKyAgZWxzZQorICAgIEFERF9GQUlMVVJFKCkgPDwgIk5vbi1mYXRhbCBmYWlsdXJlIGluIHNvbWUgb3RoZXIgdGhyZWFkLiAiCisgICAgICAgICAgICAgICAgICA8PCAiKFRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4pIjsKK30KKwordm9pZCBHZW5lcmF0ZUZhdGFsRmFpbHVyZUluQW5vdGhlclRocmVhZChib29sIGlzX2ZhdGFsKSB7CisgIFRocmVhZFdpdGhQYXJhbTxib29sPiB0aHJlYWQoJkZhaWxpbmdUaHJlYWQsIGlzX2ZhdGFsLCBOVUxMKTsKKyAgdGhyZWFkLkpvaW4oKTsKK30KKworVEVTVChOb0ZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdE5vRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMpIHsKKyAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQodHJ1ZSkpOworICAvLyBXZSBzaG91bGQgb25seSBoYXZlIG9uZSBmYWlsdXJlICh0aGUgb25lIGZyb20KKyAgLy8gR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoKSksIHNpbmNlIHRoZSBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRQorICAvLyBzaG91bGQgc3VjY2VlZC4KKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDEpOworfQorCit2b2lkIEFzc2VydE5vRmF0YWxGYWlsdXJlSWdub3Jlc0ZhaWx1cmVzSW5PdGhlclRocmVhZHMoKSB7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpKTsKK30KK1RFU1QoTm9GYXRhbEZhaWx1cmVUZXN0LCBBc3NlcnROb0ZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKSB7CisgIC8vIFVzaW5nIGEgc3Vicm91dGluZSwgdG8gbWFrZSBzdXJlLCB0aGF0IHRoZSB0ZXN0IGNvbnRpbnVlcy4KKyAgQXNzZXJ0Tm9GYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcygpOworICAvLyBXZSBzaG91bGQgb25seSBoYXZlIG9uZSBmYWlsdXJlICh0aGUgb25lIGZyb20KKyAgLy8gR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoKSksIHNpbmNlIHRoZSBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRQorICAvLyBzaG91bGQgc3VjY2VlZC4KKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDEpOworfQorCitURVNUKEZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZUlnbm9yZXNGYWlsdXJlc0luT3RoZXJUaHJlYWRzKSB7CisgIC8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBmYWlsLCBzaW5jZSB0aGUgY3VycmVudCB0aHJlYWQgZG9lc24ndCBnZW5lcmF0ZSBhCisgIC8vIGZhdGFsIGZhaWx1cmUsIG9ubHkgYW5vdGhlciBvbmUgZG9lcy4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQodHJ1ZSksICJleHBlY3RlZCIpOworICBDaGVja1Rlc3RGYWlsdXJlQ291bnQoMik7Cit9CisKK1RFU1QoRmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzVGVzdCwgRXhwZWN0RmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7CisgIC8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBzdWNjZWVkLCBiZWNhdXNlIGZhaWx1cmVzIGluIGFsbCB0aHJlYWRzIGFyZQorICAvLyBjb25zaWRlcmVkLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUygKKyAgICAgIEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKHRydWUpLCAiZXhwZWN0ZWQiKTsKKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDApOworICAvLyBXZSBuZWVkIHRvIGFkZCBhIGZhaWx1cmUsIGJlY2F1c2UgbWFpbigpIGNoZWNrcyB0aGF0IHRoZXJlIGFyZSBmYWlsdXJlcy4KKyAgLy8gQnV0IHdoZW4gb25seSB0aGlzIHRlc3QgaXMgcnVuLCB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkgZmFpbHVyZXMuCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgaXMgYW4gZXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKK30KKworVEVTVChOb25GYXRhbEZhaWx1cmVUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVJZ25vcmVzRmFpbHVyZXNJbk90aGVyVGhyZWFkcykgeworICAvLyBUaGlzIHN0YXRlbWVudCBzaG91bGQgZmFpbCwgc2luY2UgdGhlIGN1cnJlbnQgdGhyZWFkIGRvZXNuJ3QgZ2VuZXJhdGUgYQorICAvLyBmYXRhbCBmYWlsdXJlLCBvbmx5IGFub3RoZXIgb25lIGRvZXMuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEdlbmVyYXRlRmF0YWxGYWlsdXJlSW5Bbm90aGVyVGhyZWFkKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIik7CisgIENoZWNrVGVzdEZhaWx1cmVDb3VudCgyKTsKK30KKworVEVTVChOb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHNUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIHN1Y2NlZWQsIGJlY2F1c2UgZmFpbHVyZXMgaW4gYWxsIHRocmVhZHMgYXJlCisgIC8vIGNvbnNpZGVyZWQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKAorICAgICAgR2VuZXJhdGVGYXRhbEZhaWx1cmVJbkFub3RoZXJUaHJlYWQoZmFsc2UpLCAiZXhwZWN0ZWQiKTsKKyAgQ2hlY2tUZXN0RmFpbHVyZUNvdW50KDApOworICAvLyBXZSBuZWVkIHRvIGFkZCBhIGZhaWx1cmUsIGJlY2F1c2UgbWFpbigpIGNoZWNrcyB0aGF0IHRoZXJlIGFyZSBmYWlsdXJlcywKKyAgLy8gQnV0IHdoZW4gb25seSB0aGlzIHRlc3QgaXMgcnVuLCB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkgZmFpbHVyZXMuCisgIEFERF9GQUlMVVJFKCkgPDwgIlRoaXMgaXMgYW4gZXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworCisgIGNvbnN0IGludCByZXN1bHQgPSBSVU5fQUxMX1RFU1RTKCk7ICAvLyBFeHBlY3RlZCB0byBmYWlsLgorICBHVEVTVF9DSEVDS18ocmVzdWx0ID09IDEpIDw8ICJSVU5fQUxMX1RFU1RTKCkgZGlkIG5vdCBmYWlsIGFzIGV4cGVjdGVkIjsKKworICBwcmludGYoIlxuUEFTU1xuIik7CisgIHJldHVybiAwOworfQorCisjZWxzZQorVEVTVChTdHJlc3NUZXN0LAorICAgICBESVNBQkxFRF9UaHJlYWRTYWZldHlUZXN0c0FyZVNraXBwZWRXaGVuR29vZ2xlVGVzdElzTm90VGhyZWFkU2FmZSkgeworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQorI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF90ZXN0X3V0aWxzLnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZTNjYmNhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfdGVzdF91dGlscy5weQpAQCAtMCwwICsxLDMyMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IHV0aWxpdGllcyBmb3IgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yay4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IGF0ZXhpdAoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorX3Rlc3RfbW9kdWxlID0gdW5pdHRlc3QKKworIyBTdXBwcmVzc2VzIHRoZSAnSW1wb3J0IG5vdCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlJyBsaW50IGNvbXBsYWludC4KKyMgcHlsaW50OiBkaXNhYmxlLW1zZz1DNjIwNAordHJ5OgorICBpbXBvcnQgc3VicHJvY2VzcworICBfU1VCUFJPQ0VTU19NT0RVTEVfQVZBSUxBQkxFID0gVHJ1ZQorZXhjZXB0OgorICBpbXBvcnQgcG9wZW4yCisgIF9TVUJQUk9DRVNTX01PRFVMRV9BVkFJTEFCTEUgPSBGYWxzZQorIyBweWxpbnQ6IGVuYWJsZS1tc2c9QzYyMDQKKworR1RFU1RfT1VUUFVUX1ZBUl9OQU1FID0gJ0dURVNUX09VVFBVVCcKKworSVNfV0lORE9XUyA9IG9zLm5hbWUgPT0gJ250JworSVNfQ1lHV0lOID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCAnQ1lHV0lOJyBpbiBvcy51bmFtZSgpWzBdCisKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBzcGVjaWZ5aW5nIHRoZSBwYXRoIHRvIHRoZSBwcmVtYXR1cmUtZXhpdCBmaWxlLgorUFJFTUFUVVJFX0VYSVRfRklMRV9FTlZfVkFSID0gJ1RFU1RfUFJFTUFUVVJFX0VYSVRfRklMRScKKworZW52aXJvbiA9IG9zLmVudmlyb24uY29weSgpCisKKworZGVmIFNldEVudlZhcihlbnZfdmFyLCB2YWx1ZSk6CisgICIiIlNldHMvdW5zZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgZ2l2ZW4gdmFsdWUuIiIiCisKKyAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgZW52aXJvbltlbnZfdmFyXSA9IHZhbHVlCisgIGVsaWYgZW52X3ZhciBpbiBlbnZpcm9uOgorICAgIGRlbCBlbnZpcm9uW2Vudl92YXJdCisKKworIyBIZXJlIHdlIGV4cG9zZSBhIGNsYXNzIGZyb20gYSBwYXJ0aWN1bGFyIG1vZHVsZSwgZGVwZW5kaW5nIG9uIHRoZQorIyBlbnZpcm9ubWVudC4gVGhlIGNvbW1lbnQgc3VwcHJlc3NlcyB0aGUgJ0ludmFsaWQgdmFyaWFibGUgbmFtZScgbGludAorIyBjb21wbGFpbnQuCitUZXN0Q2FzZSA9IF90ZXN0X21vZHVsZS5UZXN0Q2FzZSAgIyBweWxpbnQ6IGRpc2FibGUtbXNnPUM2NDA5CisKKyMgSW5pdGlhbGx5IG1hcHMgYSBmbGFnIHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBBZnRlcgorIyBfUGFyc2VBbmRTdHJpcEdUZXN0RmxhZ3MoKSBpcyBjYWxsZWQsIG1hcHMgYSBmbGFnIHRvIGl0cyBhY3R1YWwgdmFsdWUuCitfZmxhZ19tYXAgPSB7J3NvdXJjZV9kaXInOiBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLAorICAgICAgICAgICAgICdidWlsZF9kaXInOiBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pfQorX2d0ZXN0X2ZsYWdzX2FyZV9wYXJzZWQgPSBGYWxzZQorCisKK2RlZiBfUGFyc2VBbmRTdHJpcEdUZXN0RmxhZ3MoYXJndik6CisgICIiIlBhcnNlcyBhbmQgc3RyaXBzIEdvb2dsZSBUZXN0IGZsYWdzIGZyb20gYXJndi4gIFRoaXMgaXMgaWRlbXBvdGVudC4iIiIKKworICAjIFN1cHByZXNzZXMgdGhlIGxpbnQgY29tcGxhaW50IGFib3V0IGEgZ2xvYmFsIHZhcmlhYmxlIHNpbmNlIHdlIG5lZWQgaXQKKyAgIyBoZXJlIHRvIG1haW50YWluIG1vZHVsZS13aWRlIHN0YXRlLgorICBnbG9iYWwgX2d0ZXN0X2ZsYWdzX2FyZV9wYXJzZWQgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1XMDYwMworICBpZiBfZ3Rlc3RfZmxhZ3NfYXJlX3BhcnNlZDoKKyAgICByZXR1cm4KKworICBfZ3Rlc3RfZmxhZ3NfYXJlX3BhcnNlZCA9IFRydWUKKyAgZm9yIGZsYWcgaW4gX2ZsYWdfbWFwOgorICAgICMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICBpZiBmbGFnLnVwcGVyKCkgaW4gb3MuZW52aXJvbjoKKyAgICAgIF9mbGFnX21hcFtmbGFnXSA9IG9zLmVudmlyb25bZmxhZy51cHBlcigpXQorCisgICAgIyBUaGUgY29tbWFuZCBsaW5lIGZsYWcgb3ZlcnJpZGVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICBpID0gMSAgIyBTa2lwcyB0aGUgcHJvZ3JhbSBuYW1lLgorICAgIHdoaWxlIGkgPCBsZW4oYXJndik6CisgICAgICBwcmVmaXggPSAnLS0nICsgZmxhZyArICc9JworICAgICAgaWYgYXJndltpXS5zdGFydHN3aXRoKHByZWZpeCk6CisgICAgICAgIF9mbGFnX21hcFtmbGFnXSA9IGFyZ3ZbaV1bbGVuKHByZWZpeCk6XQorICAgICAgICBkZWwgYXJndltpXQorICAgICAgICBicmVhaworICAgICAgZWxzZToKKyAgICAgICAgIyBXZSBkb24ndCBpbmNyZW1lbnQgaSBpbiBjYXNlIHdlIGp1c3QgZm91bmQgYSAtLWd0ZXN0XyogZmxhZworICAgICAgICAjIGFuZCByZW1vdmVkIGl0IGZyb20gYXJndi4KKyAgICAgICAgaSArPSAxCisKKworZGVmIEdldEZsYWcoZmxhZyk6CisgICIiIlJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmbGFnLiIiIgorCisgICMgSW4gY2FzZSBHZXRGbGFnKCkgaXMgY2FsbGVkIGJlZm9yZSBNYWluKCksIHdlIGFsd2F5cyBjYWxsCisgICMgX1BhcnNlQW5kU3RyaXBHVGVzdEZsYWdzKCkgaGVyZSB0byBtYWtlIHN1cmUgdGhlIC0tZ3Rlc3RfKiBmbGFncworICAjIGFyZSBwYXJzZWQuCisgIF9QYXJzZUFuZFN0cmlwR1Rlc3RGbGFncyhzeXMuYXJndikKKworICByZXR1cm4gX2ZsYWdfbWFwW2ZsYWddCisKKworZGVmIEdldFNvdXJjZURpcigpOgorICAiIiJSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIC5weSBmaWxlcyBhcmUuIiIiCisKKyAgcmV0dXJuIG9zLnBhdGguYWJzcGF0aChHZXRGbGFnKCdzb3VyY2VfZGlyJykpCisKKworZGVmIEdldEJ1aWxkRGlyKCk6CisgICIiIlJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgdGVzdCBiaW5hcmllcyBhcmUuIiIiCisKKyAgcmV0dXJuIG9zLnBhdGguYWJzcGF0aChHZXRGbGFnKCdidWlsZF9kaXInKSkKKworCitfdGVtcF9kaXIgPSBOb25lCisKK2RlZiBfUmVtb3ZlVGVtcERpcigpOgorICBpZiBfdGVtcF9kaXI6CisgICAgc2h1dGlsLnJtdHJlZShfdGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworYXRleGl0LnJlZ2lzdGVyKF9SZW1vdmVUZW1wRGlyKQorCisKK2RlZiBHZXRUZW1wRGlyKCk6CisgICIiIlJldHVybnMgYSBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSBmaWxlcy4iIiIKKworICBnbG9iYWwgX3RlbXBfZGlyCisgIGlmIG5vdCBfdGVtcF9kaXI6CisgICAgX3RlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgIHJldHVybiBfdGVtcF9kaXIKKworCitkZWYgR2V0VGVzdEV4ZWN1dGFibGVQYXRoKGV4ZWN1dGFibGVfbmFtZSwgYnVpbGRfZGlyPU5vbmUpOgorICAiIiJSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0ZXN0IGJpbmFyeSBnaXZlbiBpdHMgbmFtZS4KKworICBUaGUgZnVuY3Rpb24gd2lsbCBwcmludCBhIG1lc3NhZ2UgYW5kIGFib3J0IHRoZSBwcm9ncmFtIGlmIHRoZSByZXN1bHRpbmcgZmlsZQorICBkb2Vzbid0IGV4aXN0LgorCisgIEFyZ3M6CisgICAgZXhlY3V0YWJsZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGJpbmFyeSB0aGF0IHRoZSB0ZXN0IHNjcmlwdCBydW5zLgorICAgIGJ1aWxkX2RpcjogICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIGxvb2sgZm9yIGV4ZWN1dGFibGVzLCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IG9mIEdldEJ1aWxkRGlyKCkuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGVzdCBiaW5hcnkuCisgICIiIgorCisgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGJ1aWxkX2RpciBvciBHZXRCdWlsZERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlX25hbWUpKQorICBpZiAoSVNfV0lORE9XUyBvciBJU19DWUdXSU4pIGFuZCBub3QgcGF0aC5lbmRzd2l0aCgnLmV4ZScpOgorICAgIHBhdGggKz0gJy5leGUnCisKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgIG1lc3NhZ2UgPSAoCisgICAgICAgICdVbmFibGUgdG8gZmluZCB0aGUgdGVzdCBiaW5hcnkgIiVzIi4gUGxlYXNlIG1ha2Ugc3VyZSB0byBwcm92aWRlXG4nCisgICAgICAgICdhIHBhdGggdG8gdGhlIGJpbmFyeSB2aWEgdGhlIC0tYnVpbGRfZGlyIGZsYWcgb3IgdGhlIEJVSUxEX0RJUlxuJworICAgICAgICAnZW52aXJvbm1lbnQgdmFyaWFibGUuJyAlIHBhdGgpCisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbWVzc2FnZQorICAgIHN5cy5leGl0KDEpCisKKyAgcmV0dXJuIHBhdGgKKworCitkZWYgR2V0RXhpdFN0YXR1cyhleGl0X2NvZGUpOgorICAiIiJSZXR1cm5zIHRoZSBhcmd1bWVudCB0byBleGl0KCksIG9yIC0xIGlmIGV4aXQoKSB3YXNuJ3QgY2FsbGVkLgorCisgIEFyZ3M6CisgICAgZXhpdF9jb2RlOiB0aGUgcmVzdWx0IHZhbHVlIG9mIG9zLnN5c3RlbShjb21tYW5kKS4KKyAgIiIiCisKKyAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICMgT24gV2luZG93cywgb3MuV0VYSVRTVEFUVVMoKSBkb2Vzbid0IHdvcmsgYW5kIG9zLnN5c3RlbSgpIHJldHVybnMKKyAgICAjIHRoZSBhcmd1bWVudCB0byBleGl0KCkgZGlyZWN0bHkuCisgICAgcmV0dXJuIGV4aXRfY29kZQorICBlbHNlOgorICAgICMgT24gVW5peCwgb3MuV0VYSVRTVEFUVVMoKSBtdXN0IGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgZXhpdCBzdGF0dXMKKyAgICAjIGZyb20gdGhlIHJlc3VsdCBvZiBvcy5zeXN0ZW0oKS4KKyAgICBpZiBvcy5XSUZFWElURUQoZXhpdF9jb2RlKToKKyAgICAgIHJldHVybiBvcy5XRVhJVFNUQVRVUyhleGl0X2NvZGUpCisgICAgZWxzZToKKyAgICAgIHJldHVybiAtMQorCisKK2NsYXNzIFN1YnByb2Nlc3M6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCB3b3JraW5nX2Rpcj1Ob25lLCBjYXB0dXJlX3N0ZGVycj1UcnVlLCBlbnY9Tm9uZSk6CisgICAgIiIiQ2hhbmdlcyBpbnRvIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSwgaWYgcHJvdmlkZWQsIGFuZCBleGVjdXRlcyBhIGNvbW1hbmQuCisKKyAgICBSZXN0b3JlcyB0aGUgb2xkIGRpcmVjdG9yeSBhZnRlcndhcmRzLgorCisgICAgQXJnczoKKyAgICAgIGNvbW1hbmQ6ICAgICAgICBUaGUgY29tbWFuZCB0byBydW4sIGluIHRoZSBmb3JtIG9mIHN5cy5hcmd2LgorICAgICAgd29ya2luZ19kaXI6ICAgIFRoZSBkaXJlY3RvcnkgdG8gY2hhbmdlIGludG8uCisgICAgICBjYXB0dXJlX3N0ZGVycjogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNhcHR1cmUgc3RkZXJyIGluIHRoZSBvdXRwdXQgbWVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgb3IgdG8gZGlzY2FyZCBpdC4KKyAgICAgIGVudjogICAgICAgICAgICBEaWN0aW9uYXJ5IHdpdGggZW52aXJvbm1lbnQgdG8gcGFzcyB0byB0aGUgc3VicHJvY2Vzcy4KKworICAgIFJldHVybnM6CisgICAgICBBbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIG91dGNvbWUgb2YgdGhlIGV4ZWN1dGVkIHByb2Nlc3MuIEl0IGhhcyB0aGUKKyAgICAgIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgICAgICB0ZXJtaW5hdGVkX2J5X3NpZ25hbCAgIFRydWUgaWZmIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIHRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBhIHNpZ25hbC4KKyAgICAgICAgc2lnbmFsICAgICAgICAgICAgICAgICBTeWduYWwgdGhhdCB0ZXJtaW5hdGVkIHRoZSBjaGlsZCBwcm9jZXNzLgorICAgICAgICBleGl0ZWQgICAgICAgICAgICAgICAgIFRydWUgaWZmIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXRlZCBub3JtYWxseS4KKyAgICAgICAgZXhpdF9jb2RlICAgICAgICAgICAgICBUaGUgY29kZSB3aXRoIHdoaWNoIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXRlZC4KKyAgICAgICAgb3V0cHV0ICAgICAgICAgICAgICAgICBDaGlsZCBwcm9jZXNzJ3Mgc3Rkb3V0IGFuZCBzdGRlcnIgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWQgaW4gYSBzdHJpbmcuCisgICAgIiIiCisKKyAgICAjIFRoZSBzdWJwcm9jZXNzIG1vZHVsZSBpcyB0aGUgcHJlZmVycmFibGUgd2F5IG9mIHJ1bm5pbmcgcHJvZ3JhbXMKKyAgICAjIHNpbmNlIGl0IGlzIGF2YWlsYWJsZSBhbmQgYmVoYXZlcyBjb25zaXN0ZW50bHkgb24gYWxsIHBsYXRmb3JtcywKKyAgICAjIGluY2x1ZGluZyBXaW5kb3dzLiBCdXQgaXQgaXMgb25seSBhdmFpbGFibGUgc3RhcnRpbmcgaW4gcHl0aG9uIDIuNC4KKyAgICAjIEluIGVhcmxpZXIgcHl0aG9uIHZlcnNpb25zLCB3ZSByZXZlcnQgdG8gdGhlIHBvcGVuMiBtb2R1bGUsIHdoaWNoIGlzCisgICAgIyBhdmFpbGFibGUgaW4gcHl0aG9uIDIuMCBhbmQgbGF0ZXIgYnV0IGRvZXNuJ3QgcHJvdmlkZSByZXF1aXJlZAorICAgICMgZnVuY3Rpb25hbGl0eSAoUG9wZW40KSB1bmRlciBXaW5kb3dzLiBUaGlzIGFsbG93cyB1cyB0byBzdXBwb3J0IE1hYworICAgICMgT1MgWCAxMC40IFRpZ2VyLCB3aGljaCBoYXMgcHl0aG9uIDIuMyBpbnN0YWxsZWQuCisgICAgaWYgX1NVQlBST0NFU1NfTU9EVUxFX0FWQUlMQUJMRToKKyAgICAgIGlmIGNhcHR1cmVfc3RkZXJyOgorICAgICAgICBzdGRlcnIgPSBzdWJwcm9jZXNzLlNURE9VVAorICAgICAgZWxzZToKKyAgICAgICAgc3RkZXJyID0gc3VicHJvY2Vzcy5QSVBFCisKKyAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkPXdvcmtpbmdfZGlyLCB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwgZW52PWVudikKKyAgICAgICMgY29tbXVuaWNhdGUgcmV0dXJucyBhIHR1cGxlIHdpdGggdGhlIGZpbGUgb2JlY3QgZm9yIHRoZSBjaGlsZCdzCisgICAgICAjIG91dHB1dC4KKyAgICAgIHNlbGYub3V0cHV0ID0gcC5jb21tdW5pY2F0ZSgpWzBdCisgICAgICBzZWxmLl9yZXR1cm5fY29kZSA9IHAucmV0dXJuY29kZQorICAgIGVsc2U6CisgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKworICAgICAgZGVmIF9SZXBsYWNlRW52RGljdChkZXN0LCBzcmMpOgorICAgICAgICAjIENoYW5nZXMgbWFkZSBieSBvcy5lbnZpcm9uLmNsZWFyIGFyZSBub3QgaW5oZXJpdGFibGUgYnkgY2hpbGQKKyAgICAgICAgIyBwcm9jZXNzZXMgdW50aWwgUHl0aG9uIDIuNi4gVG8gcHJvZHVjZSBpbmhlcml0YWJsZSBjaGFuZ2VzIHdlIGhhdmUKKyAgICAgICAgIyB0byBkZWxldGUgZW52aXJvbm1lbnQgaXRlbXMgd2l0aCB0aGUgZGVsIHN0YXRlbWVudC4KKyAgICAgICAgZm9yIGtleSBpbiBkZXN0LmtleXMoKToKKyAgICAgICAgICBkZWwgZGVzdFtrZXldCisgICAgICAgIGRlc3QudXBkYXRlKHNyYykKKworICAgICAgIyBXaGVuICdlbnYnIGlzIG5vdCBOb25lLCBiYWNrdXAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgcmVwbGFjZQorICAgICAgIyB0aGVtIHdpdGggdGhlIHBhc3NlZCAnZW52Jy4gV2hlbiAnZW52JyBpcyBOb25lLCB3ZSBzaW1wbHkgdXNlIHRoZQorICAgICAgIyBjdXJyZW50ICdvcy5lbnZpcm9uJyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBzdWJwcm9jZXNzLlBvcGVuCisgICAgICAjIHNlbWFudGljcyB1c2VkIGFib3ZlLgorICAgICAgaWYgZW52IGlzIG5vdCBOb25lOgorICAgICAgICBvbGRfZW52aXJvbiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIF9SZXBsYWNlRW52RGljdChvcy5lbnZpcm9uLCBlbnYpCisKKyAgICAgIHRyeToKKyAgICAgICAgaWYgd29ya2luZ19kaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgb3MuY2hkaXIod29ya2luZ19kaXIpCisgICAgICAgIGlmIGNhcHR1cmVfc3RkZXJyOgorICAgICAgICAgIHAgPSBwb3BlbjIuUG9wZW40KGNvbW1hbmQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcCA9IHBvcGVuMi5Qb3BlbjMoY29tbWFuZCkKKyAgICAgICAgcC50b2NoaWxkLmNsb3NlKCkKKyAgICAgICAgc2VsZi5vdXRwdXQgPSBwLmZyb21jaGlsZC5yZWFkKCkKKyAgICAgICAgcmV0X2NvZGUgPSBwLndhaXQoKQorICAgICAgZmluYWxseToKKyAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKworICAgICAgICAjIFJlc3RvcmUgdGhlIG9sZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgICAgIyBpZiB0aGV5IHdlcmUgcmVwbGFjZWQuCisgICAgICAgIGlmIGVudiBpcyBub3QgTm9uZToKKyAgICAgICAgICBfUmVwbGFjZUVudkRpY3Qob3MuZW52aXJvbiwgb2xkX2Vudmlyb24pCisKKyAgICAgICMgQ29udmVydHMgcmV0X2NvZGUgdG8gbWF0Y2ggdGhlIHNlbWFudGljcyBvZgorICAgICAgIyBzdWJwcm9jZXNzLlBvcGVuLnJldHVybmNvZGUuCisgICAgICBpZiBvcy5XSUZTSUdOQUxFRChyZXRfY29kZSk6CisgICAgICAgIHNlbGYuX3JldHVybl9jb2RlID0gLW9zLldURVJNU0lHKHJldF9jb2RlKQorICAgICAgZWxzZTogICMgb3MuV0lGRVhJVEVEKHJldF9jb2RlKSBzaG91bGQgcmV0dXJuIFRydWUgaGVyZS4KKyAgICAgICAgc2VsZi5fcmV0dXJuX2NvZGUgPSBvcy5XRVhJVFNUQVRVUyhyZXRfY29kZSkKKworICAgIGlmIHNlbGYuX3JldHVybl9jb2RlIDwgMDoKKyAgICAgIHNlbGYudGVybWluYXRlZF9ieV9zaWduYWwgPSBUcnVlCisgICAgICBzZWxmLmV4aXRlZCA9IEZhbHNlCisgICAgICBzZWxmLnNpZ25hbCA9IC1zZWxmLl9yZXR1cm5fY29kZQorICAgIGVsc2U6CisgICAgICBzZWxmLnRlcm1pbmF0ZWRfYnlfc2lnbmFsID0gRmFsc2UKKyAgICAgIHNlbGYuZXhpdGVkID0gVHJ1ZQorICAgICAgc2VsZi5leGl0X2NvZGUgPSBzZWxmLl9yZXR1cm5fY29kZQorCisKK2RlZiBNYWluKCk6CisgICIiIlJ1bnMgdGhlIHVuaXQgdGVzdC4iIiIKKworICAjIFdlIG11c3QgY2FsbCBfUGFyc2VBbmRTdHJpcEdUZXN0RmxhZ3MoKSBiZWZvcmUgY2FsbGluZworICAjIHVuaXR0ZXN0Lm1haW4oKS4gIE90aGVyd2lzZSB0aGUgbGF0dGVyIHdpbGwgYmUgY29uZnVzZWQgYnkgdGhlCisgICMgLS1ndGVzdF8qIGZsYWdzLgorICBfUGFyc2VBbmRTdHJpcEdUZXN0RmxhZ3Moc3lzLmFyZ3YpCisgICMgVGhlIHRlc3RlZCBiaW5hcmllcyBzaG91bGQgbm90IGJlIHdyaXRpbmcgWE1MIG91dHB1dCBmaWxlcyB1bmxlc3MgdGhlCisgICMgc2NyaXB0IGV4cGxpY2l0bHkgaW5zdHJ1Y3RzIHRoZW0gdG8uCisgICMgVE9ETyh2bGFkbEBnb29nbGUuY29tKTogTW92ZSB0aGlzIGludG8gU3VicHJvY2VzcyB3aGVuIHdlIGltcGxlbWVudAorICAjIHBhc3NpbmcgZW52aXJvbm1lbnQgaW50byBpdCBhcyBhIHBhcmFtZXRlci4KKyAgaWYgR1RFU1RfT1VUUFVUX1ZBUl9OQU1FIGluIG9zLmVudmlyb246CisgICAgZGVsIG9zLmVudmlyb25bR1RFU1RfT1VUUFVUX1ZBUl9OQU1FXQorCisgIF90ZXN0X21vZHVsZS5tYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfZXhfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfZXhfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ2Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV9leF90ZXN0LmNjCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFRlc3RzIEdvb2dsZSBUZXN0J3MgdGhyb3ctb24tZmFpbHVyZSBtb2RlIHdpdGggZXhjZXB0aW9ucyBlbmFibGVkLgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisvLyBQcmludHMgdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZSBhbmQgZXhpdHMgdGhlIHByb2dyYW0gd2l0aAorLy8gbm9uLXplcm8uICBXZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGEgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIHRvCisvLyBpbmRpY2F0ZSBhIGZhaWx1cmUsIGFzIHRoZSBsYXR0ZXIgaXMgYmVlbiB0ZXN0ZWQgYW5kIGNhbm5vdCBiZQorLy8gcmVsaWVkIG9uLgordm9pZCBGYWlsKGNvbnN0IGNoYXIqIG1zZykgeworICBwcmludGYoIkZBSUxVUkU6ICVzXG4iLCBtc2cpOworICBmZmx1c2goc3Rkb3V0KTsKKyAgZXhpdCgxKTsKK30KKworLy8gVGVzdHMgdGhhdCBhbiBhc3NlcnRpb24gZmFpbHVyZSB0aHJvd3MgYSBzdWJjbGFzcyBvZgorLy8gc3RkOjpydW50aW1lX2Vycm9yLgordm9pZCBUZXN0RmFpbHVyZVRocm93c1J1bnRpbWVFcnJvcigpIHsKKyAgdGVzdGluZzo6R1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRydWU7CisKKyAgLy8gQSBzdWNjZXNzZnVsIGFzc2VydGlvbiBzaG91bGRuJ3QgdGhyb3cuCisgIHRyeSB7CisgICAgRVhQRUNUX0VRKDMsIDMpOworICB9IGNhdGNoKC4uLikgeworICAgIEZhaWwoIkEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gd3JvbmdmdWxseSB0aHJldy4iKTsKKyAgfQorCisgIC8vIEEgZmFpbGVkIGFzc2VydGlvbiBzaG91bGQgdGhyb3cgYSBzdWJjbGFzcyBvZiBzdGQ6OnJ1bnRpbWVfZXJyb3IuCisgIHRyeSB7CisgICAgRVhQRUNUX0VRKDIsIDMpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKKyAgfSBjYXRjaChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpIHsKKyAgICBpZiAoc3Ryc3RyKGUud2hhdCgpLCAiRXhwZWN0ZWQgZmFpbHVyZSIpICE9IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIkEgZmFpbGVkIGFzc2VydGlvbiBkaWQgdGhyb3cgYW4gZXhjZXB0aW9uIG9mIHRoZSByaWdodCB0eXBlLCAiCisgICAgICAgICAgICJidXQgdGhlIG1lc3NhZ2UgaXMgaW5jb3JyZWN0LiAgSW5zdGVhZCBvZiBjb250YWluaW5nIFwiRXhwZWN0ZWQgIgorICAgICAgICAgICAiZmFpbHVyZVwiLCBpdCBpczpcbiIpOworICAgIEZhaWwoZS53aGF0KCkpOworICB9IGNhdGNoKC4uLikgeworICAgIEZhaWwoIkEgZmFpbGVkIGFzc2VydGlvbiB0aHJldyB0aGUgd3JvbmcgdHlwZSBvZiBleGNlcHRpb24uIik7CisgIH0KKyAgRmFpbCgiQSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCd2ZSB0aHJvd24gYnV0IGRpZG4ndC4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHBlb3BsZSBjYW4gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgaW4KKyAgLy8gb3RoZXIgdGVzdGluZyBmcmFtZXdvcmtzLCBhcyBsb25nIGFzIHRoZXkgaW5pdGlhbGl6ZSBHb29nbGUgVGVzdAorICAvLyBwcm9wZXJseSBhbmQgc2V0IHRoZSB0aHJvd24tb24tZmFpbHVyZSBtb2RlLiAgVGhlcmVmb3JlLCB3ZSBkb24ndAorICAvLyB1c2UgR29vZ2xlIFRlc3QncyBjb25zdHJ1Y3RzIGZvciBkZWZpbmluZyBhbmQgcnVubmluZyB0ZXN0cworICAvLyAoZS5nLiBURVNUIGFuZCBSVU5fQUxMX1RFU1RTKSBoZXJlLgorCisgIFRlc3RGYWlsdXJlVGhyb3dzUnVudGltZUVycm9yKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2NzhmZmUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3QucHkKQEAgLTAsMCArMSwxNzEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRlc3RzIEdvb2dsZSBUZXN0J3MgdGhyb3ctb24tZmFpbHVyZSBtb2RlIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZC4KKworVGhpcyBzY3JpcHQgaW52b2tlcyBndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfIChhIHByb2dyYW0gd3JpdHRlbiB3aXRoCitHb29nbGUgVGVzdCkgd2l0aCBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIGFuZCBjb21tYW5kIGxpbmUgZmxhZ3MuCisiIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IG9zCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworCisKKyMgQ29uc3RhbnRzLgorCisjIFRoZSBjb21tYW5kIGxpbmUgZmxhZyBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUuCitUSFJPV19PTl9GQUlMVVJFID0gJ2d0ZXN0X3Rocm93X29uX2ZhaWx1cmUnCisKKyMgUGF0aCB0byB0aGUgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XyBwcm9ncmFtLCBjb21waWxlZCB3aXRoCisjIGV4Y2VwdGlvbnMgZGlzYWJsZWQuCitFWEVfUEFUSCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKAorICAgICdndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfJykKKworCisjIFV0aWxpdGllcy4KKworCitkZWYgU2V0RW52VmFyKGVudl92YXIsIHZhbHVlKToKKyAgIiIiU2V0cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIGdpdmVuIHZhbHVlOyB1bnNldHMgaXQgd2hlbiB0aGUKKyAgZ2l2ZW4gdmFsdWUgaXMgTm9uZS4KKyAgIiIiCisKKyAgZW52X3ZhciA9IGVudl92YXIudXBwZXIoKQorICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICBvcy5lbnZpcm9uW2Vudl92YXJdID0gdmFsdWUKKyAgZWxpZiBlbnZfdmFyIGluIG9zLmVudmlyb246CisgICAgZGVsIG9zLmVudmlyb25bZW52X3Zhcl0KKworCitkZWYgUnVuKGNvbW1hbmQpOgorICAiIiJSdW5zIGEgY29tbWFuZDsgcmV0dXJucyBUcnVlL0ZhbHNlIGlmIGl0cyBleGl0IGNvZGUgaXMvaXNuJ3QgMC4iIiIKKworICBwcmludCAnUnVubmluZyAiJXMiLiAuIC4nICUgJyAnLmpvaW4oY29tbWFuZCkKKyAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kKQorICByZXR1cm4gcC5leGl0ZWQgYW5kIHAuZXhpdF9jb2RlID09IDAKKworCisjIFRoZSB0ZXN0cy4gIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZWZhY3RvciB0aGUgY2xhc3MgdG8gc2hhcmUgY29tbW9uCisjIGxvZ2ljIHdpdGggY29kZSBpbiBndGVzdF9icmVha19vbl9mYWlsdXJlX3VuaXR0ZXN0LnB5LgorY2xhc3MgVGhyb3dPbkZhaWx1cmVUZXN0KGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiJUZXN0cyB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlLiIiIgorCisgIGRlZiBSdW5BbmRWZXJpZnkoc2VsZiwgZW52X3Zhcl92YWx1ZSwgZmxhZ192YWx1ZSwgc2hvdWxkX2ZhaWwpOgorICAgICIiIlJ1bnMgZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZV90ZXN0XyBhbmQgdmVyaWZpZXMgdGhhdCBpdCBkb2VzCisgICAgKG9yIGRvZXMgbm90KSBleGl0IHdpdGggYSBub24temVybyBjb2RlLgorCisgICAgQXJnczoKKyAgICAgIGVudl92YXJfdmFsdWU6ICAgIHZhbHVlIG9mIHRoZSBHVEVTVF9CUkVBS19PTl9GQUlMVVJFIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTsgTm9uZSBpZiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIHVuc2V0LgorICAgICAgZmxhZ192YWx1ZTogICAgICAgdmFsdWUgb2YgdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBmbGFnOworICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSBpZiB0aGUgZmxhZyBzaG91bGQgbm90IGJlIHByZXNlbnQuCisgICAgICBzaG91bGRfZmFpbDogICAgICBUcnVlIGlmZiB0aGUgcHJvZ3JhbSBpcyBleHBlY3RlZCB0byBmYWlsLgorICAgICIiIgorCisgICAgU2V0RW52VmFyKFRIUk9XX09OX0ZBSUxVUkUsIGVudl92YXJfdmFsdWUpCisKKyAgICBpZiBlbnZfdmFyX3ZhbHVlIGlzIE5vbmU6CisgICAgICBlbnZfdmFyX3ZhbHVlX21zZyA9ICcgaXMgbm90IHNldCcKKyAgICBlbHNlOgorICAgICAgZW52X3Zhcl92YWx1ZV9tc2cgPSAnPScgKyBlbnZfdmFyX3ZhbHVlCisKKyAgICBpZiBmbGFnX3ZhbHVlIGlzIE5vbmU6CisgICAgICBmbGFnID0gJycKKyAgICBlbGlmIGZsYWdfdmFsdWUgPT0gJzAnOgorICAgICAgZmxhZyA9ICctLSVzPTAnICUgVEhST1dfT05fRkFJTFVSRQorICAgIGVsc2U6CisgICAgICBmbGFnID0gJy0tJXMnICUgVEhST1dfT05fRkFJTFVSRQorCisgICAgY29tbWFuZCA9IFtFWEVfUEFUSF0KKyAgICBpZiBmbGFnOgorICAgICAgY29tbWFuZC5hcHBlbmQoZmxhZykKKworICAgIGlmIHNob3VsZF9mYWlsOgorICAgICAgc2hvdWxkX29yX25vdCA9ICdzaG91bGQnCisgICAgZWxzZToKKyAgICAgIHNob3VsZF9vcl9ub3QgPSAnc2hvdWxkIG5vdCcKKworICAgIGZhaWxlZCA9IG5vdCBSdW4oY29tbWFuZCkKKworICAgIFNldEVudlZhcihUSFJPV19PTl9GQUlMVVJFLCBOb25lKQorCisgICAgbXNnID0gKCd3aGVuICVzJXMsIGFuIGFzc2VydGlvbiBmYWlsdXJlIGluICIlcyIgJXMgY2F1c2UgYSBub24temVybyAnCisgICAgICAgICAgICdleGl0IGNvZGUuJyAlCisgICAgICAgICAgIChUSFJPV19PTl9GQUlMVVJFLCBlbnZfdmFyX3ZhbHVlX21zZywgJyAnLmpvaW4oY29tbWFuZCksCisgICAgICAgICAgICBzaG91bGRfb3Jfbm90KSkKKyAgICBzZWxmLmFzc2VydF8oZmFpbGVkID09IHNob3VsZF9mYWlsLCBtc2cpCisKKyAgZGVmIHRlc3REZWZhdWx0QmVoYXZpb3Ioc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IG1vZGUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsIGZsYWdfdmFsdWU9Tm9uZSwgc2hvdWxkX2ZhaWw9RmFsc2UpCisKKyAgZGVmIHRlc3RUaHJvd09uRmFpbHVyZUVudlZhcihzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyB0aGUgR1RFU1RfVEhST1dfT05fRkFJTFVSRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4iIiIKKworICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1GYWxzZSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9VHJ1ZSkKKworICBkZWYgdGVzdFRocm93T25GYWlsdXJlRmxhZyhzZWxmKToKKyAgICAiIiJUZXN0cyB1c2luZyB0aGUgLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlIGZsYWcuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ192YWx1ZT0nMCcsCisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2ZhaWw9RmFsc2UpCisgICAgc2VsZi5SdW5BbmRWZXJpZnkoZW52X3Zhcl92YWx1ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPVRydWUpCisKKyAgZGVmIHRlc3RUaHJvd09uRmFpbHVyZUZsYWdPdmVycmlkZXNFbnZWYXIoc2VsZik6CisgICAgIiIiVGVzdHMgdGhhdCAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUgb3ZlcnJpZGVzIEdURVNUX1RIUk9XX09OX0ZBSUxVUkUuIiIiCisKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1GYWxzZSkKKyAgICBzZWxmLlJ1bkFuZFZlcmlmeShlbnZfdmFyX3ZhbHVlPScwJywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlPScxJywKKyAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfZmFpbD1UcnVlKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzAnLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPUZhbHNlKQorICAgIHNlbGYuUnVuQW5kVmVyaWZ5KGVudl92YXJfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU9JzEnLAorICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9mYWlsPVRydWUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgZ3Rlc3RfdGVzdF91dGlscy5NYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdF8uY2MgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODhmZTMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF90aHJvd19vbl9mYWlsdXJlX3Rlc3RfLmNjCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFRlc3RzIEdvb2dsZSBUZXN0J3MgdGhyb3ctb24tZmFpbHVyZSBtb2RlIHdpdGggZXhjZXB0aW9ucyBkaXNhYmxlZC4KKy8vCisvLyBUaGlzIHByb2dyYW0gbXVzdCBiZSBjb21waWxlZCB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQuICBJdCB3aWxsIGJlCisvLyBpbnZva2VkIGJ5IGd0ZXN0X3Rocm93X29uX2ZhaWx1cmVfdGVzdC5weSwgYW5kIGlzIGV4cGVjdGVkIHRvIGV4aXQKKy8vIHdpdGggbm9uLXplcm8gaW4gdGhlIHRocm93LW9uLWZhaWx1cmUgbW9kZSBvciAwIG90aGVyd2lzZS4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZmZsdXNoLCBmcHJpbnRmLCBOVUxMLCBldGMuCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGV4aXQKKyNpbmNsdWRlIDxleGNlcHRpb24+ICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc2V0X3Rlcm1pbmF0ZQorCisvLyBUaGlzIHRlcm1pbmF0ZSBoYW5kbGVyIGFib3J0cyB0aGUgcHJvZ3JhbSB1c2luZyBleGl0KCkgcmF0aGVyIHRoYW4gYWJvcnQoKS4KKy8vIFRoaXMgYXZvaWRzIHNob3dpbmcgcG9wLXVwcyBvbiBXaW5kb3dzIHN5c3RlbXMgYW5kIGNvcmUgZHVtcHMgb24gVW5peC1saWtlCisvLyBvbmVzLgordm9pZCBUZXJtaW5hdGVIYW5kbGVyKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCAiVW5oYW5kbGVkIEMrKyBleGNlcHRpb24gdGVybWluYXRpbmcgdGhlIHByb2dyYW0uIik7CisgIGZmbHVzaChOVUxMKTsKKyAgZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgc3RkOjpzZXRfdGVybWluYXRlKCZUZXJtaW5hdGVIYW5kbGVyKTsKKyNlbmRpZgorICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisKKyAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBwZW9wbGUgY2FuIHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGluCisgIC8vIG90aGVyIHRlc3RpbmcgZnJhbWV3b3JrcywgYXMgbG9uZyBhcyB0aGV5IGluaXRpYWxpemUgR29vZ2xlIFRlc3QKKyAgLy8gcHJvcGVybHkgYW5kIHNldCB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlLiAgVGhlcmVmb3JlLCB3ZSBkb24ndAorICAvLyB1c2UgR29vZ2xlIFRlc3QncyBjb25zdHJ1Y3RzIGZvciBkZWZpbmluZyBhbmQgcnVubmluZyB0ZXN0cworICAvLyAoZS5nLiBURVNUIGFuZCBSVU5fQUxMX1RFU1RTKSBoZXJlLgorCisgIC8vIEluIHRoZSB0aHJvdy1vbi1mYWlsdXJlIG1vZGUgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkLCB0aGlzCisgIC8vIGFzc2VydGlvbiB3aWxsIGNhdXNlIHRoZSBwcm9ncmFtIHRvIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGNvZGUuCisgIEVYUEVDVF9FUSgyLCAzKTsKKworICAvLyBXaGVuIG5vdCBpbiB0aGUgdGhyb3ctb24tZmFpbHVyZSBtb2RlLCB0aGUgY29udHJvbCB3aWxsIHJlYWNoCisgIC8vIGhlcmUuCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0LnB5IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhZTU3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF91bmluaXRpYWxpemVkX3Rlc3QucHkKQEAgLTAsMCArMSw3MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVmVyaWZpZXMgdGhhdCBHb29nbGUgVGVzdCB3YXJucyB0aGUgdXNlciB3aGVuIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS4iIiIKKworX19hdXRob3JfXyA9ICd3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKScKKworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKKworCitDT01NQU5EID0gZ3Rlc3RfdGVzdF91dGlscy5HZXRUZXN0RXhlY3V0YWJsZVBhdGgoJ2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8nKQorCisKK2RlZiBBc3NlcnQoY29uZGl0aW9uKToKKyAgaWYgbm90IGNvbmRpdGlvbjoKKyAgICByYWlzZSBBc3NlcnRpb25FcnJvcgorCisKK2RlZiBBc3NlcnRFcShleHBlY3RlZCwgYWN0dWFsKToKKyAgaWYgZXhwZWN0ZWQgIT0gYWN0dWFsOgorICAgIHByaW50ICdFeHBlY3RlZDogJXMnICUgKGV4cGVjdGVkLCkKKyAgICBwcmludCAnICBBY3R1YWw6ICVzJyAlIChhY3R1YWwsKQorICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisKKworZGVmIFRlc3RFeGl0Q29kZUFuZE91dHB1dChjb21tYW5kKToKKyAgIiIiUnVucyB0aGUgZ2l2ZW4gY29tbWFuZCBhbmQgdmVyaWZpZXMgaXRzIGV4aXQgY29kZSBhbmQgb3V0cHV0LiIiIgorCisgICMgVmVyaWZpZXMgdGhhdCAnY29tbWFuZCcgZXhpdHMgd2l0aCBjb2RlIDEuCisgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCkKKyAgQXNzZXJ0KHAuZXhpdGVkKQorICBBc3NlcnRFcSgxLCBwLmV4aXRfY29kZSkKKyAgQXNzZXJ0KCdJbml0R29vZ2xlVGVzdCcgaW4gcC5vdXRwdXQpCisKKworY2xhc3MgR1Rlc3RVbmluaXRpYWxpemVkVGVzdChndGVzdF90ZXN0X3V0aWxzLlRlc3RDYXNlKToKKyAgZGVmIHRlc3RFeGl0Q29kZUFuZE91dHB1dChzZWxmKToKKyAgICBUZXN0RXhpdENvZGVBbmRPdXRwdXQoQ09NTUFORCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfdW5pbml0aWFsaXplZF90ZXN0Xy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzMTY5OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3VuaW5pdGlhbGl6ZWRfdGVzdF8uY2MKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK1RFU1QoRHVtbXlUZXN0LCBEdW1teSkgeworICAvLyBUaGlzIHRlc3QgZG9lc24ndCB2ZXJpZnkgYW55dGhpbmcuICBXZSBqdXN0IG5lZWQgaXQgdG8gY3JlYXRlIGEKKyAgLy8gcmVhbGlzdGljIHN0YWdlIGZvciB0ZXN0aW5nIHRoZSBiZWhhdmlvciBvZiBHb29nbGUgVGVzdCB3aGVuCisgIC8vIFJVTl9BTExfVEVTVFMoKSBpcyBjYWxsZWQgd2l0aG91dCB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpIGJlaW5nCisgIC8vIGNhbGxlZCBmaXJzdC4KK30KKworaW50IG1haW4oKSB7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF91bml0dGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYWVkMzUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDc2OTkgQEAKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisvLworLy8gVGVzdHMgZm9yIEdvb2dsZSBUZXN0IGl0c2VsZi4gIFRoaXMgdmVyaWZpZXMgdGhhdCB0aGUgYmFzaWMgY29uc3RydWN0cyBvZgorLy8gR29vZ2xlIFRlc3Qgd29yay4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbW1hbmQgbGluZSBmbGFnIHZhcmlhYmxlcyBjYW4gYmUgYWNjZXNzZWQKKy8vIGluIGNvZGUgb25jZSA8Z3Rlc3QvZ3Rlc3QuaD4gaGFzIGJlZW4gI2luY2x1ZGVkLgorLy8gRG8gbm90IG1vdmUgaXQgYWZ0ZXIgb3RoZXIgI2luY2x1ZGVzLgorVEVTVChDb21tYW5kTGluZUZsYWdzVGVzdCwgQ2FuQmVBY2Nlc3NlZEluQ29kZU9uY2VHVGVzdEhJc0luY2x1ZGVkKSB7CisgIGJvb2wgZHVtbXkgPSB0ZXN0aW5nOjpHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhjb2xvcikgIT0gInVua25vd24iCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGZpbHRlcikgIT0gInVua25vd24iCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKGxpc3RfdGVzdHMpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKG91dHB1dCkgIT0gInVua25vd24iCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHByaW50X3RpbWUpCisgICAgICB8fCB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKQorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhyZXBlYXQpID4gMAorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcykKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcoc2h1ZmZsZSkKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpID4gMAorICAgICAgfHwgdGVzdGluZzo6R1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKSAhPSAidW5rbm93biIKKyAgICAgIHx8IHRlc3Rpbmc6OkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSk7CisgIEVYUEVDVF9UUlVFKGR1bW15IHx8ICFkdW1teSk7ICAvLyBTdXBwcmVzc2VzIHdhcm5pbmcgdGhhdCBkdW1teSBpcyB1bnVzZWQuCit9CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gIC8vIEZvciBJTlRfTUFYLgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKworY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXJUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgY2xhc3MgRmFrZVNvY2tldFdyaXRlciA6IHB1YmxpYyBTdHJlYW1pbmdMaXN0ZW5lcjo6QWJzdHJhY3RTb2NrZXRXcml0ZXIgeworICAgcHVibGljOgorICAgIC8vIFNlbmRzIGEgc3RyaW5nIHRvIHRoZSBzb2NrZXQuCisgICAgdmlydHVhbCB2b2lkIFNlbmQoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7IG91dHB1dF8gKz0gbWVzc2FnZTsgfQorCisgICAgc3RyaW5nIG91dHB1dF87CisgIH07CisKKyAgU3RyZWFtaW5nTGlzdGVuZXJUZXN0KCkKKyAgICAgIDogZmFrZV9zb2NrX3dyaXRlcl8obmV3IEZha2VTb2NrZXRXcml0ZXIpLAorICAgICAgICBzdHJlYW1lcl8oZmFrZV9zb2NrX3dyaXRlcl8pLAorICAgICAgICB0ZXN0X2luZm9fb2JqXygiRm9vVGVzdCIsICJCYXIiLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBDb2RlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fKSwgMCwgTlVMTCkge30KKworIHByb3RlY3RlZDoKKyAgc3RyaW5nKiBvdXRwdXQoKSB7IHJldHVybiAmKGZha2Vfc29ja193cml0ZXJfLT5vdXRwdXRfKTsgfQorCisgIEZha2VTb2NrZXRXcml0ZXIqIGNvbnN0IGZha2Vfc29ja193cml0ZXJfOworICBTdHJlYW1pbmdMaXN0ZW5lciBzdHJlYW1lcl87CisgIFVuaXRUZXN0IHVuaXRfdGVzdF87CisgIFRlc3RJbmZvIHRlc3RfaW5mb19vYmpfOyAgLy8gVGhlIG5hbWUgdGVzdF9pbmZvXyB3YXMgdGFrZW4gYnkgdGVzdGluZzo6VGVzdC4KK307CisKK1RFU1RfRihTdHJlYW1pbmdMaXN0ZW5lclRlc3QsIE9uVGVzdFByb2dyYW1FbmQpIHsKKyAgKm91dHB1dCgpID0gIiI7CisgIHN0cmVhbWVyXy5PblRlc3RQcm9ncmFtRW5kKHVuaXRfdGVzdF8pOworICBFWFBFQ1RfRVEoImV2ZW50PVRlc3RQcm9ncmFtRW5kJnBhc3NlZD0xXG4iLCAqb3V0cHV0KCkpOworfQorCitURVNUX0YoU3RyZWFtaW5nTGlzdGVuZXJUZXN0LCBPblRlc3RJdGVyYXRpb25FbmQpIHsKKyAgKm91dHB1dCgpID0gIiI7CisgIHN0cmVhbWVyXy5PblRlc3RJdGVyYXRpb25FbmQodW5pdF90ZXN0XywgNDIpOworICBFWFBFQ1RfRVEoImV2ZW50PVRlc3RJdGVyYXRpb25FbmQmcGFzc2VkPTEmZWxhcHNlZF90aW1lPTBtc1xuIiwgKm91dHB1dCgpKTsKK30KKworVEVTVF9GKFN0cmVhbWluZ0xpc3RlbmVyVGVzdCwgT25UZXN0Q2FzZVN0YXJ0KSB7CisgICpvdXRwdXQoKSA9ICIiOworICBzdHJlYW1lcl8uT25UZXN0Q2FzZVN0YXJ0KFRlc3RDYXNlKCJGb29UZXN0IiwgIkJhciIsIE5VTEwsIE5VTEwpKTsKKyAgRVhQRUNUX0VRKCJldmVudD1UZXN0Q2FzZVN0YXJ0Jm5hbWU9Rm9vVGVzdFxuIiwgKm91dHB1dCgpKTsKK30KKworVEVTVF9GKFN0cmVhbWluZ0xpc3RlbmVyVGVzdCwgT25UZXN0Q2FzZUVuZCkgeworICAqb3V0cHV0KCkgPSAiIjsKKyAgc3RyZWFtZXJfLk9uVGVzdENhc2VFbmQoVGVzdENhc2UoIkZvb1Rlc3QiLCAiQmFyIiwgTlVMTCwgTlVMTCkpOworICBFWFBFQ1RfRVEoImV2ZW50PVRlc3RDYXNlRW5kJnBhc3NlZD0xJmVsYXBzZWRfdGltZT0wbXNcbiIsICpvdXRwdXQoKSk7Cit9CisKK1RFU1RfRihTdHJlYW1pbmdMaXN0ZW5lclRlc3QsIE9uVGVzdFN0YXJ0KSB7CisgICpvdXRwdXQoKSA9ICIiOworICBzdHJlYW1lcl8uT25UZXN0U3RhcnQodGVzdF9pbmZvX29ial8pOworICBFWFBFQ1RfRVEoImV2ZW50PVRlc3RTdGFydCZuYW1lPUJhclxuIiwgKm91dHB1dCgpKTsKK30KKworVEVTVF9GKFN0cmVhbWluZ0xpc3RlbmVyVGVzdCwgT25UZXN0RW5kKSB7CisgICpvdXRwdXQoKSA9ICIiOworICBzdHJlYW1lcl8uT25UZXN0RW5kKHRlc3RfaW5mb19vYmpfKTsKKyAgRVhQRUNUX0VRKCJldmVudD1UZXN0RW5kJnBhc3NlZD0xJmVsYXBzZWRfdGltZT0wbXNcbiIsICpvdXRwdXQoKSk7Cit9CisKK1RFU1RfRihTdHJlYW1pbmdMaXN0ZW5lclRlc3QsIE9uVGVzdFBhcnRSZXN1bHQpIHsKKyAgKm91dHB1dCgpID0gIiI7CisgIHN0cmVhbWVyXy5PblRlc3RQYXJ0UmVzdWx0KFRlc3RQYXJ0UmVzdWx0KAorICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsICJmb28uY2MiLCA0MiwgImZhaWxlZD1cbiYlIikpOworCisgIC8vIE1ldGEgY2hhcmFjdGVycyBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlIHNob3VsZCBiZSBwcm9wZXJseSBlc2NhcGVkLgorICBFWFBFQ1RfRVEoCisgICAgICAiZXZlbnQ9VGVzdFBhcnRSZXN1bHQmZmlsZT1mb28uY2MmbGluZT00MiZtZXNzYWdlPWZhaWxlZCUzRCUwQSUyNiUyNVxuIiwKKyAgICAgICpvdXRwdXQoKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworCisvLyBQcm92aWRlcyBhY2Nlc3MgdG8gb3RoZXJ3aXNlIHByaXZhdGUgcGFydHMgb2YgdGhlIFRlc3RFdmVudExpc3RlbmVycyBjbGFzcworLy8gdGhhdCBhcmUgbmVlZGVkIHRvIHRlc3QgaXQuCitjbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvciB7CisgcHVibGljOgorICBzdGF0aWMgVGVzdEV2ZW50TGlzdGVuZXIqIEdldFJlcGVhdGVyKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzKSB7CisgICAgcmV0dXJuIGxpc3RlbmVycy0+cmVwZWF0ZXIoKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgICBsaXN0ZW5lcnMtPlNldERlZmF1bHRSZXN1bHRQcmludGVyKGxpc3RlbmVyKTsKKyAgfQorICBzdGF0aWMgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICAgIGxpc3RlbmVycy0+U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihsaXN0ZW5lcik7CisgIH0KKworICBzdGF0aWMgYm9vbCBFdmVudEZvcndhcmRpbmdFbmFibGVkKGNvbnN0IFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzKSB7CisgICAgcmV0dXJuIGxpc3RlbmVycy5FdmVudEZvcndhcmRpbmdFbmFibGVkKCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZyhUZXN0RXZlbnRMaXN0ZW5lcnMqIGxpc3RlbmVycykgeworICAgIGxpc3RlbmVycy0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKyAgfQorfTsKKworY2xhc3MgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RIZWxwZXIgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICBVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEhlbHBlcigpIHt9CisKKyAgLy8gRm9yd2FyZHMgdG8gVW5pdFRlc3Q6OlJlY29yZFByb3BlcnR5KCkgdG8gYnlwYXNzIGFjY2VzcyBjb250cm9scy4KKyAgdm9pZCBVbml0VGVzdFJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgdW5pdF90ZXN0Xy5SZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlKTsKKyAgfQorCisgIFVuaXRUZXN0IHVuaXRfdGVzdF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmU7Cit1c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQ7Cit1c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzOwordXNpbmcgdGVzdGluZzo6RG91YmxlTEU7Cit1c2luZyB0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyOwordXNpbmcgdGVzdGluZzo6RW52aXJvbm1lbnQ7Cit1c2luZyB0ZXN0aW5nOjpGbG9hdExFOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoY29sb3IpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoZmlsdGVyKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcobGlzdF90ZXN0cyk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKG91dHB1dCk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHByaW50X3RpbWUpOwordXNpbmcgdGVzdGluZzo6R1RFU1RfRkxBRyhyYW5kb21fc2VlZCk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHJlcGVhdCk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoc2h1ZmZsZSk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKTsKK3VzaW5nIHRlc3Rpbmc6OkdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7Cit1c2luZyB0ZXN0aW5nOjpHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpOwordXNpbmcgdGVzdGluZzo6SXNOb3RTdWJzdHJpbmc7Cit1c2luZyB0ZXN0aW5nOjpJc1N1YnN0cmluZzsKK3VzaW5nIHRlc3Rpbmc6Ok1lc3NhZ2U7Cit1c2luZyB0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKK3VzaW5nIHRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTsKK3VzaW5nIHRlc3Rpbmc6OlRlc3Q7Cit1c2luZyB0ZXN0aW5nOjpUZXN0Q2FzZTsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVyczsKK3VzaW5nIHRlc3Rpbmc6OlRlc3RJbmZvOwordXNpbmcgdGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ7Cit1c2luZyB0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5OwordXNpbmcgdGVzdGluZzo6VGVzdFByb3BlcnR5OwordXNpbmcgdGVzdGluZzo6VGVzdFJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OlRpbWVJbk1pbGxpczsKK3VzaW5nIHRlc3Rpbmc6OlVuaXRUZXN0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFkZFJlZmVyZW5jZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFwcGVuZFVzZXJNZXNzYWdlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFycmF5QXdhcmVGaW5kOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkFycmF5RXE7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Q29kZVBvaW50VG9VdGY4OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkNvcHlBcnJheTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDb3VudElmOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkVxRmFpbHVyZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpGbG9hdGluZ1BvaW50OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkZvckVhY2g7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDE7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdUZXN0RmxhZ1NhdmVyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3A7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0RWxlbWVudE9yOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldE5leHRSYW5kb21TZWVkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFJhbmRvbVNlZWRGcm9tRmxhZzsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRUZXN0VHlwZUlkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpczsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpHZXRUeXBlSWQ7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbnQzMjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJbnQzMkZyb21FbnZPckRpZTsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SXNDb250YWluZXI7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SXNDb250YWluZXJUZXN0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OklzTm90Q29udGFpbmVyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6Ok5hdGl2ZUFycmF5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlBhcnNlSW50MzJGbGFnOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2VDb3B5OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2U7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlQ29uc3Q7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlUmVmZXJlbmNlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNob3VsZFJ1blRlc3RPblNoYXJkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNob3VsZFNoYXJkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNob3VsZFVzZUNvbG9yOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNodWZmbGU7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U2h1ZmZsZVJhbmdlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlNraXBQcmVmaXg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpUZXN0UmVzdWx0QWNjZXNzb3I7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VUludDMyOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OldpZGVTdHJpbmdUb1V0Zjg7Cit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6ZWRpdF9kaXN0YW5jZTo6Q2FsY3VsYXRlT3B0aW1hbEVkaXRzOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmVkaXRfZGlzdGFuY2U6OkNyZWF0ZVVuaWZpZWREaWZmOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmVkaXRfZGlzdGFuY2U6OkVkaXRUeXBlOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtNYXhSYW5kb21TZWVkOwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OmtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0OwordXNpbmcgdGVzdGluZzo6a01heFN0YWNrVHJhY2VEZXB0aDsKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KK3VzaW5nIHRlc3Rpbmc6OmludGVybmFsOjpDYXB0dXJlU3Rkb3V0OwordXNpbmcgdGVzdGluZzo6aW50ZXJuYWw6OkdldENhcHR1cmVkU3Rkb3V0OworI2VuZGlmCisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6VGhyZWFkV2l0aFBhcmFtOworI2VuZGlmCisKK2NsYXNzIFRlc3RpbmdWZWN0b3IgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8aW50PiB7Cit9OworCis6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgb3MgPDwgInsgIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgpOyBpKyspIHsKKyAgICBvcyA8PCB2ZWN0b3JbaV0gPDwgIiAiOworICB9CisgIG9zIDw8ICJ9IjsKKyAgcmV0dXJuIG9zOworfQorCisvLyBUaGlzIGxpbmUgdGVzdHMgdGhhdCB3ZSBjYW4gZGVmaW5lIHRlc3RzIGluIGFuIHVubmFtZWQgbmFtZXNwYWNlLgorbmFtZXNwYWNlIHsKKworVEVTVChHZXRSYW5kb21TZWVkRnJvbUZsYWdUZXN0LCBIYW5kbGVzWmVybykgeworICBjb25zdCBpbnQgc2VlZCA9IEdldFJhbmRvbVNlZWRGcm9tRmxhZygwKTsKKyAgRVhQRUNUX0xFKDEsIHNlZWQpOworICBFWFBFQ1RfTEUoc2VlZCwgc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCkpOworfQorCitURVNUKEdldFJhbmRvbVNlZWRGcm9tRmxhZ1Rlc3QsIFByZXNlcnZlc1ZhbGlkU2VlZCkgeworICBFWFBFQ1RfRVEoMSwgR2V0UmFuZG9tU2VlZEZyb21GbGFnKDEpKTsKKyAgRVhQRUNUX0VRKDIsIEdldFJhbmRvbVNlZWRGcm9tRmxhZygyKSk7CisgIEVYUEVDVF9FUShrTWF4UmFuZG9tU2VlZCAtIDEsIEdldFJhbmRvbVNlZWRGcm9tRmxhZyhrTWF4UmFuZG9tU2VlZCAtIDEpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oa01heFJhbmRvbVNlZWQpLAorICAgICAgICAgICAgR2V0UmFuZG9tU2VlZEZyb21GbGFnKGtNYXhSYW5kb21TZWVkKSk7Cit9CisKK1RFU1QoR2V0UmFuZG9tU2VlZEZyb21GbGFnVGVzdCwgTm9ybWFsaXplc0ludmFsaWRTZWVkKSB7CisgIGNvbnN0IGludCBzZWVkMSA9IEdldFJhbmRvbVNlZWRGcm9tRmxhZygtMSk7CisgIEVYUEVDVF9MRSgxLCBzZWVkMSk7CisgIEVYUEVDVF9MRShzZWVkMSwgc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCkpOworCisgIGNvbnN0IGludCBzZWVkMiA9IEdldFJhbmRvbVNlZWRGcm9tRmxhZyhrTWF4UmFuZG9tU2VlZCArIDEpOworICBFWFBFQ1RfTEUoMSwgc2VlZDIpOworICBFWFBFQ1RfTEUoc2VlZDIsIHN0YXRpY19jYXN0PGludD4oa01heFJhbmRvbVNlZWQpKTsKK30KKworVEVTVChHZXROZXh0UmFuZG9tU2VlZFRlc3QsIFdvcmtzRm9yVmFsaWRJbnB1dCkgeworICBFWFBFQ1RfRVEoMiwgR2V0TmV4dFJhbmRvbVNlZWQoMSkpOworICBFWFBFQ1RfRVEoMywgR2V0TmV4dFJhbmRvbVNlZWQoMikpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrTWF4UmFuZG9tU2VlZCksCisgICAgICAgICAgICBHZXROZXh0UmFuZG9tU2VlZChrTWF4UmFuZG9tU2VlZCAtIDEpKTsKKyAgRVhQRUNUX0VRKDEsIEdldE5leHRSYW5kb21TZWVkKGtNYXhSYW5kb21TZWVkKSk7CisKKyAgLy8gV2UgZGVsaWJlcmF0ZWx5IGRvbid0IHRlc3QgR2V0TmV4dFJhbmRvbVNlZWQoKSB3aXRoIGludmFsaWQKKyAgLy8gaW5wdXRzLCBhcyB0aGF0IHJlcXVpcmVzIGRlYXRoIHRlc3RzLCB3aGljaCBhcmUgZXhwZW5zaXZlLiAgVGhpcworICAvLyBpcyBmaW5lIGFzIEdldE5leHRSYW5kb21TZWVkKCkgaXMgaW50ZXJuYWwgYW5kIGhhcyBhCisgIC8vIHN0cmFpZ2h0Zm9yd2FyZCBkZWZpbml0aW9uLgorfQorCitzdGF0aWMgdm9pZCBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKSB7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6Q2xlYXJUZXN0UGFydFJlc3VsdHMoCisgICAgICBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpKTsKK30KKworLy8gVGVzdHMgR2V0VHlwZUlkLgorCitURVNUKEdldFR5cGVJZFRlc3QsIFJldHVybnNTYW1lVmFsdWVGb3JTYW1lVHlwZSkgeworICBFWFBFQ1RfRVEoR2V0VHlwZUlkPGludD4oKSwgR2V0VHlwZUlkPGludD4oKSk7CisgIEVYUEVDVF9FUShHZXRUeXBlSWQ8VGVzdD4oKSwgR2V0VHlwZUlkPFRlc3Q+KCkpOworfQorCitjbGFzcyBTdWJDbGFzc09mVGVzdCA6IHB1YmxpYyBUZXN0IHt9OworY2xhc3MgQW5vdGhlclN1YkNsYXNzT2ZUZXN0IDogcHVibGljIFRlc3Qge307CisKK1RFU1QoR2V0VHlwZUlkVGVzdCwgUmV0dXJuc0RpZmZlcmVudFZhbHVlc0ZvckRpZmZlcmVudFR5cGVzKSB7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8aW50PigpLCBHZXRUeXBlSWQ8Y29uc3QgaW50PigpKTsKKyAgRVhQRUNUX05FKEdldFR5cGVJZDxpbnQ+KCksIEdldFR5cGVJZDxjaGFyPigpKTsKKyAgRVhQRUNUX05FKEdldFR5cGVJZDxpbnQ+KCksIEdldFRlc3RUeXBlSWQoKSk7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8U3ViQ2xhc3NPZlRlc3Q+KCksIEdldFRlc3RUeXBlSWQoKSk7CisgIEVYUEVDVF9ORShHZXRUeXBlSWQ8QW5vdGhlclN1YkNsYXNzT2ZUZXN0PigpLCBHZXRUZXN0VHlwZUlkKCkpOworICBFWFBFQ1RfTkUoR2V0VHlwZUlkPEFub3RoZXJTdWJDbGFzc09mVGVzdD4oKSwgR2V0VHlwZUlkPFN1YkNsYXNzT2ZUZXN0PigpKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBHZXRUZXN0VHlwZUlkKCkgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSwgbm8gbWF0dGVyIGl0CisvLyBpcyBjYWxsZWQgZnJvbSBpbnNpZGUgR29vZ2xlIFRlc3Qgb3Igb3V0c2lkZSBvZiBpdC4KK1RFU1QoR2V0VGVzdFR5cGVJZFRlc3QsIFJldHVybnNUaGVTYW1lVmFsdWVJbnNpZGVPck91dHNpZGVPZkdvb2dsZVRlc3QpIHsKKyAgRVhQRUNUX0VRKGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0LCBHZXRUZXN0VHlwZUlkKCkpOworfQorCisvLyBUZXN0cyBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoKS4KKworVEVTVChGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHNUZXN0LCBGb3JtYXRzWmVybykgeworICBFWFBFQ1RfRVEoIjAiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoMCkpOworfQorCitURVNUKEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kc1Rlc3QsIEZvcm1hdHNQb3NpdGl2ZU51bWJlcikgeworICBFWFBFQ1RfRVEoIjAuMDAzIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDMpKTsKKyAgRVhQRUNUX0VRKCIwLjAxIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDEwKSk7CisgIEVYUEVDVF9FUSgiMC4yIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKDIwMCkpOworICBFWFBFQ1RfRVEoIjEuMiIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygxMjAwKSk7CisgIEVYUEVDVF9FUSgiMyIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygzMDAwKSk7Cit9CisKK1RFU1QoRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzVGVzdCwgRm9ybWF0c05lZ2F0aXZlTnVtYmVyKSB7CisgIEVYUEVDVF9FUSgiLTAuMDAzIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0zKSk7CisgIEVYUEVDVF9FUSgiLTAuMDEiLCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMoLTEwKSk7CisgIEVYUEVDVF9FUSgiLTAuMiIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygtMjAwKSk7CisgIEVYUEVDVF9FUSgiLTEuMiIsIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcygtMTIwMCkpOworICBFWFBFQ1RfRVEoIi0zIiwgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKC0zMDAwKSk7Cit9CisKKy8vIFRlc3RzIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKCkuICBUaGUgY29ycmVjdG5lc3Mgb2YgY29udmVyc2lvbgorLy8gZm9yIHBhcnRpY3VsYXIgZGF0ZXMgYmVsb3cgd2FzIHZlcmlmaWVkIGluIFB5dGhvbiB1c2luZworLy8gZGF0ZXRpbWUuZGF0ZXRpbWUuZnJvbXV0Y3RpbWVzdGFtcCg8dGltZXRhbXA+LzEwMDApLgorCisvLyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IHRpbWV6b25lLCBzbyB3ZQorLy8gaGF2ZSB0byBzZXQgdXAgYSBwYXJ0aWN1bGFyIHRpbWV6b25lIHRvIG9idGFpbiBwcmVkaWN0YWJsZSByZXN1bHRzLgorY2xhc3MgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDFUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgLy8gT24gQ3lnd2luLCBHQ0MgZG9lc24ndCBhbGxvdyB1bnF1YWxpZmllZCBpbnRlZ2VyIGxpdGVyYWxzIHRvIGV4Y2VlZAorICAvLyAzMiBiaXRzLCBldmVuIHdoZW4gNjQtYml0IGludGVnZXIgdHlwZXMgYXJlIGF2YWlsYWJsZS4gIFdlIGhhdmUgdG8KKyAgLy8gZm9yY2UgdGhlIGNvbnN0YW50cyB0byBoYXZlIGEgNjQtYml0IHR5cGUgaGVyZS4KKyAgc3RhdGljIGNvbnN0IFRpbWVJbk1pbGxpcyBrTWlsbGlzUGVyU2VjID0gMTAwMDsKKworIHByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBzYXZlZF90el8gPSBOVUxMOworCisgICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDk5NiAvKiBnZXRlbnYsIHN0cmR1cDogZGVwcmVjYXRlZCAqLykKKyAgICBpZiAoZ2V0ZW52KCJUWiIpKQorICAgICAgc2F2ZWRfdHpfID0gc3RyZHVwKGdldGVudigiVFoiKSk7CisgICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCisKKyAgICAvLyBTZXQgdXAgdGhlIHRpbWUgem9uZSBmb3IgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEgdG8gdXNlLiAgV2UKKyAgICAvLyBjYW5ub3QgdXNlIHRoZSBsb2NhbCB0aW1lIHpvbmUgYmVjYXVzZSB0aGUgZnVuY3Rpb24ncyBvdXRwdXQgZGVwZW5kcworICAgIC8vIG9uIHRoZSB0aW1lIHpvbmUuCisgICAgU2V0VGltZVpvbmUoIlVUQyswMCIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIFNldFRpbWVab25lKHNhdmVkX3R6Xyk7CisgICAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihzYXZlZF90el8pKTsKKyAgICBzYXZlZF90el8gPSBOVUxMOworICB9CisKKyAgc3RhdGljIHZvaWQgU2V0VGltZVpvbmUoY29uc3QgY2hhciogdGltZV96b25lKSB7CisgICAgLy8gdHpzZXQoKSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIFRaIHZhcmlhYmxlIGJlaW5nIHByZXNlbnQgYW5kIGVtcHR5CisgICAgLy8gYW5kIG5vdCBiZWluZyBwcmVzZW50LCBzbyB3ZSBoYXZlIHRvIGNvbnNpZGVyIHRoZSBjYXNlIG9mIHRpbWVfem9uZQorICAgIC8vIGJlaW5nIE5VTEwuCisjaWYgX01TQ19WRVIKKyAgICAvLyAuLi5Vbmxlc3MgaXQncyBNU1ZDLCB3aG9zZSBzdGFuZGFyZCBsaWJyYXJ5J3MgX3B1dGVudiBkb2Vzbid0CisgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiBlbXB0eSBhbmQgYSBtaXNzaW5nIHZhcmlhYmxlLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPQorICAgICAgICBzdGQ6OnN0cmluZygiVFo9IikgKyAodGltZV96b25lID8gdGltZV96b25lIDogIiIpOworICAgIF9wdXRlbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2IC8qIGRlcHJlY2F0ZWQgZnVuY3Rpb24gKi8pCisgICAgdHpzZXQoKTsKKyAgICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKKyNlbHNlCisgICAgaWYgKHRpbWVfem9uZSkgeworICAgICAgc2V0ZW52KCgiVFoiKSwgdGltZV96b25lLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgdW5zZXRlbnYoIlRaIik7CisgICAgfQorICAgIHR6c2V0KCk7CisjZW5kaWYKKyAgfQorCisgIGNvbnN0IGNoYXIqIHNhdmVkX3R6XzsKK307CisKK2NvbnN0IFRpbWVJbk1pbGxpcyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3Q6OmtNaWxsaXNQZXJTZWM7CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIFByaW50c1R3b0RpZ2l0U2VnbWVudHMpIHsKKyAgRVhQRUNUX0VRKCIyMDExLTEwLTMxVDE4OjUyOjQyIiwKKyAgICAgICAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKDEzMjAwODcxNjIgKiBrTWlsbGlzUGVyU2VjKSk7Cit9CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIE1pbGxpc2Vjb25kc0RvTm90QWZmZWN0UmVzdWx0KSB7CisgIEVYUEVDVF9FUSgKKyAgICAgICIyMDExLTEwLTMxVDE4OjUyOjQyIiwKKyAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKDEzMjAwODcxNjIgKiBrTWlsbGlzUGVyU2VjICsgMjM0KSk7Cit9CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIFByaW50c0xlYWRpbmdaZXJvZXMpIHsKKyAgRVhQRUNUX0VRKCIyMDExLTA5LTAzVDA1OjA3OjAyIiwKKyAgICAgICAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKDEzMTUwMjY0MjIgKiBrTWlsbGlzUGVyU2VjKSk7Cit9CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIFByaW50czI0SG91clRpbWUpIHsKKyAgRVhQRUNUX0VRKCIyMDExLTA5LTI4VDE3OjA4OjIyIiwKKyAgICAgICAgICAgIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKDEzMTcyMjk3MDIgKiBrTWlsbGlzUGVyU2VjKSk7Cit9CisKK1RFU1RfRihGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMVRlc3QsIFByaW50c0Vwb2NoU3RhcnQpIHsKKyAgRVhQRUNUX0VRKCIxOTcwLTAxLTAxVDAwOjAwOjAwIiwgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoMCkpOworfQorCisjaWYgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorCisjIGlmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKKyMgIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MgLXctcmNoCisjIGVuZGlmCisKKy8vIFRlc3RzIHRoYXQgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBpcyB0cnVlIHdoZW4geCBpcyBhIG51bGwKKy8vIHBvaW50ZXIgbGl0ZXJhbC4KK1RFU1QoTnVsbExpdGVyYWxUZXN0LCBJc1RydWVGb3JOdWxsTGl0ZXJhbHMpIHsKKyAgRVhQRUNUX1RSVUUoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhOVUxMKSk7CisgIEVYUEVDVF9UUlVFKEdURVNUX0lTX05VTExfTElURVJBTF8oMCkpOworICBFWFBFQ1RfVFJVRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKDBVKSk7CisgIEVYUEVDVF9UUlVFKEdURVNUX0lTX05VTExfTElURVJBTF8oMEwpKTsKK30KKworLy8gVGVzdHMgdGhhdCBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIGlzIGZhbHNlIHdoZW4geCBpcyBub3QgYSBudWxsCisvLyBwb2ludGVyIGxpdGVyYWwuCitURVNUKE51bGxMaXRlcmFsVGVzdCwgSXNGYWxzZUZvck5vbk51bGxMaXRlcmFscykgeworICBFWFBFQ1RfRkFMU0UoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygxKSk7CisgIEVYUEVDVF9GQUxTRShHVEVTVF9JU19OVUxMX0xJVEVSQUxfKDAuMCkpOworICBFWFBFQ1RfRkFMU0UoR1RFU1RfSVNfTlVMTF9MSVRFUkFMXygnYScpKTsKKyAgRVhQRUNUX0ZBTFNFKEdURVNUX0lTX05VTExfTElURVJBTF8oc3RhdGljX2Nhc3Q8dm9pZCo+KE5VTEwpKSk7Cit9CisKKyMgaWZkZWYgX19CT1JMQU5EQ19fCisvLyBSZXN0b3JlcyB3YXJuaW5ncyBhZnRlciBwcmV2aW91cyAiI3ByYWdtYSBvcHRpb24gcHVzaCIgc3VwcHJlc3NlZCB0aGVtLgorIyAgcHJhZ21hIG9wdGlvbiBwb3AKKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCisvLworLy8gVGVzdHMgQ29kZVBvaW50VG9VdGY4KCkuCisKKy8vIFRlc3RzIHRoYXQgdGhlIE5VTCBjaGFyYWN0ZXIgTCdcMCcgaXMgZW5jb2RlZCBjb3JyZWN0bHkuCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZU51bCkgeworICBFWFBFQ1RfRVEoIiIsIENvZGVQb2ludFRvVXRmOChMJ1wwJykpOworfQorCisvLyBUZXN0cyB0aGF0IEFTQ0lJIGNoYXJhY3RlcnMgYXJlIGVuY29kZWQgY29ycmVjdGx5LgorVEVTVChDb2RlUG9pbnRUb1V0ZjhUZXN0LCBDYW5FbmNvZGVBc2NpaSkgeworICBFWFBFQ1RfRVEoImEiLCBDb2RlUG9pbnRUb1V0ZjgoTCdhJykpOworICBFWFBFQ1RfRVEoIloiLCBDb2RlUG9pbnRUb1V0ZjgoTCdaJykpOworICBFWFBFQ1RfRVEoIiYiLCBDb2RlUG9pbnRUb1V0ZjgoTCcmJykpOworICBFWFBFQ1RfRVEoIlx4N0YiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDdGJykpOworfQorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDggdG8gMTEgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTEweHh4eHggMTB4eHh4eHguCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZThUbzExQml0cykgeworICAvLyAwMDAgMTEwMSAwMDExID0+IDExMC0wMDAxMSAxMC0wMTAwMTEKKyAgRVhQRUNUX0VRKCJceEMzXHg5MyIsIENvZGVQb2ludFRvVXRmOChMJ1x4RDMnKSk7CisKKyAgLy8gMTAxIDAxMTEgMDExMCA9PiAxMTAtMTAxMDEgMTAtMTEwMTEwCisgIC8vIFNvbWUgY29tcGlsZXJzIChlLmcuLCBHQ0Mgb24gTWluR1cpIGNhbm5vdCBoYW5kbGUgbm9uLUFTQ0lJIGNvZGVwb2ludHMKKyAgLy8gaW4gd2lkZSBzdHJpbmdzIGFuZCB3aWRlIGNoYXJzLiBJbiBvcmRlciB0byBhY2NvbW9kYXRlIHRoZW0sIHdlIGhhdmUgdG8KKyAgLy8gaW50cm9kdWNlIHN1Y2ggY2hhcmFjdGVyIGNvbnN0YW50cyBhcyBpbnRlZ2Vycy4KKyAgRVhQRUNUX0VRKCJceEQ1XHhCNiIsCisgICAgICAgICAgICBDb2RlUG9pbnRUb1V0Zjgoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg1NzYpKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgVW5pY29kZSBjb2RlLXBvaW50cyB0aGF0IGhhdmUgMTIgdG8gMTYgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHguCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZTEyVG8xNkJpdHMpIHsKKyAgLy8gMDAwMCAxMDAwIDExMDEgMDAxMSA9PiAxMTEwLTAwMDAgMTAtMTAwMDExIDEwLTAxMDAxMQorICBFWFBFQ1RfRVEoIlx4RTBceEEzXHg5MyIsCisgICAgICAgICAgICBDb2RlUG9pbnRUb1V0Zjgoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHg4RDMpKSk7CisKKyAgLy8gMTEwMCAwMTExIDAxMDAgMTEwMSA9PiAxMTEwLTExMDAgMTAtMDExMTAxIDEwLTAwMTEwMQorICBFWFBFQ1RfRVEoIlx4RUNceDlEXHg4RCIsCisgICAgICAgICAgICBDb2RlUG9pbnRUb1V0Zjgoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oMHhDNzREKSkpOworfQorCisjaWYgIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisvLyBUZXN0cyBpbiB0aGlzIGdyb3VwIHJlcXVpcmUgYSB3Y2hhcl90IHRvIGhvbGQgPiAxNiBiaXRzLCBhbmQgdGh1cworLy8gYXJlIHNraXBwZWQgb24gV2luZG93cywgQ3lnd2luLCBhbmQgU3ltYmlhbiwgd2hlcmUgYSB3Y2hhcl90IGlzCisvLyAxNi1iaXQgd2lkZS4gVGhpcyBjb2RlIG1heSBub3QgY29tcGlsZSBvbiB0aG9zZSBzeXN0ZW1zLgorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDE3IHRvIDIxIGJpdHMgYXJlIGVuY29kZWQKKy8vIGFzIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4LgorVEVTVChDb2RlUG9pbnRUb1V0ZjhUZXN0LCBDYW5FbmNvZGUxN1RvMjFCaXRzKSB7CisgIC8vIDAgMDAwMSAwMDAwIDEwMDAgMTEwMSAwMDExID0+IDExMTEwLTAwMCAxMC0wMTAwMDAgMTAtMTAwMDExIDEwLTAxMDAxMQorICBFWFBFQ1RfRVEoIlx4RjBceDkwXHhBM1x4OTMiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEwOEQzJykpOworCisgIC8vIDAgMDAwMSAwMDAwIDAxMDAgMDAwMCAwMDAwID0+IDExMTEwLTAwMCAxMC0wMTAwMDAgMTAtMDEwMDAwIDEwLTAwMDAwMAorICBFWFBFQ1RfRVEoIlx4RjBceDkwXHg5MFx4ODAiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEwNDAwJykpOworCisgIC8vIDEgMDAwMCAxMDAwIDAxMTAgMDAxMSAwMTAwID0+IDExMTEwLTEwMCAxMC0wMDEwMDAgMTAtMDExMDAwIDEwLTExMDEwMAorICBFWFBFQ1RfRVEoIlx4RjRceDg4XHg5OFx4QjQiLCBDb2RlUG9pbnRUb1V0ZjgoTCdceDEwODYzNCcpKTsKK30KKworLy8gVGVzdHMgdGhhdCBlbmNvZGluZyBhbiBpbnZhbGlkIGNvZGUtcG9pbnQgZ2VuZXJhdGVzIHRoZSBleHBlY3RlZCByZXN1bHQuCitURVNUKENvZGVQb2ludFRvVXRmOFRlc3QsIENhbkVuY29kZUludmFsaWRDb2RlUG9pbnQpIHsKKyAgRVhQRUNUX0VRKCIoSW52YWxpZCBVbmljb2RlIDB4MTIzNEFCQ0QpIiwgQ29kZVBvaW50VG9VdGY4KEwnXHgxMjM0QUJDRCcpKTsKK30KKworI2VuZGlmICAvLyAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KKworLy8gVGVzdHMgV2lkZVN0cmluZ1RvVXRmOCgpLgorCisvLyBUZXN0cyB0aGF0IHRoZSBOVUwgY2hhcmFjdGVyIEwnXDAnIGlzIGVuY29kZWQgY29ycmVjdGx5LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlTnVsKSB7CisgIEVYUEVDVF9TVFJFUSgiIiwgV2lkZVN0cmluZ1RvVXRmOChMIiIsIDApLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIiIsIFdpZGVTdHJpbmdUb1V0ZjgoTCIiLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgQVNDSUkgc3RyaW5ncyBhcmUgZW5jb2RlZCBjb3JyZWN0bHkuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGVBc2NpaSkgeworICBFWFBFQ1RfU1RSRVEoImEiLCBXaWRlU3RyaW5nVG9VdGY4KEwiYSIsIDEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImFiIiwgV2lkZVN0cmluZ1RvVXRmOChMImFiIiwgMikuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiYSIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJhIiwgLTEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoImFiIiwgV2lkZVN0cmluZ1RvVXRmOChMImFiIiwgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDggdG8gMTEgYml0cyBhcmUgZW5jb2RlZAorLy8gYXMgMTEweHh4eHggMTB4eHh4eHguCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGU4VG8xMUJpdHMpIHsKKyAgLy8gMDAwIDExMDEgMDAxMSA9PiAxMTAtMDAwMTEgMTAtMDEwMDExCisgIEVYUEVDVF9TVFJFUSgiXHhDM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHhEMyIsIDEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIlx4QzNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4RDMiLCAtMSkuY19zdHIoKSk7CisKKyAgLy8gMTAxIDAxMTEgMDExMCA9PiAxMTAtMTAxMDEgMTAtMTEwMTEwCisgIGNvbnN0IHdjaGFyX3Qgc1tdID0geyAweDU3NiwgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RDVceEI2IiwgV2lkZVN0cmluZ1RvVXRmOChzLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEQ1XHhCNiIsIFdpZGVTdHJpbmdUb1V0ZjgocywgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IFVuaWNvZGUgY29kZS1wb2ludHMgdGhhdCBoYXZlIDEyIHRvIDE2IGJpdHMgYXJlIGVuY29kZWQKKy8vIGFzIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlMTJUbzE2Qml0cykgeworICAvLyAwMDAwIDEwMDAgMTEwMSAwMDExID0+IDExMTAtMDAwMCAxMC0xMDAwMTEgMTAtMDEwMDExCisgIGNvbnN0IHdjaGFyX3QgczFbXSA9IHsgMHg4RDMsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEUwXHhBM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KHMxLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEUwXHhBM1x4OTMiLCBXaWRlU3RyaW5nVG9VdGY4KHMxLCAtMSkuY19zdHIoKSk7CisKKyAgLy8gMTEwMCAwMTExIDAxMDAgMTEwMSA9PiAxMTEwLTExMDAgMTAtMDExMTAxIDEwLTAwMTEwMQorICBjb25zdCB3Y2hhcl90IHMyW10gPSB7IDB4Qzc0RCwgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RUNceDlEXHg4RCIsIFdpZGVTdHJpbmdUb1V0ZjgoczIsIDEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIlx4RUNceDlEXHg4RCIsIFdpZGVTdHJpbmdUb1V0ZjgoczIsIC0xKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgY29udmVyc2lvbiBzdG9wcyB3aGVuIHRoZSBmdW5jdGlvbiBlbmNvdW50ZXJzIFwwIGNoYXJhY3Rlci4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIFN0b3BzT25OdWxDaGFyYWN0ZXIpIHsKKyAgRVhQRUNUX1NUUkVRKCJBQkMiLCBXaWRlU3RyaW5nVG9VdGY4KEwiQUJDXDBYWVoiLCAxMDApLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBjb252ZXJzaW9uIHN0b3BzIHdoZW4gdGhlIGZ1bmN0aW9uIHJlYWNoZXMgdGhlIGxpbWl0CisvLyBzcGVjaWZpZWQgYnkgdGhlICdsZW5ndGgnIHBhcmFtZXRlci4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIFN0b3BzV2hlbkxlbmd0aExpbWl0UmVhY2hlZCkgeworICBFWFBFQ1RfU1RSRVEoIkFCQyIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJBQkNERUYiLCAzKS5jX3N0cigpKTsKK30KKworI2lmICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XworLy8gVGVzdHMgdGhhdCBVbmljb2RlIGNvZGUtcG9pbnRzIHRoYXQgaGF2ZSAxNyB0byAyMSBiaXRzIGFyZSBlbmNvZGVkCisvLyBhcyAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eC4gVGhpcyBjb2RlIG1heSBub3QgY29tcGlsZQorLy8gb24gdGhlIHN5c3RlbXMgdXNpbmcgVVRGLTE2IGVuY29kaW5nLgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlMTdUbzIxQml0cykgeworICAvLyAwIDAwMDEgMDAwMCAxMDAwIDExMDEgMDAxMSA9PiAxMTExMC0wMDAgMTAtMDEwMDAwIDEwLTEwMDAxMSAxMC0wMTAwMTEKKyAgRVhQRUNUX1NUUkVRKCJceEYwXHg5MFx4QTNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4MTA4RDMiLCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJceEYwXHg5MFx4QTNceDkzIiwgV2lkZVN0cmluZ1RvVXRmOChMIlx4MTA4RDMiLCAtMSkuY19zdHIoKSk7CisKKyAgLy8gMSAwMDAwIDEwMDAgMDExMCAwMDExIDAxMDAgPT4gMTExMTAtMTAwIDEwLTAwMTAwMCAxMC0wMTEwMDAgMTAtMTEwMTAwCisgIEVYUEVDVF9TVFJFUSgiXHhGNFx4ODhceDk4XHhCNCIsIFdpZGVTdHJpbmdUb1V0ZjgoTCJceDEwODYzNCIsIDEpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIlx4RjRceDg4XHg5OFx4QjQiLCBXaWRlU3RyaW5nVG9VdGY4KEwiXHgxMDg2MzQiLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgZW5jb2RpbmcgYW4gaW52YWxpZCBjb2RlLXBvaW50IGdlbmVyYXRlcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LgorVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ2FuRW5jb2RlSW52YWxpZENvZGVQb2ludCkgeworICBFWFBFQ1RfU1RSRVEoIihJbnZhbGlkIFVuaWNvZGUgMHhBQkNERkYpIiwKKyAgICAgICAgICAgICAgIFdpZGVTdHJpbmdUb1V0ZjgoTCJceEFCQ0RGRiIsIC0xKS5jX3N0cigpKTsKK30KKyNlbHNlICAvLyAhR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8KKy8vIFRlc3RzIHRoYXQgc3Vycm9nYXRlIHBhaXJzIGFyZSBlbmNvZGVkIGNvcnJlY3RseSBvbiB0aGUgc3lzdGVtcyB1c2luZworLy8gVVRGLTE2IGVuY29kaW5nIGluIHRoZSB3aWRlIHN0cmluZ3MuCitURVNUKFdpZGVTdHJpbmdUb1V0ZjhUZXN0LCBDYW5FbmNvZGVWYWxpZFV0ZjE2U1Vycm9nYXRlUGFpcnMpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSB7IDB4RDgwMSwgMHhEQzAwLCAnXDAnIH07CisgIEVYUEVDVF9TVFJFUSgiXHhGMFx4OTBceDkwXHg4MCIsIFdpZGVTdHJpbmdUb1V0ZjgocywgLTEpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGVuY29kaW5nIGFuIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCisvLyBnZW5lcmF0ZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENhbkVuY29kZUludmFsaWRVdGYxNlN1cnJvZ2F0ZVBhaXIpIHsKKyAgLy8gTGVhZGluZyBzdXJyb2dhdGUgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICBjb25zdCB3Y2hhcl90IHMxW10gPSB7IDB4RDgwMCwgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RURceEEwXHg4MCIsIFdpZGVTdHJpbmdUb1V0ZjgoczEsIC0xKS5jX3N0cigpKTsKKyAgLy8gTGVhZGluZyBzdXJyb2dhdGUgaXMgbm90IGZvbGxvd2VkIGJ5IHRoZSB0cmFpbGluZyBzdXJyb2dhdGUuCisgIGNvbnN0IHdjaGFyX3QgczJbXSA9IHsgMHhEODAwLCAnTScsICdcMCcgfTsKKyAgRVhQRUNUX1NUUkVRKCJceEVEXHhBMFx4ODBNIiwgV2lkZVN0cmluZ1RvVXRmOChzMiwgLTEpLmNfc3RyKCkpOworICAvLyBUcmFpbGluZyBzdXJyb2dhdGUgYXBwZWFyYXMgd2l0aG91dCBhIGxlYWRpbmcgc3Vycm9nYXRlLgorICBjb25zdCB3Y2hhcl90IHMzW10gPSB7IDB4REMwMCwgJ1AnLCAnUScsICdSJywgJ1wwJyB9OworICBFWFBFQ1RfU1RSRVEoIlx4RURceEIwXHg4MFBRUiIsIFdpZGVTdHJpbmdUb1V0ZjgoczMsIC0xKS5jX3N0cigpKTsKK30KKyNlbmRpZiAgLy8gIUdURVNUX1dJREVfU1RSSU5HX1VTRVNfVVRGMTZfCisKKy8vIFRlc3RzIHRoYXQgY29kZXBvaW50IGNvbmNhdGVuYXRpb24gd29ya3MgY29ycmVjdGx5LgorI2lmICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XworVEVTVChXaWRlU3RyaW5nVG9VdGY4VGVzdCwgQ29uY2F0ZW5hdGVzQ29kZXBvaW50c0NvcnJlY3RseSkgeworICBjb25zdCB3Y2hhcl90IHNbXSA9IHsgMHgxMDg2MzQsIDB4Qzc0RCwgJ1xuJywgMHg1NzYsIDB4OEQzLCAweDEwODYzNCwgJ1wwJ307CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJceEY0XHg4OFx4OThceEI0IgorICAgICAgICAgICJceEVDXHg5RFx4OEQiCisgICAgICAgICAgIlxuIgorICAgICAgICAgICJceEQ1XHhCNiIKKyAgICAgICAgICAiXHhFMFx4QTNceDkzIgorICAgICAgICAgICJceEY0XHg4OFx4OThceEI0IiwKKyAgICAgIFdpZGVTdHJpbmdUb1V0ZjgocywgLTEpLmNfc3RyKCkpOworfQorI2Vsc2UKK1RFU1QoV2lkZVN0cmluZ1RvVXRmOFRlc3QsIENvbmNhdGVuYXRlc0NvZGVwb2ludHNDb3JyZWN0bHkpIHsKKyAgY29uc3Qgd2NoYXJfdCBzW10gPSB7IDB4Qzc0RCwgJ1xuJywgMHg1NzYsIDB4OEQzLCAnXDAnfTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlx4RUNceDlEXHg4RCIgIlxuIiAiXHhENVx4QjYiICJceEUwXHhBM1x4OTMiLAorICAgICAgV2lkZVN0cmluZ1RvVXRmOChzLCAtMSkuY19zdHIoKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XworCisvLyBUZXN0cyB0aGUgUmFuZG9tIGNsYXNzLgorCitURVNUKFJhbmRvbURlYXRoVGVzdCwgR2VuZXJhdGVzQ3Jhc2hlc09uSW52YWxpZFJhbmdlKSB7CisgIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tKDQyKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIHJhbmRvbS5HZW5lcmF0ZSgwKSwKKyAgICAgICJDYW5ub3QgZ2VuZXJhdGUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFxcWzAsIDBcXCkiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKKyAgICAgIHJhbmRvbS5HZW5lcmF0ZSh0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tOjprTWF4UmFuZ2UgKyAxKSwKKyAgICAgICJHZW5lcmF0aW9uIG9mIGEgbnVtYmVyIGluIFxcWzAsIDIxNDc0ODM2NDlcXCkgd2FzIHJlcXVlc3RlZCwgIgorICAgICAgImJ1dCB0aGlzIGNhbiBvbmx5IGdlbmVyYXRlIG51bWJlcnMgaW4gXFxbMCwgMjE0NzQ4MzY0OFxcKSIpOworfQorCitURVNUKFJhbmRvbVRlc3QsIEdlbmVyYXRlc051bWJlcnNXaXRoaW5SYW5nZSkgeworICBjb25zdCBVSW50MzIga1JhbmdlID0gMTAwMDA7CisgIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tKDEyMzQ1KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgRVhQRUNUX0xUKHJhbmRvbS5HZW5lcmF0ZShrUmFuZ2UpLCBrUmFuZ2UpIDw8ICIgZm9yIGl0ZXJhdGlvbiAiIDw8IGk7CisgIH0KKworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbTIodGVzdGluZzo6aW50ZXJuYWw6OlJhbmRvbTo6a01heFJhbmdlKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgRVhQRUNUX0xUKHJhbmRvbTIuR2VuZXJhdGUoa1JhbmdlKSwga1JhbmdlKSA8PCAiIGZvciBpdGVyYXRpb24gIiA8PCBpOworICB9Cit9CisKK1RFU1QoUmFuZG9tVGVzdCwgUmVwZWF0c1doZW5SZXNlZWRlZCkgeworICBjb25zdCBpbnQga1NlZWQgPSAxMjM7CisgIGNvbnN0IGludCBrQXJyYXlTaXplID0gMTA7CisgIGNvbnN0IFVJbnQzMiBrUmFuZ2UgPSAxMDAwMDsKKyAgVUludDMyIHZhbHVlc1trQXJyYXlTaXplXTsKKworICB0ZXN0aW5nOjppbnRlcm5hbDo6UmFuZG9tIHJhbmRvbShrU2VlZCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0FycmF5U2l6ZTsgaSsrKSB7CisgICAgdmFsdWVzW2ldID0gcmFuZG9tLkdlbmVyYXRlKGtSYW5nZSk7CisgIH0KKworICByYW5kb20uUmVzZWVkKGtTZWVkKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQXJyYXlTaXplOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEodmFsdWVzW2ldLCByYW5kb20uR2VuZXJhdGUoa1JhbmdlKSkgPDwgIiBmb3IgaXRlcmF0aW9uICIgPDwgaTsKKyAgfQorfQorCisvLyBUZXN0cyBTVEwgY29udGFpbmVyIHV0aWxpdGllcy4KKworLy8gVGVzdHMgQ291bnRJZigpLgorCitzdGF0aWMgYm9vbCBJc1Bvc2l0aXZlKGludCBuKSB7IHJldHVybiBuID4gMDsgfQorCitURVNUKENvbnRhaW5lclV0aWxpdHlUZXN0LCBDb3VudElmKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gdjsKKyAgRVhQRUNUX0VRKDAsIENvdW50SWYodiwgSXNQb3NpdGl2ZSkpOyAgLy8gV29ya3MgZm9yIGFuIGVtcHR5IGNvbnRhaW5lci4KKworICB2LnB1c2hfYmFjaygtMSk7CisgIHYucHVzaF9iYWNrKDApOworICBFWFBFQ1RfRVEoMCwgQ291bnRJZih2LCBJc1Bvc2l0aXZlKSk7ICAvLyBXb3JrcyB3aGVuIG5vIHZhbHVlIHNhdGlzZmllcy4KKworICB2LnB1c2hfYmFjaygyKTsKKyAgdi5wdXNoX2JhY2soLTEwKTsKKyAgdi5wdXNoX2JhY2soMTApOworICBFWFBFQ1RfRVEoMiwgQ291bnRJZih2LCBJc1Bvc2l0aXZlKSk7Cit9CisKKy8vIFRlc3RzIEZvckVhY2goKS4KKworc3RhdGljIGludCBnX3N1bSA9IDA7CitzdGF0aWMgdm9pZCBBY2N1bXVsYXRlKGludCBuKSB7IGdfc3VtICs9IG47IH0KKworVEVTVChDb250YWluZXJVdGlsaXR5VGVzdCwgRm9yRWFjaCkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIGdfc3VtID0gMDsKKyAgRm9yRWFjaCh2LCBBY2N1bXVsYXRlKTsKKyAgRVhQRUNUX0VRKDAsIGdfc3VtKTsgIC8vIFdvcmtzIGZvciBhbiBlbXB0eSBjb250YWluZXI7CisKKyAgZ19zdW0gPSAwOworICB2LnB1c2hfYmFjaygxKTsKKyAgRm9yRWFjaCh2LCBBY2N1bXVsYXRlKTsKKyAgRVhQRUNUX0VRKDEsIGdfc3VtKTsgIC8vIFdvcmtzIGZvciBhIGNvbnRhaW5lciB3aXRoIG9uZSBlbGVtZW50LgorCisgIGdfc3VtID0gMDsKKyAgdi5wdXNoX2JhY2soMjApOworICB2LnB1c2hfYmFjaygzMDApOworICBGb3JFYWNoKHYsIEFjY3VtdWxhdGUpOworICBFWFBFQ1RfRVEoMzIxLCBnX3N1bSk7Cit9CisKKy8vIFRlc3RzIEdldEVsZW1lbnRPcigpLgorVEVTVChDb250YWluZXJVdGlsaXR5VGVzdCwgR2V0RWxlbWVudE9yKSB7CisgIHN0ZDo6dmVjdG9yPGNoYXI+IGE7CisgIEVYUEVDVF9FUSgneCcsIEdldEVsZW1lbnRPcihhLCAwLCAneCcpKTsKKworICBhLnB1c2hfYmFjaygnYScpOworICBhLnB1c2hfYmFjaygnYicpOworICBFWFBFQ1RfRVEoJ2EnLCBHZXRFbGVtZW50T3IoYSwgMCwgJ3gnKSk7CisgIEVYUEVDVF9FUSgnYicsIEdldEVsZW1lbnRPcihhLCAxLCAneCcpKTsKKyAgRVhQRUNUX0VRKCd4JywgR2V0RWxlbWVudE9yKGEsIC0yLCAneCcpKTsKKyAgRVhQRUNUX0VRKCd4JywgR2V0RWxlbWVudE9yKGEsIDIsICd4JykpOworfQorCitURVNUKENvbnRhaW5lclV0aWxpdHlEZWF0aFRlc3QsIFNodWZmbGVSYW5nZSkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGE7CisgIGEucHVzaF9iYWNrKDApOworICBhLnB1c2hfYmFjaygxKTsKKyAgYS5wdXNoX2JhY2soMik7CisgIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tKDEpOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBTaHVmZmxlUmFuZ2UoJnJhbmRvbSwgLTEsIDEsICZhKSwKKyAgICAgICJJbnZhbGlkIHNodWZmbGUgcmFuZ2Ugc3RhcnQgLTE6IG11c3QgYmUgaW4gcmFuZ2UgXFxbMCwgM1xcXSIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgU2h1ZmZsZVJhbmdlKCZyYW5kb20sIDQsIDQsICZhKSwKKyAgICAgICJJbnZhbGlkIHNodWZmbGUgcmFuZ2Ugc3RhcnQgNDogbXVzdCBiZSBpbiByYW5nZSBcXFswLCAzXFxdIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBTaHVmZmxlUmFuZ2UoJnJhbmRvbSwgMywgMiwgJmEpLAorICAgICAgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggMjogbXVzdCBiZSBpbiByYW5nZSBcXFszLCAzXFxdIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBTaHVmZmxlUmFuZ2UoJnJhbmRvbSwgMywgNCwgJmEpLAorICAgICAgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggNDogbXVzdCBiZSBpbiByYW5nZSBcXFszLCAzXFxdIik7Cit9CisKK2NsYXNzIFZlY3RvclNodWZmbGVUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludCBrVmVjdG9yU2l6ZSA9IDIwOworCisgIFZlY3RvclNodWZmbGVUZXN0KCkgOiByYW5kb21fKDEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtWZWN0b3JTaXplOyBpKyspIHsKKyAgICAgIHZlY3Rvcl8ucHVzaF9iYWNrKGkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBib29sIFZlY3RvcklzQ29ycnVwdChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgICBpZiAoa1ZlY3RvclNpemUgIT0gc3RhdGljX2Nhc3Q8aW50Pih2ZWN0b3Iuc2l6ZSgpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBmb3VuZF9pbl92ZWN0b3Jba1ZlY3RvclNpemVdID0geyBmYWxzZSB9OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICBjb25zdCBpbnQgZSA9IHZlY3RvcltpXTsKKyAgICAgIGlmIChlIDwgMCB8fCBlID49IGtWZWN0b3JTaXplIHx8IGZvdW5kX2luX3ZlY3RvcltlXSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGZvdW5kX2luX3ZlY3RvcltlXSA9IHRydWU7CisgICAgfQorCisgICAgLy8gVmVjdG9yIHNpemUgaXMgY29ycmVjdCwgZWxlbWVudHMnIHJhbmdlIGlzIGNvcnJlY3QsIG5vCisgICAgLy8gZHVwbGljYXRlIGVsZW1lbnRzLiAgVGhlcmVmb3JlIG5vIGNvcnJ1cHRpb24gaGFzIG9jY3VycmVkLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBib29sIFZlY3RvcklzTm90Q29ycnVwdChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgICByZXR1cm4gIVZlY3RvcklzQ29ycnVwdCh2ZWN0b3IpOworICB9CisKKyAgc3RhdGljIGJvb2wgUmFuZ2VJc1NodWZmbGVkKGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvciwgaW50IGJlZ2luLCBpbnQgZW5kKSB7CisgICAgZm9yIChpbnQgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgIGlmIChpICE9IHZlY3RvcltpXSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdGljIGJvb2wgUmFuZ2VJc1Vuc2h1ZmZsZWQoCisgICAgICBjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IsIGludCBiZWdpbiwgaW50IGVuZCkgeworICAgIHJldHVybiAhUmFuZ2VJc1NodWZmbGVkKHZlY3RvciwgYmVnaW4sIGVuZCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBWZWN0b3JJc1NodWZmbGVkKGNvbnN0IFRlc3RpbmdWZWN0b3ImIHZlY3RvcikgeworICAgIHJldHVybiBSYW5nZUlzU2h1ZmZsZWQodmVjdG9yLCAwLCBzdGF0aWNfY2FzdDxpbnQ+KHZlY3Rvci5zaXplKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIFZlY3RvcklzVW5zaHVmZmxlZChjb25zdCBUZXN0aW5nVmVjdG9yJiB2ZWN0b3IpIHsKKyAgICByZXR1cm4gIVZlY3RvcklzU2h1ZmZsZWQodmVjdG9yKTsKKyAgfQorCisgIHRlc3Rpbmc6OmludGVybmFsOjpSYW5kb20gcmFuZG9tXzsKKyAgVGVzdGluZ1ZlY3RvciB2ZWN0b3JfOworfTsgIC8vIGNsYXNzIFZlY3RvclNodWZmbGVUZXN0CisKK2NvbnN0IGludCBWZWN0b3JTaHVmZmxlVGVzdDo6a1ZlY3RvclNpemU7CisKK1RFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgSGFuZGxlc0VtcHR5UmFuZ2UpIHsKKyAgLy8gVGVzdHMgYW4gZW1wdHkgcmFuZ2UgYXQgdGhlIGJlZ2lubmluZy4uLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIDAsIDAsICZ2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOworCisgIC8vIC4uLmluIHRoZSBtaWRkbGUuLi4KKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrVmVjdG9yU2l6ZS8yLCBrVmVjdG9yU2l6ZS8yLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKKworICAvLyAuLi5hdCB0aGUgZW5kLi4uCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUgLSAxLCBrVmVjdG9yU2l6ZSAtIDEsICZ2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8pOworCisgIC8vIC4uLmFuZCBwYXN0IHRoZSBlbmQuCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1ZlY3RvclNpemUsIGtWZWN0b3JTaXplLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKK30KKworVEVTVF9GKFZlY3RvclNodWZmbGVUZXN0LCBIYW5kbGVzUmFuZ2VPZlNpemVPbmUpIHsKKyAgLy8gVGVzdHMgYSBzaXplIG9uZSByYW5nZSBhdCB0aGUgYmVnaW5uaW5nLi4uCisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywgMCwgMSwgJnZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzVW5zaHVmZmxlZCwgdmVjdG9yXyk7CisKKyAgLy8gLi4uaW4gdGhlIG1pZGRsZS4uLgorICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtWZWN0b3JTaXplLzIsIGtWZWN0b3JTaXplLzIgKyAxLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKKworICAvLyAuLi5hbmQgYXQgdGhlIGVuZC4KKyAgU2h1ZmZsZVJhbmdlKCZyYW5kb21fLCBrVmVjdG9yU2l6ZSAtIDEsIGtWZWN0b3JTaXplLCAmdmVjdG9yXyk7CisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNVbnNodWZmbGVkLCB2ZWN0b3JfKTsKK30KKworLy8gQmVjYXVzZSB3ZSB1c2Ugb3VyIG93biByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBhbmQgYSBmaXhlZCBzZWVkLAorLy8gd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBmb2xsb3dpbmcgInJhbmRvbSIgdGVzdHMgd2lsbCBzdWNjZWVkLgorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzRW50aXJlVmVjdG9yKSB7CisgIFNodWZmbGUoJnJhbmRvbV8sICZ2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yXyk7CisgIEVYUEVDVF9GQUxTRShWZWN0b3JJc1Vuc2h1ZmZsZWQodmVjdG9yXykpIDw8IHZlY3Rvcl87CisKKyAgLy8gVGVzdHMgdGhlIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnRzIGluIHBhcnRpY3VsYXIgdG8gZW5zdXJlIHRoYXQKKyAgLy8gdGhlcmUgYXJlIG5vIG9mZi1ieS1vbmUgcHJvYmxlbXMgaW4gb3VyIHNodWZmbGUgYWxnb3JpdGhtLgorICBFWFBFQ1RfTkUoMCwgdmVjdG9yX1swXSk7CisgIEVYUEVDVF9ORShrVmVjdG9yU2l6ZSAtIDEsIHZlY3Rvcl9ba1ZlY3RvclNpemUgLSAxXSk7Cit9CisKK1RFU1RfRihWZWN0b3JTaHVmZmxlVGVzdCwgU2h1ZmZsZXNTdGFydE9mVmVjdG9yKSB7CisgIGNvbnN0IGludCBrUmFuZ2VTaXplID0ga1ZlY3RvclNpemUvMjsKKworICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIDAsIGtSYW5nZVNpemUsICZ2ZWN0b3JfKTsKKworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNTaHVmZmxlZCwgdmVjdG9yXywgMCwga1JhbmdlU2l6ZSk7CisgIEVYUEVDVF9QUkVEMyhSYW5nZUlzVW5zaHVmZmxlZCwgdmVjdG9yXywga1JhbmdlU2l6ZSwga1ZlY3RvclNpemUpOworfQorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzRW5kT2ZWZWN0b3IpIHsKKyAgY29uc3QgaW50IGtSYW5nZVNpemUgPSBrVmVjdG9yU2l6ZSAvIDI7CisgIFNodWZmbGVSYW5nZSgmcmFuZG9tXywga1JhbmdlU2l6ZSwga1ZlY3RvclNpemUsICZ2ZWN0b3JfKTsKKworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNVbnNodWZmbGVkLCB2ZWN0b3JfLCAwLCBrUmFuZ2VTaXplKTsKKyAgRVhQRUNUX1BSRUQzKFJhbmdlSXNTaHVmZmxlZCwgdmVjdG9yXywga1JhbmdlU2l6ZSwga1ZlY3RvclNpemUpOworfQorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzTWlkZGxlT2ZWZWN0b3IpIHsKKyAgaW50IGtSYW5nZVNpemUgPSBrVmVjdG9yU2l6ZS8zOworICBTaHVmZmxlUmFuZ2UoJnJhbmRvbV8sIGtSYW5nZVNpemUsIDIqa1JhbmdlU2l6ZSwgJnZlY3Rvcl8pOworCisgIEFTU0VSVF9QUkVEMShWZWN0b3JJc05vdENvcnJ1cHQsIHZlY3Rvcl8pOworICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8sIDAsIGtSYW5nZVNpemUpOworICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1NodWZmbGVkLCB2ZWN0b3JfLCBrUmFuZ2VTaXplLCAyKmtSYW5nZVNpemUpOworICBFWFBFQ1RfUFJFRDMoUmFuZ2VJc1Vuc2h1ZmZsZWQsIHZlY3Rvcl8sIDIqa1JhbmdlU2l6ZSwga1ZlY3RvclNpemUpOworfQorCitURVNUX0YoVmVjdG9yU2h1ZmZsZVRlc3QsIFNodWZmbGVzUmVwZWF0YWJseSkgeworICBUZXN0aW5nVmVjdG9yIHZlY3RvcjI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga1ZlY3RvclNpemU7IGkrKykgeworICAgIHZlY3RvcjIucHVzaF9iYWNrKGkpOworICB9CisKKyAgcmFuZG9tXy5SZXNlZWQoMTIzNCk7CisgIFNodWZmbGUoJnJhbmRvbV8sICZ2ZWN0b3JfKTsKKyAgcmFuZG9tXy5SZXNlZWQoMTIzNCk7CisgIFNodWZmbGUoJnJhbmRvbV8sICZ2ZWN0b3IyKTsKKworICBBU1NFUlRfUFJFRDEoVmVjdG9ySXNOb3RDb3JydXB0LCB2ZWN0b3JfKTsKKyAgQVNTRVJUX1BSRUQxKFZlY3RvcklzTm90Q29ycnVwdCwgdmVjdG9yMik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVmVjdG9yU2l6ZTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKHZlY3Rvcl9baV0sIHZlY3RvcjJbaV0pIDw8ICIgd2hlcmUgaSBpcyAiIDw8IGk7CisgIH0KK30KKworLy8gVGVzdHMgdGhlIHNpemUgb2YgdGhlIEFzc2VydEhlbHBlciBjbGFzcy4KKworVEVTVChBc3NlcnRIZWxwZXJUZXN0LCBBc3NlcnRIZWxwZXJJc1NtYWxsKSB7CisgIC8vIFRvIGF2b2lkIGJyZWFraW5nIGNsaWVudHMgdGhhdCB1c2UgbG90cyBvZiBhc3NlcnRpb25zIGluIG9uZQorICAvLyBmdW5jdGlvbiwgd2UgY2Fubm90IGdyb3cgdGhlIHNpemUgb2YgQXNzZXJ0SGVscGVyLgorICBFWFBFQ1RfTEUoc2l6ZW9mKHRlc3Rpbmc6OmludGVybmFsOjpBc3NlcnRIZWxwZXIpLCBzaXplb2Yodm9pZCopKTsKK30KKworLy8gVGVzdHMgU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgpLgorVEVTVChTdHJpbmdUZXN0LCBFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSkgeworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJmb29iYXIiLCAiQkFSIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJmb29iYVIiLCAiYmFyIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJmb29iYXIiLCAiIikpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCIiLCAiIikpOworCisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKCJGb29iYXIiLCAiZm9vIikpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgiZm9vYmFyIiwgIkZvbyIpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6RW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoIiIsICJmb28iKSk7Cit9CisKKy8vIEMrK0J1aWxkZXIncyBwcmVwcm9jZXNzb3IgaXMgYnVnZ3k7IGl0IGZhaWxzIHRvIGV4cGFuZCBtYWNyb3MgdGhhdAorLy8gYXBwZWFyIGluIG1hY3JvIHBhcmFtZXRlcnMgYWZ0ZXIgd2lkZSBjaGFyIGxpdGVyYWxzLiAgUHJvdmlkZSBhbiBhbGlhcworLy8gZm9yIE5VTEwgYXMgYSB3b3JrYXJvdW5kLgorc3RhdGljIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGtOdWxsID0gTlVMTDsKKworLy8gVGVzdHMgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscworVEVTVChTdHJpbmdUZXN0LCBDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscykgeworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKE5VTEwsIE5VTEwpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoa051bGwsIEwiIikpOworICBFWFBFQ1RfRkFMU0UoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhMIiIsIGtOdWxsKSk7CisgIEVYUEVDVF9GQUxTRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGtOdWxsLCBMImZvb2JhciIpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCJmb29iYXIiLCBrTnVsbCkpOworICBFWFBFQ1RfVFJVRShTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKEwiZm9vYmFyIiwgTCJmb29iYXIiKSk7CisgIEVYUEVDVF9UUlVFKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoTCJmb29iYXIiLCBMIkZPT0JBUiIpKTsKKyAgRVhQRUNUX1RSVUUoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhMIkZPT0JBUiIsIEwiZm9vYmFyIikpOworfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZygpLgorVEVTVChTdHJpbmdUZXN0LCBTaG93V2lkZUNTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLAorICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoTlVMTCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiIiwgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoTCIiKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyhMImZvbyIpLmNfc3RyKCkpOworfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitURVNUKFN0cmluZ1Rlc3QsIEFuc2lBbmRVdGYxNk51bGwpIHsKKyAgRVhQRUNUX0VRKE5VTEwsIFN0cmluZzo6QW5zaVRvVXRmMTYoTlVMTCkpOworICBFWFBFQ1RfRVEoTlVMTCwgU3RyaW5nOjpVdGYxNlRvQW5zaShOVUxMKSk7Cit9CisKK1RFU1QoU3RyaW5nVGVzdCwgQW5zaUFuZFV0ZjE2Q29udmVydEJhc2ljKSB7CisgIGNvbnN0IGNoYXIqIGFuc2kgPSBTdHJpbmc6OlV0ZjE2VG9BbnNpKEwic3RyIik7CisgIEVYUEVDVF9TVFJFUSgic3RyIiwgYW5zaSk7CisgIGRlbGV0ZSBbXSBhbnNpOworICBjb25zdCBXQ0hBUiogdXRmMTYgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KCJzdHIiKTsKKyAgRVhQRUNUX0VRKDAsIHdjc25jbXAoTCJzdHIiLCB1dGYxNiwgMykpOworICBkZWxldGUgW10gdXRmMTY7Cit9CisKK1RFU1QoU3RyaW5nVGVzdCwgQW5zaUFuZFV0ZjE2Q29udmVydFBhdGhDaGFycykgeworICBjb25zdCBjaGFyKiBhbnNpID0gU3RyaW5nOjpVdGYxNlRvQW5zaShMIi46XFwgXCIqPyIpOworICBFWFBFQ1RfU1RSRVEoIi46XFwgXCIqPyIsIGFuc2kpOworICBkZWxldGUgW10gYW5zaTsKKyAgY29uc3QgV0NIQVIqIHV0ZjE2ID0gU3RyaW5nOjpBbnNpVG9VdGYxNigiLjpcXCBcIio/Iik7CisgIEVYUEVDVF9FUSgwLCB3Y3NuY21wKEwiLjpcXCBcIio/IiwgdXRmMTYsIDMpKTsKKyAgZGVsZXRlIFtdIHV0ZjE2OworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFRlc3RzIFRlc3RQcm9wZXJ0eSBjb25zdHJ1Y3Rpb24uCitURVNUKFRlc3RQcm9wZXJ0eVRlc3QsIFN0cmluZ1ZhbHVlKSB7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5IiwgIjEiKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMSIsIHByb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UHJvcGVydHkgcmVwbGFjaW5nIGEgdmFsdWUuCitURVNUKFRlc3RQcm9wZXJ0eVRlc3QsIFJlcGxhY2VTdHJpbmdWYWx1ZSkgeworICBUZXN0UHJvcGVydHkgcHJvcGVydHkoImtleSIsICIxIik7CisgIEVYUEVDVF9TVFJFUSgiMSIsIHByb3BlcnR5LnZhbHVlKCkpOworICBwcm9wZXJ0eS5TZXRWYWx1ZSgiMiIpOworICBFWFBFQ1RfU1RSRVEoIjIiLCBwcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gQWRkRmF0YWxGYWlsdXJlKCkgYW5kIEFkZE5vbmZhdGFsRmFpbHVyZSgpIG11c3QgYmUgc3RhbmQtYWxvbmUKKy8vIGZ1bmN0aW9ucyAoaS5lLiB0aGVpciBkZWZpbml0aW9ucyBjYW5ub3QgYmUgaW5saW5lZCBhdCB0aGUgY2FsbAorLy8gc2l0ZXMpLCBvciBDKytCdWlsZGVyIHdvbid0IGNvbXBpbGUgdGhlIGNvZGUuCitzdGF0aWMgdm9pZCBBZGRGYXRhbEZhaWx1cmUoKSB7CisgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iOworfQorCitzdGF0aWMgdm9pZCBBZGROb25mYXRhbEZhaWx1cmUoKSB7CisgIEFERF9GQUlMVVJFKCkgPDwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiI7Cit9CisKK2NsYXNzIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6ICAvLyBNdXN0IGJlIHB1YmxpYyBhbmQgbm90IHByb3RlY3RlZCBkdWUgdG8gYSBidWcgaW4gZysrIDMuNC4yLgorICBlbnVtIEZhaWx1cmVNb2RlIHsKKyAgICBGQVRBTF9GQUlMVVJFLAorICAgIE5PTkZBVEFMX0ZBSUxVUkUKKyAgfTsKKyAgc3RhdGljIHZvaWQgQWRkRmFpbHVyZShGYWlsdXJlTW9kZSBmYWlsdXJlKSB7CisgICAgaWYgKGZhaWx1cmUgPT0gRkFUQUxfRkFJTFVSRSkgeworICAgICAgQWRkRmF0YWxGYWlsdXJlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZE5vbmZhdGFsRmFpbHVyZSgpOworICAgIH0KKyAgfQorfTsKKworLy8gVGVzdHMgdGhhdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBpbnRlcmNlcHRzIHRlc3QKKy8vIGZhaWx1cmVzLgorVEVTVF9GKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCwgSW50ZXJjZXB0c1Rlc3RGYWlsdXJlcykgeworICBUZXN0UGFydFJlc3VsdEFycmF5IHJlc3VsdHM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciByZXBvcnRlcigKKyAgICAgICAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELAorICAgICAgICAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlKEZBVEFMX0ZBSUxVUkUpOworICB9CisKKyAgRVhQRUNUX0VRKDIsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKS5mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworVEVTVF9GKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCwgRGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgeworICAgIC8vIFRlc3RzLCB0aGF0IHRoZSBkZXByZWNhdGVkIGNvbnN0cnVjdG9yIHN0aWxsIHdvcmtzLgorICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKCZyZXN1bHRzKTsKKyAgICBBZGRGYWlsdXJlKE5PTkZBVEFMX0ZBSUxVUkUpOworICB9CisgIEVYUEVDVF9FUSgxLCByZXN1bHRzLnNpemUoKSk7Cit9CisKKyNpZiBHVEVTVF9JU19USFJFQURTQUZFCisKK2NsYXNzIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyV2l0aFRocmVhZHNUZXN0CisgIDogcHVibGljIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChGYWlsdXJlTW9kZSBmYWlsdXJlKSB7CisgICAgVGhyZWFkV2l0aFBhcmFtPEZhaWx1cmVNb2RlPiB0aHJlYWQoJkFkZEZhaWx1cmUsIGZhaWx1cmUsIE5VTEwpOworICAgIHRocmVhZC5Kb2luKCk7CisgIH0KK307CisKK1RFU1RfRihTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcldpdGhUaHJlYWRzVGVzdCwKKyAgICAgICBJbnRlcmNlcHRzVGVzdEZhaWx1cmVzSW5BbGxUaHJlYWRzKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgcmVzdWx0czsKKyAgeworICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyKAorICAgICAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SU5URVJDRVBUX0FMTF9USFJFQURTLCAmcmVzdWx0cyk7CisgICAgQWRkRmFpbHVyZShOT05GQVRBTF9GQUlMVVJFKTsKKyAgICBBZGRGYWlsdXJlKEZBVEFMX0ZBSUxVUkUpOworICAgIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKE5PTkZBVEFMX0ZBSUxVUkUpOworICAgIEFkZEZhaWx1cmVJbk90aGVyVGhyZWFkKEZBVEFMX0ZBSUxVUkUpOworICB9CisKKyAgRVhQRUNUX0VRKDQsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgxKS5mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgyKS5ub25mYXRhbGx5X2ZhaWxlZCgpKTsKKyAgRVhQRUNUX1RSVUUocmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgzKS5mYXRhbGx5X2ZhaWxlZCgpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9JU19USFJFQURTQUZFCisKKy8vIFRlc3RzIEVYUEVDVF9GQVRBTF9GQUlMVVJFeyxPTl9BTExfVEhSRUFEU30uICBNYWtlcyBzdXJlIHRoYXQgdGhleQorLy8gd29yayBldmVuIGlmIHRoZSBmYWlsdXJlIGlzIGdlbmVyYXRlZCBpbiBhIGNhbGxlZCBmdW5jdGlvbiByYXRoZXIgdGhhbgorLy8gdGhlIGN1cnJlbnQgY29udGV4dC4KKwordHlwZWRlZiBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlclRlc3QgRXhwZWN0RmF0YWxGYWlsdXJlVGVzdDsKKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIENhdGNoZXNGYXRhbEZhbGl1cmUpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmF0YWxGYWlsdXJlKCksICJFeHBlY3RlZCBmYXRhbCBmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK1RFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFkZEZhdGFsRmFpbHVyZSgpLCA6OnN0cmluZygiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKSk7Cit9CisjZW5kaWYKKworVEVTVF9GKEV4cGVjdEZhdGFsRmFpbHVyZVRlc3QsIEFjY2VwdHNTdGRTdHJpbmdPYmplY3QpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQWRkRmF0YWxGYWlsdXJlKCksCisgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIikpOworfQorCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQ2F0Y2hlc0ZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICAvLyBXZSBoYXZlIGFub3RoZXIgdGVzdCBiZWxvdyB0byB2ZXJpZnkgdGhhdCB0aGUgbWFjcm8gY2F0Y2hlcyBmYXRhbAorICAvLyBmYWlsdXJlcyBnZW5lcmF0ZWQgb24gYW5vdGhlciB0aHJlYWQuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZEZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmF0YWwgZmFpbHVyZS4iKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiCisjIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MKKyNlbmRpZgorCisvLyBUZXN0cyB0aGF0IEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgY2FuIGJlIHVzZWQgaW4gYSBub24tdm9pZAorLy8gZnVuY3Rpb24gZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQgaW4gaXQgY29udGFpbnMgQVNTRVJUXyouCisKK2ludCBOb25Wb2lkRnVuY3Rpb24oKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKGZhbHNlKSwgIiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhGQUlMKCksICIiKTsKKyAgcmV0dXJuIDA7Cit9CisKK1RFU1RfRihFeHBlY3RGYXRhbEZhaWx1cmVUZXN0LCBDYW5CZVVzZWRJbk5vblZvaWRGdW5jdGlvbikgeworICBOb25Wb2lkRnVuY3Rpb24oKTsKK30KKworLy8gVGVzdHMgdGhhdCBFWFBFQ1RfRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIC4uLikgZG9lc24ndCBhYm9ydCB0aGUKKy8vIGN1cnJlbnQgZnVuY3Rpb24gZXZlbiB0aG91Z2ggJ3N0YXRlbWVudCcgZ2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZS4KKwordm9pZCBEb2VzTm90QWJvcnRIZWxwZXIoYm9vbCogYWJvcnRlZCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRShmYWxzZSksICIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoRkFJTCgpLCAiIik7CisKKyAgKmFib3J0ZWQgPSBmYWxzZTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gUmVzdG9yZXMgd2FybmluZ3MgYWZ0ZXIgcHJldmlvdXMgIiNwcmFnbWEgb3B0aW9uIHB1c2giIHN1cHByZXNzZWQgdGhlbS4KKyMgcHJhZ21hIG9wdGlvbiBwb3AKKyNlbmRpZgorCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgRG9lc05vdEFib3J0KSB7CisgIGJvb2wgYWJvcnRlZCA9IHRydWU7CisgIERvZXNOb3RBYm9ydEhlbHBlcigmYWJvcnRlZCk7CisgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkV7LF9PTl9BTExfVEhSRUFEU30gYWNjZXB0cyBhCisvLyBzdGF0ZW1lbnQgdGhhdCBjb250YWlucyBhIG1hY3JvIHdoaWNoIGV4cGFuZHMgdG8gY29kZSBjb250YWluaW5nIGFuCisvLyB1bnByb3RlY3RlZCBjb21tYS4KKworc3RhdGljIGludCBnbG9iYWxfdmFyID0gMDsKKyNkZWZpbmUgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXyBnbG9iYWxfdmFyKyssIGdsb2JhbF92YXIrKworCitURVNUX0YoRXhwZWN0RmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEpIHsKKyNpZm5kZWYgX19CT1JMQU5EQ19fCisgIC8vIElDRSdzIGluIEMrK0J1aWxkZXIuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICBHVEVTVF9VU0VfVU5QUk9URUNURURfQ09NTUFfOworICAgIEFkZEZhdGFsRmFpbHVyZSgpOworICB9LCAiIik7CisjZW5kaWYKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyh7CisgICAgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXzsKKyAgICBBZGRGYXRhbEZhaWx1cmUoKTsKKyAgfSwgIiIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRXssT05fQUxMX1RIUkVBRFN9LgorCit0eXBlZGVmIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyVGVzdCBFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0OworCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQ2F0Y2hlc05vbmZhdGFsRmFpbHVyZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBZGROb25mYXRhbEZhaWx1cmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0cmluZygiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIikpOworfQorI2VuZGlmCisKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBBY2NlcHRzU3RkU3RyaW5nT2JqZWN0KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJFeHBlY3RlZCBub24tZmF0YWwgZmFpbHVyZS4iKSk7Cit9CisKK1RFU1RfRihFeHBlY3ROb25mYXRhbEZhaWx1cmVUZXN0LCBDYXRjaGVzTm9uZmF0YWxGYWlsdXJlT25BbGxUaHJlYWRzKSB7CisgIC8vIFdlIGhhdmUgYW5vdGhlciB0ZXN0IGJlbG93IHRvIHZlcmlmeSB0aGF0IHRoZSBtYWNybyBjYXRjaGVzCisgIC8vIG5vbi1mYXRhbCBmYWlsdXJlcyBnZW5lcmF0ZWQgb24gYW5vdGhlciB0aHJlYWQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKEFkZE5vbmZhdGFsRmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm9uLWZhdGFsIGZhaWx1cmUuIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFeyxfT05fQUxMX1RIUkVBRFN9IGFjY2VwdHMgYQorLy8gc3RhdGVtZW50IHRoYXQgY29udGFpbnMgYSBtYWNybyB3aGljaCBleHBhbmRzIHRvIGNvZGUgY29udGFpbmluZyBhbgorLy8gdW5wcm90ZWN0ZWQgY29tbWEuCitURVNUX0YoRXhwZWN0Tm9uZmF0YWxGYWlsdXJlVGVzdCwgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeworICAgIEdURVNUX1VTRV9VTlBST1RFQ1RFRF9DT01NQV87CisgICAgQWRkTm9uZmF0YWxGYWlsdXJlKCk7CisgIH0sICIiKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyh7CisgICAgR1RFU1RfVVNFX1VOUFJPVEVDVEVEX0NPTU1BXzsKKyAgICBBZGROb25mYXRhbEZhaWx1cmUoKTsKKyAgfSwgIiIpOworfQorCisjaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQorCit0eXBlZGVmIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyV2l0aFRocmVhZHNUZXN0CisgICAgRXhwZWN0RmFpbHVyZVdpdGhUaHJlYWRzVGVzdDsKKworVEVTVF9GKEV4cGVjdEZhaWx1cmVXaXRoVGhyZWFkc1Rlc3QsIEV4cGVjdEZhdGFsRmFpbHVyZU9uQWxsVGhyZWFkcykgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhBZGRGYWlsdXJlSW5PdGhlclRocmVhZChGQVRBTF9GQUlMVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhdGFsIGZhaWx1cmUuIik7Cit9CisKK1RFU1RfRihFeHBlY3RGYWlsdXJlV2l0aFRocmVhZHNUZXN0LCBFeHBlY3ROb25GYXRhbEZhaWx1cmVPbkFsbFRocmVhZHMpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoCisgICAgICBBZGRGYWlsdXJlSW5PdGhlclRocmVhZChOT05GQVRBTF9GQUlMVVJFKSwgIkV4cGVjdGVkIG5vbi1mYXRhbCBmYWlsdXJlLiIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKKworLy8gVGVzdHMgdGhlIFRlc3RQcm9wZXJ0eSBjbGFzcy4KKworVEVTVChUZXN0UHJvcGVydHlUZXN0LCBDb25zdHJ1Y3RvcldvcmtzKSB7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5IiwgInZhbHVlIik7CisgIEVYUEVDVF9TVFJFUSgia2V5IiwgcHJvcGVydHkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoInZhbHVlIiwgcHJvcGVydHkudmFsdWUoKSk7Cit9CisKK1RFU1QoVGVzdFByb3BlcnR5VGVzdCwgU2V0VmFsdWUpIHsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5KCJrZXkiLCAidmFsdWVfMSIpOworICBFWFBFQ1RfU1RSRVEoImtleSIsIHByb3BlcnR5LmtleSgpKTsKKyAgcHJvcGVydHkuU2V0VmFsdWUoInZhbHVlXzIiKTsKKyAgRVhQRUNUX1NUUkVRKCJrZXkiLCBwcm9wZXJ0eS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgidmFsdWVfMiIsIHByb3BlcnR5LnZhbHVlKCkpOworfQorCisvLyBUZXN0cyB0aGUgVGVzdFJlc3VsdCBjbGFzcworCisvLyBUaGUgdGVzdCBmaXh0dXJlIGZvciB0ZXN0aW5nIFRlc3RSZXN1bHQuCitjbGFzcyBUZXN0UmVzdWx0VGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IFRQUlZlY3RvcjsKKworICAvLyBXZSBtYWtlIHVzZSBvZiAyIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMsCisgIFRlc3RQYXJ0UmVzdWx0ICogcHIxLCAqIHByMjsKKworICAvLyAuLi4gYW5kIDMgVGVzdFJlc3VsdCBvYmplY3RzLgorICBUZXN0UmVzdWx0ICogcjAsICogcjEsICogcjI7CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIHByMSBpcyBmb3Igc3VjY2Vzcy4KKyAgICBwcjEgPSBuZXcgVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vL2Jhci5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VjY2VzcyEiKTsKKworICAgIC8vIHByMiBpcyBmb3IgZmF0YWwgZmFpbHVyZS4KKyAgICBwcjIgPSBuZXcgVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28vYmFyLmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsICAvLyBUaGlzIGxpbmUgbnVtYmVyIG1lYW5zICJ1bmtub3duIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbHVyZSEiKTsKKworICAgIC8vIENyZWF0ZXMgdGhlIFRlc3RSZXN1bHQgb2JqZWN0cy4KKyAgICByMCA9IG5ldyBUZXN0UmVzdWx0KCk7CisgICAgcjEgPSBuZXcgVGVzdFJlc3VsdCgpOworICAgIHIyID0gbmV3IFRlc3RSZXN1bHQoKTsKKworICAgIC8vIEluIG9yZGVyIHRvIHRlc3QgVGVzdFJlc3VsdCwgd2UgbmVlZCB0byBtb2RpZnkgaXRzIGludGVybmFsCisgICAgLy8gc3RhdGUsIGluIHBhcnRpY3VsYXIgdGhlIFRlc3RQYXJ0UmVzdWx0IHZlY3RvciBpdCBob2xkcy4KKyAgICAvLyB0ZXN0X3BhcnRfcmVzdWx0cygpIHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuCisgICAgLy8gV2UgY2FzdCBpdCB0byBhIG5vbi1jb25zdCBvYmplY3Qgcy50LiBpdCBjYW4gYmUgbW9kaWZpZWQgKHllcywKKyAgICAvLyB0aGlzIGlzIGEgaGFjaykuCisgICAgVFBSVmVjdG9yKiByZXN1bHRzMSA9IGNvbnN0X2Nhc3Q8VFBSVmVjdG9yKj4oCisgICAgICAgICZUZXN0UmVzdWx0QWNjZXNzb3I6OnRlc3RfcGFydF9yZXN1bHRzKCpyMSkpOworICAgIFRQUlZlY3RvciogcmVzdWx0czIgPSBjb25zdF9jYXN0PFRQUlZlY3Rvcio+KAorICAgICAgICAmVGVzdFJlc3VsdEFjY2Vzc29yOjp0ZXN0X3BhcnRfcmVzdWx0cygqcjIpKTsKKworICAgIC8vIHIwIGlzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCisKKyAgICAvLyByMSBjb250YWlucyBhIHNpbmdsZSBTVUNDRVNTIFRlc3RQYXJ0UmVzdWx0LgorICAgIHJlc3VsdHMxLT5wdXNoX2JhY2soKnByMSk7CisKKyAgICAvLyByMiBjb250YWlucyBhIFNVQ0NFU1MsIGFuZCBhIEZBSUxVUkUuCisgICAgcmVzdWx0czItPnB1c2hfYmFjaygqcHIxKTsKKyAgICByZXN1bHRzMi0+cHVzaF9iYWNrKCpwcjIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIGRlbGV0ZSBwcjE7CisgICAgZGVsZXRlIHByMjsKKworICAgIGRlbGV0ZSByMDsKKyAgICBkZWxldGUgcjE7CisgICAgZGVsZXRlIHIyOworICB9CisKKyAgLy8gSGVscGVyIHRoYXQgY29tcGFyZXMgdHdvIHR3byBUZXN0UGFydFJlc3VsdHMuCisgIHN0YXRpYyB2b2lkIENvbXBhcmVUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgYWN0dWFsKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnR5cGUoKSwgYWN0dWFsLnR5cGUoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLmZpbGVfbmFtZSgpLCBhY3R1YWwuZmlsZV9uYW1lKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5saW5lX251bWJlcigpLCBhY3R1YWwubGluZV9udW1iZXIoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLnN1bW1hcnkoKSwgYWN0dWFsLnN1bW1hcnkoKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLm1lc3NhZ2UoKSwgYWN0dWFsLm1lc3NhZ2UoKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnBhc3NlZCgpLCBhY3R1YWwucGFzc2VkKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5mYWlsZWQoKSwgYWN0dWFsLmZhaWxlZCgpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQubm9uZmF0YWxseV9mYWlsZWQoKSwgYWN0dWFsLm5vbmZhdGFsbHlfZmFpbGVkKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5mYXRhbGx5X2ZhaWxlZCgpLCBhY3R1YWwuZmF0YWxseV9mYWlsZWQoKSk7CisgIH0KK307CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OnRvdGFsX3BhcnRfY291bnQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgdG90YWxfcGFydF9jb3VudCkgeworICBBU1NFUlRfRVEoMCwgcjAtPnRvdGFsX3BhcnRfY291bnQoKSk7CisgIEFTU0VSVF9FUSgxLCByMS0+dG90YWxfcGFydF9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDIsIHIyLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0OjpQYXNzZWQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgUGFzc2VkKSB7CisgIEFTU0VSVF9UUlVFKHIwLT5QYXNzZWQoKSk7CisgIEFTU0VSVF9UUlVFKHIxLT5QYXNzZWQoKSk7CisgIEFTU0VSVF9GQUxTRShyMi0+UGFzc2VkKCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0OjpGYWlsZWQoKS4KK1RFU1RfRihUZXN0UmVzdWx0VGVzdCwgRmFpbGVkKSB7CisgIEFTU0VSVF9GQUxTRShyMC0+RmFpbGVkKCkpOworICBBU1NFUlRfRkFMU0UocjEtPkZhaWxlZCgpKTsKKyAgQVNTRVJUX1RSVUUocjItPkZhaWxlZCgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6R2V0VGVzdFBhcnRSZXN1bHQoKS4KKwordHlwZWRlZiBUZXN0UmVzdWx0VGVzdCBUZXN0UmVzdWx0RGVhdGhUZXN0OworCitURVNUX0YoVGVzdFJlc3VsdERlYXRoVGVzdCwgR2V0VGVzdFBhcnRSZXN1bHQpIHsKKyAgQ29tcGFyZVRlc3RQYXJ0UmVzdWx0KCpwcjEsIHIyLT5HZXRUZXN0UGFydFJlc3VsdCgwKSk7CisgIENvbXBhcmVUZXN0UGFydFJlc3VsdCgqcHIyLCByMi0+R2V0VGVzdFBhcnRSZXN1bHQoMSkpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHIyLT5HZXRUZXN0UGFydFJlc3VsdCgyKSwgIiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHIyLT5HZXRUZXN0UGFydFJlc3VsdCgtMSksICIiKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdCBoYXMgbm8gcHJvcGVydGllcyB3aGVuIG5vbmUgYXJlIGFkZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBOb1Byb3BlcnRpZXNGb3VuZFdoZW5Ob25lQXJlQWRkZWQpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgQVNTRVJUX0VRKDAsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIHRoZSBleHBlY3RlZCBwcm9wZXJ0eSB3aGVuIGFkZGVkLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBPbmVQcm9wZXJ0eUZvdW5kV2hlbkFkZGVkKSB7CisgIFRlc3RSZXN1bHQgdGVzdF9yZXN1bHQ7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHkpOworICBBU1NFUlRfRVEoMSwgdGVzdF9yZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBhY3R1YWxfcHJvcGVydHkgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMCk7CisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBhY3R1YWxfcHJvcGVydHkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBhY3R1YWxfcHJvcGVydHkudmFsdWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQgaGFzIG11bHRpcGxlIHByb3BlcnRpZXMgd2hlbiBhZGRlZC4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgTXVsdGlwbGVQcm9wZXJ0aWVzRm91bmRXaGVuQWRkZWQpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzEoImtleV8xIiwgIjEiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzIoImtleV8yIiwgIjIiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMik7CisgIEFTU0VSVF9FUSgyLCB0ZXN0X3Jlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8xID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDApOworICBFWFBFQ1RfU1RSRVEoImtleV8xIiwgYWN0dWFsX3Byb3BlcnR5XzEua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBhY3R1YWxfcHJvcGVydHlfMS52YWx1ZSgpKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8yID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDEpOworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwgYWN0dWFsX3Byb3BlcnR5XzIua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjIiLCBhY3R1YWxfcHJvcGVydHlfMi52YWx1ZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoKSBvdmVycmlkZXMgdmFsdWVzIGZvciBkdXBsaWNhdGUga2V5cy4KK1RFU1QoVGVzdFJlc3VsdFByb3BlcnR5VGVzdCwgT3ZlcnJpZGVzVmFsdWVzRm9yRHVwbGljYXRlS2V5cykgeworICBUZXN0UmVzdWx0IHRlc3RfcmVzdWx0OworICBUZXN0UHJvcGVydHkgcHJvcGVydHlfMV8xKCJrZXlfMSIsICIxIik7CisgIFRlc3RQcm9wZXJ0eSBwcm9wZXJ0eV8yXzEoImtleV8yIiwgIjIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzFfMigia2V5XzEiLCAiMTIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzJfMigia2V5XzIiLCAiMjIiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzFfMSk7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCAidGVzdGNhc2UiLCBwcm9wZXJ0eV8yXzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMV8yKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzJfMik7CisKKyAgQVNTRVJUX0VRKDIsIHRlc3RfcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgYWN0dWFsX3Byb3BlcnR5XzEgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMCk7CisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBhY3R1YWxfcHJvcGVydHlfMS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMTIiLCBhY3R1YWxfcHJvcGVydHlfMS52YWx1ZSgpKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGFjdHVhbF9wcm9wZXJ0eV8yID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDEpOworICBFWFBFQ1RfU1RSRVEoImtleV8yIiwgYWN0dWFsX3Byb3BlcnR5XzIua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjIyIiwgYWN0dWFsX3Byb3BlcnR5XzIudmFsdWUoKSk7Cit9CisKKy8vIFRlc3RzIFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eSgpLgorVEVTVChUZXN0UmVzdWx0UHJvcGVydHlUZXN0LCBHZXRUZXN0UHJvcGVydHkpIHsKKyAgVGVzdFJlc3VsdCB0ZXN0X3Jlc3VsdDsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzEoImtleV8xIiwgIjEiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzIoImtleV8yIiwgIjIiKTsKKyAgVGVzdFByb3BlcnR5IHByb3BlcnR5XzMoImtleV8zIiwgIjMiKTsKKyAgVGVzdFJlc3VsdEFjY2Vzc29yOjpSZWNvcmRQcm9wZXJ0eSgmdGVzdF9yZXN1bHQsICJ0ZXN0Y2FzZSIsIHByb3BlcnR5XzEpOworICBUZXN0UmVzdWx0QWNjZXNzb3I6OlJlY29yZFByb3BlcnR5KCZ0ZXN0X3Jlc3VsdCwgInRlc3RjYXNlIiwgcHJvcGVydHlfMik7CisgIFRlc3RSZXN1bHRBY2Nlc3Nvcjo6UmVjb3JkUHJvcGVydHkoJnRlc3RfcmVzdWx0LCAidGVzdGNhc2UiLCBwcm9wZXJ0eV8zKTsKKworICBjb25zdCBUZXN0UHJvcGVydHkmIGZldGNoZWRfcHJvcGVydHlfMSA9IHRlc3RfcmVzdWx0LkdldFRlc3RQcm9wZXJ0eSgwKTsKKyAgY29uc3QgVGVzdFByb3BlcnR5JiBmZXRjaGVkX3Byb3BlcnR5XzIgPSB0ZXN0X3Jlc3VsdC5HZXRUZXN0UHJvcGVydHkoMSk7CisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgZmV0Y2hlZF9wcm9wZXJ0eV8zID0gdGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDIpOworCisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLCBmZXRjaGVkX3Byb3BlcnR5XzEua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEiLCBmZXRjaGVkX3Byb3BlcnR5XzEudmFsdWUoKSk7CisKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMiIsIGZldGNoZWRfcHJvcGVydHlfMi5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMiIsIGZldGNoZWRfcHJvcGVydHlfMi52YWx1ZSgpKTsKKworICBFWFBFQ1RfU1RSRVEoImtleV8zIiwgZmV0Y2hlZF9wcm9wZXJ0eV8zLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIzIiwgZmV0Y2hlZF9wcm9wZXJ0eV8zLnZhbHVlKCkpOworCisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQodGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KDMpLCAiIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQodGVzdF9yZXN1bHQuR2V0VGVzdFByb3BlcnR5KC0xKSwgIiIpOworfQorCisvLyBUZXN0cyB0aGUgVGVzdCBjbGFzcy4KKy8vCisvLyBJdCdzIGRpZmZpY3VsdCB0byB0ZXN0IGV2ZXJ5IHB1YmxpYyBtZXRob2Qgb2YgdGhpcyBjbGFzcyAod2UgYXJlCisvLyBhbHJlYWR5IHN0cmV0Y2hpbmcgdGhlIGxpbWl0IG9mIEdvb2dsZSBUZXN0IGJ5IHVzaW5nIGl0IHRvIHRlc3QgaXRzZWxmISkuCisvLyBGb3J0dW5hdGVseSwgd2UgZG9uJ3QgaGF2ZSB0byBkbyB0aGF0LCBhcyB3ZSBhcmUgYWxyZWFkeSB0ZXN0aW5nCisvLyB0aGUgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBUZXN0IGNsYXNzIGV4dGVuc2l2ZWx5IGJ5IHVzaW5nIEdvb2dsZSBUZXN0CisvLyBhbG9uZS4KKy8vCisvLyBUaGVyZWZvcmUsIHRoaXMgc2VjdGlvbiBvbmx5IGNvbnRhaW5zIG9uZSB0ZXN0LgorCisvLyBUZXN0cyB0aGF0IEdUZXN0RmxhZ1NhdmVyIHdvcmtzIG9uIFdpbmRvd3MgYW5kIE1hYy4KKworY2xhc3MgR1Rlc3RGbGFnU2F2ZXJUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gU2F2ZXMgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIHN1Y2ggdGhhdCB3ZSBjYW4gcmVzdG9yZSB0aGVtIGxhdGVyLCBhbmQKKyAgLy8gdGhlbiBzZXRzIHRoZW0gdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuICBUaGlzIHdpbGwgYmUgY2FsbGVkCisgIC8vIGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBpcyBydW4uCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgc2F2ZXJfID0gbmV3IEdUZXN0RmxhZ1NhdmVyOworCisgICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJhdXRvIjsKKyAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSAiIjsKKyAgICBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhvdXRwdXQpID0gIiI7CisgICAgR1RFU1RfRkxBRyhwcmludF90aW1lKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSAwOworICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IDE7CisgICAgR1RFU1RfRkxBRyhzaHVmZmxlKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpID0ga01heFN0YWNrVHJhY2VEZXB0aDsKKyAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gIiI7CisgICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IGZhbHNlOworICB9CisKKyAgLy8gUmVzdG9yZXMgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIHRoYXQgdGhlIHRlc3RzIGhhdmUgbW9kaWZpZWQuICBUaGlzIHdpbGwKKyAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UgaXMgcnVuLgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkgeworICAgIGRlbGV0ZSBzYXZlcl87CisgICAgc2F2ZXJfID0gTlVMTDsKKyAgfQorCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGVuCisgIC8vIG1vZGlmaWVzIGVhY2ggb2YgdGhlbS4KKyAgdm9pZCBWZXJpZnlBbmRNb2RpZnlGbGFncygpIHsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKTsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdXRvIiwgR1RFU1RfRkxBRyhjb2xvcikuY19zdHIoKSk7CisgICAgRVhQRUNUX0ZBTFNFKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShHVEVTVF9GTEFHKHByaW50X3RpbWUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpOworICAgIEVYUEVDVF9FUSgxLCBHVEVTVF9GTEFHKHJlcGVhdCkpOworICAgIEVYUEVDVF9GQUxTRShHVEVTVF9GTEFHKHNodWZmbGUpKTsKKyAgICBFWFBFQ1RfRVEoa01heFN0YWNrVHJhY2VEZXB0aCwgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSk7CisKKyAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhjb2xvcikgPSAibm8iOworICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSB0cnVlOworICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICJhYmMiOworICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSB0cnVlOworICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9ICJ4bWw6Zm9vLnhtbCI7CisgICAgR1RFU1RfRkxBRyhwcmludF90aW1lKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpID0gMTsKKyAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSAxMDA7CisgICAgR1RFU1RfRkxBRyhzaHVmZmxlKSA9IHRydWU7CisgICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSAxOworICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSAibG9jYWxob3N0OjEyMzQiOworICAgIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgPSB0cnVlOworICB9CisKKyBwcml2YXRlOgorICAvLyBGb3Igc2F2aW5nIEdvb2dsZSBUZXN0IGZsYWdzIGR1cmluZyB0aGlzIHRlc3QgY2FzZS4KKyAgc3RhdGljIEdUZXN0RmxhZ1NhdmVyKiBzYXZlcl87Cit9OworCitHVGVzdEZsYWdTYXZlciogR1Rlc3RGbGFnU2F2ZXJUZXN0OjpzYXZlcl8gPSBOVUxMOworCisvLyBHb29nbGUgVGVzdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgb2YgdGVzdHMuICBUaGUgZm9sbG93aW5nIHR3bworLy8gdGVzdHMgYXJlIGRlc2lnbmVkIHRvIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGVpciBvcmRlci4KKworLy8gTW9kaWZpZXMgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIGluIHRoZSB0ZXN0IGJvZHkuCitURVNUX0YoR1Rlc3RGbGFnU2F2ZXJUZXN0LCBNb2RpZnlHVGVzdEZsYWdzKSB7CisgIFZlcmlmeUFuZE1vZGlmeUZsYWdzKCk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIEdvb2dsZSBUZXN0IGZsYWdzIGluIHRoZSBib2R5IG9mIHRoZSBwcmV2aW91cyB0ZXN0IHdlcmUKKy8vIHJlc3RvcmVkIHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4KK1RFU1RfRihHVGVzdEZsYWdTYXZlclRlc3QsIFZlcmlmeUdUZXN0RmxhZ3MpIHsKKyAgVmVyaWZ5QW5kTW9kaWZ5RmxhZ3MoKTsKK30KKworLy8gU2V0cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBnaXZlbgorLy8gdmFsdWUuICBJZiB0aGUgdmFsdWUgYXJndW1lbnQgaXMgIiIsIHVuc2V0cyB0aGUgZW52aXJvbm1lbnQKKy8vIHZhcmlhYmxlLiAgVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IGJvdGggYXJndW1lbnRzIGFyZSBub3QgTlVMTC4KK3N0YXRpYyB2b2lkIFNldEVudihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIENFLgorICByZXR1cm47CisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1N1bk9TXzVfOCkgfHwgZGVmaW5lZChfX1N1bk9TXzVfOSkKKyAgLy8gQysrQnVpbGRlcidzIHB1dGVudiBvbmx5IHN0b3JlcyBhIHBvaW50ZXIgdG8gaXRzIHBhcmFtZXRlcjsgd2UgaGF2ZSB0bworICAvLyBlbnN1cmUgdGhhdCB0aGUgc3RyaW5nIHJlbWFpbnMgdmFsaWQgYXMgbG9uZyBhcyBpdCBtaWdodCBiZSBuZWVkZWQuCisgIC8vIFdlIHVzZSBhbiBzdGQ6Om1hcCB0byBkbyBzby4KKyAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyo+IGFkZGVkX2VudjsKKworICAvLyBCZWNhdXNlIHB1dGVudiBzdG9yZXMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCB3ZSBjYW4ndCBkZWxldGUgdGhlCisgIC8vIHByZXZpb3VzIHN0cmluZyAoaWYgcHJlc2VudCkgdW50aWwgYWZ0ZXIgaXQncyByZXBsYWNlZC4KKyAgc3RkOjpzdHJpbmcgKnByZXZfZW52ID0gTlVMTDsKKyAgaWYgKGFkZGVkX2Vudi5maW5kKG5hbWUpICE9IGFkZGVkX2Vudi5lbmQoKSkgeworICAgIHByZXZfZW52ID0gYWRkZWRfZW52W25hbWVdOworICB9CisgIGFkZGVkX2VudltuYW1lXSA9IG5ldyBzdGQ6OnN0cmluZygKKyAgICAgIChNZXNzYWdlKCkgPDwgbmFtZSA8PCAiPSIgPDwgdmFsdWUpLkdldFN0cmluZygpKTsKKworICAvLyBUaGUgc3RhbmRhcmQgc2lnbmF0dXJlIG9mIHB1dGVudiBhY2NlcHRzIGEgJ2NoYXIqJyBhcmd1bWVudC4gT3RoZXIKKyAgLy8gaW1wbGVtZW50YXRpb25zLCBsaWtlIEMrK0J1aWxkZXIncywgYWNjZXB0IGEgJ2NvbnN0IGNoYXIqJy4KKyAgLy8gV2UgY2FzdCBhd2F5IHRoZSAnY29uc3QnIHNpbmNlIHRoYXQgd291bGQgd29yayBmb3IgYm90aCB2YXJpYW50cy4KKyAgcHV0ZW52KGNvbnN0X2Nhc3Q8Y2hhcio+KGFkZGVkX2VudltuYW1lXS0+Y19zdHIoKSkpOworICBkZWxldGUgcHJldl9lbnY7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBJZiB3ZSBhcmUgb24gV2luZG93cyBwcm9wZXIuCisgIF9wdXRlbnYoKE1lc3NhZ2UoKSA8PCBuYW1lIDw8ICI9IiA8PCB2YWx1ZSkuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisjZWxzZQorICBpZiAoKnZhbHVlID09ICdcMCcpIHsKKyAgICB1bnNldGVudihuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBzZXRlbnYobmFtZSwgdmFsdWUsIDEpOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCit9CisKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIENFLgorCit1c2luZyB0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnY7CisKKy8vIFRlc3RzIEludDMyRnJvbUdUZXN0RW52KCkuCisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tR1Rlc3RFbnYoKSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorVEVTVChJbnQzMkZyb21HVGVzdEVudlRlc3QsIFJldHVybnNEZWZhdWx0V2hlblZhcmlhYmxlSXNOb3RTZXQpIHsKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICIiKTsKKyAgRVhQRUNUX0VRKDEwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDEwKSk7Cit9CisKKyMgaWYgIWRlZmluZWQoR1RFU1RfR0VUX0lOVDMyX0ZST01fRU5WXykKKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21HVGVzdEVudigpIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KK1RFU1QoSW50MzJGcm9tR1Rlc3RFbnZUZXN0LCBSZXR1cm5zRGVmYXVsdFdoZW5WYWx1ZU92ZXJmbG93cykgeworICBwcmludGYoIihleHBlY3RpbmcgMiB3YXJuaW5ncylcbiIpOworCisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiMTIzNDU2Nzg5ODc2NTQzMjEiKTsKKyAgRVhQRUNUX0VRKDIwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDIwKSk7CisKKyAgU2V0RW52KEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVEVNUCIsICItMTIzNDU2Nzg5ODc2NTQzMjEiKTsKKyAgRVhQRUNUX0VRKDMwLCBJbnQzMkZyb21HVGVzdEVudigidGVtcCIsIDMwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW50MzJGcm9tR1Rlc3RFbnYoKSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlCisvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBkZWNpbWFsIGludGVnZXIuCitURVNUKEludDMyRnJvbUdUZXN0RW52VGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFsdWVJc0ludmFsaWQpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgd2FybmluZ3MpXG4iKTsKKworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJURU1QIiwgIkExIik7CisgIEVYUEVDVF9FUSg0MCwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCA0MCkpOworCisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiMTJYIik7CisgIEVYUEVDVF9FUSg1MCwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCA1MCkpOworfQorCisjIGVuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9HRVRfSU5UMzJfRlJPTV9FTlZfKQorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUdUZXN0RW52KCkgcGFyc2VzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gaXQgcmVwcmVzZW50cyBhIHZhbGlkIGRlY2ltYWwgaW50ZWdlciBpbgorLy8gdGhlIHJhbmdlIG9mIGFuIEludDMyLgorVEVTVChJbnQzMkZyb21HVGVzdEVudlRlc3QsIFBhcnNlc0FuZFJldHVybnNWYWxpZFZhbHVlKSB7CisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiMTIzIik7CisgIEVYUEVDVF9FUSgxMjMsIEludDMyRnJvbUdUZXN0RW52KCJ0ZW1wIiwgMCkpOworCisgIFNldEVudihHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlRFTVAiLCAiLTMyMSIpOworICBFWFBFQ1RfRVEoLTMyMSwgSW50MzJGcm9tR1Rlc3RFbnYoInRlbXAiLCAwKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBUZXN0cyBQYXJzZUludDMyRmxhZygpLgorCisvLyBUZXN0cyB0aGF0IFBhcnNlSW50MzJGbGFnKCkgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCBjaGFuZ2UgdGhlCisvLyBvdXRwdXQgdmFsdWUgd2hlbiB0aGUgZmxhZyBoYXMgd3JvbmcgZm9ybWF0CitURVNUKFBhcnNlSW50MzJGbGFnVGVzdCwgUmV0dXJuc0ZhbHNlRm9ySW52YWxpZEZsYWcpIHsKKyAgSW50MzIgdmFsdWUgPSAxMjM7CisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiLS1hPTEwMCIsICJiIiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgxMjMsIHZhbHVlKTsKKworICBFWFBFQ1RfRkFMU0UoUGFyc2VJbnQzMkZsYWcoImE9MTAwIiwgImEiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworfQorCisvLyBUZXN0cyB0aGF0IFBhcnNlSW50MzJGbGFnKCkgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCBjaGFuZ2UgdGhlCisvLyBvdXRwdXQgdmFsdWUgd2hlbiB0aGUgZmxhZyBvdmVyZmxvd3MgYXMgYW4gSW50MzIuCitURVNUKFBhcnNlSW50MzJGbGFnVGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFsdWVPdmVyZmxvd3MpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgd2FybmluZ3MpXG4iKTsKKworICBJbnQzMiB2YWx1ZSA9IDEyMzsKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWFiYz0xMjM0NTY3ODk4NzY1NDMyMSIsICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworCisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiLS1hYmM9LTEyMzQ1Njc4OTg3NjU0MzIxIiwgImFiYyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUGFyc2VJbnQzMkZsYWcoKSByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IGNoYW5nZSB0aGUKKy8vIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBmbGFnIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGRlY2ltYWwKKy8vIGludGVnZXIuCitURVNUKFBhcnNlSW50MzJGbGFnVGVzdCwgUmV0dXJuc0RlZmF1bHRXaGVuVmFsdWVJc0ludmFsaWQpIHsKKyAgcHJpbnRmKCIoZXhwZWN0aW5nIDIgd2FybmluZ3MpXG4iKTsKKworICBJbnQzMiB2YWx1ZSA9IDEyMzsKKyAgRVhQRUNUX0ZBTFNFKFBhcnNlSW50MzJGbGFnKCItLWFiYz1BMSIsICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEyMywgdmFsdWUpOworCisgIEVYUEVDVF9GQUxTRShQYXJzZUludDMyRmxhZygiLS1hYmM9MTJYIiwgImFiYyIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgUGFyc2VJbnQzMkZsYWcoKSBwYXJzZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFuZAorLy8gcmV0dXJucyB0cnVlIHdoZW4gdGhlIGZsYWcgcmVwcmVzZW50cyBhIHZhbGlkIGRlY2ltYWwgaW50ZWdlciBpbgorLy8gdGhlIHJhbmdlIG9mIGFuIEludDMyLgorVEVTVChQYXJzZUludDMyRmxhZ1Rlc3QsIFBhcnNlc0FuZFJldHVybnNWYWxpZFZhbHVlKSB7CisgIEludDMyIHZhbHVlID0gMTIzOworICBFWFBFQ1RfVFJVRShQYXJzZUludDMyRmxhZygiLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYWJjPTQ1NiIsICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDQ1NiwgdmFsdWUpOworCisgIEVYUEVDVF9UUlVFKFBhcnNlSW50MzJGbGFnKCItLSIgR1RFU1RfRkxBR19QUkVGSVhfICJhYmM9LTc4OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKC03ODksIHZhbHVlKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21FbnZPckRpZSgpIHBhcnNlcyB0aGUgdmFsdWUgb2YgdGhlIHZhciBvcgorLy8gcmV0dXJucyB0aGUgY29ycmVjdCBkZWZhdWx0LgorLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UuCisjaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCitURVNUKEludDMyRnJvbUVudk9yRGllVGVzdCwgUGFyc2VzQW5kUmV0dXJuc1ZhbGlkVmFsdWUpIHsKKyAgRVhQRUNUX0VRKDMzMywgSW50MzJGcm9tRW52T3JEaWUoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsIDMzMykpOworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsICIxMjMiKTsKKyAgRVhQRUNUX0VRKDEyMywgSW50MzJGcm9tRW52T3JEaWUoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsIDMzMykpOworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJVbnNldFZhciIsICItMTIzIik7CisgIEVYUEVDVF9FUSgtMTIzLCBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlVuc2V0VmFyIiwgMzMzKSk7Cit9CisjZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBUZXN0cyB0aGF0IEludDMyRnJvbUVudk9yRGllKCkgYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZQorLy8gaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbiBJbnQzMi4KK1RFU1QoSW50MzJGcm9tRW52T3JEaWVEZWF0aFRlc3QsIEFib3J0c09uRmFpbHVyZSkgeworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJWQVIiLCAieHh4Iik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCisgICAgICBJbnQzMkZyb21FbnZPckRpZShHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIlZBUiIsIDEyMyksCisgICAgICAiLioiKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbnQzMkZyb21FbnZPckRpZSgpIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKKy8vIGlmIHRoZSB2YXJpYWJsZSBjYW5ub3QgYmUgcmVwcmVzbnRlZCBieSBhbiBJbnQzMi4KK1RFU1QoSW50MzJGcm9tRW52T3JEaWVEZWF0aFRlc3QsIEFib3J0c09uSW50MzJPdmVyZmxvdykgeworICBTZXRFbnYoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJWQVIiLCAiMTIzNDU2Nzg5MTIzNDU2Nzg5MTIzNCIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAorICAgICAgSW50MzJGcm9tRW52T3JEaWUoR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJWQVIiLCAxMjMpLAorICAgICAgIi4qIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgU2hvdWxkUnVuVGVzdE9uU2hhcmQoKSBzZWxlY3RzIGFsbCB0ZXN0cworLy8gd2hlcmUgdGhlcmUgaXMgMSBzaGFyZC4KK1RFU1QoU2hvdWxkUnVuVGVzdE9uU2hhcmRUZXN0LCBJc1BhcnRpdGlvbldoZW5UaGVyZUlzT25lU2hhcmQpIHsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkUnVuVGVzdE9uU2hhcmQoMSwgMCwgMCkpOworICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCAxKSk7CisgIEVYUEVDVF9UUlVFKFNob3VsZFJ1blRlc3RPblNoYXJkKDEsIDAsIDIpKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkUnVuVGVzdE9uU2hhcmQoMSwgMCwgMykpOworICBFWFBFQ1RfVFJVRShTaG91bGRSdW5UZXN0T25TaGFyZCgxLCAwLCA0KSk7Cit9CisKK2NsYXNzIFNob3VsZFNoYXJkVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBpbmRleF92YXJfID0gR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJJTkRFWCI7CisgICAgdG90YWxfdmFyXyA9IEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiVE9UQUwiOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIFNldEVudihpbmRleF92YXJfLCAiIik7CisgICAgU2V0RW52KHRvdGFsX3Zhcl8sICIiKTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIGluZGV4X3Zhcl87CisgIGNvbnN0IGNoYXIqIHRvdGFsX3Zhcl87Cit9OworCisvLyBUZXN0cyB0aGF0IHNoYXJkaW5nIGlzIGRpc2FibGVkIGlmIG5laXRoZXIgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcworLy8gYXJlIHNldC4KK1RFU1RfRihTaG91bGRTaGFyZFRlc3QsIFJldHVybnNGYWxzZVdoZW5OZWl0aGVyRW52VmFySXNTZXQpIHsKKyAgU2V0RW52KGluZGV4X3Zhcl8sICIiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICIiKTsKKworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKK30KKworLy8gVGVzdHMgdGhhdCBzaGFyZGluZyBpcyBub3QgZW5hYmxlZCBpZiB0b3RhbF9zaGFyZHMgID09IDEuCitURVNUX0YoU2hvdWxkU2hhcmRUZXN0LCBSZXR1cm5zRmFsc2VXaGVuVG90YWxTaGFyZElzT25lKSB7CisgIFNldEVudihpbmRleF92YXJfLCAiMCIpOworICBTZXRFbnYodG90YWxfdmFyXywgIjEiKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCB0cnVlKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc2hhcmRpbmcgaXMgZW5hYmxlZCBpZiB0b3RhbF9zaGFyZHMgPiAxIGFuZAorLy8gd2UgYXJlIG5vdCBpbiBhIGRlYXRoIHRlc3Qgc3VicHJvY2Vzcy4KKy8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIENFLgorI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorVEVTVF9GKFNob3VsZFNoYXJkVGVzdCwgV29ya3NXaGVuU2hhcmRFbnZWYXJzQXJlVmFsaWQpIHsKKyAgU2V0RW52KGluZGV4X3Zhcl8sICI0Iik7CisgIFNldEVudih0b3RhbF92YXJfLCAiMjIiKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpKTsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIHRydWUpKTsKKworICBTZXRFbnYoaW5kZXhfdmFyXywgIjgiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICI5Iik7CisgIEVYUEVDVF9UUlVFKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSk7CisgIEVYUEVDVF9GQUxTRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCB0cnVlKSk7CisKKyAgU2V0RW52KGluZGV4X3Zhcl8sICIwIik7CisgIFNldEVudih0b3RhbF92YXJfLCAiOSIpOworICBFWFBFQ1RfVFJVRShTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSkpOworICBFWFBFQ1RfRkFMU0UoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgdHJ1ZSkpOworfQorI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gVGVzdHMgdGhhdCB3ZSBleGl0IGluIGVycm9yIGlmIHRoZSBzaGFyZGluZyB2YWx1ZXMgYXJlIG5vdCB2YWxpZC4KKwordHlwZWRlZiBTaG91bGRTaGFyZFRlc3QgU2hvdWxkU2hhcmREZWF0aFRlc3Q7CisKK1RFU1RfRihTaG91bGRTaGFyZERlYXRoVGVzdCwgQWJvcnRzV2hlblNoYXJkaW5nRW52VmFyc0FyZUludmFsaWQpIHsKKyAgU2V0RW52KGluZGV4X3Zhcl8sICI0Iik7CisgIFNldEVudih0b3RhbF92YXJfLCAiNCIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSwgIi4qIik7CisKKyAgU2V0RW52KGluZGV4X3Zhcl8sICI0Iik7CisgIFNldEVudih0b3RhbF92YXJfLCAiLTIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChTaG91bGRTaGFyZCh0b3RhbF92YXJfLCBpbmRleF92YXJfLCBmYWxzZSksICIuKiIpOworCisgIFNldEVudihpbmRleF92YXJfLCAiNSIpOworICBTZXRFbnYodG90YWxfdmFyXywgIiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKFNob3VsZFNoYXJkKHRvdGFsX3Zhcl8sIGluZGV4X3Zhcl8sIGZhbHNlKSwgIi4qIik7CisKKyAgU2V0RW52KGluZGV4X3Zhcl8sICIiKTsKKyAgU2V0RW52KHRvdGFsX3Zhcl8sICI1Iik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoU2hvdWxkU2hhcmQodG90YWxfdmFyXywgaW5kZXhfdmFyXywgZmFsc2UpLCAiLioiKTsKK30KKworLy8gVGVzdHMgdGhhdCBTaG91bGRSdW5UZXN0T25TaGFyZCBpcyBhIHBhcnRpdGlvbiB3aGVuIDUKKy8vIHNoYXJkcyBhcmUgdXNlZC4KK1RFU1QoU2hvdWxkUnVuVGVzdE9uU2hhcmRUZXN0LCBJc1BhcnRpdGlvbldoZW5UaGVyZUFyZUZpdmVTaGFyZHMpIHsKKyAgLy8gQ2hvb3NlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdGVzdHMgYW5kIHNoYXJkcy4KKyAgY29uc3QgaW50IG51bV90ZXN0cyA9IDE3OworICBjb25zdCBpbnQgbnVtX3NoYXJkcyA9IDU7CisKKyAgLy8gQ2hlY2sgcGFydGl0aW9uaW5nOiBlYWNoIHRlc3Qgc2hvdWxkIGJlIG9uIGV4YWN0bHkgMSBzaGFyZC4KKyAgZm9yIChpbnQgdGVzdF9pZCA9IDA7IHRlc3RfaWQgPCBudW1fdGVzdHM7IHRlc3RfaWQrKykgeworICAgIGludCBwcmV2X3NlbGVjdGVkX3NoYXJkX2luZGV4ID0gLTE7CisgICAgZm9yIChpbnQgc2hhcmRfaW5kZXggPSAwOyBzaGFyZF9pbmRleCA8IG51bV9zaGFyZHM7IHNoYXJkX2luZGV4KyspIHsKKyAgICAgIGlmIChTaG91bGRSdW5UZXN0T25TaGFyZChudW1fc2hhcmRzLCBzaGFyZF9pbmRleCwgdGVzdF9pZCkpIHsKKyAgICAgICAgaWYgKHByZXZfc2VsZWN0ZWRfc2hhcmRfaW5kZXggPCAwKSB7CisgICAgICAgICAgcHJldl9zZWxlY3RlZF9zaGFyZF9pbmRleCA9IHNoYXJkX2luZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIlNoYXJkICIgPDwgcHJldl9zZWxlY3RlZF9zaGFyZF9pbmRleCA8PCAiIGFuZCAiCisgICAgICAgICAgICA8PCBzaGFyZF9pbmRleCA8PCAiIGFyZSBib3RoIHNlbGVjdGVkIHRvIHJ1biB0ZXN0ICIgPDwgdGVzdF9pZDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoZWNrIGJhbGFuY2U6IFRoaXMgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBzaGFyZGluZyBwcm90b2NvbCwgYnV0IGlzIGEKKyAgLy8gZGVzaXJhYmxlIHByb3BlcnR5IGZvciBwZXJmb3JtYW5jZS4KKyAgZm9yIChpbnQgc2hhcmRfaW5kZXggPSAwOyBzaGFyZF9pbmRleCA8IG51bV9zaGFyZHM7IHNoYXJkX2luZGV4KyspIHsKKyAgICBpbnQgbnVtX3Rlc3RzX29uX3NoYXJkID0gMDsKKyAgICBmb3IgKGludCB0ZXN0X2lkID0gMDsgdGVzdF9pZCA8IG51bV90ZXN0czsgdGVzdF9pZCsrKSB7CisgICAgICBudW1fdGVzdHNfb25fc2hhcmQgKz0KKyAgICAgICAgU2hvdWxkUnVuVGVzdE9uU2hhcmQobnVtX3NoYXJkcywgc2hhcmRfaW5kZXgsIHRlc3RfaWQpOworICAgIH0KKyAgICBFWFBFQ1RfR0UobnVtX3Rlc3RzX29uX3NoYXJkLCBudW1fdGVzdHMgLyBudW1fc2hhcmRzKTsKKyAgfQorfQorCisvLyBGb3IgdGhlIHNhbWUgcmVhc29uIHdlIGFyZSBub3QgZXhwbGljaXRseSB0ZXN0aW5nIGV2ZXJ5dGhpbmcgaW4gdGhlCisvLyBUZXN0IGNsYXNzLCB0aGVyZSBhcmUgbm8gc2VwYXJhdGUgdGVzdHMgZm9yIHRoZSBmb2xsb3dpbmcgY2xhc3NlcworLy8gKGV4Y2VwdCBmb3Igc29tZSB0cml2aWFsIGNhc2VzKToKKy8vCisvLyAgIFRlc3RDYXNlLCBVbml0VGVzdCwgVW5pdFRlc3RSZXN1bHRQcmludGVyLgorLy8KKy8vIFNpbWlsYXJseSwgdGhlcmUgYXJlIG5vIHNlcGFyYXRlIHRlc3RzIGZvciB0aGUgZm9sbG93aW5nIG1hY3JvczoKKy8vCisvLyAgIFRFU1QsIFRFU1RfRiwgUlVOX0FMTF9URVNUUworCitURVNUKFVuaXRUZXN0VGVzdCwgQ2FuR2V0T3JpZ2luYWxXb3JraW5nRGlyKSB7CisgIEFTU0VSVF9UUlVFKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpICE9IE5VTEwpOworICBFWFBFQ1RfU1RSTkUoVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCksICIiKTsKK30KKworVEVTVChVbml0VGVzdFRlc3QsIFJldHVybnNQbGF1c2libGVUaW1lc3RhbXApIHsKKyAgRVhQRUNUX0xUKDAsIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5zdGFydF90aW1lc3RhbXAoKSk7CisgIEVYUEVDVF9MRShVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+c3RhcnRfdGltZXN0YW1wKCksIEdldFRpbWVJbk1pbGxpcygpKTsKK30KKworLy8gV2hlbiBhIHByb3BlcnR5IHVzaW5nIGEgcmVzZXJ2ZWQga2V5IGlzIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24sIGl0CisvLyB0ZXN0cyB0aGF0IGEgbm9uLWZhdGFsIGZhaWx1cmUgaXMgYWRkZWQsIGEgZmF0YWwgZmFpbHVyZSBpcyBub3QgYWRkZWQsCisvLyBhbmQgdGhhdCB0aGUgcHJvcGVydHkgaXMgbm90IHJlY29yZGVkLgordm9pZCBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleSgKKyAgICBjb25zdCBUZXN0UmVzdWx0JiB0ZXN0X3Jlc3VsdCwgY29uc3QgY2hhcioga2V5KSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKFRlc3Q6OlJlY29yZFByb3BlcnR5KGtleSwgIjEiKSwgIlJlc2VydmVkIGtleSIpOworICBBU1NFUlRfRVEoMCwgdGVzdF9yZXN1bHQudGVzdF9wcm9wZXJ0eV9jb3VudCgpKSA8PCAiUHJvcGVydHkgZm9yIGtleSAnIiA8PCBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicgcmVjb3JkZWQgdW5leHBlY3RlZGx5LiI7Cit9CisKK3ZvaWQgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdCgKKyAgICBjb25zdCBjaGFyKiBrZXkpIHsKKyAgY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbyA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBBU1NFUlRfVFJVRSh0ZXN0X2luZm8gIT0gTlVMTCk7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KCp0ZXN0X2luZm8tPnJlc3VsdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkpOworfQorCit2b2lkIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3RDYXNlKAorICAgIGNvbnN0IGNoYXIqIGtleSkgeworICBjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9jYXNlKCk7CisgIEFTU0VSVF9UUlVFKHRlc3RfY2FzZSAhPSBOVUxMKTsKKyAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXkoCisgICAgICB0ZXN0X2Nhc2UtPmFkX2hvY190ZXN0X3Jlc3VsdCgpLCBrZXkpOworfQorCit2b2lkIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCisgICAgY29uc3QgY2hhcioga2V5KSB7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5KAorICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmFkX2hvY190ZXN0X3Jlc3VsdCgpLCBrZXkpOworfQorCisvLyBUZXN0cyB0aGF0IHByb3BlcnR5IHJlY29yZGluZyBmdW5jdGlvbnMgaW4gVW5pdFRlc3Qgb3V0c2lkZSBvZiB0ZXN0cworLy8gZnVuY3Rpb25zIGNvcnJlY2x5LiAgQ3JlYXRpbmcgYSBzZXBhcmF0ZSBpbnN0YW5jZSBvZiBVbml0VGVzdCBlbnN1cmVzIGl0CisvLyBpcyBpbiBhIHN0YXRlIHNpbWlsYXIgdG8gdGhlIFVuaXRUZXN0J3Mgc2luZ2xldG9uJ3MgYmV0d2VlbiB0ZXN0cy4KK2NsYXNzIFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0IDoKKyAgICBwdWJsaWMgdGVzdGluZzo6aW50ZXJuYWw6OlVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0SGVscGVyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdENhc2UoCisgICAgICAgICJkaXNhYmxlZCIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3RDYXNlKAorICAgICAgICAiZXJyb3JzIik7CisgICAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdENhc2UoCisgICAgICAgICJmYWlsdXJlcyIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3RDYXNlKAorICAgICAgICAibmFtZSIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3RDYXNlKAorICAgICAgICAidGVzdHMiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0Q2FzZSgKKyAgICAgICAgInRpbWUiKTsKKworICAgIFRlc3Q6OlJlY29yZFByb3BlcnR5KCJ0ZXN0X2Nhc2Vfa2V5XzEiLCAiMSIpOworICAgIGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2Nhc2UoKTsKKyAgICBBU1NFUlRfVFJVRSh0ZXN0X2Nhc2UgIT0gTlVMTCk7CisKKyAgICBBU1NFUlRfRVEoMSwgdGVzdF9jYXNlLT5hZF9ob2NfdGVzdF9yZXN1bHQoKS50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworICAgIEVYUEVDVF9TVFJFUSgidGVzdF9jYXNlX2tleV8xIiwKKyAgICAgICAgICAgICAgICAgdGVzdF9jYXNlLT5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMCkua2V5KCkpOworICAgIEVYUEVDVF9TVFJFUSgiMSIsCisgICAgICAgICAgICAgICAgIHRlc3RfY2FzZS0+YWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDApLnZhbHVlKCkpOworICB9Cit9OworCisvLyBUZXN0cyBUZXN0UmVzdWx0IGhhcyB0aGUgZXhwZWN0ZWQgcHJvcGVydHkgd2hlbiBhZGRlZC4KK1RFU1RfRihVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdCwgT25lUHJvcGVydHlGb3VuZFdoZW5BZGRlZCkgeworICBVbml0VGVzdFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7CisKKyAgQVNTRVJUX0VRKDEsIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkudGVzdF9wcm9wZXJ0eV9jb3VudCgpKTsKKworICBFWFBFQ1RfU1RSRVEoImtleV8xIiwKKyAgICAgICAgICAgICAgIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDApLmtleSgpKTsKKyAgRVhQRUNUX1NUUkVRKCIxIiwKKyAgICAgICAgICAgICAgIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDApLnZhbHVlKCkpOworfQorCisvLyBUZXN0cyBUZXN0UmVzdWx0IGhhcyBtdWx0aXBsZSBwcm9wZXJ0aWVzIHdoZW4gYWRkZWQuCitURVNUX0YoVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3QsIE11bHRpcGxlUHJvcGVydGllc0ZvdW5kV2hlbkFkZGVkKSB7CisgIFVuaXRUZXN0UmVjb3JkUHJvcGVydHkoImtleV8xIiwgIjEiKTsKKyAgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eSgia2V5XzIiLCAiMiIpOworCisgIEFTU0VSVF9FUSgyLCB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLnRlc3RfcHJvcGVydHlfY291bnQoKSk7CisKKyAgRVhQRUNUX1NUUkVRKCJrZXlfMSIsCisgICAgICAgICAgICAgICB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgwKS5rZXkoKSk7CisgIEVYUEVDVF9TVFJFUSgiMSIsIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDApLnZhbHVlKCkpOworCisgIEVYUEVDVF9TVFJFUSgia2V5XzIiLAorICAgICAgICAgICAgICAgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMSkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjIiLCB1bml0X3Rlc3RfLmFkX2hvY190ZXN0X3Jlc3VsdCgpLkdldFRlc3RQcm9wZXJ0eSgxKS52YWx1ZSgpKTsKK30KKworLy8gVGVzdHMgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoKSBvdmVycmlkZXMgdmFsdWVzIGZvciBkdXBsaWNhdGUga2V5cy4KK1RFU1RfRihVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdCwgT3ZlcnJpZGVzVmFsdWVzRm9yRHVwbGljYXRlS2V5cykgeworICBVbml0VGVzdFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7CisgIFVuaXRUZXN0UmVjb3JkUHJvcGVydHkoImtleV8yIiwgIjIiKTsKKyAgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMTIiKTsKKyAgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eSgia2V5XzIiLCAiMjIiKTsKKworICBBU1NFUlRfRVEoMiwgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS50ZXN0X3Byb3BlcnR5X2NvdW50KCkpOworCisgIEVYUEVDVF9TVFJFUSgia2V5XzEiLAorICAgICAgICAgICAgICAgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMCkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjEyIiwKKyAgICAgICAgICAgICAgIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDApLnZhbHVlKCkpOworCisgIEVYUEVDVF9TVFJFUSgia2V5XzIiLAorICAgICAgICAgICAgICAgdW5pdF90ZXN0Xy5hZF9ob2NfdGVzdF9yZXN1bHQoKS5HZXRUZXN0UHJvcGVydHkoMSkua2V5KCkpOworICBFWFBFQ1RfU1RSRVEoIjIyIiwKKyAgICAgICAgICAgICAgIHVuaXRfdGVzdF8uYWRfaG9jX3Rlc3RfcmVzdWx0KCkuR2V0VGVzdFByb3BlcnR5KDEpLnZhbHVlKCkpOworfQorCitURVNUX0YoVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3QsCisgICAgICAgQWRkRmFpbHVyZUluc2lkZVRlc3RzV2hlblVzaW5nVGVzdENhc2VSZXNlcnZlZEtleXMpIHsKKyAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdCgKKyAgICAgICJuYW1lIik7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3QoCisgICAgICAidmFsdWVfcGFyYW0iKTsKKyAgRXhwZWN0Tm9uRmF0YWxGYWlsdXJlUmVjb3JkaW5nUHJvcGVydHlXaXRoUmVzZXJ2ZWRLZXlGb3JDdXJyZW50VGVzdCgKKyAgICAgICJ0eXBlX3BhcmFtIik7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3QoCisgICAgICAic3RhdHVzIik7CisgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5Rm9yQ3VycmVudFRlc3QoCisgICAgICAidGltZSIpOworICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleUZvckN1cnJlbnRUZXN0KAorICAgICAgImNsYXNzbmFtZSIpOworfQorCitURVNUX0YoVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3QsCisgICAgICAgQWRkUmVjb3JkV2l0aFJlc2VydmVkS2V5c0dlbmVyYXRlc0NvcnJlY3RQcm9wZXJ0eUxpc3QpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBUZXN0OjpSZWNvcmRQcm9wZXJ0eSgibmFtZSIsICIxIiksCisgICAgICAiJ2NsYXNzbmFtZScsICduYW1lJywgJ3N0YXR1cycsICd0aW1lJywgJ3R5cGVfcGFyYW0nLCBhbmQgJ3ZhbHVlX3BhcmFtJyIKKyAgICAgICIgYXJlIHJlc2VydmVkIik7Cit9CisKK2NsYXNzIFVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgRW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCisgICAgICAgICJ0ZXN0cyIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCisgICAgICAgICJmYWlsdXJlcyIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCisgICAgICAgICJkaXNhYmxlZCIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCisgICAgICAgICJlcnJvcnMiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgICAgICAibmFtZSIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCisgICAgICAgICJ0aW1lc3RhbXAiKTsKKyAgICBFeHBlY3ROb25GYXRhbEZhaWx1cmVSZWNvcmRpbmdQcm9wZXJ0eVdpdGhSZXNlcnZlZEtleU91dHNpZGVPZlRlc3RDYXNlKAorICAgICAgICAidGltZSIpOworICAgIEV4cGVjdE5vbkZhdGFsRmFpbHVyZVJlY29yZGluZ1Byb3BlcnR5V2l0aFJlc2VydmVkS2V5T3V0c2lkZU9mVGVzdENhc2UoCisgICAgICAgICJyYW5kb21fc2VlZCIpOworICB9Cit9OworCisvLyBUaGlzIHdpbGwgdGVzdCBwcm9wZXJ0eSByZWNvcmRpbmcgb3V0c2lkZSBvZiBhbnkgdGVzdCBvciB0ZXN0IGNhc2UuCitzdGF0aWMgRW52aXJvbm1lbnQqIHJlY29yZF9wcm9wZXJ0eV9lbnYgPQorICAgIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RFbnZpcm9ubWVudCk7CisKKy8vIFRoaXMgZ3JvdXAgb2YgdGVzdHMgaXMgZm9yIHByZWRpY2F0ZSBhc3NlcnRpb25zIChBU1NFUlRfUFJFRCosIGV0YykKKy8vIG9mIHZhcmlvdXMgYXJpdGllcy4gIFRoZXkgZG8gbm90IGF0dGVtcHQgdG8gYmUgZXhoYXVzdGl2ZS4gIFJhdGhlciwKKy8vIHZpZXcgdGhlbSBhcyBzbW9rZSB0ZXN0cyB0aGF0IGNhbiBiZSBlYXNpbHkgcmV2aWV3ZWQgYW5kIHZlcmlmaWVkLgorLy8gQSBtb3JlIGNvbXBsZXRlIHNldCBvZiB0ZXN0cyBmb3IgcHJlZGljYXRlIGFzc2VydGlvbnMgY2FuIGJlIGZvdW5kCisvLyBpbiBndGVzdF9wcmVkX2ltcGxfdW5pdHRlc3QuY2MuCisKKy8vIEZpcnN0LCBzb21lIHByZWRpY2F0ZXMgYW5kIHByZWRpY2F0ZS1mb3JtYXR0ZXJzIG5lZWRlZCBieSB0aGUgdGVzdHMuCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGFyZ3VtZW50IGlzIGFuIGV2ZW4gbnVtYmVyLgorYm9vbCBJc0V2ZW4oaW50IG4pIHsKKyAgcmV0dXJuIChuICUgMikgPT0gMDsKK30KKworLy8gQSBmdW5jdG9yIHRoYXQgcmV0dXJucyB0cnVlIGlmZiB0aGUgYXJndW1lbnQgaXMgYW4gZXZlbiBudW1iZXIuCitzdHJ1Y3QgSXNFdmVuRnVuY3RvciB7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgbikgeyByZXR1cm4gSXNFdmVuKG4pOyB9Cit9OworCisvLyBBIHByZWRpY2F0ZS1mb3JtYXR0ZXIgZnVuY3Rpb24gdGhhdCBhc3NlcnRzIHRoZSBhcmd1bWVudCBpcyBhbiBldmVuCisvLyBudW1iZXIuCitBc3NlcnRpb25SZXN1bHQgQXNzZXJ0SXNFdmVuKGNvbnN0IGNoYXIqIGV4cHIsIGludCBuKSB7CisgIGlmIChJc0V2ZW4obikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBleHByIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgbiA8PCAiLCB3aGljaCBpcyBub3QgZXZlbi4iOworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZShtc2cpOworfQorCisvLyBBIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgQXNzZXJ0aW9uUmVzdWx0IGZvciB1c2UgaW4KKy8vIEVYUEVDVC9BU1NFUlRfVFJVRS9GQUxTRS4KK0Fzc2VydGlvblJlc3VsdCBSZXN1bHRJc0V2ZW4oaW50IG4pIHsKKyAgaWYgKElzRXZlbihuKSkKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpIDw8IG4gPDwgIiBpcyBldmVuIjsKKyAgZWxzZQorICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7Cit9CisKKy8vIEEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBBc3NlcnRpb25SZXN1bHQgYnV0IGdpdmVzIG5vCisvLyBleHBsYW5hdGlvbiB3aHkgaXQgc3VjY2VlZHMuIE5lZWRlZCBmb3IgdGVzdGluZyB0aGF0CisvLyBFWFBFQ1QvQVNTRVJUX0ZBTFNFIGhhbmRsZXMgc3VjaCBmdW5jdGlvbnMgY29ycmVjdGx5LgorQXNzZXJ0aW9uUmVzdWx0IFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oaW50IG4pIHsKKyAgaWYgKElzRXZlbihuKSkKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICBlbHNlCisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKK30KKworLy8gQSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IgdGhhdCBhc3NlcnRzIHRoZSBhcmd1bWVudCBpcyBhbiBldmVuCisvLyBudW1iZXIuCitzdHJ1Y3QgQXNzZXJ0SXNFdmVuRnVuY3RvciB7CisgIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGV4cHIsIGludCBuKSB7CisgICAgcmV0dXJuIEFzc2VydElzRXZlbihleHByLCBuKTsKKyAgfQorfTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgc3VtIG9mIHRoZSBhcmd1bWVudHMgaXMgYW4gZXZlbiBudW1iZXIuCitib29sIFN1bUlzRXZlbjIoaW50IG4xLCBpbnQgbjIpIHsKKyAgcmV0dXJuIElzRXZlbihuMSArIG4yKTsKK30KKworLy8gQSBmdW5jdG9yIHRoYXQgcmV0dXJucyB0cnVlIGlmZiB0aGUgc3VtIG9mIHRoZSBhcmd1bWVudHMgaXMgYW4gZXZlbgorLy8gbnVtYmVyLgorc3RydWN0IFN1bUlzRXZlbjNGdW5jdG9yIHsKKyAgYm9vbCBvcGVyYXRvcigpKGludCBuMSwgaW50IG4yLCBpbnQgbjMpIHsKKyAgICByZXR1cm4gSXNFdmVuKG4xICsgbjIgKyBuMyk7CisgIH0KK307CisKKy8vIEEgcHJlZGljYXRlLWZvcm1hdHRlciBmdW5jdGlvbiB0aGF0IGFzc2VydHMgdGhlIHN1bSBvZiB0aGUKKy8vIGFyZ3VtZW50cyBpcyBhbiBldmVuIG51bWJlci4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRTdW1Jc0V2ZW40KAorICAgIGNvbnN0IGNoYXIqIGUxLCBjb25zdCBjaGFyKiBlMiwgY29uc3QgY2hhciogZTMsIGNvbnN0IGNoYXIqIGU0LAorICAgIGludCBuMSwgaW50IG4yLCBpbnQgbjMsIGludCBuNCkgeworICBjb25zdCBpbnQgc3VtID0gbjEgKyBuMiArIG4zICsgbjQ7CisgIGlmIChJc0V2ZW4oc3VtKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8IGUxIDw8ICIgKyAiIDw8IGUyIDw8ICIgKyAiIDw8IGUzIDw8ICIgKyAiIDw8IGU0CisgICAgICA8PCAiICgiIDw8IG4xIDw8ICIgKyAiIDw8IG4yIDw8ICIgKyAiIDw8IG4zIDw8ICIgKyAiIDw8IG40CisgICAgICA8PCAiKSBldmFsdWF0ZXMgdG8gIiA8PCBzdW0gPDwgIiwgd2hpY2ggaXMgbm90IGV2ZW4uIjsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUobXNnKTsKK30KKworLy8gQSBwcmVkaWNhdGUtZm9ybWF0dGVyIGZ1bmN0b3IgdGhhdCBhc3NlcnRzIHRoZSBzdW0gb2YgdGhlIGFyZ3VtZW50cworLy8gaXMgYW4gZXZlbiBudW1iZXIuCitzdHJ1Y3QgQXNzZXJ0U3VtSXNFdmVuNUZ1bmN0b3IgeworICBBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IoKSgKKyAgICAgIGNvbnN0IGNoYXIqIGUxLCBjb25zdCBjaGFyKiBlMiwgY29uc3QgY2hhciogZTMsIGNvbnN0IGNoYXIqIGU0LAorICAgICAgY29uc3QgY2hhciogZTUsIGludCBuMSwgaW50IG4yLCBpbnQgbjMsIGludCBuNCwgaW50IG41KSB7CisgICAgY29uc3QgaW50IHN1bSA9IG4xICsgbjIgKyBuMyArIG40ICsgbjU7CisgICAgaWYgKElzRXZlbihzdW0pKSB7CisgICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICAgIH0KKworICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCBlMSA8PCAiICsgIiA8PCBlMiA8PCAiICsgIiA8PCBlMyA8PCAiICsgIiA8PCBlNCA8PCAiICsgIiA8PCBlNQorICAgICAgICA8PCAiICgiCisgICAgICAgIDw8IG4xIDw8ICIgKyAiIDw8IG4yIDw8ICIgKyAiIDw8IG4zIDw8ICIgKyAiIDw8IG40IDw8ICIgKyAiIDw8IG41CisgICAgICAgIDw8ICIpIGV2YWx1YXRlcyB0byAiIDw8IHN1bSA8PCAiLCB3aGljaCBpcyBub3QgZXZlbi4iOworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKG1zZyk7CisgIH0KK307CisKKworLy8gVGVzdHMgdW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbnMuCisKKy8vIFRlc3RzIHVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zIHRoYXQgZG9uJ3QgdXNlIGEgY3VzdG9tIGZvcm1hdHRlci4KK1RFU1QoUHJlZDFUZXN0LCBXaXRob3V0Rm9ybWF0KSB7CisgIC8vIFN1Y2Nlc3MgY2FzZXMuCisgIEVYUEVDVF9QUkVEMShJc0V2ZW5GdW5jdG9yKCksIDIpIDw8ICJUaGlzIGZhaWx1cmUgaXMgVU5FWFBFQ1RFRCEiOworICBBU1NFUlRfUFJFRDEoSXNFdmVuLCA0KTsKKworICAvLyBGYWlsdXJlIGNhc2VzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRDEoSXNFdmVuLCA1KSA8PCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiI7CisgIH0sICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9QUkVEMShJc0V2ZW5GdW5jdG9yKCksIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAiZXZhbHVhdGVzIHRvIGZhbHNlIik7Cit9CisKKy8vIFRlc3RzIHVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb25zIHRoYXQgdXNlIGEgY3VzdG9tIGZvcm1hdHRlci4KK1RFU1QoUHJlZDFUZXN0LCBXaXRoRm9ybWF0KSB7CisgIC8vIFN1Y2Nlc3MgY2FzZXMuCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoQXNzZXJ0SXNFdmVuLCAyKTsKKyAgQVNTRVJUX1BSRURfRk9STUFUMShBc3NlcnRJc0V2ZW5GdW5jdG9yKCksIDQpCisgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBVTkVYUEVDVEVEISI7CisKKyAgLy8gRmFpbHVyZSBjYXNlcy4KKyAgY29uc3QgaW50IG4gPSA1OworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfUFJFRF9GT1JNQVQxKEFzc2VydElzRXZlbkZ1bmN0b3IoKSwgbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuIGV2YWx1YXRlcyB0byA1LCB3aGljaCBpcyBub3QgZXZlbi4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMShBc3NlcnRJc0V2ZW4sIDUpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKK30KKworLy8gVGVzdHMgdGhhdCB1bmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9ucyBldmFsdWF0ZXMgdGhlaXIgYXJndW1lbnRzCisvLyBleGFjdGx5IG9uY2UuCitURVNUKFByZWQxVGVzdCwgU2luZ2xlRXZhbHVhdGlvbk9uRmFpbHVyZSkgeworICAvLyBBIHN1Y2Nlc3MgY2FzZS4KKyAgc3RhdGljIGludCBuID0gMDsKKyAgRVhQRUNUX1BSRUQxKElzRXZlbiwgbisrKTsKKyAgRVhQRUNUX0VRKDEsIG4pIDw8ICJUaGUgYXJndW1lbnQgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKworICAvLyBBIGZhaWx1cmUgY2FzZS4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1BSRURfRk9STUFUMShBc3NlcnRJc0V2ZW5GdW5jdG9yKCksIG4rKykKKyAgICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworICBFWFBFQ1RfRVEoMiwgbikgPDwgIlRoZSBhcmd1bWVudCBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworfQorCisKKy8vIFRlc3RzIHByZWRpY2F0ZSBhc3NlcnRpb25zIHdob3NlIGFyaXR5IGlzID49IDIuCisKKy8vIFRlc3RzIHByZWRpY2F0ZSBhc3NlcnRpb25zIHRoYXQgZG9uJ3QgdXNlIGEgY3VzdG9tIGZvcm1hdHRlci4KK1RFU1QoUHJlZFRlc3QsIFdpdGhvdXRGb3JtYXQpIHsKKyAgLy8gU3VjY2VzcyBjYXNlcy4KKyAgQVNTRVJUX1BSRUQyKFN1bUlzRXZlbjIsIDIsIDQpIDw8ICJUaGlzIGZhaWx1cmUgaXMgVU5FWFBFQ1RFRCEiOworICBFWFBFQ1RfUFJFRDMoU3VtSXNFdmVuM0Z1bmN0b3IoKSwgNCwgNiwgOCk7CisKKyAgLy8gRmFpbHVyZSBjYXNlcy4KKyAgY29uc3QgaW50IG4xID0gMTsKKyAgY29uc3QgaW50IG4yID0gMjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQyKFN1bUlzRXZlbjIsIG4xLCBuMikgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRDMoU3VtSXNFdmVuM0Z1bmN0b3IoKSwgMSwgMiwgNCk7CisgIH0sICJldmFsdWF0ZXMgdG8gZmFsc2UiKTsKK30KKworLy8gVGVzdHMgcHJlZGljYXRlIGFzc2VydGlvbnMgdGhhdCB1c2UgYSBjdXN0b20gZm9ybWF0dGVyLgorVEVTVChQcmVkVGVzdCwgV2l0aEZvcm1hdCkgeworICAvLyBTdWNjZXNzIGNhc2VzLgorICBBU1NFUlRfUFJFRF9GT1JNQVQ0KEFzc2VydFN1bUlzRXZlbjQsIDQsIDYsIDgsIDEwKSA8PAorICAgICJUaGlzIGZhaWx1cmUgaXMgVU5FWFBFQ1RFRCEiOworICBFWFBFQ1RfUFJFRF9GT1JNQVQ1KEFzc2VydFN1bUlzRXZlbjVGdW5jdG9yKCksIDIsIDQsIDYsIDgsIDEwKTsKKworICAvLyBGYWlsdXJlIGNhc2VzLgorICBjb25zdCBpbnQgbjEgPSAxOworICBjb25zdCBpbnQgbjIgPSAyOworICBjb25zdCBpbnQgbjMgPSA0OworICBjb25zdCBpbnQgbjQgPSA2OworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KEFzc2VydFN1bUlzRXZlbjQsIG4xLCBuMiwgbjMsIG40KTsKKyAgfSwgImV2YWx1YXRlcyB0byAxMywgd2hpY2ggaXMgbm90IGV2ZW4uIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDUoQXNzZXJ0U3VtSXNFdmVuNUZ1bmN0b3IoKSwgMSwgMiwgNCwgNiwgOCkKKyAgICAgICAgPDwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkLiIpOworfQorCisvLyBUZXN0cyB0aGF0IHByZWRpY2F0ZSBhc3NlcnRpb25zIGV2YWx1YXRlcyB0aGVpciBhcmd1bWVudHMKKy8vIGV4YWN0bHkgb25jZS4KK1RFU1QoUHJlZFRlc3QsIFNpbmdsZUV2YWx1YXRpb25PbkZhaWx1cmUpIHsKKyAgLy8gQSBzdWNjZXNzIGNhc2UuCisgIGludCBuMSA9IDA7CisgIGludCBuMiA9IDA7CisgIEVYUEVDVF9QUkVEMihTdW1Jc0V2ZW4yLCBuMSsrLCBuMisrKTsKKyAgRVhQRUNUX0VRKDEsIG4xKSA8PCAiQXJndW1lbnQgMSBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjIpIDw8ICJBcmd1bWVudCAyIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisKKyAgLy8gQW5vdGhlciBzdWNjZXNzIGNhc2UuCisgIG4xID0gbjIgPSAwOworICBpbnQgbjMgPSAwOworICBpbnQgbjQgPSAwOworICBpbnQgbjUgPSAwOworICBBU1NFUlRfUFJFRF9GT1JNQVQ1KEFzc2VydFN1bUlzRXZlbjVGdW5jdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgbjErKywgbjIrKywgbjMrKywgbjQrKywgbjUrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgVU5FWFBFQ1RFRCEiOworICBFWFBFQ1RfRVEoMSwgbjEpIDw8ICJBcmd1bWVudCAxIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMikgPDwgIkFyZ3VtZW50IDIgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4zKSA8PCAiQXJndW1lbnQgMyBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjQpIDw8ICJBcmd1bWVudCA0IGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuNSkgPDwgIkFyZ3VtZW50IDUgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKworICAvLyBBIGZhaWx1cmUgY2FzZS4KKyAgbjEgPSBuMiA9IG4zID0gMDsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRUQzKFN1bUlzRXZlbjNGdW5jdG9yKCksICsrbjEsIG4yKyssIG4zKyspCisgICAgICAgIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0VRKDEsIG4xKSA8PCAiQXJndW1lbnQgMSBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjIpIDw8ICJBcmd1bWVudCAyIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMykgPDwgIkFyZ3VtZW50IDMgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKworICAvLyBBbm90aGVyIGZhaWx1cmUgY2FzZS4KKyAgbjEgPSBuMiA9IG4zID0gbjQgPSAwOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQ0KEFzc2VydFN1bUlzRXZlbjQsICsrbjEsIG4yKyssIG4zKyssIG40KyspOworICB9LCAiZXZhbHVhdGVzIHRvIDEsIHdoaWNoIGlzIG5vdCBldmVuLiIpOworICBFWFBFQ1RfRVEoMSwgbjEpIDw8ICJBcmd1bWVudCAxIGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7CisgIEVYUEVDVF9FUSgxLCBuMikgPDwgIkFyZ3VtZW50IDIgaXMgbm90IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuIjsKKyAgRVhQRUNUX0VRKDEsIG4zKSA8PCAiQXJndW1lbnQgMyBpcyBub3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4iOworICBFWFBFQ1RfRVEoMSwgbjQpIDw8ICJBcmd1bWVudCA0IGlzIG5vdCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLiI7Cit9CisKKworLy8gU29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciB0ZXN0aW5nIHVzaW5nIG92ZXJsb2FkZWQvdGVtcGxhdGUKKy8vIGZ1bmN0aW9ucyB3aXRoIEFTU0VSVF9QUkVEbiBhbmQgRVhQRUNUX1BSRURuLgorCitib29sIElzUG9zaXRpdmUoZG91YmxlIHgpIHsKKyAgcmV0dXJuIHggPiAwOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgSXNOZWdhdGl2ZShUIHgpIHsKKyAgcmV0dXJuIHggPCAwOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBHcmVhdGVyVGhhbihUMSB4MSwgVDIgeDIpIHsKKyAgcmV0dXJuIHgxID4geDI7Cit9CisKKy8vIFRlc3RzIHRoYXQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW4gKl9QUkVEKiBhcyBsb25nIGFzCisvLyB0aGVpciB0eXBlcyBhcmUgZXhwbGljaXRseSBzcGVjaWZpZWQuCitURVNUKFByZWRpY2F0ZUFzc2VydGlvblRlc3QsIEFjY2VwdHNPdmVybG9hZGVkRnVuY3Rpb24pIHsKKyAgLy8gQysrQnVpbGRlciByZXF1aXJlcyBDLXN0eWxlIGNhc3RzIHJhdGhlciB0aGFuIHN0YXRpY19jYXN0LgorICBFWFBFQ1RfUFJFRDEoKGJvb2wgKCopKGludCkpKElzUG9zaXRpdmUpLCA1KTsgIC8vIE5PTElOVAorICBBU1NFUlRfUFJFRDEoKGJvb2wgKCopKGRvdWJsZSkpKElzUG9zaXRpdmUpLCA2LjApOyAgLy8gTk9MSU5UCit9CisKKy8vIFRlc3RzIHRoYXQgdGVtcGxhdGUgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluICpfUFJFRCogYXMgbG9uZyBhcworLy8gdGhlaXIgdHlwZXMgYXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorVEVTVChQcmVkaWNhdGVBc3NlcnRpb25UZXN0LCBBY2NlcHRzVGVtcGxhdGVGdW5jdGlvbikgeworICBFWFBFQ1RfUFJFRDEoSXNOZWdhdGl2ZTxpbnQ+LCAtNSk7CisgIC8vIE1ha2VzIHN1cmUgdGhhdCB3ZSBjYW4gaGFuZGxlIHRlbXBsYXRlcyB3aXRoIG1vcmUgdGhhbiBvbmUKKyAgLy8gcGFyYW1ldGVyLgorICBBU1NFUlRfUFJFRDIoKEdyZWF0ZXJUaGFuPGludCwgaW50PiksIDUsIDApOworfQorCisKKy8vIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGVzdGluZyB1c2luZyBvdmVybG9hZGVkL3RlbXBsYXRlCisvLyBmdW5jdGlvbnMgd2l0aCBBU1NFUlRfUFJFRF9GT1JNQVRuIGFuZCBFWFBFQ1RfUFJFRF9GT1JNQVRuLgorCitBc3NlcnRpb25SZXN1bHQgSXNQb3NpdGl2ZUZvcm1hdChjb25zdCBjaGFyKiAvKiBleHByICovLCBpbnQgbikgeworICByZXR1cm4gbiA+IDAgPyBBc3NlcnRpb25TdWNjZXNzKCkgOgorICAgICAgQXNzZXJ0aW9uRmFpbHVyZShNZXNzYWdlKCkgPDwgIkZhaWx1cmUiKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzUG9zaXRpdmVGb3JtYXQoY29uc3QgY2hhciogLyogZXhwciAqLywgZG91YmxlIHgpIHsKKyAgcmV0dXJuIHggPiAwID8gQXNzZXJ0aW9uU3VjY2VzcygpIDoKKyAgICAgIEFzc2VydGlvbkZhaWx1cmUoTWVzc2FnZSgpIDw8ICJGYWlsdXJlIik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorQXNzZXJ0aW9uUmVzdWx0IElzTmVnYXRpdmVGb3JtYXQoY29uc3QgY2hhciogLyogZXhwciAqLywgVCB4KSB7CisgIHJldHVybiB4IDwgMCA/IEFzc2VydGlvblN1Y2Nlc3MoKSA6CisgICAgICBBc3NlcnRpb25GYWlsdXJlKE1lc3NhZ2UoKSA8PCAiRmFpbHVyZSIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorQXNzZXJ0aW9uUmVzdWx0IEVxdWFsc0Zvcm1hdChjb25zdCBjaGFyKiAvKiBleHByMSAqLywgY29uc3QgY2hhciogLyogZXhwcjIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB4MSwgY29uc3QgVDImIHgyKSB7CisgIHJldHVybiB4MSA9PSB4MiA/IEFzc2VydGlvblN1Y2Nlc3MoKSA6CisgICAgICBBc3NlcnRpb25GYWlsdXJlKE1lc3NhZ2UoKSA8PCAiRmFpbHVyZSIpOworfQorCisvLyBUZXN0cyB0aGF0IG92ZXJsb2FkZWQgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluICpfUFJFRF9GT1JNQVQqCisvLyB3aXRob3V0IGV4cGxpY2l0bHkgc3BlY2lmeWluZyB0aGVpciB0eXBlcy4KK1RFU1QoUHJlZGljYXRlRm9ybWF0QXNzZXJ0aW9uVGVzdCwgQWNjZXB0c092ZXJsb2FkZWRGdW5jdGlvbikgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQxKElzUG9zaXRpdmVGb3JtYXQsIDUpOworICBBU1NFUlRfUFJFRF9GT1JNQVQxKElzUG9zaXRpdmVGb3JtYXQsIDYuMCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGVtcGxhdGUgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluICpfUFJFRF9GT1JNQVQqIHdpdGhvdXQKKy8vIGV4cGxpY2l0bHkgc3BlY2lmeWluZyB0aGVpciB0eXBlcy4KK1RFU1QoUHJlZGljYXRlRm9ybWF0QXNzZXJ0aW9uVGVzdCwgQWNjZXB0c1RlbXBsYXRlRnVuY3Rpb24pIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMShJc05lZ2F0aXZlRm9ybWF0LCAtNSk7CisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRXF1YWxzRm9ybWF0LCAzLCAzKTsKK30KKworCisvLyBUZXN0cyBzdHJpbmcgYXNzZXJ0aW9ucy4KKworLy8gVGVzdHMgQVNTRVJUX1NUUkVRIHdpdGggbm9uLU5VTEwgYXJndW1lbnRzLgorVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBBU1NFUlRfU1RSRVEpIHsKKyAgY29uc3QgY2hhciAqIGNvbnN0IHAxID0gImdvb2QiOworICBBU1NFUlRfU1RSRVEocDEsIHAxKTsKKworICAvLyBMZXQgcDIgaGF2ZSB0aGUgc2FtZSBjb250ZW50IGFzIHAxLCBidXQgYmUgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcy4KKyAgY29uc3QgY2hhciBwMltdID0gImdvb2QiOworICBBU1NFUlRfU1RSRVEocDEsIHAyKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSRVEoImJhZCIsICJnb29kIiksCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogXCJiYWRcIiIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfU1RSRVEgd2l0aCBOVUxMIGFyZ3VtZW50cy4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1NUUkVRX051bGwpIHsKKyAgQVNTRVJUX1NUUkVRKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oTlVMTCksIE5VTEwpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSRVEoTlVMTCwgIm5vbi1udWxsIiksCisgICAgICAgICAgICAgICAgICAgICAgICJub24tbnVsbCIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfU1RSRVEgd2l0aCBOVUxMIGFyZ3VtZW50cy4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1NUUkVRX051bGwyKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJFUSgibm9uLW51bGwiLCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1udWxsIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9TVFJORS4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1NUUk5FKSB7CisgIEFTU0VSVF9TVFJORSgiaGkiLCAiSGkiKTsKKyAgQVNTRVJUX1NUUk5FKCJIaSIsIE5VTEwpOworICBBU1NFUlRfU1RSTkUoTlVMTCwgIkhpIik7CisgIEFTU0VSVF9TVFJORSgiIiwgTlVMTCk7CisgIEFTU0VSVF9TVFJORShOVUxMLCAiIik7CisgIEFTU0VSVF9TVFJORSgiIiwgIkhpIik7CisgIEFTU0VSVF9TVFJORSgiSGkiLCAiIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJORSgiSGkiLCAiSGkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlwiSGlcIiB2cyBcIkhpXCIiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX1NUUkNBU0VFUS4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1NUUkNBU0VFUSkgeworICBBU1NFUlRfU1RSQ0FTRUVRKCJoaSIsICJIaSIpOworICBBU1NFUlRfU1RSQ0FTRUVRKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oTlVMTCksIE5VTEwpOworCisgIEFTU0VSVF9TVFJDQVNFRVEoIiIsICIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkNBU0VFUSgiSGkiLCAiaGkyIiksCisgICAgICAgICAgICAgICAgICAgICAgICIoaWdub3JpbmcgY2FzZSkiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX1NUUkNBU0VORS4KK1RFU1QoU3RyaW5nQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1NUUkNBU0VORSkgeworICBBU1NFUlRfU1RSQ0FTRU5FKCJoaTEiLCAiSGkyIik7CisgIEFTU0VSVF9TVFJDQVNFTkUoIkhpIiwgTlVMTCk7CisgIEFTU0VSVF9TVFJDQVNFTkUoTlVMTCwgIkhpIik7CisgIEFTU0VSVF9TVFJDQVNFTkUoIiIsIE5VTEwpOworICBBU1NFUlRfU1RSQ0FTRU5FKE5VTEwsICIiKTsKKyAgQVNTRVJUX1NUUkNBU0VORSgiIiwgIkhpIik7CisgIEFTU0VSVF9TVFJDQVNFTkUoIkhpIiwgIiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSQ0FTRU5FKCJIaSIsICJoaSIpLAorICAgICAgICAgICAgICAgICAgICAgICAiKGlnbm9yaW5nIGNhc2UpIik7Cit9CisKKy8vIFRlc3RzICpfU1RSRVEgb24gd2lkZSBzdHJpbmdzLgorVEVTVChTdHJpbmdBc3NlcnRpb25UZXN0LCBTVFJFUV9XaWRlKSB7CisgIC8vIE5VTEwgc3RyaW5ncy4KKyAgQVNTRVJUX1NUUkVRKHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QgKj4oTlVMTCksIE5VTEwpOworCisgIC8vIEVtcHR5IHN0cmluZ3MuCisgIEFTU0VSVF9TVFJFUShMIiIsIEwiIik7CisKKyAgLy8gTm9uLW51bGwgdnMgTlVMTC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkVRKEwibm9uLW51bGwiLCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1udWxsIik7CisKKyAgLy8gRXF1YWwgc3RyaW5ncy4KKyAgRVhQRUNUX1NUUkVRKEwiSGkiLCBMIkhpIik7CisKKyAgLy8gVW5lcXVhbCBzdHJpbmdzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSRVEoTCJhYmMiLCBMIkFiYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJjIik7CisKKyAgLy8gU3RyaW5ncyBjb250YWluaW5nIHdpZGUgY2hhcmFjdGVycy4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkVRKEwiYWJjXHg4MTE5IiwgTCJhYmNceDgxMjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYyIpOworCisgIC8vIFRoZSBzdHJlYW1pbmcgdmFyaWF0aW9uLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfU1RSRVEoTCJhYmNceDgxMTkiLCBMImFiY1x4ODEyMSIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlIjsKKyAgfSwgIkV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgKl9TVFJORSBvbiB3aWRlIHN0cmluZ3MuCitURVNUKFN0cmluZ0Fzc2VydGlvblRlc3QsIFNUUk5FX1dpZGUpIHsKKyAgLy8gTlVMTCBzdHJpbmdzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfU1RSTkUoc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCAqPihOVUxMKSwgTlVMTCk7CisgIH0sICIiKTsKKworICAvLyBFbXB0eSBzdHJpbmdzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSTkUoTCIiLCBMIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTFwiXCIiKTsKKworICAvLyBOb24tbnVsbCB2cyBOVUxMLgorICBBU1NFUlRfU1RSTkUoTCJub24tbnVsbCIsIE5VTEwpOworCisgIC8vIEVxdWFsIHN0cmluZ3MuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJORShMIkhpIiwgTCJIaSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTFwiSGlcIiIpOworCisgIC8vIFVuZXF1YWwgc3RyaW5ncy4KKyAgRVhQRUNUX1NUUk5FKEwiYWJjIiwgTCJBYmMiKTsKKworICAvLyBTdHJpbmdzIGNvbnRhaW5pbmcgd2lkZSBjaGFyYWN0ZXJzLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSTkUoTCJhYmNceDgxMTkiLCBMImFiY1x4ODExOSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIik7CisKKyAgLy8gVGhlIHN0cmVhbWluZyB2YXJpYXRpb24uCisgIEFTU0VSVF9TVFJORShMImFiY1x4ODExOSIsIEwiYWJjXHg4MTIwIikgPDwgIlRoaXMgc2hvdWxkbid0IGhhcHBlbiI7Cit9CisKKy8vIFRlc3RzIGZvciA6OnRlc3Rpbmc6OklzU3Vic3RyaW5nKCkuCisKKy8vIFRlc3RzIHRoYXQgSXNTdWJzdHJpbmcoKSByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCBjaGFyKi4KK1RFU1QoSXNTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvckNTdHJpbmcpIHsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgTlVMTCwgImEiKSk7CisgIEVYUEVDVF9GQUxTRShJc1N1YnN0cmluZygiIiwgIiIsICJiIiwgTlVMTCkpOworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCAibmVlZGxlIiwgImhheXN0YWNrIikpOworCisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KE5VTEwpLCBOVUxMKSk7CisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgIm5lZWRsZSIsICJ0d28gbmVlZGxlcyIpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IHdjaGFyX3QqLgorVEVTVChJc1N1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yV2lkZUNTdHJpbmcpIHsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwga051bGwsIEwiYSIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgTCJiIiwga051bGwpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCBMImhheXN0YWNrIikpOworCisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KE5VTEwpLCBOVUxMKSk7CisgIEVYUEVDVF9UUlVFKElzU3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCBMInR3byBuZWVkbGVzIikpOworfQorCisvLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nKCkgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IG1lc3NhZ2Ugd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgY29uc3QgY2hhciouCitURVNUKElzU3Vic3RyaW5nVGVzdCwgR2VuZXJhdGVzQ29ycmVjdE1lc3NhZ2VGb3JDU3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiVmFsdWUgb2Y6IG5lZWRsZV9leHByXG4iCisgICAgICAgICAgICAgICAiICBBY3R1YWw6IFwibmVlZGxlXCJcbiIKKyAgICAgICAgICAgICAgICJFeHBlY3RlZDogYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2tfZXhwclxuIgorICAgICAgICAgICAgICAgIldoaWNoIGlzOiBcImhheXN0YWNrXCIiLAorICAgICAgICAgICAgICAgSXNTdWJzdHJpbmcoIm5lZWRsZV9leHByIiwgImhheXN0YWNrX2V4cHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRsZSIsICJoYXlzdGFjayIpLmZhaWx1cmVfbWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZyByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6c3RyaW5nLgorVEVTVChJc1N1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0c0ZvclN0ZFN0cmluZykgeworICBFWFBFQ1RfVFJVRShJc1N1YnN0cmluZygiIiwgIiIsIHN0ZDo6c3RyaW5nKCJoZWxsbyIpLCAiYWhlbGxvYiIpKTsKKyAgRVhQRUNUX0ZBTFNFKElzU3Vic3RyaW5nKCIiLCAiIiwgImhlbGxvIiwgc3RkOjpzdHJpbmcoIndvcmxkIikpKTsKK30KKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gVGVzdHMgdGhhdCBJc1N1YnN0cmluZyByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6d3N0cmluZy4KK1RFU1QoSXNTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvclN0ZFdzdHJpbmcpIHsKKyAgRVhQRUNUX1RSVUUoSXNTdWJzdHJpbmcoIiIsICIiLCA6OnN0ZDo6d3N0cmluZyhMIm5lZWRsZSIpLCBMInR3byBuZWVkbGVzIikpOworICBFWFBFQ1RfRkFMU0UoSXNTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIDo6c3RkOjp3c3RyaW5nKEwiaGF5c3RhY2siKSkpOworfQorCisvLyBUZXN0cyB0aGF0IElzU3Vic3RyaW5nKCkgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IG1lc3NhZ2Ugd2hlbiB0aGUgaW5wdXQKKy8vIGFyZ3VtZW50IHR5cGUgaXMgOjpzdGQ6OndzdHJpbmcuCitURVNUKElzU3Vic3RyaW5nVGVzdCwgR2VuZXJhdGVzQ29ycmVjdE1lc3NhZ2VGb3JXc3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiVmFsdWUgb2Y6IG5lZWRsZV9leHByXG4iCisgICAgICAgICAgICAgICAiICBBY3R1YWw6IExcIm5lZWRsZVwiXG4iCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrX2V4cHJcbiIKKyAgICAgICAgICAgICAgICJXaGljaCBpczogTFwiaGF5c3RhY2tcIiIsCisgICAgICAgICAgICAgICBJc1N1YnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAibmVlZGxlX2V4cHIiLCAiaGF5c3RhY2tfZXhwciIsCisgICAgICAgICAgICAgICAgICAgOjpzdGQ6OndzdHJpbmcoTCJuZWVkbGUiKSwgTCJoYXlzdGFjayIpLmZhaWx1cmVfbWVzc2FnZSgpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworLy8gVGVzdHMgZm9yIDo6dGVzdGluZzo6SXNOb3RTdWJzdHJpbmcoKS4KKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZygpIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIGNvbnN0IGNoYXIqLgorVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0Rm9yQ1N0cmluZykgeworICBFWFBFQ1RfVFJVRShJc05vdFN1YnN0cmluZygiIiwgIiIsICJuZWVkbGUiLCAiaGF5c3RhY2siKSk7CisgIEVYUEVDVF9GQUxTRShJc05vdFN1YnN0cmluZygiIiwgIiIsICJuZWVkbGUiLCAidHdvIG5lZWRsZXMiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNOb3RTdWJzdHJpbmcoKSByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCB3Y2hhcl90Ki4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvcldpZGVDU3RyaW5nKSB7CisgIEVYUEVDVF9UUlVFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgTCJuZWVkbGUiLCBMImhheXN0YWNrIikpOworICBFWFBFQ1RfRkFMU0UoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCBMIm5lZWRsZSIsIEwidHdvIG5lZWRsZXMiKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSXNOb3RTdWJzdHJpbmcoKSBnZW5lcmF0ZXMgdGhlIGNvcnJlY3QgbWVzc2FnZSB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyBjb25zdCB3Y2hhcl90Ki4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBHZW5lcmF0ZXNDb3JyZWN0TWVzc2FnZUZvcldpZGVDU3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiVmFsdWUgb2Y6IG5lZWRsZV9leHByXG4iCisgICAgICAgICAgICAgICAiICBBY3R1YWw6IExcIm5lZWRsZVwiXG4iCisgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IG5vdCBhIHN1YnN0cmluZyBvZiBoYXlzdGFja19leHByXG4iCisgICAgICAgICAgICAgICAiV2hpY2ggaXM6IExcInR3byBuZWVkbGVzXCIiLAorICAgICAgICAgICAgICAgSXNOb3RTdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIm5lZWRsZV9leHByIiwgImhheXN0YWNrX2V4cHIiLAorICAgICAgICAgICAgICAgICAgIEwibmVlZGxlIiwgTCJ0d28gbmVlZGxlcyIpLmZhaWx1cmVfbWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZyByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6c3RyaW5nLgorVEVTVChJc05vdFN1YnN0cmluZ1Rlc3QsIFJldHVybnNDb3JyZWN0UmVzdWx0c0ZvclN0ZFN0cmluZykgeworICBFWFBFQ1RfRkFMU0UoSXNOb3RTdWJzdHJpbmcoIiIsICIiLCBzdGQ6OnN0cmluZygiaGVsbG8iKSwgImFoZWxsb2IiKSk7CisgIEVYUEVDVF9UUlVFKElzTm90U3Vic3RyaW5nKCIiLCAiIiwgImhlbGxvIiwgc3RkOjpzdHJpbmcoIndvcmxkIikpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZygpIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBtZXNzYWdlIHdoZW4gdGhlIGlucHV0CisvLyBhcmd1bWVudCB0eXBlIGlzIDo6c3RkOjpzdHJpbmcuCitURVNUKElzTm90U3Vic3RyaW5nVGVzdCwgR2VuZXJhdGVzQ29ycmVjdE1lc3NhZ2VGb3JTdGRTdHJpbmcpIHsKKyAgRVhQRUNUX1NUUkVRKCJWYWx1ZSBvZjogbmVlZGxlX2V4cHJcbiIKKyAgICAgICAgICAgICAgICIgIEFjdHVhbDogXCJuZWVkbGVcIlxuIgorICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBub3QgYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2tfZXhwclxuIgorICAgICAgICAgICAgICAgIldoaWNoIGlzOiBcInR3byBuZWVkbGVzXCIiLAorICAgICAgICAgICAgICAgSXNOb3RTdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIm5lZWRsZV9leHByIiwgImhheXN0YWNrX2V4cHIiLAorICAgICAgICAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIm5lZWRsZSIpLCAidHdvIG5lZWRsZXMiKS5mYWlsdXJlX21lc3NhZ2UoKSk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworLy8gVGVzdHMgdGhhdCBJc05vdFN1YnN0cmluZyByZXR1cm5zIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGVuIHRoZSBpbnB1dAorLy8gYXJndW1lbnQgdHlwZSBpcyA6OnN0ZDo6d3N0cmluZy4KK1RFU1QoSXNOb3RTdWJzdHJpbmdUZXN0LCBSZXR1cm5zQ29ycmVjdFJlc3VsdEZvclN0ZFdzdHJpbmcpIHsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgSXNOb3RTdWJzdHJpbmcoIiIsICIiLCA6OnN0ZDo6d3N0cmluZyhMIm5lZWRsZSIpLCBMInR3byBuZWVkbGVzIikpOworICBFWFBFQ1RfVFJVRShJc05vdFN1YnN0cmluZygiIiwgIiIsIEwibmVlZGxlIiwgOjpzdGQ6OndzdHJpbmcoTCJoYXlzdGFjayIpKSk7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKy8vIFRlc3RzIGZsb2F0aW5nLXBvaW50IGFzc2VydGlvbnMuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorY2xhc3MgRmxvYXRpbmdQb2ludFRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBQcmUtY2FsY3VsYXRlZCBudW1iZXJzIHRvIGJlIHVzZWQgYnkgdGhlIHRlc3RzLgorICBzdHJ1Y3QgVGVzdFZhbHVlcyB7CisgICAgUmF3VHlwZSBjbG9zZV90b19wb3NpdGl2ZV96ZXJvOworICAgIFJhd1R5cGUgY2xvc2VfdG9fbmVnYXRpdmVfemVybzsKKyAgICBSYXdUeXBlIGZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvOworCisgICAgUmF3VHlwZSBjbG9zZV90b19vbmU7CisgICAgUmF3VHlwZSBmdXJ0aGVyX2Zyb21fb25lOworCisgICAgUmF3VHlwZSBpbmZpbml0eTsKKyAgICBSYXdUeXBlIGNsb3NlX3RvX2luZmluaXR5OworICAgIFJhd1R5cGUgZnVydGhlcl9mcm9tX2luZmluaXR5OworCisgICAgUmF3VHlwZSBuYW4xOworICAgIFJhd1R5cGUgbmFuMjsKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIHRlc3Rpbmc6OmludGVybmFsOjpGbG9hdGluZ1BvaW50PFJhd1R5cGU+IEZsb2F0aW5nOworICB0eXBlZGVmIHR5cGVuYW1lIEZsb2F0aW5nOjpCaXRzIEJpdHM7CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGNvbnN0IHNpemVfdCBtYXhfdWxwcyA9IEZsb2F0aW5nOjprTWF4VWxwczsKKworICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IDAuMC4KKyAgICBjb25zdCBCaXRzIHplcm9fYml0cyA9IEZsb2F0aW5nKDApLmJpdHMoKTsKKworICAgIC8vIE1ha2VzIHNvbWUgbnVtYmVycyBjbG9zZSB0byAwLjAuCisgICAgdmFsdWVzXy5jbG9zZV90b19wb3NpdGl2ZV96ZXJvID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKKyAgICAgICAgemVyb19iaXRzICsgbWF4X3VscHMvMik7CisgICAgdmFsdWVzXy5jbG9zZV90b19uZWdhdGl2ZV96ZXJvID0gLUZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCisgICAgICAgIHplcm9fYml0cyArIG1heF91bHBzIC0gbWF4X3VscHMvMik7CisgICAgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyA9IC1GbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICB6ZXJvX2JpdHMgKyBtYXhfdWxwcyArIDEgLSBtYXhfdWxwcy8yKTsKKworICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IDEuMC4KKyAgICBjb25zdCBCaXRzIG9uZV9iaXRzID0gRmxvYXRpbmcoMSkuYml0cygpOworCisgICAgLy8gTWFrZXMgc29tZSBudW1iZXJzIGNsb3NlIHRvIDEuMC4KKyAgICB2YWx1ZXNfLmNsb3NlX3RvX29uZSA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMob25lX2JpdHMgKyBtYXhfdWxwcyk7CisgICAgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lID0gRmxvYXRpbmc6OlJlaW50ZXJwcmV0Qml0cygKKyAgICAgICAgb25lX2JpdHMgKyBtYXhfdWxwcyArIDEpOworCisgICAgLy8gK2luZmluaXR5LgorICAgIHZhbHVlc18uaW5maW5pdHkgPSBGbG9hdGluZzo6SW5maW5pdHkoKTsKKworICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50ICtpbmZpbml0eS4KKyAgICBjb25zdCBCaXRzIGluZmluaXR5X2JpdHMgPSBGbG9hdGluZyh2YWx1ZXNfLmluZmluaXR5KS5iaXRzKCk7CisKKyAgICAvLyBNYWtlcyBzb21lIG51bWJlcnMgY2xvc2UgdG8gaW5maW5pdHkuCisgICAgdmFsdWVzXy5jbG9zZV90b19pbmZpbml0eSA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoCisgICAgICAgIGluZmluaXR5X2JpdHMgLSBtYXhfdWxwcyk7CisgICAgdmFsdWVzXy5mdXJ0aGVyX2Zyb21faW5maW5pdHkgPSBGbG9hdGluZzo6UmVpbnRlcnByZXRCaXRzKAorICAgICAgICBpbmZpbml0eV9iaXRzIC0gbWF4X3VscHMgLSAxKTsKKworICAgIC8vIE1ha2VzIHNvbWUgTkFOJ3MuICBTZXRzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgZnJhY3Rpb24gc28gdGhhdAorICAgIC8vIG91ciBOYU4ncyBhcmUgcXVpZXQ7IHRyeWluZyB0byBwcm9jZXNzIGEgc2lnbmFsaW5nIE5hTiB3b3VsZCByYWlzZSBhbgorICAgIC8vIGV4Y2VwdGlvbiBpZiBvdXIgZW52aXJvbm1lbnQgZW5hYmxlcyBmbG9hdGluZyBwb2ludCBleGNlcHRpb25zLgorICAgIHZhbHVlc18ubmFuMSA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoRmxvYXRpbmc6OmtFeHBvbmVudEJpdE1hc2sKKyAgICAgICAgfCAoc3RhdGljX2Nhc3Q8Qml0cz4oMSkgPDwgKEZsb2F0aW5nOjprRnJhY3Rpb25CaXRDb3VudCAtIDEpKSB8IDEpOworICAgIHZhbHVlc18ubmFuMiA9IEZsb2F0aW5nOjpSZWludGVycHJldEJpdHMoRmxvYXRpbmc6OmtFeHBvbmVudEJpdE1hc2sKKyAgICAgICAgfCAoc3RhdGljX2Nhc3Q8Qml0cz4oMSkgPDwgKEZsb2F0aW5nOjprRnJhY3Rpb25CaXRDb3VudCAtIDEpKSB8IDIwMCk7CisgIH0KKworICB2b2lkIFRlc3RTaXplKCkgeworICAgIEVYUEVDVF9FUShzaXplb2YoUmF3VHlwZSksIHNpemVvZihCaXRzKSk7CisgIH0KKworICBzdGF0aWMgVGVzdFZhbHVlcyB2YWx1ZXNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+Cit0eXBlbmFtZSBGbG9hdGluZ1BvaW50VGVzdDxSYXdUeXBlPjo6VGVzdFZhbHVlcworICAgIEZsb2F0aW5nUG9pbnRUZXN0PFJhd1R5cGU+Ojp2YWx1ZXNfOworCisvLyBJbnN0YW50aWF0ZXMgRmxvYXRpbmdQb2ludFRlc3QgZm9yIHRlc3RpbmcgKl9GTE9BVF9FUS4KK3R5cGVkZWYgRmxvYXRpbmdQb2ludFRlc3Q8ZmxvYXQ+IEZsb2F0VGVzdDsKKworLy8gVGVzdHMgdGhhdCB0aGUgc2l6ZSBvZiBGbG9hdDo6Qml0cyBtYXRjaGVzIHRoZSBzaXplIG9mIGZsb2F0LgorVEVTVF9GKEZsb2F0VGVzdCwgU2l6ZSkgeworICBUZXN0U2l6ZSgpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgd2l0aCArMCBhbmQgLTAuCitURVNUX0YoRmxvYXRUZXN0LCBaZXJvcykgeworICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCAtMC4wKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKC0wLjAsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZMT0FUX0VRKDAuMCwgMS41KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEuNSIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBjbG9zZSB0byAwLgorLy8KKy8vIFRoaXMgZW5zdXJlcyB0aGF0ICpfRkxPQVRfRVEgaGFuZGxlcyB0aGUgc2lnbiBjb3JyZWN0bHkgYW5kIG5vCisvLyBvdmVyZmxvdyBvY2N1cnMgd2hlbiBjb21wYXJpbmcgbnVtYmVycyB3aG9zZSBhYnNvbHV0ZSB2YWx1ZSBpcyB2ZXJ5CisvLyBzbWFsbC4KK1RFU1RfRihGbG9hdFRlc3QsIEFsbW9zdFplcm9zKSB7CisgIC8vIEluIEMrK0J1aWxkZXIsIG5hbWVzIHdpdGhpbiBsb2NhbCBjbGFzc2VzIChzdWNoIGFzIHVzZWQgYnkKKyAgLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUpIGNhbm5vdCBiZSByZXNvbHZlZCBhZ2FpbnN0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZQorICAvLyBzY29waW5nIGNsYXNzLiAgVXNlIGEgc3RhdGljIGxvY2FsIGFsaWFzIGFzIGEgd29ya2Fyb3VuZC4KKyAgLy8gV2UgdXNlIHRoZSBhc3NpZ25tZW50IHN5bnRheCBzaW5jZSBzb21lIGNvbXBpbGVycywgbGlrZSBTdW4gU3R1ZGlvLAorICAvLyBkb24ndCBhbGxvdyBpbml0aWFsaXppbmcgcmVmZXJlbmNlcyB1c2luZyBjb25zdHJ1Y3Rpb24gc3ludGF4CisgIC8vIChwYXJlbnRoZXNlcykuCisgIHN0YXRpYyBjb25zdCBGbG9hdFRlc3Q6OlRlc3RWYWx1ZXMmIHYgPSB0aGlzLT52YWx1ZXNfOworCisgIEVYUEVDVF9GTE9BVF9FUSgwLjAsIHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybyk7CisgIEVYUEVDVF9GTE9BVF9FUSgtMC4wLCB2LmNsb3NlX3RvX25lZ2F0aXZlX3plcm8pOworICBFWFBFQ1RfRkxPQVRfRVEodi5jbG9zZV90b19wb3NpdGl2ZV96ZXJvLCB2LmNsb3NlX3RvX25lZ2F0aXZlX3plcm8pOworCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9GTE9BVF9FUSh2LmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sCisgICAgICAgICAgICAgICAgICAgIHYuZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm8pOworICB9LCAidi5mdXJ0aGVyX2Zyb21fbmVnYXRpdmVfemVybyIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBjbG9zZSB0byBlYWNoIG90aGVyLgorVEVTVF9GKEZsb2F0VGVzdCwgU21hbGxEaWZmKSB7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjAsIHZhbHVlc18uY2xvc2VfdG9fb25lKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlc18uZnVydGhlcl9mcm9tX29uZSIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgbnVtYmVycyBmYXIgYXBhcnQuCitURVNUX0YoRmxvYXRUZXN0LCBMYXJnZURpZmYpIHsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKDIuNSwgMy4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjMuMCIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgd2l0aCBpbmZpbml0eS4KKy8vCisvLyBUaGlzIGVuc3VyZXMgdGhhdCBubyBvdmVyZmxvdyBvY2N1cnMgd2hlbiBjb21wYXJpbmcgbnVtYmVycyB3aG9zZQorLy8gYWJzb2x1dGUgdmFsdWUgaXMgdmVyeSBsYXJnZS4KK1RFU1RfRihGbG9hdFRlc3QsIEluZmluaXR5KSB7CisgIEVYUEVDVF9GTE9BVF9FUSh2YWx1ZXNfLmluZmluaXR5LCB2YWx1ZXNfLmNsb3NlX3RvX2luZmluaXR5KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC12YWx1ZXNfLmluZmluaXR5LCAtdmFsdWVzXy5jbG9zZV90b19pbmZpbml0eSk7CisjaWYgIUdURVNUX09TX1NZTUJJQU4KKyAgLy8gTm9raWEncyBTVExwb3J0IGNyYXNoZXMgaWYgd2UgdHJ5IHRvIG91dHB1dCBpbmZpbml0eSBvciBOYU4uCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSh2YWx1ZXNfLmluZmluaXR5LCAtdmFsdWVzXy5pbmZpbml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICItdmFsdWVzXy5pbmZpbml0eSIpOworCisgIC8vIFRoaXMgaXMgaW50ZXJlc3RpbmcgYXMgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiBpbmZpbml0eSBhbmQgbmFuMQorICAvLyBhcmUgb25seSAxIERMUCBhcGFydC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18ubmFuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXNfLm5hbjEiKTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4KK30KKworLy8gVGVzdHMgdGhhdCBjb21wYXJpbmcgd2l0aCBOQU4gYWx3YXlzIHJldHVybnMgZmFsc2UuCitURVNUX0YoRmxvYXRUZXN0LCBOYU4pIHsKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorLy8gTm9raWEncyBTVExwb3J0IGNyYXNoZXMgaWYgd2UgdHJ5IHRvIG91dHB1dCBpbmZpbml0eSBvciBOYU4uCisKKyAgLy8gSW4gQysrQnVpbGRlciwgbmFtZXMgd2l0aGluIGxvY2FsIGNsYXNzZXMgKHN1Y2ggYXMgdXNlZCBieQorICAvLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSkgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3Qgc3RhdGljIG1lbWJlcnMgb2YgdGhlCisgIC8vIHNjb3BpbmcgY2xhc3MuICBVc2UgYSBzdGF0aWMgbG9jYWwgYWxpYXMgYXMgYSB3b3JrYXJvdW5kLgorICAvLyBXZSB1c2UgdGhlIGFzc2lnbm1lbnQgc3ludGF4IHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIFN1biBTdHVkaW8sCisgIC8vIGRvbid0IGFsbG93IGluaXRpYWxpemluZyByZWZlcmVuY2VzIHVzaW5nIGNvbnN0cnVjdGlvbiBzeW50YXgKKyAgLy8gKHBhcmVudGhlc2VzKS4KKyAgc3RhdGljIGNvbnN0IEZsb2F0VGVzdDo6VGVzdFZhbHVlcyYgdiA9IHRoaXMtPnZhbHVlc187CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKHYubmFuMSwgdi5uYW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInYubmFuMSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEodi5uYW4xLCB2Lm5hbjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidi5uYW4yIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GTE9BVF9FUSgxLjAsIHYubmFuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Lm5hbjEiKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkxPQVRfRVEodi5uYW4xLCB2LmluZmluaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgInYuaW5maW5pdHkiKTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4KK30KKworLy8gVGVzdHMgdGhhdCAqX0ZMT0FUX0VRIGFyZSByZWZsZXhpdmUuCitURVNUX0YoRmxvYXRUZXN0LCBSZWZsZXhpdmUpIHsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMCwgMC4wKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgMS4wKTsKKyAgQVNTRVJUX0ZMT0FUX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18uaW5maW5pdHkpOworfQorCisvLyBUZXN0cyB0aGF0ICpfRkxPQVRfRVEgYXJlIGNvbW11dGF0aXZlLgorVEVTVF9GKEZsb2F0VGVzdCwgQ29tbXV0YXRpdmUpIHsKKyAgLy8gV2UgYWxyZWFkeSB0ZXN0ZWQgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdmFsdWVzXy5jbG9zZV90b19vbmUpLgorICBFWFBFQ1RfRkxPQVRfRVEodmFsdWVzXy5jbG9zZV90b19vbmUsIDEuMCk7CisKKyAgLy8gV2UgYWxyZWFkeSB0ZXN0ZWQgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKS4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZMT0FUX0VRKHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSwgMS4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuMCIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTkVBUi4KK1RFU1RfRihGbG9hdFRlc3QsIEVYUEVDVF9ORUFSKSB7CisgIEVYUEVDVF9ORUFSKC0xLjBmLCAtMS4xZiwgMC4yZik7CisgIEVYUEVDVF9ORUFSKDIuMGYsIDMuMGYsIDEuMGYpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkVBUigxLjBmLDEuNWYsIDAuMjVmKSwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjBmIGFuZCAxLjVmIGlzIDAuNSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggZXhjZWVkcyAwLjI1ZiIpOworICAvLyBUbyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMi45NS4wLCB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vCisgIC8vIHNwYWNlIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiB0aGUgcHJldmlvdXMgbGluZS4KK30KKworLy8gVGVzdHMgQVNTRVJUX05FQVIuCitURVNUX0YoRmxvYXRUZXN0LCBBU1NFUlRfTkVBUikgeworICBBU1NFUlRfTkVBUigtMS4wZiwgLTEuMWYsIDAuMmYpOworICBBU1NFUlRfTkVBUigyLjBmLCAzLjBmLCAxLjBmKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX05FQVIoMS4wZiwxLjVmLCAwLjI1ZiksICAvLyBOT0xJTlQKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMS4wZiBhbmQgMS41ZiBpcyAwLjUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIGV4Y2VlZHMgMC4yNWYiKTsKKyAgLy8gVG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDIuOTUuMCwgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubworICAvLyBzcGFjZSBhZnRlciB0aGUgZmlyc3QgY29tbWEgaW4gdGhlIHByZXZpb3VzIGxpbmUuCit9CisKKy8vIFRlc3RzIHRoZSBjYXNlcyB3aGVyZSBGbG9hdExFKCkgc2hvdWxkIHN1Y2NlZWQuCitURVNUX0YoRmxvYXRUZXN0LCBGbG9hdExFU3VjY2VlZHMpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihGbG9hdExFLCAxLjBmLCAyLjBmKTsgIC8vIFdoZW4gdmFsMSA8IHZhbDIsCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgMS4wZiwgMS4wZik7ICAvLyB2YWwxID09IHZhbDIsCisKKyAgLy8gb3Igd2hlbiB2YWwxIGlzIGdyZWF0ZXIgdGhhbiwgYnV0IGFsbW9zdCBlcXVhbHMgdG8sIHZhbDIuCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgdmFsdWVzXy5jbG9zZV90b19wb3NpdGl2ZV96ZXJvLCAwLjBmKTsKK30KKworLy8gVGVzdHMgdGhlIGNhc2VzIHdoZXJlIEZsb2F0TEUoKSBzaG91bGQgZmFpbC4KK1RFU1RfRihGbG9hdFRlc3QsIEZsb2F0TEVGYWlscykgeworICAvLyBXaGVuIHZhbDEgaXMgZ3JlYXRlciB0aGFuIHZhbDIgYnkgYSBsYXJnZSBtYXJnaW4sCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgMi4wZiwgMS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoMi4wZikgPD0gKDEuMGYpIik7CisKKyAgLy8gb3IgYnkgYSBzbWFsbCB5ZXQgbm9uLW5lZ2xpZ2libGUgbWFyZ2luLAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSwgMS4wZik7CisgIH0sICIodmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKSA8PSAoMS4wZikiKTsKKworI2lmICFHVEVTVF9PU19TWU1CSUFOICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKyAgLy8gTm9raWEncyBTVExwb3J0IGNyYXNoZXMgaWYgd2UgdHJ5IHRvIG91dHB1dCBpbmZpbml0eSBvciBOYU4uCisgIC8vIEMrK0J1aWxkZXIgZ2l2ZXMgYmFkIHJlc3VsdHMgZm9yIG9yZGVyZWQgY29tcGFyaXNvbnMgaW52b2x2aW5nIE5hTnMKKyAgLy8gZHVlIHRvIGNvbXBpbGVyIGJ1Z3MuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRmxvYXRMRSwgdmFsdWVzXy5uYW4xLCB2YWx1ZXNfLmluZmluaXR5KTsKKyAgfSwgIih2YWx1ZXNfLm5hbjEpIDw9ICh2YWx1ZXNfLmluZmluaXR5KSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIC12YWx1ZXNfLmluZmluaXR5LCB2YWx1ZXNfLm5hbjEpOworICB9LCAiKC12YWx1ZXNfLmluZmluaXR5KSA8PSAodmFsdWVzXy5uYW4xKSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQyKEZsb2F0TEUsIHZhbHVlc18ubmFuMSwgdmFsdWVzXy5uYW4xKTsKKyAgfSwgIih2YWx1ZXNfLm5hbjEpIDw9ICh2YWx1ZXNfLm5hbjEpIik7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKK30KKworLy8gSW5zdGFudGlhdGVzIEZsb2F0aW5nUG9pbnRUZXN0IGZvciB0ZXN0aW5nICpfRE9VQkxFX0VRLgordHlwZWRlZiBGbG9hdGluZ1BvaW50VGVzdDxkb3VibGU+IERvdWJsZVRlc3Q7CisKKy8vIFRlc3RzIHRoYXQgdGhlIHNpemUgb2YgRG91YmxlOjpCaXRzIG1hdGNoZXMgdGhlIHNpemUgb2YgZG91YmxlLgorVEVTVF9GKERvdWJsZVRlc3QsIFNpemUpIHsKKyAgVGVzdFNpemUoKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIHdpdGggKzAgYW5kIC0wLgorVEVTVF9GKERvdWJsZVRlc3QsIFplcm9zKSB7CisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCAtMC4wKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSgtMC4wLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4wIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9ET1VCTEVfRVEoMC4wLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgICAiMS4wIik7Cit9CisKKy8vIFRlc3RzIGNvbXBhcmluZyBudW1iZXJzIGNsb3NlIHRvIDAuCisvLworLy8gVGhpcyBlbnN1cmVzIHRoYXQgKl9ET1VCTEVfRVEgaGFuZGxlcyB0aGUgc2lnbiBjb3JyZWN0bHkgYW5kIG5vCisvLyBvdmVyZmxvdyBvY2N1cnMgd2hlbiBjb21wYXJpbmcgbnVtYmVycyB3aG9zZSBhYnNvbHV0ZSB2YWx1ZSBpcyB2ZXJ5CisvLyBzbWFsbC4KK1RFU1RfRihEb3VibGVUZXN0LCBBbG1vc3RaZXJvcykgeworICAvLyBJbiBDKytCdWlsZGVyLCBuYW1lcyB3aXRoaW4gbG9jYWwgY2xhc3NlcyAoc3VjaCBhcyB1c2VkIGJ5CisgIC8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFKSBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUKKyAgLy8gc2NvcGluZyBjbGFzcy4gIFVzZSBhIHN0YXRpYyBsb2NhbCBhbGlhcyBhcyBhIHdvcmthcm91bmQuCisgIC8vIFdlIHVzZSB0aGUgYXNzaWdubWVudCBzeW50YXggc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgU3VuIFN0dWRpbywKKyAgLy8gZG9uJ3QgYWxsb3cgaW5pdGlhbGl6aW5nIHJlZmVyZW5jZXMgdXNpbmcgY29uc3RydWN0aW9uIHN5bnRheAorICAvLyAocGFyZW50aGVzZXMpLgorICBzdGF0aWMgY29uc3QgRG91YmxlVGVzdDo6VGVzdFZhbHVlcyYgdiA9IHRoaXMtPnZhbHVlc187CisKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIHYuY2xvc2VfdG9fcG9zaXRpdmVfemVybyk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLTAuMCwgdi5jbG9zZV90b19uZWdhdGl2ZV96ZXJvKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSh2LmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sIHYuY2xvc2VfdG9fbmVnYXRpdmVfemVybyk7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0RPVUJMRV9FUSh2LmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sCisgICAgICAgICAgICAgICAgICAgICB2LmZ1cnRoZXJfZnJvbV9uZWdhdGl2ZV96ZXJvKTsKKyAgfSwgInYuZnVydGhlcl9mcm9tX25lZ2F0aXZlX3plcm8iKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIG51bWJlcnMgY2xvc2UgdG8gZWFjaCBvdGhlci4KK1RFU1RfRihEb3VibGVUZXN0LCBTbWFsbERpZmYpIHsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLjAsIHZhbHVlc18uY2xvc2VfdG9fb25lKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSgxLjAsIHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUiKTsKK30KKworLy8gVGVzdHMgY29tcGFyaW5nIG51bWJlcnMgZmFyIGFwYXJ0LgorVEVTVF9GKERvdWJsZVRlc3QsIExhcmdlRGlmZikgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRE9VQkxFX0VRKDIuMCwgMy4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjMuMCIpOworfQorCisvLyBUZXN0cyBjb21wYXJpbmcgd2l0aCBpbmZpbml0eS4KKy8vCisvLyBUaGlzIGVuc3VyZXMgdGhhdCBubyBvdmVyZmxvdyBvY2N1cnMgd2hlbiBjb21wYXJpbmcgbnVtYmVycyB3aG9zZQorLy8gYWJzb2x1dGUgdmFsdWUgaXMgdmVyeSBsYXJnZS4KK1RFU1RfRihEb3VibGVUZXN0LCBJbmZpbml0eSkgeworICBFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlc18uaW5maW5pdHksIHZhbHVlc18uY2xvc2VfdG9faW5maW5pdHkpOworICBFWFBFQ1RfRE9VQkxFX0VRKC12YWx1ZXNfLmluZmluaXR5LCAtdmFsdWVzXy5jbG9zZV90b19pbmZpbml0eSk7CisjaWYgIUdURVNUX09TX1NZTUJJQU4KKyAgLy8gTm9raWEncyBTVExwb3J0IGNyYXNoZXMgaWYgd2UgdHJ5IHRvIG91dHB1dCBpbmZpbml0eSBvciBOYU4uCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEodmFsdWVzXy5pbmZpbml0eSwgLXZhbHVlc18uaW5maW5pdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiLXZhbHVlc18uaW5maW5pdHkiKTsKKworICAvLyBUaGlzIGlzIGludGVyZXN0aW5nIGFzIHRoZSByZXByZXNlbnRhdGlvbnMgb2YgaW5maW5pdHlfIGFuZCBuYW4xXworICAvLyBhcmUgb25seSAxIERMUCBhcGFydC4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSh2YWx1ZXNfLmluZmluaXR5LCB2YWx1ZXNfLm5hbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzXy5uYW4xIik7CisjZW5kaWYgIC8vICFHVEVTVF9PU19TWU1CSUFOCit9CisKKy8vIFRlc3RzIHRoYXQgY29tcGFyaW5nIHdpdGggTkFOIGFsd2F5cyByZXR1cm5zIGZhbHNlLgorVEVTVF9GKERvdWJsZVRlc3QsIE5hTikgeworI2lmICFHVEVTVF9PU19TWU1CSUFOCisgIC8vIEluIEMrK0J1aWxkZXIsIG5hbWVzIHdpdGhpbiBsb2NhbCBjbGFzc2VzIChzdWNoIGFzIHVzZWQgYnkKKyAgLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUpIGNhbm5vdCBiZSByZXNvbHZlZCBhZ2FpbnN0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZQorICAvLyBzY29waW5nIGNsYXNzLiAgVXNlIGEgc3RhdGljIGxvY2FsIGFsaWFzIGFzIGEgd29ya2Fyb3VuZC4KKyAgLy8gV2UgdXNlIHRoZSBhc3NpZ25tZW50IHN5bnRheCBzaW5jZSBzb21lIGNvbXBpbGVycywgbGlrZSBTdW4gU3R1ZGlvLAorICAvLyBkb24ndCBhbGxvdyBpbml0aWFsaXppbmcgcmVmZXJlbmNlcyB1c2luZyBjb25zdHJ1Y3Rpb24gc3ludGF4CisgIC8vIChwYXJlbnRoZXNlcykuCisgIHN0YXRpYyBjb25zdCBEb3VibGVUZXN0OjpUZXN0VmFsdWVzJiB2ID0gdGhpcy0+dmFsdWVzXzsKKworICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSh2Lm5hbjEsIHYubmFuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Lm5hbjEiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSh2Lm5hbjEsIHYubmFuMiksICJ2Lm5hbjIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSgxLjAsIHYubmFuMSksICJ2Lm5hbjEiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0RPVUJMRV9FUSh2Lm5hbjEsIHYuaW5maW5pdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAidi5pbmZpbml0eSIpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTgorfQorCisvLyBUZXN0cyB0aGF0ICpfRE9VQkxFX0VRIGFyZSByZWZsZXhpdmUuCitURVNUX0YoRG91YmxlVGVzdCwgUmVmbGV4aXZlKSB7CisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCAwLjApOworICBFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgMS4wKTsKKyNpZiAhR1RFU1RfT1NfU1lNQklBTgorICAvLyBOb2tpYSdzIFNUTHBvcnQgY3Jhc2hlcyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGluZmluaXR5IG9yIE5hTi4KKyAgQVNTRVJUX0RPVUJMRV9FUSh2YWx1ZXNfLmluZmluaXR5LCB2YWx1ZXNfLmluZmluaXR5KTsKKyNlbmRpZiAgLy8gIUdURVNUX09TX1NZTUJJQU4KK30KKworLy8gVGVzdHMgdGhhdCAqX0RPVUJMRV9FUSBhcmUgY29tbXV0YXRpdmUuCitURVNUX0YoRG91YmxlVGVzdCwgQ29tbXV0YXRpdmUpIHsKKyAgLy8gV2UgYWxyZWFkeSB0ZXN0ZWQgRVhQRUNUX0RPVUJMRV9FUSgxLjAsIHZhbHVlc18uY2xvc2VfdG9fb25lKS4KKyAgRVhQRUNUX0RPVUJMRV9FUSh2YWx1ZXNfLmNsb3NlX3RvX29uZSwgMS4wKTsKKworICAvLyBXZSBhbHJlYWR5IHRlc3RlZCBFWFBFQ1RfRE9VQkxFX0VRKDEuMCwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lKS4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0RPVUJMRV9FUSh2YWx1ZXNfLmZ1cnRoZXJfZnJvbV9vbmUsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIxLjAiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX05FQVIuCitURVNUX0YoRG91YmxlVGVzdCwgRVhQRUNUX05FQVIpIHsKKyAgRVhQRUNUX05FQVIoLTEuMCwgLTEuMSwgMC4yKTsKKyAgRVhQRUNUX05FQVIoMi4wLCAzLjAsIDEuMCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORUFSKDEuMCwgMS41LCAwLjI1KSwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxLjAgYW5kIDEuNSBpcyAwLjUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIGV4Y2VlZHMgMC4yNSIpOworICAvLyBUbyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMi45NS4wLCB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vCisgIC8vIHNwYWNlIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiB0aGUgcHJldmlvdXMgc3RhdGVtZW50LgorfQorCisvLyBUZXN0cyBBU1NFUlRfTkVBUi4KK1RFU1RfRihEb3VibGVUZXN0LCBBU1NFUlRfTkVBUikgeworICBBU1NFUlRfTkVBUigtMS4wLCAtMS4xLCAwLjIpOworICBBU1NFUlRfTkVBUigyLjAsIDMuMCwgMS4wKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX05FQVIoMS4wLCAxLjUsIDAuMjUpLCAgLy8gTk9MSU5UCisgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMCBhbmQgMS41IGlzIDAuNSwgIgorICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggZXhjZWVkcyAwLjI1Iik7CisgIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KKyAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQuCit9CisKKy8vIFRlc3RzIHRoZSBjYXNlcyB3aGVyZSBEb3VibGVMRSgpIHNob3VsZCBzdWNjZWVkLgorVEVTVF9GKERvdWJsZVRlc3QsIERvdWJsZUxFU3VjY2VlZHMpIHsKKyAgRVhQRUNUX1BSRURfRk9STUFUMihEb3VibGVMRSwgMS4wLCAyLjApOyAgLy8gV2hlbiB2YWwxIDwgdmFsMiwKKyAgQVNTRVJUX1BSRURfRk9STUFUMihEb3VibGVMRSwgMS4wLCAxLjApOyAgLy8gdmFsMSA9PSB2YWwyLAorCisgIC8vIG9yIHdoZW4gdmFsMSBpcyBncmVhdGVyIHRoYW4sIGJ1dCBhbG1vc3QgZXF1YWxzIHRvLCB2YWwyLgorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCB2YWx1ZXNfLmNsb3NlX3RvX3Bvc2l0aXZlX3plcm8sIDAuMCk7Cit9CisKKy8vIFRlc3RzIHRoZSBjYXNlcyB3aGVyZSBEb3VibGVMRSgpIHNob3VsZCBmYWlsLgorVEVTVF9GKERvdWJsZVRlc3QsIERvdWJsZUxFRmFpbHMpIHsKKyAgLy8gV2hlbiB2YWwxIGlzIGdyZWF0ZXIgdGhhbiB2YWwyIGJ5IGEgbGFyZ2UgbWFyZ2luLAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCAyLjAsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoMi4wKSA8PSAoMS4wKSIpOworCisgIC8vIG9yIGJ5IGEgc21hbGwgeWV0IG5vbi1uZWdsaWdpYmxlIG1hcmdpbiwKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihEb3VibGVMRSwgdmFsdWVzXy5mdXJ0aGVyX2Zyb21fb25lLCAxLjApOworICB9LCAiKHZhbHVlc18uZnVydGhlcl9mcm9tX29uZSkgPD0gKDEuMCkiKTsKKworI2lmICFHVEVTVF9PU19TWU1CSUFOICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKyAgLy8gTm9raWEncyBTVExwb3J0IGNyYXNoZXMgaWYgd2UgdHJ5IHRvIG91dHB1dCBpbmZpbml0eSBvciBOYU4uCisgIC8vIEMrK0J1aWxkZXIgZ2l2ZXMgYmFkIHJlc3VsdHMgZm9yIG9yZGVyZWQgY29tcGFyaXNvbnMgaW52b2x2aW5nIE5hTnMKKyAgLy8gZHVlIHRvIGNvbXBpbGVyIGJ1Z3MuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoRG91YmxlTEUsIHZhbHVlc18ubmFuMSwgdmFsdWVzXy5pbmZpbml0eSk7CisgIH0sICIodmFsdWVzXy5uYW4xKSA8PSAodmFsdWVzXy5pbmZpbml0eSkiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX1BSRURfRk9STUFUMihEb3VibGVMRSwgLXZhbHVlc18uaW5maW5pdHksIHZhbHVlc18ubmFuMSk7CisgIH0sICIgKC12YWx1ZXNfLmluZmluaXR5KSA8PSAodmFsdWVzXy5uYW4xKSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfUFJFRF9GT1JNQVQyKERvdWJsZUxFLCB2YWx1ZXNfLm5hbjEsIHZhbHVlc18ubmFuMSk7CisgIH0sICIodmFsdWVzXy5uYW4xKSA8PSAodmFsdWVzXy5uYW4xKSIpOworI2VuZGlmICAvLyAhR1RFU1RfT1NfU1lNQklBTiAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCit9CisKKworLy8gVmVyaWZpZXMgdGhhdCBhIHRlc3Qgb3IgdGVzdCBjYXNlIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggRElTQUJMRURfIGlzCisvLyBub3QgcnVuLgorCisvLyBBIHRlc3Qgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBESVNBQkxFRF8uCisvLyBTaG91bGQgbm90IHJ1bi4KK1RFU1QoRGlzYWJsZWRUZXN0LCBESVNBQkxFRF9UZXN0U2hvdWxkTm90UnVuKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0ZXN0IHNob3VsZCBub3QgYmUgcnVuLiI7Cit9CisKKy8vIEEgdGVzdCB3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggRElTQUJMRURfLgorLy8gU2hvdWxkIHJ1bi4KK1RFU1QoRGlzYWJsZWRUZXN0LCBOb3RESVNBQkxFRF9UZXN0U2hvdWxkUnVuKSB7CisgIEVYUEVDVF9FUSgxLCAxKTsKK30KKworLy8gQSB0ZXN0IGNhc2Ugd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBESVNBQkxFRF8uCisvLyBTaG91bGQgbm90IHJ1bi4KK1RFU1QoRElTQUJMRURfVGVzdENhc2UsIFRlc3RTaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IFRlc3QgaW4gZGlzYWJsZWQgdGVzdCBjYXNlIHNob3VsZCBub3QgYmUgcnVuLiI7Cit9CisKKy8vIEEgdGVzdCBjYXNlIGFuZCB0ZXN0IHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggRElTQUJMRURfLgorLy8gU2hvdWxkIG5vdCBydW4uCitURVNUKERJU0FCTEVEX1Rlc3RDYXNlLCBESVNBQkxFRF9UZXN0U2hvdWxkTm90UnVuKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBUZXN0IGluIGRpc2FibGVkIHRlc3QgY2FzZSBzaG91bGQgbm90IGJlIHJ1bi4iOworfQorCisvLyBDaGVjayB0aGF0IHdoZW4gYWxsIHRlc3RzIGluIGEgdGVzdCBjYXNlIGFyZSBkaXNhYmxlZCwgU2V0dXBUZXN0Q2FzZSgpIGFuZAorLy8gVGVhckRvd25UZXN0Q2FzZSgpIGFyZSBub3QgY2FsbGVkLgorY2xhc3MgRGlzYWJsZWRUZXN0c1Rlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBBbGwgdGVzdHMgZGlzYWJsZWQgaW4gdGVzdCBjYXNlLiAiCisgICAgICAgICAgICAgICJTZXR1cFRlc3RDYXNlKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQuIjsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IEFsbCB0ZXN0cyBkaXNhYmxlZCBpbiB0ZXN0IGNhc2UuICIKKyAgICAgICAgICAgICAgIlRlYXJEb3duVGVzdENhc2UoKSBzaG91bGQgbm90IGJlIGNhbGxlZC4iOworICB9Cit9OworCitURVNUX0YoRGlzYWJsZWRUZXN0c1Rlc3QsIERJU0FCTEVEX1Rlc3RTaG91bGROb3RSdW5fMSkgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdGVzdCBzaG91bGQgbm90IGJlIHJ1bi4iOworfQorCitURVNUX0YoRGlzYWJsZWRUZXN0c1Rlc3QsIERJU0FCTEVEX1Rlc3RTaG91bGROb3RSdW5fMikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdGVzdCBzaG91bGQgbm90IGJlIHJ1bi4iOworfQorCisvLyBUZXN0cyB0aGF0IGRpc2FibGVkIHR5cGVkIHRlc3RzIGFyZW4ndCBydW4uCisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVkVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8aW50LCBkb3VibGU+IE51bWVyaWNUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShUeXBlZFRlc3QsIE51bWVyaWNUeXBlcyk7CisKK1RZUEVEX1RFU1QoVHlwZWRUZXN0LCBESVNBQkxFRF9TaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6IERpc2FibGVkIHR5cGVkIHRlc3Qgc2hvdWxkIG5vdCBydW4uIjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBESVNBQkxFRF9UeXBlZFRlc3QgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0UoRElTQUJMRURfVHlwZWRUZXN0LCBOdW1lcmljVHlwZXMpOworCitUWVBFRF9URVNUKERJU0FCTEVEX1R5cGVkVGVzdCwgU2hvdWxkTm90UnVuKSB7CisgIEZBSUwoKSA8PCAiVW5leHBlY3RlZCBmYWlsdXJlOiBEaXNhYmxlZCB0eXBlZCB0ZXN0IHNob3VsZCBub3QgcnVuLiI7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QKKworLy8gVGVzdHMgdGhhdCBkaXNhYmxlZCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlbid0IHJ1bi4KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlZFRlc3RQIDogcHVibGljIFRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoVHlwZWRUZXN0UCk7CisKK1RZUEVEX1RFU1RfUChUeXBlZFRlc3RQLCBESVNBQkxFRF9TaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6ICIKKyAgICAgICAgIDw8ICJEaXNhYmxlZCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBzaG91bGQgbm90IHJ1bi4iOworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChUeXBlZFRlc3RQLCBESVNBQkxFRF9TaG91bGROb3RSdW4pOworCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgVHlwZWRUZXN0UCwgTnVtZXJpY1R5cGVzKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBESVNBQkxFRF9UeXBlZFRlc3RQIDogcHVibGljIFRlc3QgeworfTsKKworVFlQRURfVEVTVF9DQVNFX1AoRElTQUJMRURfVHlwZWRUZXN0UCk7CisKK1RZUEVEX1RFU1RfUChESVNBQkxFRF9UeXBlZFRlc3RQLCBTaG91bGROb3RSdW4pIHsKKyAgRkFJTCgpIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmU6ICIKKyAgICAgICAgIDw8ICJEaXNhYmxlZCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBzaG91bGQgbm90IHJ1bi4iOworfQorCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChESVNBQkxFRF9UeXBlZFRlc3RQLCBTaG91bGROb3RSdW4pOworCitJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRElTQUJMRURfVHlwZWRUZXN0UCwgTnVtZXJpY1R5cGVzKTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIFRlc3RzIHRoYXQgYXNzZXJ0aW9uIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgorCitjbGFzcyBTaW5nbGVFdmFsdWF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwdWJsaWM6ICAvLyBNdXN0IGJlIHB1YmxpYyBhbmQgbm90IHByb3RlY3RlZCBkdWUgdG8gYSBidWcgaW4gZysrIDMuNC4yLgorICAvLyBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyBuZWVkZWQgYnkgdGhlIEZhaWxlZEFTU0VSVF9TVFJFUSB0ZXN0CisgIC8vIGJlbG93LiAgSXQncyBwdWJsaWMgdG8gd29yayBhcm91bmQgQysrQnVpbGRlcidzIGJ1ZyB3aXRoIHNjb3BpbmcgbG9jYWwKKyAgLy8gY2xhc3Nlcy4KKyAgc3RhdGljIHZvaWQgQ29tcGFyZUFuZEluY3JlbWVudENoYXJQdHJzKCkgeworICAgIEFTU0VSVF9TVFJFUShwMV8rKywgcDJfKyspOworICB9CisKKyAgLy8gVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgbmVlZGVkIGJ5IHRoZSBGYWlsZWRBU1NFUlRfTkUgdGVzdCBiZWxvdy4gIEl0J3MKKyAgLy8gcHVibGljIHRvIHdvcmsgYXJvdW5kIEMrK0J1aWxkZXIncyBidWcgd2l0aCBzY29waW5nIGxvY2FsIGNsYXNzZXMuCisgIHN0YXRpYyB2b2lkIENvbXBhcmVBbmRJbmNyZW1lbnRJbnRzKCkgeworICAgIEFTU0VSVF9ORShhXysrLCBiXysrKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBTaW5nbGVFdmFsdWF0aW9uVGVzdCgpIHsKKyAgICBwMV8gPSBzMV87CisgICAgcDJfID0gczJfOworICAgIGFfID0gMDsKKyAgICBiXyA9IDA7CisgIH0KKworICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgczFfOworICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgczJfOworICBzdGF0aWMgY29uc3QgY2hhciogcDFfOworICBzdGF0aWMgY29uc3QgY2hhciogcDJfOworCisgIHN0YXRpYyBpbnQgYV87CisgIHN0YXRpYyBpbnQgYl87Cit9OworCitjb25zdCBjaGFyKiBjb25zdCBTaW5nbGVFdmFsdWF0aW9uVGVzdDo6czFfID0gIjAxMjM0IjsKK2NvbnN0IGNoYXIqIGNvbnN0IFNpbmdsZUV2YWx1YXRpb25UZXN0OjpzMl8gPSAiYWJjZGUiOworY29uc3QgY2hhciogU2luZ2xlRXZhbHVhdGlvblRlc3Q6OnAxXzsKK2NvbnN0IGNoYXIqIFNpbmdsZUV2YWx1YXRpb25UZXN0OjpwMl87CitpbnQgU2luZ2xlRXZhbHVhdGlvblRlc3Q6OmFfOworaW50IFNpbmdsZUV2YWx1YXRpb25UZXN0OjpiXzsKKworLy8gVGVzdHMgdGhhdCB3aGVuIEFTU0VSVF9TVFJFUSBmYWlscywgaXQgZXZhbHVhdGVzIGl0cyBhcmd1bWVudHMKKy8vIGV4YWN0bHkgb25jZS4KK1RFU1RfRihTaW5nbGVFdmFsdWF0aW9uVGVzdCwgRmFpbGVkQVNTRVJUX1NUUkVRKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKFNpbmdsZUV2YWx1YXRpb25UZXN0OjpDb21wYXJlQW5kSW5jcmVtZW50Q2hhclB0cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgInAyXysrIik7CisgIEVYUEVDVF9FUShzMV8gKyAxLCBwMV8pOworICBFWFBFQ1RfRVEoczJfICsgMSwgcDJfKTsKK30KKworLy8gVGVzdHMgdGhhdCBzdHJpbmcgYXNzZXJ0aW9uIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4KK1RFU1RfRihTaW5nbGVFdmFsdWF0aW9uVGVzdCwgQVNTRVJUX1NUUikgeworICAvLyBzdWNjZXNzZnVsIEVYUEVDVF9TVFJORQorICBFWFBFQ1RfU1RSTkUocDFfKyssIHAyXysrKTsKKyAgRVhQRUNUX0VRKHMxXyArIDEsIHAxXyk7CisgIEVYUEVDVF9FUShzMl8gKyAxLCBwMl8pOworCisgIC8vIGZhaWxlZCBFWFBFQ1RfU1RSQ0FTRUVRCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJDQVNFRVEocDFfKyssIHAyXysrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yaW5nIGNhc2UiKTsKKyAgRVhQRUNUX0VRKHMxXyArIDIsIHAxXyk7CisgIEVYUEVDVF9FUShzMl8gKyAyLCBwMl8pOworfQorCisvLyBUZXN0cyB0aGF0IHdoZW4gQVNTRVJUX05FIGZhaWxzLCBpdCBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50cyBleGFjdGx5CisvLyBvbmNlLgorVEVTVF9GKFNpbmdsZUV2YWx1YXRpb25UZXN0LCBGYWlsZWRBU1NFUlRfTkUpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoU2luZ2xlRXZhbHVhdGlvblRlc3Q6OkNvbXBhcmVBbmRJbmNyZW1lbnRJbnRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICIoYV8rKykgIT0gKGJfKyspIik7CisgIEVYUEVDVF9FUSgxLCBhXyk7CisgIEVYUEVDVF9FUSgxLCBiXyk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYXNzZXJ0aW9uIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS4KK1RFU1RfRihTaW5nbGVFdmFsdWF0aW9uVGVzdCwgT3RoZXJDYXNlcykgeworICAvLyBzdWNjZXNzZnVsIEVYUEVDVF9UUlVFCisgIEVYUEVDVF9UUlVFKDAgPT0gYV8rKyk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDEsIGFfKTsKKworICAvLyBmYWlsZWQgRVhQRUNUX1RSVUUKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RSVUUoLTEgPT0gYV8rKyksICItMSA9PSBhXysrIik7CisgIEVYUEVDVF9FUSgyLCBhXyk7CisKKyAgLy8gc3VjY2Vzc2Z1bCBFWFBFQ1RfR1QKKyAgRVhQRUNUX0dUKGFfKyssIGJfKyspOworICBFWFBFQ1RfRVEoMywgYV8pOworICBFWFBFQ1RfRVEoMSwgYl8pOworCisgIC8vIGZhaWxlZCBFWFBFQ1RfTFQKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKGFfKyssIGJfKyspLCAiKGFfKyspIDwgKGJfKyspIik7CisgIEVYUEVDVF9FUSg0LCBhXyk7CisgIEVYUEVDVF9FUSgyLCBiXyk7CisKKyAgLy8gc3VjY2Vzc2Z1bCBBU1NFUlRfVFJVRQorICBBU1NFUlRfVFJVRSgwIDwgYV8rKyk7ICAvLyBOT0xJTlQKKyAgRVhQRUNUX0VRKDUsIGFfKTsKKworICAvLyBzdWNjZXNzZnVsIEFTU0VSVF9HVAorICBBU1NFUlRfR1QoYV8rKywgYl8rKyk7CisgIEVYUEVDVF9FUSg2LCBhXyk7CisgIEVYUEVDVF9FUSgzLCBiXyk7Cit9CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCit2b2lkIFRocm93QW5JbnRlZ2VyKCkgeworICB0aHJvdyAxOworfQorCisvLyBUZXN0cyB0aGF0IGFzc2VydGlvbiBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuCitURVNUX0YoU2luZ2xlRXZhbHVhdGlvblRlc3QsIEV4Y2VwdGlvblRlc3RzKSB7CisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX1RIUk9XCisgIEVYUEVDVF9USFJPVyh7ICAvLyBOT0xJTlQKKyAgICBhXysrOworICAgIFRocm93QW5JbnRlZ2VyKCk7CisgIH0sIGludCk7CisgIEVYUEVDVF9FUSgxLCBhXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9USFJPVywgdGhyb3dzIGRpZmZlcmVudAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1coeyAgLy8gTk9MSU5UCisgICAgYV8rKzsKKyAgICBUaHJvd0FuSW50ZWdlcigpOworICB9LCBib29sKSwgInRocm93cyBhIGRpZmZlcmVudCB0eXBlIik7CisgIEVYUEVDVF9FUSgyLCBhXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9USFJPVywgdGhyb3dzIG5vdGhpbmcKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1RIUk9XKGFfKyssIGJvb2wpLCAidGhyb3dzIG5vdGhpbmciKTsKKyAgRVhQRUNUX0VRKDMsIGFfKTsKKworICAvLyBzdWNjZXNzZnVsIEVYUEVDVF9OT19USFJPVworICBFWFBFQ1RfTk9fVEhST1coYV8rKyk7CisgIEVYUEVDVF9FUSg0LCBhXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9OT19USFJPVworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTk9fVEhST1coeyAgLy8gTk9MSU5UCisgICAgYV8rKzsKKyAgICBUaHJvd0FuSW50ZWdlcigpOworICB9KSwgIml0IHRocm93cyIpOworICBFWFBFQ1RfRVEoNSwgYV8pOworCisgIC8vIHN1Y2Nlc3NmdWwgRVhQRUNUX0FOWV9USFJPVworICBFWFBFQ1RfQU5ZX1RIUk9XKHsgIC8vIE5PTElOVAorICAgIGFfKys7CisgICAgVGhyb3dBbkludGVnZXIoKTsKKyAgfSk7CisgIEVYUEVDVF9FUSg2LCBhXyk7CisKKyAgLy8gZmFpbGVkIEVYUEVDVF9BTllfVEhST1cKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0FOWV9USFJPVyhhXysrKSwgIml0IGRvZXNuJ3QiKTsKKyAgRVhQRUNUX0VRKDcsIGFfKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBUZXN0cyB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRS4KK2NsYXNzIE5vRmF0YWxGYWlsdXJlVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU3VjY2VlZHMoKSB7fQorICB2b2lkIEZhaWxzTm9uRmF0YWwoKSB7CisgICAgQUREX0ZBSUxVUkUoKSA8PCAic29tZSBub24tZmF0YWwgZmFpbHVyZSI7CisgIH0KKyAgdm9pZCBGYWlscygpIHsKKyAgICBGQUlMKCkgPDwgInNvbWUgZmF0YWwgZmFpbHVyZSI7CisgIH0KKworICB2b2lkIERvQXNzZXJ0Tm9GYXRhbEZhaWx1cmVPbkZhaWxzKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEZhaWxzKCkpOworICAgIEFERF9GQUlMVVJFKCkgPDwgInNob2xkIG5vdCByZWFjaCBoZXJlLiI7CisgIH0KKworICB2b2lkIERvRXhwZWN0Tm9GYXRhbEZhaWx1cmVPbkZhaWxzKCkgeworICAgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKEZhaWxzKCkpOworICAgIEFERF9GQUlMVVJFKCkgPDwgIm90aGVyIGZhaWx1cmUiOworICB9Cit9OworCitURVNUX0YoTm9GYXRhbEZhaWx1cmVUZXN0LCBOb0ZhaWx1cmUpIHsKKyAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoU3VjY2VlZHMoKSk7CisgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFN1Y2NlZWRzKCkpOworfQorCitURVNUX0YoTm9GYXRhbEZhaWx1cmVUZXN0LCBOb25GYXRhbElzTm9GYWlsdXJlKSB7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoRmFpbHNOb25GYXRhbCgpKSwKKyAgICAgICJzb21lIG5vbi1mYXRhbCBmYWlsdXJlIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRmFpbHNOb25GYXRhbCgpKSwKKyAgICAgICJzb21lIG5vbi1mYXRhbCBmYWlsdXJlIik7Cit9CisKK1RFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIEFzc2VydE5vRmF0YWxGYWlsdXJlT25GYXRhbEZhaWx1cmUpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlczsKKyAgeworICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKCZndGVzdF9mYWlsdXJlcyk7CisgICAgRG9Bc3NlcnROb0ZhdGFsRmFpbHVyZU9uRmFpbHMoKTsKKyAgfQorICBBU1NFUlRfRVEoMiwgZ3Rlc3RfZmFpbHVyZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMCkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkudHlwZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgInNvbWUgZmF0YWwgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIml0IGRvZXMiLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLm1lc3NhZ2UoKSk7Cit9CisKK1RFU1RfRihOb0ZhdGFsRmFpbHVyZVRlc3QsIEV4cGVjdE5vRmF0YWxGYWlsdXJlT25GYXRhbEZhaWx1cmUpIHsKKyAgVGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlczsKKyAgeworICAgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKCZndGVzdF9mYWlsdXJlcyk7CisgICAgRG9FeHBlY3ROb0ZhdGFsRmFpbHVyZU9uRmFpbHMoKTsKKyAgfQorICBBU1NFUlRfRVEoMywgZ3Rlc3RfZmFpbHVyZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMCkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLAorICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMikudHlwZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgInNvbWUgZmF0YWwgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMCkubWVzc2FnZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgIml0IGRvZXMiLAorICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X2ZhaWx1cmVzLkdldFRlc3RQYXJ0UmVzdWx0KDEpLm1lc3NhZ2UoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsICJvdGhlciBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgyKS5tZXNzYWdlKCkpOworfQorCitURVNUX0YoTm9GYXRhbEZhaWx1cmVUZXN0LCBNZXNzYWdlSXNTdHJlYW1hYmxlKSB7CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7CisgIHsKKyAgICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcigmZ3Rlc3RfZmFpbHVyZXMpOworICAgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAiZm9vIikgPDwgIm15IG1lc3NhZ2UiOworICB9CisgIEFTU0VSVF9FUSgyLCBndGVzdF9mYWlsdXJlcy5zaXplKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS50eXBlKCkpOworICBFWFBFQ1RfRVEoVGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsCisgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgxKS50eXBlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGVzdF9mYWlsdXJlcy5HZXRUZXN0UGFydFJlc3VsdCgwKS5tZXNzYWdlKCkpOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAibXkgbWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgZ3Rlc3RfZmFpbHVyZXMuR2V0VGVzdFBhcnRSZXN1bHQoMSkubWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgbm9uLXN0cmluZyBhc3NlcnRpb25zLgorCitzdGQ6OnN0cmluZyBFZGl0c1RvU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPEVkaXRUeXBlPiYgZWRpdHMpIHsKKyAgc3RkOjpzdHJpbmcgb3V0OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVkaXRzLnNpemUoKTsgKytpKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0VkaXRzW10gPSAiICstLyI7CisgICAgb3V0LmFwcGVuZCgxLCBrRWRpdHNbZWRpdHNbaV1dKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCitzdGQ6OnZlY3RvcjxzaXplX3Q+IENoYXJzVG9JbmRpY2VzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBvdXQ7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgb3V0LnB1c2hfYmFjayhzdHJbaV0pOworICB9CisgIHJldHVybiBvdXQ7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDaGFyc1RvTGluZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3V0OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIG91dC5wdXNoX2JhY2soc3RyLnN1YnN0cihpLCAxKSk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworVEVTVChFZGl0RGlzdGFuY2UsIFRlc3RDYXNlcykgeworICBzdHJ1Y3QgQ2FzZSB7CisgICAgaW50IGxpbmU7CisgICAgY29uc3QgY2hhciogbGVmdDsKKyAgICBjb25zdCBjaGFyKiByaWdodDsKKyAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9lZGl0czsKKyAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9kaWZmOworICB9OworICBzdGF0aWMgY29uc3QgQ2FzZSBrQ2FzZXNbXSA9IHsKKyAgICAgIC8vIE5vIGNoYW5nZS4KKyAgICAgIHtfX0xJTkVfXywgIkEiLCAiQSIsICIgIiwgIiJ9LAorICAgICAge19fTElORV9fLCAiQUJDREUiLCAiQUJDREUiLCAiICAgICAiLCAiIn0sCisgICAgICAvLyBTaW1wbGUgYWRkcy4KKyAgICAgIHtfX0xJTkVfXywgIlgiLCAiWEEiLCAiICsiLCAiQEAgKzEsMiBAQFxuIFhcbitBXG4ifSwKKyAgICAgIHtfX0xJTkVfXywgIlgiLCAiWEFCQ0QiLCAiICsrKysiLCAiQEAgKzEsNSBAQFxuIFhcbitBXG4rQlxuK0NcbitEXG4ifSwKKyAgICAgIC8vIFNpbXBsZSByZW1vdmVzLgorICAgICAge19fTElORV9fLCAiWEEiLCAiWCIsICIgLSIsICJAQCAtMSwyIEBAXG4gWFxuLUFcbiJ9LAorICAgICAge19fTElORV9fLCAiWEFCQ0QiLCAiWCIsICIgLS0tLSIsICJAQCAtMSw1IEBAXG4gWFxuLUFcbi1CXG4tQ1xuLURcbiJ9LAorICAgICAgLy8gU2ltcGxlIHJlcGxhY2VzLgorICAgICAge19fTElORV9fLCAiQSIsICJhIiwgIi8iLCAiQEAgLTEsMSArMSwxIEBAXG4tQVxuK2FcbiJ9LAorICAgICAge19fTElORV9fLCAiQUJDRCIsICJhYmNkIiwgIi8vLy8iLAorICAgICAgICJAQCAtMSw0ICsxLDQgQEBcbi1BXG4tQlxuLUNcbi1EXG4rYVxuK2JcbitjXG4rZFxuIn0sCisgICAgICAvLyBQYXRoIGZpbmRpbmcuCisgICAgICB7X19MSU5FX18sICJBQkNERUZHSCIsICJBQlhFR0gxIiwgIiAgLS8gLSAgKyIsCisgICAgICAgIkBAIC0xLDggKzEsNyBAQFxuIEFcbiBCXG4tQ1xuLURcbitYXG4gRVxuLUZcbiBHXG4gSFxuKzFcbiJ9LAorICAgICAge19fTElORV9fLCAiQUFBQUJDQ0NDIiwgIkFCQUJDRENEQyIsICItIC8gICArIC8gIiwKKyAgICAgICAiQEAgLTEsOSArMSw5IEBAXG4tQVxuIEFcbi1BXG4rQlxuIEFcbiBCXG4gQ1xuK0RcbiBDXG4tQ1xuK0RcbiBDXG4ifSwKKyAgICAgIHtfX0xJTkVfXywgIkFCQ0RFIiwgIkJDRENEIiwgIi0gICArLyIsCisgICAgICAgIkBAIC0xLDUgKzEsNSBAQFxuLUFcbiBCXG4gQ1xuIERcbi1FXG4rQ1xuK0RcbiJ9LAorICAgICAge19fTElORV9fLCAiQUJDREVGR0hJSktMIiwgIkJDRENERUZHSktMSksiLCAiLSArKyAgICAgLS0gICArKyIsCisgICAgICAgIkBAIC0xLDQgKzEsNSBAQFxuLUFcbiBCXG4rQ1xuK0RcbiBDXG4gRFxuIgorICAgICAgICJAQCAtNiw3ICs3LDcgQEBcbiBGXG4gR1xuLUhcbi1JXG4gSlxuIEtcbiBMXG4rSlxuK0tcbiJ9LAorICAgICAge319OworICBmb3IgKGNvbnN0IENhc2UqIGMgPSBrQ2FzZXM7IGMtPmxlZnQ7ICsrYykgeworICAgIEVYUEVDVF9UUlVFKGMtPmV4cGVjdGVkX2VkaXRzID09CisgICAgICAgICAgICAgICAgRWRpdHNUb1N0cmluZyhDYWxjdWxhdGVPcHRpbWFsRWRpdHMoQ2hhcnNUb0luZGljZXMoYy0+bGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb0luZGljZXMoYy0+cmlnaHQpKSkpCisgICAgICAgIDw8ICJMZWZ0IDwiIDw8IGMtPmxlZnQgPDwgIj4gUmlnaHQgPCIgPDwgYy0+cmlnaHQgPDwgIj4gRWRpdHMgPCIKKyAgICAgICAgPDwgRWRpdHNUb1N0cmluZyhDYWxjdWxhdGVPcHRpbWFsRWRpdHMoCisgICAgICAgICAgICAgICBDaGFyc1RvSW5kaWNlcyhjLT5sZWZ0KSwgQ2hhcnNUb0luZGljZXMoYy0+cmlnaHQpKSkgPDwgIj4iOworICAgIEVYUEVDVF9UUlVFKGMtPmV4cGVjdGVkX2RpZmYgPT0gQ3JlYXRlVW5pZmllZERpZmYoQ2hhcnNUb0xpbmVzKGMtPmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb0xpbmVzKGMtPnJpZ2h0KSkpCisgICAgICAgIDw8ICJMZWZ0IDwiIDw8IGMtPmxlZnQgPDwgIj4gUmlnaHQgPCIgPDwgYy0+cmlnaHQgPDwgIj4gRGlmZiA8IgorICAgICAgICA8PCBDcmVhdGVVbmlmaWVkRGlmZihDaGFyc1RvTGluZXMoYy0+bGVmdCksIENoYXJzVG9MaW5lcyhjLT5yaWdodCkpCisgICAgICAgIDw8ICI+IjsKKyAgfQorfQorCisvLyBUZXN0cyBFcUZhaWx1cmUoKSwgdXNlZCBmb3IgaW1wbGVtZW50aW5nICpFUSogYXNzZXJ0aW9ucy4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgRXFGYWlsdXJlKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZvb192YWwoIjUiKSwgYmFyX3ZhbCgiNiIpOworICBjb25zdCBzdGQ6OnN0cmluZyBtc2cxKAorICAgICAgRXFGYWlsdXJlKCJmb28iLCAiYmFyIiwgZm9vX3ZhbCwgYmFyX3ZhbCwgZmFsc2UpCisgICAgICAuZmFpbHVyZV9tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiVmFsdWUgb2Y6IGJhclxuIgorICAgICAgIiAgQWN0dWFsOiA2XG4iCisgICAgICAiRXhwZWN0ZWQ6IGZvb1xuIgorICAgICAgIldoaWNoIGlzOiA1IiwKKyAgICAgIG1zZzEuY19zdHIoKSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbXNnMigKKyAgICAgIEVxRmFpbHVyZSgiZm9vIiwgIjYiLCBmb29fdmFsLCBiYXJfdmFsLCBmYWxzZSkKKyAgICAgIC5mYWlsdXJlX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJWYWx1ZSBvZjogNlxuIgorICAgICAgIkV4cGVjdGVkOiBmb29cbiIKKyAgICAgICJXaGljaCBpczogNSIsCisgICAgICBtc2cyLmNfc3RyKCkpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZzMoCisgICAgICBFcUZhaWx1cmUoIjUiLCAiYmFyIiwgZm9vX3ZhbCwgYmFyX3ZhbCwgZmFsc2UpCisgICAgICAuZmFpbHVyZV9tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiVmFsdWUgb2Y6IGJhclxuIgorICAgICAgIiAgQWN0dWFsOiA2XG4iCisgICAgICAiRXhwZWN0ZWQ6IDUiLAorICAgICAgbXNnMy5jX3N0cigpKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBtc2c0KAorICAgICAgRXFGYWlsdXJlKCI1IiwgIjYiLCBmb29fdmFsLCBiYXJfdmFsLCBmYWxzZSkuZmFpbHVyZV9tZXNzYWdlKCkpOworICBFWFBFQ1RfU1RSRVEoCisgICAgICAiVmFsdWUgb2Y6IDZcbiIKKyAgICAgICJFeHBlY3RlZDogNSIsCisgICAgICBtc2c0LmNfc3RyKCkpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZzUoCisgICAgICBFcUZhaWx1cmUoImZvbyIsICJiYXIiLAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJcInhcIiIpLCBzdGQ6OnN0cmluZygiXCJ5XCIiKSwKKyAgICAgICAgICAgICAgICB0cnVlKS5mYWlsdXJlX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJWYWx1ZSBvZjogYmFyXG4iCisgICAgICAiICBBY3R1YWw6IFwieVwiXG4iCisgICAgICAiRXhwZWN0ZWQ6IGZvbyAoaWdub3JpbmcgY2FzZSlcbiIKKyAgICAgICJXaGljaCBpczogXCJ4XCIiLAorICAgICAgbXNnNS5jX3N0cigpKTsKK30KKworVEVTVChBc3NlcnRpb25UZXN0LCBFcUZhaWx1cmVXaXRoRGlmZikgeworICBjb25zdCBzdGQ6OnN0cmluZyBsZWZ0KAorICAgICAgIjFcXG4yWFhYXFxuM1xcbjVcXG42XFxuN1xcbjhcXG45XFxuMTBcXG4xMVxcbjEyWFhYXFxuMTNcXG4xNFxcbjE1Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJpZ2h0KAorICAgICAgIjFcXG4yXFxuM1xcbjRcXG41XFxuNlxcbjdcXG44XFxuOVxcbjExXFxuMTJcXG4xM1xcbjE0Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZzEoCisgICAgICBFcUZhaWx1cmUoImxlZnQiLCAicmlnaHQiLCBsZWZ0LCByaWdodCwgZmFsc2UpLmZhaWx1cmVfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1NUUkVRKAorICAgICAgIlZhbHVlIG9mOiByaWdodFxuIgorICAgICAgIiAgQWN0dWFsOiAxXFxuMlxcbjNcXG40XFxuNVxcbjZcXG43XFxuOFxcbjlcXG4xMVxcbjEyXFxuMTNcXG4xNFxuIgorICAgICAgIkV4cGVjdGVkOiBsZWZ0XG4iCisgICAgICAiV2hpY2ggaXM6ICIKKyAgICAgICIxXFxuMlhYWFxcbjNcXG41XFxuNlxcbjdcXG44XFxuOVxcbjEwXFxuMTFcXG4xMlhYWFxcbjEzXFxuMTRcXG4xNVxuIgorICAgICAgIldpdGggZGlmZjpcbkBAIC0xLDUgKzEsNiBAQFxuIDFcbi0yWFhYXG4rMlxuIDNcbis0XG4gNVxuIDZcbiIKKyAgICAgICJAQCAtNyw4ICs4LDYgQEBcbiA4XG4gOVxuLTEwXG4gMTFcbi0xMlhYWFxuKzEyXG4gMTNcbiAxNFxuLTE1XG4iLAorICAgICAgbXNnMS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgQXBwZW5kVXNlck1lc3NhZ2UoKSwgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSAqRVEqIG1hY3Jvcy4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQXBwZW5kVXNlck1lc3NhZ2UpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZm9vKCJmb28iKTsKKworICBNZXNzYWdlIG1zZzsKKyAgRVhQRUNUX1NUUkVRKCJmb28iLAorICAgICAgICAgICAgICAgQXBwZW5kVXNlck1lc3NhZ2UoZm9vLCBtc2cpLmNfc3RyKCkpOworCisgIG1zZyA8PCAiYmFyIjsKKyAgRVhQRUNUX1NUUkVRKCJmb29cbmJhciIsCisgICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShmb28sIG1zZykuY19zdHIoKSk7Cit9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKy8vIFNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwgIlVucmVhY2hhYmxlIGNvZGUiCisjIHByYWdtYSBvcHRpb24gcHVzaCAtdy1jY2MgLXctcmNoCisjZW5kaWYKKworLy8gVGVzdHMgQVNTRVJUX1RSVUUuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9UUlVFKSB7CisgIEFTU0VSVF9UUlVFKDIgPiAxKTsgIC8vIE5PTElOVAorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRSgyIDwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICIyIDwgMSIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfVFJVRShwcmVkaWNhdGUpIGZvciBwcmVkaWNhdGVzIHJldHVybmluZyBBc3NlcnRpb25SZXN1bHQuCitURVNUKEFzc2VydGlvblRlc3QsIEFzc2VydFRydWVXaXRoQXNzZXJ0aW9uUmVzdWx0KSB7CisgIEFTU0VSVF9UUlVFKFJlc3VsdElzRXZlbigyKSk7CisjaWZuZGVmIF9fQk9STEFORENfXworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfVFJVRShSZXN1bHRJc0V2ZW4oMykpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbigzKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlICgzIGlzIG9kZClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiB0cnVlIik7CisjZW5kaWYKKyAgQVNTRVJUX1RSVUUoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMykpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBmYWxzZSAoMyBpcyBvZGQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogdHJ1ZSIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfRkFMU0UuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9GQUxTRSkgeworICBBU1NFUlRfRkFMU0UoMiA8IDEpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9GQUxTRSgyID4gMSksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogMiA+IDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0ZBTFNFKHByZWRpY2F0ZSkgZm9yIHByZWRpY2F0ZXMgcmV0dXJuaW5nIEFzc2VydGlvblJlc3VsdC4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQXNzZXJ0RmFsc2VXaXRoQXNzZXJ0aW9uUmVzdWx0KSB7CisgIEFTU0VSVF9GQUxTRShSZXN1bHRJc0V2ZW4oMykpOworI2lmbmRlZiBfX0JPUkxBTkRDX18KKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlci4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZBTFNFKFJlc3VsdElzRXZlbigyKSksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuKDIpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogdHJ1ZSAoMiBpcyBldmVuKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGZhbHNlIik7CisjZW5kaWYKKyAgQVNTRVJUX0ZBTFNFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMykpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKSksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworfQorCisjaWZkZWYgX19CT1JMQU5EQ19fCisvLyBSZXN0b3JlcyB3YXJuaW5ncyBhZnRlciBwcmV2aW91cyAiI3ByYWdtYSBvcHRpb24gcHVzaCIgc3VwcmVzc2VkIHRoZW0KKyMgcHJhZ21hIG9wdGlvbiBwb3AKKyNlbmRpZgorCisvLyBUZXN0cyB1c2luZyBBU1NFUlRfRVEgb24gZG91YmxlIHZhbHVlcy4gIFRoZSBwdXJwb3NlIGlzIHRvIG1ha2UKKy8vIHN1cmUgdGhhdCB0aGUgc3BlY2lhbGl6YXRpb24gd2UgZGlkIGZvciBpbnRlZ2VyIGFuZCBhbm9ueW1vdXMgZW51bXMKKy8vIGlzbid0IHVzZWQgZm9yIGRvdWJsZSBhcmd1bWVudHMuCitURVNUKEV4cGVjdFRlc3QsIEFTU0VSVF9FUV9Eb3VibGUpIHsKKyAgLy8gQSBzdWNjZXNzLgorICBBU1NFUlRfRVEoNS42LCA1LjYpOworCisgIC8vIEEgZmFpbHVyZS4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKDUuMSwgNS4yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjUuMSIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfRVEuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9FUSkgeworICBBU1NFUlRfRVEoNSwgMiArIDMpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoNSwgMiozKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyKjNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiA2XG4iCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogNSIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfRVEoTlVMTCwgcG9pbnRlcikuCisjaWYgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTAorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfRVFfTlVMTCkgeworICAvLyBBIHN1Y2Nlc3MuCisgIGNvbnN0IGNoYXIqIHAgPSBOVUxMOworICAvLyBTb21lIG9sZGVyIEdDQyB2ZXJzaW9ucyBtYXkgaXNzdWUgYSBzcHVyaW91cyB3YXJpbmcgaW4gdGhpcyBvciB0aGUgbmV4dAorICAvLyBhc3NlcnRpb24gc3RhdGVtZW50LiBUaGlzIHdhcm5pbmcgc2hvdWxkIG5vdCBiZSBzdXBwcmVzc2VkIHdpdGgKKyAgLy8gc3RhdGljX2Nhc3Qgc2luY2UgdGhlIHRlc3QgdmVyaWZpZXMgdGhlIGFiaWxpdHkgdG8gdXNlIGJhcmUgTlVMTCBhcyB0aGUKKyAgLy8gZXhwZWN0ZWQgcGFyYW1ldGVyIHRvIHRoZSBtYWNyby4KKyAgQVNTRVJUX0VRKE5VTEwsIHApOworCisgIC8vIEEgZmFpbHVyZS4KKyAgc3RhdGljIGludCBuID0gMDsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKE5VTEwsICZuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAmblxuIik7Cit9CisjZW5kaWYgIC8vIEdURVNUX0NBTl9DT01QQVJFX05VTEwKKworLy8gVGVzdHMgQVNTRVJUX0VRKDAsIG5vbl9wb2ludGVyKS4gIFNpbmNlIHRoZSBsaXRlcmFsIDAgY2FuIGJlCisvLyB0cmVhdGVkIGFzIGEgbnVsbCBwb2ludGVyIGJ5IHRoZSBjb21waWxlciwgd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgQVNTRVJUX0VRKDAsIG5vbl9wb2ludGVyKSBpc24ndCBpbnRlcnByZXRlZCBieSBHb29nbGUgVGVzdCBhcworLy8gQVNTRVJUX0VRKHN0YXRpY19jYXN0PHZvaWQqPihOVUxMKSwgbm9uX3BvaW50ZXIpLgorVEVTVChFeHBlY3RUZXN0LCBBU1NFUlRfRVFfMCkgeworICBpbnQgbiA9IDA7CisKKyAgLy8gQSBzdWNjZXNzLgorICBBU1NFUlRfRVEoMCwgbik7CisKKyAgLy8gQSBmYWlsdXJlLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoMCwgNS42KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAwIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9ORS4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX05FKSB7CisgIEFTU0VSVF9ORSg2LCA3KTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX05FKCdhJywgJ2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoJ2EnKSAhPSAoJ2EnKSwgIgorICAgICAgICAgICAgICAgICAgICAgICAiYWN0dWFsOiAnYScgKDk3LCAweDYxKSB2cyAnYScgKDk3LCAweDYxKSIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfTEUuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9MRSkgeworICBBU1NFUlRfTEUoMiwgMyk7CisgIEFTU0VSVF9MRSgyLCAyKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0xFKDIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA8PSAoMCksIGFjdHVhbDogMiB2cyAwIik7Cit9CisKKy8vIFRlc3RzIEFTU0VSVF9MVC4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0xUKSB7CisgIEFTU0VSVF9MVCgyLCAzKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0xUKDIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA8ICgyKSwgYWN0dWFsOiAyIHZzIDIiKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX0dFLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfR0UpIHsKKyAgQVNTRVJUX0dFKDIsIDEpOworICBBU1NFUlRfR0UoMiwgMik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9HRSgyLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPj0gKDMpLCBhY3R1YWw6IDIgdnMgMyIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfR1QuCitURVNUKEFzc2VydGlvblRlc3QsIEFTU0VSVF9HVCkgeworICBBU1NFUlRfR1QoMiwgMSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9HVCgyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPiAoMiksIGFjdHVhbDogMiB2cyAyIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCit2b2lkIFRocm93Tm90aGluZygpIHt9CisKKy8vIFRlc3RzIEFTU0VSVF9USFJPVy4KK1RFU1QoQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX1RIUk9XKSB7CisgIEFTU0VSVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpOworCisjIGlmbmRlZiBfX0JPUkxBTkRDX18KKworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyIDIwMDcgYW5kIDIwMDkuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKAorICAgICAgQVNTRVJUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGJvb2wpLAorICAgICAgIkV4cGVjdGVkOiBUaHJvd0FuSW50ZWdlcigpIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSBib29sLlxuIgorICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3MgYSBkaWZmZXJlbnQgdHlwZS4iKTsKKyMgZW5kaWYKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9USFJPVyhUaHJvd05vdGhpbmcoKSwgYm9vbCksCisgICAgICAiRXhwZWN0ZWQ6IFRocm93Tm90aGluZygpIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSBib29sLlxuIgorICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3Mgbm90aGluZy4iKTsKK30KKworLy8gVGVzdHMgQVNTRVJUX05PX1RIUk9XLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfTk9fVEhST1cpIHsKKyAgQVNTRVJUX05PX1RIUk9XKFRocm93Tm90aGluZygpKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX05PX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IFRocm93QW5JbnRlZ2VyKCkgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24uIgorICAgICAgICAgICAgICAgICAgICAgICAiXG4gIEFjdHVhbDogaXQgdGhyb3dzLiIpOworfQorCisvLyBUZXN0cyBBU1NFUlRfQU5ZX1RIUk9XLgorVEVTVChBc3NlcnRpb25UZXN0LCBBU1NFUlRfQU5ZX1RIUk9XKSB7CisgIEFTU0VSVF9BTllfVEhST1coVGhyb3dBbkludGVnZXIoKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKAorICAgICAgQVNTRVJUX0FOWV9USFJPVyhUaHJvd05vdGhpbmcoKSksCisgICAgICAiRXhwZWN0ZWQ6IFRocm93Tm90aGluZygpIHRocm93cyBhbiBleGNlcHRpb24uXG4iCisgICAgICAiICBBY3R1YWw6IGl0IGRvZXNuJ3QuIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gTWFrZXMgc3VyZSB3ZSBkZWFsIHdpdGggdGhlIHByZWNlZGVuY2Ugb2YgPDwuICBUaGlzIHRlc3Qgc2hvdWxkCisvLyBjb21waWxlLgorVEVTVChBc3NlcnRpb25UZXN0LCBBc3NlcnRQcmVjZWRlbmNlKSB7CisgIEFTU0VSVF9FUSgxIDwgMiwgdHJ1ZSk7CisgIGJvb2wgZmFsc2VfdmFsdWUgPSBmYWxzZTsKKyAgQVNTRVJUX0VRKHRydWUgJiYgZmFsc2VfdmFsdWUsIGZhbHNlKTsKK30KKworLy8gQSBzdWJyb3V0aW5lIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0Lgordm9pZCBUZXN0RXExKGludCB4KSB7CisgIEFTU0VSVF9FUSgxLCB4KTsKK30KKworLy8gVGVzdHMgY2FsbGluZyBhIHRlc3Qgc3Vicm91dGluZSB0aGF0J3Mgbm90IHBhcnQgb2YgYSBmaXh0dXJlLgorVEVTVChBc3NlcnRpb25UZXN0LCBOb25GaXh0dXJlU3Vicm91dGluZSkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShUZXN0RXExKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IHgiKTsKK30KKworLy8gQW4gdW5jb3B5YWJsZSBjbGFzcy4KK2NsYXNzIFVuY29weWFibGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5jb3B5YWJsZShpbnQgYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30KKworICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVuY29weWFibGUmIHJocykgY29uc3QgeworICAgIHJldHVybiB2YWx1ZSgpID09IHJocy52YWx1ZSgpOworICB9CisgcHJpdmF0ZToKKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBkZWxpYmVyYXRlbHkgaGFzIG5vIGltcGxlbWVudGF0aW9uLCBhcyB3ZSBkb24ndAorICAvLyB3YW50IHRoaXMgY2xhc3MgdG8gYmUgY29weWFibGUuCisgIFVuY29weWFibGUoY29uc3QgVW5jb3B5YWJsZSYpOyAgLy8gTk9MSU5UCisKKyAgaW50IHZhbHVlXzsKK307CisKKzo6c3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVW5jb3B5YWJsZSYgdmFsdWUpIHsKKyAgcmV0dXJuIG9zIDw8IHZhbHVlLnZhbHVlKCk7Cit9CisKKworYm9vbCBJc1Bvc2l0aXZlVW5jb3B5YWJsZShjb25zdCBVbmNvcHlhYmxlJiB4KSB7CisgIHJldHVybiB4LnZhbHVlKCkgPiAwOworfQorCisvLyBBIHN1YnJvdXRpbmUgdXNlZCBieSB0aGUgZm9sbG93aW5nIHRlc3QuCit2b2lkIFRlc3RBc3NlcnROb25Qb3NpdGl2ZSgpIHsKKyAgVW5jb3B5YWJsZSB5KC0xKTsKKyAgQVNTRVJUX1BSRUQxKElzUG9zaXRpdmVVbmNvcHlhYmxlLCB5KTsKK30KKy8vIEEgc3Vicm91dGluZSB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdC4KK3ZvaWQgVGVzdEFzc2VydEVxdWFsc1VuY29weWFibGUoKSB7CisgIFVuY29weWFibGUgeCg1KTsKKyAgVW5jb3B5YWJsZSB5KC0xKTsKKyAgQVNTRVJUX0VRKHgsIHkpOworfQorCisvLyBUZXN0cyB0aGF0IHVuY29weWFibGUgb2JqZWN0cyBjYW4gYmUgdXNlZCBpbiBhc3NlcnRpb25zLgorVEVTVChBc3NlcnRpb25UZXN0LCBBc3NlcnRXb3Jrc1dpdGhVbmNvcHlhYmxlT2JqZWN0KSB7CisgIFVuY29weWFibGUgeCg1KTsKKyAgQVNTRVJUX1BSRUQxKElzUG9zaXRpdmVVbmNvcHlhYmxlLCB4KTsKKyAgQVNTRVJUX0VRKHgsIHgpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShUZXN0QXNzZXJ0Tm9uUG9zaXRpdmUoKSwKKyAgICAiSXNQb3NpdGl2ZVVuY29weWFibGUoeSkgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZVxueSBldmFsdWF0ZXMgdG8gLTEiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoVGVzdEFzc2VydEVxdWFsc1VuY29weWFibGUoKSwKKyAgICAiVmFsdWUgb2Y6IHlcbiAgQWN0dWFsOiAtMVxuRXhwZWN0ZWQ6IHhcbldoaWNoIGlzOiA1Iik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdW5jb3B5YWJsZSBvYmplY3RzIGNhbiBiZSB1c2VkIGluIGV4cGVjdHMuCitURVNUKEFzc2VydGlvblRlc3QsIEV4cGVjdFdvcmtzV2l0aFVuY29weWFibGVPYmplY3QpIHsKKyAgVW5jb3B5YWJsZSB4KDUpOworICBFWFBFQ1RfUFJFRDEoSXNQb3NpdGl2ZVVuY29weWFibGUsIHgpOworICBVbmNvcHlhYmxlIHkoLTEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfUFJFRDEoSXNQb3NpdGl2ZVVuY29weWFibGUsIHkpLAorICAgICJJc1Bvc2l0aXZlVW5jb3B5YWJsZSh5KSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlXG55IGV2YWx1YXRlcyB0byAtMSIpOworICBFWFBFQ1RfRVEoeCwgeCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh4LCB5KSwKKyAgICAiVmFsdWUgb2Y6IHlcbiAgQWN0dWFsOiAtMVxuRXhwZWN0ZWQ6IHhcbldoaWNoIGlzOiA1Iik7Cit9CisKK2VudW0gTmFtZWRFbnVtIHsKKyAga0UxID0gMCwKKyAga0UyID0gMQorfTsKKworVEVTVChBc3NlcnRpb25UZXN0LCBOYW1lZEVudW0pIHsKKyAgRVhQRUNUX0VRKGtFMSwga0UxKTsKKyAgRVhQRUNUX0xUKGtFMSwga0UyKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKGtFMSwga0UyKSwgIldoaWNoIGlzOiAwIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShrRTEsIGtFMiksICJBY3R1YWw6IDEiKTsKK30KKworLy8gVGhlIHZlcnNpb24gb2YgZ2NjIHVzZWQgaW4gWENvZGUgMi4yIGhhcyBhIGJ1ZyBhbmQgZG9lc24ndCBhbGxvdworLy8gYW5vbnltb3VzIGVudW1zIGluIGFzc2VydGlvbnMuICBUaGVyZWZvcmUgdGhlIGZvbGxvd2luZyB0ZXN0IGlzIG5vdAorLy8gZG9uZSBvbiBNYWMuCisvLyBTdW4gU3R1ZGlvIGFuZCBIUCBhQ0MgYWxzbyByZWplY3QgdGhpcyBjb2RlLgorI2lmICFHVEVTVF9PU19NQUMgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpICYmICFkZWZpbmVkKF9fSFBfYUNDKQorCisvLyBUZXN0cyB1c2luZyBhc3NlcnRpb25zIHdpdGggYW5vbnltb3VzIGVudW1zLgorZW51bSB7CisgIGtDYXNlQSA9IC0xLAorCisjIGlmIEdURVNUX09TX0xJTlVYCisKKyAgLy8gV2Ugd2FudCB0byB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBzaXplIG9mIHRoZSBhbm9ueW1vdXMgZW51bSBpcworICAvLyBsYXJnZXIgdGhhbiBzaXplb2YoaW50KSwgdG8gbWFrZSBzdXJlIG91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAgLy8gYXNzZXJ0aW9ucyBkb2Vzbid0IHRydW5jYXRlIHRoZSBlbnVtcy4gIEhvd2V2ZXIsIE1TVkMKKyAgLy8gKGluY29ycmVjdGx5KSBkb2Vzbid0IGFsbG93IGFuIGVudW0gdmFsdWUgdG8gZXhjZWVkIHRoZSByYW5nZSBvZgorICAvLyBhbiBpbnQsIHNvIHRoaXMgaGFzIHRvIGJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuCisgIC8vCisgIC8vIE9uIExpbnV4LCBrQ2FzZUIgYW5kIGtDYXNlQSBoYXZlIHRoZSBzYW1lIHZhbHVlIHdoZW4gdHJ1bmNhdGVkIHRvCisgIC8vIGludCBzaXplLiAgV2Ugd2FudCB0byB0ZXN0IHdoZXRoZXIgdGhpcyB3aWxsIGNvbmZ1c2UgdGhlCisgIC8vIGFzc2VydGlvbnMuCisgIGtDYXNlQiA9IHRlc3Rpbmc6OmludGVybmFsOjprTWF4QmlnZ2VzdEludCwKKworIyBlbHNlCisKKyAga0Nhc2VCID0gSU5UX01BWCwKKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworICBrQ2FzZUMgPSA0MgorfTsKKworVEVTVChBc3NlcnRpb25UZXN0LCBBbm9ueW1vdXNFbnVtKSB7CisjIGlmIEdURVNUX09TX0xJTlVYCisKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oa0Nhc2VBKSwgc3RhdGljX2Nhc3Q8aW50PihrQ2FzZUIpKTsKKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKKworICBFWFBFQ1RfRVEoa0Nhc2VBLCBrQ2FzZUEpOworICBFWFBFQ1RfTkUoa0Nhc2VBLCBrQ2FzZUIpOworICBFWFBFQ1RfTFQoa0Nhc2VBLCBrQ2FzZUIpOworICBFWFBFQ1RfTEUoa0Nhc2VBLCBrQ2FzZUIpOworICBFWFBFQ1RfR1Qoa0Nhc2VCLCBrQ2FzZUEpOworICBFWFBFQ1RfR0Uoa0Nhc2VBLCBrQ2FzZUEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR0Uoa0Nhc2VBLCBrQ2FzZUIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKGtDYXNlQSkgPj0gKGtDYXNlQikiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dFKGtDYXNlQSwga0Nhc2VDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi0xIHZzIDQyIik7CisKKyAgQVNTRVJUX0VRKGtDYXNlQSwga0Nhc2VBKTsKKyAgQVNTRVJUX05FKGtDYXNlQSwga0Nhc2VCKTsKKyAgQVNTRVJUX0xUKGtDYXNlQSwga0Nhc2VCKTsKKyAgQVNTRVJUX0xFKGtDYXNlQSwga0Nhc2VCKTsKKyAgQVNTRVJUX0dUKGtDYXNlQiwga0Nhc2VBKTsKKyAgQVNTRVJUX0dFKGtDYXNlQSwga0Nhc2VBKTsKKworIyBpZm5kZWYgX19CT1JMQU5EQ19fCisKKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlci4KKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKGtDYXNlQSwga0Nhc2VCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBrQ2FzZUIiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKGtDYXNlQSwga0Nhc2VDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFjdHVhbDogNDIiKTsKKyMgZW5kaWYKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoa0Nhc2VBLCBrQ2FzZUMpLAorICAgICAgICAgICAgICAgICAgICAgICAiV2hpY2ggaXM6IC0xIik7Cit9CisKKyNlbmRpZiAgLy8gIUdURVNUX09TX01BQyAmJiAhZGVmaW5lZChfX1NVTlBST19DQykKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworc3RhdGljIEhSRVNVTFQgVW5leHBlY3RlZEhSRVNVTFRGYWlsdXJlKCkgeworICByZXR1cm4gRV9VTkVYUEVDVEVEOworfQorCitzdGF0aWMgSFJFU1VMVCBPa0hSRVNVTFRTdWNjZXNzKCkgeworICByZXR1cm4gU19PSzsKK30KKworc3RhdGljIEhSRVNVTFQgRmFsc2VIUkVTVUxUU3VjY2VzcygpIHsKKyAgcmV0dXJuIFNfRkFMU0U7Cit9CisKKy8vIEhSRVNVTFQgYXNzZXJ0aW9uIHRlc3RzIHRlc3QgYm90aCB6ZXJvIGFuZCBub24temVybworLy8gc3VjY2VzcyBjb2RlcyBhcyB3ZWxsIGFzIGZhaWx1cmUgbWVzc2FnZSBmb3IgZWFjaC4KKy8vCisvLyBXaW5kb3dzIENFIGRvZXNuJ3Qgc3VwcG9ydCBtZXNzYWdlIHRleHRzLgorVEVTVChIUkVTVUxUQXNzZXJ0aW9uVGVzdCwgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKSB7CisgIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChTX09LKTsKKyAgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKFNfRkFMU0UpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSksCisgICAgIkV4cGVjdGVkOiAoVW5leHBlY3RlZEhSRVNVTFRGYWlsdXJlKCkpIHN1Y2NlZWRzLlxuIgorICAgICIgIEFjdHVhbDogMHg4MDAwRkZGRiIpOworfQorCitURVNUKEhSRVNVTFRBc3NlcnRpb25UZXN0LCBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQpIHsKKyAgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKFNfT0spOworICBBU1NFUlRfSFJFU1VMVF9TVUNDRUVERUQoU19GQUxTRSk7CisKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKFVuZXhwZWN0ZWRIUkVTVUxURmFpbHVyZSgpKSwKKyAgICAiRXhwZWN0ZWQ6IChVbmV4cGVjdGVkSFJFU1VMVEZhaWx1cmUoKSkgc3VjY2VlZHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDgwMDBGRkZGIik7Cit9CisKK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRCkgeworICBFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoRV9VTkVYUEVDVEVEKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoT2tIUkVTVUxUU3VjY2VzcygpKSwKKyAgICAiRXhwZWN0ZWQ6IChPa0hSRVNVTFRTdWNjZXNzKCkpIGZhaWxzLlxuIgorICAgICIgIEFjdHVhbDogMHgwIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChGYWxzZUhSRVNVTFRTdWNjZXNzKCkpLAorICAgICJFeHBlY3RlZDogKEZhbHNlSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDEiKTsKK30KKworVEVTVChIUkVTVUxUQXNzZXJ0aW9uVGVzdCwgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKSB7CisgIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChFX1VORVhQRUNURUQpOworCisjIGlmbmRlZiBfX0JPUkxBTkRDX18KKworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyIDIwMDcgYW5kIDIwMDkuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChPa0hSRVNVTFRTdWNjZXNzKCkpLAorICAgICJFeHBlY3RlZDogKE9rSFJFU1VMVFN1Y2Nlc3MoKSkgZmFpbHMuXG4iCisgICAgIiAgQWN0dWFsOiAweDAiKTsKKyMgZW5kaWYKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfSFJFU1VMVF9GQUlMRUQoRmFsc2VIUkVTVUxUU3VjY2VzcygpKSwKKyAgICAiRXhwZWN0ZWQ6IChGYWxzZUhSRVNVTFRTdWNjZXNzKCkpIGZhaWxzLlxuIgorICAgICIgIEFjdHVhbDogMHgxIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3RyZWFtaW5nIHRvIHRoZSBIUkVTVUxUIG1hY3JvcyB3b3Jrcy4KK1RFU1QoSFJFU1VMVEFzc2VydGlvblRlc3QsIFN0cmVhbWluZykgeworICBFWFBFQ1RfSFJFU1VMVF9TVUNDRUVERUQoU19PSykgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChTX09LKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKEVfVU5FWFBFQ1RFRCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChFX1VORVhQRUNURUQpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKEVfVU5FWFBFQ1RFRCkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKworIyBpZm5kZWYgX19CT1JMQU5EQ19fCisKKyAgLy8gSUNFJ3MgaW4gQysrQnVpbGRlciAyMDA3IGFuZCAyMDA5LgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChFX1VORVhQRUNURUQpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisjIGVuZGlmCisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoCisgICAgICBFWFBFQ1RfSFJFU1VMVF9GQUlMRUQoU19PSykgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgKKyAgICAgIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChTX09LKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKKyMgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKKyNlbmRpZgorCisvLyBUZXN0cyB0aGF0IHRoZSBhc3NlcnRpb24gbWFjcm9zIGJlaGF2ZSBsaWtlIHNpbmdsZSBzdGF0ZW1lbnRzLgorVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBCYXNpY0Fzc2VydGlvbnNCZWhhdmVzTGlrZVNpbmdsZVN0YXRlbWVudCkgeworICBpZiAoQWx3YXlzRmFsc2UoKSkKKyAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCdzIGEgY29tcGlsYXRpb24gdGVzdCBvbmx5LiI7CisKKyAgaWYgKEFsd2F5c1RydWUoKSkKKyAgICBFWFBFQ1RfRkFMU0UoZmFsc2UpOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgQVNTRVJUX0xUKDEsIDMpOworCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIDsgIC8vIE5PTElOVAorICBlbHNlCisgICAgRVhQRUNUX0dUKDMsIDIpIDw8ICIiOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKy8vIFRlc3RzIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgbm90IGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIGNvZGUgaW4gdGhlCisvLyBFWFBFQ1RfVEhST1cvRVhQRUNUX0FOWV9USFJPVy9FWFBFQ1RfTk9fVEhST1cgbWFjcm9zLgorVEVTVChFeHBlY3RUaHJvd1Rlc3QsIERvZXNOb3RHZW5lcmF0ZVVucmVhY2hhYmxlQ29kZVdhcm5pbmcpIHsKKyAgaW50IG4gPSAwOworCisgIEVYUEVDVF9USFJPVyh0aHJvdyAxLCBpbnQpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVEhST1cobisrLCBpbnQpLCAiIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyh0aHJvdyAxLCBjb25zdCBjaGFyKiksICIiKTsKKyAgRVhQRUNUX05PX1RIUk9XKG4rKyk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9OT19USFJPVyh0aHJvdyAxKSwgIiIpOworICBFWFBFQ1RfQU5ZX1RIUk9XKHRocm93IDEpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfQU5ZX1RIUk9XKG4rKyksICIiKTsKK30KKworVEVTVChBc3NlcnRpb25TeW50YXhUZXN0LCBFeGNlcHRpb25Bc3NlcnRpb25zQmVoYXZlc0xpa2VTaW5nbGVTdGF0ZW1lbnQpIHsKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgRVhQRUNUX1RIUk9XKFRocm93Tm90aGluZygpLCBib29sKTsKKworICBpZiAoQWx3YXlzVHJ1ZSgpKQorICAgIEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBpbnQpOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgRVhQRUNUX05PX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX05PX1RIUk9XKFRocm93Tm90aGluZygpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEVYUEVDVF9BTllfVEhST1coVGhyb3dOb3RoaW5nKCkpOworCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCitURVNUKEFzc2VydGlvblN5bnRheFRlc3QsIE5vRmF0YWxGYWlsdXJlQXNzZXJ0aW9uc0JlaGF2ZXNMaWtlU2luZ2xlU3RhdGVtZW50KSB7CisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKEZBSUwoKSkgPDwgIlRoaXMgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiSXQncyBhIGNvbXBpbGF0aW9uIHRlc3Qgb25seS4iOworICBlbHNlCisgICAgOyAgLy8gTk9MSU5UCisKKyAgaWYgKEFsd2F5c0ZhbHNlKCkpCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpKSA8PCAiIjsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNUcnVlKCkpCisgICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKKyAgZWxzZQorICAgIDsgIC8vIE5PTElOVAorCisgIGlmIChBbHdheXNGYWxzZSgpKQorICAgIDsgIC8vIE5PTElOVAorICBlbHNlCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU1VDQ0VFRCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgYXNzZXJ0aW9uIG1hY3JvcyB3b3JrIHdlbGwgd2l0aCBzd2l0Y2ggc3RhdGVtZW50cy4KK1RFU1QoQXNzZXJ0aW9uU3ludGF4VGVzdCwgV29ya3NXaXRoU3dpdGNoKSB7CisgIHN3aXRjaCAoMCkgeworICAgIGNhc2UgMToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlRfVFJVRSh0cnVlKTsKKyAgfQorCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfRkFMU0UoZmFsc2UpIDw8ICJFWFBFQ1RfRkFMU0UgZmFpbGVkIGluIHN3aXRjaCBjYXNlIjsKKworICAvLyBCaW5hcnkgYXNzZXJ0aW9ucyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgYSBkaWZmZXJlbnQgY29kZSBwYXRoCisgIC8vIHRoYW4gdGhlIEJvb2xlYW4gYXNzZXJ0aW9ucy4gIEhlbmNlIHdlIHRlc3QgdGhlbSBzZXBhcmF0ZWx5LgorICBzd2l0Y2ggKDApIHsKKyAgICBjYXNlIDE6CisgICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVF9FUSgxLCAxKSA8PCAiQVNTRVJUX0VRIGZhaWxlZCBpbiBkZWZhdWx0IHN3aXRjaCBoYW5kbGVyIjsKKyAgfQorCisgIHN3aXRjaCAoMCkKKyAgICBjYXNlIDA6CisgICAgICBFWFBFQ1RfTkUoMSwgMik7Cit9CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCit2b2lkIFRocm93QVN0cmluZygpIHsKKyAgICB0aHJvdyAic3RkOjpzdHJpbmciOworfQorCisvLyBUZXN0IHRoYXQgdGhlIGV4Y2VwdGlvbiBhc3NlcnRpb24gbWFjcm9zIGNvbXBpbGUgYW5kIHdvcmsgd2l0aCBjb25zdAorLy8gdHlwZSBxdWFsaWZpZXIuCitURVNUKEFzc2VydGlvblN5bnRheFRlc3QsIFdvcmtzV2l0aENvbnN0KSB7CisgICAgQVNTRVJUX1RIUk9XKFRocm93QVN0cmluZygpLCBjb25zdCBjaGFyKik7CisKKyAgICBFWFBFQ1RfVEhST1coVGhyb3dBU3RyaW5nKCksIGNvbnN0IGNoYXIqKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IHRyYWNrcyBTVUNDRUVEKi4KK1RFU1QoU3VjY2Vzc2Z1bEFzc2VydGlvblRlc3QsIFNVQ0NFRUQpIHsKKyAgU1VDQ0VFRCgpOworICBTVUNDRUVEKCkgPDwgIk9LIjsKKyAgRVhQRUNUX0VRKDIsIEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPnRvdGFsX3BhcnRfY291bnQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgR29vZ2xlIFRlc3QgZG9lc24ndCB0cmFjayBzdWNjZXNzZnVsIEVYUEVDVF8qLgorVEVTVChTdWNjZXNzZnVsQXNzZXJ0aW9uVGVzdCwgRVhQRUNUKSB7CisgIEVYUEVDVF9UUlVFKHRydWUpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBkb2Vzbid0IHRyYWNrIHN1Y2Nlc3NmdWwgRVhQRUNUX1NUUiouCitURVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBFWFBFQ1RfU1RSKSB7CisgIEVYUEVDVF9TVFJFUSgiIiwgIiIpOworICBFWFBFQ1RfRVEoMCwgR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBkb2Vzbid0IHRyYWNrIHN1Y2Nlc3NmdWwgQVNTRVJUXyouCitURVNUKFN1Y2Nlc3NmdWxBc3NlcnRpb25UZXN0LCBBU1NFUlQpIHsKKyAgQVNTRVJUX1RSVUUodHJ1ZSk7CisgIEVYUEVDVF9FUSgwLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCisvLyBUZXN0cyB0aGF0IEdvb2dsZSBUZXN0IGRvZXNuJ3QgdHJhY2sgc3VjY2Vzc2Z1bCBBU1NFUlRfU1RSKi4KK1RFU1QoU3VjY2Vzc2Z1bEFzc2VydGlvblRlc3QsIEFTU0VSVF9TVFIpIHsKKyAgQVNTRVJUX1NUUkVRKCIiLCAiIik7CisgIEVYUEVDVF9FUSgwLCBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT50b3RhbF9wYXJ0X2NvdW50KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCituYW1lc3BhY2UgeworCisvLyBUZXN0cyB0aGUgbWVzc2FnZSBzdHJlYW1pbmcgdmFyaWF0aW9uIG9mIGFzc2VydGlvbnMuCisKK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBFWFBFQ1QpIHsKKyAgRVhQRUNUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ORSgxLCAxKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjMS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjMSIpOworICBFWFBFQ1RfTEUoMSwgMikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKDEsIDApIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMyLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlICMyLiIpOworICBFWFBFQ1RfR0UoMSwgMCkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dUKDEsIDIpIDw8ICJFeHBlY3RlZCBmYWlsdXJlICMzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmYWlsdXJlICMzLiIpOworCisgIEVYUEVDVF9TVFJFUSgiMSIsICIxIikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUk5FKCIxIiwgIjEiKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjNC4iKTsKKyAgRVhQRUNUX1NUUkNBU0VFUSgiYSIsICJBIikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkNBU0VORSgiYSIsICJBIikgPDwgIkV4cGVjdGVkIGZhaWx1cmUgIzUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUgIzUuIik7CisKKyAgRVhQRUNUX0ZMT0FUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9ET1VCTEVfRVEoMSwgMS4yKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZSAjNi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZSAjNi4iKTsKKyAgRVhQRUNUX05FQVIoMSwgMS4xLCAwLjIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7Cit9CisKK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBBU1NFUlQpIHsKKyAgQVNTRVJUX0VRKDEsIDEpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEFTU0VSVF9ORSgxLCAyKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBBU1NFUlRfTEUoMSwgMikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX0xUKDEsIDIpIDw8ICJUaGlzIHNob3VsZCBzdWNjZWVkLiI7CisgIEFTU0VSVF9HRSgxLCAwKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfR1QoMSwgMikgPDwgIkV4cGVjdGVkIGZhaWx1cmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZhaWx1cmUuIik7Cit9CisKK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBBU1NFUlRfU1RSKSB7CisgIEFTU0VSVF9TVFJFUSgiMSIsICIxIikgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX1NUUk5FKCIxIiwgIjIiKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBBU1NFUlRfU1RSQ0FTRUVRKCJhIiwgIkEiKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSQ0FTRU5FKCJhIiwgIkEiKSA8PCAiRXhwZWN0ZWQgZmFpbHVyZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZmFpbHVyZS4iKTsKK30KKworVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIEFTU0VSVF9GTE9BVElORykgeworICBBU1NFUlRfRkxPQVRfRVEoMSwgMSkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX0RPVUJMRV9FUSgxLCAxKSA8PCAiVGhpcyBzaG91bGQgc3VjY2VlZC4iOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkVBUigxLDEuMiwgMC4xKSA8PCAiRXhwZWN0IGZhaWx1cmUuIiwgIC8vIE5PTElOVAorICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0IGZhaWx1cmUuIik7CisgIC8vIFRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAyLjk1LjAsIHRoZXJlIGlzIGludGVudGlvbmFsbHkgbm8KKyAgLy8gc3BhY2UgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQuCit9CisKKy8vIFRlc3RzIHVzaW5nIEFTU0VSVF9GQUxTRSB3aXRoIGEgc3RyZWFtZWQgbWVzc2FnZS4KK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBBU1NFUlRfRkFMU0UpIHsKKyAgQVNTRVJUX0ZBTFNFKGZhbHNlKSA8PCAiVGhpcyBzaG91bGRuJ3QgZmFpbC4iOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBBU1NFUlRfRkFMU0UodHJ1ZSkgPDwgIkV4cGVjdGVkIGZhaWx1cmU6ICIgPDwgMiA8PCAiID4gIiA8PCAxCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdHJ1ZTsKKyAgfSwgIkV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgRkFJTCB3aXRoIGEgc3RyZWFtZWQgbWVzc2FnZS4KK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBGQUlMKSB7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiMCIpOworfQorCisvLyBUZXN0cyB1c2luZyBTVUNDRUVEIHdpdGggYSBzdHJlYW1lZCBtZXNzYWdlLgorVEVTVChBc3NlcnRpb25XaXRoTWVzc2FnZVRlc3QsIFNVQ0NFRUQpIHsKKyAgU1VDQ0VFRCgpIDw8ICJTdWNjZXNzID09ICIgPDwgMTsKK30KKworLy8gVGVzdHMgdXNpbmcgQVNTRVJUX1RSVUUgd2l0aCBhIHN0cmVhbWVkIG1lc3NhZ2UuCitURVNUKEFzc2VydGlvbldpdGhNZXNzYWdlVGVzdCwgQVNTRVJUX1RSVUUpIHsKKyAgQVNTRVJUX1RSVUUodHJ1ZSkgPDwgIlRoaXMgc2hvdWxkIHN1Y2NlZWQuIjsKKyAgQVNTRVJUX1RSVUUodHJ1ZSkgPDwgdHJ1ZTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8Y2hhciAqPihOVUxMKTsKKyAgfSwgIihudWxsKShudWxsKSIpOworfQorCisjaWYgR1RFU1RfT1NfV0lORE9XUworLy8gVGVzdHMgdXNpbmcgd2lkZSBzdHJpbmdzIGluIGFzc2VydGlvbiBtZXNzYWdlcy4KK1RFU1QoQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUZXN0LCBXaWRlU3RyaW5nTWVzc2FnZSkgeworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfVFJVRShmYWxzZSkgPDwgTCJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuXHg4MTE5IjsKKyAgfSwgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgQVNTRVJUX0VRKDEsIDIpIDw8ICJUaGlzIGZhaWx1cmUgaXMgIgorICAgICAgICAgICAgICAgICAgICA8PCBMImV4cGVjdGVkIHRvby5ceDgxMjAiOworICB9LCAiVGhpcyBmYWlsdXJlIGlzIGV4cGVjdGVkIHRvby4iKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBUZXN0cyBFWFBFQ1RfVFJVRS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX1RSVUUpIHsKKyAgRVhQRUNUX1RSVUUodHJ1ZSkgPDwgIkludGVudGlvbmFsIHN1Y2Nlc3MiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRShmYWxzZSkgPDwgIkludGVudGlvbmFsIGZhaWx1cmUgIzEuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUgIzEuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKGZhbHNlKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMi4iKTsKKyAgRVhQRUNUX1RSVUUoMiA+IDEpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKDIgPCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyIDwgMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IGZhbHNlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogdHJ1ZSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfVFJVRSgyID4gMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIyID4gMyIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfVFJVRShwcmVkaWNhdGUpIGZvciBwcmVkaWNhdGVzIHJldHVybmluZyBBc3NlcnRpb25SZXN1bHQuCitURVNUKEV4cGVjdFRlc3QsIEV4cGVjdFRydWVXaXRoQXNzZXJ0aW9uUmVzdWx0KSB7CisgIEVYUEVDVF9UUlVFKFJlc3VsdElzRXZlbigyKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKFJlc3VsdElzRXZlbigzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuKDMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogZmFsc2UgKDMgaXMgb2RkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IHRydWUiKTsKKyAgRVhQRUNUX1RSVUUoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2Y6IFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiBmYWxzZSAoMyBpcyBvZGQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogdHJ1ZSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfRkFMU0Ugd2l0aCBhIHN0cmVhbWVkIG1lc3NhZ2UuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9GQUxTRSkgeworICBFWFBFQ1RfRkFMU0UoMiA8IDEpOyAgLy8gTk9MSU5UCisgIEVYUEVDVF9GQUxTRShmYWxzZSkgPDwgIkludGVudGlvbmFsIHN1Y2Nlc3MiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UodHJ1ZSkgPDwgIkludGVudGlvbmFsIGZhaWx1cmUgIzEuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUgIzEuIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9GQUxTRSh0cnVlKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZSAjMi4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0ZBTFNFKDIgPiAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyID4gMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UoMiA8IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMiA8IDMiKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX0ZBTFNFKHByZWRpY2F0ZSkgZm9yIHByZWRpY2F0ZXMgcmV0dXJuaW5nIEFzc2VydGlvblJlc3VsdC4KK1RFU1QoRXhwZWN0VGVzdCwgRXhwZWN0RmFsc2VXaXRoQXNzZXJ0aW9uUmVzdWx0KSB7CisgIEVYUEVDVF9GQUxTRShSZXN1bHRJc0V2ZW4oMykpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UoUmVzdWx0SXNFdmVuKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBSZXN1bHRJc0V2ZW4oMilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiB0cnVlICgyIGlzIGV2ZW4pXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogZmFsc2UiKTsKKyAgRVhQRUNUX0ZBTFNFKFJlc3VsdElzRXZlbk5vRXhwbGFuYXRpb24oMykpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UoUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogUmVzdWx0SXNFdmVuTm9FeHBsYW5hdGlvbigyKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IHRydWVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBmYWxzZSIpOworfQorCisjaWZkZWYgX19CT1JMQU5EQ19fCisvLyBSZXN0b3JlcyB3YXJuaW5ncyBhZnRlciBwcmV2aW91cyAiI3ByYWdtYSBvcHRpb24gcHVzaCIgc3VwcmVzc2VkIHRoZW0KKyMgcHJhZ21hIG9wdGlvbiBwb3AKKyNlbmRpZgorCisvLyBUZXN0cyBFWFBFQ1RfRVEuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9FUSkgeworICBFWFBFQ1RfRVEoNSwgMiArIDMpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoNSwgMiozKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiAyKjNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQWN0dWFsOiA2XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogNSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoNSwgMiAtIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiMiAtIDMiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgRVhQRUNUX0VRIG9uIGRvdWJsZSB2YWx1ZXMuICBUaGUgcHVycG9zZSBpcyB0byBtYWtlCisvLyBzdXJlIHRoYXQgdGhlIHNwZWNpYWxpemF0aW9uIHdlIGRpZCBmb3IgaW50ZWdlciBhbmQgYW5vbnltb3VzIGVudW1zCisvLyBpc24ndCB1c2VkIGZvciBkb3VibGUgYXJndW1lbnRzLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfRVFfRG91YmxlKSB7CisgIC8vIEEgc3VjY2Vzcy4KKyAgRVhQRUNUX0VRKDUuNiwgNS42KTsKKworICAvLyBBIGZhaWx1cmUuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg1LjEsIDUuMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICI1LjEiKTsKK30KKworI2lmIEdURVNUX0NBTl9DT01QQVJFX05VTEwKKy8vIFRlc3RzIEVYUEVDVF9FUShOVUxMLCBwb2ludGVyKS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0VRX05VTEwpIHsKKyAgLy8gQSBzdWNjZXNzLgorICBjb25zdCBjaGFyKiBwID0gTlVMTDsKKyAgLy8gU29tZSBvbGRlciBHQ0MgdmVyc2lvbnMgbWF5IGlzc3VlIGEgc3B1cmlvdXMgd2FybmluZyBpbiB0aGlzIG9yIHRoZSBuZXh0CisgIC8vIGFzc2VydGlvbiBzdGF0ZW1lbnQuIFRoaXMgd2FybmluZyBzaG91bGQgbm90IGJlIHN1cHByZXNzZWQgd2l0aAorICAvLyBzdGF0aWNfY2FzdCBzaW5jZSB0aGUgdGVzdCB2ZXJpZmllcyB0aGUgYWJpbGl0eSB0byB1c2UgYmFyZSBOVUxMIGFzIHRoZQorICAvLyBleHBlY3RlZCBwYXJhbWV0ZXIgdG8gdGhlIG1hY3JvLgorICBFWFBFQ1RfRVEoTlVMTCwgcCk7CisKKyAgLy8gQSBmYWlsdXJlLgorICBpbnQgbiA9IDA7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShOVUxMLCAmbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogJm5cbiIpOworfQorI2VuZGlmICAvLyBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMCisKKy8vIFRlc3RzIEVYUEVDVF9FUSgwLCBub25fcG9pbnRlcikuICBTaW5jZSB0aGUgbGl0ZXJhbCAwIGNhbiBiZQorLy8gdHJlYXRlZCBhcyBhIG51bGwgcG9pbnRlciBieSB0aGUgY29tcGlsZXIsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisvLyB0aGF0IEVYUEVDVF9FUSgwLCBub25fcG9pbnRlcikgaXNuJ3QgaW50ZXJwcmV0ZWQgYnkgR29vZ2xlIFRlc3QgYXMKKy8vIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx2b2lkKj4oTlVMTCksIG5vbl9wb2ludGVyKS4KK1RFU1QoRXhwZWN0VGVzdCwgRVhQRUNUX0VRXzApIHsKKyAgaW50IG4gPSAwOworCisgIC8vIEEgc3VjY2Vzcy4KKyAgRVhQRUNUX0VRKDAsIG4pOworCisgIC8vIEEgZmFpbHVyZS4KKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDAsIDUuNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogMCIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTkUuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9ORSkgeworICBFWFBFQ1RfTkUoNiwgNyk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FKCdhJywgJ2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoJ2EnKSAhPSAoJ2EnKSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0dWFsOiAnYScgKDk3LCAweDYxKSB2cyAnYScgKDk3LCAweDYxKSIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfTkUoMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIyIik7CisgIGNoYXIqIGNvbnN0IHAwID0gTlVMTDsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FKHAwLCBwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMCIpOworICAvLyBPbmx5IHdheSB0byBnZXQgdGhlIE5va2lhIGNvbXBpbGVyIHRvIGNvbXBpbGUgdGhlIGNhc3QKKyAgLy8gaXMgdG8gaGF2ZSBhIHNlcGFyYXRlIHZvaWQqIHZhcmlhYmxlIGZpcnN0LiBQdXR0aW5nCisgIC8vIHRoZSB0d28gY2FzdHMgb24gdGhlIHNhbWUgbGluZSBkb2Vzbid0IHdvcmssIG5laXRoZXIgZG9lcworICAvLyBhIGRpcmVjdCBDLXN0eWxlIHRvIGNoYXIqLgorICB2b2lkKiBwdjEgPSAodm9pZCopMHgxMjM0OyAgLy8gTk9MSU5UCisgIGNoYXIqIGNvbnN0IHAxID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocHYxKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05FKHAxLCBwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTEUuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9MRSkgeworICBFWFBFQ1RfTEUoMiwgMyk7CisgIEVYUEVDVF9MRSgyLCAyKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xFKDIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA8PSAoMCksIGFjdHVhbDogMiB2cyAwIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MRSgxLjEsIDAuOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoMS4xKSA8PSAoMC45KSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfTFQuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9MVCkgeworICBFWFBFQ1RfTFQoMiwgMyk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MVCgyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPCAoMiksIGFjdHVhbDogMiB2cyAyIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MVCgyLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSA8ICgxKSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfR0UuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9HRSkgeworICBFWFBFQ1RfR0UoMiwgMSk7CisgIEVYUEVDVF9HRSgyLCAyKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0dFKDIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICgyKSA+PSAoMyksIGFjdHVhbDogMiB2cyAzIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HRSgwLjksIDEuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoMC45KSA+PSAoMS4xKSIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfR1QuCitURVNUKEV4cGVjdFRlc3QsIEVYUEVDVF9HVCkgeworICBFWFBFQ1RfR1QoMiwgMSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCgyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAoMikgPiAoMiksIGFjdHVhbDogMiB2cyAyIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCgyLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSA+ICgzKSIpOworfQorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gVGVzdHMgRVhQRUNUX1RIUk9XLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfVEhST1cpIHsKKyAgRVhQRUNUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBib29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiBUaHJvd0FuSW50ZWdlcigpIHRocm93cyBhbiBleGNlcHRpb24gb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSBib29sLlxuICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgKKyAgICAgIEVYUEVDVF9USFJPVyhUaHJvd05vdGhpbmcoKSwgYm9vbCksCisgICAgICAiRXhwZWN0ZWQ6IFRocm93Tm90aGluZygpIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSBib29sLlxuIgorICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3Mgbm90aGluZy4iKTsKK30KKworLy8gVGVzdHMgRVhQRUNUX05PX1RIUk9XLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfTk9fVEhST1cpIHsKKyAgRVhQRUNUX05PX1RIUk9XKFRocm93Tm90aGluZygpKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05PX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IFRocm93QW5JbnRlZ2VyKCkgZG9lc24ndCB0aHJvdyBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24uXG4gIEFjdHVhbDogaXQgdGhyb3dzLiIpOworfQorCisvLyBUZXN0cyBFWFBFQ1RfQU5ZX1RIUk9XLgorVEVTVChFeHBlY3RUZXN0LCBFWFBFQ1RfQU5ZX1RIUk9XKSB7CisgIEVYUEVDVF9BTllfVEhST1coVGhyb3dBbkludGVnZXIoKSk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKAorICAgICAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd05vdGhpbmcoKSksCisgICAgICAiRXhwZWN0ZWQ6IFRocm93Tm90aGluZygpIHRocm93cyBhbiBleGNlcHRpb24uXG4iCisgICAgICAiICBBY3R1YWw6IGl0IGRvZXNuJ3QuIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gTWFrZSBzdXJlIHdlIGRlYWwgd2l0aCB0aGUgcHJlY2VkZW5jZSBvZiA8PC4KK1RFU1QoRXhwZWN0VGVzdCwgRXhwZWN0UHJlY2VkZW5jZSkgeworICBFWFBFQ1RfRVEoMSA8IDIsIHRydWUpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEodHJ1ZSwgdHJ1ZSAmJiBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogdHJ1ZSAmJiBmYWxzZSIpOworfQorCisKKy8vIFRlc3RzIHRoZSBTdHJlYW1hYmxlVG9TdHJpbmcoKSBmdW5jdGlvbi4KKworLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBzY2FsYXIuCitURVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIFNjYWxhcikgeworICBFWFBFQ1RfU1RSRVEoIjUiLCBTdHJlYW1hYmxlVG9TdHJpbmcoNSkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIFN0cmVhbWFibGVUb1N0cmluZygpIG9uIGEgbm9uLWNoYXIgcG9pbnRlci4KK1RFU1QoU3RyZWFtYWJsZVRvU3RyaW5nVGVzdCwgUG9pbnRlcikgeworICBpbnQgbiA9IDA7CisgIGludCogcCA9ICZuOworICBFWFBFQ1RfU1RSTkUoIihudWxsKSIsIFN0cmVhbWFibGVUb1N0cmluZyhwKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBOVUxMIG5vbi1jaGFyIHBvaW50ZXIuCitURVNUKFN0cmVhbWFibGVUb1N0cmluZ1Rlc3QsIE51bGxQb2ludGVyKSB7CisgIGludCogcCA9IE5VTEw7CisgIEVYUEVDVF9TVFJFUSgiKG51bGwpIiwgU3RyZWFtYWJsZVRvU3RyaW5nKHApLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyB1c2luZyBTdHJlYW1hYmxlVG9TdHJpbmcoKSBvbiBhIEMgc3RyaW5nLgorVEVTVChTdHJlYW1hYmxlVG9TdHJpbmdUZXN0LCBDU3RyaW5nKSB7CisgIEVYUEVDVF9TVFJFUSgiRm9vIiwgU3RyZWFtYWJsZVRvU3RyaW5nKCJGb28iKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKCkgb24gYSBOVUxMIEMgc3RyaW5nLgorVEVTVChTdHJlYW1hYmxlVG9TdHJpbmdUZXN0LCBOdWxsQ1N0cmluZykgeworICBjaGFyKiBwID0gTlVMTDsKKyAgRVhQRUNUX1NUUkVRKCIobnVsbCkiLCBTdHJlYW1hYmxlVG9TdHJpbmcocCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHVzaW5nIHN0cmVhbWFibGUgdmFsdWVzIGFzIGFzc2VydGlvbiBtZXNzYWdlcy4KKworLy8gVGVzdHMgdXNpbmcgc3RkOjpzdHJpbmcgYXMgYW4gYXNzZXJ0aW9uIG1lc3NhZ2UuCitURVNUKFN0cmVhbWFibGVUZXN0LCBzdHJpbmcpIHsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cigKKyAgICAgICJUaGlzIGZhaWx1cmUgbWVzc2FnZSBpcyBhIHN0ZDo6c3RyaW5nLCBhbmQgaXMgZXhwZWN0ZWQuIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ci5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gb3V0cHV0IHN0cmluZ3MgY29udGFpbmluZyBlbWJlZGRlZCBOVUxzLgorLy8gTGltaXRlZCB0byBMaW51eCBiZWNhdXNlIHdlIGNhbiBvbmx5IGRvIHRoaXMgd2l0aCBzdGQ6OnN0cmluZydzLgorVEVTVChTdHJlYW1hYmxlVGVzdCwgc3RyaW5nV2l0aEVtYmVkZGVkTlVMKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGNoYXJfYXJyYXlfd2l0aF9udWxbXSA9CisgICAgICAiSGVyZSdzIGEgTlVMXDAgYW5kIHNvbWUgbW9yZSBzdHJpbmciOworICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nX3dpdGhfbnVsKGNoYXJfYXJyYXlfd2l0aF9udWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYXJfYXJyYXlfd2l0aF9udWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxKTsgIC8vIGRyb3BzIHRoZSB0cmFpbGluZyBOVUwKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8IHN0cmluZ193aXRoX251bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkhlcmUncyBhIE5VTFxcMCBhbmQgc29tZSBtb3JlIHN0cmluZyIpOworfQorCisvLyBUZXN0cyB0aGF0IHdlIGNhbiBvdXRwdXQgYSBOVUwgY2hhci4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIE5VTENoYXIpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRkFJTCgpIDw8ICJBIE5VTCIgPDwgJ1wwJyA8PCAiIGFuZCBzb21lIG1vcmUgc3RyaW5nIjsKKyAgfSwgIkEgTlVMXFwwIGFuZCBzb21lIG1vcmUgc3RyaW5nIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIGludCBhcyBhbiBhc3NlcnRpb24gbWVzc2FnZS4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIGludCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgOTAwOTEzLAorICAgICAgICAgICAgICAgICAgICAgICAiOTAwOTEzIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIE5VTEwgY2hhciBwb2ludGVyIGFzIGFuIGFzc2VydGlvbiBtZXNzYWdlLgorLy8KKy8vIEluIE1TVkMsIHN0cmVhbWluZyBhIE5VTEwgY2hhciAqIGNhdXNlcyBhY2Nlc3MgdmlvbGF0aW9uLiAgR29vZ2xlIFRlc3QKKy8vIGltcGxlbWVudGVkIGEgd29ya2Fyb3VuZCAoc3Vic3RpdHV0aW5nICIobnVsbCkiIGZvciBOVUxMKS4gIFRoaXMKKy8vIHRlc3RzIHdoZXRoZXIgdGhlIHdvcmthcm91bmQgd29ya3MuCitURVNUKFN0cmVhbWFibGVUZXN0LCBOdWxsQ2hhclB0cikgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShGQUlMKCkgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAiKG51bGwpIik7Cit9CisKKy8vIFRlc3RzIHRoYXQgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIChlbmRsLCBlbmRzLCBhbmQgZmx1c2gpIGNhbiBiZQorLy8gc3RyZWFtZWQgdG8gdGVzdGluZzo6TWVzc2FnZS4KK1RFU1QoU3RyZWFtYWJsZVRlc3QsIEJhc2ljSW9NYW5pcCkgeworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRSh7ICAvLyBOT0xJTlQKKyAgICBGQUlMKCkgPDwgIkxpbmUgMS4iIDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICA8PCAiQSBOVUwgY2hhciAiIDw8IHN0ZDo6ZW5kcyA8PCBzdGQ6OmZsdXNoIDw8ICIgaW4gbGluZSAyLiI7CisgIH0sICJMaW5lIDEuXG5BIE5VTCBjaGFyIFxcMCBpbiBsaW5lIDIuIik7Cit9CisKKy8vIFRlc3RzIHRoZSBtYWNyb3MgdGhhdCBoYXZlbid0IGJlZW4gY292ZXJlZCBzbyBmYXIuCisKK3ZvaWQgQWRkRmFpbHVyZUhlbHBlcihib29sKiBhYm9ydGVkKSB7CisgICphYm9ydGVkID0gdHJ1ZTsKKyAgQUREX0ZBSUxVUkUoKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZS4iOworICAqYWJvcnRlZCA9IGZhbHNlOworfQorCisvLyBUZXN0cyBBRERfRkFJTFVSRS4KK1RFU1QoTWFjcm9UZXN0LCBBRERfRkFJTFVSRSkgeworICBib29sIGFib3J0ZWQgPSB0cnVlOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBZGRGYWlsdXJlSGVscGVyKCZhYm9ydGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVudGlvbmFsIGZhaWx1cmUuIik7CisgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKK30KKworLy8gVGVzdHMgQUREX0ZBSUxVUkVfQVQuCitURVNUKE1hY3JvVGVzdCwgQUREX0ZBSUxVUkVfQVQpIHsKKyAgLy8gVmVyaWZpZXMgdGhhdCBBRERfRkFJTFVSRV9BVCBkb2VzIGdlbmVyYXRlIGEgbm9uZmF0YWwgZmFpbHVyZSBhbmQKKyAgLy8gdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUgdXNlci1zdHJlYW1lZCBwYXJ0LgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBRERfRkFJTFVSRV9BVCgiZm9vLmNjIiwgNDIpIDw8ICJXcm9uZyEiLCAiV3JvbmchIik7CisKKyAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgdXNlci1zdHJlYW1lZCBwYXJ0IGlzIG9wdGlvbmFsLgorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBRERfRkFJTFVSRV9BVCgiZm9vLmNjIiwgNDIpLCAiRmFpbGVkIik7CisKKyAgLy8gVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IHZlcmlmeSB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMKKyAgLy8gdGhlIHJpZ2h0IGZpbGUgcGF0aCBhbmQgbGluZSBudW1iZXIgdGhlIHNhbWUgd2F5LCBhcworICAvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGRvZXNuJ3QgZ2V0IHRvIHNlZSB0aGUgZmlsZSBwYXRoIGFuZAorICAvLyBsaW5lIG51bWJlci4gIEluc3RlYWQsIHdlIGRvIHRoYXQgaW4gZ3Rlc3Rfb3V0cHV0X3Rlc3RfLmNjLgorfQorCisvLyBUZXN0cyBGQUlMLgorVEVTVChNYWNyb1Rlc3QsIEZBSUwpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEZBSUwoKSA8PCAiSW50ZW50aW9uYWwgZmFpbHVyZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAiSW50ZW50aW9uYWwgZmFpbHVyZS4iKTsKK30KKworLy8gVGVzdHMgU1VDQ0VFRAorVEVTVChNYWNyb1Rlc3QsIFNVQ0NFRUQpIHsKKyAgU1VDQ0VFRCgpOworICBTVUNDRUVEKCkgPDwgIkV4cGxpY2l0IHN1Y2Nlc3MuIjsKK30KKworLy8gVGVzdHMgZm9yIEVYUEVDVF9FUSgpIGFuZCBBU1NFUlRfRVEoKS4KKy8vCisvLyBUaGVzZSB0ZXN0cyBmYWlsICppbnRlbnRpb25hbGx5Kiwgcy50LiB0aGUgZmFpbHVyZSBtZXNzYWdlcyBjYW4gYmUKKy8vIGdlbmVyYXRlZCBhbmQgdGVzdGVkLgorLy8KKy8vIFdlIGhhdmUgZGlmZmVyZW50IHRlc3RzIGZvciBkaWZmZXJlbnQgYXJndW1lbnQgdHlwZXMuCisKKy8vIFRlc3RzIHVzaW5nIGJvb2wgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBCb29sKSB7CisgIEVYUEVDVF9FUSh0cnVlLCAgdHJ1ZSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsKKyAgICAgIGJvb2wgZmFsc2VfdmFsdWUgPSBmYWxzZTsKKyAgICAgIEFTU0VSVF9FUShmYWxzZV92YWx1ZSwgdHJ1ZSk7CisgICAgfSwgIlZhbHVlIG9mOiB0cnVlIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIGludCB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIEludCkgeworICBBU1NFUlRfRVEoMzIsIDMyKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDMyLCAzMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIzMyIpOworfQorCisvLyBUZXN0cyB1c2luZyB0aW1lX3QgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBUaW1lX1QpIHsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHRpbWVfdD4oMCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx0aW1lX3Q+KDApKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0VRKHN0YXRpY19jYXN0PHRpbWVfdD4oMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0aW1lX3Q+KDEyMzQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEyMzQiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgY2hhciB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIENoYXIpIHsKKyAgQVNTRVJUX0VRKCd6JywgJ3onKTsKKyAgY29uc3QgY2hhciBjaCA9ICdiJzsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKCdcMCcsIGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNoIik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSgnYScsIGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNoIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIHdjaGFyX3QgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBXaWRlQ2hhcikgeworICBFWFBFQ1RfRVEoTCdiJywgTCdiJyk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKEwnXDAnLCBMJ3gnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBMJ3gnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFjdHVhbDogTCd4JyAoMTIwLCAweDc4KVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IEwnXDAnXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGljaCBpczogTCdcMCcgKDAsIDB4MCkiKTsKKworICBzdGF0aWMgd2NoYXJfdCB3Y2hhcjsKKyAgd2NoYXIgPSBMJ2InOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoTCdhJywgd2NoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAid2NoYXIiKTsKKyAgd2NoYXIgPSAweDgxMTk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShzdGF0aWNfY2FzdDx3Y2hhcl90PigweDgxMjApLCB3Y2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogd2NoYXIiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgOjpzdGQ6OnN0cmluZyB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIFN0ZFN0cmluZykgeworICAvLyBDb21wYXJlcyBhIGNvbnN0IGNoYXIqIHRvIGFuIHN0ZDo6c3RyaW5nIHRoYXQgaGFzIGlkZW50aWNhbAorICAvLyBjb250ZW50LgorICBBU1NFUlRfRVEoIlRlc3QiLCA6OnN0ZDo6c3RyaW5nKCJUZXN0IikpOworCisgIC8vIENvbXBhcmVzIHR3byBpZGVudGljYWwgc3RkOjpzdHJpbmdzLgorICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIxKCJBICogaW4gdGhlIG1pZGRsZSIpOworICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBzdHIyKHN0cjEpOworICBFWFBFQ1RfRVEoc3RyMSwgc3RyMik7CisKKyAgLy8gQ29tcGFyZXMgYSBjb25zdCBjaGFyKiB0byBhbiBzdGQ6OnN0cmluZyB0aGF0IGhhcyBkaWZmZXJlbnQKKyAgLy8gY29udGVudAorICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoIlRlc3QiLCA6OnN0ZDo6c3RyaW5nKCJ0ZXN0IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJ0ZXN0XCIiKTsKKworICAvLyBDb21wYXJlcyBhbiBzdGQ6OnN0cmluZyB0byBhIGNoYXIqIHRoYXQgaGFzIGRpZmZlcmVudCBjb250ZW50LgorICBjaGFyKiBjb25zdCBwMSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KCJmb28iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKDo6c3RkOjpzdHJpbmcoImJhciIpLCBwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMSIpOworCisgIC8vIENvbXBhcmVzIHR3byBzdGQ6OnN0cmluZ3MgdGhhdCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgb25lIG9mCisgIC8vIHdoaWNoIGhhdmluZyBhIE5VTCBjaGFyYWN0ZXIgaW4gdGhlIG1pZGRsZS4gIFRoaXMgc2hvdWxkIGZhaWwuCisgIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIHN0cjMoc3RyMSk7CisgIHN0cjMuYXQoMikgPSAnXDAnOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoc3RyMSwgc3RyMyksCisgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogc3RyM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAiICBBY3R1YWw6IFwiQSBcXDAgaW4gdGhlIG1pZGRsZVwiIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworLy8gVGVzdHMgdXNpbmcgOjpzdGQ6OndzdHJpbmcgdmFsdWVzIGluIHtFWFBFQ1R8QVNTRVJUfV9FUS4KK1RFU1QoRXFBc3NlcnRpb25UZXN0LCBTdGRXaWRlU3RyaW5nKSB7CisgIC8vIENvbXBhcmVzIHR3byBpZGVudGljYWwgc3RkOjp3c3RyaW5ncy4KKyAgY29uc3QgOjpzdGQ6OndzdHJpbmcgd3N0cjEoTCJBICogaW4gdGhlIG1pZGRsZSIpOworICBjb25zdCA6OnN0ZDo6d3N0cmluZyB3c3RyMih3c3RyMSk7CisgIEFTU0VSVF9FUSh3c3RyMSwgd3N0cjIpOworCisgIC8vIENvbXBhcmVzIGFuIHN0ZDo6d3N0cmluZyB0byBhIGNvbnN0IHdjaGFyX3QqIHRoYXQgaGFzIGlkZW50aWNhbAorICAvLyBjb250ZW50LgorICBjb25zdCB3Y2hhcl90IGtUZXN0WDgxMTlbXSA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAweDgxMTksICdcMCcgfTsKKyAgRVhQRUNUX0VRKDo6c3RkOjp3c3RyaW5nKGtUZXN0WDgxMTkpLCBrVGVzdFg4MTE5KTsKKworICAvLyBDb21wYXJlcyBhbiBzdGQ6OndzdHJpbmcgdG8gYSBjb25zdCB3Y2hhcl90KiB0aGF0IGhhcyBkaWZmZXJlbnQKKyAgLy8gY29udGVudC4KKyAgY29uc3Qgd2NoYXJfdCBrVGVzdFg4MTIwW10gPSB7ICdUJywgJ2UnLCAncycsICd0JywgMHg4MTIwLCAnXDAnIH07CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEVYUEVDVF9FUSg6OnN0ZDo6d3N0cmluZyhrVGVzdFg4MTE5KSwga1Rlc3RYODEyMCk7CisgIH0sICJrVGVzdFg4MTIwIik7CisKKyAgLy8gQ29tcGFyZXMgdHdvIHN0ZDo6d3N0cmluZ3MgdGhhdCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgb25lIG9mCisgIC8vIHdoaWNoIGhhdmluZyBhIE5VTCBjaGFyYWN0ZXIgaW4gdGhlIG1pZGRsZS4KKyAgOjpzdGQ6OndzdHJpbmcgd3N0cjMod3N0cjEpOworICB3c3RyMy5hdCgyKSA9IEwnXDAnOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEod3N0cjEsIHdzdHIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndzdHIzIik7CisKKyAgLy8gQ29tcGFyZXMgYSB3Y2hhcl90KiB0byBhbiBzdGQ6OndzdHJpbmcgdGhhdCBoYXMgZGlmZmVyZW50CisgIC8vIGNvbnRlbnQuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9FUShjb25zdF9jYXN0PHdjaGFyX3QqPihMImZvbyIpLCA6OnN0ZDo6d3N0cmluZyhMImJhciIpKTsKKyAgfSwgIiIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKy8vIFRlc3RzIHVzaW5nIDo6c3RyaW5nIHZhbHVlcyBpbiB7RVhQRUNUfEFTU0VSVH1fRVEuCitURVNUKEVxQXNzZXJ0aW9uVGVzdCwgR2xvYmFsU3RyaW5nKSB7CisgIC8vIENvbXBhcmVzIGEgY29uc3QgY2hhciogdG8gYSA6OnN0cmluZyB0aGF0IGhhcyBpZGVudGljYWwgY29udGVudC4KKyAgRVhQRUNUX0VRKCJUZXN0IiwgOjpzdHJpbmcoIlRlc3QiKSk7CisKKyAgLy8gQ29tcGFyZXMgdHdvIGlkZW50aWNhbCA6OnN0cmluZ3MuCisgIGNvbnN0IDo6c3RyaW5nIHN0cjEoIkEgKiBpbiB0aGUgbWlkZGxlIik7CisgIGNvbnN0IDo6c3RyaW5nIHN0cjIoc3RyMSk7CisgIEFTU0VSVF9FUShzdHIxLCBzdHIyKTsKKworICAvLyBDb21wYXJlcyBhIDo6c3RyaW5nIHRvIGEgY29uc3QgY2hhciogdGhhdCBoYXMgZGlmZmVyZW50IGNvbnRlbnQuCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSg6OnN0cmluZygiVGVzdCIpLCAidGVzdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCIpOworCisgIC8vIENvbXBhcmVzIHR3byA6OnN0cmluZ3MgdGhhdCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgb25lIG9mIHdoaWNoCisgIC8vIGhhdmluZyBhIE5VTCBjaGFyYWN0ZXIgaW4gdGhlIG1pZGRsZS4KKyAgOjpzdHJpbmcgc3RyMyhzdHIxKTsKKyAgc3RyMy5hdCgyKSA9ICdcMCc7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShzdHIxLCBzdHIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cjMiKTsKKworICAvLyBDb21wYXJlcyBhIDo6c3RyaW5nIHRvIGEgY2hhciogdGhhdCBoYXMgZGlmZmVyZW50IGNvbnRlbnQuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHsgIC8vIE5PTElOVAorICAgIEFTU0VSVF9FUSg6OnN0cmluZygiYmFyIiksIGNvbnN0X2Nhc3Q8Y2hhcio+KCJmb28iKSk7CisgIH0sICIiKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIFRlc3RzIHVzaW5nIDo6d3N0cmluZyB2YWx1ZXMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIEdsb2JhbFdpZGVTdHJpbmcpIHsKKyAgLy8gQ29tcGFyZXMgdHdvIGlkZW50aWNhbCA6OndzdHJpbmdzLgorICBzdGF0aWMgY29uc3QgOjp3c3RyaW5nIHdzdHIxKEwiQSAqIGluIHRoZSBtaWRkbGUiKTsKKyAgc3RhdGljIGNvbnN0IDo6d3N0cmluZyB3c3RyMih3c3RyMSk7CisgIEVYUEVDVF9FUSh3c3RyMSwgd3N0cjIpOworCisgIC8vIENvbXBhcmVzIGEgY29uc3Qgd2NoYXJfdCogdG8gYSA6OndzdHJpbmcgdGhhdCBoYXMgaWRlbnRpY2FsIGNvbnRlbnQuCisgIGNvbnN0IHdjaGFyX3Qga1Rlc3RYODExOVtdID0geyAnVCcsICdlJywgJ3MnLCAndCcsIDB4ODExOSwgJ1wwJyB9OworICBBU1NFUlRfRVEoa1Rlc3RYODExOSwgOjp3c3RyaW5nKGtUZXN0WDgxMTkpKTsKKworICAvLyBDb21wYXJlcyBhIGNvbnN0IHdjaGFyX3QqIHRvIGEgOjp3c3RyaW5nIHRoYXQgaGFzIGRpZmZlcmVudAorICAvLyBjb250ZW50LgorICBjb25zdCB3Y2hhcl90IGtUZXN0WDgxMjBbXSA9IHsgJ1QnLCAnZScsICdzJywgJ3QnLCAweDgxMjAsICdcMCcgfTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoeyAgLy8gTk9MSU5UCisgICAgRVhQRUNUX0VRKGtUZXN0WDgxMjAsIDo6d3N0cmluZyhrVGVzdFg4MTE5KSk7CisgIH0sICJUZXN0XFx4ODExOSIpOworCisgIC8vIENvbXBhcmVzIGEgd2NoYXJfdCogdG8gYSA6OndzdHJpbmcgdGhhdCBoYXMgZGlmZmVyZW50IGNvbnRlbnQuCisgIHdjaGFyX3QqIGNvbnN0IHAxID0gY29uc3RfY2FzdDx3Y2hhcl90Kj4oTCJmb28iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAxLCA6OndzdHJpbmcoTCJiYXIiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIiKTsKKworICAvLyBDb21wYXJlcyB0d28gOjp3c3RyaW5ncyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzLCBvbmUgb2Ygd2hpY2gKKyAgLy8gaGF2aW5nIGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgbWlkZGxlLgorICBzdGF0aWMgOjp3c3RyaW5nIHdzdHIzOworICB3c3RyMyA9IHdzdHIxOworICB3c3RyMy5hdCgyKSA9IEwnXDAnOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEod3N0cjEsIHdzdHIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIndzdHIzIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIFRlc3RzIHVzaW5nIGNoYXIgcG9pbnRlcnMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIENoYXJQb2ludGVyKSB7CisgIGNoYXIqIGNvbnN0IHAwID0gTlVMTDsKKyAgLy8gT25seSB3YXkgdG8gZ2V0IHRoZSBOb2tpYSBjb21waWxlciB0byBjb21waWxlIHRoZSBjYXN0CisgIC8vIGlzIHRvIGhhdmUgYSBzZXBhcmF0ZSB2b2lkKiB2YXJpYWJsZSBmaXJzdC4gUHV0dGluZworICAvLyB0aGUgdHdvIGNhc3RzIG9uIHRoZSBzYW1lIGxpbmUgZG9lc24ndCB3b3JrLCBuZWl0aGVyIGRvZXMKKyAgLy8gYSBkaXJlY3QgQy1zdHlsZSB0byBjaGFyKi4KKyAgdm9pZCogcHYxID0gKHZvaWQqKTB4MTIzNDsgIC8vIE5PTElOVAorICB2b2lkKiBwdjIgPSAodm9pZCopMHhBQkMwOyAgLy8gTk9MSU5UCisgIGNoYXIqIGNvbnN0IHAxID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocHYxKTsKKyAgY2hhciogY29uc3QgcDIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwdjIpOworICBBU1NFUlRfRVEocDEsIHAxKTsKKworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDAsIHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mOiBwMiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEocDEsIHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInAyIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShyZWludGVycHJldF9jYXN0PGNoYXIqPigweDEyMzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oMHhBQkMwKSksCisgICAgICAgICAgICAgICAgICAgICAgICJBQkMwIik7Cit9CisKKy8vIFRlc3RzIHVzaW5nIHdjaGFyX3QgcG9pbnRlcnMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIFdpZGVDaGFyUG9pbnRlcikgeworICB3Y2hhcl90KiBjb25zdCBwMCA9IE5VTEw7CisgIC8vIE9ubHkgd2F5IHRvIGdldCB0aGUgTm9raWEgY29tcGlsZXIgdG8gY29tcGlsZSB0aGUgY2FzdAorICAvLyBpcyB0byBoYXZlIGEgc2VwYXJhdGUgdm9pZCogdmFyaWFibGUgZmlyc3QuIFB1dHRpbmcKKyAgLy8gdGhlIHR3byBjYXN0cyBvbiB0aGUgc2FtZSBsaW5lIGRvZXNuJ3Qgd29yaywgbmVpdGhlciBkb2VzCisgIC8vIGEgZGlyZWN0IEMtc3R5bGUgdG8gY2hhciouCisgIHZvaWQqIHB2MSA9ICh2b2lkKikweDEyMzQ7ICAvLyBOT0xJTlQKKyAgdm9pZCogcHYyID0gKHZvaWQqKTB4QUJDMDsgIC8vIE5PTElOVAorICB3Y2hhcl90KiBjb25zdCBwMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8d2NoYXJfdCo+KHB2MSk7CisgIHdjaGFyX3QqIGNvbnN0IHAyID0gcmVpbnRlcnByZXRfY2FzdDx3Y2hhcl90Kj4ocHYyKTsKKyAgRVhQRUNUX0VRKHAwLCBwMCk7CisKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAwLCBwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZjogcDIiKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0VRKHAxLCBwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwMiIpOworICB2b2lkKiBwdjMgPSAodm9pZCopMHgxMjM0OyAgLy8gTk9MSU5UCisgIHZvaWQqIHB2NCA9ICh2b2lkKikweEFCQzA7ICAvLyBOT0xJTlQKKyAgY29uc3Qgd2NoYXJfdCogcDMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHdjaGFyX3QqPihwdjMpOworICBjb25zdCB3Y2hhcl90KiBwNCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KHB2NCk7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUShwMywgcDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicDQiKTsKK30KKworLy8gVGVzdHMgdXNpbmcgb3RoZXIgdHlwZXMgb2YgcG9pbnRlcnMgaW4ge0VYUEVDVHxBU1NFUlR9X0VRLgorVEVTVChFcUFzc2VydGlvblRlc3QsIE90aGVyUG9pbnRlcikgeworICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8Y29uc3QgaW50Kj4oTlVMTCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBpbnQqPihOVUxMKSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9FUShzdGF0aWNfY2FzdDxjb25zdCBpbnQqPihOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50Kj4oMHgxMjM0KSksCisgICAgICAgICAgICAgICAgICAgICAgICIweDEyMzQiKTsKK30KKworLy8gQSBjbGFzcyB0aGF0IHN1cHBvcnRzIGJpbmFyeSBjb21wYXJpc29uIG9wZXJhdG9ycyBidXQgbm90IHN0cmVhbWluZy4KK2NsYXNzIFVucHJpbnRhYmxlQ2hhciB7CisgcHVibGljOgorICBleHBsaWNpdCBVbnByaW50YWJsZUNoYXIoY2hhciBjaCkgOiBjaGFyXyhjaCkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gPT0gcmhzLmNoYXJfOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgeworICAgIHJldHVybiBjaGFyXyAhPSByaHMuY2hhcl87CisgIH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gPCByaHMuY2hhcl87CisgIH0KKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFVucHJpbnRhYmxlQ2hhciYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNoYXJfIDw9IHJocy5jaGFyXzsKKyAgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBVbnByaW50YWJsZUNoYXImIHJocykgY29uc3QgeworICAgIHJldHVybiBjaGFyXyA+IHJocy5jaGFyXzsKKyAgfQorICBib29sIG9wZXJhdG9yPj0oY29uc3QgVW5wcmludGFibGVDaGFyJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhcl8gPj0gcmhzLmNoYXJfOworICB9CisKKyBwcml2YXRlOgorICBjaGFyIGNoYXJfOworfTsKKworLy8gVGVzdHMgdGhhdCBBU1NFUlRfRVEoKSBhbmQgZnJpZW5kcyBkb24ndCByZXF1aXJlIHRoZSBhcmd1bWVudHMgdG8KKy8vIGJlIHByaW50YWJsZS4KK1RFU1QoQ29tcGFyaXNvbkFzc2VydGlvblRlc3QsIEFjY2VwdHNVbnByaW50YWJsZUFyZ3MpIHsKKyAgY29uc3QgVW5wcmludGFibGVDaGFyIHgoJ3gnKSwgeSgneScpOworICBBU1NFUlRfRVEoeCwgeCk7CisgIEVYUEVDVF9ORSh4LCB5KTsKKyAgQVNTRVJUX0xUKHgsIHkpOworICBFWFBFQ1RfTEUoeCwgeSk7CisgIEFTU0VSVF9HVCh5LCB4KTsKKyAgRVhQRUNUX0dFKHgsIHgpOworCisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9FUSh4LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoeCwgeSksICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0xUKHksIHkpLCAiMS1ieXRlIG9iamVjdCA8Nzk+Iik7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9HVCh4LCB5KSwgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfR1QoeCwgeSksICIxLWJ5dGUgb2JqZWN0IDw3OT4iKTsKKworICAvLyBDb2RlIHRlc3RlZCBieSBFWFBFQ1RfRkFUQUxfRkFJTFVSRSBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsCisgIC8vIHZhcmlhYmxlcywgc28gd2UgaGF2ZSB0byB3cml0ZSBVbnByaW50YWJsZUNoYXIoJ3gnKSBpbnN0ZWFkIG9mIHguCisjaWZuZGVmIF9fQk9STEFORENfXworICAvLyBJQ0UncyBpbiBDKytCdWlsZGVyLgorICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTkUoVW5wcmludGFibGVDaGFyKCd4JyksIFVucHJpbnRhYmxlQ2hhcigneCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfTEUoVW5wcmludGFibGVDaGFyKCd5JyksIFVucHJpbnRhYmxlQ2hhcigneCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEtYnl0ZSBvYmplY3QgPDc4PiIpOworI2VuZGlmCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9MRShVbnByaW50YWJsZUNoYXIoJ3knKSwgVW5wcmludGFibGVDaGFyKCd4JykpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzk+Iik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9HRShVbnByaW50YWJsZUNoYXIoJ3gnKSwgVW5wcmludGFibGVDaGFyKCd5JykpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzg+Iik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9HRShVbnByaW50YWJsZUNoYXIoJ3gnKSwgVW5wcmludGFibGVDaGFyKCd5JykpLAorICAgICAgICAgICAgICAgICAgICAgICAiMS1ieXRlIG9iamVjdCA8Nzk+Iik7Cit9CisKKy8vIFRlc3RzIHRoZSBGUklFTkRfVEVTVCBtYWNyby4KKworLy8gVGhpcyBjbGFzcyBoYXMgYSBwcml2YXRlIG1lbWJlciB3ZSB3YW50IHRvIHRlc3QuICBXZSB3aWxsIHRlc3QgaXQKKy8vIGJvdGggaW4gYSBURVNUIGFuZCBpbiBhIFRFU1RfRi4KK2NsYXNzIEZvbyB7CisgcHVibGljOgorICBGb28oKSB7fQorCisgcHJpdmF0ZToKKyAgaW50IEJhcigpIGNvbnN0IHsgcmV0dXJuIDE7IH0KKworICAvLyBEZWNsYXJlcyB0aGUgZnJpZW5kIHRlc3RzIHRoYXQgY2FuIGFjY2VzcyB0aGUgcHJpdmF0ZSBtZW1iZXIKKyAgLy8gQmFyKCkuCisgIEZSSUVORF9URVNUKEZSSUVORF9URVNUX1Rlc3QsIFRFU1QpOworICBGUklFTkRfVEVTVChGUklFTkRfVEVTVF9UZXN0MiwgVEVTVF9GKTsKK307CisKKy8vIFRlc3RzIHRoYXQgdGhlIEZSSUVORF9URVNUIGRlY2xhcmF0aW9uIGFsbG93cyBhIFRFU1QgdG8gYWNjZXNzIGEKKy8vIGNsYXNzJ3MgcHJpdmF0ZSBtZW1iZXJzLiAgVGhpcyBzaG91bGQgY29tcGlsZS4KK1RFU1QoRlJJRU5EX1RFU1RfVGVzdCwgVEVTVCkgeworICBBU1NFUlRfRVEoMSwgRm9vKCkuQmFyKCkpOworfQorCisvLyBUaGUgZml4dHVyZSBuZWVkZWQgdG8gdGVzdCB1c2luZyBGUklFTkRfVEVTVCB3aXRoIFRFU1RfRi4KK2NsYXNzIEZSSUVORF9URVNUX1Rlc3QyIDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgRm9vIGZvbzsKK307CisKKy8vIFRlc3RzIHRoYXQgdGhlIEZSSUVORF9URVNUIGRlY2xhcmF0aW9uIGFsbG93cyBhIFRFU1RfRiB0byBhY2Nlc3MgYQorLy8gY2xhc3MncyBwcml2YXRlIG1lbWJlcnMuICBUaGlzIHNob3VsZCBjb21waWxlLgorVEVTVF9GKEZSSUVORF9URVNUX1Rlc3QyLCBURVNUX0YpIHsKKyAgQVNTRVJUX0VRKDEsIGZvby5CYXIoKSk7Cit9CisKKy8vIFRlc3RzIHRoZSBsaWZlIGN5Y2xlIG9mIFRlc3Qgb2JqZWN0cy4KKworLy8gVGhlIHRlc3QgZml4dHVyZSBmb3IgdGVzdGluZyB0aGUgbGlmZSBjeWNsZSBvZiBUZXN0IG9iamVjdHMuCisvLworLy8gVGhpcyBjbGFzcyBjb3VudHMgdGhlIG51bWJlciBvZiBsaXZlIHRlc3Qgb2JqZWN0cyB0aGF0IHVzZXMgdGhpcworLy8gZml4dHVyZS4KK2NsYXNzIFRlc3RMaWZlQ3ljbGVUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gQ29uc3RydWN0b3IuICBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgdGVzdCBvYmplY3RzIHRoYXQgdXNlcworICAvLyB0aGlzIGZpeHR1cmUuCisgIFRlc3RMaWZlQ3ljbGVUZXN0KCkgeyBjb3VudF8rKzsgfQorCisgIC8vIERlc3RydWN0b3IuICBEZWNyZW1lbnRzIHRoZSBudW1iZXIgb2YgdGVzdCBvYmplY3RzIHRoYXQgdXNlcyB0aGlzCisgIC8vIGZpeHR1cmUuCisgIH5UZXN0TGlmZUN5Y2xlVGVzdCgpIHsgY291bnRfLS07IH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGl2ZSB0ZXN0IG9iamVjdHMgdGhhdCB1c2VzIHRoaXMgZml4dHVyZS4KKyAgaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gY291bnRfOyB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IGNvdW50XzsKK307CisKK2ludCBUZXN0TGlmZUN5Y2xlVGVzdDo6Y291bnRfID0gMDsKKworLy8gVGVzdHMgdGhlIGxpZmUgY3ljbGUgb2YgdGVzdCBvYmplY3RzLgorVEVTVF9GKFRlc3RMaWZlQ3ljbGVUZXN0LCBUZXN0MSkgeworICAvLyBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgdGVzdCBvYmplY3QgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCdzCisgIC8vIGN1cnJlbnRseSBhbGl2ZS4KKyAgQVNTRVJUX0VRKDEsIGNvdW50KCkpOworfQorCisvLyBUZXN0cyB0aGUgbGlmZSBjeWNsZSBvZiB0ZXN0IG9iamVjdHMuCitURVNUX0YoVGVzdExpZmVDeWNsZVRlc3QsIFRlc3QyKSB7CisgIC8vIEFmdGVyIFRlc3QxIGlzIGRvbmUgYW5kIFRlc3QyIGlzIHN0YXJ0ZWQsIHRoZXJlIHNob3VsZCBzdGlsbCBiZQorICAvLyBvbmx5IG9uZSBsaXZlIHRlc3Qgb2JqZWN0LCBhcyB0aGUgb2JqZWN0IGZvciBUZXN0MSBzaG91bGQndmUgYmVlbgorICAvLyBkZWxldGVkLgorICBBU1NFUlRfRVEoMSwgY291bnQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBUZXN0cyB0aGF0IHRoZSBjb3B5IGNvbnN0cnVjdG9yIHdvcmtzIHdoZW4gaXQgaXMgTk9UIG9wdGltaXplZCBhd2F5IGJ5CisvLyB0aGUgY29tcGlsZXIuCitURVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIENvcHlDb25zdHJ1Y3RvcldvcmtzV2hlbk5vdE9wdGltaWVkKSB7CisgIC8vIENoZWNrcyB0aGF0IHRoZSBjb3B5IGNvbnN0cnVjdG9yIGRvZXNuJ3QgdHJ5IHRvIGRlcmVmZXJlbmNlIE5VTEwgcG9pbnRlcnMKKyAgLy8gaW4gdGhlIHNvdXJjZSBvYmplY3QuCisgIEFzc2VydGlvblJlc3VsdCByMSA9IEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgQXNzZXJ0aW9uUmVzdWx0IHIyID0gcjE7CisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhZGRlZCB0byBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcKKyAgLy8gYXdheSB0aGUgY29uc3RydWN0b3IgY2FsbC4KKyAgcjEgPDwgImFiYyI7CisKKyAgQXNzZXJ0aW9uUmVzdWx0IHIzID0gcjE7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxib29sPihyMyksIHN0YXRpY19jYXN0PGJvb2w+KHIxKSk7CisgIEVYUEVDVF9TVFJFUSgiYWJjIiwgcjEubWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCBBc3NlcnRpb25TdWNjZXNzIGFuZCBBc3NlcnRpb25GYWlsdXJlIGNvbnN0cnVjdAorLy8gQXNzZXJ0aW9uUmVzdWx0IG9iamVjdHMgYXMgZXhwZWN0ZWQuCitURVNUKEFzc2VydGlvblJlc3VsdFRlc3QsIENvbnN0cnVjdGlvbldvcmtzKSB7CisgIEFzc2VydGlvblJlc3VsdCByMSA9IEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgRVhQRUNUX1RSVUUocjEpOworICBFWFBFQ1RfU1RSRVEoIiIsIHIxLm1lc3NhZ2UoKSk7CisKKyAgQXNzZXJ0aW9uUmVzdWx0IHIyID0gQXNzZXJ0aW9uU3VjY2VzcygpIDw8ICJhYmMiOworICBFWFBFQ1RfVFJVRShyMik7CisgIEVYUEVDVF9TVFJFUSgiYWJjIiwgcjIubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjMgPSBBc3NlcnRpb25GYWlsdXJlKCk7CisgIEVYUEVDVF9GQUxTRShyMyk7CisgIEVYUEVDVF9TVFJFUSgiIiwgcjMubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjQgPSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgImRlZiI7CisgIEVYUEVDVF9GQUxTRShyNCk7CisgIEVYUEVDVF9TVFJFUSgiZGVmIiwgcjQubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjUgPSBBc3NlcnRpb25GYWlsdXJlKE1lc3NhZ2UoKSA8PCAiZ2hpIik7CisgIEVYUEVDVF9GQUxTRShyNSk7CisgIEVYUEVDVF9TVFJFUSgiZ2hpIiwgcjUubWVzc2FnZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgbmVnYXRpb24gZmxpcHMgdGhlIHByZWRpY2F0ZSByZXN1bHQgYnV0IGtlZXBzIHRoZSBtZXNzYWdlLgorVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBOZWdhdGlvbldvcmtzKSB7CisgIEFzc2VydGlvblJlc3VsdCByMSA9IEFzc2VydGlvblN1Y2Nlc3MoKSA8PCAiYWJjIjsKKyAgRVhQRUNUX0ZBTFNFKCFyMSk7CisgIEVYUEVDVF9TVFJFUSgiYWJjIiwgKCFyMSkubWVzc2FnZSgpKTsKKworICBBc3NlcnRpb25SZXN1bHQgcjIgPSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgImRlZiI7CisgIEVYUEVDVF9UUlVFKCFyMik7CisgIEVYUEVDVF9TVFJFUSgiZGVmIiwgKCFyMikubWVzc2FnZSgpKTsKK30KKworVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBTdHJlYW1pbmdXb3JrcykgeworICBBc3NlcnRpb25SZXN1bHQgciA9IEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgciA8PCAiYWJjIiA8PCAnZCcgPDwgMCA8PCB0cnVlOworICBFWFBFQ1RfU1RSRVEoImFiY2QwdHJ1ZSIsIHIubWVzc2FnZSgpKTsKK30KKworVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBDYW5TdHJlYW1Pc3RyZWFtTWFuaXB1bGF0b3JzKSB7CisgIEFzc2VydGlvblJlc3VsdCByID0gQXNzZXJ0aW9uU3VjY2VzcygpOworICByIDw8ICJEYXRhIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjpmbHVzaCA8PCBzdGQ6OmVuZHMgPDwgIldpbGwgYmUgdmlzaWJsZSI7CisgIEVYUEVDVF9TVFJFUSgiRGF0YVxuXFwwV2lsbCBiZSB2aXNpYmxlIiwgci5tZXNzYWdlKCkpOworfQorCisvLyBUaGUgbmV4dCB0ZXN0IHVzZXMgZXhwbGljaXQgY29udmVyc2lvbiBvcGVyYXRvcnMgLS0gYSBDKysxMSBmZWF0dXJlLgorI2lmIEdURVNUX0xBTkdfQ1hYMTEKKworVEVTVChBc3NlcnRpb25SZXN1bHRUZXN0LCBDb25zdHJ1Y3RpYmxlRnJvbUNvbnRleHR1YWxseUNvbnZlcnRpYmxlVG9Cb29sKSB7CisgIHN0cnVjdCBFeHBsaWNpdGx5Q29udmVydGlibGVUb0Jvb2wgeworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQorICAgIGJvb2wgdmFsdWU7CisgIH07CisgIEV4cGxpY2l0bHlDb252ZXJ0aWJsZVRvQm9vbCB2MSA9IHtmYWxzZX07CisgIEV4cGxpY2l0bHlDb252ZXJ0aWJsZVRvQm9vbCB2MiA9IHt0cnVlfTsKKyAgRVhQRUNUX0ZBTFNFKHYxKTsKKyAgRVhQRUNUX1RSVUUodjIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKKworc3RydWN0IENvbnZlcnRpYmxlVG9Bc3NlcnRpb25SZXN1bHQgeworICBvcGVyYXRvciBBc3NlcnRpb25SZXN1bHQoKSBjb25zdCB7IHJldHVybiBBc3NlcnRpb25SZXN1bHQodHJ1ZSk7IH0KK307CisKK1RFU1QoQXNzZXJ0aW9uUmVzdWx0VGVzdCwgQ29uc3RydWN0aWJsZUZyb21JbXBsaWNpdGx5Q29udmVydGlibGUpIHsKKyAgQ29udmVydGlibGVUb0Fzc2VydGlvblJlc3VsdCBvYmo7CisgIEVYUEVDVF9UUlVFKG9iaik7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIHVzZXIgdHlwZSB3aG9zZSBkZWZpbml0aW9uIGFuZCBvcGVyYXRvciA8PCBhcmUKKy8vIGJvdGggaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitjbGFzcyBCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEJhc2UoaW50IGFuX3gpIDogeF8oYW5feCkge30KKyAgaW50IHgoKSBjb25zdCB7IHJldHVybiB4XzsgfQorIHByaXZhdGU6CisgIGludCB4XzsKK307CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNlJiB2YWwpIHsKKyAgcmV0dXJuIG9zIDw8IHZhbC54KCk7Cit9CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNlKiBwb2ludGVyKSB7CisgIHJldHVybiBvcyA8PCAiKCIgPDwgcG9pbnRlci0+eCgpIDw8ICIpIjsKK30KKworVEVTVChNZXNzYWdlVGVzdCwgQ2FuU3RyZWFtVXNlclR5cGVJbkdsb2JhbE5hbWVTcGFjZSkgeworICBNZXNzYWdlIG1zZzsKKyAgQmFzZSBhKDEpOworCisgIG1zZyA8PCBhIDw8ICZhOyAgLy8gVXNlcyA6Om9wZXJhdG9yPDwuCisgIEVYUEVDVF9TVFJFUSgiMSgxKSIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIGEgdXNlciB0eXBlIHdob3NlIGRlZmluaXRpb24gYW5kIG9wZXJhdG9yPDwgYXJlCisvLyBib3RoIGluIGFuIHVubmFtZWQgbmFtZXNwYWNlLgorbmFtZXNwYWNlIHsKK2NsYXNzIE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZSA6IHB1YmxpYyBCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZShpbnQgYW5feCk6IEJhc2UoYW5feCkge30KK307CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNeVR5cGVJblVubmFtZWROYW1lU3BhY2UmIHZhbCkgeworICByZXR1cm4gb3MgPDwgdmFsLngoKTsKK30KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZSogcG9pbnRlcikgeworICByZXR1cm4gb3MgPDwgIigiIDw8IHBvaW50ZXItPngoKSA8PCAiKSI7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChNZXNzYWdlVGVzdCwgQ2FuU3RyZWFtVXNlclR5cGVJblVubmFtZWROYW1lU3BhY2UpIHsKKyAgTWVzc2FnZSBtc2c7CisgIE15VHlwZUluVW5uYW1lZE5hbWVTcGFjZSBhKDEpOworCisgIG1zZyA8PCBhIDw8ICZhOyAgLy8gVXNlcyA8dW5uYW1lZF9uYW1lc3BhY2U+OjpvcGVyYXRvcjw8LgorICBFWFBFQ1RfU1RSRVEoIjEoMSkiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyBhIHVzZXIgdHlwZSB3aG9zZSBkZWZpbml0aW9uIGFuZCBvcGVyYXRvcjw8IGFyZQorLy8gYm90aCBpbiBhIHVzZXIgbmFtZXNwYWNlLgorbmFtZXNwYWNlIG5hbWVzcGFjZTEgeworY2xhc3MgTXlUeXBlSW5OYW1lU3BhY2UxIDogcHVibGljIEJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTXlUeXBlSW5OYW1lU3BhY2UxKGludCBhbl94KTogQmFzZShhbl94KSB7fQorfTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE15VHlwZUluTmFtZVNwYWNlMSYgdmFsKSB7CisgIHJldHVybiBvcyA8PCB2YWwueCgpOworfQorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXlUeXBlSW5OYW1lU3BhY2UxKiBwb2ludGVyKSB7CisgIHJldHVybiBvcyA8PCAiKCIgPDwgcG9pbnRlci0+eCgpIDw8ICIpIjsKK30KK30gIC8vIG5hbWVzcGFjZSBuYW1lc3BhY2UxCisKK1RFU1QoTWVzc2FnZVRlc3QsIENhblN0cmVhbVVzZXJUeXBlSW5Vc2VyTmFtZVNwYWNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBuYW1lc3BhY2UxOjpNeVR5cGVJbk5hbWVTcGFjZTEgYSgxKTsKKworICBtc2cgPDwgYSA8PCAmYTsgIC8vIFVzZXMgbmFtZXNwYWNlMTo6b3BlcmF0b3I8PC4KKyAgRVhQRUNUX1NUUkVRKCIxKDEpIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworfQorCisvLyBUZXN0cyBzdHJlYW1pbmcgYSB1c2VyIHR5cGUgd2hvc2UgZGVmaW5pdGlvbiBpcyBpbiBhIHVzZXIgbmFtZXNwYWNlCisvLyBidXQgd2hvc2Ugb3BlcmF0b3I8PCBpcyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK25hbWVzcGFjZSBuYW1lc3BhY2UyIHsKK2NsYXNzIE15VHlwZUluTmFtZVNwYWNlMiA6IHB1YmxpYyA6OkJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTXlUeXBlSW5OYW1lU3BhY2UyKGludCBhbl94KTogQmFzZShhbl94KSB7fQorfTsKK30gIC8vIG5hbWVzcGFjZSBuYW1lc3BhY2UyCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lc3BhY2UyOjpNeVR5cGVJbk5hbWVTcGFjZTImIHZhbCkgeworICByZXR1cm4gb3MgPDwgdmFsLngoKTsKK30KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZTI6Ok15VHlwZUluTmFtZVNwYWNlMiogcG9pbnRlcikgeworICByZXR1cm4gb3MgPDwgIigiIDw8IHBvaW50ZXItPngoKSA8PCAiKSI7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIENhblN0cmVhbVVzZXJUeXBlSW5Vc2VyTmFtZVNwYWNlV2l0aFN0cmVhbU9wZXJhdG9ySW5HbG9iYWwpIHsKKyAgTWVzc2FnZSBtc2c7CisgIG5hbWVzcGFjZTI6Ok15VHlwZUluTmFtZVNwYWNlMiBhKDEpOworCisgIG1zZyA8PCBhIDw8ICZhOyAgLy8gVXNlcyA6Om9wZXJhdG9yPDwuCisgIEVYUEVDVF9TVFJFUSgiMSgxKSIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworLy8gVGVzdHMgc3RyZWFtaW5nIE5VTEwgcG9pbnRlcnMgdG8gdGVzdGluZzo6TWVzc2FnZS4KK1RFU1QoTWVzc2FnZVRlc3QsIE51bGxQb2ludGVycykgeworICBNZXNzYWdlIG1zZzsKKyAgY2hhciogY29uc3QgcDEgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyKiBjb25zdCBwMiA9IE5VTEw7CisgIGludCogcDMgPSBOVUxMOworICBkb3VibGUqIHA0ID0gTlVMTDsKKyAgYm9vbCogcDUgPSBOVUxMOworICBNZXNzYWdlKiBwNiA9IE5VTEw7CisKKyAgbXNnIDw8IHAxIDw8IHAyIDw8IHAzIDw8IHA0IDw8IHA1IDw8IHA2OworICBBU1NFUlRfU1RSRVEoIihudWxsKShudWxsKShudWxsKShudWxsKShudWxsKShudWxsKSIsCisgICAgICAgICAgICAgICBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHN0cmVhbWluZyB3aWRlIHN0cmluZ3MgdG8gdGVzdGluZzo6TWVzc2FnZS4KK1RFU1QoTWVzc2FnZVRlc3QsIFdpZGVTdHJpbmdzKSB7CisgIC8vIFN0cmVhbXMgYSBOVUxMIG9mIHR5cGUgY29uc3Qgd2NoYXJfdCouCisgIGNvbnN0IHdjaGFyX3QqIGNvbnN0X3dzdHIgPSBOVUxMOworICBFWFBFQ1RfU1RSRVEoIihudWxsKSIsCisgICAgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGNvbnN0X3dzdHIpLkdldFN0cmluZygpLmNfc3RyKCkpOworCisgIC8vIFN0cmVhbXMgYSBOVUxMIG9mIHR5cGUgd2NoYXJfdCouCisgIHdjaGFyX3QqIHdzdHIgPSBOVUxMOworICBFWFBFQ1RfU1RSRVEoIihudWxsKSIsCisgICAgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IHdzdHIpLkdldFN0cmluZygpLmNfc3RyKCkpOworCisgIC8vIFN0cmVhbXMgYSBub24tTlVMTCBvZiB0eXBlIGNvbnN0IHdjaGFyX3QqLgorICBjb25zdF93c3RyID0gTCJhYmNceDgxMTkiOworICBFWFBFQ1RfU1RSRVEoImFiY1x4ZThceDg0XHg5OSIsCisgICAgICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGNvbnN0X3dzdHIpLkdldFN0cmluZygpLmNfc3RyKCkpOworCisgIC8vIFN0cmVhbXMgYSBub24tTlVMTCBvZiB0eXBlIHdjaGFyX3QqLgorICB3c3RyID0gY29uc3RfY2FzdDx3Y2hhcl90Kj4oY29uc3Rfd3N0cik7CisgIEVYUEVDVF9TVFJFUSgiYWJjXHhlOFx4ODRceDk5IiwKKyAgICAgICAgICAgICAgIChNZXNzYWdlKCkgPDwgd3N0cikuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKworLy8gVGhpcyBsaW5lIHRlc3RzIHRoYXQgd2UgY2FuIGRlZmluZSB0ZXN0cyBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2UuCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRlc3RzIHRoZSBUZXN0SW5mbyBjbGFzcy4KKworY2xhc3MgVGVzdEluZm9UZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IFRlc3RJbmZvKiBHZXRUZXN0SW5mbyhjb25zdCBjaGFyKiB0ZXN0X25hbWUpIHsKKyAgICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gR2V0VW5pdFRlc3RJbXBsKCktPgorICAgICAgICBHZXRUZXN0Q2FzZSgiVGVzdEluZm9UZXN0IiwgIiIsIE5VTEwsIE5VTEwpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0X2Nhc2UtPnRvdGFsX3Rlc3RfY291bnQoKTsgKytpKSB7CisgICAgICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gdGVzdF9jYXNlLT5HZXRUZXN0SW5mbyhpKTsKKyAgICAgIGlmIChzdHJjbXAodGVzdF9uYW1lLCB0ZXN0X2luZm8tPm5hbWUoKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRlc3RfaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzdGF0aWMgY29uc3QgVGVzdFJlc3VsdCogR2V0VGVzdFJlc3VsdCgKKyAgICAgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5yZXN1bHQoKTsKKyAgfQorfTsKKworLy8gVGVzdHMgVGVzdEluZm86OnRlc3RfY2FzZV9uYW1lKCkgYW5kIFRlc3RJbmZvOjpuYW1lKCkuCitURVNUX0YoVGVzdEluZm9UZXN0LCBOYW1lcykgeworICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gR2V0VGVzdEluZm8oIk5hbWVzIik7CisKKyAgQVNTRVJUX1NUUkVRKCJUZXN0SW5mb1Rlc3QiLCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkpOworICBBU1NFUlRfU1RSRVEoIk5hbWVzIiwgdGVzdF9pbmZvLT5uYW1lKCkpOworfQorCisvLyBUZXN0cyBUZXN0SW5mbzo6cmVzdWx0KCkuCitURVNUX0YoVGVzdEluZm9UZXN0LCByZXN1bHQpIHsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IEdldFRlc3RJbmZvKCJyZXN1bHQiKTsKKworICAvLyBJbml0aWFsbHksIHRoZXJlIGlzIG5vIFRlc3RQYXJ0UmVzdWx0IGZvciB0aGlzIHRlc3QuCisgIEFTU0VSVF9FUSgwLCBHZXRUZXN0UmVzdWx0KHRlc3RfaW5mbyktPnRvdGFsX3BhcnRfY291bnQoKSk7CisKKyAgLy8gQWZ0ZXIgdGhlIHByZXZpb3VzIGFzc2VydGlvbiwgdGhlcmUgaXMgc3RpbGwgbm9uZS4KKyAgQVNTRVJUX0VRKDAsIEdldFRlc3RSZXN1bHQodGVzdF9pbmZvKS0+dG90YWxfcGFydF9jb3VudCgpKTsKK30KKworI2RlZmluZSBWRVJJRllfQ09ERV9MT0NBVElPTiBcCisgIGNvbnN0IGludCBleHBlY3RlZF9saW5lID0gX19MSU5FX18gLSAxOyBcCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsgXAorICBBU1NFUlRfVFJVRSh0ZXN0X2luZm8pOyBcCisgIEVYUEVDVF9TVFJFUShfX0ZJTEVfXywgdGVzdF9pbmZvLT5maWxlKCkpOyBcCisgIEVYUEVDVF9FUShleHBlY3RlZF9saW5lLCB0ZXN0X2luZm8tPmxpbmUoKSkKKworVEVTVChDb2RlTG9jYXRpb25Gb3JURVNULCBWZXJpZnkpIHsKKyAgVkVSSUZZX0NPREVfTE9DQVRJT047Cit9CisKK2NsYXNzIENvZGVMb2NhdGlvbkZvclRFU1RGIDogcHVibGljIFRlc3QgeworfTsKKworVEVTVF9GKENvZGVMb2NhdGlvbkZvclRFU1RGLCBWZXJpZnkpIHsKKyAgVkVSSUZZX0NPREVfTE9DQVRJT047Cit9CisKK2NsYXNzIENvZGVMb2NhdGlvbkZvclRFU1RQIDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7Cit9OworCitURVNUX1AoQ29kZUxvY2F0aW9uRm9yVEVTVFAsIFZlcmlmeSkgeworICBWRVJJRllfQ09ERV9MT0NBVElPTjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoLCBDb2RlTG9jYXRpb25Gb3JURVNUUCwgVmFsdWVzKDApKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDb2RlTG9jYXRpb25Gb3JUWVBFRFRFU1QgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0UoQ29kZUxvY2F0aW9uRm9yVFlQRURURVNULCBpbnQpOworCitUWVBFRF9URVNUKENvZGVMb2NhdGlvbkZvclRZUEVEVEVTVCwgVmVyaWZ5KSB7CisgIFZFUklGWV9DT0RFX0xPQ0FUSU9OOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIENvZGVMb2NhdGlvbkZvclRZUEVEVEVTVFAgOiBwdWJsaWMgVGVzdCB7Cit9OworCitUWVBFRF9URVNUX0NBU0VfUChDb2RlTG9jYXRpb25Gb3JUWVBFRFRFU1RQKTsKKworVFlQRURfVEVTVF9QKENvZGVMb2NhdGlvbkZvclRZUEVEVEVTVFAsIFZlcmlmeSkgeworICBWRVJJRllfQ09ERV9MT0NBVElPTjsKK30KKworUkVHSVNURVJfVFlQRURfVEVTVF9DQVNFX1AoQ29kZUxvY2F0aW9uRm9yVFlQRURURVNUUCwgVmVyaWZ5KTsKKworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIENvZGVMb2NhdGlvbkZvclRZUEVEVEVTVFAsIGludCk7CisKKyN1bmRlZiBWRVJJRllfQ09ERV9MT0NBVElPTgorCisvLyBUZXN0cyBzZXR0aW5nIHVwIGFuZCB0ZWFyaW5nIGRvd24gYSB0ZXN0IGNhc2UuCisKK2NsYXNzIFNldFVwVGVzdENhc2VUZXN0IDogcHVibGljIFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZQorICAvLyBpcyBydW4uCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCJTZXR0aW5nIHVwIHRoZSB0ZXN0IGNhc2UgLiAuIC5cbiIpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgc29tZSBzaGFyZWQgcmVzb3VyY2UuICBJbiB0aGlzIHNpbXBsZSBleGFtcGxlLCB3ZQorICAgIC8vIGp1c3QgY3JlYXRlIGEgQyBzdHJpbmcuICBNb3JlIGNvbXBsZXggc3R1ZmYgY2FuIGJlIGRvbmUgaWYKKyAgICAvLyBkZXNpcmVkLgorICAgIHNoYXJlZF9yZXNvdXJjZV8gPSAiMTIzIjsKKworICAgIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIHNldCB1cC4KKyAgICBjb3VudGVyXysrOworCisgICAgLy8gU2V0VXBUZXN0Q2FzZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBjb3VudGVyXyk7CisgIH0KKworICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uY2UgYWZ0ZXIgdGhlIGxhc3QgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBpcworICAvLyBydW4uCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgcHJpbnRmKCJUZWFyaW5nIGRvd24gdGhlIHRlc3QgY2FzZSAuIC4gLlxuIik7CisKKyAgICAvLyBEZWNyZW1lbnRzIHRoZSBudW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBzZXQgdXAuCisgICAgY291bnRlcl8tLTsKKworICAgIC8vIFRlYXJEb3duVGVzdENhc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZS4KKyAgICBFWFBFQ1RfRVEoMCwgY291bnRlcl8pOworCisgICAgLy8gQ2xlYW5zIHVwIHRoZSBzaGFyZWQgcmVzb3VyY2UuCisgICAgc2hhcmVkX3Jlc291cmNlXyA9IE5VTEw7CisgIH0KKworICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBlYWNoIHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBTZXRVcFRlc3RDYXNlKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UsIHNvIGNvdW50ZXJfIHNob3VsZAorICAgIC8vIGFsd2F5cyBiZSAxLgorICAgIEVYUEVDVF9FUSgxLCBjb3VudGVyXyk7CisgIH0KKworICAvLyBOdW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBzZXQgdXAuCisgIHN0YXRpYyBpbnQgY291bnRlcl87CisKKyAgLy8gU29tZSByZXNvdXJjZSB0byBiZSBzaGFyZWQgYnkgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICBzdGF0aWMgY29uc3QgY2hhciogc2hhcmVkX3Jlc291cmNlXzsKK307CisKK2ludCBTZXRVcFRlc3RDYXNlVGVzdDo6Y291bnRlcl8gPSAwOworY29uc3QgY2hhciogU2V0VXBUZXN0Q2FzZVRlc3Q6OnNoYXJlZF9yZXNvdXJjZV8gPSBOVUxMOworCisvLyBBIHRlc3QgdGhhdCB1c2VzIHRoZSBzaGFyZWQgcmVzb3VyY2UuCitURVNUX0YoU2V0VXBUZXN0Q2FzZVRlc3QsIFRlc3QxKSB7CisgIEVYUEVDVF9TVFJORShOVUxMLCBzaGFyZWRfcmVzb3VyY2VfKTsKK30KKworLy8gQW5vdGhlciB0ZXN0IHRoYXQgdXNlcyB0aGUgc2hhcmVkIHJlc291cmNlLgorVEVTVF9GKFNldFVwVGVzdENhc2VUZXN0LCBUZXN0MikgeworICBFWFBFQ1RfU1RSRVEoIjEyMyIsIHNoYXJlZF9yZXNvdXJjZV8pOworfQorCisvLyBUaGUgSW5pdEdvb2dsZVRlc3RUZXN0IHRlc3QgY2FzZSB0ZXN0cyB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpLgorCisvLyBUaGUgRmxhZ3Mgc3RydWN0IHN0b3JlcyBhIGNvcHkgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorc3RydWN0IEZsYWdzIHsKKyAgLy8gQ29uc3RydWN0cyBhIEZsYWdzIHN0cnVjdCB3aGVyZSBlYWNoIGZsYWcgaGFzIGl0cyBkZWZhdWx0IHZhbHVlLgorICBGbGFncygpIDogYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMoZmFsc2UpLAorICAgICAgICAgICAgYnJlYWtfb25fZmFpbHVyZShmYWxzZSksCisgICAgICAgICAgICBjYXRjaF9leGNlcHRpb25zKGZhbHNlKSwKKyAgICAgICAgICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmsoZmFsc2UpLAorICAgICAgICAgICAgZmlsdGVyKCIiKSwKKyAgICAgICAgICAgIGxpc3RfdGVzdHMoZmFsc2UpLAorICAgICAgICAgICAgb3V0cHV0KCIiKSwKKyAgICAgICAgICAgIHByaW50X3RpbWUodHJ1ZSksCisgICAgICAgICAgICByYW5kb21fc2VlZCgwKSwKKyAgICAgICAgICAgIHJlcGVhdCgxKSwKKyAgICAgICAgICAgIHNodWZmbGUoZmFsc2UpLAorICAgICAgICAgICAgc3RhY2tfdHJhY2VfZGVwdGgoa01heFN0YWNrVHJhY2VEZXB0aCksCisgICAgICAgICAgICBzdHJlYW1fcmVzdWx0X3RvKCIiKSwKKyAgICAgICAgICAgIHRocm93X29uX2ZhaWx1cmUoZmFsc2UpIHt9CisKKyAgLy8gRmFjdG9yeSBtZXRob2RzLgorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIEFsc29SdW5EaXNhYmxlZFRlc3RzKGJvb2wgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyA9IGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgQnJlYWtPbkZhaWx1cmUoYm9vbCBicmVha19vbl9mYWlsdXJlKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MuYnJlYWtfb25fZmFpbHVyZSA9IGJyZWFrX29uX2ZhaWx1cmU7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfY2F0Y2hfZXhjZXB0aW9ucyBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBDYXRjaEV4Y2VwdGlvbnMoYm9vbCBjYXRjaF9leGNlcHRpb25zKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MuY2F0Y2hfZXhjZXB0aW9ucyA9IGNhdGNoX2V4Y2VwdGlvbnM7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gQ3JlYXRlcyBhIEZsYWdzIHN0cnVjdCB3aGVyZSB0aGUgZ3Rlc3RfZGVhdGhfdGVzdF91c2VfZm9yayBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBEZWF0aFRlc3RVc2VGb3JrKGJvb2wgZGVhdGhfdGVzdF91c2VfZm9yaykgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLmRlYXRoX3Rlc3RfdXNlX2ZvcmsgPSBkZWF0aF90ZXN0X3VzZV9mb3JrOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2ZpbHRlciBmbGFnIGhhcyB0aGUgZ2l2ZW4KKyAgLy8gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBGaWx0ZXIoY29uc3QgY2hhciogZmlsdGVyKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MuZmlsdGVyID0gZmlsdGVyOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X2xpc3RfdGVzdHMgZmxhZyBoYXMgdGhlCisgIC8vIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgTGlzdFRlc3RzKGJvb2wgbGlzdF90ZXN0cykgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLmxpc3RfdGVzdHMgPSBsaXN0X3Rlc3RzOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X291dHB1dCBmbGFnIGhhcyB0aGUgZ2l2ZW4KKyAgLy8gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBPdXRwdXQoY29uc3QgY2hhciogb3V0cHV0KSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3Mub3V0cHV0ID0gb3V0cHV0OworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3ByaW50X3RpbWUgZmxhZyBoYXMgdGhlIGdpdmVuCisgIC8vIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgUHJpbnRUaW1lKGJvb2wgcHJpbnRfdGltZSkgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnByaW50X3RpbWUgPSBwcmludF90aW1lOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3JhbmRvbV9zZWVkIGZsYWcgaGFzCisgIC8vIHRoZSBnaXZlbiB2YWx1ZS4KKyAgc3RhdGljIEZsYWdzIFJhbmRvbVNlZWQoSW50MzIgcmFuZG9tX3NlZWQpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5yYW5kb21fc2VlZCA9IHJhbmRvbV9zZWVkOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3JlcGVhdCBmbGFnIGhhcyB0aGUgZ2l2ZW4KKyAgLy8gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBSZXBlYXQoSW50MzIgcmVwZWF0KSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MucmVwZWF0ID0gcmVwZWF0OworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3NodWZmbGUgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgU2h1ZmZsZShib29sIHNodWZmbGUpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5zaHVmZmxlID0gc2h1ZmZsZTsKKyAgICByZXR1cm4gZmxhZ3M7CisgIH0KKworICAvLyBDcmVhdGVzIGEgRmxhZ3Mgc3RydWN0IHdoZXJlIHRoZSBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSBmbGFnIGhhcworICAvLyB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBGbGFncyBTdGFja1RyYWNlRGVwdGgoSW50MzIgc3RhY2tfdHJhY2VfZGVwdGgpIHsKKyAgICBGbGFncyBmbGFnczsKKyAgICBmbGFncy5zdGFja190cmFjZV9kZXB0aCA9IHN0YWNrX3RyYWNlX2RlcHRoOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgU3RyZWFtUmVzdWx0VG8oY29uc3QgY2hhciogc3RyZWFtX3Jlc3VsdF90bykgeworICAgIEZsYWdzIGZsYWdzOworICAgIGZsYWdzLnN0cmVhbV9yZXN1bHRfdG8gPSBzdHJlYW1fcmVzdWx0X3RvOworICAgIHJldHVybiBmbGFnczsKKyAgfQorCisgIC8vIENyZWF0ZXMgYSBGbGFncyBzdHJ1Y3Qgd2hlcmUgdGhlIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUgZmxhZyBoYXMKKyAgLy8gdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgRmxhZ3MgVGhyb3dPbkZhaWx1cmUoYm9vbCB0aHJvd19vbl9mYWlsdXJlKSB7CisgICAgRmxhZ3MgZmxhZ3M7CisgICAgZmxhZ3MudGhyb3dfb25fZmFpbHVyZSA9IHRocm93X29uX2ZhaWx1cmU7CisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gVGhlc2UgZmllbGRzIHN0b3JlIHRoZSBmbGFnIHZhbHVlcy4KKyAgYm9vbCBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0czsKKyAgYm9vbCBicmVha19vbl9mYWlsdXJlOworICBib29sIGNhdGNoX2V4Y2VwdGlvbnM7CisgIGJvb2wgZGVhdGhfdGVzdF91c2VfZm9yazsKKyAgY29uc3QgY2hhciogZmlsdGVyOworICBib29sIGxpc3RfdGVzdHM7CisgIGNvbnN0IGNoYXIqIG91dHB1dDsKKyAgYm9vbCBwcmludF90aW1lOworICBJbnQzMiByYW5kb21fc2VlZDsKKyAgSW50MzIgcmVwZWF0OworICBib29sIHNodWZmbGU7CisgIEludDMyIHN0YWNrX3RyYWNlX2RlcHRoOworICBjb25zdCBjaGFyKiBzdHJlYW1fcmVzdWx0X3RvOworICBib29sIHRocm93X29uX2ZhaWx1cmU7Cit9OworCisvLyBGaXh0dXJlIGZvciB0ZXN0aW5nIEluaXRHb29nbGVUZXN0KCkuCitjbGFzcyBJbml0R29vZ2xlVGVzdFRlc3QgOiBwdWJsaWMgVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBDbGVhcnMgdGhlIGZsYWdzIGJlZm9yZSBlYWNoIHRlc3QuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IGZhbHNlOworICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9ICIiOworICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBmYWxzZTsKKyAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSAiIjsKKyAgICBHVEVTVF9GTEFHKHByaW50X3RpbWUpID0gdHJ1ZTsKKyAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IDA7CisgICAgR1RFU1RfRkxBRyhyZXBlYXQpID0gMTsKKyAgICBHVEVTVF9GTEFHKHNodWZmbGUpID0gZmFsc2U7CisgICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSBrTWF4U3RhY2tUcmFjZURlcHRoOworICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSAiIjsKKyAgICBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gZmFsc2U7CisgIH0KKworICAvLyBBc3NlcnRzIHRoYXQgdHdvIG5hcnJvdyBvciB3aWRlIHN0cmluZyBhcnJheXMgYXJlIGVxdWFsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+CisgIHN0YXRpYyB2b2lkIEFzc2VydFN0cmluZ0FycmF5RXEoc2l6ZV90IHNpemUxLCBDaGFyVHlwZSoqIGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZTIsIENoYXJUeXBlKiogYXJyYXkyKSB7CisgICAgQVNTRVJUX0VRKHNpemUxLCBzaXplMikgPDwgIiBBcnJheSBzaXplcyBkaWZmZXJlbnQuIjsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemUxOyBpKyspIHsKKyAgICAgIEFTU0VSVF9TVFJFUShhcnJheTFbaV0sIGFycmF5MltpXSkgPDwgIiB3aGVyZSBpID09ICIgPDwgaTsKKyAgICB9CisgIH0KKworICAvLyBWZXJpZmllcyB0aGF0IHRoZSBmbGFnIHZhbHVlcyBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWVzLgorICBzdGF0aWMgdm9pZCBDaGVja0ZsYWdzKGNvbnN0IEZsYWdzJiBleHBlY3RlZCkgeworICAgIEVYUEVDVF9FUShleHBlY3RlZC5hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cywKKyAgICAgICAgICAgICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5icmVha19vbl9mYWlsdXJlLCBHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuY2F0Y2hfZXhjZXB0aW9ucywgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLmRlYXRoX3Rlc3RfdXNlX2ZvcmssIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykpOworICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5maWx0ZXIsIEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQubGlzdF90ZXN0cywgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLm91dHB1dCwgR1RFU1RfRkxBRyhvdXRwdXQpLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5wcmludF90aW1lLCBHVEVTVF9GTEFHKHByaW50X3RpbWUpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQucmFuZG9tX3NlZWQsIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQucmVwZWF0LCBHVEVTVF9GTEFHKHJlcGVhdCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZC5zaHVmZmxlLCBHVEVTVF9GTEFHKHNodWZmbGUpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuc3RhY2tfdHJhY2VfZGVwdGgsIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQuc3RyZWFtX3Jlc3VsdF90bywKKyAgICAgICAgICAgICAgICAgR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQudGhyb3dfb25fZmFpbHVyZSwgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSk7CisgIH0KKworICAvLyBQYXJzZXMgYSBjb21tYW5kIGxpbmUgKHNwZWNpZmllZCBieSBhcmdjMSBhbmQgYXJndjEpLCB0aGVuCisgIC8vIHZlcmlmaWVzIHRoYXQgdGhlIGZsYWcgdmFsdWVzIGFyZSBleHBlY3RlZCBhbmQgdGhhdCB0aGUKKyAgLy8gcmVjb2duaXplZCBmbGFncyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KKyAgc3RhdGljIHZvaWQgVGVzdFBhcnNpbmdGbGFncyhpbnQgYXJnYzEsIGNvbnN0IENoYXJUeXBlKiogYXJndjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MyLCBjb25zdCBDaGFyVHlwZSoqIGFyZ3YyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsYWdzJiBleHBlY3RlZCwgYm9vbCBzaG91bGRfcHJpbnRfaGVscCkgeworICAgIGNvbnN0IGJvb2wgc2F2ZWRfaGVscF9mbGFnID0gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Z19oZWxwX2ZsYWc7CisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Z19oZWxwX2ZsYWcgPSBmYWxzZTsKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKyAgICBDYXB0dXJlU3Rkb3V0KCk7CisjZW5kaWYKKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lLgorICAgIGludGVybmFsOjpQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoJmFyZ2MxLCBjb25zdF9jYXN0PENoYXJUeXBlKio+KGFyZ3YxKSk7CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2FwdHVyZWRfc3Rkb3V0ID0gR2V0Q2FwdHVyZWRTdGRvdXQoKTsKKyNlbmRpZgorCisgICAgLy8gVmVyaWZpZXMgdGhlIGZsYWcgdmFsdWVzLgorICAgIENoZWNrRmxhZ3MoZXhwZWN0ZWQpOworCisgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgcmVjb2duaXplZCBmbGFncyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjb21tYW5kCisgICAgLy8gbGluZS4KKyAgICBBc3NlcnRTdHJpbmdBcnJheUVxKGFyZ2MxICsgMSwgYXJndjEsIGFyZ2MyICsgMSwgYXJndjIpOworCisgICAgLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5IHNob3VsZCBuZWl0aGVyIHNldCBnX2hlbHBfZmxhZyBub3IgcHJpbnQgdGhlCisgICAgLy8gaGVscCBtZXNzYWdlIGZvciB0aGUgZmxhZ3MgaXQgcmVjb2duaXplcy4KKyAgICBFWFBFQ1RfRVEoc2hvdWxkX3ByaW50X2hlbHAsIDo6dGVzdGluZzo6aW50ZXJuYWw6OmdfaGVscF9mbGFnKTsKKworI2lmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKyAgICBjb25zdCBjaGFyKiBjb25zdCBleHBlY3RlZF9oZWxwX2ZyYWdtZW50ID0KKyAgICAgICAgIlRoaXMgcHJvZ3JhbSBjb250YWlucyB0ZXN0cyB3cml0dGVuIHVzaW5nIjsKKyAgICBpZiAoc2hvdWxkX3ByaW50X2hlbHApIHsKKyAgICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNTdWJzdHJpbmcsIGV4cGVjdGVkX2hlbHBfZnJhZ21lbnQsIGNhcHR1cmVkX3N0ZG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoSXNOb3RTdWJzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2hlbHBfZnJhZ21lbnQsIGNhcHR1cmVkX3N0ZG91dCk7CisgICAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpnX2hlbHBfZmxhZyA9IHNhdmVkX2hlbHBfZmxhZzsKKyAgfQorCisgIC8vIFRoaXMgbWFjcm8gd3JhcHMgVGVzdFBhcnNpbmdGbGFncyBzLnQuIHRoZSB1c2VyIGRvZXNuJ3QgbmVlZAorICAvLyB0byBzcGVjaWZ5IHRoZSBhcnJheSBzaXplcy4KKworI2RlZmluZSBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YxLCBhcmd2MiwgZXhwZWN0ZWQsIHNob3VsZF9wcmludF9oZWxwKSBcCisgIFRlc3RQYXJzaW5nRmxhZ3Moc2l6ZW9mKGFyZ3YxKS9zaXplb2YoKmFyZ3YxKSAtIDEsIGFyZ3YxLCBcCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFyZ3YyKS9zaXplb2YoKmFyZ3YyKSAtIDEsIGFyZ3YyLCBcCisgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIHNob3VsZF9wcmludF9oZWxwKQorfTsKKworLy8gVGVzdHMgcGFyc2luZyBhbiBlbXB0eSBjb21tYW5kIGxpbmUuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBFbXB0eSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzKCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhIGNvbW1hbmQgbGluZSB0aGF0IGhhcyBubyBmbGFnLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTm9GbGFnKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFncygpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSBiYWQgLS1ndGVzdF9maWx0ZXIgZmxhZy4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEZpbHRlckJhZCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2ZpbHRlciIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2ZpbHRlciIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoIiIpLCB0cnVlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyBhbiBlbXB0eSAtLWd0ZXN0X2ZpbHRlciBmbGFnLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRmlsdGVyRW1wdHkpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9maWx0ZXI9IiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoIiIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSBub24tZW1wdHkgLS1ndGVzdF9maWx0ZXIgZmxhZy4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEZpbHRlck5vbkVtcHR5KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyPWFiYyIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6RmlsdGVyKCJhYmMiKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlV2l0aG91dFZhbHVlKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSIsCisgICAgTlVMTAorfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkJyZWFrT25GYWlsdXJlKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPTAuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBCcmVha09uRmFpbHVyZUZhbHNlXzApIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlPTAiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OkJyZWFrT25GYWlsdXJlKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1mLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQnJlYWtPbkZhaWx1cmVGYWxzZV9mKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZT1mIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpCcmVha09uRmFpbHVyZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9Ri4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlRmFsc2VfRikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9RiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgZmxhZyB0aGF0IGhhcyBhICJ0cnVlIgorLy8gZGVmaW5pdGlvbi4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEJyZWFrT25GYWlsdXJlVHJ1ZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU9MSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6QnJlYWtPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBDYXRjaEV4Y2VwdGlvbnMpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpDYXRjaEV4Y2VwdGlvbnModHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X2RlYXRoX3Rlc3RfdXNlX2ZvcmsuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBEZWF0aFRlc3RVc2VGb3JrKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZGVhdGhfdGVzdF91c2VfZm9yayIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6RGVhdGhUZXN0VXNlRm9yayh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgdGhlIHNhbWUgZmxhZyB0d2ljZSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuICBUaGUKKy8vIGV4cGVjdGVkIGJlaGF2aW9yIGlzIHRoYXQgdGhlIG9uZSBjb21pbmcgbGFzdCB0YWtlcyBwcmVjZWRlbmNlLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgRHVwbGljYXRlZEZsYWdzKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3RfZmlsdGVyPWEiLAorICAgICItLWd0ZXN0X2ZpbHRlcj1iIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoImIiKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYW4gdW5yZWNvZ25pemVkIGZsYWcgb24gdGhlIGNvbW1hbmQgbGluZS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFVucmVjb2duaXplZEZsYWcpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIiwKKyAgICAiYmFyIiwgIC8vIFVucmVjb2duaXplZCBieSBHb29nbGUgVGVzdC4KKyAgICAiLS1ndGVzdF9maWx0ZXI9YiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgICJiYXIiLAorICAgIE5VTEwKKyAgfTsKKworICBGbGFncyBmbGFnczsKKyAgZmxhZ3MuYnJlYWtfb25fZmFpbHVyZSA9IHRydWU7CisgIGZsYWdzLmZpbHRlciA9ICJiIjsKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgZmxhZ3MsIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIExpc3RUZXN0c0ZsYWcpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9saXN0X3Rlc3RzIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Okxpc3RUZXN0cyh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3aXRoIGEgInRydWUiIHZhbHVlCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBMaXN0VGVzdHNUcnVlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfbGlzdF90ZXN0cz0xIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Okxpc3RUZXN0cyh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBoYXZpbmcgYSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3aXRoIGEgImZhbHNlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmFsc2UpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9saXN0X3Rlc3RzPTAiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfbGlzdF90ZXN0cz1mLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmFsc2VfZikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2xpc3RfdGVzdHM9ZiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3RfbGlzdF90ZXN0cz1GLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgTGlzdFRlc3RzRmFsc2VfRikgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X2xpc3RfdGVzdHM9RiIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6TGlzdFRlc3RzKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3Rfb3V0cHV0IChpbnZhbGlkKS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dEVtcHR5KSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3Rfb3V0cHV0IiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3Rfb3V0cHV0IiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3MoKSwgdHJ1ZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQ9eG1sCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBPdXRwdXRYbWwpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9vdXRwdXQ9eG1sIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpPdXRwdXQoInhtbCIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9vdXRwdXQ9eG1sOmZpbGUKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dFhtbEZpbGUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9vdXRwdXQ9eG1sOmZpbGUiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6Ok91dHB1dCgieG1sOmZpbGUiKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3Rfb3V0cHV0PXhtbDpkaXJlY3RvcnkvcGF0aC8KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIE91dHB1dFhtbERpcmVjdG9yeSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X291dHB1dD14bWw6ZGlyZWN0b3J5L3BhdGgvIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M6Ok91dHB1dCgieG1sOmRpcmVjdG9yeS9wYXRoLyIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfcHJpbnRfdGltZSBmbGFnCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBQcmludFRpbWVGbGFnKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfcHJpbnRfdGltZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpQcmludFRpbWUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9wcmludF90aW1lIGZsYWcgd2l0aCBhICJ0cnVlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUHJpbnRUaW1lVHJ1ZSkgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X3ByaW50X3RpbWU9MSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpQcmludFRpbWUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9wcmludF90aW1lIGZsYWcgd2l0aCBhICJmYWxzZSIgdmFsdWUKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZhbHNlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgIi0tZ3Rlc3RfcHJpbnRfdGltZT0wIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3ByaW50X3RpbWU9Zi4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZhbHNlX2YpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9wcmludF90aW1lPWYiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3ByaW50X3RpbWU9Ri4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFByaW50VGltZUZhbHNlX0YpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9wcmludF90aW1lPUYiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlByaW50VGltZShmYWxzZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3JhbmRvbV9zZWVkPW51bWJlcgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgUmFuZG9tU2VlZCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3JhbmRvbV9zZWVkPTEwMDAiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlJhbmRvbVNlZWQoMTAwMCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3JlcGVhdD1udW1iZXIKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFJlcGVhdCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3JlcGVhdD0xMDAwIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpSZXBlYXQoMTAwMCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcpIHsKKyAgICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICAiLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgICAiZm9vLmV4ZSIsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczo6QWxzb1J1bkRpc2FibGVkVGVzdHModHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgaGF2aW5nIGEgLS1ndGVzdF9hbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyBmbGFnIHdpdGggYSAidHJ1ZSIgdmFsdWUKK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIEFsc29SdW5EaXNhYmxlZFRlc3RzVHJ1ZSkgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzPTEiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M6OkFsc29SdW5EaXNhYmxlZFRlc3RzKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIGhhdmluZyBhIC0tZ3Rlc3RfYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZyB3aXRoIGEgImZhbHNlIiB2YWx1ZQorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgQWxzb1J1bkRpc2FibGVkVGVzdHNGYWxzZSkgeworICAgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAgICJmb28uZXhlIiwKKyAgICAgICItLWd0ZXN0X2Fsc29fcnVuX2Rpc2FibGVkX3Rlc3RzPTAiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICAgImZvby5leGUiLAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M6OkFsc29SdW5EaXNhYmxlZFRlc3RzKGZhbHNlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3Rfc2h1ZmZsZS4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFNodWZmbGVXaXRob3V0VmFsdWUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zaHVmZmxlIiwKKyAgICBOVUxMCit9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6U2h1ZmZsZSh0cnVlKSwgZmFsc2UpOworfQorCisvLyBUZXN0cyBwYXJzaW5nIC0tZ3Rlc3Rfc2h1ZmZsZT0wLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU2h1ZmZsZUZhbHNlXzApIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zaHVmZmxlPTAiLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgRmxhZ3M6OlNodWZmbGUoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSAtLWd0ZXN0X3NodWZmbGUgZmxhZyB0aGF0IGhhcyBhICJ0cnVlIgorLy8gZGVmaW5pdGlvbi4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFNodWZmbGVUcnVlKSB7CisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgIi0tZ3Rlc3Rfc2h1ZmZsZT0xIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpTaHVmZmxlKHRydWUpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF9zdGFja190cmFjZV9kZXB0aD1udW1iZXIuCitURVNUX0YoSW5pdEdvb2dsZVRlc3RUZXN0LCBTdGFja1RyYWNlRGVwdGgpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zdGFja190cmFjZV9kZXB0aD01IiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpTdGFja1RyYWNlRGVwdGgoNSksIGZhbHNlKTsKK30KKworVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgU3RyZWFtUmVzdWx0VG8pIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF9zdHJlYW1fcmVzdWx0X3RvPWxvY2FsaG9zdDoxMjM0IiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oCisgICAgICBhcmd2LCBhcmd2MiwgRmxhZ3M6OlN0cmVhbVJlc3VsdFRvKCJsb2NhbGhvc3Q6MTIzNCIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgVGhyb3dPbkZhaWx1cmVXaXRob3V0VmFsdWUpIHsKKyAgY29uc3QgY2hhciogYXJndltdID0geworICAgICJmb28uZXhlIiwKKyAgICAiLS1ndGVzdF90aHJvd19vbl9mYWlsdXJlIiwKKyAgICBOVUxMCit9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6VGhyb3dPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFyc2luZyAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmU9MC4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFRocm93T25GYWlsdXJlRmFsc2VfMCkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmU9MCIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6VGhyb3dPbkZhaWx1cmUoZmFsc2UpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhcnNpbmcgYSAtLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmUgZmxhZyB0aGF0IGhhcyBhICJ0cnVlIgorLy8gZGVmaW5pdGlvbi4KK1RFU1RfRihJbml0R29vZ2xlVGVzdFRlc3QsIFRocm93T25GYWlsdXJlVHJ1ZSkgeworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgICItLWd0ZXN0X3Rocm93X29uX2ZhaWx1cmU9MSIsCisgICAgTlVMTAorICB9OworCisgIGNvbnN0IGNoYXIqIGFyZ3YyW10gPSB7CisgICAgImZvby5leGUiLAorICAgIE5VTEwKKyAgfTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBGbGFnczo6VGhyb3dPbkZhaWx1cmUodHJ1ZSksIGZhbHNlKTsKK30KKworI2lmIEdURVNUX09TX1dJTkRPV1MKKy8vIFRlc3RzIHBhcnNpbmcgd2lkZSBzdHJpbmdzLgorVEVTVF9GKEluaXRHb29nbGVUZXN0VGVzdCwgV2lkZVN0cmluZ3MpIHsKKyAgY29uc3Qgd2NoYXJfdCogYXJndltdID0geworICAgIEwiZm9vLmV4ZSIsCisgICAgTCItLWd0ZXN0X2ZpbHRlcj1Gb28qIiwKKyAgICBMIi0tZ3Rlc3RfbGlzdF90ZXN0cz0xIiwKKyAgICBMIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSIsCisgICAgTCItLW5vbl9ndGVzdF9mbGFnIiwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3Qgd2NoYXJfdCogYXJndjJbXSA9IHsKKyAgICBMImZvby5leGUiLAorICAgIEwiLS1ub25fZ3Rlc3RfZmxhZyIsCisgICAgTlVMTAorICB9OworCisgIEZsYWdzIGV4cGVjdGVkX2ZsYWdzOworICBleHBlY3RlZF9mbGFncy5icmVha19vbl9mYWlsdXJlID0gdHJ1ZTsKKyAgZXhwZWN0ZWRfZmxhZ3MuZmlsdGVyID0gIkZvbyoiOworICBleHBlY3RlZF9mbGFncy5saXN0X3Rlc3RzID0gdHJ1ZTsKKworICBHVEVTVF9URVNUX1BBUlNJTkdfRkxBR1NfKGFyZ3YsIGFyZ3YyLCBleHBlY3RlZF9mbGFncywgZmFsc2UpOworfQorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjaWYgR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXworY2xhc3MgRmxhZ2ZpbGVUZXN0IDogcHVibGljIEluaXRHb29nbGVUZXN0VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgSW5pdEdvb2dsZVRlc3RUZXN0OjpTZXRVcCgpOworCisgICAgdGVzdGRhdGFfcGF0aF8uU2V0KGludGVybmFsOjpGaWxlUGF0aCgKKyAgICAgICAgaW50ZXJuYWw6OlRlbXBEaXIoKSArIGludGVybmFsOjpHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKS5zdHJpbmcoKSArCisgICAgICAgICJfZmxhZ2ZpbGVfdGVzdCIpKTsKKyAgICB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OlJtRGlyKHRlc3RkYXRhX3BhdGhfLmNfc3RyKCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3RkYXRhX3BhdGhfLkNyZWF0ZUZvbGRlcigpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXg6OlJtRGlyKHRlc3RkYXRhX3BhdGhfLmNfc3RyKCkpOworICAgIEluaXRHb29nbGVUZXN0VGVzdDo6VGVhckRvd24oKTsKKyAgfQorCisgIGludGVybmFsOjpGaWxlUGF0aCBDcmVhdGVGbGFnZmlsZShjb25zdCBjaGFyKiBjb250ZW50cykgeworICAgIGludGVybmFsOjpGaWxlUGF0aCBmaWxlX3BhdGgoaW50ZXJuYWw6OkZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKAorICAgICAgICB0ZXN0ZGF0YV9wYXRoXywgaW50ZXJuYWw6OkZpbGVQYXRoKCJ1bmlxdWUiKSwgInR4dCIpKTsKKyAgICBGSUxFKiBmID0gdGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4OjpGT3BlbihmaWxlX3BhdGguY19zdHIoKSwgInciKTsKKyAgICBmcHJpbnRmKGYsICIlcyIsIGNvbnRlbnRzKTsKKyAgICBmY2xvc2UoZik7CisgICAgcmV0dXJuIGZpbGVfcGF0aDsKKyAgfQorCisgcHJpdmF0ZToKKyAgaW50ZXJuYWw6OkZpbGVQYXRoIHRlc3RkYXRhX3BhdGhfOworfTsKKworLy8gVGVzdHMgYW4gZW1wdHkgZmxhZ2ZpbGUuCitURVNUX0YoRmxhZ2ZpbGVUZXN0LCBFbXB0eSkgeworICBpbnRlcm5hbDo6RmlsZVBhdGggZmxhZ2ZpbGVfcGF0aChDcmVhdGVGbGFnZmlsZSgiIikpOworICBzdGQ6OnN0cmluZyBmbGFnZmlsZV9mbGFnID0KKyAgICAgIHN0ZDo6c3RyaW5nKCItLSIgR1RFU1RfRkxBR19QUkVGSVhfICJmbGFnZmlsZT0iKSArIGZsYWdmaWxlX3BhdGguY19zdHIoKTsKKworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgIGZsYWdmaWxlX2ZsYWcuY19zdHIoKSwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzKCksIGZhbHNlKTsKK30KKworLy8gVGVzdHMgcGFzc2luZyBhIG5vbi1lbXB0eSAtLWd0ZXN0X2ZpbHRlciBmbGFnIHZpYSAtLWd0ZXN0X2ZsYWdmaWxlLgorVEVTVF9GKEZsYWdmaWxlVGVzdCwgRmlsdGVyTm9uRW1wdHkpIHsKKyAgaW50ZXJuYWw6OkZpbGVQYXRoIGZsYWdmaWxlX3BhdGgoQ3JlYXRlRmxhZ2ZpbGUoCisgICAgICAiLS0iICBHVEVTVF9GTEFHX1BSRUZJWF8gICJmaWx0ZXI9YWJjIikpOworICBzdGQ6OnN0cmluZyBmbGFnZmlsZV9mbGFnID0KKyAgICAgIHN0ZDo6c3RyaW5nKCItLSIgR1RFU1RfRkxBR19QUkVGSVhfICJmbGFnZmlsZT0iKSArIGZsYWdmaWxlX3BhdGguY19zdHIoKTsKKworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgImZvby5leGUiLAorICAgIGZsYWdmaWxlX2ZsYWcuY19zdHIoKSwKKyAgICBOVUxMCisgIH07CisKKyAgY29uc3QgY2hhciogYXJndjJbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgTlVMTAorICB9OworCisgIEdURVNUX1RFU1RfUEFSU0lOR19GTEFHU18oYXJndiwgYXJndjIsIEZsYWdzOjpGaWx0ZXIoImFiYyIpLCBmYWxzZSk7Cit9CisKKy8vIFRlc3RzIHBhc3Npbmcgc2V2ZXJhbCBmbGFncyB2aWEgLS1ndGVzdF9mbGFnZmlsZS4KK1RFU1RfRihGbGFnZmlsZVRlc3QsIFNldmVyYWxGbGFncykgeworICBpbnRlcm5hbDo6RmlsZVBhdGggZmxhZ2ZpbGVfcGF0aChDcmVhdGVGbGFnZmlsZSgKKyAgICAgICItLSIgIEdURVNUX0ZMQUdfUFJFRklYXyAgImZpbHRlcj1hYmNcbiIKKyAgICAgICItLSIgIEdURVNUX0ZMQUdfUFJFRklYXyAgImJyZWFrX29uX2ZhaWx1cmVcbiIKKyAgICAgICItLSIgIEdURVNUX0ZMQUdfUFJFRklYXyAgImxpc3RfdGVzdHMiKSk7CisgIHN0ZDo6c3RyaW5nIGZsYWdmaWxlX2ZsYWcgPQorICAgICAgc3RkOjpzdHJpbmcoIi0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImZsYWdmaWxlPSIpICsgZmxhZ2ZpbGVfcGF0aC5jX3N0cigpOworCisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAiZm9vLmV4ZSIsCisgICAgZmxhZ2ZpbGVfZmxhZy5jX3N0cigpLAorICAgIE5VTEwKKyAgfTsKKworICBjb25zdCBjaGFyKiBhcmd2MltdID0geworICAgICJmb28uZXhlIiwKKyAgICBOVUxMCisgIH07CisKKyAgRmxhZ3MgZXhwZWN0ZWRfZmxhZ3M7CisgIGV4cGVjdGVkX2ZsYWdzLmJyZWFrX29uX2ZhaWx1cmUgPSB0cnVlOworICBleHBlY3RlZF9mbGFncy5maWx0ZXIgPSAiYWJjIjsKKyAgZXhwZWN0ZWRfZmxhZ3MubGlzdF90ZXN0cyA9IHRydWU7CisKKyAgR1RFU1RfVEVTVF9QQVJTSU5HX0ZMQUdTXyhhcmd2LCBhcmd2MiwgZXhwZWN0ZWRfZmxhZ3MsIGZhbHNlKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXworCisvLyBUZXN0cyBjdXJyZW50X3Rlc3RfaW5mbygpIGluIFVuaXRUZXN0LgorY2xhc3MgQ3VycmVudFRlc3RJbmZvVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFRlc3RzIHRoYXQgY3VycmVudF90ZXN0X2luZm8oKSByZXR1cm5zIE5VTEwgYmVmb3JlIHRoZSBmaXJzdCB0ZXN0IGluCisgIC8vIHRoZSB0ZXN0IGNhc2UgaXMgcnVuLgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIC8vIFRoZXJlIHNob3VsZCBiZSBubyB0ZXN0cyBydW5uaW5nIGF0IHRoaXMgcG9pbnQuCisgICAgY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbyA9CisgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2luZm8gPT0gTlVMTCkKKyAgICAgICAgPDwgIlRoZXJlIHNob3VsZCBiZSBubyB0ZXN0cyBydW5uaW5nIGF0IHRoaXMgcG9pbnQuIjsKKyAgfQorCisgIC8vIFRlc3RzIHRoYXQgY3VycmVudF90ZXN0X2luZm8oKSByZXR1cm5zIE5VTEwgYWZ0ZXIgdGhlIGxhc3QgdGVzdCBpbgorICAvLyB0aGUgdGVzdCBjYXNlIGhhcyBydW4uCisgIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7CisgICAgY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbyA9CisgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0X2luZm8gPT0gTlVMTCkKKyAgICAgICAgPDwgIlRoZXJlIHNob3VsZCBiZSBubyB0ZXN0cyBydW5uaW5nIGF0IHRoaXMgcG9pbnQuIjsKKyAgfQorfTsKKworLy8gVGVzdHMgdGhhdCBjdXJyZW50X3Rlc3RfaW5mbygpIHJldHVybnMgVGVzdEluZm8gZm9yIGN1cnJlbnRseSBydW5uaW5nCisvLyB0ZXN0IGJ5IGNoZWNraW5nIHRoZSBleHBlY3RlZCB0ZXN0IG5hbWUgYWdhaW5zdCB0aGUgYWN0dWFsIG9uZS4KK1RFU1RfRihDdXJyZW50VGVzdEluZm9UZXN0LCBXb3Jrc0ZvckZpcnN0VGVzdEluQVRlc3RDYXNlKSB7CisgIGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8gPQorICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBBU1NFUlRfVFJVRShOVUxMICE9IHRlc3RfaW5mbykKKyAgICAgIDw8ICJUaGVyZSBpcyBhIHRlc3QgcnVubmluZyBzbyB3ZSBzaG91bGQgaGF2ZSBhIHZhbGlkIFRlc3RJbmZvLiI7CisgIEVYUEVDVF9TVFJFUSgiQ3VycmVudFRlc3RJbmZvVGVzdCIsIHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSkKKyAgICAgIDw8ICJFeHBlY3RlZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdCBjYXNlLiI7CisgIEVYUEVDVF9TVFJFUSgiV29ya3NGb3JGaXJzdFRlc3RJbkFUZXN0Q2FzZSIsIHRlc3RfaW5mby0+bmFtZSgpKQorICAgICAgPDwgIkV4cGVjdGVkIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiI7Cit9CisKKy8vIFRlc3RzIHRoYXQgY3VycmVudF90ZXN0X2luZm8oKSByZXR1cm5zIFRlc3RJbmZvIGZvciBjdXJyZW50bHkgcnVubmluZworLy8gdGVzdCBieSBjaGVja2luZyB0aGUgZXhwZWN0ZWQgdGVzdCBuYW1lIGFnYWluc3QgdGhlIGFjdHVhbCBvbmUuICBXZQorLy8gdXNlIHRoaXMgdGVzdCB0byBzZWUgdGhhdCB0aGUgVGVzdEluZm8gb2JqZWN0IGFjdHVhbGx5IGNoYW5nZWQgZnJvbQorLy8gdGhlIHByZXZpb3VzIGludm9jYXRpb24uCitURVNUX0YoQ3VycmVudFRlc3RJbmZvVGVzdCwgV29ya3NGb3JTZWNvbmRUZXN0SW5BVGVzdENhc2UpIHsKKyAgY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbyA9CisgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gdGVzdF9pbmZvKQorICAgICAgPDwgIlRoZXJlIGlzIGEgdGVzdCBydW5uaW5nIHNvIHdlIHNob3VsZCBoYXZlIGEgdmFsaWQgVGVzdEluZm8uIjsKKyAgRVhQRUNUX1NUUkVRKCJDdXJyZW50VGVzdEluZm9UZXN0IiwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpKQorICAgICAgPDwgIkV4cGVjdGVkIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0IGNhc2UuIjsKKyAgRVhQRUNUX1NUUkVRKCJXb3Jrc0ZvclNlY29uZFRlc3RJbkFUZXN0Q2FzZSIsIHRlc3RfaW5mby0+bmFtZSgpKQorICAgICAgPDwgIkV4cGVjdGVkIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKy8vIFRoZXNlIHR3byBsaW5lcyB0ZXN0IHRoYXQgd2UgY2FuIGRlZmluZSB0ZXN0cyBpbiBhIG5hbWVzcGFjZSB0aGF0CisvLyBoYXMgdGhlIG5hbWUgInRlc3RpbmciIGFuZCBpcyBuZXN0ZWQgaW4gYW5vdGhlciBuYW1lc3BhY2UuCituYW1lc3BhY2UgbXlfbmFtZXNwYWNlIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gTWFrZXMgc3VyZSB0aGF0IFRFU1Qga25vd3MgdG8gdXNlIDo6dGVzdGluZzo6VGVzdCBpbnN0ZWFkIG9mCisvLyA6Om15X25hbWVzcGFjZTo6dGVzdGluZzo6VGVzdC4KK2NsYXNzIFRlc3Qge307CisKKy8vIE1ha2VzIHN1cmUgdGhhdCBhbiBhc3NlcnRpb24ga25vd3MgdG8gdXNlIDo6dGVzdGluZzo6TWVzc2FnZSBpbnN0ZWFkIG9mCisvLyA6Om15X25hbWVzcGFjZTo6dGVzdGluZzo6TWVzc2FnZS4KK2NsYXNzIE1lc3NhZ2Uge307CisKKy8vIE1ha2VzIHN1cmUgdGhhdCBhbiBhc3NlcnRpb24ga25vd3MgdG8gdXNlCisvLyA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBpbnN0ZWFkIG9mCisvLyA6Om15X25hbWVzcGFjZTo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0LgorY2xhc3MgQXNzZXJ0aW9uUmVzdWx0IHt9OworCisvLyBUZXN0cyB0aGF0IGFuIGFzc2VydGlvbiB0aGF0IHNob3VsZCBzdWNjZWVkIHdvcmtzIGFzIGV4cGVjdGVkLgorVEVTVChOZXN0ZWRUZXN0aW5nTmFtZXNwYWNlVGVzdCwgU3VjY2VzcykgeworICBFWFBFQ1RfRVEoMSwgMSkgPDwgIlRoaXMgc2hvdWxkbid0IGZhaWwuIjsKK30KKworLy8gVGVzdHMgdGhhdCBhbiBhc3NlcnRpb24gdGhhdCBzaG91bGQgZmFpbCB3b3JrcyBhcyBleHBlY3RlZC4KK1RFU1QoTmVzdGVkVGVzdGluZ05hbWVzcGFjZVRlc3QsIEZhaWx1cmUpIHsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8ICJUaGlzIGZhaWx1cmUgaXMgZXhwZWN0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBteV9uYW1lc3BhY2UKKworLy8gVGVzdHMgdGhhdCBvbmUgY2FuIGNhbGwgc3VwZXJjbGFzcyBTZXRVcCBhbmQgVGVhckRvd24gbWV0aG9kcy0tCisvLyB0aGF0IGlzLCB0aGF0IHRoZXkgYXJlIG5vdCBwcml2YXRlLgorLy8gTm8gdGVzdHMgYXJlIGJhc2VkIG9uIHRoaXMgZml4dHVyZTsgdGhlIHRlc3QgInBhc3NlcyIgaWYgaXQgY29tcGlsZXMKKy8vIHN1Y2Nlc3NmdWxseS4KK2NsYXNzIFByb3RlY3RlZEZpeHR1cmVNZXRob2RzVGVzdCA6IHB1YmxpYyBUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBUZXN0OjpTZXRVcCgpOworICB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBUZXN0OjpUZWFyRG93bigpOworICB9Cit9OworCisvLyBTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCB0ZXN0cyB0aGUgc3RyZWFtaW5nIHZlcnNpb25zIG9mIGEgcmVwcmVzZW50YXRpdmUKKy8vIHNhbXBsZSBvZiBhc3NlcnRpb25zLgorVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgVW5jb25kaXRpb25hbCkgeworICBTVUNDRUVEKCkgPDwgImV4cGVjdGVkIHN1Y2Nlc3MiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShBRERfRkFJTFVSRSgpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoRkFJTCgpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gU2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLCAiVW5yZWFjaGFibGUgY29kZSIKKyMgcHJhZ21hIG9wdGlvbiBwdXNoIC13LWNjYyAtdy1yY2gKKyNlbmRpZgorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBUcnV0aCkgeworICBFWFBFQ1RfVFJVRSh0cnVlKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX1RSVUUodHJ1ZSkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9UUlVFKGZhbHNlKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFRydXRoMikgeworICBFWFBFQ1RfRkFMU0UoZmFsc2UpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfRkFMU0UoZmFsc2UpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkFMU0UodHJ1ZSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRkFMU0UodHJ1ZSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisjaWZkZWYgX19CT1JMQU5EQ19fCisvLyBSZXN0b3JlcyB3YXJuaW5ncyBhZnRlciBwcmV2aW91cyAiI3ByYWdtYSBvcHRpb24gcHVzaCIgc3VwcmVzc2VkIHRoZW0KKyMgcHJhZ21hIG9wdGlvbiBwb3AKKyNlbmRpZgorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBJbnRlZ2VyRXF1YWxzKSB7CisgIEVYUEVDVF9FUSgxLCAxKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX0VRKDEsIDEpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRVEoMSwgMikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfRVEoMSwgMikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBJbnRlZ2VyTGVzc1RoYW4pIHsKKyAgRVhQRUNUX0xUKDEsIDIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfTFQoMSwgMikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9MVCgyLCAxKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9MVCgyLCAxKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIFN0cmluZ3NFcXVhbCkgeworICBFWFBFQ1RfU1RSRVEoImZvbyIsICJmb28iKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX1NUUkVRKCJmb28iLCAiZm9vIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9TVFJFUSgiZm9vIiwgImJhciIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkVRKCJmb28iLCAiYmFyIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBTdHJpbmdzTm90RXF1YWwpIHsKKyAgRVhQRUNUX1NUUk5FKCJmb28iLCAiYmFyIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9TVFJORSgiZm9vIiwgImJhciIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSTkUoImZvbyIsICJmb28iKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9TVFJORSgiZm9vIiwgImZvbyIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgU3RyaW5nc0VxdWFsSWdub3JpbmdDYXNlKSB7CisgIEVYUEVDVF9TVFJDQVNFRVEoImZvbyIsICJGT08iKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX1NUUkNBU0VFUSgiZm9vIiwgIkZPTyIpIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfU1RSQ0FTRUVRKCJmb28iLCAiYmFyIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfU1RSQ0FTRUVRKCJmb28iLCAiYmFyIikgPDwgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBTdHJpbmdOb3RFcXVhbElnbm9yaW5nQ2FzZSkgeworICBFWFBFQ1RfU1RSQ0FTRU5FKCJmb28iLCAiYmFyIikgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEFTU0VSVF9TVFJDQVNFTkUoImZvbyIsICJiYXIiKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX1NUUkNBU0VORSgiZm9vIiwgIkZPTyIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX1NUUkNBU0VORSgiYmFyIiwgIkJBUiIpIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgRmxvYXRpbmdQb2ludEVxdWFscykgeworICBFWFBFQ1RfRkxPQVRfRVEoMS4wLCAxLjApIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBBU1NFUlRfRkxPQVRfRVEoMS4wLCAxLjApIDw8ICJ1bmV4cGVjdGVkIGZhaWx1cmUiOworICBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShFWFBFQ1RfRkxPQVRfRVEoMC4wLCAxLjApIDw8ICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX0ZMT0FUX0VRKDAuMCwgMS4wKSA8PCAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCitURVNUKFN0cmVhbWluZ0Fzc2VydGlvbnNUZXN0LCBUaHJvdykgeworICBFWFBFQ1RfVEhST1coVGhyb3dBbkludGVnZXIoKSwgaW50KSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX1RIUk9XKFRocm93QW5JbnRlZ2VyKCksIGludCkgPDwgInVuZXhwZWN0ZWQgZmFpbHVyZSI7CisgIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKEVYUEVDVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBib29sKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEFTU0VSVF9USFJPVyhUaHJvd0FuSW50ZWdlcigpLCBib29sKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKK1RFU1QoU3RyZWFtaW5nQXNzZXJ0aW9uc1Rlc3QsIE5vVGhyb3cpIHsKKyAgRVhQRUNUX05PX1RIUk9XKFRocm93Tm90aGluZygpKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX05PX1RIUk9XKFRocm93Tm90aGluZygpKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX05PX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoQVNTRVJUX05PX1RIUk9XKFRocm93QW5JbnRlZ2VyKCkpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwgImV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworVEVTVChTdHJlYW1pbmdBc3NlcnRpb25zVGVzdCwgQW55VGhyb3cpIHsKKyAgRVhQRUNUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgQVNTRVJUX0FOWV9USFJPVyhUaHJvd0FuSW50ZWdlcigpKSA8PCAidW5leHBlY3RlZCBmYWlsdXJlIjsKKyAgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoRVhQRUNUX0FOWV9USFJPVyhUaHJvd05vdGhpbmcoKSkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLCAiZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShBU1NFUlRfQU5ZX1RIUk9XKFRocm93Tm90aGluZygpKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsICJleHBlY3RlZCBmYWlsdXJlIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKworLy8gVGVzdHMgdGhhdCBHb29nbGUgVGVzdCBjb3JyZWN0bHkgZGVjaWRlcyB3aGV0aGVyIHRvIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KKworVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc0NvbG9yc1doZW5HVGVzdENvbG9yRmxhZ0lzWWVzKSB7CisgIEdURVNUX0ZMQUcoY29sb3IpID0gInllcyI7CisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAiZHVtYiIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorfQorCitURVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzQ29sb3JzV2hlbkdUZXN0Q29sb3JGbGFnSXNBbGlhc09mWWVzKSB7CisgIFNldEVudigiVEVSTSIsICJkdW1iIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisKKyAgR1RFU1RfRkxBRyhjb2xvcikgPSAiVHJ1ZSI7CisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorCisgIEdURVNUX0ZMQUcoY29sb3IpID0gInQiOworICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KKworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICIxIjsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCit9CisKK1RFU1QoQ29sb3JlZE91dHB1dFRlc3QsIFVzZXNOb0NvbG9yV2hlbkdUZXN0Q29sb3JGbGFnSXNObykgeworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJubyI7CisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKGZhbHNlKSk7ICAvLyBTdGRvdXQgaXMgbm90IGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJkdW1iIik7ICAvLyBURVJNIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisgIEVYUEVDVF9GQUxTRShTaG91bGRVc2VDb2xvcihmYWxzZSkpOyAgLy8gU3Rkb3V0IGlzIG5vdCBhIFRUWS4KK30KKworVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc05vQ29sb3JXaGVuR1Rlc3RDb2xvckZsYWdJc0ludmFsaWQpIHsKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJGIjsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICIwIjsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJ1bmtub3duIjsKKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KK30KKworVEVTVChDb2xvcmVkT3V0cHV0VGVzdCwgVXNlc0NvbG9yc1doZW5TdGRvdXRJc1R0eSkgeworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJhdXRvIjsKKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IoZmFsc2UpKTsgIC8vIFN0ZG91dCBpcyBub3QgYSBUVFkuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgICAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorfQorCitURVNUKENvbG9yZWRPdXRwdXRUZXN0LCBVc2VzQ29sb3JzV2hlblRlcm1TdXBwb3J0c0NvbG9ycykgeworICBHVEVTVF9GTEFHKGNvbG9yKSA9ICJhdXRvIjsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgLy8gT24gV2luZG93cywgd2UgaWdub3JlIHRoZSBURVJNIHZhcmlhYmxlIGFzIGl0J3MgdXN1YWxseSBub3Qgc2V0LgorCisgIFNldEVudigiVEVSTSIsICJkdW1iIik7CisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAiIik7CisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0iKTsKKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorI2Vsc2UKKyAgLy8gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIFRFUk0gdG8gZGV0ZXJtaW5lIGlmIHRoZQorICAvLyB0ZXJtaW5hbCBzdXBwb3J0cyBjb2xvcnMuCisKKyAgU2V0RW52KCJURVJNIiwgImR1bWIiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAiZW1hY3MiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAidnQxMDAiKTsgIC8vIFRFUk0gZG9lc24ndCBzdXBwb3J0IGNvbG9ycy4KKyAgRVhQRUNUX0ZBTFNFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0tbW9ubyIpOyAgLy8gVEVSTSBkb2Vzbid0IHN1cHBvcnQgY29sb3JzLgorICBFWFBFQ1RfRkFMU0UoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJ4dGVybSIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAieHRlcm0tY29sb3IiKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInh0ZXJtLTI1NmNvbG9yIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJzY3JlZW4iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgInNjcmVlbi0yNTZjb2xvciIpOyAgLy8gVEVSTSBzdXBwb3J0cyBjb2xvcnMuCisgIEVYUEVDVF9UUlVFKFNob3VsZFVzZUNvbG9yKHRydWUpKTsgIC8vIFN0ZG91dCBpcyBhIFRUWS4KKworICBTZXRFbnYoIlRFUk0iLCAicnh2dC11bmljb2RlIik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJyeHZ0LXVuaWNvZGUtMjU2Y29sb3IiKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisKKyAgU2V0RW52KCJURVJNIiwgImxpbnV4Iik7ICAvLyBURVJNIHN1cHBvcnRzIGNvbG9ycy4KKyAgRVhQRUNUX1RSVUUoU2hvdWxkVXNlQ29sb3IodHJ1ZSkpOyAgLy8gU3Rkb3V0IGlzIGEgVFRZLgorCisgIFNldEVudigiVEVSTSIsICJjeWd3aW4iKTsgIC8vIFRFUk0gc3VwcG9ydHMgY29sb3JzLgorICBFWFBFQ1RfVFJVRShTaG91bGRVc2VDb2xvcih0cnVlKSk7ICAvLyBTdGRvdXQgaXMgYSBUVFkuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK30KKworLy8gVmVyaWZpZXMgdGhhdCBTdGF0aWNBc3NlcnRUeXBlRXEgd29ya3MgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuCisKK3N0YXRpYyBib29sIGR1bW15MSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFN0YXRpY0Fzc2VydFR5cGVFcTxib29sLCBib29sPigpOworc3RhdGljIGJvb2wgZHVtbXkyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0KKyAgICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3QgaW50LCBjb25zdCBpbnQ+KCk7CisKKy8vIFZlcmlmaWVzIHRoYXQgU3RhdGljQXNzZXJ0VHlwZUVxIHdvcmtzIGluIGEgY2xhc3MuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU3RhdGljQXNzZXJ0VHlwZUVxVGVzdEhlbHBlciB7CisgcHVibGljOgorICBTdGF0aWNBc3NlcnRUeXBlRXFUZXN0SGVscGVyKCkgeyBTdGF0aWNBc3NlcnRUeXBlRXE8Ym9vbCwgVD4oKTsgfQorfTsKKworVEVTVChTdGF0aWNBc3NlcnRUeXBlRXFUZXN0LCBXb3Jrc0luQ2xhc3MpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxVGVzdEhlbHBlcjxib29sPigpOworfQorCisvLyBWZXJpZmllcyB0aGF0IFN0YXRpY0Fzc2VydFR5cGVFcSB3b3JrcyBpbnNpZGUgYSBmdW5jdGlvbi4KKwordHlwZWRlZiBpbnQgSW50QWxpYXM7CisKK1RFU1QoU3RhdGljQXNzZXJ0VHlwZUVxVGVzdCwgQ29tcGlsZXNGb3JFcXVhbFR5cGVzKSB7CisgIFN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIEludEFsaWFzPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50KiwgSW50QWxpYXMqPigpOworfQorCitURVNUKEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3BUZXN0LCBSZXR1cm5zVGhlU3RhY2tUcmFjZSkgeworICB0ZXN0aW5nOjpVbml0VGVzdCogY29uc3QgdW5pdF90ZXN0ID0gdGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCk7CisKKyAgLy8gV2UgZG9uJ3QgaGF2ZSBhIHN0YWNrIHdhbGtlciBpbiBHb29nbGUgVGVzdCB5ZXQuCisgIEVYUEVDVF9TVFJFUSgiIiwgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCh1bml0X3Rlc3QsIDApLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIiIsIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AodW5pdF90ZXN0LCAxKS5jX3N0cigpKTsKK30KKworVEVTVChIYXNOb25mYXRhbEZhaWx1cmVUZXN0LCBSZXR1cm5zRmFsc2VXaGVuVGhlcmVJc05vRmFpbHVyZSkgeworICBFWFBFQ1RfRkFMU0UoSGFzTm9uZmF0YWxGYWlsdXJlKCkpOworfQorCitzdGF0aWMgdm9pZCBGYWlsRmF0YWxseSgpIHsgRkFJTCgpOyB9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgUmV0dXJuc0ZhbHNlV2hlblRoZXJlSXNPbmx5RmF0YWxGYWlsdXJlKSB7CisgIEZhaWxGYXRhbGx5KCk7CisgIGNvbnN0IGJvb2wgaGFzX25vbmZhdGFsX2ZhaWx1cmUgPSBIYXNOb25mYXRhbEZhaWx1cmUoKTsKKyAgQ2xlYXJDdXJyZW50VGVzdFBhcnRSZXN1bHRzKCk7CisgIEVYUEVDVF9GQUxTRShoYXNfbm9uZmF0YWxfZmFpbHVyZSk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuVGhlcmVJc05vbmZhdGFsRmFpbHVyZSkgeworICBBRERfRkFJTFVSRSgpOworICBjb25zdCBib29sIGhhc19ub25mYXRhbF9mYWlsdXJlID0gSGFzTm9uZmF0YWxGYWlsdXJlKCk7CisgIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOworICBFWFBFQ1RfVFJVRShoYXNfbm9uZmF0YWxfZmFpbHVyZSk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuVGhlcmVBcmVGYXRhbEFuZE5vbmZhdGFsRmFpbHVyZXMpIHsKKyAgRmFpbEZhdGFsbHkoKTsKKyAgQUREX0ZBSUxVUkUoKTsKKyAgY29uc3QgYm9vbCBoYXNfbm9uZmF0YWxfZmFpbHVyZSA9IEhhc05vbmZhdGFsRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX25vbmZhdGFsX2ZhaWx1cmUpOworfQorCisvLyBBIHdyYXBwZXIgZm9yIGNhbGxpbmcgSGFzTm9uZmF0YWxGYWlsdXJlIG91dHNpZGUgb2YgYSB0ZXN0IGJvZHkuCitzdGF0aWMgYm9vbCBIYXNOb25mYXRhbEZhaWx1cmVIZWxwZXIoKSB7CisgIHJldHVybiB0ZXN0aW5nOjpUZXN0OjpIYXNOb25mYXRhbEZhaWx1cmUoKTsKK30KKworVEVTVChIYXNOb25mYXRhbEZhaWx1cmVUZXN0LCBXb3Jrc091dHNpZGVPZlRlc3RCb2R5KSB7CisgIEVYUEVDVF9GQUxTRShIYXNOb25mYXRhbEZhaWx1cmVIZWxwZXIoKSk7Cit9CisKK1RFU1QoSGFzTm9uZmF0YWxGYWlsdXJlVGVzdCwgV29ya3NPdXRzaWRlT2ZUZXN0Qm9keTIpIHsKKyAgQUREX0ZBSUxVUkUoKTsKKyAgY29uc3QgYm9vbCBoYXNfbm9uZmF0YWxfZmFpbHVyZSA9IEhhc05vbmZhdGFsRmFpbHVyZUhlbHBlcigpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX25vbmZhdGFsX2ZhaWx1cmUpOworfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBSZXR1cm5zRmFsc2VXaGVuVGhlcmVJc05vRmFpbHVyZSkgeworICBFWFBFQ1RfRkFMU0UoSGFzRmFpbHVyZSgpKTsKK30KKworVEVTVChIYXNGYWlsdXJlVGVzdCwgUmV0dXJuc1RydWVXaGVuVGhlcmVJc0ZhdGFsRmFpbHVyZSkgeworICBGYWlsRmF0YWxseSgpOworICBjb25zdCBib29sIGhhc19mYWlsdXJlID0gSGFzRmFpbHVyZSgpOworICBDbGVhckN1cnJlbnRUZXN0UGFydFJlc3VsdHMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzX2ZhaWx1cmUpOworfQorCitURVNUKEhhc0ZhaWx1cmVUZXN0LCBSZXR1cm5zVHJ1ZVdoZW5UaGVyZUlzTm9uZmF0YWxGYWlsdXJlKSB7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX2ZhaWx1cmUgPSBIYXNGYWlsdXJlKCk7CisgIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOworICBFWFBFQ1RfVFJVRShoYXNfZmFpbHVyZSk7Cit9CisKK1RFU1QoSGFzRmFpbHVyZVRlc3QsIFJldHVybnNUcnVlV2hlblRoZXJlQXJlRmF0YWxBbmROb25mYXRhbEZhaWx1cmVzKSB7CisgIEZhaWxGYXRhbGx5KCk7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX2ZhaWx1cmUgPSBIYXNGYWlsdXJlKCk7CisgIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOworICBFWFBFQ1RfVFJVRShoYXNfZmFpbHVyZSk7Cit9CisKKy8vIEEgd3JhcHBlciBmb3IgY2FsbGluZyBIYXNGYWlsdXJlIG91dHNpZGUgb2YgYSB0ZXN0IGJvZHkuCitzdGF0aWMgYm9vbCBIYXNGYWlsdXJlSGVscGVyKCkgeyByZXR1cm4gdGVzdGluZzo6VGVzdDo6SGFzRmFpbHVyZSgpOyB9CisKK1RFU1QoSGFzRmFpbHVyZVRlc3QsIFdvcmtzT3V0c2lkZU9mVGVzdEJvZHkpIHsKKyAgRVhQRUNUX0ZBTFNFKEhhc0ZhaWx1cmVIZWxwZXIoKSk7Cit9CisKK1RFU1QoSGFzRmFpbHVyZVRlc3QsIFdvcmtzT3V0c2lkZU9mVGVzdEJvZHkyKSB7CisgIEFERF9GQUlMVVJFKCk7CisgIGNvbnN0IGJvb2wgaGFzX2ZhaWx1cmUgPSBIYXNGYWlsdXJlSGVscGVyKCk7CisgIENsZWFyQ3VycmVudFRlc3RQYXJ0UmVzdWx0cygpOworICBFWFBFQ1RfVFJVRShoYXNfZmFpbHVyZSk7Cit9CisKK2NsYXNzIFRlc3RMaXN0ZW5lciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIFRlc3RMaXN0ZW5lcigpIDogb25fc3RhcnRfY291bnRlcl8oTlVMTCksIGlzX2Rlc3Ryb3llZF8oTlVMTCkge30KKyAgVGVzdExpc3RlbmVyKGludCogb25fc3RhcnRfY291bnRlciwgYm9vbCogaXNfZGVzdHJveWVkKQorICAgICAgOiBvbl9zdGFydF9jb3VudGVyXyhvbl9zdGFydF9jb3VudGVyKSwKKyAgICAgICAgaXNfZGVzdHJveWVkXyhpc19kZXN0cm95ZWQpIHt9CisKKyAgdmlydHVhbCB+VGVzdExpc3RlbmVyKCkgeworICAgIGlmIChpc19kZXN0cm95ZWRfKQorICAgICAgKmlzX2Rlc3Ryb3llZF8gPSB0cnVlOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICBpZiAob25fc3RhcnRfY291bnRlcl8gIT0gTlVMTCkKKyAgICAgICgqb25fc3RhcnRfY291bnRlcl8pKys7CisgIH0KKworIHByaXZhdGU6CisgIGludCogb25fc3RhcnRfY291bnRlcl87CisgIGJvb2wqIGlzX2Rlc3Ryb3llZF87Cit9OworCisvLyBUZXN0cyB0aGUgY29uc3RydWN0b3IuCitURVNUKFRlc3RFdmVudExpc3RlbmVyc1Rlc3QsIENvbnN0cnVjdGlvbldvcmtzKSB7CisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisKKyAgRVhQRUNUX1RSVUUoVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgPT0gTlVMTCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIFRlc3RFdmVudExpc3RlbmVycyBkZXN0cnVjdG9yIGRlbGV0ZXMgYWxsIHRoZSBsaXN0ZW5lcnMgaXQKKy8vIG93bnMuCitURVNUKFRlc3RFdmVudExpc3RlbmVyc1Rlc3QsIERlc3RydWN0aW9uV29ya3MpIHsKKyAgYm9vbCBkZWZhdWx0X3Jlc3VsdF9wcmludGVyX2lzX2Rlc3Ryb3llZCA9IGZhbHNlOworICBib29sIGRlZmF1bHRfeG1sX3ByaW50ZXJfaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIGJvb2wgZXh0cmFfbGlzdGVuZXJfaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIFRlc3RMaXN0ZW5lciogZGVmYXVsdF9yZXN1bHRfcHJpbnRlciA9IG5ldyBUZXN0TGlzdGVuZXIoCisgICAgICBOVUxMLCAmZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl9pc19kZXN0cm95ZWQpOworICBUZXN0TGlzdGVuZXIqIGRlZmF1bHRfeG1sX3ByaW50ZXIgPSBuZXcgVGVzdExpc3RlbmVyKAorICAgICAgTlVMTCwgJmRlZmF1bHRfeG1sX3ByaW50ZXJfaXNfZGVzdHJveWVkKTsKKyAgVGVzdExpc3RlbmVyKiBleHRyYV9saXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoCisgICAgICBOVUxMLCAmZXh0cmFfbGlzdGVuZXJfaXNfZGVzdHJveWVkKTsKKworICB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoJmxpc3RlbmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcik7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoJmxpc3RlbmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3htbF9wcmludGVyKTsKKyAgICBsaXN0ZW5lcnMuQXBwZW5kKGV4dHJhX2xpc3RlbmVyKTsKKyAgfQorICBFWFBFQ1RfVFJVRShkZWZhdWx0X3Jlc3VsdF9wcmludGVyX2lzX2Rlc3Ryb3llZCk7CisgIEVYUEVDVF9UUlVFKGRlZmF1bHRfeG1sX3ByaW50ZXJfaXNfZGVzdHJveWVkKTsKKyAgRVhQRUNUX1RSVUUoZXh0cmFfbGlzdGVuZXJfaXNfZGVzdHJveWVkKTsKK30KKworLy8gVGVzdHMgdGhhdCBhIGxpc3RlbmVyIEFwcGVuZCdlZCB0byBhIFRlc3RFdmVudExpc3RlbmVycyBsaXN0IHN0YXJ0cworLy8gcmVjZWl2aW5nIGV2ZW50cy4KK1RFU1QoVGVzdEV2ZW50TGlzdGVuZXJzVGVzdCwgQXBwZW5kKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOworICB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgICBsaXN0ZW5lcnMuQXBwZW5kKGxpc3RlbmVyKTsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgb25fc3RhcnRfY291bnRlcik7CisgIH0KKyAgRVhQRUNUX1RSVUUoaXNfZGVzdHJveWVkKTsKK30KKworLy8gVGVzdHMgdGhhdCBsaXN0ZW5lcnMgcmVjZWl2ZSBldmVudHMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhcHBlbmRlZCB0bworLy8gdGhlIGxpc3QsIGV4Y2VwdCBmb3IgKkVuZCByZXF1ZXN0cywgd2hpY2ggbXVzdCBiZSByZWNlaXZlZCBpbiB0aGUgcmV2ZXJzZQorLy8gb3JkZXIuCitjbGFzcyBTZXF1ZW5jZVRlc3RpbmdMaXN0ZW5lciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogdmVjdG9yLCBjb25zdCBjaGFyKiBpZCkKKyAgICAgIDogdmVjdG9yXyh2ZWN0b3IpLCBpZF8oaWQpIHt9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICB2ZWN0b3JfLT5wdXNoX2JhY2soR2V0RXZlbnREZXNjcmlwdGlvbigiT25UZXN0UHJvZ3JhbVN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKKyAgICB2ZWN0b3JfLT5wdXNoX2JhY2soR2V0RXZlbnREZXNjcmlwdGlvbigiT25UZXN0UHJvZ3JhbUVuZCIpKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgICAgdmVjdG9yXy0+cHVzaF9iYWNrKEdldEV2ZW50RGVzY3JpcHRpb24oIk9uVGVzdEl0ZXJhdGlvblN0YXJ0IikpOworICB9CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgeworICAgIHZlY3Rvcl8tPnB1c2hfYmFjayhHZXRFdmVudERlc2NyaXB0aW9uKCJPblRlc3RJdGVyYXRpb25FbmQiKSk7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEdldEV2ZW50RGVzY3JpcHRpb24oY29uc3QgY2hhciogbWV0aG9kKSB7CisgICAgTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UgPDwgaWRfIDw8ICIuIiA8PCBtZXRob2Q7CisgICAgcmV0dXJuIG1lc3NhZ2UuR2V0U3RyaW5nKCk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHZlY3Rvcl87CisgIGNvbnN0IGNoYXIqIGNvbnN0IGlkXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNlcXVlbmNlVGVzdGluZ0xpc3RlbmVyKTsKK307CisKK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIEFwcGVuZEtlZXBzT3JkZXIpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZlYzsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgbGlzdGVuZXJzLkFwcGVuZChuZXcgU2VxdWVuY2VUZXN0aW5nTGlzdGVuZXIoJnZlYywgIjFzdCIpKTsKKyAgbGlzdGVuZXJzLkFwcGVuZChuZXcgU2VxdWVuY2VUZXN0aW5nTGlzdGVuZXIoJnZlYywgIjJuZCIpKTsKKyAgbGlzdGVuZXJzLkFwcGVuZChuZXcgU2VxdWVuY2VUZXN0aW5nTGlzdGVuZXIoJnZlYywgIjNyZCIpKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgIEFTU0VSVF9FUSgzVSwgdmVjLnNpemUoKSk7CisgIEVYUEVDVF9TVFJFUSgiMXN0Lk9uVGVzdFByb2dyYW1TdGFydCIsIHZlY1swXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIybmQuT25UZXN0UHJvZ3JhbVN0YXJ0IiwgdmVjWzFdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjNyZC5PblRlc3RQcm9ncmFtU3RhcnQiLCB2ZWNbMl0uY19zdHIoKSk7CisKKyAgdmVjLmNsZWFyKCk7CisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbUVuZCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgIEFTU0VSVF9FUSgzVSwgdmVjLnNpemUoKSk7CisgIEVYUEVDVF9TVFJFUSgiM3JkLk9uVGVzdFByb2dyYW1FbmQiLCB2ZWNbMF0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMm5kLk9uVGVzdFByb2dyYW1FbmQiLCB2ZWNbMV0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiMXN0Lk9uVGVzdFByb2dyYW1FbmQiLCB2ZWNbMl0uY19zdHIoKSk7CisKKyAgdmVjLmNsZWFyKCk7CisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0SXRlcmF0aW9uU3RhcnQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCksIDApOworICBBU1NFUlRfRVEoM1UsIHZlYy5zaXplKCkpOworICBFWFBFQ1RfU1RSRVEoIjFzdC5PblRlc3RJdGVyYXRpb25TdGFydCIsIHZlY1swXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIybmQuT25UZXN0SXRlcmF0aW9uU3RhcnQiLCB2ZWNbMV0uY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSgiM3JkLk9uVGVzdEl0ZXJhdGlvblN0YXJ0IiwgdmVjWzJdLmNfc3RyKCkpOworCisgIHZlYy5jbGVhcigpOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdEl0ZXJhdGlvbkVuZCgKKyAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSwgMCk7CisgIEFTU0VSVF9FUSgzVSwgdmVjLnNpemUoKSk7CisgIEVYUEVDVF9TVFJFUSgiM3JkLk9uVGVzdEl0ZXJhdGlvbkVuZCIsIHZlY1swXS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCIybmQuT25UZXN0SXRlcmF0aW9uRW5kIiwgdmVjWzFdLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoIjFzdC5PblRlc3RJdGVyYXRpb25FbmQiLCB2ZWNbMl0uY19zdHIoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBsaXN0ZW5lciByZW1vdmVkIGZyb20gYSBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdCBzdG9wcyByZWNlaXZpbmcKKy8vIGV2ZW50cyBhbmQgaXMgbm90IGRlbGV0ZWQgd2hlbiB0aGUgbGlzdCBpcyBkZXN0cm95ZWQuCitURVNUKFRlc3RFdmVudExpc3RlbmVyc1Rlc3QsIFJlbGVhc2UpIHsKKyAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOworICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOworICAvLyBBbHRob3VnaCBBcHBlbmQgcGFzc2VzIHRoZSBvd25lcnNoaXAgb2YgdGhpcyBvYmplY3QgdG8gdGhlIGxpc3QsCisgIC8vIHRoZSBmb2xsb3dpbmcgY2FsbHMgcmVsZWFzZSBpdCwgYW5kIHdlIG5lZWQgdG8gZGVsZXRlIGl0IGJlZm9yZSB0aGUKKyAgLy8gdGVzdCBlbmRzLgorICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7CisgIHsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworICAgIGxpc3RlbmVycy5BcHBlbmQobGlzdGVuZXIpOworICAgIEVYUEVDVF9FUShsaXN0ZW5lciwgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXIpKTsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6R2V0UmVwZWF0ZXIoJmxpc3RlbmVycyktPk9uVGVzdFByb2dyYW1TdGFydCgKKyAgICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcikgPT0gTlVMTCk7CisgIH0KKyAgRVhQRUNUX0VRKDAsIG9uX3N0YXJ0X2NvdW50ZXIpOworICBFWFBFQ1RfRkFMU0UoaXNfZGVzdHJveWVkKTsKKyAgZGVsZXRlIGxpc3RlbmVyOworfQorCisvLyBUZXN0cyB0aGF0IG5vIGV2ZW50cyBhcmUgZm9yd2FyZGVkIHdoZW4gZXZlbnQgZm9yd2FyZGluZyBpcyBkaXNhYmxlZC4KK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIFN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsIE5VTEwpOworCisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnM7CisgIGxpc3RlbmVycy5BcHBlbmQobGlzdGVuZXIpOworICBBU1NFUlRfVFJVRShUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6RXZlbnRGb3J3YXJkaW5nRW5hYmxlZChsaXN0ZW5lcnMpKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCZsaXN0ZW5lcnMpOworICBBU1NFUlRfRkFMU0UoVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQobGlzdGVuZXJzKSk7CisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG9uX3N0YXJ0X2NvdW50ZXIpOworfQorCisvLyBUZXN0cyB0aGF0IGV2ZW50cyBnZW5lcmF0ZWQgYnkgR29vZ2xlIFRlc3QgYXJlIG5vdCBmb3J3YXJkZWQgaW4KKy8vIGRlYXRoIHRlc3Qgc3VicHJvY2Vzc2VzLgorVEVTVChFdmVudExpc3RlbmVyRGVhdGhUZXN0LCBFdmVudHNOb3RGb3J3YXJkZWRJbkRlYXRoVGVzdFN1YnByZWNlc3NlcykgeworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHsKKyAgICAgIEdURVNUX0NIRUNLXyhUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6RXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgKKyAgICAgICAgICAqR2V0VW5pdFRlc3RJbXBsKCktPmxpc3RlbmVycygpKSkgPDwgImV4cGVjdGVkIGZhaWx1cmUiO30sCisgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIpOworfQorCisvLyBUZXN0cyB0aGF0IGEgbGlzdGVuZXIgaW5zdGFsbGVkIHZpYSBTZXREZWZhdWx0UmVzdWx0UHJpbnRlcigpIHN0YXJ0cworLy8gcmVjZWl2aW5nIGV2ZW50cyBhbmQgaXMgcmV0dXJuZWQgdmlhIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSBhbmQgdGhhdAorLy8gdGhlIHByZXZpb3VzIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFuZCBkZWxldGVkLgorVEVTVChFdmVudExpc3RlbmVyVGVzdCwgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcikgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoJmxpc3RlbmVycywgbGlzdGVuZXIpOworCisgIEVYUEVDVF9FUShsaXN0ZW5lciwgbGlzdGVuZXJzLmRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworCisgIEVYUEVDVF9FUSgxLCBvbl9zdGFydF9jb3VudGVyKTsKKworICAvLyBSZXBsYWNpbmcgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciB3aXRoIHNvbWV0aGluZyBlbHNlIHNob3VsZCByZW1vdmUgaXQKKyAgLy8gZnJvbSB0aGUgbGlzdCBhbmQgZGVzdHJveSBpdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKCZsaXN0ZW5lcnMsIE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGlzX2Rlc3Ryb3llZCk7CisKKyAgLy8gQWZ0ZXIgYnJvYWRjYXN0aW5nIGFuIGV2ZW50IHRoZSBjb3VudGVyIGlzIHN0aWxsIHRoZSBzYW1lLCBpbmRpY2F0aW5nCisgIC8vIHRoZSBsaXN0ZW5lciBpcyBub3QgaW4gdGhlIGxpc3QgYW55bW9yZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICBFWFBFQ1RfRVEoMSwgb25fc3RhcnRfY291bnRlcik7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgbGlzdGVuZXIgc3RvcHMgcmVjZWl2aW5nIGV2ZW50cworLy8gd2hlbiByZW1vdmVkIHZpYSBSZWxlYXNlIGFuZCB0aGF0IGlzIG5vdCBvd25lZCBieSB0aGUgbGlzdCBhbnltb3JlLgorVEVTVChFdmVudExpc3RlbmVyVGVzdCwgUmVtb3ZpbmdEZWZhdWx0UmVzdWx0UHJpbnRlcldvcmtzKSB7CisgIGludCBvbl9zdGFydF9jb3VudGVyID0gMDsKKyAgYm9vbCBpc19kZXN0cm95ZWQgPSBmYWxzZTsKKyAgLy8gQWx0aG91Z2ggQXBwZW5kIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IHRvIHRoZSBsaXN0LAorICAvLyB0aGUgZm9sbG93aW5nIGNhbGxzIHJlbGVhc2UgaXQsIGFuZCB3ZSBuZWVkIHRvIGRlbGV0ZSBpdCBiZWZvcmUgdGhlCisgIC8vIHRlc3QgZW5kcy4KKyAgVGVzdExpc3RlbmVyKiBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoJm9uX3N0YXJ0X2NvdW50ZXIsICZpc19kZXN0cm95ZWQpOworICB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzIGxpc3RlbmVyczsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoJmxpc3RlbmVycywgbGlzdGVuZXIpOworCisgICAgRVhQRUNUX0VRKGxpc3RlbmVyLCBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcikpOworICAgIEVYUEVDVF9UUlVFKGxpc3RlbmVycy5kZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkgPT0gTlVMTCk7CisgICAgRVhQRUNUX0ZBTFNFKGlzX2Rlc3Ryb3llZCk7CisKKyAgICAvLyBCcm9hZGNhc3RpbmcgZXZlbnRzIG5vdyBzaG91bGQgbm90IGFmZmVjdCBkZWZhdWx0X3Jlc3VsdF9wcmludGVyLgorICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgICAqVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkpOworICAgIEVYUEVDVF9FUSgwLCBvbl9zdGFydF9jb3VudGVyKTsKKyAgfQorICAvLyBEZXN0cm95aW5nIHRoZSBsaXN0IHNob3VsZCBub3QgYWZmZWN0IHRoZSBsaXN0ZW5lciBub3csIHRvby4KKyAgRVhQRUNUX0ZBTFNFKGlzX2Rlc3Ryb3llZCk7CisgIGRlbGV0ZSBsaXN0ZW5lcjsKK30KKworLy8gVGVzdHMgdGhhdCBhIGxpc3RlbmVyIGluc3RhbGxlZCB2aWEgU2V0RGVmYXVsdFhtbEdlbmVyYXRvcigpIHN0YXJ0cworLy8gcmVjZWl2aW5nIGV2ZW50cyBhbmQgaXMgcmV0dXJuZWQgdmlhIGRlZmF1bHRfeG1sX2dlbmVyYXRvcigpIGFuZCB0aGF0CisvLyB0aGUgcHJldmlvdXMgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhbmQgZGVsZXRlZC4KK1RFU1QoRXZlbnRMaXN0ZW5lclRlc3QsIGRlZmF1bHRfeG1sX2dlbmVyYXRvcikgeworICBpbnQgb25fc3RhcnRfY291bnRlciA9IDA7CisgIGJvb2wgaXNfZGVzdHJveWVkID0gZmFsc2U7CisgIFRlc3RMaXN0ZW5lciogbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCZvbl9zdGFydF9jb3VudGVyLCAmaXNfZGVzdHJveWVkKTsKKworICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworICBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3Nvcjo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcigmbGlzdGVuZXJzLCBsaXN0ZW5lcik7CisKKyAgRVhQRUNUX0VRKGxpc3RlbmVyLCBsaXN0ZW5lcnMuZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkpOworCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKworICBFWFBFQ1RfRVEoMSwgb25fc3RhcnRfY291bnRlcik7CisKKyAgLy8gUmVwbGFjaW5nIGRlZmF1bHRfeG1sX2dlbmVyYXRvciB3aXRoIHNvbWV0aGluZyBlbHNlIHNob3VsZCByZW1vdmUgaXQKKyAgLy8gZnJvbSB0aGUgbGlzdCBhbmQgZGVzdHJveSBpdC4KKyAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoJmxpc3RlbmVycywgTlVMTCk7CisKKyAgRVhQRUNUX1RSVUUobGlzdGVuZXJzLmRlZmF1bHRfeG1sX2dlbmVyYXRvcigpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShpc19kZXN0cm95ZWQpOworCisgIC8vIEFmdGVyIGJyb2FkY2FzdGluZyBhbiBldmVudCB0aGUgY291bnRlciBpcyBzdGlsbCB0aGUgc2FtZSwgaW5kaWNhdGluZworICAvLyB0aGUgbGlzdGVuZXIgaXMgbm90IGluIHRoZSBsaXN0IGFueW1vcmUuCisgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpHZXRSZXBlYXRlcigmbGlzdGVuZXJzKS0+T25UZXN0UHJvZ3JhbVN0YXJ0KAorICAgICAgKlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG9uX3N0YXJ0X2NvdW50ZXIpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBkZWZhdWx0X3htbF9nZW5lcmF0b3IgbGlzdGVuZXIgc3RvcHMgcmVjZWl2aW5nIGV2ZW50cworLy8gd2hlbiByZW1vdmVkIHZpYSBSZWxlYXNlIGFuZCB0aGF0IGlzIG5vdCBvd25lZCBieSB0aGUgbGlzdCBhbnltb3JlLgorVEVTVChFdmVudExpc3RlbmVyVGVzdCwgUmVtb3ZpbmdEZWZhdWx0WG1sR2VuZXJhdG9yV29ya3MpIHsKKyAgaW50IG9uX3N0YXJ0X2NvdW50ZXIgPSAwOworICBib29sIGlzX2Rlc3Ryb3llZCA9IGZhbHNlOworICAvLyBBbHRob3VnaCBBcHBlbmQgcGFzc2VzIHRoZSBvd25lcnNoaXAgb2YgdGhpcyBvYmplY3QgdG8gdGhlIGxpc3QsCisgIC8vIHRoZSBmb2xsb3dpbmcgY2FsbHMgcmVsZWFzZSBpdCwgYW5kIHdlIG5lZWQgdG8gZGVsZXRlIGl0IGJlZm9yZSB0aGUKKyAgLy8gdGVzdCBlbmRzLgorICBUZXN0TGlzdGVuZXIqIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigmb25fc3RhcnRfY291bnRlciwgJmlzX2Rlc3Ryb3llZCk7CisgIHsKKyAgICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzOworICAgIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOjpTZXREZWZhdWx0WG1sR2VuZXJhdG9yKCZsaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKworICAgIEVYUEVDVF9FUShsaXN0ZW5lciwgbGlzdGVuZXJzLlJlbGVhc2UobGlzdGVuZXIpKTsKKyAgICBFWFBFQ1RfVFJVRShsaXN0ZW5lcnMuZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgPT0gTlVMTCk7CisgICAgRVhQRUNUX0ZBTFNFKGlzX2Rlc3Ryb3llZCk7CisKKyAgICAvLyBCcm9hZGNhc3RpbmcgZXZlbnRzIG5vdyBzaG91bGQgbm90IGFmZmVjdCBkZWZhdWx0X3htbF9nZW5lcmF0b3IuCisgICAgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I6OkdldFJlcGVhdGVyKCZsaXN0ZW5lcnMpLT5PblRlc3RQcm9ncmFtU3RhcnQoCisgICAgICAgICpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSk7CisgICAgRVhQRUNUX0VRKDAsIG9uX3N0YXJ0X2NvdW50ZXIpOworICB9CisgIC8vIERlc3Ryb3lpbmcgdGhlIGxpc3Qgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGxpc3RlbmVyIG5vdywgdG9vLgorICBFWFBFQ1RfRkFMU0UoaXNfZGVzdHJveWVkKTsKKyAgZGVsZXRlIGxpc3RlbmVyOworfQorCisvLyBTYW5pdHkgdGVzdHMgdG8gZW5zdXJlIHRoYXQgdGhlIGFsdGVybmF0aXZlLCB2ZXJib3NlIHNwZWxsaW5ncyBvZgorLy8gc29tZSBvZiB0aGUgbWFjcm9zIHdvcmsuICBXZSBkb24ndCB0ZXN0IHRoZW0gdGhvcm91Z2hseSBhcyB0aGF0CisvLyB3b3VsZCBiZSBxdWl0ZSBpbnZvbHZlZC4gIFNpbmNlIHRoZWlyIGltcGxlbWVudGF0aW9ucyBhcmUKKy8vIHN0cmFpZ2h0Zm9yd2FyZCwgYW5kIHRoZXkgYXJlIHJhcmVseSB1c2VkLCB3ZSdsbCBqdXN0IHJlbHkgb24gdGhlCisvLyB1c2VycyB0byB0ZWxsIHVzIHdoZW4gdGhleSBhcmUgYnJva2VuLgorR1RFU1RfVEVTVChBbHRlcm5hdGl2ZU5hbWVUZXN0LCBXb3JrcykgeyAgLy8gR1RFU1RfVEVTVCBpcyB0aGUgc2FtZSBhcyBURVNULgorICBHVEVTVF9TVUNDRUVEKCkgPDwgIk9LIjsgIC8vIEdURVNUX1NVQ0NFRUQgaXMgdGhlIHNhbWUgYXMgU1VDQ0VFRC4KKworICAvLyBHVEVTVF9GQUlMIGlzIHRoZSBzYW1lIGFzIEZBSUwuCisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0ZBSUwoKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisKKyAgLy8gR1RFU1RfQVNTRVJUX1hZIGlzIHRoZSBzYW1lIGFzIEFTU0VSVF9YWS4KKworICBHVEVTVF9BU1NFUlRfRVEoMCwgMCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9FUSgwLCAxKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9FUSgxLCAwKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisKKyAgR1RFU1RfQVNTRVJUX05FKDAsIDEpOworICBHVEVTVF9BU1NFUlRfTkUoMSwgMCk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9ORSgwLCAwKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisKKyAgR1RFU1RfQVNTRVJUX0xFKDAsIDApOworICBHVEVTVF9BU1NFUlRfTEUoMCwgMSk7CisgIEVYUEVDVF9GQVRBTF9GQUlMVVJFKEdURVNUX0FTU0VSVF9MRSgxLCAwKSA8PCAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJBbiBleHBlY3RlZCBmYWlsdXJlIik7CisKKyAgR1RFU1RfQVNTRVJUX0xUKDAsIDEpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfTFQoMCwgMCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfTFQoMSwgMCkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIEdURVNUX0FTU0VSVF9HRSgwLCAwKTsKKyAgR1RFU1RfQVNTRVJUX0dFKDEsIDApOworICBFWFBFQ1RfRkFUQUxfRkFJTFVSRShHVEVTVF9BU1NFUlRfR0UoMCwgMSkgPDwgIkFuIGV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhwZWN0ZWQgZmFpbHVyZSIpOworCisgIEdURVNUX0FTU0VSVF9HVCgxLCAwKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0dUKDAsIDEpIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKKyAgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoR1RFU1RfQVNTRVJUX0dUKDEsIDEpIDw8ICJBbiBleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFuIGV4cGVjdGVkIGZhaWx1cmUiKTsKK30KKworLy8gVGVzdHMgZm9yIGludGVybmFsIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1bml2ZXJzYWwKKy8vIHByaW50aW5nLgorLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogRmluZCBhIGJldHRlciBob21lIGZvciB0aGVtLgorCitjbGFzcyBDb252ZXJzaW9uSGVscGVyQmFzZSB7fTsKK2NsYXNzIENvbnZlcnNpb25IZWxwZXJEZXJpdmVkIDogcHVibGljIENvbnZlcnNpb25IZWxwZXJCYXNlIHt9OworCisvLyBUZXN0cyB0aGF0IElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCitURVNUKElzQVByb3RvY29sTWVzc2FnZVRlc3QsIFZhbHVlSXNDb21waWxlVGltZUNvbnN0YW50KSB7CisgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhJc0FQcm90b2NvbE1lc3NhZ2U8UHJvdG9jb2xNZXNzYWdlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF90cnVlKTsKKyAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCFJc0FQcm90b2NvbE1lc3NhZ2U8aW50Pjo6dmFsdWUsIGNvbnN0X2ZhbHNlKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlIGlzIHRydWUgd2hlbiBUIGlzCisvLyBwcm90bzI6Ok1lc3NhZ2Ugb3IgYSBzdWItY2xhc3Mgb2YgaXQuCitURVNUKElzQVByb3RvY29sTWVzc2FnZVRlc3QsIFZhbHVlSXNUcnVlV2hlblR5cGVJc0FQcm90b2NvbE1lc3NhZ2UpIHsKKyAgRVhQRUNUX1RSVUUoSXNBUHJvdG9jb2xNZXNzYWdlPCA6OnByb3RvMjo6TWVzc2FnZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoSXNBUHJvdG9jb2xNZXNzYWdlPFByb3RvY29sTWVzc2FnZT46OnZhbHVlKTsKK30KKworLy8gVGVzdHMgdGhhdCBJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlIGlzIGZhbHNlIHdoZW4gVCBpcyBuZWl0aGVyCisvLyBQcm90b2NvbE1lc3NhZ2Ugbm9yIGEgc3ViLWNsYXNzIG9mIGl0LgorVEVTVChJc0FQcm90b2NvbE1lc3NhZ2VUZXN0LCBWYWx1ZUlzRmFsc2VXaGVuVHlwZUlzTm90QVByb3RvY29sTWVzc2FnZSkgeworICBFWFBFQ1RfRkFMU0UoSXNBUHJvdG9jb2xNZXNzYWdlPGludD46OnZhbHVlKTsKKyAgRVhQRUNUX0ZBTFNFKElzQVByb3RvY29sTWVzc2FnZTxjb25zdCBDb252ZXJzaW9uSGVscGVyQmFzZT46OnZhbHVlKTsKK30KKworLy8gVGVzdHMgdGhhdCBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbCBjb21waWxlcyB3aGVuIHRoZSB0eXBlIGFyZ3VtZW50cyBhcmUKKy8vIGVxdWFsLgorVEVTVChDb21waWxlQXNzZXJ0VHlwZXNFcXVhbCwgQ29tcGlsZXNXaGVuVHlwZXNBcmVFcXVhbCkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkLCB2b2lkPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQqLCBpbnQqPigpOworfQorCisvLyBUZXN0cyB0aGF0IFJlbW92ZVJlZmVyZW5jZSBkb2VzIG5vdCBhZmZlY3Qgbm9uLXJlZmVyZW5jZSB0eXBlcy4KK1RFU1QoUmVtb3ZlUmVmZXJlbmNlVGVzdCwgRG9lc05vdEFmZmVjdE5vblJlZmVyZW5jZVR5cGUpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBSZW1vdmVSZWZlcmVuY2U8aW50Pjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y29uc3QgY2hhciwgUmVtb3ZlUmVmZXJlbmNlPGNvbnN0IGNoYXI+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyB0aGF0IFJlbW92ZVJlZmVyZW5jZSByZW1vdmVzIHJlZmVyZW5jZSBmcm9tIHJlZmVyZW5jZSB0eXBlcy4KK1RFU1QoUmVtb3ZlUmVmZXJlbmNlVGVzdCwgUmVtb3Zlc1JlZmVyZW5jZSkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQsIFJlbW92ZVJlZmVyZW5jZTxpbnQmPjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y29uc3QgY2hhciwgUmVtb3ZlUmVmZXJlbmNlPGNvbnN0IGNoYXImPjo6dHlwZT4oKTsKK30KKworLy8gVGVzdHMgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFRlc3RHVGVzdFJlbW92ZVJlZmVyZW5jZSgpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQyKT4oKTsKK30KKworVEVTVChSZW1vdmVSZWZlcmVuY2VUZXN0LCBNYWNyb1ZlcnNpb24pIHsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlPGludCwgaW50PigpOworICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2U8Y29uc3QgY2hhciwgY29uc3QgY2hhciY+KCk7Cit9CisKKworLy8gVGVzdHMgdGhhdCBSZW1vdmVDb25zdCBkb2VzIG5vdCBhZmZlY3Qgbm9uLWNvbnN0IHR5cGVzLgorVEVTVChSZW1vdmVDb25zdFRlc3QsIERvZXNOb3RBZmZlY3ROb25Db25zdFR5cGUpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBSZW1vdmVDb25zdDxpbnQ+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjaGFyJiwgUmVtb3ZlQ29uc3Q8Y2hhciY+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyB0aGF0IFJlbW92ZUNvbnN0IHJlbW92ZXMgY29uc3QgZnJvbSBjb25zdCB0eXBlcy4KK1RFU1QoUmVtb3ZlQ29uc3RUZXN0LCBSZW1vdmVzQ29uc3QpIHsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8aW50LCBSZW1vdmVDb25zdDxjb25zdCBpbnQ+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjaGFyWzJdLCBSZW1vdmVDb25zdDxjb25zdCBjaGFyWzJdPjo6dHlwZT4oKTsKKyAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8Y2hhclsyXVszXSwgUmVtb3ZlQ29uc3Q8Y29uc3QgY2hhclsyXVszXT46OnR5cGU+KCk7Cit9CisKKy8vIFRlc3RzIEdURVNUX1JFTU9WRV9DT05TVF8uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFRlc3RHVGVzdFJlbW92ZUNvbnN0KCkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxUMSwgR1RFU1RfUkVNT1ZFX0NPTlNUXyhUMik+KCk7Cit9CisKK1RFU1QoUmVtb3ZlQ29uc3RUZXN0LCBNYWNyb1ZlcnNpb24pIHsKKyAgVGVzdEdUZXN0UmVtb3ZlQ29uc3Q8aW50LCBpbnQ+KCk7CisgIFRlc3RHVGVzdFJlbW92ZUNvbnN0PGRvdWJsZSYsIGRvdWJsZSY+KCk7CisgIFRlc3RHVGVzdFJlbW92ZUNvbnN0PGNoYXIsIGNvbnN0IGNoYXI+KCk7Cit9CisKKy8vIFRlc3RzIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3QoKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVDIpPigpOworfQorCitURVNUKFJlbW92ZVJlZmVyZW5jZVRvQ29uc3RUZXN0LCBXb3JrcykgeworICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdDxpbnQsIGludD4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3Q8ZG91YmxlLCBkb3VibGUmPigpOworICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdDxjaGFyLCBjb25zdCBjaGFyPigpOworICBUZXN0R1Rlc3RSZW1vdmVSZWZlcmVuY2VBbmRDb25zdDxjaGFyLCBjb25zdCBjaGFyJj4oKTsKKyAgVGVzdEdUZXN0UmVtb3ZlUmVmZXJlbmNlQW5kQ29uc3Q8Y29uc3QgY2hhciosIGNvbnN0IGNoYXIqPigpOworfQorCisvLyBUZXN0cyB0aGF0IEFkZFJlZmVyZW5jZSBkb2VzIG5vdCBhZmZlY3QgcmVmZXJlbmNlIHR5cGVzLgorVEVTVChBZGRSZWZlcmVuY2VUZXN0LCBEb2VzTm90QWZmZWN0UmVmZXJlbmNlVHlwZSkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxpbnQmLCBBZGRSZWZlcmVuY2U8aW50Jj46OnR5cGU+KCk7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGNvbnN0IGNoYXImLCBBZGRSZWZlcmVuY2U8Y29uc3QgY2hhciY+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyB0aGF0IEFkZFJlZmVyZW5jZSBhZGRzIHJlZmVyZW5jZSB0byBub24tcmVmZXJlbmNlIHR5cGVzLgorVEVTVChBZGRSZWZlcmVuY2VUZXN0LCBBZGRzUmVmZXJlbmNlKSB7CisgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPGludCYsIEFkZFJlZmVyZW5jZTxpbnQ+Ojp0eXBlPigpOworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxjb25zdCBjaGFyJiwgQWRkUmVmZXJlbmNlPGNvbnN0IGNoYXI+Ojp0eXBlPigpOworfQorCisvLyBUZXN0cyBHVEVTVF9BRERfUkVGRVJFTkNFXy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3ZvaWQgVGVzdEdUZXN0QWRkUmVmZXJlbmNlKCkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxUMSwgR1RFU1RfQUREX1JFRkVSRU5DRV8oVDIpPigpOworfQorCitURVNUKEFkZFJlZmVyZW5jZVRlc3QsIE1hY3JvVmVyc2lvbikgeworICBUZXN0R1Rlc3RBZGRSZWZlcmVuY2U8aW50JiwgaW50PigpOworICBUZXN0R1Rlc3RBZGRSZWZlcmVuY2U8Y29uc3QgY2hhciYsIGNvbnN0IGNoYXImPigpOworfQorCisvLyBUZXN0cyBHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1RfLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordm9pZCBUZXN0R1Rlc3RSZWZlcmVuY2VUb0NvbnN0KCkgeworICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxUMSwgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhUMik+KCk7Cit9CisKK1RFU1QoR1Rlc3RSZWZlcmVuY2VUb0NvbnN0VGVzdCwgV29ya3MpIHsKKyAgVGVzdEdUZXN0UmVmZXJlbmNlVG9Db25zdDxjb25zdCBjaGFyJiwgY2hhcj4oKTsKKyAgVGVzdEdUZXN0UmVmZXJlbmNlVG9Db25zdDxjb25zdCBpbnQmLCBjb25zdCBpbnQ+KCk7CisgIFRlc3RHVGVzdFJlZmVyZW5jZVRvQ29uc3Q8Y29uc3QgZG91YmxlJiwgZG91YmxlPigpOworICBUZXN0R1Rlc3RSZWZlcmVuY2VUb0NvbnN0PGNvbnN0IHN0ZDo6c3RyaW5nJiwgY29uc3Qgc3RkOjpzdHJpbmcmPigpOworfQorCisvLyBUZXN0cyB0aGF0IEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUMSwgVDI+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KK1RFU1QoSW1wbGljaXRseUNvbnZlcnRpYmxlVGVzdCwgVmFsdWVJc0NvbXBpbGVUaW1lQ29uc3RhbnQpIHsKKyAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKChJbXBsaWNpdGx5Q29udmVydGlibGU8aW50LCBpbnQ+Ojp2YWx1ZSksIGNvbnN0X3RydWUpOworICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKCFJbXBsaWNpdGx5Q29udmVydGlibGU8dm9pZCosIGludCo+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9mYWxzZSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgSW1wbGljaXRseUNvbnZlcnRpYmxlPFQxLCBUMj46OnZhbHVlIGlzIHRydWUgd2hlbiBUMSBjYW4KKy8vIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIFQyLgorVEVTVChJbXBsaWNpdGx5Q29udmVydGlibGVUZXN0LCBWYWx1ZUlzVHJ1ZVdoZW5Db252ZXJ0aWJsZSkgeworICBFWFBFQ1RfVFJVRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGludCwgZG91YmxlPjo6dmFsdWUpKTsKKyAgRVhQRUNUX1RSVUUoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxkb3VibGUsIGludD46OnZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKChJbXBsaWNpdGx5Q29udmVydGlibGU8aW50Kiwgdm9pZCo+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGludCosIGNvbnN0IGludCo+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPENvbnZlcnNpb25IZWxwZXJEZXJpdmVkJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb252ZXJzaW9uSGVscGVyQmFzZSY+Ojp2YWx1ZSkpOworICBFWFBFQ1RfVFJVRSgoSW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IENvbnZlcnNpb25IZWxwZXJCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb25IZWxwZXJCYXNlPjo6dmFsdWUpKTsKK30KKworLy8gVGVzdHMgdGhhdCBJbXBsaWNpdGx5Q29udmVydGlibGU8VDEsIFQyPjo6dmFsdWUgaXMgZmFsc2Ugd2hlbiBUMQorLy8gY2Fubm90IGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIFQyLgorVEVTVChJbXBsaWNpdGx5Q29udmVydGlibGVUZXN0LCBWYWx1ZUlzRmFsc2VXaGVuTm90Q29udmVydGlibGUpIHsKKyAgRVhQRUNUX0ZBTFNFKChJbXBsaWNpdGx5Q29udmVydGlibGU8ZG91YmxlLCBpbnQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChJbXBsaWNpdGx5Q29udmVydGlibGU8dm9pZCosIGludCo+Ojp2YWx1ZSkpOworICBFWFBFQ1RfRkFMU0UoKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBpbnQqLCBpbnQqPjo6dmFsdWUpKTsKKyAgRVhQRUNUX0ZBTFNFKChJbXBsaWNpdGx5Q29udmVydGlibGU8Q29udmVyc2lvbkhlbHBlckJhc2UmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uSGVscGVyRGVyaXZlZCY+Ojp2YWx1ZSkpOworfQorCisvLyBUZXN0cyBJc0NvbnRhaW5lclRlc3QuCisKK2NsYXNzIE5vbkNvbnRhaW5lciB7fTsKKworVEVTVChJc0NvbnRhaW5lclRlc3RUZXN0LCBXb3Jrc0Zvck5vbkNvbnRhaW5lcikgeworICBFWFBFQ1RfRVEoc2l6ZW9mKElzTm90Q29udGFpbmVyKSwgc2l6ZW9mKElzQ29udGFpbmVyVGVzdDxpbnQ+KDApKSk7CisgIEVYUEVDVF9FUShzaXplb2YoSXNOb3RDb250YWluZXIpLCBzaXplb2YoSXNDb250YWluZXJUZXN0PGNoYXJbNV0+KDApKSk7CisgIEVYUEVDVF9FUShzaXplb2YoSXNOb3RDb250YWluZXIpLCBzaXplb2YoSXNDb250YWluZXJUZXN0PE5vbkNvbnRhaW5lcj4oMCkpKTsKK30KKworVEVTVChJc0NvbnRhaW5lclRlc3RUZXN0LCBXb3Jrc0ZvckNvbnRhaW5lcikgeworICBFWFBFQ1RfRVEoc2l6ZW9mKElzQ29udGFpbmVyKSwKKyAgICAgICAgICAgIHNpemVvZihJc0NvbnRhaW5lclRlc3Q8c3RkOjp2ZWN0b3I8Ym9vbD4gPigwKSkpOworICBFWFBFQ1RfRVEoc2l6ZW9mKElzQ29udGFpbmVyKSwKKyAgICAgICAgICAgIHNpemVvZihJc0NvbnRhaW5lclRlc3Q8c3RkOjptYXA8aW50LCBkb3VibGU+ID4oMCkpKTsKK30KKworLy8gVGVzdHMgQXJyYXlFcSgpLgorCitURVNUKEFycmF5RXFUZXN0LCBXb3Jrc0ZvckRlZ2VuZXJhdGVkQXJyYXlzKSB7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoNSwgNUwpKTsKKyAgRVhQRUNUX0ZBTFNFKEFycmF5RXEoJ2EnLCAwKSk7Cit9CisKK1RFU1QoQXJyYXlFcVRlc3QsIFdvcmtzRm9yT25lRGltZW5zaW9uYWxBcnJheXMpIHsKKyAgLy8gTm90ZSB0aGF0IGEgYW5kIGIgYXJlIGRpc3RpbmN0IGJ1dCBjb21wYXRpYmxlIHR5cGVzLgorICBjb25zdCBpbnQgYVtdID0geyAwLCAxIH07CisgIGxvbmcgYltdID0geyAwLCAxIH07CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYikpOworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIDIsIGIpKTsKKworICBiWzBdID0gMjsKKyAgRVhQRUNUX0ZBTFNFKEFycmF5RXEoYSwgYikpOworICBFWFBFQ1RfRkFMU0UoQXJyYXlFcShhLCAxLCBiKSk7Cit9CisKK1RFU1QoQXJyYXlFcVRlc3QsIFdvcmtzRm9yVHdvRGltZW5zaW9uYWxBcnJheXMpIHsKKyAgY29uc3QgY2hhciBhW11bM10gPSB7ICJoaSIsICJsbyIgfTsKKyAgY29uc3QgY2hhciBiW11bM10gPSB7ICJoaSIsICJsbyIgfTsKKyAgY29uc3QgY2hhciBjW11bM10gPSB7ICJoaSIsICJsaSIgfTsKKworICBFWFBFQ1RfVFJVRShBcnJheUVxKGEsIGIpKTsKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCAyLCBiKSk7CisKKyAgRVhQRUNUX0ZBTFNFKEFycmF5RXEoYSwgYykpOworICBFWFBFQ1RfRkFMU0UoQXJyYXlFcShhLCAyLCBjKSk7Cit9CisKKy8vIFRlc3RzIEFycmF5QXdhcmVGaW5kKCkuCisKK1RFU1QoQXJyYXlBd2FyZUZpbmRUZXN0LCBXb3Jrc0Zvck9uZURpbWVuc2lvbmFsQXJyYXkpIHsKKyAgY29uc3QgY2hhciBhW10gPSAiaGVsbG8iOworICBFWFBFQ1RfRVEoYSArIDQsIEFycmF5QXdhcmVGaW5kKGEsIGEgKyA1LCAnbycpKTsKKyAgRVhQRUNUX0VRKGEgKyA1LCBBcnJheUF3YXJlRmluZChhLCBhICsgNSwgJ3gnKSk7Cit9CisKK1RFU1QoQXJyYXlBd2FyZUZpbmRUZXN0LCBXb3Jrc0ZvclR3b0RpbWVuc2lvbmFsQXJyYXkpIHsKKyAgaW50IGFbXVsyXSA9IHsgeyAwLCAxIH0sIHsgMiwgMyB9LCB7IDQsIDUgfSB9OworICBjb25zdCBpbnQgYlsyXSA9IHsgMiwgMyB9OworICBFWFBFQ1RfRVEoYSArIDEsIEFycmF5QXdhcmVGaW5kKGEsIGEgKyAzLCBiKSk7CisKKyAgY29uc3QgaW50IGNbMl0gPSB7IDYsIDcgfTsKKyAgRVhQRUNUX0VRKGEgKyAzLCBBcnJheUF3YXJlRmluZChhLCBhICsgMywgYykpOworfQorCisvLyBUZXN0cyBDb3B5QXJyYXkoKS4KKworVEVTVChDb3B5QXJyYXlUZXN0LCBXb3Jrc0ZvckRlZ2VuZXJhdGVkQXJyYXlzKSB7CisgIGludCBuID0gMDsKKyAgQ29weUFycmF5KCdhJywgJm4pOworICBFWFBFQ1RfRVEoJ2EnLCBuKTsKK30KKworVEVTVChDb3B5QXJyYXlUZXN0LCBXb3Jrc0Zvck9uZURpbWVuc2lvbmFsQXJyYXlzKSB7CisgIGNvbnN0IGNoYXIgYVszXSA9ICJoaSI7CisgIGludCBiWzNdOworI2lmbmRlZiBfX0JPUkxBTkRDX18gIC8vIEMrK0J1aWxkZXIgY2Fubm90IGNvbXBpbGUgc29tZSBhcnJheSBzaXplIGRlZHVjdGlvbnMuCisgIENvcHlBcnJheShhLCAmYik7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYikpOworI2VuZGlmCisKKyAgaW50IGNbM107CisgIENvcHlBcnJheShhLCAzLCBjKTsKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBjKSk7Cit9CisKK1RFU1QoQ29weUFycmF5VGVzdCwgV29ya3NGb3JUd29EaW1lbnNpb25hbEFycmF5cykgeworICBjb25zdCBpbnQgYVsyXVszXSA9IHsgeyAwLCAxLCAyIH0sIHsgMywgNCwgNSB9IH07CisgIGludCBiWzJdWzNdOworI2lmbmRlZiBfX0JPUkxBTkRDX18gIC8vIEMrK0J1aWxkZXIgY2Fubm90IGNvbXBpbGUgc29tZSBhcnJheSBzaXplIGRlZHVjdGlvbnMuCisgIENvcHlBcnJheShhLCAmYik7CisgIEVYUEVDVF9UUlVFKEFycmF5RXEoYSwgYikpOworI2VuZGlmCisKKyAgaW50IGNbMl1bM107CisgIENvcHlBcnJheShhLCAyLCBjKTsKKyAgRVhQRUNUX1RSVUUoQXJyYXlFcShhLCBjKSk7Cit9CisKKy8vIFRlc3RzIE5hdGl2ZUFycmF5LgorCitURVNUKE5hdGl2ZUFycmF5VGVzdCwgQ29uc3RydWN0b3JGcm9tQXJyYXlXb3JrcykgeworICBjb25zdCBpbnQgYVszXSA9IHsgMCwgMSwgMiB9OworICBOYXRpdmVBcnJheTxpbnQ+IG5hKGEsIDMsIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7CisgIEVYUEVDVF9FUSgzVSwgbmEuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGEsIG5hLmJlZ2luKCkpOworfQorCitURVNUKE5hdGl2ZUFycmF5VGVzdCwgQ3JlYXRlc0FuZERlbGV0ZXNDb3B5T2ZBcnJheVdoZW5Bc2tlZFRvKSB7CisgIHR5cGVkZWYgaW50IEFycmF5WzJdOworICBBcnJheSogYSA9IG5ldyBBcnJheVsxXTsKKyAgKCphKVswXSA9IDA7CisgICgqYSlbMV0gPSAxOworICBOYXRpdmVBcnJheTxpbnQ+IG5hKCphLCAyLCBSZWxhdGlvblRvU291cmNlQ29weSgpKTsKKyAgRVhQRUNUX05FKCphLCBuYS5iZWdpbigpKTsKKyAgZGVsZXRlW10gYTsKKyAgRVhQRUNUX0VRKDAsIG5hLmJlZ2luKClbMF0pOworICBFWFBFQ1RfRVEoMSwgbmEuYmVnaW4oKVsxXSk7CisKKyAgLy8gV2UgcmVseSBvbiB0aGUgaGVhcCBjaGVja2VyIHRvIHZlcmlmeSB0aGF0IG5hIGRlbGV0ZXMgdGhlIGNvcHkgb2YKKyAgLy8gYXJyYXkuCit9CisKK1RFU1QoTmF0aXZlQXJyYXlUZXN0LCBUeXBlTWVtYmVyc0FyZUNvcnJlY3QpIHsKKyAgU3RhdGljQXNzZXJ0VHlwZUVxPGNoYXIsIE5hdGl2ZUFycmF5PGNoYXI+Ojp2YWx1ZV90eXBlPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8aW50WzJdLCBOYXRpdmVBcnJheTxpbnRbMl0+Ojp2YWx1ZV90eXBlPigpOworCisgIFN0YXRpY0Fzc2VydFR5cGVFcTxjb25zdCBjaGFyKiwgTmF0aXZlQXJyYXk8Y2hhcj46OmNvbnN0X2l0ZXJhdG9yPigpOworICBTdGF0aWNBc3NlcnRUeXBlRXE8Y29uc3QgYm9vbCgqKVsyXSwgTmF0aXZlQXJyYXk8Ym9vbFsyXT46OmNvbnN0X2l0ZXJhdG9yPigpOworfQorCitURVNUKE5hdGl2ZUFycmF5VGVzdCwgTWV0aG9kc1dvcmspIHsKKyAgY29uc3QgaW50IGFbM10gPSB7IDAsIDEsIDIgfTsKKyAgTmF0aXZlQXJyYXk8aW50PiBuYShhLCAzLCBSZWxhdGlvblRvU291cmNlQ29weSgpKTsKKyAgQVNTRVJUX0VRKDNVLCBuYS5zaXplKCkpOworICBFWFBFQ1RfRVEoMywgbmEuZW5kKCkgLSBuYS5iZWdpbigpKTsKKworICBOYXRpdmVBcnJheTxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG5hLmJlZ2luKCk7CisgIEVYUEVDVF9FUSgwLCAqaXQpOworICArK2l0OworICBFWFBFQ1RfRVEoMSwgKml0KTsKKyAgaXQrKzsKKyAgRVhQRUNUX0VRKDIsICppdCk7CisgICsraXQ7CisgIEVYUEVDVF9FUShuYS5lbmQoKSwgaXQpOworCisgIEVYUEVDVF9UUlVFKG5hID09IG5hKTsKKworICBOYXRpdmVBcnJheTxpbnQ+IG5hMihhLCAzLCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKCkpOworICBFWFBFQ1RfVFJVRShuYSA9PSBuYTIpOworCisgIGNvbnN0IGludCBiMVszXSA9IHsgMCwgMSwgMSB9OworICBjb25zdCBpbnQgYjJbNF0gPSB7IDAsIDEsIDIsIDMgfTsKKyAgRVhQRUNUX0ZBTFNFKG5hID09IE5hdGl2ZUFycmF5PGludD4oYjEsIDMsIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSkpOworICBFWFBFQ1RfRkFMU0UobmEgPT0gTmF0aXZlQXJyYXk8aW50PihiMiwgNCwgUmVsYXRpb25Ub1NvdXJjZUNvcHkoKSkpOworfQorCitURVNUKE5hdGl2ZUFycmF5VGVzdCwgV29ya3NGb3JUd29EaW1lbnNpb25hbEFycmF5KSB7CisgIGNvbnN0IGNoYXIgYVsyXVszXSA9IHsgImhpIiwgImxvIiB9OworICBOYXRpdmVBcnJheTxjaGFyWzNdPiBuYShhLCAyLCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKCkpOworICBBU1NFUlRfRVEoMlUsIG5hLnNpemUoKSk7CisgIEVYUEVDVF9FUShhLCBuYS5iZWdpbigpKTsKK30KKworLy8gVGVzdHMgU2tpcFByZWZpeCgpLgorCitURVNUKFNraXBQcmVmaXhUZXN0LCBTa2lwc1doZW5QcmVmaXhNYXRjaGVzKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9ICJoZWxsbyI7CisKKyAgY29uc3QgY2hhciogcCA9IHN0cjsKKyAgRVhQRUNUX1RSVUUoU2tpcFByZWZpeCgiIiwgJnApKTsKKyAgRVhQRUNUX0VRKHN0ciwgcCk7CisKKyAgcCA9IHN0cjsKKyAgRVhQRUNUX1RSVUUoU2tpcFByZWZpeCgiaGVsbCIsICZwKSk7CisgIEVYUEVDVF9FUShzdHIgKyA0LCBwKTsKK30KKworVEVTVChTa2lwUHJlZml4VGVzdCwgRG9lc05vdFNraXBXaGVuUHJlZml4RG9lc05vdE1hdGNoKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9ICJ3b3JsZCI7CisKKyAgY29uc3QgY2hhciogcCA9IHN0cjsKKyAgRVhQRUNUX0ZBTFNFKFNraXBQcmVmaXgoIlciLCAmcCkpOworICBFWFBFQ1RfRVEoc3RyLCBwKTsKKworICBwID0gc3RyOworICBFWFBFQ1RfRkFMU0UoU2tpcFByZWZpeCgid29ybGQhIiwgJnApKTsKKyAgRVhQRUNUX0VRKHN0ciwgcCk7Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMV90ZXN0Xy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlMV90ZXN0Xy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzFjZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGUxX3Rlc3RfLmNjCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8gd3JpdGVzIHNvbWUgeG1sIHZpYSBUZXN0UHJvcGVydHkgdXNlZCBieQorLy8gZ3Rlc3RfeG1sX291dGZpbGVzX3Rlc3QucHkKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIFByb3BlcnR5T25lIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIFJlY29yZFByb3BlcnR5KCJTZXRVcFByb3AiLCAxKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgUmVjb3JkUHJvcGVydHkoIlRlYXJEb3duUHJvcCIsIDEpOworICB9Cit9OworCitURVNUX0YoUHJvcGVydHlPbmUsIFRlc3RTb21lUHJvcGVydGllcykgeworICBSZWNvcmRQcm9wZXJ0eSgiVGVzdFNvbWVQcm9wZXJ0eSIsIDEpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfLmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dGZpbGUyX3Rlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDAwYjIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZTJfdGVzdF8uY2MKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQorLy8KKy8vIGd0ZXN0X3htbF9vdXRmaWxlMl90ZXN0XyB3cml0ZXMgc29tZSB4bWwgdmlhIFRlc3RQcm9wZXJ0eSB1c2VkIGJ5CisvLyBndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weQorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworY2xhc3MgUHJvcGVydHlUd28gOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgUmVjb3JkUHJvcGVydHkoIlNldFVwUHJvcCIsIDIpOworICB9CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiVGVhckRvd25Qcm9wIiwgMik7CisgIH0KK307CisKK1RFU1RfRihQcm9wZXJ0eVR3bywgVGVzdFNvbWVQcm9wZXJ0aWVzKSB7CisgIFJlY29yZFByb3BlcnR5KCJUZXN0U29tZVByb3BlcnR5IiwgMik7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRmaWxlc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyNGU0MzcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdC5weQpAQCAtMCwwICsxLDEzMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0IGZvciB0aGUgZ3Rlc3RfeG1sX291dHB1dCBtb2R1bGUuIiIiCisKK19fYXV0aG9yX18gPSAia2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KSIKKworaW1wb3J0IG9zCitmcm9tIHhtbC5kb20gaW1wb3J0IG1pbmlkb20sIE5vZGUKKworaW1wb3J0IGd0ZXN0X3Rlc3RfdXRpbHMKK2ltcG9ydCBndGVzdF94bWxfdGVzdF91dGlscworCisKK0dURVNUX09VVFBVVF9TVUJESVIgPSAieG1sX291dGZpbGVzIgorR1RFU1RfT1VUUFVUXzFfVEVTVCA9ICJndGVzdF94bWxfb3V0ZmlsZTFfdGVzdF8iCitHVEVTVF9PVVRQVVRfMl9URVNUID0gImd0ZXN0X3htbF9vdXRmaWxlMl90ZXN0XyIKKworRVhQRUNURURfWE1MXzEgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHRlc3RzdWl0ZXMgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIiB0aW1lc3RhbXA9IioiIG5hbWU9IkFsbFRlc3RzIj4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJQcm9wZXJ0eU9uZSIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iVGVzdFNvbWVQcm9wZXJ0aWVzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eU9uZSIgU2V0VXBQcm9wPSIxIiBUZXN0U29tZVByb3BlcnR5PSIxIiBUZWFyRG93blByb3A9IjEiIC8+CisgIDwvdGVzdHN1aXRlPgorPC90ZXN0c3VpdGVzPgorIiIiCisKK0VYUEVDVEVEX1hNTF8yID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIgdGltZXN0YW1wPSIqIiBuYW1lPSJBbGxUZXN0cyI+CisgIDx0ZXN0c3VpdGUgbmFtZT0iUHJvcGVydHlUd28iIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IlRlc3RTb21lUHJvcGVydGllcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iUHJvcGVydHlUd28iIFNldFVwUHJvcD0iMiIgVGVzdFNvbWVQcm9wZXJ0eT0iMiIgVGVhckRvd25Qcm9wPSIyIiAvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4KKyIiIgorCisKK2NsYXNzIEdUZXN0WE1MT3V0RmlsZXNUZXN0KGd0ZXN0X3htbF90ZXN0X3V0aWxzLkdUZXN0WE1MVGVzdENhc2UpOgorICAiIiJVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0J3MgWE1MIG91dHB1dCBmdW5jdGlvbmFsaXR5LiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICAjIFdlIHdhbnQgdGhlIHRyYWlsaW5nICcvJyB0aGF0IHRoZSBsYXN0ICIiIHByb3ZpZGVzIGluIG9zLnBhdGguam9pbiwgZm9yCisgICAgIyB0ZWxsaW5nIEdvb2dsZSBUZXN0IHRvIGNyZWF0ZSBhbiBvdXRwdXQgZGlyZWN0b3J5IGluc3RlYWQgb2YgYSBzaW5nbGUgZmlsZQorICAgICMgZm9yIHhtbCBvdXRwdXQuCisgICAgc2VsZi5vdXRwdXRfZGlyXyA9IG9zLnBhdGguam9pbihndGVzdF90ZXN0X3V0aWxzLkdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX09VVFBVVF9TVUJESVIsICIiKQorICAgIHNlbGYuRGVsZXRlRmlsZXNBbmREaXIoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLkRlbGV0ZUZpbGVzQW5kRGlyKCkKKworICBkZWYgRGVsZXRlRmlsZXNBbmREaXIoc2VsZik6CisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBHVEVTVF9PVVRQVVRfMV9URVNUICsgIi54bWwiKSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJfLCBHVEVTVF9PVVRQVVRfMl9URVNUICsgIi54bWwiKSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgb3Mucm1kaXIoc2VsZi5vdXRwdXRfZGlyXykKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICBwYXNzCisKKyAgZGVmIHRlc3RPdXRmaWxlMShzZWxmKToKKyAgICBzZWxmLl9UZXN0T3V0RmlsZShHVEVTVF9PVVRQVVRfMV9URVNULCBFWFBFQ1RFRF9YTUxfMSkKKworICBkZWYgdGVzdE91dGZpbGUyKHNlbGYpOgorICAgIHNlbGYuX1Rlc3RPdXRGaWxlKEdURVNUX09VVFBVVF8yX1RFU1QsIEVYUEVDVEVEX1hNTF8yKQorCisgIGRlZiBfVGVzdE91dEZpbGUoc2VsZiwgdGVzdF9uYW1lLCBleHBlY3RlZF94bWwpOgorICAgIGd0ZXN0X3Byb2dfcGF0aCA9IGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVzdEV4ZWN1dGFibGVQYXRoKHRlc3RfbmFtZSkKKyAgICBjb21tYW5kID0gW2d0ZXN0X3Byb2dfcGF0aCwgIi0tZ3Rlc3Rfb3V0cHV0PXhtbDolcyIgJSBzZWxmLm91dHB1dF9kaXJfXQorICAgIHAgPSBndGVzdF90ZXN0X3V0aWxzLlN1YnByb2Nlc3MoY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfZGlyPWd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpKQorICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBwLmV4aXRfY29kZSkKKworICAgICMgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxpYnRvb2wgY2F1c2VzIHRoZSBidWlsdCB0ZXN0IGJpbmFyeSB0byBiZQorICAgICMgICBuYW1lZCBsdC1ndGVzdF94bWxfb3V0ZmlsZXNfdGVzdF8gaW5zdGVhZCBvZgorICAgICMgICBndGVzdF94bWxfb3V0ZmlsZXNfdGVzdF8uICBUbyBhY2NvdW50IGZvciB0aGlzIHBvc3NpYmlsbGl0eSwgd2UKKyAgICAjICAgYWxsb3cgYm90aCBuYW1lcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuICBXZSBzaG91bGQgcmVtb3ZlIHRoaXMKKyAgICAjICAgaGFjayB3aGVuIENoYW5kbGVyIENhcnJ1dGgncyBsaWJ0b29sIHJlcGxhY2VtZW50IHRvb2wgaXMgcmVhZHkuCisgICAgb3V0cHV0X2ZpbGVfbmFtZTEgPSB0ZXN0X25hbWUgKyAiLnhtbCIKKyAgICBvdXRwdXRfZmlsZTEgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyXywgb3V0cHV0X2ZpbGVfbmFtZTEpCisgICAgb3V0cHV0X2ZpbGVfbmFtZTIgPSAnbHQtJyArIG91dHB1dF9maWxlX25hbWUxCisgICAgb3V0cHV0X2ZpbGUyID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpcl8sIG91dHB1dF9maWxlX25hbWUyKQorICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmlzZmlsZShvdXRwdXRfZmlsZTEpIG9yIG9zLnBhdGguaXNmaWxlKG91dHB1dF9maWxlMiksCisgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlMSkKKworICAgIGV4cGVjdGVkID0gbWluaWRvbS5wYXJzZVN0cmluZyhleHBlY3RlZF94bWwpCisgICAgaWYgb3MucGF0aC5pc2ZpbGUob3V0cHV0X2ZpbGUxKToKKyAgICAgIGFjdHVhbCA9IG1pbmlkb20ucGFyc2Uob3V0cHV0X2ZpbGUxKQorICAgIGVsc2U6CisgICAgICBhY3R1YWwgPSBtaW5pZG9tLnBhcnNlKG91dHB1dF9maWxlMikKKyAgICBzZWxmLk5vcm1hbGl6ZVhtbChhY3R1YWwuZG9jdW1lbnRFbGVtZW50KQorICAgIHNlbGYuQXNzZXJ0RXF1aXZhbGVudE5vZGVzKGV4cGVjdGVkLmRvY3VtZW50RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwuZG9jdW1lbnRFbGVtZW50KQorICAgIGV4cGVjdGVkLnVubGluaygpCisgICAgYWN0dWFsLnVubGluaygpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgb3MuZW52aXJvblsiR1RFU1RfU1RBQ0tfVFJBQ0VfREVQVEgiXSA9ICIwIgorICBndGVzdF90ZXN0X3V0aWxzLk1haW4oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdC5weSBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjYwNWQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwzMDcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCBmb3IgdGhlIGd0ZXN0X3htbF9vdXRwdXQgbW9kdWxlIiIiCisKK19fYXV0aG9yX18gPSAnZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpJworCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBlcnJubworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbSwgTm9kZQorCitpbXBvcnQgZ3Rlc3RfdGVzdF91dGlscworaW1wb3J0IGd0ZXN0X3htbF90ZXN0X3V0aWxzCisKKworR1RFU1RfRklMVEVSX0ZMQUcgPSAnLS1ndGVzdF9maWx0ZXInCitHVEVTVF9MSVNUX1RFU1RTX0ZMQUcgPSAnLS1ndGVzdF9saXN0X3Rlc3RzJworR1RFU1RfT1VUUFVUX0ZMQUcgICAgICAgICA9ICItLWd0ZXN0X291dHB1dCIKK0dURVNUX0RFRkFVTFRfT1VUUFVUX0ZJTEUgPSAidGVzdF9kZXRhaWwueG1sIgorR1RFU1RfUFJPR1JBTV9OQU1FID0gImd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfIgorCitTVVBQT1JUU19TVEFDS19UUkFDRVMgPSBGYWxzZQorCitpZiBTVVBQT1JUU19TVEFDS19UUkFDRVM6CisgIFNUQUNLX1RSQUNFX1RFTVBMQVRFID0gJ1xuU3RhY2sgdHJhY2U6XG4qJworZWxzZToKKyAgU1RBQ0tfVFJBQ0VfVEVNUExBVEUgPSAnJworCitFWFBFQ1RFRF9OT05fRU1QVFlfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIyMyIgZmFpbHVyZXM9IjQiIGRpc2FibGVkPSIyIiBlcnJvcnM9IjAiIHRpbWU9IioiIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiIGFkX2hvY19wcm9wZXJ0eT0iNDIiPgorICA8dGVzdHN1aXRlIG5hbWU9IlN1Y2Nlc3NmdWxUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJTdWNjZWVkcyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU3VjY2Vzc2Z1bFRlc3QiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iRmFpbGVkVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iRmFpbHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IkZhaWxlZFRlc3QiPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KiYjeDBBO1ZhbHVlIG9mOiAyJiN4MEE7RXhwZWN0ZWQ6IDEiIHR5cGU9IiI+PCFbQ0RBVEFbZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KgorVmFsdWUgb2Y6IDIKK0V4cGVjdGVkOiAxJShzdGFjaylzXV0+PC9mYWlsdXJlPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9Ik1peGVkUmVzdWx0VGVzdCIgdGVzdHM9IjMiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMSIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iU3VjY2VlZHMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik1peGVkUmVzdWx0VGVzdCIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJGYWlscyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTWl4ZWRSZXN1bHRUZXN0Ij4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Imd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOiomI3gwQTtWYWx1ZSBvZjogMiYjeDBBO0V4cGVjdGVkOiAxIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK1ZhbHVlIG9mOiAyCitFeHBlY3RlZDogMSUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Imd0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOiomI3gwQTtWYWx1ZSBvZjogMyYjeDBBO0V4cGVjdGVkOiAyIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK1ZhbHVlIG9mOiAzCitFeHBlY3RlZDogMiUoc3RhY2spc11dPjwvZmFpbHVyZT4KKyAgICA8L3Rlc3RjYXNlPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJESVNBQkxFRF90ZXN0IiBzdGF0dXM9Im5vdHJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJNaXhlZFJlc3VsdFRlc3QiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iWG1sUXVvdGluZ1Rlc3QiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMSIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ik91dHB1dHNDRGF0YSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iWG1sUXVvdGluZ1Rlc3QiPgorICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iZ3Rlc3RfeG1sX291dHB1dF91bml0dGVzdF8uY2M6KiYjeDBBO0ZhaWxlZCYjeDBBO1hNTCBvdXRwdXQ6ICZsdDs/eG1sIGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7Jmd0OyZsdDt0b3AmZ3Q7Jmx0OyFbQ0RBVEFbY2RhdGEgdGV4dF1dJmd0OyZsdDsvdG9wJmd0OyIgdHlwZT0iIj48IVtDREFUQVtndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqCitGYWlsZWQKK1hNTCBvdXRwdXQ6IDw/eG1sIGVuY29kaW5nPSJ1dGYtOCI+PHRvcD48IVtDREFUQVtjZGF0YSB0ZXh0XV0+XV0mZ3Q7PCFbQ0RBVEFbPC90b3A+JShzdGFjaylzXV0+PC9mYWlsdXJlPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IkludmFsaWRDaGFyYWN0ZXJzVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIxIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSW52YWxpZENoYXJhY3RlcnNJbk1lc3NhZ2UiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IkludmFsaWRDaGFyYWN0ZXJzVGVzdCI+CisgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSJndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYzoqJiN4MEE7RmFpbGVkJiN4MEE7SW52YWxpZCBjaGFyYWN0ZXJzIGluIGJyYWNrZXRzIFtdIiB0eXBlPSIiPjwhW0NEQVRBW2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjOioKK0ZhaWxlZAorSW52YWxpZCBjaGFyYWN0ZXJzIGluIGJyYWNrZXRzIFtdJShzdGFjaylzXV0+PC9mYWlsdXJlPgorICAgIDwvdGVzdGNhc2U+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IkRpc2FibGVkVGVzdCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMSIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iRElTQUJMRURfdGVzdF9ub3RfcnVuIiBzdGF0dXM9Im5vdHJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJEaXNhYmxlZFRlc3QiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iUHJvcGVydHlSZWNvcmRpbmdUZXN0IiB0ZXN0cz0iNCIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiIFNldFVwVGVzdENhc2U9InllcyIgVGVhckRvd25UZXN0Q2FzZT0iYXllIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iT25lUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiLz4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSW50VmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5X2ludD0iMSIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUaHJlZVByb3BlcnRpZXMiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9IlByb3BlcnR5UmVjb3JkaW5nVGVzdCIga2V5XzE9IjEiIGtleV8yPSIyIiBrZXlfMz0iMyIvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJUd29WYWx1ZXNGb3JPbmVLZXlVc2VzTGFzdFZhbHVlIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJQcm9wZXJ0eVJlY29yZGluZ1Rlc3QiIGtleV8xPSIyIi8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9Ik5vRml4dHVyZVRlc3QiIHRlc3RzPSIzIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgIDx0ZXN0Y2FzZSBuYW1lPSJSZWNvcmRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5PSIxIi8+CisgICAgIDx0ZXN0Y2FzZSBuYW1lPSJFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRJbnRWYWx1ZWRQcm9wZXJ0eSIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iTm9GaXh0dXJlVGVzdCIga2V5X2Zvcl91dGlsaXR5X2ludD0iMSIvPgorICAgICA8dGVzdGNhc2UgbmFtZT0iRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkU3RyaW5nVmFsdWVkUHJvcGVydHkiIHN0YXR1cz0icnVuIiB0aW1lPSIqIiBjbGFzc25hbWU9Ik5vRml4dHVyZVRlc3QiIGtleV9mb3JfdXRpbGl0eV9zdHJpbmc9IjEiLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiB0ZXN0cz0iNCIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIiBlcnJvcnM9IjAiIHRpbWU9IioiPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzAiIHZhbHVlX3BhcmFtPSIzMyIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICAgIDx0ZXN0Y2FzZSBuYW1lPSJBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlLzEiIHZhbHVlX3BhcmFtPSI0MiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1ZhbHVlUGFyYW1UZXN0IiAvPgorICA8L3Rlc3RzdWl0ZT4KKyAgPHRlc3RzdWl0ZSBuYW1lPSJUeXBlZFRlc3QvMCIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJUeXBlZFRlc3QvMCIgLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iVHlwZWRUZXN0LzEiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iVHlwZWRUZXN0LzEiIC8+CisgIDwvdGVzdHN1aXRlPgorICA8dGVzdHN1aXRlIG5hbWU9IlNpbmdsZS9UeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlLzAiIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9Ikhhc1R5cGVQYXJhbUF0dHJpYnV0ZSIgdHlwZV9wYXJhbT0iKiIgc3RhdHVzPSJydW4iIHRpbWU9IioiIGNsYXNzbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMCIgLz4KKyAgPC90ZXN0c3VpdGU+CisgIDx0ZXN0c3VpdGUgbmFtZT0iU2luZ2xlL1R5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UvMSIgdGVzdHM9IjEiIGZhaWx1cmVzPSIwIiBkaXNhYmxlZD0iMCIgZXJyb3JzPSIwIiB0aW1lPSIqIj4KKyAgICA8dGVzdGNhc2UgbmFtZT0iSGFzVHlwZVBhcmFtQXR0cmlidXRlIiB0eXBlX3BhcmFtPSIqIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJTaW5nbGUvVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZS8xIiAvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4iIiIgJSB7J3N0YWNrJzogU1RBQ0tfVFJBQ0VfVEVNUExBVEV9CisKK0VYUEVDVEVEX0ZJTFRFUkVEX1RFU1RfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIxIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIKKyAgICAgICAgICAgIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiIGFkX2hvY19wcm9wZXJ0eT0iNDIiPgorICA8dGVzdHN1aXRlIG5hbWU9IlN1Y2Nlc3NmdWxUZXN0IiB0ZXN0cz0iMSIgZmFpbHVyZXM9IjAiIGRpc2FibGVkPSIwIgorICAgICAgICAgICAgIGVycm9ycz0iMCIgdGltZT0iKiI+CisgICAgPHRlc3RjYXNlIG5hbWU9IlN1Y2NlZWRzIiBzdGF0dXM9InJ1biIgdGltZT0iKiIgY2xhc3NuYW1lPSJTdWNjZXNzZnVsVGVzdCIvPgorICA8L3Rlc3RzdWl0ZT4KKzwvdGVzdHN1aXRlcz4iIiIKKworRVhQRUNURURfRU1QVFlfWE1MID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx0ZXN0c3VpdGVzIHRlc3RzPSIwIiBmYWlsdXJlcz0iMCIgZGlzYWJsZWQ9IjAiIGVycm9ycz0iMCIgdGltZT0iKiIKKyAgICAgICAgICAgIHRpbWVzdGFtcD0iKiIgbmFtZT0iQWxsVGVzdHMiPgorPC90ZXN0c3VpdGVzPiIiIgorCitHVEVTVF9QUk9HUkFNX1BBVEggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aChHVEVTVF9QUk9HUkFNX05BTUUpCisKK1NVUFBPUlRTX1RZUEVEX1RFU1RTID0gJ1R5cGVkVGVzdCcgaW4gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKAorICAgIFtHVEVTVF9QUk9HUkFNX1BBVEgsIEdURVNUX0xJU1RfVEVTVFNfRkxBR10sIGNhcHR1cmVfc3RkZXJyPUZhbHNlKS5vdXRwdXQKKworCitjbGFzcyBHVGVzdFhNTE91dHB1dFVuaXRUZXN0KGd0ZXN0X3htbF90ZXN0X3V0aWxzLkdUZXN0WE1MVGVzdENhc2UpOgorICAiIiIKKyAgVW5pdCB0ZXN0IGZvciBHb29nbGUgVGVzdCdzIFhNTCBvdXRwdXQgZnVuY3Rpb25hbGl0eS4KKyAgIiIiCisKKyAgIyBUaGlzIHRlc3QgY3VycmVudGx5IGJyZWFrcyBvbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0eXBlZCBhbmQKKyAgIyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIHNvIHdlIGRvbid0IHJ1biBpdCB1bmRlciB0aGVtLgorICBpZiBTVVBQT1JUU19UWVBFRF9URVNUUzoKKyAgICBkZWYgdGVzdE5vbkVtcHR5WG1sT3V0cHV0KHNlbGYpOgorICAgICAgIiIiCisgICAgICBSdW5zIGEgdGVzdCBwcm9ncmFtIHRoYXQgZ2VuZXJhdGVzIGEgbm9uLWVtcHR5IFhNTCBvdXRwdXQsIGFuZAorICAgICAgdGVzdHMgdGhhdCB0aGUgWE1MIG91dHB1dCBpcyBleHBlY3RlZC4KKyAgICAgICIiIgorICAgICAgc2VsZi5fVGVzdFhtbE91dHB1dChHVEVTVF9QUk9HUkFNX05BTUUsIEVYUEVDVEVEX05PTl9FTVBUWV9YTUwsIDEpCisKKyAgZGVmIHRlc3RFbXB0eVhtbE91dHB1dChzZWxmKToKKyAgICAiIiJWZXJpZmllcyBYTUwgb3V0cHV0IGZvciBhIEdvb2dsZSBUZXN0IGJpbmFyeSB3aXRob3V0IGFjdHVhbCB0ZXN0cy4KKworICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYW4gZW1wdHkgWE1MIG91dHB1dCwgYW5kCisgICAgdGVzdHMgdGhhdCB0aGUgWE1MIG91dHB1dCBpcyBleHBlY3RlZC4KKyAgICAiIiIKKworICAgIHNlbGYuX1Rlc3RYbWxPdXRwdXQoJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnLCBFWFBFQ1RFRF9FTVBUWV9YTUwsIDApCisKKyAgZGVmIHRlc3RUaW1lc3RhbXBWYWx1ZShzZWxmKToKKyAgICAiIiJDaGVja3Mgd2hldGhlciB0aGUgdGltZXN0YW1wIGF0dHJpYnV0ZSBpbiB0aGUgWE1MIG91dHB1dCBpcyB2YWxpZC4KKworICAgIFJ1bnMgYSB0ZXN0IHByb2dyYW0gdGhhdCBnZW5lcmF0ZXMgYW4gZW1wdHkgWE1MIG91dHB1dCwgYW5kIGNoZWNrcyBpZgorICAgIHRoZSB0aW1lc3RhbXAgYXR0cmlidXRlIGluIHRoZSB0ZXN0c3VpdGVzIHRhZyBpcyB2YWxpZC4KKyAgICAiIiIKKyAgICBhY3R1YWwgPSBzZWxmLl9HZXRYbWxPdXRwdXQoJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnLCBbXSwgMCkKKyAgICBkYXRlX3RpbWVfc3RyID0gYWN0dWFsLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCd0aW1lc3RhbXAnKS52YWx1ZQorICAgICMgZGF0ZXRpbWUuc3RycHRpbWUoKSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBQeXRob24gMi41KyBzbyB3ZSBoYXZlIHRvCisgICAgIyBwYXJzZSB0aGUgZXhwZWN0ZWQgZGF0ZXRpbWUgbWFudWFsbHkuCisgICAgbWF0Y2ggPSByZS5tYXRjaChyJyhcZCspLShcZFxkKS0oXGRcZClUKFxkXGQpOihcZFxkKTooXGRcZCknLCBkYXRlX3RpbWVfc3RyKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgcmUubWF0Y2gsCisgICAgICAgICdYTUwgZGF0ZXR0aW1lIHN0cmluZyAlcyBoYXMgaW5jb3JyZWN0IGZvcm1hdCcgJSBkYXRlX3RpbWVfc3RyKQorICAgIGRhdGVfdGltZV9mcm9tX3htbCA9IGRhdGV0aW1lLmRhdGV0aW1lKAorICAgICAgICB5ZWFyPWludChtYXRjaC5ncm91cCgxKSksIG1vbnRoPWludChtYXRjaC5ncm91cCgyKSksCisgICAgICAgIGRheT1pbnQobWF0Y2guZ3JvdXAoMykpLCBob3VyPWludChtYXRjaC5ncm91cCg0KSksCisgICAgICAgIG1pbnV0ZT1pbnQobWF0Y2guZ3JvdXAoNSkpLCBzZWNvbmQ9aW50KG1hdGNoLmdyb3VwKDYpKSkKKworICAgIHRpbWVfZGVsdGEgPSBhYnMoZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgLSBkYXRlX3RpbWVfZnJvbV94bWwpCisgICAgIyB0aW1lc3RhbXAgdmFsdWUgc2hvdWxkIGJlIG5lYXIgdGhlIGN1cnJlbnQgbG9jYWwgdGltZQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lX2RlbHRhIDwgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9NjAwKSwKKyAgICAgICAgICAgICAgICAgICAgJ3RpbWVfZGVsdGEgaXMgJXMnICUgdGltZV9kZWx0YSkKKyAgICBhY3R1YWwudW5saW5rKCkKKworICBkZWYgdGVzdERlZmF1bHRPdXRwdXRGaWxlKHNlbGYpOgorICAgICIiIgorICAgIENvbmZpcm1zIHRoYXQgR29vZ2xlIFRlc3QgcHJvZHVjZXMgYW4gWE1MIG91dHB1dCBmaWxlIHdpdGggdGhlIGV4cGVjdGVkCisgICAgZGVmYXVsdCBuYW1lIGlmIG5vIG5hbWUgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCisgICAgIiIiCisgICAgb3V0cHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oZ3Rlc3RfdGVzdF91dGlscy5HZXRUZW1wRGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfREVGQVVMVF9PVVRQVVRfRklMRSkKKyAgICBndGVzdF9wcm9nX3BhdGggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aCgKKyAgICAgICAgJ2d0ZXN0X25vX3Rlc3RfdW5pdHRlc3QnKQorICAgIHRyeToKKyAgICAgIG9zLnJlbW92ZShvdXRwdXRfZmlsZSkKKyAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICByYWlzZQorCisgICAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2VzcygKKyAgICAgICAgW2d0ZXN0X3Byb2dfcGF0aCwgJyVzPXhtbCcgJSBHVEVTVF9PVVRQVVRfRkxBR10sCisgICAgICAgIHdvcmtpbmdfZGlyPWd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpKQorICAgIHNlbGYuYXNzZXJ0XyhwLmV4aXRlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFscygwLCBwLmV4aXRfY29kZSkKKyAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2ZpbGUob3V0cHV0X2ZpbGUpKQorCisgIGRlZiB0ZXN0U3VwcHJlc3NlZFhtbE91dHB1dChzZWxmKToKKyAgICAiIiIKKyAgICBUZXN0cyB0aGF0IG5vIFhNTCBmaWxlIGlzIGdlbmVyYXRlZCBpZiB0aGUgZGVmYXVsdCBYTUwgbGlzdGVuZXIgaXMKKyAgICBzaHV0IGRvd24gYmVmb3JlIFJVTl9BTExfVEVTVFMgaXMgaW52b2tlZC4KKyAgICAiIiIKKworICAgIHhtbF9wYXRoID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1BST0dSQU1fTkFNRSArICdvdXQueG1sJykKKyAgICBpZiBvcy5wYXRoLmlzZmlsZSh4bWxfcGF0aCk6CisgICAgICBvcy5yZW1vdmUoeG1sX3BhdGgpCisKKyAgICBjb21tYW5kID0gW0dURVNUX1BST0dSQU1fUEFUSCwKKyAgICAgICAgICAgICAgICclcz14bWw6JXMnICUgKEdURVNUX09VVFBVVF9GTEFHLCB4bWxfcGF0aCksCisgICAgICAgICAgICAgICAnLS1zaHV0X2Rvd25feG1sJ10KKyAgICBwID0gZ3Rlc3RfdGVzdF91dGlscy5TdWJwcm9jZXNzKGNvbW1hbmQpCisgICAgaWYgcC50ZXJtaW5hdGVkX2J5X3NpZ25hbDoKKyAgICAgICMgcC5zaWduYWwgaXMgYXZhbGFibGUgb25seSBpZiBwLnRlcm1pbmF0ZWRfYnlfc2lnbmFsIGlzIFRydWUuCisgICAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICAgIHAudGVybWluYXRlZF9ieV9zaWduYWwsCisgICAgICAgICAgJyVzIHdhcyBraWxsZWQgYnkgc2lnbmFsICVkJyAlIChHVEVTVF9QUk9HUkFNX05BTUUsIHAuc2lnbmFsKSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKHAuZXhpdGVkKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgcC5leGl0X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBleGl0ZWQgd2l0aCBjb2RlICVzLCB3aGljaCBkb2Vzbid0IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgZXhwZWN0ZWQgZXhpdCBjb2RlICVzLicKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKGNvbW1hbmQsIHAuZXhpdF9jb2RlLCAxKSkKKworICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5pc2ZpbGUoeG1sX3BhdGgpKQorCisgIGRlZiB0ZXN0RmlsdGVyZWRUZXN0WG1sT3V0cHV0KHNlbGYpOgorICAgICIiIlZlcmlmaWVzIFhNTCBvdXRwdXQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkLgorCisgICAgUnVucyBhIHRlc3QgcHJvZ3JhbSB0aGF0IGV4ZWN1dGVzIG9ubHkgc29tZSB0ZXN0cyBhbmQgdmVyaWZpZXMgdGhhdAorICAgIG5vbi1zZWxlY3RlZCB0ZXN0cyBkbyBub3Qgc2hvdyB1cCBpbiB0aGUgWE1MIG91dHB1dC4KKyAgICAiIiIKKworICAgIHNlbGYuX1Rlc3RYbWxPdXRwdXQoR1RFU1RfUFJPR1JBTV9OQU1FLCBFWFBFQ1RFRF9GSUxURVJFRF9URVNUX1hNTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2FyZ3M9Wyclcz1TdWNjZXNzZnVsVGVzdC4qJyAlIEdURVNUX0ZJTFRFUl9GTEFHXSkKKworICBkZWYgX0dldFhtbE91dHB1dChzZWxmLCBndGVzdF9wcm9nX25hbWUsIGV4dHJhX2FyZ3MsIGV4cGVjdGVkX2V4aXRfY29kZSk6CisgICAgIiIiCisgICAgUmV0dXJucyB0aGUgeG1sIG91dHB1dCBnZW5lcmF0ZWQgYnkgcnVubmluZyB0aGUgcHJvZ3JhbSBndGVzdF9wcm9nX25hbWUuCisgICAgRnVydGhlcm1vcmUsIHRoZSBwcm9ncmFtJ3MgZXhpdCBjb2RlIG11c3QgYmUgZXhwZWN0ZWRfZXhpdF9jb2RlLgorICAgICIiIgorICAgIHhtbF9wYXRoID0gb3MucGF0aC5qb2luKGd0ZXN0X3Rlc3RfdXRpbHMuR2V0VGVtcERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ZXN0X3Byb2dfbmFtZSArICdvdXQueG1sJykKKyAgICBndGVzdF9wcm9nX3BhdGggPSBndGVzdF90ZXN0X3V0aWxzLkdldFRlc3RFeGVjdXRhYmxlUGF0aChndGVzdF9wcm9nX25hbWUpCisKKyAgICBjb21tYW5kID0gKFtndGVzdF9wcm9nX3BhdGgsICclcz14bWw6JXMnICUgKEdURVNUX09VVFBVVF9GTEFHLCB4bWxfcGF0aCldICsKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZ3MpCisgICAgcCA9IGd0ZXN0X3Rlc3RfdXRpbHMuU3VicHJvY2Vzcyhjb21tYW5kKQorICAgIGlmIHAudGVybWluYXRlZF9ieV9zaWduYWw6CisgICAgICBzZWxmLmFzc2VydF8oRmFsc2UsCisgICAgICAgICAgICAgICAgICAgJyVzIHdhcyBraWxsZWQgYnkgc2lnbmFsICVkJyAlIChndGVzdF9wcm9nX25hbWUsIHAuc2lnbmFsKSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5hc3NlcnRfKHAuZXhpdGVkKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfZXhpdF9jb2RlLCBwLmV4aXRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGV4aXRlZCB3aXRoIGNvZGUgJXMsIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSBleHBlY3RlZCBleGl0IGNvZGUgJXMuJworICAgICAgICAgICAgICAgICAgICAgICAgJSAoY29tbWFuZCwgcC5leGl0X2NvZGUsIGV4cGVjdGVkX2V4aXRfY29kZSkpCisgICAgYWN0dWFsID0gbWluaWRvbS5wYXJzZSh4bWxfcGF0aCkKKyAgICByZXR1cm4gYWN0dWFsCisKKyAgZGVmIF9UZXN0WG1sT3V0cHV0KHNlbGYsIGd0ZXN0X3Byb2dfbmFtZSwgZXhwZWN0ZWRfeG1sLAorICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXhpdF9jb2RlLCBleHRyYV9hcmdzPU5vbmUpOgorICAgICIiIgorICAgIEFzc2VydHMgdGhhdCB0aGUgWE1MIGRvY3VtZW50IGdlbmVyYXRlZCBieSBydW5uaW5nIHRoZSBwcm9ncmFtCisgICAgZ3Rlc3RfcHJvZ19uYW1lIG1hdGNoZXMgZXhwZWN0ZWRfeG1sLCBhIHN0cmluZyBjb250YWluaW5nIGFub3RoZXIKKyAgICBYTUwgZG9jdW1lbnQuICBGdXJ0aGVybW9yZSwgdGhlIHByb2dyYW0ncyBleGl0IGNvZGUgbXVzdCBiZQorICAgIGV4cGVjdGVkX2V4aXRfY29kZS4KKyAgICAiIiIKKworICAgIGFjdHVhbCA9IHNlbGYuX0dldFhtbE91dHB1dChndGVzdF9wcm9nX25hbWUsIGV4dHJhX2FyZ3Mgb3IgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2V4aXRfY29kZSkKKyAgICBleHBlY3RlZCA9IG1pbmlkb20ucGFyc2VTdHJpbmcoZXhwZWN0ZWRfeG1sKQorICAgIHNlbGYuTm9ybWFsaXplWG1sKGFjdHVhbC5kb2N1bWVudEVsZW1lbnQpCisgICAgc2VsZi5Bc3NlcnRFcXVpdmFsZW50Tm9kZXMoZXhwZWN0ZWQuZG9jdW1lbnRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbC5kb2N1bWVudEVsZW1lbnQpCisgICAgZXhwZWN0ZWQudW5saW5rKCkKKyAgICBhY3R1YWwudW5saW5rKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBvcy5lbnZpcm9uWydHVEVTVF9TVEFDS19UUkFDRV9ERVBUSCddID0gJzEnCisgIGd0ZXN0X3Rlc3RfdXRpbHMuTWFpbigpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC90ZXN0L2d0ZXN0X3htbF9vdXRwdXRfdW5pdHRlc3RfLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Yjg3NzEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF94bWxfb3V0cHV0X3VuaXR0ZXN0Xy5jYwpAQCAtMCwwICsxLDE4MSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQorCisvLyBVbml0IHRlc3QgZm9yIEdvb2dsZSBUZXN0IFhNTCBvdXRwdXQuCisvLworLy8gQSB1c2VyIGNhbiBzcGVjaWZ5IFhNTCBvdXRwdXQgaW4gYSBHb29nbGUgVGVzdCBwcm9ncmFtIHRvIHJ1biB2aWEKKy8vIGVpdGhlciB0aGUgR1RFU1RfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZSAtLWd0ZXN0X291dHB1dAorLy8gZmxhZy4gIFRoaXMgaXMgdXNlZCBmb3IgdGVzdGluZyBzdWNoIGZ1bmN0aW9uYWxpdHkuCisvLworLy8gVGhpcyBwcm9ncmFtIHdpbGwgYmUgaW52b2tlZCBmcm9tIGEgUHl0aG9uIHVuaXQgdGVzdC4gIERvbid0IHJ1biBpdAorLy8gZGlyZWN0bHkuCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0RXZlbnRMaXN0ZW5lcnM7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW07Cit1c2luZyA6OnRlc3Rpbmc6OlVuaXRUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwordXNpbmcgOjp0ZXN0aW5nOjpWYWx1ZXM7CisKK2NsYXNzIFN1Y2Nlc3NmdWxUZXN0IDogcHVibGljIFRlc3QgeworfTsKKworVEVTVF9GKFN1Y2Nlc3NmdWxUZXN0LCBTdWNjZWVkcykgeworICBTVUNDRUVEKCkgPDwgIlRoaXMgaXMgYSBzdWNjZXNzLiI7CisgIEFTU0VSVF9FUSgxLCAxKTsKK30KKworY2xhc3MgRmFpbGVkVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RFU1RfRihGYWlsZWRUZXN0LCBGYWlscykgeworICBBU1NFUlRfRVEoMSwgMik7Cit9CisKK2NsYXNzIERpc2FibGVkVGVzdCA6IHB1YmxpYyBUZXN0IHsKK307CisKK1RFU1RfRihEaXNhYmxlZFRlc3QsIERJU0FCTEVEX3Rlc3Rfbm90X3J1bikgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdGVzdCBzaG91bGQgbm90IGJlIHJ1biI7Cit9CisKK1RFU1QoTWl4ZWRSZXN1bHRUZXN0LCBTdWNjZWVkcykgeworICBFWFBFQ1RfRVEoMSwgMSk7CisgIEFTU0VSVF9FUSgxLCAxKTsKK30KKworVEVTVChNaXhlZFJlc3VsdFRlc3QsIEZhaWxzKSB7CisgIEVYUEVDVF9FUSgxLCAyKTsKKyAgQVNTRVJUX0VRKDIsIDMpOworfQorCitURVNUKE1peGVkUmVzdWx0VGVzdCwgRElTQUJMRURfdGVzdCkgeworICBGQUlMKCkgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogRGlzYWJsZWQgdGVzdCBzaG91bGQgbm90IGJlIHJ1biI7Cit9CisKK1RFU1QoWG1sUXVvdGluZ1Rlc3QsIE91dHB1dHNDRGF0YSkgeworICBGQUlMKCkgPDwgIlhNTCBvdXRwdXQ6ICIKKyAgICAgICAgICAgICI8P3htbCBlbmNvZGluZz1cInV0Zi04XCI+PHRvcD48IVtDREFUQVtjZGF0YSB0ZXh0XV0+PC90b3A+IjsKK30KKworLy8gSGVscHMgdG8gdGVzdCB0aGF0IGludmFsaWQgY2hhcmFjdGVycyBwcm9kdWNlZCBieSB0ZXN0IGNvZGUgZG8gbm90IG1ha2UKKy8vIGl0IGludG8gdGhlIFhNTCBmaWxlLgorVEVTVChJbnZhbGlkQ2hhcmFjdGVyc1Rlc3QsIEludmFsaWRDaGFyYWN0ZXJzSW5NZXNzYWdlKSB7CisgIEZBSUwoKSA8PCAiSW52YWxpZCBjaGFyYWN0ZXJzIGluIGJyYWNrZXRzIFtceDFceDJdIjsKK30KKworY2xhc3MgUHJvcGVydHlSZWNvcmRpbmdUZXN0IDogcHVibGljIFRlc3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsgUmVjb3JkUHJvcGVydHkoIlNldFVwVGVzdENhc2UiLCAieWVzIik7IH0KKyAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsgUmVjb3JkUHJvcGVydHkoIlRlYXJEb3duVGVzdENhc2UiLCAiYXllIik7IH0KK307CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIE9uZVByb3BlcnR5KSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7Cit9CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIEludFZhbHVlZFByb3BlcnR5KSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfaW50IiwgMSk7Cit9CisKK1RFU1RfRihQcm9wZXJ0eVJlY29yZGluZ1Rlc3QsIFRocmVlUHJvcGVydGllcykgeworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzEiLCAiMSIpOworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzIiLCAiMiIpOworICBSZWNvcmRQcm9wZXJ0eSgia2V5XzMiLCAiMyIpOworfQorCitURVNUX0YoUHJvcGVydHlSZWNvcmRpbmdUZXN0LCBUd29WYWx1ZXNGb3JPbmVLZXlVc2VzTGFzdFZhbHVlKSB7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIxIik7CisgIFJlY29yZFByb3BlcnR5KCJrZXlfMSIsICIyIik7Cit9CisKK1RFU1QoTm9GaXh0dXJlVGVzdCwgUmVjb3JkUHJvcGVydHkpIHsKKyAgUmVjb3JkUHJvcGVydHkoImtleSIsICIxIik7Cit9CisKK3ZvaWQgRXh0ZXJuYWxVdGlsaXR5VGhhdENhbGxzUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKSB7CisgIHRlc3Rpbmc6OlRlc3Q6OlJlY29yZFByb3BlcnR5KGtleSwgdmFsdWUpOworfQorCit2b2lkIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICB0ZXN0aW5nOjpUZXN0OjpSZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlKTsKK30KKworVEVTVChOb0ZpeHR1cmVUZXN0LCBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRJbnRWYWx1ZWRQcm9wZXJ0eSkgeworICBFeHRlcm5hbFV0aWxpdHlUaGF0Q2FsbHNSZWNvcmRQcm9wZXJ0eSgia2V5X2Zvcl91dGlsaXR5X2ludCIsIDEpOworfQorCitURVNUKE5vRml4dHVyZVRlc3QsIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFN0cmluZ1ZhbHVlZFByb3BlcnR5KSB7CisgIEV4dGVybmFsVXRpbGl0eVRoYXRDYWxsc1JlY29yZFByb3BlcnR5KCJrZXlfZm9yX3V0aWxpdHlfc3RyaW5nIiwgIjEiKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCB0aGUgdGVzdCBwYXJhbWV0ZXIgdmFsdWUgaXMgb3V0cHV0IGluIHRoZSAndmFsdWVfcGFyYW0nCisvLyBYTUwgYXR0cmlidXRlIGZvciB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorY2xhc3MgVmFsdWVQYXJhbVRlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHt9OworVEVTVF9QKFZhbHVlUGFyYW1UZXN0LCBIYXNWYWx1ZVBhcmFtQXR0cmlidXRlKSB7fQorVEVTVF9QKFZhbHVlUGFyYW1UZXN0LCBBbm90aGVyVGVzdFRoYXRIYXNWYWx1ZVBhcmFtQXR0cmlidXRlKSB7fQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU2luZ2xlLCBWYWx1ZVBhcmFtVGVzdCwgVmFsdWVzKDMzLCA0MikpOworCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIHR5cGUgcGFyYW1ldGVyIG5hbWUgaXMgb3V0cHV0IGluIHRoZSAndHlwZV9wYXJhbScKKy8vIFhNTCBhdHRyaWJ1dGUgZm9yIHR5cGVkIHRlc3RzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFR5cGVkVGVzdCA6IHB1YmxpYyBUZXN0IHt9OwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxpbnQsIGxvbmc+IFR5cGVkVGVzdFR5cGVzOworVFlQRURfVEVTVF9DQVNFKFR5cGVkVGVzdCwgVHlwZWRUZXN0VHlwZXMpOworVFlQRURfVEVTVChUeXBlZFRlc3QsIEhhc1R5cGVQYXJhbUF0dHJpYnV0ZSkge30KKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorLy8gVmVyaWZpZXMgdGhhdCB0aGUgdHlwZSBwYXJhbWV0ZXIgbmFtZSBpcyBvdXRwdXQgaW4gdGhlICd0eXBlX3BhcmFtJworLy8gWE1MIGF0dHJpYnV0ZSBmb3IgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UgOiBwdWJsaWMgVGVzdCB7fTsKK1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UpOworVFlQRURfVEVTVF9QKFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UsIEhhc1R5cGVQYXJhbUF0dHJpYnV0ZSkge30KK1JFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UsIEhhc1R5cGVQYXJhbUF0dHJpYnV0ZSk7Cit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGludCwgbG9uZz4gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZVR5cGVzOworSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoU2luZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2VUeXBlcyk7CisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIEluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItLXNodXRfZG93bl94bWwiKSA9PSAwKSB7CisgICAgVGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCk7CisgICAgZGVsZXRlIGxpc3RlbmVycy5SZWxlYXNlKGxpc3RlbmVycy5kZWZhdWx0X3htbF9nZW5lcmF0b3IoKSk7CisgIH0KKyAgdGVzdGluZzo6VGVzdDo6UmVjb3JkUHJvcGVydHkoImFkX2hvY19wcm9wZXJ0eSIsICI0MiIpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9ndGVzdF94bWxfdGVzdF91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDBjM2IyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvZ3Rlc3RfeG1sX3Rlc3RfdXRpbHMucHkKQEAgLTAsMCArMSwxOTQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdCB1dGlsaXRpZXMgZm9yIGd0ZXN0X3htbF9vdXRwdXQiIiIKKworX19hdXRob3JfXyA9ICdlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSknCisKK2ltcG9ydCByZQorZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tLCBOb2RlCisKK2ltcG9ydCBndGVzdF90ZXN0X3V0aWxzCisKKworR1RFU1RfT1VUUFVUX0ZMQUcgICAgICAgICA9ICctLWd0ZXN0X291dHB1dCcKK0dURVNUX0RFRkFVTFRfT1VUUFVUX0ZJTEUgPSAndGVzdF9kZXRhaWwueG1sJworCitjbGFzcyBHVGVzdFhNTFRlc3RDYXNlKGd0ZXN0X3Rlc3RfdXRpbHMuVGVzdENhc2UpOgorICAiIiIKKyAgQmFzZSBjbGFzcyBmb3IgdGVzdHMgb2YgR29vZ2xlIFRlc3QncyBYTUwgb3V0cHV0IGZ1bmN0aW9uYWxpdHkuCisgICIiIgorCisKKyAgZGVmIEFzc2VydEVxdWl2YWxlbnROb2RlcyhzZWxmLCBleHBlY3RlZF9ub2RlLCBhY3R1YWxfbm9kZSk6CisgICAgIiIiCisgICAgQXNzZXJ0cyB0aGF0IGFjdHVhbF9ub2RlIChhIERPTSBub2RlIG9iamVjdCkgaXMgZXF1aXZhbGVudCB0bworICAgIGV4cGVjdGVkX25vZGUgKGFub3RoZXIgRE9NIG5vZGUgb2JqZWN0KSwgaW4gdGhhdCBlaXRoZXIgYm90aCBvZgorICAgIHRoZW0gYXJlIENEQVRBIG5vZGVzIGFuZCBoYXZlIHRoZSBzYW1lIHZhbHVlLCBvciBib3RoIGFyZSBET00KKyAgICBlbGVtZW50cyBhbmQgYWN0dWFsX25vZGUgbWVldHMgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICogIEl0IGhhcyB0aGUgc2FtZSB0YWcgbmFtZSBhcyBleHBlY3RlZF9ub2RlLgorICAgICogIEl0IGhhcyB0aGUgc2FtZSBzZXQgb2YgYXR0cmlidXRlcyBhcyBleHBlY3RlZF9ub2RlLCBlYWNoIHdpdGgKKyAgICAgICB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgZXhwZWN0ZWRfbm9kZS4KKyAgICAgICBFeGNlcHRpb25zIGFyZSBhbnkgYXR0cmlidXRlIG5hbWVkICJ0aW1lIiwgd2hpY2ggbmVlZHMgb25seSBiZQorICAgICAgIGNvbnZlcnRpYmxlIHRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCBhbnkgYXR0cmlidXRlIG5hbWVkCisgICAgICAgInR5cGVfcGFyYW0iIHdoaWNoIG9ubHkgaGFzIHRvIGJlIG5vbi1lbXB0eS4KKyAgICAqICBJdCBoYXMgYW4gZXF1aXZhbGVudCBzZXQgb2YgY2hpbGQgbm9kZXMgKGluY2x1ZGluZyBlbGVtZW50cyBhbmQKKyAgICAgICBDREFUQSBzZWN0aW9ucykgYXMgZXhwZWN0ZWRfbm9kZS4gIE5vdGUgdGhhdCB3ZSBpZ25vcmUgdGhlCisgICAgICAgb3JkZXIgb2YgdGhlIGNoaWxkcmVuIGFzIHRoZXkgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGluIGFueQorICAgICAgIHBhcnRpY3VsYXIgb3JkZXIuCisgICAgIiIiCisKKyAgICBpZiBleHBlY3RlZF9ub2RlLm5vZGVUeXBlID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9kZS5DREFUQV9TRUNUSU9OX05PREUsIGFjdHVhbF9ub2RlLm5vZGVUeXBlKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfbm9kZS5ub2RlVmFsdWUsIGFjdHVhbF9ub2RlLm5vZGVWYWx1ZSkKKyAgICAgIHJldHVybgorCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoTm9kZS5FTEVNRU5UX05PREUsIGFjdHVhbF9ub2RlLm5vZGVUeXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vZGUuRUxFTUVOVF9OT0RFLCBleHBlY3RlZF9ub2RlLm5vZGVUeXBlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX25vZGUudGFnTmFtZSwgYWN0dWFsX25vZGUudGFnTmFtZSkKKworICAgIGV4cGVjdGVkX2F0dHJpYnV0ZXMgPSBleHBlY3RlZF9ub2RlLmF0dHJpYnV0ZXMKKyAgICBhY3R1YWxfYXR0cmlidXRlcyAgID0gYWN0dWFsX25vZGUgIC5hdHRyaWJ1dGVzCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIGV4cGVjdGVkX2F0dHJpYnV0ZXMubGVuZ3RoLCBhY3R1YWxfYXR0cmlidXRlcy5sZW5ndGgsCisgICAgICAgICdhdHRyaWJ1dGUgbnVtYmVycyBkaWZmZXIgaW4gZWxlbWVudCAlczpcbkV4cGVjdGVkOiAlclxuQWN0dWFsOiAlcicgJSAoCisgICAgICAgICAgICBhY3R1YWxfbm9kZS50YWdOYW1lLCBleHBlY3RlZF9hdHRyaWJ1dGVzLmtleXMoKSwKKyAgICAgICAgICAgIGFjdHVhbF9hdHRyaWJ1dGVzLmtleXMoKSkpCisgICAgZm9yIGkgaW4gcmFuZ2UoZXhwZWN0ZWRfYXR0cmlidXRlcy5sZW5ndGgpOgorICAgICAgZXhwZWN0ZWRfYXR0ciA9IGV4cGVjdGVkX2F0dHJpYnV0ZXMuaXRlbShpKQorICAgICAgYWN0dWFsX2F0dHIgICA9IGFjdHVhbF9hdHRyaWJ1dGVzLmdldChleHBlY3RlZF9hdHRyLm5hbWUpCisgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgYWN0dWFsX2F0dHIgaXMgbm90IE5vbmUsCisgICAgICAgICAgJ2V4cGVjdGVkIGF0dHJpYnV0ZSAlcyBub3QgZm91bmQgaW4gZWxlbWVudCAlcycgJQorICAgICAgICAgIChleHBlY3RlZF9hdHRyLm5hbWUsIGFjdHVhbF9ub2RlLnRhZ05hbWUpKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgZXhwZWN0ZWRfYXR0ci52YWx1ZSwgYWN0dWFsX2F0dHIudmFsdWUsCisgICAgICAgICAgJyB2YWx1ZXMgb2YgYXR0cmlidXRlICVzIGluIGVsZW1lbnQgJXMgZGlmZmVyOiAlcyB2cyAlcycgJQorICAgICAgICAgIChleHBlY3RlZF9hdHRyLm5hbWUsIGFjdHVhbF9ub2RlLnRhZ05hbWUsCisgICAgICAgICAgIGV4cGVjdGVkX2F0dHIudmFsdWUsIGFjdHVhbF9hdHRyLnZhbHVlKSkKKworICAgIGV4cGVjdGVkX2NoaWxkcmVuID0gc2VsZi5fR2V0Q2hpbGRyZW4oZXhwZWN0ZWRfbm9kZSkKKyAgICBhY3R1YWxfY2hpbGRyZW4gPSBzZWxmLl9HZXRDaGlsZHJlbihhY3R1YWxfbm9kZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgbGVuKGV4cGVjdGVkX2NoaWxkcmVuKSwgbGVuKGFjdHVhbF9jaGlsZHJlbiksCisgICAgICAgICdudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMgZGlmZmVyIGluIGVsZW1lbnQgJyArIGFjdHVhbF9ub2RlLnRhZ05hbWUpCisgICAgZm9yIGNoaWxkX2lkLCBjaGlsZCBpbiBleHBlY3RlZF9jaGlsZHJlbi5pdGVyaXRlbXMoKToKKyAgICAgIHNlbGYuYXNzZXJ0XyhjaGlsZF9pZCBpbiBhY3R1YWxfY2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgJzwlcz4gaXMgbm90IGluIDwlcz4gKGluIGVsZW1lbnQgJXMpJyAlCisgICAgICAgICAgICAgICAgICAgKGNoaWxkX2lkLCBhY3R1YWxfY2hpbGRyZW4sIGFjdHVhbF9ub2RlLnRhZ05hbWUpKQorICAgICAgc2VsZi5Bc3NlcnRFcXVpdmFsZW50Tm9kZXMoY2hpbGQsIGFjdHVhbF9jaGlsZHJlbltjaGlsZF9pZF0pCisKKyAgaWRlbnRpZnlpbmdfYXR0cmlidXRlID0geworICAgICd0ZXN0c3VpdGVzJzogJ25hbWUnLAorICAgICd0ZXN0c3VpdGUnOiAnbmFtZScsCisgICAgJ3Rlc3RjYXNlJzogICduYW1lJywKKyAgICAnZmFpbHVyZSc6ICAgJ21lc3NhZ2UnLAorICAgIH0KKworICBkZWYgX0dldENoaWxkcmVuKHNlbGYsIGVsZW1lbnQpOgorICAgICIiIgorICAgIEZldGNoZXMgYWxsIG9mIHRoZSBjaGlsZCBub2RlcyBvZiBlbGVtZW50LCBhIERPTSBFbGVtZW50IG9iamVjdC4KKyAgICBSZXR1cm5zIHRoZW0gYXMgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIElEcyBvZiB0aGUKKyAgICBjaGlsZHJlbi4gIEZvciA8dGVzdHN1aXRlcz4sIDx0ZXN0c3VpdGU+IGFuZCA8dGVzdGNhc2U+IGVsZW1lbnRzLCB0aGUgSUQKKyAgICBpcyB0aGUgdmFsdWUgb2YgdGhlaXIgIm5hbWUiIGF0dHJpYnV0ZTsgZm9yIDxmYWlsdXJlPiBlbGVtZW50cywgaXQgaXMKKyAgICB0aGUgdmFsdWUgb2YgdGhlICJtZXNzYWdlIiBhdHRyaWJ1dGU7IENEQVRBIHNlY3Rpb25zIGFuZCBub24td2hpdGVzcGFjZQorICAgIHRleHQgbm9kZXMgYXJlIGNvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIENEQVRBIHNlY3Rpb24gd2l0aCBJRAorICAgICJkZXRhaWwiLiAgQW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiBhbnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSBhYm92ZQorICAgIGZvdXIgaXMgZW5jb3VudGVyZWQsIGlmIHR3byBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIGlkZW50aWZ5aW5nCisgICAgYXR0cmlidXRlcyBhcmUgZW5jb3VudGVyZWQsIG9yIGlmIGFueSBvdGhlciB0eXBlIG9mIG5vZGUgaXMgZW5jb3VudGVyZWQuCisgICAgIiIiCisKKyAgICBjaGlsZHJlbiA9IHt9CisgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQuY2hpbGROb2RlczoKKyAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICBzZWxmLmFzc2VydF8oY2hpbGQudGFnTmFtZSBpbiBzZWxmLmlkZW50aWZ5aW5nX2F0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICdFbmNvdW50ZXJlZCB1bmtub3duIGVsZW1lbnQgPCVzPicgJSBjaGlsZC50YWdOYW1lKQorICAgICAgICBjaGlsZElEID0gY2hpbGQuZ2V0QXR0cmlidXRlKHNlbGYuaWRlbnRpZnlpbmdfYXR0cmlidXRlW2NoaWxkLnRhZ05hbWVdKQorICAgICAgICBzZWxmLmFzc2VydF8oY2hpbGRJRCBub3QgaW4gY2hpbGRyZW4pCisgICAgICAgIGNoaWxkcmVuW2NoaWxkSURdID0gY2hpbGQKKyAgICAgIGVsaWYgY2hpbGQubm9kZVR5cGUgaW4gW05vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERV06CisgICAgICAgIGlmICdkZXRhaWwnIG5vdCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUgb3IKKyAgICAgICAgICAgICAgbm90IGNoaWxkLm5vZGVWYWx1ZS5pc3NwYWNlKCkpOgorICAgICAgICAgICAgY2hpbGRyZW5bJ2RldGFpbCddID0gY2hpbGQub3duZXJEb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oCisgICAgICAgICAgICAgICAgY2hpbGQubm9kZVZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGNoaWxkcmVuWydkZXRhaWwnXS5ub2RlVmFsdWUgKz0gY2hpbGQubm9kZVZhbHVlCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLmZhaWwoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgbm9kZSB0eXBlICVkJyAlIGNoaWxkLm5vZGVUeXBlKQorICAgIHJldHVybiBjaGlsZHJlbgorCisgIGRlZiBOb3JtYWxpemVYbWwoc2VsZiwgZWxlbWVudCk6CisgICAgIiIiCisgICAgTm9ybWFsaXplcyBHb29nbGUgVGVzdCdzIFhNTCBvdXRwdXQgdG8gZWxpbWluYXRlIHJlZmVyZW5jZXMgdG8gdHJhbnNpZW50CisgICAgaW5mb3JtYXRpb24gdGhhdCBtYXkgY2hhbmdlIGZyb20gcnVuIHRvIHJ1bi4KKworICAgICogIFRoZSAidGltZSIgYXR0cmlidXRlIG9mIDx0ZXN0c3VpdGVzPiwgPHRlc3RzdWl0ZT4gYW5kIDx0ZXN0Y2FzZT4KKyAgICAgICBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIGFzdGVyaXNrLCBpZiBpdCBjb250YWlucworICAgICAgIG9ubHkgZGlnaXQgY2hhcmFjdGVycy4KKyAgICAqICBUaGUgInRpbWVzdGFtcCIgYXR0cmlidXRlIG9mIDx0ZXN0c3VpdGVzPiBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIGEKKyAgICAgICBzaW5nbGUgYXN0ZXJpc2ssIGlmIGl0IGNvbnRhaW5zIGEgdmFsaWQgSVNPODYwMSBkYXRldGltZSB2YWx1ZS4KKyAgICAqICBUaGUgInR5cGVfcGFyYW0iIGF0dHJpYnV0ZSBvZiA8dGVzdGNhc2U+IGVsZW1lbnRzIGlzIHJlcGxhY2VkIHdpdGggYQorICAgICAgIHNpbmdsZSBhc3RlcmlzayAoaWYgaXQgc24gbm9uLWVtcHR5KSBhcyBpdCBpcyB0aGUgdHlwZSBuYW1lIHJldHVybmVkCisgICAgICAgYnkgdGhlIGNvbXBpbGVyIGFuZCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuCisgICAgKiAgVGhlIGxpbmUgaW5mbyByZXBvcnRlZCBpbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgIm1lc3NhZ2UiCisgICAgICAgYXR0cmlidXRlIGFuZCBDREFUQSBzZWN0aW9uIG9mIDxmYWlsdXJlPiBlbGVtZW50cyBpcyByZXBsYWNlZCB3aXRoIHRoZQorICAgICAgIGZpbGUncyBiYXNlbmFtZSBhbmQgYSBzaW5nbGUgYXN0ZXJpc2sgZm9yIHRoZSBsaW5lIG51bWJlci4KKyAgICAqICBUaGUgZGlyZWN0b3J5IG5hbWVzIGluIGZpbGUgcGF0aHMgYXJlIHJlbW92ZWQuCisgICAgKiAgVGhlIHN0YWNrIHRyYWNlcyBhcmUgcmVtb3ZlZC4KKyAgICAiIiIKKworICAgIGlmIGVsZW1lbnQudGFnTmFtZSA9PSAndGVzdHN1aXRlcyc6CisgICAgICB0aW1lc3RhbXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3RpbWVzdGFtcCcpCisgICAgICB0aW1lc3RhbXAudmFsdWUgPSByZS5zdWIocideXGR7NH0tXGRcZC1cZFxkVFxkXGQ6XGRcZDpcZFxkJCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyonLCB0aW1lc3RhbXAudmFsdWUpCisgICAgaWYgZWxlbWVudC50YWdOYW1lIGluICgndGVzdHN1aXRlcycsICd0ZXN0c3VpdGUnLCAndGVzdGNhc2UnKToKKyAgICAgIHRpbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3RpbWUnKQorICAgICAgdGltZS52YWx1ZSA9IHJlLnN1YihyJ15cZCsoXC5cZCspPyQnLCAnKicsIHRpbWUudmFsdWUpCisgICAgICB0eXBlX3BhcmFtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCd0eXBlX3BhcmFtJykKKyAgICAgIGlmIHR5cGVfcGFyYW0gYW5kIHR5cGVfcGFyYW0udmFsdWU6CisgICAgICAgIHR5cGVfcGFyYW0udmFsdWUgPSAnKicKKyAgICBlbGlmIGVsZW1lbnQudGFnTmFtZSA9PSAnZmFpbHVyZSc6CisgICAgICBzb3VyY2VfbGluZV9wYXQgPSByJ14uKlsvXFxdKC4qOilcZCtcbicKKyAgICAgICMgUmVwbGFjZXMgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHdpdGggYSBub3JtYWxpemVkIGZvcm0uCisgICAgICBtZXNzYWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCdtZXNzYWdlJykKKyAgICAgIG1lc3NhZ2UudmFsdWUgPSByZS5zdWIoc291cmNlX2xpbmVfcGF0LCAnXFwxKlxuJywgbWVzc2FnZS52YWx1ZSkKKyAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CisgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICAgICMgUmVwbGFjZXMgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHdpdGggYSBub3JtYWxpemVkIGZvcm0uCisgICAgICAgICAgY2RhdGEgPSByZS5zdWIoc291cmNlX2xpbmVfcGF0LCAnXFwxKlxuJywgY2hpbGQubm9kZVZhbHVlKQorICAgICAgICAgICMgUmVtb3ZlcyB0aGUgYWN0dWFsIHN0YWNrIHRyYWNlLgorICAgICAgICAgIGNoaWxkLm5vZGVWYWx1ZSA9IHJlLnN1YihyJ1xuU3RhY2sgdHJhY2U6XG4oLnxcbikqJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsIGNkYXRhKQorICAgIGZvciBjaGlsZCBpbiBlbGVtZW50LmNoaWxkTm9kZXM6CisgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgc2VsZi5Ob3JtYWxpemVYbWwoY2hpbGQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9wcm9kdWN0aW9uLmNjIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvcHJvZHVjdGlvbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhhNDBiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvcHJvZHVjdGlvbi5jYwpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoaXMgaXMgcGFydCBvZiB0aGUgdW5pdCB0ZXN0IGZvciBpbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaC4KKworI2luY2x1ZGUgInByb2R1Y3Rpb24uaCIKKworUHJpdmF0ZUNvZGU6OlByaXZhdGVDb2RlKCkgOiB4XygwKSB7fQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvcHJvZHVjdGlvbi5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3Rlc3QvcHJvZHVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZmQ1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvdGVzdC9wcm9kdWN0aW9uLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGlzIGlzIHBhcnQgb2YgdGhlIHVuaXQgdGVzdCBmb3IgaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmguCisKKyNpZm5kZWYgR1RFU1RfVEVTVF9QUk9EVUNUSU9OX0hfCisjZGVmaW5lIEdURVNUX1RFU1RfUFJPRFVDVElPTl9IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJvZC5oIgorCitjbGFzcyBQcml2YXRlQ29kZSB7CisgcHVibGljOgorICAvLyBEZWNsYXJlcyBhIGZyaWVuZCB0ZXN0IHRoYXQgZG9lcyBub3QgdXNlIGEgZml4dHVyZS4KKyAgRlJJRU5EX1RFU1QoUHJpdmF0ZUNvZGVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycyk7CisKKyAgLy8gRGVjbGFyZXMgYSBmcmllbmQgdGVzdCB0aGF0IHVzZXMgYSBmaXh0dXJlLgorICBGUklFTkRfVEVTVChQcml2YXRlQ29kZUZpeHR1cmVUZXN0LCBDYW5BY2Nlc3NQcml2YXRlTWVtYmVycyk7CisKKyAgUHJpdmF0ZUNvZGUoKTsKKworICBpbnQgeCgpIGNvbnN0IHsgcmV0dXJuIHhfOyB9CisgcHJpdmF0ZToKKyAgdm9pZCBzZXRfeChpbnQgYW5feCkgeyB4XyA9IGFuX3g7IH0KKyAgaW50IHhfOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9URVNUX1BST0RVQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9Db25maWcvRGVidWdQcm9qZWN0LnhjY29uZmlnIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9EZWJ1Z1Byb2plY3QueGNjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2ODE1NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9Db25maWcvRGVidWdQcm9qZWN0LnhjY29uZmlnCkBAIC0wLDAgKzEsMzAgQEAKKy8vCisvLyAgRGVidWdQcm9qZWN0LnhjY29uZmlnCisvLworLy8gIFRoZXNlIGFyZSBEZWJ1ZyBDb25maWd1cmF0aW9uIHByb2plY3Qgc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kCisvLyAgZXhhbXBsZXMuIEl0IGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJQcm9qZWN0IiBpbmZvCisvLyAgZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisjaW5jbHVkZSAiR2VuZXJhbC54Y2NvbmZpZyIKKworLy8gTm8gb3B0aW1pemF0aW9uCitHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMAorCisvLyBEZXBsb3ltZW50IHBvc3Rwcm9jZXNzaW5nIGlzIHdoYXQgdHJpZ2dlcnMgWGNvZGUgdG8gc3RyaXAsIHR1cm4gaXQgb2ZmCitERVBMT1lNRU5UX1BPU1RQUk9DRVNTSU5HID0gTk8KKworLy8gRGVhZCBjb2RlIHN0cmlwcGluZyBvZmYKK0RFQURfQ09ERV9TVFJJUFBJTkcgPSBOTworCisvLyBEZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBvbiBvYnZpb3VzbHkKK0dDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUworCisvLyBEZWZpbmUgdGhlIERFQlVHIG1hY3JvIGluIGFsbCBkZWJ1ZyBidWlsZHMKK09USEVSX0NGTEFHUyA9ICQoT1RIRVJfQ0ZMQUdTKSAtRERFQlVHPTEKKworLy8gVGhlc2UgYXJlIHR1cm5lZCBvZmYgdG8gYXZvaWQgU1RMIGluY29tcGF0aWJpbGl0aWVzIHdpdGggY2xpZW50IGNvZGUKKy8vIC8vIFR1cm5zIG9uIHNwZWNpYWwgQysrIFNUTCBjaGVja3MgdG8gImVuY291cmFnZSIgZ29vZCBTVEwgdXNlCisvLyBHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gJChHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TKSBfR0xJQkNYWF9ERUJVR19QRURBTlRJQyBfR0xJQkNYWF9ERUJVRyBfR0xJQkNQUF9DT05DRVBUX0NIRUNLUwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9GcmFtZXdvcmtUYXJnZXQueGNjb25maWcgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvQ29uZmlnL0ZyYW1ld29ya1RhcmdldC54Y2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTdiMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9GcmFtZXdvcmtUYXJnZXQueGNjb25maWcKQEAgLTAsMCArMSwxNyBAQAorLy8KKy8vICBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcKKy8vCisvLyAgVGhlc2UgYXJlIEZyYW1ld29yayB0YXJnZXQgc2V0dGluZ3MgZm9yIHRoZSBndGVzdCBmcmFtZXdvcmsgYW5kIGV4YW1wbGVzLiBJdAorLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBEeW5hbWljIGxpYnMgbmVlZCB0byBiZSBwb3NpdGlvbiBpbmRlcGVuZGVudAorR0NDX0RZTkFNSUNfTk9fUElDID0gTk8KKworLy8gRHluYW1pYyBsaWJzIHNob3VsZCBub3QgaGF2ZSB0aGVpciBleHRlcm5hbCBzeW1ib2xzIHN0cmlwcGVkLgorU1RSSVBfU1RZTEUgPSBub24tZ2xvYmFsCisKKy8vIExldCB0aGUgdXNlciBpbnN0YWxsIGJ5IHNwZWNpZnlpbmcgdGhlICREU1RST09UIHdpdGggeGNvZGVidWlsZAorU0tJUF9JTlNUQUxMID0gTk8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9Db25maWcvR2VuZXJhbC54Y2NvbmZpZyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9Db25maWcvR2VuZXJhbC54Y2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjNlMzIyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9HZW5lcmFsLnhjY29uZmlnCkBAIC0wLDAgKzEsNDEgQEAKKy8vCisvLyAgR2VuZXJhbC54Y2NvbmZpZworLy8KKy8vICBUaGVzZSBhcmUgR2VuZXJhbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgZ3Rlc3QgZnJhbWV3b3JrIGFuZAorLy8gIGV4YW1wbGVzLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBCdWlsZCBmb3IgUFBDIGFuZCBJbnRlbCwgMzItIGFuZCA2NC1iaXQKK0FSQ0hTID0gaTM4NiB4ODZfNjQgcHBjIHBwYzY0CisKKy8vIFplcm9saW5rIHByZXZlbnRzIGxpbmsgd2FybmluZ3Mgc28gdHVybiBpdCBvZmYKK1pFUk9fTElOSyA9IE5PCisKKy8vIFByZWJpbmRpbmcgY29uc2lkZXJlZCB1bmhlbHBmdWwgaW4gMTAuMyBhbmQgbGF0ZXIKK1BSRUJJTkRJTkcgPSBOTworCisvLyBTdHJpY3Rlc3Qgd2FybmluZyBwb2xpY3kKK1dBUk5JTkdfQ0ZMQUdTID0gLVdhbGwgLVdlcnJvciAtV2VuZGlmLWxhYmVscyAtV25ld2xpbmUtZW9mIC1Xbm8tc2lnbi1jb21wYXJlIC1Xc2hhZG93CisKKy8vIFdvcmsgYXJvdW5kIFhjb2RlIGJ1Z3MgYnkgdXNpbmcgZXh0ZXJuYWwgc3RyaXAuIFNlZToKKy8vIGh0dHA6Ly9saXN0cy5hcHBsZS5jb20vYXJjaGl2ZXMvWGNvZGUtdXNlcnMvMjAwNi9GZWIvbXNnMDAwNTAuaHRtbAorU0VQQVJBVEVfU1RSSVAgPSBZRVMKKworLy8gRm9yY2UgQzk5IGRpYWxlY3QKK0dDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gYzk5CisKKy8vIG5vdCBzdXJlIHdoeSBhcHBsZSBkZWZhdWx0cyB0aGlzIG9uLCBidXQgaXQncyBwcmV0dHkgcmlza3kKK0FMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5PCisKKy8vIFR1cm4gb24gcG9zaXRpb24gZGVwZW5kZW50IGNvZGUgZm9yIG1vc3QgY2FzZXMgKG92ZXJyaWRkZW4gd2hlcmUgYXBwcm9wcmlhdGUpCitHQ0NfRFlOQU1JQ19OT19QSUMgPSBZRVMKKworLy8gRGVmYXVsdCBTREsgYW5kIG1pbmltdW0gT1MgdmVyc2lvbiBpcyAxMC40CitTREtST09UID0gJChERVZFTE9QRVJfU0RLX0RJUikvTWFjT1NYMTAuNHUuc2RrCitNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAxMC40CitHQ0NfVkVSU0lPTiA9IDQuMAorCisvLyBWRVJTSU9OSU5HIEJVSUxEIFNFVFRJTkdTICh1c2VkIGluIEluZm8ucGxpc3QpCitHVEVTVF9WRVJTSU9OSU5GT19BQk9VVCA9ICDCqSAyMDA4IEdvb2dsZSBJbmMuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvQ29uZmlnL1JlbGVhc2VQcm9qZWN0LnhjY29uZmlnIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQ5ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9SZWxlYXNlUHJvamVjdC54Y2NvbmZpZwpAQCAtMCwwICsxLDMyIEBACisvLworLy8gIFJlbGVhc2VQcm9qZWN0LnhjY29uZmlnCisvLworLy8gIFRoZXNlIGFyZSBSZWxlYXNlIENvbmZpZ3VyYXRpb24gcHJvamVjdCBzZXR0aW5ncyBmb3IgdGhlIGd0ZXN0IGZyYW1ld29yaworLy8gIGFuZCBleGFtcGxlcy4gSXQgaXMgc2V0IGluIHRoZSAiQmFzZWQgT246IiBkcm9wZG93biBpbiB0aGUgIlByb2plY3QiIGluZm8KKy8vICBkaWFsb2cuCisvLyAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBYY29kZSBDb25maWd1cmF0aW9uIGZpbGVzIGluOgorLy8gIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtdG9vbGJveC1mb3ItbWFjLworLy8gCisKKyNpbmNsdWRlICJHZW5lcmFsLnhjY29uZmlnIgorCisvLyBzdWJjb25maWcvUmVsZWFzZS54Y2NvbmZpZworCisvLyBPcHRpbWl6ZSBmb3Igc3BhY2UgYW5kIHNpemUgKEFwcGxlIHJlY29tbWVuZGF0aW9uKQorR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IHMKKworLy8gRGVwbG9tZW50IHBvc3Rwcm9jZXNzaW5nIGlzIHdoYXQgdHJpZ2dlcnMgWGNvZGUgdG8gc3RyaXAKK0RFUExPWU1FTlRfUE9TVFBST0NFU1NJTkcgPSBZRVMKKworLy8gTm8gc3ltYm9scworR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk8KKworLy8gRGVhZCBjb2RlIHN0cmlwIGRvZXMgbm90IGFmZmVjdCBPYmpDIGNvZGUgYnV0IGNhbiBoZWxwIGZvciBDCitERUFEX0NPREVfU1RSSVBQSU5HID0gWUVTCisKKy8vIE5ERUJVRyBpcyB1c2VkIGJ5IHRoaW5ncyBsaWtlIGFzc2VydC5oLCBzbyBkZWZpbmUgaXQgZm9yIGdlbmVyYWwgY29tcGF0LgorLy8gQVNTRVJUIGdvaW5nIGF3YXkgaW4gcmVsZWFzZSB0ZW5kcyB0byBjcmVhdGUgdW51c2VkIHZhcnMuCitPVEhFUl9DRkxBR1MgPSAkKE9USEVSX0NGTEFHUykgLUROREVCVUc9MSAtV25vLXVudXNlZC12YXJpYWJsZQorCisvLyBXaGVuIHdlIHN0cmlwIHdlIHdhbnQgdG8gc3RyaXAgYWxsIHN5bWJvbHMgaW4gcmVsZWFzZSwgYnV0IHNhdmUgZXh0ZXJuYWxzLgorU1RSSVBfU1RZTEUgPSBhbGwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9Db25maWcvU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9Db25maWcvU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTIyZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9TdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnCkBAIC0wLDAgKzEsMTggQEAKKy8vCisvLyAgU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZworLy8KKy8vICBUaGVzZSBhcmUgc3RhdGljIGxpYnJhcnkgdGFyZ2V0IHNldHRpbmdzIGZvciBsaWJndGVzdC5hLiBJdAorLy8gIGlzIHNldCBpbiB0aGUgIkJhc2VkIE9uOiIgZHJvcGRvd24gaW4gdGhlICJUYXJnZXQiIGluZm8gZGlhbG9nLgorLy8gIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgWGNvZGUgQ29uZmlndXJhdGlvbiBmaWxlcyBpbjoKKy8vICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXRvb2xib3gtZm9yLW1hYy8KKy8vIAorCisvLyBTdGF0aWMgbGlicyBjYW4gYmUgaW5jbHVkZWQgaW4gYnVuZGxlcyBzbyBtYWtlIHRoZW0gcG9zaXRpb24gaW5kZXBlbmRlbnQKK0dDQ19EWU5BTUlDX05PX1BJQyA9IE5PCisKKy8vIFN0YXRpYyBsaWJzIHNob3VsZCBub3QgaGF2ZSB0aGVpciBpbnRlcm5hbCBnbG9iYWxzIG9yIGV4dGVybmFsIHN5bWJvbHMKKy8vIHN0cmlwcGVkLgorU1RSSVBfU1RZTEUgPSBkZWJ1Z2dpbmcKKworLy8gTGV0IHRoZSB1c2VyIGluc3RhbGwgYnkgc3BlY2lmeWluZyB0aGUgJERTVFJPT1Qgd2l0aCB4Y29kZWJ1aWxkCitTS0lQX0lOU1RBTEwgPSBOTwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9UZXN0VGFyZ2V0LnhjY29uZmlnIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL0NvbmZpZy9UZXN0VGFyZ2V0LnhjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjUyYmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvQ29uZmlnL1Rlc3RUYXJnZXQueGNjb25maWcKQEAgLTAsMCArMSw4IEBACisvLworLy8gIFRlc3RUYXJnZXQueGNjb25maWcKKy8vCisvLyAgVGhlc2UgYXJlIFRlc3QgdGFyZ2V0IHNldHRpbmdzIGZvciB0aGUgZ3Rlc3QgZnJhbWV3b3JrIGFuZCBleGFtcGxlcy4gSXQKKy8vICBpcyBzZXQgaW4gdGhlICJCYXNlZCBPbjoiIGRyb3Bkb3duIGluIHRoZSAiVGFyZ2V0IiBpbmZvIGRpYWxvZy4KKworUFJPRFVDVF9OQU1FID0gJChUQVJHRVRfTkFNRSkKK0hFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi9pbmNsdWRlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvUmVzb3VyY2VzL0luZm8ucGxpc3QgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvUmVzb3VyY2VzL0luZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkMjhlYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9SZXNvdXJjZXMvSW5mby5wbGlzdApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20uZ29vZ2xlLiR7UFJPRFVDVF9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Rk1XSzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+R1RFU1RfVkVSU0lPTklORk9fTE9ORzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPkdURVNUX1ZFUlNJT05JTkZPX1NIT1JUPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPiR7UFJPRFVDVF9OQU1FfSBHVEVTVF9WRVJTSU9OSU5GT19MT05HLCAke0dURVNUX1ZFUlNJT05JTkZPX0FCT1VUfTwvc3RyaW5nPgorCTxrZXk+TlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0PC9rZXk+CisJPHN0cmluZz4ke0dURVNUX1ZFUlNJT05JTkZPX0FCT1VUfTwvc3RyaW5nPgorCTxrZXk+Q1NSZXNvdXJjZXNGaWxlTWFwcGVkPC9rZXk+CisJPHRydWUvPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0IGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL0luZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4NTJlZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS5nb29nbGUuZ3Rlc3QuJHtQUk9EVUNUX05BTUU6aWRlbnRpZmllcn08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5GTVdLPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNTUmVzb3VyY2VzRmlsZU1hcHBlZDwva2V5PgorCTx0cnVlLz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvV2lkZ2V0RnJhbWV3b3JrLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvV2lkZ2V0RnJhbWV3b3JrLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3NjE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9XaWRnZXRGcmFtZXdvcmsueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMCwwICsxLDQ1NyBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQyOworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisJCTQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RSAvKiBUZXN0ICovID0geworCQkJaXNhID0gUEJYQWdncmVnYXRlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwMjREMTY5MTEzRDdENDYwMEM3MDU5RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiVGVzdCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDI0RDE2MTExM0Q3RDI0MDBDNzA1OUUgLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwMjREMTY2MTEzRDdEMzEwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0OworCQkJcHJvZHVjdE5hbWUgPSBUZXN0QW5kQnVpbGQ7CisJCX07CisJCTQwMjREMUU5MTEzRDgzRkYwMEM3MDU5RSAvKiBUZXN0QW5kQnVpbGQgKi8gPSB7CisJCQlpc2EgPSBQQlhBZ2dyZWdhdGVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDAyNEQxRjAxMTNEODQyQjAwQzcwNTlFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJUZXN0QW5kQnVpbGQiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwMjREMUVEMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJCTQwMjREMUVGMTEzRDg0MEQwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0QW5kQnVpbGQ7CisJCQlwcm9kdWN0TmFtZSA9IFRlc3RBbmRCdWlsZDsKKwkJfTsKKy8qIEVuZCBQQlhBZ2dyZWdhdGVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkzQjdFQjEyNTBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjMwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyAqLzsgfTsKKwkJM0I3RUIxMjYwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJM0I3RUIxMjgwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovOyB9OworCQkzQjdFQjE0ODBFNUFGM0I0MDBDN0YyMzkgLyogV2lkZ2V0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXQuZnJhbWV3b3JrICovOyB9OworCQk0MDI0RDE4ODExM0Q3RDc4MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwMjREMTg1MTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdC5hICovOyB9OworCQk0MDI0RDE4OTExM0Q3RDdBMDBDNzA1OUUgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDAyNEQxODMxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKy8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLworCQkzQjA3QkRGMDBFM0YzRkFFMDA2NDc4NjkgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwOworCQkJcmVtb3RlSW5mbyA9IGdUZXN0RXhhbXBsZTsKKwkJfTsKKwkJNDAyNEQxNjUxMTNEN0QzMTAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDNCMDdCREU5MEUzRjNGOUUwMDY0Nzg2OTsKKwkJCXJlbW90ZUluZm8gPSBXaWRnZXRGcmFtZXdvcmtUZXN0OworCQl9OworCQk0MDI0RDFFQzExM0Q4NDA5MDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwOworCQkJcmVtb3RlSW5mbyA9IFdpZGdldEZyYW1ld29yazsKKwkJfTsKKwkJNDAyNEQxRUUxMTNEODQwRDAwQzcwNTlFIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RTsKKwkJCXJlbW90ZUluZm8gPSBUZXN0OworCQl9OworLyogRW5kIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkzQjA3QkRFQTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJM0I3RUIxMjMwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IHdpZGdldC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSB3aWRnZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gd2lkZ2V0X3Rlc3QuY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwMjREMTgzMTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gbGliZ3Rlc3RfbWFpbi5hOyBwYXRoID0gL3Vzci9sb2NhbC9saWIvbGliZ3Rlc3RfbWFpbi5hOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQk0MDI0RDE4NTExM0Q3RDU1MDBDNzA1OUUgLyogbGliZ3Rlc3QuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSBsaWJndGVzdC5hOyBwYXRoID0gL3Vzci9sb2NhbC9saWIvbGliZ3Rlc3QuYTsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKKwkJNDAyNEQxRTIxMTNEODM4MjAwQzcwNTlFIC8qIHJ1bnRlc3RzLnNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5zY3JpcHQuc2g7IHBhdGggPSBydW50ZXN0cy5zaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQwN0YyQzcwNDg2Q0M3QTAwN0NEMUQwIC8qIEluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0OyBwYXRoID0gSW5mby5wbGlzdDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOEQwN0YyQzgwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBXaWRnZXQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTNCMDdCREU4MEUzRjNGOUUwMDY0Nzg2OSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDAyNEQxODkxMTNEN0Q3QTAwQzcwNTlFIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTQwMjREMTg4MTEzRDdENzgwMEM3MDU5RSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0I3RUIxNDgwRTVBRjNCNDAwQzdGMjM5IC8qIFdpZGdldC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJOEQwN0YyQzMwNDg2Q0M3QTAwN0NEMUQwIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk4RDA3RjJDODA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0LmZyYW1ld29yayAqLywKKwkJCQkzQjA3QkRFQTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLywKKwkJCSk7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyogZ1Rlc3RFeGFtcGxlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDI0RDFFMTExM0Q4MzZDMDBDNzA1OUUgLyogU2NyaXB0cyAqLywKKwkJCQkwOEZCNzdBQ0ZFODQxNzA3QzAyQUFDMDcgLyogU291cmNlICovLAorCQkJCTA4OUMxNjY1RkU4NDExNThDMDJBQUMwNyAvKiBSZXNvdXJjZXMgKi8sCisJCQkJM0IwN0JFMzUwRTQwOTRFNDAwNjQ3ODY5IC8qIFRlc3QgKi8sCisJCQkJMDg2N0Q2OUFGRTg0MDI4RkMwMkFBQzA3IC8qIEV4dGVybmFsIEZyYW1ld29ya3MgYW5kIExpYnJhcmllcyAqLywKKwkJCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJbmFtZSA9IGdUZXN0RXhhbXBsZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjlBRkU4NDAyOEZDMDJBQUMwNyAvKiBFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwMjREMTgzMTEzRDdENTUwMEM3MDU5RSAvKiBsaWJndGVzdF9tYWluLmEgKi8sCisJCQkJNDAyNEQxODUxMTNEN0Q1NTAwQzcwNTlFIC8qIGxpYmd0ZXN0LmEgKi8sCisJCQkpOworCQkJbmFtZSA9ICJFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDg5QzE2NjVGRTg0MTE1OEMwMkFBQzA3IC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJOEQwN0YyQzcwNDg2Q0M3QTAwN0NEMUQwIC8qIEluZm8ucGxpc3QgKi8sCisJCQkpOworCQkJbmFtZSA9IFJlc291cmNlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTNCN0VCMTIzMEU1QUVFMzUwMEM3RjIzOSAvKiB3aWRnZXQuY2MgKi8sCisJCQkJM0I3RUIxMjQwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oICovLAorCQkJKTsKKwkJCW5hbWUgPSBTb3VyY2U7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQjA3QkUzNTBFNDA5NEU0MDA2NDc4NjkgLyogVGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0I3RUIxMjcwRTVBRUU0NjAwQzdGMjM5IC8qIHdpZGdldF90ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSBUZXN0OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJNDAyNEQxRTExMTNEODM2QzAwQzcwNTlFIC8qIFNjcmlwdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwMjREMUUyMTEzRDgzODIwMEM3MDU5RSAvKiBydW50ZXN0cy5zaCAqLywKKwkJCSk7CisJCQluYW1lID0gU2NyaXB0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovID0geworCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJM0I3RUIxMjYwRTVBRUUzNTAwQzdGMjM5IC8qIHdpZGdldC5oIGluIEhlYWRlcnMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCQkzQjA3QkRFOTBFM0YzRjlFMDA2NDc4NjkgLyogV2lkZ2V0RnJhbWV3b3JrVGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAzQjA3QkRGNDBFM0YzRkI2MDA2NDc4NjkgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIldpZGdldEZyYW1ld29ya1Rlc3QiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJM0IwN0JERTcwRTNGM0Y5RTAwNjQ3ODY5IC8qIFNvdXJjZXMgKi8sCisJCQkJM0IwN0JERTgwRTNGM0Y5RTAwNjQ3ODY5IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJM0IwN0JERjEwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IFdpZGdldEZyYW1ld29ya1Rlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IGdUZXN0RXhhbXBsZVRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gM0IwN0JERUEwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDAgLyogV2lkZ2V0RnJhbWV3b3JrICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQyMDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiV2lkZ2V0RnJhbWV3b3JrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCThEMDdGMkMxMDQ4NkNDN0EwMDdDRDFEMCAvKiBTb3VyY2VzICovLAorCQkJCThEMDdGMkMzMDQ4NkNDN0EwMDdDRDFEMCAvKiBGcmFtZXdvcmtzICovLAorCQkJCThEMDdGMkJEMDQ4NkNDN0EwMDdDRDFEMCAvKiBIZWFkZXJzICovLAorCQkJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJOEQwN0YyQzUwNDg2Q0M3QTAwN0NEMUQwIC8qIFJleiAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gV2lkZ2V0RnJhbWV3b3JrOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIjsKKwkJCXByb2R1Y3ROYW1lID0gZ1Rlc3RFeGFtcGxlOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDhEMDdGMkM4MDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXQuZnJhbWV3b3JrICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5mcmFtZXdvcmsiOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIldpZGdldEZyYW1ld29yayIgKi87CisJCQljb21wYXRpYmlsaXR5VmVyc2lvbiA9ICJYY29kZSAyLjQiOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDE7CisJCQltYWluR3JvdXAgPSAwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyogZ1Rlc3RFeGFtcGxlICovOworCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXRGcmFtZXdvcmsgKi8sCisJCQkJM0IwN0JERTkwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi8sCisJCQkJNDAyNEQxNjIxMTNEN0QyNDAwQzcwNTlFIC8qIFRlc3QgKi8sCisJCQkJNDAyNEQxRTkxMTNEODNGRjAwQzcwNTlFIC8qIFRlc3RBbmRCdWlsZCAqLywKKwkJCSk7CisJCX07CisvKiBFbmQgUEJYUHJvamVjdCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDA3RjJCRjA0ODZDQzdBMDA3Q0QxRDAgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmV6QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEMDdGMkM1MDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXogKi8gPSB7CisJCQlpc2EgPSBQQlhSZXpCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlekJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk0MDI0RDE2MTExM0Q3RDI0MDBDNzA1OUUgLyogU2hlbGxTY3JpcHQgKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCSk7CisJCQlvdXRwdXRQYXRocyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7CisJCQlzaGVsbFNjcmlwdCA9ICIvYmluL2Jhc2ggJFNSQ1JPT1QvcnVudGVzdHMuc2ggJEJVSUxUX1BST0RVQ1RTX0RJUi9XaWRnZXRGcmFtZXdvcmtUZXN0XG4iOworCQl9OworLyogRW5kIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0IwN0JERTcwRTNGM0Y5RTAwNjQ3ODY5IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkzQjdFQjEyODBFNUFFRTQ2MDBDN0YyMzkgLyogd2lkZ2V0X3Rlc3QuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJOEQwN0YyQzEwNDg2Q0M3QTAwN0NEMUQwIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkzQjdFQjEyNTBFNUFFRTM1MDBDN0YyMzkgLyogd2lkZ2V0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKwkJM0IwN0JERjEwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIFdpZGdldEZyYW1ld29yayAqLzsKKwkJCXRhcmdldFByb3h5ID0gM0IwN0JERjAwRTNGM0ZBRTAwNjQ3ODY5IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDAyNEQxNjYxMTNEN0QzMTAwQzcwNTlFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gM0IwN0JERTkwRTNGM0Y5RTAwNjQ3ODY5IC8qIFdpZGdldEZyYW1ld29ya1Rlc3QgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwMjREMTY1MTEzRDdEMzEwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwMjREMUVEMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBXaWRnZXRGcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwMjREMUVDMTEzRDg0MDkwMEM3MDU5RSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwMjREMUVGMTEzRDg0MEQwMEM3MDU5RSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwMjREMTYyMTEzRDdEMjQwMEM3MDU5RSAvKiBUZXN0ICovOworCQkJdGFyZ2V0UHJveHkgPSA0MDI0RDFFRTExM0Q4NDBEMDBDNzA1OUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworLyogRW5kIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCTNCMDdCREVDMEUzRjNGOUYwMDY0Nzg2OSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSBXaWRnZXRGcmFtZXdvcmtUZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJM0IwN0JERUQwRTNGM0Y5RjAwNjQ3ODY5IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gV2lkZ2V0RnJhbWV3b3JrVGVzdDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxNjMxMTNEN0QyNDAwQzcwNTlFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwMjREMTY0MTEzRDdEMjQwMEM3MDU5RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxRUExMTNEODNGRjAwQzcwNTlFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwMjREMUVCMTEzRDgzRkYwMEM3MDU5RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3RBbmRCdWlsZDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICJAbG9hZGVyX3BhdGgvLi4vRnJhbWV3b3JrcyI7CisJCQkJUFJPRFVDVF9OQU1FID0gV2lkZ2V0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNEZBREMyNDQwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlJTkZPUExJU1RfRklMRSA9IEluZm8ucGxpc3Q7CisJCQkJSU5TVEFMTF9QQVRIID0gIkBsb2FkZXJfcGF0aC8uLi9GcmFtZXdvcmtzIjsKKwkJCQlQUk9EVUNUX05BTUUgPSBXaWRnZXQ7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ3MDhCNDE1NkQwMEFCRTU1RSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfVkVSU0lPTiA9IDQuMDsKKwkJCQlTREtST09UID0gL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkazsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gNC4wOworCQkJCVNES1JPT1QgPSAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTNCMDdCREY0MEUzRjNGQjYwMDY0Nzg2OSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiV2lkZ2V0RnJhbWV3b3JrVGVzdCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkzQjA3QkRFQzBFM0YzRjlGMDA2NDc4NjkgLyogRGVidWcgKi8sCisJCQkJM0IwN0JERUQwRTNGM0Y5RjAwNjQ3ODY5IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDAyNEQxNjkxMTNEN0Q0NjAwQzcwNTlFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJUZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwMjREMTYzMTEzRDdEMjQwMEM3MDU5RSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDI0RDE2NDExM0Q3RDI0MDBDNzA1OUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDI0RDFGMDExM0Q4NDJCMDBDNzA1OUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlRlc3RBbmRCdWlsZCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0MDI0RDFFQTExM0Q4M0ZGMDBDNzA1OUUgLyogRGVidWcgKi8sCisJCQkJNDAyNEQxRUIxMTNEODNGRjAwQzcwNTlFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDIwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJXaWRnZXRGcmFtZXdvcmsiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAorCQkJCTRGQURDMjQ0MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIldpZGdldEZyYW1ld29yayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCisJCQkJNEZBREMyNDgwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvcnVudGVzdHMuc2ggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvcnVudGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwZDQxMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgRXhlY3V0ZXMgdGhlIHNhbXBsZXMgYW5kIHRlc3RzIGZvciB0aGUgR29vZ2xlIFRlc3QgRnJhbWV3b3JrLgorCisjIEhlbHAgdGhlIGR5bmFtaWMgbGlua2VyIGZpbmQgdGhlIHBhdGggdG8gdGhlIGxpYnJhcmllcy4KK2V4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKK2V4cG9ydCBEWUxEX0xJQlJBUllfUEFUSD0kQlVJTFRfUFJPRFVDVFNfRElSCisKKyMgQ3JlYXRlIHNvbWUgZXhlY3V0YWJsZXMuCit0ZXN0X2V4ZWN1dGFibGVzPSRACisKKyMgTm93IGV4ZWN1dGUgZWFjaCBvbmUgaW4gdHVybiBrZWVwaW5nIHRyYWNrIG9mIGhvdyBtYW55IHN1Y2NlZWRlZCBhbmQgZmFpbGVkLgorc3VjY2VlZGVkPTAKK2ZhaWxlZD0wCitmYWlsZWRfbGlzdD0oKQorZm9yIHRlc3QgaW4gJHt0ZXN0X2V4ZWN1dGFibGVzWypdfTsgZG8KKyAgIiR0ZXN0IgorICByZXN1bHQ9JD8KKyAgaWYgWyAkcmVzdWx0IC1lcSAwIF07IHRoZW4KKyAgICBzdWNjZWVkZWQ9JCgoICRzdWNjZWVkZWQgKyAxICkpCisgIGVsc2UKKyAgICBmYWlsZWQ9JCgoIGZhaWxlZCArIDEgKSkKKyAgICBmYWlsZWRfbGlzdD0iJGZhaWxlZF9saXN0ICR0ZXN0IgorICBmaQorZG9uZQorCisjIFJlcG9ydCB0aGUgc3VjY2Vzc2VzIGFuZCBmYWlsdXJlcyB0byB0aGUgY29uc29sZS4KK2VjaG8gIlRlc3RzIGNvbXBsZXRlIHdpdGggJHN1Y2NlZWRlZCBzdWNjZXNzZXMgYW5kICRmYWlsZWQgZmFpbHVyZXMuIgoraWYgWyAkZmFpbGVkIC1uZSAwIF07IHRoZW4KKyAgZWNobyAiVGhlIGZvbGxvd2luZyB0ZXN0cyBmYWlsZWQ6IgorICBlY2hvICRmYWlsZWRfbGlzdAorZmkKK2V4aXQgJGZhaWxlZApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjNGU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXQuY2MKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCisvLworLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKKy8vIHdpZGdldC5jYworLy8KKworLy8gV2lkZ2V0IGlzIGEgdmVyeSBzaW1wbGUgY2xhc3MgdXNlZCBmb3IgZGVtb25zdHJhdGluZyB0aGUgdXNlIG9mIGd0ZXN0CisKKyNpbmNsdWRlICJ3aWRnZXQuaCIKKworV2lkZ2V0OjpXaWRnZXQoaW50IG51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgOiBudW1iZXJfKG51bWJlciksCisgICAgICBuYW1lXyhuYW1lKSB7fQorCitXaWRnZXQ6On5XaWRnZXQoKSB7fQorCitmbG9hdCBXaWRnZXQ6OkdldEZsb2F0VmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBudW1iZXJfOworfQorCitpbnQgV2lkZ2V0OjpHZXRJbnRWYWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obnVtYmVyXyk7Cit9CisKK3N0ZDo6c3RyaW5nIFdpZGdldDo6R2V0U3RyaW5nVmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lXzsKK30KKwordm9pZCBXaWRnZXQ6OkdldENoYXJQdHJWYWx1ZShjaGFyKiBidWZmZXIsIHNpemVfdCBtYXhfc2l6ZSkgY29uc3QgeworICAvLyBDb3B5IHRoZSBjaGFyKiByZXByZXNlbnRhdGlvbiBvZiBuYW1lXyBpbnRvIGJ1ZmZlciwgdXAgdG8gbWF4X3NpemUuCisgIHN0cm5jcHkoYnVmZmVyLCBuYW1lXy5jX3N0cigpLCBtYXhfc2l6ZS0xKTsKKyAgYnVmZmVyW21heF9zaXplLTFdID0gJ1wwJzsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5oIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTVjZGMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2FtcGxlcy9GcmFtZXdvcmtTYW1wbGUvd2lkZ2V0LmgKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogcHJlc3Rvbi5hLmphY2tzb25AZ21haWwuY29tIChQcmVzdG9uIEphY2tzb24pCisvLworLy8gR29vZ2xlIFRlc3QgLSBGcmFtZXdvcmtTYW1wbGUKKy8vIHdpZGdldC5oCisvLworCisvLyBXaWRnZXQgaXMgYSB2ZXJ5IHNpbXBsZSBjbGFzcyB1c2VkIGZvciBkZW1vbnN0cmF0aW5nIHRoZSB1c2Ugb2YgZ3Rlc3QuIEl0CisvLyBzaW1wbHkgc3RvcmVzIHR3byB2YWx1ZXMgYSBzdHJpbmcgYW5kIGFuIGludGVnZXIsIHdoaWNoIGFyZSByZXR1cm5lZCB2aWEKKy8vIHB1YmxpYyBhY2Nlc3NvcnMgaW4gbXVsdGlwbGUgZm9ybXMuCisKKyNpbXBvcnQgPHN0cmluZz4KKworY2xhc3MgV2lkZ2V0IHsKKyBwdWJsaWM6CisgIFdpZGdldChpbnQgbnVtYmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisgIH5XaWRnZXQoKTsKKworICAvLyBQdWJsaWMgYWNjZXNzb3JzIHRvIG51bWJlciBkYXRhCisgIGZsb2F0IEdldEZsb2F0VmFsdWUoKSBjb25zdDsKKyAgaW50IEdldEludFZhbHVlKCkgY29uc3Q7CisKKyAgLy8gUHVibGljIGFjY2Vzc29ycyB0byB0aGUgc3RyaW5nIGRhdGEKKyAgc3RkOjpzdHJpbmcgR2V0U3RyaW5nVmFsdWUoKSBjb25zdDsKKyAgdm9pZCBHZXRDaGFyUHRyVmFsdWUoY2hhciogYnVmZmVyLCBzaXplX3QgbWF4X3NpemUpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gRGF0YSBtZW1iZXJzCisgIGZsb2F0IG51bWJlcl87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXRfdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TYW1wbGVzL0ZyYW1ld29ya1NhbXBsZS93aWRnZXRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzI1OTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL1NhbXBsZXMvRnJhbWV3b3JrU2FtcGxlL3dpZGdldF90ZXN0LmNjCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHByZXN0b24uYS5qYWNrc29uQGdtYWlsLmNvbSAoUHJlc3RvbiBKYWNrc29uKQorLy8KKy8vIEdvb2dsZSBUZXN0IC0gRnJhbWV3b3JrU2FtcGxlCisvLyB3aWRnZXRfdGVzdC5jYworLy8KKworLy8gVGhpcyBpcyBhIHNpbXBsZSB0ZXN0IGZpbGUgZm9yIHRoZSBXaWRnZXQgY2xhc3MgaW4gdGhlIFdpZGdldC5mcmFtZXdvcmsKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8V2lkZ2V0L3dpZGdldC5oPgorCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgY29uc3RydWN0b3Igc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlCisvLyBXaWRnZXQgY2xhc3MgY29ycmVjdGx5LgorVEVTVChXaWRnZXRJbml0aWFsaXplclRlc3QsIFRlc3RDb25zdHJ1Y3RvcikgeworICBXaWRnZXQgd2lkZ2V0KDEuMGYsICJuYW1lIik7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjBmLCB3aWRnZXQuR2V0RmxvYXRWYWx1ZSgpKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCJuYW1lIiksIHdpZGdldC5HZXRTdHJpbmdWYWx1ZSgpKTsKK30KKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBmbG9hdCBhbmQgc3RyaW5nIHZhbHVlcyB0byBpbnQgYW5kCisvLyBjaGFyKiwgcmVzcGVjdGl2ZWx5LgorVEVTVChXaWRnZXRJbml0aWFsaXplclRlc3QsIFRlc3RDb252ZXJzaW9uKSB7CisgIFdpZGdldCB3aWRnZXQoMS4wZiwgIm5hbWUiKTsKKyAgRVhQRUNUX0VRKDEsIHdpZGdldC5HZXRJbnRWYWx1ZSgpKTsKKworICBzaXplX3QgbWF4X3NpemUgPSAxMjg7CisgIGNoYXIgYnVmZmVyW21heF9zaXplXTsKKyAgd2lkZ2V0LkdldENoYXJQdHJWYWx1ZShidWZmZXIsIG1heF9zaXplKTsKKyAgRVhQRUNUX1NUUkVRKCJuYW1lIiwgYnVmZmVyKTsKK30KKworLy8gVXNlIHRoZSBHb29nbGUgVGVzdCBtYWluIHRoYXQgaXMgbGlua2VkIGludG8gdGhlIGZyYW1ld29yay4gSXQgZG9lcyBzb21ldGhpbmcKKy8vIGxpa2UgdGhpczoKKy8vIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworLy8gICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisvLyAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7CisvLyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2NyaXB0cy9ydW50ZXN0cy5zaCBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TY3JpcHRzL3J1bnRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzIyOWYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2NyaXB0cy9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDY1IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgRXhlY3V0ZXMgdGhlIHNhbXBsZXMgYW5kIHRlc3RzIGZvciB0aGUgR29vZ2xlIFRlc3QgRnJhbWV3b3JrLgorCisjIEhlbHAgdGhlIGR5bmFtaWMgbGlua2VyIGZpbmQgdGhlIHBhdGggdG8gdGhlIGxpYnJhcmllcy4KK2V4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIPSRCVUlMVF9QUk9EVUNUU19ESVIKK2V4cG9ydCBEWUxEX0xJQlJBUllfUEFUSD0kQlVJTFRfUFJPRFVDVFNfRElSCisKKyMgQ3JlYXRlIHNvbWUgZXhlY3V0YWJsZXMuCit0ZXN0X2V4ZWN1dGFibGVzPSgiJEJVSUxUX1BST0RVQ1RTX0RJUi9ndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiCisgICAgICAgICAgICAgICAgICAiJEJVSUxUX1BST0RVQ1RTX0RJUi9ndGVzdF91bml0dGVzdCIKKyAgICAgICAgICAgICAgICAgICIkQlVJTFRfUFJPRFVDVFNfRElSL3NhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIgorICAgICAgICAgICAgICAgICAgIiRCVUlMVF9QUk9EVUNUU19ESVIvc2FtcGxlMV91bml0dGVzdC1zdGF0aWMiKQorCisjIE5vdyBleGVjdXRlIGVhY2ggb25lIGluIHR1cm4ga2VlcGluZyB0cmFjayBvZiBob3cgbWFueSBzdWNjZWVkZWQgYW5kIGZhaWxlZC4gCitzdWNjZWVkZWQ9MAorZmFpbGVkPTAKK2ZhaWxlZF9saXN0PSgpCitmb3IgdGVzdCBpbiAke3Rlc3RfZXhlY3V0YWJsZXNbKl19OyBkbworICAiJHRlc3QiCisgIHJlc3VsdD0kPworICBpZiBbICRyZXN1bHQgLWVxIDAgXTsgdGhlbgorICAgIHN1Y2NlZWRlZD0kKCggJHN1Y2NlZWRlZCArIDEgKSkKKyAgZWxzZQorICAgIGZhaWxlZD0kKCggZmFpbGVkICsgMSApKQorICAgIGZhaWxlZF9saXN0PSIkZmFpbGVkX2xpc3QgJHRlc3QiCisgIGZpCitkb25lCisKKyMgUmVwb3J0IHRoZSBzdWNjZXNzZXMgYW5kIGZhaWx1cmVzIHRvIHRoZSBjb25zb2xlLgorZWNobyAiVGVzdHMgY29tcGxldGUgd2l0aCAkc3VjY2VlZGVkIHN1Y2Nlc3NlcyBhbmQgJGZhaWxlZCBmYWlsdXJlcy4iCitpZiBbICRmYWlsZWQgLW5lIDAgXTsgdGhlbgorICBlY2hvICJUaGUgZm9sbG93aW5nIHRlc3RzIGZhaWxlZDoiCisgIGVjaG8gJGZhaWxlZF9saXN0CitmaQorZXhpdCAkZmFpbGVkCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2NyaXB0cy92ZXJzaW9uZ2VuZXJhdGUucHkgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QveGNvZGUvU2NyaXB0cy92ZXJzaW9uZ2VuZXJhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODFkZThjOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9TY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weQpAQCAtMCwwICsxLDEwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQSBzY3JpcHQgdG8gcHJlcGFyZSB2ZXJzaW9uIGluZm9ybXRpb24gZm9yIHVzZSB0aGUgZ3Rlc3QgSW5mby5wbGlzdCBmaWxlLgorCisgIFRoaXMgc2NyaXB0IGV4dHJhY3RzIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIGFuZAorICB1c2VzIGl0IHRvIGdlbmVyYXRlIGEgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4gVGhlCisgICNkZWZpbmVzIGluIHRoaXMgaGVhZGVyIGZpbGUgd2lsbCBiZSBpbmNsdWRlZCBpbiBkdXJpbmcgdGhlIGdlbmVyYXRpb24gb2YKKyAgdGhlIEluZm8ucGxpc3Qgb2YgdGhlIGZyYW1ld29yaywgZ2l2aW5nIHRoZSBjb3JyZWN0IHZhbHVlIHRvIHRoZSB2ZXJzaW9uCisgIHNob3duIGluIHRoZSBGaW5kZXIuCisKKyAgVGhpcyBzY3JpcHQgbWFrZXMgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9ucyAodGhlc2UgYXJlIGZhdWx0cyBvZiB0aGUgc2NyaXB0LAorICBub3QgcHJvYmxlbXMgd2l0aCB0aGUgQXV0b2NvbmYpOgorICAgIDEuIFRoZSBBQ19JTklUIG1hY3JvIHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZmlyc3QgMTAyNCBjaGFyYWN0ZXJzCisgICAgICAgb2YgY29uZmlndXJlLmFjCisgICAgMi4gVGhlIHZlcnNpb24gc3RyaW5nIHdpbGwgYmUgMyBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgd2lsbCBiZQorICAgICAgIHN1cnJvdW5kZWQgYnkgc3F1cmUgYnJhY2tldHMsICJbIiBhbmQgIl0iIChlLmcuIFsxLjAuMV0pLiBUaGUgZmlyc3QKKyAgICAgICBzZWdtZW50IHJlcHJlc2VudHMgdGhlIG1ham9yIHZlcnNpb24sIHRoZSBzZWNvbmQgcmVwcmVzZW50cyB0aGUgbWlub3IKKyAgICAgICB2ZXJzaW9uIGFuZCB0aGUgdGhpcmQgcmVwcmVzZW50cyB0aGUgZml4IHZlcnNpb24uCisgICAgMy4gTm8gIikiIGNoYXJhY3RlciBleGlzdHMgYmV0d2VlbiB0aGUgb3BlbmluZyAiKCIgYW5kIGNsb3NpbmcgIikiIG9mCisgICAgICAgQUNfSU5JVCwgaW5jbHVkaW5nIGluIGNvbW1lbnRzIGFuZCBjaGFyYWN0ZXIgc3RyaW5ncy4KKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKKworIyBSZWFkIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgKHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBWZXJzaW9uLmgpCitpZiAobGVuKHN5cy5hcmd2KSA8IDMpOgorICBwcmludCAiVXNhZ2U6IHZlcnNpb25nZW5lcmF0ZS5weSBpbnB1dF9kaXIgb3V0cHV0X2RpciIKKyAgc3lzLmV4aXQoMSkKK2Vsc2U6CisgIGlucHV0X2RpciA9IHN5cy5hcmd2WzFdCisgIG91dHB1dF9kaXIgPSBzeXMuYXJndlsyXQorCisjIFJlYWQgdGhlIGZpcnN0IDEwMjQgY2hhcmFjdGVycyBvZiB0aGUgY29uZmlndXJlLmFjIGZpbGUKK2NvbmZpZ19maWxlID0gb3BlbigiJXMvY29uZmlndXJlLmFjIiAlIGlucHV0X2RpciwgJ3InKQorYnVmZmVyX3NpemUgPSAxMDI0CitvcGVuaW5nX3N0cmluZyA9IGNvbmZpZ19maWxlLnJlYWQoYnVmZmVyX3NpemUpCitjb25maWdfZmlsZS5jbG9zZSgpCisKKyMgRXh0cmFjdCB0aGUgdmVyc2lvbiBzdHJpbmcgZnJvbSB0aGUgQUNfSU5JVCBtYWNybworIyAgIFRoZSBmb2xsb3dpbmcgaW5pdF9leHByZXNzaW9uIG1lYW5zOgorIyAgICAgRXh0cmFjdCB0aHJlZSBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgc3Vycm91bmRlZCBieSBzcXVyZQorIyAgICAgYnJhY2tldHMoZS5nLiAiWzEuMC4xXSIpIGJldHdlZW4gIkFDX0lOSVQoIiBhbmQgIikiLiBEbyBub3QgYmUgZ3JlZWR5CisjICAgICAoKj8gaXMgdGhlIG5vbi1ncmVlZHkgZmxhZykgc2luY2UgdGhhdCB3b3VsZCBwdWxsIGluIGV2ZXJ5dGhpbmcgYmV0d2VlbgorIyAgICAgdGhlIGZpcnN0ICIoIiBhbmQgdGhlIGxhc3QgIikiIGluIHRoZSBmaWxlLgordmVyc2lvbl9leHByZXNzaW9uID0gcmUuY29tcGlsZShyIkFDX0lOSVRcKC4qP1xbKFxkKylcLihcZCspXC4oXGQrKVxdLio/XCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5ET1RBTEwpCit2ZXJzaW9uX3ZhbHVlcyA9IHZlcnNpb25fZXhwcmVzc2lvbi5zZWFyY2gob3BlbmluZ19zdHJpbmcpCittYWpvcl92ZXJzaW9uID0gdmVyc2lvbl92YWx1ZXMuZ3JvdXAoMSkKK21pbm9yX3ZlcnNpb24gPSB2ZXJzaW9uX3ZhbHVlcy5ncm91cCgyKQorZml4X3ZlcnNpb24gPSB2ZXJzaW9uX3ZhbHVlcy5ncm91cCgzKQorCisjIFdyaXRlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRvIGEgaGVhZGVyIGZpbGUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisjIEluZm8ucGxpc3QgZmlsZS4KK2ZpbGVfZGF0YSA9ICIiIi8vCisvLyBETyBOT1QgTU9ESUZZIFRISVMgRklMRSAoYnV0IHlvdSBjYW4gZGVsZXRlIGl0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IHRoZSB2ZXJzaW9uZ2VuZXJhdGUucHkgc2NyaXB0LiBUaGlzIHNjcmlwdAorLy8gaXMgZXhlY3V0ZWQgaW4gYSAiUnVuIFNjcmlwdCIgYnVpbGQgcGhhc2Ugd2hlbiBjcmVhdGluZyBndGVzdC5mcmFtZXdvcmsuIFRoaXMKKy8vIGhlYWRlciBmaWxlIGlzIG5vdCB1c2VkIGR1cmluZyBjb21waWxhdGlvbiBvZiBDLXNvdXJjZS4gUmF0aGVyLCBpdCBzaW1wbHkKKy8vIGRlZmluZXMgc29tZSB2ZXJzaW9uIHN0cmluZ3MgZm9yIHN1YnN0aXR1dGlvbiBpbiB0aGUgSW5mby5wbGlzdC4gQmVjYXVzZSBvZgorLy8gdGhpcywgd2UgYXJlIG5vdCBub3QgcmVzdHJpY3RlZCB0byBDLXN5bnRheCBub3IgYXJlIHdlIHVzaW5nIGluY2x1ZGUgZ3VhcmRzLgorLy8KKworI2RlZmluZSBHVEVTVF9WRVJTSU9OSU5GT19TSE9SVCAlcy4lcworI2RlZmluZSBHVEVTVF9WRVJTSU9OSU5GT19MT05HICVzLiVzLiVzCisKKyIiIiAlIChtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uLCBtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uLCBmaXhfdmVyc2lvbikKK3ZlcnNpb25fZmlsZSA9IG9wZW4oIiVzL1ZlcnNpb24uaCIgJSBvdXRwdXRfZGlyLCAndycpCit2ZXJzaW9uX2ZpbGUud3JpdGUoZmlsZV9kYXRhKQordmVyc2lvbl9maWxlLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGV0ZXN0L3hjb2RlL2d0ZXN0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmYWE4OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvZ29vZ2xldGVzdC94Y29kZS9ndGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMTEzNSBAQAorLy8gISQqVVRGOCokIQoreworCWFyY2hpdmVWZXJzaW9uID0gMTsKKwljbGFzc2VzID0geworCX07CisJb2JqZWN0VmVyc2lvbiA9IDQ2OworCW9iamVjdHMgPSB7CisKKy8qIEJlZ2luIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisJCTNCMjM4RjVGMEU4MjhCNTQwMDg0NkUxMSAvKiBDaGVjayAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAzQjIzOEZBMzBFODI4QkI2MDA4NDZFMTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIkNoZWNrIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTNCMjM4RjVFMEU4MjhCNTQwMDg0NkUxMSAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDA4OTlGOUQwRkZBNzQwRjAwMEIyOUFFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5RjcxMDFBNDM0NDAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDA4OUEwOTgwRkZBRDM0QTAwMEIyOUFFIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5RjkxMDFBNDM0OTAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IENoZWNrOworCQkJcHJvZHVjdE5hbWUgPSBDaGVjazsKKwkJfTsKKwkJNDBDNDRBREMwRTM3OThGNDAwOEZDQzUxIC8qIFZlcnNpb24gSW5mbyAqLyA9IHsKKwkJCWlzYSA9IFBCWEFnZ3JlZ2F0ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MEM0NEFFNDBFMzc5OTA1MDA4RkNDNTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlZlcnNpb24gSW5mbyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MEM0NEFEQjBFMzc5OEY0MDA4RkNDNTEgLyogR2VuZXJhdGUgVmVyc2lvbi5oICovLAorCQkJKTsKKwkJCWNvbW1lbnRzID0gIlRoZSBnZW5lcmF0aW9uIG9mIFZlcnNpb24uaCBtdXN0IGJlIHBlcmZvcm1lZCBpbiBpdHMgb3duIHRhcmdldC4gU2luY2UgdGhlIEluZm8ucGxpc3QgaXMgcHJlcHJvY2Vzc2VkIGJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIGJ1aWxkIHBoYXNlcyBpbiBndGVzdCwgdGhlIFZlcnNpb24uaCBmaWxlIHdvdWxkIG5vdCBiZSByZWFkeSBpZiBpbmNsdWRlZCBhcyBhIGJ1aWxkIHBoYXNlIG9mIHRoYXQgdGFyZ2V0LiI7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJWZXJzaW9uIEluZm8iOworCQkJcHJvZHVjdE5hbWUgPSBWZXJzaW9uLmg7CisJCX07CisvKiBFbmQgUEJYQWdncmVnYXRlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMjI0QTEyQTMwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjI0QTEyQTIwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJM0JGNkYyQTAwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQkY2RjI5RjBFNzlCNUFEMDAwRjJFRUUgLyogZ3Rlc3QtdHlwZS11dGlsLmggKi87IH07CisJCTNCRjZGMkE1MEU3OUI2MTYwMDBGMkVFRSAvKiBndGVzdC10eXBlZC10ZXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJNDA0ODg0MzgwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0RCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzOTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREMwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LW1lc3NhZ2UuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDNBMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0REMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDNCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzREUwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzQzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0MDQ4ODQzRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODgzRTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTQwNDg4NDUwMEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUubWQgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0Y2MEUyRjc5OUIwMENGNzY1OCAvKiBSRUFETUUubWQgKi87IH07CisJCTQwNDg4NEEwMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0UyMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggKi87IH07CisJCTQwNDg4NEExMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLzsgfTsKKwkJNDA0ODg0QTIwRTJGN0JFNjAwQ0Y3NjU4IC8qIGd0ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0U0MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1pbnRlcm5hbC5oICovOyB9OworCQk0MDQ4ODRBMzBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODNFNTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oICovOyB9OworCQk0MDQ4ODRBNDBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3Qtc3RyaW5nLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4M0U2MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCAqLzsgfTsKKwkJNDA0ODg0QUMwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovOyB9OworCQk0MDQ4ODRBRDBFMkY3Q0Q5MDBDRjc2NTggLyogQ09OVFJJQlVUT1JTIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDQ4ODRBQTBFMkY3Q0Q5MDBDRjc2NTggLyogQ09OVFJJQlVUT1JTICovOyB9OworCQk0MDQ4ODRBRTBFMkY3Q0Q5MDBDRjc2NTggLyogTElDRU5TRSBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODg0QUIwRTJGN0NEOTAwQ0Y3NjU4IC8qIExJQ0VOU0UgKi87IH07CisJCTQwODk5RjNBMEZGQTcwRDQwMDBCMjlBRSAvKiBndGVzdC1hbGwuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyMjRBMTJBMTBFOUVBREE3MDBCRDE3RkQgLyogZ3Rlc3QtYWxsLmNjICovOyB9OworCQk0MDg5OUY1MDBGRkE3MjgxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA4OTlGNEQwRkZBNzI3MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggKi87IH07CisJCTQwODk5RjUzMEZGQTcyQTAwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNCMjM4QzEyMEU3RkUxM0MwMDg0NkUxMSAvKiBndGVzdF91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDA4OUEwNDQwRkZBRDFCRTAwMEIyOUFFIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLzsgfTsKKwkJNDA4OUEwNDYwRkZBRDFCRTAwMEIyOUFFIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDBDODQ4RkYxMDFBMjExNTAwODM2NDJBIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi87IH07CisJCTQwQzg0OTE1MTAxQTIxREYwMDgzNjQyQSAvKiBndGVzdF9tYWluLmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDA0ODg0MEQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X21haW4uY2MgKi87IH07CisJCTQwQzg0OTE2MTAxQTIzNUIwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovOyB9OworCQk0MEM4NDkyMTEwMUEyM0FEMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5NzgxMDFBMzY1NDAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5ODAxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0IyMzhDMTIwRTdGRTEzQzAwODQ2RTExIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjICovOyB9OworCQk0MEM4NDk4MjEwMUEzNjg1MDA4MzY0MkEgLyogbGliZ3Rlc3QuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OEZBMTAxQTIwOUMwMDgzNjQyQSAvKiBsaWJndGVzdC5hICovOyB9OworCQk0MEM4NDk4MzEwMUEzNjg1MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsgfTsKKwkJNDBDODQ5OEYxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLzsgfTsKKwkJNDBDODQ5OTAxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLzsgfTsKKwkJNDBDODQ5OTIxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0MEM4NDhGQTEwMUEyMDlDMDA4MzY0MkEgLyogbGliZ3Rlc3QuYSAqLzsgfTsKKwkJNDBDODQ5OTMxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQwQzg0OTBCMTAxQTIxN0UwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgKi87IH07CisJCTQwQzg0OUEyMTAxQTM3MDUwMDgzNjQyQSAvKiBndGVzdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovOyB9OworCQk0MEM4NDlBNDEwMUEzNzE1MDA4MzY0MkEgLyogZ3Rlc3QuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM4RkYwRUMyN0Y2NDAwQTcwRjRDIC8qIGd0ZXN0LmZyYW1ld29yayAqLzsgfTsKKwkJNDUzOUM5MzQwRUMyODBBRTAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXRlc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOTMzMEVDMjgwQUUwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS10ZXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQk0NTM5QzkzODBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NTM5QzkzNTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oICovOyB9OworCQk0NTM5QzkzOTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDUzOUM5MzYwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggKi87IH07CisJCTQ1MzlDOTNBMEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi87IH07CisJCTQ1NjdDODE4MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDU2N0M4MTcxMjY0RkY3MTAwNzc0MEJFIC8qIGd0ZXN0LXByaW50ZXJzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisJCTQwODk5RjlDMEZGQTc0MEYwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUU7CisJCQlyZW1vdGVJbmZvID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCX07CisJCTQwODlBMDk3MEZGQUQzNEEwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUU7CisJCQlyZW1vdGVJbmZvID0gc2FtcGxlMV91bml0dGVzdDsKKwkJfTsKKwkJNDA4QkVDMEYxMDQ2Q0ZFOTAwREVGNTIyIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJfTsKKwkJNDBDNDRBRTUwRTM3OTkyMjAwOEZDQzUxIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MTsKKwkJCXJlbW90ZUluZm8gPSBWZXJzaW9uLmg7CisJCX07CisJCTQwQzg0OTdDMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LXN0YXRpYyI7CisJCX07CisJCTQwQzg0OTdFMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0X21haW4tc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5OEIxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5OEQxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQTsKKwkJCXJlbW90ZUluZm8gPSAiZ3Rlc3RfbWFpbi1zdGF0aWMiOworCQl9OworCQk0MEM4NDk5QjEwMUEzNkRDMDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBOworCQkJcmVtb3RlSW5mbyA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCX07CisJCTQwQzg0OTlEMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDA7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LWZyYW1ld29yayI7CisJCX07CisJCTQwQzg0OTlGMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA4RDA3RjJCQzA0ODZDQzdBMDA3Q0QxRDA7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0LWZyYW1ld29yayI7CisJCX07CisJCTQwQzg0OUY2MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gImd0ZXN0X3VuaXR0ZXN0LXN0YXRpYyI7CisJCX07CisJCTQwQzg0OUY4MTAxQTQzNDkwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSA0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkE7CisJCQlyZW1vdGVJbmZvID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKKwkJfTsKKy8qIEVuZCBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNDA0ODg0QTUwRTJGN0MwNDAwQ0Y3NjU4IC8qIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9IEhlYWRlcnMvaW50ZXJuYWw7CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gNjsKKwkJCWZpbGVzID0gKAorCQkJCTQwNDg4NEEwMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEExMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1maWxlcGF0aC5oIGluIENvcHkgSGVhZGVycyBJbnRlcm5hbCAqLywKKwkJCQk0MDQ4ODRBMjBFMkY3QkU2MDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDUzOUM5MzgwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LWxpbmtlZF9wdHIuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDUzOUM5MzkwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQ1MzlDOTNBMEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEEzMEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1wb3J0LmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTQwNDg4NEE0MEUyRjdCRTYwMENGNzY1OCAvKiBndGVzdC1zdHJpbmcuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkJNDA4OTlGNTAwRkZBNzI4MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggaW4gQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCTNCRjZGMkEwMEU3OUI1QUQwMDBGMkVFRSAvKiBndGVzdC10eXBlLXV0aWwuaCBpbiBDb3B5IEhlYWRlcnMgSW50ZXJuYWwgKi8sCisJCQkpOworCQkJbmFtZSA9ICJDb3B5IEhlYWRlcnMgSW50ZXJuYWwiOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkyMjRBMTJBMTBFOUVBREE3MDBCRDE3RkQgLyogZ3Rlc3QtYWxsLmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9ICJndGVzdC1hbGwuY2MiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkyMjRBMTJBMjBFOUVBRENDMDBCRDE3RkQgLyogZ3Rlc3QtdGVzdC1wYXJ0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdGVzdC1wYXJ0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQjIzOEMxMjBFN0ZFMTNDMDA4NDZFMTEgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBndGVzdF91bml0dGVzdC5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0I4N0QyMTAwRTk2QjkyRTAwMEQxODUyIC8qIHJ1bnRlc3RzLnNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5zY3JpcHQuc2g7IHBhdGggPSBydW50ZXN0cy5zaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0JGNkYyOUYwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdHlwZS11dGlsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtdHlwZWQtdGVzdC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDAzRUUzN0MwRTM3NzgyMjAwNEJEMUUyIC8qIHZlcnNpb25nZW5lcmF0ZS5weSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQuc2NyaXB0LnB5dGhvbjsgcGF0aCA9IHZlcnNpb25nZW5lcmF0ZS5weTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzREIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWRlYXRoLXRlc3QuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0RDMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1tZXNzYWdlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1tZXNzYWdlLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNERDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3Qtc3BpLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1zcGkuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0RFMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBndGVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGd0ZXN0X3ByZWRfaW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFMDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJvZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBndGVzdF9wcm9kLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4M0UyMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWZpbGVwYXRoLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFNDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWludGVybmFsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNFNTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtcG9ydC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcG9ydC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA0ODgzRTYwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXN0cmluZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3Qtc3RyaW5nLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDQ4ODNGNjBFMkY3OTlCMDBDRjc2NTggLyogUkVBRE1FLm1kICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IFJFQURNRS5tZDsgcGF0aCA9IC4uL1JFQURNRS5tZDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQk0MDQ4ODQwRDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfbWFpbi5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGd0ZXN0X21haW4uY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IENIQU5HRVM7IHBhdGggPSAuLi9DSEFOR0VTOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwNDg4NEFBMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gQ09OVFJJQlVUT1JTOyBwYXRoID0gLi4vQ09OVFJJQlVUT1JTOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwNDg4NEFCMEUyRjdDRDkwMENGNzY1OCAvKiBMSUNFTlNFICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IExJQ0VOU0U7IHBhdGggPSAuLi9MSUNFTlNFOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTQwODk5RjQzMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0MDg5OUY0RDBGRkE3MjcxMDAwQjI5QUUgLyogZ3Rlc3QtdHVwbGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXR1cGxlLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwODlBMDJDMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxLmNjICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gc2FtcGxlMS5jYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDA4OUEwMkQwRkZBQ0Y3RjAwMEIyOUFFIC8qIHNhbXBsZTEuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gc2FtcGxlMS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MDg5QTAyRTBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC5jYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IHNhbXBsZTFfdW5pdHRlc3QuY2M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwQzg0OEZBMTAxQTIwOUMwMDgzNjQyQSAvKiBsaWJndGVzdC5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJndGVzdC5hOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0MEM4NDkwQjEwMUEyMTdFMDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBsaWJndGVzdF9tYWluLmE7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwQzg0OTg3MTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gZ3Rlc3RfdW5pdHRlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTQwQzg0OTk3MTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJNDBENENERjEwRTMwRTA3NDAwMjk0ODAxIC8qIERlYnVnUHJvamVjdC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBEZWJ1Z1Byb2plY3QueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwRDRDREYyMEUzMEUwNzQwMDI5NDgwMSAvKiBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnhjY29uZmlnOyBwYXRoID0gRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MEQ0Q0RGMzBFMzBFMDc0MDAyOTQ4MDEgLyogR2VuZXJhbC54Y2NvbmZpZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQueGNjb25maWc7IHBhdGggPSBHZW5lcmFsLnhjY29uZmlnOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnhjY29uZmlnOyBwYXRoID0gUmVsZWFzZVByb2plY3QueGNjb25maWc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQwRDRDRjUxMEUzMEY1RTIwMDI5NDgwMSAvKiBJbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC54bWw7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0NTM5QzhGRjBFQzI3RjY0MDBBNzBGNEMgLyogZ3Rlc3QuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gZ3Rlc3QuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQk0NTM5QzkzMzBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcGFyYW0tdGVzdC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDUzOUM5MzUwRUMyODBFMjAwQTcwRjRDIC8qIGd0ZXN0LWxpbmtlZF9wdHIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LWxpbmtlZF9wdHIuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ1MzlDOTM2MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9ICJndGVzdC1wYXJhbS11dGlsLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0NTY3QzgxNzEyNjRGRjcxMDA3NzQwQkUgLyogZ3Rlc3QtcHJpbnRlcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImd0ZXN0LXByaW50ZXJzLmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTQwODk5RjQxMEZGQTcxODQwMDBCMjlBRSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5QTQxMDFBMzcxNTAwODM2NDJBIC8qIGd0ZXN0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTQwQzg0OTE2MTAxQTIzNUIwMDgzNjQyQSAvKiBsaWJndGVzdF9tYWluLmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJNDA4OUEwMTEwRkZBQ0VGQzAwMEIyOUFFIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MEM4NDlBMjEwMUEzNzA1MDA4MzY0MkEgLyogZ3Rlc3QuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5MjExMDFBMjNBRDAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDk4MTEwMUEzNjg1MDA4MzY0MkEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTgyMTAxQTM2ODUwMDgzNjQyQSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5ODMxMDFBMzY4NTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDk5MTEwMUEzNkE2MDA4MzY0MkEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTkyMTAxQTM2QTYwMDgzNjQyQSAvKiBsaWJndGVzdC5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJNDBDODQ5OTMxMDFBMzZBNjAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMzQ3NjhEREZGMzhBNDVBMTFEQjlDOEIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQ1MzlDOEZGMEVDMjdGNjQwMEE3MEY0QyAvKiBndGVzdC5mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi8sCisJCQkJNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLywKKwkJCQk0MDg5OUY0MzBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovLAorCQkJCTQwQzg0OTg3MTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdCAqLywKKwkJCQk0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ5OTcxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBndGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDBENENERjAwRTMwRTA3NDAwMjk0ODAxIC8qIENvbmZpZyAqLywKKwkJCQkwOEZCNzdBQ0ZFODQxNzA3QzAyQUFDMDcgLyogU291cmNlICovLAorCQkJCTQwRDRDRjRFMEUzMEY1RTIwMDI5NDgwMSAvKiBSZXNvdXJjZXMgKi8sCisJCQkJNDAzRUUzN0IwRTM3NzgyMjAwNEJEMUUyIC8qIFNjcmlwdHMgKi8sCisJCQkJMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovLAorCQkJKTsKKwkJCW5hbWUgPSBndGVzdDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4RkI3N0FDRkU4NDE3MDdDMDJBQUMwNyAvKiBTb3VyY2UgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwNDg4NEE5MEUyRjdDRDkwMENGNzY1OCAvKiBDSEFOR0VTICovLAorCQkJCTQwNDg4NEFBMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgKi8sCisJCQkJNDA0ODg0QUIwRTJGN0NEOTAwQ0Y3NjU4IC8qIExJQ0VOU0UgKi8sCisJCQkJNDA0ODgzRjYwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRS5tZCAqLywKKwkJCQk0MDQ4ODNEOTBFMkY3OTlCMDBDRjc2NTggLyogaW5jbHVkZSAqLywKKwkJCQk0MDg5QTAyRjBGRkFDRjg0MDAwQjI5QUUgLyogc2FtcGxlcyAqLywKKwkJCQk0MDQ4ODQwNzBFMkY3OTlCMDBDRjc2NTggLyogc3JjICovLAorCQkJCTNCMjM4QkYwMEU3RkUxM0IwMDg0NkUxMSAvKiB0ZXN0ICovLAorCQkJKTsKKwkJCW5hbWUgPSBTb3VyY2U7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQjIzOEJGMDBFN0ZFMTNCMDA4NDZFMTEgLyogdGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0IyMzhDMTIwRTdGRTEzQzAwODQ2RTExIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSB0ZXN0OworCQkJcGF0aCA9IC4uL3Rlc3Q7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwM0VFMzdCMEUzNzc4MjIwMDRCRDFFMiAvKiBTY3JpcHRzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDNFRTM3QzBFMzc3ODIyMDA0QkQxRTIgLyogdmVyc2lvbmdlbmVyYXRlLnB5ICovLAorCQkJCTNCODdEMjEwMEU5NkI5MkUwMDBEMTg1MiAvKiBydW50ZXN0cy5zaCAqLywKKwkJCSk7CisJCQlwYXRoID0gU2NyaXB0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4M0Q5MEUyRjc5OUIwMENGNzY1OCAvKiBpbmNsdWRlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDQ4ODNEQTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QgKi8sCisJCQkpOworCQkJbmFtZSA9IGluY2x1ZGU7CisJCQlwYXRoID0gLi4vaW5jbHVkZTsKKwkJCXNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsKKwkJfTsKKwkJNDA0ODgzREEwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDQ4ODNFMTBFMkY3OTlCMDBDRjc2NTggLyogaW50ZXJuYWwgKi8sCisJCQkJMjI0QTEyQTIwRTlFQURDQzAwQkQxN0ZEIC8qIGd0ZXN0LXRlc3QtcGFydC5oICovLAorCQkJCTQwNDg4M0RCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggKi8sCisJCQkJNDA0ODgzREMwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LW1lc3NhZ2UuaCAqLywKKwkJCQk0NTM5QzkzMzBFQzI4MEFFMDBBNzBGNEMgLyogZ3Rlc3QtcGFyYW0tdGVzdC5oICovLAorCQkJCTQ1NjdDODE3MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oICovLAorCQkJCTQwNDg4M0REMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCAqLywKKwkJCQk0MDQ4ODNERTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QuaCAqLywKKwkJCQk0MDQ4ODNERjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3RfcHJlZF9pbXBsLmggKi8sCisJCQkJNDA0ODgzRTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCAqLywKKwkJCQkzQkY2RjJBNDBFNzlCNjE2MDAwRjJFRUUgLyogZ3Rlc3QtdHlwZWQtdGVzdC5oICovLAorCQkJKTsKKwkJCXBhdGggPSBndGVzdDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4M0UxMEUyRjc5OUIwMENGNzY1OCAvKiBpbnRlcm5hbCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDA0ODgzRTIwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaCAqLywKKwkJCQk0MDQ4ODNFMzBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtZmlsZXBhdGguaCAqLywKKwkJCQk0MDQ4ODNFNDBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtaW50ZXJuYWwuaCAqLywKKwkJCQk0NTM5QzkzNTBFQzI4MEUyMDBBNzBGNEMgLyogZ3Rlc3QtbGlua2VkX3B0ci5oICovLAorCQkJCTQ1MzlDOTM2MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oICovLAorCQkJCTQ1MzlDOTM3MEVDMjgwRTIwMEE3MEY0QyAvKiBndGVzdC1wYXJhbS11dGlsLmggKi8sCisJCQkJNDA0ODgzRTUwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0LXBvcnQuaCAqLywKKwkJCQk0MDQ4ODNFNjBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3Qtc3RyaW5nLmggKi8sCisJCQkJNDA4OTlGNEQwRkZBNzI3MTAwMEIyOUFFIC8qIGd0ZXN0LXR1cGxlLmggKi8sCisJCQkJM0JGNkYyOUYwRTc5QjVBRDAwMEYyRUVFIC8qIGd0ZXN0LXR5cGUtdXRpbC5oICovLAorCQkJKTsKKwkJCXBhdGggPSBpbnRlcm5hbDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwNDg4NDA3MEUyRjc5OUIwMENGNzY1OCAvKiBzcmMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTIyNEExMkExMEU5RUFEQTcwMEJEMTdGRCAvKiBndGVzdC1hbGwuY2MgKi8sCisJCQkJNDA0ODg0MEQwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X21haW4uY2MgKi8sCisJCQkpOworCQkJbmFtZSA9IHNyYzsKKwkJCXBhdGggPSAuLi9zcmM7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwODlBMDJGMEZGQUNGODQwMDBCMjlBRSAvKiBzYW1wbGVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0MDg5QTAyQzBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5jYyAqLywKKwkJCQk0MDg5QTAyRDBGRkFDRjdGMDAwQjI5QUUgLyogc2FtcGxlMS5oICovLAorCQkJCTQwODlBMDJFMEZGQUNGN0YwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjICovLAorCQkJKTsKKwkJCW5hbWUgPSBzYW1wbGVzOworCQkJcGF0aCA9IC4uL3NhbXBsZXM7CisJCQlzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7CisJCX07CisJCTQwRDRDREYwMEUzMEUwNzQwMDI5NDgwMSAvKiBDb25maWcgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwRDRDREYxMEUzMEUwNzQwMDI5NDgwMSAvKiBEZWJ1Z1Byb2plY3QueGNjb25maWcgKi8sCisJCQkJNDBENENERjIwRTMwRTA3NDAwMjk0ODAxIC8qIEZyYW1ld29ya1RhcmdldC54Y2NvbmZpZyAqLywKKwkJCQk0MEQ0Q0RGMzBFMzBFMDc0MDAyOTQ4MDEgLyogR2VuZXJhbC54Y2NvbmZpZyAqLywKKwkJCQk0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi8sCisJCQkJNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi8sCisJCQkpOworCQkJcGF0aCA9IENvbmZpZzsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTQwRDRDRjRFMEUzMEY1RTIwMDI5NDgwMSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTQwRDRDRjUxMEUzMEY1RTIwMDI5NDgwMSAvKiBJbmZvLnBsaXN0ICovLAorCQkJKTsKKwkJCXBhdGggPSBSZXNvdXJjZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQk4RDA3RjJCRDA0ODZDQzdBMDA3Q0QxRDAgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwNDg4NDM4MEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1kZWF0aC10ZXN0LmggaW4gSGVhZGVycyAqLywKKwkJCQk0MDQ4ODQzOTBFMkY3OTlCMDBDRjc2NTggLyogZ3Rlc3QtbWVzc2FnZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDUzOUM5MzQwRUMyODBBRTAwQTcwRjRDIC8qIGd0ZXN0LXBhcmFtLXRlc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTQ1NjdDODE4MTI2NEZGNzEwMDc3NDBCRSAvKiBndGVzdC1wcmludGVycy5oIGluIEhlYWRlcnMgKi8sCisJCQkJM0JGNkYyQTUwRTc5QjYxNjAwMEYyRUVFIC8qIGd0ZXN0LXR5cGVkLXRlc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCTQwNDg4NDNBMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC1zcGkuaCBpbiBIZWFkZXJzICovLAorCQkJCTQwNDg4NDNCMEUyRjc5OUIwMENGNzY1OCAvKiBndGVzdC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDA0ODg0M0MwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3ByZWRfaW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDA0ODg0M0QwRTJGNzk5QjAwQ0Y3NjU4IC8qIGd0ZXN0X3Byb2QuaCBpbiBIZWFkZXJzICovLAorCQkJCTIyNEExMkEzMEU5RUFEQ0MwMEJEMTdGRCAvKiBndGVzdC10ZXN0LXBhcnQuaCBpbiBIZWFkZXJzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJNDA4OTlGNDIwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0MDg5OUY0QTBGRkE3MUJDMDAwQjI5QUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDg5OUY0MDBGRkE3MTg0MDAwQjI5QUUgLyogU291cmNlcyAqLywKKwkJCQk0MDg5OUY0MTBGRkE3MTg0MDAwQjI5QUUgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MEM4NDlBMDEwMUEzNkYxMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gImd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayI7CisJCQlwcm9kdWN0TmFtZSA9IGd0ZXN0X3VuaXR0ZXN0OworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDQwODk5RjQzMEZGQTcxODQwMDBCMjlBRSAvKiBndGVzdF91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gNDA4OUEwMjQwRkZBQ0YwMTAwMEIyOUFFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk0MDg5QTAxMDBGRkFDRUZDMDAwQjI5QUUgLyogU291cmNlcyAqLywKKwkJCQk0MDg5QTAxMTBGRkFDRUZDMDAwQjI5QUUgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQk0MEM4NDk5RTEwMUEzNkU1MDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIjsKKwkJCXByb2R1Y3ROYW1lID0gc2FtcGxlMV91bml0dGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSA0MDg5QTAxMzBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk0MEM4NDhGOTEwMUEyMDlDMDA4MzY0MkEgLyogZ3Rlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTAyMTAxQTIxMkUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3Qtc3RhdGljIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwQzg0OEY3MTAxQTIwOUMwMDgzNjQyQSAvKiBTb3VyY2VzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiZ3Rlc3Qtc3RhdGljIjsKKwkJCXByb2R1Y3ROYW1lID0gImd0ZXN0LXN0YXRpYyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ4RkExMDFBMjA5QzAwODM2NDJBIC8qIGxpYmd0ZXN0LmEgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmxpYnJhcnkuc3RhdGljIjsKKwkJfTsKKwkJNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTEyMTAxQTIxRDIwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfbWFpbi1zdGF0aWMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJNDBDODQ5MDgxMDFBMjE3RTAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCQlwcm9kdWN0TmFtZSA9ICJndGVzdF9tYWluLXN0YXRpYyI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5MEIxMDFBMjE3RTAwODM2NDJBIC8qIGxpYmd0ZXN0X21haW4uYSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUubGlicmFyeS5zdGF0aWMiOworCQl9OworCQk0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTg0MTAxQTM2ODUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTQwQzg0OTdGMTAxQTM2ODUwMDgzNjQyQSAvKiBTb3VyY2VzICovLAorCQkJCTQwQzg0OTgxMTAxQTM2ODUwMDgzNjQyQSAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTQwQzg0OTdCMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJCTQwQzg0OTdEMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIjsKKwkJCXByb2R1Y3ROYW1lID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5ODcxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJNDBDODQ5ODkxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDQwQzg0OTk0MTAxQTM2QTYwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2FtcGxlMV91bml0dGVzdC1zdGF0aWMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJNDBDODQ5OEUxMDFBMzZBNjAwODM2NDJBIC8qIFNvdXJjZXMgKi8sCisJCQkJNDBDODQ5OTExMDFBMzZBNjAwODM2NDJBIC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDBDODQ5OEExMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5OEMxMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyI7CisJCQlwcm9kdWN0TmFtZSA9IHNhbXBsZTFfdW5pdHRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDBDODQ5OTcxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJOEQwN0YyQkMwNDg2Q0M3QTAwN0NEMUQwIC8qIGd0ZXN0LWZyYW1ld29yayAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSA0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0LWZyYW1ld29yayIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk4RDA3RjJDMTA0ODZDQzdBMDA3Q0QxRDAgLyogU291cmNlcyAqLywKKwkJCQk4RDA3RjJCRDA0ODZDQzdBMDA3Q0QxRDAgLyogSGVhZGVycyAqLywKKwkJCQk0MDQ4ODRBNTBFMkY3QzA0MDBDRjc2NTggLyogQ29weSBIZWFkZXJzIEludGVybmFsICovLAorCQkJCThEMDdGMkJGMDQ4NkNDN0EwMDdDRDFEMCAvKiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJNDBDNDRBRTYwRTM3OTkyMjAwOEZDQzUxIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDA4QkVDMTAxMDQ2Q0ZFOTAwREVGNTIyIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJNDBDODQ5OUMxMDFBMzZEQzAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJndGVzdC1mcmFtZXdvcmsiOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIjsKKwkJCXByb2R1Y3ROYW1lID0gZ3Rlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gNDUzOUM4RkYwRUMyN0Y2NDAwQTcwRjRDIC8qIGd0ZXN0LmZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuZnJhbWV3b3JrIjsKKwkJfTsKKy8qIEVuZCBQQlhOYXRpdmVUYXJnZXQgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKwkJMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCWF0dHJpYnV0ZXMgPSB7CisJCQkJTGFzdFVwZ3JhZGVDaGVjayA9IDA0NjA7CisJCQl9OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDRGQURDMjQ2MDhCNDE1NkQwMEFCRTU1RSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImd0ZXN0IiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDMuMiI7CisJCQlkZXZlbG9wbWVudFJlZ2lvbiA9IEVuZ2xpc2g7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCWtub3duUmVnaW9ucyA9ICgKKwkJCQlFbmdsaXNoLAorCQkJCUphcGFuZXNlLAorCQkJCUZyZW5jaCwKKwkJCQlHZXJtYW4sCisJCQkJZW4sCisJCQkpOworCQkJbWFpbkdyb3VwID0gMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIGd0ZXN0ICovOworCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4RERGRjM4QTQ1QTExREI5QzhCIC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi8sCisJCQkJNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBIC8qIGd0ZXN0LXN0YXRpYyAqLywKKwkJCQk0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi8sCisJCQkJNDA4OTlGNDIwRkZBNzE4NDAwMEIyOUFFIC8qIGd0ZXN0X3VuaXR0ZXN0LWZyYW1ld29yayAqLywKKwkJCQk0MEM4NDk3QTEwMUEzNjg1MDA4MzY0MkEgLyogZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljICovLAorCQkJCTQwODlBMDEyMEZGQUNFRkMwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayAqLywKKwkJCQk0MEM4NDk4OTEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC1zdGF0aWMgKi8sCisJCQkJM0IyMzhGNUYwRTgyOEI1NDAwODQ2RTExIC8qIENoZWNrICovLAorCQkJCTQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MSAvKiBWZXJzaW9uIEluZm8gKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJOEQwN0YyQkYwNDg2Q0M3QTAwN0NEMUQwIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDA0ODg0NTAwRTJGNzk5QjAwQ0Y3NjU4IC8qIFJFQURNRS5tZCBpbiBSZXNvdXJjZXMgKi8sCisJCQkJNDA0ODg0QUMwRTJGN0NEOTAwQ0Y3NjU4IC8qIENIQU5HRVMgaW4gUmVzb3VyY2VzICovLAorCQkJCTQwNDg4NEFEMEUyRjdDRDkwMENGNzY1OCAvKiBDT05UUklCVVRPUlMgaW4gUmVzb3VyY2VzICovLAorCQkJCTQwNDg4NEFFMEUyRjdDRDkwMENGNzY1OCAvKiBMSUNFTlNFIGluIFJlc291cmNlcyAqLywKKwkJCQk0MEM4NDk3ODEwMUEzNjU0MDA4MzY0MkEgLyogbGliZ3Rlc3RfbWFpbi5hIGluIFJlc291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0IyMzhGNUUwRTgyOEI1NDAwODQ2RTExIC8qIFNoZWxsU2NyaXB0ICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSZW1lbWJlciwgdGhpcyBcIlJ1biBTY3JpcHRcIiBidWlsZCBwaGFzZSB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gJFNSQ1JPT1Rcbi9iaW4vYmFzaCBTY3JpcHRzL3J1bnRlc3RzLnNoIjsKKwkJfTsKKwkJNDBDNDRBREIwRTM3OThGNDAwOEZDQzUxIC8qIEdlbmVyYXRlIFZlcnNpb24uaCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJCSIkKFNSQ1JPT1QpL1NjcmlwdHMvdmVyc2lvbmdlbmVyYXRlLnB5IiwKKwkJCQkiJChTUkNST09UKS8uLi9jb25maWd1cmUuYWMiLAorCQkJKTsKKwkJCW5hbWUgPSAiR2VuZXJhdGUgVmVyc2lvbi5oIjsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJCSIkKFBST0pFQ1RfVEVNUF9ESVIpL1ZlcnNpb24uaCIsCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSZW1lbWJlciwgdGhpcyBcIlJ1biBTY3JpcHRcIiBidWlsZCBwaGFzZSB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gJFNSQ1JPT1Rcbi91c3IvYmluL3B5dGhvbiBTY3JpcHRzL3ZlcnNpb25nZW5lcmF0ZS5weSAuLi8gJFBST0pFQ1RfVEVNUF9ESVIiOworCQl9OworLyogRW5kIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJNDA4OTlGNDAwRkZBNzE4NDAwMEIyOUFFIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MDg5OUY1MzBGRkE3MkEwMDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJNDA4OUEwMTAwRkZBQ0VGQzAwMEIyOUFFIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQk0MDg5QTA0NDBGRkFEMUJFMDAwQjI5QUUgLyogc2FtcGxlMS5jYyBpbiBTb3VyY2VzICovLAorCQkJCTQwODlBMDQ2MEZGQUQxQkUwMDBCMjlBRSAvKiBzYW1wbGUxX3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OEY3MTAxQTIwOUMwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ4RkYxMDFBMjExNTAwODM2NDJBIC8qIGd0ZXN0LWFsbC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk0MEM4NDkwODEwMUEyMTdFMDA4MzY0MkEgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwQzg0OTE1MTAxQTIxREYwMDgzNjQyQSAvKiBndGVzdF9tYWluLmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OTdGMTAxQTM2ODUwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5ODAxMDFBMzY4NTAwODM2NDJBIC8qIGd0ZXN0X3VuaXR0ZXN0LmNjIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTQwQzg0OThFMTAxQTM2QTYwMDgzNjQyQSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJNDBDODQ5OEYxMDFBMzZBNjAwODM2NDJBIC8qIHNhbXBsZTEuY2MgaW4gU291cmNlcyAqLywKKwkJCQk0MEM4NDk5MDEwMUEzNkE2MDA4MzY0MkEgLyogc2FtcGxlMV91bml0dGVzdC5jYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk4RDA3RjJDMTA0ODZDQzdBMDA3Q0QxRDAgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTQwODk5RjNBMEZGQTcwRDQwMDBCMjlBRSAvKiBndGVzdC1hbGwuY2MgaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCQk0MDg5OUY5RDBGRkE3NDBGMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MDg5OUY0MjBGRkE3MTg0MDAwQjI5QUUgLyogZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrICovOworCQkJdGFyZ2V0UHJveHkgPSA0MDg5OUY5QzBGRkE3NDBGMDAwQjI5QUUgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MDg5QTA5ODBGRkFEMzRBMDAwQjI5QUUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MDg5QTAxMjBGRkFDRUZDMDAwQjI5QUUgLyogc2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwODlBMDk3MEZGQUQzNEEwMDBCMjlBRSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwOEJFQzEwMTA0NkNGRTkwMERFRjUyMiAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwOEJFQzBGMTA0NkNGRTkwMERFRjUyMiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzQ0QUU2MEUzNzk5MjIwMDhGQ0M1MSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzQ0QURDMEUzNzk4RjQwMDhGQ0M1MSAvKiBWZXJzaW9uIEluZm8gKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzQ0QUU1MEUzNzk5MjIwMDhGQ0M1MSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTdCMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OEY5MTAxQTIwOUMwMDgzNjQyQSAvKiBndGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTdDMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTdEMTAxQTM2ODUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTBBMTAxQTIxN0UwMDgzNjQyQSAvKiBndGVzdF9tYWluLXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5N0UxMDFBMzY4NTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDBDODQ5OEExMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDBDODQ4RjkxMDFBMjA5QzAwODM2NDJBIC8qIGd0ZXN0LXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5OEIxMDFBMzZBNjAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJNDBDODQ5OEMxMDFBMzZBNjAwODM2NDJBIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gNDBDODQ5MEExMDFBMjE3RTAwODM2NDJBIC8qIGd0ZXN0X21haW4tc3RhdGljICovOworCQkJdGFyZ2V0UHJveHkgPSA0MEM4NDk4RDEwMUEzNkE2MDA4MzY0MkEgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQk0MEM4NDk5QzEwMUEzNkRDMDA4MzY0MkEgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSA0MEM4NDkwQTEwMUEyMTdFMDA4MzY0MkEgLyogZ3Rlc3RfbWFpbi1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlCMTAxQTM2REMwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OTlFMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlEMTAxQTM2RTUwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUEwMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDhEMDdGMkJDMDQ4NkNDN0EwMDdDRDFEMCAvKiBndGVzdC1mcmFtZXdvcmsgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OTlGMTAxQTM2RjEwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUY3MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTdBMTAxQTM2ODUwMDgzNjQyQSAvKiBndGVzdF91bml0dGVzdC1zdGF0aWMgKi87CisJCQl0YXJnZXRQcm94eSA9IDQwQzg0OUY2MTAxQTQzNDQwMDgzNjQyQSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTQwQzg0OUY5MTAxQTQzNDkwMDgzNjQyQSAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDQwQzg0OTg5MTAxQTM2QTYwMDgzNjQyQSAvKiBzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyAqLzsKKwkJCXRhcmdldFByb3h5ID0gNDBDODQ5RjgxMDFBNDM0OTAwODM2NDJBIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKy8qIEVuZCBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQkzQjIzOEY2MDBFODI4QjU0MDA4NDZFMTEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlQUk9EVUNUX05BTUUgPSBDaGVjazsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJM0IyMzhGNjEwRTgyOEI1NDAwODQ2RTExIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJUFJPRFVDVF9OQU1FID0gQ2hlY2s7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDA4OTlGNDUwRkZBNzE4NTAwMEIyOUFFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vOworCQkJCVBST0RVQ1RfTkFNRSA9ICJndGVzdF91bml0dGVzdC1mcmFtZXdvcmsiOworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0MDg5OUY0NjBGRkE3MTg1MDAwQjI5QUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC4uLzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIjsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDg5QTAxNTBGRkFDRUZEMDAwQjI5QUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCVBST0RVQ1RfTkFNRSA9ICJzYW1wbGUxX3VuaXR0ZXN0LWZyYW1ld29yayI7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwODlBMDE2MEZGQUNFRkQwMDBCMjlBRSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlQUk9EVUNUX05BTUUgPSAic2FtcGxlMV91bml0dGVzdC1mcmFtZXdvcmsiOworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzQ0QURGMEUzNzk4RjQwMDhGQ0M1MSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gMTAuNzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJCVRBUkdFVF9OQU1FID0gZ3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0MEM0NEFFMDBFMzc5OEY0MDA4RkNDNTEgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gMTAuNzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJCVRBUkdFVF9OQU1FID0gZ3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OEZCMTAxQTIwOUQwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MDg5OUZCMzBGRkE3NTY3MDAwQjI5QUUgLyogU3RhdGljTGlicmFyeVRhcmdldC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09NQklORV9ISURQSV9JTUFHRVMgPSBZRVM7CisJCQkJR0NDX0lOTElORVNfQVJFX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3Q7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwQzg0OEZDMTAxQTIwOUQwMDgzNjQyQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwODk5RkIzMEZGQTc1NjcwMDBCMjlBRSAvKiBTdGF0aWNMaWJyYXJ5VGFyZ2V0LnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKKwkJCQlHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLywKKwkJCQkJLi4vaW5jbHVkZS8sCisJCQkJKTsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDkwRTEwMUEyMTdGMDA4MzY0MkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3RfbWFpbjsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDODQ5MEYxMDFBMjE3RjAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDA4OTlGQjMwRkZBNzU2NzAwMEIyOUFFIC8qIFN0YXRpY0xpYnJhcnlUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8sCisJCQkJCS4uL2luY2x1ZGUvLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3RfbWFpbjsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDk4NTEwMUEzNjg1MDA4MzY0MkEgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAuLi87CisJCQkJUFJPRFVDVF9OQU1FID0gZ3Rlc3RfdW5pdHRlc3Q7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTQwQzg0OTg2MTAxQTM2ODUwMDgzNjQyQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gLi4vOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0X3VuaXR0ZXN0OworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTk1MTAxQTM2QTYwMDgzNjQyQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJUFJPRFVDVF9OQU1FID0gInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIjsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJNDBDODQ5OTYxMDFBMzZBNjAwODM2NDJBIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCVBST0RVQ1RfTkFNRSA9ICJzYW1wbGUxX3VuaXR0ZXN0LXN0YXRpYyI7CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDMwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQliYXNlQ29uZmlndXJhdGlvblJlZmVyZW5jZSA9IDQwRDRDREYyMEUzMEUwNzQwMDI5NDgwMSAvKiBGcmFtZXdvcmtUYXJnZXQueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPTUJJTkVfSElEUElfSU1BR0VTID0gWUVTOworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLAorCQkJCQkuLi9pbmNsdWRlLywKKwkJCQkpOworCQkJCUlORk9QTElTVF9GSUxFID0gUmVzb3VyY2VzL0luZm8ucGxpc3Q7CisJCQkJSU5GT1BMSVNUX1BSRUZJWF9IRUFERVIgPSAiJChQUk9KRUNUX1RFTVBfRElSKS9WZXJzaW9uLmgiOworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9IGd0ZXN0OworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQkJVkVSU0lPTklOR19TWVNURU0gPSAiYXBwbGUtZ2VuZXJpYyI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0RkFEQzI0NDA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MEQ0Q0RGMjBFMzBFMDc0MDAyOTQ4MDEgLyogRnJhbWV3b3JrVGFyZ2V0LnhjY29uZmlnICovOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT01CSU5FX0hJRFBJX0lNQUdFUyA9IFlFUzsKKwkJCQlEWUxJQl9DT01QQVRJQklMSVRZX1ZFUlNJT04gPSAxOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9IDE7CisJCQkJR0NDX1ZFUlNJT04gPSBjb20uYXBwbGUuY29tcGlsZXJzLmxsdm0uY2xhbmcuMV8wOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAoCisJCQkJCS4uLywKKwkJCQkJLi4vaW5jbHVkZS8sCisJCQkJKTsKKwkJCQlJTkZPUExJU1RfRklMRSA9IFJlc291cmNlcy9JbmZvLnBsaXN0OworCQkJCUlORk9QTElTVF9QUkVGSVhfSEVBREVSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvVmVyc2lvbi5oIjsKKwkJCQlJTkZPUExJU1RfUFJFUFJPQ0VTUyA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSBndGVzdDsKKwkJCQlTREtST09UID0gbWFjb3N4OworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gImFwcGxlLWdlbmVyaWMiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0NzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJhc2VDb25maWd1cmF0aW9uUmVmZXJlbmNlID0gNDBENENERjEwRTMwRTA3NDAwMjk0ODAxIC8qIERlYnVnUHJvamVjdC54Y2NvbmZpZyAqLzsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQk0RkFEQzI0ODA4QjQxNTZEMDBBQkU1NUUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYmFzZUNvbmZpZ3VyYXRpb25SZWZlcmVuY2UgPSA0MEQ0Q0RGNDBFMzBFMDc0MDAyOTQ4MDEgLyogUmVsZWFzZVByb2plY3QueGNjb25maWcgKi87CisJCQlidWlsZFNldHRpbmdzID0geworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTNCMjM4RkEzMEU4MjhCQjYwMDg0NkUxMSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiQ2hlY2siICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJM0IyMzhGNjAwRTgyOEI1NDAwODQ2RTExIC8qIERlYnVnICovLAorCQkJCTNCMjM4RjYxMEU4MjhCNTQwMDg0NkUxMSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwODk5RjRBMEZGQTcxQkMwMDBCMjlBRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwODk5RjQ1MEZGQTcxODUwMDBCMjlBRSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDg5OUY0NjBGRkE3MTg1MDAwQjI5QUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MDg5QTAyNDBGRkFDRjAxMDAwQjI5QUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNhbXBsZTFfdW5pdHRlc3QtZnJhbWV3b3JrIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwODlBMDE1MEZGQUNFRkQwMDBCMjlBRSAvKiBEZWJ1ZyAqLywKKwkJCQk0MDg5QTAxNjBGRkFDRUZEMDAwQjI5QUUgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM0NEFFNDBFMzc5OTA1MDA4RkNDNTEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhBZ2dyZWdhdGVUYXJnZXQgIlZlcnNpb24gSW5mbyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0MEM0NEFERjBFMzc5OEY0MDA4RkNDNTEgLyogRGVidWcgKi8sCisJCQkJNDBDNDRBRTAwRTM3OThGNDAwOEZDQzUxIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNDBDODQ5MDIxMDFBMjEyRTAwODM2NDJBIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJndGVzdC1zdGF0aWMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDBDODQ4RkIxMDFBMjA5RDAwODM2NDJBIC8qIERlYnVnICovLAorCQkJCTQwQzg0OEZDMTAxQTIwOUQwMDgzNjQyQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTEyMTAxQTIxRDIwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfbWFpbi1zdGF0aWMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNDBDODQ5MEUxMDFBMjE3RjAwODM2NDJBIC8qIERlYnVnICovLAorCQkJCTQwQzg0OTBGMTAxQTIxN0YwMDgzNjQyQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTQwQzg0OTg0MTAxQTM2ODUwMDgzNjQyQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZ3Rlc3RfdW5pdHRlc3Qtc3RhdGljIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwQzg0OTg1MTAxQTM2ODUwMDgzNjQyQSAvKiBEZWJ1ZyAqLywKKwkJCQk0MEM4NDk4NjEwMUEzNjg1MDA4MzY0MkEgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0MEM4NDk5NDEwMUEzNkE2MDA4MzY0MkEgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNhbXBsZTFfdW5pdHRlc3Qtc3RhdGljIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTQwQzg0OTk1MTAxQTM2QTYwMDgzNjQyQSAvKiBEZWJ1ZyAqLywKKwkJCQk0MEM4NDk5NjEwMUEzNkE2MDA4MzY0MkEgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQk0RkFEQzI0MjA4QjQxNTZEMDBBQkU1NUUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImd0ZXN0LWZyYW1ld29yayIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQk0RkFEQzI0MzA4QjQxNTZEMDBBQkU1NUUgLyogRGVidWcgKi8sCisJCQkJNEZBREMyNDQwOEI0MTU2RDAwQUJFNTVFIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJNEZBREMyNDYwOEI0MTU2RDAwQUJFNTVFIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiZ3Rlc3QiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJNEZBREMyNDcwOEI0MTU2RDAwQUJFNTVFIC8qIERlYnVnICovLAorCQkJCTRGQURDMjQ4MDhCNDE1NkQwMEFCRTU1RSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJfTsKKwlyb290T2JqZWN0ID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC90cmF2aXMuc2ggYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L3RyYXZpcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZDM4MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC90cmF2aXMuc2gKQEAgLTAsMCArMSwxNCBAQAorIyEvdXNyL2Jpbi9lbnYgc2gKK3NldCAtZXZ4CitlbnYgfCBzb3J0CisKK21rZGlyIGJ1aWxkIHx8IHRydWUKK21rZGlyIGJ1aWxkLyRHVEVTVF9UQVJHRVQgfHwgdHJ1ZQorY2QgYnVpbGQvJEdURVNUX1RBUkdFVAorY21ha2UgLURndGVzdF9idWlsZF9zYW1wbGVzPU9OIFwKKyAgICAgIC1EZ21vY2tfYnVpbGRfc2FtcGxlcz1PTiBcCisgICAgICAtRGd0ZXN0X2J1aWxkX3Rlc3RzPU9OIFwKKyAgICAgIC1EZ21vY2tfYnVpbGRfdGVzdHM9T04gXAorICAgICAgLi4vLi4vJEdURVNUX1RBUkdFVAorbWFrZQorbWFrZSB0ZXN0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJldmVudC8uZ2l0aWdub3JlIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjJhYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDk4IEBACisjIyMgVGhlc2UgZmlsZXMgc2hvdWxkIGdldCBpZ25vcmVkIG5vIG1hdHRlciB3aGVyZSB0aGV5IGFwcGVhci4KKworIyBFZGl0b3JzIGxlYXZlIHRoZXNlIGx5aW5nIGFyb3VuZAorXCMqXCMKKy4jKgorKn4KKyouc3dwCisKKyMgQyBzdHVmZgorKi5vCisKKyMgV2luZG93cyBzdHVmZgorKi5vYmoKKyouZXhlCisqLmxpYgorCisjIFBhdGNoIGxlYXZlcyB0aGVzZSBseWluZyBhcnJvdW5kCisqLm9yaWcKKyoucmVqCisKKyMgZ2NvdiBzdHVmZgorKi5nY25vCisqLmdjb3YKKyouZ2NkYQorCisjIEF1dG90b29scyBzdHVmZgorLmRlcHMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorCisjIExpYnRvb2wgc3R1ZmYKKy5saWJzCisqLmxvCisqLmxhCisKKyMgY3RhZ3Mgc3R1ZmYKK1RBR1MKKworIyBTdHVmZiBtYWRlIGJ5IG91ciBtYWtlZmlsZXMKK2xpYmV2ZW50LnBjCitsaWJldmVudF9wdGhyZWFkcy5wYworbGliZXZlbnRfb3BlbnNzbC5wYworKi5sb2cKKyoudHJzCisKKyMjIFRoZSBpbml0aWFsIC8gbWFrZXMgdGhlc2UgZmlsZXMgb25seSBnZXQgaWdub3JlZCBpbiBwYXJ0aWN1bGFyIGRpcmVjdG9yaWVzLgorL2F1dG9tNHRlLmNhY2hlCisKKyMgTGlidG9vbCBhZGRzIHRoZXNlLCBhdCBsZWFzdCBzb21ldGltZXMKKy9tNC9saWJ0b29sLm00CisvbTQvbHRvcHRpb25zLm00CisvbTQvbHRzdWdhci5tNAorL200L2x0dmVyc2lvbi5tNAorL200L2x0fm9ic29sZXRlLm00CisKKy9hY2xvY2FsLm00CisvY29tcGlsZQorL2RveHlnZW4KKy9jb25maWcuZ3Vlc3MKKy9jb25maWcubG9nCisvY29uZmlnLnN0YXR1cworL2NvbmZpZy5zdWIKKy9jb25maWd1cmUKKy9kZXBjb21wCisvY29uZmlnLmgKKy9jb25maWcuaC5pbgorL2luc3RhbGwtc2gKKy9saWJ0b29sCisvbHRtYWluLnNoCisvbWlzc2luZworL3N0YW1wLWgxCisKKy9pbmNsdWRlL2V2ZW50Mi9ldmVudC1jb25maWcuaAorCisvc2FtcGxlL2Rucy1leGFtcGxlCisvc2FtcGxlL2V2ZW50LXRlc3QKKy9zYW1wbGUvaGVsbG8td29ybGQKKy9zYW1wbGUvaHR0cC1zZXJ2ZXIKKy9zYW1wbGUvbGUtcHJveHkKKy9zYW1wbGUvc2lnbmFsLXRlc3QKKy9zYW1wbGUvdGltZS10ZXN0CisKKy90ZXN0L2JlbmNoCisvdGVzdC9iZW5jaF9jYXNjYWRlCisvdGVzdC9iZW5jaF9odHRwCisvdGVzdC9iZW5jaF9odHRwY2xpZW50CisvdGVzdC9yZWdyZXNzCisvdGVzdC9yZWdyZXNzLmdlbi5jCisvdGVzdC9yZWdyZXNzLmdlbi5oCisvdGVzdC9ycGNnZW4tYXR0ZW1wdGVkCisvdGVzdC90ZXN0LWVvZgorL3Rlc3QvdGVzdC1pbml0CisvdGVzdC90ZXN0LXJhdGVsaW0KKy90ZXN0L3Rlc3Qtc2NyaXB0LnNoCisvdGVzdC90ZXN0LXRpbWUKKy90ZXN0L3Rlc3Qtd2VvZgorL3Rlc3QvdGVzdC1jaGFuZ2VsaXN0CisKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L0NoYW5nZUxvZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ2hhbmdlTG9nCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9DaGFuZ2VMb2cKZGlmZiAtLWdpdCBhL0RveHlmaWxlIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvRG94eWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERveHlmaWxlCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9Eb3h5ZmlsZQpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L0xJQ0VOU0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExJQ0VOU0UKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L0xJQ0VOU0UKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIE1ha2VmaWxlLmFtCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUubm1ha2UgYi90aGlyZF9wYXJ0eS9saWJldmVudC9NYWtlZmlsZS5ubWFrZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUubm1ha2UKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L01ha2VmaWxlLm5tYWtlCmRpZmYgLS1naXQgYS9SRUFETUUgYi90aGlyZF9wYXJ0eS9saWJldmVudC9SRUFETUUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIFJFQURNRQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvUkVBRE1FCmRpZmYgLS1naXQgYS9XSU4zMi1Db2RlL2V2ZW50Mi9ldmVudC1jb25maWcuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L1dJTjMyLUNvZGUvZXZlbnQyL2V2ZW50LWNvbmZpZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBXSU4zMi1Db2RlL2V2ZW50Mi9ldmVudC1jb25maWcuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvV0lOMzItQ29kZS9ldmVudDIvZXZlbnQtY29uZmlnLmgKZGlmZiAtLWdpdCBhL1dJTjMyLUNvZGUvdHJlZS5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvV0lOMzItQ29kZS90cmVlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIFdJTjMyLUNvZGUvdHJlZS5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9XSU4zMi1Db2RlL3RyZWUuaApkaWZmIC0tZ2l0IGEvYXJjNHJhbmRvbS5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvYXJjNHJhbmRvbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmM0cmFuZG9tLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2FyYzRyYW5kb20uYwpkaWZmIC0tZ2l0IGEvYXV0b2dlbi5zaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2F1dG9nZW4uc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGF1dG9nZW4uc2gKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2F1dG9nZW4uc2gKZGlmZiAtLWdpdCBhL2J1ZmZlci5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvYnVmZmVyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJ1ZmZlci5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9idWZmZXIuYwpkaWZmIC0tZ2l0IGEvYnVmZmVyX2lvY3AuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2J1ZmZlcl9pb2NwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJ1ZmZlcl9pb2NwLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2J1ZmZlcl9pb2NwLmMKZGlmZiAtLWdpdCBhL2J1ZmZlcmV2ZW50LWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9idWZmZXJldmVudC1pbnRlcm5hbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBidWZmZXJldmVudC1pbnRlcm5hbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9idWZmZXJldmVudC1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9idWZmZXJldmVudC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvYnVmZmVyZXZlbnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVmZmVyZXZlbnQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvYnVmZmVyZXZlbnQuYwpkaWZmIC0tZ2l0IGEvYnVmZmVyZXZlbnRfYXN5bmMuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2J1ZmZlcmV2ZW50X2FzeW5jLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJ1ZmZlcmV2ZW50X2FzeW5jLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2J1ZmZlcmV2ZW50X2FzeW5jLmMKZGlmZiAtLWdpdCBhL2J1ZmZlcmV2ZW50X2ZpbHRlci5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvYnVmZmVyZXZlbnRfZmlsdGVyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJ1ZmZlcmV2ZW50X2ZpbHRlci5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9idWZmZXJldmVudF9maWx0ZXIuYwpkaWZmIC0tZ2l0IGEvYnVmZmVyZXZlbnRfb3BlbnNzbC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvYnVmZmVyZXZlbnRfb3BlbnNzbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBidWZmZXJldmVudF9vcGVuc3NsLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2J1ZmZlcmV2ZW50X29wZW5zc2wuYwpkaWZmIC0tZ2l0IGEvYnVmZmVyZXZlbnRfcGFpci5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvYnVmZmVyZXZlbnRfcGFpci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBidWZmZXJldmVudF9wYWlyLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2J1ZmZlcmV2ZW50X3BhaXIuYwpkaWZmIC0tZ2l0IGEvYnVmZmVyZXZlbnRfcmF0ZWxpbS5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvYnVmZmVyZXZlbnRfcmF0ZWxpbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBidWZmZXJldmVudF9yYXRlbGltLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2J1ZmZlcmV2ZW50X3JhdGVsaW0uYwpkaWZmIC0tZ2l0IGEvYnVmZmVyZXZlbnRfc29jay5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvYnVmZmVyZXZlbnRfc29jay5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBidWZmZXJldmVudF9zb2NrLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2J1ZmZlcmV2ZW50X3NvY2suYwpkaWZmIC0tZ2l0IGEvY2hhbmdlbGlzdC1pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvY2hhbmdlbGlzdC1pbnRlcm5hbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjaGFuZ2VsaXN0LWludGVybmFsLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2NoYW5nZWxpc3QtaW50ZXJuYWwuaApkaWZmIC0tZ2l0IGEvY29tcGF0L3N5cy9xdWV1ZS5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvY29tcGF0L3N5cy9xdWV1ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb21wYXQvc3lzL3F1ZXVlLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2NvbXBhdC9zeXMvcXVldWUuaApkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvY29uZmlndXJlLmFjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25maWd1cmUuYWMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2NvbmZpZ3VyZS5hYwpkaWZmIC0tZ2l0IGEvZGVmZXItaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2RlZmVyLWludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRlZmVyLWludGVybmFsLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2RlZmVyLWludGVybmFsLmgKZGlmZiAtLWdpdCBhL2RldnBvbGwuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2RldnBvbGwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGV2cG9sbC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9kZXZwb2xsLmMKZGlmZiAtLWdpdCBhL2Vwb2xsLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC9lcG9sbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBlcG9sbC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9lcG9sbC5jCmRpZmYgLS1naXQgYS9lcG9sbF9zdWIuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2Vwb2xsX3N1Yi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBlcG9sbF9zdWIuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvZXBvbGxfc3ViLmMKZGlmZiAtLWdpdCBhL2V2YnVmZmVyLWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9ldmJ1ZmZlci1pbnRlcm5hbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldmJ1ZmZlci1pbnRlcm5hbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9ldmJ1ZmZlci1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9ldmRucy4zIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZkbnMuMwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZkbnMuMwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvZXZkbnMuMwpkaWZmIC0tZ2l0IGEvZXZkbnMuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2V2ZG5zLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV2ZG5zLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2ZG5zLmMKZGlmZiAtLWdpdCBhL2V2ZG5zLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9ldmRucy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldmRucy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9ldmRucy5oCmRpZmYgLS1naXQgYS9ldmVudC1pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZlbnQtaW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZlbnQtaW50ZXJuYWwuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvZXZlbnQtaW50ZXJuYWwuaApkaWZmIC0tZ2l0IGEvZXZlbnQuMyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2V2ZW50LjMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV2ZW50LjMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2ZW50LjMKZGlmZiAtLWdpdCBhL2V2ZW50LmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC9ldmVudC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldmVudC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9ldmVudC5jCmRpZmYgLS1naXQgYS9ldmVudC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZlbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZlbnQuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvZXZlbnQuaApkaWZmIC0tZ2l0IGEvZXZlbnRfaW9jcC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZlbnRfaW9jcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldmVudF9pb2NwLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2ZW50X2lvY3AuYwpkaWZmIC0tZ2l0IGEvZXZlbnRfcnBjZ2VuLnB5IGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZlbnRfcnBjZ2VuLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldmVudF9ycGNnZW4ucHkKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2ZW50X3JwY2dlbi5weQpkaWZmIC0tZ2l0IGEvZXZlbnRfdGFnZ2luZy5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZlbnRfdGFnZ2luZy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldmVudF90YWdnaW5nLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2ZW50X3RhZ2dpbmcuYwpkaWZmIC0tZ2l0IGEvZXZodHRwLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9ldmh0dHAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZodHRwLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2aHR0cC5oCmRpZmYgLS1naXQgYS9ldm1hcC1pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZtYXAtaW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZtYXAtaW50ZXJuYWwuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvZXZtYXAtaW50ZXJuYWwuaApkaWZmIC0tZ2l0IGEvZXZtYXAuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2V2bWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV2bWFwLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2bWFwLmMKZGlmZiAtLWdpdCBhL2V2cG9ydC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZwb3J0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV2cG9ydC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9ldnBvcnQuYwpkaWZmIC0tZ2l0IGEvZXZycGMtaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2V2cnBjLWludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV2cnBjLWludGVybmFsLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2cnBjLWludGVybmFsLmgKZGlmZiAtLWdpdCBhL2V2cnBjLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC9ldnJwYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldnJwYy5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9ldnJwYy5jCmRpZmYgLS1naXQgYS9ldnJwYy5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZycGMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZycGMuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvZXZycGMuaApkaWZmIC0tZ2l0IGEvZXZzaWduYWwtaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2V2c2lnbmFsLWludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV2c2lnbmFsLWludGVybmFsLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2c2lnbmFsLWludGVybmFsLmgKZGlmZiAtLWdpdCBhL2V2dGhyZWFkLWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9ldnRocmVhZC1pbnRlcm5hbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldnRocmVhZC1pbnRlcm5hbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9ldnRocmVhZC1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9ldnRocmVhZC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZ0aHJlYWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZ0aHJlYWQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvZXZ0aHJlYWQuYwpkaWZmIC0tZ2l0IGEvZXZ0aHJlYWRfcHRocmVhZC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZ0aHJlYWRfcHRocmVhZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBldnRocmVhZF9wdGhyZWFkLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2dGhyZWFkX3B0aHJlYWQuYwpkaWZmIC0tZ2l0IGEvZXZ0aHJlYWRfd2luMzIuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2V2dGhyZWFkX3dpbjMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV2dGhyZWFkX3dpbjMyLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2dGhyZWFkX3dpbjMyLmMKZGlmZiAtLWdpdCBhL2V2dXRpbC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZ1dGlsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGV2dXRpbC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9ldnV0aWwuYwpkaWZmIC0tZ2l0IGEvZXZ1dGlsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9ldnV0aWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZ1dGlsLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2V2dXRpbC5oCmRpZmYgLS1naXQgYS9ldnV0aWxfcmFuZC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvZXZ1dGlsX3JhbmQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZXZ1dGlsX3JhbmQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvZXZ1dGlsX3JhbmQuYwpkaWZmIC0tZ2l0IGEvaHQtaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2h0LWludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGh0LWludGVybmFsLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2h0LWludGVybmFsLmgKZGlmZiAtLWdpdCBhL2h0dHAtaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2h0dHAtaW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaHR0cC1pbnRlcm5hbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9odHRwLWludGVybmFsLmgKZGlmZiAtLWdpdCBhL2h0dHAuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2h0dHAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaHR0cC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9odHRwLmMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvTWFrZWZpbGUuYW0gYi90aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL01ha2VmaWxlLmFtCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V2ZW50Mi9idWZmZXIuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2J1ZmZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9idWZmZXIuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvYnVmZmVyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL2J1ZmZlcl9jb21wYXQuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2J1ZmZlcl9jb21wYXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9ldmVudDIvYnVmZmVyX2NvbXBhdC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9idWZmZXJfY29tcGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL2J1ZmZlcmV2ZW50LmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9idWZmZXJldmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9idWZmZXJldmVudC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9idWZmZXJldmVudC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V2ZW50Mi9idWZmZXJldmVudF9jb21wYXQuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2J1ZmZlcmV2ZW50X2NvbXBhdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9idWZmZXJldmVudF9jb21wYXQuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvYnVmZmVyZXZlbnRfY29tcGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL2J1ZmZlcmV2ZW50X3NzbC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvYnVmZmVyZXZlbnRfc3NsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvZXZlbnQyL2J1ZmZlcmV2ZW50X3NzbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9idWZmZXJldmVudF9zc2wuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ldmVudDIvYnVmZmVyZXZlbnRfc3RydWN0LmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9idWZmZXJldmVudF9zdHJ1Y3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9ldmVudDIvYnVmZmVyZXZlbnRfc3RydWN0LmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2J1ZmZlcmV2ZW50X3N0cnVjdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V2ZW50Mi9kbnMuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2Rucy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9kbnMuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvZG5zLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL2Ruc19jb21wYXQuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2Ruc19jb21wYXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9ldmVudDIvZG5zX2NvbXBhdC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9kbnNfY29tcGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL2Ruc19zdHJ1Y3QuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2Ruc19zdHJ1Y3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9ldmVudDIvZG5zX3N0cnVjdC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9kbnNfc3RydWN0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL2V2ZW50LmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9ldmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9ldmVudC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9ldmVudC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V2ZW50Mi9ldmVudF9jb21wYXQuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2V2ZW50X2NvbXBhdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9ldmVudF9jb21wYXQuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvZXZlbnRfY29tcGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL2V2ZW50X3N0cnVjdC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvZXZlbnRfc3RydWN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvZXZlbnQyL2V2ZW50X3N0cnVjdC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9ldmVudF9zdHJ1Y3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ldmVudDIvaHR0cC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvaHR0cC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9odHRwLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2h0dHAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ldmVudDIvaHR0cF9jb21wYXQuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2h0dHBfY29tcGF0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvZXZlbnQyL2h0dHBfY29tcGF0LmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2h0dHBfY29tcGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL2h0dHBfc3RydWN0LmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9odHRwX3N0cnVjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9odHRwX3N0cnVjdC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9odHRwX3N0cnVjdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V2ZW50Mi9rZXl2YWxxX3N0cnVjdC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIva2V5dmFscV9zdHJ1Y3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9ldmVudDIva2V5dmFscV9zdHJ1Y3QuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIva2V5dmFscV9zdHJ1Y3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ldmVudDIvbGlzdGVuZXIuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2xpc3RlbmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvZXZlbnQyL2xpc3RlbmVyLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL2xpc3RlbmVyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL3JwYy5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvcnBjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvZXZlbnQyL3JwYy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi9ycGMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ldmVudDIvcnBjX2NvbXBhdC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvcnBjX2NvbXBhdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9ycGNfY29tcGF0LmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL3JwY19jb21wYXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ldmVudDIvcnBjX3N0cnVjdC5oIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvcnBjX3N0cnVjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi9ycGNfc3RydWN0LmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL3JwY19zdHJ1Y3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ldmVudDIvdGFnLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi90YWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9ldmVudDIvdGFnLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL3RhZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V2ZW50Mi90YWdfY29tcGF0LmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi90YWdfY29tcGF0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvZXZlbnQyL3RhZ19jb21wYXQuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvdGFnX2NvbXBhdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V2ZW50Mi90aHJlYWQuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL3RocmVhZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2V2ZW50Mi90aHJlYWQuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZS9ldmVudDIvdGhyZWFkLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXZlbnQyL3V0aWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2luY2x1ZGUvZXZlbnQyL3V0aWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9ldmVudDIvdXRpbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pbmNsdWRlL2V2ZW50Mi91dGlsLmgKZGlmZiAtLWdpdCBhL2lvY3AtaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2lvY3AtaW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW9jcC1pbnRlcm5hbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pb2NwLWludGVybmFsLmgKZGlmZiAtLWdpdCBhL2lwdjYtaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2lwdjYtaW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaXB2Ni1pbnRlcm5hbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9pcHY2LWludGVybmFsLmgKZGlmZiAtLWdpdCBhL2txdWV1ZS5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQva3F1ZXVlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGtxdWV1ZS5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9rcXVldWUuYwpkaWZmIC0tZ2l0IGEvbGliZXZlbnQucGMuaW4gYi90aGlyZF9wYXJ0eS9saWJldmVudC9saWJldmVudC5wYy5pbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliZXZlbnQucGMuaW4KcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2xpYmV2ZW50LnBjLmluCmRpZmYgLS1naXQgYS9saWJldmVudF9vcGVuc3NsLnBjLmluIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvbGliZXZlbnRfb3BlbnNzbC5wYy5pbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliZXZlbnRfb3BlbnNzbC5wYy5pbgpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvbGliZXZlbnRfb3BlbnNzbC5wYy5pbgpkaWZmIC0tZ2l0IGEvbGliZXZlbnRfcHRocmVhZHMucGMuaW4gYi90aGlyZF9wYXJ0eS9saWJldmVudC9saWJldmVudF9wdGhyZWFkcy5wYy5pbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliZXZlbnRfcHRocmVhZHMucGMuaW4KcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2xpYmV2ZW50X3B0aHJlYWRzLnBjLmluCmRpZmYgLS1naXQgYS9saXN0ZW5lci5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvbGlzdGVuZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlzdGVuZXIuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvbGlzdGVuZXIuYwpkaWZmIC0tZ2l0IGEvbG9nLWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9sb2ctaW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbG9nLWludGVybmFsLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L2xvZy1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9sb2cuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L2xvZy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsb2cuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvbG9nLmMKZGlmZiAtLWdpdCBhL200L2FjX2JhY2twb3J0XzI1OV9zc2l6ZXQubTQgYi90aGlyZF9wYXJ0eS9saWJldmVudC9tNC9hY19iYWNrcG9ydF8yNTlfc3NpemV0Lm00CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtNC9hY19iYWNrcG9ydF8yNTlfc3NpemV0Lm00CnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9tNC9hY19iYWNrcG9ydF8yNTlfc3NpemV0Lm00CmRpZmYgLS1naXQgYS9tNC9hY3hfcHRocmVhZC5tNCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L200L2FjeF9wdGhyZWFkLm00CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtNC9hY3hfcHRocmVhZC5tNApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvbTQvYWN4X3B0aHJlYWQubTQKZGlmZiAtLWdpdCBhL21ha2UtZXZlbnQtY29uZmlnLnNlZCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L21ha2UtZXZlbnQtY29uZmlnLnNlZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWFrZS1ldmVudC1jb25maWcuc2VkCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9tYWtlLWV2ZW50LWNvbmZpZy5zZWQKZGlmZiAtLWdpdCBhL21pbmhlYXAtaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L21pbmhlYXAtaW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWluaGVhcC1pbnRlcm5hbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9taW5oZWFwLWludGVybmFsLmgKZGlmZiAtLWdpdCBhL21tLWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9tbS1pbnRlcm5hbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtbS1pbnRlcm5hbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9tbS1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9wb2xsLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC9wb2xsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBvbGwuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvcG9sbC5jCmRpZmYgLS1naXQgYS9yYXRlbGltLWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9yYXRlbGltLWludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHJhdGVsaW0taW50ZXJuYWwuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvcmF0ZWxpbS1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9zYW1wbGUvTWFrZWZpbGUuYW0gYi90aGlyZF9wYXJ0eS9saWJldmVudC9zYW1wbGUvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZS9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvc2FtcGxlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9zYW1wbGUvZG5zLWV4YW1wbGUuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3NhbXBsZS9kbnMtZXhhbXBsZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGUvZG5zLWV4YW1wbGUuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvc2FtcGxlL2Rucy1leGFtcGxlLmMKZGlmZiAtLWdpdCBhL3NhbXBsZS9ldmVudC10ZXN0LmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC9zYW1wbGUvZXZlbnQtdGVzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGUvZXZlbnQtdGVzdC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9zYW1wbGUvZXZlbnQtdGVzdC5jCmRpZmYgLS1naXQgYS9zYW1wbGUvaGVsbG8td29ybGQuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3NhbXBsZS9oZWxsby13b3JsZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGUvaGVsbG8td29ybGQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvc2FtcGxlL2hlbGxvLXdvcmxkLmMKZGlmZiAtLWdpdCBhL3NhbXBsZS9odHRwLXNlcnZlci5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvc2FtcGxlL2h0dHAtc2VydmVyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZS9odHRwLXNlcnZlci5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9zYW1wbGUvaHR0cC1zZXJ2ZXIuYwpkaWZmIC0tZ2l0IGEvc2FtcGxlL2xlLXByb3h5LmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC9zYW1wbGUvbGUtcHJveHkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlL2xlLXByb3h5LmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3NhbXBsZS9sZS1wcm94eS5jCmRpZmYgLS1naXQgYS9zYW1wbGUvc2lnbmFsLXRlc3QuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3NhbXBsZS9zaWduYWwtdGVzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGUvc2lnbmFsLXRlc3QuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvc2FtcGxlL3NpZ25hbC10ZXN0LmMKZGlmZiAtLWdpdCBhL3NhbXBsZS90aW1lLXRlc3QuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3NhbXBsZS90aW1lLXRlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlL3RpbWUtdGVzdC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9zYW1wbGUvdGltZS10ZXN0LmMKZGlmZiAtLWdpdCBhL3NlbGVjdC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvc2VsZWN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlbGVjdC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC9zZWxlY3QuYwpkaWZmIC0tZ2l0IGEvc2lnbmFsLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC9zaWduYWwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2lnbmFsLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3NpZ25hbC5jCmRpZmYgLS1naXQgYS9zdHJsY3B5LWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC9zdHJsY3B5LWludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0cmxjcHktaW50ZXJuYWwuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvc3RybGNweS1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9zdHJsY3B5LmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC9zdHJsY3B5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHN0cmxjcHkuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvc3RybGNweS5jCmRpZmYgLS1naXQgYS90ZXN0L01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdC9NYWtlZmlsZS5ubWFrZSBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvTWFrZWZpbGUubm1ha2UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvTWFrZWZpbGUubm1ha2UKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvTWFrZWZpbGUubm1ha2UKZGlmZiAtLWdpdCBhL3Rlc3QvYmVuY2guYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvYmVuY2guYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9iZW5jaC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L2JlbmNoLmMKZGlmZiAtLWdpdCBhL3Rlc3QvYmVuY2hfY2FzY2FkZS5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9iZW5jaF9jYXNjYWRlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvYmVuY2hfY2FzY2FkZS5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L2JlbmNoX2Nhc2NhZGUuYwpkaWZmIC0tZ2l0IGEvdGVzdC9iZW5jaF9odHRwLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L2JlbmNoX2h0dHAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9iZW5jaF9odHRwLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvYmVuY2hfaHR0cC5jCmRpZmYgLS1naXQgYS90ZXN0L2JlbmNoX2h0dHBjbGllbnQuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvYmVuY2hfaHR0cGNsaWVudC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L2JlbmNoX2h0dHBjbGllbnQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9iZW5jaF9odHRwY2xpZW50LmMKZGlmZiAtLWdpdCBhL3Rlc3QvcmVncmVzcy5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvcmVncmVzcy5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3MuYwpkaWZmIC0tZ2l0IGEvdGVzdC9yZWdyZXNzLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzcy5oCmRpZmYgLS1naXQgYS90ZXN0L3JlZ3Jlc3MucnBjIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzLnJwYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzLnJwYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzLnJwYwpkaWZmIC0tZ2l0IGEvdGVzdC9yZWdyZXNzX2J1ZmZlci5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX2J1ZmZlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3JlZ3Jlc3NfYnVmZmVyLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc19idWZmZXIuYwpkaWZmIC0tZ2l0IGEvdGVzdC9yZWdyZXNzX2J1ZmZlcmV2ZW50LmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfYnVmZmVyZXZlbnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX2J1ZmZlcmV2ZW50LmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc19idWZmZXJldmVudC5jCmRpZmYgLS1naXQgYS90ZXN0L3JlZ3Jlc3NfZG5zLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfZG5zLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvcmVncmVzc19kbnMuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX2Rucy5jCmRpZmYgLS1naXQgYS90ZXN0L3JlZ3Jlc3NfZXQuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc19ldC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3JlZ3Jlc3NfZXQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX2V0LmMKZGlmZiAtLWdpdCBhL3Rlc3QvcmVncmVzc19odHRwLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfaHR0cC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3JlZ3Jlc3NfaHR0cC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfaHR0cC5jCmRpZmYgLS1naXQgYS90ZXN0L3JlZ3Jlc3NfaW9jcC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX2lvY3AuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX2lvY3AuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX2lvY3AuYwpkaWZmIC0tZ2l0IGEvdGVzdC9yZWdyZXNzX2xpc3RlbmVyLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfbGlzdGVuZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX2xpc3RlbmVyLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc19saXN0ZW5lci5jCmRpZmYgLS1naXQgYS90ZXN0L3JlZ3Jlc3NfbWFpbi5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX21haW4uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX21haW4uYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX21haW4uYwpkaWZmIC0tZ2l0IGEvdGVzdC9yZWdyZXNzX21pbmhlYXAuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc19taW5oZWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvcmVncmVzc19taW5oZWFwLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc19taW5oZWFwLmMKZGlmZiAtLWdpdCBhL3Rlc3QvcmVncmVzc19ycGMuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc19ycGMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX3JwYy5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfcnBjLmMKZGlmZiAtLWdpdCBhL3Rlc3QvcmVncmVzc19zc2wuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc19zc2wuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX3NzbC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3Nfc3NsLmMKZGlmZiAtLWdpdCBhL3Rlc3QvcmVncmVzc190ZXN0dXRpbHMuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc190ZXN0dXRpbHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX3Rlc3R1dGlscy5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfdGVzdHV0aWxzLmMKZGlmZiAtLWdpdCBhL3Rlc3QvcmVncmVzc190ZXN0dXRpbHMuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc190ZXN0dXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX3Rlc3R1dGlscy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfdGVzdHV0aWxzLmgKZGlmZiAtLWdpdCBhL3Rlc3QvcmVncmVzc190aHJlYWQuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcmVncmVzc190aHJlYWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX3RocmVhZC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfdGhyZWFkLmMKZGlmZiAtLWdpdCBhL3Rlc3QvcmVncmVzc191dGlsLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfdXRpbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3JlZ3Jlc3NfdXRpbC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3JlZ3Jlc3NfdXRpbC5jCmRpZmYgLS1naXQgYS90ZXN0L3JlZ3Jlc3NfemxpYi5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX3psaWIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZWdyZXNzX3psaWIuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC9yZWdyZXNzX3psaWIuYwpkaWZmIC0tZ2l0IGEvdGVzdC9ycGNnZW5fd3JhcHBlci5zaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcnBjZ2VuX3dyYXBwZXIuc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvcnBjZ2VuX3dyYXBwZXIuc2gKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvcnBjZ2VuX3dyYXBwZXIuc2gKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC1jaGFuZ2VsaXN0LmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rlc3QtY2hhbmdlbGlzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3Rlc3QtY2hhbmdlbGlzdC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rlc3QtY2hhbmdlbGlzdC5jCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtZW9mLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rlc3QtZW9mLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvdGVzdC1lb2YuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC90ZXN0LWVvZi5jCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtaW5pdC5jIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC90ZXN0LWluaXQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC90ZXN0LWluaXQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC90ZXN0LWluaXQuYwpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LXJhdGVsaW0uYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvdGVzdC1yYXRlbGltLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvdGVzdC1yYXRlbGltLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvdGVzdC1yYXRlbGltLmMKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC1yYXRlbGltLnNoIGIvdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC90ZXN0LXJhdGVsaW0uc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvdGVzdC1yYXRlbGltLnNoCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rlc3QtcmF0ZWxpbS5zaApkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LXRpbWUuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvdGVzdC10aW1lLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvdGVzdC10aW1lLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvdGVzdC10aW1lLmMKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC13ZW9mLmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rlc3Qtd2VvZi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3Rlc3Qtd2VvZi5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rlc3Qtd2VvZi5jCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Quc2ggYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rlc3Quc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvdGVzdC5zaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC90ZXN0LnNoCmRpZmYgLS1naXQgYS90ZXN0L3Rpbnl0ZXN0LmMgYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rpbnl0ZXN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvdGlueXRlc3QuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC90aW55dGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0L3Rpbnl0ZXN0LmggYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rpbnl0ZXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvdGlueXRlc3QuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC90aW55dGVzdC5oCmRpZmYgLS1naXQgYS90ZXN0L3Rpbnl0ZXN0X2RlbW8uYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvdGlueXRlc3RfZGVtby5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3Rpbnl0ZXN0X2RlbW8uYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdGVzdC90aW55dGVzdF9kZW1vLmMKZGlmZiAtLWdpdCBhL3Rlc3QvdGlueXRlc3RfbG9jYWwuaCBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3Rlc3QvdGlueXRlc3RfbG9jYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC90aW55dGVzdF9sb2NhbC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rpbnl0ZXN0X2xvY2FsLmgKZGlmZiAtLWdpdCBhL3Rlc3QvdGlueXRlc3RfbWFjcm9zLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rpbnl0ZXN0X21hY3Jvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3Rpbnl0ZXN0X21hY3Jvcy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJldmVudC90ZXN0L3Rpbnl0ZXN0X21hY3Jvcy5oCmRpZmYgLS1naXQgYS91dGlsLWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9saWJldmVudC91dGlsLWludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHV0aWwtaW50ZXJuYWwuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvdXRpbC1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS93aGF0c25ldy0yLjAudHh0IGIvdGhpcmRfcGFydHkvbGliZXZlbnQvd2hhdHNuZXctMi4wLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gd2hhdHNuZXctMi4wLnR4dApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGliZXZlbnQvd2hhdHNuZXctMi4wLnR4dApkaWZmIC0tZ2l0IGEvd2luMzJzZWxlY3QuYyBiL3RoaXJkX3BhcnR5L2xpYmV2ZW50L3dpbjMyc2VsZWN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHdpbjMyc2VsZWN0LmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmV2ZW50L3dpbjMyc2VsZWN0LmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzLy5jcHJvamVjdCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzLy5jcHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjMwNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3MvLmNwcm9qZWN0CkBAIC0wLDAgKzEsMjI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzw/ZmlsZVZlcnNpb24gNC4wLjA/PgorCis8Y3Byb2plY3Qgc3RvcmFnZV90eXBlX2lkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5YbWxQcm9qZWN0RGVzY3JpcHRpb25TdG9yYWdlIj4KKwk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiPgorCQk8Y2NvbmZpZ3VyYXRpb24gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbGNoYWluLmdudS5iYXNlLjkwMzIyNjYyOCI+CisJCQk8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UuOTAzMjI2NjI4IiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9IkRlZmF1bHQiPgorCQkJCTxleHRlcm5hbFNldHRpbmdzLz4KKwkJCQk8ZXh0ZW5zaW9ucz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdtYWtlRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5DV0RMb2NhdG9yIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0NDRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdMREVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQk8L2V4dGVuc2lvbnM+CisJCQk8L3N0b3JhZ2VNb2R1bGU+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KKwkJCQk8Y29uZmlndXJhdGlvbiBidWlsZFByb3BlcnRpZXM9IiIgZGVzY3JpcHRpb249IiIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbGNoYWluLmdudS5iYXNlLjkwMzIyNjYyOCIgbmFtZT0iRGVmYXVsdCIgcGFyZW50PSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5lbXB0eWNmZyI+CisJCQkJCTxmb2xkZXJJbmZvIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2xjaGFpbi5nbnUuYmFzZS45MDMyMjY2MjguMTY4Nzk2Mjc3MyIgbmFtZT0iLyIgcmVzb3VyY2VQYXRoPSIiPgorCQkJCQkJPHRvb2xDaGFpbiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UuMTU5MTYzOTg3NSIgbmFtZT0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UiIHJlc291cmNlVHlwZUJhc2VkRGlzY292ZXJ5PSJmYWxzZSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UiPgorCQkJCQkJCTx0YXJnZXRQbGF0Zm9ybSBhcmNoTGlzdD0iYWxsIiBiaW5hcnlQYXJzZXI9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVMRiIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5iYXNlLjM1MjE1MjQyMiIgbmFtZT0iRGVidWcgUGxhdGZvcm0iIG9zTGlzdD0ibGludXgsaHB1eCxhaXgscW54IiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUucGxhdGZvcm0uYmFzZSIvPgorCQkJCQkJCTxidWlsZGVyIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUuYnVpbGRlci5iYXNlLjExMjQ4NDcyMjAiIGtlZXBFbnZpcm9ubWVudEluQnVpbGRmaWxlPSJmYWxzZSIgbWFuYWdlZEJ1aWxkT249ImZhbHNlIiBuYW1lPSJHbnUgTWFrZSBCdWlsZGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUuYnVpbGRlci5iYXNlIi8+CisJCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXJjaGl2ZXIuYmFzZS4zNjcxODU4MDMiIG5hbWU9IkdDQyBBcmNoaXZlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hcmNoaXZlci5iYXNlIi8+CisJCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmJhc2UuMTU2Mjk1MzQ2MyIgbmFtZT0iR0NDIEMrKyBDb21waWxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuYmFzZSI+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmlucHV0LjM5NzI4NzI2MyIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQiLz4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5iYXNlLjIwMzk0MDIxNjYiIG5hbWU9IkdDQyBDIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuYmFzZSI+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dC45MTQxNzEzIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQiLz4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5saW5rZXIuYmFzZS43OTUyNjUyNzgiIG5hbWU9IkdDQyBDIExpbmtlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmxpbmtlci5iYXNlIi8+CisJCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5iYXNlLjYyMjAwMTY0NiIgbmFtZT0iR0NDIEMrKyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5iYXNlIj4KKwkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLmlucHV0LjEzNDYxNjc5NTMiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5pbnB1dCI+CisJCQkJCQkJCQk8YWRkaXRpb25hbElucHV0IGtpbmQ9ImFkZGl0aW9uYWxpbnB1dGRlcGVuZGVuY3kiIHBhdGhzPSIkKFVTRVJfT0JKUykiLz4KKwkJCQkJCQkJCTxhZGRpdGlvbmFsSW5wdXQga2luZD0iYWRkaXRpb25hbGlucHV0IiBwYXRocz0iJChMSUJTKSIvPgorCQkJCQkJCQk8L2lucHV0VHlwZT4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLmJhc2UuMTgyMjc2NDI1MiIgbmFtZT0iR0NDIEFzc2VtYmxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuYmFzZSI+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLmlucHV0LjM3MDUxNTQ1NSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQiLz4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQk8L3Rvb2xDaGFpbj4KKwkJCQkJPC9mb2xkZXJJbmZvPgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvc3RvcmFnZU1vZHVsZT4KKwkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5leHRlcm5hbFNldHRpbmdzIi8+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUubGFuZ3VhZ2UubWFwcGluZyIvPgorCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS50ZXh0LmNvbW1lbnRPd25lclByb2plY3RNYXBwaW5ncyIvPgorCQk8L2Njb25maWd1cmF0aW9uPgorCTwvc3RvcmFnZU1vZHVsZT4KKwk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KKwkJPHByb2plY3QgaWQ9InNlYXNvY2tzLm51bGwuMTc1NjQ2MDI2OSIgbmFtZT0ic2Vhc29ja3MiLz4KKwk8L3N0b3JhZ2VNb2R1bGU+CisJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InJlZnJlc2hTY29wZSIvPgorCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJzY2FubmVyQ29uZmlndXJhdGlvbiI+CisJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgorCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+CisJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJPC9wcm9maWxlPgorCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+CisJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ibWFrZWZpbGVHZW5lcmF0b3IiPgorCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCTwvcHJvZmlsZT4KKwkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCTwvcHJvZmlsZT4KKwkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDUFAiPgorCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuY3BwIiBjb21tYW5kPSJnKysiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJPC9wcm9maWxlPgorCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCTwvcHJvZmlsZT4KKwkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UuOTAzMjI2NjI4O2NkdC5tYW5hZ2VkYnVpbGQudG9vbGNoYWluLmdudS5iYXNlLjkwMzIyNjYyOC4xNjg3OTYyNzczO2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmJhc2UuMTU2Mjk1MzQ2MztjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dC4zOTcyODcyNjMiPgorCQkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIi8+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyRmlsZVByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ibWFrZWZpbGVHZW5lcmF0b3IiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLWYgJHtwcm9qZWN0X25hbWV9X3NjZC5tayIgY29tbWFuZD0ibWFrZSIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDUFAiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuY3BwIiBjb21tYW5kPSJnKysiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmMiIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KKwkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UuOTAzMjI2NjI4Ij4KKwkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCIvPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDUFAiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1zdGQ9YysrMTEgLUUgLVAgLXYgLWREICZxdW90OyR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAmcXVvdDsiIGNvbW1hbmQ9Ii9zaXRlL2FwcHMvZ2NjLTQuNy4yLWRydy5wYXRjaGVkLjYvYmluL2crKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KKwkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UuOTAzMjI2NjI4O2NkdC5tYW5hZ2VkYnVpbGQudG9vbGNoYWluLmdudS5iYXNlLjkwMzIyNjYyOC4xNjg3OTYyNzczO2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5iYXNlLjIwMzk0MDIxNjY7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0LjkxNDE3MTMiPgorCQkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyIvPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiIGNvbW1hbmQ9Im1ha2UiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQk8L3NjYW5uZXJDb25maWdCdWlsZEluZm8+CisJPC9zdG9yYWdlTW9kdWxlPgorCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5MYW5ndWFnZVNldHRpbmdzUHJvdmlkZXJzIi8+Cis8L2Nwcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3MvLmdpdGlnbm9yZSBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1MTJhYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxNSBAQAorKi5zd3AKKy8uZmlnCisvLnRlc3RzLXBhc3MKKy8udGVzdHMtcGFzcy12YWxncmluZAorL01ha2VmaWxlCisvYXV0b200dGUuY2FjaGUKKy9iaW4KKy9jb25maWcubG9nCisvY29uZmlnLnN0YXR1cworL2NvbmZpZ3VyZQorL29iagorL3RhZ3MKKy8uZ21vY2sKKy5nZGJfaGlzdG9yeQorZ2RiLnR4dApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3MvLnByb2plY3QgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE1ODMzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3MvLnByb2plY3QKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+c2Vhc29ja3M8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5nZW5tYWtlYnVpbGRlcjwvbmFtZT4KKwkJCTx0cmlnZ2Vycz5jbGVhbixmdWxsLGluY3JlbWVudGFsLDwvdHJpZ2dlcnM+CisJCQk8YXJndW1lbnRzPgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pj9uYW1lPzwva2V5PgorCQkJCQk8dmFsdWU+PC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5hcHBlbmRfZW52aXJvbm1lbnQ8L2tleT4KKwkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgorCQkJCTwvZGljdGlvbmFyeT4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmF1dG9CdWlsZFRhcmdldDwva2V5PgorCQkJCQk8dmFsdWU+YWxsPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZEFyZ3VtZW50czwva2V5PgorCQkJCQk8dmFsdWU+PC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZENvbW1hbmQ8L2tleT4KKwkJCQkJPHZhbHVlPm1ha2U8L3ZhbHVlPgorCQkJCTwvZGljdGlvbmFyeT4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmNsZWFuQnVpbGRUYXJnZXQ8L2tleT4KKwkJCQkJPHZhbHVlPmNsZWFuPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5jb250ZW50czwva2V5PgorCQkJCQk8dmFsdWU+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5hY3RpdmVDb25maWdTZXR0aW5nczwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlQXV0b0J1aWxkPC9rZXk+CisJCQkJCTx2YWx1ZT5mYWxzZTwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlQ2xlYW5CdWlsZDwva2V5PgorCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuZW5hYmxlRnVsbEJ1aWxkPC9rZXk+CisJCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5mdWxsQnVpbGRUYXJnZXQ8L2tleT4KKwkJCQkJPHZhbHVlPmFsbDwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuc3RvcE9uRXJyb3I8L2tleT4KKwkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgorCQkJCTwvZGljdGlvbmFyeT4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLnVzZURlZmF1bHRCdWlsZENtZDwva2V5PgorCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuU2Nhbm5lckNvbmZpZ0J1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5jb3JlLmNuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQuY29yZS5jY25hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLm1hbmFnZWRCdWlsZE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLlNjYW5uZXJDb25maWdOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzLy5zZXR0aW5ncy9sYW5ndWFnZS5zZXR0aW5ncy54bWwgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy8uc2V0dGluZ3MvbGFuZ3VhZ2Uuc2V0dGluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZmZiN2MKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy8uc2V0dGluZ3MvbGFuZ3VhZ2Uuc2V0dGluZ3MueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8cHJvamVjdD4KKwk8Y29uZmlndXJhdGlvbiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UuOTAzMjI2NjI4IiBuYW1lPSJEZWZhdWx0Ij4KKwkJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuTGFuZ3VhZ2VTZXR0aW5nc1Byb3ZpZGVyIj4KKwkJCTxwcm92aWRlciBjb3B5LW9mPSJleHRlbnNpb24iIGlkPSJvcmcuZWNsaXBzZS5jZHQudWkuVXNlckxhbmd1YWdlU2V0dGluZ3NQcm92aWRlciIvPgorCQkJPHByb3ZpZGVyLXJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuTUJTTGFuZ3VhZ2VTZXR0aW5nc1Byb3ZpZGVyIiByZWY9InNoYXJlZC1wcm92aWRlciIvPgorCQk8L2V4dGVuc2lvbj4KKwk8L2NvbmZpZ3VyYXRpb24+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy8udHJhdmlzLnltbCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjRhYjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy8udHJhdmlzLnltbApAQCAtMCwwICsxLDIxIEBACitsYW5ndWFnZTogY3BwCitjb21waWxlcjoKKyAgLSBnY2MKKyAgLSBjbGFuZworYmVmb3JlX2luc3RhbGw6CisgIC0gc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOnVidW50dS10b29sY2hhaW4tci90ZXN0IC15CisgIC0gc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOmgtcmF5Zmxvb2QvbGx2bSAteQorICAtIHN1ZG8gYXB0LWdldCB1cGRhdGUgLXFxCitpbnN0YWxsOgorICAtIGlmIFsgIiRDWFgiID0gImcrKyIgXTsgdGhlbiBzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgZysrLTQuNzsgZmkKKyAgLSBpZiBbICIkQ1hYIiA9ICJnKysiIF07IHRoZW4gZXhwb3J0IENYWD0iZysrLTQuNyIgQ0M9ImdjYy00LjciOyBmaQorICAtIGlmIFsgIiRDWFgiID0gImNsYW5nKysiIF07IHRoZW4gc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIGNsYW5nLTMuNDsgZmkKKyAgLSBpZiBbICIkQ1hYIiA9ICJjbGFuZysrIiBdOyB0aGVuIGV4cG9ydCBDWFg9ImNsYW5nKystMy40IiBDQz0iY2xhbmctMy40IjsgZmkKKyAgLSB3Z2V0ICJodHRwczovL2dvb2dsZW1vY2suZ29vZ2xlY29kZS5jb20vZmlsZXMvZ21vY2stMS43LjAuemlwIgorICAtIHVuemlwIGdtb2NrLTEuNy4wLnppcAorICAtIHN1ZG8gYXB0LWdldCBpbnN0YWxsIHZhbGdyaW5kCitzY3JpcHQ6CisgIC0gYXV0b2NvbmYKKyAgLSAuL2NvbmZpZ3VyZSAtLXdpdGgtZ21vY2s9Z21vY2stMS43LjAKKyAgLSBtYWtlCisgIC0gbWFrZSB0ZXN0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9MSUNFTlNFIGIvdGhpcmRfcGFydHkvc2Vhc29ja3MvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk4MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3MvTElDRU5TRQpAQCAtMCwwICsxLDIyIEBACitDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKK1JlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKK2xpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIAorb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgCitGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIAorU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgCitDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCAKK09SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIAorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL01ha2VmaWxlLmluIGIvdGhpcmRfcGFydHkvc2Vhc29ja3MvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2MTMwNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTQ1IEBACitkZWZhdWx0OiBhbGwKKworQVI9YXIKK0FSRkxBR1M9Y3J1CitDWFg9QENYWEAKK0NYWEZMQUdTPUBDWFhGTEFHU0AKK1ZBTEdSSU5EPUBWQUxHUklOREAKK0xERkxBR1M9QExERkxBR1NACisjIGhhY2sgZm9yIGRydyBnY2Mgb24gdWJ1bnR1CitHQ0NfTVVMVElBUkNIIDo9ICQoc2hlbGwgZ2NjIC1wcmludC1tdWx0aWFyY2ggMj4vZGV2L251bGwpCitpZm5lcSAoJChHQ0NfTVVMVElBUkNIKSwpCisgIGV4cG9ydCBMSUJSQVJZX1BBVEggPSAvdXNyL2xpYi8kKEdDQ19NVUxUSUFSQ0gpCisgIGV4cG9ydCBDX0lOQ0xVREVfUEFUSCA9IC91c3IvaW5jbHVkZS8kKEdDQ19NVUxUSUFSQ0gpCisgIGV4cG9ydCBDUExVU19JTkNMVURFX1BBVEggPSAvdXNyL2luY2x1ZGUvJChHQ0NfTVVMVElBUkNIKQorZW5kaWYKKworQ19TUkM9c3JjL21haW4vYworVEVTVF9TUkM9c3JjL3Rlc3QvYworQVBQU19TUkM9c3JjL2FwcC9jCisKK1ZFUlNJT05fU1RSSU5HOj1TZWFTb2Nrcy8kKG9yICQoVkVSU0lPTiksdW52ZXJzaW9uZWQpICgkKHNoZWxsIGdpdCBkZXNjcmliZSAtLWFsd2F5cyAtLWRpcnR5IHx8IGVjaG8gbm9uLWdpdCkpCisKK0NYWEZMQUdTICs9IC1mUElDIC1XYWxsIC1XZXJyb3IgJy1EU0VBU09DS1NfVkVSU0lPTl9TVFJJTkc9IiQoVkVSU0lPTl9TVFJJTkcpIicgLUkkKENfU1JDKQorCisuUEhPTlk6IGFsbCBjbGVhbiBydW4gdGVzdCBzcG90bGVzcyBoZWFkZXItY2hlY2tzIHZhbGdyaW5kLXRlc3QKKworT0JKX0RJUj1vYmoKK0JJTl9ESVI9YmluCisKK0NQUF9TUkNTPSQoc2hlbGwgZmluZCAkKENfU1JDKSAtbmFtZSAnKi5jcHAnKQorSF9TUkNTPSQoc2hlbGwgZmluZCAkKENfU1JDKSAtbmFtZSAnKi5oJykKK1RFU1RfU1JDUz0kKHNoZWxsIGZpbmQgJChURVNUX1NSQykgLW5hbWUgJyouY3BwJykKK0FQUFNfQ1BQX1NSQ1M9JChzaGVsbCBmaW5kICQoQVBQU19TUkMpIC1uYW1lICcqLmNwcCcpCitUQVJHRVRTPSQocGF0c3Vic3QgJChBUFBTX1NSQykvJS5jcHAsJChCSU5fRElSKS8lLCQoQVBQU19DUFBfU1JDUykpCisKK2FwcHM6ICQoVEFSR0VUUykKK2FsbDogYXBwcyAkKEJJTl9ESVIpL2xpYnNlYXNvY2tzLnNvICQoQklOX0RJUikvbGlic2Vhc29ja3MuYSB0ZXN0IGhlYWRlci1jaGVja3MgdmFsZ3JpbmQtdGVzdAorCitkZWJ1ZzoKKwllY2hvICQoJChERUJVR19WQVIpKQorCitPQkpTPSQocGF0c3Vic3QgJChDX1NSQykvJS5jcHAsJChPQkpfRElSKS8lLm8sJChDUFBfU1JDUykpCitIQ1M9JChwYXRzdWJzdCAkKENfU1JDKS8lLmgsJChPQkpfRElSKS8lLmhjLCQoSF9TUkNTKSkKK1RFU1RfT0JKUz0kKHBhdHN1YnN0ICQoVEVTVF9TUkMpLyUuY3BwLCQoT0JKX0RJUikvJS5vLCQoVEVTVF9TUkNTKSkKK0FQUFNfT0JKUz0kKHBhdHN1YnN0ICQoQVBQU19TUkMpLyUuY3BwLCQoT0JKX0RJUikvJS5vLCQoQVBQU19DUFBfU1JDUykpCitBTExfT0JKUz0kKE9CSlMpICQoQVBQU19PQkpTKSAkKFRFU1RfT0JKUykKK0dFTl9PQkpTPSQoT0JKX0RJUikvZW1iZWRkZWQubworCistaW5jbHVkZSAkKEFMTF9PQkpTOi5vPS5kKQorCiskKEFQUFNfT0JKUykgOiAkKE9CSl9ESVIpLyUubyA6ICQoQVBQU19TUkMpLyUuY3BwCisJQG1rZGlyIC1wICQoZGlyICRAKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTU1EIC1NUCAtTUYiJChAOiUubz0lLmQpIiAtTVQiJEAiIC1jIC1vICIkQCIgIiQ8IgorCiskKE9CSlMpIDogJChPQkpfRElSKS8lLm8gOiAkKENfU1JDKS8lLmNwcAorCUBta2RpciAtcCAkKGRpciAkQCkKKwkkKENYWCkgJChDWFhGTEFHUykgLU1NRCAtTVAgLU1GIiQoQDolLm89JS5kKSIgLU1UIiRAIiAtYyAtbyAiJEAiICIkPCIKKworJChIQ1MpIDogJChPQkpfRElSKS8lLmhjIDogJChDX1NSQykvJS5oCisJQG1rZGlyIC1wICQoZGlyICRAKQorCUBlY2hvICJDaGVja2luZyBoZWFkZXIgZmlsZSBpcyBzZWxmLWNvbnRhaW5lZDogJDwiCisJQCQoQ1hYKSAtZnN5bnRheC1vbmx5ICQoQ1hYRkxBR1MpIC1vIC9kZXYvbnVsbCAtYyAtdyAkPAorCUB0b3VjaCAkQAorCiskKFRFU1RfT0JKUykgOiAkKE9CSl9ESVIpLyUubyA6ICQoVEVTVF9TUkMpLyUuY3BwCisJQG1rZGlyIC1wICQoZGlyICRAKQorCSQoQ1hYKSAkKENYWEZMQUdTKSAtTU1EIC1NUCAtTUYiJChAOiUubz0lLmQpIiAtTVQiJEAiIC1jIC1vICIkQCIgIiQ8IgorCiskKFRBUkdFVFMpIDogJChCSU5fRElSKS8lIDogJChPQkpfRElSKS8lLm8gJChPQkpTKSAkKEdFTl9PQkpTKQorCUBta2RpciAtcCAkKEJJTl9ESVIpCisJJChDWFgpICQoQ1hYRkxBR1MpIC1vICRAICReCisKKyQoQklOX0RJUikvbGlic2Vhc29ja3Muc286ICQoT0JKUykgJChHRU5fT0JKUykKKwlAbWtkaXIgLXAgJChCSU5fRElSKQorCSQoQ1hYKSAtc2hhcmVkICQoQ1hYRkxBR1MpIC1vICRAICReCisKKyQoQklOX0RJUikvbGlic2Vhc29ja3MuYTogJChPQkpTKSAkKEdFTl9PQkpTKQorCUBta2RpciAtcCAkKEJJTl9ESVIpCisJQC1ybSAtZiAkKEJJTl9ESVIpL2xpYnNlYXNvY2tzLmEKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK0VNQkVEREVEX0NPTlRFTlQ6PSQoc2hlbGwgZmluZCBzcmMvbWFpbi93ZWIgLXR5cGUgZikKKyQoT0JKX0RJUikvZW1iZWRkZWQubzogc2NyaXB0cy9nZW5fZW1iZWRkZWQucHkgJChFTUJFRERFRF9DT05URU5UKSBzcmMvbWFpbi9jL2ludGVybmFsL0VtYmVkZGVkLmgKKwlAbWtkaXIgLXAgJChkaXIgJEApCisJc2NyaXB0cy9nZW5fZW1iZWRkZWQucHkgJChFTUJFRERFRF9DT05URU5UKSB8ICQoQ1hYKSAkKENYWEZMQUdTKSAteCBjKysgLWMgLW8gIiRAIiAtCisKK2hlYWRlci1jaGVja3M6ICQoSENTKQorCitydW46ICQoQklOX0RJUikvd3NfdGVzdAorCSQoQklOX0RJUikvd3NfdGVzdAorCitpZm5lcSAoIkBHTU9DS19ESVJAIiwgIiIpCitHTU9DS19ESVIgPSBAR01PQ0tfRElSQAorR1RFU1RfRElSID0gJChHTU9DS19ESVIpL2d0ZXN0CitDWFhGTEFHUyArPSAtaXN5c3RlbSAkKEdURVNUX0RJUikvaW5jbHVkZSAtaXN5c3RlbSAkKEdNT0NLX0RJUikvaW5jbHVkZQorR1RFU1RfSEVBREVSUyA9ICQoR1RFU1RfRElSKS9pbmNsdWRlL2d0ZXN0LyouaCBcCisJCQkJJChHVEVTVF9ESVIpL2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvKi5oCitHTU9DS19IRUFERVJTID0gJChHTU9DS19ESVIpL2luY2x1ZGUvZ21vY2svKi5oIFwKKwkJCQkkKEdNT0NLX0RJUikvaW5jbHVkZS9nbW9jay9pbnRlcm5hbC8qLmggXAorCQkJCSQoR1RFU1RfSEVBREVSUykKK0dURVNUX1NSQ1NfID0gJChHVEVTVF9ESVIpL3NyYy8qLmNjICQoR1RFU1RfRElSKS9zcmMvKi5oICQoR1RFU1RfSEVBREVSUykKK0dNT0NLX1NSQ1NfID0gJChHTU9DS19ESVIpL3NyYy8qLmNjICQoR01PQ0tfSEVBREVSUykKKworJChPQkpfRElSKS9ndGVzdC1hbGwubyA6ICQoR1RFU1RfU1JDU18pCisJJChDWFgpICQoQ1hYRkxBR1MpIC1JJChHVEVTVF9ESVIpIC1JJChHTU9DS19ESVIpICQoQ1hYRkxBR1MpIFwKKwkJLWMgJChHVEVTVF9ESVIpL3NyYy9ndGVzdC1hbGwuY2MgLW8gJEAKKworJChPQkpfRElSKS9nbW9jay1hbGwubyA6ICQoR01PQ0tfU1JDU18pCisJJChDWFgpICQoQ1hYRkxBR1MpIC1JJChHVEVTVF9ESVIpIC1JJChHTU9DS19ESVIpICQoQ1hYRkxBR1MpIFwKKwkJLWMgJChHTU9DS19ESVIpL3NyYy9nbW9jay1hbGwuY2MgLW8gJEAKKworJChCSU5fRElSKS90ZXN0czogJChURVNUX09CSlMpICQoQklOX0RJUikvbGlic2Vhc29ja3MuYSBcCisJJChPQkpfRElSKS9nbW9jay1hbGwubyAkKE9CSl9ESVIpL2d0ZXN0LWFsbC5vCisJJChDWFgpICQoTERGTEFHUykgJChDWFhGTEFHUykgLUkgJChURVNUX1NSQykgLW8gJEAgJF4gCisKKy50ZXN0cy1wYXNzOiAkKEJJTl9ESVIpL3Rlc3RzCisJQHJtIC1mIC50ZXN0cy1wYXNzCisJJChCSU5fRElSKS90ZXN0cworCUB0b3VjaCAudGVzdHMtcGFzcworCit0ZXN0OiAudGVzdHMtcGFzcworCitpZm5lcSAoIkBWQUxHUklOREAiLCAiIikKK3ZhbGdyaW5kLXRlc3Q6IC50ZXN0cy1wYXNzCisJJChWQUxHUklORCkgLS1sZWFrLWNoZWNrPWZ1bGwgLS1lcnJvci1leGl0Y29kZT0yIC0tICQoQklOX0RJUikvdGVzdHMKK2Vsc2UKK3ZhbGdyaW5kLXRlc3Q6CisJQGVjaG8gIk5vdCBydW5uaW5nIHZhbGdyaW5kLXRlc3QgYXMgbm8gdmFsZ3JpbmQgYmluYXJ5IGZvdW5kIGR1cmluZyBjb25maWd1cmUiCitlbmRpZgorCitlbHNlCisKK3Rlc3Q6CisJQGVjaG8gIk5vdCBydW5uaW5nIHRlc3RzIGFzIG5vIGdtb2NrL2d0ZXN0IHNwZWNpZmllZCBkdXJpbmcgY29uZmlndXJlIgorCUBlY2hvICJUbyBjb25maWd1cmUsIHNwZWNpZnkgd2l0aCAtLXdpdGgtZ21vY2s9UEFUSF9UT19HTU9DSyIKK3Rlc3QtdmFsZ3JpbmQ6IHRlc3QKKworZW5kaWYKKworY2xlYW46CisJcm0gLXJmICQoT0JKX0RJUikgJChCSU5fRElSKSAqLnRhci5neiAudGVzdHMtcGFzcworCitzcG90bGVzczogY2xlYW4KKwlybSAtcmYgbGliIGluY2x1ZGUgY29uZmlnLmxvZyBjb25maWd1cmUgY29uZmlnLnN0YXR1cyBzcmMvbWFpbi9jL2ludGVybmFsL0NvbmZpZy5oIE1ha2VmaWxlIGF1dG9tNHRlLmNhY2hlCisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL1JFQURNRS5tZCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjAxZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3MvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjQgQEAKK1NlYVNvY2tzIC0gQSB0aW55IGVtYmVkZGFibGUgQysrIEhUVFAgYW5kIFdlYlNvY2tldCBzZXJ2ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvbWF0dGdvZGJvbHQvc2Vhc29ja3Muc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvbWF0dGdvZGJvbHQvc2Vhc29ja3MpCisKK0ZlYXR1cmVzCistLS0tLS0tLQorKiAgIFNpbXBsZSBDKysgQVBJCisqICAgU2VydmVzIHN0YXRpYyBjb250ZW50IGZyb20gZGlzaworKiAgIEFQSSBmb3IgYnVpbGRpbmcgV2ViU29ja2V0IHNlcnZlcnMKKyogICBTaW1wbGUgY29tbWFuZCBsaW5lIGJpbmFyeSBmb3IgcXVpY2sgc2VydmluZyBvZiBzdGF0aWMgZmlsZXMgb25seQorKiAgIFN1cHBvcnRzIG5ld2VyIEh5YmktMTAgYW5kIEh5YmktMTYgV2ViU29ja2V0cyBhcyB3ZWxsIGFzIHRoZSBvbGRlciBIaXhpZSBzdHlsZS4KKworU3R1ZmYgaXQgZG9lc24ndCBkbworLS0tLS0tLS0tLS0tLS0tLS0tLQorSXQncyBub3QgbmVhcmx5IGFzIGNvbmZpZ3VyYWJsZSBhcyBBcGFjaGUsIExpZ2h0dHBkLCBOZ2lueCwgSmV0dHksIGV0Yy4KK0l0IHByb3ZpZGVzIG9ubHkgdmVyeSBsaW1pdGVkIHN1cHBvcnQgZm9yIGN1c3RvbSBjb250ZW50IGdlbmVyYXRpb24gKGUuZy4gU2VydmxldHMpLgorSXQgaGFzIGJlZW4gb3B0aW1pemVkIGZvciBXZWJTb2NrZXQgYmFzZWQgY29udHJvbC4KKworR2V0dGluZyBzdGFydGVkCistLS0tLS0tLS0tLS0tLS0KK0NoZWNrIG91dCB0aGUgW3R1dG9yaWFsXShodHRwczovL2dpdGh1Yi5jb20vbWF0dGdvZGJvbHQvc2Vhc29ja3Mvd2lraS9TZWFTb2Nrcy1xdWljay10dXRvcmlhbCkgb24gdGhlIHdpa2kuCisKK1NlZSBbc3JjL2FwcC9jL3dzX3Rlc3QuY3BwXShodHRwczovL2dpdGh1Yi5jb20vbWF0dGdvZGJvbHQvc2Vhc29ja3MvYmxvYi9tYXN0ZXIvc3JjL2FwcC9jL3dzX3Rlc3QuY3BwKSBmb3IgYW4gZXhhbXBsZS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL1RPRE8ubWQgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9UT0RPLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NmE3YTYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9UT0RPLm1kCkBAIC0wLDAgKzEsMTYgQEAKK0dlbmVyYWwgbGlzdCBvZiB0aGluZ3MgdG9kbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogZ2l0IGdyZXAgJ1RPRE8nIGFuZCBmaXgKKyogaW5jbHVkZSB3aGF0IHlvdSB1c2U6IGxvdHMgb2YgaGVhZGVycyByZWx5IG9uIGFtYmllbnQgaW5jbHVkZXMKKyogYWRkIG1vcmUgdGVzdHMKKyogbW92ZSBtb3JlIHRoaW5ncyBvdmVyIHRvIHRoZSBSZXF1ZXN0L1Jlc3BvbnNlIHdheSBvZiBkb2luZyB0aGluZ3MKKyogRG91YmxlIGNoZWNrIGl0J3Mgb2sgdG8gcmVtb3ZlIGhpeGllLCBhbmQgZG8gc28uICBDdXJyZW50bHkgbm8gd2F5IG9mIHRlc3RpbmcgaXQgYW55d2F5CisgICh3aXRoIHJlZmVyZW5jZSB0byBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlYlNvY2tldCNCcm93c2VyX3N1cHBvcnQgaXQncyBiZWVuIGRlYWQKKyAgc2luY2UgYmVmb3JlIENocm9tZSAxNCkKKworRnVydGhlciBvdXQgdGhpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0KKyogR2VuZXJhbGlzZSB0aGUgcmVxdWVzdC9yZXNwb25zZSBzbyB0aGF0IHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgY2FuIGJlIHBocmFzZWQKKyAgYXMgdGhlbS4KKyogQmVuY2htYXJrIGFuZCBhZGQgYmVuY2htYXJrcyB0byB0aGUgdGVzdHMuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9jb25maWd1cmUuYWMgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2ZTUxYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDcxIEBACittNF9pbmNsdWRlKFtzY3JpcHRzL2MrKzExLm00XSkKKworQUNfUFJFUkVRKDIuNjMpCitBQ19JTklUKFtTZWFTb2Nrc10sIFswLjFdLCBbbWF0dEBnb2Rib2x0Lm9yZ10sIFtdLCBbaHR0cHM6Ly9naXRodWIuY29tL21hdHRnb2Rib2x0L3NlYXNvY2tzXSkKK0FDX0NPTkZJR19TUkNESVIoW3NyYy9tYWluL2Mvc2Vhc29ja3MvU2VydmVyLmhdKQorCitBQ19BUkdfV0lUSChbZ21vY2tdLAorICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZ21vY2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtCdWlsZCB0ZXN0cyB0b28sIHdpdGggc3VwcGxpZWQgZ21vY2sgZGlyZWN0b3J5LiAgU2VhU29ja3Mgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZCBnbW9jayBhbmQgaXRzIGVtYmVkZGVkIGd0ZXN0IGF1dG9tYXRpY2FsbHldKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX1dBUk4oW2RubAorQnVpbGRpbmcgd2l0aG91dCB0ZXN0cyBlbmFibGVkLiBVc2UgLS13aXRoLWdtb2NrPVBBVEhfVE9fR01PQ0tdKV0pCisKK0FTX0lGKFt0ZXN0ICJ4JHt3aXRoX2dtb2NrfSIgIT0gInhubyIgLWEgIngke3dpdGhfZ21vY2t9IiAhPSAieCJdLAorICAgICAgWworICAgICAgIEFTX0lGKFt0ZXN0IC1lICIke3dpdGhfZ21vY2t9L2luY2x1ZGUvZ21vY2svZ21vY2suaCJdLAorICAgICAgICAgICAgIFtHTU9DS19ESVI9IiR7d2l0aF9nbW9ja30iXSwKKyAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtkbmwKKyAgICAgICAgICAgICAgVW5hYmxlIHRvIGxvY2F0ZSBnbW9jayBzb3VyY2UgYXQgJyR7d2l0aF9nbW9ja30nLl0pXSkKKyAgICAgICBdKQorQUNfU1VCU1QoR01PQ0tfRElSKQorCitkbmwgQmFzaWMgc2V0dXAKK0FDX0xBTkcoQysrKQorQUNfUFJPR19DQworQUNfUFJPR19DUFAKK0FDX1BST0dfQ1hYCitBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW25vZXh0XSkKK0FDX0RFRlVOKFtBWF9DWFhfQ0hFQ0tfVU5PUkRFUkVEX01BUF9FTVBMQUNFXSwgWworICAgICAgICAgIEFDX0xBTkdfUFVTSChbQysrXSkKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RkOjp1bm9yZGVyZWRfbWFwIHN1cHBvcnRzIGVtcGxhY2VdKQorICAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgdGVzdCgpIHsgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgaW50PiBhOyBhLmVtcGxhY2UoMiwzKTsgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V2YWwgdW5vcmRlcmVkX21hcF9lbXBsYWNlPXllc10sW2V2YWwgdW5vcmRlcmVkX21hcF9lbXBsYWNlPW5vXSkKKyAgICAgICAgICBBQ19NU0dfUkVTVUxUKFskdW5vcmRlcmVkX21hcF9lbXBsYWNlXSkKKyAgICAgICAgICBBQ19MQU5HX1BPUChbQysrXSkKKyAgICAgICAgICBpZiB0ZXN0IHgkdW5vcmRlcmVkX21hcF9lbXBsYWNlID0geHllczsgdGhlbgorICAgICAgICAgICAgICBBQ19ERUZJTkUoSEFWRV9VTk9SREVSRURfTUFQX0VNUExBQ0UsMSwgW2RlZmluZSBpZiB1bm9yZGVyZWRfbWFwIHN1cHBvcnRzIGVtcGxhY2VdKQorICAgICAgICAgIGZpCisgICAgICAgICAgQUNfU1VCU1QoSEFWRV9VTk9SREVSRURfTUFQX0VNUExBQ0UpCisgICAgICAgICAgXSkKK0FYX0NYWF9DSEVDS19VTk9SREVSRURfTUFQX0VNUExBQ0UKK0FDX1BBVEhfUFJPRyhWQUxHUklORCwgdmFsZ3JpbmQpCisKK2RubCBCYXNpYyBoZWFkZXJzIGFuZCBmZWF0dXJlcworQUNfSEVBREVSX1NUREJPT0wKK0FDX0NfSU5MSU5FCitBQ19UWVBFX1BJRF9UCitBQ19DX1JFU1RSSUNUCitBQ19UWVBFX1NJWkVfVAorQUNfVFlQRV9VSU5UMTZfVAorQUNfVFlQRV9VSU5UMzJfVAorQUNfVFlQRV9VSU5UNjRfVAorQUNfVFlQRV9VSU5UOF9UCitBQ19GVU5DX0VSUk9SX0FUX0xJTkUKK0FDX0ZVTkNfRk9SSworQUNfRlVOQ19TVFJFUlJPUl9SCitBQ19DSEVDS19UWVBFUyhbcHRyZGlmZl90XSkKKworZG5sIHB0aHJlYWRzOyBiZXR0ZXIgaWYgd2UgZGV0ZWN0IHRoaXMgc29tZWhvdworQ1hYRkxBR1M9IiRDWFhGTEFHUyAtcHRocmVhZCIKKworZG5sIFN5c3RlbSBoZWFkZXJzIGFuZCBmdW5jdGlvbnMgdXNlZAorQUNfQ0hFQ0tfSEVBREVSUyhbYXJwYS9pbmV0LmggZmNudGwuaCBpbnR0eXBlcy5oIGxpbWl0cy5oIG5ldGluZXQvaW4uaCBzdGRkZWYuaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3lzL2lvY3RsLmggc3lzL3NvY2tldC5oIHVuaXN0ZC5oIGdldG9wdC5oXSkKK0FDX0NIRUNLX0ZVTkNTKFtkdXAyIGV2ZW50ZmQgc3lzY2FsbCBnZXRob3N0bmFtZSBtZW1zZXQgcm1kaXIgc29ja2V0IHNxcnQgc3RyY2FzZWNtcCBzdHJjaHIgc3RyZHVwIHN0cmVycm9yIGdldG9wdF0pCisKK0FDX0NPTkZJR19IRUFERVJTKFtzcmMvbWFpbi9jL2ludGVybmFsL0NvbmZpZy5oXSkKK0FDX09VVFBVVChbTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc2NyaXB0cy9jKysxMS5tNCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NjcmlwdHMvYysrMTEubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlNWZjZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NjcmlwdHMvYysrMTEubTQKQEAgLTAsMCArMSwxMzYgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMShbZXh0fG5vZXh0XSxbbWFuZGF0b3J5fG9wdGlvbmFsXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVjayBmb3IgYmFzZWxpbmUgbGFuZ3VhZ2UgY292ZXJhZ2UgaW4gdGhlIGNvbXBpbGVyIGZvciB0aGUgQysrMTEKKyMgICBzdGFuZGFyZDsgaWYgbmVjZXNzYXJ5LCBhZGQgc3dpdGNoZXMgdG8gQ1hYRkxBR1MgdG8gZW5hYmxlIHN1cHBvcnQuCisjCisjICAgVGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQsIGluZGljYXRlcyB3aGV0aGVyIHlvdSBpbnNpc3Qgb24gYW4KKyMgICBleHRlbmRlZCBtb2RlIChlLmcuIC1zdGQ9Z251KysxMSkgb3IgYSBzdHJpY3QgY29uZm9ybWFuY2UgbW9kZSAoZS5nLgorIyAgIC1zdGQ9YysrMTEpLiAgSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHlvdSBnZXQgd2hhdGV2ZXIgd29ya3MsIHdpdGgKKyMgICBwcmVmZXJlbmNlIGZvciBhbiBleHRlbmRlZCBtb2RlLgorIworIyAgIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCAnbWFuZGF0b3J5JyBvciBpZiBsZWZ0IHVuc3BlY2lmaWVkLAorIyAgIGluZGljYXRlcyB0aGF0IGJhc2VsaW5lIEMrKzExIHN1cHBvcnQgaXMgcmVxdWlyZWQgYW5kIHRoYXQgdGhlIG1hY3JvCisjICAgc2hvdWxkIGVycm9yIG91dCBpZiBubyBtb2RlIHdpdGggdGhhdCBzdXBwb3J0IGlzIGZvdW5kLiAgSWYgc3BlY2lmaWVkCisjICAgJ29wdGlvbmFsJywgdGhlbiBjb25maWd1cmF0aW9uIHByb2NlZWRzIHJlZ2FyZGxlc3MsIGFmdGVyIGRlZmluaW5nCisjICAgSEFWRV9DWFgxMSBpZiBhbmQgb25seSBpZiBhIHN1cHBvcnRpbmcgbW9kZSBpcyBmb3VuZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAzCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0sIFsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNoZWNrCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50KSA8PSBzaXplb2YoVCksICJub3QgYmlnIGVub3VnaCIpOworICAgIH07CisKKyAgICBzdHJ1Y3QgYmFzZSB7IHZpcnR1YWwgdm9pZCBmdW5jKCkgPSAwOyB9OworICAgIHN0cnVjdCBvdmVycmlkZSA6IGJhc2UgeyB2aXJ0dWFsIHZvaWQgZnVuYygpIG92ZXJyaWRlIHt9OyB9OworCisgICAgdHlwZWRlZiBjaGVjazxjaGVjazxib29sPj4gcmlnaHRfYW5nbGVfYnJhY2tldHM7CisKKyAgICBpbnQgYTsKKyAgICBkZWNsdHlwZShhKSBiOworCisgICAgdHlwZWRlZiBjaGVjazxpbnQ+IGNoZWNrX3R5cGU7CisgICAgY2hlY2tfdHlwZSBjOworICAgIGNoZWNrX3R5cGUmJiBjciA9IHN0YXRpY19jYXN0PGNoZWNrX3R5cGUmJj4oYyk7CisKKyAgICBhdXRvIGQgPSBhOworXSkKKworQUNfREVGVU4oW0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV0sIFtkbmwKKyAgbTRfaWYoWyQxXSwgW10sIFtdLAorICAgICAgICBbJDFdLCBbZXh0XSwgW10sCisgICAgICAgIFskMV0sIFtub2V4dF0sIFtdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgYXJndW1lbnQgYCQxJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdKV0pCisgIG00X2lmKFskMl0sIFtdLCBbYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskMl0sIFttYW5kYXRvcnldLCBbYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskMl0sIFtvcHRpb25hbF0sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD1mYWxzZV0sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBzZWNvbmQgYXJndW1lbnQgYCQyJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdKV0pCisgIEFDX0xBTkdfUFVTSChbQysrXSkKKyAgYWNfc3VjY2Vzcz1ubworICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgYnkgZGVmYXVsdCwKKyAgYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTEsCisgIFtBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldKV0sCisgICAgW2F4X2N2X2N4eF9jb21waWxlX2N4eDExPXllc10sCisgICAgW2F4X2N2X2N4eF9jb21waWxlX2N4eDExPW5vXSldKQorICBpZiB0ZXN0IHgkYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTEgPSB4eWVzOyB0aGVuCisgICAgYWNfc3VjY2Vzcz15ZXMKKyAgZmkKKworICBtNF9pZihbJDFdLCBbbm9leHRdLCBbXSwgW2RubAorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIGZvciBzd2l0Y2ggaW4gLXN0ZD1nbnUrKzExIC1zdGQ9Z251KysweDsgZG8KKyAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMV8kc3dpdGNoXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgIFthY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCisgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldKV0sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyJdKQorICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKworICBtNF9pZihbJDFdLCBbZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBmb3Igc3dpdGNoIGluIC1zdGQ9YysrMTEgLXN0ZD1jKysweDsgZG8KKyAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMV8kc3dpdGNoXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgIFthY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCisgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldKV0sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyJdKQorICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKyAgQUNfTEFOR19QT1AoW0MrK10pCisgIGlmIHRlc3QgeCRheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZCA9IHh0cnVlOyB0aGVuCisgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbKioqIEEgY29tcGlsZXIgd2l0aCBzdXBwb3J0IGZvciBDKysxMSBsYW5ndWFnZSBmZWF0dXJlcyBpcyByZXF1aXJlZC5dKQorICAgIGZpCisgIGVsc2UKKyAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgICAgSEFWRV9DWFgxMT0wCisgICAgICBBQ19NU0dfTk9USUNFKFtObyBjb21waWxlciB3aXRoIEMrKzExIHN1cHBvcnQgd2FzIGZvdW5kXSkKKyAgICBlbHNlCisgICAgICBIQVZFX0NYWDExPTEKKyAgICAgIEFDX0RFRklORShIQVZFX0NYWDExLDEsCisgICAgICAgICAgICAgICAgW2RlZmluZSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgYmFzaWMgQysrMTEgc3ludGF4XSkKKyAgICBmaQorCisgICAgQUNfU1VCU1QoSEFWRV9DWFgxMSkKKyAgZmkKK10pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zY3JpcHRzL2NvbmZpZy1mb3ItZHJ3IGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc2NyaXB0cy9jb25maWctZm9yLWRydwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODhiYzVhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc2NyaXB0cy9jb25maWctZm9yLWRydwpAQCAtMCwwICsxLDE5IEBACisjIS9iaW4vYmFzaAorCitzZXQgLWUKKworYXV0b2NvbmYgCisKK0dNT0NLX0RJUj0uZ21vY2svZ21vY2stMS43LjAKKworaWYgWyAhIC1kICIke0dNT0NLX0RJUn0iIF07IHRoZW4KKyAgICBlY2hvICJHcmFiYmluZyBnbW9jayIKKyAgICBta2RpciAtcCAuZ21vY2sKKyAgICBwdXNoZCAuZ21vY2sKKyAgICB3Z2V0IGh0dHBzOi8vZ29vZ2xlbW9jay5nb29nbGVjb2RlLmNvbS9maWxlcy9nbW9jay0xLjcuMC56aXAKKyAgICB1bnppcCBnbW9jay0xLjcuMC56aXAKKyAgICBwb3BkCitmaQorCitHQ0NfSE9NRT0kKGZpZyAtbSBnY2MvNC45LjAtMiAtZyBHQ0NfSE9NRSkKK0xERkxBR1M9Ii1XbCwtLXJwYXRoLCR7R0NDX0hPTUV9L2xpYjY0IiBDWFg9JHtHQ0NfSE9NRX0vYmluL2crKyAuL2NvbmZpZ3VyZSAtLXdpdGgtZ21vY2s9JHtHTU9DS19ESVJ9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zY3JpcHRzL2dlbl9lbWJlZGRlZC5weSBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NjcmlwdHMvZ2VuX2VtYmVkZGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3MTViMWQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zY3JpcHRzL2dlbl9lbWJlZGRlZC5weQpAQCAtMCwwICsxLDM1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zLCBvcy5wYXRoLCBzeXMKKworcHJpbnQgIiIiCisjaW5jbHVkZSAiaW50ZXJuYWwvRW1iZWRkZWQuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgeworCitzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIEVtYmVkZGVkQ29udGVudD4gZW1iZWRkZWQgPSB7CisiIiIKKworZm9yIGYgaW4gc3lzLmFyZ3ZbMTpdOgorCWJ5dGVzID0gb3BlbihmLCAncmInKS5yZWFkKCkKKwlwcmludCAneyIvJXMiLCB7JyAlIG9zLnBhdGguYmFzZW5hbWUoZikKKwlwcmludCAnIicgKyAiIi5qb2luKFsnXFx4JTAyeCcgJSBvcmQoeCkgZm9yIHggaW4gYnl0ZXNdKSArICciJworCXByaW50ICcsJWQgfX0sJyAlIGxlbihieXRlcykKKworcHJpbnQgIiIiCit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgRW1iZWRkZWRDb250ZW50KiBmaW5kRW1iZWRkZWRDb250ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisJYXV0byBmb3VuZCA9IGVtYmVkZGVkLmZpbmQobmFtZSk7CisJaWYgKGZvdW5kID09IGVtYmVkZGVkLmVuZCgpKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gJmZvdW5kLT5zZWNvbmQ7Cit9CisiIiIKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL2FwcC9jL3BoX3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL2FwcC9jL3BoX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOThlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvYXBwL2MvcGhfdGVzdC5jcHAKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAic2Vhc29ja3MvUGFnZUhhbmRsZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9QcmludGZMb2dnZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TZXJ2ZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TdHJpbmdVdGlsLmgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK3VzaW5nIG5hbWVzcGFjZSBzZWFzb2NrczsKKworY2xhc3MgTXlQYWdlSGFuZGxlcjogcHVibGljIFBhZ2VIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gaGFuZGxlKGNvbnN0IFJlcXVlc3QmIHJlcXVlc3QpIHsKKyAgICAgICAgaWYgKHJlcXVlc3QudmVyYigpID09IFJlcXVlc3Q6OlBvc3QpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQocmVxdWVzdC5jb250ZW50KCksIHJlcXVlc3QuY29udGVudCgpICsgcmVxdWVzdC5jb250ZW50TGVuZ3RoKCkpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlOjp0ZXh0UmVzcG9uc2UoIlRoYW5rcyBmb3IgdGhlIHBvc3QuIFlvdSBzYWlkOiAiICsgY29udGVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcXVlc3QudmVyYigpICE9IFJlcXVlc3Q6OkdldCkgcmV0dXJuIFJlc3BvbnNlOjp1bmhhbmRsZWQoKTsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zdHI7CisgICAgICAgIG9zdHIgPDwgIjxodG1sPjxoZWFkPjx0aXRsZT5zZWFzb2NrcyBleGFtcGxlPC90aXRsZT48L2hlYWQ+IgorICAgICAgICAgICAgICAgICI8Ym9keT5IZWxsbywgIiA8PCByZXF1ZXN0LmNyZWRlbnRpYWxzKCktPmF0dHJpYnV0ZXNbImZ1bGxOYW1lIl0gPDwgIiEgWW91IGFza2VkIGZvciAiIDw8IHJlcXVlc3QuZ2V0UmVxdWVzdFVyaSgpCisgICAgICAgICAgICAgICAgPDwgIiBhbmQgeW91ciBpcCBpcyAiIDw8IHJlcXVlc3QuZ2V0UmVtb3RlQWRkcmVzcygpLnNpbl9hZGRyLnNfYWRkcgorICAgICAgICAgICAgICAgIDw8ICIgYW5kIGEgcmFuZG9tIG51bWJlciBpcyAiIDw8IHJhbmQoKQorICAgICAgICAgICAgICAgIDw8ICI8Zm9ybSBhY3Rpb249L3Bvc3QgbWV0aG9kPXBvc3Q+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXZhbHVlMT48L2lucHV0Pjxicj4iCisgICAgICAgICAgICAgICAgPDwgIjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1TdWJtaXQ+PC9pbnB1dD48L2Zvcm0+IgorICAgICAgICAgICAgICAgIDw8ICI8L2JvZHk+PC9odG1sPiI7CisgICAgICAgIHJldHVybiBSZXNwb25zZTo6aHRtbFJlc3BvbnNlKG9zdHIuc3RyKCkpOworICAgIH0KK307CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TG9nZ2VyPiBsb2dnZXIobmV3IFByaW50ZkxvZ2dlcihMb2dnZXI6OklORk8pKTsKKworICAgIFNlcnZlciBzZXJ2ZXIobG9nZ2VyKTsKKyAgICBzZXJ2ZXIuYWRkUGFnZUhhbmRsZXIoc3RkOjptYWtlX3NoYXJlZDxNeVBhZ2VIYW5kbGVyPigpKTsKKworICAgIHNlcnZlci5zZXJ2ZSgic3JjL3dzX3Rlc3Rfd2ViIiwgOTA5MCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvYXBwL2Mvc2VydmUuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL2FwcC9jL3NlcnZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU1MDFjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL2FwcC9jL3NlcnZlLmNwcApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJpbnRlcm5hbC9WZXJzaW9uLmgiCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9QcmludGZMb2dnZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TZXJ2ZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TdHJpbmdVdGlsLmgiCisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIG5hbWVzcGFjZSBzZWFzb2NrczsKKworbmFtZXNwYWNlIHsKKworY29uc3QgY2hhciB1c2FnZVtdID0gIlVzYWdlOiAlcyBbLXAgUE9SVF0gWy12XSBESVJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgU2VydmVzIGZpbGVzIGZyb20gRElSIG92ZXIgSFRUUCBvbiBwb3J0IFBPUlRcbiI7CisKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGNvbnN0IGFyZ3ZbXSkgeworICAgIGludCBwb3J0ID0gODA7CisgICAgYm9vbCB2ZXJib3NlID0gZmFsc2U7CisgICAgaW50IG9wdDsKKyAgICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAidnA6IikpICE9IC0xKSB7CisgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgIGNhc2UgJ3YnOiB2ZXJib3NlID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOiBwb3J0ID0gYXRvaShvcHRhcmcpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCB1c2FnZSwgYXJndlswXSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvcHRpbmQgPj0gYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2UsIGFyZ3ZbMF0pOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGF1dG8gbG9nZ2VyID0gc3RkOjptYWtlX3NoYXJlZDxQcmludGZMb2dnZXI+KAorICAgICAgICAgICAgdmVyYm9zZSA/IExvZ2dlcjo6REVCVUcgOiBMb2dnZXI6OkFDQ0VTUyk7CisgICAgU2VydmVyIHNlcnZlcihsb2dnZXIpOworICAgIGF1dG8gcm9vdCA9IGFyZ3Zbb3B0aW5kXTsKKyAgICBzZXJ2ZXIuc2VydmUocm9vdCwgcG9ydCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvYXBwL2Mvd3NfZWNoby5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvYXBwL2Mvd3NfZWNoby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2NGE2MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9hcHAvYy93c19lY2hvLmNwcApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9QcmludGZMb2dnZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TZXJ2ZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TdHJpbmdVdGlsLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvV2ViU29ja2V0LmgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8qIFNpbXBsZSBzZXJ2ZXIgdGhhdCBlY2hvIGFueSB0ZXh0IG9yIGJpbmFyeSBXZWJTb2NrZXQgbWVzc2FnZXMgYmFjay4gKi8KKwordXNpbmcgbmFtZXNwYWNlIHNlYXNvY2tzOworCitjbGFzcyBFY2hvSGFuZGxlcjogcHVibGljIFdlYlNvY2tldDo6SGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG9uQ29ubmVjdChXZWJTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EYXRhKFdlYlNvY2tldCogY29ubmVjdGlvbiwgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgeworICAgIGNvbm5lY3Rpb24tPnNlbmQoZGF0YSwgbGVuZ3RoKTsgLy8gYmluYXJ5CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGF0YShXZWJTb2NrZXQqIGNvbm5lY3Rpb24sIGNvbnN0IGNoYXIqIGRhdGEpIHsKKyAgICBjb25uZWN0aW9uLT5zZW5kKGRhdGEpOyAvLyB0ZXh0CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGlzY29ubmVjdChXZWJTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgICB9Cit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPExvZ2dlcj4gbG9nZ2VyKG5ldyBQcmludGZMb2dnZXIoTG9nZ2VyOjpERUJVRykpOworCisgICAgU2VydmVyIHNlcnZlcihsb2dnZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxFY2hvSGFuZGxlcj4gaGFuZGxlcihuZXcgRWNob0hhbmRsZXIoKSk7CisgICAgc2VydmVyLmFkZFdlYlNvY2tldEhhbmRsZXIoIi8iLCBoYW5kbGVyKTsKKyAgICBzZXJ2ZXIuc2VydmUoIi9kZXYvbnVsbCIsIDgwMDApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL2FwcC9jL3dzX3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL2FwcC9jL3dzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODgyM2EKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvYXBwL2Mvd3NfdGVzdC5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQW4gZXh0cmFvcmRpbmFyaWx5IHNpbXBsZSB0ZXN0IHdoaWNoIHByZXNlbnRzIGEgd2ViIHBhZ2Ugd2l0aCBzb21lIGJ1dHRvbnMuCisvLyBDbGlja2luZyBvbiB0aGUgbnVtYmVyZWQgYnV0dG9uIGluY3JlbWVudHMgdGhlIG51bWJlciwgd2hpY2ggaXMgdmlzaWJsZSB0bworLy8gb3RoZXIgY29ubmVjdGVkIGNsaWVudHMuICBXZWJTb2NrZXRzIGFyZSB1c2VkIHRvIGRvIHRoaXM6IGJ5IHRoZSByYXRoZXIKKy8vIHN1c3BpY2lvdXMgbWVhbnMgb2Ygc2VuZGluZyByYXcgSmF2YVNjcmlwdCBjb21tYW5kcyB0byBiZSBleGVjdXRlZCBvbiBvdGhlcgorLy8gY2xpZW50cy4KKworI2luY2x1ZGUgInNlYXNvY2tzL1ByaW50ZkxvZ2dlci5oIgorI2luY2x1ZGUgInNlYXNvY2tzL1NlcnZlci5oIgorI2luY2x1ZGUgInNlYXNvY2tzL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9XZWJTb2NrZXQuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy91dGlsL0pzb24uaCIKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIHNlYXNvY2tzOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgTXlIYW5kbGVyOiBwdWJsaWMgV2ViU29ja2V0OjpIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICBNeUhhbmRsZXIoU2VydmVyKiBzZXJ2ZXIpIDogX3NlcnZlcihzZXJ2ZXIpLCBfY3VycmVudFZhbHVlKDApIHsKKyAgICAgICAgc2V0VmFsdWUoMSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uQ29ubmVjdChXZWJTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgX2Nvbm5lY3Rpb25zLmluc2VydChjb25uZWN0aW9uKTsKKyAgICAgICAgY29ubmVjdGlvbi0+c2VuZChfY3VycmVudFNldFZhbHVlLmNfc3RyKCkpOworICAgICAgICBjb3V0IDw8ICJDb25uZWN0ZWQ6ICIgPDwgY29ubmVjdGlvbi0+Z2V0UmVxdWVzdFVyaSgpCisgICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgZm9ybWF0QWRkcmVzcyhjb25uZWN0aW9uLT5nZXRSZW1vdGVBZGRyZXNzKCkpCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgY291dCA8PCAiQ3JlZGVudGlhbHM6ICIgPDwgKihjb25uZWN0aW9uLT5jcmVkZW50aWFscygpKSA8PCBlbmRsOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkRhdGEoV2ViU29ja2V0KiBjb25uZWN0aW9uLCBjb25zdCBjaGFyKiBkYXRhKSB7CisgICAgICAgIGlmICgwID09IHN0cmNtcCgiZGllIiwgZGF0YSkpIHsKKyAgICAgICAgICAgIF9zZXJ2ZXItPnRlcm1pbmF0ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgwID09IHN0cmNtcCgiY2xvc2UiLCBkYXRhKSkgeworICAgICAgICAgICAgY291dCA8PCAiQ2xvc2luZy4uIiA8PCBlbmRsOworICAgICAgICAgICAgY29ubmVjdGlvbi0+Y2xvc2UoKTsKKyAgICAgICAgICAgIGNvdXQgPDwgIkNsb3NlZC4iIDw8IGVuZGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgdmFsdWUgPSBhdG9pKGRhdGEpICsgMTsKKyAgICAgICAgaWYgKHZhbHVlID4gX2N1cnJlbnRWYWx1ZSkgeworICAgICAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgICAgICAgICAgZm9yIChhdXRvIGNvbm5lY3Rpb24gOiBfY29ubmVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zZW5kKF9jdXJyZW50U2V0VmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EaXNjb25uZWN0KFdlYlNvY2tldCogY29ubmVjdGlvbikgeworICAgICAgICBfY29ubmVjdGlvbnMuZXJhc2UoY29ubmVjdGlvbik7CisgICAgICAgIGNvdXQgPDwgIkRpc2Nvbm5lY3RlZDogIiA8PCBjb25uZWN0aW9uLT5nZXRSZXF1ZXN0VXJpKCkKKyAgICAgICAgICAgICAgICA8PCAiIDogIiA8PCBmb3JtYXRBZGRyZXNzKGNvbm5lY3Rpb24tPmdldFJlbW90ZUFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzZXQ8V2ViU29ja2V0Kj4gX2Nvbm5lY3Rpb25zOworICAgIFNlcnZlciogX3NlcnZlcjsKKyAgICBpbnQgX2N1cnJlbnRWYWx1ZTsKKyAgICBzdHJpbmcgX2N1cnJlbnRTZXRWYWx1ZTsKKworICAgIHZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKSB7CisgICAgICAgIF9jdXJyZW50VmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgX2N1cnJlbnRTZXRWYWx1ZSA9IG1ha2VFeGVjU3RyaW5nKCJzZXQiLCBfY3VycmVudFZhbHVlKTsKKyAgICB9Cit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgICAgc2hhcmVkX3B0cjxMb2dnZXI+IGxvZ2dlcihuZXcgUHJpbnRmTG9nZ2VyKExvZ2dlcjo6REVCVUcpKTsKKworICAgIFNlcnZlciBzZXJ2ZXIobG9nZ2VyKTsKKworICAgIHNoYXJlZF9wdHI8TXlIYW5kbGVyPiBoYW5kbGVyKG5ldyBNeUhhbmRsZXIoJnNlcnZlcikpOworICAgIHNlcnZlci5hZGRXZWJTb2NrZXRIYW5kbGVyKCIvd3MiLCBoYW5kbGVyKTsKKyAgICBzZXJ2ZXIuc2VydmUoInNyYy93c190ZXN0X3dlYiIsIDkwOTApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL2FwcC9jL3dzX3Rlc3RfcG9sbC5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvYXBwL2Mvd3NfdGVzdF9wb2xsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU4MDVlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL2FwcC9jL3dzX3Rlc3RfcG9sbC5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQW4gZXh0cmFvcmRpbmFyaWx5IHNpbXBsZSB0ZXN0IHdoaWNoIHByZXNlbnRzIGEgd2ViIHBhZ2Ugd2l0aCBzb21lIGJ1dHRvbnMuCisvLyBDbGlja2luZyBvbiB0aGUgbnVtYmVyZWQgYnV0dG9uIGluY3JlbWVudHMgdGhlIG51bWJlciwgd2hpY2ggaXMgdmlzaWJsZSB0bworLy8gb3RoZXIgY29ubmVjdGVkIGNsaWVudHMuICBXZWJTb2NrZXRzIGFyZSB1c2VkIHRvIGRvIHRoaXM6IGJ5IHRoZSByYXRoZXIKKy8vIHN1c3BpY2lvdXMgbWVhbnMgb2Ygc2VuZGluZyByYXcgSmF2YVNjcmlwdCBjb21tYW5kcyB0byBiZSBleGVjdXRlZCBvbiBvdGhlcgorLy8gY2xpZW50cy4KKworLy8gU2FtZSBhcyB3c190ZXN0LCBidXQgdXNlcyB0aGUgcG9sbCgpIG1ldGhvZCBhbmQgYSBzZXBhcmF0ZSBlcG9sbCBzZXQgdG8KKy8vIGRlbW9uc3RyYXRlIGhvdyBTZWFzb2NrcyBjYW4gYmUgdXNlZCB3aXRoIGFub3RoZXIgcG9sbGluZyBzeXN0ZW0uCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9QcmludGZMb2dnZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TZXJ2ZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TdHJpbmdVdGlsLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvV2ViU29ja2V0LmgiCisjaW5jbHVkZSAic2Vhc29ja3MvdXRpbC9Kc29uLmgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KKwordXNpbmcgbmFtZXNwYWNlIHNlYXNvY2tzOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgTXlIYW5kbGVyOiBwdWJsaWMgV2ViU29ja2V0OjpIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICBNeUhhbmRsZXIoU2VydmVyKiBzZXJ2ZXIpIDogX3NlcnZlcihzZXJ2ZXIpLCBfY3VycmVudFZhbHVlKDApIHsKKyAgICAgICAgc2V0VmFsdWUoMSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uQ29ubmVjdChXZWJTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgX2Nvbm5lY3Rpb25zLmluc2VydChjb25uZWN0aW9uKTsKKyAgICAgICAgY29ubmVjdGlvbi0+c2VuZChfY3VycmVudFNldFZhbHVlLmNfc3RyKCkpOworICAgICAgICBjb3V0IDw8ICJDb25uZWN0ZWQ6ICIgPDwgY29ubmVjdGlvbi0+Z2V0UmVxdWVzdFVyaSgpCisgICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgZm9ybWF0QWRkcmVzcyhjb25uZWN0aW9uLT5nZXRSZW1vdGVBZGRyZXNzKCkpCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgY291dCA8PCAiQ3JlZGVudGlhbHM6ICIgPDwgKihjb25uZWN0aW9uLT5jcmVkZW50aWFscygpKSA8PCBlbmRsOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkRhdGEoV2ViU29ja2V0KiBjb25uZWN0aW9uLCBjb25zdCBjaGFyKiBkYXRhKSB7CisgICAgICAgIGlmICgwID09IHN0cmNtcCgiZGllIiwgZGF0YSkpIHsKKyAgICAgICAgICAgIF9zZXJ2ZXItPnRlcm1pbmF0ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgwID09IHN0cmNtcCgiY2xvc2UiLCBkYXRhKSkgeworICAgICAgICAgICAgY291dCA8PCAiQ2xvc2luZy4uIiA8PCBlbmRsOworICAgICAgICAgICAgY29ubmVjdGlvbi0+Y2xvc2UoKTsKKyAgICAgICAgICAgIGNvdXQgPDwgIkNsb3NlZC4iIDw8IGVuZGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgdmFsdWUgPSBhdG9pKGRhdGEpICsgMTsKKyAgICAgICAgaWYgKHZhbHVlID4gX2N1cnJlbnRWYWx1ZSkgeworICAgICAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgICAgICAgICAgZm9yIChhdXRvIGNvbm5lY3Rpb24gOiBfY29ubmVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zZW5kKF9jdXJyZW50U2V0VmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EaXNjb25uZWN0KFdlYlNvY2tldCogY29ubmVjdGlvbikgeworICAgICAgICBfY29ubmVjdGlvbnMuZXJhc2UoY29ubmVjdGlvbik7CisgICAgICAgIGNvdXQgPDwgIkRpc2Nvbm5lY3RlZDogIiA8PCBjb25uZWN0aW9uLT5nZXRSZXF1ZXN0VXJpKCkKKyAgICAgICAgICAgICAgICA8PCAiIDogIiA8PCBmb3JtYXRBZGRyZXNzKGNvbm5lY3Rpb24tPmdldFJlbW90ZUFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzZXQ8V2ViU29ja2V0Kj4gX2Nvbm5lY3Rpb25zOworICAgIFNlcnZlciogX3NlcnZlcjsKKyAgICBpbnQgX2N1cnJlbnRWYWx1ZTsKKyAgICBzdHJpbmcgX2N1cnJlbnRTZXRWYWx1ZTsKKworICAgIHZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKSB7CisgICAgICAgIF9jdXJyZW50VmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgX2N1cnJlbnRTZXRWYWx1ZSA9IG1ha2VFeGVjU3RyaW5nKCJzZXQiLCBfY3VycmVudFZhbHVlKTsKKyAgICB9Cit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgICAgc2hhcmVkX3B0cjxMb2dnZXI+IGxvZ2dlcihuZXcgUHJpbnRmTG9nZ2VyKExvZ2dlcjo6REVCVUcpKTsKKworICAgIFNlcnZlciBzZXJ2ZXIobG9nZ2VyKTsKKworICAgIHNoYXJlZF9wdHI8TXlIYW5kbGVyPiBoYW5kbGVyKG5ldyBNeUhhbmRsZXIoJnNlcnZlcikpOworICAgIHNlcnZlci5hZGRXZWJTb2NrZXRIYW5kbGVyKCIvd3MiLCBoYW5kbGVyKTsKKyAgICBzZXJ2ZXIuc2V0U3RhdGljUGF0aCgic3JjL3dzX3Rlc3Rfd2ViIik7CisgICAgaWYgKCFzZXJ2ZXIuc3RhcnRMaXN0ZW5pbmcoOTA5MCkpIHsKKyAgICAgICAgY2VyciA8PCAiY291bGRuJ3Qgc3RhcnQgbGlzdGVuaW5nIiA8PCBlbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaW50IG15RXBvbGwgPSBlcG9sbF9jcmVhdGUoMTApOworICAgIGVwb2xsX2V2ZW50IHdha2VTZWFzb2NrcyA9IHsgRVBPTExJTnxFUE9MTE9VVHxFUE9MTEVSUiwgeyAmc2VydmVyIH0gfTsKKyAgICBlcG9sbF9jdGwobXlFcG9sbCwgRVBPTExfQ1RMX0FERCwgc2VydmVyLmZkKCksICZ3YWtlU2Vhc29ja3MpOworCisgICAgLy8gQWxzbyBwb2xsIHN0ZGluCisgICAgZXBvbGxfZXZlbnQgd2FrZVN0ZGluID0geyBFUE9MTElOLCB7IG51bGxwdHIgfSB9OworICAgIGVwb2xsX2N0bChteUVwb2xsLCBFUE9MTF9DVExfQURELCBTVERJTl9GSUxFTk8sICZ3YWtlU3RkaW4pOworICAgIGF1dG8gcHJldkZsYWdzID0gZmNudGwoU1RESU5fRklMRU5PLCBGX0dFVEZMLCAwKTsKKyAgICBmY250bChTVERJTl9GSUxFTk8sIEZfU0VURkwsIHByZXZGbGFncyB8IE9fTk9OQkxPQ0spOworCisgICAgY291dCA8PCAiV2lsbCBlY2hvIGFueXRoaW5nIHR5cGVkIGluIHN0ZGluOiAiIDw8IGZsdXNoOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGNvbnN0ZXhwciBhdXRvIG1heEV2ZW50cyA9IDI7CisgICAgICAgIGVwb2xsX2V2ZW50IGV2ZW50c1ttYXhFdmVudHNdOworICAgICAgICBhdXRvIHJlcyA9IGVwb2xsX3dhaXQobXlFcG9sbCwgZXZlbnRzLCBtYXhFdmVudHMsIC0xKTsKKyAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgIGNlcnIgPDwgImVwb2xsIHJldHVybmVkIGFuIGVycm9yIiA8PCBlbmRsOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgcmVzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChldmVudHNbaV0uZGF0YS5wdHIgPT0gJnNlcnZlcikgeworICAgICAgICAgICAgICAgIGF1dG8gc2Vhc29ja3NSZXN1bHQgPSBzZXJ2ZXIucG9sbCgwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vhc29ja3NSZXN1bHQgPT0gU2VydmVyOjpQb2xsUmVzdWx0OjpUZXJtaW5hdGVkKSByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBpZiAoc2Vhc29ja3NSZXN1bHQgPT0gU2VydmVyOjpQb2xsUmVzdWx0OjpFcnJvcikgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1tpXS5kYXRhLnB0ciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgLy8gRWNobyBzdGRpbiB0byBzdGRvdXQgdG8gc2hvdyB3ZSBjYW4gcmVhZCBmcm9tIHRoYXQgdG9vLgorICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBidWZbMTAyNF07CisgICAgICAgICAgICAgICAgICAgIGF1dG8gbnVtUmVhZCA9IDo6cmVhZChTVERJTl9GSUxFTk8sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVtUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJubyAhPSBFV09VTERCTE9DSyAmJiBlcnJubyAhPSBFQUdBSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJFcnJvciByZWFkaW5nIHN0ZGluIiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtUmVhZCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gd3JpdHRlbiA9IHdyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiwgbnVtUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdHRlbiAhPSBudW1SZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VyciA8PCAiVHJ1bmNhdGVkIHdyaXRlIiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bVJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2VyciA8PCAiRU9GIG9uIHN0ZGluIiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL0Nvbm5lY3Rpb24uY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzI1MGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9Db25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDEwNzUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgImludGVybmFsL0NvbmZpZy5oIgorI2luY2x1ZGUgImludGVybmFsL0VtYmVkZGVkLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwvSGVhZGVyTWFwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwvSHliaUFjY2VwdC5oIgorI2luY2x1ZGUgImludGVybmFsL0h5YmlQYWNrZXREZWNvZGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwvTG9nU3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwvUGFnZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC9WZXJzaW9uLmgiCisKKyNpbmNsdWRlICJtZDUvbWQ1LmgiCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9Db25uZWN0aW9uLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvQ3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9Mb2dnZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9QYWdlSGFuZGxlci5oIgorI2luY2x1ZGUgInNlYXNvY2tzL1NlcnZlci5oIgorI2luY2x1ZGUgInNlYXNvY2tzL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9Ub1N0cmluZy5oIgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgeworCit1aW50MzJfdCBwYXJzZVdlYlNvY2tldEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7CisgICAgdWludDMyX3Qga2V5TnVtYmVyID0gMDsKKyAgICB1aW50MzJfdCBudW1TcGFjZXMgPSAwOworICAgIGZvciAoYXV0byBjIDoga2V5KSB7CisgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAga2V5TnVtYmVyID0ga2V5TnVtYmVyICogMTAgKyBjIC0gJzAnOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyAnKSB7CisgICAgICAgICAgICArK251bVNwYWNlczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVtU3BhY2VzID4gMCA/IGtleU51bWJlciAvIG51bVNwYWNlcyA6IDA7Cit9CisKK2NoYXIqIGV4dHJhY3RMaW5lKHVpbnQ4X3QqJiBmaXJzdCwgdWludDhfdCogbGFzdCwgY2hhcioqIGNvbG9uID0gTlVMTCkgeworICAgIGZvciAodWludDhfdCogcHRyID0gZmlyc3Q7IHB0ciA8IGxhc3QgLSAxOyArK3B0cikgeworICAgICAgICBpZiAocHRyWzBdID09ICdccicgJiYgcHRyWzFdID09ICdcbicpIHsKKyAgICAgICAgICAgIHB0clswXSA9IDA7CisgICAgICAgICAgICB1aW50OF90KiByZXN1bHQgPSBmaXJzdDsKKyAgICAgICAgICAgIGZpcnN0ID0gcHRyICsgMjsKKyAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIqPiAocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29sb24gJiYgcHRyWzBdID09ICc6JyAmJiAqY29sb24gPT0gTlVMTCkgeworICAgICAgICAgICAgKmNvbG9uID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4gKHB0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0ZDo6c3RyaW5nIHdlYnRpbWUodGltZV90IHRpbWUpIHsKKyAgICBzdHJ1Y3QgdG0gdG07CisgICAgZ210aW1lX3IoJnRpbWUsICZ0bSk7CisgICAgY2hhciBidWZbMTAyNF07CisgICAgLy8gV2VkLCAyMCBBcHIgMjAxMSAxNzozMToyOCBHTVQKKyAgICBzdHJmdGltZShidWYsIHNpemVvZihidWYpLTEsICIlYSwgJWQgJWIgJVkgJUg6JU06JVMgJVoiLCAmdG0pOworICAgIHJldHVybiBidWY7Cit9CisKK3N0ZDo6c3RyaW5nIG5vdygpIHsKKyAgICByZXR1cm4gd2VidGltZSh0aW1lKE5VTEwpKTsKK30KKworY2xhc3MgUmFpaUZkIHsKKyAgICBpbnQgX2ZkOworcHVibGljOgorICAgIFJhaWlGZChjb25zdCBjaGFyKiBmaWxlbmFtZSkgeworICAgICAgICBfZmQgPSA6Om9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgICB9CisgICAgUmFpaUZkKGNvbnN0IFJhaWlGZCYpID0gZGVsZXRlOworICAgIFJhaWlGZCYgb3BlcmF0b3I9KGNvbnN0IFJhaWlGZCYpID0gZGVsZXRlOworICAgIH5SYWlpRmQoKSB7CisgICAgICAgIGlmIChfZmQgIT0gLTEpIHsKKyAgICAgICAgICAgIDo6Y2xvc2UoX2ZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIG9rKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX2ZkICE9IC0xOworICAgIH0KKyAgICBvcGVyYXRvciBpbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfZmQ7CisgICAgfQorfTsKKworY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gY29udGVudFR5cGVzID0geworICAgIHsgInR4dCIsICJ0ZXh0L3BsYWluIiB9LAorICAgIHsgImNzcyIsICJ0ZXh0L2NzcyIgfSwKKyAgICB7ICJjc3YiLCAidGV4dC9jc3YiIH0sCisgICAgeyAiaHRtIiwgInRleHQvaHRtbCIgfSwKKyAgICB7ICJodG1sIiwgInRleHQvaHRtbCIgfSwKKyAgICB7ICJ4bWwiLCAidGV4dC94bWwiIH0sCisgICAgeyAianMiLCAidGV4dC9qYXZhc2NyaXB0IiB9LCAvLyBUZWNobmljYWxseSBpdCBzaG91bGQgYmUgYXBwbGljYXRpb24vamF2YXNjcmlwdCAoUkZDIDQzMjkpLCBidXQgSUU4IHN0cnVnZ2xlcyB3aXRoIHRoYXQKKyAgICB7ICJ4aHRtbCIsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiIH0sCisgICAgeyAianNvbiIsICJhcHBsaWNhdGlvbi9qc29uIiB9LAorICAgIHsgInBkZiIsICJhcHBsaWNhdGlvbi9wZGYiIH0sCisgICAgeyAiemlwIiwgImFwcGxpY2F0aW9uL3ppcCIgfSwKKyAgICB7ICJ0YXIiLCAiYXBwbGljYXRpb24veC10YXIiIH0sCisgICAgeyAiZ2lmIiwgImltYWdlL2dpZiIgfSwKKyAgICB7ICJqcGVnIiwgImltYWdlL2pwZWciIH0sCisgICAgeyAianBnIiwgImltYWdlL2pwZWciIH0sCisgICAgeyAidGlmZiIsICJpbWFnZS90aWZmIiB9LAorICAgIHsgInRpZiIsICJpbWFnZS90aWZmIiB9LAorICAgIHsgInBuZyIsICJpbWFnZS9wbmciIH0sCisgICAgeyAic3ZnIiwgImltYWdlL3N2Zyt4bWwiIH0sCisgICAgeyAiaWNvIiwgImltYWdlL3gtaWNvbiIgfSwKKyAgICB7ICJzd2YiLCAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIH0sCisgICAgeyAibXAzIiwgImF1ZGlvL21wZWciIH0sCisgICAgeyAid2F2IiwgImF1ZGlvL3gtd2F2IiB9LAorICAgIHsgInR0ZiIsICJmb250L3R0ZiIgfSwKK307CisKK3N0ZDo6c3RyaW5nIGdldEV4dChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIGF1dG8gbGFzdERvdCA9IHBhdGguZmluZF9sYXN0X29mKCcuJyk7CisgICAgaWYgKGxhc3REb3QgIT0gcGF0aC5ucG9zKSB7CisgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cihsYXN0RG90ICsgMSk7CisgICAgfQorICAgIHJldHVybiAiIjsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIGdldENvbnRlbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgYXV0byBpdCA9IGNvbnRlbnRUeXBlcy5maW5kKGdldEV4dChwYXRoKSk7CisgICAgaWYgKGl0ICE9IGNvbnRlbnRUeXBlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGRlZmF1bHRUeXBlKCJ0ZXh0L2h0bWwiKTsKKyAgICByZXR1cm4gZGVmYXVsdFR5cGU7Cit9CisKKy8vIENhY2hlYWJpbGl0eSBpcyBvbmx5IHNldCBmb3IgcmVzb3VyY2VzIHRoYXQgKlJFUVVJUkUqIGNhY2hpbmcgZm9yIGJyb3dzZXIgc3VwcG9ydCByZWFzb25zLgorLy8gSXQncyBvZmYgZm9yIGV2ZXJ5dGhpbmcgZWxzZSB0byBzYXZlIG9uIGJyb3dzZXIgcmVsb2FkIGhlYWRhY2hlcyBkdXJpbmcgZGV2ZWxvcG1lbnQsIGF0CisvLyBsZWFzdCB1bnRpbCB3ZSBzdXBwb3J0IEVUYWdzIG9yIElmLU1vZGlmaWVkLVNpbmNlOiB0eXBlIGNoZWNraW5nLCB3aGljaCB3ZSBtYXkgbmV2ZXIgZG8uCitib29sIGlzQ2FjaGVhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc3RkOjpzdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0KHBhdGgpOworICAgIGlmIChleHRlbnNpb24gPT0gIm1wMyIgfHwgZXh0ZW5zaW9uID09ICJ3YXYiKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NvbnN0IHNpemVfdCBNYXhCdWZmZXJTaXplID0gMTYgKiAxMDI0ICogMTAyNDsKK2NvbnN0IHNpemVfdCBSZWFkV3JpdGVCdWZmZXJTaXplID0gMTYgKiAxMDI0OworY29uc3Qgc2l6ZV90IE1heFdlYnNvY2tldE1lc3NhZ2VTaXplID0gMTYzODQ7Citjb25zdCBzaXplX3QgTWF4SGVhZGVyc1NpemUgPSA2NCAqIDEwMjQ7CisKK2NsYXNzIFByZWZpeFdyYXBwZXIgOiBwdWJsaWMgc2Vhc29ja3M6OkxvZ2dlciB7CisgICAgc3RkOjpzdHJpbmcgX3ByZWZpeDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TG9nZ2VyPiBfbG9nZ2VyOworcHVibGljOgorICAgIFByZWZpeFdyYXBwZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwgc3RkOjpzaGFyZWRfcHRyPExvZ2dlcj4gbG9nZ2VyKQorICAgIDogX3ByZWZpeChwcmVmaXgpLCBfbG9nZ2VyKGxvZ2dlcikge30KKworICAgIHZpcnR1YWwgdm9pZCBsb2coTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgICAgICAgX2xvZ2dlci0+bG9nKGxldmVsLCAoX3ByZWZpeCArIG1lc3NhZ2UpLmNfc3RyKCkpOworICAgIH0KK307CisKK2Jvb2wgaGFzQ29ubmVjdGlvblR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJmNvbm5lY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlKSB7CisgICAgZm9yIChhdXRvIGNvblR5cGUgOiBzZWFzb2Nrczo6c3BsaXQoY29ubmVjdGlvbiwgJywnKSkgeworICAgICAgICB3aGlsZSAoIWNvblR5cGUuZW1wdHkoKSAmJiBpc3NwYWNlKGNvblR5cGVbMF0pKQorICAgICAgICAgICAgY29uVHlwZSA9IGNvblR5cGUuc3Vic3RyKDEpOworICAgICAgICBpZiAoc2Vhc29ja3M6OmNhc2VJbnNlbnNpdGl2ZVNhbWUoY29uVHlwZSwgdHlwZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworQ29ubmVjdGlvbjo6Q29ubmVjdGlvbigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExvZ2dlcj4gbG9nZ2VyLAorICAgICAgICBTZXJ2ZXJJbXBsJiBzZXJ2ZXIsCisgICAgICAgIGludCBmZCwKKyAgICAgICAgY29uc3Qgc29ja2FkZHJfaW4mIGFkZHJlc3MpCisgICAgOiBfbG9nZ2VyKG5ldyBQcmVmaXhXcmFwcGVyKGZvcm1hdEFkZHJlc3MoYWRkcmVzcykgKyAiIDogIiwgbG9nZ2VyKSksCisgICAgICBfc2VydmVyKHNlcnZlciksCisgICAgICBfZmQoZmQpLAorICAgICAgX3NodXRkb3duKGZhbHNlKSwKKyAgICAgIF9oYWRTZW5kRXJyb3IoZmFsc2UpLAorICAgICAgX2Nsb3NlT25FbXB0eShmYWxzZSksCisgICAgICBfcmVnaXN0ZXJlZEZvcldyaXRlRXZlbnRzKGZhbHNlKSwKKyAgICAgIF9hZGRyZXNzKGFkZHJlc3MpLAorICAgICAgX2J5dGVzU2VudCgwKSwKKyAgICAgIF9ieXRlc1JlY2VpdmVkKDApLAorICAgICAgX3NodXRkb3duQnlVc2VyKGZhbHNlKSwKKyAgICAgIF9zdGF0ZShSRUFESU5HX0hFQURFUlMpIHsKK30KKworQ29ubmVjdGlvbjo6fkNvbm5lY3Rpb24oKSB7CisgICAgX3NlcnZlci5jaGVja1RocmVhZCgpOworICAgIGZpbmFsaXNlKCk7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xvc2UoKSB7CisgICAgLy8gVGhpcyBpcyB0aGUgdXNlci1zaWRlIGNsb3NlIHJlcXVlc3RzIE9OTFkhIFlvdSBzaG91bGQgQ2FsbCBjbG9zZUludGVybmFsCisgICAgX3NodXRkb3duQnlVc2VyID0gdHJ1ZTsKKyAgICBjbG9zZUludGVybmFsKCk7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xvc2VXaGVuRW1wdHkoKSB7CisgICAgaWYgKF9vdXRCdWYuZW1wdHkoKSkgeworICAgICAgICBjbG9zZUludGVybmFsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2Nsb3NlT25FbXB0eSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb246OmNsb3NlSW50ZXJuYWwoKSB7CisgICAgLy8gSXQgb25seSBhY3R1YWxseSBvbmx5IGNhbGxzIHNodXRkb3duIG9uIHRoZSBzb2NrZXQsCisgICAgLy8gbGVhdmluZyB0aGUgY2xvc2Ugb2YgdGhlIEZEIGFuZCB0aGUgY2xlYW51cCB1bnRpbCB0aGUgZGVzdHJ1Y3RvciBydW5zLgorICAgIF9zZXJ2ZXIuY2hlY2tUaHJlYWQoKTsKKyAgICBpZiAoX2ZkICE9IC0xICYmICFfc2h1dGRvd24gJiYgOjpzaHV0ZG93bihfZmQsIFNIVVRfUkRXUikgPT0gLTEpIHsKKyAgICAgICAgTFNfV0FSTklORyhfbG9nZ2VyLCAiVW5hYmxlIHRvIHNodXRkb3duIHNvY2tldCA6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgIH0KKyAgICBfc2h1dGRvd24gPSB0cnVlOworfQorCisKK3ZvaWQgQ29ubmVjdGlvbjo6ZmluYWxpc2UoKSB7CisgICAgaWYgKF93ZWJTb2NrZXRIYW5kbGVyKSB7CisgICAgICAgIF93ZWJTb2NrZXRIYW5kbGVyLT5vbkRpc2Nvbm5lY3QodGhpcyk7CisgICAgICAgIF93ZWJTb2NrZXRIYW5kbGVyLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChfZmQgIT0gLTEpIHsKKyAgICAgICAgX3NlcnZlci5yZW1vdmUodGhpcyk7CisgICAgICAgIExTX0RFQlVHKF9sb2dnZXIsICJDbG9zaW5nIHNvY2tldCIpOworICAgICAgICA6OmNsb3NlKF9mZCk7CisgICAgfQorICAgIF9mZCA9IC0xOworfQorCitpbnQgQ29ubmVjdGlvbjo6c2FmZVNlbmQoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoX2ZkID09IC0xIHx8IF9oYWRTZW5kRXJyb3IgfHwgX3NodXRkb3duKSB7CisgICAgICAgIC8vIElnbm9yZSBmdXJ0aGVyIHdyaXRlcyB0byB0aGUgc29ja2V0LCBpdCdzIGFscmVhZHkgY2xvc2VkIG9yIGhhcyBiZWVuIHNodXRkb3duCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IHNlbmRSZXN1bHQgPSA6OnNlbmQoX2ZkLCBkYXRhLCBzaXplLCBNU0dfTk9TSUdOQUwpOworICAgIGlmIChzZW5kUmVzdWx0ID09IC0xKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgIC8vIFRyZWF0IHRoaXMgYXMgaWYgemVybyBieXRlcyB3ZXJlIHdyaXR0ZW4uCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBMU19XQVJOSU5HKF9sb2dnZXIsICJVbmFibGUgdG8gd3JpdGUgdG8gc29ja2V0IDogIiA8PCBnZXRMYXN0RXJyb3IoKSA8PCAiIC0gZGlzYWJsaW5nIGZ1cnRoZXIgd3JpdGVzIik7CisgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfYnl0ZXNTZW50ICs9IHNlbmRSZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBzZW5kUmVzdWx0OworfQorCitib29sIENvbm5lY3Rpb246OndyaXRlKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCBib29sIGZsdXNoSXQpIHsKKyAgICBpZiAoY2xvc2VkKCkgfHwgX2Nsb3NlT25FbXB0eSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzaXplKSB7CisgICAgICAgIGludCBieXRlc1NlbnQgPSAwOworICAgICAgICBpZiAoX291dEJ1Zi5lbXB0eSgpICYmIGZsdXNoSXQpIHsKKyAgICAgICAgICAgIC8vIEF0dGVtcHQgZmFzdCBwYXRoLCBzZW5kIGRpcmVjdGx5LgorICAgICAgICAgICAgYnl0ZXNTZW50ID0gc2FmZVNlbmQoZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAoYnl0ZXNTZW50ID09IHN0YXRpY19jYXN0PGludD4oc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBzZW50IGRpcmVjdGx5LgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ5dGVzU2VudCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzaXplX3QgYnl0ZXNUb0J1ZmZlciA9IHNpemUgLSBieXRlc1NlbnQ7CisgICAgICAgIHNpemVfdCBlbmRPZkJ1ZmZlciA9IF9vdXRCdWYuc2l6ZSgpOworICAgICAgICBzaXplX3QgbmV3QnVmZmVyU2l6ZSA9IGVuZE9mQnVmZmVyICsgYnl0ZXNUb0J1ZmZlcjsKKyAgICAgICAgaWYgKG5ld0J1ZmZlclNpemUgPj0gTWF4QnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgTFNfV0FSTklORyhfbG9nZ2VyLCAiQ2xvc2luZyBjb25uZWN0aW9uOiBidWZmZXIgc2l6ZSB0b28gbGFyZ2UgKCIgCisgICAgICAgICAgICAgICAgICAgIDw8IG5ld0J1ZmZlclNpemUgPDwgIiA+PSAiIDw8IE1heEJ1ZmZlclNpemUgPDwgIikiKTsKKyAgICAgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfb3V0QnVmLnJlc2l6ZShuZXdCdWZmZXJTaXplKTsKKyAgICAgICAgbWVtY3B5KCZfb3V0QnVmW2VuZE9mQnVmZmVyXSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSkgKyBieXRlc1NlbnQsIGJ5dGVzVG9CdWZmZXIpOworICAgIH0KKyAgICBpZiAoZmx1c2hJdCkgeworICAgICAgICByZXR1cm4gZmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29ubmVjdGlvbjo6YnVmZmVyTGluZShjb25zdCBjaGFyKiBsaW5lKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgY3JsZltdID0geyAnXHInLCAnXG4nIH07CisgICAgaWYgKCF3cml0ZShsaW5lLCBzdHJsZW4obGluZSksIGZhbHNlKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB3cml0ZShjcmxmLCAyLCBmYWxzZSk7Cit9CisKK2Jvb2wgQ29ubmVjdGlvbjo6YnVmZmVyTGluZShjb25zdCBzdGQ6OnN0cmluZyYgbGluZSkgeworICAgIHN0ZDo6c3RyaW5nIGxpbmVBbmRDcmxmID0gbGluZSArICJcclxuIjsKKyAgICByZXR1cm4gd3JpdGUobGluZUFuZENybGYuY19zdHIoKSwgbGluZUFuZENybGYubGVuZ3RoKCksIGZhbHNlKTsKK30KKwordm9pZCBDb25uZWN0aW9uOjpoYW5kbGVEYXRhUmVhZHlGb3JSZWFkKCkgeworICAgIGlmIChjbG9zZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBjdXJTaXplID0gX2luQnVmLnNpemUoKTsKKyAgICBfaW5CdWYucmVzaXplKGN1clNpemUgKyBSZWFkV3JpdGVCdWZmZXJTaXplKTsKKyAgICBpbnQgcmVzdWx0ID0gOjpyZWFkKF9mZCwgJl9pbkJ1ZltjdXJTaXplXSwgUmVhZFdyaXRlQnVmZmVyU2l6ZSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBMU19XQVJOSU5HKF9sb2dnZXIsICJVbmFibGUgdG8gcmVhZCBmcm9tIHNvY2tldCA6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICBMU19ERUJVRyhfbG9nZ2VyLCAiUmVtb3RlIGVuZCBjbG9zZWQgY29ubmVjdGlvbiIpOworICAgICAgICBjbG9zZUludGVybmFsKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX2J5dGVzUmVjZWl2ZWQgKz0gcmVzdWx0OworICAgIF9pbkJ1Zi5yZXNpemUoY3VyU2l6ZSArIHJlc3VsdCk7CisgICAgaGFuZGxlTmV3RGF0YSgpOworfQorCit2b2lkIENvbm5lY3Rpb246OmhhbmRsZURhdGFSZWFkeUZvcldyaXRlKCkgeworICAgIGlmIChjbG9zZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZsdXNoKCk7Cit9CisKK2Jvb2wgQ29ubmVjdGlvbjo6Zmx1c2goKSB7CisgICAgaWYgKF9vdXRCdWYuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IG51bVNlbnQgPSBzYWZlU2VuZCgmX291dEJ1ZlswXSwgX291dEJ1Zi5zaXplKCkpOworICAgIGlmIChudW1TZW50ID09IC0xKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgX291dEJ1Zi5lcmFzZShfb3V0QnVmLmJlZ2luKCksIF9vdXRCdWYuYmVnaW4oKSArIG51bVNlbnQpOworICAgIGlmIChfb3V0QnVmLnNpemUoKSA+IDAgJiYgIV9yZWdpc3RlcmVkRm9yV3JpdGVFdmVudHMpIHsKKyAgICAgICAgaWYgKCFfc2VydmVyLnN1YnNjcmliZVRvV3JpdGVFdmVudHModGhpcykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfcmVnaXN0ZXJlZEZvcldyaXRlRXZlbnRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKF9vdXRCdWYuZW1wdHkoKSAmJiBfcmVnaXN0ZXJlZEZvcldyaXRlRXZlbnRzKSB7CisgICAgICAgIGlmICghX3NlcnZlci51bnN1YnNjcmliZUZyb21Xcml0ZUV2ZW50cyh0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9yZWdpc3RlcmVkRm9yV3JpdGVFdmVudHMgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKF9vdXRCdWYuZW1wdHkoKSAmJiAhY2xvc2VkKCkgJiYgX2Nsb3NlT25FbXB0eSkgeworICAgICAgICBMU19ERUJVRyhfbG9nZ2VyLCAiUmVhZHkgZm9yIGNsb3NlLCBub3cgZW1wdHkiKTsKKyAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb25uZWN0aW9uOjpjbG9zZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9mZCA9PSAtMSB8fCBfc2h1dGRvd247Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6aGFuZGxlTmV3RGF0YSgpIHsKKyAgICBzd2l0Y2ggKF9zdGF0ZSkgeworICAgIGNhc2UgUkVBRElOR19IRUFERVJTOgorICAgICAgICBoYW5kbGVIZWFkZXJzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkVBRElOR19XRUJTT0NLRVRfS0VZMzoKKyAgICAgICAgaGFuZGxlV2ViU29ja2V0S2V5MygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhBTkRMSU5HX0hJWElFX1dFQlNPQ0tFVDoKKyAgICAgICAgaGFuZGxlSGl4aWVXZWJTb2NrZXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIQU5ETElOR19IWUJJX1dFQlNPQ0tFVDoKKyAgICAgICAgaGFuZGxlSHliaVdlYlNvY2tldCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJVRkZFUklOR19QT1NUX0RBVEE6CisgICAgICAgIGhhbmRsZUJ1ZmZlcmluZ1Bvc3REYXRhKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjpoYW5kbGVIZWFkZXJzKCkgeworICAgIGlmIChfaW5CdWYuc2l6ZSgpIDwgNCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IF9pbkJ1Zi5zaXplKCkgLSA0OyArK2kpIHsKKyAgICAgICAgaWYgKF9pbkJ1ZltpXSA9PSAnXHInICYmCisgICAgICAgICAgICBfaW5CdWZbaSsxXSA9PSAnXG4nICYmCisgICAgICAgICAgICBfaW5CdWZbaSsyXSA9PSAnXHInICYmCisgICAgICAgICAgICBfaW5CdWZbaSszXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBpZiAoIXByb2Nlc3NIZWFkZXJzKCZfaW5CdWZbMF0sICZfaW5CdWZbaSArIDJdKSkgeworICAgICAgICAgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaW5CdWYuZXJhc2UoX2luQnVmLmJlZ2luKCksIF9pbkJ1Zi5iZWdpbigpICsgaSArIDQpOworICAgICAgICAgICAgaGFuZGxlTmV3RGF0YSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChfaW5CdWYuc2l6ZSgpID4gTWF4SGVhZGVyc1NpemUpIHsKKyAgICAgICAgc2VuZFVuc3VwcG9ydGVkRXJyb3IoIkhlYWRlcnMgdG9vIGJpZyIpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjpoYW5kbGVXZWJTb2NrZXRLZXkzKCkgeworICAgIGNvbnN0ZXhwciBhdXRvIFdlYlNvY2tldEtleUxlbiA9IDh1OworICAgIGlmIChfaW5CdWYuc2l6ZSgpIDwgV2ViU29ja2V0S2V5TGVuKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCBrZXkxOworICAgICAgICB1aW50MzJfdCBrZXkyOworICAgICAgICBjaGFyIGtleTNbV2ViU29ja2V0S2V5TGVuXTsKKyAgICB9IG1kNVNvdXJjZTsKKworICAgIGF1dG8ga2V5MSA9IHBhcnNlV2ViU29ja2V0S2V5KF9yZXF1ZXN0LT5nZXRIZWFkZXIoIlNlYy1XZWJTb2NrZXQtS2V5MSIpKTsKKyAgICBhdXRvIGtleTIgPSBwYXJzZVdlYlNvY2tldEtleShfcmVxdWVzdC0+Z2V0SGVhZGVyKCJTZWMtV2ViU29ja2V0LUtleTIiKSk7CisKKyAgICBMU19ERUJVRyhfbG9nZ2VyLCAiR290IGEgaGl4aWUgd2Vic29ja2V0IHdpdGgga2V5MT0weCIgPDwgc3RkOjpoZXggPDwga2V5MSA8PCAiLCBrZXkyPTB4IiA8PCBrZXkyKTsKKworICAgIG1kNVNvdXJjZS5rZXkxID0gaHRvbmwoa2V5MSk7CisgICAgbWQ1U291cmNlLmtleTIgPSBodG9ubChrZXkyKTsKKyAgICBtZW1jcHkoJm1kNVNvdXJjZS5rZXkzLCAmX2luQnVmWzBdLCBXZWJTb2NrZXRLZXlMZW4pOworCisgICAgdWludDhfdCBkaWdlc3RbMTZdOworICAgIG1kNV9zdGF0ZV90IG1kNXN0YXRlOworICAgIG1kNV9pbml0KCZtZDVzdGF0ZSk7CisgICAgbWQ1X2FwcGVuZCgmbWQ1c3RhdGUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZtZDVTb3VyY2UpLCBzaXplb2YobWQ1U291cmNlKSk7CisgICAgbWQ1X2ZpbmlzaCgmbWQ1c3RhdGUsIGRpZ2VzdCk7CisKKyAgICBMU19ERUJVRyhfbG9nZ2VyLCAiQXR0ZW1wdGluZyB3ZWJzb2NrZXQgdXBncmFkZSIpOworCisgICAgYnVmZmVyUmVzcG9uc2VBbmRDb21tb25IZWFkZXJzKFJlc3BvbnNlQ29kZTo6V2ViU29ja2V0UHJvdG9jb2xIYW5kc2hha2UpOworICAgIGJ1ZmZlckxpbmUoIlVwZ3JhZGU6IHdlYnNvY2tldCIpOworICAgIGJ1ZmZlckxpbmUoIkNvbm5lY3Rpb246IFVwZ3JhZGUiKTsKKyAgICBib29sIGFsbG93Q3Jvc3NPcmlnaW4gPSBfc2VydmVyLmlzQ3Jvc3NPcmlnaW5BbGxvd2VkKF9yZXF1ZXN0LT5nZXRSZXF1ZXN0VXJpKCkpOworICAgIGlmIChfcmVxdWVzdC0+aGFzSGVhZGVyKCJPcmlnaW4iKSAmJiBhbGxvd0Nyb3NzT3JpZ2luKSB7CisgICAgICAgIGJ1ZmZlckxpbmUoIlNlYy1XZWJTb2NrZXQtT3JpZ2luOiAiICsgIF9yZXF1ZXN0LT5nZXRIZWFkZXIoIk9yaWdpbiIpKTsKKyAgICB9CisgICAgaWYgKF9yZXF1ZXN0LT5oYXNIZWFkZXIoIkhvc3QiKSkgeworICAgICAgICBhdXRvIGhvc3QgPSBfcmVxdWVzdC0+Z2V0SGVhZGVyKCJIb3N0Iik7CisgICAgICAgIGlmICghYWxsb3dDcm9zc09yaWdpbikgeworICAgICAgICAgICAgYnVmZmVyTGluZSgiU2VjLVdlYlNvY2tldC1PcmlnaW46IGh0dHA6Ly8iICsgaG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyTGluZSgiU2VjLVdlYlNvY2tldC1Mb2NhdGlvbjogd3M6Ly8iICsgaG9zdCArIF9yZXF1ZXN0LT5nZXRSZXF1ZXN0VXJpKCkpOworICAgIH0KKyAgICBidWZmZXJMaW5lKCIiKTsKKworICAgIHdyaXRlKCZkaWdlc3QsIDE2LCB0cnVlKTsKKworICAgIF9zdGF0ZSA9IEhBTkRMSU5HX0hJWElFX1dFQlNPQ0tFVDsKKyAgICBfaW5CdWYuZXJhc2UoX2luQnVmLmJlZ2luKCksIF9pbkJ1Zi5iZWdpbigpICsgOCk7CisgICAgaWYgKF93ZWJTb2NrZXRIYW5kbGVyKSB7CisgICAgICAgIF93ZWJTb2NrZXRIYW5kbGVyLT5vbkNvbm5lY3QodGhpcyk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb246OmhhbmRsZUJ1ZmZlcmluZ1Bvc3REYXRhKCkgeworICAgIGlmIChfcmVxdWVzdC0+Y29uc3VtZUNvbnRlbnQoX2luQnVmKSkgeworICAgICAgICBfc3RhdGUgPSBSRUFESU5HX0hFQURFUlM7CisgICAgICAgIGlmICghaGFuZGxlUGFnZVJlcXVlc3QoKSkgeworICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb246OnNlbmQoY29uc3QgY2hhciogd2ViU29ja2V0UmVzcG9uc2UpIHsKKyAgICBfc2VydmVyLmNoZWNrVGhyZWFkKCk7CisgICAgaWYgKF9zaHV0ZG93bikgeworICAgICAgICBpZiAoX3NodXRkb3duQnlVc2VyKSB7CisgICAgICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiU2VydmVyIHdyb3RlIHRvIGNvbm5lY3Rpb24gYWZ0ZXIgY2xvc2luZyBpdCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBtZXNzYWdlTGVuZ3RoID0gc3RybGVuKHdlYlNvY2tldFJlc3BvbnNlKTsKKyAgICBpZiAoX3N0YXRlID09IEhBTkRMSU5HX0hJWElFX1dFQlNPQ0tFVCkgeworICAgICAgICB1aW50OF90IHplcm8gPSAwOworICAgICAgICBpZiAoIXdyaXRlKCZ6ZXJvLCAxLCBmYWxzZSkpIHJldHVybjsKKyAgICAgICAgaWYgKCF3cml0ZSh3ZWJTb2NrZXRSZXNwb25zZSwgbWVzc2FnZUxlbmd0aCwgZmFsc2UpKSByZXR1cm47CisgICAgICAgIHVpbnQ4X3QgZWZmZWZmID0gMHhmZjsKKyAgICAgICAgd3JpdGUoJmVmZmVmZiwgMSwgdHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2VuZEh5YmkoSHliaVBhY2tldERlY29kZXI6Ok9QQ09ERV9URVhULCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih3ZWJTb2NrZXRSZXNwb25zZSksIG1lc3NhZ2VMZW5ndGgpOworfQorCit2b2lkIENvbm5lY3Rpb246OnNlbmQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgeworICAgIF9zZXJ2ZXIuY2hlY2tUaHJlYWQoKTsKKyAgICBpZiAoX3NodXRkb3duKSB7CisgICAgICAgIGlmIChfc2h1dGRvd25CeVVzZXIpIHsKKyAgICAgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJDbGllbnQgd3JvdGUgdG8gY29ubmVjdGlvbiBhZnRlciBjbG9zaW5nIGl0Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoX3N0YXRlID09IEhBTkRMSU5HX0hJWElFX1dFQlNPQ0tFVCkgeworICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiSGl4aWUgZG9lcyBub3Qgc3VwcG9ydCBiaW5hcnkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZW5kSHliaShIeWJpUGFja2V0RGVjb2Rlcjo6T1BDT0RFX0JJTkFSWSwgZGF0YSwgbGVuZ3RoKTsKK30KKwordm9pZCBDb25uZWN0aW9uOjpzZW5kSHliaShpbnQgb3Bjb2RlLCBjb25zdCB1aW50OF90KiB3ZWJTb2NrZXRSZXNwb25zZSwgc2l6ZV90IG1lc3NhZ2VMZW5ndGgpIHsKKyAgICB1aW50OF90IGZpcnN0Qnl0ZSA9IDB4ODAgfCBvcGNvZGU7CisgICAgaWYgKCF3cml0ZSgmZmlyc3RCeXRlLCAxLCBmYWxzZSkpIHJldHVybjsKKyAgICBpZiAobWVzc2FnZUxlbmd0aCA8IDEyNikgeworICAgICAgICB1aW50OF90IG5leHRCeXRlID0gbWVzc2FnZUxlbmd0aDsgLy8gTm8gTUFTSyBiaXQgc2V0LgorICAgICAgICBpZiAoIXdyaXRlKCZuZXh0Qnl0ZSwgMSwgZmFsc2UpKSByZXR1cm47CisgICAgfSBlbHNlIGlmIChtZXNzYWdlTGVuZ3RoIDwgNjU1MzYpIHsKKyAgICAgICAgdWludDhfdCBuZXh0Qnl0ZSA9IDEyNjsgLy8gTm8gTUFTSyBiaXQgc2V0LgorICAgICAgICBpZiAoIXdyaXRlKCZuZXh0Qnl0ZSwgMSwgZmFsc2UpKSByZXR1cm47CisgICAgICAgIGF1dG8gbGVuZ3RoQnl0ZXMgPSBodG9ucyhtZXNzYWdlTGVuZ3RoKTsKKyAgICAgICAgaWYgKCF3cml0ZSgmbGVuZ3RoQnl0ZXMsIDIsIGZhbHNlKSkgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ4X3QgbmV4dEJ5dGUgPSAxMjc7IC8vIE5vIE1BU0sgYml0IHNldC4KKyAgICAgICAgaWYgKCF3cml0ZSgmbmV4dEJ5dGUsIDEsIGZhbHNlKSkgcmV0dXJuOworICAgICAgICB1aW50NjRfdCBsZW5ndGhCeXRlcyA9IF9fYnN3YXBfNjQobWVzc2FnZUxlbmd0aCk7CisgICAgICAgIGlmICghd3JpdGUoJmxlbmd0aEJ5dGVzLCA4LCBmYWxzZSkpIHJldHVybjsKKyAgICB9CisgICAgd3JpdGUod2ViU29ja2V0UmVzcG9uc2UsIG1lc3NhZ2VMZW5ndGgsIHRydWUpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Q3JlZGVudGlhbHM+IENvbm5lY3Rpb246OmNyZWRlbnRpYWxzKCkgY29uc3QgeworICAgIF9zZXJ2ZXIuY2hlY2tUaHJlYWQoKTsKKyAgICByZXR1cm4gX3JlcXVlc3QgPyBfcmVxdWVzdC0+Y3JlZGVudGlhbHMoKSA6IHN0ZDo6c2hhcmVkX3B0cjxDcmVkZW50aWFscz4oKTsKK30KKwordm9pZCBDb25uZWN0aW9uOjpoYW5kbGVIaXhpZVdlYlNvY2tldCgpIHsKKyAgICBpZiAoX2luQnVmLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgbWVzc2FnZVN0YXJ0ID0gMDsKKyAgICB3aGlsZSAobWVzc2FnZVN0YXJ0IDwgX2luQnVmLnNpemUoKSkgeworICAgICAgICBpZiAoX2luQnVmW21lc3NhZ2VTdGFydF0gIT0gMCkgeworICAgICAgICAgICAgTFNfV0FSTklORyhfbG9nZ2VyLCAiRXJyb3IgaW4gV2ViU29ja2V0IGlucHV0IHN0cmVhbSAoZ290ICIgPDwgKGludClfaW5CdWZbbWVzc2FnZVN0YXJ0XSA8PCAiKSIpOworICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IFVURi04CisgICAgICAgIHNpemVfdCBlbmRPZk1lc3NhZ2UgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gbWVzc2FnZVN0YXJ0ICsgMTsgaSA8IF9pbkJ1Zi5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKF9pbkJ1ZltpXSA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgZW5kT2ZNZXNzYWdlID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZW5kT2ZNZXNzYWdlICE9IDApIHsKKyAgICAgICAgICAgIF9pbkJ1ZltlbmRPZk1lc3NhZ2VdID0gMDsKKyAgICAgICAgICAgIGhhbmRsZVdlYlNvY2tldFRleHRNZXNzYWdlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZfaW5CdWZbbWVzc2FnZVN0YXJ0ICsgMV0pKTsKKyAgICAgICAgICAgIG1lc3NhZ2VTdGFydCA9IGVuZE9mTWVzc2FnZSArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobWVzc2FnZVN0YXJ0ICE9IDApIHsKKyAgICAgICAgX2luQnVmLmVyYXNlKF9pbkJ1Zi5iZWdpbigpLCBfaW5CdWYuYmVnaW4oKSArIG1lc3NhZ2VTdGFydCk7CisgICAgfQorICAgIGlmIChfaW5CdWYuc2l6ZSgpID4gTWF4V2Vic29ja2V0TWVzc2FnZVNpemUpIHsKKyAgICAgICAgTFNfV0FSTklORyhfbG9nZ2VyLCAiV2ViU29ja2V0IG1lc3NhZ2UgdG9vIGxvbmciKTsKKyAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjpoYW5kbGVIeWJpV2ViU29ja2V0KCkgeworICAgIGlmIChfaW5CdWYuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEh5YmlQYWNrZXREZWNvZGVyIGRlY29kZXIoKl9sb2dnZXIsIF9pbkJ1Zik7CisgICAgYm9vbCBkb25lID0gZmFsc2U7CisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWRNZXNzYWdlOworICAgICAgICBzd2l0Y2ggKGRlY29kZXIuZGVjb2RlTmV4dE1lc3NhZ2UoZGVjb2RlZE1lc3NhZ2UpKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7CisgICAgICAgICAgICBMU19XQVJOSU5HKF9sb2dnZXIsICJVbmtub3duIEh5YmlQYWNrZXREZWNvZGVyIHN0YXRlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgSHliaVBhY2tldERlY29kZXI6OkVycm9yOgorICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIEh5YmlQYWNrZXREZWNvZGVyOjpUZXh0TWVzc2FnZToKKyAgICAgICAgICAgIGRlY29kZWRNZXNzYWdlLnB1c2hfYmFjaygwKTsgIC8vIGF2b2lkcyBhIGNvcHkKKyAgICAgICAgICAgIGhhbmRsZVdlYlNvY2tldFRleHRNZXNzYWdlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZkZWNvZGVkTWVzc2FnZVswXSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSHliaVBhY2tldERlY29kZXI6OkJpbmFyeU1lc3NhZ2U6CisgICAgICAgICAgICBoYW5kbGVXZWJTb2NrZXRCaW5hcnlNZXNzYWdlKGRlY29kZWRNZXNzYWdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEh5YmlQYWNrZXREZWNvZGVyOjpQaW5nOgorICAgICAgICAgICAgc2VuZEh5YmkoSHliaVBhY2tldERlY29kZXI6Ok9QQ09ERV9QT05HLCAmZGVjb2RlZE1lc3NhZ2VbMF0sIGRlY29kZWRNZXNzYWdlLnNpemUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIeWJpUGFja2V0RGVjb2Rlcjo6Tm9NZXNzYWdlOgorICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIeWJpUGFja2V0RGVjb2Rlcjo6Q2xvc2U6CisgICAgICAgICAgICBMU19ERUJVRyhfbG9nZ2VyLCAiUmVjZWl2ZWQgV2ViU29ja2V0IGNsb3NlIik7CisgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlY29kZXIubnVtQnl0ZXNEZWNvZGVkKCkgIT0gMCkgeworICAgICAgICBfaW5CdWYuZXJhc2UoX2luQnVmLmJlZ2luKCksIF9pbkJ1Zi5iZWdpbigpICsgZGVjb2Rlci5udW1CeXRlc0RlY29kZWQoKSk7CisgICAgfQorICAgIGlmIChfaW5CdWYuc2l6ZSgpID4gTWF4V2Vic29ja2V0TWVzc2FnZVNpemUpIHsKKyAgICAgICAgTFNfV0FSTklORyhfbG9nZ2VyLCAiV2ViU29ja2V0IG1lc3NhZ2UgdG9vIGxvbmciKTsKKyAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjpoYW5kbGVXZWJTb2NrZXRUZXh0TWVzc2FnZShjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgICAgTFNfREVCVUcoX2xvZ2dlciwgIkdvdCB0ZXh0IHdlYiBzb2NrZXQgbWVzc2FnZTogJyIgPDwgbWVzc2FnZSA8PCAiJyIpOworICAgIGlmIChfd2ViU29ja2V0SGFuZGxlcikgeworICAgICAgICBfd2ViU29ja2V0SGFuZGxlci0+b25EYXRhKHRoaXMsIG1lc3NhZ2UpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjpoYW5kbGVXZWJTb2NrZXRCaW5hcnlNZXNzYWdlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlKSB7CisgICAgTFNfREVCVUcoX2xvZ2dlciwgIkdvdCBiaW5hcnkgd2ViIHNvY2tldCBtZXNzYWdlIChzaXplOiAiIDw8IG1lc3NhZ2Uuc2l6ZSgpIDw8ICIpIik7CisgICAgaWYgKF93ZWJTb2NrZXRIYW5kbGVyKSB7CisgICAgICAgIF93ZWJTb2NrZXRIYW5kbGVyLT5vbkRhdGEodGhpcywgJm1lc3NhZ2VbMF0sIG1lc3NhZ2Uuc2l6ZSgpKTsKKyAgICB9Cit9CisKK2Jvb2wgQ29ubmVjdGlvbjo6c2VuZEVycm9yKFJlc3BvbnNlQ29kZSBlcnJvckNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBib2R5KSB7CisgICAgYXNzZXJ0KF9zdGF0ZSAhPSBIQU5ETElOR19ISVhJRV9XRUJTT0NLRVQpOworICAgIGF1dG8gZXJyb3JOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KGVycm9yQ29kZSk7CisgICAgYXV0byBtZXNzYWdlID0gOjpuYW1lKGVycm9yQ29kZSk7CisgICAgYnVmZmVyUmVzcG9uc2VBbmRDb21tb25IZWFkZXJzKGVycm9yQ29kZSk7CisgICAgYXV0byBlcnJvckNvbnRlbnQgPSBmaW5kRW1iZWRkZWRDb250ZW50KCIvX2Vycm9yLmh0bWwiKTsKKyAgICBzdGQ6OnN0cmluZyBkb2N1bWVudDsKKyAgICBpZiAoZXJyb3JDb250ZW50KSB7CisgICAgICAgIGRvY3VtZW50LmFzc2lnbihlcnJvckNvbnRlbnQtPmRhdGEsIGVycm9yQ29udGVudC0+ZGF0YSArIGVycm9yQ29udGVudC0+bGVuZ3RoKTsKKyAgICAgICAgcmVwbGFjZShkb2N1bWVudCwgIiUlRVJST1JDT0RFJSUiLCB0b1N0cmluZyhlcnJvck51bWJlcikpOworICAgICAgICByZXBsYWNlKGRvY3VtZW50LCAiJSVNRVNTQUdFJSUiLCBtZXNzYWdlKTsKKyAgICAgICAgcmVwbGFjZShkb2N1bWVudCwgIiUlQk9EWSUlIiwgYm9keSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZG9jdW1lbnRTdHI7CisgICAgICAgIGRvY3VtZW50U3RyIDw8ICI8aHRtbD48aGVhZD48dGl0bGU+IiA8PCBlcnJvck51bWJlciA8PCAiIC0gIiA8PCBtZXNzYWdlIDw8ICI8L3RpdGxlPjwvaGVhZD4iCisgICAgICAgICAgICAgICAgPDwgIjxib2R5PjxoMT4iIDw8IGVycm9yTnVtYmVyIDw8ICIgLSAiIDw8IG1lc3NhZ2UgPDwgIjwvaDE+IgorICAgICAgICAgICAgICAgIDw8ICI8ZGl2PiIgPDwgYm9keSA8PCAiPC9kaXY+PGhyLz48ZGl2PjxpPlBvd2VyZWQgYnkgc2Vhc29ja3M8L2k+PC9kaXY+PC9ib2R5PjwvaHRtbD4iOworICAgICAgICBkb2N1bWVudCA9IGRvY3VtZW50U3RyLnN0cigpOworICAgIH0KKyAgICBidWZmZXJMaW5lKCJDb250ZW50LUxlbmd0aDogIiArIHRvU3RyaW5nKGRvY3VtZW50Lmxlbmd0aCgpKSk7CisgICAgYnVmZmVyTGluZSgiQ29ubmVjdGlvbjogY2xvc2UiKTsKKyAgICBidWZmZXJMaW5lKCIiKTsKKyAgICBidWZmZXJMaW5lKGRvY3VtZW50KTsKKyAgICBpZiAoIWZsdXNoKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjbG9zZVdoZW5FbXB0eSgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbm5lY3Rpb246OnNlbmRVbnN1cHBvcnRlZEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pIHsKKyAgICByZXR1cm4gc2VuZEVycm9yKFJlc3BvbnNlQ29kZTo6Tm90SW1wbGVtZW50ZWQsIHJlYXNvbik7Cit9CisKK2Jvb2wgQ29ubmVjdGlvbjo6c2VuZDQwNCgpIHsKKyAgICBhdXRvIHBhdGggPSBnZXRSZXF1ZXN0VXJpKCk7CisgICAgYXV0byBlbWJlZGRlZCA9IGZpbmRFbWJlZGRlZENvbnRlbnQocGF0aCk7CisgICAgaWYgKGVtYmVkZGVkKSB7CisgICAgICAgIHJldHVybiBzZW5kRGF0YShnZXRDb250ZW50VHlwZShwYXRoKSwgZW1iZWRkZWQtPmRhdGEsIGVtYmVkZGVkLT5sZW5ndGgpOworICAgIH0gZWxzZSBpZiAoc3RyY21wKHBhdGguY19zdHIoKSwgIi9fbGl2ZXN0YXRzLmpzIikgPT0gMCkgeworICAgICAgICBhdXRvIHN0YXRzID0gX3NlcnZlci5nZXRTdGF0c0RvY3VtZW50KCk7CisgICAgICAgIHJldHVybiBzZW5kRGF0YSgidGV4dC9qYXZhc2NyaXB0Iiwgc3RhdHMuY19zdHIoKSwgc3RhdHMubGVuZ3RoKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzZW5kRXJyb3IoUmVzcG9uc2VDb2RlOjpOb3RGb3VuZCwgIlVuYWJsZSB0byBmaW5kIHJlc291cmNlIGZvcjogIiArIHBhdGgpOworICAgIH0KK30KKworYm9vbCBDb25uZWN0aW9uOjpzZW5kQmFkUmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKSB7CisgICAgcmV0dXJuIHNlbmRFcnJvcihSZXNwb25zZUNvZGU6OkJhZFJlcXVlc3QsIHJlYXNvbik7Cit9CisKK2Jvb2wgQ29ubmVjdGlvbjo6c2VuZElTRShjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpIHsKKyAgICByZXR1cm4gc2VuZEVycm9yKFJlc3BvbnNlQ29kZTo6SW50ZXJuYWxTZXJ2ZXJFcnJvciwgZXJyb3IpOworfQorCitib29sIENvbm5lY3Rpb246OnByb2Nlc3NIZWFkZXJzKHVpbnQ4X3QqIGZpcnN0LCB1aW50OF90KiBsYXN0KSB7CisgICAgLy8gSWRlYWxseSB3ZSdkIGNvcHkgb2ZmIFtmaXJzdCwgbGFzdF0gbm93IGludG8gYSBoZWFkZXIgc3RydWN0dXJlIGhlcmUuCisgICAgLy8gQmUgY2FyZWZ1bCBhYm91dCBsaWZldGltZXMgdGhvdWdoIGFuZCBtdWx0aXBsZSByZXF1ZXN0cyBjb21pbmcgaW4sIHNob3VsZAorICAgIC8vIHdlIGV2ZXIgc3VwcG9ydCBIVFRQIHBpcGVsaW5pbmcgYW5kL29yIGxvbmctbGl2ZWQgcmVxdWVzdHMuCisgICAgY2hhciogcmVxdWVzdExpbmUgPSBleHRyYWN0TGluZShmaXJzdCwgbGFzdCk7CisgICAgYXNzZXJ0KHJlcXVlc3RMaW5lICE9IE5VTEwpOworCisgICAgTFNfQUNDRVNTKF9sb2dnZXIsICJSZXF1ZXN0OiAiIDw8IHJlcXVlc3RMaW5lKTsKKworICAgIGNvbnN0IGNoYXIqIHZlcmJUZXh0ID0gc2hpZnQocmVxdWVzdExpbmUpOworICAgIGlmICghdmVyYlRleHQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRCYWRSZXF1ZXN0KCJNYWxmb3JtZWQgcmVxdWVzdCBsaW5lIik7CisgICAgfQorICAgIGF1dG8gdmVyYiA9IFJlcXVlc3Q6OnZlcmIodmVyYlRleHQpOworICAgIGlmICh2ZXJiID09IFJlcXVlc3Q6OlZlcmI6OkludmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRCYWRSZXF1ZXN0KCJNYWxmb3JtZWQgcmVxdWVzdCBsaW5lIik7CisgICAgfQorICAgIGNvbnN0IGNoYXIqIHJlcXVlc3RVcmkgPSBzaGlmdChyZXF1ZXN0TGluZSk7CisgICAgaWYgKHJlcXVlc3RVcmkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc2VuZEJhZFJlcXVlc3QoIk1hbGZvcm1lZCByZXF1ZXN0IGxpbmUiKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBodHRwVmVyc2lvbiA9IHNoaWZ0KHJlcXVlc3RMaW5lKTsKKyAgICBpZiAoaHR0cFZlcnNpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc2VuZEJhZFJlcXVlc3QoIk1hbGZvcm1lZCByZXF1ZXN0IGxpbmUiKTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChodHRwVmVyc2lvbiwgIkhUVFAvMS4xIikgIT0gMCkgeworICAgICAgICByZXR1cm4gc2VuZFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIEhUVFAgdmVyc2lvbiIpOworICAgIH0KKyAgICBpZiAoKnJlcXVlc3RMaW5lICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHNlbmRCYWRSZXF1ZXN0KCJUcmFpbGluZyBjcmFwIGFmdGVyIGh0dHAgdmVyc2lvbiIpOworICAgIH0KKworICAgIEhlYWRlck1hcCBoZWFkZXJzKDMxKTsKKyAgICB3aGlsZSAoZmlyc3QgPCBsYXN0KSB7CisgICAgICAgIGNoYXIqIGNvbG9uUG9zID0gTlVMTDsKKyAgICAgICAgY2hhciogaGVhZGVyTGluZSA9IGV4dHJhY3RMaW5lKGZpcnN0LCBsYXN0LCAmY29sb25Qb3MpOworICAgICAgICBhc3NlcnQoaGVhZGVyTGluZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBzZW5kQmFkUmVxdWVzdCgiTWFsZm9ybWVkIGhlYWRlciIpOworICAgICAgICB9CisgICAgICAgICpjb2xvblBvcyA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIqIGtleSA9IGhlYWRlckxpbmU7CisgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gc2tpcFdoaXRlc3BhY2UoY29sb25Qb3MgKyAxKTsKKyAgICAgICAgTFNfREVCVUcoX2xvZ2dlciwgIktleTogIiA8PCBrZXkgPDwgIiB8fCAiIDw8IHZhbHVlKTsKKyNpZiBIQVZFX1VOT1JERVJFRF9NQVBfRU1QTEFDRQorICAgICAgICBoZWFkZXJzLmVtcGxhY2Uoa2V5LCB2YWx1ZSk7CisjZWxzZQorICAgICAgICBoZWFkZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoaGVhZGVycy5jb3VudCgiQ29ubmVjdGlvbiIpICYmIGhlYWRlcnMuY291bnQoIlVwZ3JhZGUiKQorICAgICAgICAgICAgJiYgaGFzQ29ubmVjdGlvblR5cGUoaGVhZGVyc1siQ29ubmVjdGlvbiJdLCAiVXBncmFkZSIpCisgICAgICAgICAgICAmJiBjYXNlSW5zZW5zaXRpdmVTYW1lKGhlYWRlcnNbIlVwZ3JhZGUiXSwgIndlYnNvY2tldCIpKSB7CisgICAgICAgIExTX0lORk8oX2xvZ2dlciwgIldlYnNvY2tldCByZXF1ZXN0IGZvciAiIDw8IHJlcXVlc3RVcmkgPDwgIiciKTsKKyAgICAgICAgaWYgKHZlcmIgIT0gUmVxdWVzdDo6VmVyYjo6R2V0KSB7CisgICAgICAgICAgICByZXR1cm4gc2VuZEJhZFJlcXVlc3QoIk5vbi1HRVQgV2ViU29ja2V0IHJlcXVlc3QiKTsKKyAgICAgICAgfQorICAgICAgICBfd2ViU29ja2V0SGFuZGxlciA9IF9zZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcihyZXF1ZXN0VXJpKTsKKyAgICAgICAgaWYgKCFfd2ViU29ja2V0SGFuZGxlcikgeworICAgICAgICAgICAgTFNfV0FSTklORyhfbG9nZ2VyLCAiQ291bGRuJ3QgZmluZCBXZWJTb2NrZXQgZW5kIHBvaW50IGZvciAnIiA8PCByZXF1ZXN0VXJpIDw8ICInIik7CisgICAgICAgICAgICByZXR1cm4gc2VuZDQwNCgpOworICAgICAgICB9CisgICAgICAgIHZlcmIgPSBSZXF1ZXN0OjpWZXJiOjpXZWJTb2NrZXQ7CisgICAgfQorCisgICAgX3JlcXVlc3QucmVzZXQobmV3IFBhZ2VSZXF1ZXN0KF9hZGRyZXNzLCByZXF1ZXN0VXJpLCB2ZXJiLCBzdGQ6Om1vdmUoaGVhZGVycykpKTsKKworICAgIGNvbnN0IEVtYmVkZGVkQ29udGVudCAqZW1iZWRkZWQgPSBmaW5kRW1iZWRkZWRDb250ZW50KHJlcXVlc3RVcmkpOworICAgIGlmICh2ZXJiID09IFJlcXVlc3Q6OlZlcmI6OkdldCAmJiBlbWJlZGRlZCkgeworICAgICAgICAvLyBNUkc6IG9uZSBkYXksIHRoaXMgY291bGQgYmUgYSByZXF1ZXN0IGhhbmRsZXIuCisgICAgICAgIHJldHVybiBzZW5kRGF0YShnZXRDb250ZW50VHlwZShyZXF1ZXN0VXJpKSwgZW1iZWRkZWQtPmRhdGEsIGVtYmVkZGVkLT5sZW5ndGgpOworICAgIH0KKworICAgIGlmIChfcmVxdWVzdC0+Y29udGVudExlbmd0aCgpID4gTWF4QnVmZmVyU2l6ZSkgeworICAgICAgICByZXR1cm4gc2VuZEJhZFJlcXVlc3QoIkNvbnRlbnQgbGVuZ3RoIHRvbyBsb25nIik7CisgICAgfQorICAgIGlmIChfcmVxdWVzdC0+Y29udGVudExlbmd0aCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZVBhZ2VSZXF1ZXN0KCk7CisgICAgfQorICAgIF9zdGF0ZSA9IEJVRkZFUklOR19QT1NUX0RBVEE7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29ubmVjdGlvbjo6aGFuZGxlUGFnZVJlcXVlc3QoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiByZXNwb25zZTsKKyAgICB0cnkgeworICAgICAgICByZXNwb25zZSA9IF9zZXJ2ZXIuaGFuZGxlKCpfcmVxdWVzdCk7CisgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgInBhZ2UgZXJyb3I6ICIgPDwgZS53aGF0KCkpOworICAgICAgICByZXR1cm4gc2VuZElTRShlLndoYXQoKSk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJwYWdlIGVycm9yOiAodW5rbm93bikiKTsKKyAgICAgICAgcmV0dXJuIHNlbmRJU0UoIih1bmtub3duKSIpOworICAgIH0KKyAgICBhdXRvIHVyaSA9IF9yZXF1ZXN0LT5nZXRSZXF1ZXN0VXJpKCk7CisgICAgaWYgKCFyZXNwb25zZSAmJiBfcmVxdWVzdC0+dmVyYigpID09IFJlcXVlc3Q6OlZlcmI6OldlYlNvY2tldCkgeworICAgICAgICBfd2ViU29ja2V0SGFuZGxlciA9IF9zZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcih1cmkuY19zdHIoKSk7CisgICAgICAgIGF1dG8gd2ViU29ja2V0VmVyc2lvbiA9IGF0b2koX3JlcXVlc3QtPmdldEhlYWRlcigiU2VjLVdlYlNvY2tldC1WZXJzaW9uIikuY19zdHIoKSk7CisgICAgICAgIGlmICghX3dlYlNvY2tldEhhbmRsZXIpIHsKKyAgICAgICAgICAgIExTX1dBUk5JTkcoX2xvZ2dlciwgIkNvdWxkbid0IGZpbmQgV2ViU29ja2V0IGVuZCBwb2ludCBmb3IgJyIgPDwgdXJpIDw8ICInIik7CisgICAgICAgICAgICByZXR1cm4gc2VuZDQwNCgpOworICAgICAgICB9CisgICAgICAgIGlmICh3ZWJTb2NrZXRWZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgIC8vIEhpeGllCisgICAgICAgICAgICBfc3RhdGUgPSBSRUFESU5HX1dFQlNPQ0tFVF9LRVkzOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBoeWJpS2V5ID0gX3JlcXVlc3QtPmdldEhlYWRlcigiU2VjLVdlYlNvY2tldC1LZXkiKTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZUh5YmlIYW5kc2hha2Uod2ViU29ja2V0VmVyc2lvbiwgaHliaUtleSk7CisgICAgfQorICAgIHJldHVybiBzZW5kUmVzcG9uc2UocmVzcG9uc2UpOworfQorCitib29sIENvbm5lY3Rpb246OnNlbmRSZXNwb25zZShzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IHJlc3BvbnNlKSB7CisgICAgY29uc3QgYXV0byByZXF1ZXN0VXJpID0gX3JlcXVlc3QtPmdldFJlcXVlc3RVcmkoKTsKKyAgICBpZiAocmVzcG9uc2UgPT0gUmVzcG9uc2U6OnVuaGFuZGxlZCgpKSB7CisgICAgICAgIHJldHVybiBzZW5kU3RhdGljRGF0YSgpOworICAgIH0KKyAgICBpZiAocmVzcG9uc2UtPnJlc3BvbnNlQ29kZSgpID09IFJlc3BvbnNlQ29kZTo6Tm90Rm91bmQpIHsKKyAgICAgICAgLy8gVE9ETzogYmV0dGVyIGhlcmU7IHdlIHVzZSB0aGlzIHB1cmVseSB0byBzZXJ2ZSBvdXIgb3duIGVtYmVkZGVkIGNvbnRlbnQuCisgICAgICAgIHJldHVybiBzZW5kNDA0KCk7CisgICAgfSBlbHNlIGlmICghaXNPayhyZXNwb25zZS0+cmVzcG9uc2VDb2RlKCkpKSB7CisgICAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzcG9uc2UtPnJlc3BvbnNlQ29kZSgpLCByZXNwb25zZS0+cGF5bG9hZCgpKTsKKyAgICB9CisKKyAgICBidWZmZXJSZXNwb25zZUFuZENvbW1vbkhlYWRlcnMocmVzcG9uc2UtPnJlc3BvbnNlQ29kZSgpKTsKKyAgICBidWZmZXJMaW5lKCJDb250ZW50LUxlbmd0aDogIiArIHRvU3RyaW5nKHJlc3BvbnNlLT5wYXlsb2FkU2l6ZSgpKSk7CisgICAgYnVmZmVyTGluZSgiQ29udGVudC1UeXBlOiAiICsgcmVzcG9uc2UtPmNvbnRlbnRUeXBlKCkpOworICAgIGlmIChyZXNwb25zZS0+a2VlcENvbm5lY3Rpb25BbGl2ZSgpKSB7CisgICAgICAgIGJ1ZmZlckxpbmUoIkNvbm5lY3Rpb246IGtlZXAtYWxpdmUiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBidWZmZXJMaW5lKCJDb25uZWN0aW9uOiBjbG9zZSIpOworICAgIH0KKyAgICBidWZmZXJMaW5lKCJMYXN0LU1vZGlmaWVkOiAiICsgbm93KCkpOworICAgIGJ1ZmZlckxpbmUoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlIik7CisgICAgYnVmZmVyTGluZSgiUHJhZ21hOiBuby1jYWNoZSIpOworICAgIGJ1ZmZlckxpbmUoIkV4cGlyZXM6ICIgKyBub3coKSk7CisgICAgYXV0byBoZWFkZXJzID0gcmVzcG9uc2UtPmdldEFkZGl0aW9uYWxIZWFkZXJzKCk7CisgICAgZm9yIChhdXRvIGl0ID0gaGVhZGVycy5iZWdpbigpOyBpdCAhPSBoZWFkZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGJ1ZmZlckxpbmUoaXQtPmZpcnN0ICsgIjogIiArIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBidWZmZXJMaW5lKCIiKTsKKworICAgIGlmICghd3JpdGUocmVzcG9uc2UtPnBheWxvYWQoKSwgcmVzcG9uc2UtPnBheWxvYWRTaXplKCksIHRydWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFyZXNwb25zZS0+a2VlcENvbm5lY3Rpb25BbGl2ZSgpKSB7CisgICAgICAgIGNsb3NlV2hlbkVtcHR5KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbm5lY3Rpb246OmhhbmRsZUh5YmlIYW5kc2hha2UoCisgICAgICAgIGludCB3ZWJTb2NrZXRWZXJzaW9uLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgd2ViU29ja2V0S2V5KSB7CisgICAgaWYgKHdlYlNvY2tldFZlcnNpb24gIT0gOCAmJiB3ZWJTb2NrZXRWZXJzaW9uICE9IDEzKSB7CisgICAgICAgIHJldHVybiBzZW5kQmFkUmVxdWVzdCgiSW52YWxpZCB3ZWJzb2NrZXQgdmVyc2lvbiIpOworICAgIH0KKyAgICBMU19ERUJVRyhfbG9nZ2VyLCAiR290IGEgaHliaS04IHdlYnNvY2tldCB3aXRoIGtleT0iIDw8IHdlYlNvY2tldEtleSk7CisKKyAgICBMU19ERUJVRyhfbG9nZ2VyLCAiQXR0ZW1wdGluZyB3ZWJzb2NrZXQgdXBncmFkZSIpOworCisgICAgYnVmZmVyUmVzcG9uc2VBbmRDb21tb25IZWFkZXJzKFJlc3BvbnNlQ29kZTo6V2ViU29ja2V0UHJvdG9jb2xIYW5kc2hha2UpOworICAgIGJ1ZmZlckxpbmUoIlVwZ3JhZGU6IHdlYnNvY2tldCIpOworICAgIGJ1ZmZlckxpbmUoIkNvbm5lY3Rpb246IFVwZ3JhZGUiKTsKKyAgICBidWZmZXJMaW5lKCJTZWMtV2ViU29ja2V0LUFjY2VwdDogIiArIGdldEFjY2VwdEtleSh3ZWJTb2NrZXRLZXkpKTsKKyAgICBidWZmZXJMaW5lKCIiKTsKKyAgICBmbHVzaCgpOworCisgICAgaWYgKF93ZWJTb2NrZXRIYW5kbGVyKSB7CisgICAgICAgIF93ZWJTb2NrZXRIYW5kbGVyLT5vbkNvbm5lY3QodGhpcyk7CisgICAgfQorICAgIF9zdGF0ZSA9IEhBTkRMSU5HX0hZQklfV0VCU09DS0VUOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbm5lY3Rpb246OnBhcnNlUmFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHJhbmdlU3RyLCBSYW5nZSYgcmFuZ2UpIGNvbnN0IHsKKyAgICBzaXplX3QgbWludXNQb3MgPSByYW5nZVN0ci5maW5kKCctJyk7CisgICAgaWYgKG1pbnVzUG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIExTX1dBUk5JTkcoX2xvZ2dlciwgIkJhZCByYW5nZTogJyIgPDwgcmFuZ2VTdHIgPDwgIiciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWludXNQb3MgPT0gMCkgeworICAgICAgICAvLyBBIHJhbmdlIGxpa2UgIi01MDAiIG1lYW5zIDUwMCBieXRlcyBmcm9tIGVuZCBvZiBmaWxlIHRvIGVuZC4KKyAgICAgICAgcmFuZ2Uuc3RhcnQgPSBhdG9pKHJhbmdlU3RyLmNfc3RyKCkpOworICAgICAgICByYW5nZS5lbmQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGxvbmc+OjptYXgoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmFuZ2Uuc3RhcnQgPSBhdG9pKHJhbmdlU3RyLnN1YnN0cigwLCBtaW51c1BvcykuY19zdHIoKSk7CisgICAgICAgIGlmIChtaW51c1BvcyA9PSByYW5nZVN0ci5zaXplKCktMSkgeworICAgICAgICAgICAgcmFuZ2UuZW5kID0gc3RkOjpudW1lcmljX2xpbWl0czxsb25nPjo6bWF4KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYW5nZS5lbmQgPSBhdG9pKHJhbmdlU3RyLnN1YnN0cihtaW51c1BvcyArIDEpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29ubmVjdGlvbjo6cGFyc2VSYW5nZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHJhbmdlLCBzdGQ6Omxpc3Q8UmFuZ2U+JiByYW5nZXMpIGNvbnN0IHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRQcmVmaXggPSAiYnl0ZXM9IjsKKyAgICBpZiAocmFuZ2UubGVuZ3RoKCkgPCBleHBlY3RlZFByZWZpeC5sZW5ndGgoKSB8fCByYW5nZS5zdWJzdHIoMCwgZXhwZWN0ZWRQcmVmaXgubGVuZ3RoKCkpICE9IGV4cGVjdGVkUHJlZml4KSB7CisgICAgICAgIExTX1dBUk5JTkcoX2xvZ2dlciwgIkJhZCByYW5nZSByZXF1ZXN0IHByZWZpeDogJyIgPDwgcmFuZ2UgPDwgIiciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIHJhbmdlc1RleHQgPSBzcGxpdChyYW5nZS5zdWJzdHIoZXhwZWN0ZWRQcmVmaXgubGVuZ3RoKCkpLCAnLCcpOworICAgIGZvciAoYXV0byBpdCA9IHJhbmdlc1RleHQuYmVnaW4oKTsgaXQgIT0gcmFuZ2VzVGV4dC5lbmQoKTsgKytpdCkgeworICAgICAgICBSYW5nZSByOworICAgICAgICBpZiAoIXBhcnNlUmFuZ2UoKml0LCByKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJhbmdlcy5wdXNoX2JhY2socik7CisgICAgfQorICAgIHJldHVybiAhcmFuZ2VzLmVtcHR5KCk7Cit9CisKKy8vIFNlbmRzIEhUVFAgMjAwIG9yIDIwNiwgY29udGVudC1sZW5ndGgsIGFuZCByYW5nZSBpbmZvIGFzIG5lZWRlZC4gUmV0dXJucyB0aGUgYWN0dWFsIGZpbGUgcmFuZ2VzCisvLyBuZWVkaW5nIHNlbmRpbmcuCitzdGQ6Omxpc3Q8Q29ubmVjdGlvbjo6UmFuZ2U+IENvbm5lY3Rpb246OnByb2Nlc3NSYW5nZXNGb3JTdGF0aWNEYXRhKGNvbnN0IHN0ZDo6bGlzdDxSYW5nZT4mIG9yaWdSYW5nZXMsIGxvbmcgZmlsZVNpemUpIHsKKyAgICBpZiAob3JpZ1Jhbmdlcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIEVhc3kgY2FzZTogYSBub24tcmFuZ2UgcmVxdWVzdC4KKyAgICAgICAgYnVmZmVyUmVzcG9uc2VBbmRDb21tb25IZWFkZXJzKFJlc3BvbnNlQ29kZTo6T2spOworICAgICAgICBidWZmZXJMaW5lKCJDb250ZW50LUxlbmd0aDogIiArIHRvU3RyaW5nKGZpbGVTaXplKSk7CisgICAgICAgIHJldHVybiB7IFJhbmdlIHsgMCwgZmlsZVNpemUgLSAxIH0gfTsKKyAgICB9CisKKyAgICAvLyBQYXJ0aWFsIGNvbnRlbnQgcmVxdWVzdC4KKyAgICBidWZmZXJSZXNwb25zZUFuZENvbW1vbkhlYWRlcnMoUmVzcG9uc2VDb2RlOjpQYXJ0aWFsQ29udGVudCk7CisgICAgaW50IGNvbnRlbnRMZW5ndGggPSAwOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByYW5nZUxpbmU7CisgICAgcmFuZ2VMaW5lIDw8ICJDb250ZW50LVJhbmdlOiBieXRlcyAiOworICAgIHN0ZDo6bGlzdDxSYW5nZT4gc2VuZFJhbmdlczsKKyAgICBmb3IgKGF1dG8gcmFuZ2VJdGVyID0gb3JpZ1Jhbmdlcy5jYmVnaW4oKTsgcmFuZ2VJdGVyICE9IG9yaWdSYW5nZXMuY2VuZCgpOyArK3JhbmdlSXRlcikgeworICAgICAgICBSYW5nZSBhY3R1YWxSYW5nZSA9ICpyYW5nZUl0ZXI7CisgICAgICAgIGlmIChhY3R1YWxSYW5nZS5zdGFydCA8IDApIHsKKyAgICAgICAgICAgIGFjdHVhbFJhbmdlLnN0YXJ0ICs9IGZpbGVTaXplOworICAgICAgICB9CisgICAgICAgIGlmIChhY3R1YWxSYW5nZS5zdGFydCA+PSBmaWxlU2l6ZSkgeworICAgICAgICAgICAgYWN0dWFsUmFuZ2Uuc3RhcnQgPSBmaWxlU2l6ZSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdHVhbFJhbmdlLmVuZCA+PSBmaWxlU2l6ZSkgeworICAgICAgICAgICAgYWN0dWFsUmFuZ2UuZW5kID0gZmlsZVNpemUgLSAxOworICAgICAgICB9CisgICAgICAgIGNvbnRlbnRMZW5ndGggKz0gYWN0dWFsUmFuZ2UubGVuZ3RoKCk7CisgICAgICAgIHNlbmRSYW5nZXMucHVzaF9iYWNrKGFjdHVhbFJhbmdlKTsKKyAgICAgICAgcmFuZ2VMaW5lIDw8IGFjdHVhbFJhbmdlLnN0YXJ0IDw8ICItIiA8PCBhY3R1YWxSYW5nZS5lbmQ7CisgICAgfQorICAgIHJhbmdlTGluZSA8PCAiLyIgPDwgZmlsZVNpemU7CisgICAgYnVmZmVyTGluZShyYW5nZUxpbmUuc3RyKCkpOworICAgIGJ1ZmZlckxpbmUoIkNvbnRlbnQtTGVuZ3RoOiAiICsgdG9TdHJpbmcoY29udGVudExlbmd0aCkpOworICAgIHJldHVybiBzZW5kUmFuZ2VzOworfQorCitib29sIENvbm5lY3Rpb246OnNlbmRTdGF0aWNEYXRhKCkgeworICAgIC8vIFRPRE86IGZvbGQgdGhpcyBpbnRvIHRoZSBoYW5kbGVyIHdheSBvZiBkb2luZyB0aGluZ3MuCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IF9zZXJ2ZXIuZ2V0U3RhdGljUGF0aCgpICsgZ2V0UmVxdWVzdFVyaSgpOworICAgIGF1dG8gcmFuZ2VIZWFkZXIgPSBnZXRIZWFkZXIoIlJhbmdlIik7CisgICAgLy8gVHJpbSBhbnkgdHJhaWxpbmcgcXVlcmllcy4KKyAgICBzaXplX3QgcXVlcnlQb3MgPSBwYXRoLmZpbmQoJz8nKTsKKyAgICBpZiAocXVlcnlQb3MgIT0gcGF0aC5ucG9zKSB7CisgICAgICAgIHBhdGgucmVzaXplKHF1ZXJ5UG9zKTsKKyAgICB9CisgICAgaWYgKCpwYXRoLnJiZWdpbigpID09ICcvJykgeworICAgICAgICBwYXRoICs9ICJpbmRleC5odG1sIjsKKyAgICB9CisgICAgUmFpaUZkIGlucHV0KHBhdGguY19zdHIoKSk7CisgICAgc3RydWN0IHN0YXQgc3RhdDsKKyAgICBpZiAoIWlucHV0Lm9rKCkgfHwgOjpmc3RhdChpbnB1dCwgJnN0YXQpID09IC0xKSB7CisgICAgICAgIHJldHVybiBzZW5kNDA0KCk7CisgICAgfQorICAgIHN0ZDo6bGlzdDxSYW5nZT4gcmFuZ2VzOworICAgIGlmICghcmFuZ2VIZWFkZXIuZW1wdHkoKSAmJiAhcGFyc2VSYW5nZXMocmFuZ2VIZWFkZXIsIHJhbmdlcykpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRCYWRSZXF1ZXN0KCJCYWQgcmFuZ2UgaGVhZGVyIik7CisgICAgfQorICAgIHJhbmdlcyA9IHByb2Nlc3NSYW5nZXNGb3JTdGF0aWNEYXRhKHJhbmdlcywgc3RhdC5zdF9zaXplKTsKKyAgICBidWZmZXJMaW5lKCJDb250ZW50LVR5cGU6ICIgKyBnZXRDb250ZW50VHlwZShwYXRoKSk7CisgICAgYnVmZmVyTGluZSgiQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSIpOworICAgIGJ1ZmZlckxpbmUoIkFjY2VwdC1SYW5nZXM6IGJ5dGVzIik7CisgICAgYnVmZmVyTGluZSgiTGFzdC1Nb2RpZmllZDogIiArIHdlYnRpbWUoc3RhdC5zdF9tdGltZSkpOworICAgIGlmICghaXNDYWNoZWFibGUocGF0aCkpIHsKKyAgICAgICAgYnVmZmVyTGluZSgiQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUiKTsKKyAgICAgICAgYnVmZmVyTGluZSgiUHJhZ21hOiBuby1jYWNoZSIpOworICAgICAgICBidWZmZXJMaW5lKCJFeHBpcmVzOiAiICsgbm93KCkpOworICAgIH0KKyAgICBidWZmZXJMaW5lKCIiKTsKKyAgICBpZiAoIWZsdXNoKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoYXV0byByYW5nZUl0ZXIgPSByYW5nZXMuY2JlZ2luKCk7IHJhbmdlSXRlciAhPSByYW5nZXMuY2VuZCgpOyArK3JhbmdlSXRlcikgeworICAgICAgICBpZiAoOjpsc2VlayhpbnB1dCwgcmFuZ2VJdGVyLT5zdGFydCwgU0VFS19TRVQpID09IC0xKSB7CisgICAgICAgICAgICAvLyBXZSd2ZSAocHJvYmFibHkpIGFscmVhZHkgc2VudCBkYXRhLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGF1dG8gYnl0ZXNMZWZ0ID0gcmFuZ2VJdGVyLT5sZW5ndGgoKTsKKyAgICAgICAgd2hpbGUgKGJ5dGVzTGVmdCkgeworICAgICAgICAgICAgY2hhciBidWZbUmVhZFdyaXRlQnVmZmVyU2l6ZV07CisgICAgICAgICAgICBhdXRvIGJ5dGVzUmVhZCA9IDo6cmVhZChpbnB1dCwgYnVmLCBzdGQ6Om1pbihzaXplb2YoYnVmKSwgYnl0ZXNMZWZ0KSk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgc3RkOjpzdHJpbmcgdW5leHBlY3RlZEVvZigiVW5leHBlY3RlZCBFT0YiKTsKKyAgICAgICAgICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiRXJyb3IgcmVhZGluZyBmaWxlOiAiIDw8IChieXRlc1JlYWQgPT0gMCA/IHVuZXhwZWN0ZWRFb2YgOiBnZXRMYXN0RXJyb3IoKSkpOworICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHNlbmQgYW4gZXJyb3IgZG9jdW1lbnQgYXMgd2UndmUgc2VudCB0aGUgaGVhZGVyLgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGVzTGVmdCAtPSBieXRlc1JlYWQ7CisgICAgICAgICAgICBpZiAoIXdyaXRlKGJ1ZiwgYnl0ZXNSZWFkLCB0cnVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb25uZWN0aW9uOjpzZW5kRGF0YShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgY2hhciogc3RhcnQsIHNpemVfdCBzaXplKSB7CisgICAgYnVmZmVyUmVzcG9uc2VBbmRDb21tb25IZWFkZXJzKFJlc3BvbnNlQ29kZTo6T2spOworICAgIGJ1ZmZlckxpbmUoIkNvbnRlbnQtVHlwZTogIiArIHR5cGUpOworICAgIGJ1ZmZlckxpbmUoIkNvbnRlbnQtTGVuZ3RoOiAiICsgdG9TdHJpbmcoc2l6ZSkpOworICAgIGJ1ZmZlckxpbmUoIkNvbm5lY3Rpb246IGtlZXAtYWxpdmUiKTsKKyAgICBidWZmZXJMaW5lKCIiKTsKKyAgICBib29sIHJlc3VsdCA9IHdyaXRlKHN0YXJ0LCBzaXplLCB0cnVlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIENvbm5lY3Rpb246OmJ1ZmZlclJlc3BvbnNlQW5kQ29tbW9uSGVhZGVycyhSZXNwb25zZUNvZGUgY29kZSkgeworICAgIGF1dG8gcmVzcG9uc2VDb2RlSW50ID0gc3RhdGljX2Nhc3Q8aW50Pihjb2RlKTsKKyAgICBhdXRvIHJlc3BvbnNlQ29kZU5hbWUgPSA6Om5hbWUoY29kZSk7CisgICAgYXV0byByZXNwb25zZSA9IHN0ZDo6c3RyaW5nKCJIVFRQLzEuMSAiICsgdG9TdHJpbmcocmVzcG9uc2VDb2RlSW50KSArICIgIiArIHJlc3BvbnNlQ29kZU5hbWUpOworICAgIExTX0FDQ0VTUyhfbG9nZ2VyLCAiUmVzcG9uc2U6ICIgPDwgcmVzcG9uc2UpOworICAgIGJ1ZmZlckxpbmUocmVzcG9uc2UpOworICAgIGJ1ZmZlckxpbmUoIlNlcnZlcjogIiBTRUFTT0NLU19WRVJTSU9OX1NUUklORyk7CisgICAgYnVmZmVyTGluZSgiRGF0ZTogIiArIG5vdygpKTsKKyAgICBidWZmZXJMaW5lKCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiKTsKK30KKwordm9pZCBDb25uZWN0aW9uOjpzZXRMaW5nZXIoKSB7CisgICAgaWYgKF9mZCA9PSAtMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IGludCBzZWNvbmRzVG9MaW5nZXIgPSAxOworICAgIHN0cnVjdCBsaW5nZXIgbGluZ2VyID0geyB0cnVlLCBzZWNvbmRzVG9MaW5nZXIgfTsKKyAgICBpZiAoOjpzZXRzb2Nrb3B0KF9mZCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAmbGluZ2VyLCBzaXplb2YobGluZ2VyKSkgPT0gLTEpIHsKKyAgICAgICAgTFNfSU5GTyhfbG9nZ2VyLCAiVW5hYmxlIHRvIHNldCBsaW5nZXIgb24gc29ja2V0Iik7CisgICAgfQorfQorCitib29sIENvbm5lY3Rpb246Omhhc0hlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYgaGVhZGVyKSBjb25zdCB7CisgICAgcmV0dXJuIF9yZXF1ZXN0ID8gX3JlcXVlc3QtPmhhc0hlYWRlcihoZWFkZXIpIDogZmFsc2U7Cit9CisKK3N0ZDo6c3RyaW5nIENvbm5lY3Rpb246OmdldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYgaGVhZGVyKSBjb25zdCB7CisgICAgcmV0dXJuIF9yZXF1ZXN0ID8gX3JlcXVlc3QtPmdldEhlYWRlcihoZWFkZXIpIDogIiI7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBDb25uZWN0aW9uOjpnZXRSZXF1ZXN0VXJpKCkgY29uc3QgeworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBlbXB0eTsKKyAgICByZXR1cm4gX3JlcXVlc3QgPyBfcmVxdWVzdC0+Z2V0UmVxdWVzdFVyaSgpIDogZW1wdHk7Cit9CisKK30gIC8vIHNlYXNvY2tzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL0h5YmlBY2NlcHQuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9IeWJpQWNjZXB0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJkYmRlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9IeWJpQWNjZXB0LmNwcApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJpbnRlcm5hbC9CYXNlNjQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC9IeWJpQWNjZXB0LmgiCisKKyNpbmNsdWRlICJzaGExL3NoYTEuaCIKKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgbWFnaWNTdHJpbmcoIjI1OEVBRkE1LUU5MTQtNDdEQS05NUNBLUM1QUIwREM4NUIxMSIpOworCitzdGQ6OnN0cmluZyBnZXRBY2NlcHRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGNoYWxsZW5nZSkgeworICAgIGF1dG8gZnVsbFN0cmluZyA9IGNoYWxsZW5nZSArIG1hZ2ljU3RyaW5nOworICAgIFNIQTEgaGFzaGVyOworICAgIGhhc2hlci5JbnB1dChmdWxsU3RyaW5nLmNfc3RyKCksIGZ1bGxTdHJpbmcuc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBoYXNoWzVdOworICAgIGhhc2hlci5SZXN1bHQoaGFzaCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgaGFzaFtpXSA9IGh0b25sKGhhc2hbaV0pOworICAgIH0KKyAgICByZXR1cm4gYmFzZTY0RW5jb2RlKGhhc2gsIHNpemVvZihoYXNoKSk7Cit9CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvSHliaVBhY2tldERlY29kZXIuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9IeWJpUGFja2V0RGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmZGVmZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvSHliaVBhY2tldERlY29kZXIuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJpbnRlcm5hbC9IeWJpUGFja2V0RGVjb2Rlci5oIgorI2luY2x1ZGUgImludGVybmFsL0xvZ1N0cmVhbS5oIgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK0h5YmlQYWNrZXREZWNvZGVyOjpIeWJpUGFja2V0RGVjb2RlcihMb2dnZXImIGxvZ2dlciwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGJ1ZmZlcikgOgorICAgIF9sb2dnZXIobG9nZ2VyKSwKKyAgICBfYnVmZmVyKGJ1ZmZlciksCisgICAgX21lc3NhZ2VTdGFydCgwKSB7Cit9CisKK0h5YmlQYWNrZXREZWNvZGVyOjpNZXNzYWdlU3RhdGUgSHliaVBhY2tldERlY29kZXI6OmRlY29kZU5leHRNZXNzYWdlKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlT3V0KSB7CisgICAgaWYgKF9tZXNzYWdlU3RhcnQgKyAxID49IF9idWZmZXIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOb01lc3NhZ2U7CisgICAgfQorICAgIGlmICgoX2J1ZmZlcltfbWVzc2FnZVN0YXJ0XSAmIDB4ODApID09IDApIHsKKyAgICAgICAgLy8gRklOIGJpdCBpcyBub3QgY2xlYXIuLi4KKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydAorICAgICAgICBMU19XQVJOSU5HKCZfbG9nZ2VyLCAiUmVjZWl2ZWQgaHliaSBmcmFtZSB3aXRob3V0IEZJTiBiaXQgc2V0IC0gdW5zdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEVycm9yOworICAgIH0KKyAgICBpZiAoKF9idWZmZXJbX21lc3NhZ2VTdGFydF0gJiAoNzw8NCkpICE9IDApIHsKKyAgICAgICAgTFNfV0FSTklORygmX2xvZ2dlciwgIlJlY2VpdmVkIGh5YmkgZnJhbWUgd2l0aCByZXNlcnZlZCBiaXRzIHNldCAtIGVycm9yIik7CisgICAgICAgIHJldHVybiBFcnJvcjsKKyAgICB9CisgICAgYXV0byBvcGNvZGUgPSBfYnVmZmVyW19tZXNzYWdlU3RhcnRdICYgMHhmOworICAgIHNpemVfdCBwYXlsb2FkTGVuZ3RoID0gX2J1ZmZlcltfbWVzc2FnZVN0YXJ0ICsgMV0gJiAweDdmOworICAgIGF1dG8gbWFza0JpdCA9IF9idWZmZXJbX21lc3NhZ2VTdGFydCArIDFdICYgMHg4MDsKKyAgICBhdXRvIHB0ciA9IF9tZXNzYWdlU3RhcnQgKyAyOworICAgIGlmIChwYXlsb2FkTGVuZ3RoID09IDEyNikgeworICAgICAgICBpZiAoX2J1ZmZlci5zaXplKCkgPCA0KSB7IHJldHVybiBOb01lc3NhZ2U7IH0KKyAgICAgICAgcGF5bG9hZExlbmd0aCA9IGh0b25zKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4oJl9idWZmZXJbcHRyXSkpOworICAgICAgICBwdHIgKz0gMjsKKyAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT0gMTI3KSB7CisgICAgICAgIGlmIChfYnVmZmVyLnNpemUoKSA8IDEwKSB7IHJldHVybiBOb01lc3NhZ2U7IH0KKyAgICAgICAgcGF5bG9hZExlbmd0aCA9IF9fYnN3YXBfNjQoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QqPigmX2J1ZmZlcltwdHJdKSk7CisgICAgICAgIHB0ciArPSA4OworICAgIH0KKyAgICB1aW50MzJfdCBtYXNrID0gMDsKKyAgICBpZiAobWFza0JpdCkgeworICAgICAgICAvLyBNQVNLIGlzIHNldC4KKyAgICAgICAgaWYgKF9idWZmZXIuc2l6ZSgpIDwgcHRyICsgNCkgeyByZXR1cm4gTm9NZXNzYWdlOyB9CisgICAgICAgIG1hc2sgPSBodG9ubCgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZfYnVmZmVyW3B0cl0pKTsKKyAgICAgICAgcHRyICs9IDQ7CisgICAgfQorICAgIGF1dG8gYnl0ZXNMZWZ0SW5CdWZmZXIgPSBfYnVmZmVyLnNpemUoKSAtIHB0cjsKKyAgICBpZiAocGF5bG9hZExlbmd0aCA+IGJ5dGVzTGVmdEluQnVmZmVyKSB7IHJldHVybiBOb01lc3NhZ2U7IH0KKworICAgIG1lc3NhZ2VPdXQuY2xlYXIoKTsKKyAgICBtZXNzYWdlT3V0LnJlc2VydmUocGF5bG9hZExlbmd0aCk7CisgICAgZm9yIChhdXRvIGkgPSAwdTsgaSA8IHBheWxvYWRMZW5ndGg7ICsraSkgeworICAgICAgICBhdXRvIGJ5dGVTaGlmdCA9ICgzIC0gKGkgJiAzKSkgKiA4OworICAgICAgICBtZXNzYWdlT3V0LnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoX2J1ZmZlcltwdHIrK10gXiAobWFzayA+PiBieXRlU2hpZnQpKSAmIDB4ZmYpKTsKKyAgICB9CisgICAgX21lc3NhZ2VTdGFydCA9IHB0cjsKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIExTX1dBUk5JTkcoJl9sb2dnZXIsICJSZWNlaXZlZCBoeWJpIGZyYW1lIHdpdGggdW5rbm93biBvcGNvZGUgIiA8PCBvcGNvZGUpOworICAgICAgICByZXR1cm4gRXJyb3I7CisgICAgY2FzZSBPUENPREVfVEVYVDoKKyAgICAgICAgcmV0dXJuIFRleHRNZXNzYWdlOworICAgIGNhc2UgT1BDT0RFX0JJTkFSWToKKyAgICAgICAgcmV0dXJuIEJpbmFyeU1lc3NhZ2U7CisgICAgY2FzZSBPUENPREVfUElORzoKKyAgICAgICAgcmV0dXJuIFBpbmc7CisgICAgY2FzZSBPUENPREVfQ0xPU0U6CisgICAgICAgIHJldHVybiBDbG9zZTsKKyAgICB9Cit9CisKK3NpemVfdCBIeWJpUGFja2V0RGVjb2Rlcjo6bnVtQnl0ZXNEZWNvZGVkKCkgY29uc3QgeworICAgIHJldHVybiBfbWVzc2FnZVN0YXJ0OworfQorCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL0xvZ2dlci5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL0xvZ2dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3YWUzMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvTG9nZ2VyLmNwcApAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJpbnRlcm5hbC9EZWJ1Zy5oIgorCisjaW5jbHVkZSAic2Vhc29ja3MvTG9nZ2VyLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCitjb25zdCBpbnQgTUFYX01FU1NBR0VfTEVOR1RIID0gMTAyNDsKKworI2RlZmluZSBQUklOVF9UT19NRVNTQUdFQlVGKCkgXAorICAgIGNoYXIgbWVzc2FnZUJ1ZltNQVhfTUVTU0FHRV9MRU5HVEhdOyBcCisgICAgdmFfbGlzdCBhcmdzOyBcCisgICAgdmFfc3RhcnQoYXJncywgbWVzc2FnZSk7IFwKKyAgICB2c25wcmludGYobWVzc2FnZUJ1ZiwgTUFYX01FU1NBR0VfTEVOR1RILCBtZXNzYWdlLCBhcmdzKTsgXAorICAgIHZhX2VuZChhcmdzKQorCit2b2lkIExvZ2dlcjo6ZGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKSB7CisjaWZkZWYgTE9HX0RFQlVHX0lORk8KKyAgICBQUklOVF9UT19NRVNTQUdFQlVGKCk7CisgICAgbG9nKERFQlVHLCBtZXNzYWdlQnVmKTsKKyNlbmRpZgorfQorCit2b2lkIExvZ2dlcjo6YWNjZXNzKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLikgeworICAgIFBSSU5UX1RPX01FU1NBR0VCVUYoKTsKKyAgICBsb2coQUNDRVNTLCBtZXNzYWdlQnVmKTsKK30KKwordm9pZCBMb2dnZXI6OmluZm8oY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKSB7CisgICAgUFJJTlRfVE9fTUVTU0FHRUJVRigpOworICAgIGxvZyhJTkZPLCBtZXNzYWdlQnVmKTsKK30KKwordm9pZCBMb2dnZXI6Ondhcm5pbmcoY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKSB7CisgICAgUFJJTlRfVE9fTUVTU0FHRUJVRigpOworICAgIGxvZyhXQVJOSU5HLCBtZXNzYWdlQnVmKTsKK30KKwordm9pZCBMb2dnZXI6OmVycm9yKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLikgeworICAgIFBSSU5UX1RPX01FU1NBR0VCVUYoKTsKKyAgICBsb2coRVJST1IsIG1lc3NhZ2VCdWYpOworfQorCit2b2lkIExvZ2dlcjo6c2V2ZXJlKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLikgeworICAgIFBSSU5UX1RPX01FU1NBR0VCVUYoKTsKKyAgICBsb2coU0VWRVJFLCBtZXNzYWdlQnVmKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNlYXNvY2tzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL1BhZ2VSZXF1ZXN0LmNwcCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvUGFnZVJlcXVlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTUzMTMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL1BhZ2VSZXF1ZXN0LmNwcApAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJpbnRlcm5hbC9QYWdlUmVxdWVzdC5oIgorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCitQYWdlUmVxdWVzdDo6UGFnZVJlcXVlc3QoCisgICAgICAgIGNvbnN0IHNvY2thZGRyX2luJiByZW1vdGVBZGRyZXNzLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVxdWVzdFVyaSwKKyAgICAgICAgVmVyYiB2ZXJiLAorICAgICAgICBIZWFkZXJNYXAmJiBoZWFkZXJzKSA6CisgICAgICAgICAgICBfY3JlZGVudGlhbHMoc3RkOjpzaGFyZWRfcHRyPENyZWRlbnRpYWxzPihuZXcgQ3JlZGVudGlhbHMoKSkpLAorICAgICAgICAgICAgX3JlbW90ZUFkZHJlc3MocmVtb3RlQWRkcmVzcyksCisgICAgICAgICAgICBfcmVxdWVzdFVyaShyZXF1ZXN0VXJpKSwKKyAgICAgICAgICAgIF92ZXJiKHZlcmIpLAorICAgICAgICAgICAgX2hlYWRlcnMoc3RkOjptb3ZlKGhlYWRlcnMpKSwKKyAgICAgICAgICAgIF9jb250ZW50TGVuZ3RoKGdldEludEhlYWRlcigiQ29udGVudC1MZW5ndGgiKSkgeworfQorCitib29sIFBhZ2VSZXF1ZXN0Ojpjb25zdW1lQ29udGVudChzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci5zaXplKCkgPCBfY29udGVudExlbmd0aCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChidWZmZXIuc2l6ZSgpID09IF9jb250ZW50TGVuZ3RoKSB7CisgICAgICAgIF9jb250ZW50LnN3YXAoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfY29udGVudC5hc3NpZ24oYnVmZmVyLmJlZ2luKCksIGJ1ZmZlci5iZWdpbigpICsgX2NvbnRlbnRMZW5ndGgpOworICAgICAgICBidWZmZXIuZXJhc2UoYnVmZmVyLmJlZ2luKCksIGJ1ZmZlci5iZWdpbigpICsgX2NvbnRlbnRMZW5ndGgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IFBhZ2VSZXF1ZXN0OjpnZXRJbnRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIGl0ZXIgPSBfaGVhZGVycy5maW5kKG5hbWUpOworICAgIHJldHVybiBpdGVyID09IF9oZWFkZXJzLmVuZCgpID8gMCA6IGF0b2koaXRlci0+c2Vjb25kLmNfc3RyKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc2Vhc29ja3MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvUmVzcG9uc2UuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9SZXNwb25zZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkZGZlMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvUmVzcG9uc2UuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgImludGVybmFsL0NvbmNyZXRlUmVzcG9uc2UuaCIKKworI2luY2x1ZGUgInNlYXNvY2tzL1Jlc3BvbnNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzZWFzb2NrczsKKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBSZXNwb25zZTo6dW5oYW5kbGVkKCkgeworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IHVuaGFuZGxlZDsKKyAgICByZXR1cm4gdW5oYW5kbGVkOworfQorCitzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IFJlc3BvbnNlOjpub3RGb3VuZCgpIHsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBub3RGb3VuZChuZXcgQ29uY3JldGVSZXNwb25zZShSZXNwb25zZUNvZGU6Ok5vdEZvdW5kLCAiTm90IGZvdW5kIiwgInRleHQvcGxhaW4iLCBSZXNwb25zZTo6SGVhZGVycygpLCBmYWxzZSkpOworICAgIHJldHVybiBub3RGb3VuZDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBSZXNwb25zZTo6ZXJyb3IoUmVzcG9uc2VDb2RlIGNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFzb24pIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPihuZXcgQ29uY3JldGVSZXNwb25zZShjb2RlLCByZWFzb24sICJ0ZXh0L3BsYWluIiwgUmVzcG9uc2U6OkhlYWRlcnMoKSwgZmFsc2UpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBSZXNwb25zZTo6dGV4dFJlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNwb25zZSkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+KAorICAgICAgICAgICAgbmV3IENvbmNyZXRlUmVzcG9uc2UoUmVzcG9uc2VDb2RlOjpPaywgcmVzcG9uc2UsICJ0ZXh0L3BsYWluIiwgUmVzcG9uc2U6OkhlYWRlcnMoKSwgdHJ1ZSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IFJlc3BvbnNlOjpqc29uUmVzcG9uc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHJlc3BvbnNlKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4oCisgICAgICAgICAgICBuZXcgQ29uY3JldGVSZXNwb25zZShSZXNwb25zZUNvZGU6Ok9rLCByZXNwb25zZSwgImFwcGxpY2F0aW9uL2pzb24iLCBSZXNwb25zZTo6SGVhZGVycygpLCB0cnVlKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gUmVzcG9uc2U6Omh0bWxSZXNwb25zZShjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPigKKyAgICAgICAgICAgIG5ldyBDb25jcmV0ZVJlc3BvbnNlKFJlc3BvbnNlQ29kZTo6T2ssIHJlc3BvbnNlLCAidGV4dC9odG1sIiwgUmVzcG9uc2U6OkhlYWRlcnMoKSwgdHJ1ZSkpOworfQorCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL1NlcnZlci5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL1NlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkMWMzMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvU2VydmVyLmNwcApAQCAtMCwwICsxLDU2OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAiaW50ZXJuYWwvTG9nU3RyZWFtLmgiCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9Db25uZWN0aW9uLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvTG9nZ2VyLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvU2VydmVyLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvUGFnZUhhbmRsZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TdHJpbmdVdGlsLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvdXRpbC9Kc29uLmgiCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKworI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgRXZlbnRCaXRzIHsKKyAgICB1aW50MzJfdCBiaXRzOworICAgIGV4cGxpY2l0IEV2ZW50Qml0cyh1aW50MzJfdCBiaXRzKSA6IGJpdHMoYml0cykge30KK307CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvLCBjb25zdCBFdmVudEJpdHMmIGIpIHsKKyAgICB1aW50MzJfdCBiaXRzID0gYi5iaXRzOworI2RlZmluZSBET19CSVQoTkFNRSkgXAorICAgICAgICBkbyB7IGlmIChiaXRzICYgKE5BTUUpKSB7IGlmIChiaXRzICE9IGIuYml0cykge28gPDwgIiwgIjsgfSBvIDw8ICNOQU1FOyBiaXRzICY9IH4oTkFNRSk7IH0gfSB3aGlsZSAoMCkKKyAgICBET19CSVQoRVBPTExJTik7CisgICAgRE9fQklUKEVQT0xMUFJJKTsKKyAgICBET19CSVQoRVBPTExPVVQpOworICAgIERPX0JJVChFUE9MTFJETk9STSk7CisgICAgRE9fQklUKEVQT0xMUkRCQU5EKTsKKyAgICBET19CSVQoRVBPTExXUk5PUk0pOworICAgIERPX0JJVChFUE9MTFdSQkFORCk7CisgICAgRE9fQklUKEVQT0xMTVNHKTsKKyAgICBET19CSVQoRVBPTExFUlIpOworICAgIERPX0JJVChFUE9MTEhVUCk7CisjaWZkZWYgRVBPTExSREhVUAorICAgIERPX0JJVChFUE9MTFJESFVQKTsKKyNlbmRpZgorICAgIERPX0JJVChFUE9MTE9ORVNIT1QpOworICAgIERPX0JJVChFUE9MTEVUKTsKKyN1bmRlZiBET19CSVQKKyAgICByZXR1cm4gbzsKK30KKworY29uc3QgaW50IEVwb2xsVGltZW91dE1pbGxpcyA9IDUwMDsgIC8vIFR3aWNlIGEgc2Vjb25kIGlzIGFtcGxlLgorY29uc3QgaW50IERlZmF1bHRMYW1lQ29ubmVjdGlvblRpbWVvdXRTZWNvbmRzID0gMTA7CitpbnQgZ2V0dGlkKCkgeworICAgIHJldHVybiBzeXNjYWxsKFNZU19nZXR0aWQpOworfQorCit9CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK1NlcnZlcjo6U2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxMb2dnZXI+IGxvZ2dlcikKKzogX2xvZ2dlcihsb2dnZXIpLCBfbGlzdGVuU29jaygtMSksIF9lcG9sbEZkKC0xKSwgX2V2ZW50RmQoLTEpLAorICBfbWF4S2VlcEFsaXZlRHJvcHMoMCksCisgIF9sYW1lQ29ubmVjdGlvblRpbWVvdXRTZWNvbmRzKERlZmF1bHRMYW1lQ29ubmVjdGlvblRpbWVvdXRTZWNvbmRzKSwKKyAgX25leHREZWFkQ29ubmVjdGlvbkNoZWNrKDApLCBfdGhyZWFkSWQoMCksIF90ZXJtaW5hdGUoZmFsc2UpLAorICBfZXhwZWN0ZWRUZXJtaW5hdGUoZmFsc2UpIHsKKworICAgIF9lcG9sbEZkID0gZXBvbGxfY3JlYXRlKDEwKTsKKyAgICBpZiAoX2Vwb2xsRmQgPT0gLTEpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byBjcmVhdGUgZXBvbGw6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX2V2ZW50RmQgPSBldmVudGZkKDAsIEVGRF9OT05CTE9DSyB8IEVGRF9DTE9FWEVDKTsKKyAgICBpZiAoX2V2ZW50RmQgPT0gLTEpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byBjcmVhdGUgZXZlbnQgRkQ6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZXBvbGxfZXZlbnQgZXZlbnRXYWtlID0geyBFUE9MTElOLCB7ICZfZXZlbnRGZCB9IH07CisgICAgaWYgKGVwb2xsX2N0bChfZXBvbGxGZCwgRVBPTExfQ1RMX0FERCwgX2V2ZW50RmQsICZldmVudFdha2UpID09IC0xKSB7CisgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJVbmFibGUgdG8gYWRkIHdha2Ugc29ja2V0IHRvIGVwb2xsOiAiIDw8IGdldExhc3RFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworU2VydmVyOjp+U2VydmVyKCkgeworICAgIExTX0lORk8oX2xvZ2dlciwgIlNlcnZlciBkZXN0cnVjdGlvbiIpOworICAgIHNodXRkb3duKCk7CisgICAgLy8gT25seSBzaHV0IHRoZSBldmVudGZkIGFuZCBlcG9sbCBhdCB0aGUgdmVyeSBlbmQKKyAgICBpZiAoX2V2ZW50RmQgIT0gLTEpIHsKKyAgICAgICAgY2xvc2UoX2V2ZW50RmQpOworICAgIH0KKyAgICBpZiAoX2Vwb2xsRmQgIT0gLTEpIHsKKyAgICAgICAgY2xvc2UoX2Vwb2xsRmQpOworICAgIH0KK30KKwordm9pZCBTZXJ2ZXI6OnNodXRkb3duKCkgeworICAgIC8vIFN0b3AgbGlzdGVuaW5nIHRvIGFueSBmdXJ0aGVyIGluY29taW5nIGNvbm5lY3Rpb25zLgorICAgIGlmIChfbGlzdGVuU29jayAhPSAtMSkgeworICAgICAgICBjbG9zZShfbGlzdGVuU29jayk7CisgICAgICAgIF9saXN0ZW5Tb2NrID0gLTE7CisgICAgfQorICAgIC8vIERpc2Nvbm5lY3QgYW5kIGNsb3NlIGFueSBjdXJyZW50IGNvbm5lY3Rpb25zLgorICAgIHdoaWxlICghX2Nvbm5lY3Rpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gRGVsZXRpbmcgdGhlIGNvbm5lY3Rpb24gY2xvc2VzIGl0IGFuZCByZW1vdmVzIGl0IGZyb20gJ3RoaXMnLgorICAgICAgICBDb25uZWN0aW9uKiB0b0JlQ2xvc2VkID0gX2Nvbm5lY3Rpb25zLmJlZ2luKCktPmZpcnN0OworICAgICAgICB0b0JlQ2xvc2VkLT5zZXRMaW5nZXIoKTsKKyAgICAgICAgZGVsZXRlIHRvQmVDbG9zZWQ7CisgICAgfQorfQorCitib29sIFNlcnZlcjo6bWFrZU5vbkJsb2NraW5nKGludCBmZCkgY29uc3QgeworICAgIGludCB5ZXNQbGVhc2UgPSAxOworICAgIGlmIChpb2N0bChmZCwgRklPTkJJTywgJnllc1BsZWFzZSkgIT0gMCkgeworICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiVW5hYmxlIHRvIG1ha2UgRkQgbm9uLWJsb2NraW5nOiAiIDw8IGdldExhc3RFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTZXJ2ZXI6OmNvbmZpZ3VyZVNvY2tldChpbnQgZmQpIGNvbnN0IHsKKyAgICBpZiAoIW1ha2VOb25CbG9ja2luZyhmZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBpbnQgeWVzUGxlYXNlID0gMTsKKyAgICBpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzUGxlYXNlLCBzaXplb2YoeWVzUGxlYXNlKSkgPT0gLTEpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byBzZXQgcmV1c2Ugc29ja2V0IG9wdGlvbjogIiA8PCBnZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKF9tYXhLZWVwQWxpdmVEcm9wcyA+IDApIHsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgJnllc1BsZWFzZSwgc2l6ZW9mKHllc1BsZWFzZSkpID09IC0xKSB7CisgICAgICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiVW5hYmxlIHRvIGVuYWJsZSBrZWVwYWxpdmU6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGludCBvbmVTZWNvbmQgPSAxOworICAgICAgICBpZiAoc2V0c29ja29wdChmZCwgSVBQUk9UT19UQ1AsIFRDUF9LRUVQSURMRSwgJm9uZVNlY29uZCwgc2l6ZW9mKG9uZVNlY29uZCkpID09IC0xKSB7CisgICAgICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiVW5hYmxlIHRvIHNldCBpZGxlIHByb2JlOiAiIDw8IGdldExhc3RFcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdChmZCwgSVBQUk9UT19UQ1AsIFRDUF9LRUVQSU5UVkwsICZvbmVTZWNvbmQsIHNpemVvZihvbmVTZWNvbmQpKSA9PSAtMSkgeworICAgICAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byBzZXQgaWRsZSBpbnRlcnZhbDogIiA8PCBnZXRMYXN0RXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoZmQsIElQUFJPVE9fVENQLCBUQ1BfS0VFUENOVCwgJl9tYXhLZWVwQWxpdmVEcm9wcywgc2l6ZW9mKF9tYXhLZWVwQWxpdmVEcm9wcykpID09IC0xKSB7CisgICAgICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiVW5hYmxlIHRvIHNldCBrZWVwIGFsaXZlIGNvdW50OiAiIDw8IGdldExhc3RFcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTZXJ2ZXI6OnRlcm1pbmF0ZSgpIHsKKyAgICBfZXhwZWN0ZWRUZXJtaW5hdGUgPSB0cnVlOworICAgIF90ZXJtaW5hdGUgPSB0cnVlOworICAgIHVpbnQ2NF90IG9uZSA9IDE7CisgICAgaWYgKF9ldmVudEZkICE9IC0xICYmIDo6d3JpdGUoX2V2ZW50RmQsICZvbmUsIHNpemVvZihvbmUpKSA9PSAtMSkgeworICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiVW5hYmxlIHRvIHBvc3QgYSB3YWtlIGV2ZW50OiAiIDw8IGdldExhc3RFcnJvcigpKTsKKyAgICB9Cit9CisKK2Jvb2wgU2VydmVyOjpzdGFydExpc3RlbmluZyhpbnQgcG9ydCkgeworICAgIHJldHVybiBzdGFydExpc3RlbmluZyhJTkFERFJfQU5ZLCBwb3J0KTsKK30KKworYm9vbCBTZXJ2ZXI6OnN0YXJ0TGlzdGVuaW5nKHVpbnQzMl90IGhvc3RBZGRyLCBpbnQgcG9ydCkgeworICAgIGlmIChfZXBvbGxGZCA9PSAtMSB8fCBfZXZlbnRGZCA9PSAtMSkgeworICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiVW5hYmxlIHRvIHNlcnZlLCBkaWQgbm90IGluaXRpYWxpemUgcHJvcGVybHkuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBfbGlzdGVuU29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgICAgaWYgKF9saXN0ZW5Tb2NrID09IC0xKSB7CisgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJVbmFibGUgdG8gY3JlYXRlIGxpc3RlbiBzb2NrZXQ6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghY29uZmlndXJlU29ja2V0KF9saXN0ZW5Tb2NrKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNvY2thZGRyX2luIHNvY2s7CisgICAgbWVtc2V0KCZzb2NrLCAwLCBzaXplb2Yoc29jaykpOworICAgIHNvY2suc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgICBzb2NrLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGhvc3RBZGRyKTsKKyAgICBzb2NrLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIGlmIChiaW5kKF9saXN0ZW5Tb2NrLCByZWludGVycHJldF9jYXN0PGNvbnN0IHNvY2thZGRyKj4oJnNvY2spLCBzaXplb2Yoc29jaykpID09IC0xKSB7CisgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJVbmFibGUgdG8gYmluZCBzb2NrZXQ6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChsaXN0ZW4oX2xpc3RlblNvY2ssIDUpID09IC0xKSB7CisgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJVbmFibGUgdG8gbGlzdGVuIG9uIHNvY2tldDogIiA8PCBnZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXBvbGxfZXZlbnQgZXZlbnQgPSB7IEVQT0xMSU4sIHsgdGhpcyB9IH07CisgICAgaWYgKGVwb2xsX2N0bChfZXBvbGxGZCwgRVBPTExfQ1RMX0FERCwgX2xpc3RlblNvY2ssICZldmVudCkgPT0gLTEpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byBhZGQgbGlzdGVuIHNvY2tldCB0byBlcG9sbDogIiA8PCBnZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICA6OmdldGhvc3RuYW1lKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIExTX0lORk8oX2xvZ2dlciwgIkxpc3RlbmluZyBvbiBodHRwOi8vIiA8PCBidWYgPDwgIjoiIDw8IHBvcnQgPDwgIi8iKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNlcnZlcjo6aGFuZGxlUGlwZSgpIHsKKyAgICB1aW50NjRfdCBkdW1teTsKKyAgICB3aGlsZSAoOjpyZWFkKF9ldmVudEZkLCAmZHVtbXksIHNpemVvZihkdW1teSkpICE9IC0xKSB7CisgICAgICAgIC8vIFNwaW4sIGRyYWluaW5nIHRoZSBwaXBlIHVudGlsIGl0IHJldHVybnMgRVdPVUxEQkxPQ0sgb3Igc2ltaWxhci4KKyAgICB9CisgICAgaWYgKGVycm5vICE9IEVBR0FJTiB8fCBlcnJubyAhPSBFV09VTERCTE9DSykgeworICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiRXJyb3IgZnJvbSB3YWtlRmQgcmVhZDogIiA8PCBnZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIF90ZXJtaW5hdGUgPSB0cnVlOworICAgIH0KKyAgICAvLyBJdCdzIGEgIndha2UgdXAiIGV2ZW50OyB0aGlzIHdpbGwganVzdCBjYXVzZSB0aGUgZXBvbGwgbG9vcCB0byB3YWtlIHVwLgorfQorCitTZXJ2ZXI6Ok5ld1N0YXRlIFNlcnZlcjo6aGFuZGxlQ29ubmVjdGlvbkV2ZW50cyhDb25uZWN0aW9uKiBjb25uZWN0aW9uLCB1aW50MzJfdCBldmVudHMpIHsKKyAgICBpZiAoZXZlbnRzICYgfihFUE9MTElOfEVQT0xMT1VUfEVQT0xMSFVQfEVQT0xMRVJSKSkgeworICAgICAgICBMU19XQVJOSU5HKF9sb2dnZXIsICJHb3QgdW5oYW5kbGVkIGVwb2xsIGV2ZW50ICgiIDw8IEV2ZW50Qml0cyhldmVudHMpIDw8ICIpIG9uIGNvbm5lY3Rpb246ICIKKyAgICAgICAgICAgICAgICA8PCBmb3JtYXRBZGRyZXNzKGNvbm5lY3Rpb24tPmdldFJlbW90ZUFkZHJlc3MoKSkpOworICAgICAgICByZXR1cm4gQ2xvc2U7CisgICAgfSBlbHNlIGlmIChldmVudHMgJiBFUE9MTEVSUikgeworICAgICAgICBMU19JTkZPKF9sb2dnZXIsICJFcnJvciBvbiBzb2NrZXQgKCIgPDwgRXZlbnRCaXRzKGV2ZW50cykgPDwgIik6ICIKKyAgICAgICAgICAgICAgICA8PCBmb3JtYXRBZGRyZXNzKGNvbm5lY3Rpb24tPmdldFJlbW90ZUFkZHJlc3MoKSkpOworICAgICAgICByZXR1cm4gQ2xvc2U7CisgICAgfSBlbHNlIGlmIChldmVudHMgJiBFUE9MTEhVUCkgeworICAgICAgICBMU19ERUJVRyhfbG9nZ2VyLCAiR3JhY2VmdWwgaGFuZy11cCAoIiA8PCBFdmVudEJpdHMoZXZlbnRzKSA8PCAiKSBvZiBzb2NrZXQ6ICIKKyAgICAgICAgICAgICAgICA8PCBmb3JtYXRBZGRyZXNzKGNvbm5lY3Rpb24tPmdldFJlbW90ZUFkZHJlc3MoKSkpOworICAgICAgICByZXR1cm4gQ2xvc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGV2ZW50cyAmIEVQT0xMT1VUKSB7CisgICAgICAgICAgICBjb25uZWN0aW9uLT5oYW5kbGVEYXRhUmVhZHlGb3JXcml0ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChldmVudHMgJiBFUE9MTElOKSB7CisgICAgICAgICAgICBjb25uZWN0aW9uLT5oYW5kbGVEYXRhUmVhZHlGb3JSZWFkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEtlZXBPcGVuOworfQorCit2b2lkIFNlcnZlcjo6Y2hlY2tBbmREaXNwYXRjaEVwb2xsKGludCBlcG9sbE1pbGxpcykgeworICAgIGNvbnN0IGludCBtYXhFdmVudHMgPSAyNTY7CisgICAgZXBvbGxfZXZlbnQgZXZlbnRzW21heEV2ZW50c107CisKKyAgICBzdGQ6Omxpc3Q8Q29ubmVjdGlvbio+IHRvQmVEZWxldGVkOworICAgIGludCBudW1FdmVudHMgPSBlcG9sbF93YWl0KF9lcG9sbEZkLCBldmVudHMsIG1heEV2ZW50cywgZXBvbGxNaWxsaXMpOworICAgIGlmIChudW1FdmVudHMgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CisgICAgICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiRXJyb3IgZnJvbSBlcG9sbF93YWl0OiAiIDw8IGdldExhc3RFcnJvcigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChudW1FdmVudHMgPT0gbWF4RXZlbnRzKSB7CisgICAgICAgIHN0YXRpYyB0aW1lX3QgbGFzdFdhcm5UaW1lID0gMDsKKyAgICAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgICAgICAgIGlmIChub3cgLSBsYXN0V2FyblRpbWUgPj0gNjApIHsKKyAgICAgICAgICAgIExTX1dBUk5JTkcoX2xvZ2dlciwgIkZ1bGwgZXZlbnQgcXVldWU7IG1heSBzdGFydCBzdGFydmluZyBjb25uZWN0aW9ucy4gIgorICAgICAgICAgICAgICAgICAgICAiV2lsbCB3YXJuIGF0IG1vc3Qgb25jZSBhIG1pbnV0ZSIpOworICAgICAgICAgICAgbGFzdFdhcm5UaW1lID0gbm93OworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRXZlbnRzOyArK2kpIHsKKyAgICAgICAgaWYgKGV2ZW50c1tpXS5kYXRhLnB0ciA9PSB0aGlzKSB7CisgICAgICAgICAgICBpZiAoZXZlbnRzW2ldLmV2ZW50cyAmIH5FUE9MTElOKSB7CisgICAgICAgICAgICAgICAgTFNfU0VWRVJFKF9sb2dnZXIsICJHb3QgdW5leHBlY3RlZCBldmVudCBvbiBsaXN0ZW5pbmcgc29ja2V0ICgiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBFdmVudEJpdHMoZXZlbnRzW2ldLmV2ZW50cykgPDwgIikgLSB0ZXJtaW5hdGluZyIpOworICAgICAgICAgICAgICAgIF90ZXJtaW5hdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlQWNjZXB0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW2ldLmRhdGEucHRyID09ICZfZXZlbnRGZCkgeworICAgICAgICAgICAgaWYgKGV2ZW50c1tpXS5ldmVudHMgJiB+RVBPTExJTikgeworICAgICAgICAgICAgICAgIExTX1NFVkVSRShfbG9nZ2VyLCAiR290IHVuZXhwZWN0ZWQgZXZlbnQgb24gbWFuYWdlbWVudCBwaXBlICgiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBFdmVudEJpdHMoZXZlbnRzW2ldLmV2ZW50cykgPDwgIikgLSB0ZXJtaW5hdGluZyIpOworICAgICAgICAgICAgICAgIF90ZXJtaW5hdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlUGlwZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXV0byBjb25uZWN0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxDb25uZWN0aW9uKj4oZXZlbnRzW2ldLmRhdGEucHRyKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVDb25uZWN0aW9uRXZlbnRzKGNvbm5lY3Rpb24sIGV2ZW50c1tpXS5ldmVudHMpID09IENsb3NlKSB7CisgICAgICAgICAgICAgICAgdG9CZURlbGV0ZWQucHVzaF9iYWNrKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFRoZSBjb25uZWN0aW9ucyBhcmUgYWxsIGRlbGV0ZWQgYXQgdGhlIGVuZCBzbyB3ZSd2ZSBwcm9jZXNzZWQgYW55IG90aGVyIHN1YmplY3QncworICAgIC8vIGNsb3NlcyBldGMgYmVmb3JlIHdlIGNhbGwgb25EaXNjb25uZWN0KCkuCisgICAgZm9yIChhdXRvIGl0ID0gdG9CZURlbGV0ZWQuYmVnaW4oKTsgaXQgIT0gdG9CZURlbGV0ZWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgYXV0byBjb25uZWN0aW9uID0gKml0OworICAgICAgICBpZiAoX2Nvbm5lY3Rpb25zLmZpbmQoY29ubmVjdGlvbikgPT0gX2Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBMU19TRVZFUkUoX2xvZ2dlciwgIkF0dGVtcHQgdG8gZGVsZXRlIGNvbm5lY3Rpb24gd2UgZGlkbid0IGtub3cgYWJvdXQ6ICIgPDwgKHZvaWQqKWNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgPDwgZm9ybWF0QWRkcmVzcyhjb25uZWN0aW9uLT5nZXRSZW1vdGVBZGRyZXNzKCkpKTsKKyAgICAgICAgICAgIF90ZXJtaW5hdGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgTFNfREVCVUcoX2xvZ2dlciwgIkRlbGV0aW5nIGNvbm5lY3Rpb246ICIgPDwgZm9ybWF0QWRkcmVzcyhjb25uZWN0aW9uLT5nZXRSZW1vdGVBZGRyZXNzKCkpKTsKKyAgICAgICAgZGVsZXRlIGNvbm5lY3Rpb247CisgICAgfQorfQorCit2b2lkIFNlcnZlcjo6c2V0U3RhdGljUGF0aChjb25zdCBjaGFyKiBzdGF0aWNQYXRoKSB7CisgICAgTFNfSU5GTyhfbG9nZ2VyLCAiU2VydmluZyBjb250ZW50IGZyb20gIiA8PCBzdGF0aWNQYXRoKTsKKyAgICBfc3RhdGljUGF0aCA9IHN0YXRpY1BhdGg7Cit9CisKK2Jvb2wgU2VydmVyOjpzZXJ2ZShjb25zdCBjaGFyKiBzdGF0aWNQYXRoLCBpbnQgcG9ydCkgeworICAgIHNldFN0YXRpY1BhdGgoc3RhdGljUGF0aCk7CisgICAgaWYgKCFzdGFydExpc3RlbmluZyhwb3J0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGxvb3AoKTsKK30KKworYm9vbCBTZXJ2ZXI6Omxvb3AoKSB7CisgICAgaWYgKF9saXN0ZW5Tb2NrID09IC0xKSB7CisgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJTZXJ2ZXIgbm90IGluaXRpYWxpc2VkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTdGFzaCBhd2F5ICJ0aGUiIHNlcnZlciB0aHJlYWQgaWQuCisgICAgX3RocmVhZElkID0gZ2V0dGlkKCk7CisKKyAgICB3aGlsZSAoIV90ZXJtaW5hdGUpIHsKKyAgICAgICAgLy8gQWx3YXlzIHByb2Nlc3MgZXZlbnRzIGZpcnN0IHRvIGNhdGNoIHN0YXJ0IHVwIGV2ZW50cy4KKyAgICAgICAgcHJvY2Vzc0V2ZW50UXVldWUoKTsKKyAgICAgICAgY2hlY2tBbmREaXNwYXRjaEVwb2xsKEVwb2xsVGltZW91dE1pbGxpcyk7CisgICAgfQorICAgIC8vIFJlYXNvbmFibGUgZWZmb3J0IHRvIGVuc3VyZSBhbnl0aGluZyBlbnF1ZXVlZCBkdXJpbmcgdGVybWluYXRlIGhhcyBhIGNoYW5jZSB0byBydW4uCisgICAgcHJvY2Vzc0V2ZW50UXVldWUoKTsKKyAgICBMU19JTkZPKF9sb2dnZXIsICJTZXJ2ZXIgdGVybWluYXRpbmciKTsKKyAgICBzaHV0ZG93bigpOworICAgIHJldHVybiBfZXhwZWN0ZWRUZXJtaW5hdGU7Cit9CisKK1NlcnZlcjo6UG9sbFJlc3VsdCBTZXJ2ZXI6OnBvbGwoaW50IG1pbGxpcykgeworICAgIC8vIEdyYWIgdGhlIHRocmVhZCBJRCBvbiB0aGUgZmlyc3QgcG9sbC4KKyAgICBpZiAoX3RocmVhZElkID09IDApIF90aHJlYWRJZCA9IGdldHRpZCgpOworICAgIGlmIChfdGhyZWFkSWQgIT0gZ2V0dGlkKCkpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgInBvbGwoKSBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgdGhyZWFkIik7CisgICAgICAgIHJldHVybiBQb2xsUmVzdWx0OjpFcnJvcjsKKyAgICB9CisgICAgaWYgKF9saXN0ZW5Tb2NrID09IC0xKSB7CisgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJTZXJ2ZXIgbm90IGluaXRpYWxpc2VkIik7CisgICAgICAgIHJldHVybiBQb2xsUmVzdWx0OjpFcnJvcjsKKyAgICB9CisgICAgcHJvY2Vzc0V2ZW50UXVldWUoKTsKKyAgICBjaGVja0FuZERpc3BhdGNoRXBvbGwobWlsbGlzKTsKKyAgICBpZiAoIV90ZXJtaW5hdGUpIHJldHVybiBQb2xsUmVzdWx0OjpDb250aW51ZTsKKworICAgIC8vIFJlYXNvbmFibGUgZWZmb3J0IHRvIGVuc3VyZSBhbnl0aGluZyBlbnF1ZXVlZCBkdXJpbmcgdGVybWluYXRlIGhhcyBhIGNoYW5jZSB0byBydW4uCisgICAgcHJvY2Vzc0V2ZW50UXVldWUoKTsKKyAgICBMU19JTkZPKF9sb2dnZXIsICJTZXJ2ZXIgdGVybWluYXRpbmciKTsKKyAgICBzaHV0ZG93bigpOworCisgICAgcmV0dXJuIF9leHBlY3RlZFRlcm1pbmF0ZSA/IFBvbGxSZXN1bHQ6OlRlcm1pbmF0ZWQgOiBQb2xsUmVzdWx0OjpFcnJvcjsKK30KKwordm9pZCBTZXJ2ZXI6OnByb2Nlc3NFdmVudFF1ZXVlKCkgeworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSA9IHBvcE5leHRSdW5uYWJsZSgpOworICAgICAgICBpZiAoIXJ1bm5hYmxlKSBicmVhazsKKyAgICAgICAgcnVubmFibGUtPnJ1bigpOworICAgIH0KKyAgICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgICBpZiAobm93ID49IF9uZXh0RGVhZENvbm5lY3Rpb25DaGVjaykgeworICAgICAgICBzdGQ6Omxpc3Q8Q29ubmVjdGlvbio+IHRvUmVtb3ZlOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBfY29ubmVjdGlvbnMuY2JlZ2luKCk7IGl0ICE9IF9jb25uZWN0aW9ucy5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIHRpbWVfdCBudW1TZWNvbmRzU2luY2VDb25uZWN0aW9uID0gbm93IC0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIGF1dG8gY29ubmVjdGlvbiA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLT5ieXRlc1JlY2VpdmVkKCkgPT0gMCAmJiBudW1TZWNvbmRzU2luY2VDb25uZWN0aW9uID49IF9sYW1lQ29ubmVjdGlvblRpbWVvdXRTZWNvbmRzKSB7CisgICAgICAgICAgICAgICAgTFNfSU5GTyhfbG9nZ2VyLCBmb3JtYXRBZGRyZXNzKGNvbm5lY3Rpb24tPmdldFJlbW90ZUFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOiBLaWxsaW5nIGxhbWUgY29ubmVjdGlvbiAtIG5vIGJ5dGVzIHJlY2VpdmVkIGFmdGVyICIgPDwgbnVtU2Vjb25kc1NpbmNlQ29ubmVjdGlvbiA8PCAicyIpOworICAgICAgICAgICAgICAgIHRvUmVtb3ZlLnB1c2hfYmFjayhjb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gaXQgPSB0b1JlbW92ZS5iZWdpbigpOyBpdCAhPSB0b1JlbW92ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgZGVsZXRlICppdDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTZXJ2ZXI6OmhhbmRsZUFjY2VwdCgpIHsKKyAgICBzb2NrYWRkcl9pbiBhZGRyZXNzOworICAgIHNvY2tsZW5fdCBhZGRyTGVuID0gc2l6ZW9mKGFkZHJlc3MpOworICAgIGludCBmZCA9IDo6YWNjZXB0KF9saXN0ZW5Tb2NrLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcio+KCZhZGRyZXNzKSwKKyAgICAgICAgICAgICZhZGRyTGVuKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byBhY2NlcHQ6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghY29uZmlndXJlU29ja2V0KGZkKSkgeworICAgICAgICA6OmNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMU19JTkZPKF9sb2dnZXIsIGZvcm1hdEFkZHJlc3MoYWRkcmVzcykgPDwgIiA6IEFjY2VwdGVkIG9uIGRlc2NyaXB0b3IgIiA8PCBmZCk7CisgICAgQ29ubmVjdGlvbiogbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKF9sb2dnZXIsICp0aGlzLCBmZCwgYWRkcmVzcyk7CisgICAgZXBvbGxfZXZlbnQgZXZlbnQgPSB7IEVQT0xMSU4sIHsgbmV3Q29ubmVjdGlvbiB9IH07CisgICAgaWYgKGVwb2xsX2N0bChfZXBvbGxGZCwgRVBPTExfQ1RMX0FERCwgZmQsICZldmVudCkgPT0gLTEpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byBhZGQgc29ja2V0IHRvIGVwb2xsOiAiIDw8IGdldExhc3RFcnJvcigpKTsKKyAgICAgICAgZGVsZXRlIG5ld0Nvbm5lY3Rpb247CisgICAgICAgIDo6Y2xvc2UoZmQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9jb25uZWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIobmV3Q29ubmVjdGlvbiwgdGltZShOVUxMKSkpOworfQorCit2b2lkIFNlcnZlcjo6cmVtb3ZlKENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pIHsKKyAgICBjaGVja1RocmVhZCgpOworICAgIGVwb2xsX2V2ZW50IGV2ZW50ID0geyAwLCB7IGNvbm5lY3Rpb24gfSB9OworICAgIGlmIChlcG9sbF9jdGwoX2Vwb2xsRmQsIEVQT0xMX0NUTF9ERUwsIGNvbm5lY3Rpb24tPmdldEZkKCksICZldmVudCkgPT0gLTEpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byByZW1vdmUgZnJvbSBlcG9sbDogIiA8PCBnZXRMYXN0RXJyb3IoKSk7CisgICAgfQorICAgIF9jb25uZWN0aW9ucy5lcmFzZShjb25uZWN0aW9uKTsKK30KKworYm9vbCBTZXJ2ZXI6OnN1YnNjcmliZVRvV3JpdGVFdmVudHMoQ29ubmVjdGlvbiogY29ubmVjdGlvbikgeworICAgIGVwb2xsX2V2ZW50IGV2ZW50ID0geyBFUE9MTElOIHwgRVBPTExPVVQsIHsgY29ubmVjdGlvbiB9IH07CisgICAgaWYgKGVwb2xsX2N0bChfZXBvbGxGZCwgRVBPTExfQ1RMX01PRCwgY29ubmVjdGlvbi0+Z2V0RmQoKSwgJmV2ZW50KSA9PSAtMSkgeworICAgICAgICBMU19FUlJPUihfbG9nZ2VyLCAiVW5hYmxlIHRvIHN1YnNjcmliZSB0byB3cml0ZSBldmVudHM6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNlcnZlcjo6dW5zdWJzY3JpYmVGcm9tV3JpdGVFdmVudHMoQ29ubmVjdGlvbiogY29ubmVjdGlvbikgeworICAgIGVwb2xsX2V2ZW50IGV2ZW50ID0geyBFUE9MTElOLCB7IGNvbm5lY3Rpb24gfSB9OworICAgIGlmIChlcG9sbF9jdGwoX2Vwb2xsRmQsIEVQT0xMX0NUTF9NT0QsIGNvbm5lY3Rpb24tPmdldEZkKCksICZldmVudCkgPT0gLTEpIHsKKyAgICAgICAgTFNfRVJST1IoX2xvZ2dlciwgIlVuYWJsZSB0byB1bnN1YnNjcmliZSBmcm9tIHdyaXRlIGV2ZW50czogIiA8PCBnZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2VydmVyOjphZGRXZWJTb2NrZXRIYW5kbGVyKGNvbnN0IGNoYXIqIGVuZHBvaW50LCBzdGQ6OnNoYXJlZF9wdHI8V2ViU29ja2V0OjpIYW5kbGVyPiBoYW5kbGVyLAorICAgICAgICBib29sIGFsbG93Q3Jvc3NPcmlnaW5SZXF1ZXN0cykgeworICAgIF93ZWJTb2NrZXRIYW5kbGVyTWFwW2VuZHBvaW50XSA9IHsgaGFuZGxlciwgYWxsb3dDcm9zc09yaWdpblJlcXVlc3RzIH07Cit9CisKK3ZvaWQgU2VydmVyOjphZGRQYWdlSGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8UGFnZUhhbmRsZXI+IGhhbmRsZXIpIHsKKyAgICBfcGFnZUhhbmRsZXJzLmVtcGxhY2VfYmFjayhoYW5kbGVyKTsKK30KKworYm9vbCBTZXJ2ZXI6OmlzQ3Jvc3NPcmlnaW5BbGxvd2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZlbmRwb2ludCkgY29uc3QgeworICAgIGF1dG8gc3BsaXRzID0gc3BsaXQoZW5kcG9pbnQsICc/Jyk7CisgICAgYXV0byBpdGVyID0gX3dlYlNvY2tldEhhbmRsZXJNYXAuZmluZChzcGxpdHNbMF0pOworICAgIGlmIChpdGVyID09IF93ZWJTb2NrZXRIYW5kbGVyTWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGl0ZXItPnNlY29uZC5hbGxvd0Nyb3NzT3JpZ2luOworfQorCitzdGQ6OnNoYXJlZF9wdHI8V2ViU29ja2V0OjpIYW5kbGVyPiBTZXJ2ZXI6OmdldFdlYlNvY2tldEhhbmRsZXIoY29uc3QgY2hhciogZW5kcG9pbnQpIGNvbnN0IHsKKyAgICBhdXRvIHNwbGl0cyA9IHNwbGl0KGVuZHBvaW50LCAnPycpOworICAgIGF1dG8gaXRlciA9IF93ZWJTb2NrZXRIYW5kbGVyTWFwLmZpbmQoc3BsaXRzWzBdKTsKKyAgICBpZiAoaXRlciA9PSBfd2ViU29ja2V0SGFuZGxlck1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFdlYlNvY2tldDo6SGFuZGxlcj4oKTsKKyAgICB9CisgICAgcmV0dXJuIGl0ZXItPnNlY29uZC5oYW5kbGVyOworfQorCit2b2lkIFNlcnZlcjo6ZXhlY3V0ZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxkZWNsdHlwZShfcGVuZGluZ1J1bm5hYmxlTXV0ZXgpPiBsb2NrKF9wZW5kaW5nUnVubmFibGVNdXRleCk7CisgICAgX3BlbmRpbmdSdW5uYWJsZXMucHVzaF9iYWNrKHJ1bm5hYmxlKTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgdWludDY0X3Qgb25lID0gMTsKKyAgICBpZiAoX2V2ZW50RmQgIT0gLTEgJiYgOjp3cml0ZShfZXZlbnRGZCwgJm9uZSwgc2l6ZW9mKG9uZSkpID09IC0xKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgIExTX0VSUk9SKF9sb2dnZXIsICJVbmFibGUgdG8gcG9zdCBhIHdha2UgZXZlbnQ6ICIgPDwgZ2V0TGFzdEVycm9yKCkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8U2VydmVyOjpSdW5uYWJsZT4gU2VydmVyOjpwb3BOZXh0UnVubmFibGUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPGRlY2x0eXBlKF9wZW5kaW5nUnVubmFibGVNdXRleCk+IGxvY2soX3BlbmRpbmdSdW5uYWJsZU11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlOworICAgIGlmICghX3BlbmRpbmdSdW5uYWJsZXMuZW1wdHkoKSkgeworICAgICAgICBydW5uYWJsZSA9IF9wZW5kaW5nUnVubmFibGVzLmZyb250KCk7CisgICAgICAgIF9wZW5kaW5nUnVubmFibGVzLnBvcF9mcm9udCgpOworICAgIH0KKyAgICByZXR1cm4gcnVubmFibGU7Cit9CisKK3N0ZDo6c3RyaW5nIFNlcnZlcjo6Z2V0U3RhdHNEb2N1bWVudCgpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gZG9jOworICAgIGRvYyA8PCAiY2xlYXIoKTsiIDw8IHN0ZDo6ZW5kbDsKKyAgICBmb3IgKGF1dG8gaXQgPSBfY29ubmVjdGlvbnMuYmVnaW4oKTsgaXQgIT0gX2Nvbm5lY3Rpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGRvYyA8PCAiY29ubmVjdGlvbih7IjsKKyAgICAgICAgYXV0byBjb25uZWN0aW9uID0gaXQtPmZpcnN0OworICAgICAgICBqc29uS2V5UGFpclRvU3RyZWFtKGRvYywKKyAgICAgICAgICAgICAgICAic2luY2UiLCBFcG9jaFRpbWVBc0xvY2FsKGl0LT5zZWNvbmQpLAorICAgICAgICAgICAgICAgICJmZCIsIGNvbm5lY3Rpb24tPmdldEZkKCksCisgICAgICAgICAgICAgICAgImlkIiwgcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdD4oY29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgInVyaSIsIGNvbm5lY3Rpb24tPmdldFJlcXVlc3RVcmkoKSwKKyAgICAgICAgICAgICAgICAiYWRkciIsIGZvcm1hdEFkZHJlc3MoY29ubmVjdGlvbi0+Z2V0UmVtb3RlQWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICAidXNlciIsIGNvbm5lY3Rpb24tPmNyZWRlbnRpYWxzKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+Y3JlZGVudGlhbHMoKS0+dXNlcm5hbWUgOiAiKG5vdCBhdXRoZWQpIiwKKyAgICAgICAgICAgICAgICAiaW5wdXQiLCBjb25uZWN0aW9uLT5pbnB1dEJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAicmVhZCIsIGNvbm5lY3Rpb24tPmJ5dGVzUmVjZWl2ZWQoKSwKKyAgICAgICAgICAgICAgICAib3V0cHV0IiwgY29ubmVjdGlvbi0+b3V0cHV0QnVmZmVyU2l6ZSgpLAorICAgICAgICAgICAgICAgICJ3cml0dGVuIiwgY29ubmVjdGlvbi0+Ynl0ZXNTZW50KCkKKyAgICAgICAgKTsKKyAgICAgICAgZG9jIDw8ICJ9KTsiIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgICAgcmV0dXJuIGRvYy5zdHIoKTsKK30KKwordm9pZCBTZXJ2ZXI6OnNldExhbWVDb25uZWN0aW9uVGltZW91dFNlY29uZHMoaW50IHNlY29uZHMpIHsKKyAgICBMU19JTkZPKF9sb2dnZXIsICJTZXR0aW5nIGxhbWUgY29ubmVjdGlvbiB0aW1lb3V0IHRvICIgPDwgc2Vjb25kcyk7CisgICAgX2xhbWVDb25uZWN0aW9uVGltZW91dFNlY29uZHMgPSBzZWNvbmRzOworfQorCit2b2lkIFNlcnZlcjo6c2V0TWF4S2VlcEFsaXZlRHJvcHMoaW50IG1heEtlZXBBbGl2ZURyb3BzKSB7CisgICAgTFNfSU5GTyhfbG9nZ2VyLCAiU2V0dGluZyBtYXgga2VlcCBhbGl2ZSBkcm9wcyB0byAiIDw8IG1heEtlZXBBbGl2ZURyb3BzKTsKKyAgICBfbWF4S2VlcEFsaXZlRHJvcHMgPSBtYXhLZWVwQWxpdmVEcm9wczsKK30KKwordm9pZCBTZXJ2ZXI6OmNoZWNrVGhyZWFkKCkgY29uc3QgeworICAgIGF1dG8gdGhpc1RpZCA9IGdldHRpZCgpOworICAgIGlmICh0aGlzVGlkICE9IF90aHJlYWRJZCkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgICAgICAgbyA8PCAic2Vhc29ja3MgY2FsbGVkIG9uIHdyb25nIHRocmVhZCA6ICIgPDwgdGhpc1RpZCA8PCAiIGluc3RlYWQgb2YgIiA8PCBfdGhyZWFkSWQ7CisgICAgICAgIExTX1NFVkVSRShfbG9nZ2VyLCBvLnN0cigpKTsKKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKG8uc3RyKCkpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBTZXJ2ZXI6OmhhbmRsZShjb25zdCBSZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgZm9yIChhdXRvIGhhbmRsZXIgOiBfcGFnZUhhbmRsZXJzKSB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gaGFuZGxlci0+aGFuZGxlKHJlcXVlc3QpOworICAgICAgICBpZiAocmVzdWx0ICE9IFJlc3BvbnNlOjp1bmhhbmRsZWQoKSkgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIFJlc3BvbnNlOjp1bmhhbmRsZWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNlYXNvY2tzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL1N0cmluZ1V0aWwuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9TdHJpbmdVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzE3N2NlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9TdHJpbmdVdGlsLmNwcApAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAic2Vhc29ja3MvU3RyaW5nVXRpbC5oIgorCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCitjaGFyKiBza2lwV2hpdGVzcGFjZShjaGFyKiBzdHIpIHsKKyAgICB3aGlsZSAoaXNzcGFjZSgqc3RyKSkgKytzdHI7CisgICAgcmV0dXJuIHN0cjsKK30KKworY2hhciogc2tpcE5vbldoaXRlc3BhY2UoY2hhciogc3RyKSB7CisgICAgd2hpbGUgKCpzdHIgJiYgIWlzc3BhY2UoKnN0cikpIHsKKyAgICAgICAgKytzdHI7CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKK2NoYXIqIHNoaWZ0KGNoYXIqJiBzdHIpIHsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNoYXIqIHN0YXJ0T2ZXb3JkID0gc2tpcFdoaXRlc3BhY2Uoc3RyKTsKKyAgICBpZiAoKnN0YXJ0T2ZXb3JkID09IDApIHsKKyAgICAgICAgc3RyID0gc3RhcnRPZldvcmQ7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjaGFyKiBlbmRPZldvcmQgPSBza2lwTm9uV2hpdGVzcGFjZShzdGFydE9mV29yZCk7CisgICAgaWYgKCplbmRPZldvcmQgIT0gMCkgeworICAgICAgICAqZW5kT2ZXb3JkKysgPSAwOworICAgIH0KKyAgICBzdHIgPSBlbmRPZldvcmQ7CisgICAgcmV0dXJuIHN0YXJ0T2ZXb3JkOworfQorCitzdGQ6OnN0cmluZyBnZXRMYXN0RXJyb3IoKXsKKyAgICBjaGFyIGVycmJ1ZlsxMDI0XTsKKyAgICByZXR1cm4gc3RyZXJyb3JfcihlcnJubywgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSk7Cit9CisKK3N0ZDo6c3RyaW5nIGZvcm1hdEFkZHJlc3MoY29uc3Qgc29ja2FkZHJfaW4mIGFkZHJlc3MpIHsKKyAgICBjaGFyIGlwQnVmZmVyWzI0XTsKKyAgICBzcHJpbnRmKGlwQnVmZmVyLAorICAgICAgICAgICAgIiVkLiVkLiVkLiVkOiVkIiwKKyAgICAgICAgICAgIChhZGRyZXNzLnNpbl9hZGRyLnNfYWRkciA+PiAwKSAmIDB4ZmYsCisgICAgICAgICAgICAoYWRkcmVzcy5zaW5fYWRkci5zX2FkZHIgPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgKGFkZHJlc3Muc2luX2FkZHIuc19hZGRyID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAoYWRkcmVzcy5zaW5fYWRkci5zX2FkZHIgPj4gMjQpICYgMHhmZiwKKyAgICAgICAgICAgIGh0b25zKGFkZHJlc3Muc2luX3BvcnQpKTsKKyAgICByZXR1cm4gaXBCdWZmZXI7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzcGxpdChjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsIGNoYXIgc3BsaXRDaGFyKSB7CisgICAgaWYgKGlucHV0LmVtcHR5KCkpIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVzdWx0OworICAgIHNpemVfdCBwb3MgPSAwOworICAgIHNpemVfdCBuZXdQb3M7CisgICAgd2hpbGUgKChuZXdQb3MgPSBpbnB1dC5maW5kKHNwbGl0Q2hhciwgcG9zKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhpbnB1dC5zdWJzdHIocG9zLCBuZXdQb3MgLSBwb3MpKTsKKyAgICAgICAgcG9zID0gbmV3UG9zICsgMTsKKyAgICB9CisgICAgcmVzdWx0LnB1c2hfYmFjayhpbnB1dC5zdWJzdHIocG9zKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCByZXBsYWNlKHN0ZDo6c3RyaW5nJiBzdHJpbmcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaW5kLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVwbGFjZSkgeworICAgIHNpemVfdCBwb3MgPSAwOworICAgIGNvbnN0IHNpemVfdCBmaW5kTGVuID0gZmluZC5sZW5ndGgoKTsKKyAgICBjb25zdCBzaXplX3QgcmVwbGFjZUxlbiA9IHJlcGxhY2UubGVuZ3RoKCk7CisgICAgd2hpbGUgKChwb3MgPSBzdHJpbmcuZmluZChmaW5kLCBwb3MpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyKDAsIHBvcykgKyByZXBsYWNlICsgc3RyaW5nLnN1YnN0cihwb3MgKyBmaW5kTGVuKTsKKyAgICAgICAgcG9zICs9IHJlcGxhY2VMZW47CisgICAgfQorfQorCitib29sIGNhc2VJbnNlbnNpdGl2ZVNhbWUoY29uc3Qgc3RkOjpzdHJpbmcgJmxocywgY29uc3Qgc3RkOjpzdHJpbmcgJnJocykgeworICAgIHJldHVybiBzdHJjYXNlY21wKGxocy5jX3N0cigpLCByaHMuY19zdHIoKSkgPT0gMDsKK30KKworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC8uZ2l0aWdub3JlIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZWU0ODUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorL0NvbmZpZy5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0Jhc2U2NC5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0Jhc2U2NC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxY2YyMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvaW50ZXJuYWwvQmFzZTY0LmNwcApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJpbnRlcm5hbC9CYXNlNjQuaCIKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK2NvbnN0IGNoYXIgY2I2NFtdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworc3RkOjpzdHJpbmcgYmFzZTY0RW5jb2RlKGNvbnN0IHZvaWQqIGRhdGFWb2lkLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0OworICAgIGF1dG8gZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGFWb2lkKTsKKyAgICBmb3IgKGF1dG8gaSA9IDB1OyBpIDwgbGVuZ3RoOyBpICs9IDMpIHsKKyAgICAgICAgYXV0byBieXRlc0xlZnQgPSBsZW5ndGggLSBpOworICAgICAgICBhdXRvIGIwID0gZGF0YVtpXTsKKyAgICAgICAgYXV0byBiMSA9IGJ5dGVzTGVmdCA+IDEgPyBkYXRhW2kgKyAxXSA6IDA7CisgICAgICAgIGF1dG8gYjIgPSBieXRlc0xlZnQgPiAyID8gZGF0YVtpICsgMl0gOiAwOworICAgICAgICBvdXRwdXQucHVzaF9iYWNrKGNiNjRbYjAgPj4gMl0pOworICAgICAgICBvdXRwdXQucHVzaF9iYWNrKGNiNjRbKChiMCAmIDB4MDMpIDw8IDQpIHwgKChiMSAmIDB4ZjApID4+IDQpXSk7CisgICAgICAgIG91dHB1dC5wdXNoX2JhY2soKGJ5dGVzTGVmdCA+IDEgPyBjYjY0WygoYjEgJiAweDBmKSA8PCAyKSB8ICgoYjIgJiAweGMwKSA+PiA2KV0gOiAnPScpKTsKKyAgICAgICAgb3V0cHV0LnB1c2hfYmFjaygoYnl0ZXNMZWZ0ID4gMiA/IGNiNjRbYjIgJiAweDNmXSA6ICc9JykpOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCit9IC8vIG5hbWVzcGFjZSBzZWFzb2NrcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9CYXNlNjQuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvaW50ZXJuYWwvQmFzZTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkYzAxNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvaW50ZXJuYWwvQmFzZTY0LmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworZXh0ZXJuIHN0ZDo6c3RyaW5nIGJhc2U2NEVuY29kZShjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9Db25jcmV0ZVJlc3BvbnNlLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0NvbmNyZXRlUmVzcG9uc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGE2OGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9Db25jcmV0ZVJlc3BvbnNlLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInNlYXNvY2tzL1Jlc3BvbnNlLmgiCisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK2NsYXNzIENvbmNyZXRlUmVzcG9uc2UgOiBwdWJsaWMgUmVzcG9uc2UgeworICAgIFJlc3BvbnNlQ29kZSBfcmVzcG9uc2VDb2RlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIF9wYXlsb2FkOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIF9jb250ZW50VHlwZTsKKyAgICBjb25zdCBIZWFkZXJzIF9oZWFkZXJzOworICAgIGNvbnN0IGJvb2wgX2tlZXBBbGl2ZTsKK3B1YmxpYzoKKyAgICBDb25jcmV0ZVJlc3BvbnNlKFJlc3BvbnNlQ29kZSByZXNwb25zZUNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXlsb2FkLCBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudFR5cGUsIGNvbnN0IEhlYWRlcnMmIGhlYWRlcnMsIGJvb2wga2VlcEFsaXZlKSA6CisgICAgICAgIF9yZXNwb25zZUNvZGUocmVzcG9uc2VDb2RlKSwgX3BheWxvYWQocGF5bG9hZCksIF9jb250ZW50VHlwZShjb250ZW50VHlwZSksIF9oZWFkZXJzKGhlYWRlcnMpLCBfa2VlcEFsaXZlKGtlZXBBbGl2ZSkge30KKworICAgIHZpcnR1YWwgUmVzcG9uc2VDb2RlIHJlc3BvbnNlQ29kZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9yZXNwb25zZUNvZGU7CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiBwYXlsb2FkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX3BheWxvYWQuY19zdHIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCBwYXlsb2FkU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9wYXlsb2FkLnNpemUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wga2VlcENvbm5lY3Rpb25BbGl2ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9rZWVwQWxpdmU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBjb250ZW50VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9jb250ZW50VHlwZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEhlYWRlcnMgZ2V0QWRkaXRpb25hbEhlYWRlcnMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfaGVhZGVyczsKKyAgICB9Cit9OworCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0NvbmZpZy5oLmluIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9Db25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGM1NDIxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9Db25maWcuaC5pbgpAQCAtMCwwICsxLDIxOSBAQAorLyogc3JjL21haW4vYy9pbnRlcm5hbC9Db25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhcnBhL2luZXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9BUlBBX0lORVRfSAorCisvKiBkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGJhc2ljIEMrKzExIHN5bnRheCAqLworI3VuZGVmIEhBVkVfQ1hYMTEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBzdHJlcnJvcl9yJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfU1RSRVJST1JfUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGR1cDInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRFVQMgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGV2ZW50ZmQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRVZFTlRGRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRkNOVExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZvcmsnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRk9SSworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RuYW1lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEhPU1ROQU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0b3B0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVE9QVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGdldG9wdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0dFVE9QVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JTlRUWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciBzeXN0ZW0gaGFzIGEgR05VIGxpYmMgY29tcGF0aWJsZSBgbWFsbG9jJyBmdW5jdGlvbiwgYW5kCisgICB0byAwIG90aGVyd2lzZS4gKi8KKyN1bmRlZiBIQVZFX01BTExPQworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01FTVNFVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaW4uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRJTkVUX0lOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHB0cmRpZmZfdCcuICovCisjdW5kZWYgSEFWRV9QVFJESUZGX1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBybWRpcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9STURJUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TT0NLRVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzcXJ0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NRUlQKKworLyogRGVmaW5lIHRvIDEgaWYgc3RkYm9vbC5oIGNvbmZvcm1zIHRvIEM5OS4gKi8KKyN1bmRlZiBIQVZFX1NUREJPT0xfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURERFRl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNhc2VjbXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNocicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJkdXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSRFVQCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3InIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSRVJST1IKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJlcnJvcl9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkVSUk9SX1IKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzeXNjYWxsJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NZU0NBTEwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfSU9DVExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU09DS0VUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TVEFUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIGRlZmluZSBpZiB1bm9yZGVyZWRfbWFwIHN1cHBvcnRzIGVtcGxhY2UgKi8KKyN1bmRlZiBIQVZFX1VOT1JERVJFRF9NQVBfRU1QTEFDRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZmb3JrJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1ZGT1JLCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dmZvcmsuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9WRk9SS19ICisKKy8qIERlZmluZSB0byAxIGlmIGBmb3JrJyB3b3Jrcy4gKi8KKyN1bmRlZiBIQVZFX1dPUktJTkdfRk9SSworCisvKiBEZWZpbmUgdG8gMSBpZiBgdmZvcmsnIHdvcmtzLiAqLworI3VuZGVmIEhBVkVfV09SS0lOR19WRk9SSworCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgX0Jvb2wnLiAqLworI3VuZGVmIEhBVkVfX0JPT0wKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLiAqLworI3VuZGVmIFNUUkVSUk9SX1JfQ0hBUl9QCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDMyX3QgdHlwZWRlZiBmcm9tIDxzeXMvc3luY2guaD4sCisgICA8cHRocmVhZC5oPiwgb3IgPHNlbWFwaG9yZS5oPiBpcyBub3QgdXNlZC4gSWYgdGhlIHR5cGVkZWYgd2VyZSBhbGxvd2VkLCB0aGUKKyAgICNkZWZpbmUgYmVsb3cgd291bGQgY2F1c2UgYSBzeW50YXggZXJyb3IuICovCisjdW5kZWYgX1VJTlQzMl9UCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDY0X3QgdHlwZWRlZiBmcm9tIDxzeXMvc3luY2guaD4sCisgICA8cHRocmVhZC5oPiwgb3IgPHNlbWFwaG9yZS5oPiBpcyBub3QgdXNlZC4gSWYgdGhlIHR5cGVkZWYgd2VyZSBhbGxvd2VkLCB0aGUKKyAgICNkZWZpbmUgYmVsb3cgd291bGQgY2F1c2UgYSBzeW50YXggZXJyb3IuICovCisjdW5kZWYgX1VJTlQ2NF9UCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDhfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKyN1bmRlZiBfVUlOVDhfVAorCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworI3VuZGVmIGlubGluZQorI2VuZGlmCisKKy8qIERlZmluZSB0byBycGxfbWFsbG9jIGlmIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4gKi8KKyN1bmRlZiBtYWxsb2MKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHBpZF90CisKKy8qIERlZmluZSB0byB0aGUgZXF1aXZhbGVudCBvZiB0aGUgQzk5ICdyZXN0cmljdCcga2V5d29yZCwgb3IgdG8KKyAgIG5vdGhpbmcgaWYgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAgRG8gbm90IGRlZmluZSBpZiByZXN0cmljdCBpcworICAgc3VwcG9ydGVkIGRpcmVjdGx5LiAgKi8KKyN1bmRlZiByZXN0cmljdAorLyogV29yayBhcm91bmQgYSBidWcgaW4gU3VuIEMrKzogaXQgZG9lcyBub3Qgc3VwcG9ydCBfUmVzdHJpY3Qgb3IKKyAgIF9fcmVzdHJpY3RfXywgZXZlbiB0aG91Z2ggdGhlIGNvcnJlc3BvbmRpbmcgU3VuIEMgY29tcGlsZXIgZW5kcyB1cCB3aXRoCisgICAiI2RlZmluZSByZXN0cmljdCBfUmVzdHJpY3QiIG9yICIjZGVmaW5lIHJlc3RyaWN0IF9fcmVzdHJpY3RfXyIgaW4gdGhlCisgICBwcmV2aW91cyBsaW5lLiAgUGVyaGFwcyBzb21lIGZ1dHVyZSB2ZXJzaW9uIG9mIFN1biBDKysgd2lsbCB3b3JrIHdpdGgKKyAgIHJlc3RyaWN0OyBpZiBzbywgaG9wZWZ1bGx5IGl0IGRlZmluZXMgX19SRVNUUklDVCBsaWtlIFN1biBDIGRvZXMuICAqLworI2lmIGRlZmluZWQgX19TVU5QUk9fQ0MgJiYgIWRlZmluZWQgX19SRVNUUklDVAorIyBkZWZpbmUgX1Jlc3RyaWN0CisjIGRlZmluZSBfX3Jlc3RyaWN0X18KKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgc2l6ZV90CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAxNiBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworI3VuZGVmIHVpbnQxNl90CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAzMiBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworI3VuZGVmIHVpbnQzMl90CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA2NCBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworI3VuZGVmIHVpbnQ2NF90CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA4IGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgdWludDhfdAorCisvKiBEZWZpbmUgYXMgYGZvcmsnIGlmIGB2Zm9yaycgZG9lcyBub3Qgd29yay4gKi8KKyN1bmRlZiB2Zm9yawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9EZWJ1Zy5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9EZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGUxNDEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0RlYnVnLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworLy8gVW5jb21tZW50IHRvIGFjdHVhbGx5IGxvZyBhdCBERUJVRyBsZXZlbC4KKy8vI2RlZmluZSBMT0dfREVCVUdfSU5GTwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9FbWJlZGRlZC5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9FbWJlZGRlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDFjNjIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0VtYmVkZGVkLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKworc3RydWN0IEVtYmVkZGVkQ29udGVudCB7CisgICBjb25zdCBjaGFyKiBkYXRhOworICAgc2l6ZV90IGxlbmd0aDsKK307CisKK2NvbnN0IEVtYmVkZGVkQ29udGVudCogZmluZEVtYmVkZGVkQ29udGVudChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0hlYWRlck1hcC5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9IZWFkZXJNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTVlZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9IZWFkZXJNYXAuaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK3N0cnVjdCBDYXNlSW5zZW5zaXRpdmVIYXNoIHsKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyAmc3RyaW5nKSBjb25zdCB7CisgICAgICAgIHNpemVfdCBoID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGM6IHN0cmluZykgeworICAgICAgICAgICAgaCA9IGggKiAxMyArIHRvbG93ZXIoYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorfTsKKworc3RydWN0IENhc2VJbnNlbnNpdGl2ZUNvbXBhcmlzb24geworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyAmbGhzLCBjb25zdCBzdGQ6OnN0cmluZyAmcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdHJjYXNlY21wKGxocy5jX3N0cigpLCByaHMuY19zdHIoKSkgPT0gMDsKKyAgICB9Cit9OworCit1c2luZyBIZWFkZXJNYXAgPSBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLAorICAgICAgICBDYXNlSW5zZW5zaXRpdmVIYXNoLCBDYXNlSW5zZW5zaXRpdmVDb21wYXJpc29uPjsKKworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9IeWJpQWNjZXB0LmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0h5YmlBY2NlcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDI4MzNiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9IeWJpQWNjZXB0LmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdldEFjY2VwdEtleShjb25zdCBzdGQ6OnN0cmluZyYgY2hhbGxlbmdlKTsKKworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9IeWJpUGFja2V0RGVjb2Rlci5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9IeWJpUGFja2V0RGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGJiZjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0h5YmlQYWNrZXREZWNvZGVyLmgKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInNlYXNvY2tzL0xvZ2dlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK2NsYXNzIEh5YmlQYWNrZXREZWNvZGVyIHsKKyAgICBMb2dnZXImIF9sb2dnZXI7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIF9idWZmZXI7CisgICAgc2l6ZV90IF9tZXNzYWdlU3RhcnQ7CitwdWJsaWM6CisgICAgSHliaVBhY2tldERlY29kZXIoTG9nZ2VyJiBsb2dnZXIsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBidWZmZXIpOworCisgICAgZW51bSB7CisgICAgICAgIE9QQ09ERV9DT05UID0gMHgwLCAgLy8gRGVwcmVjYXRlZCBpbiBsYXRlc3QgaHliaSBzcGVjLCBoZXJlIGFueXdheS4KKyAgICAgICAgT1BDT0RFX1RFWFQgPSAweDEsCisgICAgICAgIE9QQ09ERV9CSU5BUlkgPSAweDIsCisgICAgICAgIE9QQ09ERV9DTE9TRSA9IDB4OCwKKyAgICAgICAgT1BDT0RFX1BJTkcgPSAweDksCisgICAgICAgIE9QQ09ERV9QT05HID0gMHhBLAorICAgIH07CisKKyAgICBlbnVtIE1lc3NhZ2VTdGF0ZSB7CisgICAgICAgIE5vTWVzc2FnZSwKKyAgICAgICAgVGV4dE1lc3NhZ2UsCisgICAgICAgIEJpbmFyeU1lc3NhZ2UsCisgICAgICAgIEVycm9yLAorICAgICAgICBQaW5nLAorICAgICAgICBDbG9zZQorICAgIH07CisgICAgTWVzc2FnZVN0YXRlIGRlY29kZU5leHRNZXNzYWdlKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlT3V0KTsKKworICAgIHNpemVfdCBudW1CeXRlc0RlY29kZWQoKSBjb25zdDsKK307CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvaW50ZXJuYWwvTG9nU3RyZWFtLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0xvZ1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjEyYmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL0xvZ1N0cmVhbS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJpbnRlcm5hbC9EZWJ1Zy5oIgorCisvLyBJbnRlcm5hbCBzdHJlYW0gaGVscGVycyBmb3IgbG9nZ2luZy4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjZGVmaW5lIExTX0xPRyhMT0csIExFVkVMLCBTVFVGRikgXAoreyBcCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG87IFwKKyAgICBvIDw8IFNUVUZGOyBcCisgICAgKExPRyktPmxvZyhMb2dnZXI6OkxFVkVMLCBvLnN0cigpLmNfc3RyKCkpOyBcCit9CisKKyNkZWZpbmUgTFNfREVCVUcoTE9HLCBTVFVGRikgICAgIExTX0xPRyhMT0csIERFQlVHLCBTVFVGRikKKyNkZWZpbmUgTFNfQUNDRVNTKExPRywgU1RVRkYpICAgICBMU19MT0coTE9HLCBBQ0NFU1MsIFNUVUZGKQorI2RlZmluZSBMU19JTkZPKExPRywgU1RVRkYpICAgICBMU19MT0coTE9HLCBJTkZPLCBTVFVGRikKKyNkZWZpbmUgTFNfV0FSTklORyhMT0csIFNUVUZGKSAgICAgTFNfTE9HKExPRywgV0FSTklORywgU1RVRkYpCisjZGVmaW5lIExTX0VSUk9SKExPRywgU1RVRkYpICAgICBMU19MT0coTE9HLCBFUlJPUiwgU1RVRkYpCisjZGVmaW5lIExTX1NFVkVSRShMT0csIFNUVUZGKSAgICAgTFNfTE9HKExPRywgU0VWRVJFLCBTVFVGRikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvaW50ZXJuYWwvUGFnZVJlcXVlc3QuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvaW50ZXJuYWwvUGFnZVJlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmVhN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9QYWdlUmVxdWVzdC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJpbnRlcm5hbC9IZWFkZXJNYXAuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9SZXF1ZXN0LmgiCisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgUGFnZVJlcXVlc3QgOiBwdWJsaWMgUmVxdWVzdCB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENyZWRlbnRpYWxzPiBfY3JlZGVudGlhbHM7CisgICAgY29uc3Qgc29ja2FkZHJfaW4gX3JlbW90ZUFkZHJlc3M7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgX3JlcXVlc3RVcmk7CisgICAgY29uc3QgVmVyYiBfdmVyYjsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBfY29udGVudDsKKyAgICBIZWFkZXJNYXAgX2hlYWRlcnM7CisgICAgY29uc3Qgc2l6ZV90IF9jb250ZW50TGVuZ3RoOworCitwdWJsaWM6CisgICAgUGFnZVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBzb2NrYWRkcl9pbiYgcmVtb3RlQWRkcmVzcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXF1ZXN0VXJpLAorICAgICAgICAgICAgVmVyYiB2ZXJiLAorICAgICAgICAgICAgSGVhZGVyTWFwJiYgaGVhZGVycyk7CisKKyAgICB2aXJ0dWFsIFZlcmIgdmVyYigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF92ZXJiOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPENyZWRlbnRpYWxzPiBjcmVkZW50aWFscygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9jcmVkZW50aWFsczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IHNvY2thZGRyX2luJiBnZXRSZW1vdGVBZGRyZXNzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX3JlbW90ZUFkZHJlc3M7CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0UmVxdWVzdFVyaSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9yZXF1ZXN0VXJpOworICAgIH0KKworICAgIHZpcnR1YWwgc2l6ZV90IGNvbnRlbnRMZW5ndGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfY29udGVudExlbmd0aDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGNvbnRlbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfY29udGVudExlbmd0aCA+IDAgPyAmX2NvbnRlbnRbMF0gOiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBoYXNIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9oZWFkZXJzLmZpbmQobmFtZSkgIT0gX2hlYWRlcnMuZW5kKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdGVyID0gX2hlYWRlcnMuZmluZChuYW1lKTsKKyAgICAgICAgcmV0dXJuIGl0ZXIgPT0gX2hlYWRlcnMuZW5kKCkgPyBzdGQ6OnN0cmluZygpIDogaXRlci0+c2Vjb25kOworICAgIH0KKworICAgIGJvb2wgY29uc3VtZUNvbnRlbnQoc3RkOjp2ZWN0b3I8dWludDhfdD4mIGJ1ZmZlcik7CisKKyAgICBpbnQgZ2V0SW50SGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzZWFzb2NrcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9WZXJzaW9uLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL2ludGVybmFsL1ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjZmOGVhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9pbnRlcm5hbC9WZXJzaW9uLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2lmbmRlZiBTRUFTT0NLU19WRVJTSU9OX1NUUklORworLy8gVGhpcyBzdG9wcyBFY2xpcHNlIGZyZWFraW5nIG91dCBhcyBpdCBkb2Vzbid0IGtub3cgdGhpcyBpcyBzZXQgb24gR0NDIGNvbW1hbmQgbGluZS4KKyNkZWZpbmUgU0VBU09DS1NfVkVSU0lPTl9TVFJJTkcgIlNlYVNvY2tzL3VudmVyc2lvbmVkIgorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9tZDUvbWQ1LmNwcCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvbWQ1L21kNS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkMzYwNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvbWQ1L21kNS5jcHAKQEAgLTAsMCArMSw0MTYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLyoKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBMLiBQZXRlciBEZXV0c2NoCisgIGdob3N0QGFsYWRkaW4uY29tCisKKyAqLworLyogJElkOiBtZDUuYyx2IDEuNiAyMDAyLzA0LzEzIDE5OjIwOjI4IGxwZCBFeHAgJCAqLworLyoKKyAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCisKKyAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKKyAgdGV4dCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAorICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCisgIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQorICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCisgIGNvcHlyaWdodGVkLgorCisgIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuYyBpcyBMLiBQZXRlciBEZXV0c2NoCisgIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKKyAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgorCisgIDIwMDItMDQtMTMgbHBkIENsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7IG5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIKKyAgICBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseTsgYWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RyaW5nLmg+CisgICAgaW4gbGlicmFyeS4KKyAgMjAwMi0wMy0xMSBscGQgQ29ycmVjdGVkIGFyZ3VtZW50IGxpc3QgZm9yIG1haW4oKSwgYW5kIGFkZGVkIGludCByZXR1cm4KKyAgICB0eXBlLCBpbiB0ZXN0IHByb2dyYW0gYW5kIFQgdmFsdWUgcHJvZ3JhbS4KKyAgMjAwMi0wMi0yMSBscGQgQWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RkaW8uaD4gaW4gdGVzdCBwcm9ncmFtLgorICAyMDAwLTA3LTAzIGxwZCBQYXRjaGVkIHRvIGVsaW1pbmF0ZSB3YXJuaW5ncyBhYm91dCAiY29uc3RhbnQgaXMKKyAgICB1bnNpZ25lZCBpbiBBTlNJIEMsIHNpZ25lZCBpbiB0cmFkaXRpb25hbCI7IG1hZGUgdGVzdCBwcm9ncmFtCisgICAgc2VsZi1jaGVja2luZy4KKyAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCisgIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSkuCisgIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgIm1kNS9tZDUuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjdW5kZWYgQllURV9PUkRFUiAgICAvKiAxID0gYmlnLWVuZGlhbiwgLTEgPSBsaXR0bGUtZW5kaWFuLCAwID0gdW5rbm93biAqLworI2lmZGVmIEFSQ0hfSVNfQklHX0VORElBTgorIyAgZGVmaW5lIEJZVEVfT1JERVIgKEFSQ0hfSVNfQklHX0VORElBTiA/IDEgOiAtMSkKKyNlbHNlCisjICBkZWZpbmUgQllURV9PUkRFUiAwCisjZW5kaWYKKworI2RlZmluZSBUX01BU0sgKChtZDVfd29yZF90KX4wKQorI2RlZmluZSBUMSAvKiAweGQ3NmFhNDc4ICovIChUX01BU0sgXiAweDI4OTU1Yjg3KQorI2RlZmluZSBUMiAvKiAweGU4YzdiNzU2ICovIChUX01BU0sgXiAweDE3Mzg0OGE5KQorI2RlZmluZSBUMyAgICAweDI0MjA3MGRiCisjZGVmaW5lIFQ0IC8qIDB4YzFiZGNlZWUgKi8gKFRfTUFTSyBeIDB4M2U0MjMxMTEpCisjZGVmaW5lIFQ1IC8qIDB4ZjU3YzBmYWYgKi8gKFRfTUFTSyBeIDB4MGE4M2YwNTApCisjZGVmaW5lIFQ2ICAgIDB4NDc4N2M2MmEKKyNkZWZpbmUgVDcgLyogMHhhODMwNDYxMyAqLyAoVF9NQVNLIF4gMHg1N2NmYjllYykKKyNkZWZpbmUgVDggLyogMHhmZDQ2OTUwMSAqLyAoVF9NQVNLIF4gMHgwMmI5NmFmZSkKKyNkZWZpbmUgVDkgICAgMHg2OTgwOThkOAorI2RlZmluZSBUMTAgLyogMHg4YjQ0ZjdhZiAqLyAoVF9NQVNLIF4gMHg3NGJiMDg1MCkKKyNkZWZpbmUgVDExIC8qIDB4ZmZmZjViYjEgKi8gKFRfTUFTSyBeIDB4MDAwMGE0NGUpCisjZGVmaW5lIFQxMiAvKiAweDg5NWNkN2JlICovIChUX01BU0sgXiAweDc2YTMyODQxKQorI2RlZmluZSBUMTMgICAgMHg2YjkwMTEyMgorI2RlZmluZSBUMTQgLyogMHhmZDk4NzE5MyAqLyAoVF9NQVNLIF4gMHgwMjY3OGU2YykKKyNkZWZpbmUgVDE1IC8qIDB4YTY3OTQzOGUgKi8gKFRfTUFTSyBeIDB4NTk4NmJjNzEpCisjZGVmaW5lIFQxNiAgICAweDQ5YjQwODIxCisjZGVmaW5lIFQxNyAvKiAweGY2MWUyNTYyICovIChUX01BU0sgXiAweDA5ZTFkYTlkKQorI2RlZmluZSBUMTggLyogMHhjMDQwYjM0MCAqLyAoVF9NQVNLIF4gMHgzZmJmNGNiZikKKyNkZWZpbmUgVDE5ICAgIDB4MjY1ZTVhNTEKKyNkZWZpbmUgVDIwIC8qIDB4ZTliNmM3YWEgKi8gKFRfTUFTSyBeIDB4MTY0OTM4NTUpCisjZGVmaW5lIFQyMSAvKiAweGQ2MmYxMDVkICovIChUX01BU0sgXiAweDI5ZDBlZmEyKQorI2RlZmluZSBUMjIgICAgMHgwMjQ0MTQ1MworI2RlZmluZSBUMjMgLyogMHhkOGExZTY4MSAqLyAoVF9NQVNLIF4gMHgyNzVlMTk3ZSkKKyNkZWZpbmUgVDI0IC8qIDB4ZTdkM2ZiYzggKi8gKFRfTUFTSyBeIDB4MTgyYzA0MzcpCisjZGVmaW5lIFQyNSAgICAweDIxZTFjZGU2CisjZGVmaW5lIFQyNiAvKiAweGMzMzcwN2Q2ICovIChUX01BU0sgXiAweDNjYzhmODI5KQorI2RlZmluZSBUMjcgLyogMHhmNGQ1MGQ4NyAqLyAoVF9NQVNLIF4gMHgwYjJhZjI3OCkKKyNkZWZpbmUgVDI4ICAgIDB4NDU1YTE0ZWQKKyNkZWZpbmUgVDI5IC8qIDB4YTllM2U5MDUgKi8gKFRfTUFTSyBeIDB4NTYxYzE2ZmEpCisjZGVmaW5lIFQzMCAvKiAweGZjZWZhM2Y4ICovIChUX01BU0sgXiAweDAzMTA1YzA3KQorI2RlZmluZSBUMzEgICAgMHg2NzZmMDJkOQorI2RlZmluZSBUMzIgLyogMHg4ZDJhNGM4YSAqLyAoVF9NQVNLIF4gMHg3MmQ1YjM3NSkKKyNkZWZpbmUgVDMzIC8qIDB4ZmZmYTM5NDIgKi8gKFRfTUFTSyBeIDB4MDAwNWM2YmQpCisjZGVmaW5lIFQzNCAvKiAweDg3NzFmNjgxICovIChUX01BU0sgXiAweDc4OGUwOTdlKQorI2RlZmluZSBUMzUgICAgMHg2ZDlkNjEyMgorI2RlZmluZSBUMzYgLyogMHhmZGU1MzgwYyAqLyAoVF9NQVNLIF4gMHgwMjFhYzdmMykKKyNkZWZpbmUgVDM3IC8qIDB4YTRiZWVhNDQgKi8gKFRfTUFTSyBeIDB4NWI0MTE1YmIpCisjZGVmaW5lIFQzOCAgICAweDRiZGVjZmE5CisjZGVmaW5lIFQzOSAvKiAweGY2YmI0YjYwICovIChUX01BU0sgXiAweDA5NDRiNDlmKQorI2RlZmluZSBUNDAgLyogMHhiZWJmYmM3MCAqLyAoVF9NQVNLIF4gMHg0MTQwNDM4ZikKKyNkZWZpbmUgVDQxICAgIDB4Mjg5YjdlYzYKKyNkZWZpbmUgVDQyIC8qIDB4ZWFhMTI3ZmEgKi8gKFRfTUFTSyBeIDB4MTU1ZWQ4MDUpCisjZGVmaW5lIFQ0MyAvKiAweGQ0ZWYzMDg1ICovIChUX01BU0sgXiAweDJiMTBjZjdhKQorI2RlZmluZSBUNDQgICAgMHgwNDg4MWQwNQorI2RlZmluZSBUNDUgLyogMHhkOWQ0ZDAzOSAqLyAoVF9NQVNLIF4gMHgyNjJiMmZjNikKKyNkZWZpbmUgVDQ2IC8qIDB4ZTZkYjk5ZTUgKi8gKFRfTUFTSyBeIDB4MTkyNDY2MWEpCisjZGVmaW5lIFQ0NyAgICAweDFmYTI3Y2Y4CisjZGVmaW5lIFQ0OCAvKiAweGM0YWM1NjY1ICovIChUX01BU0sgXiAweDNiNTNhOTlhKQorI2RlZmluZSBUNDkgLyogMHhmNDI5MjI0NCAqLyAoVF9NQVNLIF4gMHgwYmQ2ZGRiYikKKyNkZWZpbmUgVDUwICAgIDB4NDMyYWZmOTcKKyNkZWZpbmUgVDUxIC8qIDB4YWI5NDIzYTcgKi8gKFRfTUFTSyBeIDB4NTQ2YmRjNTgpCisjZGVmaW5lIFQ1MiAvKiAweGZjOTNhMDM5ICovIChUX01BU0sgXiAweDAzNmM1ZmM2KQorI2RlZmluZSBUNTMgICAgMHg2NTViNTljMworI2RlZmluZSBUNTQgLyogMHg4ZjBjY2M5MiAqLyAoVF9NQVNLIF4gMHg3MGYzMzM2ZCkKKyNkZWZpbmUgVDU1IC8qIDB4ZmZlZmY0N2QgKi8gKFRfTUFTSyBeIDB4MDAxMDBiODIpCisjZGVmaW5lIFQ1NiAvKiAweDg1ODQ1ZGQxICovIChUX01BU0sgXiAweDdhN2JhMjJlKQorI2RlZmluZSBUNTcgICAgMHg2ZmE4N2U0ZgorI2RlZmluZSBUNTggLyogMHhmZTJjZTZlMCAqLyAoVF9NQVNLIF4gMHgwMWQzMTkxZikKKyNkZWZpbmUgVDU5IC8qIDB4YTMwMTQzMTQgKi8gKFRfTUFTSyBeIDB4NWNmZWJjZWIpCisjZGVmaW5lIFQ2MCAgICAweDRlMDgxMWExCisjZGVmaW5lIFQ2MSAvKiAweGY3NTM3ZTgyICovIChUX01BU0sgXiAweDA4YWM4MTdkKQorI2RlZmluZSBUNjIgLyogMHhiZDNhZjIzNSAqLyAoVF9NQVNLIF4gMHg0MmM1MGRjYSkKKyNkZWZpbmUgVDYzICAgIDB4MmFkN2QyYmIKKyNkZWZpbmUgVDY0IC8qIDB4ZWI4NmQzOTEgKi8gKFRfTUFTSyBeIDB4MTQ3OTJjNmUpCisKKworc3RhdGljIHZvaWQKK21kNV9wcm9jZXNzKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEgLypbNjRdKi8pCit7CisgICAgbWQ1X3dvcmRfdAorICAgIGEgPSBwbXMtPmFiY2RbMF0sIGIgPSBwbXMtPmFiY2RbMV0sCisgICAgYyA9IHBtcy0+YWJjZFsyXSwgZCA9IHBtcy0+YWJjZFszXTsKKyAgICBtZDVfd29yZF90IHQ7CisjaWYgQllURV9PUkRFUiA+IDAKKyAgICAvKiBEZWZpbmUgc3RvcmFnZSBvbmx5IGZvciBiaWctZW5kaWFuIENQVXMuICovCisgICAgbWQ1X3dvcmRfdCBYWzE2XTsKKyNlbHNlCisgICAgLyogRGVmaW5lIHN0b3JhZ2UgZm9yIGxpdHRsZS1lbmRpYW4gb3IgYm90aCB0eXBlcyBvZiBDUFVzLiAqLworICAgIG1kNV93b3JkX3QgeGJ1ZlsxNl07CisgICAgY29uc3QgbWQ1X3dvcmRfdCAqWDsKKyNlbmRpZgorCisgICAgeworI2lmIEJZVEVfT1JERVIgPT0gMAorICAgIC8qCisgICAgICogRGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHdoZXRoZXIgdGhpcyBpcyBhIGJpZy1lbmRpYW4gb3IKKyAgICAgKiBsaXR0bGUtZW5kaWFuIG1hY2hpbmUsIHNpbmNlIHdlIGNhbiB1c2UgYSBtb3JlIGVmZmljaWVudAorICAgICAqIGFsZ29yaXRobSBvbiB0aGUgbGF0dGVyLgorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgdyA9IDE7CisKKyAgICBpZiAoKigoY29uc3QgbWQ1X2J5dGVfdCAqKSZ3KSkgLyogZHluYW1pYyBsaXR0bGUtZW5kaWFuICovCisjZW5kaWYKKyNpZiBCWVRFX09SREVSIDw9IDAgICAgICAgIC8qIGxpdHRsZS1lbmRpYW4gKi8KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHdlIGNhbiBwcm9jZXNzIHByb3Blcmx5IGFsaWduZWQKKyAgICAgICAgICogZGF0YSB3aXRob3V0IGNvcHlpbmcgaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoISgoZGF0YSAtIChjb25zdCBtZDVfYnl0ZV90ICopMCkgJiAzKSkgeworICAgICAgICAvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCisgICAgICAgIFggPSAoY29uc3QgbWQ1X3dvcmRfdCAqKWRhdGE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vdCBhbGlnbmVkICovCisgICAgICAgIG1lbWNweSh4YnVmLCBkYXRhLCA2NCk7CisgICAgICAgIFggPSB4YnVmOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisjaWYgQllURV9PUkRFUiA9PSAwCisgICAgZWxzZSAgICAgICAgICAgIC8qIGR5bmFtaWMgYmlnLWVuZGlhbiAqLworI2VuZGlmCisjaWYgQllURV9PUkRFUiA+PSAwICAgICAgICAvKiBiaWctZW5kaWFuICovCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBPbiBiaWctZW5kaWFuIG1hY2hpbmVzLCB3ZSBtdXN0IGFycmFuZ2UgdGhlIGJ5dGVzIGluIHRoZQorICAgICAgICAgKiByaWdodCBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IG1kNV9ieXRlX3QgKnhwID0gZGF0YTsKKyAgICAgICAgaW50IGk7CisKKyMgIGlmIEJZVEVfT1JERVIgPT0gMAorICAgICAgICBYID0geGJ1ZjsgICAgICAgIC8qIChkeW5hbWljIG9ubHkpICovCisjICBlbHNlCisjICAgIGRlZmluZSB4YnVmIFggICAgICAgIC8qIChzdGF0aWMgb25seSkgKi8KKyMgIGVuZGlmCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpLCB4cCArPSA0KQorICAgICAgICB4YnVmW2ldID0geHBbMF0gKyAoeHBbMV0gPDwgOCkgKyAoeHBbMl0gPDwgMTYpICsgKHhwWzNdIDw8IDI0KTsKKyAgICB9CisjZW5kaWYKKyAgICB9CisKKyNkZWZpbmUgUk9UQVRFX0xFRlQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpCisKKyAgICAvKiBSb3VuZCAxLiAqLworICAgIC8qIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KKyAgICAgICBhID0gYiArICgoYSArIEYoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KKyNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAofih4KSAmICh6KSkpCisjZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCisgIHQgPSBhICsgRihiLGMsZCkgKyBYW2tdICsgVGk7XAorICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCisgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLworICAgIFNFVChhLCBiLCBjLCBkLCAgMCwgIDcsICBUMSk7CisgICAgU0VUKGQsIGEsIGIsIGMsICAxLCAxMiwgIFQyKTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDIsIDE3LCAgVDMpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMywgMjIsICBUNCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNywgIFQ1KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDUsIDEyLCAgVDYpOworICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTcsICBUNyk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA3LCAyMiwgIFQ4KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDgsICA3LCAgVDkpOworICAgIFNFVChkLCBhLCBiLCBjLCAgOSwgMTIsIFQxMCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNywgVDExKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgMTEsIDIyLCBUMTIpOworICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDcsIFQxMyk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDEzLCAxMiwgVDE0KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTQsIDE3LCBUMTUpOworICAgIFNFVChiLCBjLCBkLCBhLCAxNSwgMjIsIFQxNik7CisjdW5kZWYgU0VUCisKKyAgICAgLyogUm91bmQgMi4gKi8KKyAgICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgIGEgPSBiICsgKChhICsgRyhiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiB+KHopKSkKKyNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKKyAgdCA9IGEgKyBHKGIsYyxkKSArIFhba10gKyBUaTtcCisgIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKKyAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLworICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDUsIFQxNyk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA2LCAgOSwgVDE4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE0LCBUMTkpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMCwgMjAsIFQyMCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA1LCAgNSwgVDIxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTAsICA5LCBUMjIpOworICAgIFNFVChjLCBkLCBhLCBiLCAxNSwgMTQsIFQyMyk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA0LCAyMCwgVDI0KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDksICA1LCBUMjUpOworICAgIFNFVChkLCBhLCBiLCBjLCAxNCwgIDksIFQyNik7CisgICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNCwgVDI3KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDgsIDIwLCBUMjgpOworICAgIFNFVChhLCBiLCBjLCBkLCAxMywgIDUsIFQyOSk7CisgICAgU0VUKGQsIGEsIGIsIGMsICAyLCAgOSwgVDMwKTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE0LCBUMzEpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMiwgMjAsIFQzMik7CisjdW5kZWYgU0VUCisKKyAgICAgLyogUm91bmQgMy4gKi8KKyAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgIGEgPSBiICsgKChhICsgSChiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisjZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCisgIHQgPSBhICsgSChiLGMsZCkgKyBYW2tdICsgVGk7XAorICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCisgICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KKyAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA0LCBUMzMpOworICAgIFNFVChkLCBhLCBiLCBjLCAgOCwgMTEsIFQzNCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDExLCAxNiwgVDM1KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgMTQsIDIzLCBUMzYpOworICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDQsIFQzNyk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA0LCAxMSwgVDM4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE2LCBUMzkpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMCwgMjMsIFQ0MCk7CisgICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNCwgVDQxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDAsIDExLCBUNDIpOworICAgIFNFVChjLCBkLCBhLCBiLCAgMywgMTYsIFQ0Myk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA2LCAyMywgVDQ0KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDksICA0LCBUNDUpOworICAgIFNFVChkLCBhLCBiLCBjLCAxMiwgMTEsIFQ0Nik7CisgICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNiwgVDQ3KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDIsIDIzLCBUNDgpOworI3VuZGVmIFNFVAorCisgICAgIC8qIFJvdW5kIDQuICovCisgICAgIC8qIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICBhID0gYiArICgoYSArIEkoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KKyNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8IH4oeikpKQorI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAorICB0ID0gYSArIEkoYixjLGQpICsgWFtrXSArIFRpO1wKKyAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgorICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCisgICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNiwgVDQ5KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDcsIDEwLCBUNTApOworICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTUsIFQ1MSk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA1LCAyMSwgVDUyKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgMTIsICA2LCBUNTMpOworICAgIFNFVChkLCBhLCBiLCBjLCAgMywgMTAsIFQ1NCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNSwgVDU1KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDEsIDIxLCBUNTYpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDYsIFQ1Nyk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDE1LCAxMCwgVDU4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDYsIDE1LCBUNTkpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMywgMjEsIFQ2MCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNiwgVDYxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTEsIDEwLCBUNjIpOworICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTUsIFQ2Myk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA5LCAyMSwgVDY0KTsKKyN1bmRlZiBTRVQKKworICAgICAvKiBUaGVuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMuIChUaGF0IGlzIGluY3JlbWVudCBlYWNoCisgICAgICAgIG9mIHRoZSBmb3VyIHJlZ2lzdGVycyBieSB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSB0aGlzIGJsb2NrCisgICAgICAgIHdhcyBzdGFydGVkLikgKi8KKyAgICBwbXMtPmFiY2RbMF0gKz0gYTsKKyAgICBwbXMtPmFiY2RbMV0gKz0gYjsKKyAgICBwbXMtPmFiY2RbMl0gKz0gYzsKKyAgICBwbXMtPmFiY2RbM10gKz0gZDsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKwordm9pZAorbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcykKK3sKKyAgICBwbXMtPmNvdW50WzBdID0gcG1zLT5jb3VudFsxXSA9IDA7CisgICAgcG1zLT5hYmNkWzBdID0gMHg2NzQ1MjMwMTsKKyAgICBwbXMtPmFiY2RbMV0gPSAvKjB4ZWZjZGFiODkqLyBUX01BU0sgXiAweDEwMzI1NDc2OworICAgIHBtcy0+YWJjZFsyXSA9IC8qMHg5OGJhZGNmZSovIFRfTUFTSyBeIDB4Njc0NTIzMDE7CisgICAgcG1zLT5hYmNkWzNdID0gMHgxMDMyNTQ3NjsKK30KKwordm9pZAorbWQ1X2FwcGVuZChtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhLCBpbnQgbmJ5dGVzKQoreworICAgIGNvbnN0IG1kNV9ieXRlX3QgKnAgPSBkYXRhOworICAgIGludCBsZWZ0ID0gbmJ5dGVzOworICAgIGludCBvZmZzZXQgPSAocG1zLT5jb3VudFswXSA+PiAzKSAmIDYzOworICAgIG1kNV93b3JkX3QgbmJpdHMgPSAobWQ1X3dvcmRfdCkobmJ5dGVzIDw8IDMpOworCisgICAgaWYgKG5ieXRlcyA8PSAwKQorICAgIHJldHVybjsKKworICAgIC8qIFVwZGF0ZSB0aGUgbWVzc2FnZSBsZW5ndGguICovCisgICAgcG1zLT5jb3VudFsxXSArPSBuYnl0ZXMgPj4gMjk7CisgICAgcG1zLT5jb3VudFswXSArPSBuYml0czsKKyAgICBpZiAocG1zLT5jb3VudFswXSA8IG5iaXRzKQorICAgIHBtcy0+Y291bnRbMV0rKzsKKworICAgIC8qIFByb2Nlc3MgYW4gaW5pdGlhbCBwYXJ0aWFsIGJsb2NrLiAqLworICAgIGlmIChvZmZzZXQpIHsKKyAgICBpbnQgY29weSA9IChvZmZzZXQgKyBuYnl0ZXMgPiA2NCA/IDY0IC0gb2Zmc2V0IDogbmJ5dGVzKTsKKworICAgIG1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7CisgICAgaWYgKG9mZnNldCArIGNvcHkgPCA2NCkKKyAgICAgICAgcmV0dXJuOworICAgIHAgKz0gY29weTsKKyAgICBsZWZ0IC09IGNvcHk7CisgICAgbWQ1X3Byb2Nlc3MocG1zLCBwbXMtPmJ1Zik7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBmdWxsIGJsb2Nrcy4gKi8KKyAgICBmb3IgKDsgbGVmdCA+PSA2NDsgcCArPSA2NCwgbGVmdCAtPSA2NCkKKyAgICBtZDVfcHJvY2VzcyhwbXMsIHApOworCisgICAgLyogUHJvY2VzcyBhIGZpbmFsIHBhcnRpYWwgYmxvY2suICovCisgICAgaWYgKGxlZnQpCisgICAgbWVtY3B5KHBtcy0+YnVmLCBwLCBsZWZ0KTsKK30KKwordm9pZAorbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCAqcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pCit7CisgICAgc3RhdGljIGNvbnN0IG1kNV9ieXRlX3QgcGFkWzY0XSA9IHsKKyAgICAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgfTsKKyAgICBtZDVfYnl0ZV90IGRhdGFbOF07CisgICAgaW50IGk7CisKKyAgICAvKiBTYXZlIHRoZSBsZW5ndGggYmVmb3JlIHBhZGRpbmcuICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKyAgICBkYXRhW2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+Y291bnRbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CisgICAgLyogUGFkIHRvIDU2IGJ5dGVzIG1vZCA2NC4gKi8KKyAgICBtZDVfYXBwZW5kKHBtcywgcGFkLCAoKDU1IC0gKHBtcy0+Y291bnRbMF0gPj4gMykpICYgNjMpICsgMSk7CisgICAgLyogQXBwZW5kIHRoZSBsZW5ndGguICovCisgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEsIDgpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorICAgIGRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9tZDUvbWQ1LmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL21kNS9tZDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg4NTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9tZDUvbWQ1LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLyoKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBMLiBQZXRlciBEZXV0c2NoCisgIGdob3N0QGFsYWRkaW4uY29tCisKKyAqLworLyogJElkOiBtZDUuaCx2IDEuNCAyMDAyLzA0LzEzIDE5OjIwOjI4IGxwZCBFeHAgJCAqLworLyoKKyAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCisKKyAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKKyAgdGV4dCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAorICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCisgIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQorICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCisgIGNvcHlyaWdodGVkLgorCisgIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuaCBpcyBMLiBQZXRlciBEZXV0c2NoCisgIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKKyAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgorCisgIDIwMDItMDQtMTMgbHBkIFJlbW92ZWQgc3VwcG9ydCBmb3Igbm9uLUFOU0kgY29tcGlsZXJzOyByZW1vdmVkCisgICAgcmVmZXJlbmNlcyB0byBHaG9zdHNjcmlwdDsgY2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsKKyAgICBub3cgaGFuZGxlcyBieXRlIG9yZGVyIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LgorICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KKyAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KTsKKyAgICBhZGRlZCBjb25kaXRpb25hbGl6YXRpb24gZm9yIEMrKyBjb21waWxhdGlvbiBmcm9tIE1hcnRpbgorICAgIFB1cnNjaGtlIDxwdXJzY2hrZUBibmwuZ292Pi4KKyAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIG1kNV9JTkNMVURFRAorIyAgZGVmaW5lIG1kNV9JTkNMVURFRAorCisvKgorICogVGhpcyBwYWNrYWdlIHN1cHBvcnRzIGJvdGggY29tcGlsZS10aW1lIGFuZCBydW4tdGltZSBkZXRlcm1pbmF0aW9uIG9mIENQVQorICogYnl0ZSBvcmRlci4gIElmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBkZWZpbmVkIGFzIDAsIHRoZSBjb2RlIHdpbGwgYmUKKyAqIGNvbXBpbGVkIHRvIHJ1biBvbmx5IG9uIGxpdHRsZS1lbmRpYW4gQ1BVczsgaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzCisgKiBkZWZpbmVkIGFzIG5vbi16ZXJvLCB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvIHJ1biBvbmx5IG9uIGJpZy1lbmRpYW4KKyAqIENQVXM7IGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBub3QgZGVmaW5lZCwgdGhlIGNvZGUgd2lsbCBiZSBjb21waWxlZCB0bworICogcnVuIG9uIGVpdGhlciBiaWctIG9yIGxpdHRsZS1lbmRpYW4gQ1BVcywgYnV0IHdpbGwgcnVuIHNsaWdodGx5IGxlc3MKKyAqIGVmZmljaWVudGx5IG9uIGVpdGhlciBvbmUgdGhhbiBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgZGVmaW5lZC4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgbWQ1X2J5dGVfdDsgLyogOC1iaXQgYnl0ZSAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgbWQ1X3dvcmRfdDsgLyogMzItYml0IHdvcmQgKi8KKworLyogRGVmaW5lIHRoZSBzdGF0ZSBvZiB0aGUgTUQ1IEFsZ29yaXRobS4gKi8KK3R5cGVkZWYgc3RydWN0IG1kNV9zdGF0ZV9zIHsKKyAgICBtZDVfd29yZF90IGNvdW50WzJdOyAgICAvKiBtZXNzYWdlIGxlbmd0aCBpbiBiaXRzLCBsc3cgZmlyc3QgKi8KKyAgICBtZDVfd29yZF90IGFiY2RbNF07ICAgICAgICAvKiBkaWdlc3QgYnVmZmVyICovCisgICAgbWQ1X2J5dGVfdCBidWZbNjRdOyAgICAgICAgLyogYWNjdW11bGF0ZSBibG9jayAqLworfSBtZDVfc3RhdGVfdDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIAoreworI2VuZGlmCisKKy8qIEluaXRpYWxpemUgdGhlIGFsZ29yaXRobS4gKi8KK3ZvaWQgbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcyk7CisKKy8qIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgbWVzc2FnZS4gKi8KK3ZvaWQgbWQ1X2FwcGVuZChtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhLCBpbnQgbmJ5dGVzKTsKKworLyogRmluaXNoIHRoZSBtZXNzYWdlIGFuZCByZXR1cm4gdGhlIGRpZ2VzdC4gKi8KK3ZvaWQgbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCAqcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIG1kNV9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9Db25uZWN0aW9uLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWFhOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9Db25uZWN0aW9uLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9SZXNwb25zZUNvZGUuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9XZWJTb2NrZXQuaCIKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgTG9nZ2VyOworY2xhc3MgU2VydmVySW1wbDsKK2NsYXNzIFBhZ2VSZXF1ZXN0OworY2xhc3MgUmVzcG9uc2U7CisKK2NsYXNzIENvbm5lY3Rpb24gOiBwdWJsaWMgV2ViU29ja2V0IHsKK3B1YmxpYzoKKyAgICBDb25uZWN0aW9uKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExvZ2dlcj4gbG9nZ2VyLAorICAgICAgICAgICAgU2VydmVySW1wbCYgc2VydmVyLAorICAgICAgICAgICAgaW50IGZkLAorICAgICAgICAgICAgY29uc3Qgc29ja2FkZHJfaW4mIGFkZHJlc3MpOworICAgIHZpcnR1YWwgfkNvbm5lY3Rpb24oKTsKKworICAgIGJvb2wgd3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgZmx1c2gpOworICAgIHZvaWQgaGFuZGxlRGF0YVJlYWR5Rm9yUmVhZCgpOworICAgIHZvaWQgaGFuZGxlRGF0YVJlYWR5Rm9yV3JpdGUoKTsKKworICAgIGludCBnZXRGZCgpIGNvbnN0IHsgcmV0dXJuIF9mZDsgfQorCisgICAgLy8gRnJvbSBXZWJTb2NrZXQuCisgICAgdmlydHVhbCB2b2lkIHNlbmQoY29uc3QgY2hhciogd2ViU29ja2V0UmVzcG9uc2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzZW5kKGNvbnN0IHVpbnQ4X3QqIHdlYlNvY2tldFJlc3BvbnNlLCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIC8vIEZyb20gUmVxdWVzdC4KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDcmVkZW50aWFscz4gY3JlZGVudGlhbHMoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGNvbnN0IHNvY2thZGRyX2luJiBnZXRSZW1vdGVBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gX2FkZHJlc3M7IH0KKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRSZXF1ZXN0VXJpKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXF1ZXN0OjpWZXJiIHZlcmIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBSZXF1ZXN0OjpXZWJTb2NrZXQ7IH0KKyAgICB2aXJ0dWFsIHNpemVfdCBjb250ZW50TGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogY29udGVudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE5VTEw7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaGFzSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0TGluZ2VyKCk7CisKKyAgICBzaXplX3QgaW5wdXRCdWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gX2luQnVmLnNpemUoKTsgfQorICAgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gX291dEJ1Zi5zaXplKCk7IH0KKworICAgIHNpemVfdCBieXRlc1JlY2VpdmVkKCkgY29uc3QgeyByZXR1cm4gX2J5dGVzUmVjZWl2ZWQ7IH0KKyAgICBzaXplX3QgYnl0ZXNTZW50KCkgY29uc3QgeyByZXR1cm4gX2J5dGVzU2VudDsgfQorCisgICAgLy8gRm9yIHRlc3Rpbmc6CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGdldElucHV0QnVmZmVyKCkgeyByZXR1cm4gX2luQnVmOyB9CisgICAgdm9pZCBoYW5kbGVIaXhpZVdlYlNvY2tldCgpOworICAgIHZvaWQgaGFuZGxlSHliaVdlYlNvY2tldCgpOworICAgIHZvaWQgc2V0SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8V2ViU29ja2V0OjpIYW5kbGVyPiBoYW5kbGVyKSB7CisgICAgICAgIF93ZWJTb2NrZXRIYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisgICAgdm9pZCBoYW5kbGVOZXdEYXRhKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBmaW5hbGlzZSgpOworICAgIGJvb2wgY2xvc2VkKCkgY29uc3Q7CisKKyAgICB2b2lkIGNsb3NlV2hlbkVtcHR5KCk7CisgICAgdm9pZCBjbG9zZUludGVybmFsKCk7CisKKyAgICB2b2lkIGhhbmRsZUhlYWRlcnMoKTsKKyAgICB2b2lkIGhhbmRsZVdlYlNvY2tldEtleTMoKTsKKyAgICB2b2lkIGhhbmRsZVdlYlNvY2tldFRleHRNZXNzYWdlKGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworICAgIHZvaWQgaGFuZGxlV2ViU29ja2V0QmluYXJ5TWVzc2FnZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSk7CisgICAgdm9pZCBoYW5kbGVCdWZmZXJpbmdQb3N0RGF0YSgpOworICAgIGJvb2wgaGFuZGxlUGFnZVJlcXVlc3QoKTsKKworICAgIGJvb2wgYnVmZmVyTGluZShjb25zdCBjaGFyKiBsaW5lKTsKKyAgICBib29sIGJ1ZmZlckxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUpOworICAgIGJvb2wgZmx1c2goKTsKKworICAgIGJvb2wgaGFuZGxlSHliaUhhbmRzaGFrZShpbnQgd2ViU29ja2V0VmVyc2lvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHdlYlNvY2tldEtleSk7CisKKyAgICAvLyBTZW5kIGFuIGVycm9yIGRvY3VtZW50LiBSZXR1cm5zICd0cnVlJyBmb3IgY29udmVuaWVuY2UgaW4gaGFuZGxlKigpIHJvdXRpbmVzLgorICAgIGJvb2wgc2VuZEVycm9yKFJlc3BvbnNlQ29kZSBlcnJvckNvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudCk7CisKKyAgICAvLyBTZW5kIGluZGl2aWR1YWwgZXJyb3JzLiBBZ2FpbiBhbGwgcmV0dXJuIHRydWUgZm9yIGNvbnZlbmllbmNlLgorICAgIGJvb2wgc2VuZFVuc3VwcG9ydGVkRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbik7CisgICAgYm9vbCBzZW5kNDA0KCk7CisgICAgYm9vbCBzZW5kQmFkUmVxdWVzdChjb25zdCBzdGQ6OnN0cmluZyYgcmVhc29uKTsKKyAgICBib29sIHNlbmRJU0UoY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yKTsKKworICAgIHZvaWQgc2VuZEh5YmkoaW50IG9wY29kZSwgY29uc3QgdWludDhfdCogd2ViU29ja2V0UmVzcG9uc2UsIHNpemVfdCBtZXNzYWdlTGVuZ3RoKTsKKworICAgIGJvb2wgc2VuZFJlc3BvbnNlKHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gcmVzcG9uc2UpOworCisgICAgYm9vbCBwcm9jZXNzSGVhZGVycyh1aW50OF90KiBmaXJzdCwgdWludDhfdCogbGFzdCk7CisgICAgYm9vbCBzZW5kRGF0YShjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgY2hhciogc3RhcnQsIHNpemVfdCBzaXplKTsKKworICAgIHN0cnVjdCBSYW5nZSB7CisgICAgICAgIGxvbmcgc3RhcnQ7CisgICAgICAgIGxvbmcgZW5kOworICAgICAgICBzaXplX3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gZW5kIC0gc3RhcnQgKyAxOyB9CisgICAgfTsKKworICAgIGJvb2wgcGFyc2VSYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgcmFuZ2VTdHIsIFJhbmdlJiByYW5nZSkgY29uc3Q7CisgICAgYm9vbCBwYXJzZVJhbmdlcyhjb25zdCBzdGQ6OnN0cmluZyYgcmFuZ2UsIHN0ZDo6bGlzdDxSYW5nZT4mIHJhbmdlcykgY29uc3Q7CisgICAgYm9vbCBzZW5kU3RhdGljRGF0YSgpOworCisgICAgaW50IHNhZmVTZW5kKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZvaWQgYnVmZmVyUmVzcG9uc2VBbmRDb21tb25IZWFkZXJzKFJlc3BvbnNlQ29kZSBjb2RlKTsKKworICAgIHN0ZDo6bGlzdDxSYW5nZT4gcHJvY2Vzc1Jhbmdlc0ZvclN0YXRpY0RhdGEoY29uc3Qgc3RkOjpsaXN0PFJhbmdlPiYgcmFuZ2VzLCBsb25nIGZpbGVTaXplKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2dnZXI+IF9sb2dnZXI7CisgICAgU2VydmVySW1wbCAmX3NlcnZlcjsKKyAgICBpbnQgX2ZkOworICAgIGJvb2wgX3NodXRkb3duOworICAgIGJvb2wgX2hhZFNlbmRFcnJvcjsKKyAgICBib29sIF9jbG9zZU9uRW1wdHk7CisgICAgYm9vbCBfcmVnaXN0ZXJlZEZvcldyaXRlRXZlbnRzOworICAgIHNvY2thZGRyX2luIF9hZGRyZXNzOworICAgIHNpemVfdCBfYnl0ZXNTZW50OworICAgIHNpemVfdCBfYnl0ZXNSZWNlaXZlZDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBfaW5CdWY7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gX291dEJ1ZjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8V2ViU29ja2V0OjpIYW5kbGVyPiBfd2ViU29ja2V0SGFuZGxlcjsKKyAgICBib29sIF9zaHV0ZG93bkJ5VXNlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFnZVJlcXVlc3Q+IF9yZXF1ZXN0OworCisgICAgZW51bSBTdGF0ZSB7CisgICAgICAgIElOVkFMSUQsCisgICAgICAgIFJFQURJTkdfSEVBREVSUywKKyAgICAgICAgUkVBRElOR19XRUJTT0NLRVRfS0VZMywKKyAgICAgICAgSEFORExJTkdfSElYSUVfV0VCU09DS0VULAorICAgICAgICBIQU5ETElOR19IWUJJX1dFQlNPQ0tFVCwKKyAgICAgICAgQlVGRkVSSU5HX1BPU1RfREFUQSwKKyAgICB9OworICAgIFN0YXRlIF9zdGF0ZTsKKworICAgIENvbm5lY3Rpb24oQ29ubmVjdGlvbiYgb3RoZXIpID0gZGVsZXRlOworICAgIENvbm5lY3Rpb24mIG9wZXJhdG9yID0oQ29ubmVjdGlvbiYgb3RoZXIpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNlYXNvY2tzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL0NyZWRlbnRpYWxzLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL0NyZWRlbnRpYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1MzJjMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvQ3JlZGVudGlhbHMuaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK3N0cnVjdCBDcmVkZW50aWFscyB7CisgICAgLyoqCisgICAgICogV2hldGhlciB1c2VyIHdhcyBzdWNjZXNzZnVseSBhdXRoZW50aWNhdGVkLgorICAgICAqLworICAgIGJvb2wgYXV0aGVudGljYXRlZDsKKworICAgIC8qKgorICAgICAqIGUuZy4gIm1nb2Rib2x0IiAob3IgIiIgZm9yIHVuYXV0aGVudGljYXRlZCB1c2VycykKKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyB1c2VybmFtZTsKKworICAgIC8qKgorICAgICAqIEdyb3VwcyB0aGUgdXNlciBpcyBpbi4KKyAgICAgKi8KKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gZ3JvdXBzOworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlcyBmb3IgdGhlIHVzZXIuCisgICAgICovCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhdHRyaWJ1dGVzOworCisgICAgQ3JlZGVudGlhbHMoKTogYXV0aGVudGljYXRlZChmYWxzZSkge30KK307CisKK2lubGluZSBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQ3JlZGVudGlhbHMmIGNyZWRlbnRpYWxzKSB7CisgICAgb3MgPDwgInthdXRoZW50aWNhdGVkOiIgPDwgY3JlZGVudGlhbHMuYXV0aGVudGljYXRlZCA8PCAiLCB1c2VybmFtZTonIiA8PCBjcmVkZW50aWFscy51c2VybmFtZSA8PCAiJywgZ3JvdXBzOiB7IjsKKyAgICBmb3IgKGF1dG8gaXQgPSBjcmVkZW50aWFscy5ncm91cHMuYmVnaW4oKTsgaXQgIT0gY3JlZGVudGlhbHMuZ3JvdXBzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpdCAhPSBjcmVkZW50aWFscy5ncm91cHMuYmVnaW4oKSkgb3MgPDwgIiwgIjsKKyAgICAgICAgb3MgPDwgKml0OworICAgIH0KKyAgICBvcyA8PCAifSwgYXR0cnM6IHsiOworICAgIGZvciAoYXV0byBpdCA9IGNyZWRlbnRpYWxzLmF0dHJpYnV0ZXMuYmVnaW4oKTsgaXQgIT0gY3JlZGVudGlhbHMuYXR0cmlidXRlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQgIT0gY3JlZGVudGlhbHMuYXR0cmlidXRlcy5iZWdpbigpKSBvcyA8PCAiLCAiOworICAgICAgICBvcyA8PCBpdC0+Zmlyc3QgPDwgIj0iIDw8IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBvcyA8PCAifX0iOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc2Vhc29ja3MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvSWdub3JpbmdMb2dnZXIuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvSWdub3JpbmdMb2dnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQ0YjFlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9JZ25vcmluZ0xvZ2dlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9Mb2dnZXIuaCIKKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgSWdub3JpbmdMb2dnZXIgOiBwdWJsaWMgTG9nZ2VyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgbG9nKExldmVsIGxldmVsLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHNlYXNvY2tzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL0xvZ2dlci5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9Mb2dnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTdjNTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9Mb2dnZXIuaApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCisvKioKKyAqIENsYXNzIHRvIHNlbmQgZGVidWcgbG9nZ2luZyBpbmZvcm1hdGlvbiB0by4KKyAqLworY2xhc3MgTG9nZ2VyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5Mb2dnZXIoKSB7fQorCisgICAgZW51bSBMZXZlbCB7CisgICAgICAgIERFQlVHLCAgLy8gTkIgREVCVUcgaXMgdXN1YWxseSBvcHRlZC1vdXQgb2YgYXQgY29tcGlsZS10aW1lLgorICAgICAgICBBQ0NFU1MsIC8vIFVzZWQgdG8gbG9nIHBhZ2UgcmVxdWVzdHMgZXRjCisgICAgICAgIElORk8sCisgICAgICAgIFdBUk5JTkcsCisgICAgICAgIEVSUk9SLAorICAgICAgICBTRVZFUkUsCisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBsb2coTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpID0gMDsKKworICAgIHZvaWQgZGVidWcoY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKTsKKyAgICB2b2lkIGFjY2Vzcyhjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pOworICAgIHZvaWQgaW5mbyhjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pOworICAgIHZvaWQgd2FybmluZyhjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pOworICAgIHZvaWQgZXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKTsKKyAgICB2b2lkIHNldmVyZShjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGxldmVsVG9TdHJpbmcoTGV2ZWwgbGV2ZWwpIHsKKyAgICAgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIERFQlVHOiByZXR1cm4gImRlYnVnIjsKKyAgICAgICAgY2FzZSBBQ0NFU1M6IHJldHVybiAiYWNjZXNzIjsKKyAgICAgICAgY2FzZSBJTkZPOiByZXR1cm4gImluZm8iOworICAgICAgICBjYXNlIFdBUk5JTkc6IHJldHVybiAid2FybmluZyI7CisgICAgICAgIGNhc2UgRVJST1I6IHJldHVybiAiRVJST1IiOworICAgICAgICBjYXNlIFNFVkVSRTogcmV0dXJuICJTRVZFUkUiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIj8/PyI7CisgICAgICAgIH0KKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc2Vhc29ja3MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUGFnZUhhbmRsZXIuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUGFnZUhhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWU2NzFkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9QYWdlSGFuZGxlci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9DcmVkZW50aWFscy5oIgorI2luY2x1ZGUgInNlYXNvY2tzL1Jlc3BvbnNlLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCitjbGFzcyBSZXF1ZXN0OworCitjbGFzcyBQYWdlSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UGFnZUhhbmRsZXIoKSB7fQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IGhhbmRsZShjb25zdCBSZXF1ZXN0JiByZXF1ZXN0KSA9IDA7Cit9OworCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1ByaW50ZkxvZ2dlci5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9QcmludGZMb2dnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDhiMWIwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9QcmludGZMb2dnZXIuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2Vhc29ja3MvTG9nZ2VyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCitjbGFzcyBQcmludGZMb2dnZXIgOiBwdWJsaWMgTG9nZ2VyIHsKK3B1YmxpYzoKKyAgICBQcmludGZMb2dnZXIoTGV2ZWwgbWluTGV2ZWxUb0xvZyA9IExldmVsOjpERUJVRykgOiBtaW5MZXZlbFRvTG9nKG1pbkxldmVsVG9Mb2cpIHsKKyAgICB9CisKKyAgICB+UHJpbnRmTG9nZ2VyKCkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBsb2coTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKGxldmVsID49IG1pbkxldmVsVG9Mb2cpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCBsZXZlbFRvU3RyaW5nKGxldmVsKSwgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMZXZlbCBtaW5MZXZlbFRvTG9nOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNlYXNvY2tzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1JlcXVlc3QuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9SZXF1ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2JlNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9SZXF1ZXN0LmNwcApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9SZXF1ZXN0LmgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCitjb25zdCBjaGFyKiBSZXF1ZXN0OjpuYW1lKFZlcmIgdikgeworICAgIHN3aXRjaCh2KSB7CisgICAgY2FzZSBJbnZhbGlkOiByZXR1cm4gIkludmFsaWQiOworICAgIGNhc2UgV2ViU29ja2V0OiByZXR1cm4gIldlYlNvY2tldCI7CisgICAgY2FzZSBHZXQ6IHJldHVybiAiR2V0IjsKKyAgICBjYXNlIFB1dDogcmV0dXJuICJQdXQiOworICAgIGNhc2UgUG9zdDogcmV0dXJuICJQb3N0IjsKKyAgICBjYXNlIERlbGV0ZTogcmV0dXJuICJEZWxldGUiOworICAgIGRlZmF1bHQ6IHJldHVybiAiPz8/IjsKKyAgICB9Cit9CisKK1JlcXVlc3Q6OlZlcmIgUmVxdWVzdDo6dmVyYihjb25zdCBjaGFyKiB2ZXJiKSB7CisgICAgaWYgKHN0ZDo6c3RyY21wKHZlcmIsICJHRVQiKSA9PSAwKSByZXR1cm4gUmVxdWVzdDo6R2V0OworICAgIGlmIChzdGQ6OnN0cmNtcCh2ZXJiLCAiUFVUIikgPT0gMCkgcmV0dXJuIFJlcXVlc3Q6OlB1dDsKKyAgICBpZiAoc3RkOjpzdHJjbXAodmVyYiwgIlBPU1QiKSA9PSAwKSByZXR1cm4gUmVxdWVzdDo6UG9zdDsKKyAgICBpZiAoc3RkOjpzdHJjbXAodmVyYiwgIkRFTEVURSIpID09IDApIHJldHVybiBSZXF1ZXN0OjpEZWxldGU7CisgICAgcmV0dXJuIFJlcXVlc3Q6OkludmFsaWQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzZWFzb2NrcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9SZXF1ZXN0LmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1JlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBlNzhhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9SZXF1ZXN0LmgKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInNlYXNvY2tzL0NyZWRlbnRpYWxzLmgiCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgUmVxdWVzdCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UmVxdWVzdCgpIHt9CisKKyAgICBlbnVtIFZlcmIgeworICAgICAgICBJbnZhbGlkLAorICAgICAgICBXZWJTb2NrZXQsCisgICAgICAgIEdldCwKKyAgICAgICAgUHV0LAorICAgICAgICBQb3N0LAorICAgICAgICBEZWxldGUsCisgICAgfTsKKworICAgIHZpcnR1YWwgVmVyYiB2ZXJiKCkgY29uc3QgPSAwOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUoVmVyYiB2KTsKKyAgICBzdGF0aWMgVmVyYiB2ZXJiKGNvbnN0IGNoYXIgKnZlcmIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3JlZGVudGlhbHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDcmVkZW50aWFscz4gY3JlZGVudGlhbHMoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IHNvY2thZGRyX2luJiBnZXRSZW1vdGVBZGRyZXNzKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0UmVxdWVzdFVyaSgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvbnRlbnRMZW5ndGgoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGNvbnRlbnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgaGFzSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNlYXNvY2tzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjZjAzYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUmVzcG9uc2UuaApAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2Vhc29ja3MvUmVzcG9uc2VDb2RlLmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgUmVzcG9uc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgflJlc3BvbnNlKCkge30KKyAgICB2aXJ0dWFsIFJlc3BvbnNlQ29kZSByZXNwb25zZUNvZGUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHBheWxvYWQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgcGF5bG9hZFNpemUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBib29sIGtlZXBDb25uZWN0aW9uQWxpdmUoKSBjb25zdCA9IDA7CisKKyAgICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBIZWFkZXJzOworICAgIHZpcnR1YWwgSGVhZGVycyBnZXRBZGRpdGlvbmFsSGVhZGVycygpIGNvbnN0ID0gMDsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IHVuaGFuZGxlZCgpOworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gbm90Rm91bmQoKTsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IGVycm9yKFJlc3BvbnNlQ29kZSBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpOworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gdGV4dFJlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNwb25zZSk7CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4ganNvblJlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNwb25zZSk7CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gaHRtbFJlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNwb25zZSk7Cit9OworCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlQnVpbGRlci5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmOWIyOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUmVzcG9uc2VCdWlsZGVyLmNwcApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9SZXNwb25zZUJ1aWxkZXIuaCIKKworI2luY2x1ZGUgImludGVybmFsL0NvbmNyZXRlUmVzcG9uc2UuaCIKKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworUmVzcG9uc2VCdWlsZGVyOjpSZXNwb25zZUJ1aWxkZXIoUmVzcG9uc2VDb2RlIGNvZGUpIDoKKyAgICAgICAgX2NvZGUoY29kZSksCisgICAgICAgIF9jb250ZW50VHlwZSgidGV4dC9wbGFpbiIpLAorICAgICAgICBfa2VlcEFsaXZlKHRydWUpLAorICAgICAgICBfc3RyZWFtKG5ldyBzdGQ6Om9zdHJpbmdzdHJlYW0pIHsKKworfQorCitSZXNwb25zZUJ1aWxkZXImIFJlc3BvbnNlQnVpbGRlcjo6YXNIdG1sKCkgeworICAgIHJldHVybiB3aXRoQ29udGVudFR5cGUoInRleHQvaHRtbCIpOworfQorCitSZXNwb25zZUJ1aWxkZXImIFJlc3BvbnNlQnVpbGRlcjo6YXNUZXh0KCkgeworICAgIHJldHVybiB3aXRoQ29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKK30KKworUmVzcG9uc2VCdWlsZGVyJiBSZXNwb25zZUJ1aWxkZXI6OmFzSnNvbigpIHsKKyAgICByZXR1cm4gd2l0aENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uIik7Cit9CisKK1Jlc3BvbnNlQnVpbGRlciYgUmVzcG9uc2VCdWlsZGVyOjp3aXRoQ29udGVudFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRUeXBlKSB7CisgICAgX2NvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitSZXNwb25zZUJ1aWxkZXImIFJlc3BvbnNlQnVpbGRlcjo6a2VlcHNDb25uZWN0aW9uQWxpdmUoKSB7CisgICAgX2tlZXBBbGl2ZSA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitSZXNwb25zZUJ1aWxkZXImIFJlc3BvbnNlQnVpbGRlcjo6Y2xvc2VzQ29ubmVjdGlvbigpIHsKKyAgICBfa2VlcEFsaXZlID0gZmFsc2U7CisgICAgcmV0dXJuICp0aGlzOworfQorCitSZXNwb25zZUJ1aWxkZXImIFJlc3BvbnNlQnVpbGRlcjo6d2l0aExvY2F0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhdGlvbikgeworICAgIHJldHVybiB3aXRoSGVhZGVyKCJMb2NhdGlvbiIsIGxvY2F0aW9uKTsKK30KKworUmVzcG9uc2VCdWlsZGVyJiBSZXNwb25zZUJ1aWxkZXI6OnNldHNDb29raWUoY29uc3Qgc3RkOjpzdHJpbmcmIGNvb2tpZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgcmV0dXJuIGFkZEhlYWRlcigiU2V0LUNvb2tpZSIsIGNvb2tpZSArICI9IiArIHZhbHVlKTsKK30KKworUmVzcG9uc2VCdWlsZGVyJiBSZXNwb25zZUJ1aWxkZXI6OndpdGhIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIF9oZWFkZXJzLmVyYXNlKG5hbWUpOworICAgIF9oZWFkZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihuYW1lLCB2YWx1ZSkpOworICAgIHJldHVybiAqdGhpczsKK30KKworUmVzcG9uc2VCdWlsZGVyJiBSZXNwb25zZUJ1aWxkZXI6OmFkZEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgX2hlYWRlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG5hbWUsIHZhbHVlKSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IFJlc3BvbnNlQnVpbGRlcjo6YnVpbGQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4obmV3IENvbmNyZXRlUmVzcG9uc2UoX2NvZGUsIF9zdHJlYW0tPnN0cigpLCBfY29udGVudFR5cGUsIF9oZWFkZXJzLCBfa2VlcEFsaXZlKSk7Cit9CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUmVzcG9uc2VCdWlsZGVyLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjY4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlQnVpbGRlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9SZXNwb25zZS5oIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK2NsYXNzIFJlc3BvbnNlQnVpbGRlciB7CisgICAgUmVzcG9uc2VDb2RlIF9jb2RlOworICAgIHN0ZDo6c3RyaW5nIF9jb250ZW50VHlwZTsKKyAgICBib29sIF9rZWVwQWxpdmU7CisgICAgUmVzcG9uc2U6OkhlYWRlcnMgX2hlYWRlcnM7CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6b3N0cmluZ3N0cmVhbT4gX3N0cmVhbTsKK3B1YmxpYzoKKyAgICBSZXNwb25zZUJ1aWxkZXIoUmVzcG9uc2VDb2RlIGNvZGUgPSBSZXNwb25zZUNvZGU6Ok9rKTsKKworICAgIFJlc3BvbnNlQnVpbGRlciYgYXNIdG1sKCk7CisgICAgUmVzcG9uc2VCdWlsZGVyJiBhc1RleHQoKTsKKyAgICBSZXNwb25zZUJ1aWxkZXImIGFzSnNvbigpOworICAgIFJlc3BvbnNlQnVpbGRlciYgd2l0aENvbnRlbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50VHlwZSk7CisKKyAgICBSZXNwb25zZUJ1aWxkZXImIGtlZXBzQ29ubmVjdGlvbkFsaXZlKCk7CisgICAgUmVzcG9uc2VCdWlsZGVyJiBjbG9zZXNDb25uZWN0aW9uKCk7CisKKyAgICBSZXNwb25zZUJ1aWxkZXImIHdpdGhMb2NhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbG9jYXRpb24pOworCisgICAgUmVzcG9uc2VCdWlsZGVyJiBzZXRzQ29va2llKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb29raWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisKKyAgICBSZXNwb25zZUJ1aWxkZXImIHdpdGhIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBSZXNwb25zZUJ1aWxkZXImIHdpdGhIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IFQmIHQpIHsKKyAgICAgICAgcmV0dXJuIHdpdGhIZWFkZXIobmFtZSwgdG9TdHJpbmcodCkpOworICAgIH0KKworICAgIFJlc3BvbnNlQnVpbGRlciYgYWRkSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgUmVzcG9uc2VCdWlsZGVyJiBhZGRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IFQmIHQpIHsKKyAgICAgICAgcmV0dXJuIGFkZEhlYWRlcihuYW1lLCB0b1N0cmluZyh0KSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBSZXNwb25zZUJ1aWxkZXImIG9wZXJhdG9yIDw8IChUJiYgdCkgeworICAgICAgICAoKl9zdHJlYW0pIDw8IHN0ZDo6Zm9yd2FyZCh0KTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gYnVpbGQoKTsKK307CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUmVzcG9uc2VDb2RlLmNwcCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUmVzcG9uc2VDb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWU4OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9SZXNwb25zZUNvZGUuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgInNlYXNvY2tzL1Jlc3BvbnNlQ29kZS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc2Vhc29ja3M7CisKK2Jvb2wgaXNPayhzZWFzb2Nrczo6UmVzcG9uc2VDb2RlIGNvZGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihjb2RlKSA8IDQwMDsKK30KKworY29uc3QgY2hhciogbmFtZShSZXNwb25zZUNvZGUgY29kZSkgeworICAgIHN3aXRjaCAoY29kZSkgeworI2RlZmluZSBTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKENPREUsU1lNQk9MSUNOQU1FLFNUUklOR05BTUUpIGNhc2UgUmVzcG9uc2VDb2RlOjpTWU1CT0xJQ05BTUU6IHJldHVybiBTVFJJTkdOQU1FOworI2luY2x1ZGUgInNlYXNvY2tzL1Jlc3BvbnNlQ29kZURlZnMuaCIKKworI3VuZGVmIFNFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUKKyAgICB9CisgICAgcmV0dXJuICJVbmtub3duIjsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUmVzcG9uc2VDb2RlLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlQ29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjM0NjMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlQ29kZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKKyNkZWZpbmUgU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERShDT0RFLFNZTUJPTElDTkFNRSxTVFJJTkdOQU1FKSBTWU1CT0xJQ05BTUUgPSBDT0RFLAorZW51bSBjbGFzcyBSZXNwb25zZUNvZGUgeworI2luY2x1ZGUgInNlYXNvY2tzL1Jlc3BvbnNlQ29kZURlZnMuaCIKKworfTsKKyN1bmRlZiBTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFCisKK30KKworY29uc3QgY2hhciogbmFtZShzZWFzb2Nrczo6UmVzcG9uc2VDb2RlIGNvZGUpOworYm9vbCBpc09rKHNlYXNvY2tzOjpSZXNwb25zZUNvZGUgY29kZSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlQ29kZURlZnMuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvUmVzcG9uc2VDb2RlRGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTg3OGQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1Jlc3BvbnNlQ29kZURlZnMuaApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIE5vdCBhIG5vcm1hbCBoZWFkZXIgZmlsZSAtIG5vIGhlYWRlciBndWFyZHMgb24gcHVycG9zZS4KKy8vIERvIG5vdCBkaXJlY3RseSBpbmNsdWRlISBVc2UgUmVzcG9uc2VDb2RlLmggaW5zdGVhZAorCisjaWZkZWYgU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSAgLy8gd29ya2Fyb3VuZCBmb3IgaGVhZGVyIGNoZWNrCisKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMTAwLCBDb250aW51ZSwgIkNvbnRpbnVlIikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMTAxLCBXZWJTb2NrZXRQcm90b2NvbEhhbmRzaGFrZSwgIldlYlNvY2tldCBQcm90b2NvbCBIYW5kc2hha2UiKQorU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSgxMDIsIFByb2Nlc3NpbmcsICJQcm9jZXNzaW5nIikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMTAzLCBDaGVja3BvaW50LCAiQ2hlY2twb2ludCIpCisKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMjAwLCBPaywgIk9LIikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMjAxLCBDcmVhdGVkLCAiQ3JlYXRlZCIpCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDIwMiwgQWNjZXB0ZWQsICJBY2NlcHRlZCIpCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDIwMywgTm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uLCAiTm9uIEF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24iKQorU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSgyMDQsIE5vQ29udGVudCwgIk5vIENvbnRlbnQiKQorU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSgyMDUsIFJlc2V0Q29udGVudCwgIlJlc2V0IENvbnRlbnQiKQorU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSgyMDYsIFBhcnRpYWxDb250ZW50LCAiUGFydGlhbCBDb250ZW50IikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMjA3LCBNdWx0aVN0YXR1cywgIk11bHRpLVN0YXR1cyIpCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDIwOCwgQWxyZWFkeVJlcG9ydGVkLCAiQWxyZWFkeSBSZXBvcnRlZCIpCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDIyNiwgSU1Vc2VkLCAiSU0gVXNlZCIpCisKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMzAwLCBNdWx0aXBsZUNob2ljZXMsICJNdWx0aXBsZSBDaG9pY2VzIikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMzAxLCBNb3ZlZFBlcm1hbmVudGx5LCAiTW92ZWQgUGVybWFuZW50bHkiKQorU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSgzMDIsIEZvdW5kLCAiRm91bmQiKQorU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSgzMDMsIFNlZU90aGVyLCAiU2VlIE90aGVyIikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMzA0LCBOb3RNb2RpZmllZCwgIk5vdCBNb2RpZmllZCIpCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDMwNSwgVXNlUHJveHksICJVc2UgUHJveHkiKQorU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSgzMDYsIFN3aXRjaFByb3h5LCAiU3dpdGNoIFByb3h5IikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoMzA3LCBUZW1wb3JhcnlSZWRpcmVjdCwgIlRlbXBvcmFyeSBSZWRpcmVjdCIpCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDMwOCwgUmVzdW1lSW5jb21wbGV0ZSwgIlJlc3VtZSBJbmNvbXBsZXRlIikKKworU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSg0MDAsIEJhZFJlcXVlc3QsICJCYWQgUmVxdWVzdCIpCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDQwMSwgVW5hdXRob3JpemVkLCAiVW5hdXRob3JpemVkIikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoNDAyLCBQYXltZW50UmVxdWlyZWQsICJQYXltZW50IFJlcXVpcmVkIikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoNDAzLCBGb3JiaWRkZW4sICJGb3JiaWRkZW4iKQorU0VBU09DS1NfREVGSU5FX1JFU1BPTlNFQ09ERSg0MDQsIE5vdEZvdW5kLCAiTm90IEZvdW5kIikKK1NFQVNPQ0tTX0RFRklORV9SRVNQT05TRUNPREUoNDA1LCBNZXRob2ROb3RBbGxvd2VkLCAiTWV0aG9kIE5vdCBBbGxvd2VkIikKKy8vIG1vcmUgaGVyZS4uLgorCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDUwMCwgSW50ZXJuYWxTZXJ2ZXJFcnJvciwgIkludGVybmFsIFNlcnZlciBFcnJvciIpCitTRUFTT0NLU19ERUZJTkVfUkVTUE9OU0VDT0RFKDUwMSwgTm90SW1wbGVtZW50ZWQsICJOb3QgSW1wbGVtZW50ZWQiKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvU2VydmVyLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjlhNDMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1NlcnZlci5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2Vhc29ja3MvU2VydmVySW1wbC5oIgorI2luY2x1ZGUgInNlYXNvY2tzL1dlYlNvY2tldC5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK2NsYXNzIENvbm5lY3Rpb247CitjbGFzcyBMb2dnZXI7CitjbGFzcyBQYWdlSGFuZGxlcjsKK2NsYXNzIFJlcXVlc3Q7CitjbGFzcyBSZXNwb25zZTsKKworY2xhc3MgU2VydmVyIDogcHJpdmF0ZSBTZXJ2ZXJJbXBsIHsKK3B1YmxpYzoKKyAgICBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPExvZ2dlcj4gbG9nZ2VyKTsKKyAgICB2aXJ0dWFsIH5TZXJ2ZXIoKTsKKworICAgIHZvaWQgYWRkUGFnZUhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFBhZ2VIYW5kbGVyPiBoYW5kbGVyKTsKKworICAgIHZvaWQgYWRkV2ViU29ja2V0SGFuZGxlcihjb25zdCBjaGFyKiBlbmRwb2ludCwgc3RkOjpzaGFyZWRfcHRyPFdlYlNvY2tldDo6SGFuZGxlcj4gaGFuZGxlciwKKyAgICAgICAgICAgIGJvb2wgYWxsb3dDcm9zc09yaWdpblJlcXVlc3RzID0gZmFsc2UpOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCBoZWFyZCBhbnl0aGluZyBldmVyIG9uIGEgY29ubmVjdGlvbiBmb3IgdGhpcyBsb25nLCBraWxsIGl0LgorICAgIC8vIFRoaXMgaXMgcG9zc2libHkgY2F1c2VkIGJ5IGJhZCBXZWJTb2NrZXQgaW1wbGVtZW50YXRpb24gaW4gQ2hyb21lLgorICAgIHZvaWQgc2V0TGFtZUNvbm5lY3Rpb25UaW1lb3V0U2Vjb25kcyhpbnQgc2Vjb25kcyk7CisKKyAgICAvLyBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBUQ1AgbGV2ZWwga2VlcGFsaXZlcyB0aGF0IHdlIGNhbiBtaXNzIGJlZm9yZQorICAgIC8vIHdlIGxldCB0aGUgT1MgY29uc2lkZXIgdGhlIGNvbm5lY3Rpb24gZGVhZC4gV2UgY29uZmlndXJlIGtlZXBhbGl2ZXMgZXZlcnkgc2Vjb25kLAorICAgIC8vIHNvIHRoaXMgaXMgYWxzbyB0aGUgbWluaW11bSBudW1iZXIgb2Ygc2Vjb25kcyBpdCB0YWtlcyB0byBub3RpY2UgYSBiYWRseS1iZWhhdmVkCisgICAgLy8gZGVhZCBjb25uZWN0aW9uLCBlLmcuIGEgbGFwdG9wIGdvaW5nIGludG8gc2xlZXAgbW9kZSBvciBhIGhhcmQtY3Jhc2hlZCBtYWNoaW5lLgorICAgIC8vIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyBrZWVwIGFsaXZlcywgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgdm9pZCBzZXRNYXhLZWVwQWxpdmVEcm9wcyhpbnQgbWF4S2VlcEFsaXZlRHJvcHMpOworCisgICAgLy8gU2VydmVzIHN0YXRpYyBjb250ZW50IGZyb20gdGhlIGdpdmVuIHBvcnQgb24gdGhlIGN1cnJlbnQgdGhyZWFkLCB1bnRpbCB0ZXJtaW5hdGUgaXMgY2FsbGVkLgorICAgIC8vIFJvdWdobHkgZXF1aXZhbGVudCB0byBzdGFydExpc3RlbmluZyhwb3J0KTsgc2V0U3RhdGljUGF0aChzdGF0aWNQYXRoKTsgbG9vcCgpOworICAgIC8vIFJldHVybnMgd2hldGhlciBleGl0aW5nIHdhcyBleHBlY3RlZC4KKyAgICBib29sIHNlcnZlKGNvbnN0IGNoYXIqIHN0YXRpY1BhdGgsIGludCBwb3J0KTsKKworICAgIC8vIFN0YXJ0cyBsaXN0ZW5pbmcgb24gYSBnaXZlbiBpbnRlcmZhY2UgKGluIGhvc3Qgb3JkZXIpIGFuZCBwb3J0LgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgd2FzIG9rLgorICAgIGJvb2wgc3RhcnRMaXN0ZW5pbmcodWludDMyX3QgaXBJbkhvc3RPcmRlciwgaW50IHBvcnQpOworCisgICAgLy8gU3RhcnRzIGxpc3RlbmluZyBvbiBhIHBvcnQgb24gYWxsIGludGVyZmFjZXMuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCB3YXMgb2suCisgICAgYm9vbCBzdGFydExpc3RlbmluZyhpbnQgcG9ydCk7CisKKyAgICAvLyBTZXRzIHRoZSBwYXRoIHRvIHNlcnZlciBzdGF0aWMgY29udGVudCBmcm9tLgorICAgIHZvaWQgc2V0U3RhdGljUGF0aChjb25zdCBjaGFyKiBzdGF0aWNQYXRoKTsKKworICAgIC8vIExvb3AgKHVudGlsIHRlcm1pbmF0ZSBjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZCkuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRlcm1pbmF0ZSgpIHdhcyB1c2VkIHRvIGV4aXQgdGhlIGxvb3AsIGZhbHNlIGlmIHRoZXJlCisgICAgLy8gd2FzIGFuIGVycm9yLgorICAgIGJvb2wgbG9vcCgpOworCisgICAgLy8gUnVucyBhIHNpbmdsZSBpdGVyYXRpb24gb2YgdGhlIG1haW4gbG9vcCwgYmxvY2tpbmcgZm9yIGEgZ2l2ZW4gdGltZS4KKyAgICAvLyBSZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRlcm1pbmF0ZSgpIGhhcyBiZWVuIGNhbGxlZC4gTXVzdCBiZSBjb25zaXN0ZW50bHkKKyAgICAvLyBjYWxsZWQgZnJvbSB0aGUgc2FtZSB0aHJlYWQuIFJldHVybnMgYW4gZW51bSBkZXNjcmliaW5nIHdoeSBpdCByZXR1cm5lZC4KKyAgICBlbnVtIGNsYXNzIFBvbGxSZXN1bHQgeworICAgICAgICBDb250aW51ZSwKKyAgICAgICAgVGVybWluYXRlZCwKKyAgICAgICAgRXJyb3IsCisgICAgfTsKKyAgICBQb2xsUmVzdWx0IHBvbGwoaW50IG1pbGxpc1RvQmxvY2spOworCisgICAgLy8gUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSBwb2xsZWQgZm9yIGNoYW5nZXMgKGUuZy4gYnkKKyAgICAvLyBwbGFjaW5nIGl0IGluIGFuIGVwb2xsIHNldC4gVGhlIHBvbGwoKSBtZXRob2QgYWJvdmUgb25seSBuZWVkIGJlIGNhbGxlZAorICAgIC8vIHdoZW4gdGhpcyBmaWxlIGRlc2NyaXB0b3IgaXMgcmVhZGFibGUuCisgICAgaW50IGZkKCkgY29uc3QgeyByZXR1cm4gX2Vwb2xsRmQ7IH0KKworICAgIC8vIFRlcm1pbmF0ZSBhbnkgbG9vcCgpIG9yIHBvbGwoKS4gTWF5IGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQuCisgICAgdm9pZCB0ZXJtaW5hdGUoKTsKKworICAgIGNsYXNzIFJ1bm5hYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflJ1bm5hYmxlKCkge30KKyAgICAgICAgdmlydHVhbCB2b2lkIHJ1bigpID0gMDsKKyAgICB9OworICAgIC8vIEV4ZWN1dGUgYSB0YXNrIG9uIHRoZSBTZWFTb2NrcyB0aHJlYWQuCisgICAgdm9pZCBleGVjdXRlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpOworCitwcml2YXRlOgorICAgIC8vIEZyb20gU2VydmVySW1wbAorICAgIHZpcnR1YWwgdm9pZCByZW1vdmUoQ29ubmVjdGlvbiogY29ubmVjdGlvbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHN1YnNjcmliZVRvV3JpdGVFdmVudHMoQ29ubmVjdGlvbiogY29ubmVjdGlvbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHVuc3Vic2NyaWJlRnJvbVdyaXRlRXZlbnRzKENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFN0YXRpY1BhdGgoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBfc3RhdGljUGF0aDsgfQorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFdlYlNvY2tldDo6SGFuZGxlcj4gZ2V0V2ViU29ja2V0SGFuZGxlcihjb25zdCBjaGFyKiBlbmRwb2ludCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIGlzQ3Jvc3NPcmlnaW5BbGxvd2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZlbmRwb2ludCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IGhhbmRsZShjb25zdCBSZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFN0YXRzRG9jdW1lbnQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgY2hlY2tUaHJlYWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGJvb2wgbWFrZU5vbkJsb2NraW5nKGludCBmZCkgY29uc3Q7CisgICAgYm9vbCBjb25maWd1cmVTb2NrZXQoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGhhbmRsZUFjY2VwdCgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcG9wTmV4dFJ1bm5hYmxlKCk7CisgICAgdm9pZCBwcm9jZXNzRXZlbnRRdWV1ZSgpOworCisgICAgdm9pZCBzaHV0ZG93bigpOworCisgICAgdm9pZCBjaGVja0FuZERpc3BhdGNoRXBvbGwoaW50IGVwb2xsTWlsbGlzKTsKKyAgICB2b2lkIGhhbmRsZVBpcGUoKTsKKyAgICBlbnVtIE5ld1N0YXRlIHsgS2VlcE9wZW4sIENsb3NlIH07CisgICAgTmV3U3RhdGUgaGFuZGxlQ29ubmVjdGlvbkV2ZW50cyhDb25uZWN0aW9uKiBjb25uZWN0aW9uLCB1aW50MzJfdCBldmVudHMpOworCisgICAgLy8gQ29ubmVjdGlvbnMsIG1hcHBlZCB0byBpbml0aWFsIGNvbm5lY3Rpb24gdGltZS4KKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uKiwgdGltZV90PiBfY29ubmVjdGlvbnM7CisgICAgc3RkOjpzaGFyZWRfcHRyPExvZ2dlcj4gX2xvZ2dlcjsKKyAgICBpbnQgX2xpc3RlblNvY2s7CisgICAgaW50IF9lcG9sbEZkOworICAgIGludCBfZXZlbnRGZDsKKyAgICBpbnQgX21heEtlZXBBbGl2ZURyb3BzOworICAgIGludCBfbGFtZUNvbm5lY3Rpb25UaW1lb3V0U2Vjb25kczsKKyAgICB0aW1lX3QgX25leHREZWFkQ29ubmVjdGlvbkNoZWNrOworCisgICAgc3RydWN0IFdlYlNvY2tldEhhbmRsZXJFbnRyeSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxXZWJTb2NrZXQ6OkhhbmRsZXI+IGhhbmRsZXI7CisgICAgICAgIGJvb2wgYWxsb3dDcm9zc09yaWdpbjsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBXZWJTb2NrZXRIYW5kbGVyRW50cnk+IFdlYlNvY2tldEhhbmRsZXJNYXA7CisgICAgV2ViU29ja2V0SGFuZGxlck1hcCBfd2ViU29ja2V0SGFuZGxlck1hcDsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnNoYXJlZF9wdHI8UGFnZUhhbmRsZXI+PiBfcGFnZUhhbmRsZXJzOworCisgICAgc3RkOjptdXRleCBfcGVuZGluZ1J1bm5hYmxlTXV0ZXg7CisgICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4+IF9wZW5kaW5nUnVubmFibGVzOworCisgICAgcGlkX3QgX3RocmVhZElkOworCisgICAgc3RkOjpzdHJpbmcgX3N0YXRpY1BhdGg7CisgICAgc3RkOjphdG9taWM8Ym9vbD4gX3Rlcm1pbmF0ZTsKKyAgICBzdGQ6OmF0b21pYzxib29sPiBfZXhwZWN0ZWRUZXJtaW5hdGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc2Vhc29ja3MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvU2VydmVySW1wbC5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9TZXJ2ZXJJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkZDQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvU2VydmVySW1wbC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9XZWJTb2NrZXQuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgQ29ubmVjdGlvbjsKK2NsYXNzIFJlcXVlc3Q7CitjbGFzcyBSZXNwb25zZTsKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gdXNlZCB0byBnaXZlIGFjY2VzcyB0byBpbnRlcm5hbHMgdG8gQ29ubmVjdGlvbnMuCitjbGFzcyBTZXJ2ZXJJbXBsIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5TZXJ2ZXJJbXBsKCkge30KKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmUoQ29ubmVjdGlvbiogY29ubmVjdGlvbikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzdWJzY3JpYmVUb1dyaXRlRXZlbnRzKENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgdW5zdWJzY3JpYmVGcm9tV3JpdGVFdmVudHMoQ29ubmVjdGlvbiogY29ubmVjdGlvbikgPSAwOworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFN0YXRpY1BhdGgoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8V2ViU29ja2V0OjpIYW5kbGVyPiBnZXRXZWJTb2NrZXRIYW5kbGVyKGNvbnN0IGNoYXIqIGVuZHBvaW50KSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzQ3Jvc3NPcmlnaW5BbGxvd2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZlbmRwb2ludCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBoYW5kbGUoY29uc3QgUmVxdWVzdCAmcmVxdWVzdCkgPSAwOworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U3RhdHNEb2N1bWVudCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY2hlY2tUaHJlYWQoKSBjb25zdCA9IDA7Cit9OworCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1N0cmluZ1V0aWwuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvU3RyaW5nVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDkxMDQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1N0cmluZ1V0aWwuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2hhciogc2tpcFdoaXRlc3BhY2UoY2hhciogc3RyKTsKK2NoYXIqIHNraXBOb25XaGl0ZXNwYWNlKGNoYXIqIHN0cik7CitjaGFyKiBzaGlmdChjaGFyKiYgc3RyKTsKKworc3RkOjpzdHJpbmcgZ2V0TGFzdEVycm9yKCk7CitzdGQ6OnN0cmluZyBmb3JtYXRBZGRyZXNzKGNvbnN0IHNvY2thZGRyX2luJiBhZGRyZXNzKTsKKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwgY2hhciBzcGxpdENoYXIpOworCit2b2lkIHJlcGxhY2Uoc3RkOjpzdHJpbmcmIHN0cmluZywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXBsYWNlKTsKKworYm9vbCBjYXNlSW5zZW5zaXRpdmVTYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZsaHMsIGNvbnN0IHN0ZDo6c3RyaW5nICZyaHMpOworCit9ICAvLyBuYW1lc3BhY2Ugc2Vhc29ja3MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvVG9TdHJpbmcuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvVG9TdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGY2MDdlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy9Ub1N0cmluZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IFQmIG9iaikgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cjsKKyAgICBzdHIgPDwgb2JqOworICAgIHJldHVybiBzdHIuc3RyKCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvV2ViU29ja2V0LmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1dlYlNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjUwOWEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL1dlYlNvY2tldC5oCkBAIC0wLDAgKzEsODYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9SZXF1ZXN0LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK2NsYXNzIFdlYlNvY2tldCA6IHB1YmxpYyBSZXF1ZXN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSBnaXZlbiB0ZXh0IGRhdGEuIE11c3QgYmUgY2FsbGVkIG9uIHRoZSBzZWFzb2NrcyB0aHJlYWQuCisgICAgICogU2VlIFNlcnZlcjo6ZXhlY3V0ZSBmb3IgaG93IHRvIHJ1biB3b3JrIG9uIHRoZSBzZWFzb2NrcworICAgICAqIHRocmVhZCBleHRlcm5hbGx5LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZW5kKGNvbnN0IGNoYXIqIGRhdGEpID0gMDsKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSBnaXZlbiBiaW5hcnkgZGF0YS4gTXVzdCBiZSBjYWxsZWQgb24gdGhlIHNlYXNvY2tzIHRocmVhZC4KKyAgICAgKiBTZWUgU2VydmVyOjpleGVjdXRlIGZvciBob3cgdG8gcnVuIHdvcmsgb24gdGhlIHNlYXNvY2tzCisgICAgICogdGhyZWFkIGV4dGVybmFsbHkuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNlbmQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgPSAwOworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzb2NrZXQuIEl0J3MgaW52YWxpZCB0byBhY2Nlc3MgdGhlIHNvY2tldCBhZnRlcgorICAgICAqIGNhbGxpbmcgY2xvc2UoKS4gVGhlIEhhbmRsZXI6Om9uRGlzY29ubmVjdCgpIGNhbGwgbWF5IG9jY3VyCisgICAgICogYXQgYSBsYXRlciB0aW1lLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBkZWFsaW5nIHdpdGggV2ViU29ja2V0IGNvbm5lY3Rpb25zLgorICAgICAqLworICAgIGNsYXNzIEhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+SGFuZGxlcigpIHsgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgb24gdGhlIHNlYXNvY2tzIHRocmVhZCBkdXJpbmcgaW5pdGlhbCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQ29ubmVjdChXZWJTb2NrZXQqIGNvbm5lY3Rpb24pID0gMDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBvbiB0aGUgc2Vhc29ja3MgdGhyZWFkIHdpdGggdXBvbiByZWNlaXB0IG9mIGEgZnVsbCB0ZXh0IFdlYlNvY2tldCBtZXNzYWdlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRGF0YShXZWJTb2NrZXQqIGNvbm5lY3Rpb24sIGNvbnN0IGNoYXIqIGRhdGEpIHt9CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgb24gdGhlIHNlYXNvY2tzIHRocmVhZCB3aXRoIHVwb24gcmVjZWlwdCBvZiBhIGZ1bGwgYmluYXJ5IFdlYlNvY2tldCBtZXNzYWdlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRGF0YShXZWJTb2NrZXQqIGNvbm5lY3Rpb24sIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHt9CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgb24gdGhlIHNlYXNvY2tzIHRocmVhZCB3aGVuIHRoZSBzb2NrZXQgaGFzIGJlZW4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkRpc2Nvbm5lY3QoV2ViU29ja2V0KiBjb25uZWN0aW9uKSA9IDA7CisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIC8vIFRvIGRlbGV0ZSBhIFdlYlNvY2tldCwganVzdCBjbG9zZSBpdC4gSXQgaXMgb3duZWQgYnkgdGhlIFNlcnZlciwgYW5kCisgICAgLy8gdGhlIHNlcnZlciB3aWxsIGRlbGV0ZSBpdCB3aGVuIGl0J3MgZmluaXNoZWQuCisgICAgdmlydHVhbCB+V2ViU29ja2V0KCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZSBzZWFzb2NrcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy91dGlsL0NyYWNrZWRVcmkuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvdXRpbC9DcmFja2VkVXJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxZWE0MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvdXRpbC9DcmFja2VkVXJpLmgKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgQ3JhY2tlZFVyaSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IF9wYXRoOworICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gX3F1ZXJ5UGFyYW1zOworCitwdWJsaWM6CisgICAgQ3JhY2tlZFVyaShjb25zdCBzdGQ6OnN0cmluZyYgdXJpKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIF9wYXRoOyB9CisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBxdWVyeVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIF9xdWVyeVBhcmFtczsgfQorCisgICAgYm9vbCBoYXNQYXJhbShjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW0pIGNvbnN0OworCisgICAgLy8gUmV0dXJucyB0aGUgdXNlci1zdXBwbGllZCBkZWZhdWx0IGlmIG5vdCBwcmVzZW50LiBSZXR1cm5zIHRoZSBmaXJzdCBmb3VuZCBpbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBwYXJhbXMuCisgICAgc3RkOjpzdHJpbmcgcXVlcnlQYXJhbShjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWYgPSBzdGQ6OnN0cmluZygpKSBjb25zdDsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGxRdWVyeVBhcmFtcyhjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW0pIGNvbnN0OworCisgICAgLy8gUmV0dXJucyBhIG5ldyB1cmkgd2l0aCB0aGUgZnJvbnRtb3N0IHBhdGggaXRlbSBzaGlmdGVkIG9mZi4gIFRoZSBwYXRoCisgICAgLy8gaXMgYWx3YXlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLWVtcHR5LiBJbiB0aGUgY2FzZSBvZiBzaGlmdGluZyB0aGUgbGFzdAorICAgIC8vIHBhdGggZWxlbWVudCwgcmV0dXJucyBhIHBhdGggb2YgeyIifS4KKyAgICBDcmFja2VkVXJpIHNoaWZ0KCkgY29uc3Q7Cit9OworCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvQ3JhY2tlZFVyaVBhZ2VIYW5kbGVyLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvQ3JhY2tlZFVyaVBhZ2VIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4YzM2MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvdXRpbC9DcmFja2VkVXJpUGFnZUhhbmRsZXIuaApAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2Vhc29ja3MvUmVxdWVzdC5oIgorI2luY2x1ZGUgInNlYXNvY2tzL1Jlc3BvbnNlLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvdXRpbC9DcmFja2VkVXJpLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK2NsYXNzIENyYWNrZWRVcmlQYWdlSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q3JhY2tlZFVyaVBhZ2VIYW5kbGVyKCkge30KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBoYW5kbGUoY29uc3QgQ3JhY2tlZFVyaSYgdXJpLCBjb25zdCBSZXF1ZXN0JiByZXF1ZXN0KSA9IDA7CisKKyAgICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxDcmFja2VkVXJpUGFnZUhhbmRsZXI+IFB0cjsKK307CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvdXRpbC9IdG1sLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvSHRtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2U4ODcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvSHRtbC5oCkBAIC0wLDAgKzEsMjA2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2Vhc29ja3MvVG9TdHJpbmcuaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworbmFtZXNwYWNlIGh0bWwgeworCitjbGFzcyBFbGVtZW50IHsKKyAgICBib29sIF9pc1RleHROb2RlOworICAgIGJvb2wgX25lZWRzQ2xvc2U7CisgICAgc3RkOjpzdHJpbmcgX25hbWVPclRleHQ7CisgICAgc3RkOjpzdHJpbmcgX2F0dHJpYnV0ZXM7CisgICAgc3RkOjpsaXN0PEVsZW1lbnQ+IF9jaGlsZHJlbjsKKworICAgIHZvaWQgYXBwZW5kKCkgeworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgdm9pZCBhcHBlbmQoY29uc3QgVCYgdCwgQXJncyYmIC4uLmFyZ3MpIHsKKyAgICAgICAgb3BlcmF0b3I8PCh0KTsKKyAgICAgICAgYXBwZW5kKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgfQorCisgICAgRWxlbWVudCgpIDogX2lzVGV4dE5vZGUodHJ1ZSksIF9uZWVkc0Nsb3NlKGZhbHNlKSB7fQorcHVibGljOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgYm9vbCBuZWVkc0Nsb3NlLCBBcmdzJiYuLi4gYXJncykgOgorICAgICAgICBfaXNUZXh0Tm9kZShmYWxzZSksCisgICAgICAgIF9uZWVkc0Nsb3NlKG5lZWRzQ2xvc2UpLAorICAgICAgICBfbmFtZU9yVGV4dChuYW1lKSB7CisgICAgICAgIGFwcGVuZChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIEVsZW1lbnQgdGV4dEVsZW1lbnQoY29uc3QgVCYgdGV4dCkgeworICAgICAgICBFbGVtZW50IGU7CisgICAgICAgIGUuX25hbWVPclRleHQgPSB0b1N0cmluZyh0ZXh0KTsKKyAgICAgICAgcmV0dXJuIGU7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBFbGVtZW50JiBhZGRBdHRyaWJ1dGUoY29uc3QgY2hhciogYXR0ciwgY29uc3QgVCYgdmFsdWUpIHsKKyAgICAgICAgX2F0dHJpYnV0ZXMgKz0gc3RkOjpzdHJpbmcoIiAiKSArIGF0dHIgKyAiPVwiIiArIHRvU3RyaW5nKHZhbHVlKSArICJcIiI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFbGVtZW50JiBjbGF6eihjb25zdCBzdGQ6OnN0cmluZyYgY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGFkZEF0dHJpYnV0ZSgiY2xhc3MiLCBjbGF6eik7CisgICAgfQorCisgICAgRWxlbWVudCYgdGl0bGUoY29uc3Qgc3RkOjpzdHJpbmcmIHRpdGxlKSB7CisgICAgICAgIHJldHVybiBhZGRBdHRyaWJ1dGUoInRpdGxlIiwgdGl0bGUpOworICAgIH0KKworICAgIEVsZW1lbnQmIHN0eWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHlsZSkgeworICAgICAgICByZXR1cm4gYWRkQXR0cmlidXRlKCJzdHlsZSIsIHN0eWxlKTsKKyAgICB9CisKKyAgICBFbGVtZW50JiBhbHQoY29uc3Qgc3RkOjpzdHJpbmcmIGFsdCkgeworICAgICAgICByZXR1cm4gYWRkQXR0cmlidXRlKCJhbHQiLCBhbHQpOworICAgIH0KKworICAgIEVsZW1lbnQmIGhpZGRlbigpIHsKKyAgICAgICAgcmV0dXJuIGFkZEF0dHJpYnV0ZSgic3R5bGUiLCAiZGlzcGxheTpub25lOyIpOworICAgIH0KKworICAgIEVsZW1lbnQmIGlkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgeworICAgICAgICByZXR1cm4gYWRkQXR0cmlidXRlKCJpZCIsIGlkKTsKKyAgICB9CisKKyAgICBFbGVtZW50JiBvcGVyYXRvciA8PChjb25zdCBjaGFyKiBjaGlsZCkgeworICAgICAgICBfY2hpbGRyZW4ucHVzaF9iYWNrKHRleHRFbGVtZW50KGNoaWxkKSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFbGVtZW50JiBvcGVyYXRvciA8PChjb25zdCBzdGQ6OnN0cmluZyYgY2hpbGQpIHsKKyAgICAgICAgX2NoaWxkcmVuLnB1c2hfYmFjayh0ZXh0RWxlbWVudChjaGlsZCkpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRWxlbWVudCYgb3BlcmF0b3IgPDwoY29uc3QgRWxlbWVudCYgY2hpbGQpIHsKKyAgICAgICAgX2NoaWxkcmVuLnB1c2hfYmFjayhjaGlsZCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlIHx8IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlLCBFbGVtZW50Jj46OnR5cGUKKyAgICBvcGVyYXRvciA8PChjb25zdCBUJiBjaGlsZCkgeworICAgICAgICBfY2hpbGRyZW4ucHVzaF9iYWNrKHRleHRFbGVtZW50KGNoaWxkKSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRWxlbWVudCYgZWxlbSkgeworICAgICAgICBpZiAoZWxlbS5faXNUZXh0Tm9kZSkgeworICAgICAgICAgICAgb3MgPDwgZWxlbS5fbmFtZU9yVGV4dDsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGVsZW0uX2NoaWxkcmVuLmNiZWdpbigpOyBpdCAhPSBlbGVtLl9jaGlsZHJlbi5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBvcyA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb3M7CisgICAgICAgIH0KKyAgICAgICAgb3MgPDwgIjwiIDw8IGVsZW0uX25hbWVPclRleHQgPDwgZWxlbS5fYXR0cmlidXRlcyA8PCAiPiI7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGVsZW0uX2NoaWxkcmVuLmNiZWdpbigpOyBpdCAhPSBlbGVtLl9jaGlsZHJlbi5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIG9zIDw8ICppdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbS5fbmVlZHNDbG9zZSkgeworICAgICAgICAgICAgb3MgPDwgIjwvIiA8PCBlbGVtLl9uYW1lT3JUZXh0IDw8ICI+IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgRj4KKyAgICBFbGVtZW50JiBhZGRBbGwoY29uc3QgQyYgY29udGFpbmVyLCBGIGZ1bmN0b3IpIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29udGFpbmVyLmNiZWdpbigpOyBpdCAhPSBjb250YWluZXIuY2VuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBvcGVyYXRvcjw8KGZ1bmN0b3IoKml0KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICBvcyA8PCAqdGhpczsKKyAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KK307CisKKyNkZWZpbmUgSFRNTEVMRU0oWFgpIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+IGlubGluZSBFbGVtZW50IFhYKEFyZ3MmJi4uLiBhcmdzKSB7IHJldHVybiBFbGVtZW50KCNYWCwgdHJ1ZSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsgfQorSFRNTEVMRU0oaHRtbCkKK0hUTUxFTEVNKGhlYWQpCitIVE1MRUxFTSh0aXRsZSkKK0hUTUxFTEVNKGJvZHkpCitIVE1MRUxFTShoMSkKK0hUTUxFTEVNKGgyKQorSFRNTEVMRU0oaDMpCitIVE1MRUxFTShoNCkKK0hUTUxFTEVNKGg1KQorSFRNTEVMRU0odGFibGUpCitIVE1MRUxFTSh0aGVhZCkKK0hUTUxFTEVNKHRib2R5KQorSFRNTEVMRU0odHIpCitIVE1MRUxFTSh0ZCkKK0hUTUxFTEVNKHRoKQorSFRNTEVMRU0oZGl2KQorSFRNTEVMRU0oc3BhbikKK0hUTUxFTEVNKHVsKQorSFRNTEVMRU0ob2wpCitIVE1MRUxFTShsaSkKK0hUTUxFTEVNKGxhYmVsKQorSFRNTEVMRU0oYnV0dG9uKQorI3VuZGVmIEhUTUxFTEVNCisKK2lubGluZSBFbGVtZW50IGVtcHR5KCkgeyByZXR1cm4gRWxlbWVudDo6dGV4dEVsZW1lbnQoIiIpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgRWxlbWVudCB0ZXh0KGNvbnN0IFQmIHQpIHsgcmV0dXJuIEVsZW1lbnQ6OnRleHRFbGVtZW50KHQpOyB9CisKK2lubGluZSBFbGVtZW50IGltZyhjb25zdCBzdGQ6OnN0cmluZyYgc3JjKSB7IHJldHVybiBFbGVtZW50KCJpbWciLCBmYWxzZSkuYWRkQXR0cmlidXRlKCJzcmMiLCBzcmMpOyB9CisKK2lubGluZSBFbGVtZW50IGNoZWNrYm94KCkgeyByZXR1cm4gRWxlbWVudCgiaW5wdXQiLCBmYWxzZSkuYWRkQXR0cmlidXRlKCJ0eXBlIiwgImNoZWNrYm94Iik7IH0KKworaW5saW5lIEVsZW1lbnQgZXh0ZXJuYWxTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIHNyYykgeyByZXR1cm4gRWxlbWVudCgic2NyaXB0IiwgdHJ1ZSkuYWRkQXR0cmlidXRlKCJzcmMiLCBzcmMpLmFkZEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2phdmFzY3JpcHQiKTsgfQorCitpbmxpbmUgRWxlbWVudCBpbmxpbmVTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIHNjcmlwdCkgeyByZXR1cm4gRWxlbWVudCgic2NyaXB0IiwgdHJ1ZSwgc2NyaXB0KS5hZGRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9qYXZhc2NyaXB0Iik7IH0KKworaW5saW5lIEVsZW1lbnQgbGluayhjb25zdCBzdGQ6OnN0cmluZyYgaHJlZiwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlbCkgeworICAgIHJldHVybiBFbGVtZW50KCJsaW5rIiwgZmFsc2UpLmFkZEF0dHJpYnV0ZSgiaHJlZiIsIGhyZWYpLmFkZEF0dHJpYnV0ZSgicmVsIiwgcmVsKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUuLi5BcmdzPiBpbmxpbmUgRWxlbWVudCBhKGNvbnN0IHN0ZDo6c3RyaW5nJiBocmVmLCBBcmdzJiYuLi4gYXJncykgeworICAgIHJldHVybiBFbGVtZW50KCJhIiwgdHJ1ZSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKS5hZGRBdHRyaWJ1dGUoImhyZWYiLCBocmVmKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGh0bWwKKworfSAgLy8gbmFtZXNwYWNlIHNlYXNvY2tzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvSnNvbi5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy91dGlsL0pzb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGE2OWRjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy91dGlsL0pzb24uaApAQCAtMCwwICsxLDIzMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbmxpbmUgdm9pZCBqc29uVG9TdHJlYW0oc3RkOjpvc3RyZWFtJiBzdHIpIHt9CisKK3ZvaWQganNvblRvU3RyZWFtKHN0ZDo6b3N0cmVhbSYgc3RyLCBjb25zdCBjaGFyKiB0KTsKKwordm9pZCBqc29uVG9TdHJlYW0oc3RkOjpvc3RyZWFtJiBzdHIsIGJvb2wgYik7CisKK2lubGluZSB2b2lkIGpzb25Ub1N0cmVhbShzdGQ6Om9zdHJlYW0mIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHQpIHsKKyAgICBqc29uVG9TdHJlYW0oc3RyLCB0LmNfc3RyKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBPPgorY2xhc3MgaXNfanNvbmFibGUgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9PPgorICAgIHN0YXRpYyBhdXRvIHRlc3QoaW50KQorICAgIC0+IGRlY2x0eXBlKCZPTzo6anNvblRvU3RyZWFtLCBzdGQ6OnRydWVfdHlwZSgpKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBhdXRvIHRlc3QoLi4uKSAtPiBzdGQ6OmZhbHNlX3R5cGU7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBkZWNsdHlwZSh0ZXN0PE8+KDApKTo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgaXNfc3RyZWFtYWJsZSB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFQ+CisgICAgc3RhdGljIGF1dG8gdGVzdChpbnQpCisgICAgLT4gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPHN0ZDo6b3N0cmVhbSY+KCkgPDwgc3RkOjpkZWNsdmFsPFRUPigpLCBzdGQ6OnRydWVfdHlwZSgpKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBhdXRvIHRlc3QoLi4uKSAtPiBzdGQ6OmZhbHNlX3R5cGU7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBkZWNsdHlwZSh0ZXN0PFQ+KDApKTo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19mdW5kYW1lbnRhbDxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCitqc29uVG9TdHJlYW0oc3RkOjpvc3RyZWFtJiBzdHIsIGNvbnN0IFQmIHQpIHsKKyAgICBzdHIgPDwgdDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2pzb25hYmxlPFQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKK2pzb25Ub1N0cmVhbShzdGQ6Om9zdHJlYW0mIHN0ciwgY29uc3QgVCYgdCkgeworICAgIHQuanNvblRvU3RyZWFtKHN0cik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAhc3RkOjppc19mdW5kYW1lbnRhbDxUPjo6dmFsdWUKKyAgICAmJiBpc19zdHJlYW1hYmxlPFQ+Ojp2YWx1ZQorICAgICYmICFpc19qc29uYWJsZTxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCitqc29uVG9TdHJlYW0oc3RkOjpvc3RyZWFtJiBzdHIsIGNvbnN0IFQmIHQpIHsKKyAgICBzdHIgPDwgJyInIDw8IHQgPDwgJyInOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi4gQXJncz4KK3ZvaWQganNvblRvU3RyZWFtKHN0ZDo6b3N0cmVhbSYgc3RyLCBjb25zdCBUJiB0LCBBcmdzJiYuLi4gYXJncykgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKEFyZ3MpID4gMCwgIkNhbm5vdCBzdHJlYW0gYW4gb2JqZWN0IHdpdGggbm8ganNvblRvU3RyZWFtIG9yIG9wZXJhdG9yPDwgbWV0aG9kLiIpOworICAgIGpzb25Ub1N0cmVhbShzdHIsIHQpOworICAgIHN0ciA8PCAiLCI7CisgICAganNvblRvU3RyZWFtKHN0ciwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW5saW5lIHZvaWQganNvbktleVBhaXJUb1N0cmVhbShzdGQ6Om9zdHJlYW0mIHN0cikge30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQganNvbktleVBhaXJUb1N0cmVhbShzdGQ6Om9zdHJlYW0mIHN0ciwgY29uc3QgY2hhcioga2V5LCBjb25zdCBUJiB2YWx1ZSkgeworICAgIGpzb25Ub1N0cmVhbShzdHIsIGtleSk7CisgICAgc3RyIDw8ICI6IjsKKyAgICBqc29uVG9TdHJlYW0oc3RyLCB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGpzb25LZXlQYWlyVG9TdHJlYW0oc3RkOjpvc3RyZWFtJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IFQmIHZhbHVlKSB7CisgICAganNvbktleVBhaXJUb1N0cmVhbShzdHIsIGtleS5jX3N0cigpLCB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGpzb25LZXlQYWlyVG9TdHJlYW0oc3RkOjpvc3RyZWFtJiBzdHIsIGNvbnN0IFQmKSB7CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPFQsIFQ+Ojp2YWx1ZSwgIC8vIFRvIG1ha2UgdGhlIGFzc2VydGlvbiBkZXBlbmQgb24gVAorICAgICAgICAgICAgIlJlcXVpcmVzIGFuIGV2ZW4gbnVtYmVyIG9mIHBhcmFtZXRlcnMuIElmIHlvdSdyZSB0cnlpbmcgdG8gYnVpbGQgYSBtYXAgZnJvbSBhbiBleGlzdGluZyBzdGQ6Om1hcCBvciBzaW1pbGFyLCB1c2UgbWFrZU1hcEZyb21Db250YWluZXIiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgViwgdHlwZW5hbWUuLi4gQXJncz4KK3ZvaWQganNvbktleVBhaXJUb1N0cmVhbShzdGQ6Om9zdHJlYW0mIHN0ciwgY29uc3QgSyYga2V5LCBjb25zdCBWJiB2YWx1ZSwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBqc29uS2V5UGFpclRvU3RyZWFtKHN0ciwga2V5LCB2YWx1ZSk7CisgICAgc3RyIDw8ICIsIjsKKyAgICBqc29uS2V5UGFpclRvU3RyZWFtKHN0ciwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKK30KKworc3RydWN0IEpzb25uZWRTdHJpbmcgOiBzdGQ6OnN0cmluZyB7CisgICAgSnNvbm5lZFN0cmluZygpIHt9CisgICAgSnNvbm5lZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgOiBzdGQ6OnN0cmluZyhzKSB7fQorICAgIEpzb25uZWRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmdzdHJlYW0mIHN0cikgOiBzdGQ6OnN0cmluZyhzdHIuc3RyKCkpIHt9CisgICAgdm9pZCBqc29uVG9TdHJlYW0oc3RkOjpvc3RyZWFtICZvKSBjb25zdCB7CisgICAgICAgIG8gPDwgKnRoaXM7CisgICAgfQorfTsKK3N0YXRpY19hc3NlcnQoaXNfc3RyZWFtYWJsZTxKc29ubmVkU3RyaW5nPjo6dmFsdWUsICJJbnRlcm5hbCBzdHJlYW0gcHJvYmxlbSIpOworc3RhdGljX2Fzc2VydChpc19qc29uYWJsZTxKc29ubmVkU3RyaW5nPjo6dmFsdWUsICJJbnRlcm5hbCBzdHJlYW0gcHJvYmxlbSIpOworCitzdHJ1Y3QgRXBvY2hUaW1lQXNMb2NhbCB7CisgICAgdGltZV90IHQ7CisgICAgRXBvY2hUaW1lQXNMb2NhbCh0aW1lX3QgdCkgOiB0KHQpIHt9CisgICAgdm9pZCBqc29uVG9TdHJlYW0oc3RkOjpvc3RyZWFtICZvKSBjb25zdDsKK307CitzdGF0aWNfYXNzZXJ0KGlzX2pzb25hYmxlPEVwb2NoVGltZUFzTG9jYWw+Ojp2YWx1ZSwgIkludGVybmFsIHN0cmVhbSBwcm9ibGVtIik7CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitKc29ubmVkU3RyaW5nIG1ha2VNYXAoQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHI7CisgICAgc3RyIDw8ICd7JzsKKyAgICBqc29uS2V5UGFpclRvU3RyZWFtKHN0ciwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICBzdHIgPDwgJ30nOworICAgIHJldHVybiBKc29ubmVkU3RyaW5nKHN0cik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitKc29ubmVkU3RyaW5nIG1ha2VNYXBGcm9tQ29udGFpbmVyKGNvbnN0IFQmIG0pIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHI7CisgICAgc3RyIDw8ICJ7IjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogbSkgeworICAgICAgICBpZiAoIWZpcnN0KSBzdHIgPDwgIiwiOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBqc29uS2V5UGFpclRvU3RyZWFtKHN0ciwgaXQuZmlyc3QsIGl0LnNlY29uZCk7CisgICAgfQorICAgIHN0ciA8PCAifSI7CisgICAgcmV0dXJuIEpzb25uZWRTdHJpbmcoc3RyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgLi4uIEFyZ3M+CitKc29ubmVkU3RyaW5nIG1ha2VBcnJheShBcmdzJiYuLi4gYXJncykgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cjsKKyAgICBzdHIgPDwgJ1snOworICAgIGpzb25Ub1N0cmVhbShzdHIsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgc3RyIDw8ICddJzsKKyAgICByZXR1cm4gSnNvbm5lZFN0cmluZyhzdHIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorSnNvbm5lZFN0cmluZyBtYWtlQXJyYXlGcm9tQ29udGFpbmVyKGNvbnN0IFQgJmxpc3QpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHI7CisgICAgc3RyIDw8ICdbJzsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnMgOiBsaXN0KSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgIHN0ciA8PCAnLCc7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAganNvblRvU3RyZWFtKHN0ciwgcyk7CisgICAgfTsKKyAgICBzdHIgPDwgJ10nOworICAgIHJldHVybiBKc29ubmVkU3RyaW5nKHN0cik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitKc29ubmVkU3RyaW5nIG1ha2VBcnJheShjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmxpc3QpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHI7CisgICAgc3RyIDw8ICdbJzsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnMgOiBsaXN0KSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgIHN0ciA8PCAnLCc7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAganNvblRvU3RyZWFtKHN0ciwgcyk7CisgICAgfTsKKyAgICBzdHIgPDwgJ10nOworICAgIHJldHVybiBKc29ubmVkU3RyaW5nKHN0cik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIC4uLiBBcmdzPgorSnNvbm5lZFN0cmluZyBtYWtlRXhlY1N0cmluZyhjb25zdCBjaGFyKiBmdW5jdGlvbiwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHI7CisgICAgc3RyIDw8IGZ1bmN0aW9uIDw8ICcoJzsKKyAgICBqc29uVG9TdHJlYW0oc3RyLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIHN0ciA8PCAnKSc7CisgICAgcmV0dXJuIEpzb25uZWRTdHJpbmcoc3RyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0pzb25uZWRTdHJpbmcgdG9fanNvbihjb25zdCBUICZvYmopIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHI7CisgICAganNvblRvU3RyZWFtKHN0ciwgb2JqKTsKKyAgICByZXR1cm4gc3RyLnN0cigpOworfQorCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvUGF0aEhhbmRsZXIuaCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvdXRpbC9QYXRoSGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWY4MjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvUGF0aEhhbmRsZXIuaApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2Vhc29ja3MvdXRpbC9DcmFja2VkVXJpUGFnZUhhbmRsZXIuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworLy8gSGFuZGxlcyBhIHN1YnBhdGggb2YgYSB3ZWJzaXRlLiAgUGFzc2VzIG9uIGEgc2hpZnRlZCBwYXRoIHRvIHRoZSByZWdpc3RlcmVkCisvLyBzdWJoYW5kbGVycy4gIFVzZWZ1bCwgZm9yIGV4YW1wbGUsIHRvIHBsYWNlIGEgYnVuY2ggb2YgaGFuZGxlcnMgYmVuZWF0aCBhCisvLyBjb21tb24gc3VicGF0aCBvbiB0aGUgc2VydmVyLCBlLmcuCisvLyBQYXRoSGFuZGxlcigiZGVidWciKQorLy8gICAuYWRkKG1ha2Vfc2hhcmVkPERlYnVnU3RhdHNIYW5kbGVyPigpKQorLy8gICAuYWRkKG1ha2Vfc2hhcmVkPEFub3RoZXJEZWJ1Z1RoaW5nPigpKQorLy8gICAuYWRkKC4uLikgZXRjCisvLyBFYWNoIGhhbmRsZXIncyBDcmFja2VkVXJpIHdpbGwgYmUgc2hpZnRlZCAoaS5lLiB3b24ndCBoYXZlIHRoZSAiZGVidWciCisvLyBwcmVmaXgpCitjbGFzcyBQYXRoSGFuZGxlciA6IHB1YmxpYyBDcmFja2VkVXJpUGFnZUhhbmRsZXIgeworICAgIHN0ZDo6c3RyaW5nIF9wYXRoOworICAgIHN0ZDo6dmVjdG9yPENyYWNrZWRVcmlQYWdlSGFuZGxlcjo6UHRyPiBfaGFuZGxlcnM7CisKK3B1YmxpYzoKKyAgICBQYXRoSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkgOiBfcGF0aChwYXRoKSB7fQorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgUGF0aEhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIEFyZ3MmJi4uLiBhcmdzKSA6IF9wYXRoKHBhdGgpIHsKKyAgICAgICAgYWRkTWFueShzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIH0KKworICAgIENyYWNrZWRVcmlQYWdlSGFuZGxlcjo6UHRyIGFkZChjb25zdCBDcmFja2VkVXJpUGFnZUhhbmRsZXI6OlB0ciYgaGFuZGxlcik7CisKKyAgICB2b2lkIGFkZE1hbnkoKSB7fQorICAgIHZvaWQgYWRkTWFueShjb25zdCBDcmFja2VkVXJpUGFnZUhhbmRsZXI6OlB0ciYgaGFuZGxlcikgeyBhZGQoaGFuZGxlcik7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBSZXN0PgorICAgIHZvaWQgYWRkTWFueShjb25zdCBDcmFja2VkVXJpUGFnZUhhbmRsZXI6OlB0ciYgaGFuZGxlciwgUmVzdCYmLi4uIHJlc3QpIHsKKyAgICAgICAgYWRkKGhhbmRsZXIpOworICAgICAgICBhZGRNYW55KHN0ZDo6Zm9yd2FyZDxSZXN0PihyZXN0KS4uLik7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IGhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IENyYWNrZWRVcmkmIHVyaSwgY29uc3QgUmVxdWVzdCYgcmVxdWVzdCkgb3ZlcnJpZGU7Cit9OworCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvUm9vdFBhZ2VIYW5kbGVyLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvUm9vdFBhZ2VIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyY2UxYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2Vhc29ja3MvdXRpbC9Sb290UGFnZUhhbmRsZXIuaApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2Vhc29ja3MvUGFnZUhhbmRsZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy91dGlsL0NyYWNrZWRVcmlQYWdlSGFuZGxlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgUm9vdFBhZ2VIYW5kbGVyIDogcHVibGljIFBhZ2VIYW5kbGVyIHsKKyAgICBzdGQ6OnZlY3RvcjxDcmFja2VkVXJpUGFnZUhhbmRsZXI6OlB0cj4gX2hhbmRsZXJzOworCitwdWJsaWM6CisgICAgUm9vdFBhZ2VIYW5kbGVyKCk7CisgICAgdmlydHVhbCB+Um9vdFBhZ2VIYW5kbGVyKCk7CisKKyAgICBDcmFja2VkVXJpUGFnZUhhbmRsZXI6OlB0ciBhZGQoY29uc3QgQ3JhY2tlZFVyaVBhZ2VIYW5kbGVyOjpQdHImIGhhbmRsZXIpOworCisgICAgLy8gRnJvbSBQYWdlSGFuZGxlci4KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gaGFuZGxlKGNvbnN0IFJlcXVlc3QmIHJlcXVlc3QpIG92ZXJyaWRlOworfTsKKworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy91dGlsL1N0YXRpY1Jlc3BvbnNlSGFuZGxlci5oIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zZWFzb2Nrcy91dGlsL1N0YXRpY1Jlc3BvbnNlSGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNmM1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NlYXNvY2tzL3V0aWwvU3RhdGljUmVzcG9uc2VIYW5kbGVyLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSA8c2Vhc29ja3MvdXRpbC9DcmFja2VkVXJpUGFnZUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxzZWFzb2Nrcy9SZXNwb25zZS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2Ugc2Vhc29ja3MgeworCisvLyBSZXR1cm5zIGEgY2FubmVkIHJlc3BvbnNlIGZvciBhIGdpdmVuIHBhdGhuYW1lLgorY2xhc3MgU3RhdGljUmVzcG9uc2VIYW5kbGVyIDogcHVibGljIENyYWNrZWRVcmlQYWdlSGFuZGxlciB7CisgICAgc3RkOjpzdHJpbmcgX3BhdGg7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBfcmVzcG9uc2U7CisKK3B1YmxpYzoKKyAgICBTdGF0aWNSZXNwb25zZUhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4gcmVzcG9uc2UpCisgICAgOiBfcGF0aChwYXRoKSwgX3Jlc3BvbnNlKHJlc3BvbnNlKSB7fQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IGhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IENyYWNrZWRVcmkmIHVyaSwKKyAgICAgICAgICAgIGNvbnN0IFJlcXVlc3QmKSBvdmVycmlkZSB7CisgICAgICAgIGlmICh1cmkucGF0aCgpLnNpemUoKSAhPSAxIHx8IHVyaS5wYXRoKClbMF0gIT0gX3BhdGgpCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2U6OnVuaGFuZGxlZCgpOworICAgICAgICByZXR1cm4gX3Jlc3BvbnNlOworICAgIH0KK307CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2hhMS9NYWtlZmlsZSBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2hhMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFhZjJiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zaGExL01ha2VmaWxlCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgIE1ha2VmaWxlCisjICAKKyMgIENvcHlyaWdodCAoQykgMTk5OCwgMjAwOQorIyAgUGF1bCBFLiBKb25lcyA8cGF1bGVqQHBhY2tldGl6ZXIuY29tPgorIyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAkSWQ6IE1ha2VmaWxlIDEyIDIwMDktMDYtMjIgMTk6MzQ6MjVaIHBhdWxlaiAkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgRGVzY3JpcHRpb246CisjCVRoaXMgaXMgYSBtYWtlZmlsZSBmb3IgVU5JWCB0byBidWlsZCB0aGUgcHJvZ3JhbXMgc2hhLCBzaGFjbXAsIGFuZAorIwlzaGF0ZXN0CisjCisjCisKK0NDCT0gZysrCisKK0NGTEFHUwk9IC1jIC1PMiAtV2FsbCAtRF9GSUxFX09GRlNFVF9CSVRTPTY0CisKK0xJQlMJPQorCitPQkpTCT0gc2hhMS5vCisKK2FsbDogc2hhIHNoYWNtcCBzaGF0ZXN0CisKK3NoYTogc2hhLm8gJChPQkpTKQorCSQoQ0MpIC1vICRAIHNoYS5vICQoT0JKUykgJChMSUJTKQorCitzaGFjbXA6IHNoYWNtcC5vICQoT0JKUykKKwkkKENDKSAtbyAkQCBzaGFjbXAubyAkKE9CSlMpICQoTElCUykKKworc2hhdGVzdDogc2hhdGVzdC5vICQoT0JKUykKKwkkKENDKSAtbyAkQCBzaGF0ZXN0Lm8gJChPQkpTKSAkKExJQlMpCisKKyUubzogJS5jcHAKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgJDwKKworY2xlYW46CisJJChSTSkgKi5vIHNoYSBzaGFjbXAgc2hhdGVzdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zaGExL01ha2VmaWxlLm50IGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zaGExL01ha2VmaWxlLm50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWNmNjQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NoYTEvTWFrZWZpbGUubnQKQEAgLTAsMCArMSw0OCBAQAorIw0KKyMgIE1ha2VmaWxlLm50DQorIyAgDQorIyAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDA5DQorIyAgUGF1bCBFLiBKb25lcyA8cGF1bGVqQHBhY2tldGl6ZXIuY29tPg0KKyMgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorIw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIyAgJElkOiBNYWtlZmlsZS5udCAxMyAyMDA5LTA2LTIyIDIwOjIwOjMyWiBwYXVsZWogJA0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgIERlc2NyaXB0aW9uOg0KKyMJVGhpcyBpcyBhIG1ha2VmaWxlIGZvciBXaW4zMiB0byBidWlsZCB0aGUgcHJvZ3JhbXMgc2hhLCBzaGFjbXAsIGFuZA0KKyMJc2hhdGVzdA0KKyMNCisjICBQb3J0YWJpbGl0eSBJc3N1ZXM6DQorIwlEZXNpZ25lZCB0byB3b3JrIHdpdGggVmlzdWFsIEMrKw0KKyMNCisjDQorDQorLnNpbGVudDoNCisNCishaW5jbHVkZSA8d2luMzIubWFrPg0KKw0KK1JNCT0gZGVsIC9xDQorDQorTElCUwk9ICQoY29ubGlicykgc2V0YXJndi5vYmoNCisNCitDRkxBR1MJPSAtRCBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAvRUhzYyAvTzIgL1czDQorDQorT0JKUwk9IHNoYTEub2JqDQorDQorYWxsOiBzaGEuZXhlIHNoYWNtcC5leGUgc2hhdGVzdC5leGUNCisNCitzaGEuZXhlOiBzaGEub2JqICQoT0JKUykNCisJJChsaW5rKSAkKGNvbmZsYWdzKSAtb3V0OiRAIHNoYS5vYmogJChPQkpTKSAkKExJQlMpDQorDQorc2hhY21wLmV4ZTogc2hhY21wLm9iaiAkKE9CSlMpDQorCSQobGluaykgJChjb25mbGFncykgLW91dDokQCBzaGFjbXAub2JqICQoT0JKUykgJChMSUJTKQ0KKw0KK3NoYXRlc3QuZXhlOiBzaGF0ZXN0Lm9iaiAkKE9CSlMpDQorCSQobGluaykgJChjb25mbGFncykgLW91dDokQCBzaGF0ZXN0Lm9iaiAkKE9CSlMpICQoTElCUykNCisNCisuY3BwLm9iajoNCisJJChjYykgJChDRkxBR1MpICQoY2ZsYWdzKSAkKGN2YXJzKSAkPA0KKw0KK2NsZWFuOg0KKwkkKFJNKSAqLm9iaiBzaGEuZXhlIHNoYWNtcC5leGUgc2hhdGVzdC5leGUNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NoYTEvbGljZW5zZS50eHQgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NoYTEvbGljZW5zZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3ZjM5NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2hhMS9saWNlbnNlLnR4dApAQCAtMCwwICsxLDE0IEBACitDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDkNCitQYXVsIEUuIEpvbmVzIDxwYXVsZWpAcGFja2V0aXplci5jb20+DQorDQorRnJlZXdhcmUgUHVibGljIExpY2Vuc2UgKEZQTCkNCisNCitUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzICJmcmVld2FyZS4iICBQZXJtaXNzaW9uIHRvIGRpc3RyaWJ1dGUNCit0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCBpbmNsdWRpbmcgaW5jb3Jwb3JhdGlvbiANCitpbnRvIG90aGVyIHByb2R1Y3RzLCBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGEgZmVlLiAgVEhJUyBTT0ZUV0FSRSANCitJUyBQUk9WSURFRCAnQVMgSVMnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCANCitJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgDQorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEFVVEhPUiBTSEFMTCBOT1QgQkUgSEVMRCANCitMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRUlUSEVSIA0KK0RJUkVDVExZIE9SIElORElSRUNUTFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBMT1NTIE9GIERBVEEgDQorT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFLg0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2hhMS9zaGExLmNwcCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2hhMS9zaGExLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQyNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy9zaGExL3NoYTEuY3BwCkBAIC0wLDAgKzEsNjE1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIERPIE5PVCBSRUZPUk1BVCA8LSBmb3IgdGlkeQorLyoKKyAqICBzaGExLmNwcAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDkKKyAqICBQYXVsIEUuIEpvbmVzIDxwYXVsZWpAcGFja2V0aXplci5jb20+CisgKiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAkSWQ6IHNoYTEuY3BwIDEyIDIwMDktMDYtMjIgMTk6MzQ6MjVaIHBhdWxlaiAkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgU2VjdXJlIEhhc2hpbmcgU3RhbmRhcmQgYXMgZGVmaW5lZAorICogICAgICBpbiBGSVBTIFBVQiAxODAtMSBwdWJsaXNoZWQgQXByaWwgMTcsIDE5OTUuCisgKgorICogICAgICBUaGUgU2VjdXJlIEhhc2hpbmcgU3RhbmRhcmQsIHdoaWNoIHVzZXMgdGhlIFNlY3VyZSBIYXNoaW5nCisgKiAgICAgIEFsZ29yaXRobSAoU0hBKSwgcHJvZHVjZXMgYSAxNjAtYml0IG1lc3NhZ2UgZGlnZXN0IGZvciBhCisgKiAgICAgIGdpdmVuIGRhdGEgc3RyZWFtLiAgSW4gdGhlb3J5LCBpdCBpcyBoaWdobHkgaW1wcm9iYWJsZSB0aGF0CisgKiAgICAgIHR3byBtZXNzYWdlcyB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgbWVzc2FnZSBkaWdlc3QuICBUaGVyZWZvcmUsCisgKiAgICAgIHRoaXMgYWxnb3JpdGhtIGNhbiBzZXJ2ZSBhcyBhIG1lYW5zIG9mIHByb3ZpZGluZyBhICJmaW5nZXJwcmludCIKKyAqICAgICAgZm9yIGEgbWVzc2FnZS4KKyAqCisgKiAgUG9ydGFiaWxpdHkgSXNzdWVzOgorICogICAgICBTSEEtMSBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIDMyLWJpdCAid29yZHMiLiAgVGhpcyBjb2RlIHdhcworICogICAgICB3cml0dGVuIHdpdGggdGhlIGV4cGVjdGF0aW9uIHRoYXQgdGhlIHByb2Nlc3NvciBoYXMgYXQgbGVhc3QKKyAqICAgICAgYSAzMi1iaXQgbWFjaGluZSB3b3JkIHNpemUuICBJZiB0aGUgbWFjaGluZSB3b3JkIHNpemUgaXMgbGFyZ2VyLAorICogICAgICB0aGUgY29kZSBzaG91bGQgc3RpbGwgZnVuY3Rpb24gcHJvcGVybHkuICBPbmUgY2F2ZWF0IHRvIHRoYXQKKyAqICAgICAgaXMgdGhhdCB0aGUgaW5wdXQgZnVuY3Rpb25zIHRha2luZyBjaGFyYWN0ZXJzIGFuZCBjaGFyYWN0ZXIgYXJyYXlzCisgKiAgICAgIGFzc3VtZSB0aGF0IG9ubHkgOCBiaXRzIG9mIGluZm9ybWF0aW9uIGFyZSBzdG9yZWQgaW4gZWFjaCBjaGFyYWN0ZXIuCisgKgorICogIENhdmVhdHM6CisgKiAgICAgIFNIQS0xIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBtZXNzYWdlcyBsZXNzIHRoYW4gMl42NCBiaXRzIGxvbmcuCisgKiAgICAgIEFsdGhvdWdoIFNIQS0xIGFsbG93cyBhIG1lc3NhZ2UgZGlnZXN0IHRvIGJlIGdlbmVyYXRlZCBmb3IKKyAqICAgICAgbWVzc2FnZXMgb2YgYW55IG51bWJlciBvZiBiaXRzIGxlc3MgdGhhbiAyXjY0LCB0aGlzIGltcGxlbWVudGF0aW9uCisgKiAgICAgIG9ubHkgd29ya3Mgd2l0aCBtZXNzYWdlcyB3aXRoIGEgbGVuZ3RoIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiA4CisgKiAgICAgIGJpdHMuCisgKgorICovCisKKworI2luY2x1ZGUgInNoYTEuaCIKKworLyogIAorICogIFNIQTEKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc2hhMSBjbGFzcy4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgTm9uZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgTm90aGluZy4KKyAqCisgKiAgQ29tbWVudHM6CisgKgorICovCitTSEExOjpTSEExKCkKK3sKKyAgICBSZXNldCgpOworfQorCisvKiAgCisgKiAgflNIQTEKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgaXMgdGhlIGRlc3RydWN0b3IgZm9yIHRoZSBzaGExIGNsYXNzCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIE5vbmUuCisgKgorICogIFJldHVybnM6CisgKiAgICAgIE5vdGhpbmcuCisgKgorICogIENvbW1lbnRzOgorICoKKyAqLworU0hBMTo6flNIQTEoKQoreworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZworfQorCisvKiAgCisgKiAgUmVzZXQKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBzaGExIGNsYXNzIG1lbWJlciB2YXJpYWJsZXMKKyAqICAgICAgaW4gcHJlcGFyYXRpb24gZm9yIGNvbXB1dGluZyBhIG5ldyBtZXNzYWdlIGRpZ2VzdC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgTm9uZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgTm90aGluZy4KKyAqCisgKiAgQ29tbWVudHM6CisgKgorICovCit2b2lkIFNIQTE6OlJlc2V0KCkKK3sKKyAgICBMZW5ndGhfTG93ICAgICAgICAgID0gMDsKKyAgICBMZW5ndGhfSGlnaCAgICAgICAgID0gMDsKKyAgICBNZXNzYWdlX0Jsb2NrX0luZGV4ID0gMDsKKworICAgIEhbMF0gICAgICAgID0gMHg2NzQ1MjMwMTsKKyAgICBIWzFdICAgICAgICA9IDB4RUZDREFCODk7CisgICAgSFsyXSAgICAgICAgPSAweDk4QkFEQ0ZFOworICAgIEhbM10gICAgICAgID0gMHgxMDMyNTQ3NjsKKyAgICBIWzRdICAgICAgICA9IDB4QzNEMkUxRjA7CisKKyAgICBDb21wdXRlZCAgICA9IGZhbHNlOworICAgIENvcnJ1cHRlZCAgID0gZmFsc2U7Cit9CisKKy8qICAKKyAqICBSZXN1bHQKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIDE2MC1iaXQgbWVzc2FnZSBkaWdlc3QgaW50byB0aGUKKyAqICAgICAgYXJyYXkgcHJvdmlkZWQuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG1lc3NhZ2VfZGlnZXN0X2FycmF5OiBbb3V0XQorICogICAgICAgICAgVGhpcyBpcyBhbiBhcnJheSBvZiBmaXZlIHVuc2lnbmVkIGludGVnZXJzIHdoaWNoIHdpbGwgYmUgZmlsbGVkCisgKiAgICAgICAgICB3aXRoIHRoZSBtZXNzYWdlIGRpZ2VzdCB0aGF0IGhhcyBiZWVuIGNvbXB1dGVkLgorICoKKyAqICBSZXR1cm5zOgorICogICAgICBUcnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIGl0IGZhaWxlZC4KKyAqCisgKiAgQ29tbWVudHM6CisgKgorICovCitib29sIFNIQTE6OlJlc3VsdCh1bnNpZ25lZCAqbWVzc2FnZV9kaWdlc3RfYXJyYXkpCit7CisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvdW50ZXIKKworICAgIGlmIChDb3JydXB0ZWQpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFDb21wdXRlZCkKKyAgICB7CisgICAgICAgIFBhZE1lc3NhZ2UoKTsKKyAgICAgICAgQ29tcHV0ZWQgPSB0cnVlOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICAgIG1lc3NhZ2VfZGlnZXN0X2FycmF5W2ldID0gSFtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogIAorICogIElucHV0CisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW4gYXJyYXkgb2Ygb2N0ZXRzIGFzIHRoZSBuZXh0IHBvcnRpb24gb2YKKyAqICAgICAgdGhlIG1lc3NhZ2UuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG1lc3NhZ2VfYXJyYXk6IFtpbl0KKyAqICAgICAgICAgIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgcmVwcmVzZW50aW5nIHRoZSBuZXh0IHBvcnRpb24gb2YgdGhlCisgKiAgICAgICAgICBtZXNzYWdlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgICBOb3RoaW5nLgorICoKKyAqICBDb21tZW50czoKKyAqCisgKi8KK3ZvaWQgU0hBMTo6SW5wdXQoICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWVzc2FnZV9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgICAgICAgICBsZW5ndGgpCit7CisgICAgaWYgKCFsZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKENvbXB1dGVkIHx8IENvcnJ1cHRlZCkKKyAgICB7CisgICAgICAgIENvcnJ1cHRlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZShsZW5ndGgtLSAmJiAhQ29ycnVwdGVkKQorICAgIHsKKyAgICAgICAgTWVzc2FnZV9CbG9ja1tNZXNzYWdlX0Jsb2NrX0luZGV4KytdID0gKCptZXNzYWdlX2FycmF5ICYgMHhGRik7CisKKyAgICAgICAgTGVuZ3RoX0xvdyArPSA4OworICAgICAgICBMZW5ndGhfTG93ICY9IDB4RkZGRkZGRkY7ICAgICAgICAgICAgICAgLy8gRm9yY2UgaXQgdG8gMzIgYml0cworICAgICAgICBpZiAoTGVuZ3RoX0xvdyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBMZW5ndGhfSGlnaCsrOworICAgICAgICAgICAgTGVuZ3RoX0hpZ2ggJj0gMHhGRkZGRkZGRjsgICAgICAgICAgLy8gRm9yY2UgaXQgdG8gMzIgYml0cworICAgICAgICAgICAgaWYgKExlbmd0aF9IaWdoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29ycnVwdGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAvLyBNZXNzYWdlIGlzIHRvbyBsb25nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoTWVzc2FnZV9CbG9ja19JbmRleCA9PSA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgUHJvY2Vzc01lc3NhZ2VCbG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgbWVzc2FnZV9hcnJheSsrOworICAgIH0KK30KKworLyogIAorICogIElucHV0CisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW4gYXJyYXkgb2Ygb2N0ZXRzIGFzIHRoZSBuZXh0IHBvcnRpb24gb2YKKyAqICAgICAgdGhlIG1lc3NhZ2UuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG1lc3NhZ2VfYXJyYXk6IFtpbl0KKyAqICAgICAgICAgIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgcmVwcmVzZW50aW5nIHRoZSBuZXh0IHBvcnRpb24gb2YgdGhlCisgKiAgICAgICAgICBtZXNzYWdlLgorICogICAgICBsZW5ndGg6IFtpbl0KKyAqICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2VfYXJyYXkKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgTm90aGluZy4KKyAqCisgKiAgQ29tbWVudHM6CisgKgorICovCit2b2lkIFNIQTE6OklucHV0KCAgIGNvbnN0IGNoYXIgICptZXNzYWdlX2FycmF5LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICBsZW5ndGgpCit7CisgICAgSW5wdXQoKHVuc2lnbmVkIGNoYXIgKikgbWVzc2FnZV9hcnJheSwgbGVuZ3RoKTsKK30KKworLyogIAorICogIElucHV0CisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYSBzaW5nbGUgb2N0ZXRzIGFzIHRoZSBuZXh0IG1lc3NhZ2UgZWxlbWVudC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbWVzc2FnZV9lbGVtZW50OiBbaW5dCisgKiAgICAgICAgICBUaGUgbmV4dCBvY3RldCBpbiB0aGUgbWVzc2FnZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgTm90aGluZy4KKyAqCisgKiAgQ29tbWVudHM6CisgKgorICovCit2b2lkIFNIQTE6OklucHV0KHVuc2lnbmVkIGNoYXIgbWVzc2FnZV9lbGVtZW50KQoreworICAgIElucHV0KCZtZXNzYWdlX2VsZW1lbnQsIDEpOworfQorCisvKiAgCisgKiAgSW5wdXQKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhIHNpbmdsZSBvY3RldCBhcyB0aGUgbmV4dCBtZXNzYWdlIGVsZW1lbnQuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG1lc3NhZ2VfZWxlbWVudDogW2luXQorICogICAgICAgICAgVGhlIG5leHQgb2N0ZXQgaW4gdGhlIG1lc3NhZ2UuCisgKgorICogIFJldHVybnM6CisgKiAgICAgIE5vdGhpbmcuCisgKgorICogIENvbW1lbnRzOgorICoKKyAqLwordm9pZCBTSEExOjpJbnB1dChjaGFyIG1lc3NhZ2VfZWxlbWVudCkKK3sKKyAgICBJbnB1dCgodW5zaWduZWQgY2hhciAqKSAmbWVzc2FnZV9lbGVtZW50LCAxKTsKK30KKworLyogIAorICogIG9wZXJhdG9yPDwKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgb3BlcmF0b3IgbWFrZXMgaXQgY29udmVuaWVudCB0byBwcm92aWRlIGNoYXJhY3RlciBzdHJpbmdzIHRvCisgKiAgICAgIHRoZSBTSEExIG9iamVjdCBmb3IgcHJvY2Vzc2luZy4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbWVzc2FnZV9hcnJheTogW2luXQorICogICAgICAgICAgVGhlIGNoYXJhY3RlciBhcnJheSB0byB0YWtlIGFzIGlucHV0LgorICoKKyAqICBSZXR1cm5zOgorICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgU0hBMSBvYmplY3QuCisgKgorICogIENvbW1lbnRzOgorICogICAgICBFYWNoIGNoYXJhY3RlciBpcyBhc3N1bWVkIHRvIGhvbGQgOCBiaXRzIG9mIGluZm9ybWF0aW9uLgorICoKKyAqLworU0hBMSYgU0hBMTo6b3BlcmF0b3I8PChjb25zdCBjaGFyICptZXNzYWdlX2FycmF5KQoreworICAgIGNvbnN0IGNoYXIgKnAgPSBtZXNzYWdlX2FycmF5OworCisgICAgd2hpbGUoKnApCisgICAgeworICAgICAgICBJbnB1dCgqcCk7CisgICAgICAgIHArKzsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKy8qICAKKyAqICBvcGVyYXRvcjw8CisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIG9wZXJhdG9yIG1ha2VzIGl0IGNvbnZlbmllbnQgdG8gcHJvdmlkZSBjaGFyYWN0ZXIgc3RyaW5ncyB0bworICogICAgICB0aGUgU0hBMSBvYmplY3QgZm9yIHByb2Nlc3NpbmcuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG1lc3NhZ2VfYXJyYXk6IFtpbl0KKyAqICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgYXJyYXkgdG8gdGFrZSBhcyBpbnB1dC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIFNIQTEgb2JqZWN0LgorICoKKyAqICBDb21tZW50czoKKyAqICAgICAgRWFjaCBjaGFyYWN0ZXIgaXMgYXNzdW1lZCB0byBob2xkIDggYml0cyBvZiBpbmZvcm1hdGlvbi4KKyAqCisgKi8KK1NIQTEmIFNIQTE6Om9wZXJhdG9yPDwoY29uc3QgdW5zaWduZWQgY2hhciAqbWVzc2FnZV9hcnJheSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gbWVzc2FnZV9hcnJheTsKKworICAgIHdoaWxlKCpwKQorICAgIHsKKyAgICAgICAgSW5wdXQoKnApOworICAgICAgICBwKys7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCisvKiAgCisgKiAgb3BlcmF0b3I8PAorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgbmV4dCBvY3RldCBpbiB0aGUgbWVzc2FnZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbWVzc2FnZV9lbGVtZW50OiBbaW5dCisgKiAgICAgICAgICBUaGUgbmV4dCBvY3RldCBpbiB0aGUgbWVzc2FnZQorICoKKyAqICBSZXR1cm5zOgorICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgU0hBMSBvYmplY3QuCisgKgorICogIENvbW1lbnRzOgorICogICAgICBUaGUgY2hhcmFjdGVyIGlzIGFzc3VtZWQgdG8gaG9sZCA4IGJpdHMgb2YgaW5mb3JtYXRpb24uCisgKgorICovCitTSEExJiBTSEExOjpvcGVyYXRvcjw8KGNvbnN0IGNoYXIgbWVzc2FnZV9lbGVtZW50KQoreworICAgIElucHV0KCh1bnNpZ25lZCBjaGFyICopICZtZXNzYWdlX2VsZW1lbnQsIDEpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCisvKiAgCisgKiAgb3BlcmF0b3I8PAorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgbmV4dCBvY3RldCBpbiB0aGUgbWVzc2FnZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbWVzc2FnZV9lbGVtZW50OiBbaW5dCisgKiAgICAgICAgICBUaGUgbmV4dCBvY3RldCBpbiB0aGUgbWVzc2FnZQorICoKKyAqICBSZXR1cm5zOgorICogICAgICBBIHJlZmVyZW5jZSB0byB0aGUgU0hBMSBvYmplY3QuCisgKgorICogIENvbW1lbnRzOgorICogICAgICBUaGUgY2hhcmFjdGVyIGlzIGFzc3VtZWQgdG8gaG9sZCA4IGJpdHMgb2YgaW5mb3JtYXRpb24uCisgKgorICovCitTSEExJiBTSEExOjpvcGVyYXRvcjw8KGNvbnN0IHVuc2lnbmVkIGNoYXIgbWVzc2FnZV9lbGVtZW50KQoreworICAgIElucHV0KCZtZXNzYWdlX2VsZW1lbnQsIDEpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCisvKiAgCisgKiAgUHJvY2Vzc01lc3NhZ2VCbG9jaworICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHByb2Nlc3MgdGhlIG5leHQgNTEyIGJpdHMgb2YgdGhlIG1lc3NhZ2UKKyAqICAgICAgc3RvcmVkIGluIHRoZSBNZXNzYWdlX0Jsb2NrIGFycmF5LgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBOb25lLgorICoKKyAqICBSZXR1cm5zOgorICogICAgICBOb3RoaW5nLgorICoKKyAqICBDb21tZW50czoKKyAqICAgICAgTWFueSBvZiB0aGUgdmFyaWFibGUgbmFtZXMgaW4gdGhpcyBmdW5jdGlvbiwgZXNwZWNpYWxseSB0aGUgc2luZ2xlCisgKiAgICAgIGNoYXJhY3RlciBuYW1lcywgd2VyZSB1c2VkIGJlY2F1c2UgdGhvc2Ugd2VyZSB0aGUgbmFtZXMgdXNlZAorICogICAgICBpbiB0aGUgcHVibGljYXRpb24uCisgKgorICovCit2b2lkIFNIQTE6OlByb2Nlc3NNZXNzYWdlQmxvY2soKQoreworICAgIGNvbnN0IHVuc2lnbmVkIEtbXSA9ICAgIHsgICAgICAgICAgICAgICAvLyBDb25zdGFudHMgZGVmaW5lZCBmb3IgU0hBLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1QTgyNzk5OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2RUQ5RUJBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RjFCQkNEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDQTYyQzFENgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgaW50ICAgICAgICAgdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvb3AgY291bnRlcgorICAgIHVuc2lnbmVkICAgIHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAvLyBUZW1wb3Jhcnkgd29yZCB2YWx1ZQorICAgIHVuc2lnbmVkICAgIFdbODBdOyAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JkIHNlcXVlbmNlCisgICAgdW5zaWduZWQgICAgQSwgQiwgQywgRCwgRTsgICAgICAgICAgICAgIC8vIFdvcmQgYnVmZmVycworCisgICAgLyoKKyAgICAgKiAgSW5pdGlhbGl6ZSB0aGUgZmlyc3QgMTYgd29yZHMgaW4gdGhlIGFycmF5IFcKKyAgICAgKi8KKyAgICBmb3IodCA9IDA7IHQgPCAxNjsgdCsrKQorICAgIHsKKyAgICAgICAgV1t0XSA9ICgodW5zaWduZWQpIE1lc3NhZ2VfQmxvY2tbdCAqIDRdKSA8PCAyNDsKKyAgICAgICAgV1t0XSB8PSAoKHVuc2lnbmVkKSBNZXNzYWdlX0Jsb2NrW3QgKiA0ICsgMV0pIDw8IDE2OworICAgICAgICBXW3RdIHw9ICgodW5zaWduZWQpIE1lc3NhZ2VfQmxvY2tbdCAqIDQgKyAyXSkgPDwgODsKKyAgICAgICAgV1t0XSB8PSAoKHVuc2lnbmVkKSBNZXNzYWdlX0Jsb2NrW3QgKiA0ICsgM10pOworICAgIH0KKworICAgIGZvcih0ID0gMTY7IHQgPCA4MDsgdCsrKQorICAgIHsKKyAgICAgICBXW3RdID0gQ2lyY3VsYXJTaGlmdCgxLFdbdC0zXSBeIFdbdC04XSBeIFdbdC0xNF0gXiBXW3QtMTZdKTsKKyAgICB9CisKKyAgICBBID0gSFswXTsKKyAgICBCID0gSFsxXTsKKyAgICBDID0gSFsyXTsKKyAgICBEID0gSFszXTsKKyAgICBFID0gSFs0XTsKKworICAgIGZvcih0ID0gMDsgdCA8IDIwOyB0KyspCisgICAgeworICAgICAgICB0ZW1wID0gQ2lyY3VsYXJTaGlmdCg1LEEpICsgKChCICYgQykgfCAoKH5CKSAmIEQpKSArIEUgKyBXW3RdICsgS1swXTsKKyAgICAgICAgdGVtcCAmPSAweEZGRkZGRkZGOworICAgICAgICBFID0gRDsKKyAgICAgICAgRCA9IEM7CisgICAgICAgIEMgPSBDaXJjdWxhclNoaWZ0KDMwLEIpOworICAgICAgICBCID0gQTsKKyAgICAgICAgQSA9IHRlbXA7CisgICAgfQorCisgICAgZm9yKHQgPSAyMDsgdCA8IDQwOyB0KyspCisgICAgeworICAgICAgICB0ZW1wID0gQ2lyY3VsYXJTaGlmdCg1LEEpICsgKEIgXiBDIF4gRCkgKyBFICsgV1t0XSArIEtbMV07CisgICAgICAgIHRlbXAgJj0gMHhGRkZGRkZGRjsKKyAgICAgICAgRSA9IEQ7CisgICAgICAgIEQgPSBDOworICAgICAgICBDID0gQ2lyY3VsYXJTaGlmdCgzMCxCKTsKKyAgICAgICAgQiA9IEE7CisgICAgICAgIEEgPSB0ZW1wOworICAgIH0KKworICAgIGZvcih0ID0gNDA7IHQgPCA2MDsgdCsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9IENpcmN1bGFyU2hpZnQoNSxBKSArCisgICAgICAgICAgICAgICAoKEIgJiBDKSB8IChCICYgRCkgfCAoQyAmIEQpKSArIEUgKyBXW3RdICsgS1syXTsKKyAgICAgICAgdGVtcCAmPSAweEZGRkZGRkZGOworICAgICAgICBFID0gRDsKKyAgICAgICAgRCA9IEM7CisgICAgICAgIEMgPSBDaXJjdWxhclNoaWZ0KDMwLEIpOworICAgICAgICBCID0gQTsKKyAgICAgICAgQSA9IHRlbXA7CisgICAgfQorCisgICAgZm9yKHQgPSA2MDsgdCA8IDgwOyB0KyspCisgICAgeworICAgICAgICB0ZW1wID0gQ2lyY3VsYXJTaGlmdCg1LEEpICsgKEIgXiBDIF4gRCkgKyBFICsgV1t0XSArIEtbM107CisgICAgICAgIHRlbXAgJj0gMHhGRkZGRkZGRjsKKyAgICAgICAgRSA9IEQ7CisgICAgICAgIEQgPSBDOworICAgICAgICBDID0gQ2lyY3VsYXJTaGlmdCgzMCxCKTsKKyAgICAgICAgQiA9IEE7CisgICAgICAgIEEgPSB0ZW1wOworICAgIH0KKworICAgIEhbMF0gPSAoSFswXSArIEEpICYgMHhGRkZGRkZGRjsKKyAgICBIWzFdID0gKEhbMV0gKyBCKSAmIDB4RkZGRkZGRkY7CisgICAgSFsyXSA9IChIWzJdICsgQykgJiAweEZGRkZGRkZGOworICAgIEhbM10gPSAoSFszXSArIEQpICYgMHhGRkZGRkZGRjsKKyAgICBIWzRdID0gKEhbNF0gKyBFKSAmIDB4RkZGRkZGRkY7CisKKyAgICBNZXNzYWdlX0Jsb2NrX0luZGV4ID0gMDsKK30KKworLyogIAorICogIFBhZE1lc3NhZ2UKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIEFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQsIHRoZSBtZXNzYWdlIG11c3QgYmUgcGFkZGVkIHRvIGFuIGV2ZW4KKyAqICAgICAgNTEyIGJpdHMuICBUaGUgZmlyc3QgcGFkZGluZyBiaXQgbXVzdCBiZSBhICcxJy4gIFRoZSBsYXN0IDY0IGJpdHMKKyAqICAgICAgcmVwcmVzZW50IHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsIG1lc3NhZ2UuICBBbGwgYml0cyBpbiBiZXR3ZWVuCisgKiAgICAgIHNob3VsZCBiZSAwLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhvc2UKKyAqICAgICAgcnVsZXMgYnkgZmlsbGluZyB0aGUgbWVzc2FnZV9ibG9jayBhcnJheSBhY2NvcmRpbmdseS4gIEl0IHdpbGwgYWxzbworICogICAgICBjYWxsIFByb2Nlc3NNZXNzYWdlQmxvY2soKSBhcHByb3ByaWF0ZWx5LiAgV2hlbiBpdCByZXR1cm5zLCBpdAorICogICAgICBjYW4gYmUgYXNzdW1lZCB0aGF0IHRoZSBtZXNzYWdlIGRpZ2VzdCBoYXMgYmVlbiBjb21wdXRlZC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgTm9uZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgTm90aGluZy4KKyAqCisgKiAgQ29tbWVudHM6CisgKgorICovCit2b2lkIFNIQTE6OlBhZE1lc3NhZ2UoKQoreworICAgIC8qCisgICAgICogIENoZWNrIHRvIHNlZSBpZiB0aGUgY3VycmVudCBtZXNzYWdlIGJsb2NrIGlzIHRvbyBzbWFsbCB0byBob2xkCisgICAgICogIHRoZSBpbml0aWFsIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoLiAgSWYgc28sIHdlIHdpbGwgcGFkIHRoZQorICAgICAqICBibG9jaywgcHJvY2VzcyBpdCwgYW5kIHRoZW4gY29udGludWUgcGFkZGluZyBpbnRvIGEgc2Vjb25kIGJsb2NrLgorICAgICAqLworICAgIGlmIChNZXNzYWdlX0Jsb2NrX0luZGV4ID4gNTUpCisgICAgeworICAgICAgICBNZXNzYWdlX0Jsb2NrW01lc3NhZ2VfQmxvY2tfSW5kZXgrK10gPSAweDgwOworICAgICAgICB3aGlsZShNZXNzYWdlX0Jsb2NrX0luZGV4IDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lc3NhZ2VfQmxvY2tbTWVzc2FnZV9CbG9ja19JbmRleCsrXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBQcm9jZXNzTWVzc2FnZUJsb2NrKCk7CisKKyAgICAgICAgd2hpbGUoTWVzc2FnZV9CbG9ja19JbmRleCA8IDU2KQorICAgICAgICB7CisgICAgICAgICAgICBNZXNzYWdlX0Jsb2NrW01lc3NhZ2VfQmxvY2tfSW5kZXgrK10gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE1lc3NhZ2VfQmxvY2tbTWVzc2FnZV9CbG9ja19JbmRleCsrXSA9IDB4ODA7CisgICAgICAgIHdoaWxlKE1lc3NhZ2VfQmxvY2tfSW5kZXggPCA1NikKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZV9CbG9ja1tNZXNzYWdlX0Jsb2NrX0luZGV4KytdID0gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoKKyAgICAgKiAgU3RvcmUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGFzIHRoZSBsYXN0IDggb2N0ZXRzCisgICAgICovCisgICAgTWVzc2FnZV9CbG9ja1s1Nl0gPSAoTGVuZ3RoX0hpZ2ggPj4gMjQpICYgMHhGRjsKKyAgICBNZXNzYWdlX0Jsb2NrWzU3XSA9IChMZW5ndGhfSGlnaCA+PiAxNikgJiAweEZGOworICAgIE1lc3NhZ2VfQmxvY2tbNThdID0gKExlbmd0aF9IaWdoID4+IDgpICYgMHhGRjsKKyAgICBNZXNzYWdlX0Jsb2NrWzU5XSA9IChMZW5ndGhfSGlnaCkgJiAweEZGOworICAgIE1lc3NhZ2VfQmxvY2tbNjBdID0gKExlbmd0aF9Mb3cgPj4gMjQpICYgMHhGRjsKKyAgICBNZXNzYWdlX0Jsb2NrWzYxXSA9IChMZW5ndGhfTG93ID4+IDE2KSAmIDB4RkY7CisgICAgTWVzc2FnZV9CbG9ja1s2Ml0gPSAoTGVuZ3RoX0xvdyA+PiA4KSAmIDB4RkY7CisgICAgTWVzc2FnZV9CbG9ja1s2M10gPSAoTGVuZ3RoX0xvdykgJiAweEZGOworCisgICAgUHJvY2Vzc01lc3NhZ2VCbG9jaygpOworfQorCisKKy8qICAKKyAqICBDaXJjdWxhclNoaWZ0CisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIG1lbWJlciBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gYSBjaXJjdWxhciBzaGlmdGluZyBvcGVyYXRpb24uCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGJpdHM6IFtpbl0KKyAqICAgICAgICAgIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCAoMS0zMSkKKyAqICAgICAgd29yZDogW2luXQorICogICAgICAgICAgVGhlIHZhbHVlIHRvIHNoaWZ0IChhc3N1bWVzIGEgMzItYml0IGludGVnZXIpCisgKgorICogIFJldHVybnM6CisgKiAgICAgIFRoZSBzaGlmdGVkIHZhbHVlLgorICoKKyAqICBDb21tZW50czoKKyAqCisgKi8KK3Vuc2lnbmVkIFNIQTE6OkNpcmN1bGFyU2hpZnQoaW50IGJpdHMsIHVuc2lnbmVkIHdvcmQpCit7CisgICAgcmV0dXJuICgod29yZCA8PCBiaXRzKSAmIDB4RkZGRkZGRkYpIHwgKCh3b3JkICYgMHhGRkZGRkZGRikgPj4gKDMyLWJpdHMpKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2Mvc2hhMS9zaGExLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NoYTEvc2hhMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2Q4OTYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3NoYTEvc2hhMS5oCkBAIC0wLDAgKzEsMTE0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIERPIE5PVCBSRUZPUk1BVCA8LSBmb3IgdGlkeQorLyoKKyAqICBzaGExLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDA5CisgKiAgUGF1bCBFLiBKb25lcyA8cGF1bGVqQHBhY2tldGl6ZXIuY29tPgorICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgJElkOiBzaGExLmggMTIgMjAwOS0wNi0yMiAxOTozNDoyNVogcGF1bGVqICQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBTZWN1cmUgSGFzaGluZyBTdGFuZGFyZCBhcyBkZWZpbmVkCisgKiAgICAgIGluIEZJUFMgUFVCIDE4MC0xIHB1Ymxpc2hlZCBBcHJpbCAxNywgMTk5NS4KKyAqCisgKiAgICAgIE1hbnkgb2YgdGhlIHZhcmlhYmxlIG5hbWVzIGluIHRoaXMgY2xhc3MsIGVzcGVjaWFsbHkgdGhlIHNpbmdsZQorICogICAgICBjaGFyYWN0ZXIgbmFtZXMsIHdlcmUgdXNlZCBiZWNhdXNlIHRob3NlIHdlcmUgdGhlIG5hbWVzIHVzZWQKKyAqICAgICAgaW4gdGhlIHB1YmxpY2F0aW9uLgorICoKKyAqICAgICAgUGxlYXNlIHJlYWQgdGhlIGZpbGUgc2hhMS5jcHAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICovCisKKyNpZm5kZWYgX1NIQTFfSF8KKyNkZWZpbmUgX1NIQTFfSF8KKworY2xhc3MgU0hBMQoreworCisgICAgcHVibGljOgorCisgICAgICAgIFNIQTEoKTsKKyAgICAgICAgdmlydHVhbCB+U0hBMSgpOworCisgICAgICAgIC8qCisgICAgICAgICAqICBSZS1pbml0aWFsaXplIHRoZSBjbGFzcworICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBSZXNldCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqICBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpZ2VzdAorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBSZXN1bHQodW5zaWduZWQgKm1lc3NhZ2VfZGlnZXN0X2FycmF5KTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgUHJvdmlkZSBpbnB1dCB0byBTSEExCisgICAgICAgICAqLworICAgICAgICB2b2lkIElucHV0KCBjb25zdCB1bnNpZ25lZCBjaGFyICptZXNzYWdlX2FycmF5LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgICAgICAgIGxlbmd0aCk7CisgICAgICAgIHZvaWQgSW5wdXQoIGNvbnN0IGNoYXIgICptZXNzYWdlX2FycmF5LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICBsZW5ndGgpOworICAgICAgICB2b2lkIElucHV0KHVuc2lnbmVkIGNoYXIgbWVzc2FnZV9lbGVtZW50KTsKKyAgICAgICAgdm9pZCBJbnB1dChjaGFyIG1lc3NhZ2VfZWxlbWVudCk7CisgICAgICAgIFNIQTEmIG9wZXJhdG9yPDwoY29uc3QgY2hhciAqbWVzc2FnZV9hcnJheSk7CisgICAgICAgIFNIQTEmIG9wZXJhdG9yPDwoY29uc3QgdW5zaWduZWQgY2hhciAqbWVzc2FnZV9hcnJheSk7CisgICAgICAgIFNIQTEmIG9wZXJhdG9yPDwoY29uc3QgY2hhciBtZXNzYWdlX2VsZW1lbnQpOworICAgICAgICBTSEExJiBvcGVyYXRvcjw8KGNvbnN0IHVuc2lnbmVkIGNoYXIgbWVzc2FnZV9lbGVtZW50KTsKKworICAgIHByaXZhdGU6CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIFByb2Nlc3MgdGhlIG5leHQgNTEyIGJpdHMgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgUHJvY2Vzc01lc3NhZ2VCbG9jaygpOworCisgICAgICAgIC8qCisgICAgICAgICAqICBQYWRzIHRoZSBjdXJyZW50IG1lc3NhZ2UgYmxvY2sgdG8gNTEyIGJpdHMKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgUGFkTWVzc2FnZSgpOworCisgICAgICAgIC8qCisgICAgICAgICAqICBQZXJmb3JtcyBhIGNpcmN1bGFyIGxlZnQgc2hpZnQgb3BlcmF0aW9uCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgdW5zaWduZWQgQ2lyY3VsYXJTaGlmdChpbnQgYml0cywgdW5zaWduZWQgd29yZCk7CisKKyAgICAgICAgdW5zaWduZWQgSFs1XTsgICAgICAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBkaWdlc3QgYnVmZmVycworCisgICAgICAgIHVuc2lnbmVkIExlbmd0aF9Mb3c7ICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgbGVuZ3RoIGluIGJpdHMKKyAgICAgICAgdW5zaWduZWQgTGVuZ3RoX0hpZ2g7ICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBsZW5ndGggaW4gYml0cworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgTWVzc2FnZV9CbG9ja1s2NF07ICAgIC8vIDUxMi1iaXQgbWVzc2FnZSBibG9ja3MKKyAgICAgICAgaW50IE1lc3NhZ2VfQmxvY2tfSW5kZXg7ICAgICAgICAgICAgLy8gSW5kZXggaW50byBtZXNzYWdlIGJsb2NrIGFycmF5CisKKyAgICAgICAgYm9vbCBDb21wdXRlZDsgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhlIGRpZ2VzdCBjb21wdXRlZD8KKyAgICAgICAgYm9vbCBDb3JydXB0ZWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhlIG1lc3NhZ2UgZGlnZXN0IGNvcnJ1cGVkPworCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3V0aWwvQ3JhY2tlZFVyaS5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3V0aWwvQ3JhY2tlZFVyaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhNzU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvdXRpbC9DcmFja2VkVXJpLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAic2Vhc29ja3MvU3RyaW5nVXRpbC5oIgorI2luY2x1ZGUgInNlYXNvY2tzL3V0aWwvQ3JhY2tlZFVyaS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjZGVmaW5lIFRIUk9XKHN0dWZmKSBcCisgICAgZG8ge1wKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGVycjsgXAorICAgICAgICBlcnIgPDwgc3R1ZmY7IFwKKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKGVyci5zdHIoKSk7IFwKKyAgICB9IHdoaWxlICgwKTsKKworbmFtZXNwYWNlIHsKKworY2hhciBmcm9tSGV4KGNoYXIgYykgeworICAgIGMgPSB0b2xvd2VyKGMpOworICAgIHJldHVybiBjID49ICcwJyAmJiBjIDw9ICc5JyA/IGMgLSAnMCcgOiBjIC0gJ2EnICsgMTA7Cit9CisKK3N0ZDo6c3RyaW5nIHVuZXNjYXBlKHN0ZDo6c3RyaW5nIHVyaSkgeworICAgIHNlYXNvY2tzOjpyZXBsYWNlKHVyaSwgIisiLCAiICIpOworICAgIHNpemVfdCBwb3MgPSAwOworICAgIHdoaWxlIChwb3MgPCB1cmkuc2l6ZSgpKSB7CisgICAgICAgIHBvcyA9IHVyaS5maW5kKCclJywgcG9zKTsKKyAgICAgICAgaWYgKHBvcyA9PSB1cmkubnBvcykgYnJlYWs7CisgICAgICAgIGlmIChwb3MgKyAyID4gdXJpLnNpemUoKSkgeworICAgICAgICAgICAgVEhST1coIlRydW5jYXRlZCB1cmk6ICciIDw8IHVyaSA8PCAiJyIpOworICAgICAgICB9CisgICAgICAgIGlmICghaXN4ZGlnaXQodXJpW3BvcyArIDFdKSB8fCAhaXN4ZGlnaXQodXJpW3BvcyArIDJdKSkgeworICAgICAgICAgICAgVEhST1coIkJhZCBkaWdpdCBpbiB1cmk6ICciIDw8IHVyaSA8PCAiJyIpOworICAgICAgICB9CisgICAgICAgIGF1dG8gaGV4ID0gKGZyb21IZXgodXJpW3BvcyArIDFdKSA8PCA0KSB8IGZyb21IZXgodXJpW3BvcyArIDJdKTsKKyAgICAgICAgdXJpID0gdXJpLnN1YnN0cigwLCBwb3MpICsgc3RkOjpzdHJpbmcoMSwgaGV4KSArIHVyaS5zdWJzdHIocG9zICsgMyk7CisgICAgICAgICsrcG9zOworICAgIH0KKyAgICByZXR1cm4gdXJpOworfQorCit9CisKK25hbWVzcGFjZSBzZWFzb2NrcyB7CisKK0NyYWNrZWRVcmk6OkNyYWNrZWRVcmkoY29uc3Qgc3RkOjpzdHJpbmcmIHVyaSkgeworICAgIGlmICh1cmkuZW1wdHkoKSB8fCB1cmlbMF0gIT0gJy8nKSB7CisgICAgICAgIFRIUk9XKCJNYWxmb3JtZWQgVVJJOiAnIiA8PCB1cmkgPDwgIiciKTsKKyAgICB9CisgICAgYXV0byBlbmRPZlBhdGggPSB1cmkuZmluZCgnPycpOworICAgIHN0ZDo6c3RyaW5nIHBhdGg7CisgICAgc3RkOjpzdHJpbmcgcmVtYWluZGVyOworICAgIGlmIChlbmRPZlBhdGggPT0gdXJpLm5wb3MpIHsKKyAgICAgICAgcGF0aCA9IHVyaS5zdWJzdHIoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGF0aCA9IHVyaS5zdWJzdHIoMSwgZW5kT2ZQYXRoIC0gMSk7CisgICAgICAgIHJlbWFpbmRlciA9IHVyaS5zdWJzdHIoZW5kT2ZQYXRoICsgMSk7CisgICAgfQorCisgICAgX3BhdGggPSBzcGxpdChwYXRoLCAnLycpOworICAgIHN0ZDo6dHJhbnNmb3JtKF9wYXRoLmJlZ2luKCksIF9wYXRoLmVuZCgpLCBfcGF0aC5iZWdpbigpLCB1bmVzY2FwZSk7CisKKyAgICBhdXRvIHNwbGl0UmVtYWluZGVyID0gc3BsaXQocmVtYWluZGVyLCAnJicpOworICAgIGZvciAoYXV0byBpdGVyID0gc3BsaXRSZW1haW5kZXIuY2JlZ2luKCk7IGl0ZXIgIT0gc3BsaXRSZW1haW5kZXIuY2VuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgaWYgKGl0ZXItPmVtcHR5KCkpIGNvbnRpbnVlOworICAgICAgICBhdXRvIHNwbGl0ID0gc2Vhc29ja3M6OnNwbGl0KCppdGVyLCAnPScpOworICAgICAgICBzdGQ6OnRyYW5zZm9ybShzcGxpdC5iZWdpbigpLCBzcGxpdC5lbmQoKSwgc3BsaXQuYmVnaW4oKSwgdW5lc2NhcGUpOworICAgICAgICBpZiAoc3BsaXQuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIF9xdWVyeVBhcmFtcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3BsaXRbMF0sIHN0ZDo6c3RyaW5nKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcGxpdC5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgX3F1ZXJ5UGFyYW1zLmluc2VydChzdGQ6Om1ha2VfcGFpcihzcGxpdFswXSwgc3BsaXRbMV0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRIUk9XKCJNYWxmb3JtZWQgVVJJLCB0d28gbWFueSA9IGluIHF1ZXJ5OiAnIiA8PCB1cmkgPDwgIiciKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDcmFja2VkVXJpOjpoYXNQYXJhbShjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW0pIGNvbnN0IHsKKyAgICByZXR1cm4gX3F1ZXJ5UGFyYW1zLmZpbmQocGFyYW0pICE9IF9xdWVyeVBhcmFtcy5lbmQoKTsKK30KKworc3RkOjpzdHJpbmcgQ3JhY2tlZFVyaTo6cXVlcnlQYXJhbShjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWYpIGNvbnN0IHsKKyAgICBhdXRvIGZvdW5kID0gX3F1ZXJ5UGFyYW1zLmZpbmQocGFyYW0pOworICAgIHJldHVybiBmb3VuZCA9PSBfcXVlcnlQYXJhbXMuZW5kKCkgPyBkZWYgOiBmb3VuZC0+c2Vjb25kOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ3JhY2tlZFVyaTo6YWxsUXVlcnlQYXJhbXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcmFtczsKKyAgICBmb3IgKGF1dG8gaXRlciA9IF9xdWVyeVBhcmFtcy5maW5kKHBhcmFtKTsgaXRlciAhPSBfcXVlcnlQYXJhbXMuZW5kKCkgJiYgaXRlci0+Zmlyc3QgPT0gcGFyYW07ICsraXRlcikKKyAgICAgICAgcGFyYW1zLnB1c2hfYmFjayhpdGVyLT5zZWNvbmQpOworICAgIHJldHVybiBwYXJhbXM7Cit9CisKK0NyYWNrZWRVcmkgQ3JhY2tlZFVyaTo6c2hpZnQoKSBjb25zdCB7CisgICAgQ3JhY2tlZFVyaSBzaGlmdGVkKCp0aGlzKTsKKyAgICBpZiAoX3BhdGguc2l6ZSgpID4gMSkgeworICAgICAgICBzaGlmdGVkLl9wYXRoID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KF9wYXRoLmJlZ2luKCkgKyAxLCBfcGF0aC5lbmQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2hpZnRlZC5fcGF0aCA9IHsiIn07CisgICAgfQorCisgICAgcmV0dXJuIHNoaWZ0ZWQ7Cit9CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvdXRpbC9Kc29uLmNwcCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvdXRpbC9Kc29uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGM3NGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy91dGlsL0pzb24uY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgInNlYXNvY2tzL3V0aWwvSnNvbi5oIgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKwordm9pZCBqc29uVG9TdHJlYW0oc3RkOjpvc3RyZWFtJiBzdHIsIGNvbnN0IGNoYXIqIHQpIHsKKyAgICBzdHIgPDwgJyInOworICAgIGZvciAoOyAqdDsgKyt0KSB7CisgICAgICAgIHN3aXRjaCAoKnQpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICgqdCA+PSAzMikgeworICAgICAgICAgICAgICAgIHN0ciA8PCAqdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyIDw8ICJcXHUiIDw8IHN0ZDo6c2V0dyg0KQorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleCA8PCAoaW50KSp0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODogc3RyIDw8ICJcXGIiOyBicmVhazsKKyAgICAgICAgY2FzZSA5OiBzdHIgPDwgIlxcdCI7IGJyZWFrOworICAgICAgICBjYXNlIDEwOiBzdHIgPDwgIlxcbiI7IGJyZWFrOworICAgICAgICBjYXNlIDEyOiBzdHIgPDwgIlxcZiI7IGJyZWFrOworICAgICAgICBjYXNlIDEzOiBzdHIgPDwgIlxcciI7IGJyZWFrOworICAgICAgICBjYXNlICciJzogY2FzZSAnXFwnOgorICAgICAgICAgICAgc3RyIDw8ICdcXCc7CisgICAgICAgICAgICBzdHIgPDwgKnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdHIgPDwgJyInOworfQorCit2b2lkIGpzb25Ub1N0cmVhbShzdGQ6Om9zdHJlYW0mIHN0ciwgYm9vbCBiKSB7CisgICAgc3RyIDw8IChiID8gInRydWUiIDogImZhbHNlIik7Cit9CisKK3ZvaWQgRXBvY2hUaW1lQXNMb2NhbDo6anNvblRvU3RyZWFtKHN0ZDo6b3N0cmVhbSAmbykgY29uc3QgeworICAgIG8gPDwgIm5ldyBEYXRlKCIgPDwgdCAqIDEwMDAgPDwgIikudG9Mb2NhbGVTdHJpbmcoKSI7Cit9CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL2MvdXRpbC9QYXRoSGFuZGxlci5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3V0aWwvUGF0aEhhbmRsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWI2MGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3V0aWwvUGF0aEhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgInNlYXNvY2tzL3V0aWwvUGF0aEhhbmRsZXIuaCIKKworI2luY2x1ZGUgInNlYXNvY2tzL1JlcXVlc3QuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9SZXNwb25zZS5oIgorI2luY2x1ZGUgInNlYXNvY2tzL3V0aWwvQ3JhY2tlZFVyaS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc2Vhc29ja3M7CisKK0NyYWNrZWRVcmlQYWdlSGFuZGxlcjo6UHRyIFBhdGhIYW5kbGVyOjphZGQoY29uc3QgQ3JhY2tlZFVyaVBhZ2VIYW5kbGVyOjpQdHImIGhhbmRsZXIpIHsKKyAgICBfaGFuZGxlcnMuZW1wbGFjZV9iYWNrKGhhbmRsZXIpOworICAgIHJldHVybiBfaGFuZGxlcnMuYmFjaygpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8UmVzcG9uc2U+IFBhdGhIYW5kbGVyOjpoYW5kbGUoCisgICAgICAgIGNvbnN0IENyYWNrZWRVcmkmIHVyaSwgY29uc3QgUmVxdWVzdCYgcmVxdWVzdCkgeworICAgIGNvbnN0IGF1dG8gJnBhdGggPSB1cmkucGF0aCgpOworICAgIGlmIChwYXRoLmVtcHR5KCkgfHwgcGF0aFswXSAhPSBfcGF0aCkgcmV0dXJuIFJlc3BvbnNlOjp1bmhhbmRsZWQoKTsKKworICAgIGF1dG8gc2hpZnRlZFVyaSA9IHVyaS5zaGlmdCgpOworCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IF9oYW5kbGVycykgeworICAgICAgICBhdXRvIHJlc3BvbnNlID0gaXQtPmhhbmRsZShzaGlmdGVkVXJpLCByZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJlc3BvbnNlICE9IFJlc3BvbnNlOjp1bmhhbmRsZWQoKSkgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKyAgICByZXR1cm4gUmVzcG9uc2U6OnVuaGFuZGxlZCgpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy91dGlsL1Jvb3RQYWdlSGFuZGxlci5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi9jL3V0aWwvUm9vdFBhZ2VIYW5kbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI0ZjUyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vYy91dGlsL1Jvb3RQYWdlSGFuZGxlci5jcHAKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAic2Vhc29ja3MvdXRpbC9Sb290UGFnZUhhbmRsZXIuaCIKKworI2luY2x1ZGUgInNlYXNvY2tzL1JlcXVlc3QuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9SZXNwb25zZS5oIgorI2luY2x1ZGUgInNlYXNvY2tzL3V0aWwvQ3JhY2tlZFVyaS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc2Vhc29ja3M7CisKK1Jvb3RQYWdlSGFuZGxlcjo6Um9vdFBhZ2VIYW5kbGVyKCkgeworfQorCitSb290UGFnZUhhbmRsZXI6On5Sb290UGFnZUhhbmRsZXIoKSB7Cit9CisKK0NyYWNrZWRVcmlQYWdlSGFuZGxlcjo6UHRyIFJvb3RQYWdlSGFuZGxlcjo6YWRkKGNvbnN0IENyYWNrZWRVcmlQYWdlSGFuZGxlcjo6UHRyJiBoYW5kbGVyKSB7CisgICAgX2hhbmRsZXJzLmVtcGxhY2VfYmFjayhoYW5kbGVyKTsKKyAgICByZXR1cm4gX2hhbmRsZXJzLmJhY2soKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFJlc3BvbnNlPiBSb290UGFnZUhhbmRsZXI6OmhhbmRsZShjb25zdCBSZXF1ZXN0JiByZXF1ZXN0KSB7CisgICAgQ3JhY2tlZFVyaSB1cmkocmVxdWVzdC5nZXRSZXF1ZXN0VXJpKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBfaGFuZGxlcnMpIHsKKyAgICAgICAgYXV0byByZXNwb25zZSA9IGl0LT5oYW5kbGUodXJpLCByZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJlc3BvbnNlICE9IFJlc3BvbnNlOjp1bmhhbmRsZWQoKSkgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKyAgICByZXR1cm4gUmVzcG9uc2U6OnVuaGFuZGxlZCgpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vd2ViL180MDQucG5nIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vd2ViL180MDQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDNjYjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi93ZWIvXzQwNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vd2ViL19lcnJvci5jc3MgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi93ZWIvX2Vycm9yLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjM4ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vd2ViL19lcnJvci5jc3MKQEAgLTAsMCArMSwzMyBAQAorYm9keSB7CisgICAgZm9udC1mYW1pbHk6IHNlZ29lIHVpLCB0YWhvbWEsIGFyaWFsLCBzYW5zLXNlcmlmOworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGJhY2tncm91bmQtY29sb3I6ICNjMjFlMjk7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCithIHsKKyAgICBjb2xvcjogI2ZmZmYwMDsKK30KKworLmZvb3RlciB7CisgICAgZm9udC1zdHlsZTogaXRhbGljOworfQorCisubWVzc2FnZSB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIGJvcmRlcjogMXB4IHNvbGlkIHdoaXRlOworICAgIHBhZGRpbmc6IDUwcHg7CisgICAgZm9udC1zaXplOiAyMHB4OworfQorCisuaGVhZGxpbmUgeworICAgIHBhZGRpbmc6IDUwcHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgZm9udC1zaXplOiAzMnB4OworfQorCisuZm9vdGVyIHsKKyAgICBwYWRkaW5nLXRvcDogNTBweDsKKyAgICBmb250LXNpemU6IDEycHg7Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL3dlYi9fZXJyb3IuaHRtbCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL3dlYi9fZXJyb3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y1ZTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vd2ViL19lcnJvci5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxodG1sIERPQ1RZUEU9aHRtbD4KKzxoZWFkPgorICA8dGl0bGU+JSVFUlJPUkNPREUlJSAtICUlTUVTU0FHRSUlIC0gS2VlcCBDYWxtIEFuZCBDYXJyeSBPbiE8L3RpdGxlPgorICA8bGluayBocmVmPSIvX2Vycm9yLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKzwvaGVhZD4KKzxib2R5PgorICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KKyAgICA8aW1nIHNyYz0iL180MDQucG5nIiBoZWlnaHQ9IjIwMCIgd2lkdGg9IjEwNyI+CisgICAgPGRpdiBjbGFzcz0iaGVhZGxpbmUiPiUlRVJST1JDT0RFJSUgJiM4MjEyOyAlJU1FU1NBR0UlJTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImluZm8iPiUlQk9EWSUlPC9kaXY+CisgIDwvZGl2PgorCisgIDxkaXYgY2xhc3M9ImZvb3RlciI+UG93ZXJlZCBieSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWF0dGdvZGJvbHQvc2Vhc29ja3MiPlNlYVNvY2tzPC9hPjwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vd2ViL19qcXVlcnkubWluLmpzIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vd2ViL19qcXVlcnkubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OGY5NmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi93ZWIvX2pxdWVyeS5taW4uanMKQEAgLTAsMCArMSwxNiBAQAorLyohCisgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjUuMgorICogaHR0cDovL2pxdWVyeS5jb20vCisgKgorICogQ29weXJpZ2h0IDIwMTEsIEpvaG4gUmVzaWcKKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgorICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIEluY2x1ZGVzIFNpenpsZS5qcworICogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqIENvcHlyaWdodCAyMDExLCBUaGUgRG9qbyBGb3VuZGF0aW9uCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCisgKgorICogRGF0ZTogVGh1IE1hciAzMSAxNToyODoyMyAyMDExIC0wNDAwCisgKi8KKyhmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGNpKGEpe3JldHVybiBkLmlzV2luZG93KGEpP2E6YS5ub2RlVHlwZT09PTk/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9ZnVuY3Rpb24gY2YoYSl7aWYoIWJfW2FdKXt2YXIgYj1kKCI8IithKyI+IikuYXBwZW5kVG8oImJvZHkiKSxjPWIuY3NzKCJkaXNwbGF5Iik7Yi5yZW1vdmUoKTtpZihjPT09Im5vbmUifHxjPT09IiIpYz0iYmxvY2siO2JfW2FdPWN9cmV0dXJuIGJfW2FdfWZ1bmN0aW9uIGNlKGEsYil7dmFyIGM9e307ZC5lYWNoKGNkLmNvbmNhdC5hcHBseShbXSxjZC5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGIkKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319ZnVuY3Rpb24gYlooKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gYlkoKXtkKGEpLnVubG9hZChmdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBiVyliV1thXSgwLDEpfSl9ZnVuY3Rpb24gYlMoYSxjKXthLmRhdGFGaWx0ZXImJihjPWEuZGF0YUZpbHRlcihjLGEuZGF0YVR5cGUpKTt2YXIgZT1hLmRhdGFUeXBlcyxmPXt9LGcsaCxpPWUubGVuZ3RoLGosaz1lWzBdLGwsbSxuLG8scDtmb3IoZz0xO2c8aTtnKyspe2lmKGc9PT0xKWZvcihoIGluIGEuY29udmVydGVycyl0eXBlb2YgaD09PSJzdHJpbmciJiYoZltoLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1toXSk7bD1rLGs9ZVtnXTtpZihrPT09IioiKWs9bDtlbHNlIGlmKGwhPT0iKiImJmwhPT1rKXttPWwrIiAiK2ssbj1mW21dfHxmWyIqICIra107aWYoIW4pe3A9Yjtmb3IobyBpbiBmKXtqPW8uc3BsaXQoIiAiKTtpZihqWzBdPT09bHx8alswXT09PSIqIil7cD1mW2pbMV0rIiAiK2tdO2lmKHApe289ZltvXSxvPT09ITA/bj1wOnA9PT0hMCYmKG49byk7YnJlYWt9fX19IW4mJiFwJiZkLmVycm9yKCJObyBjb252ZXJzaW9uIGZyb20gIittLnJlcGxhY2UoIiAiLCIgdG8gIikpLG4hPT0hMCYmKGM9bj9uKGMpOnAobyhjKSkpfX1yZXR1cm4gY31mdW5jdGlvbiBiUihhLGMsZCl7dmFyIGU9YS5jb250ZW50cyxmPWEuZGF0YVR5cGVzLGc9YS5yZXNwb25zZUZpZWxkcyxoLGksaixrO2ZvcihpIGluIGcpaSBpbiBkJiYoY1tnW2ldXT1kW2ldKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQoKSxoPT09YiYmKGg9YS5taW1lVHlwZXx8Yy5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGgpZm9yKGkgaW4gZSlpZihlW2ldJiZlW2ldLnRlc3QoaCkpe2YudW5zaGlmdChpKTticmVha31pZihmWzBdaW4gZClqPWZbMF07ZWxzZXtmb3IoaSBpbiBkKXtpZighZlswXXx8YS5jb252ZXJ0ZXJzW2krIiAiK2ZbMF1dKXtqPWk7YnJlYWt9a3x8KGs9aSl9aj1qfHxrfWlmKGope2ohPT1mWzBdJiZmLnVuc2hpZnQoaik7cmV0dXJuIGRbal19fWZ1bmN0aW9uIGJRKGEsYixjLGUpe2lmKGQuaXNBcnJheShiKSYmYi5sZW5ndGgpZC5lYWNoKGIsZnVuY3Rpb24oYixmKXtjfHxicy50ZXN0KGEpP2UoYSxmKTpiUShhKyJbIisodHlwZW9mIGY9PT0ib2JqZWN0Inx8ZC5pc0FycmF5KGYpP2I6IiIpKyJdIixmLGMsZSl9KTtlbHNlIGlmKGN8fGI9PW51bGx8fHR5cGVvZiBiIT09Im9iamVjdCIpZShhLGIpO2Vsc2UgaWYoZC5pc0FycmF5KGIpfHxkLmlzRW1wdHlPYmplY3QoYikpZShhLCIiKTtlbHNlIGZvcih2YXIgZiBpbiBiKWJRKGErIlsiK2YrIl0iLGJbZl0sYyxlKX1mdW5jdGlvbiBiUChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YkosbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09PSJzdHJpbmciJiYoIWt8fGdbbF0/bD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGwpLGw9YlAoYSxjLGQsZSxsLGcpKSk7KGt8fCFsKSYmIWdbIioiXSYmKGw9YlAoYSxjLGQsZSwiKiIsZykpO3JldHVybiBsfWZ1bmN0aW9uIGJPKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3R5cGVvZiBiIT09InN0cmluZyImJihjPWIsYj0iKiIpO2lmKGQuaXNGdW5jdGlvbihjKSl7dmFyIGU9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KGJEKSxmPTAsZz1lLmxlbmd0aCxoLGksajtmb3IoO2Y8ZztmKyspaD1lW2ZdLGo9L15cKy8udGVzdChoKSxqJiYoaD1oLnN1YnN0cigxKXx8IioiKSxpPWFbaF09YVtoXXx8W10saVtqPyJ1bnNoaWZ0IjoicHVzaCJdKGMpfX19ZnVuY3Rpb24gYnEoYSxiLGMpe3ZhciBlPWI9PT0id2lkdGgiP2JrOmJsLGY9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodDtpZihjPT09ImJvcmRlciIpcmV0dXJuIGY7ZC5lYWNoKGUsZnVuY3Rpb24oKXtjfHwoZi09cGFyc2VGbG9hdChkLmNzcyhhLCJwYWRkaW5nIit0aGlzKSl8fDApLGM9PT0ibWFyZ2luIj9mKz1wYXJzZUZsb2F0KGQuY3NzKGEsIm1hcmdpbiIrdGhpcykpfHwwOmYtPXBhcnNlRmxvYXQoZC5jc3MoYSwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MH0pO3JldHVybiBmfWZ1bmN0aW9uIGJjKGEsYil7Yi5zcmM/ZC5hamF4KHt1cmw6Yi5zcmMsYXN5bmM6ITEsZGF0YVR5cGU6InNjcmlwdCJ9KTpkLmdsb2JhbEV2YWwoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfWZ1bmN0aW9uIGJiKGEpe3JldHVybiJnZXRFbGVtZW50c0J5VGFnTmFtZSJpbiBhP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKToicXVlcnlTZWxlY3RvckFsbCJpbiBhP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIGJhKGEsYil7aWYoYi5ub2RlVHlwZT09PTEpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtiLmNsZWFyQXR0cmlidXRlcygpLGIubWVyZ2VBdHRyaWJ1dGVzKGEpO2lmKGM9PT0ib2JqZWN0IiliLm91dGVySFRNTD1hLm91dGVySFRNTDtlbHNlIGlmKGMhPT0iaW5wdXQifHxhLnR5cGUhPT0iY2hlY2tib3giJiZhLnR5cGUhPT0icmFkaW8iKXtpZihjPT09Im9wdGlvbiIpYi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDtlbHNlIGlmKGM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIiliLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZX1lbHNlIGEuY2hlY2tlZCYmKGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCksYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpO2IucmVtb3ZlQXR0cmlidXRlKGQuZXhwYW5kbyl9fWZ1bmN0aW9uIF8oYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmZC5oYXNEYXRhKGEpKXt2YXIgYz1kLmV4cGFuZG8sZT1kLmRhdGEoYSksZj1kLmRhdGEoYixlKTtpZihlPWVbY10pe3ZhciBnPWUuZXZlbnRzO2Y9ZltjXT1kLmV4dGVuZCh7fSxlKTtpZihnKXtkZWxldGUgZi5oYW5kbGUsZi5ldmVudHM9e307Zm9yKHZhciBoIGluIGcpZm9yKHZhciBpPTAsaj1nW2hdLmxlbmd0aDtpPGo7aSsrKWQuZXZlbnQuYWRkKGIsaCsoZ1toXVtpXS5uYW1lc3BhY2U/Ii4iOiIiKStnW2hdW2ldLm5hbWVzcGFjZSxnW2hdW2ldLGdbaF1baV0uZGF0YSl9fX19ZnVuY3Rpb24gJChhLGIpe3JldHVybiBkLm5vZGVOYW1lKGEsInRhYmxlIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBRKGEsYixjKXtpZihkLmlzRnVuY3Rpb24oYikpcmV0dXJuIGQuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGQuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT09InN0cmluZyIpe3ZhciBlPWQuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVUeXBlPT09MX0pO2lmKEwudGVzdChiKSlyZXR1cm4gZC5maWx0ZXIoYixlLCFjKTtiPWQuZmlsdGVyKGIsZSl9cmV0dXJuIGQuZ3JlcChhLGZ1bmN0aW9uKGEsZSl7cmV0dXJuIGQuaW5BcnJheShhLGIpPj0wPT09Y30pfWZ1bmN0aW9uIFAoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fGEucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIEgoYSxiKXtyZXR1cm4oYSYmYSE9PSIqIj9hKyIuIjoiIikrYi5yZXBsYWNlKHQsImAiKS5yZXBsYWNlKHUsIiYiKX1mdW5jdGlvbiBHKGEpe3ZhciBiLGMsZSxmLGcsaCxpLGosayxsLG0sbixvLHA9W10scT1bXSxzPWQuX2RhdGEodGhpcywiZXZlbnRzIik7aWYoYS5saXZlRmlyZWQhPT10aGlzJiZzJiZzLmxpdmUmJiFhLnRhcmdldC5kaXNhYmxlZCYmKCFhLmJ1dHRvbnx8YS50eXBlIT09ImNsaWNrIikpe2EubmFtZXNwYWNlJiYobj1uZXcgUmVnRXhwKCIoXnxcXC4pIithLm5hbWVzcGFjZS5zcGxpdCgiLiIpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpKSxhLmxpdmVGaXJlZD10aGlzO3ZhciB0PXMubGl2ZS5zbGljZSgwKTtmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKWc9dFtpXSxnLm9yaWdUeXBlLnJlcGxhY2UociwiIik9PT1hLnR5cGU/cS5wdXNoKGcuc2VsZWN0b3IpOnQuc3BsaWNlKGktLSwxKTtmPWQoYS50YXJnZXQpLmNsb3Nlc3QocSxhLmN1cnJlbnRUYXJnZXQpO2ZvcihqPTAsaz1mLmxlbmd0aDtqPGs7aisrKXttPWZbal07Zm9yKGk9MDtpPHQubGVuZ3RoO2krKyl7Zz10W2ldO2lmKG0uc2VsZWN0b3I9PT1nLnNlbGVjdG9yJiYoIW58fG4udGVzdChnLm5hbWVzcGFjZSkpJiYhbS5lbGVtLmRpc2FibGVkKXtoPW0uZWxlbSxlPW51bGw7aWYoZy5wcmVUeXBlPT09Im1vdXNlZW50ZXIifHxnLnByZVR5cGU9PT0ibW91c2VsZWF2ZSIpYS50eXBlPWcucHJlVHlwZSxlPWQoYS5yZWxhdGVkVGFyZ2V0KS5jbG9zZXN0KGcuc2VsZWN0b3IpWzBdOyghZXx8ZSE9PWgpJiZwLnB1c2goe2VsZW06aCxoYW5kbGVPYmo6ZyxsZXZlbDptLmxldmVsfSl9fX1mb3Ioaj0wLGs9cC5sZW5ndGg7ajxrO2orKyl7Zj1wW2pdO2lmKGMmJmYubGV2ZWw+YylicmVhazthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGEuZGF0YT1mLmhhbmRsZU9iai5kYXRhLGEuaGFuZGxlT2JqPWYuaGFuZGxlT2JqLG89Zi5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoZi5lbGVtLGFyZ3VtZW50cyk7aWYobz09PSExfHxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2M9Zi5sZXZlbCxvPT09ITEmJihiPSExKTtpZihhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWt9fXJldHVybiBifX1mdW5jdGlvbiBFKGEsYyxlKXt2YXIgZj1kLmV4dGVuZCh7fSxlWzBdKTtmLnR5cGU9YSxmLm9yaWdpbmFsRXZlbnQ9e30sZi5saXZlRmlyZWQ9YixkLmV2ZW50LmhhbmRsZS5jYWxsKGMsZiksZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmZVswXS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIHkoKXtyZXR1cm4hMH1mdW5jdGlvbiB4KCl7cmV0dXJuITF9ZnVuY3Rpb24gaShhKXtmb3IodmFyIGIgaW4gYSlpZihiIT09InRvSlNPTiIpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gaChhLGMsZSl7aWYoZT09PWImJmEubm9kZVR5cGU9PT0xKXtlPWEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrYyk7aWYodHlwZW9mIGU9PT0ic3RyaW5nIil7dHJ5e2U9ZT09PSJ0cnVlIj8hMDplPT09ImZhbHNlIj8hMTplPT09Im51bGwiP251bGw6ZC5pc05hTihlKT9nLnRlc3QoZSk/ZC5wYXJzZUpTT04oZSk6ZTpwYXJzZUZsb2F0KGUpfWNhdGNoKGYpe31kLmRhdGEoYSxjLGUpfWVsc2UgZT1ifXJldHVybiBlfXZhciBjPWEuZG9jdW1lbnQsZD1mdW5jdGlvbigpe2Z1bmN0aW9uIEcoKXtpZighZC5pc1JlYWR5KXt0cnl7Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChhKXtzZXRUaW1lb3V0KEcsMSk7cmV0dXJufWQucmVhZHkoKX19dmFyIGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGQuZm4uaW5pdChhLGIsZyl9LGU9YS5qUXVlcnksZj1hLiQsZyxoPS9eKD86W148XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSspJCkvLGk9L1xTLyxqPS9eXHMrLyxrPS9ccyskLyxsPS9cZC8sbT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLG49L15bXF0sOnt9XHNdKiQvLG89L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyxwPS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyxxPS8oPzpefDp8LCkoPzpccypcWykrL2cscj0vKHdlYmtpdClbIFwvXShbXHcuXSspLyxzPS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyx0PS8obXNpZSkgKFtcdy5dKykvLHU9Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/Lyx2PW5hdmlnYXRvci51c2VyQWdlbnQsdyx4LHksej1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxCPUFycmF5LnByb3RvdHlwZS5wdXNoLEM9QXJyYXkucHJvdG90eXBlLnNsaWNlLEQ9U3RyaW5nLnByb3RvdHlwZS50cmltLEU9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsRj17fTtkLmZuPWQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkLGluaXQ6ZnVuY3Rpb24oYSxlLGYpe3ZhciBnLGksaixrO2lmKCFhKXJldHVybiB0aGlzO2lmKGEubm9kZVR5cGUpe3RoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZihhPT09ImJvZHkiJiYhZSYmYy5ib2R5KXt0aGlzLmNvbnRleHQ9Yyx0aGlzWzBdPWMuYm9keSx0aGlzLnNlbGVjdG9yPSJib2R5Iix0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT09InN0cmluZyIpe2c9aC5leGVjKGEpO2lmKCFnfHwhZ1sxXSYmZSlyZXR1cm4hZXx8ZS5qcXVlcnk/KGV8fGYpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihlKS5maW5kKGEpO2lmKGdbMV0pe2U9ZSBpbnN0YW5jZW9mIGQ/ZVswXTplLGs9ZT9lLm93bmVyRG9jdW1lbnR8fGU6YyxqPW0uZXhlYyhhKSxqP2QuaXNQbGFpbk9iamVjdChlKT8oYT1bYy5jcmVhdGVFbGVtZW50KGpbMV0pXSxkLmZuLmF0dHIuY2FsbChhLGUsITApKTphPVtrLmNyZWF0ZUVsZW1lbnQoalsxXSldOihqPWQuYnVpbGRGcmFnbWVudChbZ1sxXV0sW2tdKSxhPShqLmNhY2hlYWJsZT9kLmNsb25lKGouZnJhZ21lbnQpOmouZnJhZ21lbnQpLmNoaWxkTm9kZXMpO3JldHVybiBkLm1lcmdlKHRoaXMsYSl9aT1jLmdldEVsZW1lbnRCeUlkKGdbMl0pO2lmKGkmJmkucGFyZW50Tm9kZSl7aWYoaS5pZCE9PWdbMl0pcmV0dXJuIGYuZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09aX10aGlzLmNvbnRleHQ9Yyx0aGlzLnNlbGVjdG9yPWE7cmV0dXJuIHRoaXN9aWYoZC5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBkLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNS4yIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEMuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT10aGlzLmNvbnN0cnVjdG9yKCk7ZC5pc0FycmF5KGEpP0IuYXBwbHkoZSxhKTpkLm1lcmdlKGUsYSksZS5wcmV2T2JqZWN0PXRoaXMsZS5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Uuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGUuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBlfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2QuYmluZFJlYWR5KCkseC5kb25lKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLCthKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhDLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEMuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkIsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGQuZm4uaW5pdC5wcm90b3R5cGU9ZC5mbixkLmV4dGVuZD1kLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZSxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT09ImJvb2xlYW4iJiYobD1pLGk9YXJndW1lbnRzWzFdfHx7fSxqPTIpLHR5cGVvZiBpIT09Im9iamVjdCImJiFkLmlzRnVuY3Rpb24oaSkmJihpPXt9KSxrPT09aiYmKGk9dGhpcywtLWopO2Zvcig7ajxrO2orKylpZigoYT1hcmd1bWVudHNbal0pIT1udWxsKWZvcihjIGluIGEpe2U9aVtjXSxmPWFbY107aWYoaT09PWYpY29udGludWU7bCYmZiYmKGQuaXNQbGFpbk9iamVjdChmKXx8KGc9ZC5pc0FycmF5KGYpKSk/KGc/KGc9ITEsaD1lJiZkLmlzQXJyYXkoZSk/ZTpbXSk6aD1lJiZkLmlzUGxhaW5PYmplY3QoZSk/ZTp7fSxpW2NdPWQuZXh0ZW5kKGwsaCxmKSk6ZiE9PWImJihpW2NdPWYpfXJldHVybiBpfSxkLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihiKXthLiQ9ZixiJiYoYS5qUXVlcnk9ZSk7cmV0dXJuIGR9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oYSl7YT09PSEwJiZkLnJlYWR5V2FpdC0tO2lmKCFkLnJlYWR5V2FpdHx8YSE9PSEwJiYhZC5pc1JlYWR5KXtpZighYy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGQucmVhZHksMSk7ZC5pc1JlYWR5PSEwO2lmKGEhPT0hMCYmLS1kLnJlYWR5V2FpdD4wKXJldHVybjt4LnJlc29sdmVXaXRoKGMsW2RdKSxkLmZuLnRyaWdnZXImJmQoYykudHJpZ2dlcigicmVhZHkiKS51bmJpbmQoInJlYWR5Iil9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZigheCl7eD1kLl9EZWZlcnJlZCgpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZC5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix5LCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGQucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIix5KSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGQucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGUpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmRygpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGQudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGQudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09PSJvYmplY3QiJiYic2V0SW50ZXJ2YWwiaW4gYX0saXNOYU46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGx8fCFsLnRlc3QoYSl8fGlzTmFOKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpGW3ouY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxkLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8ZC5pc1dpbmRvdyhhKSlyZXR1cm4hMTtpZihhLmNvbnN0cnVjdG9yJiYhQS5jYWxsKGEsImNvbnN0cnVjdG9yIikmJiFBLmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMTt2YXIgYztmb3IoYyBpbiBhKXt9cmV0dXJuIGM9PT1ifHxBLmNhbGwoYSxjKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT09InN0cmluZyJ8fCFiKXJldHVybiBudWxsO2I9ZC50cmltKGIpO2lmKG4udGVzdChiLnJlcGxhY2UobywiQCIpLnJlcGxhY2UocCwiXSIpLnJlcGxhY2UocSwiIikpKXJldHVybiBhLkpTT04mJmEuSlNPTi5wYXJzZT9hLkpTT04ucGFyc2UoYik6KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYikpKCk7ZC5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxwYXJzZVhNTDpmdW5jdGlvbihiLGMsZSl7YS5ET01QYXJzZXI/KGU9bmV3IERPTVBhcnNlcixjPWUucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksYy5hc3luYz0iZmFsc2UiLGMubG9hZFhNTChiKSksZT1jLmRvY3VtZW50RWxlbWVudCwoIWV8fCFlLm5vZGVOYW1lfHxlLm5vZGVOYW1lPT09InBhcnNlcmVycm9yIikmJmQuZXJyb3IoIkludmFsaWQgWE1MOiAiK2IpO3JldHVybiBjfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe2lmKGEmJmkudGVzdChhKSl7dmFyIGI9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50LGU9Yy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkLnN1cHBvcnQuc2NyaXB0RXZhbCgpP2UuYXBwZW5kQ2hpbGQoYy5jcmVhdGVUZXh0Tm9kZShhKSk6ZS50ZXh0PWEsYi5pbnNlcnRCZWZvcmUoZSxiLmZpcnN0Q2hpbGQpLGIucmVtb3ZlQ2hpbGQoZSl9fSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGUpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGQuaXNGdW5jdGlvbihhKTtpZihlKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxlKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGUpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcih2YXIgaj1hWzBdO2c8aCYmYy5jYWxsKGosZyxqKSE9PSExO2o9YVsrK2ddKXt9cmV0dXJuIGF9LHRyaW06RD9mdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjpELmNhbGwoYSl9OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKGosIiIpLnJlcGxhY2UoaywiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO2lmKGEhPW51bGwpe3ZhciBlPWQudHlwZShhKTthLmxlbmd0aD09bnVsbHx8ZT09PSJzdHJpbmcifHxlPT09ImZ1bmN0aW9uInx8ZT09PSJyZWdleHAifHxkLmlzV2luZG93KGEpP0IuY2FsbChjLGEpOmQubWVyZ2UoYyxhKX1yZXR1cm4gY30saW5BcnJheTpmdW5jdGlvbihhLGIpe2lmKGIuaW5kZXhPZilyZXR1cm4gYi5pbmRleE9mKGEpO2Zvcih2YXIgYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihiW2NdPT09YSlyZXR1cm4gYztyZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLmxlbmd0aCxlPTA7aWYodHlwZW9mIGMubGVuZ3RoPT09Im51bWJlciIpZm9yKHZhciBmPWMubGVuZ3RoO2U8ZjtlKyspYVtkKytdPWNbZV07ZWxzZSB3aGlsZShjW2VdIT09YilhW2QrK109Y1tlKytdO2EubGVuZ3RoPWQ7cmV0dXJuIGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU7Yz0hIWM7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWU9ISFiKGFbZl0sZiksYyE9PWUmJmQucHVzaChhW2ZdKTtyZXR1cm4gZH0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPWIoYVtmXSxmLGMpLGUhPW51bGwmJihkW2QubGVuZ3RoXT1lKTtyZXR1cm4gZC5jb25jYXQuYXBwbHkoW10sZCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGMsZSl7YXJndW1lbnRzLmxlbmd0aD09PTImJih0eXBlb2YgYz09PSJzdHJpbmciPyhlPWEsYT1lW2NdLGM9Yik6YyYmIWQuaXNGdW5jdGlvbihjKSYmKGU9YyxjPWIpKSwhYyYmYSYmKGM9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShlfHx0aGlzLGFyZ3VtZW50cyl9KSxhJiYoYy5ndWlkPWEuZ3VpZD1hLmd1aWR8fGMuZ3VpZHx8ZC5ndWlkKyspO3JldHVybiBjfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGUsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT09Im9iamVjdCIpe2Zvcih2YXIgaiBpbiBjKWQuYWNjZXNzKGEsaixjW2pdLGYsZyxlKTtyZXR1cm4gYX1pZihlIT09Yil7Zj0haCYmZiYmZC5pc0Z1bmN0aW9uKGUpO2Zvcih2YXIgaz0wO2s8aTtrKyspZyhhW2tdLGMsZj9lLmNhbGwoYVtrXSxrLGcoYVtrXSxjKSk6ZSxoKTtyZXR1cm4gYX1yZXR1cm4gaT9nKGFbMF0sYyk6Yn0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGI9ci5leGVjKGEpfHxzLmV4ZWMoYSl8fHQuZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmdS5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjpiWzFdfHwiIix2ZXJzaW9uOmJbMl18fCIwIn19LHN1YjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjKXtyZXR1cm4gbmV3IGEuZm4uaW5pdChiLGMpfWQuZXh0ZW5kKCEwLGEsdGhpcyksYS5zdXBlcmNsYXNzPXRoaXMsYS5mbj1hLnByb3RvdHlwZT10aGlzKCksYS5mbi5jb25zdHJ1Y3Rvcj1hLGEuc3ViY2xhc3M9dGhpcy5zdWJjbGFzcyxhLmZuLmluaXQ9ZnVuY3Rpb24gYihiLGMpe2MmJmMgaW5zdGFuY2VvZiBkJiYhKGMgaW5zdGFuY2VvZiBhKSYmKGM9YShjKSk7cmV0dXJuIGQuZm4uaW5pdC5jYWxsKHRoaXMsYixjLGUpfSxhLmZuLmluaXQucHJvdG90eXBlPWEuZm47dmFyIGU9YShjKTtyZXR1cm4gYX0sYnJvd3Nlcjp7fX0pLGQuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0ZbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksdz1kLnVhTWF0Y2godiksdy5icm93c2VyJiYoZC5icm93c2VyW3cuYnJvd3Nlcl09ITAsZC5icm93c2VyLnZlcnNpb249dy52ZXJzaW9uKSxkLmJyb3dzZXIud2Via2l0JiYoZC5icm93c2VyLnNhZmFyaT0hMCksRSYmKGQuaW5BcnJheT1mdW5jdGlvbihhLGIpe3JldHVybiBFLmNhbGwoYixhKX0pLGkudGVzdCgiwqAiKSYmKGo9L15bXHNceEEwXSsvLGs9L1tcc1x4QTBdKyQvKSxnPWQoYyksYy5hZGRFdmVudExpc3RlbmVyP3k9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHksITEpLGQucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKHk9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIix5KSxkLnJlYWR5KCkpfSk7cmV0dXJuIGR9KCksZT0idGhlbiBkb25lIGZhaWwgaXNSZXNvbHZlZCBpc1JlamVjdGVkIHByb21pc2UiLnNwbGl0KCIgIiksZj1bXS5zbGljZTtkLmV4dGVuZCh7X0RlZmVycmVkOmZ1bmN0aW9uKCl7dmFyIGE9W10sYixjLGUsZj17ZG9uZTpmdW5jdGlvbigpe2lmKCFlKXt2YXIgYz1hcmd1bWVudHMsZyxoLGksaixrO2ImJihrPWIsYj0wKTtmb3IoZz0wLGg9Yy5sZW5ndGg7ZzxoO2crKylpPWNbZ10saj1kLnR5cGUoaSksaj09PSJhcnJheSI/Zi5kb25lLmFwcGx5KGYsaSk6aj09PSJmdW5jdGlvbiImJmEucHVzaChpKTtrJiZmLnJlc29sdmVXaXRoKGtbMF0sa1sxXSl9cmV0dXJuIHRoaXN9LHJlc29sdmVXaXRoOmZ1bmN0aW9uKGQsZil7aWYoIWUmJiFiJiYhYyl7Zj1mfHxbXSxjPTE7dHJ5e3doaWxlKGFbMF0pYS5zaGlmdCgpLmFwcGx5KGQsZil9ZmluYWxseXtiPVtkLGZdLGM9MH19cmV0dXJuIHRoaXN9LHJlc29sdmU6ZnVuY3Rpb24oKXtmLnJlc29sdmVXaXRoKHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc30saXNSZXNvbHZlZDpmdW5jdGlvbigpe3JldHVybiBjfHxifSxjYW5jZWw6ZnVuY3Rpb24oKXtlPTEsYT1bXTtyZXR1cm4gdGhpc319O3JldHVybiBmfSxEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1kLl9EZWZlcnJlZCgpLGM9ZC5fRGVmZXJyZWQoKSxmO2QuZXh0ZW5kKGIse3RoZW46ZnVuY3Rpb24oYSxjKXtiLmRvbmUoYSkuZmFpbChjKTtyZXR1cm4gdGhpc30sZmFpbDpjLmRvbmUscmVqZWN0V2l0aDpjLnJlc29sdmVXaXRoLHJlamVjdDpjLnJlc29sdmUsaXNSZWplY3RlZDpjLmlzUmVzb2x2ZWQscHJvbWlzZTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXtpZihmKXJldHVybiBmO2Y9YT17fX12YXIgYz1lLmxlbmd0aDt3aGlsZShjLS0pYVtlW2NdXT1iW2VbY11dO3JldHVybiBhfX0pLGIuZG9uZShjLmNhbmNlbCkuZmFpbChiLmNhbmNlbCksZGVsZXRlIGIuY2FuY2VsLGEmJmEuY2FsbChiLGIpO3JldHVybiBifSx3aGVuOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGkoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2JbYV09YXJndW1lbnRzLmxlbmd0aD4xP2YuY2FsbChhcmd1bWVudHMsMCk6YywtLWd8fGgucmVzb2x2ZVdpdGgoaCxmLmNhbGwoYiwwKSl9fXZhciBiPWFyZ3VtZW50cyxjPTAsZT1iLmxlbmd0aCxnPWUsaD1lPD0xJiZhJiZkLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hOmQuRGVmZXJyZWQoKTtpZihlPjEpe2Zvcig7YzxlO2MrKyliW2NdJiZkLmlzRnVuY3Rpb24oYltjXS5wcm9taXNlKT9iW2NdLnByb21pc2UoKS50aGVuKGkoYyksaC5yZWplY3QpOi0tZztnfHxoLnJlc29sdmVXaXRoKGgsYil9ZWxzZSBoIT09YSYmaC5yZXNvbHZlV2l0aChoLGU/W2FdOltdKTtyZXR1cm4gaC5wcm9taXNlKCl9fSksZnVuY3Rpb24oKXtkLnN1cHBvcnQ9e307dmFyIGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGIuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSdjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+Ijt2YXIgZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sZz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF07aWYoZSYmZS5sZW5ndGgmJmYpe2Quc3VwcG9ydD17bGVhZGluZ1doaXRlc3BhY2U6Yi5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3JlZC8udGVzdChmLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6Zi5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUkLy50ZXN0KGYuc3R5bGUub3BhY2l0eSksY3NzRmxvYXQ6ISFmLnN0eWxlLmNzc0Zsb2F0LGNoZWNrT246aS52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6aC5zZWxlY3RlZCxkZWxldGVFeHBhbmRvOiEwLG9wdERpc2FibGVkOiExLGNoZWNrQ2xvbmU6ITEsbm9DbG9uZUV2ZW50OiEwLG5vQ2xvbmVDaGVja2VkOiEwLGJveE1vZGVsOm51bGwsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlSGlkZGVuT2Zmc2V0czohMCxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsZC5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkPWkuY2xvbmVOb2RlKCEwKS5jaGVja2VkLGcuZGlzYWJsZWQ9ITAsZC5zdXBwb3J0Lm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3ZhciBqPW51bGw7ZC5zdXBwb3J0LnNjcmlwdEV2YWw9ZnVuY3Rpb24oKXtpZihqPT09bnVsbCl7dmFyIGI9Yy5kb2N1bWVudEVsZW1lbnQsZT1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGY9InNjcmlwdCIrZC5ub3coKTt0cnl7ZS5hcHBlbmRDaGlsZChjLmNyZWF0ZVRleHROb2RlKCJ3aW5kb3cuIitmKyI9MTsiKSl9Y2F0Y2goZyl7fWIuaW5zZXJ0QmVmb3JlKGUsYi5maXJzdENoaWxkKSxhW2ZdPyhqPSEwLGRlbGV0ZSBhW2ZdKTpqPSExLGIucmVtb3ZlQ2hpbGQoZSl9cmV0dXJuIGp9O3RyeXtkZWxldGUgYi50ZXN0fWNhdGNoKGspe2Quc3VwcG9ydC5kZWxldGVFeHBhbmRvPSExfSFiLmFkZEV2ZW50TGlzdGVuZXImJmIuYXR0YWNoRXZlbnQmJmIuZmlyZUV2ZW50JiYoYi5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24gbCgpe2Quc3VwcG9ydC5ub0Nsb25lRXZlbnQ9ITEsYi5kZXRhY2hFdmVudCgib25jbGljayIsbCl9KSxiLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdyYWRpb3Rlc3QnIGNoZWNrZWQ9J2NoZWNrZWQnLz4iO3ZhciBtPWMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO20uYXBwZW5kQ2hpbGQoYi5maXJzdENoaWxkKSxkLnN1cHBvcnQuY2hlY2tDbG9uZT1tLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxkKGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxiPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTtpZihiKXthLnN0eWxlLndpZHRoPWEuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCIsYi5hcHBlbmRDaGlsZChhKSxkLmJveE1vZGVsPWQuc3VwcG9ydC5ib3hNb2RlbD1hLm9mZnNldFdpZHRoPT09Miwiem9vbSJpbiBhLnN0eWxlJiYoYS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLGEuc3R5bGUuem9vbT0xLGQuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWEub2Zmc2V0V2lkdGg9PT0yLGEuc3R5bGUuZGlzcGxheT0iIixhLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NHB4Oyc+PC9kaXY+IixkLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrcz1hLm9mZnNldFdpZHRoIT09MiksYS5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+Ijt2YXIgZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpO2Quc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9ZVswXS5vZmZzZXRIZWlnaHQ9PT0wLGVbMF0uc3R5bGUuZGlzcGxheT0iIixlWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9ZC5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmZVswXS5vZmZzZXRIZWlnaHQ9PT0wLGEuaW5uZXJIVE1MPSIiLGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGEuc3R5bGUud2lkdGg9IjFweCIsYS5zdHlsZS5tYXJnaW5SaWdodD0iMCIsZC5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KGMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpLm1hcmdpblJpZ2h0LDEwKXx8MCk9PT0wKSxiLnJlbW92ZUNoaWxkKGEpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGE9ZT1udWxsfX0pO3ZhciBuPWZ1bmN0aW9uKGEpe3ZhciBiPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YT0ib24iK2E7aWYoIWIuYXR0YWNoRXZlbnQpcmV0dXJuITA7dmFyIGQ9YSBpbiBiO2R8fChiLnNldEF0dHJpYnV0ZShhLCJyZXR1cm47IiksZD10eXBlb2YgYlthXT09PSJmdW5jdGlvbiIpO3JldHVybiBkfTtkLnN1cHBvcnQuc3VibWl0QnViYmxlcz1uKCJzdWJtaXQiKSxkLnN1cHBvcnQuY2hhbmdlQnViYmxlcz1uKCJjaGFuZ2UiKSxiPWU9Zj1udWxsfX0oKTt2YXIgZz0vXig/Olx7LipcfXxcWy4qXF0pJC87ZC5leHRlbmQoe2NhY2hlOnt9LHV1aWQ6MCxleHBhbmRvOiJqUXVlcnkiKyhkLmZuLmpxdWVyeStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVuY3Rpb24oYSl7YT1hLm5vZGVUeXBlP2QuY2FjaGVbYVtkLmV4cGFuZG9dXTphW2QuZXhwYW5kb107cmV0dXJuISFhJiYhaShhKX0sZGF0YTpmdW5jdGlvbihhLGMsZSxmKXtpZihkLmFjY2VwdERhdGEoYSkpe3ZhciBnPWQuZXhwYW5kbyxoPXR5cGVvZiBjPT09InN0cmluZyIsaSxqPWEubm9kZVR5cGUsaz1qP2QuY2FjaGU6YSxsPWo/YVtkLmV4cGFuZG9dOmFbZC5leHBhbmRvXSYmZC5leHBhbmRvO2lmKCghbHx8ZiYmbCYmIWtbbF1bZ10pJiZoJiZlPT09YilyZXR1cm47bHx8KGo/YVtkLmV4cGFuZG9dPWw9KytkLnV1aWQ6bD1kLmV4cGFuZG8pLGtbbF18fChrW2xdPXt9LGp8fChrW2xdLnRvSlNPTj1kLm5vb3ApKTtpZih0eXBlb2YgYz09PSJvYmplY3QifHx0eXBlb2YgYz09PSJmdW5jdGlvbiIpZj9rW2xdW2ddPWQuZXh0ZW5kKGtbbF1bZ10sYyk6a1tsXT1kLmV4dGVuZChrW2xdLGMpO2k9a1tsXSxmJiYoaVtnXXx8KGlbZ109e30pLGk9aVtnXSksZSE9PWImJihpW2NdPWUpO2lmKGM9PT0iZXZlbnRzIiYmIWlbY10pcmV0dXJuIGlbZ10mJmlbZ10uZXZlbnRzO3JldHVybiBoP2lbY106aX19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYixjLGUpe2lmKGQuYWNjZXB0RGF0YShiKSl7dmFyIGY9ZC5leHBhbmRvLGc9Yi5ub2RlVHlwZSxoPWc/ZC5jYWNoZTpiLGo9Zz9iW2QuZXhwYW5kb106ZC5leHBhbmRvO2lmKCFoW2pdKXJldHVybjtpZihjKXt2YXIgaz1lP2hbal1bZl06aFtqXTtpZihrKXtkZWxldGUga1tjXTtpZighaShrKSlyZXR1cm59fWlmKGUpe2RlbGV0ZSBoW2pdW2ZdO2lmKCFpKGhbal0pKXJldHVybn12YXIgbD1oW2pdW2ZdO2Quc3VwcG9ydC5kZWxldGVFeHBhbmRvfHxoIT1hP2RlbGV0ZSBoW2pdOmhbal09bnVsbCxsPyhoW2pdPXt9LGd8fChoW2pdLnRvSlNPTj1kLm5vb3ApLGhbal1bZl09bCk6ZyYmKGQuc3VwcG9ydC5kZWxldGVFeHBhbmRvP2RlbGV0ZSBiW2QuZXhwYW5kb106Yi5yZW1vdmVBdHRyaWJ1dGU/Yi5yZW1vdmVBdHRyaWJ1dGUoZC5leHBhbmRvKTpiW2QuZXhwYW5kb109bnVsbCl9fSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGQuZGF0YShhLGIsYywhMCl9LGFjY2VwdERhdGE6ZnVuY3Rpb24oYSl7aWYoYS5ub2RlTmFtZSl7dmFyIGI9ZC5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihiKXJldHVybiBiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifXJldHVybiEwfX0pLGQuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bnVsbDtpZih0eXBlb2YgYT09PSJ1bmRlZmluZWQiKXtpZih0aGlzLmxlbmd0aCl7ZT1kLmRhdGEodGhpc1swXSk7aWYodGhpc1swXS5ub2RlVHlwZT09PTEpe3ZhciBmPXRoaXNbMF0uYXR0cmlidXRlcyxnO2Zvcih2YXIgaT0wLGo9Zi5sZW5ndGg7aTxqO2krKylnPWZbaV0ubmFtZSxnLmluZGV4T2YoImRhdGEtIik9PT0wJiYoZz1nLnN1YnN0cig1KSxoKHRoaXNbMF0sZyxlW2ddKSl9fXJldHVybiBlfWlmKHR5cGVvZiBhPT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2QuZGF0YSh0aGlzLGEpfSk7dmFyIGs9YS5zcGxpdCgiLiIpO2tbMV09a1sxXT8iLiIra1sxXToiIjtpZihjPT09Yil7ZT10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitrWzFdKyIhIixba1swXV0pLGU9PT1iJiZ0aGlzLmxlbmd0aCYmKGU9ZC5kYXRhKHRoaXNbMF0sYSksZT1oKHRoaXNbMF0sYSxlKSk7cmV0dXJuIGU9PT1iJiZrWzFdP3RoaXMuZGF0YShrWzBdKTplfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kKHRoaXMpLGU9W2tbMF0sY107Yi50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIra1sxXSsiISIsZSksZC5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitrWzFdKyIhIixlKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGQuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIjt2YXIgZT1kLl9kYXRhKGEsYik7aWYoIWMpcmV0dXJuIGV8fFtdOyFlfHxkLmlzQXJyYXkoYyk/ZT1kLl9kYXRhKGEsYixkLm1ha2VBcnJheShjKSk6ZS5wdXNoKGMpO3JldHVybiBlfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1kLnF1ZXVlKGEsYiksZT1jLnNoaWZ0KCk7ZT09PSJpbnByb2dyZXNzIiYmKGU9Yy5zaGlmdCgpKSxlJiYoYj09PSJmeCImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGUuY2FsbChhLGZ1bmN0aW9uKCl7ZC5kZXF1ZXVlKGEsYil9KSksYy5sZW5ndGh8fGQucmVtb3ZlRGF0YShhLGIrInF1ZXVlIiwhMCl9fSksZC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dHlwZW9mIGEhPT0ic3RyaW5nIiYmKGM9YSxhPSJmeCIpO2lmKGM9PT1iKXJldHVybiBkLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZT1kLnF1ZXVlKHRoaXMsYSxjKTthPT09ImZ4IiYmZVswXSE9PSJpbnByb2dyZXNzIiYmZC5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZC5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWQuZng/ZC5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbigpe3ZhciBjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2QuZGVxdWV1ZShjLGIpfSxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfX0pO3ZhciBqPS9bXG5cdFxyXS9nLGs9L1xzKy8sbD0vXHIvZyxtPS9eKD86aHJlZnxzcmN8c3R5bGUpJC8sbj0vXig/OmJ1dHRvbnxpbnB1dCkkL2ksbz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSxwPS9eYSg/OnJlYSk/JC9pLHE9L14oPzpyYWRpb3xjaGVja2JveCkkL2k7ZC5wcm9wcz17ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIscmVhZG9ubHk6InJlYWRPbmx5IixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix0YWJpbmRleDoidGFiSW5kZXgiLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIifSxkLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBkLmFjY2Vzcyh0aGlzLGEsYiwhMCxkLmF0dHIpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2QuYXR0cih0aGlzLGEsIiIpLHRoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZShhKX0pfSxhZGRDbGFzczpmdW5jdGlvbihhKXtpZihkLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1kKHRoaXMpO2MuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYixjLmF0dHIoImNsYXNzIikpKX0pO2lmKGEmJnR5cGVvZiBhPT09InN0cmluZyIpe3ZhciBiPShhfHwiIikuc3BsaXQoayk7Zm9yKHZhciBjPTAsZT10aGlzLmxlbmd0aDtjPGU7YysrKXt2YXIgZj10aGlzW2NdO2lmKGYubm9kZVR5cGU9PT0xKWlmKGYuY2xhc3NOYW1lKXt2YXIgZz0iICIrZi5jbGFzc05hbWUrIiAiLGg9Zi5jbGFzc05hbWU7Zm9yKHZhciBpPTAsaj1iLmxlbmd0aDtpPGo7aSsrKWcuaW5kZXhPZigiICIrYltpXSsiICIpPDAmJihoKz0iICIrYltpXSk7Zi5jbGFzc05hbWU9ZC50cmltKGgpfWVsc2UgZi5jbGFzc05hbWU9YX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2lmKGQuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWQodGhpcyk7Yy5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLGMuYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nInx8YT09PWIpe3ZhciBjPShhfHwiIikuc3BsaXQoayk7Zm9yKHZhciBlPTAsZj10aGlzLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz10aGlzW2VdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXt2YXIgaD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZShqLCIgIik7Zm9yKHZhciBpPTAsbD1jLmxlbmd0aDtpPGw7aSsrKWg9aC5yZXBsYWNlKCIgIitjW2ldKyIgIiwiICIpO2cuY2xhc3NOYW1lPWQudHJpbShoKX1lbHNlIGcuY2xhc3NOYW1lPSIifX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYSxlPXR5cGVvZiBiPT09ImJvb2xlYW4iO2lmKGQuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlPWQodGhpcyk7ZS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLGUuYXR0cigiY2xhc3MiKSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBmLGc9MCxoPWQodGhpcyksaT1iLGo9YS5zcGxpdChrKTt3aGlsZShmPWpbZysrXSlpPWU/aTohaC5oYXNDbGFzcyhmKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShmKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpkLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiO2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKylpZigoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShqLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXt2YXIgYz10aGlzWzBdO2lmKGMpe2lmKGQubm9kZU5hbWUoYywib3B0aW9uIikpe3ZhciBlPWMuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hZXx8ZS5zcGVjaWZpZWQ/Yy52YWx1ZTpjLnRleHR9aWYoZC5ub2RlTmFtZShjLCJzZWxlY3QiKSl7dmFyIGY9Yy5zZWxlY3RlZEluZGV4LGc9W10saD1jLm9wdGlvbnMsaT1jLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZjwwKXJldHVybiBudWxsO2Zvcih2YXIgaj1pP2Y6MCxrPWk/ZisxOmgubGVuZ3RoO2o8aztqKyspe3ZhciBtPWhbal07aWYobS5zZWxlY3RlZCYmKGQuc3VwcG9ydC5vcHREaXNhYmxlZD8hbS5kaXNhYmxlZDptLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIW0ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWQubm9kZU5hbWUobS5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7YT1kKG0pLnZhbCgpO2lmKGkpcmV0dXJuIGE7Zy5wdXNoKGEpfX1pZihpJiYhZy5sZW5ndGgmJmgubGVuZ3RoKXJldHVybiBkKGhbZl0pLnZhbCgpO3JldHVybiBnfWlmKHEudGVzdChjLnR5cGUpJiYhZC5zdXBwb3J0LmNoZWNrT24pcmV0dXJuIGMuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmMudmFsdWU7cmV0dXJuKGMudmFsdWV8fCIiKS5yZXBsYWNlKGwsIiIpfXJldHVybiBifXZhciBuPWQuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWQodGhpcyksZT1hO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtuJiYoZT1hLmNhbGwodGhpcyxiLGMudmFsKCkpKSxlPT1udWxsP2U9IiI6dHlwZW9mIGU9PT0ibnVtYmVyIj9lKz0iIjpkLmlzQXJyYXkoZSkmJihlPWQubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKTtpZihkLmlzQXJyYXkoZSkmJnEudGVzdCh0aGlzLnR5cGUpKXRoaXMuY2hlY2tlZD1kLmluQXJyYXkoYy52YWwoKSxlKT49MDtlbHNlIGlmKGQubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciBmPWQubWFrZUFycmF5KGUpO2QoIm9wdGlvbiIsdGhpcykuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ZC5pbkFycmF5KGQodGhpcykudmFsKCksZik+PTB9KSxmLmxlbmd0aHx8KHRoaXMuc2VsZWN0ZWRJbmRleD0tMSl9ZWxzZSB0aGlzLnZhbHVlPWV9fSl9fSksZC5leHRlbmQoe2F0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyOmZ1bmN0aW9uKGEsYyxlLGYpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTh8fGEubm9kZVR5cGU9PT0yKXJldHVybiBiO2lmKGYmJmMgaW4gZC5hdHRyRm4pcmV0dXJuIGQoYSlbY10oZSk7dmFyIGc9YS5ub2RlVHlwZSE9PTF8fCFkLmlzWE1MRG9jKGEpLGg9ZSE9PWI7Yz1nJiZkLnByb3BzW2NdfHxjO2lmKGEubm9kZVR5cGU9PT0xKXt2YXIgaT1tLnRlc3QoYyk7aWYoYz09PSJzZWxlY3RlZCImJiFkLnN1cHBvcnQub3B0U2VsZWN0ZWQpe3ZhciBqPWEucGFyZW50Tm9kZTtqJiYoai5zZWxlY3RlZEluZGV4LGoucGFyZW50Tm9kZSYmai5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfWlmKChjIGluIGF8fGFbY10hPT1iKSYmZyYmIWkpe2gmJihjPT09InR5cGUiJiZuLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSYmZC5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIiksZT09PW51bGw/YS5ub2RlVHlwZT09PTEmJmEucmVtb3ZlQXR0cmlidXRlKGMpOmFbY109ZSk7aWYoZC5ub2RlTmFtZShhLCJmb3JtIikmJmEuZ2V0QXR0cmlidXRlTm9kZShjKSlyZXR1cm4gYS5nZXRBdHRyaWJ1dGVOb2RlKGMpLm5vZGVWYWx1ZTtpZihjPT09InRhYkluZGV4Iil7dmFyIGs9YS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJJbmRleCIpO3JldHVybiBrJiZrLnNwZWNpZmllZD9rLnZhbHVlOm8udGVzdChhLm5vZGVOYW1lKXx8cC50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDpifXJldHVybiBhW2NdfWlmKCFkLnN1cHBvcnQuc3R5bGUmJmcmJmM9PT0ic3R5bGUiKXtoJiYoYS5zdHlsZS5jc3NUZXh0PSIiK2UpO3JldHVybiBhLnN0eWxlLmNzc1RleHR9aCYmYS5zZXRBdHRyaWJ1dGUoYywiIitlKTtpZighYS5hdHRyaWJ1dGVzW2NdJiYoYS5oYXNBdHRyaWJ1dGUmJiFhLmhhc0F0dHJpYnV0ZShjKSkpcmV0dXJuIGI7dmFyIGw9IWQuc3VwcG9ydC5ocmVmTm9ybWFsaXplZCYmZyYmaT9hLmdldEF0dHJpYnV0ZShjLDIpOmEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBsPT09bnVsbD9iOmx9aCYmKGFbY109ZSk7cmV0dXJuIGFbY119fSk7dmFyIHI9L1wuKC4qKSQvLHM9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLHQ9L1wuL2csdT0vIC9nLHY9L1teXHdccy58YF0vZyx3PWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodiwiXFwkJiIpfTtkLmV2ZW50PXthZGQ6ZnVuY3Rpb24oYyxlLGYsZyl7aWYoYy5ub2RlVHlwZSE9PTMmJmMubm9kZVR5cGUhPT04KXt0cnl7ZC5pc1dpbmRvdyhjKSYmKGMhPT1hJiYhYy5mcmFtZUVsZW1lbnQpJiYoYz1hKX1jYXRjaChoKXt9aWYoZj09PSExKWY9eDtlbHNlIGlmKCFmKXJldHVybjt2YXIgaSxqO2YuaGFuZGxlciYmKGk9ZixmPWkuaGFuZGxlciksZi5ndWlkfHwoZi5ndWlkPWQuZ3VpZCsrKTt2YXIgaz1kLl9kYXRhKGMpO2lmKCFrKXJldHVybjt2YXIgbD1rLmV2ZW50cyxtPWsuaGFuZGxlO2x8fChrLmV2ZW50cz1sPXt9KSxtfHwoay5oYW5kbGU9bT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGQhPT0idW5kZWZpbmVkIiYmZC5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGU/ZC5ldmVudC5oYW5kbGUuYXBwbHkobS5lbGVtLGFyZ3VtZW50cyk6Yn0pLG0uZWxlbT1jLGU9ZS5zcGxpdCgiICIpO3ZhciBuLG89MCxwO3doaWxlKG49ZVtvKytdKXtqPWk/ZC5leHRlbmQoe30saSk6e2hhbmRsZXI6ZixkYXRhOmd9LG4uaW5kZXhPZigiLiIpPi0xPyhwPW4uc3BsaXQoIi4iKSxuPXAuc2hpZnQoKSxqLm5hbWVzcGFjZT1wLnNsaWNlKDApLnNvcnQoKS5qb2luKCIuIikpOihwPVtdLGoubmFtZXNwYWNlPSIiKSxqLnR5cGU9bixqLmd1aWR8fChqLmd1aWQ9Zi5ndWlkKTt2YXIgcT1sW25dLHI9ZC5ldmVudC5zcGVjaWFsW25dfHx7fTtpZighcSl7cT1sW25dPVtdO2lmKCFyLnNldHVwfHxyLnNldHVwLmNhbGwoYyxnLHAsbSk9PT0hMSljLmFkZEV2ZW50TGlzdGVuZXI/Yy5hZGRFdmVudExpc3RlbmVyKG4sbSwhMSk6Yy5hdHRhY2hFdmVudCYmYy5hdHRhY2hFdmVudCgib24iK24sbSl9ci5hZGQmJihyLmFkZC5jYWxsKGMsaiksai5oYW5kbGVyLmd1aWR8fChqLmhhbmRsZXIuZ3VpZD1mLmd1aWQpKSxxLnB1c2goaiksZC5ldmVudC5nbG9iYWxbbl09ITB9Yz1udWxsfX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGMsZSxmKXtpZihhLm5vZGVUeXBlIT09MyYmYS5ub2RlVHlwZSE9PTgpe2U9PT0hMSYmKGU9eCk7dmFyIGcsaCxpLGosaz0wLGwsbSxuLG8scCxxLHIscz1kLmhhc0RhdGEoYSkmJmQuX2RhdGEoYSksdD1zJiZzLmV2ZW50cztpZighc3x8IXQpcmV0dXJuO2MmJmMudHlwZSYmKGU9Yy5oYW5kbGVyLGM9Yy50eXBlKTtpZighY3x8dHlwZW9mIGM9PT0ic3RyaW5nIiYmYy5jaGFyQXQoMCk9PT0iLiIpe2M9Y3x8IiI7Zm9yKGggaW4gdClkLmV2ZW50LnJlbW92ZShhLGgrYyk7cmV0dXJufWM9Yy5zcGxpdCgiICIpO3doaWxlKGg9Y1trKytdKXtyPWgscT1udWxsLGw9aC5pbmRleE9mKCIuIik8MCxtPVtdLGx8fChtPWguc3BsaXQoIi4iKSxoPW0uc2hpZnQoKSxuPW5ldyBSZWdFeHAoIihefFxcLikiK2QubWFwKG0uc2xpY2UoMCkuc29ydCgpLHcpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpKSxwPXRbaF07aWYoIXApY29udGludWU7aWYoIWUpe2ZvcihqPTA7ajxwLmxlbmd0aDtqKyspe3E9cFtqXTtpZihsfHxuLnRlc3QocS5uYW1lc3BhY2UpKWQuZXZlbnQucmVtb3ZlKGEscixxLmhhbmRsZXIsaikscC5zcGxpY2Uoai0tLDEpfWNvbnRpbnVlfW89ZC5ldmVudC5zcGVjaWFsW2hdfHx7fTtmb3Ioaj1mfHwwO2o8cC5sZW5ndGg7aisrKXtxPXBbal07aWYoZS5ndWlkPT09cS5ndWlkKXtpZihsfHxuLnRlc3QocS5uYW1lc3BhY2UpKWY9PW51bGwmJnAuc3BsaWNlKGotLSwxKSxvLnJlbW92ZSYmby5yZW1vdmUuY2FsbChhLHEpO2lmKGYhPW51bGwpYnJlYWt9fWlmKHAubGVuZ3RoPT09MHx8ZiE9bnVsbCYmcC5sZW5ndGg9PT0xKSghby50ZWFyZG93bnx8by50ZWFyZG93bi5jYWxsKGEsbSk9PT0hMSkmJmQucmVtb3ZlRXZlbnQoYSxoLHMuaGFuZGxlKSxnPW51bGwsZGVsZXRlIHRbaF19aWYoZC5pc0VtcHR5T2JqZWN0KHQpKXt2YXIgdT1zLmhhbmRsZTt1JiYodS5lbGVtPW51bGwpLGRlbGV0ZSBzLmV2ZW50cyxkZWxldGUgcy5oYW5kbGUsZC5pc0VtcHR5T2JqZWN0KHMpJiZkLnJlbW92ZURhdGEoYSxiLCEwKX19fSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZj1hLnR5cGV8fGEsZz1hcmd1bWVudHNbM107aWYoIWcpe2E9dHlwZW9mIGE9PT0ib2JqZWN0Ij9hW2QuZXhwYW5kb10/YTpkLmV4dGVuZChkLkV2ZW50KGYpLGEpOmQuRXZlbnQoZiksZi5pbmRleE9mKCIhIik+PTAmJihhLnR5cGU9Zj1mLnNsaWNlKDAsLTEpLGEuZXhjbHVzaXZlPSEwKSxlfHwoYS5zdG9wUHJvcGFnYXRpb24oKSxkLmV2ZW50Lmdsb2JhbFtmXSYmZC5lYWNoKGQuY2FjaGUsZnVuY3Rpb24oKXt2YXIgYj1kLmV4cGFuZG8sZT10aGlzW2JdO2UmJmUuZXZlbnRzJiZlLmV2ZW50c1tmXSYmZC5ldmVudC50cmlnZ2VyKGEsYyxlLmhhbmRsZS5lbGVtKX0pKTtpZighZXx8ZS5ub2RlVHlwZT09PTN8fGUubm9kZVR5cGU9PT04KXJldHVybiBiO2EucmVzdWx0PWIsYS50YXJnZXQ9ZSxjPWQubWFrZUFycmF5KGMpLGMudW5zaGlmdChhKX1hLmN1cnJlbnRUYXJnZXQ9ZTt2YXIgaD1kLl9kYXRhKGUsImhhbmRsZSIpO2gmJmguYXBwbHkoZSxjKTt2YXIgaT1lLnBhcmVudE5vZGV8fGUub3duZXJEb2N1bWVudDt0cnl7ZSYmZS5ub2RlTmFtZSYmZC5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8ZVsib24iK2ZdJiZlWyJvbiIrZl0uYXBwbHkoZSxjKT09PSExJiYoYS5yZXN1bHQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKX1jYXRjaChqKXt9aWYoIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaSlkLmV2ZW50LnRyaWdnZXIoYSxjLGksITApO2Vsc2UgaWYoIWEuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBrLGw9YS50YXJnZXQsbT1mLnJlcGxhY2UociwiIiksbj1kLm5vZGVOYW1lKGwsImEiKSYmbT09PSJjbGljayIsbz1kLmV2ZW50LnNwZWNpYWxbbV18fHt9O2lmKCghby5fZGVmYXVsdHx8by5fZGVmYXVsdC5jYWxsKGUsYSk9PT0hMSkmJiFuJiYhKGwmJmwubm9kZU5hbWUmJmQubm9EYXRhW2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXt0cnl7bFttXSYmKGs9bFsib24iK21dLGsmJihsWyJvbiIrbV09bnVsbCksZC5ldmVudC50cmlnZ2VyZWQ9YS50eXBlLGxbbV0oKSl9Y2F0Y2gocCl7fWsmJihsWyJvbiIrbV09ayksZC5ldmVudC50cmlnZ2VyZWQ9Yn19fSxoYW5kbGU6ZnVuY3Rpb24oYyl7dmFyIGUsZixnLGgsaSxqPVtdLGs9ZC5tYWtlQXJyYXkoYXJndW1lbnRzKTtjPWtbMF09ZC5ldmVudC5maXgoY3x8YS5ldmVudCksYy5jdXJyZW50VGFyZ2V0PXRoaXMsZT1jLnR5cGUuaW5kZXhPZigiLiIpPDAmJiFjLmV4Y2x1c2l2ZSxlfHwoZz1jLnR5cGUuc3BsaXQoIi4iKSxjLnR5cGU9Zy5zaGlmdCgpLGo9Zy5zbGljZSgwKS5zb3J0KCksaD1uZXcgUmVnRXhwKCIoXnxcXC4pIitqLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpKSxjLm5hbWVzcGFjZT1jLm5hbWVzcGFjZXx8ai5qb2luKCIuIiksaT1kLl9kYXRhKHRoaXMsImV2ZW50cyIpLGY9KGl8fHt9KVtjLnR5cGVdO2lmKGkmJmYpe2Y9Zi5zbGljZSgwKTtmb3IodmFyIGw9MCxtPWYubGVuZ3RoO2w8bTtsKyspe3ZhciBuPWZbbF07aWYoZXx8aC50ZXN0KG4ubmFtZXNwYWNlKSl7Yy5oYW5kbGVyPW4uaGFuZGxlcixjLmRhdGE9bi5kYXRhLGMuaGFuZGxlT2JqPW47dmFyIG89bi5oYW5kbGVyLmFwcGx5KHRoaXMsayk7byE9PWImJihjLnJlc3VsdD1vLG89PT0hMSYmKGMucHJldmVudERlZmF1bHQoKSxjLnN0b3BQcm9wYWdhdGlvbigpKSk7aWYoYy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfX19cmV0dXJuIGMucmVzdWx0fSxwcm9wczoiYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFyQ29kZSBjbGllbnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2ZW50UGhhc2UgZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIGxheWVyWCBsYXllclkgbWV0YUtleSBuZXdWYWx1ZSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2NyZWVuWCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRvRWxlbWVudCB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIiksZml4OmZ1bmN0aW9uKGEpe2lmKGFbZC5leHBhbmRvXSlyZXR1cm4gYTt2YXIgZT1hO2E9ZC5FdmVudChlKTtmb3IodmFyIGY9dGhpcy5wcm9wcy5sZW5ndGgsZztmOylnPXRoaXMucHJvcHNbLS1mXSxhW2ddPWVbZ107YS50YXJnZXR8fChhLnRhcmdldD1hLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLCFhLnJlbGF0ZWRUYXJnZXQmJmEuZnJvbUVsZW1lbnQmJihhLnJlbGF0ZWRUYXJnZXQ9YS5mcm9tRWxlbWVudD09PWEudGFyZ2V0P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQpO2lmKGEucGFnZVg9PW51bGwmJmEuY2xpZW50WCE9bnVsbCl7dmFyIGg9Yy5kb2N1bWVudEVsZW1lbnQsaT1jLmJvZHk7YS5wYWdlWD1hLmNsaWVudFgrKGgmJmguc2Nyb2xsTGVmdHx8aSYmaS5zY3JvbGxMZWZ0fHwwKS0oaCYmaC5jbGllbnRMZWZ0fHxpJiZpLmNsaWVudExlZnR8fDApLGEucGFnZVk9YS5jbGllbnRZKyhoJiZoLnNjcm9sbFRvcHx8aSYmaS5zY3JvbGxUb3B8fDApLShoJiZoLmNsaWVudFRvcHx8aSYmaS5jbGllbnRUb3B8fDApfWEud2hpY2g9PW51bGwmJihhLmNoYXJDb2RlIT1udWxsfHxhLmtleUNvZGUhPW51bGwpJiYoYS53aGljaD1hLmNoYXJDb2RlIT1udWxsP2EuY2hhckNvZGU6YS5rZXlDb2RlKSwhYS5tZXRhS2V5JiZhLmN0cmxLZXkmJihhLm1ldGFLZXk9YS5jdHJsS2V5KSwhYS53aGljaCYmYS5idXR0b24hPT1iJiYoYS53aGljaD1hLmJ1dHRvbiYxPzE6YS5idXR0b24mMj8zOmEuYnV0dG9uJjQ/MjowKTtyZXR1cm4gYX0sZ3VpZDoxZTgscHJveHk6ZC5wcm94eSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6ZC5iaW5kUmVhZHksdGVhcmRvd246ZC5ub29wfSxsaXZlOnthZGQ6ZnVuY3Rpb24oYSl7ZC5ldmVudC5hZGQodGhpcyxIKGEub3JpZ1R5cGUsYS5zZWxlY3RvciksZC5leHRlbmQoe30sYSx7aGFuZGxlcjpHLGd1aWQ6YS5oYW5kbGVyLmd1aWR9KSl9LHJlbW92ZTpmdW5jdGlvbihhKXtkLmV2ZW50LnJlbW92ZSh0aGlzLEgoYS5vcmlnVHlwZSxhLnNlbGVjdG9yKSxhKX19LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGMpe2QuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPWMpfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT1iJiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fX0sZC5yZW1vdmVFdmVudD1jLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXthLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKX0sZC5FdmVudD1mdW5jdGlvbihhKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdClyZXR1cm4gbmV3IGQuRXZlbnQoYSk7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/eTp4KTp0aGlzLnR5cGU9YSx0aGlzLnRpbWVTdGFtcD1kLm5vdygpLHRoaXNbZC5leHBhbmRvXT0hMH0sZC5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9eTt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7YSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXk7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2EmJihhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9eSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6eCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDp4LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOnh9O3ZhciB6PWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVsYXRlZFRhcmdldDt0cnl7aWYoYiYmYiE9PWMmJiFiLnBhcmVudE5vZGUpcmV0dXJuO3doaWxlKGImJmIhPT10aGlzKWI9Yi5wYXJlbnROb2RlO2IhPT10aGlzJiYoYS50eXBlPWEuZGF0YSxkLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfWNhdGNoKGUpe319LEE9ZnVuY3Rpb24oYSl7YS50eXBlPWEuZGF0YSxkLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2QuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7ZC5ldmVudC5zcGVjaWFsW2FdPXtzZXR1cDpmdW5jdGlvbihjKXtkLmV2ZW50LmFkZCh0aGlzLGIsYyYmYy5zZWxlY3Rvcj9BOnosYSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2QuZXZlbnQucmVtb3ZlKHRoaXMsYixhJiZhLnNlbGVjdG9yP0E6eil9fX0pLGQuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZC5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLm5vZGVOYW1lJiZ0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0iZm9ybSIpZC5ldmVudC5hZGQodGhpcywiY2xpY2suc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1iLnR5cGU7KGM9PT0ic3VibWl0Inx8Yz09PSJpbWFnZSIpJiZkKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJkUoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSksZC5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1iLnR5cGU7KGM9PT0idGV4dCJ8fGM9PT0icGFzc3dvcmQiKSYmZChiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoJiZhLmtleUNvZGU9PT0xMyYmRSgic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9KTtlbHNlIHJldHVybiExfSx0ZWFyZG93bjpmdW5jdGlvbihhKXtkLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbFN1Ym1pdCIpfX0pO2lmKCFkLnN1cHBvcnQuY2hhbmdlQnViYmxlcyl7dmFyIEIsQz1mdW5jdGlvbihhKXt2YXIgYj1hLnR5cGUsYz1hLnZhbHVlO2I9PT0icmFkaW8ifHxiPT09ImNoZWNrYm94Ij9jPWEuY2hlY2tlZDpiPT09InNlbGVjdC1tdWx0aXBsZSI/Yz1hLnNlbGVjdGVkSW5kZXg+LTE/ZC5tYXAoYS5vcHRpb25zLGZ1bmN0aW9uKGEpe3JldHVybiBhLnNlbGVjdGVkfSkuam9pbigiLSIpOiIiOmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiJiYoYz1hLnNlbGVjdGVkSW5kZXgpO3JldHVybiBjfSxEPWZ1bmN0aW9uIEQoYSl7dmFyIGM9YS50YXJnZXQsZSxmO2lmKHMudGVzdChjLm5vZGVOYW1lKSYmIWMucmVhZE9ubHkpe2U9ZC5fZGF0YShjLCJfY2hhbmdlX2RhdGEiKSxmPUMoYyksKGEudHlwZSE9PSJmb2N1c291dCJ8fGMudHlwZSE9PSJyYWRpbyIpJiZkLl9kYXRhKGMsIl9jaGFuZ2VfZGF0YSIsZik7aWYoZT09PWJ8fGY9PT1lKXJldHVybjtpZihlIT1udWxsfHxmKWEudHlwZT0iY2hhbmdlIixhLmxpdmVGaXJlZD1iLGQuZXZlbnQudHJpZ2dlcihhLGFyZ3VtZW50c1sxXSxjKX19O2QuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e2ZpbHRlcnM6e2ZvY3Vzb3V0OkQsYmVmb3JlZGVhY3RpdmF0ZTpELGNsaWNrOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9Yi50eXBlOyhjPT09InJhZGlvInx8Yz09PSJjaGVja2JveCJ8fGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKSYmRC5jYWxsKHRoaXMsYSl9LGtleWRvd246ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1iLnR5cGU7KGEua2V5Q29kZT09PTEzJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0idGV4dGFyZWEifHxhLmtleUNvZGU9PT0zMiYmKGM9PT0iY2hlY2tib3gifHxjPT09InJhZGlvIil8fGM9PT0ic2VsZWN0LW11bHRpcGxlIikmJkQuY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtkLl9kYXRhKGIsIl9jaGFuZ2VfZGF0YSIsQyhiKSl9fSxzZXR1cDpmdW5jdGlvbihhLGIpe2lmKHRoaXMudHlwZT09PSJmaWxlIilyZXR1cm4hMTtmb3IodmFyIGMgaW4gQilkLmV2ZW50LmFkZCh0aGlzLGMrIi5zcGVjaWFsQ2hhbmdlIixCW2NdKTtyZXR1cm4gcy50ZXN0KHRoaXMubm9kZU5hbWUpfSx0ZWFyZG93bjpmdW5jdGlvbihhKXtkLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbENoYW5nZSIpO3JldHVybiBzLnRlc3QodGhpcy5ub2RlTmFtZSl9fSxCPWQuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVycyxCLmZvY3VzPUIuYmVmb3JlYWN0aXZhdGV9Yy5hZGRFdmVudExpc3RlbmVyJiZkLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZihhKXt2YXIgYz1kLmV2ZW50LmZpeChhKTtjLnR5cGU9YixjLm9yaWdpbmFsRXZlbnQ9e30sZC5ldmVudC50cmlnZ2VyKGMsbnVsbCxjLnRhcmdldCksYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYS5wcmV2ZW50RGVmYXVsdCgpfXZhciBlPTA7ZC5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2UrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGYsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZT09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGYsITApfX19KSxkLmVhY2goWyJiaW5kIiwib25lIl0sZnVuY3Rpb24oYSxjKXtkLmZuW2NdPWZ1bmN0aW9uKGEsZSxmKXtpZih0eXBlb2YgYT09PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzW2NdKGcsZSxhW2ddLGYpO3JldHVybiB0aGlzfWlmKGQuaXNGdW5jdGlvbihlKXx8ZT09PSExKWY9ZSxlPWI7dmFyIGg9Yz09PSJvbmUiP2QucHJveHkoZixmdW5jdGlvbihhKXtkKHRoaXMpLnVuYmluZChhLGgpO3JldHVybiBmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pOmY7aWYoYT09PSJ1bmxvYWQiJiZjIT09Im9uZSIpdGhpcy5vbmUoYSxlLGYpO2Vsc2UgZm9yKHZhciBpPTAsaj10aGlzLmxlbmd0aDtpPGo7aSsrKWQuZXZlbnQuYWRkKHRoaXNbaV0sYSxoLGUpO3JldHVybiB0aGlzfX0pLGQuZm4uZXh0ZW5kKHt1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYSE9PSJvYmplY3QifHxhLnByZXZlbnREZWZhdWx0KWZvcih2YXIgZT0wLGY9dGhpcy5sZW5ndGg7ZTxmO2UrKylkLmV2ZW50LnJlbW92ZSh0aGlzW2VdLGEsYik7ZWxzZSBmb3IodmFyIGMgaW4gYSl0aGlzLnVuYmluZChjLGFbY10pO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5saXZlKGIsYyxkLGEpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/dGhpcy51bmJpbmQoImxpdmUiKTp0aGlzLmRpZShiLG51bGwsYyxhKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSl7dmFyIGM9ZC5FdmVudChhKTtjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSxkLmV2ZW50LnRyaWdnZXIoYyxiLHRoaXNbMF0pO3JldHVybiBjLnJlc3VsdH19LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz0xO3doaWxlKGM8Yi5sZW5ndGgpZC5wcm94eShhLGJbYysrXSk7cmV0dXJuIHRoaXMuY2xpY2soZC5wcm94eShhLGZ1bmN0aW9uKGUpe3ZhciBmPShkLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWM7ZC5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZisxKSxlLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX0pKX0saG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIEY9e2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCIsbW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9O2QuZWFjaChbImxpdmUiLCJkaWUiXSxmdW5jdGlvbihhLGMpe2QuZm5bY109ZnVuY3Rpb24oYSxlLGYsZyl7dmFyIGgsaT0wLGosayxsLG09Z3x8dGhpcy5zZWxlY3RvcixuPWc/dGhpczpkKHRoaXMuY29udGV4dCk7aWYodHlwZW9mIGE9PT0ib2JqZWN0IiYmIWEucHJldmVudERlZmF1bHQpe2Zvcih2YXIgbyBpbiBhKW5bY10obyxlLGFbb10sbSk7cmV0dXJuIHRoaXN9ZC5pc0Z1bmN0aW9uKGUpJiYoZj1lLGU9YiksYT0oYXx8IiIpLnNwbGl0KCIgIik7d2hpbGUoKGg9YVtpKytdKSE9bnVsbCl7aj1yLmV4ZWMoaCksaz0iIixqJiYoaz1qWzBdLGg9aC5yZXBsYWNlKHIsIiIpKTtpZihoPT09ImhvdmVyIil7YS5wdXNoKCJtb3VzZWVudGVyIitrLCJtb3VzZWxlYXZlIitrKTtjb250aW51ZX1sPWgsaD09PSJmb2N1cyJ8fGg9PT0iYmx1ciI/KGEucHVzaChGW2hdK2spLGg9aCtrKTpoPShGW2hdfHxoKStrO2lmKGM9PT0ibGl2ZSIpZm9yKHZhciBwPTAscT1uLmxlbmd0aDtwPHE7cCsrKWQuZXZlbnQuYWRkKG5bcF0sImxpdmUuIitIKGgsbSkse2RhdGE6ZSxzZWxlY3RvcjptLGhhbmRsZXI6ZixvcmlnVHlwZTpoLG9yaWdIYW5kbGVyOmYscHJlVHlwZTpsfSk7ZWxzZSBuLnVuYmluZCgibGl2ZS4iK0goaCxtKSxmKX1yZXR1cm4gdGhpc319KSxkLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtkLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5iaW5kKGIsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGQuYXR0ckZuJiYoZC5hdHRyRm5bYl09ITApfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB1KGEsYixjLGQsZSxmKXtmb3IodmFyIGc9MCxoPWQubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWRbZ107aWYoaSl7dmFyIGo9ITE7aT1pW2FdO3doaWxlKGkpe2lmKGkuc2l6Y2FjaGU9PT1jKXtqPWRbaS5zaXpzZXRdO2JyZWFrfWlmKGkubm9kZVR5cGU9PT0xKXtmfHwoaS5zaXpjYWNoZT1jLGkuc2l6c2V0PWcpO2lmKHR5cGVvZiBiIT09InN0cmluZyIpe2lmKGk9PT1iKXtqPSEwO2JyZWFrfX1lbHNlIGlmKGsuZmlsdGVyKGIsW2ldKS5sZW5ndGg+MCl7aj1pO2JyZWFrfX1pPWlbYV19ZFtnXT1qfX19ZnVuY3Rpb24gdChhLGIsYyxkLGUsZil7Zm9yKHZhciBnPTAsaD1kLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1kW2ddO2lmKGkpe3ZhciBqPSExO2k9aVthXTt3aGlsZShpKXtpZihpLnNpemNhY2hlPT09Yyl7aj1kW2kuc2l6c2V0XTticmVha31pLm5vZGVUeXBlPT09MSYmIWYmJihpLnNpemNhY2hlPWMsaS5zaXpzZXQ9Zyk7aWYoaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yil7aj1pO2JyZWFrfWk9aVthXX1kW2ddPWp9fX12YXIgYT0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXlxbXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteXFtcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8oKD86LnxccnxcbikqKS9nLGU9MCxmPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsZz0hMSxoPSEwLGk9L1xcL2csaj0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtoPSExO3JldHVybiAwfSk7dmFyIGs9ZnVuY3Rpb24oYixkLGUsZyl7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT09InN0cmluZyIpcmV0dXJuIGU7dmFyIGksaixuLG8scSxyLHMsdCx1PSEwLHc9ay5pc1hNTChkKSx4PVtdLHk9Yjtkb3thLmV4ZWMoIiIpLGk9YS5leGVjKHkpO2lmKGkpe3k9aVszXSx4LnB1c2goaVsxXSk7aWYoaVsyXSl7bz1pWzNdO2JyZWFrfX19d2hpbGUoaSk7aWYoeC5sZW5ndGg+MSYmbS5leGVjKGIpKWlmKHgubGVuZ3RoPT09MiYmbC5yZWxhdGl2ZVt4WzBdXSlqPXYoeFswXSt4WzFdLGQpO2Vsc2V7aj1sLnJlbGF0aXZlW3hbMF1dP1tkXTprKHguc2hpZnQoKSxkKTt3aGlsZSh4Lmxlbmd0aCliPXguc2hpZnQoKSxsLnJlbGF0aXZlW2JdJiYoYis9eC5zaGlmdCgpKSxqPXYoYixqKX1lbHNleyFnJiZ4Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXcmJmwubWF0Y2guSUQudGVzdCh4WzBdKSYmIWwubWF0Y2guSUQudGVzdCh4W3gubGVuZ3RoLTFdKSYmKHE9ay5maW5kKHguc2hpZnQoKSxkLHcpLGQ9cS5leHByP2suZmlsdGVyKHEuZXhwcixxLnNldClbMF06cS5zZXRbMF0pO2lmKGQpe3E9Zz97ZXhwcjp4LnBvcCgpLHNldDpwKGcpfTprLmZpbmQoeC5wb3AoKSx4Lmxlbmd0aD09PTEmJih4WzBdPT09In4ifHx4WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHcpLGo9cS5leHByP2suZmlsdGVyKHEuZXhwcixxLnNldCk6cS5zZXQseC5sZW5ndGg+MD9uPXAoaik6dT0hMTt3aGlsZSh4Lmxlbmd0aClyPXgucG9wKCkscz1yLGwucmVsYXRpdmVbcl0/cz14LnBvcCgpOnI9IiIscz09bnVsbCYmKHM9ZCksbC5yZWxhdGl2ZVtyXShuLHMsdyl9ZWxzZSBuPXg9W119bnx8KG49aiksbnx8ay5lcnJvcihyfHxiKTtpZihmLmNhbGwobik9PT0iW29iamVjdCBBcnJheV0iKWlmKHUpaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtuW3RdIT1udWxsO3QrKyluW3RdJiYoblt0XT09PSEwfHxuW3RdLm5vZGVUeXBlPT09MSYmay5jb250YWlucyhkLG5bdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtuW3RdIT1udWxsO3QrKyluW3RdJiZuW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgZS5wdXNoLmFwcGx5KGUsbik7ZWxzZSBwKG4sZSk7byYmKGsobyxoLGUsZyksay51bmlxdWVTb3J0KGUpKTtyZXR1cm4gZX07ay51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHIpe2c9aCxhLnNvcnQocik7aWYoZylmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LGsubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBrKGEsbnVsbCxudWxsLGIpfSxrLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBrKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LGsuZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoIWEpcmV0dXJuW107Zm9yKHZhciBlPTAsZj1sLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZyxoPWwub3JkZXJbZV07aWYoZz1sLmxlZnRNYXRjaFtoXS5leGVjKGEpKXt2YXIgaj1nWzFdO2cuc3BsaWNlKDEsMSk7aWYoai5zdWJzdHIoai5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShpLCIiKSxkPWwuZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2UobC5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT0idW5kZWZpbmVkIj9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6W10pO3JldHVybntzZXQ6ZCxleHByOmF9fSxrLmZpbHRlcj1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZixnLGg9YSxpPVtdLGo9YyxtPWMmJmNbMF0mJmsuaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2Zvcih2YXIgbiBpbiBsLmZpbHRlcilpZigoZj1sLmxlZnRNYXRjaFtuXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7dmFyIG8scCxxPWwuZmlsdGVyW25dLHI9ZlsxXTtnPSExLGYuc3BsaWNlKDEsMSk7aWYoci5zdWJzdHIoci5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO2o9PT1pJiYoaT1bXSk7aWYobC5wcmVGaWx0ZXJbbl0pe2Y9bC5wcmVGaWx0ZXJbbl0oZixqLGQsaSxlLG0pO2lmKGYpe2lmKGY9PT0hMCljb250aW51ZX1lbHNlIGc9bz0hMH1pZihmKWZvcih2YXIgcz0wOyhwPWpbc10pIT1udWxsO3MrKylpZihwKXtvPXEocCxmLHMsaik7dmFyIHQ9ZV4hIW87ZCYmbyE9bnVsbD90P2c9ITA6altzXT0hMTp0JiYoaS5wdXNoKHApLGc9ITApfWlmKG8hPT1iKXtkfHwoaj1pKSxhPWEucmVwbGFjZShsLm1hdGNoW25dLCIiKTtpZighZylyZXR1cm5bXTticmVha319aWYoYT09PWgpaWYoZz09bnVsbClrLmVycm9yKGEpO2Vsc2UgYnJlYWs7aD1hfXJldHVybiBqfSxrLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYX07dmFyIGw9ay5zZWxlY3RvcnM9e29yZGVyOlsiSUQiLCJOQU1FIiwiVEFHIl0sbWF0Y2g6e0lEOi8jKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxDTEFTUzovXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLE5BTUU6L1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKD86KFsnIl0pKC4qPylcM3woIz8oPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikqKXwpfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XChccyooZXZlbnxvZGR8KD86WytcLV0/XGQrfCg/OlsrXC1dP1xkKik/blxzKig/OlsrXC1dXHMqXGQrKT8pKVxzKlwpKT8vLFBPUzovOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteXC1dfCQpLyxQU0VVRE86LzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy99LGxlZnRNYXRjaDp7fSxhdHRyTWFwOnsiY2xhc3MiOiJjbGFzc05hbWUiLCJmb3IiOiJodG1sRm9yIn0sYXR0ckhhbmRsZTp7aHJlZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LHJlbGF0aXZlOnsiKyI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYj09PSJzdHJpbmciLGQ9YyYmIWoudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKXt9YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJmsuZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PT0ic3RyaW5nIixlPTAsZj1hLmxlbmd0aDtpZihkJiYhai50ZXN0KGIpKXtiPWIudG9Mb3dlckNhc2UoKTtmb3IoO2U8ZjtlKyspe2M9YVtlXTtpZihjKXt2YXIgZz1jLnBhcmVudE5vZGU7YVtlXT1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2c6ITF9fX1lbHNle2Zvcig7ZTxmO2UrKyljPWFbZV0sYyYmKGFbZV09ZD9jLnBhcmVudE5vZGU6Yy5wYXJlbnROb2RlPT09Yik7ZCYmay5maWx0ZXIoYixhLCEwKX19LCIiOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPWUrKyxnPXU7dHlwZW9mIGI9PT0ic3RyaW5nIiYmIWoudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXQpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz11O3R5cGVvZiBiPT09InN0cmluZyImJiFqLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz10KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPT0idW5kZWZpbmVkIiYmIWMpe3ZhciBkPWIuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGQmJmQucGFyZW50Tm9kZT9bZF06W119fSxOQU1FOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeU5hbWUhPT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShpLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaSwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaSwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxrLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmay5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaSwiIik7IWYmJmwuYXR0ck1hcFtnXSYmKGFbMV09bC5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShpLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPWsoYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1rLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKGwubWF0Y2guUE9TLnRlc3QoYlswXSl8fGwubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFrKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4idGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuInJhZGlvIj09PWEudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oYSl7cmV0dXJuImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4iZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiJwYXNzd29yZCI9PT1hLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihhKXtyZXR1cm4ic3VibWl0Ij09PWEudHlwZX0saW1hZ2U6ZnVuY3Rpb24oYSl7cmV0dXJuImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3JldHVybiJidXR0b24iPT09YS50eXBlfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9bC5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxrLmdldFRleHQoW2FdKXx8IiIpLmluZGV4T2YoYlszXSk+PTA7aWYoZT09PSJub3QiKXt2YXIgZz1iWzNdO2Zvcih2YXIgaD0wLGk9Zy5sZW5ndGg7aDxpO2grKylpZihnW2hdPT09YSlyZXR1cm4hMTtyZXR1cm4hMH1rLmVycm9yKGUpfSxDSElMRDpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1hO3N3aXRjaChjKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGQ9ZC5wcmV2aW91c1NpYmxpbmcpaWYoZC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoYz09PSJmaXJzdCIpcmV0dXJuITA7ZD1hO2Nhc2UibGFzdCI6d2hpbGUoZD1kLm5leHRTaWJsaW5nKWlmKGQubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjp2YXIgZT1iWzJdLGY9YlszXTtpZihlPT09MSYmZj09PTApcmV0dXJuITA7dmFyIGc9YlswXSxoPWEucGFyZW50Tm9kZTtpZihoJiYoaC5zaXpjYWNoZSE9PWd8fCFhLm5vZGVJbmRleCkpe3ZhciBpPTA7Zm9yKGQ9aC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKWQubm9kZVR5cGU9PT0xJiYoZC5ub2RlSW5kZXg9KytpKTtoLnNpemNhY2hlPWd9dmFyIGo9YS5ub2RlSW5kZXgtZjtyZXR1cm4gZT09PTA/aj09PTA6aiVlPT09MCYmai9lPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifSxDTEFTUzpmdW5jdGlvbihhLGIpe3JldHVybigiICIrKGEuY2xhc3NOYW1lfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkrIiAiKS5pbmRleE9mKGIpPi0xfSxBVFRSOmZ1bmN0aW9uKGEsYil7dmFyIGM9YlsxXSxkPWwuYXR0ckhhbmRsZVtjXT9sLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9bC5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0sbT1sLm1hdGNoLlBPUyxuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIG8gaW4gbC5tYXRjaClsLm1hdGNoW29dPW5ldyBSZWdFeHAobC5tYXRjaFtvXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxsLmxlZnRNYXRjaFtvXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2UrbC5tYXRjaFtvXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLG4pKTt2YXIgcD1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2gocSl7cD1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihmLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIGU9YS5sZW5ndGg7YzxlO2MrKylkLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWQucHVzaChhW2NdKTtyZXR1cm4gZH19dmFyIHIscztjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9yPWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2c9ITA7cmV0dXJuIDB9aWYoIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjE7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmND8tMToxfToocj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1bXSxmPVtdLGg9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9aDtpZihhPT09Yil7Zz0hMDtyZXR1cm4gMH1pZihoPT09aSlyZXR1cm4gcyhhLGIpO2lmKCFoKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiBzKGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3MoYSxmW2tdLC0xKTpzKGVba10sYiwxKX0scz1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxrLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IodmFyIGQ9MDthW2RdO2QrKyljPWFbZF0sYy5ub2RlVHlwZT09PTN8fGMubm9kZVR5cGU9PT00P2IrPWMubm9kZVZhbHVlOmMubm9kZVR5cGUhPT04JiYoYis9ay5nZXRUZXh0KGMuY2hpbGROb2RlcykpO3JldHVybiBifSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihsLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBlP2UuaWQ9PT1hWzFdfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWU9PT1hWzFdP1tlXTpiOltdfX0sbC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYobC5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyImJihsLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSksYT1udWxsfSgpLGMucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1rLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJfX3NpenpsZV9fIjtiLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fGIucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGghPT0wKXtrPWZ1bmN0aW9uKGIsZSxmLGcpe2U9ZXx8YztpZighZyYmIWsuaXNYTUwoZSkpe3ZhciBoPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGgmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTkpKXtpZihoWzFdKXJldHVybiBwKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksZik7aWYoaFsyXSYmbC5maW5kLkNMQVNTJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHAoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMl0pLGYpfWlmKGUubm9kZVR5cGU9PT05KXtpZihiPT09ImJvZHkiJiZlLmJvZHkpcmV0dXJuIHAoW2UuYm9keV0sZik7aWYoaCYmaFszXSl7dmFyIGk9ZS5nZXRFbGVtZW50QnlJZChoWzNdKTtpZighaXx8IWkucGFyZW50Tm9kZSlyZXR1cm4gcChbXSxmKTtpZihpLmlkPT09aFszXSlyZXR1cm4gcChbaV0sZil9dHJ5e3JldHVybiBwKGUucXVlcnlTZWxlY3RvckFsbChiKSxmKX1jYXRjaChqKXt9fWVsc2UgaWYoZS5ub2RlVHlwZT09PTEmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXt2YXIgbT1lLG49ZS5nZXRBdHRyaWJ1dGUoImlkIiksbz1ufHxkLHE9ZS5wYXJlbnROb2RlLHI9L15ccypbK35dLy50ZXN0KGIpO24/bz1vLnJlcGxhY2UoLycvZywiXFwkJiIpOmUuc2V0QXR0cmlidXRlKCJpZCIsbyksciYmcSYmKGU9ZS5wYXJlbnROb2RlKTt0cnl7aWYoIXJ8fHEpcmV0dXJuIHAoZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWQ9JyIrbysiJ10gIitiKSxmKX1jYXRjaChzKXt9ZmluYWxseXtufHxtLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBhKGIsZSxmLGcpfTtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07Yj1udWxsfX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgZD0hYi5jYWxsKGMuY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGU9ITE7dHJ5e2IuY2FsbChjLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhPScnXTpzaXp6bGUiKX1jYXRjaChmKXtlPSEwfWsubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYyl7Yz1jLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFrLmlzWE1MKGEpKXRyeXtpZihlfHwhbC5tYXRjaC5QU0VVRE8udGVzdChjKSYmIS8hPS8udGVzdChjKSl7dmFyIGY9Yi5jYWxsKGEsYyk7aWYoZnx8IWR8fGEuZG9jdW1lbnQmJmEuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gZn19Y2F0Y2goZyl7fXJldHVybiBrKGMsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9fX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZihhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCE9PTApe2EubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MSlyZXR1cm47bC5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpLGwuZmluZC5DTEFTUz1mdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP2suY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9rLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9OmsuY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0say5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB2PWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPSIiLGY9Yi5ub2RlVHlwZT9bYl06Yjt3aGlsZShjPWwubWF0Y2guUFNFVURPLmV4ZWMoYSkpZSs9Y1swXSxhPWEucmVwbGFjZShsLm1hdGNoLlBTRVVETywiIik7YT1sLnJlbGF0aXZlW2FdP2ErIioiOmE7Zm9yKHZhciBnPTAsaD1mLmxlbmd0aDtnPGg7ZysrKWsoYSxmW2ddLGQpO3JldHVybiBrLmZpbHRlcihlLGQpfTtkLmZpbmQ9ayxkLmV4cHI9ay5zZWxlY3RvcnMsZC5leHByWyI6Il09ZC5leHByLmZpbHRlcnMsZC51bmlxdWU9ay51bmlxdWVTb3J0LGQudGV4dD1rLmdldFRleHQsZC5pc1hNTERvYz1rLmlzWE1MLGQuY29udGFpbnM9ay5jb250YWluc30oKTt2YXIgST0vVW50aWwkLyxKPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLEs9LywvLEw9L14uW146I1xbXC4sXSokLyxNPUFycmF5LnByb3RvdHlwZS5zbGljZSxOPWQuZXhwci5tYXRjaC5QT1MsTz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtkLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksYz0wO2Zvcih2YXIgZT0wLGY9dGhpcy5sZW5ndGg7ZTxmO2UrKyl7Yz1iLmxlbmd0aCxkLmZpbmQoYSx0aGlzW2VdLGIpO2lmKGU+MClmb3IodmFyIGc9YztnPGIubGVuZ3RoO2crKylmb3IodmFyIGg9MDtoPGM7aCsrKWlmKGJbaF09PT1iW2ddKXtiLnNwbGljZShnLS0sMSk7YnJlYWt9fXJldHVybiBifSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZChhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPWIubGVuZ3RoO2E8YzthKyspaWYoZC5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUSh0aGlzLGEsITEpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFEodGhpcyxhLCEwKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiZkLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZSxmLGc9dGhpc1swXTtpZihkLmlzQXJyYXkoYSkpe3ZhciBoLGksaj17fSxrPTE7aWYoZyYmYS5sZW5ndGgpe2ZvcihlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKWk9YVtlXSxqW2ldfHwoaltpXT1kLmV4cHIubWF0Y2guUE9TLnRlc3QoaSk/ZChpLGJ8fHRoaXMuY29udGV4dCk6aSk7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGkgaW4gailoPWpbaV0sKGguanF1ZXJ5P2guaW5kZXgoZyk+LTE6ZChnKS5pcyhoKSkmJmMucHVzaCh7c2VsZWN0b3I6aSxlbGVtOmcsbGV2ZWw6a30pO2c9Zy5wYXJlbnROb2RlLGsrK319cmV0dXJuIGN9dmFyIGw9Ti50ZXN0KGEpP2QoYSxifHx0aGlzLmNvbnRleHQpOm51bGw7Zm9yKGU9MCxmPXRoaXMubGVuZ3RoO2U8ZjtlKyspe2c9dGhpc1tlXTt3aGlsZShnKXtpZihsP2wuaW5kZXgoZyk+LTE6ZC5maW5kLm1hdGNoZXNTZWxlY3RvcihnLGEpKXtjLnB1c2goZyk7YnJlYWt9Zz1nLnBhcmVudE5vZGU7aWYoIWd8fCFnLm93bmVyRG9jdW1lbnR8fGc9PT1iKWJyZWFrfX1jPWMubGVuZ3RoPjE/ZC51bmlxdWUoYyk6YztyZXR1cm4gdGhpcy5wdXNoU3RhY2soYywiY2xvc2VzdCIsYSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PSJzdHJpbmciKXJldHVybiBkLmluQXJyYXkodGhpc1swXSxhP2QoYSk6dGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpKTtyZXR1cm4gZC5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PT0ic3RyaW5nIj9kKGEsYik6ZC5tYWtlQXJyYXkoYSksZT1kLm1lcmdlKHRoaXMuZ2V0KCksYyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAoY1swXSl8fFAoZVswXSk/ZTpkLnVuaXF1ZShlKSl9LGFuZFNlbGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5wcmV2T2JqZWN0KX19KSxkLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJmIubm9kZVR5cGUhPT0xMT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGQuZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZC5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGQubnRoKGEsMiwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gZC5udGgoYSwyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gZC5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gZC5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGQuZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZC5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGQuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGQuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZC5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OmQubWFrZUFycmF5KGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe2QuZm5bYV09ZnVuY3Rpb24oYyxlKXt2YXIgZj1kLm1hcCh0aGlzLGIsYyksZz1NLmNhbGwoYXJndW1lbnRzKTtJLnRlc3QoYSl8fChlPWMpLGUmJnR5cGVvZiBlPT09InN0cmluZyImJihmPWQuZmlsdGVyKGUsZikpLGY9dGhpcy5sZW5ndGg+MSYmIU9bYV0/ZC51bmlxdWUoZik6ZiwodGhpcy5sZW5ndGg+MXx8Sy50ZXN0KGUpKSYmSi50ZXN0KGEpJiYoZj1mLnJldmVyc2UoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYsYSxnLmpvaW4oIiwiKSl9fSksZC5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsYyl7YyYmKGE9Ijpub3QoIithKyIpIik7cmV0dXJuIGIubGVuZ3RoPT09MT9kLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmQuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGMsZSl7dmFyIGY9W10sZz1hW2NdO3doaWxlKGcmJmcubm9kZVR5cGUhPT05JiYoZT09PWJ8fGcubm9kZVR5cGUhPT0xfHwhZChnKS5pcyhlKSkpZy5ub2RlVHlwZT09PTEmJmYucHVzaChnKSxnPWdbY107cmV0dXJuIGZ9LG50aDpmdW5jdGlvbihhLGIsYyxkKXtiPWJ8fDE7dmFyIGU9MDtmb3IoO2E7YT1hW2NdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2U9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7dmFyIGM9W107Zm9yKDthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KTt2YXIgUj0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLFM9L15ccysvLFQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZyxVPS88KFtcdzpdKykvLFY9Lzx0Ym9keS9pLFc9Lzx8JiM/XHcrOy8sWD0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLFk9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksWj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtaLm9wdGdyb3VwPVoub3B0aW9uLFoudGJvZHk9Wi50Zm9vdD1aLmNvbGdyb3VwPVouY2FwdGlvbj1aLnRoZWFkLFoudGg9Wi50ZCxkLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KFouX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGQuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGQuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWQodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT09Im9iamVjdCImJmEhPT1iKXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gZC50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGQuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2QodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1kKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiZhLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoZC5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7ZCh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWQodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2QodGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7ZC5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGQodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9ZChhcmd1bWVudHNbMF0pO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGQoYXJndW1lbnRzWzBdKS50b0FycmF5KCkpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZTsoZT10aGlzW2NdKSE9bnVsbDtjKyspaWYoIWF8fGQuZmlsdGVyKGEsW2VdKS5sZW5ndGgpIWImJmUubm9kZVR5cGU9PT0xJiYoZC5jbGVhbkRhdGEoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSxkLmNsZWFuRGF0YShbZV0pKSxlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmQuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBkLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKFIsIiIpOm51bGw7aWYodHlwZW9mIGEhPT0ic3RyaW5nInx8WC50ZXN0KGEpfHwhZC5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZTLnRlc3QoYSl8fFpbKFUuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pZC5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1kKHRoaXMpO2MuaHRtbChhLmNhbGwodGhpcyxiLGMuaHRtbCgpKSl9KTp0aGlzLmVtcHR5KCkuYXBwZW5kKGEpO2Vsc2V7YT1hLnJlcGxhY2UoVCwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYz0wLGU9dGhpcy5sZW5ndGg7YzxlO2MrKyl0aGlzW2NdLm5vZGVUeXBlPT09MSYmKGQuY2xlYW5EYXRhKHRoaXNbY10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tjXS5pbm5lckhUTUw9YSl9Y2F0Y2goZil7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZC5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9ZCh0aGlzKSxlPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixlKSl9KTt0eXBlb2YgYSE9PSJzdHJpbmciJiYoYT1kKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxjPXRoaXMucGFyZW50Tm9kZTtkKHRoaXMpLnJlbW92ZSgpLGI/ZChiKS5iZWZvcmUoYSk6ZChjKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2soZChkLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSk6dGhpc30sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxjLGUpe3ZhciBmLGcsaCxpLGo9YVswXSxrPVtdO2lmKCFkLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBqPT09InN0cmluZyImJlkudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZCh0aGlzKS5kb21NYW5pcChhLGMsZSwhMCl9KTtpZihkLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihmKXt2YXIgZz1kKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZixjP2cuaHRtbCgpOmIpLGcuZG9tTWFuaXAoYSxjLGUpfSk7aWYodGhpc1swXSl7aT1qJiZqLnBhcmVudE5vZGUsZC5zdXBwb3J0LnBhcmVudE5vZGUmJmkmJmkubm9kZVR5cGU9PT0xMSYmaS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP2Y9e2ZyYWdtZW50Oml9OmY9ZC5idWlsZEZyYWdtZW50KGEsdGhpcyxrKSxoPWYuZnJhZ21lbnQsaC5jaGlsZE5vZGVzLmxlbmd0aD09PTE/Zz1oPWguZmlyc3RDaGlsZDpnPWguZmlyc3RDaGlsZDtpZihnKXtjPWMmJmQubm9kZU5hbWUoZywidHIiKTtmb3IodmFyIGw9MCxtPXRoaXMubGVuZ3RoLG49bS0xO2w8bTtsKyspZS5jYWxsKGM/JCh0aGlzW2xdLGcpOnRoaXNbbF0sZi5jYWNoZWFibGV8fG0+MSYmbDxuP2QuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmQuZWFjaChrLGJjKX1yZXR1cm4gdGhpc319KSxkLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGUpe3ZhciBmLGcsaCxpPWImJmJbMF0/YlswXS5vd25lckRvY3VtZW50fHxiWzBdOmM7YS5sZW5ndGg9PT0xJiZ0eXBlb2YgYVswXT09PSJzdHJpbmciJiZhWzBdLmxlbmd0aDw1MTImJmk9PT1jJiZhWzBdLmNoYXJBdCgwKT09PSI8IiYmIVgudGVzdChhWzBdKSYmKGQuc3VwcG9ydC5jaGVja0Nsb25lfHwhWS50ZXN0KGFbMF0pKSYmKGc9ITAsaD1kLmZyYWdtZW50c1thWzBdXSxoJiYoaCE9PTEmJihmPWgpKSksZnx8KGY9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZC5jbGVhbihhLGksZixlKSksZyYmKGQuZnJhZ21lbnRzW2FbMF1dPWg/ZjoxKTtyZXR1cm57ZnJhZ21lbnQ6ZixjYWNoZWFibGU6Z319LGQuZnJhZ21lbnRzPXt9LGQuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7ZC5mblthXT1mdW5jdGlvbihjKXt2YXIgZT1bXSxmPWQoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZmLmxlbmd0aD09PTEpe2ZbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1mLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2QoZltoXSlbYl0oaiksZT1lLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZSxhLGYuc2VsZWN0b3IpfX0pLGQuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5jbG9uZU5vZGUoITApLGYsZyxoO2lmKCghZC5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IWQuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihhLm5vZGVUeXBlPT09MXx8YS5ub2RlVHlwZT09PTExKSYmIWQuaXNYTUxEb2MoYSkpe2JhKGEsZSksZj1iYihhKSxnPWJiKGUpO2ZvcihoPTA7ZltoXTsrK2gpYmEoZltoXSxnW2hdKX1pZihiKXtfKGEsZSk7aWYoYyl7Zj1iYihhKSxnPWJiKGUpO2ZvcihoPTA7ZltoXTsrK2gpXyhmW2hdLGdbaF0pfX1yZXR1cm4gZX0sY2xlYW46ZnVuY3Rpb24oYSxiLGUsZil7Yj1ifHxjLHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBnPVtdO2Zvcih2YXIgaD0wLGk7KGk9YVtoXSkhPW51bGw7aCsrKXt0eXBlb2YgaT09PSJudW1iZXIiJiYoaSs9IiIpO2lmKCFpKWNvbnRpbnVlO2lmKHR5cGVvZiBpIT09InN0cmluZyJ8fFcudGVzdChpKSl7aWYodHlwZW9mIGk9PT0ic3RyaW5nIil7aT1pLnJlcGxhY2UoVCwiPCQxPjwvJDI+Iik7dmFyIGo9KFUuZXhlYyhpKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxrPVpbal18fFouX2RlZmF1bHQsbD1rWzBdLG09Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTttLmlubmVySFRNTD1rWzFdK2kra1syXTt3aGlsZShsLS0pbT1tLmxhc3RDaGlsZDtpZighZC5zdXBwb3J0LnRib2R5KXt2YXIgbj1WLnRlc3QoaSksbz1qPT09InRhYmxlIiYmIW4/bS5maXJzdENoaWxkJiZtLmZpcnN0Q2hpbGQuY2hpbGROb2RlczprWzFdPT09Ijx0YWJsZT4iJiYhbj9tLmNoaWxkTm9kZXM6W107Zm9yKHZhciBwPW8ubGVuZ3RoLTE7cD49MDstLXApZC5ub2RlTmFtZShvW3BdLCJ0Ym9keSIpJiYhb1twXS5jaGlsZE5vZGVzLmxlbmd0aCYmb1twXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9bcF0pfSFkLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJlMudGVzdChpKSYmbS5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZShTLmV4ZWMoaSlbMF0pLG0uZmlyc3RDaGlsZCksaT1tLmNoaWxkTm9kZXN9fWVsc2UgaT1iLmNyZWF0ZVRleHROb2RlKGkpO2kubm9kZVR5cGU/Zy5wdXNoKGkpOmc9ZC5tZXJnZShnLGkpfWlmKGUpZm9yKGg9MDtnW2hdO2grKykhZnx8IWQubm9kZU5hbWUoZ1toXSwic2NyaXB0Iil8fGdbaF0udHlwZSYmZ1toXS50eXBlLnRvTG93ZXJDYXNlKCkhPT0idGV4dC9qYXZhc2NyaXB0Ij8oZ1toXS5ub2RlVHlwZT09PTEmJmcuc3BsaWNlLmFwcGx5KGcsW2grMSwwXS5jb25jYXQoZC5tYWtlQXJyYXkoZ1toXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSksZS5hcHBlbmRDaGlsZChnW2hdKSk6Zi5wdXNoKGdbaF0ucGFyZW50Tm9kZT9nW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZ1toXSk6Z1toXSk7cmV0dXJuIGd9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXt2YXIgYixjLGU9ZC5jYWNoZSxmPWQuZXhwYW5kbyxnPWQuZXZlbnQuc3BlY2lhbCxoPWQuc3VwcG9ydC5kZWxldGVFeHBhbmRvO2Zvcih2YXIgaT0wLGo7KGo9YVtpXSkhPW51bGw7aSsrKXtpZihqLm5vZGVOYW1lJiZkLm5vRGF0YVtqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKWNvbnRpbnVlO2M9altkLmV4cGFuZG9dO2lmKGMpe2I9ZVtjXSYmZVtjXVtmXTtpZihiJiZiLmV2ZW50cyl7Zm9yKHZhciBrIGluIGIuZXZlbnRzKWdba10/ZC5ldmVudC5yZW1vdmUoaixrKTpkLnJlbW92ZUV2ZW50KGosayxiLmhhbmRsZSk7Yi5oYW5kbGUmJihiLmhhbmRsZS5lbGVtPW51bGwpfWg/ZGVsZXRlIGpbZC5leHBhbmRvXTpqLnJlbW92ZUF0dHJpYnV0ZSYmai5yZW1vdmVBdHRyaWJ1dGUoZC5leHBhbmRvKSxkZWxldGUgZVtjXX19fX0pO3ZhciBiZD0vYWxwaGFcKFteKV0qXCkvaSxiZT0vb3BhY2l0eT0oW14pXSopLyxiZj0vLShbYS16XSkvaWcsYmc9LyhbQS1aXXxebXMpL2csYmg9L14tP1xkKyg/OnB4KT8kL2ksYmk9L14tP1xkLyxiaj17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sYms9WyJMZWZ0IiwiUmlnaHQiXSxibD1bIlRvcCIsIkJvdHRvbSJdLGJtLGJuLGJvLGJwPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07ZC5mbi5jc3M9ZnVuY3Rpb24oYSxjKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MiYmYz09PWIpcmV0dXJuIHRoaXM7cmV0dXJuIGQuYWNjZXNzKHRoaXMsYSxjLCEwLGZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gZSE9PWI/ZC5zdHlsZShhLGMsZSk6ZC5jc3MoYSxjKX0pfSxkLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWJtKGEsIm9wYWNpdHkiLCJvcGFjaXR5Iik7cmV0dXJuIGM9PT0iIj8iMSI6Y31yZXR1cm4gYS5zdHlsZS5vcGFjaXR5fX19LGNzc051bWJlcjp7ekluZGV4OiEwLGZvbnRXZWlnaHQ6ITAsb3BhY2l0eTohMCx6b29tOiEwLGxpbmVIZWlnaHQ6ITB9LGNzc1Byb3BzOnsiZmxvYXQiOmQuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxjLGUsZil7aWYoYSYmYS5ub2RlVHlwZSE9PTMmJmEubm9kZVR5cGUhPT04JiZhLnN0eWxlKXt2YXIgZyxoPWQuY2FtZWxDYXNlKGMpLGk9YS5zdHlsZSxqPWQuY3NzSG9va3NbaF07Yz1kLmNzc1Byb3BzW2hdfHxoO2lmKGU9PT1iKXtpZihqJiYiZ2V0ImluIGomJihnPWouZ2V0KGEsITEsZikpIT09YilyZXR1cm4gZztyZXR1cm4gaVtjXX1pZih0eXBlb2YgZT09PSJudW1iZXIiJiZpc05hTihlKXx8ZT09bnVsbClyZXR1cm47dHlwZW9mIGU9PT0ibnVtYmVyIiYmIWQuY3NzTnVtYmVyW2hdJiYoZSs9InB4Iik7aWYoIWp8fCEoInNldCJpbiBqKXx8KGU9ai5zZXQoYSxlKSkhPT1iKXRyeXtpW2NdPWV9Y2F0Y2goayl7fX19LGNzczpmdW5jdGlvbihhLGMsZSl7dmFyIGYsZz1kLmNhbWVsQ2FzZShjKSxoPWQuY3NzSG9va3NbZ107Yz1kLmNzc1Byb3BzW2ddfHxnO2lmKGgmJiJnZXQiaW4gaCYmKGY9aC5nZXQoYSwhMCxlKSkhPT1iKXJldHVybiBmO2lmKGJtKXJldHVybiBibShhLGMsZyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShiZixicCl9fSksZC5jdXJDU1M9ZC5jc3MsZC5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe2QuY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZSl7dmFyIGY7aWYoYyl7YS5vZmZzZXRXaWR0aCE9PTA/Zj1icShhLGIsZSk6ZC5zd2FwKGEsYmosZnVuY3Rpb24oKXtmPWJxKGEsYixlKX0pO2lmKGY8PTApe2Y9Ym0oYSxiLGIpLGY9PT0iMHB4IiYmYm8mJihmPWJvKGEsYixiKSk7aWYoZiE9bnVsbClyZXR1cm4gZj09PSIifHxmPT09ImF1dG8iPyIwcHgiOmZ9aWYoZjwwfHxmPT1udWxsKXtmPWEuc3R5bGVbYl07cmV0dXJuIGY9PT0iInx8Zj09PSJhdXRvIj8iMHB4IjpmfXJldHVybiB0eXBlb2YgZj09PSJzdHJpbmciP2Y6ZisicHgifX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJoLnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZC5zdXBwb3J0Lm9wYWNpdHl8fChkLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBiZS50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZTtjLnpvb209MTt2YXIgZT1kLmlzTmFOKGIpPyIiOiJhbHBoYShvcGFjaXR5PSIrYioxMDArIikiLGY9Yy5maWx0ZXJ8fCIiO2MuZmlsdGVyPWJkLnRlc3QoZik/Zi5yZXBsYWNlKGJkLGUpOmMuZmlsdGVyKyIgIitlfX0pLGQoZnVuY3Rpb24oKXtkLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGQuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Quc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1ibShhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYm49ZnVuY3Rpb24oYSxjLGUpe3ZhciBmLGcsaDtlPWUucmVwbGFjZShiZywiLSQxIikudG9Mb3dlckNhc2UoKTtpZighKGc9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSlyZXR1cm4gYjtpZihoPWcuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKWY9aC5nZXRQcm9wZXJ0eVZhbHVlKGUpLGY9PT0iIiYmIWQuY29udGFpbnMoYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSYmKGY9ZC5zdHlsZShhLGUpKTtyZXR1cm4gZn0pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJvPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1hLmN1cnJlbnRTdHlsZSYmYS5jdXJyZW50U3R5bGVbYl0sZT1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGVbYl0sZj1hLnN0eWxlOyFiaC50ZXN0KGQpJiZiaS50ZXN0KGQpJiYoYz1mLmxlZnQsZSYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZi5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmR8fDAsZD1mLnBpeGVsTGVmdCsicHgiLGYubGVmdD1jLGUmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWUpKTtyZXR1cm4gZD09PSIiPyJhdXRvIjpkfSksYm09Ym58fGJvLGQuZXhwciYmZC5leHByLmZpbHRlcnMmJihkLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFkLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZS5kaXNwbGF5fHxkLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxkLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFkLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KTt2YXIgYnI9LyUyMC9nLGJzPS9cW1xdJC8sYnQ9L1xyP1xuL2csYnU9LyMuKiQvLGJ2PS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYnc9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJ4PS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8d2lkZ2V0KTokLyxieT0vXig/OkdFVHxIRUFEKSQvLGJ6PS9eXC9cLy8sYkE9L1w/LyxiQj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiQz0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiRD0vXHMrLyxiRT0vKFs/Jl0pXz1bXiZdKi8sYkY9LyhefFwtKShbYS16XSkvZyxiRz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGIrYy50b1VwcGVyQ2FzZSgpfSxiSD0vXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspKT8pPy8sYkk9ZC5mbi5sb2FkLGJKPXt9LGJLPXt9LGJMLGJNO3RyeXtiTD1jLmxvY2F0aW9uLmhyZWZ9Y2F0Y2goYk4pe2JMPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJMLmhyZWY9IiIsYkw9YkwuaHJlZn1iTT1iSC5leGVjKGJMLnRvTG93ZXJDYXNlKCkpfHxbXSxkLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZSl7aWYodHlwZW9mIGEhPT0ic3RyaW5nIiYmYkkpcmV0dXJuIGJJLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGY9YS5pbmRleE9mKCIgIik7aWYoZj49MCl7dmFyIGc9YS5zbGljZShmLGEubGVuZ3RoKTthPWEuc2xpY2UoMCxmKX12YXIgaD0iR0VUIjtjJiYoZC5pc0Z1bmN0aW9uKGMpPyhlPWMsYz1iKTp0eXBlb2YgYz09PSJvYmplY3QiJiYoYz1kLnBhcmFtKGMsZC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztkLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2QoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiQiwiIikpLmZpbmQoZyk6YykpLGUmJmkuZWFjaChlLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2QubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8YkMudGVzdCh0aGlzLm5vZGVOYW1lKXx8YncudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWQodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpkLmlzQXJyYXkoYyk/ZC5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYnQsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJ0LCJcclxuIil9fSkuZ2V0KCl9fSksZC5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2QuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYmluZChiLGEpfX0pLGQuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGMpe2RbY109ZnVuY3Rpb24oYSxlLGYsZyl7ZC5pc0Z1bmN0aW9uKGUpJiYoZz1nfHxmLGY9ZSxlPWIpO3JldHVybiBkLmFqYXgoe3R5cGU6Yyx1cmw6YSxkYXRhOmUsc3VjY2VzczpmLGRhdGFUeXBlOmd9KX19KSxkLmV4dGVuZCh7Z2V0U2NyaXB0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGQuZ2V0KGEsYixjLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGQuZ2V0KGEsYixjLCJqc29uIil9LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe2I/ZC5leHRlbmQoITAsYSxkLmFqYXhTZXR0aW5ncyxiKTooYj1hLGE9ZC5leHRlbmQoITAsZC5hamF4U2V0dGluZ3MsYikpO2Zvcih2YXIgYyBpbiB7Y29udGV4dDoxLHVybDoxfSljIGluIGI/YVtjXT1iW2NdOmMgaW4gZC5hamF4U2V0dGluZ3MmJihhW2NdPWQuYWpheFNldHRpbmdzW2NdKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YkwsaXNMb2NhbDpieC50ZXN0KGJNWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6IiovKiJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpkLnBhcnNlSlNPTiwidGV4dCB4bWwiOmQucGFyc2VYTUx9fSxhamF4UHJlZmlsdGVyOmJPKGJKKSxhamF4VHJhbnNwb3J0OmJPKGJLKSxhamF4OmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gdihhLGMsbCxuKXtpZihyIT09Mil7cj0yLHAmJmNsZWFyVGltZW91dChwKSxvPWIsbT1ufHwiIix1LnJlYWR5U3RhdGU9YT80OjA7dmFyIHEsdCx2LHc9bD9iUihlLHUsbCk6Yix4LHk7aWYoYT49MjAwJiZhPDMwMHx8YT09PTMwNCl7aWYoZS5pZk1vZGlmaWVkKXtpZih4PXUuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSlkLmxhc3RNb2RpZmllZFtrXT14O2lmKHk9dS5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpKWQuZXRhZ1trXT15fWlmKGE9PT0zMDQpYz0ibm90bW9kaWZpZWQiLHE9ITA7ZWxzZSB0cnl7dD1iUyhlLHcpLGM9InN1Y2Nlc3MiLHE9ITB9Y2F0Y2goeil7Yz0icGFyc2VyZXJyb3IiLHY9en19ZWxzZXt2PWM7aWYoIWN8fGEpYz0iZXJyb3IiLGE8MCYmKGE9MCl9dS5zdGF0dXM9YSx1LnN0YXR1c1RleHQ9YyxxP2gucmVzb2x2ZVdpdGgoZixbdCxjLHVdKTpoLnJlamVjdFdpdGgoZixbdSxjLHZdKSx1LnN0YXR1c0NvZGUoaiksaj1iLHMmJmcudHJpZ2dlcigiYWpheCIrKHE/IlN1Y2Nlc3MiOiJFcnJvciIpLFt1LGUscT90OnZdKSxpLnJlc29sdmVXaXRoKGYsW3UsY10pLHMmJihnLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3UsZV0pLC0tZC5hY3RpdmV8fGQuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9fXR5cGVvZiBhPT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBlPWQuYWpheFNldHVwKHt9LGMpLGY9ZS5jb250ZXh0fHxlLGc9ZiE9PWUmJihmLm5vZGVUeXBlfHxmIGluc3RhbmNlb2YgZCk/ZChmKTpkLmV2ZW50LGg9ZC5EZWZlcnJlZCgpLGk9ZC5fRGVmZXJyZWQoKSxqPWUuc3RhdHVzQ29kZXx8e30sayxsPXt9LG0sbixvLHAscSxyPTAscyx0LHU9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7cnx8KGxbYS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoYkYsYkcpXT1iKTtyZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHI9PT0yP206bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGM7aWYocj09PTIpe2lmKCFuKXtuPXt9O3doaWxlKGM9YnYuZXhlYyhtKSluW2NbMV0udG9Mb3dlckNhc2UoKV09Y1syXX1jPW5bYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gYz09PWI/bnVsbDpjfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3J8fChlLm1pbWVUeXBlPWEpO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXthPWF8fCJhYm9ydCIsbyYmby5hYm9ydChhKSx2KDAsYSk7cmV0dXJuIHRoaXN9fTtoLnByb21pc2UodSksdS5zdWNjZXNzPXUuZG9uZSx1LmVycm9yPXUuZmFpbCx1LmNvbXBsZXRlPWkuZG9uZSx1LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYocjwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt1LnN0YXR1c10sdS50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGUudXJsPSgoYXx8ZS51cmwpKyIiKS5yZXBsYWNlKGJ1LCIiKS5yZXBsYWNlKGJ6LGJNWzFdKyIvLyIpLGUuZGF0YVR5cGVzPWQudHJpbShlLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYkQpLGUuY3Jvc3NEb21haW49PW51bGwmJihxPWJILmV4ZWMoZS51cmwudG9Mb3dlckNhc2UoKSksZS5jcm9zc0RvbWFpbj1xJiYocVsxXSE9Yk1bMV18fHFbMl0hPWJNWzJdfHwocVszXXx8KHFbMV09PT0iaHR0cDoiPzgwOjQ0MykpIT0oYk1bM118fChiTVsxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxlLmRhdGEmJmUucHJvY2Vzc0RhdGEmJnR5cGVvZiBlLmRhdGEhPT0ic3RyaW5nIiYmKGUuZGF0YT1kLnBhcmFtKGUuZGF0YSxlLnRyYWRpdGlvbmFsKSksYlAoYkosZSxjLHUpO2lmKHI9PT0yKXJldHVybiExO3M9ZS5nbG9iYWwsZS50eXBlPWUudHlwZS50b1VwcGVyQ2FzZSgpLGUuaGFzQ29udGVudD0hYnkudGVzdChlLnR5cGUpLHMmJmQuYWN0aXZlKys9PT0wJiZkLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFlLmhhc0NvbnRlbnQpe2UuZGF0YSYmKGUudXJsKz0oYkEudGVzdChlLnVybCk/IiYiOiI/IikrZS5kYXRhKSxrPWUudXJsO2lmKGUuY2FjaGU9PT0hMSl7dmFyIHc9ZC5ub3coKSx4PWUudXJsLnJlcGxhY2UoYkUsIiQxXz0iK3cpO2UudXJsPXgrKHg9PT1lLnVybD8oYkEudGVzdChlLnVybCk/IiYiOiI/IikrIl89Iit3OiIiKX19aWYoZS5kYXRhJiZlLmhhc0NvbnRlbnQmJmUuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSlsWyJDb250ZW50LVR5cGUiXT1lLmNvbnRlbnRUeXBlO2UuaWZNb2RpZmllZCYmKGs9a3x8ZS51cmwsZC5sYXN0TW9kaWZpZWRba10mJihsWyJJZi1Nb2RpZmllZC1TaW5jZSJdPWQubGFzdE1vZGlmaWVkW2tdKSxkLmV0YWdba10mJihsWyJJZi1Ob25lLU1hdGNoIl09ZC5ldGFnW2tdKSksbC5BY2NlcHQ9ZS5kYXRhVHlwZXNbMF0mJmUuYWNjZXB0c1tlLmRhdGFUeXBlc1swXV0/ZS5hY2NlcHRzW2UuZGF0YVR5cGVzWzBdXSsoZS5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgKi8qOyBxPTAuMDEiOiIiKTplLmFjY2VwdHNbIioiXTtmb3IodCBpbiBlLmhlYWRlcnMpdS5zZXRSZXF1ZXN0SGVhZGVyKHQsZS5oZWFkZXJzW3RdKTtpZihlLmJlZm9yZVNlbmQmJihlLmJlZm9yZVNlbmQuY2FsbChmLHUsZSk9PT0hMXx8cj09PTIpKXt1LmFib3J0KCk7cmV0dXJuITF9Zm9yKHQgaW4ge3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXVbdF0oZVt0XSk7bz1iUChiSyxlLGMsdSk7aWYobyl7dS5yZWFkeVN0YXRlPTEscyYmZy50cmlnZ2VyKCJhamF4U2VuZCIsW3UsZV0pLGUuYXN5bmMmJmUudGltZW91dD4wJiYocD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dS5hYm9ydCgidGltZW91dCIpfSxlLnRpbWVvdXQpKTt0cnl7cj0xLG8uc2VuZChsLHYpfWNhdGNoKHkpe3N0YXR1czwyP3YoLTEseSk6ZC5lcnJvcih5KX19ZWxzZSB2KC0xLCJObyBUcmFuc3BvcnQiKTtyZXR1cm4gdX0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZT1bXSxmPWZ1bmN0aW9uKGEsYil7Yj1kLmlzRnVuY3Rpb24oYik/YigpOmIsZVtlLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1kLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZC5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWQuaXNQbGFpbk9iamVjdChhKSlkLmVhY2goYSxmdW5jdGlvbigpe2YodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSliUShnLGFbZ10sYyxmKTtyZXR1cm4gZS5qb2luKCImIikucmVwbGFjZShiciwiKyIpfX0pLGQuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBiVD1kLm5vdygpLGJVPS8oXD0pXD8oJnwkKXxcP1w/L2k7ZC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBkLmV4cGFuZG8rIl8iK2JUKyt9fSksZC5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZSl7dmFyIGY9dHlwZW9mIGIuZGF0YT09PSJzdHJpbmciO2lmKGIuZGF0YVR5cGVzWzBdPT09Impzb25wInx8Yy5qc29ucENhbGxiYWNrfHxjLmpzb25wIT1udWxsfHxiLmpzb25wIT09ITEmJihiVS50ZXN0KGIudXJsKXx8ZiYmYlUudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9ZC5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiIsbT1mdW5jdGlvbigpe2FbaF09aSxnJiZkLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9O2IuanNvbnAhPT0hMSYmKGo9ai5yZXBsYWNlKGJVLGwpLGIudXJsPT09aiYmKGYmJihrPWsucmVwbGFjZShiVSxsKSksYi5kYXRhPT09ayYmKGorPSgvXD8vLnRlc3Qoaik/IiYiOiI/IikrYi5qc29ucCsiPSIraCkpKSxiLnVybD1qLGIuZGF0YT1rLGFbaF09ZnVuY3Rpb24oYSl7Zz1bYV19LGUudGhlbihtLG0pLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe2d8fGQuZXJyb3IoaCsiIHdhcyBub3QgY2FsbGVkIik7cmV0dXJuIGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIjtyZXR1cm4ic2NyaXB0In19KSxkLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L2phdmFzY3JpcHR8ZWNtYXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7ZC5nbG9iYWxFdmFsKGEpO3JldHVybiBhfX19KSxkLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7YS5jYWNoZT09PWImJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLGQuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgZCxlPWMuaGVhZHx8Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxjLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihmLGcpe2Q9Yy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLmFzeW5jPSJhc3luYyIsYS5zY3JpcHRDaGFyc2V0JiYoZC5jaGFyc2V0PWEuc2NyaXB0Q2hhcnNldCksZC5zcmM9YS51cmwsZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oYSxjKXtpZighZC5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGQucmVhZHlTdGF0ZSkpZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxlJiZkLnBhcmVudE5vZGUmJmUucmVtb3ZlQ2hpbGQoZCksZD1iLGN8fGcoMjAwLCJzdWNjZXNzIil9LGUuaW5zZXJ0QmVmb3JlKGQsZS5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkLm9ubG9hZCgwLDEpfX19fSk7dmFyIGJWPWQubm93KCksYlcsYlg7ZC5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmJaKCl8fGIkKCl9OmJaLGJYPWQuYWpheFNldHRpbmdzLnhocigpLGQuc3VwcG9ydC5hamF4PSEhYlgsZC5zdXBwb3J0LmNvcnM9YlgmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYlgsYlg9YixkLnN1cHBvcnQuYWpheCYmZC5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxkLnN1cHBvcnQuY29ycyl7dmFyIGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXt2YXIgZz1hLnhocigpLGgsaTthLnVzZXJuYW1lP2cub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpOmcub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyk7aWYoYS54aHJGaWVsZHMpZm9yKGkgaW4gYS54aHJGaWVsZHMpZ1tpXT1hLnhockZpZWxkc1tpXTthLm1pbWVUeXBlJiZnLm92ZXJyaWRlTWltZVR5cGUmJmcub3ZlcnJpZGVNaW1lVHlwZShhLm1pbWVUeXBlKSwhYS5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGkgaW4gZSlnLnNldFJlcXVlc3RIZWFkZXIoaSxlW2ldKX1jYXRjaChqKXt9Zy5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKSxjPWZ1bmN0aW9uKGUsaSl7dmFyIGosayxsLG0sbjt0cnl7aWYoYyYmKGl8fGcucmVhZHlTdGF0ZT09PTQpKXtjPWIsaCYmKGcub25yZWFkeXN0YXRlY2hhbmdlPWQubm9vcCxkZWxldGUgYldbaF0pO2lmKGkpZy5yZWFkeVN0YXRlIT09NCYmZy5hYm9ydCgpO2Vsc2V7aj1nLnN0YXR1cyxsPWcuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksbT17fSxuPWcucmVzcG9uc2VYTUwsbiYmbi5kb2N1bWVudEVsZW1lbnQmJihtLnhtbD1uKSxtLnRleHQ9Zy5yZXNwb25zZVRleHQ7dHJ5e2s9Zy5zdGF0dXNUZXh0fWNhdGNoKG8pe2s9IiJ9anx8IWEuaXNMb2NhbHx8YS5jcm9zc0RvbWFpbj9qPT09MTIyMyYmKGo9MjA0KTpqPW0udGV4dD8yMDA6NDA0fX19Y2F0Y2gocCl7aXx8ZigtMSxwKX1tJiZmKGosayxtLGwpfSxhLmFzeW5jJiZnLnJlYWR5U3RhdGUhPT00PyhiV3x8KGJXPXt9LGJZKCkpLGg9YlYrKyxnLm9ucmVhZHlzdGF0ZWNoYW5nZT1iV1toXT1jKTpjKCl9LGFib3J0OmZ1bmN0aW9uKCl7YyYmYygwLDEpfX19fSk7dmFyIGJfPXt9LGNhPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxjYj0vXihbK1wtXT0pPyhbXGQrLlwtXSspKFthLXolXSopJC9pLGNjLGNkPVtbImhlaWdodCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sWyJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0sWyJvcGFjaXR5Il1dO2QuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKGEsYixjKXt2YXIgZSxmO2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoY2UoInNob3ciLDMpLGEsYixjKTtmb3IodmFyIGc9MCxoPXRoaXMubGVuZ3RoO2c8aDtnKyspZT10aGlzW2ddLGY9ZS5zdHlsZS5kaXNwbGF5LCFkLl9kYXRhKGUsIm9sZGRpc3BsYXkiKSYmZj09PSJub25lIiYmKGY9ZS5zdHlsZS5kaXNwbGF5PSIiKSxmPT09IiImJmQuY3NzKGUsImRpc3BsYXkiKT09PSJub25lIiYmZC5fZGF0YShlLCJvbGRkaXNwbGF5IixjZihlLm5vZGVOYW1lKSk7Zm9yKGc9MDtnPGg7ZysrKXtlPXRoaXNbZ10sZj1lLnN0eWxlLmRpc3BsYXk7aWYoZj09PSIifHxmPT09Im5vbmUiKWUuc3R5bGUuZGlzcGxheT1kLl9kYXRhKGUsIm9sZGRpc3BsYXkiKXx8IiJ9cmV0dXJuIHRoaXN9LGhpZGU6ZnVuY3Rpb24oYSxiLGMpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoY2UoImhpZGUiLDMpLGEsYixjKTtmb3IodmFyIGU9MCxmPXRoaXMubGVuZ3RoO2U8ZjtlKyspe3ZhciBnPWQuY3NzKHRoaXNbZV0sImRpc3BsYXkiKTtnIT09Im5vbmUiJiYhZC5fZGF0YSh0aGlzW2VdLCJvbGRkaXNwbGF5IikmJmQuX2RhdGEodGhpc1tlXSwib2xkZGlzcGxheSIsZyl9Zm9yKGU9MDtlPGY7ZSsrKXRoaXNbZV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIHRoaXN9LF90b2dnbGU6ZC5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT10eXBlb2YgYT09PSJib29sZWFuIjtkLmlzRnVuY3Rpb24oYSkmJmQuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZT9hOmQodGhpcykuaXMoIjpoaWRkZW4iKTtkKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjZSgidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxlKXt2YXIgZj1kLnNwZWVkKGIsYyxlKTtpZihkLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChmLmNvbXBsZXRlKTtyZXR1cm4gdGhpc1tmLnF1ZXVlPT09ITE/ImVhY2giOiJxdWV1ZSJdKGZ1bmN0aW9uKCl7dmFyIGI9ZC5leHRlbmQoe30sZiksYyxlPXRoaXMubm9kZVR5cGU9PT0xLGc9ZSYmZCh0aGlzKS5pcygiOmhpZGRlbiIpLGg9dGhpcztmb3IoYyBpbiBhKXt2YXIgaT1kLmNhbWVsQ2FzZShjKTtjIT09aSYmKGFbaV09YVtjXSxkZWxldGUgYVtjXSxjPWkpO2lmKGFbY109PT0iaGlkZSImJmd8fGFbY109PT0ic2hvdyImJiFnKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7aWYoZSYmKGM9PT0iaGVpZ2h0Inx8Yz09PSJ3aWR0aCIpKXtiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXTtpZihkLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZC5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIilpZihkLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCl7dmFyIGo9Y2YodGhpcy5ub2RlTmFtZSk7aj09PSJpbmxpbmUiP3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjoodGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHRoaXMuc3R5bGUuem9vbT0xKX1lbHNlIHRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn1kLmlzQXJyYXkoYVtjXSkmJigoYi5zcGVjaWFsRWFzaW5nPWIuc3BlY2lhbEVhc2luZ3x8e30pW2NdPWFbY11bMV0sYVtjXT1hW2NdWzBdKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIiksYi5jdXJBbmltPWQuZXh0ZW5kKHt9LGEpLGQuZWFjaChhLGZ1bmN0aW9uKGMsZSl7dmFyIGY9bmV3IGQuZngoaCxiLGMpO2lmKGNhLnRlc3QoZSkpZltlPT09InRvZ2dsZSI/Zz8ic2hvdyI6ImhpZGUiOmVdKGEpO2Vsc2V7dmFyIGk9Y2IuZXhlYyhlKSxqPWYuY3VyKCk7aWYoaSl7dmFyIGs9cGFyc2VGbG9hdChpWzJdKSxsPWlbM118fChkLmNzc051bWJlcltjXT8iIjoicHgiKTtsIT09InB4IiYmKGQuc3R5bGUoaCxjLChrfHwxKStsKSxqPShrfHwxKS9mLmN1cigpKmosZC5zdHlsZShoLGMsaitsKSksaVsxXSYmKGs9KGlbMV09PT0iLT0iPy0xOjEpKmsraiksZi5jdXN0b20oaixrLGwpfWVsc2UgZi5jdXN0b20oaixlLCIiKX19KTtyZXR1cm4hMH0pfSxzdG9wOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZC50aW1lcnM7YSYmdGhpcy5xdWV1ZShbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPWMubGVuZ3RoLTE7YT49MDthLS0pY1thXS5lbGVtPT09dGhpcyYmKGImJmNbYV0oITApLGMuc3BsaWNlKGEsMSkpfSksYnx8dGhpcy5kZXF1ZXVlKCk7cmV0dXJuIHRoaXN9fSksZC5lYWNoKHtzbGlkZURvd246Y2UoInNob3ciLDEpLHNsaWRlVXA6Y2UoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmNlKCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtkLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGQuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YSYmdHlwZW9mIGE9PT0ib2JqZWN0Ij9kLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fGQuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhZC5pc0Z1bmN0aW9uKGIpJiZifTtlLmR1cmF0aW9uPWQuZngub2ZmPzA6dHlwZW9mIGUuZHVyYXRpb249PT0ibnVtYmVyIj9lLmR1cmF0aW9uOmUuZHVyYXRpb24gaW4gZC5meC5zcGVlZHM/ZC5meC5zcGVlZHNbZS5kdXJhdGlvbl06ZC5meC5zcGVlZHMuX2RlZmF1bHQsZS5vbGQ9ZS5jb21wbGV0ZSxlLmNvbXBsZXRlPWZ1bmN0aW9uKCl7ZS5xdWV1ZSE9PSExJiZkKHRoaXMpLmRlcXVldWUoKSxkLmlzRnVuY3Rpb24oZS5vbGQpJiZlLm9sZC5jYWxsKHRoaXMpfTtyZXR1cm4gZX0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMrZCphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZCtjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWd8fChiLm9yaWc9e30pfX0pLGQuZngucHJvdG90eXBlPXt1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksKGQuZnguc3RlcFt0aGlzLnByb3BdfHxkLmZ4LnN0ZXAuX2RlZmF1bHQpKHRoaXMpfSxjdXI6ZnVuY3Rpb24oKXtpZih0aGlzLmVsZW1bdGhpcy5wcm9wXSE9bnVsbCYmKCF0aGlzLmVsZW0uc3R5bGV8fHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdPT1udWxsKSlyZXR1cm4gdGhpcy5lbGVtW3RoaXMucHJvcF07dmFyIGEsYj1kLmNzcyh0aGlzLmVsZW0sdGhpcy5wcm9wKTtyZXR1cm4gaXNOYU4oYT1wYXJzZUZsb2F0KGIpKT8hYnx8Yj09PSJhdXRvIj8wOmI6YX0sY3VzdG9tOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEpe3JldHVybiBlLnN0ZXAoYSl9dmFyIGU9dGhpcyxmPWQuZng7dGhpcy5zdGFydFRpbWU9ZC5ub3coKSx0aGlzLnN0YXJ0PWEsdGhpcy5lbmQ9Yix0aGlzLnVuaXQ9Y3x8dGhpcy51bml0fHwoZC5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSx0aGlzLm5vdz10aGlzLnN0YXJ0LHRoaXMucG9zPXRoaXMuc3RhdGU9MCxnLmVsZW09dGhpcy5lbGVtLGcoKSYmZC50aW1lcnMucHVzaChnKSYmIWNjJiYoY2M9c2V0SW50ZXJ2YWwoZi50aWNrLGYuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09ZC5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCx0aGlzLmN1c3RvbSh0aGlzLnByb3A9PT0id2lkdGgifHx0aGlzLnByb3A9PT0iaGVpZ2h0Ij8xOjAsdGhpcy5jdXIoKSksZCh0aGlzLmVsZW0pLnNob3coKX0saGlkZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09ZC5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuaGlkZT0hMCx0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPWQubm93KCksYz0hMDtpZihhfHxiPj10aGlzLm9wdGlvbnMuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLHRoaXMub3B0aW9ucy5jdXJBbmltW3RoaXMucHJvcF09ITA7Zm9yKHZhciBlIGluIHRoaXMub3B0aW9ucy5jdXJBbmltKXRoaXMub3B0aW9ucy5jdXJBbmltW2VdIT09ITAmJihjPSExKTtpZihjKXtpZih0aGlzLm9wdGlvbnMub3ZlcmZsb3chPW51bGwmJiFkLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrcyl7dmFyIGY9dGhpcy5lbGVtLGc9dGhpcy5vcHRpb25zO2QuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtmLnN0eWxlWyJvdmVyZmxvdyIrYl09Zy5vdmVyZmxvd1thXX0pfXRoaXMub3B0aW9ucy5oaWRlJiZkKHRoaXMuZWxlbSkuaGlkZSgpO2lmKHRoaXMub3B0aW9ucy5oaWRlfHx0aGlzLm9wdGlvbnMuc2hvdylmb3IodmFyIGggaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0pZC5zdHlsZSh0aGlzLmVsZW0saCx0aGlzLm9wdGlvbnMub3JpZ1toXSk7dGhpcy5vcHRpb25zLmNvbXBsZXRlLmNhbGwodGhpcy5lbGVtKX1yZXR1cm4hMX12YXIgaT1iLXRoaXMuc3RhcnRUaW1lO3RoaXMuc3RhdGU9aS90aGlzLm9wdGlvbnMuZHVyYXRpb247dmFyIGo9dGhpcy5vcHRpb25zLnNwZWNpYWxFYXNpbmcmJnRoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nW3RoaXMucHJvcF0saz10aGlzLm9wdGlvbnMuZWFzaW5nfHwoZC5lYXNpbmcuc3dpbmc/InN3aW5nIjoibGluZWFyIik7dGhpcy5wb3M9ZC5lYXNpbmdbanx8a10odGhpcy5zdGF0ZSxpLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zLHRoaXMudXBkYXRlKCk7cmV0dXJuITB9fSxkLmV4dGVuZChkLmZ4LHt0aWNrOmZ1bmN0aW9uKCl7dmFyIGE9ZC50aW1lcnM7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSgpfHxhLnNwbGljZShiLS0sMSk7YS5sZW5ndGh8fGQuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjYyksY2M9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7ZC5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT0oYS5wcm9wPT09IndpZHRoInx8YS5wcm9wPT09ImhlaWdodCI/TWF0aC5tYXgoMCxhLm5vdyk6YS5ub3cpK2EudW5pdDphLmVsZW1bYS5wcm9wXT1hLm5vd319fSksZC5leHByJiZkLmV4cHIuZmlsdGVycyYmKGQuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBkLmdyZXAoZC50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9KTt2YXIgY2c9L150KD86YWJsZXxkfGgpJC9pLGNoPS9eKD86Ym9keXxodG1sKSQvaTsiZ2V0Qm91bmRpbmdDbGllbnRSZWN0ImluIGMuZG9jdW1lbnRFbGVtZW50P2QuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF0sYztpZihhKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7ZC5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxiKX0pO2lmKCFifHwhYi5vd25lckRvY3VtZW50KXJldHVybiBudWxsO2lmKGI9PT1iLm93bmVyRG9jdW1lbnQuYm9keSlyZXR1cm4gZC5vZmZzZXQuYm9keU9mZnNldChiKTt0cnl7Yz1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWNhdGNoKGUpe312YXIgZj1iLm93bmVyRG9jdW1lbnQsZz1mLmRvY3VtZW50RWxlbWVudDtpZighY3x8IWQuY29udGFpbnMoZyxiKSlyZXR1cm4gYz97dG9wOmMudG9wLGxlZnQ6Yy5sZWZ0fTp7dG9wOjAsbGVmdDowfTt2YXIgaD1mLmJvZHksaT1jaShmKSxqPWcuY2xpZW50VG9wfHxoLmNsaWVudFRvcHx8MCxrPWcuY2xpZW50TGVmdHx8aC5jbGllbnRMZWZ0fHwwLGw9aS5wYWdlWU9mZnNldHx8ZC5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbFRvcHx8aC5zY3JvbGxUb3AsbT1pLnBhZ2VYT2Zmc2V0fHxkLnN1cHBvcnQuYm94TW9kZWwmJmcuc2Nyb2xsTGVmdHx8aC5zY3JvbGxMZWZ0LG49Yy50b3ArbC1qLG89Yy5sZWZ0K20taztyZXR1cm57dG9wOm4sbGVmdDpvfX06ZC5mbi5vZmZzZXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXTtpZihhKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7ZC5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxiKX0pO2lmKCFifHwhYi5vd25lckRvY3VtZW50KXJldHVybiBudWxsO2lmKGI9PT1iLm93bmVyRG9jdW1lbnQuYm9keSlyZXR1cm4gZC5vZmZzZXQuYm9keU9mZnNldChiKTtkLm9mZnNldC5pbml0aWFsaXplKCk7dmFyIGMsZT1iLm9mZnNldFBhcmVudCxmPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihkLm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24mJmsucG9zaXRpb249PT0iZml4ZWQiKWJyZWFrO2M9aj9qLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZSxsLT1iLnNjcm9sbFRvcCxtLT1iLnNjcm9sbExlZnQsYj09PWUmJihsKz1iLm9mZnNldFRvcCxtKz1iLm9mZnNldExlZnQsZC5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciYmKCFkLm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxsc3x8IWNnLnRlc3QoYi5ub2RlTmFtZSkpJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksZj1lLGU9Yi5vZmZzZXRQYXJlbnQpLGQub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmYy5vdmVyZmxvdyE9PSJ2aXNpYmxlIiYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGs9Y31pZihrLnBvc2l0aW9uPT09InJlbGF0aXZlInx8ay5wb3NpdGlvbj09PSJzdGF0aWMiKWwrPWkub2Zmc2V0VG9wLG0rPWkub2Zmc2V0TGVmdDtkLm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24mJmsucG9zaXRpb249PT0iZml4ZWQiJiYobCs9TWF0aC5tYXgoaC5zY3JvbGxUb3AsaS5zY3JvbGxUb3ApLG0rPU1hdGgubWF4KGguc2Nyb2xsTGVmdCxpLnNjcm9sbExlZnQpKTtyZXR1cm57dG9wOmwsbGVmdDptfX0sZC5vZmZzZXQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT1jLmJvZHksYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUsZixnLGgsaT1wYXJzZUZsb2F0KGQuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxqPSI8ZGl2IHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsnPjxkaXY+PC9kaXY+PC9kaXY+PHRhYmxlIHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+PHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4iO2QuZXh0ZW5kKGIuc3R5bGUse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLGJvcmRlcjowLHdpZHRoOiIxcHgiLGhlaWdodDoiMXB4Iix2aXNpYmlsaXR5OiJoaWRkZW4ifSksYi5pbm5lckhUTUw9aixhLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCksZT1iLmZpcnN0Q2hpbGQsZj1lLmZpcnN0Q2hpbGQsaD1lLm5leHRTaWJsaW5nLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCx0aGlzLmRvZXNOb3RBZGRCb3JkZXI9Zi5vZmZzZXRUb3AhPT01LHRoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM9aC5vZmZzZXRUb3A9PT01LGYuc3R5bGUucG9zaXRpb249ImZpeGVkIixmLnN0eWxlLnRvcD0iMjBweCIsdGhpcy5zdXBwb3J0c0ZpeGVkUG9zaXRpb249Zi5vZmZzZXRUb3A9PT0yMHx8Zi5vZmZzZXRUb3A9PT0xNSxmLnN0eWxlLnBvc2l0aW9uPWYuc3R5bGUudG9wPSIiLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWYub2Zmc2V0VG9wPT09LTUsdGhpcy5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1hLm9mZnNldFRvcCE9PWksYS5yZW1vdmVDaGlsZChiKSxkLm9mZnNldC5pbml0aWFsaXplPWQubm9vcH0sYm9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxjPWEub2Zmc2V0TGVmdDtkLm9mZnNldC5pbml0aWFsaXplKCksZC5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGQuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjKz1wYXJzZUZsb2F0KGQuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmN9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPWQuY3NzKGEsInBvc2l0aW9uIik7ZT09PSJzdGF0aWMiJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZj1kKGEpLGc9Zi5vZmZzZXQoKSxoPWQuY3NzKGEsInRvcCIpLGk9ZC5jc3MoYSwibGVmdCIpLGo9KGU9PT0iYWJzb2x1dGUifHxlPT09ImZpeGVkIikmJmQuaW5BcnJheSgiYXV0byIsW2gsaV0pPi0xLGs9e30sbD17fSxtLG47aiYmKGw9Zi5wb3NpdGlvbigpKSxtPWo/bC50b3A6cGFyc2VJbnQoaCwxMCl8fDAsbj1qP2wubGVmdDpwYXJzZUludChpLDEwKXx8MCxkLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsZykpLGIudG9wIT1udWxsJiYoay50b3A9Yi50b3AtZy50b3ArbSksYi5sZWZ0IT1udWxsJiYoay5sZWZ0PWIubGVmdC1nLmxlZnQrbiksInVzaW5nImluIGI/Yi51c2luZy5jYWxsKGEsayk6Zi5jc3Moayl9fSxkLmZuLmV4dGVuZCh7cG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpc1swXSlyZXR1cm4gbnVsbDt2YXIgYT10aGlzWzBdLGI9dGhpcy5vZmZzZXRQYXJlbnQoKSxjPXRoaXMub2Zmc2V0KCksZT1jaC50ZXN0KGJbMF0ubm9kZU5hbWUpP3t0b3A6MCxsZWZ0OjB9OmIub2Zmc2V0KCk7Yy50b3AtPXBhcnNlRmxvYXQoZC5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMubGVmdC09cGFyc2VGbG9hdChkLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwLGUudG9wKz1wYXJzZUZsb2F0KGQuY3NzKGJbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLGUubGVmdCs9cGFyc2VGbG9hdChkLmNzcyhiWzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDA7cmV0dXJue3RvcDpjLnRvcC1lLnRvcCxsZWZ0OmMubGVmdC1lLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8Yy5ib2R5O3doaWxlKGEmJighY2gudGVzdChhLm5vZGVOYW1lKSYmZC5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSksZC5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYyl7dmFyIGU9InNjcm9sbCIrYztkLmZuW2VdPWZ1bmN0aW9uKGMpe3ZhciBmPXRoaXNbMF0sZztpZighZilyZXR1cm4gbnVsbDtpZihjIT09YilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zz1jaSh0aGlzKSxnP2cuc2Nyb2xsVG8oYT9kKGcpLnNjcm9sbExlZnQoKTpjLGE/YzpkKGcpLnNjcm9sbFRvcCgpKTp0aGlzW2VdPWN9KTtnPWNpKGYpO3JldHVybiBnPyJwYWdlWE9mZnNldCJpbiBnP2dbYT8icGFnZVlPZmZzZXQiOiJwYWdlWE9mZnNldCJdOmQuc3VwcG9ydC5ib3hNb2RlbCYmZy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV18fGcuZG9jdW1lbnQuYm9keVtlXTpmW2VdfX0pLGQuZWFjaChbIkhlaWdodCIsIldpZHRoIl0sZnVuY3Rpb24oYSxjKXt2YXIgZT1jLnRvTG93ZXJDYXNlKCk7ZC5mblsiaW5uZXIiK2NdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbMF0/cGFyc2VGbG9hdChkLmNzcyh0aGlzWzBdLGUsInBhZGRpbmciKSk6bnVsbH0sZC5mblsib3V0ZXIiK2NdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzWzBdP3BhcnNlRmxvYXQoZC5jc3ModGhpc1swXSxlLGE/Im1hcmdpbiI6ImJvcmRlciIpKTpudWxsfSxkLmZuW2VdPWZ1bmN0aW9uKGEpe3ZhciBmPXRoaXNbMF07aWYoIWYpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGQuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWQodGhpcyk7Y1tlXShhLmNhbGwodGhpcyxiLGNbZV0oKSkpfSk7aWYoZC5pc1dpbmRvdyhmKSl7dmFyIGc9Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY107cmV0dXJuIGYuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8Zi5kb2N1bWVudC5ib2R5WyJjbGllbnQiK2NdfHxnfWlmKGYubm9kZVR5cGU9PT05KXJldHVybiBNYXRoLm1heChmLmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitjXSxmLmJvZHlbInNjcm9sbCIrY10sZi5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIrY10sZi5ib2R5WyJvZmZzZXQiK2NdLGYuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK2NdKTtpZihhPT09Yil7dmFyIGg9ZC5jc3MoZixlKSxpPXBhcnNlRmxvYXQoaCk7cmV0dXJuIGQuaXNOYU4oaSk/aDppfXJldHVybiB0aGlzLmNzcyhlLHR5cGVvZiBhPT09InN0cmluZyI/YTphKyJweCIpfX0pLGEualF1ZXJ5PWEuJD1kfSkod2luZG93KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi93ZWIvX3NlYXNvY2tzLmNzcyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL3dlYi9fc2Vhc29ja3MuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYTcyODcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi93ZWIvX3NlYXNvY2tzLmNzcwpAQCAtMCwwICsxLDIyIEBACitib2R5IHsKKyAgICBmb250LWZhbWlseTogc2Vnb2UgdWksIHRhaG9tYSwgYXJpYWwsIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOiAxMnB4OworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7CisgICAgbWFyZ2luOiAwOworfQorCithIHsKKyAgICBjb2xvcjogI2ZmZmYwMDsKK30KKwordGFibGUgeworICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgICAgd2lkdGg6IDEwMCU7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisudGVtcGxhdGUgeworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL3dlYi9fc3RhdHMuaHRtbCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL3dlYi9fc3RhdHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRlOTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL21haW4vd2ViL19zdGF0cy5odG1sCkBAIC0wLDAgKzEsNjAgQEAKKzxodG1sIERPQ1RZUEU9aHRtbD4KKzxoZWFkPgorICA8dGl0bGU+U2VhU29ja3MgU3RhdHM8L3RpdGxlPgorICA8bGluayBocmVmPSIvX3NlYXNvY2tzLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgPHNjcmlwdCBzcmM9Ii9fanF1ZXJ5Lm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdD4KKyAgZnVuY3Rpb24gY2xlYXIoKSB7CisgICAgJCgnI2N4IHRib2R5IHRyOnZpc2libGUnKS5yZW1vdmUoKTsKKyAgfQorICBmdW5jdGlvbiBjb25uZWN0aW9uKHN0YXRzKSB7CisgIAljID0gJCgnI2N4IC50ZW1wbGF0ZScpLmNsb25lKCkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJykuYXBwZW5kVG8oJyNjeCcpOworICAJZm9yIChzdGF0IGluIHN0YXRzKSB7CisgIAkgIGMuZmluZCgnLicgKyBzdGF0KS50ZXh0KHN0YXRzW3N0YXRdKTsKKyAgICB9CisgIH0KKyAgZnVuY3Rpb24gcmVmcmVzaCgpIHsKKyAgCQl2YXIgc3RhdHMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKwkJc3RhdHMub3BlbigiR0VUIiwgIi9fbGl2ZXN0YXRzLmpzIiwgZmFsc2UpOworCQlzdGF0cy5zZW5kKG51bGwpOworCQlldmFsKHN0YXRzLnJlc3BvbnNlVGV4dCk7CisgIH0KKyAgJChmdW5jdGlvbigpIHsKKyAgCXNldEludGVydmFsKHJlZnJlc2gsIDEwMDApOworICAJcmVmcmVzaCgpOwkJCisgIH0pOworICA8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PjxoMT5TZWFTb2NrcyBTdGF0czwvaDE+PC9ib2R5PgorCis8aDI+Q29ubmVjdGlvbnM8L2gyPgorPHRhYmxlIGlkPSJjeCI+CisgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGg+Q29ubmVjdGlvbiB0aW1lPC90aD4KKyAgICAgIDx0aD5GZDwvdGg+CisgICAgICA8dGg+QWRkcjwvdGg+CisgICAgICA8dGg+VVJJPC90aD4KKyAgICAgIDx0aD5Vc2VybmFtZTwvdGg+CisgICAgICA8dGg+UGVuZGluZyByZWFkPC90aD4KKyAgICAgIDx0aD5CeXRlcyByZWFkPC90aD4KKyAgICAgIDx0aD5QZW5kaW5nIHNlbmQ8L3RoPgorICAgICAgPHRoPkJ5dGVzIHNlbnQ8L3RoPgorICAgIDwvdHI+CisgIDwvdGhlYWQ+CisgIDx0Ym9keT4KKyAgICA8dHIgY2xhc3M9InRlbXBsYXRlIj4KKyAgICAgIDx0ZCBjbGFzcz0ic2luY2UiPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImZkIj48L3RkPgorICAgICAgPHRkIGNsYXNzPSJhZGRyIj48L3RkPgorICAgICAgPHRkIGNsYXNzPSJ1cmkiPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9InVzZXIiPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImlucHV0Ij48L3RkPgorICAgICAgPHRkIGNsYXNzPSJyZWFkIj48L3RkPgorICAgICAgPHRkIGNsYXNzPSJvdXRwdXQiPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9IndyaXR0ZW4iPjwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi93ZWIvZmF2aWNvbi5pY28gYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvbWFpbi93ZWIvZmF2aWNvbi5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhOTViOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy9tYWluL3dlYi9mYXZpY29uLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL0Nvbm5lY3Rpb25UZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL0Nvbm5lY3Rpb25UZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3MzY4MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy90ZXN0L2MvQ29ubmVjdGlvblRlc3RzLmNwcApAQCAtMCwwICsxLDg5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisvLyBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIAorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIAorLy8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAorLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKy8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICJNb2NrU2VydmVySW1wbC5oIgorI2luY2x1ZGUgInNlYXNvY2tzL0Nvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9JZ25vcmluZ0xvZ2dlci5oIgorCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2Ugc2Vhc29ja3M7CisKK2NsYXNzIFRlc3RIYW5kbGVyOiBwdWJsaWMgV2ViU29ja2V0OjpIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICBpbnQgX3N0YWdlOworICAgIFRlc3RIYW5kbGVyKCkgOgorICAgICAgICBfc3RhZ2UoMCkgeworICAgIH0KKyAgICB+VGVzdEhhbmRsZXIoKSB7CisgICAgICAgIGlmIChfc3RhZ2UgIT0gMikgeworICAgICAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiSW52YWxpZCBzdGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlydHVhbCB2b2lkIG9uQ29ubmVjdChXZWJTb2NrZXQqKSB7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBvbkRhdGEoV2ViU29ja2V0KiwgY29uc3QgY2hhciogZGF0YSkgeworICAgICAgICBpZiAoX3N0YWdlID09IDApIHsKKyAgICAgICAgICAgIEFTU0VSVF9TVFJFUShkYXRhLCAiYSIpOworICAgICAgICB9IGVsc2UgaWYgKF9zdGFnZSA9PSAxKSB7CisgICAgICAgICAgICBBU1NFUlRfU1RSRVEoZGF0YSwgImIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAidW5leHBlY3RlZCBzdGF0ZSI7CisgICAgICAgIH0KKyAgICAgICAgKytfc3RhZ2U7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBvbkRpc2Nvbm5lY3QoV2ViU29ja2V0KikgeworICAgIH0KK307CisKK1RFU1QoQ29ubmVjdGlvblRlc3RzLCBzaG91bGRCcmVha0hpeGllTWVzc2FnZXNBcGFydEluU2FtZUJ1ZmZlcikgeworICAgIHNvY2thZGRyX2luIGFkZHIgPSB7IEFGX0lORVQsIDB4MTIzNCwgeyAweDAxMDIwMzA0IH0gfTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TG9nZ2VyPiBsb2dnZXIobmV3IElnbm9yaW5nTG9nZ2VyKTsKKyAgICB0ZXN0aW5nOjpOaWNlTW9jazxNb2NrU2VydmVySW1wbD4gbW9ja1NlcnZlcjsKKyAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24obG9nZ2VyLCBtb2NrU2VydmVyLCAtMSwgYWRkcik7CisgICAgY29ubmVjdGlvbi5zZXRIYW5kbGVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFdlYlNvY2tldDo6SGFuZGxlcj4obmV3IFRlc3RIYW5kbGVyKSk7CisgICAgdWludDhfdCBmb29bXSA9IHsgMHgwMCwgJ2EnLCAweGZmLCAweDAwLCAnYicsIDB4ZmYgfTsKKyAgICBjb25uZWN0aW9uLmdldElucHV0QnVmZmVyKCkuYXNzaWduKCZmb29bMF0sICZmb29bc2l6ZW9mKGZvbyldKTsKKyAgICBjb25uZWN0aW9uLmhhbmRsZUhpeGllV2ViU29ja2V0KCk7CisgICAgU1VDQ0VFRCgpOworfQorCitURVNUKENvbm5lY3Rpb25UZXN0cywgc2hvdWxkQWNjZXB0TXVsdGlwbGVDb25uZWN0aW9uVHlwZXMpIHsKKyAgICBzb2NrYWRkcl9pbiBhZGRyID0geyBBRl9JTkVULCAweDEyMzQsIHsgMHgwMTAyMDMwNCB9IH07CisgICAgc3RkOjpzaGFyZWRfcHRyPExvZ2dlcj4gbG9nZ2VyKG5ldyBJZ25vcmluZ0xvZ2dlcik7CisgICAgdGVzdGluZzo6TmljZU1vY2s8TW9ja1NlcnZlckltcGw+IG1vY2tTZXJ2ZXI7CisgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uKGxvZ2dlciwgbW9ja1NlcnZlciwgLTEsIGFkZHIpOworICAgIGNvbnN0IHVpbnQ4X3QgbWVzc2FnZVtdID0gIkdFVCAvd3MtdGVzdCBIVFRQLzEuMVxyXG5Db25uZWN0aW9uOiBrZWVwLWFsaXZlLCBVcGdyYWRlXHJcblVwZ3JhZGU6IHdlYnNvY2tldFxyXG5cclxuIjsKKyAgICBjb25uZWN0aW9uLmdldElucHV0QnVmZmVyKCkuYXNzaWduKCZtZXNzYWdlWzBdLCAmbWVzc2FnZVtzaXplb2YobWVzc2FnZSldKTsKKyAgICBFWFBFQ1RfQ0FMTChtb2NrU2VydmVyLCBnZXRXZWJTb2NrZXRIYW5kbGVyKHRlc3Rpbmc6OlN0ckVxKCIvd3MtdGVzdCIpKSkKKyAgICAgICAgLldpbGxPbmNlKHRlc3Rpbmc6OlJldHVybihzdGQ6OnNoYXJlZF9wdHI8V2ViU29ja2V0OjpIYW5kbGVyPigpKSk7CisgICAgY29ubmVjdGlvbi5oYW5kbGVOZXdEYXRhKCk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL0NyYWNrZWRVcmlUZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL0NyYWNrZWRVcmlUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyNDNmNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy90ZXN0L2MvQ3JhY2tlZFVyaVRlc3RzLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKy8vIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKy8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisvLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAic2Vhc29ja3MvdXRpbC9DcmFja2VkVXJpLmgiCisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorCit1c2luZyBuYW1lc3BhY2UgdGVzdGluZzsKK3VzaW5nIG5hbWVzcGFjZSBzZWFzb2NrczsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSB7CisKK1RFU1QoQ3JhY2tlZFVyaVRlc3RzLCBzaG91bGRIYW5kbGVSb290KSB7CisgICAgQ3JhY2tlZFVyaSB1cmkoIi8iKTsKKyAgICBFWFBFQ1RfRVEodmVjdG9yPHN0cmluZz4oKSwgdXJpLnBhdGgoKSk7CisgICAgRVhQRUNUX1RSVUUodXJpLnF1ZXJ5UGFyYW1zKCkuZW1wdHkoKSk7Cit9CisKK1RFU1QoQ3JhY2tlZFVyaVRlc3RzLCBzaG91bGRIYW5kbGVUb3BMZXZlbCkgeworICAgIENyYWNrZWRVcmkgdXJpKCIvbW9ua2V5Iik7CisgICAgdmVjdG9yPHN0cmluZz4gZXhwZWN0ZWQgPSB7ICJtb25rZXkiIH07CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCB1cmkucGF0aCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh1cmkucXVlcnlQYXJhbXMoKS5lbXB0eSgpKTsKK30KKworVEVTVChDcmFja2VkVXJpVGVzdHMsIHNob3VsZEhhbmRsZVNpbXBsZVBhdGhzKSB7CisgICAgQ3JhY2tlZFVyaSB1cmkoIi9mb28vYmFyL2Jhei9idW5nbyIpOworICAgIHZlY3RvcjxzdHJpbmc+IGV4cGVjdGVkID0geyAiZm9vIiwgImJhciIsICJiYXoiLCAiYnVuZ28iIH07CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCB1cmkucGF0aCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh1cmkucXVlcnlQYXJhbXMoKS5lbXB0eSgpKTsKK30KKworVEVTVChDcmFja2VkVXJpVGVzdHMsIHNob3VsZFRyZWF0VHJhaWxpbmdTbGFzaEFzTmV3UGFnZSkgeworICAgIENyYWNrZWRVcmkgdXJpKCIvb29oL2EvZGlyZWN0b3J5LyIpOworICAgIHZlY3RvcjxzdHJpbmc+IGV4cGVjdGVkID0geyAib29oIiwgImEiLCAiZGlyZWN0b3J5IiwgIiIgfTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHVyaS5wYXRoKCkpOworICAgIEVYUEVDVF9UUlVFKHVyaS5xdWVyeVBhcmFtcygpLmVtcHR5KCkpOworfQorCitURVNUKENyYWNrZWRVcmlUZXN0cywgc2hvdWxkSGFuZGxlUm9vdFdpdGhRdWVyeSkgeworICAgIENyYWNrZWRVcmkgdXJpKCIvP2E9c3BvdGNoIik7CisgICAgRVhQRUNUX0VRKHZlY3RvcjxzdHJpbmc+KCksIHVyaS5wYXRoKCkpOworICAgIEFTU0VSVF9GQUxTRSh1cmkucXVlcnlQYXJhbXMoKS5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfVFJVRSh1cmkuaGFzUGFyYW0oImEiKSk7CisgICAgRVhQRUNUX0VRKCJzcG90Y2giLCB1cmkucXVlcnlQYXJhbSgiYSIpKTsKK30KKworVEVTVChDcmFja2VkVXJpVGVzdHMsIHNob3VsZEhvbm9yRGVmYXVsdHMpIHsKKyAgICBDcmFja2VkVXJpIHVyaSgiLz9hPXNwb3RjaCIpOworICAgIEVYUEVDVF9FUSgibW9ua2V5IiwgdXJpLnF1ZXJ5UGFyYW0oIm5vdFRoZXJlIiwgIm1vbmtleSIpKTsKK30KKworVEVTVChDcmFja2VkVXJpVGVzdHMsIHNob3VsZEhhbmRsZUVtcHR5UGFyYW1zKSB7CisgICAgQ3JhY2tlZFVyaSB1cmkoIi8/YSZiJmMiKTsKKyAgICBFWFBFQ1RfRVEoIiIsIHVyaS5xdWVyeVBhcmFtKCJhIiwgIm5vdEVtcHR5RGVmYXVsdCIpKTsKKyAgICBFWFBFQ1RfRVEoIiIsIHVyaS5xdWVyeVBhcmFtKCJiIiwgIm5vdEVtcHR5RGVmYXVsdCIpKTsKKyAgICBFWFBFQ1RfRVEoIiIsIHVyaS5xdWVyeVBhcmFtKCJjIiwgIm5vdEVtcHR5RGVmYXVsdCIpKTsKK30KKworVEVTVChDcmFja2VkVXJpVGVzdHMsIHNob3VsZEhhbmRsZUR1cGxpY2F0ZVBhcmFtcykgeworICAgIENyYWNrZWRVcmkgdXJpKCIvP2E9YSZxPTEwJnE9NSZ6PXlpYmJsZSZxPTEwMCZxPWJsYW0iKTsKKyAgICB2ZWN0b3I8c3RyaW5nPiBleHBlY3RlZCA9IHsgIjEwIiwgIjUiLCAiMTAwIiwgImJsYW0iIH07CisgICAgc29ydChleHBlY3RlZC5iZWdpbigpLCBleHBlY3RlZC5lbmQoKSk7CisgICAgYXV0byBwYXJhbXMgPSB1cmkuYWxsUXVlcnlQYXJhbXMoInEiKTsKKyAgICBzb3J0KHBhcmFtcy5iZWdpbigpLCBwYXJhbXMuZW5kKCkpOworICAgIEVYUEVDVF9FUShleHBlY3RlZCwgcGFyYW1zKTsKK30KKworCitURVNUKENyYWNrZWRVcmlUZXN0cywgc2hvdWxkSGFuZGxlUGF0aFdpdGhRdWVyeSkgeworICAgIENyYWNrZWRVcmkgdXJpKCIvYmFkZ2VyL2JhZGdlci9iYWRnZXIvbXVzaHJvb20/cT1zbmFrZSIpOworICAgIHZlY3RvcjxzdHJpbmc+IGV4cGVjdGVkID0geyAiYmFkZ2VyIiwgImJhZGdlciIsICJiYWRnZXIiLCAibXVzaHJvb20iIH07CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCB1cmkucGF0aCgpKTsKKyAgICBBU1NFUlRfRkFMU0UodXJpLnF1ZXJ5UGFyYW1zKCkuZW1wdHkoKSk7CisgICAgRVhQRUNUX1RSVUUodXJpLmhhc1BhcmFtKCJxIikpOworICAgIEVYUEVDVF9FUSgic25ha2UiLCB1cmkucXVlcnlQYXJhbSgicSIpKTsKK30KKworVEVTVChDcmFja2VkVXJpVGVzdHMsIHNob3VsZFVuZXNjYXBlUGF0aHMpIHsKKyAgICBDcmFja2VkVXJpIHVyaSgiL2ZvbytiYXIvYmF6JTJmLyU0MCU0RiIpOworICAgIHZlY3RvcjxzdHJpbmc+IGV4cGVjdGVkID0geyAiZm9vIGJhciIsICJiYXovIiwgIkBPIiB9OworICAgIEVYUEVDVF9FUShleHBlY3RlZCwgdXJpLnBhdGgoKSk7Cit9CisKK1RFU1QoQ3JhY2tlZFVyaVRlc3RzLCBzaG91bGRVbmVzY2FwZVF1ZXJpZXMpIHsKKyAgICBDcmFja2VkVXJpIHVyaSgiLz9xPWErYiZ0PSUyMCUyMCZwPSU0MSIpOworICAgIEVYUEVDVF9FUSgiYSBiIiwgdXJpLnF1ZXJ5UGFyYW0oInEiKSk7CisgICAgRVhQRUNUX0VRKCIgICIsIHVyaS5xdWVyeVBhcmFtKCJ0IikpOworICAgIEVYUEVDVF9FUSgiQSIsIHVyaS5xdWVyeVBhcmFtKCJwIikpOworfQorCisKK1RFU1QoQ3JhY2tlZFVyaVRlc3RzLCBzaG91bGRUaHJvd09uUnViYmlzaCkgeworICAgIEVYUEVDVF9USFJPVyhDcmFja2VkVXJpKCIiKSwgZXhjZXB0aW9uKTsKKyAgICBFWFBFQ1RfVEhST1coQ3JhY2tlZFVyaSgicnViYmlzaCIpLCBleGNlcHRpb24pOworICAgIEVYUEVDVF9USFJPVyhDcmFja2VkVXJpKCIuLi8uLi8uLiIpLCBleGNlcHRpb24pOworICAgIEVYUEVDVF9USFJPVyhDcmFja2VkVXJpKCIvP2E9PT1iIiksIGV4Y2VwdGlvbik7CisgICAgRVhQRUNUX1RIUk9XKENyYWNrZWRVcmkoIi8lIiksIGV4Y2VwdGlvbik7CisgICAgRVhQRUNUX1RIUk9XKENyYWNrZWRVcmkoIi8lYSIpLCBleGNlcHRpb24pOworICAgIEVYUEVDVF9USFJPVyhDcmFja2VkVXJpKCIvJXFxIiksIGV4Y2VwdGlvbik7Cit9CisKK1RFU1QoQ3JhY2tlZFVyaVRlc3RzLCBzaG91bGRTaGlmdCkgeworICAgIENyYWNrZWRVcmkgdXJpKCIvYS9iL2MuaHRtbCIpOworICAgIHZlY3RvcjxzdHJpbmc+IGV4cGVjdGVkMSA9IHsiYSIsICJiIiwgImMuaHRtbCJ9OworICAgIEVYUEVDVF9FUShleHBlY3RlZDEsIHVyaS5wYXRoKCkpOworCisgICAgdXJpID0gdXJpLnNoaWZ0KCk7CisgICAgdmVjdG9yPHN0cmluZz4gZXhwZWN0ZWQyID0geyJiIiwgImMuaHRtbCJ9OworICAgIEVYUEVDVF9FUShleHBlY3RlZDIsIHVyaS5wYXRoKCkpOworCisgICAgdXJpID0gdXJpLnNoaWZ0KCk7CisgICAgdmVjdG9yPHN0cmluZz4gZXhwZWN0ZWQzID0geyJjLmh0bWwifTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQzLCB1cmkucGF0aCgpKTsKKworICAgIHVyaSA9IHVyaS5zaGlmdCgpOworICAgIHZlY3RvcjxzdHJpbmc+IGV4cGVjdGVkNCA9IHsiIn07CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkNCwgdXJpLnBhdGgoKSk7CisKKyAgICB1cmkgPSB1cmkuc2hpZnQoKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQ0LCB1cmkucGF0aCgpKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3Rlc3QvYy9IZWFkZXJNYXBUZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL0hlYWRlck1hcFRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg5NzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3Rlc3QvYy9IZWFkZXJNYXBUZXN0cy5jcHAKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgImludGVybmFsL0hlYWRlck1hcC5oIgorCisjaW5jbHVkZSAiaW50ZXJuYWwvQ29uZmlnLmgiCisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorCit1c2luZyBuYW1lc3BhY2Ugc2Vhc29ja3M7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgZW1wbGFjZShIZWFkZXJNYXAgJm1hcCwgY29uc3QgY2hhciAqaGVhZGVyLCBjb25zdCBjaGFyICp2YWx1ZSkgeworI2lmIEhBVkVfVU5PUkRFUkVEX01BUF9FTVBMQUNFCisgICAgbWFwLmVtcGxhY2UoaGVhZGVyLCB2YWx1ZSk7CisjZWxzZQorICAgIG1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoaGVhZGVyLCB2YWx1ZSkpOworI2VuZGlmCit9CisKK1RFU1QoSGVhZGVyTWFwVGVzdHMsIHNob3VsZENvbnN0cnVjdCkgeworICAgIEhlYWRlck1hcCBtYXA7CisgICAgRVhQRUNUX1RSVUUobWFwLmVtcHR5KCkpOworfQorCitURVNUKEhlYWRlck1hcFRlc3RzLCBzaG91bGRTdG9yZUFuZFJldHJpZXZlKSB7CisgICAgSGVhZGVyTWFwIG1hcDsKKyAgICBlbXBsYWNlKG1hcCwgIkZvbyIsICJCYXIiKTsKKyAgICBFWFBFQ1RfRVEoMSwgbWFwLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKCJCYXIiLCBtYXAuYXQoIkZvbyIpKTsKKyAgICBlbXBsYWNlKG1hcCwgIkJheiIsICJNb28iKTsKKyAgICBFWFBFQ1RfRVEoMiwgbWFwLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKCJCYXIiLCBtYXAuYXQoIkZvbyIpKTsKKyAgICBFWFBFQ1RfRVEoIk1vbyIsIG1hcC5hdCgiQmF6IikpOworfQorCitURVNUKEhlYWRlck1hcFRlc3RzLCBzaG91bGRCZUNhc2VJbnNlbnNpdGl2ZSkgeworICAgIEhlYWRlck1hcCBtYXA7CisgICAgZW1wbGFjZShtYXAsICJGb28iLCAiQmFyIik7CisgICAgRVhQRUNUX0VRKCJCYXIiLCBtYXAuYXQoIkZPTyIpKTsKKyAgICBFWFBFQ1RfRVEoIkJhciIsIG1hcC5hdCgiZm9PIikpOworfQorCitURVNUKEhlYWRlck1hcFRlc3RzLCBzaG91bGRQcmVzZXJ2ZU9yaWdpbmFsQ2FzZSkgeworICAgIEhlYWRlck1hcCBtYXA7CisgICAgZW1wbGFjZShtYXAsICJGb28iLCAiQmFyIik7CisgICAgYXV0byBpdCA9IG1hcC5maW5kKCJGb28iKTsKKyAgICBFWFBFQ1RfRVEoIkZvbyIsIGl0LT5maXJzdCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy90ZXN0L2MvSHRtbFRlc3RzLmNwcCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy90ZXN0L2MvSHRtbFRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGY3MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3Rlc3QvYy9IdG1sVGVzdHMuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgInNlYXNvY2tzL3V0aWwvSHRtbC5oIgorCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKwordXNpbmcgbmFtZXNwYWNlIHNlYXNvY2tzOwordXNpbmcgbmFtZXNwYWNlIHNlYXNvY2tzOjpodG1sOworCitURVNUKEh0bWxUZXN0cywgc2hvdWxkUmVuZGVyQVNpbXBsZURvY3VtZW50KSB7CisgICAgYXV0byBkb2N1bWVudCA9IGh0bWw6Omh0bWwoaGVhZCh0aXRsZSgiSGVsbG8iKSksIGJvZHkoaDEoIkEgaGVhZGVyIiksICJUaGlzIGlzIGEgZG9jdW1lbnQiKSk7CisgICAgRVhQRUNUX0VRKCI8aHRtbD48aGVhZD48dGl0bGU+SGVsbG88L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+QSBoZWFkZXI8L2gxPlRoaXMgaXMgYSBkb2N1bWVudDwvYm9keT48L2h0bWw+IiwgZG9jdW1lbnQuc3RyKCkpOworfQorCitURVNUKEh0bWxUZXN0cywgc2hvdWxkQWxsb3dBcHBlbmRpbmcpIHsKKyAgICBhdXRvIGxpc3QgPSB1bCgpOworICAgIGxpc3QgPDwgbGkoIkVsZW1lbnQgMSIpIDw8IGxpKCJFbGVtZW50IDIiKTsKKyAgICBFWFBFQ1RfRVEoIjx1bD48bGk+RWxlbWVudCAxPC9saT48bGk+RWxlbWVudCAyPC9saT48L3VsPiIsIGxpc3Quc3RyKCkpOworfQorCitURVNUKEh0bWxUZXN0cywgc2hvdWxkQWxsb3dDb21tYVNlcGFyYXRpb24pIHsKKyAgICBhdXRvIGxpc3QgPSB1bChsaSgiRWxlbWVudCAxIiksIGxpKCJFbGVtZW50IDIiKSk7CisgICAgRVhQRUNUX0VRKCI8dWw+PGxpPkVsZW1lbnQgMTwvbGk+PGxpPkVsZW1lbnQgMjwvbGk+PC91bD4iLCBsaXN0LnN0cigpKTsKK30KKworVEVTVChIdG1sVGVzdHMsIHNob3VsZEhhbmRsZUF0dHJpYnV0ZXMpIHsKKyAgICBhdXRvIGVsZW0gPSBzcGFuKCJTb21lIHRleHQiKS5jbGF6eigiY2xhc3MiKTsKKyAgICBFWFBFQ1RfRVEoIjxzcGFuIGNsYXNzPVwiY2xhc3NcIj5Tb21lIHRleHQ8L3NwYW4+IiwgZWxlbS5zdHIoKSk7Cit9CisKK1RFU1QoSHRtbFRlc3RzLCBzaG91bGRBcHBlbmRMaWtlQVN0cmVhbUZyb21FbXB0eSkgeworICAgIGF1dG8gZWxlbSA9IGVtcHR5KCkgPDwgIlRleHQgIiA8PCAxIDw8ICcgJyA8PCAxMC4yMzsKKyAgICBFWFBFQ1RfRVEoIlRleHQgMSAxMC4yMyIsIGVsZW0uc3RyKCkpOworfQorCitURVNUKEh0bWxUZXN0cywgc2hvdWxkTm90TmVlZEV4dHJhTWFya3VwRm9yVGV4dE5vZGVzKSB7CisgICAgYXV0byBlbGVtID0gdGV4dCgiVGhpcyAiKSA8PCB0ZXh0KCJpcyIpIDw8IHRleHQoIiBhIHRlc3QiKSA8PCAiLiI7CisgICAgRVhQRUNUX0VRKCJUaGlzIGlzIGEgdGVzdC4iLCBlbGVtLnN0cigpKTsKK30KKworVEVTVChIdG1sVGVzdHMsIHNob3VsZFdvcmtXaXRoQW5jaG9ycykgeworICAgIGF1dG8gZWxlbSA9IGEoImh0dHA6Ly9nb29nbGUuY29tLz9xPWJhZGdlcnMiLCBkaXYoc3BhbigiZm9vIikpKTsKKyAgICBFWFBFQ1RfRVEoIjxhIGhyZWY9XCJodHRwOi8vZ29vZ2xlLmNvbS8/cT1iYWRnZXJzXCI+PGRpdj48c3Bhbj5mb288L3NwYW4+PC9kaXY+PC9hPiIsIGVsZW0uc3RyKCkpOworfQorCitURVNUKEh0bWxUZXN0cywgc2hvdWxkQWRkQWxsKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3MgPSB7ICJIaSIsICJNb28iLCAiRm9vIiB9OworICAgIGF1dG8gbGlzdCA9IHVsKCkuYWRkQWxsKHN0cmluZ3MsIFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHJldHVybiBsaShzKTsgfSk7CisgICAgRVhQRUNUX0VRKCI8dWw+PGxpPkhpPC9saT48bGk+TW9vPC9saT48bGk+Rm9vPC9saT48L3VsPiIsIGxpc3Quc3RyKCkpOworCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL0h5YmlUZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL0h5YmlUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyNzBlYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy90ZXN0L2MvSHliaVRlc3RzLmNwcApAQCAtMCwwICsxLDE0NSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCisvLyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisvLyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIAorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKKy8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSAKKy8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCisvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAKKy8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIAorLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAiaW50ZXJuYWwvSHliaUFjY2VwdC5oIgorI2luY2x1ZGUgImludGVybmFsL0h5YmlQYWNrZXREZWNvZGVyLmgiCisKKyNpbmNsdWRlICJzZWFzb2Nrcy9JZ25vcmluZ0xvZ2dlci5oIgorCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2Ugc2Vhc29ja3M7CisKK3N0YXRpYyBJZ25vcmluZ0xvZ2dlciBpZ25vcmU7CisKK3ZvaWQgdGVzdFNpbmdsZVN0cmluZygKKyAgICAgICAgSHliaVBhY2tldERlY29kZXI6Ok1lc3NhZ2VTdGF0ZSBleHBlY3RlZFN0YXRlLAorICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZFBheWxvYWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2LAorICAgICAgICB1aW50MzJfdCBzaXplID0gMCkgeworICAgIEh5YmlQYWNrZXREZWNvZGVyIGRlY29kZXIoaWdub3JlLCB2KTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZWNvZGVkOworICAgIEFTU0VSVF9FUShleHBlY3RlZFN0YXRlLCBkZWNvZGVyLmRlY29kZU5leHRNZXNzYWdlKGRlY29kZWQpKTsKKyAgICBBU1NFUlRfRVEoZXhwZWN0ZWRQYXlsb2FkLCBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmZGVjb2RlZFswXSksIGRlY29kZWQuc2l6ZSgpKSk7CisgICAgQVNTRVJUX0VRKEh5YmlQYWNrZXREZWNvZGVyOjpOb01lc3NhZ2UsIGRlY29kZXIuZGVjb2RlTmV4dE1lc3NhZ2UoZGVjb2RlZCkpOworICAgIEFTU0VSVF9FUShzaXplID8gc2l6ZSA6IHYuc2l6ZSgpLCBkZWNvZGVyLm51bUJ5dGVzRGVjb2RlZCgpKTsKK30KKwordm9pZCB0ZXN0TG9uZ1N0cmluZyhzaXplX3Qgc2l6ZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIHYucHVzaF9iYWNrKCdBJyk7CisgICAgfQorICAgIEh5YmlQYWNrZXREZWNvZGVyIGRlY29kZXIoaWdub3JlLCB2KTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZWNvZGVkOworICAgIEFTU0VSVF9FUShIeWJpUGFja2V0RGVjb2Rlcjo6VGV4dE1lc3NhZ2UsIGRlY29kZXIuZGVjb2RlTmV4dE1lc3NhZ2UoZGVjb2RlZCkpOworICAgIEFTU0VSVF9FUShzaXplLCBkZWNvZGVkLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKCdBJywgZGVjb2RlZFtpXSk7CisgICAgfQorICAgIEFTU0VSVF9FUShIeWJpUGFja2V0RGVjb2Rlcjo6Tm9NZXNzYWdlLCBkZWNvZGVyLmRlY29kZU5leHRNZXNzYWdlKGRlY29kZWQpKTsKKyAgICBBU1NFUlRfRVEodi5zaXplKCksIGRlY29kZXIubnVtQnl0ZXNEZWNvZGVkKCkpOworfQorCitURVNUKEh5YmlUZXN0cywgdGV4dEV4YW1wbGVzKSB7CisgICAgLy8gQ0YuIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtaHliaS10aGV3ZWJzb2NrZXRwcm90b2NvbC0xMCAjNC43CisgICAgdGVzdFNpbmdsZVN0cmluZyhIeWJpUGFja2V0RGVjb2Rlcjo6VGV4dE1lc3NhZ2UsICJIZWxsbyIsIHsweDgxLCAweDA1LCAweDQ4LCAweDY1LCAweDZjLCAweDZjLCAweDZmfSk7CisgICAgdGVzdFNpbmdsZVN0cmluZyhIeWJpUGFja2V0RGVjb2Rlcjo6VGV4dE1lc3NhZ2UsICJIZWxsbyIsIHsweDgxLCAweDg1LCAweDM3LCAweGZhLCAweDIxLCAweDNkLCAweDdmLCAweDlmLCAweDRkLCAweDUxLCAweDU4fSk7CisgICAgdGVzdFNpbmdsZVN0cmluZyhIeWJpUGFja2V0RGVjb2Rlcjo6UGluZywgIkhlbGxvIiwgezB4ODksIDB4MDUsIDB4NDgsIDB4NjUsIDB4NmMsIDB4NmMsIDB4NmZ9KTsKK30KKworVEVTVChIeWJpVGVzdHMsIHdpdGhQYXJ0aWFsTWVzc2FnZUZvbGxvd2luZykgeworICAgIHRlc3RTaW5nbGVTdHJpbmcoSHliaVBhY2tldERlY29kZXI6OlRleHRNZXNzYWdlLCAiSGVsbG8iLCB7MHg4MSwgMHgwNSwgMHg0OCwgMHg2NSwgMHg2YywgMHg2YywgMHg2ZiwgMHg4MX0sIDcpOworICAgIHRlc3RTaW5nbGVTdHJpbmcoSHliaVBhY2tldERlY29kZXI6OlRleHRNZXNzYWdlLCAiSGVsbG8iLCB7MHg4MSwgMHgwNSwgMHg0OCwgMHg2NSwgMHg2YywgMHg2YywgMHg2ZiwgMHg4MSwgMHgwNX0sIDcpOworICAgIHRlc3RTaW5nbGVTdHJpbmcoSHliaVBhY2tldERlY29kZXI6OlRleHRNZXNzYWdlLCAiSGVsbG8iLCB7MHg4MSwgMHgwNSwgMHg0OCwgMHg2NSwgMHg2YywgMHg2YywgMHg2ZiwgMHg4MSwgMHgwNSwgMHg0OH0sIDcpOworICAgIHRlc3RTaW5nbGVTdHJpbmcoSHliaVBhY2tldERlY29kZXI6OlRleHRNZXNzYWdlLCAiSGVsbG8iLCB7MHg4MSwgMHgwNSwgMHg0OCwgMHg2NSwgMHg2YywgMHg2YywgMHg2ZiwgMHg4MSwgMHgwNSwgMHg0OCwgMHg2NSwgMHg2YywgMHg2Y30sIDcpOworfQorCitURVNUKEh5YmlUZXN0cywgYmluYXJ5TWVzc2FnZSkgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCB7IDB4ODIsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDIgfTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZF9ib2R5IHsgMHgwMCwgMHgwMSwgMHgwMiB9OworICAgIEh5YmlQYWNrZXREZWNvZGVyIGRlY29kZXIoaWdub3JlLCBwYWNrZXQpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWQ7CisgICAgQVNTRVJUX0VRKEh5YmlQYWNrZXREZWNvZGVyOjpCaW5hcnlNZXNzYWdlLCBkZWNvZGVyLmRlY29kZU5leHRNZXNzYWdlKGRlY29kZWQpKTsKKyAgICBBU1NFUlRfRVEoZXhwZWN0ZWRfYm9keSwgZGVjb2RlZCk7CisgICAgQVNTRVJUX0VRKEh5YmlQYWNrZXREZWNvZGVyOjpOb01lc3NhZ2UsIGRlY29kZXIuZGVjb2RlTmV4dE1lc3NhZ2UoZGVjb2RlZCkpOworICAgIEFTU0VSVF9FUShwYWNrZXQuc2l6ZSgpLCBkZWNvZGVyLm51bUJ5dGVzRGVjb2RlZCgpKTsKK30KKworVEVTVChIeWJpVGVzdHMsIHdpdGhUd29NZXNzYWdlcykgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgeworICAgICAgICAweDgxLCAweDA1LCAweDQ4LCAweDY1LCAweDZjLCAweDZjLCAweDZmLAorICAgICAgICAweDgxLCAweDA3LCAweDQ3LCAweDZmLCAweDZmLCAweDY0LCAweDYyLCAweDc5LCAweDY1fTsKKyAgICBIeWJpUGFja2V0RGVjb2RlciBkZWNvZGVyKGlnbm9yZSwgZGF0YSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVjb2RlZDsKKyAgICBBU1NFUlRfRVEoSHliaVBhY2tldERlY29kZXI6OlRleHRNZXNzYWdlLCBkZWNvZGVyLmRlY29kZU5leHRNZXNzYWdlKGRlY29kZWQpKTsKKyAgICBBU1NFUlRfRVEoIkhlbGxvIiwgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmRlY29kZWRbMF0pLCBkZWNvZGVkLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShIeWJpUGFja2V0RGVjb2Rlcjo6VGV4dE1lc3NhZ2UsIGRlY29kZXIuZGVjb2RlTmV4dE1lc3NhZ2UoZGVjb2RlZCkpOworICAgIEFTU0VSVF9FUSgiR29vZGJ5ZSIsIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZkZWNvZGVkWzBdKSwgZGVjb2RlZC5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoSHliaVBhY2tldERlY29kZXI6Ok5vTWVzc2FnZSwgZGVjb2Rlci5kZWNvZGVOZXh0TWVzc2FnZShkZWNvZGVkKSk7CisgICAgQVNTRVJUX0VRKGRhdGEuc2l6ZSgpLCBkZWNvZGVyLm51bUJ5dGVzRGVjb2RlZCgpKTsKK30KKworVEVTVChIeWJpVGVzdHMsIHdpdGhUd29NZXNzYWdlc09uZUJlaW5nTWFza2VkZCkgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgeworICAgICAgICAweDgxLCAweDA1LCAweDQ4LCAweDY1LCAweDZjLCAweDZjLCAweDZmLCAgLy8gaGVsbG8KKyAgICAgICAgMHg4MSwgMHg4NSwgMHgzNywgMHhmYSwgMHgyMSwgMHgzZCwgMHg3ZiwgMHg5ZiwgMHg0ZCwgMHg1MSwgMHg1OCAgLy8gYWxzbyBoZWxsbworICAgIH07CisgICAgSHliaVBhY2tldERlY29kZXIgZGVjb2RlcihpZ25vcmUsIGRhdGEpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWQ7CisgICAgQVNTRVJUX0VRKEh5YmlQYWNrZXREZWNvZGVyOjpUZXh0TWVzc2FnZSwgZGVjb2Rlci5kZWNvZGVOZXh0TWVzc2FnZShkZWNvZGVkKSk7CisgICAgQVNTRVJUX0VRKCJIZWxsbyIsIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZkZWNvZGVkWzBdKSwgZGVjb2RlZC5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoSHliaVBhY2tldERlY29kZXI6OlRleHRNZXNzYWdlLCBkZWNvZGVyLmRlY29kZU5leHRNZXNzYWdlKGRlY29kZWQpKTsKKyAgICBBU1NFUlRfRVEoIkhlbGxvIiwgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmRlY29kZWRbMF0pLCBkZWNvZGVkLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShIeWJpUGFja2V0RGVjb2Rlcjo6Tm9NZXNzYWdlLCBkZWNvZGVyLmRlY29kZU5leHRNZXNzYWdlKGRlY29kZWQpKTsKKyAgICBBU1NFUlRfRVEoZGF0YS5zaXplKCksIGRlY29kZXIubnVtQnl0ZXNEZWNvZGVkKCkpOworfQorCitURVNUKEh5YmlUZXN0cywgcmVncmVzc2lvbkJ1ZykgeworICAgIC8vIHRvcCBiaXQgc2V0IG9mIHNlY29uZCBieXRlIG9mIG1lc3NhZ2UgdXNlZCB0byB0cmlnZ2VyIGEgTUFTSyBkZWNvZGUgb2YgdGhlIHJlbWFpbmRlcgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgeworICAgICAgICAweDgyLCAweDA1LCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0ICAKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkX2JvZHkgeyAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0IH07CisgICAgSHliaVBhY2tldERlY29kZXIgZGVjb2RlcihpZ25vcmUsIGRhdGEpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWQ7CisgICAgQVNTRVJUX0VRKEh5YmlQYWNrZXREZWNvZGVyOjpCaW5hcnlNZXNzYWdlLCBkZWNvZGVyLmRlY29kZU5leHRNZXNzYWdlKGRlY29kZWQpKTsKKyAgICBBU1NFUlRfRVEoZXhwZWN0ZWRfYm9keSwgZGVjb2RlZCk7CisgICAgQVNTRVJUX0VRKGRhdGEuc2l6ZSgpLCBkZWNvZGVyLm51bUJ5dGVzRGVjb2RlZCgpKTsKK30KKworVEVTVChIeWJpVGVzdHMsIGxvbmdTdHJpbmdFeGFtcGxlcykgeworICAgIC8vIFRoZXNlIGFyZSB0aGUgYmluYXJ5IGV4YW1wbGVzLCBidXQgY2FzdCBhcyBzdHJpbmdzLgorICAgIHRlc3RMb25nU3RyaW5nKDI1NiwgezB4ODEsIDB4N0UsIDB4MDEsIDB4MDB9KTsKKyAgICB0ZXN0TG9uZ1N0cmluZyg2NTUzNiwgezB4ODEsIDB4N0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDB9KTsKK30KKworVEVTVChIeWJpVGVzdHMsIGFjY2VwdCkgeworICAgIEFTU0VSVF9FUSgiczNwUExNQmlUeGFROWtZR3p6aFpSYksreE9vPSIsIGdldEFjY2VwdEtleSgiZEdobElITmhiWEJzWlNCdWIyNWpaUT09IikpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3Rlc3QvYy9Kc29uVGVzdHMuY3BwIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3Rlc3QvYy9Kc29uVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyODRiNTAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL0pzb25UZXN0cy5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgInNlYXNvY2tzL3V0aWwvSnNvbi5oIgorCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCit1c2luZyBuYW1lc3BhY2UgdGVzdGluZzsKK3VzaW5nIG5hbWVzcGFjZSBzZWFzb2NrczsKKworbmFtZXNwYWNlIHsKKworVEVTVChKc29uVGVzdHMsIHNob3VsZEhhbmRsZU1hcHMpIHsKKyAgICBFWFBFQ1RfRVEoIntcIm1vbmtleVwiOjEyfSIsIG1ha2VNYXAoIm1vbmtleSIsIDEyKSk7Cit9CisKK1RFU1QoSnNvblRlc3RzLCBzaG91bGRIYW5kbGVRdW90ZWRTdHJpbmdzKSB7CisgICAgRVhQRUNUX0VRKCJ7XCJrZXlcIjpcIkkgaGF2ZSBcXFwicXVvdGVzXFxcIlwifSIsCisgICAgICAgICAgICBtYWtlTWFwKCJrZXkiLCAiSSBoYXZlIFwicXVvdGVzXCIiKSk7Cit9CisKK1RFU1QoSnNvblRlc3RzLCBzaG91bGRIYW5kbGVOZXdMaW5lc0luU3RyaW5ncykgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cjsKKyAgICBqc29uVG9TdHJlYW0oc3RyLCAiSSBoYXZlXG5uZXdccmxpbmVzIik7CisgICAgRVhQRUNUX0VRKCJcIkkgaGF2ZVxcbm5ld1xccmxpbmVzXCIiLCBzdHIuc3RyKCkpOworfQorCitURVNUKEpzb25UZXN0cywgc2hvdWxkSGFuZGxlQ3JhenlDaGFycykgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cjsKKyAgICBqc29uVG9TdHJlYW0oc3RyLCAiXHgwMVx4MDJceDFmIik7CisgICAgRVhQRUNUX0VRKCJcIlxcdTAwMDFcXHUwMDAyXFx1MDAxZlwiIiwgc3RyLnN0cigpKTsKK30KKworVEVTVChKc29uVGVzdHMsIHNob3VsZEhhbmRsZURhdGUpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHI7CisgICAganNvblRvU3RyZWFtKHN0ciwgRXBvY2hUaW1lQXNMb2NhbCgyMDkwMDE2MDApKTsKKyAgICBFWFBFQ1RfRVEoIm5ldyBEYXRlKDIwOTAwMTYwMDAwMCkudG9Mb2NhbGVTdHJpbmcoKSIsIHN0ci5zdHIoKSk7Cit9CisKK3N0cnVjdCBPYmplY3QgeworICAgIHZvaWQganNvblRvU3RyZWFtKHN0ZDo6b3N0cmVhbSAmb3N0cikgY29uc3QgeworICAgICAgICBvc3RyIDw8IG1ha2VNYXAoIm9iamVjdCIsIHRydWUpOworICAgIH0KKyAgICAvLyBDbGFuZyBpcyBwZXJuaWNraXR5IGFib3V0IHRoaXMuIFdlIGRvbid0IHdhbnQgdXNlIHRoaXMgZnVuY3Rpb24KKyAgICAvLyBidXQgaXQncyBoZXJlIHRvIGNhdGNoIGVycm9ycyB3aGVyZSB3ZSBhY2NpZGVudGFsbHkgdXNlIGl0IGluc3RlYWQgb2YgdGhlCisgICAgLy8ganNvblRvU3RyZWFtLgorICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0gJm8sIGNvbnN0IE9iamVjdCAmb2IpIHsKKyAgICAgICAgcmV0dXJuIG8gPDwgIk5vdCB0aGlzIG9uZSI7CisgICAgfQorfTsKKworc3RydWN0IE9iamVjdDIgeworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0gJm8sIGNvbnN0IE9iamVjdDIgJm9iKSB7CisgICAgICAgIHJldHVybiBvIDw8ICJUaGlzIGlzIG9iamVjdCAyIjsKKyAgICB9Cit9OworCitzdGF0aWNfYXNzZXJ0KGlzX3N0cmVhbWFibGU8T2JqZWN0Mj46OnZhbHVlLCAiU2hvdWxkIGJlIHN0cmVhbWFibGUiKTsKKworVEVTVChKc29uVGVzdHMsIHNob3VsZEhhbmRsZUN1c3RvbU9iamVjdHMpIHsKKyAgICBFWFBFQ1RfRVEoUiIoeyJvYmoiOnsib2JqZWN0Ijp0cnVlfX0pIiwgbWFrZU1hcCgib2JqIiwgT2JqZWN0KCkpKTsKKyAgICBPYmplY3QgbzsKKyAgICBFWFBFQ1RfRVEoUiIoeyJvYmoiOnsib2JqZWN0Ijp0cnVlfX0pIiwgbWFrZU1hcCgib2JqIiwgbykpOworICAgIEVYUEVDVF9FUShSIih7Im9iaiI6IlRoaXMgaXMgb2JqZWN0IDIifSkiLCBtYWtlTWFwKCJvYmoiLCBPYmplY3QyKCkpKTsKKyAgICBPYmplY3QyIG8yOworICAgIEVYUEVDVF9FUShSIih7Im9iaiI6IlRoaXMgaXMgb2JqZWN0IDIifSkiLCBtYWtlTWFwKCJvYmoiLCBvMikpOworICAgIC8vIFB1dHRpbmcgYSBjbGFuZy1zcGVjaWZpYyBwcmFnbWEgdG8gdGh3YXJ0IHRoZSB1bnVzZWQgd2FybmluZyBpbiBPYmplY3QKKyAgICAvLyB1cHNldHMgR0NDLi4uc28gd2UganVzdCBwdXQgYSB0ZXN0IGZvciB0aGlzIHRvIGVuc3VyZSBpdCdzIHVzZWQuCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zdDsKKyAgICBvc3QgPDwgT2JqZWN0KCk7CisgICAgRVhQRUNUX0VRKCJOb3QgdGhpcyBvbmUiLCBvc3Quc3RyKCkpOyAvLyBTZWUgY29tbWVudAorfQorCitURVNUKEpzb25UZXN0cywgdG9fanNvbikgeworICAgIEVYUEVDVF9FUSgiMSIsIHRvX2pzb24oMSkpOworICAgIEVYUEVDVF9FUSgiMy4xNCIsIHRvX2pzb24oMy4xNCkpOworICAgIEVYUEVDVF9FUSgiXCJoZWxsb1wiIiwgdG9fanNvbigiaGVsbG8iKSk7CisgICAgRVhQRUNUX0VRKFIiKHsib2JqZWN0Ijp0cnVlfSkiLCB0b19qc29uKE9iamVjdCgpKSk7CisgICAgRVhQRUNUX0VRKFIiKCJUaGlzIGlzIG9iamVjdCAyIikiLCB0b19qc29uKE9iamVjdDIoKSkpOworfQorVEVTVChKc29uVGVzdHMsIGhhbmRsZXNBcnJheXMpIHsKKyAgICBFWFBFQ1RfRVEoUiIoW10pIiwgbWFrZUFycmF5KCkpOworICAgIEVYUEVDVF9FUShSIihbMV0pIiwgbWFrZUFycmF5KDEpKTsKKyAgICBFWFBFQ1RfRVEoUiIoWzEsMiwzXSkiLCBtYWtlQXJyYXkoMSwgMiwgMykpOworICAgIEVYUEVDVF9FUShSIihbMSwyLDNdKSIsIG1ha2VBcnJheSh7MSwgMiwgM30pKTsKKyAgICBFWFBFQ1RfRVEoUiIoWyJhYmMiXSkiLCBtYWtlQXJyYXkoImFiYyIpKTsKKyAgICBFWFBFQ1RfRVEoUiIoWyJhIiwiYiIsImMiXSkiLCBtYWtlQXJyYXkoImEiLCAiYiIsICJjIikpOworICAgIEVYUEVDVF9FUShSIihbImEiLCJiIiwiYyJdKSIsIG1ha2VBcnJheSh7ImEiLCAiYiIsICJjIn0pKTsKKyAgICBzdGQ6OnZlY3RvcjxKc29ubmVkU3RyaW5nPiBzdHJzID0geyB0b19qc29uKGZhbHNlKSwgdG9fanNvbih0cnVlKSB9OworICAgIEVYUEVDVF9FUShSIihbZmFsc2UsdHJ1ZV0pIiwgbWFrZUFycmF5RnJvbUNvbnRhaW5lcihzdHJzKSk7Cit9CisKK1RFU1QoSnNvblRlc3RzLCBoYW5kbGVzTWFwcykgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBKc29ubmVkU3RyaW5nPiBvcmRNYXA7CisgICAgb3JkTWFwWyJoZWxsbyJdID0gdG9fanNvbih0cnVlKTsKKyAgICBvcmRNYXBbImdvb2RieWUiXSA9IHRvX2pzb24oZmFsc2UpOworICAgIEVYUEVDVF9FUShSIih7Imdvb2RieWUiOmZhbHNlLCJoZWxsbyI6dHJ1ZX0pIiwgbWFrZU1hcEZyb21Db250YWluZXIob3JkTWFwKSk7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEpzb25uZWRTdHJpbmc+IHVub3JkTWFwOworICAgIHVub3JkTWFwWyJoZWxsbyJdID0gdG9fanNvbih0cnVlKTsKKyAgICB1bm9yZE1hcFsiZ29vZGJ5ZSJdID0gdG9fanNvbihmYWxzZSk7CisgICAgRVhQRUNUX1RIQVQobWFrZU1hcEZyb21Db250YWluZXIodW5vcmRNYXApLCBBbnlPZigKKyAgICAgICAgICAgIEVxKFIiKHsiZ29vZGJ5ZSI6ZmFsc2UsImhlbGxvIjp0cnVlfSkiKSwKKyAgICAgICAgICAgIEVxKFIiKHsiaGVsbG8iOnRydWUsImdvb2RieWUiOmZhbHNlfSkiKSkpOworfQorCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL01vY2tTZXJ2ZXJJbXBsLmggYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvdGVzdC9jL01vY2tTZXJ2ZXJJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1NDZiNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy90ZXN0L2MvTW9ja1NlcnZlckltcGwuaApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKy8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworLy8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisvLyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorLy8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2Vhc29ja3MvU2VydmVySW1wbC5oIgorCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKworbmFtZXNwYWNlIHNlYXNvY2tzIHsKKworY2xhc3MgTW9ja1NlcnZlckltcGwgOiBwdWJsaWMgU2VydmVySW1wbCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TW9ja1NlcnZlckltcGwoKSB7fQorCisgICAgTU9DS19NRVRIT0QxKHJlbW92ZSwgdm9pZChDb25uZWN0aW9uKiBjb25uZWN0aW9uKSk7CisgICAgTU9DS19NRVRIT0QxKHN1YnNjcmliZVRvV3JpdGVFdmVudHMsIGJvb2woQ29ubmVjdGlvbiogY29ubmVjdGlvbikpOworICAgIE1PQ0tfTUVUSE9EMSh1bnN1YnNjcmliZUZyb21Xcml0ZUV2ZW50cywgYm9vbChDb25uZWN0aW9uKiBjb25uZWN0aW9uKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QwKGdldFN0YXRpY1BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJigpKTsKKyAgICBNT0NLX0NPTlNUX01FVEhPRDEoZ2V0V2ViU29ja2V0SGFuZGxlciwgc3RkOjpzaGFyZWRfcHRyPFdlYlNvY2tldDo6SGFuZGxlcj4oY29uc3QgY2hhciAqKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QxKGlzQ3Jvc3NPcmlnaW5BbGxvd2VkLCBib29sKGNvbnN0IHN0ZDo6c3RyaW5nJikpOworICAgIE1PQ0tfTUVUSE9EMShoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxSZXNwb25zZT4oY29uc3QgUmVxdWVzdCAmKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QwKGdldFN0YXRzRG9jdW1lbnQsIHN0ZDo6c3RyaW5nKCkpOworICAgIE1PQ0tfQ09OU1RfTUVUSE9EMChjaGVja1RocmVhZCwgdm9pZCgpKTsKK307CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy90ZXN0L2MvdGVzdF9tYWluLmNwcCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy90ZXN0L2MvdGVzdF9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTYyNGFjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3Rlc3QvYy90ZXN0X21haW4uY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorLy8gbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorLy8gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKKy8vIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKKy8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgCisvLyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCisvLyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKKy8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAorLy8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisvLyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvd3NfdGVzdF93ZWIvYXBwLmpzIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3dzX3Rlc3Rfd2ViL2FwcC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmFhMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3dzX3Rlc3Rfd2ViL2FwcC5qcwpAQCAtMCwwICsxLDMzIEBACit2YXIgd3M7CisKKyQoZnVuY3Rpb24oKSB7CisgICAgd3MgPSBuZXcgV2ViU29ja2V0KCd3czovLycgKyBkb2N1bWVudC5sb2NhdGlvbi5ob3N0ICsgJy93cycpOworICAgIHdzLm9ub3BlbiA9IGZ1bmN0aW9uKCkgeworICAgICAgICBjb25zb2xlLmxvZygnb25vcGVuJyk7CisgICAgfTsKKyAgICB3cy5vbmNsb3NlID0gZnVuY3Rpb24oKSB7CisgICAgICAgICQoJyNtZXNzYWdlJykudGV4dCgnTG9zdCBjb25uZWN0aW9uLicpOworICAgICAgICBjb25zb2xlLmxvZygnb25jbG9zZScpOworICAgIH07CisgICAgd3Mub25tZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSkgeworICAgICAgICBjb25zb2xlLmxvZygiZ290ICciICsgbWVzc2FnZS5kYXRhICsgIiciKTsKKyAgICAgICAgZXZhbChtZXNzYWdlLmRhdGEpOworICAgIH07CisgICAgd3Mub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgIGNvbnNvbGUubG9nKCdvbmVycm9yICcgKyBlcnJvcik7CisgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTsKKyAgICB9OworICAgICQoJyNjb3VudCcpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgIAl3cy5zZW5kKCQoJyNjb3VudCcpLnZhbCgpKTsKKyAgICB9KTsKKyAgICAkKCcjY2xvc2UnKS5jbGljayhmdW5jdGlvbigpIHsKKyAgICAgIHdzLnNlbmQoJ2Nsb3NlJyk7CisgICAgfSk7CisgICAgJCgnI2RpZScpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgd3Muc2VuZCgnZGllJyk7CisgICAgfSk7Cit9KTsKKworc2V0ID0gZnVuY3Rpb24odmFsdWUpIHsKKwkkKCcjY291bnQnKS52YWwodmFsdWUpCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvd3NfdGVzdF93ZWIvaW5kZXguaHRtbCBiL3RoaXJkX3BhcnR5L3NlYXNvY2tzL3NyYy93c190ZXN0X3dlYi9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NWI4MjcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvd3NfdGVzdF93ZWIvaW5kZXguaHRtbApAQCAtMCwwICsxLDE0IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SGVsbG8sIHdvcmxkPC90aXRsZT4KKyAgICA8c2NyaXB0IHNyYz0nbGliL2pxdWVyeS0xLjQuNC5qcyc+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9J2FwcC5qcyc+PC9zY3JpcHQ+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisJPGlucHV0IGlkPSJjb3VudCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iLi4uIj48L2lucHV0PgorCTxpbnB1dCBpZD0iY2xvc2UiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkNsb3NlIj48L2lucHV0PgorCTxpbnB1dCBpZD0iZGllIiB0eXBlPSJidXR0b24iIHZhbHVlPSJEaWUiPjwvaW5wdXQ+CisgIDwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3dzX3Rlc3Rfd2ViL2xpYi9qcXVlcnktMS40LjQuanMgYi90aGlyZF9wYXJ0eS9zZWFzb2Nrcy9zcmMvd3NfdGVzdF93ZWIvbGliL2pxdWVyeS0xLjQuNC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGYxMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvc2Vhc29ja3Mvc3JjL3dzX3Rlc3Rfd2ViL2xpYi9qcXVlcnktMS40LjQuanMKQEAgLTAsMCArMSw3MTc5IEBACisvKiEKKyAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNC40CisgKiBodHRwOi8vanF1ZXJ5LmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZworICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCisgKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCisgKgorICogSW5jbHVkZXMgU2l6emxlLmpzCisgKiBodHRwOi8vc2l6emxlanMuY29tLworICogQ29weXJpZ2h0IDIwMTAsIFRoZSBEb2pvIEZvdW5kYXRpb24KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KKyAqCisgKiBEYXRlOiBUaHUgTm92IDExIDE5OjA0OjUzIDIwMTAgLTA1MDAKKyAqLworKGZ1bmN0aW9uKCB3aW5kb3csIHVuZGVmaW5lZCApIHsKKworLy8gVXNlIHRoZSBjb3JyZWN0IGRvY3VtZW50IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5kYm94KQordmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50OwordmFyIGpRdWVyeSA9IChmdW5jdGlvbigpIHsKKworLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKK3ZhciBqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJworCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOworCX0sCisKKwkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKKwlfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKKworCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisJXyQgPSB3aW5kb3cuJCwKKworCS8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQorCXJvb3RqUXVlcnksCisKKwkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncyBvciBJRCBzdHJpbmdzCisJLy8gKGJvdGggb2Ygd2hpY2ggd2Ugb3B0aW1pemUgZm9yKQorCXF1aWNrRXhwciA9IC9eKD86W148XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSspJCkvLAorCisJLy8gSXMgaXQgYSBzaW1wbGUgc2VsZWN0b3IKKwlpc1NpbXBsZSA9IC9eLlteOiNcW1wuLF0qJC8sCisKKwkvLyBDaGVjayBpZiBhIHN0cmluZyBoYXMgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gaXQKKwlybm90d2hpdGUgPSAvXFMvLAorCXJ3aGl0ZSA9IC9ccy8sCisKKwkvLyBVc2VkIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlCisJdHJpbUxlZnQgPSAvXlxzKy8sCisJdHJpbVJpZ2h0ID0gL1xzKyQvLAorCisJLy8gQ2hlY2sgZm9yIG5vbi13b3JkIGNoYXJhY3RlcnMKKwlybm9ud29yZCA9IC9cVy8sCisKKwkvLyBDaGVjayBmb3IgZGlnaXRzCisJcmRpZ2l0ID0gL1xkLywKKworCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKKwlyc2luZ2xlVGFnID0gL148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLywKKworCS8vIEpTT04gUmVnRXhwCisJcnZhbGlkY2hhcnMgPSAvXltcXSw6e31cc10qJC8sCisJcnZhbGlkZXNjYXBlID0gL1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZywKKwlydmFsaWR0b2tlbnMgPSAvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csCisJcnZhbGlkYnJhY2VzID0gLyg/Ol58OnwsKSg/OlxzKlxbKSsvZywKKworCS8vIFVzZXJhZ2VudCBSZWdFeHAKKwlyd2Via2l0ID0gLyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8sCisJcm9wZXJhID0gLyhvcGVyYSkoPzouKnZlcnNpb24pP1sgXC9dKFtcdy5dKykvLAorCXJtc2llID0gLyhtc2llKSAoW1x3Ll0rKS8sCisJcm1vemlsbGEgPSAvKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLAorCisJLy8gS2VlcCBhIFVzZXJBZ2VudCBzdHJpbmcgZm9yIHVzZSB3aXRoIGpRdWVyeS5icm93c2VyCisJdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCwKKworCS8vIEZvciBtYXRjaGluZyB0aGUgZW5naW5lIGFuZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyCisJYnJvd3Nlck1hdGNoLAorCQorCS8vIEhhcyB0aGUgcmVhZHkgZXZlbnRzIGFscmVhZHkgYmVlbiBib3VuZD8KKwlyZWFkeUJvdW5kID0gZmFsc2UsCisJCisJLy8gVGhlIGZ1bmN0aW9ucyB0byBleGVjdXRlIG9uIERPTSByZWFkeQorCXJlYWR5TGlzdCA9IFtdLAorCisJLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIKKwlET01Db250ZW50TG9hZGVkLAorCisJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcworCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKKwloYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LAorCXB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwKKwlzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwKKwl0cmltID0gU3RyaW5nLnByb3RvdHlwZS50cmltLAorCWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwKKwkKKwkvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWlycworCWNsYXNzMnR5cGUgPSB7fTsKKworalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKKwlpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCXZhciBtYXRjaCwgZWxlbSwgcmV0LCBkb2M7CisKKwkJLy8gSGFuZGxlICQoIiIpLCAkKG51bGwpLCBvciAkKHVuZGVmaW5lZCkKKwkJaWYgKCAhc2VsZWN0b3IgKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCS8vIEhhbmRsZSAkKERPTUVsZW1lbnQpCisJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CisJCQl0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7CisJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQkKKwkJLy8gVGhlIGJvZHkgZWxlbWVudCBvbmx5IGV4aXN0cyBvbmNlLCBvcHRpbWl6ZSBmaW5kaW5nIGl0CisJCWlmICggc2VsZWN0b3IgPT09ICJib2R5IiAmJiAhY29udGV4dCAmJiBkb2N1bWVudC5ib2R5ICkgeworCQkJdGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7CisJCQl0aGlzWzBdID0gZG9jdW1lbnQuYm9keTsKKwkJCXRoaXMuc2VsZWN0b3IgPSAiYm9keSI7CisJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKKwkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0aCBIVE1MIHN0cmluZyBvciBhbiBJRD8KKwkJCW1hdGNoID0gcXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7CisKKwkJCS8vIFZlcmlmeSBhIG1hdGNoLCBhbmQgdGhhdCBubyBjb250ZXh0IHdhcyBzcGVjaWZpZWQgZm9yICNpZAorCQkJaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkgeworCisJCQkJLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCisJCQkJaWYgKCBtYXRjaFsxXSApIHsKKwkJCQkJZG9jID0gKGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50KTsKKworCQkJCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZworCQkJCQkvLyBqdXN0IGRvIGEgY3JlYXRlRWxlbWVudCBhbmQgc2tpcCB0aGUgcmVzdAorCQkJCQlyZXQgPSByc2luZ2xlVGFnLmV4ZWMoIHNlbGVjdG9yICk7CisKKwkJCQkJaWYgKCByZXQgKSB7CisJCQkJCQlpZiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CisJCQkJCQkJc2VsZWN0b3IgPSBbIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIHJldFsxXSApIF07CisJCQkJCQkJalF1ZXJ5LmZuLmF0dHIuY2FsbCggc2VsZWN0b3IsIGNvbnRleHQsIHRydWUgKTsKKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlzZWxlY3RvciA9IFsgZG9jLmNyZWF0ZUVsZW1lbnQoIHJldFsxXSApIF07CisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIG1hdGNoWzFdIF0sIFsgZG9jIF0gKTsKKwkJCQkJCXNlbGVjdG9yID0gKHJldC5jYWNoZWFibGUgPyByZXQuZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpIDogcmV0LmZyYWdtZW50KS5jaGlsZE5vZGVzOworCQkJCQl9CisJCQkJCQorCQkJCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCB0aGlzLCBzZWxlY3RvciApOworCQkJCQkKKwkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCisJCQkJfSBlbHNlIHsKKwkJCQkJZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApOworCisJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKKwkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKKwkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCisJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKKwkJCQkJCWlmICggZWxlbS5pZCAhPT0gbWF0Y2hbMl0gKSB7CisJCQkJCQkJcmV0dXJuIHJvb3RqUXVlcnkuZmluZCggc2VsZWN0b3IgKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gT3RoZXJ3aXNlLCB3ZSBpbmplY3QgdGhlIGVsZW1lbnQgZGlyZWN0bHkgaW50byB0aGUgalF1ZXJ5IG9iamVjdAorCQkJCQkJdGhpcy5sZW5ndGggPSAxOworCQkJCQkJdGhpc1swXSA9IGVsZW07CisJCQkJCX0KKworCQkJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKKwkJCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9CisKKwkJCS8vIEhBTkRMRTogJCgiVEFHIikKKwkJCX0gZWxzZSBpZiAoICFjb250ZXh0ICYmICFybm9ud29yZC50ZXN0KCBzZWxlY3RvciApICkgeworCQkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKwkJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKKwkJCQlzZWxlY3RvciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApOworCQkJCXJldHVybiBqUXVlcnkubWVyZ2UoIHRoaXMsIHNlbGVjdG9yICk7CisKKwkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCisJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKKwkJCQlyZXR1cm4gKGNvbnRleHQgfHwgcm9vdGpRdWVyeSkuZmluZCggc2VsZWN0b3IgKTsKKworCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCisJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGpRdWVyeSggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CisJCQl9CisKKwkJLy8gSEFORExFOiAkKGZ1bmN0aW9uKQorCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKKwkJfSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7CisJCQlyZXR1cm4gcm9vdGpRdWVyeS5yZWFkeSggc2VsZWN0b3IgKTsKKwkJfQorCisJCWlmIChzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkKSB7CisJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CisJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0OworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yLCB0aGlzICk7CisJfSwKKworCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKKwlzZWxlY3RvcjogIiIsCisKKwkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCisJanF1ZXJ5OiAiMS40LjQiLAorCisJLy8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwCisJbGVuZ3RoOiAwLAorCisJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKKwlzaXplOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubGVuZ3RoOworCX0sCisKKwl0b0FycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMsIDAgKTsKKwl9LAorCisJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgorCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CisJZ2V0OiBmdW5jdGlvbiggbnVtICkgeworCQlyZXR1cm4gbnVtID09IG51bGwgPworCisJCQkvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CisJCQl0aGlzLnRvQXJyYXkoKSA6CisKKwkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKKwkJCSggbnVtIDwgMCA/IHRoaXMuc2xpY2UobnVtKVsgMCBdIDogdGhpc1sgbnVtIF0gKTsKKwl9LAorCisJLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjaworCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQorCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zLCBuYW1lLCBzZWxlY3RvciApIHsKKwkJLy8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXQKKwkJdmFyIHJldCA9IGpRdWVyeSgpOworCisJCWlmICggalF1ZXJ5LmlzQXJyYXkoIGVsZW1zICkgKSB7CisJCQlwdXNoLmFwcGx5KCByZXQsIGVsZW1zICk7CisJCQorCQl9IGVsc2UgeworCQkJalF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW1zICk7CisJCX0KKworCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQorCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CisKKwkJcmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CisKKwkJaWYgKCBuYW1lID09PSAiZmluZCIgKSB7CisJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIikgKyBzZWxlY3RvcjsKKwkJfSBlbHNlIGlmICggbmFtZSApIHsKKwkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAiLiIgKyBuYW1lICsgIigiICsgc2VsZWN0b3IgKyAiKSI7CisJCX0KKworCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAorCQlyZXR1cm4gcmV0OworCX0sCisKKwkvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LgorCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCisJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQorCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHsKKwkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOworCX0sCisJCisJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKKwkJLy8gQXR0YWNoIHRoZSBsaXN0ZW5lcnMKKwkJalF1ZXJ5LmJpbmRSZWFkeSgpOworCisJCS8vIElmIHRoZSBET00gaXMgYWxyZWFkeSByZWFkeQorCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgeworCQkJLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHkKKwkJCWZuLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKKworCQkvLyBPdGhlcndpc2UsIHJlbWVtYmVyIHRoZSBmdW5jdGlvbiBmb3IgbGF0ZXIKKwkJfSBlbHNlIGlmICggcmVhZHlMaXN0ICkgeworCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgd2FpdCBsaXN0CisJCQlyZWFkeUxpc3QucHVzaCggZm4gKTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisJCisJZXE6IGZ1bmN0aW9uKCBpICkgeworCQlyZXR1cm4gaSA9PT0gLTEgPworCQkJdGhpcy5zbGljZSggaSApIDoKKwkJCXRoaXMuc2xpY2UoIGksICtpICsgMSApOworCX0sCisKKwlmaXJzdDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmVxKCAwICk7CisJfSwKKworCWxhc3Q6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5lcSggLTEgKTsKKwl9LAorCisJc2xpY2U6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKKwkJCSJzbGljZSIsIHNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikgKTsKKwl9LAorCisJbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisJCX0pKTsKKwl9LAorCQorCWVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgalF1ZXJ5KG51bGwpOworCX0sCisKKwkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCisJcHVzaDogcHVzaCwKKwlzb3J0OiBbXS5zb3J0LAorCXNwbGljZTogW10uc3BsaWNlCit9OworCisvLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCitqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CisKK2pRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7CisJIHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKKwkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAorCQlpID0gMSwKKwkJbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwKKwkJZGVlcCA9IGZhbHNlOworCisJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgorCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgeworCQlkZWVwID0gdGFyZ2V0OworCQl0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CisJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKKwkJaSA9IDI7CisJfQorCisJLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCisJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApIHsKKwkJdGFyZ2V0ID0ge307CisJfQorCisJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCisJaWYgKCBsZW5ndGggPT09IGkgKSB7CisJCXRhcmdldCA9IHRoaXM7CisJCS0taTsKKwl9CisKKwlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcworCQlpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKSB7CisJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CisJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CisJCQkJc3JjID0gdGFyZ2V0WyBuYW1lIF07CisJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKKworCQkJCS8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKKwkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCisJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdChjb3B5KSB8fCAoY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheShjb3B5KSkgKSApIHsKKwkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKKwkJCQkJCWNvcHlJc0FycmF5ID0gZmFsc2U7CisJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNBcnJheShzcmMpID8gc3JjIDogW107CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTsKKwkJCQkJfQorCisJCQkJCS8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbQorCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CisKKwkJCQkvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzCisJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgeworCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3QKKwlyZXR1cm4gdGFyZ2V0OworfTsKKworalF1ZXJ5LmV4dGVuZCh7CisJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CisJCXdpbmRvdy4kID0gXyQ7CisKKwkJaWYgKCBkZWVwICkgeworCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5OworCX0sCisJCisJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KKwlpc1JlYWR5OiBmYWxzZSwKKworCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKKwkvLyB0aGUgcmVhZHkgZXZlbnQgZmlyZXMuIFNlZSAjNjc4MQorCXJlYWR5V2FpdDogMSwKKwkKKwkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CisJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgeworCQkvLyBBIHRoaXJkLXBhcnR5IGlzIHB1c2hpbmcgdGhlIHJlYWR5IGV2ZW50IGZvcndhcmRzCisJCWlmICggd2FpdCA9PT0gdHJ1ZSApIHsKKwkJCWpRdWVyeS5yZWFkeVdhaXQtLTsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgbm90IGFscmVhZHkgbG9hZGVkCisJCWlmICggIWpRdWVyeS5yZWFkeVdhaXQgfHwgKHdhaXQgIT09IHRydWUgJiYgIWpRdWVyeS5pc1JlYWR5KSApIHsKKwkJCS8vIE1ha2Ugc3VyZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2UgSUUgZ2V0cyBhIGxpdHRsZSBvdmVyemVhbG91cyAodGlja2V0ICM1NDQzKS4KKwkJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CisJCQkJcmV0dXJuIHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSwgMSApOworCQkJfQorCisJCQkvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKwkJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKKworCQkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKKwkJCWlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQorCQkJaWYgKCByZWFkeUxpc3QgKSB7CisJCQkJLy8gRXhlY3V0ZSBhbGwgb2YgdGhlbQorCQkJCXZhciBmbiwKKwkJCQkJaSA9IDAsCisJCQkJCXJlYWR5ID0gcmVhZHlMaXN0OworCisJCQkJLy8gUmVzZXQgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zCisJCQkJcmVhZHlMaXN0ID0gbnVsbDsKKworCQkJCXdoaWxlICggKGZuID0gcmVhZHlbIGkrKyBdKSApIHsKKwkJCQkJZm4uY2FsbCggZG9jdW1lbnQsIGpRdWVyeSApOworCQkJCX0KKworCQkJCS8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50cworCQkJCWlmICggalF1ZXJ5LmZuLnRyaWdnZXIgKSB7CisJCQkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKCAicmVhZHkiICkudW5iaW5kKCAicmVhZHkiICk7CisJCQkJfQorCQkJfQorCQl9CisJfSwKKwkKKwliaW5kUmVhZHk6IGZ1bmN0aW9uKCkgeworCQlpZiAoIHJlYWR5Qm91bmQgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlyZWFkeUJvdW5kID0gdHJ1ZTsKKworCQkvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUKKwkJLy8gYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KKwkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQkJLy8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5CisJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CisJCX0KKworCQkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CisJCWlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKKwkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKKwkJCQorCQkJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKwkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGpRdWVyeS5yZWFkeSwgZmFsc2UgKTsKKworCQkvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCisJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgeworCQkJLy8gZW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLAorCQkJLy8gbWF5YmUgbGF0ZSBidXQgc2FmZSBhbHNvIGZvciBpZnJhbWVzCisJCQlkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgRE9NQ29udGVudExvYWRlZCk7CisJCQkKKwkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCisJCQl3aW5kb3cuYXR0YWNoRXZlbnQoICJvbmxvYWQiLCBqUXVlcnkucmVhZHkgKTsKKworCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCisJCQkvLyBjb250aW51YWxseSBjaGVjayB0byBzZWUgaWYgdGhlIGRvY3VtZW50IGlzIHJlYWR5CisJCQl2YXIgdG9wbGV2ZWwgPSBmYWxzZTsKKworCQkJdHJ5IHsKKwkJCQl0b3BsZXZlbCA9IHdpbmRvdy5mcmFtZUVsZW1lbnQgPT0gbnVsbDsKKwkJCX0gY2F0Y2goZSkge30KKworCQkJaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgJiYgdG9wbGV2ZWwgKSB7CisJCQkJZG9TY3JvbGxDaGVjaygpOworCQkJfQorCQl9CisJfSwKKworCS8vIFNlZSB0ZXN0L3VuaXQvY29yZS5qcyBmb3IgZGV0YWlscyBjb25jZXJuaW5nIGlzRnVuY3Rpb24uCisJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAorCS8vIGFyZW4ndCBzdXBwb3J0ZWQuIFRoZXkgcmV0dXJuIGZhbHNlIG9uIElFICgjMjk2OCkuCisJaXNGdW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7CisJfSwKKworCWlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJhcnJheSI7CisJfSwKKworCS8vIEEgY3J1ZGUgd2F5IG9mIGRldGVybWluaW5nIGlmIGFuIG9iamVjdCBpcyBhIHdpbmRvdworCWlzV2luZG93OiBmdW5jdGlvbiggb2JqICkgeworCQlyZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmICJzZXRJbnRlcnZhbCIgaW4gb2JqOworCX0sCisKKwlpc05hTjogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIG9iaiA9PSBudWxsIHx8ICFyZGlnaXQudGVzdCggb2JqICkgfHwgaXNOYU4oIG9iaiApOworCX0sCisKKwl0eXBlOiBmdW5jdGlvbiggb2JqICkgeworCQlyZXR1cm4gb2JqID09IG51bGwgPworCQkJU3RyaW5nKCBvYmogKSA6CisJCQljbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKG9iaikgXSB8fCAib2JqZWN0IjsKKwl9LAorCisJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKKwkJLy8gTXVzdCBiZSBhbiBPYmplY3QuCisJCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgorCQkvLyBNYWtlIHN1cmUgdGhhdCBET00gbm9kZXMgYW5kIHdpbmRvdyBvYmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMgd2VsbAorCQlpZiAoICFvYmogfHwgalF1ZXJ5LnR5cGUob2JqKSAhPT0gIm9iamVjdCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCS8vIE5vdCBvd24gY29uc3RydWN0b3IgcHJvcGVydHkgbXVzdCBiZSBPYmplY3QKKwkJaWYgKCBvYmouY29uc3RydWN0b3IgJiYKKwkJCSFoYXNPd24uY2FsbChvYmosICJjb25zdHJ1Y3RvciIpICYmCisJCQkhaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKSApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJLy8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsCisJCS8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgorCQorCQl2YXIga2V5OworCQlmb3IgKCBrZXkgaW4gb2JqICkge30KKwkJCisJCXJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBoYXNPd24uY2FsbCggb2JqLCBrZXkgKTsKKwl9LAorCisJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKKwkJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0sCisJCisJZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7CisJCXRocm93IG1zZzsKKwl9LAorCQorCXBhcnNlSlNPTjogZnVuY3Rpb24oIGRhdGEgKSB7CisJCWlmICggdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciIHx8ICFkYXRhICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvLyBNYWtlIHN1cmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQgKElFIGNhbid0IGhhbmRsZSBpdCkKKwkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CisJCQorCQkvLyBNYWtlIHN1cmUgdGhlIGluY29taW5nIGRhdGEgaXMgYWN0dWFsIEpTT04KKwkJLy8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8vanNvbi5vcmcvanNvbjIuanMKKwkJaWYgKCBydmFsaWRjaGFycy50ZXN0KGRhdGEucmVwbGFjZShydmFsaWRlc2NhcGUsICJAIikKKwkJCS5yZXBsYWNlKHJ2YWxpZHRva2VucywgIl0iKQorCQkJLnJlcGxhY2UocnZhbGlkYnJhY2VzLCAiIikpICkgeworCisJCQkvLyBUcnkgdG8gdXNlIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3QKKwkJCXJldHVybiB3aW5kb3cuSlNPTiAmJiB3aW5kb3cuSlNPTi5wYXJzZSA/CisJCQkJd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKSA6CisJCQkJKG5ldyBGdW5jdGlvbigicmV0dXJuICIgKyBkYXRhKSkoKTsKKworCQl9IGVsc2UgeworCQkJalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBKU09OOiAiICsgZGF0YSApOworCQl9CisJfSwKKworCW5vb3A6IGZ1bmN0aW9uKCkge30sCisKKwkvLyBFdmFsdWxhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHQKKwlnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKKwkJaWYgKCBkYXRhICYmIHJub3R3aGl0ZS50ZXN0KGRhdGEpICkgeworCQkJLy8gSW5zcGlyZWQgYnkgY29kZSBieSBBbmRyZWEgR2lhbW1hcmNoaQorCQkJLy8gaHR0cDovL3dlYnJlZmxlY3Rpb24uYmxvZ3Nwb3QuY29tLzIwMDcvMDgvZ2xvYmFsLXNjb3BlLWV2YWx1YXRpb24tYW5kLWRvbS5odG1sCisJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAorCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCisJCQlzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOworCisJCQlpZiAoIGpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgKSB7CisJCQkJc2NyaXB0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggZGF0YSApICk7CisJCQl9IGVsc2UgeworCQkJCXNjcmlwdC50ZXh0ID0gZGF0YTsKKwkJCX0KKworCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KKwkJCS8vIFRoaXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkpLgorCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CisJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKwkJfQorCX0sCisKKwlub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gbmFtZS50b1VwcGVyQ2FzZSgpOworCX0sCisKKwkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisJZWFjaDogZnVuY3Rpb24oIG9iamVjdCwgY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXZhciBuYW1lLCBpID0gMCwKKwkJCWxlbmd0aCA9IG9iamVjdC5sZW5ndGgsCisJCQlpc09iaiA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0Z1bmN0aW9uKG9iamVjdCk7CisKKwkJaWYgKCBhcmdzICkgeworCQkJaWYgKCBpc09iaiApIHsKKwkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApIHsKKwkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKKwkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBpKysgXSwgYXJncyApID09PSBmYWxzZSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCS8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCisJCX0gZWxzZSB7CisJCQlpZiAoIGlzT2JqICkgeworCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgeworCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgbmFtZSBdLCBuYW1lLCBvYmplY3RbIG5hbWUgXSApID09PSBmYWxzZSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIgdmFsdWUgPSBvYmplY3RbMF07CisJCQkJCWkgPCBsZW5ndGggJiYgY2FsbGJhY2suY2FsbCggdmFsdWUsIGksIHZhbHVlICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVjdFsrK2ldICkge30KKwkJCX0KKwkJfQorCisJCXJldHVybiBvYmplY3Q7CisJfSwKKworCS8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGUKKwl0cmltOiB0cmltID8KKwkJZnVuY3Rpb24oIHRleHQgKSB7CisJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KKwkJCQkiIiA6CisJCQkJdHJpbS5jYWxsKCB0ZXh0ICk7CisJCX0gOgorCisJCS8vIE90aGVyd2lzZSB1c2Ugb3VyIG93biB0cmltbWluZyBmdW5jdGlvbmFsaXR5CisJCWZ1bmN0aW9uKCB0ZXh0ICkgeworCQkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CisJCQkJIiIgOgorCQkJCXRleHQudG9TdHJpbmcoKS5yZXBsYWNlKCB0cmltTGVmdCwgIiIgKS5yZXBsYWNlKCB0cmltUmlnaHQsICIiICk7CisJCX0sCisKKwkvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyYXksIHJlc3VsdHMgKSB7CisJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOworCisJCWlmICggYXJyYXkgIT0gbnVsbCApIHsKKwkJCS8vIFRoZSB3aW5kb3csIHN0cmluZ3MgKGFuZCBmdW5jdGlvbnMpIGFsc28gaGF2ZSAnbGVuZ3RoJworCQkJLy8gVGhlIGV4dHJhIHR5cGVvZiBmdW5jdGlvbiBjaGVjayBpcyB0byBwcmV2ZW50IGNyYXNoZXMKKwkJCS8vIGluIFNhZmFyaSAyIChTZWU6ICMzMDM5KQorCQkJLy8gVHdlYWtlZCBsb2dpYyBzbGlnaHRseSB0byBoYW5kbGUgQmxhY2tiZXJyeSA0LjcgUmVnRXhwIGlzc3VlcyAjNjkzMAorCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZShhcnJheSk7CisKKwkJCWlmICggYXJyYXkubGVuZ3RoID09IG51bGwgfHwgdHlwZSA9PT0gInN0cmluZyIgfHwgdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCB0eXBlID09PSAicmVnZXhwIiB8fCBqUXVlcnkuaXNXaW5kb3coIGFycmF5ICkgKSB7CisJCQkJcHVzaC5jYWxsKCByZXQsIGFycmF5ICk7CisJCQl9IGVsc2UgeworCQkJCWpRdWVyeS5tZXJnZSggcmV0LCBhcnJheSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFycmF5ICkgeworCQlpZiAoIGFycmF5LmluZGV4T2YgKSB7CisJCQlyZXR1cm4gYXJyYXkuaW5kZXhPZiggZWxlbSApOworCQl9CisKKwkJZm9yICggdmFyIGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCisJCXJldHVybiAtMTsKKwl9LAorCisJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgeworCQl2YXIgaSA9IGZpcnN0Lmxlbmd0aCwKKwkJCWogPSAwOworCisJCWlmICggdHlwZW9mIHNlY29uZC5sZW5ndGggPT09ICJudW1iZXIiICkgeworCQkJZm9yICggdmFyIGwgPSBzZWNvbmQubGVuZ3RoOyBqIDwgbDsgaisrICkgeworCQkJCWZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdOworCQkJfQorCQkKKwkJfSBlbHNlIHsKKwkJCXdoaWxlICggc2Vjb25kW2pdICE9PSB1bmRlZmluZWQgKSB7CisJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKKwkJCX0KKwkJfQorCisJCWZpcnN0Lmxlbmd0aCA9IGk7CisKKwkJcmV0dXJuIGZpcnN0OworCX0sCisKKwlncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CisJCXZhciByZXQgPSBbXSwgcmV0VmFsOworCQlpbnYgPSAhIWludjsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCisJCS8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQlyZXRWYWwgPSAhIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CisJCQlpZiAoIGludiAhPT0gcmV0VmFsICkgeworCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwkvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKKwkJdmFyIHJldCA9IFtdLCB2YWx1ZTsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKKwkJLy8gbmV3IHZhbHVlIChvciB2YWx1ZXMpLgorCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CisKKwkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKKwkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKKwl9LAorCisJLy8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCisJZ3VpZDogMSwKKworCXByb3h5OiBmdW5jdGlvbiggZm4sIHByb3h5LCB0aGlzT2JqZWN0ICkgeworCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgKSB7CisJCQlpZiAoIHR5cGVvZiBwcm94eSA9PT0gInN0cmluZyIgKSB7CisJCQkJdGhpc09iamVjdCA9IGZuOworCQkJCWZuID0gdGhpc09iamVjdFsgcHJveHkgXTsKKwkJCQlwcm94eSA9IHVuZGVmaW5lZDsKKworCQkJfSBlbHNlIGlmICggcHJveHkgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBwcm94eSApICkgeworCQkJCXRoaXNPYmplY3QgPSBwcm94eTsKKwkJCQlwcm94eSA9IHVuZGVmaW5lZDsKKwkJCX0KKwkJfQorCisJCWlmICggIXByb3h5ICYmIGZuICkgeworCQkJcHJveHkgPSBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4gZm4uYXBwbHkoIHRoaXNPYmplY3QgfHwgdGhpcywgYXJndW1lbnRzICk7CisJCQl9OworCQl9CisKKwkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCisJCWlmICggZm4gKSB7CisJCQlwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHkuZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOworCQl9CisKKwkJLy8gU28gcHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFuIGFyZ3VtZW50CisJCXJldHVybiBwcm94eTsKKwl9LAorCisJLy8gTXV0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyB0byBhIGNvbGxlY3Rpb24KKwkvLyBUaGUgdmFsdWUvcyBjYW4gYmUgb3B0aW9uYWxseSBieSBleGVjdXRlZCBpZiBpdHMgYSBmdW5jdGlvbgorCWFjY2VzczogZnVuY3Rpb24oIGVsZW1zLCBrZXksIHZhbHVlLCBleGVjLCBmbiwgcGFzcyApIHsKKwkJdmFyIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKKwkKKwkJLy8gU2V0dGluZyBtYW55IGF0dHJpYnV0ZXMKKwkJaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKKwkJCWZvciAoIHZhciBrIGluIGtleSApIHsKKwkJCQlqUXVlcnkuYWNjZXNzKCBlbGVtcywgaywga2V5W2tdLCBleGVjLCBmbiwgdmFsdWUgKTsKKwkJCX0KKwkJCXJldHVybiBlbGVtczsKKwkJfQorCQorCQkvLyBTZXR0aW5nIG9uZSBhdHRyaWJ1dGUKKwkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCQkJLy8gT3B0aW9uYWxseSwgZnVuY3Rpb24gdmFsdWVzIGdldCBleGVjdXRlZCBpZiBleGVjIGlzIHRydWUKKwkJCWV4ZWMgPSAhcGFzcyAmJiBleGVjICYmIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKTsKKwkJCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJCQlmbiggZWxlbXNbaV0sIGtleSwgZXhlYyA/IHZhbHVlLmNhbGwoIGVsZW1zW2ldLCBpLCBmbiggZWxlbXNbaV0sIGtleSApICkgOiB2YWx1ZSwgcGFzcyApOworCQkJfQorCQkKKwkJCXJldHVybiBlbGVtczsKKwkJfQorCQorCQkvLyBHZXR0aW5nIGFuIGF0dHJpYnV0ZQorCQlyZXR1cm4gbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IHVuZGVmaW5lZDsKKwl9LAorCisJbm93OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisJfSwKKworCS8vIFVzZSBvZiBqUXVlcnkuYnJvd3NlciBpcyBmcm93bmVkIHVwb24uCisJLy8gTW9yZSBkZXRhaWxzOiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1V0aWxpdGllcy9qUXVlcnkuYnJvd3NlcgorCXVhTWF0Y2g6IGZ1bmN0aW9uKCB1YSApIHsKKwkJdWEgPSB1YS50b0xvd2VyQ2FzZSgpOworCisJCXZhciBtYXRjaCA9IHJ3ZWJraXQuZXhlYyggdWEgKSB8fAorCQkJcm9wZXJhLmV4ZWMoIHVhICkgfHwKKwkJCXJtc2llLmV4ZWMoIHVhICkgfHwKKwkJCXVhLmluZGV4T2YoImNvbXBhdGlibGUiKSA8IDAgJiYgcm1vemlsbGEuZXhlYyggdWEgKSB8fAorCQkJW107CisKKwkJcmV0dXJuIHsgYnJvd3NlcjogbWF0Y2hbMV0gfHwgIiIsIHZlcnNpb246IG1hdGNoWzJdIHx8ICIwIiB9OworCX0sCisKKwlicm93c2VyOiB7fQorfSk7CisKKy8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcAoralF1ZXJ5LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIG5hbWUpIHsKKwljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOworfSk7CisKK2Jyb3dzZXJNYXRjaCA9IGpRdWVyeS51YU1hdGNoKCB1c2VyQWdlbnQgKTsKK2lmICggYnJvd3Nlck1hdGNoLmJyb3dzZXIgKSB7CisJalF1ZXJ5LmJyb3dzZXJbIGJyb3dzZXJNYXRjaC5icm93c2VyIF0gPSB0cnVlOworCWpRdWVyeS5icm93c2VyLnZlcnNpb24gPSBicm93c2VyTWF0Y2gudmVyc2lvbjsKK30KKworLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5icm93c2VyLndlYmtpdCBpbnN0ZWFkCitpZiAoIGpRdWVyeS5icm93c2VyLndlYmtpdCApIHsKKwlqUXVlcnkuYnJvd3Nlci5zYWZhcmkgPSB0cnVlOworfQorCitpZiAoIGluZGV4T2YgKSB7CisJalF1ZXJ5LmluQXJyYXkgPSBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CisJCXJldHVybiBpbmRleE9mLmNhbGwoIGFycmF5LCBlbGVtICk7CisJfTsKK30KKworLy8gVmVyaWZ5IHRoYXQgXHMgbWF0Y2hlcyBub24tYnJlYWtpbmcgc3BhY2VzCisvLyAoSUUgZmFpbHMgb24gdGhpcyB0ZXN0KQoraWYgKCAhcndoaXRlLnRlc3QoICJceEEwIiApICkgeworCXRyaW1MZWZ0ID0gL15bXHNceEEwXSsvOworCXRyaW1SaWdodCA9IC9bXHNceEEwXSskLzsKK30KKworLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlCityb290alF1ZXJ5ID0galF1ZXJ5KGRvY3VtZW50KTsKKworLy8gQ2xlYW51cCBmdW5jdGlvbnMgZm9yIHRoZSBkb2N1bWVudCByZWFkeSBtZXRob2QKK2lmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKKwlET01Db250ZW50TG9hZGVkID0gZnVuY3Rpb24oKSB7CisJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKKwkJalF1ZXJ5LnJlYWR5KCk7CisJfTsKKworfSBlbHNlIGlmICggZG9jdW1lbnQuYXR0YWNoRXZlbnQgKSB7CisJRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkgeworCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCisJCWlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKKwkJCWRvY3VtZW50LmRldGFjaEV2ZW50KCAib25yZWFkeXN0YXRlY2hhbmdlIiwgRE9NQ29udGVudExvYWRlZCApOworCQkJalF1ZXJ5LnJlYWR5KCk7CisJCX0KKwl9OworfQorCisvLyBUaGUgRE9NIHJlYWR5IGNoZWNrIGZvciBJbnRlcm5ldCBFeHBsb3JlcgorZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHsKKwlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgeworCQlyZXR1cm47CisJfQorCisJdHJ5IHsKKwkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKKwkJLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8KKwkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iik7CisJfSBjYXRjaChlKSB7CisJCXNldFRpbWVvdXQoIGRvU2Nyb2xsQ2hlY2ssIDEgKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucworCWpRdWVyeS5yZWFkeSgpOworfQorCisvLyBFeHBvc2UgalF1ZXJ5IHRvIHRoZSBnbG9iYWwgb2JqZWN0CityZXR1cm4gKHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeSk7CisKK30pKCk7CisKKworKGZ1bmN0aW9uKCkgeworCisJalF1ZXJ5LnN1cHBvcnQgPSB7fTsKKworCXZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAorCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSwKKwkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCisJCWlkID0gInNjcmlwdCIgKyBqUXVlcnkubm93KCk7CisKKwlkaXYuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwlkaXYuaW5uZXJIVE1MID0gIiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J2NvbG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iOworCisJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAorCQlhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sCisJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLAorCQlvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpICk7CisKKwkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CisJaWYgKCAhYWxsIHx8ICFhbGwubGVuZ3RoIHx8ICFhICkgeworCQlyZXR1cm47CisJfQorCisJalF1ZXJ5LnN1cHBvcnQgPSB7CisJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKKwkJbGVhZGluZ1doaXRlc3BhY2U6IGRpdi5maXJzdENoaWxkLm5vZGVUeXBlID09PSAzLAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRib2R5IGVsZW1lbnRzIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGluc2VydGVkCisJCS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXMKKwkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IGxpbmsgZWxlbWVudHMgZ2V0IHNlcmlhbGl6ZWQgY29ycmVjdGx5IGJ5IGlubmVySFRNTAorCQkvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCisJCWh0bWxTZXJpYWxpemU6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLAorCisJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKKwkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVkKQorCQlzdHlsZTogL3JlZC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKKworCQkvLyBNYWtlIHN1cmUgdGhhdCBVUkxzIGFyZW4ndCBtYW5pcHVsYXRlZAorCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQorCQlocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwKKworCQkvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzCisJCS8vIChJRSB1c2VzIGZpbHRlciBpbnN0ZWFkKQorCQkvLyBVc2UgYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIFdlYktpdCBpc3N1ZS4gU2VlICM1MTQ1CisJCW9wYWNpdHk6IC9eMC41NSQvLnRlc3QoIGEuc3R5bGUub3BhY2l0eSApLAorCisJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKKwkJLy8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KQorCQljc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgYSBjaGVja2JveAorCQkvLyB0aGF0IGl0IGRlZmF1bHRzIHRvICJvbiIuCisJCS8vIChXZWJLaXQgZGVmYXVsdHMgdG8gIiIgaW5zdGVhZCkKKwkJY2hlY2tPbjogZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLnZhbHVlID09PSAib24iLAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IGEgc2VsZWN0ZWQtYnktZGVmYXVsdCBvcHRpb24gaGFzIGEgd29ya2luZyBzZWxlY3RlZCBwcm9wZXJ0eS4KKwkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byBmYWxzZSBpbnN0ZWFkIG9mIHRydWUsIElFIHRvbywgaWYgaXQncyBpbiBhbiBvcHRncm91cCkKKwkJb3B0U2VsZWN0ZWQ6IG9wdC5zZWxlY3RlZCwKKworCQkvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKKwkJZGVsZXRlRXhwYW5kbzogdHJ1ZSwKKwkJb3B0RGlzYWJsZWQ6IGZhbHNlLAorCQljaGVja0Nsb25lOiBmYWxzZSwKKwkJc2NyaXB0RXZhbDogZmFsc2UsCisJCW5vQ2xvbmVFdmVudDogdHJ1ZSwKKwkJYm94TW9kZWw6IG51bGwsCisJCWlubGluZUJsb2NrTmVlZHNMYXlvdXQ6IGZhbHNlLAorCQlzaHJpbmtXcmFwQmxvY2tzOiBmYWxzZSwKKwkJcmVsaWFibGVIaWRkZW5PZmZzZXRzOiB0cnVlCisJfTsKKworCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJrZWQgYXMgZGlzYWJsZWQKKwkvLyAoV2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlhYmxlZCkKKwlzZWxlY3QuZGlzYWJsZWQgPSB0cnVlOworCWpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKKworCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJdHJ5IHsKKwkJc2NyaXB0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggIndpbmRvdy4iICsgaWQgKyAiPTE7IiApICk7CisJfSBjYXRjaChlKSB7fQorCisJcm9vdC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgcm9vdC5maXJzdENoaWxkICk7CisKKwkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhlY3V0aW9uIG9mIGNvZGUgd29ya3MgYnkgaW5qZWN0aW5nIGEgc2NyaXB0CisJLy8gdGFnIHdpdGggYXBwZW5kQ2hpbGQvY3JlYXRlVGV4dE5vZGUKKwkvLyAoSUUgZG9lc24ndCBzdXBwb3J0IHRoaXMsIGZhaWxzLCBhbmQgdXNlcyAudGV4dCBpbnN0ZWFkKQorCWlmICggd2luZG93WyBpZCBdICkgeworCQlqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsID0gdHJ1ZTsKKwkJZGVsZXRlIHdpbmRvd1sgaWQgXTsKKwl9CisKKwkvLyBUZXN0IHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRlbGV0ZSBhbiBleHBhbmRvIGZyb20gYW4gZWxlbWVudAorCS8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyCisJdHJ5IHsKKwkJZGVsZXRlIHNjcmlwdC50ZXN0OworCisJfSBjYXRjaChlKSB7CisJCWpRdWVyeS5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8gPSBmYWxzZTsKKwl9CisKKwlyb290LnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKworCWlmICggZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CisJCWRpdi5hdHRhY2hFdmVudCgib25jbGljayIsIGZ1bmN0aW9uIGNsaWNrKCkgeworCQkJLy8gQ2xvbmluZyBhIG5vZGUgc2hvdWxkbid0IGNvcHkgb3ZlciBhbnkKKwkJCS8vIGJvdW5kIGV2ZW50IGhhbmRsZXJzIChJRSBkb2VzIHRoaXMpCisJCQlqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKKwkJCWRpdi5kZXRhY2hFdmVudCgib25jbGljayIsIGNsaWNrKTsKKwkJfSk7CisJCWRpdi5jbG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50KCJvbmNsaWNrIik7CisJfQorCisJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZGl2LmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3JhZGlvdGVzdCcgY2hlY2tlZD0nY2hlY2tlZCcvPiI7CisKKwl2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRpdi5maXJzdENoaWxkICk7CisKKwkvLyBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHMKKwlqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lID0gZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpLmNsb25lTm9kZSh0cnVlKS5sYXN0Q2hpbGQuY2hlY2tlZDsKKworCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKKwkvLyBkb2N1bWVudC5ib2R5IG11c3QgZXhpc3QgYmVmb3JlIHdlIGNhbiBkbyB0aGlzCisJalF1ZXJ5KGZ1bmN0aW9uKCkgeworCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5wYWRkaW5nTGVmdCA9ICIxcHgiOworCisJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApOworCQlqUXVlcnkuYm94TW9kZWwgPSBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMjsKKworCQlpZiAoICJ6b29tIiBpbiBkaXYuc3R5bGUgKSB7CisJCQkvLyBDaGVjayBpZiBuYXRpdmVseSBibG9jay1sZXZlbCBlbGVtZW50cyBhY3QgbGlrZSBpbmxpbmUtYmxvY2sKKwkJCS8vIGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0aGVpciBkaXNwbGF5IHRvICdpbmxpbmUnIGFuZCBnaXZpbmcKKwkJCS8vIHRoZW0gbGF5b3V0CisJCQkvLyAoSUUgPCA4IGRvZXMgdGhpcykKKwkJCWRpdi5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisJCQlkaXYuc3R5bGUuem9vbSA9IDE7CisJCQlqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ID0gZGl2Lm9mZnNldFdpZHRoID09PSAyOworCisJCQkvLyBDaGVjayBpZiBlbGVtZW50cyB3aXRoIGxheW91dCBzaHJpbmstd3JhcCB0aGVpciBjaGlsZHJlbgorCQkJLy8gKElFIDYgZG9lcyB0aGlzKQorCQkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiIjsKKwkJCWRpdi5pbm5lckhUTUwgPSAiPGRpdiBzdHlsZT0nd2lkdGg6NHB4Oyc+PC9kaXY+IjsKKwkJCWpRdWVyeS5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MgPSBkaXYub2Zmc2V0V2lkdGggIT09IDI7CisJCX0KKworCQlkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IjsKKwkJdmFyIHRkcyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKworCQkvLyBDaGVjayBpZiB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodCB3aGVuIHRoZXkgYXJlIHNldAorCQkvLyB0byBkaXNwbGF5Om5vbmUgYW5kIHRoZXJlIGFyZSBzdGlsbCBvdGhlciB2aXNpYmxlIHRhYmxlIGNlbGxzIGluIGEKKwkJLy8gdGFibGUgcm93OyBpZiBzbywgb2Zmc2V0V2lkdGgvSGVpZ2h0IGFyZSBub3QgcmVsaWFibGUgZm9yIHVzZSB3aGVuCisJCS8vIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaGFzIGJlZW4gaGlkZGVuIGRpcmVjdGx5IHVzaW5nCisJCS8vIGRpc3BsYXk6bm9uZSAoaXQgaXMgc3RpbGwgc2FmZSB0byB1c2Ugb2Zmc2V0cyBpZiBhIHBhcmVudCBlbGVtZW50IGlzCisJCS8vIGhpZGRlbjsgZG9uIHNhZmV0eSBnb2dnbGVzIGFuZCBzZWUgYnVnICM0NTEyIGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKwkJLy8gKG9ubHkgSUUgOCBmYWlscyB0aGlzIHRlc3QpCisJCWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyA9IHRkc1swXS5vZmZzZXRIZWlnaHQgPT09IDA7CisKKwkJdGRzWzBdLnN0eWxlLmRpc3BsYXkgPSAiIjsKKwkJdGRzWzFdLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisKKwkJLy8gQ2hlY2sgaWYgZW1wdHkgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQKKwkJLy8gKElFIDwgOCBmYWlsIHRoaXMgdGVzdCkKKwkJalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzID0galF1ZXJ5LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzICYmIHRkc1swXS5vZmZzZXRIZWlnaHQgPT09IDA7CisJCWRpdi5pbm5lckhUTUwgPSAiIjsKKworCQlkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKCBkaXYgKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQlkaXYgPSB0ZHMgPSBudWxsOworCX0pOworCisJLy8gVGVjaG5pcXVlIGZyb20gSnVyaXkgWmF5dHNldgorCS8vIGh0dHA6Ly90aGlua3dlYjIuY29tL3Byb2plY3RzL3Byb3RvdHlwZS9kZXRlY3RpbmctZXZlbnQtc3VwcG9ydC13aXRob3V0LWJyb3dzZXItc25pZmZpbmcvCisJdmFyIGV2ZW50U3VwcG9ydGVkID0gZnVuY3Rpb24oIGV2ZW50TmFtZSApIHsKKwkJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWV2ZW50TmFtZSA9ICJvbiIgKyBldmVudE5hbWU7CisKKwkJdmFyIGlzU3VwcG9ydGVkID0gKGV2ZW50TmFtZSBpbiBlbCk7CisJCWlmICggIWlzU3VwcG9ydGVkICkgeworCQkJZWwuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgInJldHVybjsiKTsKKwkJCWlzU3VwcG9ydGVkID0gdHlwZW9mIGVsW2V2ZW50TmFtZV0gPT09ICJmdW5jdGlvbiI7CisJCX0KKwkJZWwgPSBudWxsOworCisJCXJldHVybiBpc1N1cHBvcnRlZDsKKwl9OworCisJalF1ZXJ5LnN1cHBvcnQuc3VibWl0QnViYmxlcyA9IGV2ZW50U3VwcG9ydGVkKCJzdWJtaXQiKTsKKwlqUXVlcnkuc3VwcG9ydC5jaGFuZ2VCdWJibGVzID0gZXZlbnRTdXBwb3J0ZWQoImNoYW5nZSIpOworCisJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwlyb290ID0gc2NyaXB0ID0gZGl2ID0gYWxsID0gYSA9IG51bGw7Cit9KSgpOworCisKKwordmFyIHdpbmRvd0RhdGEgPSB7fSwKKwlyYnJhY2UgPSAvXig/Olx7LipcfXxcWy4qXF0pJC87CisKK2pRdWVyeS5leHRlbmQoeworCWNhY2hlOiB7fSwKKworCS8vIFBsZWFzZSB1c2Ugd2l0aCBjYXV0aW9uCisJdXVpZDogMCwKKworCS8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZQkKKwlleHBhbmRvOiAialF1ZXJ5IiArIGpRdWVyeS5ub3coKSwKKworCS8vIFRoZSBmb2xsb3dpbmcgZWxlbWVudHMgdGhyb3cgdW5jYXRjaGFibGUgZXhjZXB0aW9ucyBpZiB5b3UKKwkvLyBhdHRlbXB0IHRvIGFkZCBleHBhbmRvIHByb3BlcnRpZXMgdG8gdGhlbS4KKwlub0RhdGE6IHsKKwkJImVtYmVkIjogdHJ1ZSwKKwkJLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcykKKwkJIm9iamVjdCI6ICJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLAorCQkiYXBwbGV0IjogdHJ1ZQorCX0sCisKKwlkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsKKwkJaWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWVsZW0gPSBlbGVtID09IHdpbmRvdyA/CisJCQl3aW5kb3dEYXRhIDoKKwkJCWVsZW07CisKKwkJdmFyIGlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCisJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBudWxsLAorCQkJY2FjaGUgPSBqUXVlcnkuY2FjaGUsIHRoaXNDYWNoZTsKKworCQlpZiAoIGlzTm9kZSAmJiAhaWQgJiYgdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciICYmIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBvYmplY3QgZGlyZWN0bHkKKwkJaWYgKCAhaXNOb2RlICkgeworCQkJY2FjaGUgPSBlbGVtOworCisJCS8vIENvbXB1dGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBlbGVtZW50CisJCX0gZWxzZSBpZiAoICFpZCApIHsKKwkJCWVsZW1bIGpRdWVyeS5leHBhbmRvIF0gPSBpZCA9ICsralF1ZXJ5LnV1aWQ7CisJCX0KKworCQkvLyBBdm9pZCBnZW5lcmF0aW5nIGEgbmV3IGNhY2hlIHVubGVzcyBub25lIGV4aXN0cyBhbmQgd2UKKwkJLy8gd2FudCB0byBtYW5pcHVsYXRlIGl0LgorCQlpZiAoIHR5cGVvZiBuYW1lID09PSAib2JqZWN0IiApIHsKKwkJCWlmICggaXNOb2RlICkgeworCQkJCWNhY2hlWyBpZCBdID0galF1ZXJ5LmV4dGVuZChjYWNoZVsgaWQgXSwgbmFtZSk7CisKKwkJCX0gZWxzZSB7CisJCQkJalF1ZXJ5LmV4dGVuZCggY2FjaGUsIG5hbWUgKTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKCBpc05vZGUgJiYgIWNhY2hlWyBpZCBdICkgeworCQkJY2FjaGVbIGlkIF0gPSB7fTsKKwkJfQorCisJCXRoaXNDYWNoZSA9IGlzTm9kZSA/IGNhY2hlWyBpZCBdIDogY2FjaGU7CisKKwkJLy8gUHJldmVudCBvdmVycmlkaW5nIHRoZSBuYW1lZCBjYWNoZSB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMKKwkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CisJCQl0aGlzQ2FjaGVbIG5hbWUgXSA9IGRhdGE7CisJCX0KKworCQlyZXR1cm4gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciID8gdGhpc0NhY2hlWyBuYW1lIF0gOiB0aGlzQ2FjaGU7CisJfSwKKworCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KKwkJCXdpbmRvd0RhdGEgOgorCQkJZWxlbTsKKworCQl2YXIgaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKKwkJCWlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IGVsZW0sCisJCQljYWNoZSA9IGpRdWVyeS5jYWNoZSwKKwkJCXRoaXNDYWNoZSA9IGlzTm9kZSA/IGNhY2hlWyBpZCBdIDogaWQ7CisKKwkJLy8gSWYgd2Ugd2FudCB0byByZW1vdmUgYSBzcGVjaWZpYyBzZWN0aW9uIG9mIHRoZSBlbGVtZW50J3MgZGF0YQorCQlpZiAoIG5hbWUgKSB7CisJCQlpZiAoIHRoaXNDYWNoZSApIHsKKwkJCQkvLyBSZW1vdmUgdGhlIHNlY3Rpb24gb2YgY2FjaGUgZGF0YQorCQkJCWRlbGV0ZSB0aGlzQ2FjaGVbIG5hbWUgXTsKKworCQkJCS8vIElmIHdlJ3ZlIHJlbW92ZWQgYWxsIHRoZSBkYXRhLCByZW1vdmUgdGhlIGVsZW1lbnQncyBjYWNoZQorCQkJCWlmICggaXNOb2RlICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KHRoaXNDYWNoZSkgKSB7CisJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CisJCQkJfQorCQkJfQorCisJCS8vIE90aGVyd2lzZSwgd2Ugd2FudCB0byByZW1vdmUgYWxsIG9mIHRoZSBlbGVtZW50J3MgZGF0YQorCQl9IGVsc2UgeworCQkJaWYgKCBpc05vZGUgJiYgalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyApIHsKKwkJCQlkZWxldGUgZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKKworCQkJfSBlbHNlIGlmICggZWxlbS5yZW1vdmVBdHRyaWJ1dGUgKSB7CisJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7CisKKwkJCS8vIENvbXBsZXRlbHkgcmVtb3ZlIHRoZSBkYXRhIGNhY2hlCisJCQl9IGVsc2UgaWYgKCBpc05vZGUgKSB7CisJCQkJZGVsZXRlIGNhY2hlWyBpZCBdOworCisJCQkvLyBSZW1vdmUgYWxsIGZpZWxkcyBmcm9tIHRoZSBvYmplY3QKKwkJCX0gZWxzZSB7CisJCQkJZm9yICggdmFyIG4gaW4gZWxlbSApIHsKKwkJCQkJZGVsZXRlIGVsZW1bIG4gXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJLy8gQSBtZXRob2QgZm9yIGRldGVybWluaW5nIGlmIGEgRE9NIG5vZGUgY2FuIGhhbmRsZSB0aGUgZGF0YSBleHBhbmRvCisJYWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CisJCWlmICggZWxlbS5ub2RlTmFtZSApIHsKKwkJCXZhciBtYXRjaCA9IGpRdWVyeS5ub0RhdGFbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOworCisJCQlpZiAoIG1hdGNoICkgeworCQkJCXJldHVybiAhKG1hdGNoID09PSB0cnVlIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzc2lkIikgIT09IG1hdGNoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKKwkJdmFyIGRhdGEgPSBudWxsOworCisJCWlmICggdHlwZW9mIGtleSA9PT0gInVuZGVmaW5lZCIgKSB7CisJCQlpZiAoIHRoaXMubGVuZ3RoICkgeworCQkJCXZhciBhdHRyID0gdGhpc1swXS5hdHRyaWJ1dGVzLCBuYW1lOworCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSApOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gYXR0ci5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCW5hbWUgPSBhdHRyW2ldLm5hbWU7CisKKwkJCQkJaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKKwkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0ciggNSApOworCQkJCQkJZGF0YUF0dHIoIHRoaXNbMF0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gZGF0YTsKKworCQl9IGVsc2UgaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSApOworCQkJfSk7CisJCX0KKworCQl2YXIgcGFydHMgPSBrZXkuc3BsaXQoIi4iKTsKKwkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7CisKKwkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCQkJZGF0YSA9IHRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiICsgcGFydHNbMV0gKyAiISIsIFtwYXJ0c1swXV0pOworCisJCQkvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QKKwkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkgeworCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CisJCQkJZGF0YSA9IGRhdGFBdHRyKCB0aGlzWzBdLCBrZXksIGRhdGEgKTsKKwkJCX0KKworCQkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBwYXJ0c1sxXSA/CisJCQkJdGhpcy5kYXRhKCBwYXJ0c1swXSApIDoKKwkJCQlkYXRhOworCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCXZhciAkdGhpcyA9IGpRdWVyeSggdGhpcyApLAorCQkJCQlhcmdzID0gWyBwYXJ0c1swXSwgdmFsdWUgXTsKKworCQkJCSR0aGlzLnRyaWdnZXJIYW5kbGVyKCAic2V0RGF0YSIgKyBwYXJ0c1sxXSArICIhIiwgYXJncyApOworCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7CisJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CisJCQl9KTsKKwkJfQorCX0sCisKKwlyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgeworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMsIGtleSApOworCQl9KTsKKwl9Cit9KTsKKworZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKKwkvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55CisJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCisJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCAiZGF0YS0iICsga2V5ICk7CisKKwkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CisJCQl0cnkgeworCQkJCWRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKKwkJCQlkYXRhID09PSAiZmFsc2UiID8gZmFsc2UgOgorCQkJCWRhdGEgPT09ICJudWxsIiA/IG51bGwgOgorCQkJCSFqUXVlcnkuaXNOYU4oIGRhdGEgKSA/IHBhcnNlRmxvYXQoIGRhdGEgKSA6CisJCQkJCXJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOgorCQkJCQlkYXRhOworCQkJfSBjYXRjaCggZSApIHt9CisKKwkJCS8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlcgorCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgZGF0YSApOworCisJCX0gZWxzZSB7CisJCQlkYXRhID0gdW5kZWZpbmVkOworCQl9CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKKworCisKK2pRdWVyeS5leHRlbmQoeworCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKKwkJaWYgKCAhZWxlbSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJxdWV1ZSI7CisJCXZhciBxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUgKTsKKworCQkvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwCisJCWlmICggIWRhdGEgKSB7CisJCQlyZXR1cm4gcSB8fCBbXTsKKwkJfQorCisJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKSB7CisJCQlxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTsKKworCQl9IGVsc2UgeworCQkJcS5wdXNoKCBkYXRhICk7CisJCX0KKworCQlyZXR1cm4gcTsKKwl9LAorCisJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CisJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CisKKwkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCisJCQlmbiA9IHF1ZXVlLnNoaWZ0KCk7CisKKwkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAorCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CisJCQlmbiA9IHF1ZXVlLnNoaWZ0KCk7CisJCX0KKworCQlpZiAoIGZuICkgeworCQkJLy8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZworCQkJLy8gYXV0b21hdGljYWxseSBkZXF1ZXVlZAorCQkJaWYgKCB0eXBlID09PSAiZngiICkgeworCQkJCXF1ZXVlLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTsKKwkJCX0KKworCQkJZm4uY2FsbChlbGVtLCBmdW5jdGlvbigpIHsKKwkJCQlqUXVlcnkuZGVxdWV1ZShlbGVtLCB0eXBlKTsKKwkJCX0pOworCQl9CisJfQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisJCQlkYXRhID0gdHlwZTsKKwkJCXR5cGUgPSAiZngiOworCQl9CisKKwkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7CisJCQlyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWzBdLCB0eXBlICk7CisJCX0KKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKwkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOworCisJCQlpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVldWVbMF0gIT09ICJpbnByb2dyZXNzIiApIHsKKwkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworCQkJfQorCQl9KTsKKwl9LAorCWRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKKwkJfSk7CisJfSwKKworCS8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi4KKwkvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCisJZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgeworCQl0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1t0aW1lXSB8fCB0aW1lIDogdGltZTsKKwkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oKSB7CisJCQl2YXIgZWxlbSA9IHRoaXM7CisJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CisJCQl9LCB0aW1lICk7CisJCX0pOworCX0sCisKKwljbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHsKKwkJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKKwl9Cit9KTsKKworCisKKwordmFyIHJjbGFzcyA9IC9bXG5cdF0vZywKKwlyc3BhY2VzID0gL1xzKy8sCisJcnJldHVybiA9IC9cci9nLAorCXJzcGVjaWFsdXJsID0gL14oPzpocmVmfHNyY3xzdHlsZSkkLywKKwlydHlwZSA9IC9eKD86YnV0dG9ufGlucHV0KSQvaSwKKwlyZm9jdXNhYmxlID0gL14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCisJcmNsaWNrYWJsZSA9IC9eYSg/OnJlYSk/JC9pLAorCXJyYWRpb2NoZWNrID0gL14oPzpyYWRpb3xjaGVja2JveCkkL2k7CisKK2pRdWVyeS5wcm9wcyA9IHsKKwkiZm9yIjogImh0bWxGb3IiLAorCSJjbGFzcyI6ICJjbGFzc05hbWUiLAorCXJlYWRvbmx5OiAicmVhZE9ubHkiLAorCW1heGxlbmd0aDogIm1heExlbmd0aCIsCisJY2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIsCisJcm93c3BhbjogInJvd1NwYW4iLAorCWNvbHNwYW46ICJjb2xTcGFuIiwKKwl0YWJpbmRleDogInRhYkluZGV4IiwKKwl1c2VtYXA6ICJ1c2VNYXAiLAorCWZyYW1lYm9yZGVyOiAiZnJhbWVCb3JkZXIiCit9OworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBuYW1lLCB2YWx1ZSwgdHJ1ZSwgalF1ZXJ5LmF0dHIgKTsKKwl9LAorCisJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUsIGZuICkgeworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlqUXVlcnkuYXR0ciggdGhpcywgbmFtZSwgIiIgKTsKKwkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQl0aGlzLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOworCQkJfQorCQl9KTsKKwl9LAorCisJYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKTsKKwkJCQlzZWxmLmFkZENsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGksIHNlbGYuYXR0cigiY2xhc3MiKSkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICkgeworCQkJdmFyIGNsYXNzTmFtZXMgPSAodmFsdWUgfHwgIiIpLnNwbGl0KCByc3BhY2VzICk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCXZhciBlbGVtID0gdGhpc1tpXTsKKworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJaWYgKCAhZWxlbS5jbGFzc05hbWUgKSB7CisJCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YXIgY2xhc3NOYW1lID0gIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIsCisJCQkJCQkJc2V0Q2xhc3MgPSBlbGVtLmNsYXNzTmFtZTsKKworCQkJCQkJZm9yICggdmFyIGMgPSAwLCBjbCA9IGNsYXNzTmFtZXMubGVuZ3RoOyBjIDwgY2w7IGMrKyApIHsKKwkJCQkJCQlpZiAoIGNsYXNzTmFtZS5pbmRleE9mKCAiICIgKyBjbGFzc05hbWVzW2NdICsgIiAiICkgPCAwICkgeworCQkJCQkJCQlzZXRDbGFzcyArPSAiICIgKyBjbGFzc05hbWVzW2NdOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsZW0uY2xhc3NOYW1lID0galF1ZXJ5LnRyaW0oIHNldENsYXNzICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKTsKKwkJCQlzZWxmLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGksIHNlbGYuYXR0cigiY2xhc3MiKSkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKwkJCXZhciBjbGFzc05hbWVzID0gKHZhbHVlIHx8ICIiKS5zcGxpdCggcnNwYWNlcyApOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQl2YXIgZWxlbSA9IHRoaXNbaV07CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5jbGFzc05hbWUgKSB7CisJCQkJCWlmICggdmFsdWUgKSB7CisJCQkJCQl2YXIgY2xhc3NOYW1lID0gKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKHJjbGFzcywgIiAiKTsKKwkJCQkJCWZvciAoIHZhciBjID0gMCwgY2wgPSBjbGFzc05hbWVzLmxlbmd0aDsgYyA8IGNsOyBjKysgKSB7CisJCQkJCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoIiAiICsgY2xhc3NOYW1lc1tjXSArICIgIiwgIiAiKTsKKwkJCQkJCX0KKwkJCQkJCWVsZW0uY2xhc3NOYW1lID0galF1ZXJ5LnRyaW0oIGNsYXNzTmFtZSApOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQllbGVtLmNsYXNzTmFtZSA9ICIiOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkgeworCQl2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSwKKwkJCWlzQm9vbCA9IHR5cGVvZiBzdGF0ZVZhbCA9PT0gImJvb2xlYW4iOworCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKTsKKwkJCQlzZWxmLnRvZ2dsZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGksIHNlbGYuYXR0cigiY2xhc3MiKSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOworCQkJfSk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJaWYgKCB0eXBlID09PSAic3RyaW5nIiApIHsKKwkJCQkvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcworCQkJCXZhciBjbGFzc05hbWUsCisJCQkJCWkgPSAwLAorCQkJCQlzZWxmID0galF1ZXJ5KCB0aGlzICksCisJCQkJCXN0YXRlID0gc3RhdGVWYWwsCisJCQkJCWNsYXNzTmFtZXMgPSB2YWx1ZS5zcGxpdCggcnNwYWNlcyApOworCisJCQkJd2hpbGUgKCAoY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0pICkgeworCQkJCQkvLyBjaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwZXJhdGVkIGxpc3QKKwkJCQkJc3RhdGUgPSBpc0Jvb2wgPyBzdGF0ZSA6ICFzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKTsKKwkJCQkJc2VsZlsgc3RhdGUgPyAiYWRkQ2xhc3MiIDogInJlbW92ZUNsYXNzIiBdKCBjbGFzc05hbWUgKTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJ1bmRlZmluZWQiIHx8IHR5cGUgPT09ICJib29sZWFuIiApIHsKKwkJCQlpZiAoIHRoaXMuY2xhc3NOYW1lICkgeworCQkJCQkvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0CisJCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7CisJCQkJfQorCisJCQkJLy8gdG9nZ2xlIHdob2xlIGNsYXNzTmFtZQorCQkJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gIiIgOiBqUXVlcnkuZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CisJCQl9CisJCX0pOworCX0sCisKKwloYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgY2xhc3NOYW1lID0gIiAiICsgc2VsZWN0b3IgKyAiICI7CisJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJaWYgKCAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgeworCQkJdmFyIGVsZW0gPSB0aGlzWzBdOworCisJCQlpZiAoIGVsZW0gKSB7CisJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJvcHRpb24iICkgKSB7CisJCQkJCS8vIGF0dHJpYnV0ZXMudmFsdWUgaXMgdW5kZWZpbmVkIGluIEJsYWNrYmVycnkgNC43IGJ1dAorCQkJCQkvLyB1c2VzIC52YWx1ZS4gU2VlICM2OTMyCisJCQkJCXZhciB2YWwgPSBlbGVtLmF0dHJpYnV0ZXMudmFsdWU7CisJCQkJCXJldHVybiAhdmFsIHx8IHZhbC5zcGVjaWZpZWQgPyBlbGVtLnZhbHVlIDogZWxlbS50ZXh0OworCQkJCX0KKworCQkJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIHNlbGVjdCBib3hlcyBzcGVjaWFsCisJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJzZWxlY3QiICkgKSB7CisJCQkJCXZhciBpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKKwkJCQkJCXZhbHVlcyA9IFtdLAorCQkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKKwkJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiOworCisJCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCisJCQkJCWlmICggaW5kZXggPCAwICkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKworCQkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCisJCQkJCWZvciAoIHZhciBpID0gb25lID8gaW5kZXggOiAwLCBtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrICkgeworCQkJCQkJdmFyIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKKworCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAorCQkJCQkJaWYgKCBvcHRpb24uc2VsZWN0ZWQgJiYgKGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwpICYmIAorCQkJCQkJCQkoIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkpICkgeworCisJCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgorCQkJCQkJCXZhbHVlID0galF1ZXJ5KG9wdGlvbikudmFsKCk7CisKKwkJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cworCQkJCQkJCWlmICggb25lICkgeworCQkJCQkJCQlyZXR1cm4gdmFsdWU7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXkKKwkJCQkJCQl2YWx1ZXMucHVzaCggdmFsdWUgKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXJldHVybiB2YWx1ZXM7CisJCQkJfQorCisJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGluIFdlYmtpdCAiIiBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mICJvbiIgaWYgYSB2YWx1ZSBpc24ndCBzcGVjaWZpZWQKKwkJCQlpZiAoIHJyYWRpb2NoZWNrLnRlc3QoIGVsZW0udHlwZSApICYmICFqUXVlcnkuc3VwcG9ydC5jaGVja09uICkgeworCQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoInZhbHVlIikgPT09IG51bGwgPyAib24iIDogZWxlbS52YWx1ZTsKKwkJCQl9CisJCQkJCisKKwkJCQkvLyBFdmVyeXRoaW5nIGVsc2UsIHdlIGp1c3QgZ3JhYiB0aGUgdmFsdWUKKwkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UocnJldHVybiwgIiIpOworCisJCQl9CisKKwkJCXJldHVybiB1bmRlZmluZWQ7CisJCX0KKworCQl2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKTsKKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCXZhciBzZWxmID0galF1ZXJ5KHRoaXMpLCB2YWwgPSB2YWx1ZTsKKworCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKCBpc0Z1bmN0aW9uICkgeworCQkJCXZhbCA9IHZhbHVlLmNhbGwodGhpcywgaSwgc2VsZi52YWwoKSk7CisJCQl9CisKKwkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCisJCQlpZiAoIHZhbCA9PSBudWxsICkgeworCQkJCXZhbCA9ICIiOworCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7CisJCQkJdmFsICs9ICIiOworCQkJfSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkodmFsKSApIHsKKwkJCQl2YWwgPSBqUXVlcnkubWFwKHZhbCwgZnVuY3Rpb24gKHZhbHVlKSB7CisJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOworCQkJCX0pOworCQkJfQorCisJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbCkgJiYgcnJhZGlvY2hlY2sudGVzdCggdGhpcy50eXBlICkgKSB7CisJCQkJdGhpcy5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIHNlbGYudmFsKCksIHZhbCApID49IDA7CisKKwkJCX0gZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKKwkJCQl2YXIgdmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSh2YWwpOworCisJCQkJalF1ZXJ5KCAib3B0aW9uIiwgdGhpcyApLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJCXRoaXMuc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KHRoaXMpLnZhbCgpLCB2YWx1ZXMgKSA+PSAwOworCQkJCX0pOworCisJCQkJaWYgKCAhdmFsdWVzLmxlbmd0aCApIHsKKwkJCQkJdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCXRoaXMudmFsdWUgPSB2YWw7CisJCQl9CisJCX0pOworCX0KK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKwlhdHRyRm46IHsKKwkJdmFsOiB0cnVlLAorCQljc3M6IHRydWUsCisJCWh0bWw6IHRydWUsCisJCXRleHQ6IHRydWUsCisJCWRhdGE6IHRydWUsCisJCXdpZHRoOiB0cnVlLAorCQloZWlnaHQ6IHRydWUsCisJCW9mZnNldDogdHJ1ZQorCX0sCisJCQorCWF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgcGFzcyApIHsKKwkJLy8gZG9uJ3Qgc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKKwkJCXJldHVybiB1bmRlZmluZWQ7CisJCX0KKworCQlpZiAoIHBhc3MgJiYgbmFtZSBpbiBqUXVlcnkuYXR0ckZuICkgeworCQkJcmV0dXJuIGpRdWVyeShlbGVtKVtuYW1lXSh2YWx1ZSk7CisJCX0KKworCQl2YXIgbm90eG1sID0gZWxlbS5ub2RlVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICksCisJCQkvLyBXaGV0aGVyIHdlIGFyZSBzZXR0aW5nIChvciBnZXR0aW5nKQorCQkJc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKKworCQkvLyBUcnkgdG8gbm9ybWFsaXplL2ZpeCB0aGUgbmFtZQorCQluYW1lID0gbm90eG1sICYmIGpRdWVyeS5wcm9wc1sgbmFtZSBdIHx8IG5hbWU7CisKKwkJLy8gVGhlc2UgYXR0cmlidXRlcyByZXF1aXJlIHNwZWNpYWwgdHJlYXRtZW50CisJCXZhciBzcGVjaWFsID0gcnNwZWNpYWx1cmwudGVzdCggbmFtZSApOworCisJCS8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhbiBvcHRpb24KKwkJLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CisJCWlmICggbmFtZSA9PT0gInNlbGVjdGVkIiAmJiAhalF1ZXJ5LnN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7CisJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOworCQkJaWYgKCBwYXJlbnQgKSB7CisJCQkJcGFyZW50LnNlbGVjdGVkSW5kZXg7CisKKwkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpdCBhbHNvIHdvcmtzIHdpdGggb3B0Z3JvdXBzLCBzZWUgIzU3MDEKKwkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgeworCQkJCQlwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIElmIGFwcGxpY2FibGUsIGFjY2VzcyB0aGUgYXR0cmlidXRlIHZpYSB0aGUgRE9NIDAgd2F5CisJCS8vICdpbicgY2hlY2tzIGZhaWwgaW4gQmxhY2tiZXJyeSA0LjcgIzY5MzEKKwkJaWYgKCAobmFtZSBpbiBlbGVtIHx8IGVsZW1bIG5hbWUgXSAhPT0gdW5kZWZpbmVkKSAmJiBub3R4bWwgJiYgIXNwZWNpYWwgKSB7CisJCQlpZiAoIHNldCApIHsKKwkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCisJCQkJaWYgKCBuYW1lID09PSAidHlwZSIgJiYgcnR5cGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKKwkJCQkJalF1ZXJ5LmVycm9yKCAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIiApOworCQkJCX0KKworCQkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CisJCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7CisJCQkJCX0KKworCQkJCX0gZWxzZSB7CisJCQkJCWVsZW1bIG5hbWUgXSA9IHZhbHVlOworCQkJCX0KKwkJCX0KKworCQkJLy8gYnJvd3NlcnMgaW5kZXggZWxlbWVudHMgYnkgaWQvbmFtZSBvbiBmb3JtcywgZ2l2ZSBwcmlvcml0eSB0byBhdHRyaWJ1dGVzLgorCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJmb3JtIiApICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApIHsKKwkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9kZVZhbHVlOworCQkJfQorCisJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CisJCQkvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LworCQkJaWYgKCBuYW1lID09PSAidGFiSW5kZXgiICkgeworCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCAidGFiSW5kZXgiICk7CisKKwkJCQlyZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZCA/CisJCQkJCWF0dHJpYnV0ZU5vZGUudmFsdWUgOgorCQkJCQlyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fCByY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLmhyZWYgPworCQkJCQkJMCA6CisJCQkJCQl1bmRlZmluZWQ7CisJCQl9CisKKwkJCXJldHVybiBlbGVtWyBuYW1lIF07CisJCX0KKworCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5zdHlsZSAmJiBub3R4bWwgJiYgbmFtZSA9PT0gInN0eWxlIiApIHsKKwkJCWlmICggc2V0ICkgeworCQkJCWVsZW0uc3R5bGUuY3NzVGV4dCA9ICIiICsgdmFsdWU7CisJCQl9CisKKwkJCXJldHVybiBlbGVtLnN0eWxlLmNzc1RleHQ7CisJCX0KKworCQlpZiAoIHNldCApIHsKKwkJCS8vIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgc3RyaW5nIChhbGwgYnJvd3NlcnMgZG8gdGhpcyBidXQgSUUpIHNlZSAjMTA3MAorCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsICIiICsgdmFsdWUgKTsKKwkJfQorCisJCS8vIEVuc3VyZSB0aGF0IG1pc3NpbmcgYXR0cmlidXRlcyByZXR1cm4gdW5kZWZpbmVkCisJCS8vIEJsYWNrYmVycnkgNC43IHJldHVybnMgIiIgZnJvbSBnZXRBdHRyaWJ1dGUgIzY5MzgKKwkJaWYgKCAhZWxlbS5hdHRyaWJ1dGVzWyBuYW1lIF0gJiYgKGVsZW0uaGFzQXR0cmlidXRlICYmICFlbGVtLmhhc0F0dHJpYnV0ZSggbmFtZSApKSApIHsKKwkJCXJldHVybiB1bmRlZmluZWQ7CisJCX0KKworCQl2YXIgYXR0ciA9ICFqUXVlcnkuc3VwcG9ydC5ocmVmTm9ybWFsaXplZCAmJiBub3R4bWwgJiYgc3BlY2lhbCA/CisJCQkJLy8gU29tZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNhbGwgb24gSUUKKwkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApIDoKKwkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOworCisJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCisJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKKwl9Cit9KTsKKworCisKKwordmFyIHJuYW1lc3BhY2VzID0gL1wuKC4qKSQvLAorCXJmb3JtRWxlbXMgPSAvXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksCisJcnBlcmlvZCA9IC9cLi9nLAorCXJzcGFjZSA9IC8gL2csCisJcmVzY2FwZSA9IC9bXlx3XHMufGBdL2csCisJZmNsZWFudXAgPSBmdW5jdGlvbiggbm0gKSB7CisJCXJldHVybiBubS5yZXBsYWNlKHJlc2NhcGUsICJcXCQmIik7CisJfSwKKwlmb2N1c0NvdW50cyA9IHsgZm9jdXNpbjogMCwgZm9jdXNvdXQ6IDAgfTsKKworLyoKKyAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgorICogTWFueSBvZiB0aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29kZSBvcmlnaW5hdGVkIGZyb20KKyAqIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeS4KKyAqLworalF1ZXJ5LmV2ZW50ID0geworCisJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CisJLy8gT3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCisJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEgKSB7CisJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRm9yIHdoYXRldmVyIHJlYXNvbiwgSUUgaGFzIHRyb3VibGUgcGFzc2luZyB0aGUgd2luZG93IG9iamVjdAorCQkvLyBhcm91bmQsIGNhdXNpbmcgaXQgdG8gYmUgY2xvbmVkIGluIHRoZSBwcm9jZXNzCisJCWlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgJiYgKCBlbGVtICE9PSB3aW5kb3cgJiYgIWVsZW0uZnJhbWVFbGVtZW50ICkgKSB7CisJCQllbGVtID0gd2luZG93OworCQl9CisKKwkJaWYgKCBoYW5kbGVyID09PSBmYWxzZSApIHsKKwkJCWhhbmRsZXIgPSByZXR1cm5GYWxzZTsKKwkJfSBlbHNlIGlmICggIWhhbmRsZXIgKSB7CisJCQkvLyBGaXhlcyBidWcgIzcyMjkuIEZpeCByZWNvbW1lbmRlZCBieSBqZGFsdG9uCisJCSAgcmV0dXJuOworCQl9CisKKwkJdmFyIGhhbmRsZU9iakluLCBoYW5kbGVPYmo7CisKKwkJaWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7CisJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CisJCQloYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBiZWluZyBleGVjdXRlZCBoYXMgYSB1bmlxdWUgSUQKKwkJaWYgKCAhaGFuZGxlci5ndWlkICkgeworCQkJaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKKwkJfQorCisJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUKKwkJdmFyIGVsZW1EYXRhID0galF1ZXJ5LmRhdGEoIGVsZW0gKTsKKworCQkvLyBJZiBubyBlbGVtRGF0YSBpcyBmb3VuZCB0aGVuIHdlIG11c3QgYmUgdHJ5aW5nIHRvIGJpbmQgdG8gb25lIG9mIHRoZQorCQkvLyBiYW5uZWQgbm9EYXRhIGVsZW1lbnRzCisJCWlmICggIWVsZW1EYXRhICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gVXNlIGEga2V5IGxlc3MgbGlrZWx5IHRvIHJlc3VsdCBpbiBjb2xsaXNpb25zIGZvciBwbGFpbiBKUyBvYmplY3RzLgorCQkvLyBGaXhlcyBidWcgIzcxNTAuCisJCXZhciBldmVudEtleSA9IGVsZW0ubm9kZVR5cGUgPyAiZXZlbnRzIiA6ICJfX2V2ZW50c19fIiwKKwkJCWV2ZW50cyA9IGVsZW1EYXRhWyBldmVudEtleSBdLAorCQkJZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGU7CisJCQkKKwkJaWYgKCB0eXBlb2YgZXZlbnRzID09PSAiZnVuY3Rpb24iICkgeworCQkJLy8gT24gcGxhaW4gb2JqZWN0cyBldmVudHMgaXMgYSBmbiB0aGF0IGhvbGRzIHRoZSB0aGUgZGF0YQorCQkJLy8gd2hpY2ggcHJldmVudHMgdGhpcyBkYXRhIGZyb20gYmVpbmcgSlNPTiBzZXJpYWxpemVkCisJCQkvLyB0aGUgZnVuY3Rpb24gZG9lcyBub3QgbmVlZCB0byBiZSBjYWxsZWQsIGl0IGp1c3QgY29udGFpbnMgdGhlIGRhdGEKKwkJCWV2ZW50SGFuZGxlID0gZXZlbnRzLmhhbmRsZTsKKwkJCWV2ZW50cyA9IGV2ZW50cy5ldmVudHM7CisKKwkJfSBlbHNlIGlmICggIWV2ZW50cyApIHsKKwkJCWlmICggIWVsZW0ubm9kZVR5cGUgKSB7CisJCQkJLy8gT24gcGxhaW4gb2JqZWN0cywgY3JlYXRlIGEgZm4gdGhhdCBhY3RzIGFzIHRoZSBob2xkZXIKKwkJCQkvLyBvZiB0aGUgdmFsdWVzIHRvIGF2b2lkIEpTT04gc2VyaWFsaXphdGlvbiBvZiBldmVudCBkYXRhCisJCQkJZWxlbURhdGFbIGV2ZW50S2V5IF0gPSBlbGVtRGF0YSA9IGZ1bmN0aW9uKCl7fTsKKwkJCX0KKworCQkJZWxlbURhdGEuZXZlbnRzID0gZXZlbnRzID0ge307CisJCX0KKworCQlpZiAoICFldmVudEhhbmRsZSApIHsKKwkJCWVsZW1EYXRhLmhhbmRsZSA9IGV2ZW50SGFuZGxlID0gZnVuY3Rpb24oKSB7CisJCQkJLy8gSGFuZGxlIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSB0cmlnZ2VyIGFuZCB3aGVuCisJCQkJLy8gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKKwkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgIWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPworCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6CisJCQkJCXVuZGVmaW5lZDsKKwkJCX07CisJCX0KKworCQkvLyBBZGQgZWxlbSBhcyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZnVuY3Rpb24KKwkJLy8gVGhpcyBpcyB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlIGV2ZW50cyBpbiBJRS4KKwkJZXZlbnRIYW5kbGUuZWxlbSA9IGVsZW07CisKKwkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQorCQkvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7CisJCXR5cGVzID0gdHlwZXMuc3BsaXQoIiAiKTsKKworCQl2YXIgdHlwZSwgaSA9IDAsIG5hbWVzcGFjZXM7CisKKwkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CisJCQloYW5kbGVPYmogPSBoYW5kbGVPYmpJbiA/CisJCQkJalF1ZXJ5LmV4dGVuZCh7fSwgaGFuZGxlT2JqSW4pIDoKKwkJCQl7IGhhbmRsZXI6IGhhbmRsZXIsIGRhdGE6IGRhdGEgfTsKKworCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycworCQkJaWYgKCB0eXBlLmluZGV4T2YoIi4iKSA+IC0xICkgeworCQkJCW5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CisJCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKwkJCQloYW5kbGVPYmoubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpOworCisJCQl9IGVsc2UgeworCQkJCW5hbWVzcGFjZXMgPSBbXTsKKwkJCQloYW5kbGVPYmoubmFtZXNwYWNlID0gIiI7CisJCQl9CisKKwkJCWhhbmRsZU9iai50eXBlID0gdHlwZTsKKwkJCWlmICggIWhhbmRsZU9iai5ndWlkICkgeworCQkJCWhhbmRsZU9iai5ndWlkID0gaGFuZGxlci5ndWlkOworCQkJfQorCisJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8gdGhpcyBldmVudAorCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0sCisJCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CisKKwkJCS8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUKKwkJCWlmICggIWhhbmRsZXJzICkgeworCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKKworCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgorCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwKKwkJCQkvLyBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlCisJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkgeworCQkJCQkvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAorCQkJCQlpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CisKKwkJCQkJfSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHsKKwkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBldmVudEhhbmRsZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAoIHNwZWNpYWwuYWRkICkgeyAKKwkJCQlzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsgCisKKwkJCQlpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkgeworCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOworCQkJCX0KKwkJCX0KKworCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAorCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CisKKwkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgYmVlbiB1c2VkLCBmb3IgZ2xvYmFsIHRyaWdnZXJpbmcKKwkJCWpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7CisJCX0KKworCQkvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKwkJZWxlbSA9IG51bGw7CisJfSwKKworCWdsb2JhbDoge30sCisKKwkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKKwlyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgcG9zICkgeworCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICggaGFuZGxlciA9PT0gZmFsc2UgKSB7CisJCQloYW5kbGVyID0gcmV0dXJuRmFsc2U7CisJCX0KKworCQl2YXIgcmV0LCB0eXBlLCBmbiwgaiwgaSA9IDAsIGFsbCwgbmFtZXNwYWNlcywgbmFtZXNwYWNlLCBzcGVjaWFsLCBldmVudFR5cGUsIGhhbmRsZU9iaiwgb3JpZ1R5cGUsCisJCQlldmVudEtleSA9IGVsZW0ubm9kZVR5cGUgPyAiZXZlbnRzIiA6ICJfX2V2ZW50c19fIiwKKwkJCWVsZW1EYXRhID0galF1ZXJ5LmRhdGEoIGVsZW0gKSwKKwkJCWV2ZW50cyA9IGVsZW1EYXRhICYmIGVsZW1EYXRhWyBldmVudEtleSBdOworCisJCWlmICggIWVsZW1EYXRhIHx8ICFldmVudHMgKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggdHlwZW9mIGV2ZW50cyA9PT0gImZ1bmN0aW9uIiApIHsKKwkJCWVsZW1EYXRhID0gZXZlbnRzOworCQkJZXZlbnRzID0gZXZlbnRzLmV2ZW50czsKKwkJfQorCisJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCisJCWlmICggdHlwZXMgJiYgdHlwZXMudHlwZSApIHsKKwkJCWhhbmRsZXIgPSB0eXBlcy5oYW5kbGVyOworCQkJdHlwZXMgPSB0eXBlcy50eXBlOworCQl9CisKKwkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CisJCWlmICggIXR5cGVzIHx8IHR5cGVvZiB0eXBlcyA9PT0gInN0cmluZyIgJiYgdHlwZXMuY2hhckF0KDApID09PSAiLiIgKSB7CisJCQl0eXBlcyA9IHR5cGVzIHx8ICIiOworCisJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKKwkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXMgKTsKKwkJCX0KKworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQorCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKKwkJdHlwZXMgPSB0eXBlcy5zcGxpdCgiICIpOworCisJCXdoaWxlICggKHR5cGUgPSB0eXBlc1sgaSsrIF0pICkgeworCQkJb3JpZ1R5cGUgPSB0eXBlOworCQkJaGFuZGxlT2JqID0gbnVsbDsKKwkJCWFsbCA9IHR5cGUuaW5kZXhPZigiLiIpIDwgMDsKKwkJCW5hbWVzcGFjZXMgPSBbXTsKKworCQkJaWYgKCAhYWxsICkgeworCQkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOworCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CisKKwkJCQluYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIAorCQkJCQlqUXVlcnkubWFwKCBuYW1lc3BhY2VzLnNsaWNlKDApLnNvcnQoKSwgZmNsZWFudXAgKS5qb2luKCJcXC4oPzouKlxcLik/IikgKyAiKFxcLnwkKSIpOworCQkJfQorCisJCQlldmVudFR5cGUgPSBldmVudHNbIHR5cGUgXTsKKworCQkJaWYgKCAhZXZlbnRUeXBlICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoICFoYW5kbGVyICkgeworCQkJCWZvciAoIGogPSAwOyBqIDwgZXZlbnRUeXBlLmxlbmd0aDsgaisrICkgeworCQkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKKworCQkJCQlpZiAoIGFsbCB8fCBuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgeworCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgb3JpZ1R5cGUsIGhhbmRsZU9iai5oYW5kbGVyLCBqICk7CisJCQkJCQlldmVudFR5cGUuc3BsaWNlKCBqLS0sIDEgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworCQkJZm9yICggaiA9IHBvcyB8fCAwOyBqIDwgZXZlbnRUeXBlLmxlbmd0aDsgaisrICkgeworCQkJCWhhbmRsZU9iaiA9IGV2ZW50VHlwZVsgaiBdOworCisJCQkJaWYgKCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgeworCQkJCQkvLyByZW1vdmUgdGhlIGdpdmVuIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlCisJCQkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CisJCQkJCQlpZiAoIHBvcyA9PSBudWxsICkgeworCQkJCQkJCWV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApOworCQkJCQkJfQorCisJCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgeworCQkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKCBwb3MgIT0gbnVsbCApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyByZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKKwkJCWlmICggZXZlbnRUeXBlLmxlbmd0aCA9PT0gMCB8fCBwb3MgIT0gbnVsbCAmJiBldmVudFR5cGUubGVuZ3RoID09PSAxICkgeworCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzICkgPT09IGZhbHNlICkgeworCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApOworCQkJCX0KKworCQkJCXJldCA9IG51bGw7CisJCQkJZGVsZXRlIGV2ZW50c1sgdHlwZSBdOworCQkJfQorCQl9CisKKwkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKKwkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CisJCQl2YXIgaGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOworCQkJaWYgKCBoYW5kbGUgKSB7CisJCQkJaGFuZGxlLmVsZW0gPSBudWxsOworCQkJfQorCisJCQlkZWxldGUgZWxlbURhdGEuZXZlbnRzOworCQkJZGVsZXRlIGVsZW1EYXRhLmhhbmRsZTsKKworCQkJaWYgKCB0eXBlb2YgZWxlbURhdGEgPT09ICJmdW5jdGlvbiIgKSB7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIGV2ZW50S2V5ICk7CisKKwkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBlbGVtRGF0YSApICkgeworCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CisJCQl9CisJCX0KKwl9LAorCisJLy8gYnViYmxpbmcgaXMgaW50ZXJuYWwKKwl0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0gLyosIGJ1YmJsaW5nICovICkgeworCQkvLyBFdmVudCBvYmplY3Qgb3IgZXZlbnQgdHlwZQorCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQsCisJCQlidWJibGluZyA9IGFyZ3VtZW50c1szXTsKKworCQlpZiAoICFidWJibGluZyApIHsKKwkJCWV2ZW50ID0gdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiA/CisJCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdAorCQkJCWV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8gZXZlbnQgOgorCQkJCS8vIE9iamVjdCBsaXRlcmFsCisJCQkJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LkV2ZW50KHR5cGUpLCBldmVudCApIDoKKwkJCQkvLyBKdXN0IHRoZSBldmVudCB0eXBlIChzdHJpbmcpCisJCQkJalF1ZXJ5LkV2ZW50KHR5cGUpOworCisJCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CisJCQkJZXZlbnQudHlwZSA9IHR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKKwkJCQlldmVudC5leGNsdXNpdmUgPSB0cnVlOworCQkJfQorCisJCQkvLyBIYW5kbGUgYSBnbG9iYWwgdHJpZ2dlcgorCQkJaWYgKCAhZWxlbSApIHsKKwkJCQkvLyBEb24ndCBidWJibGUgY3VzdG9tIGV2ZW50cyB3aGVuIGdsb2JhbCAodG8gYXZvaWQgdG9vIG11Y2ggb3ZlcmhlYWQpCisJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisKKwkJCQkvLyBPbmx5IHRyaWdnZXIgaWYgd2UndmUgZXZlciBib3VuZCBhbiBldmVudCBmb3IgaXQKKwkJCQlpZiAoIGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSApIHsKKwkJCQkJalF1ZXJ5LmVhY2goIGpRdWVyeS5jYWNoZSwgZnVuY3Rpb24oKSB7CisJCQkJCQlpZiAoIHRoaXMuZXZlbnRzICYmIHRoaXMuZXZlbnRzW3R5cGVdICkgeworCQkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpcy5oYW5kbGUuZWxlbSApOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIEhhbmRsZSB0cmlnZ2VyaW5nIGEgc2luZ2xlIGVsZW1lbnQKKworCQkJLy8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKKwkJCWlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgeworCQkJCXJldHVybiB1bmRlZmluZWQ7CisJCQl9CisKKwkJCS8vIENsZWFuIHVwIGluIGNhc2UgaXQgaXMgcmV1c2VkCisJCQlldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7CisJCQlldmVudC50YXJnZXQgPSBlbGVtOworCisJCQkvLyBDbG9uZSB0aGUgaW5jb21pbmcgZGF0YSwgaWYgYW55CisJCQlkYXRhID0galF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApOworCQkJZGF0YS51bnNoaWZ0KCBldmVudCApOworCQl9CisKKwkJZXZlbnQuY3VycmVudFRhcmdldCA9IGVsZW07CisKKwkJLy8gVHJpZ2dlciB0aGUgZXZlbnQsIGl0IGlzIGFzc3VtZWQgdGhhdCAiaGFuZGxlIiBpcyBhIGZ1bmN0aW9uCisJCXZhciBoYW5kbGUgPSBlbGVtLm5vZGVUeXBlID8KKwkJCWpRdWVyeS5kYXRhKCBlbGVtLCAiaGFuZGxlIiApIDoKKwkJCShqUXVlcnkuZGF0YSggZWxlbSwgIl9fZXZlbnRzX18iICkgfHwge30pLmhhbmRsZTsKKworCQlpZiAoIGhhbmRsZSApIHsKKwkJCWhhbmRsZS5hcHBseSggZWxlbSwgZGF0YSApOworCQl9CisKKwkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSB8fCBlbGVtLm93bmVyRG9jdW1lbnQ7CisKKwkJLy8gVHJpZ2dlciBhbiBpbmxpbmUgYm91bmQgc2NyaXB0CisJCXRyeSB7CisJCQlpZiAoICEoZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGpRdWVyeS5ub0RhdGFbZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkgKSB7CisJCQkJaWYgKCBlbGVtWyAib24iICsgdHlwZSBdICYmIGVsZW1bICJvbiIgKyB0eXBlIF0uYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7CisJCQkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOworCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCX0KKwkJCX0KKworCQkvLyBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgYW4gZXJyb3IgZm9yIHNvbWUgZWxlbWVudHMgd2l0aCBzb21lIGV2ZW50IHR5cGVzLCBzZWUgIzM1MzMKKwkJfSBjYXRjaCAoaW5saW5lRXJyb3IpIHt9CisKKwkJaWYgKCAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBwYXJlbnQgKSB7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZXZlbnQsIGRhdGEsIHBhcmVudCwgdHJ1ZSApOworCisJCX0gZWxzZSBpZiAoICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKKwkJCXZhciBvbGQsCisJCQkJdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LAorCQkJCXRhcmdldFR5cGUgPSB0eXBlLnJlcGxhY2UoIHJuYW1lc3BhY2VzLCAiIiApLAorCQkJCWlzQ2xpY2sgPSBqUXVlcnkubm9kZU5hbWUoIHRhcmdldCwgImEiICkgJiYgdGFyZ2V0VHlwZSA9PT0gImNsaWNrIiwKKwkJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRhcmdldFR5cGUgXSB8fCB7fTsKKworCQkJaWYgKCAoIXNwZWNpYWwuX2RlZmF1bHQgfHwgc3BlY2lhbC5fZGVmYXVsdC5jYWxsKCBlbGVtLCBldmVudCApID09PSBmYWxzZSkgJiYgCisJCQkJIWlzQ2xpY2sgJiYgISh0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVOYW1lICYmIGpRdWVyeS5ub0RhdGFbdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSApIHsKKworCQkJCXRyeSB7CisJCQkJCWlmICggdGFyZ2V0WyB0YXJnZXRUeXBlIF0gKSB7CisJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBhY2NpZGVudGFsbHkgcmUtdHJpZ2dlciB0aGUgb25GT08gZXZlbnRzCisJCQkJCQlvbGQgPSB0YXJnZXRbICJvbiIgKyB0YXJnZXRUeXBlIF07CisKKwkJCQkJCWlmICggb2xkICkgeworCQkJCQkJCXRhcmdldFsgIm9uIiArIHRhcmdldFR5cGUgXSA9IG51bGw7CisJCQkJCQl9CisKKwkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0cnVlOworCQkJCQkJdGFyZ2V0WyB0YXJnZXRUeXBlIF0oKTsKKwkJCQkJfQorCisJCQkJLy8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGFuIGVycm9yIGZvciBzb21lIGVsZW1lbnRzIHdpdGggc29tZSBldmVudCB0eXBlcywgc2VlICMzNTMzCisJCQkJfSBjYXRjaCAodHJpZ2dlckVycm9yKSB7fQorCisJCQkJaWYgKCBvbGQgKSB7CisJCQkJCXRhcmdldFsgIm9uIiArIHRhcmdldFR5cGUgXSA9IG9sZDsKKwkJCQl9CisKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gZmFsc2U7CisJCQl9CisJCX0KKwl9LAorCisJaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7CisJCXZhciBhbGwsIGhhbmRsZXJzLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2VfcmUsIGV2ZW50cywKKwkJCW5hbWVzcGFjZV9zb3J0ID0gW10sCisJCQlhcmdzID0galF1ZXJ5Lm1ha2VBcnJheSggYXJndW1lbnRzICk7CisKKwkJZXZlbnQgPSBhcmdzWzBdID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CisJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOworCisJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJYWxsID0gZXZlbnQudHlwZS5pbmRleE9mKCIuIikgPCAwICYmICFldmVudC5leGNsdXNpdmU7CisKKwkJaWYgKCAhYWxsICkgeworCQkJbmFtZXNwYWNlcyA9IGV2ZW50LnR5cGUuc3BsaXQoIi4iKTsKKwkJCWV2ZW50LnR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CisJCQluYW1lc3BhY2Vfc29ydCA9IG5hbWVzcGFjZXMuc2xpY2UoMCkuc29ydCgpOworCQkJbmFtZXNwYWNlX3JlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2Vfc29ydC5qb2luKCJcXC4oPzouKlxcLik/IikgKyAiKFxcLnwkKSIpOworCQl9CisKKwkJZXZlbnQubmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlIHx8IG5hbWVzcGFjZV9zb3J0LmpvaW4oIi4iKTsKKworCQlldmVudHMgPSBqUXVlcnkuZGF0YSh0aGlzLCB0aGlzLm5vZGVUeXBlID8gImV2ZW50cyIgOiAiX19ldmVudHNfXyIpOworCisJCWlmICggdHlwZW9mIGV2ZW50cyA9PT0gImZ1bmN0aW9uIiApIHsKKwkJCWV2ZW50cyA9IGV2ZW50cy5ldmVudHM7CisJCX0KKworCQloYW5kbGVycyA9IChldmVudHMgfHwge30pWyBldmVudC50eXBlIF07CisKKwkJaWYgKCBldmVudHMgJiYgaGFuZGxlcnMgKSB7CisJCQkvLyBDbG9uZSB0aGUgaGFuZGxlcnMgdG8gcHJldmVudCBtYW5pcHVsYXRpb24KKwkJCWhhbmRsZXJzID0gaGFuZGxlcnMuc2xpY2UoMCk7CisKKwkJCWZvciAoIHZhciBqID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaiA8IGw7IGorKyApIHsKKwkJCQl2YXIgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKKworCQkJCS8vIEZpbHRlciB0aGUgZnVuY3Rpb25zIGJ5IGNsYXNzCisJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlX3JlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKKwkJCQkJLy8gUGFzcyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBpdHNlbGYKKwkJCQkJLy8gU28gdGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CisJCQkJCWV2ZW50LmhhbmRsZXIgPSBoYW5kbGVPYmouaGFuZGxlcjsKKwkJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhOworCQkJCQlldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7CisJCisJCQkJCXZhciByZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJncyApOworCisJCQkJCWlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CisJCQkJCQlpZiAoIHJldCA9PT0gZmFsc2UgKSB7CisJCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmICggZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKKwl9LAorCisJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbGF5ZXJYIGxheWVyWSBtZXRhS2V5IG5ld1ZhbHVlIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKKworCWZpeDogZnVuY3Rpb24oIGV2ZW50ICkgeworCQlpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkgeworCQkJcmV0dXJuIGV2ZW50OworCQl9CisKKwkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QKKwkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCisJCXZhciBvcmlnaW5hbEV2ZW50ID0gZXZlbnQ7CisJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CisKKwkJZm9yICggdmFyIGkgPSB0aGlzLnByb3BzLmxlbmd0aCwgcHJvcDsgaTsgKSB7CisJCQlwcm9wID0gdGhpcy5wcm9wc1sgLS1pIF07CisJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOworCQl9CisKKwkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5CisJCWlmICggIWV2ZW50LnRhcmdldCApIHsKKwkJCS8vIEZpeGVzICMxOTI1IHdoZXJlIHNyY0VsZW1lbnQgbWlnaHQgbm90IGJlIGRlZmluZWQgZWl0aGVyCisJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OworCQl9CisKKwkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKKwkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7CisJCQlldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTsKKwkJfQorCisJCS8vIEFkZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3NhcnkKKwkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApIHsKKwkJCWV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7CisJCX0KKworCQkvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlCisJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBldmVudC5jbGllbnRYICE9IG51bGwgKSB7CisJCQl2YXIgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAorCQkJCWJvZHkgPSBkb2N1bWVudC5ib2R5OworCisJCQlldmVudC5wYWdlWCA9IGV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwKTsKKwkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDApOworCQl9CisKKwkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCisJCWlmICggZXZlbnQud2hpY2ggPT0gbnVsbCAmJiAoZXZlbnQuY2hhckNvZGUgIT0gbnVsbCB8fCBldmVudC5rZXlDb2RlICE9IG51bGwpICkgeworCQkJZXZlbnQud2hpY2ggPSBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlOworCQl9CisKKwkJLy8gQWRkIG1ldGFLZXkgdG8gbm9uLU1hYyBicm93c2VycyAodXNlIGN0cmwgZm9yIFBDJ3MgYW5kIE1ldGEgZm9yIE1hY3MpCisJCWlmICggIWV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuY3RybEtleSApIHsKKwkJCWV2ZW50Lm1ldGFLZXkgPSBldmVudC5jdHJsS2V5OworCQl9CisKKwkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodAorCQkvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorCQlpZiAoICFldmVudC53aGljaCAmJiBldmVudC5idXR0b24gIT09IHVuZGVmaW5lZCApIHsKKwkJCWV2ZW50LndoaWNoID0gKGV2ZW50LmJ1dHRvbiAmIDEgPyAxIDogKCBldmVudC5idXR0b24gJiAyID8gMyA6ICggZXZlbnQuYnV0dG9uICYgNCA/IDIgOiAwICkgKSk7CisJCX0KKworCQlyZXR1cm4gZXZlbnQ7CisJfSwKKworCS8vIERlcHJlY2F0ZWQsIHVzZSBqUXVlcnkuZ3VpZCBpbnN0ZWFkCisJZ3VpZDogMUU4LAorCisJLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5wcm94eSBpbnN0ZWFkCisJcHJveHk6IGpRdWVyeS5wcm94eSwKKworCXNwZWNpYWw6IHsKKwkJcmVhZHk6IHsKKwkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKKwkJCXNldHVwOiBqUXVlcnkuYmluZFJlYWR5LAorCQkJdGVhcmRvd246IGpRdWVyeS5ub29wCisJCX0sCisKKwkJbGl2ZTogeworCQkJYWRkOiBmdW5jdGlvbiggaGFuZGxlT2JqICkgeworCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsCisJCQkJCWxpdmVDb252ZXJ0KCBoYW5kbGVPYmoub3JpZ1R5cGUsIGhhbmRsZU9iai5zZWxlY3RvciApLAorCQkJCQlqUXVlcnkuZXh0ZW5kKHt9LCBoYW5kbGVPYmosIHtoYW5kbGVyOiBsaXZlSGFuZGxlciwgZ3VpZDogaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZH0pICk7IAorCQkJfSwKKworCQkJcmVtb3ZlOiBmdW5jdGlvbiggaGFuZGxlT2JqICkgeworCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIGxpdmVDb252ZXJ0KCBoYW5kbGVPYmoub3JpZ1R5cGUsIGhhbmRsZU9iai5zZWxlY3RvciApLCBoYW5kbGVPYmogKTsKKwkJCX0KKwkJfSwKKworCQliZWZvcmV1bmxvYWQ6IHsKKwkJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7CisJCQkJLy8gV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgc3BlY2lhbCBjYXNlIG9uIHdpbmRvd3MKKwkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggdGhpcyApICkgeworCQkJCQl0aGlzLm9uYmVmb3JldW5sb2FkID0gZXZlbnRIYW5kbGU7CisJCQkJfQorCQkJfSwKKworCQkJdGVhcmRvd246IGZ1bmN0aW9uKCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKKwkJCQlpZiAoIHRoaXMub25iZWZvcmV1bmxvYWQgPT09IGV2ZW50SGFuZGxlICkgeworCQkJCQl0aGlzLm9uYmVmb3JldW5sb2FkID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9OworCitqUXVlcnkucmVtb3ZlRXZlbnQgPSBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyID8KKwlmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgeworCQlpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKKwkJCWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlLCBmYWxzZSApOworCQl9CisJfSA6IAorCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CisJCWlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKKwkJCWVsZW0uZGV0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBoYW5kbGUgKTsKKwkJfQorCX07CisKK2pRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMgKSB7CisJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCisJaWYgKCAhdGhpcy5wcmV2ZW50RGVmYXVsdCApIHsKKwkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYyApOworCX0KKworCS8vIEV2ZW50IG9iamVjdAorCWlmICggc3JjICYmIHNyYy50eXBlICkgeworCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CisJCXRoaXMudHlwZSA9IHNyYy50eXBlOworCS8vIEV2ZW50IHR5cGUKKwl9IGVsc2UgeworCQl0aGlzLnR5cGUgPSBzcmM7CisJfQorCisJLy8gdGltZVN0YW1wIGlzIGJ1Z2d5IGZvciBzb21lIGV2ZW50cyBvbiBGaXJlZm94KCMzODQzKQorCS8vIFNvIHdlIHdvbid0IHJlbHkgb24gdGhlIG5hdGl2ZSB2YWx1ZQorCXRoaXMudGltZVN0YW1wID0galF1ZXJ5Lm5vdygpOworCisJLy8gTWFyayBpdCBhcyBmaXhlZAorCXRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOworfTsKKworZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7CisJcmV0dXJuIGZhbHNlOworfQorZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7CisJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7CisKKwkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CisJCWlmICggIWUgKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIGlmIHByZXZlbnREZWZhdWx0IGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCWlmICggZS5wcmV2ZW50RGVmYXVsdCApIHsKKwkJCWUucHJldmVudERlZmF1bHQoKTsKKworCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQorCQl9IGVsc2UgeworCQkJZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCQl9CisJfSwKKwlzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworCQl0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKKwkJaWYgKCAhZSApIHsKKwkJCXJldHVybjsKKwkJfQorCQkvLyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJaWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHsKKwkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCX0KKwkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byB0cnVlIChJRSkKKwkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOworCX0sCisJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKKwkJdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CisJCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7CisJfSwKKwlpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLAorCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKKwlpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKK307CisKKy8vIENoZWNrcyBpZiBhbiBldmVudCBoYXBwZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVsZW1lbnQKKy8vIFVzZWQgaW4galF1ZXJ5LmV2ZW50LnNwZWNpYWwubW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBoYW5kbGVycwordmFyIHdpdGhpbkVsZW1lbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7CisJLy8gQ2hlY2sgaWYgbW91c2Uob3ZlcnxvdXQpIGFyZSBzdGlsbCB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IGVsZW1lbnQKKwl2YXIgcGFyZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldDsKKworCS8vIEZpcmVmb3ggc29tZXRpbWVzIGFzc2lnbnMgcmVsYXRlZFRhcmdldCBhIFhVTCBlbGVtZW50CisJLy8gd2hpY2ggd2UgY2Fubm90IGFjY2VzcyB0aGUgcGFyZW50Tm9kZSBwcm9wZXJ0eSBvZgorCXRyeSB7CisJCS8vIFRyYXZlcnNlIHVwIHRoZSB0cmVlCisJCXdoaWxlICggcGFyZW50ICYmIHBhcmVudCAhPT0gdGhpcyApIHsKKwkJCXBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOworCQl9CisKKwkJaWYgKCBwYXJlbnQgIT09IHRoaXMgKSB7CisJCQkvLyBzZXQgdGhlIGNvcnJlY3QgZXZlbnQgdHlwZQorCQkJZXZlbnQudHlwZSA9IGV2ZW50LmRhdGE7CisKKwkJCS8vIGhhbmRsZSBldmVudCBpZiB3ZSBhY3R1YWxseSBqdXN0IG1vdXNlZCBvbiB0byBhIG5vbiBzdWItZWxlbWVudAorCQkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCX0KKworCS8vIGFzc3VtaW5nIHdlJ3ZlIGxlZnQgdGhlIGVsZW1lbnQgc2luY2Ugd2UgbW9zdCBsaWtlbHkgbW91c2Vkb3ZlciBhIHh1bCBlbGVtZW50CisJfSBjYXRjaChlKSB7IH0KK30sCisKKy8vIEluIGNhc2Ugb2YgZXZlbnQgZGVsZWdhdGlvbiwgd2Ugb25seSBuZWVkIHRvIHJlbmFtZSB0aGUgZXZlbnQudHlwZSwKKy8vIGxpdmVIYW5kbGVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0LgorZGVsZWdhdGUgPSBmdW5jdGlvbiggZXZlbnQgKSB7CisJZXZlbnQudHlwZSA9IGV2ZW50LmRhdGE7CisJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cit9OworCisvLyBDcmVhdGUgbW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBldmVudHMKK2pRdWVyeS5lYWNoKHsKKwltb3VzZWVudGVyOiAibW91c2VvdmVyIiwKKwltb3VzZWxlYXZlOiAibW91c2VvdXQiCit9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgeworCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7CisJCXNldHVwOiBmdW5jdGlvbiggZGF0YSApIHsKKwkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50LCBvcmlnICk7CisJCX0sCisJCXRlYXJkb3duOiBmdW5jdGlvbiggZGF0YSApIHsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50ICk7CisJCX0KKwl9OworfSk7CisKKy8vIHN1Ym1pdCBkZWxlZ2F0aW9uCitpZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkgeworCisJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuc3VibWl0ID0geworCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMgKSB7CisJCQlpZiAoIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gImZvcm0iICkgeworCQkJCWpRdWVyeS5ldmVudC5hZGQodGhpcywgImNsaWNrLnNwZWNpYWxTdWJtaXQiLCBmdW5jdGlvbiggZSApIHsKKwkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKKwkJCQkJCXR5cGUgPSBlbGVtLnR5cGU7CisKKwkJCQkJaWYgKCAodHlwZSA9PT0gInN1Ym1pdCIgfHwgdHlwZSA9PT0gImltYWdlIikgJiYgalF1ZXJ5KCBlbGVtICkuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aCApIHsKKwkJCQkJCWUubGl2ZUZpcmVkID0gdW5kZWZpbmVkOworCQkJCQkJcmV0dXJuIHRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJCQkJfQorCQkJCX0pOworCSAKKwkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CisJCQkJCXZhciBlbGVtID0gZS50YXJnZXQsCisJCQkJCQl0eXBlID0gZWxlbS50eXBlOworCisJCQkJCWlmICggKHR5cGUgPT09ICJ0ZXh0IiB8fCB0eXBlID09PSAicGFzc3dvcmQiKSAmJiBqUXVlcnkoIGVsZW0gKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoICYmIGUua2V5Q29kZSA9PT0gMTMgKSB7CisJCQkJCQllLmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKKwkJCQkJCXJldHVybiB0cmlnZ2VyKCAic3VibWl0IiwgdGhpcywgYXJndW1lbnRzICk7CisJCQkJCX0KKwkJCQl9KTsKKworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0sCisKKwkJdGVhcmRvd246IGZ1bmN0aW9uKCBuYW1lc3BhY2VzICkgeworCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5zcGVjaWFsU3VibWl0IiApOworCQl9CisJfTsKKworfQorCisvLyBjaGFuZ2UgZGVsZWdhdGlvbiwgaGFwcGVucyBoZXJlIHNvIHdlIGhhdmUgYmluZC4KK2lmICggIWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CisKKwl2YXIgY2hhbmdlRmlsdGVycywKKworCWdldFZhbCA9IGZ1bmN0aW9uKCBlbGVtICkgeworCQl2YXIgdHlwZSA9IGVsZW0udHlwZSwgdmFsID0gZWxlbS52YWx1ZTsKKworCQlpZiAoIHR5cGUgPT09ICJyYWRpbyIgfHwgdHlwZSA9PT0gImNoZWNrYm94IiApIHsKKwkJCXZhbCA9IGVsZW0uY2hlY2tlZDsKKworCQl9IGVsc2UgaWYgKCB0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKKwkJCXZhbCA9IGVsZW0uc2VsZWN0ZWRJbmRleCA+IC0xID8KKwkJCQlqUXVlcnkubWFwKCBlbGVtLm9wdGlvbnMsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZDsKKwkJCQl9KS5qb2luKCItIikgOgorCQkJCSIiOworCisJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gInNlbGVjdCIgKSB7CisJCQl2YWwgPSBlbGVtLnNlbGVjdGVkSW5kZXg7CisJCX0KKworCQlyZXR1cm4gdmFsOworCX0sCisKKwl0ZXN0Q2hhbmdlID0gZnVuY3Rpb24gdGVzdENoYW5nZSggZSApIHsKKwkJdmFyIGVsZW0gPSBlLnRhcmdldCwgZGF0YSwgdmFsOworCisJCWlmICggIXJmb3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0ucmVhZE9ubHkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlkYXRhID0galF1ZXJ5LmRhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiICk7CisJCXZhbCA9IGdldFZhbChlbGVtKTsKKworCQkvLyB0aGUgY3VycmVudCBkYXRhIHdpbGwgYmUgYWxzbyByZXRyaWV2ZWQgYnkgYmVmb3JlYWN0aXZhdGUKKwkJaWYgKCBlLnR5cGUgIT09ICJmb2N1c291dCIgfHwgZWxlbS50eXBlICE9PSAicmFkaW8iICkgeworCQkJalF1ZXJ5LmRhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiLCB2YWwgKTsKKwkJfQorCQkKKwkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBkYXRhICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCBkYXRhICE9IG51bGwgfHwgdmFsICkgeworCQkJZS50eXBlID0gImNoYW5nZSI7CisJCQllLmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKKwkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgYXJndW1lbnRzWzFdLCBlbGVtICk7CisJCX0KKwl9OworCisJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0geworCQlmaWx0ZXJzOiB7CisJCQlmb2N1c291dDogdGVzdENoYW5nZSwgCisKKwkJCWJlZm9yZWRlYWN0aXZhdGU6IHRlc3RDaGFuZ2UsCisKKwkJCWNsaWNrOiBmdW5jdGlvbiggZSApIHsKKwkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0LCB0eXBlID0gZWxlbS50eXBlOworCisJCQkJaWYgKCB0eXBlID09PSAicmFkaW8iIHx8IHR5cGUgPT09ICJjaGVja2JveCIgfHwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2VsZWN0IiApIHsKKwkJCQkJcmV0dXJuIHRlc3RDaGFuZ2UuY2FsbCggdGhpcywgZSApOworCQkJCX0KKwkJCX0sCisKKwkJCS8vIENoYW5nZSBoYXMgdG8gYmUgY2FsbGVkIGJlZm9yZSBzdWJtaXQKKwkJCS8vIEtleWRvd24gd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGtleXByZXNzLCB3aGljaCBpcyB1c2VkIGluIHN1Ym1pdC1ldmVudCBkZWxlZ2F0aW9uCisJCQlrZXlkb3duOiBmdW5jdGlvbiggZSApIHsKKwkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0LCB0eXBlID0gZWxlbS50eXBlOworCisJCQkJaWYgKCAoZS5rZXlDb2RlID09PSAxMyAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJ0ZXh0YXJlYSIpIHx8CisJCQkJCShlLmtleUNvZGUgPT09IDMyICYmICh0eXBlID09PSAiY2hlY2tib3giIHx8IHR5cGUgPT09ICJyYWRpbyIpKSB8fAorCQkJCQl0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKKwkJCQkJcmV0dXJuIHRlc3RDaGFuZ2UuY2FsbCggdGhpcywgZSApOworCQkJCX0KKwkJCX0sCisKKwkJCS8vIEJlZm9yZWFjdGl2YXRlIGhhcHBlbnMgYWxzbyBiZWZvcmUgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXMgYmx1cnJlZAorCQkJLy8gd2l0aCB0aGlzIGV2ZW50IHlvdSBjYW4ndCB0cmlnZ2VyIGEgY2hhbmdlIGV2ZW50LCBidXQgeW91IGNhbiBzdG9yZQorCQkJLy8gaW5mb3JtYXRpb24KKwkJCWJlZm9yZWFjdGl2YXRlOiBmdW5jdGlvbiggZSApIHsKKwkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0OworCQkJCWpRdWVyeS5kYXRhKCBlbGVtLCAiX2NoYW5nZV9kYXRhIiwgZ2V0VmFsKGVsZW0pICk7CisJCQl9CisJCX0sCisKKwkJc2V0dXA6IGZ1bmN0aW9uKCBkYXRhLCBuYW1lc3BhY2VzICkgeworCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJmaWxlIiApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWZvciAoIHZhciB0eXBlIGluIGNoYW5nZUZpbHRlcnMgKSB7CisJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSArICIuc3BlY2lhbENoYW5nZSIsIGNoYW5nZUZpbHRlcnNbdHlwZV0gKTsKKwkJCX0KKworCQkJcmV0dXJuIHJmb3JtRWxlbXMudGVzdCggdGhpcy5ub2RlTmFtZSApOworCQl9LAorCisJCXRlYXJkb3duOiBmdW5jdGlvbiggbmFtZXNwYWNlcyApIHsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbENoYW5nZSIgKTsKKworCQkJcmV0dXJuIHJmb3JtRWxlbXMudGVzdCggdGhpcy5ub2RlTmFtZSApOworCQl9CisJfTsKKworCWNoYW5nZUZpbHRlcnMgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVyczsKKworCS8vIEhhbmRsZSB3aGVuIHRoZSBpbnB1dCBpcyAuZm9jdXMoKSdkCisJY2hhbmdlRmlsdGVycy5mb2N1cyA9IGNoYW5nZUZpbHRlcnMuYmVmb3JlYWN0aXZhdGU7Cit9CisKK2Z1bmN0aW9uIHRyaWdnZXIoIHR5cGUsIGVsZW0sIGFyZ3MgKSB7CisJYXJnc1swXS50eXBlID0gdHlwZTsKKwlyZXR1cm4galF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggZWxlbSwgYXJncyApOworfQorCisvLyBDcmVhdGUgImJ1YmJsaW5nIiBmb2N1cyBhbmQgYmx1ciBldmVudHMKK2lmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKKwlqUXVlcnkuZWFjaCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKKwkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0geworCQkJc2V0dXA6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggZm9jdXNDb3VudHNbZml4XSsrID09PSAwICkgeworCQkJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7CisJCQkJfQorCQkJfSwgCisJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7IAorCQkJCWlmICggLS1mb2N1c0NvdW50c1tmaXhdID09PSAwICkgeworCQkJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7CisJCQkJfQorCQkJfQorCQl9OworCisJCWZ1bmN0aW9uIGhhbmRsZXIoIGUgKSB7IAorCQkJZSA9IGpRdWVyeS5ldmVudC5maXgoIGUgKTsKKwkJCWUudHlwZSA9IGZpeDsKKwkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZS50YXJnZXQgKTsKKwkJfQorCX0pOworfQorCitqUXVlcnkuZWFjaChbImJpbmQiLCAib25lIl0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgeworCQkvLyBIYW5kbGUgb2JqZWN0IGxpdGVyYWxzCisJCWlmICggdHlwZW9mIHR5cGUgPT09ICJvYmplY3QiICkgeworCQkJZm9yICggdmFyIGtleSBpbiB0eXBlICkgeworCQkJCXRoaXNbIG5hbWUgXShrZXksIGRhdGEsIHR5cGVba2V5XSwgZm4pOworCQkJfQorCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSB8fCBkYXRhID09PSBmYWxzZSApIHsKKwkJCWZuID0gZGF0YTsKKwkJCWRhdGEgPSB1bmRlZmluZWQ7CisJCX0KKworCQl2YXIgaGFuZGxlciA9IG5hbWUgPT09ICJvbmUiID8galF1ZXJ5LnByb3h5KCBmbiwgZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJalF1ZXJ5KCB0aGlzICkudW5iaW5kKCBldmVudCwgaGFuZGxlciApOworCQkJcmV0dXJuIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJfSkgOiBmbjsKKworCQlpZiAoIHR5cGUgPT09ICJ1bmxvYWQiICYmIG5hbWUgIT09ICJvbmUiICkgeworCQkJdGhpcy5vbmUoIHR5cGUsIGRhdGEsIGZuICk7CisKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXNbaV0sIHR5cGUsIGhhbmRsZXIsIGRhdGEgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzOworCX07Cit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CisJCS8vIEhhbmRsZSBvYmplY3QgbGl0ZXJhbHMKKwkJaWYgKCB0eXBlb2YgdHlwZSA9PT0gIm9iamVjdCIgJiYgIXR5cGUucHJldmVudERlZmF1bHQgKSB7CisJCQlmb3IgKCB2YXIga2V5IGluIHR5cGUgKSB7CisJCQkJdGhpcy51bmJpbmQoa2V5LCB0eXBlW2tleV0pOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzW2ldLCB0eXBlLCBmbiApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwkKKwlkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7CisJCXJldHVybiB0aGlzLmxpdmUoIHR5cGVzLCBkYXRhLCBmbiwgc2VsZWN0b3IgKTsKKwl9LAorCQorCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgeworCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDAgKSB7CisJCQkJcmV0dXJuIHRoaXMudW5iaW5kKCAibGl2ZSIgKTsKKwkJCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5kaWUoIHR5cGVzLCBudWxsLCBmbiwgc2VsZWN0b3IgKTsKKwkJfQorCX0sCisJCisJdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOworCQl9KTsKKwl9LAorCisJdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQlpZiAoIHRoaXNbMF0gKSB7CisJCQl2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQoIHR5cGUgKTsKKwkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpc1swXSApOworCQkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKKwkJfQorCX0sCisKKwl0b2dnbGU6IGZ1bmN0aW9uKCBmbiApIHsKKwkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQorCQl2YXIgYXJncyA9IGFyZ3VtZW50cywKKwkJCWkgPSAxOworCisJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCisJCXdoaWxlICggaSA8IGFyZ3MubGVuZ3RoICkgeworCQkJalF1ZXJ5LnByb3h5KCBmbiwgYXJnc1sgaSsrIF0gKTsKKwkJfQorCisJCXJldHVybiB0aGlzLmNsaWNrKCBqUXVlcnkucHJveHkoIGZuLCBmdW5jdGlvbiggZXZlbnQgKSB7CisJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUKKwkJCXZhciBsYXN0VG9nZ2xlID0gKCBqUXVlcnkuZGF0YSggdGhpcywgImxhc3RUb2dnbGUiICsgZm4uZ3VpZCApIHx8IDAgKSAlIGk7CisJCQlqUXVlcnkuZGF0YSggdGhpcywgImxhc3RUb2dnbGUiICsgZm4uZ3VpZCwgbGFzdFRvZ2dsZSArIDEgKTsKKworCQkJLy8gTWFrZSBzdXJlIHRoYXQgY2xpY2tzIHN0b3AKKwkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisKKwkJCS8vIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgorCQkJcmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CisJCX0pKTsKKwl9LAorCisJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgeworCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKKwl9Cit9KTsKKwordmFyIGxpdmVNYXAgPSB7CisJZm9jdXM6ICJmb2N1c2luIiwKKwlibHVyOiAiZm9jdXNvdXQiLAorCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAorCW1vdXNlbGVhdmU6ICJtb3VzZW91dCIKK307CisKK2pRdWVyeS5lYWNoKFsibGl2ZSIsICJkaWUiXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuLCBvcmlnU2VsZWN0b3IgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7CisJCXZhciB0eXBlLCBpID0gMCwgbWF0Y2gsIG5hbWVzcGFjZXMsIHByZVR5cGUsCisJCQlzZWxlY3RvciA9IG9yaWdTZWxlY3RvciB8fCB0aGlzLnNlbGVjdG9yLAorCQkJY29udGV4dCA9IG9yaWdTZWxlY3RvciA/IHRoaXMgOiBqUXVlcnkoIHRoaXMuY29udGV4dCApOworCQkKKwkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICYmICF0eXBlcy5wcmV2ZW50RGVmYXVsdCApIHsKKwkJCWZvciAoIHZhciBrZXkgaW4gdHlwZXMgKSB7CisJCQkJY29udGV4dFsgbmFtZSBdKCBrZXksIGRhdGEsIHR5cGVzW2tleV0sIHNlbGVjdG9yICk7CisJCQl9CisJCQkKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJZm4gPSBkYXRhOworCQkJZGF0YSA9IHVuZGVmaW5lZDsKKwkJfQorCisJCXR5cGVzID0gKHR5cGVzIHx8ICIiKS5zcGxpdCgiICIpOworCisJCXdoaWxlICggKHR5cGUgPSB0eXBlc1sgaSsrIF0pICE9IG51bGwgKSB7CisJCQltYXRjaCA9IHJuYW1lc3BhY2VzLmV4ZWMoIHR5cGUgKTsKKwkJCW5hbWVzcGFjZXMgPSAiIjsKKworCQkJaWYgKCBtYXRjaCApICB7CisJCQkJbmFtZXNwYWNlcyA9IG1hdGNoWzBdOworCQkJCXR5cGUgPSB0eXBlLnJlcGxhY2UoIHJuYW1lc3BhY2VzLCAiIiApOworCQkJfQorCisJCQlpZiAoIHR5cGUgPT09ICJob3ZlciIgKSB7CisJCQkJdHlwZXMucHVzaCggIm1vdXNlZW50ZXIiICsgbmFtZXNwYWNlcywgIm1vdXNlbGVhdmUiICsgbmFtZXNwYWNlcyApOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwcmVUeXBlID0gdHlwZTsKKworCQkJaWYgKCB0eXBlID09PSAiZm9jdXMiIHx8IHR5cGUgPT09ICJibHVyIiApIHsKKwkJCQl0eXBlcy5wdXNoKCBsaXZlTWFwWyB0eXBlIF0gKyBuYW1lc3BhY2VzICk7CisJCQkJdHlwZSA9IHR5cGUgKyBuYW1lc3BhY2VzOworCisJCQl9IGVsc2UgeworCQkJCXR5cGUgPSAobGl2ZU1hcFsgdHlwZSBdIHx8IHR5cGUpICsgbmFtZXNwYWNlczsKKwkJCX0KKworCQkJaWYgKCBuYW1lID09PSAibGl2ZSIgKSB7CisJCQkJLy8gYmluZCBsaXZlIGhhbmRsZXIKKwkJCQlmb3IgKCB2YXIgaiA9IDAsIGwgPSBjb250ZXh0Lmxlbmd0aDsgaiA8IGw7IGorKyApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggY29udGV4dFtqXSwgImxpdmUuIiArIGxpdmVDb252ZXJ0KCB0eXBlLCBzZWxlY3RvciApLAorCQkJCQkJeyBkYXRhOiBkYXRhLCBzZWxlY3Rvcjogc2VsZWN0b3IsIGhhbmRsZXI6IGZuLCBvcmlnVHlwZTogdHlwZSwgb3JpZ0hhbmRsZXI6IGZuLCBwcmVUeXBlOiBwcmVUeXBlIH0gKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJLy8gdW5iaW5kIGxpdmUgaGFuZGxlcgorCQkJCWNvbnRleHQudW5iaW5kKCAibGl2ZS4iICsgbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICksIGZuICk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiB0aGlzOworCX07Cit9KTsKKworZnVuY3Rpb24gbGl2ZUhhbmRsZXIoIGV2ZW50ICkgeworCXZhciBzdG9wLCBtYXhMZXZlbCwgcmVsYXRlZCwgbWF0Y2gsIGhhbmRsZU9iaiwgZWxlbSwgaiwgaSwgbCwgZGF0YSwgY2xvc2UsIG5hbWVzcGFjZSwgcmV0LAorCQllbGVtcyA9IFtdLAorCQlzZWxlY3RvcnMgPSBbXSwKKwkJZXZlbnRzID0galF1ZXJ5LmRhdGEoIHRoaXMsIHRoaXMubm9kZVR5cGUgPyAiZXZlbnRzIiA6ICJfX2V2ZW50c19fIiApOworCisJaWYgKCB0eXBlb2YgZXZlbnRzID09PSAiZnVuY3Rpb24iICkgeworCQlldmVudHMgPSBldmVudHMuZXZlbnRzOworCX0KKworCS8vIE1ha2Ugc3VyZSB3ZSBhdm9pZCBub24tbGVmdC1jbGljayBidWJibGluZyBpbiBGaXJlZm94ICgjMzg2MSkKKwlpZiAoIGV2ZW50LmxpdmVGaXJlZCA9PT0gdGhpcyB8fCAhZXZlbnRzIHx8ICFldmVudHMubGl2ZSB8fCBldmVudC5idXR0b24gJiYgZXZlbnQudHlwZSA9PT0gImNsaWNrIiApIHsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIGV2ZW50Lm5hbWVzcGFjZSApIHsKKwkJbmFtZXNwYWNlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIi4iKS5qb2luKCJcXC4oPzouKlxcLik/IikgKyAiKFxcLnwkKSIpOworCX0KKworCWV2ZW50LmxpdmVGaXJlZCA9IHRoaXM7CisKKwl2YXIgbGl2ZSA9IGV2ZW50cy5saXZlLnNsaWNlKDApOworCisJZm9yICggaiA9IDA7IGogPCBsaXZlLmxlbmd0aDsgaisrICkgeworCQloYW5kbGVPYmogPSBsaXZlW2pdOworCisJCWlmICggaGFuZGxlT2JqLm9yaWdUeXBlLnJlcGxhY2UoIHJuYW1lc3BhY2VzLCAiIiApID09PSBldmVudC50eXBlICkgeworCQkJc2VsZWN0b3JzLnB1c2goIGhhbmRsZU9iai5zZWxlY3RvciApOworCisJCX0gZWxzZSB7CisJCQlsaXZlLnNwbGljZSggai0tLCAxICk7CisJCX0KKwl9CisKKwltYXRjaCA9IGpRdWVyeSggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggc2VsZWN0b3JzLCBldmVudC5jdXJyZW50VGFyZ2V0ICk7CisKKwlmb3IgKCBpID0gMCwgbCA9IG1hdGNoLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJY2xvc2UgPSBtYXRjaFtpXTsKKworCQlmb3IgKCBqID0gMDsgaiA8IGxpdmUubGVuZ3RoOyBqKysgKSB7CisJCQloYW5kbGVPYmogPSBsaXZlW2pdOworCisJCQlpZiAoIGNsb3NlLnNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgJiYgKCFuYW1lc3BhY2UgfHwgbmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSkgKSB7CisJCQkJZWxlbSA9IGNsb3NlLmVsZW07CisJCQkJcmVsYXRlZCA9IG51bGw7CisKKwkJCQkvLyBUaG9zZSB0d28gZXZlbnRzIHJlcXVpcmUgYWRkaXRpb25hbCBjaGVja2luZworCQkJCWlmICggaGFuZGxlT2JqLnByZVR5cGUgPT09ICJtb3VzZWVudGVyIiB8fCBoYW5kbGVPYmoucHJlVHlwZSA9PT0gIm1vdXNlbGVhdmUiICkgeworCQkJCQlldmVudC50eXBlID0gaGFuZGxlT2JqLnByZVR5cGU7CisJCQkJCXJlbGF0ZWQgPSBqUXVlcnkoIGV2ZW50LnJlbGF0ZWRUYXJnZXQgKS5jbG9zZXN0KCBoYW5kbGVPYmouc2VsZWN0b3IgKVswXTsKKwkJCQl9CisKKwkJCQlpZiAoICFyZWxhdGVkIHx8IHJlbGF0ZWQgIT09IGVsZW0gKSB7CisJCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBoYW5kbGVPYmo6IGhhbmRsZU9iaiwgbGV2ZWw6IGNsb3NlLmxldmVsIH0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWZvciAoIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQltYXRjaCA9IGVsZW1zW2ldOworCisJCWlmICggbWF4TGV2ZWwgJiYgbWF0Y2gubGV2ZWwgPiBtYXhMZXZlbCApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoLmVsZW07CisJCWV2ZW50LmRhdGEgPSBtYXRjaC5oYW5kbGVPYmouZGF0YTsKKwkJZXZlbnQuaGFuZGxlT2JqID0gbWF0Y2guaGFuZGxlT2JqOworCisJCXJldCA9IG1hdGNoLmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseSggbWF0Y2guZWxlbSwgYXJndW1lbnRzICk7CisKKwkJaWYgKCByZXQgPT09IGZhbHNlIHx8IGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisJCQltYXhMZXZlbCA9IG1hdGNoLmxldmVsOworCisJCQlpZiAoIHJldCA9PT0gZmFsc2UgKSB7CisJCQkJc3RvcCA9IGZhbHNlOworCQkJfQorCQkJaWYgKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHN0b3A7Cit9CisKK2Z1bmN0aW9uIGxpdmVDb252ZXJ0KCB0eXBlLCBzZWxlY3RvciApIHsKKwlyZXR1cm4gKHR5cGUgJiYgdHlwZSAhPT0gIioiID8gdHlwZSArICIuIiA6ICIiKSArIHNlbGVjdG9yLnJlcGxhY2UocnBlcmlvZCwgImAiKS5yZXBsYWNlKHJzcGFjZSwgIiYiKTsKK30KKworalF1ZXJ5LmVhY2goICgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgIiArCisJIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlICIgKworCSJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisKKwkvLyBIYW5kbGUgZXZlbnQgYmluZGluZworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgeworCQlpZiAoIGZuID09IG51bGwgKSB7CisJCQlmbiA9IGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJfQorCisJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CisJCQl0aGlzLmJpbmQoIG5hbWUsIGRhdGEsIGZuICkgOgorCQkJdGhpcy50cmlnZ2VyKCBuYW1lICk7CisJfTsKKworCWlmICggalF1ZXJ5LmF0dHJGbiApIHsKKwkJalF1ZXJ5LmF0dHJGblsgbmFtZSBdID0gdHJ1ZTsKKwl9Cit9KTsKKworLy8gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKy8vIFdpbmRvdyBpc24ndCBpbmNsdWRlZCBzbyBhcyBub3QgdG8gdW5iaW5kIGV4aXN0aW5nIHVubG9hZCBldmVudHMKKy8vIE1vcmUgaW5mbzoKKy8vICAtIGh0dHA6Ly9pc2FhY3NjaGx1ZXRlci5jb20vMjAwNi8xMC9tc2llLW1lbW9yeS1sZWFrcy8KK2lmICggd2luZG93LmF0dGFjaEV2ZW50ICYmICF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciApIHsKKwlqUXVlcnkod2luZG93KS5iaW5kKCJ1bmxvYWQiLCBmdW5jdGlvbigpIHsKKwkJZm9yICggdmFyIGlkIGluIGpRdWVyeS5jYWNoZSApIHsKKwkJCWlmICggalF1ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZSApIHsKKwkJCQkvLyBUcnkvQ2F0Y2ggaXMgdG8gaGFuZGxlIGlmcmFtZXMgYmVpbmcgdW5sb2FkZWQsIHNlZSAjNDI4MAorCQkJCXRyeSB7CisJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUuZWxlbSApOworCQkJCX0gY2F0Y2goZSkge30KKwkJCX0KKwkJfQorCX0pOworfQorCisKKy8qIQorICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgLSB2MS4wCisgKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24KKyAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCisgKiAgTW9yZSBpbmZvcm1hdGlvbjogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqLworKGZ1bmN0aW9uKCl7CisKK3ZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKKwlkb25lID0gMCwKKwl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCisJaGFzRHVwbGljYXRlID0gZmFsc2UsCisJYmFzZUhhc0R1cGxpY2F0ZSA9IHRydWU7CisKKy8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZgorLy8gb3B0aW1pemF0aW9uIHdoZXJlIGl0IGRvZXMgbm90IGFsd2F5cyBjYWxsIG91ciBjb21wYXJpc2lvbgorLy8gZnVuY3Rpb24uIElmIHRoYXQgaXMgdGhlIGNhc2UsIGRpc2NhcmQgdGhlIGhhc0R1cGxpY2F0ZSB2YWx1ZS4KKy8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLgorWzAsIDBdLnNvcnQoZnVuY3Rpb24oKSB7CisJYmFzZUhhc0R1cGxpY2F0ZSA9IGZhbHNlOworCXJldHVybiAwOworfSk7CisKK3ZhciBTaXp6bGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7CisJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CisJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwl2YXIgb3JpZ0NvbnRleHQgPSBjb250ZXh0OworCisJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CisJCXJldHVybiBbXTsKKwl9CisJCisJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCisJdmFyIG0sIHNldCwgY2hlY2tTZXQsIGV4dHJhLCByZXQsIGN1ciwgcG9wLCBpLAorCQlwcnVuZSA9IHRydWUsCisJCWNvbnRleHRYTUwgPSBTaXp6bGUuaXNYTUwoIGNvbnRleHQgKSwKKwkJcGFydHMgPSBbXSwKKwkJc29GYXIgPSBzZWxlY3RvcjsKKwkKKwkvLyBSZXNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNodW5rZXIgcmVnZXhwIChzdGFydCBmcm9tIGhlYWQpCisJZG8geworCQljaHVua2VyLmV4ZWMoICIiICk7CisJCW0gPSBjaHVua2VyLmV4ZWMoIHNvRmFyICk7CisKKwkJaWYgKCBtICkgeworCQkJc29GYXIgPSBtWzNdOworCQkKKwkJCXBhcnRzLnB1c2goIG1bMV0gKTsKKwkJCisJCQlpZiAoIG1bMl0gKSB7CisJCQkJZXh0cmEgPSBtWzNdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZSAoIG0gKTsKKworCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMoIHNlbGVjdG9yICkgKSB7CisKKwkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKKwkJCXNldCA9IHBvc1Byb2Nlc3MoIHBhcnRzWzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsKKworCQl9IGVsc2UgeworCQkJc2V0ID0gRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSA/CisJCQkJWyBjb250ZXh0IF0gOgorCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOworCisJCQl3aGlsZSAoIHBhcnRzLmxlbmd0aCApIHsKKwkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CisKKwkJCQlpZiAoIEV4cHIucmVsYXRpdmVbIHNlbGVjdG9yIF0gKSB7CisJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CisJCQkJfQorCQkJCQorCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKKwkJCX0KKwkJfQorCisJfSBlbHNlIHsKKwkJLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQKKwkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkKKwkJaWYgKCAhc2VlZCAmJiBwYXJ0cy5sZW5ndGggPiAxICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWNvbnRleHRYTUwgJiYKKwkJCQlFeHByLm1hdGNoLklELnRlc3QocGFydHNbMF0pICYmICFFeHByLm1hdGNoLklELnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pICkgeworCisJCQlyZXQgPSBTaXp6bGUuZmluZCggcGFydHMuc2hpZnQoKSwgY29udGV4dCwgY29udGV4dFhNTCApOworCQkJY29udGV4dCA9IHJldC5leHByID8KKwkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApWzBdIDoKKwkJCQlyZXQuc2V0WzBdOworCQl9CisKKwkJaWYgKCBjb250ZXh0ICkgeworCQkJcmV0ID0gc2VlZCA/CisJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6CisJCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgKHBhcnRzWzBdID09PSAifiIgfHwgcGFydHNbMF0gPT09ICIrIikgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgY29udGV4dFhNTCApOworCisJCQlzZXQgPSByZXQuZXhwciA/CisJCQkJU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKSA6CisJCQkJcmV0LnNldDsKKworCQkJaWYgKCBwYXJ0cy5sZW5ndGggPiAwICkgeworCQkJCWNoZWNrU2V0ID0gbWFrZUFycmF5KCBzZXQgKTsKKworCQkJfSBlbHNlIHsKKwkJCQlwcnVuZSA9IGZhbHNlOworCQkJfQorCisJCQl3aGlsZSAoIHBhcnRzLmxlbmd0aCApIHsKKwkJCQljdXIgPSBwYXJ0cy5wb3AoKTsKKwkJCQlwb3AgPSBjdXI7CisKKwkJCQlpZiAoICFFeHByLnJlbGF0aXZlWyBjdXIgXSApIHsKKwkJCQkJY3VyID0gIiI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcG9wID0gcGFydHMucG9wKCk7CisJCQkJfQorCisJCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKKwkJCQkJcG9wID0gY29udGV4dDsKKwkJCQl9CisKKwkJCQlFeHByLnJlbGF0aXZlWyBjdXIgXSggY2hlY2tTZXQsIHBvcCwgY29udGV4dFhNTCApOworCQkJfQorCisJCX0gZWxzZSB7CisJCQljaGVja1NldCA9IHBhcnRzID0gW107CisJCX0KKwl9CisKKwlpZiAoICFjaGVja1NldCApIHsKKwkJY2hlY2tTZXQgPSBzZXQ7CisJfQorCisJaWYgKCAhY2hlY2tTZXQgKSB7CisJCVNpenpsZS5lcnJvciggY3VyIHx8IHNlbGVjdG9yICk7CisJfQorCisJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKKwkJaWYgKCAhcHJ1bmUgKSB7CisJCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGNoZWNrU2V0ICk7CisKKwkJfSBlbHNlIGlmICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSAxICkgeworCQkJZm9yICggaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIChjaGVja1NldFtpXSA9PT0gdHJ1ZSB8fCBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSAmJiBTaXp6bGUuY29udGFpbnMoY29udGV4dCwgY2hlY2tTZXRbaV0pKSApIHsKKwkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKKwkJCQl9CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWZvciAoIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CisJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0gZWxzZSB7CisJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsKKwl9CisKKwlpZiAoIGV4dHJhICkgeworCQlTaXp6bGUoIGV4dHJhLCBvcmlnQ29udGV4dCwgcmVzdWx0cywgc2VlZCApOworCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOworCX0KKworCXJldHVybiByZXN1bHRzOworfTsKKworU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKKwlpZiAoIHNvcnRPcmRlciApIHsKKwkJaGFzRHVwbGljYXRlID0gYmFzZUhhc0R1cGxpY2F0ZTsKKwkJcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKKworCQlpZiAoIGhhc0R1cGxpY2F0ZSApIHsKKwkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CisJCQkJaWYgKCByZXN1bHRzW2ldID09PSByZXN1bHRzWyBpIC0gMSBdICkgeworCQkJCQlyZXN1bHRzLnNwbGljZSggaS0tLCAxICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdHM7Cit9OworCitTaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBzZXQgKSB7CisJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgc2V0ICk7Cit9OworCitTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CisJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgW25vZGVdICkubGVuZ3RoID4gMDsKK307CisKK1NpenpsZS5maW5kID0gZnVuY3Rpb24oIGV4cHIsIGNvbnRleHQsIGlzWE1MICkgeworCXZhciBzZXQ7CisKKwlpZiAoICFleHByICkgeworCQlyZXR1cm4gW107CisJfQorCisJZm9yICggdmFyIGkgPSAwLCBsID0gRXhwci5vcmRlci5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCXZhciBtYXRjaCwKKwkJCXR5cGUgPSBFeHByLm9yZGVyW2ldOworCQkKKwkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CisJCQl2YXIgbGVmdCA9IG1hdGNoWzFdOworCQkJbWF0Y2guc3BsaWNlKCAxLCAxICk7CisKKwkJCWlmICggbGVmdC5zdWJzdHIoIGxlZnQubGVuZ3RoIC0gMSApICE9PSAiXFwiICkgeworCQkJCW1hdGNoWzFdID0gKG1hdGNoWzFdIHx8ICIiKS5yZXBsYWNlKC9cXC9nLCAiIik7CisJCQkJc2V0ID0gRXhwci5maW5kWyB0eXBlIF0oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApOworCisJCQkJaWYgKCBzZXQgIT0gbnVsbCApIHsKKwkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoICFzZXQgKSB7CisJCXNldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICIqIiApOworCX0KKworCXJldHVybiB7IHNldDogc2V0LCBleHByOiBleHByIH07Cit9OworCitTaXp6bGUuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIHNldCwgaW5wbGFjZSwgbm90ICkgeworCXZhciBtYXRjaCwgYW55Rm91bmQsCisJCW9sZCA9IGV4cHIsCisJCXJlc3VsdCA9IFtdLAorCQljdXJMb29wID0gc2V0LAorCQlpc1hNTEZpbHRlciA9IHNldCAmJiBzZXRbMF0gJiYgU2l6emxlLmlzWE1MKCBzZXRbMF0gKTsKKworCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgeworCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHByLmZpbHRlciApIHsKKwkJCWlmICggKG1hdGNoID0gRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgJiYgbWF0Y2hbMl0gKSB7CisJCQkJdmFyIGZvdW5kLCBpdGVtLAorCQkJCQlmaWx0ZXIgPSBFeHByLmZpbHRlclsgdHlwZSBdLAorCQkJCQlsZWZ0ID0gbWF0Y2hbMV07CisKKwkJCQlhbnlGb3VuZCA9IGZhbHNlOworCisJCQkJbWF0Y2guc3BsaWNlKDEsMSk7CisKKwkJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSA9PT0gIlxcIiApIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKCBjdXJMb29wID09PSByZXN1bHQgKSB7CisJCQkJCXJlc3VsdCA9IFtdOworCQkJCX0KKworCQkJCWlmICggRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSApIHsKKwkJCQkJbWF0Y2ggPSBFeHByLnByZUZpbHRlclsgdHlwZSBdKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MRmlsdGVyICk7CisKKwkJCQkJaWYgKCAhbWF0Y2ggKSB7CisJCQkJCQlhbnlGb3VuZCA9IGZvdW5kID0gdHJ1ZTsKKworCQkJCQl9IGVsc2UgaWYgKCBtYXRjaCA9PT0gdHJ1ZSApIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCBtYXRjaCApIHsKKwkJCQkJZm9yICggdmFyIGkgPSAwOyAoaXRlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCQkJCWlmICggaXRlbSApIHsKKwkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKKwkJCQkJCQl2YXIgcGFzcyA9IG5vdCBeICEhZm91bmQ7CisKKwkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKKwkJCQkJCQkJaWYgKCBwYXNzICkgeworCQkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOworCisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CisJCQkJCQkJCX0KKworCQkJCQkJCX0gZWxzZSBpZiAoIHBhc3MgKSB7CisJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CisJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGZvdW5kICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCWlmICggIWlucGxhY2UgKSB7CisJCQkJCQljdXJMb29wID0gcmVzdWx0OworCQkJCQl9CisKKwkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOworCisJCQkJCWlmICggIWFueUZvdW5kICkgeworCQkJCQkJcmV0dXJuIFtdOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gSW1wcm9wZXIgZXhwcmVzc2lvbgorCQlpZiAoIGV4cHIgPT09IG9sZCApIHsKKwkJCWlmICggYW55Rm91bmQgPT0gbnVsbCApIHsKKwkJCQlTaXp6bGUuZXJyb3IoIGV4cHIgKTsKKworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCW9sZCA9IGV4cHI7CisJfQorCisJcmV0dXJuIGN1ckxvb3A7Cit9OworCitTaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgeworCXRocm93ICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgbXNnOworfTsKKwordmFyIEV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0geworCW9yZGVyOiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwKKworCW1hdGNoOiB7CisJCUlEOiAvIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sCisJCUNMQVNTOiAvXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAorCQlOQU1FOiAvXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sCisJCUFUVFI6IC9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sCisJCVRBRzogL14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sCisJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoKGV2ZW58b2RkfFtcZG4rXC1dKilcKSk/LywKKwkJUE9TOiAvOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteXC1dfCQpLywKKwkJUFNFVURPOiAvOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/LworCX0sCisKKwlsZWZ0TWF0Y2g6IHt9LAorCisJYXR0ck1hcDogeworCQkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKKwkJImZvciI6ICJodG1sRm9yIgorCX0sCisKKwlhdHRySGFuZGxlOiB7CisJCWhyZWY6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAiaHJlZiIgKTsKKwkJfQorCX0sCisKKwlyZWxhdGl2ZTogeworCQkiKyI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0KXsKKwkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCisJCQkJaXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdCggcGFydCApLAorCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7CisKKwkJCWlmICggaXNUYWcgKSB7CisJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoLCBlbGVtOyBpIDwgbDsgaSsrICkgeworCQkJCWlmICggKGVsZW0gPSBjaGVja1NldFtpXSkgKSB7CisJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CisKKwkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHJOb3RUYWcgfHwgZWxlbSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcnQgPworCQkJCQkJZWxlbSB8fCBmYWxzZSA6CisJCQkJCQllbGVtID09PSBwYXJ0OworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBpc1BhcnRTdHJOb3RUYWcgKSB7CisJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKKwkJCX0KKwkJfSwKKworCQkiPiI6IGZ1bmN0aW9uKCBjaGVja1NldCwgcGFydCApIHsKKwkJCXZhciBlbGVtLAorCQkJCWlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKKwkJCQlpID0gMCwKKwkJCQlsID0gY2hlY2tTZXQubGVuZ3RoOworCisJCQlpZiAoIGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KCBwYXJ0ICkgKSB7CisJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsKKworCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJZWxlbSA9IGNoZWNrU2V0W2ldOworCisJCQkJCWlmICggZWxlbSApIHsKKwkJCQkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCQkJCQljaGVja1NldFtpXSA9IHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJ0ID8gcGFyZW50IDogZmFsc2U7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJZm9yICggOyBpIDwgbDsgaSsrICkgeworCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CisKKwkJCQkJaWYgKCBlbGVtICkgeworCQkJCQkJY2hlY2tTZXRbaV0gPSBpc1BhcnRTdHIgPworCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CisJCQkJCQkJZWxlbS5wYXJlbnROb2RlID09PSBwYXJ0OworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCBpc1BhcnRTdHIgKSB7CisJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CisJCQkJfQorCQkJfQorCQl9LAorCisJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIG5vZGVDaGVjaywKKwkJCQlkb25lTmFtZSA9IGRvbmUrKywKKwkJCQljaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICEvXFcvLnRlc3QocGFydCkgKSB7CisJCQkJcGFydCA9IHBhcnQudG9Mb3dlckNhc2UoKTsKKwkJCQlub2RlQ2hlY2sgPSBwYXJ0OworCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CisJCQl9CisKKwkJCWNoZWNrRm4oICJwYXJlbnROb2RlIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICk7CisJCX0sCisKKwkJIn4iOiBmdW5jdGlvbiggY2hlY2tTZXQsIHBhcnQsIGlzWE1MICkgeworCQkJdmFyIG5vZGVDaGVjaywKKwkJCQlkb25lTmFtZSA9IGRvbmUrKywKKwkJCQljaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICEvXFcvLnRlc3QoIHBhcnQgKSApIHsKKwkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOworCQkJCW5vZGVDaGVjayA9IHBhcnQ7CisJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKKwkJCX0KKworCQkJY2hlY2tGbiggInByZXZpb3VzU2libGluZyIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApOworCQl9CisJfSwKKworCWZpbmQ6IHsKKwkJSUQ6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKSB7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKKwkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucworCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKKwkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKKwkJCX0KKwkJfSwKKworCQlOQU1FOiBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQgKSB7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKKwkJCQl2YXIgcmV0ID0gW10sCisJCQkJCXJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBtYXRjaFsxXSApOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7CisJCQkJCQlyZXQucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OworCQkJfQorCQl9LAorCisJCVRBRzogZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0ICkgeworCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIG1hdGNoWzFdICk7CisJCX0KKwl9LAorCXByZUZpbHRlcjogeworCQlDTEFTUzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwgKSB7CisJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKSArICIgIjsKKworCQkJaWYgKCBpc1hNTCApIHsKKwkJCQlyZXR1cm4gbWF0Y2g7CisJCQl9CisKKwkJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQkJaWYgKCBlbGVtICkgeworCQkJCQlpZiAoIG5vdCBeIChlbGVtLmNsYXNzTmFtZSAmJiAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UoL1tcdFxuXS9nLCAiICIpLmluZGV4T2YobWF0Y2gpID49IDApICkgeworCQkJCQkJaWYgKCAhaW5wbGFjZSApIHsKKwkJCQkJCQlyZXN1bHQucHVzaCggZWxlbSApOworCQkJCQkJfQorCisJCQkJCX0gZWxzZSBpZiAoIGlucGxhY2UgKSB7CisJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfSwKKworCQlJRDogZnVuY3Rpb24oIG1hdGNoICkgeworCQkJcmV0dXJuIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsKKwkJfSwKKworCQlUQUc6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCApIHsKKwkJCXJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOworCQl9LAorCisJCUNISUxEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisJCQlpZiAoIG1hdGNoWzFdID09PSAibnRoIiApIHsKKwkJCQkvLyBwYXJzZSBlcXVhdGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicKKwkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKiluKCg/OlwrfC0pP1xkKikvLmV4ZWMoCisJCQkJCW1hdGNoWzJdID09PSAiZXZlbiIgJiYgIjJuIiB8fCBtYXRjaFsyXSA9PT0gIm9kZCIgJiYgIjJuKzEiIHx8CisJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CisKKwkJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlcnMgKGZpcnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBuZWdhdGl2ZQorCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOworCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7CisJCQl9CisKKwkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCisJCQltYXRjaFswXSA9IGRvbmUrKzsKKworCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCisJCUFUVFI6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgeworCQkJdmFyIG5hbWUgPSBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CisJCQkKKwkJCWlmICggIWlzWE1MICYmIEV4cHIuYXR0ck1hcFtuYW1lXSApIHsKKwkJCQltYXRjaFsxXSA9IEV4cHIuYXR0ck1hcFtuYW1lXTsKKwkJCX0KKworCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKKwkJCQltYXRjaFs0XSA9ICIgIiArIG1hdGNoWzRdICsgIiAiOworCQkJfQorCisJCQlyZXR1cm4gbWF0Y2g7CisJCX0sCisKKwkJUFNFVURPOiBmdW5jdGlvbiggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90ICkgeworCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CisJCQkJLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgY29tcGxleCBleHByZXNzaW9uLCBvciBhIHNpbXBsZSBvbmUKKwkJCQlpZiAoICggY2h1bmtlci5leGVjKG1hdGNoWzNdKSB8fCAiIiApLmxlbmd0aCA+IDEgfHwgL15cdy8udGVzdChtYXRjaFszXSkgKSB7CisJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKKworCQkJCQlpZiAoICFpbnBsYWNlICkgeworCQkJCQkJcmVzdWx0LnB1c2guYXBwbHkoIHJlc3VsdCwgcmV0ICk7CisJCQkJCX0KKworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCisJCVBPUzogZnVuY3Rpb24oIG1hdGNoICkgeworCQkJbWF0Y2gudW5zaGlmdCggdHJ1ZSApOworCisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9LAorCQorCWZpbHRlcnM6IHsKKwkJZW5hYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKKwkJfSwKKworCQlkaXNhYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKKwkJfSwKKworCQljaGVja2VkOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CisJCX0sCisJCQorCQlzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CisJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CisJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKwkJCQorCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CisJCX0sCisKKwkJcGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAhIWVsZW0uZmlyc3RDaGlsZDsKKwkJfSwKKworCQllbXB0eTogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsKKwkJfSwKKworCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKKwkJCXJldHVybiAhIVNpenpsZSggbWF0Y2hbM10sIGVsZW0gKS5sZW5ndGg7CisJCX0sCisKKwkJaGVhZGVyOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAoL2hcZC9pKS50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CisJCX0sCisKKwkJdGV4dDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gInRleHQiID09PSBlbGVtLnR5cGU7CisJCX0sCisJCXJhZGlvOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAicmFkaW8iID09PSBlbGVtLnR5cGU7CisJCX0sCisKKwkJY2hlY2tib3g6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICJjaGVja2JveCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKworCQlmaWxlOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAiZmlsZSIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJcGFzc3dvcmQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKworCQlzdWJtaXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICJzdWJtaXQiID09PSBlbGVtLnR5cGU7CisJCX0sCisKKwkJaW1hZ2U6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICJpbWFnZSIgPT09IGVsZW0udHlwZTsKKwkJfSwKKworCQlyZXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gInJlc2V0IiA9PT0gZWxlbS50eXBlOworCQl9LAorCisJCWJ1dHRvbjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gImJ1dHRvbiIgPT09IGVsZW0udHlwZSB8fCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJidXR0b24iOworCQl9LAorCisJCWlucHV0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAoL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaSkudGVzdCggZWxlbS5ub2RlTmFtZSApOworCQl9CisJfSwKKwlzZXRGaWx0ZXJzOiB7CisJCWZpcnN0OiBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCXJldHVybiBpID09PSAwOworCQl9LAorCisJCWxhc3Q6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKSB7CisJCQlyZXR1cm4gaSA9PT0gYXJyYXkubGVuZ3RoIC0gMTsKKwkJfSwKKworCQlldmVuOiBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCXJldHVybiBpICUgMiA9PT0gMDsKKwkJfSwKKworCQlvZGQ6IGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQkJcmV0dXJuIGkgJSAyID09PSAxOworCQl9LAorCisJCWx0OiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gaSA8IG1hdGNoWzNdIC0gMDsKKwkJfSwKKworCQlndDogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoICkgeworCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CisJCX0sCisKKwkJbnRoOiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09PSBpOworCQl9LAorCisJCWVxOiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gbWF0Y2hbM10gLSAwID09PSBpOworCQl9CisJfSwKKwlmaWx0ZXI6IHsKKwkJUFNFVURPOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2gsIGksIGFycmF5ICkgeworCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKKwkJCQlmaWx0ZXIgPSBFeHByLmZpbHRlcnNbIG5hbWUgXTsKKworCQkJaWYgKCBmaWx0ZXIgKSB7CisJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CisKKwkJCX0gZWxzZSBpZiAoIG5hbWUgPT09ICJjb250YWlucyIgKSB7CisJCQkJcmV0dXJuIChlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IFNpenpsZS5nZXRUZXh0KFsgZWxlbSBdKSB8fCAiIikuaW5kZXhPZihtYXRjaFszXSkgPj0gMDsKKworCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7CisJCQkJdmFyIG5vdCA9IG1hdGNoWzNdOworCisJCQkJZm9yICggdmFyIGogPSAwLCBsID0gbm90Lmxlbmd0aDsgaiA8IGw7IGorKyApIHsKKwkJCQkJaWYgKCBub3Rbal0gPT09IGVsZW0gKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJfSBlbHNlIHsKKwkJCQlTaXp6bGUuZXJyb3IoICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgbmFtZSApOworCQkJfQorCQl9LAorCisJCUNISUxEOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQl2YXIgdHlwZSA9IG1hdGNoWzFdLAorCQkJCW5vZGUgPSBlbGVtOworCisJCQlzd2l0Y2ggKCB0eXBlICkgeworCQkJCWNhc2UgIm9ubHkiOgorCQkJCWNhc2UgImZpcnN0IjoKKwkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSApCSB7CisJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7IAorCQkJCQkJCXJldHVybiBmYWxzZTsgCisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoIHR5cGUgPT09ICJmaXJzdCIgKSB7IAorCQkJCQkJcmV0dXJuIHRydWU7IAorCQkJCQl9CisKKwkJCQkJbm9kZSA9IGVsZW07CisKKwkJCQljYXNlICJsYXN0IjoKKwkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpICkJIHsKKwkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsgCisJCQkJCQkJcmV0dXJuIGZhbHNlOyAKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXJldHVybiB0cnVlOworCisJCQkJY2FzZSAibnRoIjoKKwkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sCisJCQkJCQlsYXN0ID0gbWF0Y2hbM107CisKKwkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQkJCisJCQkJCXZhciBkb25lTmFtZSA9IG1hdGNoWzBdLAorCQkJCQkJcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOworCQorCQkJCQlpZiAoIHBhcmVudCAmJiAocGFyZW50LnNpemNhY2hlICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgeworCQkJCQkJdmFyIGNvdW50ID0gMDsKKwkJCQkJCQorCQkJCQkJZm9yICggbm9kZSA9IHBhcmVudC5maXJzdENoaWxkOyBub2RlOyBub2RlID0gbm9kZS5uZXh0U2libGluZyApIHsKKwkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKKwkJCQkJCQl9CisJCQkJCQl9IAorCisJCQkJCQlwYXJlbnQuc2l6Y2FjaGUgPSBkb25lTmFtZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGRpZmYgPSBlbGVtLm5vZGVJbmRleCAtIGxhc3Q7CisKKwkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsKKwkJCQkJCXJldHVybiBkaWZmID09PSAwOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTsKKwkJCQkJfQorCQkJfQorCQl9LAorCisJCUlEOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CisJCX0sCisKKwkJVEFHOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gKG1hdGNoID09PSAiKiIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSkgfHwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBtYXRjaDsKKwkJfSwKKwkJCisJCUNMQVNTOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gKCIgIiArIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgKyAiICIpCisJCQkJLmluZGV4T2YoIG1hdGNoICkgPiAtMTsKKwkJfSwKKworCQlBVFRSOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAorCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KKwkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKSA6CisJCQkJCWVsZW1bIG5hbWUgXSAhPSBudWxsID8KKwkJCQkJCWVsZW1bIG5hbWUgXSA6CisJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAorCQkJCXZhbHVlID0gcmVzdWx0ICsgIiIsCisJCQkJdHlwZSA9IG1hdGNoWzJdLAorCQkJCWNoZWNrID0gbWF0Y2hbNF07CisKKwkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CisJCQkJdHlwZSA9PT0gIiE9IiA6CisJCQkJdHlwZSA9PT0gIj0iID8KKwkJCQl2YWx1ZSA9PT0gY2hlY2sgOgorCQkJCXR5cGUgPT09ICIqPSIgPworCQkJCXZhbHVlLmluZGV4T2YoY2hlY2spID49IDAgOgorCQkJCXR5cGUgPT09ICJ+PSIgPworCQkJCSgiICIgKyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6CisJCQkJIWNoZWNrID8KKwkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKKwkJCQl0eXBlID09PSAiIT0iID8KKwkJCQl2YWx1ZSAhPT0gY2hlY2sgOgorCQkJCXR5cGUgPT09ICJePSIgPworCQkJCXZhbHVlLmluZGV4T2YoY2hlY2spID09PSAwIDoKKwkJCQl0eXBlID09PSAiJD0iID8KKwkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgorCQkJCXR5cGUgPT09ICJ8PSIgPworCQkJCXZhbHVlID09PSBjaGVjayB8fCB2YWx1ZS5zdWJzdHIoMCwgY2hlY2subGVuZ3RoICsgMSkgPT09IGNoZWNrICsgIi0iIDoKKwkJCQlmYWxzZTsKKwkJfSwKKworCQlQT1M6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCwgaSwgYXJyYXkgKSB7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzJdLAorCQkJCWZpbHRlciA9IEV4cHIuc2V0RmlsdGVyc1sgbmFtZSBdOworCisJCQlpZiAoIGZpbHRlciApIHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKKwkJCX0KKwkJfQorCX0KK307CisKK3ZhciBvcmlnUE9TID0gRXhwci5tYXRjaC5QT1MsCisJZmVzY2FwZSA9IGZ1bmN0aW9uKGFsbCwgbnVtKXsKKwkJcmV0dXJuICJcXCIgKyAobnVtIC0gMCArIDEpOworCX07CisKK2ZvciAoIHZhciB0eXBlIGluIEV4cHIubWF0Y2ggKSB7CisJRXhwci5tYXRjaFsgdHlwZSBdID0gbmV3IFJlZ0V4cCggRXhwci5tYXRjaFsgdHlwZSBdLnNvdXJjZSArICgvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpICk7CisJRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2UgKyBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZywgZmVzY2FwZSkgKTsKK30KKwordmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKKwlhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSwgMCApOworCisJaWYgKCByZXN1bHRzICkgeworCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CisJCXJldHVybiByZXN1bHRzOworCX0KKwkKKwlyZXR1cm4gYXJyYXk7Cit9OworCisvLyBQZXJmb3JtIGEgc2ltcGxlIGNoZWNrIHRvIGRldGVybWluZSBpZiB0aGUgYnJvd3NlciBpcyBjYXBhYmxlIG9mCisvLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgorLy8gQWxzbyB2ZXJpZmllcyB0aGF0IHRoZSByZXR1cm5lZCBhcnJheSBob2xkcyBET00gbm9kZXMKKy8vICh3aGljaCBpcyBub3QgdGhlIGNhc2UgaW4gdGhlIEJsYWNrYmVycnkgYnJvd3NlcikKK3RyeSB7CisJQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLCAwIClbMF0ubm9kZVR5cGU7CisKKy8vIFByb3ZpZGUgYSBmYWxsYmFjayBtZXRob2QgaWYgaXQgZG9lcyBub3Qgd29yaworfSBjYXRjaCggZSApIHsKKwltYWtlQXJyYXkgPSBmdW5jdGlvbiggYXJyYXksIHJlc3VsdHMgKSB7CisJCXZhciBpID0gMCwKKwkJCXJldCA9IHJlc3VsdHMgfHwgW107CisKKwkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKKwkJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCByZXQsIGFycmF5ICk7CisKKwkJfSBlbHNlIHsKKwkJCWlmICggdHlwZW9mIGFycmF5Lmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CisJCQkJZm9yICggdmFyIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCA7IGFycmF5W2ldOyBpKysgKSB7CisJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfTsKK30KKwordmFyIHNvcnRPcmRlciwgc2libGluZ0NoZWNrOworCitpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsKKwlzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKKwkJaWYgKCBhID09PSBiICkgeworCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiB8fCAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsKKwkJCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8gLTEgOiAxOworCQl9CisKKwkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiA0ID8gLTEgOiAxOworCX07CisKK30gZWxzZSB7CisJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CisJCXZhciBhbCwgYmwsCisJCQlhcCA9IFtdLAorCQkJYnAgPSBbXSwKKwkJCWF1cCA9IGEucGFyZW50Tm9kZSwKKwkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKKwkJCWN1ciA9IGF1cDsKKworCQkvLyBUaGUgbm9kZXMgYXJlIGlkZW50aWNhbCwgd2UgY2FuIGV4aXQgZWFybHkKKwkJaWYgKCBhID09PSBiICkgeworCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJCXJldHVybiAwOworCisJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKKwkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CisJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CisKKwkJLy8gSWYgbm8gcGFyZW50cyB3ZXJlIGZvdW5kIHRoZW4gdGhlIG5vZGVzIGFyZSBkaXNjb25uZWN0ZWQKKwkJfSBlbHNlIGlmICggIWF1cCApIHsKKwkJCXJldHVybiAtMTsKKworCQl9IGVsc2UgaWYgKCAhYnVwICkgeworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvLyBPdGhlcndpc2UgdGhleSdyZSBzb21ld2hlcmUgZWxzZSBpbiB0aGUgdHJlZSBzbyB3ZSBuZWVkCisJCS8vIHRvIGJ1aWxkIHVwIGEgZnVsbCBsaXN0IG9mIHRoZSBwYXJlbnROb2RlcyBmb3IgY29tcGFyaXNvbgorCQl3aGlsZSAoIGN1ciApIHsKKwkJCWFwLnVuc2hpZnQoIGN1ciApOworCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CisJCX0KKworCQljdXIgPSBidXA7CisKKwkJd2hpbGUgKCBjdXIgKSB7CisJCQlicC51bnNoaWZ0KCBjdXIgKTsKKwkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOworCQl9CisKKwkJYWwgPSBhcC5sZW5ndGg7CisJCWJsID0gYnAubGVuZ3RoOworCisJCS8vIFN0YXJ0IHdhbGtpbmcgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CisJCWZvciAoIHZhciBpID0gMDsgaSA8IGFsICYmIGkgPCBibDsgaSsrICkgeworCQkJaWYgKCBhcFtpXSAhPT0gYnBbaV0gKSB7CisJCQkJcmV0dXJuIHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICk7CisJCQl9CisJCX0KKworCQkvLyBXZSBlbmRlZCBzb21lcGxhY2UgdXAgdGhlIHRyZWUgc28gZG8gYSBzaWJsaW5nIGNoZWNrCisJCXJldHVybiBpID09PSBhbCA/CisJCQlzaWJsaW5nQ2hlY2soIGEsIGJwW2ldLCAtMSApIDoKKwkJCXNpYmxpbmdDaGVjayggYXBbaV0sIGIsIDEgKTsKKwl9OworCisJc2libGluZ0NoZWNrID0gZnVuY3Rpb24oIGEsIGIsIHJldCApIHsKKwkJaWYgKCBhID09PSBiICkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXZhciBjdXIgPSBhLm5leHRTaWJsaW5nOworCisJCXdoaWxlICggY3VyICkgeworCQkJaWYgKCBjdXIgPT09IGIgKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQljdXIgPSBjdXIubmV4dFNpYmxpbmc7CisJCX0KKworCQlyZXR1cm4gMTsKKwl9OworfQorCisvLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyZWl2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2RlcworU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbXMgKSB7CisJdmFyIHJldCA9ICIiLCBlbGVtOworCisJZm9yICggdmFyIGkgPSAwOyBlbGVtc1tpXTsgaSsrICkgeworCQllbGVtID0gZWxlbXNbaV07CisKKwkJLy8gR2V0IHRoZSB0ZXh0IGZyb20gdGV4dCBub2RlcyBhbmQgQ0RBVEEgbm9kZXMKKwkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDQgKSB7CisJCQlyZXQgKz0gZWxlbS5ub2RlVmFsdWU7CisKKwkJLy8gVHJhdmVyc2UgZXZlcnl0aGluZyBlbHNlLCBleGNlcHQgY29tbWVudCBub2RlcworCQl9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlICE9PSA4ICkgeworCQkJcmV0ICs9IFNpenpsZS5nZXRUZXh0KCBlbGVtLmNoaWxkTm9kZXMgKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9OworCisvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lIHdoZW4KKy8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlkZSBhIHdvcmthcm91bmQpCisoZnVuY3Rpb24oKXsKKwkvLyBXZSdyZSBnb2luZyB0byBpbmplY3QgYSBmYWtlIGlucHV0IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmllZCBuYW1lCisJdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKKwkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCisJCXJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisKKwlmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKKworCS8vIEluamVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1vdmUgaXQgcXVpY2tseQorCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKKworCS8vIFRoZSB3b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlkCisJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQorCWlmICggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICkgKSB7CisJCUV4cHIuZmluZC5JRCA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKSB7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKKworCQkJCXJldHVybiBtID8KKwkJCQkJbS5pZCA9PT0gbWF0Y2hbMV0gfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZSA9PT0gbWF0Y2hbMV0gPworCQkJCQkJW21dIDoKKwkJCQkJCXVuZGVmaW5lZCA6CisJCQkJCVtdOworCQkJfQorCQl9OworCisJCUV4cHIuZmlsdGVyLklEID0gZnVuY3Rpb24oIGVsZW0sIG1hdGNoICkgeworCQkJdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CisKKwkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIG5vZGUgJiYgbm9kZS5ub2RlVmFsdWUgPT09IG1hdGNoOworCQl9OworCX0KKworCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKKworCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCisJcm9vdCA9IGZvcm0gPSBudWxsOworfSkoKTsKKworKGZ1bmN0aW9uKCl7CisJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgb25seSBlbGVtZW50cworCS8vIHdoZW4gZG9pbmcgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKQorCisJLy8gQ3JlYXRlIGEgZmFrZSBlbGVtZW50CisJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsKKworCS8vIE1ha2Ugc3VyZSBubyBjb21tZW50cyBhcmUgZm91bmQKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CisJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQgKSB7CisJCQl2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIG1hdGNoWzFdICk7CisKKwkJCS8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHMKKwkJCWlmICggbWF0Y2hbMV0gPT09ICIqIiApIHsKKwkJCQl2YXIgdG1wID0gW107CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IHJlc3VsdHNbaV07IGkrKyApIHsKKwkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJdG1wLnB1c2goIHJlc3VsdHNbaV0gKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJlc3VsdHMgPSB0bXA7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHRzOworCQl9OworCX0KKworCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcworCWRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9hPiI7CisKKwlpZiAoIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmCisJCQlkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSAhPT0gIiMiICkgeworCisJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJocmVmIiwgMiApOworCQl9OworCX0KKworCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCisJZGl2ID0gbnVsbDsKK30pKCk7CisKK2lmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHsKKwkoZnVuY3Rpb24oKXsKKwkJdmFyIG9sZFNpenpsZSA9IFNpenpsZSwKKwkJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAorCQkJaWQgPSAiX19zaXp6bGVfXyI7CisKKwkJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CisKKwkJLy8gU2FmYXJpIGNhbid0IGhhbmRsZSB1cHBlcmNhc2Ugb3IgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4KKwkJLy8gaW4gcXVpcmtzIG1vZGUuCisJCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwgJiYgZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoID09PSAwICkgeworCQkJcmV0dXJuOworCQl9CisJCisJCVNpenpsZSA9IGZ1bmN0aW9uKCBxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQgKSB7CisJCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKworCQkJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCisJCQlxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csICI9JyQxJ10iKTsKKworCQkJLy8gT25seSB1c2UgcXVlcnlTZWxlY3RvckFsbCBvbiBub24tWE1MIGRvY3VtZW50cworCQkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKKwkJCWlmICggIXNlZWQgJiYgIVNpenpsZS5pc1hNTChjb250ZXh0KSApIHsKKwkJCQlpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDkgKSB7CisJCQkJCXRyeSB7CisJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLCBleHRyYSApOworCQkJCQl9IGNhdGNoKHFzYUVycm9yKSB7fQorCisJCQkJLy8gcVNBIHdvcmtzIHN0cmFuZ2VseSBvbiBFbGVtZW50LXJvb3RlZCBxdWVyaWVzCisJCQkJLy8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdAorCQkJCS8vIGFuZCB3b3JraW5nIHVwIGZyb20gdGhlcmUgKFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGUgdGVjaG5pcXVlKQorCQkJCS8vIElFIDggZG9lc24ndCB3b3JrIG9uIG9iamVjdCBlbGVtZW50cworCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDEgJiYgY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAib2JqZWN0IiApIHsKKwkJCQkJdmFyIG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCAiaWQiICksCisJCQkJCQluaWQgPSBvbGQgfHwgaWQ7CisKKwkJCQkJaWYgKCAhb2xkICkgeworCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIG5pZCApOworCQkJCQl9CisKKwkJCQkJdHJ5IHsKKwkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggIiMiICsgbmlkICsgIiAiICsgcXVlcnkgKSwgZXh0cmEgKTsKKworCQkJCQl9IGNhdGNoKHBzZXVkb0Vycm9yKSB7CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlpZiAoICFvbGQgKSB7CisJCQkJCQkJY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoICJpZCIgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCisJCQlyZXR1cm4gb2xkU2l6emxlKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCk7CisJCX07CisKKwkJZm9yICggdmFyIHByb3AgaW4gb2xkU2l6emxlICkgeworCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsKKwkJfQorCisJCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCisJCWRpdiA9IG51bGw7CisJfSkoKTsKK30KKworKGZ1bmN0aW9uKCl7CisJdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisJCW1hdGNoZXMgPSBodG1sLm1hdGNoZXNTZWxlY3RvciB8fCBodG1sLm1vek1hdGNoZXNTZWxlY3RvciB8fCBodG1sLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBodG1sLm1zTWF0Y2hlc1NlbGVjdG9yLAorCQlwc2V1ZG9Xb3JrcyA9IGZhbHNlOworCisJdHJ5IHsKKwkJLy8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbgorCQkvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkCisJCW1hdGNoZXMuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAiW3Rlc3QhPScnXTpzaXp6bGUiICk7CisJCisJfSBjYXRjaCggcHNldWRvRXJyb3IgKSB7CisJCXBzZXVkb1dvcmtzID0gdHJ1ZTsKKwl9CisKKwlpZiAoIG1hdGNoZXMgKSB7CisJCVNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggbm9kZSwgZXhwciApIHsKKwkJCS8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZAorCQkJZXhwciA9IGV4cHIucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywgIj0nJDEnXSIpOworCisJCQlpZiAoICFTaXp6bGUuaXNYTUwoIG5vZGUgKSApIHsKKwkJCQl0cnkgeyAKKwkJCQkJaWYgKCBwc2V1ZG9Xb3JrcyB8fCAhRXhwci5tYXRjaC5QU0VVRE8udGVzdCggZXhwciApICYmICEvIT0vLnRlc3QoIGV4cHIgKSApIHsKKwkJCQkJCXJldHVybiBtYXRjaGVzLmNhbGwoIG5vZGUsIGV4cHIgKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2goZSkge30KKwkJCX0KKworCQkJcmV0dXJuIFNpenpsZShleHByLCBudWxsLCBudWxsLCBbbm9kZV0pLmxlbmd0aCA+IDA7CisJCX07CisJfQorfSkoKTsKKworKGZ1bmN0aW9uKCl7CisJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCisJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CisKKwkvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQorCS8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdldEVsZW1lbnRzQnlDbGFzc05hbWUgYWN0dWFsbHkgZXhpc3RzCisJaWYgKCAhZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgfHwgZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDAgKSB7CisJCXJldHVybjsKKwl9CisKKwkvLyBTYWZhcmkgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMsIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcyAoaW4gMy4yKQorCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOworCisJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMSApIHsKKwkJcmV0dXJuOworCX0KKwkKKwlFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKKwlFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICkgeworCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKKwkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOworCQl9CisJfTsKKworCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCisJZGl2ID0gbnVsbDsKK30pKCk7CisKK2Z1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisKKwkJaWYgKCBlbGVtICkgeworCQkJdmFyIG1hdGNoID0gZmFsc2U7CisKKwkJCWVsZW0gPSBlbGVtW2Rpcl07CisKKwkJCXdoaWxlICggZWxlbSApIHsKKwkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgeworCQkJCQltYXRjaCA9IGNoZWNrU2V0W2VsZW0uc2l6c2V0XTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFpc1hNTCApeworCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJCWVsZW0uc2l6c2V0ID0gaTsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gY3VyICkgeworCQkJCQltYXRjaCA9IGVsZW07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl9CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGRpckNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkgeworCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKKworCQlpZiAoIGVsZW0gKSB7CisJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKKwkJCQorCQkJZWxlbSA9IGVsZW1bZGlyXTsKKworCQkJd2hpbGUgKCBlbGVtICkgeworCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCWlmICggIWlzWE1MICkgeworCQkJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOworCQkJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJCQl9CisKKwkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKKwkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgeworCQkJCQkJCW1hdGNoID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CisJCQkJCQltYXRjaCA9IGVsZW07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl9CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CisJCX0KKwl9Cit9CisKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zICkgeworCVNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQlyZXR1cm4gYSAhPT0gYiAmJiAoYS5jb250YWlucyA/IGEuY29udGFpbnMoYikgOiB0cnVlKTsKKwl9OworCit9IGVsc2UgaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CisJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGEsIGIgKSB7CisJCXJldHVybiAhIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTYpOworCX07CisKK30gZWxzZSB7CisJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9OworfQorCitTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHsKKwkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CisJLy8gKHN1Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0gIzQ4MzMpIAorCXZhciBkb2N1bWVudEVsZW1lbnQgPSAoZWxlbSA/IGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtIDogMCkuZG9jdW1lbnRFbGVtZW50OworCisJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cit9OworCit2YXIgcG9zUHJvY2VzcyA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKKwl2YXIgbWF0Y2gsCisJCXRtcFNldCA9IFtdLAorCQlsYXRlciA9ICIiLAorCQlyb290ID0gY29udGV4dC5ub2RlVHlwZSA/IFtjb250ZXh0XSA6IGNvbnRleHQ7CisKKwkvLyBQb3NpdGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKKwkvLyBBbmQgc28gbXVzdCA6bm90KHBvc2l0aW9uYWwpIHNvIHdlIG1vdmUgYWxsIFBTRVVET3MgdG8gdGhlIGVuZAorCXdoaWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7CisJCWxhdGVyICs9IG1hdGNoWzBdOworCQlzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoIEV4cHIubWF0Y2guUFNFVURPLCAiIiApOworCX0KKworCXNlbGVjdG9yID0gRXhwci5yZWxhdGl2ZVtzZWxlY3Rvcl0gPyBzZWxlY3RvciArICIqIiA6IHNlbGVjdG9yOworCisJZm9yICggdmFyIGkgPSAwLCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCVNpenpsZSggc2VsZWN0b3IsIHJvb3RbaV0sIHRtcFNldCApOworCX0KKworCXJldHVybiBTaXp6bGUuZmlsdGVyKCBsYXRlciwgdG1wU2V0ICk7Cit9OworCisvLyBFWFBPU0UKK2pRdWVyeS5maW5kID0gU2l6emxlOworalF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOworalF1ZXJ5LmV4cHJbIjoiXSA9IGpRdWVyeS5leHByLmZpbHRlcnM7CitqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CitqUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0OworalF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MOworalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOworCisKK30pKCk7CisKKwordmFyIHJ1bnRpbCA9IC9VbnRpbCQvLAorCXJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLAorCS8vIE5vdGU6IFRoaXMgUmVnRXhwIHNob3VsZCBiZSBpbXByb3ZlZCwgb3IgbGlrZWx5IHB1bGxlZCBmcm9tIFNpenpsZQorCXJtdWx0aXNlbGVjdG9yID0gLywvLAorCWlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKKwlzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwKKwlQT1MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1M7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIHJldCA9IHRoaXMucHVzaFN0YWNrKCAiIiwgImZpbmQiLCBzZWxlY3RvciApLAorCQkJbGVuZ3RoID0gMDsKKworCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCWxlbmd0aCA9IHJldC5sZW5ndGg7CisJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbaV0sIHJldCApOworCisJCQlpZiAoIGkgPiAwICkgeworCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWUKKwkJCQlmb3IgKCB2YXIgbiA9IGxlbmd0aDsgbiA8IHJldC5sZW5ndGg7IG4rKyApIHsKKwkJCQkJZm9yICggdmFyIHIgPSAwOyByIDwgbGVuZ3RoOyByKysgKSB7CisJCQkJCQlpZiAoIHJldFtyXSA9PT0gcmV0W25dICkgeworCQkJCQkJCXJldC5zcGxpY2Uobi0tLCAxKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKKwkJdmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCApOworCQlyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7CisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0YXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0pOworCX0sCisKKwlub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IsIGZhbHNlKSwgIm5vdCIsIHNlbGVjdG9yKTsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCB0cnVlKSwgImZpbHRlciIsIHNlbGVjdG9yICk7CisJfSwKKwkKKwlpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gISFzZWxlY3RvciAmJiBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgdGhpcyApLmxlbmd0aCA+IDA7CisJfSwKKworCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CisJCXZhciByZXQgPSBbXSwgaSwgbCwgY3VyID0gdGhpc1swXTsKKworCQlpZiAoIGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvcnMgKSApIHsKKwkJCXZhciBtYXRjaCwgc2VsZWN0b3IsCisJCQkJbWF0Y2hlcyA9IHt9LAorCQkJCWxldmVsID0gMTsKKworCQkJaWYgKCBjdXIgJiYgc2VsZWN0b3JzLmxlbmd0aCApIHsKKwkJCQlmb3IgKCBpID0gMCwgbCA9IHNlbGVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCXNlbGVjdG9yID0gc2VsZWN0b3JzW2ldOworCisJCQkJCWlmICggIW1hdGNoZXNbc2VsZWN0b3JdICkgeworCQkJCQkJbWF0Y2hlc1tzZWxlY3Rvcl0gPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MudGVzdCggc2VsZWN0b3IgKSA/IAorCQkJCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgorCQkJCQkJCXNlbGVjdG9yOworCQkJCQl9CisJCQkJfQorCisJCQkJd2hpbGUgKCBjdXIgJiYgY3VyLm93bmVyRG9jdW1lbnQgJiYgY3VyICE9PSBjb250ZXh0ICkgeworCQkJCQlmb3IgKCBzZWxlY3RvciBpbiBtYXRjaGVzICkgeworCQkJCQkJbWF0Y2ggPSBtYXRjaGVzW3NlbGVjdG9yXTsKKworCQkJCQkJaWYgKCBtYXRjaC5qcXVlcnkgPyBtYXRjaC5pbmRleChjdXIpID4gLTEgOiBqUXVlcnkoY3VyKS5pcyhtYXRjaCkgKSB7CisJCQkJCQkJcmV0LnB1c2goeyBzZWxlY3Rvcjogc2VsZWN0b3IsIGVsZW06IGN1ciwgbGV2ZWw6IGxldmVsIH0pOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CisJCQkJCWxldmVsKys7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJdmFyIHBvcyA9IFBPUy50ZXN0KCBzZWxlY3RvcnMgKSA/IAorCQkJalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOiBudWxsOworCisJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQljdXIgPSB0aGlzW2ldOworCisJCQl3aGlsZSAoIGN1ciApIHsKKwkJCQlpZiAoIHBvcyA/IHBvcy5pbmRleChjdXIpID4gLTEgOiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoY3VyLCBzZWxlY3RvcnMpICkgeworCQkJCQlyZXQucHVzaCggY3VyICk7CisJCQkJCWJyZWFrOworCisJCQkJfSBlbHNlIHsKKwkJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CisJCQkJCWlmICggIWN1ciB8fCAhY3VyLm93bmVyRG9jdW1lbnQgfHwgY3VyID09PSBjb250ZXh0ICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXQgPSByZXQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWUocmV0KSA6IHJldDsKKwkJCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCAiY2xvc2VzdCIsIHNlbGVjdG9ycyApOworCX0sCisJCisJLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbgorCS8vIHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cworCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJaWYgKCAhZWxlbSB8fCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7CisJCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sCisJCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBzdHJpbmcsIHRoZSBzZWxlY3RvciBpcyB1c2VkCisJCQkJLy8gSWYgaXQgcmVjZWl2ZXMgbm90aGluZywgdGhlIHNpYmxpbmdzIGFyZSB1c2VkCisJCQkJZWxlbSA/IGpRdWVyeSggZWxlbSApIDogdGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpICk7CisJCX0KKwkJLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50CisJCXJldHVybiBqUXVlcnkuaW5BcnJheSgKKwkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAorCQkJZWxlbS5qcXVlcnkgPyBlbGVtWzBdIDogZWxlbSwgdGhpcyApOworCX0sCisKKwlhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKKwkJdmFyIHNldCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgPworCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgorCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICksCisJCQlhbGwgPSBqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIHNldCApOworCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaXNEaXNjb25uZWN0ZWQoIHNldFswXSApIHx8IGlzRGlzY29ubmVjdGVkKCBhbGxbMF0gKSA/CisJCQlhbGwgOgorCQkJalF1ZXJ5LnVuaXF1ZSggYWxsICkgKTsKKwl9LAorCisJYW5kU2VsZjogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7CisJfQorfSk7CisKKy8vIEEgcGFpbmZ1bGx5IHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYW4gZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQKKy8vIGZyb20gYSBkb2N1bWVudCAoc2hvdWxkIGJlIGltcHJvdmVkLCB3aGVyZSBmZWFzaWJsZSkuCitmdW5jdGlvbiBpc0Rpc2Nvbm5lY3RlZCggbm9kZSApIHsKKwlyZXR1cm4gIW5vZGUgfHwgIW5vZGUucGFyZW50Tm9kZSB8fCBub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IDExOworfQorCitqUXVlcnkuZWFjaCh7CisJcGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKwkJcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDsKKwl9LAorCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiICk7CisJfSwKKwlwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKKwl9LAorCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5Lm50aCggZWxlbSwgMiwgIm5leHRTaWJsaW5nIiApOworCX0sCisJcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkubnRoKCBlbGVtLCAyLCAicHJldmlvdXNTaWJsaW5nIiApOworCX0sCisJbmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciICk7CisJfSwKKwlwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciICk7CisJfSwKKwluZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7CisJfSwKKwlwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciLCB1bnRpbCApOworCX0sCisJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5LnNpYmxpbmcoIGVsZW0ucGFyZW50Tm9kZS5maXJzdENoaWxkLCBlbGVtICk7CisJfSwKKwljaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5maXJzdENoaWxkICk7CisJfSwKKwljb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgPworCQkJZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50IDoKKwkJCWpRdWVyeS5tYWtlQXJyYXkoIGVsZW0uY2hpbGROb2RlcyApOworCX0KK30sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7CisJCXZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTsKKwkJCisJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7CisJCQlzZWxlY3RvciA9IHVudGlsOworCQl9CisKKwkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCQkJcmV0ID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHJldCApOworCQl9CisKKwkJcmV0ID0gdGhpcy5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CisKKwkJaWYgKCAodGhpcy5sZW5ndGggPiAxIHx8IHJtdWx0aXNlbGVjdG9yLnRlc3QoIHNlbGVjdG9yICkpICYmIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CisJCQlyZXQgPSByZXQucmV2ZXJzZSgpOworCQl9CisKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIHNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikgKTsKKwl9OworfSk7CisKK2pRdWVyeS5leHRlbmQoeworCWZpbHRlcjogZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CisJCWlmICggbm90ICkgeworCQkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOworCQl9CisKKwkJcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSA/CisJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoZWxlbXNbMF0sIGV4cHIpID8gWyBlbGVtc1swXSBdIDogW10gOgorCQkJalF1ZXJ5LmZpbmQubWF0Y2hlcyhleHByLCBlbGVtcyk7CisJfSwKKwkKKwlkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgeworCQl2YXIgbWF0Y2hlZCA9IFtdLAorCQkJY3VyID0gZWxlbVsgZGlyIF07CisKKwkJd2hpbGUgKCBjdXIgJiYgY3VyLm5vZGVUeXBlICE9PSA5ICYmICh1bnRpbCA9PT0gdW5kZWZpbmVkIHx8IGN1ci5ub2RlVHlwZSAhPT0gMSB8fCAhalF1ZXJ5KCBjdXIgKS5pcyggdW50aWwgKSkgKSB7CisJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQltYXRjaGVkLnB1c2goIGN1ciApOworCQkJfQorCQkJY3VyID0gY3VyW2Rpcl07CisJCX0KKwkJcmV0dXJuIG1hdGNoZWQ7CisJfSwKKworCW50aDogZnVuY3Rpb24oIGN1ciwgcmVzdWx0LCBkaXIsIGVsZW0gKSB7CisJCXJlc3VsdCA9IHJlc3VsdCB8fCAxOworCQl2YXIgbnVtID0gMDsKKworCQlmb3IgKCA7IGN1cjsgY3VyID0gY3VyW2Rpcl0gKSB7CisJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiArK251bSA9PT0gcmVzdWx0ICkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGN1cjsKKwl9LAorCisJc2libGluZzogZnVuY3Rpb24oIG4sIGVsZW0gKSB7CisJCXZhciByID0gW107CisKKwkJZm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHsKKwkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkgeworCQkJCXIucHVzaCggbiApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHI7CisJfQorfSk7CisKKy8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CitmdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIGtlZXAgKSB7CisJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CisJCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CisJCQl2YXIgcmV0VmFsID0gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApOworCQkJcmV0dXJuIHJldFZhbCA9PT0ga2VlcDsKKwkJfSk7CisKKwl9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CisJCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CisJCQlyZXR1cm4gKGVsZW0gPT09IHF1YWxpZmllcikgPT09IGtlZXA7CisJCX0pOworCisJfSBlbHNlIGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gInN0cmluZyIgKSB7CisJCXZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOworCQl9KTsKKworCQlpZiAoIGlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkgeworCQkJcmV0dXJuIGpRdWVyeS5maWx0ZXIocXVhbGlmaWVyLCBmaWx0ZXJlZCwgIWtlZXApOworCQl9IGVsc2UgeworCQkJcXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBmaWx0ZXJlZCApOworCQl9CisJfQorCisJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJcmV0dXJuIChqUXVlcnkuaW5BcnJheSggZWxlbSwgcXVhbGlmaWVyICkgPj0gMCkgPT09IGtlZXA7CisJfSk7Cit9CisKKworCisKK3ZhciByaW5saW5lalF1ZXJ5ID0gLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywKKwlybGVhZGluZ1doaXRlc3BhY2UgPSAvXlxzKy8sCisJcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZywKKwlydGFnTmFtZSA9IC88KFtcdzpdKykvLAorCXJ0Ym9keSA9IC88dGJvZHkvaSwKKwlyaHRtbCA9IC88fCYjP1x3KzsvLAorCXJub2NhY2hlID0gLzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSwKKwkvLyBjaGVja2VkPSJjaGVja2VkIiBvciBjaGVja2VkIChodG1sNSkKKwlyY2hlY2tlZCA9IC9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLAorCXJhY3Rpb24gPSAvXD0oW149Iic+XHNdK1wvKT4vZywKKwl3cmFwTWFwID0geworCQlvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAorCQlsZWdlbmQ6IFsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0sCisJCXRoZWFkOiBbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdLAorCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKKwkJdGQ6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCisJCWNvbDogWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSwKKwkJYXJlYTogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAorCQlfZGVmYXVsdDogWyAwLCAiIiwgIiIgXQorCX07CisKK3dyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKK3dyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7Cit3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKKworLy8gSUUgY2FuJ3Qgc2VyaWFsaXplIDxsaW5rPiBhbmQgPHNjcmlwdD4gdGFncyBub3JtYWxseQoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSApIHsKKwl3cmFwTWFwLl9kZWZhdWx0ID0gWyAxLCAiZGl2PGRpdj4iLCAiPC9kaXY+IiBdOworfQorCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwl0ZXh0OiBmdW5jdGlvbiggdGV4dCApIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih0ZXh0KSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCXZhciBzZWxmID0galF1ZXJ5KCB0aGlzICk7CisKKwkJCQlzZWxmLnRleHQoIHRleHQuY2FsbCh0aGlzLCBpLCBzZWxmLnRleHQoKSkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCB0eXBlb2YgdGV4dCAhPT0gIm9iamVjdCIgJiYgdGV4dCAhPT0gdW5kZWZpbmVkICkgeworCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS50ZXh0KCB0aGlzICk7CisJfSwKKworCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCQlqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CisJCQl9KTsKKwkJfQorCisJCWlmICggdGhpc1swXSApIHsKKwkJCS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCisJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CisKKwkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkgeworCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CisJCQl9CisKKwkJCXdyYXAubWFwKGZ1bmN0aW9uKCkgeworCQkJCXZhciBlbGVtID0gdGhpczsKKworCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsKKwkJCQl9CisKKwkJCQlyZXR1cm4gZWxlbTsKKwkJCX0pLmFwcGVuZCh0aGlzKTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCQlqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKKwkJCX0pOworCQl9CisKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCXZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksCisJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CisKKwkJCWlmICggY29udGVudHMubGVuZ3RoICkgeworCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKKworCQkJfSBlbHNlIHsKKwkJCQlzZWxmLmFwcGVuZCggaHRtbCApOworCQkJfQorCQl9KTsKKwl9LAorCisJd3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sICk7CisJCX0pOworCX0sCisKKwl1bndyYXA6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkgeworCQkJaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiYm9keSIgKSApIHsKKwkJCQlqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7CisJCQl9CisJCX0pLmVuZCgpOworCX0sCisKKwlhcHBlbmQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICkgeworCQkJCXRoaXMuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKKwkJCX0KKwkJfSk7CisJfSwKKworCXByZXBlbmQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICkgeworCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKKwkJCX0KKwkJfSk7CisJfSwKKworCWJlZm9yZTogZnVuY3Rpb24oKSB7CisJCWlmICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CisJCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CisJCQl9KTsKKwkJfSBlbHNlIGlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKKwkJCXZhciBzZXQgPSBqUXVlcnkoYXJndW1lbnRzWzBdKTsKKwkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIHRoaXMudG9BcnJheSgpICk7CisJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNldCwgImJlZm9yZSIsIGFyZ3VtZW50cyApOworCQl9CisJfSwKKworCWFmdGVyOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKKwkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKKwkJCX0pOworCQl9IGVsc2UgaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgeworCQkJdmFyIHNldCA9IHRoaXMucHVzaFN0YWNrKCB0aGlzLCAiYWZ0ZXIiLCBhcmd1bWVudHMgKTsKKwkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIGpRdWVyeShhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSApOworCQkJcmV0dXJuIHNldDsKKwkJfQorCX0sCisJCisJLy8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnQKKwlyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgKSB7CisJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGggKSB7CisJCQkJaWYgKCAha2VlcERhdGEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpICk7CisJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdICk7CisJCQkJfQorCisJCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CisJCQkJCSBlbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsZW0gKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiB0aGlzOworCX0sCisKKwllbXB0eTogZnVuY3Rpb24oKSB7CisJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKKwkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQlqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKKwkJCX0KKworCQkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKKwkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICkgeworCQkJCWVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY2xvbmU6IGZ1bmN0aW9uKCBldmVudHMgKSB7CisJCS8vIERvIHRoZSBjbG9uZQorCQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKSB7CisJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgJiYgIWpRdWVyeS5pc1hNTERvYyh0aGlzKSApIHsKKwkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCisJCQkJLy8gdXNpbmcgY2xvbmVOb2RlLiBDYWxsaW5nIGRldGFjaEV2ZW50IG9uIHRoZQorCQkJCS8vIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnbmFsCisJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgorCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgc29tZSBtb2RpZmljYXRpb25zIHRvCisJCQkJLy8gYXR0cmlidXRlcyBpbiBJRSB0aGF0IGFyZSBhY3R1YWxseSBvbmx5IHN0b3JlZAorCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQorCQkJCS8vIHRoZSBuYW1lIGF0dHJpYnV0ZSBvbiBhbiBpbnB1dCkuCisJCQkJdmFyIGh0bWwgPSB0aGlzLm91dGVySFRNTCwKKwkJCQkJb3duZXJEb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudDsKKworCQkJCWlmICggIWh0bWwgKSB7CisJCQkJCXZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQkJCQlkaXYuYXBwZW5kQ2hpbGQoIHRoaXMuY2xvbmVOb2RlKHRydWUpICk7CisJCQkJCWh0bWwgPSBkaXYuaW5uZXJIVE1MOworCQkJCX0KKworCQkJCXJldHVybiBqUXVlcnkuY2xlYW4oW2h0bWwucmVwbGFjZShyaW5saW5lalF1ZXJ5LCAiIikKKwkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIGluIElFIDggd2hlcmUgYWN0aW9uPS90ZXN0Lz4gc2VsZi1jbG9zZXMgYSB0YWcKKwkJCQkJLnJlcGxhY2UocmFjdGlvbiwgJz0iJDEiPicpCisJCQkJCS5yZXBsYWNlKHJsZWFkaW5nV2hpdGVzcGFjZSwgIiIpXSwgb3duZXJEb2N1bWVudClbMF07CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKTsKKwkJCX0KKwkJfSk7CisKKwkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQorCQlpZiAoIGV2ZW50cyA9PT0gdHJ1ZSApIHsKKwkJCWNsb25lQ29weUV2ZW50KCB0aGlzLCByZXQgKTsKKwkJCWNsb25lQ29weUV2ZW50KCB0aGlzLmZpbmQoIioiKSwgcmV0LmZpbmQoIioiKSApOworCQl9CisKKwkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCQkJcmV0dXJuIHRoaXNbMF0gJiYgdGhpc1swXS5ub2RlVHlwZSA9PT0gMSA/CisJCQkJdGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShyaW5saW5lalF1ZXJ5LCAiIikgOgorCQkJCW51bGw7CisKKwkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAorCQl9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9jYWNoZS50ZXN0KCB2YWx1ZSApICYmCisJCQkoalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgfHwgIXJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCB2YWx1ZSApKSAmJgorCQkJIXdyYXBNYXBbIChydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpIF0gKSB7CisKKwkJCXZhbHVlID0gdmFsdWUucmVwbGFjZShyeGh0bWxUYWcsICI8JDE+PC8kMj4iKTsKKworCQkJdHJ5IHsKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCisJCQkJCWlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIHRoaXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOworCQkJCQkJdGhpc1tpXS5pbm5lckhUTUwgPSB2YWx1ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJLy8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kCisJCQl9IGNhdGNoKGUpIHsKKwkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOworCQkJfQorCisJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKGkpeworCQkJCXZhciBzZWxmID0galF1ZXJ5KCB0aGlzICk7CisKKwkJCQlzZWxmLmh0bWwoIHZhbHVlLmNhbGwodGhpcywgaSwgc2VsZi5odG1sKCkpICk7CisJCQl9KTsKKworCQl9IGVsc2UgeworCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZXBsYWNlV2l0aDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgeworCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVsZW1lbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIERPTSBiZWZvcmUgdGhleSBhcmUgaW5zZXJ0ZWQKKwkJCS8vIHRoaXMgY2FuIGhlbHAgZml4IHJlcGxhY2luZyBhIHBhcmVudCB3aXRoIGNoaWxkIGVsZW1lbnRzCisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKSwgb2xkID0gc2VsZi5odG1sKCk7CisJCQkJCXNlbGYucmVwbGFjZVdpdGgoIHZhbHVlLmNhbGwoIHRoaXMsIGksIG9sZCApICk7CisJCQkJfSk7CisJCQl9CisKKwkJCWlmICggdHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIiApIHsKKwkJCQl2YWx1ZSA9IGpRdWVyeSggdmFsdWUgKS5kZXRhY2goKTsKKwkJCX0KKworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQl2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsCisJCQkJCXBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKKworCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZSgpOworCisJCQkJaWYgKCBuZXh0ICkgeworCQkJCQlqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApOworCQkJCX0gZWxzZSB7CisJCQkJCWpRdWVyeShwYXJlbnQpLmFwcGVuZCggdmFsdWUgKTsKKwkJCQl9CisJCQl9KTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksICJyZXBsYWNlV2l0aCIsIHZhbHVlICk7CisJCX0KKwl9LAorCisJZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTsKKwl9LAorCisJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CisJCXZhciByZXN1bHRzLCBmaXJzdCwgZnJhZ21lbnQsIHBhcmVudCwKKwkJCXZhbHVlID0gYXJnc1swXSwKKwkJCXNjcmlwdHMgPSBbXTsKKworCQkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKKwkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJalF1ZXJ5KHRoaXMpLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2ssIHRydWUgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKwkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKTsKKwkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCh0aGlzLCBpLCB0YWJsZSA/IHNlbGYuaHRtbCgpIDogdW5kZWZpbmVkKTsKKwkJCQlzZWxmLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCB0aGlzWzBdICkgeworCQkJcGFyZW50ID0gdmFsdWUgJiYgdmFsdWUucGFyZW50Tm9kZTsKKworCQkJLy8gSWYgd2UncmUgaW4gYSBmcmFnbWVudCwganVzdCB1c2UgdGhhdCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZQorCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5wYXJlbnROb2RlICYmIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gdGhpcy5sZW5ndGggKSB7CisJCQkJcmVzdWx0cyA9IHsgZnJhZ21lbnQ6IHBhcmVudCB9OworCisJCQl9IGVsc2UgeworCQkJCXJlc3VsdHMgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpcywgc2NyaXB0cyApOworCQkJfQorCQkJCisJCQlmcmFnbWVudCA9IHJlc3VsdHMuZnJhZ21lbnQ7CisJCQkKKwkJCWlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CisJCQkJZmlyc3QgPSBmcmFnbWVudCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CisJCQl9IGVsc2UgeworCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKKwkJCX0KKworCQkJaWYgKCBmaXJzdCApIHsKKwkJCQl0YWJsZSA9IHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZSggZmlyc3QsICJ0ciIgKTsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQljYWxsYmFjay5jYWxsKAorCQkJCQkJdGFibGUgPworCQkJCQkJCXJvb3QodGhpc1tpXSwgZmlyc3QpIDoKKwkJCQkJCQl0aGlzW2ldLAorCQkJCQkJaSA+IDAgfHwgcmVzdWx0cy5jYWNoZWFibGUgfHwgdGhpcy5sZW5ndGggPiAxICA/CisJCQkJCQkJZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpIDoKKwkJCQkJCQlmcmFnbWVudAorCQkJCQkpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBzY3JpcHRzLmxlbmd0aCApIHsKKwkJCQlqUXVlcnkuZWFjaCggc2NyaXB0cywgZXZhbFNjcmlwdCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfQorfSk7CisKK2Z1bmN0aW9uIHJvb3QoIGVsZW0sIGN1ciApIHsKKwlyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJ0YWJsZSIpID8KKwkJKGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF0gfHwKKwkJZWxlbS5hcHBlbmRDaGlsZChlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSkpIDoKKwkJZWxlbTsKK30KKworZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQob3JpZywgcmV0KSB7CisJdmFyIGkgPSAwOworCisJcmV0LmVhY2goZnVuY3Rpb24oKSB7CisJCWlmICggdGhpcy5ub2RlTmFtZSAhPT0gKG9yaWdbaV0gJiYgb3JpZ1tpXS5ub2RlTmFtZSkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl2YXIgb2xkRGF0YSA9IGpRdWVyeS5kYXRhKCBvcmlnW2krK10gKSwKKwkJCWN1ckRhdGEgPSBqUXVlcnkuZGF0YSggdGhpcywgb2xkRGF0YSApLAorCQkJZXZlbnRzID0gb2xkRGF0YSAmJiBvbGREYXRhLmV2ZW50czsKKworCQlpZiAoIGV2ZW50cyApIHsKKwkJCWRlbGV0ZSBjdXJEYXRhLmhhbmRsZTsKKwkJCWN1ckRhdGEuZXZlbnRzID0ge307CisKKwkJCWZvciAoIHZhciB0eXBlIGluIGV2ZW50cyApIHsKKwkJCQlmb3IgKCB2YXIgaGFuZGxlciBpbiBldmVudHNbIHR5cGUgXSApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXS5kYXRhICk7CisJCQkJfQorCQkJfQorCQl9CisJfSk7Cit9CisKK2pRdWVyeS5idWlsZEZyYWdtZW50ID0gZnVuY3Rpb24oIGFyZ3MsIG5vZGVzLCBzY3JpcHRzICkgeworCXZhciBmcmFnbWVudCwgY2FjaGVhYmxlLCBjYWNoZXJlc3VsdHMsCisJCWRvYyA9IChub2RlcyAmJiBub2Rlc1swXSA/IG5vZGVzWzBdLm93bmVyRG9jdW1lbnQgfHwgbm9kZXNbMF0gOiBkb2N1bWVudCk7CisKKwkvLyBPbmx5IGNhY2hlICJzbWFsbCIgKDEvMiBLQikgc3RyaW5ncyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gZG9jdW1lbnQKKwkvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtCisJLy8gSUUgNiBkb2Vzbid0IGxpa2UgaXQgd2hlbiB5b3UgcHV0IDxvYmplY3Q+IG9yIDxlbWJlZD4gZWxlbWVudHMgaW4gYSBmcmFnbWVudAorCS8vIEFsc28sIFdlYktpdCBkb2VzIG5vdCBjbG9uZSAnY2hlY2tlZCcgYXR0cmlidXRlcyBvbiBjbG9uZU5vZGUsIHNvIGRvbid0IGNhY2hlCisJaWYgKCBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gInN0cmluZyIgJiYgYXJnc1swXS5sZW5ndGggPCA1MTIgJiYgZG9jID09PSBkb2N1bWVudCAmJgorCQkhcm5vY2FjaGUudGVzdCggYXJnc1swXSApICYmIChqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCBhcmdzWzBdICkpICkgeworCisJCWNhY2hlYWJsZSA9IHRydWU7CisJCWNhY2hlcmVzdWx0cyA9IGpRdWVyeS5mcmFnbWVudHNbIGFyZ3NbMF0gXTsKKwkJaWYgKCBjYWNoZXJlc3VsdHMgKSB7CisJCQlpZiAoIGNhY2hlcmVzdWx0cyAhPT0gMSApIHsKKwkJCQlmcmFnbWVudCA9IGNhY2hlcmVzdWx0czsKKwkJCX0KKwkJfQorCX0KKworCWlmICggIWZyYWdtZW50ICkgeworCQlmcmFnbWVudCA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisJCWpRdWVyeS5jbGVhbiggYXJncywgZG9jLCBmcmFnbWVudCwgc2NyaXB0cyApOworCX0KKworCWlmICggY2FjaGVhYmxlICkgeworCQlqUXVlcnkuZnJhZ21lbnRzWyBhcmdzWzBdIF0gPSBjYWNoZXJlc3VsdHMgPyBmcmFnbWVudCA6IDE7CisJfQorCisJcmV0dXJuIHsgZnJhZ21lbnQ6IGZyYWdtZW50LCBjYWNoZWFibGU6IGNhY2hlYWJsZSB9OworfTsKKworalF1ZXJ5LmZyYWdtZW50cyA9IHt9OworCitqUXVlcnkuZWFjaCh7CisJYXBwZW5kVG86ICJhcHBlbmQiLAorCXByZXBlbmRUbzogInByZXBlbmQiLAorCWluc2VydEJlZm9yZTogImJlZm9yZSIsCisJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCisJcmVwbGFjZUFsbDogInJlcGxhY2VXaXRoIgorfSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkgeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcmV0ID0gW10sCisJCQlpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksCisJCQlwYXJlbnQgPSB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLnBhcmVudE5vZGU7CisJCQorCQlpZiAoIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSAmJiBpbnNlcnQubGVuZ3RoID09PSAxICkgeworCQkJaW5zZXJ0WyBvcmlnaW5hbCBdKCB0aGlzWzBdICk7CisJCQlyZXR1cm4gdGhpczsKKwkJCQorCQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQl2YXIgZWxlbXMgPSAoaSA+IDAgPyB0aGlzLmNsb25lKHRydWUpIDogdGhpcykuZ2V0KCk7CisJCQkJalF1ZXJ5KCBpbnNlcnRbaV0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTsKKwkJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOworCQkJfQorCQkKKwkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCBuYW1lLCBpbnNlcnQuc2VsZWN0b3IgKTsKKwkJfQorCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisJY2xlYW46IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgZnJhZ21lbnQsIHNjcmlwdHMgKSB7CisJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OworCisJCS8vICFjb250ZXh0LmNyZWF0ZUVsZW1lbnQgZmFpbHMgaW4gSUUgd2l0aCBhbiBlcnJvciBidXQgcmV0dXJucyB0eXBlb2YgJ29iamVjdCcKKwkJaWYgKCB0eXBlb2YgY29udGV4dC5jcmVhdGVFbGVtZW50ID09PSAidW5kZWZpbmVkIiApIHsKKwkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CisJCX0KKworCQl2YXIgcmV0ID0gW107CisKKwkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApIHsKKwkJCQllbGVtICs9ICIiOworCQkJfQorCisJCQlpZiAoICFlbGVtICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBDb252ZXJ0IGh0bWwgc3RyaW5nIGludG8gRE9NIG5vZGVzCisJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiAmJiAhcmh0bWwudGVzdCggZWxlbSApICkgeworCQkJCWVsZW0gPSBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICk7CisKKwkJCX0gZWxzZSBpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKKwkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycworCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CisKKwkJCQkvLyBUcmltIHdoaXRlc3BhY2UsIG90aGVyd2lzZSBpbmRleE9mIHdvbid0IHdvcmsgYXMgZXhwZWN0ZWQKKwkJCQl2YXIgdGFnID0gKHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIiIsICIiXSlbMV0udG9Mb3dlckNhc2UoKSwKKwkJCQkJd3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQsCisJCQkJCWRlcHRoID0gd3JhcFswXSwKKwkJCQkJZGl2ID0gY29udGV4dC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworCQkJCS8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnMKKwkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOworCisJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKKwkJCQl3aGlsZSAoIGRlcHRoLS0gKSB7CisJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CisJCQkJfQorCisJCQkJLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKKwkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC50Ym9keSApIHsKKworCQkJCQkvLyBTdHJpbmcgd2FzIGEgPHRhYmxlPiwgKm1heSogaGF2ZSBzcHVyaW91cyA8dGJvZHk+CisJCQkJCXZhciBoYXNCb2R5ID0gcnRib2R5LnRlc3QoZWxlbSksCisJCQkJCQl0Ym9keSA9IHRhZyA9PT0gInRhYmxlIiAmJiAhaGFzQm9keSA/CisJCQkJCQkJZGl2LmZpcnN0Q2hpbGQgJiYgZGl2LmZpcnN0Q2hpbGQuY2hpbGROb2RlcyA6CisKKwkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KKwkJCQkJCQl3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIWhhc0JvZHkgPworCQkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CisJCQkJCQkJCVtdOworCisJCQkJCWZvciAoIHZhciBqID0gdGJvZHkubGVuZ3RoIC0gMTsgaiA+PSAwIDsgLS1qICkgeworCQkJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRib2R5WyBqIF0sICJ0Ym9keSIgKSAmJiAhdGJvZHlbIGogXS5jaGlsZE5vZGVzLmxlbmd0aCApIHsKKwkJCQkJCQl0Ym9keVsgaiBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRib2R5WyBqIF0gKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfQorCisJCQkJLy8gSUUgY29tcGxldGVseSBraWxscyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiBpbm5lckhUTUwgaXMgdXNlZAorCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlICYmIHJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCBlbGVtICkgKSB7CisJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIHJsZWFkaW5nV2hpdGVzcGFjZS5leGVjKGVsZW0pWzBdICksIGRpdi5maXJzdENoaWxkICk7CisJCQkJfQorCisJCQkJZWxlbSA9IGRpdi5jaGlsZE5vZGVzOworCQkJfQorCisJCQlpZiAoIGVsZW0ubm9kZVR5cGUgKSB7CisJCQkJcmV0LnB1c2goIGVsZW0gKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0galF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsKKwkJCX0KKwkJfQorCisJCWlmICggZnJhZ21lbnQgKSB7CisJCQlmb3IgKCBpID0gMDsgcmV0W2ldOyBpKysgKSB7CisJCQkJaWYgKCBzY3JpcHRzICYmIGpRdWVyeS5ub2RlTmFtZSggcmV0W2ldLCAic2NyaXB0IiApICYmICghcmV0W2ldLnR5cGUgfHwgcmV0W2ldLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gInRleHQvamF2YXNjcmlwdCIpICkgeworCQkJCQlzY3JpcHRzLnB1c2goIHJldFtpXS5wYXJlbnROb2RlID8gcmV0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJldFtpXSApIDogcmV0W2ldICk7CisJCQkJCisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQlyZXQuc3BsaWNlLmFwcGx5KCByZXQsIFtpICsgMSwgMF0uY29uY2F0KGpRdWVyeS5tYWtlQXJyYXkocmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkpICk7CisJCQkJCX0KKwkJCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIHJldFtpXSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKwkKKwljbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHsKKwkJdmFyIGRhdGEsIGlkLCBjYWNoZSA9IGpRdWVyeS5jYWNoZSwKKwkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKKwkJCWRlbGV0ZUV4cGFuZG8gPSBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvOworCQkKKwkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQlpZiAoIGVsZW0ubm9kZU5hbWUgJiYgalF1ZXJ5Lm5vRGF0YVtlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZCA9IGVsZW1bIGpRdWVyeS5leHBhbmRvIF07CisJCQkKKwkJCWlmICggaWQgKSB7CisJCQkJZGF0YSA9IGNhY2hlWyBpZCBdOworCQkJCQorCQkJCWlmICggZGF0YSAmJiBkYXRhLmV2ZW50cyApIHsKKwkJCQkJZm9yICggdmFyIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CisJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKKwkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CisKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmICggZGVsZXRlRXhwYW5kbyApIHsKKwkJCQkJZGVsZXRlIGVsZW1bIGpRdWVyeS5leHBhbmRvIF07CisKKwkJCQl9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHsKKwkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7CisJCQkJfQorCQkJCQorCQkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKKwkJCX0KKwkJfQorCX0KK30pOworCitmdW5jdGlvbiBldmFsU2NyaXB0KCBpLCBlbGVtICkgeworCWlmICggZWxlbS5zcmMgKSB7CisJCWpRdWVyeS5hamF4KHsKKwkJCXVybDogZWxlbS5zcmMsCisJCQlhc3luYzogZmFsc2UsCisJCQlkYXRhVHlwZTogInNjcmlwdCIKKwkJfSk7CisJfSBlbHNlIHsKKwkJalF1ZXJ5Lmdsb2JhbEV2YWwoIGVsZW0udGV4dCB8fCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJIVE1MIHx8ICIiICk7CisJfQorCisJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CisJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOworCX0KK30KKworCisKKwordmFyIHJhbHBoYSA9IC9hbHBoYVwoW14pXSpcKS9pLAorCXJvcGFjaXR5ID0gL29wYWNpdHk9KFteKV0qKS8sCisJcmRhc2hBbHBoYSA9IC8tKFthLXpdKS9pZywKKwlydXBwZXIgPSAvKFtBLVpdKS9nLAorCXJudW1weCA9IC9eLT9cZCsoPzpweCk/JC9pLAorCXJudW0gPSAvXi0/XGQvLAorCisJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCisJY3NzV2lkdGggPSBbICJMZWZ0IiwgIlJpZ2h0IiBdLAorCWNzc0hlaWdodCA9IFsgIlRvcCIsICJCb3R0b20iIF0sCisJY3VyQ1NTLAorCisJZ2V0Q29tcHV0ZWRTdHlsZSwKKwljdXJyZW50U3R5bGUsCisKKwlmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgeworCQlyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7CisJfTsKKworalF1ZXJ5LmZuLmNzcyA9IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKKwkvLyBTZXR0aW5nICd1bmRlZmluZWQnIGlzIGEgbm8tb3AKKwlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIG5hbWUsIHZhbHVlLCB0cnVlLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KKwkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CisJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CisJfSk7Cit9OworCitqUXVlcnkuZXh0ZW5kKHsKKwkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKKwkvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHkKKwljc3NIb29rczogeworCQlvcGFjaXR5OiB7CisJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKKwkJCQlpZiAoIGNvbXB1dGVkICkgeworCQkJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQorCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIsICJvcGFjaXR5IiApOworCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKKworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBlbGVtLnN0eWxlLm9wYWNpdHk7CisJCQkJfQorCQkJfQorCQl9CisJfSwKKworCS8vIEV4Y2x1ZGUgdGhlIGZvbGxvd2luZyBjc3MgcHJvcGVydGllcyB0byBhZGQgcHgKKwljc3NOdW1iZXI6IHsKKwkJInpJbmRleCI6IHRydWUsCisJCSJmb250V2VpZ2h0IjogdHJ1ZSwKKwkJIm9wYWNpdHkiOiB0cnVlLAorCQkiem9vbSI6IHRydWUsCisJCSJsaW5lSGVpZ2h0IjogdHJ1ZQorCX0sCisKKwkvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlCisJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQorCWNzc1Byb3BzOiB7CisJCS8vIG5vcm1hbGl6ZSBmbG9hdCBjc3MgcHJvcGVydHkKKwkJImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCisJfSwKKworCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCisJc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7CisJCS8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQorCQl2YXIgcmV0LCBvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSwKKwkJCXN0eWxlID0gZWxlbS5zdHlsZSwgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisKKwkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCBvcmlnTmFtZTsKKworCQkvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWUKKwkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCQkJLy8gTWFrZSBzdXJlIHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CisJCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgfHwgdmFsdWUgPT0gbnVsbCApIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKQorCQkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJudW1iZXIiICYmICFqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkgeworCQkJCXZhbHVlICs9ICJweCI7CisJCQl9CisKKwkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZQorCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSApKSAhPT0gdW5kZWZpbmVkICkgeworCQkJCS8vIFdyYXBwZWQgdG8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGVycm9ycyB3aGVuICdpbnZhbGlkJyB2YWx1ZXMgYXJlIHByb3ZpZGVkCisJCQkJLy8gRml4ZXMgYnVnICM1NTA5CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVbIG5hbWUgXSA9IHZhbHVlOworCQkJCX0gY2F0Y2goZSkge30KKwkJCX0KKworCQl9IGVsc2UgeworCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCisJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkgeworCQkJCXJldHVybiByZXQ7CisJCQl9CisKKwkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CisJCQlyZXR1cm4gc3R5bGVbIG5hbWUgXTsKKwkJfQorCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSApIHsKKwkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lCisJCXZhciByZXQsIG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLAorCQkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisKKwkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCBvcmlnTmFtZTsKKworCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQorCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQlyZXR1cm4gcmV0OworCisJCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CisJCX0gZWxzZSBpZiAoIGN1ckNTUyApIHsKKwkJCXJldHVybiBjdXJDU1MoIGVsZW0sIG5hbWUsIG9yaWdOYW1lICk7CisJCX0KKwl9LAorCisJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucworCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsKKwkJdmFyIG9sZCA9IHt9OworCisJCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcworCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgeworCQkJb2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07CisJCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07CisJCX0KKworCQljYWxsYmFjay5jYWxsKCBlbGVtICk7CisKKwkJLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzCisJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOworCQl9CisJfSwKKworCWNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHsKKwkJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7CisJfQorfSk7CisKKy8vIERFUFJFQ0FURUQsIFVzZSBqUXVlcnkuY3NzKCkgaW5zdGVhZAoralF1ZXJ5LmN1ckNTUyA9IGpRdWVyeS5jc3M7CisKK2pRdWVyeS5lYWNoKFsiaGVpZ2h0IiwgIndpZHRoIl0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0geworCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7CisJCQl2YXIgdmFsOworCisJCQlpZiAoIGNvbXB1dGVkICkgeworCQkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApIHsKKwkJCQkJdmFsID0gZ2V0V0goIGVsZW0sIG5hbWUsIGV4dHJhICk7CisKKwkJCQl9IGVsc2UgeworCQkJCQlqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CisJCQkJCQl2YWwgPSBnZXRXSCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKKwkJCQkJfSk7CisJCQkJfQorCisJCQkJaWYgKCB2YWwgPD0gMCApIHsKKwkJCQkJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBuYW1lICk7CisKKwkJCQkJaWYgKCB2YWwgPT09ICIwcHgiICYmIGN1cnJlbnRTdHlsZSApIHsKKwkJCQkJCXZhbCA9IGN1cnJlbnRTdHlsZSggZWxlbSwgbmFtZSwgbmFtZSApOworCQkJCQl9CisKKwkJCQkJaWYgKCB2YWwgIT0gbnVsbCApIHsKKwkJCQkJCS8vIFNob3VsZCByZXR1cm4gImF1dG8iIGluc3RlYWQgb2YgMCwgdXNlIDAgZm9yCisJCQkJCQkvLyB0ZW1wb3JhcnkgYmFja3dhcmRzLWNvbXBhdAorCQkJCQkJcmV0dXJuIHZhbCA9PT0gIiIgfHwgdmFsID09PSAiYXV0byIgPyAiMHB4IiA6IHZhbDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHsKKwkJCQkJdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdOworCisJCQkJCS8vIFNob3VsZCByZXR1cm4gImF1dG8iIGluc3RlYWQgb2YgMCwgdXNlIDAgZm9yCisJCQkJCS8vIHRlbXBvcmFyeSBiYWNrd2FyZHMtY29tcGF0CisJCQkJCXJldHVybiB2YWwgPT09ICIiIHx8IHZhbCA9PT0gImF1dG8iID8gIjBweCIgOiB2YWw7CisJCQkJfQorCisJCQkJcmV0dXJuIHR5cGVvZiB2YWwgPT09ICJzdHJpbmciID8gdmFsIDogdmFsICsgInB4IjsKKwkJCX0KKwkJfSwKKworCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJCWlmICggcm51bXB4LnRlc3QoIHZhbHVlICkgKSB7CisJCQkJLy8gaWdub3JlIG5lZ2F0aXZlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzICMxNTk5CisJCQkJdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsKKworCQkJCWlmICggdmFsdWUgPj0gMCApIHsKKwkJCQkJcmV0dXJuIHZhbHVlICsgInB4IjsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHZhbHVlOworCQkJfQorCQl9CisJfTsKK30pOworCitpZiAoICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICkgeworCWpRdWVyeS5jc3NIb29rcy5vcGFjaXR5ID0geworCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKKwkJCS8vIElFIHVzZXMgZmlsdGVycyBmb3Igb3BhY2l0eQorCQkJcmV0dXJuIHJvcGFjaXR5LnRlc3QoKGNvbXB1dGVkICYmIGVsZW0uY3VycmVudFN0eWxlID8gZWxlbS5jdXJyZW50U3R5bGUuZmlsdGVyIDogZWxlbS5zdHlsZS5maWx0ZXIpIHx8ICIiKSA/CisJCQkJKHBhcnNlRmxvYXQoUmVnRXhwLiQxKSAvIDEwMCkgKyAiIiA6CisJCQkJY29tcHV0ZWQgPyAiMSIgOiAiIjsKKwkJfSwKKworCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGU7CisKKwkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAorCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAorCQkJc3R5bGUuem9vbSA9IDE7CisKKwkJCS8vIFNldCB0aGUgYWxwaGEgZmlsdGVyIHRvIHNldCB0aGUgb3BhY2l0eQorCQkJdmFyIG9wYWNpdHkgPSBqUXVlcnkuaXNOYU4odmFsdWUpID8KKwkJCQkiIiA6CisJCQkJImFscGhhKG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiLAorCQkJCWZpbHRlciA9IHN0eWxlLmZpbHRlciB8fCAiIjsKKworCQkJc3R5bGUuZmlsdGVyID0gcmFscGhhLnRlc3QoZmlsdGVyKSA/CisJCQkJZmlsdGVyLnJlcGxhY2UocmFscGhhLCBvcGFjaXR5KSA6CisJCQkJc3R5bGUuZmlsdGVyICsgJyAnICsgb3BhY2l0eTsKKwkJfQorCX07Cit9CisKK2lmICggZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKKwlnZXRDb21wdXRlZFN0eWxlID0gZnVuY3Rpb24oIGVsZW0sIG5ld05hbWUsIG5hbWUgKSB7CisJCXZhciByZXQsIGRlZmF1bHRWaWV3LCBjb21wdXRlZFN0eWxlOworCisJCW5hbWUgPSBuYW1lLnJlcGxhY2UoIHJ1cHBlciwgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOworCisJCWlmICggIShkZWZhdWx0VmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgKSB7CisJCQlyZXR1cm4gdW5kZWZpbmVkOworCQl9CisKKwkJaWYgKCAoY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKSkgKSB7CisJCQlyZXQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsKKwkJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBlbGVtICkgKSB7CisJCQkJcmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX07Cit9CisKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHsKKwljdXJyZW50U3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKwkJdmFyIGxlZnQsIHJzTGVmdCwKKwkJCXJldCA9IGVsZW0uY3VycmVudFN0eWxlICYmIGVsZW0uY3VycmVudFN0eWxlWyBuYW1lIF0sCisJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CisKKwkJLy8gRnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkcworCQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCisKKwkJLy8gSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVtYmVyCisJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscworCQlpZiAoICFybnVtcHgudGVzdCggcmV0ICkgJiYgcm51bS50ZXN0KCByZXQgKSApIHsKKwkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKwkJCWxlZnQgPSBzdHlsZS5sZWZ0OworCQkJcnNMZWZ0ID0gZWxlbS5ydW50aW1lU3R5bGUubGVmdDsKKworCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAorCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IGVsZW0uY3VycmVudFN0eWxlLmxlZnQ7CisJCQlzdHlsZS5sZWZ0ID0gbmFtZSA9PT0gImZvbnRTaXplIiA/ICIxZW0iIDogKHJldCB8fCAwKTsKKwkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CisKKwkJCS8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXMKKwkJCXN0eWxlLmxlZnQgPSBsZWZ0OworCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IHJzTGVmdDsKKwkJfQorCisJCXJldHVybiByZXQgPT09ICIiID8gImF1dG8iIDogcmV0OworCX07Cit9CisKK2N1ckNTUyA9IGdldENvbXB1dGVkU3R5bGUgfHwgY3VycmVudFN0eWxlOworCitmdW5jdGlvbiBnZXRXSCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7CisJdmFyIHdoaWNoID0gbmFtZSA9PT0gIndpZHRoIiA/IGNzc1dpZHRoIDogY3NzSGVpZ2h0LAorCQl2YWwgPSBuYW1lID09PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OworCisJaWYgKCBleHRyYSA9PT0gImJvcmRlciIgKSB7CisJCXJldHVybiB2YWw7CisJfQorCisJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKKwkJaWYgKCAhZXh0cmEgKSB7CisJCQl2YWwgLT0gcGFyc2VGbG9hdChqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyB0aGlzICkpIHx8IDA7CisJCX0KKworCQlpZiAoIGV4dHJhID09PSAibWFyZ2luIiApIHsKKwkJCXZhbCArPSBwYXJzZUZsb2F0KGpRdWVyeS5jc3MoIGVsZW0sICJtYXJnaW4iICsgdGhpcyApKSB8fCAwOworCisJCX0gZWxzZSB7CisJCQl2YWwgLT0gcGFyc2VGbG9hdChqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkpIHx8IDA7CisJCX0KKwl9KTsKKworCXJldHVybiB2YWw7Cit9CisKK2lmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVycyApIHsKKwlqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgeworCQl2YXIgd2lkdGggPSBlbGVtLm9mZnNldFdpZHRoLAorCQkJaGVpZ2h0ID0gZWxlbS5vZmZzZXRIZWlnaHQ7CisKKwkJcmV0dXJuICh3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDApIHx8ICghalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzICYmIChlbGVtLnN0eWxlLmRpc3BsYXkgfHwgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkpID09PSAibm9uZSIpOworCX07CisKKwlqUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApOworCX07Cit9CisKKworCisKK3ZhciBqc2MgPSBqUXVlcnkubm93KCksCisJcnNjcmlwdCA9IC88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLAorCXJzZWxlY3RUZXh0YXJlYSA9IC9eKD86c2VsZWN0fHRleHRhcmVhKS9pLAorCXJpbnB1dCA9IC9eKD86Y29sb3J8ZGF0ZXxkYXRldGltZXxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrKSQvaSwKKwlybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKKwlyYnJhY2tldCA9IC9cW1xdJC8sCisJanNyZSA9IC9cPVw/KCZ8JCkvLAorCXJxdWVyeSA9IC9cPy8sCisJcnRzID0gLyhbPyZdKV89W14mXSovLAorCXJ1cmwgPSAvXihcdys6KT9cL1wvKFteXC8/I10rKS8sCisJcjIwID0gLyUyMC9nLAorCXJoYXNoID0gLyMuKiQvLAorCisJLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZAorCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQ7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CisJCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgJiYgX2xvYWQgKSB7CisJCQlyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCisJCS8vIERvbid0IGRvIGEgcmVxdWVzdCBpZiBubyBlbGVtZW50cyBhcmUgYmVpbmcgcmVxdWVzdGVkCisJCX0gZWxzZSBpZiAoICF0aGlzLmxlbmd0aCApIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCIgIik7CisJCWlmICggb2ZmID49IDAgKSB7CisJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2Uob2ZmLCB1cmwubGVuZ3RoKTsKKwkJCXVybCA9IHVybC5zbGljZSgwLCBvZmYpOworCQl9CisKKwkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CisJCXZhciB0eXBlID0gIkdFVCI7CisKKwkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCisJCWlmICggcGFyYW1zICkgeworCQkJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKKwkJCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjaworCQkJCWNhbGxiYWNrID0gcGFyYW1zOworCQkJCXBhcmFtcyA9IG51bGw7CisKKwkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKKwkJCX0gZWxzZSBpZiAoIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgeworCQkJCXBhcmFtcyA9IGpRdWVyeS5wYXJhbSggcGFyYW1zLCBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsICk7CisJCQkJdHlwZSA9ICJQT1NUIjsKKwkJCX0KKwkJfQorCisJCXZhciBzZWxmID0gdGhpczsKKworCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKKwkJalF1ZXJ5LmFqYXgoeworCQkJdXJsOiB1cmwsCisJCQl0eXBlOiB0eXBlLAorCQkJZGF0YVR5cGU6ICJodG1sIiwKKwkJCWRhdGE6IHBhcmFtcywKKwkJCWNvbXBsZXRlOiBmdW5jdGlvbiggcmVzLCBzdGF0dXMgKSB7CisJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCisJCQkJaWYgKCBzdGF0dXMgPT09ICJzdWNjZXNzIiB8fCBzdGF0dXMgPT09ICJub3Rtb2RpZmllZCIgKSB7CisJCQkJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQKKwkJCQkJc2VsZi5odG1sKCBzZWxlY3RvciA/CisJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cworCQkJCQkJalF1ZXJ5KCI8ZGl2PiIpCisJCQkJCQkJLy8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzCisJCQkJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCisJCQkJCQkJLmFwcGVuZChyZXMucmVzcG9uc2VUZXh0LnJlcGxhY2UocnNjcmlwdCwgIiIpKQorCisJCQkJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKKwkJCQkJCQkuZmluZChzZWxlY3RvcikgOgorCisJCQkJCQkvLyBJZiBub3QsIGp1c3QgaW5qZWN0IHRoZSBmdWxsIHJlc3VsdAorCQkJCQkJcmVzLnJlc3BvbnNlVGV4dCApOworCQkJCX0KKworCQkJCWlmICggY2FsbGJhY2sgKSB7CisJCQkJCXNlbGYuZWFjaCggY2FsbGJhY2ssIFtyZXMucmVzcG9uc2VUZXh0LCBzdGF0dXMsIHJlc10gKTsKKwkJCQl9CisJCQl9CisJCX0pOworCisJCXJldHVybiB0aGlzOworCX0sCisKKwlzZXJpYWxpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4galF1ZXJ5LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7CisJfSwKKworCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpIDogdGhpczsKKwkJfSkKKwkJLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCXJldHVybiB0aGlzLm5hbWUgJiYgIXRoaXMuZGlzYWJsZWQgJiYKKwkJCQkodGhpcy5jaGVja2VkIHx8IHJzZWxlY3RUZXh0YXJlYS50ZXN0KHRoaXMubm9kZU5hbWUpIHx8CisJCQkJCXJpbnB1dC50ZXN0KHRoaXMudHlwZSkpOworCQl9KQorCQkubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICkgeworCQkJdmFyIHZhbCA9IGpRdWVyeSh0aGlzKS52YWwoKTsKKworCQkJcmV0dXJuIHZhbCA9PSBudWxsID8KKwkJCQludWxsIDoKKwkJCQlqUXVlcnkuaXNBcnJheSh2YWwpID8KKwkJCQkJalF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsLCBpICkgeworCQkJCQkJcmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsIH07CisJCQkJCX0pIDoKKwkJCQkJeyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwgfTsKKwkJfSkuZ2V0KCk7CisJfQorfSk7CisKKy8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCitqUXVlcnkuZWFjaCggImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLCBmdW5jdGlvbiggaSwgbyApIHsKKwlqUXVlcnkuZm5bb10gPSBmdW5jdGlvbiggZiApIHsKKwkJcmV0dXJuIHRoaXMuYmluZChvLCBmKTsKKwl9OworfSk7CisKK2pRdWVyeS5leHRlbmQoeworCWdldDogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7CisJCS8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0ZWQKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJfQorCisJCXJldHVybiBqUXVlcnkuYWpheCh7CisJCQl0eXBlOiAiR0VUIiwKKwkJCXVybDogdXJsLAorCQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAorCQkJZGF0YVR5cGU6IHR5cGUKKwkJfSk7CisJfSwKKworCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBqUXVlcnkuZ2V0KHVybCwgbnVsbCwgY2FsbGJhY2ssICJzY3JpcHQiKTsKKwl9LAorCisJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBqUXVlcnkuZ2V0KHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIik7CisJfSwKKworCXBvc3Q6IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgeworCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdGVkCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKKwkJCXR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrOworCQkJY2FsbGJhY2sgPSBkYXRhOworCQkJZGF0YSA9IHt9OworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5hamF4KHsKKwkJCXR5cGU6ICJQT1NUIiwKKwkJCXVybDogdXJsLAorCQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAorCQkJZGF0YVR5cGU6IHR5cGUKKwkJfSk7CisJfSwKKworCWFqYXhTZXR1cDogZnVuY3Rpb24oIHNldHRpbmdzICkgeworCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCBzZXR0aW5ncyApOworCX0sCisKKwlhamF4U2V0dGluZ3M6IHsKKwkJdXJsOiBsb2NhdGlvbi5ocmVmLAorCQlnbG9iYWw6IHRydWUsCisJCXR5cGU6ICJHRVQiLAorCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCisJCXByb2Nlc3NEYXRhOiB0cnVlLAorCQlhc3luYzogdHJ1ZSwKKwkJLyoKKwkJdGltZW91dDogMCwKKwkJZGF0YTogbnVsbCwKKwkJdXNlcm5hbWU6IG51bGwsCisJCXBhc3N3b3JkOiBudWxsLAorCQl0cmFkaXRpb25hbDogZmFsc2UsCisJCSovCisJCS8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIG92ZXJyaWRlbiBieSBjYWxsaW5nIGpRdWVyeS5hamF4U2V0dXAKKwkJeGhyOiBmdW5jdGlvbigpIHsKKwkJCXJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7CisJCX0sCisJCWFjY2VwdHM6IHsKKwkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAorCQkJaHRtbDogInRleHQvaHRtbCIsCisJCQlzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLAorCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCisJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCisJCQlfZGVmYXVsdDogIiovKiIKKwkJfQorCX0sCisKKwlhamF4OiBmdW5jdGlvbiggb3JpZ1NldHRpbmdzICkgeworCQl2YXIgcyA9IGpRdWVyeS5leHRlbmQodHJ1ZSwge30sIGpRdWVyeS5hamF4U2V0dGluZ3MsIG9yaWdTZXR0aW5ncyksCisJCQlqc29ucCwgc3RhdHVzLCBkYXRhLCB0eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCksIG5vQ29udGVudCA9IHJub0NvbnRlbnQudGVzdCh0eXBlKTsKKworCQlzLnVybCA9IHMudXJsLnJlcGxhY2UoIHJoYXNoLCAiIiApOworCisJCS8vIFVzZSBvcmlnaW5hbCAobm90IGV4dGVuZGVkKSBjb250ZXh0IG9iamVjdCBpZiBpdCB3YXMgcHJvdmlkZWQKKwkJcy5jb250ZXh0ID0gb3JpZ1NldHRpbmdzICYmIG9yaWdTZXR0aW5ncy5jb250ZXh0ICE9IG51bGwgPyBvcmlnU2V0dGluZ3MuY29udGV4dCA6IHM7CisKKwkJLy8gY29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCisJCWlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gInN0cmluZyIgKSB7CisJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOworCQl9CisKKwkJLy8gSGFuZGxlIEpTT05QIFBhcmFtZXRlciBDYWxsYmFja3MKKwkJaWYgKCBzLmRhdGFUeXBlID09PSAianNvbnAiICkgeworCQkJaWYgKCB0eXBlID09PSAiR0VUIiApIHsKKwkJCQlpZiAoICFqc3JlLnRlc3QoIHMudXJsICkgKSB7CisJCQkJCXMudXJsICs9IChycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CisJCQkJfQorCQkJfSBlbHNlIGlmICggIXMuZGF0YSB8fCAhanNyZS50ZXN0KHMuZGF0YSkgKSB7CisJCQkJcy5kYXRhID0gKHMuZGF0YSA/IHMuZGF0YSArICImIiA6ICIiKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKKwkJCX0KKwkJCXMuZGF0YVR5cGUgPSAianNvbiI7CisJCX0KKworCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KKwkJaWYgKCBzLmRhdGFUeXBlID09PSAianNvbiIgJiYgKHMuZGF0YSAmJiBqc3JlLnRlc3Qocy5kYXRhKSB8fCBqc3JlLnRlc3Qocy51cmwpKSApIHsKKwkJCWpzb25wID0gcy5qc29ucENhbGxiYWNrIHx8ICgianNvbnAiICsganNjKyspOworCisJCQkvLyBSZXBsYWNlIHRoZSA9PyBzZXF1ZW5jZSBib3RoIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZSBkYXRhCisJCQlpZiAoIHMuZGF0YSApIHsKKwkJCQlzLmRhdGEgPSAocy5kYXRhICsgIiIpLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKKwkJCX0KKworCQkJcy51cmwgPSBzLnVybC5yZXBsYWNlKGpzcmUsICI9IiArIGpzb25wICsgIiQxIik7CisKKwkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCisJCQkvLyB0aGF0IGEgSlNPTlAgc3R5bGUgcmVzcG9uc2UgaXMgZXhlY3V0ZWQgcHJvcGVybHkKKwkJCXMuZGF0YVR5cGUgPSAic2NyaXB0IjsKKworCQkJLy8gSGFuZGxlIEpTT05QLXN0eWxlIGxvYWRpbmcKKwkJCXZhciBjdXN0b21Kc29ucCA9IHdpbmRvd1sganNvbnAgXTsKKworCQkJd2luZG93WyBqc29ucCBdID0gZnVuY3Rpb24oIHRtcCApIHsKKwkJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBjdXN0b21Kc29ucCApICkgeworCQkJCQljdXN0b21Kc29ucCggdG1wICk7CisKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKKwkJCQkJd2luZG93WyBqc29ucCBdID0gdW5kZWZpbmVkOworCisJCQkJCXRyeSB7CisJCQkJCQlkZWxldGUgd2luZG93WyBqc29ucCBdOworCQkJCQl9IGNhdGNoKCBqc29ucEVycm9yICkge30KKwkJCQl9CisKKwkJCQlkYXRhID0gdG1wOworCQkJCWpRdWVyeS5oYW5kbGVTdWNjZXNzKCBzLCB4aHIsIHN0YXR1cywgZGF0YSApOworCQkJCWpRdWVyeS5oYW5kbGVDb21wbGV0ZSggcywgeGhyLCBzdGF0dXMsIGRhdGEgKTsKKwkJCQkKKwkJCQlpZiAoIGhlYWQgKSB7CisJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJCX0KKwkJCX07CisJCX0KKworCQlpZiAoIHMuZGF0YVR5cGUgPT09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT09IG51bGwgKSB7CisJCQlzLmNhY2hlID0gZmFsc2U7CisJCX0KKworCQlpZiAoIHMuY2FjaGUgPT09IGZhbHNlICYmIG5vQ29udGVudCApIHsKKwkJCXZhciB0cyA9IGpRdWVyeS5ub3coKTsKKworCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQorCQkJdmFyIHJldCA9IHMudXJsLnJlcGxhY2UocnRzLCAiJDFfPSIgKyB0cyk7CisKKwkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKKwkJCXMudXJsID0gcmV0ICsgKChyZXQgPT09IHMudXJsKSA/IChycXVlcnkudGVzdChzLnVybCkgPyAiJiIgOiAiPyIpICsgIl89IiArIHRzIDogIiIpOworCQl9CisKKwkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybCBmb3IgR0VUL0hFQUQgcmVxdWVzdHMKKwkJaWYgKCBzLmRhdGEgJiYgbm9Db250ZW50ICkgeworCQkJcy51cmwgKz0gKHJxdWVyeS50ZXN0KHMudXJsKSA/ICImIiA6ICI/IikgKyBzLmRhdGE7CisJCX0KKworCQkvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCisJCWlmICggcy5nbG9iYWwgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkgeworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CisJCX0KKworCQkvLyBNYXRjaGVzIGFuIGFic29sdXRlIFVSTCwgYW5kIHNhdmVzIHRoZSBkb21haW4KKwkJdmFyIHBhcnRzID0gcnVybC5leGVjKCBzLnVybCApLAorCQkJcmVtb3RlID0gcGFydHMgJiYgKHBhcnRzWzFdICYmIHBhcnRzWzFdLnRvTG93ZXJDYXNlKCkgIT09IGxvY2F0aW9uLnByb3RvY29sIHx8IHBhcnRzWzJdLnRvTG93ZXJDYXNlKCkgIT09IGxvY2F0aW9uLmhvc3QpOworCisJCS8vIElmIHdlJ3JlIHJlcXVlc3RpbmcgYSByZW1vdGUgZG9jdW1lbnQKKwkJLy8gYW5kIHRyeWluZyB0byBsb2FkIEpTT04gb3IgU2NyaXB0IHdpdGggYSBHRVQKKwkJaWYgKCBzLmRhdGFUeXBlID09PSAic2NyaXB0IiAmJiB0eXBlID09PSAiR0VUIiAmJiByZW1vdGUgKSB7CisJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCQkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCQkJaWYgKCBzLnNjcmlwdENoYXJzZXQgKSB7CisJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7CisJCQl9CisJCQlzY3JpcHQuc3JjID0gcy51cmw7CisKKwkJCS8vIEhhbmRsZSBTY3JpcHQgbG9hZGluZworCQkJaWYgKCAhanNvbnAgKSB7CisJCQkJdmFyIGRvbmUgPSBmYWxzZTsKKworCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCisJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKKwkJCQkJaWYgKCAhZG9uZSAmJiAoIXRoaXMucmVhZHlTdGF0ZSB8fAorCQkJCQkJCXRoaXMucmVhZHlTdGF0ZSA9PT0gImxvYWRlZCIgfHwgdGhpcy5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSApIHsKKwkJCQkJCWRvbmUgPSB0cnVlOworCQkJCQkJalF1ZXJ5LmhhbmRsZVN1Y2Nlc3MoIHMsIHhociwgc3RhdHVzLCBkYXRhICk7CisJCQkJCQlqUXVlcnkuaGFuZGxlQ29tcGxldGUoIHMsIHhociwgc3RhdHVzLCBkYXRhICk7CisKKwkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQorCQkJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOworCQkJCQkJaWYgKCBoZWFkICYmIHNjcmlwdC5wYXJlbnROb2RlICkgeworCQkJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKwkJCX0KKworCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuCisJCQkvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFzZSBub2RlIGlzIHVzZWQgKCMyNzA5IGFuZCAjNDM3OCkuCisJCQloZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQgKTsKKworCQkJLy8gV2UgaGFuZGxlIGV2ZXJ5dGhpbmcgdXNpbmcgdGhlIHNjcmlwdCBlbGVtZW50IGluamVjdGlvbgorCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJCXZhciByZXF1ZXN0RG9uZSA9IGZhbHNlOworCisJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3QKKwkJdmFyIHhociA9IHMueGhyKCk7CisKKwkJaWYgKCAheGhyICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gT3BlbiB0aGUgc29ja2V0CisJCS8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQorCQlpZiAoIHMudXNlcm5hbWUgKSB7CisJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFtZSwgcy5wYXNzd29yZCk7CisJCX0gZWxzZSB7CisJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYyk7CisJCX0KKworCQkvLyBOZWVkIGFuIGV4dHJhIHRyeS9jYXRjaCBmb3IgY3Jvc3MgZG9tYWluIHJlcXVlc3RzIGluIEZpcmVmb3ggMworCQl0cnkgeworCQkJLy8gU2V0IGNvbnRlbnQtdHlwZSBpZiBkYXRhIHNwZWNpZmllZCBhbmQgY29udGVudC1ib2R5IGlzIHZhbGlkIGZvciB0aGlzIHR5cGUKKwkJCWlmICggKHMuZGF0YSAhPSBudWxsICYmICFub0NvbnRlbnQpIHx8IChvcmlnU2V0dGluZ3MgJiYgb3JpZ1NldHRpbmdzLmNvbnRlbnRUeXBlKSApIHsKKwkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgcy5jb250ZW50VHlwZSk7CisJCQl9CisKKwkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCisJCQlpZiAoIHMuaWZNb2RpZmllZCApIHsKKwkJCQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdICkgeworCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLCBqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSk7CisJCQkJfQorCisJCQkJaWYgKCBqUXVlcnkuZXRhZ1tzLnVybF0gKSB7CisJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbcy51cmxdKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFNldCBoZWFkZXIgc28gdGhlIGNhbGxlZCBzY3JpcHQga25vd3MgdGhhdCBpdCdzIGFuIFhNTEh0dHBSZXF1ZXN0CisJCQkvLyBPbmx5IHNlbmQgdGhlIGhlYWRlciBpZiBpdCdzIG5vdCBhIHJlbW90ZSBYSFIKKwkJCWlmICggIXJlbW90ZSApIHsKKwkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsICJYTUxIdHRwUmVxdWVzdCIpOworCQkJfQorCisJCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCisJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iiwgcy5kYXRhVHlwZSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSA/CisJCQkJcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gKyAiLCAqLyo7IHE9MC4wMSIgOgorCQkJCXMuYWNjZXB0cy5fZGVmYXVsdCApOworCQl9IGNhdGNoKCBoZWFkZXJFcnJvciApIHt9CisKKwkJLy8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAorCQlpZiAoIHMuYmVmb3JlU2VuZCAmJiBzLmJlZm9yZVNlbmQuY2FsbChzLmNvbnRleHQsIHhociwgcykgPT09IGZhbHNlICkgeworCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisJCQlpZiAoIHMuZ2xvYmFsICYmIGpRdWVyeS5hY3RpdmUtLSA9PT0gMSApIHsKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQkJfQorCisJCQkvLyBjbG9zZSBvcGVuZGVkIHNvY2tldAorCQkJeGhyLmFib3J0KCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIHMuZ2xvYmFsICkgeworCQkJalF1ZXJ5LnRyaWdnZXJHbG9iYWwoIHMsICJhamF4U2VuZCIsIFt4aHIsIHNdICk7CisJCX0KKworCQkvLyBXYWl0IGZvciBhIHJlc3BvbnNlIHRvIGNvbWUgYmFjaworCQl2YXIgb25yZWFkeXN0YXRlY2hhbmdlID0geGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCBpc1RpbWVvdXQgKSB7CisJCQkvLyBUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZAorCQkJaWYgKCAheGhyIHx8IHhoci5yZWFkeVN0YXRlID09PSAwIHx8IGlzVGltZW91dCA9PT0gImFib3J0IiApIHsKKwkJCQkvLyBPcGVyYSBkb2Vzbid0IGNhbGwgb25yZWFkeXN0YXRlY2hhbmdlIGJlZm9yZSB0aGlzIHBvaW50CisJCQkJLy8gc28gd2Ugc2ltdWxhdGUgdGhlIGNhbGwKKwkJCQlpZiAoICFyZXF1ZXN0RG9uZSApIHsKKwkJCQkJalF1ZXJ5LmhhbmRsZUNvbXBsZXRlKCBzLCB4aHIsIHN0YXR1cywgZGF0YSApOworCQkJCX0KKworCQkJCXJlcXVlc3REb25lID0gdHJ1ZTsKKwkJCQlpZiAoIHhociApIHsKKwkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGpRdWVyeS5ub29wOworCQkJCX0KKworCQkJLy8gVGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlIGFuZCB0aGUgZGF0YSBpcyBhdmFpbGFibGUsIG9yIHRoZSByZXF1ZXN0IHRpbWVkIG91dAorCQkJfSBlbHNlIGlmICggIXJlcXVlc3REb25lICYmIHhociAmJiAoeGhyLnJlYWR5U3RhdGUgPT09IDQgfHwgaXNUaW1lb3V0ID09PSAidGltZW91dCIpICkgeworCQkJCXJlcXVlc3REb25lID0gdHJ1ZTsKKwkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7CisKKwkJCQlzdGF0dXMgPSBpc1RpbWVvdXQgPT09ICJ0aW1lb3V0IiA/CisJCQkJCSJ0aW1lb3V0IiA6CisJCQkJCSFqUXVlcnkuaHR0cFN1Y2Nlc3MoIHhociApID8KKwkJCQkJCSJlcnJvciIgOgorCQkJCQkJcy5pZk1vZGlmaWVkICYmIGpRdWVyeS5odHRwTm90TW9kaWZpZWQoIHhociwgcy51cmwgKSA/CisJCQkJCQkJIm5vdG1vZGlmaWVkIiA6CisJCQkJCQkJInN1Y2Nlc3MiOworCisJCQkJdmFyIGVyck1zZzsKKworCQkJCWlmICggc3RhdHVzID09PSAic3VjY2VzcyIgKSB7CisJCQkJCS8vIFdhdGNoIGZvciwgYW5kIGNhdGNoLCBYTUwgZG9jdW1lbnQgcGFyc2UgZXJyb3JzCisJCQkJCXRyeSB7CisJCQkJCQkvLyBwcm9jZXNzIHRoZSBkYXRhIChydW5zIHRoZSB4bWwgdGhyb3VnaCBodHRwRGF0YSByZWdhcmRsZXNzIG9mIGNhbGxiYWNrKQorCQkJCQkJZGF0YSA9IGpRdWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzICk7CisJCQkJCX0gY2F0Y2goIHBhcnNlckVycm9yICkgeworCQkJCQkJc3RhdHVzID0gInBhcnNlcmVycm9yIjsKKwkJCQkJCWVyck1zZyA9IHBhcnNlckVycm9yOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90bW9kaWZpZWQKKwkJCQlpZiAoIHN0YXR1cyA9PT0gInN1Y2Nlc3MiIHx8IHN0YXR1cyA9PT0gIm5vdG1vZGlmaWVkIiApIHsKKwkJCQkJLy8gSlNPTlAgaGFuZGxlcyBpdHMgb3duIHN1Y2Nlc3MgY2FsbGJhY2sKKwkJCQkJaWYgKCAhanNvbnAgKSB7CisJCQkJCQlqUXVlcnkuaGFuZGxlU3VjY2VzcyggcywgeGhyLCBzdGF0dXMsIGRhdGEgKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWpRdWVyeS5oYW5kbGVFcnJvciggcywgeGhyLCBzdGF0dXMsIGVyck1zZyApOworCQkJCX0KKworCQkJCS8vIEZpcmUgdGhlIGNvbXBsZXRlIGhhbmRsZXJzCisJCQkJaWYgKCAhanNvbnAgKSB7CisJCQkJCWpRdWVyeS5oYW5kbGVDb21wbGV0ZSggcywgeGhyLCBzdGF0dXMsIGRhdGEgKTsKKwkJCQl9CisKKwkJCQlpZiAoIGlzVGltZW91dCA9PT0gInRpbWVvdXQiICkgeworCQkJCQl4aHIuYWJvcnQoKTsKKwkJCQl9CisKKwkJCQkvLyBTdG9wIG1lbW9yeSBsZWFrcworCQkJCWlmICggcy5hc3luYyApIHsKKwkJCQkJeGhyID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCX07CisKKwkJLy8gT3ZlcnJpZGUgdGhlIGFib3J0IGhhbmRsZXIsIGlmIHdlIGNhbiAoSUUgNiBkb2Vzbid0IGFsbG93IGl0LCBidXQgdGhhdCdzIE9LKQorCQkvLyBPcGVyYSBkb2Vzbid0IGZpcmUgb25yZWFkeXN0YXRlY2hhbmdlIGF0IGFsbCBvbiBhYm9ydAorCQl0cnkgeworCQkJdmFyIG9sZEFib3J0ID0geGhyLmFib3J0OworCQkJeGhyLmFib3J0ID0gZnVuY3Rpb24oKSB7CisJCQkJaWYgKCB4aHIgKSB7CisJCQkJCS8vIG9sZEFib3J0IGhhcyBubyBjYWxsIHByb3BlcnR5IGluIElFNyBzbworCQkJCQkvLyBqdXN0IGRvIGl0IHRoaXMgd2F5LCB3aGljaCB3b3JrcyBpbiBhbGwKKwkJCQkJLy8gYnJvd3NlcnMKKwkJCQkJRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuY2FsbCggb2xkQWJvcnQsIHhociApOworCQkJCX0KKworCQkJCW9ucmVhZHlzdGF0ZWNoYW5nZSggImFib3J0IiApOworCQkJfTsKKwkJfSBjYXRjaCggYWJvcnRFcnJvciApIHt9CisKKwkJLy8gVGltZW91dCBjaGVja2VyCisJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgeworCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKKwkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlIHJlcXVlc3QgaXMgc3RpbGwgaGFwcGVuaW5nCisJCQkJaWYgKCB4aHIgJiYgIXJlcXVlc3REb25lICkgeworCQkJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoICJ0aW1lb3V0IiApOworCQkJCX0KKwkJCX0sIHMudGltZW91dCk7CisJCX0KKworCQkvLyBTZW5kIHRoZSBkYXRhCisJCXRyeSB7CisJCQl4aHIuc2VuZCggbm9Db250ZW50IHx8IHMuZGF0YSA9PSBudWxsID8gbnVsbCA6IHMuZGF0YSApOworCisJCX0gY2F0Y2goIHNlbmRFcnJvciApIHsKKwkJCWpRdWVyeS5oYW5kbGVFcnJvciggcywgeGhyLCBudWxsLCBzZW5kRXJyb3IgKTsKKworCQkJLy8gRmlyZSB0aGUgY29tcGxldGUgaGFuZGxlcnMKKwkJCWpRdWVyeS5oYW5kbGVDb21wbGV0ZSggcywgeGhyLCBzdGF0dXMsIGRhdGEgKTsKKwkJfQorCisJCS8vIGZpcmVmb3ggMS41IGRvZXNuJ3QgZmlyZSBzdGF0ZWNoYW5nZSBmb3Igc3luYyByZXF1ZXN0cworCQlpZiAoICFzLmFzeW5jICkgeworCQkJb25yZWFkeXN0YXRlY2hhbmdlKCk7CisJCX0KKworCQkvLyByZXR1cm4gWE1MSHR0cFJlcXVlc3QgdG8gYWxsb3cgYWJvcnRpbmcgdGhlIHJlcXVlc3QgZXRjLgorCQlyZXR1cm4geGhyOworCX0sCisKKwkvLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZgorCS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZworCXBhcmFtOiBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CisJCXZhciBzID0gW10sCisJCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKKwkJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKKwkJCQl2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZTsKKwkJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOworCQkJfTsKKwkJCisJCS8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuCisJCWlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHsKKwkJCXRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKKwkJfQorCQkKKwkJLy8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy4KKwkJaWYgKCBqUXVlcnkuaXNBcnJheShhKSB8fCBhLmpxdWVyeSApIHsKKwkJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cworCQkJalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkgeworCQkJCWFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7CisJCQl9KTsKKwkJCQorCQl9IGVsc2UgeworCQkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCisJCQkvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4KKwkJCWZvciAoIHZhciBwcmVmaXggaW4gYSApIHsKKwkJCQlidWlsZFBhcmFtcyggcHJlZml4LCBhW3ByZWZpeF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKwkJCX0KKwkJfQorCisJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KKwkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UocjIwLCAiKyIpOworCX0KK30pOworCitmdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7CisJaWYgKCBqUXVlcnkuaXNBcnJheShvYmopICYmIG9iai5sZW5ndGggKSB7CisJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgorCQlqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHsKKwkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CisJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgorCQkJCWFkZCggcHJlZml4LCB2ICk7CisKKwkJCX0gZWxzZSB7CisJCQkJLy8gSWYgYXJyYXkgaXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzCisJCQkJLy8gbnVtZXJpYyBpbmRleCB0byByZXNvbHZlIGRlc2VyaWFsaXphdGlvbiBhbWJpZ3VpdHkgaXNzdWVzLgorCQkJCS8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplCisJCQkJLy8gbmVzdGVkIGFycmF5cyBwcm9wZXJseSwgYW5kIGF0dGVtcHRpbmcgdG8gZG8gc28gbWF5IGNhdXNlCisJCQkJLy8gYSBzZXJ2ZXIgZXJyb3IuIFBvc3NpYmxlIGZpeGVzIGFyZSB0byBtb2RpZnkgcmFjaydzCisJCQkJLy8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnCisJCQkJLy8gdG8gZm9yY2UgYXJyYXkgc2VyaWFsaXphdGlvbiB0byBiZSBzaGFsbG93LgorCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiB8fCBqUXVlcnkuaXNBcnJheSh2KSA/IGkgOiAiIiApICsgIl0iLCB2LCB0cmFkaXRpb25hbCwgYWRkICk7CisJCQl9CisJCX0pOworCQkJCisJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICkgeworCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvYmogKSApIHsKKwkJCWFkZCggcHJlZml4LCAiIiApOworCisJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KKwkJfSBlbHNlIHsKKwkJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBrLCB2ICkgeworCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBrICsgIl0iLCB2LCB0cmFkaXRpb25hbCwgYWRkICk7CisJCQl9KTsKKwkJfQorCQkJCQkKKwl9IGVsc2UgeworCQkvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uCisJCWFkZCggcHJlZml4LCBvYmogKTsKKwl9Cit9CisKKy8vIFRoaXMgaXMgc3RpbGwgb24gdGhlIGpRdWVyeSBvYmplY3QuLi4gZm9yIG5vdworLy8gV2FudCB0byBtb3ZlIHRoaXMgdG8galF1ZXJ5LmFqYXggc29tZSBkYXkKK2pRdWVyeS5leHRlbmQoeworCisJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCisJYWN0aXZlOiAwLAorCisJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAorCWxhc3RNb2RpZmllZDoge30sCisJZXRhZzoge30sCisKKwloYW5kbGVFcnJvcjogZnVuY3Rpb24oIHMsIHhociwgc3RhdHVzLCBlICkgeworCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQKKwkJaWYgKCBzLmVycm9yICkgeworCQkJcy5lcnJvci5jYWxsKCBzLmNvbnRleHQsIHhociwgc3RhdHVzLCBlICk7CisJCX0KKworCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2FsbGJhY2sKKwkJaWYgKCBzLmdsb2JhbCApIHsKKwkJCWpRdWVyeS50cmlnZ2VyR2xvYmFsKCBzLCAiYWpheEVycm9yIiwgW3hociwgcywgZV0gKTsKKwkJfQorCX0sCisKKwloYW5kbGVTdWNjZXNzOiBmdW5jdGlvbiggcywgeGhyLCBzdGF0dXMsIGRhdGEgKSB7CisJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgZmlyZSBpdCBhbmQgcGFzcyBpdCB0aGUgZGF0YQorCQlpZiAoIHMuc3VjY2VzcyApIHsKKwkJCXMuc3VjY2Vzcy5jYWxsKCBzLmNvbnRleHQsIGRhdGEsIHN0YXR1cywgeGhyICk7CisJCX0KKworCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2FsbGJhY2sKKwkJaWYgKCBzLmdsb2JhbCApIHsKKwkJCWpRdWVyeS50cmlnZ2VyR2xvYmFsKCBzLCAiYWpheFN1Y2Nlc3MiLCBbeGhyLCBzXSApOworCQl9CisJfSwKKworCWhhbmRsZUNvbXBsZXRlOiBmdW5jdGlvbiggcywgeGhyLCBzdGF0dXMgKSB7CisJCS8vIFByb2Nlc3MgcmVzdWx0CisJCWlmICggcy5jb21wbGV0ZSApIHsKKwkJCXMuY29tcGxldGUuY2FsbCggcy5jb250ZXh0LCB4aHIsIHN0YXR1cyApOworCQl9CisKKwkJLy8gVGhlIHJlcXVlc3Qgd2FzIGNvbXBsZXRlZAorCQlpZiAoIHMuZ2xvYmFsICkgeworCQkJalF1ZXJ5LnRyaWdnZXJHbG9iYWwoIHMsICJhamF4Q29tcGxldGUiLCBbeGhyLCBzXSApOworCQl9CisKKwkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisJCWlmICggcy5nbG9iYWwgJiYgalF1ZXJ5LmFjdGl2ZS0tID09PSAxICkgeworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKKwkJfQorCX0sCisJCQorCXRyaWdnZXJHbG9iYWw6IGZ1bmN0aW9uKCBzLCB0eXBlLCBhcmdzICkgeworCQkocy5jb250ZXh0ICYmIHMuY29udGV4dC51cmwgPT0gbnVsbCA/IGpRdWVyeShzLmNvbnRleHQpIDogalF1ZXJ5LmV2ZW50KS50cmlnZ2VyKHR5cGUsIGFyZ3MpOworCX0sCisKKwkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdAorCWh0dHBTdWNjZXNzOiBmdW5jdGlvbiggeGhyICkgeworCQl0cnkgeworCQkJLy8gSUUgZXJyb3Igc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQgc28gdHJlYXQgaXQgYXMgc3VjY2Vzcywgc2VlICMxNDUwCisJCQlyZXR1cm4gIXhoci5zdGF0dXMgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT09ICJmaWxlOiIgfHwKKwkJCQl4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwIHx8CisJCQkJeGhyLnN0YXR1cyA9PT0gMzA0IHx8IHhoci5zdGF0dXMgPT09IDEyMjM7CisJCX0gY2F0Y2goZSkge30KKworCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCS8vIERldGVybWluZXMgaWYgYW4gWE1MSHR0cFJlcXVlc3QgcmV0dXJucyBOb3RNb2RpZmllZAorCWh0dHBOb3RNb2RpZmllZDogZnVuY3Rpb24oIHhociwgdXJsICkgeworCQl2YXIgbGFzdE1vZGlmaWVkID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksCisJCQlldGFnID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIik7CisKKwkJaWYgKCBsYXN0TW9kaWZpZWQgKSB7CisJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3VybF0gPSBsYXN0TW9kaWZpZWQ7CisJCX0KKworCQlpZiAoIGV0YWcgKSB7CisJCQlqUXVlcnkuZXRhZ1t1cmxdID0gZXRhZzsKKwkJfQorCisJCXJldHVybiB4aHIuc3RhdHVzID09PSAzMDQ7CisJfSwKKworCWh0dHBEYXRhOiBmdW5jdGlvbiggeGhyLCB0eXBlLCBzICkgeworCQl2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpIHx8ICIiLAorCQkJeG1sID0gdHlwZSA9PT0gInhtbCIgfHwgIXR5cGUgJiYgY3QuaW5kZXhPZigieG1sIikgPj0gMCwKKwkJCWRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0OworCisJCWlmICggeG1sICYmIGRhdGEuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lID09PSAicGFyc2VyZXJyb3IiICkgeworCQkJalF1ZXJ5LmVycm9yKCAicGFyc2VyZXJyb3IiICk7CisJCX0KKworCQkvLyBBbGxvdyBhIHByZS1maWx0ZXJpbmcgZnVuY3Rpb24gdG8gc2FuaXRpemUgdGhlIHJlc3BvbnNlCisJCS8vIHMgaXMgY2hlY2tlZCB0byBrZWVwIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJCWlmICggcyAmJiBzLmRhdGFGaWx0ZXIgKSB7CisJCQlkYXRhID0gcy5kYXRhRmlsdGVyKCBkYXRhLCB0eXBlICk7CisJCX0KKworCQkvLyBUaGUgZmlsdGVyIGNhbiBhY3R1YWxseSBwYXJzZSB0aGUgcmVzcG9uc2UKKwkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CisJCQkvLyBHZXQgdGhlIEphdmFTY3JpcHQgb2JqZWN0LCBpZiBKU09OIGlzIHVzZWQuCisJCQlpZiAoIHR5cGUgPT09ICJqc29uIiB8fCAhdHlwZSAmJiBjdC5pbmRleE9mKCJqc29uIikgPj0gMCApIHsKKwkJCQlkYXRhID0galF1ZXJ5LnBhcnNlSlNPTiggZGF0YSApOworCisJCQkvLyBJZiB0aGUgdHlwZSBpcyAic2NyaXB0IiwgZXZhbCBpdCBpbiBnbG9iYWwgY29udGV4dAorCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gInNjcmlwdCIgfHwgIXR5cGUgJiYgY3QuaW5kZXhPZigiamF2YXNjcmlwdCIpID49IDAgKSB7CisJCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIGRhdGEgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBkYXRhOworCX0KKworfSk7CisKKy8qCisgKiBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0OyBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CisgKiBpbXBsZW1lbnQgdGhlIFhNTEh0dHBSZXF1ZXN0IGluIElFNyAoY2FuJ3QgcmVxdWVzdCBsb2NhbCBmaWxlcyksCisgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKKyAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbworICogd2UgbmVlZCBhIGZhbGxiYWNrLgorICovCitpZiAoIHdpbmRvdy5BY3RpdmVYT2JqZWN0ICkgeworCWpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7CisJCWlmICggd2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiZmlsZToiICkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOworCQkJfSBjYXRjaCh4aHJFcnJvcikge30KKwkJfQorCisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOworCQl9IGNhdGNoKGFjdGl2ZUVycm9yKSB7fQorCX07Cit9CisKKy8vIERvZXMgdGhpcyBicm93c2VyIHN1cHBvcnQgWEhSIHJlcXVlc3RzPworalF1ZXJ5LnN1cHBvcnQuYWpheCA9ICEhalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTsKKworCisKKwordmFyIGVsZW1kaXNwbGF5ID0ge30sCisJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCisJcmZ4bnVtID0gL14oWytcLV09KT8oW1xkKy5cLV0rKSguKikkLywKKwl0aW1lcklkLAorCWZ4QXR0cnMgPSBbCisJCS8vIGhlaWdodCBhbmltYXRpb25zCisJCVsgImhlaWdodCIsICJtYXJnaW5Ub3AiLCAibWFyZ2luQm90dG9tIiwgInBhZGRpbmdUb3AiLCAicGFkZGluZ0JvdHRvbSIgXSwKKwkJLy8gd2lkdGggYW5pbWF0aW9ucworCQlbICJ3aWR0aCIsICJtYXJnaW5MZWZ0IiwgIm1hcmdpblJpZ2h0IiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIgXSwKKwkJLy8gb3BhY2l0eSBhbmltYXRpb25zCisJCVsgIm9wYWNpdHkiIF0KKwldOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlzaG93OiBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCXZhciBlbGVtLCBkaXNwbGF5OworCisJCWlmICggc3BlZWQgfHwgc3BlZWQgPT09IDAgKSB7CisJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgic2hvdyIsIDMpLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CisKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrICkgeworCQkJCWVsZW0gPSB0aGlzW2ldOworCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CisKKwkJCQkvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzCisJCQkJLy8gYmVpbmcgaGlkZGVuIGJ5IGNhc2NhZGVkIHJ1bGVzIG9yIG5vdAorCQkJCWlmICggIWpRdWVyeS5kYXRhKGVsZW0sICJvbGRkaXNwbGF5IikgJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgeworCQkJCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCQkJfQorCisJCQkJLy8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxheTogbm9uZQorCQkJCS8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzCisJCQkJLy8gZm9yIHN1Y2ggYW4gZWxlbWVudAorCQkJCWlmICggZGlzcGxheSA9PT0gIiIgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgPT09ICJub25lIiApIHsKKwkJCQkJalF1ZXJ5LmRhdGEoZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCQkJZm9yICggaSA9IDA7IGkgPCBqOyBpKysgKSB7CisJCQkJZWxlbSA9IHRoaXNbaV07CisJCQkJZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTsKKworCQkJCWlmICggZGlzcGxheSA9PT0gIiIgfHwgZGlzcGxheSA9PT0gIm5vbmUiICkgeworCQkJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YShlbGVtLCAib2xkZGlzcGxheSIpIHx8ICIiOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwl9LAorCisJaGlkZTogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgeworCQlpZiAoIHNwZWVkIHx8IHNwZWVkID09PSAwICkgeworCQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggZ2VuRngoImhpZGUiLCAzKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOworCisJCX0gZWxzZSB7CisJCQlmb3IgKCB2YXIgaSA9IDAsIGogPSB0aGlzLmxlbmd0aDsgaSA8IGo7IGkrKyApIHsKKwkJCQl2YXIgZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRoaXNbaV0sICJkaXNwbGF5IiApOworCisJCQkJaWYgKCBkaXNwbGF5ICE9PSAibm9uZSIgKSB7CisJCQkJCWpRdWVyeS5kYXRhKCB0aGlzW2ldLCAib2xkZGlzcGxheSIsIGRpc3BsYXkgKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCQkJZm9yICggaSA9IDA7IGkgPCBqOyBpKysgKSB7CisJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0sCisKKwkvLyBTYXZlIHRoZSBvbGQgdG9nZ2xlIGZ1bmN0aW9uCisJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKKworCXRvZ2dsZTogZnVuY3Rpb24oIGZuLCBmbjIsIGNhbGxiYWNrICkgeworCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOworCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oZm4pICYmIGpRdWVyeS5pc0Z1bmN0aW9uKGZuMikgKSB7CisJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCisJCX0gZWxzZSBpZiAoIGZuID09IG51bGwgfHwgYm9vbCApIHsKKwkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQl2YXIgc3RhdGUgPSBib29sID8gZm4gOiBqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKTsKKwkJCQlqUXVlcnkodGhpcylbIHN0YXRlID8gInNob3ciIDogImhpZGUiIF0oKTsKKwkJCX0pOworCisJCX0gZWxzZSB7CisJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yLCBjYWxsYmFjayk7CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgeworCQlyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLCAwKS5zaG93KCkuZW5kKCkKKwkJCQkJLmFuaW1hdGUoe29wYWNpdHk6IHRvfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOworCX0sCisKKwlhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOworCisJCWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goIG9wdGFsbC5jb21wbGV0ZSApOworCQl9CisKKwkJcmV0dXJuIHRoaXNbIG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgPyAiZWFjaCIgOiAicXVldWUiIF0oZnVuY3Rpb24oKSB7CisJCQkvLyBYWFggJ3RoaXMnIGRvZXMgbm90IGFsd2F5cyBoYXZlIGEgbm9kZU5hbWUgd2hlbiBydW5uaW5nIHRoZQorCQkJLy8gdGVzdCBzdWl0ZQorCisJCQl2YXIgb3B0ID0galF1ZXJ5LmV4dGVuZCh7fSwgb3B0YWxsKSwgcCwKKwkJCQlpc0VsZW1lbnQgPSB0aGlzLm5vZGVUeXBlID09PSAxLAorCQkJCWhpZGRlbiA9IGlzRWxlbWVudCAmJiBqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKSwKKwkJCQlzZWxmID0gdGhpczsKKworCQkJZm9yICggcCBpbiBwcm9wICkgeworCQkJCXZhciBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggcCApOworCisJCQkJaWYgKCBwICE9PSBuYW1lICkgeworCQkJCQlwcm9wWyBuYW1lIF0gPSBwcm9wWyBwIF07CisJCQkJCWRlbGV0ZSBwcm9wWyBwIF07CisJCQkJCXAgPSBuYW1lOworCQkJCX0KKworCQkJCWlmICggcHJvcFtwXSA9PT0gImhpZGUiICYmIGhpZGRlbiB8fCBwcm9wW3BdID09PSAic2hvdyIgJiYgIWhpZGRlbiApIHsKKwkJCQkJcmV0dXJuIG9wdC5jb21wbGV0ZS5jYWxsKHRoaXMpOworCQkJCX0KKworCQkJCWlmICggaXNFbGVtZW50ICYmICggcCA9PT0gImhlaWdodCIgfHwgcCA9PT0gIndpZHRoIiApICkgeworCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKKwkJCQkJLy8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdAorCQkJCQkvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKKwkJCQkJLy8gb3ZlcmZsb3dZIGFyZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWUKKwkJCQkJb3B0Lm92ZXJmbG93ID0gWyB0aGlzLnN0eWxlLm92ZXJmbG93LCB0aGlzLnN0eWxlLm92ZXJmbG93WCwgdGhpcy5zdHlsZS5vdmVyZmxvd1kgXTsKKworCQkJCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAorCQkJCQkvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0CisJCQkJCS8vIGFuaW1hdGVkCisJCQkJCWlmICggalF1ZXJ5LmNzcyggdGhpcywgImRpc3BsYXkiICkgPT09ICJpbmxpbmUiICYmCisJCQkJCQkJalF1ZXJ5LmNzcyggdGhpcywgImZsb2F0IiApID09PSAibm9uZSIgKSB7CisJCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ICkgeworCQkJCQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siOworCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXZhciBkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXkodGhpcy5ub2RlTmFtZSk7CisKKwkJCQkJCQkvLyBpbmxpbmUtbGV2ZWwgZWxlbWVudHMgYWNjZXB0IGlubGluZS1ibG9jazsKKwkJCQkJCQkvLyBibG9jay1sZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAorCQkJCQkJCWlmICggZGlzcGxheSA9PT0gImlubGluZSIgKSB7CisJCQkJCQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siOworCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisJCQkJCQkJCXRoaXMuc3R5bGUuem9vbSA9IDE7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCBqUXVlcnkuaXNBcnJheSggcHJvcFtwXSApICkgeworCQkJCQkvLyBDcmVhdGUgKGlmIG5lZWRlZCkgYW5kIGFkZCB0byBzcGVjaWFsRWFzaW5nCisJCQkJCShvcHQuc3BlY2lhbEVhc2luZyA9IG9wdC5zcGVjaWFsRWFzaW5nIHx8IHt9KVtwXSA9IHByb3BbcF1bMV07CisJCQkJCXByb3BbcF0gPSBwcm9wW3BdWzBdOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBvcHQub3ZlcmZsb3cgIT0gbnVsbCApIHsKKwkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisJCQl9CisKKwkJCW9wdC5jdXJBbmltID0galF1ZXJ5LmV4dGVuZCh7fSwgcHJvcCk7CisKKwkJCWpRdWVyeS5lYWNoKCBwcm9wLCBmdW5jdGlvbiggbmFtZSwgdmFsICkgeworCQkJCXZhciBlID0gbmV3IGpRdWVyeS5meCggc2VsZiwgb3B0LCBuYW1lICk7CisKKwkJCQlpZiAoIHJmeHR5cGVzLnRlc3QodmFsKSApIHsKKwkJCQkJZVsgdmFsID09PSAidG9nZ2xlIiA/IGhpZGRlbiA/ICJzaG93IiA6ICJoaWRlIiA6IHZhbCBdKCBwcm9wICk7CisKKwkJCQl9IGVsc2UgeworCQkJCQl2YXIgcGFydHMgPSByZnhudW0uZXhlYyh2YWwpLAorCQkJCQkJc3RhcnQgPSBlLmN1cigpIHx8IDA7CisKKwkJCQkJaWYgKCBwYXJ0cyApIHsKKwkJCQkJCXZhciBlbmQgPSBwYXJzZUZsb2F0KCBwYXJ0c1syXSApLAorCQkJCQkJCXVuaXQgPSBwYXJ0c1szXSB8fCAicHgiOworCisJCQkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKKwkJCQkJCWlmICggdW5pdCAhPT0gInB4IiApIHsKKwkJCQkJCQlqUXVlcnkuc3R5bGUoIHNlbGYsIG5hbWUsIChlbmQgfHwgMSkgKyB1bml0KTsKKwkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIoKSkgKiBzdGFydDsKKwkJCQkJCQlqUXVlcnkuc3R5bGUoIHNlbGYsIG5hbWUsIHN0YXJ0ICsgdW5pdCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgorCQkJCQkJaWYgKCBwYXJ0c1sxXSApIHsKKwkJCQkJCQllbmQgPSAoKHBhcnRzWzFdID09PSAiLT0iID8gLTEgOiAxKSAqIGVuZCkgKyBzdGFydDsKKwkJCQkJCX0KKworCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCBlbmQsIHVuaXQgKTsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2YWwsICIiICk7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKworCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSk7CisJfSwKKworCXN0b3A6IGZ1bmN0aW9uKCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgeworCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKKworCQlpZiAoIGNsZWFyUXVldWUgKSB7CisJCQl0aGlzLnF1ZXVlKFtdKTsKKwkJfQorCisJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCS8vIGdvIGluIHJldmVyc2Ugb3JkZXIgc28gYW55dGhpbmcgYWRkZWQgdG8gdGhlIHF1ZXVlIGR1cmluZyB0aGUgbG9vcCBpcyBpZ25vcmVkCisJCQlmb3IgKCB2YXIgaSA9IHRpbWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApIHsKKwkJCQlpZiAoIHRpbWVyc1tpXS5lbGVtID09PSB0aGlzICkgeworCQkJCQlpZiAoZ290b0VuZCkgeworCQkJCQkJLy8gZm9yY2UgdGhlIG5leHQgc3RlcCB0byBiZSB0aGUgbGFzdAorCQkJCQkJdGltZXJzW2ldKHRydWUpOworCQkJCQl9CisKKwkJCQkJdGltZXJzLnNwbGljZShpLCAxKTsKKwkJCQl9CisJCQl9CisJCX0pOworCisJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKKwkJaWYgKCAhZ290b0VuZCApIHsKKwkJCXRoaXMuZGVxdWV1ZSgpOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworZnVuY3Rpb24gZ2VuRngoIHR5cGUsIG51bSApIHsKKwl2YXIgb2JqID0ge307CisKKwlqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxudW0pKSwgZnVuY3Rpb24oKSB7CisJCW9ialsgdGhpcyBdID0gdHlwZTsKKwl9KTsKKworCXJldHVybiBvYmo7Cit9CisKKy8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKK2pRdWVyeS5lYWNoKHsKKwlzbGlkZURvd246IGdlbkZ4KCJzaG93IiwgMSksCisJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKKwlzbGlkZVRvZ2dsZTogZ2VuRngoInRvZ2dsZSIsIDEpLAorCWZhZGVJbjogeyBvcGFjaXR5OiAic2hvdyIgfSwKKwlmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAorCWZhZGVUb2dnbGU6IHsgb3BhY2l0eTogInRvZ2dsZSIgfQorfSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkgeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgeworCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKKwl9OworfSk7CisKK2pRdWVyeS5leHRlbmQoeworCXNwZWVkOiBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7CisJCXZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09ICJvYmplY3QiID8galF1ZXJ5LmV4dGVuZCh7fSwgc3BlZWQpIDogeworCQkJY29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwKKwkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKKwkJCWR1cmF0aW9uOiBzcGVlZCwKKwkJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oZWFzaW5nKSAmJiBlYXNpbmcKKwkJfTsKKworCQlvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0aW9uIDoKKwkJCW9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1tvcHQuZHVyYXRpb25dIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworCQkvLyBRdWV1ZWluZworCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOworCQlvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKKwkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApIHsKKwkJCQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOworCQkJfQorCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgeworCQkJCW9wdC5vbGQuY2FsbCggdGhpcyApOworCQkJfQorCQl9OworCisJCXJldHVybiBvcHQ7CisJfSwKKworCWVhc2luZzogeworCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKKwkJCXJldHVybiBmaXJzdE51bSArIGRpZmYgKiBwOworCQl9LAorCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgeworCQkJcmV0dXJuICgoLU1hdGguY29zKHAqTWF0aC5QSSkvMikgKyAwLjUpICogZGlmZiArIGZpcnN0TnVtOworCQl9CisJfSwKKworCXRpbWVyczogW10sCisKKwlmeDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AgKSB7CisJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJCXRoaXMuZWxlbSA9IGVsZW07CisJCXRoaXMucHJvcCA9IHByb3A7CisKKwkJaWYgKCAhb3B0aW9ucy5vcmlnICkgeworCQkJb3B0aW9ucy5vcmlnID0ge307CisJCX0KKwl9CisKK30pOworCitqUXVlcnkuZngucHJvdG90eXBlID0geworCS8vIFNpbXBsZSBmdW5jdGlvbiBmb3Igc2V0dGluZyBhIHN0eWxlIHZhbHVlCisJdXBkYXRlOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKKwkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKKwkJfQorCisJCShqUXVlcnkuZnguc3RlcFt0aGlzLnByb3BdIHx8IGpRdWVyeS5meC5zdGVwLl9kZWZhdWx0KSggdGhpcyApOworCX0sCisKKwkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQorCWN1cjogZnVuY3Rpb24oKSB7CisJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApIHsKKwkJCXJldHVybiB0aGlzLmVsZW1bIHRoaXMucHJvcCBdOworCQl9CisKKwkJdmFyIHIgPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApICk7CisJCXJldHVybiByICYmIHIgPiAtMTAwMDAgPyByIDogMDsKKwl9LAorCisJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCisJY3VzdG9tOiBmdW5jdGlvbiggZnJvbSwgdG8sIHVuaXQgKSB7CisJCXZhciBzZWxmID0gdGhpcywKKwkJCWZ4ID0galF1ZXJ5LmZ4OworCisJCXRoaXMuc3RhcnRUaW1lID0galF1ZXJ5Lm5vdygpOworCQl0aGlzLnN0YXJ0ID0gZnJvbTsKKwkJdGhpcy5lbmQgPSB0bzsKKwkJdGhpcy51bml0ID0gdW5pdCB8fCB0aGlzLnVuaXQgfHwgInB4IjsKKwkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OworCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAwOworCisJCWZ1bmN0aW9uIHQoIGdvdG9FbmQgKSB7CisJCQlyZXR1cm4gc2VsZi5zdGVwKGdvdG9FbmQpOworCQl9CisKKwkJdC5lbGVtID0gdGhpcy5lbGVtOworCisJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKKwkJCXRpbWVySWQgPSBzZXRJbnRlcnZhbChmeC50aWNrLCBmeC5pbnRlcnZhbCk7CisJCX0KKwl9LAorCisJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgorCXNob3c6IGZ1bmN0aW9uKCkgeworCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCisJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuc3R5bGUoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CisJCXRoaXMub3B0aW9ucy5zaG93ID0gdHJ1ZTsKKworCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIHN0YXJ0IGF0IGEgc21hbGwgd2lkdGgvaGVpZ2h0IHRvIGF2b2lkIGFueQorCQkvLyBmbGFzaCBvZiBjb250ZW50CisJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOworCisJCS8vIFN0YXJ0IGJ5IHNob3dpbmcgdGhlIGVsZW1lbnQKKwkJalF1ZXJ5KCB0aGlzLmVsZW0gKS5zaG93KCk7CisJfSwKKworCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24KKwloaWRlOiBmdW5jdGlvbigpIHsKKwkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgorCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOworCQl0aGlzLm9wdGlvbnMuaGlkZSA9IHRydWU7CisKKwkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgorCQl0aGlzLmN1c3RvbSh0aGlzLmN1cigpLCAwKTsKKwl9LAorCisJLy8gRWFjaCBzdGVwIG9mIGFuIGFuaW1hdGlvbgorCXN0ZXA6IGZ1bmN0aW9uKCBnb3RvRW5kICkgeworCQl2YXIgdCA9IGpRdWVyeS5ub3coKSwgZG9uZSA9IHRydWU7CisKKwkJaWYgKCBnb3RvRW5kIHx8IHQgPj0gdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgdGhpcy5zdGFydFRpbWUgKSB7CisJCQl0aGlzLm5vdyA9IHRoaXMuZW5kOworCQkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMTsKKwkJCXRoaXMudXBkYXRlKCk7CisKKwkJCXRoaXMub3B0aW9ucy5jdXJBbmltWyB0aGlzLnByb3AgXSA9IHRydWU7CisKKwkJCWZvciAoIHZhciBpIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkgeworCQkJCWlmICggdGhpcy5vcHRpb25zLmN1ckFuaW1baV0gIT09IHRydWUgKSB7CisJCQkJCWRvbmUgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICggZG9uZSApIHsKKwkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKKwkJCQlpZiAoIHRoaXMub3B0aW9ucy5vdmVyZmxvdyAhPSBudWxsICYmICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkgeworCQkJCQl2YXIgZWxlbSA9IHRoaXMuZWxlbSwKKwkJCQkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CisKKwkJCQkJalF1ZXJ5LmVhY2goIFsgIiIsICJYIiwgIlkiIF0sIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKKwkJCQkJCWVsZW0uc3R5bGVbICJvdmVyZmxvdyIgKyB2YWx1ZSBdID0gb3B0aW9ucy5vdmVyZmxvd1tpbmRleF07CisJCQkJCX0gKTsKKwkJCQl9CisKKwkJCQkvLyBIaWRlIHRoZSBlbGVtZW50IGlmIHRoZSAiaGlkZSIgb3BlcmF0aW9uIHdhcyBkb25lCisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuaGlkZSApIHsKKwkJCQkJalF1ZXJ5KHRoaXMuZWxlbSkuaGlkZSgpOworCQkJCX0KKworCQkJCS8vIFJlc2V0IHRoZSBwcm9wZXJ0aWVzLCBpZiB0aGUgaXRlbSBoYXMgYmVlbiBoaWRkZW4gb3Igc2hvd24KKwkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlIHx8IHRoaXMub3B0aW9ucy5zaG93ICkgeworCQkJCQlmb3IgKCB2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApIHsKKwkJCQkJCWpRdWVyeS5zdHlsZSggdGhpcy5lbGVtLCBwLCB0aGlzLm9wdGlvbnMub3JpZ1twXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gRXhlY3V0ZSB0aGUgY29tcGxldGUgZnVuY3Rpb24KKwkJCQl0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCggdGhpcy5lbGVtICk7CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKworCQl9IGVsc2UgeworCQkJdmFyIG4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CisJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKKworCQkJLy8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZworCQkJdmFyIHNwZWNpYWxFYXNpbmcgPSB0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZyAmJiB0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZ1t0aGlzLnByb3BdOworCQkJdmFyIGRlZmF1bHRFYXNpbmcgPSB0aGlzLm9wdGlvbnMuZWFzaW5nIHx8IChqUXVlcnkuZWFzaW5nLnN3aW5nID8gInN3aW5nIiA6ICJsaW5lYXIiKTsKKwkJCXRoaXMucG9zID0galF1ZXJ5LmVhc2luZ1tzcGVjaWFsRWFzaW5nIHx8IGRlZmF1bHRFYXNpbmddKHRoaXMuc3RhdGUsIG4sIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvbik7CisJCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQgKyAoKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiB0aGlzLnBvcyk7CisKKwkJCS8vIFBlcmZvcm0gdGhlIG5leHQgc3RlcCBvZiB0aGUgYW5pbWF0aW9uCisJCQl0aGlzLnVwZGF0ZSgpOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorfTsKKworalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CisJdGljazogZnVuY3Rpb24oKSB7CisJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOworCisJCWZvciAoIHZhciBpID0gMDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKKwkJCWlmICggIXRpbWVyc1tpXSgpICkgeworCQkJCXRpbWVycy5zcGxpY2UoaS0tLCAxKTsKKwkJCX0KKwkJfQorCisJCWlmICggIXRpbWVycy5sZW5ndGggKSB7CisJCQlqUXVlcnkuZnguc3RvcCgpOworCQl9CisJfSwKKworCWludGVydmFsOiAxMywKKworCXN0b3A6IGZ1bmN0aW9uKCkgeworCQljbGVhckludGVydmFsKCB0aW1lcklkICk7CisJCXRpbWVySWQgPSBudWxsOworCX0sCisKKwlzcGVlZHM6IHsKKwkJc2xvdzogNjAwLAorCQlmYXN0OiAyMDAsCisJCS8vIERlZmF1bHQgc3BlZWQKKwkJX2RlZmF1bHQ6IDQwMAorCX0sCisKKwlzdGVwOiB7CisJCW9wYWNpdHk6IGZ1bmN0aW9uKCBmeCApIHsKKwkJCWpRdWVyeS5zdHlsZSggZnguZWxlbSwgIm9wYWNpdHkiLCBmeC5ub3cgKTsKKwkJfSwKKworCQlfZGVmYXVsdDogZnVuY3Rpb24oIGZ4ICkgeworCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkgeworCQkJCWZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSA9IChmeC5wcm9wID09PSAid2lkdGgiIHx8IGZ4LnByb3AgPT09ICJoZWlnaHQiID8gTWF0aC5tYXgoMCwgZngubm93KSA6IGZ4Lm5vdykgKyBmeC51bml0OworCQkJfSBlbHNlIHsKKwkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CisJCQl9CisJCX0KKwl9Cit9KTsKKworaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgeworCWpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKKwkJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOworCQl9KS5sZW5ndGg7CisJfTsKK30KKworZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkgeworCWlmICggIWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdICkgeworCQl2YXIgZWxlbSA9IGpRdWVyeSgiPCIgKyBub2RlTmFtZSArICI+IikuYXBwZW5kVG8oImJvZHkiKSwKKwkJCWRpc3BsYXkgPSBlbGVtLmNzcygiZGlzcGxheSIpOworCisJCWVsZW0ucmVtb3ZlKCk7CisKKwkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgZGlzcGxheSA9PT0gIiIgKSB7CisJCQlkaXNwbGF5ID0gImJsb2NrIjsKKwkJfQorCisJCWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKKwl9CisKKwlyZXR1cm4gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07Cit9CisKKworCisKK3ZhciBydGFibGUgPSAvXnQoPzphYmxlfGR8aCkkL2ksCisJcnJvb3QgPSAvXig/OmJvZHl8aHRtbCkkL2k7CisKK2lmICggImdldEJvdW5kaW5nQ2xpZW50UmVjdCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgeworCWpRdWVyeS5mbi5vZmZzZXQgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKKwkJdmFyIGVsZW0gPSB0aGlzWzBdLCBib3g7CisKKwkJaWYgKCBvcHRpb25zICkgeyAKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCAhZWxlbSB8fCAhZWxlbS5vd25lckRvY3VtZW50ICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgeworCQkJcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOworCQl9CisKKwkJdHJ5IHsKKwkJCWJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisJCX0gY2F0Y2goZSkge30KKworCQl2YXIgZG9jID0gZWxlbS5vd25lckRvY3VtZW50LAorCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CisKKwkJLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKKwkJaWYgKCAhYm94IHx8ICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKKwkJCXJldHVybiBib3ggfHwgeyB0b3A6IDAsIGxlZnQ6IDAgfTsKKwkJfQorCisJCXZhciBib2R5ID0gZG9jLmJvZHksCisJCQl3aW4gPSBnZXRXaW5kb3coZG9jKSwKKwkJCWNsaWVudFRvcCAgPSBkb2NFbGVtLmNsaWVudFRvcCAgfHwgYm9keS5jbGllbnRUb3AgIHx8IDAsCisJCQljbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAorCQkJc2Nyb2xsVG9wICA9ICh3aW4ucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgJiYgZG9jRWxlbS5zY3JvbGxUb3AgIHx8IGJvZHkuc2Nyb2xsVG9wICksCisJCQlzY3JvbGxMZWZ0ID0gKHdpbi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0KSwKKwkJCXRvcCAgPSBib3gudG9wICArIHNjcm9sbFRvcCAgLSBjbGllbnRUb3AsCisJCQlsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDsKKworCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OworCX07CisKK30gZWxzZSB7CisJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgeworCQl2YXIgZWxlbSA9IHRoaXNbMF07CisKKwkJaWYgKCBvcHRpb25zICkgeyAKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCAhZWxlbSB8fCAhZWxlbS5vd25lckRvY3VtZW50ICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgeworCQkJcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOworCQl9CisKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CisKKwkJdmFyIGNvbXB1dGVkU3R5bGUsCisJCQlvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwKKwkJCXByZXZPZmZzZXRQYXJlbnQgPSBlbGVtLAorCQkJZG9jID0gZWxlbS5vd25lckRvY3VtZW50LAorCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCisJCQlib2R5ID0gZG9jLmJvZHksCisJCQlkZWZhdWx0VmlldyA9IGRvYy5kZWZhdWx0VmlldywKKwkJCXByZXZDb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICkgOiBlbGVtLmN1cnJlbnRTdHlsZSwKKwkJCXRvcCA9IGVsZW0ub2Zmc2V0VG9wLAorCQkJbGVmdCA9IGVsZW0ub2Zmc2V0TGVmdDsKKworCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtICE9PSBib2R5ICYmIGVsZW0gIT09IGRvY0VsZW0gKSB7CisJCQlpZiAoIGpRdWVyeS5vZmZzZXQuc3VwcG9ydHNGaXhlZFBvc2l0aW9uICYmIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAiZml4ZWQiICkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQljb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpIDogZWxlbS5jdXJyZW50U3R5bGU7CisJCQl0b3AgIC09IGVsZW0uc2Nyb2xsVG9wOworCQkJbGVmdCAtPSBlbGVtLnNjcm9sbExlZnQ7CisKKwkJCWlmICggZWxlbSA9PT0gb2Zmc2V0UGFyZW50ICkgeworCQkJCXRvcCAgKz0gZWxlbS5vZmZzZXRUb3A7CisJCQkJbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CisKKwkJCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciAmJiAhKGpRdWVyeS5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgcnRhYmxlLnRlc3QoZWxlbS5ub2RlTmFtZSkpICkgeworCQkJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGggICkgfHwgMDsKKwkJCQkJbGVmdCArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCApIHx8IDA7CisJCQkJfQorCisJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDsKKwkJCQlvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudDsKKwkJCX0KKworCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9PSAidmlzaWJsZSIgKSB7CisJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDA7CisJCQkJbGVmdCArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCApIHx8IDA7CisJCQl9CisKKwkJCXByZXZDb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTsKKwkJfQorCisJCWlmICggcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJyZWxhdGl2ZSIgfHwgcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJzdGF0aWMiICkgeworCQkJdG9wICArPSBib2R5Lm9mZnNldFRvcDsKKwkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OworCQl9CisKKwkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKKwkJCXRvcCAgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsVG9wLCBib2R5LnNjcm9sbFRvcCApOworCQkJbGVmdCArPSBNYXRoLm1heCggZG9jRWxlbS5zY3JvbGxMZWZ0LCBib2R5LnNjcm9sbExlZnQgKTsKKwkJfQorCisJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKK30KKworalF1ZXJ5Lm9mZnNldCA9IHsKKwlpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKKwkJdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5LCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwgaW5uZXJEaXYsIGNoZWNrRGl2LCB0YWJsZSwgdGQsIGJvZHlNYXJnaW5Ub3AgPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5Ub3AiKSApIHx8IDAsCisJCQlodG1sID0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7CisKKwkJalF1ZXJ5LmV4dGVuZCggY29udGFpbmVyLnN0eWxlLCB7IHBvc2l0aW9uOiAiYWJzb2x1dGUiLCB0b3A6IDAsIGxlZnQ6IDAsIG1hcmdpbjogMCwgYm9yZGVyOiAwLCB3aWR0aDogIjFweCIsIGhlaWdodDogIjFweCIsIHZpc2liaWxpdHk6ICJoaWRkZW4iIH0gKTsKKworCQljb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKKwkJYm9keS5pbnNlcnRCZWZvcmUoIGNvbnRhaW5lciwgYm9keS5maXJzdENoaWxkICk7CisJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CisJCWNoZWNrRGl2ID0gaW5uZXJEaXYuZmlyc3RDaGlsZDsKKwkJdGQgPSBpbm5lckRpdi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7CisKKwkJdGhpcy5kb2VzTm90QWRkQm9yZGVyID0gKGNoZWNrRGl2Lm9mZnNldFRvcCAhPT0gNSk7CisJCXRoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgPSAodGQub2Zmc2V0VG9wID09PSA1KTsKKworCQljaGVja0Rpdi5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CisJCWNoZWNrRGl2LnN0eWxlLnRvcCA9ICIyMHB4IjsKKworCQkvLyBzYWZhcmkgc3VidHJhY3RzIHBhcmVudCBib3JkZXIgd2lkdGggaGVyZSB3aGljaCBpcyA1cHgKKwkJdGhpcy5zdXBwb3J0c0ZpeGVkUG9zaXRpb24gPSAoY2hlY2tEaXYub2Zmc2V0VG9wID09PSAyMCB8fCBjaGVja0Rpdi5vZmZzZXRUb3AgPT09IDE1KTsKKwkJY2hlY2tEaXYuc3R5bGUucG9zaXRpb24gPSBjaGVja0Rpdi5zdHlsZS50b3AgPSAiIjsKKworCQlpbm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCQlpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisKKwkJdGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgPSAoY2hlY2tEaXYub2Zmc2V0VG9wID09PSAtNSk7CisKKwkJdGhpcy5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCA9IChib2R5Lm9mZnNldFRvcCAhPT0gYm9keU1hcmdpblRvcCk7CisKKwkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CisJCWJvZHkgPSBjb250YWluZXIgPSBpbm5lckRpdiA9IGNoZWNrRGl2ID0gdGFibGUgPSB0ZCA9IG51bGw7CisJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSA9IGpRdWVyeS5ub29wOworCX0sCisKKwlib2R5T2Zmc2V0OiBmdW5jdGlvbiggYm9keSApIHsKKwkJdmFyIHRvcCA9IGJvZHkub2Zmc2V0VG9wLAorCQkJbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKKworCQlqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTsKKworCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgKSB7CisJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgIm1hcmdpblRvcCIpICkgfHwgMDsKKwkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luTGVmdCIpICkgfHwgMDsKKwkJfQorCisJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfSwKKwkKKwlzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgeworCQl2YXIgcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24iICk7CisKKwkJLy8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbQorCQlpZiAoIHBvc2l0aW9uID09PSAic3RhdGljIiApIHsKKwkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOworCQl9CisKKwkJdmFyIGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSwKKwkJCWN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCksCisJCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApLAorCQkJY3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sICJsZWZ0IiApLAorCQkJY2FsY3VsYXRlUG9zaXRpb24gPSAocG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgJiYgalF1ZXJ5LmluQXJyYXkoJ2F1dG8nLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSksCisJCQlwcm9wcyA9IHt9LCBjdXJQb3NpdGlvbiA9IHt9LCBjdXJUb3AsIGN1ckxlZnQ7CisKKwkJLy8gbmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXIgdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgYWJzb2x1dGUKKwkJaWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHsKKwkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOworCQl9CisKKwkJY3VyVG9wICA9IGNhbGN1bGF0ZVBvc2l0aW9uID8gY3VyUG9zaXRpb24udG9wICA6IHBhcnNlSW50KCBjdXJDU1NUb3AsICAxMCApIHx8IDA7CisJCWN1ckxlZnQgPSBjYWxjdWxhdGVQb3NpdGlvbiA/IGN1clBvc2l0aW9uLmxlZnQgOiBwYXJzZUludCggY3VyQ1NTTGVmdCwgMTAgKSB8fCAwOworCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKKwkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOworCQl9CisKKwkJaWYgKG9wdGlvbnMudG9wICE9IG51bGwpIHsKKwkJCXByb3BzLnRvcCA9IChvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3ApICsgY3VyVG9wOworCQl9CisJCWlmIChvcHRpb25zLmxlZnQgIT0gbnVsbCkgeworCQkJcHJvcHMubGVmdCA9IChvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCkgKyBjdXJMZWZ0OworCQl9CisJCQorCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKKwkJCW9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTsKKwkJfSBlbHNlIHsKKwkJCWN1ckVsZW0uY3NzKCBwcm9wcyApOworCQl9CisJfQorfTsKKworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlwb3NpdGlvbjogZnVuY3Rpb24oKSB7CisJCWlmICggIXRoaXNbMF0gKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXZhciBlbGVtID0gdGhpc1swXSwKKworCQkvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudAorCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAorCisJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKKwkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKKwkJcGFyZW50T2Zmc2V0ID0gcnJvb3QudGVzdChvZmZzZXRQYXJlbnRbMF0ubm9kZU5hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKKworCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKKwkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQKKwkJLy8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBjYXVzaW5nIG9mZnNldC5sZWZ0IHRvIGluY29ycmVjdGx5IGJlIDAKKwkJb2Zmc2V0LnRvcCAgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luVG9wIikgKSB8fCAwOworCQlvZmZzZXQubGVmdCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGVsZW0sICJtYXJnaW5MZWZ0IikgKSB8fCAwOworCisJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycworCQlwYXJlbnRPZmZzZXQudG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKG9mZnNldFBhcmVudFswXSwgImJvcmRlclRvcFdpZHRoIikgKSB8fCAwOworCQlwYXJlbnRPZmZzZXQubGVmdCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKG9mZnNldFBhcmVudFswXSwgImJvcmRlckxlZnRXaWR0aCIpICkgfHwgMDsKKworCQkvLyBTdWJ0cmFjdCB0aGUgdHdvIG9mZnNldHMKKwkJcmV0dXJuIHsKKwkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKKwkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQKKwkJfTsKKwl9LAorCisJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgeworCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7CisJCQl3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoIXJyb290LnRlc3Qob2Zmc2V0UGFyZW50Lm5vZGVOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgInBvc2l0aW9uIikgPT09ICJzdGF0aWMiKSApIHsKKwkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OworCQkJfQorCQkJcmV0dXJuIG9mZnNldFBhcmVudDsKKwkJfSk7CisJfQorfSk7CisKKworLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCitqUXVlcnkuZWFjaCggWyJMZWZ0IiwgIlRvcCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKwl2YXIgbWV0aG9kID0gInNjcm9sbCIgKyBuYW1lOworCisJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKHZhbCkgeworCQl2YXIgZWxlbSA9IHRoaXNbMF0sIHdpbjsKKwkJCisJCWlmICggIWVsZW0gKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWlmICggdmFsICE9PSB1bmRlZmluZWQgKSB7CisJCQkvLyBTZXQgdGhlIHNjcm9sbCBvZmZzZXQKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJd2luID0gZ2V0V2luZG93KCB0aGlzICk7CisKKwkJCQlpZiAoIHdpbiApIHsKKwkJCQkJd2luLnNjcm9sbFRvKAorCQkJCQkJIWkgPyB2YWwgOiBqUXVlcnkod2luKS5zY3JvbGxMZWZ0KCksCisJCQkJCQkgaSA/IHZhbCA6IGpRdWVyeSh3aW4pLnNjcm9sbFRvcCgpCisJCQkJCSk7CisKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKKwkJCQl9CisJCQl9KTsKKwkJfSBlbHNlIHsKKwkJCXdpbiA9IGdldFdpbmRvdyggZWxlbSApOworCisJCQkvLyBSZXR1cm4gdGhlIHNjcm9sbCBvZmZzZXQKKwkJCXJldHVybiB3aW4gPyAoInBhZ2VYT2Zmc2V0IiBpbiB3aW4pID8gd2luWyBpID8gInBhZ2VZT2Zmc2V0IiA6ICJwYWdlWE9mZnNldCIgXSA6CisJCQkJalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgJiYgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgbWV0aG9kIF0gfHwKKwkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKKwkJCQllbGVtWyBtZXRob2QgXTsKKwkJfQorCX07Cit9KTsKKworZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkgeworCXJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/CisJCWVsZW0gOgorCQllbGVtLm5vZGVUeXBlID09PSA5ID8KKwkJCWVsZW0uZGVmYXVsdFZpZXcgfHwgZWxlbS5wYXJlbnRXaW5kb3cgOgorCQkJZmFsc2U7Cit9CisKKworCisKKy8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcworalF1ZXJ5LmVhY2goWyAiSGVpZ2h0IiwgIldpZHRoIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKworCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCisJLy8gaW5uZXJIZWlnaHQgYW5kIGlubmVyV2lkdGgKKwlqUXVlcnkuZm5bImlubmVyIiArIG5hbWVdID0gZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzWzBdID8KKwkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIHRoaXNbMF0sIHR5cGUsICJwYWRkaW5nIiApICkgOgorCQkJbnVsbDsKKwl9OworCisJLy8gb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGgKKwlqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24oIG1hcmdpbiApIHsKKwkJcmV0dXJuIHRoaXNbMF0gPworCQkJcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggdGhpc1swXSwgdHlwZSwgbWFyZ2luID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApICkgOgorCQkJbnVsbDsKKwl9OworCisJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKKwkJLy8gR2V0IHdpbmRvdyB3aWR0aCBvciBoZWlnaHQKKwkJdmFyIGVsZW0gPSB0aGlzWzBdOworCQlpZiAoICFlbGVtICkgeworCQkJcmV0dXJuIHNpemUgPT0gbnVsbCA/IG51bGwgOiB0aGlzOworCQl9CisJCQorCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzaXplICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgeworCQkJCXZhciBzZWxmID0galF1ZXJ5KCB0aGlzICk7CisJCQkJc2VsZlsgdHlwZSBdKCBzaXplLmNhbGwoIHRoaXMsIGksIHNlbGZbIHR5cGUgXSgpICkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKwkJCS8vIEV2ZXJ5b25lIGVsc2UgdXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBvciBkb2N1bWVudC5ib2R5IGRlcGVuZGluZyBvbiBRdWlya3MgdnMgU3RhbmRhcmRzIG1vZGUKKwkJCXJldHVybiBlbGVtLmRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICJDU1MxQ29tcGF0IiAmJiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgImNsaWVudCIgKyBuYW1lIF0gfHwKKwkJCQllbGVtLmRvY3VtZW50LmJvZHlbICJjbGllbnQiICsgbmFtZSBdOworCisJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKKwkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKKwkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXIKKwkJCXJldHVybiBNYXRoLm1heCgKKwkJCQllbGVtLmRvY3VtZW50RWxlbWVudFsiY2xpZW50IiArIG5hbWVdLAorCQkJCWVsZW0uYm9keVsic2Nyb2xsIiArIG5hbWVdLCBlbGVtLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAorCQkJCWVsZW0uYm9keVsib2Zmc2V0IiArIG5hbWVdLCBlbGVtLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IiArIG5hbWVdCisJCQkpOworCisJCS8vIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CisJCX0gZWxzZSBpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHsKKwkJCXZhciBvcmlnID0galF1ZXJ5LmNzcyggZWxlbSwgdHlwZSApLAorCQkJCXJldCA9IHBhcnNlRmxvYXQoIG9yaWcgKTsKKworCQkJcmV0dXJuIGpRdWVyeS5pc05hTiggcmV0ICkgPyBvcmlnIDogcmV0OworCisJCS8vIFNldCB0aGUgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50IChkZWZhdWx0IHRvIHBpeGVscyBpZiB2YWx1ZSBpcyB1bml0bGVzcykKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAicHgiICk7CisJCX0KKwl9OworCit9KTsKKworCit9KSh3aW5kb3cpOwpkaWZmIC0tZ2l0IGEvdmlzaW9uL0JpbmFyeVNlcnZlci5jcHAgYi92aXNpb24vQmluYXJ5U2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjFhOGIzCi0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL0JpbmFyeVNlcnZlci5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKyNpbmNsdWRlICJ2aXNpb24vQmluYXJ5U2VydmVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlICJhb3MvZXh0ZXJuYWxzL2xpYmpwZWcvaW5jbHVkZS9qcGVnbGliLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvY2FtZXJhL0J1ZmZlcnMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgdmlzaW9uIHsKKworc3RhdGljIHZvaWQgZWNob19yZWFkX2NiKHN0cnVjdCBidWZmZXJldmVudCAqYmV2LCB2b2lkICogLypjdHgqLykgeworICBzdHJ1Y3QgZXZidWZmZXIgKmlucHV0ID0gYnVmZmVyZXZlbnRfZ2V0X2lucHV0KGJldik7CisgIHN0cnVjdCBldmJ1ZmZlciAqb3V0cHV0ID0gYnVmZmVyZXZlbnRfZ2V0X291dHB1dChiZXYpOworCisgIHNpemVfdCBsZW4gPSBldmJ1ZmZlcl9nZXRfbGVuZ3RoKGlucHV0KTsKKyAgY2hhciAqZGF0YTsKKyAgZGF0YSA9IChjaGFyICopbWFsbG9jKGxlbik7CisgIGV2YnVmZmVyX2NvcHlvdXQoaW5wdXQsIGRhdGEsIGxlbik7CisKKyAgcHJpbnRmKCJ3ZSBnb3Qgc29tZSBkYXRhOiAlc1xuIiwgZGF0YSk7CisKKyAgZXZidWZmZXJfYWRkX2J1ZmZlcihvdXRwdXQsIGlucHV0KTsKK30KKwordm9pZCBCaW5hcnlTZXJ2ZXI6OkVycm9yRXZlbnQoc3RydWN0IGJ1ZmZlcmV2ZW50ICpiZXYsIHNob3J0IGV2ZW50cykgeworICBpZiAoZXZlbnRzICYgQkVWX0VWRU5UX0VSUk9SKSBwZXJyb3IoIkVycm9yIGZyb20gYnVmZmVyZXZlbnQiKTsKKyAgaWYgKGV2ZW50cyAmIChCRVZfRVZFTlRfRU9GIHwgQkVWX0VWRU5UX0VSUk9SKSkgeworICAgIGhhdmVfaWQgPSBmYWxzZTsKKyAgICBidWZmZXJldmVudF9mcmVlKGJldik7CisgIH0KK30KKwordm9pZCBCaW5hcnlTZXJ2ZXI6OkFjY2VwdChzdHJ1Y3QgZXZjb25ubGlzdGVuZXIgKmxpc3RlbmVyLCBldnV0aWxfc29ja2V0X3QgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqIC8qYWRkcmVzcyovLCBpbnQgLypzb2NrbGVuKi8pIHsKKyAgc3RydWN0IGV2ZW50X2Jhc2UgKmJhc2UgPSBldmNvbm5saXN0ZW5lcl9nZXRfYmFzZShsaXN0ZW5lcik7CisgIGlmICghaGF2ZV9pZCkgeworICAgIHN0cnVjdCBidWZmZXJldmVudCAqYmV2ID0KKyAgICAgICAgYnVmZmVyZXZlbnRfc29ja2V0X25ldyhiYXNlLCBmZCwgQkVWX09QVF9DTE9TRV9PTl9GUkVFKTsKKyAgICBfb3V0cHV0ID0gYnVmZmVyZXZlbnRfZ2V0X291dHB1dChiZXYpOworICAgIF9idWZldiA9IGJldjsKKyAgICBoYXZlX2lkID0gdHJ1ZTsKKyAgICBpbnQgbm9fZGVsYXlfZmxhZyA9IDE7CisgICAgc2V0c29ja29wdChmZCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmbm9fZGVsYXlfZmxhZywKKyAgICAgICAgICAgICAgIHNpemVvZihub19kZWxheV9mbGFnKSk7CisKKyAgICBidWZmZXJldmVudF9zZXRjYihiZXYsIGVjaG9fcmVhZF9jYiwgTlVMTCwgU3RhdGljRXJyb3JFdmVudCwgdGhpcyk7CisKKyAgICBidWZmZXJldmVudF9lbmFibGUoYmV2LCBFVl9SRUFEIHwgRVZfV1JJVEUpOworICB9Cit9CitzdGF0aWMgdm9pZCBhY2NlcHRfZXJyb3JfY2Ioc3RydWN0IGV2Y29ubmxpc3RlbmVyICpsaXN0ZW5lciwgdm9pZCAqIC8qY3R4Ki8pIHsKKyAgc3RydWN0IGV2ZW50X2Jhc2UgKmJhc2UgPSBldmNvbm5saXN0ZW5lcl9nZXRfYmFzZShsaXN0ZW5lcik7CisgIGludCBlcnIgPSBFVlVUSUxfU09DS0VUX0VSUk9SKCk7CisgIGZwcmludGYoc3RkZXJyLCAiR290IGFuIGVycm9yICVkICglcykgb24gdGhlIGxpc3RlbmVyLiAiCisgICAgICAgICAgICAgICAgICAiU2h1dHRpbmcgZG93bi5cbiIsCisgICAgICAgICAgZXJyLCBldnV0aWxfc29ja2V0X2Vycm9yX3RvX3N0cmluZyhlcnIpKTsKKworICBldmVudF9iYXNlX2xvb3BleGl0KGJhc2UsIE5VTEwpOworfQorCit2b2lkIEJpbmFyeVNlcnZlcjo6U3RhcnRTZXJ2ZXIodWludDE2X3QgcG9ydCkgeworICBfZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworICBtZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworICBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNpbi5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICBzaW4uc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIwLjAuMC4wIik7CisKKyAgbGlzdGVuZXIgPSBldmNvbm5saXN0ZW5lcl9uZXdfYmluZCgKKyAgICAgIF9iYXNlLCBTdGF0aWNBY2NlcHQsIHRoaXMsIExFVl9PUFRfQ0xPU0VfT05fRlJFRSB8IExFVl9PUFRfUkVVU0VBQkxFLCAtMSwKKyAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikodm9pZCAqKSZzaW4sIHNpemVvZihzaW4pKTsKKworICBpZiAoIWxpc3RlbmVyKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczolZDogQ291bGRuJ3QgY3JlYXRlIGxpc3RlbmVyXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworICAgIGV4aXQoLTEpOworICB9CisKKyAgZXZjb25ubGlzdGVuZXJfc2V0X2Vycm9yX2NiKGxpc3RlbmVyLCBhY2NlcHRfZXJyb3JfY2IpOworfQorCit2b2lkIEJpbmFyeVNlcnZlcjo6Tm90aWZ5KGludCBmZCwgc2hvcnQgLyp3aGF0Ki8pIHsKKyAgY2hhciBub3Rlc1s0MDk2XTsKKyAgaW50IGNvdW50ID0gcmVhZChmZCwgbm90ZXMsIDQwOTYpOworICBpZiAoY291bnQgPT0gMCkgeworICAgIGNsb3NlKGZkKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBFcnJvciBObyBjaGVlemUgZnJvbSBPcGVuQ1YgdGFzayEhIVxuIiwgX19GSUxFX18sCisgICAgICAgICAgICBfX0xJTkVfXyk7CisgICAgZXhpdCgtMSk7CisgIH0KKyAgcHJpbnRmKCJub3RpZmllZCE6ICVkXG4iLCBjb3VudCk7CisgIGlmIChoYXZlX2lkKSB7CisgICAgcHJpbnRmKCJnb3Qgc29tZW9uZSB0byByZWFkIG15IHN0dWZmIVxuIik7CisgICAgY2hhciAqYmluYXJ5X2RhdGE7CisgICAgc2l6ZV90IGxlbjsKKyAgICBpZiAoX25vdGlmeS0+R2V0RGF0YSgmYmluYXJ5X2RhdGEsICZsZW4pKSB7CisgICAgICBwcmludGYoImhlcmUgaXMgZm9yIHNlbmRpbmdcbiIpOworICAgICAgZXZidWZmZXJfYWRkX3JlZmVyZW5jZShfb3V0cHV0LCBiaW5hcnlfZGF0YSwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXROb3RpZmllcjo6U3RhdGljRGF0YVNlbnQsIF9ub3RpZnkpOworICAgICAgcHJpbnRmKCJ0aGlzIGlzIGhvdyBzZW5kaW5nIHdlbnQgJWRcbiIsCisgICAgICAgICAgICAgYnVmZmVyZXZlbnRfZmx1c2goX2J1ZmV2LCBFVl9XUklURSwgQkVWX0ZMVVNIKSk7CisgICAgfQorICB9Cit9CisKKy8vIENvbnN0cnVjdG9yCitCaW5hcnlTZXJ2ZXI6OkJpbmFyeVNlcnZlcih1aW50MTZfdCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJjOTcxOjp2aXNpb246OlBhY2tldE5vdGlmaWVyICpub3RpZnkpCisgICAgOiBfYmFzZShldmVudF9iYXNlX25ldygpKSB7CisgIGhhdmVfaWQgPSBmYWxzZTsKKyAgU3RhcnRTZXJ2ZXIocG9ydCk7CisgIF9ub3RpZnkgPSBub3RpZnk7CisgIGZyYW1lX25vdGlmeSA9IGV2ZW50X25ldyhfYmFzZSwgbm90aWZ5LT5SZWNpZXZlckZEKCksIEVWX1JFQUQgfCBFVl9QRVJTSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljTm90aWZ5LCB0aGlzKTsKKyAgZXZlbnRfYWRkKGZyYW1lX25vdGlmeSwgTlVMTCk7CisgIGV2ZW50X2Jhc2VfZGlzcGF0Y2goX2Jhc2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdmlzaW9uCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS92aXNpb24vQmluYXJ5U2VydmVyLmggYi92aXNpb24vQmluYXJ5U2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzZWUyMQotLS0gL2Rldi9udWxsCisrKyBiL3Zpc2lvbi9CaW5hcnlTZXJ2ZXIuaApAQCAtMCwwICsxLDU3IEBACisjaWZuZGVmIEZSQzk3MV9WSVNJT05fQklOQVJZX1NFUlZFUl9IXworI2RlZmluZSBGUkM5NzFfVklTSU9OX0JJTkFSWV9TRVJWRVJfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlICJldmVudDIvYnVmZmVyLmgiCisjaW5jbHVkZSAiZXZlbnQyL2V2ZW50LmgiCisjaW5jbHVkZSAiZXZlbnQyL2xpc3RlbmVyLmgiCisjaW5jbHVkZSAiZXZlbnQyL2J1ZmZlcmV2ZW50LmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL211dGV4LmgiCisKKyNpbmNsdWRlICJ2aXNpb24vUGFja2V0Tm90aWZpZXIuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgdmlzaW9uIHsKKworLyogVGhpcyBydW5zIHRoZSBsaWJldmVudCBsb29wIGFuZCBpbnRlcmZhY2VzIGluIHdpdGggdGhlIHNvY2tldHMgcHJvdmlkZWQgZnJvbSB0aGUgUGFja2V0Tm90aWZpZXIKKyAqIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHByb2Nlc3MgdG8gZm9jdXMgcHJpbWFyaWx5IG9uIGRvaW5nIHByb2Nlc3NpbmcgYW5kIHRoZW4gZmVlZGluZyB0aGlzIHRhc2suCisgKi8KK2NsYXNzIEJpbmFyeVNlcnZlciB7CisgcHVibGljOgorICBCaW5hcnlTZXJ2ZXIodWludDE2X3QgcG9ydCxQYWNrZXROb3RpZmllciAqbm90aWZ5KTsKKworCisgIHZvaWQgU3RhcnRTZXJ2ZXIodWludDE2X3QgcG9ydCk7CisgcHJpdmF0ZToKKyAgZXZlbnRfYmFzZSAqY29uc3QgX2Jhc2U7CisgIGludCBfZmQ7CisgIFBhY2tldE5vdGlmaWVyICpfbm90aWZ5OworICBib29sIGhhdmVfaWQ7CisgIGludCBfY2xpZW50X2ZkOworICBzdHJ1Y3QgZXZlbnQgKmZyYW1lX25vdGlmeTsKKyAgc3RydWN0IGV2YnVmZmVyICpfb3V0cHV0OworICBzdHJ1Y3QgYnVmZmVyZXZlbnQgKl9idWZldjsKKyAgc3RydWN0IGV2Y29ubmxpc3RlbmVyICpsaXN0ZW5lcjsKKyAgdm9pZCBBY2NlcHQoZXZjb25ubGlzdGVuZXIgKmxpc3RlbmVyLCBldnV0aWxfc29ja2V0X3QgZmQsCisgICAgICBzdHJ1Y3Qgc29ja2FkZHIqIC8qYWRkcmVzcyovLCBpbnQgLypzb2NrbGVuKi8pOworICB2b2lkIE5vdGlmeShpbnQgLypmZCovLCBzaG9ydCAvKndoYXQqLyk7CisgIHZvaWQgRXJyb3JFdmVudChzdHJ1Y3QgYnVmZmVyZXZlbnQgKmJldixzaG9ydCBldmVudHMpOworICBzdGF0aWMgdm9pZCBTdGF0aWNBY2NlcHQoZXZjb25ubGlzdGVuZXIgKmxpc3RlbmVyLCBldnV0aWxfc29ja2V0X3QgZmQsCisgICAgICAgICAgc3RydWN0IHNvY2thZGRyICphZGRyZXNzLCBpbnQgc29ja2xlbix2b2lkICpzZWxmKXsKKyAgICAoKEJpbmFyeVNlcnZlciAqKShzZWxmKSktPkFjY2VwdChsaXN0ZW5lciwgZmQsIGFkZHJlc3MsIHNvY2tsZW4pOworICB9CisgIHN0YXRpYyB2b2lkIFN0YXRpY05vdGlmeShpbnQgZmQsIHNob3J0IHdoYXQsIHZvaWQgKnNlbGYpeworICAgICgoQmluYXJ5U2VydmVyICopKHNlbGYpKS0+Tm90aWZ5KGZkLCB3aGF0KTsKKyAgfQorICBzdGF0aWMgdm9pZCBTdGF0aWNFcnJvckV2ZW50KHN0cnVjdCBidWZmZXJldmVudCAqYmV2LHNob3J0IGV2ZW50cyx2b2lkICpzZWxmKXsKKyAgICAoKEJpbmFyeVNlcnZlciAqKShzZWxmKSktPkVycm9yRXZlbnQoYmV2LGV2ZW50cyk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSB2aXNpb24KK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBGUkM5NzFfVklTSU9OX0JJTkFSWV9TRVJWRVJfSF8KZGlmZiAtLWdpdCBhL3Zpc2lvbi9DYW1lcmFQcm9jZXNzb3IuY3BwIGIvdmlzaW9uL0NhbWVyYVByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2ZTEyYgotLS0gL2Rldi9udWxsCisrKyBiL3Zpc2lvbi9DYW1lcmFQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsNDY2IEBACisjaW5jbHVkZSAidmlzaW9uL0NhbWVyYVByb2Nlc3Nvci5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKKy8vI2RlZmluZSBMT0NBTF9ERUJVRyAxCisKKy8vIGNyZWF0ZSBhIG5ldyB0YXJnZXQKK1RhcmdldDo6VGFyZ2V0KHN0ZDo6dmVjdG9yPGN2OjpQb2ludD4gbmV3X2NvbnRvdXIsCisJCXN0ZDo6dmVjdG9yPGN2OjpQb2ludD4gbmV3X3Jhd19jb250b3VyLAorCQlGdWxsUmVjdCBuZXdfcmVjdCwgaW50IG5ld193ZWlnaHQsIGJvb2wgX2lzXzkwKSB7CisJdGhpc19jb250b3VyID0gbmV3X2NvbnRvdXI7CisJcmF3X2NvbnRvdXIgPSBuZXdfcmF3X2NvbnRvdXI7CisJcmVjdCA9IG5ld19yZWN0OworCXdlaWdodCA9IG5ld193ZWlnaHQ7CisJaGVpZ2h0ID0gZ2V0SGVpZ2h0KF9pc185MCk7Cit9CisKKy8vIGNhbGN1bGF0ZSBkaXN0YW5jZSB0byB0YXJnZXQKK2RvdWJsZSBUYXJnZXQ6OmdldEhlaWdodChib29sIGlzXzkwKSB7CisJLy8gVGhlIDc4MC4zMjk2IGlzIGF0IGZ1bGwgcmVzb2x1dGlvbiA2NDB4NDgwLCBhbmQgd2UgbmVlZAorCS8vIHRvIHNjYWxlIGJhY2sgdG8gMzIweDI0MAorCS8vc3RhdGljIGNvbnN0IGRvdWJsZSBjYW1fbCA9IDc4MC4zMjk2IC8gMi4wOyAKKwkvLy8vc3RhdGljIGNvbnN0IGRvdWJsZSBjYW1fZCA9IDIwLjc4MDk2OworCWRvdWJsZSBoZWlnaHQ7CisJaWYgKGlzXzkwKSB7CisJCWhlaWdodCA9ICgocmVjdC51bC54IC0gcmVjdC51ci54KSArCisJCQkJKHJlY3QuYmwueCAtIHJlY3QuYnIueCkpIC8gMi4wOworCX0gZWxzZSB7CisJCWhlaWdodCA9ICgocmVjdC51ci55ICsgcmVjdC51bC55KSAtCisJCQkJKHJlY3QuYnIueSArIHJlY3QuYmwueSkpIC8gMi4wOworCX0KKwkvL3JldHVybiBjYW1fbCAqIDEyLjAgLyBoZWlnaHQ7CisJcmV0dXJuIGhlaWdodDsKK30KKwordm9pZCBUYXJnZXQ6OnJlZmluZVRhcmdldCgpIHsKKwlwcmludGYoIm9rYXkgcmVmaW5lZFxuIik7Cit9CisKK0Z1bGxSZWN0OjpGdWxsUmVjdCgpIHsKKwl1ci54ID0gLTE7CisJdXIueSA9IC0xOworCXVsLnggPSAtMTsKKwl1bC55ID0gLTE7CisJYnIueCA9IC0xOworCWJyLnkgPSAtMTsKKwlibC54ID0gLTE7CisJYmwueSA9IC0xOworfQorCisvLyB0dXJucyBhIGNvbnRvdXIgaW50byBlYXNpZXIgdG8gYWNjZXNzIHN0cnVjdHVyZQorRnVsbFJlY3QgY2FsY0Z1bGxSZWN0KHN0ZDo6dmVjdG9yPGN2OjpQb2ludD4gKmNvbnRvdXIpeworCUZ1bGxSZWN0IHJlY3Q7CisJZm9yKGludCBpPTA7IGk8NDsgaSsrKXsKKwkJY3Y6OlBvaW50MmYgcHQgPSAoKmNvbnRvdXIpW2ldOworCQlyZWN0LmNlbnRyb2lkLnggKz0gcHQueDsKKwkJcmVjdC5jZW50cm9pZC55ICs9IHB0Lnk7CisJfQorCXJlY3QuY2VudHJvaWQueCAvPSA0OworCXJlY3QuY2VudHJvaWQueSAvPSA0OworCWZvcihpbnQgaT0wOyBpPDQ7IGkrKyl7CisJCWN2OjpQb2ludDJmIHB0ID0gKCpjb250b3VyKVtpXTsKKwkJaWYocHQueSA+IHJlY3QuY2VudHJvaWQueSApeworCQkJaWYocHQueCA+IHJlY3QuY2VudHJvaWQueCl7CisJCQkJaWYgKHJlY3QudWwueCA8IDApIHsKKwkJCQkJcmVjdC51bCA9IHB0OworCQkJCX0gZWxzZSB7CisJCQkJCXJlY3QudXIgPSBwdDsKKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQlpZiAocmVjdC51ci54IDwgMCkgeworCQkJCQlyZWN0LnVyID0gcHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVjdC51bCA9IHB0OworCQkJCX0KKwkJCX0KKwkJCWlmIChyZWN0LnVsLnggPiAwICYmIHJlY3QudXIueCA+IDApIHsKKwkJCQkvLyBib3RoIGFyZSBzZXQsIHNvIGlmIHdlIGdvdCBpdCB3cm9uZyBjb3JyZWN0IGl0IGhlcmUKKwkJCQlpZiAocmVjdC51bC54ID4gcmVjdC51ci54KSB7CisJCQkJCXB0ID0gcmVjdC51cjsKKwkJCQkJcmVjdC51ciA9IHJlY3QudWw7CisJCQkJCXJlY3QudWwgPSBwdDsKKwkJCQl9CisJCQl9CisJCX1lbHNleworCQkJaWYocHQueCA+IHJlY3QuY2VudHJvaWQueCl7CisJCQkJaWYgKHJlY3QuYmwueCA8IDApIHsKKwkJCQkJcmVjdC5ibCA9IHB0OworCQkJCX0gZWxzZSB7CisJCQkJCXJlY3QuYnIgPSBwdDsKKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQlpZiAocmVjdC5ici54IDwgMCkgeworCQkJCQlyZWN0LmJyID0gcHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVjdC5ibCA9IHB0OworCQkJCX0KKwkJCX0KKwkJCWlmIChyZWN0LmJsLnggPiAwICYmIHJlY3QuYnIueCA+IDApIHsKKwkJCQkvLyBib3RoIGFyZSBzZXQsIHNvIGlmIHdlIGdvdCBpdCB3cm9uZyBjb3JyZWN0IGl0IGhlcmUKKwkJCQlpZiAocmVjdC5ibC54ID4gcmVjdC5ici54KSB7CisJCQkJCXB0ID0gcmVjdC5icjsKKwkJCQkJcmVjdC5iciA9IHJlY3QuYmw7CisJCQkJCXJlY3QuYmwgPSBwdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJlY3Q7Cit9CisKKy8vIHF1aWNrbHkgcmVtb3ZlIHRhcmdldHMgdGhhdCBkbyBub3QgZml0IGEgdmVyeSBicm9hZCBzZXQgb2YgY29uc3RyYWludHMKK2Jvb2wgY3VsbE9idmlvdXMoRnVsbFJlY3QgcmVjdCwgZG91YmxlIG91dHNpZGVfc2l6ZSl7CisJLy8gZmlyc3QgY2hlY2sgdGhhdCBjb3VsZCBzZWUgYSB0YXJnZXQgdGhpcyBzaXplCisJLy8gQ2FsY3VsYXRlZCBmcm9tIGRhdmUncyBzaW11bGF0aW9uLCBzaGxvdWQgYmUgODUwIGFuZCA3MjAwMCBpZiBmaWxsZWQKKwlpZigob3V0c2lkZV9zaXplIDwgNTAwKSB8fCAob3V0c2lkZV9zaXplID4gOTAwMDApKXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvLyBUYXJnZXRzIG9uIHRoZSBlZGdlIGFyZSBhdCBiZXN0IGluYWNjdXJhdGUuCisJLy8gSW4gdGhpcyBjYXNlLCB3ZSBqdXN0IHdhbnQgdG8gcG9pbnQgdGhlIHJpZ2h0IHdheSwKKwkvLyBzbyB0aGlzIGlzIG5vIGxvbmdlciBhIHZhbGlkIGFzc3VtcHRpb24uCisJLyppZigJcmVjdC51ci54IDwgMiB8fCByZWN0LnVyLnkgPCAyIHx8IHJlY3QudXIueCA+IDYzNyB8fCByZWN0LnVyLnkgPiA0NzcgfHwKKwkJcmVjdC51bC54IDwgMiB8fCByZWN0LnVsLnkgPCAyIHx8IHJlY3QudWwueCA+IDYzNyB8fCByZWN0LnVsLnkgPiA0NzcgfHwKKwkJcmVjdC5ici54IDwgMiB8fCByZWN0LmJyLnkgPCAyIHx8IHJlY3QuYnIueCA+IDYzNyB8fCByZWN0LmJyLnkgPiA0NzcgfHwKKwkJcmVjdC5ibC54IDwgMiB8fCByZWN0LmJsLnkgPCAyIHx8IHJlY3QuYmwueCA+IDYzNyB8fCByZWN0LmJsLnkgPiA0NzcpeworCQlyZXR1cm4gZmFsc2U7CisJfSovCisJLy8gbWFrZSBzdXJlIHRoZSBzaWRlcyBhcmUgY2xvc2UgdG8gdGhlIHJpZ2h0IHJhdGlvIG9mIGEgcmVjdAorCS8vIHNvbWUgcmVhbGx5IG9kZCBzaGFwZXMgZ2V0IGNvbmZ1c2luZworCWRvdWJsZSByYXRpbyA9IG5vcm0ocmVjdC51ci1yZWN0LnVsKS9ub3JtKHJlY3QuYnItcmVjdC5ibCk7CisJaWYoIHJhdGlvIDwgLjcgfHwgcmF0aW8gPiAxLjQgKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmF0aW8gPSBub3JtKHJlY3QudXItcmVjdC5icikvbm9ybShyZWN0LnVsLXJlY3QuYmwpOworCWlmKCByYXRpbyA8IC43IHx8IHJhdGlvID4gMS40ICkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8vIHN1bSBvdmVyIHZhbHVlcyBiZXR3ZWVuIHRoZXNlIHR3byBwb2ludHMgYW5kIG5vcm1hbGl6ZQorLy8gc2VlIEJyZXNlbmhhbSdzIExpbmUgQWxnb3JpdGhtIGZvciB0aGUgbG9naWMgb2YgbW92aW5nCisvLyBvdmVyIGFsbCB0aGUgcGl4ZWxzIGJldHdlZW4gdGhlc2UgdHdvIHBvaW50cy4KK2RvdWJsZSBQcm9jZXNzb3JEYXRhOjpjYWxjSGlzdENvbXBvbmVudCgKKwkJY3Y6OlBvaW50Mmkgc3RhcnQsCisJCWN2OjpQb2ludDJpIGVuZCwKKwkJY3Y6Ok1hdCB0aHJlc2hfaW1nKXsKKwlpbnQgZHggPSBhYnMoZW5kLnggLSBzdGFydC54KTsKKwlpbnQgZHkgPSBhYnMoZW5kLnkgLSBzdGFydC55KTsKKwlpbnQgc3ggPSAoc3RhcnQueCA8IGVuZC54KSA/IDEgOiAtMTsKKwlpbnQgc3kgPSAoc3RhcnQueSA8IGVuZC55KSA/IDEgOiAtMTsKKwlpbnQgZXJyb3IgPSBkeC1keTsKKworCWludCB0b3RhbCA9IDA7CisJaW50IHZhbHVlID0gMDsKKwlpbnQgdG90YWxfZXJyb3I7CisjaWYgTE9DQUxfREVCVUcKKwlJcGxJbWFnZSBnZCA9ICpnbG9iYWxfZGlzcGxheTsKKyNlbmRpZgorCUlwbEltYWdlIHRpID0gdGhyZXNoX2ltZzsKKwl3aGlsZSgxKXsKKwkJdG90YWwrKzsKKwkJCisJCXVjaGFyKiBwdHIgPSAodWNoYXIqKSAodGkuaW1hZ2VEYXRhICsgc3RhcnQueSAqIHRpLndpZHRoU3RlcCArIHN0YXJ0LngpOworCQlpZigoaW50KSAqcHRyKSB2YWx1ZSsrOworCQkvLyBkcmF3IGxpbmUgY2hlY2tlZAorI2lmIExPQ0FMX0RFQlVHCisJCXVjaGFyKiBwdHIyID0gKHVjaGFyKikgKGdkLmltYWdlRGF0YSArIHN0YXJ0LnkgKiBnZC53aWR0aFN0ZXAgKyBzdGFydC54KjMpOworCQkqcHRyMisrID0gMDsKKwkJKnB0cjIrKyA9IDI1NTsKKwkJKnB0cjIgPSAwOworI2VuZGlmCisJCWlmKHN0YXJ0LnggPT0gZW5kLnggJiYgc3RhcnQueSA9PSBlbmQueSkgYnJlYWs7CisJCXRvdGFsX2Vycm9yID0gMiAqIGVycm9yOworCQlpZih0b3RhbF9lcnJvciA+IC1keSl7CisJCQllcnJvciAtPSAgZHk7CisJCQlzdGFydC54ICs9IHN4OworCQl9CisJCWlmKHRvdGFsX2Vycm9yIDwgZHgpeworCQkJZXJyb3IgKz0gZHg7CisJCQlzdGFydC55ICs9IHN5OworCQl9CisJfQorCXJldHVybiAoZG91YmxlKXZhbHVlLyhkb3VibGUpdG90YWw7Cit9CisKKy8vIGp1c3QgYSBkaXN0YW5jZSBmdW5jdGlvbgorZG91YmxlIGNoaVNxdWFyZWQoaW50IGxlbmd0aCwgZG91YmxlKiBoaXN0QSwgZG91YmxlKiBoaXN0Qil7CisJZG91YmxlIHN1bSA9IDA7CisJZm9yKGludCBpPTA7IGk8bGVuZ3RoO2krKyl7CisJCWRvdWJsZSBkaWZmID0gKihoaXN0QitpKSAtICooaGlzdEEraSk7CisJCXN1bSArPSAoZGlmZiAqIGRpZmYpIC8gKihoaXN0QStpKTsKKwl9CisJcmV0dXJuIHN1bTsKK30KKy8vIGV1Y2xpZGllYW4gZGlzdCBmdW5jdGlvbgorZG91YmxlIEwyX2Rpc3QoaW50IGxlbmd0aCwgZG91YmxlKiBoaXN0QSwgZG91YmxlKiBoaXN0Qil7CisJZG91YmxlIHN1bSA9IDA7CisJZm9yKGludCBpPTA7IGk8bGVuZ3RoO2krKyl7CisJCWRvdWJsZSBkaWZmID0gKihoaXN0QitpKSAtICooaGlzdEEraSk7CisJCXN1bSArPSAoZGlmZiAqIGRpZmYpOworCX0KKwlyZXR1cm4gc3FydChzdW0pOworfQorCisvLyBjYWxjIGFuZCBjb21wYXJlIHRoZSBoaXN0b2dyYW1zIHRvIHRoZSBkZXNpcmVkCitkb3VibGUgUHJvY2Vzc29yRGF0YTo6Y2hlY2tIaXN0b2dyYW0oRnVsbFJlY3QgcmVjdCwgY3Y6Ok1hdCB0aHJlc2hfaW1nKXsKKwkvLyBmb3VuZCBob3JpeiBoaXN0b2dyYW0KKwlkb3VibGUgaGlzdF9scltISVNUX1NJWkVdOworCS8vIHN0ZXAgc2l6ZSBhbG9uZyBsZWZ0IGVkZ2UKKwljdjo6UG9pbnQyZiBkZWx0YV9sZWZ0ID0gKHJlY3QudWwgLSByZWN0LmJsKSpISVNUX1NJWkVfRjsKKwkvLyBzdGVwIHNpemUgYWxvbmcgcmlnaHQgZWRnZQorCWN2OjpQb2ludDJmIGRlbHRhX3JpZ2h0ID0gKHJlY3QudXIgLSByZWN0LmJyKSpISVNUX1NJWkVfRjsKKwkvLyBzdW0gZWFjaCBsZWZ0IHRvIHJpZ2h0IGxpbmUgZm9yIHRoZSBoaXN0b2dyYW0KKwlmb3IoaW50IGk9MDsgaTxISVNUX1NJWkU7IGkrKyl7CisJCWhpc3RfbHJbaV0gPSBjYWxjSGlzdENvbXBvbmVudChyZWN0LmJsK2kqZGVsdGFfbGVmdCwKKwkJCQlyZWN0LmJyK2kqZGVsdGFfcmlnaHQsdGhyZXNoX2ltZyk7CisJfQorCWRvdWJsZSBjaGVja192ZXJ0ID0gTDJfZGlzdChISVNUX1NJWkUsIHZlcnRfaGlzdCwgaGlzdF9scik7CisJLy8gZm91bmQgdmVydCBoaXN0b2dyYW0KKwlkb3VibGUgaGlzdF91YltISVNUX1NJWkVdOworCS8vIHN0ZXAgc2l6ZSBhbG9uZyBib3R0b20gZWRnZQorCWN2OjpQb2ludDJmIGRlbHRhX2JvdHRvbSA9IChyZWN0LmJsIC0gcmVjdC5icikqSElTVF9TSVpFX0Y7CisJLy8gc3RlcCBzaXplIGFsb25nIHRvcCBlZGdlCisJY3Y6OlBvaW50MmYgZGVsdGFfdG9wID0gKHJlY3QudWwgLSByZWN0LnVyKSpISVNUX1NJWkVfRjsKKwkvLyBzdW0gZWFjaCB0b3AgdG8gYm90dG9tIGxpbmUgZm9yIHRoZSBoaXN0b2dyYW0KKwlmb3IoaW50IGk9MDsgaTxISVNUX1NJWkU7IGkrKyl7CisJCWhpc3RfdWJbaV0gPSBjYWxjSGlzdENvbXBvbmVudChyZWN0LnVyK2kqZGVsdGFfdG9wLAorCQkJCXJlY3QuYnIraSpkZWx0YV9ib3R0b20sdGhyZXNoX2ltZyk7CisJfQorCWRvdWJsZSBjaGVja19ob3J6ID0gTDJfZGlzdChISVNUX1NJWkUsIGhvcnpfaGlzdCwgaGlzdF91Yik7CisKKwkvLyBhdmVyYWdlIHRoZSB0d28gZGlzdGFuY2VzCisJZG91YmxlIGNoZWNrID0gKGNoZWNrX3ZlcnQgKyBjaGVja19ob3J6KS8yLjA7CisJcmV0dXJuIGNoZWNrOworfQorCisvLyByZXR1cm4gc21hbGxlc3QKK3RlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIE1pbjMoVCB4LCBUIHksIFQgeikgeworICByZXR1cm4geSA8PSB6ID8gKHggPD0geSA/IHggOiB5KQorICAgICAgICAgICAgICAgIDogKHggPD0geiA/IHggOiB6KTsKK30KKworLy8gcmV0dXJuIGxhcmdlc3QKK3RlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIE1heDMoVCB4LCBUIHksIFQgeikgeworICByZXR1cm4geSA+PSB6ID8gKHggPj0geSA/IHggOiB5KQorICAgICAgICAgICAgICAgIDogKHggPj0geiA/IHggOiB6KTsKK30KKworLy8gdHJhbnNmb3JtcyB0aGUgY29udG91cgordm9pZCBtYWtlQ29udmV4KHN0ZDo6dmVjdG9yPGN2OjpQb2ludD4gKmNvbnRvdXIpeworCXN0ZDo6dmVjdG9yPGN2OjpQb2ludDJpPiBodWxsOworCWNvbnZleEh1bGwoKmNvbnRvdXIsIGh1bGwsIGZhbHNlKTsKKwkqY29udG91ciA9IGh1bGw7Cit9CisKKy8vIGJhc2ljIGluaXQKK1Byb2Nlc3NvckRhdGE6OlByb2Nlc3NvckRhdGEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGlzXzkwXykgeworCWlzXzkwID0gaXNfOTBfOworCS8vIHNlcmllcyBiIGltYWdlcyBmcm9tIG5hc2EKKwloMT03OTsgIHMxPTUzOyAgIHYxPTgyOworCWgyPTIwMDsgczI9MjU1OyB2Mj0yNTU7CisJLy8gRm9yIGltYWdlcyBmcm9tIEplcnJ5CisJLy9oMT03OTsgIHMxPTA7ICAgdjE9MTE7CisJLy9oMj0xNjA7IHMyPTI1NTsgdjI9MjU1OworCWltZ193aWR0aCA9IHdpZHRoOworCWltZ19oZWlnaHQgPSBoZWlnaHQ7CisJYnVmZmVyX3NpemUgPSBpbWdfaGVpZ2h0ICogaW1nX3dpZHRoICogMzsKKyNpZiBMT0NBTF9ERUJVRworICAgICAgICBnbG9iYWxfZGlzcGxheSA9IGN2Q3JlYXRlSW1hZ2UoY3ZTaXplKHdpZHRoLCBoZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBMX0RFUFRIXzhVLCAzKTsKKyNlbmRpZgorCWdyZXlfaW1hZ2UgPSBjdkNyZWF0ZUltYWdlKGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwKKwkJCSAgICAgICAgICAgSVBMX0RFUFRIXzhVLCAxKTsKKwlncmV5X21hdCA9IG5ldyBjdjo6TWF0KGdyZXlfaW1hZ2UpOworCQorCS8vIGNhbGN1bGF0ZSBhIGRlc2lyZWQgaGlzdG9ncmFtIGJlZm9yZSB3ZSBzdGFydAorCWludCBqID0gMDsKKwlmb3IoZG91YmxlIGk9MDsgajxISVNUX1NJWkU7IGkrPUhJU1RfU0laRV9GKXsKKwkJaWYgKGlzXzkwKSB7CisJCQlpZihpIDwgMi4wLzEyLjAgfHwgaSA+ICgxLjAtMi4wLzEyLjApICkgaG9yel9oaXN0W2pdID0gMTsKKwkJCWVsc2UgaG9yel9oaXN0W2pdID0gMC4xMDsKKwkJCWlmKGkgPCAyLjAvMjQuMCB8fCBpID4gKDEuMC0yLjAvMjQuMCkgKSB2ZXJ0X2hpc3Rbal0gPSAxOworCQkJZWxzZSB2ZXJ0X2hpc3Rbal0gPSA0LjAvMjQuMDsKKwkJfSBlbHNlIHsKKwkJCWlmKGkgPCAyLjAvMTIuMCB8fCBpID4gKDEuMC0yLjAvMTIuMCkgKSB2ZXJ0X2hpc3Rbal0gPSAxOworCQkJZWxzZSB2ZXJ0X2hpc3Rbal0gPSAwLjEwOworCQkJaWYoaSA8IDIuMC8yNC4wIHx8IGkgPiAoMS4wLTIuMC8yNC4wKSApIGhvcnpfaGlzdFtqXSA9IDE7CisJCQllbHNlIGhvcnpfaGlzdFtqXSA9IDQuMC8yNC4wOworCQl9CisJCWorKzsKKwl9CisKKyAgICAgICAgc3JjX2hlYWRlcl9pbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoY3ZTaXplKHdpZHRoLCBoZWlnaHQpLAorICAgICAgICAgICAgSVBMX0RFUFRIXzhVLCAzKTsKK30KKworLy8gdGhyb3cgc3R1ZmYgYXdheQorUHJvY2Vzc29yRGF0YTo6flByb2Nlc3NvckRhdGEoKSB7CisJY3ZSZWxlYXNlSW1hZ2UoJmdyZXlfaW1hZ2UpOworCWN2UmVsZWFzZUltYWdlKCZzcmNfaGVhZGVyX2ltYWdlKTsKKwlkZWxldGUoZ3JleV9tYXQpOworfQorCisvLyByZXNldCBwcm9jZXNzb3IgZGF0YSBmcmVlaW5nIGFzIGxpdHRsZSBhcyBwb3NzaWJsZS4KK3ZvaWQgUHJvY2Vzc29yRGF0YTo6Y2xlYXIoKSB7CisJdGFyZ2V0X2xpc3QuY2xlYXIoKTsKKwljb250b3VyX3BhaXJzLmNsZWFyKCk7CisJaGllcmFyY2h5LmNsZWFyKCk7Cit9CisKKworLy8gcixnLGIgdmFsdWVzIGFyZSBmcm9tIDAgdG8gMjU1CisvLyBoID0gWzAsMjU1XSwgcyA9IFswLDI1NV0sIHYgPSBbMCwyNTVdCisvLwkJaWYgcyA9PSAwLCB0aGVuIGggPSAwICh1bmRlZmluZWQpCit2b2lkIFByb2Nlc3NvckRhdGE6OlJHQnRvSFNWKHVjaGFyIHIsIHVjaGFyIGcsIHVjaGFyIGIsCisJCXVjaGFyICpoLCB1Y2hhciAqcywgdWNoYXIgKnYgKSB7CisJdWNoYXIgbWluLCBtYXgsIGRlbHRhOworCW1pbiA9IE1pbjMoIHIsIGcsIGIgKTsKKwltYXggPSBNYXgzKCByLCBnLCBiICk7CisJKnYgPSBtYXg7CisJZGVsdGEgPSBtYXggLSBtaW47CisJaWYgKG1heCA9PSAwIHx8IGRlbHRhID09IDApIHsKKwkJKnMgPSAwOworCQkqaCA9IDA7CisJCXJldHVybjsKKwl9CisJKnMgPSAoMjU1ICogbG9uZyhkZWx0YSkpL21heDsKKwlpZiAobWF4ID09IHIpIHsKKwkJKmggPSAwICsgNDMqKGcgLSBiKS8oZGVsdGEpOworCX0gZWxzZSBpZiAobWF4ID09IGcpIHsKKwkJKmggPSA4NSArIDQzKihiIC0gcikvKGRlbHRhKTsKKwl9IGVsc2UgeworCQkqaCA9IDE3MSArIDQzKihyIC0gZykvKGRlbHRhKTsKKwl9Cit9CisKKy8vIGtlZXAgYW55dGhpbmcgdGhhdCBpcyBpbiBvdXIgSFZTIHdlZGdlCisvLyBieSBmYXIgdGhlIGxvbmdlc3QgcnVubmluZyBmdW5jdGlvbiBpbiB0aGlzIGNvZGUKK3ZvaWQgUHJvY2Vzc29yRGF0YTo6dGhyZXNob2xkKHVjaGFyKiBidWZmZXIpIHsKKyNpZiBMT0NBTF9ERUJVRworICB1Y2hhciAqIGRyYXdfYnVmZmVyID0gKHVjaGFyICopIGdsb2JhbF9kaXNwbGF5LT5pbWFnZURhdGE7CisjZW5kaWYKKyAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpIDwgKGJ1ZmZlcl9zaXplKTsgaSs9IDMsIGorKykgeworICAgIHVjaGFyIHIgPSBidWZmZXJbaSArIDJdOworICAgIHVjaGFyIGcgPSBidWZmZXJbaSArIDFdOworICAgIHVjaGFyIGIgPSBidWZmZXJbaSArIDBdOworICAgIHVjaGFyIGgsIHMsIHY7CisKKyAgICBSR0J0b0hTVihyLCBnLCBiLCAmaCwgJnMsICZ2KTsKKworICAgIGlmIChnID4gMTI4KSB7CisjaWYgTE9DQUxfREVCVUcKKyAgICAgIGRyYXdfYnVmZmVyW2kgKyAwXSA9IDEyMDsKKyAgICAgIGRyYXdfYnVmZmVyW2kgKyAxXSA9IDgwOworICAgICAgZHJhd19idWZmZXJbaSArIDJdID0gNzA7CisjZW5kaWYKKyAgICAgIGdyZXlfaW1hZ2UtPmltYWdlRGF0YVtqXSA9IDI1NTsKKyAgICB9IGVsc2UgaWYgKGggPT0gMCAmJiBzID09IDAgJiYgdiA+PSB2MSAmJiB2IDw9IHYyKSB7IAorICAgICAgLy8gVmFsdWUgdGhyZXNob2xkcyBpbnZhbGlkIHBpeGVscy4KKyNpZiBMT0NBTF9ERUJVRworICAgICAgZHJhd19idWZmZXJbaSArIDBdID0gMjAwOworICAgICAgZHJhd19idWZmZXJbaSArIDFdID0gNTA7CisgICAgICBkcmF3X2J1ZmZlcltpICsgMl0gPSAxMDA7CisjZW5kaWYKKyAgICAgIGdyZXlfaW1hZ2UtPmltYWdlRGF0YVtqXSA9IDI1NTsKKyAgICB9IGVsc2UgaWYgKGggPj0gaDEgJiYgaCA8PSBoMiAmJiB2ID49IHYxICYmCisgICAgICAgICAgICAgICB2IDw9IHYyICYmIHMgPj0gczEgJiYgcyA8PSBzMil7CisgICAgICAvLyBIU1YgVGhyZXNob2xkZWQgaW1hZ2UuCisjaWYgTE9DQUxfREVCVUcKKyAgICAgIGRyYXdfYnVmZmVyW2kgKyAwXSA9IDI1NTsKKyAgICAgIGRyYXdfYnVmZmVyW2kgKyAxXSA9IDA7CisgICAgICBkcmF3X2J1ZmZlcltpICsgMl0gPSAwOworI2VuZGlmCisgICAgICBncmV5X2ltYWdlLT5pbWFnZURhdGFbal0gPSAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERpc3BsYXkgdGhlIHVubW9kaWZpZWQgaW1hZ2UuCisjaWYgTE9DQUxfREVCVUcKKyAgICAgIGRyYXdfYnVmZmVyW2kgKyAwXSA9IGJ1ZmZlcltpICsgMF07CisgICAgICBkcmF3X2J1ZmZlcltpICsgMV0gPSBidWZmZXJbaSArIDFdOworICAgICAgZHJhd19idWZmZXJbaSArIDJdID0gYnVmZmVyW2kgKyAyXTsKKyNlbmRpZgorICAgICAgZ3JleV9pbWFnZS0+aW1hZ2VEYXRhW2pdID0gMDsKKyAgICB9CisKKyAgfQorCit9CisKKy8vIHJ1biBmaW5kIGNvbnRvdXJzIGFuZCB0cnkgdG8gbWFrZSB0aGVtIHNxdWFyZXMKK3ZvaWQgUHJvY2Vzc29yRGF0YTo6Z2V0Q29udG91cnMoKSB7CisJc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y3Y6OlBvaW50PiA+IHJhd19jb250b3VyczsKKwkvL2N2OjpmaW5kQ29udG91cnMoKmdyZXlfbWF0LCByYXdfY29udG91cnMsIGhpZXJhcmNoeSwgQ1ZfUkVUUl9MSVNULAorCS8vCQlDVl9DSEFJTl9BUFBST1hfU0lNUExFKTsKKwljdjo6ZmluZENvbnRvdXJzKCpncmV5X21hdCwgcmF3X2NvbnRvdXJzLCBoaWVyYXJjaHksIENWX1JFVFJfRVhURVJOQUwsCisJCQlDVl9DSEFJTl9BUFBST1hfU0lNUExFKTsKKyNpZiBMT0NBTF9ERUJVRworCWN2OjpNYXQgZ2xvYmFsX21hdChnbG9iYWxfZGlzcGxheSk7CisJY3Y6OlNjYWxhciBjb2xvcigyNTUsMCwwKTsKKwlkcmF3Q29udG91cnMoZ2xvYmFsX21hdCxyYXdfY29udG91cnMsLTEsY29sb3IsMSk7CisKKwlzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+ID4gcF9jb250b3VyczsKKyNlbmRpZgorCWlmICghcmF3X2NvbnRvdXJzLmVtcHR5KCkpIHsKKwkJc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y3Y6OlBvaW50Mmk+ID46Oml0ZXJhdG9yIGNvbnRvdXJfaXQ7CisJCWZvciAoY29udG91cl9pdD1yYXdfY29udG91cnMuYmVnaW4oKTsKKwkJCQljb250b3VyX2l0ICE9IHJhd19jb250b3Vycy5lbmQoKTsKKwkJCQljb250b3VyX2l0KyspIHsKKwkJCS8vIG1ha2UgdGhlIGNvbnRvdXJzIGNvbnZleAorCQkJbWFrZUNvbnZleCgmKCpjb250b3VyX2l0KSk7CisJCQlzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+IGNvbnRvdXI7CisJCQkvL3RoZW4gbWFrZSB0aGVtIHJlY3RhbmdsZQorCQkJYXBwcm94UG9seURQKCpjb250b3VyX2l0LCBjb250b3VyLCA5LCB0cnVlKTsKKwkJCS8vIHN0aWNrIHRoZSByYXcgYW5kIHByb2Nlc3NlZCBjb250b3VycyB0b2dldGhlcgorCQkJc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPGN2OjpQb2ludD4sCisJCQkJc3RkOjp2ZWN0b3I8Y3Y6OlBvaW50PiA+IGFfcGFpcigKKwkJCQkJCSpjb250b3VyX2l0LCBjb250b3VyKTsKKyNpZiBMT0NBTF9ERUJVRworCQkJcF9jb250b3Vycy5wdXNoX2JhY2soY29udG91cik7CisjZW5kaWYKKwkJCS8vIGFuZCBwdXQgdGhlbSBpbiBhIGxpc3QKKwkJCWNvbnRvdXJfcGFpcnMucHVzaF9iYWNrKGFfcGFpcik7CisJCX0KKwl9CisjaWYgTE9DQUxfREVCVUcKKwljdjo6U2NhbGFyIGNvbG9yMigwLDAsMjU1KTsKKwlkcmF3Q29udG91cnMoZ2xvYmFsX21hdCxwX2NvbnRvdXJzLC0xLGNvbG9yMixDVl9GSUxMRUQpOworI2VuZGlmCit9CisKKy8vIGZpbHRlciB0aGUgY29udG91cnMgZG93biB0byBhIGxpc3Qgb2YgdGFyZ2V0cwordm9pZCBQcm9jZXNzb3JEYXRhOjpmaWx0ZXJUb1RhcmdldHMoKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjwKKyAgICBzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+LAorICAgIHN0ZDo6dmVjdG9yPGN2OjpQb2ludD4gPiA+OjppdGVyYXRvciBjb250b3VyX2l0OworICBmb3IoY29udG91cl9pdD1jb250b3VyX3BhaXJzLmJlZ2luKCk7CisgICAgICBjb250b3VyX2l0ICE9IGNvbnRvdXJfcGFpcnMuZW5kKCk7CisgICAgICBjb250b3VyX2l0KyspeworICAgIGRvdWJsZSBjaGVjayA9IDA7CisgICAgc3RkOjp2ZWN0b3I8Y3Y6OlBvaW50PiByYXdfY29udG91ciA9IHN0ZDo6Z2V0PDA+KCpjb250b3VyX2l0KTsKKyAgICBzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+IGNvbnRvdXIgPSBzdGQ6OmdldDwxPigqY29udG91cl9pdCk7CisgICAgRnVsbFJlY3QgcmVjdCA9IGNhbGNGdWxsUmVjdCgmY29udG91cik7CisgICAgaWYoY29udG91ci5zaXplKCkgPT0gNCAmJgorICAgICAgICBjdWxsT2J2aW91cyhyZWN0LCBjb250b3VyQXJlYShjb250b3VyKSkgJiYKKyAgICAgICAgKGNoZWNrID0gY2hlY2tIaXN0b2dyYW0ocmVjdCwgKmdyZXlfbWF0KSkgPD0gSElTVF9NQVRDSCl7CisgICAgICAvLyBub3cgd2UgaGF2ZSBhIHRhcmdldCwgdHJ5IHRvIGltcHJvdmUgdGhlIHNxdWFyZQorI2lmIExPQ0FMX0RFQlVHCisgICAgICAvKglwcmludGYoIl9fX19fX19fXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlx0Y29udD0gJWQgcmF3PSAlZFxuIiwKKyAgICAgICAgICAgICAgICAoaW50KWNvbnRvdXIuc2l6ZSgpLCAoaW50KXJhd19jb250b3VyLnNpemUoKSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y3Y6OlBvaW50Mmk+OjppdGVyYXRvciBwb2ludF9pdDsKKyAgICAgICAgICAgICAgICBmb3IocG9pbnRfaXQ9cmF3X2NvbnRvdXIuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBwb2ludF9pdCAhPSByYXdfY29udG91ci5lbmQoKTsgcG9pbnRfaXQrKyl7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIoJWQsJWQpIiwgcG9pbnRfaXQtPngsIHBvaW50X2l0LT55KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOyovCisjZW5kaWYKKyAgICAgIHRhcmdldF9saXN0LnB1c2hfYmFjayhUYXJnZXQoY29udG91ciwKKyAgICAgICAgICAgIHJhd19jb250b3VyLCByZWN0LCBjaGVjaywgaXNfOTApKTsKKyAgICB9CisgICAgaWYgKGNvbnRvdXIuc2l6ZSgpID09IDQgJiYgY3VsbE9idmlvdXMocmVjdCwgY29udG91ckFyZWEoY29udG91cikpKSB7CisgICAgCUxPRyhERUJVRywgImNoZWNrPSAlLjJmXG4iLCBjaGVjayk7CisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL3Zpc2lvbi9DYW1lcmFQcm9jZXNzb3IuaCBiL3Zpc2lvbi9DYW1lcmFQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTZkZWZiCi0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL0NhbWVyYVByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsODggQEAKKyNpZm5kZWYgVklTSU9OX0NBTUVSQV9QUk9DRVNTT1JfSF8KKyNkZWZpbmUgVklTSU9OX0NBTUVSQV9QUk9DRVNTT1JfSF8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJvcGVuY3YyL2ltZ3Byb2MvaW1ncHJvYy5ocHAiCisKKy8vIGFuIG92ZXIgZGVzY3JpYmVkIGdlb21ldHJpYyByZXByZXNlbnRhdGlvbiBvZiBhIHJlY3RhbmdsZQorY2xhc3MgRnVsbFJlY3QgeworIHB1YmxpYzoKKyAgRnVsbFJlY3QoKTsKKyAgY3Y6OlBvaW50MmYgdXI7IC8vIHVwcGVyIHJpZ2h0CisgIGN2OjpQb2ludDJmIHVsOyAvLyB1cHBlciBsZWZ0CisgIGN2OjpQb2ludDJmIGJyOyAvLyBib3R0b20gcmlnaHQKKyAgY3Y6OlBvaW50MmYgYmw7IC8vIGJvdHRvbV9sZWZ0CisgIGN2OjpQb2ludDJmIGNlbnRyb2lkOyAvL2NlbnRyb2lkCit9OworCisvLyBBbGwgZGF0YSBuZWVkZWQgb25jZSBhIHRhcmdldCBpcyBmb3VuZAorY2xhc3MgVGFyZ2V0IHsKKwlwdWJsaWM6CisJCVRhcmdldChzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+IG5ld19jb250b3VyLAorCQkJc3RkOjp2ZWN0b3I8Y3Y6OlBvaW50PiBuZXdfcmF3X2NvbnRvdXIsCisJCQlGdWxsUmVjdCBuZXdfcmVjdCwgaW50IG5ld193ZWlnaHQsIGJvb2wgX2lzXzkwKTsKKwkJdm9pZCByZWZpbmVUYXJnZXQoKTsKKwkJZG91YmxlIGdldEhlaWdodChib29sIGlzXzkwKTsKKwkJRnVsbFJlY3QgcmVjdDsgLy8gZ2VvbWV0cmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YXJnZXQKKwkJc3RkOjp2ZWN0b3I8Y3Y6OlBvaW50PiB0aGlzX2NvbnRvdXI7IC8vIG9wZW5jdiBjb250b3VyIG9mIHRhcmdldAorCQlzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+IHJhd19jb250b3VyOyAvLyBvcGVuY3YgY29udG91ciBvZiB0YXJnZXQKKwkJZG91YmxlIGhlaWdodDsgLy8gdG9wIHRhcmdldCB0byByb2JvdAorCQlkb3VibGUgd2VpZ2h0OyAvLyBjb25maWRlbmNlIGluIHRoaXMgdGFyZ2V0Cit9OworCisvLyBtYWluIGNsYXNzIGZvciBwcm9jZXNzaW5nIGltYWdlIGRhdGEuIEFsbCByZWxhdmVudCBkYXRhIHNob3VsZCBiZQorLy8gYWNjZXNzaWJsZSB0aHJvdWdoIHRoaXMgc3RydWN0dXJlLgorY2xhc3MgUHJvY2Vzc29yRGF0YSB7CisJcHVibGljOgorCQlQcm9jZXNzb3JEYXRhKGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpc185MF8pOworCQl+UHJvY2Vzc29yRGF0YSgpOworCQl2b2lkIFJHQnRvSFNWKHVjaGFyIHIsIHVjaGFyIGcsIHVjaGFyIGIsCisJCQl1Y2hhciAqaCwgdWNoYXIgKnMsIHVjaGFyICp2KTsKKwkJdm9pZCB0aHJlc2hvbGQodWNoYXIqIGJ1ZmZlcik7CisJCXZvaWQgZ2V0Q29udG91cnMoKTsKKwkJdm9pZCBmaWx0ZXJUb1RhcmdldHMoKTsKKwkJdm9pZCBjbGVhcigpOworCS8vcHJvdGVjdGVkOgorCQlpbnQgaW1nX3dpZHRoOyAvLyBhbGwgaW1hZ2VzIHNob3VsZCBiZSB0aGlzIHdpZHRoCisJCWludCBpbWdfaGVpZ2h0OyAvLyBhbmQgdGhpcyBoZWlnaHQKKwkJYm9vbCBpc185MDsKKwkJaW50IGJ1ZmZlcl9zaXplOyAvLyB3aWR0aCAqIGhlaWdodCAqIDMKKwkJSXBsSW1hZ2UgKmdyZXlfaW1hZ2U7IC8vIHRocmVzaG9sZGVkIGltYWdlCisJCWN2OjpNYXQgKmdyZXlfbWF0OyAvLyBNYXRyaXggcmVwcmVzZW50YWlvbiAoanVzdCBhIGhlYWRlcikKKwkJc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dmVjdG9yPGN2OjpQb2ludD4sCisJCQlzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+ID4gPiBjb250b3VyX3BhaXJzOworCQkvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGN2OjpQb2ludD4gPiBjb250b3VyczsgLy8gZmlsdGVyZWQgY29udG91cnMKKwkJLy95eXN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGN2OjpQb2ludD4gPiByYXdfY29udG91cnM7IC8vb3JpZ2luYWwgY29udG91cnMKKwkJc3RkOjp2ZWN0b3I8Y3Y6OlZlYzRpPiBoaWVyYXJjaHk7IC8vIG9yZGVyaW5nIG9uIGNvbnRvdXJzCisJCWN2OjpNZW1TdG9yYWdlIGdfc3RvcmFnZTsgLy8gb3BlbmN2IHN0b3JhZ2UKKwkJc3RhdGljIGNvbnN0IGludCBISVNUX1NJWkUgPSAyMDsgLy8gZGltZW5zaW9uIG9mIGhpc3RvZ3JhbQorCQkJCQkJCQkgLy8gaWUgbnVtYmVyIG9mIHNjYW4gbGluZXMKKwkJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUgSElTVF9TSVpFX0YgPSAxLjAvMjAuMDsgLy8gc3RlcCBzaXplCisJCQkJCQkJCQkJCS8vIHNob3VsZCBiZSAxL0hJU1RfU0laRQorCQlkb3VibGUgdmVydF9oaXN0W0hJU1RfU0laRV07IC8vIGRlc2lyZWQgdmVydGljYWwgaGlzdG9ncmFtCisJCWRvdWJsZSBob3J6X2hpc3RbSElTVF9TSVpFXTsgLy8gZGVzaXJlZCBob3Jpem9udGFsIGhpc3RvZ3JhbQorCQkvLyBkZWZpbmVzIHRoZSBtaW5pbXVtIGRpc3QgZm9yIGEgbWF0Y2gKKwkJc3RhdGljIGNvbnN0ZXhwciBkb3VibGUgSElTVF9NQVRDSCA9IDEuOTsKKwkJZG91YmxlIGNhbGNIaXN0Q29tcG9uZW50KAorCQkJCWN2OjpQb2ludDJpIHN0YXJ0LAorCQkJCWN2OjpQb2ludDJpIGVuZCwKKwkJCQljdjo6TWF0IHRocmVzaF9pbWcpOworCQlkb3VibGUgY2hlY2tIaXN0b2dyYW0oCisJCQkJRnVsbFJlY3QgcmVjdCwKKwkJCQljdjo6TWF0IHRocmVzaF9pbWcpOworCXB1YmxpYzoKKwkJaW50IGgxLCBzMSwgdjEsIGgyLCBzMiwgdjI7IC8vIEhTViBtaW4gYW5kIG1heAorCQkJCQkJCQkJLy8gbXVzdCBiZSBwdWJsaWMgZm9yIHR1bmluZworCQlJcGxJbWFnZSAqIGdsb2JhbF9kaXNwbGF5OworCisJCUlwbEltYWdlICpzcmNfaGVhZGVyX2ltYWdlOyAvLyBoZWFkZXIgZm9yIG1haW4gaW1hZ2UKKwkJc3RkOjp2ZWN0b3I8VGFyZ2V0PiB0YXJnZXRfbGlzdDsgLy8gbGlzdCBvZiBmb3VuZCB0YXJnZXRzCit9OworCisjZW5kaWYgIC8vIFZJU0lPTl9DQU1FUkFfUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS92aXNpb24vR29hbE1hc3Rlci5jcHAgYi92aXNpb24vR29hbE1hc3Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmMWFiYQotLS0gL2Rldi9udWxsCisrKyBiL3Zpc2lvbi9Hb2FsTWFzdGVyLmNwcApAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSAibWF0aC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJmcmM5NzEvcXVldWVzL0d5cm9BbmdsZS5xLmgiCisjaW5jbHVkZSAiZnJjOTcxL3F1ZXVlcy9DYW1lcmFUYXJnZXQucS5oIgorCisjaW5jbHVkZSAidmlzaW9uL1JpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJ2aXNpb24vU2Vuc29yUHJvY2Vzc29yLmgiCisKK3VzaW5nIDo6ZnJjOTcxOjp2aXNpb246OlJpbmdCdWZmZXI7Cit1c2luZyA6OmZyYzk3MTo6c2Vuc29yczo6Z3lybzsKK3VzaW5nIDo6ZnJjOTcxOjp2aXNpb246OnRhcmdldHM7Cit1c2luZyA6OmZyYzk3MTo6dmlzaW9uOjp0YXJnZXRfYW5nbGU7Cit1c2luZyA6OmZyYzk3MTo6a1BpeGVsc1RvTWV0ZXJzOwordXNpbmcgOjpmcmM5NzE6OmtNZXRlcnNUb1Nob290ZXJTcGVlZHM7Cit1c2luZyA6OmZyYzk3MTo6a01ldGVyc1RvU2hvb3RlckFuZ2xlczsKK3VzaW5nIDo6ZnJjOTcxOjppbnRlcnBvbGF0ZTsKKworaW50IG1haW4oKSB7CisgIC8vUmluZ0J1ZmZlcjwgOjphb3M6OnRpbWU6OlRpbWUsIGRvdWJsZT4gYnVmZjsKKyAgOjphb3M6OkluaXROUlQoKTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvL2d5cm8uRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICAvL2J1ZmYuU2FtcGxlKGd5cm8tPnNlbnRfdGltZSwgZ3lyby0+YW5nbGUpOworICAgIGlmICh0YXJnZXRzLkZldGNoTmV4dCgpKSB7CisgICAgICAvKjo6YW9zOjp0aW1lOjpUaW1lIHN0YW1wID0gOjphb3M6OnRpbWU6OlRpbWU6OkluTlModGFyZ2V0cy0+dGltZXN0YW1wKTsKKyAgICAgIGRvdWJsZSBhbmdsZV9nb2FsID0KKyAgICAgICAgICBidWZmLlZhbHVlQXQoc3RhbXApIC0KKwkJCQkJTV9QSSAvIDIuMCAqIHRhcmdldHMtPnBlcmNlbnRfYXppbXV0aF9vZmZfY2VudGVyIC8gMi4wOworICAgICAgcHJpbnRmKCIlZyAiLGFuZ2xlX2dvYWwpOworICAgICAgcHJpbnRmKCIlZ1xuIixneXJvLT5hbmdsZSk7Ki8KKworICAgICAgZG91YmxlIG1ldGVycyA9IGludGVycG9sYXRlKAorICAgICAgICAgIHNpemVvZihrUGl4ZWxzVG9NZXRlcnMpIC8gc2l6ZW9mKGtQaXhlbHNUb01ldGVyc1swXSksCisgICAgICAgICAga1BpeGVsc1RvTWV0ZXJzLAorICAgICAgICAgIHRhcmdldHMtPnBlcmNlbnRfZWxldmF0aW9uX29mZl9jZW50ZXIpOworICAgICAgY29uc3QgZG91YmxlIHNob290ZXJfc3BlZWQgPSBpbnRlcnBvbGF0ZSgKKyAgICAgICAgICBzaXplb2Yoa01ldGVyc1RvU2hvb3RlclNwZWVkcykgLyBzaXplb2Yoa01ldGVyc1RvU2hvb3RlclNwZWVkc1swXSksCisgICAgICAgICAga01ldGVyc1RvU2hvb3RlclNwZWVkcywKKyAgICAgICAgICBtZXRlcnMpOworICAgICAgY29uc3QgZG91YmxlIHNob290ZXJfYW5nbGUgPSBpbnRlcnBvbGF0ZSgKKyAgICAgICAgICAgc2l6ZW9mKGtNZXRlcnNUb1Nob290ZXJBbmdsZXMpIC8gc2l6ZW9mKGtNZXRlcnNUb1Nob290ZXJBbmdsZXNbMF0pLAorICAgICAgICAgICBrTWV0ZXJzVG9TaG9vdGVyQW5nbGVzLAorICAgICAgICAgICBtZXRlcnMpOworCisgICAgICBMT0coREVCVUcsICIlK2Y9PiB0aGluayB0YXJnZXQgaXMgJWYgbWV0ZXJzIGF3YXkgU3BlZWQgJWYgQW5nbGUgJWZcbiIsCisgICAgICAgICAgdGFyZ2V0cy0+cGVyY2VudF9lbGV2YXRpb25fb2ZmX2NlbnRlciwKKyAgICAgICAgICBtZXRlcnMsIHNob290ZXJfc3BlZWQsIHNob290ZXJfYW5nbGUpOworCisgICAgICB0YXJnZXRfYW5nbGUuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgICAvKi50YXJnZXRfYW5nbGUoYW5nbGVfZ29hbCkqLworICAgICAgICAgIC5zaG9vdGVyX3NwZWVkKHNob290ZXJfc3BlZWQpCisgICAgICAgICAgLnNob290ZXJfYW5nbGUoc2hvb3Rlcl9hbmdsZSkKKyAgICAgICAgICAuU2VuZCgpOworICAgIH0KKyAgfQorICA6OmFvczo6Q2xlYW51cCgpOworfQpkaWZmIC0tZ2l0IGEvdmlzaW9uL0pQRUdSb3V0aW5lcy5jcHAgYi92aXNpb24vSlBFR1JvdXRpbmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2RjMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL0pQRUdSb3V0aW5lcy5jcHAKQEAgLTAsMCArMSwxOTIgQEAKKyNpbmNsdWRlICJ2aXNpb24vSlBFR1JvdXRpbmVzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorCisjaW5jbHVkZSAidmlzaW9uL09wZW5DVldvcmtUYXNrLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHZpc2lvbiB7CisKKy8qIFRoaXMgaXMgYWxzbyBhZGFwdGVkIGZyb20gbGlianBlZyB0byBiZSB1c2VkIG9uIGRlY29tcHJlc3Npb24gdGFibGVzIHJhdGhlciB0aGFuCisgKiBjb21wcmVzc2lvbiB0YWJsZXMgYXMgaXQgd2FzIG9yaWdpb25hbGx5IGludGVuZGVkCisgKi8KK3ZvaWQgZGVjb21wcmVzc19hZGRfaHVmZl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICBKSFVGRl9UQkwgKipodGJscHRyLCBjb25zdCBVSU5UOCAqYml0cywgY29uc3QgVUlOVDggKnZhbCkKKy8qIERlZmluZSBhIEh1ZmZtYW4gdGFibGUgKi8KK3sKKyAgaW50IG5zeW1ib2xzLCBsZW47CisKKyAgaWYgKCpodGJscHRyID09IE5VTEwpCisgICAgKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOworCisgIC8qIENvcHkgdGhlIG51bWJlci1vZi1zeW1ib2xzLW9mLWVhY2gtY29kZS1sZW5ndGggY291bnRzICovCisgIG1lbWNweSgoKmh0YmxwdHIpLT5iaXRzLCBiaXRzLCBzaXplb2YoKCpodGJscHRyKS0+Yml0cykpOworCisgIC8qIFZhbGlkYXRlIHRoZSBjb3VudHMuICBXZSBkbyB0aGlzIGhlcmUgbWFpbmx5IHNvIHdlIGNhbiBjb3B5IHRoZSByaWdodAorICAgKiBudW1iZXIgb2Ygc3ltYm9scyBmcm9tIHRoZSB2YWxbXSBhcnJheSwgd2l0aG91dCByaXNraW5nIG1hcmNoaW5nIG9mZgorICAgKiB0aGUgZW5kIG9mIG1lbW9yeS4gIGpjaHVmZi5jIHdpbGwgZG8gYSBtb3JlIHRob3JvdWdoIHRlc3QgbGF0ZXIuCisgICAqLworICBuc3ltYm9scyA9IDA7CisgIGZvciAobGVuID0gMTsgbGVuIDw9IDE2OyBsZW4rKykKKyAgICBuc3ltYm9scyArPSBiaXRzW2xlbl07CisgIGlmIChuc3ltYm9scyA8IDEgfHwgbnN5bWJvbHMgPiAyNTYpeworICAgIGZwcmludGYoc3RkZXJyLCIlczolZDogRXJyb3IsIGJhZCBodWZmbWFuIHRhYmxlIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisgICAgZXhpdCgtMSk7CisgIH0KKworICBtZW1jcHkoKCpodGJscHRyKS0+aHVmZnZhbCwgdmFsLCBuc3ltYm9scyAqIHNpemVvZih1aW50OF90KSk7CisKK30KKworLyogc3RhbmRhcmRfaHVmZl90YWJsZXMgaXMgdGFrZW4gZnJvbSBsaWJqcGVnIGNvbXByZXNzaW9uIHN0dWZmCisgKiBhbmQgaXMgaGVyZSB1c2VkIHRvIHNldCB1cCB0aGUgc2FtZSB0YWJsZXMgaW4gdGhlIGRlY29tcHJlc3Npb24gc3RydWN0dXJlLgorICovCit2b2lkICBzdGFuZGFyZF9odWZmX3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKyAgLyogU2V0IHVwIHRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyAoY2YuIEpQRUcgc3RhbmRhcmQgc2VjdGlvbiBLLjMpICovCisgIC8qIElNUE9SVEFOVDogdGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIDgtYml0IGRhdGEgcHJlY2lzaW9uISAqLworeworICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19kY19sdW1pbmFuY2VbMTddID0KKyAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KKyAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKKworICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19kY19jaHJvbWluYW5jZVsxN10gPQorICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfZGNfY2hyb21pbmFuY2VbXSA9CisgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH07CisKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfYWNfbHVtaW5hbmNlWzE3XSA9CisgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDB4N2QgfTsKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19sdW1pbmFuY2VbXSA9CisgIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwKKyAgICAweDIxLCAweDMxLCAweDQxLCAweDA2LCAweDEzLCAweDUxLCAweDYxLCAweDA3LAorICAgIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsIDB4MDgsCisgICAgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwKKyAgICAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LAorICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKKyAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LAorICAgIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCisgICAgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwKKyAgICAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LAorICAgIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCisgICAgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKKyAgICAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LAorICAgIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCisgICAgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwKKyAgICAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LAorICAgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCisgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwKKyAgICAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAgIDB4ZjksIDB4ZmEgfTsKKworICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19hY19jaHJvbWluYW5jZVsxN10gPQorICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAyLCAxLCAyLCA0LCA0LCAzLCA0LCA3LCA1LCA0LCA0LCAwLCAxLCAyLCAweDc3IH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfYWNfY2hyb21pbmFuY2VbXSA9CisgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwKKyAgICAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLAorICAgIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCisgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwKKyAgICAweDE1LCAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LAorICAgIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjYsCisgICAgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LAorICAgIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCisgICAgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgICAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAorICAgIDB4NzksIDB4N2EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAgICAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAorICAgIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsCisgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywKKyAgICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLAorICAgIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsCisgICAgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwKKyAgICAweGVhLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAgIDB4ZjksIDB4ZmEgfTsKKworICBkZWNvbXByZXNzX2FkZF9odWZmX3RhYmxlKGNpbmZvLCAmY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbMF0sCisgICAgICBiaXRzX2RjX2x1bWluYW5jZSwgdmFsX2RjX2x1bWluYW5jZSk7CisgIGRlY29tcHJlc3NfYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1swXSwKKyAgICAgIGJpdHNfYWNfbHVtaW5hbmNlLCB2YWxfYWNfbHVtaW5hbmNlKTsKKyAgZGVjb21wcmVzc19hZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzFdLAorICAgICAgYml0c19kY19jaHJvbWluYW5jZSwgdmFsX2RjX2Nocm9taW5hbmNlKTsKKyAgZGVjb21wcmVzc19hZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5hY19odWZmX3RibF9wdHJzWzFdLAorICAgICAgYml0c19hY19jaHJvbWluYW5jZSwgdmFsX2FjX2Nocm9taW5hbmNlKTsKK30KKworCisKKwordm9pZCBwcm9jZXNzX2pwZWcodW5zaWduZWQgY2hhciAqb3V0LHVuc2lnbmVkIGNoYXIgKmltYWdlLHNpemVfdCBzaXplKXsKKyAgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworCisgIHN0YXRpYyBhb3M6OnRpbWU6OlRpbWUgdGltZXN0YW1wX29sZCA9IGFvczo6dGltZTo6VGltZTo6Tm93KCk7CisgIC8vYW9zOjp0aW1lOjpUaW1lIHRpbWVzdGFtcF9zdGFydCA9IGFvczo6dGltZTo6VGltZTo6Tm93KCk7CisgIAorICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvciggJmplcnIgKTsKKyAgY2luZm8ub3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcyggJmNpbmZvICk7CisgIC8vanBlZ19zdGRpb19zcmMoICZjaW5mbywgaW5maWxlICk7CisgIGpwZWdfbWVtX3NyYygmY2luZm8saW1hZ2Usc2l6ZSk7CisKKyAganBlZ19yZWFkX2hlYWRlciggJmNpbmZvLCBUUlVFICk7CisgIHN0YW5kYXJkX2h1ZmZfdGFibGVzICgmY2luZm8pOworCisKKy8vICBwcmludGYoICJKUEVHIEZpbGUgSW5mb3JtYXRpb246IFxuIiApOworLy8gIHByaW50ZiggIkltYWdlIHdpZHRoIGFuZCBoZWlnaHQ6ICVkIHBpeGVscyBhbmQgJWQgcGl4ZWxzLlxuIiwgY2luZm8uaW1hZ2Vfd2lkdGgsIGNpbmZvLmltYWdlX2hlaWdodCApOworLy8gIHByaW50ZiggIkNvbG9yIGNvbXBvbmVudHMgcGVyIHBpeGVsOiAlZC5cbiIsIGNpbmZvLm51bV9jb21wb25lbnRzICk7CisvLyAgcHJpbnRmKCAiQ29sb3Igc3BhY2U6ICVkLlxuIiwgY2luZm8uanBlZ19jb2xvcl9zcGFjZSApOworICAvL3ByaW50ZigiSnBlZ0RlY29tcHJlc3NlZFxuIik7CisKKyAganBlZ19zdGFydF9kZWNvbXByZXNzKCAmY2luZm8gKTsKKworICBpbnQgb2Zmc2V0ID0gMDsKKyAgaW50IHN0ZXAgPSBjaW5mby5udW1fY29tcG9uZW50cyAqIGNpbmZvLmltYWdlX3dpZHRoOworICB1bnNpZ25lZCBjaGFyICpidWZmZXJzW2NpbmZvLmltYWdlX2hlaWdodF07CisgIGZvciAoaW50IGkgPSBjaW5mby5pbWFnZV9oZWlnaHQgLSAxOyBpID49IDA7IC0taSkgeworICAgIGJ1ZmZlcnNbaV0gPSAmb3V0W29mZnNldF07IAorICAgIG9mZnNldCArPSBzdGVwOworICB9CisKKyAgd2hpbGUoIGNpbmZvLm91dHB1dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCApCisgIHsKKyAgICBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjaW5mbywgJmJ1ZmZlcnNbY2luZm8ub3V0cHV0X3NjYW5saW5lXSwKKyAgICAgICAgY2luZm8uaW1hZ2VfaGVpZ2h0IC0gY2luZm8ub3V0cHV0X3NjYW5saW5lKTsKKyAgfQorCisgIC8qIFRoaXMgdXNlZCB0byBkbyBCR1IgdG8gUkdCIGNvbnZlcnNpb25zIGlubGluZSAqLworLyogCisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkoY2luZm8uaW1hZ2VfaGVpZ2h0ICogY2luZm8uaW1hZ2Vfd2lkdGggKiAzKTsgaSs9IDMpIHsKKyAgICB1aW50OF90IGIgPSBvdXRbaSArIDBdOworICAgIHVpbnQ4X3QgciA9IG91dFtpICsgMl07CisgICAgb3V0W2kgKyAwXSA9IHI7CisgICAgb3V0W2kgKyAyXSA9IGI7CisgIH0KKyovCisgIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoICZjaW5mbyApOworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyggJmNpbmZvICk7CisKKyAgYW9zOjp0aW1lOjpUaW1lIHRpbWVzdGFtcF9lbmQgPSBhb3M6OnRpbWU6OlRpbWU6Ok5vdygpOworCisgIC8vZG91YmxlIGpwZWdfcGFydCA9ICgodGltZXN0YW1wX2VuZCAtIHRpbWVzdGFtcF9zdGFydCkubnNlYygpKSAvIDEwMDAwMDAwMDAuMDsKKyAgLy9kb3VibGUgbG9uZ2VyX3BhcnQgPSAoKHRpbWVzdGFtcF9lbmQgLSB0aW1lc3RhbXBfb2xkKS5uc2VjKCkpIC8gMTAwMDAwMDAwMC4wOworCisgIC8vcHJpbnRmKCIlZyAlZ1xuIixqcGVnX3BhcnQgLyBsb25nZXJfcGFydCwxLjAgLyBsb25nZXJfcGFydCk7CisKKyAgdGltZXN0YW1wX29sZCA9IHRpbWVzdGFtcF9lbmQ7CisKK30KKworfSAgLy8gbmFtZXNwYWNlIHZpc2lvbgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCmRpZmYgLS1naXQgYS92aXNpb24vSlBFR1JvdXRpbmVzLmggYi92aXNpb24vSlBFR1JvdXRpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiOGUxMwotLS0gL2Rldi9udWxsCisrKyBiL3Zpc2lvbi9KUEVHUm91dGluZXMuaApAQCAtMCwwICsxLDE3IEBACisvLyBmb3IganBlZ2xpYi5oCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmpwZWcvaW5jbHVkZS9qcGVnbGliLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIHZpc2lvbiB7CisKK3ZvaWQgZGVjb21wcmVzc19hZGRfaHVmZl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICBKSFVGRl9UQkwgKipodGJscHRyLCBjb25zdCBVSU5UOCAqYml0cywgY29uc3QgVUlOVDggKnZhbCk7CisKK3ZvaWQgIHN0YW5kYXJkX2h1ZmZfdGFibGVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKTsKKwordm9pZCBwcm9jZXNzX2pwZWcodW5zaWduZWQgY2hhciAqb3V0LHVuc2lnbmVkIGNoYXIgKmltYWdlLHNpemVfdCBzaXplKTsKKworfSAgLy8gbmFtZXNwYWNlIHZpc2lvbgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEvdmlzaW9uL09wZW5DVldvcmtUYXNrLmNwcCBiL3Zpc2lvbi9PcGVuQ1ZXb3JrVGFzay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyZDY3MAotLS0gL2Rldi9udWxsCisrKyBiL3Zpc2lvbi9PcGVuQ1ZXb3JrVGFzay5jcHAKQEAgLTAsMCArMSwxMzkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgImxpYmpwZWcvaW5jbHVkZS9qcGVnbGliLmgiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9jYW1lcmEvQnVmZmVycy5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorCisjaW5jbHVkZSAidmlzaW9uL09wZW5DVldvcmtUYXNrLmgiCisjaW5jbHVkZSAidmlzaW9uL0NhbWVyYVByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInZpc2lvbi9KUEVHUm91dGluZXMuaCIKKworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB2aXNpb24geworCit9ICAvLyBuYW1lc3BhY2UgdmlzaW9uCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKK25hbWVzcGFjZSB7Cit2b2lkIFNhdmVJbWFnZVRvRmlsZShJcGxJbWFnZSAqaW1hZ2UsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7CisgIEZJTEUgKmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInciKTsKKworICBmcHV0cygiUDNcbjMyMCAyNDBcbjI1NVxuIiwgZmlsZSk7CisgIDo6Y3Y6Ok1hdCBpbWcoaW1hZ2UpOworICBmb3IgKGludCBpID0gMDsgaSA8IGltZy5yb3dzOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGltZy5jb2xzOyBqKyspIHsKKyAgICAgIC8vIFlvdSBjYW4gbm93IGFjY2VzcyB0aGUgcGl4ZWwgdmFsdWUgd2l0aCBjdjo6VmVjM2IKKyAgICAgIGZwcmludGYoZmlsZSwgIiVkICVkICVkICIsCisgICAgICAgICAgaW1nLmF0PGN2OjpWZWMzYj4oaSxqKVswXSwKKyAgICAgICAgICBpbWcuYXQ8Y3Y6OlZlYzNiPihpLGopWzFdLAorICAgICAgICAgIGltZy5hdDxjdjo6VmVjM2I+KGksailbMl0pOworCisgICAgfQorICAgIGZwdXRzKCJcbiIsIGZpbGUpOworICB9CisgIGZjbG9zZShmaWxlKTsKK30KK30KKworI2luY2x1ZGUgImZyYzk3MS9xdWV1ZXMvQ2FtZXJhVGFyZ2V0LnEuaCIKK3VzaW5nIGZyYzk3MTo6dmlzaW9uOjp0YXJnZXRzOworCit2b2lkIHNlbmRlcl9tYWluKCl7CisgIDo6YW9zOjpjYW1lcmE6OkJ1ZmZlcnMgYnVmZmVyczsKKyAgQ3ZTaXplIHNpemU7CisgIHNpemUud2lkdGggPSA6OmFvczo6Y2FtZXJhOjpCdWZmZXJzOjpCdWZmZXJzOjprV2lkdGg7CisgIHNpemUuaGVpZ2h0ID0gOjphb3M6OmNhbWVyYTo6QnVmZmVyczo6QnVmZmVyczo6a0hlaWdodDsKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbOjphb3M6OmNhbWVyYTo6QnVmZmVyczo6QnVmZmVyczo6a1dpZHRoICoKKyAgICAgIDo6YW9zOjpjYW1lcmE6OkJ1ZmZlcnM6OkJ1ZmZlcnM6OmtIZWlnaHQgKiAzXTsKKworICAvLyBjcmVhdGUgcHJvY2Vzc2luZyBvYmplY3QKKyAgUHJvY2Vzc29yRGF0YSBwcm9jZXNzb3Ioc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIGZhbHNlKTsKKworICBwcmludGYoInN0YXJ0ZWQgc2VuZGVyIG1haW5cbiIpOworICBMT0coSU5GTywgIkNhbWVyYSBzZXJ2ZXIgc3RhcnRlZFxuIik7CisgIHdoaWxlKHRydWUpeworICAgIC8vdXNsZWVwKDc1MDApOworICAgIHNpemVfdCBkYXRhX3NpemU7CisgIAl0aW1ldmFsIHRpbWVzdGFtcF90aW1ldmFsOworICAgIExPRyhERUJVRywgImdldHRpbmcgbmV3IGltYWdlXG4iKTsKKyAgICBjb25zdCB2b2lkICppbWFnZSA9IGJ1ZmZlcnMuR2V0TmV4dCgKKwkJICAgIHRydWUsICZkYXRhX3NpemUsICZ0aW1lc3RhbXBfdGltZXZhbCwgTlVMTCk7CisgICAgOjphb3M6OnRpbWU6OlRpbWUgdGltZXN0YW1wKHRpbWVzdGFtcF90aW1ldmFsKTsKKworICAgIExPRyhERUJVRywgIkdvdCBuZXcgaW1hZ2VcbiIpOworICAgIGZyYzk3MTo6dmlzaW9uOjpwcm9jZXNzX2pwZWcoCisgICAgICAgIGJ1ZmZlciwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhciAqPihjb25zdF9jYXN0PHZvaWQgKj4oaW1hZ2UpKSwKKyAgICAgICAgZGF0YV9zaXplKTsKKworICAgIC8vIGJ1aWxkIHRoZSBoZWFkZXJzIG9uIHRvcCBvZiB0aGUgYnVmZmVyCisgICAgY3ZTZXREYXRhKHByb2Nlc3Nvci5zcmNfaGVhZGVyX2ltYWdlLAorICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgIDo6YW9zOjpjYW1lcmE6OkJ1ZmZlcnM6OkJ1ZmZlcnM6OmtXaWR0aCAqIDMpOworCisgICAgLy8gUmVzZXQuCisgICAgcHJvY2Vzc29yLmNsZWFyKCk7CisgICAgLy8gdHJhbnNmb3JtIHRoZSBidWZmZXIgaW50byB0YXJnZXRzCisgICAgcHJvY2Vzc29yLnRocmVzaG9sZChidWZmZXIpOworCisgICAgcHJvY2Vzc29yLmdldENvbnRvdXJzKCk7CisgICAgcHJvY2Vzc29yLmZpbHRlclRvVGFyZ2V0cygpOworCisgICAgLy8gY291bGQgYmUgdXNlZCBmb3IgZGVidWcgaWUgZHJhd0NvbnRvdXJzCisgICAgLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+ID4gdGFyZ2V0X2NvbnRvdXJzOworICAgIC8vc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y3Y6OlBvaW50PiA+IGJlc3RfY29udG91cnM7CisgICAgc3RkOjp2ZWN0b3I8VGFyZ2V0Pjo6aXRlcmF0b3IgdGFyZ2V0X2l0OworICAgIFRhcmdldCAqYmVzdF90YXJnZXQgPSBOVUxMOworICAgIC8vIHJ1biB0aHJvdWdoIHRoZSB0YXJnZXRzCisgICAgTE9HKERFQlVHLCAiRm91bmQgJXUgdGFyZ2V0c1xuIiwgcHJvY2Vzc29yLnRhcmdldF9saXN0LnNpemUoKSk7CisgICAgZm9yKHRhcmdldF9pdCA9IHByb2Nlc3Nvci50YXJnZXRfbGlzdC5iZWdpbigpOworICAgICAgICB0YXJnZXRfaXQgIT0gcHJvY2Vzc29yLnRhcmdldF9saXN0LmVuZCgpOyB0YXJnZXRfaXQrKyl7CisgICAgICAvL3RhcmdldF9jb250b3Vycy5wdXNoX2JhY2soKih0YXJnZXRfaXQtPnRoaXNfY29udG91cikpOworICAgICAgLy8gc2VsZWN0IHRoZSBoaWdoZXN0IHRhcmdldAorICAgICAgaWYgKGJlc3RfdGFyZ2V0ID09IE5VTEwpIHsKKyAgICAgICAgYmVzdF90YXJnZXQgPSAmKnRhcmdldF9pdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0YXJnZXRfaXQtPmhlaWdodCA8IGJlc3RfdGFyZ2V0LT5oZWlnaHQpIHsKKyAgICAgICAgICBiZXN0X3RhcmdldCA9ICYqdGFyZ2V0X2l0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vIGlmIHdlIGZvdW5kIG9uZSB0aGVuIHNlbmQgaXQgb24KKyAgICBpZiAoYmVzdF90YXJnZXQgIT0gTlVMTCkgeworICAgICAgTE9HKERFQlVHLCAiVGFyZ2V0IGlzICVmXG4iLCBiZXN0X3RhcmdldC0+cmVjdC5jZW50cm9pZC54KTsKKyAgICAgIHRhcmdldHMuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgLnBlcmNlbnRfYXppbXV0aF9vZmZfY2VudGVyKAorICAgICAgICAgICAgYmVzdF90YXJnZXQtPnJlY3QuY2VudHJvaWQueSAvIChkb3VibGUpOjphb3M6OmNhbWVyYTo6QnVmZmVyczo6a0hlaWdodCAtIDAuNSkKKyAgICAgICAgLnBlcmNlbnRfZWxldmF0aW9uX29mZl9jZW50ZXIoCisgICAgICAgICAgICBiZXN0X3RhcmdldC0+cmVjdC5jZW50cm9pZC54IC8gKGRvdWJsZSk6OmFvczo6Y2FtZXJhOjpCdWZmZXJzOjprV2lkdGggLSAwLjUpCisgICAgICAgIC50aW1lc3RhbXAodGltZXN0YW1wLlRvTlNlYygpKQorICAgICAgICAuU2VuZCgpOworICAgIH0KKyAgICAvL3N0YXRpYyBpbnQgY291bnRlciA9IDA7CisgICAgLy9pZiAoKytjb3VudGVyID4gMikgeworICAgICAgLy9icmVhazsKKyAgICAvL30KKyAgfQorfQorCisKK2ludCBtYWluKGludCAvKmFyZ2MqLywgY2hhcioqIC8qYXJndiovKXsKKyAgOjphb3M6OkluaXROUlQoKTsKKyAgc2VuZGVyX21haW4oKTsKKyAgOjphb3M6OkNsZWFudXAoKTsKK30KKwpkaWZmIC0tZ2l0IGEvdmlzaW9uL09wZW5DVldvcmtUYXNrLmggYi92aXNpb24vT3BlbkNWV29ya1Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGJkYTVkCi0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL09wZW5DVldvcmtUYXNrLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBWSVNJT05fT1BFTkNWX1dPUktfVEFTS19IXworI2RlZmluZSBWSVNJT05fT1BFTkNWX1dPUktfVEFTS19IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgImV2ZW50Mi9idWZmZXIuaCIKKyNpbmNsdWRlICJldmVudDIvZXZlbnQuaCIKKyNpbmNsdWRlICJldmVudDIvbGlzdGVuZXIuaCIKKyNpbmNsdWRlICJldmVudDIvYnVmZmVyZXZlbnQuaCIKKworI2luY2x1ZGUgImFvcy9jb21tb24vbXV0ZXguaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgdmlzaW9uIHsKKworfSAgLy8gbmFtZXNwYWNlIHZpc2lvbgorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFZJU0lPTl9PUEVOQ1ZfV09SS19UQVNLX0hfCmRpZmYgLS1naXQgYS92aXNpb24vUGFja2V0Tm90aWZpZXIuY3BwIGIvdmlzaW9uL1BhY2tldE5vdGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTI4NzJlCi0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL1BhY2tldE5vdGlmaWVyLmNwcApAQCAtMCwwICsxLDc5IEBACisjaW5jbHVkZSAidmlzaW9uL1BhY2tldE5vdGlmaWVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgdmlzaW9uIHsKKwkKK3ZvaWQgUGFja2V0Tm90aWZpZXI6OlJlZ2lzdGVyU2VuZGVyKCl7CisJY2xvc2UoZmRbMV0pOworfQordm9pZCBQYWNrZXROb3RpZmllcjo6UmVnaXN0ZXJSZWNpZXZlcigpeworCWNsb3NlKGZkWzBdKTsKK30KK1BhY2tldE5vdGlmaWVyICpQYWNrZXROb3RpZmllcjo6TU1hcChzaXplX3QgZGF0YV9zaXplKXsKKwlQYWNrZXROb3RpZmllciAqZGF0YTsKKwlkYXRhID0gKFBhY2tldE5vdGlmaWVyICopbW1hcChOVUxMLCAoKGRhdGFfc2l6ZSAqIDMgKyA0MDk1ICsgc2l6ZW9mKFBhY2tldE5vdGlmaWVyKSkgLyA0MDk2KSAqIDQwOTYsIAorCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKwlkYXRhLT5kYXRhX3NpemUgPSBkYXRhX3NpemU7CisJc29ja2V0cGFpcihQRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIGRhdGEtPmZkKTsKKwlmb3IoaW50IGkgPSAwO2kgPCAzO2krKyl7CisJCWRhdGEtPmJ1ZmZzW2ldID0gKHVpbnQ4X3QgKilkYXRhICsgKHNpemVvZihQYWNrZXROb3RpZmllcikgKyBpICogZGF0YV9zaXplKTsKKwl9CisJdm9pZCAqcGxhY2UgPSAmKGRhdGEtPm11dGV4KTsKKwkqKChpbnQgKilwbGFjZSkgPSAwOyAvLyBUaGUgTXV0ZXggY2xhc3MgbmVlZHMgYSBwbGFjZW1lbnQgbmV3IG9wZXJhdG9yLiAoeW91IGtub3csIGtlZXAgdGhlIG1hc3NlcyBoYXBweSk7CisJZGF0YS0+aW5fZmxpZ2h0ID0gZmFsc2U7CisJZGF0YS0+dG9fc2VuZCA9IC0xOworCWRhdGEtPnNlbmRpbmcgPSAtMTsKKwlyZXR1cm4gZGF0YTsKK30KK3ZvaWQgKlBhY2tldE5vdGlmaWVyOjpHZXRCdWZmZXIoKXsKKwltdXRleC5Mb2NrKCk7CisJZm9yKGludCBpID0gMDsgaSA8IDMgOyBpKyspeyAvL3NlYXJjaCBmb3Igb3BlbiBzcG90LgorCQlpZihpICE9IHNlbmRpbmcgJiYgaSAhPSB0b19zZW5kKXsgLy9vcGVuCisJCQlmaWxsaW5nID0gaTsKKwkJCW11dGV4LlVubG9jaygpOworCQkJLy9wcmludGYoImxlYXNpbmcgb3V0IHRvIGZpbGwgYnVmZiAjICVkXG4iLGkpOworCQkJcmV0dXJuIGJ1ZmZzW2ldOworCQl9CisJfQorCW11dGV4LlVubG9jaygpOworCS8vcHJpbnRmKCJFcnJvciBpbiB0aGUgZmFicmljIG9mIHRoZSB1bml2ZXJzZVxuIik7CisJZXhpdCgtNDIpOworfQordm9pZCBQYWNrZXROb3RpZmllcjo6Tm90aWZ5KCl7CisJbXV0ZXguTG9jaygpOworCXRvX3NlbmQgPSBmaWxsaW5nOworCWZpbGxpbmcgPSAtMTsKKwltdXRleC5VbmxvY2soKTsKKwkvLyB3YWxsIGVycm9yCisJaWYod3JpdGUoZmRbMF0sIlxuIiwxKSkge30KK30KKwordm9pZCBQYWNrZXROb3RpZmllcjo6RGF0YVNlbnQoY29uc3Qgdm9pZCAqIC8qZGF0YSovLCBzaXplX3QgLypkYXRhbGVuKi8peworCS8vcHJpbnRmKCJwYWNrZXRfc2VudDogJWQ7IGZpbGw6ICVkOyB0b19zZW5kOiAlZCBcbiIsc2VuZGluZyxmaWxsaW5nLHRvX3NlbmQpOworCW11dGV4LkxvY2soKTsKKwlzZW5kaW5nID0gLTE7CisJbXV0ZXguVW5sb2NrKCk7CisJaW5fZmxpZ2h0ID0gZmFsc2U7Cit9Citib29sIFBhY2tldE5vdGlmaWVyOjpHZXREYXRhKGNoYXIgKipwbGFjZV90b19wdXQsc2l6ZV90ICpsZW5ndGgpeworCWlmKGluX2ZsaWdodCkgcmV0dXJuIGZhbHNlOworCW11dGV4LkxvY2soKTsKKwkqbGVuZ3RoID0gZGF0YV9zaXplOworCSpwbGFjZV90b19wdXQgPSAoY2hhciAqKWJ1ZmZzW3RvX3NlbmRdOworCXNlbmRpbmcgPSB0b19zZW5kOworCXRvX3NlbmQgPSAtMTsKKwltdXRleC5VbmxvY2soKTsKKwlpbl9mbGlnaHQgPSB0cnVlOworCXJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdmlzaW9uCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKZGlmZiAtLWdpdCBhL3Zpc2lvbi9QYWNrZXROb3RpZmllci5oIGIvdmlzaW9uL1BhY2tldE5vdGlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmZjdmYQotLS0gL2Rldi9udWxsCisrKyBiL3Zpc2lvbi9QYWNrZXROb3RpZmllci5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgRlJDOTcxX1ZJU0lPTl9QQUNLRVRfTk9USUZJRVJfSF8KKyNkZWZpbmUgRlJDOTcxX1ZJU0lPTl9QQUNLRVRfTk9USUZJRVJfSF8KKyNpbmNsdWRlICJldmVudDIvYnVmZmVyLmgiCisjaW5jbHVkZSAiZXZlbnQyL2V2ZW50LmgiCisjaW5jbHVkZSAiZXZlbnQyL2xpc3RlbmVyLmgiCisjaW5jbHVkZSAiZXZlbnQyL2J1ZmZlcmV2ZW50LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tdXRleC5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgdmlzaW9uIHsKKworLyogVGhpcyBjbGFzcyBsaXZlcyBpbiBzaGFyZWQgbWVtb3J5ICh1c2luZyBhbiBhbm9ub21vdXMgbW1hcCkgdG8gdHJhbnNmZXIgZGF0YSBiZXR3ZWVuCisgKiB0aGUgc2VydmVyIHByb2Nlc3MgYW5kIHRoZSBpbWFnZSBwcm9jZXNzaW5nIHByb2Nlc3MuCisgKi8KK3N0cnVjdCBQYWNrZXROb3RpZmllcnsKKyBhb3M6Ok11dGV4IG11dGV4OworIGludCBmZFsyXTsKKyAvLzMgdGhpbmdzIGNhbiBiZSBoYXBwZW5pbmc6CisgLy9zb21ldGhpbmcgd2FpdGluZyB0byBiZSBzZW50LCBzb21ldGhpbmcgc2VuZGluZywgYW5kIHNvbWV0aGluZyBnZXR0aW5nIGZpbGxlZCAoZGVjb21wcmVzc2VkIHRvKQorIHZvaWQgKmJ1ZmZzWzNdOworIGludCB0b19zZW5kOworIGludCBmaWxsaW5nOworIGludCBzZW5kaW5nOworIGJvb2wgaW5fZmxpZ2h0OworIHNpemVfdCBkYXRhX3NpemU7Cisgdm9pZCBOb3RpZnkoKTsKKyB2b2lkIFJlZ2lzdGVyU2VuZGVyKCk7Cisgdm9pZCBSZWdpc3RlclJlY2lldmVyKCk7CisgaW50IFJlY2lldmVyRkQoKXsgcmV0dXJuIGZkWzFdOyB9Cisgc3RhdGljIFBhY2tldE5vdGlmaWVyICpNTWFwKHNpemVfdCBkYXRhX3NpemUpOworIHZvaWQgRGF0YVNlbnQoY29uc3Qgdm9pZCAqIC8qZGF0YSovLCBzaXplX3QgLypkYXRhbGVuKi8pOworIHZvaWQgKkdldEJ1ZmZlcigpOworIHN0YXRpYyB2b2lkIFN0YXRpY0RhdGFTZW50KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB2b2lkICpzZWxmKXsKKwkgKChQYWNrZXROb3RpZmllciAqKShzZWxmKSktPkRhdGFTZW50KGRhdGEsZGF0YWxlbik7CisgfQorIGJvb2wgR2V0RGF0YShjaGFyICoqcGxhY2VfdG9fcHV0LHNpemVfdCAqbGVuZ3RoKTsKK307Cit9ICAvLyBuYW1lc3BhY2UgdmlzaW9uCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKworI2VuZGlmICAvL0ZSQzk3MV9WSVNJT05fUEFDS0VUX05PVElGSUVSX0hfCmRpZmYgLS1naXQgYS92aXNpb24vUmluZ0J1ZmZlci5oIGIvdmlzaW9uL1JpbmdCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzMzZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL1JpbmdCdWZmZXIuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIFZJU0lPTl9SSU5HQlVGRkVSX0hfCisjZGVmaW5lIFZJU0lPTl9SSU5HQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB2aXNpb24geworCit0ZW1wbGF0ZTxjbGFzcyBULGNsYXNzIFY+CitjbGFzcyBSaW5nQnVmZmVyeworICAvL3JlY29yZCBjbGFzcyB0byBob2xkIHNhbXBlcworCWNsYXNzIFNhbXBsZXN7CisJCXB1YmxpYzoKKwkgIFQgdGltZTsKKwkJViB2YWx1ZTsKKwl9OyAgCisJU2FtcGxlcyAqc2FtcGxlczsKKwlpbnQgY3VycmVudF87CisJaW50IHdyYXBzXzsKKwlWIHZhbHVlX2F0KGludCBpbmRleCl7CisJCXJldHVybiBzYW1wbGVzW2luZGV4ICYgMjU1XS52YWx1ZTsKKwl9CisJVCB0aW1lX2F0KGludCBpbmRleCl7CisJCXJldHVybiBzYW1wbGVzW2luZGV4ICYgMjU1XS50aW1lOworCX0KKwlwdWJsaWM6CisJUmluZ0J1ZmZlcigpeworCQljdXJyZW50XyA9IDA7CisJCXdyYXBzXyA9IDA7CisJCXNhbXBsZXMgPSAoU2FtcGxlcyAqKW1hbGxvYyhzaXplb2YoU2FtcGxlcykgKiAyNTYpOworCX0KKwkvLyBBZGRzIHNhbXBsZXMgaW50byB0aGUgcmluZ2J1ZmZlci4KKwl2b2lkIFNhbXBsZShUIHRpbWUsViB2YWwpeworCQljdXJyZW50XyArPSAxOworCQl3cmFwc18gKz0gY3VycmVudF8gLyAyNTY7CisJCWN1cnJlbnRfID0gY3VycmVudF8gJSAyNTY7CisJCXNhbXBsZXNbY3VycmVudF9dLnRpbWUgPSB0aW1lOworCQlzYW1wbGVzW2N1cnJlbnRfXS52YWx1ZSA9IHZhbDsKKwl9CisJLy8gQmluYXJ5IFNlYXJjaCB0byBmaW5kIGFuZCBpbnRlcnBvbGF0ZSB0aGUgdmFsdWVzLgorCVYgVmFsdWVBdChUIHRpbWUpeworCQlpbnQgc3RhcnQgPSBjdXJyZW50XyAtIDI1NTsKKwkJaW50IGVuZCA9IGN1cnJlbnRfOworCQlpZihzdGFydCA8IDAgJiYgIXdyYXBzXyl7IAorCQkJc3RhcnQgPSAwOworCQl9ICAgCisJCWludCBtYXggPSBlbmQ7CisJCWludCBtaW4gPSBzdGFydDsKKwkJd2hpbGUoZW5kIC0gc3RhcnQgPiAxKXsKKwkJCWludCBtaWQgPSAoc3RhcnQgKyBlbmQpIC8gMjsKKwkJCVNhbXBsZXMgY2hlY2sgPSBzYW1wbGVzW21pZCAmIDI1NV07CisJCQlpZihjaGVjay50aW1lIDwgdGltZSl7CisJCQkJc3RhcnQgPSBtaWQ7CisJCQkJbWluID0gbWlkOworCQkJfWVsc2V7CisJCQkJbWF4ID0gbWlkOworCQkJCWVuZCA9IG1pZDsKKwkJCX0gICAKKwkJfQorCQlyZXR1cm4gdmFsdWVfYXQobWluKSArICh2YWx1ZV9hdChtYXgpIC0gdmFsdWVfYXQobWluKSkgKgorCQkoKHRpbWUgLSB0aW1lX2F0KG1pbikpLlRvU2Vjb25kcygpLyh0aW1lX2F0KG1heCkgLSB0aW1lX2F0KG1pbikpLlRvU2Vjb25kcygpKTsKKwl9Cit9OworfTsgIC8vIHZpc2lvbgorfTsgIC8vIGZyYzk3MQorI2VuZGlmIC8vIFZJU0lPTl9SSU5HQlVGRkVSX0hfCmRpZmYgLS1naXQgYS92aXNpb24vU2Vuc29yUHJvY2Vzc29yLmNwcCBiL3Zpc2lvbi9TZW5zb3JQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjA5NTYKLS0tIC9kZXYvbnVsbAorKysgYi92aXNpb24vU2Vuc29yUHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDUzIEBACisjaW5jbHVkZSAidmlzaW9uL1NlbnNvclByb2Nlc3Nvci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGZyYzk3MSB7CisKKy8vIGdpdmUgYSBzZXQgb2YgeCAtPiBmeCBwYWlycyBmaW5kIGEgcmFuZ2UgZm9yIG91ciB2YWx1ZQorLy8gdGhlbiBpbnRlcnBvbGF0ZSBiZXR3ZWVuIGFuZCByZXR1cm4gYW4gaW50ZXJwb2xhdGVkIGZ4LgorLy8gSWYgdGhlIHZhbHVlIGlzIG9mZiB0aGUgZW5kIGp1c3QgZXh0ZW5kIHRoZSBsaW5lIHRvCisvLyBtZWV0IG91ciBwb2ludC4gSWYgc29tZXRoaW5nIGRvZXMgZ28gd3JvbmcgKGFuZCBpdAorLy8gbmV2ZXIgc2hvdWxkKSBpdCB3aWxsIHJldHVybiAtMS4KK2RvdWJsZSBpbnRlcnBvbGF0ZShpbnQgbnVtX2ludGVycF92YWxzLAorCQljb25zdCBJbnRlcnBvbGF0aW9uICppbnRlcnAsIGRvdWJsZSB2YWx1ZSkgeworCWRvdWJsZSBkeTsKKwlkb3VibGUgZHg7CisJZG91YmxlIGE7CisJZG91YmxlIGludGVyY2VwdDsKKwkvL3ByaW50ZigiZm9yIHZhbCAlLjFmXG4iLCB2YWx1ZSk7IAorCWlmICh2YWx1ZSA8IGludGVycFswXS54KSB7CisJCS8vIGlmIGNsb3NlciB0aGFuIG5lYXJlc3QgCisJCWR5ID0gaW50ZXJwWzFdLmZ4IC0gaW50ZXJwWzBdLmZ4OworCQlkeCA9IGludGVycFsxXS54IC0gaW50ZXJwWzBdLng7CisJCWEgPSB2YWx1ZSAtIGludGVycFswXS54OworCQlpbnRlcmNlcHQgPSBpbnRlcnBbMF0uZng7CisJCS8vcHJpbnRmKCJMRVNTIFRIQU5cbiIpOworCX0gZWxzZSBpZiAodmFsdWUgPiBpbnRlcnBbbnVtX2ludGVycF92YWxzLTFdLngpeworCQkvLyBpZiBmdXJ0aGVyIHRoYW4gZnVydGhlc3QgCisJCWR5ID0gaW50ZXJwW251bV9pbnRlcnBfdmFscy0xXS5meCAtIGludGVycFtudW1faW50ZXJwX3ZhbHMtMl0uZng7CisJCWR4ID0gaW50ZXJwW251bV9pbnRlcnBfdmFscy0xXS54IC0gaW50ZXJwW251bV9pbnRlcnBfdmFscy0yXS54OworCQlhID0gdmFsdWUgLSBpbnRlcnBbbnVtX2ludGVycF92YWxzLTJdLng7CisJCWludGVyY2VwdCA9IGludGVycFtudW1faW50ZXJwX3ZhbHMtMl0uZng7CisJCS8vcHJpbnRmKCJHVCBUSEFOXG4iKTsKKwl9IGVsc2UgeworCQkvL3ByaW50ZigiZ2gwXG4iKTsKKwkJLy8gc2NhbiBmb3IgcmFuZ2UKKwkJZm9yKGludCBpPTA7IGk8bnVtX2ludGVycF92YWxzLTE7IGkrKyl7CisJCQlpZih2YWx1ZSA+PSBpbnRlcnBbaV0ueCAmJiB2YWx1ZSA8PSBpbnRlcnBbaSsxXS54KXsKKwkJLy8JCXByaW50ZigiKCUuMWYsJS4xZik9KCUuMWYsJS4xZilcbiIsCisJCS8vCQkJCWludGVycFtpXS54LCBpbnRlcnBbaSsxXS54LAorCQkvLwkJCQlpbnRlcnBbaV0uZngsIGludGVycFtpKzFdLmZ4KTsKKwkJCQlkb3VibGUgbGFtYmRhID0KKwkJCQkJKHZhbHVlIC0gaW50ZXJwW2ldLngpLyhpbnRlcnBbaSsxXS54IC0gaW50ZXJwW2ldLngpOworCQkJCXJldHVybiAoMS1sYW1iZGEpKmludGVycFtpXS5meCArIGxhbWJkYSppbnRlcnBbaSsxXS5meDsKKwkJCX0KKwkJfQorCQkvLyB0aGlzIHNob3VsZCBtYXliZSBiZSBhbiBhc3NlcnQKKwkJcmV0dXJuIC0xOworCX0KKwkKKwlyZXR1cm4gKCAoZHkvZHgpKmEgKyBpbnRlcmNlcHQgKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEvdmlzaW9uL1NlbnNvclByb2Nlc3Nvci5oIGIvdmlzaW9uL1NlbnNvclByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjI0YmUKLS0tIC9kZXYvbnVsbAorKysgYi92aXNpb24vU2Vuc29yUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBWSVNJT05fU0VOU09SX1BST0NFU1NPUl9IXworI2RlZmluZSBWSVNJT05fU0VOU09SX1BST0NFU1NPUl9IXworCituYW1lc3BhY2UgZnJjOTcxIHsKKworLy8gc3RydWN0IG1hcHMgYSBzaW5nbGUgcG9pbnQgeCB0byB0byBhIHZhbHVlIGYgb2YgeAordHlwZWRlZiBzdHJ1Y3QgeworCWRvdWJsZSB4OworCWRvdWJsZSBmeDsKK30gSW50ZXJwb2xhdGlvbjsKKworc3RhdGljIGNvbnN0IEludGVycG9sYXRpb24ga1BpeGVsc1RvTWV0ZXJzW10gPSB7CisgIHstMC4wNTA3ODEsIDQuNzQ5OH0sCisgIHstMC4wMzc1LCA0LjMxOH0sCisgIHswLjAyODEyNSwgMy45ODc4fSwKKyAgezAuMDgwNDY5LCAzLjUxfSwKKyAgezAuMTI2NTYzLCAzLjE0OTZ9LAorICB7MC4xMzEsIDIuOTk3Mn0sCisgIHswLjE0NCwgMi45MjF9LAorICB7MC4xOTYsIDMuMjI1OH0sCisgIC8vIEJlbG93IGhlcmUgaXMganVuayBiZWNhdXNlIGl0IHN0YXJ0cyBjb21pbmcgb2ZmIG9mIHRoZSB0b3dlciBiYXNlLgorICB7MC4yOTY4NzUsIDIuNjY3fSwKKyAgezAuMzUxNTYyLCAyLjM4NzZ9LAorfTsKKworLy8gTXVzdCBiZSBpbiByZXZlcnNlIG9yZGVyIGluIG1ldGVycy4KK3N0YXRpYyBjb25zdCBJbnRlcnBvbGF0aW9uIGtNZXRlcnNUb1Nob290ZXJTcGVlZHNbXSA9IHsKKyAgezIuMCwgMzc1LjB9LAorICB7My4wLCAzNjAuMH0sCisgIHs0LjUsIDM3NS4wfSwKK307CisKK3N0YXRpYyBjb25zdCBJbnRlcnBvbGF0aW9uIGtNZXRlcnNUb1Nob290ZXJBbmdsZXNbXSA9IHsKKyAgezMuMCwgMC42OH0sCisgIHszLjcsIDAuNjM1fSwKKyAgezQuMTUsIDAuNTh9LAorICB7NS4wLCAwLjUxfSwKK307CisKK2RvdWJsZSBpbnRlcnBvbGF0ZShpbnQgbnVtX2ludGVycF92YWxzLAorCQljb25zdCBJbnRlcnBvbGF0aW9uICppbnRlcnAsIGRvdWJsZSB2YWx1ZSk7CisKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBWSVNJT05fU0VOU09SX1BST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvdmlzaW9uL2JtcF9zdHJlYW0vYm1wLnJiIGIvdmlzaW9uL2JtcF9zdHJlYW0vYm1wLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMmM5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi92aXNpb24vYm1wX3N0cmVhbS9ibXAucmIKQEAgLTAsMCArMSwxMSBAQAorY2xhc3MgQk1QSGVhZGVyCisJZGVmIGluaXRpYWxpemUod2lkdGgsaGVpZ2h0KQorCQlAd2lkdGggPSB3aWR0aAorCQlAaGVpZ2h0ID0gaGVpZ2h0CisJZW5kCisJZGVmIHRleHQoKQorCQlzaXplID0gQHdpZHRoICogQGhlaWdodCAqIDMKKwkJcmV0dXJuIFsiQk0iLHNpemUgKyA1NCwiXDBcMFwwXDAiLDU0LDQwLEB3aWR0aCwKKwkJCUBoZWlnaHQsMSwyNCwwLHNpemUsMjgzNSwyODM1LDAsMF0ucGFjaygiYTJJYTRJSUlJc3NJSUlJSUkiKQorCWVuZAorZW5kCmRpZmYgLS1naXQgYS92aXNpb24vYm1wX3N0cmVhbS9ibXBfZHVtcC5yYiBiL3Zpc2lvbi9ibXBfc3RyZWFtL2JtcF9kdW1wLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTEzM2MKLS0tIC9kZXYvbnVsbAorKysgYi92aXNpb24vYm1wX3N0cmVhbS9ibXBfZHVtcC5yYgpAQCAtMCwwICsxLDQ1IEBACityZXF1aXJlICJzb2NrZXQiCisKK3JlcXVpcmUgImJtcCIKK3NvY2sgPSBUQ1BTb2NrZXQubmV3KEFSR1ZbMF0gfHwgImZpdHBjIiw4MDIwKQorJHdpZHRoID0gNjQwIC8gMgorJGhlaWdodCA9IDQ4MCAvIDIKKyRoZWFkZXIgPSBCTVBIZWFkZXIubmV3KCR3aWR0aCwkaGVpZ2h0KS50ZXh0KCkKKworCisKK3JlcXVpcmUgInJ1YnlnZW1zIgorcmVxdWlyZSAiZ3RrMiIKKworCiskaW1hZ2UgPSBHdGs6OkltYWdlLm5ldygpCiskd2luZG93ID0gR3RrOjpXaW5kb3cubmV3KCkKKyR3aW5kb3cuYWRkKCRpbWFnZSkKKyR3aW5kb3cuc2hvd19hbGwoKQorJHdpbmRvdy5zaWduYWxfY29ubmVjdCgiZGVsZXRlLWV2ZW50IikgeyBHdGsubWFpbl9xdWl0fQorCitsb2FkZXIgPSBHZGs6OlBpeGJ1ZkxvYWRlci5uZXcKK2xvYWRlci53cml0ZSgkaGVhZGVyKQorZGF0YSA9IHNvY2sucmVhZCgkd2lkdGggKiAkaGVpZ2h0ICogMykKK2xvYWRlci5sYXN0X3dyaXRlKGRhdGEpCitsb2FkZXIuY2xvc2UKKyRpbWFnZS5waXhidWYgPSBsb2FkZXIucGl4YnVmCiskb2xkdGltZSA9IFRpbWUubm93CitpID0gMAorR3RrLmlkbGVfYWRkIGRvCisJbG9hZGVyID0gR2RrOjpQaXhidWZMb2FkZXIubmV3CisJbG9hZGVyLndyaXRlKCRoZWFkZXIpCisJZGF0YSA9IHNvY2sucmVhZCgkd2lkdGggKiAkaGVpZ2h0ICogMykKKyMJKDY0MCAqIDQ4MCkudGltZXMgZG8gfGl8ICNCR1IgLT4gUkdCCisjCQliLGcsciA9IGRhdGFbaSAqIDMgKyAwXSxkYXRhW2kgKiAzICsgMV0sZGF0YVtpICogMyArIDJdCisjCQlkYXRhW2kgKiAzICsgMF0sZGF0YVtpICogMyArIDFdLGRhdGFbaSAqIDMgKyAyXSA9IHIsZyxiCisjCWVuZAorCWxvYWRlci5sYXN0X3dyaXRlKGRhdGEpCisJbG9hZGVyLmNsb3NlCisJbmV3X3RpbWUgPSBUaW1lLm5vdygpCisJcHV0cyAxIC8gKG5ld190aW1lIC0gJG9sZHRpbWUpCisJJG9sZHRpbWUgPSBuZXdfdGltZQorCSRpbWFnZS5waXhidWYgPSBsb2FkZXIucGl4YnVmCitlbmQKKworR3RrLm1haW4oKQpkaWZmIC0tZ2l0IGEvdmlzaW9uL2JtcF9zdHJlYW0vYm1wX3N0cmVhbV9mcm9tX2ZpbGUucmIgYi92aXNpb24vYm1wX3N0cmVhbS9ibXBfc3RyZWFtX2Zyb21fZmlsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzI0NDg0Ci0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL2JtcF9zdHJlYW0vYm1wX3N0cmVhbV9mcm9tX2ZpbGUucmIKQEAgLTAsMCArMSw0MyBAQAorcmVxdWlyZSAic29ja2V0IgorJGhlYWRlciA9IEZpbGUub3BlbigiaGVhZGVyLmJtcCIpIHsgfGZ8IGYucmVhZCg1NCl9IAorCisKK3NvY2sgPSBGaWxlLm9wZW4oIm91dHB1dC5ibXBfc3RyZWFtIikKKyNUQ1BTb2NrZXQubmV3KEFSR1ZbMF0gfHwgImZpdHBjIiw4MDIwKQorCisKKworcmVxdWlyZSAicnVieWdlbXMiCityZXF1aXJlICJndGsyIgorCisKKyRpbWFnZSA9IEd0azo6SW1hZ2UubmV3KCkKKyR3aW5kb3cgPSBHdGs6OldpbmRvdy5uZXcoKQorJHdpbmRvdy5hZGQoJGltYWdlKQorJHdpbmRvdy5zaG93X2FsbCgpCiskd2luZG93LnNpZ25hbF9jb25uZWN0KCJkZWxldGUtZXZlbnQiKSB7IEd0ay5tYWluX3F1aXR9CisKK2xvYWRlciA9IEdkazo6UGl4YnVmTG9hZGVyLm5ldworbG9hZGVyLndyaXRlKCRoZWFkZXIpCitkYXRhID0gc29jay5yZWFkKDMyMCAqIDI0MCAqIDMpCitsb2FkZXIubGFzdF93cml0ZShkYXRhKQorbG9hZGVyLmNsb3NlCiskaW1hZ2UucGl4YnVmID0gbG9hZGVyLnBpeGJ1ZgorJG9sZHRpbWUgPSBUaW1lLm5vdworR3RrLnRpbWVvdXRfYWRkKDEwMDApIGRvIAorCWxvYWRlciA9IEdkazo6UGl4YnVmTG9hZGVyLm5ldworCWxvYWRlci53cml0ZSgkaGVhZGVyKQorCWRhdGEgPSBzb2NrLnJlYWQoMzIwICogMjQwICogMykKKyMJKDY0MCAqIDQ4MCkudGltZXMgZG8gfGl8ICNCR1IgLT4gUkdCCisjCQliLGcsciA9IGRhdGFbaSAqIDMgKyAwXSxkYXRhW2kgKiAzICsgMV0sZGF0YVtpICogMyArIDJdCisjCQlkYXRhW2kgKiAzICsgMF0sZGF0YVtpICogMyArIDFdLGRhdGFbaSAqIDMgKyAyXSA9IHIsZyxiCisjCWVuZAorCWxvYWRlci5sYXN0X3dyaXRlKGRhdGEpCisJbG9hZGVyLmNsb3NlCisJbmV3X3RpbWUgPSBUaW1lLm5vdygpCisJcHV0cyAxLjAgLyAobmV3X3RpbWUgLSAkb2xkdGltZSkKKwkkb2xkdGltZSA9IG5ld190aW1lCisJJGltYWdlLnBpeGJ1ZiA9IGxvYWRlci5waXhidWYKK2VuZAorCitHdGsubWFpbigpCmRpZmYgLS1naXQgYS92aXNpb24vYm1wX3N0cmVhbS9ibXBfc3RyZWFtX3RvX2ZpbGUucmIgYi92aXNpb24vYm1wX3N0cmVhbS9ibXBfc3RyZWFtX3RvX2ZpbGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyYmIyZAotLS0gL2Rldi9udWxsCisrKyBiL3Zpc2lvbi9ibXBfc3RyZWFtL2JtcF9zdHJlYW1fdG9fZmlsZS5yYgpAQCAtMCwwICsxLDIwIEBACityZXF1aXJlICJzb2NrZXQiCiskaGVhZGVyID0gRmlsZS5vcGVuKCJoZWFkZXIuYm1wIikgeyB8ZnwgZi5yZWFkKDU0KX0gCisKKworc29jayA9IFRDUFNvY2tldC5uZXcoQVJHVlswXSB8fCAiZml0cGMiLDgwMjApCisKKworCityZXF1aXJlICJydWJ5Z2VtcyIKK3JlcXVpcmUgImd0azIiCisKKworCitGaWxlLm9wZW4oIm91dHB1dC5ibXBfc3RyZWFtIiwidysiKSBkbyB8ZmlsZXwKKwk0MDAudGltZXMgZG8gfGl8CisJCWRhdGEgPSBzb2NrLnJlYWQoMzIwICogMjQwICogMykKKwkJZmlsZS5wcmludChkYXRhKQorCQlwdXRzICJmcmFtZTogI3tpfSIKKwllbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmlzaW9uL3Rlc3RzL0ZpZWxkREJHQ2FtUHJvYy5jcHAgYi92aXNpb24vdGVzdHMvRmllbGREQkdDYW1Qcm9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjNiNTQxCi0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL3Rlc3RzL0ZpZWxkREJHQ2FtUHJvYy5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICIuLi9DYW1lcmFQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICIuLi9TZW5zb3JQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgIm9wZW5jdjIvaGlnaGd1aS9oaWdoZ3VpLmhwcCIKKworY29uc3QgaW50IG51bV9uYW1lcyA9IDM5OworCisKK3N0YXRpYyBjb25zdCBib29sIFVTRV9ST1RBVEVEID0gdHJ1ZTsKK3N0YXRpYyBjb25zdCBpbnQgdXNlX3dpZHRoID0gMzIwOworc3RhdGljIGNvbnN0IGludCB1c2VfaGVpZ2h0ID0gMjQwOworY29uc3QgY2hhciAqIGltYWdlX25hbWVzW251bV9uYW1lc10gPSB7CisJCQkiTkFTQV9ibXAvaW1nMjZfc2VyaWVzX2Jfc2lkZV8yMDRfZTY1LmpwZyIsCisJCQkiTkFTQV9ibXAvaW1nMTlfc2VyaWVzX2Jfc2lkZV8xMTBfZTY1LmpwZyIsCisJCQkiTkFTQV9ibXAvaW1nMTJfc2VyaWVzX2JfY2VudGVyXzIyNF9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcyM19zZXJpZXNfYl9zaWRlXzEwMV9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcxNV9zZXJpZXNfYl9zaWRlXzIzMF9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcxMF9zZXJpZXNfYl9jZW50ZXJfMjAzX2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzExX3Nlcmllc19iX2NlbnRlcl8yMDNfZTY1LmpwZyIsCisJCQkiTkFTQV9ibXAvaW1nMTNfc2VyaWVzX2JfY2VudGVyXzI2MF9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcxNF9zZXJpZXNfYl9jZW50ZXJfMjUxX2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzE2X3Nlcmllc19iX3NpZGVfMTk2X2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzE3X3Nlcmllc19iX3NpZGVfMTYwX2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzE4X3Nlcmllc19iX3NpZGVfMTQwX2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzFfY2VudGVyXzIwMF9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcyMF9zZXJpZXNfYl9zaWRlXzExNF9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcyMV9zZXJpZXNfYl9zaWRlXzEzN19lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcyMl9jZW50ZXIgZmllbGRfZTEwLmpwZyIsCisJCQkiTkFTQV9ibXAvaW1nMjJfZG9nIENlbnRlciBGaWVsZF9lMTAuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcyMl9zZXJpZXNfYl9zaWRlXzE1MF9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWcyM19jZW50ZXIgZmllbGRfZTEwLmpwZyIsCisJCQkiTkFTQV9ibXAvaW1nMjRfY2VudGVyIGZpZWxkX2UxMC5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzI0X3Nlcmllc19iX3NpZGVfMTA0X2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzI1X3Nlcmllc19iX3NpZGVfMTk1X2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzI3X3Nlcmllc19iX3NpZGVfMTkyX2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzI4X3Nlcmllc19iX3NpZGVfMTkyX2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzI5X3Nlcmllc19iX3NpZGVfMTg2X2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzJfY2VudGVyXzIwN19lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWczMF9zZXJpZXNfYl9zaWRlXzE3N19lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWczMV9zZXJpZXNfYl9zaWRlXzE3Nl9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWczMl9zZXJpZXNfYl9zaWRlXzIxMl9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWczM19zZXJpZXNfYl9zaWRlXzI1MV9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWczNF9zZXJpZXNfYl9zaWRlXzI3Ml9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWczNV9zZXJpZXNfYl9zaWRlXzIzKzIxOV9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWczX2NlbnRlcl8xODBfZTY1LmpwZyIsCisJCQkiTkFTQV9ibXAvaW1nNF9zZXJpZXNfYl9jZW50ZXJfMTA2X2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzVfc2VyaWVzX2JfY2VudGVyXzEyMl9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWc2X3Nlcmllc19iX2NlbnRlcl8xNDVfZTY1LmpwZyIsCisJCQkiTkFTQV9ibXAvaW1nN19zZXJpZXNfYl9jZW50ZXJfMTc0X2U2NS5qcGciLAorCQkJIk5BU0FfYm1wL2ltZzhfc2VyaWVzX2JfY2VudGVyXzE5Nl9lNjUuanBnIiwKKwkJCSJOQVNBX2JtcC9pbWc5X3Nlcmllc19iX2NlbnRlcl8yMDFfZTY1LmpwZyJ9OworCitjb25zdCBjaGFyCSogV0lORE9XX05BTUUJPSAiVHJlc2hob2xkIFdpbmRvdyI7Citjb25zdCBjaGFyCSogV0lORE9XX05BTUUyCT0gIlRhcmdldCBXaW5kb3ciOworCisKK3N0YXRpYyB2b2lkIG9uTW91c2UoIGludCBldmVudCwgaW50IHgsIGludCB5LCBpbnQsIHZvaWQqIHVzZXJEYXRhICkgeworCWlmKCBldmVudCAhPSBDVl9FVkVOVF9MQlVUVE9ORE9XTiApIHJldHVybjsKKwlQcm9jZXNzb3JEYXRhICpwcm9jID0gKFByb2Nlc3NvckRhdGEgKikgdXNlckRhdGE7CisJSXBsSW1hZ2UgKmltYWdlID0gcHJvYy0+c3JjX2hlYWRlcl9pbWFnZTsKKwl1Y2hhciBiID0gKigodWNoYXIqKSAoaW1hZ2UtPmltYWdlRGF0YSArIHkqaW1hZ2UtPndpZHRoU3RlcCArIDMqeCkpOworCXVjaGFyIGcgPSAqKCh1Y2hhciopIChpbWFnZS0+aW1hZ2VEYXRhICsgeSppbWFnZS0+d2lkdGhTdGVwICsgMyooeCsxKSkpOworCXVjaGFyIHIgPSAqKCh1Y2hhciopIChpbWFnZS0+aW1hZ2VEYXRhICsgeSppbWFnZS0+d2lkdGhTdGVwICsgMyooeCsyKSkpOworCQorCXVjaGFyIGg9MDsKKwl1Y2hhciBzPTA7CisJdWNoYXIgdj0wOworCXByb2MtPlJHQnRvSFNWKHIsIGcsIGIsICZoLCAmcywgJnYpOworCisJCisJKigodWNoYXIqKSAoaW1hZ2UtPmltYWdlRGF0YSArIHkqaW1hZ2UtPndpZHRoU3RlcCArIDMqeCkpID0gMTI4OworCSooKHVjaGFyKikgKGltYWdlLT5pbWFnZURhdGEgKyB5KmltYWdlLT53aWR0aFN0ZXAgKyAzKih4KzEpKSkgPSAxMjg7CisJKigodWNoYXIqKSAoaW1hZ2UtPmltYWdlRGF0YSArIHkqaW1hZ2UtPndpZHRoU3RlcCArIDMqKHgrMikpKSA9IDI1NTsKKwkKKwljdjo6TWF0IHNyYyhpbWFnZSk7CisJLy9jdjo6aW1zaG93KCJ0ZXN0Iiwgc3JjKTsKKworCXByaW50ZigiZ290IGNsaWNrICglZCwlZCk9IDwlZCwlZCwlZD4gLS0gWyVkLCVkLCVkXVxuIiwKKwkJCXgsIHksIHIsIGcsIGIsIGgsIHMsIHYpOworfQorCisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICl7CisJUHJvY2Vzc29yRGF0YSBwcm9jZXNzb3IodXNlX3dpZHRoLCB1c2VfaGVpZ2h0LCBVU0VfUk9UQVRFRCk7CisJaW50IGltZ19jeWNsZSA9IDA7CisJaW50IHRocmVzaCA9IDEwMDsKKwkKKwljdlN0YXJ0V2luZG93VGhyZWFkKCk7CisKKwljdk5hbWVkV2luZG93ICgiY250IiwgQ1ZfV0lORE9XX0FVVE9TSVpFKTsKKwljdk5hbWVkV2luZG93ICgiR0xPQkFMIiwgQ1ZfV0lORE9XX0FVVE9TSVpFKTsKKwkvL2N2TmFtZWRXaW5kb3cgKCJHcmV5IEltZyIsIENWX1dJTkRPV19BVVRPU0laRSk7CisJLy9jdk5hbWVkV2luZG93ICgidGVzdCIsIENWX1dJTkRPV19BVVRPU0laRSk7CisJY3ZOYW1lZFdpbmRvdyAoV0lORE9XX05BTUUyLCBDVl9XSU5ET1dfQVVUT1NJWkUpOworCWN2TmFtZWRXaW5kb3cgKFdJTkRPV19OQU1FLCBDVl9XSU5ET1dfQVVUT1NJWkUpOworCisJY3ZNb3ZlV2luZG93KFdJTkRPV19OQU1FLDAsMCk7CisJY3ZNb3ZlV2luZG93KCJHTE9CQUwiLDMyNSwwKTsKKwljdk1vdmVXaW5kb3coV0lORE9XX05BTUUyLDY1MCwwKTsKKwkvL2N2TW92ZVdpbmRvdygiR3JleSBJbWciLCAwLCAyNzUpOworCS8vY3ZNb3ZlV2luZG93KCJ0ZXN0IiwgMzI1LCAyNzUpOworCWN2TW92ZVdpbmRvdygiY250IiwxMTAwLDEwMCk7CisJLy9DcmVhdGluZyB0aGUgdHJhY2tiYXJzCisJY3ZDcmVhdGVUcmFja2JhcigiSDEiLCJjbnQiLCZwcm9jZXNzb3IuaDEsMzYwLDApOworCWN2Q3JlYXRlVHJhY2tiYXIoIkgyIiwiY250IiwmcHJvY2Vzc29yLmgyLDM2MCwwKTsKKwljdkNyZWF0ZVRyYWNrYmFyKCJTMSIsImNudCIsJnByb2Nlc3Nvci5zMSwyNTUsMCk7CisJY3ZDcmVhdGVUcmFja2JhcigiUzIiLCJjbnQiLCZwcm9jZXNzb3IuczIsMjU1LDApOworCWN2Q3JlYXRlVHJhY2tiYXIoIlYxIiwiY250IiwmcHJvY2Vzc29yLnYxLDI1NSwwKTsKKwljdkNyZWF0ZVRyYWNrYmFyKCJWMiIsImNudCIsJnByb2Nlc3Nvci52MiwyNTUsMCk7CisJCisJd2hpbGUgKGltZ19jeWNsZSA+PSAwKSB7CisJCXByb2Nlc3Nvci5jbGVhcigpOworCQlwcmludGYoIiVkID0gJXNcbiIsIGltZ19jeWNsZSwgaW1hZ2VfbmFtZXNbaW1nX2N5Y2xlXSk7CisJCXByb2Nlc3Nvci5zcmNfaGVhZGVyX2ltYWdlID0gY3ZMb2FkSW1hZ2UoaW1hZ2VfbmFtZXNbaW1nX2N5Y2xlXSk7CisJCWN2Q29weShwcm9jZXNzb3Iuc3JjX2hlYWRlcl9pbWFnZSwgcHJvY2Vzc29yLmdsb2JhbF9kaXNwbGF5KTsKKworCQljdjo6c2V0TW91c2VDYWxsYmFjayggV0lORE9XX05BTUUyLCBvbk1vdXNlLAorCQkJCSh2b2lkICopJnByb2Nlc3NvciApOworCisJCWN2OjpNYXQgZ2xvYmFsX21hdChwcm9jZXNzb3IuZ2xvYmFsX2Rpc3BsYXkpOworCQljdjo6TWF0IHNyY19tYXQocHJvY2Vzc29yLnNyY19oZWFkZXJfaW1hZ2UpOworCisJCS8vIFRoZXNlIGxpbmVzIGFyZSB0aGUgdmlzaW9uIHByb2Nlc3NpbmcsIHRoZSByZXN0IG9mIG1haW4KKwkJLy8gaXMganVzdCBmbHVmZgorCQlwcm9jZXNzb3IudGhyZXNob2xkKCh1Y2hhciAqKQorCQkJCXByb2Nlc3Nvci5zcmNfaGVhZGVyX2ltYWdlLT5pbWFnZURhdGEpOworCQlwcm9jZXNzb3IuZ2V0Q29udG91cnMoKTsKKwkJcHJvY2Vzc29yLmZpbHRlclRvVGFyZ2V0cygpOworCisJCWlmKCFwcm9jZXNzb3IudGFyZ2V0X2xpc3QuZW1wdHkoKSl7CisJCQlzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+ID4gdGFyZ2V0X2NvbnRvdXJzOworCQkJc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y3Y6OlBvaW50PiA+IGJlc3RfY29udG91cnM7CisJCQlzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjdjo6UG9pbnQ+ID4gcmF3X2NvbnRvdXJzOworCQkJc3RkOjp2ZWN0b3I8VGFyZ2V0Pjo6aXRlcmF0b3IgdGFyZ2V0X2l0OworCQkJVGFyZ2V0ICpiZXN0X3RhcmdldCA9IE5VTEw7CisJCQlpbnQgaSA9IDA7CisJCQlmb3IodGFyZ2V0X2l0ID0gcHJvY2Vzc29yLnRhcmdldF9saXN0LmJlZ2luKCk7CisJCQkJCXRhcmdldF9pdCAhPSBwcm9jZXNzb3IudGFyZ2V0X2xpc3QuZW5kKCk7IHRhcmdldF9pdCsrKXsKKwkJCQl0YXJnZXRfY29udG91cnMucHVzaF9iYWNrKHRhcmdldF9pdC0+dGhpc19jb250b3VyKTsKKwkJCQlyYXdfY29udG91cnMucHVzaF9iYWNrKHRhcmdldF9pdC0+cmF3X2NvbnRvdXIpOworCQkJCXByaW50ZigiJWQ6IGg9JS4xZiwgaW50ZXJwPSUuMWYsIDx4LHk+PTwlLjFmLCUuMWY+XG4iLAorCQkJCQkJaSsrLCB0YXJnZXRfaXQtPmhlaWdodCwKKwkJCQkJCWludGVycG9sYXRlKDQsICZwaXhlbF90b19kaXN0WzBdLCB0YXJnZXRfaXQtPnJlY3QuY2VudHJvaWQueCksCisJCQkJCQl0YXJnZXRfaXQtPnJlY3QuY2VudHJvaWQueCwgdGFyZ2V0X2l0LT5yZWN0LmNlbnRyb2lkLnkpOworCQkJCWlmIChiZXN0X3RhcmdldCA9PSBOVUxMKSB7CisJCQkJCWJlc3RfdGFyZ2V0ID0gJip0YXJnZXRfaXQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRhcmdldF9pdC0+aGVpZ2h0ID4gYmVzdF90YXJnZXQtPmhlaWdodCkgeworCQkJCQkJYmVzdF90YXJnZXQgPSAmKnRhcmdldF9pdDsKKwkJCQkJfQorCQkJCS8qCWlmIChwcm9jZXNzb3IuaXNfOTApIHsKKwkJCQkJCWlmICh0YXJnZXRfaXQtPnJlY3QuY2VudHJvaWQueCA+IGJlc3RfdGFyZ2V0LT5yZWN0LmNlbnRyb2lkLngpIHsKKwkJCQkJCQliZXN0X3RhcmdldCA9ICYqdGFyZ2V0X2l0OworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHRhcmdldF9pdC0+cmVjdC5jZW50cm9pZC55IDwgYmVzdF90YXJnZXQtPnJlY3QuY2VudHJvaWQueSkgeworCQkJCQkJCWJlc3RfdGFyZ2V0ID0gJip0YXJnZXRfaXQ7CisJCQkJCQl9CisJCQkJCX0qLworCQkJCX0KKwkJCX0KKwkJCWJlc3RfY29udG91cnMucHVzaF9iYWNrKGJlc3RfdGFyZ2V0LT50aGlzX2NvbnRvdXIpOworCQkJLy9kcmF3Q29udG91cnMoZ2xvYmFsX21hdCx0YXJnZXRfY29udG91cnMsLTEsY29sb3IsQ1ZfRklMTEVEKTsKKwkJCWN2OjppbXNob3coV0lORE9XX05BTUUsIHNyY19tYXQpOworCQkJLy9jdjo6aW1zaG93KCJHcmV5IEltZyIsICpwcm9jZXNzb3IuZ3JleV9tYXQpOworCQkJY3Y6OlNjYWxhciBjb2xvcigwLDAsMjU1KTsKKwkJCWN2OjpkcmF3Q29udG91cnMoIHNyY19tYXQsIHRhcmdldF9jb250b3VycywgLTEsIGNvbG9yLCBDVl9GSUxMRUQgKTsKKwkJCWN2OjpTY2FsYXIgY29sb3IyKDEyOCwwLDI1NSk7CisJCQljdjo6ZHJhd0NvbnRvdXJzKCBzcmNfbWF0LCBiZXN0X2NvbnRvdXJzLCAtMSwgY29sb3IyLCBDVl9GSUxMRUQgKTsKKwkJCWN2OjpTY2FsYXIgY29sb3IzKDAsMjU1LDApOworCQkJY3Y6OmRyYXdDb250b3Vycyggc3JjX21hdCwgcmF3X2NvbnRvdXJzLCAtMSwgY29sb3IzLCAxICk7CisJCX0KKwkJLy9jdjo6TWF0IGdyZXlfbWF0KGdyZXlfaW1hZ2UpOworCQkvL2N2OjppbXNob3coV0lORE9XX05BTUUyLCBncmV5X21hdCk7CisJCWN2OjppbXNob3coIkdMT0JBTCIsIGdsb2JhbF9tYXQpOworCQljdjo6aW1zaG93KFdJTkRPV19OQU1FMiwgc3JjX21hdCk7CisJCWNoYXIga2V5ID0gY3ZXYWl0S2V5KDMwMDApOworCQlzd2l0Y2ggKGtleSkgeworCQkJY2FzZSAnICc6CisJCQkJaW1nX2N5Y2xlKys7CisJCQkJaW1nX2N5Y2xlID0gaW1nX2N5Y2xlICUgbnVtX25hbWVzOworCQkJCXByaW50ZigiJWMgJWQ9ICVzXG4iLCBrZXksIGltZ19jeWNsZSwgaW1hZ2VfbmFtZXNbaW1nX2N5Y2xlXSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdnJzoKKwkJCQl0aHJlc2grKzsKKwkJCQl0aHJlc2ggPSAodGhyZXNoICUgMjU1KTsKKwkJCQlwcmludGYoIisgdGhyZXNoPSAlZFxuIiwgdGhyZXNoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0cnOgorCQkJCXRocmVzaC0tOworCQkJCXRocmVzaCA9ICh0aHJlc2ggJSAyNTUpOworCQkJCXByaW50ZigiLSB0aHJlc2g9ICVkXG4iLCB0aHJlc2gpOworCQkJCWJyZWFrOworCQkJY2FzZSAncSc6CisJCQkJaW1nX2N5Y2xlID0gLTE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCS8vcmVkcmF3IGltYWdlIGN1eiB3ZSBkcmV3IGFsbCBvdmVyIGl0CisJfQorCisJY3ZEZXN0cm95V2luZG93KFdJTkRPV19OQU1FKTsKK30KKwpkaWZmIC0tZ2l0IGEvdmlzaW9uL3Zpc2lvbi5neXAgYi92aXNpb24vdmlzaW9uLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWU1NTYyCi0tLSAvZGV2L251bGwKKysrIGIvdmlzaW9uL3Zpc2lvbi5neXAKQEAgLTAsMCArMSwzOCBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnT3BlbkNWV29ya1Rhc2snLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ09wZW5DVldvcmtUYXNrLmNwcCcsCisgICAgICAgICdDYW1lcmFQcm9jZXNzb3IuY3BwJywKKyAgICAgICAgIydCaW5hcnlTZXJ2ZXIuY3BwJywKKyAgICAgICAgIydQYWNrZXROb3RpZmllci5jcHAnLAorICAgICAgICAnSlBFR1JvdXRpbmVzLmNwcCcsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmxpYmV2ZW50JywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpsaWJqcGVnJywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpvcGVuY3YnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvY2FtZXJhL2NhbWVyYS5neXA6YnVmZmVycycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvcXVldWVzL3F1ZXVlcy5neXA6cXVldWVzJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnR29hbE1hc3RlcicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnR29hbE1hc3Rlci5jcHAnLAorICAgICAgICAnU2Vuc29yUHJvY2Vzc29yLmNwcCcsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3F1ZXVlcy9xdWV1ZXMuZ3lwOnF1ZXVlcycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3kyMDE0L2FjdG9ycy9hY3RvcnMuZ3lwIGIveTIwMTQvYWN0b3JzL2FjdG9ycy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhMDNkMAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2FjdG9ycy9hY3RvcnMuZ3lwCkBAIC0wLDAgKzEsMTEwIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdiaW5hcmllcycsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdkcml2ZXRyYWluX2FjdGlvbicsCisgICAgICAgICdzaG9vdF9hY3Rpb24nLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzaG9vdF9hY3Rpb25fcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ3Nob290X2FjdGlvbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTQvYWN0b3JzJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Nob290X2FjdGlvbl9saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzaG9vdF9hY3Rvci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3Nob290X2FjdGlvbl9xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9xdWV1ZXMvcXVldWVzLmd5cDpwcm9maWxlX3BhcmFtcycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLmd5cDpzaG9vdGVyX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3Lmd5cDpjbGF3X3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L3kyMDE0Lmd5cDpjb25zdGFudHMnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnc2hvb3RfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc2hvb3RfYWN0aW9uJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzaG9vdF9hY3Rvcl9tYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICdzaG9vdF9hY3Rpb25fbGliJywKKyAgICAgICAgJ3Nob290X2FjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RyaXZldHJhaW5fYWN0aW9uX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWydkcml2ZXRyYWluX2FjdGlvbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTQvYWN0b3JzJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RyaXZldHJhaW5fYWN0aW9uX2xpYicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2RyaXZldHJhaW5fYWN0b3IuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdkcml2ZXRyYWluX2FjdGlvbl9xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNC95MjAxNC5neXA6Y29uc3RhbnRzJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpwaGFzZWRfbG9vcCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cDpxdWV1ZV9sb2dnaW5nJywKKyAgICAgICAgJzwoRVhURVJOQUxTKTplaWdlbicsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dHJhcGV6b2lkX3Byb2ZpbGUnLAorICAgICAgICAnPChERVBUSCkveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uZ3lwOmRyaXZldHJhaW5fcXVldWUnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnZHJpdmV0cmFpbl9hY3Rpb25fcXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkcml2ZXRyYWluX2FjdGlvbicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZHJpdmV0cmFpbl9hY3Rvcl9tYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICdkcml2ZXRyYWluX2FjdGlvbl9saWInLAorICAgICAgICAnZHJpdmV0cmFpbl9hY3Rpb25fcXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEveTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0aW9uLnEgYi95MjAxNC9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rpb24ucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQ1NWQzCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0aW9uLnEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBmcmM5NzEuYWN0b3JzOworCitpbXBvcnQgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLnEiOworCisvLyBQYXJhbWV0ZXJzIHRvIHNlbmQgd2l0aCBzdGFydC4KK3N0cnVjdCBEcml2ZXRyYWluQWN0aW9uUGFyYW1zIHsKKyAgZG91YmxlIGxlZnRfaW5pdGlhbF9wb3NpdGlvbjsKKyAgZG91YmxlIHJpZ2h0X2luaXRpYWxfcG9zaXRpb247CisgIGRvdWJsZSB5X29mZnNldDsKKyAgZG91YmxlIHRoZXRhX29mZnNldDsKKyAgZG91YmxlIG1heGltdW1fdmVsb2NpdHk7CisgIGRvdWJsZSBtYXhpbXVtX2FjY2VsZXJhdGlvbjsKKyAgZG91YmxlIG1heGltdW1fdHVybl92ZWxvY2l0eTsKKyAgZG91YmxlIG1heGltdW1fdHVybl9hY2NlbGVyYXRpb247Cit9OworCitxdWV1ZV9ncm91cCBEcml2ZXRyYWluQWN0aW9uUXVldWVHcm91cCB7CisgIGltcGxlbWVudHMgYW9zLmNvbW1vbi5hY3Rpb25zLkFjdGlvblF1ZXVlR3JvdXA7CisKKyAgbWVzc2FnZSBHb2FsIHsKKyAgICB1aW50MzJfdCBydW47CisgICAgRHJpdmV0cmFpbkFjdGlvblBhcmFtcyBwYXJhbXM7CisgIH07CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBhb3MuY29tbW9uLmFjdGlvbnMuU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIERyaXZldHJhaW5BY3Rpb25RdWV1ZUdyb3VwIGRyaXZldHJhaW5fYWN0aW9uOwpkaWZmIC0tZ2l0IGEveTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3IuY2MgYi95MjAxNC9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Y4NmJkCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3IuY2MKQEAgLTAsMCArMSwxNjggQEAKKyNpbmNsdWRlICJ5MjAxNC9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvcGhhc2VkX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC90cmFwZXpvaWRfcHJvZmlsZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29tbW9ubWF0aC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorCisjaW5jbHVkZSAieTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CisKK0RyaXZldHJhaW5BY3Rvcjo6RHJpdmV0cmFpbkFjdG9yKGFjdG9yczo6RHJpdmV0cmFpbkFjdGlvblF1ZXVlR3JvdXAqIHMpCisgICAgOiBhb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0b3JCYXNlPGFjdG9yczo6RHJpdmV0cmFpbkFjdGlvblF1ZXVlR3JvdXA+KHMpIHt9CisKK2Jvb2wgRHJpdmV0cmFpbkFjdG9yOjpSdW5BY3Rpb24oY29uc3QgYWN0b3JzOjpEcml2ZXRyYWluQWN0aW9uUGFyYW1zICZwYXJhbXMpIHsKKyAgc3RhdGljIGNvbnN0IGF1dG8gSyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCkubWFrZV9kcml2ZXRyYWluX2xvb3AoKS5LKCk7CisKKyAgY29uc3QgZG91YmxlIHlvZmZzZXQgPSBwYXJhbXMueV9vZmZzZXQ7CisgIGNvbnN0IGRvdWJsZSB0dXJuX29mZnNldCA9CisgICAgICBwYXJhbXMudGhldGFfb2Zmc2V0ICogY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS50dXJuX3dpZHRoIC8gMi4wOworICBMT0coSU5GTywgIkdvaW5nIHRvIG1vdmUgJWYgYW5kIHR1cm4gJWZcbiIsIHlvZmZzZXQsIHR1cm5fb2Zmc2V0KTsKKworICAvLyBNZWFzdXJlZCBjb252ZXJzaW9uIHRvIGdldCB0aGUgZGlzdGFuY2UgcmlnaHQuCisgIDo6YW9zOjp1dGlsOjpUcmFwZXpvaWRQcm9maWxlIHByb2ZpbGUoOjphb3M6OnRpbWU6OlRpbWU6OkluTVMoNSkpOworICA6OmFvczo6dXRpbDo6VHJhcGV6b2lkUHJvZmlsZSB0dXJuX3Byb2ZpbGUoOjphb3M6OnRpbWU6OlRpbWU6OkluTVMoNSkpOworICBjb25zdCBkb3VibGUgZ29hbF92ZWxvY2l0eSA9IDAuMDsKKyAgY29uc3QgZG91YmxlIGVwc2lsb24gPSAwLjAxOworICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBsZWZ0X2dvYWxfc3RhdGUsIHJpZ2h0X2dvYWxfc3RhdGU7CisKKyAgcHJvZmlsZS5zZXRfbWF4aW11bV9hY2NlbGVyYXRpb24ocGFyYW1zLm1heGltdW1fYWNjZWxlcmF0aW9uKTsKKyAgcHJvZmlsZS5zZXRfbWF4aW11bV92ZWxvY2l0eShwYXJhbXMubWF4aW11bV92ZWxvY2l0eSk7CisgIHR1cm5fcHJvZmlsZS5zZXRfbWF4aW11bV9hY2NlbGVyYXRpb24ocGFyYW1zLm1heGltdW1fdHVybl9hY2NlbGVyYXRpb24gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkudHVybl93aWR0aCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wKTsKKyAgdHVybl9wcm9maWxlLnNldF9tYXhpbXVtX3ZlbG9jaXR5KHBhcmFtcy5tYXhpbXVtX3R1cm5fdmVsb2NpdHkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS50dXJuX3dpZHRoIC8gMi4wKTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKDEwLCA1MDAwKTsKKworICAgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgICAgaWYgKGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLmdldCgpKSB7CisgICAgICBjb25zdCBhdXRvJiBzdGF0dXMgPSAqY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXM7CisgICAgICBpZiAoOjpzdGQ6OmFicyhzdGF0dXMudW5jYXBwZWRfbGVmdF92b2x0YWdlIC0KKyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy51bmNhcHBlZF9yaWdodF92b2x0YWdlKSA+IDI0KSB7CisgICAgICAgIExPRyhERUJVRywgInNwaW5uaW5nIGluIHBsYWNlXG4iKTsKKyAgICAgICAgLy8gVGhleSdyZSBtb3JlIHRoYW4gMjRWIGFwYXJ0LCBzbyBzdG9wIG1vdmluZyBmb3J3YXJkcyBhbmQgbGV0IGl0IGRlYWwKKyAgICAgICAgLy8gd2l0aCBzcGlubmluZyBmaXJzdC4KKyAgICAgICAgcHJvZmlsZS5TZXRHb2FsKAorICAgICAgICAgICAgKHN0YXR1cy5maWx0ZXJlZF9sZWZ0X3Bvc2l0aW9uICsgc3RhdHVzLmZpbHRlcmVkX3JpZ2h0X3Bvc2l0aW9uIC0KKyAgICAgICAgICAgICBwYXJhbXMubGVmdF9pbml0aWFsX3Bvc2l0aW9uIC0gcGFyYW1zLnJpZ2h0X2luaXRpYWxfcG9zaXRpb24pIC8KKyAgICAgICAgICAgIDIuMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIGRpdmlzb3IgPSBLKDAsIDApICsgSygwLCAyKTsKKyAgICAgICAgZG91YmxlIGR4X2xlZnQsIGR4X3JpZ2h0OworICAgICAgICBpZiAoc3RhdHVzLnVuY2FwcGVkX2xlZnRfdm9sdGFnZSA+IDEyLjApIHsKKyAgICAgICAgICBkeF9sZWZ0ID0gKHN0YXR1cy51bmNhcHBlZF9sZWZ0X3ZvbHRhZ2UgLSAxMi4wKSAvIGRpdmlzb3I7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLnVuY2FwcGVkX2xlZnRfdm9sdGFnZSA8IC0xMi4wKSB7CisgICAgICAgICAgZHhfbGVmdCA9IChzdGF0dXMudW5jYXBwZWRfbGVmdF92b2x0YWdlICsgMTIuMCkgLyBkaXZpc29yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGR4X2xlZnQgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMudW5jYXBwZWRfcmlnaHRfdm9sdGFnZSA+IDEyLjApIHsKKyAgICAgICAgICBkeF9yaWdodCA9IChzdGF0dXMudW5jYXBwZWRfcmlnaHRfdm9sdGFnZSAtIDEyLjApIC8gZGl2aXNvcjsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMudW5jYXBwZWRfcmlnaHRfdm9sdGFnZSA8IC0xMi4wKSB7CisgICAgICAgICAgZHhfcmlnaHQgPSAoc3RhdHVzLnVuY2FwcGVkX3JpZ2h0X3ZvbHRhZ2UgKyAxMi4wKSAvIGRpdmlzb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZHhfcmlnaHQgPSAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBkeDsKKyAgICAgICAgaWYgKGR4X2xlZnQgPT0gMCAmJiBkeF9yaWdodCA9PSAwKSB7CisgICAgICAgICAgZHggPSAwOworICAgICAgICB9IGVsc2UgaWYgKGR4X2xlZnQgIT0gMCAmJiBkeF9yaWdodCAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgOjphb3M6OnNpZ24oZHhfbGVmdCkgIT0gOjphb3M6OnNpZ24oZHhfcmlnaHQpKSB7CisgICAgICAgICAgLy8gQm90aCBzYXR1cmF0aW5nIGluIG9wcG9zaXRlIGRpcmVjdGlvbnMuIERvbid0IGRvIGFueXRoaW5nLgorICAgICAgICAgIExPRyhERUJVRywgIlNhdHVyYXRpbmcgb3Bwb3NpdGUgd2F5cywgbm90IGFkanVzdGluZ1xuIik7CisgICAgICAgICAgZHggPSAwOworICAgICAgICB9IGVsc2UgaWYgKDo6c3RkOjphYnMoZHhfbGVmdCkgPiA6OnN0ZDo6YWJzKGR4X3JpZ2h0KSkgeworICAgICAgICAgIGR4ID0gZHhfbGVmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkeCA9IGR4X3JpZ2h0OworICAgICAgICB9CisgICAgICAgIGlmIChkeCAhPSAwKSB7CisgICAgICAgICAgTE9HKERFQlVHLCAiYWRqdXN0aW5nIGdvYWwgYnkgJWZcbiIsIGR4KTsKKyAgICAgICAgICBwcm9maWxlLk1vdmVHb2FsKC1keCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgd2UgZXZlciBnZXQgaGVyZSwgdGhhdCdzIGJhZCBhbmQgd2Ugc2hvdWxkIGp1c3QgZ2l2ZSB1cAorICAgICAgTE9HKEVSUk9SLCAibm8gZHJpdmV0cmFpbiBzdGF0dXMhXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIGRyaXZlX3Byb2ZpbGVfZ29hbF9zdGF0ZSA9CisgICAgICAgIHByb2ZpbGUuVXBkYXRlKHlvZmZzZXQsIGdvYWxfdmVsb2NpdHkpOworICAgIGNvbnN0IGF1dG8gdHVybl9wcm9maWxlX2dvYWxfc3RhdGUgPSB0dXJuX3Byb2ZpbGUuVXBkYXRlKHR1cm5fb2Zmc2V0LCAwLjApOworICAgIGxlZnRfZ29hbF9zdGF0ZSA9IGRyaXZlX3Byb2ZpbGVfZ29hbF9zdGF0ZSAtIHR1cm5fcHJvZmlsZV9nb2FsX3N0YXRlOworICAgIHJpZ2h0X2dvYWxfc3RhdGUgPSBkcml2ZV9wcm9maWxlX2dvYWxfc3RhdGUgKyB0dXJuX3Byb2ZpbGVfZ29hbF9zdGF0ZTsKKworICAgIGlmICg6OnN0ZDo6YWJzKGRyaXZlX3Byb2ZpbGVfZ29hbF9zdGF0ZSgwLCAwKSAtIHlvZmZzZXQpIDwgZXBzaWxvbiAmJgorICAgICAgICA6OnN0ZDo6YWJzKHR1cm5fcHJvZmlsZV9nb2FsX3N0YXRlKDAsIDApIC0gdHVybl9vZmZzZXQpIDwgZXBzaWxvbikgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKworICAgIExPRyhERUJVRywgIkRyaXZpbmcgbGVmdCB0byAlZiwgcmlnaHQgdG8gJWZcbiIsCisgICAgICAgIGxlZnRfZ29hbF9zdGF0ZSgwLCAwKSArIHBhcmFtcy5sZWZ0X2luaXRpYWxfcG9zaXRpb24sCisgICAgICAgIHJpZ2h0X2dvYWxfc3RhdGUoMCwgMCkgKyBwYXJhbXMucmlnaHRfaW5pdGlhbF9wb3NpdGlvbik7CisgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgIC5jb250cm9sX2xvb3BfZHJpdmluZyh0cnVlKQorICAgICAgICAvLy5oaWdoZ2VhcihmYWxzZSkKKyAgICAgICAgLmxlZnRfZ29hbChsZWZ0X2dvYWxfc3RhdGUoMCwgMCkgKyBwYXJhbXMubGVmdF9pbml0aWFsX3Bvc2l0aW9uKQorICAgICAgICAucmlnaHRfZ29hbChyaWdodF9nb2FsX3N0YXRlKDAsIDApICsgcGFyYW1zLnJpZ2h0X2luaXRpYWxfcG9zaXRpb24pCisgICAgICAgIC5sZWZ0X3ZlbG9jaXR5X2dvYWwobGVmdF9nb2FsX3N0YXRlKDEsIDApKQorICAgICAgICAucmlnaHRfdmVsb2NpdHlfZ29hbChyaWdodF9nb2FsX3N0YXRlKDEsIDApKQorICAgICAgICAuU2VuZCgpOworICB9CisgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIHdoaWxlICghY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMuZ2V0KCkpIHsKKyAgICBMT0coV0FSTklORywKKyAgICAgICAgIk5vIHByZXZpb3VzIGRyaXZldHJhaW4gc3RhdHVzIHBhY2tldCwgdHJ5aW5nIHRvIGZldGNoIGFnYWluXG4iKTsKKyAgICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy5GZXRjaE5leHRCbG9ja2luZygpOworICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworICAgIGNvbnN0IGRvdWJsZSBrUG9zaXRpb25UaHJlc2hvbGQgPSAwLjA1OworCisgICAgY29uc3QgZG91YmxlIGxlZnRfZXJyb3IgPSA6OnN0ZDo6YWJzKAorICAgICAgICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy0+ZmlsdGVyZWRfbGVmdF9wb3NpdGlvbiAtCisgICAgICAgIChsZWZ0X2dvYWxfc3RhdGUoMCwgMCkgKyBwYXJhbXMubGVmdF9pbml0aWFsX3Bvc2l0aW9uKSk7CisgICAgY29uc3QgZG91YmxlIHJpZ2h0X2Vycm9yID0gOjpzdGQ6OmFicygKKyAgICAgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMtPmZpbHRlcmVkX3JpZ2h0X3Bvc2l0aW9uIC0KKyAgICAgICAgKHJpZ2h0X2dvYWxfc3RhdGUoMCwgMCkgKyBwYXJhbXMucmlnaHRfaW5pdGlhbF9wb3NpdGlvbikpOworICAgIGNvbnN0IGRvdWJsZSB2ZWxvY2l0eV9lcnJvciA9CisgICAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMtPnJvYm90X3NwZWVkKTsKKyAgICBpZiAobGVmdF9lcnJvciA8IGtQb3NpdGlvblRocmVzaG9sZCAmJiByaWdodF9lcnJvciA8IGtQb3NpdGlvblRocmVzaG9sZCAmJgorICAgICAgICB2ZWxvY2l0eV9lcnJvciA8IDAuMikgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIExPRyhERUJVRywgIkRyaXZldHJhaW4gZXJyb3IgaXMgJWYsICVmLCAlZlxuIiwgbGVmdF9lcnJvciwgcmlnaHRfZXJyb3IsCisgICAgICAgICAgdmVsb2NpdHlfZXJyb3IpOworICAgIH0KKyAgICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy5GZXRjaE5leHRCbG9ja2luZygpOworICB9CisgIExPRyhJTkZPLCAiRG9uZSBtb3ZpbmdcbiIpOworICByZXR1cm4gdHJ1ZTsKK30KKworOjpzdGQ6OnVuaXF1ZV9wdHI8RHJpdmV0cmFpbkFjdGlvbj4gTWFrZURyaXZldHJhaW5BY3Rpb24oCisgICAgY29uc3QgOjpmcmM5NzE6OmFjdG9yczo6RHJpdmV0cmFpbkFjdGlvblBhcmFtcyYgcGFyYW1zKSB7CisgIHJldHVybiA6OnN0ZDo6dW5pcXVlX3B0cjxEcml2ZXRyYWluQWN0aW9uPigKKyAgICAgIG5ldyBEcml2ZXRyYWluQWN0aW9uKCY6OmZyYzk3MTo6YWN0b3JzOjpkcml2ZXRyYWluX2FjdGlvbiwgcGFyYW1zKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE0L2FjdG9ycy9kcml2ZXRyYWluX2FjdG9yLmggYi95MjAxNC9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzEyMWIKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgWTIwMTRfQUNUSU9OU19EUklWRVRSQUlOX0FDVElPTl9IXworI2RlZmluZSBZMjAxNF9BQ1RJT05TX0RSSVZFVFJBSU5fQUNUSU9OX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5oIgorCisjaW5jbHVkZSAieTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0aW9uLnEuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworY2xhc3MgRHJpdmV0cmFpbkFjdG9yCisgICAgOiBwdWJsaWMgOjphb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0b3JCYXNlPERyaXZldHJhaW5BY3Rpb25RdWV1ZUdyb3VwPiB7CisgcHVibGljOgorICBleHBsaWNpdCBEcml2ZXRyYWluQWN0b3IoRHJpdmV0cmFpbkFjdGlvblF1ZXVlR3JvdXAqIHMpOworCisgIGJvb2wgUnVuQWN0aW9uKGNvbnN0IGFjdG9yczo6RHJpdmV0cmFpbkFjdGlvblBhcmFtcyAmcGFyYW1zKSBvdmVycmlkZTsKK307CisKK3R5cGVkZWYgOjphb3M6OmNvbW1vbjo6YWN0aW9uczo6VHlwZWRBY3Rpb248RHJpdmV0cmFpbkFjdGlvblF1ZXVlR3JvdXA+CisgICAgRHJpdmV0cmFpbkFjdGlvbjsKKworLy8gTWFrZXMgYSBuZXcgRHJpdmV0cmFpbkFjdG9yIGFjdGlvbi4KKzo6c3RkOjp1bmlxdWVfcHRyPERyaXZldHJhaW5BY3Rpb24+IE1ha2VEcml2ZXRyYWluQWN0aW9uKAorICAgIGNvbnN0IDo6ZnJjOTcxOjphY3RvcnM6OkRyaXZldHJhaW5BY3Rpb25QYXJhbXMmIHBhcmFtcyk7CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmCmRpZmYgLS1naXQgYS95MjAxNC9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvcl9tYWluLmNjIGIveTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3JfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzVlNzFjCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3JfbWFpbi5jYwpAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJ5MjAxNC9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rpb24ucS5oIgorI2luY2x1ZGUgInkyMDE0L2FjdG9ycy9kcml2ZXRyYWluX2FjdG9yLmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCitpbnQgbWFpbihpbnQgLyphcmdjKi8sIGNoYXIgKiAvKmFyZ3YqL1tdKSB7CisgIDo6YW9zOjpJbml0KCk7CisKKyAgZnJjOTcxOjphY3RvcnM6OkRyaXZldHJhaW5BY3RvciBkcml2ZXRyYWluKAorICAgICAgJjo6ZnJjOTcxOjphY3RvcnM6OmRyaXZldHJhaW5fYWN0aW9uKTsKKyAgZHJpdmV0cmFpbi5SdW4oKTsKKworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3kyMDE0L2FjdG9ycy9zaG9vdF9hY3Rpb24ucSBiL3kyMDE0L2FjdG9ycy9zaG9vdF9hY3Rpb24ucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzU0NWFhCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvYWN0b3JzL3Nob290X2FjdGlvbi5xCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgZnJjOTcxLmFjdG9yczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5xIjsKKworcXVldWVfZ3JvdXAgU2hvb3RBY3Rpb25RdWV1ZUdyb3VwIHsKKyAgaW1wbGVtZW50cyBmcmM5NzEuYWN0aW9ucy5BY3Rpb25RdWV1ZUdyb3VwOworCisgIHF1ZXVlIGFvcy5jb21tb24uYWN0aW9ucy5Hb2FsIGdvYWw7CisgIHF1ZXVlIGFvcy5jb21tb24uYWN0aW9ucy5TdGF0dXMgc3RhdHVzOworfTsKKworcXVldWVfZ3JvdXAgU2hvb3RBY3Rpb25RdWV1ZUdyb3VwIHNob290X2FjdGlvbjsKZGlmZiAtLWdpdCBhL3kyMDE0L2FjdG9ycy9zaG9vdF9hY3Rvci5jYyBiL3kyMDE0L2FjdG9ycy9zaG9vdF9hY3Rvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGIzNGM0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvYWN0b3JzL3Nob290X2FjdG9yLmNjCkBAIC0wLDAgKzEsMTc4IEBACisjaW5jbHVkZSAieTIwMTQvYWN0b3JzL3Nob290X2FjdG9yLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKworI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLnEuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisjaW5jbHVkZSAieTIwMTQvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBhY3RvcnMgeworbmFtZXNwYWNlIHsKKworYm9vbCBJbnRha2VPZmYoKSB7CisgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5GZXRjaExhdGVzdCgpOworICBpZiAoIWNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5nZXQoKSkgeworICAgIExPRyhXQVJOSU5HLCAibm8gY2xhdyBnb2FsXG4iKTsKKyAgICAvLyBJZiBpdCBkb2Vzbid0IGhhdmUgYSBnb2FsLCB0aGVuIHRoZSBpbnRha2UgaXNuJ3Qgb24gc28gd2UgZG9uJ3QgaGF2ZSB0bworICAgIC8vIHR1cm4gaXQgb2ZmLgorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIGlmICghY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgLmJvdHRvbV9hbmdsZShjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwtPmJvdHRvbV9hbmdsZSkKKyAgICAgICAgICAgICAuc2VwYXJhdGlvbl9hbmdsZShjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwtPnNlcGFyYXRpb25fYW5nbGUpCisgICAgICAgICAgICAgLmludGFrZSgwLjApCisgICAgICAgICAgICAgLmNlbnRlcmluZygwLjApCisgICAgICAgICAgICAgLlNlbmQoKSkgeworICAgICAgTE9HKFdBUk5JTkcsICJzZW5kaW5nIGNsYXcgZ29hbCBmYWlsZWRcbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0ZXhwciBkb3VibGUgU2hvb3RBY3Rvcjo6a09mZnNldFJhZGlhbnM7Citjb25zdGV4cHIgZG91YmxlIFNob290QWN0b3I6OmtDbGF3U2hvb3RpbmdTZXBhcmF0aW9uOworY29uc3RleHByIGRvdWJsZSBTaG9vdEFjdG9yOjprQ2xhd1Nob290aW5nU2VwYXJhdGlvbkdvYWw7CisKK1Nob290QWN0b3I6OlNob290QWN0b3IoYWN0b3JzOjpTaG9vdEFjdGlvblF1ZXVlR3JvdXAqIHMpCisgICAgOiA6OmFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3RvckJhc2U8YWN0b3JzOjpTaG9vdEFjdGlvblF1ZXVlR3JvdXA+KHMpIHt9CisKK2RvdWJsZSBTaG9vdEFjdG9yOjpTcGVlZFRvQW5nbGVPZmZzZXQoZG91YmxlIHNwZWVkKSB7CisgIGNvbnN0IGZyYzk3MTo6Y29uc3RhbnRzOjpWYWx1ZXMmIHZhbHVlcyA9IGZyYzk3MTo6Y29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKyAgLy8gc2NhbGUgc3BlZWQgdG8gYSBbMC4wLTEuMF0gb24gc29tZXRoaW5nIGNsb3NlIHRvIHRoZSBtYXgKKyAgcmV0dXJuIChzcGVlZCAvIHZhbHVlcy5kcml2ZXRyYWluX21heF9zcGVlZCkgKiBrT2Zmc2V0UmFkaWFuczsKK30KKworYm9vbCBTaG9vdEFjdG9yOjpSdW5BY3Rpb24oY29uc3QgZG91YmxlJikgeworICBJbm5lclJ1bkFjdGlvbigpOworCisgIC8vIE5vdyBkbyBvdXIgJ2ZpbmFsbHknIGJsb2NrIGFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBhcmVuJ3QgcmVxdWVzdGluZyBzaG90cworICAvLyBjb250aW51YWxseS4KKyAgY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5nb2FsLkZldGNoTGF0ZXN0KCk7CisgIGlmIChjb250cm9sX2xvb3BzOjpzaG9vdGVyX3F1ZXVlLmdvYWwuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICghY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgIC5zaG90X3Bvd2VyKGNvbnRyb2xfbG9vcHM6OnNob290ZXJfcXVldWUuZ29hbC0+c2hvdF9wb3dlcikKKyAgICAgICAgICAgLnNob3RfcmVxdWVzdGVkKGZhbHNlKQorICAgICAgICAgICAudW5sb2FkX3JlcXVlc3RlZChmYWxzZSkKKyAgICAgICAgICAgLmxvYWRfcmVxdWVzdGVkKGZhbHNlKQorICAgICAgICAgICAuU2VuZCgpKSB7CisgICAgTE9HKFdBUk5JTkcsICJzZW5kaW5nIHNob290ZXIgZ29hbCBmYWlsZWRcbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIExPRyhJTkZPLCAiZmluaXNoZWRcbiIpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaG9vdEFjdG9yOjpJbm5lclJ1bkFjdGlvbigpIHsKKyAgTE9HKElORk8sICJTaG9vdGluZyBhdCB0aGUgY3VycmVudCBhbmdsZSBhbmQgcG93ZXIuXG4iKTsKKworICAvLyB3YWl0IGZvciBjbGF3IHRvIGJlIHJlYWR5CisgIGlmIChXYWl0VW50aWwoOjpzdGQ6OmJpbmQoJlNob290QWN0b3I6OkRvbmVTZXR1cFNob3QsIHRoaXMpKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghSW50YWtlT2ZmKCkpIHJldHVybjsKKworICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHRoZSBsYXRlc3Qgc2hvb3RlciBzdGF0dXMuCisgIGNvbnRyb2xfbG9vcHM6OnNob290ZXJfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIHNob3RzIGZpcmVkIHVwIHRvIHRoaXMgcG9pbnQuIFRoaXMgc2hvdWxkIG5vdCBiZSB1cGRhdGVkCisgIC8vIGFnYWluIGZvciBhbm90aGVyIGZldyBjeWNsZXMuCisgIHByZXZpb3VzX3Nob3RzXyA9IGNvbnRyb2xfbG9vcHM6OnNob290ZXJfcXVldWUuc3RhdHVzLT5zaG90czsKKyAgLy8gU2hvb3QhCisgIGlmICghY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgIC5zaG90X3Bvd2VyKGNvbnRyb2xfbG9vcHM6OnNob290ZXJfcXVldWUuZ29hbC0+c2hvdF9wb3dlcikKKyAgICAgICAgICAgLnNob3RfcmVxdWVzdGVkKHRydWUpCisgICAgICAgICAgIC51bmxvYWRfcmVxdWVzdGVkKGZhbHNlKQorICAgICAgICAgICAubG9hZF9yZXF1ZXN0ZWQoZmFsc2UpCisgICAgICAgICAgIC5TZW5kKCkpIHsKKyAgICBMT0coV0FSTklORywgInNlbmRpbmcgc2hvb3RlciBnb2FsIGZhaWxlZFxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gd2FpdCBmb3IgcmVjb3JkIG9mIHNob3QgaGF2aW5nIGJlZW4gZmlyZWQKKyAgaWYgKFdhaXRVbnRpbCg6OnN0ZDo6YmluZCgmU2hvb3RBY3Rvcjo6RG9uZVNob3QsIHRoaXMpKSkgcmV0dXJuOworCisgIGlmICghSW50YWtlT2ZmKCkpIHJldHVybjsKK30KKworYm9vbCBDbGF3SXNSZWFkeSgpIHsKKyAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5nb2FsLkZldGNoTGF0ZXN0KCk7CisKKyAgYm9vbCBhbnMgPQorICAgICAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPnplcm9lZCAmJgorICAgICAgKDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPmJvdHRvbV92ZWxvY2l0eSkgPCAwLjUpICYmCisgICAgICAoOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+Ym90dG9tIC0KKyAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC0+Ym90dG9tX2FuZ2xlKSA8IDAuMTApICYmCisgICAgICAoOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+c2VwYXJhdGlvbiAtCisgICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwtPnNlcGFyYXRpb25fYW5nbGUpIDwgMC40KTsKKyAgTE9HKERFQlVHLCAiQ2xhdyBpcyAlc3JlYWR5IHplcm9lZCAlZCBib3R0b21fdmVsb2NpdHkgJWYgYm90dG9tICVmIHNlcCAlZlxuIiwKKyAgICAgIGFucyA/ICIiIDogIm5vdCAiLCBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+emVyb2VkLAorICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+Ym90dG9tX3ZlbG9jaXR5KSwKKyAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPmJvdHRvbSAtCisgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC0+Ym90dG9tX2FuZ2xlKSwKKyAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPnNlcGFyYXRpb24gLQorICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwtPnNlcGFyYXRpb25fYW5nbGUpKTsKKyAgcmV0dXJuIGFuczsKK30KKworYm9vbCBTaG9vdGVySXNSZWFkeSgpIHsKKyAgY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5nb2FsLkZldGNoTGF0ZXN0KCk7CisKKyAgTE9HKERFQlVHLCAiUG93ZXIgZXJyb3IgaXMgJWYgLSAlZiAtPiAlZiwgcmVhZHkgJWRcbiIsCisgICAgICBjb250cm9sX2xvb3BzOjpzaG9vdGVyX3F1ZXVlLnN0YXR1cy0+aGFyZF9zdG9wX3Bvd2VyLAorICAgICAgY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5nb2FsLT5zaG90X3Bvd2VyLAorICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpzaG9vdGVyX3F1ZXVlLnN0YXR1cy0+aGFyZF9zdG9wX3Bvd2VyIC0KKyAgICAgICAgICAgICAgICAgY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5nb2FsLT5zaG90X3Bvd2VyKSwKKyAgICAgIGNvbnRyb2xfbG9vcHM6OnNob290ZXJfcXVldWUuc3RhdHVzLT5yZWFkeSk7CisgIHJldHVybiAoOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpzaG9vdGVyX3F1ZXVlLnN0YXR1cy0+aGFyZF9zdG9wX3Bvd2VyIC0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OnNob290ZXJfcXVldWUuZ29hbC0+c2hvdF9wb3dlcikgPCAxLjApICYmCisgICAgICAgICBjb250cm9sX2xvb3BzOjpzaG9vdGVyX3F1ZXVlLnN0YXR1cy0+cmVhZHk7Cit9CisKK2Jvb2wgU2hvb3RBY3Rvcjo6RG9uZVNldHVwU2hvdCgpIHsKKyAgY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5zdGF0dXMuRmV0Y2hBbm90aGVyKCk7CisgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworICAvLyBNYWtlIHN1cmUgdGhhdCBib3RoIHRoZSBzaG9vdGVyIGFuZCBjbGF3IGhhdmUgcmVhY2hlZCB0aGUgbmVjZXNzYXJ5CisgIC8vIHN0YXRlcy4KKyAgaWYgKFNob290ZXJJc1JlYWR5KCkgJiYgQ2xhd0lzUmVhZHkoKSkgeworICAgIExPRyhJTkZPLCAiQ2xhdyBhbmQgU2hvb3RlciByZWFkeSBmb3Igc2hvb3RpbmcuXG4iKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTaG9vdEFjdG9yOjpEb25lUHJlU2hvdE9wZW4oKSB7CisgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworICBpZiAoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPnNlcGFyYXRpb24gPiBrQ2xhd1Nob290aW5nU2VwYXJhdGlvbikgeworICAgIExPRyhJTkZPLCAiT3BlbmVkIHVwIGVub3VnaCB0byBzaG9vdC5cbiIpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTaG9vdEFjdG9yOjpEb25lU2hvdCgpIHsKKyAgY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5zdGF0dXMuRmV0Y2hBbm90aGVyKCk7CisgIGlmIChjb250cm9sX2xvb3BzOjpzaG9vdGVyX3F1ZXVlLnN0YXR1cy0+c2hvdHMgPiBwcmV2aW91c19zaG90c18pIHsKKyAgICBMT0coSU5GTywgIlNob3Qgc3VjY2VlZGVkIVxuIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCis6OnN0ZDo6dW5pcXVlX3B0cjxTaG9vdEFjdGlvbj4gTWFrZVNob290QWN0aW9uKCkgeworICByZXR1cm4gOjpzdGQ6OnVuaXF1ZV9wdHI8U2hvb3RBY3Rpb24+KAorICAgICAgbmV3IFNob290QWN0aW9uKCY6OmZyYzk3MTo6YWN0b3JzOjpzaG9vdF9hY3Rpb24sIDAuMCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNC9hY3RvcnMvc2hvb3RfYWN0b3IuaCBiL3kyMDE0L2FjdG9ycy9zaG9vdF9hY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGZlMzEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9hY3RvcnMvc2hvb3RfYWN0b3IuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIFkyMDE0X0FDVE9SU19TSE9PVF9BQ1RPUl9IXworI2RlZmluZSBZMjAxNF9BQ1RPUlNfU0hPT1RfQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rvci5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmgiCisKKyNpbmNsdWRlICJ5MjAxNC9hY3RvcnMvc2hvb3RfYWN0aW9uLnEuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworY2xhc3MgU2hvb3RBY3RvcgorICAgIDogcHVibGljIDo6YW9zOjpjb21tb246OmFjdGlvbnM6OkFjdG9yQmFzZTxhY3RvcnM6OlNob290QWN0aW9uUXVldWVHcm91cD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2hvb3RBY3RvcihhY3RvcnM6OlNob290QWN0aW9uUXVldWVHcm91cCogcyk7CisKKyAgLy8gQWN0dWFsbHkgZXhlY3V0ZSB0aGUgYWN0aW9uIG9mIG1vdmluZyB0aGUgY2xhdyBhbmQgc2hvb3RlciBpbnRvIHBvc2l0aW9uCisgIC8vIGFuZCBhY3R1YWxseSBmaXJpbmcgdGhlbS4KKyAgYm9vbCBSdW5BY3Rpb24oY29uc3QgZG91YmxlICZwYXJhbXMpIG92ZXJyaWRlOworICB2b2lkIElubmVyUnVuQWN0aW9uKCk7CisKKyAgLy8gY2FsYyBhbiBvZmZzZXQgdG8gb3VyIHJlcXVlc3RlZCBzaG90IGJhc2VkIG9uIHJvYm90IHNwZWVkCisgIGRvdWJsZSBTcGVlZFRvQW5nbGVPZmZzZXQoZG91YmxlIHNwZWVkKTsKKworICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrT2Zmc2V0UmFkaWFucyA9IDAuNDsKKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0NsYXdTaG9vdGluZ1NlcGFyYXRpb24gPSAwLjEwOworICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrQ2xhd1Nob290aW5nU2VwYXJhdGlvbkdvYWwgPSAwLjEwOworCisgcHJvdGVjdGVkOgorICAvLyBjb21wbGV0ZWQgc2hvdAorICBib29sIERvbmVTaG90KCk7CisgIC8vIHJlYWR5IGZvciBzaG90CisgIGJvb2wgRG9uZVByZVNob3RPcGVuKCk7CisgIC8vIGluIHRoZSByaWdodCBwbGFjZQorICBib29sIERvbmVTZXR1cFNob3QoKTsKKworICAvLyB0byB0cmFjayB3aGVuIHNob3QgaXMgY29tcGxldGUKKyAgaW50IHByZXZpb3VzX3Nob3RzXzsKK307CisKK3R5cGVkZWYgOjphb3M6OmNvbW1vbjo6YWN0aW9uczo6VHlwZWRBY3Rpb248YWN0b3JzOjpTaG9vdEFjdGlvblF1ZXVlR3JvdXA+CisgICAgU2hvb3RBY3Rpb247CisKKy8vIE1ha2VzIGEgbmV3IFNob290QWN0b3IgYWN0aW9uLgorOjpzdGQ6OnVuaXF1ZV9wdHI8U2hvb3RBY3Rpb24+IE1ha2VTaG9vdEFjdGlvbigpOworCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTRfQUNUT1JTX1NIT09UX0FDVE9SX0hfCmRpZmYgLS1naXQgYS95MjAxNC9hY3RvcnMvc2hvb3RfYWN0b3JfbWFpbi5jYyBiL3kyMDE0L2FjdG9ycy9zaG9vdF9hY3Rvcl9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYTQzNzcKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9hY3RvcnMvc2hvb3RfYWN0b3JfbWFpbi5jYwpAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJ5MjAxNC9hY3RvcnMvc2hvb3RfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNC9hY3RvcnMvc2hvb3RfYWN0b3IuaCIKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7CisKK2ludCBtYWluKGludCAvKmFyZ2MqLywgY2hhciAqIC8qYXJndiovW10pIHsKKyAgOjphb3M6OkluaXQoKTsKKworICBmcmM5NzE6OmFjdG9yczo6U2hvb3RBY3RvciBzaG9vdCgmOjpmcmM5NzE6OmFjdG9yczo6c2hvb3RfYWN0aW9uKTsKKyAgc2hvb3QuUnVuKCk7CisKKyAgOjphb3M6OkNsZWFudXAoKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3kyMDE0L2F1dG9ub21vdXMvYXV0by5jYyBiL3kyMDE0L2F1dG9ub21vdXMvYXV0by5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjI4MzIzCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvYXV0b25vbW91cy9hdXRvLmNjCkBAIC0wLDAgKzEsNTMwIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC90cmFwZXpvaWRfcHJvZmlsZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5oIgorCisjaW5jbHVkZSAiZnJjOTcxL2F1dG9ub21vdXMvYXV0by5xLmgiCisjaW5jbHVkZSAieTIwMTQvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLnEuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisjaW5jbHVkZSAieTIwMTQvYWN0b3JzL3Nob290X2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTQvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNC9xdWV1ZXMvYXV0b19tb2RlLnEuaCIKKworI2luY2x1ZGUgInkyMDE0L3F1ZXVlcy9ob3RfZ29hbC5xLmgiCisjaW5jbHVkZSAieTIwMTQvcXVldWVzL3Byb2ZpbGVfcGFyYW1zLnEuaCIKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7CisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGF1dG9ub21vdXMgeworCituYW1lc3BhY2UgdGltZSA9IDo6YW9zOjp0aW1lOworCitzdGF0aWMgZG91YmxlIGxlZnRfaW5pdGlhbF9wb3NpdGlvbiwgcmlnaHRfaW5pdGlhbF9wb3NpdGlvbjsKKworYm9vbCBTaG91bGRFeGl0QXV0bygpIHsKKyAgOjpmcmM5NzE6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hMYXRlc3QoKTsKKyAgYm9vbCBhbnMgPSAhOjpmcmM5NzE6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMtPnJ1bl9hdXRvOworICBpZiAoYW5zKSB7CisgICAgTE9HKElORk8sICJUaW1lIHRvIGV4aXQgYXV0byBtb2RlXG4iKTsKKyAgfQorICByZXR1cm4gYW5zOworfQorCit2b2lkIFN0b3BEcml2ZXRyYWluKCkgeworICBMT0coSU5GTywgIlN0b3BwaW5nIHRoZSBkcml2ZXRyYWluXG4iKTsKKyAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuY29udHJvbF9sb29wX2RyaXZpbmcodHJ1ZSkKKyAgICAgIC5sZWZ0X2dvYWwobGVmdF9pbml0aWFsX3Bvc2l0aW9uKQorICAgICAgLmxlZnRfdmVsb2NpdHlfZ29hbCgwKQorICAgICAgLnJpZ2h0X2dvYWwocmlnaHRfaW5pdGlhbF9wb3NpdGlvbikKKyAgICAgIC5yaWdodF92ZWxvY2l0eV9nb2FsKDApCisgICAgICAucXVpY2t0dXJuKGZhbHNlKQorICAgICAgLlNlbmQoKTsKK30KKwordm9pZCBSZXNldERyaXZldHJhaW4oKSB7CisgIExPRyhJTkZPLCAicmVzZXR0aW5nIHRoZSBkcml2ZXRyYWluXG4iKTsKKyAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuY29udHJvbF9sb29wX2RyaXZpbmcoZmFsc2UpCisgICAgICAuaGlnaGdlYXIoZmFsc2UpCisgICAgICAuc3RlZXJpbmcoMC4wKQorICAgICAgLnRocm90dGxlKDAuMCkKKyAgICAgIC5sZWZ0X2dvYWwobGVmdF9pbml0aWFsX3Bvc2l0aW9uKQorICAgICAgLmxlZnRfdmVsb2NpdHlfZ29hbCgwKQorICAgICAgLnJpZ2h0X2dvYWwocmlnaHRfaW5pdGlhbF9wb3NpdGlvbikKKyAgICAgIC5yaWdodF92ZWxvY2l0eV9nb2FsKDApCisgICAgICAuU2VuZCgpOworfQorCit2b2lkIFdhaXRVbnRpbERvbmVPckNhbmNlbGVkKAorICAgIDo6c3RkOjp1bmlxdWVfcHRyPGFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3Rpb24+IGFjdGlvbikgeworICBpZiAoIWFjdGlvbikgeworICAgIExPRyhFUlJPUiwgIk5vIGFjdGlvbiwgbm90IHdhaXRpbmdcbiIpOworICAgIHJldHVybjsKKyAgfQorICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFBvbGwgdGhlIHJ1bm5pbmcgYml0IGFuZCBhdXRvIGRvbmUgYml0cy4KKyAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUygxMCwgNTAwMCk7CisgICAgaWYgKCFhY3Rpb24tPlJ1bm5pbmcoKSB8fCBTaG91bGRFeGl0QXV0bygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3ZvaWQgU3RlcERyaXZlKGRvdWJsZSBkaXN0YW5jZSwgZG91YmxlIHRoZXRhKSB7CisgIGRvdWJsZSBsZWZ0X2dvYWwgPSAobGVmdF9pbml0aWFsX3Bvc2l0aW9uICsgZGlzdGFuY2UgLQorICAgICAgICAgICAgICAgICAgICAgIHRoZXRhICogY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS50dXJuX3dpZHRoIC8gMi4wKTsKKyAgZG91YmxlIHJpZ2h0X2dvYWwgPSAocmlnaHRfaW5pdGlhbF9wb3NpdGlvbiArIGRpc3RhbmNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgdGhldGEgKiBjb25zdGFudHM6OkdldFZhbHVlcygpLnR1cm5fd2lkdGggLyAyLjApOworICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgIC5jb250cm9sX2xvb3BfZHJpdmluZyh0cnVlKQorICAgICAgLmxlZnRfZ29hbChsZWZ0X2dvYWwpCisgICAgICAucmlnaHRfZ29hbChyaWdodF9nb2FsKQorICAgICAgLmxlZnRfdmVsb2NpdHlfZ29hbCgwLjApCisgICAgICAucmlnaHRfdmVsb2NpdHlfZ29hbCgwLjApCisgICAgICAuU2VuZCgpOworICBsZWZ0X2luaXRpYWxfcG9zaXRpb24gPSBsZWZ0X2dvYWw7CisgIHJpZ2h0X2luaXRpYWxfcG9zaXRpb24gPSByaWdodF9nb2FsOworfQorCit2b2lkIFBvc2l0aW9uQ2xhd1ZlcnRpY2FsbHkoZG91YmxlIGludGFrZV9wb3dlciA9IDAuMCwgZG91YmxlIGNlbnRlcmluZ19wb3dlciA9IDAuMCkgeworICBpZiAoIWNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAgICAuYm90dG9tX2FuZ2xlKDAuMCkKKyAgICAgICAgICAgLnNlcGFyYXRpb25fYW5nbGUoMC4wKQorICAgICAgICAgICAuaW50YWtlKGludGFrZV9wb3dlcikKKyAgICAgICAgICAgLmNlbnRlcmluZyhjZW50ZXJpbmdfcG93ZXIpCisgICAgICAgICAgIC5TZW5kKCkpIHsKKyAgICBMT0coV0FSTklORywgInNlbmRpbmcgY2xhdyBnb2FsIGZhaWxlZFxuIik7CisgIH0KK30KKwordm9pZCBQb3NpdGlvbkNsYXdCYWNrSW50YWtlKCkgeworICBpZiAoIWNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAgICAuYm90dG9tX2FuZ2xlKC0yLjI3MzQ3NCkKKyAgICAgICAgICAgLnNlcGFyYXRpb25fYW5nbGUoMC4wKQorICAgICAgICAgICAuaW50YWtlKDEyLjApCisgICAgICAgICAgIC5jZW50ZXJpbmcoMTIuMCkKKyAgICAgICAgICAgLlNlbmQoKSkgeworICAgIExPRyhXQVJOSU5HLCAic2VuZGluZyBjbGF3IGdvYWwgZmFpbGVkXG4iKTsKKyAgfQorfQorCit2b2lkIFBvc2l0aW9uQ2xhd1VwQ2xvc2VkKCkgeworICAvLyBNb3ZlIHRoZSBjbGF3IHRvIHdoZXJlIHdlJ3JlIGdvaW5nIHRvIHNob290IGZyb20gYnV0IGtlZXAgaXQgY2xvc2VkIHVudGlsCisgIC8vIGl0IGdldHMgdGhlcmUuCisgIGlmICghY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgIC5ib3R0b21fYW5nbGUoMC44NikKKyAgICAgICAgICAgLnNlcGFyYXRpb25fYW5nbGUoMC4wKQorICAgICAgICAgICAuaW50YWtlKDQuMCkKKyAgICAgICAgICAgLmNlbnRlcmluZygxLjApCisgICAgICAgICAgIC5TZW5kKCkpIHsKKyAgICBMT0coV0FSTklORywgInNlbmRpbmcgY2xhdyBnb2FsIGZhaWxlZFxuIik7CisgIH0KK30KKwordm9pZCBQb3NpdGlvbkNsYXdGb3JTaG90KCkgeworICBpZiAoIWNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAgICAuYm90dG9tX2FuZ2xlKDAuODYpCisgICAgICAgICAgIC5zZXBhcmF0aW9uX2FuZ2xlKDAuMTApCisgICAgICAgICAgIC5pbnRha2UoNC4wKQorICAgICAgICAgICAuY2VudGVyaW5nKDEuMCkKKyAgICAgICAgICAgLlNlbmQoKSkgeworICAgIExPRyhXQVJOSU5HLCAic2VuZGluZyBjbGF3IGdvYWwgZmFpbGVkXG4iKTsKKyAgfQorfQorCit2b2lkIFNldFNob3RQb3dlcihkb3VibGUgcG93ZXIpIHsKKyAgTE9HKElORk8sICJTZXR0aW5nIHNob3QgcG93ZXIgdG8gJWZcbiIsIHBvd2VyKTsKKyAgaWYgKCFjb250cm9sX2xvb3BzOjpzaG9vdGVyX3F1ZXVlLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgICAgLnNob3RfcG93ZXIocG93ZXIpCisgICAgICAgICAgIC5zaG90X3JlcXVlc3RlZChmYWxzZSkKKyAgICAgICAgICAgLnVubG9hZF9yZXF1ZXN0ZWQoZmFsc2UpCisgICAgICAgICAgIC5sb2FkX3JlcXVlc3RlZChmYWxzZSkKKyAgICAgICAgICAgLlNlbmQoKSkgeworICAgIExPRyhXQVJOSU5HLCAic2VuZGluZyBzaG9vdGVyIGdvYWwgZmFpbGVkXG4iKTsKKyAgfQorfQorCit2b2lkIFdhaXRVbnRpbE5lYXIoZG91YmxlIGRpc3RhbmNlKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy5GZXRjaEFub3RoZXIoKTsKKyAgICBkb3VibGUgbGVmdF9lcnJvciA9IDo6c3RkOjphYnMoCisgICAgICAgIGxlZnRfaW5pdGlhbF9wb3NpdGlvbiAtCisgICAgICAgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLT5maWx0ZXJlZF9sZWZ0X3Bvc2l0aW9uKTsKKyAgICBkb3VibGUgcmlnaHRfZXJyb3IgPSA6OnN0ZDo6YWJzKAorICAgICAgICByaWdodF9pbml0aWFsX3Bvc2l0aW9uIC0KKyAgICAgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMtPmZpbHRlcmVkX3JpZ2h0X3Bvc2l0aW9uKTsKKyAgICBjb25zdCBkb3VibGUga1Bvc2l0aW9uVGhyZXNob2xkID0gMC4wNSArIGRpc3RhbmNlOworICAgIGlmIChyaWdodF9lcnJvciA8IGtQb3NpdGlvblRocmVzaG9sZCAmJiBsZWZ0X2Vycm9yIDwga1Bvc2l0aW9uVGhyZXNob2xkKSB7CisgICAgICBMT0coSU5GTywgIkF0IHRoZSBnb2FsXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKworY29uc3QgUHJvZmlsZVBhcmFtcyBrRmFzdERyaXZlID0gezMuMCwgMi41fTsKK2NvbnN0IFByb2ZpbGVQYXJhbXMga1Nsb3dEcml2ZSA9IHsyLjUsIDIuNX07Citjb25zdCBQcm9maWxlUGFyYW1zIGtGYXN0V2l0aEJhbGxEcml2ZSA9IHszLjAsIDIuMH07Citjb25zdCBQcm9maWxlUGFyYW1zIGtTbG93V2l0aEJhbGxEcml2ZSA9IHsyLjUsIDIuMH07Citjb25zdCBQcm9maWxlUGFyYW1zIGtGYXN0VHVybiA9IHszLjAsIDEwLjB9OworCis6OnN0ZDo6dW5pcXVlX3B0cjw6OmZyYzk3MTo6YWN0b3JzOjpEcml2ZXRyYWluQWN0aW9uPiBTZXREcml2ZUdvYWwoCisgICAgZG91YmxlIGRpc3RhbmNlLCBjb25zdCBQcm9maWxlUGFyYW1zIGRyaXZlX3BhcmFtcywgZG91YmxlIHRoZXRhID0gMCwKKyAgICBjb25zdCBQcm9maWxlUGFyYW1zICZ0dXJuX3BhcmFtcyA9IGtGYXN0VHVybikgeworICBMT0coSU5GTywgIkRyaXZpbmcgdG8gJWZcbiIsIGRpc3RhbmNlKTsKKworICA6OmZyYzk3MTo6YWN0b3JzOjpEcml2ZXRyYWluQWN0aW9uUGFyYW1zIHBhcmFtczsKKyAgcGFyYW1zLmxlZnRfaW5pdGlhbF9wb3NpdGlvbiA9IGxlZnRfaW5pdGlhbF9wb3NpdGlvbjsKKyAgcGFyYW1zLnJpZ2h0X2luaXRpYWxfcG9zaXRpb24gPSByaWdodF9pbml0aWFsX3Bvc2l0aW9uOworICBwYXJhbXMueV9vZmZzZXQgPSBkaXN0YW5jZTsKKyAgcGFyYW1zLnRoZXRhX29mZnNldCA9IHRoZXRhOworICBwYXJhbXMubWF4aW11bV90dXJuX2FjY2VsZXJhdGlvbiA9IHR1cm5fcGFyYW1zLmFjY2VsZXJhdGlvbjsKKyAgcGFyYW1zLm1heGltdW1fdHVybl92ZWxvY2l0eSA9IHR1cm5fcGFyYW1zLnZlbG9jaXR5OworICBwYXJhbXMubWF4aW11bV92ZWxvY2l0eSA9IGRyaXZlX3BhcmFtcy52ZWxvY2l0eTsKKyAgcGFyYW1zLm1heGltdW1fYWNjZWxlcmF0aW9uID0gZHJpdmVfcGFyYW1zLmFjY2VsZXJhdGlvbjsKKyAgYXV0byBkcml2ZXRyYWluX2FjdGlvbiA9IGFjdG9yczo6TWFrZURyaXZldHJhaW5BY3Rpb24ocGFyYW1zKTsKKyAgZHJpdmV0cmFpbl9hY3Rpb24tPlN0YXJ0KCk7CisgIGxlZnRfaW5pdGlhbF9wb3NpdGlvbiArPQorICAgICAgZGlzdGFuY2UgLSB0aGV0YSAqIGNvbnN0YW50czo6R2V0VmFsdWVzKCkudHVybl93aWR0aCAvIDIuMDsKKyAgcmlnaHRfaW5pdGlhbF9wb3NpdGlvbiArPQorICAgICAgZGlzdGFuY2UgKyB0aGV0YSAqIGNvbnN0YW50czo6R2V0VmFsdWVzKCkudHVybl93aWR0aCAvIDIuMDsKKyAgcmV0dXJuIDo6c3RkOjptb3ZlKGRyaXZldHJhaW5fYWN0aW9uKTsKK30KKwordm9pZCBTaG9vdCgpIHsKKyAgLy8gU2hvb3QuCisgIGF1dG8gc2hvb3RfYWN0aW9uID0gYWN0b3JzOjpNYWtlU2hvb3RBY3Rpb24oKTsKKyAgc2hvb3RfYWN0aW9uLT5TdGFydCgpOworICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShzaG9vdF9hY3Rpb24pKTsKK30KKwordm9pZCBJbml0aWFsaXplRW5jb2RlcnMoKSB7CisgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworICBsZWZ0X2luaXRpYWxfcG9zaXRpb24gPQorICAgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMtPmZpbHRlcmVkX2xlZnRfcG9zaXRpb247CisgIHJpZ2h0X2luaXRpYWxfcG9zaXRpb24gPQorICAgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMtPmZpbHRlcmVkX3JpZ2h0X3Bvc2l0aW9uOworfQorCit2b2lkIFdhaXRVbnRpbENsYXdEb25lKCkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFBvbGwgdGhlIHJ1bm5pbmcgYml0IGFuZCBhdXRvIGRvbmUgYml0cy4KKyAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUygxMCwgNTAwMCk7CisgICAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuRmV0Y2hMYXRlc3QoKTsKKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMuZ2V0KCkgPT0gbnVsbHB0ciB8fAorICAgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGJvb2wgYW5zID0KKyAgICAgICAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPnplcm9lZCAmJgorICAgICAgICAoOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+Ym90dG9tX3ZlbG9jaXR5KSA8CisgICAgICAgICAxLjApICYmCisgICAgICAgICg6OnN0ZDo6YWJzKGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLT5ib3R0b20gLQorICAgICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwtPmJvdHRvbV9hbmdsZSkgPAorICAgICAgICAgMC4xMCkgJiYKKyAgICAgICAgKDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPnNlcGFyYXRpb24gLQorICAgICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwtPnNlcGFyYXRpb25fYW5nbGUpIDwKKyAgICAgICAgIDAuNCk7CisgICAgaWYgKGFucykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICB9Cit9CisKK2NsYXNzIEhvdEdvYWxEZWNvZGVyIHsKKyBwdWJsaWM6CisgIEhvdEdvYWxEZWNvZGVyKCkgeworICAgIFJlc2V0Q291bnRzKCk7CisgIH0KKworICB2b2lkIFJlc2V0Q291bnRzKCkgeworICAgIGhvdF9nb2FsLkZldGNoTGF0ZXN0KCk7CisgICAgaWYgKGhvdF9nb2FsLmdldCgpKSB7CisgICAgICBzdGFydF9jb3VudHNfID0gKmhvdF9nb2FsOworICAgICAgTE9HX1NUUlVDVChJTkZPLCAiY291bnRzIHJlc2V0IHRvIiwgc3RhcnRfY291bnRzXyk7CisgICAgICBzdGFydF9jb3VudHNfdmFsaWRfID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgTE9HKFdBUk5JTkcsICJubyBob3QgZ29hbCBtZXNzYWdlLiBpZ25vcmluZ1xuIik7CisgICAgICBzdGFydF9jb3VudHNfdmFsaWRfID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgdm9pZCBVcGRhdGUoYm9vbCBibG9jayA9IGZhbHNlKSB7CisgICAgaWYgKGJsb2NrKSB7CisgICAgICBob3RfZ29hbC5GZXRjaEFub3RoZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgaG90X2dvYWwuRmV0Y2hMYXRlc3QoKTsKKyAgICB9CisgICAgaWYgKGhvdF9nb2FsLmdldCgpKSBMT0dfU1RSVUNUKElORk8sICJuZXcgY291bnRzIiwgKmhvdF9nb2FsKTsKKyAgfQorCisgIGJvb2wgbGVmdF90cmlnZ2VyZWQoKSBjb25zdCB7CisgICAgaWYgKCFzdGFydF9jb3VudHNfdmFsaWRfIHx8ICFob3RfZ29hbC5nZXQoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAoaG90X2dvYWwtPmxlZnRfY291bnQgLSBzdGFydF9jb3VudHNfLmxlZnRfY291bnQpID4ga1RocmVzaG9sZDsKKyAgfQorCisgIGJvb2wgcmlnaHRfdHJpZ2dlcmVkKCkgY29uc3QgeworICAgIGlmICghc3RhcnRfY291bnRzX3ZhbGlkXyB8fCAhaG90X2dvYWwuZ2V0KCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gKGhvdF9nb2FsLT5yaWdodF9jb3VudCAtIHN0YXJ0X2NvdW50c18ucmlnaHRfY291bnQpID4ga1RocmVzaG9sZDsKKyAgfQorCisgIGJvb2wgaXNfbGVmdCgpIGNvbnN0IHsKKyAgICBpZiAoIXN0YXJ0X2NvdW50c192YWxpZF8gfHwgIWhvdF9nb2FsLmdldCgpKSByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgdWludDY0X3QgbGVmdF9kaWZmZXJlbmNlID0KKyAgICAgICAgaG90X2dvYWwtPmxlZnRfY291bnQgLSBzdGFydF9jb3VudHNfLmxlZnRfY291bnQ7CisgICAgY29uc3QgdWludDY0X3QgcmlnaHRfZGlmZmVyZW5jZSA9CisgICAgICAgIGhvdF9nb2FsLT5yaWdodF9jb3VudCAtIHN0YXJ0X2NvdW50c18ucmlnaHRfY291bnQ7CisgICAgaWYgKGxlZnRfZGlmZmVyZW5jZSA+IGtUaHJlc2hvbGQpIHsKKyAgICAgIGlmIChyaWdodF9kaWZmZXJlbmNlID4ga1RocmVzaG9sZCkgeworICAgICAgICAvLyBXZSd2ZSBzZWVuIGEgbG90IG9mIGJvdGgsIHNvIHBpY2sgdGhlIG9uZSB3ZSd2ZSBzZWVuIHRoZSBtb3N0IG9mLgorICAgICAgICByZXR1cm4gbGVmdF9kaWZmZXJlbmNlID4gcmlnaHRfZGlmZmVyZW5jZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlJ3ZlIHNlZW4gZW5vdWdoIGxlZnQgYnV0IG5vdCBlbm91Z2ggcmlnaHQsIHNvIGdvIHdpdGggaXQuCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBoYXZlbid0IHNlZW4gZW5vdWdoIGxlZnQsIHNvIGl0J3Mgbm90IGxlZnQuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgYm9vbCBpc19yaWdodCgpIGNvbnN0IHsKKyAgICBpZiAoIXN0YXJ0X2NvdW50c192YWxpZF8gfHwgIWhvdF9nb2FsLmdldCgpKSByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgdWludDY0X3QgbGVmdF9kaWZmZXJlbmNlID0KKyAgICAgICAgaG90X2dvYWwtPmxlZnRfY291bnQgLSBzdGFydF9jb3VudHNfLmxlZnRfY291bnQ7CisgICAgY29uc3QgdWludDY0X3QgcmlnaHRfZGlmZmVyZW5jZSA9CisgICAgICAgIGhvdF9nb2FsLT5yaWdodF9jb3VudCAtIHN0YXJ0X2NvdW50c18ucmlnaHRfY291bnQ7CisgICAgaWYgKHJpZ2h0X2RpZmZlcmVuY2UgPiBrVGhyZXNob2xkKSB7CisgICAgICBpZiAobGVmdF9kaWZmZXJlbmNlID4ga1RocmVzaG9sZCkgeworICAgICAgICAvLyBXZSd2ZSBzZWVuIGEgbG90IG9mIGJvdGgsIHNvIHBpY2sgdGhlIG9uZSB3ZSd2ZSBzZWVuIHRoZSBtb3N0IG9mLgorICAgICAgICByZXR1cm4gcmlnaHRfZGlmZmVyZW5jZSA+IGxlZnRfZGlmZmVyZW5jZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlJ3ZlIHNlZW4gZW5vdWdoIHJpZ2h0IGJ1dCBub3QgZW5vdWdoIGxlZnQsIHNvIGdvIHdpdGggaXQuCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBoYXZlbid0IHNlZW4gZW5vdWdoIHJpZ2h0LCBzbyBpdCdzIG5vdCByaWdodC4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrVGhyZXNob2xkID0gNTsKKworICA6OmZyYzk3MTo6SG90R29hbCBzdGFydF9jb3VudHNfOworICBib29sIHN0YXJ0X2NvdW50c192YWxpZF87Cit9OworCit2b2lkIEhhbmRsZUF1dG8oKSB7CisgIGVudW0gY2xhc3MgQXV0b1ZlcnNpb24gOiB1aW50OF90IHsKKyAgICBrU3RyYWlnaHQsCisgICAga0RvdWJsZUhvdCwKKyAgICBrU2luZ2xlSG90LAorICB9OworCisgIC8vIFRoZSBmcm9udCBvZiB0aGUgcm9ib3QgaXMgMS44NTQgbWV0ZXJzIGZyb20gdGhlIHdhbGwKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU2hvb3REaXN0YW5jZSA9IDMuMTU7CisgIHN0YXRpYyBjb25zdCBkb3VibGUga1BpY2t1cERpc3RhbmNlID0gMC41OworICBzdGF0aWMgY29uc3QgZG91YmxlIGtUdXJuQW5nbGUgPSAwLjM7CisKKyAgOjphb3M6OnRpbWU6OlRpbWUgc3RhcnRfdGltZSA9IDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKTsKKyAgTE9HKElORk8sICJIYW5kbGluZyBhdXRvIG1vZGVcbiIpOworCisgIEF1dG9WZXJzaW9uIGF1dG9fdmVyc2lvbjsKKyAgOjpmcmM5NzE6OnNlbnNvcnM6OmF1dG9fbW9kZS5GZXRjaExhdGVzdCgpOworICBpZiAoITo6ZnJjOTcxOjpzZW5zb3JzOjphdXRvX21vZGUuZ2V0KCkpIHsKKyAgICBMT0coV0FSTklORywgIm5vdCBzdXJlIHdoaWNoIGF1dG8gbW9kZSB0byB1c2VcbiIpOworICAgIGF1dG9fdmVyc2lvbiA9IEF1dG9WZXJzaW9uOjprU3RyYWlnaHQ7CisgIH0gZWxzZSB7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU2VsZWN0b3JNaW4gPSAwLjIsIGtTZWxlY3Rvck1heCA9IDQuNDsKKworICAgIGNvbnN0IGRvdWJsZSBrU2VsZWN0b3JTdGVwID0gKGtTZWxlY3Rvck1heCAtIGtTZWxlY3Rvck1pbikgLyAzLjA7CisgICAgaWYgKDo6ZnJjOTcxOjpzZW5zb3JzOjphdXRvX21vZGUtPnZvbHRhZ2UgPCBrU2VsZWN0b3JTdGVwICsga1NlbGVjdG9yTWluKSB7CisgICAgICBhdXRvX3ZlcnNpb24gPSBBdXRvVmVyc2lvbjo6a1NpbmdsZUhvdDsKKyAgICB9IGVsc2UgaWYgKDo6ZnJjOTcxOjpzZW5zb3JzOjphdXRvX21vZGUtPnZvbHRhZ2UgPAorICAgICAgICAgICAgICAgMiAqIGtTZWxlY3RvclN0ZXAgKyBrU2VsZWN0b3JNaW4pIHsKKyAgICAgIGF1dG9fdmVyc2lvbiA9IEF1dG9WZXJzaW9uOjprU3RyYWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGF1dG9fdmVyc2lvbiA9IEF1dG9WZXJzaW9uOjprRG91YmxlSG90OworICAgIH0KKyAgfQorICBMT0coSU5GTywgInJ1bm5pbmcgYXV0byAlIiBQUkl1OCAiXG4iLCBzdGF0aWNfY2FzdDx1aW50OF90PihhdXRvX3ZlcnNpb24pKTsKKworICBjb25zdCBQcm9maWxlUGFyYW1zICZkcml2ZV9wYXJhbXMgPQorICAgICAgKGF1dG9fdmVyc2lvbiA9PSBBdXRvVmVyc2lvbjo6a1N0cmFpZ2h0KSA/IGtGYXN0RHJpdmUgOiBrU2xvd0RyaXZlOworICBjb25zdCBQcm9maWxlUGFyYW1zICZkcml2ZV93aXRoX2JhbGxfcGFyYW1zID0KKyAgICAgIChhdXRvX3ZlcnNpb24gPT0gQXV0b1ZlcnNpb246OmtTdHJhaWdodCkgPyBrRmFzdFdpdGhCYWxsRHJpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrU2xvd1dpdGhCYWxsRHJpdmU7CisKKyAgSG90R29hbERlY29kZXIgaG90X2dvYWxfZGVjb2RlcjsKKyAgLy8gVHJ1ZSBmb3IgbGVmdCwgZmFsc2UgZm9yIHJpZ2h0LgorICBib29sIGZpcnN0X3Nob3RfbGVmdCwgc2Vjb25kX3Nob3RfbGVmdF9kZWZhdWx0LCBzZWNvbmRfc2hvdF9sZWZ0OworCisgIFJlc2V0RHJpdmV0cmFpbigpOworCisgIHRpbWU6OlNsZWVwRm9yKHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjEpKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgSW5pdGlhbGl6ZUVuY29kZXJzKCk7CisKKyAgLy8gVHVybiB0aGUgY2xhdyBvbiwga2VlcCBpdCBzdHJhaWdodCB1cCB1bnRpbCB0aGUgYmFsbCBoYXMgYmVlbiBncmFiYmVkLgorICBMT0coSU5GTywgIkNsYXcgZ29pbmcgdXAgYXQgJWZcbiIsCisgICAgICAoOjphb3M6OnRpbWU6OlRpbWU6Ok5vdygpIC0gc3RhcnRfdGltZSkuVG9TZWNvbmRzKCkpOworICBQb3NpdGlvbkNsYXdWZXJ0aWNhbGx5KDEyLjAsIDQuMCk7CisgIFNldFNob3RQb3dlcigxMTUuMCk7CisKKyAgLy8gV2FpdCBmb3IgdGhlIGJhbGwgdG8gZW50ZXIgdGhlIGNsYXcuCisgIHRpbWU6OlNsZWVwRm9yKHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjI1KSk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgIExPRyhJTkZPLCAiUmVhZHlpbmcgY2xhdyBmb3Igc2hvdCBhdCAlZlxuIiwKKyAgICAgICg6OmFvczo6dGltZTo6VGltZTo6Tm93KCkgLSBzdGFydF90aW1lKS5Ub1NlY29uZHMoKSk7CisKKyAgeworICAgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgICAgLy8gRHJpdmUgdG8gdGhlIGdvYWwuCisgICAgYXV0byBkcml2ZXRyYWluX2FjdGlvbiA9IFNldERyaXZlR29hbCgta1Nob290RGlzdGFuY2UsIGRyaXZlX3BhcmFtcyk7CisgICAgdGltZTo6U2xlZXBGb3IodGltZTo6VGltZTo6SW5TZWNvbmRzKDAuNzUpKTsKKyAgICBQb3NpdGlvbkNsYXdGb3JTaG90KCk7CisgICAgTE9HKElORk8sICJXYWl0aW5nIHVudGlsIGRyaXZldHJhaW4gaXMgZmluaXNoZWRcbiIpOworICAgIFdhaXRVbnRpbERvbmVPckNhbmNlbGVkKDo6c3RkOjptb3ZlKGRyaXZldHJhaW5fYWN0aW9uKSk7CisgICAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgfQorCisgIGhvdF9nb2FsX2RlY29kZXIuVXBkYXRlKCk7CisgIGlmIChob3RfZ29hbF9kZWNvZGVyLmlzX2xlZnQoKSkgeworICAgIExPRyhJTkZPLCAiZmlyc3Qgc2hvdCBsZWZ0XG4iKTsKKyAgICBmaXJzdF9zaG90X2xlZnQgPSB0cnVlOworICAgIHNlY29uZF9zaG90X2xlZnRfZGVmYXVsdCA9IGZhbHNlOworICB9IGVsc2UgaWYgKGhvdF9nb2FsX2RlY29kZXIuaXNfcmlnaHQoKSkgeworICAgIExPRyhJTkZPLCAiZmlyc3Qgc2hvdCByaWdodFxuIik7CisgICAgZmlyc3Rfc2hvdF9sZWZ0ID0gZmFsc2U7CisgICAgc2Vjb25kX3Nob3RfbGVmdF9kZWZhdWx0ID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBMT0coSU5GTywgImZpcnN0IHNob3QgZGVmYXVsdGluZyBsZWZ0XG4iKTsKKyAgICBmaXJzdF9zaG90X2xlZnQgPSB0cnVlOworICAgIHNlY29uZF9zaG90X2xlZnRfZGVmYXVsdCA9IHRydWU7CisgIH0KKyAgaWYgKGF1dG9fdmVyc2lvbiA9PSBBdXRvVmVyc2lvbjo6a0RvdWJsZUhvdCkgeworICAgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgICAgYXV0byBkcml2ZXRyYWluX2FjdGlvbiA9IFNldERyaXZlR29hbCgKKyAgICAgICAgMCwgZHJpdmVfd2l0aF9iYWxsX3BhcmFtcywgZmlyc3Rfc2hvdF9sZWZ0ID8ga1R1cm5BbmdsZSA6IC1rVHVybkFuZ2xlKTsKKyAgICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShkcml2ZXRyYWluX2FjdGlvbikpOworICAgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgIH0gZWxzZSBpZiAoYXV0b192ZXJzaW9uID09IEF1dG9WZXJzaW9uOjprU2luZ2xlSG90KSB7CisgICAgZG8geworICAgICAgLy8gVE9ETyhicmlhbnMpOiBXYWl0IGZvciBuZXh0IG1lc3NhZ2Ugd2l0aCB0aW1lb3V0IG9yIHNvbWV0aGluZy4KKyAgICAgIDo6YW9zOjp0aW1lOjpTbGVlcEZvcig6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMDAzKSk7CisgICAgICBob3RfZ29hbF9kZWNvZGVyLlVwZGF0ZShmYWxzZSk7CisgICAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICAgIH0gd2hpbGUgKCFob3RfZ29hbF9kZWNvZGVyLmxlZnRfdHJpZ2dlcmVkKCkgJiYKKyAgICAgICAgICAgICAoOjphb3M6OnRpbWU6OlRpbWU6Ok5vdygpIC0gc3RhcnRfdGltZSkgPAorICAgICAgICAgICAgICAgICA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDkpKTsKKyAgfSBlbHNlIGlmIChhdXRvX3ZlcnNpb24gPT0gQXV0b1ZlcnNpb246OmtTdHJhaWdodCkgeworICAgIHRpbWU6OlNsZWVwRm9yKHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjQpKTsKKyAgfQorCisgIC8vIFNob290LgorICBMT0coSU5GTywgIlNob290aW5nIGF0ICVmXG4iLAorICAgICAgKDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKSAtIHN0YXJ0X3RpbWUpLlRvU2Vjb25kcygpKTsKKyAgU2hvb3QoKTsKKyAgdGltZTo6U2xlZXBGb3IodGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMDUpKTsKKworICBpZiAoYXV0b192ZXJzaW9uID09IEF1dG9WZXJzaW9uOjprRG91YmxlSG90KSB7CisgICAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgICBhdXRvIGRyaXZldHJhaW5fYWN0aW9uID0gU2V0RHJpdmVHb2FsKAorICAgICAgICAwLCBkcml2ZV93aXRoX2JhbGxfcGFyYW1zLCBmaXJzdF9zaG90X2xlZnQgPyAta1R1cm5BbmdsZSA6IGtUdXJuQW5nbGUpOworICAgIFdhaXRVbnRpbERvbmVPckNhbmNlbGVkKDo6c3RkOjptb3ZlKGRyaXZldHJhaW5fYWN0aW9uKSk7CisgICAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgfSBlbHNlIGlmIChhdXRvX3ZlcnNpb24gPT0gQXV0b1ZlcnNpb246OmtTaW5nbGVIb3QpIHsKKyAgICBMT0coSU5GTywgImF1dG8gZG9uZSBhdCAlZlxuIiwKKyAgICAgICAgKDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKSAtIHN0YXJ0X3RpbWUpLlRvU2Vjb25kcygpKTsKKyAgICBQb3NpdGlvbkNsYXdWZXJ0aWNhbGx5KDAuMCwgMC4wKTsKKyAgICByZXR1cm47CisgIH0KKworICB7CisgICAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgICAvLyBJbnRha2UgdGhlIG5ldyBiYWxsLgorICAgIExPRyhJTkZPLCAiQ2xhdyByZWFkeSBmb3IgaW50YWtlIGF0ICVmXG4iLAorICAgICAgICAoOjphb3M6OnRpbWU6OlRpbWU6Ok5vdygpIC0gc3RhcnRfdGltZSkuVG9TZWNvbmRzKCkpOworICAgIFBvc2l0aW9uQ2xhd0JhY2tJbnRha2UoKTsKKyAgICBhdXRvIGRyaXZldHJhaW5fYWN0aW9uID0KKyAgICAgICAgU2V0RHJpdmVHb2FsKGtTaG9vdERpc3RhbmNlICsga1BpY2t1cERpc3RhbmNlLCBkcml2ZV9wYXJhbXMpOworICAgIExPRyhJTkZPLCAiV2FpdGluZyB1bnRpbCBkcml2ZXRyYWluIGlzIGZpbmlzaGVkXG4iKTsKKyAgICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShkcml2ZXRyYWluX2FjdGlvbikpOworICAgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgICAgTE9HKElORk8sICJXYWl0IGZvciB0aGUgY2xhdyBhdCAlZlxuIiwKKyAgICAgICAgKDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKSAtIHN0YXJ0X3RpbWUpLlRvU2Vjb25kcygpKTsKKyAgICBXYWl0VW50aWxDbGF3RG9uZSgpOworICAgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgIH0KKworICAvLyBEcml2ZSBiYWNrLgorICB7CisgICAgTE9HKElORk8sICJEcml2aW5nIGJhY2sgYXQgJWZcbiIsCisgICAgICAgICg6OmFvczo6dGltZTo6VGltZTo6Tm93KCkgLSBzdGFydF90aW1lKS5Ub1NlY29uZHMoKSk7CisgICAgYXV0byBkcml2ZXRyYWluX2FjdGlvbiA9CisgICAgICAgIFNldERyaXZlR29hbCgtKGtTaG9vdERpc3RhbmNlICsga1BpY2t1cERpc3RhbmNlKSwgZHJpdmVfcGFyYW1zKTsKKyAgICB0aW1lOjpTbGVlcEZvcih0aW1lOjpUaW1lOjpJblNlY29uZHMoMC4zKSk7CisgICAgaG90X2dvYWxfZGVjb2Rlci5SZXNldENvdW50cygpOworICAgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgICAgUG9zaXRpb25DbGF3VXBDbG9zZWQoKTsKKyAgICBXYWl0VW50aWxDbGF3RG9uZSgpOworICAgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgICAgUG9zaXRpb25DbGF3Rm9yU2hvdCgpOworICAgIExPRyhJTkZPLCAiV2FpdGluZyB1bnRpbCBkcml2ZXRyYWluIGlzIGZpbmlzaGVkXG4iKTsKKyAgICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShkcml2ZXRyYWluX2FjdGlvbikpOworICAgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgICAgV2FpdFVudGlsQ2xhd0RvbmUoKTsKKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICB9CisKKyAgaG90X2dvYWxfZGVjb2Rlci5VcGRhdGUoKTsKKyAgaWYgKGhvdF9nb2FsX2RlY29kZXIuaXNfbGVmdCgpKSB7CisgICAgTE9HKElORk8sICJzZWNvbmQgc2hvdCBsZWZ0XG4iKTsKKyAgICBzZWNvbmRfc2hvdF9sZWZ0ID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChob3RfZ29hbF9kZWNvZGVyLmlzX3JpZ2h0KCkpIHsKKyAgICBMT0coSU5GTywgInNlY29uZCBzaG90IHJpZ2h0XG4iKTsKKyAgICBzZWNvbmRfc2hvdF9sZWZ0ID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgTE9HKElORk8sICJzZWNvbmQgc2hvdCBkZWZhdWx0aW5nICVzXG4iLAorICAgICAgICBzZWNvbmRfc2hvdF9sZWZ0X2RlZmF1bHQgPyAibGVmdCIgOiAicmlnaHQiKTsKKyAgICBzZWNvbmRfc2hvdF9sZWZ0ID0gc2Vjb25kX3Nob3RfbGVmdF9kZWZhdWx0OworICB9CisgIGlmIChhdXRvX3ZlcnNpb24gPT0gQXV0b1ZlcnNpb246OmtEb3VibGVIb3QpIHsKKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICAgIGF1dG8gZHJpdmV0cmFpbl9hY3Rpb24gPSBTZXREcml2ZUdvYWwoCisgICAgICAgIDAsIGRyaXZlX3BhcmFtcywgc2Vjb25kX3Nob3RfbGVmdCA/IGtUdXJuQW5nbGUgOiAta1R1cm5BbmdsZSk7CisgICAgV2FpdFVudGlsRG9uZU9yQ2FuY2VsZWQoOjpzdGQ6Om1vdmUoZHJpdmV0cmFpbl9hY3Rpb24pKTsKKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICB9IGVsc2UgaWYgKGF1dG9fdmVyc2lvbiA9PSBBdXRvVmVyc2lvbjo6a1N0cmFpZ2h0KSB7CisgICAgdGltZTo6U2xlZXBGb3IodGltZTo6VGltZTo6SW5TZWNvbmRzKDAuNCkpOworICB9CisKKyAgTE9HKElORk8sICJTaG9vdGluZyBhdCAlZlxuIiwKKyAgICAgICg6OmFvczo6dGltZTo6VGltZTo6Tm93KCkgLSBzdGFydF90aW1lKS5Ub1NlY29uZHMoKSk7CisgIC8vIFNob290CisgIFNob290KCk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisKKyAgLy8gR2V0IHJlYWR5IHRvIHplcm8gd2hlbiB3ZSBjb21lIGJhY2sgdXAuCisgIHRpbWU6OlNsZWVwRm9yKHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjA1KSk7CisgIFBvc2l0aW9uQ2xhd1ZlcnRpY2FsbHkoMC4wLCAwLjApOworfQorCit9ICAvLyBuYW1lc3BhY2UgYXV0b25vbW91cworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTQvYXV0b25vbW91cy9hdXRvLmggYi95MjAxNC9hdXRvbm9tb3VzL2F1dG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQ4ODVmCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvYXV0b25vbW91cy9hdXRvLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBZMjAxNF9BVVRPTk9NT1VTX0FVVE9fSF8KKyNkZWZpbmUgWTIwMTRfQVVUT05PTU9VU19BVVRPX0hfCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGF1dG9ub21vdXMgeworCit2b2lkIEhhbmRsZUF1dG8oKTsKKworfSAgLy8gbmFtZXNwYWNlIGF1dG9ub21vdXMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBZMjAxNF9BVVRPTk9NT1VTX0FVVE9fSF8KZGlmZiAtLWdpdCBhL3kyMDE0L2F1dG9ub21vdXMvYXV0b19tYWluLmNjIGIveTIwMTQvYXV0b25vbW91cy9hdXRvX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiYWQyYwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2F1dG9ub21vdXMvYXV0b19tYWluLmNjCkBAIC0wLDAgKzEsNDIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiZnJjOTcxL2F1dG9ub21vdXMvYXV0by5xLmgiCisjaW5jbHVkZSAieTIwMTQvYXV0b25vbW91cy9hdXRvLmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCitpbnQgbWFpbihpbnQgLyphcmdjKi8sIGNoYXIgKiAvKmFyZ3YqL1tdKSB7CisgIDo6YW9zOjpJbml0KCk7CisKKyAgTE9HKElORk8sICJBdXRvIG1haW4gc3RhcnRlZFxuIik7CisgIDo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLkZldGNoTGF0ZXN0KCk7CisgIHdoaWxlICghOjpmcmM5NzE6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuZ2V0KCkpIHsKKyAgICA6OmZyYzk3MTo6YXV0b25vbW91czo6YXV0b25vbW91cy5GZXRjaE5leHRCbG9ja2luZygpOworICAgIExPRyhJTkZPLCAiR290IGFub3RoZXIgYXV0byBwYWNrZXRcbiIpOworICB9CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB3aGlsZSAoITo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLT5ydW5fYXV0bykgeworICAgICAgOjpmcmM5NzE6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICAgIExPRyhJTkZPLCAiR290IGFub3RoZXIgYXV0byBwYWNrZXRcbiIpOworICAgIH0KKyAgICBMT0coSU5GTywgIlN0YXJ0aW5nIGF1dG8gbW9kZVxuIik7CisgICAgOjphb3M6OnRpbWU6OlRpbWUgc3RhcnRfdGltZSA9IDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKTsKKyAgICA6OmZyYzk3MTo6YXV0b25vbW91czo6SGFuZGxlQXV0bygpOworCisgICAgOjphb3M6OnRpbWU6OlRpbWUgZWxhcHNlZF90aW1lID0gOjphb3M6OnRpbWU6OlRpbWU6Ok5vdygpIC0gc3RhcnRfdGltZTsKKyAgICBMT0coSU5GTywgIkF1dG8gbW9kZSBleGl0ZWQgaW4gJWYsIHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC5cbiIsCisgICAgICAgIGVsYXBzZWRfdGltZS5Ub1NlY29uZHMoKSk7CisgICAgd2hpbGUgKDo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLT5ydW5fYXV0bykgeworICAgICAgOjpmcmM5NzE6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICAgIExPRyhJTkZPLCAiR290IGFub3RoZXIgYXV0byBwYWNrZXRcbiIpOworICAgIH0KKyAgICBMT0coSU5GTywgIldhaXRpbmcgZm9yIGF1dG8gdG8gc3RhcnQgYmFjayB1cC5cbiIpOworICB9CisgIDo6YW9zOjpDbGVhbnVwKCk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS95MjAxNC9hdXRvbm9tb3VzL2F1dG9ub21vdXMuZ3lwIGIveTIwMTQvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWZkYWVjCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cApAQCAtMCwwICsxLDQ1IEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdhdXRvX2xpYicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2F1dG8uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cDphdXRvX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXA6ZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlci5neXA6c2hvb3Rlcl9xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNC95MjAxNC5neXA6Y29uc3RhbnRzJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpwaGFzZWRfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dHJhcGV6b2lkX3Byb2ZpbGUnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9hY3RvcnMvYWN0b3JzLmd5cDpzaG9vdF9hY3Rpb25fbGliJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L2FjdG9ycy9hY3RvcnMuZ3lwOmRyaXZldHJhaW5fYWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9xdWV1ZXMvcXVldWVzLmd5cDpob3RfZ29hbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9xdWV1ZXMvcXVldWVzLmd5cDpwcm9maWxlX3BhcmFtcycsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9xdWV1ZXMvcXVldWVzLmd5cDphdXRvX21vZGUnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYXV0bycsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnYXV0b19tYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cDphdXRvX3F1ZXVlJywKKyAgICAgICAgJ2F1dG9fbGliJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnN0YW50cy5jYyBiL3kyMDE0L2NvbnN0YW50cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzEwMWMzCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29uc3RhbnRzLmNjCkBAIC0wLDAgKzEsMjI0IEBACisjaW5jbHVkZSAieTIwMTQvY29uc3RhbnRzLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1hcD4KKworI2lmIF9faGFzX2ZlYXR1cmUoYWRkcmVzc19zYW5pdGl6ZXIpCisjaW5jbHVkZSAic2FuaXRpemVyL2xzYW5faW50ZXJmYWNlLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9vbmNlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9uZXR3b3JrL3RlYW1fbnVtYmVyLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tdXRleC5oIgorCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIgorCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29uc3RhbnRzIHsKK25hbWVzcGFjZSB7CisKK2NvbnN0IHVpbnQxNl90IGtDb21wVGVhbU51bWJlciA9IDk3MTsKK2NvbnN0IHVpbnQxNl90IGtQcmFjdGljZVRlYW1OdW1iZXIgPSA5OTcxOworY29uc3QgdWludDE2X3Qga1JvYm9SaW9UZWFtTnVtYmVyID0gMjU0OworCitjb25zdCBkb3VibGUga0NvbXBEcml2ZXRyYWluRW5jb2RlclJhdGlvID0KKyAgICAoMTguMCAvIDUwLjApIC8qb3V0cHV0IHJlZHVjdGlvbiovICogKDU2LjAgLyAzMC4wKSAvKmVuY29kZXIgZ2VhcnMqLzsKK2NvbnN0IGRvdWJsZSBrQ29tcExvd0dlYXJSYXRpbyA9IDE4LjAgLyA2MC4wICogMTguMCAvIDUwLjA7Citjb25zdCBkb3VibGUga0NvbXBIaWdoR2VhclJhdGlvID0gMjguMCAvIDUwLjAgKiAxOC4wIC8gNTAuMDsKKworY29uc3QgZG91YmxlIGtQcmFjdGljZURyaXZldHJhaW5FbmNvZGVyUmF0aW8gPSBrQ29tcERyaXZldHJhaW5FbmNvZGVyUmF0aW87Citjb25zdCBkb3VibGUga1ByYWN0aWNlTG93R2VhclJhdGlvID0ga0NvbXBMb3dHZWFyUmF0aW87Citjb25zdCBkb3VibGUga1ByYWN0aWNlSGlnaEdlYXJSYXRpbyA9IGtDb21wSGlnaEdlYXJSYXRpbzsKKworY29uc3QgU2hpZnRlckhhbGxFZmZlY3Qga0NvbXBSaWdodERyaXZlU2hpZnRlcns1NTUsIDY1NywgNjYwLCA1NjAsIDAuMiwgMC43fTsKK2NvbnN0IFNoaWZ0ZXJIYWxsRWZmZWN0IGtDb21wTGVmdERyaXZlU2hpZnRlcns1NTUsIDY2MCwgNjQ0LCA1NTIsIDAuMiwgMC43fTsKKworY29uc3QgU2hpZnRlckhhbGxFZmZlY3Qga1ByYWN0aWNlUmlnaHREcml2ZVNoaWZ0ZXJ7Mi45NSwgMy45NSwgMy45NSwgMi45NSwgMC4yLCAwLjd9OworY29uc3QgU2hpZnRlckhhbGxFZmZlY3Qga1ByYWN0aWNlTGVmdERyaXZlU2hpZnRlcnsyLjk1LCA0LjIsIDMuOTUsIDMuMCwgMC4yLCAwLjd9OworCitjb25zdCBkb3VibGUga1JvYm90V2lkdGggPSAyNS4wIC8gMTAwLjAgKiAyLjU0OworCitjb25zdCBkb3VibGUgc2hvb3Rlcl96ZXJvaW5nX3NwZWVkID0gMC4wNTsKK2NvbnN0IGRvdWJsZSBzaG9vdGVyX3VubG9hZF9zcGVlZCA9IDAuMDg7CisKKy8vIFNtYWxsZXIgKG1vcmUgbmVnYXRpdmUpID0gb3BlbmluZy4KK2NvbnN0IGRvdWJsZSBrQ29tcFRvcENsYXdPZmZzZXQgPSAtMC4xMjA7CisKK2NvbnN0IFZhbHVlcyAqRG9HZXRWYWx1ZXNGb3JUZWFtKHVpbnQxNl90IHRlYW0pIHsKKyAgc3dpdGNoICh0ZWFtKSB7CisgICAgY2FzZSAxOiAgLy8gZm9yIHRlc3RzCisgICAgICByZXR1cm4gbmV3IFZhbHVlc3sKKyAgICAgICAgICBrQ29tcERyaXZldHJhaW5FbmNvZGVyUmF0aW8sCisgICAgICAgICAga0NvbXBMb3dHZWFyUmF0aW8sCisgICAgICAgICAga0NvbXBIaWdoR2VhclJhdGlvLAorICAgICAgICAgIGtDb21wTGVmdERyaXZlU2hpZnRlciwKKyAgICAgICAgICBrQ29tcFJpZ2h0RHJpdmVTaGlmdGVyLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIDAuNSwKKyAgICAgICAgICBjb250cm9sX2xvb3BzOjpNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG9vcCwKKyAgICAgICAgICBjb250cm9sX2xvb3BzOjpNYWtlRHJpdmV0cmFpbkxvb3AsCisgICAgICAgICAgMC4wMiwgLy8gZHJpdmV0cmFpbiBkb25lIGRlbHRhCisgICAgICAgICAgNS4wLCAvLyBkcml2ZXRyYWluIG1heCBzcGVlZAorCisgICAgICAgICAgLy8gU2hvb3RlckxpbWl0cworICAgICAgICAgIHstMC4wMDEyNywgMC4yOTgxOTYsIC0wLjAwMTcsIDAuMzA1MDU0LCAwLjAxNDkwOTgsCisgICAgICAgICAgIHstMC4wMDE3NzgsIDAuMDAwNzYyLCAwLCAwfSwKKyAgICAgICAgICAgey0wLjAwMTc3OCwgMC4wMDg5MDYsIDAsIDB9LAorICAgICAgICAgICB7MC4wMDYwOTYsIDAuMDI2NDE2LCAwLCAwfSwKKyAgICAgICAgICAgc2hvb3Rlcl96ZXJvaW5nX3NwZWVkLAorICAgICAgICAgICBzaG9vdGVyX3VubG9hZF9zcGVlZAorICAgICAgICAgIH0sCisgICAgICAgICAgezAuNSwKKyAgICAgICAgICAgMC4xLAorICAgICAgICAgICAwLjEsCisgICAgICAgICAgIDAuMCwKKyAgICAgICAgICAgMS41NywKKyAgICAgICAgICAgMC4wNSwKKyAgICAgICAgICAgMS41LAorICAgICAgICAgICB7MC4wLCAyLjA1LCAwLjAyLCAyLjAyLCB7LTAuMSwgMC4wNSwgLTAuMSwgMC4wNX0sIHsxLjAsIDEuMSwgMS4wLCAxLjF9LCB7Mi4wLCAyLjEsIDIuMCwgMi4xfX0sCisgICAgICAgICAgIHswLjAsIDIuMDUsIDAuMDIsIDIuMDIsIHstMC4xLCAwLjA1LCAtMC4xLCAwLjA1fSwgezEuMCwgMS4xLCAxLjAsIDEuMX0sIHsyLjAsIDIuMSwgMi4wLCAyLjF9fSwKKyAgICAgICAgICAgMC4wMSwgIC8vIGNsYXdfdW5pbXBvcnRhbnRfZXBzaWxvbgorICAgICAgICAgICAwLjksICAgLy8gc3RhcnRfZmluZV90dW5lX3BvcworICAgICAgICAgICA0LjAsCisgICAgICAgICAgfSwKKyAgICAgICAgICB7MC4wNywgMC4xNX0sIC8vIHNob290ZXJfYWN0aW9uCisgICAgICB9OworICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ29tcFRlYW1OdW1iZXI6CisgICAgICByZXR1cm4gbmV3IFZhbHVlc3sKKyAgICAgICAgICBrQ29tcERyaXZldHJhaW5FbmNvZGVyUmF0aW8sCisgICAgICAgICAga0NvbXBMb3dHZWFyUmF0aW8sCisgICAgICAgICAga0NvbXBIaWdoR2VhclJhdGlvLAorICAgICAgICAgIGtDb21wTGVmdERyaXZlU2hpZnRlciwKKyAgICAgICAgICBrQ29tcFJpZ2h0RHJpdmVTaGlmdGVyLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGtSb2JvdFdpZHRoLAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6Ok1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb29wLAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6Ok1ha2VEcml2ZXRyYWluTG9vcCwKKyAgICAgICAgICAwLjAyLCAvLyBkcml2ZXRyYWluIGRvbmUgZGVsdGEKKyAgICAgICAgICA1LjAsIC8vIGRyaXZldHJhaW4gbWF4IHNwZWVkCisKKyAgICAgICAgICAvLyBTaG9vdGVyTGltaXRzCisgICAgICAgICAgey0wLjAwMTA0MSwgMC4yOTYwMTksIC0wLjAwMTQ4OCwgMC4zMDI3MTcsIDAuMDE0OTA5OCwKKyAgICAgICAgICAgey0wLjAwMiwgMC4wMDA0NDYsIC0wLjAwMiwgMC4wMDA0NDZ9LAorICAgICAgICAgICB7LTAuMDAyLCAwLjAwOTA3OCwgLTAuMDAyLCAwLjAwOTA3OH0sCisgICAgICAgICAgIHswLjAwMzg3MCwgMC4wMjYxOTQsIDAuMDAzODY5LCAwLjAyNjM0M30sCisgICAgICAgICAgIHNob290ZXJfemVyb2luZ19zcGVlZCwKKyAgICAgICAgICAgc2hvb3Rlcl91bmxvYWRfc3BlZWQKKyAgICAgICAgICB9LAorICAgICAgICAgIHswLjgwMDAwMCwKKyAgICAgICAgICAgMC40MDAwMDAsCisgICAgICAgICAgIDAuMDAwMDAwLAorICAgICAgICAgICAtMS4yMjA4MjEsCisgICAgICAgICAgIDEuODIyMTQyLAorICAgICAgICAgICAtMC44NDk0ODQsCisgICAgICAgICAgIDEuNDIzMDksCisgICAgICAgICAgIC8vIDAuMDM3MQorICAgICAgICAgICB7LTMuMzI4NCwgMi4wOTE3LCAtMy4xNjYxLCAxLjk1LAorICAgICAgICAgICAgIHstMy40LCAtMy4wMiArIGtDb21wVG9wQ2xhd09mZnNldCwgLTMuNCwgLTIuOTg3NiArIGtDb21wVG9wQ2xhd09mZnNldH0sCisgICAgICAgICAgICAgey0wLjE0MzMgKyBrQ29tcFRvcENsYXdPZmZzZXQsIDAuMDY3MCArIGtDb21wVG9wQ2xhd09mZnNldCwgLTAuMTQ2MCArIGtDb21wVG9wQ2xhd09mZnNldCwgMC4wNjQ4ICsga0NvbXBUb3BDbGF3T2Zmc2V0fSwKKyAgICAgICAgICAgICB7MS45OTUyICsga0NvbXBUb3BDbGF3T2Zmc2V0LCAyLjIsIDEuOTg5OCArIGtDb21wVG9wQ2xhd09mZnNldCwgMi4yfX0sCisgICAgICAgICAgIHstMi40NTM0NjAsIDMuMDgyOTYwLCAtMi40NTM0NjAsIDMuMDgyOTYwLAorICAgICAgICAgICAgIHstMi42LCAtMi4xODU3NTIsIC0yLjYsIC0yLjE4NDg0M30sCisgICAgICAgICAgICAgey0wLjMyMjI0OSwgLTAuMDUzMTc3LCAtMC4zMzIyNDgsIC0wLjA1OTA4Nn0sCisgICAgICAgICAgICAgezIuODkyMDY1LCAzLjIsIDIuODg4NDI5LCAzLjJ9fSwKKyAgICAgICAgICAgMC4wNDAwMDAsICAvLyBjbGF3X3VuaW1wb3J0YW50X2Vwc2lsb24KKyAgICAgICAgICAgLTAuNDAwMDAwLCAgIC8vIHN0YXJ0X2ZpbmVfdHVuZV9wb3MKKyAgICAgICAgICAgNC4wMDAwMDAsCisgICAgICAgICAgfSwKKyAgICAgICAgICAvL1RPRE8oamFtZXMpOiBHZXQgcmVhbGVyIG51bWJlcnMgZm9yIHNob290ZXJfYWN0aW9uLgorICAgICAgICAgIHswLjA3LCAwLjE1fSwgLy8gc2hvb3Rlcl9hY3Rpb24KKyAgICAgIH07CisgICAgICBicmVhazsKKyAgICBjYXNlIGtQcmFjdGljZVRlYW1OdW1iZXI6CisgICAgY2FzZSBrUm9ib1Jpb1RlYW1OdW1iZXI6CisgICAgICByZXR1cm4gbmV3IFZhbHVlc3sKKyAgICAgICAgICBrUHJhY3RpY2VEcml2ZXRyYWluRW5jb2RlclJhdGlvLAorICAgICAgICAgIGtQcmFjdGljZUxvd0dlYXJSYXRpbywKKyAgICAgICAgICBrUHJhY3RpY2VIaWdoR2VhclJhdGlvLAorICAgICAgICAgIGtQcmFjdGljZUxlZnREcml2ZVNoaWZ0ZXIsCisgICAgICAgICAga1ByYWN0aWNlUmlnaHREcml2ZVNoaWZ0ZXIsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAga1JvYm90V2lkdGgsCisgICAgICAgICAgY29udHJvbF9sb29wczo6TWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvb3AsCisgICAgICAgICAgY29udHJvbF9sb29wczo6TWFrZURyaXZldHJhaW5Mb29wLAorICAgICAgICAgIDAuMDIsIC8vIGRyaXZldHJhaW4gZG9uZSBkZWx0YQorICAgICAgICAgIDUuMCwgLy8gZHJpdmV0cmFpbiBtYXggc3BlZWQKKworICAgICAgICAgIC8vIFNob290ZXJMaW1pdHMKKyAgICAgICAgICB7LTAuMDAxMDQyLCAwLjI5NDA4NCwgLTAuMDAxOTM1LCAwLjMwMzQ2MCwgMC4wMTM4NDAxLAorICAgICAgICAgICB7LTAuMDAyLCAwLjAwMDQ0NiwgLTAuMDAyLCAwLjAwMDQ0Nn0sCisgICAgICAgICAgIHstMC4wMDIsIDAuMDA5MDc4LCAtMC4wMDIsIDAuMDA5MDc4fSwKKyAgICAgICAgICAgezAuMDAzODY5LCAwLjAyNjE5NCwgMC4wMDM4NjksIDAuMDI2MTk0fSwKKyAgICAgICAgICAgc2hvb3Rlcl96ZXJvaW5nX3NwZWVkLAorICAgICAgICAgICBzaG9vdGVyX3VubG9hZF9zcGVlZAorICAgICAgICAgIH0sCisgICAgICAgICAgezAuNDAwMDAwICogMi4wLAorICAgICAgICAgIDAuMjAwMDAwICogMi4wLAorICAgICAgICAgIDAuMDAwMDAwICogMi4wLAorICAgICAgICAgIC0wLjc2MjIxOCAqIDIuMCwKKyAgICAgICAgICAxLjc2NzE0NiwKKyAgICAgICAgICAtMC44NDk0ODQsCisgICAgICAgICAgMS40MjMwOCwKKyAgICAgICAgICB7LTMuMzY0NzU4LCAyLjA4NjY2OCwgLTMuMTY2MTM2LCAxLjk1LAorICAgICAgICAgICAgey0xLjcgKiAyLjAsIC0xLjU0NDY2MiAqIDIuMCwgLTEuNyAqIDIuMCwgLTEuNTQ3NjE2ICogMi4wfSwKKyAgICAgICAgICAgIHstMC4xMzAyMTggKiAyLjAsIC0wLjAxOTc3MSAqIDIuMCwgLTAuMTMyMDM2ICogMi4wLCAtMC4wMTg4NjIgKiAyLjB9LAorICAgICAgICAgICAgezEuODcxNjg0LCAyLjIsIDEuODY1MzIsIDIuMn19LAorICAgICAgICAgIHstMi40NTE2NDIsIDMuMTA3NTA0LCAtMi4yNzM0NzQsIDIuNzUwLAorICAgICAgICAgICAgey0yLjYsIC0yLjE3NjY2MiwgLTIuNiwgLTIuMTc2NjYyfSwKKyAgICAgICAgICAgIHstMC4zMTY3OTYsIC0wLjA1NDA4OCwgLTAuMzE5OTc4LCAtMC4wNjI3MjN9LAorICAgICAgICAgICAgezIuODk0NzkyLCAzLjIsIDIuODg3OTc0LCAzLjJ9fSwKKyAgICAgICAgICAwLjA0MDAwMCwgIC8vIGNsYXdfdW5pbXBvcnRhbnRfZXBzaWxvbgorICAgICAgICAgIC0wLjQwMDAwMCwgICAvLyBzdGFydF9maW5lX3R1bmVfcG9zCisgICAgICAgICAgNC4wMDAwMDAsCisgICAgICAgICAgfSwKKyAgICAgICAgICAvL1RPRE8oamFtZXMpOiBHZXQgcmVhbGVyIG51bWJlcnMgZm9yIHNob290ZXJfYWN0aW9uLgorICAgICAgICAgIHswLjA3LCAwLjE1fSwgLy8gc2hvb3Rlcl9hY3Rpb24KKyAgICAgIH07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTE9HKEZBVEFMLCAidW5rbm93biB0ZWFtICMlIiBQUkl1MTYgIlxuIiwgdGVhbSk7CisgIH0KK30KKworY29uc3QgVmFsdWVzICpEb0dldFZhbHVlcygpIHsKKyAgdWludDE2X3QgdGVhbSA9IDo6YW9zOjpuZXR3b3JrOjpHZXRUZWFtTnVtYmVyKCk7CisgIExPRyhJTkZPLCAiY3JlYXRpbmcgYSBDb25zdGFudHMgZm9yIHRlYW0gJSIgUFJJdTE2ICJcbiIsIHRlYW0pOworICByZXR1cm4gRG9HZXRWYWx1ZXNGb3JUZWFtKHRlYW0pOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgVmFsdWVzICZHZXRWYWx1ZXMoKSB7CisgIHN0YXRpYyA6OmFvczo6T25jZTxjb25zdCBWYWx1ZXM+IG9uY2UoRG9HZXRWYWx1ZXMpOworICByZXR1cm4gKm9uY2UuR2V0KCk7Cit9CisKK2NvbnN0IFZhbHVlcyAmR2V0VmFsdWVzRm9yVGVhbSh1aW50MTZfdCB0ZWFtX251bWJlcikgeworICBzdGF0aWMgOjphb3M6Ok11dGV4IG11dGV4OworICA6OmFvczo6TXV0ZXhMb2NrZXIgbG9ja2VyKCZtdXRleCk7CisKKyAgLy8gSU1QT1JUQU5UOiBUaGlzIGRlY2xhcmF0aW9uIGhhcyB0byBzdGF5IGFmdGVyIHRoZSBtdXRleCBpcyBsb2NrZWQgdG8gYXZvaWQKKyAgLy8gcmFjZSBjb25kaXRpb25zLgorICBzdGF0aWMgOjpzdGQ6Om1hcDx1aW50MTZfdCwgY29uc3QgVmFsdWVzICo+IHZhbHVlczsKKworICBpZiAodmFsdWVzLmNvdW50KHRlYW1fbnVtYmVyKSA9PSAwKSB7CisgICAgdmFsdWVzW3RlYW1fbnVtYmVyXSA9IERvR2V0VmFsdWVzRm9yVGVhbSh0ZWFtX251bWJlcik7CisjaWYgX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikKKyAgICBfX2xzYW5faWdub3JlX29iamVjdCh2YWx1ZXNbdGVhbV9udW1iZXJdKTsKKyNlbmRpZgorICB9CisgIHJldHVybiAqdmFsdWVzW3RlYW1fbnVtYmVyXTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnN0YW50cworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTQvY29uc3RhbnRzLmggYi95MjAxNC9jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJhODI2Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29uc3RhbnRzLmgKQEAgLTAsMCArMSwxNDUgQEAKKyNpZm5kZWYgWTIwMTRfQ09OU1RBTlRTX0hfCisjZGVmaW5lIFkyMDE0X0NPTlNUQU5UU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisjaW5jbHVkZSAiZnJjOTcxL3NoaWZ0ZXJfaGFsbF9lZmZlY3QuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29uc3RhbnRzIHsKKworLy8gSGFzIGFsbCBvZiB0aGUgbnVtYmVycyB0aGF0IGNoYW5nZSBmb3IgYm90aCByb2JvdHMgYW5kIG1ha2VzIGl0IGVhc3kgdG8KKy8vIHJldHJpZXZlIHRoZSB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IG9uZS4KKworLy8gRXZlcnl0aGluZyBpcyBpbiBTSSB1bml0cyAodm9sdHMsIHJhZGlhbnMsIG1ldGVycywgc2Vjb25kcywgZXRjKS4KKy8vIFNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSByZWxhdGVkIHRvIHRoZSBjb252ZXJzaW9uIGJldHdlZW4gcmF3IHZhbHVlcworLy8gKGVuY29kZXIgY291bnRzLCB2b2x0YWdlLCBldGMpIHRvIHNjYWxlZCB1bml0cyAocmFkaWFucywgbWV0ZXJzLCBldGMpLgorCisvLyBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBjdXJyZW50IHZhbHVlcyBmb3IgYWxsIG9mIHRoZSB0aGluZ3MgdGhhdCBjaGFuZ2UuCitzdHJ1Y3QgVmFsdWVzIHsKKyAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHJlcHJlc2VudGluZyB0aGUgMiBzaWRlcyBvZiBhIGhhbGwgZWZmZWN0IHNlbnNvciBldGMuCisgIHN0cnVjdCBBbmdsZVBhaXIgeworICAgIC8vIFRoZSBhbmdsZXMgZm9yIGluY3JlYXNpbmcgdmFsdWVzIChwb3NlZGdlIG9uIGxvd2VyLCBuZWdlZGdlIG9uIHVwcGVyKS4KKyAgICBkb3VibGUgbG93ZXJfYW5nbGUsIHVwcGVyX2FuZ2xlOworICAgIC8vIFRoZSBhbmdsZXMgZm9yIGRlY3JlYXNpbmcgdmFsdWVzIChuZWdlZGdlIG9uIGxvd2VyLCBwb3NlZGdlIG9uIHVwcGVyKS4KKyAgICBkb3VibGUgbG93ZXJfZGVjcmVhc2luZ19hbmdsZSwgdXBwZXJfZGVjcmVhc2luZ19hbmdsZTsKKyAgfTsKKworICAvLyBUaGUgcmF0aW8gZnJvbSB0aGUgZW5jb2RlciBzaGFmdCB0byB0aGUgZHJpdmV0cmFpbiB3aGVlbHMuCisgIGRvdWJsZSBkcml2ZXRyYWluX2VuY29kZXJfcmF0aW87CisKKyAgLy8gVGhlIGdlYXIgcmF0aW9zIGZyb20gbW90b3Igc2hhZnRzIHRvIHRoZSBkcml2ZXRyYWluIHdoZWVscyBmb3IgaGlnaCBhbmQgbG93CisgIC8vIGdlYXIuCisgIGRvdWJsZSBsb3dfZ2Vhcl9yYXRpbzsKKyAgZG91YmxlIGhpZ2hfZ2Vhcl9yYXRpbzsKKyAgU2hpZnRlckhhbGxFZmZlY3QgbGVmdF9kcml2ZSwgcmlnaHRfZHJpdmU7CisgIGJvb2wgY2x1dGNoX3RyYW5zbWlzc2lvbjsKKworICBkb3VibGUgdHVybl93aWR0aDsKKworICA6OnN0ZDo6ZnVuY3Rpb248U3RhdGVGZWVkYmFja0xvb3A8MiwgMiwgMj4oKT4gbWFrZV92X2RyaXZldHJhaW5fbG9vcDsKKyAgOjpzdGQ6OmZ1bmN0aW9uPFN0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+KCk+IG1ha2VfZHJpdmV0cmFpbl9sb29wOworCisgIGRvdWJsZSBkcml2ZXRyYWluX2RvbmVfZGlzdGFuY2U7CisgIGRvdWJsZSBkcml2ZXRyYWluX21heF9zcGVlZDsKKworICBzdHJ1Y3QgWmVyb2luZ0NvbnN0YW50cyB7CisgICAgLy8gVGhlIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBtb3ZpbmcgYXZlcmFnZSBmaWx0ZXIuCisgICAgaW50IGF2ZXJhZ2VfZmlsdGVyX3NpemU7CisgICAgLy8gVGhlIGRpZmZlcmVuY2UgaW4gc2NhbGVkIHVuaXRzIGJldHdlZW4gdHdvIGluZGV4IHB1bHNlcy4KKyAgICBkb3VibGUgaW5kZXhfZGlmZmVyZW5jZTsKKyAgICAvLyBUaGUgYWJzb2x1dGUgcG9zaXRpb24gaW4gc2NhbGVkIHVuaXRzIG9mIG9uZSBvZiB0aGUgaW5kZXggcHVsc2VzLgorICAgIGRvdWJsZSBtZWFzdXJlZF9pbmRleF9wb3NpdGlvbjsKKyAgICAvLyBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDEgd2hpY2ggZGV0ZXJtaW5lcyBhIGZyYWN0aW9uIG9mIHRoZSBpbmRleF9kaWZmCisgICAgLy8geW91IHdhbnQgdG8gdXNlLgorICAgIGRvdWJsZSBhbGxvd2FibGVfZW5jb2Rlcl9lcnJvcjsKKyAgfTsKKworICAvLyBEZWZpbmVzIGEgcmFuZ2Ugb2YgbW90aW9uIGZvciBhIHN1YnN5c3RlbS4KKyAgLy8gVGhlc2UgYXJlIGFsbCBhYnNvbHV0ZSBwb3NpdGlvbnMgaW4gc2NhbGVkIHVuaXRzLgorICBzdHJ1Y3QgUmFuZ2UgeworICAgIGRvdWJsZSBsb3dlcl9saW1pdDsKKyAgICBkb3VibGUgdXBwZXJfbGltaXQ7CisgICAgZG91YmxlIGxvd2VyX2hhcmRfbGltaXQ7CisgICAgZG91YmxlIHVwcGVyX2hhcmRfbGltaXQ7CisgIH07CisKKyAgc3RydWN0IFNob290ZXIgeworICAgIGRvdWJsZSBsb3dlcl9saW1pdDsKKyAgICBkb3VibGUgdXBwZXJfbGltaXQ7CisgICAgZG91YmxlIGxvd2VyX2hhcmRfbGltaXQ7CisgICAgZG91YmxlIHVwcGVyX2hhcmRfbGltaXQ7CisgICAgLy8gSWYgdGhlIHBsdW5nZXIgaXMgZnVydGhlciBiYWNrIHRoYW4gdGhpcyBwb3NpdGlvbiwgaXQgaXMgc2FmZSBmb3IgdGhlCisgICAgLy8gbGF0Y2ggdG8gYmUgZG93bi4gIEFueXRoaW5nIGVsc2Ugd291bGQgYmUgY29uc2lkZXJlZCBhIGNvbGxpc2lvbi4KKyAgICBkb3VibGUgbGF0Y2hfbWF4X3NhZmVfcG9zaXRpb247CisgICAgQW5nbGVQYWlyIHBsdW5nZXJfYmFjazsKKyAgICBBbmdsZVBhaXIgcHVzaGVyX2Rpc3RhbDsKKyAgICBBbmdsZVBhaXIgcHVzaGVyX3Byb3hpbWFsOworICAgIGRvdWJsZSB6ZXJvaW5nX3NwZWVkOworICAgIGRvdWJsZSB1bmxvYWRfc3BlZWQ7CisgIH07CisKKyAgU2hvb3RlciBzaG9vdGVyOworCisgIHN0cnVjdCBDbGF3cyB7CisgICAgZG91YmxlIGNsYXdfemVyb2luZ19vZmZfc3BlZWQ7CisgICAgZG91YmxlIGNsYXdfemVyb2luZ19zcGVlZDsKKyAgICBkb3VibGUgY2xhd196ZXJvaW5nX3NlcGFyYXRpb247CisKKyAgICAvLyBjbGF3IHNlcGFyYXRpb24gdGhhdCB3b3VsZCBiZSBjb25zaWRlcmVkIGEgY29sbGlzaW9uCisgICAgZG91YmxlIGNsYXdfbWluX3NlcGFyYXRpb247CisgICAgZG91YmxlIGNsYXdfbWF4X3NlcGFyYXRpb247CisKKyAgICAvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGNsb3Nlci9mYXJ0aGVyIHRoYW4gdGhlc2UuCisgICAgZG91YmxlIHNvZnRfbWluX3NlcGFyYXRpb247CisgICAgZG91YmxlIHNvZnRfbWF4X3NlcGFyYXRpb247CisKKyAgICAvLyBUaHJlZSBoYWxsIGVmZmVjdHMgYXJlIGtub3duIGFzIGZyb250LCBjYWxpYiBhbmQgYmFjaworICAgIHR5cGVkZWYgVmFsdWVzOjpBbmdsZVBhaXIgQW5nbGVQYWlyOworCisgICAgc3RydWN0IENsYXcgeworICAgICAgZG91YmxlIGxvd2VyX2hhcmRfbGltaXQ7CisgICAgICBkb3VibGUgdXBwZXJfaGFyZF9saW1pdDsKKyAgICAgIGRvdWJsZSBsb3dlcl9saW1pdDsKKyAgICAgIGRvdWJsZSB1cHBlcl9saW1pdDsKKyAgICAgIEFuZ2xlUGFpciBmcm9udDsKKyAgICAgIEFuZ2xlUGFpciBjYWxpYnJhdGlvbjsKKyAgICAgIEFuZ2xlUGFpciBiYWNrOworICAgIH07CisKKyAgICBDbGF3IHVwcGVyX2NsYXc7CisgICAgQ2xhdyBsb3dlcl9jbGF3OworCisgICAgZG91YmxlIGNsYXdfdW5pbXBvcnRhbnRfZXBzaWxvbjsKKyAgICBkb3VibGUgc3RhcnRfZmluZV90dW5lX3BvczsKKyAgICBkb3VibGUgbWF4X3plcm9pbmdfdm9sdGFnZTsKKyAgfTsKKyAgQ2xhd3MgY2xhdzsKKworICAvLyBIYXMgYWxsIHRoZSBjb25zdGFudHMgZm9yIHRoZSBTaG9vdEFjdGlvbiBjbGFzcy4KKyAgc3RydWN0IFNob290ZXJBY3Rpb24geworICAgIC8vIE1pbmltdW0gc2VwYXJhdGlvbiByZXF1aXJlZCBiZXR3ZWVuIHRoZSBjbGF3cyBpbiBvcmRlciB0byBiZSBhYmxlIHRvCisgICAgLy8gc2hvb3QuCisgICAgZG91YmxlIGNsYXdfc2hvb3Rpbmdfc2VwYXJhdGlvbjsKKworICAgIC8vIEdvYWwgdG8gc2VuZCB0byB0aGUgY2xhdyB3aGVuIG9wZW5pbmcgaXQgdXAgaW4gcHJlcGFyYXRpb24gZm9yIHNob290aW5nOworICAgIC8vIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBjbGF3X3Nob290aW5nX3NlcGFyYXRpb24gc28gdGhhdCB3ZSBjYW4gc2hvb3QKKyAgICAvLyBwcm9tcHRseS4KKyAgICBkb3VibGUgY2xhd19zZXBhcmF0aW9uX2dvYWw7CisgICB9OworICBTaG9vdGVyQWN0aW9uIHNob290ZXJfYWN0aW9uOworfTsKKworLy8gQ3JlYXRlcyAob25jZSkgYSBWYWx1ZXMgaW5zdGFuY2UgZm9yIDo6YW9zOjpuZXR3b3JrOjpHZXRUZWFtTnVtYmVyKCkgYW5kCisvLyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0LgorY29uc3QgVmFsdWVzICZHZXRWYWx1ZXMoKTsKKworLy8gQ3JlYXRlcyBWYWx1ZXMgaW5zdGFuY2VzIGZvciBlYWNoIHRlYW0gbnVtYmVyIGl0IGlzIGNhbGxlZCB3aXRoIGFuZCByZXR1cm5zCisvLyB0aGVtLgorY29uc3QgVmFsdWVzICZHZXRWYWx1ZXNGb3JUZWFtKHVpbnQxNl90IHRlYW1fbnVtYmVyKTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnN0YW50cworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE0X0NPTlNUQU5UU19IXwpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuY2MgYi95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIyYjFlCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuY2MKQEAgLTAsMCArMSwxMDI0IEBACisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wcy5xLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9tYXRyaXhfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29tbW9ubWF0aC5oIgorCisjaW5jbHVkZSAieTIwMTQvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbW90b3JfcGxhbnQuaCIKKworLy8gWmVyb2luZyBwbGFuLgorLy8gVGhlcmUgYXJlIDIgdHlwZXMgb2YgemVyb3MuICBFbmFibGVkIGFuZCBkaXNhYmxlZCBvbmVzLgorLy8gRGlzYWJsZWQgb25lcyBhcmUgb25seSB2YWxpZCBkdXJpbmcgYXV0byBtb2RlLCBhbmQgY2FuIGJlIHVzZWQgdG8gc3BlZWQgdXAKKy8vIHRoZSBlbmFibGVkIHplcm8gcHJvY2Vzcy4gIFdlIG5lZWQgdG8gcmUtemVybyBkdXJpbmcgdGVsZW9wIGluIGNhc2UgdGhlIGF1dG8KKy8vIHplcm8gd2FzIHBvb3IgYW5kIGNhdXNlcyB1cyB0byBtaXNzIGFsbCBvdXIgc2hvdHMuCisvLworLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHplcm8gbWFudWFsbHkgd2hpbGUgZGlzYWJsZWQgYnkgbW92aW5nIHRoZSBqb2ludCBvdmVyCisvLyB0aGUgemVyb3MuCisvLyBaZXJvIG9uIHRoZSBkb3duIGVkZ2Ugd2hlbiBkaXNhYmxlZCAoZ3Jhdml0eSBpbiB0aGUgZGlyZWN0aW9uIG9mIG1vdGlvbikKKy8vCisvLyBXaGVuIGVuYWJsZWQsIHplcm8gb24gdGhlIHVwIGVkZ2UgKGdyYXZpdHkgb3Bwb3NpbmcgdGhlIGRpcmVjdGlvbiBvZiBtb3Rpb24pCisvLyBUaGUgZW5hYmxlZCBzZXF1ZW5jZSBuZWVkcyB0byB3b3JrIGFzIGZvbGxvd3MuICBXZSBjYW4gY3Jhc2ggdGhlIGNsYXcgaWYgd2UKKy8vIGJyaW5nIHRoZW0gdG9vIGNsb3NlIHRvIGVhY2ggb3RoZXIgb3IgdG9vIGZhciBmcm9tIGVhY2ggb3RoZXIuICBUaGUgb25seSBzYWZlCisvLyB0aGluZyB0byBkbyBpcyB0byBtb3ZlIHRoZW0gaW4gdW5pc29uLgorLy8KKy8vIFN0YXJ0IGJ5IG1vdmluZyB0aGVtIGJvdGggdG93YXJkcyB0aGUgZnJvbnQgb2YgdGhlIGJvdCB0byBlaXRoZXIgZmluZCBlaXRoZXIKKy8vIHRoZSBtaWRkbGUgaGFsbCBlZmZlY3Qgb24gZWl0aGVyIGphdywgb3IgdGhlIGZyb250IGhhbGwgZWZmZWN0IG9uIHRoZSBib3R0b20KKy8vIGphdy4gIEFueSBlZGdlIHRoYXQgaXNuJ3QgdGhlIGRlc2lyZWQgZWRnZSB3aWxsIHByb3ZpZGUgYW4gYXBwcm94aW1hdGUgZWRnZQorLy8gbG9jYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhlIGZpbmUgdHVuaW5nIHN0ZXAuCisvLyBPbmNlIGFuIGVkZ2UgaXMgZm91bmQgb24gdGhlIGZyb250IGNsYXcsIG1vdmUgYmFjayB0aGUgb3RoZXIgd2F5IHdpdGggYm90aAorLy8gY2xhd3MgdW50aWwgYW4gZWRnZSBpcyBmb3VuZCBmb3IgdGhlIG90aGVyIGNsYXcuCisvLyBOb3cgdGhhdCB3ZSBoYXZlIGFuIGFwcHJveGltYXRlIHplcm8sIHdlIGNhbiByb2J1c3RpZnkgdGhlIGxpbWl0cyB0byBrZWVwCisvLyBib3RoIGNsYXdzIHNhZmUuICBUaGVuLCB3ZSBjYW4gbW92ZSBib3RoIGNsYXdzIHRvIGEgcG9zaXRpb24gdGhhdCBpcyB0aGUKKy8vIGNvcnJlY3Qgc2lkZSBvZiB0aGUgemVybyBhbmQgZ28gemVyby4KKworLy8gVmFsaWQgcmVnaW9uIHBsYW4uCisvLyBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFybXMgaGFzIGEgcmFuZ2UsIGFuZCB0aGUgdmFsdWVzIG9mIGVhY2ggYXJtIGhhcyBhCisvLyByYW5nZS4KKy8vIElmIGEgY2xhdyBydW5zIHVwIGFnYWluc3QgYSBzdGF0aWMgbGltaXQsIGRvbid0IGxldCB0aGUgZ29hbCBjaGFuZ2Ugb3V0c2lkZQorLy8gdGhlIGxpbWl0LgorLy8gSWYgYSBjbGF3IHJ1bnMgdXAgYWdhaW5zdCBhIG1vdmFibGUgbGltaXQsIG1vdmUgYm90aCBjbGF3cyBvdXR3YXJkcyB0byBnZXQKKy8vIG91dCBvZiB0aGUgY29uZGl0aW9uLgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBrWmVyb2luZ1ZvbHRhZ2UgPSA0LjA7CitzdGF0aWMgY29uc3QgZG91YmxlIGtNYXhWb2x0YWdlID0gMTIuMDsKK2NvbnN0IGRvdWJsZSBrUmV6ZXJvVGhyZXNob2xkID0gMC4wNzsKKworQ2xhd0xpbWl0ZWRMb29wOjpDbGF3TGltaXRlZExvb3AoU3RhdGVGZWVkYmFja0xvb3A8NCwgMiwgMj4gJiZsb29wKQorICAgIDogU3RhdGVGZWVkYmFja0xvb3A8NCwgMiwgMj4oOjpzdGQ6Om1vdmUobG9vcCkpLAorICAgICAgdW5jYXBwZWRfYXZlcmFnZV92b2x0YWdlXygwLjApLAorICAgICAgaXNfemVyb2luZ18odHJ1ZSksCisgICAgICBVX1BvbHlfKChFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4oKSA8PCAxLCAwLAorICAgICAgICAgICAgICAgLTEsIDAsCisgICAgICAgICAgICAgICAwLCAxLAorICAgICAgICAgICAgICAgMCwgLTEpLmZpbmlzaGVkKCksCisgICAgICAgICAgICAgIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMT4oKSA8PCBrTWF4Vm9sdGFnZSwga01heFZvbHRhZ2UsCisgICAgICAgICAgICAgICBrTWF4Vm9sdGFnZSwga01heFZvbHRhZ2UpLmZpbmlzaGVkKCkpLAorICAgICAgVV9Qb2x5X3plcm9pbmdfKChFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4oKSA8PCAxLCAwLAorICAgICAgICAgICAgICAgLTEsIDAsCisgICAgICAgICAgICAgICAwLCAxLAorICAgICAgICAgICAgICAgMCwgLTEpLmZpbmlzaGVkKCksCisgICAgICAgICAgICAgIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMT4oKSA8PAorICAgICAgICAgICAgICAga1plcm9pbmdWb2x0YWdlLCBrWmVyb2luZ1ZvbHRhZ2UsCisgICAgICAgICAgICAgICBrWmVyb2luZ1ZvbHRhZ2UsIGtaZXJvaW5nVm9sdGFnZSkuZmluaXNoZWQoKSkgeworICA6OmFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwwPjo6SW5pdCgpOworfQorCisvLyBDYXBzIHRoZSB2b2x0YWdlIHByaW9yaXRpemluZyByZWR1Y2luZyB2ZWxvY2l0eSBlcnJvciBvdmVyIHJlZHVjaW5nCisvLyBwb3NpdGlvbmFsIGVycm9yLgorLy8gVXNlcyB0aGUgcG9seXRvcGUgbGliYXJhcmllcyB3aGljaCB3ZSB1c2VkIHRvIGp1c3QgdXNlIGZvciB0aGUgZHJpdmV0cmFpbi4KKy8vIFVzZXMgYSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBtYXhpbXVtIHZvbHRhZ2UgYW5kIHRoZW4gdHJhbnNmb3JtcyBpdCBzdWNoCisvLyB0aGF0IHRoZSBwb2ludHMgcmVwcmVzZW50IGRpZmZlcmVudCBhbW91bnRzIG9mIHBvc2l0aW9uYWwgZXJyb3IgYW5kCisvLyBjb25zdHJhaW5zIHRoZSByZWdpb24gc3VjaCB0aGF0LCBpZiBhdCBhbGwgcG9zc2libGUsIGl0IHdpbGwgbWFpbnRhaW4gaXRzCisvLyBjdXJyZW50IGVmZm9ydHMgdG8gcmVkdWNlIHZlbG9jaXR5IGVycm9yLgordm9pZCBDbGF3TGltaXRlZExvb3A6OkNhcFUoKSB7CisgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPiBlcnJvciA9IFIoKSAtIFhfaGF0KCk7CisKKyAgZG91YmxlIHVfdG9wID0gVSgxLCAwKTsKKyAgZG91YmxlIHVfYm90dG9tID0gVSgwLCAwKTsKKworICB1bmNhcHBlZF9hdmVyYWdlX3ZvbHRhZ2VfID0gKHVfdG9wICsgdV9ib3R0b20pIC8gMjsKKworICBkb3VibGUgbWF4X3ZvbHRhZ2UgPSBpc196ZXJvaW5nXyA/IGtaZXJvaW5nVm9sdGFnZSA6IGtNYXhWb2x0YWdlOworCisgIGlmICg6OnN0ZDo6YWJzKHVfYm90dG9tKSA+IG1heF92b2x0YWdlIHx8IDo6c3RkOjphYnModV90b3ApID4gbWF4X3ZvbHRhZ2UpIHsKKyAgICBMT0dfTUFUUklYKERFQlVHLCAiVSBhdCBzdGFydCIsIFUoKSk7CisgICAgLy8gSCAqIFUgPD0gaworICAgIC8vIFUgPSBVUG9zICsgVVZlbAorICAgIC8vIEggKiAoVVBvcyArIFVWZWwpIDw9IGsKKyAgICAvLyBIICogVVBvcyA8PSBrIC0gSCAqIFVWZWwKKworICAgIC8vIE5vdywgd2UgY2FuIGRvIGEgY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvbiBhbmQgc2F5IHRoZSBmb2xsb3dpbmcuCisKKyAgICAvLyBVUG9zID0gcG9zaXRpb25fSyAqIHBvc2l0aW9uX2Vycm9yCisgICAgLy8gKEggKiBwb3NpdGlvbl9LKSAqIHBvc2l0aW9uX2Vycm9yIDw9IGsgLSBIICogVVZlbAorCisgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IHBvc2l0aW9uX0s7CisgICAgcG9zaXRpb25fSyA8PCBLKDAsIDApLCBLKDAsIDEpLAorICAgICAgICAgICAgICAgICAgSygxLCAwKSwgSygxLCAxKTsKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gdmVsb2NpdHlfSzsKKyAgICB2ZWxvY2l0eV9LIDw8IEsoMCwgMiksIEsoMCwgMyksCisgICAgICAgICAgICAgICAgICBLKDEsIDIpLCBLKDEsIDMpOworCisgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHBvc2l0aW9uX2Vycm9yOworICAgIHBvc2l0aW9uX2Vycm9yIDw8IGVycm9yKDAsIDApLCBlcnJvcigxLCAwKTsKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gdmVsb2NpdHlfZXJyb3I7CisgICAgdmVsb2NpdHlfZXJyb3IgPDwgZXJyb3IoMiwgMCksIGVycm9yKDMsIDApOworICAgIExPR19NQVRSSVgoREVCVUcsICJlcnJvciIsIGVycm9yKTsKKworICAgIGNvbnN0IGF1dG8gJnBvbHkgPSBpc196ZXJvaW5nXyA/IFVfUG9seV96ZXJvaW5nXyA6IFVfUG9seV87CisgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IHBvc19wb2x5X0ggPSBwb2x5LkgoKSAqIHBvc2l0aW9uX0s7CisgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IHBvc19wb2x5X2sgPQorICAgICAgICBwb2x5LmsoKSAtIHBvbHkuSCgpICogdmVsb2NpdHlfSyAqIHZlbG9jaXR5X2Vycm9yOworICAgIGNvbnN0IDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IHBvc19wb2x5KHBvc19wb2x5X0gsIHBvc19wb2x5X2spOworCisgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGFkanVzdGVkX3Bvc19lcnJvcjsKKyAgICB7CisgICAgICBjb25zdCBhdXRvICZQID0gcG9zaXRpb25fZXJyb3I7CisKKyAgICAgIC8vIFRoaXMgbGluZSB3YXMgYXQgNDUgZGVncmVlcyBidXQgaXMgbm93IGF0IHNvbWUgYW5nbGUgc3RlZXBlciB0aGFuIHRoZQorICAgICAgLy8gc3RyYWlnaHQgb25lIGJldHdlZW4gdGhlIHBvaW50cy4KKyAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBhbmdsZV80NTsKKyAgICAgIC8vIElmIHRoZSB0b3AgY2xhdyBpcyBhYm92ZSBpdHMgc29mdCB1cHBlciBsaW1pdCwgbWFrZSB0aGUgbGluZSBhY3R1YWxseQorICAgICAgLy8gNDUgZGVncmVlcyB0byBhdm9pZCBzbWFzaGluZyBpdCBpbnRvIHRoZSBsaW1pdCBpbiBhbiBhdHRlbXB0IHRvIGZpeCB0aGUKKyAgICAgIC8vIHNlcGFyYXRpb24gZXJyb3IgZmFzdGVyIHRoYW4gdGhlIGJvdHRvbSBwb3NpdGlvbiBvbmUuCisgICAgICBpZiAoWF9oYXQoMCwgMCkgKyBYX2hhdCgxLCAwKSA+CisgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbGF3LnVwcGVyX2NsYXcudXBwZXJfbGltaXQpIHsKKyAgICAgICAgYW5nbGVfNDUgPDwgMSwgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZpeGluZyBzZXBhcmF0aW9uIGVycm9yIGhhbGYgYXMgZmFzdCBhcyBwb3NpdGlvbmFsIGVycm9yIHdvcmtzIHdlbGwKKyAgICAgICAgLy8gYmVjYXVzZSBpdCBtZWFucyB0aGV5IGJvdGggY2xvc2UgZXZlbmx5LgorICAgICAgICBhbmdsZV80NSA8PCA6OnN0ZDo6c3FydCgzKSwgMTsKKyAgICAgIH0KKyAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBMNDVfcXVhZHJhbnQ7CisgICAgICBMNDVfcXVhZHJhbnQgPDwgOjphb3M6OnNpZ24oUCgxLCAwKSksIC06OmFvczo6c2lnbihQKDAsIDApKTsKKyAgICAgIGNvbnN0IGF1dG8gTDQ1ID0gTDQ1X3F1YWRyYW50LmN3aXNlUHJvZHVjdChhbmdsZV80NSk7CisgICAgICBjb25zdCBkb3VibGUgdzQ1ID0gMDsKKworICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IExIOworICAgICAgaWYgKDo6c3RkOjphYnMoUCgwLCAwKSkgPiA6OnN0ZDo6YWJzKFAoMSwgMCkpKSB7CisgICAgICAgIExIIDw8IDAsIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBMSCA8PCAxLCAwOworICAgICAgfQorICAgICAgY29uc3QgZG91YmxlIHdoID0gTEguZG90KFApOworCisgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gc3RhbmRhcmQ7CisgICAgICBzdGFuZGFyZCA8PCBMNDUsIExIOworICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFc7CisgICAgICBXIDw8IHc0NSwgd2g7CisgICAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gaW50ZXJzZWN0aW9uID0gc3RhbmRhcmQuaW52ZXJzZSgpICogVzsKKworICAgICAgYm9vbCBpc19pbnNpZGVfaDsKKyAgICAgIGNvbnN0IGF1dG8gYWRqdXN0ZWRfcG9zX2Vycm9yX2ggPQorICAgICAgICAgIERvQ29lcmNlR29hbChwb3NfcG9seSwgTEgsIHdoLCBwb3NpdGlvbl9lcnJvciwgJmlzX2luc2lkZV9oKTsKKyAgICAgIGNvbnN0IGF1dG8gYWRqdXN0ZWRfcG9zX2Vycm9yXzQ1ID0KKyAgICAgICAgICBEb0NvZXJjZUdvYWwocG9zX3BvbHksIEw0NSwgdzQ1LCBpbnRlcnNlY3Rpb24sIG51bGxwdHIpOworICAgICAgaWYgKHBvc19wb2x5LklzSW5zaWRlKGludGVyc2VjdGlvbikpIHsKKyAgICAgICAgYWRqdXN0ZWRfcG9zX2Vycm9yID0gYWRqdXN0ZWRfcG9zX2Vycm9yX2g7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNfaW5zaWRlX2gpIHsKKyAgICAgICAgICBpZiAoYWRqdXN0ZWRfcG9zX2Vycm9yX2gubm9ybSgpID4gYWRqdXN0ZWRfcG9zX2Vycm9yXzQ1Lm5vcm0oKSkgeworICAgICAgICAgICAgYWRqdXN0ZWRfcG9zX2Vycm9yID0gYWRqdXN0ZWRfcG9zX2Vycm9yX2g7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkanVzdGVkX3Bvc19lcnJvciA9IGFkanVzdGVkX3Bvc19lcnJvcl80NTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWRqdXN0ZWRfcG9zX2Vycm9yID0gYWRqdXN0ZWRfcG9zX2Vycm9yXzQ1OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgTE9HX01BVFJJWChERUJVRywgImFkanVzdGVkX3Bvc19lcnJvciIsIGFkanVzdGVkX3Bvc19lcnJvcik7CisgICAgbXV0YWJsZV9VKCkgPSB2ZWxvY2l0eV9LICogdmVsb2NpdHlfZXJyb3IgKyBwb3NpdGlvbl9LICogYWRqdXN0ZWRfcG9zX2Vycm9yOworICAgIExPR19NQVRSSVgoREVCVUcsICJVIGlzIG5vdyIsIFUoKSk7CisKKyAgICB7CisgICAgICBjb25zdCBhdXRvIHZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCkuY2xhdzsKKyAgICAgIGlmICh0b3Bfa25vd25fKSB7CisgICAgICAgIGlmIChYX2hhdCgwLCAwKSArIFhfaGF0KDEsIDApID4gdmFsdWVzLnVwcGVyX2NsYXcudXBwZXJfbGltaXQgJiYgVSgxLCAwKSA+IDApIHsKKyAgICAgICAgICBMT0coV0FSTklORywgInVwcGVyIGNsYXcgdG9vIGhpZ2ggYW5kIG1vdmluZyB1cFxuIik7CisgICAgICAgICAgbXV0YWJsZV9VKDEsIDApID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChYX2hhdCgwLCAwKSArIFhfaGF0KDEsIDApIDwgdmFsdWVzLnVwcGVyX2NsYXcubG93ZXJfbGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICBVKDEsIDApIDwgMCkgeworICAgICAgICAgIExPRyhXQVJOSU5HLCAidXBwZXIgY2xhdyB0b28gbG93IGFuZCBtb3ZpbmcgZG93blxuIik7CisgICAgICAgICAgbXV0YWJsZV9VKDEsIDApID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJvdHRvbV9rbm93bl8pIHsKKyAgICAgICAgaWYgKFhfaGF0KDAsIDApID4gdmFsdWVzLmxvd2VyX2NsYXcudXBwZXJfbGltaXQgJiYgVSgwLCAwKSA+IDApIHsKKyAgICAgICAgICBMT0coV0FSTklORywgImxvd2VyIGNsYXcgdG9vIGhpZ2ggYW5kIG1vdmluZyB1cFxuIik7CisgICAgICAgICAgbXV0YWJsZV9VKDAsIDApID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChYX2hhdCgwLCAwKSA8IHZhbHVlcy5sb3dlcl9jbGF3Lmxvd2VyX2xpbWl0ICYmIFUoMCwgMCkgPCAwKSB7CisgICAgICAgICAgTE9HKFdBUk5JTkcsICJsb3dlciBjbGF3IHRvbyBsb3cgYW5kIG1vdmluZyBkb3duXG4iKTsKKyAgICAgICAgICBtdXRhYmxlX1UoMCwgMCkgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1plcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXdNb3RvciAqbW90b3IpCisgICAgOiBvZmZzZXRfKDAuMCksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIG1vdG9yXyhtb3RvciksCisgICAgICB6ZXJvaW5nX3N0YXRlXyhVTktOT1dOX1BPU0lUSU9OKSwKKyAgICAgIGVuY29kZXJfKDAuMCksCisgICAgICBsYXN0X2VuY29kZXJfKDAuMCkge30KKwordm9pZCBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6U2V0UG9zaXRpb25WYWx1ZXMoY29uc3QgSGFsZkNsYXdQb3NpdGlvbiAmY2xhdykgeworICBmcm9udF8uVXBkYXRlKGNsYXcuZnJvbnQpOworICBjYWxpYnJhdGlvbl8uVXBkYXRlKGNsYXcuY2FsaWJyYXRpb24pOworICBiYWNrXy5VcGRhdGUoY2xhdy5iYWNrKTsKKworICBib29sIGFueV9zZW5zb3JfdHJpZ2dlcmVkID0gYW55X3RyaWdnZXJlZCgpOworICBpZiAoYW55X3NlbnNvcl90cmlnZ2VyZWQgJiYgYW55X3RyaWdnZXJlZF9sYXN0XykgeworICAgIC8vIFdlIGFyZSBzdGlsbCBvbiB0aGUgaGFsbCBlZmZlY3QgYW5kIG5vdGhpbmcgaGFzIGNoYW5nZWQuCisgICAgbWluX2hhbGxfZWZmZWN0X29uX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptaW4obWluX2hhbGxfZWZmZWN0X29uX2FuZ2xlXywgY2xhdy5wb3NpdGlvbik7CisgICAgbWF4X2hhbGxfZWZmZWN0X29uX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptYXgobWF4X2hhbGxfZWZmZWN0X29uX2FuZ2xlXywgY2xhdy5wb3NpdGlvbik7CisgIH0gZWxzZSBpZiAoIWFueV9zZW5zb3JfdHJpZ2dlcmVkICYmICFhbnlfdHJpZ2dlcmVkX2xhc3RfKSB7CisgICAgLy8gV2UgYXJlIHN0aWxsIG9mZiB0aGUgaGFsbCBlZmZlY3QgYW5kIG5vdGhpbmcgaGFzIGNoYW5nZWQuCisgICAgbWluX2hhbGxfZWZmZWN0X29mZl9hbmdsZV8gPQorICAgICAgICA6OnN0ZDo6bWluKG1pbl9oYWxsX2VmZmVjdF9vZmZfYW5nbGVfLCBjbGF3LnBvc2l0aW9uKTsKKyAgICBtYXhfaGFsbF9lZmZlY3Rfb2ZmX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptYXgobWF4X2hhbGxfZWZmZWN0X29mZl9hbmdsZV8sIGNsYXcucG9zaXRpb24pOworICB9CisKKyAgaWYgKGZyb250Xy5pc19wb3NlZGdlKCkpIHsKKyAgICAvLyBTYXcgYSBwb3NlZGdlIG9uIHRoZSBoYWxsIGVmZmVjdC4gIFJlc2V0IHRoZSBsaW1pdHMuCisgICAgbWluX2hhbGxfZWZmZWN0X29uX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptaW4oY2xhdy5mcm9udC5wb3NlZGdlX3ZhbHVlLCBjbGF3LnBvc2l0aW9uKTsKKyAgICBtYXhfaGFsbF9lZmZlY3Rfb25fYW5nbGVfID0KKyAgICAgICAgOjpzdGQ6Om1heChjbGF3LmZyb250LnBvc2VkZ2VfdmFsdWUsIGNsYXcucG9zaXRpb24pOworICB9CisgIGlmIChjYWxpYnJhdGlvbl8uaXNfcG9zZWRnZSgpKSB7CisgICAgLy8gU2F3IGEgcG9zZWRnZSBvbiB0aGUgaGFsbCBlZmZlY3QuICBSZXNldCB0aGUgbGltaXRzLgorICAgIG1pbl9oYWxsX2VmZmVjdF9vbl9hbmdsZV8gPQorICAgICAgICA6OnN0ZDo6bWluKGNsYXcuY2FsaWJyYXRpb24ucG9zZWRnZV92YWx1ZSwgY2xhdy5wb3NpdGlvbik7CisgICAgbWF4X2hhbGxfZWZmZWN0X29uX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptYXgoY2xhdy5jYWxpYnJhdGlvbi5wb3NlZGdlX3ZhbHVlLCBjbGF3LnBvc2l0aW9uKTsKKyAgfQorICBpZiAoYmFja18uaXNfcG9zZWRnZSgpKSB7CisgICAgLy8gU2F3IGEgcG9zZWRnZSBvbiB0aGUgaGFsbCBlZmZlY3QuICBSZXNldCB0aGUgbGltaXRzLgorICAgIG1pbl9oYWxsX2VmZmVjdF9vbl9hbmdsZV8gPQorICAgICAgICA6OnN0ZDo6bWluKGNsYXcuYmFjay5wb3NlZGdlX3ZhbHVlLCBjbGF3LnBvc2l0aW9uKTsKKyAgICBtYXhfaGFsbF9lZmZlY3Rfb25fYW5nbGVfID0KKyAgICAgICAgOjpzdGQ6Om1heChjbGF3LmJhY2sucG9zZWRnZV92YWx1ZSwgY2xhdy5wb3NpdGlvbik7CisgIH0KKworICBpZiAoZnJvbnRfLmlzX25lZ2VkZ2UoKSkgeworICAgIC8vIFNhdyBhIG5lZ2VkZ2Ugb24gdGhlIGhhbGwgZWZmZWN0LiAgUmVzZXQgdGhlIGxpbWl0cy4KKyAgICBtaW5faGFsbF9lZmZlY3Rfb2ZmX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptaW4oY2xhdy5mcm9udC5uZWdlZGdlX3ZhbHVlLCBjbGF3LnBvc2l0aW9uKTsKKyAgICBtYXhfaGFsbF9lZmZlY3Rfb2ZmX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptYXgoY2xhdy5mcm9udC5uZWdlZGdlX3ZhbHVlLCBjbGF3LnBvc2l0aW9uKTsKKyAgfQorICBpZiAoY2FsaWJyYXRpb25fLmlzX25lZ2VkZ2UoKSkgeworICAgIC8vIFNhdyBhIG5lZ2VkZ2Ugb24gdGhlIGhhbGwgZWZmZWN0LiAgUmVzZXQgdGhlIGxpbWl0cy4KKyAgICBtaW5faGFsbF9lZmZlY3Rfb2ZmX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptaW4oY2xhdy5jYWxpYnJhdGlvbi5uZWdlZGdlX3ZhbHVlLCBjbGF3LnBvc2l0aW9uKTsKKyAgICBtYXhfaGFsbF9lZmZlY3Rfb2ZmX2FuZ2xlXyA9CisgICAgICAgIDo6c3RkOjptYXgoY2xhdy5jYWxpYnJhdGlvbi5uZWdlZGdlX3ZhbHVlLCBjbGF3LnBvc2l0aW9uKTsKKyAgfQorICBpZiAoYmFja18uaXNfbmVnZWRnZSgpKSB7CisgICAgLy8gU2F3IGEgbmVnZWRnZSBvbiB0aGUgaGFsbCBlZmZlY3QuICBSZXNldCB0aGUgbGltaXRzLgorICAgIG1pbl9oYWxsX2VmZmVjdF9vZmZfYW5nbGVfID0KKyAgICAgICAgOjpzdGQ6Om1pbihjbGF3LmJhY2submVnZWRnZV92YWx1ZSwgY2xhdy5wb3NpdGlvbik7CisgICAgbWF4X2hhbGxfZWZmZWN0X29mZl9hbmdsZV8gPQorICAgICAgICA6OnN0ZDo6bWF4KGNsYXcuYmFjay5uZWdlZGdlX3ZhbHVlLCBjbGF3LnBvc2l0aW9uKTsKKyAgfQorCisgIGxhc3RfZW5jb2Rlcl8gPSBlbmNvZGVyXzsKKyAgaWYgKGZyb250KCkudmFsdWUoKSB8fCBjYWxpYnJhdGlvbigpLnZhbHVlKCkgfHwgYmFjaygpLnZhbHVlKCkpIHsKKyAgICBsYXN0X29uX2VuY29kZXJfID0gZW5jb2Rlcl87CisgIH0gZWxzZSB7CisgICAgbGFzdF9vZmZfZW5jb2Rlcl8gPSBlbmNvZGVyXzsKKyAgfQorICBlbmNvZGVyXyA9IGNsYXcucG9zaXRpb247CisgIGFueV90cmlnZ2VyZWRfbGFzdF8gPSBhbnlfc2Vuc29yX3RyaWdnZXJlZDsKK30KKwordm9pZCBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6UmVzZXQoY29uc3QgSGFsZkNsYXdQb3NpdGlvbiAmY2xhdykgeworICBzZXRfemVyb2luZ19zdGF0ZShaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6VU5LTk9XTl9QT1NJVElPTik7CisKKyAgZnJvbnRfLlJlc2V0KGNsYXcuZnJvbnQpOworICBjYWxpYnJhdGlvbl8uUmVzZXQoY2xhdy5jYWxpYnJhdGlvbik7CisgIGJhY2tfLlJlc2V0KGNsYXcuYmFjayk7CisgIC8vIGNsb3NlIHVwIHRoZSBtaW4gYW5kIG1heCBlZGdlIHBvc2l0aW9ucyBhcyB0aGV5IGFyZSBubyBsb25nZXIgdmFsaWQgYW5kCisgIC8vIHdpbGwgYmUgZXhwYW5kZWQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMKKyAgbWluX2hhbGxfZWZmZWN0X29uX2FuZ2xlXyA9IGNsYXcucG9zaXRpb247CisgIG1heF9oYWxsX2VmZmVjdF9vbl9hbmdsZV8gPSBjbGF3LnBvc2l0aW9uOworICBtaW5faGFsbF9lZmZlY3Rfb2ZmX2FuZ2xlXyA9IGNsYXcucG9zaXRpb247CisgIG1heF9oYWxsX2VmZmVjdF9vZmZfYW5nbGVfID0gY2xhdy5wb3NpdGlvbjsKKyAgYW55X3RyaWdnZXJlZF9sYXN0XyA9IGFueV90cmlnZ2VyZWQoKTsKK30KKworYm9vbCBUb3BaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6U2V0Q2FsaWJyYXRpb25PbkVkZ2UoCisgICAgY29uc3QgY29uc3RhbnRzOjpWYWx1ZXM6OkNsYXdzOjpDbGF3ICZjbGF3X3ZhbHVlcywKKyAgICBKb2ludFplcm9pbmdTdGF0ZSB6ZXJvaW5nX3N0YXRlKSB7CisgIGRvdWJsZSBlZGdlX2VuY29kZXI7CisgIGRvdWJsZSBlZGdlX2FuZ2xlOworICBpZiAoR2V0UG9zaXRpb25PZkVkZ2UoY2xhd192YWx1ZXMsICZlZGdlX2VuY29kZXIsICZlZGdlX2FuZ2xlKSkgeworICAgIExPRyhJTkZPLCAiQ2FsaWJyYXRpb24gZWRnZSBlZGdlIHNob3VsZCBiZSAlZi5cbiIsIGVkZ2VfYW5nbGUpOworICAgIFNldENhbGlicmF0aW9uKGVkZ2VfZW5jb2RlciwgZWRnZV9hbmdsZSk7CisgICAgc2V0X3plcm9pbmdfc3RhdGUoemVyb2luZ19zdGF0ZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRvcFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpIYW5kbGVDYWxpYnJhdGlvbkVycm9yKAorICAgIGNvbnN0IGNvbnN0YW50czo6VmFsdWVzOjpDbGF3czo6Q2xhdyAmY2xhd192YWx1ZXMpIHsKKyAgZG91YmxlIGVkZ2VfZW5jb2RlcjsKKyAgZG91YmxlIGVkZ2VfYW5nbGU7CisgIGlmIChHZXRQb3NpdGlvbk9mRWRnZShjbGF3X3ZhbHVlcywgJmVkZ2VfZW5jb2RlciwgJmVkZ2VfYW5nbGUpKSB7CisgICAgY29uc3QgZG91YmxlIGNhbGlicmF0aW9uX2Vycm9yID0KKyAgICAgICAgQ29tcHV0ZUNhbGlicmF0aW9uQ2hhbmdlKGVkZ2VfZW5jb2RlciwgZWRnZV9hbmdsZSk7CisgICAgTE9HKElORk8sICJUb3AgY2FsaWJyYXRpb24gZXJyb3IgaXMgJWZcbiIsIGNhbGlicmF0aW9uX2Vycm9yKTsKKyAgICBpZiAoOjpzdGQ6OmFicyhjYWxpYnJhdGlvbl9lcnJvcikgPiBrUmV6ZXJvVGhyZXNob2xkKSB7CisgICAgICBMT0coV0FSTklORywgInJlemVyb2luZyB0b3BcbiIpOworICAgICAgU2V0Q2FsaWJyYXRpb24oZWRnZV9lbmNvZGVyLCBlZGdlX2FuZ2xlKTsKKyAgICAgIHNldF96ZXJvaW5nX3N0YXRlKFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpVTktOT1dOX1BPU0lUSU9OKTsKKyAgICB9CisgIH0KK30KKworCit2b2lkIEJvdHRvbVplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpIYW5kbGVDYWxpYnJhdGlvbkVycm9yKAorICAgIGNvbnN0IGNvbnN0YW50czo6VmFsdWVzOjpDbGF3czo6Q2xhdyAmY2xhd192YWx1ZXMpIHsKKyAgZG91YmxlIGVkZ2VfZW5jb2RlcjsKKyAgZG91YmxlIGVkZ2VfYW5nbGU7CisgIGlmIChHZXRQb3NpdGlvbk9mRWRnZShjbGF3X3ZhbHVlcywgJmVkZ2VfZW5jb2RlciwgJmVkZ2VfYW5nbGUpKSB7CisgICAgY29uc3QgZG91YmxlIGNhbGlicmF0aW9uX2Vycm9yID0KKyAgICAgICAgQ29tcHV0ZUNhbGlicmF0aW9uQ2hhbmdlKGVkZ2VfZW5jb2RlciwgZWRnZV9hbmdsZSk7CisgICAgTE9HKElORk8sICJCb3R0b20gY2FsaWJyYXRpb24gZXJyb3IgaXMgJWZcbiIsIGNhbGlicmF0aW9uX2Vycm9yKTsKKyAgICBpZiAoOjpzdGQ6OmFicyhjYWxpYnJhdGlvbl9lcnJvcikgPiBrUmV6ZXJvVGhyZXNob2xkKSB7CisgICAgICBMT0coV0FSTklORywgInJlemVyb2luZyBib3R0b21cbiIpOworICAgICAgU2V0Q2FsaWJyYXRpb24oZWRnZV9lbmNvZGVyLCBlZGdlX2FuZ2xlKTsKKyAgICAgIHNldF96ZXJvaW5nX3N0YXRlKFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpVTktOT1dOX1BPU0lUSU9OKTsKKyAgICB9CisgIH0KK30KKworYm9vbCBCb3R0b21aZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6U2V0Q2FsaWJyYXRpb25PbkVkZ2UoCisgICAgY29uc3QgY29uc3RhbnRzOjpWYWx1ZXM6OkNsYXdzOjpDbGF3ICZjbGF3X3ZhbHVlcywKKyAgICBKb2ludFplcm9pbmdTdGF0ZSB6ZXJvaW5nX3N0YXRlKSB7CisgIGRvdWJsZSBlZGdlX2VuY29kZXI7CisgIGRvdWJsZSBlZGdlX2FuZ2xlOworICBpZiAoR2V0UG9zaXRpb25PZkVkZ2UoY2xhd192YWx1ZXMsICZlZGdlX2VuY29kZXIsICZlZGdlX2FuZ2xlKSkgeworICAgIExPRyhJTkZPLCAiQ2FsaWJyYXRpb24gZWRnZS5cbiIpOworICAgIFNldENhbGlicmF0aW9uKGVkZ2VfZW5jb2RlciwgZWRnZV9hbmdsZSk7CisgICAgc2V0X3plcm9pbmdfc3RhdGUoemVyb2luZ19zdGF0ZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitDbGF3TW90b3I6OkNsYXdNb3Rvcihjb250cm9sX2xvb3BzOjpDbGF3UXVldWUgKm15X2NsYXcpCisgICAgOiBhb3M6OmNvbnRyb2xzOjpDb250cm9sTG9vcDxjb250cm9sX2xvb3BzOjpDbGF3UXVldWU+KG15X2NsYXcpLAorICAgICAgaGFzX3RvcF9jbGF3X2dvYWxfKGZhbHNlKSwKKyAgICAgIHRvcF9jbGF3X2dvYWxfKDAuMCksCisgICAgICB0b3BfY2xhd18odGhpcyksCisgICAgICBoYXNfYm90dG9tX2NsYXdfZ29hbF8oZmFsc2UpLAorICAgICAgYm90dG9tX2NsYXdfZ29hbF8oMC4wKSwKKyAgICAgIGJvdHRvbV9jbGF3Xyh0aGlzKSwKKyAgICAgIGNsYXdfKE1ha2VDbGF3TG9vcCgpKSwKKyAgICAgIHdhc19lbmFibGVkXyhmYWxzZSksCisgICAgICBkb2luZ19jYWxpYnJhdGlvbl9maW5lX3R1bmVfKGZhbHNlKSwKKyAgICAgIGNhcHBlZF9nb2FsXyhmYWxzZSksCisgICAgICBtb2RlXyhVTktOT1dOX0xPQ0FUSU9OKSB7fQorCitjb25zdCBpbnQgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OmtaZXJvaW5nTWF4Vm9sdGFnZTsKKworYm9vbCBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6U2F3RmlsdGVyZWRQb3NlZGdlKAorICAgIGNvbnN0IEhhbGxFZmZlY3RUcmFja2VyICZ0aGlzX3NlbnNvciwgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnNlbnNvckEsCisgICAgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnNlbnNvckIpIHsKKyAgaWYgKHBvc2VkZ2VfZmlsdGVyXyA9PSBudWxscHRyICYmIHRoaXNfc2Vuc29yLnBvc2VkZ2VfY291bnRfY2hhbmdlZCgpICYmCisgICAgICAhc2Vuc29yQS5wb3NlZGdlX2NvdW50X2NoYW5nZWQoKSAmJiAhc2Vuc29yQi5wb3NlZGdlX2NvdW50X2NoYW5nZWQoKSAmJgorICAgICAgdGhpc19zZW5zb3IudmFsdWUoKSAmJiAhdGhpc19zZW5zb3IubGFzdF92YWx1ZSgpKSB7CisgICAgcG9zZWRnZV9maWx0ZXJfID0gJnRoaXNfc2Vuc29yOworICB9IGVsc2UgaWYgKHBvc2VkZ2VfZmlsdGVyXyA9PSAmdGhpc19zZW5zb3IgJiYKKyAgICAgICAgICAgICAhdGhpc19zZW5zb3IucG9zZWRnZV9jb3VudF9jaGFuZ2VkKCkgJiYKKyAgICAgICAgICAgICAhc2Vuc29yQS5wb3NlZGdlX2NvdW50X2NoYW5nZWQoKSAmJgorICAgICAgICAgICAgICFzZW5zb3JCLnBvc2VkZ2VfY291bnRfY2hhbmdlZCgpICYmIHRoaXNfc2Vuc29yLnZhbHVlKCkpIHsKKyAgICBwb3NlZGdlX2ZpbHRlcl8gPSBudWxscHRyOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHBvc2VkZ2VfZmlsdGVyXyA9PSAmdGhpc19zZW5zb3IpIHsKKyAgICBwb3NlZGdlX2ZpbHRlcl8gPSBudWxscHRyOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6U2F3RmlsdGVyZWROZWdlZGdlKAorICAgIGNvbnN0IEhhbGxFZmZlY3RUcmFja2VyICZ0aGlzX3NlbnNvciwgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnNlbnNvckEsCisgICAgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnNlbnNvckIpIHsKKyAgaWYgKG5lZ2VkZ2VfZmlsdGVyXyA9PSBudWxscHRyICYmIHRoaXNfc2Vuc29yLm5lZ2VkZ2VfY291bnRfY2hhbmdlZCgpICYmCisgICAgICAhc2Vuc29yQS5uZWdlZGdlX2NvdW50X2NoYW5nZWQoKSAmJiAhc2Vuc29yQi5uZWdlZGdlX2NvdW50X2NoYW5nZWQoKSAmJgorICAgICAgIXRoaXNfc2Vuc29yLnZhbHVlKCkgJiYgdGhpc19zZW5zb3IubGFzdF92YWx1ZSgpKSB7CisgICAgbmVnZWRnZV9maWx0ZXJfID0gJnRoaXNfc2Vuc29yOworICB9IGVsc2UgaWYgKG5lZ2VkZ2VfZmlsdGVyXyA9PSAmdGhpc19zZW5zb3IgJiYKKyAgICAgICAgICAgICAhdGhpc19zZW5zb3IubmVnZWRnZV9jb3VudF9jaGFuZ2VkKCkgJiYKKyAgICAgICAgICAgICAhc2Vuc29yQS5uZWdlZGdlX2NvdW50X2NoYW5nZWQoKSAmJgorICAgICAgICAgICAgICFzZW5zb3JCLm5lZ2VkZ2VfY291bnRfY2hhbmdlZCgpICYmICF0aGlzX3NlbnNvci52YWx1ZSgpKSB7CisgICAgbmVnZWRnZV9maWx0ZXJfID0gbnVsbHB0cjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChuZWdlZGdlX2ZpbHRlcl8gPT0gJnRoaXNfc2Vuc29yKSB7CisgICAgbmVnZWRnZV9maWx0ZXJfID0gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkRvR2V0UG9zaXRpb25PZkVkZ2UoCisgICAgY29uc3QgY29uc3RhbnRzOjpWYWx1ZXM6OkNsYXdzOjpBbmdsZVBhaXIgJmFuZ2xlcywgZG91YmxlICplZGdlX2VuY29kZXIsCisgICAgZG91YmxlICplZGdlX2FuZ2xlLCBjb25zdCBIYWxsRWZmZWN0VHJhY2tlciAmdGhpc19zZW5zb3IsCisgICAgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnNlbnNvckEsIGNvbnN0IEhhbGxFZmZlY3RUcmFja2VyICZzZW5zb3JCLAorICAgIGNvbnN0IGNoYXIgKmhhbGxfZWZmZWN0X25hbWUpIHsKKyAgYm9vbCBmb3VuZF9lZGdlID0gZmFsc2U7CisKKyAgaWYgKFNhd0ZpbHRlcmVkUG9zZWRnZSh0aGlzX3NlbnNvciwgc2Vuc29yQSwgc2Vuc29yQikpIHsKKyAgICBpZiAobWluX2hhbGxfZWZmZWN0X29mZl9hbmdsZV8gPT0gbWF4X2hhbGxfZWZmZWN0X29mZl9hbmdsZV8pIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiJXM6IFVuY2VydGFpbiB3aGljaCBzaWRlLCByZWplY3RpbmcgcG9zZWRnZVxuIiwgbmFtZV8pOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBkb3VibGUgYXZlcmFnZV9sYXN0X2VuY29kZXIgPQorICAgICAgICAgIChtaW5faGFsbF9lZmZlY3Rfb2ZmX2FuZ2xlXyArIG1heF9oYWxsX2VmZmVjdF9vZmZfYW5nbGVfKSAvIDIuMDsKKyAgICAgIGlmICh0aGlzX3NlbnNvci5wb3NlZGdlX3ZhbHVlKCkgPCBhdmVyYWdlX2xhc3RfZW5jb2RlcikgeworICAgICAgICAqZWRnZV9hbmdsZSA9IGFuZ2xlcy51cHBlcl9kZWNyZWFzaW5nX2FuZ2xlOworICAgICAgICBMT0coSU5GTywgIiVzIFBvc2VkZ2UgdXBwZXIgb2YgJXMgLT4gJWYgcG9zZWRnZTogJWYgYXZnX2VuY29kZXI6ICVmXG4iLAorICAgICAgICAgICAgbmFtZV8sIGhhbGxfZWZmZWN0X25hbWUsICplZGdlX2FuZ2xlLCB0aGlzX3NlbnNvci5wb3NlZGdlX3ZhbHVlKCksCisgICAgICAgICAgICBhdmVyYWdlX2xhc3RfZW5jb2Rlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICAqZWRnZV9hbmdsZSA9IGFuZ2xlcy5sb3dlcl9hbmdsZTsKKyAgICAgICAgTE9HKElORk8sICIlcyBQb3NlZGdlIGxvd2VyIG9mICVzIC0+ICVmIHBvc2VkZ2U6ICVmIGF2Z19lbmNvZGVyOiAlZlxuIiwKKyAgICAgICAgICAgIG5hbWVfLCBoYWxsX2VmZmVjdF9uYW1lLCAqZWRnZV9hbmdsZSwgdGhpc19zZW5zb3IucG9zZWRnZV92YWx1ZSgpLAorICAgICAgICAgICAgYXZlcmFnZV9sYXN0X2VuY29kZXIpOworICAgICAgfQorICAgICAgKmVkZ2VfZW5jb2RlciA9IHRoaXNfc2Vuc29yLnBvc2VkZ2VfdmFsdWUoKTsKKyAgICAgIGZvdW5kX2VkZ2UgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChTYXdGaWx0ZXJlZE5lZ2VkZ2UodGhpc19zZW5zb3IsIHNlbnNvckEsIHNlbnNvckIpKSB7CisgICAgaWYgKG1pbl9oYWxsX2VmZmVjdF9vbl9hbmdsZV8gPT0gbWF4X2hhbGxfZWZmZWN0X29uX2FuZ2xlXykgeworICAgICAgTE9HKFdBUk5JTkcsICIlczogVW5jZXJ0YWluIHdoaWNoIHNpZGUsIHJlamVjdGluZyBuZWdlZGdlXG4iLCBuYW1lXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBhdmVyYWdlX2xhc3RfZW5jb2RlciA9CisgICAgICAgICAgKG1pbl9oYWxsX2VmZmVjdF9vbl9hbmdsZV8gKyBtYXhfaGFsbF9lZmZlY3Rfb25fYW5nbGVfKSAvIDIuMDsKKyAgICAgIGlmICh0aGlzX3NlbnNvci5uZWdlZGdlX3ZhbHVlKCkgPiBhdmVyYWdlX2xhc3RfZW5jb2RlcikgeworICAgICAgICAqZWRnZV9hbmdsZSA9IGFuZ2xlcy51cHBlcl9hbmdsZTsKKyAgICAgICAgTE9HKElORk8sICIlcyBOZWdlZGdlIHVwcGVyIG9mICVzIC0+ICVmIG5lZ2VkZ2U6ICVmIGF2Z19lbmNvZGVyOiAlZlxuIiwKKyAgICAgICAgICAgIG5hbWVfLCBoYWxsX2VmZmVjdF9uYW1lLCAqZWRnZV9hbmdsZSwgdGhpc19zZW5zb3IubmVnZWRnZV92YWx1ZSgpLAorICAgICAgICAgICAgYXZlcmFnZV9sYXN0X2VuY29kZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKmVkZ2VfYW5nbGUgPSBhbmdsZXMubG93ZXJfZGVjcmVhc2luZ19hbmdsZTsKKyAgICAgICAgTE9HKElORk8sICIlcyBOZWdlZGdlIGxvd2VyIG9mICVzIC0+ICVmIG5lZ2VkZ2U6ICVmIGF2Z19lbmNvZGVyOiAlZlxuIiwKKyAgICAgICAgICAgIG5hbWVfLCBoYWxsX2VmZmVjdF9uYW1lLCAqZWRnZV9hbmdsZSwgdGhpc19zZW5zb3IubmVnZWRnZV92YWx1ZSgpLAorICAgICAgICAgICAgYXZlcmFnZV9sYXN0X2VuY29kZXIpOworICAgICAgfQorICAgICAgKmVkZ2VfZW5jb2RlciA9IHRoaXNfc2Vuc29yLm5lZ2VkZ2VfdmFsdWUoKTsKKyAgICAgIGZvdW5kX2VkZ2UgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmb3VuZF9lZGdlOworfQorCitib29sIFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpHZXRQb3NpdGlvbk9mRWRnZSgKKyAgICBjb25zdCBjb25zdGFudHM6OlZhbHVlczo6Q2xhd3M6OkNsYXcgJmNsYXdfdmFsdWVzLCBkb3VibGUgKmVkZ2VfZW5jb2RlciwKKyAgICBkb3VibGUgKmVkZ2VfYW5nbGUpIHsKKyAgaWYgKERvR2V0UG9zaXRpb25PZkVkZ2UoY2xhd192YWx1ZXMuZnJvbnQsIGVkZ2VfZW5jb2RlciwgZWRnZV9hbmdsZSwgZnJvbnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxpYnJhdGlvbl8sIGJhY2tfLCAiZnJvbnQiKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChEb0dldFBvc2l0aW9uT2ZFZGdlKGNsYXdfdmFsdWVzLmNhbGlicmF0aW9uLCBlZGdlX2VuY29kZXIsIGVkZ2VfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uXywgZnJvbnRfLCBiYWNrXywgImNhbGlicmF0aW9uIikpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoRG9HZXRQb3NpdGlvbk9mRWRnZShjbGF3X3ZhbHVlcy5iYWNrLCBlZGdlX2VuY29kZXIsIGVkZ2VfYW5nbGUsIGJhY2tfLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxpYnJhdGlvbl8sIGZyb250XywgImJhY2siKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUb3BaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6U2V0Q2FsaWJyYXRpb24oZG91YmxlIGVkZ2VfZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlZGdlX2FuZ2xlKSB7CisgIGRvdWJsZSBvbGRfb2Zmc2V0ID0gb2Zmc2V0XzsKKyAgb2Zmc2V0XyA9IGVkZ2VfYW5nbGUgLSBlZGdlX2VuY29kZXI7CisgIGNvbnN0IGRvdWJsZSBkb2Zmc2V0ID0gb2Zmc2V0XyAtIG9sZF9vZmZzZXQ7CisgIG1vdG9yXy0+Q2hhbmdlVG9wT2Zmc2V0KGRvZmZzZXQpOworfQorCitkb3VibGUgVG9wWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkNvbXB1dGVDYWxpYnJhdGlvbkNoYW5nZShkb3VibGUgZWRnZV9lbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGVkZ2VfYW5nbGUpIHsKKyAgY29uc3QgZG91YmxlIG9mZnNldCA9IGVkZ2VfYW5nbGUgLSBlZGdlX2VuY29kZXI7CisgIGNvbnN0IGRvdWJsZSBkb2Zmc2V0ID0gb2Zmc2V0IC0gb2Zmc2V0XzsKKyAgcmV0dXJuIGRvZmZzZXQ7Cit9CisKK3ZvaWQgQm90dG9tWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OlNldENhbGlicmF0aW9uKGRvdWJsZSBlZGdlX2VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZWRnZV9hbmdsZSkgeworICBkb3VibGUgb2xkX29mZnNldCA9IG9mZnNldF87CisgIG9mZnNldF8gPSBlZGdlX2FuZ2xlIC0gZWRnZV9lbmNvZGVyOworICBjb25zdCBkb3VibGUgZG9mZnNldCA9IG9mZnNldF8gLSBvbGRfb2Zmc2V0OworICBtb3Rvcl8tPkNoYW5nZUJvdHRvbU9mZnNldChkb2Zmc2V0KTsKK30KKworZG91YmxlIEJvdHRvbVplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpDb21wdXRlQ2FsaWJyYXRpb25DaGFuZ2UoCisgICAgZG91YmxlIGVkZ2VfZW5jb2RlciwgZG91YmxlIGVkZ2VfYW5nbGUpIHsKKyAgY29uc3QgZG91YmxlIG9mZnNldCA9IGVkZ2VfYW5nbGUgLSBlZGdlX2VuY29kZXI7CisgIGNvbnN0IGRvdWJsZSBkb2Zmc2V0ID0gb2Zmc2V0IC0gb2Zmc2V0XzsKKyAgcmV0dXJuIGRvZmZzZXQ7Cit9CisKK3ZvaWQgQ2xhd01vdG9yOjpDaGFuZ2VUb3BPZmZzZXQoZG91YmxlIGRvZmZzZXQpIHsKKyAgY2xhd18uQ2hhbmdlVG9wT2Zmc2V0KGRvZmZzZXQpOworICBpZiAoaGFzX3RvcF9jbGF3X2dvYWxfKSB7CisgICAgdG9wX2NsYXdfZ29hbF8gKz0gZG9mZnNldDsKKyAgfQorfQorCit2b2lkIENsYXdNb3Rvcjo6Q2hhbmdlQm90dG9tT2Zmc2V0KGRvdWJsZSBkb2Zmc2V0KSB7CisgIGNsYXdfLkNoYW5nZUJvdHRvbU9mZnNldChkb2Zmc2V0KTsKKyAgaWYgKGhhc19ib3R0b21fY2xhd19nb2FsXykgeworICAgIGJvdHRvbV9jbGF3X2dvYWxfICs9IGRvZmZzZXQ7CisgIH0KK30KKwordm9pZCBDbGF3TGltaXRlZExvb3A6OkNoYW5nZVRvcE9mZnNldChkb3VibGUgZG9mZnNldCkgeworICBtdXRhYmxlX1hfaGF0KCkoMSwgMCkgKz0gZG9mZnNldDsKKyAgTE9HKElORk8sICJDaGFuZ2luZyB0b3Agb2Zmc2V0IGJ5ICVmXG4iLCBkb2Zmc2V0KTsKK30KK3ZvaWQgQ2xhd0xpbWl0ZWRMb29wOjpDaGFuZ2VCb3R0b21PZmZzZXQoZG91YmxlIGRvZmZzZXQpIHsKKyAgbXV0YWJsZV9YX2hhdCgpKDAsIDApICs9IGRvZmZzZXQ7CisgIG11dGFibGVfWF9oYXQoKSgxLCAwKSAtPSBkb2Zmc2V0OworICBMT0coSU5GTywgIkNoYW5naW5nIGJvdHRvbSBvZmZzZXQgYnkgJWZcbiIsIGRvZmZzZXQpOworfQorCit2b2lkIExpbWl0Q2xhd0dvYWwoZG91YmxlICpib3R0b21fZ29hbCwgZG91YmxlICp0b3BfZ29hbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBmcmM5NzE6OmNvbnN0YW50czo6VmFsdWVzICZ2YWx1ZXMpIHsKKyAgLy8gZmlyc3QgdXBkYXRlIHBvc2l0aW9uIGJhc2VkIG9uIGFuZ2xlIGxpbWl0CisgIGNvbnN0IGRvdWJsZSBzZXBhcmF0aW9uID0gKnRvcF9nb2FsIC0gKmJvdHRvbV9nb2FsOworICBpZiAoc2VwYXJhdGlvbiA+IHZhbHVlcy5jbGF3LnNvZnRfbWF4X3NlcGFyYXRpb24pIHsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiYmVmb3JlIiwgQ2xhd1Bvc2l0aW9uVG9Mb2coKnRvcF9nb2FsLCAqYm90dG9tX2dvYWwpKTsKKyAgICBjb25zdCBkb3VibGUgZHNlcCA9IChzZXBhcmF0aW9uIC0gdmFsdWVzLmNsYXcuc29mdF9tYXhfc2VwYXJhdGlvbikgLyAyLjA7CisgICAgKmJvdHRvbV9nb2FsICs9IGRzZXA7CisgICAgKnRvcF9nb2FsIC09IGRzZXA7CisgICAgTE9HX1NUUlVDVChERUJVRywgImFmdGVyIiwgQ2xhd1Bvc2l0aW9uVG9Mb2coKnRvcF9nb2FsLCAqYm90dG9tX2dvYWwpKTsKKyAgfQorICBpZiAoc2VwYXJhdGlvbiA8IHZhbHVlcy5jbGF3LnNvZnRfbWluX3NlcGFyYXRpb24pIHsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiYmVmb3JlIiwgQ2xhd1Bvc2l0aW9uVG9Mb2coKnRvcF9nb2FsLCAqYm90dG9tX2dvYWwpKTsKKyAgICBjb25zdCBkb3VibGUgZHNlcCA9IChzZXBhcmF0aW9uIC0gdmFsdWVzLmNsYXcuc29mdF9taW5fc2VwYXJhdGlvbikgLyAyLjA7CisgICAgKmJvdHRvbV9nb2FsICs9IGRzZXA7CisgICAgKnRvcF9nb2FsIC09IGRzZXA7CisgICAgTE9HX1NUUlVDVChERUJVRywgImFmdGVyIiwgQ2xhd1Bvc2l0aW9uVG9Mb2coKnRvcF9nb2FsLCAqYm90dG9tX2dvYWwpKTsKKyAgfQorCisgIC8vIG5vdyBtb3ZlIGJvdGggZ29hbHMgaW4gdW5pc29uCisgIGlmICgqYm90dG9tX2dvYWwgPCB2YWx1ZXMuY2xhdy5sb3dlcl9jbGF3Lmxvd2VyX2xpbWl0KSB7CisgICAgTE9HX1NUUlVDVChERUJVRywgImJlZm9yZSIsIENsYXdQb3NpdGlvblRvTG9nKCp0b3BfZ29hbCwgKmJvdHRvbV9nb2FsKSk7CisgICAgKnRvcF9nb2FsICs9IHZhbHVlcy5jbGF3Lmxvd2VyX2NsYXcubG93ZXJfbGltaXQgLSAqYm90dG9tX2dvYWw7CisgICAgKmJvdHRvbV9nb2FsID0gdmFsdWVzLmNsYXcubG93ZXJfY2xhdy5sb3dlcl9saW1pdDsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiYWZ0ZXIiLCBDbGF3UG9zaXRpb25Ub0xvZygqdG9wX2dvYWwsICpib3R0b21fZ29hbCkpOworICB9CisgIGlmICgqYm90dG9tX2dvYWwgPiB2YWx1ZXMuY2xhdy5sb3dlcl9jbGF3LnVwcGVyX2xpbWl0KSB7CisgICAgTE9HX1NUUlVDVChERUJVRywgImJlZm9yZSIsIENsYXdQb3NpdGlvblRvTG9nKCp0b3BfZ29hbCwgKmJvdHRvbV9nb2FsKSk7CisgICAgKnRvcF9nb2FsIC09ICpib3R0b21fZ29hbCAtIHZhbHVlcy5jbGF3Lmxvd2VyX2NsYXcudXBwZXJfbGltaXQ7CisgICAgKmJvdHRvbV9nb2FsID0gdmFsdWVzLmNsYXcubG93ZXJfY2xhdy51cHBlcl9saW1pdDsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiYWZ0ZXIiLCBDbGF3UG9zaXRpb25Ub0xvZygqdG9wX2dvYWwsICpib3R0b21fZ29hbCkpOworICB9CisKKyAgaWYgKCp0b3BfZ29hbCA8IHZhbHVlcy5jbGF3LnVwcGVyX2NsYXcubG93ZXJfbGltaXQpIHsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiYmVmb3JlIiwgQ2xhd1Bvc2l0aW9uVG9Mb2coKnRvcF9nb2FsLCAqYm90dG9tX2dvYWwpKTsKKyAgICAqYm90dG9tX2dvYWwgKz0gdmFsdWVzLmNsYXcudXBwZXJfY2xhdy5sb3dlcl9saW1pdCAtICp0b3BfZ29hbDsKKyAgICAqdG9wX2dvYWwgPSB2YWx1ZXMuY2xhdy51cHBlcl9jbGF3Lmxvd2VyX2xpbWl0OworICAgIExPR19TVFJVQ1QoREVCVUcsICJhZnRlciIsIENsYXdQb3NpdGlvblRvTG9nKCp0b3BfZ29hbCwgKmJvdHRvbV9nb2FsKSk7CisgIH0KKyAgaWYgKCp0b3BfZ29hbCA+IHZhbHVlcy5jbGF3LnVwcGVyX2NsYXcudXBwZXJfbGltaXQpIHsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiYmVmb3JlIiwgQ2xhd1Bvc2l0aW9uVG9Mb2coKnRvcF9nb2FsLCAqYm90dG9tX2dvYWwpKTsKKyAgICAqYm90dG9tX2dvYWwgLT0gKnRvcF9nb2FsIC0gdmFsdWVzLmNsYXcudXBwZXJfY2xhdy51cHBlcl9saW1pdDsKKyAgICAqdG9wX2dvYWwgPSB2YWx1ZXMuY2xhdy51cHBlcl9jbGF3LnVwcGVyX2xpbWl0OworICAgIExPR19TVFJVQ1QoREVCVUcsICJhZnRlciIsIENsYXdQb3NpdGlvblRvTG9nKCp0b3BfZ29hbCwgKmJvdHRvbV9nb2FsKSk7CisgIH0KK30KKworYm9vbCBDbGF3TW90b3I6OmlzX3JlYWR5KCkgY29uc3QgeworICByZXR1cm4gKAorICAgICAgKHRvcF9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgPT0gWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkNBTElCUkFURUQgJiYKKyAgICAgICBib3R0b21fY2xhd18uemVyb2luZ19zdGF0ZSgpID09IFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpDQUxJQlJBVEVEKSB8fAorICAgICAgKCgoOjphb3M6OmpveXN0aWNrX3N0YXRlLmdldCgpID09IE5VTEwpCisgICAgICAgICAgICA/IHRydWUKKyAgICAgICAgICAgIDogOjphb3M6OmpveXN0aWNrX3N0YXRlLT5hdXRvbm9tb3VzKSAmJgorICAgICAgICgodG9wX2NsYXdfLnplcm9pbmdfc3RhdGUoKSA9PSBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6Q0FMSUJSQVRFRCB8fAorICAgICAgICAgdG9wX2NsYXdfLnplcm9pbmdfc3RhdGUoKSA9PQorICAgICAgICAgICAgIFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpESVNBQkxFRF9DQUxJQlJBVElPTikgJiYKKyAgICAgICAgKGJvdHRvbV9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgPT0gWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkNBTElCUkFURUQgfHwKKyAgICAgICAgIGJvdHRvbV9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgPT0KKyAgICAgICAgICAgICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6RElTQUJMRURfQ0FMSUJSQVRJT04pKSkpOworfQorCitib29sIENsYXdNb3Rvcjo6aXNfemVyb2luZygpIGNvbnN0IHsgcmV0dXJuICFpc19yZWFkeSgpOyB9CisKKy8vIFBvc2l0aXZlIGFuZ2xlIGlzIHVwLCBhbmQgcG9zaXRpdmUgcG93ZXIgaXMgdXAuCit2b2lkIENsYXdNb3Rvcjo6UnVuSXRlcmF0aW9uKGNvbnN0IGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6R29hbCAqZ29hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlOjpQb3NpdGlvbiAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6T3V0cHV0ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6U3RhdHVzICpzdGF0dXMpIHsKKyAgY29uc3RleHByIGRvdWJsZSBkdCA9IDAuMDE7CisKKyAgLy8gRGlzYWJsZSB0aGUgbW90b3JzIG5vdyBzbyB0aGF0IGFsbCBlYXJseSByZXR1cm5zIHdpbGwgcmV0dXJuIHdpdGggdGhlCisgIC8vIG1vdG9ycyBkaXNhYmxlZC4KKyAgaWYgKG91dHB1dCkgeworICAgIG91dHB1dC0+dG9wX2NsYXdfdm9sdGFnZSA9IDA7CisgICAgb3V0cHV0LT5ib3R0b21fY2xhd192b2x0YWdlID0gMDsKKyAgICBvdXRwdXQtPmludGFrZV92b2x0YWdlID0gMDsKKyAgICBvdXRwdXQtPnR1c2tfdm9sdGFnZSA9IDA7CisgIH0KKworICBpZiAoZ29hbCkgeworICAgIGlmICg6OnN0ZDo6aXNuYW4oZ29hbC0+Ym90dG9tX2FuZ2xlKSB8fAorICAgICAgICA6OnN0ZDo6aXNuYW4oZ29hbC0+c2VwYXJhdGlvbl9hbmdsZSkgfHwgOjpzdGQ6OmlzbmFuKGdvYWwtPmludGFrZSkgfHwKKyAgICAgICAgOjpzdGQ6OmlzbmFuKGdvYWwtPmNlbnRlcmluZykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpZiAoV2FzUmVzZXQoKSkgeworICAgIHRvcF9jbGF3Xy5SZXNldChwb3NpdGlvbi0+dG9wKTsKKyAgICBib3R0b21fY2xhd18uUmVzZXQocG9zaXRpb24tPmJvdHRvbSk7CisgIH0KKworICBjb25zdCBmcmM5NzE6OmNvbnN0YW50czo6VmFsdWVzICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworCisgIGlmIChwb3NpdGlvbikgeworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBZOworICAgIFkgPDwgcG9zaXRpb24tPmJvdHRvbS5wb3NpdGlvbiArIGJvdHRvbV9jbGF3Xy5vZmZzZXQoKSwKKyAgICAgICAgcG9zaXRpb24tPnRvcC5wb3NpdGlvbiArIHRvcF9jbGF3Xy5vZmZzZXQoKTsKKyAgICBjbGF3Xy5Db3JyZWN0KFkpOworCisgICAgdG9wX2NsYXdfLlNldFBvc2l0aW9uVmFsdWVzKHBvc2l0aW9uLT50b3ApOworICAgIGJvdHRvbV9jbGF3Xy5TZXRQb3NpdGlvblZhbHVlcyhwb3NpdGlvbi0+Ym90dG9tKTsKKworICAgIGlmICghaGFzX3RvcF9jbGF3X2dvYWxfKSB7CisgICAgICBoYXNfdG9wX2NsYXdfZ29hbF8gPSB0cnVlOworICAgICAgdG9wX2NsYXdfZ29hbF8gPSB0b3BfY2xhd18uYWJzb2x1dGVfcG9zaXRpb24oKTsKKyAgICAgIGluaXRpYWxfc2VwYXJhdGlvbl8gPQorICAgICAgICAgIHRvcF9jbGF3Xy5hYnNvbHV0ZV9wb3NpdGlvbigpIC0gYm90dG9tX2NsYXdfLmFic29sdXRlX3Bvc2l0aW9uKCk7CisgICAgfQorICAgIGlmICghaGFzX2JvdHRvbV9jbGF3X2dvYWxfKSB7CisgICAgICBoYXNfYm90dG9tX2NsYXdfZ29hbF8gPSB0cnVlOworICAgICAgYm90dG9tX2NsYXdfZ29hbF8gPSBib3R0b21fY2xhd18uYWJzb2x1dGVfcG9zaXRpb24oKTsKKyAgICAgIGluaXRpYWxfc2VwYXJhdGlvbl8gPQorICAgICAgICAgIHRvcF9jbGF3Xy5hYnNvbHV0ZV9wb3NpdGlvbigpIC0gYm90dG9tX2NsYXdfLmFic29sdXRlX3Bvc2l0aW9uKCk7CisgICAgfQorICAgIExPR19TVFJVQ1QoREVCVUcsICJhYnNvbHV0ZSBwb3NpdGlvbiIsCisgICAgICAgICAgICAgICBDbGF3UG9zaXRpb25Ub0xvZyh0b3BfY2xhd18uYWJzb2x1dGVfcG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9jbGF3Xy5hYnNvbHV0ZV9wb3NpdGlvbigpKSk7CisgIH0KKworICBib29sIGF1dG9ub21vdXMsIGVuYWJsZWQ7CisgIGlmICg6OmFvczo6am95c3RpY2tfc3RhdGUuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgIGF1dG9ub21vdXMgPSB0cnVlOworICAgIGVuYWJsZWQgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvbm9tb3VzID0gOjphb3M6OmpveXN0aWNrX3N0YXRlLT5hdXRvbm9tb3VzOworICAgIGVuYWJsZWQgPSA6OmFvczo6am95c3RpY2tfc3RhdGUtPmVuYWJsZWQ7CisgIH0KKworICBkb3VibGUgYm90dG9tX2NsYXdfdmVsb2NpdHlfID0gMC4wOworICBkb3VibGUgdG9wX2NsYXdfdmVsb2NpdHlfID0gMC4wOworCisgIGlmIChnb2FsICE9IE5VTEwgJiYKKyAgICAgICgodG9wX2NsYXdfLnplcm9pbmdfc3RhdGUoKSA9PSBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6Q0FMSUJSQVRFRCAmJgorICAgICAgICBib3R0b21fY2xhd18uemVyb2luZ19zdGF0ZSgpID09IFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpDQUxJQlJBVEVEKSB8fAorICAgICAgIChhdXRvbm9tb3VzICYmCisgICAgICAgICgodG9wX2NsYXdfLnplcm9pbmdfc3RhdGUoKSA9PSBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6Q0FMSUJSQVRFRCB8fAorICAgICAgICAgIHRvcF9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgPT0KKyAgICAgICAgICAgICAgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkRJU0FCTEVEX0NBTElCUkFUSU9OKSAmJgorICAgICAgICAgKGJvdHRvbV9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgPT0gWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkNBTElCUkFURUQgfHwKKyAgICAgICAgICBib3R0b21fY2xhd18uemVyb2luZ19zdGF0ZSgpID09CisgICAgICAgICAgICAgIFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpESVNBQkxFRF9DQUxJQlJBVElPTikpKSkpIHsKKyAgICAvLyBSZWFkeSB0byB1c2UgdGhlIGNsYXcuCisgICAgLy8gTGltaXQgdGhlIGdvYWxzIGhlcmUuCisgICAgYm90dG9tX2NsYXdfZ29hbF8gPSBnb2FsLT5ib3R0b21fYW5nbGU7CisgICAgdG9wX2NsYXdfZ29hbF8gPSBnb2FsLT5ib3R0b21fYW5nbGUgKyBnb2FsLT5zZXBhcmF0aW9uX2FuZ2xlOworICAgIGhhc19ib3R0b21fY2xhd19nb2FsXyA9IHRydWU7CisgICAgaGFzX3RvcF9jbGF3X2dvYWxfID0gdHJ1ZTsKKyAgICBkb2luZ19jYWxpYnJhdGlvbl9maW5lX3R1bmVfID0gZmFsc2U7CisgICAgbW9kZV8gPSBSRUFEWTsKKworICAgIGJvdHRvbV9jbGF3Xy5IYW5kbGVDYWxpYnJhdGlvbkVycm9yKHZhbHVlcy5jbGF3Lmxvd2VyX2NsYXcpOworICAgIHRvcF9jbGF3Xy5IYW5kbGVDYWxpYnJhdGlvbkVycm9yKHZhbHVlcy5jbGF3LnVwcGVyX2NsYXcpOworICB9IGVsc2UgaWYgKHRvcF9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgIT0KKyAgICAgICAgICAgICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6VU5LTk9XTl9QT1NJVElPTiAmJgorICAgICAgICAgICAgIGJvdHRvbV9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgIT0KKyAgICAgICAgICAgICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6VU5LTk9XTl9QT1NJVElPTikgeworICAgIC8vIFRpbWUgdG8gZmluZSB0dW5lIHRoZSB6ZXJvLgorICAgIC8vIExpbWl0IHRoZSBnb2FscyBoZXJlLgorICAgIGlmICghZW5hYmxlZCkgeworICAgICAgLy8gSWYgd2UgYXJlIGRpc2FibGVkLCBzdGFydCB0aGUgZmluZSB0dW5lIHByb2Nlc3Mgb3ZlciBhZ2Fpbi4KKyAgICAgIGRvaW5nX2NhbGlicmF0aW9uX2ZpbmVfdHVuZV8gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJvdHRvbV9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgIT0gWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkNBTElCUkFURUQpIHsKKyAgICAgIC8vIGFsd2F5cyBnZXQgdGhlIGJvdHRvbSBjbGF3IHRvIGNhbGlicmF0ZWQgZmlyc3QKKyAgICAgIExPRyhERUJVRywgIkNhbGlicmF0aW5nIHRoZSBib3R0b20gb2YgdGhlIGNsYXdcbiIpOworICAgICAgaWYgKCFkb2luZ19jYWxpYnJhdGlvbl9maW5lX3R1bmVfKSB7CisgICAgICAgIGlmICg6OnN0ZDo6YWJzKGJvdHRvbV9hYnNvbHV0ZV9wb3NpdGlvbigpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmNsYXcuc3RhcnRfZmluZV90dW5lX3BvcykgPAorICAgICAgICAgICAgdmFsdWVzLmNsYXcuY2xhd191bmltcG9ydGFudF9lcHNpbG9uKSB7CisgICAgICAgICAgZG9pbmdfY2FsaWJyYXRpb25fZmluZV90dW5lXyA9IHRydWU7CisgICAgICAgICAgYm90dG9tX2NsYXdfZ29hbF8gKz0gdmFsdWVzLmNsYXcuY2xhd196ZXJvaW5nX3NwZWVkICogZHQ7CisgICAgICAgICAgdG9wX2NsYXdfdmVsb2NpdHlfID0gYm90dG9tX2NsYXdfdmVsb2NpdHlfID0KKyAgICAgICAgICAgICAgdmFsdWVzLmNsYXcuY2xhd196ZXJvaW5nX3NwZWVkOworICAgICAgICAgIExPRyhERUJVRywgIlJlYWR5IHRvIGZpbmUgdHVuZSB0aGUgYm90dG9tXG4iKTsKKyAgICAgICAgICBtb2RlXyA9IEZJTkVfVFVORV9CT1RUT007CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gc2VuZCBib3R0b20gdG8gemVyb2luZyBzdGFydAorICAgICAgICAgIGJvdHRvbV9jbGF3X2dvYWxfID0gdmFsdWVzLmNsYXcuc3RhcnRfZmluZV90dW5lX3BvczsKKyAgICAgICAgICBMT0coREVCVUcsICJHb2luZyB0byB0aGUgc3RhcnQgcG9zaXRpb24gZm9yIHRoZSBib3R0b21cbiIpOworICAgICAgICAgIG1vZGVfID0gUFJFUF9GSU5FX1RVTkVfQk9UVE9NOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBtb2RlXyA9IEZJTkVfVFVORV9CT1RUT007CisgICAgICAgIGJvdHRvbV9jbGF3X2dvYWxfICs9IHZhbHVlcy5jbGF3LmNsYXdfemVyb2luZ19zcGVlZCAqIGR0OworICAgICAgICB0b3BfY2xhd192ZWxvY2l0eV8gPSBib3R0b21fY2xhd192ZWxvY2l0eV8gPQorICAgICAgICAgICAgdmFsdWVzLmNsYXcuY2xhd196ZXJvaW5nX3NwZWVkOworICAgICAgICBpZiAodG9wX2NsYXdfLmZyb250X29yX2JhY2tfdHJpZ2dlcmVkKCkgfHwKKyAgICAgICAgICAgIGJvdHRvbV9jbGF3Xy5mcm9udF9vcl9iYWNrX3RyaWdnZXJlZCgpKSB7CisgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGhpdCBhIGxpbWl0LCBidXQgaWYgd2UgZG8sIGdvIGJhY2sgdG8gdGhlIHplcm9pbmcKKyAgICAgICAgICAvLyBwb2ludCBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgIGRvaW5nX2NhbGlicmF0aW9uX2ZpbmVfdHVuZV8gPSBmYWxzZTsKKyAgICAgICAgICBib3R0b21fY2xhd19nb2FsXyA9IHZhbHVlcy5jbGF3LnN0YXJ0X2ZpbmVfdHVuZV9wb3M7CisgICAgICAgICAgdG9wX2NsYXdfdmVsb2NpdHlfID0gYm90dG9tX2NsYXdfdmVsb2NpdHlfID0gMC4wOworICAgICAgICAgIExPRyhERUJVRywgIkZvdW5kIGEgbGltaXQsIHN0YXJ0aW5nIG92ZXIuXG4iKTsKKyAgICAgICAgICBtb2RlXyA9IFBSRVBfRklORV9UVU5FX0JPVFRPTTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3NpdGlvbiAmJiBib3R0b21fY2xhd18uU2F3RmlsdGVyZWRQb3NlZGdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9jbGF3Xy5jYWxpYnJhdGlvbigpLCBib3R0b21fY2xhd18uZnJvbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21fY2xhd18uYmFjaygpKSkgeworICAgICAgICAgIC8vIGRvIGNhbGlicmF0aW9uCisgICAgICAgICAgYm90dG9tX2NsYXdfLlNldENhbGlicmF0aW9uKAorICAgICAgICAgICAgICBwb3NpdGlvbi0+Ym90dG9tLmNhbGlicmF0aW9uLnBvc2VkZ2VfdmFsdWUsCisgICAgICAgICAgICAgIHZhbHVlcy5jbGF3Lmxvd2VyX2NsYXcuY2FsaWJyYXRpb24ubG93ZXJfYW5nbGUpOworICAgICAgICAgIGJvdHRvbV9jbGF3Xy5zZXRfemVyb2luZ19zdGF0ZShaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6Q0FMSUJSQVRFRCk7CisgICAgICAgICAgLy8gY2FsaWJyYXRlZCBzbyB3ZSBhcmUgZG9uZSBmaW5lIHR1bmluZyBib3R0b20KKyAgICAgICAgICBkb2luZ19jYWxpYnJhdGlvbl9maW5lX3R1bmVfID0gZmFsc2U7CisgICAgICAgICAgTE9HKERFQlVHLCAiQ2FsaWJyYXRlZCB0aGUgYm90dG9tIGNvcnJlY3RseSFcbiIpOworICAgICAgICB9IGVsc2UgaWYgKGJvdHRvbV9jbGF3Xy5jYWxpYnJhdGlvbigpLmxhc3RfdmFsdWUoKSkgeworICAgICAgICAgIExPRyhERUJVRywgIkFib3J0aW5nIGJvdHRvbSBmaW5lIHR1bmUgYmVjYXVzZSBzZW5zb3IgdHJpZ2dlcmVkXG4iKTsKKyAgICAgICAgICBkb2luZ19jYWxpYnJhdGlvbl9maW5lX3R1bmVfID0gZmFsc2U7CisgICAgICAgICAgYm90dG9tX2NsYXdfLnNldF96ZXJvaW5nX3N0YXRlKAorICAgICAgICAgICAgICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6VU5LTk9XTl9QT1NJVElPTik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTE9HKERFQlVHLCAiRmluZSB0dW5pbmdcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBub3cgc2V0IHRoZSB0b3AgY2xhdyB0byB0cmFjaworCisgICAgICB0b3BfY2xhd19nb2FsXyA9IGJvdHRvbV9jbGF3X2dvYWxfICsgdmFsdWVzLmNsYXcuY2xhd196ZXJvaW5nX3NlcGFyYXRpb247CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGJvdHRvbSBjbGF3IG11c3QgYmUgY2FsaWJyYXRlZCwgc3RhcnQgb24gdGhlIHRvcAorICAgICAgaWYgKCFkb2luZ19jYWxpYnJhdGlvbl9maW5lX3R1bmVfKSB7CisgICAgICAgIGlmICg6OnN0ZDo6YWJzKHRvcF9hYnNvbHV0ZV9wb3NpdGlvbigpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmNsYXcuc3RhcnRfZmluZV90dW5lX3BvcykgPAorICAgICAgICAgICAgdmFsdWVzLmNsYXcuY2xhd191bmltcG9ydGFudF9lcHNpbG9uKSB7CisgICAgICAgICAgZG9pbmdfY2FsaWJyYXRpb25fZmluZV90dW5lXyA9IHRydWU7CisgICAgICAgICAgdG9wX2NsYXdfZ29hbF8gKz0gdmFsdWVzLmNsYXcuY2xhd196ZXJvaW5nX3NwZWVkICogZHQ7CisgICAgICAgICAgdG9wX2NsYXdfdmVsb2NpdHlfID0gYm90dG9tX2NsYXdfdmVsb2NpdHlfID0KKyAgICAgICAgICAgICAgdmFsdWVzLmNsYXcuY2xhd196ZXJvaW5nX3NwZWVkOworICAgICAgICAgIExPRyhERUJVRywgIlJlYWR5IHRvIGZpbmUgdHVuZSB0aGUgdG9wXG4iKTsKKyAgICAgICAgICBtb2RlXyA9IEZJTkVfVFVORV9UT1A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gc2VuZCB0b3AgdG8gemVyb2luZyBzdGFydAorICAgICAgICAgIHRvcF9jbGF3X2dvYWxfID0gdmFsdWVzLmNsYXcuc3RhcnRfZmluZV90dW5lX3BvczsKKyAgICAgICAgICBMT0coREVCVUcsICJHb2luZyB0byB0aGUgc3RhcnQgcG9zaXRpb24gZm9yIHRoZSB0b3BcbiIpOworICAgICAgICAgIG1vZGVfID0gUFJFUF9GSU5FX1RVTkVfVE9QOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBtb2RlXyA9IEZJTkVfVFVORV9UT1A7CisgICAgICAgIHRvcF9jbGF3X2dvYWxfICs9IHZhbHVlcy5jbGF3LmNsYXdfemVyb2luZ19zcGVlZCAqIGR0OworICAgICAgICB0b3BfY2xhd192ZWxvY2l0eV8gPSBib3R0b21fY2xhd192ZWxvY2l0eV8gPQorICAgICAgICAgICAgdmFsdWVzLmNsYXcuY2xhd196ZXJvaW5nX3NwZWVkOworICAgICAgICBpZiAodG9wX2NsYXdfLmZyb250X29yX2JhY2tfdHJpZ2dlcmVkKCkgfHwKKyAgICAgICAgICAgIGJvdHRvbV9jbGF3Xy5mcm9udF9vcl9iYWNrX3RyaWdnZXJlZCgpKSB7CisgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IG5vdyB3ZSBrbm93IGl0IHdvbid0CisgICAgICAgICAgZG9pbmdfY2FsaWJyYXRpb25fZmluZV90dW5lXyA9IGZhbHNlOworICAgICAgICAgIHRvcF9jbGF3X2dvYWxfID0gdmFsdWVzLmNsYXcuc3RhcnRfZmluZV90dW5lX3BvczsKKyAgICAgICAgICB0b3BfY2xhd192ZWxvY2l0eV8gPSBib3R0b21fY2xhd192ZWxvY2l0eV8gPSAwLjA7CisgICAgICAgICAgTE9HKERFQlVHLCAiRm91bmQgYSBsaW1pdCwgc3RhcnRpbmcgb3Zlci5cbiIpOworICAgICAgICAgIG1vZGVfID0gUFJFUF9GSU5FX1RVTkVfVE9QOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvc2l0aW9uICYmCisgICAgICAgICAgICB0b3BfY2xhd18uU2F3RmlsdGVyZWRQb3NlZGdlKHRvcF9jbGF3Xy5jYWxpYnJhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BfY2xhd18uZnJvbnQoKSwgdG9wX2NsYXdfLmJhY2soKSkpIHsKKyAgICAgICAgICAvLyBkbyBjYWxpYnJhdGlvbgorICAgICAgICAgIHRvcF9jbGF3Xy5TZXRDYWxpYnJhdGlvbigKKyAgICAgICAgICAgICAgcG9zaXRpb24tPnRvcC5jYWxpYnJhdGlvbi5wb3NlZGdlX3ZhbHVlLAorICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy51cHBlcl9jbGF3LmNhbGlicmF0aW9uLmxvd2VyX2FuZ2xlKTsKKyAgICAgICAgICB0b3BfY2xhd18uc2V0X3plcm9pbmdfc3RhdGUoWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkNBTElCUkFURUQpOworICAgICAgICAgIC8vIGNhbGlicmF0ZWQgc28gd2UgYXJlIGRvbmUgZmluZSB0dW5pbmcgdG9wCisgICAgICAgICAgZG9pbmdfY2FsaWJyYXRpb25fZmluZV90dW5lXyA9IGZhbHNlOworICAgICAgICAgIExPRyhERUJVRywgIkNhbGlicmF0ZWQgdGhlIHRvcCBjb3JyZWN0bHkhXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmICh0b3BfY2xhd18uY2FsaWJyYXRpb24oKS5sYXN0X3ZhbHVlKCkpIHsKKyAgICAgICAgICBMT0coREVCVUcsICJBYm9ydGluZyB0b3AgZmluZSB0dW5lIGJlY2F1c2Ugc2Vuc29yIHRyaWdnZXJlZFxuIik7CisgICAgICAgICAgZG9pbmdfY2FsaWJyYXRpb25fZmluZV90dW5lXyA9IGZhbHNlOworICAgICAgICAgIHRvcF9jbGF3Xy5zZXRfemVyb2luZ19zdGF0ZSgKKyAgICAgICAgICAgICAgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OlVOS05PV05fUE9TSVRJT04pOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBub3cgc2V0IHRoZSBib3R0b20gY2xhdyB0byB0cmFjaworICAgICAgYm90dG9tX2NsYXdfZ29hbF8gPSB0b3BfY2xhd19nb2FsXyAtIHZhbHVlcy5jbGF3LmNsYXdfemVyb2luZ19zZXBhcmF0aW9uOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkb2luZ19jYWxpYnJhdGlvbl9maW5lX3R1bmVfID0gZmFsc2U7CisgICAgaWYgKCF3YXNfZW5hYmxlZF8gJiYgZW5hYmxlZCkgeworICAgICAgaWYgKHBvc2l0aW9uKSB7CisgICAgICAgIHRvcF9jbGF3X2dvYWxfID0gcG9zaXRpb24tPnRvcC5wb3NpdGlvbiArIHRvcF9jbGF3Xy5vZmZzZXQoKTsKKyAgICAgICAgYm90dG9tX2NsYXdfZ29hbF8gPSBwb3NpdGlvbi0+Ym90dG9tLnBvc2l0aW9uICsgYm90dG9tX2NsYXdfLm9mZnNldCgpOworICAgICAgICBpbml0aWFsX3NlcGFyYXRpb25fID0KKyAgICAgICAgICAgIHBvc2l0aW9uLT50b3AucG9zaXRpb24gLSBwb3NpdGlvbi0+Ym90dG9tLnBvc2l0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaGFzX3RvcF9jbGF3X2dvYWxfID0gZmFsc2U7CisgICAgICAgIGhhc19ib3R0b21fY2xhd19nb2FsXyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGlmICgoYm90dG9tX2NsYXdfLnplcm9pbmdfc3RhdGUoKSAhPQorICAgICAgICAgICAgIFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpVTktOT1dOX1BPU0lUSU9OIHx8CisgICAgICAgICBib3R0b21fY2xhd18uZnJvbnQoKS52YWx1ZSgpIHx8IHRvcF9jbGF3Xy5mcm9udCgpLnZhbHVlKCkpICYmCisgICAgICAgICF0b3BfY2xhd18uYmFjaygpLnZhbHVlKCkgJiYgIWJvdHRvbV9jbGF3Xy5iYWNrKCkudmFsdWUoKSkgeworICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgLy8gVGltZSB0byBzbG93bHkgbW92ZSBiYWNrIHVwIHRvIGZpbmQgYW55IHBvc2l0aW9uIHRvIG5hcnJvdyBkb3duIHRoZQorICAgICAgICAvLyB6ZXJvLgorICAgICAgICB0b3BfY2xhd19nb2FsXyArPSB2YWx1ZXMuY2xhdy5jbGF3X3plcm9pbmdfb2ZmX3NwZWVkICogZHQ7CisgICAgICAgIGJvdHRvbV9jbGF3X2dvYWxfICs9IHZhbHVlcy5jbGF3LmNsYXdfemVyb2luZ19vZmZfc3BlZWQgKiBkdDsKKyAgICAgICAgdG9wX2NsYXdfdmVsb2NpdHlfID0gYm90dG9tX2NsYXdfdmVsb2NpdHlfID0KKyAgICAgICAgICAgIHZhbHVlcy5jbGF3LmNsYXdfemVyb2luZ19vZmZfc3BlZWQ7CisgICAgICAgIExPRyhERUJVRywgIkJvdHRvbSBpcyBrbm93bi5cbiIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBkb24ndCBrbm93IHdoZXJlIGVpdGhlciBjbGF3IGlzLiAgU2xvd2x5IHN0YXJ0IG1vdmluZyBkb3duIHRvIGZpbmQKKyAgICAgIC8vIGFueSBoYWxsIGVmZmVjdC4KKyAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIHRvcF9jbGF3X2dvYWxfIC09IHZhbHVlcy5jbGF3LmNsYXdfemVyb2luZ19vZmZfc3BlZWQgKiBkdDsKKyAgICAgICAgYm90dG9tX2NsYXdfZ29hbF8gLT0gdmFsdWVzLmNsYXcuY2xhd196ZXJvaW5nX29mZl9zcGVlZCAqIGR0OworICAgICAgICB0b3BfY2xhd192ZWxvY2l0eV8gPSBib3R0b21fY2xhd192ZWxvY2l0eV8gPQorICAgICAgICAgICAgLXZhbHVlcy5jbGF3LmNsYXdfemVyb2luZ19vZmZfc3BlZWQ7CisgICAgICAgIExPRyhERUJVRywgIkJvdGggYXJlIHVua25vd24uXG4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocG9zaXRpb24pIHsKKyAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIHRvcF9jbGF3Xy5TZXRDYWxpYnJhdGlvbk9uRWRnZSgKKyAgICAgICAgICAgIHZhbHVlcy5jbGF3LnVwcGVyX2NsYXcsCisgICAgICAgICAgICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6QVBQUk9YSU1BVEVfQ0FMSUJSQVRJT04pOworICAgICAgICBib3R0b21fY2xhd18uU2V0Q2FsaWJyYXRpb25PbkVkZ2UoCisgICAgICAgICAgICB2YWx1ZXMuY2xhdy5sb3dlcl9jbGF3LAorICAgICAgICAgICAgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkFQUFJPWElNQVRFX0NBTElCUkFUSU9OKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE8oYXVzdGluKTogT25seSBjYWxpYnJhdGUgb24gdGhlIHByZWRldGVybWluZWQgZWRnZS4KKyAgICAgICAgLy8gV2UgbWlnaHQgYmUgYWJsZSB0byBqdXN0IGlnbm9yZSB0aGlzIHNpbmNlIHRoZSBiYWNrbGFzaCBpcyBzb29vbworICAgICAgICAvLyBsb3cuCisgICAgICAgIC8vIDopCisgICAgICAgIHRvcF9jbGF3Xy5TZXRDYWxpYnJhdGlvbk9uRWRnZSgKKyAgICAgICAgICAgIHZhbHVlcy5jbGF3LnVwcGVyX2NsYXcsCisgICAgICAgICAgICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6RElTQUJMRURfQ0FMSUJSQVRJT04pOworICAgICAgICBib3R0b21fY2xhd18uU2V0Q2FsaWJyYXRpb25PbkVkZ2UoCisgICAgICAgICAgICB2YWx1ZXMuY2xhdy5sb3dlcl9jbGF3LAorICAgICAgICAgICAgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkRJU0FCTEVEX0NBTElCUkFUSU9OKTsKKyAgICAgIH0KKyAgICB9CisgICAgbW9kZV8gPSBVTktOT1dOX0xPQ0FUSU9OOworICB9CisKKyAgLy8gTGltaXQgdGhlIGdvYWxzIGlmIGJvdGggY2xhd3MgaGF2ZSBiZWVuIChtb3N0bHkpIGZvdW5kLgorICBpZiAobW9kZV8gIT0gVU5LTk9XTl9MT0NBVElPTikgeworICAgIExpbWl0Q2xhd0dvYWwoJmJvdHRvbV9jbGF3X2dvYWxfLCAmdG9wX2NsYXdfZ29hbF8sIHZhbHVlcyk7CisgIH0KKworICBjbGF3Xy5zZXRfcG9zaXRpb25zX2tub3duKAorICAgICAgdG9wX2NsYXdfLnplcm9pbmdfc3RhdGUoKSAhPSBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6VU5LTk9XTl9QT1NJVElPTiwKKyAgICAgIGJvdHRvbV9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgIT0KKyAgICAgICAgICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6VU5LTk9XTl9QT1NJVElPTik7CisgIGlmIChoYXNfdG9wX2NsYXdfZ29hbF8gJiYgaGFzX2JvdHRvbV9jbGF3X2dvYWxfKSB7CisgICAgY2xhd18ubXV0YWJsZV9SKCkgPDwgYm90dG9tX2NsYXdfZ29hbF8sIHRvcF9jbGF3X2dvYWxfIC0gYm90dG9tX2NsYXdfZ29hbF8sCisgICAgICAgIGJvdHRvbV9jbGF3X3ZlbG9jaXR5XywgdG9wX2NsYXdfdmVsb2NpdHlfIC0gYm90dG9tX2NsYXdfdmVsb2NpdHlfOworICAgIExPR19NQVRSSVgoREVCVUcsICJhY3R1YWwgZ29hbCIsIGNsYXdfLlIoKSk7CisKKyAgICAvLyBPbmx5IGNhcCBwb3dlciB3aGVuIG9uZSBvZiB0aGUgaGFsdmVzIG9mIHRoZSBjbGF3IGlzIG1vdmluZyBzbG93bHkgYW5kCisgICAgLy8gY291bGQgd2luZCB1cC4KKyAgICBjbGF3Xy5zZXRfaXNfemVyb2luZyhtb2RlXyA9PSBVTktOT1dOX0xPQ0FUSU9OIHx8IG1vZGVfID09IEZJTkVfVFVORV9UT1AgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlXyA9PSBGSU5FX1RVTkVfQk9UVE9NKTsKKyAgICBjbGF3Xy5VcGRhdGUob3V0cHV0ID09IG51bGxwdHIpOworICB9IGVsc2UgeworICAgIGNsYXdfLlVwZGF0ZSh0cnVlKTsKKyAgfQorCisgIGNhcHBlZF9nb2FsXyA9IGZhbHNlOworICBzd2l0Y2ggKG1vZGVfKSB7CisgICAgY2FzZSBSRUFEWToKKyAgICBjYXNlIFBSRVBfRklORV9UVU5FX1RPUDoKKyAgICBjYXNlIFBSRVBfRklORV9UVU5FX0JPVFRPTToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklORV9UVU5FX0JPVFRPTToKKyAgICBjYXNlIEZJTkVfVFVORV9UT1A6CisgICAgY2FzZSBVTktOT1dOX0xPQ0FUSU9OOiB7CisgICAgICBpZiAoY2xhd18udW5jYXBwZWRfYXZlcmFnZV92b2x0YWdlKCkgPiB2YWx1ZXMuY2xhdy5tYXhfemVyb2luZ192b2x0YWdlKSB7CisgICAgICAgIGRvdWJsZSBkeF9ib3QgPSAoY2xhd18uVV91bmNhcHBlZCgwLCAwKSAtCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy5tYXhfemVyb2luZ192b2x0YWdlKSAvCisgICAgICAgICAgICAgICAgICAgIGNsYXdfLksoMCwgMCk7CisgICAgICAgIGRvdWJsZSBkeF90b3AgPSAoY2xhd18uVV91bmNhcHBlZCgxLCAwKSAtCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy5tYXhfemVyb2luZ192b2x0YWdlKSAvCisgICAgICAgICAgICAgICAgICAgIGNsYXdfLksoMCwgMCk7CisgICAgICAgIGRvdWJsZSBkeCA9IDo6c3RkOjptYXgoZHhfdG9wLCBkeF9ib3QpOworICAgICAgICBib3R0b21fY2xhd19nb2FsXyAtPSBkeDsKKyAgICAgICAgdG9wX2NsYXdfZ29hbF8gLT0gZHg7CisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPiBSOworICAgICAgICBSIDw8IGJvdHRvbV9jbGF3X2dvYWxfLCB0b3BfY2xhd19nb2FsXyAtIGJvdHRvbV9jbGF3X2dvYWxfLCBjbGF3Xy5SKDIsIDApLAorICAgICAgICAgICAgY2xhd18uUigzLCAwKTsKKyAgICAgICAgY2xhd18ubXV0YWJsZV9VKCkgPSBjbGF3Xy5LKCkgKiAoUiAtIGNsYXdfLlhfaGF0KCkpOworICAgICAgICBjYXBwZWRfZ29hbF8gPSB0cnVlOworICAgICAgICBMT0coREVCVUcsICJNb3ZpbmcgdGhlIGdvYWwgYnkgJWYgdG8gcHJldmVudCB3aW5kdXAuIgorICAgICAgICAgICAgIiBVbmNhcHBlZCBpcyAlZiwgbWF4IGlzICVmLCBkaWZmZXJlbmNlIGlzICVmXG4iLAorICAgICAgICAgICAgZHgsCisgICAgICAgICAgICBjbGF3Xy51bmNhcHBlZF9hdmVyYWdlX3ZvbHRhZ2UoKSwgdmFsdWVzLmNsYXcubWF4X3plcm9pbmdfdm9sdGFnZSwKKyAgICAgICAgICAgIChjbGF3Xy51bmNhcHBlZF9hdmVyYWdlX3ZvbHRhZ2UoKSAtCisgICAgICAgICAgICAgdmFsdWVzLmNsYXcubWF4X3plcm9pbmdfdm9sdGFnZSkpOworICAgICAgfSBlbHNlIGlmIChjbGF3Xy51bmNhcHBlZF9hdmVyYWdlX3ZvbHRhZ2UoKSA8CisgICAgICAgICAgICAgICAgIC12YWx1ZXMuY2xhdy5tYXhfemVyb2luZ192b2x0YWdlKSB7CisgICAgICAgIGRvdWJsZSBkeF9ib3QgPSAoY2xhd18uVV91bmNhcHBlZCgwLCAwKSArCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy5tYXhfemVyb2luZ192b2x0YWdlKSAvCisgICAgICAgICAgICAgICAgICAgIGNsYXdfLksoMCwgMCk7CisgICAgICAgIGRvdWJsZSBkeF90b3AgPSAoY2xhd18uVV91bmNhcHBlZCgxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy5tYXhfemVyb2luZ192b2x0YWdlKSAvCisgICAgICAgICAgICAgICAgICAgIGNsYXdfLksoMCwgMCk7CisgICAgICAgIGRvdWJsZSBkeCA9IDo6c3RkOjptaW4oZHhfdG9wLCBkeF9ib3QpOworICAgICAgICBib3R0b21fY2xhd19nb2FsXyAtPSBkeDsKKyAgICAgICAgdG9wX2NsYXdfZ29hbF8gLT0gZHg7CisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPiBSOworICAgICAgICBSIDw8IGJvdHRvbV9jbGF3X2dvYWxfLCB0b3BfY2xhd19nb2FsXyAtIGJvdHRvbV9jbGF3X2dvYWxfLCBjbGF3Xy5SKDIsIDApLAorICAgICAgICAgICAgY2xhd18uUigzLCAwKTsKKyAgICAgICAgY2xhd18ubXV0YWJsZV9VKCkgPSBjbGF3Xy5LKCkgKiAoUiAtIGNsYXdfLlhfaGF0KCkpOworICAgICAgICBjYXBwZWRfZ29hbF8gPSB0cnVlOworICAgICAgICBMT0coREVCVUcsICJNb3ZpbmcgdGhlIGdvYWwgYnkgJWYgdG8gcHJldmVudCB3aW5kdXBcbiIsIGR4KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICB9CisKKyAgaWYgKG91dHB1dCkgeworICAgIGlmIChnb2FsKSB7CisgICAgICAvL3NldHVwIHRoZSBpbnRha2UKKyAgICAgIG91dHB1dC0+aW50YWtlX3ZvbHRhZ2UgPQorICAgICAgICAgIChnb2FsLT5pbnRha2UgPiAxMi4wKSA/IDEyIDogKGdvYWwtPmludGFrZSA8IC0xMi4wKSA/IC0xMi4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ29hbC0+aW50YWtlOworICAgICAgb3V0cHV0LT50dXNrX3ZvbHRhZ2UgPSBnb2FsLT5jZW50ZXJpbmc7CisgICAgICBvdXRwdXQtPnR1c2tfdm9sdGFnZSA9CisgICAgICAgICAgKGdvYWwtPmNlbnRlcmluZyA+IDEyLjApID8gMTIgOiAoZ29hbC0+Y2VudGVyaW5nIDwgLTEyLjApCisgICAgICAgICAgICAgID8gLTEyLjAKKyAgICAgICAgICAgICAgOiBnb2FsLT5jZW50ZXJpbmc7CisgICAgfQorICAgIG91dHB1dC0+dG9wX2NsYXdfdm9sdGFnZSA9IGNsYXdfLlUoMSwgMCk7CisgICAgb3V0cHV0LT5ib3R0b21fY2xhd192b2x0YWdlID0gY2xhd18uVSgwLCAwKTsKKworICAgIGlmIChvdXRwdXQtPnRvcF9jbGF3X3ZvbHRhZ2UgPiBrTWF4Vm9sdGFnZSkgeworICAgICAgb3V0cHV0LT50b3BfY2xhd192b2x0YWdlID0ga01heFZvbHRhZ2U7CisgICAgfSBlbHNlIGlmIChvdXRwdXQtPnRvcF9jbGF3X3ZvbHRhZ2UgPCAta01heFZvbHRhZ2UpIHsKKyAgICAgIG91dHB1dC0+dG9wX2NsYXdfdm9sdGFnZSA9IC1rTWF4Vm9sdGFnZTsKKyAgICB9CisKKyAgICBpZiAob3V0cHV0LT5ib3R0b21fY2xhd192b2x0YWdlID4ga01heFZvbHRhZ2UpIHsKKyAgICAgIG91dHB1dC0+Ym90dG9tX2NsYXdfdm9sdGFnZSA9IGtNYXhWb2x0YWdlOworICAgIH0gZWxzZSBpZiAob3V0cHV0LT5ib3R0b21fY2xhd192b2x0YWdlIDwgLWtNYXhWb2x0YWdlKSB7CisgICAgICBvdXRwdXQtPmJvdHRvbV9jbGF3X3ZvbHRhZ2UgPSAta01heFZvbHRhZ2U7CisgICAgfQorICB9CisKKyAgc3RhdHVzLT5ib3R0b20gPSBib3R0b21fYWJzb2x1dGVfcG9zaXRpb24oKTsKKyAgc3RhdHVzLT5zZXBhcmF0aW9uID0gdG9wX2Fic29sdXRlX3Bvc2l0aW9uKCkgLSBib3R0b21fYWJzb2x1dGVfcG9zaXRpb24oKTsKKyAgc3RhdHVzLT5ib3R0b21fdmVsb2NpdHkgPSBjbGF3Xy5YX2hhdCgyLCAwKTsKKyAgc3RhdHVzLT5zZXBhcmF0aW9uX3ZlbG9jaXR5ID0gY2xhd18uWF9oYXQoMywgMCk7CisKKyAgaWYgKGdvYWwpIHsKKyAgICBib29sIGJvdHRvbV9kb25lID0KKyAgICAgICAgOjpzdGQ6OmFicyhib3R0b21fYWJzb2x1dGVfcG9zaXRpb24oKSAtIGdvYWwtPmJvdHRvbV9hbmdsZSkgPCAwLjAyMDsKKyAgICBib29sIGJvdHRvbV92ZWxvY2l0eV9kb25lID0gOjpzdGQ6OmFicyhzdGF0dXMtPmJvdHRvbV92ZWxvY2l0eSkgPCAwLjI7CisgICAgYm9vbCBzZXBhcmF0aW9uX2RvbmUgPQorICAgICAgICA6OnN0ZDo6YWJzKCh0b3BfYWJzb2x1dGVfcG9zaXRpb24oKSAtIGJvdHRvbV9hYnNvbHV0ZV9wb3NpdGlvbigpKSAtCisgICAgICAgICAgICAgICAgICAgZ29hbC0+c2VwYXJhdGlvbl9hbmdsZSkgPCAwLjAyMDsKKyAgICBib29sIHNlcGFyYXRpb25fZG9uZV93aXRoX2JhbGwgPQorICAgICAgICA6OnN0ZDo6YWJzKCh0b3BfYWJzb2x1dGVfcG9zaXRpb24oKSAtIGJvdHRvbV9hYnNvbHV0ZV9wb3NpdGlvbigpKSAtCisgICAgICAgICAgICAgICAgICAgZ29hbC0+c2VwYXJhdGlvbl9hbmdsZSkgPCAwLjA2OworICAgIHN0YXR1cy0+ZG9uZSA9IGlzX3JlYWR5KCkgJiYgc2VwYXJhdGlvbl9kb25lICYmIGJvdHRvbV9kb25lICYmIGJvdHRvbV92ZWxvY2l0eV9kb25lOworICAgIHN0YXR1cy0+ZG9uZV93aXRoX2JhbGwgPQorICAgICAgICBpc19yZWFkeSgpICYmIHNlcGFyYXRpb25fZG9uZV93aXRoX2JhbGwgJiYgYm90dG9tX2RvbmUgJiYgYm90dG9tX3ZlbG9jaXR5X2RvbmU7CisgIH0gZWxzZSB7CisgICAgc3RhdHVzLT5kb25lID0gc3RhdHVzLT5kb25lX3dpdGhfYmFsbCA9IGZhbHNlOworICB9CisKKyAgc3RhdHVzLT56ZXJvZWQgPSBpc19yZWFkeSgpOworICBzdGF0dXMtPnplcm9lZF9mb3JfYXV0byA9CisgICAgICAodG9wX2NsYXdfLnplcm9pbmdfc3RhdGUoKSA9PSBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6Q0FMSUJSQVRFRCB8fAorICAgICAgIHRvcF9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgPT0KKyAgICAgICAgICAgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkRJU0FCTEVEX0NBTElCUkFUSU9OKSAmJgorICAgICAgKGJvdHRvbV9jbGF3Xy56ZXJvaW5nX3N0YXRlKCkgPT0gWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkNBTElCUkFURUQgfHwKKyAgICAgICBib3R0b21fY2xhd18uemVyb2luZ19zdGF0ZSgpID09CisgICAgICAgICAgIFplcm9lZFN0YXRlRmVlZGJhY2tMb29wOjpESVNBQkxFRF9DQUxJQlJBVElPTik7CisKKyAgd2FzX2VuYWJsZWRfID0gZW5hYmxlZDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKwpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwIGIveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmE3YzUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXAKQEAgLTAsMCArMSw5OSBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncmVwbGF5X2NsYXcnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnbm9fcnN5bmMnOiAxLAorICAgICAgfSwKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAncmVwbGF5X2NsYXcuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdjbGF3X3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnJlcGxheV9jb250cm9sX2xvb3AnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NsYXdfcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ2NsYXcucSddLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9wYXRoJzogJ3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdycsCisgICAgICB9LAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6cXVldWVzJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6cXVldWVzJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NsYXdfbGliJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY2xhdy5jYycsCisgICAgICAgICdjbGF3X21vdG9yX3BsYW50LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnY2xhd19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgICAnPChERVBUSCkveTIwMTQveTIwMTQuZ3lwOmNvbnN0YW50cycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnBvbHl0b3BlJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOmNvZXJjZV9nb2FsJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cDpxdWV1ZV9sb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cDptYXRyaXhfbG9nZ2luZycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICdjbGF3X3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnBvbHl0b3BlJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOmNvZXJjZV9nb2FsJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY2xhd19saWJfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY2xhd19saWJfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdjbGF3X3F1ZXVlJywKKyAgICAgICAgJ2NsYXdfbGliJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3Rlc3QnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdjbGF3X2NhbGlicmF0aW9uJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjbGF3X2NhbGlicmF0aW9uLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICdjbGF3X3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS95MjAxNC95MjAxNC5neXA6Y29uc3RhbnRzJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY2xhdycsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY2xhd19tYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICdjbGF3X2xpYicsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5oIGIveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQzOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuaApAQCAtMCwwICsxLDI2NSBAQAorI2lmbmRlZiBZMjAxNF9DT05UUk9MX0xPT1BTX0NMQVdfQ0xBV19IXworI2RlZmluZSBZMjAxNF9DT05UUk9MX0xPT1BTX0NMQVdfQ0xBV19IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3BvbHl0b3BlLmgiCisjaW5jbHVkZSAieTIwMTQvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2NvZXJjZV9nb2FsLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucS5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X21vdG9yX3BsYW50LmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvaGFsbF9lZmZlY3RfdHJhY2tlci5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK2NsYXNzIFdpbmR1cENsYXdUZXN0OworfTsKKworLy8gTm90ZTogRXZlcnl0aGluZyBpbiB0aGlzIGZpbGUgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgMSBjeWNsZSBkZWxheSBiZXR3ZWVuCisvLyBwb3dlciBiZWluZyByZXF1ZXN0ZWQgYW5kIGl0IHNob3dpbmcgdXAgYXQgdGhlIG1vdG9yLiAgSXQgYXNzdW1lcyB0aGF0CisvLyBYX2hhdCgyLCAxKSBpcyB0aGUgdm9sdGFnZSBiZWluZyBhcHBsaWVkIGFzIHdlbGwuICBJdCB3aWxsIGdvIHVuc3RhYmxlIGlmCisvLyB0aGF0IGlzbid0IHRydWUuCisKK2NsYXNzIENsYXdMaW1pdGVkTG9vcCA6IHB1YmxpYyBTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPiB7CisgcHVibGljOgorICBDbGF3TGltaXRlZExvb3AoU3RhdGVGZWVkYmFja0xvb3A8NCwgMiwgMj4gJiZsb29wKTsKKyAgdmlydHVhbCB2b2lkIENhcFUoKTsKKworICB2b2lkIHNldF9pc196ZXJvaW5nKGJvb2wgaXNfemVyb2luZykgeyBpc196ZXJvaW5nXyA9IGlzX3plcm9pbmc7IH0KKyAgdm9pZCBzZXRfcG9zaXRpb25zX2tub3duKGJvb2wgdG9wX2tub3duLCBib29sIGJvdHRvbV9rbm93bikgeworICAgIHRvcF9rbm93bl8gPSB0b3Bfa25vd247CisgICAgYm90dG9tX2tub3duXyA9IGJvdHRvbV9rbm93bjsKKyAgfQorCisgIHZvaWQgQ2hhbmdlVG9wT2Zmc2V0KGRvdWJsZSBkb2Zmc2V0KTsKKyAgdm9pZCBDaGFuZ2VCb3R0b21PZmZzZXQoZG91YmxlIGRvZmZzZXQpOworCisgIGRvdWJsZSB1bmNhcHBlZF9hdmVyYWdlX3ZvbHRhZ2UoKSBjb25zdCB7IHJldHVybiB1bmNhcHBlZF9hdmVyYWdlX3ZvbHRhZ2VfOyB9CisKKyBwcml2YXRlOgorICBkb3VibGUgdW5jYXBwZWRfYXZlcmFnZV92b2x0YWdlXzsKKyAgYm9vbCBpc196ZXJvaW5nXzsKKworICBib29sIHRvcF9rbm93bl8gPSBmYWxzZSwgYm90dG9tX2tub3duXyA9IGZhbHNlOworCisgIGNvbnN0IDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IFVfUG9seV8sIFVfUG9seV96ZXJvaW5nXzsKK307CisKK2NsYXNzIENsYXdNb3RvcjsKKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBDYXBVIGZ1bmN0aW9uIGNvcnJlY3RseSBnaXZlbiBhbGwgdGhlIGV4dHJhCisvLyBpbmZvcm1hdGlvbiB0aGF0IHdlIGtub3cgYWJvdXQgZnJvbSB0aGUgd3Jpc3QgbW90b3IuCisvLyBJdCBkb2VzIG5vdCBoYXZlIGFueSB6ZXJvaW5nIGxvZ2ljIGluIGl0LCBvbmx5IGxvZ2ljIHRvIGRlYWwgd2l0aCBhIGRlbHRhIFUKKy8vIGNvbnRyb2xsZXIuCitjbGFzcyBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcCB7CisgcHVibGljOgorICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcChjb25zdCBjaGFyICpuYW1lLCBDbGF3TW90b3IgKm1vdG9yKTsKKworICBjb25zdCBzdGF0aWMgaW50IGtaZXJvaW5nTWF4Vm9sdGFnZSA9IDU7CisKKyAgZW51bSBKb2ludFplcm9pbmdTdGF0ZSB7CisgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgam9pbnQgaXMgYXQgYWxsLgorICAgIFVOS05PV05fUE9TSVRJT04sCisgICAgLy8gV2UgaGF2ZSBhbiBhcHByb3hpbWF0ZSBwb3NpdGlvbiBmb3Igd2hlcmUgdGhlIGNsYXcgaXMgdXNpbmcuCisgICAgQVBQUk9YSU1BVEVfQ0FMSUJSQVRJT04sCisgICAgLy8gV2Ugb2JzZXJ2ZWQgdGhlIGNhbGlicmF0aW9uIGVkZ2Ugd2hpbGUgZGlzYWJsZWQuIFRoaXMgaXMgZ29vZCBlbm91Z2ggZm9yCisgICAgLy8gYXV0b25vbW91cyBtb2RlLgorICAgIERJU0FCTEVEX0NBTElCUkFUSU9OLAorICAgIC8vIFJlYWR5IGZvciB1c2UgZHVyaW5nIHRlbGVvcC4KKyAgICBDQUxJQlJBVEVECisgIH07CisKKyAgdm9pZCBzZXRfemVyb2luZ19zdGF0ZShKb2ludFplcm9pbmdTdGF0ZSB6ZXJvaW5nX3N0YXRlKSB7CisgICAgemVyb2luZ19zdGF0ZV8gPSB6ZXJvaW5nX3N0YXRlOworICB9CisgIEpvaW50WmVyb2luZ1N0YXRlIHplcm9pbmdfc3RhdGUoKSBjb25zdCB7IHJldHVybiB6ZXJvaW5nX3N0YXRlXzsgfQorCisgIHZvaWQgU2V0UG9zaXRpb25WYWx1ZXMoY29uc3QgSGFsZkNsYXdQb3NpdGlvbiAmY2xhdyk7CisKKyAgdm9pZCBSZXNldChjb25zdCBIYWxmQ2xhd1Bvc2l0aW9uICZjbGF3KTsKKworICBkb3VibGUgYWJzb2x1dGVfcG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBlbmNvZGVyKCkgKyBvZmZzZXQoKTsgfQorCisgIGNvbnN0IEhhbGxFZmZlY3RUcmFja2VyICZmcm9udCgpIGNvbnN0IHsgcmV0dXJuIGZyb250XzsgfQorICBjb25zdCBIYWxsRWZmZWN0VHJhY2tlciAmY2FsaWJyYXRpb24oKSBjb25zdCB7IHJldHVybiBjYWxpYnJhdGlvbl87IH0KKyAgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJmJhY2soKSBjb25zdCB7IHJldHVybiBiYWNrXzsgfQorCisgIGJvb2wgYW55X2hhbGxfZWZmZWN0X2NoYW5nZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZyb250KCkuZWl0aGVyX2NvdW50X2NoYW5nZWQoKSB8fAorICAgICAgICAgICBjYWxpYnJhdGlvbigpLmVpdGhlcl9jb3VudF9jaGFuZ2VkKCkgfHwKKyAgICAgICAgICAgYmFjaygpLmVpdGhlcl9jb3VudF9jaGFuZ2VkKCk7CisgIH0KKyAgYm9vbCBmcm9udF9vcl9iYWNrX3RyaWdnZXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZnJvbnQoKS52YWx1ZSgpIHx8IGJhY2soKS52YWx1ZSgpOworICB9CisgIGJvb2wgYW55X3RyaWdnZXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FsaWJyYXRpb24oKS52YWx1ZSgpIHx8IGZyb250KCkudmFsdWUoKSB8fCBiYWNrKCkudmFsdWUoKTsKKyAgfQorCisgIGRvdWJsZSBlbmNvZGVyKCkgY29uc3QgeyByZXR1cm4gZW5jb2Rlcl87IH0KKyAgZG91YmxlIGxhc3RfZW5jb2RlcigpIGNvbnN0IHsgcmV0dXJuIGxhc3RfZW5jb2Rlcl87IH0KKworICBkb3VibGUgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gb2Zmc2V0XzsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbiBlZGdlIHdhcyBkZXRlY3RlZCBpbiB0aGUgbGFzdCBjeWNsZSBhbmQgdGhlbiBzZXRzIHRoZQorICAvLyBlZGdlX3Bvc2l0aW9uIHRvIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgZWRnZS4KKyAgYm9vbCBHZXRQb3NpdGlvbk9mRWRnZShjb25zdCBjb25zdGFudHM6OlZhbHVlczo6Q2xhd3M6OkNsYXcgJmNsYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICplZGdlX2VuY29kZXIsIGRvdWJsZSAqZWRnZV9hbmdsZSk7CisKKyAgYm9vbCBTYXdGaWx0ZXJlZFBvc2VkZ2UoY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnRoaXNfc2Vuc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIYWxsRWZmZWN0VHJhY2tlciAmc2Vuc29yQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnNlbnNvckIpOworCisgIGJvb2wgU2F3RmlsdGVyZWROZWdlZGdlKGNvbnN0IEhhbGxFZmZlY3RUcmFja2VyICZ0aGlzX3NlbnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnNlbnNvckEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhhbGxFZmZlY3RUcmFja2VyICZzZW5zb3JCKTsKKworI3VuZGVmIENPVU5UX1NFVFRFUl9HRVRURVIKKworIHByb3RlY3RlZDoKKyAgLy8gVGhlIGFjY3VtdWxhdGVkIHZvbHRhZ2UgdG8gYXBwbHkgdG8gdGhlIG1vdG9yLgorICBkb3VibGUgb2Zmc2V0XzsKKyAgY29uc3QgY2hhciAqbmFtZV87CisKKyAgQ2xhd01vdG9yICptb3Rvcl87CisKKyAgSGFsbEVmZmVjdFRyYWNrZXIgZnJvbnRfLCBjYWxpYnJhdGlvbl8sIGJhY2tfOworCisgIEpvaW50WmVyb2luZ1N0YXRlIHplcm9pbmdfc3RhdGVfOworICBkb3VibGUgbWluX2hhbGxfZWZmZWN0X29uX2FuZ2xlXzsKKyAgZG91YmxlIG1heF9oYWxsX2VmZmVjdF9vbl9hbmdsZV87CisgIGRvdWJsZSBtaW5faGFsbF9lZmZlY3Rfb2ZmX2FuZ2xlXzsKKyAgZG91YmxlIG1heF9oYWxsX2VmZmVjdF9vZmZfYW5nbGVfOworICBkb3VibGUgZW5jb2Rlcl87CisgIGRvdWJsZSBsYXN0X2VuY29kZXJfOworICBkb3VibGUgbGFzdF9vbl9lbmNvZGVyXzsKKyAgZG91YmxlIGxhc3Rfb2ZmX2VuY29kZXJfOworICBib29sIGFueV90cmlnZ2VyZWRfbGFzdF87CisKKyAgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIqIHBvc2VkZ2VfZmlsdGVyXyA9IG51bGxwdHI7CisgIGNvbnN0IEhhbGxFZmZlY3RUcmFja2VyKiBuZWdlZGdlX2ZpbHRlcl8gPSBudWxscHRyOworCisgcHJpdmF0ZToKKyAgLy8gRG9lcyB0aGUgZWRnZXMgb2YgMSBzZW5zb3IgZm9yIEdldFBvc2l0aW9uT2ZFZGdlLgorICBib29sIERvR2V0UG9zaXRpb25PZkVkZ2UoY29uc3QgY29uc3RhbnRzOjpWYWx1ZXM6OkNsYXdzOjpBbmdsZVBhaXIgJmFuZ2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqZWRnZV9lbmNvZGVyLCBkb3VibGUgKmVkZ2VfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIYWxsRWZmZWN0VHJhY2tlciAmc2Vuc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGFsbEVmZmVjdFRyYWNrZXIgJnNlbnNvckEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIYWxsRWZmZWN0VHJhY2tlciAmc2Vuc29yQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhhbGxfZWZmZWN0X25hbWUpOworfTsKKworY2xhc3MgVG9wWmVyb2VkU3RhdGVGZWVkYmFja0xvb3AgOiBwdWJsaWMgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3AgeworIHB1YmxpYzoKKyAgVG9wWmVyb2VkU3RhdGVGZWVkYmFja0xvb3AoQ2xhd01vdG9yICptb3RvcikKKyAgICAgIDogWmVyb2VkU3RhdGVGZWVkYmFja0xvb3AoInRvcCIsIG1vdG9yKSB7fQorICAvLyBTZXRzIHRoZSBjYWxpYnJhdGlvbiBvZmZzZXQgZ2l2ZW4gdGhlIGFic29sdXRlIGFuZ2xlIGFuZCB0aGUgY29ycmVzcG9uZGluZworICAvLyBlbmNvZGVyIHZhbHVlLgorICB2b2lkIFNldENhbGlicmF0aW9uKGRvdWJsZSBlZGdlX2VuY29kZXIsIGRvdWJsZSBlZGdlX2FuZ2xlKTsKKworICBib29sIFNldENhbGlicmF0aW9uT25FZGdlKGNvbnN0IGNvbnN0YW50czo6VmFsdWVzOjpDbGF3czo6Q2xhdyAmY2xhd192YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbnRaZXJvaW5nU3RhdGUgemVyb2luZ19zdGF0ZSk7CisgIGRvdWJsZSBDb21wdXRlQ2FsaWJyYXRpb25DaGFuZ2UoZG91YmxlIGVkZ2VfZW5jb2RlciwgZG91YmxlIGVkZ2VfYW5nbGUpOworICB2b2lkIEhhbmRsZUNhbGlicmF0aW9uRXJyb3IoCisgICAgICBjb25zdCBjb25zdGFudHM6OlZhbHVlczo6Q2xhd3M6OkNsYXcgJmNsYXdfdmFsdWVzKTsKK307CisKK2NsYXNzIEJvdHRvbVplcm9lZFN0YXRlRmVlZGJhY2tMb29wIDogcHVibGljIFplcm9lZFN0YXRlRmVlZGJhY2tMb29wIHsKKyBwdWJsaWM6CisgIEJvdHRvbVplcm9lZFN0YXRlRmVlZGJhY2tMb29wKENsYXdNb3RvciAqbW90b3IpCisgICAgICA6IFplcm9lZFN0YXRlRmVlZGJhY2tMb29wKCJib3R0b20iLCBtb3Rvcikge30KKyAgLy8gU2V0cyB0aGUgY2FsaWJyYXRpb24gb2Zmc2V0IGdpdmVuIHRoZSBhYnNvbHV0ZSBhbmdsZSBhbmQgdGhlIGNvcnJpc3BvbmRpbmcKKyAgLy8gZW5jb2RlciB2YWx1ZS4KKyAgdm9pZCBTZXRDYWxpYnJhdGlvbihkb3VibGUgZWRnZV9lbmNvZGVyLCBkb3VibGUgZWRnZV9hbmdsZSk7CisKKyAgYm9vbCBTZXRDYWxpYnJhdGlvbk9uRWRnZShjb25zdCBjb25zdGFudHM6OlZhbHVlczo6Q2xhd3M6OkNsYXcgJmNsYXdfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW50WmVyb2luZ1N0YXRlIHplcm9pbmdfc3RhdGUpOworICBkb3VibGUgQ29tcHV0ZUNhbGlicmF0aW9uQ2hhbmdlKGRvdWJsZSBlZGdlX2VuY29kZXIsIGRvdWJsZSBlZGdlX2FuZ2xlKTsKKyAgdm9pZCBIYW5kbGVDYWxpYnJhdGlvbkVycm9yKAorICAgICAgY29uc3QgY29uc3RhbnRzOjpWYWx1ZXM6OkNsYXdzOjpDbGF3ICZjbGF3X3ZhbHVlcyk7Cit9OworCitjbGFzcyBDbGF3TW90b3IgOiBwdWJsaWMgYW9zOjpjb250cm9sczo6Q29udHJvbExvb3A8Y29udHJvbF9sb29wczo6Q2xhd1F1ZXVlPiB7CisgcHVibGljOgorICBleHBsaWNpdCBDbGF3TW90b3IoY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlICpteV9jbGF3ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZSk7CisKKyAgLy8gVHJ1ZSBpZiB0aGUgc3RhdGUgbWFjaGluZSBpcyByZWFkeS4KKyAgYm9vbCBjYXBwZWRfZ29hbCgpIGNvbnN0IHsgcmV0dXJuIGNhcHBlZF9nb2FsXzsgfQorCisgIGRvdWJsZSB1bmNhcHBlZF9hdmVyYWdlX3ZvbHRhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGNsYXdfLnVuY2FwcGVkX2F2ZXJhZ2Vfdm9sdGFnZSgpOworICB9CisKKyAgLy8gVHJ1ZSBpZiB0aGUgY2xhdyBpcyB6ZXJvaW5nLgorICBib29sIGlzX3plcm9pbmcoKSBjb25zdDsKKworICAvLyBUcnVlIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIHJlYWR5LgorICBib29sIGlzX3JlYWR5KCkgY29uc3Q7CisKKyAgdm9pZCBDaGFuZ2VUb3BPZmZzZXQoZG91YmxlIGRvZmZzZXQpOworICB2b2lkIENoYW5nZUJvdHRvbU9mZnNldChkb3VibGUgZG9mZnNldCk7CisKKyAgZW51bSBDYWxpYnJhdGlvbk1vZGUgeworICAgIFJFQURZLAorICAgIFBSRVBfRklORV9UVU5FX1RPUCwKKyAgICBGSU5FX1RVTkVfVE9QLAorICAgIFBSRVBfRklORV9UVU5FX0JPVFRPTSwKKyAgICBGSU5FX1RVTkVfQk9UVE9NLAorICAgIFVOS05PV05fTE9DQVRJT04KKyAgfTsKKworICBDYWxpYnJhdGlvbk1vZGUgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1vZGVfOyB9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBSdW5JdGVyYXRpb24oY29uc3QgY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlOjpHb2FsICpnb2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6T3V0cHV0ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlOjpTdGF0dXMgKnN0YXR1cyk7CisKKyAgZG91YmxlIHRvcF9hYnNvbHV0ZV9wb3NpdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2xhd18uWF9oYXQoMSwgMCkgKyBjbGF3Xy5YX2hhdCgwLCAwKTsKKyAgfQorICBkb3VibGUgYm90dG9tX2Fic29sdXRlX3Bvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gY2xhd18uWF9oYXQoMCwgMCk7IH0KKworIHByaXZhdGU6CisgIC8vIEZyaWVuZCB0aGUgdGVzdCBjbGFzc2VzIGZvciBhY2NlcyB0byB0aGUgaW50ZXJuYWwgc3RhdGUuCisgIGZyaWVuZCBjbGFzcyB0ZXN0aW5nOjpXaW5kdXBDbGF3VGVzdDsKKworICAvLyBUaGUgemVyb2VkIGpvaW50IHRvIHVzZS4KKyAgYm9vbCBoYXNfdG9wX2NsYXdfZ29hbF87CisgIGRvdWJsZSB0b3BfY2xhd19nb2FsXzsKKyAgVG9wWmVyb2VkU3RhdGVGZWVkYmFja0xvb3AgdG9wX2NsYXdfOworCisgIGJvb2wgaGFzX2JvdHRvbV9jbGF3X2dvYWxfOworICBkb3VibGUgYm90dG9tX2NsYXdfZ29hbF87CisgIEJvdHRvbVplcm9lZFN0YXRlRmVlZGJhY2tMb29wIGJvdHRvbV9jbGF3XzsKKworICAvLyBUaGUgY2xhdyBsb29wLgorICBDbGF3TGltaXRlZExvb3AgY2xhd187CisKKyAgYm9vbCB3YXNfZW5hYmxlZF87CisgIGJvb2wgZG9pbmdfY2FsaWJyYXRpb25fZmluZV90dW5lXzsKKworICAvLyBUaGUgaW5pdGlhbCBzZXBhcmF0aW9uIHdoZW4gZGlzYWJsZWQuICBVc2VkIGFzIHRoZSBzYWZlIHNlcGFyYXRpb24KKyAgLy8gZGlzdGFuY2UuCisgIGRvdWJsZSBpbml0aWFsX3NlcGFyYXRpb25fOworCisgIGJvb2wgY2FwcGVkX2dvYWxfOworICBDYWxpYnJhdGlvbk1vZGUgbW9kZV87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENsYXdNb3Rvcik7Cit9OworCisvLyBNb2RpZmllcyB0aGUgYm90dG9tIGFuZCB0b3AgZ29hbCBzdWNoIHRoYXQgdGhleSBhcmUgd2l0aGluIHRoZSBsaW1pdHMgYW5kCisvLyB0aGVpciBzZXBhcmF0aW9uIGlzbid0IHRvbyBtdWNoIG9yIGxpdHRsZS4KK3ZvaWQgTGltaXRDbGF3R29hbChkb3VibGUgKmJvdHRvbV9nb2FsLCBkb3VibGUgKnRvcF9nb2FsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYzk3MTo6Y29uc3RhbnRzOjpWYWx1ZXMgJnZhbHVlcyk7CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTRfQ09OVFJPTF9MT09QU19DTEFXX0NMQVdfSF8KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LnEgYi95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTY5NzAKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xCkBAIC0wLDAgKzEsNzUgQEAKK3BhY2thZ2UgZnJjOTcxLmNvbnRyb2xfbG9vcHM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BzLnEiOworaW1wb3J0ICJmcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEiOworCitzdHJ1Y3QgSGFsZkNsYXdQb3NpdGlvbiB7CisgIC8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgaGFsZiBvZiB0aGUgY2xhdy4KKyAgZG91YmxlIHBvc2l0aW9uOworCisgIC8vIFRoZSBoYWxsIGVmZmVjdCBzZW5zb3IgYXQgdGhlIGZyb250IGxpbWl0LgorICBIYWxsRWZmZWN0U3RydWN0IGZyb250OworICAvLyBUaGUgaGFsbCBlZmZlY3Qgc2Vuc29yIGluIHRoZSBtaWRkbGUgdG8gdXNlIGZvciByZWFsIGNhbGlicmF0aW9uLgorICBIYWxsRWZmZWN0U3RydWN0IGNhbGlicmF0aW9uOworICAvLyBUaGUgaGFsbCBlZmZlY3QgYXQgdGhlIGJhY2sgbGltaXQuCisgIEhhbGxFZmZlY3RTdHJ1Y3QgYmFjazsKK307CisKKy8vIEFsbCBhbmdsZXMgaGVyZSBhcmUgMCB2ZXJ0aWNhbCwgcG9zaXRpdmUgInVwIiAoYWthIGJhY2t3YXJkcykuCitxdWV1ZV9ncm91cCBDbGF3UXVldWUgeworICBpbXBsZW1lbnRzIGFvcy5jb250cm9sX2xvb3BzLkNvbnRyb2xMb29wOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgLy8gVGhlIGFuZ2xlIG9mIHRoZSBib3R0b20gY2xhdy4KKyAgICBkb3VibGUgYm90dG9tX2FuZ2xlOworICAgIC8vIEhvdyBtdWNoIGhpZ2hlciB0aGUgdG9wIGNsYXcgaXMuCisgICAgZG91YmxlIHNlcGFyYXRpb25fYW5nbGU7CisgICAgLy8gdG9wIGNsYXcgaW50YWtlIHJvbGxlcgorICAgIGRvdWJsZSBpbnRha2U7CisgICAgLy8gYm90dG9tIGNsYXcgdHVzayBjZW50ZXJpbmcKKyAgICBkb3VibGUgY2VudGVyaW5nOworICB9OworCisgIG1lc3NhZ2UgUG9zaXRpb24geworICAgIC8vIEFsbCB0aGUgdG9wIGNsYXcgaW5mb3JtYXRpb24uCisgICAgSGFsZkNsYXdQb3NpdGlvbiB0b3A7CisgICAgLy8gQWxsIHRoZSBib3R0b20gY2xhdyBpbmZvcm1hdGlvbi4KKyAgICBIYWxmQ2xhd1Bvc2l0aW9uIGJvdHRvbTsKKyAgfTsKKworICBtZXNzYWdlIE91dHB1dCB7CisgICAgZG91YmxlIGludGFrZV92b2x0YWdlOworICAgIGRvdWJsZSB0b3BfY2xhd192b2x0YWdlOworICAgIGRvdWJsZSBib3R0b21fY2xhd192b2x0YWdlOworICAgIGRvdWJsZSB0dXNrX3ZvbHRhZ2U7CisgIH07CisKKyAgbWVzc2FnZSBTdGF0dXMgeworICAgIC8vIFRydWUgaWYgemVyb2VkIGVub3VnaCBmb3IgdGhlIGN1cnJlbnQgcGVyaW9kIChhdXRvbm9tb3VzIG9yIHRlbGVvcCkuCisgICAgYm9vbCB6ZXJvZWQ7CisgICAgLy8gVHJ1ZSBpZiB6ZXJvZWQgYXMgbXVjaCBhcyB3ZSB3aWxsIGZvcmNlIGR1cmluZyBhdXRvbm9tb3VzLgorICAgIGJvb2wgemVyb2VkX2Zvcl9hdXRvOworICAgIC8vIFRydWUgaWYgemVyb2VkIGFuZCB3aXRoaW4gdG9sZXJhbmNlIGZvciBzZXBhcmF0aW9uIGFuZCBib3R0b20gYW5nbGUuCisgICAgYm9vbCBkb25lOworICAgIC8vIFRydWUgaWYgemVyb2VkIGFuZCB3aXRoaW4gdG9sZXJhbmNlIGZvciBzZXBhcmF0aW9uIGFuZCBib3R0b20gYW5nbGUuCisgICAgLy8gc2VwZXJhdGlvbiBhbGxvd2FuY2UgbXVjaCB3aWRlciBhcyBhIGJhbGwgbWF5IGJlIGluY2x1ZGVkCisgICAgYm9vbCBkb25lX3dpdGhfYmFsbDsKKyAgICAvLyBEdW1wIHRoZSB2YWx1ZXMgb2YgdGhlIHN0YXRlIG1hdHJpeC4KKyAgICBkb3VibGUgYm90dG9tOworICAgIGRvdWJsZSBib3R0b21fdmVsb2NpdHk7CisgICAgZG91YmxlIHNlcGFyYXRpb247CisgICAgZG91YmxlIHNlcGFyYXRpb25fdmVsb2NpdHk7CisgIH07CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBQb3NpdGlvbiBwb3NpdGlvbjsKKyAgcXVldWUgT3V0cHV0IG91dHB1dDsKKyAgcXVldWUgU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIENsYXdRdWV1ZSBjbGF3X3F1ZXVlOworCitzdHJ1Y3QgQ2xhd1Bvc2l0aW9uVG9Mb2cgeworCWRvdWJsZSB0b3A7CisJZG91YmxlIGJvdHRvbTsKK307CmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19jYWxpYnJhdGlvbi5jYyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X2NhbGlicmF0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmE5NDAKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19jYWxpYnJhdGlvbi5jYwpAQCAtMCwwICsxLDMxNSBAQAorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEuaCIKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb25zdGFudHMuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CisKK3R5cGVkZWYgY29uc3RhbnRzOjpWYWx1ZXM6OkNsYXdzIENsYXdzOworCitjbGFzcyBTZW5zb3IgeworIHB1YmxpYzoKKyAgU2Vuc29yKGNvbnN0IGRvdWJsZSBzdGFydF9wb3NpdGlvbiwKKyAgICAgICAgIGNvbnN0IEhhbGxFZmZlY3RTdHJ1Y3QgJmluaXRpYWxfaGFsbF9lZmZlY3QpCisgICAgICA6IHN0YXJ0X3Bvc2l0aW9uXyhzdGFydF9wb3NpdGlvbiksCisgICAgICAgIGxhc3RfaGFsbF9lZmZlY3RfKGluaXRpYWxfaGFsbF9lZmZlY3QpLAorICAgICAgICBsYXN0X3Bvc2VkZ2VfY291bnRfKGluaXRpYWxfaGFsbF9lZmZlY3QucG9zZWRnZV9jb3VudCksCisgICAgICAgIGxhc3RfbmVnZWRnZV9jb3VudF8oaW5pdGlhbF9oYWxsX2VmZmVjdC5uZWdlZGdlX2NvdW50KSB7CisgICAgbGFzdF9vbl9taW5fcG9zaXRpb25fID0gc3RhcnRfcG9zaXRpb247CisgICAgbGFzdF9vbl9tYXhfcG9zaXRpb25fID0gc3RhcnRfcG9zaXRpb247CisgICAgbGFzdF9vZmZfbWluX3Bvc2l0aW9uXyA9IHN0YXJ0X3Bvc2l0aW9uOworICAgIGxhc3Rfb2ZmX21heF9wb3NpdGlvbl8gPSBzdGFydF9wb3NpdGlvbjsKKyAgfQorCisgIGJvb2wgRG9HZXRQb3NpdGlvbk9mRWRnZSgKKyAgICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OkhhbGZDbGF3UG9zaXRpb24gJmNsYXdfcG9zaXRpb24sCisgICAgICBjb25zdCBIYWxsRWZmZWN0U3RydWN0ICZoYWxsX2VmZmVjdCwgQ2xhd3M6OkFuZ2xlUGFpciAqbGltaXRzKSB7CisgICAgYm9vbCBwcmludCA9IGZhbHNlOworCisgICAgaWYgKGhhbGxfZWZmZWN0LnBvc2VkZ2VfY291bnQgIT0gbGFzdF9wb3NlZGdlX2NvdW50XykgeworICAgICAgY29uc3QgZG91YmxlIGF2Z19vZmZfcG9zaXRpb24gPQorICAgICAgICAgIChsYXN0X29mZl9taW5fcG9zaXRpb25fICsgbGFzdF9vZmZfbWF4X3Bvc2l0aW9uXykgLyAyLjA7CisgICAgICBpZiAoaGFsbF9lZmZlY3QucG9zZWRnZV92YWx1ZSA8IGF2Z19vZmZfcG9zaXRpb24pIHsKKyAgICAgICAgcHJpbnRmKCJQb3NlZGdlIHVwcGVyIGN1cnJlbnQgJWYgcG9zZWRnZSAlZiBhdmdfb2ZmICVmIFslZiwgJWZdXG4iLAorICAgICAgICAgICAgICAgY2xhd19wb3NpdGlvbi5wb3NpdGlvbiwgaGFsbF9lZmZlY3QucG9zZWRnZV92YWx1ZSwKKyAgICAgICAgICAgICAgIGF2Z19vZmZfcG9zaXRpb24sIGxhc3Rfb2ZmX21pbl9wb3NpdGlvbl8sCisgICAgICAgICAgICAgICBsYXN0X29mZl9tYXhfcG9zaXRpb25fKTsKKyAgICAgICAgbGltaXRzLT51cHBlcl9kZWNyZWFzaW5nX2FuZ2xlID0KKyAgICAgICAgICAgIGhhbGxfZWZmZWN0LnBvc2VkZ2VfdmFsdWUgLSBzdGFydF9wb3NpdGlvbl87CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlBvc2VkZ2UgbG93ZXIgY3VycmVudCAlZiBwb3NlZGdlICVmIGF2Z19vZmYgJWYgWyVmLCAlZl1cbiIsCisgICAgICAgICAgICAgICBjbGF3X3Bvc2l0aW9uLnBvc2l0aW9uLCBoYWxsX2VmZmVjdC5wb3NlZGdlX3ZhbHVlLAorICAgICAgICAgICAgICAgYXZnX29mZl9wb3NpdGlvbiwgbGFzdF9vZmZfbWluX3Bvc2l0aW9uXywKKyAgICAgICAgICAgICAgIGxhc3Rfb2ZmX21heF9wb3NpdGlvbl8pOworICAgICAgICBsaW1pdHMtPmxvd2VyX2FuZ2xlID0KKyAgICAgICAgICAgIGhhbGxfZWZmZWN0LnBvc2VkZ2VfdmFsdWUgLSBzdGFydF9wb3NpdGlvbl87CisgICAgICB9CisgICAgICBwcmludCA9IHRydWU7CisgICAgfQorICAgIGlmIChoYWxsX2VmZmVjdC5uZWdlZGdlX2NvdW50ICE9IGxhc3RfbmVnZWRnZV9jb3VudF8pIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBhdmdfb25fcG9zaXRpb24gPQorICAgICAgICAgIChsYXN0X29uX21pbl9wb3NpdGlvbl8gKyBsYXN0X29uX21heF9wb3NpdGlvbl8pIC8gMi4wOworICAgICAgaWYgKGhhbGxfZWZmZWN0Lm5lZ2VkZ2VfdmFsdWUgPiBhdmdfb25fcG9zaXRpb24pIHsKKyAgICAgICAgcHJpbnRmKCJOZWdlZGdlIHVwcGVyIGN1cnJlbnQgJWYgbmVnZWRnZSAlZiBsYXN0X29uICVmIFslZiwgJWZdXG4iLAorICAgICAgICAgICAgICAgY2xhd19wb3NpdGlvbi5wb3NpdGlvbiwgaGFsbF9lZmZlY3QubmVnZWRnZV92YWx1ZSwKKyAgICAgICAgICAgICAgIGF2Z19vbl9wb3NpdGlvbiwgbGFzdF9vbl9taW5fcG9zaXRpb25fLAorICAgICAgICAgICAgICAgbGFzdF9vbl9tYXhfcG9zaXRpb25fKTsKKyAgICAgICAgbGltaXRzLT51cHBlcl9hbmdsZSA9CisgICAgICAgICAgICBoYWxsX2VmZmVjdC5uZWdlZGdlX3ZhbHVlIC0gc3RhcnRfcG9zaXRpb25fOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJOZWdlZGdlIGxvd2VyIGN1cnJlbnQgJWYgbmVnZWRnZSAlZiBsYXN0X29uICVmIFslZiwgJWZdXG4iLAorICAgICAgICAgICAgICAgY2xhd19wb3NpdGlvbi5wb3NpdGlvbiwgaGFsbF9lZmZlY3QubmVnZWRnZV92YWx1ZSwKKyAgICAgICAgICAgICAgIGF2Z19vbl9wb3NpdGlvbiwgbGFzdF9vbl9taW5fcG9zaXRpb25fLAorICAgICAgICAgICAgICAgbGFzdF9vbl9tYXhfcG9zaXRpb25fKTsKKyAgICAgICAgbGltaXRzLT5sb3dlcl9kZWNyZWFzaW5nX2FuZ2xlID0KKyAgICAgICAgICAgIGhhbGxfZWZmZWN0Lm5lZ2VkZ2VfdmFsdWUgLSBzdGFydF9wb3NpdGlvbl87CisgICAgICB9CisgICAgICBwcmludCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGhhbGxfZWZmZWN0LmN1cnJlbnQpIHsKKyAgICAgIGlmICghbGFzdF9oYWxsX2VmZmVjdF8uY3VycmVudCkgeworICAgICAgICBsYXN0X29uX21pbl9wb3NpdGlvbl8gPSBsYXN0X29uX21heF9wb3NpdGlvbl8gPSBjbGF3X3Bvc2l0aW9uLnBvc2l0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGFzdF9vbl9taW5fcG9zaXRpb25fID0KKyAgICAgICAgICAgIDo6c3RkOjptaW4oY2xhd19wb3NpdGlvbi5wb3NpdGlvbiwgbGFzdF9vbl9taW5fcG9zaXRpb25fKTsKKyAgICAgICAgbGFzdF9vbl9tYXhfcG9zaXRpb25fID0KKyAgICAgICAgICAgIDo6c3RkOjptYXgoY2xhd19wb3NpdGlvbi5wb3NpdGlvbiwgbGFzdF9vbl9tYXhfcG9zaXRpb25fKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGxhc3RfaGFsbF9lZmZlY3RfLmN1cnJlbnQpIHsKKyAgICAgICAgbGFzdF9vZmZfbWluX3Bvc2l0aW9uXyA9IGxhc3Rfb2ZmX21heF9wb3NpdGlvbl8gPQorICAgICAgICAgICAgY2xhd19wb3NpdGlvbi5wb3NpdGlvbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxhc3Rfb2ZmX21pbl9wb3NpdGlvbl8gPQorICAgICAgICAgICAgOjpzdGQ6Om1pbihjbGF3X3Bvc2l0aW9uLnBvc2l0aW9uLCBsYXN0X29mZl9taW5fcG9zaXRpb25fKTsKKyAgICAgICAgbGFzdF9vZmZfbWF4X3Bvc2l0aW9uXyA9CisgICAgICAgICAgICA6OnN0ZDo6bWF4KGNsYXdfcG9zaXRpb24ucG9zaXRpb24sIGxhc3Rfb2ZmX21heF9wb3NpdGlvbl8pOworICAgICAgfQorICAgIH0KKworICAgIGxhc3RfaGFsbF9lZmZlY3RfID0gaGFsbF9lZmZlY3Q7CisgICAgbGFzdF9wb3NlZGdlX2NvdW50XyA9IGhhbGxfZWZmZWN0LnBvc2VkZ2VfY291bnQ7CisgICAgbGFzdF9uZWdlZGdlX2NvdW50XyA9IGhhbGxfZWZmZWN0Lm5lZ2VkZ2VfY291bnQ7CisKKyAgICByZXR1cm4gcHJpbnQ7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IGRvdWJsZSBzdGFydF9wb3NpdGlvbl87CisgIEhhbGxFZmZlY3RTdHJ1Y3QgbGFzdF9oYWxsX2VmZmVjdF87CisgIGludDMyX3QgbGFzdF9wb3NlZGdlX2NvdW50XzsKKyAgaW50MzJfdCBsYXN0X25lZ2VkZ2VfY291bnRfOworICBkb3VibGUgbGFzdF9vbl9taW5fcG9zaXRpb25fOworICBkb3VibGUgbGFzdF9vZmZfbWluX3Bvc2l0aW9uXzsKKyAgZG91YmxlIGxhc3Rfb25fbWF4X3Bvc2l0aW9uXzsKKyAgZG91YmxlIGxhc3Rfb2ZmX21heF9wb3NpdGlvbl87Cit9OworCitjbGFzcyBDbGF3U2Vuc29ycyB7CisgcHVibGljOgorICBDbGF3U2Vuc29ycyhjb25zdCBkb3VibGUgc3RhcnRfcG9zaXRpb24sCisgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OkhhbGZDbGF3UG9zaXRpb24gJmluaXRpYWxfY2xhd19wb3NpdGlvbikKKyAgICAgIDogc3RhcnRfcG9zaXRpb25fKHN0YXJ0X3Bvc2l0aW9uKSwKKyAgICAgICAgZnJvbnRfKHN0YXJ0X3Bvc2l0aW9uLCBpbml0aWFsX2NsYXdfcG9zaXRpb24uZnJvbnQpLAorICAgICAgICBjYWxpYnJhdGlvbl8oc3RhcnRfcG9zaXRpb24sIGluaXRpYWxfY2xhd19wb3NpdGlvbi5jYWxpYnJhdGlvbiksCisgICAgICAgIGJhY2tfKHN0YXJ0X3Bvc2l0aW9uLCBpbml0aWFsX2NsYXdfcG9zaXRpb24uYmFjaykge30KKworICBib29sIEdldFBvc2l0aW9uT2ZFZGdlKGNvbnN0IGNvbnRyb2xfbG9vcHM6OkhhbGZDbGF3UG9zaXRpb24gJmNsYXdfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhd3M6OkNsYXcgKmNsYXcpIHsKKworICAgIGJvb2wgcHJpbnQgPSBmYWxzZTsKKyAgICBpZiAoZnJvbnRfLkRvR2V0UG9zaXRpb25PZkVkZ2UoY2xhd19wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhd19wb3NpdGlvbi5mcm9udCwgJmNsYXctPmZyb250KSkgeworICAgICAgcHJpbnQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoY2FsaWJyYXRpb25fLkRvR2V0UG9zaXRpb25PZkVkZ2UoY2xhd19wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXdfcG9zaXRpb24uY2FsaWJyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xhdy0+Y2FsaWJyYXRpb24pKSB7CisgICAgICBwcmludCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChiYWNrXy5Eb0dldFBvc2l0aW9uT2ZFZGdlKGNsYXdfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXdfcG9zaXRpb24uYmFjaywgJmNsYXctPmJhY2spKSB7CisgICAgICBwcmludCA9IHRydWU7CisgICAgfQorCisgICAgZG91YmxlIHBvc2l0aW9uID0gY2xhd19wb3NpdGlvbi5wb3NpdGlvbiAtIHN0YXJ0X3Bvc2l0aW9uXzsKKworICAgIGlmIChwb3NpdGlvbiA+IGNsYXctPnVwcGVyX2xpbWl0KSB7CisgICAgICBjbGF3LT51cHBlcl9oYXJkX2xpbWl0ID0gY2xhdy0+dXBwZXJfbGltaXQgPSBwb3NpdGlvbjsKKyAgICAgIHByaW50ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHBvc2l0aW9uIDwgY2xhdy0+bG93ZXJfbGltaXQpIHsKKyAgICAgIGNsYXctPmxvd2VyX2hhcmRfbGltaXQgPSBjbGF3LT5sb3dlcl9saW1pdCA9IHBvc2l0aW9uOworICAgICAgcHJpbnQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcHJpbnQ7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IGRvdWJsZSBzdGFydF9wb3NpdGlvbl87CisgIFNlbnNvciBmcm9udF87CisgIFNlbnNvciBjYWxpYnJhdGlvbl87CisgIFNlbnNvciBiYWNrXzsKK307CisKK2ludCBNYWluKCkgeworICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnBvc2l0aW9uLkZldGNoTmV4dEJsb2NraW5nKCk7CisKKyAgY29uc3QgZG91YmxlIHRvcF9zdGFydF9wb3NpdGlvbiA9CisgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnBvc2l0aW9uLT50b3AucG9zaXRpb247CisgIGNvbnN0IGRvdWJsZSBib3R0b21fc3RhcnRfcG9zaXRpb24gPQorICAgICAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5wb3NpdGlvbi0+Ym90dG9tLnBvc2l0aW9uOworCisgIENsYXdTZW5zb3JzIHRvcCh0b3Bfc3RhcnRfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnBvc2l0aW9uLT50b3ApOworICBDbGF3U2Vuc29ycyBib3R0b20oYm90dG9tX3N0YXJ0X3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5wb3NpdGlvbi0+Ym90dG9tKTsKKworICBDbGF3cyBsaW1pdHM7CisKKyAgbGltaXRzLmNsYXdfemVyb2luZ19vZmZfc3BlZWQgPSAwLjU7CisgIGxpbWl0cy5jbGF3X3plcm9pbmdfc3BlZWQgPSAwLjE7CisgIGxpbWl0cy5jbGF3X3plcm9pbmdfc2VwYXJhdGlvbiA9IDAuMTsKKworICAvLyBjbGF3IHNlcGFyYXRpb24gdGhhdCB3b3VsZCBiZSBjb25zaWRlcmVkIGEgY29sbGlzaW9uCisgIGxpbWl0cy5jbGF3X21pbl9zZXBhcmF0aW9uID0gMC4wOworICBsaW1pdHMuY2xhd19tYXhfc2VwYXJhdGlvbiA9IDAuMDsKKworICAvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGNsb3Nlci9mYXJ0aGVyIHRoYW4gdGhlc2UuCisgIGxpbWl0cy5zb2Z0X21pbl9zZXBhcmF0aW9uID0gMC4wOworICBsaW1pdHMuc29mdF9tYXhfc2VwYXJhdGlvbiA9IDAuMDsKKworICBsaW1pdHMudXBwZXJfY2xhdy5sb3dlcl9oYXJkX2xpbWl0ID0gMC4wOworICBsaW1pdHMudXBwZXJfY2xhdy51cHBlcl9oYXJkX2xpbWl0ID0gMC4wOworICBsaW1pdHMudXBwZXJfY2xhdy5sb3dlcl9saW1pdCA9IDAuMDsKKyAgbGltaXRzLnVwcGVyX2NsYXcudXBwZXJfbGltaXQgPSAwLjA7CisgIGxpbWl0cy51cHBlcl9jbGF3LmZyb250Lmxvd2VyX2FuZ2xlID0gMC4wOworICBsaW1pdHMudXBwZXJfY2xhdy5mcm9udC51cHBlcl9hbmdsZSA9IDAuMDsKKyAgbGltaXRzLnVwcGVyX2NsYXcuZnJvbnQubG93ZXJfZGVjcmVhc2luZ19hbmdsZSA9IDAuMDsKKyAgbGltaXRzLnVwcGVyX2NsYXcuZnJvbnQudXBwZXJfZGVjcmVhc2luZ19hbmdsZSA9IDAuMDsKKyAgbGltaXRzLnVwcGVyX2NsYXcuY2FsaWJyYXRpb24ubG93ZXJfYW5nbGUgPSAwLjA7CisgIGxpbWl0cy51cHBlcl9jbGF3LmNhbGlicmF0aW9uLnVwcGVyX2FuZ2xlID0gMC4wOworICBsaW1pdHMudXBwZXJfY2xhdy5jYWxpYnJhdGlvbi5sb3dlcl9kZWNyZWFzaW5nX2FuZ2xlID0gMC4wOworICBsaW1pdHMudXBwZXJfY2xhdy5jYWxpYnJhdGlvbi51cHBlcl9kZWNyZWFzaW5nX2FuZ2xlID0gMC4wOworICBsaW1pdHMudXBwZXJfY2xhdy5iYWNrLmxvd2VyX2FuZ2xlID0gMC4wOworICBsaW1pdHMudXBwZXJfY2xhdy5iYWNrLnVwcGVyX2FuZ2xlID0gMC4wOworICBsaW1pdHMudXBwZXJfY2xhdy5iYWNrLmxvd2VyX2RlY3JlYXNpbmdfYW5nbGUgPSAwLjA7CisgIGxpbWl0cy51cHBlcl9jbGF3LmJhY2sudXBwZXJfZGVjcmVhc2luZ19hbmdsZSA9IDAuMDsKKworICBsaW1pdHMubG93ZXJfY2xhdy5sb3dlcl9oYXJkX2xpbWl0ID0gMC4wOworICBsaW1pdHMubG93ZXJfY2xhdy51cHBlcl9oYXJkX2xpbWl0ID0gMC4wOworICBsaW1pdHMubG93ZXJfY2xhdy5sb3dlcl9saW1pdCA9IDAuMDsKKyAgbGltaXRzLmxvd2VyX2NsYXcudXBwZXJfbGltaXQgPSAwLjA7CisgIGxpbWl0cy5sb3dlcl9jbGF3LmZyb250Lmxvd2VyX2FuZ2xlID0gMC4wOworICBsaW1pdHMubG93ZXJfY2xhdy5mcm9udC51cHBlcl9hbmdsZSA9IDAuMDsKKyAgbGltaXRzLmxvd2VyX2NsYXcuZnJvbnQubG93ZXJfZGVjcmVhc2luZ19hbmdsZSA9IDAuMDsKKyAgbGltaXRzLmxvd2VyX2NsYXcuZnJvbnQudXBwZXJfZGVjcmVhc2luZ19hbmdsZSA9IDAuMDsKKyAgbGltaXRzLmxvd2VyX2NsYXcuY2FsaWJyYXRpb24ubG93ZXJfYW5nbGUgPSAwLjA7CisgIGxpbWl0cy5sb3dlcl9jbGF3LmNhbGlicmF0aW9uLnVwcGVyX2FuZ2xlID0gMC4wOworICBsaW1pdHMubG93ZXJfY2xhdy5jYWxpYnJhdGlvbi5sb3dlcl9kZWNyZWFzaW5nX2FuZ2xlID0gMC4wOworICBsaW1pdHMubG93ZXJfY2xhdy5jYWxpYnJhdGlvbi51cHBlcl9kZWNyZWFzaW5nX2FuZ2xlID0gMC4wOworICBsaW1pdHMubG93ZXJfY2xhdy5iYWNrLmxvd2VyX2FuZ2xlID0gMC4wOworICBsaW1pdHMubG93ZXJfY2xhdy5iYWNrLnVwcGVyX2FuZ2xlID0gMC4wOworICBsaW1pdHMubG93ZXJfY2xhdy5iYWNrLmxvd2VyX2RlY3JlYXNpbmdfYW5nbGUgPSAwLjA7CisgIGxpbWl0cy5sb3dlcl9jbGF3LmJhY2sudXBwZXJfZGVjcmVhc2luZ19hbmdsZSA9IDAuMDsKKworICBsaW1pdHMuY2xhd191bmltcG9ydGFudF9lcHNpbG9uID0gMC4wMTsKKyAgbGltaXRzLnN0YXJ0X2ZpbmVfdHVuZV9wb3MgPSAtMC4yOworICBsaW1pdHMubWF4X3plcm9pbmdfdm9sdGFnZSA9IDQuMDsKKworICBjb250cm9sX2xvb3BzOjpDbGF3UXVldWU6OlBvc2l0aW9uIGxhc3RfcG9zaXRpb24gPQorICAgICAgKmNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUucG9zaXRpb247CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnBvc2l0aW9uLkZldGNoTmV4dEJsb2NraW5nKCk7CisgICAgYm9vbCBwcmludCA9IGZhbHNlOworICAgIGlmICh0b3AuR2V0UG9zaXRpb25PZkVkZ2UoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5wb3NpdGlvbi0+dG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0cy51cHBlcl9jbGF3KSkgeworICAgICAgcHJpbnQgPSB0cnVlOworICAgICAgcHJpbnRmKCJHb3QgYW4gZWRnZSBvbiB0aGUgdXBwZXIgY2xhd1xuIik7CisgICAgfQorICAgIGlmIChib3R0b20uR2V0UG9zaXRpb25PZkVkZ2UoCisgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnBvc2l0aW9uLT5ib3R0b20sCisgICAgICAgICAgICAmbGltaXRzLmxvd2VyX2NsYXcpKSB7CisgICAgICBwcmludCA9IHRydWU7CisgICAgICBwcmludGYoIkdvdCBhbiBlZGdlIG9uIHRoZSBsb3dlciBjbGF3XG4iKTsKKyAgICB9CisgICAgY29uc3QgZG91YmxlIHRvcF9wb3NpdGlvbiA9CisgICAgICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUucG9zaXRpb24tPnRvcC5wb3NpdGlvbiAtCisgICAgICAgIHRvcF9zdGFydF9wb3NpdGlvbjsKKyAgICBjb25zdCBkb3VibGUgYm90dG9tX3Bvc2l0aW9uID0KKyAgICAgICAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5wb3NpdGlvbi0+Ym90dG9tLnBvc2l0aW9uIC0KKyAgICAgICAgYm90dG9tX3N0YXJ0X3Bvc2l0aW9uOworICAgIGNvbnN0IGRvdWJsZSBzZXBhcmF0aW9uID0gdG9wX3Bvc2l0aW9uIC0gYm90dG9tX3Bvc2l0aW9uOworICAgIGlmIChzZXBhcmF0aW9uID4gbGltaXRzLmNsYXdfbWF4X3NlcGFyYXRpb24pIHsKKyAgICAgIGxpbWl0cy5zb2Z0X21heF9zZXBhcmF0aW9uID0gbGltaXRzLmNsYXdfbWF4X3NlcGFyYXRpb24gPSBzZXBhcmF0aW9uOworICAgICAgcHJpbnQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoc2VwYXJhdGlvbiA8IGxpbWl0cy5jbGF3X21pbl9zZXBhcmF0aW9uKSB7CisgICAgICBsaW1pdHMuc29mdF9taW5fc2VwYXJhdGlvbiA9IGxpbWl0cy5jbGF3X21pbl9zZXBhcmF0aW9uID0gc2VwYXJhdGlvbjsKKyAgICAgIHByaW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocHJpbnQpIHsKKyAgICAgIHByaW50ZigieyVmLFxuIiwgbGltaXRzLmNsYXdfemVyb2luZ19vZmZfc3BlZWQpOworICAgICAgcHJpbnRmKCIlZixcbiIsIGxpbWl0cy5jbGF3X3plcm9pbmdfc3BlZWQpOworICAgICAgcHJpbnRmKCIlZixcbiIsIGxpbWl0cy5jbGF3X3plcm9pbmdfc2VwYXJhdGlvbik7CisgICAgICBwcmludGYoIiVmLFxuIiwgbGltaXRzLmNsYXdfbWluX3NlcGFyYXRpb24pOworICAgICAgcHJpbnRmKCIlZixcbiIsIGxpbWl0cy5jbGF3X21heF9zZXBhcmF0aW9uKTsKKyAgICAgIHByaW50ZigiJWYsXG4iLCBsaW1pdHMuc29mdF9taW5fc2VwYXJhdGlvbik7CisgICAgICBwcmludGYoIiVmLFxuIiwgbGltaXRzLnNvZnRfbWF4X3NlcGFyYXRpb24pOworICAgICAgcHJpbnRmKAorICAgICAgICAgICJ7JWYsICVmLCAlZiwgJWYsIHslZiwgJWYsICVmLCAlZn0sIHslZiwgJWYsICVmLCAlZn0sIHslZiwgJWYsICVmLCAiCisgICAgICAgICAgIiVmfX0sXG4iLAorICAgICAgICAgIGxpbWl0cy51cHBlcl9jbGF3Lmxvd2VyX2hhcmRfbGltaXQsCisgICAgICAgICAgbGltaXRzLnVwcGVyX2NsYXcudXBwZXJfaGFyZF9saW1pdCwgbGltaXRzLnVwcGVyX2NsYXcubG93ZXJfbGltaXQsCisgICAgICAgICAgbGltaXRzLnVwcGVyX2NsYXcudXBwZXJfbGltaXQsIGxpbWl0cy51cHBlcl9jbGF3LmZyb250Lmxvd2VyX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy51cHBlcl9jbGF3LmZyb250LnVwcGVyX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy51cHBlcl9jbGF3LmZyb250Lmxvd2VyX2RlY3JlYXNpbmdfYW5nbGUsCisgICAgICAgICAgbGltaXRzLnVwcGVyX2NsYXcuZnJvbnQudXBwZXJfZGVjcmVhc2luZ19hbmdsZSwKKyAgICAgICAgICBsaW1pdHMudXBwZXJfY2xhdy5jYWxpYnJhdGlvbi5sb3dlcl9hbmdsZSwKKyAgICAgICAgICBsaW1pdHMudXBwZXJfY2xhdy5jYWxpYnJhdGlvbi51cHBlcl9hbmdsZSwKKyAgICAgICAgICBsaW1pdHMudXBwZXJfY2xhdy5jYWxpYnJhdGlvbi5sb3dlcl9kZWNyZWFzaW5nX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy51cHBlcl9jbGF3LmNhbGlicmF0aW9uLnVwcGVyX2RlY3JlYXNpbmdfYW5nbGUsCisgICAgICAgICAgbGltaXRzLnVwcGVyX2NsYXcuYmFjay5sb3dlcl9hbmdsZSwKKyAgICAgICAgICBsaW1pdHMudXBwZXJfY2xhdy5iYWNrLnVwcGVyX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy51cHBlcl9jbGF3LmJhY2subG93ZXJfZGVjcmVhc2luZ19hbmdsZSwKKyAgICAgICAgICBsaW1pdHMudXBwZXJfY2xhdy5iYWNrLnVwcGVyX2RlY3JlYXNpbmdfYW5nbGUpOworCisgICAgICBwcmludGYoCisgICAgICAgICAgInslZiwgJWYsICVmLCAlZiwgeyVmLCAlZiwgJWYsICVmfSwgeyVmLCAlZiwgJWYsICVmfSwgeyVmLCAlZiwgJWYsICIKKyAgICAgICAgICAiJWZ9fSxcbiIsCisgICAgICAgICAgbGltaXRzLmxvd2VyX2NsYXcubG93ZXJfaGFyZF9saW1pdCwKKyAgICAgICAgICBsaW1pdHMubG93ZXJfY2xhdy51cHBlcl9oYXJkX2xpbWl0LCBsaW1pdHMubG93ZXJfY2xhdy5sb3dlcl9saW1pdCwKKyAgICAgICAgICBsaW1pdHMubG93ZXJfY2xhdy51cHBlcl9saW1pdCwgbGltaXRzLmxvd2VyX2NsYXcuZnJvbnQubG93ZXJfYW5nbGUsCisgICAgICAgICAgbGltaXRzLmxvd2VyX2NsYXcuZnJvbnQudXBwZXJfYW5nbGUsCisgICAgICAgICAgbGltaXRzLmxvd2VyX2NsYXcuZnJvbnQubG93ZXJfZGVjcmVhc2luZ19hbmdsZSwKKyAgICAgICAgICBsaW1pdHMubG93ZXJfY2xhdy5mcm9udC51cHBlcl9kZWNyZWFzaW5nX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy5sb3dlcl9jbGF3LmNhbGlicmF0aW9uLmxvd2VyX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy5sb3dlcl9jbGF3LmNhbGlicmF0aW9uLnVwcGVyX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy5sb3dlcl9jbGF3LmNhbGlicmF0aW9uLmxvd2VyX2RlY3JlYXNpbmdfYW5nbGUsCisgICAgICAgICAgbGltaXRzLmxvd2VyX2NsYXcuY2FsaWJyYXRpb24udXBwZXJfZGVjcmVhc2luZ19hbmdsZSwKKyAgICAgICAgICBsaW1pdHMubG93ZXJfY2xhdy5iYWNrLmxvd2VyX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy5sb3dlcl9jbGF3LmJhY2sudXBwZXJfYW5nbGUsCisgICAgICAgICAgbGltaXRzLmxvd2VyX2NsYXcuYmFjay5sb3dlcl9kZWNyZWFzaW5nX2FuZ2xlLAorICAgICAgICAgIGxpbWl0cy5sb3dlcl9jbGF3LmJhY2sudXBwZXJfZGVjcmVhc2luZ19hbmdsZSk7CisgICAgICBwcmludGYoIiVmLCAgLy8gY2xhd191bmltcG9ydGFudF9lcHNpbG9uXG4iLAorICAgICAgICAgICAgIGxpbWl0cy5jbGF3X3VuaW1wb3J0YW50X2Vwc2lsb24pOworICAgICAgcHJpbnRmKCIlZiwgICAvLyBzdGFydF9maW5lX3R1bmVfcG9zXG4iLCBsaW1pdHMuc3RhcnRfZmluZV90dW5lX3Bvcyk7CisgICAgICBwcmludGYoIiVmLFxuIiwgbGltaXRzLm1heF96ZXJvaW5nX3ZvbHRhZ2UpOworICAgICAgcHJpbnRmKCJ9XG4iKTsKKyAgICB9CisKKyAgICBsYXN0X3Bvc2l0aW9uID0gKmNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUucG9zaXRpb247CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworaW50IG1haW4oKSB7CisgIDo6YW9zOjpJbml0KCk7CisgIGludCByZXR1cm52YWx1ZSA9IDo6ZnJjOTcxOjpNYWluKCk7CisgIDo6YW9zOjpDbGVhbnVwKCk7CisgIHJldHVybiByZXR1cm52YWx1ZTsKK30KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X2xpYl90ZXN0LmNjIGIveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbGliX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViMTczZQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X2xpYl90ZXN0LmNjCkBAIC0wLDAgKzEsNjA4IEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL25ldHdvcmsvdGVhbV9udW1iZXIuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcF90ZXN0LmgiCisKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tb3Rvcl9wbGFudC5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordHlwZWRlZiBlbnVtIHsKKwlUT1BfQ0xBVyA9IDAsCisJQk9UVE9NX0NMQVcsCisKKwlDTEFXX0NPVU5UCit9IENsYXdUeXBlOworCitjbGFzcyBUZWFtTnVtYmVyRW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgcHVibGljOgorICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudC4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyBhb3M6Om5ldHdvcms6Ok92ZXJyaWRlVGVhbU51bWJlcigxKTsgfQorfTsKKworOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgdGVhbV9udW1iZXJfZW52ID0KKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgVGVhbU51bWJlckVudmlyb25tZW50KTsKKworLy8gQ2xhc3Mgd2hpY2ggc2ltdWxhdGVzIHRoZSB3cmlzdCBhbmQgc2VuZHMgb3V0IHF1ZXVlIG1lc3NhZ2VzIGNvbnRhaW5pbmcgdGhlCisvLyBwb3NpdGlvbi4KK2NsYXNzIENsYXdNb3RvclNpbXVsYXRpb24geworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIG1vdG9yIHNpbXVsYXRpb24uICBpbml0aWFsX3Bvc2l0aW9uIGlzIHRoZSBpbml0YWwgYW5nbGUgb2YgdGhlCisgIC8vIHdyaXN0LCB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgYXMgMCBieSB0aGUgZW5jb2Rlci4KKyAgQ2xhd01vdG9yU2ltdWxhdGlvbihkb3VibGUgaW5pdGlhbF90b3BfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGluaXRpYWxfYm90dG9tX3Bvc2l0aW9uKQorICAgICAgOiBjbGF3X3BsYW50XyhuZXcgU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+KE1ha2VDbGF3UGxhbnQoKSkpLAorICAgICAgICBjbGF3X3F1ZXVlKCIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZSIsIDB4OWYxYTk5ZGQsCisgICAgICAgICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5jbGF3X3F1ZXVlLmdvYWwiLAorICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5wb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5jbGF3X3F1ZXVlLm91dHB1dCIsCisgICAgICAgICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5jbGF3X3F1ZXVlLnN0YXR1cyIpIHsKKyAgICBSZWluaXRpYWxpemUoaW5pdGlhbF90b3BfcG9zaXRpb24sIGluaXRpYWxfYm90dG9tX3Bvc2l0aW9uKTsKKyAgfQorCisgIHZvaWQgUmVpbml0aWFsaXplKGRvdWJsZSBpbml0aWFsX3RvcF9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGluaXRpYWxfYm90dG9tX3Bvc2l0aW9uKSB7CisgICAgTE9HKElORk8sICJSZWluaXRpYWxpemluZyB0byB7dG9wOiAlZiwgYm90dG9tOiAlZn1cbiIsIGluaXRpYWxfdG9wX3Bvc2l0aW9uLAorICAgICAgICBpbml0aWFsX2JvdHRvbV9wb3NpdGlvbik7CisgICAgY2xhd19wbGFudF8tPm11dGFibGVfWCgwLCAwKSA9IGluaXRpYWxfYm90dG9tX3Bvc2l0aW9uOworICAgIGNsYXdfcGxhbnRfLT5tdXRhYmxlX1goMSwgMCkgPSBpbml0aWFsX3RvcF9wb3NpdGlvbiAtIGluaXRpYWxfYm90dG9tX3Bvc2l0aW9uOworICAgIGNsYXdfcGxhbnRfLT5tdXRhYmxlX1goMiwgMCkgPSAwLjA7CisgICAgY2xhd19wbGFudF8tPm11dGFibGVfWCgzLCAwKSA9IDAuMDsKKyAgICBjbGF3X3BsYW50Xy0+bXV0YWJsZV9ZKCkgPSBjbGF3X3BsYW50Xy0+QygpICogY2xhd19wbGFudF8tPlgoKTsKKworICAgIFJlaW5pdGlhbGl6ZVBhcnRpYWwoVE9QX0NMQVcsIGluaXRpYWxfdG9wX3Bvc2l0aW9uKTsKKyAgICBSZWluaXRpYWxpemVQYXJ0aWFsKEJPVFRPTV9DTEFXLCBpbml0aWFsX2JvdHRvbV9wb3NpdGlvbik7CisgICAgbGFzdF9wb3NpdGlvbl8uWmVybygpOworICAgIFNldFBoeXNpY2FsU2Vuc29ycygmbGFzdF9wb3NpdGlvbl8pOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgYWJzb2x1dGUgYW5nbGUgb2YgdGhlIHdyaXN0LgorICBkb3VibGUgR2V0QWJzb2x1dGVQb3NpdGlvbihDbGF3VHlwZSB0eXBlKSBjb25zdCB7CisgICAgaWYgKHR5cGUgPT0gVE9QX0NMQVcpIHsKKyAgICAgIHJldHVybiBjbGF3X3BsYW50Xy0+WSgxLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNsYXdfcGxhbnRfLT5ZKDAsIDApOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGFkanVzdGVkIGFuZ2xlIG9mIHRoZSB3cmlzdC4KKyAgZG91YmxlIEdldFBvc2l0aW9uKENsYXdUeXBlIHR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0QWJzb2x1dGVQb3NpdGlvbih0eXBlKSAtIGluaXRpYWxfcG9zaXRpb25fW3R5cGVdOworICB9CisKKyAgLy8gTWFrZXMgc3VyZSBwb3MgaXMgaW5zaWRlIHJhbmdlIChleGNsdXNpdmUpCisgIGJvb2wgQ2hlY2tSYW5nZShkb3VibGUgcG9zLCBjb25zdCBjb25zdGFudHM6OlZhbHVlczo6Q2xhd3M6OkFuZ2xlUGFpciAmcGFpcikgeworICAgIC8vIE5vdGU6IElmIHRoZSA+PSBhbmQgPD0gc2lnbnMgYXJlIHVzZWQsIHRoZW4gdGhlIHRoZXJlIGV4aXN0cyBhIGNhc2UKKyAgICAvLyB3aGVyZSB0aGUgd3Jpc3Qgc3RhcnRzIHByZWNpc2VseSBvbiB0aGUgZWRnZSBhbmQgYmVjYXVzZSBpbml0aWFsCisgICAgLy8gcG9zaXRpb24gYW5kIHRoZSAqZWRnZV92YWx1ZV8gYXJlIHRoZSBzYW1lLCB0aGVuIHRoZSBjb21wYXJpc29uCisgICAgLy8gaW4gWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkRvR2V0UG9zaXRpb25PZkVkZ2Ugd2lsbCByZXR1cm4gdGhhdAorICAgIC8vIHRoZSBsb3dlciwgcmF0aGVyIHRoYW4gdXBwZXIsIGVkZ2Ugb2YgdGhlIGhhbGwgZWZmZWN0IHdhcyBwYXNzZWQuCisgICAgcmV0dXJuIChwb3MgPiBwYWlyLmxvd2VyX2FuZ2xlICYmIHBvcyA8IHBhaXIudXBwZXJfYW5nbGUpOworICB9CisKKyAgdm9pZCBTZXRIYWxsRWZmZWN0KGRvdWJsZSBwb3MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25zdGFudHM6OlZhbHVlczo6Q2xhd3M6OkFuZ2xlUGFpciAmcGFpciwKKyAgICAgICAgICAgICAgICAgICAgIEhhbGxFZmZlY3RTdHJ1Y3QgKmhhbGxfZWZmZWN0KSB7CisgICAgaGFsbF9lZmZlY3QtPmN1cnJlbnQgPSBDaGVja1JhbmdlKHBvcywgcGFpcik7CisgIH0KKworICB2b2lkIFNldENsYXdIYWxsRWZmZWN0cyhkb3VibGUgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25zdGFudHM6OlZhbHVlczo6Q2xhd3M6OkNsYXcgJmNsYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OkhhbGZDbGF3UG9zaXRpb24gKmhhbGZfY2xhdykgeworICAgIFNldEhhbGxFZmZlY3QocG9zLCBjbGF3LmZyb250LCAmaGFsZl9jbGF3LT5mcm9udCk7CisgICAgU2V0SGFsbEVmZmVjdChwb3MsIGNsYXcuY2FsaWJyYXRpb24sICZoYWxmX2NsYXctPmNhbGlicmF0aW9uKTsKKyAgICBTZXRIYWxsRWZmZWN0KHBvcywgY2xhdy5iYWNrLCAmaGFsZl9jbGF3LT5iYWNrKTsKKyAgfQorCisgIC8vIFNldHMgdGhlIHZhbHVlcyBvZiB0aGUgcGh5c2ljYWwgc2Vuc29ycyB0aGF0IGNhbiBiZSBkaXJlY3RseSBvYnNlcnZlZAorICAvLyAoZW5jb2RlciwgaGFsbCBlZmZlY3QpLgorICB2b2lkIFNldFBoeXNpY2FsU2Vuc29ycyhjb250cm9sX2xvb3BzOjpDbGF3UXVldWU6OlBvc2l0aW9uICpwb3NpdGlvbikgeworICAgIHBvc2l0aW9uLT50b3AucG9zaXRpb24gPSBHZXRQb3NpdGlvbihUT1BfQ0xBVyk7CisgICAgcG9zaXRpb24tPmJvdHRvbS5wb3NpdGlvbiA9IEdldFBvc2l0aW9uKEJPVFRPTV9DTEFXKTsKKworICAgIGRvdWJsZSBwb3NbMl0gPSB7R2V0QWJzb2x1dGVQb3NpdGlvbihUT1BfQ0xBVyksCisgICAgICAgICAgICAgICAgICAgICBHZXRBYnNvbHV0ZVBvc2l0aW9uKEJPVFRPTV9DTEFXKX07CisgICAgTE9HKERFQlVHLCAiUGh5c2ljYWwgY2xhd3MgYXJlIGF0IHt0b3A6ICVmLCBib3R0b206ICVmfVxuIiwgcG9zW1RPUF9DTEFXXSwKKyAgICAgICAgcG9zW0JPVFRPTV9DTEFXXSk7CisKKyAgICBjb25zdCBmcmM5NzE6OmNvbnN0YW50czo6VmFsdWVzJiB2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworCisgICAgLy8gU2lnbmFsIHRoYXQgZWFjaCBoYWxsIGVmZmVjdCBzZW5zb3IgaGFzIGJlZW4gdHJpZ2dlcmVkIGlmIGl0IGlzIHdpdGhpbgorICAgIC8vIHRoZSBjb3JyZWN0IHJhbmdlLgorICAgIFNldENsYXdIYWxsRWZmZWN0cyhwb3NbVE9QX0NMQVddLCB2YWx1ZXMuY2xhdy51cHBlcl9jbGF3LCAmcG9zaXRpb24tPnRvcCk7CisgICAgU2V0Q2xhd0hhbGxFZmZlY3RzKHBvc1tCT1RUT01fQ0xBV10sIHZhbHVlcy5jbGF3Lmxvd2VyX2NsYXcsCisgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbi0+Ym90dG9tKTsKKyAgfQorCisgIHZvaWQgVXBkYXRlSGFsbEVmZmVjdChkb3VibGUgYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGFzdF9hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpbml0aWFsX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgSGFsbEVmZmVjdFN0cnVjdCAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIYWxsRWZmZWN0U3RydWN0ICZsYXN0X3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uc3RhbnRzOjpWYWx1ZXM6OkNsYXdzOjpBbmdsZVBhaXIgJnBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjbGF3X25hbWUsIGNvbnN0IGNoYXIgKmhhbGxfZWZmZWN0X25hbWUpIHsKKyAgICBpZiAocG9zaXRpb24tPmN1cnJlbnQgJiYgIWxhc3RfcG9zaXRpb24uY3VycmVudCkgeworICAgICAgKytwb3NpdGlvbi0+cG9zZWRnZV9jb3VudDsKKworICAgICAgaWYgKGxhc3RfYW5nbGUgPCBwYWlyLmxvd2VyX2FuZ2xlKSB7CisgICAgICAgIExPRyhERUJVRywgIiVzOiBQb3NpdGl2ZSBsb3dlciBlZGdlIG9uICVzIGhhbGwgZWZmZWN0XG4iLCBjbGF3X25hbWUsCisgICAgICAgICAgICBoYWxsX2VmZmVjdF9uYW1lKTsKKyAgICAgICAgcG9zaXRpb24tPnBvc2VkZ2VfdmFsdWUgPSBwYWlyLmxvd2VyX2FuZ2xlIC0gaW5pdGlhbF9wb3NpdGlvbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhERUJVRywgIiVzOiBQb3NpdGl2ZSB1cHBlciBlZGdlIG9uICVzIGhhbGwgZWZmZWN0XG4iLCBjbGF3X25hbWUsCisgICAgICAgICAgICBoYWxsX2VmZmVjdF9uYW1lKTsKKyAgICAgICAgcG9zaXRpb24tPnBvc2VkZ2VfdmFsdWUgPSBwYWlyLnVwcGVyX2FuZ2xlIC0gaW5pdGlhbF9wb3NpdGlvbjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwb3NpdGlvbi0+Y3VycmVudCAmJiBsYXN0X3Bvc2l0aW9uLmN1cnJlbnQpIHsKKyAgICAgICsrcG9zaXRpb24tPm5lZ2VkZ2VfY291bnQ7CisKKyAgICAgIGlmIChhbmdsZSA8IHBhaXIubG93ZXJfYW5nbGUpIHsKKyAgICAgICAgTE9HKERFQlVHLCAiJXM6IE5lZ2F0aXZlIGxvd2VyIGVkZ2Ugb24gJXMgaGFsbCBlZmZlY3RcbiIsIGNsYXdfbmFtZSwKKyAgICAgICAgICAgIGhhbGxfZWZmZWN0X25hbWUpOworICAgICAgICBwb3NpdGlvbi0+bmVnZWRnZV92YWx1ZSA9IHBhaXIubG93ZXJfYW5nbGUgLSBpbml0aWFsX3Bvc2l0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKERFQlVHLCAiJXM6IE5lZ2F0aXZlIHVwcGVyIGVkZ2Ugb24gJXMgaGFsbCBlZmZlY3RcbiIsIGNsYXdfbmFtZSwKKyAgICAgICAgICAgIGhhbGxfZWZmZWN0X25hbWUpOworICAgICAgICBwb3NpdGlvbi0+bmVnZWRnZV92YWx1ZSA9IHBhaXIudXBwZXJfYW5nbGUgLSBpbml0aWFsX3Bvc2l0aW9uOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgVXBkYXRlQ2xhd0hhbGxFZmZlY3RzKAorICAgICAgY29udHJvbF9sb29wczo6SGFsZkNsYXdQb3NpdGlvbiAqcG9zaXRpb24sCisgICAgICBjb25zdCBjb250cm9sX2xvb3BzOjpIYWxmQ2xhd1Bvc2l0aW9uICZsYXN0X3Bvc2l0aW9uLAorICAgICAgY29uc3QgY29uc3RhbnRzOjpWYWx1ZXM6OkNsYXdzOjpDbGF3ICZjbGF3LCBkb3VibGUgaW5pdGlhbF9wb3NpdGlvbiwKKyAgICAgIGNvbnN0IGNoYXIgKmNsYXdfbmFtZSkgeworICAgIFVwZGF0ZUhhbGxFZmZlY3QocG9zaXRpb24tPnBvc2l0aW9uICsgaW5pdGlhbF9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGxhc3RfcG9zaXRpb24ucG9zaXRpb24gKyBpbml0aWFsX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9wb3NpdGlvbiwgJnBvc2l0aW9uLT5mcm9udCwgbGFzdF9wb3NpdGlvbi5mcm9udCwKKyAgICAgICAgICAgICAgICAgICAgIGNsYXcuZnJvbnQsIGNsYXdfbmFtZSwgImZyb250Iik7CisgICAgVXBkYXRlSGFsbEVmZmVjdChwb3NpdGlvbi0+cG9zaXRpb24gKyBpbml0aWFsX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgbGFzdF9wb3NpdGlvbi5wb3NpdGlvbiArIGluaXRpYWxfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3Bvc2l0aW9uLCAmcG9zaXRpb24tPmNhbGlicmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgbGFzdF9wb3NpdGlvbi5jYWxpYnJhdGlvbiwgY2xhdy5jYWxpYnJhdGlvbiwgY2xhd19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgImNhbGlicmF0aW9uIik7CisgICAgVXBkYXRlSGFsbEVmZmVjdChwb3NpdGlvbi0+cG9zaXRpb24gKyBpbml0aWFsX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgbGFzdF9wb3NpdGlvbi5wb3NpdGlvbiArIGluaXRpYWxfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3Bvc2l0aW9uLCAmcG9zaXRpb24tPmJhY2ssIGxhc3RfcG9zaXRpb24uYmFjaywKKyAgICAgICAgICAgICAgICAgICAgIGNsYXcuYmFjaywgY2xhd19uYW1lLCAiYmFjayIpOworICB9CisKKyAgLy8gU2VuZHMgb3V0IHRoZSBwb3NpdGlvbiBxdWV1ZSBtZXNzYWdlcy4KKyAgdm9pZCBTZW5kUG9zaXRpb25NZXNzYWdlKCkgeworICAgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6UG9zaXRpb24+IHBvc2l0aW9uID0KKyAgICAgICAgY2xhd19xdWV1ZS5wb3NpdGlvbi5NYWtlTWVzc2FnZSgpOworCisgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIGNvdW50ZXJzIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcy4KKyAgICAqcG9zaXRpb24gPSBsYXN0X3Bvc2l0aW9uXzsKKworICAgIFNldFBoeXNpY2FsU2Vuc29ycyhwb3NpdGlvbi5nZXQoKSk7CisKKyAgICBjb25zdCBmcmM5NzE6OmNvbnN0YW50czo6VmFsdWVzJiB2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworCisgICAgVXBkYXRlQ2xhd0hhbGxFZmZlY3RzKCZwb3NpdGlvbi0+dG9wLCBsYXN0X3Bvc2l0aW9uXy50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5jbGF3LnVwcGVyX2NsYXcsIGluaXRpYWxfcG9zaXRpb25fW1RPUF9DTEFXXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvcCIpOworICAgIFVwZGF0ZUNsYXdIYWxsRWZmZWN0cygmcG9zaXRpb24tPmJvdHRvbSwgbGFzdF9wb3NpdGlvbl8uYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy5sb3dlcl9jbGF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3Bvc2l0aW9uX1tCT1RUT01fQ0xBV10sICJCb3R0b20iKTsKKworICAgIC8vIE9ubHkgc2V0IGNhbGlicmF0aW9uIGlmIGl0IGNoYW5nZWQgbGFzdCBjeWNsZS4gIENhbGlicmF0aW9uIHN0YXJ0cyBvdXQKKyAgICAvLyB3aXRoIGEgdmFsdWUgb2YgMC4KKyAgICBsYXN0X3Bvc2l0aW9uXyA9ICpwb3NpdGlvbjsKKyAgICBwb3NpdGlvbi5TZW5kKCk7CisgIH0KKworICAvLyBTaW11bGF0ZXMgdGhlIGNsYXcgbW92aW5nIGZvciBvbmUgdGltZXN0ZXAuCisgIHZvaWQgU2ltdWxhdGUoKSB7CisgICAgY29uc3QgZnJjOTcxOjpjb25zdGFudHM6OlZhbHVlcyYgdiA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisgICAgRVhQRUNUX1RSVUUoY2xhd19xdWV1ZS5vdXRwdXQuRmV0Y2hMYXRlc3QoKSk7CisKKyAgICBjbGF3X3BsYW50Xy0+bXV0YWJsZV9VKCkgPDwgY2xhd19xdWV1ZS5vdXRwdXQtPmJvdHRvbV9jbGF3X3ZvbHRhZ2UsCisgICAgICAgIGNsYXdfcXVldWUub3V0cHV0LT50b3BfY2xhd192b2x0YWdlOworICAgIGNsYXdfcGxhbnRfLT5VcGRhdGUoKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIGNsYXcgaXMgd2l0aGluIHRoZSBsaW1pdHMuCisgICAgRVhQRUNUX0dFKHYuY2xhdy51cHBlcl9jbGF3LnVwcGVyX2xpbWl0LCBjbGF3X3BsYW50Xy0+WSgwLCAwKSk7CisgICAgRVhQRUNUX0xFKHYuY2xhdy51cHBlcl9jbGF3Lmxvd2VyX2hhcmRfbGltaXQsIGNsYXdfcGxhbnRfLT5ZKDAsIDApKTsKKworICAgIEVYUEVDVF9HRSh2LmNsYXcubG93ZXJfY2xhdy51cHBlcl9oYXJkX2xpbWl0LCBjbGF3X3BsYW50Xy0+WSgxLCAwKSk7CisgICAgRVhQRUNUX0xFKHYuY2xhdy5sb3dlcl9jbGF3Lmxvd2VyX2hhcmRfbGltaXQsIGNsYXdfcGxhbnRfLT5ZKDEsIDApKTsKKworICAgIEVYUEVDVF9MRShjbGF3X3BsYW50Xy0+WSgxLCAwKSAtIGNsYXdfcGxhbnRfLT5ZKDAsIDApLAorICAgICAgICAgICAgICB2LmNsYXcuY2xhd19tYXhfc2VwYXJhdGlvbik7CisgICAgRVhQRUNUX0dFKGNsYXdfcGxhbnRfLT5ZKDEsIDApIC0gY2xhd19wbGFudF8tPlkoMCwgMCksCisgICAgICAgICAgICAgIHYuY2xhdy5jbGF3X21pbl9zZXBhcmF0aW9uKTsKKyAgfQorICAvLyBUaGUgd2hvbGUgY2xhdy4KKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+PiBjbGF3X3BsYW50XzsKKworIHByaXZhdGU6CisgIC8vIFJlc2V0cyB0aGUgcGxhbnQgc28gdGhhdCBpdCBzdGFydHMgYXQgaW5pdGlhbF9wb3NpdGlvbi4KKyAgdm9pZCBSZWluaXRpYWxpemVQYXJ0aWFsKENsYXdUeXBlIHR5cGUsIGRvdWJsZSBpbml0aWFsX3Bvc2l0aW9uKSB7CisgICAgaW5pdGlhbF9wb3NpdGlvbl9bdHlwZV0gPSBpbml0aWFsX3Bvc2l0aW9uOworICB9CisKKyAgQ2xhd1F1ZXVlIGNsYXdfcXVldWU7CisgIGRvdWJsZSBpbml0aWFsX3Bvc2l0aW9uX1tDTEFXX0NPVU5UXTsKKworICBjb250cm9sX2xvb3BzOjpDbGF3UXVldWU6OlBvc2l0aW9uIGxhc3RfcG9zaXRpb25fOworfTsKKworCitjbGFzcyBDbGF3VGVzdCA6IHB1YmxpYyA6OmFvczo6dGVzdGluZzo6Q29udHJvbExvb3BUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBxdWV1ZSBzbyB0aGF0IGl0IGludmFsaWRhdGVzIHRoZSBxdWV1ZQorICAvLyB0aGF0IGl0IHBvaW50cyB0by4gIE90aGVyd2lzZSwgd2Ugd2lsbCBoYXZlIGEgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5IHRoYXQKKyAgLy8gaXMgbm8gbG9uZ2VyIHZhbGlkLgorICBDbGF3UXVldWUgY2xhd19xdWV1ZTsKKworICAvLyBDcmVhdGUgYSBsb29wIGFuZCBzaW11bGF0aW9uIHBsYW50LgorICBDbGF3TW90b3IgY2xhd19tb3Rvcl87CisgIENsYXdNb3RvclNpbXVsYXRpb24gY2xhd19tb3Rvcl9wbGFudF87CisKKyAgLy8gTWluaW11bSBhbW91bnQgb2YgYWNjZXB0YWJsZSBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZQorICAvLyBjbGF3LgorICBkb3VibGUgbWluX3NlcGFyYXRpb25fOworCisgIENsYXdUZXN0KCkKKyAgICAgIDogY2xhd19xdWV1ZSgiLmZyYzk3MS5jb250cm9sX2xvb3BzLmNsYXdfcXVldWUiLCAweDlmMWE5OWRkLAorICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5nb2FsIiwKKyAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmNsYXdfcXVldWUucG9zaXRpb24iLAorICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5vdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5zdGF0dXMiKSwKKyAgICAgICAgY2xhd19tb3Rvcl8oJmNsYXdfcXVldWUpLAorICAgICAgICBjbGF3X21vdG9yX3BsYW50XygwLjQsIDAuMiksCisgICAgICAgIG1pbl9zZXBhcmF0aW9uXyhjb25zdGFudHM6OkdldFZhbHVlcygpLmNsYXcuY2xhd19taW5fc2VwYXJhdGlvbikge30KKworICB2b2lkIFZlcmlmeU5lYXJHb2FsKCkgeworICAgIGNsYXdfcXVldWUuZ29hbC5GZXRjaExhdGVzdCgpOworICAgIGNsYXdfcXVldWUucG9zaXRpb24uRmV0Y2hMYXRlc3QoKTsKKyAgICBkb3VibGUgYm90dG9tID0gY2xhd19tb3Rvcl9wbGFudF8uR2V0QWJzb2x1dGVQb3NpdGlvbihCT1RUT01fQ0xBVyk7CisgICAgZG91YmxlIHNlcGFyYXRpb24gPQorICAgICAgICBjbGF3X21vdG9yX3BsYW50Xy5HZXRBYnNvbHV0ZVBvc2l0aW9uKFRPUF9DTEFXKSAtIGJvdHRvbTsKKyAgICBFWFBFQ1RfTkVBUihjbGF3X3F1ZXVlLmdvYWwtPmJvdHRvbV9hbmdsZSwgYm90dG9tLCAxZS00KTsKKyAgICBFWFBFQ1RfTkVBUihjbGF3X3F1ZXVlLmdvYWwtPnNlcGFyYXRpb25fYW5nbGUsIHNlcGFyYXRpb24sIDFlLTQpOworICAgIEVYUEVDVF9MRShtaW5fc2VwYXJhdGlvbl8sIHNlcGFyYXRpb24pOworICB9Cit9OworCitURVNUX0YoQ2xhd1Rlc3QsIEhhbmRsZXNOQU4pIHsKKyAgY2xhd19xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYm90dG9tX2FuZ2xlKDo6c3RkOjpuYW4oIiIpKQorICAgICAgLnNlcGFyYXRpb25fYW5nbGUoOjpzdGQ6Om5hbigiIikpCisgICAgICAuU2VuZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgKytpKSB7CisgICAgY2xhd19tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIGNsYXdfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBjbGF3X21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KK30KKworLy8gVGVzdHMgdGhhdCB0aGUgd3Jpc3QgemVyb3MgY29ycmVjdGx5IGFuZCBnb2VzIHRvIGEgcG9zaXRpb24uCitURVNUX0YoQ2xhd1Rlc3QsIFplcm9zQ29ycmVjdGx5KSB7CisgIGNsYXdfcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmJvdHRvbV9hbmdsZSgwLjEpCisgICAgICAuc2VwYXJhdGlvbl9hbmdsZSgwLjIpCisgICAgICAuU2VuZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgKytpKSB7CisgICAgY2xhd19tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIGNsYXdfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBjbGF3X21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgd3Jpc3QgemVyb3MgY29ycmVjdGx5IGFuZCBnb2VzIHRvIGEgcG9zaXRpb24uCitURVNUX0YoQ2xhd1Rlc3QsIExpbWl0Q2xhd0dvYWwpIHsKKyAgZnJjOTcxOjpjb25zdGFudHM6OlZhbHVlcyB2YWx1ZXM7CisgIHZhbHVlcy5jbGF3LmNsYXdfbWluX3NlcGFyYXRpb24gPSAtMi4wOworICB2YWx1ZXMuY2xhdy5jbGF3X21heF9zZXBhcmF0aW9uID0gMS4wOworICB2YWx1ZXMuY2xhdy5zb2Z0X21pbl9zZXBhcmF0aW9uID0gLTIuMDsKKyAgdmFsdWVzLmNsYXcuc29mdF9tYXhfc2VwYXJhdGlvbiA9IDEuMDsKKyAgdmFsdWVzLmNsYXcudXBwZXJfY2xhdy5sb3dlcl9saW1pdCA9IC01LjA7CisgIHZhbHVlcy5jbGF3LnVwcGVyX2NsYXcudXBwZXJfbGltaXQgPSA3LjU7CisgIHZhbHVlcy5jbGF3Lmxvd2VyX2NsYXcubG93ZXJfbGltaXQgPSAtNS41OworICB2YWx1ZXMuY2xhdy5sb3dlcl9jbGF3LnVwcGVyX2xpbWl0ID0gOC4wOworCisgIGRvdWJsZSBib3R0b21fZ29hbCA9IDAuMDsKKyAgZG91YmxlIHRvcF9nb2FsID0gMC4wOworCisgIExpbWl0Q2xhd0dvYWwoJmJvdHRvbV9nb2FsLCAmdG9wX2dvYWwsIHZhbHVlcyk7CisgIEVYUEVDVF9ORUFSKDAuMCwgYm90dG9tX2dvYWwsIDFlLTQpOworICBFWFBFQ1RfTkVBUigwLjAsIHRvcF9nb2FsLCAxZS00KTsKKworICBib3R0b21fZ29hbCA9IDAuMDsKKyAgdG9wX2dvYWwgPSAtNC4wOworCisgIExpbWl0Q2xhd0dvYWwoJmJvdHRvbV9nb2FsLCAmdG9wX2dvYWwsIHZhbHVlcyk7CisgIEVYUEVDVF9ORUFSKC0xLjAsIGJvdHRvbV9nb2FsLCAxZS00KTsKKyAgRVhQRUNUX05FQVIoLTMuMCwgdG9wX2dvYWwsIDFlLTQpOworCisgIGJvdHRvbV9nb2FsID0gMC4wOworICB0b3BfZ29hbCA9IDQuMDsKKworICBMaW1pdENsYXdHb2FsKCZib3R0b21fZ29hbCwgJnRvcF9nb2FsLCB2YWx1ZXMpOworICBFWFBFQ1RfTkVBUigxLjUsIGJvdHRvbV9nb2FsLCAxZS00KTsKKyAgRVhQRUNUX05FQVIoMi41LCB0b3BfZ29hbCwgMWUtNCk7CisKKyAgYm90dG9tX2dvYWwgPSAtMTAuMDsKKyAgdG9wX2dvYWwgPSAtOS41OworCisgIExpbWl0Q2xhd0dvYWwoJmJvdHRvbV9nb2FsLCAmdG9wX2dvYWwsIHZhbHVlcyk7CisgIEVYUEVDVF9ORUFSKC01LjUsIGJvdHRvbV9nb2FsLCAxZS00KTsKKyAgRVhQRUNUX05FQVIoLTUuMCwgdG9wX2dvYWwsIDFlLTQpOworCisgIGJvdHRvbV9nb2FsID0gLTIwLjA7CisgIHRvcF9nb2FsID0gLTQuMDsKKworICBMaW1pdENsYXdHb2FsKCZib3R0b21fZ29hbCwgJnRvcF9nb2FsLCB2YWx1ZXMpOworICBFWFBFQ1RfTkVBUigtNS41LCBib3R0b21fZ29hbCwgMWUtNCk7CisgIEVYUEVDVF9ORUFSKC00LjUsIHRvcF9nb2FsLCAxZS00KTsKKworICBib3R0b21fZ29hbCA9IC0yMC4wOworICB0b3BfZ29hbCA9IC00LjA7CisKKyAgTGltaXRDbGF3R29hbCgmYm90dG9tX2dvYWwsICZ0b3BfZ29hbCwgdmFsdWVzKTsKKyAgRVhQRUNUX05FQVIoLTUuNSwgYm90dG9tX2dvYWwsIDFlLTQpOworICBFWFBFQ1RfTkVBUigtNC41LCB0b3BfZ29hbCwgMWUtNCk7CisKKyAgYm90dG9tX2dvYWwgPSAtNS4wOworICB0b3BfZ29hbCA9IC0xMC4wOworCisgIExpbWl0Q2xhd0dvYWwoJmJvdHRvbV9nb2FsLCAmdG9wX2dvYWwsIHZhbHVlcyk7CisgIEVYUEVDVF9ORUFSKC0zLjAsIGJvdHRvbV9nb2FsLCAxZS00KTsKKyAgRVhQRUNUX05FQVIoLTUuMCwgdG9wX2dvYWwsIDFlLTQpOworCisgIGJvdHRvbV9nb2FsID0gMTAuMDsKKyAgdG9wX2dvYWwgPSA5LjA7CisKKyAgTGltaXRDbGF3R29hbCgmYm90dG9tX2dvYWwsICZ0b3BfZ29hbCwgdmFsdWVzKTsKKyAgRVhQRUNUX05FQVIoOC4wLCBib3R0b21fZ29hbCwgMWUtNCk7CisgIEVYUEVDVF9ORUFSKDcuMCwgdG9wX2dvYWwsIDFlLTQpOworCisgIGJvdHRvbV9nb2FsID0gOC4wOworICB0b3BfZ29hbCA9IDkuMDsKKworICBMaW1pdENsYXdHb2FsKCZib3R0b21fZ29hbCwgJnRvcF9nb2FsLCB2YWx1ZXMpOworICBFWFBFQ1RfTkVBUig2LjUsIGJvdHRvbV9nb2FsLCAxZS00KTsKKyAgRVhQRUNUX05FQVIoNy41LCB0b3BfZ29hbCwgMWUtNCk7Cit9CisKKworY2xhc3MgWmVyb2luZ0NsYXdUZXN0CisgICAgOiBwdWJsaWMgQ2xhd1Rlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8IDo6c3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPj4ge307CisKKy8vIFRlc3RzIHRoYXQgdGhlIHdyaXN0IHplcm9zIGNvcnJlY3RseSBzdGFydGluZyBvbiB0aGUgaGFsbCBlZmZlY3Qgc2Vuc29yLgorVEVTVF9QKFplcm9pbmdDbGF3VGVzdCwgUGFyYW1ldGVyaXplZFplcm8pIHsKKyAgY2xhd19tb3Rvcl9wbGFudF8uUmVpbml0aWFsaXplKEdldFBhcmFtKCkuZmlyc3QsIEdldFBhcmFtKCkuc2Vjb25kKTsKKworICBjbGF3X3F1ZXVlLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgIC5ib3R0b21fYW5nbGUoMC4xKQorICAgICAgLnNlcGFyYXRpb25fYW5nbGUoMC4yKQorICAgICAgLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA3MDA7ICsraSkgeworICAgIGNsYXdfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBjbGF3X21vdG9yXy5JdGVyYXRlKCk7CisgICAgY2xhd19tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoWmVyb2luZ0NsYXdUZXN0LCBaZXJvaW5nQ2xhd1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyg6OnN0ZDo6bWFrZV9wYWlyKDAuMDQsIDAuMDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcigwLjIsIDAuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6bWFrZV9wYWlyKDAuMywgMC4yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjptYWtlX3BhaXIoMC40LCAwLjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcigwLjUsIDAuNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6bWFrZV9wYWlyKDAuNiwgMC41KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjptYWtlX3BhaXIoMC43LCAwLjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcigwLjgsIDAuNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6bWFrZV9wYWlyKDAuOSwgMC44KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjptYWtlX3BhaXIoMS4wLCAwLjkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcigxLjEsIDEuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6bWFrZV9wYWlyKDEuMTUsIDEuMDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcigxLjA1LCAwLjk1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjptYWtlX3BhaXIoMS4yLCAxLjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcigxLjMsIDEuMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6bWFrZV9wYWlyKDEuNCwgMS4zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjptYWtlX3BhaXIoMS41LCAxLjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcigxLjYsIDEuNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6bWFrZV9wYWlyKDEuNywgMS42KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjptYWtlX3BhaXIoMS44LCAxLjcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcigyLjAxNSwgMi4wMSkKKykpOworCisvKgorLy8gVGVzdHMgdGhhdCBsb29zaW5nIHRoZSBlbmNvZGVyIGZvciBhIHNlY29uZCB0cmlnZ2VycyBhIHJlLXplcm8uCitURVNUX0YoQ2xhd1Rlc3QsIFJlemVyb1dpdGhNaXNzaW5nUG9zKSB7CisgIGNsYXdfcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmJvdHRvbV9hbmdsZSgwLjEpCisgICAgICAuc2VwYXJhdGlvbl9hbmdsZSgwLjIpCisgICAgICAuU2VuZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDgwMDsgKytpKSB7CisgICAgLy8gQWZ0ZXIgMyBzZWNvbmRzLCBzaW11bGF0ZSB0aGUgZW5jb2RlciBnb2luZyBtaXNzaW5nLgorICAgIC8vIFRoaXMgc2hvdWxkIHRyaWdnZXIgYSByZS16ZXJvLiAgVG8gbWFrZSBzdXJlIGl0IHdvcmtzLCBjaGFuZ2UgdGhlIGdvYWwgYXMKKyAgICAvLyB3ZWxsLgorICAgIGlmIChpIDwgMzAwIHx8IGkgPiA0MDApIHsKKyAgICAgIGNsYXdfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGkgPiAzMTApIHsKKyAgICAgICAgLy8gU2hvdWxkIGJlIHJlLXplcm9pbmcgbm93LgorICAgICAgICBFWFBFQ1RfVFJVRShjbGF3X21vdG9yXy5pc191bmluaXRpYWxpemVkKCkpOworICAgICAgfQorICAgICAgY2xhd19xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgLmJvdHRvbV9hbmdsZSgwLjIpCisgICAgICAgICAgLnNlcGFyYXRpb25fYW5nbGUoMC4yKQorICAgICAgICAgIC5TZW5kKCk7CisgICAgfQorICAgIGlmIChpID09IDQxMCkgeworICAgICAgRVhQRUNUX1RSVUUoY2xhd19tb3Rvcl8uaXNfemVyb2luZygpKTsKKyAgICAgIC8vIFRPRE8oYXVzdGluKTogRXhwb3NlIGlmIHRoZSB0b3AgYW5kIGJvdG90bSBpcyB6ZXJvaW5nIHRocm91Z2gKKyAgICAgIC8vIGZ1bmN0aW9ucy4KKyAgICAgIC8vIEVYUEVDVF9UUlVFKGJvdHRvbV9jbGF3X21vdG9yXy5pc196ZXJvaW5nKCkpOworICAgIH0KKworICAgIGNsYXdfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBjbGF3X21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCBkaXNhYmxpbmcgd2hpbGUgemVyb2luZyBzZW5kcyB0aGUgc3RhdGUgbWFjaGluZSBpbnRvIHRoZQorLy8gdW5pbml0aWFsaXplZCBzdGF0ZS4KK1RFU1RfRihDbGF3VGVzdCwgRGlzYWJsZUdvZXNVbmluaXRpYWxpemVkKSB7CisgIGNsYXdfcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmJvdHRvbV9hbmdsZSgwLjEpCisgICAgICAuc2VwYXJhdGlvbl9hbmdsZSgwLjIpCisgICAgICAuU2VuZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDgwMDsgKytpKSB7CisgICAgY2xhd19tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIC8vIEFmdGVyIDAuNSBzZWNvbmRzLCBkaXNhYmxlIHRoZSByb2JvdC4KKyAgICBpZiAoaSA+IDUwICYmIGkgPCAyMDApIHsKKyAgICAgIFNpbXVsYXRlVGltZXN0ZXAoZmFsc2UpOworICAgICAgaWYgKGkgPiAxMDApIHsKKyAgICAgICAgLy8gR2l2ZSB0aGUgbG9vcCBhIGNvdXBsZSBjeWNsZWQgdG8gZ2V0IHRoZSBtZXNzYWdlIGFuZCB0aGVuIHZlcmlmeSB0aGF0CisgICAgICAgIC8vIGl0IGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLgorICAgICAgICBFWFBFQ1RfVFJVRShjbGF3X21vdG9yXy5pc191bmluaXRpYWxpemVkKCkpOworICAgICAgICAvLyBXaGVuIGRpc2FibGVkLCB3ZSBzaG91bGQgYmUgYXBwbHlpbmcgMCBwb3dlci4KKyAgICAgICAgRVhQRUNUX1RSVUUoY2xhd19xdWV1ZS5vdXRwdXQuRmV0Y2hMYXRlc3QoKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBjbGF3X3F1ZXVlLm91dHB1dC0+dG9wX2NsYXdfdm9sdGFnZSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBjbGF3X3F1ZXVlLm91dHB1dC0+Ym90dG9tX2NsYXdfdm9sdGFnZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgICAgfQorICAgIGlmIChpID09IDIwMikgeworICAgICAgLy8gVmVyaWZ5IHRoYXQgd2UgYXJlIHplcm9pbmcgYWZ0ZXIgdGhlIGJvdCBnZXRzIGVuYWJsZWQgYWdhaW4uCisgICAgICBFWFBFQ1RfVFJVRSh3cmlzdF9tb3Rvcl8uaXNfemVyb2luZygpKTsKKyAgICAgIC8vIFRPRE8oYXVzdGluKTogRXhwb3NlIGlmIHRoZSB0b3AgYW5kIGJvdHRvbSBpcyB6ZXJvaW5nIHRocm91Z2gKKyAgICAgIC8vIGZ1bmN0aW9ucy4KKyAgICB9CisKKyAgICBjbGF3X21vdG9yXy5JdGVyYXRlKCk7CisgICAgY2xhd19tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgfQorICBWZXJpZnlOZWFyR29hbCgpOworfQorKi8KKworY2xhc3MgV2luZHVwQ2xhd1Rlc3QgOiBwdWJsaWMgQ2xhd1Rlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBUZXN0V2luZHVwKENsYXdNb3Rvcjo6Q2FsaWJyYXRpb25Nb2RlIG1vZGUsIGludCBzdGFydF90aW1lLCBkb3VibGUgb2Zmc2V0KSB7CisgICAgaW50IGNhcHBlZF9jb3VudCA9IDA7CisgICAgY29uc3QgZnJjOTcxOjpjb25zdGFudHM6OlZhbHVlcyYgdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKyAgICBib29sIGtpY2tlZCA9IGZhbHNlOworICAgIGJvb2wgbWVhc3VyZWQgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDcwMDsgKytpKSB7CisgICAgICBjbGF3X21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgICBpZiAoaSA+PSBzdGFydF90aW1lICYmIG1vZGUgPT0gY2xhd19tb3Rvcl8ubW9kZSgpICYmICFraWNrZWQpIHsKKyAgICAgICAgRVhQRUNUX0VRKG1vZGUsIGNsYXdfbW90b3JfLm1vZGUoKSk7CisgICAgICAgIC8vIE1vdmUgdGhlIHplcm9pbmcgcG9zaXRpb24gZmFyIGF3YXkgYW5kIHZlcmlmeSB0aGF0IGl0IGdldHMgbW92ZWQKKyAgICAgICAgLy8gYmFjay4KKyAgICAgICAgY2xhd19tb3Rvcl8udG9wX2NsYXdfZ29hbF8gKz0gb2Zmc2V0OworICAgICAgICBjbGF3X21vdG9yXy5ib3R0b21fY2xhd19nb2FsXyArPSBvZmZzZXQ7CisgICAgICAgIGtpY2tlZCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoa2lja2VkICYmICFtZWFzdXJlZCkgeworICAgICAgICAgIG1lYXN1cmVkID0gdHJ1ZTsKKyAgICAgICAgICBFWFBFQ1RfRVEobW9kZSwgY2xhd19tb3Rvcl8ubW9kZSgpKTsKKworICAgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPiBSOworICAgICAgICAgIFIgPDwgY2xhd19tb3Rvcl8uYm90dG9tX2NsYXdfZ29hbF8sCisgICAgICAgICAgICAgIGNsYXdfbW90b3JfLnRvcF9jbGF3X2dvYWxfIC0gY2xhd19tb3Rvcl8uYm90dG9tX2NsYXdfZ29hbF8sIDAuMCwKKyAgICAgICAgICAgICAgMC4wOworICAgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiB1bmNhcHBlZF92b2x0YWdlID0KKyAgICAgICAgICAgICAgY2xhd19tb3Rvcl8uY2xhd18uSygpICogKFIgLSBjbGF3X21vdG9yXy5jbGF3Xy5YX2hhdCgpKTsKKyAgICAgICAgICAvLyBVc2UgYSBmYWN0b3Igb2YgMS44IGJlY2F1c2Ugc28gbG9uZyBhcyBpdCBpc24ndCBhY3R1YWxseSBydW5uaW5nCisgICAgICAgICAgLy8gYXdheSwgdGhlIENhcFUgZnVuY3Rpb24gd2lsbCBkZWFsIHdpdGggZ2V0dGluZyB0aGUgYWN0dWFsIG91dHB1dAorICAgICAgICAgIC8vIGRvd24uCisgICAgICAgICAgRVhQRUNUX0xUKDo6c3RkOjphYnModW5jYXBwZWRfdm9sdGFnZSgwLCAwKSksCisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5jbGF3Lm1heF96ZXJvaW5nX3ZvbHRhZ2UgKiAxLjgpOworICAgICAgICAgIEVYUEVDVF9MVCg6OnN0ZDo6YWJzKHVuY2FwcGVkX3ZvbHRhZ2UoMSwgMCkpLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy5tYXhfemVyb2luZ192b2x0YWdlICogMS44KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGNsYXdfbW90b3JfLm1vZGUoKSA9PSBtb2RlKSB7CisgICAgICAgIGlmIChjbGF3X21vdG9yXy5jYXBwZWRfZ29hbCgpKSB7CisgICAgICAgICAgKytjYXBwZWRfY291bnQ7CisgICAgICAgICAgLy8gVGhlIGN5Y2xlIGFmdGVyIHdlIGtpY2sgdGhlIHplcm8gcG9zaXRpb24gaXMgdGhlIG9ubHkgY3ljbGUgZHVyaW5nCisgICAgICAgICAgLy8gd2hpY2ggd2Ugc2hvdWxkIGV4cGVjdCB0byBzZWUgYSBoaWdoIHVuY2FwcGVkIHBvd2VyIGR1cmluZyB6ZXJvaW5nLgorICAgICAgICAgIEFTU0VSVF9MVCh2YWx1ZXMuY2xhdy5tYXhfemVyb2luZ192b2x0YWdlLAorICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6YWJzKGNsYXdfbW90b3JfLnVuY2FwcGVkX2F2ZXJhZ2Vfdm9sdGFnZSgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQVNTRVJUX0dUKHZhbHVlcy5jbGF3Lm1heF96ZXJvaW5nX3ZvbHRhZ2UsCisgICAgICAgICAgICAgICAgICAgIDo6c3RkOjphYnMoY2xhd19tb3Rvcl8udW5jYXBwZWRfYXZlcmFnZV92b2x0YWdlKCkpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjbGF3X21vdG9yXy5JdGVyYXRlKCk7CisgICAgICBjbGF3X21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgICB9CisgICAgRVhQRUNUX1RSVUUoa2lja2VkKTsKKyAgICBFWFBFQ1RfVFJVRShtZWFzdXJlZCk7CisgICAgRVhQRUNUX0xFKDEsIGNhcHBlZF9jb3VudCk7CisgICAgRVhQRUNUX0dFKDMsIGNhcHBlZF9jb3VudCk7CisgIH0KK307CisKKy8vIFRlc3RzIHRoYXQgdGhlIHdyaXN0IGNhbid0IGdldCB0b28gZmFyIGF3YXkgZnJvbSB0aGUgemVyb2luZyBwb3NpdGlvbiBpZiB0aGUKKy8vIHplcm9pbmcgcG9zaXRpb24gaXMgc2F0dXJhdGluZyB0aGUgZ29hbC4KK1RFU1RfRihXaW5kdXBDbGF3VGVzdCwgTm9XaW5kdXBQb3NpdGl2ZSkgeworICBjbGF3X3F1ZXVlLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgIC5ib3R0b21fYW5nbGUoMC4xKQorICAgICAgLnNlcGFyYXRpb25fYW5nbGUoMC4yKQorICAgICAgLlNlbmQoKTsKKworICBUZXN0V2luZHVwKENsYXdNb3Rvcjo6VU5LTk9XTl9MT0NBVElPTiwgMTAwLCA5NzEuMCk7CisKKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgd3Jpc3QgY2FuJ3QgZ2V0IHRvbyBmYXIgYXdheSBmcm9tIHRoZSB6ZXJvaW5nIHBvc2l0aW9uIGlmIHRoZQorLy8gemVyb2luZyBwb3NpdGlvbiBpcyBzYXR1cmF0aW5nIHRoZSBnb2FsLgorVEVTVF9GKFdpbmR1cENsYXdUZXN0LCBOb1dpbmR1cE5lZ2F0aXZlKSB7CisgIGNsYXdfcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmJvdHRvbV9hbmdsZSgwLjEpCisgICAgICAuc2VwYXJhdGlvbl9hbmdsZSgwLjIpCisgICAgICAuU2VuZCgpOworCisgIFRlc3RXaW5kdXAoQ2xhd01vdG9yOjpVTktOT1dOX0xPQ0FUSU9OLCAxMDAsIC05NzEuMCk7CisKKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgd3Jpc3QgY2FuJ3QgZ2V0IHRvbyBmYXIgYXdheSBmcm9tIHRoZSB6ZXJvaW5nIHBvc2l0aW9uIGlmIHRoZQorLy8gemVyb2luZyBwb3NpdGlvbiBpcyBzYXR1cmF0aW5nIHRoZSBnb2FsLgorVEVTVF9GKFdpbmR1cENsYXdUZXN0LCBOb1dpbmR1cE5lZ2F0aXZlRmluZVR1bmUpIHsKKyAgY2xhd19xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYm90dG9tX2FuZ2xlKDAuMSkKKyAgICAgIC5zZXBhcmF0aW9uX2FuZ2xlKDAuMikKKyAgICAgIC5TZW5kKCk7CisKKyAgVGVzdFdpbmR1cChDbGF3TW90b3I6OkZJTkVfVFVORV9CT1RUT00sIDIwMCwgLTk3MS4wKTsKKworICBWZXJpZnlOZWFyR29hbCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X21haW4uY2MgYi95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzNkNmYKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tYWluLmNjCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5oIgorCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorCitpbnQgbWFpbigpIHsKKyAgOjphb3M6OkluaXQoKTsKKyAgZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDbGF3TW90b3IgY2xhdzsKKyAgY2xhdy5SdW4oKTsKKyAgOjphb3M6OkNsZWFudXAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tb3Rvcl9wbGFudC5jYyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X21vdG9yX3BsYW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmE4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tb3Rvcl9wbGFudC5jYwpAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbW90b3JfcGxhbnQuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlQ2xhd1BsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQTsKKyAgQSA8PCAxLjAsIDAuMCwgMC4wMDkwOTMzMTAzNTI5OCwgMC4wLCAwLjAsIDEuMCwgLTYuMDQ1MTQzMjM5NjJlLTA1LCAwLjAwOTAzMjg1ODkyMDU4LCAwLjAsIDAuMCwgMC44MjQzMTU2NDIyNTUsIDAuMCwgMC4wLCAwLjAsIC0wLjAxMTI5NzUyNjYzNjgsIDAuODEzMDE4MTE1NjE4OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gQjsKKyAgQiA8PCAwLjAwMDM1MjUyNzEzMzg4OSwgMC4wLCAtMC4wMDAzNTI1MjcxMzM4ODksIDAuMDAwMzc2MDMxMDY0MTE4LCAwLjA2ODMwNzI3OTQ2MjgsIDAuMCwgLTAuMDY4MzA3Mjc5NDYyOCwgMC4wNzI2OTk4MzUwNjE1OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gQzsKKyAgQyA8PCAxLCAwLCAwLCAwLCAxLCAxLCAwLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRDsKKyAgRCA8PCAwLCAwLCAwLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjAsIDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjAsIC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VDbGF3Q29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEw7CisgIEwgPDwgMS43MjQzMTU2NDIyNSwgMi43MDQ3Mjk1ODcwM2UtMTYsIC0xLjcyNDMxNTY0MjI1LCAxLjcxMzAxODExNTYyLCA2NS45NDU2OTk3MDI2LCAxLjAzNDc4OTA2MTA1ZS0xNCwgLTY1Ljk0NTY5OTcwMjYsIDY0LjQ2NDI2ODcxOTQ7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA0PiBLOworICBLIDw8IDEwNi4xMzgwMjg4NzUsIDAuMCwgNC4yMDAxMjQ5MjY1OCwgMC4wLCA5OS41MDM4NDA3MzY3LCA5OS43MjUxMjMwODgyLCAzLjc3NjgzMzEwMDk2LCAzLjc4OTgwNzM4MDMyOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQV9pbnY7CisgIEFfaW52IDw8IDEuMCwgMC4wLCAtMC4wMTEwMzEzNDUxMzg3LCAwLjAsIDAuMCwgMS4wLCAtNy44OTM0ODc0Nzc3OGUtMDUsIC0wLjAxMTExMDI4MDAxMzUsIDAuMCwgMC4wLCAxLjIxMzEyNzUzMTE4LCAwLjAsIDAuMCwgMC4wLCAwLjAxNjg1NzM2MTg4OSwgMS4yMjk5ODQ4OTMwNzsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KEwsIEssIEFfaW52LCBNYWtlQ2xhd1BsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4gTWFrZUNsYXdQbGFudCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+Pj4gcGxhbnRzKDEpOworICBwbGFudHNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4oTWFrZUNsYXdQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4oJnBsYW50cyk7Cit9CisKK1N0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+IE1ha2VDbGF3TG9vcCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+PiBjb250cm9sbGVycygxKTsKKyAgY29udHJvbGxlcnNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KE1ha2VDbGF3Q29udHJvbGxlcigpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPigmY29udHJvbGxlcnMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbW90b3JfcGxhbnQuaCBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X21vdG9yX3BsYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZTMzYQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X21vdG9yX3BsYW50LmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBZMjAxNF9DT05UUk9MX0xPT1BTX0NMQVdfQ0xBV19NT1RPUl9QTEFOVF9IXworI2RlZmluZSBZMjAxNF9DT05UUk9MX0xPT1BTX0NMQVdfQ0xBV19NT1RPUl9QTEFOVF9IXworCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKK3N0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtDbGF3TW9tZW50T2ZJbmVydGlhUmF0aW8gPSAwLjkzMzMzMzsKKworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZUNsYXdQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPiBNYWtlQ2xhd0NvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+IE1ha2VDbGF3UGxhbnQoKTsKKworU3RhdGVGZWVkYmFja0xvb3A8NCwgMiwgMj4gTWFrZUNsYXdMb29wKCk7CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTRfQ09OVFJPTF9MT09QU19DTEFXX0NMQVdfTU9UT1JfUExBTlRfSF8KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9yZXBsYXlfY2xhdy5jYyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9yZXBsYXlfY2xhdy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ4ODFjCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L3JlcGxheV9jbGF3LmNjCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3JlcGxheV9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisKKy8vIFJlYWRzIG9uZSBvciBtb3JlIGxvZyBmaWxlcyBhbmQgc2VuZHMgb3V0IGFsbCB0aGUgcXVldWUgbWVzc2FnZXMgKGluIHRoZQorLy8gY29ycmVjdCBvcmRlciBhbmQgYXQgdGhlIGNvcnJlY3QgdGltZSkgdG8gZmVlZCBhICJsaXZlIiBjbGF3IHByb2Nlc3MuCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBpZiAoYXJnYyA8PSAxKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJOZWVkIGF0IGxlYXN0IG9uZSBmaWxlIHRvIHJlcGxheSFcbiIpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICA6OmFvczo6SW5pdE5SVCgpOworCisgIDo6YW9zOjpjb250cm9sczo6Q29udHJvbExvb3BSZXBsYXllcjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6Q2xhd1F1ZXVlPgorICAgICAgcmVwbGF5ZXIoJjo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLCAiY2xhdyIpOworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgIHJlcGxheWVyLlByb2Nlc3NGaWxlKGFyZ3ZbaV0pOworICB9CisKKyAgOjphb3M6OkNsZWFudXAoKTsKK30KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmNjIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiOGVkMgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmNjCkBAIC0wLDAgKzEsNzc1IEBACisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiRWlnZW4vRGVuc2UiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbW1vbm1hdGguaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9tYXRyaXhfbG9nZ2luZy5oIgorCisjaW5jbHVkZSAieTIwMTQvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2NvZXJjZV9nb2FsLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvcXVldWVzL2d5cm8ucS5oIgorI2luY2x1ZGUgImZyYzk3MS9zaGlmdGVyX2hhbGxfZWZmZWN0LmgiCisKKy8vIEEgY29uc2lzdGVudCB3YXkgdG8gbWFyayBjb2RlIHRoYXQgZ29lcyBhd2F5IHdpdGhvdXQgc2hpZnRlcnMuIEl0J3Mgc3RpbGwKKy8vIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGhhdmUgc2hpZnRlcnMgYWdhaW4gaW4gdGhlIGZ1dHVyZS4KKyNkZWZpbmUgSEFWRV9TSElGVEVSUyAxCisKK3VzaW5nIGZyYzk3MTo6c2Vuc29yczo6Z3lyb19yZWFkaW5nOworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworY2xhc3MgRHJpdmV0cmFpbk1vdG9yc1NTIHsKKyBwdWJsaWM6CisgIGNsYXNzIExpbWl0ZWREcml2ZXRyYWluTG9vcCA6IHB1YmxpYyBTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPiB7CisgICBwdWJsaWM6CisgICAgTGltaXRlZERyaXZldHJhaW5Mb29wKFN0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+ICYmbG9vcCkKKyAgICAgICAgOiBTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPig6OnN0ZDo6bW92ZShsb29wKSksCisgICAgICAgIFVfUG9seV8oKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPigpIDw8IDEsIDAsCisgICAgICAgICAgICAgICAgIC0xLCAwLAorICAgICAgICAgICAgICAgICAwLCAxLAorICAgICAgICAgICAgICAgICAwLCAtMSkuZmluaXNoZWQoKSwKKyAgICAgICAgICAgICAgICAoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+KCkgPDwgMTIuMCwgMTIuMCwKKyAgICAgICAgICAgICAgICAgMTIuMCwgMTIuMCkuZmluaXNoZWQoKSkgeworICAgICAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8MD46OkluaXQoKTsKKyAgICAgIFQgPDwgMSwgLTEsIDEsIDE7CisgICAgICBUX2ludmVyc2UgPSBULmludmVyc2UoKTsKKyAgICB9CisKKyAgICBib29sIG91dHB1dF93YXNfY2FwcGVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIG91dHB1dF93YXNfY2FwcGVkXzsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIENhcFUoKSB7CisgICAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMT4gZXJyb3IgPSBSKCkgLSBYX2hhdCgpOworCisgICAgICBpZiAoOjpzdGQ6OmFicyhVKDAsIDApKSA+IDEyLjAgfHwgOjpzdGQ6OmFicyhVKDEsIDApKSA+IDEyLjApIHsKKyAgICAgICAgbXV0YWJsZV9VKCkgPQorICAgICAgICAgICAgVSgpICogMTIuMCAvIDo6c3RkOjptYXgoOjpzdGQ6OmFicyhVKDAsIDApKSwgOjpzdGQ6OmFicyhVKDEsIDApKSk7CisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJVIGlzIG5vdyIsIFUoKSk7CisgICAgICAgIC8vIFRPRE8oQXVzdGluKTogRmlndXJlIG91dCB3aHkgdGhlIHBvbHl0b3BlIHN0dWZmIHdhc24ndCB3b3JraW5nIGFuZAorICAgICAgICAvLyByZW1vdmUgdGhpcyBoYWNrLgorICAgICAgICBvdXRwdXRfd2FzX2NhcHBlZF8gPSB0cnVlOworICAgICAgICByZXR1cm47CisKKyAgICAgICAgTE9HX01BVFJJWChERUJVRywgIlUgYXQgc3RhcnQiLCBVKCkpOworICAgICAgICBMT0dfTUFUUklYKERFQlVHLCAiUiBhdCBzdGFydCIsIFIoKSk7CisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJYaGF0IGF0IHN0YXJ0IiwgWF9oYXQoKSk7CisKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IHBvc2l0aW9uX0s7CisgICAgICAgIHBvc2l0aW9uX0sgPDwgSygwLCAwKSwgSygwLCAyKSwKKyAgICAgICAgICAgICAgICAgICBLKDEsIDApLCBLKDEsIDIpOworICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gdmVsb2NpdHlfSzsKKyAgICAgICAgdmVsb2NpdHlfSyA8PCBLKDAsIDEpLCBLKDAsIDMpLAorICAgICAgICAgICAgICAgICAgIEsoMSwgMSksIEsoMSwgMyk7CisKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHBvc2l0aW9uX2Vycm9yOworICAgICAgICBwb3NpdGlvbl9lcnJvciA8PCBlcnJvcigwLCAwKSwgZXJyb3IoMiwgMCk7CisgICAgICAgIGNvbnN0IGF1dG8gZHJpdmVfZXJyb3IgPSBUX2ludmVyc2UgKiBwb3NpdGlvbl9lcnJvcjsKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHZlbG9jaXR5X2Vycm9yOworICAgICAgICB2ZWxvY2l0eV9lcnJvciA8PCBlcnJvcigxLCAwKSwgZXJyb3IoMywgMCk7CisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJlcnJvciIsIGVycm9yKTsKKworICAgICAgICBjb25zdCBhdXRvICZwb2x5ID0gVV9Qb2x5XzsKKyAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IHBvc19wb2x5X0ggPQorICAgICAgICAgICAgcG9seS5IKCkgKiBwb3NpdGlvbl9LICogVDsKKyAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IHBvc19wb2x5X2sgPQorICAgICAgICAgICAgcG9seS5rKCkgLSBwb2x5LkgoKSAqIHZlbG9jaXR5X0sgKiB2ZWxvY2l0eV9lcnJvcjsKKyAgICAgICAgY29uc3QgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gcG9zX3BvbHkocG9zX3BvbHlfSCwgcG9zX3BvbHlfayk7CisKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGFkanVzdGVkX3Bvc19lcnJvcjsKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGF1dG8gJlAgPSBkcml2ZV9lcnJvcjsKKworICAgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBMNDU7CisgICAgICAgICAgTDQ1IDw8IDo6YW9zOjpzaWduKFAoMSwgMCkpLCAtOjphb3M6OnNpZ24oUCgwLCAwKSk7CisgICAgICAgICAgY29uc3QgZG91YmxlIHc0NSA9IDA7CisKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gTEg7CisgICAgICAgICAgaWYgKDo6c3RkOjphYnMoUCgwLCAwKSkgPiA6OnN0ZDo6YWJzKFAoMSwgMCkpKSB7CisgICAgICAgICAgICBMSCA8PCAwLCAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMSCA8PCAxLCAwOworICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdCBkb3VibGUgd2ggPSBMSC5kb3QoUCk7CisKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gc3RhbmRhcmQ7CisgICAgICAgICAgc3RhbmRhcmQgPDwgTDQ1LCBMSDsKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVzsKKyAgICAgICAgICBXIDw8IHc0NSwgd2g7CisgICAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGludGVyc2VjdGlvbiA9CisgICAgICAgICAgICAgIHN0YW5kYXJkLmludmVyc2UoKSAqIFc7CisKKyAgICAgICAgICBib29sIGlzX2luc2lkZV9oOworICAgICAgICAgIGNvbnN0IGF1dG8gYWRqdXN0ZWRfcG9zX2Vycm9yX2ggPQorICAgICAgICAgICAgICBEb0NvZXJjZUdvYWwocG9zX3BvbHksIExILCB3aCwgZHJpdmVfZXJyb3IsICZpc19pbnNpZGVfaCk7CisgICAgICAgICAgY29uc3QgYXV0byBhZGp1c3RlZF9wb3NfZXJyb3JfNDUgPQorICAgICAgICAgICAgICBEb0NvZXJjZUdvYWwocG9zX3BvbHksIEw0NSwgdzQ1LCBpbnRlcnNlY3Rpb24sIG51bGxwdHIpOworICAgICAgICAgIGlmIChwb3NfcG9seS5Jc0luc2lkZShpbnRlcnNlY3Rpb24pKSB7CisgICAgICAgICAgICBhZGp1c3RlZF9wb3NfZXJyb3IgPSBhZGp1c3RlZF9wb3NfZXJyb3JfaDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzX2luc2lkZV9oKSB7CisgICAgICAgICAgICAgIGlmIChhZGp1c3RlZF9wb3NfZXJyb3JfaC5ub3JtKCkgPiBhZGp1c3RlZF9wb3NfZXJyb3JfNDUubm9ybSgpKSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ZWRfcG9zX2Vycm9yID0gYWRqdXN0ZWRfcG9zX2Vycm9yX2g7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ZWRfcG9zX2Vycm9yID0gYWRqdXN0ZWRfcG9zX2Vycm9yXzQ1OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBhZGp1c3RlZF9wb3NfZXJyb3IgPSBhZGp1c3RlZF9wb3NfZXJyb3JfNDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTE9HX01BVFJJWChERUJVRywgImFkanVzdGVkX3Bvc19lcnJvciIsIGFkanVzdGVkX3Bvc19lcnJvcik7CisgICAgICAgIG11dGFibGVfVSgpID0KKyAgICAgICAgICAgIHZlbG9jaXR5X0sgKiB2ZWxvY2l0eV9lcnJvciArIHBvc2l0aW9uX0sgKiBUICogYWRqdXN0ZWRfcG9zX2Vycm9yOworICAgICAgICBMT0dfTUFUUklYKERFQlVHLCAiVSBpcyBub3ciLCBVKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0X3dhc19jYXBwZWRfID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gVV9Qb2x5XzsKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gVCwgVF9pbnZlcnNlOworICAgIGJvb2wgb3V0cHV0X3dhc19jYXBwZWRfID0gZmFsc2U7OworICB9OworCisgIERyaXZldHJhaW5Nb3RvcnNTUygpCisgICAgICA6IGxvb3BfKG5ldyBMaW1pdGVkRHJpdmV0cmFpbkxvb3AoCisgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLm1ha2VfZHJpdmV0cmFpbl9sb29wKCkpKSwKKyAgICAgICAgZmlsdGVyZWRfb2Zmc2V0XygwLjApLAorICAgICAgICBneXJvXygwLjApLAorICAgICAgICBsZWZ0X2dvYWxfKDAuMCksCisgICAgICAgIHJpZ2h0X2dvYWxfKDAuMCksCisgICAgICAgIHJhd19sZWZ0XygwLjApLAorICAgICAgICByYXdfcmlnaHRfKDAuMCkgeworICAgIC8vIExvdyBnZWFyIG9uIGJvdGguCisgICAgbG9vcF8tPnNldF9jb250cm9sbGVyX2luZGV4KDApOworICB9CisKKyAgdm9pZCBTZXRHb2FsKGRvdWJsZSBsZWZ0LCBkb3VibGUgbGVmdF92ZWxvY2l0eSwgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0X3ZlbG9jaXR5KSB7CisgICAgbGVmdF9nb2FsXyA9IGxlZnQ7CisgICAgcmlnaHRfZ29hbF8gPSByaWdodDsKKyAgICBsb29wXy0+bXV0YWJsZV9SKCkgPDwgbGVmdCwgbGVmdF92ZWxvY2l0eSwgcmlnaHQsIHJpZ2h0X3ZlbG9jaXR5OworICB9CisgIHZvaWQgU2V0UmF3UG9zaXRpb24oZG91YmxlIGxlZnQsIGRvdWJsZSByaWdodCkgeworICAgIHJhd19yaWdodF8gPSByaWdodDsKKyAgICByYXdfbGVmdF8gPSBsZWZ0OworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBZOworICAgIFkgPDwgbGVmdCArIGZpbHRlcmVkX29mZnNldF8sIHJpZ2h0IC0gZmlsdGVyZWRfb2Zmc2V0XzsKKyAgICBsb29wXy0+Q29ycmVjdChZKTsKKyAgfQorICB2b2lkIFNldFBvc2l0aW9uKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBneXJvKSB7CisgICAgLy8gRGVjYXkgdGhlIG9mZnNldCBxdWlja2x5IGJlY2F1c2UgdGhpcyBneXJvIGlzIGdyZWF0LgorICAgIGNvbnN0IGRvdWJsZSBvZmZzZXQgPQorICAgICAgICAocmlnaHQgLSBsZWZ0IC0gZ3lybyAqIGNvbnN0YW50czo6R2V0VmFsdWVzKCkudHVybl93aWR0aCkgLyAyLjA7CisgICAgZmlsdGVyZWRfb2Zmc2V0XyA9IDAuMjUgKiBvZmZzZXQgKyAwLjc1ICogZmlsdGVyZWRfb2Zmc2V0XzsKKyAgICBneXJvXyA9IGd5cm87CisgICAgU2V0UmF3UG9zaXRpb24obGVmdCwgcmlnaHQpOworICB9CisKKyAgdm9pZCBTZXRFeHRlcm5hbE1vdG9ycyhkb3VibGUgbGVmdF92b2x0YWdlLCBkb3VibGUgcmlnaHRfdm9sdGFnZSkgeworICAgIGxvb3BfLT5tdXRhYmxlX1UoKSA8PCBsZWZ0X3ZvbHRhZ2UsIHJpZ2h0X3ZvbHRhZ2U7CisgIH0KKworICB2b2lkIFVwZGF0ZShib29sIHN0b3BfbW90b3JzLCBib29sIGVuYWJsZV9jb250cm9sX2xvb3ApIHsKKyAgICBpZiAoZW5hYmxlX2NvbnRyb2xfbG9vcCkgeworICAgICAgbG9vcF8tPlVwZGF0ZShzdG9wX21vdG9ycyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdG9wX21vdG9ycykgeworICAgICAgICBsb29wXy0+bXV0YWJsZV9VKCkuc2V0WmVybygpOworICAgICAgICBsb29wXy0+bXV0YWJsZV9VX3VuY2FwcGVkKCkuc2V0WmVybygpOworICAgICAgfQorICAgICAgbG9vcF8tPlVwZGF0ZU9ic2VydmVyKCk7CisgICAgfQorICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IEUgPSBsb29wXy0+UigpIC0gbG9vcF8tPlhfaGF0KCk7CisgICAgTE9HX01BVFJJWChERUJVRywgIkUiLCBFKTsKKyAgfQorCisgIGRvdWJsZSBHZXRFc3RpbWF0ZWRSb2JvdFNwZWVkKCkgY29uc3QgeworICAgIC8vIGxldHMganVzdCBjYWxsIHRoZSBhdmVyYWdlIG9mIGxlZnQgYW5kIHJpZ2h0IHZlbG9jaXRpZXMgY2xvc2UgZW5vdWdoCisgICAgcmV0dXJuIChsb29wXy0+WF9oYXQoMSwgMCkgKyBsb29wXy0+WF9oYXQoMywgMCkpIC8gMjsKKyAgfQorCisgIGRvdWJsZSBHZXRFc3RpbWF0ZWRMZWZ0RW5jb2RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9vcF8tPlhfaGF0KDAsIDApOworICB9CisKKyAgZG91YmxlIEdldEVzdGltYXRlZFJpZ2h0RW5jb2RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9vcF8tPlhfaGF0KDIsIDApOworICB9CisKKyAgYm9vbCBPdXRwdXRXYXNDYXBwZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGxvb3BfLT5vdXRwdXRfd2FzX2NhcHBlZCgpOworICB9CisKKyAgdm9pZCBTZW5kTW90b3JzKERyaXZldHJhaW5RdWV1ZTo6T3V0cHV0ICpvdXRwdXQpIGNvbnN0IHsKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICBvdXRwdXQtPmxlZnRfdm9sdGFnZSA9IGxvb3BfLT5VKDAsIDApOworICAgICAgb3V0cHV0LT5yaWdodF92b2x0YWdlID0gbG9vcF8tPlUoMSwgMCk7CisgICAgICBvdXRwdXQtPmxlZnRfaGlnaCA9IGZhbHNlOworICAgICAgb3V0cHV0LT5yaWdodF9oaWdoID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgY29uc3QgTGltaXRlZERyaXZldHJhaW5Mb29wICZsb29wKCkgY29uc3QgeyByZXR1cm4gKmxvb3BfOyB9CisKKyBwcml2YXRlOgorICA6OnN0ZDo6dW5pcXVlX3B0cjxMaW1pdGVkRHJpdmV0cmFpbkxvb3A+IGxvb3BfOworCisgIGRvdWJsZSBmaWx0ZXJlZF9vZmZzZXRfOworICBkb3VibGUgZ3lyb187CisgIGRvdWJsZSBsZWZ0X2dvYWxfOworICBkb3VibGUgcmlnaHRfZ29hbF87CisgIGRvdWJsZSByYXdfbGVmdF87CisgIGRvdWJsZSByYXdfcmlnaHRfOworfTsKKworY2xhc3MgUG9seURyaXZldHJhaW4geworIHB1YmxpYzoKKworICBlbnVtIEdlYXIgeworICAgIEhJR0gsCisgICAgTE9XLAorICAgIFNISUZUSU5HX1VQLAorICAgIFNISUZUSU5HX0RPV04KKyAgfTsKKyAgLy8gU3RhbGwgVG9ycXVlIGluIE4gbQorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU3RhbGxUb3JxdWUgPSAyLjQyOworICAvLyBTdGFsbCBDdXJyZW50IGluIEFtcHMKKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1N0YWxsQ3VycmVudCA9IDEzMy4wOworICAvLyBGcmVlIFNwZWVkIGluIFJQTS4gVXNlZCBudW1iZXIgZnJvbSBsYXN0IHllYXIuCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtGcmVlU3BlZWQgPSA0NjUwLjA7CisgIC8vIEZyZWUgQ3VycmVudCBpbiBBbXBzCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtGcmVlQ3VycmVudCA9IDIuNzsKKyAgLy8gTW9tZW50IG9mIGluZXJ0aWEgb2YgdGhlIGRyaXZldHJhaW4gaW4ga2cgbV4yCisgIC8vIEp1c3QgYm9ycm93ZWQgZnJvbSBsYXN0IHllYXIuCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIEogPSA2LjQ7CisgIC8vIE1hc3Mgb2YgdGhlIHJvYm90LCBpbiBrZy4KKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUgbSA9IDY4LjA7CisgIC8vIFJhZGl1cyBvZiB0aGUgcm9ib3QsIGluIG1ldGVycyAoZnJvbSBsYXN0IHllYXIpLgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSByYiA9IDAuNjE3OTk4NjQ0IC8gMi4wOworICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrV2hlZWxSYWRpdXMgPSAwLjA0NDQ1OworICAvLyBSZXNpc3RhbmNlIG9mIHRoZSBtb3RvciwgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIG1vdG9ycy4KKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1IgPSAoMTIuMCAvIGtTdGFsbEN1cnJlbnQgLyA0ICsgMC4wMykgLyAoMC45MyAqIDAuOTMpOworICAvLyBNb3RvciB2ZWxvY2l0eSBjb25zdGFudAorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBLdiA9CisgICAgICAoKGtGcmVlU3BlZWQgLyA2MC4wICogMi4wICogTV9QSSkgLyAoMTIuMCAtIGtSICoga0ZyZWVDdXJyZW50KSk7CisgIC8vIFRvcnF1ZSBjb25zdGFudAorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBLdCA9IGtTdGFsbFRvcnF1ZSAvIGtTdGFsbEN1cnJlbnQ7CisKKyAgUG9seURyaXZldHJhaW4oKQorICAgICAgOiBVX1BvbHlfKChFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4oKSA8PCAvKltbKi8gMSwgMCAvKl0qLywKKyAgICAgICAgICAgICAgICAgLypbKi8gLTEsIDAgLypdKi8sCisgICAgICAgICAgICAgICAgIC8qWyovIDAsIDEgLypdKi8sCisgICAgICAgICAgICAgICAgIC8qWyovIDAsIC0xIC8qXV0qLykuZmluaXNoZWQoKSwKKyAgICAgICAgICAgICAgICAoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+KCkgPDwgLypbWyovIDEyIC8qXSovLAorICAgICAgICAgICAgICAgICAvKlsqLyAxMiAvKl0qLywKKyAgICAgICAgICAgICAgICAgLypbKi8gMTIgLypdKi8sCisgICAgICAgICAgICAgICAgIC8qWyovIDEyIC8qXV0qLykuZmluaXNoZWQoKSksCisgICAgICAgIGxvb3BfKG5ldyBTdGF0ZUZlZWRiYWNrTG9vcDwyLCAyLCAyPigKKyAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkubWFrZV92X2RyaXZldHJhaW5fbG9vcCgpKSksCisgICAgICAgIHR0cnVzdF8oMS4xKSwKKyAgICAgICAgd2hlZWxfKDAuMCksCisgICAgICAgIHRocm90dGxlXygwLjApLAorICAgICAgICBxdWlja3R1cm5fKGZhbHNlKSwKKyAgICAgICAgc3RhbGVfY291bnRfKDApLAorICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXygwLjAxKSwKKyAgICAgICAgbGVmdF9nZWFyXyhMT1cpLAorICAgICAgICByaWdodF9nZWFyXyhMT1cpLAorICAgICAgICBjb3VudGVyXygwKSB7CisKKyAgICBsYXN0X3Bvc2l0aW9uXy5aZXJvKCk7CisgICAgcG9zaXRpb25fLlplcm8oKTsKKyAgfQorICBzdGF0aWMgYm9vbCBJc0luR2VhcihHZWFyIGdlYXIpIHsgcmV0dXJuIGdlYXIgPT0gTE9XIHx8IGdlYXIgPT0gSElHSDsgfQorCisgIHN0YXRpYyBkb3VibGUgTW90b3JTcGVlZChjb25zdCBjb25zdGFudHM6OlNoaWZ0ZXJIYWxsRWZmZWN0ICZoYWxsX2VmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzaGlmdGVyX3Bvc2l0aW9uLCBkb3VibGUgdmVsb2NpdHkpIHsKKyAgICAvLyBUT0RPKGF1c3Rpbik6IEdfaGlnaCwgR19sb3cgYW5kIGtXaGVlbFJhZGl1cworICAgIGNvbnN0IGRvdWJsZSBhdmdfaGFsbF9lZmZlY3QgPQorICAgICAgICAoaGFsbF9lZmZlY3QuY2xlYXJfaGlnaCArIGhhbGxfZWZmZWN0LmNsZWFyX2xvdykgLyAyLjA7CisKKyAgICBpZiAoc2hpZnRlcl9wb3NpdGlvbiA+IGF2Z19oYWxsX2VmZmVjdCkgeworICAgICAgcmV0dXJuIHZlbG9jaXR5IC8gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5oaWdoX2dlYXJfcmF0aW8gLyBrV2hlZWxSYWRpdXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB2ZWxvY2l0eSAvIGNvbnN0YW50czo6R2V0VmFsdWVzKCkubG93X2dlYXJfcmF0aW8gLyBrV2hlZWxSYWRpdXM7CisgICAgfQorICB9CisKKyAgR2VhciBDb21wdXRlR2Vhcihjb25zdCBjb25zdGFudHM6OlNoaWZ0ZXJIYWxsRWZmZWN0ICZoYWxsX2VmZmVjdCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgdmVsb2NpdHksIEdlYXIgY3VycmVudCkgeworICAgIGNvbnN0IGRvdWJsZSBsb3dfb21lZ2EgPSBNb3RvclNwZWVkKGhhbGxfZWZmZWN0LCAwLjAsIDo6c3RkOjphYnModmVsb2NpdHkpKTsKKyAgICBjb25zdCBkb3VibGUgaGlnaF9vbWVnYSA9CisgICAgICAgIE1vdG9yU3BlZWQoaGFsbF9lZmZlY3QsIDEuMCwgOjpzdGQ6OmFicyh2ZWxvY2l0eSkpOworCisgICAgZG91YmxlIGhpZ2hfdG9ycXVlID0gKCgxMi4wIC0gaGlnaF9vbWVnYSAvIEt2KSAqIEt0IC8ga1IpOworICAgIGRvdWJsZSBsb3dfdG9ycXVlID0gKCgxMi4wIC0gbG93X29tZWdhIC8gS3YpICogS3QgLyBrUik7CisgICAgZG91YmxlIGhpZ2hfcG93ZXIgPSBoaWdoX3RvcnF1ZSAqIGhpZ2hfb21lZ2E7CisgICAgZG91YmxlIGxvd19wb3dlciA9IGxvd190b3JxdWUgKiBsb3dfb21lZ2E7CisKKyAgICAvLyBUT0RPKGFzY2h1aCk6IERvIHRoaXMgcmlnaHQhCisgICAgaWYgKChjdXJyZW50ID09IEhJR0ggfHwgaGlnaF9wb3dlciA+IGxvd19wb3dlciArIDE2MCkgJiYKKyAgICAgICAgOjpzdGQ6OmFicyh2ZWxvY2l0eSkgPiAwLjE0KSB7CisgICAgICByZXR1cm4gSElHSDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIExPVzsKKyAgICB9CisgIH0KKworICB2b2lkIFNldEdvYWwoZG91YmxlIHdoZWVsLCBkb3VibGUgdGhyb3R0bGUsIGJvb2wgcXVpY2t0dXJuLCBib29sIGhpZ2hnZWFyKSB7CisgICAgY29uc3QgZG91YmxlIGtXaGVlbE5vbkxpbmVhcml0eSA9IDAuMzsKKyAgICAvLyBBcHBseSBhIHNpbiBmdW5jdGlvbiB0aGF0J3Mgc2NhbGVkIHRvIG1ha2UgaXQgZmVlbCBiZXR0ZXIuCisgICAgY29uc3QgZG91YmxlIGFuZ3VsYXJfcmFuZ2UgPSBNX1BJXzIgKiBrV2hlZWxOb25MaW5lYXJpdHk7CisKKyAgICB3aGVlbF8gPSBzaW4oYW5ndWxhcl9yYW5nZSAqIHdoZWVsKSAvIHNpbihhbmd1bGFyX3JhbmdlKTsKKyAgICB3aGVlbF8gPSBzaW4oYW5ndWxhcl9yYW5nZSAqIHdoZWVsXykgLyBzaW4oYW5ndWxhcl9yYW5nZSk7CisgICAgcXVpY2t0dXJuXyA9IHF1aWNrdHVybjsKKworICAgIHN0YXRpYyBjb25zdCBkb3VibGUga1Rocm90dGxlRGVhZGJhbmQgPSAwLjA1OworICAgIGlmICg6OnN0ZDo6YWJzKHRocm90dGxlKSA8IGtUaHJvdHRsZURlYWRiYW5kKSB7CisgICAgICB0aHJvdHRsZV8gPSAwOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdHRsZV8gPSBjb3B5c2lnbigoOjpzdGQ6OmFicyh0aHJvdHRsZSkgLSBrVGhyb3R0bGVEZWFkYmFuZCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEuMCAtIGtUaHJvdHRsZURlYWRiYW5kKSwgdGhyb3R0bGUpOworICAgIH0KKworICAgIC8vIFRPRE8oYXVzdGluKTogRml4IHRoZSB1cHNoaWZ0IGxvZ2ljIHRvIGluY2x1ZGUgc3RhdGVzLgorICAgIEdlYXIgcmVxdWVzdGVkX2dlYXI7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBjb25zdCBhdXRvICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworICAgICAgY29uc3QgZG91YmxlIGN1cnJlbnRfbGVmdF92ZWxvY2l0eSA9CisgICAgICAgICAgKHBvc2l0aW9uXy5sZWZ0X2VuY29kZXIgLSBsYXN0X3Bvc2l0aW9uXy5sZWZ0X2VuY29kZXIpIC8KKyAgICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXzsKKyAgICAgIGNvbnN0IGRvdWJsZSBjdXJyZW50X3JpZ2h0X3ZlbG9jaXR5ID0KKyAgICAgICAgICAocG9zaXRpb25fLnJpZ2h0X2VuY29kZXIgLSBsYXN0X3Bvc2l0aW9uXy5yaWdodF9lbmNvZGVyKSAvCisgICAgICAgICAgcG9zaXRpb25fdGltZV9kZWx0YV87CisKKyAgICAgIEdlYXIgbGVmdF9yZXF1ZXN0ZWQgPQorICAgICAgICAgIENvbXB1dGVHZWFyKHZhbHVlcy5sZWZ0X2RyaXZlLCBjdXJyZW50X2xlZnRfdmVsb2NpdHksIGxlZnRfZ2Vhcl8pOworICAgICAgR2VhciByaWdodF9yZXF1ZXN0ZWQgPQorICAgICAgICAgIENvbXB1dGVHZWFyKHZhbHVlcy5yaWdodF9kcml2ZSwgY3VycmVudF9yaWdodF92ZWxvY2l0eSwgcmlnaHRfZ2Vhcl8pOworICAgICAgcmVxdWVzdGVkX2dlYXIgPQorICAgICAgICAgIChsZWZ0X3JlcXVlc3RlZCA9PSBISUdIIHx8IHJpZ2h0X3JlcXVlc3RlZCA9PSBISUdIKSA/IEhJR0ggOiBMT1c7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcXVlc3RlZF9nZWFyID0gaGlnaGdlYXIgPyBISUdIIDogTE9XOworICAgIH0KKworICAgIGNvbnN0IEdlYXIgc2hpZnRfdXAgPQorICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmNsdXRjaF90cmFuc21pc3Npb24gPyBISUdIIDogU0hJRlRJTkdfVVA7CisgICAgY29uc3QgR2VhciBzaGlmdF9kb3duID0KKyAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbHV0Y2hfdHJhbnNtaXNzaW9uID8gTE9XIDogU0hJRlRJTkdfRE9XTjsKKworICAgIGlmIChsZWZ0X2dlYXJfICE9IHJlcXVlc3RlZF9nZWFyKSB7CisgICAgICBpZiAoSXNJbkdlYXIobGVmdF9nZWFyXykpIHsKKyAgICAgICAgaWYgKHJlcXVlc3RlZF9nZWFyID09IEhJR0gpIHsKKyAgICAgICAgICBsZWZ0X2dlYXJfID0gc2hpZnRfdXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbGVmdF9nZWFyXyA9IHNoaWZ0X2Rvd247CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRfZ2VhciA9PSBISUdIICYmIGxlZnRfZ2Vhcl8gPT0gU0hJRlRJTkdfRE9XTikgeworICAgICAgICAgIGxlZnRfZ2Vhcl8gPSBTSElGVElOR19VUDsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRfZ2VhciA9PSBMT1cgJiYgbGVmdF9nZWFyXyA9PSBTSElGVElOR19VUCkgeworICAgICAgICAgIGxlZnRfZ2Vhcl8gPSBTSElGVElOR19ET1dOOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChyaWdodF9nZWFyXyAhPSByZXF1ZXN0ZWRfZ2VhcikgeworICAgICAgaWYgKElzSW5HZWFyKHJpZ2h0X2dlYXJfKSkgeworICAgICAgICBpZiAocmVxdWVzdGVkX2dlYXIgPT0gSElHSCkgeworICAgICAgICAgIHJpZ2h0X2dlYXJfID0gc2hpZnRfdXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmlnaHRfZ2Vhcl8gPSBzaGlmdF9kb3duOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocmVxdWVzdGVkX2dlYXIgPT0gSElHSCAmJiByaWdodF9nZWFyXyA9PSBTSElGVElOR19ET1dOKSB7CisgICAgICAgICAgcmlnaHRfZ2Vhcl8gPSBTSElGVElOR19VUDsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRfZ2VhciA9PSBMT1cgJiYgcmlnaHRfZ2Vhcl8gPT0gU0hJRlRJTkdfVVApIHsKKyAgICAgICAgICByaWdodF9nZWFyXyA9IFNISUZUSU5HX0RPV047CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBTZXRQb3NpdGlvbihjb25zdCBEcml2ZXRyYWluUXVldWU6OlBvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGNvbnN0IGF1dG8gJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisgICAgaWYgKHBvc2l0aW9uID09IE5VTEwpIHsKKyAgICAgICsrc3RhbGVfY291bnRfOworICAgIH0gZWxzZSB7CisgICAgICBsYXN0X3Bvc2l0aW9uXyA9IHBvc2l0aW9uXzsKKyAgICAgIHBvc2l0aW9uXyA9ICpwb3NpdGlvbjsKKyAgICAgIHBvc2l0aW9uX3RpbWVfZGVsdGFfID0gKHN0YWxlX2NvdW50XyArIDEpICogMC4wMTsKKyAgICAgIHN0YWxlX2NvdW50XyA9IDA7CisgICAgfQorCisjaWYgSEFWRV9TSElGVEVSUworICAgIGlmIChwb3NpdGlvbikgeworICAgICAgR2VhckxvZ2dpbmcgZ2Vhcl9sb2dnaW5nOworICAgICAgLy8gU3dpdGNoIHRvIHRoZSBjb3JyZWN0IGNvbnRyb2xsZXIuCisgICAgICBjb25zdCBkb3VibGUgbGVmdF9taWRkbGVfc2hpZnRlcl9wb3NpdGlvbiA9CisgICAgICAgICAgKHZhbHVlcy5sZWZ0X2RyaXZlLmNsZWFyX2hpZ2ggKyB2YWx1ZXMubGVmdF9kcml2ZS5jbGVhcl9sb3cpIC8gMi4wOworICAgICAgY29uc3QgZG91YmxlIHJpZ2h0X21pZGRsZV9zaGlmdGVyX3Bvc2l0aW9uID0KKyAgICAgICAgICAodmFsdWVzLnJpZ2h0X2RyaXZlLmNsZWFyX2hpZ2ggKyB2YWx1ZXMucmlnaHRfZHJpdmUuY2xlYXJfbG93KSAvIDIuMDsKKworICAgICAgaWYgKHBvc2l0aW9uLT5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24gPCBsZWZ0X21pZGRsZV9zaGlmdGVyX3Bvc2l0aW9uIHx8CisgICAgICAgICAgbGVmdF9nZWFyXyA9PSBMT1cpIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uLT5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uIDwgcmlnaHRfbWlkZGxlX3NoaWZ0ZXJfcG9zaXRpb24gfHwKKyAgICAgICAgICAgIHJpZ2h0X2dlYXJfID09IExPVykgeworICAgICAgICAgIGdlYXJfbG9nZ2luZy5sZWZ0X2xvb3BfaGlnaCA9IGZhbHNlOworICAgICAgICAgIGdlYXJfbG9nZ2luZy5yaWdodF9sb29wX2hpZ2ggPSBmYWxzZTsKKyAgICAgICAgICBsb29wXy0+c2V0X2NvbnRyb2xsZXJfaW5kZXgoZ2Vhcl9sb2dnaW5nLmNvbnRyb2xsZXJfaW5kZXggPSAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZWFyX2xvZ2dpbmcubGVmdF9sb29wX2hpZ2ggPSBmYWxzZTsKKyAgICAgICAgICBnZWFyX2xvZ2dpbmcucmlnaHRfbG9vcF9oaWdoID0gdHJ1ZTsKKyAgICAgICAgICBsb29wXy0+c2V0X2NvbnRyb2xsZXJfaW5kZXgoZ2Vhcl9sb2dnaW5nLmNvbnRyb2xsZXJfaW5kZXggPSAxKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uLT5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uIDwgcmlnaHRfbWlkZGxlX3NoaWZ0ZXJfcG9zaXRpb24gfHwKKyAgICAgICAgICAgIHJpZ2h0X2dlYXJfID09IExPVykgeworICAgICAgICAgIGdlYXJfbG9nZ2luZy5sZWZ0X2xvb3BfaGlnaCA9IHRydWU7CisgICAgICAgICAgZ2Vhcl9sb2dnaW5nLnJpZ2h0X2xvb3BfaGlnaCA9IGZhbHNlOworICAgICAgICAgIGxvb3BfLT5zZXRfY29udHJvbGxlcl9pbmRleChnZWFyX2xvZ2dpbmcuY29udHJvbGxlcl9pbmRleCA9IDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlYXJfbG9nZ2luZy5sZWZ0X2xvb3BfaGlnaCA9IHRydWU7CisgICAgICAgICAgZ2Vhcl9sb2dnaW5nLnJpZ2h0X2xvb3BfaGlnaCA9IHRydWU7CisgICAgICAgICAgbG9vcF8tPnNldF9jb250cm9sbGVyX2luZGV4KGdlYXJfbG9nZ2luZy5jb250cm9sbGVyX2luZGV4ID0gMyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gVE9ETyhhdXN0aW4pOiBDb25zdGFudHMuCisgICAgICBpZiAocG9zaXRpb24tPmxlZnRfc2hpZnRlcl9wb3NpdGlvbiA+IHZhbHVlcy5sZWZ0X2RyaXZlLmNsZWFyX2hpZ2ggJiYgbGVmdF9nZWFyXyA9PSBTSElGVElOR19VUCkgeworICAgICAgICBsZWZ0X2dlYXJfID0gSElHSDsKKyAgICAgIH0KKyAgICAgIGlmIChwb3NpdGlvbi0+bGVmdF9zaGlmdGVyX3Bvc2l0aW9uIDwgdmFsdWVzLmxlZnRfZHJpdmUuY2xlYXJfbG93ICYmIGxlZnRfZ2Vhcl8gPT0gU0hJRlRJTkdfRE9XTikgeworICAgICAgICBsZWZ0X2dlYXJfID0gTE9XOworICAgICAgfQorICAgICAgaWYgKHBvc2l0aW9uLT5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID4gdmFsdWVzLnJpZ2h0X2RyaXZlLmNsZWFyX2hpZ2ggJiYgcmlnaHRfZ2Vhcl8gPT0gU0hJRlRJTkdfVVApIHsKKyAgICAgICAgcmlnaHRfZ2Vhcl8gPSBISUdIOworICAgICAgfQorICAgICAgaWYgKHBvc2l0aW9uLT5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uIDwgdmFsdWVzLnJpZ2h0X2RyaXZlLmNsZWFyX2xvdyAmJiByaWdodF9nZWFyXyA9PSBTSElGVElOR19ET1dOKSB7CisgICAgICAgIHJpZ2h0X2dlYXJfID0gTE9XOworICAgICAgfQorCisgICAgICBnZWFyX2xvZ2dpbmcubGVmdF9zdGF0ZSA9IGxlZnRfZ2Vhcl87CisgICAgICBnZWFyX2xvZ2dpbmcucmlnaHRfc3RhdGUgPSByaWdodF9nZWFyXzsKKyAgICAgIExPR19TVFJVQ1QoREVCVUcsICJzdGF0ZSIsIGdlYXJfbG9nZ2luZyk7CisgICAgfQorI2Vsc2UKKyAgICAodm9pZCkgdmFsdWVzOworI2VuZGlmCisgIH0KKworICBkb3VibGUgRmlsdGVyVmVsb2NpdHkoZG91YmxlIHRocm90dGxlKSB7CisgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEZGID0KKyAgICAgICAgbG9vcF8tPkIoKS5pbnZlcnNlKCkgKgorICAgICAgICAoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+OjpJZGVudGl0eSgpIC0gbG9vcF8tPkEoKSk7CisKKyAgICBjb25zdGV4cHIgaW50IGtIaWdoR2VhckNvbnRyb2xsZXIgPSAzOworICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBGRl9oaWdoID0KKyAgICAgICAgbG9vcF8tPmNvbnRyb2xsZXIoa0hpZ2hHZWFyQ29udHJvbGxlcikucGxhbnQuQigpLmludmVyc2UoKSAqCisgICAgICAgIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj46OklkZW50aXR5KCkgLQorICAgICAgICAgbG9vcF8tPmNvbnRyb2xsZXIoa0hpZ2hHZWFyQ29udHJvbGxlcikucGxhbnQuQSgpKTsKKworICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEZGX3N1bSA9IEZGLmNvbHdpc2UoKS5zdW0oKTsKKyAgICBpbnQgbWluX0ZGX3N1bV9pbmRleDsKKyAgICBjb25zdCBkb3VibGUgbWluX0ZGX3N1bSA9IEZGX3N1bS5taW5Db2VmZigmbWluX0ZGX3N1bV9pbmRleCk7CisgICAgY29uc3QgZG91YmxlIG1pbl9LX3N1bSA9IGxvb3BfLT5LKCkuY29sKG1pbl9GRl9zdW1faW5kZXgpLnN1bSgpOworICAgIGNvbnN0IGRvdWJsZSBoaWdoX21pbl9GRl9zdW0gPSBGRl9oaWdoLmNvbCgwKS5zdW0oKTsKKworICAgIGNvbnN0IGRvdWJsZSBhZGp1c3RlZF9mZl92b2x0YWdlID0gOjphb3M6OkNsaXAoCisgICAgICAgIHRocm90dGxlICogMTIuMCAqIG1pbl9GRl9zdW0gLyBoaWdoX21pbl9GRl9zdW0sIC0xMi4wLCAxMi4wKTsKKyAgICByZXR1cm4gKGFkanVzdGVkX2ZmX3ZvbHRhZ2UgKworICAgICAgICAgICAgdHRydXN0XyAqIG1pbl9LX3N1bSAqIChsb29wXy0+WF9oYXQoMCwgMCkgKyBsb29wXy0+WF9oYXQoMSwgMCkpIC8KKyAgICAgICAgICAgICAgICAyLjApIC8KKyAgICAgICAgICAgKHR0cnVzdF8gKiBtaW5fS19zdW0gKyBtaW5fRkZfc3VtKTsKKyAgfQorCisgIGRvdWJsZSBNYXhWZWxvY2l0eSgpIHsKKyAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRkYgPQorICAgICAgICBsb29wXy0+QigpLmludmVyc2UoKSAqCisgICAgICAgIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj46OklkZW50aXR5KCkgLSBsb29wXy0+QSgpKTsKKworICAgIGNvbnN0ZXhwciBpbnQga0hpZ2hHZWFyQ29udHJvbGxlciA9IDM7CisgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEZGX2hpZ2ggPQorICAgICAgICBsb29wXy0+Y29udHJvbGxlcihrSGlnaEdlYXJDb250cm9sbGVyKS5wbGFudC5CKCkuaW52ZXJzZSgpICoKKyAgICAgICAgKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPjo6SWRlbnRpdHkoKSAtCisgICAgICAgICBsb29wXy0+Y29udHJvbGxlcihrSGlnaEdlYXJDb250cm9sbGVyKS5wbGFudC5BKCkpOworCisgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gRkZfc3VtID0gRkYuY29sd2lzZSgpLnN1bSgpOworICAgIGludCBtaW5fRkZfc3VtX2luZGV4OworICAgIGNvbnN0IGRvdWJsZSBtaW5fRkZfc3VtID0gRkZfc3VtLm1pbkNvZWZmKCZtaW5fRkZfc3VtX2luZGV4KTsKKyAgICAvL2NvbnN0IGRvdWJsZSBtaW5fS19zdW0gPSBsb29wXy0+SygpLmNvbChtaW5fRkZfc3VtX2luZGV4KS5zdW0oKTsKKyAgICBjb25zdCBkb3VibGUgaGlnaF9taW5fRkZfc3VtID0gRkZfaGlnaC5jb2woMCkuc3VtKCk7CisKKyAgICBjb25zdCBkb3VibGUgYWRqdXN0ZWRfZmZfdm9sdGFnZSA9IDo6YW9zOjpDbGlwKAorICAgICAgICAxMi4wICogbWluX0ZGX3N1bSAvIGhpZ2hfbWluX0ZGX3N1bSwgLTEyLjAsIDEyLjApOworICAgIHJldHVybiBhZGp1c3RlZF9mZl92b2x0YWdlIC8gbWluX0ZGX3N1bTsKKyAgfQorCisgIHZvaWQgVXBkYXRlKCkgeworICAgIGNvbnN0IGF1dG8gJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisgICAgLy8gVE9ETyhhdXN0aW4pOiBPYnNlcnZlciBmb3IgdGhlIGN1cnJlbnQgdmVsb2NpdHkgaW5zdGVhZCBvZiBkaWZmZXJlbmNlCisgICAgLy8gY2FsY3VsYXRpb25zLgorICAgICsrY291bnRlcl87CisjaWYgSEFWRV9TSElGVEVSUworICAgIGNvbnN0IGRvdWJsZSBjdXJyZW50X2xlZnRfdmVsb2NpdHkgPQorICAgICAgICAocG9zaXRpb25fLmxlZnRfZW5jb2RlciAtIGxhc3RfcG9zaXRpb25fLmxlZnRfZW5jb2RlcikgLworICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXzsKKyAgICBjb25zdCBkb3VibGUgY3VycmVudF9yaWdodF92ZWxvY2l0eSA9CisgICAgICAgIChwb3NpdGlvbl8ucmlnaHRfZW5jb2RlciAtIGxhc3RfcG9zaXRpb25fLnJpZ2h0X2VuY29kZXIpIC8KKyAgICAgICAgcG9zaXRpb25fdGltZV9kZWx0YV87CisgICAgY29uc3QgZG91YmxlIGxlZnRfbW90b3Jfc3BlZWQgPQorICAgICAgICBNb3RvclNwZWVkKHZhbHVlcy5sZWZ0X2RyaXZlLCBwb3NpdGlvbl8ubGVmdF9zaGlmdGVyX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbGVmdF92ZWxvY2l0eSk7CisgICAgY29uc3QgZG91YmxlIHJpZ2h0X21vdG9yX3NwZWVkID0KKyAgICAgICAgTW90b3JTcGVlZCh2YWx1ZXMucmlnaHRfZHJpdmUsIHBvc2l0aW9uXy5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcmlnaHRfdmVsb2NpdHkpOworCisgICAgeworICAgICAgQ0lNTG9nZ2luZyBsb2dnaW5nOworCisgICAgICAvLyBSZXNldCB0aGUgQ0lNIG1vZGVsIHRvIHRoZSBjdXJyZW50IGNvbmRpdGlvbnMgdG8gYmUgcmVhZHkgZm9yIHdoZW4gd2UKKyAgICAgIC8vIHNoaWZ0LgorICAgICAgaWYgKElzSW5HZWFyKGxlZnRfZ2Vhcl8pKSB7CisgICAgICAgIGxvZ2dpbmcubGVmdF9pbl9nZWFyID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvZ2dpbmcubGVmdF9pbl9nZWFyID0gZmFsc2U7CisgICAgICB9CisgICAgICBsb2dnaW5nLmxlZnRfbW90b3Jfc3BlZWQgPSBsZWZ0X21vdG9yX3NwZWVkOworICAgICAgbG9nZ2luZy5sZWZ0X3ZlbG9jaXR5ID0gY3VycmVudF9sZWZ0X3ZlbG9jaXR5OworICAgICAgaWYgKElzSW5HZWFyKHJpZ2h0X2dlYXJfKSkgeworICAgICAgICBsb2dnaW5nLnJpZ2h0X2luX2dlYXIgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nZ2luZy5yaWdodF9pbl9nZWFyID0gZmFsc2U7CisgICAgICB9CisgICAgICBsb2dnaW5nLnJpZ2h0X21vdG9yX3NwZWVkID0gcmlnaHRfbW90b3Jfc3BlZWQ7CisgICAgICBsb2dnaW5nLnJpZ2h0X3ZlbG9jaXR5ID0gY3VycmVudF9yaWdodF92ZWxvY2l0eTsKKworICAgICAgTE9HX1NUUlVDVChERUJVRywgImN1cnJlbnRseSIsIGxvZ2dpbmcpOworICAgIH0KKyNlbHNlCisgICAgKHZvaWQpIHZhbHVlczsKKyNlbmRpZgorCisjaWYgSEFWRV9TSElGVEVSUworICAgIGlmIChJc0luR2VhcihsZWZ0X2dlYXJfKSAmJiBJc0luR2VhcihyaWdodF9nZWFyXykpIHsKKyNlbHNlCisgICAgeworI2VuZGlmCisgICAgICAvLyBGRiAqIFggPSBVIChzdGVhZHkgc3RhdGUpCisgICAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRkYgPQorICAgICAgICAgIGxvb3BfLT5CKCkuaW52ZXJzZSgpICoKKyAgICAgICAgICAoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+OjpJZGVudGl0eSgpIC0gbG9vcF8tPkEoKSk7CisKKyAgICAgIC8vIEludmVydCB0aGUgcGxhbnQgdG8gZmlndXJlIG91dCBob3cgdGhlIHZlbG9jaXR5IGZpbHRlciB3b3VsZCBoYXZlIHRvCisgICAgICAvLyB3b3JrCisgICAgICAvLyBvdXQgaW4gb3JkZXIgdG8gZmlsdGVyIG91dCB0aGUgZm9yd2FyZHMgbmVnYXRpdmUgaW5lcnRpYS4KKyAgICAgIC8vIFRoaXMgbWF0aCBhc3N1bWVzIHRoYXQgdGhlIGxlZnQgYW5kIHJpZ2h0IHBvd2VyIGFuZCB2ZWxvY2l0eSBhcmUKKyAgICAgIC8vIGVxdWFscywKKyAgICAgIC8vIGFuZCB0aGF0IHRoZSBwbGFudCBpcyB0aGUgc2FtZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQuCisgICAgICBjb25zdCBkb3VibGUgZnZlbCA9IEZpbHRlclZlbG9jaXR5KHRocm90dGxlXyk7CisKKyAgICAgIGNvbnN0IGRvdWJsZSBzaWduX3N2ZWwgPSB3aGVlbF8gKiAoKGZ2ZWwgPiAwLjApID8gMS4wIDogLTEuMCk7CisgICAgICBkb3VibGUgc3RlZXJpbmdfdmVsb2NpdHk7CisgICAgICBpZiAocXVpY2t0dXJuXykgeworICAgICAgICBzdGVlcmluZ192ZWxvY2l0eSA9IHdoZWVsXyAqIE1heFZlbG9jaXR5KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGVlcmluZ192ZWxvY2l0eSA9IDo6c3RkOjphYnMoZnZlbCkgKiB3aGVlbF87CisgICAgICB9CisgICAgICBjb25zdCBkb3VibGUgbGVmdF92ZWxvY2l0eSA9IGZ2ZWwgLSBzdGVlcmluZ192ZWxvY2l0eTsKKyAgICAgIGNvbnN0IGRvdWJsZSByaWdodF92ZWxvY2l0eSA9IGZ2ZWwgKyBzdGVlcmluZ192ZWxvY2l0eTsKKworICAgICAgLy8gSW50ZWdyYXRlIHZlbG9jaXR5IHRvIGdldCB0aGUgcG9zaXRpb24uCisgICAgICAvLyBUaGlzIHBvc2l0aW9uIGlzIHVzZWQgdG8gZ2V0IGludGVncmFsIGNvbnRyb2wuCisgICAgICBsb29wXy0+bXV0YWJsZV9SKCkgPDwgbGVmdF92ZWxvY2l0eSwgcmlnaHRfdmVsb2NpdHk7CisKKyAgICAgIGlmICghcXVpY2t0dXJuXykgeworICAgICAgICAvLyBLICogUiA9IHcKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IGVxdWFsaXR5X2s7CisgICAgICAgIGVxdWFsaXR5X2sgPDwgMSArIHNpZ25fc3ZlbCwgLSgxIC0gc2lnbl9zdmVsKTsKKyAgICAgICAgY29uc3QgZG91YmxlIGVxdWFsaXR5X3cgPSAwLjA7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgY29uc3RyYWludCBvbiBSIGJ5IG1hbmlwdWxhdGluZyB0aGUgY29uc3RyYWludCBvbiBVCisgICAgICAgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IFJfcG9seSA9IDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+KAorICAgICAgICAgICAgVV9Qb2x5Xy5IKCkgKiAobG9vcF8tPksoKSArIEZGKSwKKyAgICAgICAgICAgIFVfUG9seV8uaygpICsgVV9Qb2x5Xy5IKCkgKiBsb29wXy0+SygpICogbG9vcF8tPlhfaGF0KCkpOworCisgICAgICAgIC8vIExpbWl0IFIgYmFjayBpbnNpZGUgdGhlIGJveC4KKyAgICAgICAgbG9vcF8tPm11dGFibGVfUigpID0KKyAgICAgICAgICAgIENvZXJjZUdvYWwoUl9wb2x5LCBlcXVhbGl0eV9rLCBlcXVhbGl0eV93LCBsb29wXy0+UigpKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IEZGX3ZvbHRzID0gRkYgKiBsb29wXy0+UigpOworICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfaWRlYWwgPQorICAgICAgICAgIGxvb3BfLT5LKCkgKiAobG9vcF8tPlIoKSAtIGxvb3BfLT5YX2hhdCgpKSArIEZGX3ZvbHRzOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBsb29wXy0+bXV0YWJsZV9VKClbaV0gPSA6OmFvczo6Q2xpcChVX2lkZWFsW2ldLCAtMTIsIDEyKTsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETyhhdXN0aW4pOiBNb2RlbCB0aGlzIGJldHRlci4KKyAgICAgIC8vIFRPRE8oYXVzdGluKTogRmVlZCBiYWNrPworICAgICAgbG9vcF8tPm11dGFibGVfWF9oYXQoKSA9CisgICAgICAgICAgbG9vcF8tPkEoKSAqIGxvb3BfLT5YX2hhdCgpICsgbG9vcF8tPkIoKSAqIGxvb3BfLT5VKCk7CisjaWYgSEFWRV9TSElGVEVSUworICAgIH0gZWxzZSB7CisgICAgICAvLyBBbnkgbW90b3IgaXMgbm90IGluIGdlYXIuICBTcGVlZCBtYXRjaC4KKyAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFJfbGVmdDsKKyAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFJfcmlnaHQ7CisgICAgICBSX2xlZnQoMCwgMCkgPSBsZWZ0X21vdG9yX3NwZWVkOworICAgICAgUl9yaWdodCgwLCAwKSA9IHJpZ2h0X21vdG9yX3NwZWVkOworCisgICAgICBjb25zdCBkb3VibGUgd2lnZ2xlID0KKyAgICAgICAgICAoc3RhdGljX2Nhc3Q8ZG91YmxlPigoY291bnRlcl8gJSAyMCkgLyAxMCkgLSAwLjUpICogNS4wOworCisgICAgICBsb29wXy0+bXV0YWJsZV9VKDAsIDApID0gOjphb3M6OkNsaXAoCisgICAgICAgICAgKFJfbGVmdCAvIEt2KSgwLCAwKSArIChJc0luR2VhcihsZWZ0X2dlYXJfKSA/IDAgOiB3aWdnbGUpLAorICAgICAgICAgIC0xMi4wLCAxMi4wKTsKKyAgICAgIGxvb3BfLT5tdXRhYmxlX1UoMSwgMCkgPSA6OmFvczo6Q2xpcCgKKyAgICAgICAgICAoUl9yaWdodCAvIEt2KSgwLCAwKSArIChJc0luR2VhcihyaWdodF9nZWFyXykgPyAwIDogd2lnZ2xlKSwKKyAgICAgICAgICAtMTIuMCwgMTIuMCk7CisgICAgICBsb29wXy0+bXV0YWJsZV9VKCkgKj0gMTIuMCAvIDo6YW9zOjpyb2JvdF9zdGF0ZS0+dm9sdGFnZV9iYXR0ZXJ5OworI2VuZGlmCisgICAgfQorICB9CisKKyAgdm9pZCBTZW5kTW90b3JzKERyaXZldHJhaW5RdWV1ZTo6T3V0cHV0ICpvdXRwdXQpIHsKKyAgICBpZiAob3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgIG91dHB1dC0+bGVmdF92b2x0YWdlID0gbG9vcF8tPlUoMCwgMCk7CisgICAgICBvdXRwdXQtPnJpZ2h0X3ZvbHRhZ2UgPSBsb29wXy0+VSgxLCAwKTsKKyAgICAgIG91dHB1dC0+bGVmdF9oaWdoID0gbGVmdF9nZWFyXyA9PSBISUdIIHx8IGxlZnRfZ2Vhcl8gPT0gU0hJRlRJTkdfVVA7CisgICAgICBvdXRwdXQtPnJpZ2h0X2hpZ2ggPSByaWdodF9nZWFyXyA9PSBISUdIIHx8IHJpZ2h0X2dlYXJfID09IFNISUZUSU5HX1VQOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gVV9Qb2x5XzsKKworICA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrTG9vcDwyLCAyLCAyPj4gbG9vcF87CisKKyAgY29uc3QgZG91YmxlIHR0cnVzdF87CisgIGRvdWJsZSB3aGVlbF87CisgIGRvdWJsZSB0aHJvdHRsZV87CisgIGJvb2wgcXVpY2t0dXJuXzsKKyAgaW50IHN0YWxlX2NvdW50XzsKKyAgZG91YmxlIHBvc2l0aW9uX3RpbWVfZGVsdGFfOworICBHZWFyIGxlZnRfZ2Vhcl87CisgIEdlYXIgcmlnaHRfZ2Vhcl87CisgIERyaXZldHJhaW5RdWV1ZTo6UG9zaXRpb24gbGFzdF9wb3NpdGlvbl87CisgIERyaXZldHJhaW5RdWV1ZTo6UG9zaXRpb24gcG9zaXRpb25fOworICBpbnQgY291bnRlcl87Cit9OworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6a1N0YWxsVG9ycXVlOworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6a1N0YWxsQ3VycmVudDsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46OmtGcmVlU3BlZWQ7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjprRnJlZUN1cnJlbnQ7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjpKOworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6bTsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46OnJiOworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6a1doZWVsUmFkaXVzOworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6a1I7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjpLdjsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46Okt0OworCisKK3ZvaWQgRHJpdmV0cmFpbkxvb3A6OlJ1bkl0ZXJhdGlvbihjb25zdCBEcml2ZXRyYWluUXVldWU6OkdvYWwgKmdvYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJpdmV0cmFpblF1ZXVlOjpQb3NpdGlvbiAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmV0cmFpblF1ZXVlOjpPdXRwdXQgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXRyYWluUXVldWU6OlN0YXR1cyAqIHN0YXR1cykgeworICAvLyBUT0RPKGFzY2h1aCk6IFRoZXNlIHNob3VsZCBiZSBtZW1iZXJzIG9mIHRoZSBjbGFzcy4KKyAgc3RhdGljIERyaXZldHJhaW5Nb3RvcnNTUyBkdF9jbG9zZWRsb29wOworICBzdGF0aWMgUG9seURyaXZldHJhaW4gZHRfb3Blbmxvb3A7CisKKyAgYm9vbCBiYWRfcG9zID0gZmFsc2U7CisgIGlmIChwb3NpdGlvbiA9PSBudWxscHRyKSB7CisgICAgTE9HX0lOVEVSVkFMKG5vX3Bvc2l0aW9uXyk7CisgICAgYmFkX3BvcyA9IHRydWU7CisgIH0KKyAgbm9fcG9zaXRpb25fLlByaW50KCk7CisKKyAgYm9vbCBjb250cm9sX2xvb3BfZHJpdmluZyA9IGZhbHNlOworICBpZiAoZ29hbCkgeworICAgIGRvdWJsZSB3aGVlbCA9IGdvYWwtPnN0ZWVyaW5nOworICAgIGRvdWJsZSB0aHJvdHRsZSA9IGdvYWwtPnRocm90dGxlOworICAgIGJvb2wgcXVpY2t0dXJuID0gZ29hbC0+cXVpY2t0dXJuOworI2lmIEhBVkVfU0hJRlRFUlMKKyAgICBib29sIGhpZ2hnZWFyID0gZ29hbC0+aGlnaGdlYXI7CisjZW5kaWYKKworICAgIGNvbnRyb2xfbG9vcF9kcml2aW5nID0gZ29hbC0+Y29udHJvbF9sb29wX2RyaXZpbmc7CisgICAgZG91YmxlIGxlZnRfZ29hbCA9IGdvYWwtPmxlZnRfZ29hbDsKKyAgICBkb3VibGUgcmlnaHRfZ29hbCA9IGdvYWwtPnJpZ2h0X2dvYWw7CisKKyAgICBkdF9jbG9zZWRsb29wLlNldEdvYWwobGVmdF9nb2FsLCBnb2FsLT5sZWZ0X3ZlbG9jaXR5X2dvYWwsIHJpZ2h0X2dvYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYWwtPnJpZ2h0X3ZlbG9jaXR5X2dvYWwpOworI2lmIEhBVkVfU0hJRlRFUlMKKyAgICBkdF9vcGVubG9vcC5TZXRHb2FsKHdoZWVsLCB0aHJvdHRsZSwgcXVpY2t0dXJuLCBoaWdoZ2Vhcik7CisjZWxzZQorICAgIGR0X29wZW5sb29wLlNldEdvYWwod2hlZWwsIHRocm90dGxlLCBxdWlja3R1cm4sIGZhbHNlKTsKKyNlbmRpZgorICB9CisKKyAgaWYgKCFiYWRfcG9zKSB7CisgICAgY29uc3QgZG91YmxlIGxlZnRfZW5jb2RlciA9IHBvc2l0aW9uLT5sZWZ0X2VuY29kZXI7CisgICAgY29uc3QgZG91YmxlIHJpZ2h0X2VuY29kZXIgPSBwb3NpdGlvbi0+cmlnaHRfZW5jb2RlcjsKKyAgICBpZiAoZ3lyb19yZWFkaW5nLkZldGNoTGF0ZXN0KCkpIHsKKyAgICAgIExPR19TVFJVQ1QoREVCVUcsICJ1c2luZyIsICpneXJvX3JlYWRpbmcuZ2V0KCkpOworICAgICAgZHRfY2xvc2VkbG9vcC5TZXRQb3NpdGlvbihsZWZ0X2VuY29kZXIsIHJpZ2h0X2VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd5cm9fcmVhZGluZy0+YW5nbGUpOworICAgIH0gZWxzZSB7CisgICAgICBkdF9jbG9zZWRsb29wLlNldFJhd1Bvc2l0aW9uKGxlZnRfZW5jb2RlciwgcmlnaHRfZW5jb2Rlcik7CisgICAgfQorICB9CisgIGR0X29wZW5sb29wLlNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgZHRfb3Blbmxvb3AuVXBkYXRlKCk7CisKKyAgaWYgKGNvbnRyb2xfbG9vcF9kcml2aW5nKSB7CisgICAgZHRfY2xvc2VkbG9vcC5VcGRhdGUob3V0cHV0ID09IE5VTEwsIHRydWUpOworICAgIGR0X2Nsb3NlZGxvb3AuU2VuZE1vdG9ycyhvdXRwdXQpOworICB9IGVsc2UgeworICAgIGR0X29wZW5sb29wLlNlbmRNb3RvcnMob3V0cHV0KTsKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICBkdF9jbG9zZWRsb29wLlNldEV4dGVybmFsTW90b3JzKG91dHB1dC0+bGVmdF92b2x0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnJpZ2h0X3ZvbHRhZ2UpOworICAgIH0KKyAgICBkdF9jbG9zZWRsb29wLlVwZGF0ZShvdXRwdXQgPT0gTlVMTCwgZmFsc2UpOworICB9CisKKyAgLy8gc2V0IHRoZSBvdXRwdXQgc3RhdHVzIG9mIHRoZSBjb250cm9sIGxvb3Agc3RhdGUKKyAgaWYgKHN0YXR1cykgeworICAgIGJvb2wgZG9uZSA9IGZhbHNlOworICAgIGlmIChnb2FsKSB7CisgICAgICBkb25lID0gKCg6OnN0ZDo6YWJzKGdvYWwtPmxlZnRfZ29hbCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR0X2Nsb3NlZGxvb3AuR2V0RXN0aW1hdGVkTGVmdEVuY29kZXIoKSkgPAorICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5kcml2ZXRyYWluX2RvbmVfZGlzdGFuY2UpICYmCisgICAgICAgICAgICAgICg6OnN0ZDo6YWJzKGdvYWwtPnJpZ2h0X2dvYWwgLQorICAgICAgICAgICAgICAgICAgICAgICAgICBkdF9jbG9zZWRsb29wLkdldEVzdGltYXRlZFJpZ2h0RW5jb2RlcigpKSA8CisgICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmRyaXZldHJhaW5fZG9uZV9kaXN0YW5jZSkpOworICAgIH0KKyAgICBzdGF0dXMtPmlzX2RvbmUgPSBkb25lOworICAgIHN0YXR1cy0+cm9ib3Rfc3BlZWQgPSBkdF9jbG9zZWRsb29wLkdldEVzdGltYXRlZFJvYm90U3BlZWQoKTsKKyAgICBzdGF0dXMtPmZpbHRlcmVkX2xlZnRfcG9zaXRpb24gPSBkdF9jbG9zZWRsb29wLkdldEVzdGltYXRlZExlZnRFbmNvZGVyKCk7CisgICAgc3RhdHVzLT5maWx0ZXJlZF9yaWdodF9wb3NpdGlvbiA9IGR0X2Nsb3NlZGxvb3AuR2V0RXN0aW1hdGVkUmlnaHRFbmNvZGVyKCk7CisKKyAgICBzdGF0dXMtPmZpbHRlcmVkX2xlZnRfdmVsb2NpdHkgPSBkdF9jbG9zZWRsb29wLmxvb3AoKS5YX2hhdCgxLCAwKTsKKyAgICBzdGF0dXMtPmZpbHRlcmVkX3JpZ2h0X3ZlbG9jaXR5ID0gZHRfY2xvc2VkbG9vcC5sb29wKCkuWF9oYXQoMywgMCk7CisgICAgc3RhdHVzLT5vdXRwdXRfd2FzX2NhcHBlZCA9IGR0X2Nsb3NlZGxvb3AuT3V0cHV0V2FzQ2FwcGVkKCk7CisgICAgc3RhdHVzLT51bmNhcHBlZF9sZWZ0X3ZvbHRhZ2UgPSBkdF9jbG9zZWRsb29wLmxvb3AoKS5VX3VuY2FwcGVkKDAsIDApOworICAgIHN0YXR1cy0+dW5jYXBwZWRfcmlnaHRfdm9sdGFnZSA9IGR0X2Nsb3NlZGxvb3AubG9vcCgpLlVfdW5jYXBwZWQoMSwgMCk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cCBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU0MzM3Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uZ3lwCkBAIC0wLDAgKzEsMTAzIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdyZXBsYXlfZHJpdmV0cmFpbicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdub19yc3luYyc6IDEsCisgICAgICB9LAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdyZXBsYXlfZHJpdmV0cmFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2RyaXZldHJhaW5fcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6cmVwbGF5X2NvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsnZHJpdmV0cmFpbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3F1ZXVlcycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3BfcXVldWVzJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3BvbHlkcml2ZXRyYWluX3BsYW50cycsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYycsCisgICAgICAgICdkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RyaXZldHJhaW5fbGliJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZHJpdmV0cmFpbi5jYycsCisgICAgICAgICdwb2x5ZHJpdmV0cmFpbl9jaW1fcGxhbnQuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS95MjAxNC95MjAxNC5neXA6Y29uc3RhbnRzJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnBvbHl0b3BlJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6Y29lcmNlX2dvYWwnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3F1ZXVlcy9xdWV1ZXMuZ3lwOmd5cm8nLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOmxvZ19pbnRlcnZhbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6bWF0cml4X2xvZ2dpbmcnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6cG9seXRvcGUnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpjb2VyY2VfZ29hbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgICAnZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RyaXZldHJhaW5fbGliX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2RyaXZldHJhaW5fbGliX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAnZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAgICdkcml2ZXRyYWluX2xpYicsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3BfdGVzdCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9xdWV1ZXMvcXVldWVzLmd5cDpneXJvJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZXMnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkcml2ZXRyYWluJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdkcml2ZXRyYWluX21haW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJ2RyaXZldHJhaW5fbGliJywKKyAgICAgICAgJ2RyaXZldHJhaW5fcXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uaCBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlNjM2MgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBZMjAxNF9DT05UUk9MX0xPT1BTX0RSSVZFVFJBSU5fSF8KKyNkZWZpbmUgWTIwMTRfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX0hfCisKKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKworI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL2xvZ19pbnRlcnZhbC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworY2xhc3MgRHJpdmV0cmFpbkxvb3AKKyAgICA6IHB1YmxpYyBhb3M6OmNvbnRyb2xzOjpDb250cm9sTG9vcDxjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU+IHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYSBjb250cm9sIGxvb3Agd2hpY2ggY2FuIHRha2UgYSBEcml2ZXRyYWluIG9yIGRlZmF1bHRzIHRvIHRoZQorICAvLyBkcml2ZXRyYWluIGF0IGZyYzk3MTo6Y29udHJvbF9sb29wczo6ZHJpdmV0cmFpbgorICBleHBsaWNpdCBEcml2ZXRyYWluTG9vcChjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWUgKm15X2RyaXZldHJhaW4gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUpCisgICAgICA6IGFvczo6Y29udHJvbHM6OkNvbnRyb2xMb29wPGNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZT4oCisgICAgICAgICAgICBteV9kcml2ZXRyYWluKSB7CisgICAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8MD46OkluaXQoKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyBFeGVjdXRlcyBvbmUgY3ljbGUgb2YgdGhlIGNvbnRyb2wgbG9vcC4KKyAgdmlydHVhbCB2b2lkIFJ1bkl0ZXJhdGlvbigKKyAgICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbCAqZ29hbCwKKyAgICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uLAorICAgICAgY29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpPdXRwdXQgKm91dHB1dCwKKyAgICAgIGNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6U3RhdHVzICpzdGF0dXMpOworCisgIHR5cGVkZWYgOjphb3M6OnV0aWw6OlNpbXBsZUxvZ0ludGVydmFsIFNpbXBsZUxvZ0ludGVydmFsOworICBTaW1wbGVMb2dJbnRlcnZhbCBub19wb3NpdGlvbl8gPSBTaW1wbGVMb2dJbnRlcnZhbCgKKyAgICAgIDo6YW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMoMC4yNSksIFdBUk5JTkcsICJubyBwb3NpdGlvbiIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBZMjAxNF9DT05UUk9MX0xPT1BTX0RSSVZFVFJBSU5fSF8KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MmVmZWMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2UgZnJjOTcxLmNvbnRyb2xfbG9vcHM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BzLnEiOworCitzdHJ1Y3QgR2VhckxvZ2dpbmcgeworICBpbnQ4X3QgY29udHJvbGxlcl9pbmRleDsKKyAgYm9vbCBsZWZ0X2xvb3BfaGlnaDsKKyAgYm9vbCByaWdodF9sb29wX2hpZ2g7CisgIGludDhfdCBsZWZ0X3N0YXRlOworICBpbnQ4X3QgcmlnaHRfc3RhdGU7Cit9OworCitzdHJ1Y3QgQ0lNTG9nZ2luZyB7CisgIGJvb2wgbGVmdF9pbl9nZWFyOworICBib29sIHJpZ2h0X2luX2dlYXI7CisgIGRvdWJsZSBsZWZ0X21vdG9yX3NwZWVkOworICBkb3VibGUgcmlnaHRfbW90b3Jfc3BlZWQ7CisgIGRvdWJsZSBsZWZ0X3ZlbG9jaXR5OworICBkb3VibGUgcmlnaHRfdmVsb2NpdHk7Cit9OworCitxdWV1ZV9ncm91cCBEcml2ZXRyYWluUXVldWUgeworICBpbXBsZW1lbnRzIGFvcy5jb250cm9sX2xvb3BzLkNvbnRyb2xMb29wOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgZG91YmxlIHN0ZWVyaW5nOworICAgIGRvdWJsZSB0aHJvdHRsZTsKKyAgICBib29sIGhpZ2hnZWFyOworICAgIGJvb2wgcXVpY2t0dXJuOworICAgIGJvb2wgY29udHJvbF9sb29wX2RyaXZpbmc7CisgICAgZG91YmxlIGxlZnRfZ29hbDsKKyAgICBkb3VibGUgbGVmdF92ZWxvY2l0eV9nb2FsOworICAgIGRvdWJsZSByaWdodF9nb2FsOworICAgIGRvdWJsZSByaWdodF92ZWxvY2l0eV9nb2FsOworICB9OworCisgIG1lc3NhZ2UgUG9zaXRpb24geworICAgIGRvdWJsZSBsZWZ0X2VuY29kZXI7CisgICAgZG91YmxlIHJpZ2h0X2VuY29kZXI7CisgICAgZG91YmxlIGxlZnRfc2hpZnRlcl9wb3NpdGlvbjsKKyAgICBkb3VibGUgcmlnaHRfc2hpZnRlcl9wb3NpdGlvbjsKKyAgfTsKKworICBtZXNzYWdlIE91dHB1dCB7CisgICAgZG91YmxlIGxlZnRfdm9sdGFnZTsKKyAgICBkb3VibGUgcmlnaHRfdm9sdGFnZTsKKyAgICBib29sIGxlZnRfaGlnaDsKKyAgICBib29sIHJpZ2h0X2hpZ2g7CisgIH07CisKKyAgbWVzc2FnZSBTdGF0dXMgeworICAgIGRvdWJsZSByb2JvdF9zcGVlZDsKKyAgICBkb3VibGUgZmlsdGVyZWRfbGVmdF9wb3NpdGlvbjsKKyAgICBkb3VibGUgZmlsdGVyZWRfcmlnaHRfcG9zaXRpb247CisgICAgZG91YmxlIGZpbHRlcmVkX2xlZnRfdmVsb2NpdHk7CisgICAgZG91YmxlIGZpbHRlcmVkX3JpZ2h0X3ZlbG9jaXR5OworCisgICAgZG91YmxlIHVuY2FwcGVkX2xlZnRfdm9sdGFnZTsKKyAgICBkb3VibGUgdW5jYXBwZWRfcmlnaHRfdm9sdGFnZTsKKyAgICBib29sIG91dHB1dF93YXNfY2FwcGVkOworCisgICAgYm9vbCBpc19kb25lOworICB9OworCisgIHF1ZXVlIEdvYWwgZ29hbDsKKyAgcXVldWUgUG9zaXRpb24gcG9zaXRpb247CisgIHF1ZXVlIE91dHB1dCBvdXRwdXQ7CisgIHF1ZXVlIFN0YXR1cyBzdGF0dXM7Cit9OworCitxdWV1ZV9ncm91cCBEcml2ZXRyYWluUXVldWUgZHJpdmV0cmFpbl9xdWV1ZTsKZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmI1Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjCkBAIC0wLDAgKzEsMTMzIEBACisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEE7CisgIEEgPDwgMS4wLCAwLjAwODYwOTU1NTE1MjkxLCAwLjAsIDAuMDAwMjI4MTg0OTk4NzMzLCAwLjAsIDAuNzM1ODQxNjc1ODU4LCAwLjAsIDAuMDQxMDgxMDU1ODExMywgMC4wLCAwLjAwMDIyODE4NDk5ODczMywgMS4wLCAwLjAwODYwOTU1NTE1MjkxLCAwLjAsIDAuMDQxMDgxMDU1ODExMywgMC4wLCAwLjczNTg0MTY3NTg1ODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEI7CisgIEIgPDwgMC4wMDAyNzIyNDQ2NDgwNDQsIC00LjQ2Nzc4OTE5NzA1ZS0wNSwgMC4wNTE3MjEzNTM4Nzc5LCAtMC4wMDgwNDM1MzkxNjIzMywgLTQuNDY3Nzg5MTk3MDVlLTA1LCAwLjAwMDI3MjI0NDY0ODA0NCwgLTAuMDA4MDQzNTM5MTYyMzMsIDAuMDUxNzIxMzUzODc3OTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEM7CisgIEMgPDwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMCwgMCwgMCwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBOworICBBIDw8IDEuMCwgMC4wMDg2MDY2NzA5ODQ1NiwgMC4wLCA3LjA0MTExODcyMDAyZS0wNSwgMC4wLCAwLjczNTA0ODg0ODE3OSwgMC4wLCAwLjAxMzE4MTE4OTMxOTksIDAuMCwgMC4wMDAyNDUzNDM4NzAwNjYsIDEuMCwgMC4wMDk1NzE2OTI2NjA0OSwgMC4wLCAwLjA0NTkyOTEyMTg5NywgMC4wLCAwLjkxNTcwMzg1MzY0MjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEI7CisgIEIgPDwgMC4wMDAyNzI4MDkzNTg5NzEsIC0yLjU3MzQzOTg1ODQ3ZS0wNSwgMC4wNTE4NzY1ODY5OTg0LCAtMC4wMDQ4MTc1NTgwMjI2MywgLTQuODAzNzU0NDAyNDdlLTA1LCAwLjAwMDE1NjU0MDkxNjcyLCAtMC4wMDg5OTI3NzQ5NzU1OCwgMC4wMzA4MDkxNzU1ODM5OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gQzsKKyAgQyA8PCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRDsKKyAgRCA8PCAwLCAwLCAwLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjAsIDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjAsIC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEE7CisgIEEgPDwgMS4wLCAwLjAwOTU3MTY5MjY2MDQ5LCAwLjAsIDAuMDAwMjQ1MzQzODcwMDY2LCAwLjAsIDAuOTE1NzAzODUzNjQyLCAwLjAsIDAuMDQ1OTI5MTIxODk3LCAwLjAsIDcuMDQxMTE4NzIwMDJlLTA1LCAxLjAsIDAuMDA4NjA2NjcwOTg0NTYsIDAuMCwgMC4wMTMxODExODkzMTk5LCAwLjAsIDAuNzM1MDQ4ODQ4MTc5OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gQjsKKyAgQiA8PCAwLjAwMDE1NjU0MDkxNjcyLCAtNC44MDM3NTQ0MDI0N2UtMDUsIDAuMDMwODA5MTc1NTgzOSwgLTAuMDA4OTkyNzc0OTc1NTgsIC0yLjU3MzQzOTg1ODQ3ZS0wNSwgMC4wMDAyNzI4MDkzNTg5NzEsIC0wLjAwNDgxNzU1ODAyMjYzLCAwLjA1MTg3NjU4Njk5ODQ7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA0PiBDOworICBDIDw8IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAsIDAsIDAsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEE7CisgIEEgPDwgMS4wLCAwLjAwOTU3MDc2ODkyMDg1LCAwLjAsIDcuNTYxOTIwODc3NjllLTA1LCAwLjAsIDAuOTE1NDM5ODA2NTY3LCAwLjAsIDAuMDE0NjgxNDE5Mzk4NiwgMC4wLCA3LjU2MTkyMDg3NzY5ZS0wNSwgMS4wLCAwLjAwOTU3MDc2ODkyMDg1LCAwLjAsIDAuMDE0NjgxNDE5Mzk4NiwgMC4wLCAwLjkxNTQzOTgwNjU2NzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEI7CisgIEIgPDwgMC4wMDAxNTY4Nzg1MzE4NzcsIC0yLjc2Mzc4NjQ2MTY1ZS0wNSwgMC4wMzA5MDU2ODE0NTExLCAtMC4wMDUzNjU4NzMxNDYyNCwgLTIuNzYzNzg2NDYxNjVlLTA1LCAwLjAwMDE1Njg3ODUzMTg3NywgLTAuMDA1MzY1ODczMTQ2MjQsIDAuMDMwOTA1NjgxNDUxMTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEM7CisgIEMgPDwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMCwgMCwgMCwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0xvd0NvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBMOworICBMIDw8IDEuMDM1ODQxNjc1ODYsIDAuMDQxMDgxMDU1ODExMywgMTcuMTExNzcwNDAxMSwgMy4yMjg2MTI1MTcwOCwgMC4wNDEwODEwNTU4MTEzLCAxLjAzNTg0MTY3NTg2LCAzLjIyODYxMjUxNzA4LCAxNy4xMTE3NzA0MDExOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gSzsKKyAgSyA8PCAxMjguMjEwNjIwNjMyLCA2LjkzODI4MzgyMDc0LCA1LjExMDM2Njg2NzcxLCAwLjcyOTQ5MzA4MDIwNiwgNS4xMTAzNjY4Njc3LCAwLjcyOTQ5MzA4MDIwNiwgMTI4LjIxMDYyMDYzMiwgNi45MzgyODM4MjA3NDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEFfaW52OworICBBX2ludiA8PCAxLjAsIC0wLjAxMTcxOTQ5NzMzNzcsIDAuMCwgMC4wMDAzNDQxODMxNzY2MDgsIDAuMCwgMS4zNjMyMzY5ODA3NCwgMC4wLCAtMC4wNzYxMDc2OTU4OTA3LCAwLjAsIDAuMDAwMzQ0MTgzMTc2NjA4LCAxLjAsIC0wLjAxMTcxOTQ5NzMzNzcsIDAuMCwgLTAuMDc2MTA3Njk1ODkwNywgMC4wLCAxLjM2MzIzNjk4MDc0OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VEcml2ZXRyYWluTG93TG93UGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluTG93SGlnaENvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBMOworICBMIDw8IDEuMDI4OTE5ODIzNDUsIDAuMDE0MzcxNTUxNjkzOSwgMTYuNjk5NzQ3MjU3MSwgMS4yMzc0MTgyMzU5NCwgMC4wMTQzNzE1NTE2OTM5LCAxLjIyMTgzMjg3ODM4LCAyLjQwNDQwMTc3NTI3LCAzMy41NDAzNjc3MTMyOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gSzsKKyAgSyA8PCAxMjcuODQxMDI1MjQ1LCA2LjkwNjE4OTgyODY4LCAtMi4xMTQ0MjQ4MjE4OSwgMC4xNzEzNjE3MTkxMDEsIDExLjI1NzA4Mzg1NywgMS40NzE5MDk3NDg0MiwgMTM4LjQ1Nzc2MTIzNCwgMTEuMDc3MDU3NDkyNjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEFfaW52OworICBBX2ludiA8PCAxLjAsIC0wLjAxMTcxNDcxMDMwOSwgMC4wLCA5LjE3MzU1ODMzNzI1ZS0wNSwgMC4wLCAxLjM2MTY3ODU0Nzk2LCAwLjAsIC0wLjAxOTYwMDgxNTk4NjcsIDAuMCwgMC4wMDAzMTk2NDc1NDM4NCwgMS4wLCAtMC4wMTA0NTc0MjY3NzMxLCAwLjAsIC0wLjA2ODI5Nzk1NDM3MTMsIDAuMCwgMS4wOTMwMzkyNDQzOTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KEwsIEssIEFfaW52LCBNYWtlRHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoTG93Q29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEw7CisgIEwgPDwgMS4yMTU4NDAzMjYzNiwgMC4wNDU5Mjg1NTMxNTUsIDMzLjMzNzYyOTAxNzcsIDQuMTI2NTI4MTQxNTYsIDAuMDQ1OTI4NTUzMTU1LCAxLjAzNDkxMjM3NTQ2LCAyLjQ1ODM4MDgwMzIyLCAxNi45NjcyNzIyMzk7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA0PiBLOworICBLIDw8IDEzOC40NTc3NjEyMzQsIDExLjA3NzA1NzQ5MjYsIDExLjI1NzA4Mzg1NywgMS40NzE5MDk3NDg0MiwgLTIuMTE0NDI0ODIxOSwgMC4xNzEzNjE3MTkxMDEsIDEyNy44NDEwMjUyNDUsIDYuOTA2MTg5ODI4Njg7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wLCAtMC4wMTA0NTc0MjY3NzMxLCAwLjAsIDAuMDAwMzE5NjQ3NTQzODQsIDAuMCwgMS4wOTMwMzkyNDQzOSwgMC4wLCAtMC4wNjgyOTc5NTQzNzEzLCAwLjAsIDkuMTczNTU4MzM3MjVlLTA1LCAxLjAsIC0wLjAxMTcxNDcxMDMwOSwgMC4wLCAtMC4wMTk2MDA4MTU5ODY3LCAwLjAsIDEuMzYxNjc4NTQ3OTY7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gTDsKKyAgTCA8PCAxLjIxNTQzOTgwNjU3LCAwLjAxNDY4MTQxOTM5ODYsIDMzLjE1NTc4NDA5MjcsIDEuNDcyNzg2OTY2OTQsIDAuMDE0NjgxNDE5Mzk4NiwgMS4yMTU0Mzk4MDY1NywgMS40NzI3ODY5NjY5NCwgMzMuMTU1Nzg0MDkyNzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEs7CisgIEsgPDwgMTM4LjUyNDEwMTUyLCAxMS4wNzc5Mzk5ODE2LCAzLjk2ODQyMzcxNzc0LCAwLjg4MjcyODA4NjUxNiwgMy45Njg0MjM3MTc3NCwgMC44ODI3MjgwODY1MTcsIDEzOC41MjQxMDE1MiwgMTEuMDc3OTM5OTgxNjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEFfaW52OworICBBX2ludiA8PCAxLjAsIC0wLjAxMDQ1NjE5NjA5MiwgMC4wLCA4LjUwODc2MTY2ODg3ZS0wNSwgMC4wLCAxLjA5MjY1MjE0NjMsIDAuMCwgLTAuMDE3NTIzNDcyNjUzOCwgMC4wLCA4LjUwODc2MTY2ODg3ZS0wNSwgMS4wLCAtMC4wMTA0NTYxOTYwOTIsIDAuMCwgLTAuMDE3NTIzNDcyNjUzOCwgMC4wLCAxLjA5MjY1MjE0NjM7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5QbGFudCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+Pj4gcGxhbnRzKDQpOworICBwbGFudHNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4oTWFrZURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1sxXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1syXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1szXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkhpZ2hIaWdoUGxhbnRDb2VmZmljaWVudHMoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+KCZwbGFudHMpOworfQorCitTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvb3AoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+Pj4gY29udHJvbGxlcnMoNCk7CisgIGNvbnRyb2xsZXJzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkxvd0xvd0NvbnRyb2xsZXIoKSkpOworICBjb250cm9sbGVyc1sxXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4oTWFrZURyaXZldHJhaW5Mb3dIaWdoQ29udHJvbGxlcigpKSk7CisgIGNvbnRyb2xsZXJzWzJdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkhpZ2hMb3dDb250cm9sbGVyKCkpKTsKKyAgY29udHJvbGxlcnNbM10gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hDb250cm9sbGVyKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+KCZjb250cm9sbGVycyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaCBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDk4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIFkyMDE0X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9EUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXworI2RlZmluZSBZMjAxNF9DT05UUk9MX0xPT1BTX0RSSVZFVFJBSU5fRFJJVkVUUkFJTl9ET0dfTU9UT1JfUExBTlRfSF8KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0xvd1BsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluTG93TG93Q29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dIaWdoQ29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoTG93Q29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudDw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpblBsYW50KCk7CisKK1N0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluTG9vcCgpOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE0X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9EUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXwpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fbGliX3Rlc3QuY2MgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9saWJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI5MWQ4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fbGliX3Rlc3QuY2MKQEAgLTAsMCArMSwyOTcgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9uZXR3b3JrL3RlYW1fbnVtYmVyLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3BvbHl0b3BlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BfdGVzdC5oIgorCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2NvZXJjZV9nb2FsLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgiCisjaW5jbHVkZSAiZnJjOTcxL3F1ZXVlcy9neXJvLnEuaCIKKworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgRW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5FbnZpcm9ubWVudCgpIHt9CisgIC8vIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgYW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDA+OjpJbml0KCk7CisgIH0KK307Cis6OnRlc3Rpbmc6OkVudmlyb25tZW50KiBjb25zdCBob2xkZXJfZW52ID0KKyAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEVudmlyb25tZW50KTsKKworY2xhc3MgVGVhbU51bWJlckVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgLy8gT3ZlcnJpZGUgdGhpcyB0byBkZWZpbmUgaG93IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsgYW9zOjpuZXR3b3JrOjpPdmVycmlkZVRlYW1OdW1iZXIoOTcxKTsgfQorfTsKKworOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgdGVhbV9udW1iZXJfZW52ID0KKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgVGVhbU51bWJlckVudmlyb25tZW50KTsKKworLy8gQ2xhc3Mgd2hpY2ggc2ltdWxhdGVzIHRoZSBkcml2ZXRyYWluIGFuZCBzZW5kcyBvdXQgcXVldWUgbWVzc2FnZXMgY29udGFpbmluZworLy8gdGhlIHBvc2l0aW9uLgorY2xhc3MgRHJpdmV0cmFpblNpbXVsYXRpb24geworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIG1vdG9yIHNpbXVsYXRpb24uCisgIC8vIFRPRE8oYXNjaHVoKSBEbyB3ZSB3YW50IHRvIHRlc3QgdGhlIGNsdXRjaCBvbmUgdG9vPworICBEcml2ZXRyYWluU2ltdWxhdGlvbigpCisgICAgICA6IGRyaXZldHJhaW5fcGxhbnRfKAorICAgICAgICAgICAgbmV3IFN0YXRlRmVlZGJhY2tQbGFudDw0LCAyLCAyPihNYWtlRHJpdmV0cmFpblBsYW50KCkpKSwKKyAgICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8oIi5mcmM5NzEuY29udHJvbF9sb29wcy5kcml2ZXRyYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMHg4YThkZGU3NywgIi5mcmM5NzEuY29udHJvbF9sb29wcy5kcml2ZXRyYWluLmdvYWwiLAorICAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4ucG9zaXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4ub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5kcml2ZXRyYWluLnN0YXR1cyIpIHsKKyAgICBSZWluaXRpYWxpemUoKTsKKyAgfQorCisgIC8vIFJlc2V0cyB0aGUgcGxhbnQuCisgIHZvaWQgUmVpbml0aWFsaXplKCkgeworICAgIGRyaXZldHJhaW5fcGxhbnRfLT5tdXRhYmxlX1goMCwgMCkgPSAwLjA7CisgICAgZHJpdmV0cmFpbl9wbGFudF8tPm11dGFibGVfWCgxLCAwKSA9IDAuMDsKKyAgICBkcml2ZXRyYWluX3BsYW50Xy0+bXV0YWJsZV9ZKCkgPQorICAgICAgICBkcml2ZXRyYWluX3BsYW50Xy0+QygpICogZHJpdmV0cmFpbl9wbGFudF8tPlgoKTsKKyAgICBsYXN0X2xlZnRfcG9zaXRpb25fID0gZHJpdmV0cmFpbl9wbGFudF8tPlkoMCwgMCk7CisgICAgbGFzdF9yaWdodF9wb3NpdGlvbl8gPSBkcml2ZXRyYWluX3BsYW50Xy0+WSgxLCAwKTsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcml2ZXRyYWluLgorICBkb3VibGUgR2V0TGVmdFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gZHJpdmV0cmFpbl9wbGFudF8tPlkoMCwgMCk7IH0KKyAgZG91YmxlIEdldFJpZ2h0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBkcml2ZXRyYWluX3BsYW50Xy0+WSgxLCAwKTsgfQorCisgIC8vIFNlbmRzIG91dCB0aGUgcG9zaXRpb24gcXVldWUgbWVzc2FnZXMuCisgIHZvaWQgU2VuZFBvc2l0aW9uTWVzc2FnZSgpIHsKKyAgICBjb25zdCBkb3VibGUgbGVmdF9lbmNvZGVyID0gR2V0TGVmdFBvc2l0aW9uKCk7CisgICAgY29uc3QgZG91YmxlIHJpZ2h0X2VuY29kZXIgPSBHZXRSaWdodFBvc2l0aW9uKCk7CisKKyAgICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjxjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OlBvc2l0aW9uPiBwb3NpdGlvbiA9CisgICAgICAgIG15X2RyaXZldHJhaW5fcXVldWVfLnBvc2l0aW9uLk1ha2VNZXNzYWdlKCk7CisgICAgcG9zaXRpb24tPmxlZnRfZW5jb2RlciA9IGxlZnRfZW5jb2RlcjsKKyAgICBwb3NpdGlvbi0+cmlnaHRfZW5jb2RlciA9IHJpZ2h0X2VuY29kZXI7CisgICAgcG9zaXRpb24uU2VuZCgpOworICB9CisKKyAgLy8gU2ltdWxhdGVzIHRoZSBkcml2ZXRyYWluIG1vdmluZyBmb3Igb25lIHRpbWVzdGVwLgorICB2b2lkIFNpbXVsYXRlKCkgeworICAgIGxhc3RfbGVmdF9wb3NpdGlvbl8gPSBkcml2ZXRyYWluX3BsYW50Xy0+WSgwLCAwKTsKKyAgICBsYXN0X3JpZ2h0X3Bvc2l0aW9uXyA9IGRyaXZldHJhaW5fcGxhbnRfLT5ZKDEsIDApOworICAgIEVYUEVDVF9UUlVFKG15X2RyaXZldHJhaW5fcXVldWVfLm91dHB1dC5GZXRjaExhdGVzdCgpKTsKKyAgICBkcml2ZXRyYWluX3BsYW50Xy0+bXV0YWJsZV9VKCkgPDwgbXlfZHJpdmV0cmFpbl9xdWV1ZV8ub3V0cHV0LT5sZWZ0X3ZvbHRhZ2UsCisgICAgICAgIG15X2RyaXZldHJhaW5fcXVldWVfLm91dHB1dC0+cmlnaHRfdm9sdGFnZTsKKyAgICBkcml2ZXRyYWluX3BsYW50Xy0+VXBkYXRlKCk7CisgIH0KKworICA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4+IGRyaXZldHJhaW5fcGxhbnRfOworIHByaXZhdGU6CisgIERyaXZldHJhaW5RdWV1ZSBteV9kcml2ZXRyYWluX3F1ZXVlXzsKKyAgZG91YmxlIGxhc3RfbGVmdF9wb3NpdGlvbl87CisgIGRvdWJsZSBsYXN0X3JpZ2h0X3Bvc2l0aW9uXzsKK307CisKK2NsYXNzIERyaXZldHJhaW5UZXN0IDogcHVibGljIDo6YW9zOjp0ZXN0aW5nOjpDb250cm9sTG9vcFRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0IHF1ZXVlIHNvIHRoYXQgaXQgaW52YWxpZGF0ZXMgdGhlIHF1ZXVlCisgIC8vIHRoYXQgaXQgcG9pbnRzIHRvLiAgT3RoZXJ3aXNlLCB3ZSB3aWxsIGhhdmUgYSBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkgdGhhdAorICAvLyBpcyBubyBsb25nZXIgdmFsaWQuCisgIERyaXZldHJhaW5RdWV1ZSBteV9kcml2ZXRyYWluX3F1ZXVlXzsKKworICAvLyBDcmVhdGUgYSBsb29wIGFuZCBzaW11bGF0aW9uIHBsYW50LgorICBEcml2ZXRyYWluTG9vcCBkcml2ZXRyYWluX21vdG9yXzsKKyAgRHJpdmV0cmFpblNpbXVsYXRpb24gZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF87CisKKyAgRHJpdmV0cmFpblRlc3QoKSA6IG15X2RyaXZldHJhaW5fcXVldWVfKCIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4YThkZGU3NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4uZ29hbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5kcml2ZXRyYWluLnBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4ub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4uc3RhdHVzIiksCisgICAgICAgICAgICAgICAgZHJpdmV0cmFpbl9tb3Rvcl8oJm15X2RyaXZldHJhaW5fcXVldWVfKSwKKyAgICAgICAgICAgICAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50XygpIHsKKyAgICA6OmZyYzk3MTo6c2Vuc29yczo6Z3lyb19yZWFkaW5nLkNsZWFyKCk7CisgIH0KKworICB2b2lkIFZlcmlmeU5lYXJHb2FsKCkgeworICAgIG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuRmV0Y2hMYXRlc3QoKTsKKyAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5wb3NpdGlvbi5GZXRjaExhdGVzdCgpOworICAgIEVYUEVDVF9ORUFSKG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwtPmxlZnRfZ29hbCwKKyAgICAgICAgICAgICAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5HZXRMZWZ0UG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAxZS0yKTsKKyAgICBFWFBFQ1RfTkVBUihteV9kcml2ZXRyYWluX3F1ZXVlXy5nb2FsLT5yaWdodF9nb2FsLAorICAgICAgICAgICAgICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLkdldFJpZ2h0UG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAxZS0yKTsKKyAgfQorCisgIHZpcnR1YWwgfkRyaXZldHJhaW5UZXN0KCkgeworICAgIDo6ZnJjOTcxOjpzZW5zb3JzOjpneXJvX3JlYWRpbmcuQ2xlYXIoKTsKKyAgfQorfTsKKworLy8gVGVzdHMgdGhhdCB0aGUgZHJpdmV0cmFpbiBjb252ZXJnZXMgb24gYSBnb2FsLgorVEVTVF9GKERyaXZldHJhaW5UZXN0LCBDb252ZXJnZXNDb3JyZWN0bHkpIHsKKyAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5jb250cm9sX2xvb3BfZHJpdmluZyh0cnVlKQorICAgICAgLmxlZnRfZ29hbCgtMS4wKQorICAgICAgLnJpZ2h0X2dvYWwoMS4wKS5TZW5kKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyArK2kpIHsKKyAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgfQorICBWZXJpZnlOZWFyR29hbCgpOworfQorCisvLyBUZXN0cyB0aGF0IGl0IHN1cnZpdmVzIGRpc2FibGluZy4KK1RFU1RfRihEcml2ZXRyYWluVGVzdCwgU3Vydml2ZXNEaXNhYmxpbmcpIHsKKyAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5jb250cm9sX2xvb3BfZHJpdmluZyh0cnVlKQorICAgICAgLmxlZnRfZ29hbCgtMS4wKQorICAgICAgLnJpZ2h0X2dvYWwoMS4wKS5TZW5kKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyArK2kpIHsKKyAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgaWYgKGkgPiAyMCAmJiBpIDwgMjAwKSB7CisgICAgICBTaW11bGF0ZVRpbWVzdGVwKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgICB9CisgIH0KKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCBuZXZlciBoYXZpbmcgYSBnb2FsIGRvZXNuJ3QgYnJlYWsuCitURVNUX0YoRHJpdmV0cmFpblRlc3QsIE5vR29hbFN0YXJ0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgeworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBkcml2ZXRyYWluX21vdG9yXy5JdGVyYXRlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgfQorfQorCisvLyBUZXN0cyB0aGF0IG5ldmVyIGhhdmluZyBhIGdvYWwsIGJ1dCBoYXZpbmcgZHJpdmVyJ3Mgc3RhdGlvbiBtZXNzYWdlcywgZG9lc24ndAorLy8gYnJlYWsuCitURVNUX0YoRHJpdmV0cmFpblRlc3QsIE5vR29hbFdpdGhSb2JvdFN0YXRlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgeworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBkcml2ZXRyYWluX21vdG9yXy5JdGVyYXRlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9Cit9CisKKzo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IE1ha2VCb3goZG91YmxlIHgxX21pbiwgZG91YmxlIHgxX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgyX21pbiwgZG91YmxlIHgyX21heCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gYm94X0g7CisgIGJveF9IIDw8IC8qW1sqLyAxLjAsIDAuMCAvKl0qLywKKyAgICAgICAgICAgIC8qWyovLTEuMCwgMC4wIC8qXSovLAorICAgICAgICAgICAgLypbKi8gMC4wLCAxLjAgLypdKi8sCisgICAgICAgICAgICAvKlsqLyAwLjAsLTEuMCAvKl1dKi87CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAxPiBib3hfazsKKyAgYm94X2sgPDwgLypbWyovIHgxX21heCAvKl0qLywKKyAgICAgICAgICAgIC8qWyovLXgxX21pbiAvKl0qLywKKyAgICAgICAgICAgIC8qWyovIHgyX21heCAvKl0qLywKKyAgICAgICAgICAgIC8qWyovLXgyX21pbiAvKl1dKi87CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IHRfcG9seShib3hfSCwgYm94X2spOworICByZXR1cm4gdF9wb2x5OworfQorCitjbGFzcyBDb2VyY2VHb2FsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworfTsKKworLy8gV0hPT09ISCEKK1RFU1RfRihDb2VyY2VHb2FsVGVzdCwgSW5zaWRlKSB7CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IGJveCA9IE1ha2VCb3goMSwgMiwgMSwgMik7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEs7CisgIEsgPDwgLypbWyovIDEsIC0xIC8qXV0qLzsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gUjsKKyAgUiA8PCAvKltbKi8gMS41LCAxLjUgLypdXSovOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBvdXRwdXQgPQorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkNvZXJjZUdvYWwoYm94LCBLLCAwLCBSKTsKKworICBFWFBFQ1RfRVEoUigwLCAwKSwgb3V0cHV0KDAsIDApKTsKKyAgRVhQRUNUX0VRKFIoMSwgMCksIG91dHB1dCgxLCAwKSk7Cit9CisKK1RFU1RfRihDb2VyY2VHb2FsVGVzdCwgT3V0c2lkZV9JbnNpZGVfSW50ZXJzZWN0KSB7CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IGJveCA9IE1ha2VCb3goMSwgMiwgMSwgMik7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEs7CisgIEsgPDwgMSwgLTE7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFI7CisgIFIgPDwgNSwgNTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gb3V0cHV0ID0KKyAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDb2VyY2VHb2FsKGJveCwgSywgMCwgUik7CisKKyAgRVhQRUNUX0VRKDIuMCwgb3V0cHV0KDAsIDApKTsKKyAgRVhQRUNUX0VRKDIuMCwgb3V0cHV0KDEsIDApKTsKK30KKworVEVTVF9GKENvZXJjZUdvYWxUZXN0LCBPdXRzaWRlX0luc2lkZV9ub19JbnRlcnNlY3QpIHsKKyAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gYm94ID0gTWFrZUJveCgzLCA0LCAxLCAyKTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gSzsKKyAgSyA8PCAxLCAtMTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gUjsKKyAgUiA8PCA1LCA1OworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBvdXRwdXQgPQorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkNvZXJjZUdvYWwoYm94LCBLLCAwLCBSKTsKKworICBFWFBFQ1RfRVEoMy4wLCBvdXRwdXQoMCwgMCkpOworICBFWFBFQ1RfRVEoMi4wLCBvdXRwdXQoMSwgMCkpOworfQorCitURVNUX0YoQ29lcmNlR29hbFRlc3QsIE1pZGRsZV9PZl9FZGdlKSB7CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IGJveCA9IE1ha2VCb3goMCwgNCwgMSwgMik7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEs7CisgIEsgPDwgLTEsIDE7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFI7CisgIFIgPDwgNSwgNTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gb3V0cHV0ID0KKyAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDb2VyY2VHb2FsKGJveCwgSywgMCwgUik7CisKKyAgRVhQRUNUX0VRKDIuMCwgb3V0cHV0KDAsIDApKTsKKyAgRVhQRUNUX0VRKDIuMCwgb3V0cHV0KDEsIDApKTsKK30KKworVEVTVF9GKENvZXJjZUdvYWxUZXN0LCBQZXJwZW5kaWN1bGFyTGluZSkgeworICA6OmFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwyPiBib3ggPSBNYWtlQm94KDEsIDIsIDEsIDIpOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBLOworICBLIDw8IDEsIDE7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFI7CisgIFIgPDwgNSwgNTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gb3V0cHV0ID0KKyAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDb2VyY2VHb2FsKGJveCwgSywgMCwgUik7CisKKyAgRVhQRUNUX0VRKDEuMCwgb3V0cHV0KDAsIDApKTsKKyAgRVhQRUNUX0VRKDEuMCwgb3V0cHV0KDEsIDApKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9tYWluLmNjIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTJlYmUxCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fbWFpbi5jYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uaCIKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKworaW50IG1haW4oKSB7CisgIDo6YW9zOjpJbml0KCk7CisgIGZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpbkxvb3AgZHJpdmV0cmFpbjsKKyAgZHJpdmV0cmFpbi5SdW4oKTsKKyAgOjphb3M6OkNsZWFudXAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU5YTdhCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5jYwpAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDEsIDEsIDE+IE1ha2VDSU1QbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEE7CisgIEEgPDwgMC42MTQ1Mzc1ODAyMjE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBCOworICBCIDw8IDE1Ljk2NTc1OTg4NTI7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBDOworICBDIDw8IDE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBEOworICBEIDw8IDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwxLCAxLCAxPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwxLCAxLCAxPiBNYWtlQ0lNQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEw7CisgIEwgPDwgMC42MDQ1Mzc1ODAyMjE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBLOworICBLIDw8IDAuMDM3ODY0NjI5MzQyMjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEFfaW52OworICBBX2ludiA8PCAxLjYyNzIzOTc4NTE0OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MSwgMSwgMT4oTCwgSywgQV9pbnYsIE1ha2VDSU1QbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50PDEsIDEsIDE+IE1ha2VDSU1QbGFudCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDEsIDEsIDE+Pj4gcGxhbnRzKDEpOworICBwbGFudHNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MSwgMSwgMT4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MSwgMSwgMT4oTWFrZUNJTVBsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudDwxLCAxLCAxPigmcGxhbnRzKTsKK30KKworU3RhdGVGZWVkYmFja0xvb3A8MSwgMSwgMT4gTWFrZUNJTUxvb3AoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDEsIDEsIDE+Pj4gY29udHJvbGxlcnMoMSk7CisgIGNvbnRyb2xsZXJzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MSwgMSwgMT4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwxLCAxLCAxPihNYWtlQ0lNQ29udHJvbGxlcigpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrTG9vcDwxLCAxLCAxPigmY29udHJvbGxlcnMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5oIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWYxODgKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBZMjAxNF9DT05UUk9MX0xPT1BTX0RSSVZFVFJBSU5fUE9MWURSSVZFVFJBSU5fQ0lNX1BMQU5UX0hfCisjZGVmaW5lIFkyMDE0X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9DSU1fUExBTlRfSF8KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwxLCAxLCAxPiBNYWtlQ0lNUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MSwgMSwgMT4gTWFrZUNJTUNvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDEsIDEsIDE+IE1ha2VDSU1QbGFudCgpOworCitTdGF0ZUZlZWRiYWNrTG9vcDwxLCAxLCAxPiBNYWtlQ0lNTG9vcCgpOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE0X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9DSU1fUExBTlRfSF8KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDgwY2UKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjCkBAIC0wLDAgKzEsMTMzIEBACisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEE7CisgIEEgPDwgMC43MzU4NDE2NzU4NTgsIDAuMDQxMDgxMDU1ODExMywgMC4wNDEwODEwNTU4MTEzLCAwLjczNTg0MTY3NTg1ODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEI7CisgIEIgPDwgMC4wNTE3MjEzNTM4Nzc5LCAtMC4wMDgwNDM1MzkxNjIzMywgLTAuMDA4MDQzNTM5MTYyMzMsIDAuMDUxNzIxMzUzODc3OTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEM7CisgIEMgPDwgMS4wLCAwLjAsIDAuMCwgMS4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRDsKKyAgRCA8PCAwLjAsIDAuMCwgMC4wLCAwLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBOworICBBIDw8IDAuNzM1MDQ4ODQ4MTc5LCAwLjAxMzE4MTE4OTMxOTksIDAuMDQ1OTI5MTIxODk3LCAwLjkxNTcwMzg1MzY0MjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEI7CisgIEIgPDwgMC4wNTE4NzY1ODY5OTg0LCAtMC4wMDQ4MTc1NTgwMjI2MywgLTAuMDA4OTkyNzc0OTc1NTgsIDAuMDMwODA5MTc1NTgzOTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEM7CisgIEMgPDwgMS4wLCAwLjAsIDAuMCwgMS4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRDsKKyAgRCA8PCAwLjAsIDAuMCwgMC4wLCAwLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBOworICBBIDw8IDAuOTE1NzAzODUzNjQyLCAwLjA0NTkyOTEyMTg5NywgMC4wMTMxODExODkzMTk5LCAwLjczNTA0ODg0ODE3OTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEI7CisgIEIgPDwgMC4wMzA4MDkxNzU1ODM5LCAtMC4wMDg5OTI3NzQ5NzU1OCwgLTAuMDA0ODE3NTU4MDIyNjMsIDAuMDUxODc2NTg2OTk4NDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEM7CisgIEMgPDwgMS4wLCAwLjAsIDAuMCwgMS4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRDsKKyAgRCA8PCAwLjAsIDAuMCwgMC4wLCAwLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQTsKKyAgQSA8PCAwLjkxNTQzOTgwNjU2NywgMC4wMTQ2ODE0MTkzOTg2LCAwLjAxNDY4MTQxOTM5ODYsIDAuOTE1NDM5ODA2NTY3OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQjsKKyAgQiA8PCAwLjAzMDkwNTY4MTQ1MTEsIC0wLjAwNTM2NTg3MzE0NjI0LCAtMC4wMDUzNjU4NzMxNDYyNCwgMC4wMzA5MDU2ODE0NTExOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQzsKKyAgQyA8PCAxLjAsIDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAuMCwgMC4wLCAwLjAsIDAuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93TG93Q29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEw7CisgIEwgPDwgMC43MTU4NDE2NzU4NTgsIDAuMDQxMDgxMDU1ODExMywgMC4wNDEwODEwNTU4MTEzLCAwLjcxNTg0MTY3NTg1ODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEs7CisgIEsgPDwgMi44MTgwOTQwMzk5NCwgMS4yMzI1Mzc0NDkzMywgMS4yMzI1Mzc0NDkzMywgMi44MTgwOTQwMzk5NDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEFfaW52OworICBBX2ludiA8PCAxLjM2MzIzNjk4MDc0LCAtMC4wNzYxMDc2OTU4OTA3LCAtMC4wNzYxMDc2OTU4OTA3LCAxLjM2MzIzNjk4MDc0OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gTDsKKyAgTCA8PCAwLjcxNTg4NTQ1NzM0MywgMC4wNDU5MDc3MzUxMzM1LCAwLjA0NTkwNzczNTEzMzUsIDAuODk0ODY3MjQ0NDc4OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gSzsKKyAgSyA8PCAyLjgxODEwMDM4OTc4LCAxLjIzOTI4MTc0NDc1LCAyLjMxMzMyNTkyMzU0LCAxMC42MDg4MDE3Mzg4OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQV9pbnY7CisgIEFfaW52IDw8IDEuMzYxNjc4NTQ3OTYsIC0wLjAxOTYwMDgxNTk4NjcsIC0wLjA2ODI5Nzk1NDM3MTMsIDEuMDkzMDM5MjQ0Mzk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hMb3dDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gTDsKKyAgTCA8PCAwLjkwMjMyODg0OTAzMywgMC4wMTQ1ODEzMDQ3OTgsIDAuMDE0NTgxMzA0Nzk4LCAwLjcwODQyMzg1Mjc4ODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEs7CisgIEsgPDwgMTAuNjA4ODAxNzM4OCwgMi4zMTMzMjU5MjM1NCwgMS4yMzkyODE3NDQ3NSwgMi44MTgxMDAzODk3ODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEFfaW52OworICBBX2ludiA8PCAxLjA5MzAzOTI0NDM5LCAtMC4wNjgyOTc5NTQzNzEzLCAtMC4wMTk2MDA4MTU5ODY3LCAxLjM2MTY3ODU0Nzk2OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaENvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBMOworICBMIDw8IDAuODk1NDM5ODA2NTY3LCAwLjAxNDY4MTQxOTM5ODYsIDAuMDE0NjgxNDE5Mzk4NiwgMC44OTU0Mzk4MDY1Njc7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBLOworICBLIDw8IDEwLjYwODgwMjI5NDQsIDIuMzE2OTQ5NjE1MTQsIDIuMzE2OTQ5NjE1MTQsIDEwLjYwODgwMjI5NDQ7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wOTI2NTIxNDYzLCAtMC4wMTc1MjM0NzI2NTM4LCAtMC4wMTc1MjM0NzI2NTM4LCAxLjA5MjY1MjE0NjM7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hIaWdoUGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudDwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluUGxhbnQoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPj4+IHBsYW50cyg0KTsKKyAgcGxhbnRzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+KE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1sxXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93SGlnaFBsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcGxhbnRzWzJdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+KE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKSkpOworICBwbGFudHNbM10gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4oTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hIaWdoUGxhbnRDb2VmZmljaWVudHMoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50PDIsIDIsIDI+KCZwbGFudHMpOworfQorCitTdGF0ZUZlZWRiYWNrTG9vcDwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG9vcCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4+PiBjb250cm9sbGVycyg0KTsKKyAgY29udHJvbGxlcnNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+KE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dMb3dDb250cm9sbGVyKCkpKTsKKyAgY29udHJvbGxlcnNbMV0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+KE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dIaWdoQ29udHJvbGxlcigpKSk7CisgIGNvbnRyb2xsZXJzWzJdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPihNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaExvd0NvbnRyb2xsZXIoKSkpOworICBjb250cm9sbGVyc1szXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hIaWdoQ29udHJvbGxlcigpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrTG9vcDwyLCAyLCAyPigmY29udHJvbGxlcnMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYWM3YmUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBZMjAxNF9DT05UUk9MX0xPT1BTX0RSSVZFVFJBSU5fUE9MWURSSVZFVFJBSU5fRE9HX01PVE9SX1BMQU5UX0hfCisjZGVmaW5lIFkyMDE0X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9ET0dfTU9UT1JfUExBTlRfSF8KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93TG93UGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0xvd0NvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaExvd1BsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93Q29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hIaWdoUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hIaWdoQ29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnQ8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpblBsYW50KCk7CisKK1N0YXRlRmVlZGJhY2tMb29wPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb29wKCk7CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTRfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX1BPTFlEUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXwpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3JlcGxheV9kcml2ZXRyYWluLmNjIGIveTIwMTQvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3JlcGxheV9kcml2ZXRyYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MjA5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcmVwbGF5X2RyaXZldHJhaW4uY2MKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcmVwbGF5X2NvbnRyb2xfbG9vcC5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKworI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKworLy8gUmVhZHMgb25lIG9yIG1vcmUgbG9nIGZpbGVzIGFuZCBzZW5kcyBvdXQgYWxsIHRoZSBxdWV1ZSBtZXNzYWdlcyAoaW4gdGhlCisvLyBjb3JyZWN0IG9yZGVyIGFuZCBhdCB0aGUgY29ycmVjdCB0aW1lKSB0byBmZWVkIGEgImxpdmUiIGRyaXZldHJhaW4gcHJvY2Vzcy4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGlmIChhcmdjIDw9IDEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5lZWQgYXQgbGVhc3Qgb25lIGZpbGUgdG8gcmVwbGF5IVxuIik7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIDo6YW9zOjpJbml0TlJUKCk7CisKKyAgOjphb3M6OmNvbnRyb2xzOjpDb250cm9sTG9vcFJlcGxheWVyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU+CisgICAgICByZXBsYXllcigmOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUsICJkcml2ZXRyYWluIik7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgcmVwbGF5ZXIuUHJvY2Vzc0ZpbGUoYXJndltpXSk7CisgIH0KKworICA6OmFvczo6Q2xlYW51cCgpOworfQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9weXRob24vYXJtLnB5IGIveTIwMTQvY29udHJvbF9sb29wcy9weXRob24vYXJtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxNzk5MGEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL3B5dGhvbi9hcm0ucHkKQEAgLTAsMCArMSw0MDkgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKK2ltcG9ydCBjb250cm9sX2xvb3AKK2ltcG9ydCBjb250cm9scworaW1wb3J0IHBvbHl0b3BlCitpbXBvcnQgcG9seWRyaXZldHJhaW4KK2ltcG9ydCBudW1weQoraW1wb3J0IG1hdGgKK2ltcG9ydCBzeXMKK2ltcG9ydCBtYXRwbG90bGliCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCisKKworY2xhc3MgQXJtKGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSJBcm0iLCBtYXNzPU5vbmUpOgorICAgIHN1cGVyKEFybSwgc2VsZikuX19pbml0X18obmFtZSkKKyAgICAjIFN0YWxsIFRvcnF1ZSBpbiBOIG0KKyAgICBzZWxmLnN0YWxsX3RvcnF1ZSA9IDAuNDc2CisgICAgIyBTdGFsbCBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLnN0YWxsX2N1cnJlbnQgPSA4MC43MzAKKyAgICAjIEZyZWUgU3BlZWQgaW4gUlBNCisgICAgc2VsZi5mcmVlX3NwZWVkID0gMTM5MDYuMAorICAgICMgRnJlZSBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLmZyZWVfY3VycmVudCA9IDUuODIwCisgICAgIyBNYXNzIG9mIHRoZSBhcm0KKyAgICBpZiBtYXNzIGlzIE5vbmU6CisgICAgICBzZWxmLm1hc3MgPSAxMy4wCisgICAgZWxzZToKKyAgICAgIHNlbGYubWFzcyA9IG1hc3MKKworICAgICMgUmVzaXN0YW5jZSBvZiB0aGUgbW90b3IKKyAgICBzZWxmLlIgPSAxMi4wIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBNb3RvciB2ZWxvY2l0eSBjb25zdGFudAorICAgIHNlbGYuS3YgPSAoKHNlbGYuZnJlZV9zcGVlZCAvIDYwLjAgKiAyLjAgKiBudW1weS5waSkgLworICAgICAgICAgICAgICAgKDEyLjAgLSBzZWxmLlIgKiBzZWxmLmZyZWVfY3VycmVudCkpCisgICAgIyBUb3JxdWUgY29uc3RhbnQKKyAgICBzZWxmLkt0ID0gc2VsZi5zdGFsbF90b3JxdWUgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIEdlYXIgcmF0aW8KKyAgICBzZWxmLkcgPSAoNDQuMCAvIDEyLjApICogKDU0LjAgLyAxNC4wKSAqICg1NC4wIC8gMTQuMCkgKiAoNDQuMCAvIDIwLjApICogKDcyLjAgLyAxNi4wKQorICAgICMgRnJpZGdlIGFybSBsZW5ndGgKKyAgICBzZWxmLnIgPSAzMiAqIDAuMDI1NAorICAgICMgQ29udHJvbCBsb29wIHRpbWUgc3RlcAorICAgIHNlbGYuZHQgPSAwLjAwNQorCisgICAgIyBBcm0gbW9tZW50IG9mIGluZXJ0aWEKKyAgICBzZWxmLkogPSBzZWxmLnIgKiBzZWxmLm1hc3MKKworICAgICMgQXJtIGxlZnQvcmlnaHQgc3ByaW5nIGNvbnN0YW50IChOKm0gLyByYWRpYW4pCisgICAgc2VsZi5zcHJpbmcgPSAxMDAuMAorCisgICAgIyBTdGF0ZSBpcyBbYXZlcmFnZSBwb3NpdGlvbiwgYXZlcmFnZSB2ZWxvY2l0eSwKKyAgICAjICAgICAgICAgICBwb3NpdGlvbiBkaWZmZXJlbmNlLzIsIHZlbG9jaXR5IGRpZmZlcmVuY2UvMl0KKyAgICAjIFBvc2l0aW9uIGRpZmZlcmVuY2UgaXMgMSAtIDIKKyAgICAjIElucHV0IGlzIFtWb2x0YWdlIDEsIFZvbHRhZ2UgMl0KKworICAgIHNlbGYuQzEgPSBzZWxmLnNwcmluZyAvIChzZWxmLkogKiAwLjUpCisgICAgc2VsZi5DMiA9IHNlbGYuS3QgKiBzZWxmLkcgLyAoc2VsZi5KICogMC41ICogc2VsZi5SKQorICAgIHNlbGYuQzMgPSBzZWxmLkcgKiBzZWxmLkcgKiBzZWxmLkt0IC8gKHNlbGYuUiAgKiBzZWxmLkogKiAwLjUgKiBzZWxmLkt2KQorCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMSwgMCwgMF0sCisgICAgICAgICBbMCwgLXNlbGYuQzMsIDAsIDBdLAorICAgICAgICAgWzAsIDAsIDAsIDFdLAorICAgICAgICAgWzAsIDAsIC1zZWxmLkMxICogMi4wLCAtc2VsZi5DM11dKQorCisgICAgcHJpbnQgJ0Z1bGwgc3BlZWQgaXMnLCBzZWxmLkMyIC8gc2VsZi5DMyAqIDEyLjAKKworICAgIHByaW50ICdTdGFsbCBhcm0gZGlmZmVyZW5jZSBpcycsIDEyLjAgKiBzZWxmLkMyIC8gc2VsZi5DMQorICAgIHByaW50ICdTdGFsbCBhcm0gZGlmZmVyZW5jZSBmaXJzdCBwcmluY2lwbGVzIGlzJywgc2VsZi5zdGFsbF90b3JxdWUgKiBzZWxmLkcgLyBzZWxmLnNwcmluZworCisgICAgcHJpbnQgJzUgZGVncmVlcyBvZiBhcm0gZXJyb3IgaXMnLCBzZWxmLnNwcmluZyAvIHNlbGYuciAqIChtYXRoLnBpICogNS4wIC8gMTgwLjApCisKKyAgICAjIFN0YXJ0IHdpdGggdGhlIHVubW9kaWZpZWQgaW5wdXQKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLCAwXSwKKyAgICAgICAgIFtzZWxmLkMyIC8gMi4wLCBzZWxmLkMyIC8gMi4wXSwKKyAgICAgICAgIFswLCAwXSwKKyAgICAgICAgIFtzZWxmLkMyIC8gMi4wLCAtc2VsZi5DMiAvIDIuMF1dKQorCisgICAgc2VsZi5DID0gbnVtcHkubWF0cml4KFtbMSwgMCwgMSwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMSwgMCwgLTEsIDBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwXV0pCisKKyAgICBzZWxmLkEsIHNlbGYuQiA9IHNlbGYuQ29udGludW91c1RvRGlzY3JldGUoCisgICAgICAgIHNlbGYuQV9jb250aW51b3VzLCBzZWxmLkJfY29udGludW91cywgc2VsZi5kdCkKKworICAgIGNvbnRyb2xhYmlsaXR5ID0gY29udHJvbHMuY3RyYihzZWxmLkEsIHNlbGYuQik7CisgICAgcHJpbnQgJ1Jhbmsgb2YgYXVnbWVudGVkIGNvbnRyb2xhYmlsaXR5IG1hdHJpeC4nLCBudW1weS5saW5hbGcubWF0cml4X3JhbmsoCisgICAgICAgIGNvbnRyb2xhYmlsaXR5KQorCisgICAgcV9wb3MgPSAwLjAyCisgICAgcV92ZWwgPSAwLjMwMAorICAgIHFfcG9zX2RpZmYgPSAwLjAwNQorICAgIHFfdmVsX2RpZmYgPSAwLjEzCisgICAgc2VsZi5RID0gbnVtcHkubWF0cml4KFtbKDEuMCAvIChxX3BvcyAqKiAyLjApKSwgMC4wLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAoMS4wIC8gKHFfdmVsICoqIDIuMCkpLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsICgxLjAgLyAocV9wb3NfZGlmZiAqKiAyLjApKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMC4wLCAoMS4wIC8gKHFfdmVsX2RpZmYgKiogMi4wKSldXSkKKworICAgIHNlbGYuUiA9IG51bXB5Lm1hdHJpeChbWygxLjAgLyAoMTIuMCAqKiAyLjApKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDEuMCAvICgxMi4wICoqIDIuMCldXSkKKyAgICBzZWxmLksgPSBjb250cm9scy5kbHFyKHNlbGYuQSwgc2VsZi5CLCBzZWxmLlEsIHNlbGYuUikKKyAgICBwcmludCAnQ29udHJvbGxlcicKKyAgICBwcmludCBzZWxmLksKKworICAgIHByaW50ICdDb250cm9sbGVyIFBvbGVzJworICAgIHByaW50IG51bXB5LmxpbmFsZy5laWcoc2VsZi5BIC0gc2VsZi5CICogc2VsZi5LKVswXQorCisgICAgc2VsZi5ycGwgPSAwLjIwCisgICAgc2VsZi5pcGwgPSAwLjA1CisgICAgc2VsZi5QbGFjZU9ic2VydmVyUG9sZXMoW3NlbGYucnBsICsgMWogKiBzZWxmLmlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGwgKyAxaiAqIHNlbGYuaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbCAtIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsIC0gMWogKiBzZWxmLmlwbF0pCisKKyAgICAjIFRoZSBib3ggZm9ybWVkIGJ5IFVfbWluIGFuZCBVX21heCBtdXN0IGVuY29tcGFzcyBhbGwgcG9zc2libGUgdmFsdWVzLAorICAgICMgb3IgZWxzZSBBdXN0aW4ncyBjb2RlIGdldHMgYW5ncnkuCisgICAgc2VsZi5VX21heCA9IG51bXB5Lm1hdHJpeChbWzEyLjBdLCBbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoW1stMTIuMF0sIFstMTIuMF1dKQorCisgICAgcHJpbnQgJ09ic2VydmVyIChDb252ZXJ0ZWQgdG8gYSBLRiknLCBudW1weS5saW5hbGcuaW52KHNlbGYuQSkgKiBzZWxmLkwKKworICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworCitjbGFzcyBJbnRlZ3JhbEFybShBcm0pOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iSW50ZWdyYWxBcm0iLCBtYXNzPU5vbmUpOgorICAgIHN1cGVyKEludGVncmFsQXJtLCBzZWxmKS5fX2luaXRfXyhuYW1lPW5hbWUsIG1hc3M9bWFzcykKKworICAgIHNlbGYuQV9jb250aW51b3VzX3VuYXVnbWVudGVkID0gc2VsZi5BX2NvbnRpbnVvdXMKKyAgICBzZWxmLkFfY29udGludW91cyA9IG51bXB5Lm1hdHJpeChudW1weS56ZXJvcygoNSwgNSkpKQorICAgIHNlbGYuQV9jb250aW51b3VzWzA6NCwgMDo0XSA9IHNlbGYuQV9jb250aW51b3VzX3VuYXVnbWVudGVkCisgICAgc2VsZi5BX2NvbnRpbnVvdXNbMSwgNF0gPSBzZWxmLkMyCisKKyAgICAjIFN0YXJ0IHdpdGggdGhlIHVubW9kaWZpZWQgaW5wdXQKKyAgICBzZWxmLkJfY29udGludW91c191bmF1Z21lbnRlZCA9IHNlbGYuQl9jb250aW51b3VzCisgICAgc2VsZi5CX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgobnVtcHkuemVyb3MoKDUsIDIpKSkKKyAgICBzZWxmLkJfY29udGludW91c1swOjQsIDA6Ml0gPSBzZWxmLkJfY29udGludW91c191bmF1Z21lbnRlZAorCisgICAgc2VsZi5DX3VuYXVnbWVudGVkID0gc2VsZi5DCisgICAgc2VsZi5DID0gbnVtcHkubWF0cml4KG51bXB5Lnplcm9zKCgyLCA1KSkpCisgICAgc2VsZi5DWzA6MiwgMDo0XSA9IHNlbGYuQ191bmF1Z21lbnRlZAorCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKAorICAgICAgICBzZWxmLkFfY29udGludW91cywgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisgICAgcHJpbnQgJ0EgY29udCcsIHNlbGYuQV9jb250aW51b3VzCisgICAgcHJpbnQgJ0IgY29udCcsIHNlbGYuQl9jb250aW51b3VzCisgICAgcHJpbnQgJ0EgZGlzY3JldGUnLCBzZWxmLkEKKworICAgIHFfcG9zID0gMC4wOAorICAgIHFfdmVsID0gMC40MAorCisgICAgcV9wb3NfZGlmZiA9IDAuMDgKKyAgICBxX3ZlbF9kaWZmID0gMC40MAorICAgIHFfdm9sdGFnZSA9IDYuMAorICAgIHNlbGYuUSA9IG51bXB5Lm1hdHJpeChbWyhxX3BvcyAqKiAyLjApLCAwLjAsIDAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKHFfdmVsICoqIDIuMCksIDAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAocV9wb3NfZGlmZiAqKiAyLjApLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgKHFfdmVsX2RpZmYgKiogMi4wKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMC4wLCAwLjAsIChxX3ZvbHRhZ2UgKiogMi4wKV1dKQorCisgICAgcl92b2x0cyA9IDAuMDUKKyAgICBzZWxmLlIgPSBudW1weS5tYXRyaXgoW1socl92b2x0cyAqKiAyLjApLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKHJfdm9sdHMgKiogMi4wKV1dKQorCisgICAgc2VsZi5LYWxtYW5HYWluLCBzZWxmLlFfc3RlYWR5ID0gY29udHJvbHMua2FsbWFuKAorICAgICAgICBBPXNlbGYuQSwgQj1zZWxmLkIsIEM9c2VsZi5DLCBRPXNlbGYuUSwgUj1zZWxmLlIpCisKKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KFtbMTIuMF0sIFsxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXSwgWy0xMi4wXV0pCisKKyAgICBzZWxmLktfdW5hdWdtZW50ZWQgPSBzZWxmLksKKyAgICBzZWxmLksgPSBudW1weS5tYXRyaXgobnVtcHkuemVyb3MoKDIsIDUpKSk7CisgICAgc2VsZi5LWzA6MiwgMDo0XSA9IHNlbGYuS191bmF1Z21lbnRlZAorICAgIHNlbGYuS1swLCA0XSA9IDE7CisgICAgc2VsZi5LWzEsIDRdID0gMTsKKyAgICBwcmludCAnS2FsJywgc2VsZi5LYWxtYW5HYWluCisgICAgc2VsZi5MID0gc2VsZi5BICogc2VsZi5LYWxtYW5HYWluCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKKworZGVmIENhcFUoVSk6CisgIGlmIFVbMCwgMF0gLSBVWzEsIDBdID4gMjQ6CisgICAgcmV0dXJuIG51bXB5Lm1hdHJpeChbWzEyXSwgWy0xMl1dKQorICBlbGlmIFVbMCwgMF0gLSBVWzEsIDBdIDwgLTI0OgorICAgIHJldHVybiBudW1weS5tYXRyaXgoW1stMTJdLCBbMTJdXSkKKyAgZWxzZToKKyAgICBtYXhfdSA9IG1heChVWzAsIDBdLCBVWzEsIDBdKQorICAgIG1pbl91ID0gbWluKFVbMCwgMF0sIFVbMSwgMF0pCisgICAgaWYgbWF4X3UgPiAxMjoKKyAgICAgIHJldHVybiBVIC0gKG1heF91IC0gMTIpCisgICAgaWYgbWluX3UgPCAtMTI6CisgICAgICByZXR1cm4gVSAtIChtaW5fdSArIDEyKQorICAgIHJldHVybiBVCisKKworZGVmIHJ1bl90ZXN0KGFybSwgaW5pdGlhbF9YLCBnb2FsLCBtYXhfc2VwYXJhdGlvbl9lcnJvcj0wLjAxLAorICAgICAgICAgICAgIHNob3dfZ3JhcGg9VHJ1ZSwgaXRlcmF0aW9ucz0yMDAsIGNvbnRyb2xsZXJfYXJtPU5vbmUsCisgICAgICAgICAgICAgb2JzZXJ2ZXJfYXJtPU5vbmUpOgorICAiIiJSdW5zIHRoZSBhcm0gcGxhbnQgd2l0aCBhbiBpbml0aWFsIGNvbmRpdGlvbiBhbmQgZ29hbC4KKworICAgIFRoZSB0ZXN0cyB0aGVtc2VsdmVzIGFyZSBub3QgdGVycmlibHkgc29waGlzdGljYXRlZDsgSSBqdXN0IHRlc3QgZm9yCisgICAgd2hldGhlciB0aGUgZ29hbCBoYXMgYmVlbiByZWFjaGVkIGFuZCB3aGV0aGVyIHRoZSBzZXBhcmF0aW9uIGdvZXMKKyAgICBvdXRzaWRlIG9mIHRoZSBpbml0aWFsIGFuZCBnb2FsIHZhbHVlcyBieSBtb3JlIHRoYW4gbWF4X3NlcGFyYXRpb25fZXJyb3IuCisgICAgUHJpbnRzIG91dCBzb21ldGhpbmcgZm9yIGEgZmFpbHVyZSBvZiBlaXRoZXIgY29uZGl0aW9uIGFuZCByZXR1cm5zCisgICAgRmFsc2UgaWYgdGVzdHMgZmFpbC4KKyAgICBBcmdzOgorICAgICAgYXJtOiBhcm0gb2JqZWN0IHRvIHVzZS4KKyAgICAgIGluaXRpYWxfWDogc3RhcnRpbmcgc3RhdGUuCisgICAgICBnb2FsOiBnb2FsIHN0YXRlLgorICAgICAgc2hvd19ncmFwaDogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSBhIGdyYXBoIHNob3dpbmcgdGhlIGNoYW5naW5nCisgICAgICAgICAgIHN0YXRlcyBhbmQgdm9sdGFnZXMuCisgICAgICBpdGVyYXRpb25zOiBOdW1iZXIgb2YgdGltZXN0ZXBzIHRvIHJ1biB0aGUgbW9kZWwgZm9yLgorICAgICAgY29udHJvbGxlcl9hcm06IGFybSBvYmplY3QgdG8gZ2V0IEsgZnJvbSwgb3IgTm9uZSBpZiB3ZSBzaG91bGQKKyAgICAgICAgICB1c2UgYXJtLgorICAgICAgb2JzZXJ2ZXJfYXJtOiBhcm0gb2JqZWN0IHRvIHVzZSBmb3IgdGhlIG9ic2VydmVyLCBvciBOb25lIGlmIHdlIHNob3VsZAorICAgICAgICAgIHVzZSB0aGUgYWN0dWFsIHN0YXRlLgorICAiIiIKKworICBhcm0uWCA9IGluaXRpYWxfWAorCisgIGlmIGNvbnRyb2xsZXJfYXJtIGlzIE5vbmU6CisgICAgY29udHJvbGxlcl9hcm0gPSBhcm0KKworICBpZiBvYnNlcnZlcl9hcm0gaXMgbm90IE5vbmU6CisgICAgb2JzZXJ2ZXJfYXJtLlhfaGF0ID0gaW5pdGlhbF9YICsgMC4wMQorICAgIG9ic2VydmVyX2FybS5YX2hhdCA9IGluaXRpYWxfWAorCisgICMgVmFyaW91cyBsaXN0cyBmb3IgZ3JhcGhpbmcgdGhpbmdzLgorICB0ID0gW10KKyAgeF9hdmcgPSBbXQorICB4X3NlcCA9IFtdCisgIHhfaGF0X2F2ZyA9IFtdCisgIHhfaGF0X3NlcCA9IFtdCisgIHZfYXZnID0gW10KKyAgdl9zZXAgPSBbXQorICB1X2xlZnQgPSBbXQorICB1X3JpZ2h0ID0gW10KKworICBzZXBfcGxvdF9nYWluID0gMTAwLjAKKworICBmb3IgaSBpbiB4cmFuZ2UoaXRlcmF0aW9ucyk6CisgICAgWF9oYXQgPSBhcm0uWAorICAgIGlmIG9ic2VydmVyX2FybSBpcyBub3QgTm9uZToKKyAgICAgIFhfaGF0ID0gb2JzZXJ2ZXJfYXJtLlhfaGF0CisgICAgICB4X2hhdF9hdmcuYXBwZW5kKG9ic2VydmVyX2FybS5YX2hhdFswLCAwXSkKKyAgICAgIHhfaGF0X3NlcC5hcHBlbmQob2JzZXJ2ZXJfYXJtLlhfaGF0WzIsIDBdICogc2VwX3Bsb3RfZ2FpbikKKyAgICBVID0gY29udHJvbGxlcl9hcm0uSyAqIChnb2FsIC0gWF9oYXQpCisgICAgVSA9IENhcFUoVSkKKyAgICB4X2F2Zy5hcHBlbmQoYXJtLlhbMCwgMF0pCisgICAgdl9hdmcuYXBwZW5kKGFybS5YWzEsIDBdKQorICAgIHhfc2VwLmFwcGVuZChhcm0uWFsyLCAwXSAqIHNlcF9wbG90X2dhaW4pCisgICAgdl9zZXAuYXBwZW5kKGFybS5YWzMsIDBdKQorICAgIGlmIG9ic2VydmVyX2FybSBpcyBub3QgTm9uZToKKyAgICAgIG9ic2VydmVyX2FybS5QcmVkaWN0T2JzZXJ2ZXIoVSkKKyAgICBhcm0uVXBkYXRlKFUpCisgICAgaWYgb2JzZXJ2ZXJfYXJtIGlzIG5vdCBOb25lOgorICAgICAgb2JzZXJ2ZXJfYXJtLlkgPSBhcm0uWQorICAgICAgb2JzZXJ2ZXJfYXJtLkNvcnJlY3RPYnNlcnZlcihVKQorCisgICAgdC5hcHBlbmQoaSAqIGFybS5kdCkKKyAgICB1X2xlZnQuYXBwZW5kKFVbMCwgMF0pCisgICAgdV9yaWdodC5hcHBlbmQoVVsxLCAwXSkKKworICBwcmludCBudW1weS5saW5hbGcuaW52KGFybS5BKQorICBwcmludCAiZGVsdGEgdGltZSBpcyAiLCBhcm0uZHQKKyAgcHJpbnQgIlZlbG9jaXR5IGF0IHQ9MCBpcyAiLCB4X2F2Z1swXSwgdl9hdmdbMF0sIHhfc2VwWzBdLCB2X3NlcFswXQorICBwcmludCAiVmVsb2NpdHkgYXQgdD0xK2R0IGlzICIsIHhfYXZnWzFdLCB2X2F2Z1sxXSwgeF9zZXBbMV0sIHZfc2VwWzFdCisKKyAgaWYgc2hvd19ncmFwaDoKKyAgICBweWxhYi5zdWJwbG90KDIsIDEsIDEpCisgICAgcHlsYWIucGxvdCh0LCB4X2F2ZywgbGFiZWw9J3ggYXZnJykKKyAgICBweWxhYi5wbG90KHQsIHhfc2VwLCBsYWJlbD0neCBzZXAnKQorICAgIGlmIG9ic2VydmVyX2FybSBpcyBub3QgTm9uZToKKyAgICAgIHB5bGFiLnBsb3QodCwgeF9oYXRfYXZnLCBsYWJlbD0neF9oYXQgYXZnJykKKyAgICAgIHB5bGFiLnBsb3QodCwgeF9oYXRfc2VwLCBsYWJlbD0neF9oYXQgc2VwJykKKyAgICBweWxhYi5sZWdlbmQoKQorCisgICAgcHlsYWIuc3VicGxvdCgyLCAxLCAyKQorICAgIHB5bGFiLnBsb3QodCwgdV9sZWZ0LCBsYWJlbD0ndSBsZWZ0JykKKyAgICBweWxhYi5wbG90KHQsIHVfcmlnaHQsIGxhYmVsPSd1IHJpZ2h0JykKKyAgICBweWxhYi5sZWdlbmQoKQorICAgIHB5bGFiLnNob3coKQorCisKK2RlZiBydW5faW50ZWdyYWxfdGVzdChhcm0sIGluaXRpYWxfWCwgZ29hbCwgb2JzZXJ2ZXJfYXJtLCBkaXN0dXJiYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBtYXhfc2VwYXJhdGlvbl9lcnJvcj0wLjAxLCBzaG93X2dyYXBoPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9ucz00MDApOgorICAiIiJSdW5zIHRoZSBpbnRlZ3JhbCBjb250cm9sIGFybSBwbGFudCB3aXRoIGFuIGluaXRpYWwgY29uZGl0aW9uIGFuZCBnb2FsLgorCisgICAgVGhlIHRlc3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCB0ZXJyaWJseSBzb3BoaXN0aWNhdGVkOyBJIGp1c3QgdGVzdCBmb3IKKyAgICB3aGV0aGVyIHRoZSBnb2FsIGhhcyBiZWVuIHJlYWNoZWQgYW5kIHdoZXRoZXIgdGhlIHNlcGFyYXRpb24gZ29lcworICAgIG91dHNpZGUgb2YgdGhlIGluaXRpYWwgYW5kIGdvYWwgdmFsdWVzIGJ5IG1vcmUgdGhhbiBtYXhfc2VwYXJhdGlvbl9lcnJvci4KKyAgICBQcmludHMgb3V0IHNvbWV0aGluZyBmb3IgYSBmYWlsdXJlIG9mIGVpdGhlciBjb25kaXRpb24gYW5kIHJldHVybnMKKyAgICBGYWxzZSBpZiB0ZXN0cyBmYWlsLgorICAgIEFyZ3M6CisgICAgICBhcm06IGFybSBvYmplY3QgdG8gdXNlLgorICAgICAgaW5pdGlhbF9YOiBzdGFydGluZyBzdGF0ZS4KKyAgICAgIGdvYWw6IGdvYWwgc3RhdGUuCisgICAgICBvYnNlcnZlcl9hcm06IGFybSBvYmplY3QgdG8gdXNlIGZvciB0aGUgb2JzZXJ2ZXIuCisgICAgICBzaG93X2dyYXBoOiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IGEgZ3JhcGggc2hvd2luZyB0aGUgY2hhbmdpbmcKKyAgICAgICAgICAgc3RhdGVzIGFuZCB2b2x0YWdlcy4KKyAgICAgIGl0ZXJhdGlvbnM6IE51bWJlciBvZiB0aW1lc3RlcHMgdG8gcnVuIHRoZSBtb2RlbCBmb3IuCisgICAgICBkaXN0dXJiYW5jZTogVm9sdGFnZSBtaXNzbWF0Y2ggYmV0d2VlbiBjb250cm9sbGVyIGFuZCBtb2RlbC4KKyAgIiIiCisKKyAgYXJtLlggPSBpbml0aWFsX1gKKworICAjIFZhcmlvdXMgbGlzdHMgZm9yIGdyYXBoaW5nIHRoaW5ncy4KKyAgdCA9IFtdCisgIHhfYXZnID0gW10KKyAgeF9zZXAgPSBbXQorICB4X2hhdF9hdmcgPSBbXQorICB4X2hhdF9zZXAgPSBbXQorICB2X2F2ZyA9IFtdCisgIHZfc2VwID0gW10KKyAgdV9sZWZ0ID0gW10KKyAgdV9yaWdodCA9IFtdCisgIHVfZXJyb3IgPSBbXQorCisgIHNlcF9wbG90X2dhaW4gPSAxMDAuMAorCisgIHVuYXVnbWVudGVkX2dvYWwgPSBnb2FsCisgIGdvYWwgPSBudW1weS5tYXRyaXgobnVtcHkuemVyb3MoKDUsIDEpKSkKKyAgZ29hbFswOjQsIDBdID0gdW5hdWdtZW50ZWRfZ29hbAorCisgIGZvciBpIGluIHhyYW5nZShpdGVyYXRpb25zKToKKyAgICBYX2hhdCA9IG9ic2VydmVyX2FybS5YX2hhdFswOjRdCisKKyAgICB4X2hhdF9hdmcuYXBwZW5kKG9ic2VydmVyX2FybS5YX2hhdFswLCAwXSkKKyAgICB4X2hhdF9zZXAuYXBwZW5kKG9ic2VydmVyX2FybS5YX2hhdFsyLCAwXSAqIHNlcF9wbG90X2dhaW4pCisKKyAgICBVID0gb2JzZXJ2ZXJfYXJtLksgKiAoZ29hbCAtIG9ic2VydmVyX2FybS5YX2hhdCkKKyAgICB1X2Vycm9yLmFwcGVuZChvYnNlcnZlcl9hcm0uWF9oYXRbNCwwXSkKKyAgICBVID0gQ2FwVShVKQorICAgIHhfYXZnLmFwcGVuZChhcm0uWFswLCAwXSkKKyAgICB2X2F2Zy5hcHBlbmQoYXJtLlhbMSwgMF0pCisgICAgeF9zZXAuYXBwZW5kKGFybS5YWzIsIDBdICogc2VwX3Bsb3RfZ2FpbikKKyAgICB2X3NlcC5hcHBlbmQoYXJtLlhbMywgMF0pCisKKyAgICBvYnNlcnZlcl9hcm0uUHJlZGljdE9ic2VydmVyKFUpCisKKyAgICBhcm0uVXBkYXRlKFUgKyBkaXN0dXJiYW5jZSkKKyAgICBvYnNlcnZlcl9hcm0uWSA9IGFybS5ZCisgICAgb2JzZXJ2ZXJfYXJtLkNvcnJlY3RPYnNlcnZlcihVKQorCisgICAgdC5hcHBlbmQoaSAqIGFybS5kdCkKKyAgICB1X2xlZnQuYXBwZW5kKFVbMCwgMF0pCisgICAgdV9yaWdodC5hcHBlbmQoVVsxLCAwXSkKKworICBwcmludCAnRW5kIGlzJywgb2JzZXJ2ZXJfYXJtLlhfaGF0WzQsIDBdCisKKyAgaWYgc2hvd19ncmFwaDoKKyAgICBweWxhYi5zdWJwbG90KDIsIDEsIDEpCisgICAgcHlsYWIucGxvdCh0LCB4X2F2ZywgbGFiZWw9J3ggYXZnJykKKyAgICBweWxhYi5wbG90KHQsIHhfc2VwLCBsYWJlbD0neCBzZXAnKQorICAgIGlmIG9ic2VydmVyX2FybSBpcyBub3QgTm9uZToKKyAgICAgIHB5bGFiLnBsb3QodCwgeF9oYXRfYXZnLCBsYWJlbD0neF9oYXQgYXZnJykKKyAgICAgIHB5bGFiLnBsb3QodCwgeF9oYXRfc2VwLCBsYWJlbD0neF9oYXQgc2VwJykKKyAgICBweWxhYi5sZWdlbmQoKQorCisgICAgcHlsYWIuc3VicGxvdCgyLCAxLCAyKQorICAgIHB5bGFiLnBsb3QodCwgdV9sZWZ0LCBsYWJlbD0ndSBsZWZ0JykKKyAgICBweWxhYi5wbG90KHQsIHVfcmlnaHQsIGxhYmVsPSd1IHJpZ2h0JykKKyAgICBweWxhYi5wbG90KHQsIHVfZXJyb3IsIGxhYmVsPSd1IGVycm9yJykKKyAgICBweWxhYi5sZWdlbmQoKQorICAgIHB5bGFiLnNob3coKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICBsb2FkZWRfbWFzcyA9IDI1CisgICNsb2FkZWRfbWFzcyA9IDAKKyAgYXJtID0gQXJtKG1hc3M9MTMgKyBsb2FkZWRfbWFzcykKKyAgI2FybV9jb250cm9sbGVyID0gQXJtKG1hc3M9MTMgKyAxNSkKKyAgI29ic2VydmVyX2FybSA9IEFybShtYXNzPTEzICsgMTUpCisgICNvYnNlcnZlcl9hcm0gPSBOb25lCisKKyAgaW50ZWdyYWxfYXJtID0gSW50ZWdyYWxBcm0obWFzcz0xMyArIGxvYWRlZF9tYXNzKQorICBpbnRlZ3JhbF9hcm0uWF9oYXRbMCwgMF0gKz0gMC4wMgorICBpbnRlZ3JhbF9hcm0uWF9oYXRbMiwgMF0gKz0gMC4wMgorICBpbnRlZ3JhbF9hcm0uWF9oYXRbNF0gPSAwCisKKyAgIyBUZXN0IG1vdmluZyB0aGUgYXJtIHdpdGggY29uc3RhbnQgc2VwYXJhdGlvbi4KKyAgaW5pdGlhbF9YID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFswLjBdLCBbMC4wXV0pCisgIFIgPSBudW1weS5tYXRyaXgoW1swLjBdLCBbMC4wXSwgWzAuMF0sIFswLjBdXSkKKyAgcnVuX2ludGVncmFsX3Rlc3QoYXJtLCBpbml0aWFsX1gsIFIsIGludGVncmFsX2FybSwgZGlzdHVyYmFuY2U9MikKKworICAjIFdyaXRlIHRoZSBnZW5lcmF0ZWQgY29uc3RhbnRzIG91dCB0byBhIGZpbGUuCisgIGlmIGxlbihhcmd2KSAhPSA1OgorICAgIHByaW50ICJFeHBlY3RlZCAuaCBmaWxlIG5hbWUgYW5kIC5jYyBmaWxlIG5hbWUgZm9yIHRoZSBhcm0gYW5kIGF1Z21lbnRlZCBhcm0uIgorICBlbHNlOgorICAgIGFybSA9IEFybSgiQXJtIiwgbWFzcz0xMykKKyAgICBsb29wX3dyaXRlciA9IGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcFdyaXRlcigiQXJtIiwgW2FybV0pCisgICAgaWYgYXJndlsxXVstMzpdID09ICcuY2MnOgorICAgICAgbG9vcF93cml0ZXIuV3JpdGUoYXJndlsyXSwgYXJndlsxXSkKKyAgICBlbHNlOgorICAgICAgbG9vcF93cml0ZXIuV3JpdGUoYXJndlsxXSwgYXJndlsyXSkKKworICAgIGludGVncmFsX2FybSA9IEludGVncmFsQXJtKCJJbnRlZ3JhbEFybSIsIG1hc3M9MTMpCisgICAgbG9vcF93cml0ZXIgPSBjb250cm9sX2xvb3AuQ29udHJvbExvb3BXcml0ZXIoIkludGVncmFsQXJtIiwgW2ludGVncmFsX2FybV0pCisgICAgaWYgYXJndlszXVstMzpdID09ICcuY2MnOgorICAgICAgbG9vcF93cml0ZXIuV3JpdGUoYXJndls0XSwgYXJndlszXSkKKyAgICBlbHNlOgorICAgICAgbG9vcF93cml0ZXIuV3JpdGUoYXJndlszXSwgYXJndls0XSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL3B5dGhvbi9jbGF3LnB5IGIveTIwMTQvY29udHJvbF9sb29wcy9weXRob24vY2xhdy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWVhNmExCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9weXRob24vY2xhdy5weQpAQCAtMCwwICsxLDQ5MSBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IGNvbnRyb2xfbG9vcAoraW1wb3J0IGNvbnRyb2xzCitpbXBvcnQgcG9seXRvcGUKK2ltcG9ydCBwb2x5ZHJpdmV0cmFpbgoraW1wb3J0IG51bXB5CitpbXBvcnQgc3lzCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCisKK2NsYXNzIENsYXcoY29udHJvbF9sb29wLkNvbnRyb2xMb29wKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IlJhd0NsYXciKToKKyAgICBzdXBlcihDbGF3LCBzZWxmKS5fX2luaXRfXyhuYW1lKQorICAgICMgU3RhbGwgVG9ycXVlIGluIE4gbQorICAgIHNlbGYuc3RhbGxfdG9ycXVlID0gMi40MgorICAgICMgU3RhbGwgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5zdGFsbF9jdXJyZW50ID0gMTMzCisgICAgIyBGcmVlIFNwZWVkIGluIFJQTQorICAgIHNlbGYuZnJlZV9zcGVlZCA9IDU1MDAuMAorICAgICMgRnJlZSBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLmZyZWVfY3VycmVudCA9IDIuNworICAgICMgTW9tZW50IG9mIGluZXJ0aWEgb2YgdGhlIGNsYXcgaW4ga2cgbV4yCisgICAgc2VsZi5KX3RvcCA9IDIuOAorICAgIHNlbGYuSl9ib3R0b20gPSAzLjAKKworICAgICMgUmVzaXN0YW5jZSBvZiB0aGUgbW90b3IKKyAgICBzZWxmLlIgPSAxMi4wIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBNb3RvciB2ZWxvY2l0eSBjb25zdGFudAorICAgIHNlbGYuS3YgPSAoKHNlbGYuZnJlZV9zcGVlZCAvIDYwLjAgKiAyLjAgKiBudW1weS5waSkgLworICAgICAgICAgICAgICAgKDEzLjUgLSBzZWxmLlIgKiBzZWxmLmZyZWVfY3VycmVudCkpCisgICAgIyBUb3JxdWUgY29uc3RhbnQKKyAgICBzZWxmLkt0ID0gc2VsZi5zdGFsbF90b3JxdWUgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIEdlYXIgcmF0aW8KKyAgICBzZWxmLkcgPSAxNC4wIC8gNDguMCAqIDE4LjAgLyAzMi4wICogMTguMCAvIDY2LjAgKiAxMi4wIC8gNjAuMAorICAgICMgQ29udHJvbCBsb29wIHRpbWUgc3RlcAorICAgIHNlbGYuZHQgPSAwLjAxCisKKyAgICAjIFN0YXRlIGlzIFtib3R0b20gcG9zaXRpb24sIGJvdHRvbSB2ZWxvY2l0eSwgdG9wIC0gYm90dG9tIHBvc2l0aW9uLAorICAgICMgICAgICAgICAgIHRvcCAtIGJvdHRvbSB2ZWxvY2l0eV0KKyAgICAjIElucHV0IGlzIFtib3R0b20gcG93ZXIsIHRvcCBwb3dlciAtIGJvdHRvbSBwb3dlciAqIEpfdG9wIC8gSl9ib3R0b21dCisgICAgIyBNb3RvciB0aW1lIGNvbnN0YW50cy4gZGlmZmVyZW5jZV9ib3R0b20gcmVmZXJzIHRvIHRoZSBjb25zdGFudCBmb3IgaG93IHRoZQorICAgICMgYm90dG9tIHZlbG9jaXR5IGFmZmVjdHMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHRvcCBhbmQgYm90dG9tIHZlbG9jaXRpZXMuCisgICAgc2VsZi5jb21tb25fbW90b3JfY29uc3RhbnQgPSAtc2VsZi5LdCAvIHNlbGYuS3YgLyAoc2VsZi5HICogc2VsZi5HICogc2VsZi5SKQorICAgIHNlbGYuYm90dG9tX2JvdHRvbSA9IHNlbGYuY29tbW9uX21vdG9yX2NvbnN0YW50IC8gc2VsZi5KX2JvdHRvbQorICAgIHNlbGYuZGlmZmVyZW5jZV9ib3R0b20gPSAtc2VsZi5jb21tb25fbW90b3JfY29uc3RhbnQgKiAoMSAvIHNlbGYuSl9ib3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIC8gc2VsZi5KX3RvcCkKKyAgICBzZWxmLmRpZmZlcmVuY2VfZGlmZmVyZW5jZSA9IHNlbGYuY29tbW9uX21vdG9yX2NvbnN0YW50IC8gc2VsZi5KX3RvcAorICAgICMgU3RhdGUgZmVlZGJhY2sgbWF0cmljZXMKKworICAgIHNlbGYuQV9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDAsIDEsIDBdLAorICAgICAgICAgWzAsIDAsIDAsIDFdLAorICAgICAgICAgWzAsIDAsIHNlbGYuYm90dG9tX2JvdHRvbSwgMF0sCisgICAgICAgICBbMCwgMCwgc2VsZi5kaWZmZXJlbmNlX2JvdHRvbSwgc2VsZi5kaWZmZXJlbmNlX2RpZmZlcmVuY2VdXSkKKworICAgIHNlbGYuQV9ib3R0b21fY29udCA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLCAxXSwKKyAgICAgICAgIFswLCBzZWxmLmJvdHRvbV9ib3R0b21dXSkKKworICAgIHNlbGYuQV9kaWZmX2NvbnQgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMV0sCisgICAgICAgICBbMCwgc2VsZi5kaWZmZXJlbmNlX2RpZmZlcmVuY2VdXSkKKworICAgIHNlbGYubW90b3JfZmVlZGZvcndhcmQgPSBzZWxmLkt0IC8gKHNlbGYuRyAqIHNlbGYuUikKKyAgICBzZWxmLm1vdG9yX2ZlZWRmb3J3YXJkX2JvdHRvbSA9IHNlbGYubW90b3JfZmVlZGZvcndhcmQgLyBzZWxmLkpfYm90dG9tCisgICAgc2VsZi5tb3Rvcl9mZWVkZm9yd2FyZF9kaWZmZXJlbmNlID0gc2VsZi5tb3Rvcl9mZWVkZm9yd2FyZCAvIHNlbGYuSl90b3AKKyAgICBzZWxmLm1vdG9yX2ZlZWRmb3J3YXJkX2RpZmZlcmVuY2VfYm90dG9tID0gKAorICAgICAgICBzZWxmLm1vdG9yX2ZlZWRmb3J3YXJkICogKDEgLyBzZWxmLkpfYm90dG9tIC0gMSAvIHNlbGYuSl90b3ApKQorICAgIHNlbGYuQl9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDBdLAorICAgICAgICAgWzAsIDBdLAorICAgICAgICAgW3NlbGYubW90b3JfZmVlZGZvcndhcmRfYm90dG9tLCAwXSwKKyAgICAgICAgIFstc2VsZi5tb3Rvcl9mZWVkZm9yd2FyZF9ib3R0b20sIHNlbGYubW90b3JfZmVlZGZvcndhcmRfZGlmZmVyZW5jZV1dKQorCisgICAgcHJpbnQgIkNvbnQgWF9zcyIsIHNlbGYubW90b3JfZmVlZGZvcndhcmQgLyAtc2VsZi5jb21tb25fbW90b3JfY29uc3RhbnQKKworICAgIHNlbGYuQl9ib3R0b21fY29udCA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swXSwKKyAgICAgICAgIFtzZWxmLm1vdG9yX2ZlZWRmb3J3YXJkX2JvdHRvbV1dKQorCisgICAgc2VsZi5CX2RpZmZfY29udCA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swXSwKKyAgICAgICAgIFtzZWxmLm1vdG9yX2ZlZWRmb3J3YXJkX2RpZmZlcmVuY2VdXSkKKworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEsIDAsIDAsIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDEsIDAsIDBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwXV0pCisKKyAgICBzZWxmLkEsIHNlbGYuQiA9IHNlbGYuQ29udGludW91c1RvRGlzY3JldGUoCisgICAgICAgIHNlbGYuQV9jb250aW51b3VzLCBzZWxmLkJfY29udGludW91cywgc2VsZi5kdCkKKworICAgIHNlbGYuQV9ib3R0b20sIHNlbGYuQl9ib3R0b20gPSBjb250cm9scy5jMmQoCisgICAgICAgIHNlbGYuQV9ib3R0b21fY29udCwgc2VsZi5CX2JvdHRvbV9jb250LCBzZWxmLmR0KQorICAgIHNlbGYuQV9kaWZmLCBzZWxmLkJfZGlmZiA9IGNvbnRyb2xzLmMyZCgKKyAgICAgICAgc2VsZi5BX2RpZmZfY29udCwgc2VsZi5CX2RpZmZfY29udCwgc2VsZi5kdCkKKworICAgIHNlbGYuS19ib3R0b20gPSBjb250cm9scy5kcGxhY2Uoc2VsZi5BX2JvdHRvbSwgc2VsZi5CX2JvdHRvbSwgWy43NSArIDAuMWosIC43NSAtIDAuMWpdKQorICAgIHNlbGYuS19kaWZmID0gY29udHJvbHMuZHBsYWNlKHNlbGYuQV9kaWZmLCBzZWxmLkJfZGlmZiwgWy43NSArIDAuMWosIC43NSAtIDAuMWpdKQorCisgICAgcHJpbnQgIktfZGlmZiIsIHNlbGYuS19kaWZmCisgICAgcHJpbnQgIktfYm90dG9tIiwgc2VsZi5LX2JvdHRvbQorCisgICAgcHJpbnQgIkEiCisgICAgcHJpbnQgc2VsZi5BCisgICAgcHJpbnQgIkIiCisgICAgcHJpbnQgc2VsZi5CCisKKyAgICAKKyAgICBzZWxmLlEgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKDAuMTAgKiogMi4wKSksIDAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKDEuMCAvICgwLjA2ICoqIDIuMCkpLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMTAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgMC4xXV0pCisKKyAgICBzZWxmLlIgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKDQwLjAgKiogMi4wKSksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAoMS4wIC8gKDUuMCAqKiAyLjApKV1dKQorICAgICNzZWxmLksgPSBjb250cm9scy5kbHFyKHNlbGYuQSwgc2VsZi5CLCBzZWxmLlEsIHNlbGYuUikKKworICAgIHNlbGYuSyA9IG51bXB5Lm1hdHJpeChbW3NlbGYuS19ib3R0b21bMCwgMF0sIDAuMCwgc2VsZi5LX2JvdHRvbVswLCAxXSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIHNlbGYuS19kaWZmWzAsIDBdLCAwLjAsIHNlbGYuS19kaWZmWzAsIDFdXV0pCisKKyAgICAjIENvbXB1dGUgdGhlIGZlZWQgZm9yd2FyZHMgYWNlbGVyYXRpb24gdGVybS4KKyAgICBzZWxmLktbMSwgMF0gPSAtc2VsZi5CWzEsIDBdICogc2VsZi5LWzAsIDBdIC8gc2VsZi5CWzEsIDFdCisKKyAgICBsc3RzcV9BID0gbnVtcHkuaWRlbnRpdHkoMikKKyAgICBsc3RzcV9BWzAsIDpdID0gc2VsZi5CWzEsIDpdCisgICAgbHN0c3FfQVsxLCA6XSA9IHNlbGYuQlszLCA6XQorICAgIHByaW50ICJTeXN0ZW0gb2YgRXF1YXRpb25zIGNvZWZmaWNpZW50czoiCisgICAgcHJpbnQgbHN0c3FfQQorICAgIHByaW50ICJkZXQiLCBudW1weS5saW5hbGcuZGV0KGxzdHNxX0EpCisKKyAgICBvdXRfeCA9IG51bXB5LmxpbmFsZy5sc3RzcSgKKyAgICAgICAgICAgICAgICAgICAgICAgICBsc3RzcV9BLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bXB5Lm1hdHJpeChbW3NlbGYuQVsxLCAyXV0sIFtzZWxmLkFbMywgMl1dXSkpWzBdCisgICAgc2VsZi5LWzEsIDJdID0gLWxzdHNxX0FbMCwgMF0gKiAoc2VsZi5LWzAsIDJdIC0gb3V0X3hbMF0pIC8gbHN0c3FfQVswLCAxXSArIG91dF94WzFdCisKKyAgICBwcmludCAiSyB1bmF1Z21lbnRlZCIKKyAgICBwcmludCBzZWxmLksKKyAgICBwcmludCAiQiAqIEsgdW5hdWdtZW50ZWQiCisgICAgcHJpbnQgc2VsZi5CICogc2VsZi5LCisgICAgRiA9IHNlbGYuQSAtIHNlbGYuQiAqIHNlbGYuSworICAgIHByaW50ICJBIC0gQiAqIEsgdW5hdWdtZW50ZWQiCisgICAgcHJpbnQgRgorICAgIHByaW50ICJlaWdlbnZhbHVlcyIKKyAgICBwcmludCBudW1weS5saW5hbGcuZWlnKEYpWzBdCisKKyAgICBzZWxmLnJwbCA9IC4wNQorICAgIHNlbGYuaXBsID0gMC4wMTAKKyAgICBzZWxmLlBsYWNlT2JzZXJ2ZXJQb2xlcyhbc2VsZi5ycGwgKyAxaiAqIHNlbGYuaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbCArIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsIC0gMWogKiBzZWxmLmlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGwgLSAxaiAqIHNlbGYuaXBsXSkKKworICAgICMgVGhlIGJveCBmb3JtZWQgYnkgVV9taW4gYW5kIFVfbWF4IG11c3QgZW5jb21wYXNzIGFsbCBwb3NzaWJsZSB2YWx1ZXMsCisgICAgIyBvciBlbHNlIEF1c3RpbidzIGNvZGUgZ2V0cyBhbmdyeS4KKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KFtbMTIuMF0sIFsxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXSwgWy0xMi4wXV0pCisKKyAgICAjIEZvciB0aGUgdGVzdHMgdGhhdCBjaGVjayB0aGUgbGltaXRzLCB0aGVzZSBhcmUgKHVwcGVyLCBsb3dlcikgZm9yIGJvdGgKKyAgICAjIGNsYXdzLgorICAgIHNlbGYuaGFyZF9wb3NfbGltaXRzID0gTm9uZQorICAgIHNlbGYucG9zX2xpbWl0cyA9IE5vbmUKKworICAgICMgQ29tcHV0ZSB0aGUgc3RlYWR5IHN0YXRlIHZlbG9jaXRpZXMgZm9yIGEgZ2l2ZW4gYXBwbGllZCB2b2x0YWdlLgorICAgICMgVGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBjbGF3IHNob3VsZCBzcGluIGF0IHRoZSBzYW1lIHJhdGUgaWYgdGhlCisgICAgIyBwaHlzaWNzIGlzIHJpZ2h0LgorICAgIFhfc3MgPSBudW1weS5tYXRyaXgoW1swXSwgWzBdLCBbMC4wXSwgWzBdXSkKKyAgICAKKyAgICBVID0gbnVtcHkubWF0cml4KFtbMS4wXSxbMS4wXV0pCisgICAgQSA9IHNlbGYuQQorICAgIEIgPSBzZWxmLkIKKyAgICAjWF9zc1syLCAwXSA9IFhfc3NbMiwgMF0gKiBBWzIsIDJdICsgQlsyLCAwXSAqIFVbMCwgMF0KKyAgICBYX3NzWzIsIDBdID0gMSAvICgxIC0gQVsyLCAyXSkgKiBCWzIsIDBdICogVVswLCAwXQorICAgICNYX3NzWzMsIDBdID0gWF9zc1szLCAwXSAqIEFbMywgM10gKyBYX3NzWzIsIDBdICogQVszLCAyXSArIEJbMywgMF0gKiBVWzAsIDBdICsgQlszLCAxXSAqIFVbMSwgMF0KKyAgICAjWF9zc1szLCAwXSAqICgxIC0gQVszLCAzXSkgPSBYX3NzWzIsIDBdICogQVszLCAyXSArIEJbMywgMF0gKiBVWzAsIDBdICsgQlszLCAxXSAqIFVbMSwgMF0KKyAgICBYX3NzWzMsIDBdID0gMSAvICgxIC0gQVszLCAzXSkgKiAoWF9zc1syLCAwXSAqIEFbMywgMl0gKyBCWzMsIDFdICogVVsxLCAwXSArIEJbMywgMF0gKiBVWzAsIDBdKQorICAgICNYX3NzWzMsIDBdID0gMSAvICgxIC0gQVszLCAzXSkgLyAoMSAtIEFbMiwgMl0pICogQlsyLCAwXSAqIFVbMCwgMF0gKiBBWzMsIDJdICsgQlszLCAwXSAqIFVbMCwgMF0gKyBCWzMsIDFdICogVVsxLCAwXQorICAgIFhfc3NbMCwgMF0gPSBBWzAsIDJdICogWF9zc1syLCAwXSArIEJbMCwgMF0gKiBVWzAsIDBdCisgICAgWF9zc1sxLCAwXSA9IEFbMSwgMl0gKiBYX3NzWzIsIDBdICsgQVsxLCAzXSAqIFhfc3NbMywgMF0gKyBCWzEsIDBdICogVVswLCAwXSArIEJbMSwgMV0gKiBVWzEsIDBdCisKKyAgICBwcmludCAiWF9zcyIsIFhfc3MKKworICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworCitjbGFzcyBDbGF3RGVsdGFVKENsYXcpOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iQ2xhdyIpOgorICAgIHN1cGVyKENsYXdEZWx0YVUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCisgICAgQV91bmF1Z21lbnRlZCA9IHNlbGYuQQorICAgIEJfdW5hdWdtZW50ZWQgPSBzZWxmLkIKKyAgICBDX3VuYXVnbWVudGVkID0gc2VsZi5DCisKKyAgICBzZWxmLkEgPSBudW1weS5tYXRyaXgoW1swLjAsIDAuMCwgMC4wLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMC4wLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjBdXSkKKyAgICBzZWxmLkFbMDo0LCAwOjRdID0gQV91bmF1Z21lbnRlZAorICAgIHNlbGYuQVswOjQsIDRdID0gQl91bmF1Z21lbnRlZFswOjQsIDBdCisKKyAgICBzZWxmLkIgPSBudW1weS5tYXRyaXgoW1swLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMS4wLCAwLjBdXSkKKyAgICBzZWxmLkJbMDo0LCAxXSA9IEJfdW5hdWdtZW50ZWRbMDo0LCAxXQorCisgICAgc2VsZi5DID0gbnVtcHkuY29uY2F0ZW5hdGUoKENfdW5hdWdtZW50ZWQsIG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXM9MSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjBdXSkKKworICAgICNzZWxmLlBsYWNlQ29udHJvbGxlclBvbGVzKFswLjU1LCAwLjM1LCAwLjU1LCAwLjM1LCAwLjgwXSkKKyAgICBzZWxmLlEgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKDAuMDQgKiogMi4wKSksIDAuMCwgMC4wLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAoMS4wIC8gKDAuMDEgKiogMikpLCAwLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMC4wMSwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAwLjAsIDAuMDgsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgMC4wLCAoMS4wIC8gKDEwLjAgKiogMikpXV0pCisKKyAgICBzZWxmLlIgPSBudW1weS5tYXRyaXgoW1swLjAwMDAwMSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDEuMCAvICgxMC4wICoqIDIuMCldXSkKKyAgICBzZWxmLksgPSBjb250cm9scy5kbHFyKHNlbGYuQSwgc2VsZi5CLCBzZWxmLlEsIHNlbGYuUikKKworICAgIHNlbGYuSyA9IG51bXB5Lm1hdHJpeChbWzUwLjAsIDAuMCwgMTAuMCwgMC4wLCAxLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzUwLjAsIDAuMCwgMTAuMCwgMC4wLCAxLjBdXSkKKyAgICAjc2VsZi5LID0gbnVtcHkubWF0cml4KFtbNTAuMCwgLTEwMC4wLCAwLCAtMTAsIDBdLAorICAgICMgICAgICAgICAgICAgICAgICAgICAgIFs1MC4wLCAgMTAwLjAsIDAsIDEwLCAwXV0pCisKKyAgICBjb250cm9sYWJpbGl0eSA9IGNvbnRyb2xzLmN0cmIoc2VsZi5BLCBzZWxmLkIpOworICAgIHByaW50ICJSYW5rIG9mIGF1Z21lbnRlZCBjb250cm9sYWJpbGl0eSBtYXRyaXguIiwgbnVtcHkubGluYWxnLm1hdHJpeF9yYW5rKGNvbnRyb2xhYmlsaXR5KQorCisgICAgcHJpbnQgIksiCisgICAgcHJpbnQgc2VsZi5LCisgICAgcHJpbnQgIlBsYWNlZCBjb250cm9sbGVyIHBvbGVzIGFyZSIKKyAgICBwcmludCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuQiAqIHNlbGYuSylbMF0KKyAgICBwcmludCBbbnVtcHkuYWJzKHgpIGZvciB4IGluIG51bXB5LmxpbmFsZy5laWcoc2VsZi5BIC0gc2VsZi5CICogc2VsZi5LKVswXV0KKworICAgIHNlbGYucnBsID0gLjA1CisgICAgc2VsZi5pcGwgPSAwLjAwOAorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLnJwbCArIDFqICogc2VsZi5pcGwsIDAuMTAsIDAuMDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsIC0gMWogKiBzZWxmLmlwbCwgMC45MF0pCisgICAgI3ByaW50ICJBIGlzIgorICAgICNwcmludCBzZWxmLkEKKyAgICAjcHJpbnQgIkwgaXMiCisgICAgI3ByaW50IHNlbGYuTAorICAgICNwcmludCAiQyBpcyIKKyAgICAjcHJpbnQgc2VsZi5DCisgICAgI3ByaW50ICJBIC0gTEMgaXMiCisgICAgI3ByaW50IHNlbGYuQSAtIHNlbGYuTCAqIHNlbGYuQworCisgICAgI3ByaW50ICJQbGFjZWQgb2JzZXJ2ZXIgcG9sZXMgYXJlIgorICAgICNwcmludCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuTCAqIHNlbGYuQylbMF0KKworICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXSwgWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KFtbLTEyLjBdLCBbLTEyLjBdXSkKKworICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworZGVmIFNjYWxlVShjbGF3LCBVLCBLLCBlcnJvcik6CisgICIiIkNsaXBzIFUgYXMgbmVjZXNzYXJ5LgorCisgICAgQXJnczoKKyAgICAgIGNsYXc6IGNsYXcgb2JqZWN0IGNvbnRhaW5pbmcgbW9tZW50cyBvZiBpbmVydGlhIGFuZCBVIGxpbWl0cy4KKyAgICAgIFU6IElucHV0IG1hdHJpeCB0byBjbGlwIGFzIG5lY2Vzc2FyeS4KKyAgIiIiCisKKyAgYm90dG9tX3UgPSBVWzAsIDBdCisgIHRvcF91ID0gVVsxLCAwXQorICBwb3NpdGlvbl9lcnJvciA9IGVycm9yWzA6MiwgMF0KKyAgdmVsb2NpdHlfZXJyb3IgPSBlcnJvclsyOiwgMF0KKworICBVX3BvbHkgPSBwb2x5dG9wZS5IUG9seXRvcGUoCisgICAgICBudW1weS5tYXRyaXgoW1sxLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgWy0xLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgWzAsIDFdLAorICAgICAgICAgICAgICAgICAgICBbMCwgLTFdXSksCisgICAgICBudW1weS5tYXRyaXgoW1sxMl0sCisgICAgICAgICAgICAgICAgICAgIFsxMl0sCisgICAgICAgICAgICAgICAgICAgIFsxMl0sCisgICAgICAgICAgICAgICAgICAgIFsxMl1dKSkKKworICBpZiAoYm90dG9tX3UgPiBjbGF3LlVfbWF4WzAsIDBdIG9yIGJvdHRvbV91IDwgY2xhdy5VX21pblswLCAwXSBvcgorICAgICAgdG9wX3UgPiBjbGF3LlVfbWF4WzAsIDBdIG9yIHRvcF91IDwgY2xhdy5VX21pblswLCAwXSk6CisKKyAgICBwb3NpdGlvbl9LID0gS1s6LCAwOjJdCisgICAgdmVsb2NpdHlfSyA9IEtbOiwgMjpdCisKKyAgICAjIEggKiBVIDw9IGsKKyAgICAjIFUgPSBVUG9zICsgVVZlbAorICAgICMgSCAqIChVUG9zICsgVVZlbCkgPD0gaworICAgICMgSCAqIFVQb3MgPD0gayAtIEggKiBVVmVsCisgICAgIworICAgICMgTm93LCB3ZSBjYW4gZG8gYSBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uIGFuZCBzYXkgdGhlIGZvbGxvd2luZy4KKyAgICAjCisgICAgIyBVUG9zID0gcG9zaXRpb25fSyAqIHBvc2l0aW9uX2Vycm9yCisgICAgIyAoSCAqIHBvc2l0aW9uX0spICogcG9zaXRpb25fZXJyb3IgPD0gayAtIEggKiBVVmVsCisgICAgIworICAgICMgQWRkIGluIHRoZSBjb25zdHJhaW50IHRoYXQgMCA8PSB0IDw9IDEKKyAgICAjIE5vdywgdGhlcmUgYXJlIDIgd2F5cyB0aGlzIGNhbiBnby4gIEVpdGhlciB3ZSBoYXZlIGEgcmVnaW9uLCBvciB3ZSBkb24ndAorICAgICMgaGF2ZSBhIHJlZ2lvbi4gIElmIHdlIGhhdmUgYSByZWdpb24sIHRoZW4gcGljayB0aGUgbGFyZ2VzdCB0IGFuZCBnbyBmb3IgaXQuCisgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgcmVnaW9uLCB3ZSBuZWVkIHRvIHBpY2sgYSBnb29kIGNvbXByaW1pc2UuCisKKyAgICBwb3NfcG9seSA9IHBvbHl0b3BlLkhQb2x5dG9wZSgKKyAgICAgICAgVV9wb2x5LkggKiBwb3NpdGlvbl9LLAorICAgICAgICBVX3BvbHkuayAtIFVfcG9seS5IICogdmVsb2NpdHlfSyAqIHZlbG9jaXR5X2Vycm9yKQorCisgICAgIyBUaGUgYWN0dWFsIGFuZ2xlIGZvciB0aGUgbGluZSB3ZSBjYWxsIDQ1LgorICAgIGFuZ2xlXzQ1ID0gbnVtcHkubWF0cml4KFtbbnVtcHkuc3FydCgzKSwgMV1dKQorICAgIGlmIGNsYXcucG9zX2xpbWl0cyBhbmQgY2xhdy5oYXJkX3Bvc19saW1pdHMgYW5kIGNsYXcuWFswLCAwXSArIGNsYXcuWFsxLCAwXSA+IGNsYXcucG9zX2xpbWl0c1sxXToKKyAgICAgIGFuZ2xlXzQ1ID0gbnVtcHkubWF0cml4KFtbMSwgMV1dKQorCisgICAgUCA9IHBvc2l0aW9uX2Vycm9yCisgICAgTDQ1ID0gbnVtcHkubXVsdGlwbHkobnVtcHkubWF0cml4KFtbbnVtcHkuc2lnbihQWzEsIDBdKSwgLW51bXB5LnNpZ24oUFswLCAwXSldXSksIGFuZ2xlXzQ1KQorICAgIGlmIEw0NVswLCAxXSA9PSAwOgorICAgICAgTDQ1WzAsIDFdID0gMQorICAgIGlmIEw0NVswLCAwXSA9PSAwOgorICAgICAgTDQ1WzAsIDBdID0gMQorICAgIHc0NSA9IG51bXB5Lm1hdHJpeChbWzBdXSkKKworICAgIGlmIG51bXB5LmFicyhQWzAsIDBdKSA+IG51bXB5LmFicyhQWzEsIDBdKToKKyAgICAgIExIID0gbnVtcHkubWF0cml4KFtbMCwgMV1dKQorICAgIGVsc2U6CisgICAgICBMSCA9IG51bXB5Lm1hdHJpeChbWzEsIDBdXSkKKyAgICB3aCA9IExIICogUAorICAgIHN0YW5kYXJkID0gbnVtcHkuY29uY2F0ZW5hdGUoKEw0NSwgTEgpKQorICAgIFcgPSBudW1weS5jb25jYXRlbmF0ZSgodzQ1LCB3aCkpCisgICAgaW50ZXJzZWN0aW9uID0gbnVtcHkubGluYWxnLmludihzdGFuZGFyZCkgKiBXCisgICAgYWRqdXN0ZWRfcG9zX2Vycm9yX2gsIGlzX2luc2lkZV9oID0gcG9seWRyaXZldHJhaW4uRG9Db2VyY2VHb2FsKHBvc19wb2x5LAorICAgICAgICBMSCwgd2gsIHBvc2l0aW9uX2Vycm9yKQorICAgIGFkanVzdGVkX3Bvc19lcnJvcl80NSwgaXNfaW5zaWRlXzQ1ID0gcG9seWRyaXZldHJhaW4uRG9Db2VyY2VHb2FsKHBvc19wb2x5LAorICAgICAgICBMNDUsIHc0NSwgaW50ZXJzZWN0aW9uKQorICAgIGlmIHBvc19wb2x5LklzSW5zaWRlKGludGVyc2VjdGlvbik6CisgICAgICBhZGp1c3RlZF9wb3NfZXJyb3IgPSBhZGp1c3RlZF9wb3NfZXJyb3JfaAorICAgIGVsc2U6CisgICAgICBpZiBpc19pbnNpZGVfaDoKKyAgICAgICAgaWYgbnVtcHkubGluYWxnLm5vcm0oYWRqdXN0ZWRfcG9zX2Vycm9yX2gpID4gbnVtcHkubGluYWxnLm5vcm0oYWRqdXN0ZWRfcG9zX2Vycm9yXzQ1KToKKyAgICAgICAgICBhZGp1c3RlZF9wb3NfZXJyb3IgPSBhZGp1c3RlZF9wb3NfZXJyb3JfaAorICAgICAgICBlbHNlOgorICAgICAgICAgIGFkanVzdGVkX3Bvc19lcnJvciA9IGFkanVzdGVkX3Bvc19lcnJvcl80NQorICAgICAgZWxzZToKKyAgICAgICAgYWRqdXN0ZWRfcG9zX2Vycm9yID0gYWRqdXN0ZWRfcG9zX2Vycm9yXzQ1CisgICAgI3ByaW50IGFkanVzdGVkX3Bvc19lcnJvcgorCisgICAgI3ByaW50ICJBY3R1YWwgcG93ZXIgaXMgIiwgdmVsb2NpdHlfSyAqIHZlbG9jaXR5X2Vycm9yICsgcG9zaXRpb25fSyAqIGFkanVzdGVkX3Bvc19lcnJvcgorICAgIHJldHVybiB2ZWxvY2l0eV9LICogdmVsb2NpdHlfZXJyb3IgKyBwb3NpdGlvbl9LICogYWRqdXN0ZWRfcG9zX2Vycm9yCisKKyAgICAjVSA9IEtwb3MgKiBwb3NlcnJvciArIEt2ZWwgKiB2ZWxlcnJvcgorICAgICAgCisgICAgI3NjYWxhciA9IGNsYXcuVV9tYXhbMCwgMF0gLyBtYXgobnVtcHkuYWJzKHRvcF91KSwgbnVtcHkuYWJzKGJvdHRvbV91KSkKKworICAgICN0b3BfdSAqPSBzY2FsYXIKKyAgICAjYm90dG9tX3UgKj0gc2NhbGFyCisKKyAgcmV0dXJuIG51bXB5Lm1hdHJpeChbW2JvdHRvbV91XSwgW3RvcF91XV0pCisKK2RlZiBydW5fdGVzdChjbGF3LCBpbml0aWFsX1gsIGdvYWwsIG1heF9zZXBhcmF0aW9uX2Vycm9yPTAuMDEsIHNob3dfZ3JhcGg9RmFsc2UsIGl0ZXJhdGlvbnM9MjAwKToKKyAgIiIiUnVucyB0aGUgY2xhdyBwbGFudCBvbiBhIGdpdmVuIGNsYXcgKGNsYXcpIHdpdGggYW4gaW5pdGlhbCBjb25kaXRpb24gKGluaXRpYWxfWCkgYW5kIGdvYWwgKGdvYWwpLgorCisgICAgVGhlIHRlc3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCB0ZXJyaWJseSBzb3BoaXN0aWNhdGVkOyBJIGp1c3QgdGVzdCBmb3IgCisgICAgd2hldGhlciB0aGUgZ29hbCBoYXMgYmVlbiByZWFjaGVkIGFuZCB3aGV0aGVyIHRoZSBzZXBhcmF0aW9uIGdvZXMKKyAgICBvdXRzaWRlIG9mIHRoZSBpbml0aWFsIGFuZCBnb2FsIHZhbHVlcyBieSBtb3JlIHRoYW4gbWF4X3NlcGFyYXRpb25fZXJyb3IuCisgICAgUHJpbnRzIG91dCBzb21ldGhpbmcgZm9yIGEgZmFpbHVyZSBvZiBlaXRoZXIgY29uZGl0aW9uIGFuZCByZXR1cm5zCisgICAgRmFsc2UgaWYgdGVzdHMgZmFpbC4KKyAgICBBcmdzOgorICAgICAgY2xhdzogY2xhdyBvYmplY3QgdG8gdXNlLgorICAgICAgaW5pdGlhbF9YOiBzdGFydGluZyBzdGF0ZS4KKyAgICAgIGdvYWw6IGdvYWwgc3RhdGUuCisgICAgICBzaG93X2dyYXBoOiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IGEgZ3JhcGggc2hvd2luZyB0aGUgY2hhbmdpbmcKKyAgICAgICAgICAgc3RhdGVzIGFuZCB2b2x0YWdlcy4KKyAgICAgIGl0ZXJhdGlvbnM6IE51bWJlciBvZiB0aW1lc3RlcHMgdG8gcnVuIHRoZSBtb2RlbCBmb3IuIiIiCisKKyAgY2xhdy5YID0gaW5pdGlhbF9YCisKKyAgIyBWYXJpb3VzIGxpc3RzIGZvciBncmFwaGluZyB0aGluZ3MuCisgIHQgPSBbXQorICB4X2JvdHRvbSA9IFtdCisgIHhfdG9wID0gW10KKyAgdV9ib3R0b20gPSBbXQorICB1X3RvcCA9IFtdCisgIHhfc2VwYXJhdGlvbiA9IFtdCisKKyAgdGVzdHNfcGFzc2VkID0gVHJ1ZQorCisgICMgQm91bmRzIHdoaWNoIHNlcGFyYXRpb24gc2hvdWxkIG5vdCBleGNlZWQuCisgIGxvd2VyX2JvdW5kID0gKGluaXRpYWxfWFsxLCAwXSBpZiBpbml0aWFsX1hbMSwgMF0gPCBnb2FsWzEsIDBdCisgICAgICAgICAgICAgICAgIGVsc2UgZ29hbFsxLCAwXSkgLSBtYXhfc2VwYXJhdGlvbl9lcnJvcgorICB1cHBlcl9ib3VuZCA9IChpbml0aWFsX1hbMSwgMF0gaWYgaW5pdGlhbF9YWzEsIDBdID4gZ29hbFsxLCAwXQorICAgICAgICAgICAgICAgICBlbHNlIGdvYWxbMSwgMF0pICsgbWF4X3NlcGFyYXRpb25fZXJyb3IKKworICBmb3IgaSBpbiB4cmFuZ2UoaXRlcmF0aW9ucyk6CisgICAgVSA9IGNsYXcuSyAqIChnb2FsIC0gY2xhdy5YKQorICAgIFUgPSBTY2FsZVUoY2xhdywgVSwgY2xhdy5LLCBnb2FsIC0gY2xhdy5YKQorICAgIGNsYXcuVXBkYXRlKFUpCisKKyAgICBpZiBjbGF3LlhbMSwgMF0gPiB1cHBlcl9ib3VuZCBvciBjbGF3LlhbMSwgMF0gPCBsb3dlcl9ib3VuZDoKKyAgICAgIHRlc3RzX3Bhc3NlZCA9IEZhbHNlCisgICAgICBwcmludCAiQ2xhdyBzZXBhcmF0aW9uIHdhcyIsIGNsYXcuWFsxLCAwXQorICAgICAgcHJpbnQgIlNob3VsZCBoYXZlIGJlZW4gYmV0d2VlbiIsIGxvd2VyX2JvdW5kLCAiYW5kIiwgdXBwZXJfYm91bmQKKworICAgIGlmIGNsYXcuaGFyZF9wb3NfbGltaXRzIGFuZCBcCisgICAgICAoY2xhdy5YWzAsIDBdID4gY2xhdy5oYXJkX3Bvc19saW1pdHNbMV0gb3IKKyAgICAgICAgICBjbGF3LlhbMCwgMF0gPCBjbGF3LmhhcmRfcG9zX2xpbWl0c1swXSBvcgorICAgICAgICAgIGNsYXcuWFswLCAwXSArIGNsYXcuWFsxLCAwXSA+IGNsYXcuaGFyZF9wb3NfbGltaXRzWzFdIG9yCisgICAgICAgICAgY2xhdy5YWzAsIDBdICsgY2xhdy5YWzEsIDBdIDwgY2xhdy5oYXJkX3Bvc19saW1pdHNbMF0pOgorICAgICAgdGVzdHNfcGFzc2VkID0gRmFsc2UKKyAgICAgIHByaW50ICJDbGF3cyBhdCAlZiBhbmQgJWYiICUgKGNsYXcuWFswLCAwXSwgY2xhdy5YWzAsIDBdICsgY2xhdy5YWzEsIDBdKQorICAgICAgcHJpbnQgIkJvdGggc2hvdWxkIGJlIGluICVzLCBkZWZpbml0ZWx5ICVzIiAlIFwKKyAgICAgICAgICAoY2xhdy5wb3NfbGltaXRzLCBjbGF3LmhhcmRfcG9zX2xpbWl0cykKKworICAgIHQuYXBwZW5kKGkgKiBjbGF3LmR0KQorICAgIHhfYm90dG9tLmFwcGVuZChjbGF3LlhbMCwgMF0gKiAxMC4wKQorICAgIHhfdG9wLmFwcGVuZCgoY2xhdy5YWzEsIDBdICsgY2xhdy5YWzAsIDBdKSAqIDEwLjApCisgICAgdV9ib3R0b20uYXBwZW5kKFVbMCwgMF0pCisgICAgdV90b3AuYXBwZW5kKFVbMSwgMF0pCisgICAgeF9zZXBhcmF0aW9uLmFwcGVuZChjbGF3LlhbMSwgMF0gKiAxMC4wKQorCisgIGlmIHNob3dfZ3JhcGg6CisgICAgcHlsYWIucGxvdCh0LCB4X2JvdHRvbSwgbGFiZWw9J3ggYm90dG9tICogMTAnKQorICAgIHB5bGFiLnBsb3QodCwgeF90b3AsIGxhYmVsPSd4IHRvcCAqIDEwJykKKyAgICBweWxhYi5wbG90KHQsIHVfYm90dG9tLCBsYWJlbD0ndSBib3R0b20nKQorICAgIHB5bGFiLnBsb3QodCwgdV90b3AsIGxhYmVsPSd1IHRvcCcpCisgICAgcHlsYWIucGxvdCh0LCB4X3NlcGFyYXRpb24sIGxhYmVsPSdzZXBhcmF0aW9uICogMTAnKQorICAgIHB5bGFiLmxlZ2VuZCgpCisgICAgcHlsYWIuc2hvdygpCisKKyAgIyBUZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBuZWFyIHRoZSBnb2FsLgorICBpZiBudW1weS5tYXgoYWJzKGNsYXcuWCAtIGdvYWwpKSA+IDFlLTQ6CisgICAgdGVzdHNfcGFzc2VkID0gRmFsc2UKKyAgICBwcmludCAiWCB3YXMiLCBjbGF3LlgsICJFeHBlY3RlZCIsIGdvYWwKKworICByZXR1cm4gdGVzdHNfcGFzc2VkCisKK2RlZiBtYWluKGFyZ3YpOgorICBjbGF3ID0gQ2xhdygpCisKKyAgIyBUZXN0IG1vdmluZyB0aGUgY2xhdyB3aXRoIGNvbnN0YW50IHNlcGFyYXRpb24uCisgIGluaXRpYWxfWCA9IG51bXB5Lm1hdHJpeChbWy0xLjBdLCBbMC4wXSwgWzAuMF0sIFswLjBdXSkKKyAgUiA9IG51bXB5Lm1hdHJpeChbWzEuMF0sIFswLjBdLCBbMC4wXSwgWzAuMF1dKQorICBydW5fdGVzdChjbGF3LCBpbml0aWFsX1gsIFIpCisKKyAgIyBUZXN0IGp1c3QgY2hhbmdpbmcgc2VwYXJhdGlvbi4KKyAgaW5pdGlhbF9YID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFswLjBdLCBbMC4wXV0pCisgIFIgPSBudW1weS5tYXRyaXgoW1swLjBdLCBbMS4wXSwgWzAuMF0sIFswLjBdXSkKKyAgcnVuX3Rlc3QoY2xhdywgaW5pdGlhbF9YLCBSKQorCisgICMgVGVzdCBjaGFuZ2luZyBib3RoIHNlcGFyYXRpb24gYW5kIHBvc2l0aW9uIGF0IG9uY2UuCisgIGluaXRpYWxfWCA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdLCBbMC4wXSwgWzAuMF1dKQorICBSID0gbnVtcHkubWF0cml4KFtbMS4wXSwgWzEuMF0sIFswLjBdLCBbMC4wXV0pCisgIHJ1bl90ZXN0KGNsYXcsIGluaXRpYWxfWCwgUikKKworICAjIFRlc3QgYSBzbWFsbCBzZXBhcmF0aW9uIGVycm9yIGFuZCBhIGxhcmdlIHBvc2l0aW9uIG9uZS4KKyAgaW5pdGlhbF9YID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFswLjBdLCBbMC4wXV0pCisgIFIgPSBudW1weS5tYXRyaXgoW1syLjBdLCBbMC4wNV0sIFswLjBdLCBbMC4wXV0pCisgIHJ1bl90ZXN0KGNsYXcsIGluaXRpYWxfWCwgUikKKworICAjIFRlc3QgYSBzbWFsbCBzZXBhcmF0aW9uIGVycm9yIGFuZCBhIGxhcmdlIHBvc2l0aW9uIG9uZS4KKyAgaW5pdGlhbF9YID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFswLjBdLCBbMC4wXV0pCisgIFIgPSBudW1weS5tYXRyaXgoW1stMC41XSwgWzEuMF0sIFswLjBdLCBbMC4wXV0pCisgIHJ1bl90ZXN0KGNsYXcsIGluaXRpYWxfWCwgUikKKworICAjIFRlc3Qgb3BlbmluZyB3aXRoIHRoZSB0b3AgY2xhdyBhdCB0aGUgbGltaXQuCisgIGluaXRpYWxfWCA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdLCBbMC4wXSwgWzAuMF1dKQorICBSID0gbnVtcHkubWF0cml4KFtbLTEuNV0sIFsxLjVdLCBbMC4wXSwgWzAuMF1dKQorICBjbGF3LmhhcmRfcG9zX2xpbWl0cyA9ICgtMS42LCAwLjEpCisgIGNsYXcucG9zX2xpbWl0cyA9ICgtMS41LCAwLjApCisgIHJ1bl90ZXN0KGNsYXcsIGluaXRpYWxfWCwgUikKKyAgY2xhdy5wb3NfbGltaXRzID0gTm9uZQorCisgICMgVGVzdCBvcGVuaW5nIHdpdGggdGhlIGJvdHRvbSBjbGF3IGF0IHRoZSBsaW1pdC4KKyAgaW5pdGlhbF9YID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFswLjBdLCBbMC4wXV0pCisgIFIgPSBudW1weS5tYXRyaXgoW1swXSwgWzEuNV0sIFswLjBdLCBbMC4wXV0pCisgIGNsYXcuaGFyZF9wb3NfbGltaXRzID0gKC0wLjEsIDEuNikKKyAgY2xhdy5wb3NfbGltaXRzID0gKDAuMCwgMS42KQorICBydW5fdGVzdChjbGF3LCBpbml0aWFsX1gsIFIpCisgIGNsYXcucG9zX2xpbWl0cyA9IE5vbmUKKworICAjIFdyaXRlIHRoZSBnZW5lcmF0ZWQgY29uc3RhbnRzIG91dCB0byBhIGZpbGUuCisgIGlmIGxlbihhcmd2KSAhPSAzOgorICAgIHByaW50ICJFeHBlY3RlZCAuaCBmaWxlIG5hbWUgYW5kIC5jYyBmaWxlIG5hbWUgZm9yIHRoZSBjbGF3LiIKKyAgZWxzZToKKyAgICBjbGF3ID0gQ2xhdygiQ2xhdyIpCisgICAgbG9vcF93cml0ZXIgPSBjb250cm9sX2xvb3AuQ29udHJvbExvb3BXcml0ZXIoIkNsYXciLCBbY2xhd10pCisgICAgbG9vcF93cml0ZXIuQWRkQ29uc3RhbnQoY29udHJvbF9sb29wLkNvbnN0YW50KCJrQ2xhd01vbWVudE9mSW5lcnRpYVJhdGlvIiwKKyAgICAgICIlZiIsIGNsYXcuSl90b3AgLyBjbGF3LkpfYm90dG9tKSkKKyAgICBpZiBhcmd2WzFdWy0zOl0gPT0gJy5jYyc6CisgICAgICBsb29wX3dyaXRlci5Xcml0ZShhcmd2WzJdLCBhcmd2WzFdKQorICAgIGVsc2U6CisgICAgICBsb29wX3dyaXRlci5Xcml0ZShhcmd2WzFdLCBhcmd2WzJdKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKHN5cy5hcmd2KSkKZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2RyaXZldHJhaW4ucHkgYi95MjAxNC9jb250cm9sX2xvb3BzL3B5dGhvbi9kcml2ZXRyYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjMDVhNTcKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL3B5dGhvbi9kcml2ZXRyYWluLnB5CkBAIC0wLDAgKzEsMjM5IEBACisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgY29udHJvbF9sb29wCitpbXBvcnQgY29udHJvbHMKK2ltcG9ydCBudW1weQoraW1wb3J0IHN5cworZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgorCisKK2NsYXNzIENJTShjb250cm9sX2xvb3AuQ29udHJvbExvb3ApOgorICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc3VwZXIoQ0lNLCBzZWxmKS5fX2luaXRfXygiQ0lNIikKKyAgICAjIFN0YWxsIFRvcnF1ZSBpbiBOIG0KKyAgICBzZWxmLnN0YWxsX3RvcnF1ZSA9IDIuNDIKKyAgICAjIFN0YWxsIEN1cnJlbnQgaW4gQW1wcworICAgIHNlbGYuc3RhbGxfY3VycmVudCA9IDEzMworICAgICMgRnJlZSBTcGVlZCBpbiBSUE0KKyAgICBzZWxmLmZyZWVfc3BlZWQgPSA0NjUwLjAKKyAgICAjIEZyZWUgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5mcmVlX2N1cnJlbnQgPSAyLjcKKyAgICAjIE1vbWVudCBvZiBpbmVydGlhIG9mIHRoZSBDSU0gaW4ga2cgbV4yCisgICAgc2VsZi5KID0gMC4wMDAxCisgICAgIyBSZXNpc3RhbmNlIG9mIHRoZSBtb3RvciwgZGl2aWRlZCBieSAyIHRvIGFjY291bnQgZm9yIHRoZSAyIG1vdG9ycworICAgIHNlbGYuUiA9IDEyLjAgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIE1vdG9yIHZlbG9jaXR5IGNvbnN0YW50CisgICAgc2VsZi5LdiA9ICgoc2VsZi5mcmVlX3NwZWVkIC8gNjAuMCAqIDIuMCAqIG51bXB5LnBpKSAvCisgICAgICAgICAgICAgICgxMi4wIC0gc2VsZi5SICogc2VsZi5mcmVlX2N1cnJlbnQpKQorICAgICMgVG9ycXVlIGNvbnN0YW50CisgICAgc2VsZi5LdCA9IHNlbGYuc3RhbGxfdG9ycXVlIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBDb250cm9sIGxvb3AgdGltZSBzdGVwCisgICAgc2VsZi5kdCA9IDAuMDA1CisKKyAgICAjIFN0YXRlIGZlZWRiYWNrIG1hdHJpY2VzCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbLXNlbGYuS3QgLyBzZWxmLkt2IC8gKHNlbGYuSiAqIHNlbGYuUildXSkKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1tzZWxmLkt0IC8gKHNlbGYuSiAqIHNlbGYuUildXSkKKyAgICBzZWxmLkMgPSBudW1weS5tYXRyaXgoW1sxXV0pCisgICAgc2VsZi5EID0gbnVtcHkubWF0cml4KFtbMF1dKQorCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKHNlbGYuQV9jb250aW51b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJfY29udGludW91cywgc2VsZi5kdCkKKworICAgIHNlbGYuUGxhY2VDb250cm9sbGVyUG9sZXMoWzAuMDFdKQorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFswLjAxXSkKKworICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXV0pCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKKworY2xhc3MgRHJpdmV0cmFpbihjb250cm9sX2xvb3AuQ29udHJvbExvb3ApOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iRHJpdmV0cmFpbiIsIGxlZnRfbG93PVRydWUsIHJpZ2h0X2xvdz1UcnVlKToKKyAgICBzdXBlcihEcml2ZXRyYWluLCBzZWxmKS5fX2luaXRfXyhuYW1lKQorICAgICMgU3RhbGwgVG9ycXVlIGluIE4gbQorICAgIHNlbGYuc3RhbGxfdG9ycXVlID0gMi40MgorICAgICMgU3RhbGwgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5zdGFsbF9jdXJyZW50ID0gMTMzLjAKKyAgICAjIEZyZWUgU3BlZWQgaW4gUlBNLiBVc2VkIG51bWJlciBmcm9tIGxhc3QgeWVhci4KKyAgICBzZWxmLmZyZWVfc3BlZWQgPSA0NjUwLjAKKyAgICAjIEZyZWUgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5mcmVlX2N1cnJlbnQgPSAyLjcKKyAgICAjIE1vbWVudCBvZiBpbmVydGlhIG9mIHRoZSBkcml2ZXRyYWluIGluIGtnIG1eMgorICAgICMgSnVzdCBib3Jyb3dlZCBmcm9tIGxhc3QgeWVhci4KKyAgICBzZWxmLkogPSA0LjUKKyAgICAjIE1hc3Mgb2YgdGhlIHJvYm90LCBpbiBrZy4KKyAgICBzZWxmLm0gPSA2OAorICAgICMgUmFkaXVzIG9mIHRoZSByb2JvdCwgaW4gbWV0ZXJzIChmcm9tIGxhc3QgeWVhcikuCisgICAgc2VsZi5yYiA9IDAuNjE3OTk4NjQ0IC8gMi4wCisgICAgIyBSYWRpdXMgb2YgdGhlIHdoZWVscywgaW4gbWV0ZXJzLgorICAgIHNlbGYuciA9IC4wNDQ0NQorICAgICMgUmVzaXN0YW5jZSBvZiB0aGUgbW90b3IsIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBtb3RvcnMuCisgICAgc2VsZi5SID0gMTIuMCAvIHNlbGYuc3RhbGxfY3VycmVudCAvIDQKKyAgICAjIE1vdG9yIHZlbG9jaXR5IGNvbnN0YW50CisgICAgc2VsZi5LdiA9ICgoc2VsZi5mcmVlX3NwZWVkIC8gNjAuMCAqIDIuMCAqIG51bXB5LnBpKSAvCisgICAgICAgICAgICAgICAoMTIuMCAtIHNlbGYuUiAqIHNlbGYuZnJlZV9jdXJyZW50KSkKKyAgICAjIFRvcnF1ZSBjb25zdGFudAorICAgIHNlbGYuS3QgPSBzZWxmLnN0YWxsX3RvcnF1ZSAvIHNlbGYuc3RhbGxfY3VycmVudAorICAgICMgR2VhciByYXRpb3MKKyAgICBzZWxmLkdfbG93ID0gMTguMCAvIDYwLjAgKiAxOC4wIC8gNTAuMAorICAgIHNlbGYuR19oaWdoID0gMjguMCAvIDUwLjAgKiAxOC4wIC8gNTAuMAorICAgIGlmIGxlZnRfbG93OgorICAgICAgc2VsZi5HbCA9IHNlbGYuR19sb3cKKyAgICBlbHNlOgorICAgICAgc2VsZi5HbCA9IHNlbGYuR19oaWdoCisgICAgaWYgcmlnaHRfbG93OgorICAgICAgc2VsZi5HciA9IHNlbGYuR19sb3cKKyAgICBlbHNlOgorICAgICAgc2VsZi5HciA9IHNlbGYuR19oaWdoCisKKyAgICAjIENvbnRyb2wgbG9vcCB0aW1lIHN0ZXAKKyAgICBzZWxmLmR0ID0gMC4wMDUKKworICAgICMgVGhlc2UgZGVzY3JpYmUgdGhlIHdheSB0aGF0IGEgZ2l2ZW4gc2lkZSBvZiBhIHJvYm90IHdpbGwgYmUgaW5mbHVlbmNlZAorICAgICMgYnkgdGhlIG90aGVyIHNpZGUuIFVuaXRzIG9mIDEgLyBrZy4KKyAgICBzZWxmLm1zcCA9IDEuMCAvIHNlbGYubSArIHNlbGYucmIgKiBzZWxmLnJiIC8gc2VsZi5KCisgICAgc2VsZi5tc24gPSAxLjAgLyBzZWxmLm0gLSBzZWxmLnJiICogc2VsZi5yYiAvIHNlbGYuSgorICAgICMgVGhlIGNhbGN1bGF0aW9ucyB3aGljaCB3ZSB3aWxsIG5lZWQgZm9yIEEgYW5kIEIuCisgICAgc2VsZi50Y2wgPSAtc2VsZi5LdCAvIHNlbGYuS3YgLyAoc2VsZi5HbCAqIHNlbGYuR2wgKiBzZWxmLlIgKiBzZWxmLnIgKiBzZWxmLnIpCisgICAgc2VsZi50Y3IgPSAtc2VsZi5LdCAvIHNlbGYuS3YgLyAoc2VsZi5HciAqIHNlbGYuR3IgKiBzZWxmLlIgKiBzZWxmLnIgKiBzZWxmLnIpCisgICAgc2VsZi5tcGwgPSBzZWxmLkt0IC8gKHNlbGYuR2wgKiBzZWxmLlIgKiBzZWxmLnIpCisgICAgc2VsZi5tcHIgPSBzZWxmLkt0IC8gKHNlbGYuR3IgKiBzZWxmLlIgKiBzZWxmLnIpCisKKyAgICAjIFN0YXRlIGZlZWRiYWNrIG1hdHJpY2VzCisgICAgIyBYIHdpbGwgYmUgb2YgdGhlIGZvcm1hdAorICAgICMgW1twb3NpdGlvbmxdLCBbdmVsb2NpdHlsXSwgW3Bvc2l0aW9ucl0sIHZlbG9jaXR5cl1dCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMSwgMCwgMF0sCisgICAgICAgICBbMCwgc2VsZi5tc3AgKiBzZWxmLnRjbCwgMCwgc2VsZi5tc24gKiBzZWxmLnRjcl0sCisgICAgICAgICBbMCwgMCwgMCwgMV0sCisgICAgICAgICBbMCwgc2VsZi5tc24gKiBzZWxmLnRjbCwgMCwgc2VsZi5tc3AgKiBzZWxmLnRjcl1dKQorICAgIHNlbGYuQl9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDBdLAorICAgICAgICAgW3NlbGYubXNwICogc2VsZi5tcGwsIHNlbGYubXNuICogc2VsZi5tcHJdLAorICAgICAgICAgWzAsIDBdLAorICAgICAgICAgW3NlbGYubXNuICogc2VsZi5tcGwsIHNlbGYubXNwICogc2VsZi5tcHJdXSkKKyAgICBzZWxmLkMgPSBudW1weS5tYXRyaXgoW1sxLCAwLCAwLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwLCAxLCAwXV0pCisgICAgc2VsZi5EID0gbnVtcHkubWF0cml4KFtbMCwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMF1dKQorCisgICAgI3ByaW50ICJUSEUgTlVNQkVSIEkgV0FOVCIgKyBzdHIobnVtcHkubGluYWxnLmludihzZWxmLkFfY29udGludW91cykgKiAtc2VsZi5CX2NvbnRpbnVvdXMgKiBudW1weS5tYXRyaXgoW1sxMi4wXSwgWzEyLjBdXSkpCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKAorICAgICAgICBzZWxmLkFfY29udGludW91cywgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICAjIFBvbGVzIGZyb20gbGFzdCB5ZWFyLgorICAgIHNlbGYuaHAgPSAwLjY1CisgICAgc2VsZi5scCA9IDAuODMKKyAgICBzZWxmLlBsYWNlQ29udHJvbGxlclBvbGVzKFtzZWxmLmhwLCBzZWxmLmxwLCBzZWxmLmhwLCBzZWxmLmxwXSkKKyAgICBwcmludCBzZWxmLksKKyAgICBxX3BvcyA9IDAuMDcKKyAgICBxX3ZlbCA9IDEuMAorICAgIHNlbGYuUSA9IG51bXB5Lm1hdHJpeChbWygxLjAgLyAocV9wb3MgKiogMi4wKSksIDAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKDEuMCAvIChxX3ZlbCAqKiAyLjApKSwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAoMS4wIC8gKHFfcG9zICoqIDIuMCkpLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAwLjAsICgxLjAgLyAocV92ZWwgKiogMi4wKSldXSkKKworICAgIHNlbGYuUiA9IG51bXB5Lm1hdHJpeChbWygxLjAgLyAoMTIuMCAqKiAyLjApKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsICgxLjAgLyAoMTIuMCAqKiAyLjApKV1dKQorICAgIHNlbGYuSyA9IGNvbnRyb2xzLmRscXIoc2VsZi5BLCBzZWxmLkIsIHNlbGYuUSwgc2VsZi5SKQorICAgIHByaW50IHNlbGYuQQorICAgIHByaW50IHNlbGYuQgorICAgIHByaW50IHNlbGYuSworICAgIHByaW50IG51bXB5LmxpbmFsZy5laWcoc2VsZi5BIC0gc2VsZi5CICogc2VsZi5LKVswXQorCisgICAgc2VsZi5obHAgPSAwLjMKKyAgICBzZWxmLmxscCA9IDAuNAorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLmhscCwgc2VsZi5obHAsIHNlbGYubGxwLCBzZWxmLmxscF0pCisKKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KFtbMTIuMF0sIFsxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXSwgWy0xMi4wXV0pCisgICAgc2VsZi5Jbml0aWFsaXplU3RhdGUoKQorCitkZWYgbWFpbihhcmd2KToKKyAgIyBTaW11bGF0ZSB0aGUgcmVzcG9uc2Ugb2YgdGhlIHN5c3RlbSB0byBhIHN0ZXAgaW5wdXQuCisgIGRyaXZldHJhaW4gPSBEcml2ZXRyYWluKCkKKyAgc2ltdWxhdGVkX2xlZnQgPSBbXQorICBzaW11bGF0ZWRfcmlnaHQgPSBbXQorICBmb3IgXyBpbiB4cmFuZ2UoMTAwKToKKyAgICBkcml2ZXRyYWluLlVwZGF0ZShudW1weS5tYXRyaXgoW1sxMi4wXSwgWzEyLjBdXSkpCisgICAgc2ltdWxhdGVkX2xlZnQuYXBwZW5kKGRyaXZldHJhaW4uWFswLCAwXSkKKyAgICBzaW11bGF0ZWRfcmlnaHQuYXBwZW5kKGRyaXZldHJhaW4uWFsyLCAwXSkKKworICAjcHlsYWIucGxvdChyYW5nZSgxMDApLCBzaW11bGF0ZWRfbGVmdCkKKyAgI3B5bGFiLnBsb3QocmFuZ2UoMTAwKSwgc2ltdWxhdGVkX3JpZ2h0KQorICAjcHlsYWIuc2hvdygpCisKKyAgIyBTaW11bGF0ZSBmb3J3YXJkcyBtb3Rpb24uCisgIGRyaXZldHJhaW4gPSBEcml2ZXRyYWluKCkKKyAgY2xvc2VfbG9vcF9sZWZ0ID0gW10KKyAgY2xvc2VfbG9vcF9yaWdodCA9IFtdCisgIFIgPSBudW1weS5tYXRyaXgoW1sxLjBdLCBbMC4wXSwgWzEuMF0sIFswLjBdXSkKKyAgZm9yIF8gaW4geHJhbmdlKDEwMCk6CisgICAgVSA9IG51bXB5LmNsaXAoZHJpdmV0cmFpbi5LICogKFIgLSBkcml2ZXRyYWluLlhfaGF0KSwKKyAgICAgICAgICAgICAgICAgICBkcml2ZXRyYWluLlVfbWluLCBkcml2ZXRyYWluLlVfbWF4KQorICAgIGRyaXZldHJhaW4uVXBkYXRlT2JzZXJ2ZXIoVSkKKyAgICBkcml2ZXRyYWluLlVwZGF0ZShVKQorICAgIGNsb3NlX2xvb3BfbGVmdC5hcHBlbmQoZHJpdmV0cmFpbi5YWzAsIDBdKQorICAgIGNsb3NlX2xvb3BfcmlnaHQuYXBwZW5kKGRyaXZldHJhaW4uWFsyLCAwXSkKKworICAjcHlsYWIucGxvdChyYW5nZSgxMDApLCBjbG9zZV9sb29wX2xlZnQpCisgICNweWxhYi5wbG90KHJhbmdlKDEwMCksIGNsb3NlX2xvb3BfcmlnaHQpCisgICNweWxhYi5zaG93KCkKKworICAjIFRyeSB0dXJuaW5nIGluIHBsYWNlCisgIGRyaXZldHJhaW4gPSBEcml2ZXRyYWluKCkKKyAgY2xvc2VfbG9vcF9sZWZ0ID0gW10KKyAgY2xvc2VfbG9vcF9yaWdodCA9IFtdCisgIFIgPSBudW1weS5tYXRyaXgoW1stMS4wXSwgWzAuMF0sIFsxLjBdLCBbMC4wXV0pCisgIGZvciBfIGluIHhyYW5nZSgxMDApOgorICAgIFUgPSBudW1weS5jbGlwKGRyaXZldHJhaW4uSyAqIChSIC0gZHJpdmV0cmFpbi5YX2hhdCksCisgICAgICAgICAgICAgICAgICAgZHJpdmV0cmFpbi5VX21pbiwgZHJpdmV0cmFpbi5VX21heCkKKyAgICBkcml2ZXRyYWluLlVwZGF0ZU9ic2VydmVyKFUpCisgICAgZHJpdmV0cmFpbi5VcGRhdGUoVSkKKyAgICBjbG9zZV9sb29wX2xlZnQuYXBwZW5kKGRyaXZldHJhaW4uWFswLCAwXSkKKyAgICBjbG9zZV9sb29wX3JpZ2h0LmFwcGVuZChkcml2ZXRyYWluLlhbMiwgMF0pCisKKyAgI3B5bGFiLnBsb3QocmFuZ2UoMTAwKSwgY2xvc2VfbG9vcF9sZWZ0KQorICAjcHlsYWIucGxvdChyYW5nZSgxMDApLCBjbG9zZV9sb29wX3JpZ2h0KQorICAjcHlsYWIuc2hvdygpCisKKyAgIyBUcnkgdHVybmluZyBqdXN0IG9uZSBzaWRlLgorICBkcml2ZXRyYWluID0gRHJpdmV0cmFpbigpCisgIGNsb3NlX2xvb3BfbGVmdCA9IFtdCisgIGNsb3NlX2xvb3BfcmlnaHQgPSBbXQorICBSID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFsxLjBdLCBbMC4wXV0pCisgIGZvciBfIGluIHhyYW5nZSgxMDApOgorICAgIFUgPSBudW1weS5jbGlwKGRyaXZldHJhaW4uSyAqIChSIC0gZHJpdmV0cmFpbi5YX2hhdCksCisgICAgICAgICAgICAgICAgICAgZHJpdmV0cmFpbi5VX21pbiwgZHJpdmV0cmFpbi5VX21heCkKKyAgICBkcml2ZXRyYWluLlVwZGF0ZU9ic2VydmVyKFUpCisgICAgZHJpdmV0cmFpbi5VcGRhdGUoVSkKKyAgICBjbG9zZV9sb29wX2xlZnQuYXBwZW5kKGRyaXZldHJhaW4uWFswLCAwXSkKKyAgICBjbG9zZV9sb29wX3JpZ2h0LmFwcGVuZChkcml2ZXRyYWluLlhbMiwgMF0pCisKKyAgI3B5bGFiLnBsb3QocmFuZ2UoMTAwKSwgY2xvc2VfbG9vcF9sZWZ0KQorICAjcHlsYWIucGxvdChyYW5nZSgxMDApLCBjbG9zZV9sb29wX3JpZ2h0KQorICAjcHlsYWIuc2hvdygpCisKKyAgIyBXcml0ZSB0aGUgZ2VuZXJhdGVkIGNvbnN0YW50cyBvdXQgdG8gYSBmaWxlLgorICBwcmludCAiT3V0cHV0IG9uZSIKKyAgZHJpdmV0cmFpbl9sb3dfbG93ID0gRHJpdmV0cmFpbihuYW1lPSJEcml2ZXRyYWluTG93TG93IiwgbGVmdF9sb3c9VHJ1ZSwgcmlnaHRfbG93PVRydWUpCisgIGRyaXZldHJhaW5fbG93X2hpZ2ggPSBEcml2ZXRyYWluKG5hbWU9IkRyaXZldHJhaW5Mb3dIaWdoIiwgbGVmdF9sb3c9VHJ1ZSwgcmlnaHRfbG93PUZhbHNlKQorICBkcml2ZXRyYWluX2hpZ2hfbG93ID0gRHJpdmV0cmFpbihuYW1lPSJEcml2ZXRyYWluSGlnaExvdyIsIGxlZnRfbG93PUZhbHNlLCByaWdodF9sb3c9VHJ1ZSkKKyAgZHJpdmV0cmFpbl9oaWdoX2hpZ2ggPSBEcml2ZXRyYWluKG5hbWU9IkRyaXZldHJhaW5IaWdoSGlnaCIsIGxlZnRfbG93PUZhbHNlLCByaWdodF9sb3c9RmFsc2UpCisKKyAgaWYgbGVuKGFyZ3YpICE9IDU6CisgICAgcHJpbnQgIkV4cGVjdGVkIC5oIGZpbGUgbmFtZSBhbmQgLmNjIGZpbGUgbmFtZSIKKyAgZWxzZToKKyAgICBkb2dfbG9vcF93cml0ZXIgPSBjb250cm9sX2xvb3AuQ29udHJvbExvb3BXcml0ZXIoCisgICAgICAgICJEcml2ZXRyYWluIiwgW2RyaXZldHJhaW5fbG93X2xvdywgZHJpdmV0cmFpbl9sb3dfaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgZHJpdmV0cmFpbl9oaWdoX2xvdywgZHJpdmV0cmFpbl9oaWdoX2hpZ2hdKQorICAgIGlmIGFyZ3ZbMV1bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGRvZ19sb29wX3dyaXRlci5Xcml0ZShhcmd2WzJdLCBhcmd2WzFdKQorICAgIGVsc2U6CisgICAgICBkb2dfbG9vcF93cml0ZXIuV3JpdGUoYXJndlsxXSwgYXJndlsyXSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL3B5dGhvbi9lbGV2YXRvci5weSBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2VsZXZhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZiYTcyYzgKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL3B5dGhvbi9lbGV2YXRvci5weQpAQCAtMCwwICsxLDI0NiBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IGNvbnRyb2xfbG9vcAoraW1wb3J0IGNvbnRyb2xzCitpbXBvcnQgcG9seXRvcGUKK2ltcG9ydCBwb2x5ZHJpdmV0cmFpbgoraW1wb3J0IG51bXB5CitpbXBvcnQgc3lzCitpbXBvcnQgbWF0cGxvdGxpYgorZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgorCitjbGFzcyBFbGV2YXRvcihjb250cm9sX2xvb3AuQ29udHJvbExvb3ApOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iRWxldmF0b3IiLCBtYXNzPU5vbmUpOgorICAgIHN1cGVyKEVsZXZhdG9yLCBzZWxmKS5fX2luaXRfXyhuYW1lKQorICAgICMgU3RhbGwgVG9ycXVlIGluIE4gbQorICAgIHNlbGYuc3RhbGxfdG9ycXVlID0gMC40NzYKKyAgICAjIFN0YWxsIEN1cnJlbnQgaW4gQW1wcworICAgIHNlbGYuc3RhbGxfY3VycmVudCA9IDgwLjczMAorICAgICMgRnJlZSBTcGVlZCBpbiBSUE0KKyAgICBzZWxmLmZyZWVfc3BlZWQgPSAxMzkwNi4wCisgICAgIyBGcmVlIEN1cnJlbnQgaW4gQW1wcworICAgIHNlbGYuZnJlZV9jdXJyZW50ID0gNS44MjAKKyAgICAjIE1hc3Mgb2YgdGhlIGVsZXZhdG9yCisgICAgaWYgbWFzcyBpcyBOb25lOgorICAgICAgc2VsZi5tYXNzID0gMTMuMAorICAgIGVsc2U6CisgICAgICBzZWxmLm1hc3MgPSBtYXNzCisKKyAgICAjIFJlc2lzdGFuY2Ugb2YgdGhlIG1vdG9yCisgICAgc2VsZi5SID0gMTIuMCAvIHNlbGYuc3RhbGxfY3VycmVudAorICAgICMgTW90b3IgdmVsb2NpdHkgY29uc3RhbnQKKyAgICBzZWxmLkt2ID0gKChzZWxmLmZyZWVfc3BlZWQgLyA2MC4wICogMi4wICogbnVtcHkucGkpIC8KKyAgICAgICAgICAgICAgICgxMi4wIC0gc2VsZi5SICogc2VsZi5mcmVlX2N1cnJlbnQpKQorICAgICMgVG9ycXVlIGNvbnN0YW50CisgICAgc2VsZi5LdCA9IHNlbGYuc3RhbGxfdG9ycXVlIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBHZWFyIHJhdGlvCisgICAgc2VsZi5HID0gKDU2LjAgLyAxMi4wKSAqICg4NC4wIC8gMTQuMCkKKyAgICAjIFB1bGxleSBkaWFtZXRlcgorICAgIHNlbGYuciA9IDMyICogMC4wMDUgLyBudW1weS5waSAvIDIuMAorICAgICMgQ29udHJvbCBsb29wIHRpbWUgc3RlcAorICAgIHNlbGYuZHQgPSAwLjAwNQorCisgICAgIyBFbGV2YXRvciBsZWZ0L3JpZ2h0IHNwcmluZyBjb25zdGFudCAoTi9tKQorICAgIHNlbGYuc3ByaW5nID0gODAwLjAKKworICAgICMgU3RhdGUgaXMgW2F2ZXJhZ2UgcG9zaXRpb24sIGF2ZXJhZ2UgdmVsb2NpdHksCisgICAgIyAgICAgICAgICAgcG9zaXRpb24gZGlmZmVyZW5jZS8yLCB2ZWxvY2l0eSBkaWZmZXJlbmNlLzJdCisgICAgIyBJbnB1dCBpcyBbVl9sZWZ0LCBWX3JpZ2h0XQorCisgICAgQzEgPSBzZWxmLnNwcmluZyAvIChzZWxmLm1hc3MgKiAwLjUpCisgICAgQzIgPSBzZWxmLkt0ICogc2VsZi5HIC8gKHNlbGYubWFzcyAqIDAuNSAqIHNlbGYuciAqIHNlbGYuUikKKyAgICBDMyA9IHNlbGYuRyAqIHNlbGYuRyAqIHNlbGYuS3QgLyAoCisgICAgICAgIHNlbGYuUiAgKiBzZWxmLnIgKiBzZWxmLnIgKiBzZWxmLm1hc3MgKiAwLjUgKiBzZWxmLkt2KQorCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMSwgMCwgMF0sCisgICAgICAgICBbMCwgLUMzLCAwLCAwXSwKKyAgICAgICAgIFswLCAwLCAwLCAxXSwKKyAgICAgICAgIFswLCAwLCAtQzEgKiAyLjAsIC1DM11dKQorCisgICAgcHJpbnQgIkZ1bGwgc3BlZWQgaXMiLCBDMiAvIEMzICogMTIuMAorCisgICAgIyBTdGFydCB3aXRoIHRoZSB1bm1vZGlmaWVkIGlucHV0CisgICAgc2VsZi5CX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMF0sCisgICAgICAgICBbQzIgLyAyLjAsIEMyIC8gMi4wXSwKKyAgICAgICAgIFswLCAwXSwKKyAgICAgICAgIFtDMiAvIDIuMCwgLUMyIC8gMi4wXV0pCisKKyAgICBzZWxmLkMgPSBudW1weS5tYXRyaXgoW1sxLCAwLCAxLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLCAwLCAtMSwgMF1dKQorICAgIHNlbGYuRCA9IG51bXB5Lm1hdHJpeChbWzAsIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDBdXSkKKworICAgIHNlbGYuQSwgc2VsZi5CID0gc2VsZi5Db250aW51b3VzVG9EaXNjcmV0ZSgKKyAgICAgICAgc2VsZi5BX2NvbnRpbnVvdXMsIHNlbGYuQl9jb250aW51b3VzLCBzZWxmLmR0KQorCisgICAgcHJpbnQgc2VsZi5BCisKKyAgICBjb250cm9sYWJpbGl0eSA9IGNvbnRyb2xzLmN0cmIoc2VsZi5BLCBzZWxmLkIpOworICAgIHByaW50ICJSYW5rIG9mIGF1Z21lbnRlZCBjb250cm9sYWJpbGl0eSBtYXRyaXguIiwgbnVtcHkubGluYWxnLm1hdHJpeF9yYW5rKAorICAgICAgICBjb250cm9sYWJpbGl0eSkKKworICAgIHFfcG9zID0gMC4wMgorICAgIHFfdmVsID0gMC40MDAKKyAgICBxX3Bvc19kaWZmID0gMC4wMQorICAgIHFfdmVsX2RpZmYgPSAwLjQ1CisgICAgc2VsZi5RID0gbnVtcHkubWF0cml4KFtbKDEuMCAvIChxX3BvcyAqKiAyLjApKSwgMC4wLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAoMS4wIC8gKHFfdmVsICoqIDIuMCkpLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsICgxLjAgLyAocV9wb3NfZGlmZiAqKiAyLjApKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMC4wLCAoMS4wIC8gKHFfdmVsX2RpZmYgKiogMi4wKSldXSkKKworICAgIHNlbGYuUiA9IG51bXB5Lm1hdHJpeChbWygxLjAgLyAoMTIuMCAqKiAyLjApKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDEuMCAvICgxMi4wICoqIDIuMCldXSkKKyAgICBzZWxmLksgPSBjb250cm9scy5kbHFyKHNlbGYuQSwgc2VsZi5CLCBzZWxmLlEsIHNlbGYuUikKKyAgICBwcmludCBzZWxmLksKKworICAgIHByaW50IG51bXB5LmxpbmFsZy5laWcoc2VsZi5BIC0gc2VsZi5CICogc2VsZi5LKVswXQorCisgICAgc2VsZi5ycGwgPSAwLjIwCisgICAgc2VsZi5pcGwgPSAwLjA1CisgICAgc2VsZi5QbGFjZU9ic2VydmVyUG9sZXMoW3NlbGYucnBsICsgMWogKiBzZWxmLmlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGwgKyAxaiAqIHNlbGYuaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbCAtIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsIC0gMWogKiBzZWxmLmlwbF0pCisKKyAgICAjIFRoZSBib3ggZm9ybWVkIGJ5IFVfbWluIGFuZCBVX21heCBtdXN0IGVuY29tcGFzcyBhbGwgcG9zc2libGUgdmFsdWVzLAorICAgICMgb3IgZWxzZSBBdXN0aW4ncyBjb2RlIGdldHMgYW5ncnkuCisgICAgc2VsZi5VX21heCA9IG51bXB5Lm1hdHJpeChbWzEyLjBdLCBbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoW1stMTIuMF0sIFstMTIuMF1dKQorCisgICAgc2VsZi5Jbml0aWFsaXplU3RhdGUoKQorCisKK2RlZiBDYXBVKFUpOgorICBpZiBVWzAsIDBdIC0gVVsxLCAwXSA+IDI0OgorICAgIHJldHVybiBudW1weS5tYXRyaXgoW1sxMl0sIFstMTJdXSkKKyAgZWxpZiBVWzAsIDBdIC0gVVsxLCAwXSA8IC0yNDoKKyAgICByZXR1cm4gbnVtcHkubWF0cml4KFtbLTEyXSwgWzEyXV0pCisgIGVsc2U6CisgICAgbWF4X3UgPSBtYXgoVVswLCAwXSwgVVsxLCAwXSkKKyAgICBtaW5fdSA9IG1pbihVWzAsIDBdLCBVWzEsIDBdKQorICAgIGlmIG1heF91ID4gMTI6CisgICAgICByZXR1cm4gVSAtIChtYXhfdSAtIDEyKQorICAgIGlmIG1pbl91IDwgLTEyOgorICAgICAgcmV0dXJuIFUgLSAobWluX3UgKyAxMikKKyAgICByZXR1cm4gVQorCisKK2RlZiBydW5fdGVzdChlbGV2YXRvciwgaW5pdGlhbF9YLCBnb2FsLCBtYXhfc2VwYXJhdGlvbl9lcnJvcj0wLjAxLAorICAgICAgICAgICAgIHNob3dfZ3JhcGg9VHJ1ZSwgaXRlcmF0aW9ucz0yMDAsIGNvbnRyb2xsZXJfZWxldmF0b3I9Tm9uZSwKKyAgICAgICAgICAgICBvYnNlcnZlcl9lbGV2YXRvcj1Ob25lKToKKyAgIiIiUnVucyB0aGUgZWxldmF0b3IgcGxhbnQgd2l0aCBhbiBpbml0aWFsIGNvbmRpdGlvbiBhbmQgZ29hbC4KKworICAgIFRoZSB0ZXN0cyB0aGVtc2VsdmVzIGFyZSBub3QgdGVycmlibHkgc29waGlzdGljYXRlZDsgSSBqdXN0IHRlc3QgZm9yCisgICAgd2hldGhlciB0aGUgZ29hbCBoYXMgYmVlbiByZWFjaGVkIGFuZCB3aGV0aGVyIHRoZSBzZXBhcmF0aW9uIGdvZXMKKyAgICBvdXRzaWRlIG9mIHRoZSBpbml0aWFsIGFuZCBnb2FsIHZhbHVlcyBieSBtb3JlIHRoYW4gbWF4X3NlcGFyYXRpb25fZXJyb3IuCisgICAgUHJpbnRzIG91dCBzb21ldGhpbmcgZm9yIGEgZmFpbHVyZSBvZiBlaXRoZXIgY29uZGl0aW9uIGFuZCByZXR1cm5zCisgICAgRmFsc2UgaWYgdGVzdHMgZmFpbC4KKyAgICBBcmdzOgorICAgICAgZWxldmF0b3I6IGVsZXZhdG9yIG9iamVjdCB0byB1c2UuCisgICAgICBpbml0aWFsX1g6IHN0YXJ0aW5nIHN0YXRlLgorICAgICAgZ29hbDogZ29hbCBzdGF0ZS4KKyAgICAgIHNob3dfZ3JhcGg6IFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgYSBncmFwaCBzaG93aW5nIHRoZSBjaGFuZ2luZworICAgICAgICAgICBzdGF0ZXMgYW5kIHZvbHRhZ2VzLgorICAgICAgaXRlcmF0aW9uczogTnVtYmVyIG9mIHRpbWVzdGVwcyB0byBydW4gdGhlIG1vZGVsIGZvci4KKyAgICAgIGNvbnRyb2xsZXJfZWxldmF0b3I6IGVsZXZhdG9yIG9iamVjdCB0byBnZXQgSyBmcm9tLCBvciBOb25lIGlmIHdlIHNob3VsZAorICAgICAgICAgIHVzZSBlbGV2YXRvci4KKyAgICAgIG9ic2VydmVyX2VsZXZhdG9yOiBlbGV2YXRvciBvYmplY3QgdG8gdXNlIGZvciB0aGUgb2JzZXJ2ZXIsIG9yIE5vbmUgaWYgd2UKKyAgICAgICAgICBzaG91bGQgdXNlIHRoZSBhY3R1YWwgc3RhdGUuCisgICIiIgorCisgIGVsZXZhdG9yLlggPSBpbml0aWFsX1gKKworICBpZiBjb250cm9sbGVyX2VsZXZhdG9yIGlzIE5vbmU6CisgICAgY29udHJvbGxlcl9lbGV2YXRvciA9IGVsZXZhdG9yCisKKyAgaWYgb2JzZXJ2ZXJfZWxldmF0b3IgaXMgbm90IE5vbmU6CisgICAgb2JzZXJ2ZXJfZWxldmF0b3IuWF9oYXQgPSBpbml0aWFsX1ggKyAwLjAxCisgICAgb2JzZXJ2ZXJfZWxldmF0b3IuWF9oYXQgPSBpbml0aWFsX1gKKworICAjIFZhcmlvdXMgbGlzdHMgZm9yIGdyYXBoaW5nIHRoaW5ncy4KKyAgdCA9IFtdCisgIHhfYXZnID0gW10KKyAgeF9zZXAgPSBbXQorICB4X2hhdF9hdmcgPSBbXQorICB4X2hhdF9zZXAgPSBbXQorICB2X2F2ZyA9IFtdCisgIHZfc2VwID0gW10KKyAgdV9sZWZ0ID0gW10KKyAgdV9yaWdodCA9IFtdCisKKyAgc2VwX3Bsb3RfZ2FpbiA9IDEwMC4wCisKKyAgZm9yIGkgaW4geHJhbmdlKGl0ZXJhdGlvbnMpOgorICAgIFhfaGF0ID0gZWxldmF0b3IuWAorICAgIGlmIG9ic2VydmVyX2VsZXZhdG9yIGlzIG5vdCBOb25lOgorICAgICAgWF9oYXQgPSBvYnNlcnZlcl9lbGV2YXRvci5YX2hhdAorICAgICAgeF9oYXRfYXZnLmFwcGVuZChvYnNlcnZlcl9lbGV2YXRvci5YX2hhdFswLCAwXSkKKyAgICAgIHhfaGF0X3NlcC5hcHBlbmQob2JzZXJ2ZXJfZWxldmF0b3IuWF9oYXRbMiwgMF0gKiBzZXBfcGxvdF9nYWluKQorICAgIFUgPSBjb250cm9sbGVyX2VsZXZhdG9yLksgKiAoZ29hbCAtIFhfaGF0KQorICAgIFUgPSBDYXBVKFUpCisgICAgeF9hdmcuYXBwZW5kKGVsZXZhdG9yLlhbMCwgMF0pCisgICAgdl9hdmcuYXBwZW5kKGVsZXZhdG9yLlhbMSwgMF0pCisgICAgeF9zZXAuYXBwZW5kKGVsZXZhdG9yLlhbMiwgMF0gKiBzZXBfcGxvdF9nYWluKQorICAgIHZfc2VwLmFwcGVuZChlbGV2YXRvci5YWzMsIDBdKQorICAgIGlmIG9ic2VydmVyX2VsZXZhdG9yIGlzIG5vdCBOb25lOgorICAgICAgb2JzZXJ2ZXJfZWxldmF0b3IuUHJlZGljdE9ic2VydmVyKFUpCisgICAgZWxldmF0b3IuVXBkYXRlKFUpCisgICAgaWYgb2JzZXJ2ZXJfZWxldmF0b3IgaXMgbm90IE5vbmU6CisgICAgICBvYnNlcnZlcl9lbGV2YXRvci5ZID0gZWxldmF0b3IuWQorICAgICAgb2JzZXJ2ZXJfZWxldmF0b3IuQ29ycmVjdE9ic2VydmVyKFUpCisKKyAgICB0LmFwcGVuZChpICogZWxldmF0b3IuZHQpCisgICAgdV9sZWZ0LmFwcGVuZChVWzAsIDBdKQorICAgIHVfcmlnaHQuYXBwZW5kKFVbMSwgMF0pCisKKyAgcHJpbnQgbnVtcHkubGluYWxnLmludihlbGV2YXRvci5BKQorICBwcmludCAiZGVsdGEgdGltZSBpcyAiLCBlbGV2YXRvci5kdAorICBwcmludCAiVmVsb2NpdHkgYXQgdD0wIGlzICIsIHhfYXZnWzBdLCB2X2F2Z1swXSwgeF9zZXBbMF0sIHZfc2VwWzBdCisgIHByaW50ICJWZWxvY2l0eSBhdCB0PTErZHQgaXMgIiwgeF9hdmdbMV0sIHZfYXZnWzFdLCB4X3NlcFsxXSwgdl9zZXBbMV0KKworICBpZiBzaG93X2dyYXBoOgorICAgIHB5bGFiLnN1YnBsb3QoMiwgMSwgMSkKKyAgICBweWxhYi5wbG90KHQsIHhfYXZnLCBsYWJlbD0neCBhdmcnKQorICAgIHB5bGFiLnBsb3QodCwgeF9zZXAsIGxhYmVsPSd4IHNlcCcpCisgICAgaWYgb2JzZXJ2ZXJfZWxldmF0b3IgaXMgbm90IE5vbmU6CisgICAgICBweWxhYi5wbG90KHQsIHhfaGF0X2F2ZywgbGFiZWw9J3hfaGF0IGF2ZycpCisgICAgICBweWxhYi5wbG90KHQsIHhfaGF0X3NlcCwgbGFiZWw9J3hfaGF0IHNlcCcpCisgICAgcHlsYWIubGVnZW5kKCkKKworICAgIHB5bGFiLnN1YnBsb3QoMiwgMSwgMikKKyAgICBweWxhYi5wbG90KHQsIHVfbGVmdCwgbGFiZWw9J3UgbGVmdCcpCisgICAgcHlsYWIucGxvdCh0LCB1X3JpZ2h0LCBsYWJlbD0ndSByaWdodCcpCisgICAgcHlsYWIubGVnZW5kKCkKKyAgICBweWxhYi5zaG93KCkKKworCitkZWYgbWFpbihhcmd2KToKKyAgbG9hZGVkX21hc3MgPSAyNQorICAjbG9hZGVkX21hc3MgPSAwCisgIGVsZXZhdG9yID0gRWxldmF0b3IobWFzcz0xMyArIGxvYWRlZF9tYXNzKQorICBlbGV2YXRvcl9jb250cm9sbGVyID0gRWxldmF0b3IobWFzcz0xMyArIDE1KQorICBvYnNlcnZlcl9lbGV2YXRvciA9IEVsZXZhdG9yKG1hc3M9MTMgKyAxNSkKKyAgI29ic2VydmVyX2VsZXZhdG9yID0gTm9uZQorCisgICMgVGVzdCBtb3ZpbmcgdGhlIGVsZXZhdG9yIHdpdGggY29uc3RhbnQgc2VwYXJhdGlvbi4KKyAgaW5pdGlhbF9YID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFswLjAxXSwgWzAuMF1dKQorICAjaW5pdGlhbF9YID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFswLjAwXSwgWzAuMF1dKQorICBSID0gbnVtcHkubWF0cml4KFtbMS4wXSwgWzAuMF0sIFswLjBdLCBbMC4wXV0pCisgIHJ1bl90ZXN0KGVsZXZhdG9yLCBpbml0aWFsX1gsIFIsIGNvbnRyb2xsZXJfZWxldmF0b3I9ZWxldmF0b3JfY29udHJvbGxlciwKKyAgICAgICAgICAgb2JzZXJ2ZXJfZWxldmF0b3I9b2JzZXJ2ZXJfZWxldmF0b3IpCisKKyAgIyBXcml0ZSB0aGUgZ2VuZXJhdGVkIGNvbnN0YW50cyBvdXQgdG8gYSBmaWxlLgorICBpZiBsZW4oYXJndikgIT0gMzoKKyAgICBwcmludCAiRXhwZWN0ZWQgLmggZmlsZSBuYW1lIGFuZCAuY2MgZmlsZSBuYW1lIGZvciB0aGUgZWxldmF0b3IuIgorICBlbHNlOgorICAgIGVsZXZhdG9yID0gRWxldmF0b3IoIkVsZXZhdG9yIikKKyAgICBsb29wX3dyaXRlciA9IGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcFdyaXRlcigiRWxldmF0b3IiLCBbZWxldmF0b3JdKQorICAgIGlmIGFyZ3ZbMV1bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMl0sIGFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMV0sIGFyZ3ZbMl0pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9weXRob24vcG9seWRyaXZldHJhaW4ucHkgYi95MjAxNC9jb250cm9sX2xvb3BzL3B5dGhvbi9wb2x5ZHJpdmV0cmFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMmM2M2ZhCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9weXRob24vcG9seWRyaXZldHJhaW4ucHkKQEAgLTAsMCArMSw1MDMgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKK2ltcG9ydCBudW1weQoraW1wb3J0IHN5cworaW1wb3J0IHBvbHl0b3BlCitpbXBvcnQgZHJpdmV0cmFpbgoraW1wb3J0IGNvbnRyb2xfbG9vcAoraW1wb3J0IGNvbnRyb2xzCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCisKK19fYXV0aG9yX18gPSAnQXVzdGluIFNjaHVoIChhdXN0aW4ubGludXhAZ21haWwuY29tKScKKworCitkZWYgQ29lcmNlR29hbChyZWdpb24sIEssIHcsIFIpOgorICAiIiJJbnRlcnNlY3RzIGEgbGluZSB3aXRoIGEgcmVnaW9uLCBhbmQgZmluZHMgdGhlIGNsb3Nlc3QgcG9pbnQgdG8gUi4KKworICBGaW5kcyBhIHBvaW50IHRoYXQgaXMgY2xvc2VzdCB0byBSIGluc2lkZSB0aGUgcmVnaW9uLCBhbmQgb24gdGhlIGxpbmUKKyAgZGVmaW5lZCBieSBLIFggPSB3LiAgSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGZpbmQgYSBwb2ludCBvbiB0aGUgbGluZSwKKyAgZmluZHMgYSBwb2ludCB0aGF0IGlzIGluc2lkZSB0aGUgcmVnaW9uIGFuZCBjbG9zZXN0IHRvIHRoZSBsaW5lLiAgVGhpcworICBmdW5jdGlvbiBhc3N1bWVzIHRoYXQKKworICBBcmdzOgorICAgIHJlZ2lvbjogSFBvbHl0b3BlLCB0aGUgdmFsaWQgZ29hbCByZWdpb24uCisgICAgSzogbnVtcHkubWF0cml4ICgyIHggMSksIHRoZSBtYXRyaXggZm9yIHRoZSBlcXVhdGlvbiBbSzEsIEsyXSBbeDE7IHgyXSA9IHcKKyAgICB3OiBmbG9hdCwgdGhlIG9mZnNldCBpbiB0aGUgZXF1YXRpb24gYWJvdmUuCisgICAgUjogbnVtcHkubWF0cml4ICgyIHggMSksIHRoZSBwb2ludCB0byBiZSBjbG9zZXN0IHRvLgorCisgIFJldHVybnM6CisgICAgbnVtcHkubWF0cml4ICgyIHggMSksIHRoZSBwb2ludC4KKyAgIiIiCisgIHJldHVybiBEb0NvZXJjZUdvYWwocmVnaW9uLCBLLCB3LCBSKVswXQorCitkZWYgRG9Db2VyY2VHb2FsKHJlZ2lvbiwgSywgdywgUik6CisgIGlmIHJlZ2lvbi5Jc0luc2lkZShSKToKKyAgICByZXR1cm4gKFIsIFRydWUpCisKKyAgcGVycGVuZGljdWxhcl92ZWN0b3IgPSBLLlQgLyBudW1weS5saW5hbGcubm9ybShLKQorICBwYXJhbGxlbF92ZWN0b3IgPSBudW1weS5tYXRyaXgoW1twZXJwZW5kaWN1bGFyX3ZlY3RvclsxLCAwXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy1wZXJwZW5kaWN1bGFyX3ZlY3RvclswLCAwXV1dKQorCisgICMgV2Ugd2FudCB0byBpbXBvc2UgdGhlIGNvbnN0cmFpbnQgSyAqIFggPSB3IG9uIHRoZSBwb2x5dG9wZSBIICogWCA8PSBrLgorICAjIFdlIGRvIHRoaXMgYnkgYnJlYWtpbmcgWCB1cCBpbnRvIHBhcmFsbGVsIGFuZCBwZXJwZW5kaWN1bGFyIGNvbXBvbmVudHMgdG8KKyAgIyB0aGUgaGFsZiBwbGFuZS4gIFRoaXMgZ2l2ZXMgdXMgdGhlIGZvbGxvd2luZyBlcXVhdGlvbi4KKyAgIworICAjICBwYXJhbGxlbCAqIChwYXJhbGxlbC5UIFxkb3QgWCkgKyBwZXJwZW5kaWN1bGFyICogKHBlcnBlbmRpY3VsYXIgXGRvdCBYKSkgPSBYCisgICMKKyAgIyBUaGVuLCBzdWJzdGl0dXRlIHRoaXMgaW50byB0aGUgcG9seXRvcGUuCisgICMKKyAgIyAgSCAqIChwYXJhbGxlbCAqIChwYXJhbGxlbC5UIFxkb3QgWCkgKyBwZXJwZW5kaWN1bGFyICogKHBlcnBlbmRpY3VsYXIgXGRvdCBYKSkgPD0gaworICAjCisgICMgU3Vic3RpdHV0ZSBLICogWCA9IHcKKyAgIworICAjIEggKiBwYXJhbGxlbCAqIChwYXJhbGxlbC5UIFxkb3QgWCkgKyBIICogcGVycGVuZGljdWxhciAqIHcgPD0gaworICAjCisgICMgTW92ZSBhbGwgdGhlIGtub3ducyB0byB0aGUgcmlnaHQgc2lkZS4KKyAgIworICAjIEggKiBwYXJhbGxlbCAqIChbcGFyYWxsZWwxIHBhcmFsbGVsMl0gKiBYKSA8PSBrIC0gSCAqIHBlcnBlbmRpY3VsYXIgKiB3CisgICMKKyAgIyBMZXQgdCA9IHBhcmFsbGVsLlQgXGRvdCBYLCB0aGUgY29tcG9uZW50IHBhcmFsbGVsIHRvIHRoZSBzdXJmYWNlLgorICAjCisgICMgSCAqIHBhcmFsbGVsICogdCA8PSBrIC0gSCAqIHBlcnBlbmRpY3VsYXIgKiB3CisgICMKKyAgIyBUaGlzIGlzIGEgcG9seXRvcGUgd2hpY2ggd2UgY2FuIHNvbHZlLCBhbmQgdXNlIHRvIGZpZ3VyZSBvdXQgdGhlIHJhbmdlIG9mIFgKKyAgIyB0aGF0IHdlIGNhcmUgYWJvdXQhCisKKyAgdF9wb2x5ID0gcG9seXRvcGUuSFBvbHl0b3BlKAorICAgICAgcmVnaW9uLkggKiBwYXJhbGxlbF92ZWN0b3IsCisgICAgICByZWdpb24uayAtIHJlZ2lvbi5IICogcGVycGVuZGljdWxhcl92ZWN0b3IgKiB3KQorCisgIHZlcnRpY2VzID0gdF9wb2x5LlZlcnRpY2VzKCkKKworICBpZiB2ZXJ0aWNlcy5zaGFwZVswXToKKyAgICAjIFRoZSByZWdpb24gZXhpc3RzIQorICAgICMgRmluZCB0aGUgY2xvc2VzdCB2ZXJ0ZXgKKyAgICBtaW5fZGlzdGFuY2UgPSBudW1weS5pbmZ0eQorICAgIGNsb3Nlc3RfcG9pbnQgPSBOb25lCisgICAgZm9yIHZlcnRleCBpbiB2ZXJ0aWNlczoKKyAgICAgIHBvaW50ID0gcGFyYWxsZWxfdmVjdG9yICogdmVydGV4ICsgcGVycGVuZGljdWxhcl92ZWN0b3IgKiB3CisgICAgICBsZW5ndGggPSBudW1weS5saW5hbGcubm9ybShSIC0gcG9pbnQpCisgICAgICBpZiBsZW5ndGggPCBtaW5fZGlzdGFuY2U6CisgICAgICAgIG1pbl9kaXN0YW5jZSA9IGxlbmd0aAorICAgICAgICBjbG9zZXN0X3BvaW50ID0gcG9pbnQKKworICAgIHJldHVybiAoY2xvc2VzdF9wb2ludCwgVHJ1ZSkKKyAgZWxzZToKKyAgICAjIEZpbmQgdGhlIHZlcnRleCBvZiB0aGUgc3BhY2UgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBsaW5lLgorICAgIHJlZ2lvbl92ZXJ0aWNlcyA9IHJlZ2lvbi5WZXJ0aWNlcygpCisgICAgbWluX2Rpc3RhbmNlID0gbnVtcHkuaW5mdHkKKyAgICBjbG9zZXN0X3BvaW50ID0gTm9uZQorICAgIGZvciB2ZXJ0ZXggaW4gcmVnaW9uX3ZlcnRpY2VzOgorICAgICAgcG9pbnQgPSB2ZXJ0ZXguVAorICAgICAgbGVuZ3RoID0gbnVtcHkuYWJzKChwZXJwZW5kaWN1bGFyX3ZlY3Rvci5UICogcG9pbnQpWzAsIDBdKQorICAgICAgaWYgbGVuZ3RoIDwgbWluX2Rpc3RhbmNlOgorICAgICAgICBtaW5fZGlzdGFuY2UgPSBsZW5ndGgKKyAgICAgICAgY2xvc2VzdF9wb2ludCA9IHBvaW50CisKKyAgICByZXR1cm4gKGNsb3Nlc3RfcG9pbnQsIEZhbHNlKQorCisKK2NsYXNzIFZlbG9jaXR5RHJpdmV0cmFpbk1vZGVsKGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0X2xvdz1UcnVlLCByaWdodF9sb3c9VHJ1ZSwgbmFtZT0iVmVsb2NpdHlEcml2ZXRyYWluTW9kZWwiKToKKyAgICBzdXBlcihWZWxvY2l0eURyaXZldHJhaW5Nb2RlbCwgc2VsZikuX19pbml0X18obmFtZSkKKyAgICBzZWxmLl9kcml2ZXRyYWluID0gZHJpdmV0cmFpbi5Ecml2ZXRyYWluKGxlZnRfbG93PWxlZnRfbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfbG93PXJpZ2h0X2xvdykKKyAgICBzZWxmLmR0ID0gMC4wMQorICAgIHNlbGYuQV9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbW3NlbGYuX2RyaXZldHJhaW4uQV9jb250aW51b3VzWzEsIDFdLCBzZWxmLl9kcml2ZXRyYWluLkFfY29udGludW91c1sxLCAzXV0sCisgICAgICAgICBbc2VsZi5fZHJpdmV0cmFpbi5BX2NvbnRpbnVvdXNbMywgMV0sIHNlbGYuX2RyaXZldHJhaW4uQV9jb250aW51b3VzWzMsIDNdXV0pCisKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1tzZWxmLl9kcml2ZXRyYWluLkJfY29udGludW91c1sxLCAwXSwgc2VsZi5fZHJpdmV0cmFpbi5CX2NvbnRpbnVvdXNbMSwgMV1dLAorICAgICAgICAgW3NlbGYuX2RyaXZldHJhaW4uQl9jb250aW51b3VzWzMsIDBdLCBzZWxmLl9kcml2ZXRyYWluLkJfY29udGludW91c1szLCAxXV1dKQorICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChudW1weS5leWUoMikpOworICAgIHNlbGYuRCA9IG51bXB5Lm1hdHJpeChudW1weS56ZXJvcygoMiwgMikpKTsKKworICAgIHNlbGYuQSwgc2VsZi5CID0gc2VsZi5Db250aW51b3VzVG9EaXNjcmV0ZShzZWxmLkFfY29udGludW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICAjIEZGICogWCA9IFUgKHN0ZWFkeSBzdGF0ZSkKKyAgICBzZWxmLkZGID0gc2VsZi5CLkkgKiAobnVtcHkuZXllKDIpIC0gc2VsZi5BKQorCisgICAgc2VsZi5QbGFjZUNvbnRyb2xsZXJQb2xlcyhbMC42LCAwLjZdKQorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFswLjAyLCAwLjAyXSkKKworICAgIHNlbGYuR19oaWdoID0gc2VsZi5fZHJpdmV0cmFpbi5HX2hpZ2gKKyAgICBzZWxmLkdfbG93ID0gc2VsZi5fZHJpdmV0cmFpbi5HX2xvdworICAgIHNlbGYuUiA9IHNlbGYuX2RyaXZldHJhaW4uUgorICAgIHNlbGYuciA9IHNlbGYuX2RyaXZldHJhaW4ucgorICAgIHNlbGYuS3YgPSBzZWxmLl9kcml2ZXRyYWluLkt2CisgICAgc2VsZi5LdCA9IHNlbGYuX2RyaXZldHJhaW4uS3QKKworICAgIHNlbGYuVV9tYXggPSBzZWxmLl9kcml2ZXRyYWluLlVfbWF4CisgICAgc2VsZi5VX21pbiA9IHNlbGYuX2RyaXZldHJhaW4uVV9taW4KKworCitjbGFzcyBWZWxvY2l0eURyaXZldHJhaW4ob2JqZWN0KToKKyAgSElHSCA9ICdoaWdoJworICBMT1cgPSAnbG93JworICBTSElGVElOR19VUCA9ICd1cCcKKyAgU0hJRlRJTkdfRE9XTiA9ICdkb3duJworCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLmRyaXZldHJhaW5fbG93X2xvdyA9IFZlbG9jaXR5RHJpdmV0cmFpbk1vZGVsKAorICAgICAgICBsZWZ0X2xvdz1UcnVlLCByaWdodF9sb3c9VHJ1ZSwgbmFtZT0nVmVsb2NpdHlEcml2ZXRyYWluTG93TG93JykKKyAgICBzZWxmLmRyaXZldHJhaW5fbG93X2hpZ2ggPSBWZWxvY2l0eURyaXZldHJhaW5Nb2RlbChsZWZ0X2xvdz1UcnVlLCByaWdodF9sb3c9RmFsc2UsIG5hbWU9J1ZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2gnKQorICAgIHNlbGYuZHJpdmV0cmFpbl9oaWdoX2xvdyA9IFZlbG9jaXR5RHJpdmV0cmFpbk1vZGVsKGxlZnRfbG93PUZhbHNlLCByaWdodF9sb3c9VHJ1ZSwgbmFtZSA9ICdWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93JykKKyAgICBzZWxmLmRyaXZldHJhaW5faGlnaF9oaWdoID0gVmVsb2NpdHlEcml2ZXRyYWluTW9kZWwobGVmdF9sb3c9RmFsc2UsIHJpZ2h0X2xvdz1GYWxzZSwgbmFtZSA9ICdWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaCcpCisKKyAgICAjIFggaXMgW2x2ZWwsIHJ2ZWxdCisgICAgc2VsZi5YID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAuMF0sCisgICAgICAgICBbMC4wXV0pCisKKyAgICBzZWxmLlVfcG9seSA9IHBvbHl0b3BlLkhQb2x5dG9wZSgKKyAgICAgICAgbnVtcHkubWF0cml4KFtbMSwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgWy0xLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMCwgMV0sCisgICAgICAgICAgICAgICAgICAgICAgWzAsIC0xXV0pLAorICAgICAgICBudW1weS5tYXRyaXgoW1sxMl0sCisgICAgICAgICAgICAgICAgICAgICAgWzEyXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTJdLAorICAgICAgICAgICAgICAgICAgICAgIFsxMl1dKSkKKworICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMTIuMF0sCisgICAgICAgICBbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbLTEyLjAwMDAwMDAwMDBdLAorICAgICAgICAgWy0xMi4wMDAwMDAwMDAwXV0pCisKKyAgICBzZWxmLmR0ID0gMC4wMQorCisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAuMF0sCisgICAgICAgICBbMC4wXV0pCisKKyAgICAjIHR0cnVzdCBpcyB0aGUgY29tcHJpbWlzZSBiZXR3ZWVuIGhhdmluZyBmdWxsIHRocm90dGxlIG5lZ2F0aXZlIGluZXJ0aWEsCisgICAgIyBhbmQgaGF2aW5nIG5vIHRocm90dGxlIG5lZ2F0aXZlIGluZXJ0aWEuICBBIHZhbHVlIG9mIDAgaXMgZnVsbCB0aHJvdHRsZQorICAgICMgaW5lcnRpYS4gIEEgdmFsdWUgb2YgMSBpcyBubyB0aHJvdHRsZSBuZWdhdGl2ZSBpbmVydGlhLgorICAgIHNlbGYudHRydXN0ID0gMS4wCisKKyAgICBzZWxmLmxlZnRfZ2VhciA9IFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKyAgICBzZWxmLnJpZ2h0X2dlYXIgPSBWZWxvY2l0eURyaXZldHJhaW4uTE9XCisgICAgc2VsZi5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24gPSAwLjAKKyAgICBzZWxmLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPSAwLjAKKyAgICBzZWxmLmxlZnRfY2ltID0gZHJpdmV0cmFpbi5DSU0oKQorICAgIHNlbGYucmlnaHRfY2ltID0gZHJpdmV0cmFpbi5DSU0oKQorCisgIGRlZiBJc0luR2VhcihzZWxmLCBnZWFyKToKKyAgICByZXR1cm4gZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSCBvciBnZWFyIGlzIFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKworICBkZWYgTW90b3JSUE0oc2VsZiwgc2hpZnRlcl9wb3NpdGlvbiwgdmVsb2NpdHkpOgorICAgIGlmIHNoaWZ0ZXJfcG9zaXRpb24gPiAwLjU6CisgICAgICByZXR1cm4gKHZlbG9jaXR5IC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkdfaGlnaCAvCisgICAgICAgICAgICAgIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5yKQorICAgIGVsc2U6CisgICAgICByZXR1cm4gKHZlbG9jaXR5IC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkdfbG93IC8KKyAgICAgICAgICAgICAgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLnIpCisKKyAgZGVmIEN1cnJlbnREcml2ZXRyYWluKHNlbGYpOgorICAgIGlmIHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uID4gMC41OgorICAgICAgaWYgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID4gMC41OgorICAgICAgICByZXR1cm4gc2VsZi5kcml2ZXRyYWluX2hpZ2hfaGlnaAorICAgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHNlbGYuZHJpdmV0cmFpbl9oaWdoX2xvdworICAgIGVsc2U6CisgICAgICBpZiBzZWxmLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPiAwLjU6CisgICAgICAgIHJldHVybiBzZWxmLmRyaXZldHJhaW5fbG93X2hpZ2gKKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBzZWxmLmRyaXZldHJhaW5fbG93X2xvdworCisgIGRlZiBTaW1TaGlmdGVyKHNlbGYsIGdlYXIsIHNoaWZ0ZXJfcG9zaXRpb24pOgorICAgIGlmIGdlYXIgaXMgVmVsb2NpdHlEcml2ZXRyYWluLkhJR0ggb3IgZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uU0hJRlRJTkdfVVA6CisgICAgICBzaGlmdGVyX3Bvc2l0aW9uID0gbWluKHNoaWZ0ZXJfcG9zaXRpb24gKyAwLjUsIDEuMCkKKyAgICBlbHNlOgorICAgICAgc2hpZnRlcl9wb3NpdGlvbiA9IG1heChzaGlmdGVyX3Bvc2l0aW9uIC0gMC41LCAwLjApCisKKyAgICBpZiBzaGlmdGVyX3Bvc2l0aW9uID09IDEuMDoKKyAgICAgIGdlYXIgPSBWZWxvY2l0eURyaXZldHJhaW4uSElHSAorICAgIGVsaWYgc2hpZnRlcl9wb3NpdGlvbiA9PSAwLjA6CisgICAgICBnZWFyID0gVmVsb2NpdHlEcml2ZXRyYWluLkxPVworCisgICAgcmV0dXJuIGdlYXIsIHNoaWZ0ZXJfcG9zaXRpb24KKworICBkZWYgQ29tcHV0ZUdlYXIoc2VsZiwgd2hlZWxfdmVsb2NpdHksIHNob3VsZF9wcmludD1GYWxzZSwgY3VycmVudF9nZWFyPUZhbHNlLCBnZWFyX25hbWU9Tm9uZSk6CisgICAgaGlnaF9vbWVnYSA9ICh3aGVlbF92ZWxvY2l0eSAvIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5HX2hpZ2ggLworICAgICAgICAgICAgICAgICAgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLnIpCisgICAgbG93X29tZWdhID0gKHdoZWVsX3ZlbG9jaXR5IC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkdfbG93IC8KKyAgICAgICAgICAgICAgICAgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLnIpCisgICAgI3ByaW50IGdlYXJfbmFtZSwgIk1vdG9yIEVuZXJneSBEaWZmZXJlbmNlLiIsIDAuNSAqIDAuMDAwMTQwMDMyNjQ3ICogKGxvd19vbWVnYSAqIGxvd19vbWVnYSAtIGhpZ2hfb21lZ2EgKiBoaWdoX29tZWdhKSwgImpvdWxlcyIKKyAgICBoaWdoX3RvcnF1ZSA9ICgoMTIuMCAtIGhpZ2hfb21lZ2EgLyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuS3YpICoKKyAgICAgICAgICAgICAgICAgICBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuS3QgLyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuUikKKyAgICBsb3dfdG9ycXVlID0gKCgxMi4wIC0gbG93X29tZWdhIC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkt2KSAqCisgICAgICAgICAgICAgICAgICBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuS3QgLyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuUikKKyAgICBoaWdoX3Bvd2VyID0gaGlnaF90b3JxdWUgKiBoaWdoX29tZWdhCisgICAgbG93X3Bvd2VyID0gbG93X3RvcnF1ZSAqIGxvd19vbWVnYQorICAgICNpZiBzaG91bGRfcHJpbnQ6CisgICAgIyAgcHJpbnQgZ2Vhcl9uYW1lLCAiSGlnaCBvbWVnYSIsIGhpZ2hfb21lZ2EsICJMb3cgb21lZ2EiLCBsb3dfb21lZ2EKKyAgICAjICBwcmludCBnZWFyX25hbWUsICJIaWdoIHRvcnF1ZSIsIGhpZ2hfdG9ycXVlLCAiTG93IHRvcnF1ZSIsIGxvd190b3JxdWUKKyAgICAjICBwcmludCBnZWFyX25hbWUsICJIaWdoIHBvd2VyIiwgaGlnaF9wb3dlciwgIkxvdyBwb3dlciIsIGxvd19wb3dlcgorCisgICAgIyBTaGlmdCBhbGdvcml0aG0gaW1wcm92ZW1lbnRzLgorICAgICMgVE9ETyhhc2NodWgpOgorICAgICMgSXQgdGFrZXMgdGltZSB0byBzaGlmdC4gIFNoaWZ0aW5nIGRvd24gZm9yIDEgY3ljbGUgZG9lc24ndCBtYWtlIHNlbnNlCisgICAgIyBiZWNhdXNlIHlvdSB3aWxsIGVuZCB1cCBzbG93ZXIgdGhhbiB3aXRob3V0IHNoaWZ0aW5nLiAgRmlndXJlIG91dCBob3cKKyAgICAjIHRvIGluY2x1ZGUgdGhhdCBpbmZvLgorICAgICMgSWYgdGhlIGRyaXZlciBpcyBzdGlsbCBpbiBoaWdoIGdlYXIsIGJ1dCBpc24ndCBhc2tpbmcgZm9yIHRoZSBleHRyYSBwb3dlcgorICAgICMgZnJvbSBsb3cgZ2VhciwgZG9uJ3Qgc2hpZnQgdW50aWwgaGUgYXNrcyBmb3IgaXQuCisgICAgZ29hbF9nZWFyX2lzX2hpZ2ggPSBoaWdoX3Bvd2VyID4gbG93X3Bvd2VyCisgICAgI2dvYWxfZ2Vhcl9pc19oaWdoID0gVHJ1ZQorCisgICAgaWYgbm90IHNlbGYuSXNJbkdlYXIoY3VycmVudF9nZWFyKToKKyAgICAgIHByaW50IGdlYXJfbmFtZSwgJ05vdCBpbiBnZWFyLicKKyAgICAgIHJldHVybiBjdXJyZW50X2dlYXIKKyAgICBlbHNlOgorICAgICAgaXNfaGlnaCA9IGN1cnJlbnRfZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSAorICAgICAgaWYgaXNfaGlnaCAhPSBnb2FsX2dlYXJfaXNfaGlnaDoKKyAgICAgICAgaWYgZ29hbF9nZWFyX2lzX2hpZ2g6CisgICAgICAgICAgcHJpbnQgZ2Vhcl9uYW1lLCAnU2hpZnRpbmcgdXAuJworICAgICAgICAgIHJldHVybiBWZWxvY2l0eURyaXZldHJhaW4uU0hJRlRJTkdfVVAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBwcmludCBnZWFyX25hbWUsICdTaGlmdGluZyBkb3duLicKKyAgICAgICAgICByZXR1cm4gVmVsb2NpdHlEcml2ZXRyYWluLlNISUZUSU5HX0RPV04KKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBjdXJyZW50X2dlYXIKKworICBkZWYgRmlsdGVyVmVsb2NpdHkoc2VsZiwgdGhyb3R0bGUpOgorICAgICMgSW52ZXJ0IHRoZSBwbGFudCB0byBmaWd1cmUgb3V0IGhvdyB0aGUgdmVsb2NpdHkgZmlsdGVyIHdvdWxkIGhhdmUgdG8gd29yaworICAgICMgb3V0IGluIG9yZGVyIHRvIGZpbHRlciBvdXQgdGhlIGZvcndhcmRzIG5lZ2F0aXZlIGluZXJ0aWEuCisgICAgIyBUaGlzIG1hdGggYXNzdW1lcyB0aGF0IHRoZSBsZWZ0IGFuZCByaWdodCBwb3dlciBhbmQgdmVsb2NpdHkgYXJlIGVxdWFsLgorCisgICAgIyBUaGUgdGhyb3R0bGUgZmlsdGVyIHNob3VsZCBmaWx0ZXIgc3VjaCB0aGF0IHRoZSBtb3RvciBpbiB0aGUgaGlnaGVzdCBnZWFyCisgICAgIyBzaG91bGQgYmUgY29udHJvbGxpbmcgdGhlIHRpbWUgY29uc3RhbnQuCisgICAgIyBEbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIGluZGV4IG9mIEZGIHRoYXQgaGFzIHRoZSBsb3dlc3QgdmFsdWUsIGFuZCBjb21wdXRpbmcKKyAgICAjIHRoZSBzdW1zIHVzaW5nIHRoYXQgaW5kZXguCisgICAgRkZfc3VtID0gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkZGLnN1bShheGlzPTEpCisgICAgbWluX0ZGX3N1bV9pbmRleCA9IG51bXB5LmFyZ21pbihGRl9zdW0pCisgICAgbWluX0ZGX3N1bSA9IEZGX3N1bVttaW5fRkZfc3VtX2luZGV4LCAwXQorICAgIG1pbl9LX3N1bSA9IHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5LW21pbl9GRl9zdW1faW5kZXgsIDpdLnN1bSgpCisgICAgIyBDb21wdXRlIHRoZSBGRiBzdW0gZm9yIGhpZ2ggZ2Vhci4KKyAgICBoaWdoX21pbl9GRl9zdW0gPSBzZWxmLmRyaXZldHJhaW5faGlnaF9oaWdoLkZGWzAsIDpdLnN1bSgpCisKKyAgICAjIFUgPSBzZWxmLktbMCwgOl0uc3VtKCkgKiAoUiAtIHhfYXZnKSArIHNlbGYuRkZbMCwgOl0uc3VtKCkgKiBSCisgICAgIyB0aHJvdHRsZSAqIDEyLjAgPSAoc2VsZi5LWzAsIDpdLnN1bSgpICsgc2VsZi5GRlswLCA6XS5zdW0oKSkgKiBSCisgICAgIyAgICAgICAgICAgICAgICAgICAtIHNlbGYuS1swLCA6XS5zdW0oKSAqIHhfYXZnCisKKyAgICAjIFIgPSAodGhyb3R0bGUgKiAxMi4wICsgc2VsZi5LWzAsIDpdLnN1bSgpICogeF9hdmcpIC8KKyAgICAjICAgICAoc2VsZi5LWzAsIDpdLnN1bSgpICsgc2VsZi5GRlswLCA6XS5zdW0oKSkKKworICAgICMgVSA9IChLICsgRkYpICogUiAtIEsgKiBYCisgICAgIyAoSyArIEZGKSBeLTEgKiAoVSArIEsgKiBYKSA9IFIKKworICAgICMgU2NhbGUgdGhyb3R0bGUgYnkgbWluX0ZGX3N1bSAvIGhpZ2hfbWluX0ZGX3N1bS4gIFRoaXMgd2lsbCBtYWtlIGxvdyBnZWFyCisgICAgIyBoYXZlIHRoZSBzYW1lIHZlbG9jaXR5IGdvYWwgYXMgaGlnaCBnZWFyLCBhbmQgc28gdGhhdCB0aGUgcm9ib3Qgd2lsbCBob2xkCisgICAgIyB0aGUgc2FtZSBzcGVlZCBmb3IgdGhlIHNhbWUgdGhyb3R0bGUgZm9yIGFsbCBnZWFycy4KKyAgICBhZGp1c3RlZF9mZl92b2x0YWdlID0gbnVtcHkuY2xpcCh0aHJvdHRsZSAqIDEyLjAgKiBtaW5fRkZfc3VtIC8gaGlnaF9taW5fRkZfc3VtLCAtMTIuMCwgMTIuMCkKKyAgICByZXR1cm4gKChhZGp1c3RlZF9mZl92b2x0YWdlICsgc2VsZi50dHJ1c3QgKiBtaW5fS19zdW0gKiAoc2VsZi5YWzAsIDBdICsgc2VsZi5YWzEsIDBdKSAvIDIuMCkKKyAgICAgICAgICAgIC8gKHNlbGYudHRydXN0ICogbWluX0tfc3VtICsgbWluX0ZGX3N1bSkpCisKKyAgZGVmIFVwZGF0ZShzZWxmLCB0aHJvdHRsZSwgc3RlZXJpbmcpOgorICAgICMgU2hpZnQgaW50byB0aGUgZ2VhciB3aGljaCBzZW5kcyB0aGUgbW9zdCBwb3dlciB0byB0aGUgZmxvb3IuCisgICAgIyBUaGlzIGlzIHRoZSBzYW1lIGFzIHNlbmRpbmcgdGhlIG1vc3QgdG9ycXVlIGRvd24gdG8gdGhlIGZsb29yIGF0IHRoZQorICAgICMgd2hlZWwuCisKKyAgICBzZWxmLmxlZnRfZ2VhciA9IHNlbGYucmlnaHRfZ2VhciA9IFRydWUKKyAgICBpZiBUcnVlOgorICAgICAgc2VsZi5sZWZ0X2dlYXIgPSBzZWxmLkNvbXB1dGVHZWFyKHNlbGYuWFswLCAwXSwgc2hvdWxkX3ByaW50PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9nZWFyPXNlbGYubGVmdF9nZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlYXJfbmFtZT0ibGVmdCIpCisgICAgICBzZWxmLnJpZ2h0X2dlYXIgPSBzZWxmLkNvbXB1dGVHZWFyKHNlbGYuWFsxLCAwXSwgc2hvdWxkX3ByaW50PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZ2Vhcj1zZWxmLnJpZ2h0X2dlYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlYXJfbmFtZT0icmlnaHQiKQorICAgICAgaWYgc2VsZi5Jc0luR2VhcihzZWxmLmxlZnRfZ2Vhcik6CisgICAgICAgIHNlbGYubGVmdF9jaW0uWFswLCAwXSA9IHNlbGYuTW90b3JSUE0oc2VsZi5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24sIHNlbGYuWFswLCAwXSkKKworICAgICAgaWYgc2VsZi5Jc0luR2VhcihzZWxmLnJpZ2h0X2dlYXIpOgorICAgICAgICBzZWxmLnJpZ2h0X2NpbS5YWzAsIDBdID0gc2VsZi5Nb3RvclJQTShzZWxmLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24sIHNlbGYuWFswLCAwXSkKKworICAgIGlmIHNlbGYuSXNJbkdlYXIoc2VsZi5sZWZ0X2dlYXIpIGFuZCBzZWxmLklzSW5HZWFyKHNlbGYucmlnaHRfZ2Vhcik6CisgICAgICAjIEZpbHRlciB0aGUgdGhyb3R0bGUgdG8gcHJvdmlkZSBhIG5pY2VyIHJlc3BvbnNlLgorICAgICAgZnZlbCA9IHNlbGYuRmlsdGVyVmVsb2NpdHkodGhyb3R0bGUpCisKKyAgICAgICMgQ29uc3RhbnQgcmFkaXVzIG1lYW5zIHRoYXQgYW5ndWFsYXJfdmVsb2NpdHkgLyBsaW5lYXJfdmVsb2NpdHkgPSBjb25zdGFudC4KKyAgICAgICMgQ29tcHV0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgdmVsb2NpdGllcy4KKyAgICAgIHN0ZWVyaW5nX3ZlbG9jaXR5ID0gbnVtcHkuYWJzKGZ2ZWwpICogc3RlZXJpbmcKKyAgICAgIGxlZnRfdmVsb2NpdHkgPSBmdmVsIC0gc3RlZXJpbmdfdmVsb2NpdHkKKyAgICAgIHJpZ2h0X3ZlbG9jaXR5ID0gZnZlbCArIHN0ZWVyaW5nX3ZlbG9jaXR5CisKKyAgICAgICMgV3JpdGUgdGhpcyBjb25zdHJhaW50IGluIHRoZSBmb3JtIG9mIEsgKiBSID0gdworICAgICAgIyBhbmd1bGFyIHZlbG9jaXR5IC8gbGluZWFyIHZlbG9jaXR5ID0gY29uc3RhbnQKKyAgICAgICMgKGxlZnQgLSByaWdodCkgLyAobGVmdCArIHJpZ2h0KSA9IGNvbnN0YW50CisgICAgICAjIGxlZnQgLSByaWdodCA9IGNvbnN0YW50ICogbGVmdCArIGNvbnN0YW50ICogcmlnaHQKKworICAgICAgIyAoZnZlbCAtIHN0ZWVyaW5nICogbnVtcHkuYWJzKGZ2ZWwpIC0gZnZlbCAtIHN0ZWVyaW5nICogbnVtcHkuYWJzKGZ2ZWwpKSAvCisgICAgICAjICAoZnZlbCAtIHN0ZWVyaW5nICogbnVtcHkuYWJzKGZ2ZWwpICsgZnZlbCArIHN0ZWVyaW5nICogbnVtcHkuYWJzKGZ2ZWwpKSA9CisgICAgICAjICAgICAgIGNvbnN0YW50CisgICAgICAjICgtIDIgKiBzdGVlcmluZyAqIG51bXB5LmFicyhmdmVsKSkgLyAoMiAqIGZ2ZWwpID0gY29uc3RhbnQKKyAgICAgICMgKC1zdGVlcmluZyAqIHNpZ24oZnZlbCkpID0gY29uc3RhbnQKKyAgICAgICMgKC1zdGVlcmluZyAqIHNpZ24oZnZlbCkpICogKGxlZnQgKyByaWdodCkgPSBsZWZ0IC0gcmlnaHQKKyAgICAgICMgKHN0ZWVyaW5nICogc2lnbihmdmVsKSArIDEpICogbGVmdCArIChzdGVlcmluZyAqIHNpZ24oZnZlbCkgLSAxKSAqIHJpZ2h0ID0gMAorCisgICAgICBlcXVhbGl0eV9rID0gbnVtcHkubWF0cml4KAorICAgICAgICAgIFtbMSArIHN0ZWVyaW5nICogbnVtcHkuc2lnbihmdmVsKSwgLSgxIC0gc3RlZXJpbmcgKiBudW1weS5zaWduKGZ2ZWwpKV1dKQorICAgICAgZXF1YWxpdHlfdyA9IDAuMAorCisgICAgICBzZWxmLlJbMCwgMF0gPSBsZWZ0X3ZlbG9jaXR5CisgICAgICBzZWxmLlJbMSwgMF0gPSByaWdodF92ZWxvY2l0eQorCisgICAgICAjIENvbnN0cnVjdCBhIGNvbnN0cmFpbnQgb24gUiBieSBtYW5pcHVsYXRpbmcgdGhlIGNvbnN0cmFpbnQgb24gVQorICAgICAgIyBTdGFydCBvdXQgd2l0aCBIICogVSA8PSBrCisgICAgICAjIFUgPSBGRiAqIFIgKyBLICogKFIgLSBYKQorICAgICAgIyBIICogKEZGICogUiArIEsgKiBSIC0gSyAqIFgpIDw9IGsKKyAgICAgICMgSCAqIChGRiArIEspICogUiA8PSBrICsgSCAqIEsgKiBYCisgICAgICBSX3BvbHkgPSBwb2x5dG9wZS5IUG9seXRvcGUoCisgICAgICAgICAgc2VsZi5VX3BvbHkuSCAqIChzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuSyArIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5GRiksCisgICAgICAgICAgc2VsZi5VX3BvbHkuayArIHNlbGYuVV9wb2x5LkggKiBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuSyAqIHNlbGYuWCkKKworICAgICAgIyBMaW1pdCBSIGJhY2sgaW5zaWRlIHRoZSBib3guCisgICAgICBzZWxmLmJveGVkX1IgPSBDb2VyY2VHb2FsKFJfcG9seSwgZXF1YWxpdHlfaywgZXF1YWxpdHlfdywgc2VsZi5SKQorCisgICAgICBGRl92b2x0cyA9IHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5GRiAqIHNlbGYuYm94ZWRfUgorICAgICAgc2VsZi5VX2lkZWFsID0gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLksgKiAoc2VsZi5ib3hlZF9SIC0gc2VsZi5YKSArIEZGX3ZvbHRzCisgICAgZWxzZToKKyAgICAgIHByaW50ICdOb3QgYWxsIGluIGdlYXInCisgICAgICBpZiBub3Qgc2VsZi5Jc0luR2VhcihzZWxmLmxlZnRfZ2VhcikgYW5kIG5vdCBzZWxmLklzSW5HZWFyKHNlbGYucmlnaHRfZ2Vhcik6CisgICAgICAgICMgVE9ETyhhdXN0aW4pOiBVc2UgYmF0dGVyeSB2b2x0cyBoZXJlLgorICAgICAgICBSX2xlZnQgPSBzZWxmLk1vdG9yUlBNKHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uLCBzZWxmLlhbMCwgMF0pCisgICAgICAgIHNlbGYuVV9pZGVhbFswLCAwXSA9IG51bXB5LmNsaXAoCisgICAgICAgICAgICBzZWxmLmxlZnRfY2ltLksgKiAoUl9sZWZ0IC0gc2VsZi5sZWZ0X2NpbS5YKSArIFJfbGVmdCAvIHNlbGYubGVmdF9jaW0uS3YsCisgICAgICAgICAgICBzZWxmLmxlZnRfY2ltLlVfbWluLCBzZWxmLmxlZnRfY2ltLlVfbWF4KQorICAgICAgICBzZWxmLmxlZnRfY2ltLlVwZGF0ZShzZWxmLlVfaWRlYWxbMCwgMF0pCisKKyAgICAgICAgUl9yaWdodCA9IHNlbGYuTW90b3JSUE0oc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uLCBzZWxmLlhbMSwgMF0pCisgICAgICAgIHNlbGYuVV9pZGVhbFsxLCAwXSA9IG51bXB5LmNsaXAoCisgICAgICAgICAgICBzZWxmLnJpZ2h0X2NpbS5LICogKFJfcmlnaHQgLSBzZWxmLnJpZ2h0X2NpbS5YKSArIFJfcmlnaHQgLyBzZWxmLnJpZ2h0X2NpbS5LdiwKKyAgICAgICAgICAgIHNlbGYucmlnaHRfY2ltLlVfbWluLCBzZWxmLnJpZ2h0X2NpbS5VX21heCkKKyAgICAgICAgc2VsZi5yaWdodF9jaW0uVXBkYXRlKHNlbGYuVV9pZGVhbFsxLCAwXSkKKyAgICAgIGVsc2U6CisgICAgICAgIGFzc2VydCBGYWxzZQorCisgICAgc2VsZi5VID0gbnVtcHkuY2xpcChzZWxmLlVfaWRlYWwsIHNlbGYuVV9taW4sIHNlbGYuVV9tYXgpCisKKyAgICAjIFRPRE8oYXVzdGluKTogTW9kZWwgdGhlIHJvYm90IGFzIG5vdCBhY2NlbGVyYXRpbmcgd2hlbiB5b3Ugc2hpZnQuLi4KKyAgICAjIFRoaXMgaGFjayBvbmx5IHdvcmtzIHdoZW4geW91IHNoaWZ0IGF0IHRoZSBzYW1lIHRpbWUuCisgICAgaWYgc2VsZi5Jc0luR2VhcihzZWxmLmxlZnRfZ2VhcikgYW5kIHNlbGYuSXNJbkdlYXIoc2VsZi5yaWdodF9nZWFyKToKKyAgICAgIHNlbGYuWCA9IHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5BICogc2VsZi5YICsgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkIgKiBzZWxmLlUKKworICAgIHNlbGYubGVmdF9nZWFyLCBzZWxmLmxlZnRfc2hpZnRlcl9wb3NpdGlvbiA9IHNlbGYuU2ltU2hpZnRlcigKKyAgICAgICAgc2VsZi5sZWZ0X2dlYXIsIHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uKQorICAgIHNlbGYucmlnaHRfZ2Vhciwgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID0gc2VsZi5TaW1TaGlmdGVyKAorICAgICAgICBzZWxmLnJpZ2h0X2dlYXIsIHNlbGYucmlnaHRfc2hpZnRlcl9wb3NpdGlvbikKKworICAgIHByaW50ICJVIGlzIiwgc2VsZi5VWzAsIDBdLCBzZWxmLlVbMSwgMF0KKyAgICBwcmludCAiTGVmdCBzaGlmdGVyIiwgc2VsZi5sZWZ0X2dlYXIsIHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uLCAiUmlnaHQgc2hpZnRlciIsIHNlbGYucmlnaHRfZ2Vhciwgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uCisKKworZGVmIG1haW4oYXJndik6CisgIHZkcml2ZXRyYWluID0gVmVsb2NpdHlEcml2ZXRyYWluKCkKKworICBpZiBsZW4oYXJndikgIT0gNzoKKyAgICBwcmludCAiRXhwZWN0ZWQgLmggZmlsZSBuYW1lIGFuZCAuY2MgZmlsZSBuYW1lIgorICBlbHNlOgorICAgIGRvZ19sb29wX3dyaXRlciA9IGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcFdyaXRlcigKKyAgICAgICAgIlZlbG9jaXR5RHJpdmV0cmFpbiIsIFt2ZHJpdmV0cmFpbi5kcml2ZXRyYWluX2xvd19sb3csCisgICAgICAgICAgICAgICAgICAgICAgIHZkcml2ZXRyYWluLmRyaXZldHJhaW5fbG93X2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgIHZkcml2ZXRyYWluLmRyaXZldHJhaW5faGlnaF9sb3csCisgICAgICAgICAgICAgICAgICAgICAgIHZkcml2ZXRyYWluLmRyaXZldHJhaW5faGlnaF9oaWdoXSkKKworICAgIGlmIGFyZ3ZbMV1bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGRvZ19sb29wX3dyaXRlci5Xcml0ZShhcmd2WzJdLCBhcmd2WzFdKQorICAgIGVsc2U6CisgICAgICBkb2dfbG9vcF93cml0ZXIuV3JpdGUoYXJndlsxXSwgYXJndlsyXSkKKworICAgIGNpbV93cml0ZXIgPSBjb250cm9sX2xvb3AuQ29udHJvbExvb3BXcml0ZXIoCisgICAgICAgICJDSU0iLCBbZHJpdmV0cmFpbi5DSU0oKV0pCisKKyAgICBpZiBhcmd2WzVdWy0zOl0gPT0gJy5jYyc6CisgICAgICBjaW1fd3JpdGVyLldyaXRlKGFyZ3ZbNl0sIGFyZ3ZbNV0pCisgICAgZWxzZToKKyAgICAgIGNpbV93cml0ZXIuV3JpdGUoYXJndls1XSwgYXJndls2XSkKKyAgICByZXR1cm4KKworICB2bF9wbG90ID0gW10KKyAgdnJfcGxvdCA9IFtdCisgIHVsX3Bsb3QgPSBbXQorICB1cl9wbG90ID0gW10KKyAgcmFkaXVzX3Bsb3QgPSBbXQorICB0X3Bsb3QgPSBbXQorICBsZWZ0X2dlYXJfcGxvdCA9IFtdCisgIHJpZ2h0X2dlYXJfcGxvdCA9IFtdCisgIHZkcml2ZXRyYWluLmxlZnRfc2hpZnRlcl9wb3NpdGlvbiA9IDAuMAorICB2ZHJpdmV0cmFpbi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID0gMC4wCisgIHZkcml2ZXRyYWluLmxlZnRfZ2VhciA9IFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKyAgdmRyaXZldHJhaW4ucmlnaHRfZ2VhciA9IFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKworICBwcmludCAiSyBpcyIsIHZkcml2ZXRyYWluLkN1cnJlbnREcml2ZXRyYWluKCkuSworCisgIGlmIHZkcml2ZXRyYWluLmxlZnRfZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSDoKKyAgICBwcmludCAiTGVmdCBpcyBoaWdoIgorICBlbHNlOgorICAgIHByaW50ICJMZWZ0IGlzIGxvdyIKKyAgaWYgdmRyaXZldHJhaW4ucmlnaHRfZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSDoKKyAgICBwcmludCAiUmlnaHQgaXMgaGlnaCIKKyAgZWxzZToKKyAgICBwcmludCAiUmlnaHQgaXMgbG93IgorCisgIGZvciB0IGluIG51bXB5LmFyYW5nZSgwLCAxLjcsIHZkcml2ZXRyYWluLmR0KToKKyAgICBpZiB0IDwgMC41OgorICAgICAgdmRyaXZldHJhaW4uVXBkYXRlKHRocm90dGxlPTAuMDAsIHN0ZWVyaW5nPTEuMCkKKyAgICBlbGlmIHQgPCAxLjI6CisgICAgICB2ZHJpdmV0cmFpbi5VcGRhdGUodGhyb3R0bGU9MC41LCBzdGVlcmluZz0xLjApCisgICAgZWxzZToKKyAgICAgIHZkcml2ZXRyYWluLlVwZGF0ZSh0aHJvdHRsZT0wLjAwLCBzdGVlcmluZz0xLjApCisgICAgdF9wbG90LmFwcGVuZCh0KQorICAgIHZsX3Bsb3QuYXBwZW5kKHZkcml2ZXRyYWluLlhbMCwgMF0pCisgICAgdnJfcGxvdC5hcHBlbmQodmRyaXZldHJhaW4uWFsxLCAwXSkKKyAgICB1bF9wbG90LmFwcGVuZCh2ZHJpdmV0cmFpbi5VWzAsIDBdKQorICAgIHVyX3Bsb3QuYXBwZW5kKHZkcml2ZXRyYWluLlVbMSwgMF0pCisgICAgbGVmdF9nZWFyX3Bsb3QuYXBwZW5kKCh2ZHJpdmV0cmFpbi5sZWZ0X2dlYXIgaXMgVmVsb2NpdHlEcml2ZXRyYWluLkhJR0gpICogMi4wIC0gMTAuMCkKKyAgICByaWdodF9nZWFyX3Bsb3QuYXBwZW5kKCh2ZHJpdmV0cmFpbi5yaWdodF9nZWFyIGlzIFZlbG9jaXR5RHJpdmV0cmFpbi5ISUdIKSAqIDIuMCAtIDEwLjApCisKKyAgICBmd2RfdmVsb2NpdHkgPSAodmRyaXZldHJhaW4uWFsxLCAwXSArIHZkcml2ZXRyYWluLlhbMCwgMF0pIC8gMgorICAgIHR1cm5fdmVsb2NpdHkgPSAodmRyaXZldHJhaW4uWFsxLCAwXSAtIHZkcml2ZXRyYWluLlhbMCwgMF0pCisgICAgaWYgYWJzKGZ3ZF92ZWxvY2l0eSkgPCAwLjAwMDAwMDE6CisgICAgICByYWRpdXNfcGxvdC5hcHBlbmQodHVybl92ZWxvY2l0eSkKKyAgICBlbHNlOgorICAgICAgcmFkaXVzX3Bsb3QuYXBwZW5kKHR1cm5fdmVsb2NpdHkgLyBmd2RfdmVsb2NpdHkpCisKKyAgY2ltX3ZlbG9jaXR5X3Bsb3QgPSBbXQorICBjaW1fdm9sdGFnZV9wbG90ID0gW10KKyAgY2ltX3RpbWUgPSBbXQorICBjaW0gPSBkcml2ZXRyYWluLkNJTSgpCisgIFIgPSBudW1weS5tYXRyaXgoW1szMDBdXSkKKyAgZm9yIHQgaW4gbnVtcHkuYXJhbmdlKDAsIDAuNSwgY2ltLmR0KToKKyAgICBVID0gbnVtcHkuY2xpcChjaW0uSyAqIChSIC0gY2ltLlgpICsgUiAvIGNpbS5LdiwgY2ltLlVfbWluLCBjaW0uVV9tYXgpCisgICAgY2ltLlVwZGF0ZShVKQorICAgIGNpbV92ZWxvY2l0eV9wbG90LmFwcGVuZChjaW0uWFswLCAwXSkKKyAgICBjaW1fdm9sdGFnZV9wbG90LmFwcGVuZChVWzAsIDBdICogMTApCisgICAgY2ltX3RpbWUuYXBwZW5kKHQpCisgIHB5bGFiLnBsb3QoY2ltX3RpbWUsIGNpbV92ZWxvY2l0eV9wbG90LCBsYWJlbD0nY2ltIHNwaW51cCcpCisgIHB5bGFiLnBsb3QoY2ltX3RpbWUsIGNpbV92b2x0YWdlX3Bsb3QsIGxhYmVsPSdjaW0gdm9sdGFnZScpCisgIHB5bGFiLmxlZ2VuZCgpCisgIHB5bGFiLnNob3coKQorCisgICMgVE9ETyhhdXN0aW4pOgorICAjIFNoaWZ0aW5nIGNvbXBlbnNhdGlvbi4KKworICAjIFRpZ2h0ZW4gdGhlIHR1cm4uCisgICMgQ2xvc2VkIGxvb3AgZHJpdmUuCisKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHZsX3Bsb3QsIGxhYmVsPSdsZWZ0IHZlbG9jaXR5JykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHZyX3Bsb3QsIGxhYmVsPSdyaWdodCB2ZWxvY2l0eScpCisgIHB5bGFiLnBsb3QodF9wbG90LCB1bF9wbG90LCBsYWJlbD0nbGVmdCB2b2x0YWdlJykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHVyX3Bsb3QsIGxhYmVsPSdyaWdodCB2b2x0YWdlJykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHJhZGl1c19wbG90LCBsYWJlbD0ncmFkaXVzJykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIGxlZnRfZ2Vhcl9wbG90LCBsYWJlbD0nbGVmdCBnZWFyIGhpZ2gnKQorICBweWxhYi5wbG90KHRfcGxvdCwgcmlnaHRfZ2Vhcl9wbG90LCBsYWJlbD0ncmlnaHQgZ2VhciBoaWdoJykKKyAgcHlsYWIubGVnZW5kKCkKKyAgcHlsYWIuc2hvdygpCisgIHJldHVybiAwCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9weXRob24vcG9seWRyaXZldHJhaW5fdGVzdC5weSBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvcHl0aG9uL3BvbHlkcml2ZXRyYWluX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM0Y2RjYQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvcHl0aG9uL3BvbHlkcml2ZXRyYWluX3Rlc3QucHkKQEAgLTAsMCArMSw4MiBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IHBvbHlkcml2ZXRyYWluCitpbXBvcnQgbnVtcHkKK2Zyb20gbnVtcHkudGVzdGluZyBpbXBvcnQgKgoraW1wb3J0IHBvbHl0b3BlCitpbXBvcnQgdW5pdHRlc3QKKworX19hdXRob3JfXyA9ICdBdXN0aW4gU2NodWggKGF1c3Rpbi5saW51eEBnbWFpbC5jb20pJworCisKK2NsYXNzIFRlc3RWZWxvY2l0eURyaXZldHJhaW4odW5pdHRlc3QuVGVzdENhc2UpOgorICBkZWYgTWFrZUJveChzZWxmLCB4MV9taW4sIHgxX21heCwgeDJfbWluLCB4Ml9tYXgpOgorICAgIEggPSBudW1weS5tYXRyaXgoW1sxLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICBbLTEsIDBdLAorICAgICAgICAgICAgICAgICAgICAgIFswLCAxXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMCwgLTFdXSkKKyAgICBLID0gbnVtcHkubWF0cml4KFtbeDFfbWF4XSwKKyAgICAgICAgICAgICAgICAgICAgICBbLXgxX21pbl0sCisgICAgICAgICAgICAgICAgICAgICAgW3gyX21heF0sCisgICAgICAgICAgICAgICAgICAgICAgWy14Ml9taW5dXSkKKyAgICByZXR1cm4gcG9seXRvcGUuSFBvbHl0b3BlKEgsIEspCisKKyAgZGVmIHRlc3RfY29lcmNlX2luc2lkZShzZWxmKToKKyAgICAiIiJUZXN0cyBjb2VyY2lvbiB3aGVuIHRoZSBwb2ludCBpcyBpbnNpZGUgdGhlIGJveC4iIiIKKyAgICBib3ggPSBzZWxmLk1ha2VCb3goMSwgMiwgMSwgMikKKworICAgICMgeDEgPSB4MgorICAgIEsgPSBudW1weS5tYXRyaXgoW1sxLCAtMV1dKQorICAgIHcgPSAwCisKKyAgICBhc3NlcnRfYXJyYXlfZXF1YWwocG9seWRyaXZldHJhaW4uQ29lcmNlR29hbChib3gsIEssIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcHkubWF0cml4KFtbMS41XSwgWzEuNV1dKSksCisgICAgICAgICAgICAgICAgICAgICAgIG51bXB5Lm1hdHJpeChbWzEuNV0sIFsxLjVdXSkpCisKKyAgZGVmIHRlc3RfY29lcmNlX291dHNpZGVfaW50ZXJzZWN0KHNlbGYpOgorICAgICIiIlRlc3RzIGNvZXJjaW9uIHdoZW4gdGhlIGxpbmUgaW50ZXJzZWN0cyB0aGUgYm94LiIiIgorICAgIGJveCA9IHNlbGYuTWFrZUJveCgxLCAyLCAxLCAyKQorCisgICAgIyB4MSA9IHgyCisgICAgSyA9IG51bXB5Lm1hdHJpeChbWzEsIC0xXV0pCisgICAgdyA9IDAKKworICAgIGFzc2VydF9hcnJheV9lcXVhbChwb2x5ZHJpdmV0cmFpbi5Db2VyY2VHb2FsKGJveCwgSywgdywgbnVtcHkubWF0cml4KFtbNV0sIFs1XV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtcHkubWF0cml4KFtbMi4wXSwgWzIuMF1dKSkKKworICBkZWYgdGVzdF9jb2VyY2Vfb3V0c2lkZV9ub19pbnRlcnNlY3Qoc2VsZik6CisgICAgIiIiVGVzdHMgY29lcmNpb24gd2hlbiB0aGUgbGluZSBkb2VzIG5vdCBpbnRlcnNlY3QgdGhlIGJveC4iIiIKKyAgICBib3ggPSBzZWxmLk1ha2VCb3goMywgNCwgMSwgMikKKworICAgICMgeDEgPSB4MgorICAgIEsgPSBudW1weS5tYXRyaXgoW1sxLCAtMV1dKQorICAgIHcgPSAwCisKKyAgICBhc3NlcnRfYXJyYXlfZXF1YWwocG9seWRyaXZldHJhaW4uQ29lcmNlR29hbChib3gsIEssIHcsIG51bXB5Lm1hdHJpeChbWzVdLCBbNV1dKSksCisgICAgICAgICAgICAgICAgICAgICAgIG51bXB5Lm1hdHJpeChbWzMuMF0sIFsyLjBdXSkpCisKKyAgZGVmIHRlc3RfY29lcmNlX21pZGRsZV9vZl9lZGdlKHNlbGYpOgorICAgICIiIlRlc3RzIGNvZXJjaW9uIHdoZW4gdGhlIGxpbmUgaW50ZXJzZWN0cyB0aGUgbWlkZGxlIG9mIGFuIGVkZ2UuIiIiCisgICAgYm94ID0gc2VsZi5NYWtlQm94KDAsIDQsIDEsIDIpCisKKyAgICAjIHgxID0geDIKKyAgICBLID0gbnVtcHkubWF0cml4KFtbLTEsIDFdXSkKKyAgICB3ID0gMAorCisgICAgYXNzZXJ0X2FycmF5X2VxdWFsKHBvbHlkcml2ZXRyYWluLkNvZXJjZUdvYWwoYm94LCBLLCB3LCBudW1weS5tYXRyaXgoW1s1XSwgWzVdXSkpLAorICAgICAgICAgICAgICAgICAgICAgICBudW1weS5tYXRyaXgoW1syLjBdLCBbMi4wXV0pKQorCisgIGRlZiB0ZXN0X2NvZXJjZV9wZXJwZW5kaWN1bGFyX2xpbmUoc2VsZik6CisgICAgIiIiVGVzdHMgY29lcmNpb24gd2hlbiB0aGUgbGluZSBkb2VzIG5vdCBpbnRlcnNlY3QgYW5kIGlzIGluIHF1YWRyYW50IDIuIiIiCisgICAgYm94ID0gc2VsZi5NYWtlQm94KDEsIDIsIDEsIDIpCisKKyAgICAjIHgxID0gLXgyCisgICAgSyA9IG51bXB5Lm1hdHJpeChbWzEsIDFdXSkKKyAgICB3ID0gMAorCisgICAgYXNzZXJ0X2FycmF5X2VxdWFsKHBvbHlkcml2ZXRyYWluLkNvZXJjZUdvYWwoYm94LCBLLCB3LCBudW1weS5tYXRyaXgoW1s1XSwgWzVdXSkpLAorICAgICAgICAgICAgICAgICAgICAgICBudW1weS5tYXRyaXgoW1sxLjBdLCBbMS4wXV0pKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9weXRob24vc2hvb3Rlci5weSBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvcHl0aG9uL3Nob290ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjlmMjU5OQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvcHl0aG9uL3Nob290ZXIucHkKQEAgLTAsMCArMSwyNTQgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKK2ltcG9ydCBjb250cm9sX2xvb3AKK2ltcG9ydCBudW1weQoraW1wb3J0IHN5cworZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgorCitjbGFzcyBTcHJ1bmdTaG9vdGVyKGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSJSYXdTcHJ1bmdTaG9vdGVyIik6CisgICAgc3VwZXIoU3BydW5nU2hvb3Rlciwgc2VsZikuX19pbml0X18obmFtZSkKKyAgICAjIFN0YWxsIFRvcnF1ZSBpbiBOIG0KKyAgICBzZWxmLnN0YWxsX3RvcnF1ZSA9IC40OTgyCisgICAgIyBTdGFsbCBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLnN0YWxsX2N1cnJlbnQgPSA4NQorICAgICMgRnJlZSBTcGVlZCBpbiBSUE0KKyAgICBzZWxmLmZyZWVfc3BlZWQgPSAxOTMwMC4wCisgICAgIyBGcmVlIEN1cnJlbnQgaW4gQW1wcworICAgIHNlbGYuZnJlZV9jdXJyZW50ID0gMS4yCisgICAgIyBFZmZlY3RpdmUgbWFzcyBvZiB0aGUgc2hvb3RlciBpbiBrZy4KKyAgICAjIFRoaXMgcm91Z2ggZXN0aW1hdGUgc2hvdWxkIGFib3V0IGluY2x1ZGUgdGhlIGVmZmVjdCBvZiB0aGUgbWFzc2VzCisgICAgIyBvZiB0aGUgZ2VhcnMuIElmIHRoaXMgbnVtYmVyIGlzIHRvbyBsb3csIHRoZSBlaWdlbiB2YWx1ZXMgb2Ygc2VsZi5BCisgICAgIyB3aWxsIHN0YXJ0IHRvIGJlY29tZSBleHRyZW1lbHkgc21hbGwuCisgICAgc2VsZi5KID0gMjAwCisgICAgIyBSZXNpc3RhbmNlIG9mIHRoZSBtb3RvciwgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIG1vdG9ycy4KKyAgICBzZWxmLlIgPSAxMi4wIC8gc2VsZi5zdGFsbF9jdXJyZW50IC8gMi4wCisgICAgIyBNb3RvciB2ZWxvY2l0eSBjb25zdGFudAorICAgIHNlbGYuS3YgPSAoKHNlbGYuZnJlZV9zcGVlZCAvIDYwLjAgKiAyLjAgKiBudW1weS5waSkgLworICAgICAgICAgICAgICAgKDEyLjAgLSBzZWxmLlIgKiBzZWxmLmZyZWVfY3VycmVudCkpCisgICAgIyBUb3JxdWUgY29uc3RhbnQKKyAgICBzZWxmLkt0ID0gc2VsZi5zdGFsbF90b3JxdWUgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIFNwcmluZyBjb25zdGFudCBmb3IgdGhlIHNwcmluZ3MsIE4vbQorICAgIHNlbGYuS3MgPSAyODAwLjAKKyAgICAjIE1heGltdW0gZXh0ZW5zaW9uIGRpc3RhbmNlIChEaXN0YW5jZSBmcm9tIHRoZSAwIGZvcmNlIHBvaW50IG9uIHRoZQorICAgICMgc3ByaW5nIHRvIHRoZSBsYXRjaCBwb3NpdGlvbi4pCisgICAgc2VsZi5tYXhfZXh0ZW5zaW9uID0gMC4zMjM4NQorICAgICMgR2VhciByYXRpbyBtdWx0aXBsaWVkIGJ5IHJhZGl1cyBvZiBmaW5hbCBzcHJvY2tldC4KKyAgICBzZWxmLkcgPSAxMC4wIC8gNDAuMCAqIDIwLjAgLyA1NC4wICogMjQuMCAvIDU0LjAgKiAyMC4wIC8gODQuMCAqIDE2LjAgKiAoMy4wIC8gOC4wKSAvICgyLjAgKiBudW1weS5waSkgKiAwLjAyNTQKKworICAgICMgQ29udHJvbCBsb29wIHRpbWUgc3RlcAorICAgIHNlbGYuZHQgPSAwLjAxCisKKyAgICAjIFN0YXRlIGZlZWRiYWNrIG1hdHJpY2VzCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMV0sCisgICAgICAgICBbLXNlbGYuS3MgLyBzZWxmLkosCisgICAgICAgICAgLXNlbGYuS3QgLyBzZWxmLkt2IC8gKHNlbGYuSiAqIHNlbGYuRyAqIHNlbGYuRyAqIHNlbGYuUildXSkKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swXSwKKyAgICAgICAgIFtzZWxmLkt0IC8gKHNlbGYuSiAqIHNlbGYuRyAqIHNlbGYuUildXSkKKyAgICBzZWxmLkMgPSBudW1weS5tYXRyaXgoW1sxLCAwXV0pCisgICAgc2VsZi5EID0gbnVtcHkubWF0cml4KFtbMF1dKQorCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKAorICAgICAgICBzZWxmLkFfY29udGludW91cywgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICBzZWxmLlBsYWNlQ29udHJvbGxlclBvbGVzKFswLjQ1LCAwLjQ1XSkKKworICAgIHNlbGYucnBsID0gLjA1CisgICAgc2VsZi5pcGwgPSAwLjAwOAorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLnJwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGxdKQorCisgICAgc2VsZi5VX21heCA9IG51bXB5Lm1hdHJpeChbWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KFtbLTEyLjBdXSkKKworICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworCitjbGFzcyBTaG9vdGVyKFNwcnVuZ1Nob290ZXIpOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iUmF3U2hvb3RlciIpOgorICAgIHN1cGVyKFNob290ZXIsIHNlbGYpLl9faW5pdF9fKG5hbWUpCisKKyAgICAjIFN0YXRlIGZlZWRiYWNrIG1hdHJpY2VzCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMV0sCisgICAgICAgICBbMCwgLXNlbGYuS3QgLyBzZWxmLkt2IC8gKHNlbGYuSiAqIHNlbGYuRyAqIHNlbGYuRyAqIHNlbGYuUildXSkKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swXSwKKyAgICAgICAgIFtzZWxmLkt0IC8gKHNlbGYuSiAqIHNlbGYuRyAqIHNlbGYuUildXSkKKworICAgIHNlbGYuQSwgc2VsZi5CID0gc2VsZi5Db250aW51b3VzVG9EaXNjcmV0ZSgKKyAgICAgICAgc2VsZi5BX2NvbnRpbnVvdXMsIHNlbGYuQl9jb250aW51b3VzLCBzZWxmLmR0KQorCisgICAgc2VsZi5QbGFjZUNvbnRyb2xsZXJQb2xlcyhbMC40NSwgMC40NV0pCisKKyAgICBzZWxmLnJwbCA9IC4wNQorICAgIHNlbGYuaXBsID0gMC4wMDgKKyAgICBzZWxmLlBsYWNlT2JzZXJ2ZXJQb2xlcyhbc2VsZi5ycGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsXSkKKworICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXV0pCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKKworY2xhc3MgU3BydW5nU2hvb3RlckRlbHRhVShTcHJ1bmdTaG9vdGVyKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IlNwcnVuZ1Nob290ZXIiKToKKyAgICBzdXBlcihTcHJ1bmdTaG9vdGVyRGVsdGFVLCBzZWxmKS5fX2luaXRfXyhuYW1lKQorICAgIEFfdW5hdWdtZW50ZWQgPSBzZWxmLkEKKyAgICBCX3VuYXVnbWVudGVkID0gc2VsZi5CCisKKyAgICBzZWxmLkEgPSBudW1weS5tYXRyaXgoW1swLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMS4wXV0pCisgICAgc2VsZi5BWzA6MiwgMDoyXSA9IEFfdW5hdWdtZW50ZWQKKyAgICBzZWxmLkFbMDoyLCAyXSA9IEJfdW5hdWdtZW50ZWQKKworICAgIHNlbGYuQiA9IG51bXB5Lm1hdHJpeChbWzAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLjBdXSkKKworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEuMCwgMC4wLCAwLjBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swLjBdXSkKKworICAgIHNlbGYuUGxhY2VDb250cm9sbGVyUG9sZXMoWzAuNTAsIDAuMzUsIDAuODBdKQorCisgICAgcHJpbnQgIksiCisgICAgcHJpbnQgc2VsZi5LCisgICAgcHJpbnQgIlBsYWNlZCBjb250cm9sbGVyIHBvbGVzIGFyZSIKKyAgICBwcmludCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuQiAqIHNlbGYuSylbMF0KKworICAgIHNlbGYucnBsID0gLjA1CisgICAgc2VsZi5pcGwgPSAwLjAwOAorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLnJwbCArIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsIC0gMWogKiBzZWxmLmlwbCwgMC45MF0pCisgICAgcHJpbnQgIlBsYWNlZCBvYnNlcnZlciBwb2xlcyBhcmUiCisgICAgcHJpbnQgbnVtcHkubGluYWxnLmVpZyhzZWxmLkEgLSBzZWxmLkwgKiBzZWxmLkMpWzBdCisKKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KFtbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoW1stMTIuMF1dKQorCisgICAgc2VsZi5Jbml0aWFsaXplU3RhdGUoKQorCisKK2NsYXNzIFNob290ZXJEZWx0YVUoU2hvb3Rlcik6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSJTaG9vdGVyIik6CisgICAgc3VwZXIoU2hvb3RlckRlbHRhVSwgc2VsZikuX19pbml0X18obmFtZSkKKyAgICBBX3VuYXVnbWVudGVkID0gc2VsZi5BCisgICAgQl91bmF1Z21lbnRlZCA9IHNlbGYuQgorCisgICAgc2VsZi5BID0gbnVtcHkubWF0cml4KFtbMC4wLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDEuMF1dKQorICAgIHNlbGYuQVswOjIsIDA6Ml0gPSBBX3VuYXVnbWVudGVkCisgICAgc2VsZi5BWzA6MiwgMl0gPSBCX3VuYXVnbWVudGVkCisKKyAgICBzZWxmLkIgPSBudW1weS5tYXRyaXgoW1swLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMS4wXV0pCisKKyAgICBzZWxmLkMgPSBudW1weS5tYXRyaXgoW1sxLjAsIDAuMCwgMC4wXV0pCisgICAgc2VsZi5EID0gbnVtcHkubWF0cml4KFtbMC4wXV0pCisKKyAgICBzZWxmLlBsYWNlQ29udHJvbGxlclBvbGVzKFswLjU1LCAwLjQ1LCAwLjgwXSkKKworICAgIHByaW50ICJLIgorICAgIHByaW50IHNlbGYuSworICAgIHByaW50ICJQbGFjZWQgY29udHJvbGxlciBwb2xlcyBhcmUiCisgICAgcHJpbnQgbnVtcHkubGluYWxnLmVpZyhzZWxmLkEgLSBzZWxmLkIgKiBzZWxmLkspWzBdCisKKyAgICBzZWxmLnJwbCA9IC4wNQorICAgIHNlbGYuaXBsID0gMC4wMDgKKyAgICBzZWxmLlBsYWNlT2JzZXJ2ZXJQb2xlcyhbc2VsZi5ycGwgKyAxaiAqIHNlbGYuaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbCAtIDFqICogc2VsZi5pcGwsIDAuOTBdKQorICAgIHByaW50ICJQbGFjZWQgb2JzZXJ2ZXIgcG9sZXMgYXJlIgorICAgIHByaW50IG51bXB5LmxpbmFsZy5laWcoc2VsZi5BIC0gc2VsZi5MICogc2VsZi5DKVswXQorCisgICAgc2VsZi5VX21heCA9IG51bXB5Lm1hdHJpeChbWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KFtbLTEyLjBdXSkKKworICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworCitkZWYgQ2xpcERlbHRhVShzaG9vdGVyLCBvbGRfdm9sdGFnZSwgZGVsdGFfdSk6CisgIG9sZF91ID0gb2xkX3ZvbHRhZ2UKKyAgbmV3X3UgPSBudW1weS5jbGlwKG9sZF91ICsgZGVsdGFfdSwgc2hvb3Rlci5VX21pbiwgc2hvb3Rlci5VX21heCkKKyAgcmV0dXJuIG5ld191IC0gb2xkX3UKKworZGVmIG1haW4oYXJndik6CisgICMgU2ltdWxhdGUgdGhlIHJlc3BvbnNlIG9mIHRoZSBzeXN0ZW0gdG8gYSBnb2FsLgorICBzcHJ1bmdfc2hvb3RlciA9IFNwcnVuZ1Nob290ZXJEZWx0YVUoKQorICByYXdfc3BydW5nX3Nob290ZXIgPSBTcHJ1bmdTaG9vdGVyKCkKKyAgY2xvc2VfbG9vcF94ID0gW10KKyAgY2xvc2VfbG9vcF91ID0gW10KKyAgZ29hbF9wb3NpdGlvbiA9IC0wLjMKKyAgUiA9IG51bXB5Lm1hdHJpeChbW2dvYWxfcG9zaXRpb25dLCBbMC4wXSwgWy1zcHJ1bmdfc2hvb3Rlci5BWzEsIDBdIC8gc3BydW5nX3Nob290ZXIuQVsxLCAyXSAqIGdvYWxfcG9zaXRpb25dXSkKKyAgdm9sdGFnZSA9IG51bXB5Lm1hdHJpeChbWzAuMF1dKQorICBmb3IgXyBpbiB4cmFuZ2UoNTAwKToKKyAgICBVID0gc3BydW5nX3Nob290ZXIuSyAqIChSIC0gc3BydW5nX3Nob290ZXIuWF9oYXQpCisgICAgVSA9IENsaXBEZWx0YVUoc3BydW5nX3Nob290ZXIsIHZvbHRhZ2UsIFUpCisgICAgc3BydW5nX3Nob290ZXIuWSA9IHJhd19zcHJ1bmdfc2hvb3Rlci5ZICsgMC4wMQorICAgIHNwcnVuZ19zaG9vdGVyLlVwZGF0ZU9ic2VydmVyKFUpCisgICAgdm9sdGFnZSArPSBVOworICAgIHJhd19zcHJ1bmdfc2hvb3Rlci5VcGRhdGUodm9sdGFnZSkKKyAgICBjbG9zZV9sb29wX3guYXBwZW5kKHJhd19zcHJ1bmdfc2hvb3Rlci5YWzAsIDBdICogMTApCisgICAgY2xvc2VfbG9vcF91LmFwcGVuZCh2b2x0YWdlWzAsIDBdKQorCisgIHB5bGFiLnBsb3QocmFuZ2UoNTAwKSwgY2xvc2VfbG9vcF94KQorICBweWxhYi5wbG90KHJhbmdlKDUwMCksIGNsb3NlX2xvb3BfdSkKKyAgcHlsYWIuc2hvdygpCisKKyAgc2hvb3RlciA9IFNob290ZXJEZWx0YVUoKQorICByYXdfc2hvb3RlciA9IFNob290ZXIoKQorICBjbG9zZV9sb29wX3ggPSBbXQorICBjbG9zZV9sb29wX3UgPSBbXQorICBnb2FsX3Bvc2l0aW9uID0gLTAuMworICBSID0gbnVtcHkubWF0cml4KFtbZ29hbF9wb3NpdGlvbl0sIFswLjBdLCBbLXNob290ZXIuQVsxLCAwXSAvIHNob290ZXIuQVsxLCAyXSAqIGdvYWxfcG9zaXRpb25dXSkKKyAgdm9sdGFnZSA9IG51bXB5Lm1hdHJpeChbWzAuMF1dKQorICBmb3IgXyBpbiB4cmFuZ2UoNTAwKToKKyAgICBVID0gc2hvb3Rlci5LICogKFIgLSBzaG9vdGVyLlhfaGF0KQorICAgIFUgPSBDbGlwRGVsdGFVKHNob290ZXIsIHZvbHRhZ2UsIFUpCisgICAgc2hvb3Rlci5ZID0gcmF3X3Nob290ZXIuWSArIDAuMDEKKyAgICBzaG9vdGVyLlVwZGF0ZU9ic2VydmVyKFUpCisgICAgdm9sdGFnZSArPSBVOworICAgIHJhd19zaG9vdGVyLlVwZGF0ZSh2b2x0YWdlKQorICAgIGNsb3NlX2xvb3BfeC5hcHBlbmQocmF3X3Nob290ZXIuWFswLCAwXSAqIDEwKQorICAgIGNsb3NlX2xvb3BfdS5hcHBlbmQodm9sdGFnZVswLCAwXSkKKworICBweWxhYi5wbG90KHJhbmdlKDUwMCksIGNsb3NlX2xvb3BfeCkKKyAgcHlsYWIucGxvdChyYW5nZSg1MDApLCBjbG9zZV9sb29wX3UpCisgIHB5bGFiLnNob3coKQorCisgICMgV3JpdGUgdGhlIGdlbmVyYXRlZCBjb25zdGFudHMgb3V0IHRvIGEgZmlsZS4KKyAgaWYgbGVuKGFyZ3YpICE9IDU6CisgICAgcHJpbnQgIkV4cGVjdGVkIC5oIGZpbGUgbmFtZSBhbmQgLmNjIGZpbGUgbmFtZSBmb3IiCisgICAgcHJpbnQgImJvdGggdGhlIHBsYW50IGFuZCB1bmF1Z21lbnRlZCBwbGFudCIKKyAgZWxzZToKKyAgICB1bmF1Z19zcHJ1bmdfc2hvb3RlciA9IFNwcnVuZ1Nob290ZXIoIlJhd1NwcnVuZ1Nob290ZXIiKQorICAgIHVuYXVnX3Nob290ZXIgPSBTaG9vdGVyKCJSYXdTaG9vdGVyIikKKyAgICB1bmF1Z19sb29wX3dyaXRlciA9IGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcFdyaXRlcigiUmF3U2hvb3RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VuYXVnX3NwcnVuZ19zaG9vdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmF1Z19zaG9vdGVyXSkKKyAgICBpZiBhcmd2WzNdWy0zOl0gPT0gJy5jYyc6CisgICAgICB1bmF1Z19sb29wX3dyaXRlci5Xcml0ZShhcmd2WzRdLCBhcmd2WzNdKQorICAgIGVsc2U6CisgICAgICB1bmF1Z19sb29wX3dyaXRlci5Xcml0ZShhcmd2WzNdLCBhcmd2WzRdKQorCisgICAgc3BydW5nX3Nob290ZXIgPSBTcHJ1bmdTaG9vdGVyRGVsdGFVKCkKKyAgICBzaG9vdGVyID0gU2hvb3RlckRlbHRhVSgpCisgICAgbG9vcF93cml0ZXIgPSBjb250cm9sX2xvb3AuQ29udHJvbExvb3BXcml0ZXIoIlNob290ZXIiLCBbc3BydW5nX3Nob290ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvb3Rlcl0pCisKKyAgICBsb29wX3dyaXRlci5BZGRDb25zdGFudChjb250cm9sX2xvb3AuQ29uc3RhbnQoImtNYXhFeHRlbnNpb24iLCAiJWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJ1bmdfc2hvb3Rlci5tYXhfZXh0ZW5zaW9uKSkKKyAgICBsb29wX3dyaXRlci5BZGRDb25zdGFudChjb250cm9sX2xvb3AuQ29uc3RhbnQoImtTcHJpbmdDb25zdGFudCIsICIlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcnVuZ19zaG9vdGVyLktzKSkKKyAgICBpZiBhcmd2WzFdWy0zOl0gPT0gJy5jYyc6CisgICAgICBsb29wX3dyaXRlci5Xcml0ZShhcmd2WzJdLCBhcmd2WzFdKQorICAgIGVsc2U6CisgICAgICBsb29wX3dyaXRlci5Xcml0ZShhcmd2WzFdLCBhcmd2WzJdKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKHN5cy5hcmd2KSkKZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9yZXBsYXlfc2hvb3Rlci5jYyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9yZXBsYXlfc2hvb3Rlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM5NTNmCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3JlcGxheV9zaG9vdGVyLmNjCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3JlcGxheV9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlci5xLmgiCisKKy8vIFJlYWRzIG9uZSBvciBtb3JlIGxvZyBmaWxlcyBhbmQgc2VuZHMgb3V0IGFsbCB0aGUgcXVldWUgbWVzc2FnZXMgKGluIHRoZQorLy8gY29ycmVjdCBvcmRlciBhbmQgYXQgdGhlIGNvcnJlY3QgdGltZSkgdG8gZmVlZCBhICJsaXZlIiBzaG9vdGVyIHByb2Nlc3MuCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBpZiAoYXJnYyA8PSAxKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJOZWVkIGF0IGxlYXN0IG9uZSBmaWxlIHRvIHJlcGxheSFcbiIpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICA6OmFvczo6SW5pdE5SVCgpOworCisgIDo6YW9zOjpjb250cm9sczo6Q29udHJvbExvb3BSZXBsYXllcjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6U2hvb3RlclF1ZXVlPgorICAgICAgcmVwbGF5ZXIoJjo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpzaG9vdGVyX3F1ZXVlLCAic2hvb3RlciIpOworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgIHJlcGxheWVyLlByb2Nlc3NGaWxlKGFyZ3ZbaV0pOworICB9CisKKyAgOjphb3M6OkNsZWFudXAoKTsKK30KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLmNjIGIveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxMTk2NwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLmNjCkBAIC0wLDAgKzEsNjkxIEBACisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BzLnEuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJ5MjAxNC9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlcl9tb3Rvcl9wbGFudC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7CisKK3ZvaWQgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OkNhcFUoKSB7CisgIGNvbnN0IGRvdWJsZSBvbGRfdm9sdGFnZSA9IHZvbHRhZ2VfOworICB2b2x0YWdlXyArPSBVKDAsIDApOworCisgIHVuY2FwcGVkX3ZvbHRhZ2VfID0gdm9sdGFnZV87CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgcmVhbGl0eSBhbmQgdGhlIG9ic2VydmVyIGNhbid0IGdldCB0b28gZmFyIG9mZi4gIFRoZXJlIGlzIGEKKyAgLy8gZGVsYXkgYnkgb25lIGN5Y2xlIGJldHdlZW4gdGhlIGFwcGxpZWQgdm9sdGFnZSBhbmQgWF9oYXQoMiwgMCksIHNvIGNvbXBhcmUKKyAgLy8gYWdhaW5zdCBsYXN0IGN5Y2xlJ3Mgdm9sdGFnZS4KKyAgaWYgKFhfaGF0KDIsIDApID4gbGFzdF92b2x0YWdlXyArIDQuMCkgeworICAgIHZvbHRhZ2VfIC09IFhfaGF0KDIsIDApIC0gKGxhc3Rfdm9sdGFnZV8gKyA0LjApOworICAgIExPRyhERUJVRywgIkNhcHBpbmcgZHVlIHRvIHJ1bmF3YXlcbiIpOworICB9IGVsc2UgaWYgKFhfaGF0KDIsIDApIDwgbGFzdF92b2x0YWdlXyAtIDQuMCkgeworICAgIHZvbHRhZ2VfICs9IFhfaGF0KDIsIDApIC0gKGxhc3Rfdm9sdGFnZV8gLSA0LjApOworICAgIExPRyhERUJVRywgIkNhcHBpbmcgZHVlIHRvIHJ1bmF3YXlcbiIpOworICB9CisKKyAgdm9sdGFnZV8gPSBzdGQ6Om1pbihtYXhfdm9sdGFnZV8sIHZvbHRhZ2VfKTsKKyAgdm9sdGFnZV8gPSBzdGQ6Om1heCgtbWF4X3ZvbHRhZ2VfLCB2b2x0YWdlXyk7CisgIG11dGFibGVfVSgwLCAwKSA9IHZvbHRhZ2VfIC0gb2xkX3ZvbHRhZ2U7CisKKyAgTE9HX1NUUlVDVChERUJVRywgIm91dHB1dCIsIFNob290ZXJWb2x0YWdlVG9Mb2coWF9oYXQoMiwgMCksIHZvbHRhZ2VfKSk7CisKKyAgbGFzdF92b2x0YWdlXyA9IHZvbHRhZ2VfOworICBjYXBwZWRfZ29hbF8gPSBmYWxzZTsKK30KKwordm9pZCBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6Q2FwR29hbCgpIHsKKyAgaWYgKHVuY2FwcGVkX3ZvbHRhZ2UoKSA+IG1heF92b2x0YWdlXykgeworICAgIGRvdWJsZSBkeDsKKyAgICBpZiAoY29udHJvbGxlcl9pbmRleCgpID09IDApIHsKKyAgICAgIGR4ID0gKHVuY2FwcGVkX3ZvbHRhZ2UoKSAtIG1heF92b2x0YWdlXykgLworICAgICAgICAgICAoSygwLCAwKSAtIEEoMSwgMCkgKiBLKDAsIDIpIC8gQSgxLCAyKSk7CisgICAgICBtdXRhYmxlX1IoMCwgMCkgLT0gZHg7CisgICAgICBtdXRhYmxlX1IoMiwgMCkgLT0gLUEoMSwgMCkgLyBBKDEsIDIpICogZHg7CisgICAgfSBlbHNlIHsKKyAgICAgIGR4ID0gKHVuY2FwcGVkX3ZvbHRhZ2UoKSAtIG1heF92b2x0YWdlXykgLyBLKDAsIDApOworICAgICAgbXV0YWJsZV9SKDAsIDApIC09IGR4OworICAgIH0KKyAgICBjYXBwZWRfZ29hbF8gPSB0cnVlOworICAgIExPR19TVFJVQ1QoREVCVUcsICJ0byBwcmV2ZW50IHdpbmR1cCIsIFNob290ZXJNb3ZpbmdHb2FsKGR4KSk7CisgIH0gZWxzZSBpZiAodW5jYXBwZWRfdm9sdGFnZSgpIDwgLW1heF92b2x0YWdlXykgeworICAgIGRvdWJsZSBkeDsKKyAgICBpZiAoY29udHJvbGxlcl9pbmRleCgpID09IDApIHsKKyAgICAgIGR4ID0gKHVuY2FwcGVkX3ZvbHRhZ2UoKSArIG1heF92b2x0YWdlXykgLworICAgICAgICAgICAoSygwLCAwKSAtIEEoMSwgMCkgKiBLKDAsIDIpIC8gQSgxLCAyKSk7CisgICAgICBtdXRhYmxlX1IoMCwgMCkgLT0gZHg7CisgICAgICBtdXRhYmxlX1IoMiwgMCkgLT0gLUEoMSwgMCkgLyBBKDEsIDIpICogZHg7CisgICAgfSBlbHNlIHsKKyAgICAgIGR4ID0gKHVuY2FwcGVkX3ZvbHRhZ2UoKSArIG1heF92b2x0YWdlXykgLyBLKDAsIDApOworICAgICAgbXV0YWJsZV9SKDAsIDApIC09IGR4OworICAgIH0KKyAgICBjYXBwZWRfZ29hbF8gPSB0cnVlOworICAgIExPR19TVFJVQ1QoREVCVUcsICJ0byBwcmV2ZW50IHdpbmR1cCIsIFNob290ZXJNb3ZpbmdHb2FsKGR4KSk7CisgIH0gZWxzZSB7CisgICAgY2FwcGVkX2dvYWxfID0gZmFsc2U7CisgIH0KK30KKwordm9pZCBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcDo6UmVjYWxjdWxhdGVQb3dlckdvYWwoKSB7CisgIGlmIChjb250cm9sbGVyX2luZGV4KCkgPT0gMCkgeworICAgIG11dGFibGVfUigyLCAwKSA9ICgtQSgxLCAwKSAvIEEoMSwgMikgKiBSKDAsIDApIC0gQSgxLCAxKSAvIEEoMSwgMikgKiBSKDEsIDApKTsKKyAgfSBlbHNlIHsKKyAgICBtdXRhYmxlX1IoMiwgMCkgPSAtQSgxLCAxKSAvIEEoMSwgMikgKiBSKDEsIDApOworICB9Cit9CisKK3ZvaWQgWmVyb2VkU3RhdGVGZWVkYmFja0xvb3A6OlNldENhbGlicmF0aW9uKGRvdWJsZSBlbmNvZGVyX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBrbm93bl9wb3NpdGlvbikgeworICBkb3VibGUgb2xkX3Bvc2l0aW9uID0gYWJzb2x1dGVfcG9zaXRpb24oKTsKKyAgZG91YmxlIHByZXZpb3VzX29mZnNldCA9IG9mZnNldF87CisgIG9mZnNldF8gPSBrbm93bl9wb3NpdGlvbiAtIGVuY29kZXJfdmFsOworICBkb3VibGUgZG9mZnNldCA9IG9mZnNldF8gLSBwcmV2aW91c19vZmZzZXQ7CisgIG11dGFibGVfWF9oYXQoMCwgMCkgKz0gZG9mZnNldDsKKyAgLy8gT2Zmc2V0IHRoZSBnb2FsIHNvIHdlIGRvbid0IG1vdmUuCisgIG11dGFibGVfUigwLCAwKSArPSBkb2Zmc2V0OworICBpZiAoY29udHJvbGxlcl9pbmRleCgpID09IDApIHsKKyAgICBtdXRhYmxlX1IoMiwgMCkgKz0gLUEoMSwgMCkgLyBBKDEsIDIpICogKGRvZmZzZXQpOworICB9CisgIExPR19TVFJVQ1QoCisgICAgICBERUJVRywgInNlbnNvciBlZGdlIChmYWtlPykiLAorICAgICAgU2hvb3RlckNoYW5nZUNhbGlicmF0aW9uKGVuY29kZXJfdmFsLCBrbm93bl9wb3NpdGlvbiwgb2xkX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlX3Bvc2l0aW9uKCksIHByZXZpb3VzX29mZnNldCwgb2Zmc2V0XykpOworfQorCitTaG9vdGVyTW90b3I6OlNob290ZXJNb3Rvcihjb250cm9sX2xvb3BzOjpTaG9vdGVyUXVldWUgKm15X3Nob290ZXIpCisgICAgOiBhb3M6OmNvbnRyb2xzOjpDb250cm9sTG9vcDxjb250cm9sX2xvb3BzOjpTaG9vdGVyUXVldWU+KG15X3Nob290ZXIpLAorICAgICAgc2hvb3Rlcl8oTWFrZVNob290ZXJMb29wKCkpLAorICAgICAgc3RhdGVfKFNUQVRFX0lOSVRJQUxJWkUpLAorICAgICAgbG9hZGluZ19wcm9ibGVtX2VuZF90aW1lXygwLCAwKSwKKyAgICAgIGxvYWRfdGltZW91dF8oMCwgMCksCisgICAgICBzaG9vdGVyX2JyYWtlX3NldF90aW1lXygwLCAwKSwKKyAgICAgIHVubG9hZF90aW1lb3V0XygwLCAwKSwKKyAgICAgIHNob3RfZW5kX3RpbWVfKDAsIDApLAorICAgICAgY3ljbGVzX25vdF9tb3ZlZF8oMCksCisgICAgICBzaG90X2NvdW50XygwKSwKKyAgICAgIHplcm9lZF8oZmFsc2UpLAorICAgICAgZGlzdGFsX3Bvc2VkZ2VfdmFsaWRhdGlvbl9jeWNsZXNfbGVmdF8oMCksCisgICAgICBwcm94aW1hbF9wb3NlZGdlX3ZhbGlkYXRpb25fY3ljbGVzX2xlZnRfKDApLAorICAgICAgbGFzdF9kaXN0YWxfY3VycmVudF8odHJ1ZSksCisgICAgICBsYXN0X3Byb3hpbWFsX2N1cnJlbnRfKHRydWUpIHt9CisKK2RvdWJsZSBTaG9vdGVyTW90b3I6OlBvd2VyVG9Qb3NpdGlvbihkb3VibGUgcG93ZXIpIHsKKyAgY29uc3QgZnJjOTcxOjpjb25zdGFudHM6OlZhbHVlcyAmdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKyAgZG91YmxlIG1heHBvd2VyID0gMC41ICoga1NwcmluZ0NvbnN0YW50ICoKKyAgICAgICAgICAgICAgICAgICAgKGtNYXhFeHRlbnNpb24gKiBrTWF4RXh0ZW5zaW9uIC0KKyAgICAgICAgICAgICAgICAgICAgIChrTWF4RXh0ZW5zaW9uIC0gdmFsdWVzLnNob290ZXIudXBwZXJfbGltaXQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoa01heEV4dGVuc2lvbiAtIHZhbHVlcy5zaG9vdGVyLnVwcGVyX2xpbWl0KSk7CisgIGlmIChwb3dlciA8IDApIHsKKyAgICBMT0dfU1RSVUNUKFdBUk5JTkcsICJuZWdhdGl2ZSBwb3dlciIsIFBvd2VyQWRqdXN0bWVudChwb3dlciwgMCkpOworICAgIHBvd2VyID0gMDsKKyAgfSBlbHNlIGlmIChwb3dlciA+IG1heHBvd2VyKSB7CisgICAgTE9HX1NUUlVDVChXQVJOSU5HLCAicG93ZXIgdG9vIGhpZ2giLCBQb3dlckFkanVzdG1lbnQocG93ZXIsIG1heHBvd2VyKSk7CisgICAgcG93ZXIgPSBtYXhwb3dlcjsKKyAgfQorCisgIGRvdWJsZSBtcCA9IGtNYXhFeHRlbnNpb24gKiBrTWF4RXh0ZW5zaW9uIC0gKHBvd2VyICsgcG93ZXIpIC8ga1NwcmluZ0NvbnN0YW50OworICBkb3VibGUgbmV3X3BvcyA9IDAuMTA7CisgIGlmIChtcCA8IDApIHsKKyAgICBMT0coRVJST1IsCisgICAgICAgICJQb3dlciBjYWxjdWxhdGlvbiBoYXMgbmVnYXRpdmUgbnVtYmVyIGJlZm9yZSBzcXVhcmUgcm9vdCAoJWYpLlxuIiwgbXApOworICB9IGVsc2UgeworICAgIG5ld19wb3MgPSBrTWF4RXh0ZW5zaW9uIC0gOjpzdGQ6OnNxcnQobXApOworICB9CisKKyAgbmV3X3BvcyA9IDo6c3RkOjptaW4oOjpzdGQ6Om1heChuZXdfcG9zLCB2YWx1ZXMuc2hvb3Rlci5sb3dlcl9saW1pdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuc2hvb3Rlci51cHBlcl9saW1pdCk7CisgIHJldHVybiBuZXdfcG9zOworfQorCitkb3VibGUgU2hvb3Rlck1vdG9yOjpQb3NpdGlvblRvUG93ZXIoZG91YmxlIHBvc2l0aW9uKSB7CisgIGRvdWJsZSBwb3dlciA9IGtTcHJpbmdDb25zdGFudCAqIHBvc2l0aW9uICogKGtNYXhFeHRlbnNpb24gLSBwb3NpdGlvbiAvIDIuMCk7CisgIHJldHVybiBwb3dlcjsKK30KKwordm9pZCBTaG9vdGVyTW90b3I6OkNoZWNrQ2FsaWJyYXRpb25zKAorICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uKSB7CisgIENIRUNLX05PVE5VTEwocG9zaXRpb24pOworICBjb25zdCBmcmM5NzE6OmNvbnN0YW50czo6VmFsdWVzICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworCisgIC8vIFRPRE8oYXVzdGluKTogVmFsaWRhdGUgdGhhdCB0aGlzIGlzIHRoZSByaWdodCBlZGdlLgorICAvLyBJZiB3ZSBzZWUgYSBwb3NlZGdlIG9uIGFueSBvZiB0aGUgaGFsbCBlZmZlY3RzLAorICBpZiAocG9zaXRpb24tPnB1c2hlcl9wcm94aW1hbC5wb3NlZGdlX2NvdW50ICE9IGxhc3RfcHJveGltYWxfcG9zZWRnZV9jb3VudF8gJiYKKyAgICAgICFsYXN0X3Byb3hpbWFsX2N1cnJlbnRfKSB7CisgICAgcHJveGltYWxfcG9zZWRnZV92YWxpZGF0aW9uX2N5Y2xlc19sZWZ0XyA9IDI7CisgIH0KKyAgaWYgKHByb3hpbWFsX3Bvc2VkZ2VfdmFsaWRhdGlvbl9jeWNsZXNfbGVmdF8gPiAwKSB7CisgICAgaWYgKHBvc2l0aW9uLT5wdXNoZXJfcHJveGltYWwuY3VycmVudCkgeworICAgICAgLS1wcm94aW1hbF9wb3NlZGdlX3ZhbGlkYXRpb25fY3ljbGVzX2xlZnRfOworICAgICAgaWYgKHByb3hpbWFsX3Bvc2VkZ2VfdmFsaWRhdGlvbl9jeWNsZXNfbGVmdF8gPT0gMCkgeworICAgICAgICBzaG9vdGVyXy5TZXRDYWxpYnJhdGlvbigKKyAgICAgICAgICAgIHBvc2l0aW9uLT5wdXNoZXJfcHJveGltYWwucG9zZWRnZV92YWx1ZSwKKyAgICAgICAgICAgIHZhbHVlcy5zaG9vdGVyLnB1c2hlcl9wcm94aW1hbC51cHBlcl9hbmdsZSk7CisKKyAgICAgICAgTE9HKERFQlVHLCAiU2V0dGluZyBjYWxpYnJhdGlvbiB1c2luZyBwcm94aW1hbCBzZW5zb3JcbiIpOworICAgICAgICB6ZXJvZWRfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHJveGltYWxfcG9zZWRnZV92YWxpZGF0aW9uX2N5Y2xlc19sZWZ0XyA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKHBvc2l0aW9uLT5wdXNoZXJfZGlzdGFsLnBvc2VkZ2VfY291bnQgIT0gbGFzdF9kaXN0YWxfcG9zZWRnZV9jb3VudF8gJiYKKyAgICAgICFsYXN0X2Rpc3RhbF9jdXJyZW50XykgeworICAgIGRpc3RhbF9wb3NlZGdlX3ZhbGlkYXRpb25fY3ljbGVzX2xlZnRfID0gMjsKKyAgfQorICBpZiAoZGlzdGFsX3Bvc2VkZ2VfdmFsaWRhdGlvbl9jeWNsZXNfbGVmdF8gPiAwKSB7CisgICAgaWYgKHBvc2l0aW9uLT5wdXNoZXJfZGlzdGFsLmN1cnJlbnQpIHsKKyAgICAgIC0tZGlzdGFsX3Bvc2VkZ2VfdmFsaWRhdGlvbl9jeWNsZXNfbGVmdF87CisgICAgICBpZiAoZGlzdGFsX3Bvc2VkZ2VfdmFsaWRhdGlvbl9jeWNsZXNfbGVmdF8gPT0gMCkgeworICAgICAgICBzaG9vdGVyXy5TZXRDYWxpYnJhdGlvbigKKyAgICAgICAgICAgIHBvc2l0aW9uLT5wdXNoZXJfZGlzdGFsLnBvc2VkZ2VfdmFsdWUsCisgICAgICAgICAgICB2YWx1ZXMuc2hvb3Rlci5wdXNoZXJfZGlzdGFsLnVwcGVyX2FuZ2xlKTsKKworICAgICAgICBMT0coREVCVUcsICJTZXR0aW5nIGNhbGlicmF0aW9uIHVzaW5nIGRpc3RhbCBzZW5zb3JcbiIpOworICAgICAgICB6ZXJvZWRfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZGlzdGFsX3Bvc2VkZ2VfdmFsaWRhdGlvbl9jeWNsZXNfbGVmdF8gPSAwOworICAgIH0KKyAgfQorfQorCisvLyBQb3NpdGl2ZSBpcyBvdXQsIGFuZCBwb3NpdGl2ZSBwb3dlciBpcyBvdXQuCit2b2lkIFNob290ZXJNb3Rvcjo6UnVuSXRlcmF0aW9uKAorICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZTo6R29hbCAqZ29hbCwKKyAgICBjb25zdCBjb250cm9sX2xvb3BzOjpTaG9vdGVyUXVldWU6OlBvc2l0aW9uICpwb3NpdGlvbiwKKyAgICBjb250cm9sX2xvb3BzOjpTaG9vdGVyUXVldWU6Ok91dHB1dCAqb3V0cHV0LAorICAgIGNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZTo6U3RhdHVzICpzdGF0dXMpIHsKKyAgY29uc3RleHByIGRvdWJsZSBkdCA9IDAuMDE7CisKKyAgaWYgKGdvYWwgJiYgOjpzdGQ6OmlzbmFuKGdvYWwtPnNob3RfcG93ZXIpKSB7CisJICBzdGF0ZV8gPSBTVEFURV9FU1RPUDsKKyAgICBMT0coRVJST1IsICJFc3RvcHBpbmcgYmVjYXVzZSBnb3QgYSBzaG90IHBvd2VyIG9mIE5BTi5cbiIpOworICB9CisKKyAgLy8gd2UgbXVzdCBhbHdheXMgaGF2ZSB0aGVzZSBvciB3ZSBoYXZlIGlzc3Vlcy4KKyAgaWYgKHN0YXR1cyA9PSBOVUxMKSB7CisgICAgaWYgKG91dHB1dCkgb3V0cHV0LT52b2x0YWdlID0gMDsKKyAgICBMT0coRVJST1IsICJUaG91Z2h0IEkgd291bGQganVzdCBjaGVjayBmb3IgbnVsbCBhbmQgZGllLlxuIik7CisgICAgcmV0dXJuOworICB9CisgIHN0YXR1cy0+cmVhZHkgPSBmYWxzZTsKKworICBpZiAoV2FzUmVzZXQoKSkgeworICAgIHN0YXRlXyA9IFNUQVRFX0lOSVRJQUxJWkU7CisgICAgbGFzdF9kaXN0YWxfY3VycmVudF8gPSBwb3NpdGlvbi0+cHVzaGVyX2Rpc3RhbC5jdXJyZW50OworICAgIGxhc3RfcHJveGltYWxfY3VycmVudF8gPSBwb3NpdGlvbi0+cHVzaGVyX3Byb3hpbWFsLmN1cnJlbnQ7CisgIH0KKyAgaWYgKHBvc2l0aW9uKSB7CisgICAgc2hvb3Rlcl8uQ29ycmVjdFBvc2l0aW9uKHBvc2l0aW9uLT5wb3NpdGlvbik7CisgIH0KKworICAvLyBEaXNhYmxlIHRoZSBtb3RvcnMgbm93IHNvIHRoYXQgYWxsIGVhcmx5IHJldHVybnMgd2lsbCByZXR1cm4gd2l0aCB0aGUKKyAgLy8gbW90b3JzIGRpc2FibGVkLgorICBpZiAob3V0cHV0KSBvdXRwdXQtPnZvbHRhZ2UgPSAwOworCisgIGNvbnN0IGZyYzk3MTo6Y29uc3RhbnRzOjpWYWx1ZXMgJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisKKyAgLy8gRG9uJ3QgZXZlbiBsZXQgdGhlIGNvbnRyb2wgbG9vcHMgcnVuLgorICBib29sIHNob290ZXJfbG9vcF9kaXNhYmxlID0gZmFsc2U7CisKKyAgY29uc3QgYm9vbCBkaXNhYmxlZCA9CisgICAgICAhOjphb3M6OmpveXN0aWNrX3N0YXRlLmdldCgpIHx8ICE6OmFvczo6am95c3RpY2tfc3RhdGUtPmVuYWJsZWQ7CisKKyAgLy8gSWYgdHJ1ZSwgbW92ZSB0aGUgZ29hbCBpZiB3ZSBzYXR1cmF0ZS4KKyAgYm9vbCBjYXBfZ29hbCA9IGZhbHNlOworCisgIC8vIFRPRE8oYXVzdGluKTogTW92ZSB0aGUgb2Zmc2V0IGlmIHdlIHNlZSBvciBkb24ndCBzZWUgYSBoYWxsIGVmZmVjdCB3aGVuIHdlCisgIC8vIGV4cGVjdCB0byBzZWUgb25lLgorICAvLyBQcm9iYWJseSBub3QgbmVlZGVkIHlldC4KKworICBpZiAocG9zaXRpb24pIHsKKyAgICBpbnQgbGFzdF9jb250cm9sbGVyX2luZGV4ID0gc2hvb3Rlcl8uY29udHJvbGxlcl9pbmRleCgpOworICAgIGlmIChwb3NpdGlvbi0+cGx1bmdlciAmJiBwb3NpdGlvbi0+bGF0Y2gpIHsKKyAgICAgIC8vIFVzZSB0aGUgY29udHJvbGxlciB3aXRob3V0IHRoZSBzcHJpbmcgaWYgdGhlIGxhdGNoIGlzIHNldCBhbmQgdGhlCisgICAgICAvLyBwbHVuZ2VyIGlzIGJhY2sKKyAgICAgIHNob290ZXJfLnNldF9jb250cm9sbGVyX2luZGV4KDEpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBjb250cm9sbGVyIHdpdGggdGhlIHNwcmluZy4KKyAgICAgIHNob290ZXJfLnNldF9jb250cm9sbGVyX2luZGV4KDApOworICAgIH0KKyAgICBpZiAoc2hvb3Rlcl8uY29udHJvbGxlcl9pbmRleCgpICE9IGxhc3RfY29udHJvbGxlcl9pbmRleCkgeworICAgICAgc2hvb3Rlcl8uUmVjYWxjdWxhdGVQb3dlckdvYWwoKTsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKHN0YXRlXykgeworICAgIGNhc2UgU1RBVEVfSU5JVElBTElaRToKKyAgICAgIGlmIChwb3NpdGlvbikgeworICAgICAgICAvLyBSZWluaXRpYWxpemUgdGhlIGludGVybmFsIGZpbHRlciBzdGF0ZS4KKyAgICAgICAgc2hvb3Rlcl8uSW5pdGlhbGl6ZVN0YXRlKHBvc2l0aW9uLT5wb3NpdGlvbik7CisKKyAgICAgICAgLy8gU3RhcnQgb2ZmIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB3ZSBhcmUgYXQgdGhlIHZhbHVlCisgICAgICAgIC8vIGZ1dGhlc3QgYmFjayBnaXZlbiBvdXIgc2Vuc29ycy4KKyAgICAgICAgaWYgKHBvc2l0aW9uLT5wdXNoZXJfZGlzdGFsLmN1cnJlbnQpIHsKKyAgICAgICAgICBzaG9vdGVyXy5TZXRDYWxpYnJhdGlvbihwb3NpdGlvbi0+cG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNob290ZXIucHVzaGVyX2Rpc3RhbC5sb3dlcl9hbmdsZSk7CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24tPnB1c2hlcl9wcm94aW1hbC5jdXJyZW50KSB7CisgICAgICAgICAgc2hvb3Rlcl8uU2V0Q2FsaWJyYXRpb24ocG9zaXRpb24tPnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zaG9vdGVyLnB1c2hlcl9wcm94aW1hbC51cHBlcl9hbmdsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2hvb3Rlcl8uU2V0Q2FsaWJyYXRpb24ocG9zaXRpb24tPnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zaG9vdGVyLnVwcGVyX2xpbWl0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdvIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgICBzaG9vdGVyXy5TZXRHb2FsUG9zaXRpb24oc2hvb3Rlcl8uYWJzb2x1dGVfcG9zaXRpb24oKSwgMC4wKTsKKyAgICAgICAgLy8gSWYgdGhlIHBsdW5nZXIgaXMgYWxsIHRoZSB3YXkgYmFjaywgd2Ugd2FudCB0byBiZSBsYXRjaGVkLgorICAgICAgICBsYXRjaF9waXN0b25fID0gcG9zaXRpb24tPnBsdW5nZXI7CisgICAgICAgIGJyYWtlX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgICAgaWYgKHBvc2l0aW9uLT5sYXRjaCA9PSBsYXRjaF9waXN0b25fKSB7CisgICAgICAgICAgc3RhdGVfID0gU1RBVEVfUkVRVUVTVF9MT0FEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNob290ZXJfbG9vcF9kaXNhYmxlID0gdHJ1ZTsKKyAgICAgICAgICBMT0coREVCVUcsCisgICAgICAgICAgICAgICJOb3QgbW92aW5nIG9uIHVudGlsIHRoZSBsYXRjaCBoYXMgbW92ZWQgdG8gYXZvaWQgYSBjcmFzaFxuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHdlIGNhbid0IHN0YXJ0IHlldCBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hlcmUgd2UgYXJlLCBzZXQgdGhlCisgICAgICAgIC8vIGxhdGNoIGFuZCBicmFrZSB0byB0aGVpciBkZWZhdWx0cy4KKyAgICAgICAgbGF0Y2hfcGlzdG9uXyA9IHRydWU7CisgICAgICAgIGJyYWtlX3Bpc3Rvbl8gPSB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFURV9SRVFVRVNUX0xPQUQ6CisgICAgICBpZiAocG9zaXRpb24pIHsKKyAgICAgICAgemVyb2VkXyA9IGZhbHNlOworICAgICAgICBpZiAocG9zaXRpb24tPnB1c2hlcl9kaXN0YWwuY3VycmVudCB8fAorICAgICAgICAgICAgcG9zaXRpb24tPnB1c2hlcl9wcm94aW1hbC5jdXJyZW50KSB7CisgICAgICAgICAgLy8gV2Ugc3RhcnRlZCBvbiB0aGUgc2Vuc29yLCBiYWNrIHVwIHVudGlsIHdlIGFyZSBmb3VuZC4KKyAgICAgICAgICAvLyBJZiB0aGUgcGx1bmdlciBpcyBhbGwgdGhlIHdheSBiYWNrIGFuZCBub3QgbGF0Y2hlZCwgaXQgd29uJ3QgYmUKKyAgICAgICAgICAvLyB0aGVyZSBmb3IgbG9uZy4KKyAgICAgICAgICBzdGF0ZV8gPSBTVEFURV9MT0FEX0JBQ0tUUkFDSzsKKworICAgICAgICAgIC8vIFRoZSBwbHVuZ2VyIGlzIGFscmVhZHkgYmFjayBhbmQgbGF0Y2hlZC4gIERvbid0IHJlbGVhc2UgaXQuCisgICAgICAgICAgaWYgKHBvc2l0aW9uLT5wbHVuZ2VyICYmIHBvc2l0aW9uLT5sYXRjaCkgeworICAgICAgICAgICAgbGF0Y2hfcGlzdG9uXyA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxhdGNoX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24tPnBsdW5nZXIgJiYgcG9zaXRpb24tPmxhdGNoKSB7CisgICAgICAgICAgLy8gVGhlIHBsdW5nZXIgaXMgYmFjayBhbmQgd2UgYXJlIGxhdGNoZWQuICBXZSBtb3N0IGxpa2VseSBnb3QgaGVyZQorICAgICAgICAgIC8vIGZyb20gSW5pdGlhbGl6ZSwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvICdsb2FkJyBhZ2FpbiBhbnl3YXlzIHRvCisgICAgICAgICAgLy8gemVyby4KKyAgICAgICAgICBMb2FkKCk7CisgICAgICAgICAgbGF0Y2hfcGlzdG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gT2ZmIHRoZSBzZW5zb3IsIHN0YXJ0IGxvYWRpbmcuCisgICAgICAgICAgTG9hZCgpOworICAgICAgICAgIGxhdGNoX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBIb2xkIG91ciBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgc2hvb3Rlcl8uU2V0R29hbFBvc2l0aW9uKHNob290ZXJfLmFic29sdXRlX3Bvc2l0aW9uKCksIDAuMCk7CisgICAgICBicmFrZV9waXN0b25fID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVRFX0xPQURfQkFDS1RSQUNLOgorICAgICAgLy8gSWYgd2UgYXJlIGhlcmUsIHRoZW4gdGhhdCBtZWFucyB3ZSBzdGFydGVkIHBhc3QgdGhlIGVkZ2Ugd2hlcmUgd2Ugd2FudAorICAgICAgLy8gdG8gemVyby4gIE1vdmUgYmFja3dhcmRzIHVudGlsIHdlIGRvbid0IHNlZSB0aGUgc2Vuc29yIGFueW1vcmUuCisgICAgICAvLyBUaGUgcGx1bmdlciBpcyBjb250YWN0aW5nIHRoZSBwdXNoZXIgKG9yIHdpbGwgYmUgc2hvcnRseSkuCisKKyAgICAgIGlmICghZGlzYWJsZWQpIHsKKyAgICAgICAgc2hvb3Rlcl8uU2V0R29hbFBvc2l0aW9uKAorICAgICAgICAgICAgc2hvb3Rlcl8uZ29hbF9wb3NpdGlvbigpICsgdmFsdWVzLnNob290ZXIuemVyb2luZ19zcGVlZCAqIGR0LAorICAgICAgICAgICAgdmFsdWVzLnNob290ZXIuemVyb2luZ19zcGVlZCk7CisgICAgICB9CisgICAgICBjYXBfZ29hbCA9IHRydWU7CisgICAgICBzaG9vdGVyXy5zZXRfbWF4X3ZvbHRhZ2UoNC4wKTsKKworICAgICAgaWYgKHBvc2l0aW9uKSB7CisgICAgICAgIGlmICghcG9zaXRpb24tPnB1c2hlcl9kaXN0YWwuY3VycmVudCAmJgorICAgICAgICAgICAgIXBvc2l0aW9uLT5wdXNoZXJfcHJveGltYWwuY3VycmVudCkgeworICAgICAgICAgIExvYWQoKTsKKyAgICAgICAgfQorICAgICAgICBsYXRjaF9waXN0b25fID0gcG9zaXRpb24tPnBsdW5nZXI7CisgICAgICB9CisKKyAgICAgIGJyYWtlX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBVEVfTE9BRDoKKyAgICAgIC8vIElmIHdlIGFyZSBkaXNhYmxlZCByaWdodCBub3csIHJlc2V0IHRoZSB0aW1lci4KKyAgICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICBMb2FkKCk7CisgICAgICAgIC8vIExhdGNoIGRlZmF1bHRzIHRvIHRydWUgd2hlbiBkaXNhYmxlZC4gIExlYXZlIGl0IGxhdGNoZWQgdW50aWwgd2UgaGF2ZQorICAgICAgICAvLyB1c2VmdWwgc2Vuc29yIGRhdGEuCisgICAgICAgIGxhdGNoX3Bpc3Rvbl8gPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIGxvYWRfdGltZW91dF8gKz0gOjphb3M6OmNvbnRyb2xzOjprTG9vcEZyZXF1ZW5jeTsKKyAgICAgIH0KKyAgICAgIC8vIEdvIHRvIDAsIHdoaWNoIHNob3VsZCBiZSB0aGUgbGF0Y2ggcG9zaXRpb24sIG9yIHRyaWdnZXIgYSBoYWxsIGVmZmVjdAorICAgICAgLy8gb24gdGhlIHdheS4gIElmIHdlIGRvbid0IHNlZSBlZGdlcyB3aGVyZSB3ZSBhcmUgc3VwcG9zZWQgdG8sIHRoZQorICAgICAgLy8gb2Zmc2V0IHdpbGwgYmUgdXBkYXRlZCBieSBjb2RlIGFib3ZlLgorICAgICAgc2hvb3Rlcl8uU2V0R29hbFBvc2l0aW9uKDAuMCwgMC4wKTsKKworICAgICAgaWYgKHBvc2l0aW9uKSB7CisgICAgICAgIENoZWNrQ2FsaWJyYXRpb25zKHBvc2l0aW9uKTsKKworICAgICAgICAvLyBMYXRjaCBpZiB0aGUgcGx1bmdlciBpcyBmYXIgZW5vdWdoIGJhY2sgdG8gdHJpZ2dlciB0aGUgaGFsbCBlZmZlY3QuCisgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBkaXN0YWwgc2Vuc29yIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgbGF0Y2hfcGlzdG9uXyA9IHBvc2l0aW9uLT5wdXNoZXJfZGlzdGFsLmN1cnJlbnQgfHwgcG9zaXRpb24tPnBsdW5nZXI7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGxhdGNoZWQgYW5kIGJhY2suICBNYWtlIHN1cmUgdGhlIHBsdW5nZXIgaXMgYWxsIHRoZQorICAgICAgICAvLyB3YXkgYmFjayBhcyB3ZWxsLgorICAgICAgICBpZiAocG9zaXRpb24tPnBsdW5nZXIgJiYgcG9zaXRpb24tPmxhdGNoICYmCisgICAgICAgICAgICBwb3NpdGlvbi0+cHVzaGVyX2Rpc3RhbC5jdXJyZW50KSB7CisgICAgICAgICAgaWYgKCF6ZXJvZWRfKSB7CisgICAgICAgICAgICBzdGF0ZV8gPSBTVEFURV9SRVFVRVNUX0xPQUQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXRlXyA9IFNUQVRFX1BSRVBBUkVfU0hPVDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24tPnBsdW5nZXIgJiYKKyAgICAgICAgICAgICAgICAgICA6OnN0ZDo6YWJzKHNob290ZXJfLmFic29sdXRlX3Bvc2l0aW9uKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvb3Rlcl8uZ29hbF9wb3NpdGlvbigpKSA8IDAuMDAxKSB7CisgICAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBnb2FsLCBidXQgbm90IGxhdGNoZWQuCisgICAgICAgICAgc3RhdGVfID0gU1RBVEVfTE9BRElOR19QUk9CTEVNOworICAgICAgICAgIGxvYWRpbmdfcHJvYmxlbV9lbmRfdGltZV8gPSBUaW1lOjpOb3coKSArIGtMb2FkUHJvYmxlbUVuZFRpbWVvdXQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChsb2FkX3RpbWVvdXRfIDwgVGltZTo6Tm93KCkpIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uKSB7CisgICAgICAgICAgaWYgKCFwb3NpdGlvbi0+cHVzaGVyX2Rpc3RhbC5jdXJyZW50IHx8CisgICAgICAgICAgICAgICFwb3NpdGlvbi0+cHVzaGVyX3Byb3hpbWFsLmN1cnJlbnQpIHsKKyAgICAgICAgICAgIHN0YXRlXyA9IFNUQVRFX0VTVE9QOworICAgICAgICAgICAgTE9HKEVSUk9SLCAiRXN0b3BwaW5nIGJlY2F1c2UgdG9vayB0b28gbG9uZyB0byBsb2FkLlxuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmFrZV9waXN0b25fID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVRFX0xPQURJTkdfUFJPQkxFTToKKyAgICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICBzdGF0ZV8gPSBTVEFURV9SRVFVRVNUX0xPQUQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gV2UgZ290IHRvIHRoZSBnb2FsLCBidXQgdGhlIGxhdGNoIGhhc24ndCByZWdpc3RlcmVkIGFzIGRvd24uICBJdCBtaWdodAorICAgICAgLy8gYmUgc3R1Y2ssIG9yIG9uIGl0J3Mgd2F5IGJ1dCBub3QgdGhlcmUgeWV0LgorICAgICAgaWYgKFRpbWU6Ok5vdygpID4gbG9hZGluZ19wcm9ibGVtX2VuZF90aW1lXykgeworICAgICAgICAvLyBUaW1lb3V0IGJ5IHVubG9hZGluZy4KKyAgICAgICAgVW5sb2FkKCk7CisgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICYmIHBvc2l0aW9uLT5wbHVuZ2VyICYmIHBvc2l0aW9uLT5sYXRjaCkgeworICAgICAgICAvLyBJZiBib3RoIHRyaWdnZXIsIHdlIGFyZSBsYXRjaGVkLgorICAgICAgICBzdGF0ZV8gPSBTVEFURV9QUkVQQVJFX1NIT1Q7CisgICAgICB9CisgICAgICAvLyBNb3ZlIGEgYml0IGZ1cnRoZXIgYmFjayB0byBoZWxwIGl0IHRyaWdnZXIuCisgICAgICAvLyBJZiB0aGUgbGF0Y2ggaXMgc2xvdyBkdWUgdG8gdGhlIGFpciBmbG93aW5nIHRocm91Z2ggdGhlIHR1YmVzIG9yCisgICAgICAvLyBpbmVydGlhLCBidXQgaXMgb3RoZXJ3aXNlIGZyZWUsIHRoaXMgd29uJ3QgaGF2ZSBtdWNoIHRpbWUgdG8gZG8KKyAgICAgIC8vIGFueXRoaW5nIGFuZCBpcyBzYWZlLiAgT3RoZXJ3aXNlIHRoaXMgZ2l2ZXMgdXMgYSBiaXQgbW9yZSByb29tIHRvIGZyZWUKKyAgICAgIC8vIHVwIHRoZSBsYXRjaC4KKyAgICAgIHNob290ZXJfLlNldEdvYWxQb3NpdGlvbih2YWx1ZXMuc2hvb3Rlci5sb3dlcl9saW1pdCwgMC4wKTsKKyAgICAgIGlmIChwb3NpdGlvbikgeworICAgICAgICBMT0coREVCVUcsICJXYWl0aW5nIG9uIGxhdGNoOiBwbHVuZ2VyICVkLCBsYXRjaDogJWRcbiIsCisgICAgICAgICAgICBwb3NpdGlvbi0+cGx1bmdlciwgcG9zaXRpb24tPmxhdGNoKTsKKyAgICAgIH0KKworICAgICAgbGF0Y2hfcGlzdG9uXyA9IHRydWU7CisgICAgICBicmFrZV9waXN0b25fID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVRFX1BSRVBBUkVfU0hPVDoKKyAgICAgIC8vIE1vdmUgdGhlIHNob290ZXIgdG8gdGhlIHNob3QgcG93ZXIgc2V0IHBvaW50IGFuZCB0aGVuIGxvY2sgdGhlIGJyYWtlLgorICAgICAgLy8gVE9ETyhhdXN0aW4pOiBUaW1lb3V0LiAgTG93IHByaW9yaXR5LgorCisgICAgICBpZiAoZ29hbCkgeworICAgICAgICBzaG9vdGVyXy5TZXRHb2FsUG9zaXRpb24oUG93ZXJUb1Bvc2l0aW9uKGdvYWwtPnNob3RfcG93ZXIpLCAwLjApOworICAgICAgfQorCisgICAgICBMT0coREVCVUcsICJQRElGRjogYWJzb2x1dGVfcG9zaXRpb246ICUuMmYsIHBvdzogJS4yZlxuIiwKKyAgICAgICAgICBzaG9vdGVyXy5hYnNvbHV0ZV9wb3NpdGlvbigpLAorICAgICAgICAgIGdvYWwgPyBQb3dlclRvUG9zaXRpb24oZ29hbC0+c2hvdF9wb3dlcikKKyAgICAgICAgICAgICAgIDogOjpzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpKTsKKyAgICAgIGlmIChnb2FsICYmCisgICAgICAgICAgOjpzdGQ6OmFicyhzaG9vdGVyXy5hYnNvbHV0ZV9wb3NpdGlvbigpIC0KKyAgICAgICAgICAgICAgICAgICAgIFBvd2VyVG9Qb3NpdGlvbihnb2FsLT5zaG90X3Bvd2VyKSkgPCAwLjAwMSAmJgorICAgICAgICAgIDo6c3RkOjphYnMoc2hvb3Rlcl8uYWJzb2x1dGVfdmVsb2NpdHkoKSkgPCAwLjAwNSkgeworICAgICAgICAvLyBXZSBhcmUgdGhlcmUsIHNldCB0aGUgYnJha2UgYW5kIG1vdmUgb24uCisgICAgICAgIGxhdGNoX3Bpc3Rvbl8gPSB0cnVlOworICAgICAgICBicmFrZV9waXN0b25fID0gdHJ1ZTsKKyAgICAgICAgc2hvb3Rlcl9icmFrZV9zZXRfdGltZV8gPSBUaW1lOjpOb3coKSArIGtTaG9vdGVyQnJha2VTZXRUaW1lOworICAgICAgICBzdGF0ZV8gPSBTVEFURV9SRUFEWTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxhdGNoX3Bpc3Rvbl8gPSB0cnVlOworICAgICAgICBicmFrZV9waXN0b25fID0gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoZ29hbCAmJiBnb2FsLT51bmxvYWRfcmVxdWVzdGVkKSB7CisgICAgICAgIFVubG9hZCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFURV9SRUFEWToKKyAgICAgIExPRyhERUJVRywgIkluIHJlYWR5XG4iKTsKKyAgICAgIC8vIFdhaXQgdW50aWwgdGhlIGJyYWtlIGlzIHNldCwgYW5kIGEgc2hvdCBpcyByZXF1ZXN0ZWQgb3IgdGhlIHNob3QgcG93ZXIKKyAgICAgIC8vIGlzIGNoYW5nZWQuCisgICAgICBpZiAoVGltZTo6Tm93KCkgPiBzaG9vdGVyX2JyYWtlX3NldF90aW1lXykgeworICAgICAgICBzdGF0dXMtPnJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgLy8gV2UgaGF2ZSB3YWl0ZWQgbG9uZyBlbm91Z2ggZm9yIHRoZSBicmFrZSB0byBzZXQsIHR1cm4gdGhlIHNob290ZXIKKyAgICAgICAgLy8gY29udHJvbCBsb29wIG9mZi4KKyAgICAgICAgc2hvb3Rlcl9sb29wX2Rpc2FibGUgPSB0cnVlOworICAgICAgICBMT0coREVCVUcsICJCcmFrZSBpcyBub3cgc2V0XG4iKTsKKyAgICAgICAgaWYgKGdvYWwgJiYgZ29hbC0+c2hvdF9yZXF1ZXN0ZWQgJiYgIWRpc2FibGVkKSB7CisgICAgICAgICAgTE9HKERFQlVHLCAiU2hvb3Rpbmcgbm93XG4iKTsKKyAgICAgICAgICBzaG9vdGVyX2xvb3BfZGlzYWJsZSA9IHRydWU7CisgICAgICAgICAgc2hvdF9lbmRfdGltZV8gPSBUaW1lOjpOb3coKSArIGtTaG90RW5kVGltZW91dDsKKyAgICAgICAgICBmaXJpbmdfc3RhcnRpbmdfcG9zaXRpb25fID0gc2hvb3Rlcl8uYWJzb2x1dGVfcG9zaXRpb24oKTsKKyAgICAgICAgICBzdGF0ZV8gPSBTVEFURV9GSVJFOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RhdGVfID09IFNUQVRFX1JFQURZICYmIGdvYWwgJiYKKyAgICAgICAgICA6OnN0ZDo6YWJzKHNob290ZXJfLmFic29sdXRlX3Bvc2l0aW9uKCkgLQorICAgICAgICAgICAgICAgICAgICAgUG93ZXJUb1Bvc2l0aW9uKGdvYWwtPnNob3RfcG93ZXIpKSA+IDAuMDAyKSB7CisgICAgICAgIC8vIFRPRE8oYXVzdGluKTogQWRkIGEgc3RhdGUgdG8gcmVsZWFzZSB0aGUgYnJha2UuCisKKyAgICAgICAgLy8gVE9ETyhhdXN0aW4pOiBEbyB3ZSB3YW50IHRvIHNldCB0aGUgYnJha2UgaGVyZSBvciBhZnRlciBzaG9vdGluZz8KKyAgICAgICAgLy8gRGVwZW5kcyBvbiBhaXIgdXNhZ2UuCisgICAgICAgIHN0YXR1cy0+cmVhZHkgPSBmYWxzZTsKKyAgICAgICAgTE9HKERFQlVHLCAiUHJlcGFyaW5nIHNob3QgYWdhaW4uXG4iKTsKKyAgICAgICAgc3RhdGVfID0gU1RBVEVfUFJFUEFSRV9TSE9UOworICAgICAgfQorCisgICAgICBpZiAoZ29hbCkgeworICAgICAgICBzaG9vdGVyXy5TZXRHb2FsUG9zaXRpb24oUG93ZXJUb1Bvc2l0aW9uKGdvYWwtPnNob3RfcG93ZXIpLCAwLjApOworICAgICAgfQorCisgICAgICBsYXRjaF9waXN0b25fID0gdHJ1ZTsKKyAgICAgIGJyYWtlX3Bpc3Rvbl8gPSB0cnVlOworCisgICAgICBpZiAoZ29hbCAmJiBnb2FsLT51bmxvYWRfcmVxdWVzdGVkKSB7CisgICAgICAgIFVubG9hZCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUQVRFX0ZJUkU6CisgICAgICBpZiAoZGlzYWJsZWQpIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uKSB7CisgICAgICAgICAgaWYgKHBvc2l0aW9uLT5wbHVuZ2VyKSB7CisgICAgICAgICAgICAvLyBJZiBkaXNhYmxlZCBhbmQgdGhlIHBsdW5nZXIgaXMgc3RpbGwgYmFjayB0aGVyZSwgcmVzZXQgdGhlCisgICAgICAgICAgICAvLyB0aW1lb3V0LgorICAgICAgICAgICAgc2hvdF9lbmRfdGltZV8gPSBUaW1lOjpOb3coKSArIGtTaG90RW5kVGltZW91dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNob290ZXJfbG9vcF9kaXNhYmxlID0gdHJ1ZTsKKyAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgY29udGlndW91cyBjeWNsZXMgZHVyaW5nIHdoaWNoIHdlIGhhdmVuJ3QgbW92ZWQuCisgICAgICBpZiAoOjpzdGQ6OmFicyhsYXN0X3Bvc2l0aW9uXy5wb3NpdGlvbiAtIHNob290ZXJfLmFic29sdXRlX3Bvc2l0aW9uKCkpIDwKKyAgICAgICAgICAwLjAwMDUpIHsKKyAgICAgICAgKytjeWNsZXNfbm90X21vdmVkXzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN5Y2xlc19ub3RfbW92ZWRfID0gMDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgaGF2ZSBtb3ZlZCBhbnkgYW1vdW50IHNpbmNlIHRoZSBzdGFydCBhbmQgdGhlIHNob290ZXIgaGFzIG5vdworICAgICAgLy8gYmVlbiBzdGlsbCBmb3IgYSBjb3VwbGUgY3ljbGVzLCB0aGUgc2hvdCBmaW5pc2hlZC4KKyAgICAgIC8vIEFsc28gbW92ZSBvbiBpZiBpdCB0aW1lcyBvdXQuCisgICAgICBpZiAoKDo6c3RkOjphYnMoZmlyaW5nX3N0YXJ0aW5nX3Bvc2l0aW9uXyAtCisgICAgICAgICAgICAgICAgICAgICAgc2hvb3Rlcl8uYWJzb2x1dGVfcG9zaXRpb24oKSkgPiAwLjAwMDUgJiYKKyAgICAgICAgICAgY3ljbGVzX25vdF9tb3ZlZF8gPiAzKSB8fAorICAgICAgICAgIFRpbWU6Ok5vdygpID4gc2hvdF9lbmRfdGltZV8pIHsKKyAgICAgICAgc3RhdGVfID0gU1RBVEVfUkVRVUVTVF9MT0FEOworICAgICAgICArK3Nob3RfY291bnRfOworICAgICAgfQorICAgICAgbGF0Y2hfcGlzdG9uXyA9IGZhbHNlOworICAgICAgYnJha2VfcGlzdG9uXyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVRFX1VOTE9BRDoKKyAgICAgIC8vIFJlc2V0IHRoZSB0aW1lb3V0cy4KKyAgICAgIGlmIChkaXNhYmxlZCkgVW5sb2FkKCk7CisKKyAgICAgIC8vIElmIGl0IGlzIGxhdGNoZWQgYW5kIHRoZSBwbHVuZ2VyIGlzIGJhY2ssIG1vdmUgdGhlIHB1c2hlciBiYWNrIHRvIGNhdGNoCisgICAgICAvLyB0aGUgcGx1bmdlci4KKyAgICAgIGJvb2wgYWxsX2JhY2s7CisgICAgICBpZiAocG9zaXRpb24pIHsKKyAgICAgICAgYWxsX2JhY2sgPSBwb3NpdGlvbi0+cGx1bmdlciAmJiBwb3NpdGlvbi0+bGF0Y2g7CisgICAgICB9IGVsc2UgeworICAgICAgICBhbGxfYmFjayA9IGxhc3RfcG9zaXRpb25fLnBsdW5nZXIgJiYgbGFzdF9wb3NpdGlvbl8ubGF0Y2g7CisgICAgICB9CisKKyAgICAgIGlmIChhbGxfYmFjaykgeworICAgICAgICAvLyBQdWxsIGJhY2sgdG8gMCwgMC4KKyAgICAgICAgc2hvb3Rlcl8uU2V0R29hbFBvc2l0aW9uKDAuMCwgMC4wKTsKKyAgICAgICAgaWYgKHNob290ZXJfLmFic29sdXRlX3Bvc2l0aW9uKCkgPCAwLjAwNSkgeworICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGNsb3NlIGVub3VnaCwgJ2ZpcmUnLgorICAgICAgICAgIGxhdGNoX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsYXRjaF9waXN0b25fID0gdHJ1ZTsKKworICAgICAgICAgIGlmIChwb3NpdGlvbikgeworICAgICAgICAgICAgQ2hlY2tDYWxpYnJhdGlvbnMocG9zaXRpb24pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIHBsdW5nZXIgaXNuJ3QgYWxsIHRoZSB3YXkgYmFjaywgb3IgaXQgaXMgYW5kIGl0IGlzIHVubGF0Y2hlZCwgc28KKyAgICAgICAgLy8gd2UgY2FuIG5vdyB1bmxvYWQuCisgICAgICAgIHNob290ZXJfLlNldEdvYWxQb3NpdGlvbihzaG9vdGVyXy5hYnNvbHV0ZV9wb3NpdGlvbigpLCAwLjApOworICAgICAgICBsYXRjaF9waXN0b25fID0gZmFsc2U7CisgICAgICAgIHN0YXRlXyA9IFNUQVRFX1VOTE9BRF9NT1ZFOworICAgICAgICB1bmxvYWRfdGltZW91dF8gPSBUaW1lOjpOb3coKSArIGtVbmxvYWRUaW1lb3V0OworICAgICAgfQorCisgICAgICBpZiAoVGltZTo6Tm93KCkgPiB1bmxvYWRfdGltZW91dF8pIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBiZWVuIHN0dWNrIHRyeWluZyB0byB1bmxvYWQgZm9yIHdheSB0b28gbG9uZywgZ2l2ZSB1cCBhbmQKKyAgICAgICAgLy8gdHVybiBldmVyeXRoaW5nIG9mZi4KKyAgICAgICAgc3RhdGVfID0gU1RBVEVfRVNUT1A7CisgICAgICAgIExPRyhFUlJPUiwgIkVzdG9wcGluZyBiZWNhdXNlIHRvb2sgdG9vIGxvbmcgdG8gdW5sb2FkLlxuIik7CisgICAgICB9CisKKyAgICAgIGJyYWtlX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBVEVfVU5MT0FEX01PVkU6IHsKKyAgICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICB1bmxvYWRfdGltZW91dF8gPSBUaW1lOjpOb3coKSArIGtVbmxvYWRUaW1lb3V0OworICAgICAgICBzaG9vdGVyXy5TZXRHb2FsUG9zaXRpb24oc2hvb3Rlcl8uYWJzb2x1dGVfcG9zaXRpb24oKSwgMC4wKTsKKyAgICAgIH0KKyAgICAgIGNhcF9nb2FsID0gdHJ1ZTsKKyAgICAgIHNob290ZXJfLnNldF9tYXhfdm9sdGFnZSg2LjApOworCisgICAgICAvLyBTbG93bHkgbW92ZSBiYWNrIHVudGlsIHdlIGhpdCB0aGUgdXBwZXIgbGltaXQuCisgICAgICAvLyBJZiB3ZSB3ZXJlIGF0IHRoZSBsaW1pdCBsYXN0IGN5Y2xlLCB3ZSBhcmUgZG9uZSB1bmxvYWRpbmcuCisgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgaWYgd2Ugc2F0dXJhdGUsIHdlIG1pZ2h0IGhpdCB0aGUgbGltaXQgYmVmb3JlIHdlIGFyZQorICAgICAgLy8gYWN0dWFsbHkgdGhlcmUuCisgICAgICBpZiAoc2hvb3Rlcl8uZ29hbF9wb3NpdGlvbigpID49IHZhbHVlcy5zaG9vdGVyLnVwcGVyX2xpbWl0KSB7CisgICAgICAgIHNob290ZXJfLlNldEdvYWxQb3NpdGlvbih2YWx1ZXMuc2hvb3Rlci51cHBlcl9saW1pdCwgMC4wKTsKKyAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgbG9vcCBmaWdodGluZyB0aGUgc3ByaW5nIHdoZW4gd2UgYXJlIHVubG9hZGVkLgorICAgICAgICAvLyBUdXJuIGl0IG9mZi4KKyAgICAgICAgc2hvb3Rlcl9sb29wX2Rpc2FibGUgPSB0cnVlOworICAgICAgICBzdGF0ZV8gPSBTVEFURV9SRUFEWV9VTkxPQUQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBzaG9vdGVyXy5TZXRHb2FsUG9zaXRpb24oCisgICAgICAgICAgICA6OnN0ZDo6bWluKAorICAgICAgICAgICAgICAgIHZhbHVlcy5zaG9vdGVyLnVwcGVyX2xpbWl0LAorICAgICAgICAgICAgICAgIHNob290ZXJfLmdvYWxfcG9zaXRpb24oKSArIHZhbHVlcy5zaG9vdGVyLnVubG9hZF9zcGVlZCAqIGR0KSwKKyAgICAgICAgICAgIHZhbHVlcy5zaG9vdGVyLnVubG9hZF9zcGVlZCk7CisgICAgICB9CisKKyAgICAgIGxhdGNoX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgIGJyYWtlX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgU1RBVEVfUkVBRFlfVU5MT0FEOgorICAgICAgaWYgKGdvYWwgJiYgZ29hbC0+bG9hZF9yZXF1ZXN0ZWQpIHsKKyAgICAgICAgc3RhdGVfID0gU1RBVEVfUkVRVUVTVF9MT0FEOworICAgICAgfQorICAgICAgLy8gSWYgd2UgYXJlIHJlYWR5IHRvIGxvYWQgYWdhaW4sCisgICAgICBzaG9vdGVyX2xvb3BfZGlzYWJsZSA9IHRydWU7CisKKyAgICAgIGxhdGNoX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgIGJyYWtlX3Bpc3Rvbl8gPSBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVEFURV9FU1RPUDoKKyAgICAgIExPRyhXQVJOSU5HLCAiZXN0b3BwZWRcbiIpOworICAgICAgLy8gVG90YWxseSBsb3N0LCBnbyB0byBhIHNhZmUgc3RhdGUuCisgICAgICBzaG9vdGVyX2xvb3BfZGlzYWJsZSA9IHRydWU7CisgICAgICBsYXRjaF9waXN0b25fID0gdHJ1ZTsKKyAgICAgIGJyYWtlX3Bpc3Rvbl8gPSB0cnVlOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoIXNob290ZXJfbG9vcF9kaXNhYmxlKSB7CisgICAgTE9HX1NUUlVDVChERUJVRywgInJ1bm5pbmcgdGhlIGxvb3AiLAorICAgICAgICAgICAgICAgU2hvb3RlclN0YXR1c1RvTG9nKHNob290ZXJfLmdvYWxfcG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9vdGVyXy5hYnNvbHV0ZV9wb3NpdGlvbigpKSk7CisgICAgaWYgKCFjYXBfZ29hbCkgeworICAgICAgc2hvb3Rlcl8uc2V0X21heF92b2x0YWdlKDEyLjApOworICAgIH0KKyAgICBzaG9vdGVyXy5VcGRhdGUob3V0cHV0ID09IE5VTEwpOworICAgIGlmIChjYXBfZ29hbCkgeworICAgICAgc2hvb3Rlcl8uQ2FwR29hbCgpOworICAgIH0KKyAgICAvLyBXZSBkb24ndCByZWFsbHkgd2FudCB0byBvdXRwdXQgYW55dGhpbmcgaWYgd2Ugd2VudCB0aHJvdWdoIGV2ZXJ5dGhpbmcKKyAgICAvLyBhc3N1bWluZyB0aGUgbW90b3JzIHdlcmVuJ3Qgd29ya2luZy4KKyAgICBpZiAob3V0cHV0KSBvdXRwdXQtPnZvbHRhZ2UgPSBzaG9vdGVyXy52b2x0YWdlKCk7CisgIH0gZWxzZSB7CisgICAgc2hvb3Rlcl8uVXBkYXRlKHRydWUpOworICAgIHNob290ZXJfLlplcm9Qb3dlcigpOworICAgIGlmIChvdXRwdXQpIG91dHB1dC0+dm9sdGFnZSA9IDAuMDsKKyAgfQorCisgIHN0YXR1cy0+aGFyZF9zdG9wX3Bvd2VyID0gUG9zaXRpb25Ub1Bvd2VyKHNob290ZXJfLmFic29sdXRlX3Bvc2l0aW9uKCkpOworCisgIGlmIChvdXRwdXQpIHsKKyAgICBvdXRwdXQtPmxhdGNoX3Bpc3RvbiA9IGxhdGNoX3Bpc3Rvbl87CisgICAgb3V0cHV0LT5icmFrZV9waXN0b24gPSBicmFrZV9waXN0b25fOworICB9CisKKyAgaWYgKHBvc2l0aW9uKSB7CisgICAgTE9HX1NUUlVDVChERUJVRywgImludGVybmFsIHN0YXRlIiwKKyAgICAgICAgICAgICAgIFNob290ZXJTdGF0ZVRvTG9nKAorICAgICAgICAgICAgICAgICAgIHNob290ZXJfLmFic29sdXRlX3Bvc2l0aW9uKCksIHNob290ZXJfLmFic29sdXRlX3ZlbG9jaXR5KCksCisgICAgICAgICAgICAgICAgICAgc3RhdGVfLCBwb3NpdGlvbi0+bGF0Y2gsIHBvc2l0aW9uLT5wdXNoZXJfcHJveGltYWwuY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cHVzaGVyX2Rpc3RhbC5jdXJyZW50LCBwb3NpdGlvbi0+cGx1bmdlciwKKyAgICAgICAgICAgICAgICAgICBicmFrZV9waXN0b25fLCBsYXRjaF9waXN0b25fKSk7CisKKyAgICBsYXN0X3Bvc2l0aW9uXyA9ICpwb3NpdGlvbjsKKworICAgIGxhc3RfZGlzdGFsX3Bvc2VkZ2VfY291bnRfID0gcG9zaXRpb24tPnB1c2hlcl9kaXN0YWwucG9zZWRnZV9jb3VudDsKKyAgICBsYXN0X3Byb3hpbWFsX3Bvc2VkZ2VfY291bnRfID0gcG9zaXRpb24tPnB1c2hlcl9wcm94aW1hbC5wb3NlZGdlX2NvdW50OworICAgIGxhc3RfZGlzdGFsX2N1cnJlbnRfID0gcG9zaXRpb24tPnB1c2hlcl9kaXN0YWwuY3VycmVudDsKKyAgICBsYXN0X3Byb3hpbWFsX2N1cnJlbnRfID0gcG9zaXRpb24tPnB1c2hlcl9wcm94aW1hbC5jdXJyZW50OworICB9CisKKyAgc3RhdHVzLT5zaG90cyA9IHNob3RfY291bnRfOworfQorCit2b2lkIFNob290ZXJNb3Rvcjo6WmVyb091dHB1dHMoKSB7CisgIHF1ZXVlX2dyb3VwKCktPm91dHB1dC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLnZvbHRhZ2UoMCkKKyAgICAgIC5sYXRjaF9waXN0b24obGF0Y2hfcGlzdG9uXykKKyAgICAgIC5icmFrZV9waXN0b24oYnJha2VfcGlzdG9uXykKKyAgICAgIC5TZW5kKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlci5neXAgYi95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlci5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2YjU5MgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLmd5cApAQCAtMCwwICsxLDgyIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdyZXBsYXlfc2hvb3RlcicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdub19yc3luYyc6IDEsCisgICAgICB9LAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdyZXBsYXlfc2hvb3Rlci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3Nob290ZXJfcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6cmVwbGF5X2NvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc2hvb3Rlcl9xdWV1ZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsnc2hvb3Rlci5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3F1ZXVlcycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpxdWV1ZXMnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3F1ZXVlcycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpxdWV1ZXMnLAorICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vLi4vYW9zL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc2hvb3Rlcl9saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzaG9vdGVyLmNjJywKKyAgICAgICAgJ3Nob290ZXJfbW90b3JfcGxhbnQuY2MnLAorICAgICAgICAndW5hdWdtZW50ZWRfc2hvb3Rlcl9tb3Rvcl9wbGFudC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3Nob290ZXJfcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L3kyMDE0Lmd5cDpjb25zdGFudHMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICdzaG9vdGVyX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc2hvb3Rlcl9saWJfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnc2hvb3Rlcl9saWJfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdzaG9vdGVyX3F1ZXVlJywKKyAgICAgICAgJ3Nob290ZXJfbGliJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcF90ZXN0JywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzaG9vdGVyJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzaG9vdGVyX21haW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJ3Nob290ZXJfbGliJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLmggYi95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzQ3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlci5oCkBAIC0wLDAgKzEsMjI0IEBACisjaWZuZGVmIFkyMDE0X0NPTlRST0xfTE9PUFNfc2hvb3Rlcl9zaG9vdGVyX0hfCisjZGVmaW5lIFkyMDE0X0NPTlRST0xfTE9PUFNfc2hvb3Rlcl9zaG9vdGVyX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKworI2luY2x1ZGUgInkyMDE0L2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyX21vdG9yX3BsYW50LmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIucS5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK2NsYXNzIFNob290ZXJUZXN0X1VubG9hZFdpbmR1cFBvc2l0aXZlX1Rlc3Q7CitjbGFzcyBTaG9vdGVyVGVzdF9VbmxvYWRXaW5kdXBOZWdhdGl2ZV9UZXN0OworY2xhc3MgU2hvb3RlclRlc3RfUmV6ZXJvV2hpbGVVbmxvYWRpbmdfVGVzdDsKK307CisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCisvLyBOb3RlOiBFdmVyeXRoaW5nIGluIHRoaXMgZmlsZSBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYSAxIGN5Y2xlIGRlbGF5IGJldHdlZW4KKy8vIHBvd2VyIGJlaW5nIHJlcXVlc3RlZCBhbmQgaXQgc2hvd2luZyB1cCBhdCB0aGUgbW90b3IuICBJdCBhc3N1bWVzIHRoYXQKKy8vIFhfaGF0KDIsIDEpIGlzIHRoZSB2b2x0YWdlIGJlaW5nIGFwcGxpZWQgYXMgd2VsbC4gIEl0IHdpbGwgZ28gdW5zdGFibGUgaWYKKy8vIHRoYXQgaXNuJ3QgdHJ1ZS4KKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBDYXBVIGZ1bmN0aW9uIGNvcnJlY3RseSBnaXZlbiBhbGwgdGhlIGV4dHJhCisvLyBpbmZvcm1hdGlvbiB0aGF0IHdlIGtub3cgYWJvdXQuCisvLyBJdCBkb2VzIG5vdCBoYXZlIGFueSB6ZXJvaW5nIGxvZ2ljIGluIGl0LCBvbmx5IGxvZ2ljIHRvIGRlYWwgd2l0aCBhIGRlbHRhIFUKKy8vIGNvbnRyb2xsZXIuCitjbGFzcyBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcCA6IHB1YmxpYyBTdGF0ZUZlZWRiYWNrTG9vcDwzLCAxLCAxPiB7CisgcHVibGljOgorICBaZXJvZWRTdGF0ZUZlZWRiYWNrTG9vcChTdGF0ZUZlZWRiYWNrTG9vcDwzLCAxLCAxPiAmJmxvb3ApCisgICAgICA6IFN0YXRlRmVlZGJhY2tMb29wPDMsIDEsIDE+KDo6c3RkOjptb3ZlKGxvb3ApKSwKKyAgICAgICAgdm9sdGFnZV8oMC4wKSwKKyAgICAgICAgbGFzdF92b2x0YWdlXygwLjApLAorICAgICAgICB1bmNhcHBlZF92b2x0YWdlXygwLjApLAorICAgICAgICBvZmZzZXRfKDAuMCksCisgICAgICAgIG1heF92b2x0YWdlXygxMi4wKSwKKyAgICAgICAgY2FwcGVkX2dvYWxfKGZhbHNlKSB7fQorCisgIGNvbnN0IHN0YXRpYyBpbnQga1plcm9pbmdNYXhWb2x0YWdlID0gNTsKKworICB2aXJ0dWFsIHZvaWQgQ2FwVSgpOworCisgIC8vIFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZvbHRhZ2UuCisgIGRvdWJsZSB2b2x0YWdlKCkgY29uc3QgeyByZXR1cm4gdm9sdGFnZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSB1bmNhcHBlZCB2b2x0YWdlLgorICBkb3VibGUgdW5jYXBwZWRfdm9sdGFnZSgpIGNvbnN0IHsgcmV0dXJuIHVuY2FwcGVkX3ZvbHRhZ2VfOyB9CisKKyAgLy8gWmVyb3MgdGhlIGFjY3VtdWxhdG9yLgorICB2b2lkIFplcm9Qb3dlcigpIHsgdm9sdGFnZV8gPSAwLjA7IH0KKworICAvLyBTZXRzIHRoZSBjYWxpYnJhdGlvbiBvZmZzZXQgZ2l2ZW4gdGhlIGFic29sdXRlIGFuZ2xlIGFuZCB0aGUgY29ycmlzcG9uZGluZworICAvLyBlbmNvZGVyIHZhbHVlLgorICB2b2lkIFNldENhbGlicmF0aW9uKGRvdWJsZSBlbmNvZGVyX3ZhbCwgZG91YmxlIGtub3duX3Bvc2l0aW9uKTsKKworICBkb3VibGUgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gb2Zmc2V0XzsgfQorCisgIGRvdWJsZSBhYnNvbHV0ZV9wb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIFhfaGF0KDAsIDApICsga1Bvc2l0aW9uT2Zmc2V0OyB9CisgIGRvdWJsZSBhYnNvbHV0ZV92ZWxvY2l0eSgpIGNvbnN0IHsgcmV0dXJuIFhfaGF0KDEsIDApOyB9CisKKyAgdm9pZCBDb3JyZWN0UG9zaXRpb24oZG91YmxlIHBvc2l0aW9uKSB7CisgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFk7CisgICAgWSA8PCBwb3NpdGlvbiArIG9mZnNldF8gLSBrUG9zaXRpb25PZmZzZXQ7CisgICAgQ29ycmVjdChZKTsKKyAgfQorCisgIC8vIFJlY29tcHV0ZXMgdGhlIHBvd2VyIGdvYWwgZm9yIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIgYW5kIHBvc2l0aW9uL3ZlbG9jaXR5LgorICB2b2lkIFJlY2FsY3VsYXRlUG93ZXJHb2FsKCk7CisKKyAgZG91YmxlIGdvYWxfcG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBSKDAsIDApICsga1Bvc2l0aW9uT2Zmc2V0OyB9CisgIGRvdWJsZSBnb2FsX3ZlbG9jaXR5KCkgY29uc3QgeyByZXR1cm4gUigxLCAwKTsgfQorICB2b2lkIEluaXRpYWxpemVTdGF0ZShkb3VibGUgcG9zaXRpb24pIHsKKyAgICBtdXRhYmxlX1hfaGF0KDAsIDApID0gcG9zaXRpb24gLSBrUG9zaXRpb25PZmZzZXQ7CisgICAgbXV0YWJsZV9YX2hhdCgxLCAwKSA9IDAuMDsKKyAgICBtdXRhYmxlX1hfaGF0KDIsIDApID0gMC4wOworICB9CisKKyAgdm9pZCBTZXRHb2FsUG9zaXRpb24oZG91YmxlIGRlc2lyZWRfcG9zaXRpb24sIGRvdWJsZSBkZXNpcmVkX3ZlbG9jaXR5KSB7CisgICAgTE9HKERFQlVHLCAiR29hbCBwb3NpdGlvbjogJWYgR29hbCB2ZWxvY2l0eTogJWZcbiIsIGRlc2lyZWRfcG9zaXRpb24sCisgICAgICAgIGRlc2lyZWRfdmVsb2NpdHkpOworCisgICAgbXV0YWJsZV9SKCkgPDwgZGVzaXJlZF9wb3NpdGlvbiAtIGtQb3NpdGlvbk9mZnNldCwgZGVzaXJlZF92ZWxvY2l0eSwKKyAgICAgICAgKC1BKDEsIDApIC8gQSgxLCAyKSAqIChkZXNpcmVkX3Bvc2l0aW9uIC0ga1Bvc2l0aW9uT2Zmc2V0KSAtCisgICAgICAgICBBKDEsIDEpIC8gQSgxLCAyKSAqIGRlc2lyZWRfdmVsb2NpdHkpOworICB9CisKKyAgZG91YmxlIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gWF9oYXQoMCwgMCkgLSBvZmZzZXRfICsga1Bvc2l0aW9uT2Zmc2V0OyB9CisKKyAgdm9pZCBzZXRfbWF4X3ZvbHRhZ2UoZG91YmxlIG1heF92b2x0YWdlKSB7IG1heF92b2x0YWdlXyA9IG1heF92b2x0YWdlOyB9CisgIGJvb2wgY2FwcGVkX2dvYWwoKSBjb25zdCB7IHJldHVybiBjYXBwZWRfZ29hbF87IH0KKworICB2b2lkIENhcEdvYWwoKTsKKworICAvLyBGcmllbmQgdGhlIHRlc3QgY2xhc3NlcyBmb3IgYWNjZXMgdG8gdGhlIGludGVybmFsIHN0YXRlLgorICBmcmllbmQgY2xhc3MgdGVzdGluZzo6U2hvb3RlclRlc3RfUmV6ZXJvV2hpbGVVbmxvYWRpbmdfVGVzdDsKKworIHByaXZhdGU6CisgIC8vIFRoZSBvZmZzZXQgYmV0d2VlbiB3aGF0IGlzICcwJyAoMCByYXRlIG9uIHRoZSBzcHJpbmcpIGFuZCB0aGUgMCAoYWxsIHRoZQorICAvLyB3YXkgY29ja2VkKS4KKyAgY29uc3RleHByIHN0YXRpYyBkb3VibGUga1Bvc2l0aW9uT2Zmc2V0ID0ga01heEV4dGVuc2lvbjsKKyAgLy8gVGhlIGFjY3VtdWxhdGVkIHZvbHRhZ2UgdG8gYXBwbHkgdG8gdGhlIG1vdG9yLgorICBkb3VibGUgdm9sdGFnZV87CisgIGRvdWJsZSBsYXN0X3ZvbHRhZ2VfOworICBkb3VibGUgdW5jYXBwZWRfdm9sdGFnZV87CisgIGRvdWJsZSBvZmZzZXRfOworICBkb3VibGUgbWF4X3ZvbHRhZ2VfOworICBib29sIGNhcHBlZF9nb2FsXzsKK307CisKK2NvbnN0IFRpbWUga1VubG9hZFRpbWVvdXQgPSBUaW1lOjpJblNlY29uZHMoMTApOworY29uc3QgVGltZSBrTG9hZFRpbWVvdXQgPSBUaW1lOjpJblNlY29uZHMoMik7Citjb25zdCBUaW1lIGtMb2FkUHJvYmxlbUVuZFRpbWVvdXQgPSBUaW1lOjpJblNlY29uZHMoMS4wKTsKK2NvbnN0IFRpbWUga1Nob290ZXJCcmFrZVNldFRpbWUgPSBUaW1lOjpJblNlY29uZHMoMC4wNSk7CisvLyBUaW1lIHRvIHdhaXQgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBsYXRjaCBwaXN0b24gYmVmb3JlIHdpbmNoaW5nIGJhY2sgYWdhaW4uCitjb25zdCBUaW1lIGtTaG90RW5kVGltZW91dCA9IFRpbWU6OkluU2Vjb25kcygwLjIpOworY29uc3QgVGltZSBrUHJlcGFyZUZpcmVFbmRUaW1lID0gVGltZTo6SW5NUyg0MCk7CisKK2NsYXNzIFNob290ZXJNb3RvcgorICAgIDogcHVibGljIGFvczo6Y29udHJvbHM6OkNvbnRyb2xMb29wPGNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZT4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2hvb3Rlck1vdG9yKGNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZSAqbXlfc2hvb3RlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xfbG9vcHM6OnNob290ZXJfcXVldWUpOworCisgIC8vIFRydWUgaWYgdGhlIGdvYWwgd2FzIG1vdmVkIHRvIGF2b2lkIGdvYWwgd2luZHVwLgorICBib29sIGNhcHBlZF9nb2FsKCkgY29uc3QgeyByZXR1cm4gc2hvb3Rlcl8uY2FwcGVkX2dvYWwoKTsgfQorCisgIGRvdWJsZSBQb3dlclRvUG9zaXRpb24oZG91YmxlIHBvd2VyKTsKKyAgZG91YmxlIFBvc2l0aW9uVG9Qb3dlcihkb3VibGUgcG9zaXRpb24pOworICB2b2lkIENoZWNrQ2FsaWJyYXRpb25zKGNvbnN0IGNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uKTsKKworICB0eXBlZGVmIGVudW0geworICAgIFNUQVRFX0lOSVRJQUxJWkUgPSAwLAorICAgIFNUQVRFX1JFUVVFU1RfTE9BRCA9IDEsCisgICAgU1RBVEVfTE9BRF9CQUNLVFJBQ0sgPSAyLAorICAgIFNUQVRFX0xPQUQgPSAzLAorICAgIFNUQVRFX0xPQURJTkdfUFJPQkxFTSA9IDQsCisgICAgU1RBVEVfUFJFUEFSRV9TSE9UID0gNSwKKyAgICBTVEFURV9SRUFEWSA9IDYsCisgICAgU1RBVEVfRklSRSA9IDgsCisgICAgU1RBVEVfVU5MT0FEID0gOSwKKyAgICBTVEFURV9VTkxPQURfTU9WRSA9IDEwLAorICAgIFNUQVRFX1JFQURZX1VOTE9BRCA9IDExLAorICAgIFNUQVRFX0VTVE9QID0gMTIKKyAgfSBTdGF0ZTsKKworICBTdGF0ZSBzdGF0ZSgpIHsgcmV0dXJuIHN0YXRlXzsgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgUnVuSXRlcmF0aW9uKAorICAgICAgY29uc3QgU2hvb3RlclF1ZXVlOjpHb2FsICpnb2FsLAorICAgICAgY29uc3QgY29udHJvbF9sb29wczo6U2hvb3RlclF1ZXVlOjpQb3NpdGlvbiAqcG9zaXRpb24sCisgICAgICBTaG9vdGVyUXVldWU6Ok91dHB1dCAqb3V0cHV0LCBTaG9vdGVyUXVldWU6OlN0YXR1cyAqc3RhdHVzKTsKKworIHByaXZhdGU6CisgIC8vIFdlIGhhdmUgdG8gb3ZlcnJpZGUgdGhpcyB0byBrZWVwIHRoZSBwaXN0b25zIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9ucy4KKyAgdmlydHVhbCB2b2lkIFplcm9PdXRwdXRzKCk7CisKKyAgLy8gRnJpZW5kIHRoZSB0ZXN0IGNsYXNzZXMgZm9yIGFjY2VzIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZS4KKyAgZnJpZW5kIGNsYXNzIHRlc3Rpbmc6OlNob290ZXJUZXN0X1VubG9hZFdpbmR1cFBvc2l0aXZlX1Rlc3Q7CisgIGZyaWVuZCBjbGFzcyB0ZXN0aW5nOjpTaG9vdGVyVGVzdF9VbmxvYWRXaW5kdXBOZWdhdGl2ZV9UZXN0OworICBmcmllbmQgY2xhc3MgdGVzdGluZzo6U2hvb3RlclRlc3RfUmV6ZXJvV2hpbGVVbmxvYWRpbmdfVGVzdDsKKworICAvLyBFbnRlciBzdGF0ZSBTVEFURV9VTkxPQUQKKyAgdm9pZCBVbmxvYWQoKSB7CisgICAgc3RhdGVfID0gU1RBVEVfVU5MT0FEOworICAgIHVubG9hZF90aW1lb3V0XyA9IFRpbWU6Ok5vdygpICsga1VubG9hZFRpbWVvdXQ7CisgIH0KKyAgLy8gRW50ZXIgc3RhdGUgU1RBVEVfTE9BRAorICB2b2lkIExvYWQoKSB7CisgICAgc3RhdGVfID0gU1RBVEVfTE9BRDsKKyAgICBsb2FkX3RpbWVvdXRfID0gVGltZTo6Tm93KCkgKyBrTG9hZFRpbWVvdXQ7CisgIH0KKworICBjb250cm9sX2xvb3BzOjpTaG9vdGVyUXVldWU6OlBvc2l0aW9uIGxhc3RfcG9zaXRpb25fOworCisgIFplcm9lZFN0YXRlRmVlZGJhY2tMb29wIHNob290ZXJfOworCisgIC8vIHN0YXRlIG1hY2hpbmUgc3RhdGUKKyAgU3RhdGUgc3RhdGVfOworCisgIC8vIHRpbWUgdG8gZ2l2aW5nIHVwIG9uIGxvYWRpbmcgcHJvYmxlbQorICBUaW1lIGxvYWRpbmdfcHJvYmxlbV9lbmRfdGltZV87CisKKyAgLy8gVGhlIGVuZCB0aW1lIHdoZW4gbG9hZGluZyBmb3IgaXQgdG8gdGltZW91dC4KKyAgVGltZSBsb2FkX3RpbWVvdXRfOworCisgIC8vIHdhaXQgZm9yIGJyYWtlIHRvIHNldAorICBUaW1lIHNob290ZXJfYnJha2Vfc2V0X3RpbWVfOworCisgIC8vIFRoZSB0aW1lb3V0IGZvciB1bmxvYWRpbmcuCisgIFRpbWUgdW5sb2FkX3RpbWVvdXRfOworCisgIC8vIHRpbWUgdGhhdCBzaG90IG11c3QgaGF2ZSBjb21wbGV0ZWQKKyAgVGltZSBzaG90X2VuZF90aW1lXzsKKworICAvLyB0cmFjayBjeWNsZXMgdGhhdCB3ZSBhcmUgc3R1Y2sgdG8gZGV0ZWN0IGVycm9ycworICBpbnQgY3ljbGVzX25vdF9tb3ZlZF87CisKKyAgZG91YmxlIGZpcmluZ19zdGFydGluZ19wb3NpdGlvbl87CisKKyAgLy8gVHJ1ZSBpZiB0aGUgbGF0Y2ggc2hvdWxkIGJlIGVuZ2FnZWQgYW5kIHRoZSBicmFrZSBzaG91bGQgYmUgZW5nYWdlZC4KKyAgYm9vbCBsYXRjaF9waXN0b25fOworICBib29sIGJyYWtlX3Bpc3Rvbl87CisgIGludDMyX3QgbGFzdF9kaXN0YWxfcG9zZWRnZV9jb3VudF87CisgIGludDMyX3QgbGFzdF9wcm94aW1hbF9wb3NlZGdlX2NvdW50XzsKKyAgdWludDMyX3Qgc2hvdF9jb3VudF87CisgIGJvb2wgemVyb2VkXzsKKyAgaW50IGRpc3RhbF9wb3NlZGdlX3ZhbGlkYXRpb25fY3ljbGVzX2xlZnRfOworICBpbnQgcHJveGltYWxfcG9zZWRnZV92YWxpZGF0aW9uX2N5Y2xlc19sZWZ0XzsKKyAgYm9vbCBsYXN0X2Rpc3RhbF9jdXJyZW50XzsKKyAgYm9vbCBsYXN0X3Byb3hpbWFsX2N1cnJlbnRfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTaG9vdGVyTW90b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBZMjAxNF9DT05UUk9MX0xPT1BTX3Nob290ZXJfc2hvb3Rlcl9IXwpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIucSBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5ZTIwZQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLnEKQEAgLTAsMCArMSwxMDAgQEAKK3BhY2thZ2UgZnJjOTcxLmNvbnRyb2xfbG9vcHM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BzLnEiOworaW1wb3J0ICJmcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEiOworCitxdWV1ZV9ncm91cCBTaG9vdGVyUXVldWUgeworICBpbXBsZW1lbnRzIGFvcy5jb250cm9sX2xvb3BzLkNvbnRyb2xMb29wOworCisgIG1lc3NhZ2UgT3V0cHV0IHsKKyAgICBkb3VibGUgdm9sdGFnZTsKKyAgICAvLyB0cnVlOiBsYXRjaCBlbmdhZ2VkLCBmYWxzZTogbGF0Y2ggb3BlbgorICAgIGJvb2wgbGF0Y2hfcGlzdG9uOworICAgIC8vIHRydWU6IGJyYWtlIGVuZ2FnZWQgZmFsc2U6IGJyYWtlIHJlbGVhc2VkCisgICAgYm9vbCBicmFrZV9waXN0b247CisgIH07CisgIG1lc3NhZ2UgR29hbCB7CisgICAgLy8gU2hvdCBwb3dlciBpbiBqb3VsZXMuCisgICAgZG91YmxlIHNob3RfcG93ZXI7CisgICAgLy8gU2hvb3RzIGFzIHNvb24gYXMgdGhpcyBpcyB0cnVlLgorICAgIGJvb2wgc2hvdF9yZXF1ZXN0ZWQ7CisgICAgYm9vbCB1bmxvYWRfcmVxdWVzdGVkOworICAgIGJvb2wgbG9hZF9yZXF1ZXN0ZWQ7CisgIH07CisKKyAgLy8gQmFjayBpcyB3aGVuIHRoZSBzcHJpbmdzIGFyZSBhbGwgdGhlIHdheSBzdHJldGNoZWQuCisgIG1lc3NhZ2UgUG9zaXRpb24geworICAgIC8vIEluIG1ldGVycywgb3V0IGlzIHBvc2l0aXZlLgorICAgIGRvdWJsZSBwb3NpdGlvbjsKKworICAgIC8vIElmIHRoZSBsYXRjaCBwaXN0b24gaXMgZmlyZWQgYW5kIHRoaXMgaGFsbCBlZmZlY3QgaGFzIGJlZW4gdHJpZ2dlcmVkLCB0aGUKKyAgICAvLyBwbHVuZ2VyIGlzIGFsbCB0aGUgd2F5IGJhY2sgYW5kIGxhdGNoZWQuCisgICAgYm9vbCBwbHVuZ2VyOworICAgIC8vIEdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHB1c2hlciBpcyBhbGwgdGhlIHdheSBiYWNrLgorICAgIFBvc2VkZ2VPbmx5Q291bnRlZEhhbGxFZmZlY3RTdHJ1Y3QgcHVzaGVyX2Rpc3RhbDsKKyAgICAvLyBUcmlnZ2VycyBqdXN0IGJlZm9yZSBwdXNoZXJfZGlzdGFsLgorICAgIFBvc2VkZ2VPbmx5Q291bnRlZEhhbGxFZmZlY3RTdHJ1Y3QgcHVzaGVyX3Byb3hpbWFsOworICAgIC8vIFRyaWdnZXJzIHdoZW4gdGhlIGxhdGNoIGVuZ2FnZXMuCisgICAgYm9vbCBsYXRjaDsKKyAgfTsKKyAgbWVzc2FnZSBTdGF0dXMgeworICAgIC8vIFdoZXRoZXIgaXQncyByZWFkeSB0byBzaG9vdCByaWdodCBub3cuCisgICAgYm9vbCByZWFkeTsKKyAgICAvLyBXaGV0aGVyIHRoZSBwbHVuZ2VyIGlzIGluIGFuZCBvdXQgb2YgdGhlIHdheSBvZiBncmFiYmluZyBhIGJhbGwuCisgICAgLy8gVE9ETyhiZW4pOiBQb3B1bGF0ZSB0aGVzZSEKKyAgICBib29sIGNvY2tlZDsKKyAgICAvLyBIb3cgbWFueSB0aW1lcyB3ZSd2ZSBzaG90LgorICAgIGludDMyX3Qgc2hvdHM7CisgICAgYm9vbCBkb25lOworICAgIC8vIFdoYXQgd2UgdGhpbmsgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGhhcmQgc3RvcCBvbiB0aGUgc2hvb3RlciBpcywgaW4KKyAgICAvLyBzaG90IHBvd2VyIChKb3VsZXMpLgorICAgIGRvdWJsZSBoYXJkX3N0b3BfcG93ZXI7CisgIH07CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBQb3NpdGlvbiBwb3NpdGlvbjsKKyAgcXVldWUgT3V0cHV0IG91dHB1dDsKKyAgcXVldWUgU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIFNob290ZXJRdWV1ZSBzaG9vdGVyX3F1ZXVlOworCitzdHJ1Y3QgU2hvb3RlclN0YXRlVG9Mb2cgeworCWRvdWJsZSBhYnNvbHV0ZV9wb3NpdGlvbjsKKwlkb3VibGUgYWJzb2x1dGVfdmVsb2NpdHk7CisJdWludDMyX3Qgc3RhdGU7CisJYm9vbCBsYXRjaF9zZW5zb3I7CisJYm9vbCBwcm94aW1hbDsKKwlib29sIGRpc3RhbDsKKwlib29sIHBsdW5nZXI7CisJYm9vbCBicmFrZTsKKwlib29sIGxhdGNoX3Bpc3RvbjsKK307CisKK3N0cnVjdCBTaG9vdGVyVm9sdGFnZVRvTG9nIHsKKwlkb3VibGUgWF9oYXQ7CisJZG91YmxlIGFwcGxpZWQ7Cit9OworCitzdHJ1Y3QgU2hvb3Rlck1vdmluZ0dvYWwgeworCWRvdWJsZSBkeDsKK307CisKK3N0cnVjdCBTaG9vdGVyQ2hhbmdlQ2FsaWJyYXRpb24geworCWRvdWJsZSBlbmNvZGVyOworCWRvdWJsZSByZWFsX3Bvc2l0aW9uOworCWRvdWJsZSBvbGRfcG9zaXRpb247CisJZG91YmxlIG5ld19wb3NpdGlvbjsKKwlkb3VibGUgb2xkX29mZnNldDsKKwlkb3VibGUgbmV3X29mZnNldDsKK307CisKK3N0cnVjdCBTaG9vdGVyU3RhdHVzVG9Mb2cgeworCWRvdWJsZSBnb2FsOworCWRvdWJsZSBwb3NpdGlvbjsKK307CisKK3N0cnVjdCBQb3dlckFkanVzdG1lbnQgeworCWRvdWJsZSByZXF1ZXN0ZWRfcG93ZXI7CisJZG91YmxlIGFjdHVhbF9wb3dlcjsKK307CmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlcl9saWJfdGVzdC5jYyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyX2xpYl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWI3MDUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlcl9saWJfdGVzdC5jYwpAQCAtMCwwICsxLDcyMyBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL25ldHdvcmsvdGVhbV9udW1iZXIuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcF90ZXN0LmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIucS5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3VuYXVnbWVudGVkX3Nob290ZXJfbW90b3JfcGxhbnQuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb25zdGFudHMuaCIKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7CisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitzdGF0aWMgY29uc3QgaW50IGtUZXN0VGVhbSA9IDE7CisKK2NsYXNzIFRlYW1OdW1iZXJFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IGFvczo6bmV0d29yazo6T3ZlcnJpZGVUZWFtTnVtYmVyKGtUZXN0VGVhbSk7IH0KK307CisKKzo6dGVzdGluZzo6RW52aXJvbm1lbnQgKmNvbnN0IHRlYW1fbnVtYmVyX2VudiA9CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IFRlYW1OdW1iZXJFbnZpcm9ubWVudCk7CisKKworLy8gQ2xhc3Mgd2hpY2ggc2ltdWxhdGVzIHRoZSBzaG9vdGVyIGFuZCBzZW5kcyBvdXQgcXVldWUgbWVzc2FnZXMgY29udGFpbmluZyB0aGUKKy8vIHBvc2l0aW9uLgorY2xhc3MgU2hvb3RlclNpbXVsYXRpb24geworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIG1vdG9yIHNpbXVsYXRpb24uCisgIFNob290ZXJTaW11bGF0aW9uKGRvdWJsZSBpbml0aWFsX3Bvc2l0aW9uKQorICAgICAgOiBzaG9vdGVyX3BsYW50XyhuZXcgU3RhdGVGZWVkYmFja1BsYW50PDIsIDEsIDE+KE1ha2VSYXdTaG9vdGVyUGxhbnQoKSkpLAorICAgICAgICBsYXRjaF9waXN0b25fc3RhdGVfKGZhbHNlKSwKKyAgICAgICAgbGF0Y2hfZGVsYXlfY291bnRfKDApLAorICAgICAgICBwbHVuZ2VyX2xhdGNoZWRfKGZhbHNlKSwKKyAgICAgICAgYnJha2VfcGlzdG9uX3N0YXRlXyh0cnVlKSwKKyAgICAgICAgYnJha2VfZGVsYXlfY291bnRfKDApLAorICAgICAgICBzaG9vdGVyX3F1ZXVlXygKKyAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuc2hvb3Rlcl9xdWV1ZSIsIDB4Y2JmMjJiYTksCisgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLnNob290ZXJfcXVldWUuZ29hbCIsCisgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLnNob290ZXJfcXVldWUucG9zaXRpb24iLAorICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5zaG9vdGVyX3F1ZXVlLm91dHB1dCIsCisgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLnNob290ZXJfcXVldWUuc3RhdHVzIikgeworICAgIFJlaW5pdGlhbGl6ZShpbml0aWFsX3Bvc2l0aW9uKTsKKyAgfQorCisgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvc2l0aW9uIHdpdGggMCBhdCB0aGUgYmFjaywgYW5kIHRoZSBwb3NpdGlvbgorICAvLyB3aXRoIDAgbWVhc3VyZWQgd2hlcmUgdGhlIHNwcmluZyBoYXMgMCBmb3JjZS4KKyAgY29uc3RleHByIHN0YXRpYyBkb3VibGUga1Bvc2l0aW9uT2Zmc2V0ID0ga01heEV4dGVuc2lvbjsKKworICB2b2lkIFJlaW5pdGlhbGl6ZShkb3VibGUgaW5pdGlhbF9wb3NpdGlvbikgeworICAgIExPRyhJTkZPLCAiUmVpbml0aWFsaXppbmcgdG8ge3BvczogJWZ9XG4iLCBpbml0aWFsX3Bvc2l0aW9uKTsKKyAgICBTdGF0ZUZlZWRiYWNrUGxhbnQ8MiwgMSwgMT4gKnBsYW50ID0gc2hvb3Rlcl9wbGFudF8uZ2V0KCk7CisgICAgaW5pdGlhbF9wb3NpdGlvbl8gPSBpbml0aWFsX3Bvc2l0aW9uOworICAgIHBsYW50LT5tdXRhYmxlX1goMCwgMCkgPSBpbml0aWFsX3Bvc2l0aW9uXyAtIGtQb3NpdGlvbk9mZnNldDsKKyAgICBwbGFudC0+bXV0YWJsZV9YKDEsIDApID0gMC4wOworICAgIHBsYW50LT5tdXRhYmxlX1koKSA9IHBsYW50LT5DKCkgKiBwbGFudC0+WCgpOworICAgIGxhc3Rfdm9sdGFnZV8gPSAwLjA7CisgICAgbGFzdF9wbGFudF9wb3NpdGlvbl8gPSAwLjA7CisgICAgU2V0UGh5c2ljYWxTZW5zb3JzKCZsYXN0X3Bvc2l0aW9uX21lc3NhZ2VfKTsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGFic29sdXRlIGFuZ2xlIG9mIHRoZSBzaG9vdGVyLgorICBkb3VibGUgR2V0QWJzb2x1dGVQb3NpdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc2hvb3Rlcl9wbGFudF8tPlkoMCwgMCkgKyBrUG9zaXRpb25PZmZzZXQ7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBhZGp1c3RlZCBhbmdsZSBvZiB0aGUgc2hvb3Rlci4KKyAgZG91YmxlIEdldFBvc2l0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBHZXRBYnNvbHV0ZVBvc2l0aW9uKCkgLSBpbml0aWFsX3Bvc2l0aW9uXzsKKyAgfQorCisgIC8vIE1ha2VzIHN1cmUgcG9zIGlzIGluc2lkZSByYW5nZSAoaW5jbHVzaXZlKQorICBib29sIENoZWNrUmFuZ2UoZG91YmxlIHBvcywgc3RydWN0IGNvbnN0YW50czo6VmFsdWVzOjpBbmdsZVBhaXIgcGFpcikgeworICAgIHJldHVybiAocG9zID49IHBhaXIubG93ZXJfYW5nbGUgJiYgcG9zIDw9IHBhaXIudXBwZXJfYW5nbGUpOworICB9CisKKyAgLy8gU2V0cyB0aGUgdmFsdWVzIG9mIHRoZSBwaHlzaWNhbCBzZW5zb3JzIHRoYXQgY2FuIGJlIGRpcmVjdGx5IG9ic2VydmVkCisgIC8vIChlbmNvZGVyLCBoYWxsIGVmZmVjdCkuCisgIHZvaWQgU2V0UGh5c2ljYWxTZW5zb3JzKGNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgY29uc3QgZnJjOTcxOjpjb25zdGFudHM6OlZhbHVlcyAmdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKworICAgCXBvc2l0aW9uLT5wb3NpdGlvbiA9IEdldFBvc2l0aW9uKCk7CisKKyAgICBMT0coREVCVUcsICJQaHlzaWNhbCBzaG9vdGVyIGF0IHslZn1cbiIsIEdldEFic29sdXRlUG9zaXRpb24oKSk7CisKKyAgICAvLyBTaWduYWwgdGhhdCB0aGUgaGFsbCBlZmZlY3Qgc2Vuc29yIGhhcyBiZWVuIHRyaWdnZXJlZCBpZiBpdCBpcyB3aXRoaW4KKyAgICAvLyB0aGUgY29ycmVjdCByYW5nZS4KKyAgICBpZiAocGx1bmdlcl9sYXRjaGVkXykgeworICAgICAgcG9zaXRpb24tPnBsdW5nZXIgPSB0cnVlOworICAgICAgLy8gT25seSBkaXNlbmdhZ2UgdGhlIHNwcmluZyBpZiB3ZSBhcmUgZ3JlYXRlciB0aGFuIDAsIHdoaWNoIGlzIHdoZXJlIHRoZQorICAgICAgLy8gbGF0Y2ggd2lsbCB0YWtlIHRoZSBsb2FkIG9mZiB0aGUgcHVzaGVyLgorICAgICAgaWYgKEdldEFic29sdXRlUG9zaXRpb24oKSA+IDAuMCkgeworICAgICAgICBzaG9vdGVyX3BsYW50Xy0+c2V0X3BsYW50X2luZGV4KDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2hvb3Rlcl9wbGFudF8tPnNldF9wbGFudF9pbmRleCgwKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2hvb3Rlcl9wbGFudF8tPnNldF9wbGFudF9pbmRleCgwKTsKKyAgICAgIHBvc2l0aW9uLT5wbHVuZ2VyID0KKyAgICAgICAgICBDaGVja1JhbmdlKEdldEFic29sdXRlUG9zaXRpb24oKSwgdmFsdWVzLnNob290ZXIucGx1bmdlcl9iYWNrKTsKKyAgICB9CisgICAgcG9zaXRpb24tPnB1c2hlcl9kaXN0YWwuY3VycmVudCA9CisgICAgICAgIENoZWNrUmFuZ2UoR2V0QWJzb2x1dGVQb3NpdGlvbigpLCB2YWx1ZXMuc2hvb3Rlci5wdXNoZXJfZGlzdGFsKTsKKyAgICBwb3NpdGlvbi0+cHVzaGVyX3Byb3hpbWFsLmN1cnJlbnQgPQorICAgICAgICBDaGVja1JhbmdlKEdldEFic29sdXRlUG9zaXRpb24oKSwgdmFsdWVzLnNob290ZXIucHVzaGVyX3Byb3hpbWFsKTsKKyAgfQorCisgIHZvaWQgVXBkYXRlRWZmZWN0RWRnZSgKKyAgICAgIFBvc2VkZ2VPbmx5Q291bnRlZEhhbGxFZmZlY3RTdHJ1Y3QgKnNlbnNvciwKKyAgICAgIGNvbnN0IFBvc2VkZ2VPbmx5Q291bnRlZEhhbGxFZmZlY3RTdHJ1Y3QgJmxhc3Rfc2Vuc29yLAorICAgICAgY29uc3QgY29uc3RhbnRzOjpWYWx1ZXM6OkFuZ2xlUGFpciAmbGltaXRzLAorICAgICAgY29uc3QgY29udHJvbF9sb29wczo6U2hvb3RlclF1ZXVlOjpQb3NpdGlvbiAmbGFzdF9wb3NpdGlvbikgeworICAgIHNlbnNvci0+cG9zZWRnZV9jb3VudCA9IGxhc3Rfc2Vuc29yLnBvc2VkZ2VfY291bnQ7CisgICAgc2Vuc29yLT5uZWdlZGdlX2NvdW50ID0gbGFzdF9zZW5zb3IubmVnZWRnZV9jb3VudDsKKworICAgIHNlbnNvci0+cG9zZWRnZV92YWx1ZSA9IGxhc3Rfc2Vuc29yLnBvc2VkZ2VfdmFsdWU7CisKKyAgICBpZiAoc2Vuc29yLT5jdXJyZW50ICYmICFsYXN0X3NlbnNvci5jdXJyZW50KSB7CisgICAgICArK3NlbnNvci0+cG9zZWRnZV9jb3VudDsKKyAgICAgIGlmIChsYXN0X3Bvc2l0aW9uLnBvc2l0aW9uICsgaW5pdGlhbF9wb3NpdGlvbl8gPCBsaW1pdHMubG93ZXJfYW5nbGUpIHsKKyAgICAgICAgTE9HKERFQlVHLCAiUG9zZWRnZSB2YWx1ZSBvbiBsb3dlciBlZGdlIG9mIHNlbnNvciwgY291bnQgaXMgbm93ICVkXG4iLAorICAgICAgICAgICAgc2Vuc29yLT5wb3NlZGdlX2NvdW50KTsKKyAgICAgICAgc2Vuc29yLT5wb3NlZGdlX3ZhbHVlID0gbGltaXRzLmxvd2VyX2FuZ2xlIC0gaW5pdGlhbF9wb3NpdGlvbl87CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0coREVCVUcsICJQb3NlZGdlIHZhbHVlIG9uIHVwcGVyIGVkZ2Ugb2Ygc2Vuc29yLCBjb3VudCBpcyBub3cgJWRcbiIsCisgICAgICAgICAgICBzZW5zb3ItPnBvc2VkZ2VfY291bnQpOworICAgICAgICBzZW5zb3ItPnBvc2VkZ2VfdmFsdWUgPSBsaW1pdHMudXBwZXJfYW5nbGUgLSBpbml0aWFsX3Bvc2l0aW9uXzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzZW5zb3ItPmN1cnJlbnQgJiYgbGFzdF9zZW5zb3IuY3VycmVudCkgeworICAgICAgKytzZW5zb3ItPm5lZ2VkZ2VfY291bnQ7CisgICAgfQorICB9CisKKyAgdm9pZCBTZW5kUG9zaXRpb25NZXNzYWdlKCkgeworICAgIC8vIHRoZSBmaXJzdCBib29sIGlzIGZhbHNlCisgICAgU2VuZFBvc2l0aW9uTWVzc2FnZShmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgIH0KKworICAvLyBTZW5kcyBvdXQgdGhlIHBvc2l0aW9uIHF1ZXVlIG1lc3NhZ2VzLgorICAvLyBpZiB0aGUgZmlyc3QgYm9vbCBpcyBmYWxzZSB0aGVuIHRoaXMgaXMKKyAgLy8ganVzdCB0aGUgZGVmYXVsdCBzdGF0ZSwgb3RoZXJ3aXNlIHdpbGwgZm9yY2UKKyAgLy8gaXQgaW50byBhIHN0YXRlIHVzaW5nIHRoZSBwYXNzZWQgdmFsdWVzCisgIHZvaWQgU2VuZFBvc2l0aW9uTWVzc2FnZShib29sIHVzZV9wYXNzZWQsIGJvb2wgcGx1bmdlcl9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGF0Y2hfaW4sIGJvb2wgYnJha2VfaW4pIHsKKyAgICBjb25zdCBmcmM5NzE6OmNvbnN0YW50czo6VmFsdWVzICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworICAgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPGNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZTo6UG9zaXRpb24+IHBvc2l0aW9uID0KKyAgICAgICAgc2hvb3Rlcl9xdWV1ZV8ucG9zaXRpb24uTWFrZU1lc3NhZ2UoKTsKKworICAgIGlmICh1c2VfcGFzc2VkKSB7CisgICAgICBwbHVuZ2VyX2xhdGNoZWRfID0gbGF0Y2hfaW4gJiYgcGx1bmdlcl9pbjsKKyAgICAgIGxhdGNoX3Bpc3Rvbl9zdGF0ZV8gPSBwbHVuZ2VyX2xhdGNoZWRfOworICAgICAgYnJha2VfcGlzdG9uX3N0YXRlXyA9IGJyYWtlX2luOworICAgIH0KKworICAgIFNldFBoeXNpY2FsU2Vuc29ycyhwb3NpdGlvbi5nZXQoKSk7CisKKyAgICBwb3NpdGlvbi0+bGF0Y2ggPSBsYXRjaF9waXN0b25fc3RhdGVfOworCisgICAgLy8gSGFuZGxlIHB1c2hlciBkaXN0YWwgaGFsbCBlZmZlY3QKKyAgICBVcGRhdGVFZmZlY3RFZGdlKCZwb3NpdGlvbi0+cHVzaGVyX2Rpc3RhbCwKKyAgICAgICAgICAgICAgICAgICAgIGxhc3RfcG9zaXRpb25fbWVzc2FnZV8ucHVzaGVyX2Rpc3RhbCwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zaG9vdGVyLnB1c2hlcl9kaXN0YWwsIGxhc3RfcG9zaXRpb25fbWVzc2FnZV8pOworCisgICAgLy8gSGFuZGxlIHB1c2hlciBwcm94aW1hbCBoYWxsIGVmZmVjdAorICAgIFVwZGF0ZUVmZmVjdEVkZ2UoJnBvc2l0aW9uLT5wdXNoZXJfcHJveGltYWwsCisgICAgICAgICAgICAgICAgICAgICBsYXN0X3Bvc2l0aW9uX21lc3NhZ2VfLnB1c2hlcl9wcm94aW1hbCwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zaG9vdGVyLnB1c2hlcl9wcm94aW1hbCwgbGFzdF9wb3NpdGlvbl9tZXNzYWdlXyk7CisKKyAgICBsYXN0X3Bvc2l0aW9uX21lc3NhZ2VfID0gKnBvc2l0aW9uOworICAgIHBvc2l0aW9uLlNlbmQoKTsKKyAgfQorCisgIC8vIFNpbXVsYXRlcyB0aGUgY2xhdyBtb3ZpbmcgZm9yIG9uZSB0aW1lc3RlcC4KKyAgdm9pZCBTaW11bGF0ZSgpIHsKKyAgICBsYXN0X3BsYW50X3Bvc2l0aW9uXyA9IEdldEFic29sdXRlUG9zaXRpb24oKTsKKyAgICBFWFBFQ1RfVFJVRShzaG9vdGVyX3F1ZXVlXy5vdXRwdXQuRmV0Y2hMYXRlc3QoKSk7CisgICAgaWYgKHNob290ZXJfcXVldWVfLm91dHB1dC0+bGF0Y2hfcGlzdG9uICYmICFsYXRjaF9waXN0b25fc3RhdGVfICYmCisgICAgICAgIGxhdGNoX2RlbGF5X2NvdW50XyA8PSAwKSB7CisgICAgICBBU1NFUlRfRVEoMCwgbGF0Y2hfZGVsYXlfY291bnRfKSA8PCAiVGhlIHRlc3QgZG9lc24ndCBzdXBwb3J0IHRoYXQuIjsKKyAgICAgIGxhdGNoX2RlbGF5X2NvdW50XyA9IDY7CisgICAgfSBlbHNlIGlmICghc2hvb3Rlcl9xdWV1ZV8ub3V0cHV0LT5sYXRjaF9waXN0b24gJiYKKyAgICAgICAgICAgICAgIGxhdGNoX3Bpc3Rvbl9zdGF0ZV8gJiYgbGF0Y2hfZGVsYXlfY291bnRfID49IDApIHsKKyAgICAgIEFTU0VSVF9FUSgwLCBsYXRjaF9kZWxheV9jb3VudF8pIDw8ICJUaGUgdGVzdCBkb2Vzbid0IHN1cHBvcnQgdGhhdC4iOworICAgICAgbGF0Y2hfZGVsYXlfY291bnRfID0gLTY7CisgICAgfQorCisgICAgaWYgKHNob290ZXJfcXVldWVfLm91dHB1dC0+YnJha2VfcGlzdG9uICYmICFicmFrZV9waXN0b25fc3RhdGVfICYmCisgICAgICAgIGJyYWtlX2RlbGF5X2NvdW50XyA8PSAwKSB7CisgICAgICBBU1NFUlRfRVEoMCwgYnJha2VfZGVsYXlfY291bnRfKSA8PCAiVGhlIHRlc3QgZG9lc24ndCBzdXBwb3J0IHRoYXQuIjsKKyAgICAgIGJyYWtlX2RlbGF5X2NvdW50XyA9IDU7CisgICAgfSBlbHNlIGlmICghc2hvb3Rlcl9xdWV1ZV8ub3V0cHV0LT5icmFrZV9waXN0b24gJiYKKyAgICAgICAgICAgICAgIGJyYWtlX3Bpc3Rvbl9zdGF0ZV8gJiYgYnJha2VfZGVsYXlfY291bnRfID49IDApIHsKKyAgICAgIEFTU0VSVF9FUSgwLCBicmFrZV9kZWxheV9jb3VudF8pIDw8ICJUaGUgdGVzdCBkb2Vzbid0IHN1cHBvcnQgdGhhdC4iOworICAgICAgYnJha2VfZGVsYXlfY291bnRfID0gLTU7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGJyYWtlIGludGVybmFsIHN0YXRlCisgICAgaWYgKCFicmFrZV9waXN0b25fc3RhdGVfICYmIGJyYWtlX2RlbGF5X2NvdW50XyA+IDApIHsKKyAgICAgIGlmIChicmFrZV9kZWxheV9jb3VudF8gPT0gMSkgeworICAgICAgICBicmFrZV9waXN0b25fc3RhdGVfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyYWtlX2RlbGF5X2NvdW50Xy0tOworICAgIH0gZWxzZSBpZiAoYnJha2VfcGlzdG9uX3N0YXRlXyAmJiBicmFrZV9kZWxheV9jb3VudF8gPCAwKSB7CisgICAgICBpZiAoYnJha2VfZGVsYXlfY291bnRfID09IC0xKSB7CisgICAgICAgIGJyYWtlX3Bpc3Rvbl9zdGF0ZV8gPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyYWtlX2RlbGF5X2NvdW50XysrOworICAgIH0KKworICAgIGlmIChicmFrZV9waXN0b25fc3RhdGVfKSB7CisgICAgICBzaG9vdGVyX3BsYW50Xy0+bXV0YWJsZV9VKCkgPDwgMC4wOworICAgICAgc2hvb3Rlcl9wbGFudF8tPm11dGFibGVfWCgxLCAwKSA9IDAuMDsKKyAgICAgIHNob290ZXJfcGxhbnRfLT5tdXRhYmxlX1koKSA9IHNob290ZXJfcGxhbnRfLT5DKCkgKiBzaG9vdGVyX3BsYW50Xy0+WCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvb3Rlcl9wbGFudF8tPkQoKSAqIHNob290ZXJfcGxhbnRfLT5VKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNob290ZXJfcGxhbnRfLT5tdXRhYmxlX1UoKSA8PCBsYXN0X3ZvbHRhZ2VfOworICAgICAgLy9zaG9vdGVyX3BsYW50Xy0+VSA8PCBzaG9vdGVyX3F1ZXVlXy5vdXRwdXQtPnZvbHRhZ2U7CisgICAgICBzaG9vdGVyX3BsYW50Xy0+VXBkYXRlKCk7CisgICAgfQorICAgIExPRyhERUJVRywgIlBsYW50IGluZGV4IGlzICVkXG4iLCBzaG9vdGVyX3BsYW50Xy0+cGxhbnRfaW5kZXgoKSk7CisKKyAgICAvLyBIYW5kbGUgbGF0Y2ggaGFsbCBlZmZlY3QKKyAgICBpZiAoIWxhdGNoX3Bpc3Rvbl9zdGF0ZV8gJiYgbGF0Y2hfZGVsYXlfY291bnRfID4gMCkgeworICAgICAgTE9HKERFQlVHLCAibGF0Y2hpbmcgc2ltdWxhdGlvbjogJWRwXG4iLCBsYXRjaF9kZWxheV9jb3VudF8pOworICAgICAgaWYgKGxhdGNoX2RlbGF5X2NvdW50XyA9PSAxKSB7CisgICAgICAgIGxhdGNoX3Bpc3Rvbl9zdGF0ZV8gPSB0cnVlOworICAgICAgICBFWFBFQ1RfR0UoY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5zaG9vdGVyLmxhdGNoX21heF9zYWZlX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgR2V0QWJzb2x1dGVQb3NpdGlvbigpKTsKKyAgICAgICAgcGx1bmdlcl9sYXRjaGVkXyA9IHRydWU7CisgICAgICB9CisgICAgICBsYXRjaF9kZWxheV9jb3VudF8tLTsKKyAgICB9IGVsc2UgaWYgKGxhdGNoX3Bpc3Rvbl9zdGF0ZV8gJiYgbGF0Y2hfZGVsYXlfY291bnRfIDwgMCkgeworICAgICAgTE9HKERFQlVHLCAibGF0Y2hpbmcgc2ltdWxhdGlvbjogJWRuXG4iLCBsYXRjaF9kZWxheV9jb3VudF8pOworICAgICAgaWYgKGxhdGNoX2RlbGF5X2NvdW50XyA9PSAtMSkgeworICAgICAgICBsYXRjaF9waXN0b25fc3RhdGVfID0gZmFsc2U7CisgICAgICAgIGlmIChHZXRBYnNvbHV0ZVBvc2l0aW9uKCkgPiAwLjAwMikgeworICAgICAgICAgIEVYUEVDVF9UUlVFKGJyYWtlX3Bpc3Rvbl9zdGF0ZV8pIDw8ICJNdXN0IGhhdmUgdGhlIGJyYWtlIHNldCB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzaW5nIHRoZSBsYXRjaCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3dlcmZ1bCBzaG90cy4iOworICAgICAgICB9CisgICAgICAgIHBsdW5nZXJfbGF0Y2hlZF8gPSBmYWxzZTsKKyAgICAgICAgLy8gVE9ETyhhdXN0aW4pOiBUaGUgYnJha2Ugc2hvdWxkIGJlIHNldCBmb3IgYSBudW1iZXIgb2YgY3ljbGVzIGFmdGVyCisgICAgICAgIC8vIHRoaXMgYXMgd2VsbC4KKyAgICAgICAgc2hvb3Rlcl9wbGFudF8tPm11dGFibGVfWCgwLCAwKSArPSAwLjAwNTsKKyAgICAgIH0KKyAgICAgIGxhdGNoX2RlbGF5X2NvdW50XysrOworICAgIH0KKworICAgIEVYUEVDVF9HRShjb25zdGFudHM6OkdldFZhbHVlcygpLnNob290ZXIudXBwZXJfaGFyZF9saW1pdCwKKyAgICAgICAgICAgICAgR2V0QWJzb2x1dGVQb3NpdGlvbigpKTsKKyAgICBFWFBFQ1RfTEUoY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5zaG9vdGVyLmxvd2VyX2hhcmRfbGltaXQsCisgICAgICAgICAgICAgIEdldEFic29sdXRlUG9zaXRpb24oKSk7CisKKyAgICBsYXN0X3ZvbHRhZ2VfID0gc2hvb3Rlcl9xdWV1ZV8ub3V0cHV0LT52b2x0YWdlOworICAgIDo6YW9zOjp0aW1lOjpUaW1lOjpJbmNyZW1lbnRNb2NrVGltZSg6OmFvczo6dGltZTo6VGltZTo6SW5NUygxMC4wKSk7CisgIH0KKworICAvLyBwb2ludGVyIHRvIHBsYW50CisgIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudDwyLCAxLCAxPj4gc2hvb3Rlcl9wbGFudF87CisKKyAgLy8gdHJ1ZSBsYXRjaCBjbG9zZWQKKyAgYm9vbCBsYXRjaF9waXN0b25fc3RhdGVfOworICAvLyBncmVhdGVyIHRoYW4gemVybywgZGVsYXlpbmcgY2xvc2UuIGxlc3MgdGhhbiB6ZXJvIGRlbGF5aW5nIG9wZW4KKyAgaW50IGxhdGNoX2RlbGF5X2NvdW50XzsKKworICAvLyBHb2VzIHRvIHRydWUgYWZ0ZXIgbGF0Y2hfZGVsYXlfY291bnRfIGhpdHMgMCB3aGlsZSB0aGUgcGx1bmdlciBpcyBiYWNrLgorICBib29sIHBsdW5nZXJfbGF0Y2hlZF87CisKKyAgLy8gdHJ1ZSBicmFrZSBsb2NrZWQKKyAgYm9vbCBicmFrZV9waXN0b25fc3RhdGVfOworICAvLyBncmVhdGVyIHRoYW4gemVybywgZGVsYXlpbmcgY2xvc2UuIGxlc3MgdGhhbiB6ZXJvIGRlbGF5aW5nIG9wZW4KKyAgaW50IGJyYWtlX2RlbGF5X2NvdW50XzsKKworIHByaXZhdGU6CisgIFNob290ZXJRdWV1ZSBzaG9vdGVyX3F1ZXVlXzsKKyAgZG91YmxlIGluaXRpYWxfcG9zaXRpb25fOworICBkb3VibGUgbGFzdF92b2x0YWdlXzsKKworICBjb250cm9sX2xvb3BzOjpTaG9vdGVyUXVldWU6OlBvc2l0aW9uIGxhc3RfcG9zaXRpb25fbWVzc2FnZV87CisgIGRvdWJsZSBsYXN0X3BsYW50X3Bvc2l0aW9uXzsKK307CisKK2NsYXNzIFNob290ZXJUZXN0IDogcHVibGljIDo6YW9zOjp0ZXN0aW5nOjpDb250cm9sTG9vcFRlc3QgeworCisgcHJvdGVjdGVkOgorICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QgcXVldWUgc28gdGhhdCBpdCBpbnZhbGlkYXRlcyB0aGUgcXVldWUKKyAgLy8gdGhhdCBpdCBwb2ludHMgdG8uICBPdGhlcndpc2UsIHdlIHdpbGwgaGF2ZSBhIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSB0aGF0CisgIC8vIGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgU2hvb3RlclF1ZXVlIHNob290ZXJfcXVldWVfOworCisgIC8vIENyZWF0ZSBhIGxvb3AgYW5kIHNpbXVsYXRpb24gcGxhbnQuCisgIFNob290ZXJNb3RvciBzaG9vdGVyX21vdG9yXzsKKyAgU2hvb3RlclNpbXVsYXRpb24gc2hvb3Rlcl9tb3Rvcl9wbGFudF87CisKKyAgdm9pZCBSZWluaXRpYWxpemUoZG91YmxlIHBvc2l0aW9uKSB7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uUmVpbml0aWFsaXplKHBvc2l0aW9uKTsKKyAgfQorCisgIFNob290ZXJUZXN0KCkKKyAgICAgIDogc2hvb3Rlcl9xdWV1ZV8oCisgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLnNob290ZXJfcXVldWUiLCAweGNiZjIyYmE5LAorICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5zaG9vdGVyX3F1ZXVlLmdvYWwiLAorICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5zaG9vdGVyX3F1ZXVlLnBvc2l0aW9uIiwKKyAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuc2hvb3Rlcl9xdWV1ZS5vdXRwdXQiLAorICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5zaG9vdGVyX3F1ZXVlLnN0YXR1cyIpLAorICAgICAgICBzaG9vdGVyX21vdG9yXygmc2hvb3Rlcl9xdWV1ZV8pLAorICAgICAgICBzaG9vdGVyX21vdG9yX3BsYW50XygwLjIpIHsKKyAgfQorCisgIHZvaWQgVmVyaWZ5TmVhckdvYWwoKSB7CisgICAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5GZXRjaExhdGVzdCgpOworICAgIHNob290ZXJfcXVldWVfLnBvc2l0aW9uLkZldGNoTGF0ZXN0KCk7CisgICAgZG91YmxlIHBvcyA9IHNob290ZXJfbW90b3JfcGxhbnRfLkdldEFic29sdXRlUG9zaXRpb24oKTsKKyAgICBFWFBFQ1RfTkVBUihzaG9vdGVyX3F1ZXVlXy5nb2FsLT5zaG90X3Bvd2VyLCBwb3MsIDFlLTQpOworICB9Cit9OworCitURVNUX0YoU2hvb3RlclRlc3QsIFBvd2VyQ29udmVyc2lvbikgeworICBjb25zdCBmcmM5NzE6OmNvbnN0YW50czo6VmFsdWVzICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworICAvLyB0ZXN0IGEgY291cGxlIG9mIHZhbHVlcyByZXR1cm4gdGhlIHJpZ2h0IHRoaW5nCisgIEVYUEVDVF9ORUFSKDAuMjU0MDAxLCBzaG9vdGVyX21vdG9yXy5Qb3dlclRvUG9zaXRpb24oMTQwLjApLCAwLjAwMDAxKTsKKyAgRVhQRUNUX05FQVIoMC4wMDA1OCwgc2hvb3Rlcl9tb3Rvcl8uUG93ZXJUb1Bvc2l0aW9uKDAuNTMpLCAwLjAwMDAxKTsKKyAgRVhQRUNUX05FQVIoMC4wOTUyNTEyMzgxMjk4MzcxMDEsIHNob290ZXJfbW90b3JfLlBvd2VyVG9Qb3NpdGlvbig3My42NyksCisgICAgICAgICAgICAgIDAuMDAwMDEpOworCisgIC8vIHZhbHVlIHRvbyBsYXJnZSBzaG91bGQgZ2V0IG1heAorICBFWFBFQ1RfTkVBUih2YWx1ZXMuc2hvb3Rlci51cHBlcl9saW1pdCwKKyAgICAgICAgICAgICAgc2hvb3Rlcl9tb3Rvcl8uUG93ZXJUb1Bvc2l0aW9uKDUwNTA1MC45OSksIDAuMDAwMDEpOworICAvLyBuZWdhdGl2ZSB2YWx1ZXMgc2hvdWxkIHplcm8KKyAgRVhQRUNUX05FQVIoMCwgc2hvb3Rlcl9tb3Rvcl8uUG93ZXJUb1Bvc2l0aW9uKC0xMjMuNCksIDAuMDAwMDEpOworfQorCisvLyBUZXN0IHRoYXQgUG93ZXJUb1Bvc2l0aW9uIGFuZCBQb3NpdGlvblRvUG93ZXIgYXJlIGludmVyc2VzIG9mIGVhY2ggb3RoZXIuCisvLyBOb3RlIHRoYXQgUG93ZXJUb1Bvc2l0aW9uIHdpbGwgY2FwIHBvc2l0aW9uIHdoZXJlYXMgUG9zaXRpb25Ub1Bvd2VyIHdpbGwgbm90CisvLyBjYXAgcG93ZXIuCitURVNUX0YoU2hvb3RlclRlc3QsIEludmVyc2VQb3dlckNvbnZlcnNpb24pIHsKKyAgLy8gVGVzdCBhIGZldyB2YWx1ZXMuCisgIGRvdWJsZSBwb3dlciA9IDE0MC4wOworICBkb3VibGUgcG9zaXRpb24gPSBzaG9vdGVyX21vdG9yXy5Qb3dlclRvUG9zaXRpb24ocG93ZXIpOworICBFWFBFQ1RfTkVBUihwb3dlciwgc2hvb3Rlcl9tb3Rvcl8uUG9zaXRpb25Ub1Bvd2VyKHBvc2l0aW9uKSwgMWUtNSk7CisgIHBvd2VyID0gLjUzOworICBwb3NpdGlvbiA9IHNob290ZXJfbW90b3JfLlBvd2VyVG9Qb3NpdGlvbihwb3dlcik7CisgIEVYUEVDVF9ORUFSKHBvd2VyLCBzaG9vdGVyX21vdG9yXy5Qb3NpdGlvblRvUG93ZXIocG9zaXRpb24pLCAxZS01KTsKKyAgcG93ZXIgPSA3MS45NzE7CisgIHBvc2l0aW9uID0gc2hvb3Rlcl9tb3Rvcl8uUG93ZXJUb1Bvc2l0aW9uKHBvd2VyKTsKKyAgRVhQRUNUX05FQVIocG93ZXIsIHNob290ZXJfbW90b3JfLlBvc2l0aW9uVG9Qb3dlcihwb3NpdGlvbiksIDFlLTUpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBzaG9vdGVyIHplcm9zIGNvcnJlY3RseSBhbmQgZ29lcyB0byBhIHBvc2l0aW9uLgorVEVTVF9GKFNob290ZXJUZXN0LCBHb2VzVG9WYWx1ZSkgeworICBzaG9vdGVyX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnNob3RfcG93ZXIoNzAuMCkuU2VuZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDsgKytpKSB7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIHNob290ZXJfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKyAgLy8gRVhQRUNUX05FQVIoMC4wLCBzaG9vdGVyX21vdG9yXy5HZXRQb3NpdGlvbigpLCAwLjAxKTsKKyAgZG91YmxlIHBvcyA9IHNob290ZXJfbW90b3JfcGxhbnRfLkdldEFic29sdXRlUG9zaXRpb24oKTsKKyAgRVhQRUNUX05FQVIoCisgICAgICBzaG9vdGVyX21vdG9yXy5Qb3dlclRvUG9zaXRpb24oc2hvb3Rlcl9xdWV1ZV8uZ29hbC0+c2hvdF9wb3dlciksCisgICAgICBwb3MsIDAuMDUpOworICBFWFBFQ1RfRVEoU2hvb3Rlck1vdG9yOjpTVEFURV9SRUFEWSwgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIHNob290ZXIgemVyb3MgY29ycmVjdGx5IGFuZCBnb2VzIHRvIGEgcG9zaXRpb24uCitURVNUX0YoU2hvb3RlclRlc3QsIEZpcmUpIHsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5zaG90X3Bvd2VyKDcwLjApLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjA7ICsraSkgeworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBzaG9vdGVyX21vdG9yXy5JdGVyYXRlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZLCBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpKTsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLnNob3RfcG93ZXIoMzUuMCkKKyAgICAgIC5zaG90X3JlcXVlc3RlZCh0cnVlKQorICAgICAgLlNlbmQoKTsKKworICBib29sIGhpdF9maXJlID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDAwOyArK2kpIHsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgICBpZiAoc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSA9PSBTaG9vdGVyTW90b3I6OlNUQVRFX0ZJUkUpIHsKKyAgICAgIGlmICghaGl0X2ZpcmUpIHsKKyAgICAgICAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAgICAgLnNob3RfcG93ZXIoMTcuMCkKKyAgICAgICAgICAgIC5zaG90X3JlcXVlc3RlZChmYWxzZSkKKyAgICAgICAgICAgIC5TZW5kKCk7CisgICAgICB9CisgICAgICBoaXRfZmlyZSA9IHRydWU7CisgICAgfQorICB9CisKKyAgZG91YmxlIHBvcyA9IHNob290ZXJfbW90b3JfcGxhbnRfLkdldEFic29sdXRlUG9zaXRpb24oKTsKKyAgRVhQRUNUX05FQVIoCisgICAgICBzaG9vdGVyX21vdG9yXy5Qb3dlclRvUG9zaXRpb24oc2hvb3Rlcl9xdWV1ZV8uZ29hbC0+c2hvdF9wb3dlciksCisgICAgICBwb3MsIDAuMDUpOworICBFWFBFQ1RfRVEoU2hvb3Rlck1vdG9yOjpTVEFURV9SRUFEWSwgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSk7CisgIEVYUEVDVF9UUlVFKGhpdF9maXJlKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgc2hvb3RlciB6ZXJvcyBjb3JyZWN0bHkgYW5kIGdvZXMgdG8gYSBwb3NpdGlvbi4KK1RFU1RfRihTaG9vdGVyVGVzdCwgRmlyZUxvbmcpIHsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5zaG90X3Bvd2VyKDcwLjApLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTA7ICsraSkgeworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBzaG9vdGVyX21vdG9yXy5JdGVyYXRlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZLCBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpKTsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5zaG90X3JlcXVlc3RlZCh0cnVlKS5TZW5kKCk7CisKKyAgYm9vbCBoaXRfZmlyZSA9IGZhbHNlOworICBmb3IgKGludCBpID0gMDsgaSA8IDQwMDsgKytpKSB7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIHNob290ZXJfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgICAgaWYgKHNob290ZXJfbW90b3JfLnN0YXRlKCkgPT0gU2hvb3Rlck1vdG9yOjpTVEFURV9GSVJFKSB7CisgICAgICBpZiAoIWhpdF9maXJlKSB7CisgICAgICAgIHNob290ZXJfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zaG90X3JlcXVlc3RlZChmYWxzZSkKKyAgICAgICAgICAgIC5TZW5kKCk7CisgICAgICB9CisgICAgICBoaXRfZmlyZSA9IHRydWU7CisgICAgfQorICB9CisKKyAgZG91YmxlIHBvcyA9IHNob290ZXJfbW90b3JfcGxhbnRfLkdldEFic29sdXRlUG9zaXRpb24oKTsKKyAgRVhQRUNUX05FQVIoc2hvb3Rlcl9tb3Rvcl8uUG93ZXJUb1Bvc2l0aW9uKHNob290ZXJfcXVldWVfLmdvYWwtPnNob3RfcG93ZXIpLCBwb3MsIDAuMDUpOworICBFWFBFQ1RfRVEoU2hvb3Rlck1vdG9yOjpTVEFURV9SRUFEWSwgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSk7CisgIEVYUEVDVF9UUlVFKGhpdF9maXJlKTsKK30KKworLy8gVmVyaWZpZXMgdGhhdCBpdCBkb2Vzbid0IHRyeSB0byBnbyBvdXQgdG9vIGZhciBpZiB5b3UgZ2l2ZSBpdCBhIHJpZGljaWxvdXMKKy8vIHBvd2VyLgorVEVTVF9GKFNob290ZXJUZXN0LCBMb2FkVG9vRmFyKSB7CisgIHNob290ZXJfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkuc2hvdF9wb3dlcig1MDAuMCkuU2VuZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2MDsgKytpKSB7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIHNob290ZXJfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgICAgRVhQRUNUX0xUKAorICAgICAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5HZXRBYnNvbHV0ZVBvc2l0aW9uKCksCisgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzRm9yVGVhbShrVGVzdFRlYW0pLnNob290ZXIudXBwZXJfbGltaXQpOworICB9CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZLCBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgc2hvb3RlciB6ZXJvcyBjb3JyZWN0bHkgYW5kIGdvZXMgdG8gYSBwb3NpdGlvbi4KK1RFU1RfRihTaG9vdGVyVGVzdCwgTW92ZUdvYWwpIHsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5zaG90X3Bvd2VyKDcwLjApLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTA7ICsraSkgeworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBzaG9vdGVyX21vdG9yXy5JdGVyYXRlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZLCBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpKTsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5zaG90X3Bvd2VyKDE0LjApLlNlbmQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIHNob290ZXJfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKworICBkb3VibGUgcG9zID0gc2hvb3Rlcl9tb3Rvcl9wbGFudF8uR2V0QWJzb2x1dGVQb3NpdGlvbigpOworICBFWFBFQ1RfTkVBUigKKyAgICAgIHNob290ZXJfbW90b3JfLlBvd2VyVG9Qb3NpdGlvbihzaG9vdGVyX3F1ZXVlXy5nb2FsLT5zaG90X3Bvd2VyKSwKKyAgICAgIHBvcywgMC4wNSk7CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZLCBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpKTsKK30KKworCitURVNUX0YoU2hvb3RlclRlc3QsIFVubG9hZCkgeworICBzaG9vdGVyX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnNob3RfcG93ZXIoNzAuMCkuU2VuZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE1MDsgKytpKSB7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIHNob290ZXJfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKyAgRVhQRUNUX0VRKFNob290ZXJNb3Rvcjo6U1RBVEVfUkVBRFksIHNob290ZXJfbW90b3JfLnN0YXRlKCkpOworICBzaG9vdGVyX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnVubG9hZF9yZXF1ZXN0ZWQodHJ1ZSkuU2VuZCgpOworCisgIGZvciAoaW50IGkgPSAwOworICAgICAgIGkgPCA4MDAgJiYgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSAhPSBTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZX1VOTE9BRDsKKyAgICAgICArK2kpIHsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgfQorCisgIEVYUEVDVF9ORUFSKGNvbnN0YW50czo6R2V0VmFsdWVzKCkuc2hvb3Rlci51cHBlcl9saW1pdCwKKyAgICAgICAgICAgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uR2V0QWJzb2x1dGVQb3NpdGlvbigpLCAwLjAxNSk7CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZX1VOTE9BRCwgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgaXQgcmV6ZXJvcyB3aGlsZSB1bmxvYWRpbmcuCitURVNUX0YoU2hvb3RlclRlc3QsIFJlemVyb1doaWxlVW5sb2FkaW5nKSB7CisgIHNob290ZXJfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkuc2hvdF9wb3dlcig3MC4wKS5TZW5kKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTUwOyArK2kpIHsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgfQorICBFWFBFQ1RfRVEoU2hvb3Rlck1vdG9yOjpTVEFURV9SRUFEWSwgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSk7CisKKyAgc2hvb3Rlcl9tb3Rvcl8uc2hvb3Rlcl8ub2Zmc2V0XyArPSAwLjAxOworICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgfQorCisgIHNob290ZXJfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkudW5sb2FkX3JlcXVlc3RlZCh0cnVlKS5TZW5kKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7CisgICAgICAgaSA8IDgwMCAmJiBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpICE9IFNob290ZXJNb3Rvcjo6U1RBVEVfUkVBRFlfVU5MT0FEOworICAgICAgICsraSkgeworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBzaG9vdGVyX21vdG9yXy5JdGVyYXRlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9CisKKyAgRVhQRUNUX05FQVIoY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5zaG9vdGVyLnVwcGVyX2xpbWl0LAorICAgICAgICAgICAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5HZXRBYnNvbHV0ZVBvc2l0aW9uKCksIDAuMDE1KTsKKyAgRVhQRUNUX0VRKFNob290ZXJNb3Rvcjo6U1RBVEVfUkVBRFlfVU5MT0FELCBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgc2hvb3RlciB6ZXJvcyBjb3JyZWN0bHkgYW5kIGdvZXMgdG8gYSBwb3NpdGlvbi4KK1RFU1RfRihTaG9vdGVyVGVzdCwgVW5sb2FkV2luZHVwTmVnYXRpdmUpIHsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5zaG90X3Bvd2VyKDcwLjApLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTA7ICsraSkgeworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBzaG9vdGVyX21vdG9yXy5JdGVyYXRlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZLCBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpKTsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS51bmxvYWRfcmVxdWVzdGVkKHRydWUpLlNlbmQoKTsKKworICBpbnQga2lja2VkX2RlbGF5ID0gMjA7CisgIGludCBjYXBwZWRfZ29hbF9jb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOworICAgICAgIGkgPCA4MDAgJiYgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSAhPSBTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZX1VOTE9BRDsKKyAgICAgICArK2kpIHsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIGlmIChzaG9vdGVyX21vdG9yXy5zdGF0ZSgpID09IFNob290ZXJNb3Rvcjo6U1RBVEVfVU5MT0FEX01PVkUpIHsKKyAgICAgIExPRyhERUJVRywgIlN0YXRlIGlzIFVubG9hZE1vdmVcbiIpOworICAgICAgLS1raWNrZWRfZGVsYXk7CisgICAgICBpZiAoa2lja2VkX2RlbGF5ID09IDApIHsKKyAgICAgICAgc2hvb3Rlcl9tb3Rvcl8uc2hvb3Rlcl8ubXV0YWJsZV9SKDAsIDApIC09IDEwMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNob290ZXJfbW90b3JfLmNhcHBlZF9nb2FsKCkgJiYga2lja2VkX2RlbGF5IDwgMCkgeworICAgICAgKytjYXBwZWRfZ29hbF9jb3VudDsKKyAgICB9CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9CisKKyAgRVhQRUNUX05FQVIoY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5zaG9vdGVyLnVwcGVyX2xpbWl0LAorICAgICAgICAgICAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5HZXRBYnNvbHV0ZVBvc2l0aW9uKCksIDAuMDUpOworICBFWFBFQ1RfRVEoU2hvb3Rlck1vdG9yOjpTVEFURV9SRUFEWV9VTkxPQUQsIHNob290ZXJfbW90b3JfLnN0YXRlKCkpOworICBFWFBFQ1RfTEUoMSwgY2FwcGVkX2dvYWxfY291bnQpOworICBFWFBFQ1RfR0UoMywgY2FwcGVkX2dvYWxfY291bnQpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBzaG9vdGVyIHplcm9zIGNvcnJlY3RseSBhbmQgZ29lcyB0byBhIHBvc2l0aW9uLgorVEVTVF9GKFNob290ZXJUZXN0LCBVbmxvYWRXaW5kdXBQb3NpdGl2ZSkgeworICBzaG9vdGVyX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnNob3RfcG93ZXIoNzAuMCkuU2VuZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE1MDsgKytpKSB7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIHNob290ZXJfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKyAgRVhQRUNUX0VRKFNob290ZXJNb3Rvcjo6U1RBVEVfUkVBRFksIHNob290ZXJfbW90b3JfLnN0YXRlKCkpOworICBzaG9vdGVyX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnVubG9hZF9yZXF1ZXN0ZWQodHJ1ZSkuU2VuZCgpOworCisgIGludCBraWNrZWRfZGVsYXkgPSAyMDsKKyAgaW50IGNhcHBlZF9nb2FsX2NvdW50ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7CisgICAgICAgaSA8IDgwMCAmJiBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpICE9IFNob290ZXJNb3Rvcjo6U1RBVEVfUkVBRFlfVU5MT0FEOworICAgICAgICsraSkgeworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBzaG9vdGVyX21vdG9yXy5JdGVyYXRlKCk7CisgICAgaWYgKHNob290ZXJfbW90b3JfLnN0YXRlKCkgPT0gU2hvb3Rlck1vdG9yOjpTVEFURV9VTkxPQURfTU9WRSkgeworICAgICAgTE9HKERFQlVHLCAiU3RhdGUgaXMgVW5sb2FkTW92ZVxuIik7CisgICAgICAtLWtpY2tlZF9kZWxheTsKKyAgICAgIGlmIChraWNrZWRfZGVsYXkgPT0gMCkgeworICAgICAgICBzaG9vdGVyX21vdG9yXy5zaG9vdGVyXy5tdXRhYmxlX1IoMCwgMCkgKz0gMC4xOworICAgICAgfQorICAgIH0KKyAgICBpZiAoc2hvb3Rlcl9tb3Rvcl8uY2FwcGVkX2dvYWwoKSAmJiBraWNrZWRfZGVsYXkgPCAwKSB7CisgICAgICArK2NhcHBlZF9nb2FsX2NvdW50OworICAgIH0KKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKworICBFWFBFQ1RfTkVBUihjb25zdGFudHM6OkdldFZhbHVlcygpLnNob290ZXIudXBwZXJfbGltaXQsCisgICAgICAgICAgICAgIHNob290ZXJfbW90b3JfcGxhbnRfLkdldEFic29sdXRlUG9zaXRpb24oKSwgMC4wNSk7CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZX1VOTE9BRCwgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSk7CisgIEVYUEVDVF9MRSgxLCBjYXBwZWRfZ29hbF9jb3VudCk7CisgIEVYUEVDVF9HRSgzLCBjYXBwZWRfZ29hbF9jb3VudCk7Cit9CisKK2RvdWJsZSBIYWxsRWZmZWN0TWlkZGxlKGNvbnN0YW50czo6VmFsdWVzOjpBbmdsZVBhaXIgcGFpcikgeworICByZXR1cm4gKHBhaXIubG93ZXJfYW5nbGUgKyBwYWlyLnVwcGVyX2FuZ2xlKSAvIDIuMDsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgc2hvb3RlciB6ZXJvcyBjb3JyZWN0bHkgYW5kIGdvZXMgdG8gYSBwb3NpdGlvbi4KK1RFU1RfRihTaG9vdGVyVGVzdCwgU3RhcnRzT25EaXN0YWwpIHsKKyAgUmVpbml0aWFsaXplKEhhbGxFZmZlY3RNaWRkbGUoY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5zaG9vdGVyLnB1c2hlcl9kaXN0YWwpKTsKKyAgc2hvb3Rlcl9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5zaG90X3Bvd2VyKDcwLjApLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7ICsraSkgeworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBzaG9vdGVyX21vdG9yXy5JdGVyYXRlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9CisgIC8vIEVYUEVDVF9ORUFSKDAuMCwgc2hvb3Rlcl9tb3Rvcl8uR2V0UG9zaXRpb24oKSwgMC4wMSk7CisgIGRvdWJsZSBwb3MgPSBzaG9vdGVyX21vdG9yX3BsYW50Xy5HZXRBYnNvbHV0ZVBvc2l0aW9uKCk7CisgIEVYUEVDVF9ORUFSKAorICAgICAgc2hvb3Rlcl9tb3Rvcl8uUG93ZXJUb1Bvc2l0aW9uKHNob290ZXJfcXVldWVfLmdvYWwtPnNob3RfcG93ZXIpLAorICAgICAgcG9zLCAwLjA1KTsKKyAgRVhQRUNUX0VRKFNob290ZXJNb3Rvcjo6U1RBVEVfUkVBRFksIHNob290ZXJfbW90b3JfLnN0YXRlKCkpOworfQorCisKKy8vIFRlc3RzIHRoYXQgdGhlIHNob290ZXIgemVyb3MgY29ycmVjdGx5IGFuZCBnb2VzIHRvIGEgcG9zaXRpb24uCitURVNUX0YoU2hvb3RlclRlc3QsIFN0YXJ0c09uUHJveGltYWwpIHsKKyAgUmVpbml0aWFsaXplKAorICAgICAgSGFsbEVmZmVjdE1pZGRsZShjb25zdGFudHM6OkdldFZhbHVlcygpLnNob290ZXIucHVzaGVyX3Byb3hpbWFsKSk7CisgIHNob290ZXJfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkuc2hvdF9wb3dlcig3MC4wKS5TZW5kKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAwOyArK2kpIHsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgc2hvb3Rlcl9tb3Rvcl8uSXRlcmF0ZSgpOworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlKTsKKyAgfQorICAvLyBFWFBFQ1RfTkVBUigwLjAsIHNob290ZXJfbW90b3JfLkdldFBvc2l0aW9uKCksIDAuMDEpOworICBkb3VibGUgcG9zID0gc2hvb3Rlcl9tb3Rvcl9wbGFudF8uR2V0QWJzb2x1dGVQb3NpdGlvbigpOworICBFWFBFQ1RfTkVBUigKKyAgICAgIHNob290ZXJfbW90b3JfLlBvd2VyVG9Qb3NpdGlvbihzaG9vdGVyX3F1ZXVlXy5nb2FsLT5zaG90X3Bvd2VyKSwKKyAgICAgIHBvcywgMC4wNSk7CisgIEVYUEVDVF9FUShTaG9vdGVyTW90b3I6OlNUQVRFX1JFQURZLCBzaG9vdGVyX21vdG9yXy5zdGF0ZSgpKTsKK30KKworY2xhc3MgU2hvb3Rlclplcm9pbmdUZXN0IDogcHVibGljIFNob290ZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8CisgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6dHIxOjp0dXBsZTxib29sLCBib29sLCBib29sLCBkb3VibGU+PiB7fTsKKworVEVTVF9QKFNob290ZXJaZXJvaW5nVGVzdCwgQWxsRGlzcGFyYXRlU3RhcnRpbmdaZXJvKSB7CisgIGJvb2wgbGF0Y2ggPSA6OnN0ZDo6dHIxOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgIGJvb2wgYnJha2UgPSA6OnN0ZDo6dHIxOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgIGJvb2wgcGx1bmdlcl9iYWNrID0gOjpzdGQ6OnRyMTo6Z2V0PDI+KEdldFBhcmFtKCkpOworICBkb3VibGUgc3RhcnRfcG9zID0gOjpzdGQ6OnRyMTo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAvLyBmbGFnIHRvIGluaXRpYWxpemUgdGVzdAorCS8vcHJpbnRmKCJAQEBAIGw9ICVkIGI9ICVkIHA9ICVkIHM9ICUuM2ZcbiIsCisJLy8JCWxhdGNoLCBicmFrZSwgcGx1bmdlcl9iYWNrLCBzdGFydF9wb3MpOworICBib29sIGluaXRpYWxpemVkID0gZmFsc2U7CisgIFJlaW5pdGlhbGl6ZShzdGFydF9wb3MpOworICBzaG9vdGVyX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnNob3RfcG93ZXIoMTIwLjApLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7ICsraSkgeworICAgIHNob290ZXJfbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoIWluaXRpYWxpemVkLCBwbHVuZ2VyX2JhY2ssIGxhdGNoLCBicmFrZSk7CisgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHNob290ZXJfbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBzaG9vdGVyX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KKyAgLy8gRVhQRUNUX05FQVIoMC4wLCBzaG9vdGVyX21vdG9yXy5HZXRQb3NpdGlvbigpLCAwLjAxKTsKKyAgZG91YmxlIHBvcyA9IHNob290ZXJfbW90b3JfcGxhbnRfLkdldEFic29sdXRlUG9zaXRpb24oKTsKKyAgRVhQRUNUX05FQVIoCisgICAgICBzaG9vdGVyX21vdG9yXy5Qb3dlclRvUG9zaXRpb24oc2hvb3Rlcl9xdWV1ZV8uZ29hbC0+c2hvdF9wb3dlciksCisgICAgICBwb3MsIDAuMDUpOworICBBU1NFUlRfRVEoU2hvb3Rlck1vdG9yOjpTVEFURV9SRUFEWSwgc2hvb3Rlcl9tb3Rvcl8uc3RhdGUoKSk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAorICAgIFNob290ZXJaZXJvaW5nVGVzdCwgU2hvb3Rlclplcm9pbmdUZXN0LAorICAgIDo6dGVzdGluZzo6Q29tYmluZSgKKyAgICAgICAgOjp0ZXN0aW5nOjpCb29sKCksIDo6dGVzdGluZzo6Qm9vbCgpLCA6OnRlc3Rpbmc6OkJvb2woKSwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAwLjA1LAorICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXNGb3JUZWFtKGtUZXN0VGVhbSkuc2hvb3Rlci51cHBlcl9saW1pdCAtIDAuMDUsCisgICAgICAgICAgICBIYWxsRWZmZWN0TWlkZGxlKGNvbnN0YW50czo6R2V0VmFsdWVzRm9yVGVhbShrVGVzdFRlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2hvb3Rlci5wdXNoZXJfcHJveGltYWwpLAorICAgICAgICAgICAgSGFsbEVmZmVjdE1pZGRsZShjb25zdGFudHM6OkdldFZhbHVlc0ZvclRlYW0oa1Rlc3RUZWFtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNob290ZXIucHVzaGVyX2Rpc3RhbCksCisgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlc0ZvclRlYW0oa1Rlc3RUZWFtKQorICAgICAgICAgICAgICAgICAgICAuc2hvb3Rlci5sYXRjaF9tYXhfc2FmZV9wb3NpdGlvbiAtCisgICAgICAgICAgICAgICAgMC4wMDEpKSk7CisKKy8vIFRPRE8oYXVzdGluKTogU2xpcCB0aGUgZW5jb2RlciBzb21ld2hlcmUuCisKKy8vIFRPRE8oYXVzdGluKTogVGVzdCBhbGwgdGhlIHRpbWVvdXRzLi4uCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXJfbWFpbi5jYyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiMjRiZgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyX21haW4uY2MKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLmgiCisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisKK2ludCBtYWluKCkgeworICA6OmFvczo6SW5pdCgpOworICBmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OlNob290ZXJNb3RvciBzaG9vdGVyOworICBzaG9vdGVyLlJ1bigpOworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyX21vdG9yX3BsYW50LmNjIGIveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXJfbW90b3JfcGxhbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhNjQwNwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyX21vdG9yX3BsYW50LmNjCkBAIC0wLDAgKzEsNzcgQEAKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlcl9tb3Rvcl9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDMsIDEsIDE+IE1ha2VTcHJ1bmdTaG9vdGVyUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAzLCAzPiBBOworICBBIDw8IDAuOTk5MzkxMTE0OTA5LCAwLjAwODExMzE2NzQwMzg3LCA3LjU5NzY2Njg2MTgzZS0wNSwgLTAuMTEzNTg0MzQzNjU0LCAwLjY0NzgwNDIxNDk4LCAwLjAxNDE3MzA1MTk3MDksIDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAzLCAxPiBCOworICBCIDw8IDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAzPiBDOworICBDIDw8IDEuMCwgMC4wLCAwLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBEOworICBEIDw8IDAuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDMsIDEsIDE+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwzLCAxLCAxPiBNYWtlU2hvb3RlclBsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMywgMz4gQTsKKyAgQSA8PCAxLjAsIDAuMDA4MTE1MDU0ODg0NTUsIDcuNTk4NTI2ODc1OThlLTA1LCAwLjAsIDAuNjQ4MzMxMzA1NDQ2LCAwLjAxNDE3NjM0OTI0ODEsIDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAzLCAxPiBCOworICBCIDw8IDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAzPiBDOworICBDIDw8IDEuMCwgMC4wLCAwLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBEOworICBEIDw8IDAuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDMsIDEsIDE+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDMsIDEsIDE+IE1ha2VTcHJ1bmdTaG9vdGVyQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDMsIDE+IEw7CisgIEwgPDwgMS42NDcxOTUzMjk4OSwgNTcuMDU3MjY4MDgzMiwgNjM2Ljc0MjkwMzY1OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMz4gSzsKKyAgSyA8PCA0NTAuNTcxODQ5MTg1LCAxMS44NDA0OTE4OTM4LCAwLjk5NzE5NTMyOTg4OTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDMsIDM+IEFfaW52OworICBBX2ludiA8PCAwLjk5OTE4NzAwNDQ1LCAtMC4wMTI1MTM5MjIwMjY4LCAwLjAwMDEwMTQ0NTU2NzMyLCAwLjE3NTE5NDkwODM3NSwgMS41NDE0ODIxMTk1OCwgLTAuMDIxODYwODE2OTE4NSwgMC4wLCAwLjAsIDEuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDMsIDEsIDE+KEwsIEssIEFfaW52LCBNYWtlU3BydW5nU2hvb3RlclBsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwzLCAxLCAxPiBNYWtlU2hvb3RlckNvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAzLCAxPiBMOworICBMIDw8IDEuNjQ4MzMxMzA1NDUsIDU3LjI0MTc2MDQ1NzIsIDYzNi42Njg4NTE5MDY7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAzPiBLOworICBLIDw8IDM0OS4xNzMxMTMxNDYsIDguNjUwNzc2MTgxNjksIDAuODQ4MzMxMzA1NDQ2OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMywgMz4gQV9pbnY7CisgIEFfaW52IDw8IDEuMCwgLTAuMDEyNTE2ODMzMzE3MSwgMC4wMDAxMDE0NTc3MzE4MjQsIDAuMCwgMS41NDI0MjEyNzY5LCAtMC4wMjE4NjU5MDI3MDksIDAuMCwgMC4wLCAxLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwzLCAxLCAxPihMLCBLLCBBX2ludiwgTWFrZVNob290ZXJQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50PDMsIDEsIDE+IE1ha2VTaG9vdGVyUGxhbnQoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwzLCAxLCAxPj4+IHBsYW50cygyKTsKKyAgcGxhbnRzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDMsIDEsIDE+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDMsIDEsIDE+KE1ha2VTcHJ1bmdTaG9vdGVyUGxhbnRDb2VmZmljaWVudHMoKSkpOworICBwbGFudHNbMV0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MywgMSwgMT4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MywgMSwgMT4oTWFrZVNob290ZXJQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnQ8MywgMSwgMT4oJnBsYW50cyk7Cit9CisKK1N0YXRlRmVlZGJhY2tMb29wPDMsIDEsIDE+IE1ha2VTaG9vdGVyTG9vcCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MywgMSwgMT4+PiBjb250cm9sbGVycygyKTsKKyAgY29udHJvbGxlcnNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwzLCAxLCAxPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDMsIDEsIDE+KE1ha2VTcHJ1bmdTaG9vdGVyQ29udHJvbGxlcigpKSk7CisgIGNvbnRyb2xsZXJzWzFdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MywgMSwgMT4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwzLCAxLCAxPihNYWtlU2hvb3RlckNvbnRyb2xsZXIoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja0xvb3A8MywgMSwgMT4oJmNvbnRyb2xsZXJzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyX21vdG9yX3BsYW50LmggYi95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlcl9tb3Rvcl9wbGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDZlZDEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlcl9tb3Rvcl9wbGFudC5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgWTIwMTRfQ09OVFJPTF9MT09QU19TSE9PVEVSX1NIT09URVJfTU9UT1JfUExBTlRfSF8KKyNkZWZpbmUgWTIwMTRfQ09OVFJPTF9MT09QU19TSE9PVEVSX1NIT09URVJfTU9UT1JfUExBTlRfSF8KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CitzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrTWF4RXh0ZW5zaW9uID0gMC4zMjM4NTA7CisKK3N0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtTcHJpbmdDb25zdGFudCA9IDI4MDAuMDAwMDAwOworCisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwzLCAxLCAxPiBNYWtlU3BydW5nU2hvb3RlclBsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDMsIDEsIDE+IE1ha2VTcHJ1bmdTaG9vdGVyQ29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MywgMSwgMT4gTWFrZVNob290ZXJQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwzLCAxLCAxPiBNYWtlU2hvb3RlckNvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDMsIDEsIDE+IE1ha2VTaG9vdGVyUGxhbnQoKTsKKworU3RhdGVGZWVkYmFja0xvb3A8MywgMSwgMT4gTWFrZVNob290ZXJMb29wKCk7CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTRfQ09OVFJPTF9MT09QU19TSE9PVEVSX1NIT09URVJfTU9UT1JfUExBTlRfSF8KZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci91bmF1Z21lbnRlZF9zaG9vdGVyX21vdG9yX3BsYW50LmNjIGIveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3VuYXVnbWVudGVkX3Nob290ZXJfbW90b3JfcGxhbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxMTk0OAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci91bmF1Z21lbnRlZF9zaG9vdGVyX21vdG9yX3BsYW50LmNjCkBAIC0wLDAgKzEsNzcgQEAKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvdW5hdWdtZW50ZWRfc2hvb3Rlcl9tb3Rvcl9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDEsIDE+IE1ha2VSYXdTcHJ1bmdTaG9vdGVyUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBOworICBBIDw8IDAuOTk5MzkxMTE0OTA5LCAwLjAwODExMzE2NzQwMzg3LCAtMC4xMTM1ODQzNDM2NTQsIDAuNjQ3ODA0MjE0OTg7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBCOworICBCIDw8IDcuNTk3NjY2ODYxODNlLTA1LCAwLjAxNDE3MzA1MTk3MDk7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBDOworICBDIDw8IDEsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBEOworICBEIDw8IDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAxLCAxPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMSwgMT4gTWFrZVJhd1Nob290ZXJQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEE7CisgIEEgPDwgMS4wLCAwLjAwODExNTA1NDg4NDU1LCAwLjAsIDAuNjQ4MzMxMzA1NDQ2OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gQjsKKyAgQiA8PCA3LjU5ODUyNjg3NTk4ZS0wNSwgMC4wMTQxNzYzNDkyNDgxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gQzsKKyAgQyA8PCAxLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gRDsKKyAgRCA8PCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMSwgMT4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMSwgMT4gTWFrZVJhd1NwcnVuZ1Nob290ZXJDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gTDsKKyAgTCA8PCAxLjU0NzE5NTMyOTg5LCA0My45MzQ1NDg5NzU4OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gSzsKKyAgSyA8PCAyMTI2LjA2OTc3NDMzLCA0MS4zMjIzMzcwOTM2OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQV9pbnY7CisgIEFfaW52IDw8IDAuOTk5MTg3MDA0NDUsIC0wLjAxMjUxMzkyMjAyNjgsIDAuMTc1MTk0OTA4Mzc1LCAxLjU0MTQ4MjExOTU4OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMSwgMT4oTCwgSywgQV9pbnYsIE1ha2VSYXdTcHJ1bmdTaG9vdGVyUGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDEsIDE+IE1ha2VSYXdTaG9vdGVyQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IEw7CisgIEwgPDwgMS41NDgzMzEzMDU0NSwgNDQuMTE1NTc5NzY3NTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEs7CisgIEsgPDwgMjEzMy44MzU2OTE0NSwgNDEuMzQ5OTQyNTQ3NjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEFfaW52OworICBBX2ludiA8PCAxLjAsIC0wLjAxMjUxNjgzMzMxNzEsIDAuMCwgMS41NDI0MjEyNzY5OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMSwgMT4oTCwgSywgQV9pbnYsIE1ha2VSYXdTaG9vdGVyUGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudDwyLCAxLCAxPiBNYWtlUmF3U2hvb3RlclBsYW50KCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMSwgMT4+PiBwbGFudHMoMik7CisgIHBsYW50c1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAxLCAxPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAxLCAxPihNYWtlUmF3U3BydW5nU2hvb3RlclBsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcGxhbnRzWzFdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDEsIDE+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDEsIDE+KE1ha2VSYXdTaG9vdGVyUGxhbnRDb2VmZmljaWVudHMoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50PDIsIDEsIDE+KCZwbGFudHMpOworfQorCitTdGF0ZUZlZWRiYWNrTG9vcDwyLCAxLCAxPiBNYWtlUmF3U2hvb3Rlckxvb3AoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDEsIDE+Pj4gY29udHJvbGxlcnMoMik7CisgIGNvbnRyb2xsZXJzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMSwgMT4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAxLCAxPihNYWtlUmF3U3BydW5nU2hvb3RlckNvbnRyb2xsZXIoKSkpOworICBjb250cm9sbGVyc1sxXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDEsIDE+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMSwgMT4oTWFrZVJhd1Nob290ZXJDb250cm9sbGVyKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tMb29wPDIsIDEsIDE+KCZjb250cm9sbGVycyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvdW5hdWdtZW50ZWRfc2hvb3Rlcl9tb3Rvcl9wbGFudC5oIGIveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3VuYXVnbWVudGVkX3Nob290ZXJfbW90b3JfcGxhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdkZTg1Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3VuYXVnbWVudGVkX3Nob290ZXJfbW90b3JfcGxhbnQuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIFkyMDE0X0NPTlRST0xfTE9PUFNfU0hPT1RFUl9VTkFVR01FTlRFRF9TSE9PVEVSX01PVE9SX1BMQU5UX0hfCisjZGVmaW5lIFkyMDE0X0NPTlRST0xfTE9PUFNfU0hPT1RFUl9VTkFVR01FTlRFRF9TSE9PVEVSX01PVE9SX1BMQU5UX0hfCisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMSwgMT4gTWFrZVJhd1NwcnVuZ1Nob290ZXJQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAxLCAxPiBNYWtlUmF3U3BydW5nU2hvb3RlckNvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDEsIDE+IE1ha2VSYXdTaG9vdGVyUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMSwgMT4gTWFrZVJhd1Nob290ZXJDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudDwyLCAxLCAxPiBNYWtlUmF3U2hvb3RlclBsYW50KCk7CisKK1N0YXRlRmVlZGJhY2tMb29wPDIsIDEsIDE+IE1ha2VSYXdTaG9vdGVyTG9vcCgpOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE0X0NPTlRST0xfTE9PUFNfU0hPT1RFUl9VTkFVR01FTlRFRF9TSE9PVEVSX01PVE9SX1BMQU5UX0hfCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL3VwZGF0ZV9hcm0uc2ggYi95MjAxNC9jb250cm9sX2xvb3BzL3VwZGF0ZV9hcm0uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzRjMWFiOQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvdXBkYXRlX2FybS5zaApAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vYmFzaAorIworIyBVcGRhdGVzIHRoZSBhcm0gY29udHJvbGxlcnMgKGZvciBib3RoIHJvYm90cykuCisKK2NkICQoZGlybmFtZSAkMCkKKworLi9weXRob24vYXJtLnB5IGZyaWRnZS9hcm1fbW90b3JfcGxhbnQuY2MgXAorICAgIGZyaWRnZS9hcm1fbW90b3JfcGxhbnQuaCBcCisgICAgZnJpZGdlL2ludGVncmFsX2FybV9wbGFudC5jYyBcCisgICAgZnJpZGdlL2ludGVncmFsX2FybV9wbGFudC5oCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL3VwZGF0ZV9jbGF3LnNoIGIveTIwMTQvY29udHJvbF9sb29wcy91cGRhdGVfY2xhdy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODAwZDJhCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy91cGRhdGVfY2xhdy5zaApAQCAtMCwwICsxLDggQEAKKyMhL2Jpbi9iYXNoCisjCisjIFVwZGF0ZXMgdGhlIGNsYXcgY29udHJvbGxlcnMuCisKK2NkICQoZGlybmFtZSAkMCkKKworLi9weXRob24vY2xhdy5weSBjbGF3L2NsYXdfbW90b3JfcGxhbnQuaCBcCisgICAgY2xhdy9jbGF3X21vdG9yX3BsYW50LmNjCmRpZmYgLS1naXQgYS95MjAxNC9jb250cm9sX2xvb3BzL3VwZGF0ZV9kcml2ZXRyYWluLnNoIGIveTIwMTQvY29udHJvbF9sb29wcy91cGRhdGVfZHJpdmV0cmFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYWQxMDc0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvY29udHJvbF9sb29wcy91cGRhdGVfZHJpdmV0cmFpbi5zaApAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vYmFzaAorIworIyBVcGRhdGVzIHRoZSBkcml2ZXRyYWluIGNvbnRyb2xsZXJzIChmb3IgYm90aCByb2JvdHMpLgorCitjZCAkKGRpcm5hbWUgJDApCisKKy4vcHl0aG9uL2RyaXZldHJhaW4ucHkgZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIFwKKyAgICBkcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjIFwKKyAgICBkcml2ZXRyYWluL2RyaXZldHJhaW5fY2x1dGNoX21vdG9yX3BsYW50LmggXAorICAgIGRyaXZldHJhaW4vZHJpdmV0cmFpbl9jbHV0Y2hfbW90b3JfcGxhbnQuY2MKZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvdXBkYXRlX3BvbHlkcml2ZXRyYWluLnNoIGIveTIwMTQvY29udHJvbF9sb29wcy91cGRhdGVfcG9seWRyaXZldHJhaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmUyNzQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L2NvbnRyb2xfbG9vcHMvdXBkYXRlX3BvbHlkcml2ZXRyYWluLnNoCkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFVwZGF0ZXMgdGhlIHBvbHlkcml2ZXRyYWluIGNvbnRyb2xsZXJzIChmb3IgYm90aCByb2JvdHMpIGFuZCBDSU0gbW9kZWxzLgorCitjZCAkKGRpcm5hbWUgJDApCisKKy4vcHl0aG9uL3BvbHlkcml2ZXRyYWluLnB5IGRyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmggXAorICAgIGRyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjIFwKKyAgICBkcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NsdXRjaF9tb3Rvcl9wbGFudC5oIFwKKyAgICBkcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NsdXRjaF9tb3Rvcl9wbGFudC5jYyBcCisgICAgZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jaW1fcGxhbnQuaCBcCisgICAgZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jaW1fcGxhbnQuY2MKZGlmZiAtLWdpdCBhL3kyMDE0L2NvbnRyb2xfbG9vcHMvdXBkYXRlX3Nob290ZXIuc2ggYi95MjAxNC9jb250cm9sX2xvb3BzL3VwZGF0ZV9zaG9vdGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5YzU4MDcKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9jb250cm9sX2xvb3BzL3VwZGF0ZV9zaG9vdGVyLnNoCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFVwZGF0ZXMgdGhlIHNob290ZXIgY29udHJvbGxlci4KKworY2QgJChkaXJuYW1lICQwKQorCisuL3B5dGhvbi9zaG9vdGVyLnB5IHNob290ZXIvc2hvb3Rlcl9tb3Rvcl9wbGFudC5oIFwKKyAgICBzaG9vdGVyL3Nob290ZXJfbW90b3JfcGxhbnQuY2MgXAorICAgIHNob290ZXIvdW5hdWdtZW50ZWRfc2hvb3Rlcl9tb3Rvcl9wbGFudC5oIFwKKyAgICBzaG9vdGVyL3VuYXVnbWVudGVkX3Nob290ZXJfbW90b3JfcGxhbnQuY2MKZGlmZiAtLWdpdCBhL3kyMDE0L2pveXN0aWNrX3JlYWRlci5jYyBiL3kyMDE0L2pveXN0aWNrX3JlYWRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJmNDUyCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvam95c3RpY2tfcmVhZGVyLmNjCkBAIC0wLDAgKzEsNTI5IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAiYW9zL3ByaW1lL2lucHV0L2pveXN0aWNrX2lucHV0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9pbnB1dC9kcml2ZXJfc3RhdGlvbl9kYXRhLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvbG9nX2ludGVydmFsLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuaCIKKworI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJmcmM5NzEvcXVldWVzL2d5cm8ucS5oIgorI2luY2x1ZGUgImZyYzk3MS9hdXRvbm9tb3VzL2F1dG8ucS5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LnEuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL3Nob290ZXIvc2hvb3Rlci5xLmgiCisjaW5jbHVkZSAieTIwMTQvYWN0b3JzL3Nob290X2FjdG9yLmgiCisKK3VzaW5nIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlOwordXNpbmcgOjpmcmM5NzE6OnNlbnNvcnM6Omd5cm9fcmVhZGluZzsKKwordXNpbmcgOjphb3M6OmlucHV0Ojpkcml2ZXJfc3RhdGlvbjo6QnV0dG9uTG9jYXRpb247Cit1c2luZyA6OmFvczo6aW5wdXQ6OmRyaXZlcl9zdGF0aW9uOjpKb3lzdGlja0F4aXM7Cit1c2luZyA6OmFvczo6aW5wdXQ6OmRyaXZlcl9zdGF0aW9uOjpDb250cm9sQml0OworCisjZGVmaW5lIE9MRF9EUyAwCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGlucHV0IHsKK25hbWVzcGFjZSBqb3lzdGlja3MgeworCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrRHJpdmVDb250cm9sTG9vcEVuYWJsZTEoMSwgNyksCisgICAgICAgICAgICAgICAgICAgICBrRHJpdmVDb250cm9sTG9vcEVuYWJsZTIoMSwgMTEpOworY29uc3QgSm95c3RpY2tBeGlzIGtTdGVlcmluZ1doZWVsKDEsIDEpLCBrRHJpdmVUaHJvdHRsZSgyLCAyKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtTaGlmdEhpZ2goMiwgMSksIGtTaGlmdExvdygyLCAzKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtRdWlja1R1cm4oMSwgNSk7CisKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtDYXRjaCgzLCAxMCk7CisKKyNpZiBPTERfRFMKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtGaXJlKDMsIDExKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtVbmxvYWQoMSwgNCk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrUmVsb2FkKDEsIDIpOworCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrUm9sbGVyc091dCgzLCAxMik7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrUm9sbGVyc0luKDMsIDcpOworCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrVHVjaygzLCA5KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtJbnRha2VQb3NpdGlvbigzLCA4KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtJbnRha2VPcGVuUG9zaXRpb24oMywgMTApOworY29uc3QgQnV0dG9uTG9jYXRpb24ga1ZlcnRpY2FsVHVjaygzLCAxKTsKK2NvbnN0IEpveXN0aWNrQXhpcyBrRmxpcFJvYm90KDMsIDMpOworCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrTG9uZ1Nob3QoMywgNSk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrQ2xvc2VTaG90KDMsIDIpOworY29uc3QgQnV0dG9uTG9jYXRpb24ga0ZlbmRlclNob3QoMywgMyk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrVHJ1c3NTaG90KDIsIDExKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtIdW1hblBsYXllclNob3QoMywgMik7CisjZWxzZQorY29uc3QgQnV0dG9uTG9jYXRpb24ga0ZpcmUoMywgOSk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrVW5sb2FkKDEsIDQpOworY29uc3QgQnV0dG9uTG9jYXRpb24ga1JlbG9hZCgxLCAyKTsKKworY29uc3QgQnV0dG9uTG9jYXRpb24ga1JvbGxlcnNPdXQoMywgOCk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrUm9sbGVyc0luKDMsIDMpOworCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrVHVjaygzLCA0KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtJbnRha2VQb3NpdGlvbigzLCA1KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtJbnRha2VPcGVuUG9zaXRpb24oMywgMTEpOworY29uc3QgQnV0dG9uTG9jYXRpb24ga1ZlcnRpY2FsVHVjaygyLCA2KTsKK2NvbnN0IEpveXN0aWNrQXhpcyBrRmxpcFJvYm90KDMsIDMpOworCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrTG9uZ1Nob3QoMywgNyk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrQ2xvc2VTaG90KDMsIDYpOworY29uc3QgQnV0dG9uTG9jYXRpb24ga0ZlbmRlclNob3QoMywgMik7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrVHJ1c3NTaG90KDIsIDExKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtIdW1hblBsYXllclNob3QoMywgMSk7CisjZW5kaWYKKworY29uc3QgQnV0dG9uTG9jYXRpb24ga1VzZXJMZWZ0KDIsIDcpOworY29uc3QgQnV0dG9uTG9jYXRpb24ga1VzZXJSaWdodCgyLCAxMCk7CisKK2NvbnN0IEpveXN0aWNrQXhpcyBrQWRqdXN0Q2xhd0dvYWwoMywgMik7Citjb25zdCBKb3lzdGlja0F4aXMga0FkanVzdENsYXdTZXBhcmF0aW9uKDMsIDEpOworCitzdHJ1Y3QgQ2xhd0dvYWwgeworICBkb3VibGUgYW5nbGU7CisgIGRvdWJsZSBzZXBhcmF0aW9uOworfTsKKworc3RydWN0IFNob3RHb2FsIHsKKyAgQ2xhd0dvYWwgY2xhdzsKKyAgZG91YmxlIHNob3RfcG93ZXI7CisgIGRvdWJsZSB2ZWxvY2l0eV9jb21wZW5zYXRpb247CisgIGRvdWJsZSBpbnRha2VfcG93ZXI7Cit9OworCitjb25zdCBkb3VibGUga0ludGFrZVBvd2VyID0gNC4wOworLy8gSW4gY2FzZSB3ZSBoYXZlIHRvIHF1aWNrbHkgYWRqdXN0IGl0LgorY29uc3QgZG91YmxlIGtHcmFiU2VwYXJhdGlvbiA9IDA7Citjb25zdCBkb3VibGUga1Nob290U2VwYXJhdGlvbiA9IDAuMTEgKyBrR3JhYlNlcGFyYXRpb247CisKK2NvbnN0IENsYXdHb2FsIGtUdWNrR29hbCA9IHstMi4yNzM0NzQsIC0wLjc0OTQ4NH07Citjb25zdCBDbGF3R29hbCBrVmVydGljYWxUdWNrR29hbCA9IHswLCBrR3JhYlNlcGFyYXRpb259OworY29uc3QgQ2xhd0dvYWwga0ludGFrZUdvYWwgPSB7LTIuMjQsIGtHcmFiU2VwYXJhdGlvbn07Citjb25zdCBDbGF3R29hbCBrSW50YWtlT3BlbkdvYWwgPSB7LTIuMCwgMS4xfTsKKworLy8gVE9ETyhhdXN0aW4pOiBUdW5lIHRoZXNlIGJ5IGhhbmQuLi4KK2NvbnN0IENsYXdHb2FsIGtGbGlwcGVkVHVja0dvYWwgPSB7Mi43MzM0NzQsIC0wLjc1fTsKK2NvbnN0IENsYXdHb2FsIGtGbGlwcGVkSW50YWtlR29hbCA9IHsyLjAsIGtHcmFiU2VwYXJhdGlvbn07Citjb25zdCBDbGF3R29hbCBrRmxpcHBlZEludGFrZU9wZW5Hb2FsID0gezAuOTUsIDEuMH07CisKKy8vIDM0IiBiZXR3ZWVuIG5lYXIgZWRnZSBvZiBjb2xvcmVkIGxpbmUgYW5kIHJlYXIgZWRnZSBvZiBidW1wZXIuCisvLyBPbmx5IHdvcmtzIHJ1bm5pbmc/Citjb25zdCBTaG90R29hbCBrTG9uZ1Nob3RHb2FsID0geworICAgIHstMS4wOCwga1Nob290U2VwYXJhdGlvbn0sIDE0NSwgMC4wNCwga0ludGFrZVBvd2VyfTsKKy8vIG9sZCAzNCIgey0xLjA2LCBrU2hvb3RTZXBhcmF0aW9ufSwgMTQwLCAwLjA0LCBrSW50YWtlUG93ZXJ9OworY29uc3QgU2hvdEdvYWwga0ZsaXBwZWRMb25nU2hvdEdvYWwgPSB7CisgICAgezAuOTYsIGtTaG9vdFNlcGFyYXRpb259LCAxNDUsIDAuMDksIGtJbnRha2VQb3dlcn07CisvLyBvbGQgMzQiIHswLjk2LCBrU2hvb3RTZXBhcmF0aW9ufSwgMTQwLCAwLjA5LCBrSW50YWtlUG93ZXJ9OworCisvLyA3OCIgYmV0d2VlbiBuZWFyIGVkZ2Ugb2YgY29sb3JlZCBsaW5lIGFuZCByZWFyIGVkZ2Ugb2YgYnVtcGVyLgorY29uc3QgU2hvdEdvYWwga0Nsb3NlU2hvdEdvYWwgPSB7CisgICAgey0wLjk1LCBrU2hvb3RTZXBhcmF0aW9ufSwgMTA1LCAwLjIsIGtJbnRha2VQb3dlcn07CisvLyAzLzQiIHBsdW5nZXIgey0wLjkwLCBrU2hvb3RTZXBhcmF0aW9ufSwgMTA1LCAwLjIsIGtJbnRha2VQb3dlcn07Citjb25zdCBTaG90R29hbCBrRmxpcHBlZE1lZGl1bVNob3RHb2FsID0geworICAgIHswLjg2NSwga1Nob290U2VwYXJhdGlvbn0sIDEyMCwgMC4yLCBrSW50YWtlUG93ZXJ9OworLy8gMy80IiBwbHVuZ2VyIHswLjgwLCBrU2hvb3RTZXBhcmF0aW9ufSwgMTA1LCAwLjIsIGtJbnRha2VQb3dlcn07CisKKy8vIFNob3QgZnJvbSB0aGUgZmVuZGVyLgorY29uc3QgU2hvdEdvYWwga0ZlbmRlclNob3RHb2FsID0geworICAgIHstMC42OCwga1Nob290U2VwYXJhdGlvbn0sIDExNS4wLCAwLjAsIGtJbnRha2VQb3dlcn07Citjb25zdCBTaG90R29hbCBrRmxpcHBlZFNob3J0U2hvdEdvYWwgPSB7CisgICAgezAuNjMsIGtTaG9vdFNlcGFyYXRpb259LCAxMTUuMCwgMC4wLCBrSW50YWtlUG93ZXJ9OworCitjb25zdCBTaG90R29hbCBrSHVtYW5TaG90R29hbCA9IHsKKyAgICB7LTAuOTAsIGtTaG9vdFNlcGFyYXRpb259LCAxNDAsIDAuMDQsIGtJbnRha2VQb3dlcn07Citjb25zdCBTaG90R29hbCBrRmxpcHBlZEh1bWFuU2hvdEdvYWwgPSB7CisgICAgezAuOTAsIGtTaG9vdFNlcGFyYXRpb259LCAxNDAsIDAsIGtJbnRha2VQb3dlcn07Citjb25zdCBTaG90R29hbCBrVHJ1c3NTaG90R29hbCA9IHsKKyAgICB7LTAuNjgsIGtTaG9vdFNlcGFyYXRpb259LCA4OC4wLCAwLjQsIGtJbnRha2VQb3dlcn07Citjb25zdCBTaG90R29hbCBrRmxpcHBlZFRydXNzU2hvdEdvYWwgPSB7CisgICAgezAuNjgsIGtTaG9vdFNlcGFyYXRpb259LCA5Mi4wLCAwLjQsIGtJbnRha2VQb3dlcn07CisKK2NvbnN0IFNob3RHb2FsIGtGbGlwcGVkRGVtb1Nob3RHb2FsID0geworICAgIHsxLjAsIGtTaG9vdFNlcGFyYXRpb259LCA2NS4wLCAwLjAsIGtJbnRha2VQb3dlcn07Citjb25zdCBTaG90R29hbCBrRGVtb1Nob3RHb2FsID0geworICAgIHstMS4wLCBrU2hvb3RTZXBhcmF0aW9ufSwgNTAuMCwgMC4wLCBrSW50YWtlUG93ZXJ9OworCitjb25zdCBDbGF3R29hbCBrMjU0UGFzc0dvYWwgPSB7LTEuOTUsIGtHcmFiU2VwYXJhdGlvbn07Citjb25zdCBDbGF3R29hbCBrRmxpcHBlZDI1NFBhc3NHb2FsID0gezEuOTYsIGtHcmFiU2VwYXJhdGlvbn07CisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyA6OmFvczo6aW5wdXQ6OkpveXN0aWNrSW5wdXQgeworIHB1YmxpYzoKKyAgUmVhZGVyKCkKKyAgICAgIDogaXNfaGlnaF9nZWFyXyhmYWxzZSksCisgICAgICAgIHNob3RfcG93ZXJfKDgwLjApLAorICAgICAgICBnb2FsX2FuZ2xlXygwLjApLAorICAgICAgICBzZXBhcmF0aW9uX2FuZ2xlXyhrR3JhYlNlcGFyYXRpb24pLAorICAgICAgICB2ZWxvY2l0eV9jb21wZW5zYXRpb25fKDAuMCksCisgICAgICAgIGludGFrZV9wb3dlcl8oMC4wKSwKKyAgICAgICAgd2FzX3J1bm5pbmdfKGZhbHNlKSB7fQorCisgIHZvaWQgUnVuSXRlcmF0aW9uKGNvbnN0IDo6YW9zOjppbnB1dDo6ZHJpdmVyX3N0YXRpb246OkRhdGEgJmRhdGEpIG92ZXJyaWRlIHsKKyAgICBib29sIGxhc3RfYXV0b19ydW5uaW5nID0gYXV0b19ydW5uaW5nXzsKKyAgICBhdXRvX3J1bm5pbmdfID0gZGF0YS5HZXRDb250cm9sQml0KENvbnRyb2xCaXQ6OmtBdXRvbm9tb3VzKSAmJgorICAgICAgICAgICAgICAgICAgICBkYXRhLkdldENvbnRyb2xCaXQoQ29udHJvbEJpdDo6a0VuYWJsZWQpOworICAgIGlmIChhdXRvX3J1bm5pbmdfICE9IGxhc3RfYXV0b19ydW5uaW5nKSB7CisgICAgICBpZiAoYXV0b19ydW5uaW5nXykgeworICAgICAgICBTdGFydEF1dG8oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0b3BBdXRvKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFkYXRhLkdldENvbnRyb2xCaXQoQ29udHJvbEJpdDo6a0F1dG9ub21vdXMpKSB7CisgICAgICBIYW5kbGVEcml2ZXRyYWluKGRhdGEpOworICAgICAgSGFuZGxlVGVsZW9wKGRhdGEpOworICAgIH0KKyAgfQorCisgIHZvaWQgSGFuZGxlRHJpdmV0cmFpbihjb25zdCA6OmFvczo6aW5wdXQ6OmRyaXZlcl9zdGF0aW9uOjpEYXRhICZkYXRhKSB7CisgICAgYm9vbCBpc19jb250cm9sX2xvb3BfZHJpdmluZyA9IGZhbHNlOworICAgIGRvdWJsZSBsZWZ0X2dvYWwgPSAwLjA7CisgICAgZG91YmxlIHJpZ2h0X2dvYWwgPSAwLjA7CisgICAgY29uc3QgZG91YmxlIHdoZWVsID0gLWRhdGEuR2V0QXhpcyhrU3RlZXJpbmdXaGVlbCk7CisgICAgY29uc3QgZG91YmxlIHRocm90dGxlID0gLWRhdGEuR2V0QXhpcyhrRHJpdmVUaHJvdHRsZSk7CisgICAgY29uc3QgZG91YmxlIGtUaHJvdHRsZUdhaW4gPSAxLjAgLyAyLjU7CisgICAgaWYgKGZhbHNlICYmIChkYXRhLklzUHJlc3NlZChrRHJpdmVDb250cm9sTG9vcEVuYWJsZTEpIHx8CisgICAgICAgICAgICAgICAgICBkYXRhLklzUHJlc3NlZChrRHJpdmVDb250cm9sTG9vcEVuYWJsZTIpKSkgeworICAgICAgLy8gVE9ETyhhdXN0aW4pOiBTdGF0aWMgc3Vja3MhCisgICAgICBzdGF0aWMgZG91YmxlIGRpc3RhbmNlID0gMC4wOworICAgICAgc3RhdGljIGRvdWJsZSBhbmdsZSA9IDAuMDsKKyAgICAgIHN0YXRpYyBkb3VibGUgZmlsdGVyZWRfZ29hbF9kaXN0YW5jZSA9IDAuMDsKKyAgICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0RyaXZlQ29udHJvbExvb3BFbmFibGUxKSB8fAorICAgICAgICAgIGRhdGEuUG9zRWRnZShrRHJpdmVDb250cm9sTG9vcEVuYWJsZTIpKSB7CisgICAgICAgIGlmIChkcml2ZXRyYWluX3F1ZXVlLnBvc2l0aW9uLkZldGNoTGF0ZXN0KCkgJiYKKyAgICAgICAgICAgIGd5cm9fcmVhZGluZy5GZXRjaExhdGVzdCgpKSB7CisgICAgICAgICAgZGlzdGFuY2UgPSAoZHJpdmV0cmFpbl9xdWV1ZS5wb3NpdGlvbi0+bGVmdF9lbmNvZGVyICsKKyAgICAgICAgICAgICAgICAgICAgICBkcml2ZXRyYWluX3F1ZXVlLnBvc2l0aW9uLT5yaWdodF9lbmNvZGVyKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgMi4wIC0KKyAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlICoga1Rocm90dGxlR2FpbiAvIDIuMDsKKyAgICAgICAgICBhbmdsZSA9IGd5cm9fcmVhZGluZy0+YW5nbGU7CisgICAgICAgICAgZmlsdGVyZWRfZ29hbF9kaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpc19jb250cm9sX2xvb3BfZHJpdmluZyA9IHRydWU7CisKKyAgICAgIC8vIGNvbnN0IGRvdWJsZSBneXJvX2FuZ2xlID0gR3lyby5WaWV3KCkuYW5nbGU7CisgICAgICBjb25zdCBkb3VibGUgZ29hbF90aGV0YSA9IGFuZ2xlIC0gd2hlZWwgKiAwLjI3OworICAgICAgY29uc3QgZG91YmxlIGdvYWxfZGlzdGFuY2UgPSBkaXN0YW5jZSArIHRocm90dGxlICoga1Rocm90dGxlR2FpbjsKKyAgICAgIGNvbnN0IGRvdWJsZSByb2JvdF93aWR0aCA9IDIyLjAgLyAxMDAuMCAqIDIuNTQ7CisgICAgICBjb25zdCBkb3VibGUga01heFZlbG9jaXR5ID0gMC42OworICAgICAgaWYgKGdvYWxfZGlzdGFuY2UgPiBrTWF4VmVsb2NpdHkgKiAwLjAyICsgZmlsdGVyZWRfZ29hbF9kaXN0YW5jZSkgeworICAgICAgICBmaWx0ZXJlZF9nb2FsX2Rpc3RhbmNlICs9IGtNYXhWZWxvY2l0eSAqIDAuMDI7CisgICAgICB9IGVsc2UgaWYgKGdvYWxfZGlzdGFuY2UgPAorICAgICAgICAgICAgICAgICAta01heFZlbG9jaXR5ICogMC4wMiArIGZpbHRlcmVkX2dvYWxfZGlzdGFuY2UpIHsKKyAgICAgICAgZmlsdGVyZWRfZ29hbF9kaXN0YW5jZSAtPSBrTWF4VmVsb2NpdHkgKiAwLjAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsdGVyZWRfZ29hbF9kaXN0YW5jZSA9IGdvYWxfZGlzdGFuY2U7CisgICAgICB9CisgICAgICBsZWZ0X2dvYWwgPSBmaWx0ZXJlZF9nb2FsX2Rpc3RhbmNlIC0gcm9ib3Rfd2lkdGggKiBnb2FsX3RoZXRhIC8gMi4wOworICAgICAgcmlnaHRfZ29hbCA9IGZpbHRlcmVkX2dvYWxfZGlzdGFuY2UgKyByb2JvdF93aWR0aCAqIGdvYWxfdGhldGEgLyAyLjA7CisgICAgICBpc19oaWdoX2dlYXJfID0gZmFsc2U7CisKKyAgICAgIExPRyhERUJVRywgIkxlZnQgZ29hbCAlZiBSaWdodCBnb2FsICVmXG4iLCBsZWZ0X2dvYWwsIHJpZ2h0X2dvYWwpOworICAgIH0KKyAgICBpZiAoIWRyaXZldHJhaW5fcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAgICAgIC5zdGVlcmluZyh3aGVlbCkKKyAgICAgICAgICAgICAudGhyb3R0bGUodGhyb3R0bGUpCisgICAgICAgICAgICAgLmhpZ2hnZWFyKGlzX2hpZ2hfZ2Vhcl8pCisgICAgICAgICAgICAgLnF1aWNrdHVybihkYXRhLklzUHJlc3NlZChrUXVpY2tUdXJuKSkKKyAgICAgICAgICAgICAuY29udHJvbF9sb29wX2RyaXZpbmcoaXNfY29udHJvbF9sb29wX2RyaXZpbmcpCisgICAgICAgICAgICAgLmxlZnRfZ29hbChsZWZ0X2dvYWwpCisgICAgICAgICAgICAgLnJpZ2h0X2dvYWwocmlnaHRfZ29hbCkKKyAgICAgICAgICAgICAubGVmdF92ZWxvY2l0eV9nb2FsKDApCisgICAgICAgICAgICAgLnJpZ2h0X3ZlbG9jaXR5X2dvYWwoMCkKKyAgICAgICAgICAgICAuU2VuZCgpKSB7CisgICAgICBMT0coV0FSTklORywgInNlbmRpbmcgc3RpY2sgdmFsdWVzIGZhaWxlZFxuIik7CisgICAgfQorICAgIGlmIChkYXRhLlBvc0VkZ2Uoa1NoaWZ0SGlnaCkpIHsKKyAgICAgIGlzX2hpZ2hfZ2Vhcl8gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGRhdGEuUG9zRWRnZShrU2hpZnRMb3cpKSB7CisgICAgICBpc19oaWdoX2dlYXJfID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB2b2lkIFNldEdvYWwoQ2xhd0dvYWwgZ29hbCkgeworICAgIGdvYWxfYW5nbGVfID0gZ29hbC5hbmdsZTsKKyAgICBzZXBhcmF0aW9uX2FuZ2xlXyA9IGdvYWwuc2VwYXJhdGlvbjsKKyAgICBtb3ZpbmdfZm9yX3Nob3RfID0gZmFsc2U7CisgICAgdmVsb2NpdHlfY29tcGVuc2F0aW9uXyA9IDAuMDsKKyAgICBpbnRha2VfcG93ZXJfID0gMC4wOworICB9CisKKyAgdm9pZCBTZXRHb2FsKFNob3RHb2FsIGdvYWwpIHsKKyAgICBnb2FsX2FuZ2xlXyA9IGdvYWwuY2xhdy5hbmdsZTsKKyAgICBzaG90X3NlcGFyYXRpb25fYW5nbGVfID0gZ29hbC5jbGF3LnNlcGFyYXRpb247CisgICAgc2VwYXJhdGlvbl9hbmdsZV8gPSBrR3JhYlNlcGFyYXRpb247CisgICAgbW92aW5nX2Zvcl9zaG90XyA9IHRydWU7CisgICAgc2hvdF9wb3dlcl8gPSBnb2FsLnNob3RfcG93ZXI7CisgICAgdmVsb2NpdHlfY29tcGVuc2F0aW9uXyA9IGdvYWwudmVsb2NpdHlfY29tcGVuc2F0aW9uOworICAgIGludGFrZV9wb3dlcl8gPSBnb2FsLmludGFrZV9wb3dlcjsKKyAgfQorCisgIHZvaWQgSGFuZGxlVGVsZW9wKGNvbnN0IDo6YW9zOjppbnB1dDo6ZHJpdmVyX3N0YXRpb246OkRhdGEgJmRhdGEpIHsKKyAgICBpZiAoIWRhdGEuR2V0Q29udHJvbEJpdChDb250cm9sQml0OjprRW5hYmxlZCkpIHsKKyAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgIH0KKyAgICBpZiAoZGF0YS5Jc1ByZXNzZWQoa1JvbGxlcnNJbikgfHwgZGF0YS5Jc1ByZXNzZWQoa1JvbGxlcnNPdXQpKSB7CisgICAgICBpbnRha2VfcG93ZXJfID0gMC4wOworICAgICAgc2VwYXJhdGlvbl9hbmdsZV8gPSBrR3JhYlNlcGFyYXRpb247CisgICAgICBtb3ZpbmdfZm9yX3Nob3RfID0gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrQWRqdXN0Q2xhd0dvYWxEZWFkYmFuZCA9IDAuMDg7CisgICAgZG91YmxlIGNsYXdfZ29hbF9hZGp1c3QgPSBkYXRhLkdldEF4aXMoa0FkanVzdENsYXdHb2FsKTsKKyAgICBpZiAoT0xEX0RTIHx8IDo6c3RkOjphYnMoY2xhd19nb2FsX2FkanVzdCkgPCBrQWRqdXN0Q2xhd0dvYWxEZWFkYmFuZCkgeworICAgICAgY2xhd19nb2FsX2FkanVzdCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsYXdfZ29hbF9hZGp1c3QgPSAoY2xhd19nb2FsX2FkanVzdCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2xhd19nb2FsX2FkanVzdCA8IDApID8gLWtBZGp1c3RDbGF3R29hbERlYWRiYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0FkanVzdENsYXdHb2FsRGVhZGJhbmQpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzU7CisgICAgfQorICAgIGRvdWJsZSBjbGF3X3NlcGFyYXRpb25fYWRqdXN0ID0gZGF0YS5HZXRBeGlzKGtBZGp1c3RDbGF3U2VwYXJhdGlvbik7CisgICAgaWYgKE9MRF9EUyB8fAorICAgICAgICA6OnN0ZDo6YWJzKGNsYXdfc2VwYXJhdGlvbl9hZGp1c3QpIDwga0FkanVzdENsYXdHb2FsRGVhZGJhbmQpIHsKKyAgICAgIGNsYXdfc2VwYXJhdGlvbl9hZGp1c3QgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBjbGF3X3NlcGFyYXRpb25fYWRqdXN0ID0KKyAgICAgICAgICAoY2xhd19zZXBhcmF0aW9uX2FkanVzdCAtCisgICAgICAgICAgICgoY2xhd19zZXBhcmF0aW9uX2FkanVzdCA8IDApID8gLWtBZGp1c3RDbGF3R29hbERlYWRiYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0FkanVzdENsYXdHb2FsRGVhZGJhbmQpKSAqCisgICAgICAgICAgLTAuMDM1OworICAgIH0KKworI2lmIE9MRF9EUworICAgIGlmIChkYXRhLklzUHJlc3NlZChrRmVuZGVyU2hvdCkpIHsKKyNlbHNlCisgICAgaWYgKGRhdGEuR2V0QXhpcyhrRmxpcFJvYm90KSA+IDAuOSkgeworI2VuZGlmCisgICAgICBjbGF3X2dvYWxfYWRqdXN0ICs9IGNsYXdfc2VwYXJhdGlvbl9hZGp1c3Q7CisgICAgICBjbGF3X2dvYWxfYWRqdXN0ICo9IC0xOworCisgICAgICBpZiAoZGF0YS5Jc1ByZXNzZWQoa0ludGFrZU9wZW5Qb3NpdGlvbikpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa0ZsaXBwZWRJbnRha2VPcGVuR29hbCk7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtJbnRha2VQb3NpdGlvbikpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa0ZsaXBwZWRJbnRha2VHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa1ZlcnRpY2FsVHVjaykpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa1ZlcnRpY2FsVHVja0dvYWwpOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrVHVjaykpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa0ZsaXBwZWRUdWNrR29hbCk7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuUG9zRWRnZShrTG9uZ1Nob3QpKSB7CisgICAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgICBTZXRHb2FsKGtGbGlwcGVkTG9uZ1Nob3RHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Qb3NFZGdlKGtDbG9zZVNob3QpKSB7CisgICAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgICBTZXRHb2FsKGtGbGlwcGVkTWVkaXVtU2hvdEdvYWwpOworICAgICAgfSBlbHNlIGlmIChkYXRhLlBvc0VkZ2Uoa0ZlbmRlclNob3QpKSB7CisgICAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgICBTZXRHb2FsKGtGbGlwcGVkU2hvcnRTaG90R29hbCk7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuUG9zRWRnZShrSHVtYW5QbGF5ZXJTaG90KSkgeworICAgICAgICBhY3Rpb25fcXVldWVfLkNhbmNlbEFsbEFjdGlvbnMoKTsKKyAgICAgICAgTE9HKERFQlVHLCAiQ2FuY2VsaW5nXG4iKTsKKyAgICAgICAgU2V0R29hbChrRmxpcHBlZEh1bWFuU2hvdEdvYWwpOworICAgICAgfSBlbHNlIGlmIChkYXRhLlBvc0VkZ2Uoa1VzZXJMZWZ0KSkgeworICAgICAgICBhY3Rpb25fcXVldWVfLkNhbmNlbEFsbEFjdGlvbnMoKTsKKyAgICAgICAgTE9HKERFQlVHLCAiQ2FuY2VsaW5nXG4iKTsKKyAgICAgICAgU2V0R29hbChrRmxpcHBlZDI1NFBhc3NHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Qb3NFZGdlKGtVc2VyUmlnaHQpKSB7CisgICAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgICBTZXRHb2FsKGtGbGlwcGVkRGVtb1Nob3RHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Qb3NFZGdlKGtUcnVzc1Nob3QpKSB7CisgICAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgICBTZXRHb2FsKGtGbGlwcGVkVHJ1c3NTaG90R29hbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChkYXRhLklzUHJlc3NlZChrSW50YWtlT3BlblBvc2l0aW9uKSkgeworICAgICAgICBhY3Rpb25fcXVldWVfLkNhbmNlbEFsbEFjdGlvbnMoKTsKKyAgICAgICAgTE9HKERFQlVHLCAiQ2FuY2VsaW5nXG4iKTsKKyAgICAgICAgU2V0R29hbChrSW50YWtlT3BlbkdvYWwpOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrSW50YWtlUG9zaXRpb24pKSB7CisgICAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgICBTZXRHb2FsKGtJbnRha2VHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa1ZlcnRpY2FsVHVjaykpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa1ZlcnRpY2FsVHVja0dvYWwpOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrVHVjaykpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa1R1Y2tHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Qb3NFZGdlKGtMb25nU2hvdCkpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa0xvbmdTaG90R29hbCk7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuUG9zRWRnZShrQ2xvc2VTaG90KSkgeworICAgICAgICBhY3Rpb25fcXVldWVfLkNhbmNlbEFsbEFjdGlvbnMoKTsKKyAgICAgICAgTE9HKERFQlVHLCAiQ2FuY2VsaW5nXG4iKTsKKyAgICAgICAgU2V0R29hbChrQ2xvc2VTaG90R29hbCk7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuUG9zRWRnZShrRmVuZGVyU2hvdCkpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa0ZlbmRlclNob3RHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Qb3NFZGdlKGtIdW1hblBsYXllclNob3QpKSB7CisgICAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgICBTZXRHb2FsKGtIdW1hblNob3RHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Qb3NFZGdlKGtVc2VyTGVmdCkpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoazI1NFBhc3NHb2FsKTsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Qb3NFZGdlKGtVc2VyUmlnaHQpKSB7CisgICAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgICBTZXRHb2FsKGtEZW1vU2hvdEdvYWwpOworICAgICAgfSBlbHNlIGlmIChkYXRhLlBvc0VkZ2Uoa1RydXNzU2hvdCkpIHsKKyAgICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICAgIExPRyhERUJVRywgIkNhbmNlbGluZ1xuIik7CisgICAgICAgIFNldEdvYWwoa1RydXNzU2hvdEdvYWwpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0ZpcmUpKSB7CisgICAgICBhY3Rpb25fcXVldWVfLkVucXVldWVBY3Rpb24oYWN0b3JzOjpNYWtlU2hvb3RBY3Rpb24oKSk7CisgICAgfSBlbHNlIGlmIChkYXRhLk5lZ0VkZ2Uoa0ZpcmUpKSB7CisgICAgICBhY3Rpb25fcXVldWVfLkNhbmNlbEN1cnJlbnRBY3Rpb24oKTsKKyAgICB9CisKKyAgICBhY3Rpb25fcXVldWVfLlRpY2soKTsKKyAgICBpZiAoZGF0YS5Jc1ByZXNzZWQoa1VubG9hZCkgfHwgZGF0YS5Jc1ByZXNzZWQoa1JlbG9hZCkpIHsKKyAgICAgIGFjdGlvbl9xdWV1ZV8uQ2FuY2VsQWxsQWN0aW9ucygpOworICAgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgICAgaW50YWtlX3Bvd2VyXyA9IDAuMDsKKyAgICAgIHZlbG9jaXR5X2NvbXBlbnNhdGlvbl8gPSAwLjA7CisgICAgfQorCisgICAgLy8gU2VuZCBvdXQgdGhlIGNsYXcgYW5kIHNob290ZXIgZ29hbHMgaWYgbm8gYWN0aW9ucyBhcmUgcnVubmluZy4KKyAgICBpZiAoIWFjdGlvbl9xdWV1ZV8uUnVubmluZygpKSB7CisgICAgICBnb2FsX2FuZ2xlXyArPSBjbGF3X2dvYWxfYWRqdXN0OworICAgICAgc2VwYXJhdGlvbl9hbmdsZV8gKz0gY2xhd19zZXBhcmF0aW9uX2FkanVzdDsKKworICAgICAgLy8gSWYgdGhlIGFjdGlvbiBqdXN0IGVuZGVkLCB0dXJuIHRoZSBpbnRha2Ugb2ZmIGFuZCBzdG9wIHZlbG9jaXR5CisgICAgICAvLyBjb21wZW5zYXRpbmcuCisgICAgICBpZiAod2FzX3J1bm5pbmdfKSB7CisgICAgICAgIGludGFrZV9wb3dlcl8gPSAwLjA7CisgICAgICAgIHZlbG9jaXR5X2NvbXBlbnNhdGlvbl8gPSAwLjA7CisgICAgICB9CisKKyAgICAgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgICAgICBkb3VibGUgZ29hbF9hbmdsZSA9IGdvYWxfYW5nbGVfOworICAgICAgaWYgKGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLmdldCgpKSB7CisgICAgICAgIGdvYWxfYW5nbGUgKz0gU3BlZWRUb0FuZ2xlT2Zmc2V0KAorICAgICAgICAgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMtPnJvYm90X3NwZWVkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPR19JTlRFUlZBTChub19kcml2ZXRyYWluX3N0YXR1c18pOworICAgICAgfQorCisgICAgICBpZiAobW92aW5nX2Zvcl9zaG90XykgeworICAgICAgICBhdXRvICZjbGF3X3N0YXR1cyA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzOworICAgICAgICBjbGF3X3N0YXR1cy5GZXRjaExhdGVzdCgpOworICAgICAgICBpZiAoY2xhd19zdGF0dXMuZ2V0KCkpIHsKKyAgICAgICAgICBpZiAoOjpzdGQ6OmFicyhjbGF3X3N0YXR1cy0+Ym90dG9tIC0gZ29hbF9hbmdsZSkgPCAwLjIpIHsKKyAgICAgICAgICAgIG1vdmluZ19mb3Jfc2hvdF8gPSBmYWxzZTsKKyAgICAgICAgICAgIHNlcGFyYXRpb25fYW5nbGVfID0gc2hvdF9zZXBhcmF0aW9uX2FuZ2xlXzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZG91YmxlIHNlcGFyYXRpb25fYW5nbGUgPSBzZXBhcmF0aW9uX2FuZ2xlXzsKKworICAgICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtDYXRjaCkpIHsKKyAgICAgICAgY29uc3QgZG91YmxlIGtDYXRjaFNlcGFyYXRpb24gPSAxLjA7CisgICAgICAgIGdvYWxfYW5nbGUgLT0ga0NhdGNoU2VwYXJhdGlvbiAvIDIuMDsKKyAgICAgICAgc2VwYXJhdGlvbl9hbmdsZSA9IGtDYXRjaFNlcGFyYXRpb247CisgICAgICB9CisKKyAgICAgIGJvb2wgaW50YWtpbmcgPQorICAgICAgICAgIGRhdGEuSXNQcmVzc2VkKGtSb2xsZXJzSW4pIHx8IGRhdGEuSXNQcmVzc2VkKGtJbnRha2VQb3NpdGlvbikgfHwKKyAgICAgICAgICBkYXRhLklzUHJlc3NlZChrSW50YWtlT3BlblBvc2l0aW9uKSB8fCBkYXRhLklzUHJlc3NlZChrQ2F0Y2gpOworICAgICAgaWYgKCFjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgICAgICAgIC5ib3R0b21fYW5nbGUoZ29hbF9hbmdsZSkKKyAgICAgICAgICAgICAgIC5zZXBhcmF0aW9uX2FuZ2xlKHNlcGFyYXRpb25fYW5nbGUpCisgICAgICAgICAgICAgICAuaW50YWtlKGludGFraW5nID8gMTIuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChkYXRhLklzUHJlc3NlZChrUm9sbGVyc091dCkgPyAtMTIuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnRha2VfcG93ZXJfKSkKKyAgICAgICAgICAgICAgIC5jZW50ZXJpbmcoaW50YWtpbmcgPyAxMi4wIDogMC4wKQorICAgICAgICAgICAgICAgLlNlbmQoKSkgeworICAgICAgICBMT0coV0FSTklORywgInNlbmRpbmcgY2xhdyBnb2FsIGZhaWxlZFxuIik7CisgICAgICB9CisKKyAgICAgIGlmICghY29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgICAuc2hvdF9wb3dlcihzaG90X3Bvd2VyXykKKyAgICAgICAgICAgICAgIC5zaG90X3JlcXVlc3RlZChkYXRhLklzUHJlc3NlZChrRmlyZSkpCisgICAgICAgICAgICAgICAudW5sb2FkX3JlcXVlc3RlZChkYXRhLklzUHJlc3NlZChrVW5sb2FkKSkKKyAgICAgICAgICAgICAgIC5sb2FkX3JlcXVlc3RlZChkYXRhLklzUHJlc3NlZChrUmVsb2FkKSkKKyAgICAgICAgICAgICAgIC5TZW5kKCkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcsICJzZW5kaW5nIHNob290ZXIgZ29hbCBmYWlsZWRcbiIpOworICAgICAgfQorICAgIH0KKyAgICB3YXNfcnVubmluZ18gPSBhY3Rpb25fcXVldWVfLlJ1bm5pbmcoKTsKKyAgfQorCisgIGRvdWJsZSBTcGVlZFRvQW5nbGVPZmZzZXQoZG91YmxlIHNwZWVkKSB7CisgICAgY29uc3QgZnJjOTcxOjpjb25zdGFudHM6OlZhbHVlcyAmdmFsdWVzID0gZnJjOTcxOjpjb25zdGFudHM6OkdldFZhbHVlcygpOworICAgIC8vIHNjYWxlIHNwZWVkIHRvIGEgWzAuMC0xLjBdIG9uIHNvbWV0aGluZyBjbG9zZSB0byB0aGUgbWF4CisgICAgLy8gVE9ETyhhdXN0aW4pOiBDaGFuZ2UgdGhlIHNjYWxlIGZhY3RvciBmb3IgZGlmZmVyZW50IHNob3RzLgorICAgIHJldHVybiAoc3BlZWQgLyB2YWx1ZXMuZHJpdmV0cmFpbl9tYXhfc3BlZWQpICogdmVsb2NpdHlfY29tcGVuc2F0aW9uXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBTdGFydEF1dG8oKSB7CisgICAgTE9HKElORk8sICJTdGFydGluZyBhdXRvIG1vZGVcbiIpOworICAgIDo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLk1ha2VXaXRoQnVpbGRlcigpLnJ1bl9hdXRvKHRydWUpLlNlbmQoKTsKKyAgfQorCisgIHZvaWQgU3RvcEF1dG8oKSB7CisgICAgTE9HKElORk8sICJTdG9wcGluZyBhdXRvIG1vZGVcbiIpOworICAgIDo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLk1ha2VXaXRoQnVpbGRlcigpLnJ1bl9hdXRvKGZhbHNlKS5TZW5kKCk7CisgIH0KKworICBib29sIGlzX2hpZ2hfZ2Vhcl87CisgIGRvdWJsZSBzaG90X3Bvd2VyXzsKKyAgZG91YmxlIGdvYWxfYW5nbGVfOworICBkb3VibGUgc2VwYXJhdGlvbl9hbmdsZV8sIHNob3Rfc2VwYXJhdGlvbl9hbmdsZV87CisgIGRvdWJsZSB2ZWxvY2l0eV9jb21wZW5zYXRpb25fOworICBkb3VibGUgaW50YWtlX3Bvd2VyXzsKKyAgYm9vbCB3YXNfcnVubmluZ187CisgIGJvb2wgbW92aW5nX2Zvcl9zaG90XyA9IGZhbHNlOworCisgIGJvb2wgYXV0b19ydW5uaW5nXyA9IGZhbHNlOworICAKKyAgOjphb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0aW9uUXVldWUgYWN0aW9uX3F1ZXVlXzsKKworICA6OmFvczo6dXRpbDo6U2ltcGxlTG9nSW50ZXJ2YWwgbm9fZHJpdmV0cmFpbl9zdGF0dXNfID0KKyAgICAgIDo6YW9zOjp1dGlsOjpTaW1wbGVMb2dJbnRlcnZhbCg6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMiksIFdBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGRyaXZldHJhaW4gc3RhdHVzIik7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugam95c3RpY2tzCit9ICAvLyBuYW1lc3BhY2UgaW5wdXQKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworaW50IG1haW4oKSB7CisgIDo6YW9zOjpJbml0KCk7CisgIDo6ZnJjOTcxOjppbnB1dDo6am95c3RpY2tzOjpSZWFkZXIgcmVhZGVyOworICByZWFkZXIuUnVuKCk7CisgIDo6YW9zOjpDbGVhbnVwKCk7Cit9CmRpZmYgLS1naXQgYS95MjAxNC9wcmltZS9idWlsZC5zaCBiL3kyMDE0L3ByaW1lL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4M2Q5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9wcmltZS9idWlsZC5zaApAQCAtMCwwICsxLDUgQEAKKyMhL2Jpbi9iYXNoCisKK2NkICQoZGlybmFtZSAkMCkKKworZXhlYyAuLi8uLi9hb3MvYnVpbGQvYnVpbGQucHkgJDAgcHJpbWUgeTIwMTQgcHJpbWUuZ3lwICIkQCIKZGlmZiAtLWdpdCBhL3kyMDE0L3ByaW1lL2NvbXBpbGVfbG9vcC5zaCBiL3kyMDE0L3ByaW1lL2NvbXBpbGVfbG9vcC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTZiMGQzCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvcHJpbWUvY29tcGlsZV9sb29wLnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9iYXNoCisKKyMgUnVucyBgYnVpbGQuc2ggYWxsYCBhbmQgdGhlbiB3YWl0cyBmb3IgYSBmaWxlIHRvIGJlIG1vZGlmaWVkIGluIGEgbG9vcC4KKyMgVXNlZnVsIGZvciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgY29kZSB3aGlsZSBjb250aW51b3VzbHkgbWFraW5nIHN1cmUgdGhleQorIyBjb21waWxlLgorIyBSZXF1aXJlcyB0aGUgdXRpbC1saW51eCBhbmQgaW5vdGlmeS10b29scyBwYWNrYWdlcy4KKworY2hydCAtaSAtcCAwICQkCitpb25pY2UgLWMgMyAtcCAkJAorCit3aGlsZSB0cnVlOyBkbworCSQoZGlybmFtZSAkMCkvYnVpbGQuc2ggYWxsCisJZWNobyAnY29tcGlsZV9sb29wLnNoOiBXYWl0aW5nIGZvciBhIGZpbGUgbW9kaWZpY2F0aW9uLi4uJyAxPiYyCisJaW5vdGlmeXdhaXQgLWUgY2xvc2Vfd3JpdGUgLXIgYW9zIGZyYzk3MSBiYmJfY2FwZQorCWVjaG8gJ2NvbXBpbGVfbG9vcC5zaDogRG9uZSB3YWl0aW5nIGZvciBhIGZpbGUgbW9kaWZpY2F0aW9uJyAxPiYyCitkb25lCmRpZmYgLS1naXQgYS95MjAxNC9wcmltZS9ob3RfZ29hbF9yZWFkZXIuY2MgYi95MjAxNC9wcmltZS9ob3RfZ29hbF9yZWFkZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkYjNhMwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L3ByaW1lL2hvdF9nb2FsX3JlYWRlci5jYwpAQCAtMCwwICsxLDEwOCBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9ieXRlb3JkZXIuaCIKKworI2luY2x1ZGUgInkyMDE0L3F1ZXVlcy9ob3RfZ29hbC5xLmgiCisKK2ludCBtYWluKCkgeworICA6OmFvczo6SW5pdE5SVCgpOworCisgIHVpbnQ2NF90IGxlZnRfY291bnQsIHJpZ2h0X2NvdW50OworICA6OmZyYzk3MTo6aG90X2dvYWwuRmV0Y2hMYXRlc3QoKTsKKyAgaWYgKDo6ZnJjOTcxOjpob3RfZ29hbC5nZXQoKSkgeworICAgIExPR19TVFJVQ1QoREVCVUcsICJzdGFydGluZyB3aXRoIiwgKjo6ZnJjOTcxOjpob3RfZ29hbCk7CisgICAgbGVmdF9jb3VudCA9IDo6ZnJjOTcxOjpob3RfZ29hbC0+bGVmdF9jb3VudDsKKyAgICByaWdodF9jb3VudCA9IDo6ZnJjOTcxOjpob3RfZ29hbC0+bGVmdF9jb3VudDsKKyAgfSBlbHNlIHsKKyAgICBMT0coREVCVUcsICJubyBzdGFydGluZyBtZXNzYWdlXG4iKTsKKyAgICBsZWZ0X2NvdW50ID0gcmlnaHRfY291bnQgPSAwOworICB9CisKKyAgaW50IG15X3NvY2tldCA9IC0xOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChteV9zb2NrZXQgPT0gLTEpIHsKKyAgICAgIG15X3NvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgICAgICBpZiAobXlfc29ja2V0ID09IC0xKSB7CisgICAgICAgIFBMT0coV0FSTklORywgInNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkgZmFpbGVkIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKElORk8sICJvcGVuZWQgc29ja2V0IChpcyAlZClcbiIsIG15X3NvY2tldCk7CisgICAgICAgIHNvY2thZGRyX2luIGFkZHJlc3MsICpzb2NrYWRkcl9wb2ludGVyOworICAgICAgICBtZW1zZXQoJmFkZHJlc3MsIDAsIHNpemVvZihhZGRyZXNzKSk7CisgICAgICAgIGFkZHJlc3Muc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGFkZHJlc3Muc2luX3BvcnQgPSA6OmFvczo6aHRvbjx1aW50MTZfdD4oMTE4MCk7CisgICAgICAgIHNvY2thZGRyICphZGRyZXNzX3BvaW50ZXI7CisgICAgICAgIHNvY2thZGRyX3BvaW50ZXIgPSAmYWRkcmVzczsKKyAgICAgICAgbWVtY3B5KCZhZGRyZXNzX3BvaW50ZXIsICZzb2NrYWRkcl9wb2ludGVyLCBzaXplb2Yodm9pZCAqKSk7CisgICAgICAgIGlmIChiaW5kKG15X3NvY2tldCwgYWRkcmVzc19wb2ludGVyLCBzaXplb2YoYWRkcmVzcykpID09IC0xKSB7CisgICAgICAgICAgUExPRyhXQVJOSU5HLCAiYmluZCglZCwgJXAsICV6dSkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgIG15X3NvY2tldCwgJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7CisgICAgICAgICAgY2xvc2UobXlfc29ja2V0KTsKKyAgICAgICAgICBteV9zb2NrZXQgPSAtMTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsaXN0ZW4obXlfc29ja2V0LCAxKSA9PSAtMSkgeworICAgICAgICAgIFBMT0coV0FSTklORywgImxpc3RlbiglZCwgMSkgZmFpbGVkIiwgbXlfc29ja2V0KTsKKyAgICAgICAgICBjbG9zZShteV9zb2NrZXQpOworICAgICAgICAgIG15X3NvY2tldCA9IC0xOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW50IGNvbm5lY3Rpb24gPSBhY2NlcHQ0KG15X3NvY2tldCwgbnVsbHB0ciwgbnVsbHB0ciwgU09DS19OT05CTE9DSyk7CisgICAgaWYgKGNvbm5lY3Rpb24gPT0gLTEpIHsKKyAgICAgIFBMT0coV0FSTklORywgImFjY2VwdCglZCwgbnVsbHB0ciwgbnVsbHB0cikgZmFpbGVkIiwgbXlfc29ja2V0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBMT0coSU5GTywgImFjY2VwdGVkIChpcyAlZClcbiIsIGNvbm5lY3Rpb24pOworCisgICAgd2hpbGUgKGNvbm5lY3Rpb24gIT0gLTEpIHsKKyAgICAgIGZkX3NldCBmZHM7CisgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgRkRfU0VUKGNvbm5lY3Rpb24sICZmZHMpOworICAgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dF90aW1ldmFsID0KKyAgICAgICAgICA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDEpLlRvVGltZXZhbCgpOworICAgICAgc3dpdGNoICgKKyAgICAgICAgICBzZWxlY3QoY29ubmVjdGlvbiArIDEsICZmZHMsIG51bGxwdHIsIG51bGxwdHIsICZ0aW1lb3V0X3RpbWV2YWwpKSB7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgIHVpbnQ4X3QgZGF0YTsKKyAgICAgICAgICBzc2l6ZV90IHJlYWRfYnl0ZXMgPSByZWFkKGNvbm5lY3Rpb24sICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICAgIGlmIChyZWFkX2J5dGVzICE9IHNpemVvZihkYXRhKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcsICJyZWFkICV6ZCBieXRlcyBpbnN0ZWFkIG9mICV6ZFxuIiwgcmVhZF9ieXRlcywKKyAgICAgICAgICAgICAgICBzaXplb2YoZGF0YSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkYXRhICYgMHgwMSkgKytyaWdodF9jb3VudDsKKyAgICAgICAgICBpZiAoZGF0YSAmIDB4MDIpICsrbGVmdF9jb3VudDsKKyAgICAgICAgICBhdXRvIG1lc3NhZ2UgPSA6OmZyYzk3MTo6aG90X2dvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICAgICAgICBtZXNzYWdlLT5sZWZ0X2NvdW50ID0gbGVmdF9jb3VudDsKKyAgICAgICAgICBtZXNzYWdlLT5yaWdodF9jb3VudCA9IHJpZ2h0X2NvdW50OworICAgICAgICAgIExPR19TVFJVQ1QoREVCVUcsICJzZW5kaW5nIiwgKm1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UuU2VuZCgpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgTE9HKFdBUk5JTkcsICJyZWFkIG9uICVkIHRpbWVkIG91dFxuIiwgY29ubmVjdGlvbik7CisgICAgICAgICAgY2xvc2UoY29ubmVjdGlvbik7CisgICAgICAgICAgY29ubmVjdGlvbiA9IC0xOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIFBMT0coRkFUQUwsCisgICAgICAgICAgICAgICAic2VsZWN0KCVkLCAlcCwgbnVsbHB0ciwgbnVsbHB0ciwgJXApIGZhaWxlZCIsCisgICAgICAgICAgICAgICBjb25uZWN0aW9uICsgMSwgJmZkcywgJnRpbWVvdXRfdGltZXZhbCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgTE9HKEZBVEFMLCAiZmluaXNoZWQ/Pz9cbiIpOworfQpkaWZmIC0tZ2l0IGEveTIwMTQvcHJpbWUvcHJpbWUuZ3lwIGIveTIwMTQvcHJpbWUvcHJpbWUuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGZjMWMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9wcmltZS9wcmltZS5neXAKQEAgLTAsMCArMSw1NSBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnQWxsJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJy4uLy4uL2ZyYzk3MS9mcmM5NzEuZ3lwOkFsbCcsCisKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpkcml2ZXRyYWluJywKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpkcml2ZXRyYWluX2xpYl90ZXN0JywKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpyZXBsYXlfZHJpdmV0cmFpbicsCisgICAgICAgICcuLi9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhdycsCisgICAgICAgICcuLi9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19jYWxpYnJhdGlvbicsCisgICAgICAgICcuLi9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19saWJfdGVzdCcsCisgICAgICAgICcuLi9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6cmVwbGF5X2NsYXcnLAorICAgICAgICAnLi4vY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIuZ3lwOnNob290ZXInLAorICAgICAgICAnLi4vY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIuZ3lwOnNob290ZXJfbGliX3Rlc3QnLAorICAgICAgICAnLi4vY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIuZ3lwOnJlcGxheV9zaG9vdGVyJywKKyAgICAgICAgJy4uL2F1dG9ub21vdXMvYXV0b25vbW91cy5neXA6YXV0bycsCisgICAgICAgICcuLi95MjAxNC5neXA6am95c3RpY2tfcmVhZGVyJywKKyAgICAgICAgJy4uL2FjdG9ycy9hY3RvcnMuZ3lwOmJpbmFyaWVzJywKKyAgICAgICAgJ2hvdF9nb2FsX3JlYWRlcicsCisgICAgICBdLAorICAgICAgJ2NvcGllcyc6IFsKKyAgICAgICAgeworICAgICAgICAgICdkZXN0aW5hdGlvbic6ICc8KHJzeW5jX2RpciknLAorICAgICAgICAgICdmaWxlcyc6IFsKKyAgICAgICAgICAgICdzdGFydF9saXN0LnR4dCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgIF0sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydBUkNISVRFQ1RVUkU9PSJhcm1fZnJjIicsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJy4uL3dwaWxpYi93cGlsaWIuZ3lwOndwaWxpYl9pbnRlcmZhY2UnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdob3RfZ29hbF9yZWFkZXInLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2hvdF9nb2FsX3JlYWRlci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9xdWV1ZXMvcXVldWVzLmd5cDpob3RfZ29hbCcKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3kyMDE0L3ByaW1lL3N0YXJ0X2xpc3QudHh0IGIveTIwMTQvcHJpbWUvc3RhcnRfbGlzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2YWNhOAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE0L3ByaW1lL3N0YXJ0X2xpc3QudHh0CkBAIC0wLDAgKzEsMTMgQEAKK2JpbmFyeV9sb2dfd3JpdGVyCittb3Rvcl93cml0ZXIKK2pveXN0aWNrX3JlYWRlcgorZHJpdmV0cmFpbgorYXV0bworc2Vuc29yX3JlY2VpdmVyCitqb3lzdGlja19wcm94eQorY2xhdworc2hvb3Rlcgorc2hvb3RfYWN0aW9uCitkcml2ZXRyYWluX2FjdGlvbgorY2F0Y2hfYWN0aW9uCitob3RfZ29hbF9yZWFkZXIKZGlmZiAtLWdpdCBhL3kyMDE0L3F1ZXVlcy9hdXRvX21vZGUucSBiL3kyMDE0L3F1ZXVlcy9hdXRvX21vZGUucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTIyZGJmCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvcXVldWVzL2F1dG9fbW9kZS5xCkBAIC0wLDAgKzEsNiBAQAorcGFja2FnZSBmcmM5NzEuc2Vuc29yczsKKworbWVzc2FnZSBBdXRvTW9kZSB7CisJZG91YmxlIHZvbHRhZ2U7Cit9OworcXVldWUgQXV0b01vZGUgYXV0b19tb2RlOwpkaWZmIC0tZ2l0IGEveTIwMTQvcXVldWVzL2hvdF9nb2FsLnEgYi95MjAxNC9xdWV1ZXMvaG90X2dvYWwucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQ0NTUzCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTQvcXVldWVzL2hvdF9nb2FsLnEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIGZyYzk3MTsKKworbWVzc2FnZSBIb3RHb2FsIHsKKwl1aW50NjRfdCBsZWZ0X2NvdW50OworCXVpbnQ2NF90IHJpZ2h0X2NvdW50OworfTsKK3F1ZXVlIEhvdEdvYWwgaG90X2dvYWw7CmRpZmYgLS1naXQgYS95MjAxNC9xdWV1ZXMvcHJvZmlsZV9wYXJhbXMucSBiL3kyMDE0L3F1ZXVlcy9wcm9maWxlX3BhcmFtcy5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmZlOWEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9xdWV1ZXMvcHJvZmlsZV9wYXJhbXMucQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2UgZnJjOTcxOworCitzdHJ1Y3QgUHJvZmlsZVBhcmFtcyB7CisgIGRvdWJsZSB2ZWxvY2l0eTsKKyAgZG91YmxlIGFjY2VsZXJhdGlvbjsKK307CmRpZmYgLS1naXQgYS95MjAxNC9xdWV1ZXMvcXVldWVzLmd5cCBiL3kyMDE0L3F1ZXVlcy9xdWV1ZXMuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjUzODQKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC9xdWV1ZXMvcXVldWVzLmd5cApAQCAtMCwwICsxLDM3IEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdwcm9maWxlX3BhcmFtcycsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3Byb2ZpbGVfcGFyYW1zLnEnLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICd5MjAxNC9xdWV1ZXMnLAorICAgICAgfSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vYW9zL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaG90X2dvYWwnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdob3RfZ29hbC5xJywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTQvcXVldWVzJywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2F1dG9fbW9kZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2F1dG9fbW9kZS5xJywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTQvcXVldWVzJywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS95MjAxNC93cGlsaWIvd3BpbGliLmd5cCBiL3kyMDE0L3dwaWxpYi93cGlsaWIuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OGZmNzYKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC93cGlsaWIvd3BpbGliLmd5cApAQCAtMCwwICsxLDM5IEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICd3cGlsaWJfaW50ZXJmYWNlJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICd3cGlsaWJfaW50ZXJmYWNlLmNjJworICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpzdGxfbXV0ZXgnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEVYVEVSTkFMUyk6V1BJTGliJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L3kyMDE0Lmd5cDpjb25zdGFudHMnLAorICAgICAgICAnPChERVBUSCkveTIwMTQvcXVldWVzL3F1ZXVlcy5neXA6YXV0b19tb2RlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLmd5cDpzaG9vdGVyX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE0L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3Lmd5cDpjbGF3X3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6bG9nX2ludGVydmFsJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmd5cDpxdWV1ZV9sb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbWVzc2FnZXMvbWVzc2FnZXMuZ3lwOnJvYm90X3N0YXRlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpwaGFzZWRfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL21lc3NhZ2VzL21lc3NhZ2VzLmd5cDpyb2JvdF9zdGF0ZScsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6aGFsbF9lZmZlY3QnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmpveXN0aWNrX3NlbmRlcicsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6bG9vcF9vdXRwdXRfaGFuZGxlcicsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6YnVmZmVyZWRfcGNtJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDpneXJvX3NlbmRlcicsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6ZG1hX2VkZ2VfY291bnRpbmcnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmludGVycnVwdF9lZGdlX2NvdW50aW5nJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDplbmNvZGVyX2FuZF9wb3RlbnRpb21ldGVyJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnF1ZXVlcycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6bG9nZ2luZ19xdWV1ZScsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS95MjAxNC93cGlsaWIvd3BpbGliX2ludGVyZmFjZS5jYyBiL3kyMDE0L3dwaWxpYi93cGlsaWJfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NmI2ODEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC93cGlsaWIvd3BpbGliX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDc2MiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9sb2dfaW50ZXJ2YWwuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvcGhhc2VkX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvd3JhcHBpbmdfY291bnRlci5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vc3RsX211dGV4LmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbWVzc2FnZXMvcm9ib3Rfc3RhdGUucS5oIgorCisjaW5jbHVkZSAiZnJjOTcxL3NoaWZ0ZXJfaGFsbF9lZmZlY3QuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xLmgiCisjaW5jbHVkZSAieTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucS5oIgorI2luY2x1ZGUgInkyMDE0L2NvbnRyb2xfbG9vcHMvc2hvb3Rlci9zaG9vdGVyLnEuaCIKKyNpbmNsdWRlICJ5MjAxNC9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNC9xdWV1ZXMvYXV0b19tb2RlLnEuaCIKKworI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvaGFsbF9lZmZlY3QuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2pveXN0aWNrX3NlbmRlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvbG9vcF9vdXRwdXRfaGFuZGxlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYnVmZmVyZWRfc29sZW5vaWQuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3BjbS5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvZ3lyb19zZW5kZXIuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmgiCisjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9pbnRlcnJ1cHRfZWRnZV9jb3VudGluZy5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvbG9nZ2luZy5xLmgiCisKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisjaW5jbHVkZSAiVGFsb24uaCIKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJDb21wcmVzc29yLmgiCisjaW5jbHVkZSAiUmVsYXkuaCIKKyNpbmNsdWRlICJSb2JvdEJhc2UuaCIKKyNpbmNsdWRlICJkbWEuaCIKKyNpbmNsdWRlICJDb250cm9sbGVyUG93ZXIuaCIKKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKK3VzaW5nIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlOwordXNpbmcgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWU7Cit1c2luZyA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZTsKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2Ugd3BpbGliIHsKKworLy8gVE9ETyhicmlhbik6IFJlcGxhY2UgdGhpcyB3aXRoIDo6c3RkOjptYWtlX3VuaXF1ZSBvbmNlIGFsbCBvdXIgdG9vbGNoYWlucworLy8gaGF2ZSBzdXBwb3J0LgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIFU+CitzdGQ6OnVuaXF1ZV9wdHI8VD4gbWFrZV91bmlxdWUoVSAmJi4uLiB1KSB7CisgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPFU+KHUpLi4uKSk7Cit9CisKK2RvdWJsZSBkcml2ZXRyYWluX3RyYW5zbGF0ZShpbnQzMl90IGluKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGluKSAvCisgICAgICAgICAoMjU2LjAgLypjcHIqLyAqIDQuMCAvKjR4Ki8pICoKKyAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZHJpdmV0cmFpbl9lbmNvZGVyX3JhdGlvICoKKyAgICAgICAgICgzLjUgLyp3aGVlbCBkaWFtZXRlciovICogMi41NCAvIDEwMC4wICogTV9QSSk7Cit9CisKK2Zsb2F0IGhhbGxfdHJhbnNsYXRlKGNvbnN0IGNvbnN0YW50czo6U2hpZnRlckhhbGxFZmZlY3QgJmssIGZsb2F0IGluX2xvdywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGluX2hpZ2gpIHsKKyAgY29uc3QgZmxvYXQgbG93X3JhdGlvID0KKyAgICAgIDAuNSAqIChpbl9sb3cgLSBzdGF0aWNfY2FzdDxmbG9hdD4oay5sb3dfZ2Vhcl9sb3cpKSAvCisgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oay5sb3dfZ2Vhcl9taWRkbGUgLSBrLmxvd19nZWFyX2xvdyk7CisgIGNvbnN0IGZsb2F0IGhpZ2hfcmF0aW8gPQorICAgICAgMC41ICsgMC41ICogKGluX2hpZ2ggLSBzdGF0aWNfY2FzdDxmbG9hdD4oay5oaWdoX2dlYXJfbWlkZGxlKSkgLworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihrLmhpZ2hfZ2Vhcl9oaWdoIC0gay5oaWdoX2dlYXJfbWlkZGxlKTsKKworICAvLyBSZXR1cm4gbG93IHdoZW4gd2UgYXJlIGJlbG93IDEvMiwgYW5kIGhpZ2ggd2hlbiB3ZSBhcmUgYWJvdmUgMS8yLgorICBpZiAobG93X3JhdGlvICsgaGlnaF9yYXRpbyA8IDEuMCkgeworICAgIHJldHVybiBsb3dfcmF0aW87CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGhpZ2hfcmF0aW87CisgIH0KK30KKworZG91YmxlIGNsYXdfdHJhbnNsYXRlKGludDMyX3QgaW4pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oaW4pIC8gKDI1Ni4wIC8qY3ByKi8gKiA0LjAgLypxdWFkKi8pIC8KKyAgICAgICAgICgxOC4wIC8gNDguMCAvKmVuY29kZXIgZ2VhcnMqLykgLyAoMTIuMCAvIDYwLjAgLypjaGFpbiByZWR1Y3Rpb24qLykgKgorICAgICAgICAgKE1fUEkgLyAxODAuMCk7Cit9CisKK2RvdWJsZSBzaG9vdGVyX3RyYW5zbGF0ZShpbnQzMl90IGluKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGluKSAvICgyNTYuMCAvKmNwciovICogNC4wIC8qcXVhZCovKSAqCisgICAgICAgICAxNiAvKnNwcm9ja2V0IHRlZXRoKi8gKiAwLjM3NSAvKmNoYWluIHBpdGNoKi8KKyAgICAgICAgICogKDIuNTQgLyAxMDAuMCAvKmluIHRvIG0qLyk7Cit9CisKK3N0YXRpYyBjb25zdCBkb3VibGUga01heGltdW1FbmNvZGVyUHVsc2VzUGVyU2Vjb25kID0KKyAgICA1NjAwLjAgLyogZnJlZSBzcGVlZCBSUE0gKi8gKiAxNC4wIC8gNDguMCAvKiBib3R0b20gZ2VhciByZWR1Y3Rpb24gKi8gKgorICAgIDE4LjAgLyAzMi4wIC8qIGJpZyBiZWx0IHJlZHVjdGlvbiAqLyAqCisgICAgMTguMCAvIDY2LjAgLyogdG9wIGdlYXIgcmVkdWN0aW9uICovICogNDguMCAvIDE4LjAgLyogZW5jb2RlciBnZWFycyAqLyAvCisgICAgNjAuMCAvKiBzZWNvbmRzIC8gbWludXRlICovICogMjU2LjAgLyogQ1BSICovOworCitjbGFzcyBTZW5zb3JSZWFkZXIgeworIHB1YmxpYzoKKyAgU2Vuc29yUmVhZGVyKCkgeworICAgIC8vIFNldCBpdCB0byBmaWx0ZXIgb3V0IGFueXRoaW5nIHNob3J0ZXIgdGhhbiAxLzQgb2YgdGhlIG1pbmltdW0gcHVsc2Ugd2lkdGgKKyAgICAvLyB3ZSBzaG91bGQgZXZlciBzZWUuCisgICAgZW5jb2Rlcl9maWx0ZXJfLlNldFBlcmlvZE5hbm9TZWNvbmRzKAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KDEgLyA0LjAgLyBrTWF4aW11bUVuY29kZXJQdWxzZXNQZXJTZWNvbmQgKiAxZTkgKyAwLjUpKTsKKyAgICBoYWxsX2ZpbHRlcl8uU2V0UGVyaW9kTmFub1NlY29uZHMoMTAwMDAwKTsKKyAgfQorCisgIHZvaWQgc2V0X2F1dG9fc2VsZWN0b3JfYW5hbG9nKDo6c3RkOjp1bmlxdWVfcHRyPEFuYWxvZ0lucHV0PiBhbmFsb2cpIHsKKyAgICBhdXRvX3NlbGVjdG9yX2FuYWxvZ18gPSA6OnN0ZDo6bW92ZShhbmFsb2cpOworICB9CisKKyAgdm9pZCBzZXRfZHJpdmV0cmFpbl9sZWZ0X2VuY29kZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2RlcikgeworICAgIGRyaXZldHJhaW5fbGVmdF9lbmNvZGVyXyA9IDo6c3RkOjptb3ZlKGVuY29kZXIpOworICB9CisKKyAgdm9pZCBzZXRfZHJpdmV0cmFpbl9yaWdodF9lbmNvZGVyKDo6c3RkOjp1bmlxdWVfcHRyPEVuY29kZXI+IGVuY29kZXIpIHsKKyAgICBkcml2ZXRyYWluX3JpZ2h0X2VuY29kZXJfID0gOjpzdGQ6Om1vdmUoZW5jb2Rlcik7CisgIH0KKworICB2b2lkIHNldF9oaWdoX2xlZnRfZHJpdmVfaGFsbCg6OnN0ZDo6dW5pcXVlX3B0cjxBbmFsb2dJbnB1dD4gYW5hbG9nKSB7CisgICAgaGlnaF9sZWZ0X2RyaXZlX2hhbGxfID0gOjpzdGQ6Om1vdmUoYW5hbG9nKTsKKyAgfQorCisgIHZvaWQgc2V0X2xvd19yaWdodF9kcml2ZV9oYWxsKDo6c3RkOjp1bmlxdWVfcHRyPEFuYWxvZ0lucHV0PiBhbmFsb2cpIHsKKyAgICBsb3dfcmlnaHRfZHJpdmVfaGFsbF8gPSA6OnN0ZDo6bW92ZShhbmFsb2cpOworICB9CisKKyAgdm9pZCBzZXRfaGlnaF9yaWdodF9kcml2ZV9oYWxsKDo6c3RkOjp1bmlxdWVfcHRyPEFuYWxvZ0lucHV0PiBhbmFsb2cpIHsKKyAgICBoaWdoX3JpZ2h0X2RyaXZlX2hhbGxfID0gOjpzdGQ6Om1vdmUoYW5hbG9nKTsKKyAgfQorCisgIHZvaWQgc2V0X2xvd19sZWZ0X2RyaXZlX2hhbGwoOjpzdGQ6OnVuaXF1ZV9wdHI8QW5hbG9nSW5wdXQ+IGFuYWxvZykgeworICAgIGxvd19sZWZ0X2RyaXZlX2hhbGxfID0gOjpzdGQ6Om1vdmUoYW5hbG9nKTsKKyAgfQorCisgIHZvaWQgc2V0X3RvcF9jbGF3X2VuY29kZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2RlcikgeworICAgIGVuY29kZXJfZmlsdGVyXy5BZGQoZW5jb2Rlci5nZXQoKSk7CisgICAgdG9wX3JlYWRlcl8uc2V0X2VuY29kZXIoOjpzdGQ6Om1vdmUoZW5jb2RlcikpOworICB9CisKKyAgdm9pZCBzZXRfdG9wX2NsYXdfZnJvbnRfaGFsbCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBoYWxsKSB7CisgICAgaGFsbF9maWx0ZXJfLkFkZChoYWxsLmdldCgpKTsKKyAgICB0b3BfcmVhZGVyXy5zZXRfZnJvbnRfaGFsbCg6OnN0ZDo6bW92ZShoYWxsKSk7CisgIH0KKworICB2b2lkIHNldF90b3BfY2xhd19jYWxpYnJhdGlvbl9oYWxsKDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IGhhbGwpIHsKKyAgICBoYWxsX2ZpbHRlcl8uQWRkKGhhbGwuZ2V0KCkpOworICAgIHRvcF9yZWFkZXJfLnNldF9jYWxpYnJhdGlvbl9oYWxsKDo6c3RkOjptb3ZlKGhhbGwpKTsKKyAgfQorCisgIHZvaWQgc2V0X3RvcF9jbGF3X2JhY2tfaGFsbCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBoYWxsKSB7CisgICAgaGFsbF9maWx0ZXJfLkFkZChoYWxsLmdldCgpKTsKKyAgICB0b3BfcmVhZGVyXy5zZXRfYmFja19oYWxsKDo6c3RkOjptb3ZlKGhhbGwpKTsKKyAgfQorCisgIHZvaWQgc2V0X2JvdHRvbV9jbGF3X2VuY29kZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2RlcikgeworICAgIGVuY29kZXJfZmlsdGVyXy5BZGQoZW5jb2Rlci5nZXQoKSk7CisgICAgYm90dG9tX3JlYWRlcl8uc2V0X2VuY29kZXIoOjpzdGQ6Om1vdmUoZW5jb2RlcikpOworICB9CisKKyAgdm9pZCBzZXRfYm90dG9tX2NsYXdfZnJvbnRfaGFsbCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBoYWxsKSB7CisgICAgaGFsbF9maWx0ZXJfLkFkZChoYWxsLmdldCgpKTsKKyAgICBib3R0b21fcmVhZGVyXy5zZXRfZnJvbnRfaGFsbCg6OnN0ZDo6bW92ZShoYWxsKSk7CisgIH0KKworICB2b2lkIHNldF9ib3R0b21fY2xhd19jYWxpYnJhdGlvbl9oYWxsKDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IGhhbGwpIHsKKyAgICBoYWxsX2ZpbHRlcl8uQWRkKGhhbGwuZ2V0KCkpOworICAgIGJvdHRvbV9yZWFkZXJfLnNldF9jYWxpYnJhdGlvbl9oYWxsKDo6c3RkOjptb3ZlKGhhbGwpKTsKKyAgfQorCisgIHZvaWQgc2V0X2JvdHRvbV9jbGF3X2JhY2tfaGFsbCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBoYWxsKSB7CisgICAgaGFsbF9maWx0ZXJfLkFkZChoYWxsLmdldCgpKTsKKyAgICBib3R0b21fcmVhZGVyXy5zZXRfYmFja19oYWxsKDo6c3RkOjptb3ZlKGhhbGwpKTsKKyAgfQorCisgIHZvaWQgc2V0X3Nob290ZXJfZW5jb2Rlcig6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBlbmNvZGVyKSB7CisgICAgZW5jb2Rlcl9maWx0ZXJfLkFkZChlbmNvZGVyLmdldCgpKTsKKyAgICBzaG9vdGVyX2VuY29kZXJfID0gOjpzdGQ6Om1vdmUoZW5jb2Rlcik7CisgIH0KKworICB2b2lkIHNldF9zaG9vdGVyX3Byb3hpbWFsKDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IGhhbGwpIHsKKyAgICBoYWxsX2ZpbHRlcl8uQWRkKGhhbGwuZ2V0KCkpOworICAgIHNob290ZXJfcHJveGltYWxfID0gOjpzdGQ6Om1vdmUoaGFsbCk7CisgIH0KKworICB2b2lkIHNldF9zaG9vdGVyX2Rpc3RhbCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBoYWxsKSB7CisgICAgaGFsbF9maWx0ZXJfLkFkZChoYWxsLmdldCgpKTsKKyAgICBzaG9vdGVyX2Rpc3RhbF8gPSA6OnN0ZDo6bW92ZShoYWxsKTsKKyAgfQorCisgIHZvaWQgc2V0X3Nob290ZXJfcGx1bmdlcig6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBoYWxsKSB7CisgICAgaGFsbF9maWx0ZXJfLkFkZChoYWxsLmdldCgpKTsKKyAgICBzaG9vdGVyX3BsdW5nZXJfID0gOjpzdGQ6Om1vdmUoaGFsbCk7CisgICAgc2hvb3Rlcl9wbHVuZ2VyX3JlYWRlcl8gPQorICAgICAgICBtYWtlX3VuaXF1ZTxETUFEaWdpdGFsUmVhZGVyPihzaG9vdGVyX3BsdW5nZXJfLmdldCgpKTsKKyAgfQorCisgIHZvaWQgc2V0X3Nob290ZXJfbGF0Y2goOjpzdGQ6OnVuaXF1ZV9wdHI8RGlnaXRhbFNvdXJjZT4gaGFsbCkgeworICAgIGhhbGxfZmlsdGVyXy5BZGQoaGFsbC5nZXQoKSk7CisgICAgc2hvb3Rlcl9sYXRjaF8gPSA6OnN0ZDo6bW92ZShoYWxsKTsKKyAgICBzaG9vdGVyX2xhdGNoX3JlYWRlcl8gPSBtYWtlX3VuaXF1ZTxETUFEaWdpdGFsUmVhZGVyPihzaG9vdGVyX2xhdGNoXy5nZXQoKSk7CisgIH0KKworICAvLyBBbGwgb2YgdGhlIERNQS1yZWxhdGVkIHNldF8qIGNhbGxzIG11c3QgYmUgbWFkZSBiZWZvcmUgdGhpcywgYW5kIGl0IGRvZXNuJ3QKKyAgLy8gaHVydCB0byBkbyBhbGwgb2YgdGhlbS4KKyAgdm9pZCBzZXRfZG1hKDo6c3RkOjp1bmlxdWVfcHRyPERNQT4gZG1hKSB7CisgICAgc2hvb3Rlcl9wcm94aW1hbF9jb3VudGVyXyA9IG1ha2VfdW5pcXVlPERNQUVkZ2VDb3VudGVyPigKKyAgICAgICAgc2hvb3Rlcl9lbmNvZGVyXy5nZXQoKSwgc2hvb3Rlcl9wcm94aW1hbF8uZ2V0KCkpOworICAgIHNob290ZXJfZGlzdGFsX2NvdW50ZXJfID0gbWFrZV91bmlxdWU8RE1BRWRnZUNvdW50ZXI+KAorICAgICAgICBzaG9vdGVyX2VuY29kZXJfLmdldCgpLCBzaG9vdGVyX2Rpc3RhbF8uZ2V0KCkpOworCisgICAgZG1hX3N5bmNocm9uaXplcl8ucmVzZXQobmV3IERNQVN5bmNocm9uaXplcig6OnN0ZDo6bW92ZShkbWEpKSk7CisgICAgZG1hX3N5bmNocm9uaXplcl8tPkFkZChzaG9vdGVyX3Byb3hpbWFsX2NvdW50ZXJfLmdldCgpKTsKKyAgICBkbWFfc3luY2hyb25pemVyXy0+QWRkKHNob290ZXJfZGlzdGFsX2NvdW50ZXJfLmdldCgpKTsKKyAgICBkbWFfc3luY2hyb25pemVyXy0+QWRkKHNob290ZXJfcGx1bmdlcl9yZWFkZXJfLmdldCgpKTsKKyAgICBkbWFfc3luY2hyb25pemVyXy0+QWRkKHNob290ZXJfbGF0Y2hfcmVhZGVyXy5nZXQoKSk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkoKSB7CisgICAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWROYW1lKCJTZW5zb3JSZWFkZXIiKTsKKyAgICBMT0coSU5GTywgIkluIHNlbnNvciByZWFkZXIgdGhyZWFkXG4iKTsKKworICAgIG15X3BpZF8gPSBnZXRwaWQoKTsKKyAgICBkc18gPSBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpOworCisgICAgdG9wX3JlYWRlcl8uU3RhcnQoKTsKKyAgICBib3R0b21fcmVhZGVyXy5TdGFydCgpOworICAgIGRtYV9zeW5jaHJvbml6ZXJfLT5TdGFydCgpOworICAgIExPRyhJTkZPLCAiVGhpbmdzIGFyZSBub3cgc3RhcnRlZFxuIik7CisKKyAgICA6OmFvczo6U2V0Q3VycmVudFRocmVhZFJlYWx0aW1lUHJpb3JpdHkoa1ByaW9yaXR5KTsKKyAgICB3aGlsZSAocnVuXykgeworICAgICAgOjphb3M6OnRpbWU6OlBoYXNlZExvb3BYTVMoMTAsIDkwMDApOworICAgICAgUnVuSXRlcmF0aW9uKCk7CisgICAgfQorCisgICAgdG9wX3JlYWRlcl8uUXVpdCgpOworICAgIGJvdHRvbV9yZWFkZXJfLlF1aXQoKTsKKyAgfQorCisgIHZvaWQgUnVuSXRlcmF0aW9uKCkgeworICAgIHsKKyAgICAgIGF1dG8gbmV3X3N0YXRlID0gOjphb3M6OnJvYm90X3N0YXRlLk1ha2VNZXNzYWdlKCk7CisKKyAgICAgIG5ld19zdGF0ZS0+cmVhZGVyX3BpZCA9IG15X3BpZF87CisgICAgICBuZXdfc3RhdGUtPm91dHB1dHNfZW5hYmxlZCA9IGRzXy0+SXNTeXNBY3RpdmUoKTsKKyAgICAgIG5ld19zdGF0ZS0+YnJvd25lZF9vdXQgPSBkc18tPklzU3lzQnJvd25lZE91dCgpOworCisgICAgICBuZXdfc3RhdGUtPmlzXzN2M19hY3RpdmUgPSBDb250cm9sbGVyUG93ZXI6OkdldEVuYWJsZWQzVjMoKTsKKyAgICAgIG5ld19zdGF0ZS0+aXNfNXZfYWN0aXZlID0gQ29udHJvbGxlclBvd2VyOjpHZXRFbmFibGVkNVYoKTsKKyAgICAgIG5ld19zdGF0ZS0+dm9sdGFnZV8zdjMgPSBDb250cm9sbGVyUG93ZXI6OkdldFZvbHRhZ2UzVjMoKTsKKyAgICAgIG5ld19zdGF0ZS0+dm9sdGFnZV81diA9IENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTVWKCk7CisKKyAgICAgIG5ld19zdGF0ZS0+dm9sdGFnZV9yb2JvcmlvX2luID0gQ29udHJvbGxlclBvd2VyOjpHZXRJbnB1dFZvbHRhZ2UoKTsKKyAgICAgIG5ld19zdGF0ZS0+dm9sdGFnZV9iYXR0ZXJ5ID0gZHNfLT5HZXRCYXR0ZXJ5Vm9sdGFnZSgpOworCisgICAgICBMT0dfU1RSVUNUKERFQlVHLCAicm9ib3Rfc3RhdGUiLCAqbmV3X3N0YXRlKTsKKworICAgICAgbmV3X3N0YXRlLlNlbmQoKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworCisgICAgeworICAgICAgYXV0byBkcml2ZXRyYWluX21lc3NhZ2UgPSBkcml2ZXRyYWluX3F1ZXVlLnBvc2l0aW9uLk1ha2VNZXNzYWdlKCk7CisgICAgICBkcml2ZXRyYWluX21lc3NhZ2UtPnJpZ2h0X2VuY29kZXIgPQorICAgICAgICAgIGRyaXZldHJhaW5fdHJhbnNsYXRlKGRyaXZldHJhaW5fcmlnaHRfZW5jb2Rlcl8tPkdldFJhdygpKTsKKyAgICAgIGRyaXZldHJhaW5fbWVzc2FnZS0+bGVmdF9lbmNvZGVyID0KKyAgICAgICAgICAtZHJpdmV0cmFpbl90cmFuc2xhdGUoZHJpdmV0cmFpbl9sZWZ0X2VuY29kZXJfLT5HZXRSYXcoKSk7CisgICAgICBkcml2ZXRyYWluX21lc3NhZ2UtPmxlZnRfc2hpZnRlcl9wb3NpdGlvbiA9CisgICAgICAgICAgaGFsbF90cmFuc2xhdGUodmFsdWVzLmxlZnRfZHJpdmUsIGxvd19sZWZ0X2RyaXZlX2hhbGxfLT5HZXRWb2x0YWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaF9sZWZ0X2RyaXZlX2hhbGxfLT5HZXRWb2x0YWdlKCkpOworICAgICAgZHJpdmV0cmFpbl9tZXNzYWdlLT5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID0gaGFsbF90cmFuc2xhdGUoCisgICAgICAgICAgdmFsdWVzLnJpZ2h0X2RyaXZlLCBsb3dfcmlnaHRfZHJpdmVfaGFsbF8tPkdldFZvbHRhZ2UoKSwKKyAgICAgICAgICBoaWdoX3JpZ2h0X2RyaXZlX2hhbGxfLT5HZXRWb2x0YWdlKCkpOworCisgICAgICBkcml2ZXRyYWluX21lc3NhZ2UuU2VuZCgpOworICAgIH0KKworICAgIDo6ZnJjOTcxOjpzZW5zb3JzOjphdXRvX21vZGUuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgLnZvbHRhZ2UoYXV0b19zZWxlY3Rvcl9hbmFsb2dfLT5HZXRWb2x0YWdlKCkpCisgICAgICAgIC5TZW5kKCk7CisKKyAgICBkbWFfc3luY2hyb25pemVyXy0+UnVuSXRlcmF0aW9uKCk7CisKKyAgICB7CisgICAgICBhdXRvIHNob290ZXJfbWVzc2FnZSA9IHNob290ZXJfcXVldWUucG9zaXRpb24uTWFrZU1lc3NhZ2UoKTsKKyAgICAgIHNob290ZXJfbWVzc2FnZS0+cG9zaXRpb24gPSBzaG9vdGVyX3RyYW5zbGF0ZShzaG9vdGVyX2VuY29kZXJfLT5HZXRSYXcoKSk7CisgICAgICBzaG9vdGVyX21lc3NhZ2UtPnBsdW5nZXIgPSBzaG9vdGVyX3BsdW5nZXJfcmVhZGVyXy0+dmFsdWUoKTsKKyAgICAgIHNob290ZXJfbWVzc2FnZS0+bGF0Y2ggPSBzaG9vdGVyX2xhdGNoX3JlYWRlcl8tPnZhbHVlKCk7CisgICAgICBDb3B5U2hvb3RlclBvc2VkZ2VDb3VudHMoc2hvb3Rlcl9wcm94aW1hbF9jb3VudGVyXy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hvb3Rlcl9tZXNzYWdlLT5wdXNoZXJfcHJveGltYWwpOworICAgICAgQ29weVNob290ZXJQb3NlZGdlQ291bnRzKHNob290ZXJfZGlzdGFsX2NvdW50ZXJfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaG9vdGVyX21lc3NhZ2UtPnB1c2hlcl9kaXN0YWwpOworCisgICAgICBzaG9vdGVyX21lc3NhZ2UuU2VuZCgpOworICAgIH0KKworICAgIHsKKyAgICAgIGF1dG8gY2xhd19tZXNzYWdlID0gY2xhd19xdWV1ZS5wb3NpdGlvbi5NYWtlTWVzc2FnZSgpOworICAgICAgdG9wX3JlYWRlcl8uUnVuSXRlcmF0aW9uKCZjbGF3X21lc3NhZ2UtPnRvcCk7CisgICAgICBib3R0b21fcmVhZGVyXy5SdW5JdGVyYXRpb24oJmNsYXdfbWVzc2FnZS0+Ym90dG9tKTsKKworICAgICAgY2xhd19tZXNzYWdlLlNlbmQoKTsKKyAgICB9CisgIH0KKworICB2b2lkIFF1aXQoKSB7IHJ1bl8gPSBmYWxzZTsgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSGFsZkNsYXdSZWFkZXIgeworICAgcHVibGljOgorICAgIEhhbGZDbGF3UmVhZGVyKGJvb2wgcmV2ZXJzZWQpIDogcmV2ZXJzZWRfKHJldmVyc2VkKSB7fQorCisgICAgdm9pZCBzZXRfZW5jb2Rlcig6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBlbmNvZGVyKSB7CisgICAgICBlbmNvZGVyXyA9IDo6c3RkOjptb3ZlKGVuY29kZXIpOworICAgIH0KKworICAgIHZvaWQgc2V0X2Zyb250X2hhbGwoOjpzdGQ6OnVuaXF1ZV9wdHI8RGlnaXRhbFNvdXJjZT4gZnJvbnRfaGFsbCkgeworICAgICAgZnJvbnRfaGFsbF8gPSA6OnN0ZDo6bW92ZShmcm9udF9oYWxsKTsKKyAgICB9CisKKyAgICB2b2lkIHNldF9jYWxpYnJhdGlvbl9oYWxsKAorICAgICAgICA6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBjYWxpYnJhdGlvbl9oYWxsKSB7CisgICAgICBjYWxpYnJhdGlvbl9oYWxsXyA9IDo6c3RkOjptb3ZlKGNhbGlicmF0aW9uX2hhbGwpOworICAgIH0KKworICAgIHZvaWQgc2V0X2JhY2tfaGFsbCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBiYWNrX2hhbGwpIHsKKyAgICAgIGJhY2tfaGFsbF8gPSA6OnN0ZDo6bW92ZShiYWNrX2hhbGwpOworICAgIH0KKworICAgIHZvaWQgU3RhcnQoKSB7CisgICAgICBmcm9udF9jb3VudGVyXyA9CisgICAgICAgICAgbWFrZV91bmlxdWU8RWRnZUNvdW50ZXI+KGVuY29kZXJfLmdldCgpLCBmcm9udF9oYWxsXy5nZXQoKSk7CisgICAgICBzeW5jaHJvbml6ZXJfLkFkZChmcm9udF9jb3VudGVyXy5nZXQoKSk7CisgICAgICBjYWxpYnJhdGlvbl9jb3VudGVyXyA9CisgICAgICAgICAgbWFrZV91bmlxdWU8RWRnZUNvdW50ZXI+KGVuY29kZXJfLmdldCgpLCBjYWxpYnJhdGlvbl9oYWxsXy5nZXQoKSk7CisgICAgICBzeW5jaHJvbml6ZXJfLkFkZChjYWxpYnJhdGlvbl9jb3VudGVyXy5nZXQoKSk7CisgICAgICBiYWNrX2NvdW50ZXJfID0KKyAgICAgICAgICBtYWtlX3VuaXF1ZTxFZGdlQ291bnRlcj4oZW5jb2Rlcl8uZ2V0KCksIGJhY2tfaGFsbF8uZ2V0KCkpOworICAgICAgc3luY2hyb25pemVyXy5BZGQoYmFja19jb3VudGVyXy5nZXQoKSk7CisgICAgICBzeW5jaHJvbml6ZWRfZW5jb2Rlcl8gPQorICAgICAgICAgIG1ha2VfdW5pcXVlPEludGVycnVwdFN5bmNocm9uaXplZEVuY29kZXI+KGVuY29kZXJfLmdldCgpKTsKKyAgICAgIHN5bmNocm9uaXplcl8uQWRkKHN5bmNocm9uaXplZF9lbmNvZGVyXy5nZXQoKSk7CisKKyAgICAgIHN5bmNocm9uaXplcl8uU3RhcnQoKTsKKyAgICB9CisKKyAgICB2b2lkIFF1aXQoKSB7IHN5bmNocm9uaXplcl8uUXVpdCgpOyB9CisKKyAgICB2b2lkIFJ1bkl0ZXJhdGlvbihjb250cm9sX2xvb3BzOjpIYWxmQ2xhd1Bvc2l0aW9uICpoYWxmX2NsYXdfcG9zaXRpb24pIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBtdWx0aXBsaWVyID0gcmV2ZXJzZWRfID8gLTEuMCA6IDEuMDsKKworICAgICAgc3luY2hyb25pemVyXy5SdW5JdGVyYXRpb24oKTsKKworICAgICAgQ29weVBvc2l0aW9uKGZyb250X2NvdW50ZXJfLmdldCgpLCAmaGFsZl9jbGF3X3Bvc2l0aW9uLT5mcm9udCk7CisgICAgICBDb3B5UG9zaXRpb24oY2FsaWJyYXRpb25fY291bnRlcl8uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgJmhhbGZfY2xhd19wb3NpdGlvbi0+Y2FsaWJyYXRpb24pOworICAgICAgQ29weVBvc2l0aW9uKGJhY2tfY291bnRlcl8uZ2V0KCksICZoYWxmX2NsYXdfcG9zaXRpb24tPmJhY2spOworICAgICAgaGFsZl9jbGF3X3Bvc2l0aW9uLT5wb3NpdGlvbiA9CisgICAgICAgICAgbXVsdGlwbGllciAqIGNsYXdfdHJhbnNsYXRlKHN5bmNocm9uaXplZF9lbmNvZGVyXy0+Z2V0KCkpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICB2b2lkIENvcHlQb3NpdGlvbihjb25zdCBFZGdlQ291bnRlciAqY291bnRlciwgSGFsbEVmZmVjdFN0cnVjdCAqb3V0KSB7CisgICAgICBjb25zdCBkb3VibGUgbXVsdGlwbGllciA9IHJldmVyc2VkXyA/IC0xLjAgOiAxLjA7CisKKyAgICAgIG91dC0+Y3VycmVudCA9IGNvdW50ZXItPnBvbGxlZF92YWx1ZSgpOworICAgICAgb3V0LT5wb3NlZGdlX2NvdW50ID0gY291bnRlci0+cG9zaXRpdmVfaW50ZXJydXB0X2NvdW50KCk7CisgICAgICBvdXQtPm5lZ2VkZ2VfY291bnQgPSBjb3VudGVyLT5uZWdhdGl2ZV9pbnRlcnJ1cHRfY291bnQoKTsKKyAgICAgIG91dC0+cG9zZWRnZV92YWx1ZSA9CisgICAgICAgICAgbXVsdGlwbGllciAqIGNsYXdfdHJhbnNsYXRlKGNvdW50ZXItPmxhc3RfcG9zaXRpdmVfZW5jb2Rlcl92YWx1ZSgpKTsKKyAgICAgIG91dC0+bmVnZWRnZV92YWx1ZSA9CisgICAgICAgICAgbXVsdGlwbGllciAqIGNsYXdfdHJhbnNsYXRlKGNvdW50ZXItPmxhc3RfbmVnYXRpdmVfZW5jb2Rlcl92YWx1ZSgpKTsKKyAgICB9CisKKyAgICBJbnRlcnJ1cHRTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyX3trSW50ZXJydXB0UHJpb3JpdHl9OworCisgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8RWRnZUNvdW50ZXI+IGZyb250X2NvdW50ZXJfOworICAgIDo6c3RkOjp1bmlxdWVfcHRyPEVkZ2VDb3VudGVyPiBjYWxpYnJhdGlvbl9jb3VudGVyXzsKKyAgICA6OnN0ZDo6dW5pcXVlX3B0cjxFZGdlQ291bnRlcj4gYmFja19jb3VudGVyXzsKKyAgICA6OnN0ZDo6dW5pcXVlX3B0cjxJbnRlcnJ1cHRTeW5jaHJvbml6ZWRFbmNvZGVyPiBzeW5jaHJvbml6ZWRfZW5jb2Rlcl87CisKKyAgICA6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBlbmNvZGVyXzsKKyAgICA6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBmcm9udF9oYWxsXzsKKyAgICA6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBjYWxpYnJhdGlvbl9oYWxsXzsKKyAgICA6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBiYWNrX2hhbGxfOworCisgICAgY29uc3QgYm9vbCByZXZlcnNlZF87CisgIH07CisKKyAgc3RhdGljIGNvbnN0IGludCBrUHJpb3JpdHkgPSAzMDsKKyAgc3RhdGljIGNvbnN0IGludCBrSW50ZXJydXB0UHJpb3JpdHkgPSA1NTsKKworICB2b2lkIENvcHlTaG9vdGVyUG9zZWRnZUNvdW50cyhjb25zdCBETUFFZGdlQ291bnRlciAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zZWRnZU9ubHlDb3VudGVkSGFsbEVmZmVjdFN0cnVjdCAqb3V0cHV0KSB7CisgICAgb3V0cHV0LT5jdXJyZW50ID0gY291bnRlci0+cG9sbGVkX3ZhbHVlKCk7CisgICAgb3V0cHV0LT5wb3NlZGdlX2NvdW50ID0gY291bnRlci0+cG9zaXRpdmVfY291bnQoKTsKKyAgICBvdXRwdXQtPm5lZ2VkZ2VfY291bnQgPSBjb3VudGVyLT5uZWdhdGl2ZV9jb3VudCgpOworICAgIG91dHB1dC0+cG9zZWRnZV92YWx1ZSA9CisgICAgICAgIHNob290ZXJfdHJhbnNsYXRlKGNvdW50ZXItPmxhc3RfcG9zaXRpdmVfZW5jb2Rlcl92YWx1ZSgpKTsKKyAgfQorCisgIGludDMyX3QgbXlfcGlkXzsKKyAgRHJpdmVyU3RhdGlvbiAqZHNfOworCisgIDo6c3RkOjp1bmlxdWVfcHRyPERNQVN5bmNocm9uaXplcj4gZG1hX3N5bmNocm9uaXplcl87CisKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QW5hbG9nSW5wdXQ+IGF1dG9fc2VsZWN0b3JfYW5hbG9nXzsKKworICA6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBkcml2ZXRyYWluX2xlZnRfZW5jb2Rlcl87CisgIDo6c3RkOjp1bmlxdWVfcHRyPEVuY29kZXI+IGRyaXZldHJhaW5fcmlnaHRfZW5jb2Rlcl87CisgIDo6c3RkOjp1bmlxdWVfcHRyPEFuYWxvZ0lucHV0PiBsb3dfbGVmdF9kcml2ZV9oYWxsXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QW5hbG9nSW5wdXQ+IGhpZ2hfbGVmdF9kcml2ZV9oYWxsXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QW5hbG9nSW5wdXQ+IGxvd19yaWdodF9kcml2ZV9oYWxsXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QW5hbG9nSW5wdXQ+IGhpZ2hfcmlnaHRfZHJpdmVfaGFsbF87CisKKyAgSGFsZkNsYXdSZWFkZXIgdG9wX3JlYWRlcl97ZmFsc2V9LCBib3R0b21fcmVhZGVyX3t0cnVlfTsKKworICA6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBzaG9vdGVyX2VuY29kZXJfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBzaG9vdGVyX3Byb3hpbWFsXywgc2hvb3Rlcl9kaXN0YWxfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBzaG9vdGVyX3BsdW5nZXJfLCBzaG9vdGVyX2xhdGNoXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RE1BRWRnZUNvdW50ZXI+IHNob290ZXJfcHJveGltYWxfY291bnRlcl8sCisgICAgICBzaG9vdGVyX2Rpc3RhbF9jb3VudGVyXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RE1BRGlnaXRhbFJlYWRlcj4gc2hvb3Rlcl9wbHVuZ2VyX3JlYWRlcl8sCisgICAgICBzaG9vdGVyX2xhdGNoX3JlYWRlcl87CisKKyAgOjpzdGQ6OmF0b21pYzxib29sPiBydW5fe3RydWV9OworICBEaWdpdGFsR2xpdGNoRmlsdGVyIGVuY29kZXJfZmlsdGVyXywgaGFsbF9maWx0ZXJfOworfTsKKworY2xhc3MgU29sZW5vaWRXcml0ZXIgeworIHB1YmxpYzoKKyAgU29sZW5vaWRXcml0ZXIoY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRQY20+ICZwY20pCisgICAgICA6IHBjbV8ocGNtKSwKKyAgICAgICAgc2hvb3Rlcl8oIi5mcmM5NzEuY29udHJvbF9sb29wcy5zaG9vdGVyX3F1ZXVlLm91dHB1dCIpLAorICAgICAgICBkcml2ZXRyYWluXygiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW5fcXVldWUub3V0cHV0Iikge30KKworICB2b2lkIHNldF9wcmVzc3VyZV9zd2l0Y2goOjpzdGQ6OnVuaXF1ZV9wdHI8RGlnaXRhbFNvdXJjZT4gcHJlc3N1cmVfc3dpdGNoKSB7CisgICAgcHJlc3N1cmVfc3dpdGNoXyA9IDo6c3RkOjptb3ZlKHByZXNzdXJlX3N3aXRjaCk7CisgIH0KKworICB2b2lkIHNldF9jb21wcmVzc29yX3JlbGF5KDo6c3RkOjp1bmlxdWVfcHRyPFJlbGF5PiBjb21wcmVzc29yX3JlbGF5KSB7CisgICAgY29tcHJlc3Nvcl9yZWxheV8gPSA6OnN0ZDo6bW92ZShjb21wcmVzc29yX3JlbGF5KTsKKyAgfQorCisgIHZvaWQgc2V0X2RyaXZldHJhaW5fbGVmdCg6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBzKSB7CisgICAgZHJpdmV0cmFpbl9sZWZ0XyA9IDo6c3RkOjptb3ZlKHMpOworICB9CisKKyAgdm9pZCBzZXRfZHJpdmV0cmFpbl9yaWdodCg6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBzKSB7CisgICAgZHJpdmV0cmFpbl9yaWdodF8gPSA6OnN0ZDo6bW92ZShzKTsKKyAgfQorCisgIHZvaWQgc2V0X3Nob290ZXJfbGF0Y2goOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4gcykgeworICAgIHNob290ZXJfbGF0Y2hfID0gOjpzdGQ6Om1vdmUocyk7CisgIH0KKworICB2b2lkIHNldF9zaG9vdGVyX2JyYWtlKDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkU29sZW5vaWQ+IHMpIHsKKyAgICBzaG9vdGVyX2JyYWtlXyA9IDo6c3RkOjptb3ZlKHMpOworICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKCkgeworICAgIDo6YW9zOjpTZXRDdXJyZW50VGhyZWFkTmFtZSgiU29sZW5vaWRzIik7CisgICAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWRSZWFsdGltZVByaW9yaXR5KDMwKTsKKworICAgIHdoaWxlIChydW5fKSB7CisgICAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUygyMCwgMTAwMCk7CisKKyAgICAgIHsKKyAgICAgICAgc2hvb3Rlcl8uRmV0Y2hMYXRlc3QoKTsKKyAgICAgICAgaWYgKHNob290ZXJfLmdldCgpKSB7CisgICAgICAgICAgTE9HX1NUUlVDVChERUJVRywgInNvbGVub2lkcyIsICpzaG9vdGVyXyk7CisgICAgICAgICAgc2hvb3Rlcl9sYXRjaF8tPlNldCghc2hvb3Rlcl8tPmxhdGNoX3Bpc3Rvbik7CisgICAgICAgICAgc2hvb3Rlcl9icmFrZV8tPlNldCghc2hvb3Rlcl8tPmJyYWtlX3Bpc3Rvbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBkcml2ZXRyYWluXy5GZXRjaExhdGVzdCgpOworICAgICAgICBpZiAoZHJpdmV0cmFpbl8uZ2V0KCkpIHsKKyAgICAgICAgICBMT0dfU1RSVUNUKERFQlVHLCAic29sZW5vaWRzIiwgKmRyaXZldHJhaW5fKTsKKyAgICAgICAgICBkcml2ZXRyYWluX2xlZnRfLT5TZXQoZHJpdmV0cmFpbl8tPmxlZnRfaGlnaCk7CisgICAgICAgICAgZHJpdmV0cmFpbl9yaWdodF8tPlNldChkcml2ZXRyYWluXy0+cmlnaHRfaGlnaCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBQbmV1bWF0aWNzVG9Mb2cgdG9fbG9nOworICAgICAgICB7CisgICAgICAgICAgY29uc3QgYm9vbCBjb21wcmVzc29yX29uID0gIXByZXNzdXJlX3N3aXRjaF8tPkdldCgpOworICAgICAgICAgIHRvX2xvZy5jb21wcmVzc29yX29uID0gY29tcHJlc3Nvcl9vbjsKKyAgICAgICAgICBpZiAoY29tcHJlc3Nvcl9vbikgeworICAgICAgICAgICAgY29tcHJlc3Nvcl9yZWxheV8tPlNldChSZWxheTo6a0ZvcndhcmQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wcmVzc29yX3JlbGF5Xy0+U2V0KFJlbGF5OjprT2ZmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwY21fLT5GbHVzaCgpOworICAgICAgICB0b19sb2cucmVhZF9zb2xlbm9pZHMgPSBwY21fLT5HZXRBbGwoKTsKKyAgICAgICAgTE9HX1NUUlVDVChERUJVRywgInBuZXVtYXRpY3MgaW5mbyIsIHRvX2xvZyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBRdWl0KCkgeyBydW5fID0gZmFsc2U7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkUGNtPiAmcGNtXzsKKworICA6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBkcml2ZXRyYWluX2xlZnRfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBkcml2ZXRyYWluX3JpZ2h0XzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4gc2hvb3Rlcl9sYXRjaF87CisgIDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkU29sZW5vaWQ+IHNob290ZXJfYnJha2VfOworCisgIDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IHByZXNzdXJlX3N3aXRjaF87CisgIDo6c3RkOjp1bmlxdWVfcHRyPFJlbGF5PiBjb21wcmVzc29yX3JlbGF5XzsKKworICA6OmFvczo6UXVldWU8OjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OlNob290ZXJRdWV1ZTo6T3V0cHV0PiBzaG9vdGVyXzsKKyAgOjphb3M6OlF1ZXVlPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6Ok91dHB1dD4gZHJpdmV0cmFpbl87CisKKyAgOjpzdGQ6OmF0b21pYzxib29sPiBydW5fe3RydWV9OworfTsKKworY2xhc3MgRHJpdmV0cmFpbldyaXRlciA6IHB1YmxpYyBMb29wT3V0cHV0SGFuZGxlciB7CisgcHVibGljOgorICB2b2lkIHNldF9sZWZ0X2RyaXZldHJhaW5fdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICBsZWZ0X2RyaXZldHJhaW5fdGFsb25fID0gOjpzdGQ6Om1vdmUodCk7CisgIH0KKworICB2b2lkIHNldF9yaWdodF9kcml2ZXRyYWluX3RhbG9uKDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiB0KSB7CisgICAgcmlnaHRfZHJpdmV0cmFpbl90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIFJlYWQoKSBvdmVycmlkZSB7CisgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUub3V0cHV0LkZldGNoQW5vdGhlcigpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFdyaXRlKCkgb3ZlcnJpZGUgeworICAgIGF1dG8gJnF1ZXVlID0gOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUub3V0cHV0OworICAgIExPR19TVFJVQ1QoREVCVUcsICJ3aWxsIG91dHB1dCIsICpxdWV1ZSk7CisgICAgbGVmdF9kcml2ZXRyYWluX3RhbG9uXy0+U2V0KHF1ZXVlLT5sZWZ0X3ZvbHRhZ2UgLyAxMi4wKTsKKyAgICByaWdodF9kcml2ZXRyYWluX3RhbG9uXy0+U2V0KC1xdWV1ZS0+cmlnaHRfdm9sdGFnZSAvIDEyLjApOworICB9CisKKyAgdmlydHVhbCB2b2lkIFN0b3AoKSBvdmVycmlkZSB7CisgICAgTE9HKFdBUk5JTkcsICJkcml2ZXRyYWluIG91dHB1dCB0b28gb2xkXG4iKTsKKyAgICBsZWZ0X2RyaXZldHJhaW5fdGFsb25fLT5EaXNhYmxlKCk7CisgICAgcmlnaHRfZHJpdmV0cmFpbl90YWxvbl8tPkRpc2FibGUoKTsKKyAgfQorCisgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiBsZWZ0X2RyaXZldHJhaW5fdGFsb25fOworICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gcmlnaHRfZHJpdmV0cmFpbl90YWxvbl87Cit9OworCitjbGFzcyBTaG9vdGVyV3JpdGVyIDogcHVibGljIExvb3BPdXRwdXRIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZvaWQgc2V0X3Nob290ZXJfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICBzaG9vdGVyX3RhbG9uXyA9IDo6c3RkOjptb3ZlKHQpOworICB9CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgUmVhZCgpIG92ZXJyaWRlIHsKKyAgICA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5vdXRwdXQuRmV0Y2hBbm90aGVyKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgV3JpdGUoKSBvdmVycmlkZSB7CisgICAgYXV0byAmcXVldWUgPSA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6c2hvb3Rlcl9xdWV1ZS5vdXRwdXQ7CisgICAgTE9HX1NUUlVDVChERUJVRywgIndpbGwgb3V0cHV0IiwgKnF1ZXVlKTsKKyAgICBzaG9vdGVyX3RhbG9uXy0+U2V0KHF1ZXVlLT52b2x0YWdlIC8gMTIuMCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHsKKyAgICBMT0coV0FSTklORywgInNob290ZXIgb3V0cHV0IHRvbyBvbGRcbiIpOworICAgIHNob290ZXJfdGFsb25fLT5EaXNhYmxlKCk7CisgIH0KKworICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gc2hvb3Rlcl90YWxvbl87Cit9OworCitjbGFzcyBDbGF3V3JpdGVyIDogcHVibGljIExvb3BPdXRwdXRIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZvaWQgc2V0X3RvcF9jbGF3X3RhbG9uKDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiB0KSB7CisgICAgdG9wX2NsYXdfdGFsb25fID0gOjpzdGQ6Om1vdmUodCk7CisgIH0KKworICB2b2lkIHNldF9ib3R0b21fY2xhd190YWxvbig6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gdCkgeworICAgIGJvdHRvbV9jbGF3X3RhbG9uXyA9IDo6c3RkOjptb3ZlKHQpOworICB9CisKKyAgdm9pZCBzZXRfbGVmdF90dXNrX3RhbG9uKDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiB0KSB7CisgICAgbGVmdF90dXNrX3RhbG9uXyA9IDo6c3RkOjptb3ZlKHQpOworICB9CisKKyAgdm9pZCBzZXRfcmlnaHRfdHVza190YWxvbig6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gdCkgeworICAgIHJpZ2h0X3R1c2tfdGFsb25fID0gOjpzdGQ6Om1vdmUodCk7CisgIH0KKworICB2b2lkIHNldF9pbnRha2UxX3RhbG9uKDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiB0KSB7CisgICAgaW50YWtlMV90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgIHZvaWQgc2V0X2ludGFrZTJfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICBpbnRha2UyX3RhbG9uXyA9IDo6c3RkOjptb3ZlKHQpOworICB9CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgUmVhZCgpIG92ZXJyaWRlIHsKKyAgICA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5vdXRwdXQuRmV0Y2hBbm90aGVyKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgV3JpdGUoKSBvdmVycmlkZSB7CisgICAgYXV0byAmcXVldWUgPSA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5vdXRwdXQ7CisgICAgTE9HX1NUUlVDVChERUJVRywgIndpbGwgb3V0cHV0IiwgKnF1ZXVlKTsKKyAgICBpbnRha2UxX3RhbG9uXy0+U2V0KHF1ZXVlLT5pbnRha2Vfdm9sdGFnZSAvIDEyLjApOworICAgIGludGFrZTJfdGFsb25fLT5TZXQocXVldWUtPmludGFrZV92b2x0YWdlIC8gMTIuMCk7CisgICAgYm90dG9tX2NsYXdfdGFsb25fLT5TZXQoLXF1ZXVlLT5ib3R0b21fY2xhd192b2x0YWdlIC8gMTIuMCk7CisgICAgdG9wX2NsYXdfdGFsb25fLT5TZXQocXVldWUtPnRvcF9jbGF3X3ZvbHRhZ2UgLyAxMi4wKTsKKyAgICBsZWZ0X3R1c2tfdGFsb25fLT5TZXQocXVldWUtPnR1c2tfdm9sdGFnZSAvIDEyLjApOworICAgIHJpZ2h0X3R1c2tfdGFsb25fLT5TZXQoLXF1ZXVlLT50dXNrX3ZvbHRhZ2UgLyAxMi4wKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTdG9wKCkgb3ZlcnJpZGUgeworICAgIExPRyhXQVJOSU5HLCAiY2xhdyBvdXRwdXQgdG9vIG9sZFxuIik7CisgICAgaW50YWtlMV90YWxvbl8tPkRpc2FibGUoKTsKKyAgICBpbnRha2UyX3RhbG9uXy0+RGlzYWJsZSgpOworICAgIGJvdHRvbV9jbGF3X3RhbG9uXy0+RGlzYWJsZSgpOworICAgIHRvcF9jbGF3X3RhbG9uXy0+RGlzYWJsZSgpOworICAgIGxlZnRfdHVza190YWxvbl8tPkRpc2FibGUoKTsKKyAgICByaWdodF90dXNrX3RhbG9uXy0+RGlzYWJsZSgpOworICB9CisKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHRvcF9jbGF3X3RhbG9uXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IGJvdHRvbV9jbGF3X3RhbG9uXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IGxlZnRfdHVza190YWxvbl87CisgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiByaWdodF90dXNrX3RhbG9uXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IGludGFrZTFfdGFsb25fOworICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gaW50YWtlMl90YWxvbl87Cit9OworCitjbGFzcyBXUElMaWJSb2JvdCA6IHB1YmxpYyBSb2JvdEJhc2UgeworIHB1YmxpYzoKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gbWFrZV9lbmNvZGVyKGludCBpbmRleCkgeworICAgIHJldHVybiBtYWtlX3VuaXF1ZTxFbmNvZGVyPigxMCArIGluZGV4ICogMiwgMTEgKyBpbmRleCAqIDIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVyOjprNFgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFN0YXJ0Q29tcGV0aXRpb24oKSB7CisgICAgOjphb3M6OkluaXROUlQoKTsKKyAgICA6OmFvczo6U2V0Q3VycmVudFRocmVhZE5hbWUoIlN0YXJ0Q29tcGV0aXRpb24iKTsKKworICAgIEpveXN0aWNrU2VuZGVyIGpveXN0aWNrX3NlbmRlcjsKKyAgICA6OnN0ZDo6dGhyZWFkIGpveXN0aWNrX3RocmVhZCg6OnN0ZDo6cmVmKGpveXN0aWNrX3NlbmRlcikpOworCisgICAgU2Vuc29yUmVhZGVyIHJlYWRlcjsKKyAgICBMT0coSU5GTywgIkNyZWF0aW5nIHRoZSByZWFkZXJcbiIpOworCisgICAgcmVhZGVyLnNldF9hdXRvX3NlbGVjdG9yX2FuYWxvZyhtYWtlX3VuaXF1ZTxBbmFsb2dJbnB1dD4oNCkpOworCisgICAgcmVhZGVyLnNldF9kcml2ZXRyYWluX2xlZnRfZW5jb2RlcihtYWtlX2VuY29kZXIoMCkpOworICAgIHJlYWRlci5zZXRfZHJpdmV0cmFpbl9yaWdodF9lbmNvZGVyKG1ha2VfZW5jb2RlcigxKSk7CisgICAgcmVhZGVyLnNldF9oaWdoX2xlZnRfZHJpdmVfaGFsbChtYWtlX3VuaXF1ZTxBbmFsb2dJbnB1dD4oMSkpOworICAgIHJlYWRlci5zZXRfbG93X2xlZnRfZHJpdmVfaGFsbChtYWtlX3VuaXF1ZTxBbmFsb2dJbnB1dD4oMCkpOworICAgIHJlYWRlci5zZXRfaGlnaF9yaWdodF9kcml2ZV9oYWxsKG1ha2VfdW5pcXVlPEFuYWxvZ0lucHV0PigyKSk7CisgICAgcmVhZGVyLnNldF9sb3dfcmlnaHRfZHJpdmVfaGFsbChtYWtlX3VuaXF1ZTxBbmFsb2dJbnB1dD4oMykpOworCisgICAgcmVhZGVyLnNldF90b3BfY2xhd19lbmNvZGVyKG1ha2VfZW5jb2RlcigzKSk7CisgICAgcmVhZGVyLnNldF90b3BfY2xhd19mcm9udF9oYWxsKG1ha2VfdW5pcXVlPEhhbGxFZmZlY3Q+KDQpKTsgIC8vIFIyCisgICAgcmVhZGVyLnNldF90b3BfY2xhd19jYWxpYnJhdGlvbl9oYWxsKG1ha2VfdW5pcXVlPEhhbGxFZmZlY3Q+KDMpKTsgIC8vIFIzCisgICAgcmVhZGVyLnNldF90b3BfY2xhd19iYWNrX2hhbGwobWFrZV91bmlxdWU8SGFsbEVmZmVjdD4oNSkpOyAgLy8gUjEKKworICAgIHJlYWRlci5zZXRfYm90dG9tX2NsYXdfZW5jb2RlcihtYWtlX2VuY29kZXIoNSkpOworICAgIHJlYWRlci5zZXRfYm90dG9tX2NsYXdfZnJvbnRfaGFsbChtYWtlX3VuaXF1ZTxIYWxsRWZmZWN0PigxKSk7ICAvLyBMMgorICAgIHJlYWRlci5zZXRfYm90dG9tX2NsYXdfY2FsaWJyYXRpb25faGFsbChtYWtlX3VuaXF1ZTxIYWxsRWZmZWN0PigwKSk7ICAvLyBMMworICAgIHJlYWRlci5zZXRfYm90dG9tX2NsYXdfYmFja19oYWxsKG1ha2VfdW5pcXVlPEhhbGxFZmZlY3Q+KDIpKTsgIC8vIEwxCisKKyAgICByZWFkZXIuc2V0X3Nob290ZXJfZW5jb2RlcihtYWtlX2VuY29kZXIoMikpOworICAgIHJlYWRlci5zZXRfc2hvb3Rlcl9wcm94aW1hbChtYWtlX3VuaXF1ZTxIYWxsRWZmZWN0Pig2KSk7ICAvLyBTMQorICAgIHJlYWRlci5zZXRfc2hvb3Rlcl9kaXN0YWwobWFrZV91bmlxdWU8SGFsbEVmZmVjdD4oNykpOyAgLy8gUzIKKyAgICByZWFkZXIuc2V0X3Nob290ZXJfcGx1bmdlcihtYWtlX3VuaXF1ZTxIYWxsRWZmZWN0Pig4KSk7ICAvLyBTMworICAgIHJlYWRlci5zZXRfc2hvb3Rlcl9sYXRjaChtYWtlX3VuaXF1ZTxIYWxsRWZmZWN0Pig5KSk7ICAvLyBTNAorCisgICAgcmVhZGVyLnNldF9kbWEobWFrZV91bmlxdWU8RE1BPigpKTsKKyAgICA6OnN0ZDo6dGhyZWFkIHJlYWRlcl90aHJlYWQoOjpzdGQ6OnJlZihyZWFkZXIpKTsKKworICAgIEd5cm9TZW5kZXIgZ3lyb19zZW5kZXI7CisgICAgOjpzdGQ6OnRocmVhZCBneXJvX3RocmVhZCg6OnN0ZDo6cmVmKGd5cm9fc2VuZGVyKSk7CisKKyAgICBEcml2ZXRyYWluV3JpdGVyIGRyaXZldHJhaW5fd3JpdGVyOworICAgIGRyaXZldHJhaW5fd3JpdGVyLnNldF9sZWZ0X2RyaXZldHJhaW5fdGFsb24oCisgICAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPihuZXcgVGFsb24oNSkpKTsKKyAgICBkcml2ZXRyYWluX3dyaXRlci5zZXRfcmlnaHRfZHJpdmV0cmFpbl90YWxvbigKKyAgICAgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+KG5ldyBUYWxvbigyKSkpOworICAgIDo6c3RkOjp0aHJlYWQgZHJpdmV0cmFpbl93cml0ZXJfdGhyZWFkKDo6c3RkOjpyZWYoZHJpdmV0cmFpbl93cml0ZXIpKTsKKworICAgIDo6ZnJjOTcxOjp3cGlsaWI6OkNsYXdXcml0ZXIgY2xhd193cml0ZXI7CisgICAgY2xhd193cml0ZXIuc2V0X3RvcF9jbGF3X3RhbG9uKDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPihuZXcgVGFsb24oMSkpKTsKKyAgICBjbGF3X3dyaXRlci5zZXRfYm90dG9tX2NsYXdfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+KG5ldyBUYWxvbigwKSkpOworICAgIGNsYXdfd3JpdGVyLnNldF9sZWZ0X3R1c2tfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+KG5ldyBUYWxvbig0KSkpOworICAgIGNsYXdfd3JpdGVyLnNldF9yaWdodF90dXNrX3RhbG9uKDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPihuZXcgVGFsb24oMykpKTsKKyAgICBjbGF3X3dyaXRlci5zZXRfaW50YWtlMV90YWxvbig6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4obmV3IFRhbG9uKDcpKSk7CisgICAgY2xhd193cml0ZXIuc2V0X2ludGFrZTJfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+KG5ldyBUYWxvbig4KSkpOworICAgIDo6c3RkOjp0aHJlYWQgY2xhd193cml0ZXJfdGhyZWFkKDo6c3RkOjpyZWYoY2xhd193cml0ZXIpKTsKKworICAgIDo6ZnJjOTcxOjp3cGlsaWI6OlNob290ZXJXcml0ZXIgc2hvb3Rlcl93cml0ZXI7CisgICAgc2hvb3Rlcl93cml0ZXIuc2V0X3Nob290ZXJfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+KG5ldyBUYWxvbig2KSkpOworICAgIDo6c3RkOjp0aHJlYWQgc2hvb3Rlcl93cml0ZXJfdGhyZWFkKDo6c3RkOjpyZWYoc2hvb3Rlcl93cml0ZXIpKTsKKworICAgIDo6c3RkOjp1bmlxdWVfcHRyPDo6ZnJjOTcxOjp3cGlsaWI6OkJ1ZmZlcmVkUGNtPiBwY20oCisgICAgICAgIG5ldyA6OmZyYzk3MTo6d3BpbGliOjpCdWZmZXJlZFBjbSgpKTsKKyAgICBTb2xlbm9pZFdyaXRlciBzb2xlbm9pZF93cml0ZXIocGNtKTsKKyAgICBzb2xlbm9pZF93cml0ZXIuc2V0X2RyaXZldHJhaW5fbGVmdChwY20tPk1ha2VTb2xlbm9pZCg2KSk7CisgICAgc29sZW5vaWRfd3JpdGVyLnNldF9kcml2ZXRyYWluX3JpZ2h0KHBjbS0+TWFrZVNvbGVub2lkKDcpKTsKKyAgICBzb2xlbm9pZF93cml0ZXIuc2V0X3Nob290ZXJfbGF0Y2gocGNtLT5NYWtlU29sZW5vaWQoNSkpOworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfc2hvb3Rlcl9icmFrZShwY20tPk1ha2VTb2xlbm9pZCg0KSk7CisKKyAgICBzb2xlbm9pZF93cml0ZXIuc2V0X3ByZXNzdXJlX3N3aXRjaChtYWtlX3VuaXF1ZTxEaWdpdGFsSW5wdXQ+KDkpKTsKKyAgICBzb2xlbm9pZF93cml0ZXIuc2V0X2NvbXByZXNzb3JfcmVsYXkobWFrZV91bmlxdWU8UmVsYXk+KDApKTsKKyAgICA6OnN0ZDo6dGhyZWFkIHNvbGVub2lkX3RocmVhZCg6OnN0ZDo6cmVmKHNvbGVub2lkX3dyaXRlcikpOworCisgICAgLy8gV2FpdCBmb3JldmVyLiBOb3QgbXVjaCBlbHNlIHRvIGRvLi4uCisgICAgUENIRUNLKHNlbGVjdCgwLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKSk7CisKKyAgICBMT0coRVJST1IsICJFeGl0aW5nIFdQSUxpYlJvYm90XG4iKTsKKworICAgIGpveXN0aWNrX3NlbmRlci5RdWl0KCk7CisgICAgam95c3RpY2tfdGhyZWFkLmpvaW4oKTsKKyAgICByZWFkZXIuUXVpdCgpOworICAgIHJlYWRlcl90aHJlYWQuam9pbigpOworICAgIGd5cm9fc2VuZGVyLlF1aXQoKTsKKyAgICBneXJvX3RocmVhZC5qb2luKCk7CisKKyAgICBkcml2ZXRyYWluX3dyaXRlci5RdWl0KCk7CisgICAgZHJpdmV0cmFpbl93cml0ZXJfdGhyZWFkLmpvaW4oKTsKKyAgICBzaG9vdGVyX3dyaXRlci5RdWl0KCk7CisgICAgc2hvb3Rlcl93cml0ZXJfdGhyZWFkLmpvaW4oKTsKKyAgICBjbGF3X3dyaXRlci5RdWl0KCk7CisgICAgY2xhd193cml0ZXJfdGhyZWFkLmpvaW4oKTsKKyAgICBzb2xlbm9pZF93cml0ZXIuUXVpdCgpOworICAgIHNvbGVub2lkX3RocmVhZC5qb2luKCk7CisKKyAgICA6OmFvczo6Q2xlYW51cCgpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKworU1RBUlRfUk9CT1RfQ0xBU1MoOjpmcmM5NzE6OndwaWxpYjo6V1BJTGliUm9ib3QpOwpkaWZmIC0tZ2l0IGEveTIwMTQveTIwMTQuZ3lwIGIveTIwMTQveTIwMTQuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODdhOWEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNC95MjAxNC5neXAKQEAgLTAsMCArMSw0NCBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY29uc3RhbnRzJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY29uc3RhbnRzLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6b25jZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL25ldHdvcmsvbmV0d29yay5neXA6dGVhbV9udW1iZXInLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXA6cG9seWRyaXZldHJhaW5fcGxhbnRzJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdqb3lzdGlja19yZWFkZXInLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2pveXN0aWNrX3JlYWRlci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9wcmltZS9pbnB1dC9pbnB1dC5neXA6am95c3RpY2tfaW5wdXQnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpsb2dfaW50ZXJ2YWwnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorCisgICAgICAgICc8KERFUFRIKS95MjAxNC9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXA6ZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNC95MjAxNC5neXA6Y29uc3RhbnRzJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9xdWV1ZXMvcXVldWVzLmd5cDpneXJvJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9hdXRvbm9tb3VzL2F1dG9ub21vdXMuZ3lwOmF1dG9fcXVldWUnLAorICAgICAgICAnPChERVBUSCkveTIwMTQvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwOmNsYXdfcXVldWUnLAorICAgICAgICAnPChERVBUSCkveTIwMTQvY29udHJvbF9sb29wcy9zaG9vdGVyL3Nob290ZXIuZ3lwOnNob290ZXJfcXVldWUnLAorICAgICAgICAnPChERVBUSCkveTIwMTQvYWN0b3JzL2FjdG9ycy5neXA6c2hvb3RfYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvYWN0b3JzLmd5cCBiL3kyMDE1L2FjdG9ycy9hY3RvcnMuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTg5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvYWN0b3JzLmd5cApAQCAtMCwwICsxLDYzMCBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYmluYXJpZXMnLAorICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnZHJpdmV0cmFpbl9hY3Rpb24nLAorICAgICAgICAnc2NvcmVfYWN0aW9uJywKKyAgICAgICAgJ3Njb3JlX2FjdGlvbl90ZXN0JywKKyAgICAgICAgJ3BpY2t1cF9hY3Rpb24nLAorICAgICAgICAnc3RhY2tfYWN0aW9uJywKKyAgICAgICAgJ3N0YWNrX2FuZF9saWZ0X2FjdGlvbicsCisgICAgICAgICdzdGFja19hbmRfaG9sZF9hY3Rpb24nLAorICAgICAgICAnaGVsZF90b19saWZ0X2FjdGlvbicsCisgICAgICAgICdjYW5fcGlja3VwX2FjdGlvbicsCisgICAgICAgICdob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0aW9uJywKKyAgICAgICAgJ2xpZnRfYWN0aW9uJywKKyAgICAgICAgJ3N0YWNrX2FjdGlvbl90ZXN0JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZHJpdmV0cmFpbl9hY3Rpb25fcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ2RyaXZldHJhaW5fYWN0aW9uLnEnXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICd5MjAxNS9hY3RvcnMnLAorICAgICAgfSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fcXVldWUnLAorICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vYW9zL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZHJpdmV0cmFpbl9hY3Rpb25fbGliJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZHJpdmV0cmFpbl9hY3Rvci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2RyaXZldHJhaW5fYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L3kyMDE1Lmd5cDpjb25zdGFudHMnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnBoYXNlZF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmVpZ2VuJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDp0cmFwZXpvaWRfcHJvZmlsZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXA6ZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICdkcml2ZXRyYWluX2FjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RyaXZldHJhaW5fYWN0aW9uJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdkcml2ZXRyYWluX2FjdG9yX21haW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJ2RyaXZldHJhaW5fYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ2RyaXZldHJhaW5fYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJyA6ICdmcmlkZ2VfcHJvZmlsZV9saWInLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJ2ZyaWRnZV9wcm9maWxlX2xpYi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcycgOiBbCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nX2ludGVyZmFjZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuZ3lwOmZyaWRnZV9xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnIDogWworICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZ19pbnRlcmZhY2UnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLmd5cDpmcmlkZ2VfcXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzY29yZV9hY3Rpb25fcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ3Njb3JlX2FjdGlvbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTUvYWN0b3JzJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Njb3JlX2FjdGlvbl9saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzY29yZV9hY3Rvci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3Njb3JlX2FjdGlvbl9xdWV1ZScsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS95MjAxNS95MjAxNS5neXA6Y29uc3RhbnRzJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5neXA6ZnJpZGdlX3F1ZXVlJywKKyAgICAgICAgJzwoRVhURVJOQUxTKTplaWdlbicsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICdzY29yZV9hY3Rpb25fcXVldWUnLAorICAgICAgICAnPChFWFRFUk5BTFMpOmVpZ2VuJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc2NvcmVfYWN0aW9uJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzY29yZV9hY3Rvcl9tYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICdzY29yZV9hY3Rpb25fcXVldWUnLAorICAgICAgICAnc2NvcmVfYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Njb3JlX2FjdGlvbl90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzY29yZV9hY3Rvcl90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpxdWV1ZV90ZXN0dXRpbHMnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlcycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5neXA6ZnJpZGdlX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnRlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQnLAorICAgICAgICAnc2NvcmVfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ3Njb3JlX2FjdGlvbl9saWInLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdwaWNrdXBfYWN0aW9uX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWydwaWNrdXBfYWN0aW9uLnEnXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICd5MjAxNS9hY3RvcnMnLAorICAgICAgfSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fcXVldWUnLAorICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vYW9zL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncGlja3VwX2FjdGlvbl9saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdwaWNrdXBfYWN0b3IuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdwaWNrdXBfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3Lmd5cDpjbGF3X3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJ3BpY2t1cF9hY3Rpb25fcXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdwaWNrdXBfYWN0aW9uJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdwaWNrdXBfYWN0b3JfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAncGlja3VwX2FjdGlvbl9xdWV1ZScsCisgICAgICAgICdwaWNrdXBfYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2Nhbl9waWNrdXBfYWN0aW9uX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWydjYW5fcGlja3VwX2FjdGlvbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTUvYWN0b3JzJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2Nhbl9waWNrdXBfYWN0aW9uX2xpYicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2Nhbl9waWNrdXBfYWN0b3IuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdmcmlkZ2VfcHJvZmlsZV9saWInLAorICAgICAgICAnY2FuX3BpY2t1cF9hY3Rpb25fcXVldWUnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUveTIwMTUuZ3lwOmNvbnN0YW50cycsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnZnJpZGdlX3Byb2ZpbGVfbGliJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJ2Nhbl9waWNrdXBfYWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY2FuX3BpY2t1cF9hY3Rpb24nLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2Nhbl9waWNrdXBfYWN0b3JfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnY2FuX3BpY2t1cF9hY3Rpb25fcXVldWUnLAorICAgICAgICAnY2FuX3BpY2t1cF9hY3Rpb25fbGliJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbl9xdWV1ZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsnaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTUvYWN0b3JzJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rpb25fbGliJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdG9yLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnZnJpZGdlX3Byb2ZpbGVfbGliJywKKyAgICAgICAgJ2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rpb25fcXVldWUnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUveTIwMTUuZ3lwOmNvbnN0YW50cycsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnZnJpZGdlX3Byb2ZpbGVfbGliJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJ2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rpb25fcXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0aW9uJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0b3JfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbl9xdWV1ZScsCisgICAgICAgICdob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2hlbGRfdG9fbGlmdF9hY3Rpb25fcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ2hlbGRfdG9fbGlmdF9hY3Rpb24ucSddLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9wYXRoJzogJ3kyMDE1L2FjdG9ycycsCisgICAgICB9LAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fcXVldWUnLAorICAgICAgICAnbGlmdF9hY3Rpb25fcGFyYW1zJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fcXVldWUnLAorICAgICAgICAnbGlmdF9hY3Rpb25fcGFyYW1zJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2hlbGRfdG9fbGlmdF9hY3Rpb25fbGliJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnaGVsZF90b19saWZ0X2FjdG9yLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnZnJpZGdlX3Byb2ZpbGVfbGliJywKKyAgICAgICAgJ2hlbGRfdG9fbGlmdF9hY3Rpb25fcXVldWUnLAorICAgICAgICAnbGlmdF9hY3Rpb25fbGliJywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnBoYXNlZF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L3kyMDE1Lmd5cDpjb25zdGFudHMnLAorICAgICAgICAnPChERVBUSCkveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwOmNsYXdfcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJ2hlbGRfdG9fbGlmdF9hY3Rpb25fcXVldWUnLAorICAgICAgICAnZnJpZGdlX3Byb2ZpbGVfbGliJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaGVsZF90b19saWZ0X2FjdGlvbicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnaGVsZF90b19saWZ0X2FjdG9yX21haW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJ2hlbGRfdG9fbGlmdF9hY3Rpb25fcXVldWUnLAorICAgICAgICAnaGVsZF90b19saWZ0X2FjdGlvbl9saWInLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFja19hbmRfaG9sZF9hY3Rpb25fcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ3N0YWNrX2FuZF9ob2xkX2FjdGlvbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTUvYWN0b3JzJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9xdWV1ZScsCisgICAgICAgICdzdGFja19hY3Rpb25fcGFyYW1zJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fcXVldWUnLAorICAgICAgICAnc3RhY2tfYWN0aW9uX3BhcmFtcycsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9hb3MvYnVpbGQvcXVldWVzLmd5cGknXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFja19hbmRfaG9sZF9hY3Rpb25fbGliJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnc3RhY2tfYW5kX2hvbGRfYWN0b3IuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdmcmlkZ2VfcHJvZmlsZV9saWInLAorICAgICAgICAnc3RhY2tfYW5kX2hvbGRfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ3N0YWNrX2FjdGlvbl9saWInLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUveTIwMTUuZ3lwOmNvbnN0YW50cycsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnc3RhY2tfYW5kX2hvbGRfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ2ZyaWRnZV9wcm9maWxlX2xpYicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YWNrX2FuZF9ob2xkX2FjdGlvbicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnc3RhY2tfYW5kX2hvbGRfYWN0b3JfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnc3RhY2tfYW5kX2hvbGRfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ3N0YWNrX2FuZF9ob2xkX2FjdGlvbl9saWInLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFja19hbmRfbGlmdF9hY3Rpb25fcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ3N0YWNrX2FuZF9saWZ0X2FjdGlvbi5xJ10sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTUvYWN0b3JzJywKKyAgICAgIH0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9xdWV1ZScsCisgICAgICAgICdzdGFja19hY3Rpb25fcGFyYW1zJywKKyAgICAgICAgJ2xpZnRfYWN0aW9uX3BhcmFtcycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ3N0YWNrX2FjdGlvbl9wYXJhbXMnLAorICAgICAgICAnbGlmdF9hY3Rpb25fcGFyYW1zJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YWNrX2FuZF9saWZ0X2FjdGlvbl9saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzdGFja19hbmRfbGlmdF9hY3Rvci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2ZyaWRnZV9wcm9maWxlX2xpYicsCisgICAgICAgICdzdGFja19hbmRfbGlmdF9hY3Rpb25fcXVldWUnLAorICAgICAgICAnc3RhY2tfYWN0aW9uX2xpYicsCisgICAgICAgICdsaWZ0X2FjdGlvbl9saWInLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUveTIwMTUuZ3lwOmNvbnN0YW50cycsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnc3RhY2tfYW5kX2xpZnRfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ2ZyaWRnZV9wcm9maWxlX2xpYicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YWNrX2FuZF9saWZ0X2FjdGlvbicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnc3RhY2tfYW5kX2xpZnRfYWN0b3JfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnc3RhY2tfYW5kX2xpZnRfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ3N0YWNrX2FuZF9saWZ0X2FjdGlvbl9saWInLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICMgVGhpcyBpcyBhIHdyYXBwZXIgdGFyZ2V0IHRvIGF2b2lkIGFkZGluZyB0aGUgZGlyZWN0b3J5IHdpdGggYSBzdGFsZQorICAgICAgIyBzdGFja19hY3Rpb25fcGFyYW1zLnEuaCB0byB0aGUgY29tcGlsZXIncyBpbmNsdWRlIHBhdGguCisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RhY2tfYWN0aW9uX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsnc3RhY2tfYWN0aW9uX3F1ZXVlX3JlYWwnXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWydzdGFja19hY3Rpb25fcXVldWVfcmVhbCddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YWNrX2FjdGlvbl9xdWV1ZV9yZWFsJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnc3RhY2tfYWN0aW9uLnEnLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICd5MjAxNS9hY3RvcnMnLAorICAgICAgfSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ3N0YWNrX2FjdGlvbl9wYXJhbXMnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9xdWV1ZScsCisgICAgICAgICdzdGFja19hY3Rpb25fcGFyYW1zJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YWNrX2FjdGlvbl9wYXJhbXMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzdGFja19hY3Rpb25fcGFyYW1zLnEnLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICd5MjAxNS9hY3RvcnMnLAorICAgICAgfSwKKyAgICAgICdpbmNsdWRlcyc6IFsnLi4vLi4vYW9zL2J1aWxkL3F1ZXVlcy5neXBpJ10sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RhY2tfYWN0aW9uX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3N0YWNrX2FjdG9yX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlX3Rlc3R1dGlscycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVzJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLmd5cDpmcmlkZ2VfcXVldWUnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6dGVhbV9udW1iZXJfdGVzdF9lbnZpcm9ubWVudCcsCisgICAgICAgICdzdGFja19hY3Rpb25fcXVldWUnLAorICAgICAgICAnc3RhY2tfYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YWNrX2FjdGlvbl9saWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzdGFja19hY3Rvci5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2ZyaWRnZV9wcm9maWxlX2xpYicsCisgICAgICAgICdzdGFja19hY3Rpb25fcXVldWUnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUveTIwMTUuZ3lwOmNvbnN0YW50cycsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19xdWV1ZScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICdmcmlkZ2VfcHJvZmlsZV9saWInLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuZ3lwOmFjdGlvbl9saWInLAorICAgICAgICAnc3RhY2tfYWN0aW9uX3F1ZXVlJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RhY2tfYWN0aW9uJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzdGFja19hY3Rvcl9tYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICdzdGFja19hY3Rpb25fcXVldWUnLAorICAgICAgICAnc3RhY2tfYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgIyBUaGlzIGlzIGEgd3JhcHBlciB0YXJnZXQgdG8gYXZvaWQgYWRkaW5nIHRoZSBkaXJlY3Rvcnkgd2l0aCBhIHN0YWxlCisgICAgICAjIGxpZnRfYWN0aW9uX3BhcmFtcy5xLmggdG8gdGhlIGNvbXBpbGVyJ3MgaW5jbHVkZSBwYXRoLgorICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpZnRfYWN0aW9uX3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsnbGlmdF9hY3Rpb25fcXVldWVfcmVhbCddLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbJ2xpZnRfYWN0aW9uX3F1ZXVlX3JlYWwnXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWZ0X2FjdGlvbl9xdWV1ZV9yZWFsJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnbGlmdF9hY3Rpb24ucScsCisgICAgICBdLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9wYXRoJzogJ3kyMDE1L2FjdG9ycycsCisgICAgICB9LAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fcXVldWUnLAorICAgICAgICAnbGlmdF9hY3Rpb25fcGFyYW1zJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fcXVldWUnLAorICAgICAgICAnbGlmdF9hY3Rpb25fcGFyYW1zJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpZnRfYWN0aW9uX3BhcmFtcycsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2xpZnRfYWN0aW9uX3BhcmFtcy5xJywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaGVhZGVyX3BhdGgnOiAneTIwMTUvYWN0b3JzJywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpZnRfYWN0aW9uX2xpYicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2xpZnRfYWN0b3IuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdmcmlkZ2VfcHJvZmlsZV9saWInLAorICAgICAgICAnbGlmdF9hY3Rpb25fcXVldWUnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNS95MjAxNS5neXA6Y29uc3RhbnRzJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3Lmd5cDpjbGF3X3F1ZXVlJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJ2ZyaWRnZV9wcm9maWxlX2xpYicsCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisgICAgICAgICdsaWZ0X2FjdGlvbl9xdWV1ZScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpZnRfYWN0aW9uJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdsaWZ0X2FjdG9yX21haW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmd5cDphY3Rpb25fbGliJywKKyAgICAgICAgJ2xpZnRfYWN0aW9uX3F1ZXVlJywKKyAgICAgICAgJ2xpZnRfYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvY2FuX3BpY2t1cF9hY3Rpb24ucSBiL3kyMDE1L2FjdG9ycy9jYW5fcGlja3VwX2FjdGlvbi5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NDY3MjIKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvY2FuX3BpY2t1cF9hY3Rpb24ucQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIGZyYzk3MS5hY3RvcnM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMucSI7CisKKy8vIFBhcmFtZXRlcnMgdG8gc2VuZCB3aXRoIHN0YXJ0LgorLy8gVGhpcyBhY3Rpb24gcGlja3MgYSByaWdodCBzaWRlIHVwIGNhbiBmcm9tIHRoZSBjbGF3LgorLy8gSXQgc3RhcnRzIGJ5IGxpZnRpbmcgdXAsIHRoZW4gbW92aW5nIHRoZSBhcm0gb3V0LCB0aGVuIGxpZnRpbmcgdGhlIGNhbiBvdXQgb2YKKy8vIHRoZSBjbGF3LCBhbmQgdGhlbiBlbmRzIHdpdGggdGhlIGNhbiBpbnNpZGUgdGhlIGJvdC4KK3N0cnVjdCBDYW5QaWNrdXBQYXJhbXMgeworICAvLyBYIHBvc2l0aW9uIGZvciB0aGUgZnJpZGdlIHdoZW4gcGlja2luZyB1cC4KKyAgZG91YmxlIHBpY2t1cF94OworICAvLyBZIHBvc2l0aW9uIGZvciB0aGUgZnJpZGdlIHdoZW4gcGlja2luZyB1cC4KKyAgZG91YmxlIHBpY2t1cF95OworICAvLyBIZWlnaHQgdG8gbW92ZSB0aGUgZWxldmF0b3IgdG8gdG8gbGlmdCB0aGUgY2FuIG91dCBvZiB0aGUgY2xhdy4KKyAgZG91YmxlIGxpZnRfaGVpZ2h0OworICAvLyBIZWlnaHQgdG8gdXNlIHdoZW4gbGlmdGluZyBiZWZvcmUgbW92aW5nIGl0IGJhY2suCisgIGRvdWJsZSBwaWNrdXBfZ29hbF9iZWZvcmVfbW92ZV9oZWlnaHQ7CisgIC8vIFRoZSBoZWlnaHQgYXQgd2hpY2ggdG8gc3RhcnQgcHVsbGluZyBiYWNrLgorICBkb3VibGUgYmVmb3JlX3BsYWNlX2hlaWdodDsKKworICAvLyBYIGF0IHdoaWNoIHRvIHN0YXJ0IGxvd2VyaW5nIHRoZSBjYW4uCisgIGRvdWJsZSBzdGFydF9sb3dlcmluZ194OworICAvLyBFbmQgcG9zaXRpb24gd2l0aCB0aGUgY2FuLgorICBkb3VibGUgZW5kX2hlaWdodDsKKyAgZG91YmxlIGVuZF9hbmdsZTsKK307CisKK3F1ZXVlX2dyb3VwIENhblBpY2t1cEFjdGlvblF1ZXVlR3JvdXAgeworICBpbXBsZW1lbnRzIGFvcy5jb21tb24uYWN0aW9ucy5BY3Rpb25RdWV1ZUdyb3VwOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgdWludDMyX3QgcnVuOworICAgIENhblBpY2t1cFBhcmFtcyBwYXJhbXM7CisgIH07CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBhb3MuY29tbW9uLmFjdGlvbnMuU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIENhblBpY2t1cEFjdGlvblF1ZXVlR3JvdXAgY2FuX3BpY2t1cF9hY3Rpb247CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvY2FuX3BpY2t1cF9hY3Rvci5jYyBiL3kyMDE1L2FjdG9ycy9jYW5fcGlja3VwX2FjdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTE5MWYKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvY2FuX3BpY2t1cF9hY3Rvci5jYwpAQCAtMCwwICsxLDEyMiBAQAorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5oIgorCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2Nhbl9waWNrdXBfYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisKK3VzaW5nIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWU7CisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CituYW1lc3BhY2UgeworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0hvcml6b250YWxNb3ZlezEuMSwgMS44fTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtWZXJ0aWNhbE1vdmV7MC4zLCAyLjB9OworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0Zhc3RIb3Jpem9udGFsTW92ZXsxLjI1LCA1LjB9OworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0Zhc3RWZXJ0aWNhbE1vdmV7MC40MCwgMi4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtQdXJlVmVydGljYWxNb3ZlezEuMjAsIDUuMH07Cit9ICAvLyBuYW1lc3BhY2UKKworQ2FuUGlja3VwQWN0b3I6OkNhblBpY2t1cEFjdG9yKENhblBpY2t1cEFjdGlvblF1ZXVlR3JvdXAgKnF1ZXVlcykKKyAgICA6IEZyaWRnZUFjdG9yQmFzZTxDYW5QaWNrdXBBY3Rpb25RdWV1ZUdyb3VwPihxdWV1ZXMpIHt9CisKK2RvdWJsZSBDYW5QaWNrdXBBY3Rvcjo6Q3VycmVudEdvYWxYKCkgeworICBmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIGlmICghZnJpZGdlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgIExPRyhFUlJPUiwgIlJlYWRpbmcgZnJvbSBmcmlkZ2Ugc3RhdHVzIHF1ZXVlIGZhaWxlZC5cbiIpOworICAgIHJldHVybiAwLjA7CisgIH0KKworICByZXR1cm4gZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF94OworfQorCitkb3VibGUgQ2FuUGlja3VwQWN0b3I6OkN1cnJlbnRHb2FsSGVpZ2h0KCkgeworICBmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIGlmICghZnJpZGdlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgIExPRyhFUlJPUiwgIlJlYWRpbmcgZnJvbSBmcmlkZ2Ugc3RhdHVzIHF1ZXVlIGZhaWxlZC5cbiIpOworICAgIHJldHVybiAwLjA7CisgIH0KKworICByZXR1cm4gZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF95OworfQorCitib29sIENhblBpY2t1cEFjdG9yOjpSdW5BY3Rpb24oY29uc3QgQ2FuUGlja3VwUGFyYW1zICZwYXJhbXMpIHsKKyAgLy8gTWFrZSBzdXJlIHRoZSBjbGF3IGlzIGRvd24uCisgIHsKKyAgICBhdXRvIG1lc3NhZ2UgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBtZXNzYWdlLT5hbmdsZSA9IDAuMDsKKyAgICBtZXNzYWdlLT5hbmd1bGFyX3ZlbG9jaXR5ID0gMC4wOworICAgIG1lc3NhZ2UtPmludGFrZSA9IDAuMDsKKyAgICBtZXNzYWdlLT5yb2xsZXJzX2Nsb3NlZCA9IHRydWU7CisgICAgbWVzc2FnZS0+bWF4X3ZlbG9jaXR5ID0gNi4wOworICAgIG1lc3NhZ2UtPm1heF9hY2NlbGVyYXRpb24gPSAxMC4wOworCisgICAgTE9HX1NUUlVDVChERUJVRywgIlNlbmRpbmcgY2xhdyBkb3duIGdvYWwiLCAqbWVzc2FnZSk7CisgICAgbWVzc2FnZS5TZW5kKCk7CisgIH0KKworICAvLyBHbyBhcm91bmQgdGhlIGNhbi4KKyAgRG9GcmlkZ2VYWVByb2ZpbGUocGFyYW1zLnBpY2t1cF94LCBwYXJhbXMucGlja3VwX3ksIGtGYXN0SG9yaXpvbnRhbE1vdmUsCisgICAgICAgICAgICAgICAgICAgIGtGYXN0VmVydGljYWxNb3ZlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworCisgIGlmICghU3RhcnRGcmlkZ2VYWVByb2ZpbGUoCisgICAgICAgICAgcGFyYW1zLnBpY2t1cF94LCBwYXJhbXMucGlja3VwX2dvYWxfYmVmb3JlX21vdmVfaGVpZ2h0LAorICAgICAgICAgIGtIb3Jpem9udGFsTW92ZSwga1B1cmVWZXJ0aWNhbE1vdmUsIHRydWUsIHRydWUsIHRydWUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHsKKyAgICBhdXRvIG1lc3NhZ2UgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBtZXNzYWdlLT5hbmdsZSA9IDAuMDsKKyAgICBtZXNzYWdlLT5hbmd1bGFyX3ZlbG9jaXR5ID0gMC4wOworICAgIG1lc3NhZ2UtPmludGFrZSA9IDAuMDsKKyAgICBtZXNzYWdlLT5yb2xsZXJzX2Nsb3NlZCA9IGZhbHNlOworICAgIG1lc3NhZ2UtPm1heF92ZWxvY2l0eSA9IDYuMDsKKyAgICBtZXNzYWdlLT5tYXhfYWNjZWxlcmF0aW9uID0gMTAuMDsKKworICAgIExPR19TVFJVQ1QoREVCVUcsICJTZW5kaW5nIGNsYXcgZG93biBnb2FsIiwgKm1lc3NhZ2UpOworICAgIG1lc3NhZ2UuU2VuZCgpOworICB9CisKKyAgYm9vbCBhYm92ZV9jbGF3ID0gZmFsc2U7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKEN1cnJlbnRHb2FsSGVpZ2h0KCkgPiBwYXJhbXMubGlmdF9oZWlnaHQgJiYgIWFib3ZlX2NsYXcpIHsKKyAgICAgIGlmICghU3RhcnRGcmlkZ2VYWVByb2ZpbGUoMC4wLCBwYXJhbXMuYmVmb3JlX3BsYWNlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0hvcml6b250YWxNb3ZlLCBrVmVydGljYWxNb3ZlLCB0cnVlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBhYm92ZV9jbGF3ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKEN1cnJlbnRHb2FsWCgpIDwgcGFyYW1zLnN0YXJ0X2xvd2VyaW5nX3gpIHsKKyAgICAgIC8vIEdldHRpbmcgY2xvc2UsIHN0YXJ0IGxvd2VyaW5nLgorICAgICAgTE9HKERFQlVHLCAiU3RhcnRpbmcgdG8gbG93ZXIgdGhlIGNhbiBvbnRvIHRoZSB0cmF5LlxuIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgUHJvZmlsZVN0YXR1cyBzdGF0dXMgPQorICAgICAgICBJdGVyYXRlWFlQcm9maWxlKDAuMCwgcGFyYW1zLmJlZm9yZV9wbGFjZV9oZWlnaHQsIGtIb3Jpem9udGFsTW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrVmVydGljYWxNb3ZlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICBpZiAoc3RhdHVzID09IERPTkUgfHwgc3RhdHVzID09IENBTkNFTEVEKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBMb3dlciBpdC4KKyAgRG9GcmlkZ2VYWVByb2ZpbGUoMC4wLCBwYXJhbXMuZW5kX2hlaWdodCwga0hvcml6b250YWxNb3ZlLCBrUHVyZVZlcnRpY2FsTW92ZSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKzo6c3RkOjp1bmlxdWVfcHRyPENhblBpY2t1cEFjdGlvbj4gTWFrZUNhblBpY2t1cEFjdGlvbigKKyAgICBjb25zdCBDYW5QaWNrdXBQYXJhbXMgJnBhcmFtcykgeworICByZXR1cm4gOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FuUGlja3VwQWN0aW9uPigKKyAgICAgIG5ldyBDYW5QaWNrdXBBY3Rpb24oJjo6ZnJjOTcxOjphY3RvcnM6OmNhbl9waWNrdXBfYWN0aW9uLCBwYXJhbXMpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFjdG9ycworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL2Nhbl9waWNrdXBfYWN0b3IuaCBiL3kyMDE1L2FjdG9ycy9jYW5fcGlja3VwX2FjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiMWVjOQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9jYW5fcGlja3VwX2FjdG9yLmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBZMjAxNV9BQ1RPUlNfQ0FOX1BJQ0tVUF9BQ1RPUl9IXworI2RlZmluZSBZMjAxNV9BQ1RPUlNfQ0FOX1BJQ0tVUF9BQ1RPUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9jYW5fcGlja3VwX2FjdGlvbi5xLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2ZyaWRnZV9wcm9maWxlX2xpYi5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBhY3RvcnMgeworCitjbGFzcyBDYW5QaWNrdXBBY3RvciA6IHB1YmxpYyBGcmlkZ2VBY3RvckJhc2U8Q2FuUGlja3VwQWN0aW9uUXVldWVHcm91cD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ2FuUGlja3VwQWN0b3IoQ2FuUGlja3VwQWN0aW9uUXVldWVHcm91cCAqcXVldWVzKTsKKworICBib29sIFJ1bkFjdGlvbihjb25zdCBDYW5QaWNrdXBQYXJhbXMgJnBhcmFtcykgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBkb3VibGUgQ3VycmVudEdvYWxIZWlnaHQoKTsKKyAgZG91YmxlIEN1cnJlbnRHb2FsWCgpOworfTsKKwordHlwZWRlZiBhb3M6OmNvbW1vbjo6YWN0aW9uczo6VHlwZWRBY3Rpb248Q2FuUGlja3VwQWN0aW9uUXVldWVHcm91cD4KKyAgICBDYW5QaWNrdXBBY3Rpb247CisKKy8vIE1ha2VzIGEgbmV3IENhblBpY2t1cEFjdG9yIGFjdGlvbi4KKzo6c3RkOjp1bmlxdWVfcHRyPENhblBpY2t1cEFjdGlvbj4gTWFrZUNhblBpY2t1cEFjdGlvbigKKyAgICBjb25zdCBDYW5QaWNrdXBQYXJhbXMgJnBhcmFtcyk7CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmCmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvY2FuX3BpY2t1cF9hY3Rvcl9tYWluLmNjIGIveTIwMTUvYWN0b3JzL2Nhbl9waWNrdXBfYWN0b3JfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWQ5NDEyCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL2Nhbl9waWNrdXBfYWN0b3JfbWFpbi5jYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvY2FuX3BpY2t1cF9hY3Rpb24ucS5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9jYW5fcGlja3VwX2FjdG9yLmgiCisKK2ludCBtYWluKGludCAvKmFyZ2MqLywgY2hhciogLyphcmd2Ki8gW10pIHsKKyAgOjphb3M6OkluaXQoKTsKKworICA6OmZyYzk3MTo6YWN0b3JzOjpDYW5QaWNrdXBBY3RvciBjYW5fcGlja3VwKCY6OmZyYzk3MTo6YWN0b3JzOjpjYW5fcGlja3VwX2FjdGlvbik7CisgIGNhbl9waWNrdXAuUnVuKCk7CisKKyAgOjphb3M6OkNsZWFudXAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rpb24ucSBiL3kyMDE1L2FjdG9ycy9kcml2ZXRyYWluX2FjdGlvbi5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDU1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rpb24ucQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIGZyYzk3MS5hY3RvcnM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMucSI7CisKKy8vIFBhcmFtZXRlcnMgdG8gc2VuZCB3aXRoIHN0YXJ0Lgorc3RydWN0IERyaXZldHJhaW5BY3Rpb25QYXJhbXMgeworICBkb3VibGUgbGVmdF9pbml0aWFsX3Bvc2l0aW9uOworICBkb3VibGUgcmlnaHRfaW5pdGlhbF9wb3NpdGlvbjsKKyAgZG91YmxlIHlfb2Zmc2V0OworICBkb3VibGUgdGhldGFfb2Zmc2V0OworICBkb3VibGUgbWF4aW11bV92ZWxvY2l0eTsKKyAgZG91YmxlIG1heGltdW1fYWNjZWxlcmF0aW9uOworICBkb3VibGUgbWF4aW11bV90dXJuX3ZlbG9jaXR5OworICBkb3VibGUgbWF4aW11bV90dXJuX2FjY2VsZXJhdGlvbjsKK307CisKK3F1ZXVlX2dyb3VwIERyaXZldHJhaW5BY3Rpb25RdWV1ZUdyb3VwIHsKKyAgaW1wbGVtZW50cyBhb3MuY29tbW9uLmFjdGlvbnMuQWN0aW9uUXVldWVHcm91cDsKKworICBtZXNzYWdlIEdvYWwgeworICAgIHVpbnQzMl90IHJ1bjsKKyAgICBEcml2ZXRyYWluQWN0aW9uUGFyYW1zIHBhcmFtczsKKyAgfTsKKworICBxdWV1ZSBHb2FsIGdvYWw7CisgIHF1ZXVlIGFvcy5jb21tb24uYWN0aW9ucy5TdGF0dXMgc3RhdHVzOworfTsKKworcXVldWVfZ3JvdXAgRHJpdmV0cmFpbkFjdGlvblF1ZXVlR3JvdXAgZHJpdmV0cmFpbl9hY3Rpb247CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5jYyBiL3kyMDE1L2FjdG9ycy9kcml2ZXRyYWluX2FjdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjgxYzUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5jYwpAQCAtMCwwICsxLDE2OCBAQAorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9kcml2ZXRyYWluX2FjdG9yLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKworI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3RyYXBlem9pZF9wcm9maWxlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb21tb25tYXRoLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworRHJpdmV0cmFpbkFjdG9yOjpEcml2ZXRyYWluQWN0b3IoYWN0b3JzOjpEcml2ZXRyYWluQWN0aW9uUXVldWVHcm91cCogcykKKyAgICA6IGFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3RvckJhc2U8YWN0b3JzOjpEcml2ZXRyYWluQWN0aW9uUXVldWVHcm91cD4ocykge30KKworYm9vbCBEcml2ZXRyYWluQWN0b3I6OlJ1bkFjdGlvbihjb25zdCBhY3RvcnM6OkRyaXZldHJhaW5BY3Rpb25QYXJhbXMgJnBhcmFtcykgeworICBzdGF0aWMgY29uc3QgYXV0byBLID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5tYWtlX2RyaXZldHJhaW5fbG9vcCgpLksoKTsKKworICBjb25zdCBkb3VibGUgeW9mZnNldCA9IHBhcmFtcy55X29mZnNldDsKKyAgY29uc3QgZG91YmxlIHR1cm5fb2Zmc2V0ID0KKyAgICAgIHBhcmFtcy50aGV0YV9vZmZzZXQgKiBjb25zdGFudHM6OkdldFZhbHVlcygpLnR1cm5fd2lkdGggLyAyLjA7CisgIExPRyhJTkZPLCAiR29pbmcgdG8gbW92ZSAlZiBhbmQgdHVybiAlZlxuIiwgeW9mZnNldCwgdHVybl9vZmZzZXQpOworCisgIC8vIE1lYXN1cmVkIGNvbnZlcnNpb24gdG8gZ2V0IHRoZSBkaXN0YW5jZSByaWdodC4KKyAgOjphb3M6OnV0aWw6OlRyYXBlem9pZFByb2ZpbGUgcHJvZmlsZSg6OmFvczo6dGltZTo6VGltZTo6SW5NUyg1KSk7CisgIDo6YW9zOjp1dGlsOjpUcmFwZXpvaWRQcm9maWxlIHR1cm5fcHJvZmlsZSg6OmFvczo6dGltZTo6VGltZTo6SW5NUyg1KSk7CisgIGNvbnN0IGRvdWJsZSBnb2FsX3ZlbG9jaXR5ID0gMC4wOworICBjb25zdCBkb3VibGUgZXBzaWxvbiA9IDAuMDE7CisgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGxlZnRfZ29hbF9zdGF0ZSwgcmlnaHRfZ29hbF9zdGF0ZTsKKworICBwcm9maWxlLnNldF9tYXhpbXVtX2FjY2VsZXJhdGlvbihwYXJhbXMubWF4aW11bV9hY2NlbGVyYXRpb24pOworICBwcm9maWxlLnNldF9tYXhpbXVtX3ZlbG9jaXR5KHBhcmFtcy5tYXhpbXVtX3ZlbG9jaXR5KTsKKyAgdHVybl9wcm9maWxlLnNldF9tYXhpbXVtX2FjY2VsZXJhdGlvbihwYXJhbXMubWF4aW11bV90dXJuX2FjY2VsZXJhdGlvbiAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS50dXJuX3dpZHRoIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjApOworICB0dXJuX3Byb2ZpbGUuc2V0X21heGltdW1fdmVsb2NpdHkocGFyYW1zLm1heGltdW1fdHVybl92ZWxvY2l0eSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLnR1cm5fd2lkdGggLyAyLjApOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgOjphb3M6OnRpbWU6OlBoYXNlZExvb3BYTVMoNSwgMjUwMCk7CisKKyAgICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICAgIGlmIChjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgICAgY29uc3QgYXV0byYgc3RhdHVzID0gKmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzOworICAgICAgaWYgKDo6c3RkOjphYnMoc3RhdHVzLnVuY2FwcGVkX2xlZnRfdm9sdGFnZSAtCisgICAgICAgICAgICAgICAgICAgICBzdGF0dXMudW5jYXBwZWRfcmlnaHRfdm9sdGFnZSkgPiAyNCkgeworICAgICAgICBMT0coREVCVUcsICJzcGlubmluZyBpbiBwbGFjZVxuIik7CisgICAgICAgIC8vIFRoZXkncmUgbW9yZSB0aGFuIDI0ViBhcGFydCwgc28gc3RvcCBtb3ZpbmcgZm9yd2FyZHMgYW5kIGxldCBpdCBkZWFsCisgICAgICAgIC8vIHdpdGggc3Bpbm5pbmcgZmlyc3QuCisgICAgICAgIHByb2ZpbGUuU2V0R29hbCgKKyAgICAgICAgICAgIChzdGF0dXMuZmlsdGVyZWRfbGVmdF9wb3NpdGlvbiArIHN0YXR1cy5maWx0ZXJlZF9yaWdodF9wb3NpdGlvbiAtCisgICAgICAgICAgICAgcGFyYW1zLmxlZnRfaW5pdGlhbF9wb3NpdGlvbiAtIHBhcmFtcy5yaWdodF9pbml0aWFsX3Bvc2l0aW9uKSAvCisgICAgICAgICAgICAyLjApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBkaXZpc29yID0gSygwLCAwKSArIEsoMCwgMik7CisgICAgICAgIGRvdWJsZSBkeF9sZWZ0LCBkeF9yaWdodDsKKyAgICAgICAgaWYgKHN0YXR1cy51bmNhcHBlZF9sZWZ0X3ZvbHRhZ2UgPiAxMi4wKSB7CisgICAgICAgICAgZHhfbGVmdCA9IChzdGF0dXMudW5jYXBwZWRfbGVmdF92b2x0YWdlIC0gMTIuMCkgLyBkaXZpc29yOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cy51bmNhcHBlZF9sZWZ0X3ZvbHRhZ2UgPCAtMTIuMCkgeworICAgICAgICAgIGR4X2xlZnQgPSAoc3RhdHVzLnVuY2FwcGVkX2xlZnRfdm9sdGFnZSArIDEyLjApIC8gZGl2aXNvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkeF9sZWZ0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzLnVuY2FwcGVkX3JpZ2h0X3ZvbHRhZ2UgPiAxMi4wKSB7CisgICAgICAgICAgZHhfcmlnaHQgPSAoc3RhdHVzLnVuY2FwcGVkX3JpZ2h0X3ZvbHRhZ2UgLSAxMi4wKSAvIGRpdmlzb3I7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLnVuY2FwcGVkX3JpZ2h0X3ZvbHRhZ2UgPCAtMTIuMCkgeworICAgICAgICAgIGR4X3JpZ2h0ID0gKHN0YXR1cy51bmNhcHBlZF9yaWdodF92b2x0YWdlICsgMTIuMCkgLyBkaXZpc29yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGR4X3JpZ2h0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgZHg7CisgICAgICAgIGlmIChkeF9sZWZ0ID09IDAgJiYgZHhfcmlnaHQgPT0gMCkgeworICAgICAgICAgIGR4ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChkeF9sZWZ0ICE9IDAgJiYgZHhfcmlnaHQgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgIDo6YW9zOjpzaWduKGR4X2xlZnQpICE9IDo6YW9zOjpzaWduKGR4X3JpZ2h0KSkgeworICAgICAgICAgIC8vIEJvdGggc2F0dXJhdGluZyBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zLiBEb24ndCBkbyBhbnl0aGluZy4KKyAgICAgICAgICBMT0coREVCVUcsICJTYXR1cmF0aW5nIG9wcG9zaXRlIHdheXMsIG5vdCBhZGp1c3RpbmdcbiIpOworICAgICAgICAgIGR4ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICg6OnN0ZDo6YWJzKGR4X2xlZnQpID4gOjpzdGQ6OmFicyhkeF9yaWdodCkpIHsKKyAgICAgICAgICBkeCA9IGR4X2xlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZHggPSBkeF9yaWdodDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHggIT0gMCkgeworICAgICAgICAgIExPRyhERUJVRywgImFkanVzdGluZyBnb2FsIGJ5ICVmXG4iLCBkeCk7CisgICAgICAgICAgcHJvZmlsZS5Nb3ZlR29hbCgtZHgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIHdlIGV2ZXIgZ2V0IGhlcmUsIHRoYXQncyBiYWQgYW5kIHdlIHNob3VsZCBqdXN0IGdpdmUgdXAKKyAgICAgIExPRyhFUlJPUiwgIm5vIGRyaXZldHJhaW4gc3RhdHVzIVxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgYXV0byBkcml2ZV9wcm9maWxlX2dvYWxfc3RhdGUgPQorICAgICAgICBwcm9maWxlLlVwZGF0ZSh5b2Zmc2V0LCBnb2FsX3ZlbG9jaXR5KTsKKyAgICBjb25zdCBhdXRvIHR1cm5fcHJvZmlsZV9nb2FsX3N0YXRlID0gdHVybl9wcm9maWxlLlVwZGF0ZSh0dXJuX29mZnNldCwgMC4wKTsKKyAgICBsZWZ0X2dvYWxfc3RhdGUgPSBkcml2ZV9wcm9maWxlX2dvYWxfc3RhdGUgLSB0dXJuX3Byb2ZpbGVfZ29hbF9zdGF0ZTsKKyAgICByaWdodF9nb2FsX3N0YXRlID0gZHJpdmVfcHJvZmlsZV9nb2FsX3N0YXRlICsgdHVybl9wcm9maWxlX2dvYWxfc3RhdGU7CisKKyAgICBpZiAoOjpzdGQ6OmFicyhkcml2ZV9wcm9maWxlX2dvYWxfc3RhdGUoMCwgMCkgLSB5b2Zmc2V0KSA8IGVwc2lsb24gJiYKKyAgICAgICAgOjpzdGQ6OmFicyh0dXJuX3Byb2ZpbGVfZ29hbF9zdGF0ZSgwLCAwKSAtIHR1cm5fb2Zmc2V0KSA8IGVwc2lsb24pIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisKKyAgICBMT0coREVCVUcsICJEcml2aW5nIGxlZnQgdG8gJWYsIHJpZ2h0IHRvICVmXG4iLAorICAgICAgICBsZWZ0X2dvYWxfc3RhdGUoMCwgMCkgKyBwYXJhbXMubGVmdF9pbml0aWFsX3Bvc2l0aW9uLAorICAgICAgICByaWdodF9nb2FsX3N0YXRlKDAsIDApICsgcGFyYW1zLnJpZ2h0X2luaXRpYWxfcG9zaXRpb24pOworICAgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAuY29udHJvbF9sb29wX2RyaXZpbmcodHJ1ZSkKKyAgICAgICAgLy8uaGlnaGdlYXIoZmFsc2UpCisgICAgICAgIC5sZWZ0X2dvYWwobGVmdF9nb2FsX3N0YXRlKDAsIDApICsgcGFyYW1zLmxlZnRfaW5pdGlhbF9wb3NpdGlvbikKKyAgICAgICAgLnJpZ2h0X2dvYWwocmlnaHRfZ29hbF9zdGF0ZSgwLCAwKSArIHBhcmFtcy5yaWdodF9pbml0aWFsX3Bvc2l0aW9uKQorICAgICAgICAubGVmdF92ZWxvY2l0eV9nb2FsKGxlZnRfZ29hbF9zdGF0ZSgxLCAwKSkKKyAgICAgICAgLnJpZ2h0X3ZlbG9jaXR5X2dvYWwocmlnaHRfZ29hbF9zdGF0ZSgxLCAwKSkKKyAgICAgICAgLlNlbmQoKTsKKyAgfQorICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICB3aGlsZSAoIWNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLmdldCgpKSB7CisgICAgTE9HKFdBUk5JTkcsCisgICAgICAgICJObyBwcmV2aW91cyBkcml2ZXRyYWluIHN0YXR1cyBwYWNrZXQsIHRyeWluZyB0byBmZXRjaCBhZ2FpblxuIik7CisgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworICB9CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBjb25zdCBkb3VibGUga1Bvc2l0aW9uVGhyZXNob2xkID0gMC4wNTsKKworICAgIGNvbnN0IGRvdWJsZSBsZWZ0X2Vycm9yID0gOjpzdGQ6OmFicygKKyAgICAgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMtPmZpbHRlcmVkX2xlZnRfcG9zaXRpb24gLQorICAgICAgICAobGVmdF9nb2FsX3N0YXRlKDAsIDApICsgcGFyYW1zLmxlZnRfaW5pdGlhbF9wb3NpdGlvbikpOworICAgIGNvbnN0IGRvdWJsZSByaWdodF9lcnJvciA9IDo6c3RkOjphYnMoCisgICAgICAgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLT5maWx0ZXJlZF9yaWdodF9wb3NpdGlvbiAtCisgICAgICAgIChyaWdodF9nb2FsX3N0YXRlKDAsIDApICsgcGFyYW1zLnJpZ2h0X2luaXRpYWxfcG9zaXRpb24pKTsKKyAgICBjb25zdCBkb3VibGUgdmVsb2NpdHlfZXJyb3IgPQorICAgICAgICA6OnN0ZDo6YWJzKGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLT5yb2JvdF9zcGVlZCk7CisgICAgaWYgKGxlZnRfZXJyb3IgPCBrUG9zaXRpb25UaHJlc2hvbGQgJiYgcmlnaHRfZXJyb3IgPCBrUG9zaXRpb25UaHJlc2hvbGQgJiYKKyAgICAgICAgdmVsb2NpdHlfZXJyb3IgPCAwLjIpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBMT0coREVCVUcsICJEcml2ZXRyYWluIGVycm9yIGlzICVmLCAlZiwgJWZcbiIsIGxlZnRfZXJyb3IsIHJpZ2h0X2Vycm9yLAorICAgICAgICAgIHZlbG9jaXR5X2Vycm9yKTsKKyAgICB9CisgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgfQorICBMT0coSU5GTywgIkRvbmUgbW92aW5nXG4iKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKzo6c3RkOjp1bmlxdWVfcHRyPERyaXZldHJhaW5BY3Rpb24+IE1ha2VEcml2ZXRyYWluQWN0aW9uKAorICAgIGNvbnN0IDo6ZnJjOTcxOjphY3RvcnM6OkRyaXZldHJhaW5BY3Rpb25QYXJhbXMmIHBhcmFtcykgeworICByZXR1cm4gOjpzdGQ6OnVuaXF1ZV9wdHI8RHJpdmV0cmFpbkFjdGlvbj4oCisgICAgICBuZXcgRHJpdmV0cmFpbkFjdGlvbigmOjpmcmM5NzE6OmFjdG9yczo6ZHJpdmV0cmFpbl9hY3Rpb24sIHBhcmFtcykpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5oIGIveTIwMTUvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjljNmVkCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3IuaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIFkyMDE1X0FDVElPTlNfRFJJVkVUUkFJTl9BQ1RJT05fSF8KKyNkZWZpbmUgWTIwMTVfQUNUSU9OU19EUklWRVRSQUlOX0FDVElPTl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2RyaXZldHJhaW5fYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBhY3RvcnMgeworCitjbGFzcyBEcml2ZXRyYWluQWN0b3IKKyAgICA6IHB1YmxpYyBhb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0b3JCYXNlPERyaXZldHJhaW5BY3Rpb25RdWV1ZUdyb3VwPiB7CisgcHVibGljOgorICBleHBsaWNpdCBEcml2ZXRyYWluQWN0b3IoRHJpdmV0cmFpbkFjdGlvblF1ZXVlR3JvdXAqIHMpOworCisgIGJvb2wgUnVuQWN0aW9uKGNvbnN0IGFjdG9yczo6RHJpdmV0cmFpbkFjdGlvblBhcmFtcyAmcGFyYW1zKSBvdmVycmlkZTsKK307CisKK3R5cGVkZWYgYW9zOjpjb21tb246OmFjdGlvbnM6OlR5cGVkQWN0aW9uPERyaXZldHJhaW5BY3Rpb25RdWV1ZUdyb3VwPgorICAgIERyaXZldHJhaW5BY3Rpb247CisKKy8vIE1ha2VzIGEgbmV3IERyaXZldHJhaW5BY3RvciBhY3Rpb24uCis6OnN0ZDo6dW5pcXVlX3B0cjxEcml2ZXRyYWluQWN0aW9uPiBNYWtlRHJpdmV0cmFpbkFjdGlvbigKKyAgICBjb25zdCA6OmZyYzk3MTo6YWN0b3JzOjpEcml2ZXRyYWluQWN0aW9uUGFyYW1zJiBwYXJhbXMpOworCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL2RyaXZldHJhaW5fYWN0b3JfbWFpbi5jYyBiL3kyMDE1L2FjdG9ycy9kcml2ZXRyYWluX2FjdG9yX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0NjFmZgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9kcml2ZXRyYWluX2FjdG9yX21haW4uY2MKQEAgLTAsMCArMSwxOCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2RyaXZldHJhaW5fYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvZHJpdmV0cmFpbl9hY3Rvci5oIgorCit1c2luZyA6OmFvczo6dGltZTo6VGltZTsKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyICogLyphcmd2Ki9bXSkgeworICA6OmFvczo6SW5pdCgpOworCisgIGZyYzk3MTo6YWN0b3JzOjpEcml2ZXRyYWluQWN0b3IgZHJpdmV0cmFpbigKKyAgICAgICY6OmZyYzk3MTo6YWN0b3JzOjpkcml2ZXRyYWluX2FjdGlvbik7CisgIGRyaXZldHJhaW4uUnVuKCk7CisKKyAgOjphb3M6OkNsZWFudXAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvZnJpZGdlX3Byb2ZpbGVfbGliLmNjIGIveTIwMTUvYWN0b3JzL2ZyaWRnZV9wcm9maWxlX2xpYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTE4NjZmCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL2ZyaWRnZV9wcm9maWxlX2xpYi5jYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2ZyaWRnZV9wcm9maWxlX2xpYi5oIgpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL2ZyaWRnZV9wcm9maWxlX2xpYi5oIGIveTIwMTUvYWN0b3JzL2ZyaWRnZV9wcm9maWxlX2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzVmNzUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvZnJpZGdlX3Byb2ZpbGVfbGliLmgKQEAgLTAsMCArMSwyODUgQEAKKyNpZm5kZWYgWTIwMTVfQUNUT1JTX0ZSSURHRV9QUk9GSUxFX0xJQl9IXworI2RlZmluZSBZMjAxNV9BQ1RPUlNfRlJJREdFX1BST0ZJTEVfTElCX0hfCisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rvci5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5xLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CisKK3N0cnVjdCBQcm9maWxlUGFyYW1zIHsKKyAgZG91YmxlIHZlbG9jaXR5OworICBkb3VibGUgYWNjZWxlcmF0aW9uOworfTsKKworLy8gQmFzZSBjbGFzcyB0byBwcm92aWRlIGhlbHBlciB1dGlsaXRpZXMgdG8gYWxsIEFjdG9ycyB3aG8gd2FudCB0byBjb250cm9sIHRoZQorLy8gZnJpZGdlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGcmlkZ2VBY3RvckJhc2UgOiBwdWJsaWMgYW9zOjpjb21tb246OmFjdGlvbnM6OkFjdG9yQmFzZTxUPiB7CisgcHVibGljOgorICBGcmlkZ2VBY3RvckJhc2UoVCAqcXVldWVzKSA6IGFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3RvckJhc2U8VD4ocXVldWVzKSB7fQorCisgcHJvdGVjdGVkOgorICB2b2lkIERvRnJpZGdlUHJvZmlsZShkb3VibGUgaGVpZ2h0LCBkb3VibGUgYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVQYXJhbXMgZWxldmF0b3JfcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVBhcmFtcyBhcm1fcGFyYW1ldGVycywgYm9vbCBncmFiYmVycykgeworICAgIERvRnJpZGdlUHJvZmlsZShoZWlnaHQsIGFuZ2xlLCBlbGV2YXRvcl9wYXJhbWV0ZXJzLCBhcm1fcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgZ3JhYmJlcnMsIGdyYWJiZXJzLCBncmFiYmVycyk7CisgIH0KKworICBib29sIFN0YXJ0RnJpZGdlUHJvZmlsZShkb3VibGUgaGVpZ2h0LCBkb3VibGUgYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVQYXJhbXMgZWxldmF0b3JfcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVBhcmFtcyBhcm1fcGFyYW1ldGVycywgYm9vbCB0b3BfZ3JhYmJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbnRfZ3JhYmJlcnMsIGJvb2wgYmFja19ncmFiYmVycykgeworICAgIGF1dG8gbmV3X2ZyaWRnZV9nb2FsID0gY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPnByb2ZpbGluZ190eXBlID0gMDsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPm1heF92ZWxvY2l0eSA9IGVsZXZhdG9yX3BhcmFtZXRlcnMudmVsb2NpdHk7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfYWNjZWxlcmF0aW9uID0gZWxldmF0b3JfcGFyYW1ldGVycy5hY2NlbGVyYXRpb247CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT52ZWxvY2l0eSA9IDAuMDsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPm1heF9hbmd1bGFyX3ZlbG9jaXR5ID0gYXJtX3BhcmFtZXRlcnMudmVsb2NpdHk7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfYW5ndWxhcl9hY2NlbGVyYXRpb24gPSBhcm1fcGFyYW1ldGVycy5hY2NlbGVyYXRpb247CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5hbmdsZSA9IGFuZ2xlOworICAgIG5ld19mcmlkZ2VfZ29hbC0+YW5ndWxhcl92ZWxvY2l0eSA9IDAuMDsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLnRvcF9mcm9udCA9IHRvcF9ncmFiYmVyczsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLnRvcF9iYWNrID0gdG9wX2dyYWJiZXJzOworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMuYm90dG9tX2Zyb250ID0gZnJvbnRfZ3JhYmJlcnM7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5ncmFiYmVycy5ib3R0b21fYmFjayA9IGJhY2tfZ3JhYmJlcnM7CisgICAgTE9HKElORk8sICJTdGFydGluZyBwcm9maWxlIHRvICVmLCAlZlxuIiwgaGVpZ2h0LCBhbmdsZSk7CisKKyAgICBpZiAoIW5ld19mcmlkZ2VfZ29hbC5TZW5kKCkpIHsKKyAgICAgIExPRyhFUlJPUiwgIkZhaWxlZCB0byBzZW5kIGZyaWRnZSBnb2FsXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBlbnVtIFByb2ZpbGVTdGF0dXMgeyBSVU5OSU5HLCBET05FLCBDQU5DRUxFRCB9OworCisgIFByb2ZpbGVTdGF0dXMgSXRlcmF0ZVByb2ZpbGUoZG91YmxlIGhlaWdodCwgZG91YmxlIGFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVQYXJhbXMgZWxldmF0b3JfcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlUGFyYW1zIGFybV9wYXJhbWV0ZXJzLCBib29sIHRvcF9ncmFiYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb250X2dyYWJiZXJzLCBib29sIGJhY2tfZ3JhYmJlcnMpIHsKKyAgICBpZiAodGhpcy0+U2hvdWxkQ2FuY2VsKCkpIHsKKyAgICAgIExPRyhJTkZPLCAiQ2FuY2VsaW5nIGZyaWRnZSBtb3ZlbWVudFxuIik7CisgICAgICBpZiAoIWNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMuZ2V0KCkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcsICJubyBmcmlkZ2Ugc3RhdHVzIHNvIGNhbid0IHJlYWxseSBjYW5jZWxcbiIpOworICAgICAgICByZXR1cm4gQ0FOQ0VMRUQ7CisgICAgICB9CisKKyAgICAgIGF1dG8gbmV3X2ZyaWRnZV9nb2FsID0gY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICAgIG5ld19mcmlkZ2VfZ29hbC0+cHJvZmlsaW5nX3R5cGUgPSAwOworICAgICAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfdmVsb2NpdHkgPSBlbGV2YXRvcl9wYXJhbWV0ZXJzLnZlbG9jaXR5OworICAgICAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfYWNjZWxlcmF0aW9uID0gZWxldmF0b3JfcGFyYW1ldGVycy5hY2NlbGVyYXRpb247CisgICAgICBuZXdfZnJpZGdlX2dvYWwtPmhlaWdodCA9CisgICAgICAgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+aGVpZ2h0ICsKKyAgICAgICAgICAoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF92ZWxvY2l0eSAqCisgICAgICAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF92ZWxvY2l0eSkpIC8KKyAgICAgICAgICAgICAgKDIuMCAqIG5ld19mcmlkZ2VfZ29hbC0+bWF4X2FjY2VsZXJhdGlvbik7CisgICAgICBoZWlnaHQgPSBuZXdfZnJpZGdlX2dvYWwtPmhlaWdodDsKKyAgICAgIG5ld19mcmlkZ2VfZ29hbC0+dmVsb2NpdHkgPSAwLjA7CisgICAgICBuZXdfZnJpZGdlX2dvYWwtPm1heF9hbmd1bGFyX3ZlbG9jaXR5ID0gYXJtX3BhcmFtZXRlcnMudmVsb2NpdHk7CisgICAgICBuZXdfZnJpZGdlX2dvYWwtPm1heF9hbmd1bGFyX2FjY2VsZXJhdGlvbiA9IGFybV9wYXJhbWV0ZXJzLmFjY2VsZXJhdGlvbjsKKyAgICAgIG5ld19mcmlkZ2VfZ29hbC0+YW5nbGUgPQorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmFuZ2xlICsKKyAgICAgICAgICAoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF9hbmd1bGFyX3ZlbG9jaXR5ICoKKyAgICAgICAgICAgOjpzdGQ6OmFicygKKyAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfYW5ndWxhcl92ZWxvY2l0eSkpIC8KKyAgICAgICAgICAgICAgKDIuMCAqIG5ld19mcmlkZ2VfZ29hbC0+bWF4X2FuZ3VsYXJfYWNjZWxlcmF0aW9uKTsKKyAgICAgIGFuZ2xlID0gbmV3X2ZyaWRnZV9nb2FsLT5hbmdsZTsKKyAgICAgIG5ld19mcmlkZ2VfZ29hbC0+YW5ndWxhcl92ZWxvY2l0eSA9IDAuMDsKKyAgICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMudG9wX2Zyb250ID0gdG9wX2dyYWJiZXJzOworICAgICAgbmV3X2ZyaWRnZV9nb2FsLT5ncmFiYmVycy50b3BfYmFjayA9IHRvcF9ncmFiYmVyczsKKyAgICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMuYm90dG9tX2Zyb250ID0gZnJvbnRfZ3JhYmJlcnM7CisgICAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLmJvdHRvbV9iYWNrID0gYmFja19ncmFiYmVyczsKKworICAgICAgaWYgKCFuZXdfZnJpZGdlX2dvYWwuU2VuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUiwgIkZhaWxlZCB0byBzZW5kIGZyaWRnZSBnb2FsXG4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDQU5DRUxFRDsKKyAgICB9CisgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5GZXRjaEFub3RoZXIoKTsKKworICAgIGNvbnN0ZXhwciBkb3VibGUga1Byb2ZpbGVFcnJvciA9IDFlLTU7CisgICAgY29uc3RleHByIGRvdWJsZSBrQW5nbGVFcHNpbG9uID0gMC4wMiwga0hlaWdodEVwc2lsb24gPSAwLjAxNTsKKworICAgIGlmIChjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5zdGF0ZSAhPSA0KSB7CisgICAgICBMT0coRVJST1IsICJGcmlkZ2Ugbm8gbG9uZ2VyIHJ1bm5pbmcsIGFib3J0aW5nIGFjdGlvblxuIik7CisgICAgICByZXR1cm4gQ0FOQ0VMRUQ7CisgICAgfQorCisgICAgaWYgKDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF9hbmdsZSAtIGFuZ2xlKSA8CisgICAgICAgICAgICBrUHJvZmlsZUVycm9yICYmCisgICAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF9oZWlnaHQgLSBoZWlnaHQpIDwKKyAgICAgICAgICAgIGtQcm9maWxlRXJyb3IgJiYKKyAgICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX2FuZ3VsYXJfdmVsb2NpdHkpIDwKKyAgICAgICAgICAgIGtQcm9maWxlRXJyb3IgJiYKKyAgICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX3ZlbG9jaXR5KSA8CisgICAgICAgICAgICBrUHJvZmlsZUVycm9yKSB7CisgICAgICBMT0coSU5GTywgIlByb2ZpbGUgZG9uZS5cbiIpOworICAgICAgaWYgKDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+YW5nbGUgLSBhbmdsZSkgPAorICAgICAgICAgICAgICAgICAgICAga0FuZ2xlRXBzaWxvbiAmJgorICAgICAgICAgICAgICAgICA6OnN0ZDo6YWJzKGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmhlaWdodCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KSA8IGtIZWlnaHRFcHNpbG9uKSB7CisgICAgICAgIExPRyhJTkZPLCAiTmVhciBnb2FsLCBkb25lLlxuIik7CisgICAgICAgIHJldHVybiBET05FOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBSVU5OSU5HOworICB9CisKKyAgdm9pZCBEb0ZyaWRnZVByb2ZpbGUoZG91YmxlIGhlaWdodCwgZG91YmxlIGFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlUGFyYW1zIGVsZXZhdG9yX3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVQYXJhbXMgYXJtX3BhcmFtZXRlcnMsIGJvb2wgdG9wX2dyYWJiZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb250X2dyYWJiZXJzLCBib29sIGJhY2tfZ3JhYmJlcnMpIHsKKyAgICBpZiAoIVN0YXJ0RnJpZGdlUHJvZmlsZShoZWlnaHQsIGFuZ2xlLCBlbGV2YXRvcl9wYXJhbWV0ZXJzLCBhcm1fcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BfZ3JhYmJlcnMsIGZyb250X2dyYWJiZXJzLCBiYWNrX2dyYWJiZXJzKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBQcm9maWxlU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgSXRlcmF0ZVByb2ZpbGUoaGVpZ2h0LCBhbmdsZSwgZWxldmF0b3JfcGFyYW1ldGVycywgYXJtX3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2dyYWJiZXJzLCBmcm9udF9ncmFiYmVycywgYmFja19ncmFiYmVycyk7CisgICAgICBpZiAoc3RhdHVzID09IERPTkUgfHwgc3RhdHVzID09IENBTkNFTEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIERvRnJpZGdlWFlQcm9maWxlKGRvdWJsZSB4LCBkb3VibGUgeSwgUHJvZmlsZVBhcmFtcyB4X3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVBhcmFtcyB5X3BhcmFtZXRlcnMsIGJvb2wgZ3JhYmJlcnMpIHsKKyAgICBEb0ZyaWRnZVhZUHJvZmlsZSh4LCB5LCB4X3BhcmFtZXRlcnMsIHlfcGFyYW1ldGVycywgZ3JhYmJlcnMsIGdyYWJiZXJzLAorICAgICAgICAgICAgICAgICAgICAgIGdyYWJiZXJzKTsKKyAgfQorCisgIHZvaWQgRG9GcmlkZ2VYWVByb2ZpbGUoZG91YmxlIHgsIGRvdWJsZSB5LCBQcm9maWxlUGFyYW1zIHhfcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlUGFyYW1zIHlfcGFyYW1ldGVycywgYm9vbCB0b3BfZ3JhYmJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9udF9ncmFiYmVycywgYm9vbCBiYWNrX2dyYWJiZXJzKSB7CisgICAgaWYgKCFTdGFydEZyaWRnZVhZUHJvZmlsZSh4LCB5LCB4X3BhcmFtZXRlcnMsIHlfcGFyYW1ldGVycywgdG9wX2dyYWJiZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRfZ3JhYmJlcnMsIGJhY2tfZ3JhYmJlcnMpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFByb2ZpbGVTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICBJdGVyYXRlWFlQcm9maWxlKHgsIHksIHhfcGFyYW1ldGVycywgeV9wYXJhbWV0ZXJzLCB0b3BfZ3JhYmJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udF9ncmFiYmVycywgYmFja19ncmFiYmVycyk7CisgICAgICBpZiAoc3RhdHVzID09IERPTkUgfHwgc3RhdHVzID09IENBTkNFTEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIENhbmNlbFhZTW90aW9uKFByb2ZpbGVQYXJhbXMgeF9wYXJhbWV0ZXJzLCBQcm9maWxlUGFyYW1zIHlfcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIHRvcF9ncmFiYmVycywgYm9vbCBmcm9udF9ncmFiYmVycywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJhY2tfZ3JhYmJlcnMpIHsKKyAgICBMT0coSU5GTywgIkNhbmNlbGluZyBmcmlkZ2UgbW92ZW1lbnRcbiIpOworICAgIGlmICghY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgICAgTE9HKFdBUk5JTkcsICJubyBmcmlkZ2Ugc3RhdHVzIHNvIGNhbid0IHJlYWxseSBjYW5jZWxcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gbmV3X2ZyaWRnZV9nb2FsID0gY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPnByb2ZpbGluZ190eXBlID0gMTsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPm1heF94X3ZlbG9jaXR5ID0geF9wYXJhbWV0ZXJzLnZlbG9jaXR5OworICAgIG5ld19mcmlkZ2VfZ29hbC0+bWF4X3hfYWNjZWxlcmF0aW9uID0geF9wYXJhbWV0ZXJzLmFjY2VsZXJhdGlvbjsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPnggPQorICAgICAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT54ICsKKyAgICAgICAgKGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfeF92ZWxvY2l0eSAqCisgICAgICAgICA6OnN0ZDo6YWJzKGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfeF92ZWxvY2l0eSkpIC8KKyAgICAgICAgICAgICgyLjAgKiBuZXdfZnJpZGdlX2dvYWwtPm1heF94X2FjY2VsZXJhdGlvbik7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT54X3ZlbG9jaXR5ID0gMC4wOworCisgICAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfeV92ZWxvY2l0eSA9IHlfcGFyYW1ldGVycy52ZWxvY2l0eTsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPm1heF95X2FjY2VsZXJhdGlvbiA9IHlfcGFyYW1ldGVycy5hY2NlbGVyYXRpb247CisgICAgbmV3X2ZyaWRnZV9nb2FsLT55ID0KKyAgICAgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+eSArCisgICAgICAgIChjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX3lfdmVsb2NpdHkgKgorICAgICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX3lfdmVsb2NpdHkpKSAvCisgICAgICAgICAgICAoMi4wICogbmV3X2ZyaWRnZV9nb2FsLT5tYXhfeV9hY2NlbGVyYXRpb24pOworICAgIG5ld19mcmlkZ2VfZ29hbC0+eV92ZWxvY2l0eSA9IDAuMDsKKworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMudG9wX2Zyb250ID0gdG9wX2dyYWJiZXJzOworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMudG9wX2JhY2sgPSB0b3BfZ3JhYmJlcnM7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5ncmFiYmVycy5ib3R0b21fZnJvbnQgPSBmcm9udF9ncmFiYmVyczsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLmJvdHRvbV9iYWNrID0gYmFja19ncmFiYmVyczsKKworICAgIGlmICghbmV3X2ZyaWRnZV9nb2FsLlNlbmQoKSkgeworICAgICAgTE9HKEVSUk9SLCAiRmFpbGVkIHRvIHNlbmQgZnJpZGdlIGdvYWxcbiIpOworICAgIH0KKyAgfQorCisgIFByb2ZpbGVTdGF0dXMgSXRlcmF0ZVhZUHJvZmlsZShkb3VibGUgeCwgZG91YmxlIHksIFByb2ZpbGVQYXJhbXMgeF9wYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVBhcmFtcyB5X3BhcmFtZXRlcnMsIGJvb2wgdG9wX2dyYWJiZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9udF9ncmFiYmVycywgYm9vbCBiYWNrX2dyYWJiZXJzKSB7CisgICAgaWYgKHRoaXMtPlNob3VsZENhbmNlbCgpKSB7CisgICAgICBDYW5jZWxYWU1vdGlvbih4X3BhcmFtZXRlcnMsIHlfcGFyYW1ldGVycywgdG9wX2dyYWJiZXJzLCBmcm9udF9ncmFiYmVycywKKyAgICAgICAgICAgICAgICAgICAgIGJhY2tfZ3JhYmJlcnMpOworICAgICAgcmV0dXJuIENBTkNFTEVEOworICAgIH0KKyAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworCisgICAgY29uc3RleHByIGRvdWJsZSBrUHJvZmlsZUVycm9yID0gMWUtNTsKKyAgICBjb25zdGV4cHIgZG91YmxlIGtYRXBzaWxvbiA9IDAuMDIsIGtZRXBzaWxvbiA9IDAuMDI7CisKKyAgICBpZiAoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+c3RhdGUgIT0gNCkgeworICAgICAgTE9HKEVSUk9SLCAiRnJpZGdlIG5vIGxvbmdlciBydW5uaW5nLCBhYm9ydGluZyBhY3Rpb25cbiIpOworICAgICAgcmV0dXJuIENBTkNFTEVEOworICAgIH0KKworICAgIGlmICg6OnN0ZDo6YWJzKGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfeCAtIHgpIDwKKyAgICAgICAgICAgIGtQcm9maWxlRXJyb3IgJiYKKyAgICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX3kgLSB5KSA8CisgICAgICAgICAgICBrUHJvZmlsZUVycm9yICYmCisgICAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF94X3ZlbG9jaXR5KSA8CisgICAgICAgICAgICBrUHJvZmlsZUVycm9yICYmCisgICAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF95X3ZlbG9jaXR5KSA8CisgICAgICAgICAgICBrUHJvZmlsZUVycm9yKSB7CisgICAgICBMT0coSU5GTywgIlByb2ZpbGUgZG9uZS5cbiIpOworICAgICAgaWYgKDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+eCAtIHgpIDwga1hFcHNpbG9uICYmCisgICAgICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT55IC0geSkgPCBrWUVwc2lsb24pIHsKKyAgICAgICAgTE9HKElORk8sICJOZWFyIGdvYWwsIGRvbmUuXG4iKTsKKyAgICAgICAgcmV0dXJuIERPTkU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFJVTk5JTkc7CisgIH0KKworICBib29sIFN0YXJ0RnJpZGdlWFlQcm9maWxlKGRvdWJsZSB4LCBkb3VibGUgeSwgUHJvZmlsZVBhcmFtcyB4X3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVBhcmFtcyB5X3BhcmFtZXRlcnMsIGJvb2wgdG9wX2dyYWJiZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbnRfZ3JhYmJlcnMsIGJvb2wgYmFja19ncmFiYmVycykgeworICAgIGF1dG8gbmV3X2ZyaWRnZV9nb2FsID0gY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPnByb2ZpbGluZ190eXBlID0gMTsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPm1heF94X3ZlbG9jaXR5ID0geF9wYXJhbWV0ZXJzLnZlbG9jaXR5OworICAgIG5ld19mcmlkZ2VfZ29hbC0+bWF4X3hfYWNjZWxlcmF0aW9uID0geF9wYXJhbWV0ZXJzLmFjY2VsZXJhdGlvbjsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPnggPSB4OworICAgIG5ld19mcmlkZ2VfZ29hbC0+eF92ZWxvY2l0eSA9IDAuMDsKKworICAgIG5ld19mcmlkZ2VfZ29hbC0+bWF4X3lfdmVsb2NpdHkgPSB5X3BhcmFtZXRlcnMudmVsb2NpdHk7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfeV9hY2NlbGVyYXRpb24gPSB5X3BhcmFtZXRlcnMuYWNjZWxlcmF0aW9uOworICAgIG5ld19mcmlkZ2VfZ29hbC0+eSA9IHk7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT55X3ZlbG9jaXR5ID0gMC4wOworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMudG9wX2Zyb250ID0gdG9wX2dyYWJiZXJzOworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMudG9wX2JhY2sgPSB0b3BfZ3JhYmJlcnM7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5ncmFiYmVycy5ib3R0b21fZnJvbnQgPSBmcm9udF9ncmFiYmVyczsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLmJvdHRvbV9iYWNrID0gYmFja19ncmFiYmVyczsKKyAgICBMT0coSU5GTywgIlN0YXJ0aW5nIHh5IHByb2ZpbGUgdG8gJWYsICVmXG4iLCB4LCB5KTsKKworICAgIGlmICghbmV3X2ZyaWRnZV9nb2FsLlNlbmQoKSkgeworICAgICAgTE9HKEVSUk9SLCAiRmFpbGVkIHRvIHNlbmQgZnJpZGdlIGdvYWxcbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFjdG9ycworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE1X0FDVE9SU19GUklER0VfUFJPRklMRV9MSUJfSF8KZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0aW9uLnEgYi95MjAxNS9hY3RvcnMvaGVsZF90b19saWZ0X2FjdGlvbi5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGQ2ODkKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvaGVsZF90b19saWZ0X2FjdGlvbi5xCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgZnJjOTcxLmFjdG9yczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5xIjsKK2ltcG9ydCAieTIwMTUvYWN0b3JzL2xpZnRfYWN0aW9uX3BhcmFtcy5xIjsKKworLy8gUGFyYW1ldGVycyB0byBzZW5kIHdpdGggc3RhcnQuCitzdHJ1Y3QgSGVsZFRvTGlmdFBhcmFtcyB7CisgIC8vIFRoZSBtYXhpbXVtIGNsYXcgdmFsdWUgdG8gYXZvaWQgY29sbGlzaW9ucy4KKyAgZG91YmxlIGNsYXdfb3V0X2FuZ2xlOworCisgIC8vIFRoZSB2YWx1ZSB0byBtb3ZlIHRoZSBhcm0gZm9yd2FyZHMgdG8gY2xlYXIgdGhlIHN0YWNrIHdoZW4gbG93ZXJpbmcuCisgIGRvdWJsZSBhcm1fY2xlYXJhbmNlOworICAvLyBFbmQgaGVpZ2h0LgorICBkb3VibGUgYm90dG9tX2hlaWdodDsKKyAgLy8gQW1vdW50IHRvIHdhaXQgZm9yIHRoZSBlbGV2YXRvciB0byBzZXR0bGUgYmVmb3JlIGxpZnRpbmcuCisgIGRvdWJsZSBiZWZvcmVfbGlmdF9zZXR0bGVfdGltZTsKKyAgLy8gQW1vdW50IHRvIHdhaXQgdG8gY2xhbXAuCisgIGRvdWJsZSBjbGFtcF9wYXVzZV90aW1lOworCisgIC8vIExpZnQgcGFyYW1ldGVycworICBMaWZ0UGFyYW1zIGxpZnRfcGFyYW1zOworfTsKKworcXVldWVfZ3JvdXAgSGVsZFRvTGlmdEFjdGlvblF1ZXVlR3JvdXAgeworICBpbXBsZW1lbnRzIGFvcy5jb21tb24uYWN0aW9ucy5BY3Rpb25RdWV1ZUdyb3VwOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgdWludDMyX3QgcnVuOworICAgIEhlbGRUb0xpZnRQYXJhbXMgcGFyYW1zOworICB9OworCisgIHF1ZXVlIEdvYWwgZ29hbDsKKyAgcXVldWUgYW9zLmNvbW1vbi5hY3Rpb25zLlN0YXR1cyBzdGF0dXM7Cit9OworCitxdWV1ZV9ncm91cCBIZWxkVG9MaWZ0QWN0aW9uUXVldWVHcm91cCBoZWxkX3RvX2xpZnRfYWN0aW9uOwpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL2hlbGRfdG9fbGlmdF9hY3Rvci5jYyBiL3kyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzNjM2NAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0b3IuY2MKQEAgLTAsMCArMSwxMTQgQEAKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvaGVsZF90b19saWZ0X2FjdG9yLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvZnJpZGdlX3Byb2ZpbGVfbGliLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2xpZnRfYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CituYW1lc3BhY2UgeworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0FybU1vdmV7MC42LCAyLjB9OworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0Zhc3RBcm1Nb3ZlezEuMiwgNC4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtFbGV2YXRvck1vdmV7MC45LCAzLjB9OworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0Zhc3RFbGV2YXRvck1vdmV7MS4yLCA1LjB9OworfSAgLy8gbmFtZXNwYWNlCisKK0hlbGRUb0xpZnRBY3Rvcjo6SGVsZFRvTGlmdEFjdG9yKEhlbGRUb0xpZnRBY3Rpb25RdWV1ZUdyb3VwICpxdWV1ZXMpCisgICAgOiBGcmlkZ2VBY3RvckJhc2U8SGVsZFRvTGlmdEFjdGlvblF1ZXVlR3JvdXA+KHF1ZXVlcykge30KKworYm9vbCBIZWxkVG9MaWZ0QWN0b3I6OlJ1bkFjdGlvbihjb25zdCBIZWxkVG9MaWZ0UGFyYW1zICZwYXJhbXMpIHsKKyAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBpZiAoIWNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMuZ2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBNb3ZlIGNsYXcgb3V0IG9mIHRoZSB3YXkuCisgIHsKKyAgICBib29sIHNlbmRfZ29hbCA9IHRydWU7CisgICAgZG91YmxlIGNsYXdfZ29hbCA9IHBhcmFtcy5jbGF3X291dF9hbmdsZTsKKyAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICAgIGlmIChjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgICAgaWYgKGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLT5nb2FsX2FuZ2xlIDwgY2xhd19nb2FsKSB7CisgICAgICAgIHNlbmRfZ29hbCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoc2VuZF9nb2FsKSB7CisgICAgICBhdXRvIG1lc3NhZ2UgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICAgIG1lc3NhZ2UtPmFuZ2xlID0gcGFyYW1zLmNsYXdfb3V0X2FuZ2xlOworICAgICAgbWVzc2FnZS0+YW5ndWxhcl92ZWxvY2l0eSA9IDAuMDsKKyAgICAgIG1lc3NhZ2UtPmludGFrZSA9IDAuMDsKKyAgICAgIG1lc3NhZ2UtPm1heF92ZWxvY2l0eSA9IDYuMDsKKyAgICAgIG1lc3NhZ2UtPm1heF9hY2NlbGVyYXRpb24gPSAxMC4wOworICAgICAgbWVzc2FnZS0+cm9sbGVyc19jbG9zZWQgPSB0cnVlOworCisgICAgICBMT0dfU1RSVUNUKERFQlVHLCAiU2VuZGluZyBjbGF3IGdvYWwiLCAqbWVzc2FnZSk7CisgICAgICBtZXNzYWdlLlNlbmQoKTsKKyAgICB9CisgIH0KKworICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIGlmICghY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX2hlaWdodCAhPSBwYXJhbXMuYm90dG9tX2hlaWdodCB8fAorICAgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF9hbmdsZSAhPSAwLjApIHsKKyAgICAvLyBMb3dlciB3aXRoIHRoZSBmcmlkZ2UgY2xhbXBzIG9wZW4gYW5kIG1vdmUgaXQgZm9yd2FyZHMgc2xpZ2h0bHkgdG8gY2xlYXIuCisgICAgRG9GcmlkZ2VQcm9maWxlKGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYXJtX2NsZWFyYW5jZSwga0Zhc3RFbGV2YXRvck1vdmUsIGtGYXN0QXJtTW92ZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisKKyAgICBEb0ZyaWRnZVByb2ZpbGUocGFyYW1zLmJvdHRvbV9oZWlnaHQsIHBhcmFtcy5hcm1fY2xlYXJhbmNlLAorICAgICAgICAgICAgICAgICAgICBrRmFzdEVsZXZhdG9yTW92ZSwga0Zhc3RBcm1Nb3ZlLCBmYWxzZSk7CisgICAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE1vdmUgaXQgYmFjayB0byB0aGUgc3RvcmFnZSBsb2NhdGlvbi4KKyAgICBEb0ZyaWRnZVByb2ZpbGUocGFyYW1zLmJvdHRvbV9oZWlnaHQsIDAuMCwga0VsZXZhdG9yTW92ZSwga0FybU1vdmUsIGZhbHNlKTsKKyAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworCisgICAgaWYgKCFXYWl0T3JDYW5jZWwoCisgICAgICAgICAgICBhb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcyhwYXJhbXMuYmVmb3JlX2xpZnRfc2V0dGxlX3RpbWUpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2xhbXAKKyAgICBEb0ZyaWRnZVByb2ZpbGUocGFyYW1zLmJvdHRvbV9oZWlnaHQsIDAuMCwga0VsZXZhdG9yTW92ZSwga0FybU1vdmUsIHRydWUpOworICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIVdhaXRPckNhbmNlbChhb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcyhwYXJhbXMuY2xhbXBfcGF1c2VfdGltZSkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICB7CisgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8TGlmdEFjdGlvbj4gbGlmdF9hY3Rpb24gPQorICAgICAgICBNYWtlTGlmdEFjdGlvbihwYXJhbXMubGlmdF9wYXJhbXMpOworICAgIGxpZnRfYWN0aW9uLT5TdGFydCgpOworICAgIHdoaWxlIChsaWZ0X2FjdGlvbi0+UnVubmluZygpKSB7CisgICAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUyg6OmFvczo6Y29udHJvbHM6OmtMb29wRnJlcXVlbmN5LlRvTVNlYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwMCk7CisKKyAgICAgIGlmIChTaG91bGRDYW5jZWwoKSkgeworICAgICAgICBsaWZ0X2FjdGlvbi0+Q2FuY2VsKCk7CisgICAgICAgIExPRyhXQVJOSU5HLCAiQ2FuY2VsbGluZyBmcmlkZ2UgYW5kIGNsYXcuXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKzo6c3RkOjp1bmlxdWVfcHRyPEhlbGRUb0xpZnRBY3Rpb24+IE1ha2VIZWxkVG9MaWZ0QWN0aW9uKAorICAgIGNvbnN0IEhlbGRUb0xpZnRQYXJhbXMgJnBhcmFtcykgeworICByZXR1cm4gOjpzdGQ6OnVuaXF1ZV9wdHI8SGVsZFRvTGlmdEFjdGlvbj4oCisgICAgICBuZXcgSGVsZFRvTGlmdEFjdGlvbigmOjpmcmM5NzE6OmFjdG9yczo6aGVsZF90b19saWZ0X2FjdGlvbiwgcGFyYW1zKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0b3IuaCBiL3kyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjlmZWE0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL2hlbGRfdG9fbGlmdF9hY3Rvci5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgWTIwMTVfQUNUT1JTX0hFTERfVE9fTElGVF9BQ1RPUl9IXworI2RlZmluZSBZMjAxNV9BQ1RPUlNfSEVMRF9UT19MSUZUX0FDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2hlbGRfdG9fbGlmdF9hY3Rpb24ucS5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9mcmlkZ2VfcHJvZmlsZV9saWIuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworY2xhc3MgSGVsZFRvTGlmdEFjdG9yIDogcHVibGljIEZyaWRnZUFjdG9yQmFzZTxIZWxkVG9MaWZ0QWN0aW9uUXVldWVHcm91cD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgSGVsZFRvTGlmdEFjdG9yKEhlbGRUb0xpZnRBY3Rpb25RdWV1ZUdyb3VwICpxdWV1ZXMpOworCisgIGJvb2wgUnVuQWN0aW9uKGNvbnN0IEhlbGRUb0xpZnRQYXJhbXMgJnBhcmFtcykgb3ZlcnJpZGU7Cit9OworCit0eXBlZGVmIGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxIZWxkVG9MaWZ0QWN0aW9uUXVldWVHcm91cD4KKyAgICBIZWxkVG9MaWZ0QWN0aW9uOworCisvLyBNYWtlcyBhIG5ldyBIZWxkVG9MaWZ0QWN0b3IgYWN0aW9uLgorOjpzdGQ6OnVuaXF1ZV9wdHI8SGVsZFRvTGlmdEFjdGlvbj4gTWFrZUhlbGRUb0xpZnRBY3Rpb24oCisgICAgY29uc3QgSGVsZFRvTGlmdFBhcmFtcyAmcGFyYW1zKTsKKworfSAgLy8gbmFtZXNwYWNlIGFjdG9ycworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE1X0FDVE9SU19IRUxEX1RPX0xJRlRfQUNUT1JfSF8KZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0b3JfbWFpbi5jYyBiL3kyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0b3JfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ3OGUxCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL2hlbGRfdG9fbGlmdF9hY3Rvcl9tYWluLmNjCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvaGVsZF90b19saWZ0X2FjdG9yLmgiCisKK2ludCBtYWluKGludCAvKmFyZ2MqLywgY2hhciogLyphcmd2Ki8gW10pIHsKKyAgOjphb3M6OkluaXQoKTsKKworICA6OmZyYzk3MTo6YWN0b3JzOjpIZWxkVG9MaWZ0QWN0b3IgbGlmdCgKKyAgICAgICY6OmZyYzk3MTo6YWN0b3JzOjpoZWxkX3RvX2xpZnRfYWN0aW9uKTsKKyAgbGlmdC5SdW4oKTsKKworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9ob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0aW9uLnEgYi95MjAxNS9hY3RvcnMvaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbi5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTFjNTUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbi5xCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2UgZnJjOTcxLmFjdG9yczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5xIjsKKworLy8gUGFyYW1ldGVycyB0byBzZW5kIHdpdGggc3RhcnQuCisvLyBUaGlzIGFjdGlvbiBwaWNrcyBhIGhvcml6b250YWwgY2FuIGZyb20gdGhlIGNsYXcuCitzdHJ1Y3QgSG9yaXpvbnRhbENhblBpY2t1cFBhcmFtcyB7CisgIC8vIEVsZXZhdG9yIGNhdGNoIGhlaWdodC4KKyAgZG91YmxlIGVsZXZhdG9yX2hlaWdodDsKKyAgLy8gQW5nbGUgdG8gbW92ZSB0aGUgY2xhdyB0byB3aGVuIHBsYWNpbmcgdGhlIGJhc2Ugb2YgdGhlIGNhbiBvbiB0aGUgcm9ib3QuCisgIGRvdWJsZSBwaWNrdXBfYW5nbGU7CisKKyAgLy8gVGltZSBhbmQgcG93ZXIgdG8gc3BpdCB0aGUgY2FuIG91dCBiZWZvcmUgbGlmdGluZy4KKyAgZG91YmxlIHNwaXRfdGltZTsKKyAgZG91YmxlIHNwaXRfcG93ZXI7CisKKyAgLy8gVGltZSBhbmQgcG93ZXIgdG8gcHVsbCB0aGUgY2FuIGluIHdoZW4gbGlmdGVkLgorICBkb3VibGUgc3Vja190aW1lOworICBkb3VibGUgc3Vja19wb3dlcjsKKworICAvLyBUaW1lIHRvIHB1c2ggZG93biBhbmQgc3VjayBpbiB0byBzbGlkZSB0aGUgY2xhdyBkb3duIG9uIHRoZSBjYW4uCisgIGRvdWJsZSBjbGF3X3NldHRsZV90aW1lOworICBkb3VibGUgY2xhd19zZXR0bGVfcG93ZXI7CisKKyAgLy8gQW5nbGUgdG8gbGlmdCB0aGUgY2xhdyB0byB0byBsaWZ0IHRoZSBjYW4uCisgIGRvdWJsZSBjbGF3X2Z1bGxfbGlmdF9hbmdsZTsKKworICAvLyBBbmdsZSB0byBtb3ZlIHRoZSBjbGF3IGJhY2sgZG93biB0by4KKyAgZG91YmxlIGNsYXdfZW5kX2FuZ2xlOworCisgIC8vIFRoZSBlbmQgYXJtIGFuZCBlbGV2YXRvciBwb3NpdGlvbiBvbmNlIHdlIGFyZSBkb25lIGxpZnRpbmcuCisgIGRvdWJsZSBlbGV2YXRvcl9lbmRfaGVpZ2h0OworICBkb3VibGUgYXJtX2VuZF9hbmdsZTsKK307CisKK3F1ZXVlX2dyb3VwIEhvcml6b250YWxDYW5QaWNrdXBBY3Rpb25RdWV1ZUdyb3VwIHsKKyAgaW1wbGVtZW50cyBhb3MuY29tbW9uLmFjdGlvbnMuQWN0aW9uUXVldWVHcm91cDsKKworICBtZXNzYWdlIEdvYWwgeworICAgIHVpbnQzMl90IHJ1bjsKKyAgICBIb3Jpem9udGFsQ2FuUGlja3VwUGFyYW1zIHBhcmFtczsKKyAgfTsKKworICBxdWV1ZSBHb2FsIGdvYWw7CisgIHF1ZXVlIGFvcy5jb21tb24uYWN0aW9ucy5TdGF0dXMgc3RhdHVzOworfTsKKworcXVldWVfZ3JvdXAgSG9yaXpvbnRhbENhblBpY2t1cEFjdGlvblF1ZXVlR3JvdXAgaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbjsKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9ob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0b3IuY2MgYi95MjAxNS9hY3RvcnMvaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNmU1NDIKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdG9yLmNjCkBAIC0wLDAgKzEsMTYxIEBACisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvcGhhc2VkX2xvb3AuaCIKKworI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9ob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvZnJpZGdlX3Byb2ZpbGVfbGliLmgiCisjaW5jbHVkZSAieTIwMTUvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucS5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBhY3RvcnMgeworbmFtZXNwYWNlIHsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtDbGF3UGlja3VwezMuMCwgMi4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtDbGF3QmFja0Rvd257Ny4wLCAxMC4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtDbGF3SW5pdGlhbExpZnR7Ny4wLCA4LjB9OworCitjb25zdGV4cHIgUHJvZmlsZVBhcmFtcyBrQXJtTW92ZXsxLjAsIDEuNn07Citjb25zdGV4cHIgUHJvZmlsZVBhcmFtcyBrRWxldmF0b3JNb3ZlezAuNiwgMi4yfTsKKworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0Zhc3RBcm1Nb3ZlezIuMCwgMy4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtGYXN0RWxldmF0b3JNb3ZlezEuMCwgMy4wfTsKKworY29uc3RleHByIGRvdWJsZSBrQW5nbGVFcHNpbG9uID0gMC4xMDsKK2NvbnN0ZXhwciBkb3VibGUga0dvYWxBbmdsZUVwc2lsb24gPSAwLjAxOworCit9ICAvLyBuYW1lc3BhY2UKKworSG9yaXpvbnRhbENhblBpY2t1cEFjdG9yOjpIb3Jpem9udGFsQ2FuUGlja3VwQWN0b3IoCisgICAgSG9yaXpvbnRhbENhblBpY2t1cEFjdGlvblF1ZXVlR3JvdXAgKnF1ZXVlcykKKyAgICA6IEZyaWRnZUFjdG9yQmFzZTxIb3Jpem9udGFsQ2FuUGlja3VwQWN0aW9uUXVldWVHcm91cD4ocXVldWVzKSB7fQorCitib29sIEhvcml6b250YWxDYW5QaWNrdXBBY3Rvcjo6V2FpdFVudGlsR29hbE5lYXIoZG91YmxlIGFuZ2xlKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMuRmV0Y2hBbm90aGVyKCk7CisgICAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgZG91YmxlIGdvYWxfYW5nbGUgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+Z29hbF9hbmdsZTsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiR290IGNsYXcgc3RhdHVzIiwgKmNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzKTsKKworICAgIGlmICg6OnN0ZDo6YWJzKGdvYWxfYW5nbGUgLSBhbmdsZSkgPCBrR29hbEFuZ2xlRXBzaWxvbikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9Cit9CisKK2Jvb2wgSG9yaXpvbnRhbENhblBpY2t1cEFjdG9yOjpXYWl0VW50aWxOZWFyKGRvdWJsZSBhbmdsZSkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IGRvdWJsZSBjdXJyZW50X2FuZ2xlID0gY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPmFuZ2xlOworICAgIExPR19TVFJVQ1QoREVCVUcsICJHb3QgY2xhdyBzdGF0dXMiLCAqY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMpOworCisgICAgaWYgKDo6c3RkOjphYnMoY3VycmVudF9hbmdsZSAtIGFuZ2xlKSA8IGtBbmdsZUVwc2lsb24pIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorfQordm9pZCBIb3Jpem9udGFsQ2FuUGlja3VwQWN0b3I6Ok1vdmVBcm0oZG91YmxlIGFuZ2xlLCBkb3VibGUgaW50YWtlX3Bvd2VyKSB7CisgIE1vdmVBcm0oYW5nbGUsIGludGFrZV9wb3dlciwga0NsYXdQaWNrdXApOworfQorCit2b2lkIEhvcml6b250YWxDYW5QaWNrdXBBY3Rvcjo6TW92ZUFybShkb3VibGUgYW5nbGUsIGRvdWJsZSBpbnRha2VfcG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9maWxlUGFyYW1zIHByb2ZpbGVfcGFyYW1zKSB7CisgIGF1dG8gbWVzc2FnZSA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5NYWtlTWVzc2FnZSgpOworICBtZXNzYWdlLT5hbmdsZSA9IGFuZ2xlOworICBtZXNzYWdlLT5tYXhfdmVsb2NpdHkgPSBwcm9maWxlX3BhcmFtcy52ZWxvY2l0eTsKKyAgbWVzc2FnZS0+bWF4X2FjY2VsZXJhdGlvbiA9IHByb2ZpbGVfcGFyYW1zLmFjY2VsZXJhdGlvbjsKKyAgbWVzc2FnZS0+YW5ndWxhcl92ZWxvY2l0eSA9IDAuMDsKKyAgbWVzc2FnZS0+aW50YWtlID0gaW50YWtlX3Bvd2VyOworICBtZXNzYWdlLT5yb2xsZXJzX2Nsb3NlZCA9IHRydWU7CisKKyAgTE9HX1NUUlVDVChERUJVRywgIlNlbmRpbmcgY2xhdyBnb2FsIiwgKm1lc3NhZ2UpOworICBtZXNzYWdlLlNlbmQoKTsKK30KKworYm9vbCBIb3Jpem9udGFsQ2FuUGlja3VwQWN0b3I6OlJ1bkFjdGlvbigKKyAgICBjb25zdCBIb3Jpem9udGFsQ2FuUGlja3VwUGFyYW1zICZwYXJhbXMpIHsKKyAgLy8gR28gYXJvdW5kIHRoZSBjYW4uCisgIGlmICghU3RhcnRGcmlkZ2VQcm9maWxlKHBhcmFtcy5lbGV2YXRvcl9oZWlnaHQsIDAuMCwga0Zhc3RFbGV2YXRvck1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtGYXN0QXJtTW92ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMuRmV0Y2hBbm90aGVyKCk7CisKKyAgTW92ZUFybShjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+YW5nbGUsIHBhcmFtcy5zcGl0X3Bvd2VyKTsKKworICBpZiAoIVdhaXRPckNhbmNlbChhb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcyhwYXJhbXMuc3BpdF90aW1lKSkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vdmVBcm0ocGFyYW1zLnBpY2t1cF9hbmdsZSwgMC4wLCBrQ2xhd0luaXRpYWxMaWZ0KTsKKworICBpZiAoIVdhaXRVbnRpbE5lYXIocGFyYW1zLnBpY2t1cF9hbmdsZSkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vdmVBcm0ocGFyYW1zLnBpY2t1cF9hbmdsZSwgcGFyYW1zLnN1Y2tfcG93ZXIpOworCisgIGlmICghV2FpdE9yQ2FuY2VsKGFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKHBhcmFtcy5zdWNrX3RpbWUpKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW92ZUFybSgwLjAsIDAuMCwga0NsYXdCYWNrRG93bik7CisKKyAgaWYgKCFXYWl0VW50aWxHb2FsTmVhcigwLjApKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3ZlQXJtKDAuMCwgcGFyYW1zLmNsYXdfc2V0dGxlX3Bvd2VyKTsKKworICBpZiAoIVdhaXRPckNhbmNlbChhb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcyhwYXJhbXMuY2xhd19zZXR0bGVfdGltZSkpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB3aGlsZSAodHJ1ZSkgeworICAgIFByb2ZpbGVTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgSXRlcmF0ZVByb2ZpbGUocGFyYW1zLmVsZXZhdG9yX2hlaWdodCwgMC4wLCBrRmFzdEVsZXZhdG9yTW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAga0Zhc3RBcm1Nb3ZlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgIGlmIChzdGF0dXMgPT0gRE9ORSkgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gQ0FOQ0VMRUQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIE1vdmVBcm0ocGFyYW1zLmNsYXdfZnVsbF9saWZ0X2FuZ2xlLCAwLjApOworCisgIGlmICghV2FpdFVudGlsTmVhcihwYXJhbXMuY2xhd19mdWxsX2xpZnRfYW5nbGUpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBEb0ZyaWRnZVByb2ZpbGUocGFyYW1zLmVsZXZhdG9yX2hlaWdodCwgMC4wLCBrRWxldmF0b3JNb3ZlLCBrQXJtTW92ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlKTsKKyAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKworICBNb3ZlQXJtKHBhcmFtcy5jbGF3X2VuZF9hbmdsZSwgNy4wKTsKKworICBpZiAoIVdhaXRVbnRpbE5lYXIocGFyYW1zLmNsYXdfZW5kX2FuZ2xlKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIE1vdmVBcm0ocGFyYW1zLmNsYXdfZW5kX2FuZ2xlLCAwLjApOworCisgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisKKyAgRG9GcmlkZ2VQcm9maWxlKHBhcmFtcy5lbGV2YXRvcl9lbmRfaGVpZ2h0LCBwYXJhbXMuYXJtX2VuZF9hbmdsZSwKKyAgICAgICAgICAgICAgICAgIGtFbGV2YXRvck1vdmUsIGtBcm1Nb3ZlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKzo6c3RkOjp1bmlxdWVfcHRyPEhvcml6b250YWxDYW5QaWNrdXBBY3Rpb24+IE1ha2VIb3Jpem9udGFsQ2FuUGlja3VwQWN0aW9uKAorICAgIGNvbnN0IEhvcml6b250YWxDYW5QaWNrdXBQYXJhbXMgJnBhcmFtcykgeworICByZXR1cm4gOjpzdGQ6OnVuaXF1ZV9wdHI8SG9yaXpvbnRhbENhblBpY2t1cEFjdGlvbj4oCisgICAgICBuZXcgSG9yaXpvbnRhbENhblBpY2t1cEFjdGlvbigKKyAgICAgICAgICAmOjpmcmM5NzE6OmFjdG9yczo6aG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbiwgcGFyYW1zKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9ob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0b3IuaCBiL3kyMDE1L2FjdG9ycy9ob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTEwMTc4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rvci5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgWTIwMTVfQUNUT1JTX0hPUklaT05UQUxfQ0FOX1BJQ0tVUF9BQ1RPUl9IXworI2RlZmluZSBZMjAxNV9BQ1RPUlNfSE9SSVpPTlRBTF9DQU5fUElDS1VQX0FDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rpb24ucS5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9mcmlkZ2VfcHJvZmlsZV9saWIuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworY2xhc3MgSG9yaXpvbnRhbENhblBpY2t1cEFjdG9yCisgICAgOiBwdWJsaWMgRnJpZGdlQWN0b3JCYXNlPEhvcml6b250YWxDYW5QaWNrdXBBY3Rpb25RdWV1ZUdyb3VwPiB7CisgcHVibGljOgorICBleHBsaWNpdCBIb3Jpem9udGFsQ2FuUGlja3VwQWN0b3IoCisgICAgICBIb3Jpem9udGFsQ2FuUGlja3VwQWN0aW9uUXVldWVHcm91cCAqcXVldWVzKTsKKworICBib29sIFJ1bkFjdGlvbihjb25zdCBIb3Jpem9udGFsQ2FuUGlja3VwUGFyYW1zICZwYXJhbXMpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgLy8gV2FpdHMgdW50aWwgd2UgYXJlIG5lYXIgdGhlIGFuZ2xlLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIHdlIHNob3VsZCBjYW5jZWwuCisgIGJvb2wgV2FpdFVudGlsTmVhcihkb3VibGUgYW5nbGUpOworICBib29sIFdhaXRVbnRpbEdvYWxOZWFyKGRvdWJsZSBhbmdsZSk7CisKKyAgdm9pZCBNb3ZlQXJtKGRvdWJsZSBhbmdsZSwgZG91YmxlIGludGFrZV9wb3dlcik7CisgIHZvaWQgTW92ZUFybShkb3VibGUgYW5nbGUsIGRvdWJsZSBpbnRha2VfcG93ZXIsCisgICAgICAgICAgICAgICBjb25zdCBQcm9maWxlUGFyYW1zIHByb2ZpbGVfcGFyYW1zKTsKK307CisKK3R5cGVkZWYgYW9zOjpjb21tb246OmFjdGlvbnM6OlR5cGVkQWN0aW9uPEhvcml6b250YWxDYW5QaWNrdXBBY3Rpb25RdWV1ZUdyb3VwPgorICAgIEhvcml6b250YWxDYW5QaWNrdXBBY3Rpb247CisKKy8vIE1ha2VzIGEgbmV3IEhvcml6b250YWxDYW5QaWNrdXBBY3RvciBhY3Rpb24uCis6OnN0ZDo6dW5pcXVlX3B0cjxIb3Jpem9udGFsQ2FuUGlja3VwQWN0aW9uPiBNYWtlSG9yaXpvbnRhbENhblBpY2t1cEFjdGlvbigKKyAgICBjb25zdCBIb3Jpem9udGFsQ2FuUGlja3VwUGFyYW1zICZwYXJhbXMpOworCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTVfQUNUT1JTX0hPUklaT05UQUxfQ0FOX1BJQ0tVUF9BQ1RPUl9IXwpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rvcl9tYWluLmNjIGIveTIwMTUvYWN0b3JzL2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rvcl9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Zjk4NmMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvaG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdG9yX21haW4uY2MKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rpb24ucS5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9ob3Jpem9udGFsX2Nhbl9waWNrdXBfYWN0b3IuaCIKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyKiAvKmFyZ3YqLyBbXSkgeworICA6OmFvczo6SW5pdCgpOworCisgIDo6ZnJjOTcxOjphY3RvcnM6Okhvcml6b250YWxDYW5QaWNrdXBBY3RvciBob3Jpem9udGFsX2Nhbl9waWNrdXAoCisgICAgICAmOjpmcmM5NzE6OmFjdG9yczo6aG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbik7CisgIGhvcml6b250YWxfY2FuX3BpY2t1cC5SdW4oKTsKKworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9saWZ0X2FjdGlvbi5xIGIveTIwMTUvYWN0b3JzL2xpZnRfYWN0aW9uLnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmYmE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9saWZ0X2FjdGlvbi5xCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgZnJjOTcxLmFjdG9yczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5xIjsKK2ltcG9ydCAieTIwMTUvYWN0b3JzL2xpZnRfYWN0aW9uX3BhcmFtcy5xIjsKKworcXVldWVfZ3JvdXAgTGlmdEFjdGlvblF1ZXVlR3JvdXAgeworICBpbXBsZW1lbnRzIGFvcy5jb21tb24uYWN0aW9ucy5BY3Rpb25RdWV1ZUdyb3VwOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgdWludDMyX3QgcnVuOworICAgIExpZnRQYXJhbXMgcGFyYW1zOworICB9OworCisgIHF1ZXVlIEdvYWwgZ29hbDsKKyAgcXVldWUgYW9zLmNvbW1vbi5hY3Rpb25zLlN0YXR1cyBzdGF0dXM7Cit9OworCitxdWV1ZV9ncm91cCBMaWZ0QWN0aW9uUXVldWVHcm91cCBsaWZ0X2FjdGlvbjsKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9saWZ0X2FjdGlvbl9wYXJhbXMucSBiL3kyMDE1L2FjdG9ycy9saWZ0X2FjdGlvbl9wYXJhbXMucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzE5ODJiCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL2xpZnRfYWN0aW9uX3BhcmFtcy5xCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgZnJjOTcxLmFjdG9yczsKKworLy8gUGFyYW1ldGVycyB0byBzZW5kIHdpdGggc3RhcnQuCitzdHJ1Y3QgTGlmdFBhcmFtcyB7CisgIC8vIExpZnQgaGVpZ2h0CisgIGRvdWJsZSBsaWZ0X2hlaWdodDsKKyAgLy8gQXJtIGdvYWwuCisgIGRvdWJsZSBsaWZ0X2FybTsKKworICAvLyBJZiB0cnVlLCBkbyB0aGUgc2Vjb25kIGxpZnQuCisgIGJvb2wgc2Vjb25kX2xpZnQ7CisgIC8vIEFybSBnb2FsLgorICBkb3VibGUgaW50ZXJtZWRpYXRlX2xpZnRfaGVpZ2h0OworCisgIC8vIFRydWUgdG8gbW92ZSB0aGUgY2xhdyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsaWZ0LgorICBib29sIHBhY2tfY2xhdzsKKyAgLy8gSWZmIHBhY2tfY2xhdyBpcyB0cnVlLCB0aGUgYW5nbGUgdG8gbW92ZSB0aGUgY2xhdyB0by4KKyAgZG91YmxlIHBhY2tfY2xhd19hbmdsZTsKK307CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvbGlmdF9hY3Rvci5jYyBiL3kyMDE1L2FjdG9ycy9saWZ0X2FjdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTdlZWYKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvbGlmdF9hY3Rvci5jYwpAQCAtMCwwICsxLDkyIEBACisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2xpZnRfYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvZnJpZGdlX3Byb2ZpbGVfbGliLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucS5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBhY3RvcnMgeworbmFtZXNwYWNlIHsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtBcm1Nb3ZlezAuNiwgMS4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtFbGV2YXRvck1vdmV7MC45LCAzLjB9OworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0VsZXZhdG9yRml4TW92ZXswLjksIDIuMH07Cit9ICAvLyBuYW1lc3BhY2UKKworTGlmdEFjdG9yOjpMaWZ0QWN0b3IoTGlmdEFjdGlvblF1ZXVlR3JvdXAgKnF1ZXVlcykKKyAgICA6IEZyaWRnZUFjdG9yQmFzZTxMaWZ0QWN0aW9uUXVldWVHcm91cD4ocXVldWVzKSB7fQorCitib29sIExpZnRBY3Rvcjo6UnVuQWN0aW9uKGNvbnN0IExpZnRQYXJhbXMgJnBhcmFtcykgeworICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIGlmICghY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRvdWJsZSBnb2FsX2hlaWdodCA9IHBhcmFtcy5saWZ0X2hlaWdodDsKKyAgZG91YmxlIGdvYWxfYW5nbGUgPSAwLjA7CisKKyAgaWYgKHBhcmFtcy5zZWNvbmRfbGlmdCkgeworICAgIERvRnJpZGdlUHJvZmlsZShwYXJhbXMuaW50ZXJtZWRpYXRlX2xpZnRfaGVpZ2h0LCAwLjAsIGtFbGV2YXRvckZpeE1vdmUsCisgICAgICAgICAgICAgICAgICAgIGtBcm1Nb3ZlLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5ncmFiYmVycy50b3BfZnJvbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdyYWJiZXJzLmJvdHRvbV9mcm9udCwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z3JhYmJlcnMuYm90dG9tX2JhY2spOworICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoIVN0YXJ0RnJpZGdlUHJvZmlsZSgKKyAgICAgICAgICBwYXJhbXMubGlmdF9oZWlnaHQsIDAuMCwga0VsZXZhdG9yTW92ZSwga0FybU1vdmUsCisgICAgICAgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z3JhYmJlcnMudG9wX2Zyb250LAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdyYWJiZXJzLmJvdHRvbV9mcm9udCwKKyAgICAgICAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5ncmFiYmVycy5ib3R0b21fYmFjaykpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaGFzX3N0YXJ0ZWRfYmFjayA9IGZhbHNlOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX2hlaWdodCA+IDAuMSkgeworICAgICAgaWYgKCFoYXNfc3RhcnRlZF9iYWNrKSB7CisgICAgICAgIGlmICghU3RhcnRGcmlkZ2VQcm9maWxlKAorICAgICAgICAgICAgICAgIHBhcmFtcy5saWZ0X2hlaWdodCwgcGFyYW1zLmxpZnRfYXJtLCBrRWxldmF0b3JNb3ZlLCBrQXJtTW92ZSwKKyAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5ncmFiYmVycy50b3BfZnJvbnQsCisgICAgICAgICAgICAgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z3JhYmJlcnMuYm90dG9tX2Zyb250LAorICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdyYWJiZXJzLmJvdHRvbV9iYWNrKSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGdvYWxfYW5nbGUgPSBwYXJhbXMubGlmdF9hcm07CisgICAgICAgIGhhc19zdGFydGVkX2JhY2sgPSB0cnVlOworICAgICAgICBpZiAocGFyYW1zLnBhY2tfY2xhdykgeworICAgICAgICAgIGF1dG8gbWVzc2FnZSA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5NYWtlTWVzc2FnZSgpOworICAgICAgICAgIG1lc3NhZ2UtPmFuZ2xlID0gcGFyYW1zLnBhY2tfY2xhd19hbmdsZTsKKyAgICAgICAgICBtZXNzYWdlLT5hbmd1bGFyX3ZlbG9jaXR5ID0gMC4wOworICAgICAgICAgIG1lc3NhZ2UtPmludGFrZSA9IDAuMDsKKyAgICAgICAgICBtZXNzYWdlLT5yb2xsZXJzX2Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgbWVzc2FnZS0+bWF4X3ZlbG9jaXR5ID0gNi4wOworICAgICAgICAgIG1lc3NhZ2UtPm1heF9hY2NlbGVyYXRpb24gPSAxMC4wOworCisgICAgICAgICAgTE9HX1NUUlVDVChERUJVRywgIlNlbmRpbmcgY2xhdyBnb2FsIiwgKm1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UuU2VuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgUHJvZmlsZVN0YXR1cyBzdGF0dXMgPSBJdGVyYXRlUHJvZmlsZSgKKyAgICAgICAgZ29hbF9oZWlnaHQsIGdvYWxfYW5nbGUsIGtFbGV2YXRvck1vdmUsIGtBcm1Nb3ZlLAorICAgICAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5ncmFiYmVycy50b3BfZnJvbnQsCisgICAgICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdyYWJiZXJzLmJvdHRvbV9mcm9udCwKKyAgICAgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z3JhYmJlcnMuYm90dG9tX2JhY2spOworICAgIGlmIChzdGF0dXMgPT0gRE9ORSB8fCBzdGF0dXMgPT0gQ0FOQ0VMRUQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworOjpzdGQ6OnVuaXF1ZV9wdHI8TGlmdEFjdGlvbj4gTWFrZUxpZnRBY3Rpb24oY29uc3QgTGlmdFBhcmFtcyAmcGFyYW1zKSB7CisgIHJldHVybiA6OnN0ZDo6dW5pcXVlX3B0cjxMaWZ0QWN0aW9uPigKKyAgICAgIG5ldyBMaWZ0QWN0aW9uKCY6OmZyYzk3MTo6YWN0b3JzOjpsaWZ0X2FjdGlvbiwgcGFyYW1zKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9saWZ0X2FjdG9yLmggYi95MjAxNS9hY3RvcnMvbGlmdF9hY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDc5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvbGlmdF9hY3Rvci5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgWTIwMTVfQUNUT1JTX0xJRlRfQUNUT1JfSF8KKyNkZWZpbmUgWTIwMTVfQUNUT1JTX0xJRlRfQUNUT1JfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvbGlmdF9hY3Rpb24ucS5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9mcmlkZ2VfcHJvZmlsZV9saWIuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworY2xhc3MgTGlmdEFjdG9yIDogcHVibGljIEZyaWRnZUFjdG9yQmFzZTxMaWZ0QWN0aW9uUXVldWVHcm91cD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgTGlmdEFjdG9yKExpZnRBY3Rpb25RdWV1ZUdyb3VwICpxdWV1ZXMpOworCisgIGJvb2wgUnVuQWN0aW9uKGNvbnN0IExpZnRQYXJhbXMgJnBhcmFtcykgb3ZlcnJpZGU7Cit9OworCit0eXBlZGVmIGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxMaWZ0QWN0aW9uUXVldWVHcm91cD4gTGlmdEFjdGlvbjsKKworLy8gTWFrZXMgYSBuZXcgTGlmdEFjdG9yIGFjdGlvbi4KKzo6c3RkOjp1bmlxdWVfcHRyPExpZnRBY3Rpb24+IE1ha2VMaWZ0QWN0aW9uKGNvbnN0IExpZnRQYXJhbXMgJnBhcmFtcyk7CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBZMjAxNV9BQ1RPUlNfTElGVF9BQ1RPUl9IXwpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL2xpZnRfYWN0b3JfbWFpbi5jYyBiL3kyMDE1L2FjdG9ycy9saWZ0X2FjdG9yX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4MDllZgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9saWZ0X2FjdG9yX21haW4uY2MKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2xpZnRfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvbGlmdF9hY3Rvci5oIgorCitpbnQgbWFpbihpbnQgLyphcmdjKi8sIGNoYXIqIC8qYXJndiovIFtdKSB7CisgIDo6YW9zOjpJbml0KCk7CisKKyAgOjpmcmM5NzE6OmFjdG9yczo6TGlmdEFjdG9yIGxpZnQoJjo6ZnJjOTcxOjphY3RvcnM6OmxpZnRfYWN0aW9uKTsKKyAgbGlmdC5SdW4oKTsKKworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9waWNrdXBfYWN0aW9uLnEgYi95MjAxNS9hY3RvcnMvcGlja3VwX2FjdGlvbi5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzMzN2EKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvcGlja3VwX2FjdGlvbi5xCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgZnJjOTcxLmFjdG9yczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5xIjsKKworLy8gUGFyYW1ldGVycyB0byBzZW5kIHdpdGggc3RhcnQuCitzdHJ1Y3QgUGlja3VwUGFyYW1zIHsKKyAgLy8gQW5nbGUgdG8gcHVsbCBpbiBhdCB0aGUgdG9wLgorICBkb3VibGUgcGlja3VwX2FuZ2xlOworICAvLyBBbmdsZSB0byBzdGFydCBzdWNraW5nIGluIGFib3ZlLgorICBkb3VibGUgc3Vja19hbmdsZTsKKyAgLy8gQW5nbGUgdG8gZmluaXNoIHN1Y2tpbmcgYXQuCisgIGRvdWJsZSBzdWNrX2FuZ2xlX2ZpbmlzaDsKKyAgLy8gQW5nbGUgdG8gZ28gdG8gb25jZSB3ZSBnZXQgdG8gdGhlIHRvcCB0byBmaW5pc2ggcHVsbGluZyBpbi4KKyAgZG91YmxlIHBpY2t1cF9maW5pc2hfYW5nbGU7CisgIC8vIFBvd2VyIHRvIHB1bGwgdGhlIGJpbiBpbiBhdCB0aGUgdG9wLgorICBkb3VibGUgaW50YWtlX3ZvbHRhZ2U7CisgIC8vIFRpbWUgdG8gcHVsbCB0aGUgYmluIGluIGZvci4KKyAgZG91YmxlIGludGFrZV90aW1lOworfTsKKworcXVldWVfZ3JvdXAgUGlja3VwQWN0aW9uUXVldWVHcm91cCB7CisgIGltcGxlbWVudHMgYW9zLmNvbW1vbi5hY3Rpb25zLkFjdGlvblF1ZXVlR3JvdXA7CisKKyAgbWVzc2FnZSBHb2FsIHsKKyAgICB1aW50MzJfdCBydW47CisgICAgUGlja3VwUGFyYW1zIHBhcmFtczsKKyAgfTsKKworICBxdWV1ZSBHb2FsIGdvYWw7CisgIHF1ZXVlIGFvcy5jb21tb24uYWN0aW9ucy5TdGF0dXMgc3RhdHVzOworfTsKKworcXVldWVfZ3JvdXAgUGlja3VwQWN0aW9uUXVldWVHcm91cCBwaWNrdXBfYWN0aW9uOwpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL3BpY2t1cF9hY3Rvci5jYyBiL3kyMDE1L2FjdG9ycy9waWNrdXBfYWN0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2M2JhNgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9waWNrdXBfYWN0b3IuY2MKQEAgLTAsMCArMSwxNDkgQEAKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvcGlja3VwX2FjdG9yLmgiCisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvcGhhc2VkX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CituYW1lc3BhY2UgeworY29uc3RleHByIGRvdWJsZSBrQ2xhd1BpY2t1cFZlbG9jaXR5ID0gMy4wMDsKK2NvbnN0ZXhwciBkb3VibGUga0NsYXdQaWNrdXBBY2NlbGVyYXRpb24gPSAzLjU7Citjb25zdGV4cHIgZG91YmxlIGtDbGF3TW92ZURvd25WZWxvY2l0eSA9IDcuMDA7Citjb25zdGV4cHIgZG91YmxlIGtDbGF3TW92ZURvd25BY2NlbGVyYXRpb24gPSAxNS4wOworY29uc3RleHByIGRvdWJsZSBrQ2xhd01vdmVVcFZlbG9jaXR5ID0gOC4wOworY29uc3RleHByIGRvdWJsZSBrQ2xhd01vdmVVcEFjY2VsZXJhdGlvbiA9IDI1LjA7Cit9ICAvLyBuYW1lc3BhY2UKKworUGlja3VwQWN0b3I6OlBpY2t1cEFjdG9yKFBpY2t1cEFjdGlvblF1ZXVlR3JvdXAqIHF1ZXVlcykKKyAgICA6IGFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3RvckJhc2U8UGlja3VwQWN0aW9uUXVldWVHcm91cD4ocXVldWVzKSB7fQorCitib29sIFBpY2t1cEFjdG9yOjpSdW5BY3Rpb24oY29uc3QgUGlja3VwUGFyYW1zJiBwYXJhbXMpIHsKKyAgY29uc3RleHByIGRvdWJsZSBrQW5nbGVFcHNpbG9uID0gMC4xMDsKKyAgLy8gU3RhcnQgbGlmdGluZyB0aGUgdG90ZS4KKyAgeworICAgIGF1dG8gbWVzc2FnZSA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5NYWtlTWVzc2FnZSgpOworICAgIG1lc3NhZ2UtPmFuZ2xlID0gcGFyYW1zLnBpY2t1cF9hbmdsZTsKKyAgICBtZXNzYWdlLT5tYXhfdmVsb2NpdHkgPSBrQ2xhd1BpY2t1cFZlbG9jaXR5OworICAgIG1lc3NhZ2UtPm1heF9hY2NlbGVyYXRpb24gPSBrQ2xhd1BpY2t1cEFjY2VsZXJhdGlvbjsKKyAgICBtZXNzYWdlLT5hbmd1bGFyX3ZlbG9jaXR5ID0gMC4wOworICAgIG1lc3NhZ2UtPmludGFrZSA9IDAuMDsKKyAgICBtZXNzYWdlLT5yb2xsZXJzX2Nsb3NlZCA9IHRydWU7CisKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiU2VuZGluZyBjbGF3IGdvYWwiLCAqbWVzc2FnZSk7CisgICAgbWVzc2FnZS5TZW5kKCk7CisgIH0KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy5GZXRjaEFub3RoZXIoKTsKKyAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworICAgIGNvbnN0IGRvdWJsZSBjdXJyZW50X2FuZ2xlID0gY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPmFuZ2xlOworICAgIExPR19TVFJVQ1QoREVCVUcsICJHb3QgY2xhdyBzdGF0dXMiLCAqY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMpOworCisgICAgaWYgKGN1cnJlbnRfYW5nbGUgPiBwYXJhbXMuc3Vja19hbmdsZSB8fAorICAgICAgICA6OnN0ZDo6YWJzKGN1cnJlbnRfYW5nbGUgLSBwYXJhbXMucGlja3VwX2FuZ2xlKSA8IGtBbmdsZUVwc2lsb24pIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIE9uY2UgYWJvdmUgcGFyYW1zLnN1Y2tfYW5nbGUsIHN0YXJ0IHN1Y2tpbmcgd2hpbGUgbGlmdGluZy4KKyAgeworICAgIGF1dG8gbWVzc2FnZSA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5NYWtlTWVzc2FnZSgpOworICAgIG1lc3NhZ2UtPmFuZ2xlID0gcGFyYW1zLnBpY2t1cF9hbmdsZTsKKyAgICBtZXNzYWdlLT5tYXhfdmVsb2NpdHkgPSBrQ2xhd1BpY2t1cFZlbG9jaXR5OworICAgIG1lc3NhZ2UtPm1heF9hY2NlbGVyYXRpb24gPSBrQ2xhd1BpY2t1cEFjY2VsZXJhdGlvbjsKKyAgICBtZXNzYWdlLT5hbmd1bGFyX3ZlbG9jaXR5ID0gMC4wOworICAgIG1lc3NhZ2UtPmludGFrZSA9IHBhcmFtcy5pbnRha2Vfdm9sdGFnZTsKKyAgICBtZXNzYWdlLT5yb2xsZXJzX2Nsb3NlZCA9IHRydWU7CisKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiU2VuZGluZyBjbGF3IGdvYWwiLCAqbWVzc2FnZSk7CisgICAgbWVzc2FnZS5TZW5kKCk7CisgIH0KKworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisgICAgY29uc3QgZG91YmxlIGN1cnJlbnRfYW5nbGUgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+YW5nbGU7CisgICAgTE9HX1NUUlVDVChERUJVRywgIkdvdCBjbGF3IHN0YXR1cyIsICpjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cyk7CisKKyAgICBpZiAoOjpzdGQ6OmFicyhjdXJyZW50X2FuZ2xlIC0gcGFyYW1zLnBpY2t1cF9hbmdsZSkgPCBrQW5nbGVFcHNpbG9uKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHJlYWNoZWQgdGhlIHVwcGVyIGhlaWdodCwgY29tZSBiYWNrIGRvd24gd2hpbGUgaW50YWtpbmcuCisgIHsKKyAgICBhdXRvIG1lc3NhZ2UgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBtZXNzYWdlLT5hbmdsZSA9IHBhcmFtcy5zdWNrX2FuZ2xlX2ZpbmlzaDsKKyAgICBtZXNzYWdlLT5tYXhfdmVsb2NpdHkgPSBrQ2xhd01vdmVEb3duVmVsb2NpdHk7CisgICAgbWVzc2FnZS0+bWF4X2FjY2VsZXJhdGlvbiA9IGtDbGF3TW92ZURvd25BY2NlbGVyYXRpb247CisgICAgbWVzc2FnZS0+YW5ndWxhcl92ZWxvY2l0eSA9IDAuMDsKKyAgICBtZXNzYWdlLT5pbnRha2UgPSBwYXJhbXMuaW50YWtlX3ZvbHRhZ2U7CisgICAgbWVzc2FnZS0+cm9sbGVyc19jbG9zZWQgPSB0cnVlOworCisgICAgTE9HX1NUUlVDVChERUJVRywgIlNlbmRpbmcgY2xhdyBnb2FsIiwgKm1lc3NhZ2UpOworICAgIG1lc3NhZ2UuU2VuZCgpOworICB9CisKKyAgLy8gUHVsbCBpbiBmb3IgcGFyYW1zLmludGFrZV90aW1lLgorICA6OmFvczo6dGltZTo6VGltZSBlbmRfdGltZSA9CisgICAgICA6OmFvczo6dGltZTo6VGltZTo6Tm93KCkgKyBhb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcyhwYXJhbXMuaW50YWtlX3RpbWUpOworICB3aGlsZSAoIDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKSA8PSBlbmRfdGltZSkgeworICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kuVG9NU2VjKCksIDI1MDApOworICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBMaWZ0IHRoZSBjbGF3IGJhY2sgdXAgdG8gcGFjayB0aGUgYm94IGJhY2sgaW4uCisgIHsKKyAgICBhdXRvIG1lc3NhZ2UgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBtZXNzYWdlLT5hbmdsZSA9IHBhcmFtcy5waWNrdXBfZmluaXNoX2FuZ2xlOworICAgIG1lc3NhZ2UtPm1heF92ZWxvY2l0eSA9IGtDbGF3TW92ZVVwVmVsb2NpdHk7CisgICAgbWVzc2FnZS0+bWF4X2FjY2VsZXJhdGlvbiA9IGtDbGF3TW92ZVVwQWNjZWxlcmF0aW9uOworICAgIG1lc3NhZ2UtPmFuZ3VsYXJfdmVsb2NpdHkgPSAwLjA7CisgICAgbWVzc2FnZS0+aW50YWtlID0gcGFyYW1zLmludGFrZV92b2x0YWdlOworICAgIG1lc3NhZ2UtPnJvbGxlcnNfY2xvc2VkID0gdHJ1ZTsKKworICAgIExPR19TVFJVQ1QoREVCVUcsICJTZW5kaW5nIGNsYXcgZ29hbCIsICptZXNzYWdlKTsKKyAgICBtZXNzYWdlLlNlbmQoKTsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisgICAgY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMuRmV0Y2hBbm90aGVyKCk7CisgICAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBjb25zdCBkb3VibGUgY3VycmVudF9hbmdsZSA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLT5hbmdsZTsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiR290IGNsYXcgc3RhdHVzIiwgKmNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzKTsKKworICAgIGlmICg6OnN0ZDo6YWJzKGN1cnJlbnRfYW5nbGUgLSBwYXJhbXMucGlja3VwX2ZpbmlzaF9hbmdsZSkgPAorICAgICAgICBrQW5nbGVFcHNpbG9uKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBTdG9wIHRoZSBtb3RvcnMuLi4KKyAgeworICAgIGF1dG8gbWVzc2FnZSA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5NYWtlTWVzc2FnZSgpOworICAgIG1lc3NhZ2UtPmFuZ2xlID0gcGFyYW1zLnBpY2t1cF9maW5pc2hfYW5nbGU7CisgICAgbWVzc2FnZS0+bWF4X3ZlbG9jaXR5ID0ga0NsYXdNb3ZlVXBWZWxvY2l0eTsKKyAgICBtZXNzYWdlLT5tYXhfYWNjZWxlcmF0aW9uID0ga0NsYXdNb3ZlVXBBY2NlbGVyYXRpb247CisgICAgbWVzc2FnZS0+YW5ndWxhcl92ZWxvY2l0eSA9IDAuMDsKKyAgICBtZXNzYWdlLT5pbnRha2UgPSAwLjA7CisgICAgbWVzc2FnZS0+cm9sbGVyc19jbG9zZWQgPSB0cnVlOworCisgICAgTE9HX1NUUlVDVChERUJVRywgIlNlbmRpbmcgY2xhdyBnb2FsIiwgKm1lc3NhZ2UpOworICAgIG1lc3NhZ2UuU2VuZCgpOworICB9CisKKworICByZXR1cm4gdHJ1ZTsKK30KKworOjpzdGQ6OnVuaXF1ZV9wdHI8UGlja3VwQWN0aW9uPiBNYWtlUGlja3VwQWN0aW9uKGNvbnN0IFBpY2t1cFBhcmFtcyYgcGFyYW1zKSB7CisgIHJldHVybiA6OnN0ZDo6dW5pcXVlX3B0cjxQaWNrdXBBY3Rpb24+KAorICAgICAgbmV3IFBpY2t1cEFjdGlvbigmOjpmcmM5NzE6OmFjdG9yczo6cGlja3VwX2FjdGlvbiwgcGFyYW1zKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9waWNrdXBfYWN0b3IuaCBiL3kyMDE1L2FjdG9ycy9waWNrdXBfYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjA5NzE4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL3BpY2t1cF9hY3Rvci5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgWTIwMTVfQUNUT1JTX1BJQ0tVUF9BQ1RPUl9IXworI2RlZmluZSBZMjAxNV9BQ1RPUlNfUElDS1VQX0FDVE9SX0hfCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9waWNrdXBfYWN0aW9uLnEuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworY2xhc3MgUGlja3VwQWN0b3IKKyAgICA6IHB1YmxpYyBhb3M6OmNvbW1vbjo6YWN0aW9uczo6QWN0b3JCYXNlPFBpY2t1cEFjdGlvblF1ZXVlR3JvdXA+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFBpY2t1cEFjdG9yKFBpY2t1cEFjdGlvblF1ZXVlR3JvdXAgKnF1ZXVlcyk7CisKKyAgYm9vbCBSdW5BY3Rpb24oY29uc3QgUGlja3VwUGFyYW1zICZwYXJhbXMpIG92ZXJyaWRlOworfTsKKwordHlwZWRlZiBhb3M6OmNvbW1vbjo6YWN0aW9uczo6VHlwZWRBY3Rpb248UGlja3VwQWN0aW9uUXVldWVHcm91cD4gUGlja3VwQWN0aW9uOworCisvLyBNYWtlcyBhIG5ldyBQaWNrdXBBY3RvciBhY3Rpb24uCis6OnN0ZDo6dW5pcXVlX3B0cjxQaWNrdXBBY3Rpb24+IE1ha2VQaWNrdXBBY3Rpb24oY29uc3QgUGlja3VwUGFyYW1zICZwYXJhbXMpOworCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTVfQUNUT1JTX1BJQ0tVUF9BQ1RPUl9IXwpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL3BpY2t1cF9hY3Rvcl9tYWluLmNjIGIveTIwMTUvYWN0b3JzL3BpY2t1cF9hY3Rvcl9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMmM0ODgKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvcGlja3VwX2FjdG9yX21haW4uY2MKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL3BpY2t1cF9hY3Rpb24ucS5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9waWNrdXBfYWN0b3IuaCIKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyKiAvKmFyZ3YqLyBbXSkgeworICA6OmFvczo6SW5pdCgpOworCisgIGZyYzk3MTo6YWN0b3JzOjpQaWNrdXBBY3RvciBwaWNrdXAoJjo6ZnJjOTcxOjphY3RvcnM6OnBpY2t1cF9hY3Rpb24pOworICBwaWNrdXAuUnVuKCk7CisKKyAgOjphb3M6OkNsZWFudXAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc2NvcmVfYWN0aW9uLnEgYi95MjAxNS9hY3RvcnMvc2NvcmVfYWN0aW9uLnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxNDIxMAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9zY29yZV9hY3Rpb24ucQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGZyYzk3MS5hY3RvcnM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMucSI7CisKKy8vIFBhcmFtZXRlcnMgdG8gc2VuZCB3aXRoIHN0YXJ0Lgorc3RydWN0IFNjb3JlUGFyYW1zIHsKKyAgLy8gSWYgdHJ1ZSwgbW92ZSB0aGUgc3RhY2sgZmlyc3QuCisgIGJvb2wgbW92ZV90aGVfc3RhY2s7CisgIC8vIElmIHRydWUsIHBsYWNlIHRoZSBzdGFjayAocG9zc2libHkgYWZ0ZXIgbW92aW5nIGl0KS4KKyAgYm9vbCBwbGFjZV90aGVfc3RhY2s7CisKKyAgLy8gVE9ETyhCcmlhbik6IENvbW1lbnRzIChieSBzb21lYm9keSB3aG8ga25vd3Mgd2hhdCB0aGVzZSBhbGwgbWVhbikuCisgIGRvdWJsZSB1cHBlcl9tb3ZlX2hlaWdodDsKKyAgZG91YmxlIGJlZ2luX2hvcml6b250YWxfbW92ZV9oZWlnaHQ7CisgIGRvdWJsZSBob3Jpem9udGFsX21vdmVfdGFyZ2V0OworICBkb3VibGUgaG9yaXpvbnRhbF9zdGFydF9sb3dlcmluZzsKKyAgZG91YmxlIHBsYWNlX2hlaWdodDsKKyAgZG91YmxlIGhvbWVfbGlmdF9ob3Jpem9udGFsX3N0YXJ0X3Bvc2l0aW9uOworICBkb3VibGUgaG9tZV9yZXR1cm5faGVpZ2h0OworfTsKKworcXVldWVfZ3JvdXAgU2NvcmVBY3Rpb25RdWV1ZUdyb3VwIHsKKyAgaW1wbGVtZW50cyBhb3MuY29tbW9uLmFjdGlvbnMuQWN0aW9uUXVldWVHcm91cDsKKworICBtZXNzYWdlIEdvYWwgeworICAgIHVpbnQzMl90IHJ1bjsKKyAgICBTY29yZVBhcmFtcyBwYXJhbXM7CisgIH07CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBhb3MuY29tbW9uLmFjdGlvbnMuU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIFNjb3JlQWN0aW9uUXVldWVHcm91cCBzY29yZV9hY3Rpb247CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc2NvcmVfYWN0b3IuY2MgYi95MjAxNS9hY3RvcnMvc2NvcmVfYWN0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhMzk4ZgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9zY29yZV9hY3Rvci5jYwpAQCAtMCwwICsxLDI5NiBAQAorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9zY29yZV9hY3Rvci5oIgorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuaCIKKworI2luY2x1ZGUgInkyMDE1L2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5xLmgiCisKK3VzaW5nIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWU7CisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CituYW1lc3BhY2UgeworCitjb25zdCBkb3VibGUga1Nsb3dNYXhYVmVsb2NpdHkgPSAwLjgwOworY29uc3QgZG91YmxlIGtTbG93TWF4WVZlbG9jaXR5ID0gMC40MDsKK2NvbnN0IGRvdWJsZSBrRmFzdE1heFhWZWxvY2l0eSA9IDAuODA7Citjb25zdCBkb3VibGUga0Zhc3RNYXhZVmVsb2NpdHkgPSAwLjMwOworY29uc3QgZG91YmxlIGtSZWFsbHlGYXN0TWF4WFZlbG9jaXR5ID0gMS4wOworY29uc3QgZG91YmxlIGtSZWFsbHlGYXN0TWF4WVZlbG9jaXR5ID0gMC42OworCitjb25zdCBkb3VibGUga01heFhBY2NlbGVyYXRpb24gPSAwLjU7Citjb25zdCBkb3VibGUga01heFlBY2NlbGVyYXRpb24gPSAwLjc7Citjb25zdCBkb3VibGUga0xpZnRZQWNjZWxlcmF0aW9uID0gMi4wOworY29uc3QgZG91YmxlIGtMb3dlcllBY2NlbGVyYXRpb24gPSAyLjA7Citjb25zdCBkb3VibGUga0Zhc3RNYXhYQWNjZWxlcmF0aW9uID0gMS41OworY29uc3QgZG91YmxlIGtGYXN0TWF4WUFjY2VsZXJhdGlvbiA9IDEuNTsKK2NvbnN0IGRvdWJsZSBrU2xvd01heFhBY2NlbGVyYXRpb24gPSAwLjM7Citjb25zdCBkb3VibGUga1Nsb3dNYXhZQWNjZWxlcmF0aW9uID0gMC41OworCit9ICAvLyBuYW1lc3BhY2UKKworU2NvcmVBY3Rvcjo6U2NvcmVBY3RvcihTY29yZUFjdGlvblF1ZXVlR3JvdXAqIHF1ZXVlcykKKyAgICA6IGFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3RvckJhc2U8U2NvcmVBY3Rpb25RdWV1ZUdyb3VwPihxdWV1ZXMpLAorICAgICAga2luZW1hdGljc18oY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLnVwcGVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuZWxldmF0b3IubG93ZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5hcm0udXBwZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5hcm0ubG93ZXJfbGltaXQpIHt9CisKK2Jvb2wgU2NvcmVBY3Rvcjo6UnVuQWN0aW9uKGNvbnN0IFNjb3JlUGFyYW1zJiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5tb3ZlX3RoZV9zdGFjaykgeworICAgIExPRyhJTkZPLCAibW92aW5nIHN0YWNrXG4iKTsKKyAgICBpZiAoIU1vdmVTdGFja0ludG9Qb3NpdGlvbihwYXJhbXMpKSByZXR1cm4gZmFsc2U7CisgICAgTE9HKElORk8sICJkb25lIG1vdmluZyBzdGFja1xuIik7CisgICAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAocGFyYW1zLnBsYWNlX3RoZV9zdGFjaykgeworICAgIExPRyhJTkZPLCAicGxhY2luZyBzdGFja1xuIik7CisgICAgaWYgKCFQbGFjZVRoZVN0YWNrKHBhcmFtcykpIHJldHVybiBmYWxzZTsKKyAgICBMT0coSU5GTywgImRvbmUgcGxhY2luZyBzdGFja1xuIik7CisgICAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTY29yZUFjdG9yOjpNb3ZlU3RhY2tJbnRvUG9zaXRpb24oY29uc3QgU2NvcmVQYXJhbXMmIHBhcmFtcykgeworICAvLyBNb3ZlIHRoZSBmcmlkZ2UgdXAgYSBsaXR0bGUgYml0LgorICBpZiAoIVNlbmRHb2FsKDAuMCwgcGFyYW1zLnVwcGVyX21vdmVfaGVpZ2h0LCB0cnVlLCBrU2xvd01heFhWZWxvY2l0eSwKKyAgICAgICAgICAgICAgICBrU2xvd01heFlWZWxvY2l0eSwga01heFhBY2NlbGVyYXRpb24sIGtMaWZ0WUFjY2VsZXJhdGlvbikpIHsKKyAgICBMT0coRVJST1IsICJTZW5kaW5nIGZyaWRnZSBtZXNzYWdlIGZhaWxlZC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisgICAgOjphb3M6OnRpbWU6OlBoYXNlZExvb3BYTVMoOjphb3M6OmNvbnRyb2xzOjprTG9vcEZyZXF1ZW5jeS5Ub01TZWMoKSwgMjUwMCk7CisgICAgaWYgKFNob3VsZENhbmNlbCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBNb3ZlIG9uIHdoZW4gaXQgaXMgY2xlYXIgb2YgdGhlIHRvdGUga25vYnMuCisgICAgaWYgKEN1cnJlbnRHb2FsSGVpZ2h0KCkgPiBwYXJhbXMuYmVnaW5faG9yaXpvbnRhbF9tb3ZlX2hlaWdodCkgeworICAgICAgTE9HKElORk8sICJtb3Zpbmcgb24gdG8gaG9yaXpvbnRhbCBtb3ZlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIE1vdmUgdGhlIGZyaWRnZSBvdXQuCisgIGlmICghU2VuZEdvYWwocGFyYW1zLmhvcml6b250YWxfbW92ZV90YXJnZXQsCisgICAgICAgICAgICAgICAgcGFyYW1zLmJlZ2luX2hvcml6b250YWxfbW92ZV9oZWlnaHQsIHRydWUsIGtTbG93TWF4WFZlbG9jaXR5LAorICAgICAgICAgICAgICAgIGtGYXN0TWF4WVZlbG9jaXR5LCBrU2xvd01heFhBY2NlbGVyYXRpb24sCisgICAgICAgICAgICAgICAga1Nsb3dNYXhZQWNjZWxlcmF0aW9uKSkgeworICAgIExPRyhFUlJPUiwgIlNlbmRpbmcgZnJpZGdlIG1lc3NhZ2UgZmFpbGVkLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBzdGFydGVkX2xvd2VyaW5nID0gZmFsc2U7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUyg6OmFvczo6Y29udHJvbHM6OmtMb29wRnJlcXVlbmN5LlRvTVNlYygpLCAyNTAwKTsKKyAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBSb3VuZCB0aGUgbW92aW5nIG91dCBjb3JuZXIgYW5kIHN0YXJ0IHNldHRpbmcgZG93bi4KKyAgICBpZiAocGFyYW1zLnBsYWNlX3RoZV9zdGFjayAmJiAhc3RhcnRlZF9sb3dlcmluZykgeworICAgICAgaWYgKEN1cnJlbnRHb2FsWCgpIDwgcGFyYW1zLmhvcml6b250YWxfc3RhcnRfbG93ZXJpbmcpIHsKKyAgICAgICAgaWYgKCFTZW5kR29hbChwYXJhbXMuaG9yaXpvbnRhbF9tb3ZlX3RhcmdldCwgcGFyYW1zLnBsYWNlX2hlaWdodCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBrU2xvd01heFhWZWxvY2l0eSwga0Zhc3RNYXhZVmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgICAga1Nsb3dNYXhYQWNjZWxlcmF0aW9uLCBrTWF4WUFjY2VsZXJhdGlvbikpIHsKKyAgICAgICAgICBMT0coRVJST1IsICJTZW5kaW5nIGZyaWRnZSBtZXNzYWdlIGZhaWxlZC5cbiIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGFydGVkX2xvd2VyaW5nID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTmVhckhvcml6b250YWxHb2FsKHBhcmFtcy5ob3Jpem9udGFsX21vdmVfdGFyZ2V0KSkgeworICAgICAgTE9HKElORk8sICJyZWFjaGVkIGdvYWxcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKFNob3VsZENhbmNlbCgpKSByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTY29yZUFjdG9yOjpQbGFjZVRoZVN0YWNrKGNvbnN0IFNjb3JlUGFyYW1zJiBwYXJhbXMpIHsKKyAgLy8gT25jZSB0aGUgZnJpZGdlIGlzIHdheSBvdXQsIHB1dCBpdCBvbiB0aGUgZ3JvdW5kLgorICBpZiAoIVNlbmRHb2FsKHBhcmFtcy5ob3Jpem9udGFsX21vdmVfdGFyZ2V0LCBwYXJhbXMucGxhY2VfaGVpZ2h0LCB0cnVlLAorICAgICAgICAgICAgICAgIGtGYXN0TWF4WFZlbG9jaXR5LCBrRmFzdE1heFlWZWxvY2l0eSwga01heFhBY2NlbGVyYXRpb24sCisgICAgICAgICAgICAgICAga0xvd2VyWUFjY2VsZXJhdGlvbikpIHsKKyAgICBMT0coRVJST1IsICJTZW5kaW5nIGZyaWRnZSBtZXNzYWdlIGZhaWxlZC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisgICAgOjphb3M6OnRpbWU6OlBoYXNlZExvb3BYTVMoOjphb3M6OmNvbnRyb2xzOjprTG9vcEZyZXF1ZW5jeS5Ub01TZWMoKSwgMjUwMCk7CisgICAgaWYgKFNob3VsZENhbmNlbCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoTmVhckdvYWwocGFyYW1zLmhvcml6b250YWxfbW92ZV90YXJnZXQsIHBhcmFtcy5wbGFjZV9oZWlnaHQpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBSZWxlYXNlIGFuZCBnaXZlIHRoZSBncmFiZXJzIGEgY2hhbmNlIHRvIGdldCBvdXQgb2YgdGhlIHdheS4KKyAgaWYgKCFTZW5kR29hbChwYXJhbXMuaG9yaXpvbnRhbF9tb3ZlX3RhcmdldCwgcGFyYW1zLnBsYWNlX2hlaWdodCwgZmFsc2UsCisgICAgICAgICAgICAgICAga0Zhc3RNYXhYVmVsb2NpdHksIGtGYXN0TWF4WVZlbG9jaXR5LCBrTWF4WEFjY2VsZXJhdGlvbiwKKyAgICAgICAgICAgICAgICBrTG93ZXJZQWNjZWxlcmF0aW9uKSkgeworICAgIExPRyhFUlJPUiwgIlNlbmRpbmcgZnJpZGdlIG1lc3NhZ2UgZmFpbGVkLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghV2FpdE9yQ2FuY2VsKDo6YW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMoMC4xKSkpIHJldHVybiB0cnVlOworCisgIC8vIEdvIGJhY2sgdG8gdGhlIGhvbWUgcG9zaXRpb24uCisgIGlmICghU2VuZEdvYWwoMC4wLCBwYXJhbXMucGxhY2VfaGVpZ2h0LCBmYWxzZSwga1JlYWxseUZhc3RNYXhYVmVsb2NpdHksCisgICAgICAgICAgICAgICAga1JlYWxseUZhc3RNYXhZVmVsb2NpdHksIGtGYXN0TWF4WEFjY2VsZXJhdGlvbiwKKyAgICAgICAgICAgICAgICBrRmFzdE1heFlBY2NlbGVyYXRpb24pKSB7CisgICAgTE9HKEVSUk9SLCAiU2VuZGluZyBmcmlkZ2UgbWVzc2FnZSBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGhhc19saWZ0ZWQgPSBmYWxzZTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUyg6OmFvczo6Y29udHJvbHM6OmtMb29wRnJlcXVlbmN5LlRvTVNlYygpLCAyNTAwKTsKKyAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICghaGFzX2xpZnRlZCAmJgorICAgICAgICBDdXJyZW50R29hbFgoKSA+IHBhcmFtcy5ob21lX2xpZnRfaG9yaXpvbnRhbF9zdGFydF9wb3NpdGlvbikgeworICAgICAgaWYgKCFTZW5kR29hbCgwLjAsIHBhcmFtcy5ob21lX3JldHVybl9oZWlnaHQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBrUmVhbGx5RmFzdE1heFhWZWxvY2l0eSwga1JlYWxseUZhc3RNYXhZVmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgIGtGYXN0TWF4WEFjY2VsZXJhdGlvbiwga0Zhc3RNYXhZQWNjZWxlcmF0aW9uKSkgeworICAgICAgICBMT0coRVJST1IsICJTZW5kaW5nIGZyaWRnZSBtZXNzYWdlIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBoYXNfbGlmdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoTmVhckdvYWwoMC4wLCBwYXJhbXMuaG9tZV9yZXR1cm5faGVpZ2h0KSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2RvdWJsZSBTY29yZUFjdG9yOjpDdXJyZW50SGVpZ2h0KCkgeworICBmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIGlmICghZnJpZGdlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgIExPRyhFUlJPUiwgIlJlYWRpbmcgZnJvbSBmcmlkZ2Ugc3RhdHVzIHF1ZXVlIGZhaWxlZC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIDo6YW9zOjp1dGlsOjpFbGV2YXRvckFybUtpbmVtYXRpY3M6OktpbmVtYXRpY1Jlc3VsdCByZXN1bHRzOworICBraW5lbWF0aWNzXy5Gb3J3YXJkS2luZW1hdGljKGZyaWRnZV9xdWV1ZS5zdGF0dXMtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmlkZ2VfcXVldWUuc3RhdHVzLT5hbmdsZSwgMC4wLCAwLjAsICZyZXN1bHRzKTsKKworICByZXR1cm4gcmVzdWx0cy5mcmlkZ2VfaDsKK30KKworZG91YmxlIFNjb3JlQWN0b3I6OkN1cnJlbnRHb2FsSGVpZ2h0KCkgeworICBmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIGlmICghZnJpZGdlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgIExPRyhFUlJPUiwgIlJlYWRpbmcgZnJvbSBmcmlkZ2Ugc3RhdHVzIHF1ZXVlIGZhaWxlZC5cbiIpOworICAgIHJldHVybiAwLjA7CisgIH0KKworICA6OmFvczo6dXRpbDo6RWxldmF0b3JBcm1LaW5lbWF0aWNzOjpLaW5lbWF0aWNSZXN1bHQgcmVzdWx0czsKKyAga2luZW1hdGljc18uRm9yd2FyZEtpbmVtYXRpYyhmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX2FuZ2xlLCAwLjAsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0cyk7CisKKyAgcmV0dXJuIHJlc3VsdHMuZnJpZGdlX2g7Cit9CisKK2RvdWJsZSBTY29yZUFjdG9yOjpDdXJyZW50WCgpIHsKKyAgZnJpZGdlX3F1ZXVlLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBpZiAoIWZyaWRnZV9xdWV1ZS5zdGF0dXMuZ2V0KCkpIHsKKyAgICBMT0coRVJST1IsICJSZWFkaW5nIGZyb20gZnJpZGdlIHN0YXR1cyBxdWV1ZSBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gZnJpZGdlX3F1ZXVlLnN0YXR1cy0+eDsKK30KKworZG91YmxlIFNjb3JlQWN0b3I6OkN1cnJlbnRHb2FsWCgpIHsKKyAgZnJpZGdlX3F1ZXVlLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBpZiAoIWZyaWRnZV9xdWV1ZS5zdGF0dXMuZ2V0KCkpIHsKKyAgICBMT0coRVJST1IsICJSZWFkaW5nIGZyb20gZnJpZGdlIHN0YXR1cyBxdWV1ZSBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm4gMC4wOworICB9CisKKyAgcmV0dXJuIGZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfeDsKK30KKworYm9vbCBTY29yZUFjdG9yOjpTZW5kR29hbChkb3VibGUgeCwgZG91YmxlIHksIGJvb2wgZ3JhYmJlcnNfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1heF94X3ZlbG9jaXR5LCBkb3VibGUgbWF4X3lfdmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhfeF9hY2NlbGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhfeV9hY2NlbGVyYXRpb24pIHsKKyAgYXV0byBuZXdfZnJpZGdlX2dvYWwgPSBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuZ29hbC5NYWtlTWVzc2FnZSgpOworICBuZXdfZnJpZGdlX2dvYWwtPnggPSB4OworICBuZXdfZnJpZGdlX2dvYWwtPnkgPSB5OworICBuZXdfZnJpZGdlX2dvYWwtPnByb2ZpbGluZ190eXBlID0gMTsKKyAgbmV3X2ZyaWRnZV9nb2FsLT5hbmd1bGFyX3ZlbG9jaXR5ID0gMC4wOworICBuZXdfZnJpZGdlX2dvYWwtPnZlbG9jaXR5ID0gMC4wOworICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLnRvcF9mcm9udCA9IGdyYWJiZXJzX2VuYWJsZWQ7CisgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMudG9wX2JhY2sgPSBncmFiYmVyc19lbmFibGVkOworICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLmJvdHRvbV9mcm9udCA9IGdyYWJiZXJzX2VuYWJsZWQ7CisgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMuYm90dG9tX2JhY2sgPSBncmFiYmVyc19lbmFibGVkOworICBuZXdfZnJpZGdlX2dvYWwtPm1heF94X3ZlbG9jaXR5ID0gbWF4X3hfdmVsb2NpdHk7CisgIG5ld19mcmlkZ2VfZ29hbC0+bWF4X3lfdmVsb2NpdHkgPSBtYXhfeV92ZWxvY2l0eTsKKyAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfeF9hY2NlbGVyYXRpb24gPSBtYXhfeF9hY2NlbGVyYXRpb247CisgIG5ld19mcmlkZ2VfZ29hbC0+bWF4X3lfYWNjZWxlcmF0aW9uID0gbWF4X3lfYWNjZWxlcmF0aW9uOworICBMT0dfU1RSVUNUKElORk8sICJzZW5kaW5nIGZyaWRnZSBnb2FsIiwgKm5ld19mcmlkZ2VfZ29hbCk7CisKKyAgcmV0dXJuIG5ld19mcmlkZ2VfZ29hbC5TZW5kKCk7Cit9CisKK2Jvb2wgU2NvcmVBY3Rvcjo6TmVhckhvcml6b250YWxHb2FsKGRvdWJsZSB4KSB7CisgIGZyaWRnZV9xdWV1ZS5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgaWYgKCFmcmlkZ2VfcXVldWUuc3RhdHVzLmdldCgpKSB7CisgICAgTE9HKEVSUk9SLCAiUmVhZGluZyBmcm9tIGZyaWRnZSBzdGF0dXMgcXVldWUgZmFpbGVkLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgOjphb3M6OnV0aWw6OkVsZXZhdG9yQXJtS2luZW1hdGljczo6S2luZW1hdGljUmVzdWx0IHJlc3VsdHM7CisgIDo6YW9zOjp1dGlsOjpFbGV2YXRvckFybUtpbmVtYXRpY3M6OktpbmVtYXRpY1Jlc3VsdCBnb2FsX3Jlc3VsdHM7CisgIGtpbmVtYXRpY3NfLkZvcndhcmRLaW5lbWF0aWMoZnJpZGdlX3F1ZXVlLnN0YXR1cy0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyaWRnZV9xdWV1ZS5zdGF0dXMtPmFuZ2xlLCAwLjAsIDAuMCwgJnJlc3VsdHMpOworICBraW5lbWF0aWNzXy5Gb3J3YXJkS2luZW1hdGljKGZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfYW5nbGUsIDAuMCwgMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnb2FsX3Jlc3VsdHMpOworCisgIHJldHVybiAoOjpzdGQ6OmFicyhyZXN1bHRzLmZyaWRnZV94IC0geCkgPCAwLjAyMCAmJgorICAgICAgICAgIDo6c3RkOjphYnMoZ29hbF9yZXN1bHRzLmZyaWRnZV94IC0geCkgPCAwLjAwMDEpOworfQorCitib29sIFNjb3JlQWN0b3I6Ok5lYXJHb2FsKGRvdWJsZSB4LCBkb3VibGUgeSkgeworICBmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgIGlmICghZnJpZGdlX3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgIExPRyhFUlJPUiwgIlJlYWRpbmcgZnJvbSBmcmlkZ2Ugc3RhdHVzIHF1ZXVlIGZhaWxlZC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IGF1dG8gJnN0YXR1cyA9ICpmcmlkZ2VfcXVldWUuc3RhdHVzOworICByZXR1cm4gKDo6c3RkOjphYnMoc3RhdHVzLnggLSB4KSA8IDAuMDIwICYmCisgICAgICAgICAgOjpzdGQ6OmFicyhzdGF0dXMueSAtIHkpIDwgMC4wMjAgJiYKKyAgICAgICAgICA6OnN0ZDo6YWJzKHN0YXR1cy5nb2FsX3ggLSB4KSA8IDAuMDAwMSAmJgorICAgICAgICAgIDo6c3RkOjphYnMoc3RhdHVzLmdvYWxfeSAtIHkpIDwgMC4wMDAxKTsKK30KKworOjpzdGQ6OnVuaXF1ZV9wdHI8U2NvcmVBY3Rpb24+IE1ha2VTY29yZUFjdGlvbihjb25zdCBTY29yZVBhcmFtcyYgcGFyYW1zKSB7CisgIHJldHVybiA6OnN0ZDo6dW5pcXVlX3B0cjxTY29yZUFjdGlvbj4oCisgICAgICBuZXcgU2NvcmVBY3Rpb24oJjo6ZnJjOTcxOjphY3RvcnM6OnNjb3JlX2FjdGlvbiwgcGFyYW1zKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9zY29yZV9hY3Rvci5oIGIveTIwMTUvYWN0b3JzL3Njb3JlX2FjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZDcxZgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9zY29yZV9hY3Rvci5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgWTIwMTVfQUNUT1JTX1NDT1JFX0FDVE9SX0hfCisjZGVmaW5lIFkyMDE1X0FDVE9SU19TQ09SRV9BQ1RPUl9IXworCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS91dGlsL2tpbmVtYXRpY3MuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc2NvcmVfYWN0aW9uLnEuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworY2xhc3MgU2NvcmVBY3RvcgorICAgIDogcHVibGljIDo6YW9zOjpjb21tb246OmFjdGlvbnM6OkFjdG9yQmFzZTxTY29yZUFjdGlvblF1ZXVlR3JvdXA+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNjb3JlQWN0b3IoU2NvcmVBY3Rpb25RdWV1ZUdyb3VwICpxdWV1ZXMpOworCisgIGJvb2wgUnVuQWN0aW9uKGNvbnN0IFNjb3JlUGFyYW1zICZwYXJhbXMpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKworICA6OmFvczo6dXRpbDo6RWxldmF0b3JBcm1LaW5lbWF0aWNzIGtpbmVtYXRpY3NfOworICBib29sIE5lYXJHb2FsKGRvdWJsZSB4LCBkb3VibGUgeSk7CisgIGJvb2wgTmVhckhvcml6b250YWxHb2FsKGRvdWJsZSB4KTsKKyAgYm9vbCBQbGFjZVRoZVN0YWNrKGNvbnN0IFNjb3JlUGFyYW1zICZwYXJhbXMpOworICBib29sIE1vdmVTdGFja0ludG9Qb3NpdGlvbihjb25zdCBTY29yZVBhcmFtcyAmcGFyYW1zKTsKKyAgYm9vbCBTZW5kR29hbChkb3VibGUgeCwgZG91YmxlIHksIGJvb2wgZ3JhYmJlcnNfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICBkb3VibGUgbWF4X3hfdmVsb2NpdHksIGRvdWJsZSBtYXhfeV92ZWxvY2l0eSwKKyAgICAgICAgICAgICAgICBkb3VibGUgbWF4X3hfYWNjZWxlcmF0aW9uLCBkb3VibGUgbWF4X3lfYWNjZWxlcmF0aW9uKTsKKyAgZG91YmxlIEN1cnJlbnRIZWlnaHQoKTsKKyAgZG91YmxlIEN1cnJlbnRHb2FsSGVpZ2h0KCk7CisgIGRvdWJsZSBDdXJyZW50WCgpOworICBkb3VibGUgQ3VycmVudEdvYWxYKCk7Cit9OworCit0eXBlZGVmIGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxTY29yZUFjdGlvblF1ZXVlR3JvdXA+IFNjb3JlQWN0aW9uOworCisvLyBNYWtlcyBhIG5ldyBTY29yZUFjdG9yIGFjdGlvbi4KKzo6c3RkOjp1bmlxdWVfcHRyPFNjb3JlQWN0aW9uPiBNYWtlU2NvcmVBY3Rpb24oY29uc3QgU2NvcmVQYXJhbXMgJnBhcmFtcyk7CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmCmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc2NvcmVfYWN0b3JfbWFpbi5jYyBiL3kyMDE1L2FjdG9ycy9zY29yZV9hY3Rvcl9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTQ5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvc2NvcmVfYWN0b3JfbWFpbi5jYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc2NvcmVfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc2NvcmVfYWN0b3IuaCIKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyKiAvKmFyZ3YqLyBbXSkgeworICA6OmFvczo6SW5pdCgpOworCisgIGZyYzk3MTo6YWN0b3JzOjpTY29yZUFjdG9yIHNjb3JlKCY6OmZyYzk3MTo6YWN0b3JzOjpzY29yZV9hY3Rpb24pOworICBzY29yZS5SdW4oKTsKKworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9zY29yZV9hY3Rvcl90ZXN0LmNjIGIveTIwMTUvYWN0b3JzL3Njb3JlX2FjdG9yX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5MWYwOQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9zY29yZV9hY3Rvcl90ZXN0LmNjCkBAIC0wLDAgKzEsOTggQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWVfdGVzdHV0aWxzLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL3Njb3JlX2FjdGlvbi5xLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL3Njb3JlX2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy90ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50LmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBhY3RvcnMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBTY29yZUFjdGlvblRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFNjb3JlQWN0aW9uVGVzdCgpIHsKKyAgICBmcmM5NzE6OmFjdG9yczo6c2NvcmVfYWN0aW9uLmdvYWwuQ2xlYXIoKTsKKyAgICBmcmM5NzE6OmFjdG9yczo6c2NvcmVfYWN0aW9uLnN0YXR1cy5DbGVhcigpOworICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMuQ2xlYXIoKTsKKyAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuZ29hbC5DbGVhcigpOworICB9CisKKyAgdmlydHVhbCB+U2NvcmVBY3Rpb25UZXN0KCkgeworICAgIGZyYzk3MTo6YWN0b3JzOjpzY29yZV9hY3Rpb24uZ29hbC5DbGVhcigpOworICAgIGZyYzk3MTo6YWN0b3JzOjpzY29yZV9hY3Rpb24uc3RhdHVzLkNsZWFyKCk7CisgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5DbGVhcigpOworICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5nb2FsLkNsZWFyKCk7CisgIH0KKworICAvLyBCcmluZyB1cCBhbmQgZG93biBDb3JlLgorICA6OmFvczo6Y29tbW9uOjp0ZXN0aW5nOjpHbG9iYWxDb3JlSW5zdGFuY2UgbXlfY29yZTsKK307CisKKy8vIFRlc3RzIHRoYXQgY2FuY2VsIHN0b3BzIG5vdCBvbmx5IHRoZSBzY29yZSBhY3Rpb24sIGJ1dCBhbHNvIHRoZSB1bmRlcmx5aW5nCisvLyBwcm9maWxlIGFjdGlvbi4KK1RFU1RfRihTY29yZUFjdGlvblRlc3QsIFBsYWNlVGhlU3RhY2tDYW5jZWwpIHsKKyAgU2NvcmVBY3RvciBzY29yZSgmZnJjOTcxOjphY3RvcnM6OnNjb3JlX2FjdGlvbik7CisKKyAgZnJjOTcxOjphY3RvcnM6OnNjb3JlX2FjdGlvbi5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnJ1bih0cnVlKS5TZW5kKCk7CisKKyAgLy8gVGVsbCBpdCB0aGUgZnJpZGdlIGlzIHplcm9lZC4KKyAgQVNTRVJUX1RSVUUoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgLnplcm9lZCh0cnVlKQorICAgICAgICAgICAgICAgICAgLmFuZ2xlKDAuMCkKKyAgICAgICAgICAgICAgICAgIC5oZWlnaHQoMC4wKQorICAgICAgICAgICAgICAgICAgLlNlbmQoKSk7CisKKyAgLy8gZG8gdGhlIGFjdGlvbiBhbmQgaXQgd2lsbCBwb3N0IHRvIHRoZSBnb2FsIHF1ZXVlCisgIHNjb3JlLldhaXRGb3JBY3Rpb25SZXF1ZXN0KCk7CisKKyAgLy8gdGhlIGFjdGlvbiBoYXMgc3RhcnRlZCwgc28gbm93IGNhbmNlbCBpdCBhbmQgaXQgc2hvdWxkIGNhbmNlbAorICAvLyB0aGUgdW5kZXJseWluZyBwcm9maWxlCisgIGZyYzk3MTo6YWN0b3JzOjpzY29yZV9hY3Rpb24uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5ydW4oZmFsc2UpLlNlbmQoKTsKKworICAvLyBsZXQgdGhlIGFjdGlvbiBzdGFydCBydW5uaW5nLCBpZiB3ZSByZXR1cm4gZnJvbSB0aGlzIGNhbGwgaXQgaGFzIHdvcmtlZC4KKyAgY29uc3QgU2NvcmVQYXJhbXMgcGFyYW1zID0ge3RydWUsIHRydWUsIDAuMTQsIDAuMTMsIC0wLjcsIC0wLjcsIC0wLjEwLCAtMC41LCAwLjF9OworICBzY29yZS5SdW5BY3Rpb24ocGFyYW1zKTsKKworICBTVUNDRUVEKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgY2FuY2VsIHN0b3BzIG5vdCBvbmx5IHRoZSBzY29yZSBhY3Rpb24sIGJ1dCBhbHNvIHRoZSB1bmRlcmx5aW5nCisvLyBwcm9maWxlIGFjdGlvbi4KK1RFU1RfRihTY29yZUFjdGlvblRlc3QsIE1vdmVTdGFja0ludG9Qb3NpdGlvbkNhbmNlbCkgeworICBTY29yZUFjdG9yIHNjb3JlKCZmcmM5NzE6OmFjdG9yczo6c2NvcmVfYWN0aW9uKTsKKworICBmcmM5NzE6OmFjdG9yczo6c2NvcmVfYWN0aW9uLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkucnVuKHRydWUpLlNlbmQoKTsKKworICAvLyBUZWxsIGl0IHRoZSBmcmlkZ2UgaXMgemVyb2VkLgorICBBU1NFUlRfVFJVRShjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAuemVyb2VkKHRydWUpCisgICAgICAgICAgICAgICAgICAuYW5nbGUoMC4wKQorICAgICAgICAgICAgICAgICAgLmhlaWdodCgwLjApCisgICAgICAgICAgICAgICAgICAuU2VuZCgpKTsKKworICAvLyBkbyB0aGUgYWN0aW9uIGFuZCBpdCB3aWxsIHBvc3QgdG8gdGhlIGdvYWwgcXVldWUKKyAgc2NvcmUuV2FpdEZvckFjdGlvblJlcXVlc3QoKTsKKworICAvLyB0aGUgYWN0aW9uIGhhcyBzdGFydGVkLCBzbyBub3cgY2FuY2VsIGl0IGFuZCBpdCBzaG91bGQgY2FuY2VsCisgIC8vIHRoZSB1bmRlcmx5aW5nIHByb2ZpbGUKKyAgZnJjOTcxOjphY3RvcnM6OnNjb3JlX2FjdGlvbi5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnJ1bihmYWxzZSkuU2VuZCgpOworCisgIC8vIGxldCB0aGUgYWN0aW9uIHN0YXJ0IHJ1bm5pbmcsIGlmIHdlIHJldHVybiBmcm9tIHRoaXMgY2FsbCBpdCBoYXMgd29ya2VkLgorICBjb25zdCBTY29yZVBhcmFtcyBwYXJhbXMgPSB7ZmFsc2UsIHRydWUsIDAuMTQsIDAuMTMsIC0wLjcsIC0wLjcsIC0wLjEwLCAtMC41LCAwLjF9OworICBzY29yZS5SdW5BY3Rpb24ocGFyYW1zKTsKKworICBTVUNDRUVEKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc3RhY2tfYWN0aW9uLnEgYi95MjAxNS9hY3RvcnMvc3RhY2tfYWN0aW9uLnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzODliOAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9zdGFja19hY3Rpb24ucQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGZyYzk3MS5hY3RvcnM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMucSI7CitpbXBvcnQgInkyMDE1L2FjdG9ycy9zdGFja19hY3Rpb25fcGFyYW1zLnEiOworCitxdWV1ZV9ncm91cCBTdGFja0FjdGlvblF1ZXVlR3JvdXAgeworICBpbXBsZW1lbnRzIGFvcy5jb21tb24uYWN0aW9ucy5BY3Rpb25RdWV1ZUdyb3VwOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgdWludDMyX3QgcnVuOworICAgIFN0YWNrUGFyYW1zIHBhcmFtczsKKyAgfTsKKworICBxdWV1ZSBHb2FsIGdvYWw7CisgIHF1ZXVlIGFvcy5jb21tb24uYWN0aW9ucy5TdGF0dXMgc3RhdHVzOworfTsKKworcXVldWVfZ3JvdXAgU3RhY2tBY3Rpb25RdWV1ZUdyb3VwIHN0YWNrX2FjdGlvbjsKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9zdGFja19hY3Rpb25fcGFyYW1zLnEgYi95MjAxNS9hY3RvcnMvc3RhY2tfYWN0aW9uX3BhcmFtcy5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NThmN2QKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvc3RhY2tfYWN0aW9uX3BhcmFtcy5xCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgZnJjOTcxLmFjdG9yczsKKworLy8gUGFyYW1ldGVycyB0byBzZW5kIHdpdGggc3RhcnQuCitzdHJ1Y3QgU3RhY2tQYXJhbXMgeworICAvLyBJZiB0cnVlLCBkb24ndCBncmFiIHRoZSBsb3dlciB0b3RlIGFmdGVyIGxvd2VyaW5nLgorICBib29sIG9ubHlfcGxhY2U7CisKKyAgLy8gVGhlIGFuZ2xlIHRvIG1vdmUgdGhlIGFybSB0byB3aGlsZSBsb3dlcmluZyBpdC4KKyAgZG91YmxlIGFybV9jbGVhcmFuY2U7CisKKyAgZG91YmxlIGNsYXdfb3V0X2FuZ2xlOworICAvLyBUaGUgaGVpZ2h0IGp1c3QgYWJvdmUgdGhlIGJveCB0byBtb3ZlIGJlZm9yZSBsb3dlcmluZy4KKyAgZG91YmxlIG92ZXJfYm94X2JlZm9yZV9wbGFjZV9oZWlnaHQ7CisKKyAgLy8gQm90dG9tIHBvc2l0aW9uLgorICBkb3VibGUgYm90dG9tOworfTsKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9zdGFja19hY3Rvci5jYyBiL3kyMDE1L2FjdG9ycy9zdGFja19hY3Rvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkwMThmCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL3N0YWNrX2FjdG9yLmNjCkBAIC0wLDAgKzEsOTYgQEAKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3IuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9waGFzZWRfbG9vcC5oIgorCisjaW5jbHVkZSAieTIwMTUvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucS5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBhY3RvcnMgeworbmFtZXNwYWNlIHsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtBcm1XaXRoU3RhY2tNb3ZlezEuNzUsIDQuMjB9OworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga1Nsb3dBcm1Nb3ZlezEuMywgMS40fTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtTbG93RWxldmF0b3JNb3ZlezEuMCwgMy4wfTsKKworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0Zhc3RBcm1Nb3ZlezAuOCwgNC4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtGYXN0RWxldmF0b3JNb3ZlezEuMiwgNS4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtSZWFsbHlGYXN0RWxldmF0b3JNb3ZlezEuMiwgNi4wfTsKK30gIC8vIG5hbWVzcGFjZQorCitTdGFja0FjdG9yOjpTdGFja0FjdG9yKFN0YWNrQWN0aW9uUXVldWVHcm91cCAqcXVldWVzKQorICAgIDogRnJpZGdlQWN0b3JCYXNlPFN0YWNrQWN0aW9uUXVldWVHcm91cD4ocXVldWVzKSB7fQorCitib29sIFN0YWNrQWN0b3I6OlJ1bkFjdGlvbihjb25zdCBTdGFja1BhcmFtcyAmcGFyYW1zKSB7CisgIGNvbnN0IGF1dG8gJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisKKyAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBpZiAoIWNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMuZ2V0KCkpIHsKKyAgICBMT0coRVJST1IsICJHb3Qgbm8gZnJpZGdlIHN0YXR1cyBwYWNrZXQuXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJZiB3ZSBhcmUgcmVhbGx5IGhpZ2gsIHByb2JhYmx5IGhhdmUgYSBjYW4uICBNb3ZlIG92ZXIgYmVmb3JlIGRvd24uCisgIGlmIChjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX2hlaWdodCA+CisgICAgICBwYXJhbXMub3Zlcl9ib3hfYmVmb3JlX3BsYWNlX2hlaWdodCArIDAuMSkgeworICAgIC8vIFNldCB0aGUgY3VycmVudCBzdGFjayBkb3duIG9uIHRvcCBvZiB0aGUgYm90dG9tIGJveC4KKyAgICBEb0ZyaWRnZVByb2ZpbGUoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF9oZWlnaHQsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAga1Nsb3dFbGV2YXRvck1vdmUsIGtBcm1XaXRoU3RhY2tNb3ZlLCB0cnVlKTsKKyAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gU2V0IHRoZSBjdXJyZW50IHN0YWNrIGRvd24gb24gdG9wIG9mIHRoZSBib3R0b20gYm94LgorICBEb0ZyaWRnZVByb2ZpbGUocGFyYW1zLmJvdHRvbSArIHZhbHVlcy50b3RlX2hlaWdodCwgMC4wLCBrU2xvd0VsZXZhdG9yTW92ZSwKKyAgICAgICAgICAgICAgICAgIGtTbG93QXJtTW92ZSwgdHJ1ZSk7CisgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisKKyAgLy8gQ2xhbXAuCisgIGlmICghcGFyYW1zLm9ubHlfcGxhY2UpIHsKKyAgICAvLyBNb3ZlIHRoZSBjbGF3IG91dCBvZiB0aGUgd2F5IG9ubHkgaWYgd2UgYXJlIHN1cHBvc2VkIHRvIHBpY2sgdXAuCisgICAgYm9vbCBzZW5kX2dvYWwgPSB0cnVlOworICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgICAgaWYgKGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLmdldCgpKSB7CisgICAgICBpZiAoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPmdvYWxfYW5nbGUgPAorICAgICAgICAgIHBhcmFtcy5jbGF3X291dF9hbmdsZSkgeworICAgICAgICBzZW5kX2dvYWwgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNlbmRfZ29hbCkgeworICAgICAgYXV0byBtZXNzYWdlID0gY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5nb2FsLk1ha2VNZXNzYWdlKCk7CisgICAgICBtZXNzYWdlLT5hbmdsZSA9IHBhcmFtcy5jbGF3X291dF9hbmdsZTsKKyAgICAgIG1lc3NhZ2UtPmFuZ3VsYXJfdmVsb2NpdHkgPSAwLjA7CisgICAgICBtZXNzYWdlLT5pbnRha2UgPSAwLjA7CisgICAgICBtZXNzYWdlLT5yb2xsZXJzX2Nsb3NlZCA9IHRydWU7CisgICAgICBtZXNzYWdlLT5tYXhfdmVsb2NpdHkgPSA2LjA7CisgICAgICBtZXNzYWdlLT5tYXhfYWNjZWxlcmF0aW9uID0gMTAuMDsKKworICAgICAgTE9HX1NUUlVDVChERUJVRywgIlNlbmRpbmcgY2xhdyBnb2FsIiwgKm1lc3NhZ2UpOworICAgICAgbWVzc2FnZS5TZW5kKCk7CisgICAgfQorICB9CisKKyAgaWYgKHBhcmFtcy5vbmx5X3BsYWNlKSB7CisgICAgLy8gb3BlbiBncmFiYmVyIGZvciBwbGFjZSBvbmx5CisgICAgRG9GcmlkZ2VQcm9maWxlKHBhcmFtcy5ib3R0b20gKyB2YWx1ZXMudG90ZV9oZWlnaHQsIDAuMCwga0Zhc3RFbGV2YXRvck1vdmUsCisgICAgICAgICAgICAgICAgICAgIGtGYXN0QXJtTW92ZSwgZmFsc2UpOworICAgIC8vIEZpbmlzaCBlYXJseSBpZiB3ZSBhcmVuJ3Qgc3VwcG9zZWQgdG8gZ3JhYi4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisgIC8vIGdyYWIgY2FuIChpZiBpbiBmYW5nIG1vZGUgdGhlIGdyYWJiZXIgc3RheXMgY2xvc2VkKQorICBEb0ZyaWRnZVByb2ZpbGUocGFyYW1zLmJvdHRvbSwgMC4wLCBrUmVhbGx5RmFzdEVsZXZhdG9yTW92ZSwga0Zhc3RBcm1Nb3ZlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKzo6c3RkOjp1bmlxdWVfcHRyPFN0YWNrQWN0aW9uPiBNYWtlU3RhY2tBY3Rpb24oY29uc3QgU3RhY2tQYXJhbXMgJnBhcmFtcykgeworICByZXR1cm4gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhY2tBY3Rpb24+KAorICAgICAgbmV3IFN0YWNrQWN0aW9uKCY6OmZyYzk3MTo6YWN0b3JzOjpzdGFja19hY3Rpb24sIHBhcmFtcykpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3IuaCBiL3kyMDE1L2FjdG9ycy9zdGFja19hY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmY3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3IuaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIFkyMDE1X0FDVE9SU19TVEFDS19BQ1RPUl9IXworI2RlZmluZSBZMjAxNV9BQ1RPUlNfU1RBQ0tfQUNUT1JfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvZnJpZGdlX3Byb2ZpbGVfbGliLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CisKK2NsYXNzIFN0YWNrQWN0b3IgOiBwdWJsaWMgRnJpZGdlQWN0b3JCYXNlPFN0YWNrQWN0aW9uUXVldWVHcm91cD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RhY2tBY3RvcihTdGFja0FjdGlvblF1ZXVlR3JvdXAgKnF1ZXVlcyk7CisKKyAgYm9vbCBSdW5BY3Rpb24oY29uc3QgU3RhY2tQYXJhbXMgJnBhcmFtcykgb3ZlcnJpZGU7Cit9OworCit0eXBlZGVmIGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxTdGFja0FjdGlvblF1ZXVlR3JvdXA+IFN0YWNrQWN0aW9uOworCisvLyBNYWtlcyBhIG5ldyBzdGFja0FjdG9yIGFjdGlvbi4KKzo6c3RkOjp1bmlxdWVfcHRyPFN0YWNrQWN0aW9uPiBNYWtlU3RhY2tBY3Rpb24oY29uc3QgU3RhY2tQYXJhbXMgJnBhcmFtcyk7CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmCmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3JfbWFpbi5jYyBiL3kyMDE1L2FjdG9ycy9zdGFja19hY3Rvcl9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTczM2MKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3JfbWFpbi5jYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3IuaCIKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyKiAvKmFyZ3YqLyBbXSkgeworICA6OmFvczo6SW5pdCgpOworCisgIDo6ZnJjOTcxOjphY3RvcnM6OlN0YWNrQWN0b3Igc3RhY2soJjo6ZnJjOTcxOjphY3RvcnM6OnN0YWNrX2FjdGlvbik7CisgIHN0YWNrLlJ1bigpOworCisgIDo6YW9zOjpDbGVhbnVwKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL3N0YWNrX2FjdG9yX3Rlc3QuY2MgYi95MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3JfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWIxODU2Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL3N0YWNrX2FjdG9yX3Rlc3QuY2MKQEAgLTAsMCArMSw3MiBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9xdWV1ZV90ZXN0dXRpbHMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UucS5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BfdGVzdC5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3RlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQuaCIKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7CisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIFN0YWNrQWN0aW9uVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgU3RhY2tBY3Rpb25UZXN0KCkgeworICAgIGZyYzk3MTo6YWN0b3JzOjpzdGFja19hY3Rpb24uZ29hbC5DbGVhcigpOworICAgIGZyYzk3MTo6YWN0b3JzOjpzdGFja19hY3Rpb24uc3RhdHVzLkNsZWFyKCk7CisgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5DbGVhcigpOworICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5nb2FsLkNsZWFyKCk7CisgIH0KKworICB2aXJ0dWFsIH5TdGFja0FjdGlvblRlc3QoKSB7CisgICAgZnJjOTcxOjphY3RvcnM6OnN0YWNrX2FjdGlvbi5nb2FsLkNsZWFyKCk7CisgICAgZnJjOTcxOjphY3RvcnM6OnN0YWNrX2FjdGlvbi5zdGF0dXMuQ2xlYXIoKTsKKyAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLkNsZWFyKCk7CisgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLmdvYWwuQ2xlYXIoKTsKKyAgfQorCisgIC8vIEJyaW5nIHVwIGFuZCBkb3duIENvcmUuCisgIDo6YW9zOjpjb21tb246OnRlc3Rpbmc6Okdsb2JhbENvcmVJbnN0YW5jZSBteV9jb3JlOworfTsKKworLy8gVGVzdHMgdGhhdCBjYW5jZWwgc3RvcHMgbm90IG9ubHkgdGhlIHN0YWNrIGFjdGlvbiwgYnV0IHRoZSB1bmRlcmx5aW5nIHByb2ZpbGUKKy8vIGFjdGlvbi4KK1RFU1RfRihTdGFja0FjdGlvblRlc3QsIFN0YWNrQ2FuY2VsKSB7CisgIFN0YWNrQWN0b3Igc3RhY2soJmZyYzk3MTo6YWN0b3JzOjpzdGFja19hY3Rpb24pOworCisgIGZyYzk3MTo6YWN0b3JzOjpzdGFja19hY3Rpb24uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5ydW4odHJ1ZSkuU2VuZCgpOworCisgIC8vIHRlbGwgaXQgdGhlIGZyaWRnZSBpcyB6ZXJvZWQKKyAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLnplcm9lZCh0cnVlKQorICAgICAgLmFuZ2xlKDAuMCkKKyAgICAgIC5oZWlnaHQoMC4wKQorICAgICAgLlNlbmQoKTsKKworICAvLyBkbyB0aGUgYWN0aW9uIGFuZCBpdCB3aWxsIHBvc3QgdG8gdGhlIGdvYWwgcXVldWUKKyAgc3RhY2suV2FpdEZvckFjdGlvblJlcXVlc3QoKTsKKworICAvLyB0aGUgYWN0aW9uIGhhcyBzdGFydGVkLCBzbyBub3cgY2FuY2VsIGl0IGFuZCBpdCBzaG91bGQgY2FuY2VsCisgIC8vIHRoZSB1bmRlcmx5aW5nIHByb2ZpbGUKKyAgZnJjOTcxOjphY3RvcnM6OnN0YWNrX2FjdGlvbi5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLnJ1bihmYWxzZSkuU2VuZCgpOworCisgIC8vIGxldCB0aGUgYWN0aW9uIHN0YXJ0IHJ1bm5pbmcsIGlmIHdlIHJldHVybiBmcm9tIHRoaXMgY2FsbCBpdCBoYXMgd29ya2VkLgorICBTdGFja1BhcmFtcyBzOworICBzdGFjay5SdW5BY3Rpb24ocyk7CisKKyAgU1VDQ0VFRCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGFjdG9ycworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9ob2xkX2FjdGlvbi5xIGIveTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9ob2xkX2FjdGlvbi5xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTk4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2hvbGRfYWN0aW9uLnEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBmcmM5NzEuYWN0b3JzOworCitpbXBvcnQgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLnEiOworaW1wb3J0ICJ5MjAxNS9hY3RvcnMvc3RhY2tfYWN0aW9uX3BhcmFtcy5xIjsKKworLy8gUGFyYW1ldGVycyB0byBzZW5kIHdpdGggc3RhcnQuCitzdHJ1Y3QgU3RhY2tBbmRIb2xkUGFyYW1zIHsKKyAgLy8gSWYgdHJ1ZSwgdGhlcmUgaXMgbm8gdG90ZSBvbiB0aGUgdHJheSwgYW5kIHdlIHNob3VsZCBwbGFjZSBpbnN0ZWFkLgorICBib29sIHBsYWNlX25vdF9zdGFjazsKKworICBkb3VibGUgY2xhd19vdXRfYW5nbGU7CisgIC8vIFRoZSBoZWlnaHQganVzdCBhYm92ZSB0aGUgYm94IHRvIG1vdmUgYmVmb3JlIGxvd2VyaW5nLgorICBkb3VibGUgb3Zlcl9ib3hfYmVmb3JlX3BsYWNlX2hlaWdodDsKKworICAvLyBCb3R0b20gcG9zaXRpb24uCisgIGRvdWJsZSBib3R0b207CisKKyAgLy8gSWYgd2UgYXJlIHBsYWNpbmcsIGNsYW1wIHRoZSBzdGFjayB3aXRoIHRoZSBjbGF3LgorICBkb3VibGUgY2xhd19jbGFtcF9hbmdsZTsKKworICAvLyBBbW91bnQgdG8gd2FpdCB0byByZWxlYXNlLgorICBkb3VibGUgY2xhbXBfcGF1c2VfdGltZTsKKworICAvLyBUaGUgdmFsdWUgdG8gbW92ZSB0aGUgYXJtIGZvcndhcmRzIHRvIGNsZWFyIHRoZSBzdGFjayB3aGVuIGxpZnRpbmcuCisgIGRvdWJsZSBhcm1fY2xlYXJhbmNlOworICAvLyBIb2xkIGhlaWdodAorICBkb3VibGUgaG9sZF9oZWlnaHQ7Cit9OworCitxdWV1ZV9ncm91cCBTdGFja0FuZEhvbGRBY3Rpb25RdWV1ZUdyb3VwIHsKKyAgaW1wbGVtZW50cyBhb3MuY29tbW9uLmFjdGlvbnMuQWN0aW9uUXVldWVHcm91cDsKKworICBtZXNzYWdlIEdvYWwgeworICAgIHVpbnQzMl90IHJ1bjsKKyAgICBTdGFja0FuZEhvbGRQYXJhbXMgcGFyYW1zOworICB9OworCisgIHF1ZXVlIEdvYWwgZ29hbDsKKyAgcXVldWUgYW9zLmNvbW1vbi5hY3Rpb25zLlN0YXR1cyBzdGF0dXM7Cit9OworCitxdWV1ZV9ncm91cCBTdGFja0FuZEhvbGRBY3Rpb25RdWV1ZUdyb3VwIHN0YWNrX2FuZF9ob2xkX2FjdGlvbjsKZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9zdGFja19hbmRfaG9sZF9hY3Rvci5jYyBiL3kyMDE1L2FjdG9ycy9zdGFja19hbmRfaG9sZF9hY3Rvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTFlZWRhCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9ob2xkX2FjdG9yLmNjCkBAIC0wLDAgKzEsMTMyIEBACisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9ob2xkX2FjdG9yLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvcGhhc2VkX2xvb3AuaCIKKworI2luY2x1ZGUgInkyMDE1L2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYWN0b3IuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKK25hbWVzcGFjZSB7Citjb25zdGV4cHIgUHJvZmlsZVBhcmFtcyBrUmVhbGx5U2xvd0FybU1vdmV7MC4xLCAxLjB9OworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga1JlYWxseVNsb3dFbGV2YXRvck1vdmV7MC4xMCwgMS4wfTsKKworY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0Zhc3RBcm1Nb3ZlezAuOCwgNC4wfTsKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtGYXN0RWxldmF0b3JNb3ZlezEuMiwgNC4wfTsKK30gIC8vIG5hbWVzcGFjZQorCitTdGFja0FuZEhvbGRBY3Rvcjo6U3RhY2tBbmRIb2xkQWN0b3IoU3RhY2tBbmRIb2xkQWN0aW9uUXVldWVHcm91cCAqcXVldWVzKQorICAgIDogRnJpZGdlQWN0b3JCYXNlPFN0YWNrQW5kSG9sZEFjdGlvblF1ZXVlR3JvdXA+KHF1ZXVlcykge30KKworYm9vbCBTdGFja0FuZEhvbGRBY3Rvcjo6UnVuQWN0aW9uKGNvbnN0IFN0YWNrQW5kSG9sZFBhcmFtcyAmcGFyYW1zKSB7CisgIC8vIFRPRE8oYmVuKSk6IHRoaXMgYWN0aW9uIGlzIG5vIGxvbmdlciB1c2VkIChzb3VyY2UgQ2FtZXJvbikgYW5kIG15IGJlIGJyb2tlbgorICAvLyBieSB0aGUgc3RhY2sgYWN0aW9uIGhhdmluZyB0aGUgZ3JhYmJlcnMgY2xvc2VkIGF0IHRoZSBlbmQgZm9yIHRoZSBmYW5ncy4gU28KKyAgLy8gaGVyZSBJIGFtIGRpc2FibGluZyBpdCB1bnRpbCBmdXJ0aGVyIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLgorICBpZiAocGFyYW1zLnBsYWNlX25vdF9zdGFjaykgeworICAgIC8vIE1vdmUgdGhlIGFybSBvdXQgb2YgdGhlIHdheS4KKyAgICB7CisgICAgICBib29sIHNlbmRfZ29hbCA9IHRydWU7CisgICAgICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICAgICAgaWYgKGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLmdldCgpKSB7CisgICAgICAgIGlmIChjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+Z29hbF9hbmdsZSA8CisgICAgICAgICAgICBwYXJhbXMuY2xhd19vdXRfYW5nbGUpIHsKKyAgICAgICAgICBzZW5kX2dvYWwgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNlbmRfZ29hbCkgeworICAgICAgICBhdXRvIG1lc3NhZ2UgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICAgICAgbWVzc2FnZS0+YW5nbGUgPSBwYXJhbXMuY2xhd19vdXRfYW5nbGU7CisgICAgICAgIG1lc3NhZ2UtPmFuZ3VsYXJfdmVsb2NpdHkgPSAwLjA7CisgICAgICAgIG1lc3NhZ2UtPmludGFrZSA9IDAuMDsKKyAgICAgICAgbWVzc2FnZS0+cm9sbGVyc19jbG9zZWQgPSB0cnVlOworICAgICAgICBtZXNzYWdlLT5tYXhfdmVsb2NpdHkgPSA2LjA7CisgICAgICAgIG1lc3NhZ2UtPm1heF9hY2NlbGVyYXRpb24gPSAxMC4wOworCisgICAgICAgIExPR19TVFJVQ1QoREVCVUcsICJTZW5kaW5nIGNsYXcgZ29hbCIsICptZXNzYWdlKTsKKyAgICAgICAgbWVzc2FnZS5TZW5kKCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gR2V0IGNsb3NlLCBidXQga2VlcCB0aGUgYXJtIGZvcndhcmRzCisgICAgRG9GcmlkZ2VQcm9maWxlKHBhcmFtcy5ib3R0b20gKyAwLjA0LCAtMC4wNSwga0Zhc3RBcm1Nb3ZlLAorICAgICAgICAgICAgICAgICAgICBrRmFzdEVsZXZhdG9yTW92ZSwgdHJ1ZSk7CisKKyAgICAvLyBMb3dlciBhbmQgcHVsbCBiYWNrLgorICAgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisgICAgRG9GcmlkZ2VQcm9maWxlKHBhcmFtcy5ib3R0b20sIDAuMCwga1JlYWxseVNsb3dBcm1Nb3ZlLAorICAgICAgICAgICAgICAgICAgICBrUmVhbGx5U2xvd0VsZXZhdG9yTW92ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOworCisgICAgLy8gUmVsZWFzZS4KKyAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworICAgIERvRnJpZGdlUHJvZmlsZShwYXJhbXMuYm90dG9tLCAwLjAsIGtSZWFsbHlTbG93QXJtTW92ZSwKKyAgICAgICAgICAgICAgICAgICAga1JlYWxseVNsb3dFbGV2YXRvck1vdmUsIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBTdGFja1BhcmFtcyBzdGFja19wYXJhbXM7CisgICAgc3RhY2tfcGFyYW1zLm9ubHlfcGxhY2UgPSB0cnVlOworICAgIHN0YWNrX3BhcmFtcy5hcm1fY2xlYXJhbmNlID0gcGFyYW1zLmFybV9jbGVhcmFuY2U7CisgICAgc3RhY2tfcGFyYW1zLmNsYXdfb3V0X2FuZ2xlID0gcGFyYW1zLmNsYXdfb3V0X2FuZ2xlOworICAgIHN0YWNrX3BhcmFtcy5vdmVyX2JveF9iZWZvcmVfcGxhY2VfaGVpZ2h0ID0KKyAgICAgICAgcGFyYW1zLm92ZXJfYm94X2JlZm9yZV9wbGFjZV9oZWlnaHQ7CisgICAgc3RhY2tfcGFyYW1zLmJvdHRvbSA9IHBhcmFtcy5ib3R0b207CisgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhY2tBY3Rpb24+IHN0YWNrX2FjdGlvbiA9CisgICAgICAgIE1ha2VTdGFja0FjdGlvbihzdGFja19wYXJhbXMpOworICAgIHN0YWNrX2FjdGlvbi0+U3RhcnQoKTsKKyAgICB3aGlsZSAoc3RhY2tfYWN0aW9uLT5SdW5uaW5nKCkpIHsKKyAgICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kuVG9NU2VjKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTAwKTsKKworICAgICAgaWYgKFNob3VsZENhbmNlbCgpKSB7CisgICAgICAgIHN0YWNrX2FjdGlvbi0+Q2FuY2VsKCk7CisgICAgICAgIExPRyhXQVJOSU5HLCAiQ2FuY2VsbGluZyBmcmlkZ2UgYW5kIGNsYXcuXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFXYWl0T3JDYW5jZWwoYW9zOjp0aW1lOjpUaW1lOjpJblNlY29uZHMocGFyYW1zLmNsYW1wX3BhdXNlX3RpbWUpKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gR28gdXAuCisgIERvRnJpZGdlUHJvZmlsZShwYXJhbXMuaG9sZF9oZWlnaHQsIHBhcmFtcy5hcm1fY2xlYXJhbmNlLCBrRmFzdEFybU1vdmUsCisgICAgICAgICAgICAgICAgICBrRmFzdEVsZXZhdG9yTW92ZSwgZmFsc2UpOworCisgIGlmIChTaG91bGRDYW5jZWwoKSkgcmV0dXJuIHRydWU7CisKKyAgaWYgKHBhcmFtcy5wbGFjZV9ub3Rfc3RhY2spIHsKKyAgICAvLyBDbGFtcCB0aGUgc3RhY2sgd2l0aCB0aGUgY2xhdy4KKyAgICBhdXRvIG1lc3NhZ2UgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICBtZXNzYWdlLT5hbmdsZSA9IHBhcmFtcy5jbGF3X2NsYW1wX2FuZ2xlOworICAgIG1lc3NhZ2UtPmFuZ3VsYXJfdmVsb2NpdHkgPSAwLjA7CisgICAgbWVzc2FnZS0+aW50YWtlID0gMC4wOworICAgIG1lc3NhZ2UtPnJvbGxlcnNfY2xvc2VkID0gdHJ1ZTsKKyAgICBtZXNzYWdlLT5tYXhfdmVsb2NpdHkgPSA2LjA7CisgICAgbWVzc2FnZS0+bWF4X2FjY2VsZXJhdGlvbiA9IDYuMDsKKworICAgIExPR19TVFJVQ1QoREVCVUcsICJTZW5kaW5nIGNsYXcgZ29hbCIsICptZXNzYWdlKTsKKyAgICBtZXNzYWdlLlNlbmQoKTsKKyAgfQorICAvLyBNb3ZlIGJhY2sKKyAgRG9GcmlkZ2VQcm9maWxlKHBhcmFtcy5ob2xkX2hlaWdodCwgMC4wLCBrRmFzdEFybU1vdmUsIGtGYXN0RWxldmF0b3JNb3ZlLAorICAgICAgICAgICAgICAgICAgZmFsc2UpOworICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworICAvLyBHcmFiCisgIERvRnJpZGdlUHJvZmlsZShwYXJhbXMuaG9sZF9oZWlnaHQsIDAuMCwga0Zhc3RBcm1Nb3ZlLCBrRmFzdEVsZXZhdG9yTW92ZSwKKyAgICAgICAgICAgICAgICAgIHRydWUpOworICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHJldHVybiB0cnVlOworCisgIHJldHVybiB0cnVlOworfQorCis6OnN0ZDo6dW5pcXVlX3B0cjxTdGFja0FuZEhvbGRBY3Rpb24+IE1ha2VTdGFja0FuZEhvbGRBY3Rpb24oCisgICAgY29uc3QgU3RhY2tBbmRIb2xkUGFyYW1zICZwYXJhbXMpIHsKKyAgcmV0dXJuIDo6c3RkOjp1bmlxdWVfcHRyPFN0YWNrQW5kSG9sZEFjdGlvbj4oCisgICAgICBuZXcgU3RhY2tBbmRIb2xkQWN0aW9uKCY6OmZyYzk3MTo6YWN0b3JzOjpzdGFja19hbmRfaG9sZF9hY3Rpb24sIHBhcmFtcykpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2hvbGRfYWN0b3IuaCBiL3kyMDE1L2FjdG9ycy9zdGFja19hbmRfaG9sZF9hY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmYyYzUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2hvbGRfYWN0b3IuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIFkyMDE1X0FDVE9SU19TVEFDS19BTkRfSE9MRF9BQ1RPUl9IXworI2RlZmluZSBZMjAxNV9BQ1RPUlNfU1RBQ0tfQU5EX0hPTERfQUNUT1JfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2hvbGRfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvZnJpZGdlX3Byb2ZpbGVfbGliLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGFjdG9ycyB7CisKK2NsYXNzIFN0YWNrQW5kSG9sZEFjdG9yIDogcHVibGljIEZyaWRnZUFjdG9yQmFzZTxTdGFja0FuZEhvbGRBY3Rpb25RdWV1ZUdyb3VwPiB7CisgcHVibGljOgorICBleHBsaWNpdCBTdGFja0FuZEhvbGRBY3RvcihTdGFja0FuZEhvbGRBY3Rpb25RdWV1ZUdyb3VwICpxdWV1ZXMpOworCisgIGJvb2wgUnVuQWN0aW9uKGNvbnN0IFN0YWNrQW5kSG9sZFBhcmFtcyAmcGFyYW1zKSBvdmVycmlkZTsKK307CisKK3R5cGVkZWYgYW9zOjpjb21tb246OmFjdGlvbnM6OlR5cGVkQWN0aW9uPFN0YWNrQW5kSG9sZEFjdGlvblF1ZXVlR3JvdXA+CisgICAgU3RhY2tBbmRIb2xkQWN0aW9uOworCisvLyBNYWtlcyBhIG5ldyBzdGFja0FjdG9yIGFjdGlvbi4KKzo6c3RkOjp1bmlxdWVfcHRyPFN0YWNrQW5kSG9sZEFjdGlvbj4gTWFrZVN0YWNrQW5kSG9sZEFjdGlvbigKKyAgICBjb25zdCBTdGFja0FuZEhvbGRQYXJhbXMgJnBhcmFtcyk7CisKK30gIC8vIG5hbWVzcGFjZSBhY3RvcnMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBZMjAxNV9BQ1RPUlNfU1RBQ0tfQU5EX0hPTERfQUNUT1JfSF8KZGlmZiAtLWdpdCBhL3kyMDE1L2FjdG9ycy9zdGFja19hbmRfaG9sZF9hY3Rvcl9tYWluLmNjIGIveTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9ob2xkX2FjdG9yX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1ZDFjMQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9zdGFja19hbmRfaG9sZF9hY3Rvcl9tYWluLmNjCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9zdGFja19hbmRfaG9sZF9hY3Rpb24ucS5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9zdGFja19hbmRfaG9sZF9hY3Rvci5oIgorCitpbnQgbWFpbihpbnQgLyphcmdjKi8sIGNoYXIqIC8qYXJndiovIFtdKSB7CisgIDo6YW9zOjpJbml0KCk7CisKKyAgOjpmcmM5NzE6OmFjdG9yczo6U3RhY2tBbmRIb2xkQWN0b3Igc3RhY2tfYW5kX2hvbGQoCisgICAgICAmOjpmcmM5NzE6OmFjdG9yczo6c3RhY2tfYW5kX2hvbGRfYWN0aW9uKTsKKyAgc3RhY2tfYW5kX2hvbGQuUnVuKCk7CisKKyAgOjphb3M6OkNsZWFudXAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0aW9uLnEgYi95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0aW9uLnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjOTcxYgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2FjdG9ycy9zdGFja19hbmRfbGlmdF9hY3Rpb24ucQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGZyYzk3MS5hY3RvcnM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdGlvbnMucSI7CisKK2ltcG9ydCAieTIwMTUvYWN0b3JzL3N0YWNrX2FjdGlvbl9wYXJhbXMucSI7CitpbXBvcnQgInkyMDE1L2FjdG9ycy9saWZ0X2FjdGlvbl9wYXJhbXMucSI7CisKKy8vIFBhcmFtZXRlcnMgdG8gc2VuZCB3aXRoIHN0YXJ0Lgorc3RydWN0IFN0YWNrQW5kTGlmdFBhcmFtcyB7CisgIC8vIFN0YWNrIHBhcmFtZXRlcnMKKyAgU3RhY2tQYXJhbXMgc3RhY2tfcGFyYW1zOworICAvLyBUcnVlIGlmIHRoZSBmcmlkZ2Ugc2hvdWxkIGJlIGNsYW1wZWQgd2hpbGUgbGlmdGluZy4KKyAgYm9vbCBncmFiX2FmdGVyX3N0YWNrOworICAvLyBUaGUgdGltZSBhZnRlciBjbGFtcGluZyB0byBwYXVzZS4KKyAgZG91YmxlIGNsYW1wX3BhdXNlX3RpbWU7CisgIC8vIExpZnQgcGFyYW1ldGVycworICBMaWZ0UGFyYW1zIGxpZnRfcGFyYW1zOworICAvLyBUcnVlIGlmIHRoZSBmcmlkZ2Ugc2hvdWxkIGJlIGNsYW1wZWQgd2hlbiBkb25lLgorICBib29sIGdyYWJfYWZ0ZXJfbGlmdDsKK307CisKK3F1ZXVlX2dyb3VwIFN0YWNrQW5kTGlmdEFjdGlvblF1ZXVlR3JvdXAgeworICBpbXBsZW1lbnRzIGFvcy5jb21tb24uYWN0aW9ucy5BY3Rpb25RdWV1ZUdyb3VwOworCisgIG1lc3NhZ2UgR29hbCB7CisgICAgdWludDMyX3QgcnVuOworICAgIFN0YWNrQW5kTGlmdFBhcmFtcyBwYXJhbXM7CisgIH07CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBhb3MuY29tbW9uLmFjdGlvbnMuU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIFN0YWNrQW5kTGlmdEFjdGlvblF1ZXVlR3JvdXAgc3RhY2tfYW5kX2xpZnRfYWN0aW9uOwpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9saWZ0X2FjdG9yLmNjIGIveTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9saWZ0X2FjdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjc0MTcKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0b3IuY2MKQEAgLTAsMCArMSwxMTUgQEAKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0b3IuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgiCisKKyNpbmNsdWRlICJ5MjAxNS9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL3N0YWNrX2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2xpZnRfYWN0b3IuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYWN0b3JzIHsKKworU3RhY2tBbmRMaWZ0QWN0b3I6OlN0YWNrQW5kTGlmdEFjdG9yKFN0YWNrQW5kTGlmdEFjdGlvblF1ZXVlR3JvdXAgKnF1ZXVlcykKKyAgICA6IEZyaWRnZUFjdG9yQmFzZTxTdGFja0FuZExpZnRBY3Rpb25RdWV1ZUdyb3VwPihxdWV1ZXMpIHt9CisKK2Jvb2wgU3RhY2tBbmRMaWZ0QWN0b3I6OlJ1bkFjdGlvbihjb25zdCBTdGFja0FuZExpZnRQYXJhbXMgJnBhcmFtcykgeworICBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuRmV0Y2hMYXRlc3QoKTsKKyAgZG91YmxlIGNsYXdfZ29hbF9zdGFydDsKKyAgYm9vbCBoYXZlX2NsYXdfZ29hbF9zdGFydDsKKyAgaWYgKGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC5nZXQoKSkgeworICAgIGNsYXdfZ29hbF9zdGFydCA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuZ29hbC0+YW5nbGU7CisgICAgaGF2ZV9jbGF3X2dvYWxfc3RhcnQgPSB0cnVlOworICB9IGVsc2UgeworICAgIGNsYXdfZ29hbF9zdGFydCA9IDA7CisgICAgaGF2ZV9jbGF3X2dvYWxfc3RhcnQgPSBmYWxzZTsKKyAgfQorCisgIHsKKyAgICBTdGFja1BhcmFtcyBzdGFja19wYXJhbXMgPSBwYXJhbXMuc3RhY2tfcGFyYW1zOworICAgIHN0YWNrX3BhcmFtcy5vbmx5X3BsYWNlID0gZmFsc2U7CisgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhY2tBY3Rpb24+IHN0YWNrX2FjdGlvbiA9CisgICAgICAgIE1ha2VTdGFja0FjdGlvbihzdGFja19wYXJhbXMpOworICAgIHN0YWNrX2FjdGlvbi0+U3RhcnQoKTsKKyAgICB3aGlsZSAoc3RhY2tfYWN0aW9uLT5SdW5uaW5nKCkpIHsKKyAgICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kuVG9NU2VjKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTAwKTsKKworICAgICAgaWYgKFNob3VsZENhbmNlbCgpKSB7CisgICAgICAgIHN0YWNrX2FjdGlvbi0+Q2FuY2VsKCk7CisgICAgICAgIExPRyhXQVJOSU5HLCAiQ2FuY2VsbGluZyBmcmlkZ2UgYW5kIGNsYXcuXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgeworICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5nb2FsLkZldGNoTGF0ZXN0KCk7CisgICAgaWYgKCFjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuZ29hbC5nZXQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIG5ld19mcmlkZ2VfZ29hbCA9IGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5nb2FsLk1ha2VNZXNzYWdlKCk7CisgICAgKm5ld19mcmlkZ2VfZ29hbCA9ICpjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuZ29hbDsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLnRvcF9mcm9udCA9IHBhcmFtcy5ncmFiX2FmdGVyX3N0YWNrOworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMudG9wX2JhY2sgPSBwYXJhbXMuZ3JhYl9hZnRlcl9zdGFjazsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLmJvdHRvbV9mcm9udCA9IHBhcmFtcy5ncmFiX2FmdGVyX3N0YWNrOworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMuYm90dG9tX2JhY2sgPSBwYXJhbXMuZ3JhYl9hZnRlcl9zdGFjazsKKyAgICBpZiAoIW5ld19mcmlkZ2VfZ29hbC5TZW5kKCkpIHsKKyAgICAgIExPRyhFUlJPUiwgIkZhaWxlZCB0byBzZW5kIGZyaWRnZSBjbG9zZS5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmICghV2FpdE9yQ2FuY2VsKGFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKHBhcmFtcy5jbGFtcF9wYXVzZV90aW1lKSkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHsKKyAgICBhdXRvIGxpZnRfcGFyYW1zID0gcGFyYW1zLmxpZnRfcGFyYW1zOworICAgIGxpZnRfcGFyYW1zLnBhY2tfY2xhdyA9IGhhdmVfY2xhd19nb2FsX3N0YXJ0OworICAgIGxpZnRfcGFyYW1zLnBhY2tfY2xhd19hbmdsZSA9IGNsYXdfZ29hbF9zdGFydDsKKyAgICA6OnN0ZDo6dW5pcXVlX3B0cjxMaWZ0QWN0aW9uPiBsaWZ0X2FjdGlvbiA9IE1ha2VMaWZ0QWN0aW9uKGxpZnRfcGFyYW1zKTsKKyAgICBsaWZ0X2FjdGlvbi0+U3RhcnQoKTsKKyAgICB3aGlsZSAobGlmdF9hY3Rpb24tPlJ1bm5pbmcoKSkgeworICAgICAgOjphb3M6OnRpbWU6OlBoYXNlZExvb3BYTVMoOjphb3M6OmNvbnRyb2xzOjprTG9vcEZyZXF1ZW5jeS5Ub01TZWMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MDApOworCisgICAgICBpZiAoU2hvdWxkQ2FuY2VsKCkpIHsKKyAgICAgICAgbGlmdF9hY3Rpb24tPkNhbmNlbCgpOworICAgICAgICBMT0coV0FSTklORywgIkNhbmNlbGxpbmcgZnJpZGdlIGFuZCBjbGF3LlxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHsKKyAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuZ29hbC5GZXRjaExhdGVzdCgpOworICAgIGlmICghY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLmdvYWwuZ2V0KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBuZXdfZnJpZGdlX2dvYWwgPSBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuZ29hbC5NYWtlTWVzc2FnZSgpOworICAgICpuZXdfZnJpZGdlX2dvYWwgPSAqY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLmdvYWw7CisgICAgbmV3X2ZyaWRnZV9nb2FsLT5ncmFiYmVycy50b3BfZnJvbnQgPSBwYXJhbXMuZ3JhYl9hZnRlcl9saWZ0OworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMudG9wX2JhY2sgPSBwYXJhbXMuZ3JhYl9hZnRlcl9saWZ0OworICAgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMuYm90dG9tX2Zyb250ID0gcGFyYW1zLmdyYWJfYWZ0ZXJfbGlmdDsKKyAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLmJvdHRvbV9iYWNrID0gcGFyYW1zLmdyYWJfYWZ0ZXJfbGlmdDsKKyAgICBpZiAoIW5ld19mcmlkZ2VfZ29hbC5TZW5kKCkpIHsKKyAgICAgIExPRyhFUlJPUiwgIkZhaWxlZCB0byBzZW5kIGZyaWRnZSBjbG9zZS5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhY2tBbmRMaWZ0QWN0aW9uPiBNYWtlU3RhY2tBbmRMaWZ0QWN0aW9uKAorICAgIGNvbnN0IFN0YWNrQW5kTGlmdFBhcmFtcyAmcGFyYW1zKSB7CisgIHJldHVybiA6OnN0ZDo6dW5pcXVlX3B0cjxTdGFja0FuZExpZnRBY3Rpb24+KAorICAgICAgbmV3IFN0YWNrQW5kTGlmdEFjdGlvbigmOjpmcmM5NzE6OmFjdG9yczo6c3RhY2tfYW5kX2xpZnRfYWN0aW9uLCBwYXJhbXMpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFjdG9ycworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9saWZ0X2FjdG9yLmggYi95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDVmZTI5Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9saWZ0X2FjdG9yLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBZMjAxNV9BQ1RPUlNfU1RBQ0tfQU5EX0xJRlRfQUNUT1JfSF8KKyNkZWZpbmUgWTIwMTVfQUNUT1JTX1NUQUNLX0FORF9MSUZUX0FDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImFvcy9jb21tb24vYWN0aW9ucy9hY3Rpb25zLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9hY3Rpb25zL2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL3N0YWNrX2FuZF9saWZ0X2FjdGlvbi5xLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2ZyaWRnZV9wcm9maWxlX2xpYi5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBhY3RvcnMgeworCitjbGFzcyBTdGFja0FuZExpZnRBY3RvciA6IHB1YmxpYyBGcmlkZ2VBY3RvckJhc2U8U3RhY2tBbmRMaWZ0QWN0aW9uUXVldWVHcm91cD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RhY2tBbmRMaWZ0QWN0b3IoU3RhY2tBbmRMaWZ0QWN0aW9uUXVldWVHcm91cCAqcXVldWVzKTsKKworICBib29sIFJ1bkFjdGlvbihjb25zdCBTdGFja0FuZExpZnRQYXJhbXMgJnBhcmFtcykgb3ZlcnJpZGU7Cit9OworCit0eXBlZGVmIGFvczo6Y29tbW9uOjphY3Rpb25zOjpUeXBlZEFjdGlvbjxTdGFja0FuZExpZnRBY3Rpb25RdWV1ZUdyb3VwPgorICAgIFN0YWNrQW5kTGlmdEFjdGlvbjsKKworLy8gTWFrZXMgYSBuZXcgc3RhY2tBY3RvciBhY3Rpb24uCis6OnN0ZDo6dW5pcXVlX3B0cjxTdGFja0FuZExpZnRBY3Rpb24+IE1ha2VTdGFja0FuZExpZnRBY3Rpb24oCisgICAgY29uc3QgU3RhY2tBbmRMaWZ0UGFyYW1zICZwYXJhbXMpOworCit9ICAvLyBuYW1lc3BhY2UgYWN0b3JzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTVfQUNUT1JTX1NUQUNLX0FORF9MSUZUX0FDVE9SX0hfCmRpZmYgLS1naXQgYS95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0b3JfbWFpbi5jYyBiL3kyMDE1L2FjdG9ycy9zdGFja19hbmRfbGlmdF9hY3Rvcl9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOWY0YjUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0b3JfbWFpbi5jYwpAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0aW9uLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvc3RhY2tfYW5kX2xpZnRfYWN0b3IuaCIKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyKiAvKmFyZ3YqLyBbXSkgeworICA6OmFvczo6SW5pdCgpOworCisgIDo6ZnJjOTcxOjphY3RvcnM6OlN0YWNrQW5kTGlmdEFjdG9yIHN0YWNrX2FuZF9saWZ0KAorICAgICAgJjo6ZnJjOTcxOjphY3RvcnM6OnN0YWNrX2FuZF9saWZ0X2FjdGlvbik7CisgIHN0YWNrX2FuZF9saWZ0LlJ1bigpOworCisgIDo6YW9zOjpDbGVhbnVwKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEveTIwMTUvYXV0b25vbW91cy9hdXRvLmNjIGIveTIwMTUvYXV0b25vbW91cy9hdXRvLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZGUyMDcKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9hdXRvbm9tb3VzL2F1dG8uY2MKQEAgLTAsMCArMSw1NTggQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3RyYXBlem9pZF9wcm9maWxlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorCisjaW5jbHVkZSAiZnJjOTcxL2F1dG9ub21vdXMvYXV0by5xLmgiCisjaW5jbHVkZSAieTIwMTUvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9kcml2ZXRyYWluX2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucS5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5xLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL3BpY2t1cF9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9zdGFja19hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0b3IuaCIKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7Cit1c2luZyA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6Y2xhd19xdWV1ZTsKK3VzaW5nIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWU7Cit1c2luZyA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZTsKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgYXV0b25vbW91cyB7CisKK2NvbnN0ZXhwciBkb3VibGUga0NsYXdBdXRvVmVsb2NpdHkgPSAzLjAwOworY29uc3RleHByIGRvdWJsZSBrQ2xhd0F1dG9BY2NlbGVyYXRpb24gPSA2LjA7Citjb25zdGV4cHIgZG91YmxlIGtBbmdsZUVwc2lsb24gPSAwLjEwOworY29uc3QgZG91YmxlIGtDbGF3VG90ZVBhY2tBbmdsZSA9IDAuOTA7Citjb25zdCBkb3VibGUga0FybVJhaXNlTG93ZXJDbGVhcmFuY2UgPSAtMC4wODsKK2NvbnN0IGRvdWJsZSBrQ2xhd1N0YWNrQ2xlYXJhbmNlID0gMC41NTsKK2NvbnN0IGRvdWJsZSBrU3RhY2tVcEhlaWdodCA9IDAuNjA7Citjb25zdCBkb3VibGUga1N0YWNrVXBBcm0gPSAwLjA7CisKK3N0cnVjdCBQcm9maWxlUGFyYW1zIHsKKyAgZG91YmxlIHZlbG9jaXR5OworICBkb3VibGUgYWNjZWxlcmF0aW9uOworfTsKKworbmFtZXNwYWNlIHRpbWUgPSA6OmFvczo6dGltZTsKKworc3RhdGljIGRvdWJsZSBsZWZ0X2luaXRpYWxfcG9zaXRpb24sIHJpZ2h0X2luaXRpYWxfcG9zaXRpb247CisKK2Jvb2wgU2hvdWxkRXhpdEF1dG8oKSB7CisgIDo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLkZldGNoTGF0ZXN0KCk7CisgIGJvb2wgYW5zID0gITo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLT5ydW5fYXV0bzsKKyAgaWYgKGFucykgeworICAgIExPRyhJTkZPLCAiVGltZSB0byBleGl0IGF1dG8gbW9kZVxuIik7CisgIH0KKyAgcmV0dXJuIGFuczsKK30KKwordm9pZCBTdG9wRHJpdmV0cmFpbigpIHsKKyAgTE9HKElORk8sICJTdG9wcGluZyB0aGUgZHJpdmV0cmFpblxuIik7CisgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmNvbnRyb2xfbG9vcF9kcml2aW5nKHRydWUpCisgICAgICAubGVmdF9nb2FsKGxlZnRfaW5pdGlhbF9wb3NpdGlvbikKKyAgICAgIC5sZWZ0X3ZlbG9jaXR5X2dvYWwoMCkKKyAgICAgIC5yaWdodF9nb2FsKHJpZ2h0X2luaXRpYWxfcG9zaXRpb24pCisgICAgICAucmlnaHRfdmVsb2NpdHlfZ29hbCgwKQorICAgICAgLnF1aWNrdHVybihmYWxzZSkKKyAgICAgIC5TZW5kKCk7Cit9CisKK3ZvaWQgUmVzZXREcml2ZXRyYWluKCkgeworICBMT0coSU5GTywgInJlc2V0dGluZyB0aGUgZHJpdmV0cmFpblxuIik7CisgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmNvbnRyb2xfbG9vcF9kcml2aW5nKGZhbHNlKQorICAgICAgLy8uaGlnaGdlYXIoZmFsc2UpCisgICAgICAuc3RlZXJpbmcoMC4wKQorICAgICAgLnRocm90dGxlKDAuMCkKKyAgICAgIC5sZWZ0X2dvYWwobGVmdF9pbml0aWFsX3Bvc2l0aW9uKQorICAgICAgLmxlZnRfdmVsb2NpdHlfZ29hbCgwKQorICAgICAgLnJpZ2h0X2dvYWwocmlnaHRfaW5pdGlhbF9wb3NpdGlvbikKKyAgICAgIC5yaWdodF92ZWxvY2l0eV9nb2FsKDApCisgICAgICAuU2VuZCgpOworfQorCit2b2lkIFdhaXRVbnRpbERvbmVPckNhbmNlbGVkKAorICAgIDo6c3RkOjp1bmlxdWVfcHRyPGFvczo6Y29tbW9uOjphY3Rpb25zOjpBY3Rpb24+IGFjdGlvbikgeworICBpZiAoIWFjdGlvbikgeworICAgIExPRyhFUlJPUiwgIk5vIGFjdGlvbiwgbm90IHdhaXRpbmdcbiIpOworICAgIHJldHVybjsKKyAgfQorICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFBvbGwgdGhlIHJ1bm5pbmcgYml0IGFuZCBhdXRvIGRvbmUgYml0cy4KKyAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUyg1LCAyNTAwKTsKKyAgICBpZiAoIWFjdGlvbi0+UnVubmluZygpIHx8IFNob3VsZEV4aXRBdXRvKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKwordm9pZCBTdGVwRHJpdmUoZG91YmxlIGRpc3RhbmNlLCBkb3VibGUgdGhldGEpIHsKKyAgZG91YmxlIGxlZnRfZ29hbCA9IChsZWZ0X2luaXRpYWxfcG9zaXRpb24gKyBkaXN0YW5jZSAtCisgICAgICAgICAgICAgICAgICAgICAgdGhldGEgKiBjb25zdGFudHM6OkdldFZhbHVlcygpLnR1cm5fd2lkdGggLyAyLjApOworICBkb3VibGUgcmlnaHRfZ29hbCA9IChyaWdodF9pbml0aWFsX3Bvc2l0aW9uICsgZGlzdGFuY2UgKworICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSAqIGNvbnN0YW50czo6R2V0VmFsdWVzKCkudHVybl93aWR0aCAvIDIuMCk7CisgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmNvbnRyb2xfbG9vcF9kcml2aW5nKHRydWUpCisgICAgICAubGVmdF9nb2FsKGxlZnRfZ29hbCkKKyAgICAgIC5yaWdodF9nb2FsKHJpZ2h0X2dvYWwpCisgICAgICAubGVmdF92ZWxvY2l0eV9nb2FsKDAuMCkKKyAgICAgIC5yaWdodF92ZWxvY2l0eV9nb2FsKDAuMCkKKyAgICAgIC5TZW5kKCk7CisgIGxlZnRfaW5pdGlhbF9wb3NpdGlvbiA9IGxlZnRfZ29hbDsKKyAgcmlnaHRfaW5pdGlhbF9wb3NpdGlvbiA9IHJpZ2h0X2dvYWw7Cit9CisKK3ZvaWQgV2FpdFVudGlsTmVhcihkb3VibGUgZGlzdGFuY2UpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICAgIGNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworICAgIGRvdWJsZSBsZWZ0X2Vycm9yID0gOjpzdGQ6OmFicygKKyAgICAgICAgbGVmdF9pbml0aWFsX3Bvc2l0aW9uIC0KKyAgICAgICAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMtPmZpbHRlcmVkX2xlZnRfcG9zaXRpb24pOworICAgIGRvdWJsZSByaWdodF9lcnJvciA9IDo6c3RkOjphYnMoCisgICAgICAgIHJpZ2h0X2luaXRpYWxfcG9zaXRpb24gLQorICAgICAgICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy0+ZmlsdGVyZWRfcmlnaHRfcG9zaXRpb24pOworICAgIGNvbnN0IGRvdWJsZSBrUG9zaXRpb25UaHJlc2hvbGQgPSAwLjA1ICsgZGlzdGFuY2U7CisgICAgaWYgKHJpZ2h0X2Vycm9yIDwga1Bvc2l0aW9uVGhyZXNob2xkICYmIGxlZnRfZXJyb3IgPCBrUG9zaXRpb25UaHJlc2hvbGQpIHsKKyAgICAgIExPRyhJTkZPLCAiQXQgdGhlIGdvYWxcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCitjb25zdCBQcm9maWxlUGFyYW1zIGtGYXN0RHJpdmUgPSB7Mi4wLCAzLjV9OworY29uc3QgUHJvZmlsZVBhcmFtcyBrRmFzdEtub2NrRHJpdmUgPSB7Mi4wLCAzLjB9OworY29uc3QgUHJvZmlsZVBhcmFtcyBrU3RhY2tpbmdTZWNvbmREcml2ZSA9IHsyLjAsIDEuNX07Citjb25zdCBQcm9maWxlUGFyYW1zIGtGYXN0VHVybiA9IHszLjAsIDEwLjB9OworY29uc3QgUHJvZmlsZVBhcmFtcyBrU3RhY2tpbmdGaXJzdFR1cm4gPSB7MS4wLCAxLjB9OworY29uc3QgUHJvZmlsZVBhcmFtcyBrU3RhY2tpbmdTZWNvbmRUdXJuID0gezIuMCwgNi4wfTsKK2NvbnN0IFByb2ZpbGVQYXJhbXMga0NvbWJvVHVybiA9IHsxLjIsIDguMH07Citjb25zdCBQcm9maWxlUGFyYW1zIGtSYWNlVHVybiA9IHs0LjAsIDEwLjB9OworY29uc3QgUHJvZmlsZVBhcmFtcyBrUmFjZURyaXZlID0gezIuMCwgMi4wfTsKK2NvbnN0IFByb2ZpbGVQYXJhbXMga1JhY2VCYWNrdXBEcml2ZSA9IHsyLjAsIDUuMH07CisKKzo6c3RkOjp1bmlxdWVfcHRyPDo6ZnJjOTcxOjphY3RvcnM6OkRyaXZldHJhaW5BY3Rpb24+IFNldERyaXZlR29hbCgKKyAgICBkb3VibGUgZGlzdGFuY2UsIGNvbnN0IFByb2ZpbGVQYXJhbXMgZHJpdmVfcGFyYW1zLCBkb3VibGUgdGhldGEgPSAwLCBjb25zdCBQcm9maWxlUGFyYW1zICZ0dXJuX3BhcmFtcyA9IGtGYXN0VHVybikgeworICBMT0coSU5GTywgIkRyaXZpbmcgdG8gJWZcbiIsIGRpc3RhbmNlKTsKKworICA6OmZyYzk3MTo6YWN0b3JzOjpEcml2ZXRyYWluQWN0aW9uUGFyYW1zIHBhcmFtczsKKyAgcGFyYW1zLmxlZnRfaW5pdGlhbF9wb3NpdGlvbiA9IGxlZnRfaW5pdGlhbF9wb3NpdGlvbjsKKyAgcGFyYW1zLnJpZ2h0X2luaXRpYWxfcG9zaXRpb24gPSByaWdodF9pbml0aWFsX3Bvc2l0aW9uOworICBwYXJhbXMueV9vZmZzZXQgPSBkaXN0YW5jZTsKKyAgcGFyYW1zLnRoZXRhX29mZnNldCA9IHRoZXRhOworICBwYXJhbXMubWF4aW11bV90dXJuX2FjY2VsZXJhdGlvbiA9IHR1cm5fcGFyYW1zLmFjY2VsZXJhdGlvbjsKKyAgcGFyYW1zLm1heGltdW1fdHVybl92ZWxvY2l0eSA9IHR1cm5fcGFyYW1zLnZlbG9jaXR5OworICBwYXJhbXMubWF4aW11bV92ZWxvY2l0eSA9IGRyaXZlX3BhcmFtcy52ZWxvY2l0eTsKKyAgcGFyYW1zLm1heGltdW1fYWNjZWxlcmF0aW9uID0gZHJpdmVfcGFyYW1zLmFjY2VsZXJhdGlvbjsKKyAgYXV0byBkcml2ZXRyYWluX2FjdGlvbiA9IGFjdG9yczo6TWFrZURyaXZldHJhaW5BY3Rpb24ocGFyYW1zKTsKKworICBkcml2ZXRyYWluX2FjdGlvbi0+U3RhcnQoKTsKKyAgbGVmdF9pbml0aWFsX3Bvc2l0aW9uICs9CisgICAgICBkaXN0YW5jZSAtIHRoZXRhICogY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS50dXJuX3dpZHRoIC8gMi4wOworICByaWdodF9pbml0aWFsX3Bvc2l0aW9uICs9CisgICAgICBkaXN0YW5jZSArIHRoZXRhICogY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS50dXJuX3dpZHRoIC8gMi4wOworICByZXR1cm4gOjpzdGQ6Om1vdmUoZHJpdmV0cmFpbl9hY3Rpb24pOworfQorCitjb25zdCBQcm9maWxlUGFyYW1zIGtGcmlkZ2VZUHJvZmlsZXsxLjAsIDQuMH07Citjb25zdCBQcm9maWxlUGFyYW1zIGtGcmlkZ2VYUHJvZmlsZXsxLjAsIDIuMH07Citjb25zdCBQcm9maWxlUGFyYW1zIGtGcmlkZ2VGYXN0WFByb2ZpbGV7MS4yLCA1LjB9OworCitzdGF0aWMgZG91YmxlIGZyaWRnZV9nb2FsX3ggPSAwLjA7CitzdGF0aWMgZG91YmxlIGZyaWRnZV9nb2FsX3kgPSAwLjA7CisKK3ZvaWQgTW92ZUZyaWRnZShkb3VibGUgeCwgZG91YmxlIHksIGJvb2wgZ3JhYmJlcnMsIGNvbnN0IFByb2ZpbGVQYXJhbXMgeF9wYXJhbXMsCisgICAgICAgICAgICAgICAgY29uc3QgUHJvZmlsZVBhcmFtcyB5X3BhcmFtcykgeworICBhdXRvIG5ld19mcmlkZ2VfZ29hbCA9IGZyaWRnZV9xdWV1ZS5nb2FsLk1ha2VNZXNzYWdlKCk7CisgIG5ld19mcmlkZ2VfZ29hbC0+cHJvZmlsaW5nX3R5cGUgPSAxOworCisgIG5ld19mcmlkZ2VfZ29hbC0+bWF4X3lfdmVsb2NpdHkgPSB5X3BhcmFtcy52ZWxvY2l0eTsKKyAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfeV9hY2NlbGVyYXRpb24gPSB5X3BhcmFtcy5hY2NlbGVyYXRpb247CisgIG5ld19mcmlkZ2VfZ29hbC0+eSA9IHk7CisgIGZyaWRnZV9nb2FsX3kgPSB5OworICBuZXdfZnJpZGdlX2dvYWwtPnlfdmVsb2NpdHkgPSAwLjA7CisKKyAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfeF92ZWxvY2l0eSA9IHhfcGFyYW1zLnZlbG9jaXR5OworICBuZXdfZnJpZGdlX2dvYWwtPm1heF94X2FjY2VsZXJhdGlvbiA9IHhfcGFyYW1zLmFjY2VsZXJhdGlvbjsKKyAgbmV3X2ZyaWRnZV9nb2FsLT54ID0geDsKKyAgZnJpZGdlX2dvYWxfeCA9IHg7CisgIG5ld19mcmlkZ2VfZ29hbC0+eF92ZWxvY2l0eSA9IDAuMDsKKworICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLnRvcF9mcm9udCA9IGdyYWJiZXJzOworICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLnRvcF9iYWNrID0gZ3JhYmJlcnM7CisgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMuYm90dG9tX2Zyb250ID0gZ3JhYmJlcnM7CisgIG5ld19mcmlkZ2VfZ29hbC0+Z3JhYmJlcnMuYm90dG9tX2JhY2sgPSBncmFiYmVyczsKKworICBpZiAoIW5ld19mcmlkZ2VfZ29hbC5TZW5kKCkpIHsKKyAgICBMT0coRVJST1IsICJTZW5kaW5nIGZyaWRnZSBnb2FsIGZhaWxlZC5cbiIpOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIFdhaXRGb3JGcmlkZ2UoKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgICBjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworCisgICAgY29uc3RleHByIGRvdWJsZSBrUHJvZmlsZUVycm9yID0gMWUtNTsKKyAgICBjb25zdGV4cHIgZG91YmxlIGtYRXBzaWxvbiA9IDAuMDMsIGtZRXBzaWxvbiA9IDAuMDM7CisKKyAgICBpZiAoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+c3RhdGUgIT0gNCkgeworICAgICAgTE9HKEVSUk9SLCAiRnJpZGdlIG5vIGxvbmdlciBydW5uaW5nLCBhYm9ydGluZyBhY3Rpb25cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICg6OnN0ZDo6YWJzKGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfeCAtIGZyaWRnZV9nb2FsX3gpIDwKKyAgICAgICAgICAgIGtQcm9maWxlRXJyb3IgJiYKKyAgICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT5nb2FsX3kgLSBmcmlkZ2VfZ29hbF95KSA8CisgICAgICAgICAgICBrUHJvZmlsZUVycm9yICYmCisgICAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF94X3ZlbG9jaXR5KSA8CisgICAgICAgICAgICBrUHJvZmlsZUVycm9yICYmCisgICAgICAgIDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF95X3ZlbG9jaXR5KSA8CisgICAgICAgICAgICBrUHJvZmlsZUVycm9yKSB7CisgICAgICBMT0coSU5GTywgIlByb2ZpbGUgZG9uZS5cbiIpOworICAgICAgaWYgKDo6c3RkOjphYnMoY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+eCAtIGZyaWRnZV9nb2FsX3gpIDwKKyAgICAgICAgICAgICAga1hFcHNpbG9uICYmCisgICAgICAgICAgOjpzdGQ6OmFicyhjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLT55IC0gZnJpZGdlX2dvYWxfeSkgPAorICAgICAgICAgICAgICBrWUVwc2lsb24pIHsKKyAgICAgICAgTE9HKElORk8sICJOZWFyIGdvYWwsIGRvbmUuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEluaXRpYWxpemVFbmNvZGVycygpIHsKKyAgY29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZS5zdGF0dXMuRmV0Y2hBbm90aGVyKCk7CisgIGxlZnRfaW5pdGlhbF9wb3NpdGlvbiA9CisgICAgICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy0+ZmlsdGVyZWRfbGVmdF9wb3NpdGlvbjsKKyAgcmlnaHRfaW5pdGlhbF9wb3NpdGlvbiA9CisgICAgICBjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlLnN0YXR1cy0+ZmlsdGVyZWRfcmlnaHRfcG9zaXRpb247Cit9CisKK3ZvaWQgV2FpdEZvckNsYXdaZXJvKCkgeworICBMT0coSU5GTywgIldhaXRpbmcgZm9yIGNsYXcgdG8gemVyby5cbiIpOworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworICAgIExPR19TVFJVQ1QoREVCVUcsICJHb3QgY2xhdyBzdGF0dXMiLCAqY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMpOworICAgIGlmIChjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLnN0YXR1cy0+emVyb2VkKSB7CisgICAgICBMT0coSU5GTywgIkNsYXcgemVyb2VkXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICB9Cit9CisKK3ZvaWQgV2FpdEZvckZyaWRnZVplcm8oKSB7CisgIExPRyhJTkZPLCAiV2FpdGluZyBmb3IgY2xhdyB0byB6ZXJvLlxuIik7CisgIHdoaWxlICh0cnVlKSB7CisgICAgY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy5GZXRjaEFub3RoZXIoKTsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAiR290IGZyaWRnZSBzdGF0dXMiLCAqY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cyk7CisgICAgaWYgKGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPnplcm9lZCkgeworICAgICAgTE9HKElORk8sICJGcmlkZ2UgemVyb2VkXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICB9Cit9CisKK2NvbnN0ZXhwciBQcm9maWxlUGFyYW1zIGtEZWZhdWx0Q2xhd1BhcmFtcyA9IHtrQ2xhd0F1dG9WZWxvY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2xhd0F1dG9BY2NlbGVyYXRpb259OworCisvLyBNb3ZlIHRoZSBjbGF3IGluIGEgdmVyeSBzbWFsbCBudW1iZXIgb2YgY3ljbGVzLgorY29uc3RleHByIFByb2ZpbGVQYXJhbXMga0luc3RhbnRhbmVvdXNDbGF3ID0gezEwMC4wLCAxMDAuMH07Citjb25zdGV4cHIgUHJvZmlsZVBhcmFtcyBrRmFzdENsYXcgPSB7OC4wLCAyMC4wfTsKKwordm9pZCBTZXRDbGF3U3RhdGVOb1dhaXQoZG91YmxlIGFuZ2xlLCBkb3VibGUgaW50YWtlX3ZvbHRhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcm9sbGVyc19jbG9zZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9maWxlUGFyYW1zICZjbGF3X3BhcmFtcyA9IGtEZWZhdWx0Q2xhd1BhcmFtcykgeworICBhdXRvIG1lc3NhZ2UgPSBjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgbWVzc2FnZS0+YW5nbGUgPSBhbmdsZTsKKyAgbWVzc2FnZS0+bWF4X3ZlbG9jaXR5ID0gY2xhd19wYXJhbXMudmVsb2NpdHk7CisgIG1lc3NhZ2UtPm1heF9hY2NlbGVyYXRpb24gPSBjbGF3X3BhcmFtcy5hY2NlbGVyYXRpb247CisgIG1lc3NhZ2UtPmFuZ3VsYXJfdmVsb2NpdHkgPSAwLjA7CisgIG1lc3NhZ2UtPmludGFrZSA9IGludGFrZV92b2x0YWdlOworICBtZXNzYWdlLT5yb2xsZXJzX2Nsb3NlZCA9IHJvbGxlcnNfY2xvc2VkOworCisgIExPR19TVFJVQ1QoREVCVUcsICJTZW5kaW5nIGNsYXcgZ29hbCIsICptZXNzYWdlKTsKKyAgbWVzc2FnZS5TZW5kKCk7Cit9CisKK3ZvaWQgU2V0Q2xhd1N0YXRlKGRvdWJsZSBhbmdsZSwgZG91YmxlIGludGFrZV92b2x0YWdlLCBkb3VibGUgcm9sbGVyc19jbG9zZWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBQcm9maWxlUGFyYW1zICZjbGF3X3BhcmFtcyA9IGtEZWZhdWx0Q2xhd1BhcmFtcykgeworICBTZXRDbGF3U3RhdGVOb1dhaXQoYW5nbGUsIGludGFrZV92b2x0YWdlLCByb2xsZXJzX2Nsb3NlZCwgY2xhd19wYXJhbXMpOworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLkZldGNoQW5vdGhlcigpOworICAgIGNvbnN0IGRvdWJsZSBjdXJyZW50X2FuZ2xlID0gY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMtPmFuZ2xlOworICAgIExPR19TVFJVQ1QoREVCVUcsICJHb3QgY2xhdyBzdGF0dXMiLCAqY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMpOworCisgICAgLy8gSSBiZWxpZXZlIGFsbCB3ZSBjYW4gY2FyZSBhYm91dCBoZXJlIGlzIHRoZSBhbmdsZS4gT3RoZXIgdmFsdWVzIHdpbGwKKyAgICAvLyBlaXRoZXIgYmUgc2V0IG9yIG5vdCwgYnV0IHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0LiBJZiBpdAorICAgIC8vIG5ldmVyIGdldHMgdGhlcmUgd2UgZG8gbm90IGNhcmUsIGF1dG8gaXMgb3ZlciBmb3IgdXMuCisgICAgaWYgKDo6c3RkOjphYnMoY3VycmVudF9hbmdsZSAtIGFuZ2xlKSA8IGtBbmdsZUVwc2lsb24pIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICB9Cit9CisKK3ZvaWQgSGFuZGxlQXV0bygpIHsKKyAgOjphb3M6OnRpbWU6OlRpbWUgc3RhcnRfdGltZSA9IDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKTsKKyAgTE9HKElORk8sICJTdGFydGluZyBhdXRvIG1vZGUgYXQgJWZcbiIsIHN0YXJ0X3RpbWUuVG9TZWNvbmRzKCkpOworICA6OnN0ZDo6dW5pcXVlX3B0cjw6OmZyYzk3MTo6YWN0b3JzOjpEcml2ZXRyYWluQWN0aW9uPiBkcml2ZTsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8OjpmcmM5NzE6OmFjdG9yczo6UGlja3VwQWN0aW9uPiBwaWNrdXA7CisgIDo6c3RkOjp1bmlxdWVfcHRyPDo6ZnJjOTcxOjphY3RvcnM6OlN0YWNrQWN0aW9uPiBzdGFjazsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8OjpmcmM5NzE6OmFjdG9yczo6SGVsZFRvTGlmdEFjdGlvbj4gbGlmdDsKKworICBhY3RvcnM6OlBpY2t1cFBhcmFtcyBwaWNrdXBfcGFyYW1zOworICAvLyBMaWZ0IHRvIGhlcmUgaW5pdGlhbGx5LgorICBwaWNrdXBfcGFyYW1zLnBpY2t1cF9hbmdsZSA9IDAuOTsKKyAgLy8gU3RhcnQgc3Vja2luZyBoZXJlCisgIHBpY2t1cF9wYXJhbXMuc3Vja19hbmdsZSA9IDAuODsKKyAgLy8gR28gYmFjayBkb3duIHRvIGhlcmUgdG8gZmluaXNoIHN1Y2tpbmcuCisgIHBpY2t1cF9wYXJhbXMuc3Vja19hbmdsZV9maW5pc2ggPSAwLjQ7CisgIC8vIFBhY2sgdGhlIGJveCBiYWNrIGluIGhlcmUuCisgIHBpY2t1cF9wYXJhbXMucGlja3VwX2ZpbmlzaF9hbmdsZSA9IGtDbGF3VG90ZVBhY2tBbmdsZTsKKyAgcGlja3VwX3BhcmFtcy5pbnRha2VfdGltZSA9IDAuNzA7CisgIHBpY2t1cF9wYXJhbXMuaW50YWtlX3ZvbHRhZ2UgPSA3LjA7CisKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgSW5pdGlhbGl6ZUVuY29kZXJzKCk7CisgIFJlc2V0RHJpdmV0cmFpbigpOworCisgIFdhaXRGb3JDbGF3WmVybygpOworICBXYWl0Rm9yRnJpZGdlWmVybygpOworCisgIC8vIEluaXRpYWxpemUgdGhlIGZyaWRnZS4KKyAgTW92ZUZyaWRnZSgwLjAsIDAuMywgdHJ1ZSwga0ZyaWRnZVhQcm9maWxlLCBrRnJpZGdlWVByb2ZpbGUpOworCisgIExPRyhJTkZPLCAiTG93ZXJpbmcgY2xhdyBpbnRvIHBvc2l0aW9uLlxuIik7CisgIFNldENsYXdTdGF0ZSgwLjAsIDIuMCwgZmFsc2UsIGtJbnN0YW50YW5lb3VzQ2xhdyk7CisKKyAgTE9HKElORk8sICJTdWNraW5nIGluIHRvdGUuXG4iKTsKKyAgU2V0Q2xhd1N0YXRlKDAuMCwgNi4wLCB0cnVlLCBrSW5zdGFudGFuZW91c0NsYXcpOworCisgIHRpbWU6OlNsZWVwRm9yKHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjcpKTsKKyAgTE9HKElORk8sICJEb25lIHN1Y2tpbmcgaW4gdG90ZVxuIik7CisKKyAgLy8gTm93IHBpY2sgaXQgdXAKKyAgcGlja3VwID0gYWN0b3JzOjpNYWtlUGlja3VwQWN0aW9uKHBpY2t1cF9wYXJhbXMpOworICBwaWNrdXAtPlN0YXJ0KCk7CisKKyAgdGltZTo6U2xlZXBGb3IodGltZTo6VGltZTo6SW5TZWNvbmRzKDAuOSkpOworICAvLyBTdGFydCB0dXJuaW5nLgorICBMT0coSU5GTywgIlR1cm5pbmcgaW4gcGxhY2VcbiIpOworICBkcml2ZSA9IFNldERyaXZlR29hbCgwLjAsIGtGYXN0RHJpdmUsIC0wLjIzLCBrU3RhY2tpbmdGaXJzdFR1cm4pOworCisgIFdhaXRVbnRpbERvbmVPckNhbmNlbGVkKDo6c3RkOjptb3ZlKGRyaXZlKSk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisKKyAgTE9HKElORk8sICJOb3cgZHJpdmluZyBuZXh0IHRvIHRoZSBjYW5cbiIpOworICBkcml2ZSA9IFNldERyaXZlR29hbCgwLjYwLCBrRmFzdERyaXZlKTsKKworICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShwaWNrdXApKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICAvLyBOb3cgZ3JhYiBpdCBpbiB0aGUgZnJpZGdlLgorICB7CisgICAgYWN0b3JzOjpTdGFja1BhcmFtcyBwYXJhbXM7CisKKyAgICBwYXJhbXMuY2xhd19vdXRfYW5nbGUgPSBrQ2xhd1RvdGVQYWNrQW5nbGU7CisgICAgcGFyYW1zLmJvdHRvbSA9IDAuMDIwOworICAgIHBhcmFtcy5vbmx5X3BsYWNlID0gZmFsc2U7CisgICAgcGFyYW1zLmFybV9jbGVhcmFuY2UgPSBrQXJtUmFpc2VMb3dlckNsZWFyYW5jZTsKKyAgICBwYXJhbXMub3Zlcl9ib3hfYmVmb3JlX3BsYWNlX2hlaWdodCA9IDAuMzk7CisKKyAgICBzdGFjayA9IGFjdG9yczo6TWFrZVN0YWNrQWN0aW9uKHBhcmFtcyk7CisgICAgc3RhY2stPlN0YXJ0KCk7CisgIH0KKyAgV2FpdFVudGlsRG9uZU9yQ2FuY2VsZWQoOjpzdGQ6Om1vdmUoc3RhY2spKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICAvLyBMb3dlciB0aGUgY2xhdyB0byBrbm9jayB0aGUgdG90ZS4KKyAgTE9HKElORk8sICJMb3dlcmluZyB0aGUgY2xhdyB0byBrbm9jayB0aGUgdG90ZVxuIik7CisgIFNldENsYXdTdGF0ZU5vV2FpdCgwLjAsIDAuMCwgdHJ1ZSwga0Zhc3RDbGF3KTsKKworICB0aW1lOjpTbGVlcEZvcih0aW1lOjpUaW1lOjpJblNlY29uZHMoMC4xKSk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisKKyAgV2FpdFVudGlsRG9uZU9yQ2FuY2VsZWQoOjpzdGQ6Om1vdmUoZHJpdmUpKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICBMT0coSU5GTywgIktub2NraW5nIHRoZSBjYW4gb3ZlclxuIik7CisgIGRyaXZlID0gU2V0RHJpdmVHb2FsKDAuNDAsIGtGYXN0S25vY2tEcml2ZSwgMS4wNSwga0NvbWJvVHVybik7CisgIFdhaXRVbnRpbERvbmVPckNhbmNlbGVkKDo6c3RkOjptb3ZlKGRyaXZlKSk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgIHsKKyAgICBhY3RvcnM6OkhlbGRUb0xpZnRQYXJhbXMgcGFyYW1zOworICAgIHBhcmFtcy5hcm1fY2xlYXJhbmNlID0ga0FybVJhaXNlTG93ZXJDbGVhcmFuY2U7CisgICAgcGFyYW1zLmNsYW1wX3BhdXNlX3RpbWUgPSAwLjE7CisgICAgcGFyYW1zLmJlZm9yZV9saWZ0X3NldHRsZV90aW1lID0gMC4xOworICAgIHBhcmFtcy5ib3R0b21faGVpZ2h0ID0gMC4wMjA7CisgICAgcGFyYW1zLmNsYXdfb3V0X2FuZ2xlID0ga0NsYXdTdGFja0NsZWFyYW5jZTsKKyAgICBwYXJhbXMubGlmdF9wYXJhbXMubGlmdF9oZWlnaHQgPSBrU3RhY2tVcEhlaWdodDsKKyAgICBwYXJhbXMubGlmdF9wYXJhbXMubGlmdF9hcm0gPSBrU3RhY2tVcEFybTsKKyAgICBwYXJhbXMubGlmdF9wYXJhbXMuc2Vjb25kX2xpZnQgPSBmYWxzZTsKKworICAgIGxpZnQgPSBhY3RvcnM6Ok1ha2VIZWxkVG9MaWZ0QWN0aW9uKHBhcmFtcyk7CisgICAgbGlmdC0+U3RhcnQoKTsKKyAgfQorCisgIExPRyhJTkZPLCAiVHVybmluZyBiYWNrIHRvIGFpbVxuIik7CisgIGRyaXZlID0gU2V0RHJpdmVHb2FsKDAuMCwga0Zhc3REcml2ZSwgLTAuNzApOworICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShkcml2ZSkpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworCisgIFNldENsYXdTdGF0ZU5vV2FpdCgwLjAsIDQuMCwgZmFsc2UsIGtGYXN0Q2xhdyk7CisgIExPRyhJTkZPLCAiTm93IGRyaXZpbmcgdGhlIHNlY29uZCB0b3RlXG4iKTsKKyAgZHJpdmUgPSBTZXREcml2ZUdvYWwoMS4wNSwga0Zhc3REcml2ZSk7CisKKyAgLy8gV2FpdCB1bnRpbCB3ZSBhcmUgYWxtb3N0IGF0IHRoZSB0b3RlLCBhbmQgdGhlbiBzdGFydCBpbnRha2luZy4KKyAgV2FpdFVudGlsTmVhcigwLjM1KTsKKworICBTZXRDbGF3U3RhdGUoMC4wLCA2LjAsIHRydWUsIGtGYXN0Q2xhdyk7CisgIFdhaXRVbnRpbERvbmVPckNhbmNlbGVkKDo6c3RkOjptb3ZlKGRyaXZlKSk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgdGltZTo6U2xlZXBGb3IodGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMzApKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICBTZXRDbGF3U3RhdGVOb1dhaXQoMC4wLCA0LjAsIHRydWUsIGtGYXN0Q2xhdyk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisgIHRpbWU6OlNsZWVwRm9yKHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjEwKSk7CisKKyAgV2FpdFVudGlsRG9uZU9yQ2FuY2VsZWQoOjpzdGQ6Om1vdmUobGlmdCkpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworCisgIExPRyhJTkZPLCAiRG9uZSBzdWNraW5nIGluIHRvdGVcbiIpOworICBTZXRDbGF3U3RhdGUoMC4wLCAwLjAsIHRydWUsIGtGYXN0Q2xhdyk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisKKyAgLy8gTm93IHBpY2sgaXQgdXAKKyAgcGlja3VwID0gYWN0b3JzOjpNYWtlUGlja3VwQWN0aW9uKHBpY2t1cF9wYXJhbXMpOworICBwaWNrdXAtPlN0YXJ0KCk7CisKKyAgdGltZTo6U2xlZXBGb3IodGltZTo6VGltZTo6SW5TZWNvbmRzKDEuMCkpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworCisgIC8vIFN0YXJ0IHR1cm5pbmcuCisgIExPRyhJTkZPLCAiVHVybmluZyBpbiBwbGFjZVxuIik7CisgIGRyaXZlID0gU2V0RHJpdmVHb2FsKDAuMCwga1N0YWNraW5nU2Vjb25kRHJpdmUsIC0wLjQwLCBrU3RhY2tpbmdTZWNvbmRUdXJuKTsKKworICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShwaWNrdXApKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICAvLyBOb3cgZ3JhYiBpdCBpbiB0aGUgZnJpZGdlLgorICB7CisgICAgYWN0b3JzOjpTdGFja1BhcmFtcyBwYXJhbXM7CisKKyAgICBwYXJhbXMuY2xhd19vdXRfYW5nbGUgPSBrQ2xhd1RvdGVQYWNrQW5nbGU7CisgICAgcGFyYW1zLmJvdHRvbSA9IDAuMDIwOworICAgIHBhcmFtcy5vbmx5X3BsYWNlID0gZmFsc2U7CisgICAgcGFyYW1zLmFybV9jbGVhcmFuY2UgPSBrQXJtUmFpc2VMb3dlckNsZWFyYW5jZTsKKyAgICBwYXJhbXMub3Zlcl9ib3hfYmVmb3JlX3BsYWNlX2hlaWdodCA9IDAuMzk7CisKKyAgICBzdGFjayA9IGFjdG9yczo6TWFrZVN0YWNrQWN0aW9uKHBhcmFtcyk7CisgICAgc3RhY2stPlN0YXJ0KCk7CisgIH0KKworICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShkcml2ZSkpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworICBMT0coSU5GTywgIkRyaXZpbmcgbmV4dCB0byB0aGUgY2FuLlxuIik7CisgIGRyaXZlID0gU2V0RHJpdmVHb2FsKDAuNjUsIGtTdGFja2luZ1NlY29uZERyaXZlKTsKKworICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShzdGFjaykpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworCisgIC8vIExvd2VyIHRoZSBjbGF3IHRvIGtub2NrIHRoZSB0b3RlLgorICBMT0coSU5GTywgIkxvd2VyaW5nIHRoZSBjbGF3IHRvIGtub2NrIHRoZSB0b3RlXG4iKTsKKyAgU2V0Q2xhd1N0YXRlTm9XYWl0KDAuMCwgMC4wLCB0cnVlLCBrRmFzdENsYXcpOworCisgIC8vIExpZnQgdGhlIGZyaWRnZS4KKyAgTW92ZUZyaWRnZSgwLjAsIDAuMywgdHJ1ZSwga0ZyaWRnZVhQcm9maWxlLCBrRnJpZGdlWVByb2ZpbGUpOworCisgIHRpbWU6OlNsZWVwRm9yKHRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjEpKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShkcml2ZSkpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworCisgIExPRyhJTkZPLCAiS25vY2tpbmcgdGhlIGNhbiBvdmVyXG4iKTsKKyAgZHJpdmUgPSBTZXREcml2ZUdvYWwoMC40MCwga0Zhc3RLbm9ja0RyaXZlLCAxLjA1LCBrQ29tYm9UdXJuKTsKKyAgV2FpdFVudGlsRG9uZU9yQ2FuY2VsZWQoOjpzdGQ6Om1vdmUoZHJpdmUpKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICBMT0coSU5GTywgIlR1cm5pbmcgYmFjayB0byBhaW1cbiIpOworICBkcml2ZSA9IFNldERyaXZlR29hbCgwLjAsIGtGYXN0RHJpdmUsIC0wLjYwKTsKKyAgV2FpdFVudGlsRG9uZU9yQ2FuY2VsZWQoOjpzdGQ6Om1vdmUoZHJpdmUpKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworCisgIFNldENsYXdTdGF0ZU5vV2FpdCgwLjAsIDQuMCwgZmFsc2UsIGtGYXN0Q2xhdyk7CisgIExPRyhJTkZPLCAiTm93IGRyaXZpbmcgdG8gdGhlIGxhc3QgdG90ZVxuIik7CisgIGRyaXZlID0gU2V0RHJpdmVHb2FsKDEuMDUsIGtGYXN0RHJpdmUpOworICBXYWl0VW50aWxOZWFyKDAuMDUpOworCisgIFNldENsYXdTdGF0ZSgwLjAsIDcuMCwgdHJ1ZSwga0Zhc3RDbGF3KTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICB0aW1lOjpTbGVlcEZvcih0aW1lOjpUaW1lOjpJblNlY29uZHMoMC4yKSk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisKKyAgV2FpdFVudGlsRG9uZU9yQ2FuY2VsZWQoOjpzdGQ6Om1vdmUoZHJpdmUpKTsKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKyAgU2V0Q2xhd1N0YXRlKDAuMCwgNi4wLCB0cnVlLCBrRmFzdENsYXcpOworCisgIExPRyhJTkZPLCAiUmFjaW5nIG92ZXJcbiIpOworICAvL1N0ZXBEcml2ZSgyLjUsIC0xLjQpOworICBkcml2ZSA9IFNldERyaXZlR29hbCgyLjUsIGtSYWNlRHJpdmUsIC0xLjQsIGtSYWNlVHVybik7CisKKyAgdGltZTo6U2xlZXBGb3IodGltZTo6VGltZTo6SW5TZWNvbmRzKDAuNSkpOworCisgIExPRyhJTkZPLCAiTW92aW5nIHRvdGVzIG91dFxuIik7CisgIE1vdmVGcmlkZ2UoMC42LCAwLjMyLCB0cnVlLCBrRnJpZGdlWFByb2ZpbGUsIGtGcmlkZ2VZUHJvZmlsZSk7CisKKyAgV2FpdEZvckZyaWRnZSgpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworCisgIExPRyhJTkZPLCAiTG93ZXJpbmcgdG90ZXNcbiIpOworICBNb3ZlRnJpZGdlKDAuNiwgMC4xNSwgZmFsc2UsIGtGcmlkZ2VYUHJvZmlsZSwga0ZyaWRnZVlQcm9maWxlKTsKKworICBXYWl0Rm9yRnJpZGdlKCk7CisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisKKyAgdGltZTo6U2xlZXBGb3IodGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMSkpOworCisgIGlmIChTaG91bGRFeGl0QXV0bygpKSByZXR1cm47CisKKyAgTE9HKElORk8sICJSZXRyYWN0aW5nXG4iKTsKKyAgTW92ZUZyaWRnZSgwLjAsIDAuMTAsIGZhbHNlLCBrRnJpZGdlRmFzdFhQcm9maWxlLCBrRnJpZGdlWVByb2ZpbGUpOworCisgIFNldENsYXdTdGF0ZSgwLjAsIDAuMCwgZmFsc2UsIGtGYXN0Q2xhdyk7CisKKyAgaWYgKFNob3VsZEV4aXRBdXRvKCkpIHJldHVybjsKKworICBXYWl0VW50aWxEb25lT3JDYW5jZWxlZCg6OnN0ZDo6bW92ZShkcml2ZSkpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworCisgIExPRyhJTkZPLCAiQmFja2luZyBhd2F5IHRvIGxldCB0aGUgc3RhY2sgYWdvXG4iKTsKKyAgZHJpdmUgPSBTZXREcml2ZUdvYWwoLTAuMSwga1JhY2VCYWNrdXBEcml2ZSk7CisgIFdhaXRVbnRpbERvbmVPckNhbmNlbGVkKDo6c3RkOjptb3ZlKGRyaXZlKSk7CisKKyAgV2FpdEZvckZyaWRnZSgpOworICBpZiAoU2hvdWxkRXhpdEF1dG8oKSkgcmV0dXJuOworfQorCit9ICAvLyBuYW1lc3BhY2UgYXV0b25vbW91cworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTUvYXV0b25vbW91cy9hdXRvLmggYi95MjAxNS9hdXRvbm9tb3VzL2F1dG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMzNzE1Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYXV0b25vbW91cy9hdXRvLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBZMjAxNV9BVVRPTk9NT1VTX0FVVE9fSF8KKyNkZWZpbmUgWTIwMTVfQVVUT05PTU9VU19BVVRPX0hfCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGF1dG9ub21vdXMgeworCit2b2lkIEhhbmRsZUF1dG8oKTsKKworfSAgLy8gbmFtZXNwYWNlIGF1dG9ub21vdXMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBZMjAxNV9BVVRPTk9NT1VTX0FVVE9fSF8KZGlmZiAtLWdpdCBhL3kyMDE1L2F1dG9ub21vdXMvYXV0b19tYWluLmNjIGIveTIwMTUvYXV0b25vbW91cy9hdXRvX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyNGU2YwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2F1dG9ub21vdXMvYXV0b19tYWluLmNjCkBAIC0wLDAgKzEsNDIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiZnJjOTcxL2F1dG9ub21vdXMvYXV0by5xLmgiCisjaW5jbHVkZSAieTIwMTUvYXV0b25vbW91cy9hdXRvLmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCitpbnQgbWFpbihpbnQgLyphcmdjKi8sIGNoYXIgKiAvKmFyZ3YqL1tdKSB7CisgIDo6YW9zOjpJbml0KCk7CisKKyAgTE9HKElORk8sICJBdXRvIG1haW4gc3RhcnRlZFxuIik7CisgIDo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLkZldGNoTGF0ZXN0KCk7CisgIHdoaWxlICghOjpmcmM5NzE6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuZ2V0KCkpIHsKKyAgICA6OmZyYzk3MTo6YXV0b25vbW91czo6YXV0b25vbW91cy5GZXRjaE5leHRCbG9ja2luZygpOworICAgIExPRyhJTkZPLCAiR290IGFub3RoZXIgYXV0byBwYWNrZXRcbiIpOworICB9CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB3aGlsZSAoITo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLT5ydW5fYXV0bykgeworICAgICAgOjpmcmM5NzE6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICAgIExPRyhJTkZPLCAiR290IGFub3RoZXIgYXV0byBwYWNrZXRcbiIpOworICAgIH0KKyAgICBMT0coSU5GTywgIlN0YXJ0aW5nIGF1dG8gbW9kZVxuIik7CisgICAgOjphb3M6OnRpbWU6OlRpbWUgc3RhcnRfdGltZSA9IDo6YW9zOjp0aW1lOjpUaW1lOjpOb3coKTsKKyAgICA6OmZyYzk3MTo6YXV0b25vbW91czo6SGFuZGxlQXV0bygpOworCisgICAgOjphb3M6OnRpbWU6OlRpbWUgZWxhcHNlZF90aW1lID0gOjphb3M6OnRpbWU6OlRpbWU6Ok5vdygpIC0gc3RhcnRfdGltZTsKKyAgICBMT0coSU5GTywgIkF1dG8gbW9kZSBleGl0ZWQgaW4gJWYsIHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC5cbiIsCisgICAgICAgIGVsYXBzZWRfdGltZS5Ub1NlY29uZHMoKSk7CisgICAgd2hpbGUgKDo6ZnJjOTcxOjphdXRvbm9tb3VzOjphdXRvbm9tb3VzLT5ydW5fYXV0bykgeworICAgICAgOjpmcmM5NzE6OmF1dG9ub21vdXM6OmF1dG9ub21vdXMuRmV0Y2hOZXh0QmxvY2tpbmcoKTsKKyAgICAgIExPRyhJTkZPLCAiR290IGFub3RoZXIgYXV0byBwYWNrZXRcbiIpOworICAgIH0KKyAgICBMT0coSU5GTywgIldhaXRpbmcgZm9yIGF1dG8gdG8gc3RhcnQgYmFjayB1cC5cbiIpOworICB9CisgIDo6YW9zOjpDbGVhbnVwKCk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS95MjAxNS9hdXRvbm9tb3VzL2F1dG9ub21vdXMuZ3lwIGIveTIwMTUvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg5OGU4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cApAQCAtMCwwICsxLDQzIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdhdXRvX2xpYicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2F1dG8uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvYXV0b25vbW91cy9hdXRvbm9tb3VzLmd5cDphdXRvX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXA6ZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNS95MjAxNS5neXA6Y29uc3RhbnRzJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpwaGFzZWRfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dHJhcGV6b2lkX3Byb2ZpbGUnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9hY3RvcnMvYWN0b3JzLmd5cDpkcml2ZXRyYWluX2FjdGlvbl9saWInLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgICAnPChERVBUSCkveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwOmNsYXdfcXVldWUnLAorICAgICAgICAnPChERVBUSCkveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLmd5cDpmcmlkZ2VfcXVldWUnLAorICAgICAgICAnPChERVBUSCkveTIwMTUvYWN0b3JzL2FjdG9ycy5neXA6c3RhY2tfYWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9hY3RvcnMvYWN0b3JzLmd5cDpoZWxkX3RvX2xpZnRfYWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9hY3RvcnMvYWN0b3JzLmd5cDpwaWNrdXBfYWN0aW9uX2xpYicsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdhdXRvJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhdXRvX21haW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9hdXRvbm9tb3VzL2F1dG9ub21vdXMuZ3lwOmF1dG9fcXVldWUnLAorICAgICAgICAnYXV0b19saWInLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEveTIwMTUvY29uc3RhbnRzLmNjIGIveTIwMTUvY29uc3RhbnRzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjY2NzIKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb25zdGFudHMuY2MKQEAgLTAsMCArMSwzODEgQEAKKyNpbmNsdWRlICJ5MjAxNS9jb25zdGFudHMuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8bWFwPgorCisjaWYgX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikKKyNpbmNsdWRlICJzYW5pdGl6ZXIvbHNhbl9pbnRlcmZhY2UuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL29uY2UuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL25ldHdvcmsvdGVhbV9udW1iZXIuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL211dGV4LmgiCisKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgiCisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb25zdGFudHMgeworbmFtZXNwYWNlIHsKKworY29uc3QgdWludDE2X3Qga0NvbXBUZWFtTnVtYmVyID0gOTcxOworY29uc3QgdWludDE2X3Qga1ByYWN0aWNlVGVhbU51bWJlciA9IDk5NzE7CisKKy8vIC8vLy8vIERyaXZldHJhaW4gQ29uc3RhbnRzCisKKy8vIFRoZXNlIHRocmVlIGNvbnN0YW50cyB3ZXJlIHNldCBieSBEYW5pZWwgb24gMi8xMy8xNS4KK2NvbnN0IGRvdWJsZSBrRHJpdmV0cmFpbkVuY29kZXJSYXRpbyA9IDIwLjAgLyA1MC4wOworY29uc3QgZG91YmxlIGtMb3dHZWFyUmF0aW8gPSBrRHJpdmV0cmFpbkVuY29kZXJSYXRpbyAqIDIwLjAgLyA1MC4wOworY29uc3QgZG91YmxlIGtIaWdoR2VhclJhdGlvID0ga0xvd0dlYXJSYXRpbzsKKworY29uc3QgU2hpZnRlckhhbGxFZmZlY3Qga0NvbXBSaWdodERyaXZlU2hpZnRlcns1NTUsIDY1NywgNjYwLCA1NjAsIDAuMiwgMC43fTsKK2NvbnN0IFNoaWZ0ZXJIYWxsRWZmZWN0IGtDb21wTGVmdERyaXZlU2hpZnRlcns1NTUsIDY2MCwgNjQ0LCA1NTIsIDAuMiwgMC43fTsKKworY29uc3QgU2hpZnRlckhhbGxFZmZlY3Qga1ByYWN0aWNlUmlnaHREcml2ZVNoaWZ0ZXJ7Mi45NSwgMy45NSwgMy45NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTUsIDAuMiwgIDAuN307Citjb25zdCBTaGlmdGVySGFsbEVmZmVjdCBrUHJhY3RpY2VMZWZ0RHJpdmVTaGlmdGVyezIuOTUsIDQuMiwgMy45NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wLCAgMC4yLCAwLjd9OworY29uc3QgZG91YmxlIGtUb3RlSGVpZ2h0ID0gMC4zOworCisvLyBTZXQgYnkgRGFuaWVsIG9uIDIvMTMvMTUuCisvLyBEaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGxlZnQgd2hlZWwgdG8gdGhlIGNlbnRlciBvZiB0aGUgcmlnaHQgd2hlZWwuCitjb25zdCBkb3VibGUga1JvYm90V2lkdGggPSAzNy44MDYgLyppbmNoZXMqLyAqIDAuMDI1NDsKKworLy8gLy8vLy8gU3VwZXJzdHJ1Y3R1cmUgQ29uc3RhbnRzCisKKy8vIEVsZXZhdG9yIGdlYXJib3ggcHVsbGV5IG91dHB1dCBjb25zdGFudHMuCitjb25zdCBpbnQga0VsZXZhdG9yR2VhcmJveE91dHB1dFB1bGxleVRlZXRoID0gMzI7ICAvLyAzMiB0ZWV0aAorY29uc3QgZG91YmxlIGtFbGV2YXRvckdlYXJib3hPdXRwdXRQaXRjaCA9IDAuMDA1OyAgLy8gNSBtbS90b290aAorY29uc3QgZG91YmxlIGtFbGV2YXRvckdlYXJib3hPdXRwdXRSYWRpYW5EaXN0YW5jZSA9CisgICAga0VsZXZhdG9yR2VhcmJveE91dHB1dFB1bGxleVRlZXRoICoga0VsZXZhdG9yR2VhcmJveE91dHB1dFBpdGNoIC8KKyAgICAoMi4wICogTV9QSSk7CisKK2NvbnN0IGRvdWJsZSBrQXJtWmVyb2luZ0hlaWdodCA9IDAuMjsKKworY29uc3QgZG91YmxlIGtNYXhBbGxvd2VkTGVmdFJpZ2h0QXJtRGlmZmVyZW5jZSA9IDAuMTI7ICAvLyByYWRpYW5zCitjb25zdCBkb3VibGUga01heEFsbG93ZWRMZWZ0UmlnaHRFbGV2YXRvckRpZmZlcmVuY2UgPSAwLjA0OyAgLy8gbWV0ZXJzCisKK2NvbnN0IFZhbHVlczo6Q2xhd0dlb21ldHJ5IGtDbGF3R2VvbWV0cnl7CisgICAgLy8gSG9yaXpvbnRhbCBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGdyYWJiZXIgdG8gdGhlIGVuZC4KKyAgICAwLjUgKiAxOC4wICogMC4wMjU0LAorICAgIC8vIFZlcnRpY2FsIGRpc3RhbmNlIGZyb20gdGhlIGFybSByb3RhdGlvbiBjZW50ZXIgdG8gdGhlIGJvdHRvbSBvZgorICAgIC8vIHRoZQorICAgIC8vIGdyYWJiZXIuICBEaXN0YW5jZSBtZWFzdXJlZCB3aXRoIGFybSB2ZXJ0aWNhbCAodGhldGEgPSAwKS4KKyAgICA1LjEgKiAwLjAyNTQsCisgICAgLy8gVmVydGljYWwgc2VwYXJhdGlvbiBvZiB0aGUgY2xhdyBhbmQgYXJtIHJvdGF0aW9uIGNlbnRlcnMgd2l0aCB0aGUKKyAgICAvLyBlbGV2YXRvciBhdCAwLjAgYW5kIHRoZSBhcm0gYW5nbGUgc2V0IHRvIHplcm8uCisgICAgMTAuNSAqIDAuMDI1NCwKKyAgICAvLyBIb3Jpem9udGFsIHNlcGFyYXRpb24gb2YgdGhlIGNsYXcgYW5kIGFybSByb3RhdGlvbiBjZW50ZXJzIHdpdGgKKyAgICAvLyB0aGUKKyAgICAvLyBlbGV2YXRvciBhdCAwLjAgYW5kIHRoZSBhcm0gYW5nbGUgc2V0IHRvIHplcm8uCisgICAgNi41ICogMC4wMjU0LAorICAgIC8vIERpc3RhbmNlIGJldHdlZW4gdGhlIGNlbnRlciBvZiB0aGUgY2xhdyB0byB0aGUgdG9wIG9mIHRoZSBjbGF3LgorICAgIC8vIDIuNzUgaW5jaGVzIHdvdWxkIHdvcmsgbW9zdCBvZiB0aGUgdGltZS4gIFVzaW5nIDMuNSBpbmNoZXMgYmVjYXVzZQorICAgIC8vIG9mIHRoZQorICAgIC8vIHBudW1hdGljcyBmaXR0aW5nIG9uIHRoZSBwaXN0b24uCisgICAgMy41ICogMC4wMjU0LAorICAgIC8vIFRoZSBncmFiYmVyIGlzIHNhZmUgYXQgYW55IGhlaWdodCBpZiBpdCBpcyBiZWhpbmQgdGhpcyBsb2NhdGlvbi4KKyAgICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGdyYWJiZXIgaXMgdXNlZCBoZXJlIGFuZCBub3QgdGhlIGxvY2F0aW9uIG9mCisgICAgLy8gdGhlIGVuZAorICAgIC8vIG9mIHRoZSBncmFiYmVyLiAgVGhlIGdyYWJiZXIgbG9jYXRpb24gaXMgKDAsIDApIHdoZW4gdGhlIGVsZXZhdG9yCisgICAgLy8gaXMgYXQgMAorICAgIC8vIGFuZCB0aGUgYXJtIGFuZ2xlIGlzIDAuCisgICAgKDE4LjAgLSAwLjMpICogMC4wMjU0LAorICAgIC8vIFRoZSBncmFiYmVyIGlzIHNhZmUgYXQgYW55IHggaWYgaXQgaXMgYWJvdmUgdGhpcyBsb2NhdGlvbi4KKyAgICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGdyYWJiZXIgaXMgdXNlZCBoZXJlIGFuZCBub3QgdGhlIGxvY2F0aW9uIG9mCisgICAgLy8gdGhlIGVuZAorICAgIC8vIG9mIHRoZSBncmFiYmVyLiAgVGhlIGdyYWJiZXIgbG9jYXRpb24gaXMgKDAsIDApIHdoZW4gdGhlIGVsZXZhdG9yCisgICAgLy8gaXMgYXQgMAorICAgIC8vIGFuZCB0aGUgYXJtIGFuZ2xlIGlzIDAuCisgICAgLy8gVGhlICItNS40IiBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGJvdHRvbSBvZiB0aGUgZ3JhYmJlciB3aGVuCisgICAgLy8gdGhlIGVsZXZhdG9yIGlzIGF0IHRoZSBib3R0b20gKC0wLjMgaW5jaGVzKSBhbmQgYXJtIGFuZ2xlIGlzIDAuCisgICAgLTguMCAqIDAuMDI1NCwKK307CisKKy8vIEdlYXJpbmcgcmF0aW9zIG9mIHRoZSBwb3RzIGFuZCBlbmNvZGVycyBmb3IgdGhlIGVsZXZhdG9yIGFuZCBhcm0uCisvLyBSYXRpbyBpcyBvdXRwdXQgc2hhZnQgcm90YXRpb25zIHBlciBlbmNvZGVyL3BvdCByb3RhdGlvbgorLy8gQ2hlY2tlZCBieSBEYW5pZWwgb24gMi8xMy8xNS4KK2NvbnN0IGRvdWJsZSBrQXJtRW5jb2RlclJhdGlvID0gMTguMCAvIDQ4LjAgKiAxNi4wIC8gNzIuMDsKK2NvbnN0IGRvdWJsZSBrQXJtUG90UmF0aW8gPSA0OC4wIC8gNDguMCAqIDE2LjAgLyA3Mi4wOworY29uc3QgZG91YmxlIGtFbGV2YXRvckVuY29kZXJSYXRpbyA9IDE0LjAgLyA4NC4wOworY29uc3QgZG91YmxlIGtFbGV2YXRvclBvdFJhdGlvID0gMS4wOworY29uc3QgZG91YmxlIGtDbGF3RW5jb2RlclJhdGlvID0gMTguMCAvIDcyLjA7Citjb25zdCBkb3VibGUga0NsYXdQb3RSYXRpbyA9IDE4LjAgLyA3Mi4wOworCisvLyBOdW1iZXIgb2YgcmFkaWFucyBiZXR3ZWVuIGVhY2ggaW5kZXggcHVsc2Ugb24gdGhlIGFybS4KK2NvbnN0IGRvdWJsZSBrQXJtRW5jb2RlckluZGV4RGlmZmVyZW5jZSA9IDIuMCAqIE1fUEkgKiBrQXJtRW5jb2RlclJhdGlvOworLy8gTnVtYmVyIG9mIG1ldGVycyBiZXR3ZWVuIGVhY2ggaW5kZXggcHVsc2Ugb24gdGhlIGVsZXZhdG9yLgorY29uc3QgZG91YmxlIGtFbGV2YXRvckVuY29kZXJJbmRleERpZmZlcmVuY2UgPQorICAgIGtFbGV2YXRvckVuY29kZXJSYXRpbyAqIDIuMCAqIE1fUEkgKiAgLy8gcmFkaWFucworICAgIGtFbGV2YXRvckdlYXJib3hPdXRwdXRSYWRpYW5EaXN0YW5jZTsKKy8vIE51bWJlciBvZiByYWRpYW5zIGJldHdlZW4gaW5kZXggcHVsc2VzIG9uIHRoZSBjbGF3LgorY29uc3QgZG91YmxlIGtDbGF3RW5jb2RlckluZGV4RGlmZmVyZW5jZSA9IDIuMCAqIE1fUEkgKiBrQ2xhd0VuY29kZXJSYXRpbzsKKworY29uc3QgaW50IGtaZXJvaW5nU2FtcGxlU2l6ZSA9IDIwMDsKKworLy8gVGhlIGxlbmd0aCBvZiB0aGUgYXJtLgorY29uc3QgZG91YmxlIGtBcm1MZW5ndGggPSAwLjczNjY7CisKKy8vIFRPRE8oZGFuaWVscCk6IEFsbCB0aGVzZSB2YWx1ZXMgbWlnaHQgbmVlZCB0byBjaGFuZ2UuCitjb25zdCBkb3VibGUga0NsYXdQaXN0b25Td2l0Y2hUaW1lID0gMC40OworY29uc3QgZG91YmxlIGtDbGF3WmVyb2luZ1JhbmdlID0gMC4zOworCitjb25zdCBWYWx1ZXMgKkRvR2V0VmFsdWVzRm9yVGVhbSh1aW50MTZfdCB0ZWFtKSB7CisgIHN3aXRjaCAodGVhbSkgeworICAgIGNhc2UgMTogIC8vIGZvciB0ZXN0cworICAgICAgcmV0dXJuIG5ldyBWYWx1ZXN7CisgICAgICAgICAga0RyaXZldHJhaW5FbmNvZGVyUmF0aW8sCisgICAgICAgICAga0FybUVuY29kZXJSYXRpbywKKyAgICAgICAgICBrQXJtUG90UmF0aW8sCisgICAgICAgICAga0VsZXZhdG9yRW5jb2RlclJhdGlvLAorICAgICAgICAgIGtFbGV2YXRvclBvdFJhdGlvLAorICAgICAgICAgIGtFbGV2YXRvckdlYXJib3hPdXRwdXRSYWRpYW5EaXN0YW5jZSwKKyAgICAgICAgICBrQ2xhd0VuY29kZXJSYXRpbywKKyAgICAgICAgICBrQ2xhd1BvdFJhdGlvLAorICAgICAgICAgIGtUb3RlSGVpZ2h0LAorICAgICAgICAgIGtMb3dHZWFyUmF0aW8sCisgICAgICAgICAga0hpZ2hHZWFyUmF0aW8sCisgICAgICAgICAga0NvbXBMZWZ0RHJpdmVTaGlmdGVyLAorICAgICAgICAgIGtDb21wUmlnaHREcml2ZVNoaWZ0ZXIsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgMC41LAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6Ok1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb29wLAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6Ok1ha2VEcml2ZXRyYWluTG9vcCwKKyAgICAgICAgICAwLjAyLCAgLy8gZHJpdmV0cmFpbiBkb25lIGRlbHRhCisgICAgICAgICAgNS4wLCAgIC8vIGRyaXZldHJhaW4gbWF4IHNwZWVkCisKKyAgICAgICAgICAvLyBNb3Rpb24gcmFuZ2VzOiBoYXJkX2xvd2VyX2xpbWl0LCBoYXJkX3VwcGVyX2xpbWl0LAorICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHNvZnRfbG93ZXJfbGltaXQsIHNvZnRfdXBwZXJfbGltaXQKKyAgICAgICAgICB7Ly8gQ2xhdyB2YWx1ZXMsIGluIHJhZGlhbnMuCisgICAgICAgICAgIC8vIDAgaXMgbGV2ZWwgd2l0aCB0aGUgZ3JvdW5kLgorICAgICAgICAgICAvLyBQb3NpdGl2ZSBtb3ZlcyBpbiB0aGUgZGlyZWN0aW9uIG9mIHBvc2l0aXZlIGVuY29kZXIgdmFsdWVzLgorICAgICAgICAgICB7LTAuMDUsIE1fUEkgLyAyLjAgKyAwLjEsIDAuMCwgTV9QSSAvIDIuMH0sCisKKyAgICAgICAgICAgLy8gWmVyb2luZyBjb25zdGFudHMgZm9yIHdyaXN0LgorICAgICAgICAgICB7a1plcm9pbmdTYW1wbGVTaXplLCBrQ2xhd0VuY29kZXJJbmRleERpZmZlcmVuY2UsIDAuOSwgMC4zfSwKKworICAgICAgICAgICA2LjMwODE0MSwKKyAgICAgICAgICAga0NsYXdQaXN0b25Td2l0Y2hUaW1lLAorICAgICAgICAgICBrQ2xhd1plcm9pbmdSYW5nZX0sCisKKyAgICAgICAgICB7Ly8gRWxldmF0b3IgdmFsdWVzLCBpbiBtZXRlcnMuCisgICAgICAgICAgIC8vIDAgaXMgdGhlIHBvcnRpb24gb2YgdGhlIGVsZXZhdG9yIGNhcnJpYWdlIHRoYXQgU3BlbmNlciByZW1vdmVkCisgICAgICAgICAgIC8vIGxpbmluZyB1cCB3aXRoIHRoZSBib2x0LgorICAgICAgICAgICAvLyBQb3NpdGl2ZSBpcyB1cC4KKyAgICAgICAgICAgey0wLjAwNSwgMC42ODkwMDAsIDAuMDEwMDAwLCAwLjY4MDAwMH0sCisKKyAgICAgICAgICAgLy8gQXJtIHZhbHVlcywgaW4gcmFkaWFucy4KKyAgICAgICAgICAgLy8gMCBpcyBzdGlja2luZyBzdHJhaWdodCBvdXQgaG9yaXpvbnRhbGx5IG92ZXIgdGhlIGludGFrZS9mcm9udC4KKyAgICAgICAgICAgLy8gUG9zaXRpdmUgaXMgcm90YXRpbmcgdXAgYW5kIGludG8gdGhlIHJvYm90ICh0b3dhcmRzIHRoZSBiYWNrKS4KKyAgICAgICAgICAgey1NX1BJIC8gMiAtIDAuMDUsIE1fUEkgLyAyICsgMC4wNSwgLU1fUEkgLyAyLCBNX1BJIC8gMn0sCisKKyAgICAgICAgICAgLy8gRWxldmF0b3IgemVyb2luZyBjb25zdGFudHM6IGxlZnQsIHJpZ2h0LgorICAgICAgICAgICB7a1plcm9pbmdTYW1wbGVTaXplLCBrRWxldmF0b3JFbmNvZGVySW5kZXhEaWZmZXJlbmNlLCAwLjAsIDAuM30sCisgICAgICAgICAgIHtrWmVyb2luZ1NhbXBsZVNpemUsIGtFbGV2YXRvckVuY29kZXJJbmRleERpZmZlcmVuY2UsIDAuMCwgMC4zfSwKKyAgICAgICAgICAgLy8gQXJtIHplcm9pbmcgY29uc3RhbnRzOiBsZWZ0LCByaWdodC4KKyAgICAgICAgICAge2taZXJvaW5nU2FtcGxlU2l6ZSwga0FybUVuY29kZXJJbmRleERpZmZlcmVuY2UsIDAuMCwgMC4zfSwKKyAgICAgICAgICAge2taZXJvaW5nU2FtcGxlU2l6ZSwga0FybUVuY29kZXJJbmRleERpZmZlcmVuY2UsIDAuMCwgMC4zfSwKKyAgICAgICAgICAgMC43LAorICAgICAgICAgICAtMC4wOCwKKyAgICAgICAgICAgLTMuNSAtIDAuMDEgLSAtMC4wMiwKKyAgICAgICAgICAgMy41IC0gMC4xNyAtIC0wLjE1LAorCisgICAgICAgICAgIGtBcm1aZXJvaW5nSGVpZ2h0LAorICAgICAgICAgICBrQXJtTGVuZ3RoLAorICAgICAgICAgIH0sCisgICAgICAgICAgLy8gRW5kICJzZW5zb3IiIHZhbHVlcy4KKworICAgICAgICAgIGtNYXhBbGxvd2VkTGVmdFJpZ2h0QXJtRGlmZmVyZW5jZSwKKyAgICAgICAgICBrTWF4QWxsb3dlZExlZnRSaWdodEVsZXZhdG9yRGlmZmVyZW5jZSwKKyAgICAgICAgICBrQ2xhd0dlb21ldHJ5LAorICAgICAgfTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1ByYWN0aWNlVGVhbU51bWJlcjoKKyAgICAgIHJldHVybiBuZXcgVmFsdWVzeworICAgICAgICAgIGtEcml2ZXRyYWluRW5jb2RlclJhdGlvLAorICAgICAgICAgIGtBcm1FbmNvZGVyUmF0aW8sCisgICAgICAgICAga0FybVBvdFJhdGlvLAorICAgICAgICAgIGtFbGV2YXRvckVuY29kZXJSYXRpbywKKyAgICAgICAgICBrRWxldmF0b3JQb3RSYXRpbywKKyAgICAgICAgICBrRWxldmF0b3JHZWFyYm94T3V0cHV0UmFkaWFuRGlzdGFuY2UsCisgICAgICAgICAga0NsYXdFbmNvZGVyUmF0aW8sCisgICAgICAgICAga0NsYXdQb3RSYXRpbywKKyAgICAgICAgICBrVG90ZUhlaWdodCwKKyAgICAgICAgICBrTG93R2VhclJhdGlvLAorICAgICAgICAgIGtIaWdoR2VhclJhdGlvLAorICAgICAgICAgIGtDb21wTGVmdERyaXZlU2hpZnRlciwKKyAgICAgICAgICBrQ29tcFJpZ2h0RHJpdmVTaGlmdGVyLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGtSb2JvdFdpZHRoLAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6Ok1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb29wLAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6Ok1ha2VEcml2ZXRyYWluTG9vcCwKKyAgICAgICAgICAwLjAyLCAgLy8gZHJpdmV0cmFpbiBkb25lIGRlbHRhCisgICAgICAgICAgNS4wLCAgIC8vIGRyaXZldHJhaW4gbWF4IHNwZWVkCisKKyAgICAgICAgICAvLyBNb3Rpb24gcmFuZ2VzOiBoYXJkX2xvd2VyX2xpbWl0LCBoYXJkX3VwcGVyX2xpbWl0LAorICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHNvZnRfbG93ZXJfbGltaXQsIHNvZnRfdXBwZXJfbGltaXQKKyAgICAgICAgICAvLyBUT0RPKHNlbnNvcnMpOiBHZXQgYWN0dWFsIGJvdW5kcyBiZWZvcmUgdHVybmluZyBvbiByb2JvdC4KKyAgICAgICAgICB7Ly8gQ2xhdyB2YWx1ZXMsIGluIHJhZGlhbnMuCisgICAgICAgICAgIC8vIDAgaXMgbGV2ZWwgd2l0aCB0aGUgZ3JvdW5kLgorICAgICAgICAgICAvLyBQb3NpdGl2ZSBtb3ZlcyBpbiB0aGUgZGlyZWN0aW9uIG9mIHBvc2l0aXZlIGVuY29kZXIgdmFsdWVzLgorICAgICAgICAgICB7LTAuMDUsIE1fUEkgLyAyLjAgKyAwLjEsIDAuMCwgTV9QSSAvIDIuMH0sCisKKyAgICAgICAgICAgLy8gWmVyb2luZyBjb25zdGFudHMgZm9yIHdyaXN0LgorICAgICAgICAgICB7a1plcm9pbmdTYW1wbGVTaXplLCBrQ2xhd0VuY29kZXJJbmRleERpZmZlcmVuY2UsIDAuOTEwNDE4MDAwMDAwMDAwMSwKKyAgICAgICAgICAgIDAuM30sCisKKyAgICAgICAgICAgNi4zMDgxNDEsCisgICAgICAgICAgIGtDbGF3UGlzdG9uU3dpdGNoVGltZSwKKyAgICAgICAgICAga0NsYXdaZXJvaW5nUmFuZ2V9LAorCisgICAgICAgICAgey8vIEVsZXZhdG9yIHZhbHVlcywgaW4gbWV0ZXJzLgorICAgICAgICAgICAvLyAwIGlzIHRoZSBwb3J0aW9uIG9mIHRoZSBlbGV2YXRvciBjYXJyaWFnZSB0aGF0IFNwZW5jZXIgcmVtb3ZlZAorICAgICAgICAgICAvLyBsaW5pbmcgdXAgd2l0aCB0aGUgYm9sdC4KKyAgICAgICAgICAgLy8gUG9zaXRpdmUgaXMgdXAuCisgICAgICAgICAgIHstMC4wMDUwMCwgMC42ODkwMDAsIDAuMDEwMDAwLCAwLjY4MDAwMH0sCisKKyAgICAgICAgICAgLy8gQXJtIHZhbHVlcywgaW4gcmFkaWFucy4KKyAgICAgICAgICAgLy8gMCBpcyBzdGlja2luZyBzdHJhaWdodCBvdXQgaG9yaXpvbnRhbGx5IG92ZXIgdGhlIGludGFrZS9mcm9udC4KKyAgICAgICAgICAgLy8gUG9zaXRpdmUgaXMgcm90YXRpbmcgdXAgYW5kIGludG8gdGhlIHJvYm90ICh0b3dhcmRzIHRoZSBiYWNrKS4KKyAgICAgICAgICAgey1NX1BJIC8gMiAtIDAuMDUsIE1fUEkgLyAyICsgMC4wNSwgLU1fUEkgLyAyLCBNX1BJIC8gMn0sCisKKyAgICAgICAgICAgLy8gRWxldmF0b3IgemVyb2luZyBjb25zdGFudHM6IGxlZnQsIHJpZ2h0LgorICAgICAgICAgICB7a1plcm9pbmdTYW1wbGVTaXplLCBrRWxldmF0b3JFbmNvZGVySW5kZXhEaWZmZXJlbmNlLCAwLjExMDY3NywgMC4zfSwgIC8vIFdhcyAwLjA4ODk4NCAoMyBtbSB0b28gaGlnaCkKKyAgICAgICAgICAge2taZXJvaW5nU2FtcGxlU2l6ZSwga0VsZXZhdG9yRW5jb2RlckluZGV4RGlmZmVyZW5jZSwgMC4xMDk5NzQsIDAuM30sICAvLyBXYXMgMC4xMDQ1NTcgKDQgbW0gdG9vIGxvdykKKyAgICAgICAgICAgLy8gQXJtIHplcm9pbmcgY29uc3RhbnRzOiBsZWZ0LCByaWdodC4KKyAgICAgICAgICAge2taZXJvaW5nU2FtcGxlU2l6ZSwga0FybUVuY29kZXJJbmRleERpZmZlcmVuY2UsIC0wLjMyNDQzNywgMC4zfSwKKyAgICAgICAgICAge2taZXJvaW5nU2FtcGxlU2l6ZSwga0FybUVuY29kZXJJbmRleERpZmZlcmVuY2UsIC0wLjA2NDY4MywgMC4zfSwKKyAgICAgICAgICAgMC43MjIyMzAgLSAtMC4wMDA1OTQgLSAtMC4wMjYxODMgLSAwLjAwMzQ0MiwgICAvLyBMZWZ0IEVsZXZhdG9yIFBvdGVuaW9tZXRlciBhZGp1c3RtZW50CisgICAgICAgICAgIC0wLjA4MTM1NCAtIC0wLjAwMDM3NCAtIC0wLjAyNDc5MyAtIC0wLjAwNjkxNiwgLy8gUmlnaHQgRWxldmF0b3IgUG90ZW5pb21ldGVyIGFkanVzdG1lbnQKKyAgICAgICAgICAgLTMuNTA5NjExIC0gMC4wMDc0MTUgLSAtMC4wMTkwODEsCisgICAgICAgICAgIDMuNTA2OTI3IC0gMC4xNzAwMTcgLSAtMC4xNDc5NzAsCisKKyAgICAgICAgICAga0FybVplcm9pbmdIZWlnaHQsCisgICAgICAgICAgIGtBcm1MZW5ndGgsCisgICAgICAgICAgfSwKKyAgICAgICAgICAvLyBFbmQgInNlbnNvciIgdmFsdWVzLgorCisgICAgICAgICAga01heEFsbG93ZWRMZWZ0UmlnaHRBcm1EaWZmZXJlbmNlLAorICAgICAgICAgIGtNYXhBbGxvd2VkTGVmdFJpZ2h0RWxldmF0b3JEaWZmZXJlbmNlLAorICAgICAgICAgIGtDbGF3R2VvbWV0cnksCisgICAgICB9OworICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ29tcFRlYW1OdW1iZXI6CisgICAgICByZXR1cm4gbmV3IFZhbHVlc3sKKyAgICAgICAgICBrRHJpdmV0cmFpbkVuY29kZXJSYXRpbywKKyAgICAgICAgICBrQXJtRW5jb2RlclJhdGlvLAorICAgICAgICAgIGtBcm1Qb3RSYXRpbywKKyAgICAgICAgICBrRWxldmF0b3JFbmNvZGVyUmF0aW8sCisgICAgICAgICAga0VsZXZhdG9yUG90UmF0aW8sCisgICAgICAgICAga0VsZXZhdG9yR2VhcmJveE91dHB1dFJhZGlhbkRpc3RhbmNlLAorICAgICAgICAgIGtDbGF3RW5jb2RlclJhdGlvLAorICAgICAgICAgIGtDbGF3UG90UmF0aW8sCisgICAgICAgICAga1RvdGVIZWlnaHQsCisgICAgICAgICAga0xvd0dlYXJSYXRpbywKKyAgICAgICAgICBrSGlnaEdlYXJSYXRpbywKKyAgICAgICAgICBrUHJhY3RpY2VMZWZ0RHJpdmVTaGlmdGVyLAorICAgICAgICAgIGtQcmFjdGljZVJpZ2h0RHJpdmVTaGlmdGVyLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGtSb2JvdFdpZHRoLAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6Ok1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb29wLAorICAgICAgICAgIGNvbnRyb2xfbG9vcHM6Ok1ha2VEcml2ZXRyYWluTG9vcCwKKyAgICAgICAgICAwLjAyLCAgLy8gZHJpdmV0cmFpbiBkb25lIGRlbHRhCisgICAgICAgICAgNS4wLCAgIC8vIGRyaXZldHJhaW4gbWF4IHNwZWVkCisKKyAgICAgICAgICAvLyBNb3Rpb24gcmFuZ2VzOiBoYXJkX2xvd2VyX2xpbWl0LCBoYXJkX3VwcGVyX2xpbWl0LAorICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHNvZnRfbG93ZXJfbGltaXQsIHNvZnRfdXBwZXJfbGltaXQKKyAgICAgICAgICAvLyBUT0RPKHNlbnNvcnMpOiBHZXQgYWN0dWFsIGJvdW5kcyBiZWZvcmUgdHVybmluZyBvbiByb2JvdC4KKyAgICAgICAgICB7Ly8gQ2xhdyB2YWx1ZXMsIGluIHJhZGlhbnMuCisgICAgICAgICAgIC8vIDAgaXMgbGV2ZWwgd2l0aCB0aGUgZ3JvdW5kLgorICAgICAgICAgICAvLyBQb3NpdGl2ZSBtb3ZlcyBpbiB0aGUgZGlyZWN0aW9uIG9mIHBvc2l0aXZlIGVuY29kZXIgdmFsdWVzLgorICAgICAgICAgICB7LTAuMDUsIE1fUEkgLyAyLjAgKyAwLjEsIDAuMCwgTV9QSSAvIDIuMH0sCisKKyAgICAgICAgICAgLy8gWmVyb2luZyBjb25zdGFudHMgZm9yIHdyaXN0LgorICAgICAgICAgICAvLyBUT0RPKHNlbnNvcnMpOiBHZXQgYWN0dWFsIG9mZnNldHMgZm9yIHRoZXNlLgorICAgICAgICAgICB7a1plcm9pbmdTYW1wbGVTaXplLCBrQ2xhd0VuY29kZXJJbmRleERpZmZlcmVuY2UsIDAuOTUyNjAyLCAwLjN9LAorICAgICAgICAgICA2LjE2NjM0NjM5OTk5OTk5OTIgKyAwLjAxNTI0MSwKKworICAgICAgICAgICBrQ2xhd1Bpc3RvblN3aXRjaFRpbWUsCisgICAgICAgICAgIGtDbGF3WmVyb2luZ1JhbmdlfSwKKworICAgICAgICAgIHsvLyBFbGV2YXRvciB2YWx1ZXMsIGluIG1ldGVycy4KKyAgICAgICAgICAgLy8gMCBpcyBhdCB0aGUgdG9wIG9mIHRoZSBlbGV2YXRvciBmcmFtZS4KKyAgICAgICAgICAgLy8gUG9zaXRpdmUgaXMgZG93biB0b3dhcmRzIHRoZSBkcml2ZWJhc2UuCisgICAgICAgICAgIHstMC4wMDUwMCwgMC42ODkwMDAsIDAuMDEwMDAwLCAwLjY4MDAwMH0sCisKKyAgICAgICAgICAgLy8gQXJtIHZhbHVlcywgaW4gcmFkaWFucy4KKyAgICAgICAgICAgLy8gMCBpcyBzdGlja2luZyBzdHJhaWdodCBvdXQgaG9yaXpvbnRhbGx5IG92ZXIgdGhlIGludGFrZS9mcm9udC4KKyAgICAgICAgICAgLy8gUG9zaXRpdmUgaXMgcm90YXRpbmcgdXAgYW5kIGludG8gdGhlIHJvYm90ICh0b3dhcmRzIHRoZSBiYWNrKS4KKyAgICAgICAgICAgey1NX1BJIC8gMiAtIDAuMDUsIE1fUEkgLyAyICsgMC4wNSwgLU1fUEkgLyAyLCBNX1BJIC8gMn0sCisKKyAgICAgICAgICAgLy8gRWxldmF0b3IgemVyb2luZyBjb25zdGFudHM6IGxlZnQsIHJpZ2h0LgorICAgICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIGVuY29kZXIgb2Zmc2V0cy4KKyAgICAgICAgICAgLy8gVE9ETyhzZW5zb3JzKTogR2V0IGFjdHVhbCBvZmZzZXRzIGZvciB0aGVzZS4KKyAgICAgICAgICAge2taZXJvaW5nU2FtcGxlU2l6ZSwga0VsZXZhdG9yRW5jb2RlckluZGV4RGlmZmVyZW5jZSwKKyAgICAgICAgICAgIDAuMjQwMjg2IC0gMC4wMDc5NjkgLSAwLjAyNSwgMC4zfSwKKyAgICAgICAgICAge2taZXJvaW5nU2FtcGxlU2l6ZSwga0VsZXZhdG9yRW5jb2RlckluZGV4RGlmZmVyZW5jZSwKKyAgICAgICAgICAgIDAuMjM0NTgzIC0gMC4wMDAxNDMsIDAuM30sCisgICAgICAgICAgIC8vIEFybSB6ZXJvaW5nIGNvbnN0YW50czogbGVmdCwgcmlnaHQuCisgICAgICAgICAgIHtrWmVyb2luZ1NhbXBsZVNpemUsIGtBcm1FbmNvZGVySW5kZXhEaWZmZXJlbmNlLCAwLjA2MDU5MiwgMC4zfSwKKyAgICAgICAgICAge2taZXJvaW5nU2FtcGxlU2l6ZSwga0FybUVuY29kZXJJbmRleERpZmZlcmVuY2UsIDAuMjEwMTU1LCAwLjN9LAorICAgICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIHBvdGVudGlvbWV0ZXIgb2Zmc2V0cy4KKyAgICAgICAgICAgMC43MjA2OTM2NjY2NjY2NjY3OSAtIDAuMDI2MDA4IC0gMC4wMjQ5NDggKyAwLjAyNSwKKyAgICAgICAgICAgLTAuMDc4OTU5NjM2MzYzNjM2MzU3IC0gMC4wMjQ2NDYgIC0gMC4wMjAyNjAsCisgICAgICAgICAgIC0zLjUwOTYxMSAtIDAuMDA3NDE1IC0gLTAuMDE5MDgxIC0gMC4wMjkzOTMgLSAtMC4wMTM1ODUsCisgICAgICAgICAgIDMuNTA2OTI3IC0gMC4xNzAwMTcgLSAtMC4xNDc5NzAgLSAwLjAwNTA0NSAtIC0wLjAyNjUwNCwKKworICAgICAgICAgICBrQXJtWmVyb2luZ0hlaWdodCwKKyAgICAgICAgICAga0FybUxlbmd0aCwKKyAgICAgICAgICB9LAorICAgICAgICAgIC8vIFRPRE8oc2Vuc29ycyk6IEVuZCAic2Vuc29yIiB2YWx1ZXMuCisKKyAgICAgICAgICBrTWF4QWxsb3dlZExlZnRSaWdodEFybURpZmZlcmVuY2UsCisgICAgICAgICAga01heEFsbG93ZWRMZWZ0UmlnaHRFbGV2YXRvckRpZmZlcmVuY2UsCisgICAgICAgICAga0NsYXdHZW9tZXRyeSwKKyAgICAgIH07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTE9HKEZBVEFMLCAidW5rbm93biB0ZWFtICMlIiBQUkl1MTYgIlxuIiwgdGVhbSk7CisgIH0KK30KKworY29uc3QgVmFsdWVzICpEb0dldFZhbHVlcygpIHsKKyAgdWludDE2X3QgdGVhbSA9IDo6YW9zOjpuZXR3b3JrOjpHZXRUZWFtTnVtYmVyKCk7CisgIExPRyhJTkZPLCAiY3JlYXRpbmcgYSBDb25zdGFudHMgZm9yIHRlYW0gJSIgUFJJdTE2ICJcbiIsIHRlYW0pOworICByZXR1cm4gRG9HZXRWYWx1ZXNGb3JUZWFtKHRlYW0pOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgVmFsdWVzICZHZXRWYWx1ZXMoKSB7CisgIHN0YXRpYyA6OmFvczo6T25jZTxjb25zdCBWYWx1ZXM+IG9uY2UoRG9HZXRWYWx1ZXMpOworICByZXR1cm4gKm9uY2UuR2V0KCk7Cit9CisKK2NvbnN0IFZhbHVlcyAmR2V0VmFsdWVzRm9yVGVhbSh1aW50MTZfdCB0ZWFtX251bWJlcikgeworICBzdGF0aWMgOjphb3M6Ok11dGV4IG11dGV4OworICA6OmFvczo6TXV0ZXhMb2NrZXIgbG9ja2VyKCZtdXRleCk7CisKKyAgLy8gSU1QT1JUQU5UOiBUaGlzIGRlY2xhcmF0aW9uIGhhcyB0byBzdGF5IGFmdGVyIHRoZSBtdXRleCBpcyBsb2NrZWQgdG8gYXZvaWQKKyAgLy8gcmFjZSBjb25kaXRpb25zLgorICBzdGF0aWMgOjpzdGQ6Om1hcDx1aW50MTZfdCwgY29uc3QgVmFsdWVzICo+IHZhbHVlczsKKworICBpZiAodmFsdWVzLmNvdW50KHRlYW1fbnVtYmVyKSA9PSAwKSB7CisgICAgdmFsdWVzW3RlYW1fbnVtYmVyXSA9IERvR2V0VmFsdWVzRm9yVGVhbSh0ZWFtX251bWJlcik7CisjaWYgX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikKKyAgICBfX2xzYW5faWdub3JlX29iamVjdCh2YWx1ZXNbdGVhbV9udW1iZXJdKTsKKyNlbmRpZgorICB9CisgIHJldHVybiAqdmFsdWVzW3RlYW1fbnVtYmVyXTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnN0YW50cworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTUvY29uc3RhbnRzLmggYi95MjAxNS9jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODczMTVjCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29uc3RhbnRzLmgKQEAgLTAsMCArMSwxNDkgQEAKKyNpZm5kZWYgWTIwMTVfQ09OU1RBTlRTX0hfCisjZGVmaW5lIFkyMDE1X0NPTlNUQU5UU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisjaW5jbHVkZSAiZnJjOTcxL3NoaWZ0ZXJfaGFsbF9lZmZlY3QuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29uc3RhbnRzLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnN0YW50cyB7CisKKy8vIEhhcyBhbGwgb2YgdGhlIG51bWJlcnMgdGhhdCBjaGFuZ2UgZm9yIGJvdGggcm9ib3RzIGFuZCBtYWtlcyBpdCBlYXN5IHRvCisvLyByZXRyaWV2ZSB0aGUgdmFsdWVzIGZvciB0aGUgY3VycmVudCBvbmUuCisKKy8vIEV2ZXJ5dGhpbmcgaXMgaW4gU0kgdW5pdHMgKHZvbHRzLCByYWRpYW5zLCBtZXRlcnMsIHNlY29uZHMsIGV0YykuCisvLyBTb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgcmVsYXRlZCB0byB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIHJhdyB2YWx1ZXMKKy8vIChlbmNvZGVyIGNvdW50cywgdm9sdGFnZSwgZXRjKSB0byBzY2FsZWQgdW5pdHMgKHJhZGlhbnMsIG1ldGVycywgZXRjKS4KKworLy8gVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgY3VycmVudCB2YWx1ZXMgZm9yIGFsbCBvZiB0aGUgdGhpbmdzIHRoYXQgY2hhbmdlLgorc3RydWN0IFZhbHVlcyB7CisgIC8vIERyaXZldHJhaW4gVmFsdWVzIC8vLy8vCisKKyAgLy8gVGhlIHJhdGlvIGZyb20gdGhlIGVuY29kZXIgc2hhZnQgdG8gdGhlIGRyaXZldHJhaW4gd2hlZWxzLgorICBkb3VibGUgZHJpdmV0cmFpbl9lbmNvZGVyX3JhdGlvOworICAvLyBUaGUgcmF0aW8gZnJvbSB0aGUgZW5jb2RlciBzaGFmdCB0byB0aGUgYXJtIGpvaW50LgorICBkb3VibGUgYXJtX2VuY29kZXJfcmF0aW87CisgIC8vIFRoZSByYXRpbyBmcm9tIHRoZSBwb3Qgc2hhZnQgdG8gdGhlIGFybSBqb2ludC4KKyAgZG91YmxlIGFybV9wb3RfcmF0aW87CisgIC8vIFRoZSByYXRpbyBmcm9tIHRoZSBlbmNvZGVyIHNoYWZ0IHRvIHRoZSBlbGV2YXRvciBvdXRwdXQgcHVsbGV5LgorICBkb3VibGUgZWxldl9lbmNvZGVyX3JhdGlvOworICAvLyBUaGUgcmF0aW8gZnJvbSB0aGUgcG90IHNoYWZ0IHRvIHRoZSBlbGV2YXRvciBvdXRwdXQgcHVsbGV5LgorICBkb3VibGUgZWxldl9wb3RfcmF0aW87CisgIC8vIEhvdyBmYXIgdGhlIGVsZXZhdG9yIG1vdmVzIChtZXRlcnMpIHBlciByYWRpYW4gb24gdGhlIG91dHB1dCBwdWxsZXkuCisgIGRvdWJsZSBlbGV2X2Rpc3RhbmNlX3Blcl9yYWRpYW47CisgIC8vIFRoZSByYXRpbyBmcm9tIHRoZSBlbmNvZGVyIHNoYWZ0IHRvIHRoZSBjbGF3IGpvaW50LgorICBkb3VibGUgY2xhd19lbmNvZGVyX3JhdGlvOworICAvLyBUaGUgcmF0aW8gZnJvbSB0aGUgcG90IHNoYWZ0IHRvIHRoZSBjbGF3IGpvaW50LgorICBkb3VibGUgY2xhd19wb3RfcmF0aW87CisKKyAgLy8gSG93IHRhbGwgYSB0b3RlIGlzIGluIG1ldGVycy4KKyAgZG91YmxlIHRvdGVfaGVpZ2h0OworCisgIC8vIFRoZSBnZWFyIHJhdGlvcyBmcm9tIG1vdG9yIHNoYWZ0cyB0byB0aGUgZHJpdmV0cmFpbiB3aGVlbHMgZm9yIGhpZ2ggYW5kIGxvdworICAvLyBnZWFyLgorICBkb3VibGUgbG93X2dlYXJfcmF0aW87CisgIGRvdWJsZSBoaWdoX2dlYXJfcmF0aW87CisgIFNoaWZ0ZXJIYWxsRWZmZWN0IGxlZnRfZHJpdmUsIHJpZ2h0X2RyaXZlOworICBib29sIGNsdXRjaF90cmFuc21pc3Npb247CisKKyAgZG91YmxlIHR1cm5fd2lkdGg7CisKKyAgOjpzdGQ6OmZ1bmN0aW9uPFN0YXRlRmVlZGJhY2tMb29wPDIsIDIsIDI+KCk+IG1ha2Vfdl9kcml2ZXRyYWluX2xvb3A7CisgIDo6c3RkOjpmdW5jdGlvbjxTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPigpPiBtYWtlX2RyaXZldHJhaW5fbG9vcDsKKworICBkb3VibGUgZHJpdmV0cmFpbl9kb25lX2Rpc3RhbmNlOworICBkb3VibGUgZHJpdmV0cmFpbl9tYXhfc3BlZWQ7CisKKyAgLy8gU3VwZXJzdHJ1Y3R1cmUgVmFsdWVzIC8vLy8vCisKKyAgLy8gRGVmaW5lcyBhIHJhbmdlIG9mIG1vdGlvbiBmb3IgYSBzdWJzeXN0ZW0uCisgIC8vIFRoZXNlIGFyZSBhbGwgYWJzb2x1dGUgcG9zaXRpb25zIGluIHNjYWxlZCB1bml0cy4KKyAgc3RydWN0IFJhbmdlIHsKKyAgICBkb3VibGUgbG93ZXJfaGFyZF9saW1pdDsKKyAgICBkb3VibGUgdXBwZXJfaGFyZF9saW1pdDsKKyAgICBkb3VibGUgbG93ZXJfbGltaXQ7CisgICAgZG91YmxlIHVwcGVyX2xpbWl0OworICB9OworCisgIHN0cnVjdCBDbGF3IHsKKyAgICBSYW5nZSB3cmlzdDsKKyAgICBaZXJvaW5nQ29uc3RhbnRzIHplcm9pbmc7CisgICAgLy8gVGhlIHZhbHVlIHRvIGFkZCB0byBwb3RlbnRpb21ldGVyIHJlYWRpbmdzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGNvbnZlcnRlZAorICAgIC8vIHRvIHJhZGlhbnMgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzIDAgd2hlbiB0aGUgY2xhdyBpcyBhdCBhYnNvbHV0ZQorICAgIC8vIDAgKGhvcml6b250YWwgc3RyYWlnaHQgb3V0IHRoZSBmcm9udCkuCisgICAgZG91YmxlIHBvdGVudGlvbWV0ZXJfb2Zmc2V0OworCisgICAgLy8gVGltZSBiZXR3ZWVuIHNlbmRpbmcgY29tbWFuZHMgdG8gY2xhdyBvcGVuaW5nIHBpc3RvbnMgYW5kIHRoZW0gcmVhY2hpbmcKKyAgICAvLyB0aGUgbmV3IHN0YXRlLgorICAgIGRvdWJsZSBwaXN0b25fc3dpdGNoX3RpbWU7CisgICAgLy8gSG93IGZhciBvbiBlaXRoZXIgc2lkZSB3ZSBsb29rIGZvciB0aGUgaW5kZXggcHVsc2UgYmVmb3JlIHdlIGdpdmUgdXAuCisgICAgZG91YmxlIHplcm9pbmdfcmFuZ2U7CisgIH07CisgIENsYXcgY2xhdzsKKworICBzdHJ1Y3QgRnJpZGdlIHsKKyAgICBSYW5nZSBlbGV2YXRvcjsKKyAgICBSYW5nZSBhcm07CisKKyAgICBaZXJvaW5nQ29uc3RhbnRzIGxlZnRfZWxldl96ZXJvaW5nOworICAgIFplcm9pbmdDb25zdGFudHMgcmlnaHRfZWxldl96ZXJvaW5nOworICAgIFplcm9pbmdDb25zdGFudHMgbGVmdF9hcm1femVyb2luZzsKKyAgICBaZXJvaW5nQ29uc3RhbnRzIHJpZ2h0X2FybV96ZXJvaW5nOworCisgICAgLy8gVmFsdWVzIHRvIGFkZCB0byBzY2FsZWQgcG90ZW50aW9tZXRlciByZWFkaW5ncyBzbyAwIGxpbmVzIHVwIHdpdGggdGhlCisgICAgLy8gcGh5c2ljYWwgYWJzb2x1dGUgMC4KKyAgICBkb3VibGUgbGVmdF9lbGV2YXRvcl9wb3RlbnRpb21ldGVyX29mZnNldDsKKyAgICBkb3VibGUgcmlnaHRfZWxldmF0b3JfcG90ZW50aW9tZXRlcl9vZmZzZXQ7CisgICAgZG91YmxlIGxlZnRfYXJtX3BvdGVudGlvbWV0ZXJfb2Zmc2V0OworICAgIGRvdWJsZSByaWdodF9hcm1fcG90ZW50aW9tZXRlcl9vZmZzZXQ7CisKKyAgICAvLyBIb3cgaGlnaCB0aGUgZWxldmF0b3IgaGFzIHRvIGJlIGJlZm9yZSB3ZSBzdGFydCB6ZXJvaW5nIHRoZSBhcm0uCisgICAgZG91YmxlIGFybV96ZXJvaW5nX2hlaWdodDsKKworICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIGFybSwgZnJvbSB0aGUgYXhpcyBvZiB0aGUgYm90dG9tIHBpdm90IHRvIHRoZSBheGlzIG9mCisgICAgLy8gdGhlIHRvcCBwaXZvdC4KKyAgICBkb3VibGUgYXJtX2xlbmd0aDsKKyAgfTsKKyAgRnJpZGdlIGZyaWRnZTsKKworICBkb3VibGUgbWF4X2FsbG93ZWRfbGVmdF9yaWdodF9hcm1fZGlmZmVyZW5jZTsKKyAgZG91YmxlIG1heF9hbGxvd2VkX2xlZnRfcmlnaHRfZWxldmF0b3JfZGlmZmVyZW5jZTsKKworICBzdHJ1Y3QgQ2xhd0dlb21ldHJ5IHsKKyAgICAvLyBIb3Jpem9udGFsIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgZ3JhYmJlciB0byB0aGUgZW5kLgorICAgIGRvdWJsZSBncmFiYmVyX2hhbGZfbGVuZ3RoOworICAgIC8vIFZlcnRpY2FsIGRpc3RhbmNlIGZyb20gdGhlIGFybSByb3RhdGlvbiBjZW50ZXIgdG8gdGhlIGJvdHRvbSBvZiB0aGUKKyAgICAvLyBncmFiYmVyLiAgRGlzdGFuY2UgbWVhc3VyZWQgd2l0aCBhcm0gdmVydGljYWwgKHRoZXRhID0gMCkuCisgICAgZG91YmxlIGdyYWJiZXJfZGVsdGFfeTsKKyAgICAvLyBWZXJ0aWNhbCBzZXBhcmF0aW9uIG9mIHRoZSBjbGF3IGFuZCBhcm0gcm90YXRpb24gY2VudGVycyB3aXRoIHRoZQorICAgIC8vIGVsZXZhdG9yIGF0IDAuMCBhbmQgdGhlIGFybSBhbmdsZSBzZXQgdG8gemVyby4KKyAgICBkb3VibGUgZ3JhYmJlcl9hcm1fdmVydF9zZXBhcmF0aW9uOworICAgIC8vIEhvcml6b250YWwgc2VwYXJhdGlvbiBvZiB0aGUgY2xhdyBhbmQgYXJtIHJvdGF0aW9uIGNlbnRlcnMgd2l0aCB0aGUKKyAgICAvLyBlbGV2YXRvciBhdCAwLjAgYW5kIHRoZSBhcm0gYW5nbGUgc2V0IHRvIHplcm8uCisgICAgZG91YmxlIGdyYWJiZXJfYXJtX2hvcnpfc2VwYXJhdGlvbjsKKyAgICAvLyBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBjZW50ZXIgb2YgdGhlIGNsYXcgdG8gdGhlIHRvcCBvZiB0aGUgY2xhdy4KKyAgICAvLyBUaGUgbGluZSBkcmF3biBhdCB0aGlzIGRpc3RhbmNlIHBhcmFsbGVsIHRvIHRoZSBjbGF3IGNlbnRlcmxpbmUgaXMgdXNlZAorICAgIC8vIHRvIGRldGVybWluZSBpZiBjbGF3IGludGVyZmVhcnMgd2l0aCB0aGUgZ3JhYmJlci4KKyAgICBkb3VibGUgY2xhd190b3BfdGhpY2tuZXNzOworICAgIC8vIFRoZSBncmFiYmVyIGlzIHNhZmUgYXQgYW55IGhlaWdodCBpZiBpdCBpcyBiZWhpbmQgdGhpcyBsb2NhdGlvbi4KKyAgICBkb3VibGUgZ3JhYmJlcl9hbHdheXNfc2FmZV9oX21pbjsKKyAgICAvLyBUaGUgZ3JhYmJlciBpcyBzYWZlIGF0IGFueSB4IGlmIGl0IGlzIGFib3ZlIHRoaXMgbG9jYXRpb24uCisgICAgZG91YmxlIGdyYWJiZXJfYWx3YXlzX3NhZmVfeF9tYXg7CisgIH07CisgIENsYXdHZW9tZXRyeSBjbGF3R2VvbWV0cnk7Cit9OworCisvLyBDcmVhdGVzIChvbmNlKSBhIFZhbHVlcyBpbnN0YW5jZSBmb3IgOjphb3M6Om5ldHdvcms6OkdldFRlYW1OdW1iZXIoKSBhbmQKKy8vIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXQuCitjb25zdCBWYWx1ZXMgJkdldFZhbHVlcygpOworCisvLyBDcmVhdGVzIFZhbHVlcyBpbnN0YW5jZXMgZm9yIGVhY2ggdGVhbSBudW1iZXIgaXQgaXMgY2FsbGVkIHdpdGggYW5kIHJldHVybnMKKy8vIHRoZW0uCitjb25zdCBWYWx1ZXMgJkdldFZhbHVlc0ZvclRlYW0odWludDE2X3QgdGVhbV9udW1iZXIpOworCit9ICAvLyBuYW1lc3BhY2UgY29uc3RhbnRzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTVfQ09OU1RBTlRTX0hfCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5jYyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTczNGUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5jYwpAQCAtMCwwICsxLDMxMSBAQAorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcHMucS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJ5MjAxNS9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tb3Rvcl9wbGFudC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC90cmFwZXpvaWRfcHJvZmlsZS5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7CisKK2NvbnN0ZXhwciBkb3VibGUga1plcm9pbmdWb2x0YWdlID0gNC4wOworCit2b2lkIENsYXdDYXBwZWRTdGF0ZUZlZWRiYWNrTG9vcDo6Q2FwVSgpIHsKKyAgbXV0YWJsZV9VKDAsIDApID0gOjpzdGQ6Om1pbihtdXRhYmxlX1UoMCwgMCksIG1heF92b2x0YWdlXyk7CisgIG11dGFibGVfVSgwLCAwKSA9IDo6c3RkOjptYXgobXV0YWJsZV9VKDAsIDApLCAtbWF4X3ZvbHRhZ2VfKTsKK30KKworZG91YmxlIENsYXdDYXBwZWRTdGF0ZUZlZWRiYWNrTG9vcDo6VW5zYXR1cmF0ZU91dHB1dEdvYWxDaGFuZ2UoKSB7CisgIC8vIENvbXB1dGUgSyBtYXRyaXggdG8gY29tcGVuc2F0ZSBmb3IgcG9zaXRpb24gZXJyb3JzLgorICBkb3VibGUgS3AgPSBLKDAsIDApOworCisgIC8vIENvbXB1dGUgaG93IG11Y2ggd2UgbmVlZCB0byBjaGFuZ2UgUiBpbiBvcmRlciB0byBhY2hpZXZlIHRoZSBjaGFuZ2UgaW4gVQorICAvLyB0aGF0IHdhcyBvYnNlcnZlZC4KKyAgcmV0dXJuIC0oMS4wIC8gS3ApICogKFVfdW5jYXBwZWQoKSAtIFUoKSkoMCwgMCk7Cit9CisKK0NsYXc6OkNsYXcoY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlICpjbGF3KQorICAgIDogYW9zOjpjb250cm9sczo6Q29udHJvbExvb3A8Y29udHJvbF9sb29wczo6Q2xhd1F1ZXVlPihjbGF3KSwKKyAgICAgIGxhc3RfcGlzdG9uX2VkZ2VfKFRpbWU6Ok5vdygpKSwKKyAgICAgIGNsYXdfbG9vcF8obmV3IENsYXdDYXBwZWRTdGF0ZUZlZWRiYWNrTG9vcChNYWtlQ2xhd0xvb3AoKSkpLAorICAgICAgY2xhd19lc3RpbWF0b3JfKGNvbnN0YW50czo6R2V0VmFsdWVzKCkuY2xhdy56ZXJvaW5nKSwKKyAgICAgIHByb2ZpbGVfKDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kpIHt9CisKK3ZvaWQgQ2xhdzo6VXBkYXRlWmVyb2luZ1N0YXRlKCkgeworICBpZiAoY2xhd19lc3RpbWF0b3JfLm9mZnNldF9yYXRpb19yZWFkeSgpIDwgMS4wKSB7CisgICAgc3RhdGVfID0gSU5JVElBTElaSU5HOworICB9IGVsc2UgaWYgKCFjbGF3X2VzdGltYXRvcl8uemVyb2VkKCkpIHsKKyAgICBzdGF0ZV8gPSBaRVJPSU5HOworICB9IGVsc2UgeworICAgIHN0YXRlXyA9IFJVTk5JTkc7CisgIH0KK30KKwordm9pZCBDbGF3OjpDb3JyZWN0KCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gWTsKKyAgWSA8PCBjbGF3X3Bvc2l0aW9uKCk7CisgIGNsYXdfbG9vcF8tPkNvcnJlY3QoWSk7Cit9CisKK3ZvaWQgQ2xhdzo6U2V0Q2xhd09mZnNldChkb3VibGUgb2Zmc2V0KSB7CisgIExPRyhJTkZPLCAiQ2hhbmdpbmcgY2xhdyBvZmZzZXQgZnJvbSAlZiB0byAlZi5cbiIsIGNsYXdfb2Zmc2V0Xywgb2Zmc2V0KTsKKyAgY29uc3QgZG91YmxlIGRvZmZzZXQgPSBvZmZzZXQgLSBjbGF3X29mZnNldF87CisKKyAgLy8gQWRqdXN0IHRoZSBoZWlnaHQuIFRoZSBkZXJpdmF0aXZlIHNob3VsZCBub3QgbmVlZCB0byBiZSB1cGRhdGVkIHNpbmNlIHRoZQorICAvLyBzcGVlZCBpcyBub3QgY2hhbmdpbmcuCisgIGNsYXdfbG9vcF8tPm11dGFibGVfWF9oYXQoMCwgMCkgKz0gZG9mZnNldDsKKworICAvLyBNb2RpZnkgY2xhdyB6ZXJvaW5nIGdvYWwuCisgIGNsYXdfZ29hbF8gKz0gZG9mZnNldDsKKyAgLy8gVXBkYXRlIHRoZSBjYWNoZWQgb2Zmc2V0IHZhbHVlIHRvIHRoZSBhY3R1YWwgdmFsdWUuCisgIGNsYXdfb2Zmc2V0XyA9IG9mZnNldDsKK30KKworZG91YmxlIENsYXc6OmVzdGltYXRlZF9jbGF3X3Bvc2l0aW9uKCkgY29uc3QgeworICByZXR1cm4gY3VycmVudF9wb3NpdGlvbl8uam9pbnQuZW5jb2RlciArIGNsYXdfZXN0aW1hdG9yXy5vZmZzZXQoKTsKK30KKworZG91YmxlIENsYXc6OmNsYXdfcG9zaXRpb24oKSBjb25zdCB7CisgIHJldHVybiBjdXJyZW50X3Bvc2l0aW9uXy5qb2ludC5lbmNvZGVyICsgY2xhd19vZmZzZXRfOworfQorCitjb25zdGV4cHIgZG91YmxlIGtDbGF3WmVyb2luZ1ZlbG9jaXR5ID0gMC4yOworCitkb3VibGUgQ2xhdzo6Y2xhd196ZXJvaW5nX3ZlbG9jaXR5KCkgeworICBjb25zdCBhdXRvICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworCisgIC8vIFplcm9pbmcgd2lsbCB3b3JrIGFzIGZvbGxvd2luZy4gQXQgc3RhcnR1cCwgcmVjb3JkIHRoZSBvZmZzZXQgb2YgdGhlIGNsYXcuCisgIC8vIFRoZW4sIHN0YXJ0IG1vdmluZyB0aGUgY2xhdyB0b3dhcmRzIHdoZXJlIHRoZSBpbmRleCBwdWxzZSBzaG91bGQgYmUuIFdlCisgIC8vIHNlYXJjaCBhcm91bmQgaXQgYSBsaXR0bGUsIGFuZCBpZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB3ZSBlc3RvcC4KKyAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBkb25lLgorCisgIGNvbnN0IGRvdWJsZSB0YXJnZXRfcG9zID0gdmFsdWVzLmNsYXcuemVyb2luZy5tZWFzdXJlZF9pbmRleF9wb3NpdGlvbjsKKyAgLy8gSG93IGZhciBhd2F5IHdlIG5lZWQgdG8gc3RheSBmcm9tIHRoZSBlbmRzIG9mIHRoZSByYW5nZSB3aGlsZSB6ZXJvaW5nLgorICBjb25zdGV4cHIgZG91YmxlIHplcm9pbmdfbGltaXQgPSAwLjEzNzU7CisgIC8vIEtlZXAgdGhlIHplcm9pbmcgcmFuZ2Ugd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIG1lY2hhbmlzbS4KKyAgY29uc3QgZG91YmxlIHplcm9pbmdfcmFuZ2UgPQorICAgICAgOjpzdGQ6Om1pbih0YXJnZXRfcG9zIC0gdmFsdWVzLmNsYXcud3Jpc3QubG93ZXJfbGltaXQgLSB6ZXJvaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy56ZXJvaW5nX3JhbmdlKTsKKworICBpZiAoY2xhd196ZXJvaW5nX3ZlbG9jaXR5XyA9PSAwKSB7CisgICAgaWYgKGVzdGltYXRlZF9jbGF3X3Bvc2l0aW9uKCkgPiB0YXJnZXRfcG9zKSB7CisgICAgICBjbGF3X3plcm9pbmdfdmVsb2NpdHlfID0gLWtDbGF3WmVyb2luZ1ZlbG9jaXR5OworICAgIH0gZWxzZSB7CisgICAgICBjbGF3X3plcm9pbmdfdmVsb2NpdHlfID0ga0NsYXdaZXJvaW5nVmVsb2NpdHk7CisgICAgfQorICB9IGVsc2UgaWYgKGNsYXdfemVyb2luZ192ZWxvY2l0eV8gPiAwICYmCisgICAgICAgICAgICAgZXN0aW1hdGVkX2NsYXdfcG9zaXRpb24oKSA+IHRhcmdldF9wb3MgKyB6ZXJvaW5nX3JhbmdlKSB7CisgICAgY2xhd196ZXJvaW5nX3ZlbG9jaXR5XyA9IC1rQ2xhd1plcm9pbmdWZWxvY2l0eTsKKyAgfSBlbHNlIGlmIChjbGF3X3plcm9pbmdfdmVsb2NpdHlfIDwgMCAmJgorICAgICAgICAgICAgIGVzdGltYXRlZF9jbGF3X3Bvc2l0aW9uKCkgPCB0YXJnZXRfcG9zIC0gemVyb2luZ19yYW5nZSkgeworICAgIGNsYXdfemVyb2luZ192ZWxvY2l0eV8gPSBrQ2xhd1plcm9pbmdWZWxvY2l0eTsKKyAgfQorCisgIHJldHVybiBjbGF3X3plcm9pbmdfdmVsb2NpdHlfOworfQorCit2b2lkIENsYXc6OlJ1bkl0ZXJhdGlvbihjb25zdCBjb250cm9sX2xvb3BzOjpDbGF3UXVldWU6OkdvYWwgKnVuc2FmZV9nb2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlOjpQb3NpdGlvbiAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpDbGF3UXVldWU6Ok91dHB1dCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlOjpTdGF0dXMgKnN0YXR1cykgeworICBjb25zdCBhdXRvICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworCisgIGlmIChXYXNSZXNldCgpKSB7CisgICAgTE9HKEVSUk9SLCAiV1BJTGliIHJlc2V0ISBSZXN0YXJ0aW5nLlxuIik7CisgICAgY2xhd19lc3RpbWF0b3JfLlJlc2V0KCk7CisgICAgc3RhdGVfID0gVU5JTklUSUFMSVpFRDsKKyAgfQorCisgIGN1cnJlbnRfcG9zaXRpb25fID0gKnBvc2l0aW9uOworCisgIC8vIEJvb2wgdG8gdHJhY2sgaWYgd2Ugc2hvdWxkIHR1cm4gdGhlIG1vdG9yIG9uIG9yIG5vdC4KKyAgYm9vbCBkaXNhYmxlID0gb3V0cHV0ID09IG51bGxwdHI7CisgIGRvdWJsZSBjbGF3X2dvYWxfdmVsb2NpdHkgPSAwLjA7CisKKyAgY2xhd19lc3RpbWF0b3JfLlVwZGF0ZUVzdGltYXRlKHBvc2l0aW9uLT5qb2ludCk7CisKKyAgaWYgKHN0YXRlXyAhPSBVTklOSVRJQUxJWkVEKSB7CisgICAgQ29ycmVjdCgpOworICB9CisKKyAgc3dpdGNoIChzdGF0ZV8pIHsKKyAgICBjYXNlIFVOSU5JVElBTElaRUQ6CisgICAgICBMT0coSU5GTywgIlVuaW5pdGlhbGl6ZWQuXG4iKTsKKyAgICAgIC8vIFN0YXJ0dXAuIEFzc3VtZSB0aGF0IHdlIGFyZSBhdCB0aGUgb3JpZ2luLgorICAgICAgY2xhd19vZmZzZXRfID0gLXBvc2l0aW9uLT5qb2ludC5lbmNvZGVyOworICAgICAgY2xhd19sb29wXy0+bXV0YWJsZV9YX2hhdCgpLnNldFplcm8oKTsKKyAgICAgIENvcnJlY3QoKTsKKyAgICAgIHN0YXRlXyA9IElOSVRJQUxJWklORzsKKyAgICAgIGRpc2FibGUgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElOSVRJQUxJWklORzoKKyAgICAgIExPRyhJTkZPLCAiV2FpdGluZyBmb3IgYWNjdXJhdGUgaW5pdGlhbCBwb3NpdGlvbi5cbiIpOworICAgICAgZGlzYWJsZSA9IHRydWU7CisgICAgICAvLyBVcGRhdGUgc3RhdGVfIHRvIGFjY3VyYXRlbHkgcmVwcmVzZW50IHRoZSBzdGF0ZSBvZiB0aGUgemVyb2luZworICAgICAgLy8gZXN0aW1hdG9yLgorICAgICAgVXBkYXRlWmVyb2luZ1N0YXRlKCk7CisKKyAgICAgIGlmIChzdGF0ZV8gIT0gSU5JVElBTElaSU5HKSB7CisgICAgICAgIC8vIFNldCB0aGUgZ29hbHMgdG8gd2hlcmUgd2UgYXJlIG5vdy4KKyAgICAgICAgY2xhd19nb2FsXyA9IGNsYXdfcG9zaXRpb24oKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRVJPSU5HOgorICAgICAgTE9HKERFQlVHLCAiWmVyb2luZy5cbiIpOworCisgICAgICAvLyBVcGRhdGUgc3RhdGVfLgorICAgICAgVXBkYXRlWmVyb2luZ1N0YXRlKCk7CisgICAgICBpZiAoY2xhd19lc3RpbWF0b3JfLnplcm9lZCgpKSB7CisgICAgICAgIExPRyhJTkZPLCAiWmVyb2VkIVxuIik7CisgICAgICAgIFNldENsYXdPZmZzZXQoY2xhd19lc3RpbWF0b3JfLm9mZnNldCgpKTsKKyAgICAgIH0gZWxzZSBpZiAoIWRpc2FibGUpIHsKKyAgICAgICAgY2xhd19nb2FsX3ZlbG9jaXR5ID0gY2xhd196ZXJvaW5nX3ZlbG9jaXR5KCk7CisgICAgICAgIGNsYXdfZ29hbF8gKz0KKyAgICAgICAgICAgIGNsYXdfZ29hbF92ZWxvY2l0eSAqIDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kuVG9TZWNvbmRzKCk7CisgICAgICB9CisKKyAgICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IHByb2ZpbGUgc3RhdGUgaWYgd2UgYXJlIHplcm9pbmcuCisgICAgICB7CisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBjdXJyZW50OworICAgICAgICBjdXJyZW50LnNldFplcm8oKTsKKyAgICAgICAgY3VycmVudCA8PCBjbGF3X2dvYWxfLCBjbGF3X2dvYWxfdmVsb2NpdHk7CisgICAgICAgIHByb2ZpbGVfLk1vdmVDdXJyZW50U3RhdGUoY3VycmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUlVOTklORzoKKyAgICAgIExPRyhERUJVRywgIlJ1bm5pbmchXG4iKTsKKworICAgICAgLy8gVXBkYXRlIHN0YXRlXy4KKyAgICAgIFVwZGF0ZVplcm9pbmdTdGF0ZSgpOworICAgICAgaWYgKHVuc2FmZV9nb2FsKSB7CisgICAgICAgIC8vIFBpY2sgYSBzZXQgb2Ygc2FuZSBkZWZhdWx0cyBpZiBub25lIGFyZSBzcGVjaWZpZWQuCisgICAgICAgIGlmICh1bnNhZmVfZ29hbC0+bWF4X3ZlbG9jaXR5ICE9IDAuMCkgeworICAgICAgICAgIHByb2ZpbGVfLnNldF9tYXhpbXVtX3ZlbG9jaXR5KHVuc2FmZV9nb2FsLT5tYXhfdmVsb2NpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByb2ZpbGVfLnNldF9tYXhpbXVtX3ZlbG9jaXR5KDIuNSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVuc2FmZV9nb2FsLT5tYXhfYWNjZWxlcmF0aW9uICE9IDAuMCkgeworICAgICAgICAgIHByb2ZpbGVfLnNldF9tYXhpbXVtX2FjY2VsZXJhdGlvbih1bnNhZmVfZ29hbC0+bWF4X2FjY2VsZXJhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJvZmlsZV8uc2V0X21heGltdW1fYWNjZWxlcmF0aW9uKDQuMCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBkb3VibGUgdW5maWx0ZXJlZF9nb2FsID0gOjpzdGQ6Om1heCgKKyAgICAgICAgICAgIDo6c3RkOjptaW4odW5zYWZlX2dvYWwtPmFuZ2xlLCB2YWx1ZXMuY2xhdy53cmlzdC51cHBlcl9saW1pdCksCisgICAgICAgICAgICB2YWx1ZXMuY2xhdy53cmlzdC5sb3dlcl9saW1pdCk7CisgICAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGdvYWxfc3RhdGUgPQorICAgICAgICAgICAgcHJvZmlsZV8uVXBkYXRlKHVuZmlsdGVyZWRfZ29hbCwgdW5zYWZlX2dvYWwtPmFuZ3VsYXJfdmVsb2NpdHkpOworICAgICAgICBjbGF3X2dvYWxfID0gZ29hbF9zdGF0ZSgwLCAwKTsKKyAgICAgICAgY2xhd19nb2FsX3ZlbG9jaXR5ID0gZ29hbF9zdGF0ZSgxLCAwKTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlXyAhPSBSVU5OSU5HICYmIHN0YXRlXyAhPSBFU1RPUCkgeworICAgICAgICBzdGF0ZV8gPSBVTklOSVRJQUxJWkVEOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVTVE9QOgorICAgICAgTE9HKEVSUk9SLCAiRXN0b3AhXG4iKTsKKyAgICAgIGRpc2FibGUgPSB0cnVlOworICAgICAgYnJlYWs7CisgIH0KKworICAvLyBNYWtlIHN1cmUgZ29hbCBhbmQgcG9zaXRpb24gZG8gbm90IGV4Y2VlZCB0aGUgaGFyZHdhcmUgbGltaXRzIGlmIHdlIGFyZQorICAvLyBSVU5OSU5HLgorICBpZiAoc3RhdGVfID09IFJVTk5JTkcpIHsKKyAgICAvLyBMaW1pdCBnb2FsLgorICAgIGNsYXdfZ29hbF8gPSA6OnN0ZDo6bWluKGNsYXdfZ29hbF8sIHZhbHVlcy5jbGF3LndyaXN0LnVwcGVyX2xpbWl0KTsKKyAgICBjbGF3X2dvYWxfID0gOjpzdGQ6Om1heChjbGF3X2dvYWxfLCB2YWx1ZXMuY2xhdy53cmlzdC5sb3dlcl9saW1pdCk7CisKKyAgICAvLyBDaGVjayBwb3NpdGlvbi4KKyAgICBpZiAoY2xhd19wb3NpdGlvbigpID49IHZhbHVlcy5jbGF3LndyaXN0LnVwcGVyX2hhcmRfbGltaXQgfHwKKyAgICAgICAgY2xhd19wb3NpdGlvbigpIDw9IHZhbHVlcy5jbGF3LndyaXN0Lmxvd2VyX2hhcmRfbGltaXQpIHsKKyAgICAgIExPRyhFUlJPUiwgIkNsYXcgYXQgJWYgb3V0IG9mIGJvdW5kcyBbJWYsICVmXS5cbiIsIGNsYXdfcG9zaXRpb24oKSwKKyAgICAgICAgICB2YWx1ZXMuY2xhdy53cmlzdC5sb3dlcl9saW1pdCwgdmFsdWVzLmNsYXcud3Jpc3QudXBwZXJfbGltaXQpOworICAgIH0KKyAgfQorCisgIC8vIFNldCB0aGUgZ29hbHMuCisgIGNsYXdfbG9vcF8tPm11dGFibGVfUigpIDw8IGNsYXdfZ29hbF8sIGNsYXdfZ29hbF92ZWxvY2l0eTsKKworICBjb25zdCBkb3VibGUgbWF4X3ZvbHRhZ2UgPSAoc3RhdGVfID09IFJVTk5JTkcpID8gMTIuMCA6IGtaZXJvaW5nVm9sdGFnZTsKKyAgY2xhd19sb29wXy0+c2V0X21heF92b2x0YWdlKG1heF92b2x0YWdlKTsKKworICBpZiAoc3RhdGVfID09IEVTVE9QKSB7CisgICAgZGlzYWJsZSA9IHRydWU7CisgIH0KKyAgY2xhd19sb29wXy0+VXBkYXRlKGRpc2FibGUpOworCisgIGlmIChzdGF0ZV8gPT0gSU5JVElBTElaSU5HIHx8IHN0YXRlXyA9PSBaRVJPSU5HKSB7CisgICAgaWYgKGNsYXdfbG9vcF8tPlUoKSAhPSBjbGF3X2xvb3BfLT5VX3VuY2FwcGVkKCkpIHsKKyAgICAgIGRvdWJsZSBkZWx0YVIgPSBjbGF3X2xvb3BfLT5VbnNhdHVyYXRlT3V0cHV0R29hbENoYW5nZSgpOworCisgICAgICAvLyBNb3ZlIHRoZSBjbGF3IGdvYWwgYnkgdGhlIGFtb3VudCBvYnNlcnZlZC4KKyAgICAgIExPRyhXQVJOSU5HLCAiTW92aW5nIGNsYXcgZ29hbCBieSAlZiB0byBoYW5kbGUgc2F0dXJhdGlvbi5cbiIsIGRlbHRhUik7CisgICAgICBjbGF3X2dvYWxfICs9IGRlbHRhUjsKKyAgICB9CisgIH0KKworICBpZiAob3V0cHV0KSB7CisgICAgb3V0cHV0LT52b2x0YWdlID0gY2xhd19sb29wXy0+VSgwLCAwKTsKKyAgICBpZiAoc3RhdGVfICE9IFJVTk5JTkcpIHsKKyAgICAgIG91dHB1dC0+aW50YWtlX3ZvbHRhZ2UgPSAwLjA7CisgICAgICBvdXRwdXQtPnJvbGxlcnNfY2xvc2VkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh1bnNhZmVfZ29hbCkgeworICAgICAgICBvdXRwdXQtPmludGFrZV92b2x0YWdlID0gdW5zYWZlX2dvYWwtPmludGFrZTsKKyAgICAgICAgb3V0cHV0LT5yb2xsZXJzX2Nsb3NlZCA9IHVuc2FmZV9nb2FsLT5yb2xsZXJzX2Nsb3NlZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dC0+aW50YWtlX3ZvbHRhZ2UgPSAwLjA7CisgICAgICAgIG91dHB1dC0+cm9sbGVyc19jbG9zZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG91dHB1dC0+cm9sbGVyc19jbG9zZWQgIT0gbGFzdF9yb2xsZXJzX2Nsb3NlZF8pIHsKKyAgICAgIGxhc3RfcGlzdG9uX2VkZ2VfID0gVGltZTo6Tm93KCk7CisgICAgfQorICB9CisKKyAgc3RhdHVzLT56ZXJvZWQgPSBzdGF0ZV8gPT0gUlVOTklORzsKKyAgc3RhdHVzLT5lc3RvcHBlZCA9IHN0YXRlXyA9PSBFU1RPUDsKKyAgc3RhdHVzLT5zdGF0ZSA9IHN0YXRlXzsKKyAgemVyb2luZzo6UG9wdWxhdGVFc3RpbWF0b3JTdGF0ZShjbGF3X2VzdGltYXRvcl8sICZzdGF0dXMtPnplcm9pbmdfc3RhdGUpOworCisgIHN0YXR1cy0+YW5nbGUgPSBjbGF3X2xvb3BfLT5YX2hhdCgwLCAwKTsKKyAgc3RhdHVzLT5hbmd1bGFyX3ZlbG9jaXR5ID0gY2xhd19sb29wXy0+WF9oYXQoMSwgMCk7CisKKyAgaWYgKG91dHB1dCkgeworICAgIHN0YXR1cy0+aW50YWtlID0gb3V0cHV0LT5pbnRha2Vfdm9sdGFnZTsKKyAgfSBlbHNlIHsKKyAgICBzdGF0dXMtPmludGFrZSA9IDA7CisgIH0KKyAgc3RhdHVzLT5nb2FsX2FuZ2xlID0gY2xhd19nb2FsXzsKKyAgc3RhdHVzLT5nb2FsX3ZlbG9jaXR5ID0gY2xhd19nb2FsX3ZlbG9jaXR5OworCisgIGlmIChvdXRwdXQpIHsKKyAgICBzdGF0dXMtPnJvbGxlcnNfb3BlbiA9CisgICAgICAgICFvdXRwdXQtPnJvbGxlcnNfY2xvc2VkICYmCisgICAgICAgIChUaW1lOjpOb3coKSAtIGxhc3RfcGlzdG9uX2VkZ2VfID49IHZhbHVlcy5jbGF3LnBpc3Rvbl9zd2l0Y2hfdGltZSk7CisgICAgc3RhdHVzLT5yb2xsZXJzX2Nsb3NlZCA9CisgICAgICAgIG91dHB1dC0+cm9sbGVyc19jbG9zZWQgJiYKKyAgICAgICAgKFRpbWU6Ok5vdygpIC0gbGFzdF9waXN0b25fZWRnZV8gPj0gdmFsdWVzLmNsYXcucGlzdG9uX3N3aXRjaF90aW1lKTsKKyAgfSBlbHNlIHsKKyAgICBzdGF0dXMtPnJvbGxlcnNfb3BlbiA9IGZhbHNlOworICAgIHN0YXR1cy0+cm9sbGVyc19jbG9zZWQgPSBmYWxzZTsKKyAgfQorCisgIGlmIChvdXRwdXQpIHsKKyAgICBsYXN0X3JvbGxlcnNfY2xvc2VkXyA9IG91dHB1dC0+cm9sbGVyc19jbG9zZWQ7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3Lmd5cCBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3Lmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODBmMDY1Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwCkBAIC0wLDAgKzEsODkgQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3JlcGxheV9jbGF3JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ25vX3JzeW5jJzogMSwKKyAgICAgIH0sCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3JlcGxheV9jbGF3LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnY2xhd19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpyZXBsYXlfY29udHJvbF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdjbGF3X3F1ZXVlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWydjbGF3LnEnXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICd5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcnLAorICAgICAgfSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3BfcXVldWVzJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnF1ZXVlcycsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3BfcXVldWVzJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnF1ZXVlcycsCisKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZXMnOiBbJy4uLy4uLy4uL2Fvcy9idWlsZC9xdWV1ZXMuZ3lwaSddLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2NsYXdfbGliJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY2xhdy5jYycsCisgICAgICAgICdjbGF3X21vdG9yX3BsYW50LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnY2xhd19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnRyYXBlem9pZF9wcm9maWxlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L3kyMDE1Lmd5cDpjb25zdGFudHMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvemVyb2luZy96ZXJvaW5nLmd5cDp6ZXJvaW5nJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJ2NsYXdfcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDp0cmFwZXpvaWRfcHJvZmlsZScsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmcuZ3lwOnplcm9pbmcnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdjbGF3X2xpYl90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjbGF3X2xpYl90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJ2NsYXdfbGliJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6cG9zaXRpb25fc2Vuc29yX3NpbScsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDp0ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY2xhdycsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY2xhd19tYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICdjbGF3X2xpYicsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5oIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU1Mzk4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuaApAQCAtMCwwICsxLDExNiBAQAorI2lmbmRlZiBZMjAxNV9DT05UUk9MX0xPT1BTX0NMQVdfSF8KKyNkZWZpbmUgWTIwMTVfQ09OVFJPTF9MT09QU19DTEFXX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdGltZS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC90cmFwZXpvaWRfcHJvZmlsZS5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbW90b3JfcGxhbnQuaCIKKyNpbmNsdWRlICJmcmM5NzEvemVyb2luZy96ZXJvaW5nLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworY2xhc3MgQ2xhd1Rlc3RfRGlzYWJsZWRHb2FsX1Rlc3Q7CitjbGFzcyBDbGF3VGVzdF9Hb2FsUG9zaXRpdmVXaW5kdXBfVGVzdDsKK2NsYXNzIENsYXdUZXN0X0dvYWxOZWdhdGl2ZVdpbmR1cF9UZXN0OworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworY2xhc3MgQ2xhd0NhcHBlZFN0YXRlRmVlZGJhY2tMb29wIDogcHVibGljIFN0YXRlRmVlZGJhY2tMb29wPDIsIDEsIDE+IHsKKyBwdWJsaWM6CisgIENsYXdDYXBwZWRTdGF0ZUZlZWRiYWNrTG9vcChTdGF0ZUZlZWRiYWNrTG9vcDwyLCAxLCAxPiAmJmxvb3ApCisgICAgICA6IFN0YXRlRmVlZGJhY2tMb29wPDIsIDEsIDE+KDo6c3RkOjptb3ZlKGxvb3ApKSwgbWF4X3ZvbHRhZ2VfKDEyLjApIHt9CisKKyAgdm9pZCBzZXRfbWF4X3ZvbHRhZ2UoZG91YmxlIG1heF92b2x0YWdlKSB7CisgICAgbWF4X3ZvbHRhZ2VfID0gOjpzdGQ6Om1heCgwLjAsIDo6c3RkOjptaW4oMTIuMCwgbWF4X3ZvbHRhZ2UpKTsKKyAgfQorCisgIHZvaWQgQ2FwVSgpIG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgdGhlIGFtb3VudCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uIGdvYWwgaW4gb3JkZXIgdG8gbm8gbG9uZ2VyCisgIC8vIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyLgorICBkb3VibGUgVW5zYXR1cmF0ZU91dHB1dEdvYWxDaGFuZ2UoKTsKKworIHByaXZhdGU6CisgIGRvdWJsZSBtYXhfdm9sdGFnZV87Cit9OworCitjbGFzcyBDbGF3IDogcHVibGljIGFvczo6Y29udHJvbHM6OkNvbnRyb2xMb29wPGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZT4geworIHB1YmxpYzoKKyAgZW51bSBTdGF0ZSB7CisgICAgLy8gV2FpdGluZyB0byByZWNlaXZlIGRhdGEgYmVmb3JlIGRvaW5nIGFueXRoaW5nLgorICAgIFVOSU5JVElBTElaRUQgPSAwLAorICAgIC8vIEVzdGltYXRpbmcgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uLgorICAgIElOSVRJQUxJWklORyA9IDEsCisgICAgLy8gTW92aW5nIHRvIGZpbmQgYW4gaW5kZXggcHVsc2UuCisgICAgWkVST0lORyA9IDIsCisgICAgLy8gTm9ybWFsIG9wZXJhdGlvbi4KKyAgICBSVU5OSU5HID0gMywKKyAgICAvLyBJbnRlcm5hbCBlcnJvciBjYXVzZWQgdGhlIGNsYXcgdG8gYWJvcnQuCisgICAgRVNUT1AgPSA0LAorICB9OworCisgIGludCBzdGF0ZSgpIHsgcmV0dXJuIHN0YXRlXzsgfQorCisgIGV4cGxpY2l0IENsYXcoCisgICAgICBjb250cm9sX2xvb3BzOjpDbGF3UXVldWUgKmNsYXdfcXVldWUgPSAmY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBSdW5JdGVyYXRpb24oY29uc3QgY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlOjpHb2FsICpnb2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6T3V0cHV0ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlOjpTdGF0dXMgKnN0YXR1cyk7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgdGVzdGluZzo6Q2xhd1Rlc3RfRGlzYWJsZWRHb2FsX1Rlc3Q7CisgIGZyaWVuZCBjbGFzcyB0ZXN0aW5nOjpDbGF3VGVzdF9Hb2FsUG9zaXRpdmVXaW5kdXBfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIHRlc3Rpbmc6OkNsYXdUZXN0X0dvYWxOZWdhdGl2ZVdpbmR1cF9UZXN0OworCisgIC8vIFNldHMgc3RhdGVfIHRvIHRoZSBjb3JyZWN0IHN0YXRlIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB6ZXJvaW5nCisgIC8vIGVzdGltYXRvci4KKyAgdm9pZCBVcGRhdGVaZXJvaW5nU3RhdGUoKTsKKyAgdm9pZCBTZXRDbGF3T2Zmc2V0KGRvdWJsZSBvZmZzZXQpOworICAvLyBDb3JyZWN0cyB0aGUgT2JzZXJ2ZXIgd2l0aCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgdm9pZCBDb3JyZWN0KCk7CisKKyAgLy8gR2V0dGVyIGZvciB0aGUgY3VycmVudCBjbGF3IHBvc2l0aW9uLgorICBkb3VibGUgY2xhd19wb3NpdGlvbigpIGNvbnN0OworICAvLyBPdXIgYmVzdCBndWVzcyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgY2xhdy4KKyAgZG91YmxlIGVzdGltYXRlZF9jbGF3X3Bvc2l0aW9uKCkgY29uc3Q7CisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgemVyb2luZyB2ZWxvY2l0eSBmb3IgdGhlIGNsYXcuIElmIHRoZSBzdWJzeXN0ZW0gaXMgdG9vCisgIC8vIGZhciBhd2F5IGZyb20gdGhlIGNlbnRlciwgaXQgd2lsbCBzd2l0Y2ggZGlyZWN0aW9ucy4KKyAgZG91YmxlIGNsYXdfemVyb2luZ192ZWxvY2l0eSgpOworCisgIFN0YXRlIHN0YXRlXyA9IFVOSU5JVElBTElaRUQ7CisKKyAgLy8gVGhlIHRpbWUgd2hlbiB3ZSBsYXN0IGNoYW5nZWQgdGhlIGNsYXcgcGlzdG9uIHN0YXRlLgorICA6OmFvczo6dGltZTo6VGltZSBsYXN0X3Bpc3Rvbl9lZGdlXzsKKworICAvLyBUaGUgc3RhdGUgZmVlZGJhY2sgY29udHJvbCBsb29wIHRvIHRhbGsgdG8uCisgIDo6c3RkOjp1bmlxdWVfcHRyPENsYXdDYXBwZWRTdGF0ZUZlZWRiYWNrTG9vcD4gY2xhd19sb29wXzsKKworICAvLyBMYXRlc3QgcG9zaXRpb24gZnJvbSBxdWV1ZS4KKyAgY29udHJvbF9sb29wczo6Q2xhd1F1ZXVlOjpQb3NpdGlvbiBjdXJyZW50X3Bvc2l0aW9uXzsKKyAgLy8gWmVyb2luZyBlc3RpbWF0b3IgZm9yIGNsYXcuCisgIHplcm9pbmc6Olplcm9pbmdFc3RpbWF0b3IgY2xhd19lc3RpbWF0b3JfOworCisgIC8vIFRoZSBnb2FsIGZvciB0aGUgY2xhdy4KKyAgZG91YmxlIGNsYXdfZ29hbF8gPSAwLjA7CisgIC8vIEN1cnJlbnQgdmVsb2NpdHkgdG8gbW92ZSBhdCB3aGlsZSB6ZXJvaW5nLgorICBkb3VibGUgY2xhd196ZXJvaW5nX3ZlbG9jaXR5XyA9IDAuMDsKKyAgLy8gT2Zmc2V0cyBmcm9tIHRoZSBlbmNvZGVyIHBvc2l0aW9uIHRvIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbi4KKyAgZG91YmxlIGNsYXdfb2Zmc2V0XyA9IDAuMDsKKworICAvLyBXaGV0aGVyIGNsYXcgd2FzIGNsb3NlZCBsYXN0IGN5Y2xlLgorICBib29sIGxhc3Rfcm9sbGVyc19jbG9zZWRfID0gZmFsc2U7CisKKyAgOjphb3M6OnV0aWw6OlRyYXBlem9pZFByb2ZpbGUgcHJvZmlsZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE1X0NPTlRST0xfTE9PUFNfQ0xBV19IXwpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucSBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LnEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhMWMyMAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LnEKQEAgLTAsMCArMSw4MSBAQAorcGFja2FnZSBmcmM5NzEuY29udHJvbF9sb29wczsKKworaW1wb3J0ICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcHMucSI7CitpbXBvcnQgImZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMucSI7CisKK3F1ZXVlX2dyb3VwIENsYXdRdWV1ZSB7CisgIGltcGxlbWVudHMgYW9zLmNvbnRyb2xfbG9vcHMuQ29udHJvbExvb3A7CisKKyAgLy8gQWxsIGFuZ2xlcyBhcmUgaW4gcmFkaWFucyB3aXRoIDAgc3RpY2tpbmcgc3RyYWlnaHQgb3V0IHRoZSBmcm9udC4gUm90YXRpbmcKKyAgLy8gdXAgYW5kIGludG8gdGhlIHJvYm90IGlzIHBvc2l0aXZlLiBQb3NpdGl2ZSBvdXRwdXQgdm9sdGFnZSBtb3ZlcyBpbiB0aGUKKyAgLy8gZGlyZWN0aW9uIG9mIHBvc2l0aXZlIGVuY29kZXIgdmFsdWVzLgorCisgIG1lc3NhZ2UgR29hbCB7CisgICAgLy8gQW5nbGUgb2Ygd3Jpc3Qgam9pbnQuCisgICAgZG91YmxlIGFuZ2xlOworICAgIC8vIEFuZ3VsYXIgdmVsb2NpdHkgb2Ygd3Jpc3QuCisgICAgZmxvYXQgYW5ndWxhcl92ZWxvY2l0eTsKKyAgICAvLyBNYXhpbXVtIHByb2ZpbGUgdmVsb2NpdHksIG9yIDAgZm9yIHRoZSBkZWZhdWx0LgorICAgIGZsb2F0IG1heF92ZWxvY2l0eTsKKyAgICAvLyBNYXhpbXVtIHByb2ZpbGUgYWNjZWxlcmF0aW9uLCBvciAwIGZvciB0aGUgZGVmYXVsdC4KKyAgICBmbG9hdCBtYXhfYWNjZWxlcmF0aW9uOworICAgIC8vIFZvbHRhZ2Ugb2YgaW50YWtlIHJvbGxlcnMuIFBvc2l0aXZlIG1lYW5zIHN1Y2tpbmcgaW4sIG5lZ2F0aXZlIG1lYW5zCisgICAgLy8gc3BpdHRpbmcgb3V0LgorICAgIGRvdWJsZSBpbnRha2U7CisKKyAgICAvLyB0cnVlIHRvIHNpZ25hbCB0aGUgcm9sbGVycyB0byBjbG9zZS4KKyAgICBib29sIHJvbGxlcnNfY2xvc2VkOworICB9OworCisgIG1lc3NhZ2UgUG9zaXRpb24geworICAgIFBvdEFuZEluZGV4UG9zaXRpb24gam9pbnQ7CisgIH07CisKKyAgbWVzc2FnZSBPdXRwdXQgeworICAgIC8vIFZvbHRhZ2UgZm9yIGludGFrZSBtb3RvcnMuIFBvc2l0aXZlIGlzIHN1Y2tpbmcgaW4sIG5lZ2F0aXZlIGlzIHNwaXR0aW5nCisgICAgLy8gb3V0LgorICAgIGRvdWJsZSBpbnRha2Vfdm9sdGFnZTsKKyAgICAvLyBWb2x0YWdlIGZvciBjbGF3IG1vdG9yLgorICAgIGRvdWJsZSB2b2x0YWdlOworCisgICAgLy8gdHJ1ZSB0byBzaWduYWwgdGhlIHJvbGxlcnMgdG8gY2xvc2UuCisgICAgYm9vbCByb2xsZXJzX2Nsb3NlZDsKKyAgfTsKKworICBtZXNzYWdlIFN0YXR1cyB7CisgICAgLy8gSXMgY2xhdyB6ZXJvZWQ/CisgICAgYm9vbCB6ZXJvZWQ7CisgICAgLy8gRGlkIHRoZSBjbGF3IGVzdG9wPworICAgIGJvb2wgZXN0b3BwZWQ7CisgICAgLy8gVGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjbGF3IHN0YXRlIG1hY2hpbmUuCisgICAgdWludDMyX3Qgc3RhdGU7CisgICAgRXN0aW1hdG9yU3RhdGUgemVyb2luZ19zdGF0ZTsKKworICAgIC8vIEVzdGltYXRlZCBhbmdsZSBvZiB3cmlzdCBqb2ludC4KKyAgICBkb3VibGUgYW5nbGU7CisgICAgLy8gRXN0aW1hdGVkIGFuZ3VsYXIgdmVsb2NpdHkgb2Ygd3Jpc3QuCisgICAgZmxvYXQgYW5ndWxhcl92ZWxvY2l0eTsKKworICAgIC8vIEdvYWwgYW5nbGUgb2Ygd3Jpc3Qgam9pbnQuCisgICAgZG91YmxlIGdvYWxfYW5nbGU7CisgICAgZmxvYXQgZ29hbF92ZWxvY2l0eTsKKyAgICAvLyBWb2x0YWdlIG9mIGludGFrZSByb2xsZXJzLiBQb3NpdGl2ZSBtZWFucyBzdWNraW5nIGluLCBuZWdhdGl2ZSBtZWFucworICAgIC8vIHNwaXR0aW5nIG91dC4KKyAgICBkb3VibGUgaW50YWtlOworCisgICAgLy8gVHJ1ZSBpZmYgdGhlcmUgaGFzIGJlZW4gZW5vdWdoIHRpbWUgc2luY2Ugd2UgYWN0dWF0ZWQgdGhlIHJvbGxlcnMgb3V0d2FyZAorICAgIC8vIHRoYXQgdGhleSBzaG91bGQgYmUgdGhlcmUuCisgICAgYm9vbCByb2xsZXJzX29wZW47CisgICAgLy8gVHJ1ZSBpZmYgdGhlcmUgaGFzIGJlZW4gZW5vdWdoIHRpbWUgc2luY2Ugd2UgYWN0dWF0ZWQgdGhlIHJvbGxlcnMgY2xvc2VkCisgICAgLy8gdGhhdCB0aGV5IHNob3VsZCBiZSB0aGVyZS4KKyAgICBib29sIHJvbGxlcnNfY2xvc2VkOworICB9OworCisgIHF1ZXVlIEdvYWwgZ29hbDsKKyAgcXVldWUgUG9zaXRpb24gcG9zaXRpb247CisgIHF1ZXVlIE91dHB1dCBvdXRwdXQ7CisgIHF1ZXVlIFN0YXR1cyBzdGF0dXM7Cit9OworCitxdWV1ZV9ncm91cCBDbGF3UXVldWUgY2xhd19xdWV1ZTsKKwpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbGliX3Rlc3QuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19saWJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGZjYzA3Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbGliX3Rlc3QuY2MKQEAgLTAsMCArMSwzNDcgQEAKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcF90ZXN0LmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucS5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbS5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3RlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQuaCIKKwordXNpbmcgOjphb3M6OnRpbWU6OlRpbWU7CisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBDbGFzcyB3aGljaCBzaW11bGF0ZXMgdGhlIGNsYXcgYW5kIHNlbmRzIG91dCBxdWV1ZSBtZXNzYWdlcyB3aXRoIHRoZQorLy8gcG9zaXRpb24uCitjbGFzcyBDbGF3U2ltdWxhdGlvbiB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgY2xhdyBzaW11bGF0aW9uLgorICBDbGF3U2ltdWxhdGlvbigpCisgICAgICA6IGNsYXdfcGxhbnRfKG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnQ8MiwgMSwgMT4oTWFrZUNsYXdQbGFudCgpKSksCisgICAgICAgIHBvdF9hbmRfZW5jb2Rlcl8oY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbGF3Lnplcm9pbmcuaW5kZXhfZGlmZmVyZW5jZSksCisgICAgICAgIGNsYXdfcXVldWVfKCIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZSIsIDB4OWQ3NDUyZmIsCisgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5nb2FsIiwKKyAgICAgICAgICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5jbGF3X3F1ZXVlLnBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5jbGF3X3F1ZXVlLm91dHB1dCIsCisgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5zdGF0dXMiKSB7CisgICAgSW5pdGlhbGl6ZVBvc2l0aW9uKGNvbnN0YW50czo6R2V0VmFsdWVzKCkuY2xhdy53cmlzdC5sb3dlcl9saW1pdCk7CisgIH0KKworICB2b2lkIEluaXRpYWxpemVQb3NpdGlvbihkb3VibGUgc3RhcnRfcG9zKSB7CisgICAgSW5pdGlhbGl6ZVBvc2l0aW9uKHN0YXJ0X3BvcywKKyAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbGF3Lnplcm9pbmcubWVhc3VyZWRfaW5kZXhfcG9zaXRpb24pOworICB9CisKKyAgdm9pZCBJbml0aWFsaXplUG9zaXRpb24oZG91YmxlIHN0YXJ0X3BvcywgZG91YmxlIGluZGV4X3BvcykgeworICAgIEluaXRpYWxpemVQb3NpdGlvbihzdGFydF9wb3MsCisgICAgICAgIC8vIFRoaXMgZ2l2ZXMgdXMgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgfjkgZGVncmVlcyBvbiB0aGUgcG90IG5vaXNlLgorICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmNsYXcuemVyb2luZy5pbmRleF9kaWZmZXJlbmNlIC8gMTAuMCwKKyAgICAgICAgaW5kZXhfcG9zKTsKKyAgfQorCisgIC8vIERvIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciB0aGUgc2Vuc29ycy4KKyAgdm9pZCBJbml0aWFsaXplUG9zaXRpb24oZG91YmxlIHN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcG90X25vaXNlX3N0ZGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaW5kZXhfcG9zKSB7CisgICAgLy8gVXBkYXRlIGludGVybmFsIHN0YXRlLgorICAgIGNsYXdfcGxhbnRfLT5tdXRhYmxlX1goMCwgMCkgPSBzdGFydF9wb3M7CisgICAgLy8gWmVybyB2ZWxvY2l0eS4KKyAgICBjbGF3X3BsYW50Xy0+bXV0YWJsZV9YKDEsIDApID0gMC4wOworCisgICAgcG90X2FuZF9lbmNvZGVyXy5Jbml0aWFsaXplKHN0YXJ0X3BvcywgcG90X25vaXNlX3N0ZGRldiwgaW5kZXhfcG9zKTsKKyAgfQorCisgIC8vIFNlbmRzIGEgcXVldWUgbWVzc2FnZSB3aXRoIHRoZSBwb3NpdGlvbi4KKyAgdm9pZCBTZW5kUG9zaXRpb25NZXNzYWdlKCkgeworICAgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPGNvbnRyb2xfbG9vcHM6OkNsYXdRdWV1ZTo6UG9zaXRpb24+IHBvc2l0aW9uID0KKyAgICAgIGNsYXdfcXVldWVfLnBvc2l0aW9uLk1ha2VNZXNzYWdlKCk7CisgICAgcG90X2FuZF9lbmNvZGVyXy5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uLT5qb2ludCk7CisgICAgcG9zaXRpb24uU2VuZCgpOworICB9CisKKyAgLy8gU2ltdWxhdGVzIGZvciBhIHNpbmdsZSB0aW1lc3RlcC4KKyAgdm9pZCBTaW11bGF0ZSgpIHsKKyAgICBFWFBFQ1RfVFJVRShjbGF3X3F1ZXVlXy5vdXRwdXQuRmV0Y2hMYXRlc3QoKSk7CisKKyAgICAvLyBGZWVkIHZvbHRhZ2VzIGludG8gcGh5c2ljcyBzaW11bGF0aW9uLgorICAgIGNsYXdfcGxhbnRfLT5tdXRhYmxlX1UoKSA8PCBjbGF3X3F1ZXVlXy5vdXRwdXQtPnZvbHRhZ2U7CisgICAgY2xhd19wbGFudF8tPlVwZGF0ZSgpOworCisgICAgY29uc3QgZG91YmxlIHdyaXN0X2FuZ2xlID0gY2xhd19wbGFudF8tPlkoMCwgMCk7CisKKyAgICAvLyBUT0RPKGRhbmllbHApOiBTYW5pdHkgY2hlY2tzLgorCisgICAgcG90X2FuZF9lbmNvZGVyXy5Nb3ZlVG8od3Jpc3RfYW5nbGUpOworICB9CisKKyBwcml2YXRlOgorICA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnQ8MiwgMSwgMT4+IGNsYXdfcGxhbnRfOworICBQb3NpdGlvblNlbnNvclNpbXVsYXRvciBwb3RfYW5kX2VuY29kZXJfOworCisgIENsYXdRdWV1ZSBjbGF3X3F1ZXVlXzsKK307CisKK2NsYXNzIENsYXdUZXN0IDogcHVibGljIDo6YW9zOjp0ZXN0aW5nOjpDb250cm9sTG9vcFRlc3QgeworIHByb3RlY3RlZDoKKyAgQ2xhd1Rlc3QoKQorICAgICAgOiBjbGF3X3F1ZXVlXygiLmZyYzk3MS5jb250cm9sX2xvb3BzLmNsYXdfcXVldWUiLCAweDlkNzQ1MmZiLAorICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmNsYXdfcXVldWUuZ29hbCIsCisgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5wb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5vdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmNsYXdfcXVldWUuc3RhdHVzIiksCisgICAgICAgIGNsYXdfKCZjbGF3X3F1ZXVlXyksCisgICAgICAgIGNsYXdfcGxhbnRfKCkgeworICAgIHNldF90ZWFtX2lkKGtUZWFtTnVtYmVyKTsKKyAgfQorCisgIHZvaWQgVmVyaWZ5TmVhckdvYWwoKSB7CisgICAgY2xhd19xdWV1ZV8uZ29hbC5GZXRjaExhdGVzdCgpOworICAgIGNsYXdfcXVldWVfLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICAgIEVYUEVDVF9ORUFSKGNsYXdfcXVldWVfLmdvYWwtPmFuZ2xlLAorICAgICAgICAgICAgICAgIGNsYXdfcXVldWVfLnN0YXR1cy0+YW5nbGUsCisgICAgICAgICAgICAgICAgMTAuMCk7CisKKyAgICBFWFBFQ1RfVFJVRShjbGF3X3F1ZXVlXy5zdGF0dXMtPnplcm9lZCk7CisgICAgRVhQRUNUX0ZBTFNFKGNsYXdfcXVldWVfLnN0YXR1cy0+ZXN0b3BwZWQpOworICB9CisKKyAgLy8gUnVucyBvbmUgaXRlcmF0aW9uIG9mIHRoZSB3aG9sZSBzaW11bGF0aW9uLgorICB2b2lkIFJ1bkl0ZXJhdGlvbihib29sIGVuYWJsZWQgPSB0cnVlKSB7CisgICAgU2VuZE1lc3NhZ2VzKGVuYWJsZWQpOworCisgICAgY2xhd19wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIGNsYXdfLkl0ZXJhdGUoKTsKKyAgICBjbGF3X3BsYW50Xy5TaW11bGF0ZSgpOworCisgICAgVGlja1RpbWUoKTsKKyAgfQorCisgIC8vIFJ1bnMgaXRlcmF0aW9ucyB1bnRpbCB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBzaW11bGF0ZWQgdGltZSBoYXMgZWxhcHNlZC4KKyAgdm9pZCBSdW5Gb3JUaW1lKGNvbnN0IFRpbWUgJnJ1bl9mb3IsIGJvb2wgZW5hYmxlZCA9IHRydWUpIHsKKyAgICBjb25zdCBhdXRvIHN0YXJ0X3RpbWUgPSBUaW1lOjpOb3coKTsKKyAgICB3aGlsZSAoVGltZTo6Tm93KCkgPCBzdGFydF90aW1lICsgcnVuX2ZvcikgeworICAgICAgUnVuSXRlcmF0aW9uKGVuYWJsZWQpOworICAgIH0KKyAgfQorCisgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBxdWV1ZSBzbyB0aGF0IGl0IGludmFsaWRhdGVzIHRoZSBxdWV1ZQorICAvLyB0aGF0IGl0IHBvaW50cyB0by4gIE90aGVyd2lzZSwgd2Ugd2lsbCBoYXZlIGEgcG9pbnRlZCB0bworICAvLyBzaGFyZWQgbWVtb3J5IHRoYXQgaXMgbm8gbG9uZ2VyIHZhbGlkLgorICBDbGF3UXVldWUgY2xhd19xdWV1ZV87CisKKyAgLy8gQ3JlYXRlIGEgY29udHJvbCBsb29wIGFuZCBzaW11bGF0aW9uLgorICBDbGF3IGNsYXdfOworICBDbGF3U2ltdWxhdGlvbiBjbGF3X3BsYW50XzsKK307CisKKy8vIFRlc3RzIHRoYXQgdGhlIGxvb3AgZG9lcyBub3RoaW5nIHdoZW4gdGhlIGdvYWwgaXMgb3VyIGxvd2VyIGxpbWl0LgorVEVTVF9GKENsYXdUZXN0LCBEb2VzTm90aGluZykgeworICBjb25zdCBhdXRvICZ2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworICBBU1NFUlRfVFJVRShjbGF3X3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYW5nbGUodmFsdWVzLmNsYXcud3Jpc3QubG93ZXJfbGltaXQpCisgICAgICAuU2VuZCgpKTsKKworICBSdW5Gb3JUaW1lKFRpbWU6OkluU2Vjb25kcyg2KSk7CisKKyAgLy8gV2Ugc2hvdWxkIG5vdCBoYXZlIG1vdmVkLgorICBWZXJpZnlOZWFyR29hbCgpOworfQorCisvLyBOT1RFOiBDbGF3IHplcm9pbmcgaXMgYSBsaXR0bGUgYW5ub3lpbmcgYmVjYXVzZSB3ZSBvbmx5IGhpdCBvbmUgaW5kZXggcHVsc2UKKy8vIGluIG91ciBlbnRpcmUgcmFuZ2Ugb2YgbW90aW9uLgorCisvLyBUZXN0cyB0aGF0IHRoZSBsb29wIHplcm9pbmcgd29ya3Mgd2l0aCBub3JtYWwgdmFsdWVzLgorVEVTVF9GKENsYXdUZXN0LCBaZXJvZXMpIHsKKyAgLy8gSXQgc2hvdWxkIHplcm8gaXRzZWxmIGlmIHdlIHJ1biBpdCBmb3IgYXdoaWxlLgorICBBU1NFUlRfVFJVRShjbGF3X3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYW5nbGUoTV9QSSAvIDQuMCkKKyAgICAgIC5TZW5kKCkpOworCisgIFJ1bkZvclRpbWUoVGltZTo6SW5TZWNvbmRzKDYpKTsKKworICBBU1NFUlRfVFJVRShjbGF3X3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKSk7CisgIEVYUEVDVF9UUlVFKGNsYXdfcXVldWVfLnN0YXR1cy0+emVyb2VkKTsKKyAgRVhQRUNUX0VRKENsYXc6OlJVTk5JTkcsIGNsYXdfcXVldWVfLnN0YXR1cy0+c3RhdGUpOworfQorCisvLyBUZXN0cyB0aGF0IGNsYXcgemVyb2luZyBmYWlscyBpZiB0aGUgaW5kZXggcHVsc2Ugb2NjdXJzIHRvbyBjbG9zZSB0byB0aGUgZW5kCisvLyBvZiB0aGUgcmFuZ2UuCitURVNUX0YoQ2xhd1Rlc3QsIEJhZEluZGV4UG9zaXRpb24pIHsKKyAgY29uc3QgYXV0byB2YWx1ZXMgPSBjb25zdGFudHM6OkdldFZhbHVlcygpOworICBjbGF3X3BsYW50Xy5Jbml0aWFsaXplUG9zaXRpb24odmFsdWVzLmNsYXcud3Jpc3QubG93ZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuY2xhdy53cmlzdC51cHBlcl9saW1pdCk7CisKKyAgQVNTRVJUX1RSVUUoY2xhd19xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmFuZ2xlKE1fUEkgLyA0LjApCisgICAgICAuU2VuZCgpKTsKKworICAvLyBUaGUgemVyb2luZyBpcyBnb2luZyB0byB0YWtlIGl0cyBzd2VldCB0aW1lIG9uIHRoaXMgb25lLCBzbyB3ZSBoYWQgYmV0dGVyCisgIC8vIHJ1biBpdCBmb3IgbG9uZ2VyLgorICBSdW5Gb3JUaW1lKFRpbWU6OkluTVMoMTIwMDApKTsKKworICBBU1NFUlRfVFJVRShjbGF3X3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKSk7CisgIEVYUEVDVF9GQUxTRShjbGF3X3F1ZXVlXy5zdGF0dXMtPnplcm9lZCk7CisgIEVYUEVDVF9GQUxTRShjbGF3X3F1ZXVlXy5zdGF0dXMtPmVzdG9wcGVkKTsKK30KKworLy8gVGVzdHMgdGhhdCB3ZSBjYW4gcmVhY2ggYSByZWFzb25hYmxlIGdvYWwuCitURVNUX0YoQ2xhd1Rlc3QsIFJlYWNoZXNHb2FsKSB7CisgIEFTU0VSVF9UUlVFKGNsYXdfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgIC5hbmdsZShNX1BJIC8gNC4wKQorICAgICAgLlNlbmQoKSk7CisKKyAgUnVuRm9yVGltZShUaW1lOjpJblNlY29uZHMoNikpOworCisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgaXQgZG9lc24ndCB0cnkgdG8gbW92ZSBwYXN0IHRoZSBwaHlzaWNhbCByYW5nZSBvZiB0aGUgbWVjaGFuaXNtLgorVEVTVF9GKENsYXdUZXN0LCBSZXNwZWN0c1JhbmdlKSB7CisgIGNvbnN0IGF1dG8gJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisgIC8vIFVwcGVyIGxpbWl0CisgIEFTU0VSVF9UUlVFKGNsYXdfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgIC5hbmdsZSh2YWx1ZXMuY2xhdy53cmlzdC51cHBlcl9oYXJkX2xpbWl0ICsgNS4wKQorICAgICAgLlNlbmQoKSk7CisKKyAgUnVuRm9yVGltZShUaW1lOjpJblNlY29uZHMoNykpOworCisgIGNsYXdfcXVldWVfLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBFWFBFQ1RfTkVBUih2YWx1ZXMuY2xhdy53cmlzdC51cHBlcl9saW1pdCwKKyAgICAgICAgICAgICAgY2xhd19xdWV1ZV8uc3RhdHVzLT5hbmdsZSwKKyAgICAgICAgICAgICAgMi4wICogTV9QSSAvIDE4MC4wKTsKKworICAvLyBMb3dlciBsaW1pdC4KKyAgQVNTRVJUX1RSVUUoY2xhd19xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmFuZ2xlKHZhbHVlcy5jbGF3LndyaXN0Lmxvd2VyX2hhcmRfbGltaXQgLSA1LjApCisgICAgICAuU2VuZCgpKTsKKworICBSdW5Gb3JUaW1lKFRpbWU6OkluTVMoNjAwMCkpOworCisgIGNsYXdfcXVldWVfLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBFWFBFQ1RfTkVBUih2YWx1ZXMuY2xhdy53cmlzdC5sb3dlcl9saW1pdCwKKyAgICAgICAgICAgICAgY2xhd19xdWV1ZV8uc3RhdHVzLT5hbmdsZSwKKyAgICAgICAgICAgICAgMi4wICogTV9QSSAvIDE4MC4wKTsKK30KKworLy8gVGVzdHMgdGhhdCBzdGFydGluZyBhdCB0aGUgbG93ZXIgaGFyZHN0b3AgZG9lc24ndCBjYXVzZSBhbiBhYm9ydC4KK1RFU1RfRihDbGF3VGVzdCwgTG93ZXJIYXJkc3RvcFN0YXJ0dXApIHsKKyAgY2xhd19wbGFudF8uSW5pdGlhbGl6ZVBvc2l0aW9uKAorICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbGF3LndyaXN0Lmxvd2VyX2hhcmRfbGltaXQpOworICBBU1NFUlRfVFJVRShjbGF3X3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYW5nbGUoTV9QSSAvIDQuMCkKKyAgICAgIC5TZW5kKCkpOworICBSdW5Gb3JUaW1lKFRpbWU6OkluU2Vjb25kcyg2KSk7CisKKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCBzdGFydGluZyBhdCB0aGUgdXBwZXIgaGFyZHN0b3AgZG9lc24ndCBjYXVzZSBhbiBhYm9ydC4KK1RFU1RfRihDbGF3VGVzdCwgVXBwZXJIYXJkc3RvcFN0YXJ0dXApIHsKKyAgY2xhd19wbGFudF8uSW5pdGlhbGl6ZVBvc2l0aW9uKAorICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbGF3LndyaXN0LnVwcGVyX2hhcmRfbGltaXQpOworICBBU1NFUlRfVFJVRShjbGF3X3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYW5nbGUoTV9QSSAvIDQuMCkKKyAgICAgIC5TZW5kKCkpOworICAvLyBaZXJvaW5nIHdpbGwgdGFrZSBhIGxvbmcgdGltZSBoZXJlLgorICBSdW5Gb3JUaW1lKFRpbWU6OkluU2Vjb25kcygxNSkpOworCisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKworLy8gVGVzdHMgdGhhdCBub3QgaGF2aW5nIGEgZ29hbCBkb2Vzbid0IGJyZWFrIGFueXRoaW5nLgorVEVTVF9GKENsYXdUZXN0LCBOb0dvYWwpIHsKKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDUwKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgYSBXUElMaWIgcmVzZXQgcmVzdWx0cyBpbiByZXplcm9pbmcuCitURVNUX0YoQ2xhd1Rlc3QsIFdwaWxpYlJlc2V0KSB7CisgIEFTU0VSVF9UUlVFKGNsYXdfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgIC5hbmdsZShNX1BJIC8gNC4wKQorICAgICAgLlNlbmQoKSk7CisKKyAgUnVuRm9yVGltZShUaW1lOjpJblNlY29uZHMoNikpOworICBWZXJpZnlOZWFyR29hbCgpOworCisgIFNpbXVsYXRlU2Vuc29yUmVzZXQoKTsKKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDEwMCkpOworICBBU1NFUlRfVFJVRShjbGF3X3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKSk7CisgIEVYUEVDVF9ORShDbGF3OjpSVU5OSU5HLCBjbGF3X3F1ZXVlXy5zdGF0dXMtPnN0YXRlKTsKKworICAvLyBPbmNlIGFnYWluLCBpdCdzIGdvaW5nIHRvIHRha2UgdXMgYXdoaWxlIHRvIHJlemVybyBzaW5jZSB3ZSBtb3ZlZCBhd2F5IGZyb20KKyAgLy8gb3VyIGluZGV4IHB1bHNlLgorICBSdW5Gb3JUaW1lKFRpbWU6OkluU2Vjb25kcyg2KSk7CisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgaW50ZXJuYWwgZ29hbHMgZG9uJ3QgY2hhbmdlIHdoaWxlIGRpc2FibGVkLgorVEVTVF9GKENsYXdUZXN0LCBEaXNhYmxlZEdvYWwpIHsKKyAgQVNTRVJUX1RSVUUoY2xhd19xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmFuZ2xlKE1fUEkgLyA0LjApCisgICAgICAuU2VuZCgpKTsKKworICBSdW5Gb3JUaW1lKFRpbWU6OkluTVMoMTAwKSwgZmFsc2UpOworICBFWFBFQ1RfRVEoMC4wLCBjbGF3Xy5jbGF3X2dvYWxfKTsKKworICAvLyBOb3cgbWFrZSBzdXJlIHRoZXkgbW92ZSBjb3JyZWN0bHkuCisgIFJ1bkZvclRpbWUoVGltZTo6SW5NUygxMDAwKSwgdHJ1ZSk7CisgIEVYUEVDVF9ORSgwLjAsIGNsYXdfLmNsYXdfZ29hbF8pOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBjbGF3IHplcm9pbmcgZ29hbHMgZG9uJ3Qgd2luZCB1cCB0b28gZmFyLgorVEVTVF9GKENsYXdUZXN0LCBHb2FsUG9zaXRpdmVXaW5kdXApIHsKKyAgQVNTRVJUX1RSVUUoY2xhd19xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgLmFuZ2xlKE1fUEkgLyA0LjApCisgICAgICAuU2VuZCgpKTsKKworICB3aGlsZSAoY2xhd18uc3RhdGUoKSAhPSBDbGF3OjpaRVJPSU5HKSB7CisgICAgUnVuSXRlcmF0aW9uKCk7CisgIH0KKworICAvLyBLaWNrIGl0LgorICBSdW5Gb3JUaW1lKFRpbWU6OkluTVMoNTApKTsKKyAgY29uc3QgZG91YmxlIG9yaWdfY2xhd19nb2FsID0gY2xhd18uY2xhd19nb2FsXzsKKyAgY2xhd18uY2xhd19nb2FsXyArPSAxMDAuMDsKKworICBSdW5JdGVyYXRpb24oKTsKKyAgRVhQRUNUX05FQVIob3JpZ19jbGF3X2dvYWwsIGNsYXdfLmNsYXdfZ29hbF8sIDAuMTApOworCisgIFJ1bkl0ZXJhdGlvbigpOworCisgIEVYUEVDVF9FUShjbGF3Xy5jbGF3X2xvb3BfLT5VKCksIGNsYXdfLmNsYXdfbG9vcF8tPlVfdW5jYXBwZWQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGNsYXcgemVyb2luZyBnb2FscyBkb24ndCB3aW5kIHVwIHRvbyBmYXIuCitURVNUX0YoQ2xhd1Rlc3QsIEdvYWxOZWdhdGl2ZVdpbmR1cCkgeworICBBU1NFUlRfVFJVRShjbGF3X3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYW5nbGUoTV9QSSAvIDQuMCkKKyAgICAgIC5TZW5kKCkpOworCisgIHdoaWxlIChjbGF3Xy5zdGF0ZSgpICE9IENsYXc6OlpFUk9JTkcpIHsKKyAgICBSdW5JdGVyYXRpb24oKTsKKyAgfQorCisgIC8vIEtpY2sgaXQuCisgIFJ1bkZvclRpbWUoVGltZTo6SW5NUyg1MCkpOworICBkb3VibGUgb3JpZ19jbGF3X2dvYWwgPSBjbGF3Xy5jbGF3X2dvYWxfOworICBjbGF3Xy5jbGF3X2dvYWxfIC09IDEwMC4wOworCisgIFJ1bkl0ZXJhdGlvbigpOworICBFWFBFQ1RfTkVBUihvcmlnX2NsYXdfZ29hbCwgY2xhd18uY2xhd19nb2FsXywgMC4xMCk7CisKKyAgUnVuSXRlcmF0aW9uKCk7CisKKyAgRVhQRUNUX0VRKGNsYXdfLmNsYXdfbG9vcF8tPlUoKSwgY2xhd18uY2xhd19sb29wXy0+VV91bmNhcHBlZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tYWluLmNjIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWI4NjljCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbWFpbi5jYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuaCIKKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKworaW50IG1haW4oKSB7CisgIDo6YW9zOjpJbml0KCk7CisgIGZyYzk3MTo6Y29udHJvbF9sb29wczo6Q2xhdyBjbGF3OworICBjbGF3LlJ1bigpOworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X21vdG9yX3BsYW50LmNjIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbW90b3JfcGxhbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1YzIwNgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3X21vdG9yX3BsYW50LmNjCkBAIC0wLDAgKzEsNDkgQEAKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tb3Rvcl9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDEsIDE+IE1ha2VDbGF3UGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBOworICBBIDw8IDEuMCwgMC4wMDQ4MjQ1NTQ3Njc1OCwgMC4wLCAwLjkzMDY1MjQ5NTMyNjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IEI7CisgIEIgPDwgNi45NzExMDkyNDY3MWUtMDUsIDAuMDI3NTU0NDEyNTMwODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEM7CisgIEMgPDwgMSwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEQ7CisgIEQgPDwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDEsIDE+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDEsIDE+IE1ha2VDbGF3Q29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IEw7CisgIEwgPDwgMC45OTgyNTE0MjczNjYsIDI2Ljk4NzQ1MjYyMzE7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBLOworICBLIDw8IDc0LjQzMTAwMzExMjQsIDQuNzIyNTExMjYyMjI7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wLCAtMC4wMDUxODQwNTYxMjM4NiwgMC4wLCAxLjA3NDUxNDkyOTA3OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMSwgMT4oTCwgSywgQV9pbnYsIE1ha2VDbGF3UGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudDwyLCAxLCAxPiBNYWtlQ2xhd1BsYW50KCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMSwgMT4+PiBwbGFudHMoMSk7CisgIHBsYW50c1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAxLCAxPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAxLCAxPihNYWtlQ2xhd1BsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudDwyLCAxLCAxPigmcGxhbnRzKTsKK30KKworU3RhdGVGZWVkYmFja0xvb3A8MiwgMSwgMT4gTWFrZUNsYXdMb29wKCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAxLCAxPj4+IGNvbnRyb2xsZXJzKDEpOworICBjb250cm9sbGVyc1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDEsIDE+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMSwgMT4oTWFrZUNsYXdDb250cm9sbGVyKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tMb29wPDIsIDEsIDE+KCZjb250cm9sbGVycyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhd19tb3Rvcl9wbGFudC5oIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbW90b3JfcGxhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2I5Y2RiCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXdfbW90b3JfcGxhbnQuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIFkyMDE1X0NPTlRST0xfTE9PUFNfQ0xBV19DTEFXX01PVE9SX1BMQU5UX0hfCisjZGVmaW5lIFkyMDE1X0NPTlRST0xfTE9PUFNfQ0xBV19DTEFXX01PVE9SX1BMQU5UX0hfCisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMSwgMT4gTWFrZUNsYXdQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAxLCAxPiBNYWtlQ2xhd0NvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDIsIDEsIDE+IE1ha2VDbGF3UGxhbnQoKTsKKworU3RhdGVGZWVkYmFja0xvb3A8MiwgMSwgMT4gTWFrZUNsYXdMb29wKCk7CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTVfQ09OVFJPTF9MT09QU19DTEFXX0NMQVdfTU9UT1JfUExBTlRfSF8KZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9yZXBsYXlfY2xhdy5jYyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9yZXBsYXlfY2xhdy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY3M2U0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L3JlcGxheV9jbGF3LmNjCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3JlcGxheV9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisKKy8vIFJlYWRzIG9uZSBvciBtb3JlIGxvZyBmaWxlcyBhbmQgc2VuZHMgb3V0IGFsbCB0aGUgcXVldWUgbWVzc2FnZXMgKGluIHRoZQorLy8gY29ycmVjdCBvcmRlciBhbmQgYXQgdGhlIGNvcnJlY3QgdGltZSkgdG8gZmVlZCBhICJsaXZlIiBjbGF3IHByb2Nlc3MuCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBpZiAoYXJnYyA8PSAxKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJOZWVkIGF0IGxlYXN0IG9uZSBmaWxlIHRvIHJlcGxheSFcbiIpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICA6OmFvczo6SW5pdE5SVCgpOworCisgIDo6YW9zOjpjb250cm9sczo6Q29udHJvbExvb3BSZXBsYXllcjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6Q2xhd1F1ZXVlPgorICAgICAgcmVwbGF5ZXIoJjo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLCAiY2xhdyIpOworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgIHJlcGxheWVyLlByb2Nlc3NGaWxlKGFyZ3ZbaV0pOworICB9CisKKyAgOjphb3M6OkNsZWFudXAoKTsKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmNjIGIveTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhNWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmNjCkBAIC0wLDAgKzEsNzc3IEBACisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiRWlnZW4vRGVuc2UiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbW1vbm1hdGguaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9tYXRyaXhfbG9nZ2luZy5oIgorCisjaW5jbHVkZSAieTIwMTUvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2NvZXJjZV9nb2FsLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvcXVldWVzL2d5cm8ucS5oIgorI2luY2x1ZGUgImZyYzk3MS9zaGlmdGVyX2hhbGxfZWZmZWN0LmgiCisKKy8vIEEgY29uc2lzdGVudCB3YXkgdG8gbWFyayBjb2RlIHRoYXQgZ29lcyBhd2F5IHdpdGhvdXQgc2hpZnRlcnMuIEl0J3Mgc3RpbGwKKy8vIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGhhdmUgc2hpZnRlcnMgYWdhaW4gaW4gdGhlIGZ1dHVyZS4KKyNkZWZpbmUgSEFWRV9TSElGVEVSUyAwCisKK3VzaW5nIGZyYzk3MTo6c2Vuc29yczo6Z3lyb19yZWFkaW5nOworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworY2xhc3MgRHJpdmV0cmFpbk1vdG9yc1NTIHsKKyBwdWJsaWM6CisgIGNsYXNzIExpbWl0ZWREcml2ZXRyYWluTG9vcCA6IHB1YmxpYyBTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPiB7CisgICBwdWJsaWM6CisgICAgTGltaXRlZERyaXZldHJhaW5Mb29wKFN0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+ICYmbG9vcCkKKyAgICAgICAgOiBTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPig6OnN0ZDo6bW92ZShsb29wKSksCisgICAgICAgIFVfUG9seV8oKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPigpIDw8IDEsIDAsCisgICAgICAgICAgICAgICAgIC0xLCAwLAorICAgICAgICAgICAgICAgICAwLCAxLAorICAgICAgICAgICAgICAgICAwLCAtMSkuZmluaXNoZWQoKSwKKyAgICAgICAgICAgICAgICAoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+KCkgPDwgMTIuMCwgMTIuMCwKKyAgICAgICAgICAgICAgICAgMTIuMCwgMTIuMCkuZmluaXNoZWQoKSkgeworICAgICAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8MD46OkluaXQoKTsKKyAgICAgIFQgPDwgMSwgLTEsIDEsIDE7CisgICAgICBUX2ludmVyc2UgPSBULmludmVyc2UoKTsKKyAgICB9CisKKyAgICBib29sIG91dHB1dF93YXNfY2FwcGVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIG91dHB1dF93YXNfY2FwcGVkXzsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIENhcFUoKSB7CisgICAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMT4gZXJyb3IgPSBSKCkgLSBYX2hhdCgpOworCisgICAgICBpZiAoOjpzdGQ6OmFicyhVKDAsIDApKSA+IDEyLjAgfHwgOjpzdGQ6OmFicyhVKDEsIDApKSA+IDEyLjApIHsKKyAgICAgICAgbXV0YWJsZV9VKCkgPQorICAgICAgICAgICAgVSgpICogMTIuMCAvIDo6c3RkOjptYXgoOjpzdGQ6OmFicyhVKDAsIDApKSwgOjpzdGQ6OmFicyhVKDEsIDApKSk7CisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJVIGlzIG5vdyIsIFUoKSk7CisgICAgICAgIC8vIFRPRE8oQXVzdGluKTogRmlndXJlIG91dCB3aHkgdGhlIHBvbHl0b3BlIHN0dWZmIHdhc24ndCB3b3JraW5nIGFuZAorICAgICAgICAvLyByZW1vdmUgdGhpcyBoYWNrLgorICAgICAgICBvdXRwdXRfd2FzX2NhcHBlZF8gPSB0cnVlOworICAgICAgICByZXR1cm47CisKKyAgICAgICAgTE9HX01BVFJJWChERUJVRywgIlUgYXQgc3RhcnQiLCBVKCkpOworICAgICAgICBMT0dfTUFUUklYKERFQlVHLCAiUiBhdCBzdGFydCIsIFIoKSk7CisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJYaGF0IGF0IHN0YXJ0IiwgWF9oYXQoKSk7CisKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IHBvc2l0aW9uX0s7CisgICAgICAgIHBvc2l0aW9uX0sgPDwgSygwLCAwKSwgSygwLCAyKSwKKyAgICAgICAgICAgICAgICAgICBLKDEsIDApLCBLKDEsIDIpOworICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gdmVsb2NpdHlfSzsKKyAgICAgICAgdmVsb2NpdHlfSyA8PCBLKDAsIDEpLCBLKDAsIDMpLAorICAgICAgICAgICAgICAgICAgIEsoMSwgMSksIEsoMSwgMyk7CisKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHBvc2l0aW9uX2Vycm9yOworICAgICAgICBwb3NpdGlvbl9lcnJvciA8PCBlcnJvcigwLCAwKSwgZXJyb3IoMiwgMCk7CisgICAgICAgIGNvbnN0IGF1dG8gZHJpdmVfZXJyb3IgPSBUX2ludmVyc2UgKiBwb3NpdGlvbl9lcnJvcjsKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHZlbG9jaXR5X2Vycm9yOworICAgICAgICB2ZWxvY2l0eV9lcnJvciA8PCBlcnJvcigxLCAwKSwgZXJyb3IoMywgMCk7CisgICAgICAgIExPR19NQVRSSVgoREVCVUcsICJlcnJvciIsIGVycm9yKTsKKworICAgICAgICBjb25zdCBhdXRvICZwb2x5ID0gVV9Qb2x5XzsKKyAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IHBvc19wb2x5X0ggPQorICAgICAgICAgICAgcG9seS5IKCkgKiBwb3NpdGlvbl9LICogVDsKKyAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IHBvc19wb2x5X2sgPQorICAgICAgICAgICAgcG9seS5rKCkgLSBwb2x5LkgoKSAqIHZlbG9jaXR5X0sgKiB2ZWxvY2l0eV9lcnJvcjsKKyAgICAgICAgY29uc3QgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gcG9zX3BvbHkocG9zX3BvbHlfSCwgcG9zX3BvbHlfayk7CisKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGFkanVzdGVkX3Bvc19lcnJvcjsKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGF1dG8gJlAgPSBkcml2ZV9lcnJvcjsKKworICAgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBMNDU7CisgICAgICAgICAgTDQ1IDw8IDo6YW9zOjpzaWduKFAoMSwgMCkpLCAtOjphb3M6OnNpZ24oUCgwLCAwKSk7CisgICAgICAgICAgY29uc3QgZG91YmxlIHc0NSA9IDA7CisKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gTEg7CisgICAgICAgICAgaWYgKDo6c3RkOjphYnMoUCgwLCAwKSkgPiA6OnN0ZDo6YWJzKFAoMSwgMCkpKSB7CisgICAgICAgICAgICBMSCA8PCAwLCAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMSCA8PCAxLCAwOworICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdCBkb3VibGUgd2ggPSBMSC5kb3QoUCk7CisKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gc3RhbmRhcmQ7CisgICAgICAgICAgc3RhbmRhcmQgPDwgTDQ1LCBMSDsKKyAgICAgICAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVzsKKyAgICAgICAgICBXIDw8IHc0NSwgd2g7CisgICAgICAgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGludGVyc2VjdGlvbiA9CisgICAgICAgICAgICAgIHN0YW5kYXJkLmludmVyc2UoKSAqIFc7CisKKyAgICAgICAgICBib29sIGlzX2luc2lkZV9oOworICAgICAgICAgIGNvbnN0IGF1dG8gYWRqdXN0ZWRfcG9zX2Vycm9yX2ggPQorICAgICAgICAgICAgICBEb0NvZXJjZUdvYWwocG9zX3BvbHksIExILCB3aCwgZHJpdmVfZXJyb3IsICZpc19pbnNpZGVfaCk7CisgICAgICAgICAgY29uc3QgYXV0byBhZGp1c3RlZF9wb3NfZXJyb3JfNDUgPQorICAgICAgICAgICAgICBEb0NvZXJjZUdvYWwocG9zX3BvbHksIEw0NSwgdzQ1LCBpbnRlcnNlY3Rpb24sIG51bGxwdHIpOworICAgICAgICAgIGlmIChwb3NfcG9seS5Jc0luc2lkZShpbnRlcnNlY3Rpb24pKSB7CisgICAgICAgICAgICBhZGp1c3RlZF9wb3NfZXJyb3IgPSBhZGp1c3RlZF9wb3NfZXJyb3JfaDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzX2luc2lkZV9oKSB7CisgICAgICAgICAgICAgIGlmIChhZGp1c3RlZF9wb3NfZXJyb3JfaC5ub3JtKCkgPiBhZGp1c3RlZF9wb3NfZXJyb3JfNDUubm9ybSgpKSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ZWRfcG9zX2Vycm9yID0gYWRqdXN0ZWRfcG9zX2Vycm9yX2g7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ZWRfcG9zX2Vycm9yID0gYWRqdXN0ZWRfcG9zX2Vycm9yXzQ1OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBhZGp1c3RlZF9wb3NfZXJyb3IgPSBhZGp1c3RlZF9wb3NfZXJyb3JfNDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTE9HX01BVFJJWChERUJVRywgImFkanVzdGVkX3Bvc19lcnJvciIsIGFkanVzdGVkX3Bvc19lcnJvcik7CisgICAgICAgIG11dGFibGVfVSgpID0KKyAgICAgICAgICAgIHZlbG9jaXR5X0sgKiB2ZWxvY2l0eV9lcnJvciArIHBvc2l0aW9uX0sgKiBUICogYWRqdXN0ZWRfcG9zX2Vycm9yOworICAgICAgICBMT0dfTUFUUklYKERFQlVHLCAiVSBpcyBub3ciLCBVKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0X3dhc19jYXBwZWRfID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3QgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gVV9Qb2x5XzsKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gVCwgVF9pbnZlcnNlOworICAgIGJvb2wgb3V0cHV0X3dhc19jYXBwZWRfID0gZmFsc2U7OworICB9OworCisgIERyaXZldHJhaW5Nb3RvcnNTUygpCisgICAgICA6IGxvb3BfKG5ldyBMaW1pdGVkRHJpdmV0cmFpbkxvb3AoCisgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLm1ha2VfZHJpdmV0cmFpbl9sb29wKCkpKSwKKyAgICAgICAgZmlsdGVyZWRfb2Zmc2V0XygwLjApLAorICAgICAgICBneXJvXygwLjApLAorICAgICAgICBsZWZ0X2dvYWxfKDAuMCksCisgICAgICAgIHJpZ2h0X2dvYWxfKDAuMCksCisgICAgICAgIHJhd19sZWZ0XygwLjApLAorICAgICAgICByYXdfcmlnaHRfKDAuMCkgeworICAgIC8vIExvdyBnZWFyIG9uIGJvdGguCisgICAgbG9vcF8tPnNldF9jb250cm9sbGVyX2luZGV4KDApOworICB9CisKKyAgdm9pZCBTZXRHb2FsKGRvdWJsZSBsZWZ0LCBkb3VibGUgbGVmdF92ZWxvY2l0eSwgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0X3ZlbG9jaXR5KSB7CisgICAgbGVmdF9nb2FsXyA9IGxlZnQ7CisgICAgcmlnaHRfZ29hbF8gPSByaWdodDsKKyAgICBsb29wXy0+bXV0YWJsZV9SKCkgPDwgbGVmdCwgbGVmdF92ZWxvY2l0eSwgcmlnaHQsIHJpZ2h0X3ZlbG9jaXR5OworICB9CisgIHZvaWQgU2V0UmF3UG9zaXRpb24oZG91YmxlIGxlZnQsIGRvdWJsZSByaWdodCkgeworICAgIHJhd19yaWdodF8gPSByaWdodDsKKyAgICByYXdfbGVmdF8gPSBsZWZ0OworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBZOworICAgIFkgPDwgbGVmdCArIGZpbHRlcmVkX29mZnNldF8sIHJpZ2h0IC0gZmlsdGVyZWRfb2Zmc2V0XzsKKyAgICBsb29wXy0+Q29ycmVjdChZKTsKKyAgfQorICB2b2lkIFNldFBvc2l0aW9uKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBneXJvKSB7CisgICAgLy8gRGVjYXkgdGhlIG9mZnNldCBxdWlja2x5IGJlY2F1c2UgdGhpcyBneXJvIGlzIGdyZWF0LgorICAgIGNvbnN0IGRvdWJsZSBvZmZzZXQgPQorICAgICAgICAocmlnaHQgLSBsZWZ0IC0gZ3lybyAqIGNvbnN0YW50czo6R2V0VmFsdWVzKCkudHVybl93aWR0aCkgLyAyLjA7CisgICAgZmlsdGVyZWRfb2Zmc2V0XyA9IDAuMjUgKiBvZmZzZXQgKyAwLjc1ICogZmlsdGVyZWRfb2Zmc2V0XzsKKyAgICBneXJvXyA9IGd5cm87CisgICAgU2V0UmF3UG9zaXRpb24obGVmdCwgcmlnaHQpOworICB9CisKKyAgdm9pZCBTZXRFeHRlcm5hbE1vdG9ycyhkb3VibGUgbGVmdF92b2x0YWdlLCBkb3VibGUgcmlnaHRfdm9sdGFnZSkgeworICAgIGxvb3BfLT5tdXRhYmxlX1UoKSA8PCBsZWZ0X3ZvbHRhZ2UsIHJpZ2h0X3ZvbHRhZ2U7CisgIH0KKworICB2b2lkIFVwZGF0ZShib29sIHN0b3BfbW90b3JzLCBib29sIGVuYWJsZV9jb250cm9sX2xvb3ApIHsKKyAgICBpZiAoZW5hYmxlX2NvbnRyb2xfbG9vcCkgeworICAgICAgbG9vcF8tPlVwZGF0ZShzdG9wX21vdG9ycyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdG9wX21vdG9ycykgeworICAgICAgICBsb29wXy0+bXV0YWJsZV9VKCkuc2V0WmVybygpOworICAgICAgICBsb29wXy0+bXV0YWJsZV9VX3VuY2FwcGVkKCkuc2V0WmVybygpOworICAgICAgfQorICAgICAgbG9vcF8tPlVwZGF0ZU9ic2VydmVyKCk7CisgICAgfQorICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IEUgPSBsb29wXy0+UigpIC0gbG9vcF8tPlhfaGF0KCk7CisgICAgTE9HX01BVFJJWChERUJVRywgIkUiLCBFKTsKKyAgfQorCisgIGRvdWJsZSBHZXRFc3RpbWF0ZWRSb2JvdFNwZWVkKCkgY29uc3QgeworICAgIC8vIGxldHMganVzdCBjYWxsIHRoZSBhdmVyYWdlIG9mIGxlZnQgYW5kIHJpZ2h0IHZlbG9jaXRpZXMgY2xvc2UgZW5vdWdoCisgICAgcmV0dXJuIChsb29wXy0+WF9oYXQoMSwgMCkgKyBsb29wXy0+WF9oYXQoMywgMCkpIC8gMjsKKyAgfQorCisgIGRvdWJsZSBHZXRFc3RpbWF0ZWRMZWZ0RW5jb2RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9vcF8tPlhfaGF0KDAsIDApOworICB9CisKKyAgZG91YmxlIEdldEVzdGltYXRlZFJpZ2h0RW5jb2RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9vcF8tPlhfaGF0KDIsIDApOworICB9CisKKyAgYm9vbCBPdXRwdXRXYXNDYXBwZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGxvb3BfLT5vdXRwdXRfd2FzX2NhcHBlZCgpOworICB9CisKKyAgdm9pZCBTZW5kTW90b3JzKERyaXZldHJhaW5RdWV1ZTo6T3V0cHV0ICpvdXRwdXQpIGNvbnN0IHsKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICBvdXRwdXQtPmxlZnRfdm9sdGFnZSA9IGxvb3BfLT5VKDAsIDApOworICAgICAgb3V0cHV0LT5yaWdodF92b2x0YWdlID0gbG9vcF8tPlUoMSwgMCk7CisgICAgICBvdXRwdXQtPmxlZnRfaGlnaCA9IGZhbHNlOworICAgICAgb3V0cHV0LT5yaWdodF9oaWdoID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgY29uc3QgTGltaXRlZERyaXZldHJhaW5Mb29wICZsb29wKCkgY29uc3QgeyByZXR1cm4gKmxvb3BfOyB9CisKKyBwcml2YXRlOgorICA6OnN0ZDo6dW5pcXVlX3B0cjxMaW1pdGVkRHJpdmV0cmFpbkxvb3A+IGxvb3BfOworCisgIGRvdWJsZSBmaWx0ZXJlZF9vZmZzZXRfOworICBkb3VibGUgZ3lyb187CisgIGRvdWJsZSBsZWZ0X2dvYWxfOworICBkb3VibGUgcmlnaHRfZ29hbF87CisgIGRvdWJsZSByYXdfbGVmdF87CisgIGRvdWJsZSByYXdfcmlnaHRfOworfTsKKworY2xhc3MgUG9seURyaXZldHJhaW4geworIHB1YmxpYzoKKworICBlbnVtIEdlYXIgeworICAgIEhJR0gsCisgICAgTE9XLAorICAgIFNISUZUSU5HX1VQLAorICAgIFNISUZUSU5HX0RPV04KKyAgfTsKKyAgLy8gU3RhbGwgVG9ycXVlIGluIE4gbQorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU3RhbGxUb3JxdWUgPSAyLjQyOworICAvLyBTdGFsbCBDdXJyZW50IGluIEFtcHMKKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1N0YWxsQ3VycmVudCA9IDEzMy4wOworICAvLyBGcmVlIFNwZWVkIGluIFJQTS4gVXNlZCBudW1iZXIgZnJvbSBsYXN0IHllYXIuCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtGcmVlU3BlZWQgPSA0NjUwLjA7CisgIC8vIEZyZWUgQ3VycmVudCBpbiBBbXBzCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtGcmVlQ3VycmVudCA9IDIuNzsKKyAgLy8gTW9tZW50IG9mIGluZXJ0aWEgb2YgdGhlIGRyaXZldHJhaW4gaW4ga2cgbV4yCisgIC8vIEp1c3QgYm9ycm93ZWQgZnJvbSBsYXN0IHllYXIuCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIEogPSAxMDsKKyAgLy8gTWFzcyBvZiB0aGUgcm9ib3QsIGluIGtnLgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBtID0gNjg7CisgIC8vIFJhZGl1cyBvZiB0aGUgcm9ib3QsIGluIG1ldGVycyAoZnJvbSBsYXN0IHllYXIpLgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSByYiA9IDAuOTYwMyAvIDIuMDsKKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1doZWVsUmFkaXVzID0gMC4wNTE1OTM4OworICAvLyBSZXNpc3RhbmNlIG9mIHRoZSBtb3RvciwgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIG1vdG9ycy4KKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1IgPSAoMTIuMCAvIGtTdGFsbEN1cnJlbnQgLyAyICsgMC4wMykgLyAoMC45MyAqIDAuOTMpOworICAvLyBNb3RvciB2ZWxvY2l0eSBjb25zdGFudAorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBLdiA9CisgICAgICAoKGtGcmVlU3BlZWQgLyA2MC4wICogMi4wICogTV9QSSkgLyAoMTIuMCAtIGtSICoga0ZyZWVDdXJyZW50KSk7CisgIC8vIFRvcnF1ZSBjb25zdGFudAorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBLdCA9IGtTdGFsbFRvcnF1ZSAvIGtTdGFsbEN1cnJlbnQ7CisKKyAgUG9seURyaXZldHJhaW4oKQorICAgICAgOiBVX1BvbHlfKChFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4oKSA8PCAvKltbKi8gMSwgMCAvKl0qLywKKyAgICAgICAgICAgICAgICAgLypbKi8gLTEsIDAgLypdKi8sCisgICAgICAgICAgICAgICAgIC8qWyovIDAsIDEgLypdKi8sCisgICAgICAgICAgICAgICAgIC8qWyovIDAsIC0xIC8qXV0qLykuZmluaXNoZWQoKSwKKyAgICAgICAgICAgICAgICAoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+KCkgPDwgLypbWyovIDEyIC8qXSovLAorICAgICAgICAgICAgICAgICAvKlsqLyAxMiAvKl0qLywKKyAgICAgICAgICAgICAgICAgLypbKi8gMTIgLypdKi8sCisgICAgICAgICAgICAgICAgIC8qWyovIDEyIC8qXV0qLykuZmluaXNoZWQoKSksCisgICAgICAgIGxvb3BfKG5ldyBTdGF0ZUZlZWRiYWNrTG9vcDwyLCAyLCAyPigKKyAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkubWFrZV92X2RyaXZldHJhaW5fbG9vcCgpKSksCisgICAgICAgIHR0cnVzdF8oMS4xKSwKKyAgICAgICAgd2hlZWxfKDAuMCksCisgICAgICAgIHRocm90dGxlXygwLjApLAorICAgICAgICBxdWlja3R1cm5fKGZhbHNlKSwKKyAgICAgICAgc3RhbGVfY291bnRfKDApLAorICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXygwLjAxKSwKKyAgICAgICAgbGVmdF9nZWFyXyhMT1cpLAorICAgICAgICByaWdodF9nZWFyXyhMT1cpLAorICAgICAgICBjb3VudGVyXygwKSB7CisKKyAgICBsYXN0X3Bvc2l0aW9uXy5aZXJvKCk7CisgICAgcG9zaXRpb25fLlplcm8oKTsKKyAgfQorICBzdGF0aWMgYm9vbCBJc0luR2VhcihHZWFyIGdlYXIpIHsgcmV0dXJuIGdlYXIgPT0gTE9XIHx8IGdlYXIgPT0gSElHSDsgfQorCisgIHN0YXRpYyBkb3VibGUgTW90b3JTcGVlZChjb25zdCBjb25zdGFudHM6OlNoaWZ0ZXJIYWxsRWZmZWN0ICZoYWxsX2VmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzaGlmdGVyX3Bvc2l0aW9uLCBkb3VibGUgdmVsb2NpdHkpIHsKKyAgICAvLyBUT0RPKGF1c3Rpbik6IEdfaGlnaCwgR19sb3cgYW5kIGtXaGVlbFJhZGl1cworICAgIGNvbnN0IGRvdWJsZSBhdmdfaGFsbF9lZmZlY3QgPQorICAgICAgICAoaGFsbF9lZmZlY3QuY2xlYXJfaGlnaCArIGhhbGxfZWZmZWN0LmNsZWFyX2xvdykgLyAyLjA7CisKKyAgICBpZiAoc2hpZnRlcl9wb3NpdGlvbiA+IGF2Z19oYWxsX2VmZmVjdCkgeworICAgICAgcmV0dXJuIHZlbG9jaXR5IC8gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5oaWdoX2dlYXJfcmF0aW8gLyBrV2hlZWxSYWRpdXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB2ZWxvY2l0eSAvIGNvbnN0YW50czo6R2V0VmFsdWVzKCkubG93X2dlYXJfcmF0aW8gLyBrV2hlZWxSYWRpdXM7CisgICAgfQorICB9CisKKyAgR2VhciBDb21wdXRlR2Vhcihjb25zdCBjb25zdGFudHM6OlNoaWZ0ZXJIYWxsRWZmZWN0ICZoYWxsX2VmZmVjdCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgdmVsb2NpdHksIEdlYXIgY3VycmVudCkgeworICAgIGNvbnN0IGRvdWJsZSBsb3dfb21lZ2EgPSBNb3RvclNwZWVkKGhhbGxfZWZmZWN0LCAwLjAsIDo6c3RkOjphYnModmVsb2NpdHkpKTsKKyAgICBjb25zdCBkb3VibGUgaGlnaF9vbWVnYSA9CisgICAgICAgIE1vdG9yU3BlZWQoaGFsbF9lZmZlY3QsIDEuMCwgOjpzdGQ6OmFicyh2ZWxvY2l0eSkpOworCisgICAgZG91YmxlIGhpZ2hfdG9ycXVlID0gKCgxMi4wIC0gaGlnaF9vbWVnYSAvIEt2KSAqIEt0IC8ga1IpOworICAgIGRvdWJsZSBsb3dfdG9ycXVlID0gKCgxMi4wIC0gbG93X29tZWdhIC8gS3YpICogS3QgLyBrUik7CisgICAgZG91YmxlIGhpZ2hfcG93ZXIgPSBoaWdoX3RvcnF1ZSAqIGhpZ2hfb21lZ2E7CisgICAgZG91YmxlIGxvd19wb3dlciA9IGxvd190b3JxdWUgKiBsb3dfb21lZ2E7CisKKyAgICAvLyBUT0RPKGFzY2h1aCk6IERvIHRoaXMgcmlnaHQhCisgICAgaWYgKChjdXJyZW50ID09IEhJR0ggfHwgaGlnaF9wb3dlciA+IGxvd19wb3dlciArIDE2MCkgJiYKKyAgICAgICAgOjpzdGQ6OmFicyh2ZWxvY2l0eSkgPiAwLjE0KSB7CisgICAgICByZXR1cm4gSElHSDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIExPVzsKKyAgICB9CisgIH0KKworICB2b2lkIFNldEdvYWwoZG91YmxlIHdoZWVsLCBkb3VibGUgdGhyb3R0bGUsIGJvb2wgcXVpY2t0dXJuLCBib29sIGhpZ2hnZWFyKSB7CisgICAgY29uc3QgZG91YmxlIGtXaGVlbE5vbkxpbmVhcml0eSA9IDAuNTsKKyAgICAvLyBBcHBseSBhIHNpbiBmdW5jdGlvbiB0aGF0J3Mgc2NhbGVkIHRvIG1ha2UgaXQgZmVlbCBiZXR0ZXIuCisgICAgY29uc3QgZG91YmxlIGFuZ3VsYXJfcmFuZ2UgPSBNX1BJXzIgKiBrV2hlZWxOb25MaW5lYXJpdHk7CisKKyAgICB3aGVlbF8gPSBzaW4oYW5ndWxhcl9yYW5nZSAqIHdoZWVsKSAvIHNpbihhbmd1bGFyX3JhbmdlKTsKKyAgICB3aGVlbF8gPSBzaW4oYW5ndWxhcl9yYW5nZSAqIHdoZWVsXykgLyBzaW4oYW5ndWxhcl9yYW5nZSk7CisgICAgd2hlZWxfICo9IDIuMzsKKyAgICBxdWlja3R1cm5fID0gcXVpY2t0dXJuOworCisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrVGhyb3R0bGVEZWFkYmFuZCA9IDAuMDU7CisgICAgaWYgKDo6c3RkOjphYnModGhyb3R0bGUpIDwga1Rocm90dGxlRGVhZGJhbmQpIHsKKyAgICAgIHRocm90dGxlXyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm90dGxlXyA9IGNvcHlzaWduKCg6OnN0ZDo6YWJzKHRocm90dGxlKSAtIGtUaHJvdHRsZURlYWRiYW5kKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS4wIC0ga1Rocm90dGxlRGVhZGJhbmQpLCB0aHJvdHRsZSk7CisgICAgfQorCisgICAgLy8gVE9ETyhhdXN0aW4pOiBGaXggdGhlIHVwc2hpZnQgbG9naWMgdG8gaW5jbHVkZSBzdGF0ZXMuCisgICAgR2VhciByZXF1ZXN0ZWRfZ2VhcjsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIGNvbnN0IGF1dG8gJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisgICAgICBjb25zdCBkb3VibGUgY3VycmVudF9sZWZ0X3ZlbG9jaXR5ID0KKyAgICAgICAgICAocG9zaXRpb25fLmxlZnRfZW5jb2RlciAtIGxhc3RfcG9zaXRpb25fLmxlZnRfZW5jb2RlcikgLworICAgICAgICAgIHBvc2l0aW9uX3RpbWVfZGVsdGFfOworICAgICAgY29uc3QgZG91YmxlIGN1cnJlbnRfcmlnaHRfdmVsb2NpdHkgPQorICAgICAgICAgIChwb3NpdGlvbl8ucmlnaHRfZW5jb2RlciAtIGxhc3RfcG9zaXRpb25fLnJpZ2h0X2VuY29kZXIpIC8KKyAgICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXzsKKworICAgICAgR2VhciBsZWZ0X3JlcXVlc3RlZCA9CisgICAgICAgICAgQ29tcHV0ZUdlYXIodmFsdWVzLmxlZnRfZHJpdmUsIGN1cnJlbnRfbGVmdF92ZWxvY2l0eSwgbGVmdF9nZWFyXyk7CisgICAgICBHZWFyIHJpZ2h0X3JlcXVlc3RlZCA9CisgICAgICAgICAgQ29tcHV0ZUdlYXIodmFsdWVzLnJpZ2h0X2RyaXZlLCBjdXJyZW50X3JpZ2h0X3ZlbG9jaXR5LCByaWdodF9nZWFyXyk7CisgICAgICByZXF1ZXN0ZWRfZ2VhciA9CisgICAgICAgICAgKGxlZnRfcmVxdWVzdGVkID09IEhJR0ggfHwgcmlnaHRfcmVxdWVzdGVkID09IEhJR0gpID8gSElHSCA6IExPVzsKKyAgICB9IGVsc2UgeworICAgICAgcmVxdWVzdGVkX2dlYXIgPSBoaWdoZ2VhciA/IEhJR0ggOiBMT1c7CisgICAgfQorCisgICAgY29uc3QgR2VhciBzaGlmdF91cCA9CisgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuY2x1dGNoX3RyYW5zbWlzc2lvbiA/IEhJR0ggOiBTSElGVElOR19VUDsKKyAgICBjb25zdCBHZWFyIHNoaWZ0X2Rvd24gPQorICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmNsdXRjaF90cmFuc21pc3Npb24gPyBMT1cgOiBTSElGVElOR19ET1dOOworCisgICAgaWYgKGxlZnRfZ2Vhcl8gIT0gcmVxdWVzdGVkX2dlYXIpIHsKKyAgICAgIGlmIChJc0luR2VhcihsZWZ0X2dlYXJfKSkgeworICAgICAgICBpZiAocmVxdWVzdGVkX2dlYXIgPT0gSElHSCkgeworICAgICAgICAgIGxlZnRfZ2Vhcl8gPSBzaGlmdF91cDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsZWZ0X2dlYXJfID0gc2hpZnRfZG93bjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlcXVlc3RlZF9nZWFyID09IEhJR0ggJiYgbGVmdF9nZWFyXyA9PSBTSElGVElOR19ET1dOKSB7CisgICAgICAgICAgbGVmdF9nZWFyXyA9IFNISUZUSU5HX1VQOworICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZF9nZWFyID09IExPVyAmJiBsZWZ0X2dlYXJfID09IFNISUZUSU5HX1VQKSB7CisgICAgICAgICAgbGVmdF9nZWFyXyA9IFNISUZUSU5HX0RPV047CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJpZ2h0X2dlYXJfICE9IHJlcXVlc3RlZF9nZWFyKSB7CisgICAgICBpZiAoSXNJbkdlYXIocmlnaHRfZ2Vhcl8pKSB7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRfZ2VhciA9PSBISUdIKSB7CisgICAgICAgICAgcmlnaHRfZ2Vhcl8gPSBzaGlmdF91cDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByaWdodF9nZWFyXyA9IHNoaWZ0X2Rvd247CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRfZ2VhciA9PSBISUdIICYmIHJpZ2h0X2dlYXJfID09IFNISUZUSU5HX0RPV04pIHsKKyAgICAgICAgICByaWdodF9nZWFyXyA9IFNISUZUSU5HX1VQOworICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZF9nZWFyID09IExPVyAmJiByaWdodF9nZWFyXyA9PSBTSElGVElOR19VUCkgeworICAgICAgICAgIHJpZ2h0X2dlYXJfID0gU0hJRlRJTkdfRE9XTjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIFNldFBvc2l0aW9uKGNvbnN0IERyaXZldHJhaW5RdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgY29uc3QgYXV0byAmdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKyAgICBpZiAocG9zaXRpb24gPT0gTlVMTCkgeworICAgICAgKytzdGFsZV9jb3VudF87CisgICAgfSBlbHNlIHsKKyAgICAgIGxhc3RfcG9zaXRpb25fID0gcG9zaXRpb25fOworICAgICAgcG9zaXRpb25fID0gKnBvc2l0aW9uOworICAgICAgcG9zaXRpb25fdGltZV9kZWx0YV8gPSAoc3RhbGVfY291bnRfICsgMSkgKiAwLjAxOworICAgICAgc3RhbGVfY291bnRfID0gMDsKKyAgICB9CisKKyNpZiBIQVZFX1NISUZURVJTCisgICAgaWYgKHBvc2l0aW9uKSB7CisgICAgICBHZWFyTG9nZ2luZyBnZWFyX2xvZ2dpbmc7CisgICAgICAvLyBTd2l0Y2ggdG8gdGhlIGNvcnJlY3QgY29udHJvbGxlci4KKyAgICAgIGNvbnN0IGRvdWJsZSBsZWZ0X21pZGRsZV9zaGlmdGVyX3Bvc2l0aW9uID0KKyAgICAgICAgICAodmFsdWVzLmxlZnRfZHJpdmUuY2xlYXJfaGlnaCArIHZhbHVlcy5sZWZ0X2RyaXZlLmNsZWFyX2xvdykgLyAyLjA7CisgICAgICBjb25zdCBkb3VibGUgcmlnaHRfbWlkZGxlX3NoaWZ0ZXJfcG9zaXRpb24gPQorICAgICAgICAgICh2YWx1ZXMucmlnaHRfZHJpdmUuY2xlYXJfaGlnaCArIHZhbHVlcy5yaWdodF9kcml2ZS5jbGVhcl9sb3cpIC8gMi4wOworCisgICAgICBpZiAocG9zaXRpb24tPmxlZnRfc2hpZnRlcl9wb3NpdGlvbiA8IGxlZnRfbWlkZGxlX3NoaWZ0ZXJfcG9zaXRpb24gfHwKKyAgICAgICAgICBsZWZ0X2dlYXJfID09IExPVykgeworICAgICAgICBpZiAocG9zaXRpb24tPnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPCByaWdodF9taWRkbGVfc2hpZnRlcl9wb3NpdGlvbiB8fAorICAgICAgICAgICAgcmlnaHRfZ2Vhcl8gPT0gTE9XKSB7CisgICAgICAgICAgZ2Vhcl9sb2dnaW5nLmxlZnRfbG9vcF9oaWdoID0gZmFsc2U7CisgICAgICAgICAgZ2Vhcl9sb2dnaW5nLnJpZ2h0X2xvb3BfaGlnaCA9IGZhbHNlOworICAgICAgICAgIGxvb3BfLT5zZXRfY29udHJvbGxlcl9pbmRleChnZWFyX2xvZ2dpbmcuY29udHJvbGxlcl9pbmRleCA9IDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlYXJfbG9nZ2luZy5sZWZ0X2xvb3BfaGlnaCA9IGZhbHNlOworICAgICAgICAgIGdlYXJfbG9nZ2luZy5yaWdodF9sb29wX2hpZ2ggPSB0cnVlOworICAgICAgICAgIGxvb3BfLT5zZXRfY29udHJvbGxlcl9pbmRleChnZWFyX2xvZ2dpbmcuY29udHJvbGxlcl9pbmRleCA9IDEpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocG9zaXRpb24tPnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPCByaWdodF9taWRkbGVfc2hpZnRlcl9wb3NpdGlvbiB8fAorICAgICAgICAgICAgcmlnaHRfZ2Vhcl8gPT0gTE9XKSB7CisgICAgICAgICAgZ2Vhcl9sb2dnaW5nLmxlZnRfbG9vcF9oaWdoID0gdHJ1ZTsKKyAgICAgICAgICBnZWFyX2xvZ2dpbmcucmlnaHRfbG9vcF9oaWdoID0gZmFsc2U7CisgICAgICAgICAgbG9vcF8tPnNldF9jb250cm9sbGVyX2luZGV4KGdlYXJfbG9nZ2luZy5jb250cm9sbGVyX2luZGV4ID0gMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2Vhcl9sb2dnaW5nLmxlZnRfbG9vcF9oaWdoID0gdHJ1ZTsKKyAgICAgICAgICBnZWFyX2xvZ2dpbmcucmlnaHRfbG9vcF9oaWdoID0gdHJ1ZTsKKyAgICAgICAgICBsb29wXy0+c2V0X2NvbnRyb2xsZXJfaW5kZXgoZ2Vhcl9sb2dnaW5nLmNvbnRyb2xsZXJfaW5kZXggPSAzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBUT0RPKGF1c3Rpbik6IENvbnN0YW50cy4KKyAgICAgIGlmIChwb3NpdGlvbi0+bGVmdF9zaGlmdGVyX3Bvc2l0aW9uID4gdmFsdWVzLmxlZnRfZHJpdmUuY2xlYXJfaGlnaCAmJiBsZWZ0X2dlYXJfID09IFNISUZUSU5HX1VQKSB7CisgICAgICAgIGxlZnRfZ2Vhcl8gPSBISUdIOworICAgICAgfQorICAgICAgaWYgKHBvc2l0aW9uLT5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24gPCB2YWx1ZXMubGVmdF9kcml2ZS5jbGVhcl9sb3cgJiYgbGVmdF9nZWFyXyA9PSBTSElGVElOR19ET1dOKSB7CisgICAgICAgIGxlZnRfZ2Vhcl8gPSBMT1c7CisgICAgICB9CisgICAgICBpZiAocG9zaXRpb24tPnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPiB2YWx1ZXMucmlnaHRfZHJpdmUuY2xlYXJfaGlnaCAmJiByaWdodF9nZWFyXyA9PSBTSElGVElOR19VUCkgeworICAgICAgICByaWdodF9nZWFyXyA9IEhJR0g7CisgICAgICB9CisgICAgICBpZiAocG9zaXRpb24tPnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPCB2YWx1ZXMucmlnaHRfZHJpdmUuY2xlYXJfbG93ICYmIHJpZ2h0X2dlYXJfID09IFNISUZUSU5HX0RPV04pIHsKKyAgICAgICAgcmlnaHRfZ2Vhcl8gPSBMT1c7CisgICAgICB9CisKKyAgICAgIGdlYXJfbG9nZ2luZy5sZWZ0X3N0YXRlID0gbGVmdF9nZWFyXzsKKyAgICAgIGdlYXJfbG9nZ2luZy5yaWdodF9zdGF0ZSA9IHJpZ2h0X2dlYXJfOworICAgICAgTE9HX1NUUlVDVChERUJVRywgInN0YXRlIiwgZ2Vhcl9sb2dnaW5nKTsKKyAgICB9CisjZWxzZQorICAgICh2b2lkKSB2YWx1ZXM7CisjZW5kaWYKKyAgfQorCisgIGRvdWJsZSBGaWx0ZXJWZWxvY2l0eShkb3VibGUgdGhyb3R0bGUpIHsKKyAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRkYgPQorICAgICAgICBsb29wXy0+QigpLmludmVyc2UoKSAqCisgICAgICAgIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj46OklkZW50aXR5KCkgLSBsb29wXy0+QSgpKTsKKworICAgIGNvbnN0ZXhwciBpbnQga0hpZ2hHZWFyQ29udHJvbGxlciA9IDM7CisgICAgY29uc3QgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEZGX2hpZ2ggPQorICAgICAgICBsb29wXy0+Y29udHJvbGxlcihrSGlnaEdlYXJDb250cm9sbGVyKS5wbGFudC5CKCkuaW52ZXJzZSgpICoKKyAgICAgICAgKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPjo6SWRlbnRpdHkoKSAtCisgICAgICAgICBsb29wXy0+Y29udHJvbGxlcihrSGlnaEdlYXJDb250cm9sbGVyKS5wbGFudC5BKCkpOworCisgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gRkZfc3VtID0gRkYuY29sd2lzZSgpLnN1bSgpOworICAgIGludCBtaW5fRkZfc3VtX2luZGV4OworICAgIGNvbnN0IGRvdWJsZSBtaW5fRkZfc3VtID0gRkZfc3VtLm1pbkNvZWZmKCZtaW5fRkZfc3VtX2luZGV4KTsKKyAgICBjb25zdCBkb3VibGUgbWluX0tfc3VtID0gbG9vcF8tPksoKS5jb2wobWluX0ZGX3N1bV9pbmRleCkuc3VtKCk7CisgICAgY29uc3QgZG91YmxlIGhpZ2hfbWluX0ZGX3N1bSA9IEZGX2hpZ2guY29sKDApLnN1bSgpOworCisgICAgY29uc3QgZG91YmxlIGFkanVzdGVkX2ZmX3ZvbHRhZ2UgPSA6OmFvczo6Q2xpcCgKKyAgICAgICAgdGhyb3R0bGUgKiAxMi4wICogbWluX0ZGX3N1bSAvIGhpZ2hfbWluX0ZGX3N1bSwgLTEyLjAsIDEyLjApOworICAgIHJldHVybiAoYWRqdXN0ZWRfZmZfdm9sdGFnZSArCisgICAgICAgICAgICB0dHJ1c3RfICogbWluX0tfc3VtICogKGxvb3BfLT5YX2hhdCgwLCAwKSArIGxvb3BfLT5YX2hhdCgxLCAwKSkgLworICAgICAgICAgICAgICAgIDIuMCkgLworICAgICAgICAgICAodHRydXN0XyAqIG1pbl9LX3N1bSArIG1pbl9GRl9zdW0pOworICB9CisKKyAgZG91YmxlIE1heFZlbG9jaXR5KCkgeworICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBGRiA9CisgICAgICAgIGxvb3BfLT5CKCkuaW52ZXJzZSgpICoKKyAgICAgICAgKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPjo6SWRlbnRpdHkoKSAtIGxvb3BfLT5BKCkpOworCisgICAgY29uc3RleHByIGludCBrSGlnaEdlYXJDb250cm9sbGVyID0gMzsKKyAgICBjb25zdCBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRkZfaGlnaCA9CisgICAgICAgIGxvb3BfLT5jb250cm9sbGVyKGtIaWdoR2VhckNvbnRyb2xsZXIpLnBsYW50LkIoKS5pbnZlcnNlKCkgKgorICAgICAgICAoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+OjpJZGVudGl0eSgpIC0KKyAgICAgICAgIGxvb3BfLT5jb250cm9sbGVyKGtIaWdoR2VhckNvbnRyb2xsZXIpLnBsYW50LkEoKSk7CisKKyAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBGRl9zdW0gPSBGRi5jb2x3aXNlKCkuc3VtKCk7CisgICAgaW50IG1pbl9GRl9zdW1faW5kZXg7CisgICAgY29uc3QgZG91YmxlIG1pbl9GRl9zdW0gPSBGRl9zdW0ubWluQ29lZmYoJm1pbl9GRl9zdW1faW5kZXgpOworICAgIC8vY29uc3QgZG91YmxlIG1pbl9LX3N1bSA9IGxvb3BfLT5LKCkuY29sKG1pbl9GRl9zdW1faW5kZXgpLnN1bSgpOworICAgIGNvbnN0IGRvdWJsZSBoaWdoX21pbl9GRl9zdW0gPSBGRl9oaWdoLmNvbCgwKS5zdW0oKTsKKworICAgIGNvbnN0IGRvdWJsZSBhZGp1c3RlZF9mZl92b2x0YWdlID0gOjphb3M6OkNsaXAoCisgICAgICAgIDEyLjAgKiBtaW5fRkZfc3VtIC8gaGlnaF9taW5fRkZfc3VtLCAtMTIuMCwgMTIuMCk7CisgICAgcmV0dXJuIGFkanVzdGVkX2ZmX3ZvbHRhZ2UgLyBtaW5fRkZfc3VtOworICB9CisKKyAgdm9pZCBVcGRhdGUoKSB7CisgICAgY29uc3QgYXV0byAmdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKyAgICAvLyBUT0RPKGF1c3Rpbik6IE9ic2VydmVyIGZvciB0aGUgY3VycmVudCB2ZWxvY2l0eSBpbnN0ZWFkIG9mIGRpZmZlcmVuY2UKKyAgICAvLyBjYWxjdWxhdGlvbnMuCisgICAgKytjb3VudGVyXzsKKyNpZiBIQVZFX1NISUZURVJTCisgICAgY29uc3QgZG91YmxlIGN1cnJlbnRfbGVmdF92ZWxvY2l0eSA9CisgICAgICAgIChwb3NpdGlvbl8ubGVmdF9lbmNvZGVyIC0gbGFzdF9wb3NpdGlvbl8ubGVmdF9lbmNvZGVyKSAvCisgICAgICAgIHBvc2l0aW9uX3RpbWVfZGVsdGFfOworICAgIGNvbnN0IGRvdWJsZSBjdXJyZW50X3JpZ2h0X3ZlbG9jaXR5ID0KKyAgICAgICAgKHBvc2l0aW9uXy5yaWdodF9lbmNvZGVyIC0gbGFzdF9wb3NpdGlvbl8ucmlnaHRfZW5jb2RlcikgLworICAgICAgICBwb3NpdGlvbl90aW1lX2RlbHRhXzsKKyAgICBjb25zdCBkb3VibGUgbGVmdF9tb3Rvcl9zcGVlZCA9CisgICAgICAgIE1vdG9yU3BlZWQodmFsdWVzLmxlZnRfZHJpdmUsIHBvc2l0aW9uXy5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgY3VycmVudF9sZWZ0X3ZlbG9jaXR5KTsKKyAgICBjb25zdCBkb3VibGUgcmlnaHRfbW90b3Jfc3BlZWQgPQorICAgICAgICBNb3RvclNwZWVkKHZhbHVlcy5yaWdodF9kcml2ZSwgcG9zaXRpb25fLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgY3VycmVudF9yaWdodF92ZWxvY2l0eSk7CisKKyAgICB7CisgICAgICBDSU1Mb2dnaW5nIGxvZ2dpbmc7CisKKyAgICAgIC8vIFJlc2V0IHRoZSBDSU0gbW9kZWwgdG8gdGhlIGN1cnJlbnQgY29uZGl0aW9ucyB0byBiZSByZWFkeSBmb3Igd2hlbiB3ZQorICAgICAgLy8gc2hpZnQuCisgICAgICBpZiAoSXNJbkdlYXIobGVmdF9nZWFyXykpIHsKKyAgICAgICAgbG9nZ2luZy5sZWZ0X2luX2dlYXIgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nZ2luZy5sZWZ0X2luX2dlYXIgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGxvZ2dpbmcubGVmdF9tb3Rvcl9zcGVlZCA9IGxlZnRfbW90b3Jfc3BlZWQ7CisgICAgICBsb2dnaW5nLmxlZnRfdmVsb2NpdHkgPSBjdXJyZW50X2xlZnRfdmVsb2NpdHk7CisgICAgICBpZiAoSXNJbkdlYXIocmlnaHRfZ2Vhcl8pKSB7CisgICAgICAgIGxvZ2dpbmcucmlnaHRfaW5fZ2VhciA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb2dnaW5nLnJpZ2h0X2luX2dlYXIgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGxvZ2dpbmcucmlnaHRfbW90b3Jfc3BlZWQgPSByaWdodF9tb3Rvcl9zcGVlZDsKKyAgICAgIGxvZ2dpbmcucmlnaHRfdmVsb2NpdHkgPSBjdXJyZW50X3JpZ2h0X3ZlbG9jaXR5OworCisgICAgICBMT0dfU1RSVUNUKERFQlVHLCAiY3VycmVudGx5IiwgbG9nZ2luZyk7CisgICAgfQorI2Vsc2UKKyAgICAodm9pZCkgdmFsdWVzOworI2VuZGlmCisKKyNpZiBIQVZFX1NISUZURVJTCisgICAgaWYgKElzSW5HZWFyKGxlZnRfZ2Vhcl8pICYmIElzSW5HZWFyKHJpZ2h0X2dlYXJfKSkgeworI2Vsc2UKKyAgICB7CisjZW5kaWYKKyAgICAgIC8vIEZGICogWCA9IFUgKHN0ZWFkeSBzdGF0ZSkKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBGRiA9CisgICAgICAgICAgbG9vcF8tPkIoKS5pbnZlcnNlKCkgKgorICAgICAgICAgIChFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj46OklkZW50aXR5KCkgLSBsb29wXy0+QSgpKTsKKworICAgICAgLy8gSW52ZXJ0IHRoZSBwbGFudCB0byBmaWd1cmUgb3V0IGhvdyB0aGUgdmVsb2NpdHkgZmlsdGVyIHdvdWxkIGhhdmUgdG8KKyAgICAgIC8vIHdvcmsKKyAgICAgIC8vIG91dCBpbiBvcmRlciB0byBmaWx0ZXIgb3V0IHRoZSBmb3J3YXJkcyBuZWdhdGl2ZSBpbmVydGlhLgorICAgICAgLy8gVGhpcyBtYXRoIGFzc3VtZXMgdGhhdCB0aGUgbGVmdCBhbmQgcmlnaHQgcG93ZXIgYW5kIHZlbG9jaXR5IGFyZQorICAgICAgLy8gZXF1YWxzLAorICAgICAgLy8gYW5kIHRoYXQgdGhlIHBsYW50IGlzIHRoZSBzYW1lIG9uIHRoZSBsZWZ0IGFuZCByaWdodC4KKyAgICAgIGNvbnN0IGRvdWJsZSBmdmVsID0gRmlsdGVyVmVsb2NpdHkodGhyb3R0bGVfKTsKKworICAgICAgY29uc3QgZG91YmxlIHNpZ25fc3ZlbCA9IHdoZWVsXyAqICgoZnZlbCA+IDAuMCkgPyAxLjAgOiAtMS4wKTsKKyAgICAgIGRvdWJsZSBzdGVlcmluZ192ZWxvY2l0eTsKKyAgICAgIGlmIChxdWlja3R1cm5fKSB7CisgICAgICAgIHN0ZWVyaW5nX3ZlbG9jaXR5ID0gd2hlZWxfICogTWF4VmVsb2NpdHkoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZWVyaW5nX3ZlbG9jaXR5ID0gOjpzdGQ6OmFicyhmdmVsKSAqIHdoZWVsXzsKKyAgICAgIH0KKyAgICAgIGNvbnN0IGRvdWJsZSBsZWZ0X3ZlbG9jaXR5ID0gZnZlbCAtIHN0ZWVyaW5nX3ZlbG9jaXR5OworICAgICAgY29uc3QgZG91YmxlIHJpZ2h0X3ZlbG9jaXR5ID0gZnZlbCArIHN0ZWVyaW5nX3ZlbG9jaXR5OworICAgICAgTE9HKERFQlVHLCAibD0lZiByPSVmXG4iLCBsZWZ0X3ZlbG9jaXR5LCByaWdodF92ZWxvY2l0eSk7CisKKyAgICAgIC8vIEludGVncmF0ZSB2ZWxvY2l0eSB0byBnZXQgdGhlIHBvc2l0aW9uLgorICAgICAgLy8gVGhpcyBwb3NpdGlvbiBpcyB1c2VkIHRvIGdldCBpbnRlZ3JhbCBjb250cm9sLgorICAgICAgbG9vcF8tPm11dGFibGVfUigpIDw8IGxlZnRfdmVsb2NpdHksIHJpZ2h0X3ZlbG9jaXR5OworCisgICAgICBpZiAoIXF1aWNrdHVybl8pIHsKKyAgICAgICAgLy8gSyAqIFIgPSB3CisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBlcXVhbGl0eV9rOworICAgICAgICBlcXVhbGl0eV9rIDw8IDEgKyBzaWduX3N2ZWwsIC0oMSAtIHNpZ25fc3ZlbCk7CisgICAgICAgIGNvbnN0IGRvdWJsZSBlcXVhbGl0eV93ID0gMC4wOworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIGNvbnN0cmFpbnQgb24gUiBieSBtYW5pcHVsYXRpbmcgdGhlIGNvbnN0cmFpbnQgb24gVQorICAgICAgICA6OmFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwyPiBSX3BvbHkgPSA6OmFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwyPigKKyAgICAgICAgICAgIFVfUG9seV8uSCgpICogKGxvb3BfLT5LKCkgKyBGRiksCisgICAgICAgICAgICBVX1BvbHlfLmsoKSArIFVfUG9seV8uSCgpICogbG9vcF8tPksoKSAqIGxvb3BfLT5YX2hhdCgpKTsKKworICAgICAgICAvLyBMaW1pdCBSIGJhY2sgaW5zaWRlIHRoZSBib3guCisgICAgICAgIGxvb3BfLT5tdXRhYmxlX1IoKSA9CisgICAgICAgICAgICBDb2VyY2VHb2FsKFJfcG9seSwgZXF1YWxpdHlfaywgZXF1YWxpdHlfdywgbG9vcF8tPlIoKSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBGRl92b2x0cyA9IEZGICogbG9vcF8tPlIoKTsKKyAgICAgIGNvbnN0IEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX2lkZWFsID0KKyAgICAgICAgICBsb29wXy0+SygpICogKGxvb3BfLT5SKCkgLSBsb29wXy0+WF9oYXQoKSkgKyBGRl92b2x0czsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgbG9vcF8tPm11dGFibGVfVSgpW2ldID0gOjphb3M6OkNsaXAoVV9pZGVhbFtpXSwgLTEyLCAxMik7CisgICAgICB9CisKKyAgICAgIC8vIFRPRE8oYXVzdGluKTogTW9kZWwgdGhpcyBiZXR0ZXIuCisgICAgICAvLyBUT0RPKGF1c3Rpbik6IEZlZWQgYmFjaz8KKyAgICAgIGxvb3BfLT5tdXRhYmxlX1hfaGF0KCkgPQorICAgICAgICAgIGxvb3BfLT5BKCkgKiBsb29wXy0+WF9oYXQoKSArIGxvb3BfLT5CKCkgKiBsb29wXy0+VSgpOworI2lmIEhBVkVfU0hJRlRFUlMKKyAgICB9IGVsc2UgeworICAgICAgLy8gQW55IG1vdG9yIGlzIG5vdCBpbiBnZWFyLiAgU3BlZWQgbWF0Y2guCisgICAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBSX2xlZnQ7CisgICAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBSX3JpZ2h0OworICAgICAgUl9sZWZ0KDAsIDApID0gbGVmdF9tb3Rvcl9zcGVlZDsKKyAgICAgIFJfcmlnaHQoMCwgMCkgPSByaWdodF9tb3Rvcl9zcGVlZDsKKworICAgICAgY29uc3QgZG91YmxlIHdpZ2dsZSA9CisgICAgICAgICAgKHN0YXRpY19jYXN0PGRvdWJsZT4oKGNvdW50ZXJfICUgMjApIC8gMTApIC0gMC41KSAqIDUuMDsKKworICAgICAgbG9vcF8tPm11dGFibGVfVSgwLCAwKSA9IDo6YW9zOjpDbGlwKAorICAgICAgICAgIChSX2xlZnQgLyBLdikoMCwgMCkgKyAoSXNJbkdlYXIobGVmdF9nZWFyXykgPyAwIDogd2lnZ2xlKSwKKyAgICAgICAgICAtMTIuMCwgMTIuMCk7CisgICAgICBsb29wXy0+bXV0YWJsZV9VKDEsIDApID0gOjphb3M6OkNsaXAoCisgICAgICAgICAgKFJfcmlnaHQgLyBLdikoMCwgMCkgKyAoSXNJbkdlYXIocmlnaHRfZ2Vhcl8pID8gMCA6IHdpZ2dsZSksCisgICAgICAgICAgLTEyLjAsIDEyLjApOworICAgICAgbG9vcF8tPm11dGFibGVfVSgpICo9IDEyLjAgLyA6OmFvczo6cm9ib3Rfc3RhdGUtPnZvbHRhZ2VfYmF0dGVyeTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIHZvaWQgU2VuZE1vdG9ycyhEcml2ZXRyYWluUXVldWU6Ok91dHB1dCAqb3V0cHV0KSB7CisgICAgaWYgKG91dHB1dCAhPSBOVUxMKSB7CisgICAgICBvdXRwdXQtPmxlZnRfdm9sdGFnZSA9IGxvb3BfLT5VKDAsIDApOworICAgICAgb3V0cHV0LT5yaWdodF92b2x0YWdlID0gbG9vcF8tPlUoMSwgMCk7CisgICAgICBvdXRwdXQtPmxlZnRfaGlnaCA9IGxlZnRfZ2Vhcl8gPT0gSElHSCB8fCBsZWZ0X2dlYXJfID09IFNISUZUSU5HX1VQOworICAgICAgb3V0cHV0LT5yaWdodF9oaWdoID0gcmlnaHRfZ2Vhcl8gPT0gSElHSCB8fCByaWdodF9nZWFyXyA9PSBTSElGVElOR19VUDsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IFVfUG9seV87CisKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0xvb3A8MiwgMiwgMj4+IGxvb3BfOworCisgIGNvbnN0IGRvdWJsZSB0dHJ1c3RfOworICBkb3VibGUgd2hlZWxfOworICBkb3VibGUgdGhyb3R0bGVfOworICBib29sIHF1aWNrdHVybl87CisgIGludCBzdGFsZV9jb3VudF87CisgIGRvdWJsZSBwb3NpdGlvbl90aW1lX2RlbHRhXzsKKyAgR2VhciBsZWZ0X2dlYXJfOworICBHZWFyIHJpZ2h0X2dlYXJfOworICBEcml2ZXRyYWluUXVldWU6OlBvc2l0aW9uIGxhc3RfcG9zaXRpb25fOworICBEcml2ZXRyYWluUXVldWU6OlBvc2l0aW9uIHBvc2l0aW9uXzsKKyAgaW50IGNvdW50ZXJfOworfTsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46OmtTdGFsbFRvcnF1ZTsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46OmtTdGFsbEN1cnJlbnQ7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjprRnJlZVNwZWVkOworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6a0ZyZWVDdXJyZW50OworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6SjsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46Om07Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjpyYjsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46OmtXaGVlbFJhZGl1czsKK2NvbnN0ZXhwciBkb3VibGUgUG9seURyaXZldHJhaW46OmtSOworY29uc3RleHByIGRvdWJsZSBQb2x5RHJpdmV0cmFpbjo6S3Y7Citjb25zdGV4cHIgZG91YmxlIFBvbHlEcml2ZXRyYWluOjpLdDsKKworCit2b2lkIERyaXZldHJhaW5Mb29wOjpSdW5JdGVyYXRpb24oY29uc3QgRHJpdmV0cmFpblF1ZXVlOjpHb2FsICpnb2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERyaXZldHJhaW5RdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZldHJhaW5RdWV1ZTo6T3V0cHV0ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmV0cmFpblF1ZXVlOjpTdGF0dXMgKiBzdGF0dXMpIHsKKyAgLy8gVE9ETyhhc2NodWgpOiBUaGVzZSBzaG91bGQgYmUgbWVtYmVycyBvZiB0aGUgY2xhc3MuCisgIHN0YXRpYyBEcml2ZXRyYWluTW90b3JzU1MgZHRfY2xvc2VkbG9vcDsKKyAgc3RhdGljIFBvbHlEcml2ZXRyYWluIGR0X29wZW5sb29wOworCisgIGJvb2wgYmFkX3BvcyA9IGZhbHNlOworICBpZiAocG9zaXRpb24gPT0gbnVsbHB0cikgeworICAgIExPR19JTlRFUlZBTChub19wb3NpdGlvbl8pOworICAgIGJhZF9wb3MgPSB0cnVlOworICB9CisgIG5vX3Bvc2l0aW9uXy5QcmludCgpOworCisgIGJvb2wgY29udHJvbF9sb29wX2RyaXZpbmcgPSBmYWxzZTsKKyAgaWYgKGdvYWwpIHsKKyAgICBkb3VibGUgd2hlZWwgPSBnb2FsLT5zdGVlcmluZzsKKyAgICBkb3VibGUgdGhyb3R0bGUgPSBnb2FsLT50aHJvdHRsZTsKKyAgICBib29sIHF1aWNrdHVybiA9IGdvYWwtPnF1aWNrdHVybjsKKyNpZiBIQVZFX1NISUZURVJTCisgICAgYm9vbCBoaWdoZ2VhciA9IGdvYWwtPmhpZ2hnZWFyOworI2VuZGlmCisKKyAgICBjb250cm9sX2xvb3BfZHJpdmluZyA9IGdvYWwtPmNvbnRyb2xfbG9vcF9kcml2aW5nOworICAgIGRvdWJsZSBsZWZ0X2dvYWwgPSBnb2FsLT5sZWZ0X2dvYWw7CisgICAgZG91YmxlIHJpZ2h0X2dvYWwgPSBnb2FsLT5yaWdodF9nb2FsOworCisgICAgZHRfY2xvc2VkbG9vcC5TZXRHb2FsKGxlZnRfZ29hbCwgZ29hbC0+bGVmdF92ZWxvY2l0eV9nb2FsLCByaWdodF9nb2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnb2FsLT5yaWdodF92ZWxvY2l0eV9nb2FsKTsKKyNpZiBIQVZFX1NISUZURVJTCisgICAgZHRfb3Blbmxvb3AuU2V0R29hbCh3aGVlbCwgdGhyb3R0bGUsIHF1aWNrdHVybiwgaGlnaGdlYXIpOworI2Vsc2UKKyAgICBkdF9vcGVubG9vcC5TZXRHb2FsKHdoZWVsLCB0aHJvdHRsZSwgcXVpY2t0dXJuLCBmYWxzZSk7CisjZW5kaWYKKyAgfQorCisgIGlmICghYmFkX3BvcykgeworICAgIGNvbnN0IGRvdWJsZSBsZWZ0X2VuY29kZXIgPSBwb3NpdGlvbi0+bGVmdF9lbmNvZGVyOworICAgIGNvbnN0IGRvdWJsZSByaWdodF9lbmNvZGVyID0gcG9zaXRpb24tPnJpZ2h0X2VuY29kZXI7CisgICAgaWYgKGd5cm9fcmVhZGluZy5GZXRjaExhdGVzdCgpKSB7CisgICAgICBMT0dfU1RSVUNUKERFQlVHLCAidXNpbmciLCAqZ3lyb19yZWFkaW5nLmdldCgpKTsKKyAgICAgIGR0X2Nsb3NlZGxvb3AuU2V0UG9zaXRpb24obGVmdF9lbmNvZGVyLCByaWdodF9lbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneXJvX3JlYWRpbmctPmFuZ2xlKTsKKyAgICB9IGVsc2UgeworICAgICAgZHRfY2xvc2VkbG9vcC5TZXRSYXdQb3NpdGlvbihsZWZ0X2VuY29kZXIsIHJpZ2h0X2VuY29kZXIpOworICAgIH0KKyAgfQorICBkdF9vcGVubG9vcC5TZXRQb3NpdGlvbihwb3NpdGlvbik7CisgIGR0X29wZW5sb29wLlVwZGF0ZSgpOworCisgIGlmIChjb250cm9sX2xvb3BfZHJpdmluZykgeworICAgIGR0X2Nsb3NlZGxvb3AuVXBkYXRlKG91dHB1dCA9PSBOVUxMLCB0cnVlKTsKKyAgICBkdF9jbG9zZWRsb29wLlNlbmRNb3RvcnMob3V0cHV0KTsKKyAgfSBlbHNlIHsKKyAgICBkdF9vcGVubG9vcC5TZW5kTW90b3JzKG91dHB1dCk7CisgICAgaWYgKG91dHB1dCkgeworICAgICAgZHRfY2xvc2VkbG9vcC5TZXRFeHRlcm5hbE1vdG9ycyhvdXRwdXQtPmxlZnRfdm9sdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5yaWdodF92b2x0YWdlKTsKKyAgICB9CisgICAgZHRfY2xvc2VkbG9vcC5VcGRhdGUob3V0cHV0ID09IE5VTEwsIGZhbHNlKTsKKyAgfQorCisgIC8vIHNldCB0aGUgb3V0cHV0IHN0YXR1cyBvZiB0aGUgY29udHJvbCBsb29wIHN0YXRlCisgIGlmIChzdGF0dXMpIHsKKyAgICBib29sIGRvbmUgPSBmYWxzZTsKKyAgICBpZiAoZ29hbCkgeworICAgICAgZG9uZSA9ICgoOjpzdGQ6OmFicyhnb2FsLT5sZWZ0X2dvYWwgLQorICAgICAgICAgICAgICAgICAgICAgICAgICBkdF9jbG9zZWRsb29wLkdldEVzdGltYXRlZExlZnRFbmNvZGVyKCkpIDwKKyAgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZHJpdmV0cmFpbl9kb25lX2Rpc3RhbmNlKSAmJgorICAgICAgICAgICAgICAoOjpzdGQ6OmFicyhnb2FsLT5yaWdodF9nb2FsIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHRfY2xvc2VkbG9vcC5HZXRFc3RpbWF0ZWRSaWdodEVuY29kZXIoKSkgPAorICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5kcml2ZXRyYWluX2RvbmVfZGlzdGFuY2UpKTsKKyAgICB9CisgICAgc3RhdHVzLT5pc19kb25lID0gZG9uZTsKKyAgICBzdGF0dXMtPnJvYm90X3NwZWVkID0gZHRfY2xvc2VkbG9vcC5HZXRFc3RpbWF0ZWRSb2JvdFNwZWVkKCk7CisgICAgc3RhdHVzLT5maWx0ZXJlZF9sZWZ0X3Bvc2l0aW9uID0gZHRfY2xvc2VkbG9vcC5HZXRFc3RpbWF0ZWRMZWZ0RW5jb2RlcigpOworICAgIHN0YXR1cy0+ZmlsdGVyZWRfcmlnaHRfcG9zaXRpb24gPSBkdF9jbG9zZWRsb29wLkdldEVzdGltYXRlZFJpZ2h0RW5jb2RlcigpOworCisgICAgc3RhdHVzLT5maWx0ZXJlZF9sZWZ0X3ZlbG9jaXR5ID0gZHRfY2xvc2VkbG9vcC5sb29wKCkuWF9oYXQoMSwgMCk7CisgICAgc3RhdHVzLT5maWx0ZXJlZF9yaWdodF92ZWxvY2l0eSA9IGR0X2Nsb3NlZGxvb3AubG9vcCgpLlhfaGF0KDMsIDApOworICAgIHN0YXR1cy0+b3V0cHV0X3dhc19jYXBwZWQgPSBkdF9jbG9zZWRsb29wLk91dHB1dFdhc0NhcHBlZCgpOworICAgIHN0YXR1cy0+dW5jYXBwZWRfbGVmdF92b2x0YWdlID0gZHRfY2xvc2VkbG9vcC5sb29wKCkuVV91bmNhcHBlZCgwLCAwKTsKKyAgICBzdGF0dXMtPnVuY2FwcGVkX3JpZ2h0X3ZvbHRhZ2UgPSBkdF9jbG9zZWRsb29wLmxvb3AoKS5VX3VuY2FwcGVkKDEsIDApOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXAgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzMzI1OAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cApAQCAtMCwwICsxLDEwMyBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncmVwbGF5X2RyaXZldHJhaW4nLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnbm9fcnN5bmMnOiAxLAorICAgICAgfSwKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAncmVwbGF5X2RyaXZldHJhaW4uY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnJlcGxheV9jb250cm9sX2xvb3AnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RyaXZldHJhaW5fcXVldWUnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbJ2RyaXZldHJhaW4ucSddLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2hlYWRlcl9wYXRoJzogJ3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbicsCisgICAgICB9LAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3F1ZXVlcycsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi8uLi9hb3MvYnVpbGQvcXVldWVzLmd5cGknXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdwb2x5ZHJpdmV0cmFpbl9wbGFudHMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdwb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MnLAorICAgICAgICAnZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkcml2ZXRyYWluX2xpYicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2RyaXZldHJhaW4uY2MnLAorICAgICAgICAncG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgICAnPChERVBUSCkveTIwMTUveTIwMTUuZ3lwOmNvbnN0YW50cycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpwb2x5dG9wZScsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOmNvZXJjZV9nb2FsJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9xdWV1ZXMvcXVldWVzLmd5cDpneXJvJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vdXRpbC91dGlsLmd5cDpsb2dfaW50ZXJ2YWwnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOnF1ZXVlX2xvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuZ3lwOm1hdHJpeF9sb2dnaW5nJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnBvbHl0b3BlJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6Y29lcmNlX2dvYWwnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wJywKKyAgICAgICAgJ2RyaXZldHJhaW5fcXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkcml2ZXRyYWluX2xpYl90ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdkcml2ZXRyYWluX2xpYl90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChFWFRFUk5BTFMpOmd0ZXN0JywKKyAgICAgICAgJ2RyaXZldHJhaW5fcXVldWUnLAorICAgICAgICAnZHJpdmV0cmFpbl9saWInLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3Rlc3QnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvcXVldWVzL3F1ZXVlcy5neXA6Z3lybycsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6cXVldWVzJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZHJpdmV0cmFpbicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZHJpdmV0cmFpbl9tYWluLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICAgICdkcml2ZXRyYWluX2xpYicsCisgICAgICAgICdkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmggYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODc2OGUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgWTIwMTVfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX0hfCisjZGVmaW5lIFkyMDE1X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9IXworCisjaW5jbHVkZSAiRWlnZW4vRGVuc2UiCisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3BvbHl0b3BlLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3BvbHl0b3BlLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9sb2dfaW50ZXJ2YWwuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK2NsYXNzIERyaXZldHJhaW5Mb29wCisgICAgOiBwdWJsaWMgYW9zOjpjb250cm9sczo6Q29udHJvbExvb3A8Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlPiB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgY29udHJvbCBsb29wIHdoaWNoIGNhbiB0YWtlIGEgRHJpdmV0cmFpbiBvciBkZWZhdWx0cyB0byB0aGUKKyAgLy8gZHJpdmV0cmFpbiBhdCBmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW4KKyAgZXhwbGljaXQgRHJpdmV0cmFpbkxvb3AoY29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlICpteV9kcml2ZXRyYWluID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlKQorICAgICAgOiBhb3M6OmNvbnRyb2xzOjpDb250cm9sTG9vcDxjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU+KAorICAgICAgICAgICAgbXlfZHJpdmV0cmFpbikgeworICAgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDA+OjpJbml0KCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgLy8gRXhlY3V0ZXMgb25lIGN5Y2xlIG9mIHRoZSBjb250cm9sIGxvb3AuCisgIHZpcnR1YWwgdm9pZCBSdW5JdGVyYXRpb24oCisgICAgICBjb25zdCBjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWwgKmdvYWwsCisgICAgICBjb25zdCBjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OlBvc2l0aW9uICpwb3NpdGlvbiwKKyAgICAgIGNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6T3V0cHV0ICpvdXRwdXQsCisgICAgICBjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OlN0YXR1cyAqc3RhdHVzKTsKKworICB0eXBlZGVmIDo6YW9zOjp1dGlsOjpTaW1wbGVMb2dJbnRlcnZhbCBTaW1wbGVMb2dJbnRlcnZhbDsKKyAgU2ltcGxlTG9nSW50ZXJ2YWwgbm9fcG9zaXRpb25fID0gU2ltcGxlTG9nSW50ZXJ2YWwoCisgICAgICA6OmFvczo6dGltZTo6VGltZTo6SW5TZWNvbmRzKDAuMjUpLCBXQVJOSU5HLCAibm8gcG9zaXRpb24iKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTVfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX0hfCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xIGIveTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDJjNWIzCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIGZyYzk3MS5jb250cm9sX2xvb3BzOworCitpbXBvcnQgImFvcy9jb21tb24vY29udHJvbHMvY29udHJvbF9sb29wcy5xIjsKKworc3RydWN0IEdlYXJMb2dnaW5nIHsKKyAgaW50OF90IGNvbnRyb2xsZXJfaW5kZXg7CisgIGJvb2wgbGVmdF9sb29wX2hpZ2g7CisgIGJvb2wgcmlnaHRfbG9vcF9oaWdoOworICBpbnQ4X3QgbGVmdF9zdGF0ZTsKKyAgaW50OF90IHJpZ2h0X3N0YXRlOworfTsKKworc3RydWN0IENJTUxvZ2dpbmcgeworICBib29sIGxlZnRfaW5fZ2VhcjsKKyAgYm9vbCByaWdodF9pbl9nZWFyOworICBkb3VibGUgbGVmdF9tb3Rvcl9zcGVlZDsKKyAgZG91YmxlIHJpZ2h0X21vdG9yX3NwZWVkOworICBkb3VibGUgbGVmdF92ZWxvY2l0eTsKKyAgZG91YmxlIHJpZ2h0X3ZlbG9jaXR5OworfTsKKworcXVldWVfZ3JvdXAgRHJpdmV0cmFpblF1ZXVlIHsKKyAgaW1wbGVtZW50cyBhb3MuY29udHJvbF9sb29wcy5Db250cm9sTG9vcDsKKworICBtZXNzYWdlIEdvYWwgeworICAgIGRvdWJsZSBzdGVlcmluZzsKKyAgICBkb3VibGUgdGhyb3R0bGU7CisgICAgLy9ib29sIGhpZ2hnZWFyOworICAgIGJvb2wgcXVpY2t0dXJuOworICAgIGJvb2wgY29udHJvbF9sb29wX2RyaXZpbmc7CisgICAgZG91YmxlIGxlZnRfZ29hbDsKKyAgICBkb3VibGUgbGVmdF92ZWxvY2l0eV9nb2FsOworICAgIGRvdWJsZSByaWdodF9nb2FsOworICAgIGRvdWJsZSByaWdodF92ZWxvY2l0eV9nb2FsOworICB9OworCisgIG1lc3NhZ2UgUG9zaXRpb24geworICAgIGRvdWJsZSBsZWZ0X2VuY29kZXI7CisgICAgZG91YmxlIHJpZ2h0X2VuY29kZXI7CisgICAgLy9kb3VibGUgbGVmdF9zaGlmdGVyX3Bvc2l0aW9uOworICAgIC8vZG91YmxlIHJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb247CisgIH07CisKKyAgbWVzc2FnZSBPdXRwdXQgeworICAgIGRvdWJsZSBsZWZ0X3ZvbHRhZ2U7CisgICAgZG91YmxlIHJpZ2h0X3ZvbHRhZ2U7CisgICAgYm9vbCBsZWZ0X2hpZ2g7CisgICAgYm9vbCByaWdodF9oaWdoOworICB9OworCisgIG1lc3NhZ2UgU3RhdHVzIHsKKyAgICBkb3VibGUgcm9ib3Rfc3BlZWQ7CisgICAgZG91YmxlIGZpbHRlcmVkX2xlZnRfcG9zaXRpb247CisgICAgZG91YmxlIGZpbHRlcmVkX3JpZ2h0X3Bvc2l0aW9uOworICAgIGRvdWJsZSBmaWx0ZXJlZF9sZWZ0X3ZlbG9jaXR5OworICAgIGRvdWJsZSBmaWx0ZXJlZF9yaWdodF92ZWxvY2l0eTsKKworICAgIGRvdWJsZSB1bmNhcHBlZF9sZWZ0X3ZvbHRhZ2U7CisgICAgZG91YmxlIHVuY2FwcGVkX3JpZ2h0X3ZvbHRhZ2U7CisgICAgYm9vbCBvdXRwdXRfd2FzX2NhcHBlZDsKKworICAgIGJvb2wgaXNfZG9uZTsKKyAgfTsKKworICBxdWV1ZSBHb2FsIGdvYWw7CisgIHF1ZXVlIFBvc2l0aW9uIHBvc2l0aW9uOworICBxdWV1ZSBPdXRwdXQgb3V0cHV0OworICBxdWV1ZSBTdGF0dXMgc3RhdHVzOworfTsKKworcXVldWVfZ3JvdXAgRHJpdmV0cmFpblF1ZXVlIGRyaXZldHJhaW5fcXVldWU7CmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmNWE5YQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYwpAQCAtMCwwICsxLDEzMyBAQAorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluTG93TG93UGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBOworICBBIDw8IDEuMCwgMC4wMDQ5NDM0ODYxMjgyNCwgMC4wLCAxLjI0MDQ4NDU1NDA0ZS0wNSwgMC4wLCAwLjk3NzQ4NDA5MjcwMywgMC4wLCAwLjAwNDkyNDMzMjg0MDQ4LCAwLjAsIDEuMjQwNDg0NTU0MDRlLTA1LCAxLjAsIDAuMDA0OTQzNDg2MTI4MjQsIDAuMCwgMC4wMDQ5MjQzMzI4NDA0OCwgMC4wLCAwLjk3NzQ4NDA5MjcwMzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEI7CisgIEIgPDwgMi4wOTE4MDc1NjE3N2UtMDUsIC00LjU5MTUzNjM2MDQzZS0wNiwgMC4wMDgzMzQwNTAzMjc5NSwgLTAuMDAxODIyNjk1MjY5NzEsIC00LjU5MTUzNjM2MDQzZS0wNiwgMi4wOTE4MDc1NjE3N2UtMDUsIC0wLjAwMTgyMjY5NTI2OTcxLCAwLjAwODMzNDA1MDMyNzk1OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gQzsKKyAgQyA8PCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRDsKKyAgRCA8PCAwLCAwLCAwLCAwOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9tYXg7CisgIFVfbWF4IDw8IDEyLjAsIDEyLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21pbjsKKyAgVV9taW4gPDwgLTEyLjAsIC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEE7CisgIEEgPDwgMS4wLCAwLjAwNDk0MzQ4NjEyODI0LCAwLjAsIDEuMjQwNDg0NTU0MDRlLTA1LCAwLjAsIDAuOTc3NDg0MDkyNzAzLCAwLjAsIDAuMDA0OTI0MzMyODQwNDgsIDAuMCwgMS4yNDA0ODQ1NTQwNGUtMDUsIDEuMCwgMC4wMDQ5NDM0ODYxMjgyNCwgMC4wLCAwLjAwNDkyNDMzMjg0MDQ4LCAwLjAsIDAuOTc3NDg0MDkyNzAzOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gQjsKKyAgQiA8PCAyLjA5MTgwNzU2MTc3ZS0wNSwgLTQuNTkxNTM2MzYwNDNlLTA2LCAwLjAwODMzNDA1MDMyNzk1LCAtMC4wMDE4MjI2OTUyNjk3MSwgLTQuNTkxNTM2MzYwNDNlLTA2LCAyLjA5MTgwNzU2MTc3ZS0wNSwgLTAuMDAxODIyNjk1MjY5NzEsIDAuMDA4MzM0MDUwMzI3OTU7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA0PiBDOworICBDIDw8IDEsIDAsIDAsIDAsIDAsIDAsIDEsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAsIDAsIDAsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluSGlnaExvd1BsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQTsKKyAgQSA8PCAxLjAsIDAuMDA0OTQzNDg2MTI4MjQsIDAuMCwgMS4yNDA0ODQ1NTQwNGUtMDUsIDAuMCwgMC45Nzc0ODQwOTI3MDMsIDAuMCwgMC4wMDQ5MjQzMzI4NDA0OCwgMC4wLCAxLjI0MDQ4NDU1NDA0ZS0wNSwgMS4wLCAwLjAwNDk0MzQ4NjEyODI0LCAwLjAsIDAuMDA0OTI0MzMyODQwNDgsIDAuMCwgMC45Nzc0ODQwOTI3MDM7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBCOworICBCIDw8IDIuMDkxODA3NTYxNzdlLTA1LCAtNC41OTE1MzYzNjA0M2UtMDYsIDAuMDA4MzM0MDUwMzI3OTUsIC0wLjAwMTgyMjY5NTI2OTcxLCAtNC41OTE1MzYzNjA0M2UtMDYsIDIuMDkxODA3NTYxNzdlLTA1LCAtMC4wMDE4MjI2OTUyNjk3MSwgMC4wMDgzMzQwNTAzMjc5NTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEM7CisgIEMgPDwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMCwgMCwgMCwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoSGlnaFBsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQTsKKyAgQSA8PCAxLjAsIDAuMDA0OTQzNDg2MTI4MjQsIDAuMCwgMS4yNDA0ODQ1NTQwNGUtMDUsIDAuMCwgMC45Nzc0ODQwOTI3MDMsIDAuMCwgMC4wMDQ5MjQzMzI4NDA0OCwgMC4wLCAxLjI0MDQ4NDU1NDA0ZS0wNSwgMS4wLCAwLjAwNDk0MzQ4NjEyODI0LCAwLjAsIDAuMDA0OTI0MzMyODQwNDgsIDAuMCwgMC45Nzc0ODQwOTI3MDM7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBCOworICBCIDw8IDIuMDkxODA3NTYxNzdlLTA1LCAtNC41OTE1MzYzNjA0M2UtMDYsIDAuMDA4MzM0MDUwMzI3OTUsIC0wLjAwMTgyMjY5NTI2OTcxLCAtNC41OTE1MzYzNjA0M2UtMDYsIDIuMDkxODA3NTYxNzdlLTA1LCAtMC4wMDE4MjI2OTUyNjk3MSwgMC4wMDgzMzQwNTAzMjc5NTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEM7CisgIEMgPDwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMCwgMCwgMCwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0xvd0NvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBMOworICBMIDw8IDEuMjc3NDg0MDkyNywgMC4wMDQ5MjQzMzI4NDA0OCwgNzkuMTQ0MDQ1NjYyMiwgMS4wNTE1MDcyMjYzNiwgMC4wMDQ5MjQzMzI4NDA0OCwgMS4yNzc0ODQwOTI3LCAxLjA1MTUwNzIyNjM2LCA3OS4xNDQwNDU2NjIyOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gSzsKKyAgSyA8PCAxNjAuMTk2NzcyNDcsIDE1LjUzNTg0Njg5MzgsIDEuNjA0MDExOTQxMzksIDEuMzM4NjEyMTMwOTMsIDEuNjA0MDExOTQxNDIsIDEuMzM4NjEyMTMwOTQsIDE2MC4xOTY3NzI0NywgMTUuNTM1ODQ2ODkzODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEFfaW52OworICBBX2ludiA8PCAxLjAsIC0wLjAwNTA1NzQyMTUzMjU2LCAwLjAsIDEuMjc4NzUwMzY0NzJlLTA1LCAwLjAsIDEuMDIzMDYwNTE1NDIsIDAuMCwgLTAuMDA1MTUzOTM2MDM5OTgsIDAuMCwgMS4yNzg3NTAzNjQ3MmUtMDUsIDEuMCwgLTAuMDA1MDU3NDIxNTMyNTYsIDAuMCwgLTAuMDA1MTUzOTM2MDM5OTgsIDAuMCwgMS4wMjMwNjA1MTU0MjsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KEwsIEssIEFfaW52LCBNYWtlRHJpdmV0cmFpbkxvd0xvd1BsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0hpZ2hDb250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gTDsKKyAgTCA8PCAxLjI3NzQ4NDA5MjcsIDAuMDA0OTI0MzMyODQwNDgsIDc5LjE0NDA0NTY2MjIsIDEuMDUxNTA3MjI2MzYsIDAuMDA0OTI0MzMyODQwNDgsIDEuMjc3NDg0MDkyNywgMS4wNTE1MDcyMjYzNiwgNzkuMTQ0MDQ1NjYyMjsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEs7CisgIEsgPDwgMTYwLjE5Njc3MjQ3LCAxNS41MzU4NDY4OTM4LCAxLjYwNDAxMTk0MTM5LCAxLjMzODYxMjEzMDkzLCAxLjYwNDAxMTk0MTQyLCAxLjMzODYxMjEzMDk0LCAxNjAuMTk2NzcyNDcsIDE1LjUzNTg0Njg5Mzg7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBX2ludjsKKyAgQV9pbnYgPDwgMS4wLCAtMC4wMDUwNTc0MjE1MzI1NiwgMC4wLCAxLjI3ODc1MDM2NDcyZS0wNSwgMC4wLCAxLjAyMzA2MDUxNTQyLCAwLjAsIC0wLjAwNTE1MzkzNjAzOTk4LCAwLjAsIDEuMjc4NzUwMzY0NzJlLTA1LCAxLjAsIC0wLjAwNTA1NzQyMTUzMjU2LCAwLjAsIC0wLjAwNTE1MzkzNjAzOTk4LCAwLjAsIDEuMDIzMDYwNTE1NDI7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluSGlnaExvd0NvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBMOworICBMIDw8IDEuMjc3NDg0MDkyNywgMC4wMDQ5MjQzMzI4NDA0OCwgNzkuMTQ0MDQ1NjYyMiwgMS4wNTE1MDcyMjYzNiwgMC4wMDQ5MjQzMzI4NDA0OCwgMS4yNzc0ODQwOTI3LCAxLjA1MTUwNzIyNjM2LCA3OS4xNDQwNDU2NjIyOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gSzsKKyAgSyA8PCAxNjAuMTk2NzcyNDcsIDE1LjUzNTg0Njg5MzgsIDEuNjA0MDExOTQxMzksIDEuMzM4NjEyMTMwOTMsIDEuNjA0MDExOTQxNDIsIDEuMzM4NjEyMTMwOTQsIDE2MC4xOTY3NzI0NywgMTUuNTM1ODQ2ODkzODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEFfaW52OworICBBX2ludiA8PCAxLjAsIC0wLjAwNTA1NzQyMTUzMjU2LCAwLjAsIDEuMjc4NzUwMzY0NzJlLTA1LCAwLjAsIDEuMDIzMDYwNTE1NDIsIDAuMCwgLTAuMDA1MTUzOTM2MDM5OTgsIDAuMCwgMS4yNzg3NTAzNjQ3MmUtMDUsIDEuMCwgLTAuMDA1MDU3NDIxNTMyNTYsIDAuMCwgLTAuMDA1MTUzOTM2MDM5OTgsIDAuMCwgMS4wMjMwNjA1MTU0MjsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KEwsIEssIEFfaW52LCBNYWtlRHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoSGlnaENvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBMOworICBMIDw8IDEuMjc3NDg0MDkyNywgMC4wMDQ5MjQzMzI4NDA0OCwgNzkuMTQ0MDQ1NjYyMiwgMS4wNTE1MDcyMjYzNiwgMC4wMDQ5MjQzMzI4NDA0OCwgMS4yNzc0ODQwOTI3LCAxLjA1MTUwNzIyNjM2LCA3OS4xNDQwNDU2NjIyOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gSzsKKyAgSyA8PCAxNjAuMTk2NzcyNDcsIDE1LjUzNTg0Njg5MzgsIDEuNjA0MDExOTQxMzksIDEuMzM4NjEyMTMwOTMsIDEuNjA0MDExOTQxNDIsIDEuMzM4NjEyMTMwOTQsIDE2MC4xOTY3NzI0NywgMTUuNTM1ODQ2ODkzODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDQ+IEFfaW52OworICBBX2ludiA8PCAxLjAsIC0wLjAwNTA1NzQyMTUzMjU2LCAwLjAsIDEuMjc4NzUwMzY0NzJlLTA1LCAwLjAsIDEuMDIzMDYwNTE1NDIsIDAuMCwgLTAuMDA1MTUzOTM2MDM5OTgsIDAuMCwgMS4yNzg3NTAzNjQ3MmUtMDUsIDEuMCwgLTAuMDA1MDU3NDIxNTMyNTYsIDAuMCwgLTAuMDA1MTUzOTM2MDM5OTgsIDAuMCwgMS4wMjMwNjA1MTU0MjsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KEwsIEssIEFfaW52LCBNYWtlRHJpdmV0cmFpbkhpZ2hIaWdoUGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tQbGFudDw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpblBsYW50KCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4+PiBwbGFudHMoNCk7CisgIHBsYW50c1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkxvd0xvd1BsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcGxhbnRzWzFdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluTG93SGlnaFBsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcGxhbnRzWzJdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluSGlnaExvd1BsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcGxhbnRzWzNdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluSGlnaEhpZ2hQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4oJnBsYW50cyk7Cit9CisKK1N0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluTG9vcCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+PiBjb250cm9sbGVycyg0KTsKKyAgY29udHJvbGxlcnNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluTG93TG93Q29udHJvbGxlcigpKSk7CisgIGNvbnRyb2xsZXJzWzFdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihNYWtlRHJpdmV0cmFpbkxvd0hpZ2hDb250cm9sbGVyKCkpKTsKKyAgY29udHJvbGxlcnNbMl0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluSGlnaExvd0NvbnRyb2xsZXIoKSkpOworICBjb250cm9sbGVyc1szXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4oTWFrZURyaXZldHJhaW5IaWdoSGlnaENvbnRyb2xsZXIoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja0xvb3A8NCwgMiwgMj4oJmNvbnRyb2xsZXJzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIGIveTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4NDhiZQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgWTIwMTVfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX0RSSVZFVFJBSU5fRE9HX01PVE9SX1BMQU5UX0hfCisjZGVmaW5lIFkyMDE1X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9EUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXworCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluTG93TG93UGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb3dMb3dDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkxvd0hpZ2hDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkhpZ2hMb3dDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlRHJpdmV0cmFpbkhpZ2hIaWdoUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5IaWdoSGlnaENvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+IE1ha2VEcml2ZXRyYWluUGxhbnQoKTsKKworU3RhdGVGZWVkYmFja0xvb3A8NCwgMiwgMj4gTWFrZURyaXZldHJhaW5Mb29wKCk7CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKKyNlbmRpZiAgLy8gWTIwMTVfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX0RSSVZFVFJBSU5fRE9HX01PVE9SX1BMQU5UX0hfCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9saWJfdGVzdC5jYyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2xpYl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODY5YWEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9saWJfdGVzdC5jYwpAQCAtMCwwICsxLDI5NyBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL25ldHdvcmsvdGVhbV9udW1iZXIuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vY29udHJvbHMvcG9seXRvcGUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcF90ZXN0LmgiCisKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4uaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29lcmNlX2dvYWwuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaCIKKyNpbmNsdWRlICJmcmM5NzEvcXVldWVzL2d5cm8ucS5oIgorCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkVudmlyb25tZW50KCkge30KKyAgLy8gaG93IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBhb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8MD46OkluaXQoKTsKKyAgfQorfTsKKzo6dGVzdGluZzo6RW52aXJvbm1lbnQqIGNvbnN0IGhvbGRlcl9lbnYgPQorICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRW52aXJvbm1lbnQpOworCitjbGFzcyBUZWFtTnVtYmVyRW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgcHVibGljOgorICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudC4KKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyBhb3M6Om5ldHdvcms6Ok92ZXJyaWRlVGVhbU51bWJlcig5NzEpOyB9Cit9OworCis6OnRlc3Rpbmc6OkVudmlyb25tZW50KiBjb25zdCB0ZWFtX251bWJlcl9lbnYgPQorICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBUZWFtTnVtYmVyRW52aXJvbm1lbnQpOworCisvLyBDbGFzcyB3aGljaCBzaW11bGF0ZXMgdGhlIGRyaXZldHJhaW4gYW5kIHNlbmRzIG91dCBxdWV1ZSBtZXNzYWdlcyBjb250YWluaW5nCisvLyB0aGUgcG9zaXRpb24uCitjbGFzcyBEcml2ZXRyYWluU2ltdWxhdGlvbiB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgbW90b3Igc2ltdWxhdGlvbi4KKyAgLy8gVE9ETyhhc2NodWgpIERvIHdlIHdhbnQgdG8gdGVzdCB0aGUgY2x1dGNoIG9uZSB0b28/CisgIERyaXZldHJhaW5TaW11bGF0aW9uKCkKKyAgICAgIDogZHJpdmV0cmFpbl9wbGFudF8oCisgICAgICAgICAgICBuZXcgU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+KE1ha2VEcml2ZXRyYWluUGxhbnQoKSkpLAorICAgICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXygiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAweDhhOGRkZTc3LCAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4uZ29hbCIsCisgICAgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5wb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5vdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4uc3RhdHVzIikgeworICAgIFJlaW5pdGlhbGl6ZSgpOworICB9CisKKyAgLy8gUmVzZXRzIHRoZSBwbGFudC4KKyAgdm9pZCBSZWluaXRpYWxpemUoKSB7CisgICAgZHJpdmV0cmFpbl9wbGFudF8tPm11dGFibGVfWCgwLCAwKSA9IDAuMDsKKyAgICBkcml2ZXRyYWluX3BsYW50Xy0+bXV0YWJsZV9YKDEsIDApID0gMC4wOworICAgIGRyaXZldHJhaW5fcGxhbnRfLT5tdXRhYmxlX1koKSA9CisgICAgICAgIGRyaXZldHJhaW5fcGxhbnRfLT5DKCkgKiBkcml2ZXRyYWluX3BsYW50Xy0+WCgpOworICAgIGxhc3RfbGVmdF9wb3NpdGlvbl8gPSBkcml2ZXRyYWluX3BsYW50Xy0+WSgwLCAwKTsKKyAgICBsYXN0X3JpZ2h0X3Bvc2l0aW9uXyA9IGRyaXZldHJhaW5fcGxhbnRfLT5ZKDEsIDApOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGRyaXZldHJhaW4uCisgIGRvdWJsZSBHZXRMZWZ0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBkcml2ZXRyYWluX3BsYW50Xy0+WSgwLCAwKTsgfQorICBkb3VibGUgR2V0UmlnaHRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIGRyaXZldHJhaW5fcGxhbnRfLT5ZKDEsIDApOyB9CisKKyAgLy8gU2VuZHMgb3V0IHRoZSBwb3NpdGlvbiBxdWV1ZSBtZXNzYWdlcy4KKyAgdm9pZCBTZW5kUG9zaXRpb25NZXNzYWdlKCkgeworICAgIGNvbnN0IGRvdWJsZSBsZWZ0X2VuY29kZXIgPSBHZXRMZWZ0UG9zaXRpb24oKTsKKyAgICBjb25zdCBkb3VibGUgcmlnaHRfZW5jb2RlciA9IEdldFJpZ2h0UG9zaXRpb24oKTsKKworICAgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPGNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6UG9zaXRpb24+IHBvc2l0aW9uID0KKyAgICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8ucG9zaXRpb24uTWFrZU1lc3NhZ2UoKTsKKyAgICBwb3NpdGlvbi0+bGVmdF9lbmNvZGVyID0gbGVmdF9lbmNvZGVyOworICAgIHBvc2l0aW9uLT5yaWdodF9lbmNvZGVyID0gcmlnaHRfZW5jb2RlcjsKKyAgICBwb3NpdGlvbi5TZW5kKCk7CisgIH0KKworICAvLyBTaW11bGF0ZXMgdGhlIGRyaXZldHJhaW4gbW92aW5nIGZvciBvbmUgdGltZXN0ZXAuCisgIHZvaWQgU2ltdWxhdGUoKSB7CisgICAgbGFzdF9sZWZ0X3Bvc2l0aW9uXyA9IGRyaXZldHJhaW5fcGxhbnRfLT5ZKDAsIDApOworICAgIGxhc3RfcmlnaHRfcG9zaXRpb25fID0gZHJpdmV0cmFpbl9wbGFudF8tPlkoMSwgMCk7CisgICAgRVhQRUNUX1RSVUUobXlfZHJpdmV0cmFpbl9xdWV1ZV8ub3V0cHV0LkZldGNoTGF0ZXN0KCkpOworICAgIGRyaXZldHJhaW5fcGxhbnRfLT5tdXRhYmxlX1UoKSA8PCBteV9kcml2ZXRyYWluX3F1ZXVlXy5vdXRwdXQtPmxlZnRfdm9sdGFnZSwKKyAgICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8ub3V0cHV0LT5yaWdodF92b2x0YWdlOworICAgIGRyaXZldHJhaW5fcGxhbnRfLT5VcGRhdGUoKTsKKyAgfQorCisgIDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudDw0LCAyLCAyPj4gZHJpdmV0cmFpbl9wbGFudF87CisgcHJpdmF0ZToKKyAgRHJpdmV0cmFpblF1ZXVlIG15X2RyaXZldHJhaW5fcXVldWVfOworICBkb3VibGUgbGFzdF9sZWZ0X3Bvc2l0aW9uXzsKKyAgZG91YmxlIGxhc3RfcmlnaHRfcG9zaXRpb25fOworfTsKKworY2xhc3MgRHJpdmV0cmFpblRlc3QgOiBwdWJsaWMgOjphb3M6OnRlc3Rpbmc6OkNvbnRyb2xMb29wVGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QgcXVldWUgc28gdGhhdCBpdCBpbnZhbGlkYXRlcyB0aGUgcXVldWUKKyAgLy8gdGhhdCBpdCBwb2ludHMgdG8uICBPdGhlcndpc2UsIHdlIHdpbGwgaGF2ZSBhIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSB0aGF0CisgIC8vIGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgRHJpdmV0cmFpblF1ZXVlIG15X2RyaXZldHJhaW5fcXVldWVfOworCisgIC8vIENyZWF0ZSBhIGxvb3AgYW5kIHNpbXVsYXRpb24gcGxhbnQuCisgIERyaXZldHJhaW5Mb29wIGRyaXZldHJhaW5fbW90b3JfOworICBEcml2ZXRyYWluU2ltdWxhdGlvbiBkcml2ZXRyYWluX21vdG9yX3BsYW50XzsKKworICBEcml2ZXRyYWluVGVzdCgpIDogbXlfZHJpdmV0cmFpbl9xdWV1ZV8oIi5mcmM5NzEuY29udHJvbF9sb29wcy5kcml2ZXRyYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhhOGRkZTc3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5nb2FsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmRyaXZldHJhaW4ucG9zaXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5vdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZHJpdmV0cmFpbi5zdGF0dXMiKSwKKyAgICAgICAgICAgICAgICBkcml2ZXRyYWluX21vdG9yXygmbXlfZHJpdmV0cmFpbl9xdWV1ZV8pLAorICAgICAgICAgICAgICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfKCkgeworICAgIDo6ZnJjOTcxOjpzZW5zb3JzOjpneXJvX3JlYWRpbmcuQ2xlYXIoKTsKKyAgfQorCisgIHZvaWQgVmVyaWZ5TmVhckdvYWwoKSB7CisgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5GZXRjaExhdGVzdCgpOworICAgIG15X2RyaXZldHJhaW5fcXVldWVfLnBvc2l0aW9uLkZldGNoTGF0ZXN0KCk7CisgICAgRVhQRUNUX05FQVIobXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC0+bGVmdF9nb2FsLAorICAgICAgICAgICAgICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLkdldExlZnRQb3NpdGlvbigpLAorICAgICAgICAgICAgICAgIDFlLTIpOworICAgIEVYUEVDVF9ORUFSKG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwtPnJpZ2h0X2dvYWwsCisgICAgICAgICAgICAgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uR2V0UmlnaHRQb3NpdGlvbigpLAorICAgICAgICAgICAgICAgIDFlLTIpOworICB9CisKKyAgdmlydHVhbCB+RHJpdmV0cmFpblRlc3QoKSB7CisgICAgOjpmcmM5NzE6OnNlbnNvcnM6Omd5cm9fcmVhZGluZy5DbGVhcigpOworICB9Cit9OworCisvLyBUZXN0cyB0aGF0IHRoZSBkcml2ZXRyYWluIGNvbnZlcmdlcyBvbiBhIGdvYWwuCitURVNUX0YoRHJpdmV0cmFpblRlc3QsIENvbnZlcmdlc0NvcnJlY3RseSkgeworICBteV9kcml2ZXRyYWluX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLmNvbnRyb2xfbG9vcF9kcml2aW5nKHRydWUpCisgICAgICAubGVmdF9nb2FsKC0xLjApCisgICAgICAucmlnaHRfZ29hbCgxLjApLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7ICsraSkgeworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBkcml2ZXRyYWluX21vdG9yXy5JdGVyYXRlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICB9CisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgaXQgc3Vydml2ZXMgZGlzYWJsaW5nLgorVEVTVF9GKERyaXZldHJhaW5UZXN0LCBTdXJ2aXZlc0Rpc2FibGluZykgeworICBteV9kcml2ZXRyYWluX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLmNvbnRyb2xfbG9vcF9kcml2aW5nKHRydWUpCisgICAgICAubGVmdF9nb2FsKC0xLjApCisgICAgICAucmlnaHRfZ29hbCgxLjApLlNlbmQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7ICsraSkgeworICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBkcml2ZXRyYWluX21vdG9yXy5JdGVyYXRlKCk7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBpZiAoaSA+IDIwICYmIGkgPCAyMDApIHsKKyAgICAgIFNpbXVsYXRlVGltZXN0ZXAoZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICBTaW11bGF0ZVRpbWVzdGVwKHRydWUpOworICAgIH0KKyAgfQorICBWZXJpZnlOZWFyR29hbCgpOworfQorCisvLyBUZXN0cyB0aGF0IG5ldmVyIGhhdmluZyBhIGdvYWwgZG9lc24ndCBicmVhay4KK1RFU1RfRihEcml2ZXRyYWluVGVzdCwgTm9Hb2FsU3RhcnQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIGRyaXZldHJhaW5fbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICB9Cit9CisKKy8vIFRlc3RzIHRoYXQgbmV2ZXIgaGF2aW5nIGEgZ29hbCwgYnV0IGhhdmluZyBkcml2ZXIncyBzdGF0aW9uIG1lc3NhZ2VzLCBkb2Vzbid0CisvLyBicmVhay4KK1RFU1RfRihEcml2ZXRyYWluVGVzdCwgTm9Hb2FsV2l0aFJvYm90U3RhdGUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIGRyaXZldHJhaW5fbW90b3JfLkl0ZXJhdGUoKTsKKyAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFNpbXVsYXRlVGltZXN0ZXAodHJ1ZSk7CisgIH0KK30KKworOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gTWFrZUJveChkb3VibGUgeDFfbWluLCBkb3VibGUgeDFfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeDJfbWluLCBkb3VibGUgeDJfbWF4KSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBib3hfSDsKKyAgYm94X0ggPDwgLypbWyovIDEuMCwgMC4wIC8qXSovLAorICAgICAgICAgICAgLypbKi8tMS4wLCAwLjAgLypdKi8sCisgICAgICAgICAgICAvKlsqLyAwLjAsIDEuMCAvKl0qLywKKyAgICAgICAgICAgIC8qWyovIDAuMCwtMS4wIC8qXV0qLzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDE+IGJveF9rOworICBib3hfayA8PCAvKltbKi8geDFfbWF4IC8qXSovLAorICAgICAgICAgICAgLypbKi8teDFfbWluIC8qXSovLAorICAgICAgICAgICAgLypbKi8geDJfbWF4IC8qXSovLAorICAgICAgICAgICAgLypbKi8teDJfbWluIC8qXV0qLzsKKyAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gdF9wb2x5KGJveF9ILCBib3hfayk7CisgIHJldHVybiB0X3BvbHk7Cit9CisKK2NsYXNzIENvZXJjZUdvYWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCit9OworCisvLyBXSE9PT0hIIQorVEVTVF9GKENvZXJjZUdvYWxUZXN0LCBJbnNpZGUpIHsKKyAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gYm94ID0gTWFrZUJveCgxLCAyLCAxLCAyKTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gSzsKKyAgSyA8PCAvKltbKi8gMSwgLTEgLypdXSovOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBSOworICBSIDw8IC8qW1sqLyAxLjUsIDEuNSAvKl1dKi87CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IG91dHB1dCA9CisgICAgICA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6Q29lcmNlR29hbChib3gsIEssIDAsIFIpOworCisgIEVYUEVDVF9FUShSKDAsIDApLCBvdXRwdXQoMCwgMCkpOworICBFWFBFQ1RfRVEoUigxLCAwKSwgb3V0cHV0KDEsIDApKTsKK30KKworVEVTVF9GKENvZXJjZUdvYWxUZXN0LCBPdXRzaWRlX0luc2lkZV9JbnRlcnNlY3QpIHsKKyAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gYm94ID0gTWFrZUJveCgxLCAyLCAxLCAyKTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gSzsKKyAgSyA8PCAxLCAtMTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gUjsKKyAgUiA8PCA1LCA1OworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBvdXRwdXQgPQorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkNvZXJjZUdvYWwoYm94LCBLLCAwLCBSKTsKKworICBFWFBFQ1RfRVEoMi4wLCBvdXRwdXQoMCwgMCkpOworICBFWFBFQ1RfRVEoMi4wLCBvdXRwdXQoMSwgMCkpOworfQorCitURVNUX0YoQ29lcmNlR29hbFRlc3QsIE91dHNpZGVfSW5zaWRlX25vX0ludGVyc2VjdCkgeworICA6OmFvczo6Y29udHJvbHM6OkhQb2x5dG9wZTwyPiBib3ggPSBNYWtlQm94KDMsIDQsIDEsIDIpOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAyPiBLOworICBLIDw8IDEsIC0xOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBSOworICBSIDw8IDUsIDU7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IG91dHB1dCA9CisgICAgICA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6Q29lcmNlR29hbChib3gsIEssIDAsIFIpOworCisgIEVYUEVDVF9FUSgzLjAsIG91dHB1dCgwLCAwKSk7CisgIEVYUEVDVF9FUSgyLjAsIG91dHB1dCgxLCAwKSk7Cit9CisKK1RFU1RfRihDb2VyY2VHb2FsVGVzdCwgTWlkZGxlX09mX0VkZ2UpIHsKKyAgOjphb3M6OmNvbnRyb2xzOjpIUG9seXRvcGU8Mj4gYm94ID0gTWFrZUJveCgwLCA0LCAxLCAyKTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMj4gSzsKKyAgSyA8PCAtMSwgMTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gUjsKKyAgUiA8PCA1LCA1OworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBvdXRwdXQgPQorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkNvZXJjZUdvYWwoYm94LCBLLCAwLCBSKTsKKworICBFWFBFQ1RfRVEoMi4wLCBvdXRwdXQoMCwgMCkpOworICBFWFBFQ1RfRVEoMi4wLCBvdXRwdXQoMSwgMCkpOworfQorCitURVNUX0YoQ29lcmNlR29hbFRlc3QsIFBlcnBlbmRpY3VsYXJMaW5lKSB7CisgIDo6YW9zOjpjb250cm9sczo6SFBvbHl0b3BlPDI+IGJveCA9IE1ha2VCb3goMSwgMiwgMSwgMik7CisKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDI+IEs7CisgIEsgPDwgMSwgMTsKKworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gUjsKKyAgUiA8PCA1LCA1OworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBvdXRwdXQgPQorICAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkNvZXJjZUdvYWwoYm94LCBLLCAwLCBSKTsKKworICBFWFBFQ1RfRVEoMS4wLCBvdXRwdXQoMCwgMCkpOworICBFWFBFQ1RfRVEoMS4wLCBvdXRwdXQoMSwgMCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX21haW4uY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTUwZjMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9tYWluLmNjCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5oIgorCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorCitpbnQgbWFpbigpIHsKKyAgOjphb3M6OkluaXQoKTsKKyAgZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluTG9vcCBkcml2ZXRyYWluOworICBkcml2ZXRyYWluLlJ1bigpOworICA6OmFvczo6Q2xlYW51cCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jaW1fcGxhbnQuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZWJiNTkKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjCkBAIC0wLDAgKzEsNDkgQEAKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MSwgMSwgMT4gTWFrZUNJTVBsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gQTsKKyAgQSA8PCAwLjc4MzkyNDQ3MzU0NDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEI7CisgIEIgPDwgOC45NDk3OTU4Njk3MzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEM7CisgIEMgPDwgMTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEQ7CisgIEQgPDwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDEsIDEsIDE+KEEsIEIsIEMsIEQsIFVfbWF4LCBVX21pbik7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDEsIDEsIDE+IE1ha2VDSU1Db250cm9sbGVyKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gTDsKKyAgTCA8PCAwLjc3MzkyNDQ3MzU0NDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE+IEs7CisgIEsgPDwgMC4wODY0NzM5ODA1MDM7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBBX2ludjsKKyAgQV9pbnYgPDwgMS4yNzU2MzMwOTE5OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MSwgMSwgMT4oTCwgSywgQV9pbnYsIE1ha2VDSU1QbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50PDEsIDEsIDE+IE1ha2VDSU1QbGFudCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDEsIDEsIDE+Pj4gcGxhbnRzKDEpOworICBwbGFudHNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MSwgMSwgMT4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MSwgMSwgMT4oTWFrZUNJTVBsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudDwxLCAxLCAxPigmcGxhbnRzKTsKK30KKworU3RhdGVGZWVkYmFja0xvb3A8MSwgMSwgMT4gTWFrZUNJTUxvb3AoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDEsIDEsIDE+Pj4gY29udHJvbGxlcnMoMSk7CisgIGNvbnRyb2xsZXJzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MSwgMSwgMT4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwxLCAxLCAxPihNYWtlQ0lNQ29udHJvbGxlcigpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrTG9vcDwxLCAxLCAxPigmY29udHJvbGxlcnMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5oIGIveTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2NpbV9wbGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDQ1YTcKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBZMjAxNV9DT05UUk9MX0xPT1BTX0RSSVZFVFJBSU5fUE9MWURSSVZFVFJBSU5fQ0lNX1BMQU5UX0hfCisjZGVmaW5lIFkyMDE1X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9DSU1fUExBTlRfSF8KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwxLCAxLCAxPiBNYWtlQ0lNUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MSwgMSwgMT4gTWFrZUNJTUNvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDEsIDEsIDE+IE1ha2VDSU1QbGFudCgpOworCitTdGF0ZUZlZWRiYWNrTG9vcDwxLCAxLCAxPiBNYWtlQ0lNTG9vcCgpOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE1X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9DSU1fUExBTlRfSF8KZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTk5MWMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmNjCkBAIC0wLDAgKzEsMTMzIEBACisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEE7CisgIEEgPDwgMC45NTU0OTk0MDA1NDEsIDAuMDA5NjI2OTE0MDM3NDksIDAuMDA5NjI2OTE0MDM3NDksIDAuOTU1NDk5NDAwNTQxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQjsKKyAgQiA8PCAwLjAxNjQ3MTQ3NjM5MzEsIC0wLjAwMzU2MzMxMTI2Mzk3LCAtMC4wMDM1NjMzMTEyNjM5NywgMC4wMTY0NzE0NzYzOTMxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQzsKKyAgQyA8PCAxLjAsIDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAuMCwgMC4wLCAwLjAsIDAuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEE7CisgIEEgPDwgMC45NTU0OTk0MDA1NDEsIDAuMDA5NjI2OTE0MDM3NDksIDAuMDA5NjI2OTE0MDM3NDksIDAuOTU1NDk5NDAwNTQxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQjsKKyAgQiA8PCAwLjAxNjQ3MTQ3NjM5MzEsIC0wLjAwMzU2MzMxMTI2Mzk3LCAtMC4wMDM1NjMzMTEyNjM5NywgMC4wMTY0NzE0NzYzOTMxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQzsKKyAgQyA8PCAxLjAsIDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAuMCwgMC4wLCAwLjAsIDAuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEE7CisgIEEgPDwgMC45NTU0OTk0MDA1NDEsIDAuMDA5NjI2OTE0MDM3NDksIDAuMDA5NjI2OTE0MDM3NDksIDAuOTU1NDk5NDAwNTQxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQjsKKyAgQiA8PCAwLjAxNjQ3MTQ3NjM5MzEsIC0wLjAwMzU2MzMxMTI2Mzk3LCAtMC4wMDM1NjMzMTEyNjM5NywgMC4wMTY0NzE0NzYzOTMxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQzsKKyAgQyA8PCAxLjAsIDAuMCwgMC4wLCAxLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAuMCwgMC4wLCAwLjAsIDAuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hIaWdoUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBBOworICBBIDw8IDAuOTU1NDk5NDAwNTQxLCAwLjAwOTYyNjkxNDAzNzQ5LCAwLjAwOTYyNjkxNDAzNzQ5LCAwLjk1NTQ5OTQwMDU0MTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEI7CisgIEIgPDwgMC4wMTY0NzE0NzYzOTMxLCAtMC4wMDM1NjMzMTEyNjM5NywgLTAuMDAzNTYzMzExMjYzOTcsIDAuMDE2NDcxNDc2MzkzMTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEM7CisgIEMgPDwgMS4wLCAwLjAsIDAuMCwgMS4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gRDsKKyAgRCA8PCAwLjAsIDAuMCwgMC4wLCAwLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0xvd0NvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBMOworICBMIDw8IDAuOTM1NDk5NDAwNTQxLCAwLjAwOTYyNjkxNDAzNzQ5LCAwLjAwOTYyNjkxNDAzNzQ5LCAwLjkzNTQ5OTQwMDU0MTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEs7CisgIEsgPDwgMjIuNzc1MDI4ODU3MywgNS41MTE0MzI1MzU1NiwgNS41MTE0MzI1MzU1NiwgMjIuNzc1MDI4ODU3MzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEFfaW52OworICBBX2ludiA8PCAxLjA0NjY3OTM4MTI3LCAtMC4wMTA1NDU1NzY5MjMsIC0wLjAxMDU0NTU3NjkyMywgMS4wNDY2NzkzODEyNzsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+KEwsIEssIEFfaW52LCBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93TG93UGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dIaWdoQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEw7CisgIEwgPDwgMC45MzU0OTk0MDA1NDEsIDAuMDA5NjI2OTE0MDM3NDksIDAuMDA5NjI2OTE0MDM3NDksIDAuOTM1NDk5NDAwNTQxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gSzsKKyAgSyA8PCAyMi43NzUwMjg4NTczLCA1LjUxMTQzMjUzNTU2LCA1LjUxMTQzMjUzNTU2LCAyMi43NzUwMjg4NTczOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQV9pbnY7CisgIEFfaW52IDw8IDEuMDQ2Njc5MzgxMjcsIC0wLjAxMDU0NTU3NjkyMywgLTAuMDEwNTQ1NTc2OTIzLCAxLjA0NjY3OTM4MTI3OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93Q29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEw7CisgIEwgPDwgMC45MzU0OTk0MDA1NDEsIDAuMDA5NjI2OTE0MDM3NDksIDAuMDA5NjI2OTE0MDM3NDksIDAuOTM1NDk5NDAwNTQxOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gSzsKKyAgSyA8PCAyMi43NzUwMjg4NTczLCA1LjUxMTQzMjUzNTU2LCA1LjUxMTQzMjUzNTU2LCAyMi43NzUwMjg4NTczOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMj4gQV9pbnY7CisgIEFfaW52IDw8IDEuMDQ2Njc5MzgxMjcsIC0wLjAxMDU0NTU3NjkyMywgLTAuMDEwNTQ1NTc2OTIzLCAxLjA0NjY3OTM4MTI3OworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKSk7Cit9CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaENvbnRyb2xsZXIoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBMOworICBMIDw8IDAuOTM1NDk5NDAwNTQxLCAwLjAwOTYyNjkxNDAzNzQ5LCAwLjAwOTYyNjkxNDAzNzQ5LCAwLjkzNTQ5OTQwMDU0MTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEs7CisgIEsgPDwgMjIuNzc1MDI4ODU3MywgNS41MTE0MzI1MzU1NiwgNS41MTE0MzI1MzU1NiwgMjIuNzc1MDI4ODU3MzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEFfaW52OworICBBX2ludiA8PCAxLjA0NjY3OTM4MTI3LCAtMC4wMTA1NDU1NzY5MjMsIC0wLjAxMDU0NTU3NjkyMywgMS4wNDY2NzkzODEyNzsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+KEwsIEssIEFfaW52LCBNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaEhpZ2hQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50PDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5QbGFudCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+Pj4gcGxhbnRzKDQpOworICBwbGFudHNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4oTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0xvd1BsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcGxhbnRzWzFdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+KE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dIaWdoUGxhbnRDb2VmZmljaWVudHMoKSkpOworICBwbGFudHNbMl0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4oTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hMb3dQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHBsYW50c1szXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPihNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaEhpZ2hQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnQ8MiwgMiwgMj4oJnBsYW50cyk7Cit9CisKK1N0YXRlRmVlZGJhY2tMb29wPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb29wKCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPj4+IGNvbnRyb2xsZXJzKDQpOworICBjb250cm9sbGVyc1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0xvd0NvbnRyb2xsZXIoKSkpOworICBjb250cm9sbGVyc1sxXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4oTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hDb250cm9sbGVyKCkpKTsKKyAgY29udHJvbGxlcnNbMl0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDIsIDIsIDI+KE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93Q29udHJvbGxlcigpKSk7CisgIGNvbnRyb2xsZXJzWzNdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPihNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaEhpZ2hDb250cm9sbGVyKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tMb29wPDIsIDIsIDI+KCZjb250cm9sbGVycyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmggYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5OWNhZgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIFkyMDE1X0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9QT0xZRFJJVkVUUkFJTl9ET0dfTU9UT1JfUExBTlRfSF8KKyNkZWZpbmUgWTIwMTVfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX1BPTFlEUklWRVRSQUlOX0RPR19NT1RPUl9QTEFOVF9IXworCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5Mb3dMb3dQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93TG93Q29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2hQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluTG93SGlnaENvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDIsIDIsIDI+IE1ha2VWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93UGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkhpZ2hMb3dDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaEhpZ2hQbGFudENvZWZmaWNpZW50cygpOworCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluSGlnaEhpZ2hDb250cm9sbGVyKCk7CisKK1N0YXRlRmVlZGJhY2tQbGFudDwyLCAyLCAyPiBNYWtlVmVsb2NpdHlEcml2ZXRyYWluUGxhbnQoKTsKKworU3RhdGVGZWVkYmFja0xvb3A8MiwgMiwgMj4gTWFrZVZlbG9jaXR5RHJpdmV0cmFpbkxvb3AoKTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBZMjAxNV9DT05UUk9MX0xPT1BTX0RSSVZFVFJBSU5fUE9MWURSSVZFVFJBSU5fRE9HX01PVE9SX1BMQU5UX0hfCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcmVwbGF5X2RyaXZldHJhaW4uY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vcmVwbGF5X2RyaXZldHJhaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwYTk0NQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9yZXBsYXlfZHJpdmV0cmFpbi5jYwpAQCAtMCwwICsxLDI0IEBACisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9yZXBsYXlfY29udHJvbF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2xpbnV4X2NvZGUvaW5pdC5oIgorCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgorCisvLyBSZWFkcyBvbmUgb3IgbW9yZSBsb2cgZmlsZXMgYW5kIHNlbmRzIG91dCBhbGwgdGhlIHF1ZXVlIG1lc3NhZ2VzIChpbiB0aGUKKy8vIGNvcnJlY3Qgb3JkZXIgYW5kIGF0IHRoZSBjb3JyZWN0IHRpbWUpIHRvIGZlZWQgYSAibGl2ZSIgZHJpdmV0cmFpbiBwcm9jZXNzLgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgaWYgKGFyZ2MgPD0gMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTmVlZCBhdCBsZWFzdCBvbmUgZmlsZSB0byByZXBsYXkhXG4iKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgOjphb3M6OkluaXROUlQoKTsKKworICA6OmFvczo6Y29udHJvbHM6OkNvbnRyb2xMb29wUmVwbGF5ZXI8OjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZT4KKyAgICAgIHJlcGxheWVyKCY6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6ZHJpdmV0cmFpbl9xdWV1ZSwgImRyaXZldHJhaW4iKTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKyAgICByZXBsYXllci5Qcm9jZXNzRmlsZShhcmd2W2ldKTsKKyAgfQorCisgIDo6YW9zOjpDbGVhbnVwKCk7Cit9CmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9hcm1fbW90b3JfcGxhbnQuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9hcm1fbW90b3JfcGxhbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzMjA1YQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2FybV9tb3Rvcl9wbGFudC5jYwpAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvYXJtX21vdG9yX3BsYW50LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZUFybVBsYW50Q29lZmZpY2llbnRzKCkgeworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQTsKKyAgQSA8PCAxLjAsIDAuMDA0Nzk2NDIwMjU0NTQsIDAuMCwgMC4wLCAwLjAsIDAuOTE5Njg4NTg1MDI4LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuOTk5NTM5NzcxNjEzLCAwLjAwNDc5NTY2MzgyNjQ1LCAwLjAsIDAuMCwgLTAuMTgxNTQzOTA2MjEsIDAuOTE5MjQxMDIyMjk3OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgMj4gQjsKKyAgQiA8PCAyLjQ2NDk2Nzc5OTg0ZS0wNSwgMi40NjQ5Njc3OTk4NGUtMDUsIDAuMDA5NzI0MjAxNzU4MDgsIDAuMDA5NzI0MjAxNzU4MDgsIDIuNDY0Nzc0NDk1MzhlLTA1LCAtMi40NjQ3NzQ0OTUzOGUtMDUsIDAuMDA5NzIyNjY4MTg1MzIsIC0wLjAwOTcyMjY2ODE4NTMyOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgND4gQzsKKyAgQyA8PCAxLCAwLCAxLCAwLCAxLCAwLCAtMSwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDI+IEQ7CisgIEQgPDwgMCwgMCwgMCwgMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWF4OworICBVX21heCA8PCAxMi4wLCAxMi4wOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9taW47CisgIFVfbWluIDw8IC0xMi4wLCAtMTIuMDsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihBLCBCLCBDLCBELCBVX21heCwgVV9taW4pOworfQorCitTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPiBNYWtlQXJtQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEw7CisgIEwgPDwgMC43NTk4NDQyOTI1MTQsIDAuNzU5ODQ0MjkyNTE0LCA1NC4yNTQxNzYyMTg4LCA1NC4yNTQxNzYyMTg4LCAwLjc1OTM5MDM5Njk1NSwgLTAuNzU5MzkwMzk2OTU1LCA1NC4xMDQ4MTY3MDQzLCAtNTQuMTA0ODE2NzA0MzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEs7CisgIEsgPDwgMzIwLjk3OTYwNjA5MywgMjEuMDEyOTUxNzk1NSwgODg0LjIzMzc4NDc1OSwgMzYuMzYzNzc4MjExOSwgMzIwLjk3OTYwNjA5NSwgMjEuMDEyOTUxNzk1NiwgLTg4NC4yMzM3ODQ3NDksIC0zNi4zNjM3NzgyMTE5OworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQV9pbnY7CisgIEFfaW52IDw8IDEuMCwgLTAuMDA1MjE1MjY1NjE1NTksIDAuMCwgMC4wLCAwLjAsIDEuMDg3MzI0NTc1MTcsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC45OTk1MTMzNTQwNDQsIC0wLjAwNTIxNDQ0MzEzMjczLCAwLjAsIDAuMCwgMC4xOTczOTcxNTA2OTQsIDEuMDg2ODI0MTU3NTM7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihMLCBLLCBBX2ludiwgTWFrZUFybVBsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4gTWFrZUFybVBsYW50KCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4+PiBwbGFudHMoMSk7CisgIHBsYW50c1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlQXJtUGxhbnRDb2VmZmljaWVudHMoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+KCZwbGFudHMpOworfQorCitTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPiBNYWtlQXJtTG9vcCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+PiBjb250cm9sbGVycygxKTsKKyAgY29udHJvbGxlcnNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KE1ha2VBcm1Db250cm9sbGVyKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+KCZjb250cm9sbGVycyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9hcm1fbW90b3JfcGxhbnQuaCBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2FybV9tb3Rvcl9wbGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjhkMDkKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9hcm1fbW90b3JfcGxhbnQuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIFkyMDE1X0NPTlRST0xfTE9PUFNfRlJJREdFX0FSTV9NT1RPUl9QTEFOVF9IXworI2RlZmluZSBZMjAxNV9DT05UUk9MX0xPT1BTX0ZSSURHRV9BUk1fTU9UT1JfUExBTlRfSF8KKworI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3N0YXRlX2ZlZWRiYWNrX2xvb3AuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CisKK1N0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPiBNYWtlQXJtUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZUFybUNvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+IE1ha2VBcm1QbGFudCgpOworCitTdGF0ZUZlZWRiYWNrTG9vcDw0LCAyLCAyPiBNYWtlQXJtTG9vcCgpOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE1X0NPTlRST0xfTE9PUFNfRlJJREdFX0FSTV9NT1RPUl9QTEFOVF9IXwpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZWxldmF0b3JfbW90b3JfcGxhbnQuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9lbGV2YXRvcl9tb3Rvcl9wbGFudC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTVkODM4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZWxldmF0b3JfbW90b3JfcGxhbnQuY2MKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2VsZXZhdG9yX21vdG9yX3BsYW50LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZUVsZXZhdG9yUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCA0PiBBOworICBBIDw8IDEuMCwgMC4wMDQzNTY2ODE5MzY2OSwgMC4wLCAwLjAsIDAuMCwgMC43NTQyMTI3ODYwNTQsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC45OTcxOTQ0OTg1NjksIDAuMDA0MzUyMjIwODMxNjQsIDAuMCwgMC4wLCAtMS4wNzEzMTU4OTcwMiwgMC43NTE2NTg5NjI5ODY7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA0LCAyPiBCOworICBCIDw8IDMuODI1ODAyODQyNzZlLTA1LCAzLjgyNTgwMjg0Mjc2ZS0wNSwgMC4wMTQ2MTY5Mjg2MzA3LCAwLjAxNDYxNjkyODYzMDcsIDMuODIzODc4OTg4MzllLTA1LCAtMy44MjM4Nzg5ODgzOWUtMDUsIDAuMDE0NjAxOTYxMzU2MywgLTAuMDE0NjAxOTYxMzU2MzsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEM7CisgIEMgPDwgMSwgMCwgMSwgMCwgMSwgMCwgLTEsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAsIDAsIDAsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZUVsZXZhdG9yQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDQsIDI+IEw7CisgIEwgPDwgMC42NzcxMDYzOTMwMjcsIDAuNjc3MTA2MzkzMDI3LCAzNS41Mzc1NzM4NjA3LCAzNS41Mzc1NzM4NjA3LCAwLjY3NDQyNjczMDc3NywgLTAuNjc0NDI2NzMwNzc3LCAzNC43MTM4ODc0MzQ0LCAtMzQuNzEzODg3NDM0NDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDQ+IEs7CisgIEsgPDwgMzIxLjMxMDYwNjc2MywgMTEuNzY3NDUzNDIzMywgNjAxLjA0NzkzNTcxNywgMTIuNjk3NzE0ODg0MywgMzIxLjMxMDYwNjc2NCwgMTEuNzY3NDUzNDIzMywgLTYwMS4wNDc5MzU3MTYsIC0xMi42OTc3MTQ4ODQzOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNCwgND4gQV9pbnY7CisgIEFfaW52IDw8IDEuMCwgLTAuMDA1Nzc2NDYyNTgwOTEsIDAuMCwgMC4wLCAwLjAsIDEuMzI1ODg1NzY5MjMsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC45OTY2MTM5MjIzMzcsIC0wLjAwNTc3MDU0NzY2NTIyLCAwLjAsIDAuMCwgMS40MjA0NDI1MDIyMSwgMS4zMjIxNjU5OTQ4MTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+KEwsIEssIEFfaW52LCBNYWtlRWxldmF0b3JQbGFudENvZWZmaWNpZW50cygpKTsKK30KKworU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+IE1ha2VFbGV2YXRvclBsYW50KCkgeworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4+PiBwbGFudHMoMSk7CisgIHBsYW50c1swXSA9IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw0LCAyLCAyPihNYWtlRWxldmF0b3JQbGFudENvZWZmaWNpZW50cygpKSk7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4oJnBsYW50cyk7Cit9CisKK1N0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+IE1ha2VFbGV2YXRvckxvb3AoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDQsIDIsIDI+Pj4gY29udHJvbGxlcnMoMSk7CisgIGNvbnRyb2xsZXJzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4+KG5ldyBTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw0LCAyLCAyPihNYWtlRWxldmF0b3JDb250cm9sbGVyKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tMb29wPDQsIDIsIDI+KCZjb250cm9sbGVycyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9lbGV2YXRvcl9tb3Rvcl9wbGFudC5oIGIveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZWxldmF0b3JfbW90b3JfcGxhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhlNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZWxldmF0b3JfbW90b3JfcGxhbnQuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIFkyMDE1X0NPTlRST0xfTE9PUFNfRlJJREdFX0VMRVZBVE9SX01PVE9SX1BMQU5UX0hfCisjZGVmaW5lIFkyMDE1X0NPTlRST0xfTE9PUFNfRlJJREdFX0VMRVZBVE9SX01PVE9SX1BMQU5UX0hfCisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NCwgMiwgMj4gTWFrZUVsZXZhdG9yUGxhbnRDb2VmZmljaWVudHMoKTsKKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NCwgMiwgMj4gTWFrZUVsZXZhdG9yQ29udHJvbGxlcigpOworCitTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4gTWFrZUVsZXZhdG9yUGxhbnQoKTsKKworU3RhdGVGZWVkYmFja0xvb3A8NCwgMiwgMj4gTWFrZUVsZXZhdG9yTG9vcCgpOworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgIC8vIFkyMDE1X0NPTlRST0xfTE9PUFNfRlJJREdFX0VMRVZBVE9SX01PVE9SX1BMQU5UX0hfCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzYmFmMgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5jYwpAQCAtMCwwICsxLDcyMCBAQAorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5oIgorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcHMucS5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9lbGV2YXRvcl9tb3Rvcl9wbGFudC5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ludGVncmFsX2FybV9wbGFudC5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3ZvbHRhZ2VfY2FwL3ZvbHRhZ2VfY2FwLmgiCisjaW5jbHVkZSAiZnJjOTcxL3plcm9pbmcvemVyb2luZy5oIgorCisjaW5jbHVkZSAieTIwMTUvY29uc3RhbnRzLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCituYW1lc3BhY2UgeworY29uc3RleHByIGRvdWJsZSBrWmVyb2luZ1ZvbHRhZ2UgPSA0LjA7Citjb25zdGV4cHIgZG91YmxlIGtFbGV2YXRvclplcm9pbmdWZWxvY2l0eSA9IDAuMTA7CisvLyBXaGF0IHNwZWVkIHdlIG1vdmUgdG8gb3VyIHNhZmUgaGVpZ2h0IGF0LgorY29uc3RleHByIGRvdWJsZSBrRWxldmF0b3JTYWZlSGVpZ2h0VmVsb2NpdHkgPSAwLjM7Citjb25zdGV4cHIgZG91YmxlIGtBcm1aZXJvaW5nVmVsb2NpdHkgPSAwLjIwOworfSAgLy8gbmFtZXNwYWNlCisKK3RlbXBsYXRlIDxpbnQgUz4KK3ZvaWQgQ2FwcGVkU3RhdGVGZWVkYmFja0xvb3A8Uz46OkNhcFUoKSB7CisgIFZvbHRhZ2VDYXAobWF4X3ZvbHRhZ2VfLCB0aGlzLT5VKDAsIDApLCB0aGlzLT5VKDEsIDApLCAmdGhpcy0+bXV0YWJsZV9VKDAsIDApLAorICAgICAgICAgICAgICZ0aGlzLT5tdXRhYmxlX1UoMSwgMCkpOworfQorCit0ZW1wbGF0ZSA8aW50IFM+CitFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4KK0NhcHBlZFN0YXRlRmVlZGJhY2tMb29wPFM+OjpVbnNhdHVyYXRlT3V0cHV0R29hbENoYW5nZSgpIHsKKyAgLy8gQ29tcHV0ZSB0aGUgSyBtYXRyaXggdXNlZCB0byBjb21wZW5zYXRlIGZvciBwb3NpdGlvbiBlcnJvcnMuCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBLcDsKKyAgS3Auc2V0WmVybygpOworICBLcC5jb2woMCkgPSB0aGlzLT5LKCkuY29sKDApOworICBLcC5jb2woMSkgPSB0aGlzLT5LKCkuY29sKDIpOworCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBLcF9pbnYgPSBLcC5pbnZlcnNlKCk7CisKKyAgLy8gQ29tcHV0ZSBob3cgbXVjaCB3ZSBuZWVkIHRvIGNoYW5nZSBSIGluIG9yZGVyIHRvIGFjaGlldmUgdGhlIGNoYW5nZSBpbiBVCisgIC8vIHRoYXQgd2FzIG9ic2VydmVkLgorICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gZGVsdGFSID0KKyAgICAgIC1LcF9pbnYgKiAodGhpcy0+VV91bmNhcHBlZCgpIC0gdGhpcy0+VSgpKTsKKyAgcmV0dXJuIGRlbHRhUjsKK30KKworRnJpZGdlOjpGcmlkZ2UoY29udHJvbF9sb29wczo6RnJpZGdlUXVldWUgKmZyaWRnZSkKKyAgICA6IGFvczo6Y29udHJvbHM6OkNvbnRyb2xMb29wPGNvbnRyb2xfbG9vcHM6OkZyaWRnZVF1ZXVlPihmcmlkZ2UpLAorICAgICAgYXJtX2xvb3BfKG5ldyBDYXBwZWRTdGF0ZUZlZWRiYWNrTG9vcDw1PigKKyAgICAgICAgICBTdGF0ZUZlZWRiYWNrTG9vcDw1LCAyLCAyPihNYWtlSW50ZWdyYWxBcm1Mb29wKCkpKSksCisgICAgICBlbGV2YXRvcl9sb29wXyhuZXcgQ2FwcGVkU3RhdGVGZWVkYmFja0xvb3A8ND4oCisgICAgICAgICAgU3RhdGVGZWVkYmFja0xvb3A8NCwgMiwgMj4oTWFrZUVsZXZhdG9yTG9vcCgpKSkpLAorICAgICAgbGVmdF9hcm1fZXN0aW1hdG9yXyhjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5sZWZ0X2FybV96ZXJvaW5nKSwKKyAgICAgIHJpZ2h0X2FybV9lc3RpbWF0b3JfKGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLnJpZ2h0X2FybV96ZXJvaW5nKSwKKyAgICAgIGxlZnRfZWxldmF0b3JfZXN0aW1hdG9yXyhjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5sZWZ0X2VsZXZfemVyb2luZyksCisgICAgICByaWdodF9lbGV2YXRvcl9lc3RpbWF0b3JfKAorICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLnJpZ2h0X2VsZXZfemVyb2luZyksCisgICAgICBsYXN0X3Byb2ZpbGluZ190eXBlXyhQcm9maWxpbmdUeXBlOjpBTkdMRV9IRUlHSFRfUFJPRklMSU5HKSwKKyAgICAgIGtpbmVtYXRpY3NfKGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmFybV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5lbGV2YXRvci51cHBlcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLmxvd2VyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLnVwcGVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLmxvd2VyX2xpbWl0KSwKKyAgICAgIGFybV9wcm9maWxlXyg6OmFvczo6Y29udHJvbHM6OmtMb29wRnJlcXVlbmN5KSwKKyAgICAgIGVsZXZhdG9yX3Byb2ZpbGVfKDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kpLAorICAgICAgeF9wcm9maWxlXyg6OmFvczo6Y29udHJvbHM6OmtMb29wRnJlcXVlbmN5KSwKKyAgICAgIHlfcHJvZmlsZV8oOjphb3M6OmNvbnRyb2xzOjprTG9vcEZyZXF1ZW5jeSkge30KKwordm9pZCBGcmlkZ2U6OlVwZGF0ZVplcm9pbmdTdGF0ZSgpIHsKKyAgaWYgKGxlZnRfZWxldmF0b3JfZXN0aW1hdG9yXy5vZmZzZXRfcmF0aW9fcmVhZHkoKSA8IDEuMCB8fAorICAgICAgcmlnaHRfZWxldmF0b3JfZXN0aW1hdG9yXy5vZmZzZXRfcmF0aW9fcmVhZHkoKSA8IDEuMCB8fAorICAgICAgbGVmdF9hcm1fZXN0aW1hdG9yXy5vZmZzZXRfcmF0aW9fcmVhZHkoKSA8IDEuMCB8fAorICAgICAgcmlnaHRfYXJtX2VzdGltYXRvcl8ub2Zmc2V0X3JhdGlvX3JlYWR5KCkgPCAxLjApIHsKKyAgICBzdGF0ZV8gPSBJTklUSUFMSVpJTkc7CisgIH0gZWxzZSBpZiAoIWxlZnRfZWxldmF0b3JfZXN0aW1hdG9yXy56ZXJvZWQoKSB8fAorICAgICAgICAgICAgICFyaWdodF9lbGV2YXRvcl9lc3RpbWF0b3JfLnplcm9lZCgpKSB7CisgICAgc3RhdGVfID0gWkVST0lOR19FTEVWQVRPUjsKKyAgfSBlbHNlIGlmICghbGVmdF9hcm1fZXN0aW1hdG9yXy56ZXJvZWQoKSB8fCAhcmlnaHRfYXJtX2VzdGltYXRvcl8uemVyb2VkKCkpIHsKKyAgICBzdGF0ZV8gPSBaRVJPSU5HX0FSTTsKKyAgfSBlbHNlIHsKKyAgICBzdGF0ZV8gPSBSVU5OSU5HOworICB9Cit9CisKK3ZvaWQgRnJpZGdlOjpDb3JyZWN0KCkgeworICB7CisgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFk7CisgICAgWSA8PCBsZWZ0X2VsZXZhdG9yKCksIHJpZ2h0X2VsZXZhdG9yKCk7CisgICAgZWxldmF0b3JfbG9vcF8tPkNvcnJlY3QoWSk7CisgIH0KKworICB7CisgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFk7CisgICAgWSA8PCBsZWZ0X2FybSgpLCByaWdodF9hcm0oKTsKKyAgICBhcm1fbG9vcF8tPkNvcnJlY3QoWSk7CisgIH0KK30KKwordm9pZCBGcmlkZ2U6OlNldEVsZXZhdG9yT2Zmc2V0KGRvdWJsZSBsZWZ0X29mZnNldCwgZG91YmxlIHJpZ2h0X29mZnNldCkgeworICBMT0coSU5GTywgIkNoYW5naW5nIEVsZXZhdG9yIG9mZnNldCBmcm9tICVmLCAlZiB0byAlZiwgJWZcbiIsCisgICAgICBsZWZ0X2VsZXZhdG9yX29mZnNldF8sIHJpZ2h0X2VsZXZhdG9yX29mZnNldF8sIGxlZnRfb2Zmc2V0LCByaWdodF9vZmZzZXQpOworICBkb3VibGUgbGVmdF9kb2Zmc2V0ID0gbGVmdF9vZmZzZXQgLSBsZWZ0X2VsZXZhdG9yX29mZnNldF87CisgIGRvdWJsZSByaWdodF9kb2Zmc2V0ID0gcmlnaHRfb2Zmc2V0IC0gcmlnaHRfZWxldmF0b3Jfb2Zmc2V0XzsKKworICAvLyBBZGp1c3QgdGhlIGF2ZXJhZ2UgaGVpZ2h0IGFuZCBoZWlnaHQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gc2lkZXMuCisgIC8vIFRoZSBkZXJpdmF0aXZlcyBvZiBib3RoIHNob3VsZCBub3QgbmVlZCB0byBiZSB1cGRhdGVkIHNpbmNlIHRoZSBzcGVlZHMKKyAgLy8gaGF2ZW4ndCBjaGFuZ2VkLgorICAvLyBUaGUgaGVpZ2h0IGRpZmZlcmVuY2UgaXMgY2FsY3VsYXRlZCBhcyBsZWZ0IC0gcmlnaHQsIG5vdCByaWdodCAtIGxlZnQuCisgIGVsZXZhdG9yX2xvb3BfLT5tdXRhYmxlX1hfaGF0KDAsIDApICs9IChsZWZ0X2RvZmZzZXQgKyByaWdodF9kb2Zmc2V0KSAvIDI7CisgIGVsZXZhdG9yX2xvb3BfLT5tdXRhYmxlX1hfaGF0KDIsIDApICs9IChsZWZ0X2RvZmZzZXQgLSByaWdodF9kb2Zmc2V0KSAvIDI7CisKKyAgLy8gTW9kaWZ5IHRoZSB6ZXJvaW5nIGdvYWwuCisgIGVsZXZhdG9yX2dvYWxfICs9IChsZWZ0X2RvZmZzZXQgKyByaWdodF9kb2Zmc2V0KSAvIDI7CisKKyAgLy8gVXBkYXRlIHRoZSBjYWNoZWQgb2Zmc2V0IHZhbHVlcyB0byB0aGUgYWN0dWFsIHZhbHVlcy4KKyAgbGVmdF9lbGV2YXRvcl9vZmZzZXRfID0gbGVmdF9vZmZzZXQ7CisgIHJpZ2h0X2VsZXZhdG9yX29mZnNldF8gPSByaWdodF9vZmZzZXQ7Cit9CisKK3ZvaWQgRnJpZGdlOjpTZXRBcm1PZmZzZXQoZG91YmxlIGxlZnRfb2Zmc2V0LCBkb3VibGUgcmlnaHRfb2Zmc2V0KSB7CisgIExPRyhJTkZPLCAiQ2hhbmdpbmcgQXJtIG9mZnNldCBmcm9tICVmLCAlZiB0byAlZiwgJWZcbiIsIGxlZnRfYXJtX29mZnNldF8sCisgICAgICByaWdodF9hcm1fb2Zmc2V0XywgbGVmdF9vZmZzZXQsIHJpZ2h0X29mZnNldCk7CisgIGRvdWJsZSBsZWZ0X2RvZmZzZXQgPSBsZWZ0X29mZnNldCAtIGxlZnRfYXJtX29mZnNldF87CisgIGRvdWJsZSByaWdodF9kb2Zmc2V0ID0gcmlnaHRfb2Zmc2V0IC0gcmlnaHRfYXJtX29mZnNldF87CisKKyAgLy8gQWRqdXN0IHRoZSBhdmVyYWdlIGFuZ2xlIGFuZCBhbmdsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzaWRlcy4KKyAgLy8gVGhlIGRlcml2YXRpdmVzIG9mIGJvdGggc2hvdWxkIG5vdCBuZWVkIHRvIGJlIHVwZGF0ZWQgc2luY2UgdGhlIHNwZWVkcworICAvLyBoYXZlbid0IGNoYW5nZWQuCisgIGFybV9sb29wXy0+bXV0YWJsZV9YX2hhdCgwLCAwKSArPSAobGVmdF9kb2Zmc2V0ICsgcmlnaHRfZG9mZnNldCkgLyAyOworICBhcm1fbG9vcF8tPm11dGFibGVfWF9oYXQoMiwgMCkgKz0gKGxlZnRfZG9mZnNldCAtIHJpZ2h0X2RvZmZzZXQpIC8gMjsKKworICAvLyBNb2RpZnkgdGhlIHplcm9pbmcgZ29hbC4KKyAgYXJtX2dvYWxfICs9IChsZWZ0X2RvZmZzZXQgKyByaWdodF9kb2Zmc2V0KSAvIDI7CisKKyAgLy8gVXBkYXRlIHRoZSBjYWNoZWQgb2Zmc2V0IHZhbHVlcyB0byB0aGUgYWN0dWFsIHZhbHVlcy4KKyAgbGVmdF9hcm1fb2Zmc2V0XyA9IGxlZnRfb2Zmc2V0OworICByaWdodF9hcm1fb2Zmc2V0XyA9IHJpZ2h0X29mZnNldDsKK30KKworZG91YmxlIEZyaWRnZTo6ZXN0aW1hdGVkX2xlZnRfZWxldmF0b3IoKSB7CisgIHJldHVybiBjdXJyZW50X3Bvc2l0aW9uXy5lbGV2YXRvci5sZWZ0LmVuY29kZXIgKworICAgICAgICAgbGVmdF9lbGV2YXRvcl9lc3RpbWF0b3JfLm9mZnNldCgpOworfQorZG91YmxlIEZyaWRnZTo6ZXN0aW1hdGVkX3JpZ2h0X2VsZXZhdG9yKCkgeworICByZXR1cm4gY3VycmVudF9wb3NpdGlvbl8uZWxldmF0b3IucmlnaHQuZW5jb2RlciArCisgICAgICAgICByaWdodF9lbGV2YXRvcl9lc3RpbWF0b3JfLm9mZnNldCgpOworfQorCitkb3VibGUgRnJpZGdlOjplc3RpbWF0ZWRfZWxldmF0b3IoKSB7CisgIHJldHVybiAoZXN0aW1hdGVkX2xlZnRfZWxldmF0b3IoKSArIGVzdGltYXRlZF9yaWdodF9lbGV2YXRvcigpKSAvIDIuMDsKK30KKworZG91YmxlIEZyaWRnZTo6ZXN0aW1hdGVkX2xlZnRfYXJtKCkgeworICByZXR1cm4gY3VycmVudF9wb3NpdGlvbl8uYXJtLmxlZnQuZW5jb2RlciArIGxlZnRfYXJtX2VzdGltYXRvcl8ub2Zmc2V0KCk7Cit9Citkb3VibGUgRnJpZGdlOjplc3RpbWF0ZWRfcmlnaHRfYXJtKCkgeworICByZXR1cm4gY3VycmVudF9wb3NpdGlvbl8uYXJtLnJpZ2h0LmVuY29kZXIgKyByaWdodF9hcm1fZXN0aW1hdG9yXy5vZmZzZXQoKTsKK30KK2RvdWJsZSBGcmlkZ2U6OmVzdGltYXRlZF9hcm0oKSB7CisgIHJldHVybiAoZXN0aW1hdGVkX2xlZnRfYXJtKCkgKyBlc3RpbWF0ZWRfcmlnaHRfYXJtKCkpIC8gMi4wOworfQorCitkb3VibGUgRnJpZGdlOjpsZWZ0X2VsZXZhdG9yKCkgeworICByZXR1cm4gY3VycmVudF9wb3NpdGlvbl8uZWxldmF0b3IubGVmdC5lbmNvZGVyICsgbGVmdF9lbGV2YXRvcl9vZmZzZXRfOworfQorZG91YmxlIEZyaWRnZTo6cmlnaHRfZWxldmF0b3IoKSB7CisgIHJldHVybiBjdXJyZW50X3Bvc2l0aW9uXy5lbGV2YXRvci5yaWdodC5lbmNvZGVyICsgcmlnaHRfZWxldmF0b3Jfb2Zmc2V0XzsKK30KKworZG91YmxlIEZyaWRnZTo6ZWxldmF0b3IoKSB7IHJldHVybiAobGVmdF9lbGV2YXRvcigpICsgcmlnaHRfZWxldmF0b3IoKSkgLyAyLjA7IH0KKworZG91YmxlIEZyaWRnZTo6bGVmdF9hcm0oKSB7CisgIHJldHVybiBjdXJyZW50X3Bvc2l0aW9uXy5hcm0ubGVmdC5lbmNvZGVyICsgbGVmdF9hcm1fb2Zmc2V0XzsKK30KK2RvdWJsZSBGcmlkZ2U6OnJpZ2h0X2FybSgpIHsKKyAgcmV0dXJuIGN1cnJlbnRfcG9zaXRpb25fLmFybS5yaWdodC5lbmNvZGVyICsgcmlnaHRfYXJtX29mZnNldF87Cit9Citkb3VibGUgRnJpZGdlOjphcm0oKSB7IHJldHVybiAobGVmdF9hcm0oKSArIHJpZ2h0X2FybSgpKSAvIDIuMDsgfQorCitkb3VibGUgRnJpZGdlOjplbGV2YXRvcl96ZXJvaW5nX3ZlbG9jaXR5KCkgeworICBkb3VibGUgYXZlcmFnZV9lbGV2YXRvciA9CisgICAgICAoY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuZWxldmF0b3IubG93ZXJfbGltaXQgKworICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLnVwcGVyX2xpbWl0KSAvCisgICAgICAyLjA7CisKKyAgY29uc3QgZG91YmxlIHB1bHNlX3dpZHRoID0gOjpzdGQ6Om1heCgKKyAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmxlZnRfZWxldl96ZXJvaW5nLmluZGV4X2RpZmZlcmVuY2UsCisgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5yaWdodF9lbGV2X3plcm9pbmcuaW5kZXhfZGlmZmVyZW5jZSk7CisKKyAgaWYgKGVsZXZhdG9yX3plcm9pbmdfdmVsb2NpdHlfID09IDApIHsKKyAgICBpZiAoZXN0aW1hdGVkX2VsZXZhdG9yKCkgPiBhdmVyYWdlX2VsZXZhdG9yKSB7CisgICAgICBlbGV2YXRvcl96ZXJvaW5nX3ZlbG9jaXR5XyA9IC1rRWxldmF0b3JaZXJvaW5nVmVsb2NpdHk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZXZhdG9yX3plcm9pbmdfdmVsb2NpdHlfID0ga0VsZXZhdG9yWmVyb2luZ1ZlbG9jaXR5OworICAgIH0KKyAgfSBlbHNlIGlmIChlbGV2YXRvcl96ZXJvaW5nX3ZlbG9jaXR5XyA+IDAgJiYKKyAgICAgICAgICAgICBlc3RpbWF0ZWRfZWxldmF0b3IoKSA+IGF2ZXJhZ2VfZWxldmF0b3IgKyAxLjEgKiBwdWxzZV93aWR0aCkgeworICAgIGVsZXZhdG9yX3plcm9pbmdfdmVsb2NpdHlfID0gLWtFbGV2YXRvclplcm9pbmdWZWxvY2l0eTsKKyAgfSBlbHNlIGlmIChlbGV2YXRvcl96ZXJvaW5nX3ZlbG9jaXR5XyA8IDAgJiYKKyAgICAgICAgICAgICBlc3RpbWF0ZWRfZWxldmF0b3IoKSA8IGF2ZXJhZ2VfZWxldmF0b3IgLSAxLjEgKiBwdWxzZV93aWR0aCkgeworICAgIGVsZXZhdG9yX3plcm9pbmdfdmVsb2NpdHlfID0ga0VsZXZhdG9yWmVyb2luZ1ZlbG9jaXR5OworICB9CisgIHJldHVybiBlbGV2YXRvcl96ZXJvaW5nX3ZlbG9jaXR5XzsKK30KKworZG91YmxlIEZyaWRnZTo6VXNlVW5sZXNzWmVybyhkb3VibGUgdGFyZ2V0X3ZhbHVlLCBkb3VibGUgZGVmYXVsdF92YWx1ZSkgeworICBpZiAodGFyZ2V0X3ZhbHVlICE9IDAuMCkgeworICAgIHJldHVybiB0YXJnZXRfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KK30KKworZG91YmxlIEZyaWRnZTo6YXJtX3plcm9pbmdfdmVsb2NpdHkoKSB7CisgIGNvbnN0IGRvdWJsZSBhdmVyYWdlX2FybSA9IChjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5hcm0ubG93ZXJfbGltaXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLnVwcGVyX2xpbWl0KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDsKKyAgY29uc3QgZG91YmxlIHB1bHNlX3dpZHRoID0gOjpzdGQ6Om1heCgKKyAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLnJpZ2h0X2FybV96ZXJvaW5nLmluZGV4X2RpZmZlcmVuY2UsCisgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5sZWZ0X2FybV96ZXJvaW5nLmluZGV4X2RpZmZlcmVuY2UpOworCisgIGlmIChhcm1femVyb2luZ192ZWxvY2l0eV8gPT0gMCkgeworICAgIGlmIChlc3RpbWF0ZWRfYXJtKCkgPiBhdmVyYWdlX2FybSkgeworICAgICAgYXJtX3plcm9pbmdfdmVsb2NpdHlfID0gLWtBcm1aZXJvaW5nVmVsb2NpdHk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFybV96ZXJvaW5nX3ZlbG9jaXR5XyA9IGtBcm1aZXJvaW5nVmVsb2NpdHk7CisgICAgfQorICB9IGVsc2UgaWYgKGFybV96ZXJvaW5nX3ZlbG9jaXR5XyA+IDAuMCAmJgorICAgICAgICAgICAgIGVzdGltYXRlZF9hcm0oKSA+IGF2ZXJhZ2VfYXJtICsgMS4xICogcHVsc2Vfd2lkdGgpIHsKKyAgICBhcm1femVyb2luZ192ZWxvY2l0eV8gPSAta0FybVplcm9pbmdWZWxvY2l0eTsKKyAgfSBlbHNlIGlmIChhcm1femVyb2luZ192ZWxvY2l0eV8gPCAwLjAgJiYgZXN0aW1hdGVkX2FybSgpIDwgYXZlcmFnZV9hcm0pIHsKKyAgICBhcm1femVyb2luZ192ZWxvY2l0eV8gPSBrQXJtWmVyb2luZ1ZlbG9jaXR5OworICB9CisgIHJldHVybiBhcm1femVyb2luZ192ZWxvY2l0eV87Cit9CisKK3ZvaWQgRnJpZGdlOjpSdW5JdGVyYXRpb24oY29uc3QgY29udHJvbF9sb29wczo6RnJpZGdlUXVldWU6OkdvYWwgKnVuc2FmZV9nb2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sX2xvb3BzOjpGcmlkZ2VRdWV1ZTo6UG9zaXRpb24gKnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX2xvb3BzOjpGcmlkZ2VRdWV1ZTo6T3V0cHV0ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OkZyaWRnZVF1ZXVlOjpTdGF0dXMgKnN0YXR1cykgeworICBpZiAoV2FzUmVzZXQoKSkgeworICAgIExPRyhFUlJPUiwgIldQSUxpYiByZXNldCwgcmVzdGFydGluZ1xuIik7CisgICAgbGVmdF9lbGV2YXRvcl9lc3RpbWF0b3JfLlJlc2V0KCk7CisgICAgcmlnaHRfZWxldmF0b3JfZXN0aW1hdG9yXy5SZXNldCgpOworICAgIGxlZnRfYXJtX2VzdGltYXRvcl8uUmVzZXQoKTsKKyAgICByaWdodF9hcm1fZXN0aW1hdG9yXy5SZXNldCgpOworICAgIHN0YXRlXyA9IFVOSU5JVElBTElaRUQ7CisgIH0KKworICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50cyBzdHJ1Y3Qgc2luY2Ugd2UgdXNlIGl0IHNvIG9mdGVuIGluIHRoaXMKKyAgLy8gY29kZS4KKyAgY29uc3QgYXV0byAmdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKworICAvLyBCb29sIHRvIHRyYWNrIGlmIHdlIHNob3VsZCB0dXJuIHRoZSBtb3RvcnMgb24gb3Igbm90LgorICBib29sIGRpc2FibGUgPSBvdXRwdXQgPT0gbnVsbHB0cjsKKworICAvLyBTYXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHNvIGl0IGNhbiBiZSB1c2VkIGVhc2lseSBpbiB0aGUgY2xhc3MuCisgIGN1cnJlbnRfcG9zaXRpb25fID0gKnBvc2l0aW9uOworCisgIGxlZnRfZWxldmF0b3JfZXN0aW1hdG9yXy5VcGRhdGVFc3RpbWF0ZShwb3NpdGlvbi0+ZWxldmF0b3IubGVmdCk7CisgIHJpZ2h0X2VsZXZhdG9yX2VzdGltYXRvcl8uVXBkYXRlRXN0aW1hdGUocG9zaXRpb24tPmVsZXZhdG9yLnJpZ2h0KTsKKyAgbGVmdF9hcm1fZXN0aW1hdG9yXy5VcGRhdGVFc3RpbWF0ZShwb3NpdGlvbi0+YXJtLmxlZnQpOworICByaWdodF9hcm1fZXN0aW1hdG9yXy5VcGRhdGVFc3RpbWF0ZShwb3NpdGlvbi0+YXJtLnJpZ2h0KTsKKworICBpZiAoc3RhdGVfICE9IFVOSU5JVElBTElaRUQpIHsKKyAgICBDb3JyZWN0KCk7CisgIH0KKworICAvLyBaZXJvaW5nIHdpbGwgd29yayBhcyBmb2xsb3dzOgorICAvLyBBdCBzdGFydHVwLCByZWNvcmQgdGhlIG9mZnNldCBvZiB0aGUgdHdvIGhhbHZlcyBvZiB0aGUgdHdvIHN1YnN5c3RlbXMuCisgIC8vIFRoZW4sIHN0YXJ0IG1vdmluZyB0aGUgZWxldmF0b3IgdG93YXJkcyB0aGUgY2VudGVyIHVudGlsIGJvdGggaGFsdmVzIGFyZQorICAvLyB6ZXJvZWQuCisgIC8vIFRoZW4sIHN0YXJ0IG1vdmluZyB0aGUgY2xhdyB0b3dhcmRzIHRoZSBjZW50ZXIgdW50aWwgYm90aCBoYWx2ZXMgYXJlCisgIC8vIHplcm9lZC4KKyAgLy8gVGhlbiwgZG9uZSEKKworICAvLyBXZSdsbCB0aGVuIG5lZWQgY29kZSB0byBkbyBzYW5pdHkgY2hlY2tpbmcgb24gdmFsdWVzLgorCisgIC8vIE5vdywgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIHdheSB0byBnby4KKworICBzd2l0Y2ggKHN0YXRlXykgeworICAgIGNhc2UgVU5JTklUSUFMSVpFRDoKKyAgICAgIExPRyhERUJVRywgIlVuaW5pdGlhbGl6ZWRcbiIpOworICAgICAgLy8gU3RhcnR1cC4gIEFzc3VtZSB0aGF0IHdlIGFyZSBhdCB0aGUgb3JpZ2luIGV2ZXJ5d2hlcmUuCisgICAgICAvLyBUaGlzIHJlY29yZHMgdGhlIGVuY29kZXIgb2Zmc2V0IGJldHdlZW4gdGhlIHR3byBzaWRlcyBvZiB0aGUgZWxldmF0b3IuCisgICAgICBsZWZ0X2VsZXZhdG9yX29mZnNldF8gPSAtcG9zaXRpb24tPmVsZXZhdG9yLmxlZnQuZW5jb2RlcjsKKyAgICAgIHJpZ2h0X2VsZXZhdG9yX29mZnNldF8gPSAtcG9zaXRpb24tPmVsZXZhdG9yLnJpZ2h0LmVuY29kZXI7CisgICAgICBsZWZ0X2FybV9vZmZzZXRfID0gLXBvc2l0aW9uLT5hcm0ubGVmdC5lbmNvZGVyOworICAgICAgcmlnaHRfYXJtX29mZnNldF8gPSAtcG9zaXRpb24tPmFybS5yaWdodC5lbmNvZGVyOworICAgICAgZWxldmF0b3JfbG9vcF8tPm11dGFibGVfWF9oYXQoKS5zZXRaZXJvKCk7CisgICAgICBhcm1fbG9vcF8tPm11dGFibGVfWF9oYXQoKS5zZXRaZXJvKCk7CisgICAgICBMT0coSU5GTywgIkluaXRpYWxpemluZyBhcm0gb2Zmc2V0cyB0byAlZiwgJWZcbiIsIGxlZnRfYXJtX29mZnNldF8sCisgICAgICAgICAgcmlnaHRfYXJtX29mZnNldF8pOworICAgICAgTE9HKElORk8sICJJbml0aWFsaXppbmcgZWxldmF0b3Igb2Zmc2V0cyB0byAlZiwgJWZcbiIsCisgICAgICAgICAgbGVmdF9lbGV2YXRvcl9vZmZzZXRfLCByaWdodF9lbGV2YXRvcl9vZmZzZXRfKTsKKyAgICAgIENvcnJlY3QoKTsKKyAgICAgIHN0YXRlXyA9IElOSVRJQUxJWklORzsKKyAgICAgIGRpc2FibGUgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElOSVRJQUxJWklORzoKKyAgICAgIExPRyhERUJVRywgIldhaXRpbmcgZm9yIGFjY3VyYXRlIGluaXRpYWwgcG9zaXRpb24uXG4iKTsKKyAgICAgIGRpc2FibGUgPSB0cnVlOworICAgICAgLy8gVXBkYXRlIHN0YXRlXyB0byBhY2N1cmF0ZWx5IHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgdGhlIHplcm9pbmcKKyAgICAgIC8vIGVzdGltYXRvcnMuCisgICAgICBVcGRhdGVaZXJvaW5nU3RhdGUoKTsKKyAgICAgIGlmIChzdGF0ZV8gIT0gSU5JVElBTElaSU5HKSB7CisgICAgICAgIC8vIFNldCB0aGUgZ29hbHMgdG8gd2hlcmUgd2UgYXJlIG5vdy4KKyAgICAgICAgZWxldmF0b3JfZ29hbF8gPSBlbGV2YXRvcigpOworICAgICAgICBhcm1fZ29hbF8gPSBhcm0oKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRVJPSU5HX0VMRVZBVE9SOgorICAgICAgTE9HKERFQlVHLCAiWmVyb2luZyBlbGV2YXRvclxuIik7CisKKyAgICAgIC8vIFVwZGF0ZSBzdGF0ZV8gdG8gYWNjdXJhdGVseSByZXByZXNlbnQgdGhlIHN0YXRlIG9mIHRoZSB6ZXJvaW5nCisgICAgICAvLyBlc3RpbWF0b3JzLgorICAgICAgVXBkYXRlWmVyb2luZ1N0YXRlKCk7CisgICAgICBpZiAobGVmdF9lbGV2YXRvcl9lc3RpbWF0b3JfLnplcm9lZCgpICYmCisgICAgICAgICAgcmlnaHRfZWxldmF0b3JfZXN0aW1hdG9yXy56ZXJvZWQoKSkgeworICAgICAgICBTZXRFbGV2YXRvck9mZnNldChsZWZ0X2VsZXZhdG9yX2VzdGltYXRvcl8ub2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X2VsZXZhdG9yX2VzdGltYXRvcl8ub2Zmc2V0KCkpOworICAgICAgICBMT0coREVCVUcsICJaZXJvZWQgdGhlIGVsZXZhdG9yIVxuIik7CisKKyAgICAgICAgaWYgKGVsZXZhdG9yKCkgPCB2YWx1ZXMuZnJpZGdlLmFybV96ZXJvaW5nX2hlaWdodCAmJgorICAgICAgICAgICAgc3RhdGVfICE9IElOSVRJQUxJWklORykgeworICAgICAgICAgIC8vIE1vdmUgdGhlIGVsZXZhdG9yIHRvIGEgc2FmZSBoZWlnaHQgYmVmb3JlIHdlIHN0YXJ0IHplcm9pbmcgdGhlIGFybSwKKyAgICAgICAgICAvLyBzbyB0aGF0IHdlIGRvbid0IGNyYXNoIGFueXRoaW5nLgorICAgICAgICAgIExPRyhERUJVRywgIk1vdmluZyBlbGV2YXRvciB0byBzYWZlIGhlaWdodC5cbiIpOworICAgICAgICAgIGlmIChlbGV2YXRvcl9nb2FsXyA8IHZhbHVlcy5mcmlkZ2UuYXJtX3plcm9pbmdfaGVpZ2h0KSB7CisgICAgICAgICAgICBlbGV2YXRvcl9nb2FsXyArPSBrRWxldmF0b3JTYWZlSGVpZ2h0VmVsb2NpdHkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjphb3M6OmNvbnRyb2xzOjprTG9vcEZyZXF1ZW5jeS5Ub1NlY29uZHMoKTsKKyAgICAgICAgICAgIGVsZXZhdG9yX2dvYWxfdmVsb2NpdHlfID0ga0VsZXZhdG9yU2FmZUhlaWdodFZlbG9jaXR5OworICAgICAgICAgICAgc3RhdGVfID0gWkVST0lOR19FTEVWQVRPUjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2Ugd2FudCBpdCBzdG9wcGVkIGF0IHdoYXRldmVyIGhlaWdodCBpdCdzIGN1cnJlbnRseSBzZXQgdG8uCisgICAgICAgICAgICBlbGV2YXRvcl9nb2FsX3ZlbG9jaXR5XyA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFkaXNhYmxlKSB7CisgICAgICAgIGVsZXZhdG9yX2dvYWxfdmVsb2NpdHlfID0gZWxldmF0b3JfemVyb2luZ192ZWxvY2l0eSgpOworICAgICAgICBlbGV2YXRvcl9nb2FsXyArPSBlbGV2YXRvcl9nb2FsX3ZlbG9jaXR5XyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kuVG9TZWNvbmRzKCk7CisgICAgICB9CisKKyAgICAgIC8vIEJ5cGFzcyBtb3Rpb24gcHJvZmlsZXMgd2hpbGUgd2UgYXJlIHplcm9pbmcuCisgICAgICAvLyBUaGlzIGlzIGFsc28gYW4gaW1wb3J0YW50IHN0ZXAgcmlnaHQgYWZ0ZXIgdGhlIGVsZXZhdG9yIGlzIHplcm9lZCBhbmQKKyAgICAgIC8vIHdlIHJlYWNoIGludG8gdGhlIGVsZXZhdG9yJ3Mgc3RhdGUgbWF0cml4IGFuZCBjaGFuZ2UgaXQgYmFzZWQgb24gdGhlCisgICAgICAvLyBuZXdseS1vYnRhaW5lZCBvZmZzZXQuCisgICAgICB7CisgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBjdXJyZW50OworICAgICAgICBjdXJyZW50LnNldFplcm8oKTsKKyAgICAgICAgY3VycmVudCA8PCBlbGV2YXRvcl9nb2FsXywgZWxldmF0b3JfZ29hbF92ZWxvY2l0eV87CisgICAgICAgIGVsZXZhdG9yX3Byb2ZpbGVfLk1vdmVDdXJyZW50U3RhdGUoY3VycmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVST0lOR19BUk06CisgICAgICBMT0coREVCVUcsICJaZXJvaW5nIHRoZSBhcm1cbiIpOworCisgICAgICBpZiAoZWxldmF0b3IoKSA8IHZhbHVlcy5mcmlkZ2UuYXJtX3plcm9pbmdfaGVpZ2h0IC0gMC4xMCB8fAorICAgICAgICAgIGVsZXZhdG9yX2dvYWxfIDwgdmFsdWVzLmZyaWRnZS5hcm1femVyb2luZ19oZWlnaHQpIHsKKyAgICAgICAgTE9HKElORk8sCisgICAgICAgICAgICAiR29pbmcgYmFjayB0byBaRVJPSU5HX0VMRVZBVE9SIHVudGlsIGl0IGdldHMgaGlnaCBlbm91Z2ggdG8gIgorICAgICAgICAgICAgInNhZmVseSB6ZXJvIHRoZSBhcm1cbiIpOworICAgICAgICBzdGF0ZV8gPSBaRVJPSU5HX0VMRVZBVE9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gVXBkYXRlIHN0YXRlXyB0byBhY2N1cmF0ZWx5IHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgdGhlIHplcm9pbmcKKyAgICAgIC8vIGVzdGltYXRvcnMuCisgICAgICBVcGRhdGVaZXJvaW5nU3RhdGUoKTsKKyAgICAgIGlmIChsZWZ0X2FybV9lc3RpbWF0b3JfLnplcm9lZCgpICYmIHJpZ2h0X2FybV9lc3RpbWF0b3JfLnplcm9lZCgpKSB7CisgICAgICAgIFNldEFybU9mZnNldChsZWZ0X2FybV9lc3RpbWF0b3JfLm9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgcmlnaHRfYXJtX2VzdGltYXRvcl8ub2Zmc2V0KCkpOworICAgICAgICBMT0coREVCVUcsICJaZXJvZWQgdGhlIGFybSFcbiIpOworICAgICAgfSBlbHNlIGlmICghZGlzYWJsZSkgeworICAgICAgICBhcm1fZ29hbF92ZWxvY2l0eV8gPSBhcm1femVyb2luZ192ZWxvY2l0eSgpOworICAgICAgICBhcm1fZ29hbF8gKz0KKyAgICAgICAgICAgIGFybV9nb2FsX3ZlbG9jaXR5XyAqIDo6YW9zOjpjb250cm9sczo6a0xvb3BGcmVxdWVuY3kuVG9TZWNvbmRzKCk7CisgICAgICB9CisKKyAgICAgIC8vIEJ5cGFzcyBtb3Rpb24gcHJvZmlsZXMgd2hpbGUgd2UgYXJlIHplcm9pbmcuCisgICAgICAvLyBUaGlzIGlzIGFsc28gYW4gaW1wb3J0YW50IHN0ZXAgcmlnaHQgYWZ0ZXIgdGhlIGFybSBpcyB6ZXJvZWQgYW5kCisgICAgICAvLyB3ZSByZWFjaCBpbnRvIHRoZSBhcm0ncyBzdGF0ZSBtYXRyaXggYW5kIGNoYW5nZSBpdCBiYXNlZCBvbiB0aGUKKyAgICAgIC8vIG5ld2x5LW9idGFpbmVkIG9mZnNldC4KKyAgICAgIHsKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGN1cnJlbnQ7CisgICAgICAgIGN1cnJlbnQuc2V0WmVybygpOworICAgICAgICBjdXJyZW50IDw8IGFybV9nb2FsXywgYXJtX2dvYWxfdmVsb2NpdHlfOworICAgICAgICBhcm1fcHJvZmlsZV8uTW92ZUN1cnJlbnRTdGF0ZShjdXJyZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSVU5OSU5HOgorICAgICAgTE9HKERFQlVHLCAiUnVubmluZyFcbiIpOworICAgICAgaWYgKHVuc2FmZV9nb2FsKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBzd2l0Y2ggYmV0d2VlbiB0aGUgdHlwZXMgb2YgcHJvZmlsaW5nLgorICAgICAgICBQcm9maWxpbmdUeXBlIG5ld19wcm9maWxpbmdfdHlwZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9maWxpbmdUeXBlPih1bnNhZmVfZ29hbC0+cHJvZmlsaW5nX3R5cGUpOworCisgICAgICAgIGlmIChsYXN0X3Byb2ZpbGluZ190eXBlXyAhPSBuZXdfcHJvZmlsaW5nX3R5cGUpIHsKKyAgICAgICAgICAvLyBSZXNldCB0aGUgaGVpZ2h0L2FuZ2xlIHByb2ZpbGVzLgorICAgICAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBjdXJyZW50OworICAgICAgICAgIGN1cnJlbnQuc2V0WmVybygpOworICAgICAgICAgIGN1cnJlbnQgPDwgYXJtX2dvYWxfLCBhcm1fZ29hbF92ZWxvY2l0eV87CisgICAgICAgICAgYXJtX3Byb2ZpbGVfLk1vdmVDdXJyZW50U3RhdGUoY3VycmVudCk7CisgICAgICAgICAgY3VycmVudCA8PCBlbGV2YXRvcl9nb2FsXywgZWxldmF0b3JfZ29hbF92ZWxvY2l0eV87CisgICAgICAgICAgZWxldmF0b3JfcHJvZmlsZV8uTW92ZUN1cnJlbnRTdGF0ZShjdXJyZW50KTsKKworICAgICAgICAgIC8vIFJlc2V0IHRoZSB4L3kgcHJvZmlsZXMuCisgICAgICAgICAgYW9zOjp1dGlsOjpFbGV2YXRvckFybUtpbmVtYXRpY3M6OktpbmVtYXRpY1Jlc3VsdCB4X3lfcmVzdWx0OworICAgICAgICAgIGtpbmVtYXRpY3NfLkZvcndhcmRLaW5lbWF0aWMoZWxldmF0b3JfZ29hbF8sIGFybV9nb2FsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdG9yX2dvYWxfdmVsb2NpdHlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2dvYWxfdmVsb2NpdHlfLCAmeF95X3Jlc3VsdCk7CisgICAgICAgICAgY3VycmVudCA8PCB4X3lfcmVzdWx0LmZyaWRnZV94LCB4X3lfcmVzdWx0LmZyaWRnZV94X3ZlbG9jaXR5OworICAgICAgICAgIHhfcHJvZmlsZV8uTW92ZUN1cnJlbnRTdGF0ZShjdXJyZW50KTsKKyAgICAgICAgICBjdXJyZW50IDw8IHhfeV9yZXN1bHQuZnJpZGdlX2gsIHhfeV9yZXN1bHQuZnJpZGdlX2hfdmVsb2NpdHk7CisgICAgICAgICAgeV9wcm9maWxlXy5Nb3ZlQ3VycmVudFN0YXRlKGN1cnJlbnQpOworCisgICAgICAgICAgbGFzdF9wcm9maWxpbmdfdHlwZV8gPSBuZXdfcHJvZmlsaW5nX3R5cGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3X3Byb2ZpbGluZ190eXBlID09IFByb2ZpbGluZ1R5cGU6OkFOR0xFX0hFSUdIVF9QUk9GSUxJTkcpIHsKKyAgICAgICAgICAvLyBQaWNrIGEgc2V0IG9mIHNhbmUgYXJtIGRlZmF1bHRzIGlmIG5vbmUgYXJlIHNwZWNpZmllZC4KKyAgICAgICAgICBhcm1fcHJvZmlsZV8uc2V0X21heGltdW1fdmVsb2NpdHkoCisgICAgICAgICAgICAgIFVzZVVubGVzc1plcm8odW5zYWZlX2dvYWwtPm1heF9hbmd1bGFyX3ZlbG9jaXR5LCAxLjApKTsKKyAgICAgICAgICBhcm1fcHJvZmlsZV8uc2V0X21heGltdW1fYWNjZWxlcmF0aW9uKAorICAgICAgICAgICAgICBVc2VVbmxlc3NaZXJvKHVuc2FmZV9nb2FsLT5tYXhfYW5ndWxhcl9hY2NlbGVyYXRpb24sIDMuMCkpOworICAgICAgICAgIGVsZXZhdG9yX3Byb2ZpbGVfLnNldF9tYXhpbXVtX3ZlbG9jaXR5KAorICAgICAgICAgICAgICBVc2VVbmxlc3NaZXJvKHVuc2FmZV9nb2FsLT5tYXhfdmVsb2NpdHksIDAuNTApKTsKKyAgICAgICAgICBlbGV2YXRvcl9wcm9maWxlXy5zZXRfbWF4aW11bV9hY2NlbGVyYXRpb24oCisgICAgICAgICAgICAgIFVzZVVubGVzc1plcm8odW5zYWZlX2dvYWwtPm1heF9hY2NlbGVyYXRpb24sIDIuMCkpOworCisgICAgICAgICAgLy8gVXNlIHRoZSBwcm9maWxlcyB0byBsaW1pdCB0aGUgYXJtJ3MgbW92ZW1lbnRzLgorICAgICAgICAgIGNvbnN0IGRvdWJsZSB1bmZpbHRlcmVkX2FybV9nb2FsID0gOjpzdGQ6Om1heCgKKyAgICAgICAgICAgICAgOjpzdGQ6Om1pbih1bnNhZmVfZ29hbC0+YW5nbGUsIHZhbHVlcy5mcmlkZ2UuYXJtLnVwcGVyX2xpbWl0KSwKKyAgICAgICAgICAgICAgdmFsdWVzLmZyaWRnZS5hcm0ubG93ZXJfbGltaXQpOworICAgICAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGFybV9nb2FsX3N0YXRlID0gYXJtX3Byb2ZpbGVfLlVwZGF0ZSgKKyAgICAgICAgICAgICAgdW5maWx0ZXJlZF9hcm1fZ29hbCwgdW5zYWZlX2dvYWwtPmFuZ3VsYXJfdmVsb2NpdHkpOworICAgICAgICAgIGFybV9nb2FsXyA9IGFybV9nb2FsX3N0YXRlKDAsIDApOworICAgICAgICAgIGFybV9nb2FsX3ZlbG9jaXR5XyA9IGFybV9nb2FsX3N0YXRlKDEsIDApOworCisgICAgICAgICAgLy8gVXNlIHRoZSBwcm9maWxlcyB0byBsaW1pdCB0aGUgZWxldmF0b3IncyBtb3ZlbWVudHMuCisgICAgICAgICAgY29uc3QgZG91YmxlIHVuZmlsdGVyZWRfZWxldmF0b3JfZ29hbCA9CisgICAgICAgICAgICAgIDo6c3RkOjptYXgoOjpzdGQ6Om1pbih1bnNhZmVfZ29hbC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmZyaWRnZS5lbGV2YXRvci51cHBlcl9saW1pdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9saW1pdCk7CisgICAgICAgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gZWxldmF0b3JfZ29hbF9zdGF0ZSA9CisgICAgICAgICAgICAgIGVsZXZhdG9yX3Byb2ZpbGVfLlVwZGF0ZSh1bmZpbHRlcmVkX2VsZXZhdG9yX2dvYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhZmVfZ29hbC0+dmVsb2NpdHkpOworICAgICAgICAgIGVsZXZhdG9yX2dvYWxfID0gZWxldmF0b3JfZ29hbF9zdGF0ZSgwLCAwKTsKKyAgICAgICAgICBlbGV2YXRvcl9nb2FsX3ZlbG9jaXR5XyA9IGVsZXZhdG9yX2dvYWxfc3RhdGUoMSwgMCk7CisgICAgICAgIH0gZWxzZSBpZiAobmV3X3Byb2ZpbGluZ190eXBlID09IFByb2ZpbGluZ1R5cGU6OlhfWV9QUk9GSUxJTkcpIHsKKyAgICAgICAgICAvLyBVc2UgeC95IHByb2ZpbGluZworICAgICAgICAgIGFvczo6dXRpbDo6RWxldmF0b3JBcm1LaW5lbWF0aWNzOjpLaW5lbWF0aWNSZXN1bHQga2luZW1hdGljX3Jlc3VsdDsKKworICAgICAgICAgIHhfcHJvZmlsZV8uc2V0X21heGltdW1fdmVsb2NpdHkoCisgICAgICAgICAgICAgIFVzZVVubGVzc1plcm8odW5zYWZlX2dvYWwtPm1heF94X3ZlbG9jaXR5LCAwLjUpKTsKKyAgICAgICAgICB4X3Byb2ZpbGVfLnNldF9tYXhpbXVtX2FjY2VsZXJhdGlvbigKKyAgICAgICAgICAgICAgVXNlVW5sZXNzWmVybyh1bnNhZmVfZ29hbC0+bWF4X3hfYWNjZWxlcmF0aW9uLCAyLjApKTsKKyAgICAgICAgICB5X3Byb2ZpbGVfLnNldF9tYXhpbXVtX3ZlbG9jaXR5KAorICAgICAgICAgICAgICBVc2VVbmxlc3NaZXJvKHVuc2FmZV9nb2FsLT5tYXhfeV92ZWxvY2l0eSwgMC41MCkpOworICAgICAgICAgIHlfcHJvZmlsZV8uc2V0X21heGltdW1fYWNjZWxlcmF0aW9uKAorICAgICAgICAgICAgICBVc2VVbmxlc3NaZXJvKHVuc2FmZV9nb2FsLT5tYXhfeV9hY2NlbGVyYXRpb24sIDIuMCkpOworCisgICAgICAgICAgLy8gTGltaXQgdGhlIGdvYWxzIGJlZm9yZSB3ZSB1cGRhdGUgdGhlIHByb2ZpbGVzLgorICAgICAgICAgIGtpbmVtYXRpY3NfLkludmVyc2VLaW5lbWF0aWMoCisgICAgICAgICAgICAgIHVuc2FmZV9nb2FsLT54LCB1bnNhZmVfZ29hbC0+eSwgdW5zYWZlX2dvYWwtPnhfdmVsb2NpdHksCisgICAgICAgICAgICAgIHVuc2FmZV9nb2FsLT55X3ZlbG9jaXR5LCAma2luZW1hdGljX3Jlc3VsdCk7CisKKyAgICAgICAgICAvLyBVc2UgdGhlIHByb2ZpbGVzIHRvIGxpbWl0IHRoZSB4IG1vdmVtZW50cy4KKyAgICAgICAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiB4X2dvYWxfc3RhdGUgPSB4X3Byb2ZpbGVfLlVwZGF0ZSgKKyAgICAgICAgICAgICAga2luZW1hdGljX3Jlc3VsdC5mcmlkZ2VfeCwga2luZW1hdGljX3Jlc3VsdC5mcmlkZ2VfeF92ZWxvY2l0eSk7CisKKyAgICAgICAgICAvLyBVc2UgdGhlIHByb2ZpbGVzIHRvIGxpbWl0IHRoZSB5IG1vdmVtZW50cy4KKyAgICAgICAgICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiB5X2dvYWxfc3RhdGUgPSB5X3Byb2ZpbGVfLlVwZGF0ZSgKKyAgICAgICAgICAgICAga2luZW1hdGljX3Jlc3VsdC5mcmlkZ2VfaCwga2luZW1hdGljX3Jlc3VsdC5mcmlkZ2VfaF92ZWxvY2l0eSk7CisKKyAgICAgICAgICAvLyBDb252ZXJ0IHgveSBnb2FsIHN0YXRlcyBpbnRvIGFybS9lbGV2YXRvciBnb2Fscy4KKyAgICAgICAgICAvLyBUaGUgaW52ZXJzZSBraW5lbWF0aWNzIGZ1bmN0aW9ucyBhdXRvbWF0aWNhbGx5IHBlcmZvcm0gcmFuZ2UKKyAgICAgICAgICAvLyBjaGVja2luZyBhbmQgYWRqdXN0IHRoZSByZXN1bHRzIHNvIHRoYXQgdGhleSdyZSBhbHdheXMgdmFsaWQuCisgICAgICAgICAga2luZW1hdGljc18uSW52ZXJzZUtpbmVtYXRpYyh4X2dvYWxfc3RhdGUoMCwgMCksIHlfZ29hbF9zdGF0ZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfZ29hbF9zdGF0ZSgxLCAwKSwgeV9nb2FsX3N0YXRlKDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtpbmVtYXRpY19yZXN1bHQpOworCisgICAgICAgICAgLy8gU3RvcmUgdGhlIGFwcHJvcHJpYXRlIGludmVyc2Uga2luZW1hdGljIHJlc3VsdHMgaW4gdGhlCisgICAgICAgICAgLy8gYXJtL2VsZXZhdG9yIGdvYWxzLgorICAgICAgICAgIGFybV9nb2FsXyA9IGtpbmVtYXRpY19yZXN1bHQuYXJtX2FuZ2xlOworICAgICAgICAgIGFybV9nb2FsX3ZlbG9jaXR5XyA9IGtpbmVtYXRpY19yZXN1bHQuYXJtX3ZlbG9jaXR5OworCisgICAgICAgICAgZWxldmF0b3JfZ29hbF8gPSBraW5lbWF0aWNfcmVzdWx0LmVsZXZhdG9yX2hlaWdodDsKKyAgICAgICAgICBlbGV2YXRvcl9nb2FsX3ZlbG9jaXR5XyA9IGtpbmVtYXRpY19yZXN1bHQuYXJtX3ZlbG9jaXR5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIExPRyhFUlJPUiwgIlVua25vd24gcHJvZmlsaW5nX3R5cGU6ICVkXG4iLAorICAgICAgICAgICAgICB1bnNhZmVfZ29hbC0+cHJvZmlsaW5nX3R5cGUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFVwZGF0ZSBzdGF0ZV8gdG8gYWNjdXJhdGVseSByZXByZXNlbnQgdGhlIHN0YXRlIG9mIHRoZSB6ZXJvaW5nCisgICAgICAvLyBlc3RpbWF0b3JzLgorICAgICAgVXBkYXRlWmVyb2luZ1N0YXRlKCk7CisKKyAgICAgIGlmIChzdGF0ZV8gIT0gUlVOTklORyAmJiBzdGF0ZV8gIT0gRVNUT1ApIHsKKyAgICAgICAgc3RhdGVfID0gVU5JTklUSUFMSVpFRDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFU1RPUDoKKyAgICAgIExPRyhFUlJPUiwgIkVzdG9wXG4iKTsKKyAgICAgIGRpc2FibGUgPSB0cnVlOworICAgICAgYnJlYWs7CisgIH0KKworICAvLyBDb21tZW5jZSBkZWF0aCBpZiBlaXRoZXIgbGVmdC9yaWdodCB0cmFja2luZyBlcnJvciBnZXRzIHRvbyBiaWcuIFRoaXMKKyAgLy8gc2hvdWxkIHJ1biBpbW1lZGlhdGVseSBhZnRlciB0aGUgU2V0QXJtT2Zmc2V0IGFuZCBTZXRFbGV2YXRvck9mZnNldAorICAvLyBmdW5jdGlvbnMgdG8gZG91YmxlLWNoZWNrIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGluIGEgc2FuZSBzdGF0ZS4KKyAgaWYgKDo6c3RkOjphYnMobGVmdF9hcm0oKSAtIHJpZ2h0X2FybSgpKSA+PQorICAgICAgdmFsdWVzLm1heF9hbGxvd2VkX2xlZnRfcmlnaHRfYXJtX2RpZmZlcmVuY2UpIHsKKyAgICBMT0coRVJST1IsICJUaGUgYXJtcyBhcmUgdG9vIGZhciBhcGFydC4gIHwlZiAtICVmfCA+ICVmXG4iLCBsZWZ0X2FybSgpLAorICAgICAgICByaWdodF9hcm0oKSwgdmFsdWVzLm1heF9hbGxvd2VkX2xlZnRfcmlnaHRfYXJtX2RpZmZlcmVuY2UpOworCisgICAgLy8gSW5kaWNhdGUgYW4gRVNUT1AgY29uZGl0aW9uIGFuZCBzdG9wIHRoZSBtb3RvcnMuCisgICAgaWYgKG91dHB1dCkgeworICAgICAgc3RhdGVfID0gRVNUT1A7CisgICAgfQorICAgIGRpc2FibGUgPSB0cnVlOworICB9CisKKyAgaWYgKDo6c3RkOjphYnMobGVmdF9lbGV2YXRvcigpIC0gcmlnaHRfZWxldmF0b3IoKSkgPj0KKyAgICAgIHZhbHVlcy5tYXhfYWxsb3dlZF9sZWZ0X3JpZ2h0X2VsZXZhdG9yX2RpZmZlcmVuY2UpIHsKKyAgICBMT0coRVJST1IsICJUaGUgZWxldmF0b3JzIGFyZSB0b28gZmFyIGFwYXJ0LiAgfCVmIC0gJWZ8ID4gJWZcbiIsCisgICAgICAgIGxlZnRfZWxldmF0b3IoKSwgcmlnaHRfZWxldmF0b3IoKSwKKyAgICAgICAgdmFsdWVzLm1heF9hbGxvd2VkX2xlZnRfcmlnaHRfZWxldmF0b3JfZGlmZmVyZW5jZSk7CisKKyAgICAvLyBJbmRpY2F0ZSBhbiBFU1RPUCBjb25kaXRpb24gYW5kIHN0b3AgdGhlIG1vdG9ycy4KKyAgICBpZiAob3V0cHV0KSB7CisgICAgICBzdGF0ZV8gPSBFU1RPUDsKKyAgICB9CisgICAgZGlzYWJsZSA9IHRydWU7CisgIH0KKworICAvLyBMaW1pdCB0aGUgZ29hbHMgc28gd2UgY2FuJ3QgZXhjZWVkIHRoZSBoYXJkd2FyZSBsaW1pdHMgaWYgd2UgYXJlIFJVTk5JTkcuCisgIGlmIChzdGF0ZV8gPT0gUlVOTklORykgeworICAgIC8vIExpbWl0IHRoZSBhcm0gZ29hbCB0byBtaW4vbWF4IGFsbG93YWJsZSBhbmdsZXMuCisgICAgaWYgKGFybV9nb2FsXyA+PSB2YWx1ZXMuZnJpZGdlLmFybS51cHBlcl9saW1pdCkgeworICAgICAgTE9HKFdBUk5JTkcsICJBcm0gZ29hbCBhYm92ZSBsaW1pdCwgJWYgPiAlZlxuIiwgYXJtX2dvYWxfLAorICAgICAgICAgIHZhbHVlcy5mcmlkZ2UuYXJtLnVwcGVyX2xpbWl0KTsKKyAgICAgIGFybV9nb2FsXyA9IHZhbHVlcy5mcmlkZ2UuYXJtLnVwcGVyX2xpbWl0OworICAgIH0KKyAgICBpZiAoYXJtX2dvYWxfIDw9IHZhbHVlcy5mcmlkZ2UuYXJtLmxvd2VyX2xpbWl0KSB7CisgICAgICBMT0coV0FSTklORywgIkFybSBnb2FsIGJlbG93IGxpbWl0LCAlZiA8ICVmXG4iLCBhcm1fZ29hbF8sCisgICAgICAgICAgdmFsdWVzLmZyaWRnZS5hcm0ubG93ZXJfbGltaXQpOworICAgICAgYXJtX2dvYWxfID0gdmFsdWVzLmZyaWRnZS5hcm0ubG93ZXJfbGltaXQ7CisgICAgfQorCisgICAgLy8gTGltaXQgdGhlIGVsZXZhdG9yIGdvYWwgdG8gbWluL21heCBhbGxvd2FibGUgaGVpZ2h0cy4KKyAgICBpZiAoZWxldmF0b3JfZ29hbF8gPj0gdmFsdWVzLmZyaWRnZS5lbGV2YXRvci51cHBlcl9saW1pdCkgeworICAgICAgTE9HKFdBUk5JTkcsICJFbGV2YXRvciBnb2FsIGFib3ZlIGxpbWl0LCAlZiA+ICVmXG4iLCBlbGV2YXRvcl9nb2FsXywKKyAgICAgICAgICB2YWx1ZXMuZnJpZGdlLmVsZXZhdG9yLnVwcGVyX2xpbWl0KTsKKyAgICAgIGVsZXZhdG9yX2dvYWxfID0gdmFsdWVzLmZyaWRnZS5lbGV2YXRvci51cHBlcl9saW1pdDsKKyAgICB9CisgICAgaWYgKGVsZXZhdG9yX2dvYWxfIDw9IHZhbHVlcy5mcmlkZ2UuZWxldmF0b3IubG93ZXJfbGltaXQpIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiRWxldmF0b3IgZ29hbCBiZWxvdyBsaW1pdCwgJWYgPCAlZlxuIiwgZWxldmF0b3JfZ29hbF8sCisgICAgICAgICAgdmFsdWVzLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9saW1pdCk7CisgICAgICBlbGV2YXRvcl9nb2FsXyA9IHZhbHVlcy5mcmlkZ2UuZWxldmF0b3IubG93ZXJfbGltaXQ7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgdGhlIGxvd2VyIGxldmVsIGhhcmR3YXJlIGxpbWl0IGFzIHdlbGwuCisgIGlmIChzdGF0ZV8gPT0gUlVOTklORykgeworICAgIGlmIChsZWZ0X2FybSgpID49IHZhbHVlcy5mcmlkZ2UuYXJtLnVwcGVyX2hhcmRfbGltaXQgfHwKKyAgICAgICAgbGVmdF9hcm0oKSA8PSB2YWx1ZXMuZnJpZGdlLmFybS5sb3dlcl9oYXJkX2xpbWl0KSB7CisgICAgICBMT0coRVJST1IsICJMZWZ0IGFybSBhdCAlZiBvdXQgb2YgYm91bmRzIFslZiwgJWZdLCBFU1RPUGluZ1xuIiwKKyAgICAgICAgICBsZWZ0X2FybSgpLCB2YWx1ZXMuZnJpZGdlLmFybS5sb3dlcl9oYXJkX2xpbWl0LAorICAgICAgICAgIHZhbHVlcy5mcmlkZ2UuYXJtLnVwcGVyX2hhcmRfbGltaXQpOworICAgICAgaWYgKG91dHB1dCkgeworICAgICAgICBzdGF0ZV8gPSBFU1RPUDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmlnaHRfYXJtKCkgPj0gdmFsdWVzLmZyaWRnZS5hcm0udXBwZXJfaGFyZF9saW1pdCB8fAorICAgICAgICByaWdodF9hcm0oKSA8PSB2YWx1ZXMuZnJpZGdlLmFybS5sb3dlcl9oYXJkX2xpbWl0KSB7CisgICAgICBMT0coRVJST1IsICJSaWdodCBhcm0gYXQgJWYgb3V0IG9mIGJvdW5kcyBbJWYsICVmXSwgRVNUT1BpbmdcbiIsCisgICAgICAgICAgcmlnaHRfYXJtKCksIHZhbHVlcy5mcmlkZ2UuYXJtLmxvd2VyX2hhcmRfbGltaXQsCisgICAgICAgICAgdmFsdWVzLmZyaWRnZS5hcm0udXBwZXJfaGFyZF9saW1pdCk7CisgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIHN0YXRlXyA9IEVTVE9QOworICAgICAgfQorICAgIH0KKworICAgIGlmIChsZWZ0X2VsZXZhdG9yKCkgPj0gdmFsdWVzLmZyaWRnZS5lbGV2YXRvci51cHBlcl9oYXJkX2xpbWl0KSB7CisgICAgICBMT0coRVJST1IsICJMZWZ0IGVsZXZhdG9yIGF0ICVmIG91dCBvZiBib3VuZHMgWyVmLCAlZl0sIEVTVE9QaW5nXG4iLAorICAgICAgICAgIGxlZnRfZWxldmF0b3IoKSwgdmFsdWVzLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9oYXJkX2xpbWl0LAorICAgICAgICAgIHZhbHVlcy5mcmlkZ2UuZWxldmF0b3IudXBwZXJfaGFyZF9saW1pdCk7CisgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIHN0YXRlXyA9IEVTVE9QOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyaWdodF9lbGV2YXRvcigpID49IHZhbHVlcy5mcmlkZ2UuZWxldmF0b3IudXBwZXJfaGFyZF9saW1pdCkgeworICAgICAgTE9HKEVSUk9SLCAiUmlnaHQgZWxldmF0b3IgYXQgJWYgb3V0IG9mIGJvdW5kcyBbJWYsICVmXSwgRVNUT1BpbmdcbiIsCisgICAgICAgICAgcmlnaHRfZWxldmF0b3IoKSwgdmFsdWVzLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9oYXJkX2xpbWl0LAorICAgICAgICAgIHZhbHVlcy5mcmlkZ2UuZWxldmF0b3IudXBwZXJfaGFyZF9saW1pdCk7CisgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIHN0YXRlXyA9IEVTVE9QOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFNldCB0aGUgZ29hbHMuCisgIGFybV9sb29wXy0+bXV0YWJsZV9SKCkgPDwgYXJtX2dvYWxfLCBhcm1fZ29hbF92ZWxvY2l0eV8sIDAuMCwgMC4wLCAwLjA7CisgIGVsZXZhdG9yX2xvb3BfLT5tdXRhYmxlX1IoKSA8PCBlbGV2YXRvcl9nb2FsXywgZWxldmF0b3JfZ29hbF92ZWxvY2l0eV8sIDAuMCwKKyAgICAgIDAuMDsKKworICBjb25zdCBkb3VibGUgbWF4X3ZvbHRhZ2UgPSBzdGF0ZV8gPT0gUlVOTklORyA/IDEyLjAgOiBrWmVyb2luZ1ZvbHRhZ2U7CisgIGFybV9sb29wXy0+c2V0X21heF92b2x0YWdlKG1heF92b2x0YWdlKTsKKyAgZWxldmF0b3JfbG9vcF8tPnNldF9tYXhfdm9sdGFnZShtYXhfdm9sdGFnZSk7CisKKyAgaWYgKHN0YXRlXyA9PSBFU1RPUCkgeworICAgIGRpc2FibGUgPSB0cnVlOworICB9CisgIGFybV9sb29wXy0+VXBkYXRlKGRpc2FibGUpOworICBlbGV2YXRvcl9sb29wXy0+VXBkYXRlKGRpc2FibGUpOworCisgIGlmIChzdGF0ZV8gPT0gSU5JVElBTElaSU5HIHx8IHN0YXRlXyA9PSBaRVJPSU5HX0VMRVZBVE9SIHx8CisgICAgICBzdGF0ZV8gPT0gWkVST0lOR19BUk0pIHsKKyAgICBpZiAoYXJtX2xvb3BfLT5VKCkgIT0gYXJtX2xvb3BfLT5VX3VuY2FwcGVkKCkpIHsKKyAgICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBkZWx0YVIgPQorICAgICAgICAgIGFybV9sb29wXy0+VW5zYXR1cmF0ZU91dHB1dEdvYWxDaGFuZ2UoKTsKKworICAgICAgLy8gTW92ZSB0aGUgYXZlcmFnZSBhcm0gZ29hbCBieSB0aGUgYW1vdW50IG9ic2VydmVkLgorICAgICAgTE9HKFdBUk5JTkcsICJNb3ZpbmcgYXJtIGdvYWwgYnkgJWYgdG8gaGFuZGxlIHNhdHVyYXRpb25cbiIsCisgICAgICAgICAgZGVsdGFSKDAsIDApKTsKKyAgICAgIGFybV9nb2FsXyArPSBkZWx0YVIoMCwgMCk7CisgICAgfQorCisgICAgaWYgKGVsZXZhdG9yX2xvb3BfLT5VKCkgIT0gZWxldmF0b3JfbG9vcF8tPlVfdW5jYXBwZWQoKSkgeworICAgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGRlbHRhUiA9CisgICAgICAgICAgZWxldmF0b3JfbG9vcF8tPlVuc2F0dXJhdGVPdXRwdXRHb2FsQ2hhbmdlKCk7CisKKyAgICAgIC8vIE1vdmUgdGhlIGF2ZXJhZ2UgZWxldmF0b3IgZ29hbCBieSB0aGUgYW1vdW50IG9ic2VydmVkLgorICAgICAgTE9HKFdBUk5JTkcsICJNb3ZpbmcgZWxldmF0b3IgZ29hbCBieSAlZiB0byBoYW5kbGUgc2F0dXJhdGlvblxuIiwKKyAgICAgICAgICBkZWx0YVIoMCwgMCkpOworICAgICAgZWxldmF0b3JfZ29hbF8gKz0gZGVsdGFSKDAsIDApOworICAgIH0KKyAgfQorCisgIGlmIChvdXRwdXQpIHsKKyAgICBvdXRwdXQtPmxlZnRfYXJtID0gYXJtX2xvb3BfLT5VKDAsIDApOworICAgIG91dHB1dC0+cmlnaHRfYXJtID0gYXJtX2xvb3BfLT5VKDEsIDApOworICAgIG91dHB1dC0+bGVmdF9lbGV2YXRvciA9IGVsZXZhdG9yX2xvb3BfLT5VKDAsIDApOworICAgIG91dHB1dC0+cmlnaHRfZWxldmF0b3IgPSBlbGV2YXRvcl9sb29wXy0+VSgxLCAwKTsKKyAgICBpZiAodW5zYWZlX2dvYWwpIHsKKyAgICAgIG91dHB1dC0+Z3JhYmJlcnMgPSB1bnNhZmVfZ29hbC0+Z3JhYmJlcnM7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dC0+Z3JhYmJlcnMudG9wX2Zyb250ID0gZmFsc2U7CisgICAgICBvdXRwdXQtPmdyYWJiZXJzLnRvcF9iYWNrID0gZmFsc2U7CisgICAgICBvdXRwdXQtPmdyYWJiZXJzLmJvdHRvbV9mcm9udCA9IGZhbHNlOworICAgICAgb3V0cHV0LT5ncmFiYmVycy5ib3R0b21fYmFjayA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8oYXVzdGluKTogUG9wdWxhdGUgdGhlc2UgZnVsbHkuCisgIHN0YXR1cy0+emVyb2VkID0gc3RhdGVfID09IFJVTk5JTkc7CisKKyAgc3RhdHVzLT5hbmdsZSA9IGFybV9sb29wXy0+WF9oYXQoMCwgMCk7CisgIHN0YXR1cy0+YW5ndWxhcl92ZWxvY2l0eSA9IGFybV9sb29wXy0+WF9oYXQoMSwgMCk7CisgIHN0YXR1cy0+aGVpZ2h0ID0gZWxldmF0b3JfbG9vcF8tPlhfaGF0KDAsIDApOworICBzdGF0dXMtPnZlbG9jaXR5ID0gZWxldmF0b3JfbG9vcF8tPlhfaGF0KDEsIDApOworCisgIHN0YXR1cy0+Z29hbF9hbmdsZSA9IGFybV9nb2FsXzsKKyAgc3RhdHVzLT5nb2FsX2FuZ3VsYXJfdmVsb2NpdHkgPSBhcm1fZ29hbF92ZWxvY2l0eV87CisgIHN0YXR1cy0+Z29hbF9oZWlnaHQgPSBlbGV2YXRvcl9nb2FsXzsKKyAgc3RhdHVzLT5nb2FsX3ZlbG9jaXR5ID0gZWxldmF0b3JfZ29hbF92ZWxvY2l0eV87CisKKyAgLy8gUG9wdWxhdGUgdGhlIHNhbWUgc3RhdHVzLCBidXQgaW4gWC9ZIGNvLW9yZGluYXRlcy4KKyAgYW9zOjp1dGlsOjpFbGV2YXRvckFybUtpbmVtYXRpY3M6OktpbmVtYXRpY1Jlc3VsdCB4X3lfc3RhdHVzOworICBraW5lbWF0aWNzXy5Gb3J3YXJkS2luZW1hdGljKHN0YXR1cy0+aGVpZ2h0LCBzdGF0dXMtPmFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy0+dmVsb2NpdHksIHN0YXR1cy0+YW5ndWxhcl92ZWxvY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeF95X3N0YXR1cyk7CisgIHN0YXR1cy0+eCA9IHhfeV9zdGF0dXMuZnJpZGdlX3g7CisgIHN0YXR1cy0+eSA9IHhfeV9zdGF0dXMuZnJpZGdlX2g7CisgIHN0YXR1cy0+eF92ZWxvY2l0eSA9IHhfeV9zdGF0dXMuZnJpZGdlX3hfdmVsb2NpdHk7CisgIHN0YXR1cy0+eV92ZWxvY2l0eSA9IHhfeV9zdGF0dXMuZnJpZGdlX2hfdmVsb2NpdHk7CisKKyAga2luZW1hdGljc18uRm9yd2FyZEtpbmVtYXRpYyhzdGF0dXMtPmdvYWxfaGVpZ2h0LCBzdGF0dXMtPmdvYWxfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLT5nb2FsX3ZlbG9jaXR5LCBzdGF0dXMtPmdvYWxfYW5ndWxhcl92ZWxvY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeF95X3N0YXR1cyk7CisgIHN0YXR1cy0+Z29hbF94ID0geF95X3N0YXR1cy5mcmlkZ2VfeDsKKyAgc3RhdHVzLT5nb2FsX3kgPSB4X3lfc3RhdHVzLmZyaWRnZV9oOworICBzdGF0dXMtPmdvYWxfeF92ZWxvY2l0eSA9IHhfeV9zdGF0dXMuZnJpZGdlX3hfdmVsb2NpdHk7CisgIHN0YXR1cy0+Z29hbF95X3ZlbG9jaXR5ID0geF95X3N0YXR1cy5mcmlkZ2VfaF92ZWxvY2l0eTsKKworICBpZiAodW5zYWZlX2dvYWwpIHsKKyAgICBzdGF0dXMtPmdyYWJiZXJzID0gdW5zYWZlX2dvYWwtPmdyYWJiZXJzOworICB9IGVsc2UgeworICAgIHN0YXR1cy0+Z3JhYmJlcnMudG9wX2Zyb250ID0gZmFsc2U7CisgICAgc3RhdHVzLT5ncmFiYmVycy50b3BfYmFjayA9IGZhbHNlOworICAgIHN0YXR1cy0+Z3JhYmJlcnMuYm90dG9tX2Zyb250ID0gZmFsc2U7CisgICAgc3RhdHVzLT5ncmFiYmVycy5ib3R0b21fYmFjayA9IGZhbHNlOworICB9CisgIHplcm9pbmc6OlBvcHVsYXRlRXN0aW1hdG9yU3RhdGUobGVmdF9hcm1fZXN0aW1hdG9yXywgJnN0YXR1cy0+bGVmdF9hcm1fc3RhdGUpOworICB6ZXJvaW5nOjpQb3B1bGF0ZUVzdGltYXRvclN0YXRlKHJpZ2h0X2FybV9lc3RpbWF0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMtPnJpZ2h0X2FybV9zdGF0ZSk7CisgIHplcm9pbmc6OlBvcHVsYXRlRXN0aW1hdG9yU3RhdGUobGVmdF9lbGV2YXRvcl9lc3RpbWF0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMtPmxlZnRfZWxldmF0b3Jfc3RhdGUpOworICB6ZXJvaW5nOjpQb3B1bGF0ZUVzdGltYXRvclN0YXRlKHJpZ2h0X2VsZXZhdG9yX2VzdGltYXRvcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cy0+cmlnaHRfZWxldmF0b3Jfc3RhdGUpOworICBzdGF0dXMtPmVzdG9wcGVkID0gKHN0YXRlXyA9PSBFU1RPUCk7CisgIHN0YXR1cy0+c3RhdGUgPSBzdGF0ZV87CisgIGxhc3Rfc3RhdGVfID0gc3RhdGVfOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLmd5cCBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4NDRjNAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5neXAKQEAgLTAsMCArMSw4OSBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAncmVwbGF5X2ZyaWRnZScsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdub19yc3luYyc6IDEsCisgICAgICB9LAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdyZXBsYXlfZnJpZGdlLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnZnJpZGdlX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOnJlcGxheV9jb250cm9sX2xvb3AnLAorICAgICAgICAnPChBT1MpL2xpbnV4X2NvZGUvbGludXhfY29kZS5neXA6aW5pdCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2ZyaWRnZV9xdWV1ZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsnZnJpZGdlLnEnXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdoZWFkZXJfcGF0aCc6ICd5MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZScsCisgICAgICB9LAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcF9xdWV1ZXMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6cXVldWVzJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS96ZXJvaW5nL3plcm9pbmcuZ3lwOnplcm9pbmcnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3F1ZXVlcycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpxdWV1ZXMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3plcm9pbmcvemVyb2luZy5neXA6emVyb2luZycsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi8uLi9hb3MvYnVpbGQvcXVldWVzLmd5cGknXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdmcmlkZ2VfbGliJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZnJpZGdlLmNjJywKKyAgICAgICAgJ2ludGVncmFsX2FybV9wbGFudC5jYycsCisgICAgICAgICdlbGV2YXRvcl9tb3Rvcl9wbGFudC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2ZyaWRnZV9xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnRyYXBlem9pZF9wcm9maWxlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L3kyMDE1Lmd5cDpjb25zdGFudHMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy92b2x0YWdlX2NhcC92b2x0YWdlX2NhcC5neXA6dm9sdGFnZV9jYXAnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnZnJpZGdlX3F1ZXVlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29udHJvbHMvY29udHJvbHMuZ3lwOmNvbnRyb2xfbG9vcCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6dHJhcGV6b2lkX3Byb2ZpbGUnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2ZyaWRnZV9saWJfdGVzdCcsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZnJpZGdlX2xpYl90ZXN0LmNjJywKKyAgICAgICAgJ2FybV9tb3Rvcl9wbGFudC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTpndGVzdCcsCisgICAgICAgICdmcmlkZ2VfbGliJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnN0YXRlX2ZlZWRiYWNrX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb250cm9scy9jb250cm9scy5neXA6Y29udHJvbF9sb29wX3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6cG9zaXRpb25fc2Vuc29yX3NpbScsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDp0ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50JywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZnJpZGdlJywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdmcmlkZ2VfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnZnJpZGdlX2xpYicsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuaCBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDhlMDkKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuaApAQCAtMCwwICsxLDE3MiBAQAorI2lmbmRlZiBZMjAxNV9DT05UUk9MX0xPT1BTX0ZSSURHRV9IXworI2RlZmluZSBZMjAxNV9DT05UUk9MX0xPT1BTX0ZSSURHRV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvdHJhcGV6b2lkX3Byb2ZpbGUuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLnEuaCIKKyNpbmNsdWRlICJmcmM5NzEvemVyb2luZy96ZXJvaW5nLmgiCisjaW5jbHVkZSAieTIwMTUvdXRpbC9raW5lbWF0aWNzLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworbmFtZXNwYWNlIHRlc3RpbmcgeworY2xhc3MgRnJpZGdlVGVzdF9EaXNhYmxlZEdvYWxUZXN0X1Rlc3Q7CitjbGFzcyBGcmlkZ2VUZXN0X0FybUdvYWxQb3NpdGl2ZVdpbmR1cFRlc3RfVGVzdDsKK2NsYXNzIEZyaWRnZVRlc3RfRWxldmF0b3JHb2FsUG9zaXRpdmVXaW5kdXBUZXN0X1Rlc3Q7CitjbGFzcyBGcmlkZ2VUZXN0X0FybUdvYWxOZWdhdGl2ZVdpbmR1cFRlc3RfVGVzdDsKK2NsYXNzIEZyaWRnZVRlc3RfRWxldmF0b3JHb2FsTmVnYXRpdmVXaW5kdXBUZXN0X1Rlc3Q7CitjbGFzcyBGcmlkZ2VUZXN0X1NhZmVBcm1aZXJvaW5nX1Rlc3Q7Cit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCit0ZW1wbGF0ZTxpbnQgUz4KK2NsYXNzIENhcHBlZFN0YXRlRmVlZGJhY2tMb29wIDogcHVibGljIFN0YXRlRmVlZGJhY2tMb29wPFMsIDIsIDI+IHsKKyBwdWJsaWM6CisgIENhcHBlZFN0YXRlRmVlZGJhY2tMb29wKFN0YXRlRmVlZGJhY2tMb29wPFMsIDIsIDI+ICYmbG9vcCkKKyAgICAgIDogU3RhdGVGZWVkYmFja0xvb3A8UywgMiwgMj4oOjpzdGQ6Om1vdmUobG9vcCkpLCBtYXhfdm9sdGFnZV8oMTIuMCkge30KKworICB2b2lkIHNldF9tYXhfdm9sdGFnZShkb3VibGUgbWF4X3ZvbHRhZ2UpIHsKKyAgICBtYXhfdm9sdGFnZV8gPSA6OnN0ZDo6bWF4KDAuMCwgOjpzdGQ6Om1pbigxMi4wLCBtYXhfdm9sdGFnZSkpOworICB9CisKKyAgdm9pZCBDYXBVKCkgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0aGUgYW1vdW50IHRvIGNoYW5nZSB0aGUgcG9zaXRpb24gZ29hbHMgKGF2ZXJhZ2UgYW5kIGRpZmZlcmVuY2UpIGluCisgIC8vIG9yZGVyIHRvIG5vIGxvbmdlciBzYXR1cmF0ZSB0aGUgY29udHJvbGxlci4KKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVuc2F0dXJhdGVPdXRwdXRHb2FsQ2hhbmdlKCk7CisKKyBwcml2YXRlOgorICBkb3VibGUgbWF4X3ZvbHRhZ2VfOworfTsKKworY2xhc3MgRnJpZGdlCisgICAgOiBwdWJsaWMgYW9zOjpjb250cm9sczo6Q29udHJvbExvb3A8Y29udHJvbF9sb29wczo6RnJpZGdlUXVldWU+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEZyaWRnZSgKKyAgICAgIGNvbnRyb2xfbG9vcHM6OkZyaWRnZVF1ZXVlICpmcmlkZ2VfcXVldWUgPSAmY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlKTsKKworICBlbnVtIFN0YXRlIHsKKyAgICAvLyBXYWl0aW5nIHRvIHJlY2VpdmUgZGF0YSBiZWZvcmUgZG9pbmcgYW55dGhpbmcuCisgICAgVU5JTklUSUFMSVpFRCA9IDAsCisgICAgLy8gRXN0aW1hdGluZyB0aGUgc3RhcnRpbmcgbG9jYXRpb24uCisgICAgSU5JVElBTElaSU5HID0gMSwKKyAgICAvLyBNb3ZpbmcgdGhlIGVsZXZhdG9yIHRvIGZpbmQgYW4gaW5kZXggcHVsc2UuCisgICAgWkVST0lOR19FTEVWQVRPUiA9IDIsCisgICAgLy8gTW92aW5nIHRoZSBhcm0gdG8gZmluZCBhbiBpbmRleCBwdWxzZS4KKyAgICBaRVJPSU5HX0FSTSA9IDMsCisgICAgLy8gQWxsIGdvb2QhCisgICAgUlVOTklORyA9IDQsCisgICAgLy8gSW50ZXJuYWwgZXJyb3IgY2F1c2VkIHRoZSBmcmlkZ2UgdG8gYWJvcnQuCisgICAgRVNUT1AgPSA1LAorICB9OworCisgIGVudW0gY2xhc3MgUHJvZmlsaW5nVHlwZSA6IGludDMyX3QgeworICAgIC8vIFVzZSBhbmdsZS9oZWlnaHQgdG8gc3BlY2lmeSB0aGUgZnJpZGdlIGdvYWwuCisgICAgQU5HTEVfSEVJR0hUX1BST0ZJTElORyA9IDAsCisgICAgLy8gVXNlIHgveSBjby1vcmRpbmF0ZXMgdG8gc3BlY2lmeSB0aGUgZnJpZGdlIGdvYWwuCisgICAgWF9ZX1BST0ZJTElORyA9IDEsCisgIH07CisKKyAgU3RhdGUgc3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZV87IH0KKworIHByb3RlY3RlZDoKKyAgdm9pZCBSdW5JdGVyYXRpb24oY29uc3QgY29udHJvbF9sb29wczo6RnJpZGdlUXVldWU6OkdvYWwgKmdvYWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xfbG9vcHM6OkZyaWRnZVF1ZXVlOjpQb3NpdGlvbiAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfbG9vcHM6OkZyaWRnZVF1ZXVlOjpPdXRwdXQgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbF9sb29wczo6RnJpZGdlUXVldWU6OlN0YXR1cyAqc3RhdHVzKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyB0ZXN0aW5nOjpGcmlkZ2VUZXN0X0Rpc2FibGVkR29hbFRlc3RfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIHRlc3Rpbmc6OkZyaWRnZVRlc3RfRWxldmF0b3JHb2FsUG9zaXRpdmVXaW5kdXBUZXN0X1Rlc3Q7CisgIGZyaWVuZCBjbGFzcyB0ZXN0aW5nOjpGcmlkZ2VUZXN0X0FybUdvYWxQb3NpdGl2ZVdpbmR1cFRlc3RfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIHRlc3Rpbmc6OkZyaWRnZVRlc3RfRWxldmF0b3JHb2FsTmVnYXRpdmVXaW5kdXBUZXN0X1Rlc3Q7CisgIGZyaWVuZCBjbGFzcyB0ZXN0aW5nOjpGcmlkZ2VUZXN0X0FybUdvYWxOZWdhdGl2ZVdpbmR1cFRlc3RfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIHRlc3Rpbmc6OkZyaWRnZVRlc3RfU2FmZUFybVplcm9pbmdfVGVzdDsKKworICAvLyBTZXRzIHN0YXRlXyB0byB0aGUgY29ycmVjdCBzdGF0ZSBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgemVyb2luZworICAvLyBlc3RpbWF0b3JzLgorICB2b2lkIFVwZGF0ZVplcm9pbmdTdGF0ZSgpOworCisgIHZvaWQgU2V0RWxldmF0b3JPZmZzZXQoZG91YmxlIGxlZnRfb2Zmc2V0LCBkb3VibGUgcmlnaHRfb2Zmc2V0KTsKKyAgdm9pZCBTZXRBcm1PZmZzZXQoZG91YmxlIGxlZnRfb2Zmc2V0LCBkb3VibGUgcmlnaHRfb2Zmc2V0KTsKKworICAvLyBHZXR0ZXJzIGZvciB0aGUgY3VycmVudCBlbGV2YXRvciBwb3NpdGlvbnMuCisgIGRvdWJsZSBsZWZ0X2VsZXZhdG9yKCk7CisgIGRvdWJsZSByaWdodF9lbGV2YXRvcigpOworICBkb3VibGUgZWxldmF0b3IoKTsKKworICAvLyBHZXR0ZXJzIGZvciB0aGUgY3VycmVudCBhcm0gcG9zaXRpb25zLgorICBkb3VibGUgbGVmdF9hcm0oKTsKKyAgZG91YmxlIHJpZ2h0X2FybSgpOworICBkb3VibGUgYXJtKCk7CisKKyAgLy8gT3VyIGJlc3QgZ3Vlc3MgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGVsZXZhdG9yLgorICBkb3VibGUgZXN0aW1hdGVkX2xlZnRfZWxldmF0b3IoKTsKKyAgZG91YmxlIGVzdGltYXRlZF9yaWdodF9lbGV2YXRvcigpOworICBkb3VibGUgZXN0aW1hdGVkX2VsZXZhdG9yKCk7CisKKyAgLy8gT3VyIGJlc3QgZ3Vlc3MgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGFybS4KKyAgZG91YmxlIGVzdGltYXRlZF9sZWZ0X2FybSgpOworICBkb3VibGUgZXN0aW1hdGVkX3JpZ2h0X2FybSgpOworICBkb3VibGUgZXN0aW1hdGVkX2FybSgpOworCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgemVyb2luZyB2ZWxvY2l0eSBmb3IgZWl0aGVyIHN1YnN5c3RlbS4KKyAgLy8gSWYgdGhlIHN1YnN5c3RlbSBpcyB0b28gZmFyIGF3YXkgZnJvbSB0aGUgY2VudGVyLCB0aGVzZSB3aWxsIHN3aXRjaAorICAvLyBkaXJlY3Rpb25zLgorICBkb3VibGUgZWxldmF0b3JfemVyb2luZ192ZWxvY2l0eSgpOworICBkb3VibGUgYXJtX3plcm9pbmdfdmVsb2NpdHkoKTsKKworICAvLyBDb3JyZWN0cyB0aGUgT2JzZXJ2ZXIgd2l0aCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgdm9pZCBDb3JyZWN0KCk7CisKKyAgZG91YmxlIFVzZVVubGVzc1plcm8oZG91YmxlIHRhcmdldF92YWx1ZSwgZG91YmxlIGRlZmF1bHRfdmFsdWUpOworCisgIC8vIFRoZSBzdGF0ZSBmZWVkYmFjayBjb250cm9sIGxvb3Agb3IgbG9vcHMgdG8gdGFsayB0by4KKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FwcGVkU3RhdGVGZWVkYmFja0xvb3A8NT4+IGFybV9sb29wXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FwcGVkU3RhdGVGZWVkYmFja0xvb3A8ND4+IGVsZXZhdG9yX2xvb3BfOworCisgIHplcm9pbmc6Olplcm9pbmdFc3RpbWF0b3IgbGVmdF9hcm1fZXN0aW1hdG9yXzsKKyAgemVyb2luZzo6WmVyb2luZ0VzdGltYXRvciByaWdodF9hcm1fZXN0aW1hdG9yXzsKKyAgemVyb2luZzo6WmVyb2luZ0VzdGltYXRvciBsZWZ0X2VsZXZhdG9yX2VzdGltYXRvcl87CisgIHplcm9pbmc6Olplcm9pbmdFc3RpbWF0b3IgcmlnaHRfZWxldmF0b3JfZXN0aW1hdG9yXzsKKworICAvLyBPZmZzZXRzIGZyb20gdGhlIGVuY29kZXIgcG9zaXRpb24gdG8gdGhlIGFic29sdXRlIHBvc2l0aW9uLiAgQWRkIHRoZXNlIHRvCisgIC8vIHRoZSBlbmNvZGVyIHBvc2l0aW9uIHRvIGdldCB0aGUgYWJzb2x1dGUgcG9zaXRpb24uCisgIGRvdWJsZSBsZWZ0X2VsZXZhdG9yX29mZnNldF8gPSAwLjA7CisgIGRvdWJsZSByaWdodF9lbGV2YXRvcl9vZmZzZXRfID0gMC4wOworICBkb3VibGUgbGVmdF9hcm1fb2Zmc2V0XyA9IDAuMDsKKyAgZG91YmxlIHJpZ2h0X2FybV9vZmZzZXRfID0gMC4wOworCisgIC8vIEN1cnJlbnQgdmVsb2NpdHkgdG8gbW92ZSBhdCB3aGlsZSB6ZXJvaW5nLgorICBkb3VibGUgZWxldmF0b3JfemVyb2luZ192ZWxvY2l0eV8gPSAwLjA7CisgIGRvdWJsZSBhcm1femVyb2luZ192ZWxvY2l0eV8gPSAwLjA7CisKKyAgLy8gVGhlIGdvYWxzIGZvciB0aGUgZWxldmF0b3IgYW5kIGFybS4KKyAgZG91YmxlIGVsZXZhdG9yX2dvYWxfID0gMC4wOworICBkb3VibGUgYXJtX2dvYWxfID0gMC4wOworCisgIGRvdWJsZSBhcm1fZ29hbF92ZWxvY2l0eV8gPSAwLjA7CisgIGRvdWJsZSBlbGV2YXRvcl9nb2FsX3ZlbG9jaXR5XyA9IDAuMDsKKworICBTdGF0ZSBzdGF0ZV8gPSBVTklOSVRJQUxJWkVEOworICBTdGF0ZSBsYXN0X3N0YXRlXyA9IFVOSU5JVElBTElaRUQ7CisKKyAgY29udHJvbF9sb29wczo6RnJpZGdlUXVldWU6OlBvc2l0aW9uIGN1cnJlbnRfcG9zaXRpb25fOworCisgIFByb2ZpbGluZ1R5cGUgbGFzdF9wcm9maWxpbmdfdHlwZV87CisgIGFvczo6dXRpbDo6RWxldmF0b3JBcm1LaW5lbWF0aWNzIGtpbmVtYXRpY3NfOworCisgIGFvczo6dXRpbDo6VHJhcGV6b2lkUHJvZmlsZSBhcm1fcHJvZmlsZV87CisgIGFvczo6dXRpbDo6VHJhcGV6b2lkUHJvZmlsZSBlbGV2YXRvcl9wcm9maWxlXzsKKworICBhb3M6OnV0aWw6OlRyYXBlem9pZFByb2ZpbGUgeF9wcm9maWxlXzsKKyAgYW9zOjp1dGlsOjpUcmFwZXpvaWRQcm9maWxlIHlfcHJvZmlsZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbF9sb29wcworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCisjZW5kaWYgLy8gWTIwMTVfQ09OVFJPTF9MT09QU19GUklER0VfSF8KKwpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLnEgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UucQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTczNzRkCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLnEKQEAgLTAsMCArMSwxNTIgQEAKK3BhY2thZ2UgZnJjOTcxLmNvbnRyb2xfbG9vcHM7CisKK2ltcG9ydCAiYW9zL2NvbW1vbi9jb250cm9scy9jb250cm9sX2xvb3BzLnEiOworaW1wb3J0ICJmcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEiOworCisvLyBSZXByZXNlbnRzIHN0YXRlcyBmb3IgYWxsIG9mIHRoZSBib3gtZ3JhYmJpbmcgcGlzdG9ucy4KKy8vIHRydWUgaXMgZ3JhYmJlZCBhbmQgZmFsc2UgaXMgcmV0cmFjdGVkIGZvciBhbGwgb2YgdGhlbS4KK3N0cnVjdCBHcmFiYmVyUGlzdG9ucyB7CisgIGJvb2wgdG9wX2Zyb250OworICBib29sIHRvcF9iYWNrOworICBib29sIGJvdHRvbV9mcm9udDsKKyAgYm9vbCBib3R0b21fYmFjazsKK307CisKK3F1ZXVlX2dyb3VwIEZyaWRnZVF1ZXVlIHsKKyAgaW1wbGVtZW50cyBhb3MuY29udHJvbF9sb29wcy5Db250cm9sTG9vcDsKKworICAvLyBBbGwgYW5nbGVzIGFyZSBpbiByYWRpYW5zIHdpdGggMCBzdGlja2luZyBzdHJhaWdodCB1cC4KKyAgLy8gUm90YXRpbmcgdXAgYW5kIGludG8gdGhlIHJvYm90ICh0b3dhcmRzIHRoZSBiYWNrCisgIC8vIHdoZXJlIGJveGVzIGFyZSBwbGFjZWQpIGlzIHBvc2l0aXZlLiBQb3NpdGl2ZSBvdXRwdXQgdm9sdGFnZSBtb3ZlcyBhbGwKKyAgLy8gbWVjaGFuaXNtcyBpbiB0aGUgZGlyZWN0aW9uIHdpdGggcG9zaXRpdmUgc2Vuc29yIHZhbHVlcy4KKworICAvLyBFbGV2YXRvciBoZWlnaHRzIGFyZSB0aGUgdmVydGljYWwgZGlzdGFuY2UgKGluIG1ldGVycykgZnJvbSBhIGRlZmluZWQgemVyby4KKyAgLy8gSW4gdGhpcyBjYXNlLCB6ZXJvIGlzIHdoZXJlIHRoZSBwb3J0aW9uIG9mIHRoZSBjYXJyaWFnZSB0aGF0IFNwZW5jZXIKKyAgLy8gcmVtb3ZlZCBsaW5lcyB1cCB3aXRoIHRoZSBib2x0LgorCisgIC8vIFgvWSBwb3NpdGlvbnMgYXJlIGRpc3RhbmNlcyAoaW4gbWV0ZXJzKSB0aGUgZnJpZGdlIGlzIGF3YXkgZnJvbSBpdHMgb3JpZ2luCisgIC8vIHBvc2l0aW9uLiBPcmlnaW4gaXMgY29uc2lkZXJlZCBhdCBhIGhlaWdodCBvZiB6ZXJvIGFuZCBhbiBhbmdsZSBvZiB6ZXJvLgorICAvLyBQb3NpdGl2ZSBYIHBvc2l0aW9ucyBhcmUgdG93YXJkcyB0aGUgZnJvbnQgb2YgdGhlIHJvYm90IGFuZCBuZWdhdGl2ZSBYIGlzCisgIC8vIHRvd2FyZHMgdGhlIGJhY2sgb2YgdGhlIHJvYm90ICh3aGljaCBpcyB3aGVyZSB3ZSBzY29yZSkuCisgIC8vIFkgaXMgcG9zaXRpdmUgZ29pbmcgdXAgYW5kIG5lZ2F0aXZlIHdoZW4gaXQgZ29lcyBiZWxvdyB0aGUgb3JpZ2luLgorCisgIG1lc3NhZ2UgR29hbCB7CisgICAgLy8gUHJvZmlsZSB0eXBlLgorICAgIC8vIFNldCB0byAwIGZvciBhbmdsZS9oZWlnaHQgcHJvZmlsaW5nLgorICAgIC8vIFNldCB0byAxIGZvciB4L3kgcHJvZmlsaW5nLgorICAgIGludDMyX3QgcHJvZmlsaW5nX3R5cGU7CisKKyAgICAvLyBBbmdsZSBvZiB0aGUgYXJtLgorICAgIGRvdWJsZSBhbmdsZTsKKyAgICAvLyBIZWlnaHQgb2YgdGhlIGVsZXZhdG9yLgorICAgIGRvdWJsZSBoZWlnaHQ7CisKKyAgICAvLyBBbmd1bGFyIHZlbG9jaXR5IG9mIHRoZSBhcm0uCisgICAgZmxvYXQgYW5ndWxhcl92ZWxvY2l0eTsKKyAgICAvLyBMaW5lYXIgdmVsb2NpdHkgb2YgdGhlIGVsZXZhdG9yLgorICAgIGZsb2F0IHZlbG9jaXR5OworCisgICAgLy8gTWF4aW11bSBhcm0gcHJvZmlsZSBhbmd1bGFyIHZlbG9jaXR5IG9yIDAgZm9yIHRoZSBkZWZhdWx0LgorICAgIGZsb2F0IG1heF9hbmd1bGFyX3ZlbG9jaXR5OworICAgIC8vIE1heGltdW0gZWxldmF0b3IgcHJvZmlsZSB2ZWxvY2l0eSBvciAwIGZvciB0aGUgZGVmYXVsdC4KKyAgICBmbG9hdCBtYXhfdmVsb2NpdHk7CisKKyAgICAvLyBNYXhpbXVtIGFybSBwcm9maWxlIGFjY2VsZXJhdGlvbiBvciAwIGZvciB0aGUgZGVmYXVsdC4KKyAgICBmbG9hdCBtYXhfYW5ndWxhcl9hY2NlbGVyYXRpb247CisgICAgLy8gTWF4aW11bSBlbGV2YXRvciBwcm9maWxlIGFjY2VsZXJhdGlvbiBvciAwIGZvciB0aGUgZGVmYXVsdC4KKyAgICBmbG9hdCBtYXhfYWNjZWxlcmF0aW9uOworCisgICAgLy8gWCBwb3NpdGlvbiBvZiB0aGUgZnJpZGdlLgorICAgIGRvdWJsZSB4OworICAgIC8vIFkgcG9zaXRpb24gb2YgdGhlIGZyaWRnZS4KKyAgICBkb3VibGUgeTsKKworICAgIC8vIFZlbG9jaXR5IG9mIHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBmcmlkZ2UuCisgICAgZmxvYXQgeF92ZWxvY2l0eTsKKyAgICAvLyBWZWxvY2l0eSBvZiB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgZnJpZGdlLgorICAgIGZsb2F0IHlfdmVsb2NpdHk7CisKKyAgICAvLyBNYXhpbXVtIHggcHJvZmlsZSB2ZWxvY2l0eSBvciAwIGZvciB0aGUgZGVmYXVsdC4KKyAgICBmbG9hdCBtYXhfeF92ZWxvY2l0eTsKKyAgICAvLyBNYXhpbXVtIHkgcHJvZmlsZSB2ZWxvY2l0eSBvciAwIGZvciB0aGUgZGVmYXVsdC4KKyAgICBmbG9hdCBtYXhfeV92ZWxvY2l0eTsKKworICAgIC8vIE1heGltdW0geCBwcm9maWxlIGFjY2VsZXJhdGlvbiBvciAwIGZvciB0aGUgZGVmYXVsdC4KKyAgICBmbG9hdCBtYXhfeF9hY2NlbGVyYXRpb247CisgICAgLy8gTWF4aW11bSB5IHByb2ZpbGUgYWNjZWxlcmF0aW9uIG9yIDAgZm9yIHRoZSBkZWZhdWx0LgorICAgIGZsb2F0IG1heF95X2FjY2VsZXJhdGlvbjsKKworICAgIC8vIFRPRE8oYXVzdGluKTogRG8gSSBuZWVkIGFjY2VsZXJhdGlvbiBoZXJlIHRvbz8KKworICAgIEdyYWJiZXJQaXN0b25zIGdyYWJiZXJzOworICB9OworCisgIG1lc3NhZ2UgUG9zaXRpb24geworICAgIFBvdEFuZEluZGV4UGFpciBhcm07CisgICAgUG90QW5kSW5kZXhQYWlyIGVsZXZhdG9yOworICB9OworCisgIG1lc3NhZ2UgU3RhdHVzIHsKKyAgICAvLyBBcmUgYm90aCB0aGUgYXJtIGFuZCBlbGV2YXRvciB6ZXJvZWQ/CisgICAgYm9vbCB6ZXJvZWQ7CisKKyAgICAvLyBFc3RpbWF0ZWQgYW5nbGUgb2YgdGhlIGFybS4KKyAgICBkb3VibGUgYW5nbGU7CisgICAgLy8gRXN0aW1hdGVkIGFuZ3VsYXIgdmVsb2NpdHkgb2YgdGhlIGFybS4KKyAgICBmbG9hdCBhbmd1bGFyX3ZlbG9jaXR5OworICAgIC8vIEVzdGltYXRlZCBoZWlnaHQgb2YgdGhlIGVsZXZhdG9yLgorICAgIGRvdWJsZSBoZWlnaHQ7CisgICAgLy8gRXN0aW1hdGVkIHZlbG9jaXR5IG9mIHRoZSBlbHZhdG9yLgorICAgIGZsb2F0IHZlbG9jaXR5OworICAgIC8vIHN0YXRlIG9mIHRoZSBncmFiYmVyIHBpc3RvbnMKKyAgICBHcmFiYmVyUGlzdG9ucyBncmFiYmVyczsKKworICAgIC8vIEdvYWwgYW5nbGUgYW5kIHZlbG9jaXR5IG9mIHRoZSBhcm0uCisgICAgZG91YmxlIGdvYWxfYW5nbGU7CisgICAgZmxvYXQgZ29hbF9hbmd1bGFyX3ZlbG9jaXR5OworICAgIC8vIEdvYWwgaGVpZ2h0IGFuZCB2ZWxvY2l0eSBvZiB0aGUgZWxldmF0b3IuCisgICAgZG91YmxlIGdvYWxfaGVpZ2h0OworICAgIGZsb2F0IGdvYWxfdmVsb2NpdHk7CisKKyAgICAvLyBFc3RpbWF0ZWQgWC9ZIHBvc2l0aW9uIG9mIHRoZSBmcmlkZ2UuCisgICAgLy8gVGhlc2UgYXJlIHRyYW5zbGF0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgaGVpZ2h0L2FuZ2xlIHN0YXR1c2VzLgorICAgIGRvdWJsZSB4OworICAgIGRvdWJsZSB5OworICAgIGZsb2F0IHhfdmVsb2NpdHk7CisgICAgZmxvYXQgeV92ZWxvY2l0eTsKKworICAgIC8vIFgvWSBnb2FscyBvZiB0aGUgZnJpZGdlLgorICAgIC8vIFRoZXNlIGFyZSB0cmFuc2xhdGVkIGRpcmVjdGx5IGZyb20gdGhlIGhlaWdodC9hbmdsZSBnb2Fscy4KKyAgICBkb3VibGUgZ29hbF94OworICAgIGRvdWJsZSBnb2FsX3k7CisgICAgZmxvYXQgZ29hbF94X3ZlbG9jaXR5OworICAgIGZsb2F0IGdvYWxfeV92ZWxvY2l0eTsKKworICAgIC8vIElmIHRydWUsIHdlIGhhdmUgYWJvcnRlZC4KKyAgICBib29sIGVzdG9wcGVkOworCisgICAgLy8gVGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBzdGF0ZSBtYWNoaW5lLgorICAgIGludDMyX3Qgc3RhdGU7CisKKyAgICBFc3RpbWF0b3JTdGF0ZSBsZWZ0X2VsZXZhdG9yX3N0YXRlOworICAgIEVzdGltYXRvclN0YXRlIHJpZ2h0X2VsZXZhdG9yX3N0YXRlOworICAgIEVzdGltYXRvclN0YXRlIGxlZnRfYXJtX3N0YXRlOworICAgIEVzdGltYXRvclN0YXRlIHJpZ2h0X2FybV9zdGF0ZTsKKyAgfTsKKworICBtZXNzYWdlIE91dHB1dCB7CisgICAgZG91YmxlIGxlZnRfYXJtOworICAgIGRvdWJsZSByaWdodF9hcm07CisgICAgZG91YmxlIGxlZnRfZWxldmF0b3I7CisgICAgZG91YmxlIHJpZ2h0X2VsZXZhdG9yOworCisgICAgR3JhYmJlclBpc3RvbnMgZ3JhYmJlcnM7CisgIH07CisKKyAgcXVldWUgR29hbCBnb2FsOworICBxdWV1ZSBQb3NpdGlvbiBwb3NpdGlvbjsKKyAgcXVldWUgT3V0cHV0IG91dHB1dDsKKyAgcXVldWUgU3RhdHVzIHN0YXR1czsKK307CisKK3F1ZXVlX2dyb3VwIEZyaWRnZVF1ZXVlIGZyaWRnZV9xdWV1ZTsKZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZV9saWJfdGVzdC5jYyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZV9saWJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE5ZmI0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlX2xpYl90ZXN0LmNjCkBAIC0wLDAgKzEsNzM1IEBACisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vcXVldWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbW1vbm1hdGguaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xfbG9vcF90ZXN0LmgiCisjaW5jbHVkZSAieTIwMTUvdXRpbC9raW5lbWF0aWNzLmgiCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvcG9zaXRpb25fc2Vuc29yX3NpbS5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2FybV9tb3Rvcl9wbGFudC5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2VsZXZhdG9yX21vdG9yX3BsYW50LmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy90ZWFtX251bWJlcl90ZXN0X2Vudmlyb25tZW50LmgiCisKK3VzaW5nIDo6YW9zOjp0aW1lOjpUaW1lOworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKy8vIENsYXNzIHdoaWNoIHNpbXVsYXRlcyB0aGUgZnJpZGdlIGFuZCBzZW5kcyBvdXQgcXVldWUgbWVzc2FnZXMgd2l0aCB0aGUKKy8vIHBvc2l0aW9uLgorY2xhc3MgRnJpZGdlU2ltdWxhdGlvbiB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrTm9pc2VTY2FsYXIgPSAwLjE7CisgIC8vIENvbnN0cnVjdHMgYSBzaW11bGF0aW9uLgorICBGcmlkZ2VTaW11bGF0aW9uKCkKKyAgICAgIDogYXJtX3BsYW50XyhuZXcgU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+KE1ha2VBcm1QbGFudCgpKSksCisgICAgICAgIGVsZXZhdG9yX3BsYW50XyhuZXcgU3RhdGVGZWVkYmFja1BsYW50PDQsIDIsIDI+KE1ha2VFbGV2YXRvclBsYW50KCkpKSwKKyAgICAgICAgbGVmdF9hcm1fcG90X2VuY29kZXJfKAorICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UubGVmdF9hcm1femVyb2luZy5pbmRleF9kaWZmZXJlbmNlKSwKKyAgICAgICAgcmlnaHRfYXJtX3BvdF9lbmNvZGVyXygKKyAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLnJpZ2h0X2FybV96ZXJvaW5nLmluZGV4X2RpZmZlcmVuY2UpLAorICAgICAgICBsZWZ0X2VsZXZhdG9yX3BvdF9lbmNvZGVyXygKKyAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmxlZnRfZWxldl96ZXJvaW5nLmluZGV4X2RpZmZlcmVuY2UpLAorICAgICAgICByaWdodF9lbGV2YXRvcl9wb3RfZW5jb2Rlcl8oCisgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5yaWdodF9lbGV2X3plcm9pbmcuaW5kZXhfZGlmZmVyZW5jZSksCisgICAgICAgIGZyaWRnZV9xdWV1ZV8oIi5mcmM5NzEuY29udHJvbF9sb29wcy5mcmlkZ2VfcXVldWUiLCAweGU0ZTA1ODU1LAorICAgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZnJpZGdlX3F1ZXVlLmdvYWwiLAorICAgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZnJpZGdlX3F1ZXVlLnBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmZyaWRnZV9xdWV1ZS5vdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZnJpZGdlX3F1ZXVlLnN0YXR1cyIpIHsKKyAgICAvLyBJbml0aWFsaXplIHRoZSBlbGV2YXRvci4KKyAgICBJbml0aWFsaXplRWxldmF0b3JQb3NpdGlvbigKKyAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuZWxldmF0b3IubG93ZXJfbGltaXQpOworICAgIC8vIEluaXRpYWxpemUgdGhlIGFybS4KKyAgICBJbml0aWFsaXplQXJtUG9zaXRpb24oMC4wKTsKKyAgfQorCisgIHZvaWQgSW5pdGlhbGl6ZUVsZXZhdG9yUG9zaXRpb24oZG91YmxlIHN0YXJ0X3BvcykgeworICAgIEluaXRpYWxpemVFbGV2YXRvclBvc2l0aW9uKHN0YXJ0X3Bvcywgc3RhcnRfcG9zKTsKKyAgfQorCisgIHZvaWQgSW5pdGlhbGl6ZUVsZXZhdG9yUG9zaXRpb24oZG91YmxlIGxlZnRfc3RhcnRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodF9zdGFydF9wb3MpIHsKKyAgICBJbml0aWFsaXplRWxldmF0b3JQb3NpdGlvbigKKyAgICAgICAgbGVmdF9zdGFydF9wb3MsIHJpZ2h0X3N0YXJ0X3BvcywKKyAgICAgICAga05vaXNlU2NhbGFyICoKKyAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLnJpZ2h0X2VsZXZfemVyb2luZy5pbmRleF9kaWZmZXJlbmNlKTsKKyAgfQorCisgIHZvaWQgSW5pdGlhbGl6ZUVsZXZhdG9yUG9zaXRpb24oZG91YmxlIGxlZnRfc3RhcnRfcG9zLCBkb3VibGUgcmlnaHRfc3RhcnRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwb3Rfbm9pc2Vfc3RkZGV2KSB7CisgICAgLy8gVXBkYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZWxldmF0b3IgcGxhbnQuCisgICAgZWxldmF0b3JfcGxhbnRfLT5tdXRhYmxlX1goMCwgMCkgPSAobGVmdF9zdGFydF9wb3MgKyByaWdodF9zdGFydF9wb3MpIC8gMi4wOworICAgIGVsZXZhdG9yX3BsYW50Xy0+bXV0YWJsZV9YKDEsIDApID0gMC4wOworICAgIGVsZXZhdG9yX3BsYW50Xy0+bXV0YWJsZV9YKDIsIDApID0gKGxlZnRfc3RhcnRfcG9zIC0gcmlnaHRfc3RhcnRfcG9zKSAvIDIuMDsKKyAgICBlbGV2YXRvcl9wbGFudF8tPm11dGFibGVfWCgzLCAwKSA9IDAuMDsKKworICAgIHJpZ2h0X2VsZXZhdG9yX3BvdF9lbmNvZGVyXy5Jbml0aWFsaXplKHJpZ2h0X3N0YXJ0X3BvcywgcG90X25vaXNlX3N0ZGRldik7CisgICAgbGVmdF9lbGV2YXRvcl9wb3RfZW5jb2Rlcl8uSW5pdGlhbGl6ZShsZWZ0X3N0YXJ0X3BvcywgcG90X25vaXNlX3N0ZGRldik7CisgICAgZWxldmF0b3JfaW5pdGlhbF9kaWZmZXJlbmNlXyA9IGxlZnRfc3RhcnRfcG9zIC0gcmlnaHRfc3RhcnRfcG9zOworICB9CisKKyAgdm9pZCBJbml0aWFsaXplQXJtUG9zaXRpb24oZG91YmxlIHN0YXJ0X3BvcykgeworICAgIEluaXRpYWxpemVBcm1Qb3NpdGlvbihzdGFydF9wb3MsIHN0YXJ0X3Bvcyk7CisgIH0KKworICB2b2lkIEluaXRpYWxpemVBcm1Qb3NpdGlvbihkb3VibGUgbGVmdF9zdGFydF9wb3MsIGRvdWJsZSByaWdodF9zdGFydF9wb3MpIHsKKyAgICBJbml0aWFsaXplQXJtUG9zaXRpb24oCisgICAgICAgIGxlZnRfc3RhcnRfcG9zLCByaWdodF9zdGFydF9wb3MsCisgICAgICAgIGtOb2lzZVNjYWxhciAqCisgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5yaWdodF9hcm1femVyb2luZy5pbmRleF9kaWZmZXJlbmNlKTsKKyAgfQorICB2b2lkIEluaXRpYWxpemVBcm1Qb3NpdGlvbihkb3VibGUgbGVmdF9zdGFydF9wb3MsIGRvdWJsZSByaWdodF9zdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwb3Rfbm9pc2Vfc3RkZGV2KSB7CisgICAgLy8gVXBkYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgYXJtIHBsYW50LgorICAgIGFybV9wbGFudF8tPm11dGFibGVfWCgwLCAwKSA9IChsZWZ0X3N0YXJ0X3BvcyArIHJpZ2h0X3N0YXJ0X3BvcykgLyAyLjA7CisgICAgYXJtX3BsYW50Xy0+bXV0YWJsZV9YKDEsIDApID0gMC4wOworICAgIGFybV9wbGFudF8tPm11dGFibGVfWCgyLCAwKSA9IChsZWZ0X3N0YXJ0X3BvcyAtIHJpZ2h0X3N0YXJ0X3BvcykgLyAyLjA7CisgICAgYXJtX3BsYW50Xy0+bXV0YWJsZV9YKDMsIDApID0gMC4wOworCisgICAgbGVmdF9hcm1fcG90X2VuY29kZXJfLkluaXRpYWxpemUobGVmdF9zdGFydF9wb3MsIHBvdF9ub2lzZV9zdGRkZXYpOworICAgIHJpZ2h0X2FybV9wb3RfZW5jb2Rlcl8uSW5pdGlhbGl6ZShyaWdodF9zdGFydF9wb3MsIHBvdF9ub2lzZV9zdGRkZXYpOworICAgIGFybV9pbml0aWFsX2RpZmZlcmVuY2VfID0gbGVmdF9zdGFydF9wb3MgLSByaWdodF9zdGFydF9wb3M7CisgIH0KKworICAvLyBDaGFuZ2VzIHRoZSBsZWZ0LXJpZ2h0IGNhbGN1bGF0aW9ucyBpbiB0aGUgbGltaXQgY2hlY2tzIHRvIG1lYXN1cmUgYWJzb2x1dGUKKyAgLy8gZGlmZmVyZW5jZXMgaW5zdGVhZCBvZiBkaWZmZXJlbmNlcyByZWxhdGl2ZSB0byB0aGUgc3RhcnRpbmcgb2Zmc2V0LgorICB2b2lkIEVycm9yT25BYnNvbHV0ZURpZmZlcmVuY2UoKSB7CisgICAgYXJtX2luaXRpYWxfZGlmZmVyZW5jZV8gPSAwLjA7CisgICAgZWxldmF0b3JfaW5pdGlhbF9kaWZmZXJlbmNlXyA9IDAuMDsKKyAgfQorCisgIC8vIFNlbmRzIGEgcXVldWUgbWVzc2FnZSB3aXRoIHRoZSBwb3NpdGlvbi4KKyAgdm9pZCBTZW5kUG9zaXRpb25NZXNzYWdlKCkgeworICAgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPGNvbnRyb2xfbG9vcHM6OkZyaWRnZVF1ZXVlOjpQb3NpdGlvbj4gcG9zaXRpb24gPQorICAgICAgICBmcmlkZ2VfcXVldWVfLnBvc2l0aW9uLk1ha2VNZXNzYWdlKCk7CisKKyAgICBsZWZ0X2FybV9wb3RfZW5jb2Rlcl8uR2V0U2Vuc29yVmFsdWVzKCZwb3NpdGlvbi0+YXJtLmxlZnQpOworICAgIHJpZ2h0X2FybV9wb3RfZW5jb2Rlcl8uR2V0U2Vuc29yVmFsdWVzKCZwb3NpdGlvbi0+YXJtLnJpZ2h0KTsKKyAgICBsZWZ0X2VsZXZhdG9yX3BvdF9lbmNvZGVyXy5HZXRTZW5zb3JWYWx1ZXMoJnBvc2l0aW9uLT5lbGV2YXRvci5sZWZ0KTsKKyAgICByaWdodF9lbGV2YXRvcl9wb3RfZW5jb2Rlcl8uR2V0U2Vuc29yVmFsdWVzKCZwb3NpdGlvbi0+ZWxldmF0b3IucmlnaHQpOworCisgICAgcG9zaXRpb24uU2VuZCgpOworICB9CisKKyAgLy8gU2V0cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb21tYW5kZWQgYW5kIGFwcGxpZWQgcG93ZXIgZm9yIHRoZSBhcm0uCisgIC8vIFRoaXMgbGV0cyB1cyB0ZXN0IHRoYXQgdGhlIGludGVncmF0b3IgZm9yIHRoZSBhcm0gd29ya3MuCisgIHZvaWQgc2V0X2FybV9wb3dlcl9lcnJvcihkb3VibGUgYXJtX3Bvd2VyX2Vycm9yKSB7CisgICAgYXJtX3Bvd2VyX2Vycm9yXyA9IGFybV9wb3dlcl9lcnJvcjsKKyAgfQorICAvLyBTaW11bGF0ZXMgZm9yIGEgc2luZ2xlIHRpbWVzdGVwLgorICB2b2lkIFNpbXVsYXRlKCkgeworICAgIEVYUEVDVF9UUlVFKGZyaWRnZV9xdWV1ZV8ub3V0cHV0LkZldGNoTGF0ZXN0KCkpOworCisgICAgLy8gRmVlZCB2b2x0YWdlcyBpbnRvIHBoeXNpY3Mgc2ltdWxhdGlvbi4KKyAgICBpZiAoYXJtX3Bvd2VyX2Vycm9yXyAhPSAwLjApIHsKKyAgICAgIGFybV9wbGFudF8tPm11dGFibGVfVSgpIDw8IDo6YW9zOjpDbGlwKAorICAgICAgICAgIGZyaWRnZV9xdWV1ZV8ub3V0cHV0LT5sZWZ0X2FybSArIGFybV9wb3dlcl9lcnJvcl8sIC0xMiwgMTIpLAorICAgICAgICAgIDo6YW9zOjpDbGlwKGZyaWRnZV9xdWV1ZV8ub3V0cHV0LT5yaWdodF9hcm0gKyBhcm1fcG93ZXJfZXJyb3JfLCAtMTIsCisgICAgICAgICAgICAgICAgICAgICAgMTIpOworICAgIH0gZWxzZSB7CisgICAgICBhcm1fcGxhbnRfLT5tdXRhYmxlX1UoKSA8PCBmcmlkZ2VfcXVldWVfLm91dHB1dC0+bGVmdF9hcm0sCisgICAgICAgICAgZnJpZGdlX3F1ZXVlXy5vdXRwdXQtPnJpZ2h0X2FybTsKKyAgICB9CisgICAgZWxldmF0b3JfcGxhbnRfLT5tdXRhYmxlX1UoKSA8PCBmcmlkZ2VfcXVldWVfLm91dHB1dC0+bGVmdF9lbGV2YXRvciwKKyAgICAgICAgZnJpZGdlX3F1ZXVlXy5vdXRwdXQtPnJpZ2h0X2VsZXZhdG9yOworCisgICAgLy8gVXNlIHRoZSBwbGFudCB0byBnZW5lcmF0ZSB0aGUgbmV4dCBwaHlzaWNhbCBzdGF0ZSBnaXZlbiB0aGUgdm9sdGFnZXMgdG8KKyAgICAvLyB0aGUgbW90b3JzLgorICAgIGFybV9wbGFudF8tPlVwZGF0ZSgpOworICAgIGVsZXZhdG9yX3BsYW50Xy0+VXBkYXRlKCk7CisKKyAgICBjb25zdCBkb3VibGUgbGVmdF9hcm1fYW5nbGUgPSBhcm1fcGxhbnRfLT5ZKDAsIDApOworICAgIGNvbnN0IGRvdWJsZSByaWdodF9hcm1fYW5nbGUgPSBhcm1fcGxhbnRfLT5ZKDEsIDApOworICAgIGNvbnN0IGRvdWJsZSBsZWZ0X2VsZXZhdG9yX2hlaWdodCA9IGVsZXZhdG9yX3BsYW50Xy0+WSgwLCAwKTsKKyAgICBjb25zdCBkb3VibGUgcmlnaHRfZWxldmF0b3JfaGVpZ2h0ID0gZWxldmF0b3JfcGxhbnRfLT5ZKDEsIDApOworCisgICAgLy8gVE9ETyAocGhpbCkgRG8gc29tZSBzYW5pdHkgdGVzdHMgb24gdGhlIGFybSBhbmdsZXMgYW5kIHRoZSBlbGV2YXRvcgorICAgIC8vIGhlaWdodHMuIEZvciBleGFtcGxlLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJvdGggc2lkZXMgYXJlIHdpdGhpbiBhCisgICAgLy8gY2VydGFpbiBkaXN0YW5jZSBvZiBlYWNoIG90aGVyIGFuZCB0aGV5IGhhdmVuJ3QgY3Jhc2hlZCBpbnRvIHRoZSB0b3Agb3IKKyAgICAvLyB0aGUgYm90dG9tLgorCisgICAgLy8gVXNlIHRoZSBwaHlzaWNhbCBzdGF0ZSB0byBzaW11bGF0ZSBzZW5zb3IgcmVhZGluZ3MuCisgICAgbGVmdF9hcm1fcG90X2VuY29kZXJfLk1vdmVUbyhsZWZ0X2FybV9hbmdsZSk7CisgICAgcmlnaHRfYXJtX3BvdF9lbmNvZGVyXy5Nb3ZlVG8ocmlnaHRfYXJtX2FuZ2xlKTsKKyAgICBsZWZ0X2VsZXZhdG9yX3BvdF9lbmNvZGVyXy5Nb3ZlVG8obGVmdF9lbGV2YXRvcl9oZWlnaHQpOworICAgIHJpZ2h0X2VsZXZhdG9yX3BvdF9lbmNvZGVyXy5Nb3ZlVG8ocmlnaHRfZWxldmF0b3JfaGVpZ2h0KTsKKworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBhcm0gYW5kIGVsZXZhdG9yIHNpZGVzIGRvbid0IGNoYW5nZSBtdWNoIGZyb20gdGhlaXIKKyAgICAvLyBpbml0aWFsIGRpZmZlcmVuY2UuICBVc2UgdGhlIGluaXRpYWwgZGlmZmVyZW5jZSBpbnN0ZWFkIG9mIHRoZSBhYnNvbHV0ZQorICAgIC8vIGRpZmZlcmVuY2UgdG8gaGFuZGxlIHN0YXJ0aW5nIHRvbyBmYXIgYXBhcnQgdG8gdGVzdCBlLXN0b3BwaW5nLgorICAgIEVYUEVDVF9ORUFSKGxlZnRfYXJtX2FuZ2xlIC0gcmlnaHRfYXJtX2FuZ2xlLCBhcm1faW5pdGlhbF9kaWZmZXJlbmNlXywKKyAgICAgICAgICAgICAgICA1LjAgKiBNX1BJIC8gMTgwLjApOworICAgIEVYUEVDVF9ORUFSKGxlZnRfZWxldmF0b3JfaGVpZ2h0IC0gcmlnaHRfZWxldmF0b3JfaGVpZ2h0LAorICAgICAgICAgICAgICAgIGVsZXZhdG9yX2luaXRpYWxfZGlmZmVyZW5jZV8sIDAuMDI1NCk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBhcm0gaXMgd2l0aGluIHJhbmdlLgorICAgIEVYUEVDVF9HRShsZWZ0X2FybV9hbmdsZSwKKyAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLmxvd2VyX2hhcmRfbGltaXQpOworICAgIEVYUEVDVF9HRShyaWdodF9hcm1fYW5nbGUsCisgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmFybS5sb3dlcl9oYXJkX2xpbWl0KTsKKyAgICBFWFBFQ1RfTEUobGVmdF9hcm1fYW5nbGUsCisgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmFybS51cHBlcl9oYXJkX2xpbWl0KTsKKyAgICBFWFBFQ1RfTEUocmlnaHRfYXJtX2FuZ2xlLAorICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5hcm0udXBwZXJfaGFyZF9saW1pdCk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBlbGV2YXRvciBpcyB3aXRoaW4gcmFuZ2UuCisgICAgRVhQRUNUX0dFKGxlZnRfZWxldmF0b3JfaGVpZ2h0LAorICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9oYXJkX2xpbWl0KTsKKyAgICBFWFBFQ1RfR0UocmlnaHRfZWxldmF0b3JfaGVpZ2h0LAorICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9oYXJkX2xpbWl0KTsKKyAgICBFWFBFQ1RfTEUobGVmdF9lbGV2YXRvcl9oZWlnaHQsCisgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLnVwcGVyX2hhcmRfbGltaXQpOworICAgIEVYUEVDVF9MRShyaWdodF9lbGV2YXRvcl9oZWlnaHQsCisgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLnVwcGVyX2hhcmRfbGltaXQpOworICB9CisKKyBwcml2YXRlOgorICA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrUGxhbnQ8NCwgMiwgMj4+IGFybV9wbGFudF87CisgIDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudDw0LCAyLCAyPj4gZWxldmF0b3JfcGxhbnRfOworCisgIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yIGxlZnRfYXJtX3BvdF9lbmNvZGVyXzsKKyAgUG9zaXRpb25TZW5zb3JTaW11bGF0b3IgcmlnaHRfYXJtX3BvdF9lbmNvZGVyXzsKKyAgUG9zaXRpb25TZW5zb3JTaW11bGF0b3IgbGVmdF9lbGV2YXRvcl9wb3RfZW5jb2Rlcl87CisgIFBvc2l0aW9uU2Vuc29yU2ltdWxhdG9yIHJpZ2h0X2VsZXZhdG9yX3BvdF9lbmNvZGVyXzsKKworICBGcmlkZ2VRdWV1ZSBmcmlkZ2VfcXVldWVfOworCisgIGRvdWJsZSBlbGV2YXRvcl9pbml0aWFsX2RpZmZlcmVuY2VfID0gMC4wOworICBkb3VibGUgYXJtX2luaXRpYWxfZGlmZmVyZW5jZV8gPSAwLjA7CisgIGRvdWJsZSBhcm1fcG93ZXJfZXJyb3JfID0gMC4wOworfTsKKworY2xhc3MgRnJpZGdlVGVzdCA6IHB1YmxpYyA6OmFvczo6dGVzdGluZzo6Q29udHJvbExvb3BUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEZyaWRnZVRlc3QoKQorICAgICAgOiBmcmlkZ2VfcXVldWVfKCIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuZnJpZGdlX3F1ZXVlIiwgMHhlNGUwNTg1NSwKKyAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmZyaWRnZV9xdWV1ZS5nb2FsIiwKKyAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmZyaWRnZV9xdWV1ZS5wb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgIi5mcmM5NzEuY29udHJvbF9sb29wcy5mcmlkZ2VfcXVldWUub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAiLmZyYzk3MS5jb250cm9sX2xvb3BzLmZyaWRnZV9xdWV1ZS5zdGF0dXMiKSwKKyAgICAgICAgZnJpZGdlXygmZnJpZGdlX3F1ZXVlXyksCisgICAgICAgIGZyaWRnZV9wbGFudF8oKSwKKyAgICAgICAga2luZW1hdGljc18oY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuZWxldmF0b3IudXBwZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLmxvd2VyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5hcm0udXBwZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmFybS5sb3dlcl9saW1pdCkgeworICAgIHNldF90ZWFtX2lkKGtUZWFtTnVtYmVyKTsKKyAgfQorCisgIHZvaWQgVmVyaWZ5TmVhckdvYWwoKSB7CisgICAgZnJpZGdlX3F1ZXVlXy5nb2FsLkZldGNoTGF0ZXN0KCk7CisgICAgZnJpZGdlX3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgICBFWFBFQ1RfVFJVRShmcmlkZ2VfcXVldWVfLmdvYWwuZ2V0KCkgIT0gbnVsbHB0cik7CisgICAgRVhQRUNUX1RSVUUoZnJpZGdlX3F1ZXVlXy5zdGF0dXMuZ2V0KCkgIT0gbnVsbHB0cik7CisgICAgaWYgKGZyaWRnZV9xdWV1ZV8uZ29hbC0+cHJvZmlsaW5nX3R5cGUgPT0gMCkgeworICAgICAgRVhQRUNUX05FQVIoZnJpZGdlX3F1ZXVlXy5nb2FsLT5hbmdsZSwgZnJpZGdlX3F1ZXVlXy5zdGF0dXMtPmFuZ2xlLAorICAgICAgICAgICAgICAgICAgMC4wMDEpOworICAgICAgRVhQRUNUX05FQVIoZnJpZGdlX3F1ZXVlXy5nb2FsLT5oZWlnaHQsIGZyaWRnZV9xdWV1ZV8uc3RhdHVzLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAwLjAwMSk7CisgICAgfSBlbHNlIGlmIChmcmlkZ2VfcXVldWVfLmdvYWwtPnByb2ZpbGluZ190eXBlID09IDEpIHsKKyAgICAgIGFvczo6dXRpbDo6RWxldmF0b3JBcm1LaW5lbWF0aWNzOjpLaW5lbWF0aWNSZXN1bHQgeF95X3N0YXR1czsKKyAgICAgIGtpbmVtYXRpY3NfLkZvcndhcmRLaW5lbWF0aWMoZnJpZGdlX3F1ZXVlXy5zdGF0dXMtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlXy5zdGF0dXMtPmFuZ2xlLCAwLjAsIDAuMCwgJnhfeV9zdGF0dXMpOworICAgICAgRVhQRUNUX05FQVIoZnJpZGdlX3F1ZXVlXy5nb2FsLT54LCB4X3lfc3RhdHVzLmZyaWRnZV94LCAwLjAwMSk7CisgICAgICBFWFBFQ1RfTkVBUihmcmlkZ2VfcXVldWVfLmdvYWwtPnksIHhfeV9zdGF0dXMuZnJpZGdlX2gsIDAuMDAxKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVW5oYW5kbGVkIHByb2ZpbGluZyB0eXBlLgorICAgICAgRVhQRUNUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgfQorCisgIC8vIFJ1bnMgb25lIGl0ZXJhdGlvbiBvZiB0aGUgd2hvbGUgc2ltdWxhdGlvbiBhbmQgY2hlY2tzIHRoYXQgc2VwYXJhdGlvbgorICAvLyByZW1haW5zIHJlYXNvbmFibGUuCisgIHZvaWQgUnVuSXRlcmF0aW9uKGJvb2wgZW5hYmxlZCA9IHRydWUpIHsKKyAgICBTZW5kTWVzc2FnZXMoZW5hYmxlZCk7CisKKyAgICBmcmlkZ2VfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBmcmlkZ2VfLkl0ZXJhdGUoKTsKKyAgICBmcmlkZ2VfcGxhbnRfLlNpbXVsYXRlKCk7CisKKyAgICBUaWNrVGltZSgpOworICB9CisKKyAgLy8gUnVucyBpdGVyYXRpb25zIHVudGlsIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHNpbXVsYXRlZCB0aW1lIGhhcyBlbGFwc2VkLgorICB2b2lkIFJ1bkZvclRpbWUoY29uc3QgVGltZSAmcnVuX2ZvciwgYm9vbCBlbmFibGVkID0gdHJ1ZSkgeworICAgIGNvbnN0IGF1dG8gc3RhcnRfdGltZSA9IFRpbWU6Ok5vdygpOworICAgIHdoaWxlIChUaW1lOjpOb3coKSA8IHN0YXJ0X3RpbWUgKyBydW5fZm9yKSB7CisgICAgICBSdW5JdGVyYXRpb24oZW5hYmxlZCk7CisgICAgfQorICB9CisKKyAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0IHF1ZXVlIHNvIHRoYXQgaXQgaW52YWxpZGF0ZXMgdGhlIHF1ZXVlCisgIC8vIHRoYXQgaXQgcG9pbnRzIHRvLiAgT3RoZXJ3aXNlLCB3ZSB3aWxsIGhhdmUgYSBwb2ludGVkIHRvCisgIC8vIHNoYXJlZCBtZW1vcnkgdGhhdCBpcyBubyBsb25nZXIgdmFsaWQuCisgIEZyaWRnZVF1ZXVlIGZyaWRnZV9xdWV1ZV87CisKKyAgLy8gQ3JlYXRlIGEgY29udHJvbCBsb29wIGFuZCBzaW11bGF0aW9uLgorICBGcmlkZ2UgZnJpZGdlXzsKKyAgRnJpZGdlU2ltdWxhdGlvbiBmcmlkZ2VfcGxhbnRfOworCisgIGFvczo6dXRpbDo6RWxldmF0b3JBcm1LaW5lbWF0aWNzIGtpbmVtYXRpY3NfOworfTsKKworLy8gVGVzdHMgdGhhdCB0aGUgbG9vcCBkb2VzIG5vdGhpbmcgd2hlbiB0aGUgZ29hbCBpcyB6ZXJvLgorVEVTVF9GKEZyaWRnZVRlc3QsIERvZXNOb3RoaW5nKSB7CisgIC8vIFNldCB0aGUgZ29hbHMgdG8gdGhlIHN0YXJ0aW5nIHZhbHVlcy4gVGhpcyBzaG91bGQgdGhlb3JldGljYWxseSBndWFyYW50ZWUKKyAgLy8gdGhhdCB0aGUgY29udHJvbGxlciBkb2VzIG5vdGhpbmcuCisgIGNvbnN0IGF1dG8gJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisgIEFTU0VSVF9UUlVFKGZyaWRnZV9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgLmFuZ2xlKDAuMCkKKyAgICAgICAgICAgICAgICAgIC5oZWlnaHQodmFsdWVzLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9saW1pdCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfdmVsb2NpdHkoMjApCisgICAgICAgICAgICAgICAgICAubWF4X2FjY2VsZXJhdGlvbigyMCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfYW5ndWxhcl92ZWxvY2l0eSgyMCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfYW5ndWxhcl9hY2NlbGVyYXRpb24oMjApCisgICAgICAgICAgICAgICAgICAuU2VuZCgpKTsKKworICAvLyBSdW4gYSBmZXcgaXRlcmF0aW9ucy4KKyAgUnVuRm9yVGltZShUaW1lOjpJblNlY29uZHMoNSkpOworCisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGxvb3AgY2FuIHJlYWNoIGEgZ29hbC4KK1RFU1RfRihGcmlkZ2VUZXN0LCBSZWFjaGVzWFlHb2FsKSB7CisgIC8vIFNldCBhIHJlYXNvbmFibGUgZ29hbC4KKyAgY29uc3QgYXV0byAmdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKyAgY29uc3QgZG91YmxlIHNvZnRfbGltaXQgPSB2YWx1ZXMuZnJpZGdlLmVsZXZhdG9yLmxvd2VyX2xpbWl0OworICBjb25zdCBkb3VibGUgaGVpZ2h0ID0gc29mdF9saW1pdCArIDAuNDsKKyAgY29uc3QgZG91YmxlIGFuZ2xlID0gTV9QSSAvIDYuMDsKKworICBhb3M6OnV0aWw6OkVsZXZhdG9yQXJtS2luZW1hdGljczo6S2luZW1hdGljUmVzdWx0IHhfeV9nb2FsczsKKyAga2luZW1hdGljc18uRm9yd2FyZEtpbmVtYXRpYyhoZWlnaHQsIGFuZ2xlLCAwLjAsIDAuMCwgJnhfeV9nb2Fscyk7CisKKyAgQVNTRVJUX1RSVUUoZnJpZGdlX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAucHJvZmlsaW5nX3R5cGUoMSkKKyAgICAgICAgICAgICAgICAgIC54KHhfeV9nb2Fscy5mcmlkZ2VfeCkKKyAgICAgICAgICAgICAgICAgIC55KHhfeV9nb2Fscy5mcmlkZ2VfaCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfeF92ZWxvY2l0eSgyMCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfeV92ZWxvY2l0eSgyMCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfeF9hY2NlbGVyYXRpb24oMjApCisgICAgICAgICAgICAgICAgICAubWF4X3lfYWNjZWxlcmF0aW9uKDIwKQorICAgICAgICAgICAgICAgICAgLlNlbmQoKSk7CisKKyAgLy8gR2l2ZSBpdCBhIGxvdCBvZiB0aW1lIHRvIGdldCB0aGVyZS4KKyAgUnVuRm9yVGltZShUaW1lOjpJblNlY29uZHMoNSkpOworCisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGxvb3AgY2FuIHJlYWNoIGEgZ29hbC4KK1RFU1RfRihGcmlkZ2VUZXN0LCBSZWFjaGVzR29hbCkgeworICAvLyBTZXQgYSByZWFzb25hYmxlIGdvYWwuCisgIGNvbnN0IGF1dG8gJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisgIGNvbnN0IGRvdWJsZSBzb2Z0X2xpbWl0ID0gdmFsdWVzLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9saW1pdDsKKyAgQVNTRVJUX1RSVUUoZnJpZGdlX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAuYW5nbGUoTV9QSSAvIDQuMCkKKyAgICAgICAgICAgICAgICAgIC5oZWlnaHQoc29mdF9saW1pdCArIDAuNSkKKyAgICAgICAgICAgICAgICAgIC5tYXhfdmVsb2NpdHkoMjApCisgICAgICAgICAgICAgICAgICAubWF4X2FjY2VsZXJhdGlvbigyMCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfYW5ndWxhcl92ZWxvY2l0eSgyMCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfYW5ndWxhcl9hY2NlbGVyYXRpb24oMjApCisgICAgICAgICAgICAgICAgICAuU2VuZCgpKTsKKworICAvLyBHaXZlIGl0IGEgbG90IG9mIHRpbWUgdG8gZ2V0IHRoZXJlLgorICBSdW5Gb3JUaW1lKFRpbWU6OkluU2Vjb25kcyg1KSk7CisKKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgbG9vcCBkb2Vzbid0IHRyeSBhbmQgZ28gYmV5b25kIHRoZSBwaHlzaWNhbCByYW5nZSBvZiB0aGUKKy8vIG1lY2hhbmlzbXMuCitURVNUX0YoRnJpZGdlVGVzdCwgUmVzcGVjdHNSYW5nZSkgeworICAvLyBQdXQgdGhlIGFybSB1cCB0byBnZXQgaXQgb3V0IG9mIHRoZSB3YXkuCisgIC8vIFdlJ3JlIGdvaW5nIHRvIHNlbmQgdGhlIGVsZXZhdG9yIHRvIC01LCB3aGljaCBzaG91bGQgYmUgc2lnbmlmaWNhbnRseSB0b28KKyAgLy8gbG93LgorICBBU1NFUlRfVFJVRShmcmlkZ2VfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgIC5hbmdsZShNX1BJKQorICAgICAgICAgICAgICAgICAgLmhlaWdodCgtNS4wKQorICAgICAgICAgICAgICAgICAgLm1heF92ZWxvY2l0eSgyMCkKKyAgICAgICAgICAgICAgICAgIC5tYXhfYWNjZWxlcmF0aW9uKDIwKQorICAgICAgICAgICAgICAgICAgLm1heF9hbmd1bGFyX3ZlbG9jaXR5KDIwKQorICAgICAgICAgICAgICAgICAgLm1heF9hbmd1bGFyX2FjY2VsZXJhdGlvbigyMCkKKyAgICAgICAgICAgICAgICAgIC5TZW5kKCkpOworCisgIFJ1bkZvclRpbWUoVGltZTo6SW5TZWNvbmRzKDEwKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbmVhciBvdXIgc29mdCBsaW1pdC4KKyAgZnJpZGdlX3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgY29uc3QgYXV0byAmdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKyAgRVhQRUNUX05FQVIodmFsdWVzLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9saW1pdCwgZnJpZGdlX3F1ZXVlXy5zdGF0dXMtPmhlaWdodCwKKyAgICAgICAgICAgICAgMC4wMDEpOworICBFWFBFQ1RfTkVBUih2YWx1ZXMuZnJpZGdlLmFybS51cHBlcl9saW1pdCwgZnJpZGdlX3F1ZXVlXy5zdGF0dXMtPmFuZ2xlLAorICAgICAgICAgICAgICAwLjAwMSk7CisKKyAgLy8gUHV0IHRoZSBhcm0gZG93biB0byBnZXQgaXQgb3V0IG9mIHRoZSB3YXkuCisgIC8vIFdlJ3JlIGdvaW5nIHRvIGdpdmUgdGhlIGVsZXZhdG9yIHNvbWUgcmlkaWN1bG91c2x5IGhpZ2ggZ29hbC4KKyAgQVNTRVJUX1RSVUUoZnJpZGdlX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAuYW5nbGUoLU1fUEkpCisgICAgICAgICAgICAgICAgICAuaGVpZ2h0KDUwLjApCisgICAgICAgICAgICAgICAgICAubWF4X3ZlbG9jaXR5KDIwKQorICAgICAgICAgICAgICAgICAgLm1heF9hY2NlbGVyYXRpb24oMjApCisgICAgICAgICAgICAgICAgICAubWF4X2FuZ3VsYXJfdmVsb2NpdHkoMjApCisgICAgICAgICAgICAgICAgICAubWF4X2FuZ3VsYXJfYWNjZWxlcmF0aW9uKDIwKQorICAgICAgICAgICAgICAgICAgLlNlbmQoKSk7CisKKyAgUnVuRm9yVGltZShUaW1lOjpJblNlY29uZHMoMTApKTsKKworICAvLyBDaGVjayB0aGF0IHdlIGFyZSBuZWFyIG91ciBzb2Z0IGxpbWl0LgorICBmcmlkZ2VfcXVldWVfLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBFWFBFQ1RfTkVBUih2YWx1ZXMuZnJpZGdlLmVsZXZhdG9yLnVwcGVyX2xpbWl0LCBmcmlkZ2VfcXVldWVfLnN0YXR1cy0+aGVpZ2h0LAorICAgICAgICAgICAgICAwLjAwMSk7CisgIEVYUEVDVF9ORUFSKHZhbHVlcy5mcmlkZ2UuYXJtLmxvd2VyX2xpbWl0LCBmcmlkZ2VfcXVldWVfLnN0YXR1cy0+YW5nbGUsCisgICAgICAgICAgICAgIDAuMDAxKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgbG9vcCB6ZXJvZXMgd2hlbiBydW4gZm9yIGEgd2hpbGUuCitURVNUX0YoRnJpZGdlVGVzdCwgWmVyb1Rlc3QpIHsKKyAgZnJpZGdlX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYW5nbGUoMC4wKQorICAgICAgLmhlaWdodCgwLjUpCisgICAgICAubWF4X3ZlbG9jaXR5KDIwKQorICAgICAgLm1heF9hY2NlbGVyYXRpb24oMjApCisgICAgICAubWF4X2FuZ3VsYXJfdmVsb2NpdHkoMjApCisgICAgICAubWF4X2FuZ3VsYXJfYWNjZWxlcmF0aW9uKDIwKQorICAgICAgLlNlbmQoKTsKKyAgUnVuRm9yVGltZShUaW1lOjpJblNlY29uZHMoNSkpOworCisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3RhcnRpbmcgYXQgdGhlIGxvd2VyIGhhcmRzdG9wcyBkb2Vzbid0IGNhdXNlIGFuIGFib3J0LgorVEVTVF9GKEZyaWRnZVRlc3QsIExvd2VySGFyZHN0b3BTdGFydHVwKSB7CisgIGZyaWRnZV9wbGFudF8uSW5pdGlhbGl6ZUVsZXZhdG9yUG9zaXRpb24oCisgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9oYXJkX2xpbWl0LAorICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuZWxldmF0b3IubG93ZXJfaGFyZF9saW1pdCk7CisgIGZyaWRnZV9wbGFudF8uSW5pdGlhbGl6ZUFybVBvc2l0aW9uKAorICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLmxvd2VyX2hhcmRfbGltaXQsCisgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5hcm0ubG93ZXJfaGFyZF9saW1pdCk7CisgIGZyaWRnZV9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5hbmdsZSgwLjApLmhlaWdodCgwLjQpLlNlbmQoKTsKKyAgLy8gV2UgaGF2ZSB0byB3YWl0IGZvciBpdCB0byBwdXQgdGhlIGVsZXZhdG9yIGluIGEgc2FmZSBwb3NpdGlvbiBhcyB3ZWxsLgorICBSdW5Gb3JUaW1lKFRpbWU6OkluTVMoODAwMCkpOworCisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3RhcnRpbmcgYXQgdGhlIHVwcGVyIGhhcmRzdG9wcyBkb2Vzbid0IGNhdXNlIGFuIGFib3J0LgorVEVTVF9GKEZyaWRnZVRlc3QsIFVwcGVySGFyZHN0b3BTdGFydHVwKSB7CisgIGZyaWRnZV9wbGFudF8uSW5pdGlhbGl6ZUVsZXZhdG9yUG9zaXRpb24oCisgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5lbGV2YXRvci51cHBlcl9oYXJkX2xpbWl0LAorICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuZWxldmF0b3IudXBwZXJfaGFyZF9saW1pdCk7CisgIGZyaWRnZV9wbGFudF8uSW5pdGlhbGl6ZUFybVBvc2l0aW9uKAorICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLnVwcGVyX2hhcmRfbGltaXQsCisgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5hcm0udXBwZXJfaGFyZF9saW1pdCk7CisgIGZyaWRnZV9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5hbmdsZSgwLjApLmhlaWdodCgwLjQpLlNlbmQoKTsKKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDUwMDApKTsKKworICBWZXJpZnlOZWFyR29hbCgpOworfQorCisvLyBUZXN0cyB0aGF0IHN0YXJ0aW5nIHdpdGggYW4gaW5pdGlhbCBhcm0gZGlmZmVyZW5jZSB0cmlnZ2VycyBhbiBFU1RPUC4KK1RFU1RfRihGcmlkZ2VUZXN0LCBBcm1GYXJBcGFydEVzdG9wKSB7CisgIGZyaWRnZV9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5hbmdsZSgwLjApLmhlaWdodCgwLjQpLlNlbmQoKTsKKworICBkbyB7CisgICAgZnJpZGdlX3BsYW50Xy5Jbml0aWFsaXplQXJtUG9zaXRpb24oCisgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmFybS5sb3dlcl9saW1pdCwKKyAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLmxvd2VyX2xpbWl0ICsgMC4yKTsKKyAgICBTZW5kTWVzc2FnZXModHJ1ZSk7CisgICAgZnJpZGdlX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgZnJpZGdlXy5JdGVyYXRlKCk7CisgICAgZnJpZGdlX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFRpY2tUaW1lKCk7CisgIH0gd2hpbGUgKGZyaWRnZV8uc3RhdGUoKSA9PSBGcmlkZ2U6OklOSVRJQUxJWklORyk7CisKKyAgRVhQRUNUX0VRKEZyaWRnZTo6WkVST0lOR19FTEVWQVRPUiwgZnJpZGdlXy5zdGF0ZSgpKTsKKworICAvLyBUT0RPKGF1c3Rpbik6IFdlIHNob3VsZCBlc3RvcCBlYXJsaWVyIG9uY2UgUGhpbCdzIGNvZGUgdG8gZGV0ZWN0IGlzc3VlcworICAvLyBiZWZvcmUgdGhlIGluZGV4IHB1bHNlIGlzIG1lcmdlZC4KKyAgd2hpbGUgKGZyaWRnZV8uc3RhdGUoKSAhPSBGcmlkZ2U6OlJVTk5JTkcgJiYKKyAgICAgICAgIGZyaWRnZV8uc3RhdGUoKSAhPSBGcmlkZ2U6OkVTVE9QKSB7CisgICAgU2VuZE1lc3NhZ2VzKHRydWUpOworICAgIGZyaWRnZV9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIGZyaWRnZV8uSXRlcmF0ZSgpOworICAgIGZyaWRnZV9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBUaWNrVGltZSgpOworICB9CisKKyAgRVhQRUNUX0VRKEZyaWRnZTo6RVNUT1AsIGZyaWRnZV8uc3RhdGUoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3RhcnRpbmcgd2l0aCBhbiBpbml0aWFsIGVsZXZhdG9yIGRpZmZlcmVuY2UgdHJpZ2dlcnMgYW4gRVNUT1AuCitURVNUX0YoRnJpZGdlVGVzdCwgRWxldmF0b3JGYXJBcGFydEVzdG9wKSB7CisgIGZyaWRnZV9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5hbmdsZSgwLjApLmhlaWdodCgwLjQpLlNlbmQoKTsKKworICBkbyB7CisgICAgZnJpZGdlX3BsYW50Xy5Jbml0aWFsaXplRWxldmF0b3JQb3NpdGlvbigKKyAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuZWxldmF0b3IubG93ZXJfbGltaXQsCisgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLmxvd2VyX2xpbWl0ICsgMC4xKTsKKyAgICBTZW5kTWVzc2FnZXModHJ1ZSk7CisgICAgZnJpZGdlX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgZnJpZGdlXy5JdGVyYXRlKCk7CisgICAgZnJpZGdlX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFRpY2tUaW1lKCk7CisgIH0gd2hpbGUgKGZyaWRnZV8uc3RhdGUoKSA9PSBGcmlkZ2U6OklOSVRJQUxJWklORyk7CisKKyAgRVhQRUNUX0VRKEZyaWRnZTo6WkVST0lOR19FTEVWQVRPUiwgZnJpZGdlXy5zdGF0ZSgpKTsKKworICAvLyBUT0RPKGF1c3Rpbik6IFdlIHNob3VsZCBlc3RvcCBlYXJsaWVyIG9uY2UgUGhpbCdzIGNvZGUgdG8gZGV0ZWN0IGlzc3VlcworICAvLyBiZWZvcmUgdGhlIGluZGV4IHB1bHNlIGlzIG1lcmdlZC4KKyAgd2hpbGUgKGZyaWRnZV8uc3RhdGUoKSAhPSBGcmlkZ2U6OlJVTk5JTkcgJiYKKyAgICAgICAgIGZyaWRnZV8uc3RhdGUoKSAhPSBGcmlkZ2U6OkVTVE9QKSB7CisgICAgU2VuZE1lc3NhZ2VzKHRydWUpOworICAgIGZyaWRnZV9wbGFudF8uU2VuZFBvc2l0aW9uTWVzc2FnZSgpOworICAgIGZyaWRnZV8uSXRlcmF0ZSgpOworICAgIGZyaWRnZV9wbGFudF8uU2ltdWxhdGUoKTsKKyAgICBUaWNrVGltZSgpOworICB9CisKKyAgRVhQRUNUX0VRKEZyaWRnZTo6RVNUT1AsIGZyaWRnZV8uc3RhdGUoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3RhcnRpbmcgd2l0aCBhbiBpbml0aWFsIGVsZXZhdG9yIGRpZmZlcmVuY2UgY29udmVyZ2VzIGJhY2sgdG8gMAorLy8gZXJyb3Igd2hlbiB6ZXJvZWQuCitURVNUX0YoRnJpZGdlVGVzdCwgRWxldmF0b3JGaXhFcnJvcikgeworICBmcmlkZ2VfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkKKyAgICAgIC5hbmdsZSgwLjApCisgICAgICAuaGVpZ2h0KDAuMikKKyAgICAgIC5tYXhfdmVsb2NpdHkoMjApCisgICAgICAubWF4X2FjY2VsZXJhdGlvbigyMCkKKyAgICAgIC5TZW5kKCk7CisKKyAgZG8geworICAgIGZyaWRnZV9wbGFudF8uSW5pdGlhbGl6ZUVsZXZhdG9yUG9zaXRpb24oCisgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLmxvd2VyX2xpbWl0LAorICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmZyaWRnZS5lbGV2YXRvci5sb3dlcl9saW1pdCArIDAuMDEpOworICAgIGZyaWRnZV9wbGFudF8uRXJyb3JPbkFic29sdXRlRGlmZmVyZW5jZSgpOworICAgIFNlbmRNZXNzYWdlcyh0cnVlKTsKKyAgICBmcmlkZ2VfcGxhbnRfLlNlbmRQb3NpdGlvbk1lc3NhZ2UoKTsKKyAgICBmcmlkZ2VfLkl0ZXJhdGUoKTsKKyAgICBmcmlkZ2VfcGxhbnRfLlNpbXVsYXRlKCk7CisgICAgVGlja1RpbWUoKTsKKyAgfSB3aGlsZSAoZnJpZGdlXy5zdGF0ZSgpID09IEZyaWRnZTo6SU5JVElBTElaSU5HKTsKKworICBFWFBFQ1RfRVEoRnJpZGdlOjpaRVJPSU5HX0VMRVZBVE9SLCBmcmlkZ2VfLnN0YXRlKCkpOworCisgIFJ1bkZvclRpbWUoVGltZTo6SW5TZWNvbmRzKDUpKTsKKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCBzdGFydGluZyB3aXRoIGFuIGluaXRpYWwgYXJtIGRpZmZlcmVuY2UgY29udmVyZ2VzIGJhY2sgdG8gMAorLy8gZXJyb3Igd2hlbiB6ZXJvZWQuCitURVNUX0YoRnJpZGdlVGVzdCwgQXJtRml4RXJyb3IpIHsKKyAgZnJpZGdlX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAuYW5nbGUoMC4wKQorICAgICAgLmhlaWdodCgwLjIpCisgICAgICAubWF4X2FuZ3VsYXJfdmVsb2NpdHkoMjApCisgICAgICAubWF4X2FuZ3VsYXJfYWNjZWxlcmF0aW9uKDIwKQorICAgICAgLlNlbmQoKTsKKworICBkbyB7CisgICAgZnJpZGdlX3BsYW50Xy5Jbml0aWFsaXplQXJtUG9zaXRpb24oMC4wLCAwLjAyKTsKKyAgICBmcmlkZ2VfcGxhbnRfLkVycm9yT25BYnNvbHV0ZURpZmZlcmVuY2UoKTsKKyAgICBTZW5kTWVzc2FnZXModHJ1ZSk7CisgICAgZnJpZGdlX3BsYW50Xy5TZW5kUG9zaXRpb25NZXNzYWdlKCk7CisgICAgZnJpZGdlXy5JdGVyYXRlKCk7CisgICAgZnJpZGdlX3BsYW50Xy5TaW11bGF0ZSgpOworICAgIFRpY2tUaW1lKCk7CisgIH0gd2hpbGUgKGZyaWRnZV8uc3RhdGUoKSA9PSBGcmlkZ2U6OklOSVRJQUxJWklORyk7CisKKyAgRVhQRUNUX0VRKEZyaWRnZTo6WkVST0lOR19FTEVWQVRPUiwgZnJpZGdlXy5zdGF0ZSgpKTsKKworICBSdW5Gb3JUaW1lKFRpbWU6OkluU2Vjb25kcyg1KSk7CisgIFZlcmlmeU5lYXJHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgcmVzZXR0aW5nIFdQSUxpYiByZXN1bHRzIGluIGEgcmV6ZXJvLgorVEVTVF9GKEZyaWRnZVRlc3QsIFJlc2V0VGVzdCkgeworICBmcmlkZ2VfcGxhbnRfLkluaXRpYWxpemVFbGV2YXRvclBvc2l0aW9uKAorICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuZWxldmF0b3IudXBwZXJfaGFyZF9saW1pdCwKKyAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmVsZXZhdG9yLnVwcGVyX2hhcmRfbGltaXQpOworICBmcmlkZ2VfcGxhbnRfLkluaXRpYWxpemVBcm1Qb3NpdGlvbigKKyAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmFybS51cHBlcl9oYXJkX2xpbWl0LAorICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLnVwcGVyX2hhcmRfbGltaXQpOworICBmcmlkZ2VfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkuYW5nbGUoMC4wMykuaGVpZ2h0KDAuNDUpLlNlbmQoKTsKKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDUwMDApKTsKKworICBFWFBFQ1RfRVEoRnJpZGdlOjpSVU5OSU5HLCBmcmlkZ2VfLnN0YXRlKCkpOworICBWZXJpZnlOZWFyR29hbCgpOworICBTaW11bGF0ZVNlbnNvclJlc2V0KCk7CisgIFJ1bkZvclRpbWUoVGltZTo6SW5NUygxMDApKTsKKyAgRVhQRUNUX05FKEZyaWRnZTo6UlVOTklORywgZnJpZGdlXy5zdGF0ZSgpKTsKKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDYwMDApKTsKKyAgRVhQRUNUX0VRKEZyaWRnZTo6UlVOTklORywgZnJpZGdlXy5zdGF0ZSgpKTsKKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgaW50ZXJuYWwgZ29hbHMgZG9uJ3QgY2hhbmdlIHdoaWxlIGRpc2FibGVkLgorVEVTVF9GKEZyaWRnZVRlc3QsIERpc2FibGVkR29hbFRlc3QpIHsKKyAgZnJpZGdlX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLmFuZ2xlKDAuMDMpLmhlaWdodCgwLjQ1KS5TZW5kKCk7CisKKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDEwMCksIGZhbHNlKTsKKyAgRVhQRUNUX0VRKDAuMCwgZnJpZGdlXy5lbGV2YXRvcl9nb2FsXyk7CisgIEVYUEVDVF9FUSgwLjAsIGZyaWRnZV8uYXJtX2dvYWxfKTsKKworICAvLyBOb3cgbWFrZSBzdXJlIHRoZXkgbW92ZSBjb3JyZWN0bHkKKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDQwMDApLCB0cnVlKTsKKyAgRVhQRUNUX05FKDAuMCwgZnJpZGdlXy5lbGV2YXRvcl9nb2FsXyk7CisgIEVYUEVDVF9ORSgwLjAsIGZyaWRnZV8uYXJtX2dvYWxfKTsKK30KKworLy8gVGVzdHMgdGhhdCB0aGUgZWxldmF0b3IgemVyb2luZyBnb2FscyBkb24ndCB3aW5kIHVwIHRvbyBmYXIuCitURVNUX0YoRnJpZGdlVGVzdCwgRWxldmF0b3JHb2FsUG9zaXRpdmVXaW5kdXBUZXN0KSB7CisgIGZyaWRnZV9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5hbmdsZSgwLjAzKS5oZWlnaHQoMC40NSkuU2VuZCgpOworCisgIHdoaWxlIChmcmlkZ2VfLnN0YXRlKCkgIT0gRnJpZGdlOjpaRVJPSU5HX0VMRVZBVE9SKSB7CisgICAgUnVuSXRlcmF0aW9uKCk7CisgIH0KKworICAvLyBLaWNrIGl0LgorICBSdW5Gb3JUaW1lKFRpbWU6OkluTVMoNTApKTsKKyAgZG91YmxlIG9yaWdfZnJpZGdlX2dvYWwgPSBmcmlkZ2VfLmVsZXZhdG9yX2dvYWxfOworICBmcmlkZ2VfLmVsZXZhdG9yX2dvYWxfICs9IDEwMC4wOworCisgIFJ1bkl0ZXJhdGlvbigpOworICBFWFBFQ1RfTkVBUihvcmlnX2ZyaWRnZV9nb2FsLCBmcmlkZ2VfLmVsZXZhdG9yX2dvYWxfLCAwLjA1KTsKKworICBSdW5JdGVyYXRpb24oKTsKKworICBFWFBFQ1RfRVEoZnJpZGdlXy5lbGV2YXRvcl9sb29wXy0+VSgpLCBmcmlkZ2VfLmVsZXZhdG9yX2xvb3BfLT5VX3VuY2FwcGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBhcm0gemVyb2luZyBnb2FscyBkb24ndCB3aW5kIHVwIHRvbyBmYXIuCitURVNUX0YoRnJpZGdlVGVzdCwgQXJtR29hbFBvc2l0aXZlV2luZHVwVGVzdCkgeworICBmcmlkZ2VfcXVldWVfLmdvYWwuTWFrZVdpdGhCdWlsZGVyKCkuYW5nbGUoMC4wMykuaGVpZ2h0KDAuNDUpLlNlbmQoKTsKKworICBpbnQgaSA9IDA7CisgIHdoaWxlIChmcmlkZ2VfLnN0YXRlKCkgIT0gRnJpZGdlOjpaRVJPSU5HX0FSTSkgeworICAgIFJ1bkl0ZXJhdGlvbigpOworICAgICsraTsKKyAgICBBU1NFUlRfTEUoaSwgMTAwMDApOworICB9CisKKyAgLy8gS2ljayBpdC4KKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDUwKSk7CisgIGRvdWJsZSBvcmlnX2ZyaWRnZV9nb2FsID0gZnJpZGdlXy5hcm1fZ29hbF87CisgIGZyaWRnZV8uYXJtX2dvYWxfICs9IDEwMC4wOworCisgIFJ1bkl0ZXJhdGlvbigpOworICBFWFBFQ1RfTkVBUihvcmlnX2ZyaWRnZV9nb2FsLCBmcmlkZ2VfLmFybV9nb2FsXywgMC4wNSk7CisKKyAgUnVuSXRlcmF0aW9uKCk7CisKKyAgRVhQRUNUX0VRKGZyaWRnZV8uYXJtX2xvb3BfLT5VKCksIGZyaWRnZV8uYXJtX2xvb3BfLT5VX3VuY2FwcGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBlbGV2YXRvciB6ZXJvaW5nIGdvYWxzIGRvbid0IHdpbmQgdXAgdG9vIGZhci4KK1RFU1RfRihGcmlkZ2VUZXN0LCBFbGV2YXRvckdvYWxOZWdhdGl2ZVdpbmR1cFRlc3QpIHsKKyAgZnJpZGdlX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLmFuZ2xlKDAuMDMpLmhlaWdodCgwLjQ1KS5TZW5kKCk7CisKKyAgd2hpbGUgKGZyaWRnZV8uc3RhdGUoKSAhPSBGcmlkZ2U6OlpFUk9JTkdfRUxFVkFUT1IpIHsKKyAgICBSdW5JdGVyYXRpb24oKTsKKyAgfQorCisgIC8vIEtpY2sgaXQuCisgIFJ1bkZvclRpbWUoVGltZTo6SW5NUyg1MCkpOworICBkb3VibGUgb3JpZ19mcmlkZ2VfZ29hbCA9IGZyaWRnZV8uZWxldmF0b3JfZ29hbF87CisgIGZyaWRnZV8uZWxldmF0b3JfZ29hbF8gLT0gMTAwLjA7CisKKyAgUnVuSXRlcmF0aW9uKCk7CisgIEVYUEVDVF9ORUFSKG9yaWdfZnJpZGdlX2dvYWwsIGZyaWRnZV8uZWxldmF0b3JfZ29hbF8sIDAuMDUpOworCisgIFJ1bkl0ZXJhdGlvbigpOworCisgIEVYUEVDVF9FUShmcmlkZ2VfLmVsZXZhdG9yX2xvb3BfLT5VKCksIGZyaWRnZV8uZWxldmF0b3JfbG9vcF8tPlVfdW5jYXBwZWQoKSk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdGhlIGFybSB6ZXJvaW5nIGdvYWxzIGRvbid0IHdpbmQgdXAgdG9vIGZhci4KK1RFU1RfRihGcmlkZ2VUZXN0LCBBcm1Hb2FsTmVnYXRpdmVXaW5kdXBUZXN0KSB7CisgIGZyaWRnZV9xdWV1ZV8uZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKS5hbmdsZSgwLjAzKS5oZWlnaHQoMC40NSkuU2VuZCgpOworCisgIHdoaWxlIChmcmlkZ2VfLnN0YXRlKCkgIT0gRnJpZGdlOjpaRVJPSU5HX0FSTSkgeworICAgIFJ1bkl0ZXJhdGlvbigpOworICB9CisKKyAgLy8gS2ljayBpdC4KKyAgUnVuRm9yVGltZShUaW1lOjpJbk1TKDUwKSk7CisgIGRvdWJsZSBvcmlnX2ZyaWRnZV9nb2FsID0gZnJpZGdlXy5hcm1fZ29hbF87CisgIGZyaWRnZV8uYXJtX2dvYWxfIC09IDEwMC4wOworCisgIFJ1bkl0ZXJhdGlvbigpOworICBFWFBFQ1RfTkVBUihvcmlnX2ZyaWRnZV9nb2FsLCBmcmlkZ2VfLmFybV9nb2FsXywgMC4wNSk7CisKKyAgUnVuSXRlcmF0aW9uKCk7CisKKyAgRVhQRUNUX0VRKGZyaWRnZV8uYXJtX2xvb3BfLT5VKCksIGZyaWRnZV8uYXJtX2xvb3BfLT5VX3VuY2FwcGVkKCkpOworfQorCisvLyBUZXN0cyB0aGF0IHRoZSBsb29wIHplcm9lcyB3aGVuIHJ1biBmb3IgYSB3aGlsZS4KK1RFU1RfRihGcmlkZ2VUZXN0LCBaZXJvTm9Hb2FsKSB7CisgIFJ1bkZvclRpbWUoVGltZTo6SW5TZWNvbmRzKDUpKTsKKworICBFWFBFQ1RfRVEoRnJpZGdlOjpSVU5OSU5HLCBmcmlkZ2VfLnN0YXRlKCkpOworfQorCisvLyBUZXN0cyB0aGF0IGlmIHdlIHN0YXJ0IGF0IHRoZSBib3R0b20sIHRoZSBlbGV2YXRvciBtb3ZlcyB0byBhIHNhZmUgaGVpZ2h0CisvLyBiZWZvcmUgemVyb2luZyB0aGUgYXJtLgorVEVTVF9GKEZyaWRnZVRlc3QsIFNhZmVBcm1aZXJvaW5nKSB7CisgIGF1dG8gJnZhbHVlcyA9IGNvbnN0YW50czo6R2V0VmFsdWVzKCk7CisgIGZyaWRnZV9wbGFudF8uSW5pdGlhbGl6ZUVsZXZhdG9yUG9zaXRpb24oCisgICAgICB2YWx1ZXMuZnJpZGdlLmVsZXZhdG9yLmxvd2VyX2hhcmRfbGltaXQpOworICBmcmlkZ2VfcGxhbnRfLkluaXRpYWxpemVBcm1Qb3NpdGlvbihNX1BJIC8gNC4wKTsKKworICBjb25zdCBhdXRvIHN0YXJ0X3RpbWUgPSBUaW1lOjpOb3coKTsKKyAgZG91YmxlIGxhc3RfYXJtX2dvYWwgPSBmcmlkZ2VfLmFybV9nb2FsXzsKKyAgd2hpbGUgKFRpbWU6Ok5vdygpIDwgc3RhcnRfdGltZSArIFRpbWU6OkluTVMoNDAwMCkpIHsKKyAgICBSdW5JdGVyYXRpb24oKTsKKworICAgIGlmIChmcmlkZ2VfLnN0YXRlKCkgIT0gRnJpZGdlOjpaRVJPSU5HX0VMRVZBVE9SKSB7CisgICAgICAvLyBXYWl0IHVudGlsIHdlIGFyZSB6ZXJvaW5nIHRoZSBlbGV2YXRvci4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGZyaWRnZV9xdWV1ZV8uc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgICAgQVNTRVJUX1RSVUUoZnJpZGdlX3F1ZXVlXy5zdGF0dXMuZ2V0KCkgIT0gbnVsbHB0cik7CisgICAgaWYgKGZyaWRnZV9xdWV1ZV8uc3RhdHVzLT5oZWlnaHQgPiB2YWx1ZXMuZnJpZGdlLmFybV96ZXJvaW5nX2hlaWdodCkgeworICAgICAgLy8gV2UgaGFkIGJldHRlciBub3QgYmUgdHJ5aW5nIHRvIHplcm8gdGhlIGFybS4uLgorICAgICAgRVhQRUNUX0VRKGxhc3RfYXJtX2dvYWwsIGZyaWRnZV8uYXJtX2dvYWxfKTsKKyAgICAgIGxhc3RfYXJtX2dvYWwgPSBmcmlkZ2VfLmFybV9nb2FsXzsKKyAgICB9CisgIH0KK30KKworLy8gVGVzdHMgdGhhdCB0aGUgYXJtIGludGVncmF0b3Igd29ya3MuCitURVNUX0YoRnJpZGdlVGVzdCwgQXJtSW50ZWdyYXRvclRlc3QpIHsKKyAgZnJpZGdlX3BsYW50Xy5Jbml0aWFsaXplQXJtUG9zaXRpb24oCisgICAgICAoY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5mcmlkZ2UuYXJtLmxvd2VyX2hhcmRfbGltaXQgKworICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZnJpZGdlLmFybS5sb3dlcl9oYXJkX2xpbWl0KSAvCisgICAgICAyLjApOworICBmcmlkZ2VfcGxhbnRfLnNldF9hcm1fcG93ZXJfZXJyb3IoMS4wKTsKKyAgZnJpZGdlX3F1ZXVlXy5nb2FsLk1ha2VXaXRoQnVpbGRlcigpLmFuZ2xlKDAuMCkuaGVpZ2h0KDAuNCkuU2VuZCgpOworCisgIFJ1bkZvclRpbWUoVGltZTo6SW5NUyg4MDAwKSk7CisKKyAgVmVyaWZ5TmVhckdvYWwoKTsKK30KKworLy8gUGhpbDoKKy8vIFRPRE8oYXVzdGluKTogQ2hlY2sgdGhhdCB3ZSBlLXN0b3AgaWYgZW5jb2RlciBpbmRleCBwdWxzZSBpcyBub3QgbgorLy8gcmV2b2x1dGlvbnMgYXdheSBmcm9tIGxhc3Qgb25lLiAoZ290IGV4dHJhIGNvdW50cyBmcm9tIG5vaXNlLCBldGMpLgorLy8gVE9ETyhhdXN0aW4pOiBDaGVjayB0aGF0IHdlIGUtc3RvcCBpZiBwb3QgZGlzYWdyZWVzIHRvbyBtdWNoIHdpdGggZW5jb2RlcgorLy8gYWZ0ZXIgd2UgYXJlIHplcm9lZC4KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzCit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2VfbWFpbi5jYyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZV9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmQ2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2VfbWFpbi5jYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLmgiCisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisKK2ludCBtYWluKCkgeworICA6OmFvczo6SW5pdCgpOworICBmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkZyaWRnZSBmcmlkZ2U7CisgIGZyaWRnZS5SdW4oKTsKKyAgOjphb3M6OkNsZWFudXAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9pbnRlZ3JhbF9hcm1fcGxhbnQuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9pbnRlZ3JhbF9hcm1fcGxhbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyNjlkNwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ludGVncmFsX2FybV9wbGFudC5jYwpAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvaW50ZWdyYWxfYXJtX3BsYW50LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9zdGF0ZV9mZWVkYmFja19sb29wLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgeworCitTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NSwgMiwgMj4gTWFrZUludGVncmFsQXJtUGxhbnRDb2VmZmljaWVudHMoKSB7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA1LCA1PiBBOworICBBIDw8IDEuMCwgMC4wMDQ3OTY0MjAyNTQ1NCwgMC4wLCAwLjAsIDQuOTI5OTM1NTk5NjllLTA1LCAwLjAsIDAuOTE5Njg4NTg1MDI4LCAwLjAsIDAuMCwgMC4wMTk0NDg0MDM1MTYyLCAwLjAsIDAuMCwgMC45OTk1Mzk3NzE2MTMsIDAuMDA0Nzk1NjYzODI2NDUsIDAuMCwgMC4wLCAwLjAsIC0wLjE4MTU0MzkwNjIxLCAwLjkxOTI0MTAyMjI5NywgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDEuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDUsIDI+IEI7CisgIEIgPDwgMi40NjQ5Njc3OTk4NGUtMDUsIDIuNDY0OTY3Nzk5ODRlLTA1LCAwLjAwOTcyNDIwMTc1ODA4LCAwLjAwOTcyNDIwMTc1ODA4LCAyLjQ2NDc3NDQ5NTM4ZS0wNSwgLTIuNDY0Nzc0NDk1MzhlLTA1LCAwLjAwOTcyMjY2ODE4NTMyLCAtMC4wMDk3MjI2NjgxODUzMiwgMC4wLCAwLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCA1PiBDOworICBDIDw8IDEuMCwgMC4wLCAxLjAsIDAuMCwgMC4wLCAxLjAsIDAuMCwgLTEuMCwgMC4wLCAwLjA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAyPiBEOworICBEIDw8IDAsIDAsIDAsIDA7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBVX21heDsKKyAgVV9tYXggPDwgMTIuMCwgMTIuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IFVfbWluOworICBVX21pbiA8PCAtMTIuMCwgLTEyLjA7CisgIHJldHVybiBTdGF0ZUZlZWRiYWNrUGxhbnRDb2VmZmljaWVudHM8NSwgMiwgMj4oQSwgQiwgQywgRCwgVV9tYXgsIFVfbWluKTsKK30KKworU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NSwgMiwgMj4gTWFrZUludGVncmFsQXJtQ29udHJvbGxlcigpIHsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDUsIDI+IEw7CisgIEwgPDwgMC40NjE4MDU5NDY4MzcsIDAuNDYxODA1OTQ2ODM3LCA1LjgzNDgzOTgzMzkyLCA1LjgzNDgzOTgzMzkyLCAwLjQyOTcyNTQ2NzgwMiwgLTAuNDI5NzI1NDY3ODAyLCAwLjE4MDQ0ODE2NTg2LCAtMC4xODA0NDgxNjU4NiwgMzEuMDYyMzk2NDg0OCwgMzEuMDYyMzk2NDg0ODsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDU+IEs7CisgIEsgPDwgMzIwLjk3OTYwNjA5MywgMjEuMDEyOTUxNzk1NSwgODg0LjIzMzc4NDc1OSwgMzYuMzYzNzc4MjExOSwgMS4wLCAzMjAuOTc5NjA2MDk1LCAyMS4wMTI5NTE3OTU2LCAtODg0LjIzMzc4NDc0OSwgLTM2LjM2Mzc3ODIxMTksIDEuMDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDUsIDU+IEFfaW52OworICBBX2ludiA8PCAxLjAsIC0wLjAwNTIxNTI2NTYxNTU5LCAwLjAsIDAuMCwgNS4yMTI5MjM0MTM5MWUtMDUsIDAuMCwgMS4wODczMjQ1NzUxNywgMC4wLCAwLjAsIC0wLjAyMTE0NjcyNzA5MDksIDAuMCwgMC4wLCAwLjk5OTUxMzM1NDA0NCwgLTAuMDA1MjE0NDQzMTMyNzMsIDAuMCwgMC4wLCAwLjAsIDAuMTk3Mzk3MTUwNjk0LCAxLjA4NjgyNDE1NzUzLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMS4wOworICByZXR1cm4gU3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NSwgMiwgMj4oTCwgSywgQV9pbnYsIE1ha2VJbnRlZ3JhbEFybVBsYW50Q29lZmZpY2llbnRzKCkpOworfQorCitTdGF0ZUZlZWRiYWNrUGxhbnQ8NSwgMiwgMj4gTWFrZUludGVncmFsQXJtUGxhbnQoKSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjp1bmlxdWVfcHRyPFN0YXRlRmVlZGJhY2tQbGFudENvZWZmaWNpZW50czw1LCAyLCAyPj4+IHBsYW50cygxKTsKKyAgcGxhbnRzWzBdID0gOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDUsIDIsIDI+PihuZXcgU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDUsIDIsIDI+KE1ha2VJbnRlZ3JhbEFybVBsYW50Q29lZmZpY2llbnRzKCkpKTsKKyAgcmV0dXJuIFN0YXRlRmVlZGJhY2tQbGFudDw1LCAyLCAyPigmcGxhbnRzKTsKK30KKworU3RhdGVGZWVkYmFja0xvb3A8NSwgMiwgMj4gTWFrZUludGVncmFsQXJtTG9vcCgpIHsKKyAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnVuaXF1ZV9wdHI8U3RhdGVGZWVkYmFja0NvbnRyb2xsZXI8NSwgMiwgMj4+PiBjb250cm9sbGVycygxKTsKKyAgY29udHJvbGxlcnNbMF0gPSA6OnN0ZDo6dW5pcXVlX3B0cjxTdGF0ZUZlZWRiYWNrQ29udHJvbGxlcjw1LCAyLCAyPj4obmV3IFN0YXRlRmVlZGJhY2tDb250cm9sbGVyPDUsIDIsIDI+KE1ha2VJbnRlZ3JhbEFybUNvbnRyb2xsZXIoKSkpOworICByZXR1cm4gU3RhdGVGZWVkYmFja0xvb3A8NSwgMiwgMj4oJmNvbnRyb2xsZXJzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ludGVncmFsX2FybV9wbGFudC5oIGIveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvaW50ZWdyYWxfYXJtX3BsYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhNDg3NgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ludGVncmFsX2FybV9wbGFudC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgWTIwMTVfQ09OVFJPTF9MT09QU19GUklER0VfSU5URUdSQUxfQVJNX1BMQU5UX0hfCisjZGVmaW5lIFkyMDE1X0NPTlRST0xfTE9PUFNfRlJJREdFX0lOVEVHUkFMX0FSTV9QTEFOVF9IXworCisjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvc3RhdGVfZmVlZGJhY2tfbG9vcC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKKworU3RhdGVGZWVkYmFja1BsYW50Q29lZmZpY2llbnRzPDUsIDIsIDI+IE1ha2VJbnRlZ3JhbEFybVBsYW50Q29lZmZpY2llbnRzKCk7CisKK1N0YXRlRmVlZGJhY2tDb250cm9sbGVyPDUsIDIsIDI+IE1ha2VJbnRlZ3JhbEFybUNvbnRyb2xsZXIoKTsKKworU3RhdGVGZWVkYmFja1BsYW50PDUsIDIsIDI+IE1ha2VJbnRlZ3JhbEFybVBsYW50KCk7CisKK1N0YXRlRmVlZGJhY2tMb29wPDUsIDIsIDI+IE1ha2VJbnRlZ3JhbEFybUxvb3AoKTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBZMjAxNV9DT05UUk9MX0xPT1BTX0ZSSURHRV9JTlRFR1JBTF9BUk1fUExBTlRfSF8KZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL3JlcGxheV9mcmlkZ2UuY2MgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9yZXBsYXlfZnJpZGdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Y2M5OGEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9yZXBsYXlfZnJpZGdlLmNjCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlICJhb3MvY29tbW9uL2NvbnRyb2xzL3JlcGxheV9jb250cm9sX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UucS5oIgorCisvLyBSZWFkcyBvbmUgb3IgbW9yZSBsb2cgZmlsZXMgYW5kIHNlbmRzIG91dCBhbGwgdGhlIHF1ZXVlIG1lc3NhZ2VzIChpbiB0aGUKKy8vIGNvcnJlY3Qgb3JkZXIgYW5kIGF0IHRoZSBjb3JyZWN0IHRpbWUpIHRvIGZlZWQgYSAibGl2ZSIgZnJpZGdlIHByb2Nlc3MuCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBpZiAoYXJnYyA8PSAxKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJOZWVkIGF0IGxlYXN0IG9uZSBmaWxlIHRvIHJlcGxheSFcbiIpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICA6OmFvczo6SW5pdE5SVCgpOworCisgIDo6YW9zOjpjb250cm9sczo6Q29udHJvbExvb3BSZXBsYXllcjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RnJpZGdlUXVldWU+CisgICAgICByZXBsYXllcigmOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZSwgImZyaWRnZSIpOworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgIHJlcGxheWVyLlByb2Nlc3NGaWxlKGFyZ3ZbaV0pOworICB9CisKKyAgOjphb3M6OkNsZWFudXAoKTsKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2FybS5weSBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2FybS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTc5OTBhCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vYXJtLnB5CkBAIC0wLDAgKzEsNDA5IEBACisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgY29udHJvbF9sb29wCitpbXBvcnQgY29udHJvbHMKK2ltcG9ydCBwb2x5dG9wZQoraW1wb3J0IHBvbHlkcml2ZXRyYWluCitpbXBvcnQgbnVtcHkKK2ltcG9ydCBtYXRoCitpbXBvcnQgc3lzCitpbXBvcnQgbWF0cGxvdGxpYgorZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgorCisKK2NsYXNzIEFybShjb250cm9sX2xvb3AuQ29udHJvbExvb3ApOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iQXJtIiwgbWFzcz1Ob25lKToKKyAgICBzdXBlcihBcm0sIHNlbGYpLl9faW5pdF9fKG5hbWUpCisgICAgIyBTdGFsbCBUb3JxdWUgaW4gTiBtCisgICAgc2VsZi5zdGFsbF90b3JxdWUgPSAwLjQ3NgorICAgICMgU3RhbGwgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5zdGFsbF9jdXJyZW50ID0gODAuNzMwCisgICAgIyBGcmVlIFNwZWVkIGluIFJQTQorICAgIHNlbGYuZnJlZV9zcGVlZCA9IDEzOTA2LjAKKyAgICAjIEZyZWUgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5mcmVlX2N1cnJlbnQgPSA1LjgyMAorICAgICMgTWFzcyBvZiB0aGUgYXJtCisgICAgaWYgbWFzcyBpcyBOb25lOgorICAgICAgc2VsZi5tYXNzID0gMTMuMAorICAgIGVsc2U6CisgICAgICBzZWxmLm1hc3MgPSBtYXNzCisKKyAgICAjIFJlc2lzdGFuY2Ugb2YgdGhlIG1vdG9yCisgICAgc2VsZi5SID0gMTIuMCAvIHNlbGYuc3RhbGxfY3VycmVudAorICAgICMgTW90b3IgdmVsb2NpdHkgY29uc3RhbnQKKyAgICBzZWxmLkt2ID0gKChzZWxmLmZyZWVfc3BlZWQgLyA2MC4wICogMi4wICogbnVtcHkucGkpIC8KKyAgICAgICAgICAgICAgICgxMi4wIC0gc2VsZi5SICogc2VsZi5mcmVlX2N1cnJlbnQpKQorICAgICMgVG9ycXVlIGNvbnN0YW50CisgICAgc2VsZi5LdCA9IHNlbGYuc3RhbGxfdG9ycXVlIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBHZWFyIHJhdGlvCisgICAgc2VsZi5HID0gKDQ0LjAgLyAxMi4wKSAqICg1NC4wIC8gMTQuMCkgKiAoNTQuMCAvIDE0LjApICogKDQ0LjAgLyAyMC4wKSAqICg3Mi4wIC8gMTYuMCkKKyAgICAjIEZyaWRnZSBhcm0gbGVuZ3RoCisgICAgc2VsZi5yID0gMzIgKiAwLjAyNTQKKyAgICAjIENvbnRyb2wgbG9vcCB0aW1lIHN0ZXAKKyAgICBzZWxmLmR0ID0gMC4wMDUKKworICAgICMgQXJtIG1vbWVudCBvZiBpbmVydGlhCisgICAgc2VsZi5KID0gc2VsZi5yICogc2VsZi5tYXNzCisKKyAgICAjIEFybSBsZWZ0L3JpZ2h0IHNwcmluZyBjb25zdGFudCAoTiptIC8gcmFkaWFuKQorICAgIHNlbGYuc3ByaW5nID0gMTAwLjAKKworICAgICMgU3RhdGUgaXMgW2F2ZXJhZ2UgcG9zaXRpb24sIGF2ZXJhZ2UgdmVsb2NpdHksCisgICAgIyAgICAgICAgICAgcG9zaXRpb24gZGlmZmVyZW5jZS8yLCB2ZWxvY2l0eSBkaWZmZXJlbmNlLzJdCisgICAgIyBQb3NpdGlvbiBkaWZmZXJlbmNlIGlzIDEgLSAyCisgICAgIyBJbnB1dCBpcyBbVm9sdGFnZSAxLCBWb2x0YWdlIDJdCisKKyAgICBzZWxmLkMxID0gc2VsZi5zcHJpbmcgLyAoc2VsZi5KICogMC41KQorICAgIHNlbGYuQzIgPSBzZWxmLkt0ICogc2VsZi5HIC8gKHNlbGYuSiAqIDAuNSAqIHNlbGYuUikKKyAgICBzZWxmLkMzID0gc2VsZi5HICogc2VsZi5HICogc2VsZi5LdCAvIChzZWxmLlIgICogc2VsZi5KICogMC41ICogc2VsZi5LdikKKworICAgIHNlbGYuQV9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDEsIDAsIDBdLAorICAgICAgICAgWzAsIC1zZWxmLkMzLCAwLCAwXSwKKyAgICAgICAgIFswLCAwLCAwLCAxXSwKKyAgICAgICAgIFswLCAwLCAtc2VsZi5DMSAqIDIuMCwgLXNlbGYuQzNdXSkKKworICAgIHByaW50ICdGdWxsIHNwZWVkIGlzJywgc2VsZi5DMiAvIHNlbGYuQzMgKiAxMi4wCisKKyAgICBwcmludCAnU3RhbGwgYXJtIGRpZmZlcmVuY2UgaXMnLCAxMi4wICogc2VsZi5DMiAvIHNlbGYuQzEKKyAgICBwcmludCAnU3RhbGwgYXJtIGRpZmZlcmVuY2UgZmlyc3QgcHJpbmNpcGxlcyBpcycsIHNlbGYuc3RhbGxfdG9ycXVlICogc2VsZi5HIC8gc2VsZi5zcHJpbmcKKworICAgIHByaW50ICc1IGRlZ3JlZXMgb2YgYXJtIGVycm9yIGlzJywgc2VsZi5zcHJpbmcgLyBzZWxmLnIgKiAobWF0aC5waSAqIDUuMCAvIDE4MC4wKQorCisgICAgIyBTdGFydCB3aXRoIHRoZSB1bm1vZGlmaWVkIGlucHV0CisgICAgc2VsZi5CX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMCwgMF0sCisgICAgICAgICBbc2VsZi5DMiAvIDIuMCwgc2VsZi5DMiAvIDIuMF0sCisgICAgICAgICBbMCwgMF0sCisgICAgICAgICBbc2VsZi5DMiAvIDIuMCwgLXNlbGYuQzIgLyAyLjBdXSkKKworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEsIDAsIDEsIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDAsIC0xLCAwXV0pCisgICAgc2VsZi5EID0gbnVtcHkubWF0cml4KFtbMCwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMF1dKQorCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKAorICAgICAgICBzZWxmLkFfY29udGludW91cywgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICBjb250cm9sYWJpbGl0eSA9IGNvbnRyb2xzLmN0cmIoc2VsZi5BLCBzZWxmLkIpOworICAgIHByaW50ICdSYW5rIG9mIGF1Z21lbnRlZCBjb250cm9sYWJpbGl0eSBtYXRyaXguJywgbnVtcHkubGluYWxnLm1hdHJpeF9yYW5rKAorICAgICAgICBjb250cm9sYWJpbGl0eSkKKworICAgIHFfcG9zID0gMC4wMgorICAgIHFfdmVsID0gMC4zMDAKKyAgICBxX3Bvc19kaWZmID0gMC4wMDUKKyAgICBxX3ZlbF9kaWZmID0gMC4xMworICAgIHNlbGYuUSA9IG51bXB5Lm1hdHJpeChbWygxLjAgLyAocV9wb3MgKiogMi4wKSksIDAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKDEuMCAvIChxX3ZlbCAqKiAyLjApKSwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAoMS4wIC8gKHFfcG9zX2RpZmYgKiogMi4wKSksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgKDEuMCAvIChxX3ZlbF9kaWZmICoqIDIuMCkpXV0pCisKKyAgICBzZWxmLlIgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKDEyLjAgKiogMi4wKSksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAxLjAgLyAoMTIuMCAqKiAyLjApXV0pCisgICAgc2VsZi5LID0gY29udHJvbHMuZGxxcihzZWxmLkEsIHNlbGYuQiwgc2VsZi5RLCBzZWxmLlIpCisgICAgcHJpbnQgJ0NvbnRyb2xsZXInCisgICAgcHJpbnQgc2VsZi5LCisKKyAgICBwcmludCAnQ29udHJvbGxlciBQb2xlcycKKyAgICBwcmludCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuQiAqIHNlbGYuSylbMF0KKworICAgIHNlbGYucnBsID0gMC4yMAorICAgIHNlbGYuaXBsID0gMC4wNQorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLnJwbCArIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsICsgMWogKiBzZWxmLmlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGwgLSAxaiAqIHNlbGYuaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbCAtIDFqICogc2VsZi5pcGxdKQorCisgICAgIyBUaGUgYm94IGZvcm1lZCBieSBVX21pbiBhbmQgVV9tYXggbXVzdCBlbmNvbXBhc3MgYWxsIHBvc3NpYmxlIHZhbHVlcywKKyAgICAjIG9yIGVsc2UgQXVzdGluJ3MgY29kZSBnZXRzIGFuZ3J5LgorICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXSwgWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KFtbLTEyLjBdLCBbLTEyLjBdXSkKKworICAgIHByaW50ICdPYnNlcnZlciAoQ29udmVydGVkIHRvIGEgS0YpJywgbnVtcHkubGluYWxnLmludihzZWxmLkEpICogc2VsZi5MCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKKworY2xhc3MgSW50ZWdyYWxBcm0oQXJtKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IkludGVncmFsQXJtIiwgbWFzcz1Ob25lKToKKyAgICBzdXBlcihJbnRlZ3JhbEFybSwgc2VsZikuX19pbml0X18obmFtZT1uYW1lLCBtYXNzPW1hc3MpCisKKyAgICBzZWxmLkFfY29udGludW91c191bmF1Z21lbnRlZCA9IHNlbGYuQV9jb250aW51b3VzCisgICAgc2VsZi5BX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgobnVtcHkuemVyb3MoKDUsIDUpKSkKKyAgICBzZWxmLkFfY29udGludW91c1swOjQsIDA6NF0gPSBzZWxmLkFfY29udGludW91c191bmF1Z21lbnRlZAorICAgIHNlbGYuQV9jb250aW51b3VzWzEsIDRdID0gc2VsZi5DMgorCisgICAgIyBTdGFydCB3aXRoIHRoZSB1bm1vZGlmaWVkIGlucHV0CisgICAgc2VsZi5CX2NvbnRpbnVvdXNfdW5hdWdtZW50ZWQgPSBzZWxmLkJfY29udGludW91cworICAgIHNlbGYuQl9jb250aW51b3VzID0gbnVtcHkubWF0cml4KG51bXB5Lnplcm9zKCg1LCAyKSkpCisgICAgc2VsZi5CX2NvbnRpbnVvdXNbMDo0LCAwOjJdID0gc2VsZi5CX2NvbnRpbnVvdXNfdW5hdWdtZW50ZWQKKworICAgIHNlbGYuQ191bmF1Z21lbnRlZCA9IHNlbGYuQworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChudW1weS56ZXJvcygoMiwgNSkpKQorICAgIHNlbGYuQ1swOjIsIDA6NF0gPSBzZWxmLkNfdW5hdWdtZW50ZWQKKworICAgIHNlbGYuQSwgc2VsZi5CID0gc2VsZi5Db250aW51b3VzVG9EaXNjcmV0ZSgKKyAgICAgICAgc2VsZi5BX2NvbnRpbnVvdXMsIHNlbGYuQl9jb250aW51b3VzLCBzZWxmLmR0KQorICAgIHByaW50ICdBIGNvbnQnLCBzZWxmLkFfY29udGludW91cworICAgIHByaW50ICdCIGNvbnQnLCBzZWxmLkJfY29udGludW91cworICAgIHByaW50ICdBIGRpc2NyZXRlJywgc2VsZi5BCisKKyAgICBxX3BvcyA9IDAuMDgKKyAgICBxX3ZlbCA9IDAuNDAKKworICAgIHFfcG9zX2RpZmYgPSAwLjA4CisgICAgcV92ZWxfZGlmZiA9IDAuNDAKKyAgICBxX3ZvbHRhZ2UgPSA2LjAKKyAgICBzZWxmLlEgPSBudW1weS5tYXRyaXgoW1socV9wb3MgKiogMi4wKSwgMC4wLCAwLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIChxX3ZlbCAqKiAyLjApLCAwLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgKHFfcG9zX2RpZmYgKiogMi4wKSwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAwLjAsIChxX3ZlbF9kaWZmICoqIDIuMCksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgMC4wLCAocV92b2x0YWdlICoqIDIuMCldXSkKKworICAgIHJfdm9sdHMgPSAwLjA1CisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KFtbKHJfdm9sdHMgKiogMi4wKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIChyX3ZvbHRzICoqIDIuMCldXSkKKworICAgIHNlbGYuS2FsbWFuR2Fpbiwgc2VsZi5RX3N0ZWFkeSA9IGNvbnRyb2xzLmthbG1hbigKKyAgICAgICAgQT1zZWxmLkEsIEI9c2VsZi5CLCBDPXNlbGYuQywgUT1zZWxmLlEsIFI9c2VsZi5SKQorCisgICAgc2VsZi5VX21heCA9IG51bXB5Lm1hdHJpeChbWzEyLjBdLCBbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoW1stMTIuMF0sIFstMTIuMF1dKQorCisgICAgc2VsZi5LX3VuYXVnbWVudGVkID0gc2VsZi5LCisgICAgc2VsZi5LID0gbnVtcHkubWF0cml4KG51bXB5Lnplcm9zKCgyLCA1KSkpOworICAgIHNlbGYuS1swOjIsIDA6NF0gPSBzZWxmLktfdW5hdWdtZW50ZWQKKyAgICBzZWxmLktbMCwgNF0gPSAxOworICAgIHNlbGYuS1sxLCA0XSA9IDE7CisgICAgcHJpbnQgJ0thbCcsIHNlbGYuS2FsbWFuR2FpbgorICAgIHNlbGYuTCA9IHNlbGYuQSAqIHNlbGYuS2FsbWFuR2FpbgorCisgICAgc2VsZi5Jbml0aWFsaXplU3RhdGUoKQorCisKK2RlZiBDYXBVKFUpOgorICBpZiBVWzAsIDBdIC0gVVsxLCAwXSA+IDI0OgorICAgIHJldHVybiBudW1weS5tYXRyaXgoW1sxMl0sIFstMTJdXSkKKyAgZWxpZiBVWzAsIDBdIC0gVVsxLCAwXSA8IC0yNDoKKyAgICByZXR1cm4gbnVtcHkubWF0cml4KFtbLTEyXSwgWzEyXV0pCisgIGVsc2U6CisgICAgbWF4X3UgPSBtYXgoVVswLCAwXSwgVVsxLCAwXSkKKyAgICBtaW5fdSA9IG1pbihVWzAsIDBdLCBVWzEsIDBdKQorICAgIGlmIG1heF91ID4gMTI6CisgICAgICByZXR1cm4gVSAtIChtYXhfdSAtIDEyKQorICAgIGlmIG1pbl91IDwgLTEyOgorICAgICAgcmV0dXJuIFUgLSAobWluX3UgKyAxMikKKyAgICByZXR1cm4gVQorCisKK2RlZiBydW5fdGVzdChhcm0sIGluaXRpYWxfWCwgZ29hbCwgbWF4X3NlcGFyYXRpb25fZXJyb3I9MC4wMSwKKyAgICAgICAgICAgICBzaG93X2dyYXBoPVRydWUsIGl0ZXJhdGlvbnM9MjAwLCBjb250cm9sbGVyX2FybT1Ob25lLAorICAgICAgICAgICAgIG9ic2VydmVyX2FybT1Ob25lKToKKyAgIiIiUnVucyB0aGUgYXJtIHBsYW50IHdpdGggYW4gaW5pdGlhbCBjb25kaXRpb24gYW5kIGdvYWwuCisKKyAgICBUaGUgdGVzdHMgdGhlbXNlbHZlcyBhcmUgbm90IHRlcnJpYmx5IHNvcGhpc3RpY2F0ZWQ7IEkganVzdCB0ZXN0IGZvcgorICAgIHdoZXRoZXIgdGhlIGdvYWwgaGFzIGJlZW4gcmVhY2hlZCBhbmQgd2hldGhlciB0aGUgc2VwYXJhdGlvbiBnb2VzCisgICAgb3V0c2lkZSBvZiB0aGUgaW5pdGlhbCBhbmQgZ29hbCB2YWx1ZXMgYnkgbW9yZSB0aGFuIG1heF9zZXBhcmF0aW9uX2Vycm9yLgorICAgIFByaW50cyBvdXQgc29tZXRoaW5nIGZvciBhIGZhaWx1cmUgb2YgZWl0aGVyIGNvbmRpdGlvbiBhbmQgcmV0dXJucworICAgIEZhbHNlIGlmIHRlc3RzIGZhaWwuCisgICAgQXJnczoKKyAgICAgIGFybTogYXJtIG9iamVjdCB0byB1c2UuCisgICAgICBpbml0aWFsX1g6IHN0YXJ0aW5nIHN0YXRlLgorICAgICAgZ29hbDogZ29hbCBzdGF0ZS4KKyAgICAgIHNob3dfZ3JhcGg6IFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgYSBncmFwaCBzaG93aW5nIHRoZSBjaGFuZ2luZworICAgICAgICAgICBzdGF0ZXMgYW5kIHZvbHRhZ2VzLgorICAgICAgaXRlcmF0aW9uczogTnVtYmVyIG9mIHRpbWVzdGVwcyB0byBydW4gdGhlIG1vZGVsIGZvci4KKyAgICAgIGNvbnRyb2xsZXJfYXJtOiBhcm0gb2JqZWN0IHRvIGdldCBLIGZyb20sIG9yIE5vbmUgaWYgd2Ugc2hvdWxkCisgICAgICAgICAgdXNlIGFybS4KKyAgICAgIG9ic2VydmVyX2FybTogYXJtIG9iamVjdCB0byB1c2UgZm9yIHRoZSBvYnNlcnZlciwgb3IgTm9uZSBpZiB3ZSBzaG91bGQKKyAgICAgICAgICB1c2UgdGhlIGFjdHVhbCBzdGF0ZS4KKyAgIiIiCisKKyAgYXJtLlggPSBpbml0aWFsX1gKKworICBpZiBjb250cm9sbGVyX2FybSBpcyBOb25lOgorICAgIGNvbnRyb2xsZXJfYXJtID0gYXJtCisKKyAgaWYgb2JzZXJ2ZXJfYXJtIGlzIG5vdCBOb25lOgorICAgIG9ic2VydmVyX2FybS5YX2hhdCA9IGluaXRpYWxfWCArIDAuMDEKKyAgICBvYnNlcnZlcl9hcm0uWF9oYXQgPSBpbml0aWFsX1gKKworICAjIFZhcmlvdXMgbGlzdHMgZm9yIGdyYXBoaW5nIHRoaW5ncy4KKyAgdCA9IFtdCisgIHhfYXZnID0gW10KKyAgeF9zZXAgPSBbXQorICB4X2hhdF9hdmcgPSBbXQorICB4X2hhdF9zZXAgPSBbXQorICB2X2F2ZyA9IFtdCisgIHZfc2VwID0gW10KKyAgdV9sZWZ0ID0gW10KKyAgdV9yaWdodCA9IFtdCisKKyAgc2VwX3Bsb3RfZ2FpbiA9IDEwMC4wCisKKyAgZm9yIGkgaW4geHJhbmdlKGl0ZXJhdGlvbnMpOgorICAgIFhfaGF0ID0gYXJtLlgKKyAgICBpZiBvYnNlcnZlcl9hcm0gaXMgbm90IE5vbmU6CisgICAgICBYX2hhdCA9IG9ic2VydmVyX2FybS5YX2hhdAorICAgICAgeF9oYXRfYXZnLmFwcGVuZChvYnNlcnZlcl9hcm0uWF9oYXRbMCwgMF0pCisgICAgICB4X2hhdF9zZXAuYXBwZW5kKG9ic2VydmVyX2FybS5YX2hhdFsyLCAwXSAqIHNlcF9wbG90X2dhaW4pCisgICAgVSA9IGNvbnRyb2xsZXJfYXJtLksgKiAoZ29hbCAtIFhfaGF0KQorICAgIFUgPSBDYXBVKFUpCisgICAgeF9hdmcuYXBwZW5kKGFybS5YWzAsIDBdKQorICAgIHZfYXZnLmFwcGVuZChhcm0uWFsxLCAwXSkKKyAgICB4X3NlcC5hcHBlbmQoYXJtLlhbMiwgMF0gKiBzZXBfcGxvdF9nYWluKQorICAgIHZfc2VwLmFwcGVuZChhcm0uWFszLCAwXSkKKyAgICBpZiBvYnNlcnZlcl9hcm0gaXMgbm90IE5vbmU6CisgICAgICBvYnNlcnZlcl9hcm0uUHJlZGljdE9ic2VydmVyKFUpCisgICAgYXJtLlVwZGF0ZShVKQorICAgIGlmIG9ic2VydmVyX2FybSBpcyBub3QgTm9uZToKKyAgICAgIG9ic2VydmVyX2FybS5ZID0gYXJtLlkKKyAgICAgIG9ic2VydmVyX2FybS5Db3JyZWN0T2JzZXJ2ZXIoVSkKKworICAgIHQuYXBwZW5kKGkgKiBhcm0uZHQpCisgICAgdV9sZWZ0LmFwcGVuZChVWzAsIDBdKQorICAgIHVfcmlnaHQuYXBwZW5kKFVbMSwgMF0pCisKKyAgcHJpbnQgbnVtcHkubGluYWxnLmludihhcm0uQSkKKyAgcHJpbnQgImRlbHRhIHRpbWUgaXMgIiwgYXJtLmR0CisgIHByaW50ICJWZWxvY2l0eSBhdCB0PTAgaXMgIiwgeF9hdmdbMF0sIHZfYXZnWzBdLCB4X3NlcFswXSwgdl9zZXBbMF0KKyAgcHJpbnQgIlZlbG9jaXR5IGF0IHQ9MStkdCBpcyAiLCB4X2F2Z1sxXSwgdl9hdmdbMV0sIHhfc2VwWzFdLCB2X3NlcFsxXQorCisgIGlmIHNob3dfZ3JhcGg6CisgICAgcHlsYWIuc3VicGxvdCgyLCAxLCAxKQorICAgIHB5bGFiLnBsb3QodCwgeF9hdmcsIGxhYmVsPSd4IGF2ZycpCisgICAgcHlsYWIucGxvdCh0LCB4X3NlcCwgbGFiZWw9J3ggc2VwJykKKyAgICBpZiBvYnNlcnZlcl9hcm0gaXMgbm90IE5vbmU6CisgICAgICBweWxhYi5wbG90KHQsIHhfaGF0X2F2ZywgbGFiZWw9J3hfaGF0IGF2ZycpCisgICAgICBweWxhYi5wbG90KHQsIHhfaGF0X3NlcCwgbGFiZWw9J3hfaGF0IHNlcCcpCisgICAgcHlsYWIubGVnZW5kKCkKKworICAgIHB5bGFiLnN1YnBsb3QoMiwgMSwgMikKKyAgICBweWxhYi5wbG90KHQsIHVfbGVmdCwgbGFiZWw9J3UgbGVmdCcpCisgICAgcHlsYWIucGxvdCh0LCB1X3JpZ2h0LCBsYWJlbD0ndSByaWdodCcpCisgICAgcHlsYWIubGVnZW5kKCkKKyAgICBweWxhYi5zaG93KCkKKworCitkZWYgcnVuX2ludGVncmFsX3Rlc3QoYXJtLCBpbml0aWFsX1gsIGdvYWwsIG9ic2VydmVyX2FybSwgZGlzdHVyYmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgbWF4X3NlcGFyYXRpb25fZXJyb3I9MC4wMSwgc2hvd19ncmFwaD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnM9NDAwKToKKyAgIiIiUnVucyB0aGUgaW50ZWdyYWwgY29udHJvbCBhcm0gcGxhbnQgd2l0aCBhbiBpbml0aWFsIGNvbmRpdGlvbiBhbmQgZ29hbC4KKworICAgIFRoZSB0ZXN0cyB0aGVtc2VsdmVzIGFyZSBub3QgdGVycmlibHkgc29waGlzdGljYXRlZDsgSSBqdXN0IHRlc3QgZm9yCisgICAgd2hldGhlciB0aGUgZ29hbCBoYXMgYmVlbiByZWFjaGVkIGFuZCB3aGV0aGVyIHRoZSBzZXBhcmF0aW9uIGdvZXMKKyAgICBvdXRzaWRlIG9mIHRoZSBpbml0aWFsIGFuZCBnb2FsIHZhbHVlcyBieSBtb3JlIHRoYW4gbWF4X3NlcGFyYXRpb25fZXJyb3IuCisgICAgUHJpbnRzIG91dCBzb21ldGhpbmcgZm9yIGEgZmFpbHVyZSBvZiBlaXRoZXIgY29uZGl0aW9uIGFuZCByZXR1cm5zCisgICAgRmFsc2UgaWYgdGVzdHMgZmFpbC4KKyAgICBBcmdzOgorICAgICAgYXJtOiBhcm0gb2JqZWN0IHRvIHVzZS4KKyAgICAgIGluaXRpYWxfWDogc3RhcnRpbmcgc3RhdGUuCisgICAgICBnb2FsOiBnb2FsIHN0YXRlLgorICAgICAgb2JzZXJ2ZXJfYXJtOiBhcm0gb2JqZWN0IHRvIHVzZSBmb3IgdGhlIG9ic2VydmVyLgorICAgICAgc2hvd19ncmFwaDogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSBhIGdyYXBoIHNob3dpbmcgdGhlIGNoYW5naW5nCisgICAgICAgICAgIHN0YXRlcyBhbmQgdm9sdGFnZXMuCisgICAgICBpdGVyYXRpb25zOiBOdW1iZXIgb2YgdGltZXN0ZXBzIHRvIHJ1biB0aGUgbW9kZWwgZm9yLgorICAgICAgZGlzdHVyYmFuY2U6IFZvbHRhZ2UgbWlzc21hdGNoIGJldHdlZW4gY29udHJvbGxlciBhbmQgbW9kZWwuCisgICIiIgorCisgIGFybS5YID0gaW5pdGlhbF9YCisKKyAgIyBWYXJpb3VzIGxpc3RzIGZvciBncmFwaGluZyB0aGluZ3MuCisgIHQgPSBbXQorICB4X2F2ZyA9IFtdCisgIHhfc2VwID0gW10KKyAgeF9oYXRfYXZnID0gW10KKyAgeF9oYXRfc2VwID0gW10KKyAgdl9hdmcgPSBbXQorICB2X3NlcCA9IFtdCisgIHVfbGVmdCA9IFtdCisgIHVfcmlnaHQgPSBbXQorICB1X2Vycm9yID0gW10KKworICBzZXBfcGxvdF9nYWluID0gMTAwLjAKKworICB1bmF1Z21lbnRlZF9nb2FsID0gZ29hbAorICBnb2FsID0gbnVtcHkubWF0cml4KG51bXB5Lnplcm9zKCg1LCAxKSkpCisgIGdvYWxbMDo0LCAwXSA9IHVuYXVnbWVudGVkX2dvYWwKKworICBmb3IgaSBpbiB4cmFuZ2UoaXRlcmF0aW9ucyk6CisgICAgWF9oYXQgPSBvYnNlcnZlcl9hcm0uWF9oYXRbMDo0XQorCisgICAgeF9oYXRfYXZnLmFwcGVuZChvYnNlcnZlcl9hcm0uWF9oYXRbMCwgMF0pCisgICAgeF9oYXRfc2VwLmFwcGVuZChvYnNlcnZlcl9hcm0uWF9oYXRbMiwgMF0gKiBzZXBfcGxvdF9nYWluKQorCisgICAgVSA9IG9ic2VydmVyX2FybS5LICogKGdvYWwgLSBvYnNlcnZlcl9hcm0uWF9oYXQpCisgICAgdV9lcnJvci5hcHBlbmQob2JzZXJ2ZXJfYXJtLlhfaGF0WzQsMF0pCisgICAgVSA9IENhcFUoVSkKKyAgICB4X2F2Zy5hcHBlbmQoYXJtLlhbMCwgMF0pCisgICAgdl9hdmcuYXBwZW5kKGFybS5YWzEsIDBdKQorICAgIHhfc2VwLmFwcGVuZChhcm0uWFsyLCAwXSAqIHNlcF9wbG90X2dhaW4pCisgICAgdl9zZXAuYXBwZW5kKGFybS5YWzMsIDBdKQorCisgICAgb2JzZXJ2ZXJfYXJtLlByZWRpY3RPYnNlcnZlcihVKQorCisgICAgYXJtLlVwZGF0ZShVICsgZGlzdHVyYmFuY2UpCisgICAgb2JzZXJ2ZXJfYXJtLlkgPSBhcm0uWQorICAgIG9ic2VydmVyX2FybS5Db3JyZWN0T2JzZXJ2ZXIoVSkKKworICAgIHQuYXBwZW5kKGkgKiBhcm0uZHQpCisgICAgdV9sZWZ0LmFwcGVuZChVWzAsIDBdKQorICAgIHVfcmlnaHQuYXBwZW5kKFVbMSwgMF0pCisKKyAgcHJpbnQgJ0VuZCBpcycsIG9ic2VydmVyX2FybS5YX2hhdFs0LCAwXQorCisgIGlmIHNob3dfZ3JhcGg6CisgICAgcHlsYWIuc3VicGxvdCgyLCAxLCAxKQorICAgIHB5bGFiLnBsb3QodCwgeF9hdmcsIGxhYmVsPSd4IGF2ZycpCisgICAgcHlsYWIucGxvdCh0LCB4X3NlcCwgbGFiZWw9J3ggc2VwJykKKyAgICBpZiBvYnNlcnZlcl9hcm0gaXMgbm90IE5vbmU6CisgICAgICBweWxhYi5wbG90KHQsIHhfaGF0X2F2ZywgbGFiZWw9J3hfaGF0IGF2ZycpCisgICAgICBweWxhYi5wbG90KHQsIHhfaGF0X3NlcCwgbGFiZWw9J3hfaGF0IHNlcCcpCisgICAgcHlsYWIubGVnZW5kKCkKKworICAgIHB5bGFiLnN1YnBsb3QoMiwgMSwgMikKKyAgICBweWxhYi5wbG90KHQsIHVfbGVmdCwgbGFiZWw9J3UgbGVmdCcpCisgICAgcHlsYWIucGxvdCh0LCB1X3JpZ2h0LCBsYWJlbD0ndSByaWdodCcpCisgICAgcHlsYWIucGxvdCh0LCB1X2Vycm9yLCBsYWJlbD0ndSBlcnJvcicpCisgICAgcHlsYWIubGVnZW5kKCkKKyAgICBweWxhYi5zaG93KCkKKworCitkZWYgbWFpbihhcmd2KToKKyAgbG9hZGVkX21hc3MgPSAyNQorICAjbG9hZGVkX21hc3MgPSAwCisgIGFybSA9IEFybShtYXNzPTEzICsgbG9hZGVkX21hc3MpCisgICNhcm1fY29udHJvbGxlciA9IEFybShtYXNzPTEzICsgMTUpCisgICNvYnNlcnZlcl9hcm0gPSBBcm0obWFzcz0xMyArIDE1KQorICAjb2JzZXJ2ZXJfYXJtID0gTm9uZQorCisgIGludGVncmFsX2FybSA9IEludGVncmFsQXJtKG1hc3M9MTMgKyBsb2FkZWRfbWFzcykKKyAgaW50ZWdyYWxfYXJtLlhfaGF0WzAsIDBdICs9IDAuMDIKKyAgaW50ZWdyYWxfYXJtLlhfaGF0WzIsIDBdICs9IDAuMDIKKyAgaW50ZWdyYWxfYXJtLlhfaGF0WzRdID0gMAorCisgICMgVGVzdCBtb3ZpbmcgdGhlIGFybSB3aXRoIGNvbnN0YW50IHNlcGFyYXRpb24uCisgIGluaXRpYWxfWCA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdLCBbMC4wXSwgWzAuMF1dKQorICBSID0gbnVtcHkubWF0cml4KFtbMC4wXSwgWzAuMF0sIFswLjBdLCBbMC4wXV0pCisgIHJ1bl9pbnRlZ3JhbF90ZXN0KGFybSwgaW5pdGlhbF9YLCBSLCBpbnRlZ3JhbF9hcm0sIGRpc3R1cmJhbmNlPTIpCisKKyAgIyBXcml0ZSB0aGUgZ2VuZXJhdGVkIGNvbnN0YW50cyBvdXQgdG8gYSBmaWxlLgorICBpZiBsZW4oYXJndikgIT0gNToKKyAgICBwcmludCAiRXhwZWN0ZWQgLmggZmlsZSBuYW1lIGFuZCAuY2MgZmlsZSBuYW1lIGZvciB0aGUgYXJtIGFuZCBhdWdtZW50ZWQgYXJtLiIKKyAgZWxzZToKKyAgICBhcm0gPSBBcm0oIkFybSIsIG1hc3M9MTMpCisgICAgbG9vcF93cml0ZXIgPSBjb250cm9sX2xvb3AuQ29udHJvbExvb3BXcml0ZXIoIkFybSIsIFthcm1dKQorICAgIGlmIGFyZ3ZbMV1bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMl0sIGFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMV0sIGFyZ3ZbMl0pCisKKyAgICBpbnRlZ3JhbF9hcm0gPSBJbnRlZ3JhbEFybSgiSW50ZWdyYWxBcm0iLCBtYXNzPTEzKQorICAgIGxvb3Bfd3JpdGVyID0gY29udHJvbF9sb29wLkNvbnRyb2xMb29wV3JpdGVyKCJJbnRlZ3JhbEFybSIsIFtpbnRlZ3JhbF9hcm1dKQorICAgIGlmIGFyZ3ZbM11bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbNF0sIGFyZ3ZbM10pCisgICAgZWxzZToKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbM10sIGFyZ3ZbNF0pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vY2xhdy5weSBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2NsYXcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGNhNTBlOQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2NsYXcucHkKQEAgLTAsMCArMSwyMTEgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKK2ltcG9ydCBjb250cm9sX2xvb3AKK2ltcG9ydCBjb250cm9scworaW1wb3J0IHBvbHl0b3BlCitpbXBvcnQgcG9seWRyaXZldHJhaW4KK2ltcG9ydCBudW1weQoraW1wb3J0IHN5cworaW1wb3J0IG1hdHBsb3RsaWIKK2Zyb20gbWF0cGxvdGxpYiBpbXBvcnQgcHlsYWIKKworY2xhc3MgQ2xhdyhjb250cm9sX2xvb3AuQ29udHJvbExvb3ApOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iQ2xhdyIsIG1hc3M9Tm9uZSk6CisgICAgc3VwZXIoQ2xhdywgc2VsZikuX19pbml0X18obmFtZSkKKyAgICAjIFN0YWxsIFRvcnF1ZSBpbiBOIG0KKyAgICBzZWxmLnN0YWxsX3RvcnF1ZSA9IDAuNDc2CisgICAgIyBTdGFsbCBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLnN0YWxsX2N1cnJlbnQgPSA4MC43MzAKKyAgICAjIEZyZWUgU3BlZWQgaW4gUlBNCisgICAgc2VsZi5mcmVlX3NwZWVkID0gMTM5MDYuMAorICAgICMgRnJlZSBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLmZyZWVfY3VycmVudCA9IDUuODIwCisgICAgIyBNYXNzIG9mIHRoZSBjbGF3CisgICAgaWYgbWFzcyBpcyBOb25lOgorICAgICAgc2VsZi5tYXNzID0gNS4wCisgICAgZWxzZToKKyAgICAgIHNlbGYubWFzcyA9IG1hc3MKKworICAgICMgUmVzaXN0YW5jZSBvZiB0aGUgbW90b3IKKyAgICBzZWxmLlIgPSAxMi4wIC8gc2VsZi5zdGFsbF9jdXJyZW50CisgICAgIyBNb3RvciB2ZWxvY2l0eSBjb25zdGFudAorICAgIHNlbGYuS3YgPSAoKHNlbGYuZnJlZV9zcGVlZCAvIDYwLjAgKiAyLjAgKiBudW1weS5waSkgLworICAgICAgICAgICAgICAgKDEyLjAgLSBzZWxmLlIgKiBzZWxmLmZyZWVfY3VycmVudCkpCisgICAgIyBUb3JxdWUgY29uc3RhbnQKKyAgICBzZWxmLkt0ID0gc2VsZi5zdGFsbF90b3JxdWUgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIEdlYXIgcmF0aW8KKyAgICBzZWxmLkcgPSAoNTYuMCAvIDEyLjApICogKDU0LjAgLyAxNC4wKSAqICg2NC4wIC8gMTQuMCkgKiAoNzIuMCAvIDE4LjApCisgICAgIyBDbGF3IGxlbmd0aAorICAgIHNlbGYuciA9IDE4ICogMC4wMjU0CisKKyAgICBzZWxmLkogPSBzZWxmLnIgKiBzZWxmLm1hc3MKKworICAgICMgQ29udHJvbCBsb29wIHRpbWUgc3RlcAorICAgIHNlbGYuZHQgPSAwLjAwNQorCisgICAgIyBTdGF0ZSBpcyBbcG9zaXRpb24sIHZlbG9jaXR5XQorICAgICMgSW5wdXQgaXMgW1ZvbHRhZ2VdCisKKyAgICBDMSA9IHNlbGYuRyAqIHNlbGYuRyAqIHNlbGYuS3QgLyAoc2VsZi5SICAqIHNlbGYuSiAqIHNlbGYuS3YpCisgICAgQzIgPSBzZWxmLkt0ICogc2VsZi5HIC8gKHNlbGYuSiAqIHNlbGYuUikKKworICAgIHNlbGYuQV9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDFdLAorICAgICAgICAgWzAsIC1DMV1dKQorCisgICAgIyBTdGFydCB3aXRoIHRoZSB1bm1vZGlmaWVkIGlucHV0CisgICAgc2VsZi5CX2NvbnRpbnVvdXMgPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMF0sCisgICAgICAgICBbQzJdXSkKKworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEsIDBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swXV0pCisKKyAgICBzZWxmLkEsIHNlbGYuQiA9IHNlbGYuQ29udGludW91c1RvRGlzY3JldGUoCisgICAgICAgIHNlbGYuQV9jb250aW51b3VzLCBzZWxmLkJfY29udGludW91cywgc2VsZi5kdCkKKworICAgIGNvbnRyb2xhYmlsaXR5ID0gY29udHJvbHMuY3RyYihzZWxmLkEsIHNlbGYuQik7CisKKyAgICBwcmludCAiRnJlZSBzcGVlZCBpcyIsIHNlbGYuZnJlZV9zcGVlZCAqIG51bXB5LnBpICogMi4wIC8gNjAuMCAvIHNlbGYuRworCisgICAgcV9wb3MgPSAwLjE1CisgICAgcV92ZWwgPSAyLjUKKyAgICBzZWxmLlEgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKHFfcG9zICoqIDIuMCkpLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKDEuMCAvIChxX3ZlbCAqKiAyLjApKV1dKQorCisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KFtbKDEuMCAvICgxMi4wICoqIDIuMCkpXV0pCisgICAgc2VsZi5LID0gY29udHJvbHMuZGxxcihzZWxmLkEsIHNlbGYuQiwgc2VsZi5RLCBzZWxmLlIpCisKKyAgICBwcmludCAnSycsIHNlbGYuSworICAgIHByaW50ICdQb2xlcyBhcmUnLCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuQiAqIHNlbGYuSylbMF0KKworICAgIHNlbGYucnBsID0gMC4zMAorICAgIHNlbGYuaXBsID0gMC4xMAorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLnJwbCArIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsIC0gMWogKiBzZWxmLmlwbF0pCisKKyAgICBwcmludCAnTCBpcycsIHNlbGYuTAorCisgICAgcV9wb3MgPSAwLjA1CisgICAgcV92ZWwgPSAyLjY1CisgICAgc2VsZi5RID0gbnVtcHkubWF0cml4KFtbKHFfcG9zICoqIDIuMCksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAocV92ZWwgKiogMi4wKV1dKQorCisgICAgcl92b2x0cyA9IDAuMDI1CisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KFtbKHJfdm9sdHMgKiogMi4wKV1dKQorCisgICAgc2VsZi5LYWxtYW5HYWluLCBzZWxmLlFfc3RlYWR5ID0gY29udHJvbHMua2FsbWFuKAorICAgICAgICBBPXNlbGYuQSwgQj1zZWxmLkIsIEM9c2VsZi5DLCBRPXNlbGYuUSwgUj1zZWxmLlIpCisKKyAgICBwcmludCAnS2FsJywgc2VsZi5LYWxtYW5HYWluCisgICAgc2VsZi5MID0gc2VsZi5BICogc2VsZi5LYWxtYW5HYWluCisgICAgcHJpbnQgJ0thbEwgaXMnLCBzZWxmLkwKKworICAgICMgVGhlIGJveCBmb3JtZWQgYnkgVV9taW4gYW5kIFVfbWF4IG11c3QgZW5jb21wYXNzIGFsbCBwb3NzaWJsZSB2YWx1ZXMsCisgICAgIyBvciBlbHNlIEF1c3RpbidzIGNvZGUgZ2V0cyBhbmdyeS4KKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KFtbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoW1stMTIuMF1dKQorCisgICAgc2VsZi5Jbml0aWFsaXplU3RhdGUoKQorCisKK2RlZiBydW5fdGVzdChjbGF3LCBpbml0aWFsX1gsIGdvYWwsIG1heF9zZXBhcmF0aW9uX2Vycm9yPTAuMDEsCisgICAgICAgICAgICAgc2hvd19ncmFwaD1UcnVlLCBpdGVyYXRpb25zPTIwMCwgY29udHJvbGxlcl9jbGF3PU5vbmUsCisgICAgICAgICAgICAgb2JzZXJ2ZXJfY2xhdz1Ob25lKToKKyAgIiIiUnVucyB0aGUgY2xhdyBwbGFudCB3aXRoIGFuIGluaXRpYWwgY29uZGl0aW9uIGFuZCBnb2FsLgorCisgICAgVGhlIHRlc3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCB0ZXJyaWJseSBzb3BoaXN0aWNhdGVkOyBJIGp1c3QgdGVzdCBmb3IKKyAgICB3aGV0aGVyIHRoZSBnb2FsIGhhcyBiZWVuIHJlYWNoZWQgYW5kIHdoZXRoZXIgdGhlIHNlcGFyYXRpb24gZ29lcworICAgIG91dHNpZGUgb2YgdGhlIGluaXRpYWwgYW5kIGdvYWwgdmFsdWVzIGJ5IG1vcmUgdGhhbiBtYXhfc2VwYXJhdGlvbl9lcnJvci4KKyAgICBQcmludHMgb3V0IHNvbWV0aGluZyBmb3IgYSBmYWlsdXJlIG9mIGVpdGhlciBjb25kaXRpb24gYW5kIHJldHVybnMKKyAgICBGYWxzZSBpZiB0ZXN0cyBmYWlsLgorICAgIEFyZ3M6CisgICAgICBjbGF3OiBjbGF3IG9iamVjdCB0byB1c2UuCisgICAgICBpbml0aWFsX1g6IHN0YXJ0aW5nIHN0YXRlLgorICAgICAgZ29hbDogZ29hbCBzdGF0ZS4KKyAgICAgIHNob3dfZ3JhcGg6IFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgYSBncmFwaCBzaG93aW5nIHRoZSBjaGFuZ2luZworICAgICAgICAgICBzdGF0ZXMgYW5kIHZvbHRhZ2VzLgorICAgICAgaXRlcmF0aW9uczogTnVtYmVyIG9mIHRpbWVzdGVwcyB0byBydW4gdGhlIG1vZGVsIGZvci4KKyAgICAgIGNvbnRyb2xsZXJfY2xhdzogY2xhdyBvYmplY3QgdG8gZ2V0IEsgZnJvbSwgb3IgTm9uZSBpZiB3ZSBzaG91bGQKKyAgICAgICAgICB1c2UgY2xhdy4KKyAgICAgIG9ic2VydmVyX2NsYXc6IGNsYXcgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIG9ic2VydmVyLCBvciBOb25lIGlmIHdlIHNob3VsZAorICAgICAgICAgIHVzZSB0aGUgYWN0dWFsIHN0YXRlLgorICAiIiIKKworICBjbGF3LlggPSBpbml0aWFsX1gKKworICBpZiBjb250cm9sbGVyX2NsYXcgaXMgTm9uZToKKyAgICBjb250cm9sbGVyX2NsYXcgPSBjbGF3CisKKyAgaWYgb2JzZXJ2ZXJfY2xhdyBpcyBub3QgTm9uZToKKyAgICBvYnNlcnZlcl9jbGF3LlhfaGF0ID0gaW5pdGlhbF9YICsgMC4wMQorICAgIG9ic2VydmVyX2NsYXcuWF9oYXQgPSBpbml0aWFsX1gKKworICAjIFZhcmlvdXMgbGlzdHMgZm9yIGdyYXBoaW5nIHRoaW5ncy4KKyAgdCA9IFtdCisgIHggPSBbXQorICB2ID0gW10KKyAgeF9oYXQgPSBbXQorICB1ID0gW10KKworICBzZXBfcGxvdF9nYWluID0gMTAwLjAKKworICBmb3IgaSBpbiB4cmFuZ2UoaXRlcmF0aW9ucyk6CisgICAgWF9oYXQgPSBjbGF3LlgKKyAgICBpZiBvYnNlcnZlcl9jbGF3IGlzIG5vdCBOb25lOgorICAgICAgWF9oYXQgPSBvYnNlcnZlcl9jbGF3LlhfaGF0CisgICAgICB4X2hhdC5hcHBlbmQob2JzZXJ2ZXJfY2xhdy5YX2hhdFswLCAwXSkKKyAgICBVID0gY29udHJvbGxlcl9jbGF3LksgKiAoZ29hbCAtIFhfaGF0KQorICAgIFVbMCwgMF0gPSBudW1weS5jbGlwKFVbMCwgMF0sIC0xMiwgMTIpCisgICAgeC5hcHBlbmQoY2xhdy5YWzAsIDBdKQorICAgIHYuYXBwZW5kKGNsYXcuWFsxLCAwXSkKKyAgICBpZiBvYnNlcnZlcl9jbGF3IGlzIG5vdCBOb25lOgorICAgICAgb2JzZXJ2ZXJfY2xhdy5QcmVkaWN0T2JzZXJ2ZXIoVSkKKyAgICBjbGF3LlVwZGF0ZShVKQorICAgIGlmIG9ic2VydmVyX2NsYXcgaXMgbm90IE5vbmU6CisgICAgICBvYnNlcnZlcl9jbGF3LlkgPSBjbGF3LlkKKyAgICAgIG9ic2VydmVyX2NsYXcuQ29ycmVjdE9ic2VydmVyKFUpCisKKyAgICB0LmFwcGVuZChpICogY2xhdy5kdCkKKyAgICB1LmFwcGVuZChVWzAsIDBdKQorCisgIGlmIHNob3dfZ3JhcGg6CisgICAgcHlsYWIuc3VicGxvdCgyLCAxLCAxKQorICAgIHB5bGFiLnBsb3QodCwgeCwgbGFiZWw9J3gnKQorICAgIGlmIG9ic2VydmVyX2NsYXcgaXMgbm90IE5vbmU6CisgICAgICBweWxhYi5wbG90KHQsIHhfaGF0LCBsYWJlbD0neF9oYXQnKQorICAgIHB5bGFiLmxlZ2VuZCgpCisKKyAgICBweWxhYi5zdWJwbG90KDIsIDEsIDIpCisgICAgcHlsYWIucGxvdCh0LCB1LCBsYWJlbD0ndScpCisgICAgcHlsYWIubGVnZW5kKCkKKyAgICBweWxhYi5zaG93KCkKKworCitkZWYgbWFpbihhcmd2KToKKyAgbG9hZGVkX21hc3MgPSAwCisgICNsb2FkZWRfbWFzcyA9IDAKKyAgY2xhdyA9IENsYXcobWFzcz00ICsgbG9hZGVkX21hc3MpCisgIGNsYXdfY29udHJvbGxlciA9IENsYXcobWFzcz01ICsgMCkKKyAgb2JzZXJ2ZXJfY2xhdyA9IENsYXcobWFzcz01ICsgMCkKKyAgI29ic2VydmVyX2NsYXcgPSBOb25lCisKKyAgIyBUZXN0IG1vdmluZyB0aGUgY2xhdyB3aXRoIGNvbnN0YW50IHNlcGFyYXRpb24uCisgIGluaXRpYWxfWCA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdXSkKKyAgUiA9IG51bXB5Lm1hdHJpeChbWzEuMF0sIFswLjBdXSkKKyAgcnVuX3Rlc3QoY2xhdywgaW5pdGlhbF9YLCBSLCBjb250cm9sbGVyX2NsYXc9Y2xhd19jb250cm9sbGVyLAorICAgICAgICAgICBvYnNlcnZlcl9jbGF3PW9ic2VydmVyX2NsYXcpCisKKyAgIyBXcml0ZSB0aGUgZ2VuZXJhdGVkIGNvbnN0YW50cyBvdXQgdG8gYSBmaWxlLgorICBpZiBsZW4oYXJndikgIT0gMzoKKyAgICBwcmludCAiRXhwZWN0ZWQgLmggZmlsZSBuYW1lIGFuZCAuY2MgZmlsZSBuYW1lIGZvciB0aGUgY2xhdy4iCisgIGVsc2U6CisgICAgY2xhdyA9IENsYXcoIkNsYXciKQorICAgIGxvb3Bfd3JpdGVyID0gY29udHJvbF9sb29wLkNvbnRyb2xMb29wV3JpdGVyKCJDbGF3IiwgW2NsYXddKQorICAgIGlmIGFyZ3ZbMV1bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMl0sIGFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMV0sIGFyZ3ZbMl0pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vZHJpdmV0cmFpbi5weSBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2RyaXZldHJhaW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGVkNjJkNgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2RyaXZldHJhaW4ucHkKQEAgLTAsMCArMSwyNDIgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKK2ltcG9ydCBjb250cm9sX2xvb3AKK2ltcG9ydCBjb250cm9scworaW1wb3J0IG51bXB5CitpbXBvcnQgc3lzCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCisKKworY2xhc3MgQ0lNKGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcCk6CisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzdXBlcihDSU0sIHNlbGYpLl9faW5pdF9fKCJDSU0iKQorICAgICMgU3RhbGwgVG9ycXVlIGluIE4gbQorICAgIHNlbGYuc3RhbGxfdG9ycXVlID0gMi40MgorICAgICMgU3RhbGwgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5zdGFsbF9jdXJyZW50ID0gMTMzCisgICAgIyBGcmVlIFNwZWVkIGluIFJQTQorICAgIHNlbGYuZnJlZV9zcGVlZCA9IDQ2NTAuMAorICAgICMgRnJlZSBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLmZyZWVfY3VycmVudCA9IDIuNworICAgICMgTW9tZW50IG9mIGluZXJ0aWEgb2YgdGhlIENJTSBpbiBrZyBtXjIKKyAgICBzZWxmLkogPSAwLjAwMDEKKyAgICAjIFJlc2lzdGFuY2Ugb2YgdGhlIG1vdG9yLCBkaXZpZGVkIGJ5IDIgdG8gYWNjb3VudCBmb3IgdGhlIDIgbW90b3JzCisgICAgc2VsZi5SID0gMTIuMCAvIHNlbGYuc3RhbGxfY3VycmVudAorICAgICMgTW90b3IgdmVsb2NpdHkgY29uc3RhbnQKKyAgICBzZWxmLkt2ID0gKChzZWxmLmZyZWVfc3BlZWQgLyA2MC4wICogMi4wICogbnVtcHkucGkpIC8KKyAgICAgICAgICAgICAgKDEyLjAgLSBzZWxmLlIgKiBzZWxmLmZyZWVfY3VycmVudCkpCisgICAgIyBUb3JxdWUgY29uc3RhbnQKKyAgICBzZWxmLkt0ID0gc2VsZi5zdGFsbF90b3JxdWUgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIENvbnRyb2wgbG9vcCB0aW1lIHN0ZXAKKyAgICBzZWxmLmR0ID0gMC4wMDUKKworICAgICMgU3RhdGUgZmVlZGJhY2sgbWF0cmljZXMKKyAgICBzZWxmLkFfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1stc2VsZi5LdCAvIHNlbGYuS3YgLyAoc2VsZi5KICogc2VsZi5SKV1dKQorICAgIHNlbGYuQl9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbW3NlbGYuS3QgLyAoc2VsZi5KICogc2VsZi5SKV1dKQorICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzFdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swXV0pCisKKyAgICBzZWxmLkEsIHNlbGYuQiA9IHNlbGYuQ29udGludW91c1RvRGlzY3JldGUoc2VsZi5BX2NvbnRpbnVvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQl9jb250aW51b3VzLCBzZWxmLmR0KQorCisgICAgc2VsZi5QbGFjZUNvbnRyb2xsZXJQb2xlcyhbMC4wMV0pCisgICAgc2VsZi5QbGFjZU9ic2VydmVyUG9sZXMoWzAuMDFdKQorCisgICAgc2VsZi5VX21heCA9IG51bXB5Lm1hdHJpeChbWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KFtbLTEyLjBdXSkKKworICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworCitjbGFzcyBEcml2ZXRyYWluKGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSJEcml2ZXRyYWluIiwgbGVmdF9sb3c9VHJ1ZSwgcmlnaHRfbG93PVRydWUpOgorICAgIHN1cGVyKERyaXZldHJhaW4sIHNlbGYpLl9faW5pdF9fKG5hbWUpCisgICAgIyBTdGFsbCBUb3JxdWUgaW4gTiBtCisgICAgc2VsZi5zdGFsbF90b3JxdWUgPSAyLjQyCisgICAgIyBTdGFsbCBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLnN0YWxsX2N1cnJlbnQgPSAxMzMuMAorICAgICMgRnJlZSBTcGVlZCBpbiBSUE0uIFVzZWQgbnVtYmVyIGZyb20gbGFzdCB5ZWFyLgorICAgIHNlbGYuZnJlZV9zcGVlZCA9IDQ2NTAuMAorICAgICMgRnJlZSBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLmZyZWVfY3VycmVudCA9IDIuNworICAgICMgTW9tZW50IG9mIGluZXJ0aWEgb2YgdGhlIGRyaXZldHJhaW4gaW4ga2cgbV4yCisgICAgIyBKdXN0IGJvcnJvd2VkIGZyb20gbGFzdCB5ZWFyLgorICAgIHNlbGYuSiA9IDEwCisgICAgIyBNYXNzIG9mIHRoZSByb2JvdCwgaW4ga2cuCisgICAgc2VsZi5tID0gNjgKKyAgICAjIFJhZGl1cyBvZiB0aGUgcm9ib3QsIGluIG1ldGVycyAoZnJvbSBsYXN0IHllYXIpLgorICAgIHNlbGYucmIgPSAwLjk2MDMgLyAyLjAKKyAgICAjIFJhZGl1cyBvZiB0aGUgd2hlZWxzLCBpbiBtZXRlcnMuCisgICAgc2VsZi5yID0gLjA1MTU5MzgKKyAgICAjIFJlc2lzdGFuY2Ugb2YgdGhlIG1vdG9yLCBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgbW90b3JzLgorICAgIHNlbGYuUiA9IDEyLjAgLyBzZWxmLnN0YWxsX2N1cnJlbnQgLyAyCisgICAgIyBNb3RvciB2ZWxvY2l0eSBjb25zdGFudAorICAgIHNlbGYuS3YgPSAoKHNlbGYuZnJlZV9zcGVlZCAvIDYwLjAgKiAyLjAgKiBudW1weS5waSkgLworICAgICAgICAgICAgICAgKDEyLjAgLSBzZWxmLlIgKiBzZWxmLmZyZWVfY3VycmVudCkpCisgICAgIyBUb3JxdWUgY29uc3RhbnQKKyAgICBzZWxmLkt0ID0gc2VsZi5zdGFsbF90b3JxdWUgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIEdlYXIgcmF0aW9zCisgICAgc2VsZi5HX2NvbnN0ID0gMjguMCAvIDUwLjAgKiAyMC4wIC8gNjQuMAorCisgICAgc2VsZi5HX2xvdyA9IHNlbGYuR19jb25zdAorICAgIHNlbGYuR19oaWdoID0gc2VsZi5HX2NvbnN0CisKKyAgICBpZiBsZWZ0X2xvdzoKKyAgICAgIHNlbGYuR2wgPSBzZWxmLkdfbG93CisgICAgZWxzZToKKyAgICAgIHNlbGYuR2wgPSBzZWxmLkdfaGlnaAorICAgIGlmIHJpZ2h0X2xvdzoKKyAgICAgIHNlbGYuR3IgPSBzZWxmLkdfbG93CisgICAgZWxzZToKKyAgICAgIHNlbGYuR3IgPSBzZWxmLkdfaGlnaAorCisgICAgIyBDb250cm9sIGxvb3AgdGltZSBzdGVwCisgICAgc2VsZi5kdCA9IDAuMDA1CisKKyAgICAjIFRoZXNlIGRlc2NyaWJlIHRoZSB3YXkgdGhhdCBhIGdpdmVuIHNpZGUgb2YgYSByb2JvdCB3aWxsIGJlIGluZmx1ZW5jZWQKKyAgICAjIGJ5IHRoZSBvdGhlciBzaWRlLiBVbml0cyBvZiAxIC8ga2cuCisgICAgc2VsZi5tc3AgPSAxLjAgLyBzZWxmLm0gKyBzZWxmLnJiICogc2VsZi5yYiAvIHNlbGYuSgorICAgIHNlbGYubXNuID0gMS4wIC8gc2VsZi5tIC0gc2VsZi5yYiAqIHNlbGYucmIgLyBzZWxmLkoKKyAgICAjIFRoZSBjYWxjdWxhdGlvbnMgd2hpY2ggd2Ugd2lsbCBuZWVkIGZvciBBIGFuZCBCLgorICAgIHNlbGYudGNsID0gLXNlbGYuS3QgLyBzZWxmLkt2IC8gKHNlbGYuR2wgKiBzZWxmLkdsICogc2VsZi5SICogc2VsZi5yICogc2VsZi5yKQorICAgIHNlbGYudGNyID0gLXNlbGYuS3QgLyBzZWxmLkt2IC8gKHNlbGYuR3IgKiBzZWxmLkdyICogc2VsZi5SICogc2VsZi5yICogc2VsZi5yKQorICAgIHNlbGYubXBsID0gc2VsZi5LdCAvIChzZWxmLkdsICogc2VsZi5SICogc2VsZi5yKQorICAgIHNlbGYubXByID0gc2VsZi5LdCAvIChzZWxmLkdyICogc2VsZi5SICogc2VsZi5yKQorCisgICAgIyBTdGF0ZSBmZWVkYmFjayBtYXRyaWNlcworICAgICMgWCB3aWxsIGJlIG9mIHRoZSBmb3JtYXQKKyAgICAjIFtbcG9zaXRpb25sXSwgW3ZlbG9jaXR5bF0sIFtwb3NpdGlvbnJdLCB2ZWxvY2l0eXJdXQorICAgIHNlbGYuQV9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDEsIDAsIDBdLAorICAgICAgICAgWzAsIHNlbGYubXNwICogc2VsZi50Y2wsIDAsIHNlbGYubXNuICogc2VsZi50Y3JdLAorICAgICAgICAgWzAsIDAsIDAsIDFdLAorICAgICAgICAgWzAsIHNlbGYubXNuICogc2VsZi50Y2wsIDAsIHNlbGYubXNwICogc2VsZi50Y3JdXSkKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLCAwXSwKKyAgICAgICAgIFtzZWxmLm1zcCAqIHNlbGYubXBsLCBzZWxmLm1zbiAqIHNlbGYubXByXSwKKyAgICAgICAgIFswLCAwXSwKKyAgICAgICAgIFtzZWxmLm1zbiAqIHNlbGYubXBsLCBzZWxmLm1zcCAqIHNlbGYubXByXV0pCisgICAgc2VsZi5DID0gbnVtcHkubWF0cml4KFtbMSwgMCwgMCwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMCwgMSwgMF1dKQorICAgIHNlbGYuRCA9IG51bXB5Lm1hdHJpeChbWzAsIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDBdXSkKKworICAgICNwcmludCAiVEhFIE5VTUJFUiBJIFdBTlQiICsgc3RyKG51bXB5LmxpbmFsZy5pbnYoc2VsZi5BX2NvbnRpbnVvdXMpICogLXNlbGYuQl9jb250aW51b3VzICogbnVtcHkubWF0cml4KFtbMTIuMF0sIFsxMi4wXV0pKQorICAgIHNlbGYuQSwgc2VsZi5CID0gc2VsZi5Db250aW51b3VzVG9EaXNjcmV0ZSgKKyAgICAgICAgc2VsZi5BX2NvbnRpbnVvdXMsIHNlbGYuQl9jb250aW51b3VzLCBzZWxmLmR0KQorCisgICAgIyBQb2xlcyBmcm9tIGxhc3QgeWVhci4KKyAgICBzZWxmLmhwID0gMC42NQorICAgIHNlbGYubHAgPSAwLjgzCisgICAgc2VsZi5QbGFjZUNvbnRyb2xsZXJQb2xlcyhbc2VsZi5ocCwgc2VsZi5scCwgc2VsZi5ocCwgc2VsZi5scF0pCisgICAgcHJpbnQgc2VsZi5LCisgICAgcV9wb3MgPSAwLjA3CisgICAgcV92ZWwgPSAxLjAKKyAgICBzZWxmLlEgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKHFfcG9zICoqIDIuMCkpLCAwLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsICgxLjAgLyAocV92ZWwgKiogMi4wKSksIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgKDEuMCAvIChxX3BvcyAqKiAyLjApKSwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMC4wLCAoMS4wIC8gKHFfdmVsICoqIDIuMCkpXV0pCisKKyAgICBzZWxmLlIgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKDEyLjAgKiogMi4wKSksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAoMS4wIC8gKDEyLjAgKiogMi4wKSldXSkKKyAgICBzZWxmLksgPSBjb250cm9scy5kbHFyKHNlbGYuQSwgc2VsZi5CLCBzZWxmLlEsIHNlbGYuUikKKyAgICBwcmludCBzZWxmLkEKKyAgICBwcmludCBzZWxmLkIKKyAgICBwcmludCBzZWxmLksKKyAgICBwcmludCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuQiAqIHNlbGYuSylbMF0KKworICAgIHNlbGYuaGxwID0gMC4zCisgICAgc2VsZi5sbHAgPSAwLjQKKyAgICBzZWxmLlBsYWNlT2JzZXJ2ZXJQb2xlcyhbc2VsZi5obHAsIHNlbGYuaGxwLCBzZWxmLmxscCwgc2VsZi5sbHBdKQorCisgICAgc2VsZi5VX21heCA9IG51bXB5Lm1hdHJpeChbWzEyLjBdLCBbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoW1stMTIuMF0sIFstMTIuMF1dKQorICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworZGVmIG1haW4oYXJndik6CisgICMgU2ltdWxhdGUgdGhlIHJlc3BvbnNlIG9mIHRoZSBzeXN0ZW0gdG8gYSBzdGVwIGlucHV0LgorICBkcml2ZXRyYWluID0gRHJpdmV0cmFpbigpCisgIHNpbXVsYXRlZF9sZWZ0ID0gW10KKyAgc2ltdWxhdGVkX3JpZ2h0ID0gW10KKyAgZm9yIF8gaW4geHJhbmdlKDEwMCk6CisgICAgZHJpdmV0cmFpbi5VcGRhdGUobnVtcHkubWF0cml4KFtbMTIuMF0sIFsxMi4wXV0pKQorICAgIHNpbXVsYXRlZF9sZWZ0LmFwcGVuZChkcml2ZXRyYWluLlhbMCwgMF0pCisgICAgc2ltdWxhdGVkX3JpZ2h0LmFwcGVuZChkcml2ZXRyYWluLlhbMiwgMF0pCisKKyAgI3B5bGFiLnBsb3QocmFuZ2UoMTAwKSwgc2ltdWxhdGVkX2xlZnQpCisgICNweWxhYi5wbG90KHJhbmdlKDEwMCksIHNpbXVsYXRlZF9yaWdodCkKKyAgI3B5bGFiLnNob3coKQorCisgICMgU2ltdWxhdGUgZm9yd2FyZHMgbW90aW9uLgorICBkcml2ZXRyYWluID0gRHJpdmV0cmFpbigpCisgIGNsb3NlX2xvb3BfbGVmdCA9IFtdCisgIGNsb3NlX2xvb3BfcmlnaHQgPSBbXQorICBSID0gbnVtcHkubWF0cml4KFtbMS4wXSwgWzAuMF0sIFsxLjBdLCBbMC4wXV0pCisgIGZvciBfIGluIHhyYW5nZSgxMDApOgorICAgIFUgPSBudW1weS5jbGlwKGRyaXZldHJhaW4uSyAqIChSIC0gZHJpdmV0cmFpbi5YX2hhdCksCisgICAgICAgICAgICAgICAgICAgZHJpdmV0cmFpbi5VX21pbiwgZHJpdmV0cmFpbi5VX21heCkKKyAgICBkcml2ZXRyYWluLlVwZGF0ZU9ic2VydmVyKFUpCisgICAgZHJpdmV0cmFpbi5VcGRhdGUoVSkKKyAgICBjbG9zZV9sb29wX2xlZnQuYXBwZW5kKGRyaXZldHJhaW4uWFswLCAwXSkKKyAgICBjbG9zZV9sb29wX3JpZ2h0LmFwcGVuZChkcml2ZXRyYWluLlhbMiwgMF0pCisKKyAgI3B5bGFiLnBsb3QocmFuZ2UoMTAwKSwgY2xvc2VfbG9vcF9sZWZ0KQorICAjcHlsYWIucGxvdChyYW5nZSgxMDApLCBjbG9zZV9sb29wX3JpZ2h0KQorICAjcHlsYWIuc2hvdygpCisKKyAgIyBUcnkgdHVybmluZyBpbiBwbGFjZQorICBkcml2ZXRyYWluID0gRHJpdmV0cmFpbigpCisgIGNsb3NlX2xvb3BfbGVmdCA9IFtdCisgIGNsb3NlX2xvb3BfcmlnaHQgPSBbXQorICBSID0gbnVtcHkubWF0cml4KFtbLTEuMF0sIFswLjBdLCBbMS4wXSwgWzAuMF1dKQorICBmb3IgXyBpbiB4cmFuZ2UoMTAwKToKKyAgICBVID0gbnVtcHkuY2xpcChkcml2ZXRyYWluLksgKiAoUiAtIGRyaXZldHJhaW4uWF9oYXQpLAorICAgICAgICAgICAgICAgICAgIGRyaXZldHJhaW4uVV9taW4sIGRyaXZldHJhaW4uVV9tYXgpCisgICAgZHJpdmV0cmFpbi5VcGRhdGVPYnNlcnZlcihVKQorICAgIGRyaXZldHJhaW4uVXBkYXRlKFUpCisgICAgY2xvc2VfbG9vcF9sZWZ0LmFwcGVuZChkcml2ZXRyYWluLlhbMCwgMF0pCisgICAgY2xvc2VfbG9vcF9yaWdodC5hcHBlbmQoZHJpdmV0cmFpbi5YWzIsIDBdKQorCisgICNweWxhYi5wbG90KHJhbmdlKDEwMCksIGNsb3NlX2xvb3BfbGVmdCkKKyAgI3B5bGFiLnBsb3QocmFuZ2UoMTAwKSwgY2xvc2VfbG9vcF9yaWdodCkKKyAgI3B5bGFiLnNob3coKQorCisgICMgVHJ5IHR1cm5pbmcganVzdCBvbmUgc2lkZS4KKyAgZHJpdmV0cmFpbiA9IERyaXZldHJhaW4oKQorICBjbG9zZV9sb29wX2xlZnQgPSBbXQorICBjbG9zZV9sb29wX3JpZ2h0ID0gW10KKyAgUiA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdLCBbMS4wXSwgWzAuMF1dKQorICBmb3IgXyBpbiB4cmFuZ2UoMTAwKToKKyAgICBVID0gbnVtcHkuY2xpcChkcml2ZXRyYWluLksgKiAoUiAtIGRyaXZldHJhaW4uWF9oYXQpLAorICAgICAgICAgICAgICAgICAgIGRyaXZldHJhaW4uVV9taW4sIGRyaXZldHJhaW4uVV9tYXgpCisgICAgZHJpdmV0cmFpbi5VcGRhdGVPYnNlcnZlcihVKQorICAgIGRyaXZldHJhaW4uVXBkYXRlKFUpCisgICAgY2xvc2VfbG9vcF9sZWZ0LmFwcGVuZChkcml2ZXRyYWluLlhbMCwgMF0pCisgICAgY2xvc2VfbG9vcF9yaWdodC5hcHBlbmQoZHJpdmV0cmFpbi5YWzIsIDBdKQorCisgICNweWxhYi5wbG90KHJhbmdlKDEwMCksIGNsb3NlX2xvb3BfbGVmdCkKKyAgI3B5bGFiLnBsb3QocmFuZ2UoMTAwKSwgY2xvc2VfbG9vcF9yaWdodCkKKyAgI3B5bGFiLnNob3coKQorCisgICMgV3JpdGUgdGhlIGdlbmVyYXRlZCBjb25zdGFudHMgb3V0IHRvIGEgZmlsZS4KKyAgcHJpbnQgIk91dHB1dCBvbmUiCisgIGRyaXZldHJhaW5fbG93X2xvdyA9IERyaXZldHJhaW4obmFtZT0iRHJpdmV0cmFpbkxvd0xvdyIsIGxlZnRfbG93PVRydWUsIHJpZ2h0X2xvdz1UcnVlKQorICBkcml2ZXRyYWluX2xvd19oaWdoID0gRHJpdmV0cmFpbihuYW1lPSJEcml2ZXRyYWluTG93SGlnaCIsIGxlZnRfbG93PVRydWUsIHJpZ2h0X2xvdz1GYWxzZSkKKyAgZHJpdmV0cmFpbl9oaWdoX2xvdyA9IERyaXZldHJhaW4obmFtZT0iRHJpdmV0cmFpbkhpZ2hMb3ciLCBsZWZ0X2xvdz1GYWxzZSwgcmlnaHRfbG93PVRydWUpCisgIGRyaXZldHJhaW5faGlnaF9oaWdoID0gRHJpdmV0cmFpbihuYW1lPSJEcml2ZXRyYWluSGlnaEhpZ2giLCBsZWZ0X2xvdz1GYWxzZSwgcmlnaHRfbG93PUZhbHNlKQorCisgIGlmIGxlbihhcmd2KSAhPSA1OgorICAgIHByaW50ICJFeHBlY3RlZCAuaCBmaWxlIG5hbWUgYW5kIC5jYyBmaWxlIG5hbWUiCisgIGVsc2U6CisgICAgZG9nX2xvb3Bfd3JpdGVyID0gY29udHJvbF9sb29wLkNvbnRyb2xMb29wV3JpdGVyKAorICAgICAgICAiRHJpdmV0cmFpbiIsIFtkcml2ZXRyYWluX2xvd19sb3csIGRyaXZldHJhaW5fbG93X2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgIGRyaXZldHJhaW5faGlnaF9sb3csIGRyaXZldHJhaW5faGlnaF9oaWdoXSkKKyAgICBpZiBhcmd2WzFdWy0zOl0gPT0gJy5jYyc6CisgICAgICBkb2dfbG9vcF93cml0ZXIuV3JpdGUoYXJndlsyXSwgYXJndlsxXSkKKyAgICBlbHNlOgorICAgICAgZG9nX2xvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMV0sIGFyZ3ZbMl0pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vZWxldmF0b3IucHkgYi95MjAxNS9jb250cm9sX2xvb3BzL3B5dGhvbi9lbGV2YXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYmE3MmM4Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vZWxldmF0b3IucHkKQEAgLTAsMCArMSwyNDYgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKK2ltcG9ydCBjb250cm9sX2xvb3AKK2ltcG9ydCBjb250cm9scworaW1wb3J0IHBvbHl0b3BlCitpbXBvcnQgcG9seWRyaXZldHJhaW4KK2ltcG9ydCBudW1weQoraW1wb3J0IHN5cworaW1wb3J0IG1hdHBsb3RsaWIKK2Zyb20gbWF0cGxvdGxpYiBpbXBvcnQgcHlsYWIKKworY2xhc3MgRWxldmF0b3IoY29udHJvbF9sb29wLkNvbnRyb2xMb29wKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IkVsZXZhdG9yIiwgbWFzcz1Ob25lKToKKyAgICBzdXBlcihFbGV2YXRvciwgc2VsZikuX19pbml0X18obmFtZSkKKyAgICAjIFN0YWxsIFRvcnF1ZSBpbiBOIG0KKyAgICBzZWxmLnN0YWxsX3RvcnF1ZSA9IDAuNDc2CisgICAgIyBTdGFsbCBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLnN0YWxsX2N1cnJlbnQgPSA4MC43MzAKKyAgICAjIEZyZWUgU3BlZWQgaW4gUlBNCisgICAgc2VsZi5mcmVlX3NwZWVkID0gMTM5MDYuMAorICAgICMgRnJlZSBDdXJyZW50IGluIEFtcHMKKyAgICBzZWxmLmZyZWVfY3VycmVudCA9IDUuODIwCisgICAgIyBNYXNzIG9mIHRoZSBlbGV2YXRvcgorICAgIGlmIG1hc3MgaXMgTm9uZToKKyAgICAgIHNlbGYubWFzcyA9IDEzLjAKKyAgICBlbHNlOgorICAgICAgc2VsZi5tYXNzID0gbWFzcworCisgICAgIyBSZXNpc3RhbmNlIG9mIHRoZSBtb3RvcgorICAgIHNlbGYuUiA9IDEyLjAgLyBzZWxmLnN0YWxsX2N1cnJlbnQKKyAgICAjIE1vdG9yIHZlbG9jaXR5IGNvbnN0YW50CisgICAgc2VsZi5LdiA9ICgoc2VsZi5mcmVlX3NwZWVkIC8gNjAuMCAqIDIuMCAqIG51bXB5LnBpKSAvCisgICAgICAgICAgICAgICAoMTIuMCAtIHNlbGYuUiAqIHNlbGYuZnJlZV9jdXJyZW50KSkKKyAgICAjIFRvcnF1ZSBjb25zdGFudAorICAgIHNlbGYuS3QgPSBzZWxmLnN0YWxsX3RvcnF1ZSAvIHNlbGYuc3RhbGxfY3VycmVudAorICAgICMgR2VhciByYXRpbworICAgIHNlbGYuRyA9ICg1Ni4wIC8gMTIuMCkgKiAoODQuMCAvIDE0LjApCisgICAgIyBQdWxsZXkgZGlhbWV0ZXIKKyAgICBzZWxmLnIgPSAzMiAqIDAuMDA1IC8gbnVtcHkucGkgLyAyLjAKKyAgICAjIENvbnRyb2wgbG9vcCB0aW1lIHN0ZXAKKyAgICBzZWxmLmR0ID0gMC4wMDUKKworICAgICMgRWxldmF0b3IgbGVmdC9yaWdodCBzcHJpbmcgY29uc3RhbnQgKE4vbSkKKyAgICBzZWxmLnNwcmluZyA9IDgwMC4wCisKKyAgICAjIFN0YXRlIGlzIFthdmVyYWdlIHBvc2l0aW9uLCBhdmVyYWdlIHZlbG9jaXR5LAorICAgICMgICAgICAgICAgIHBvc2l0aW9uIGRpZmZlcmVuY2UvMiwgdmVsb2NpdHkgZGlmZmVyZW5jZS8yXQorICAgICMgSW5wdXQgaXMgW1ZfbGVmdCwgVl9yaWdodF0KKworICAgIEMxID0gc2VsZi5zcHJpbmcgLyAoc2VsZi5tYXNzICogMC41KQorICAgIEMyID0gc2VsZi5LdCAqIHNlbGYuRyAvIChzZWxmLm1hc3MgKiAwLjUgKiBzZWxmLnIgKiBzZWxmLlIpCisgICAgQzMgPSBzZWxmLkcgKiBzZWxmLkcgKiBzZWxmLkt0IC8gKAorICAgICAgICBzZWxmLlIgICogc2VsZi5yICogc2VsZi5yICogc2VsZi5tYXNzICogMC41ICogc2VsZi5LdikKKworICAgIHNlbGYuQV9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDEsIDAsIDBdLAorICAgICAgICAgWzAsIC1DMywgMCwgMF0sCisgICAgICAgICBbMCwgMCwgMCwgMV0sCisgICAgICAgICBbMCwgMCwgLUMxICogMi4wLCAtQzNdXSkKKworICAgIHByaW50ICJGdWxsIHNwZWVkIGlzIiwgQzIgLyBDMyAqIDEyLjAKKworICAgICMgU3RhcnQgd2l0aCB0aGUgdW5tb2RpZmllZCBpbnB1dAorICAgIHNlbGYuQl9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAsIDBdLAorICAgICAgICAgW0MyIC8gMi4wLCBDMiAvIDIuMF0sCisgICAgICAgICBbMCwgMF0sCisgICAgICAgICBbQzIgLyAyLjAsIC1DMiAvIDIuMF1dKQorCisgICAgc2VsZi5DID0gbnVtcHkubWF0cml4KFtbMSwgMCwgMSwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMSwgMCwgLTEsIDBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwXV0pCisKKyAgICBzZWxmLkEsIHNlbGYuQiA9IHNlbGYuQ29udGludW91c1RvRGlzY3JldGUoCisgICAgICAgIHNlbGYuQV9jb250aW51b3VzLCBzZWxmLkJfY29udGludW91cywgc2VsZi5kdCkKKworICAgIHByaW50IHNlbGYuQQorCisgICAgY29udHJvbGFiaWxpdHkgPSBjb250cm9scy5jdHJiKHNlbGYuQSwgc2VsZi5CKTsKKyAgICBwcmludCAiUmFuayBvZiBhdWdtZW50ZWQgY29udHJvbGFiaWxpdHkgbWF0cml4LiIsIG51bXB5LmxpbmFsZy5tYXRyaXhfcmFuaygKKyAgICAgICAgY29udHJvbGFiaWxpdHkpCisKKyAgICBxX3BvcyA9IDAuMDIKKyAgICBxX3ZlbCA9IDAuNDAwCisgICAgcV9wb3NfZGlmZiA9IDAuMDEKKyAgICBxX3ZlbF9kaWZmID0gMC40NQorICAgIHNlbGYuUSA9IG51bXB5Lm1hdHJpeChbWygxLjAgLyAocV9wb3MgKiogMi4wKSksIDAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgKDEuMCAvIChxX3ZlbCAqKiAyLjApKSwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAoMS4wIC8gKHFfcG9zX2RpZmYgKiogMi4wKSksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAwLjAsIDAuMCwgKDEuMCAvIChxX3ZlbF9kaWZmICoqIDIuMCkpXV0pCisKKyAgICBzZWxmLlIgPSBudW1weS5tYXRyaXgoW1soMS4wIC8gKDEyLjAgKiogMi4wKSksIDAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wLCAxLjAgLyAoMTIuMCAqKiAyLjApXV0pCisgICAgc2VsZi5LID0gY29udHJvbHMuZGxxcihzZWxmLkEsIHNlbGYuQiwgc2VsZi5RLCBzZWxmLlIpCisgICAgcHJpbnQgc2VsZi5LCisKKyAgICBwcmludCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuQiAqIHNlbGYuSylbMF0KKworICAgIHNlbGYucnBsID0gMC4yMAorICAgIHNlbGYuaXBsID0gMC4wNQorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLnJwbCArIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsICsgMWogKiBzZWxmLmlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGwgLSAxaiAqIHNlbGYuaXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbCAtIDFqICogc2VsZi5pcGxdKQorCisgICAgIyBUaGUgYm94IGZvcm1lZCBieSBVX21pbiBhbmQgVV9tYXggbXVzdCBlbmNvbXBhc3MgYWxsIHBvc3NpYmxlIHZhbHVlcywKKyAgICAjIG9yIGVsc2UgQXVzdGluJ3MgY29kZSBnZXRzIGFuZ3J5LgorICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXSwgWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KFtbLTEyLjBdLCBbLTEyLjBdXSkKKworICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworCitkZWYgQ2FwVShVKToKKyAgaWYgVVswLCAwXSAtIFVbMSwgMF0gPiAyNDoKKyAgICByZXR1cm4gbnVtcHkubWF0cml4KFtbMTJdLCBbLTEyXV0pCisgIGVsaWYgVVswLCAwXSAtIFVbMSwgMF0gPCAtMjQ6CisgICAgcmV0dXJuIG51bXB5Lm1hdHJpeChbWy0xMl0sIFsxMl1dKQorICBlbHNlOgorICAgIG1heF91ID0gbWF4KFVbMCwgMF0sIFVbMSwgMF0pCisgICAgbWluX3UgPSBtaW4oVVswLCAwXSwgVVsxLCAwXSkKKyAgICBpZiBtYXhfdSA+IDEyOgorICAgICAgcmV0dXJuIFUgLSAobWF4X3UgLSAxMikKKyAgICBpZiBtaW5fdSA8IC0xMjoKKyAgICAgIHJldHVybiBVIC0gKG1pbl91ICsgMTIpCisgICAgcmV0dXJuIFUKKworCitkZWYgcnVuX3Rlc3QoZWxldmF0b3IsIGluaXRpYWxfWCwgZ29hbCwgbWF4X3NlcGFyYXRpb25fZXJyb3I9MC4wMSwKKyAgICAgICAgICAgICBzaG93X2dyYXBoPVRydWUsIGl0ZXJhdGlvbnM9MjAwLCBjb250cm9sbGVyX2VsZXZhdG9yPU5vbmUsCisgICAgICAgICAgICAgb2JzZXJ2ZXJfZWxldmF0b3I9Tm9uZSk6CisgICIiIlJ1bnMgdGhlIGVsZXZhdG9yIHBsYW50IHdpdGggYW4gaW5pdGlhbCBjb25kaXRpb24gYW5kIGdvYWwuCisKKyAgICBUaGUgdGVzdHMgdGhlbXNlbHZlcyBhcmUgbm90IHRlcnJpYmx5IHNvcGhpc3RpY2F0ZWQ7IEkganVzdCB0ZXN0IGZvcgorICAgIHdoZXRoZXIgdGhlIGdvYWwgaGFzIGJlZW4gcmVhY2hlZCBhbmQgd2hldGhlciB0aGUgc2VwYXJhdGlvbiBnb2VzCisgICAgb3V0c2lkZSBvZiB0aGUgaW5pdGlhbCBhbmQgZ29hbCB2YWx1ZXMgYnkgbW9yZSB0aGFuIG1heF9zZXBhcmF0aW9uX2Vycm9yLgorICAgIFByaW50cyBvdXQgc29tZXRoaW5nIGZvciBhIGZhaWx1cmUgb2YgZWl0aGVyIGNvbmRpdGlvbiBhbmQgcmV0dXJucworICAgIEZhbHNlIGlmIHRlc3RzIGZhaWwuCisgICAgQXJnczoKKyAgICAgIGVsZXZhdG9yOiBlbGV2YXRvciBvYmplY3QgdG8gdXNlLgorICAgICAgaW5pdGlhbF9YOiBzdGFydGluZyBzdGF0ZS4KKyAgICAgIGdvYWw6IGdvYWwgc3RhdGUuCisgICAgICBzaG93X2dyYXBoOiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IGEgZ3JhcGggc2hvd2luZyB0aGUgY2hhbmdpbmcKKyAgICAgICAgICAgc3RhdGVzIGFuZCB2b2x0YWdlcy4KKyAgICAgIGl0ZXJhdGlvbnM6IE51bWJlciBvZiB0aW1lc3RlcHMgdG8gcnVuIHRoZSBtb2RlbCBmb3IuCisgICAgICBjb250cm9sbGVyX2VsZXZhdG9yOiBlbGV2YXRvciBvYmplY3QgdG8gZ2V0IEsgZnJvbSwgb3IgTm9uZSBpZiB3ZSBzaG91bGQKKyAgICAgICAgICB1c2UgZWxldmF0b3IuCisgICAgICBvYnNlcnZlcl9lbGV2YXRvcjogZWxldmF0b3Igb2JqZWN0IHRvIHVzZSBmb3IgdGhlIG9ic2VydmVyLCBvciBOb25lIGlmIHdlCisgICAgICAgICAgc2hvdWxkIHVzZSB0aGUgYWN0dWFsIHN0YXRlLgorICAiIiIKKworICBlbGV2YXRvci5YID0gaW5pdGlhbF9YCisKKyAgaWYgY29udHJvbGxlcl9lbGV2YXRvciBpcyBOb25lOgorICAgIGNvbnRyb2xsZXJfZWxldmF0b3IgPSBlbGV2YXRvcgorCisgIGlmIG9ic2VydmVyX2VsZXZhdG9yIGlzIG5vdCBOb25lOgorICAgIG9ic2VydmVyX2VsZXZhdG9yLlhfaGF0ID0gaW5pdGlhbF9YICsgMC4wMQorICAgIG9ic2VydmVyX2VsZXZhdG9yLlhfaGF0ID0gaW5pdGlhbF9YCisKKyAgIyBWYXJpb3VzIGxpc3RzIGZvciBncmFwaGluZyB0aGluZ3MuCisgIHQgPSBbXQorICB4X2F2ZyA9IFtdCisgIHhfc2VwID0gW10KKyAgeF9oYXRfYXZnID0gW10KKyAgeF9oYXRfc2VwID0gW10KKyAgdl9hdmcgPSBbXQorICB2X3NlcCA9IFtdCisgIHVfbGVmdCA9IFtdCisgIHVfcmlnaHQgPSBbXQorCisgIHNlcF9wbG90X2dhaW4gPSAxMDAuMAorCisgIGZvciBpIGluIHhyYW5nZShpdGVyYXRpb25zKToKKyAgICBYX2hhdCA9IGVsZXZhdG9yLlgKKyAgICBpZiBvYnNlcnZlcl9lbGV2YXRvciBpcyBub3QgTm9uZToKKyAgICAgIFhfaGF0ID0gb2JzZXJ2ZXJfZWxldmF0b3IuWF9oYXQKKyAgICAgIHhfaGF0X2F2Zy5hcHBlbmQob2JzZXJ2ZXJfZWxldmF0b3IuWF9oYXRbMCwgMF0pCisgICAgICB4X2hhdF9zZXAuYXBwZW5kKG9ic2VydmVyX2VsZXZhdG9yLlhfaGF0WzIsIDBdICogc2VwX3Bsb3RfZ2FpbikKKyAgICBVID0gY29udHJvbGxlcl9lbGV2YXRvci5LICogKGdvYWwgLSBYX2hhdCkKKyAgICBVID0gQ2FwVShVKQorICAgIHhfYXZnLmFwcGVuZChlbGV2YXRvci5YWzAsIDBdKQorICAgIHZfYXZnLmFwcGVuZChlbGV2YXRvci5YWzEsIDBdKQorICAgIHhfc2VwLmFwcGVuZChlbGV2YXRvci5YWzIsIDBdICogc2VwX3Bsb3RfZ2FpbikKKyAgICB2X3NlcC5hcHBlbmQoZWxldmF0b3IuWFszLCAwXSkKKyAgICBpZiBvYnNlcnZlcl9lbGV2YXRvciBpcyBub3QgTm9uZToKKyAgICAgIG9ic2VydmVyX2VsZXZhdG9yLlByZWRpY3RPYnNlcnZlcihVKQorICAgIGVsZXZhdG9yLlVwZGF0ZShVKQorICAgIGlmIG9ic2VydmVyX2VsZXZhdG9yIGlzIG5vdCBOb25lOgorICAgICAgb2JzZXJ2ZXJfZWxldmF0b3IuWSA9IGVsZXZhdG9yLlkKKyAgICAgIG9ic2VydmVyX2VsZXZhdG9yLkNvcnJlY3RPYnNlcnZlcihVKQorCisgICAgdC5hcHBlbmQoaSAqIGVsZXZhdG9yLmR0KQorICAgIHVfbGVmdC5hcHBlbmQoVVswLCAwXSkKKyAgICB1X3JpZ2h0LmFwcGVuZChVWzEsIDBdKQorCisgIHByaW50IG51bXB5LmxpbmFsZy5pbnYoZWxldmF0b3IuQSkKKyAgcHJpbnQgImRlbHRhIHRpbWUgaXMgIiwgZWxldmF0b3IuZHQKKyAgcHJpbnQgIlZlbG9jaXR5IGF0IHQ9MCBpcyAiLCB4X2F2Z1swXSwgdl9hdmdbMF0sIHhfc2VwWzBdLCB2X3NlcFswXQorICBwcmludCAiVmVsb2NpdHkgYXQgdD0xK2R0IGlzICIsIHhfYXZnWzFdLCB2X2F2Z1sxXSwgeF9zZXBbMV0sIHZfc2VwWzFdCisKKyAgaWYgc2hvd19ncmFwaDoKKyAgICBweWxhYi5zdWJwbG90KDIsIDEsIDEpCisgICAgcHlsYWIucGxvdCh0LCB4X2F2ZywgbGFiZWw9J3ggYXZnJykKKyAgICBweWxhYi5wbG90KHQsIHhfc2VwLCBsYWJlbD0neCBzZXAnKQorICAgIGlmIG9ic2VydmVyX2VsZXZhdG9yIGlzIG5vdCBOb25lOgorICAgICAgcHlsYWIucGxvdCh0LCB4X2hhdF9hdmcsIGxhYmVsPSd4X2hhdCBhdmcnKQorICAgICAgcHlsYWIucGxvdCh0LCB4X2hhdF9zZXAsIGxhYmVsPSd4X2hhdCBzZXAnKQorICAgIHB5bGFiLmxlZ2VuZCgpCisKKyAgICBweWxhYi5zdWJwbG90KDIsIDEsIDIpCisgICAgcHlsYWIucGxvdCh0LCB1X2xlZnQsIGxhYmVsPSd1IGxlZnQnKQorICAgIHB5bGFiLnBsb3QodCwgdV9yaWdodCwgbGFiZWw9J3UgcmlnaHQnKQorICAgIHB5bGFiLmxlZ2VuZCgpCisgICAgcHlsYWIuc2hvdygpCisKKworZGVmIG1haW4oYXJndik6CisgIGxvYWRlZF9tYXNzID0gMjUKKyAgI2xvYWRlZF9tYXNzID0gMAorICBlbGV2YXRvciA9IEVsZXZhdG9yKG1hc3M9MTMgKyBsb2FkZWRfbWFzcykKKyAgZWxldmF0b3JfY29udHJvbGxlciA9IEVsZXZhdG9yKG1hc3M9MTMgKyAxNSkKKyAgb2JzZXJ2ZXJfZWxldmF0b3IgPSBFbGV2YXRvcihtYXNzPTEzICsgMTUpCisgICNvYnNlcnZlcl9lbGV2YXRvciA9IE5vbmUKKworICAjIFRlc3QgbW92aW5nIHRoZSBlbGV2YXRvciB3aXRoIGNvbnN0YW50IHNlcGFyYXRpb24uCisgIGluaXRpYWxfWCA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdLCBbMC4wMV0sIFswLjBdXSkKKyAgI2luaXRpYWxfWCA9IG51bXB5Lm1hdHJpeChbWzAuMF0sIFswLjBdLCBbMC4wMF0sIFswLjBdXSkKKyAgUiA9IG51bXB5Lm1hdHJpeChbWzEuMF0sIFswLjBdLCBbMC4wXSwgWzAuMF1dKQorICBydW5fdGVzdChlbGV2YXRvciwgaW5pdGlhbF9YLCBSLCBjb250cm9sbGVyX2VsZXZhdG9yPWVsZXZhdG9yX2NvbnRyb2xsZXIsCisgICAgICAgICAgIG9ic2VydmVyX2VsZXZhdG9yPW9ic2VydmVyX2VsZXZhdG9yKQorCisgICMgV3JpdGUgdGhlIGdlbmVyYXRlZCBjb25zdGFudHMgb3V0IHRvIGEgZmlsZS4KKyAgaWYgbGVuKGFyZ3YpICE9IDM6CisgICAgcHJpbnQgIkV4cGVjdGVkIC5oIGZpbGUgbmFtZSBhbmQgLmNjIGZpbGUgbmFtZSBmb3IgdGhlIGVsZXZhdG9yLiIKKyAgZWxzZToKKyAgICBlbGV2YXRvciA9IEVsZXZhdG9yKCJFbGV2YXRvciIpCisgICAgbG9vcF93cml0ZXIgPSBjb250cm9sX2xvb3AuQ29udHJvbExvb3BXcml0ZXIoIkVsZXZhdG9yIiwgW2VsZXZhdG9yXSkKKyAgICBpZiBhcmd2WzFdWy0zOl0gPT0gJy5jYyc6CisgICAgICBsb29wX3dyaXRlci5Xcml0ZShhcmd2WzJdLCBhcmd2WzFdKQorICAgIGVsc2U6CisgICAgICBsb29wX3dyaXRlci5Xcml0ZShhcmd2WzFdLCBhcmd2WzJdKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKHN5cy5hcmd2KSkKZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvcHl0aG9uL3BvbHlkcml2ZXRyYWluLnB5IGIveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vcG9seWRyaXZldHJhaW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTYyYzhjOAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvcHl0aG9uL3BvbHlkcml2ZXRyYWluLnB5CkBAIC0wLDAgKzEsNTA0IEBACisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgbnVtcHkKK2ltcG9ydCBzeXMKK2ltcG9ydCBwb2x5dG9wZQoraW1wb3J0IGRyaXZldHJhaW4KK2ltcG9ydCBjb250cm9sX2xvb3AKK2ltcG9ydCBjb250cm9scworZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgorCitfX2F1dGhvcl9fID0gJ0F1c3RpbiBTY2h1aCAoYXVzdGluLmxpbnV4QGdtYWlsLmNvbSknCisKKworZGVmIENvZXJjZUdvYWwocmVnaW9uLCBLLCB3LCBSKToKKyAgIiIiSW50ZXJzZWN0cyBhIGxpbmUgd2l0aCBhIHJlZ2lvbiwgYW5kIGZpbmRzIHRoZSBjbG9zZXN0IHBvaW50IHRvIFIuCisKKyAgRmluZHMgYSBwb2ludCB0aGF0IGlzIGNsb3Nlc3QgdG8gUiBpbnNpZGUgdGhlIHJlZ2lvbiwgYW5kIG9uIHRoZSBsaW5lCisgIGRlZmluZWQgYnkgSyBYID0gdy4gIElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBmaW5kIGEgcG9pbnQgb24gdGhlIGxpbmUsCisgIGZpbmRzIGEgcG9pbnQgdGhhdCBpcyBpbnNpZGUgdGhlIHJlZ2lvbiBhbmQgY2xvc2VzdCB0byB0aGUgbGluZS4gIFRoaXMKKyAgZnVuY3Rpb24gYXNzdW1lcyB0aGF0CisKKyAgQXJnczoKKyAgICByZWdpb246IEhQb2x5dG9wZSwgdGhlIHZhbGlkIGdvYWwgcmVnaW9uLgorICAgIEs6IG51bXB5Lm1hdHJpeCAoMiB4IDEpLCB0aGUgbWF0cml4IGZvciB0aGUgZXF1YXRpb24gW0sxLCBLMl0gW3gxOyB4Ml0gPSB3CisgICAgdzogZmxvYXQsIHRoZSBvZmZzZXQgaW4gdGhlIGVxdWF0aW9uIGFib3ZlLgorICAgIFI6IG51bXB5Lm1hdHJpeCAoMiB4IDEpLCB0aGUgcG9pbnQgdG8gYmUgY2xvc2VzdCB0by4KKworICBSZXR1cm5zOgorICAgIG51bXB5Lm1hdHJpeCAoMiB4IDEpLCB0aGUgcG9pbnQuCisgICIiIgorICByZXR1cm4gRG9Db2VyY2VHb2FsKHJlZ2lvbiwgSywgdywgUilbMF0KKworZGVmIERvQ29lcmNlR29hbChyZWdpb24sIEssIHcsIFIpOgorICBpZiByZWdpb24uSXNJbnNpZGUoUik6CisgICAgcmV0dXJuIChSLCBUcnVlKQorCisgIHBlcnBlbmRpY3VsYXJfdmVjdG9yID0gSy5UIC8gbnVtcHkubGluYWxnLm5vcm0oSykKKyAgcGFyYWxsZWxfdmVjdG9yID0gbnVtcHkubWF0cml4KFtbcGVycGVuZGljdWxhcl92ZWN0b3JbMSwgMF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFstcGVycGVuZGljdWxhcl92ZWN0b3JbMCwgMF1dXSkKKyAgCisgICMgV2Ugd2FudCB0byBpbXBvc2UgdGhlIGNvbnN0cmFpbnQgSyAqIFggPSB3IG9uIHRoZSBwb2x5dG9wZSBIICogWCA8PSBrLgorICAjIFdlIGRvIHRoaXMgYnkgYnJlYWtpbmcgWCB1cCBpbnRvIHBhcmFsbGVsIGFuZCBwZXJwZW5kaWN1bGFyIGNvbXBvbmVudHMgdG8KKyAgIyB0aGUgaGFsZiBwbGFuZS4gIFRoaXMgZ2l2ZXMgdXMgdGhlIGZvbGxvd2luZyBlcXVhdGlvbi4KKyAgIworICAjICBwYXJhbGxlbCAqIChwYXJhbGxlbC5UIFxkb3QgWCkgKyBwZXJwZW5kaWN1bGFyICogKHBlcnBlbmRpY3VsYXIgXGRvdCBYKSkgPSBYCisgICMKKyAgIyBUaGVuLCBzdWJzdGl0dXRlIHRoaXMgaW50byB0aGUgcG9seXRvcGUuCisgICMKKyAgIyAgSCAqIChwYXJhbGxlbCAqIChwYXJhbGxlbC5UIFxkb3QgWCkgKyBwZXJwZW5kaWN1bGFyICogKHBlcnBlbmRpY3VsYXIgXGRvdCBYKSkgPD0gaworICAjCisgICMgU3Vic3RpdHV0ZSBLICogWCA9IHcKKyAgIworICAjIEggKiBwYXJhbGxlbCAqIChwYXJhbGxlbC5UIFxkb3QgWCkgKyBIICogcGVycGVuZGljdWxhciAqIHcgPD0gaworICAjCisgICMgTW92ZSBhbGwgdGhlIGtub3ducyB0byB0aGUgcmlnaHQgc2lkZS4KKyAgIworICAjIEggKiBwYXJhbGxlbCAqIChbcGFyYWxsZWwxIHBhcmFsbGVsMl0gKiBYKSA8PSBrIC0gSCAqIHBlcnBlbmRpY3VsYXIgKiB3CisgICMKKyAgIyBMZXQgdCA9IHBhcmFsbGVsLlQgXGRvdCBYLCB0aGUgY29tcG9uZW50IHBhcmFsbGVsIHRvIHRoZSBzdXJmYWNlLgorICAjCisgICMgSCAqIHBhcmFsbGVsICogdCA8PSBrIC0gSCAqIHBlcnBlbmRpY3VsYXIgKiB3CisgICMKKyAgIyBUaGlzIGlzIGEgcG9seXRvcGUgd2hpY2ggd2UgY2FuIHNvbHZlLCBhbmQgdXNlIHRvIGZpZ3VyZSBvdXQgdGhlIHJhbmdlIG9mIFgKKyAgIyB0aGF0IHdlIGNhcmUgYWJvdXQhCisKKyAgdF9wb2x5ID0gcG9seXRvcGUuSFBvbHl0b3BlKAorICAgICAgcmVnaW9uLkggKiBwYXJhbGxlbF92ZWN0b3IsCisgICAgICByZWdpb24uayAtIHJlZ2lvbi5IICogcGVycGVuZGljdWxhcl92ZWN0b3IgKiB3KQorCisgIHZlcnRpY2VzID0gdF9wb2x5LlZlcnRpY2VzKCkKKworICBpZiB2ZXJ0aWNlcy5zaGFwZVswXToKKyAgICAjIFRoZSByZWdpb24gZXhpc3RzIQorICAgICMgRmluZCB0aGUgY2xvc2VzdCB2ZXJ0ZXgKKyAgICBtaW5fZGlzdGFuY2UgPSBudW1weS5pbmZ0eQorICAgIGNsb3Nlc3RfcG9pbnQgPSBOb25lCisgICAgZm9yIHZlcnRleCBpbiB2ZXJ0aWNlczoKKyAgICAgIHBvaW50ID0gcGFyYWxsZWxfdmVjdG9yICogdmVydGV4ICsgcGVycGVuZGljdWxhcl92ZWN0b3IgKiB3CisgICAgICBsZW5ndGggPSBudW1weS5saW5hbGcubm9ybShSIC0gcG9pbnQpCisgICAgICBpZiBsZW5ndGggPCBtaW5fZGlzdGFuY2U6CisgICAgICAgIG1pbl9kaXN0YW5jZSA9IGxlbmd0aAorICAgICAgICBjbG9zZXN0X3BvaW50ID0gcG9pbnQKKworICAgIHJldHVybiAoY2xvc2VzdF9wb2ludCwgVHJ1ZSkKKyAgZWxzZToKKyAgICAjIEZpbmQgdGhlIHZlcnRleCBvZiB0aGUgc3BhY2UgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBsaW5lLgorICAgIHJlZ2lvbl92ZXJ0aWNlcyA9IHJlZ2lvbi5WZXJ0aWNlcygpCisgICAgbWluX2Rpc3RhbmNlID0gbnVtcHkuaW5mdHkKKyAgICBjbG9zZXN0X3BvaW50ID0gTm9uZQorICAgIGZvciB2ZXJ0ZXggaW4gcmVnaW9uX3ZlcnRpY2VzOgorICAgICAgcG9pbnQgPSB2ZXJ0ZXguVAorICAgICAgbGVuZ3RoID0gbnVtcHkuYWJzKChwZXJwZW5kaWN1bGFyX3ZlY3Rvci5UICogcG9pbnQpWzAsIDBdKQorICAgICAgaWYgbGVuZ3RoIDwgbWluX2Rpc3RhbmNlOgorICAgICAgICBtaW5fZGlzdGFuY2UgPSBsZW5ndGgKKyAgICAgICAgY2xvc2VzdF9wb2ludCA9IHBvaW50CisKKyAgICByZXR1cm4gKGNsb3Nlc3RfcG9pbnQsIEZhbHNlKQorCisKK2NsYXNzIFZlbG9jaXR5RHJpdmV0cmFpbk1vZGVsKGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0X2xvdz1UcnVlLCByaWdodF9sb3c9VHJ1ZSwgbmFtZT0iVmVsb2NpdHlEcml2ZXRyYWluTW9kZWwiKToKKyAgICBzdXBlcihWZWxvY2l0eURyaXZldHJhaW5Nb2RlbCwgc2VsZikuX19pbml0X18obmFtZSkKKyAgICBzZWxmLl9kcml2ZXRyYWluID0gZHJpdmV0cmFpbi5Ecml2ZXRyYWluKGxlZnRfbG93PWxlZnRfbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfbG93PXJpZ2h0X2xvdykKKyAgICBzZWxmLmR0ID0gMC4wMQorICAgIHNlbGYuQV9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbW3NlbGYuX2RyaXZldHJhaW4uQV9jb250aW51b3VzWzEsIDFdLCBzZWxmLl9kcml2ZXRyYWluLkFfY29udGludW91c1sxLCAzXV0sCisgICAgICAgICBbc2VsZi5fZHJpdmV0cmFpbi5BX2NvbnRpbnVvdXNbMywgMV0sIHNlbGYuX2RyaXZldHJhaW4uQV9jb250aW51b3VzWzMsIDNdXV0pCisKKyAgICBzZWxmLkJfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1tzZWxmLl9kcml2ZXRyYWluLkJfY29udGludW91c1sxLCAwXSwgc2VsZi5fZHJpdmV0cmFpbi5CX2NvbnRpbnVvdXNbMSwgMV1dLAorICAgICAgICAgW3NlbGYuX2RyaXZldHJhaW4uQl9jb250aW51b3VzWzMsIDBdLCBzZWxmLl9kcml2ZXRyYWluLkJfY29udGludW91c1szLCAxXV1dKQorICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChudW1weS5leWUoMikpOworICAgIHNlbGYuRCA9IG51bXB5Lm1hdHJpeChudW1weS56ZXJvcygoMiwgMikpKTsKKworICAgIHNlbGYuQSwgc2VsZi5CID0gc2VsZi5Db250aW51b3VzVG9EaXNjcmV0ZShzZWxmLkFfY29udGludW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICAjIEZGICogWCA9IFUgKHN0ZWFkeSBzdGF0ZSkKKyAgICBzZWxmLkZGID0gc2VsZi5CLkkgKiAobnVtcHkuZXllKDIpIC0gc2VsZi5BKQorCisgICAgc2VsZi5QbGFjZUNvbnRyb2xsZXJQb2xlcyhbMC42LCAwLjZdKQorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFswLjAyLCAwLjAyXSkKKworICAgIHNlbGYuR19oaWdoID0gc2VsZi5fZHJpdmV0cmFpbi5HX2hpZ2gKKyAgICBzZWxmLkdfbG93ID0gc2VsZi5fZHJpdmV0cmFpbi5HX2xvdworICAgIHNlbGYuUiA9IHNlbGYuX2RyaXZldHJhaW4uUgorICAgIHNlbGYuciA9IHNlbGYuX2RyaXZldHJhaW4ucgorICAgIHNlbGYuS3YgPSBzZWxmLl9kcml2ZXRyYWluLkt2CisgICAgc2VsZi5LdCA9IHNlbGYuX2RyaXZldHJhaW4uS3QKKworICAgIHNlbGYuVV9tYXggPSBzZWxmLl9kcml2ZXRyYWluLlVfbWF4CisgICAgc2VsZi5VX21pbiA9IHNlbGYuX2RyaXZldHJhaW4uVV9taW4KKworCitjbGFzcyBWZWxvY2l0eURyaXZldHJhaW4ob2JqZWN0KToKKyAgSElHSCA9ICdoaWdoJworICBMT1cgPSAnbG93JworICBTSElGVElOR19VUCA9ICd1cCcKKyAgU0hJRlRJTkdfRE9XTiA9ICdkb3duJworCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLmRyaXZldHJhaW5fbG93X2xvdyA9IFZlbG9jaXR5RHJpdmV0cmFpbk1vZGVsKAorICAgICAgICBsZWZ0X2xvdz1UcnVlLCByaWdodF9sb3c9VHJ1ZSwgbmFtZT0nVmVsb2NpdHlEcml2ZXRyYWluTG93TG93JykKKyAgICBzZWxmLmRyaXZldHJhaW5fbG93X2hpZ2ggPSBWZWxvY2l0eURyaXZldHJhaW5Nb2RlbChsZWZ0X2xvdz1UcnVlLCByaWdodF9sb3c9RmFsc2UsIG5hbWU9J1ZlbG9jaXR5RHJpdmV0cmFpbkxvd0hpZ2gnKQorICAgIHNlbGYuZHJpdmV0cmFpbl9oaWdoX2xvdyA9IFZlbG9jaXR5RHJpdmV0cmFpbk1vZGVsKGxlZnRfbG93PUZhbHNlLCByaWdodF9sb3c9VHJ1ZSwgbmFtZSA9ICdWZWxvY2l0eURyaXZldHJhaW5IaWdoTG93JykKKyAgICBzZWxmLmRyaXZldHJhaW5faGlnaF9oaWdoID0gVmVsb2NpdHlEcml2ZXRyYWluTW9kZWwobGVmdF9sb3c9RmFsc2UsIHJpZ2h0X2xvdz1GYWxzZSwgbmFtZSA9ICdWZWxvY2l0eURyaXZldHJhaW5IaWdoSGlnaCcpCisKKyAgICAjIFggaXMgW2x2ZWwsIHJ2ZWxdCisgICAgc2VsZi5YID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAuMF0sCisgICAgICAgICBbMC4wXV0pCisKKyAgICBzZWxmLlVfcG9seSA9IHBvbHl0b3BlLkhQb2x5dG9wZSgKKyAgICAgICAgbnVtcHkubWF0cml4KFtbMSwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgWy0xLCAwXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMCwgMV0sCisgICAgICAgICAgICAgICAgICAgICAgWzAsIC0xXV0pLAorICAgICAgICBudW1weS5tYXRyaXgoW1sxMl0sCisgICAgICAgICAgICAgICAgICAgICAgWzEyXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTJdLAorICAgICAgICAgICAgICAgICAgICAgIFsxMl1dKSkKKworICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbMTIuMF0sCisgICAgICAgICBbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoCisgICAgICAgIFtbLTEyLjAwMDAwMDAwMDBdLAorICAgICAgICAgWy0xMi4wMDAwMDAwMDAwXV0pCisKKyAgICBzZWxmLmR0ID0gMC4wMQorCisgICAgc2VsZi5SID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzAuMF0sCisgICAgICAgICBbMC4wXV0pCisKKyAgICAjIHR0cnVzdCBpcyB0aGUgY29tcHJpbWlzZSBiZXR3ZWVuIGhhdmluZyBmdWxsIHRocm90dGxlIG5lZ2F0aXZlIGluZXJ0aWEsCisgICAgIyBhbmQgaGF2aW5nIG5vIHRocm90dGxlIG5lZ2F0aXZlIGluZXJ0aWEuICBBIHZhbHVlIG9mIDAgaXMgZnVsbCB0aHJvdHRsZQorICAgICMgaW5lcnRpYS4gIEEgdmFsdWUgb2YgMSBpcyBubyB0aHJvdHRsZSBuZWdhdGl2ZSBpbmVydGlhLgorICAgIHNlbGYudHRydXN0ID0gMS4xCisKKyAgICBzZWxmLmxlZnRfZ2VhciA9IFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKyAgICBzZWxmLnJpZ2h0X2dlYXIgPSBWZWxvY2l0eURyaXZldHJhaW4uTE9XCisgICAgc2VsZi5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24gPSAwLjAKKyAgICBzZWxmLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPSAwLjAKKyAgICBzZWxmLmxlZnRfY2ltID0gZHJpdmV0cmFpbi5DSU0oKQorICAgIHNlbGYucmlnaHRfY2ltID0gZHJpdmV0cmFpbi5DSU0oKQorCisgIGRlZiBJc0luR2VhcihzZWxmLCBnZWFyKToKKyAgICByZXR1cm4gZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSCBvciBnZWFyIGlzIFZlbG9jaXR5RHJpdmV0cmFpbi5MT1cKKworICBkZWYgTW90b3JSUE0oc2VsZiwgc2hpZnRlcl9wb3NpdGlvbiwgdmVsb2NpdHkpOgorICAgIGlmIHNoaWZ0ZXJfcG9zaXRpb24gPiAwLjU6CisgICAgICByZXR1cm4gKHZlbG9jaXR5IC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkdfaGlnaCAvCisgICAgICAgICAgICAgIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5yKQorICAgIGVsc2U6CisgICAgICByZXR1cm4gKHZlbG9jaXR5IC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkdfbG93IC8KKyAgICAgICAgICAgICAgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLnIpCisKKyAgZGVmIEN1cnJlbnREcml2ZXRyYWluKHNlbGYpOgorICAgIGlmIHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uID4gMC41OgorICAgICAgaWYgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uID4gMC41OgorICAgICAgICByZXR1cm4gc2VsZi5kcml2ZXRyYWluX2hpZ2hfaGlnaAorICAgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHNlbGYuZHJpdmV0cmFpbl9oaWdoX2xvdworICAgIGVsc2U6CisgICAgICBpZiBzZWxmLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPiAwLjU6CisgICAgICAgIHJldHVybiBzZWxmLmRyaXZldHJhaW5fbG93X2hpZ2gKKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBzZWxmLmRyaXZldHJhaW5fbG93X2xvdworCisgIGRlZiBTaW1TaGlmdGVyKHNlbGYsIGdlYXIsIHNoaWZ0ZXJfcG9zaXRpb24pOgorICAgIGlmIGdlYXIgaXMgVmVsb2NpdHlEcml2ZXRyYWluLkhJR0ggb3IgZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uU0hJRlRJTkdfVVA6CisgICAgICBzaGlmdGVyX3Bvc2l0aW9uID0gbWluKHNoaWZ0ZXJfcG9zaXRpb24gKyAwLjUsIDEuMCkKKyAgICBlbHNlOgorICAgICAgc2hpZnRlcl9wb3NpdGlvbiA9IG1heChzaGlmdGVyX3Bvc2l0aW9uIC0gMC41LCAwLjApCisKKyAgICBpZiBzaGlmdGVyX3Bvc2l0aW9uID09IDEuMDoKKyAgICAgIGdlYXIgPSBWZWxvY2l0eURyaXZldHJhaW4uSElHSAorICAgIGVsaWYgc2hpZnRlcl9wb3NpdGlvbiA9PSAwLjA6CisgICAgICBnZWFyID0gVmVsb2NpdHlEcml2ZXRyYWluLkxPVworCisgICAgcmV0dXJuIGdlYXIsIHNoaWZ0ZXJfcG9zaXRpb24KKworICBkZWYgQ29tcHV0ZUdlYXIoc2VsZiwgd2hlZWxfdmVsb2NpdHksIHNob3VsZF9wcmludD1GYWxzZSwgY3VycmVudF9nZWFyPUZhbHNlLCBnZWFyX25hbWU9Tm9uZSk6CisgICAgaGlnaF9vbWVnYSA9ICh3aGVlbF92ZWxvY2l0eSAvIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5HX2hpZ2ggLworICAgICAgICAgICAgICAgICAgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLnIpCisgICAgbG93X29tZWdhID0gKHdoZWVsX3ZlbG9jaXR5IC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkdfbG93IC8KKyAgICAgICAgICAgICAgICAgc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLnIpCisgICAgI3ByaW50IGdlYXJfbmFtZSwgIk1vdG9yIEVuZXJneSBEaWZmZXJlbmNlLiIsIDAuNSAqIDAuMDAwMTQwMDMyNjQ3ICogKGxvd19vbWVnYSAqIGxvd19vbWVnYSAtIGhpZ2hfb21lZ2EgKiBoaWdoX29tZWdhKSwgImpvdWxlcyIKKyAgICBoaWdoX3RvcnF1ZSA9ICgoMTIuMCAtIGhpZ2hfb21lZ2EgLyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuS3YpICoKKyAgICAgICAgICAgICAgICAgICBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuS3QgLyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuUikKKyAgICBsb3dfdG9ycXVlID0gKCgxMi4wIC0gbG93X29tZWdhIC8gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkt2KSAqCisgICAgICAgICAgICAgICAgICBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuS3QgLyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuUikKKyAgICBoaWdoX3Bvd2VyID0gaGlnaF90b3JxdWUgKiBoaWdoX29tZWdhCisgICAgbG93X3Bvd2VyID0gbG93X3RvcnF1ZSAqIGxvd19vbWVnYQorICAgICNpZiBzaG91bGRfcHJpbnQ6CisgICAgIyAgcHJpbnQgZ2Vhcl9uYW1lLCAiSGlnaCBvbWVnYSIsIGhpZ2hfb21lZ2EsICJMb3cgb21lZ2EiLCBsb3dfb21lZ2EKKyAgICAjICBwcmludCBnZWFyX25hbWUsICJIaWdoIHRvcnF1ZSIsIGhpZ2hfdG9ycXVlLCAiTG93IHRvcnF1ZSIsIGxvd190b3JxdWUKKyAgICAjICBwcmludCBnZWFyX25hbWUsICJIaWdoIHBvd2VyIiwgaGlnaF9wb3dlciwgIkxvdyBwb3dlciIsIGxvd19wb3dlcgorCisgICAgIyBTaGlmdCBhbGdvcml0aG0gaW1wcm92ZW1lbnRzLgorICAgICMgVE9ETyhhc2NodWgpOgorICAgICMgSXQgdGFrZXMgdGltZSB0byBzaGlmdC4gIFNoaWZ0aW5nIGRvd24gZm9yIDEgY3ljbGUgZG9lc24ndCBtYWtlIHNlbnNlCisgICAgIyBiZWNhdXNlIHlvdSB3aWxsIGVuZCB1cCBzbG93ZXIgdGhhbiB3aXRob3V0IHNoaWZ0aW5nLiAgRmlndXJlIG91dCBob3cKKyAgICAjIHRvIGluY2x1ZGUgdGhhdCBpbmZvLgorICAgICMgSWYgdGhlIGRyaXZlciBpcyBzdGlsbCBpbiBoaWdoIGdlYXIsIGJ1dCBpc24ndCBhc2tpbmcgZm9yIHRoZSBleHRyYSBwb3dlcgorICAgICMgZnJvbSBsb3cgZ2VhciwgZG9uJ3Qgc2hpZnQgdW50aWwgaGUgYXNrcyBmb3IgaXQuCisgICAgZ29hbF9nZWFyX2lzX2hpZ2ggPSBoaWdoX3Bvd2VyID4gbG93X3Bvd2VyCisgICAgI2dvYWxfZ2Vhcl9pc19oaWdoID0gVHJ1ZQorCisgICAgaWYgbm90IHNlbGYuSXNJbkdlYXIoY3VycmVudF9nZWFyKToKKyAgICAgIHByaW50IGdlYXJfbmFtZSwgJ05vdCBpbiBnZWFyLicKKyAgICAgIHJldHVybiBjdXJyZW50X2dlYXIKKyAgICBlbHNlOgorICAgICAgaXNfaGlnaCA9IGN1cnJlbnRfZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSAorICAgICAgaWYgaXNfaGlnaCAhPSBnb2FsX2dlYXJfaXNfaGlnaDoKKyAgICAgICAgaWYgZ29hbF9nZWFyX2lzX2hpZ2g6CisgICAgICAgICAgcHJpbnQgZ2Vhcl9uYW1lLCAnU2hpZnRpbmcgdXAuJworICAgICAgICAgIHJldHVybiBWZWxvY2l0eURyaXZldHJhaW4uU0hJRlRJTkdfVVAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBwcmludCBnZWFyX25hbWUsICdTaGlmdGluZyBkb3duLicKKyAgICAgICAgICByZXR1cm4gVmVsb2NpdHlEcml2ZXRyYWluLlNISUZUSU5HX0RPV04KKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBjdXJyZW50X2dlYXIKKworICBkZWYgRmlsdGVyVmVsb2NpdHkoc2VsZiwgdGhyb3R0bGUpOgorICAgICMgSW52ZXJ0IHRoZSBwbGFudCB0byBmaWd1cmUgb3V0IGhvdyB0aGUgdmVsb2NpdHkgZmlsdGVyIHdvdWxkIGhhdmUgdG8gd29yaworICAgICMgb3V0IGluIG9yZGVyIHRvIGZpbHRlciBvdXQgdGhlIGZvcndhcmRzIG5lZ2F0aXZlIGluZXJ0aWEuCisgICAgIyBUaGlzIG1hdGggYXNzdW1lcyB0aGF0IHRoZSBsZWZ0IGFuZCByaWdodCBwb3dlciBhbmQgdmVsb2NpdHkgYXJlIGVxdWFsLgorCisgICAgIyBUaGUgdGhyb3R0bGUgZmlsdGVyIHNob3VsZCBmaWx0ZXIgc3VjaCB0aGF0IHRoZSBtb3RvciBpbiB0aGUgaGlnaGVzdCBnZWFyCisgICAgIyBzaG91bGQgYmUgY29udHJvbGxpbmcgdGhlIHRpbWUgY29uc3RhbnQuCisgICAgIyBEbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIGluZGV4IG9mIEZGIHRoYXQgaGFzIHRoZSBsb3dlc3QgdmFsdWUsIGFuZCBjb21wdXRpbmcKKyAgICAjIHRoZSBzdW1zIHVzaW5nIHRoYXQgaW5kZXguCisgICAgRkZfc3VtID0gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkZGLnN1bShheGlzPTEpCisgICAgbWluX0ZGX3N1bV9pbmRleCA9IG51bXB5LmFyZ21pbihGRl9zdW0pCisgICAgbWluX0ZGX3N1bSA9IEZGX3N1bVttaW5fRkZfc3VtX2luZGV4LCAwXQorICAgIG1pbl9LX3N1bSA9IHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5LW21pbl9GRl9zdW1faW5kZXgsIDpdLnN1bSgpCisgICAgIyBDb21wdXRlIHRoZSBGRiBzdW0gZm9yIGhpZ2ggZ2Vhci4KKyAgICBoaWdoX21pbl9GRl9zdW0gPSBzZWxmLmRyaXZldHJhaW5faGlnaF9oaWdoLkZGWzAsIDpdLnN1bSgpCisKKyAgICAjIFUgPSBzZWxmLktbMCwgOl0uc3VtKCkgKiAoUiAtIHhfYXZnKSArIHNlbGYuRkZbMCwgOl0uc3VtKCkgKiBSCisgICAgIyB0aHJvdHRsZSAqIDEyLjAgPSAoc2VsZi5LWzAsIDpdLnN1bSgpICsgc2VsZi5GRlswLCA6XS5zdW0oKSkgKiBSCisgICAgIyAgICAgICAgICAgICAgICAgICAtIHNlbGYuS1swLCA6XS5zdW0oKSAqIHhfYXZnCisKKyAgICAjIFIgPSAodGhyb3R0bGUgKiAxMi4wICsgc2VsZi5LWzAsIDpdLnN1bSgpICogeF9hdmcpIC8KKyAgICAjICAgICAoc2VsZi5LWzAsIDpdLnN1bSgpICsgc2VsZi5GRlswLCA6XS5zdW0oKSkKKworICAgICMgVSA9IChLICsgRkYpICogUiAtIEsgKiBYCisgICAgIyAoSyArIEZGKSBeLTEgKiAoVSArIEsgKiBYKSA9IFIKKworICAgICMgU2NhbGUgdGhyb3R0bGUgYnkgbWluX0ZGX3N1bSAvIGhpZ2hfbWluX0ZGX3N1bS4gIFRoaXMgd2lsbCBtYWtlIGxvdyBnZWFyCisgICAgIyBoYXZlIHRoZSBzYW1lIHZlbG9jaXR5IGdvYWwgYXMgaGlnaCBnZWFyLCBhbmQgc28gdGhhdCB0aGUgcm9ib3Qgd2lsbCBob2xkCisgICAgIyB0aGUgc2FtZSBzcGVlZCBmb3IgdGhlIHNhbWUgdGhyb3R0bGUgZm9yIGFsbCBnZWFycy4KKyAgICBhZGp1c3RlZF9mZl92b2x0YWdlID0gbnVtcHkuY2xpcCh0aHJvdHRsZSAqIDEyLjAgKiBtaW5fRkZfc3VtIC8gaGlnaF9taW5fRkZfc3VtLCAtMTIuMCwgMTIuMCkKKyAgICByZXR1cm4gKChhZGp1c3RlZF9mZl92b2x0YWdlICsgc2VsZi50dHJ1c3QgKiBtaW5fS19zdW0gKiAoc2VsZi5YWzAsIDBdICsgc2VsZi5YWzEsIDBdKSAvIDIuMCkKKyAgICAgICAgICAgIC8gKHNlbGYudHRydXN0ICogbWluX0tfc3VtICsgbWluX0ZGX3N1bSkpCisKKyAgZGVmIFVwZGF0ZShzZWxmLCB0aHJvdHRsZSwgc3RlZXJpbmcpOgorICAgICMgU2hpZnQgaW50byB0aGUgZ2VhciB3aGljaCBzZW5kcyB0aGUgbW9zdCBwb3dlciB0byB0aGUgZmxvb3IuCisgICAgIyBUaGlzIGlzIHRoZSBzYW1lIGFzIHNlbmRpbmcgdGhlIG1vc3QgdG9ycXVlIGRvd24gdG8gdGhlIGZsb29yIGF0IHRoZQorICAgICMgd2hlZWwuCisKKyAgICBzZWxmLmxlZnRfZ2VhciA9IHNlbGYucmlnaHRfZ2VhciA9IFRydWUKKyAgICBpZiBGYWxzZToKKyAgICAgIHNlbGYubGVmdF9nZWFyID0gc2VsZi5Db21wdXRlR2VhcihzZWxmLlhbMCwgMF0sIHNob3VsZF9wcmludD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZ2Vhcj1zZWxmLmxlZnRfZ2VhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZWFyX25hbWU9ImxlZnQiKQorICAgICAgc2VsZi5yaWdodF9nZWFyID0gc2VsZi5Db21wdXRlR2VhcihzZWxmLlhbMSwgMF0sIHNob3VsZF9wcmludD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2dlYXI9c2VsZi5yaWdodF9nZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZWFyX25hbWU9InJpZ2h0IikKKyAgICAgIGlmIHNlbGYuSXNJbkdlYXIoc2VsZi5sZWZ0X2dlYXIpOgorICAgICAgICBzZWxmLmxlZnRfY2ltLlhbMCwgMF0gPSBzZWxmLk1vdG9yUlBNKHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uLCBzZWxmLlhbMCwgMF0pCisKKyAgICAgIGlmIHNlbGYuSXNJbkdlYXIoc2VsZi5yaWdodF9nZWFyKToKKyAgICAgICAgc2VsZi5yaWdodF9jaW0uWFswLCAwXSA9IHNlbGYuTW90b3JSUE0oc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uLCBzZWxmLlhbMCwgMF0pCisKKyAgICBzdGVlcmluZyAqPSAyLjMKKyAgICBpZiBUcnVlIG9yIHNlbGYuSXNJbkdlYXIoc2VsZi5sZWZ0X2dlYXIpIGFuZCBzZWxmLklzSW5HZWFyKHNlbGYucmlnaHRfZ2Vhcik6CisgICAgICAjIEZpbHRlciB0aGUgdGhyb3R0bGUgdG8gcHJvdmlkZSBhIG5pY2VyIHJlc3BvbnNlLgorICAgICAgZnZlbCA9IHNlbGYuRmlsdGVyVmVsb2NpdHkodGhyb3R0bGUpCisKKyAgICAgICMgQ29uc3RhbnQgcmFkaXVzIG1lYW5zIHRoYXQgYW5ndWFsYXJfdmVsb2NpdHkgLyBsaW5lYXJfdmVsb2NpdHkgPSBjb25zdGFudC4KKyAgICAgICMgQ29tcHV0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgdmVsb2NpdGllcy4KKyAgICAgIHN0ZWVyaW5nX3ZlbG9jaXR5ID0gbnVtcHkuYWJzKGZ2ZWwpICogc3RlZXJpbmcKKyAgICAgIGxlZnRfdmVsb2NpdHkgPSBmdmVsIC0gc3RlZXJpbmdfdmVsb2NpdHkKKyAgICAgIHJpZ2h0X3ZlbG9jaXR5ID0gZnZlbCArIHN0ZWVyaW5nX3ZlbG9jaXR5CisKKyAgICAgICMgV3JpdGUgdGhpcyBjb25zdHJhaW50IGluIHRoZSBmb3JtIG9mIEsgKiBSID0gdworICAgICAgIyBhbmd1bGFyIHZlbG9jaXR5IC8gbGluZWFyIHZlbG9jaXR5ID0gY29uc3RhbnQKKyAgICAgICMgKGxlZnQgLSByaWdodCkgLyAobGVmdCArIHJpZ2h0KSA9IGNvbnN0YW50CisgICAgICAjIGxlZnQgLSByaWdodCA9IGNvbnN0YW50ICogbGVmdCArIGNvbnN0YW50ICogcmlnaHQKKworICAgICAgIyAoZnZlbCAtIHN0ZWVyaW5nICogbnVtcHkuYWJzKGZ2ZWwpIC0gZnZlbCAtIHN0ZWVyaW5nICogbnVtcHkuYWJzKGZ2ZWwpKSAvCisgICAgICAjICAoZnZlbCAtIHN0ZWVyaW5nICogbnVtcHkuYWJzKGZ2ZWwpICsgZnZlbCArIHN0ZWVyaW5nICogbnVtcHkuYWJzKGZ2ZWwpKSA9CisgICAgICAjICAgICAgIGNvbnN0YW50CisgICAgICAjICgtIDIgKiBzdGVlcmluZyAqIG51bXB5LmFicyhmdmVsKSkgLyAoMiAqIGZ2ZWwpID0gY29uc3RhbnQKKyAgICAgICMgKC1zdGVlcmluZyAqIHNpZ24oZnZlbCkpID0gY29uc3RhbnQKKyAgICAgICMgKC1zdGVlcmluZyAqIHNpZ24oZnZlbCkpICogKGxlZnQgKyByaWdodCkgPSBsZWZ0IC0gcmlnaHQKKyAgICAgICMgKHN0ZWVyaW5nICogc2lnbihmdmVsKSArIDEpICogbGVmdCArIChzdGVlcmluZyAqIHNpZ24oZnZlbCkgLSAxKSAqIHJpZ2h0ID0gMAorCisgICAgICBlcXVhbGl0eV9rID0gbnVtcHkubWF0cml4KAorICAgICAgICAgIFtbMSArIHN0ZWVyaW5nICogbnVtcHkuc2lnbihmdmVsKSwgLSgxIC0gc3RlZXJpbmcgKiBudW1weS5zaWduKGZ2ZWwpKV1dKQorICAgICAgZXF1YWxpdHlfdyA9IDAuMAorCisgICAgICBzZWxmLlJbMCwgMF0gPSBsZWZ0X3ZlbG9jaXR5CisgICAgICBzZWxmLlJbMSwgMF0gPSByaWdodF92ZWxvY2l0eQorCisgICAgICAjIENvbnN0cnVjdCBhIGNvbnN0cmFpbnQgb24gUiBieSBtYW5pcHVsYXRpbmcgdGhlIGNvbnN0cmFpbnQgb24gVQorICAgICAgIyBTdGFydCBvdXQgd2l0aCBIICogVSA8PSBrCisgICAgICAjIFUgPSBGRiAqIFIgKyBLICogKFIgLSBYKQorICAgICAgIyBIICogKEZGICogUiArIEsgKiBSIC0gSyAqIFgpIDw9IGsKKyAgICAgICMgSCAqIChGRiArIEspICogUiA8PSBrICsgSCAqIEsgKiBYCisgICAgICBSX3BvbHkgPSBwb2x5dG9wZS5IUG9seXRvcGUoCisgICAgICAgICAgc2VsZi5VX3BvbHkuSCAqIChzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuSyArIHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5GRiksCisgICAgICAgICAgc2VsZi5VX3BvbHkuayArIHNlbGYuVV9wb2x5LkggKiBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuSyAqIHNlbGYuWCkKKworICAgICAgIyBMaW1pdCBSIGJhY2sgaW5zaWRlIHRoZSBib3guCisgICAgICBzZWxmLmJveGVkX1IgPSBDb2VyY2VHb2FsKFJfcG9seSwgZXF1YWxpdHlfaywgZXF1YWxpdHlfdywgc2VsZi5SKQorCisgICAgICBGRl92b2x0cyA9IHNlbGYuQ3VycmVudERyaXZldHJhaW4oKS5GRiAqIHNlbGYuYm94ZWRfUgorICAgICAgc2VsZi5VX2lkZWFsID0gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLksgKiAoc2VsZi5ib3hlZF9SIC0gc2VsZi5YKSArIEZGX3ZvbHRzCisgICAgZWxzZToKKyAgICAgIHByaW50ICdOb3QgYWxsIGluIGdlYXInCisgICAgICBpZiBub3Qgc2VsZi5Jc0luR2VhcihzZWxmLmxlZnRfZ2VhcikgYW5kIG5vdCBzZWxmLklzSW5HZWFyKHNlbGYucmlnaHRfZ2Vhcik6CisgICAgICAgICMgVE9ETyhhdXN0aW4pOiBVc2UgYmF0dGVyeSB2b2x0cyBoZXJlLgorICAgICAgICBSX2xlZnQgPSBzZWxmLk1vdG9yUlBNKHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uLCBzZWxmLlhbMCwgMF0pCisgICAgICAgIHNlbGYuVV9pZGVhbFswLCAwXSA9IG51bXB5LmNsaXAoCisgICAgICAgICAgICBzZWxmLmxlZnRfY2ltLksgKiAoUl9sZWZ0IC0gc2VsZi5sZWZ0X2NpbS5YKSArIFJfbGVmdCAvIHNlbGYubGVmdF9jaW0uS3YsCisgICAgICAgICAgICBzZWxmLmxlZnRfY2ltLlVfbWluLCBzZWxmLmxlZnRfY2ltLlVfbWF4KQorICAgICAgICBzZWxmLmxlZnRfY2ltLlVwZGF0ZShzZWxmLlVfaWRlYWxbMCwgMF0pCisKKyAgICAgICAgUl9yaWdodCA9IHNlbGYuTW90b3JSUE0oc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uLCBzZWxmLlhbMSwgMF0pCisgICAgICAgIHNlbGYuVV9pZGVhbFsxLCAwXSA9IG51bXB5LmNsaXAoCisgICAgICAgICAgICBzZWxmLnJpZ2h0X2NpbS5LICogKFJfcmlnaHQgLSBzZWxmLnJpZ2h0X2NpbS5YKSArIFJfcmlnaHQgLyBzZWxmLnJpZ2h0X2NpbS5LdiwKKyAgICAgICAgICAgIHNlbGYucmlnaHRfY2ltLlVfbWluLCBzZWxmLnJpZ2h0X2NpbS5VX21heCkKKyAgICAgICAgc2VsZi5yaWdodF9jaW0uVXBkYXRlKHNlbGYuVV9pZGVhbFsxLCAwXSkKKyAgICAgIGVsc2U6CisgICAgICAgIGFzc2VydCBGYWxzZQorCisgICAgc2VsZi5VID0gbnVtcHkuY2xpcChzZWxmLlVfaWRlYWwsIHNlbGYuVV9taW4sIHNlbGYuVV9tYXgpCisKKyAgICAjIFRPRE8oYXVzdGluKTogTW9kZWwgdGhlIHJvYm90IGFzIG5vdCBhY2NlbGVyYXRpbmcgd2hlbiB5b3Ugc2hpZnQuLi4KKyAgICAjIFRoaXMgaGFjayBvbmx5IHdvcmtzIHdoZW4geW91IHNoaWZ0IGF0IHRoZSBzYW1lIHRpbWUuCisgICAgaWYgVHJ1ZSBvciBzZWxmLklzSW5HZWFyKHNlbGYubGVmdF9nZWFyKSBhbmQgc2VsZi5Jc0luR2VhcihzZWxmLnJpZ2h0X2dlYXIpOgorICAgICAgc2VsZi5YID0gc2VsZi5DdXJyZW50RHJpdmV0cmFpbigpLkEgKiBzZWxmLlggKyBzZWxmLkN1cnJlbnREcml2ZXRyYWluKCkuQiAqIHNlbGYuVQorCisgICAgc2VsZi5sZWZ0X2dlYXIsIHNlbGYubGVmdF9zaGlmdGVyX3Bvc2l0aW9uID0gc2VsZi5TaW1TaGlmdGVyKAorICAgICAgICBzZWxmLmxlZnRfZ2Vhciwgc2VsZi5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24pCisgICAgc2VsZi5yaWdodF9nZWFyLCBzZWxmLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPSBzZWxmLlNpbVNoaWZ0ZXIoCisgICAgICAgIHNlbGYucmlnaHRfZ2Vhciwgc2VsZi5yaWdodF9zaGlmdGVyX3Bvc2l0aW9uKQorCisgICAgcHJpbnQgIlUgaXMiLCBzZWxmLlVbMCwgMF0sIHNlbGYuVVsxLCAwXQorICAgIHByaW50ICJMZWZ0IHNoaWZ0ZXIiLCBzZWxmLmxlZnRfZ2Vhciwgc2VsZi5sZWZ0X3NoaWZ0ZXJfcG9zaXRpb24sICJSaWdodCBzaGlmdGVyIiwgc2VsZi5yaWdodF9nZWFyLCBzZWxmLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24KKworCitkZWYgbWFpbihhcmd2KToKKyAgdmRyaXZldHJhaW4gPSBWZWxvY2l0eURyaXZldHJhaW4oKQorCisgIGlmIGxlbihhcmd2KSAhPSA3OgorICAgIHByaW50ICJFeHBlY3RlZCAuaCBmaWxlIG5hbWUgYW5kIC5jYyBmaWxlIG5hbWUiCisgIGVsc2U6CisgICAgZG9nX2xvb3Bfd3JpdGVyID0gY29udHJvbF9sb29wLkNvbnRyb2xMb29wV3JpdGVyKAorICAgICAgICAiVmVsb2NpdHlEcml2ZXRyYWluIiwgW3Zkcml2ZXRyYWluLmRyaXZldHJhaW5fbG93X2xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgdmRyaXZldHJhaW4uZHJpdmV0cmFpbl9sb3dfaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgdmRyaXZldHJhaW4uZHJpdmV0cmFpbl9oaWdoX2xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgdmRyaXZldHJhaW4uZHJpdmV0cmFpbl9oaWdoX2hpZ2hdKQorCisgICAgaWYgYXJndlsxXVstMzpdID09ICcuY2MnOgorICAgICAgZG9nX2xvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMl0sIGFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgIGRvZ19sb29wX3dyaXRlci5Xcml0ZShhcmd2WzFdLCBhcmd2WzJdKQorCisgICAgY2ltX3dyaXRlciA9IGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcFdyaXRlcigKKyAgICAgICAgIkNJTSIsIFtkcml2ZXRyYWluLkNJTSgpXSkKKworICAgIGlmIGFyZ3ZbNV1bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGNpbV93cml0ZXIuV3JpdGUoYXJndls2XSwgYXJndls1XSkKKyAgICBlbHNlOgorICAgICAgY2ltX3dyaXRlci5Xcml0ZShhcmd2WzVdLCBhcmd2WzZdKQorICAgIHJldHVybgorCisgIHZsX3Bsb3QgPSBbXQorICB2cl9wbG90ID0gW10KKyAgdWxfcGxvdCA9IFtdCisgIHVyX3Bsb3QgPSBbXQorICByYWRpdXNfcGxvdCA9IFtdCisgIHRfcGxvdCA9IFtdCisgIGxlZnRfZ2Vhcl9wbG90ID0gW10KKyAgcmlnaHRfZ2Vhcl9wbG90ID0gW10KKyAgdmRyaXZldHJhaW4ubGVmdF9zaGlmdGVyX3Bvc2l0aW9uID0gMC4wCisgIHZkcml2ZXRyYWluLnJpZ2h0X3NoaWZ0ZXJfcG9zaXRpb24gPSAwLjAKKyAgdmRyaXZldHJhaW4ubGVmdF9nZWFyID0gVmVsb2NpdHlEcml2ZXRyYWluLkxPVworICB2ZHJpdmV0cmFpbi5yaWdodF9nZWFyID0gVmVsb2NpdHlEcml2ZXRyYWluLkxPVworCisgIHByaW50ICJLIGlzIiwgdmRyaXZldHJhaW4uQ3VycmVudERyaXZldHJhaW4oKS5LCisKKyAgaWYgdmRyaXZldHJhaW4ubGVmdF9nZWFyIGlzIFZlbG9jaXR5RHJpdmV0cmFpbi5ISUdIOgorICAgIHByaW50ICJMZWZ0IGlzIGhpZ2giCisgIGVsc2U6CisgICAgcHJpbnQgIkxlZnQgaXMgbG93IgorICBpZiB2ZHJpdmV0cmFpbi5yaWdodF9nZWFyIGlzIFZlbG9jaXR5RHJpdmV0cmFpbi5ISUdIOgorICAgIHByaW50ICJSaWdodCBpcyBoaWdoIgorICBlbHNlOgorICAgIHByaW50ICJSaWdodCBpcyBsb3ciCisKKyAgZm9yIHQgaW4gbnVtcHkuYXJhbmdlKDAsIDEuNywgdmRyaXZldHJhaW4uZHQpOgorICAgIGlmIHQgPCAwLjU6CisgICAgICB2ZHJpdmV0cmFpbi5VcGRhdGUodGhyb3R0bGU9MC4wMCwgc3RlZXJpbmc9MS4wKQorICAgIGVsaWYgdCA8IDEuMjoKKyAgICAgIHZkcml2ZXRyYWluLlVwZGF0ZSh0aHJvdHRsZT0wLjUsIHN0ZWVyaW5nPTEuMCkKKyAgICBlbHNlOgorICAgICAgdmRyaXZldHJhaW4uVXBkYXRlKHRocm90dGxlPTAuMDAsIHN0ZWVyaW5nPTEuMCkKKyAgICB0X3Bsb3QuYXBwZW5kKHQpCisgICAgdmxfcGxvdC5hcHBlbmQodmRyaXZldHJhaW4uWFswLCAwXSkKKyAgICB2cl9wbG90LmFwcGVuZCh2ZHJpdmV0cmFpbi5YWzEsIDBdKQorICAgIHVsX3Bsb3QuYXBwZW5kKHZkcml2ZXRyYWluLlVbMCwgMF0pCisgICAgdXJfcGxvdC5hcHBlbmQodmRyaXZldHJhaW4uVVsxLCAwXSkKKyAgICBsZWZ0X2dlYXJfcGxvdC5hcHBlbmQoKHZkcml2ZXRyYWluLmxlZnRfZ2VhciBpcyBWZWxvY2l0eURyaXZldHJhaW4uSElHSCkgKiAyLjAgLSAxMC4wKQorICAgIHJpZ2h0X2dlYXJfcGxvdC5hcHBlbmQoKHZkcml2ZXRyYWluLnJpZ2h0X2dlYXIgaXMgVmVsb2NpdHlEcml2ZXRyYWluLkhJR0gpICogMi4wIC0gMTAuMCkKKworICAgIGZ3ZF92ZWxvY2l0eSA9ICh2ZHJpdmV0cmFpbi5YWzEsIDBdICsgdmRyaXZldHJhaW4uWFswLCAwXSkgLyAyCisgICAgdHVybl92ZWxvY2l0eSA9ICh2ZHJpdmV0cmFpbi5YWzEsIDBdIC0gdmRyaXZldHJhaW4uWFswLCAwXSkKKyAgICBpZiBhYnMoZndkX3ZlbG9jaXR5KSA8IDAuMDAwMDAwMToKKyAgICAgIHJhZGl1c19wbG90LmFwcGVuZCh0dXJuX3ZlbG9jaXR5KQorICAgIGVsc2U6CisgICAgICByYWRpdXNfcGxvdC5hcHBlbmQodHVybl92ZWxvY2l0eSAvIGZ3ZF92ZWxvY2l0eSkKKworICBjaW1fdmVsb2NpdHlfcGxvdCA9IFtdCisgIGNpbV92b2x0YWdlX3Bsb3QgPSBbXQorICBjaW1fdGltZSA9IFtdCisgIGNpbSA9IGRyaXZldHJhaW4uQ0lNKCkKKyAgUiA9IG51bXB5Lm1hdHJpeChbWzMwMF1dKQorICBmb3IgdCBpbiBudW1weS5hcmFuZ2UoMCwgMC41LCBjaW0uZHQpOgorICAgIFUgPSBudW1weS5jbGlwKGNpbS5LICogKFIgLSBjaW0uWCkgKyBSIC8gY2ltLkt2LCBjaW0uVV9taW4sIGNpbS5VX21heCkKKyAgICBjaW0uVXBkYXRlKFUpCisgICAgY2ltX3ZlbG9jaXR5X3Bsb3QuYXBwZW5kKGNpbS5YWzAsIDBdKQorICAgIGNpbV92b2x0YWdlX3Bsb3QuYXBwZW5kKFVbMCwgMF0gKiAxMCkKKyAgICBjaW1fdGltZS5hcHBlbmQodCkKKyAgcHlsYWIucGxvdChjaW1fdGltZSwgY2ltX3ZlbG9jaXR5X3Bsb3QsIGxhYmVsPSdjaW0gc3BpbnVwJykKKyAgcHlsYWIucGxvdChjaW1fdGltZSwgY2ltX3ZvbHRhZ2VfcGxvdCwgbGFiZWw9J2NpbSB2b2x0YWdlJykKKyAgcHlsYWIubGVnZW5kKCkKKyAgcHlsYWIuc2hvdygpCisKKyAgIyBUT0RPKGF1c3Rpbik6CisgICMgU2hpZnRpbmcgY29tcGVuc2F0aW9uLgorCisgICMgVGlnaHRlbiB0aGUgdHVybi4KKyAgIyBDbG9zZWQgbG9vcCBkcml2ZS4KKworICBweWxhYi5wbG90KHRfcGxvdCwgdmxfcGxvdCwgbGFiZWw9J2xlZnQgdmVsb2NpdHknKQorICBweWxhYi5wbG90KHRfcGxvdCwgdnJfcGxvdCwgbGFiZWw9J3JpZ2h0IHZlbG9jaXR5JykKKyAgcHlsYWIucGxvdCh0X3Bsb3QsIHVsX3Bsb3QsIGxhYmVsPSdsZWZ0IHZvbHRhZ2UnKQorICBweWxhYi5wbG90KHRfcGxvdCwgdXJfcGxvdCwgbGFiZWw9J3JpZ2h0IHZvbHRhZ2UnKQorICBweWxhYi5wbG90KHRfcGxvdCwgcmFkaXVzX3Bsb3QsIGxhYmVsPSdyYWRpdXMnKQorICBweWxhYi5wbG90KHRfcGxvdCwgbGVmdF9nZWFyX3Bsb3QsIGxhYmVsPSdsZWZ0IGdlYXIgaGlnaCcpCisgIHB5bGFiLnBsb3QodF9wbG90LCByaWdodF9nZWFyX3Bsb3QsIGxhYmVsPSdyaWdodCBnZWFyIGhpZ2gnKQorICBweWxhYi5sZWdlbmQoKQorICBweWxhYi5zaG93KCkKKyAgcmV0dXJuIDAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL3B5dGhvbi9wb2x5ZHJpdmV0cmFpbl90ZXN0LnB5IGIveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vcG9seWRyaXZldHJhaW5fdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzRjZGNhCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vcG9seWRyaXZldHJhaW5fdGVzdC5weQpAQCAtMCwwICsxLDgyIEBACisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgcG9seWRyaXZldHJhaW4KK2ltcG9ydCBudW1weQorZnJvbSBudW1weS50ZXN0aW5nIGltcG9ydCAqCitpbXBvcnQgcG9seXRvcGUKK2ltcG9ydCB1bml0dGVzdAorCitfX2F1dGhvcl9fID0gJ0F1c3RpbiBTY2h1aCAoYXVzdGluLmxpbnV4QGdtYWlsLmNvbSknCisKKworY2xhc3MgVGVzdFZlbG9jaXR5RHJpdmV0cmFpbih1bml0dGVzdC5UZXN0Q2FzZSk6CisgIGRlZiBNYWtlQm94KHNlbGYsIHgxX21pbiwgeDFfbWF4LCB4Ml9taW4sIHgyX21heCk6CisgICAgSCA9IG51bXB5Lm1hdHJpeChbWzEsIDBdLAorICAgICAgICAgICAgICAgICAgICAgIFstMSwgMF0sCisgICAgICAgICAgICAgICAgICAgICAgWzAsIDFdLAorICAgICAgICAgICAgICAgICAgICAgIFswLCAtMV1dKQorICAgIEsgPSBudW1weS5tYXRyaXgoW1t4MV9tYXhdLAorICAgICAgICAgICAgICAgICAgICAgIFsteDFfbWluXSwKKyAgICAgICAgICAgICAgICAgICAgICBbeDJfbWF4XSwKKyAgICAgICAgICAgICAgICAgICAgICBbLXgyX21pbl1dKQorICAgIHJldHVybiBwb2x5dG9wZS5IUG9seXRvcGUoSCwgSykKKworICBkZWYgdGVzdF9jb2VyY2VfaW5zaWRlKHNlbGYpOgorICAgICIiIlRlc3RzIGNvZXJjaW9uIHdoZW4gdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgYm94LiIiIgorICAgIGJveCA9IHNlbGYuTWFrZUJveCgxLCAyLCAxLCAyKQorCisgICAgIyB4MSA9IHgyCisgICAgSyA9IG51bXB5Lm1hdHJpeChbWzEsIC0xXV0pCisgICAgdyA9IDAKKworICAgIGFzc2VydF9hcnJheV9lcXVhbChwb2x5ZHJpdmV0cmFpbi5Db2VyY2VHb2FsKGJveCwgSywgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1weS5tYXRyaXgoW1sxLjVdLCBbMS41XV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtcHkubWF0cml4KFtbMS41XSwgWzEuNV1dKSkKKworICBkZWYgdGVzdF9jb2VyY2Vfb3V0c2lkZV9pbnRlcnNlY3Qoc2VsZik6CisgICAgIiIiVGVzdHMgY29lcmNpb24gd2hlbiB0aGUgbGluZSBpbnRlcnNlY3RzIHRoZSBib3guIiIiCisgICAgYm94ID0gc2VsZi5NYWtlQm94KDEsIDIsIDEsIDIpCisKKyAgICAjIHgxID0geDIKKyAgICBLID0gbnVtcHkubWF0cml4KFtbMSwgLTFdXSkKKyAgICB3ID0gMAorCisgICAgYXNzZXJ0X2FycmF5X2VxdWFsKHBvbHlkcml2ZXRyYWluLkNvZXJjZUdvYWwoYm94LCBLLCB3LCBudW1weS5tYXRyaXgoW1s1XSwgWzVdXSkpLAorICAgICAgICAgICAgICAgICAgICAgICBudW1weS5tYXRyaXgoW1syLjBdLCBbMi4wXV0pKQorCisgIGRlZiB0ZXN0X2NvZXJjZV9vdXRzaWRlX25vX2ludGVyc2VjdChzZWxmKToKKyAgICAiIiJUZXN0cyBjb2VyY2lvbiB3aGVuIHRoZSBsaW5lIGRvZXMgbm90IGludGVyc2VjdCB0aGUgYm94LiIiIgorICAgIGJveCA9IHNlbGYuTWFrZUJveCgzLCA0LCAxLCAyKQorCisgICAgIyB4MSA9IHgyCisgICAgSyA9IG51bXB5Lm1hdHJpeChbWzEsIC0xXV0pCisgICAgdyA9IDAKKworICAgIGFzc2VydF9hcnJheV9lcXVhbChwb2x5ZHJpdmV0cmFpbi5Db2VyY2VHb2FsKGJveCwgSywgdywgbnVtcHkubWF0cml4KFtbNV0sIFs1XV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtcHkubWF0cml4KFtbMy4wXSwgWzIuMF1dKSkKKworICBkZWYgdGVzdF9jb2VyY2VfbWlkZGxlX29mX2VkZ2Uoc2VsZik6CisgICAgIiIiVGVzdHMgY29lcmNpb24gd2hlbiB0aGUgbGluZSBpbnRlcnNlY3RzIHRoZSBtaWRkbGUgb2YgYW4gZWRnZS4iIiIKKyAgICBib3ggPSBzZWxmLk1ha2VCb3goMCwgNCwgMSwgMikKKworICAgICMgeDEgPSB4MgorICAgIEsgPSBudW1weS5tYXRyaXgoW1stMSwgMV1dKQorICAgIHcgPSAwCisKKyAgICBhc3NlcnRfYXJyYXlfZXF1YWwocG9seWRyaXZldHJhaW4uQ29lcmNlR29hbChib3gsIEssIHcsIG51bXB5Lm1hdHJpeChbWzVdLCBbNV1dKSksCisgICAgICAgICAgICAgICAgICAgICAgIG51bXB5Lm1hdHJpeChbWzIuMF0sIFsyLjBdXSkpCisKKyAgZGVmIHRlc3RfY29lcmNlX3BlcnBlbmRpY3VsYXJfbGluZShzZWxmKToKKyAgICAiIiJUZXN0cyBjb2VyY2lvbiB3aGVuIHRoZSBsaW5lIGRvZXMgbm90IGludGVyc2VjdCBhbmQgaXMgaW4gcXVhZHJhbnQgMi4iIiIKKyAgICBib3ggPSBzZWxmLk1ha2VCb3goMSwgMiwgMSwgMikKKworICAgICMgeDEgPSAteDIKKyAgICBLID0gbnVtcHkubWF0cml4KFtbMSwgMV1dKQorICAgIHcgPSAwCisKKyAgICBhc3NlcnRfYXJyYXlfZXF1YWwocG9seWRyaXZldHJhaW4uQ29lcmNlR29hbChib3gsIEssIHcsIG51bXB5Lm1hdHJpeChbWzVdLCBbNV1dKSksCisgICAgICAgICAgICAgICAgICAgICAgIG51bXB5Lm1hdHJpeChbWzEuMF0sIFsxLjBdXSkpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS95MjAxNS9jb250cm9sX2xvb3BzL3B5dGhvbi9zaG9vdGVyLnB5IGIveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vc2hvb3Rlci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OWYyNTk5Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy9weXRob24vc2hvb3Rlci5weQpAQCAtMCwwICsxLDI1NCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IGNvbnRyb2xfbG9vcAoraW1wb3J0IG51bXB5CitpbXBvcnQgc3lzCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCisKK2NsYXNzIFNwcnVuZ1Nob290ZXIoY29udHJvbF9sb29wLkNvbnRyb2xMb29wKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IlJhd1NwcnVuZ1Nob290ZXIiKToKKyAgICBzdXBlcihTcHJ1bmdTaG9vdGVyLCBzZWxmKS5fX2luaXRfXyhuYW1lKQorICAgICMgU3RhbGwgVG9ycXVlIGluIE4gbQorICAgIHNlbGYuc3RhbGxfdG9ycXVlID0gLjQ5ODIKKyAgICAjIFN0YWxsIEN1cnJlbnQgaW4gQW1wcworICAgIHNlbGYuc3RhbGxfY3VycmVudCA9IDg1CisgICAgIyBGcmVlIFNwZWVkIGluIFJQTQorICAgIHNlbGYuZnJlZV9zcGVlZCA9IDE5MzAwLjAKKyAgICAjIEZyZWUgQ3VycmVudCBpbiBBbXBzCisgICAgc2VsZi5mcmVlX2N1cnJlbnQgPSAxLjIKKyAgICAjIEVmZmVjdGl2ZSBtYXNzIG9mIHRoZSBzaG9vdGVyIGluIGtnLgorICAgICMgVGhpcyByb3VnaCBlc3RpbWF0ZSBzaG91bGQgYWJvdXQgaW5jbHVkZSB0aGUgZWZmZWN0IG9mIHRoZSBtYXNzZXMKKyAgICAjIG9mIHRoZSBnZWFycy4gSWYgdGhpcyBudW1iZXIgaXMgdG9vIGxvdywgdGhlIGVpZ2VuIHZhbHVlcyBvZiBzZWxmLkEKKyAgICAjIHdpbGwgc3RhcnQgdG8gYmVjb21lIGV4dHJlbWVseSBzbWFsbC4KKyAgICBzZWxmLkogPSAyMDAKKyAgICAjIFJlc2lzdGFuY2Ugb2YgdGhlIG1vdG9yLCBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgbW90b3JzLgorICAgIHNlbGYuUiA9IDEyLjAgLyBzZWxmLnN0YWxsX2N1cnJlbnQgLyAyLjAKKyAgICAjIE1vdG9yIHZlbG9jaXR5IGNvbnN0YW50CisgICAgc2VsZi5LdiA9ICgoc2VsZi5mcmVlX3NwZWVkIC8gNjAuMCAqIDIuMCAqIG51bXB5LnBpKSAvCisgICAgICAgICAgICAgICAoMTIuMCAtIHNlbGYuUiAqIHNlbGYuZnJlZV9jdXJyZW50KSkKKyAgICAjIFRvcnF1ZSBjb25zdGFudAorICAgIHNlbGYuS3QgPSBzZWxmLnN0YWxsX3RvcnF1ZSAvIHNlbGYuc3RhbGxfY3VycmVudAorICAgICMgU3ByaW5nIGNvbnN0YW50IGZvciB0aGUgc3ByaW5ncywgTi9tCisgICAgc2VsZi5LcyA9IDI4MDAuMAorICAgICMgTWF4aW11bSBleHRlbnNpb24gZGlzdGFuY2UgKERpc3RhbmNlIGZyb20gdGhlIDAgZm9yY2UgcG9pbnQgb24gdGhlCisgICAgIyBzcHJpbmcgdG8gdGhlIGxhdGNoIHBvc2l0aW9uLikKKyAgICBzZWxmLm1heF9leHRlbnNpb24gPSAwLjMyMzg1CisgICAgIyBHZWFyIHJhdGlvIG11bHRpcGxpZWQgYnkgcmFkaXVzIG9mIGZpbmFsIHNwcm9ja2V0LgorICAgIHNlbGYuRyA9IDEwLjAgLyA0MC4wICogMjAuMCAvIDU0LjAgKiAyNC4wIC8gNTQuMCAqIDIwLjAgLyA4NC4wICogMTYuMCAqICgzLjAgLyA4LjApIC8gKDIuMCAqIG51bXB5LnBpKSAqIDAuMDI1NAorCisgICAgIyBDb250cm9sIGxvb3AgdGltZSBzdGVwCisgICAgc2VsZi5kdCA9IDAuMDEKKworICAgICMgU3RhdGUgZmVlZGJhY2sgbWF0cmljZXMKKyAgICBzZWxmLkFfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLCAxXSwKKyAgICAgICAgIFstc2VsZi5LcyAvIHNlbGYuSiwKKyAgICAgICAgICAtc2VsZi5LdCAvIHNlbGYuS3YgLyAoc2VsZi5KICogc2VsZi5HICogc2VsZi5HICogc2VsZi5SKV1dKQorICAgIHNlbGYuQl9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzBdLAorICAgICAgICAgW3NlbGYuS3QgLyAoc2VsZi5KICogc2VsZi5HICogc2VsZi5SKV1dKQorICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEsIDBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swXV0pCisKKyAgICBzZWxmLkEsIHNlbGYuQiA9IHNlbGYuQ29udGludW91c1RvRGlzY3JldGUoCisgICAgICAgIHNlbGYuQV9jb250aW51b3VzLCBzZWxmLkJfY29udGludW91cywgc2VsZi5kdCkKKworICAgIHNlbGYuUGxhY2VDb250cm9sbGVyUG9sZXMoWzAuNDUsIDAuNDVdKQorCisgICAgc2VsZi5ycGwgPSAuMDUKKyAgICBzZWxmLmlwbCA9IDAuMDA4CisgICAgc2VsZi5QbGFjZU9ic2VydmVyUG9sZXMoW3NlbGYucnBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJwbF0pCisKKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KFtbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoW1stMTIuMF1dKQorCisgICAgc2VsZi5Jbml0aWFsaXplU3RhdGUoKQorCisKK2NsYXNzIFNob290ZXIoU3BydW5nU2hvb3Rlcik6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSJSYXdTaG9vdGVyIik6CisgICAgc3VwZXIoU2hvb3Rlciwgc2VsZikuX19pbml0X18obmFtZSkKKworICAgICMgU3RhdGUgZmVlZGJhY2sgbWF0cmljZXMKKyAgICBzZWxmLkFfY29udGludW91cyA9IG51bXB5Lm1hdHJpeCgKKyAgICAgICAgW1swLCAxXSwKKyAgICAgICAgIFswLCAtc2VsZi5LdCAvIHNlbGYuS3YgLyAoc2VsZi5KICogc2VsZi5HICogc2VsZi5HICogc2VsZi5SKV1dKQorICAgIHNlbGYuQl9jb250aW51b3VzID0gbnVtcHkubWF0cml4KAorICAgICAgICBbWzBdLAorICAgICAgICAgW3NlbGYuS3QgLyAoc2VsZi5KICogc2VsZi5HICogc2VsZi5SKV1dKQorCisgICAgc2VsZi5BLCBzZWxmLkIgPSBzZWxmLkNvbnRpbnVvdXNUb0Rpc2NyZXRlKAorICAgICAgICBzZWxmLkFfY29udGludW91cywgc2VsZi5CX2NvbnRpbnVvdXMsIHNlbGYuZHQpCisKKyAgICBzZWxmLlBsYWNlQ29udHJvbGxlclBvbGVzKFswLjQ1LCAwLjQ1XSkKKworICAgIHNlbGYucnBsID0gLjA1CisgICAgc2VsZi5pcGwgPSAwLjAwOAorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLnJwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGxdKQorCisgICAgc2VsZi5VX21heCA9IG51bXB5Lm1hdHJpeChbWzEyLjBdXSkKKyAgICBzZWxmLlVfbWluID0gbnVtcHkubWF0cml4KFtbLTEyLjBdXSkKKworICAgIHNlbGYuSW5pdGlhbGl6ZVN0YXRlKCkKKworCitjbGFzcyBTcHJ1bmdTaG9vdGVyRGVsdGFVKFNwcnVuZ1Nob290ZXIpOgorICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iU3BydW5nU2hvb3RlciIpOgorICAgIHN1cGVyKFNwcnVuZ1Nob290ZXJEZWx0YVUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCisgICAgQV91bmF1Z21lbnRlZCA9IHNlbGYuQQorICAgIEJfdW5hdWdtZW50ZWQgPSBzZWxmLkIKKworICAgIHNlbGYuQSA9IG51bXB5Lm1hdHJpeChbWzAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAwLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAuMCwgMC4wLCAxLjBdXSkKKyAgICBzZWxmLkFbMDoyLCAwOjJdID0gQV91bmF1Z21lbnRlZAorICAgIHNlbGYuQVswOjIsIDJdID0gQl91bmF1Z21lbnRlZAorCisgICAgc2VsZi5CID0gbnVtcHkubWF0cml4KFtbMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEuMF1dKQorCisgICAgc2VsZi5DID0gbnVtcHkubWF0cml4KFtbMS4wLCAwLjAsIDAuMF1dKQorICAgIHNlbGYuRCA9IG51bXB5Lm1hdHJpeChbWzAuMF1dKQorCisgICAgc2VsZi5QbGFjZUNvbnRyb2xsZXJQb2xlcyhbMC41MCwgMC4zNSwgMC44MF0pCisKKyAgICBwcmludCAiSyIKKyAgICBwcmludCBzZWxmLksKKyAgICBwcmludCAiUGxhY2VkIGNvbnRyb2xsZXIgcG9sZXMgYXJlIgorICAgIHByaW50IG51bXB5LmxpbmFsZy5laWcoc2VsZi5BIC0gc2VsZi5CICogc2VsZi5LKVswXQorCisgICAgc2VsZi5ycGwgPSAuMDUKKyAgICBzZWxmLmlwbCA9IDAuMDA4CisgICAgc2VsZi5QbGFjZU9ic2VydmVyUG9sZXMoW3NlbGYucnBsICsgMWogKiBzZWxmLmlwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycGwgLSAxaiAqIHNlbGYuaXBsLCAwLjkwXSkKKyAgICBwcmludCAiUGxhY2VkIG9ic2VydmVyIHBvbGVzIGFyZSIKKyAgICBwcmludCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuTCAqIHNlbGYuQylbMF0KKworICAgIHNlbGYuVV9tYXggPSBudW1weS5tYXRyaXgoW1sxMi4wXV0pCisgICAgc2VsZi5VX21pbiA9IG51bXB5Lm1hdHJpeChbWy0xMi4wXV0pCisKKyAgICBzZWxmLkluaXRpYWxpemVTdGF0ZSgpCisKKworY2xhc3MgU2hvb3RlckRlbHRhVShTaG9vdGVyKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IlNob290ZXIiKToKKyAgICBzdXBlcihTaG9vdGVyRGVsdGFVLCBzZWxmKS5fX2luaXRfXyhuYW1lKQorICAgIEFfdW5hdWdtZW50ZWQgPSBzZWxmLkEKKyAgICBCX3VuYXVnbWVudGVkID0gc2VsZi5CCisKKyAgICBzZWxmLkEgPSBudW1weS5tYXRyaXgoW1swLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLjAsIDAuMCwgMS4wXV0pCisgICAgc2VsZi5BWzA6MiwgMDoyXSA9IEFfdW5hdWdtZW50ZWQKKyAgICBzZWxmLkFbMDoyLCAyXSA9IEJfdW5hdWdtZW50ZWQKKworICAgIHNlbGYuQiA9IG51bXB5Lm1hdHJpeChbWzAuMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC4wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLjBdXSkKKworICAgIHNlbGYuQyA9IG51bXB5Lm1hdHJpeChbWzEuMCwgMC4wLCAwLjBdXSkKKyAgICBzZWxmLkQgPSBudW1weS5tYXRyaXgoW1swLjBdXSkKKworICAgIHNlbGYuUGxhY2VDb250cm9sbGVyUG9sZXMoWzAuNTUsIDAuNDUsIDAuODBdKQorCisgICAgcHJpbnQgIksiCisgICAgcHJpbnQgc2VsZi5LCisgICAgcHJpbnQgIlBsYWNlZCBjb250cm9sbGVyIHBvbGVzIGFyZSIKKyAgICBwcmludCBudW1weS5saW5hbGcuZWlnKHNlbGYuQSAtIHNlbGYuQiAqIHNlbGYuSylbMF0KKworICAgIHNlbGYucnBsID0gLjA1CisgICAgc2VsZi5pcGwgPSAwLjAwOAorICAgIHNlbGYuUGxhY2VPYnNlcnZlclBvbGVzKFtzZWxmLnJwbCArIDFqICogc2VsZi5pcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnBsIC0gMWogKiBzZWxmLmlwbCwgMC45MF0pCisgICAgcHJpbnQgIlBsYWNlZCBvYnNlcnZlciBwb2xlcyBhcmUiCisgICAgcHJpbnQgbnVtcHkubGluYWxnLmVpZyhzZWxmLkEgLSBzZWxmLkwgKiBzZWxmLkMpWzBdCisKKyAgICBzZWxmLlVfbWF4ID0gbnVtcHkubWF0cml4KFtbMTIuMF1dKQorICAgIHNlbGYuVV9taW4gPSBudW1weS5tYXRyaXgoW1stMTIuMF1dKQorCisgICAgc2VsZi5Jbml0aWFsaXplU3RhdGUoKQorCisKK2RlZiBDbGlwRGVsdGFVKHNob290ZXIsIG9sZF92b2x0YWdlLCBkZWx0YV91KToKKyAgb2xkX3UgPSBvbGRfdm9sdGFnZQorICBuZXdfdSA9IG51bXB5LmNsaXAob2xkX3UgKyBkZWx0YV91LCBzaG9vdGVyLlVfbWluLCBzaG9vdGVyLlVfbWF4KQorICByZXR1cm4gbmV3X3UgLSBvbGRfdQorCitkZWYgbWFpbihhcmd2KToKKyAgIyBTaW11bGF0ZSB0aGUgcmVzcG9uc2Ugb2YgdGhlIHN5c3RlbSB0byBhIGdvYWwuCisgIHNwcnVuZ19zaG9vdGVyID0gU3BydW5nU2hvb3RlckRlbHRhVSgpCisgIHJhd19zcHJ1bmdfc2hvb3RlciA9IFNwcnVuZ1Nob290ZXIoKQorICBjbG9zZV9sb29wX3ggPSBbXQorICBjbG9zZV9sb29wX3UgPSBbXQorICBnb2FsX3Bvc2l0aW9uID0gLTAuMworICBSID0gbnVtcHkubWF0cml4KFtbZ29hbF9wb3NpdGlvbl0sIFswLjBdLCBbLXNwcnVuZ19zaG9vdGVyLkFbMSwgMF0gLyBzcHJ1bmdfc2hvb3Rlci5BWzEsIDJdICogZ29hbF9wb3NpdGlvbl1dKQorICB2b2x0YWdlID0gbnVtcHkubWF0cml4KFtbMC4wXV0pCisgIGZvciBfIGluIHhyYW5nZSg1MDApOgorICAgIFUgPSBzcHJ1bmdfc2hvb3Rlci5LICogKFIgLSBzcHJ1bmdfc2hvb3Rlci5YX2hhdCkKKyAgICBVID0gQ2xpcERlbHRhVShzcHJ1bmdfc2hvb3Rlciwgdm9sdGFnZSwgVSkKKyAgICBzcHJ1bmdfc2hvb3Rlci5ZID0gcmF3X3NwcnVuZ19zaG9vdGVyLlkgKyAwLjAxCisgICAgc3BydW5nX3Nob290ZXIuVXBkYXRlT2JzZXJ2ZXIoVSkKKyAgICB2b2x0YWdlICs9IFU7CisgICAgcmF3X3NwcnVuZ19zaG9vdGVyLlVwZGF0ZSh2b2x0YWdlKQorICAgIGNsb3NlX2xvb3BfeC5hcHBlbmQocmF3X3NwcnVuZ19zaG9vdGVyLlhbMCwgMF0gKiAxMCkKKyAgICBjbG9zZV9sb29wX3UuYXBwZW5kKHZvbHRhZ2VbMCwgMF0pCisKKyAgcHlsYWIucGxvdChyYW5nZSg1MDApLCBjbG9zZV9sb29wX3gpCisgIHB5bGFiLnBsb3QocmFuZ2UoNTAwKSwgY2xvc2VfbG9vcF91KQorICBweWxhYi5zaG93KCkKKworICBzaG9vdGVyID0gU2hvb3RlckRlbHRhVSgpCisgIHJhd19zaG9vdGVyID0gU2hvb3RlcigpCisgIGNsb3NlX2xvb3BfeCA9IFtdCisgIGNsb3NlX2xvb3BfdSA9IFtdCisgIGdvYWxfcG9zaXRpb24gPSAtMC4zCisgIFIgPSBudW1weS5tYXRyaXgoW1tnb2FsX3Bvc2l0aW9uXSwgWzAuMF0sIFstc2hvb3Rlci5BWzEsIDBdIC8gc2hvb3Rlci5BWzEsIDJdICogZ29hbF9wb3NpdGlvbl1dKQorICB2b2x0YWdlID0gbnVtcHkubWF0cml4KFtbMC4wXV0pCisgIGZvciBfIGluIHhyYW5nZSg1MDApOgorICAgIFUgPSBzaG9vdGVyLksgKiAoUiAtIHNob290ZXIuWF9oYXQpCisgICAgVSA9IENsaXBEZWx0YVUoc2hvb3Rlciwgdm9sdGFnZSwgVSkKKyAgICBzaG9vdGVyLlkgPSByYXdfc2hvb3Rlci5ZICsgMC4wMQorICAgIHNob290ZXIuVXBkYXRlT2JzZXJ2ZXIoVSkKKyAgICB2b2x0YWdlICs9IFU7CisgICAgcmF3X3Nob290ZXIuVXBkYXRlKHZvbHRhZ2UpCisgICAgY2xvc2VfbG9vcF94LmFwcGVuZChyYXdfc2hvb3Rlci5YWzAsIDBdICogMTApCisgICAgY2xvc2VfbG9vcF91LmFwcGVuZCh2b2x0YWdlWzAsIDBdKQorCisgIHB5bGFiLnBsb3QocmFuZ2UoNTAwKSwgY2xvc2VfbG9vcF94KQorICBweWxhYi5wbG90KHJhbmdlKDUwMCksIGNsb3NlX2xvb3BfdSkKKyAgcHlsYWIuc2hvdygpCisKKyAgIyBXcml0ZSB0aGUgZ2VuZXJhdGVkIGNvbnN0YW50cyBvdXQgdG8gYSBmaWxlLgorICBpZiBsZW4oYXJndikgIT0gNToKKyAgICBwcmludCAiRXhwZWN0ZWQgLmggZmlsZSBuYW1lIGFuZCAuY2MgZmlsZSBuYW1lIGZvciIKKyAgICBwcmludCAiYm90aCB0aGUgcGxhbnQgYW5kIHVuYXVnbWVudGVkIHBsYW50IgorICBlbHNlOgorICAgIHVuYXVnX3NwcnVuZ19zaG9vdGVyID0gU3BydW5nU2hvb3RlcigiUmF3U3BydW5nU2hvb3RlciIpCisgICAgdW5hdWdfc2hvb3RlciA9IFNob290ZXIoIlJhd1Nob290ZXIiKQorICAgIHVuYXVnX2xvb3Bfd3JpdGVyID0gY29udHJvbF9sb29wLkNvbnRyb2xMb29wV3JpdGVyKCJSYXdTaG9vdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdW5hdWdfc3BydW5nX3Nob290ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYXVnX3Nob290ZXJdKQorICAgIGlmIGFyZ3ZbM11bLTM6XSA9PSAnLmNjJzoKKyAgICAgIHVuYXVnX2xvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbNF0sIGFyZ3ZbM10pCisgICAgZWxzZToKKyAgICAgIHVuYXVnX2xvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbM10sIGFyZ3ZbNF0pCisKKyAgICBzcHJ1bmdfc2hvb3RlciA9IFNwcnVuZ1Nob290ZXJEZWx0YVUoKQorICAgIHNob290ZXIgPSBTaG9vdGVyRGVsdGFVKCkKKyAgICBsb29wX3dyaXRlciA9IGNvbnRyb2xfbG9vcC5Db250cm9sTG9vcFdyaXRlcigiU2hvb3RlciIsIFtzcHJ1bmdfc2hvb3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9vdGVyXSkKKworICAgIGxvb3Bfd3JpdGVyLkFkZENvbnN0YW50KGNvbnRyb2xfbG9vcC5Db25zdGFudCgia01heEV4dGVuc2lvbiIsICIlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcnVuZ19zaG9vdGVyLm1heF9leHRlbnNpb24pKQorICAgIGxvb3Bfd3JpdGVyLkFkZENvbnN0YW50KGNvbnRyb2xfbG9vcC5Db25zdGFudCgia1NwcmluZ0NvbnN0YW50IiwgIiVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BydW5nX3Nob290ZXIuS3MpKQorICAgIGlmIGFyZ3ZbMV1bLTM6XSA9PSAnLmNjJzoKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMl0sIGFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgIGxvb3Bfd3JpdGVyLldyaXRlKGFyZ3ZbMV0sIGFyZ3ZbMl0pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy91cGRhdGVfYXJtLnNoIGIveTIwMTUvY29udHJvbF9sb29wcy91cGRhdGVfYXJtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhMTBmOTMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL3VwZGF0ZV9hcm0uc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVXBkYXRlcyB0aGUgYXJtIGNvbnRyb2xsZXJzIChmb3IgYm90aCByb2JvdHMpLgorCitjZCAkKGRpcm5hbWUgJDApCisKK2V4cG9ydCBQWVRIT05QQVRIPS4uLy4uL2ZyYzk3MS9jb250cm9sX2xvb3BzL3B5dGhvbgorCisuL3B5dGhvbi9hcm0ucHkgZnJpZGdlL2FybV9tb3Rvcl9wbGFudC5jYyBcCisgICAgZnJpZGdlL2FybV9tb3Rvcl9wbGFudC5oIFwKKyAgICBmcmlkZ2UvaW50ZWdyYWxfYXJtX3BsYW50LmNjIFwKKyAgICBmcmlkZ2UvaW50ZWdyYWxfYXJtX3BsYW50LmgKZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvdXBkYXRlX2NsYXcuc2ggYi95MjAxNS9jb250cm9sX2xvb3BzL3VwZGF0ZV9jbGF3LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQzN2U3MzcKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9jb250cm9sX2xvb3BzL3VwZGF0ZV9jbGF3LnNoCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFVwZGF0ZXMgdGhlIGNsYXcgY29udHJvbGxlcnMgKGZvciBib3RoIHJvYm90cykuCisKK2NkICQoZGlybmFtZSAkMCkKKworZXhwb3J0IFBZVEhPTlBBVEg9Li4vLi4vZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uCisKKy4vcHl0aG9uL2NsYXcucHkgY2xhdy9jbGF3X21vdG9yX3BsYW50LmNjIFwKKyAgICBjbGF3L2NsYXdfbW90b3JfcGxhbnQuaApkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy91cGRhdGVfZHJpdmV0cmFpbi5zaCBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvdXBkYXRlX2RyaXZldHJhaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWNkMWM0MQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvdXBkYXRlX2RyaXZldHJhaW4uc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVXBkYXRlcyB0aGUgZHJpdmV0cmFpbiBjb250cm9sbGVycyAoZm9yIGJvdGggcm9ib3RzKS4KKworY2QgJChkaXJuYW1lICQwKQorCitleHBvcnQgUFlUSE9OUEFUSD0uLi8uLi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24KKworLi9weXRob24vZHJpdmV0cmFpbi5weSBkcml2ZXRyYWluL2RyaXZldHJhaW5fZG9nX21vdG9yX3BsYW50LmggXAorICAgIGRyaXZldHJhaW4vZHJpdmV0cmFpbl9kb2dfbW90b3JfcGxhbnQuY2MgXAorICAgIGRyaXZldHJhaW4vZHJpdmV0cmFpbl9jbHV0Y2hfbW90b3JfcGxhbnQuaCBcCisgICAgZHJpdmV0cmFpbi9kcml2ZXRyYWluX2NsdXRjaF9tb3Rvcl9wbGFudC5jYwpkaWZmIC0tZ2l0IGEveTIwMTUvY29udHJvbF9sb29wcy91cGRhdGVfZWxldmF0b3Iuc2ggYi95MjAxNS9jb250cm9sX2xvb3BzL3VwZGF0ZV9lbGV2YXRvci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YTdlZGI0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvY29udHJvbF9sb29wcy91cGRhdGVfZWxldmF0b3Iuc2gKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVXBkYXRlcyB0aGUgZWxldmF0b3IgY29udHJvbGxlcnMgKGZvciBib3RoIHJvYm90cykuCisKK2NkICQoZGlybmFtZSAkMCkKKworZXhwb3J0IFBZVEhPTlBBVEg9Li4vLi4vZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uCisKKy4vcHl0aG9uL2VsZXZhdG9yLnB5IGZyaWRnZS9lbGV2YXRvcl9tb3Rvcl9wbGFudC5jYyBcCisgICAgZnJpZGdlL2VsZXZhdG9yX21vdG9yX3BsYW50LmgKZGlmZiAtLWdpdCBhL3kyMDE1L2NvbnRyb2xfbG9vcHMvdXBkYXRlX3BvbHlkcml2ZXRyYWluLnNoIGIveTIwMTUvY29udHJvbF9sb29wcy91cGRhdGVfcG9seWRyaXZldHJhaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzM4ZTQwZQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2NvbnRyb2xfbG9vcHMvdXBkYXRlX3BvbHlkcml2ZXRyYWluLnNoCkBAIC0wLDAgKzEsMTQgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFVwZGF0ZXMgdGhlIHBvbHlkcml2ZXRyYWluIGNvbnRyb2xsZXJzIChmb3IgYm90aCByb2JvdHMpIGFuZCBDSU0gbW9kZWxzLgorCitjZCAkKGRpcm5hbWUgJDApCisKK2V4cG9ydCBQWVRIT05QQVRIPS4uLy4uL2ZyYzk3MS9jb250cm9sX2xvb3BzL3B5dGhvbgorCisuL3B5dGhvbi9wb2x5ZHJpdmV0cmFpbi5weSBkcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5oIFwKKyAgICBkcml2ZXRyYWluL3BvbHlkcml2ZXRyYWluX2RvZ19tb3Rvcl9wbGFudC5jYyBcCisgICAgZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jbHV0Y2hfbW90b3JfcGxhbnQuaCBcCisgICAgZHJpdmV0cmFpbi9wb2x5ZHJpdmV0cmFpbl9jbHV0Y2hfbW90b3JfcGxhbnQuY2MgXAorICAgIGRyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmggXAorICAgIGRyaXZldHJhaW4vcG9seWRyaXZldHJhaW5fY2ltX3BsYW50LmNjCmRpZmYgLS1naXQgYS95MjAxNS9odHRwX3N0YXR1cy9odHRwX3N0YXR1cy5jYyBiL3kyMDE1L2h0dHBfc3RhdHVzL2h0dHBfc3RhdHVzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjQzMTQKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9odHRwX3N0YXR1cy9odHRwX3N0YXR1cy5jYwpAQCAtMCwwICsxLDI5NiBAQAorI2luY2x1ZGUgInkyMDE1L2h0dHBfc3RhdHVzL2h0dHBfc3RhdHVzLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAic2Vhc29ja3MvU2VydmVyLmgiCisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvcGhhc2VkX2xvb3AuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL211dGV4LmgiCisKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5xLmgiCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLnEuaCIKKworI2luY2x1ZGUgInkyMDE1L2h0dHBfc3RhdHVzL2VtYmVkZGVkLmgiCisKK25hbWVzcGFjZSBmcmM5NzEgeworbmFtZXNwYWNlIGh0dHBfc3RhdHVzIHsKKworLy8gVE9ETyhjb21yYW4pOiBNYWtlIHNvbWUgb2YgdGhlc2Ugc2VwYXJhdGUgbGlicmFyaWVzICYgZG9jdW1lbnQgdGhlbSBiZXR0ZXIuCisKK0hUVFBTdGF0dXNNZXNzYWdlOjpIVFRQU3RhdHVzTWVzc2FnZSgpCisgICAgOiBzYW1wbGVfaWRfKDApLAorICAgICAgbWVhc3VyZV9pbmRleF8oMCksCisgICAgICBvdmVyZmxvd19pZF8oMjAwKSwKKyAgICAgIG51bV9zYW1wbGVzX3Blcl9wYWNrZXRfKDUwKSB7fQorCit2b2lkIEhUVFBTdGF0dXNNZXNzYWdlOjpOZXh0U2FtcGxlKCkgeworICBpbnQzMl90IGFkanVzdGVkX2luZGV4ID0gR2V0SW5kZXgoc2FtcGxlX2lkXyk7CisKKyAgOjphb3M6OnRpbWU6OlRpbWUgdGltZV9ub3cgPSA6OmFvczo6dGltZTo6VGltZTo6Tm93KCk7CisKKyAgaWYgKHNhbXBsZV9pZF8gPCBvdmVyZmxvd19pZF8pIHsKKyAgICBzYW1wbGVfdGltZXNfLmVtcGxhY2VfYmFjayh0aW1lX25vdyk7CisgICAgZGF0YV92YWx1ZXNfLmVtcGxhY2VfYmFjayg6OnN0ZDo6dmVjdG9yPGRvdWJsZT4oKSk7CisgIH0gZWxzZSB7CisgICAgc2FtcGxlX3RpbWVzX1thZGp1c3RlZF9pbmRleF0gPSB0aW1lX25vdzsKKyAgfQorCisgIHNhbXBsZV9pZF8rKzsKKyAgbWVhc3VyZV9pbmRleF8gPSAwOworCisgIENIRUNLKCFtdXRleF8uTG9jaygpKTsgIC8vIExvY2sgdGhlIG11dGV4IHNvIG1lYXN1cmVzIGNhbiBiZSBhZGRlZC4KK30KKwordm9pZCBIVFRQU3RhdHVzTWVzc2FnZTo6RW5kU2FtcGxlKCkgeyBtdXRleF8uVW5sb2NrKCk7IH0KKworaW50MzJfdCBIVFRQU3RhdHVzTWVzc2FnZTo6R2V0SW5kZXgoaW50MzJfdCBzYW1wbGVfaWQpIHsKKyAgcmV0dXJuIHNhbXBsZV9pZCAlIG92ZXJmbG93X2lkXzsKK30KKwordm9pZCBIVFRQU3RhdHVzTWVzc2FnZTo6QWRkTWVhc3VyZSg6OnN0ZDo6c3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgeworICAvLyBNdXRleCBzaG91bGQgYmUgbG9ja2VkIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHN5bmNocm9uaXplIHBhY2tldHMuCisgIGFzc2VydChtdXRleF8uT3duZWRCeVNlbGYoKSk7CisKKyAgaW50MzJfdCBpbmRleCA9IEdldEluZGV4KHNhbXBsZV9pZF8gLSAxKTsKKworICBpZiAobWVhc3VyZV9pbmRleF8gPj0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZGF0YV9uYW1lc18uc2l6ZSgpKSkgeworICAgIGRhdGFfbmFtZXNfLmVtcGxhY2VfYmFjayhuYW1lKTsKKyAgfQorCisgIGlmIChtZWFzdXJlX2luZGV4XyA+PSBzdGF0aWNfY2FzdDxpbnQzMl90PihkYXRhX3ZhbHVlc18uYXQoaW5kZXgpLnNpemUoKSkpIHsKKyAgICBkYXRhX3ZhbHVlc18uYXQoaW5kZXgpLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgZGF0YV92YWx1ZXNfLmF0KGluZGV4KS5hdChtZWFzdXJlX2luZGV4XykgPSB2YWx1ZTsKKyAgfQorICBtZWFzdXJlX2luZGV4XysrOworfQorCis6OnN0ZDo6c3RyaW5nIEhUVFBTdGF0dXNNZXNzYWdlOjpGZXRjaChzaXplX3QgZnJvbV9zYW1wbGUpIHsKKyAgOjphb3M6Ok11dGV4TG9ja2VyIGxvY2tlcigmbXV0ZXhfKTsKKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIG1lc3NhZ2U7CisgIG1lc3NhZ2UucHJlY2lzaW9uKDEwKTsgIC8vIENhcCBob3cgcHJlY2lzZSB0aGUgdGltZS9tZWFzdXJlbWVudCBkYXRhIGlzLgorCisgIC8vIFRvIHNhdmUgc3BhY2UsIGRhdGEgaXMgYmVpbmcgc2VudCB3aXRoIGEgY3VzdG9tIHByb3RvY29sIG92ZXIgdG8gdGhlCisgIC8vIGNsaWVudC4KKyAgLy8gSW5pdGlhbGx5LCBhIG1lc3NhZ2UgY29udGFpbmluZyBhbGwgdGhlIG5hbWVzIG9mIHRoZSBtZWFzdXJlbWVudHMgaXMgc2VudAorICAvLyBhbmQgaXMgcHJlY2VlZGVkIHdpdGggYSAqLgorICAvLyBOYW1lcyBiZWdpbiB3aXRoIGEgc3RhciBhbmQgYXJlIHNwbGl0IHdpdGggY29tbWFzLgorCisgIC8vIEV4YW1wbGU6ICp0ZXN0LHRlc3QyCisgIGlmIChzdGF0aWNfY2FzdDxpbnQzMl90Pihmcm9tX3NhbXBsZSkgPT0gLTEpIHsKKyAgICBtZXNzYWdlIDw8ICIqIjsKKyAgICBmb3IgKGludDMyX3QgY3VyX2RhdGFfbmFtZSA9IDA7CisgICAgICAgICBjdXJfZGF0YV9uYW1lIDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZGF0YV9uYW1lc18uc2l6ZSgpKTsKKyAgICAgICAgIGN1cl9kYXRhX25hbWUrKykgeworICAgICAgaWYgKGN1cl9kYXRhX25hbWUgPiAwKSB7CisgICAgICAgIG1lc3NhZ2UgPDwgIiwiOworICAgICAgfQorICAgICAgbWVzc2FnZSA8PCBkYXRhX25hbWVzXy5hdChjdXJfZGF0YV9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIG1lc3NhZ2Uuc3RyKCk7CisgIH0KKworICAvLyBUT0RPKGNvbXJhbik6IFVzZSBmcm9tX3NhbXBsZSB0byBkZXRlcm1pbmUgdGhlIHNwZWVkIHBhY2tldHMgc2hvdWxkIGJlIHNlbnQKKyAgLy8gb3V0IHRvIGF2b2lkIHNraXBwaW5nIHBhY2tldHMuCisgIGZyb21fc2FtcGxlID0gc2FtcGxlX2lkXyAtIG51bV9zYW1wbGVzX3Blcl9wYWNrZXRfOworCisgIC8vIERhdGEgcGFja2V0cyBhcmUgc2VudCwgd2l0aCByYXcgZGF0YSBiZWluZyBwbGFjZWQgYXQgdGhlIHNhbWUgaW5kZXggYXMgdGhlCisgIC8vIG9yaWdpbmFsIGluZGV4IG9mIHRoZSBtZWFzdXJlbWVudCBuYW1lIHNlbnQgaW4gdGhlIGluaXRpYWwgcGFja2V0LgorICAvLyBTYW1wbGVzIGFyZSBzcGxpdCB3aXRoIGRvbGxhciBzaWducywgaW5mbyB3aXRoIHBlcmNlbnQgc2lnbnMsIGFuZAorICAvLyBtZWFzdXJlbWVudHMgd2l0aCBjb21tYXMuCisgIC8vIFRoaXMgc3BlY2lhbCBmb3JtYXQgc3lzdGVtIGlzIGhlbHBmdWwgZm9yIGRlYnVnZ2luZyBpc3N1ZXMgYW5kIGxvb3BpbmcKKyAgLy8gdGhyb3VnaCB0aGUgZGF0YSBvbiB0aGUgY2xpZW50IHNpZGUuCisKKyAgLy8gRXhhbXBsZSBvZiB0d28gc2FtcGxlcyB0aGF0IGNvcnJlc3BvbmQgd2l0aCB0aGUgaW5pdGlhbGl6ZWQgZXhhbXBsZToKKyAgLy8gMjg5JTI4MDMuMTM1MTI3JTEwLDY3JDI5MCUyODAzLjE0MDEwOSUxMiw2OAorICBmb3IgKGludDMyX3QgY3VyX3NhbXBsZSA9IGZyb21fc2FtcGxlOworICAgICAgIGN1cl9zYW1wbGUgPAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZnJvbV9zYW1wbGUgKyBudW1fc2FtcGxlc19wZXJfcGFja2V0XykgJiYKKyAgICAgICAgICAgR2V0SW5kZXgoY3VyX3NhbXBsZSkgPCBzdGF0aWNfY2FzdDxpbnQzMl90PihkYXRhX3ZhbHVlc18uc2l6ZSgpKTsKKyAgICAgICBjdXJfc2FtcGxlKyspIHsKKyAgICBpZiAoY3VyX3NhbXBsZSAhPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihmcm9tX3NhbXBsZSkpIHsKKyAgICAgIG1lc3NhZ2UgPDwgIiQiOworICAgIH0KKworICAgIGludDMyX3QgYWRqdXN0ZWRfaW5kZXggPSBHZXRJbmRleChjdXJfc2FtcGxlKTsKKworICAgIG1lc3NhZ2UgPDwgY3VyX3NhbXBsZSA8PCAiJSIgPDwgc2FtcGxlX3RpbWVzXy5hdChhZGp1c3RlZF9pbmRleCkuVG9TZWNvbmRzKCkKKyAgICAgICAgICAgIDw8ICIlIjsKKyAgICBmb3IgKGludDMyX3QgY3VyX21lYXN1cmUgPSAwOworICAgICAgICAgY3VyX21lYXN1cmUgPCBzdGF0aWNfY2FzdDxpbnQzMl90PihkYXRhX25hbWVzXy5zaXplKCkpOworICAgICAgICAgY3VyX21lYXN1cmUrKykgeworICAgICAgaWYgKGN1cl9tZWFzdXJlID4gMCkgeworICAgICAgICBtZXNzYWdlIDw8ICIsIjsKKyAgICAgIH0KKyAgICAgIG1lc3NhZ2UgPDwgZGF0YV92YWx1ZXNfLmF0KGFkanVzdGVkX2luZGV4KS5hdChjdXJfbWVhc3VyZSk7CisgICAgfQorICB9CisgIHJldHVybiBtZXNzYWdlLnN0cigpOworfQorCitEYXRhQ29sbGVjdG9yOjpEYXRhQ29sbGVjdG9yKCkgOiBjdXJfcmF3X2RhdGFfKCJubyBkYXRhIikge30KKwordm9pZCBEYXRhQ29sbGVjdG9yOjpSdW5JdGVyYXRpb24oKSB7CisgIGF1dG8mIGZyaWRnZV9xdWV1ZSA9IGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZTsKKyAgYXV0byYgY2xhd19xdWV1ZSA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWU7CisKKyAgZnJpZGdlX3F1ZXVlLnN0YXR1cy5GZXRjaEFub3RoZXIoKTsKKyAgY2xhd19xdWV1ZS5zdGF0dXMuRmV0Y2hBbm90aGVyKCk7CisKKyAgbWVzc2FnZV8uTmV4dFNhbXBsZSgpOworICAvLyBBZGQgcmVjb3JkZWQgZGF0YSBoZXJlLiAvLy8vLworICAvLyBOT1RFOiBUcnkgdG8gdXNlIGZld2VyIHRoYW4gMzAgbWVhc3VyZXMsIG9yIHRoZSB3aG9sZSB0aGluZyB3aWxsIGxhZy4KKyAgLy8gQWJicmV2aWF0ZSBuYW1lcyBpZiBsb25nLCBvdGhlcndpc2UganVzdCB1c2UgdGhlIGNvbW1hbmQgdG8gZ2V0IHRoZSB2YWx1ZQorICAvLyBmcm9tIHRoZSBxdWV1ZS4KKworICAvLyBUT0RPKGNvbXJhbik6IE1ha2UgaXQgc28gdGhhdCB0aGUgbmFtZSBkb2Vzbid0IGhhdmUgdG8gYmUgY29waWVkIGFzIGEKKyAgLy8gc3RyaW5nLgorCisgIC8vIC8vLy8gRnJpZGdlCisgIC8vIFBvc2l0aW9ucworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCIoZnJpZGdlIHBvc2l0aW9uIGxlZnQgYXJtIGVuY29kZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmlkZ2VfcXVldWUucG9zaXRpb24tPmFybS5sZWZ0LmVuY29kZXIpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCIoZnJpZGdlIHBvc2l0aW9uIHJpZ2h0IGFybSBlbmNvZGVyKSIsCisgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlLnBvc2l0aW9uLT5hcm0ucmlnaHQuZW5jb2Rlcik7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoIihmcmlkZ2UgcG9zaXRpb24gbGVmdCBlbGV2IGVuY29kZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmlkZ2VfcXVldWUucG9zaXRpb24tPmVsZXZhdG9yLmxlZnQuZW5jb2Rlcik7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoIihmcmlkZ2UgcG9zaXRpb24gcmlnaHQgZWxldiBlbmNvZGVyKSIsCisgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlLnBvc2l0aW9uLT5lbGV2YXRvci5yaWdodC5lbmNvZGVyKTsKKyAgLy8gR29hbHMKKyAgbWVzc2FnZV8uQWRkTWVhc3VyZSgiZnJpZGdlX3F1ZXVlLmdvYWwtPnByb2ZpbGluZ190eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmlkZ2VfcXVldWUuZ29hbC0+cHJvZmlsaW5nX3R5cGUpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCJmcmlkZ2VfcXVldWUuZ29hbC0+YW5nbGUiLCBmcmlkZ2VfcXVldWUuZ29hbC0+YW5nbGUpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCJmcmlkZ2VfcXVldWUuZ29hbC0+YW5ndWxhcl92ZWxvY2l0eSIsCisgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlLmdvYWwtPmFuZ3VsYXJfdmVsb2NpdHkpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCJmcmlkZ2VfcXVldWUuZ29hbC0+aGVpZ2h0IiwgZnJpZGdlX3F1ZXVlLmdvYWwtPmhlaWdodCk7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS5nb2FsLT52ZWxvY2l0eSIsCisgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlLmdvYWwtPnZlbG9jaXR5KTsKKyAgbWVzc2FnZV8uQWRkTWVhc3VyZSgiZnJpZGdlX3F1ZXVlLngiLCBmcmlkZ2VfcXVldWUuZ29hbC0+eCk7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS54X3ZlbG9jaXR5IiwgZnJpZGdlX3F1ZXVlLmdvYWwtPnhfdmVsb2NpdHkpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCJmcmlkZ2VfcXVldWUueSIsIGZyaWRnZV9xdWV1ZS5nb2FsLT55KTsKKyAgbWVzc2FnZV8uQWRkTWVhc3VyZSgiZnJpZGdlX3F1ZXVlLnlfdmVsb2NpdHkiLCBmcmlkZ2VfcXVldWUuZ29hbC0+eV92ZWxvY2l0eSk7CisgIC8vIFN0YXR1c2VzCisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS5zdGF0dXMtPmhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlLnN0YXR1cy0+aGVpZ2h0KTsKKyAgbWVzc2FnZV8uQWRkTWVhc3VyZSgiZnJpZGdlX3F1ZXVlLnN0YXR1cy0+dmVsb2NpdHkiLAorICAgICAgICAgICAgICAgICAgICAgIGZyaWRnZV9xdWV1ZS5zdGF0dXMtPnZlbG9jaXR5KTsKKyAgbWVzc2FnZV8uQWRkTWVhc3VyZSgiZnJpZGdlX3F1ZXVlLnN0YXR1cy0+YW5nbGUiLCBmcmlkZ2VfcXVldWUuc3RhdHVzLT5hbmdsZSk7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS5zdGF0dXMtPmFuZ3VsYXJfdmVsb2NpdHkiLAorICAgICAgICAgICAgICAgICAgICAgIGZyaWRnZV9xdWV1ZS5zdGF0dXMtPmFuZ3VsYXJfdmVsb2NpdHkpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCJmcmlkZ2VfcXVldWUuc3RhdHVzLT54IiwgZnJpZGdlX3F1ZXVlLnN0YXR1cy0+eCk7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS5zdGF0dXMtPnhfdmVsb2NpdHkiLAorICAgICAgICAgICAgICAgICAgICAgIGZyaWRnZV9xdWV1ZS5zdGF0dXMtPnhfdmVsb2NpdHkpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCJmcmlkZ2VfcXVldWUuc3RhdHVzLT55IiwgZnJpZGdlX3F1ZXVlLnN0YXR1cy0+eSk7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS5zdGF0dXMtPnlfdmVsb2NpdHkiLAorICAgICAgICAgICAgICAgICAgICAgIGZyaWRnZV9xdWV1ZS5zdGF0dXMtPnlfdmVsb2NpdHkpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCJmcmlkZ2VfcXVldWUuc3RhdHVzLT5zdGF0ZSIsIGZyaWRnZV9xdWV1ZS5zdGF0dXMtPnN0YXRlKTsKKyAgbWVzc2FnZV8uQWRkTWVhc3VyZSgiZnJpZGdlX3F1ZXVlLnN0YXR1cy0+emVyb2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmlkZ2VfcXVldWUuc3RhdHVzLT56ZXJvZWQpOworICBtZXNzYWdlXy5BZGRNZWFzdXJlKCJmcmlkZ2VfcXVldWUuc3RhdHVzLT5lc3RvcHBlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlLnN0YXR1cy0+ZXN0b3BwZWQpOworICAvLyBPdXRwdXRzCisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS5vdXRwdXQtPmxlZnRfYXJtIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmlkZ2VfcXVldWUub3V0cHV0LT5sZWZ0X2FybSk7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS5vdXRwdXQtPnJpZ2h0X2FybSIsCisgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlLm91dHB1dC0+cmlnaHRfYXJtKTsKKyAgbWVzc2FnZV8uQWRkTWVhc3VyZSgiZnJpZGdlX3F1ZXVlLm91dHB1dC0+bGVmdF9lbGV2YXRvciIsCisgICAgICAgICAgICAgICAgICAgICAgZnJpZGdlX3F1ZXVlLm91dHB1dC0+bGVmdF9lbGV2YXRvcik7CisgIG1lc3NhZ2VfLkFkZE1lYXN1cmUoImZyaWRnZV9xdWV1ZS5vdXRwdXQtPnJpZ2h0X2VsZXZhdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmlkZ2VfcXVldWUub3V0cHV0LT5yaWdodF9lbGV2YXRvcik7CisgIC8vIEVuZCByZWNvcmRlZCBkYXRhLiAvLy8vLworICBtZXNzYWdlXy5FbmRTYW1wbGUoKTsKK30KKworOjpzdGQ6OnN0cmluZyBEYXRhQ29sbGVjdG9yOjpHZXREYXRhKGludDMyX3QgZnJvbV9zYW1wbGUpIHsKKyAgcmV0dXJuIG1lc3NhZ2VfLkZldGNoKGZyb21fc2FtcGxlKTsKK30KKwordm9pZCBEYXRhQ29sbGVjdG9yOjpvcGVyYXRvcigpKCkgeworICA6OmFvczo6U2V0Q3VycmVudFRocmVhZE5hbWUoIkhUVFBTdGF0dXNEYXRhIik7CisKKyAgd2hpbGUgKHJ1bl8pIHsKKyAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUyg1LCAwKTsKKyAgICBSdW5JdGVyYXRpb24oKTsKKyAgfQorfQorCitTb2NrZXRIYW5kbGVyOjpTb2NrZXRIYW5kbGVyKCkKKyAgICA6IGRhdGFfY29sbGVjdG9yX3RocmVhZF8oOjpzdGQ6OnJlZihkYXRhX2NvbGxlY3Rvcl8pKSB7fQorCit2b2lkIFNvY2tldEhhbmRsZXI6Om9uQ29ubmVjdChzZWFzb2Nrczo6V2ViU29ja2V0KiBjb25uZWN0aW9uKSB7CisgIGNvbm5lY3Rpb25zXy5pbnNlcnQoY29ubmVjdGlvbik7CisgIExPRyhJTkZPLCAiQ29ubmVjdGVkOiAlcyA6ICVzXG4iLCBjb25uZWN0aW9uLT5nZXRSZXF1ZXN0VXJpKCkuY19zdHIoKSwKKyAgICAgIHNlYXNvY2tzOjpmb3JtYXRBZGRyZXNzKGNvbm5lY3Rpb24tPmdldFJlbW90ZUFkZHJlc3MoKSkuY19zdHIoKSk7Cit9CisKK3ZvaWQgU29ja2V0SGFuZGxlcjo6b25EYXRhKHNlYXNvY2tzOjpXZWJTb2NrZXQqIGNvbm5lY3Rpb24sIGNvbnN0IGNoYXIqIGRhdGEpIHsKKyAgaW50MzJfdCBmcm9tX3NhbXBsZSA9IGF0b2koZGF0YSk7CisKKyAgOjpzdGQ6OnN0cmluZyBzZW5kX2RhdGEgPSBkYXRhX2NvbGxlY3Rvcl8uR2V0RGF0YShmcm9tX3NhbXBsZSk7CisgIGNvbm5lY3Rpb24tPnNlbmQoc2VuZF9kYXRhLmNfc3RyKCkpOworfQorCit2b2lkIFNvY2tldEhhbmRsZXI6Om9uRGlzY29ubmVjdChzZWFzb2Nrczo6V2ViU29ja2V0KiBjb25uZWN0aW9uKSB7CisgIGNvbm5lY3Rpb25zXy5lcmFzZShjb25uZWN0aW9uKTsKKyAgTE9HKElORk8sICJEaXNjb25uZWN0ZWQ6ICVzIDogJXNcbiIsIGNvbm5lY3Rpb24tPmdldFJlcXVlc3RVcmkoKS5jX3N0cigpLAorICAgICAgc2Vhc29ja3M6OmZvcm1hdEFkZHJlc3MoY29ubmVjdGlvbi0+Z2V0UmVtb3RlQWRkcmVzcygpKS5jX3N0cigpKTsKK30KKwordm9pZCBTb2NrZXRIYW5kbGVyOjpRdWl0KCkgeworICBkYXRhX2NvbGxlY3Rvcl8uUXVpdCgpOworICBkYXRhX2NvbGxlY3Rvcl90aHJlYWRfLmpvaW4oKTsKK30KKworU2Vhc29ja3NMb2dnZXI6OlNlYXNvY2tzTG9nZ2VyKExldmVsIG1pbl9sZXZlbF90b19sb2cpCisgICAgOiBQcmludGZMb2dnZXIobWluX2xldmVsX3RvX2xvZykge30KKwordm9pZCBTZWFzb2Nrc0xvZ2dlcjo6bG9nKExldmVsIGxldmVsLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgIGxvZ19sZXZlbCBhb3NfbGV2ZWw7CisgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICBjYXNlIHNlYXNvY2tzOjpMb2dnZXI6OklORk86CisgICAgICBhb3NfbGV2ZWwgPSBJTkZPOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzZWFzb2Nrczo6TG9nZ2VyOjpXQVJOSU5HOgorICAgICAgYW9zX2xldmVsID0gV0FSTklORzsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2Vhc29ja3M6OkxvZ2dlcjo6RVJST1I6CisgICAgY2FzZSBzZWFzb2Nrczo6TG9nZ2VyOjpTRVZFUkU6CisgICAgICBhb3NfbGV2ZWwgPSBFUlJPUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2Vhc29ja3M6OkxvZ2dlcjo6REVCVUc6CisgICAgY2FzZSBzZWFzb2Nrczo6TG9nZ2VyOjpBQ0NFU1M6CisgICAgZGVmYXVsdDoKKyAgICAgIGFvc19sZXZlbCA9IERFQlVHOworICAgICAgYnJlYWs7CisgIH0KKyAgTE9HKGFvc19sZXZlbCwgIlNlYXNvY2tzOiAlc1xuIiwgbWVzc2FnZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBodHRwX3N0YXR1cworfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQorCitpbnQgbWFpbihpbnQsIGNoYXIqIFtdKSB7CisgIDo6YW9zOjpJbml0TlJUKCk7CisKKyAgc2Vhc29ja3M6OlNlcnZlciBzZXJ2ZXIoOjpzdGQ6OnNoYXJlZF9wdHI8c2Vhc29ja3M6OkxvZ2dlcj4oCisgICAgICBuZXcgZnJjOTcxOjpodHRwX3N0YXR1czo6U2Vhc29ja3NMb2dnZXIoc2Vhc29ja3M6OkxvZ2dlcjo6SU5GTykpKTsKKyAgZnJjOTcxOjpodHRwX3N0YXR1czo6U29ja2V0SGFuZGxlciBzb2NrZXRfaGFuZGxlcjsKKworICBzZXJ2ZXIuYWRkV2ViU29ja2V0SGFuZGxlcigKKyAgICAgICIvd3MiLAorICAgICAgOjpzdGQ6OnNoYXJlZF9wdHI8ZnJjOTcxOjpodHRwX3N0YXR1czo6U29ja2V0SGFuZGxlcj4oJnNvY2tldF9oYW5kbGVyKSk7CisgIHNlcnZlci5zZXJ2ZSgid3d3IiwgODA4MCk7CisKKyAgc29ja2V0X2hhbmRsZXIuUXVpdCgpOworCisgIDo6YW9zOjpDbGVhbnVwKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEveTIwMTUvaHR0cF9zdGF0dXMvaHR0cF9zdGF0dXMuZ3lwIGIveTIwMTUvaHR0cF9zdGF0dXMvaHR0cF9zdGF0dXMuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OGExZmMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9odHRwX3N0YXR1cy9odHRwX3N0YXR1cy5neXAKQEAgLTAsMCArMSw0NiBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnaHR0cF9zdGF0dXMnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2h0dHBfc3RhdHVzLmNjJywKKyAgICAgIF0sCisgICAgICAnYWN0aW9ucyc6IFsKKyAgICAgICAgeworICAgICAgICAgICdhY3Rpb25fbmFtZSc6ICdodHRwX3N0YXR1c19nZW5fZW1iZWRkZWQnLAorICAgICAgICAgICdpbnB1dHMnOiBbCisgICAgICAgICAgICAnPCFAKGZpbmQgLi93d3dfZGVmYXVsdHMpJywKKyAgICAgICAgICAgICc8KEFPUykvZXh0ZXJuYWxzL3NlYXNvY2tzL2dlbl9lbWJlZGRlZC5weScsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnb3V0cHV0cyc6IFsKKyAgICAgICAgICAgICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKS9odHRwX3N0YXR1cy95MjAxNS9odHRwX3N0YXR1cy9lbWJlZGRlZC5oJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdhY3Rpb24nOiBbCisgICAgICAgICAgICAncHl0aG9uJywgJzwoQU9TKS9leHRlcm5hbHMvc2Vhc29ja3MvZ2VuX2VtYmVkZGVkLnB5JywgJzwoX291dHB1dHMpJywKKyAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgXSwKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKS9odHRwX3N0YXR1cy8nCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2J1aWxkL2Fvcy5neXA6bG9nZ2luZycsCisgICAgICAgICc8KEVYVEVSTkFMUyk6c2Vhc29ja3MnLAorICAgICAgICAnPChERVBUSCkveTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwOmNsYXdfcXVldWUnLAorICAgICAgICAnPChERVBUSCkveTIwMTUvY29udHJvbF9sb29wcy9mcmlkZ2UvZnJpZGdlLmd5cDpmcmlkZ2VfcXVldWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOnBoYXNlZF9sb29wJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDp0aW1lJywKKyAgICAgIF0sCisgICAgICAnY29waWVzJzogWworICAgICAgICB7CisgICAgICAgICAgJ2Rlc3RpbmF0aW9uJzogJzwocnN5bmNfZGlyKScsCisgICAgICAgICAgJ2ZpbGVzJzogWworICAgICAgICAgICAgJ3d3dycsCisgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3kyMDE1L2h0dHBfc3RhdHVzL2h0dHBfc3RhdHVzLmggYi95MjAxNS9odHRwX3N0YXR1cy9odHRwX3N0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzQ5N2QKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9odHRwX3N0YXR1cy9odHRwX3N0YXR1cy5oCkBAIC0wLDAgKzEsMTA2IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAic2Vhc29ja3MvUGFnZUhhbmRsZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9QcmludGZMb2dnZXIuaCIKKyNpbmNsdWRlICJzZWFzb2Nrcy9TdHJpbmdVdGlsLmgiCisjaW5jbHVkZSAic2Vhc29ja3MvV2ViU29ja2V0LmgiCisKKyNpbmNsdWRlICJhb3MvbGludXhfY29kZS9pbml0LmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi90aW1lLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9tdXRleC5oIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBodHRwX3N0YXR1cyB7CisKKy8vIEEgY2xhc3MgZm9yIHN0b3JpbmcgZGF0YSBmcm9tIERhdGFDb2xsZWN0b3IgYW5kIHBhY2thZ2luZyBpdCBhcyBhIGN1c3RvbQorLy8gbWVzc2FnZSBmb3IgdGhlIHdlYnNvY2tldC4KKy8vIFNhbXBsZXMgYXJlIHN0b3JlZCBpbiBhIHZlY3RvciB0aGF0IHdyYXBzIGFyb3VuZCBhdCBhIGNlcnRhaW4gcG9pbnQgdG8gYXZvaWQKKy8vIGNsb2dnaW5nIHVwIG1lbW9yeS4gVGhlc2Ugc2FtcGxlcyBzaG91bGQgYmUgYWxyZWFkeSBvbiBhbGwgY2xpZW50cyBiZWZvcmUKKy8vIHRoZXkgYXJlIG92ZXJ3cml0dGVuLiBUbyBhdm9pZCBsb3Npbmcgc2FtcGxlcywgdGhlcmUgbXVzdCBiZSBhIGJhbGFuY2UKKy8vIGJldHdlZW4gdGhlIHJhdGUgc2FtcGxlcyBhcmUgYmVpbmcgcmVjb3JkZWQgYXQgYW5kIHRoZSBzcGVlZCBvZiB0aGUgbGluaworLy8gYmV0d2VlbiB0aGUgcm9ib3QgYW5kIGNsaWVudC4KKworY2xhc3MgSFRUUFN0YXR1c01lc3NhZ2UgeworIHB1YmxpYzoKKyAgSFRUUFN0YXR1c01lc3NhZ2UoKTsKKworICAvLyBTdG9yZXMgYW4gaW5kaXZpZHVhbCBtZWFzdXJlbWVudCBpbiB0aGUgY3VycmVudCBzYW1wbGUuCisgIHZvaWQgQWRkTWVhc3VyZSg6OnN0ZDo6c3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSk7CisKKyAgLy8gU3RhcnRzIGEgbmV3IHNhbXBsZSB0aGF0IGNvbnRhaW5zIG1lYXN1cmVtZW50cyBmb3IgYWxsIHRoZSBzdGF0ZXMgYXQgYQorICAvLyB0aW1lc3RlcCwgYW5kIGxvY2sgbXV0ZXggdG8gc3luY2hyb25pemUgbWVhc3VyZXMuCisgIHZvaWQgTmV4dFNhbXBsZSgpOworCisgIC8vIFVubG9jayBtdXRleC4KKyAgdm9pZCBFbmRTYW1wbGUoKTsKKworICAvLyBNZXRob2QgY2FsbGVkIGJ5IHRoZSB3ZWJzb2NrZXQgdG8gZ2V0IGEgSlNPTi1wYWNrYWdlZCBzdHJpbmcgY29udGFpbmluZywKKyAgLy8gYXQgbW9zdCwgYSBjb25zdGFudCBudW1iZXIgb2Ygc2FtcGxlcywgc3RhcnRpbmcgYXQgImZyb21fc2FtcGxlIi4KKyAgLy8gImZyb21fc2FtcGxlIiBpcyBhIHNwZWNpZmljIGluZGV4IGZvciBhIHNhbXBsZSB0aGF0IGlzIG5vdCB3cmFwcGVkLgorICA6OnN0ZDo6c3RyaW5nIEZldGNoKHNpemVfdCBmcm9tX3NhbXBsZSk7CisKKyBwcml2YXRlOgorICAvLyBSZXR1cm5zIHRoZSB2ZWN0b3IgaW5kZXggb2YgdGhlIHNhbXBsZSBnaXZlbi4KKyAgLy8gU2luY2UgdGhlIHZlY3RvcnMgd3JhcCwgbXVsdGlwbGUgc2FtcGxlX2lkcyBtYXkgcmVmZXIgdG8gdGhlIHNhbWUgdmVjdG9yCisgIC8vIGluZGV4LgorICBpbnQzMl90IEdldEluZGV4KGludDMyX3Qgc2FtcGxlX2lkKTsKKworICAvLyBWZWN0b3JzIG9mIHZlY3RvcnMgdG8gc3RvcmUgc2FtcGxlcyBhdCBpbmRleGVzIGRldGVybWluZWQgYnkgR2V0SW5kZXguCisgIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnN0cmluZz4gZGF0YV9uYW1lc187CisgIDo6c3RkOjp2ZWN0b3I8OjpzdGQ6OnZlY3Rvcjxkb3VibGU+PiBkYXRhX3ZhbHVlc187CisgIDo6c3RkOjp2ZWN0b3I8Ojphb3M6OnRpbWU6OlRpbWU+IHNhbXBsZV90aW1lc187CisKKyAgaW50MzJfdCBzYW1wbGVfaWRfOyAgICAgICAgICAvLyBMYXN0IHNhbXBsZSBpZCB1c2VkLgorICBpbnQzMl90IG1lYXN1cmVfaW5kZXhfOyAgICAgIC8vIExhc3QgbWVhc3VyZSBpbmRleCB1c2VkLgorICBjb25zdCBpbnQzMl90IG92ZXJmbG93X2lkXzsgIC8vIFZlY3RvciB3cmFwcGluZyBzaXplLgorICAvLyBOdW1iZXIgb2Ygc2FtcGxlcyB0byBpbmNsdWRlIGluIGVhY2ggSlNPTiBwYWNrZXQuCisgIGNvbnN0IGludDMyX3QgbnVtX3NhbXBsZXNfcGVyX3BhY2tldF87CisKKyAgLy8gTXV0ZXggdXNlZCB0byBzeW5jaHJvbml6ZSBkYXRhLgorICA6OmFvczo6TXV0ZXggbXV0ZXhfOworfTsKKworY2xhc3MgRGF0YUNvbGxlY3RvciB7CisgcHVibGljOgorICBEYXRhQ29sbGVjdG9yKCk7CisgIHZvaWQgUnVuSXRlcmF0aW9uKCk7CisgIDo6c3RkOjpzdHJpbmcgR2V0RGF0YShpbnQzMl90IGZyb20pOworCisgIHZvaWQgb3BlcmF0b3IoKSgpOyAgLy8gV2lsbCBiZSBjYWxsZWQgYnkgOjpzdGQ6OnRocmVhZCBpbnRlcm5hbGx5LgorICB2b2lkIFF1aXQoKSB7IHJ1bl8gPSBmYWxzZTsgfQorCisgcHJpdmF0ZToKKyAgOjpzdGQ6OnN0cmluZyBjdXJfcmF3X2RhdGFfOworICBIVFRQU3RhdHVzTWVzc2FnZSBtZXNzYWdlXzsKKyAgOjpzdGQ6OmF0b21pYzxib29sPiBydW5fe3RydWV9OworfTsKKworY2xhc3MgU29ja2V0SGFuZGxlciA6IHB1YmxpYyBzZWFzb2Nrczo6V2ViU29ja2V0OjpIYW5kbGVyIHsKKyBwdWJsaWM6CisgIFNvY2tldEhhbmRsZXIoKTsKKyAgdm9pZCBvbkNvbm5lY3Qoc2Vhc29ja3M6OldlYlNvY2tldCogY29ubmVjdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgb25EYXRhKHNlYXNvY2tzOjpXZWJTb2NrZXQqIGNvbm5lY3Rpb24sIGNvbnN0IGNoYXIqIGRhdGEpIG92ZXJyaWRlOworICB2b2lkIG9uRGlzY29ubmVjdChzZWFzb2Nrczo6V2ViU29ja2V0KiBjb25uZWN0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBRdWl0KCk7CisKKyBwcml2YXRlOgorICA6OnN0ZDo6c2V0PHNlYXNvY2tzOjpXZWJTb2NrZXQqPiBjb25uZWN0aW9uc187CisgIERhdGFDb2xsZWN0b3IgZGF0YV9jb2xsZWN0b3JfOworICA6OnN0ZDo6dGhyZWFkIGRhdGFfY29sbGVjdG9yX3RocmVhZF87Cit9OworCitjbGFzcyBTZWFzb2Nrc0xvZ2dlciA6IHB1YmxpYyBzZWFzb2Nrczo6UHJpbnRmTG9nZ2VyIHsKKyBwdWJsaWM6CisgIFNlYXNvY2tzTG9nZ2VyKExldmVsIG1pbl9sZXZlbF90b19sb2cpOworICB2b2lkIGxvZyhMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogbWVzc2FnZSkgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaHR0cF9zdGF0dXMKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE1L2h0dHBfc3RhdHVzL3d3dy9pbmRleC5odG1sIGIveTIwMTUvaHR0cF9zdGF0dXMvd3d3L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlODNiNAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2h0dHBfc3RhdHVzL3d3dy9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTYwIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorCis8aGVhZD4KKzx0aXRsZT5IZWxsbywgd29ybGQ8L3RpdGxlPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgordmFyIGVzY2FwYWJsZSA9CisgIC9bXHgwMC1ceDFmXHVkODAwLVx1ZGZmZlx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmZmMC1cdWZmZmZdL2c7Cit2YXIgd3M7Cit2YXIgaW50ZXJ2YWxUaW1lID0gNTA7Cit2YXIgc2FmZXR5VGltZW91dDsKK3ZhciBzYWZldHlJbnRlcnZhbFRpbWUgPSAxMDsKK3ZhciBzZWxlY3RlZCA9IDA7CisKKy8vIEZpbHRlciBvdXQganVua3kgSlNPTiBwYWNrZXRzIHRoYXQgd2lsbCBvdGhlcndpc2UgY2F1c2UgbmFzdHkgZGVjb2RpbmcgZXJyb3JzLgorZnVuY3Rpb24gZmlsdGVyVW5pY29kZShxdW90ZWQpIHsKKyAgZXNjYXBhYmxlLmxhc3RJbmRleCA9IDA7CisgIGlmICghZXNjYXBhYmxlLnRlc3QocXVvdGVkKSkgcmV0dXJuIHF1b3RlZDsKKworICByZXR1cm4gcXVvdGVkLnJlcGxhY2UoZXNjYXBhYmxlLCBmdW5jdGlvbihhKSB7CisgICAgcmV0dXJuICcnOworICB9KTsKK30KKworLy8gQ2hhbmdlIHRoZSBjdXJyZW50IGRhdGEgaW5kZXggdG8gcGxvdCBvbiB0aGUgZ3JhcGguCitmdW5jdGlvbiBjaGFuZ2VTZWxlY3RlZChzZWxlY3QpIHsKKyAgc2VsZWN0ZWQgPSBzZWxlY3Q7CisgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZCIpLmlubmVySFRNTCA9ICJTZWxlY3RlZDogIiArIHNlbGVjdGVkOworfQorCisvLyBHZXQgYSBuZXcgSlNPTiBwYWNrZXQgZnJvbSB0aGUgd2Vic29ja2V0IG9uIHRoZSByb2JvdC4KK2Z1bmN0aW9uIHJlZnJlc2goKSB7CisgIHdzLnNlbmQobGFzdFNhbXBsZUlEKTsKKyAgc2FmZXR5VGltZW91dCA9IHNldFRpbWVvdXQoc2FmZXR5UmVmcmVzaCwgc2FmZXR5SW50ZXJ2YWxUaW1lKTsKK30KKworZnVuY3Rpb24gc2FmZXR5UmVmcmVzaCgpeworICBjb25zb2xlLmxvZygiU2FmZXR5IHRpbWVvdXQgZXhjZWVkZWQuIFBlcmZvcm1pbmcgYWRkaXRpb25hbCByZWZyZXNoLi4uIik7CisgIHJlZnJlc2goKTsKK30KKword2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgZHBzID0gW107CisgIHZhciBudW1EYXRhcyA9IDA7CisgIHZhciBjaGFydCA9IG5ldyBDYW52YXNKUy5DaGFydCgiY2hhcnRDb250YWluZXIiLCB7CisgICAgdGl0bGU6IHsKKyAgICAgIHRleHQ6ICJMaXZlIERhdGEiCisgICAgfSwKKyAgICBheGlzWDogeworICAgICAgdGl0bGU6ICJUaW1lIChzZWMpIgorICAgIH0sCisgICAgYXhpc1k6IHsKKyAgICAgIHRpdGxlOiAiVW5pdHMiCisgICAgfSwKKyAgICB6b29tRW5hYmxlZDogdHJ1ZSwKKyAgICBwYW5FbmFibGVkOiB0cnVlLAorICAgIGRhdGE6IFt7CisgICAgICBjb2xvcjogJ3JnYmEoMTE5LCAxNTIsIDE5MSwgMS4wKScsCisgICAgICB0eXBlOiAic2NhdHRlciIsCisgICAgICBkYXRhUG9pbnRzOiBkcHMKKyAgICB9XSwKKyAgfSk7CisKKyAgY2hhcnQucmVuZGVyKCk7CisKKyAgJChmdW5jdGlvbigpIHsKKyAgICB3cyA9IG5ldyBXZWJTb2NrZXQoJ3dzOi8vJyArIGRvY3VtZW50LmxvY2F0aW9uLmhvc3QgKyAnL3dzJyk7CisgICAgcnVuID0gdHJ1ZTsKKyAgICB4VmFsID0gMTsKKyAgICBsYXN0U2FtcGxlSUQgPSAtMTsKKworICAgIC8vIFNvY2tldCBjcmVhdGVkICYgZmlyc3Qgb3BlbmVkLgorICAgIHdzLm9ub3BlbiA9IGZ1bmN0aW9uKCkgeworICAgICAgcnVuID0gdHJ1ZTsKKyAgICAgIHJlZnJlc2goKTsKKyAgICB9OworCisgICAgLy8gU29ja2V0IGRpc2Nvbm5lY3RlZC4KKyAgICB3cy5vbmNsb3NlID0gZnVuY3Rpb24oKSB7CisgICAgICBjb25zb2xlLmxvZygnb25jbG9zZScpOworICAgICAgcnVuID0gZmFsc2U7CisgICAgICAkKCcjbWVzc2FnZScpLnRleHQoJ0xvc3QgY29ubmVjdGlvbi4nKTsKKyAgICB9OworCisgICAgLy8gUmVjZWl2ZWQgbWVzc2FnZSBvdmVyIHRoZSBzb2NrZXQsIHNvIHBhcnNlIGFuZCBjaGFydCBpdC4KKyAgICB3cy5vbm1lc3NhZ2UgPSBmdW5jdGlvbihtZXNzYWdlKSB7CisgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTsKKyAgICAgIGNsZWFyVGltZW91dChzYWZldHlUaW1lb3V0KTsKKyAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLmRhdGE7CisgICAgICAvLyQoJyNkYXRhJykuaHRtbChtZXNzYWdlKTsKKyAgICAgIGlmKG1lc3NhZ2UuY2hhckF0KDApID09ICIqIil7CisgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnN1YnN0cmluZygxKTsKKyAgICAgICAgdmFyIG5hbWVzID0gbWVzc2FnZS5zcGxpdCgiLCIpOworICAgICAgICBmb3IgKHZhciBpID0gbnVtRGF0YXM7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICQoJyNkYXRhVGFibGUnKS5hcHBlbmQoJzx0ciBvbkNsaWNrPSJjaGFuZ2VTZWxlY3RlZCgnICsgaSArCisgICAgICAgICAgICAnKSI+PHRkPicgKyBuYW1lc1tpXSArICc8L3RkPjx0ZD48L3RkPjwvdHI+Jyk7CisgICAgICAgICAgbnVtRGF0YXMrKzsKKyAgICAgICAgfQorICAgICAgICBsYXN0U2FtcGxlSUQgPSAwOworICAgICAgfWVsc2V7CisgICAgICAgIHZhciBzYW1wbGVzID0gbWVzc2FnZS5zcGxpdCgiJCIpOworICAgICAgICBmb3IodmFyIHggPSAwO3ggPCBzYW1wbGVzLmxlbmd0aDt4KyspeworICAgICAgICAgIHZhciBpbmZvID0gc2FtcGxlc1t4XS5zcGxpdCgiJSIpOworICAgICAgICAgIGxhc3RTYW1wbGVJRCA9IGluZm9bMF07CisKKyAgICAgICAgICBpZighKHR5cGVvZiBpbmZvWzJdID09PSAidW5kZWZpbmVkIikpeworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGluZm9bMl0uc3BsaXQoIiwiKTsKKyAgICAgICAgICAgIGZvcih2YXIgeSA9IDA7eSA8IHZhbHVlcy5sZW5ndGg7eSsrKXsKKyAgICAgICAgICAgICAgaWYoISh0eXBlb2YgaW5mb1sxXSA9PT0gInVuZGVmaW5lZCIKKyAgICAgICAgICAgICAgICAgICAgfHwgdHlwZW9mIHZhbHVlc1t5XSA9PT0gInVuZGVmaW5lZCIpKXsKKyAgICAgICAgICAgICAgICAkKCcjZGF0YVRhYmxlJykuZmluZCgndHInKS5lcSh5KS5maW5kKCd0ZCcpLmVxKDEpCisgICAgICAgICAgICAgICAgICAudGV4dCh2YWx1ZXNbeV0pOworICAgICAgICAgICAgICAgIGlmKHkgPT0gc2VsZWN0ZWQpeworICAgICAgICAgICAgICAgICAgZHBzLnB1c2goeworICAgICAgICAgICAgICAgICAgICB4OiBwYXJzZUZsb2F0KGluZm9bMV0pLAorICAgICAgICAgICAgICAgICAgICB5OiBwYXJzZUZsb2F0KHZhbHVlc1t5XSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICBpZihkcHMubGVuZ3RoID4gMTAwMDApeworICAgICAgICAgICAgICAgICAgICBkcHMuc2hpZnQoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGFydC5yZW5kZXIoKTsKKyAgICAgIH0KKworICAgICAgaWYocnVuKXsKKyAgICAgICAgc2V0VGltZW91dChyZWZyZXNoLCBpbnRlcnZhbFRpbWUpOworICAgICAgfQorICAgIH07CisKKyAgICAvLyBTb2NrZXQgZXJyb3IsIG1vc3QgbGlrZWx5IGR1ZSB0byBhIHNlcnZlci1zaWRlIGVycm9yLgorICAgIHdzLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikgeworICAgICAgY29uc29sZS5sb2coJ29uZXJyb3IgJyArIGVycm9yKTsKKyAgICAgIHJ1biA9IGZhbHNlOworICAgIH07CisgIH0pOworfQorPC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPScvbGliL2pxdWVyeS0xLjQuNC5qcyc+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPScvbGliL2NhbnZhc2pzLm1pbi5qcyc+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPScvbGliL3JlY29ubmVjdGluZy13ZWJzb2NrZXQubWluLmpzJz48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBzdHlsZT0id2lkdGg6IDEyMDBweDttYXJnaW4tbGVmdDogYXV0bzttYXJnaW4tcmlnaHQ6YXV0byI+CisgIDx0YWJsZSBpZD0iZGF0YVRhYmxlIiBzdHlsZT0id2lkdGg6IDIwMHB4O2NlbGwtc3BhY2luZzowO2NlbGwtcGFkZGluZzowOworICAgIHRleHQtYWxpZ246bGVmdCI+CisgIDwvdGFibGU+CisgIDxkaXYgaWQ9ImNoYXJ0Q29udGFpbmVyIiBzdHlsZT0iaGVpZ2h0OjYwMHB4OyB3aWR0aDoxMDAlOyI+PC9kaXY+CisgIDxkaXYgc3R5bGU9IndpZHRoOiAxMDAwcHg7ZmxvYXQ6IHJpZ2h0Ij4KKyAgICA8cCBpZD0ibWVzc2FnZSIgc3R5bGU9ImNvbG9yOiAjRkYwMDAwIj48L3A+CisgICAgPHAgaWQ9InNlbGVjdGVkIj5TZWxlY3RlZDogMDwvcD4KKyAgICA8cCBpZD0iZGF0YSI+PC9wPgorICA8L2Rpdj4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEveTIwMTUvaHR0cF9zdGF0dXMvd3d3L2xpYi9jYW52YXNqcy5taW4uanMgYi95MjAxNS9odHRwX3N0YXR1cy93d3cvbGliL2NhbnZhc2pzLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ZjODNiCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvaHR0cF9zdGF0dXMvd3d3L2xpYi9jYW52YXNqcy5taW4uanMKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgQ2FudmFzSlMgSFRNTDUgJiBKYXZhU2NyaXB0IENoYXJ0cyAtIHYxLjYuMSBHQS0gaHR0cDovL2NhbnZhc2pzLmNvbS8gCisgQ29weXJpZ2h0IDIwMTMgZmVub3BpeAorKi8KKyhmdW5jdGlvbigpe2Z1bmN0aW9uIE8oYSxiKXthLnByb3RvdHlwZT1BYShiLnByb3RvdHlwZSk7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTthLnBhcmVudD1iLnByb3RvdHlwZX1mdW5jdGlvbiBBYShhKXtmdW5jdGlvbiBiKCl7fWIucHJvdG90eXBlPWE7cmV0dXJuIG5ldyBifWZ1bmN0aW9uIHFhKGEsYixjKXsibWlsbGlzZWNvbmQiPT09Yz9hLnNldE1pbGxpc2Vjb25kcyhhLmdldE1pbGxpc2Vjb25kcygpKzEqYik6InNlY29uZCI9PT1jP2Euc2V0U2Vjb25kcyhhLmdldFNlY29uZHMoKSsxKmIpOiJtaW51dGUiPT09Yz9hLnNldE1pbnV0ZXMoYS5nZXRNaW51dGVzKCkrMSpiKToiaG91ciI9PT1jP2Euc2V0SG91cnMoYS5nZXRIb3VycygpKzEqYik6ImRheSI9PT1jP2Euc2V0RGF0ZShhLmdldERhdGUoKSsxKmIpOiJ3ZWVrIj09PWM/YS5zZXREYXRlKGEuZ2V0RGF0ZSgpKzcqYik6Im1vbnRoIj09PWM/YS5zZXRNb250aChhLmdldE1vbnRoKCkrMSpiKToieWVhciI9PT1jJiZhLnNldEZ1bGxZZWFyKGEuZ2V0RnVsbFllYXIoKSsKKzEqYik7cmV0dXJuIGF9ZnVuY3Rpb24gWShhLGIpe3JldHVybiB6W2IrIkR1cmF0aW9uIl0qYX1mdW5jdGlvbiBLKGEsYil7dmFyIGM9ITE7MD5hJiYoYz0hMCxhKj0tMSk7YT0iIithO2ZvcihiPWI/YjoxO2EubGVuZ3RoPGI7KWE9IjAiK2E7cmV0dXJuIGM/Ii0iK2E6YX1mdW5jdGlvbiBaKGEpe2lmKCFhKXJldHVybiBhO2E9YS5yZXBsYWNlKC9eXHNccyovLCIiKTtmb3IodmFyIGI9L1xzLyxjPWEubGVuZ3RoO2IudGVzdChhLmNoYXJBdCgtLWMpKTspO3JldHVybiBhLnNsaWNlKDAsYysxKX1mdW5jdGlvbiBCYShhKXthLnJvdW5kUmVjdD1mdW5jdGlvbihhLGMsZCxlLGYsZyxrLHApe2smJih0aGlzLmZpbGxTdHlsZT1rKTtwJiYodGhpcy5zdHJva2VTdHlsZT1wKTsidW5kZWZpbmVkIj09PXR5cGVvZiBmJiYoZj01KTt0aGlzLmxpbmVXaWR0aD1nO3RoaXMuYmVnaW5QYXRoKCk7dGhpcy5tb3ZlVG8oYStmLGMpO3RoaXMubGluZVRvKGErZC1mLGMpO3RoaXMucXVhZHJhdGljQ3VydmVUbyhhKworZCxjLGErZCxjK2YpO3RoaXMubGluZVRvKGErZCxjK2UtZik7dGhpcy5xdWFkcmF0aWNDdXJ2ZVRvKGErZCxjK2UsYStkLWYsYytlKTt0aGlzLmxpbmVUbyhhK2YsYytlKTt0aGlzLnF1YWRyYXRpY0N1cnZlVG8oYSxjK2UsYSxjK2UtZik7dGhpcy5saW5lVG8oYSxjK2YpO3RoaXMucXVhZHJhdGljQ3VydmVUbyhhLGMsYStmLGMpO3RoaXMuY2xvc2VQYXRoKCk7ayYmdGhpcy5maWxsKCk7cCYmMDxnJiZ0aGlzLnN0cm9rZSgpfX1mdW5jdGlvbiByYShhLGIpe3JldHVybiBhLWJ9ZnVuY3Rpb24gQ2EoYSxiKXtyZXR1cm4gYS54LWIueH1mdW5jdGlvbiBDKGEpe3ZhciBiPSgoYSYxNjcxMTY4MCk+PjE2KS50b1N0cmluZygxNiksYz0oKGEmNjUyODApPj44KS50b1N0cmluZygxNik7YT0oKGEmMjU1KT4+MCkudG9TdHJpbmcoMTYpO2I9Mj5iLmxlbmd0aD8iMCIrYjpiO2M9Mj5jLmxlbmd0aD8iMCIrYzpjO2E9Mj5hLmxlbmd0aD8iMCIrYTphO3JldHVybiIjIitiK2MrYX1mdW5jdGlvbiBjYShhLAorYixjKXtjPWN8fCJub3JtYWwiO3ZhciBkPWErIl8iK2IrIl8iK2MsZT1zYVtkXTtpZihpc05hTihlKSl7dHJ5e2E9InBvc2l0aW9uOmFic29sdXRlOyBsZWZ0OjBweDsgdG9wOi0yMDAwMHB4OyBwYWRkaW5nOjBweDttYXJnaW46MHB4O2JvcmRlcjpub25lO3doaXRlLXNwYWNlOnByZTtsaW5lLWhlaWdodDpub3JtYWw7Zm9udC1mYW1pbHk6IithKyI7IGZvbnQtc2l6ZToiK2IrInB4OyBmb250LXdlaWdodDoiK2MrIjsiO2lmKCFSKXt2YXIgZj1kb2N1bWVudC5ib2R5O1I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO1IuaW5uZXJIVE1MPSIiO3ZhciBnPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJNcGd5aSIpO1IuYXBwZW5kQ2hpbGQoZyk7Zi5hcHBlbmRDaGlsZChSKX1SLnN0eWxlLmRpc3BsYXk9IiI7Ui5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKTtlPU1hdGgucm91bmQoUi5vZmZzZXRIZWlnaHQpO1Iuc3R5bGUuZGlzcGxheT0ibm9uZSJ9Y2F0Y2goayl7ZT1NYXRoLmNlaWwoMS4xKgorYil9ZT1NYXRoLm1heChlLGIpO3NhW2RdPWV9cmV0dXJuIGV9ZnVuY3Rpb24gRShhLGIsYyxkKXtpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKGIsYyxkfHwhMSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoIm9uIitiLGZ1bmN0aW9uKGIpe2I9Ynx8d2luZG93LmV2ZW50O2IucHJldmVudERlZmF1bHQ9Yi5wcmV2ZW50RGVmYXVsdHx8ZnVuY3Rpb24oKXtiLnJldHVyblZhbHVlPSExfTtiLnN0b3BQcm9wYWdhdGlvbj1iLnN0b3BQcm9wYWdhdGlvbnx8ZnVuY3Rpb24oKXtiLmNhbmNlbEJ1YmJsZT0hMH07Yy5jYWxsKGEsYil9KTtlbHNlIHJldHVybiExfWZ1bmN0aW9uIHRhKGEsYixjKXthKj1IO2IqPUg7YT1jLmdldEltYWdlRGF0YShhLGIsMiwyKS5kYXRhO2I9ITA7Zm9yKGM9MDs0PmM7YysrKWlmKGFbY10hPT1hW2MrNF18YVtjXSE9PWFbYys4XXxhW2NdIT09YVtjKzEyXSl7Yj0hMTticmVha31yZXR1cm4gYj9hWzBdPDwxNnxhWzFdPDwKKzh8YVsyXTowfWZ1bmN0aW9uIHVhKGEsYixjKXt2YXIgZDtkPWE/YSsiRm9udFN0eWxlIjoiZm9udFN0eWxlIjt2YXIgZT1hP2ErIkZvbnRXZWlnaHQiOiJmb250V2VpZ2h0IixmPWE/YSsiRm9udFNpemUiOiJmb250U2l6ZSI7YT1hP2ErIkZvbnRGYW1pbHkiOiJmb250RmFtaWx5IjtkPSIiKyhiW2RdP2JbZF0rIiAiOmMmJmNbZF0/Y1tkXSsiICI6IiIpO2QrPWJbZV0/YltlXSsiICI6YyYmY1tlXT9jW2VdKyIgIjoiIjtkKz1iW2ZdP2JbZl0rInB4ICI6YyYmY1tmXT9jW2ZdKyJweCAiOiIiO2I9YlthXT9iW2FdKyIiOmMmJmNbYV0/Y1thXSsiIjoiIjshdCYmYiYmKGI9Yi5zcGxpdCgiLCIpWzBdLCInIiE9PWJbMF0mJiciJyE9PWJbMF0mJihiPSInIitiKyInIikpO3JldHVybiBkKz1ifWZ1bmN0aW9uIFQoYSxiLGMpe3JldHVybiBhIGluIGI/YlthXTpjW2FdfWZ1bmN0aW9uIGRhKGEsYixjKXtpZih0JiZ2YSl7dmFyIGQ9YS5nZXRDb250ZXh0KCIyZCIpO2VhPWQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8CitkLm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxkLm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxkLmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDE7SD1qYS9lYTthLndpZHRoPWIqSDthLmhlaWdodD1jKkg7amEhPT1lYSYmKGEuc3R5bGUud2lkdGg9YisicHgiLGEuc3R5bGUuaGVpZ2h0PWMrInB4IixkLnNjYWxlKEgsSCkpfWVsc2UgYS53aWR0aD1iLGEuaGVpZ2h0PWN9ZnVuY3Rpb24gVShhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2Muc2V0QXR0cmlidXRlKCJjbGFzcyIsImNhbnZhc2pzLWNoYXJ0LWNhbnZhcyIpO2RhKGMsYSxiKTt0fHwidW5kZWZpbmVkIj09PXR5cGVvZiBHX3ZtbENhbnZhc01hbmFnZXJ8fEdfdm1sQ2FudmFzTWFuYWdlci5pbml0RWxlbWVudChjKTtyZXR1cm4gY31mdW5jdGlvbiB3YShhLGIsYyl7aWYoYSYmYiYmYyl7Yz1jKyIuIisoImpwZWciPT09Yj8ianBnIjpiKTt2YXIgZD0KKyJpbWFnZS8iK2I7YT1hLnRvRGF0YVVSTChkKTt2YXIgZT0hMSxmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtmLmRvd25sb2FkPWM7Zi5ocmVmPWE7Zi50YXJnZXQ9Il9ibGFuayI7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgQmxvYiYmbmV3IEJsb2Ipe2Zvcih2YXIgZz1hLnJlcGxhY2UoL15kYXRhOlthLXovXSo7YmFzZTY0LC8sIiIpLGc9YXRvYihnKSxrPW5ldyBBcnJheUJ1ZmZlcihnLmxlbmd0aCkscD1uZXcgVWludDhBcnJheShrKSxoPTA7aDxnLmxlbmd0aDtoKyspcFtoXT1nLmNoYXJDb2RlQXQoaCk7Yj1uZXcgQmxvYihba10se3R5cGU6ImltYWdlLyIrYn0pO3RyeXt3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IoYixjKSxlPSEwfWNhdGNoKGwpe2YuZGF0YXNldC5kb3dubG9hZHVybD1bZCxmLmRvd25sb2FkLGYuaHJlZl0uam9pbigiOiIpLGYuaHJlZj13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChiKX19aWYoIWUpdHJ5e2V2ZW50PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50cyIpLAorZXZlbnQuaW5pdE1vdXNlRXZlbnQoImNsaWNrIiwhMCwhMSx3aW5kb3csMCwwLDAsMCwwLCExLCExLCExLCExLDAsbnVsbCksZi5kaXNwYXRjaEV2ZW50P2YuZGlzcGF0Y2hFdmVudChldmVudCk6Zi5maXJlRXZlbnQmJmYuZmlyZUV2ZW50KCJvbmNsaWNrIil9Y2F0Y2gocil7Yj13aW5kb3cub3BlbigpLGIuZG9jdW1lbnQud3JpdGUoIjxpbWcgc3JjPSciK2ErIic+PC9pbWc+PGRpdj5QbGVhc2UgcmlnaHQgY2xpY2sgb24gdGhlIGltYWdlIGFuZCBzYXZlIGl0IHRvIHlvdXIgZGV2aWNlPC9kaXY+IiksYi5kb2N1bWVudC5jbG9zZSgpfX19ZnVuY3Rpb24gTShhLGIsYyl7Yi5nZXRBdHRyaWJ1dGUoInN0YXRlIikhPT1jJiYoYi5zZXRBdHRyaWJ1dGUoInN0YXRlIixjKSxiLnNldEF0dHJpYnV0ZSgidHlwZSIsImJ1dHRvbiIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlLm1hcmdpbj0iMHB4IDBweCAwcHggMHB4IixiLnN0eWxlLnBhZGRpbmc9IjNweCA0cHggMHB4IDRweCIsCitiLnN0eWxlLmNzc0Zsb2F0PSJsZWZ0IixiLnNldEF0dHJpYnV0ZSgidGl0bGUiLGEuX2N1bHR1cmVJbmZvW2MrIlRleHQiXSksYi5pbm5lckhUTUw9IjxpbWcgc3R5bGU9J2hlaWdodDoxNnB4Oycgc3JjPSciK0RhW2NdLmltYWdlKyInIGFsdD0nIithLl9jdWx0dXJlSW5mb1tjKyJUZXh0Il0rIicgLz4iKX1mdW5jdGlvbiBrYSgpe2Zvcih2YXIgYT1udWxsLGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7YisrKWE9YXJndW1lbnRzW2JdLGEuc3R5bGUmJihhLnN0eWxlLmRpc3BsYXk9ImlubGluZSIpfWZ1bmN0aW9uIFMoKXtmb3IodmFyIGE9bnVsbCxiPTA7Yjxhcmd1bWVudHMubGVuZ3RoO2IrKykoYT1hcmd1bWVudHNbYl0pJiZhLnN0eWxlJiYoYS5zdHlsZS5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gTChhLGIsYyl7dGhpcy5fZGVmYXVsdHNLZXk9YTt2YXIgZD17fTtjJiYoV1tjXSYmV1tjXVthXSkmJihkPVdbY11bYV0pO3RoaXMuX29wdGlvbnM9Yj9iOnt9O3RoaXMuc2V0T3B0aW9ucyh0aGlzLl9vcHRpb25zLAorZCl9ZnVuY3Rpb24gdihhLGIsYyl7dGhpcy5fcHVibGljQ2hhcnRSZWZlcmVuY2U9YztiPWJ8fHt9O3YucGFyZW50LmNvbnN0cnVjdG9yLmNhbGwodGhpcywiQ2hhcnQiLGIsYi50aGVtZT9iLnRoZW1lOiJ0aGVtZTEiKTt2YXIgZD10aGlzO3RoaXMuX2NvbnRhaW5lcklkPWE7dGhpcy5fb2JqZWN0c0luaXRpYWxpemVkPSExO3RoaXMub3ZlcmxhaWRDYW52YXNDdHg9dGhpcy5jdHg9bnVsbDt0aGlzLl9pbmRleExhYmVscz1bXTt0aGlzLl9wYW5UaW1lcklkPTA7dGhpcy5fbGFzdFRvdWNoRXZlbnRUeXBlPSIiO3RoaXMuX2xhc3RUb3VjaERhdGE9bnVsbDt0aGlzLmlzQW5pbWF0aW5nPSExO3RoaXMucmVuZGVyQ291bnQ9MDt0aGlzLnBhbkVuYWJsZWQ9dGhpcy5kaXNhYmxlVG9vbFRpcD10aGlzLmFuaW1hdGVkUmVuZGVyPSExO3RoaXMuX2RlZmF1bHRDdXJzb3I9ImRlZmF1bHQiO3RoaXMucGxvdEFyZWE9e2NhbnZhczpudWxsLGN0eDpudWxsLHgxOjAseTE6MCx4MjowLHkyOjAsd2lkdGg6MCwKK2hlaWdodDowfTt0aGlzLl9kYXRhSW5SZW5kZXJlZE9yZGVyPVtdOyh0aGlzLl9jb250YWluZXI9InN0cmluZyI9PT10eXBlb2YgdGhpcy5fY29udGFpbmVySWQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fY29udGFpbmVySWQpOnRoaXMuX2NvbnRhaW5lcklkKT8odGhpcy5fY29udGFpbmVyLmlubmVySFRNTD0iIixiPWE9MCxhPXRoaXMuX29wdGlvbnMud2lkdGg/dGhpcy53aWR0aDowPHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aD90aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGg6dGhpcy53aWR0aCxiPXRoaXMuX29wdGlvbnMuaGVpZ2h0P3RoaXMuaGVpZ2h0OjA8dGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodD90aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0OnRoaXMuaGVpZ2h0LHRoaXMud2lkdGg9YSx0aGlzLmhlaWdodD1iLHRoaXMuX3NlbGVjdGVkQ29sb3JTZXQ9InVuZGVmaW5lZCIhPT10eXBlb2YgVlt0aGlzLmNvbG9yU2V0XT9WW3RoaXMuY29sb3JTZXRdOgorVi5jb2xvclNldDEsdGhpcy5fY2FudmFzSlNDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fY2FudmFzSlNDb250YWluZXIuc2V0QXR0cmlidXRlKCJjbGFzcyIsImNhbnZhc2pzLWNoYXJ0LWNvbnRhaW5lciIpLHRoaXMuX2NhbnZhc0pTQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5fY2FudmFzSlNDb250YWluZXIuc3R5bGUudGV4dEFsaWduPSJsZWZ0Iix0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5zdHlsZS5jdXJzb3I9ImF1dG8iLHR8fCh0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5zdHlsZS5oZWlnaHQ9IjBweCIpLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXNKU0NvbnRhaW5lciksdGhpcy5jYW52YXM9VShhLGIpLHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYW52YXMuZ2V0Q29udGV4dCYmKHRoaXMuX2NhbnZhc0pTQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKSwKK3RoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIiksdGhpcy5jdHgudGV4dEJhc2VsaW5lPSJ0b3AiLEJhKHRoaXMuY3R4KSx0P3RoaXMucGxvdEFyZWEuY3R4PXRoaXMuY3R4Oih0aGlzLnBsb3RBcmVhLmNhbnZhcz1VKGEsYiksdGhpcy5wbG90QXJlYS5jYW52YXMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnBsb3RBcmVhLmNhbnZhcy5zZXRBdHRyaWJ1dGUoImNsYXNzIiwicGxvdEFyZWFDYW52YXMiKSx0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnBsb3RBcmVhLmNhbnZhcyksdGhpcy5wbG90QXJlYS5jdHg9dGhpcy5wbG90QXJlYS5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKSksdGhpcy5vdmVybGFpZENhbnZhcz1VKGEsYiksdGhpcy5vdmVybGFpZENhbnZhcy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuX2NhbnZhc0pTQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMub3ZlcmxhaWRDYW52YXMpLHRoaXMub3ZlcmxhaWRDYW52YXNDdHg9Cit0aGlzLm92ZXJsYWlkQ2FudmFzLmdldENvbnRleHQoIjJkIiksdGhpcy5vdmVybGFpZENhbnZhc0N0eC50ZXh0QmFzZWxpbmU9InRvcCIsdGhpcy5fZXZlbnRNYW5hZ2VyPW5ldyAkKHRoaXMpLEUod2luZG93LCJyZXNpemUiLGZ1bmN0aW9uKCl7ZC5fdXBkYXRlU2l6ZSgpJiZkLnJlbmRlcigpfSksdGhpcy5fdG9vbEJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLl90b29sQmFyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJjYW52YXNqcy1jaGFydC10b29sYmFyIiksdGhpcy5fdG9vbEJhci5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAycHg7IHRvcDogMHB4OyIsdGhpcy5fY2FudmFzSlNDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fdG9vbEJhciksdGhpcy5ib3VuZHM9e3gxOjAseTE6MCx4Mjp0aGlzLndpZHRoLHkyOnRoaXMuaGVpZ2h0fSxFKHRoaXMub3ZlcmxhaWRDYW52YXMsImNsaWNrIixmdW5jdGlvbihhKXtkLl9tb3VzZUV2ZW50SGFuZGxlcihhKX0pLAorRSh0aGlzLm92ZXJsYWlkQ2FudmFzLCJtb3VzZW1vdmUiLGZ1bmN0aW9uKGEpe2QuX21vdXNlRXZlbnRIYW5kbGVyKGEpfSksRSh0aGlzLm92ZXJsYWlkQ2FudmFzLCJtb3VzZXVwIixmdW5jdGlvbihhKXtkLl9tb3VzZUV2ZW50SGFuZGxlcihhKX0pLEUodGhpcy5vdmVybGFpZENhbnZhcywibW91c2Vkb3duIixmdW5jdGlvbihhKXtkLl9tb3VzZUV2ZW50SGFuZGxlcihhKTtTKGQuX2Ryb3Bkb3duTWVudSl9KSxFKHRoaXMub3ZlcmxhaWRDYW52YXMsIm1vdXNlb3V0IixmdW5jdGlvbihhKXtkLl9tb3VzZUV2ZW50SGFuZGxlcihhKX0pLEUodGhpcy5vdmVybGFpZENhbnZhcyx3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ/Ik1TUG9pbnRlckRvd24iOiJ0b3VjaHN0YXJ0IixmdW5jdGlvbihhKXtkLl90b3VjaEV2ZW50SGFuZGxlcihhKX0pLEUodGhpcy5vdmVybGFpZENhbnZhcyx3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ/Ik1TUG9pbnRlck1vdmUiOiJ0b3VjaG1vdmUiLAorZnVuY3Rpb24oYSl7ZC5fdG91Y2hFdmVudEhhbmRsZXIoYSl9KSxFKHRoaXMub3ZlcmxhaWRDYW52YXMsd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkPyJNU1BvaW50ZXJVcCI6InRvdWNoZW5kIixmdW5jdGlvbihhKXtkLl90b3VjaEV2ZW50SGFuZGxlcihhKX0pLEUodGhpcy5vdmVybGFpZENhbnZhcyx3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ/Ik1TUG9pbnRlckNhbmNlbCI6InRvdWNoY2FuY2VsIixmdW5jdGlvbihhKXtkLl90b3VjaEV2ZW50SGFuZGxlcihhKX0pLHRoaXMuX2NyZWRpdExpbmt8fCh0aGlzLl9jcmVkaXRMaW5rPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSx0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJjYW52YXNqcy1jaGFydC1jcmVkaXQiKSx0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJvdXRsaW5lOm5vbmU7bWFyZ2luOjBweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDozcHg7dG9wOiIrCisodGhpcy5oZWlnaHQtMTQpKyJweDtjb2xvcjpkaW1ncmV5O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5Okx1Y2lkYSBHcmFuZGUsIEx1Y2lkYSBTYW5zIFVuaWNvZGUsIEFyaWFsLCBzYW5zLXNlcmlmIiksdGhpcy5fY3JlZGl0TGluay5zZXRBdHRyaWJ1dGUoInRhYkluZGV4IiwtMSksdGhpcy5fY3JlZGl0TGluay5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIl9ibGFuayIpKSx0aGlzLl90b29sVGlwPW5ldyBOKHRoaXMsdGhpcy5fb3B0aW9ucy50b29sVGlwLHRoaXMudGhlbWUpLHRoaXMubGF5b3V0TWFuYWdlcj1uZXcgYWEodGhpcyksdGhpcy5heGlzWTI9dGhpcy5heGlzWT10aGlzLmF4aXNYPXRoaXMuZGF0YT1udWxsLHRoaXMuc2Vzc2lvblZhcmlhYmxlcz17YXhpc1g6e2ludGVybmFsTWluaW11bTpudWxsLGludGVybmFsTWF4aW11bTpudWxsfSxheGlzWTp7aW50ZXJuYWxNaW5pbXVtOm51bGwsaW50ZXJuYWxNYXhpbXVtOm51bGx9LGF4aXNZMjp7aW50ZXJuYWxNaW5pbXVtOm51bGwsCitpbnRlcm5hbE1heGltdW06bnVsbH19KSk6d2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZygnQ2FudmFzSlMgRXJyb3I6IENoYXJ0IENvbnRhaW5lciB3aXRoIGlkICInK3RoaXMuX2NvbnRhaW5lcklkKyciIHdhcyBub3QgZm91bmQnKX1mdW5jdGlvbiBmYShhLGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMD09ZCljLnB1c2goYVswXSk7ZWxzZXt2YXIgZSxmLGc7Zz1kLTE7ZT0wPT09Zz8wOmctMTtmPWc9PT1hLmxlbmd0aC0xP2c6ZysxO2NbYy5sZW5ndGhdPXt4OmFbZ10ueCsoYVtmXS54LWFbZV0ueCkvYi8zLHk6YVtnXS55KyhhW2ZdLnktYVtlXS55KS9iLzN9O2c9ZDtlPTA9PT1nPzA6Zy0xO2Y9Zz09PWEubGVuZ3RoLTE/ZzpnKzE7Y1tjLmxlbmd0aF09e3g6YVtnXS54LShhW2ZdLngtYVtlXS54KS9iLzMseTphW2ddLnktKGFbZl0ueS1hW2VdLnkpL2IvM307Y1tjLmxlbmd0aF09YVtkXX1yZXR1cm4gY31mdW5jdGlvbiBhYShhKXt0aGlzLl9yaWdodE9jY3VwaWVkPQordGhpcy5fbGVmdE9jY3VwaWVkPXRoaXMuX2JvdHRvbU9jY3VwaWVkPXRoaXMuX3RvcE9jY3VwaWVkPTA7dGhpcy5jaGFydD1hfWZ1bmN0aW9uIEkoYSxiKXtJLnBhcmVudC5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIlRleHRCbG9jayIsYik7dGhpcy5jdHg9YTt0aGlzLl9pc0RpcnR5PSEwO3RoaXMuX3dyYXBwZWRUZXh0PW51bGw7dGhpcy5fbGluZUhlaWdodD1jYSh0aGlzLmZvbnRGYW1pbHksdGhpcy5mb250U2l6ZSx0aGlzLmZvbnRXZWlnaHQpfWZ1bmN0aW9uIGJhKGEsYil7YmEucGFyZW50LmNvbnN0cnVjdG9yLmNhbGwodGhpcywiVGl0bGUiLGIsYS50aGVtZSk7dGhpcy5jaGFydD1hO3RoaXMuY2FudmFzPWEuY2FudmFzO3RoaXMuY3R4PXRoaXMuY2hhcnQuY3R4OyJ1bmRlZmluZWQiPT09dHlwZW9mIHRoaXMuX29wdGlvbnMuZm9udFNpemUmJih0aGlzLmZvbnRTaXplPXRoaXMuY2hhcnQuZ2V0QXV0b0ZvbnRTaXplKHRoaXMuZm9udFNpemUpKTt0aGlzLmhlaWdodD10aGlzLndpZHRoPQorbnVsbDt0aGlzLmJvdW5kcz17eDE6bnVsbCx5MTpudWxsLHgyOm51bGwseTI6bnVsbH19ZnVuY3Rpb24gZ2EoYSxiLGMpe2dhLnBhcmVudC5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIkxlZ2VuZCIsYixjKTt0aGlzLmNoYXJ0PWE7dGhpcy5jYW52YXM9YS5jYW52YXM7dGhpcy5jdHg9dGhpcy5jaGFydC5jdHg7dGhpcy5naG9zdEN0eD10aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIuZ2hvc3RDdHg7dGhpcy5pdGVtcz1bXTt0aGlzLmhlaWdodD10aGlzLndpZHRoPTA7dGhpcy5vcmllbnRhdGlvbj1udWxsO3RoaXMuaG9yaXpvbnRhbFNwYWNpbmc9MTA7dGhpcy5kYXRhU2VyaWVzPVtdO3RoaXMuYm91bmRzPXt4MTpudWxsLHkxOm51bGwseDI6bnVsbCx5MjpudWxsfTsidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9vcHRpb25zLmZvbnRTaXplJiYodGhpcy5mb250U2l6ZT10aGlzLmNoYXJ0LmdldEF1dG9Gb250U2l6ZSh0aGlzLmZvbnRTaXplKSk7dGhpcy5saW5lSGVpZ2h0PWNhKHRoaXMuZm9udEZhbWlseSwKK3RoaXMuZm9udFNpemUsdGhpcy5mb250V2VpZ2h0KX1mdW5jdGlvbiBsYShhLGIpe2xhLnBhcmVudC5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYik7dGhpcy5jaGFydD1hO3RoaXMuY2FudmFzPWEuY2FudmFzO3RoaXMuY3R4PXRoaXMuY2hhcnQuY3R4fWZ1bmN0aW9uIFAoYSxiLGMsZCxlKXtQLnBhcmVudC5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIkRhdGFTZXJpZXMiLGIsYyk7dGhpcy5jaGFydD1hO3RoaXMuY2FudmFzPWEuY2FudmFzO3RoaXMuX2N0eD1hLmNhbnZhcy5jdHg7dGhpcy5pbmRleD1kO3RoaXMubm9EYXRhUG9pbnRzSW5QbG90QXJlYT0wO3RoaXMuaWQ9ZTt0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2VdPXtpZDplLG9iamVjdFR5cGU6ImRhdGFTZXJpZXMiLGRhdGFTZXJpZXNJbmRleDpkfTt0aGlzLmRhdGFQb2ludElkcz1bXTt0aGlzLnBsb3RVbml0PVtdO3RoaXMuYXhpc1k9dGhpcy5heGlzWD1udWxsO251bGw9PT10aGlzLmZpbGxPcGFjaXR5JiYodGhpcy50eXBlLm1hdGNoKC9hcmVhL2kpPwordGhpcy5maWxsT3BhY2l0eT0wLjc6dGhpcy5maWxsT3BhY2l0eT0xKTt0aGlzLmF4aXNQbGFjZW1lbnQ9dGhpcy5nZXREZWZhdWx0QXhpc1BsYWNlbWVudCgpOyJ1bmRlZmluZWQiPT09dHlwZW9mIHRoaXMuX29wdGlvbnMuaW5kZXhMYWJlbEZvbnRTaXplJiYodGhpcy5pbmRleExhYmVsRm9udFNpemU9dGhpcy5jaGFydC5nZXRBdXRvRm9udFNpemUodGhpcy5pbmRleExhYmVsRm9udFNpemUpKX1mdW5jdGlvbiBBKGEsYixjLGQpe0EucGFyZW50LmNvbnN0cnVjdG9yLmNhbGwodGhpcywiQXhpcyIsYixhLnRoZW1lKTt0aGlzLmNoYXJ0PWE7dGhpcy5jYW52YXM9YS5jYW52YXM7dGhpcy5jdHg9YS5jdHg7dGhpcy5pbnRlcnZhbHN0YXJ0VGltZVBlcmNlbnQ9dGhpcy5tYXhIZWlnaHQ9dGhpcy5tYXhXaWR0aD0wO3RoaXMubGFiZWxzPVtdO3RoaXMuX2xhYmVscz1udWxsO3RoaXMuZGF0YUluZm89e21pbjpJbmZpbml0eSxtYXg6LUluZmluaXR5LHZpZXdQb3J0TWluOkluZmluaXR5LHZpZXdQb3J0TWF4Oi1JbmZpbml0eSwKK21pbkRpZmY6SW5maW5pdHl9OyJheGlzWCI9PT1jPyh0aGlzLnNlc3Npb25WYXJpYWJsZXM9dGhpcy5jaGFydC5zZXNzaW9uVmFyaWFibGVzW2NdLHRoaXMuX29wdGlvbnMuaW50ZXJ2YWx8fCh0aGlzLmludGVydmFsVHlwZT1udWxsKSk6dGhpcy5zZXNzaW9uVmFyaWFibGVzPSJsZWZ0Ij09PWR8fCJ0b3AiPT09ZD90aGlzLmNoYXJ0LnNlc3Npb25WYXJpYWJsZXMuYXhpc1k6dGhpcy5jaGFydC5zZXNzaW9uVmFyaWFibGVzLmF4aXNZMjsidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9vcHRpb25zLnRpdGxlRm9udFNpemUmJih0aGlzLnRpdGxlRm9udFNpemU9dGhpcy5jaGFydC5nZXRBdXRvRm9udFNpemUodGhpcy50aXRsZUZvbnRTaXplKSk7InVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5fb3B0aW9ucy5sYWJlbEZvbnRTaXplJiYodGhpcy5sYWJlbEZvbnRTaXplPXRoaXMuY2hhcnQuZ2V0QXV0b0ZvbnRTaXplKHRoaXMubGFiZWxGb250U2l6ZSkpO3RoaXMudHlwZT1jOyJheGlzWCIhPT0KK2N8fGImJiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ3JpZFRoaWNrbmVzc3x8KHRoaXMuZ3JpZFRoaWNrbmVzcz0wKTt0aGlzLl9wb3NpdGlvbj1kO3RoaXMubGluZUNvb3JkaW5hdGVzPXt4MTpudWxsLHkxOm51bGwseDI6bnVsbCx5MjpudWxsLHdpZHRoOm51bGx9O3RoaXMubGFiZWxBbmdsZT0odGhpcy5sYWJlbEFuZ2xlJTM2MCszNjApJTM2MDs5MDx0aGlzLmxhYmVsQW5nbGUmJjI3MD49dGhpcy5sYWJlbEFuZ2xlP3RoaXMubGFiZWxBbmdsZS09MTgwOjE4MDx0aGlzLmxhYmVsQW5nbGUmJjI3MD49dGhpcy5sYWJlbEFuZ2xlP3RoaXMubGFiZWxBbmdsZS09MTgwOjI3MDx0aGlzLmxhYmVsQW5nbGUmJjM2MD49dGhpcy5sYWJlbEFuZ2xlJiYodGhpcy5sYWJlbEFuZ2xlLT0zNjApO2lmKHRoaXMuX29wdGlvbnMuc3RyaXBMaW5lcyYmMDx0aGlzLl9vcHRpb25zLnN0cmlwTGluZXMubGVuZ3RoKWZvcih0aGlzLnN0cmlwTGluZXM9W10sYj0wO2I8dGhpcy5fb3B0aW9ucy5zdHJpcExpbmVzLmxlbmd0aDtiKyspdGhpcy5zdHJpcExpbmVzLnB1c2gobmV3IG1hKHRoaXMuY2hhcnQsCit0aGlzLl9vcHRpb25zLnN0cmlwTGluZXNbYl0sYS50aGVtZSwrK3RoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5sYXN0T2JqZWN0SWQpKTt0aGlzLl9hYnNvbHV0ZU1heGltdW09dGhpcy5fYWJzb2x1dGVNaW5pbXVtPXRoaXMuX3RpdGxlVGV4dEJsb2NrPW51bGw7dGhpcy5oYXNPcHRpb25DaGFuZ2VkKCJtaW5pbXVtIikmJih0aGlzLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNaW5pbXVtPXRoaXMubWluaW11bSk7dGhpcy5oYXNPcHRpb25DaGFuZ2VkKCJtYXhpbXVtIikmJih0aGlzLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNYXhpbXVtPXRoaXMubWF4aW11bSk7dGhpcy50cmFja0NoYW5nZXMoIm1pbmltdW0iKTt0aGlzLnRyYWNrQ2hhbmdlcygibWF4aW11bSIpfWZ1bmN0aW9uIG1hKGEsYixjLGQpe21hLnBhcmVudC5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIlN0cmlwTGluZSIsYixjKTt0aGlzLl90aGlja25lc3NUeXBlPSJwaXhlbCI7dGhpcy5pZD1kO251bGwhPT10aGlzLnN0YXJ0VmFsdWUmJgorbnVsbCE9PXRoaXMuZW5kVmFsdWUmJih0aGlzLnZhbHVlPSgodGhpcy5zdGFydFZhbHVlLmdldFRpbWU/dGhpcy5zdGFydFZhbHVlLmdldFRpbWUoKTp0aGlzLnN0YXJ0VmFsdWUpKyh0aGlzLmVuZFZhbHVlLmdldFRpbWU/dGhpcy5lbmRWYWx1ZS5nZXRUaW1lKCk6dGhpcy5lbmRWYWx1ZSkpLzIsdGhpcy50aGlja25lc3M9TWF0aC5tYXgodGhpcy5lbmRWYWx1ZS10aGlzLnN0YXJ0VmFsdWUpLHRoaXMuX3RoaWNrbmVzc1R5cGU9InZhbHVlIil9ZnVuY3Rpb24gTihhLGIsYyl7Ti5wYXJlbnQuY29uc3RydWN0b3IuY2FsbCh0aGlzLCJUb29sVGlwIixiLGMpO3RoaXMuY2hhcnQ9YTt0aGlzLmNhbnZhcz1hLmNhbnZhczt0aGlzLmN0eD10aGlzLmNoYXJ0LmN0eDt0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleD10aGlzLmN1cnJlbnRTZXJpZXNJbmRleD0tMTt0aGlzLl90aW1lcklkPTA7dGhpcy5fcHJldlk9dGhpcy5fcHJldlg9TmFOO3RoaXMuX2luaXRpYWxpemUoKX1mdW5jdGlvbiAkKGEpe3RoaXMuY2hhcnQ9CithO3RoaXMubGFzdE9iamVjdElkPTA7dGhpcy5vYmplY3RNYXA9W107dGhpcy5yZWN0YW5ndWxhclJlZ2lvbkV2ZW50U3Vic2NyaXB0aW9ucz1bXTt0aGlzLnByZXZpb3VzRGF0YVBvaW50RXZlbnRPYmplY3Q9bnVsbDt0aGlzLmdob3N0Q2FudmFzPVUodGhpcy5jaGFydC53aWR0aCx0aGlzLmNoYXJ0LmhlaWdodCk7dGhpcy5naG9zdEN0eD10aGlzLmdob3N0Q2FudmFzLmdldENvbnRleHQoIjJkIik7dGhpcy5tb3VzZW92ZXJlZE9iamVjdE1hcHM9W119ZnVuY3Rpb24geGEoYSxiKXt2YXIgYztiJiZuYVtiXSYmKGM9bmFbYl0pO2JhLnBhcmVudC5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIkN1bHR1cmVJbmZvIixjLGEudGhlbWUpO3RoaXMuY2hhcnQ9YTt0aGlzLmNhbnZhcz1hLmNhbnZhczt0aGlzLmN0eD10aGlzLmNoYXJ0LmN0eH1mdW5jdGlvbiBvYShhKXt0aGlzLmNoYXJ0PWE7dGhpcy5jdHg9dGhpcy5jaGFydC5wbG90QXJlYS5jdHg7dGhpcy5hbmltYXRpb25zPVtdO3RoaXMuYW5pbWF0aW9uUmVxdWVzdElkPQorbnVsbH12YXIgdD0hIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQsaGE9e0NoYXJ0Ont3aWR0aDo1MDAsaGVpZ2h0OjQwMCx6b29tRW5hYmxlZDohMSxiYWNrZ3JvdW5kQ29sb3I6IndoaXRlIix0aGVtZToidGhlbWUxIixhbmltYXRpb25FbmFibGVkOiExLGFuaW1hdGlvbkR1cmF0aW9uOjEyMDAsY29sb3JTZXQ6ImNvbG9yU2V0MSIsY3VsdHVyZToiZW4iLGNyZWRpdFRleHQ6IkNhbnZhc0pTLmNvbSIsaW50ZXJhY3Rpdml0eUVuYWJsZWQ6ITAsZXhwb3J0RW5hYmxlZDohMSxleHBvcnRGaWxlTmFtZToiQ2hhcnQifSxUaXRsZTp7cGFkZGluZzowLHRleHQ6bnVsbCx2ZXJ0aWNhbEFsaWduOiJ0b3AiLGhvcml6b250YWxBbGlnbjoiY2VudGVyIixmb250U2l6ZToyMCxmb250RmFtaWx5OiJDYWxpYnJpIixmb250V2VpZ2h0OiJub3JtYWwiLGZvbnRDb2xvcjoiYmxhY2siLGZvbnRTdHlsZToibm9ybWFsIixib3JkZXJUaGlja25lc3M6MCxib3JkZXJDb2xvcjoiYmxhY2siLAorY29ybmVyUmFkaXVzOjAsYmFja2dyb3VuZENvbG9yOm51bGwsbWFyZ2luOjV9LExlZ2VuZDp7bmFtZTpudWxsLHZlcnRpY2FsQWxpZ246ImNlbnRlciIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsZm9udFNpemU6MTQsZm9udEZhbWlseToiY2FsaWJyaSIsZm9udFdlaWdodDoibm9ybWFsIixmb250Q29sb3I6ImJsYWNrIixmb250U3R5bGU6Im5vcm1hbCIsY3Vyc29yOm51bGwsaXRlbW1vdXNlb3ZlcjpudWxsLGl0ZW1tb3VzZW91dDpudWxsLGl0ZW1tb3VzZW1vdmU6bnVsbCxpdGVtY2xpY2s6bnVsbH0sVG9vbFRpcDp7ZW5hYmxlZDohMCxib3JkZXJDb2xvcjpudWxsLHNoYXJlZDohMSxhbmltYXRpb25FbmFibGVkOiEwLGNvbnRlbnQ6bnVsbH0sQXhpczp7bWluaW11bTpudWxsLG1heGltdW06bnVsbCxpbnRlcnZhbDpudWxsLGludGVydmFsVHlwZTpudWxsLHRpdGxlOm51bGwsdGl0bGVGb250Q29sb3I6ImJsYWNrIix0aXRsZUZvbnRTaXplOjIwLHRpdGxlRm9udEZhbWlseToiYXJpYWwiLAordGl0bGVGb250V2VpZ2h0OiJub3JtYWwiLHRpdGxlRm9udFN0eWxlOiJub3JtYWwiLGxhYmVsQW5nbGU6MCxsYWJlbEZvbnRGYW1pbHk6ImFyaWFsIixsYWJlbEZvbnRDb2xvcjoiYmxhY2siLGxhYmVsRm9udFNpemU6MTIsbGFiZWxGb250V2VpZ2h0OiJub3JtYWwiLGxhYmVsRm9udFN0eWxlOiJub3JtYWwiLGxhYmVsQXV0b0ZpdDohMSxsYWJlbFdyYXA6ITAsbGFiZWxNYXhXaWR0aDpudWxsLHByZWZpeDoiIixzdWZmaXg6IiIsaW5jbHVkZVplcm86ITAsdGlja0xlbmd0aDo1LHRpY2tDb2xvcjoiYmxhY2siLHRpY2tUaGlja25lc3M6MSxsaW5lQ29sb3I6ImJsYWNrIixsaW5lVGhpY2tuZXNzOjEsZ3JpZENvbG9yOiJBMEEwQTAiLGdyaWRUaGlja25lc3M6MCxpbnRlcmxhY2VkQ29sb3I6bnVsbCx2YWx1ZUZvcm1hdFN0cmluZzpudWxsLG1hcmdpbjoyLHN0cmlwTGluZXM6W119LFN0cmlwTGluZTp7dmFsdWU6bnVsbCxzdGFydFZhbHVlOm51bGwsZW5kVmFsdWU6bnVsbCxjb2xvcjoib3JhbmdlIiwKK3RoaWNrbmVzczoyLGxhYmVsOiIiLGxhYmVsQmFja2dyb3VuZENvbG9yOiIjRUVFRUVFIixsYWJlbEZvbnRGYW1pbHk6ImFyaWFsIixsYWJlbEZvbnRDb2xvcjoib3JhbmdlIixsYWJlbEZvbnRTaXplOjEyLGxhYmVsRm9udFdlaWdodDoibm9ybWFsIixsYWJlbEZvbnRTdHlsZToibm9ybWFsIn0sRGF0YVNlcmllczp7bmFtZTpudWxsLGRhdGFQb2ludHM6bnVsbCxsYWJlbDoiIixiZXZlbEVuYWJsZWQ6ITEsY3Vyc29yOm51bGwsaW5kZXhMYWJlbDoiIixpbmRleExhYmVsUGxhY2VtZW50OiJhdXRvIixpbmRleExhYmVsT3JpZW50YXRpb246Imhvcml6b250YWwiLGluZGV4TGFiZWxGb250Q29sb3I6ImJsYWNrIixpbmRleExhYmVsRm9udFNpemU6MTIsaW5kZXhMYWJlbEZvbnRTdHlsZToibm9ybWFsIixpbmRleExhYmVsRm9udEZhbWlseToiQXJpYWwiLGluZGV4TGFiZWxGb250V2VpZ2h0OiJub3JtYWwiLGluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3I6bnVsbCxpbmRleExhYmVsTGluZUNvbG9yOm51bGwsCitpbmRleExhYmVsTGluZVRoaWNrbmVzczoxLGluZGV4TGFiZWxNYXhXaWR0aDpudWxsLGluZGV4TGFiZWxXcmFwOiEwLGxpbmVUaGlja25lc3M6Mixjb2xvcjpudWxsLHJpc2luZ0NvbG9yOiJ3aGl0ZSIsZmlsbE9wYWNpdHk6bnVsbCxzdGFydEFuZ2xlOjAsdHlwZToiY29sdW1uIix4VmFsdWVUeXBlOiJudW1iZXIiLGF4aXNZVHlwZToicHJpbWFyeSIseFZhbHVlRm9ybWF0U3RyaW5nOm51bGwseVZhbHVlRm9ybWF0U3RyaW5nOm51bGwselZhbHVlRm9ybWF0U3RyaW5nOm51bGwscGVyY2VudEZvcm1hdFN0cmluZzpudWxsLHNob3dJbkxlZ2VuZDpudWxsLGxlZ2VuZE1hcmtlclR5cGU6bnVsbCxsZWdlbmRNYXJrZXJDb2xvcjpudWxsLGxlZ2VuZFRleHQ6bnVsbCxsZWdlbmRNYXJrZXJCb3JkZXJDb2xvcjpudWxsLGxlZ2VuZE1hcmtlckJvcmRlclRoaWNrbmVzczpudWxsLG1hcmtlclR5cGU6ImNpcmNsZSIsbWFya2VyQ29sb3I6bnVsbCxtYXJrZXJTaXplOm51bGwsbWFya2VyQm9yZGVyQ29sb3I6bnVsbCwKK21hcmtlckJvcmRlclRoaWNrbmVzczpudWxsLG1vdXNlb3ZlcjpudWxsLG1vdXNlb3V0Om51bGwsbW91c2Vtb3ZlOm51bGwsY2xpY2s6bnVsbCx0b29sVGlwQ29udGVudDpudWxsLHZpc2libGU6ITB9LEN1bHR1cmVJbmZvOntkZWNpbWFsU2VwYXJhdG9yOiIuIixkaWdpdEdyb3VwU2VwYXJhdG9yOiIsIix6b29tVGV4dDoiWm9vbSIscGFuVGV4dDoiUGFuIixyZXNldFRleHQ6IlJlc2V0IixtZW51VGV4dDoiTW9yZSBPcHRpb25zIixzYXZlSlBHVGV4dDoiU2F2ZSBhcyBKUEciLHNhdmVQTkdUZXh0OiJTYXZlIGFzIFBORyIsZGF5czoiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkiLnNwbGl0KCIgIiksc2hvcnREYXlzOiJTdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXQiLnNwbGl0KCIgIiksbW9udGhzOiJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpLAorc2hvcnRNb250aHM6IkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjIi5zcGxpdCgiICIpfSxUZXh0QmxvY2s6e3g6MCx5OjAsd2lkdGg6bnVsbCxoZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1heEhlaWdodDpudWxsLHBhZGRpbmc6MCxhbmdsZTowLHRleHQ6IiIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6ImNhbGlicmkiLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udENvbG9yOiJibGFjayIsZm9udFN0eWxlOiJub3JtYWwiLGJvcmRlclRoaWNrbmVzczowLGJvcmRlckNvbG9yOiJibGFjayIsY29ybmVyUmFkaXVzOjAsYmFja2dyb3VuZENvbG9yOm51bGwsdGV4dEJhc2VsaW5lOiJ0b3AifX0sbmE9e2VuOnt9fSxWPXtjb2xvclNldDE6IiMzNjlFQUQgI0MyNDY0MiAjN0Y2MDg0ICM4NkI0MDIgI0EyRDFDRiAjQzhCNjMxICM2REJDRUIgIzUyNTE0RSAjNEY4MUJDICNBMDY0QTEgI0Y3OTY0NyIuc3BsaXQoIiAiKSwKK2NvbG9yU2V0MjoiIzRGODFCQyAjQzA1MDRFICM5QkJCNTggIzIzQkZBQSAjODA2NEExICM0QUFDQzUgI0Y3OTY0NyAjMzM1NThCIi5zcGxpdCgiICIpLGNvbG9yU2V0MzoiIzhDQTFCQyAjMzY4NDVDICMwMTdFODIgIzhDQjlEMCAjNzA4Qzk4ICM5NDgzOEQgI0YwODg5MSAjMDM2NkE3ICMwMDgyNzYgI0VFNzc1NyAjRTVCQTNBICNGMjk5MEIgIzAzNTU3QiAjNzgyOTcwIi5zcGxpdCgiICIpfSxXPXt0aGVtZTE6e0NoYXJ0Ontjb2xvclNldDoiY29sb3JTZXQxIn0sVGl0bGU6e2ZvbnRGYW1pbHk6dD8iQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWYiOiJjYWxpYnJpIixmb250U2l6ZTozMyxmb250Q29sb3I6IiMzQTNBM0EiLGZvbnRXZWlnaHQ6ImJvbGQiLHZlcnRpY2FsQWxpZ246InRvcCIsbWFyZ2luOjEwfSxBeGlzOnt0aXRsZUZvbnRTaXplOjI2LHRpdGxlRm9udENvbG9yOiIjNjY2NjY2Iix0aXRsZUZvbnRGYW1pbHk6dD8iQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWYiOgorImNhbGlicmkiLGxhYmVsRm9udEZhbWlseTp0PyJDYWxpYnJpLCBPcHRpbWEsIENhbmRhcmEsIFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZiI6ImNhbGlicmkiLGxhYmVsRm9udFNpemU6MTgsbGFiZWxGb250Q29sb3I6ImdyZXkiLHRpY2tDb2xvcjoiI0JCQkJCQiIsdGlja1RoaWNrbmVzczoyLGdyaWRUaGlja25lc3M6MixncmlkQ29sb3I6IiNCQkJCQkIiLGxpbmVUaGlja25lc3M6MixsaW5lQ29sb3I6IiNCQkJCQkIifSxMZWdlbmQ6e3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLGZvbnRGYW1pbHk6dD8ibW9ub3NwYWNlLCBzYW5zLXNlcmlmLGFyaWFsIGJsYWNrIjoiY2FsaWJyaSJ9LERhdGFTZXJpZXM6e2luZGV4TGFiZWxGb250Q29sb3I6ImdyZXkiLGluZGV4TGFiZWxGb250RmFtaWx5OnQ/IkNhbGlicmksIE9wdGltYSwgQ2FuZGFyYSwgVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmIjoiY2FsaWJyaSIsaW5kZXhMYWJlbEZvbnRTaXplOjE4LAoraW5kZXhMYWJlbExpbmVUaGlja25lc3M6MX19LHRoZW1lMjp7Q2hhcnQ6e2NvbG9yU2V0OiJjb2xvclNldDIifSxUaXRsZTp7Zm9udEZhbWlseToiaW1wYWN0LCBjaGFyY29hbCwgYXJpYWwgYmxhY2ssIHNhbnMtc2VyaWYiLGZvbnRTaXplOjMyLGZvbnRDb2xvcjoiIzMzMzMzMyIsdmVydGljYWxBbGlnbjoidG9wIixtYXJnaW46MTB9LEF4aXM6e3RpdGxlRm9udFNpemU6MjIsdGl0bGVGb250Q29sb3I6InJnYig5OCw5OCw5OCkiLHRpdGxlRm9udEZhbWlseTp0PyJtb25vc3BhY2UsIHNhbnMtc2VyaWYsYXJpYWwgYmxhY2siOiJhcmlhbCIsdGl0bGVGb250V2VpZ2h0OiJib2xkIixsYWJlbEZvbnRGYW1pbHk6dD8ibW9ub3NwYWNlLCBDb3VyaWVyIE5ldywgQ291cmllciI6ImFyaWFsIixsYWJlbEZvbnRTaXplOjE2LGxhYmVsRm9udENvbG9yOiJncmV5IixsYWJlbEZvbnRXZWlnaHQ6ImJvbGQiLHRpY2tDb2xvcjoiZ3JleSIsdGlja1RoaWNrbmVzczoyLGdyaWRUaGlja25lc3M6MixncmlkQ29sb3I6ImdyZXkiLAorbGluZVRoaWNrbmVzczowfSxMZWdlbmQ6e3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLGZvbnRGYW1pbHk6dD8ibW9ub3NwYWNlLCBzYW5zLXNlcmlmLGFyaWFsIGJsYWNrIjoiYXJpYWwifSxEYXRhU2VyaWVzOntpbmRleExhYmVsRm9udENvbG9yOiJncmV5IixpbmRleExhYmVsRm9udEZhbWlseTp0PyJDb3VyaWVyIE5ldywgQ291cmllciwgbW9ub3NwYWNlIjoiYXJpYWwiLGluZGV4TGFiZWxGb250V2VpZ2h0OiJib2xkIixpbmRleExhYmVsRm9udFNpemU6MTgsaW5kZXhMYWJlbExpbmVUaGlja25lc3M6MX19LHRoZW1lMzp7Q2hhcnQ6e2NvbG9yU2V0OiJjb2xvclNldDEifSxUaXRsZTp7Zm9udEZhbWlseTp0PyJDYW5kYXJhLCBPcHRpbWEsIFRyZWJ1Y2hldCBNUywgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgVHJlYnVjaGV0IE1TLCBzZXJpZiI6ImNhbGlicmkiLGZvbnRTaXplOjMyLGZvbnRDb2xvcjoiIzNBM0EzQSIsZm9udFdlaWdodDoiYm9sZCIsCit2ZXJ0aWNhbEFsaWduOiJ0b3AiLG1hcmdpbjoxMH0sQXhpczp7dGl0bGVGb250U2l6ZToyMix0aXRsZUZvbnRDb2xvcjoicmdiKDk4LDk4LDk4KSIsdGl0bGVGb250RmFtaWx5OnQ/IlZlcmRhbmEsIEdlbmV2YSwgQ2FsaWJyaSwgc2Fucy1zZXJpZiI6ImNhbGlicmkiLGxhYmVsRm9udEZhbWlseTp0PyJDYWxpYnJpLCBPcHRpbWEsIENhbmRhcmEsIFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZiI6ImNhbGlicmkiLGxhYmVsRm9udFNpemU6MTgsbGFiZWxGb250Q29sb3I6ImdyZXkiLHRpY2tDb2xvcjoiZ3JleSIsdGlja1RoaWNrbmVzczoyLGdyaWRUaGlja25lc3M6MixncmlkQ29sb3I6ImdyZXkiLGxpbmVUaGlja25lc3M6MixsaW5lQ29sb3I6ImdyZXkifSxMZWdlbmQ6e3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLGZvbnRGYW1pbHk6dD8ibW9ub3NwYWNlLCBzYW5zLXNlcmlmLGFyaWFsIGJsYWNrIjoiY2FsaWJyaSJ9LERhdGFTZXJpZXM6e2JldmVsRW5hYmxlZDohMCwKK2luZGV4TGFiZWxGb250Q29sb3I6ImdyZXkiLGluZGV4TGFiZWxGb250RmFtaWx5OnQ/IkNhbmRhcmEsIE9wdGltYSwgQ2FsaWJyaSwgVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmIjoiY2FsaWJyaSIsaW5kZXhMYWJlbEZvbnRTaXplOjE4LGluZGV4TGFiZWxMaW5lQ29sb3I6ImxpZ2h0Z3JleSIsaW5kZXhMYWJlbExpbmVUaGlja25lc3M6Mn19fSx6PXtudW1iZXJEdXJhdGlvbjoxLHllYXJEdXJhdGlvbjozMTQ0OTZFNSxtb250aER1cmF0aW9uOjI1OTJFNix3ZWVrRHVyYXRpb246NjA0OEU1LGRheUR1cmF0aW9uOjg2NEU1LGhvdXJEdXJhdGlvbjozNkU1LG1pbnV0ZUR1cmF0aW9uOjZFNCxzZWNvbmREdXJhdGlvbjoxRTMsbWlsbGlzZWNvbmREdXJhdGlvbjoxLGRheU9mV2Vla0Zyb21JbnQ6IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpfSxzYT17fSxSPW51bGwseWE9ZnVuY3Rpb24oKXt2YXIgYT0vRHsxLDR9fE17MSw0fXxZezEsNH18aHsxLDJ9fEh7MSwyfXxtezEsMn18c3sxLDJ9fGZ7MSwzfXx0ezEsMn18VHsxLDJ9fEt8ensxLDN9fCJbXiJdKiJ8J1teJ10qJy9nLAorYj0iU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkiLnNwbGl0KCIgIiksYz0iU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0Ii5zcGxpdCgiICIpLGQ9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIiksZT0iSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWMiLnNwbGl0KCIgIiksZj0vXGIoPzpbUE1DRUFdW1NEUF1UfCg/OlBhY2lmaWN8TW91bnRhaW58Q2VudHJhbHxFYXN0ZXJufEF0bGFudGljKSAoPzpTdGFuZGFyZHxEYXlsaWdodHxQcmV2YWlsaW5nKSBUaW1lfCg/OkdNVHxVVEMpKD86Wy0rXVxkezR9KT8pXGIvZyxnPS9bXi0rXGRBLVpdL2c7cmV0dXJuIGZ1bmN0aW9uKGsscCxoKXt2YXIgbD1oP2guZGF5czpiLHI9aD9oLm1vbnRoczpkLG09aD9oLnNob3J0RGF5czoKK2MscT1oP2guc2hvcnRNb250aHM6ZTtoPSIiO3ZhciBuPSExO2s9ayYmay5nZXRUaW1lP2s6az9uZXcgRGF0ZShrKTpuZXcgRGF0ZTtpZihpc05hTihrKSl0aHJvdyBTeW50YXhFcnJvcigiaW52YWxpZCBkYXRlIik7IlVUQzoiPT09cC5zbGljZSgwLDQpJiYocD1wLnNsaWNlKDQpLG49ITApO2g9bj8iZ2V0VVRDIjoiZ2V0Ijt2YXIgcz1rW2grIkRhdGUiXSgpLHQ9a1toKyJEYXkiXSgpLHU9a1toKyJNb250aCJdKCkseD1rW2grIkZ1bGxZZWFyIl0oKSx3PWtbaCsiSG91cnMiXSgpLFE9a1toKyJNaW51dGVzIl0oKSxHPWtbaCsiU2Vjb25kcyJdKCksdj1rW2grIk1pbGxpc2Vjb25kcyJdKCkseT1uPzA6ay5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybiBoPXAucmVwbGFjZShhLGZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJEIjpyZXR1cm4gcztjYXNlICJERCI6cmV0dXJuIEsocywyKTtjYXNlICJEREQiOnJldHVybiBtW3RdO2Nhc2UgIkREREQiOnJldHVybiBsW3RdO2Nhc2UgIk0iOnJldHVybiB1KworMTtjYXNlICJNTSI6cmV0dXJuIEsodSsxLDIpO2Nhc2UgIk1NTSI6cmV0dXJuIHFbdV07Y2FzZSAiTU1NTSI6cmV0dXJuIHJbdV07Y2FzZSAiWSI6cmV0dXJuIHBhcnNlSW50KFN0cmluZyh4KS5zbGljZSgtMikpO2Nhc2UgIllZIjpyZXR1cm4gSyhTdHJpbmcoeCkuc2xpY2UoLTIpLDIpO2Nhc2UgIllZWSI6cmV0dXJuIEsoU3RyaW5nKHgpLnNsaWNlKC0zKSwzKTtjYXNlICJZWVlZIjpyZXR1cm4gSyh4LDQpO2Nhc2UgImgiOnJldHVybiB3JTEyfHwxMjtjYXNlICJoaCI6cmV0dXJuIEsodyUxMnx8MTIsMik7Y2FzZSAiSCI6cmV0dXJuIHc7Y2FzZSAiSEgiOnJldHVybiBLKHcsMik7Y2FzZSAibSI6cmV0dXJuIFE7Y2FzZSAibW0iOnJldHVybiBLKFEsMik7Y2FzZSAicyI6cmV0dXJuIEc7Y2FzZSAic3MiOnJldHVybiBLKEcsMik7Y2FzZSAiZiI6cmV0dXJuIFN0cmluZyh2KS5zbGljZSgwLDEpO2Nhc2UgImZmIjpyZXR1cm4gSyhTdHJpbmcodikuc2xpY2UoMCwyKSwyKTtjYXNlICJmZmYiOnJldHVybiBLKFN0cmluZyh2KS5zbGljZSgwLAorMyksMyk7Y2FzZSAidCI6cmV0dXJuIDEyPnc/ImEiOiJwIjtjYXNlICJ0dCI6cmV0dXJuIDEyPnc/ImFtIjoicG0iO2Nhc2UgIlQiOnJldHVybiAxMj53PyJBIjoiUCI7Y2FzZSAiVFQiOnJldHVybiAxMj53PyJBTSI6IlBNIjtjYXNlICJLIjpyZXR1cm4gbj8iVVRDIjooU3RyaW5nKGspLm1hdGNoKGYpfHxbIiJdKS5wb3AoKS5yZXBsYWNlKGcsIiIpO2Nhc2UgInoiOnJldHVybigwPHk/Ii0iOiIrIikrTWF0aC5mbG9vcihNYXRoLmFicyh5KS82MCk7Y2FzZSAienoiOnJldHVybigwPHk/Ii0iOiIrIikrSyhNYXRoLmZsb29yKE1hdGguYWJzKHkpLzYwKSwyKTtjYXNlICJ6enoiOnJldHVybigwPHk/Ii0iOiIrIikrSyhNYXRoLmZsb29yKE1hdGguYWJzKHkpLzYwKSwyKStLKE1hdGguYWJzKHkpJTYwLDIpO2RlZmF1bHQ6cmV0dXJuIGEuc2xpY2UoMSxhLmxlbmd0aC0xKX19KX19KCksWD1mdW5jdGlvbihhLGIsYyl7aWYobnVsbD09PWEpcmV0dXJuIiI7YT1OdW1iZXIoYSk7dmFyIGQ9CiswPmE/ITA6ITE7ZCYmKGEqPS0xKTt2YXIgZT1jP2MuZGVjaW1hbFNlcGFyYXRvcjoiLiIsZj1jP2MuZGlnaXRHcm91cFNlcGFyYXRvcjoiLCIsZz0iIjtiPVN0cmluZyhiKTt2YXIgZz0xLGs9Yz0iIixwPS0xLGg9W10sbD1bXSxyPTAsbT0wLHE9MCxuPSExLHM9MCxrPWIubWF0Y2goLyJbXiJdKiJ8J1teJ10qJ3xbZUVdWystXSpbMF0rfFssXStbLl18XHUyMDMwfC4vZyk7Yj1udWxsO2Zvcih2YXIgdD0wO2smJnQ8ay5sZW5ndGg7dCsrKWlmKGI9a1t0XSwiLiI9PT1iJiYwPnApcD10O2Vsc2V7aWYoIiUiPT09YilnKj0xMDA7ZWxzZSBpZigiXHUyMDMwIj09PWIpe2cqPTFFMztjb250aW51ZX1lbHNlIGlmKCIsIj09PWJbMF0mJiIuIj09PWJbYi5sZW5ndGgtMV0pe2cvPU1hdGgucG93KDFFMyxiLmxlbmd0aC0xKTtwPXQrYi5sZW5ndGgtMTtjb250aW51ZX1lbHNlIkUiIT09YlswXSYmImUiIT09YlswXXx8IjAiIT09YltiLmxlbmd0aC0xXXx8KG49ITApOzA+cD8oaC5wdXNoKGIpLCIjIj09PQorYnx8IjAiPT09Yj9yKys6IiwiPT09YiYmcSsrKToobC5wdXNoKGIpLCIjIiE9PWImJiIwIiE9PWJ8fG0rKyl9biYmKGI9TWF0aC5mbG9vcihhKSxzPSgwPT09Yj8iIjpTdHJpbmcoYikpLmxlbmd0aC1yLGcvPU1hdGgucG93KDEwLHMpKTswPnAmJihwPXQpO2c9KGEqZykudG9GaXhlZChtKTtiPWcuc3BsaXQoIi4iKTtnPShiWzBdKyIiKS5zcGxpdCgiIik7YT0oYlsxXSsiIikuc3BsaXQoIiIpO2cmJiIwIj09PWdbMF0mJmcuc2hpZnQoKTtmb3IodD1uPWs9bT1wPTA7MDxoLmxlbmd0aDspaWYoYj1oLnBvcCgpLCIjIj09PWJ8fCIwIj09PWIpaWYocCsrLHA9PT1yKXt2YXIgdT1nLGc9W107aWYoIjAiPT09Yilmb3IoYj1yLW0tKHU/dS5sZW5ndGg6MCk7MDxiOyl1LnVuc2hpZnQoIjAiKSxiLS07Zm9yKDswPHUubGVuZ3RoOyljPXUucG9wKCkrYyx0KyssMD09PXQlbiYmKGs9PT1xJiYwPHUubGVuZ3RoKSYmKGM9ZitjKTtkJiYoYz0iLSIrYyl9ZWxzZSAwPGcubGVuZ3RoPyhjPWcucG9wKCkrCitjLG0rKyx0KyspOiIwIj09PWImJihjPSIwIitjLG0rKyx0KyspLDA9PT10JW4mJihrPT09cSYmMDxnLmxlbmd0aCkmJihjPWYrYyk7ZWxzZSJFIiE9PWJbMF0mJiJlIiE9PWJbMF18fCIwIiE9PWJbYi5sZW5ndGgtMV18fCEvW2VFXVsrLV0qWzBdKy8udGVzdChiKT8iLCI9PT1iPyhrKyssbj10LHQ9MCwwPGcubGVuZ3RoJiYoYz1mK2MpKTpjPTE8Yi5sZW5ndGgmJignIic9PT1iWzBdJiYnIic9PT1iW2IubGVuZ3RoLTFdfHwiJyI9PT1iWzBdJiYiJyI9PT1iW2IubGVuZ3RoLTFdKT9iLnNsaWNlKDEsYi5sZW5ndGgtMSkrYzpiK2M6KGI9MD5zP2IucmVwbGFjZSgiKyIsIiIpLnJlcGxhY2UoIi0iLCIiKTpiLnJlcGxhY2UoIi0iLCIiKSxjKz1iLnJlcGxhY2UoL1swXSsvLGZ1bmN0aW9uKGEpe3JldHVybiBLKHMsYS5sZW5ndGgpfSkpO2Q9IiI7Zm9yKGY9ITE7MDxsLmxlbmd0aDspYj1sLnNoaWZ0KCksIiMiPT09Ynx8IjAiPT09Yj8wPGEubGVuZ3RoJiYwIT09TnVtYmVyKGEuam9pbigiIikpPworKGQrPWEuc2hpZnQoKSxmPSEwKToiMCI9PT1iJiYoZCs9IjAiLGY9ITApOjE8Yi5sZW5ndGgmJignIic9PT1iWzBdJiYnIic9PT1iW2IubGVuZ3RoLTFdfHwiJyI9PT1iWzBdJiYiJyI9PT1iW2IubGVuZ3RoLTFdKT9kKz1iLnNsaWNlKDEsYi5sZW5ndGgtMSk6IkUiIT09YlswXSYmImUiIT09YlswXXx8IjAiIT09YltiLmxlbmd0aC0xXXx8IS9bZUVdWystXSpbMF0rLy50ZXN0KGIpP2QrPWI6KGI9MD5zP2IucmVwbGFjZSgiKyIsIiIpLnJlcGxhY2UoIi0iLCIiKTpiLnJlcGxhY2UoIi0iLCIiKSxkKz1iLnJlcGxhY2UoL1swXSsvLGZ1bmN0aW9uKGEpe3JldHVybiBLKHMsYS5sZW5ndGgpfSkpO3JldHVybiBjKygoZj9lOiIiKStkKX0saWE9ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTA7YT1hfHx3aW5kb3cuZXZlbnQ7YS5vZmZzZXRYfHwwPT09YS5vZmZzZXRYPyhiPWEub2Zmc2V0WCxjPWEub2Zmc2V0WSk6YS5sYXllclh8fDA9PWEubGF5ZXJYPyhiPWEubGF5ZXJYLGM9YS5sYXllclkpOgorKGI9YS5wYWdlWC1hLnRhcmdldC5vZmZzZXRMZWZ0LGM9YS5wYWdlWS1hLnRhcmdldC5vZmZzZXRUb3ApO3JldHVybnt4OmIseTpjfX0sdmE9ITAsamE9d2luZG93LmRldmljZVBpeGVsUmF0aW98fDEsZWE9MSxIPXZhP2phL2VhOjEsRGE9e3Jlc2V0OntpbWFnZToiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFjQ0FZQUFBQUF3cjBpQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRWdBQUN4SUIwdDErL0FBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTnVpOHNvd0FBQUtSU1VSQlZFaUpyZFkvaUYxRkZNZnh6d25ackdJU1VTUi9KTEdJaG9oL1FpUk5CTFd4TUxJV0Vrd2JnaUFvRmdvVzJtaGxZNmRncFkySWxSQlJ4QlNLaFNBS0lrbFdKUll1TVpLQWhpeW9wQWlhVFk3RnZSdG1aKy9lZDkvekhSamV6THc1di9POWQ4NmN1WkdacG1VUkFmZG41bzlEZmRaTkxYcGp6K0x6aVBneUlsNk1pRzBqUFRKelpCdXlEclA0QlZtMFAvQUtibGpUYjRUb1kvZ0dld1lBN0t5Q2wrMWIzRFVZQU52d2JpSHcwZ0NBR1J6Qk96alRBWEVPdTBjQzRDaCtyNXgvSHJwZHJjWm12SURGU3VjTXRuWUNZQysrNkhtTkR3OEZLRFQzNEVUcmY2MzkvYXpPcjV2d1JrL2c1ZmJldUFCdGdDMDRYV2s5VlFMY2lNUDRFSC8zQUZ6RXJSTkM3TVhsUW1zZXNTb0hzR1BFMjNobUVvQlcrNjFLNjZITVhGbUlNdk44bXlpbFhTMzZSMDF1YitLZll2dzQzWlh3WURYK0FIUDRCQWNpNHBGSm9tZm1yL2lobU5vZkVTc0JJbUpHazdtbG5jck00NW41SlBiaHowa0FXcHN2K2p1eGFYMjFZSVBtVkpTMnVOekpNUzZaTmV4QzBkK0k3ZlVXWExGeXoya1NabHBXUHZBU2xtcUFmL0ZYTlhmM0ZBRjJGLzFMdUZpZkFsaW9uQjZkUnVTSTJJd0hpNmx6bVhtcDZ4UjhYWTBmaUloN3BzQXdoKzNGdURrUkhRVmpsK2E4bGtYam8wa0xVS0g3WGFWNW9PODZQbVoxRlR6eVA0Sy9YR2w5di96d2ZiVzdCcmlpdUVUR0NQNWNoOWJjOWY5N0hGL3ZjRnpDYTVnZEVQZ1dxK3QvNHYwVjYzb0UxdUY0aDBEaUZKN0huU1dNcHBEZGgxZHh0c1B2SjJ3Y0JOQUtic0pYYTBDazVvcGRhQlBzUk51L3VzYmEwOWkxS3NhQVZ6bUx0M3NnaHJSanVLMVRmNHhrZWdJbnh3eThnS2Y3ZEtNVkgyUVJzVjV6WFIvQ2Z0eXUrYUthS2Jia1Fyc2RIK1BUekx6Y3F6a09RQVZ6TSs3RkhkaXFxZTIvWVQ0ekYvdDhTL3NQbWF3eXZDOTc0dmNBQUFBQVNVVk9SSzVDWUlJPSJ9LAorcGFuOntpbWFnZToiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRWdBQUN4SUIwdDErL0FBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTnVpOHNvd0FBQUpWU1VSQlZGaUZ2WmU3YTFSQkdNVi94MmhXSTRKcGZLQ0lpU0JLT29PQ2tJRC93UDRCRnFJSUZrRTAyQ2hJaUM4UURLbFNpSTNZcVJCc0JWR3dVTkFVZGlJRVVnamlBelFJSXN1S0pzZml6c1hyNXQ3ZCs4am13TERmekh6M25MT3pjNytaeFRabEd5RGdaaVdPQ3VKOXdIMmdDVXl1cVFGZ0YvQUdjS0pOcllrQllCajQwQ0lldCttdUdRaS85NmtNNFdTN0MvVG01VlVnN3doSmc4QmtFR2tDUjRCRFlmb2RzQURVZ1A2d0VyTzVpQ3Rzd3N1SmIzMmhkYlh5OHF6TDVUSWRtekppbkhkWm9aSUJaY1NGa0dsQUtzMVozWUNrZXRaY0J0b3V1YVFOa3JibE1pQnBCcmhtZTdtQWdVNHdNQ3ZwY0ZzRGtxNEM1NERGVlJUSDloK2k2dmxFMHI1VUE1SW1nQ3VoMjhqQjI4aUlzN0JJVkNPZVN0b1pENjRQNHVQQWpVVHlnS1N4MkZzSzJUSXdrdWdmazlRa2ZkL0UreU1XSFFDZVNScXgvUjNnT3AzTGF6ZmFTMkM0QjVnSERnRDdVOXgzRTN1QUg3S05wQzNBSEhBd1RMNEZIZ005R1E4dkFhUEEwZEIvQWJ4cWsyL2dCTEE5TVhiYTlyMWsvZDRMZkEzSnR3dWVCZU01OHVjUytlZFhuQVcyM3dQMTBOM2FkdkVpOUNYaXpUbnlONGJQUzdabjRzSC9kcTN0MThBWTRlMVlMWVN5M2cvY3NqMlZuRnNoWlB1T3BPZVNLSENvZFVJTnVHajdZZXRFNmplMVBWOVFvTlBKOVN0TkhLb2R4N25SYmlXckdIQkdYQWk1RFVpcXRRd3RwY1dLMEp1YnQ4Q2x0QTVNRVYxSWZ3TzcrVmZmUHdHZmlhNW0zNENUNGJYdWpJSVgwUW5hMS9jR01OcVYvd1VKRTJjenhEOENRNFg1U2w3Sno3U0lMd0NEcGJqS1BCUk1IQWQrRXRYNEhXVjVTcGRjMnc4a0RRR1BiSDhweS9NWE15Z002OS9GS3o0QUFBQUFTVVZPUks1Q1lJST0ifSwKK3pvb206e2ltYWdlOiJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUs2d0FBQ3VzQmdvc05XZ0FBQUJ4MFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1JtbHlaWGR2Y210eklFTlROdWk4c293QUFBTXFTVVJCVkZpRnZkZmJqOTFURk1EeHo1N1U2R1VFTVMxYVl6eU10Q1NTRGhXakNaTUlucEFJM2toRS9RSHRnemRSa1hnU0NTOFNFUzllcEtMaTBvUktORVRqUmFoUkVxMktTMXN0ZFJ1anREUHRiQTk3bjV6ZG45KzV6SnhUSzlrNXYzUE9YbXQ5OTFwN3I3MStJY2FvR3draFRPSWViTVJxek9CVHZJRzNZNHpUWFJtcVNveXg1Y0FLYk1KT0hNRkpuTVo4L2p5RmFYeU1SN0c2bmIxYUgyMmNQNEJ2Y0J4emlHM0dLZnlUSVI5RDZCWWcxS1VnaFBCQ0R2ZUZsYi8yNEF2OGl1VVl3NDFZVnN6NUc3dXhLY1o0YU1FcHdHdDVOWTNWL1liSHNRNnJjQUhPdy9rWXhpZ2V3cjVDWnc0ZllHeEJLY0NMT0ZFWWVoWHJNZFJocjV5TEVUeFZTY3NPTE9rS0FQZm4xVFlNUEl2TEZyU2hVbFMyRkRabThYUkhBQ3pGQVdsM1IyeGJxUE1DWWhtZUxDQU9ZRU1uZ0FjemJjVHZ1SFl4emd1SXkvRmVzUjllNmdTd1UvT29QWUhCSGdIZ3ZpSUtYMkZscTdrMzRLaG1jVm5iaS9QQzhKWDRNZ01jeGIxMTh3WndkejVhSVNzY3F4N1ZSY294N01yUFE3aStidElBSnJBa2Y5K2JJOUVQbVpZMklBeGlUU3VBbGRMcTRZOStBY1NVaDc4S1AwdGJBY3dVMzVjWE1EMUpDSUZVb0dpZWhscUF6NlROQjFmMUMwREsrMGgrbnNOUHJRQzJhNGJxR21sRDlrT0djV3QrUG82cFZnRHZTeGZKYVNrRmQ0VVFCdm9Bc0JZYkNvQjNhMmZsTTdzbEEwUjhpeXQ2ckFGRGVEUGJtOGVPVHBWd0dEOXFWcTduTGJJYVpubWtzUFUxSnRzQ1pNWE5tcGRSeEZhc1dJVHpoNlhqM0xDenJhMU94Y0QyUWpIaUdWemRwZk9Sbk1xWmlvMlBjRjIzQUJkSkYxTnA0QlBwdGx5UGk2V3pQWUJ6cEpadEhlN0E2eFc5Y255UDhUcUEvL1NFSVlSTDhCeHVsN3JpaHZ3Z3RWbjc4V2NHR1pYYTlIR2Q1VER1akRIdU9lUFhOaUhkS2pXZ1pYL1lic3hMeC9rdHFialZ6VGxjalVTbnZJNUpyZGxVVnA2V2VzWlo2UjFoUnJwcTkrRVZUR1M5alRqWUF1S0lvdUdwYmN1ckVrSVl4QzA1MUtOU2FtYXpzYyt4SzhiNFMwVm5FaS9qMGhxVFArTTI3TzI1OGVnUXdadXpzN3BJN01mNFdRWElFRGM1czlzdXgrNSsxUHkyRW1QOFVPcTZHdldoSVNjeGZkWWpVRVJpQXQ5SmQ4NEo2YTE2emY4SkVLVDN5Q204ZzFVeFJ2OENDNHB5Umh6UjF1VUFBQUFBU1VWT1JLNUNZSUk9In0sCittZW51OntpbWFnZToiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFnQ0FZQUFBQWJpZmpNQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFLNndBQUN1c0Jnb3NOV2dBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTnVpOHNvd0FBQUFXZEVWWWRFTnlaV0YwYVc5dUlGUnBiV1VBTURjdk1UVXZNVFRQc3ZVMEFBQUFQMGxFUVZSSWllMlNNUW9BSUJERFV2SC9YNjY3ZzhzSko5S09oWVlPa1cwcUdhVTFNUGRDMHZHU2JWMTlFQUNvM1lNUEFGSDVCVUJVanNxZkFQcFZYdE5nR0RmeEVEQ3RBQUFBQUVsRlRrU3VRbUNDIn19O0wucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24oYSxiKXtpZihoYVt0aGlzLl9kZWZhdWx0c0tleV0pe3ZhciBjPWhhW3RoaXMuX2RlZmF1bHRzS2V5XSxkO2ZvcihkIGluIGMpdGhpc1tkXT1hJiZkIGluIGE/YVtkXTpiJiZkIGluIGI/YltkXTpjW2RdfX07TC5wcm90b3R5cGUudXBkYXRlT3B0aW9uPQorZnVuY3Rpb24oYSl7dmFyIGI9aGFbdGhpcy5fZGVmYXVsdHNLZXldLGM9dGhpcy5fb3B0aW9ucy50aGVtZT90aGlzLl9vcHRpb25zLnRoZW1lOnRoaXMuY2hhcnQmJnRoaXMuY2hhcnQuX29wdGlvbnMudGhlbWU/dGhpcy5jaGFydC5fb3B0aW9ucy50aGVtZToidGhlbWUxIixkPXt9LGU9dGhpc1thXTtjJiYoV1tjXSYmV1tjXVt0aGlzLl9kZWZhdWx0c0tleV0pJiYoZD1XW2NdW3RoaXMuX2RlZmF1bHRzS2V5XSk7YSBpbiBiJiYoZT1hIGluIHRoaXMuX29wdGlvbnM/dGhpcy5fb3B0aW9uc1thXTpkJiZhIGluIGQ/ZFthXTpiW2FdKTtpZihlPT09dGhpc1thXSlyZXR1cm4hMTt0aGlzW2FdPWU7cmV0dXJuITB9O0wucHJvdG90eXBlLnRyYWNrQ2hhbmdlcz1mdW5jdGlvbihhKXt0aGlzLl9vcHRpb25zLl9vbGRPcHRpb25zfHwodGhpcy5fb3B0aW9ucy5fb2xkT3B0aW9ucz17fSk7dGhpcy5fb3B0aW9ucy5fb2xkT3B0aW9uc1thXT10aGlzLl9vcHRpb25zW2FdfTtMLnByb3RvdHlwZS5pc0JlaW5nVHJhY2tlZD0KK2Z1bmN0aW9uKGEpe3RoaXMuX29wdGlvbnMuX29sZE9wdGlvbnN8fCh0aGlzLl9vcHRpb25zLl9vbGRPcHRpb25zPXt9KTtyZXR1cm4gdGhpcy5fb3B0aW9ucy5fb2xkT3B0aW9uc1thXT8hMDohMX07TC5wcm90b3R5cGUuaGFzT3B0aW9uQ2hhbmdlZD1mdW5jdGlvbihhKXt0aGlzLl9vcHRpb25zLl9vbGRPcHRpb25zfHwodGhpcy5fb3B0aW9ucy5fb2xkT3B0aW9ucz17fSk7cmV0dXJuIHRoaXMuX29wdGlvbnMuX29sZE9wdGlvbnNbYV0hPT10aGlzLl9vcHRpb25zW2FdfTtPKHYsTCk7di5wcm90b3R5cGUuX3VwZGF0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMudXBkYXRlT3B0aW9uKCJ3aWR0aCIpO3RoaXMudXBkYXRlT3B0aW9uKCJoZWlnaHQiKTt0aGlzLnVwZGF0ZU9wdGlvbigidGhlbWUiKTt0aGlzLnVwZGF0ZU9wdGlvbigiY29sb3JTZXQiKSYmKHRoaXMuX3NlbGVjdGVkQ29sb3JTZXQ9InVuZGVmaW5lZCIhPT10eXBlb2YgVlt0aGlzLmNvbG9yU2V0XT9WW3RoaXMuY29sb3JTZXRdOgorVi5jb2xvclNldDEpO3RoaXMudXBkYXRlT3B0aW9uKCJiYWNrZ3JvdW5kQ29sb3IiKTt0aGlzLmJhY2tncm91bmRDb2xvcnx8KHRoaXMuYmFja2dyb3VuZENvbG9yPSJyZ2JhKDAsMCwwLDApIik7dGhpcy51cGRhdGVPcHRpb24oImN1bHR1cmUiKTt0aGlzLl9jdWx0dXJlSW5mbz1uZXcgeGEodGhpcyx0aGlzLl9vcHRpb25zLmN1bHR1cmUpO3RoaXMudXBkYXRlT3B0aW9uKCJhbmltYXRpb25FbmFibGVkIik7dGhpcy5hbmltYXRpb25FbmFibGVkPXRoaXMuYW5pbWF0aW9uRW5hYmxlZCYmdDt0aGlzLl9vcHRpb25zLnpvb21FbmFibGVkPyh0aGlzLl96b29tQnV0dG9ufHwoUyh0aGlzLl96b29tQnV0dG9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpKSxNKHRoaXMsdGhpcy5fem9vbUJ1dHRvbiwicGFuIiksdGhpcy5fdG9vbEJhci5hcHBlbmRDaGlsZCh0aGlzLl96b29tQnV0dG9uKSxFKHRoaXMuX3pvb21CdXR0b24sImNsaWNrIixmdW5jdGlvbigpe2Euem9vbUVuYWJsZWQ/CisoYS56b29tRW5hYmxlZD0hMSxhLnBhbkVuYWJsZWQ9ITAsTShhLGEuX3pvb21CdXR0b24sInpvb20iKSk6KGEuem9vbUVuYWJsZWQ9ITAsYS5wYW5FbmFibGVkPSExLE0oYSxhLl96b29tQnV0dG9uLCJwYW4iKSk7YS5yZW5kZXIoKX0pKSx0aGlzLl9yZXNldEJ1dHRvbnx8KFModGhpcy5fcmVzZXRCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIikpLE0odGhpcyx0aGlzLl9yZXNldEJ1dHRvbiwicmVzZXQiKSx0aGlzLl90b29sQmFyLmFwcGVuZENoaWxkKHRoaXMuX3Jlc2V0QnV0dG9uKSxFKHRoaXMuX3Jlc2V0QnV0dG9uLCJjbGljayIsZnVuY3Rpb24oKXthLl90b29sVGlwLmhpZGUoKTthLnpvb21FbmFibGVkfHxhLnBhbkVuYWJsZWQ/KGEuem9vbUVuYWJsZWQ9ITAsYS5wYW5FbmFibGVkPSExLE0oYSxhLl96b29tQnV0dG9uLCJwYW4iKSxhLl9kZWZhdWx0Q3Vyc29yPSJkZWZhdWx0IixhLm92ZXJsYWlkQ2FudmFzLnN0eWxlLmN1cnNvcj1hLl9kZWZhdWx0Q3Vyc29yKToKKyhhLnpvb21FbmFibGVkPSExLGEucGFuRW5hYmxlZD0hMSk7YS5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLmludGVybmFsTWluaW11bT1hLl9vcHRpb25zLmF4aXNYJiZhLl9vcHRpb25zLmF4aXNYLm1pbmltdW0/YS5fb3B0aW9ucy5heGlzWC5taW5pbXVtOm51bGw7YS5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLmludGVybmFsTWF4aW11bT1hLl9vcHRpb25zLmF4aXNYJiZhLl9vcHRpb25zLmF4aXNYLm1heGltdW0/YS5fb3B0aW9ucy5heGlzWC5tYXhpbXVtOm51bGw7YS5yZXNldE92ZXJsYXllZENhbnZhcygpO1MoYS5fem9vbUJ1dHRvbixhLl9yZXNldEJ1dHRvbik7YS5yZW5kZXIoKX0pLHRoaXMub3ZlcmxhaWRDYW52YXMuc3R5bGUuY3Vyc29yPWEuX2RlZmF1bHRDdXJzb3IpLHRoaXMuem9vbUVuYWJsZWR8fHRoaXMucGFuRW5hYmxlZHx8KHRoaXMuX3pvb21CdXR0b24/KGEuX3pvb21CdXR0b24uZ2V0QXR0cmlidXRlKCJzdGF0ZSIpPT09YS5fY3VsdHVyZUluZm8uem9vbVRleHQ/KHRoaXMucGFuRW5hYmxlZD0KKyEwLHRoaXMuem9vbUVuYWJsZWQ9ITEpOih0aGlzLnpvb21FbmFibGVkPSEwLHRoaXMucGFuRW5hYmxlZD0hMSksa2EoYS5fem9vbUJ1dHRvbixhLl9yZXNldEJ1dHRvbikpOih0aGlzLnpvb21FbmFibGVkPSEwLHRoaXMucGFuRW5hYmxlZD0hMSkpKTp0aGlzLnBhbkVuYWJsZWQ9dGhpcy56b29tRW5hYmxlZD0hMTsidW5kZWZpbmVkIiE9PXR5cGVvZiB0aGlzLl9vcHRpb25zLmV4cG9ydEZpbGVOYW1lJiYodGhpcy5leHBvcnRGaWxlTmFtZT10aGlzLl9vcHRpb25zLmV4cG9ydEZpbGVOYW1lKTsidW5kZWZpbmVkIiE9PXR5cGVvZiB0aGlzLl9vcHRpb25zLmV4cG9ydEVuYWJsZWQmJih0aGlzLmV4cG9ydEVuYWJsZWQ9dGhpcy5fb3B0aW9ucy5leHBvcnRFbmFibGVkKTt0aGlzLl9tZW51QnV0dG9uP3RoaXMuZXhwb3J0RW5hYmxlZD9rYSh0aGlzLl9tZW51QnV0dG9uKTpTKHRoaXMuX21lbnVCdXR0b24pOnRoaXMuZXhwb3J0RW5hYmxlZCYmdCYmKHRoaXMuX21lbnVCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIiksCitNKHRoaXMsdGhpcy5fbWVudUJ1dHRvbiwibWVudSIpLHRoaXMuX3Rvb2xCYXIuYXBwZW5kQ2hpbGQodGhpcy5fbWVudUJ1dHRvbiksRSh0aGlzLl9tZW51QnV0dG9uLCJjbGljayIsZnVuY3Rpb24oKXsibm9uZSIhPT1hLl9kcm9wZG93bk1lbnUuc3R5bGUuZGlzcGxheXx8YS5fZHJvcERvd25DbG9zZVRpbWUmJjUwMD49KG5ldyBEYXRlKS5nZXRUaW1lKCktYS5fZHJvcERvd25DbG9zZVRpbWUuZ2V0VGltZSgpfHwoYS5fZHJvcGRvd25NZW51LnN0eWxlLmRpc3BsYXk9ImJsb2NrIixhLl9tZW51QnV0dG9uLmJsdXIoKSxhLl9kcm9wZG93bk1lbnUuZm9jdXMoKSl9LCEwKSk7aWYoIXRoaXMuX2Ryb3Bkb3duTWVudSYmdGhpcy5leHBvcnRFbmFibGVkJiZ0KXt0aGlzLl9kcm9wZG93bk1lbnU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5fZHJvcGRvd25NZW51LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLC0xKTt0aGlzLl9kcm9wZG93bk1lbnUuc3R5bGUuY3NzVGV4dD0KKyJwb3NpdGlvbjogYWJzb2x1dGU7IC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7IC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7IC1tcy11c2VyLXNlbGVjdDogbm9uZTsgdXNlci1zZWxlY3Q6IG5vbmU7IGN1cnNvcjogcG9pbnRlcjtyaWdodDogMXB4O3RvcDogMjVweDttaW4td2lkdGg6IDEyMHB4O291dGxpbmU6IDA7Ym9yZGVyOiAxcHggc29saWQgc2lsdmVyO2ZvbnQtc2l6ZTogMTRweDtmb250LWZhbWlseTogQ2FsaWJyaSwgVmVyZGFuYSwgc2Fucy1zZXJpZjtwYWRkaW5nOiA1cHggMHB4IDVweCAwcHg7dGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO2xpbmUtaGVpZ2h0OiAyMHB4O2JveC1zaGFkb3c6IDJweCAycHggMTBweCAjODg4ODg4OyI7YS5fZHJvcGRvd25NZW51LnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuX3Rvb2xCYXIuYXBwZW5kQ2hpbGQodGhpcy5fZHJvcGRvd25NZW51KTtFKHRoaXMuX2Ryb3Bkb3duTWVudSwiYmx1ciIsZnVuY3Rpb24oKXtTKGEuX2Ryb3Bkb3duTWVudSk7CithLl9kcm9wRG93bkNsb3NlVGltZT1uZXcgRGF0ZX0sITApO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUuY3NzVGV4dD0icGFkZGluZzogMnB4IDE1cHggMnB4IDEwcHgiO2IuaW5uZXJIVE1MPXRoaXMuX2N1bHR1cmVJbmZvLnNhdmVKUEdUZXh0O3RoaXMuX2Ryb3Bkb3duTWVudS5hcHBlbmRDaGlsZChiKTtFKGIsIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iI0VFRUVFRSJ9LCEwKTtFKGIsIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCJ9LCEwKTtFKGIsImNsaWNrIixmdW5jdGlvbigpe3dhKGEuY2FudmFzLCJqcGciLGEuZXhwb3J0RmlsZU5hbWUpO1MoYS5fZHJvcGRvd25NZW51KX0sITApO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5jc3NUZXh0PSJwYWRkaW5nOiAycHggMTVweCAycHggMTBweCI7Yi5pbm5lckhUTUw9Cit0aGlzLl9jdWx0dXJlSW5mby5zYXZlUE5HVGV4dDt0aGlzLl9kcm9wZG93bk1lbnUuYXBwZW5kQ2hpbGQoYik7RShiLCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiNFRUVFRUUifSwhMCk7RShiLCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcj0idHJhbnNwYXJlbnQifSwhMCk7RShiLCJjbGljayIsZnVuY3Rpb24oKXt3YShhLmNhbnZhcywicG5nIixhLmV4cG9ydEZpbGVOYW1lKTtTKGEuX2Ryb3Bkb3duTWVudSl9LCEwKX0ibm9uZSIhPT10aGlzLl90b29sQmFyLnN0eWxlLmRpc3BsYXkmJnRoaXMuX3pvb21CdXR0b24mJih0aGlzLnBhbkVuYWJsZWQ/TShhLGEuX3pvb21CdXR0b24sInpvb20iKTpNKGEsYS5fem9vbUJ1dHRvbiwicGFuIiksYS5fcmVzZXRCdXR0b24uZ2V0QXR0cmlidXRlKCJzdGF0ZSIpIT09YS5fY3VsdHVyZUluZm8ucmVzZXRUZXh0JiZNKGEsYS5fcmVzZXRCdXR0b24sInJlc2V0IikpOworaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgaGEuQ2hhcnQuY3JlZGl0SHJlZil0aGlzLmNyZWRpdEhyZWY9Imh0dHA6Ly9jYW52YXNqcy5jb20vIix0aGlzLmNyZWRpdFRleHQ9IkNhbnZhc0pTLmNvbSI7ZWxzZSB2YXIgYz10aGlzLnVwZGF0ZU9wdGlvbigiY3JlZGl0VGV4dCIpLGQ9dGhpcy51cGRhdGVPcHRpb24oImNyZWRpdEhyZWYiKTtpZigwPT09dGhpcy5yZW5kZXJDb3VudHx8Y3x8ZCl0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZSgiaHJlZiIsdGhpcy5jcmVkaXRIcmVmKSx0aGlzLl9jcmVkaXRMaW5rLmlubmVySFRNTD10aGlzLmNyZWRpdFRleHQ7dGhpcy5jcmVkaXRIcmVmJiZ0aGlzLmNyZWRpdFRleHQ/dGhpcy5fY3JlZGl0TGluay5wYXJlbnRFbGVtZW50fHx0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jcmVkaXRMaW5rKTp0aGlzLl9jcmVkaXRMaW5rLnBhcmVudEVsZW1lbnQmJnRoaXMuX2NhbnZhc0pTQ29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuX2NyZWRpdExpbmspOwordGhpcy5fb3B0aW9ucy50b29sVGlwJiZ0aGlzLl90b29sVGlwLl9vcHRpb25zIT09dGhpcy5fb3B0aW9ucy50b29sVGlwJiYodGhpcy5fdG9vbFRpcC5fb3B0aW9ucz10aGlzLl9vcHRpb25zLnRvb2xUaXApO3RoaXMuX3Rvb2xUaXAudXBkYXRlT3B0aW9uKCJlbmFibGVkIik7dGhpcy5fdG9vbFRpcC51cGRhdGVPcHRpb24oInNoYXJlZCIpO3RoaXMuX3Rvb2xUaXAudXBkYXRlT3B0aW9uKCJhbmltYXRpb25FbmFibGVkIik7dGhpcy5fdG9vbFRpcC51cGRhdGVPcHRpb24oImJvcmRlckNvbG9yIik7dGhpcy5fdG9vbFRpcC51cGRhdGVPcHRpb24oImNvbnRlbnQiKX07di5wcm90b3R5cGUuX3VwZGF0ZVNpemU9ZnVuY3Rpb24oKXt2YXIgYT0wLGI9MDt0aGlzLl9vcHRpb25zLndpZHRoP2E9dGhpcy53aWR0aDp0aGlzLndpZHRoPWE9MDx0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGg/dGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoOnRoaXMud2lkdGg7dGhpcy5fb3B0aW9ucy5oZWlnaHQ/CitiPXRoaXMuaGVpZ2h0OnRoaXMuaGVpZ2h0PWI9MDx0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0P3RoaXMuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQ6dGhpcy5oZWlnaHQ7cmV0dXJuIHRoaXMuY2FudmFzLndpZHRoIT09YSpIfHx0aGlzLmNhbnZhcy5oZWlnaHQhPT1iKkg/KGRhKHRoaXMuY2FudmFzLGEsYiksZGEodGhpcy5vdmVybGFpZENhbnZhcyxhLGIpLGRhKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdENhbnZhcyxhLGIpLCEwKTohMX07di5wcm90b3R5cGUuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRvcj90aGlzLl9hbmltYXRvci5jYW5jZWxBbGxBbmltYXRpb25zKCk6dGhpcy5fYW5pbWF0b3I9bmV3IG9hKHRoaXMpO3RoaXMuZGlzYWJsZVRvb2xUaXA9ITE7dGhpcy5waWVEb3VnaG51dENsaWNrSGFuZGxlcj1udWxsO3RoaXMuYW5pbWF0aW9uUmVxdWVzdElkJiZ0aGlzLmNhbmNlbFJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csdGhpcy5hbmltYXRpb25SZXF1ZXN0SWQpOwordGhpcy5fdXBkYXRlT3B0aW9ucygpO3RoaXMuYW5pbWF0ZWRSZW5kZXI9dCYmdGhpcy5hbmltYXRpb25FbmFibGVkJiYwPT09dGhpcy5yZW5kZXJDb3VudDt0aGlzLl91cGRhdGVTaXplKCk7dGhpcy5jbGVhckNhbnZhcygpO3RoaXMuY3R4LmJlZ2luUGF0aCgpO3RoaXMuYXhpc1kyPXRoaXMuYXhpc1k9dGhpcy5heGlzWD1udWxsO3RoaXMuX2luZGV4TGFiZWxzPVtdO3RoaXMuX2RhdGFJblJlbmRlcmVkT3JkZXI9W107dGhpcy5fZXZlbnRzPVtdO3RoaXMuX2V2ZW50TWFuYWdlciYmdGhpcy5fZXZlbnRNYW5hZ2VyLnJlc2V0KCk7dGhpcy5wbG90SW5mbz17YXhpc1BsYWNlbWVudDpudWxsLGF4aXNYVmFsdWVUeXBlOm51bGwscGxvdFR5cGVzOltdfTt0aGlzLmxheW91dE1hbmFnZXIucmVzZXQoKTt0aGlzLmRhdGE9W107Zm9yKHZhciBhPTAsYj0wO2I8dGhpcy5fb3B0aW9ucy5kYXRhLmxlbmd0aDtiKyspaWYoYSsrLCF0aGlzLl9vcHRpb25zLmRhdGFbYl0udHlwZXx8MDw9di5fc3VwcG9ydGVkQ2hhcnRUeXBlcy5pbmRleE9mKHRoaXMuX29wdGlvbnMuZGF0YVtiXS50eXBlKSl7dmFyIGM9CituZXcgUCh0aGlzLHRoaXMuX29wdGlvbnMuZGF0YVtiXSx0aGlzLnRoZW1lLGEtMSwrK3RoaXMuX2V2ZW50TWFuYWdlci5sYXN0T2JqZWN0SWQpO251bGw9PT1jLm5hbWUmJihjLm5hbWU9IkRhdGFTZXJpZXMgIithKTtudWxsPT09Yy5jb2xvcj8xPHRoaXMuX29wdGlvbnMuZGF0YS5sZW5ndGg/KGMuX2NvbG9yU2V0PVt0aGlzLl9zZWxlY3RlZENvbG9yU2V0W2MuaW5kZXgldGhpcy5fc2VsZWN0ZWRDb2xvclNldC5sZW5ndGhdXSxjLmNvbG9yPXRoaXMuX3NlbGVjdGVkQ29sb3JTZXRbYy5pbmRleCV0aGlzLl9zZWxlY3RlZENvbG9yU2V0Lmxlbmd0aF0pOmMuX2NvbG9yU2V0PSJsaW5lIj09PWMudHlwZXx8InN0ZXBMaW5lIj09PWMudHlwZXx8InNwbGluZSI9PT1jLnR5cGV8fCJhcmVhIj09PWMudHlwZXx8InN0ZXBBcmVhIj09PWMudHlwZXx8InNwbGluZUFyZWEiPT09Yy50eXBlfHwic3RhY2tlZEFyZWEiPT09Yy50eXBlfHwic3RhY2tlZEFyZWExMDAiPT09Yy50eXBlfHwicmFuZ2VBcmVhIj09PQorYy50eXBlfHwicmFuZ2VTcGxpbmVBcmVhIj09PWMudHlwZXx8ImNhbmRsZXN0aWNrIj09PWMudHlwZXx8Im9obGMiPT09Yy50eXBlP1t0aGlzLl9zZWxlY3RlZENvbG9yU2V0WzBdXTp0aGlzLl9zZWxlY3RlZENvbG9yU2V0OmMuX2NvbG9yU2V0PVtjLmNvbG9yXTtudWxsPT09Yy5tYXJrZXJTaXplJiYoKCJsaW5lIj09PWMudHlwZXx8InN0ZXBMaW5lIj09PWMudHlwZXx8InNwbGluZSI9PT1jLnR5cGUpJiZjLmRhdGFQb2ludHMmJmMuZGF0YVBvaW50cy5sZW5ndGg8dGhpcy53aWR0aC8xNnx8InNjYXR0ZXIiPT09Yy50eXBlKSYmKGMubWFya2VyU2l6ZT04KTsiYnViYmxlIiE9PWMudHlwZSYmInNjYXR0ZXIiIT09Yy50eXBlfHwhYy5kYXRhUG9pbnRzfHxjLmRhdGFQb2ludHMuc29ydChDYSk7dGhpcy5kYXRhLnB1c2goYyk7dmFyIGQ9Yy5heGlzUGxhY2VtZW50LGU7Im5vcm1hbCI9PT1kPyJ4eVN3YXBwZWQiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50P2U9J1lvdSBjYW5ub3QgY29tYmluZSAiJysKK2MudHlwZSsnIiB3aXRoIGJhciBjaGFydCc6Im5vbmUiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50P2U9J1lvdSBjYW5ub3QgY29tYmluZSAiJytjLnR5cGUrJyIgd2l0aCBwaWUgY2hhcnQnOm51bGw9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQmJih0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQ9Im5vcm1hbCIpOiJ4eVN3YXBwZWQiPT09ZD8ibm9ybWFsIj09PXRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudD9lPSdZb3UgY2Fubm90IGNvbWJpbmUgIicrYy50eXBlKyciIHdpdGggbGluZSwgYXJlYSwgY29sdW1uIG9yIHBpZSBjaGFydCc6Im5vbmUiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50P2U9J1lvdSBjYW5ub3QgY29tYmluZSAiJytjLnR5cGUrJyIgd2l0aCBwaWUgY2hhcnQnOm51bGw9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQmJih0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQ9Inh5U3dhcHBlZCIpOiJub25lIj09ZCYmKCJub3JtYWwiPT09Cit0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQ/ZT0nWW91IGNhbm5vdCBjb21iaW5lICInK2MudHlwZSsnIiB3aXRoIGxpbmUsIGFyZWEsIGNvbHVtbiBvciBiYXIgY2hhcnQnOiJ4eVN3YXBwZWQiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50P2U9J1lvdSBjYW5ub3QgY29tYmluZSAiJytjLnR5cGUrJyIgd2l0aCBiYXIgY2hhcnQnOm51bGw9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQmJih0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQ9Im5vbmUiKSk7aWYoZSYmd2luZG93LmNvbnNvbGUpe3dpbmRvdy5jb25zb2xlLmxvZyhlKTtyZXR1cm59fXRoaXMuX29iamVjdHNJbml0aWFsaXplZD0hMH07di5fc3VwcG9ydGVkQ2hhcnRUeXBlcz0ibGluZSBzdGVwTGluZSBzcGxpbmUgY29sdW1uIGFyZWEgc3RlcEFyZWEgc3BsaW5lQXJlYSBiYXIgYnViYmxlIHNjYXR0ZXIgc3RhY2tlZENvbHVtbiBzdGFja2VkQ29sdW1uMTAwIHN0YWNrZWRCYXIgc3RhY2tlZEJhcjEwMCBzdGFja2VkQXJlYSBzdGFja2VkQXJlYTEwMCBjYW5kbGVzdGljayBvaGxjIHJhbmdlQ29sdW1uIHJhbmdlQmFyIHJhbmdlQXJlYSByYW5nZVNwbGluZUFyZWEgcGllIGRvdWdobnV0IGZ1bm5lbCIuc3BsaXQoIiAiKTsKK3YuX3N1cHBvcnRlZENoYXJ0VHlwZXMuaW5kZXhPZnx8KHYuX3N1cHBvcnRlZENoYXJ0VHlwZXMuaW5kZXhPZj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMubGVuZ3RoPj4+MCxkPU51bWJlcihiKXx8MCxkPTA+ZD9NYXRoLmNlaWwoZCk6TWF0aC5mbG9vcihkKTtmb3IoMD5kJiYoZCs9Yyk7ZDxjO2QrKylpZihkIGluIHRoaXMmJnRoaXNbZF09PT1hKXJldHVybiBkO3JldHVybi0xfSk7di5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe2EmJih0aGlzLl9vcHRpb25zPWEpO3RoaXMuX2luaXRpYWxpemUoKTtmb3IoYT0wO2E8dGhpcy5kYXRhLmxlbmd0aDthKyspaWYoIm5vcm1hbCI9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnR8fCJ4eVN3YXBwZWQiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50KXRoaXMuZGF0YVthXS5heGlzWVR5cGUmJiJwcmltYXJ5IiE9PXRoaXMuZGF0YVthXS5heGlzWVR5cGU/InNlY29uZGFyeSI9PT10aGlzLmRhdGFbYV0uYXhpc1lUeXBlJiYKKyh0aGlzLmF4aXNZMnx8KCJub3JtYWwiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50P3RoaXMuYXhpc1kyPW5ldyBBKHRoaXMsdGhpcy5fb3B0aW9ucy5heGlzWTIsImF4aXNZIiwicmlnaHQiKToieHlTd2FwcGVkIj09PXRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCYmKHRoaXMuYXhpc1kyPW5ldyBBKHRoaXMsdGhpcy5fb3B0aW9ucy5heGlzWTIsImF4aXNZIiwidG9wIikpKSx0aGlzLmRhdGFbYV0uYXhpc1k9dGhpcy5heGlzWTIpOih0aGlzLmF4aXNZfHwoIm5vcm1hbCI9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQ/dGhpcy5heGlzWT1uZXcgQSh0aGlzLHRoaXMuX29wdGlvbnMuYXhpc1ksImF4aXNZIiwibGVmdCIpOiJ4eVN3YXBwZWQiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50JiYodGhpcy5heGlzWT1uZXcgQSh0aGlzLHRoaXMuX29wdGlvbnMuYXhpc1ksImF4aXNZIiwiYm90dG9tIikpKSx0aGlzLmRhdGFbYV0uYXhpc1k9dGhpcy5heGlzWSksdGhpcy5heGlzWHx8CisoIm5vcm1hbCI9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQ/dGhpcy5heGlzWD1uZXcgQSh0aGlzLHRoaXMuX29wdGlvbnMuYXhpc1gsImF4aXNYIiwiYm90dG9tIik6Inh5U3dhcHBlZCI9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQmJih0aGlzLmF4aXNYPW5ldyBBKHRoaXMsdGhpcy5fb3B0aW9ucy5heGlzWCwiYXhpc1giLCJsZWZ0IikpKSx0aGlzLmRhdGFbYV0uYXhpc1g9dGhpcy5heGlzWDt0aGlzLl9wcm9jZXNzRGF0YSgpO3RoaXMuX29wdGlvbnMudGl0bGUmJih0aGlzLl90aXRsZT1uZXcgYmEodGhpcyx0aGlzLl9vcHRpb25zLnRpdGxlKSx0aGlzLl90aXRsZS5yZW5kZXIoKSk7dGhpcy5sZWdlbmQ9bmV3IGdhKHRoaXMsdGhpcy5fb3B0aW9ucy5sZWdlbmQsdGhpcy50aGVtZSk7Zm9yKGE9MDthPHRoaXMuZGF0YS5sZW5ndGg7YSsrKXRoaXMuZGF0YVthXS5zaG93SW5MZWdlbmQmJnRoaXMubGVnZW5kLmRhdGFTZXJpZXMucHVzaCh0aGlzLmRhdGFbYV0pO3RoaXMubGVnZW5kLnJlbmRlcigpOworaWYoIm5vcm1hbCI9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnR8fCJ4eVN3YXBwZWQiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50KXRoaXMubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKSxBLnNldExheW91dEFuZFJlbmRlcih0aGlzLmF4aXNYLHRoaXMuYXhpc1ksdGhpcy5heGlzWTIsdGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50LHRoaXMubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKSk7ZWxzZSBpZigibm9uZSI9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQpdGhpcy5wcmVwYXJlUGxvdEFyZWEoKTtlbHNlIHJldHVybjt2YXIgYj1bXTtpZih0aGlzLmFuaW1hdGVkUmVuZGVyKXt2YXIgYz1VKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO2MuZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UodGhpcy5jYW52YXMsMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfWZvcihhPTA7YTx0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7YSsrKWZvcih2YXIgZD0KK3RoaXMucGxvdEluZm8ucGxvdFR5cGVzW2FdLGU9MDtlPGQucGxvdFVuaXRzLmxlbmd0aDtlKyspe3ZhciBmPWQucGxvdFVuaXRzW2VdLGc9bnVsbDtmLnRhcmdldENhbnZhcz1udWxsO3RoaXMuYW5pbWF0ZWRSZW5kZXImJihmLnRhcmdldENhbnZhcz1VKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLGYudGFyZ2V0Q2FudmFzQ3R4PWYudGFyZ2V0Q2FudmFzLmdldENvbnRleHQoIjJkIikpOyJsaW5lIj09PWYudHlwZT9nPXRoaXMucmVuZGVyTGluZShmKToic3RlcExpbmUiPT09Zi50eXBlP2c9dGhpcy5yZW5kZXJTdGVwTGluZShmKToic3BsaW5lIj09PWYudHlwZT9nPXRoaXMucmVuZGVyU3BsaW5lKGYpOiJjb2x1bW4iPT09Zi50eXBlP2c9dGhpcy5yZW5kZXJDb2x1bW4oZik6ImJhciI9PT1mLnR5cGU/Zz10aGlzLnJlbmRlckJhcihmKToiYXJlYSI9PT1mLnR5cGU/Zz10aGlzLnJlbmRlckFyZWEoZik6InN0ZXBBcmVhIj09PWYudHlwZT9nPXRoaXMucmVuZGVyU3RlcEFyZWEoZik6InNwbGluZUFyZWEiPT09CitmLnR5cGU/Zz10aGlzLnJlbmRlclNwbGluZUFyZWEoZik6InN0YWNrZWRDb2x1bW4iPT09Zi50eXBlP2c9dGhpcy5yZW5kZXJTdGFja2VkQ29sdW1uKGYpOiJzdGFja2VkQ29sdW1uMTAwIj09PWYudHlwZT9nPXRoaXMucmVuZGVyU3RhY2tlZENvbHVtbjEwMChmKToic3RhY2tlZEJhciI9PT1mLnR5cGU/Zz10aGlzLnJlbmRlclN0YWNrZWRCYXIoZik6InN0YWNrZWRCYXIxMDAiPT09Zi50eXBlP2c9dGhpcy5yZW5kZXJTdGFja2VkQmFyMTAwKGYpOiJzdGFja2VkQXJlYSI9PT1mLnR5cGU/Zz10aGlzLnJlbmRlclN0YWNrZWRBcmVhKGYpOiJzdGFja2VkQXJlYTEwMCI9PT1mLnR5cGU/Zz10aGlzLnJlbmRlclN0YWNrZWRBcmVhMTAwKGYpOiJidWJibGUiPT09Zi50eXBlP2c9Zz10aGlzLnJlbmRlckJ1YmJsZShmKToic2NhdHRlciI9PT1mLnR5cGU/Zz10aGlzLnJlbmRlclNjYXR0ZXIoZik6InBpZSI9PT1mLnR5cGU/dGhpcy5yZW5kZXJQaWUoZik6ImRvdWdobnV0Ij09PWYudHlwZT8KK3RoaXMucmVuZGVyUGllKGYpOiJjYW5kbGVzdGljayI9PT1mLnR5cGU/Zz10aGlzLnJlbmRlckNhbmRsZXN0aWNrKGYpOiJvaGxjIj09PWYudHlwZT9nPXRoaXMucmVuZGVyQ2FuZGxlc3RpY2soZik6InJhbmdlQ29sdW1uIj09PWYudHlwZT9nPXRoaXMucmVuZGVyUmFuZ2VDb2x1bW4oZik6InJhbmdlQmFyIj09PWYudHlwZT9nPXRoaXMucmVuZGVyUmFuZ2VCYXIoZik6InJhbmdlQXJlYSI9PT1mLnR5cGU/Zz10aGlzLnJlbmRlclJhbmdlQXJlYShmKToicmFuZ2VTcGxpbmVBcmVhIj09PWYudHlwZSYmKGc9dGhpcy5yZW5kZXJSYW5nZVNwbGluZUFyZWEoZikpO2Zvcih2YXIgaz0wO2s8Zi5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7aysrKXRoaXMuX2RhdGFJblJlbmRlcmVkT3JkZXIucHVzaCh0aGlzLmRhdGFbZi5kYXRhU2VyaWVzSW5kZXhlc1trXV0pO3RoaXMuYW5pbWF0ZWRSZW5kZXImJmcmJmIucHVzaChnKX10aGlzLmFuaW1hdGVkUmVuZGVyJiYwPHRoaXMuX2luZGV4TGFiZWxzLmxlbmd0aCYmCisoYT1VKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLmdldENvbnRleHQoIjJkIiksYi5wdXNoKHRoaXMucmVuZGVySW5kZXhMYWJlbHMoYSkpKTt2YXIgcD10aGlzOzA8Yi5sZW5ndGg/KHAuZGlzYWJsZVRvb2xUaXA9ITAscC5fYW5pbWF0b3IuYW5pbWF0ZSgyMDAscC5hbmltYXRpb25EdXJhdGlvbixmdW5jdGlvbihhKXtwLmN0eC5jbGVhclJlY3QoMCwwLHAud2lkdGgscC5oZWlnaHQpO3AuY3R4LmRyYXdJbWFnZShjLDAsMCxwLndpZHRoKkgscC5oZWlnaHQqSCwwLDAscC53aWR0aCxwLmhlaWdodCk7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspZz1iW2RdLDE+YSYmInVuZGVmaW5lZCIhPT10eXBlb2YgZy5zdGFydFRpbWVQZXJjZW50P2E+PWcuc3RhcnRUaW1lUGVyY2VudCYmZy5hbmltYXRpb25DYWxsYmFjayhnLmVhc2luZ0Z1bmN0aW9uKGEtZy5zdGFydFRpbWVQZXJjZW50LDAsMSwxLWcuc3RhcnRUaW1lUGVyY2VudCksZyk6Zy5hbmltYXRpb25DYWxsYmFjayhnLmVhc2luZ0Z1bmN0aW9uKGEsCiswLDEsMSksZyl9LGZ1bmN0aW9uKCl7Yj1bXTtmb3IodmFyIGE9MDthPHAucGxvdEluZm8ucGxvdFR5cGVzLmxlbmd0aDthKyspZm9yKHZhciBkPXAucGxvdEluZm8ucGxvdFR5cGVzW2FdLGU9MDtlPGQucGxvdFVuaXRzLmxlbmd0aDtlKyspZC5wbG90VW5pdHNbZV0udGFyZ2V0Q2FudmFzPW51bGw7Yz1udWxsO3AuZGlzYWJsZVRvb2xUaXA9ITF9KSk6MDxwLl9pbmRleExhYmVscy5sZW5ndGgmJnAucmVuZGVySW5kZXhMYWJlbHMoKTt0aGlzLmF0dGFjaFBsb3RBcmVhRXZlbnRIYW5kbGVycygpO3RoaXMuem9vbUVuYWJsZWR8fCh0aGlzLnBhbkVuYWJsZWR8fCF0aGlzLl96b29tQnV0dG9ufHwibm9uZSI9PT10aGlzLl96b29tQnV0dG9uLnN0eWxlLmRpc3BsYXkpfHxTKHRoaXMuX3pvb21CdXR0b24sdGhpcy5fcmVzZXRCdXR0b24pO3RoaXMuX3Rvb2xUaXAuX3VwZGF0ZVRvb2xUaXAoKTt0aGlzLnJlbmRlckNvdW50Kyt9O3YucHJvdG90eXBlLmF0dGFjaFBsb3RBcmVhRXZlbnRIYW5kbGVycz0KK2Z1bmN0aW9uKCl7dGhpcy5hdHRhY2hFdmVudCh7Y29udGV4dDp0aGlzLGNoYXJ0OnRoaXMsbW91c2Vkb3duOnRoaXMuX3Bsb3RBcmVhTW91c2VEb3duLG1vdXNldXA6dGhpcy5fcGxvdEFyZWFNb3VzZVVwLG1vdXNlbW92ZTp0aGlzLl9wbG90QXJlYU1vdXNlTW92ZSxjdXJzb3I6dGhpcy56b29tRW5hYmxlZD8iY29sLXJlc2l6ZSI6Im1vdmUiLGN1cnNvcjp0aGlzLnBhbkVuYWJsZWQ/Im1vdmUiOiJkZWZhdWx0IixjYXB0dXJlOiEwLGJvdW5kczp0aGlzLnBsb3RBcmVhfSl9O3YucHJvdG90eXBlLmNhdGVnb3Jpc2VEYXRhU2VyaWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPSIiLGI9MDtiPHRoaXMuZGF0YS5sZW5ndGg7YisrKWlmKGE9dGhpcy5kYXRhW2JdLGEuZGF0YVBvaW50cyYmKDAhPT1hLmRhdGFQb2ludHMubGVuZ3RoJiZhLnZpc2libGUpJiYwPD12Ll9zdXBwb3J0ZWRDaGFydFR5cGVzLmluZGV4T2YoYS50eXBlKSl7Zm9yKHZhciBjPW51bGwsZD0hMSxlPW51bGwsZj0hMSxnPQorMDtnPHRoaXMucGxvdEluZm8ucGxvdFR5cGVzLmxlbmd0aDtnKyspaWYodGhpcy5wbG90SW5mby5wbG90VHlwZXNbZ10udHlwZT09PWEudHlwZSl7ZD0hMDtjPXRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ddO2JyZWFrfWR8fChjPXt0eXBlOmEudHlwZSx0b3RhbERhdGFTZXJpZXM6MCxwbG90VW5pdHM6W119LHRoaXMucGxvdEluZm8ucGxvdFR5cGVzLnB1c2goYykpO2ZvcihnPTA7ZzxjLnBsb3RVbml0cy5sZW5ndGg7ZysrKWlmKGMucGxvdFVuaXRzW2ddLmF4aXNZVHlwZT09PWEuYXhpc1lUeXBlKXtmPSEwO2U9Yy5wbG90VW5pdHNbZ107YnJlYWt9Znx8KGU9e3R5cGU6YS50eXBlLHByZXZpb3VzRGF0YVNlcmllc0NvdW50OjAsaW5kZXg6Yy5wbG90VW5pdHMubGVuZ3RoLHBsb3RUeXBlOmMsYXhpc1lUeXBlOmEuYXhpc1lUeXBlLGF4aXNZOiJwcmltYXJ5Ij09PWEuYXhpc1lUeXBlP3RoaXMuYXhpc1k6dGhpcy5heGlzWTIsYXhpc1g6dGhpcy5heGlzWCxkYXRhU2VyaWVzSW5kZXhlczpbXSwKK3lUb3RhbHM6W119LGMucGxvdFVuaXRzLnB1c2goZSkpO2MudG90YWxEYXRhU2VyaWVzKys7ZS5kYXRhU2VyaWVzSW5kZXhlcy5wdXNoKGIpO2EucGxvdFVuaXQ9ZX1mb3IoYj0wO2I8dGhpcy5wbG90SW5mby5wbG90VHlwZXMubGVuZ3RoO2IrKylmb3IoYz10aGlzLnBsb3RJbmZvLnBsb3RUeXBlc1tiXSxnPWE9MDtnPGMucGxvdFVuaXRzLmxlbmd0aDtnKyspYy5wbG90VW5pdHNbZ10ucHJldmlvdXNEYXRhU2VyaWVzQ291bnQ9YSxhKz1jLnBsb3RVbml0c1tnXS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGh9O3YucHJvdG90eXBlLmFzc2lnbklkVG9EYXRhUG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLmRhdGEubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5kYXRhW2FdO2lmKGIuZGF0YVBvaW50cylmb3IodmFyIGM9Yi5kYXRhUG9pbnRzLmxlbmd0aCxkPTA7ZDxjO2QrKyliLmRhdGFQb2ludElkc1tkXT0rK3RoaXMuX2V2ZW50TWFuYWdlci5sYXN0T2JqZWN0SWR9fTt2LnByb3RvdHlwZS5fcHJvY2Vzc0RhdGE9CitmdW5jdGlvbigpe3RoaXMuYXNzaWduSWRUb0RhdGFQb2ludHMoKTt0aGlzLmNhdGVnb3Jpc2VEYXRhU2VyaWVzKCk7Zm9yKHZhciBhPTA7YTx0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7YSsrKWZvcih2YXIgYj10aGlzLnBsb3RJbmZvLnBsb3RUeXBlc1thXSxjPTA7YzxiLnBsb3RVbml0cy5sZW5ndGg7YysrKXt2YXIgZD1iLnBsb3RVbml0c1tjXTsibGluZSI9PT1kLnR5cGV8fCJzdGVwTGluZSI9PT1kLnR5cGV8fCJzcGxpbmUiPT09ZC50eXBlfHwiY29sdW1uIj09PWQudHlwZXx8ImFyZWEiPT09ZC50eXBlfHwic3RlcEFyZWEiPT09ZC50eXBlfHwic3BsaW5lQXJlYSI9PT1kLnR5cGV8fCJiYXIiPT09ZC50eXBlfHwiYnViYmxlIj09PWQudHlwZXx8InNjYXR0ZXIiPT09ZC50eXBlP3RoaXMuX3Byb2Nlc3NNdWx0aXNlcmllc1Bsb3RVbml0KGQpOiJzdGFja2VkQ29sdW1uIj09PWQudHlwZXx8InN0YWNrZWRCYXIiPT09ZC50eXBlfHwic3RhY2tlZEFyZWEiPT09ZC50eXBlPwordGhpcy5fcHJvY2Vzc1N0YWNrZWRQbG90VW5pdChkKToic3RhY2tlZENvbHVtbjEwMCI9PT1kLnR5cGV8fCJzdGFja2VkQmFyMTAwIj09PWQudHlwZXx8InN0YWNrZWRBcmVhMTAwIj09PWQudHlwZT90aGlzLl9wcm9jZXNzU3RhY2tlZDEwMFBsb3RVbml0KGQpOiJjYW5kbGVzdGljayIhPT1kLnR5cGUmJiJvaGxjIiE9PWQudHlwZSYmInJhbmdlQ29sdW1uIiE9PWQudHlwZSYmInJhbmdlQmFyIiE9PWQudHlwZSYmInJhbmdlQXJlYSIhPT1kLnR5cGUmJiJyYW5nZVNwbGluZUFyZWEiIT09ZC50eXBlfHx0aGlzLl9wcm9jZXNzTXVsdGlZUGxvdFVuaXQoZCl9fTt2LnByb3RvdHlwZS5fcHJvY2Vzc011bHRpc2VyaWVzUGxvdFVuaXQ9ZnVuY3Rpb24oYSl7aWYoYS5kYXRhU2VyaWVzSW5kZXhlcyYmISgxPmEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoKSlmb3IodmFyIGI9YS5heGlzWS5kYXRhSW5mbyxjPWEuYXhpc1guZGF0YUluZm8sZCxlLGY9ITEsZz0wO2c8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7ZysrKXt2YXIgaz0KK3RoaXMuZGF0YVthLmRhdGFTZXJpZXNJbmRleGVzW2ddXSxwPTAsaD0hMSxsPSExO2lmKCJub3JtYWwiPT09ay5heGlzUGxhY2VtZW50fHwieHlTd2FwcGVkIj09PWsuYXhpc1BsYWNlbWVudCl2YXIgcj10aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1guaW50ZXJuYWxNaW5pbXVtP3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5pbnRlcm5hbE1pbmltdW06dGhpcy5fb3B0aW9ucy5heGlzWCYmdGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtP3RoaXMuX29wdGlvbnMuYXhpc1gubWluaW11bTotSW5maW5pdHksbT10aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1guaW50ZXJuYWxNYXhpbXVtP3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5pbnRlcm5hbE1heGltdW06dGhpcy5fb3B0aW9ucy5heGlzWCYmdGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtP3RoaXMuX29wdGlvbnMuYXhpc1gubWF4aW11bTpJbmZpbml0eTtpZihrLmRhdGFQb2ludHNbcF0ueCYmay5kYXRhUG9pbnRzW3BdLnguZ2V0VGltZXx8CisiZGF0ZVRpbWUiPT09ay54VmFsdWVUeXBlKWY9ITA7Zm9yKHA9MDtwPGsuZGF0YVBvaW50cy5sZW5ndGg7cCsrKXsidW5kZWZpbmVkIj09PXR5cGVvZiBrLmRhdGFQb2ludHNbcF0ueCYmKGsuZGF0YVBvaW50c1twXS54PXApO2suZGF0YVBvaW50c1twXS54LmdldFRpbWU/KGY9ITAsZD1rLmRhdGFQb2ludHNbcF0ueC5nZXRUaW1lKCkpOmQ9ay5kYXRhUG9pbnRzW3BdLng7ZT1rLmRhdGFQb2ludHNbcF0ueTtkPGMubWluJiYoYy5taW49ZCk7ZD5jLm1heCYmKGMubWF4PWQpO2U8Yi5taW4mJihiLm1pbj1lKTtlPmIubWF4JiYoYi5tYXg9ZSk7aWYoMDxwKXt2YXIgcT1kLWsuZGF0YVBvaW50c1twLTFdLng7MD5xJiYocSo9LTEpO2MubWluRGlmZj5xJiYwIT09cSYmKGMubWluRGlmZj1xKX1pZighKGQ8cil8fGgpe2lmKCFoJiYoaD0hMCwwPHApKXtwLT0yO2NvbnRpbnVlfWlmKGQ+bSYmIWwpbD0hMDtlbHNlIGlmKGQ+bSYmbCljb250aW51ZTtrLmRhdGFQb2ludHNbcF0ubGFiZWwmJihhLmF4aXNYLmxhYmVsc1tkXT0KK2suZGF0YVBvaW50c1twXS5sYWJlbCk7ZDxjLnZpZXdQb3J0TWluJiYoYy52aWV3UG9ydE1pbj1kKTtkPmMudmlld1BvcnRNYXgmJihjLnZpZXdQb3J0TWF4PWQpO251bGwhPT1lJiYoZTxiLnZpZXdQb3J0TWluJiYoYi52aWV3UG9ydE1pbj1lKSxlPmIudmlld1BvcnRNYXgmJihiLnZpZXdQb3J0TWF4PWUpKX19dGhpcy5wbG90SW5mby5heGlzWFZhbHVlVHlwZT1rLnhWYWx1ZVR5cGU9Zj8iZGF0ZVRpbWUiOiJudW1iZXIifX07di5wcm90b3R5cGUuX3Byb2Nlc3NTdGFja2VkUGxvdFVuaXQ9ZnVuY3Rpb24oYSl7aWYoYS5kYXRhU2VyaWVzSW5kZXhlcyYmISgxPmEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoKSl7Zm9yKHZhciBiPWEuYXhpc1kuZGF0YUluZm8sYz1hLmF4aXNYLmRhdGFJbmZvLGQsZSxmPSExLGc9W10saz1bXSxwPTA7cDxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtwKyspe3ZhciBoPXRoaXMuZGF0YVthLmRhdGFTZXJpZXNJbmRleGVzW3BdXSxsPTAscj0hMSxtPQorITE7aWYoIm5vcm1hbCI9PT1oLmF4aXNQbGFjZW1lbnR8fCJ4eVN3YXBwZWQiPT09aC5heGlzUGxhY2VtZW50KXZhciBxPXRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5pbnRlcm5hbE1pbmltdW0/dGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLmludGVybmFsTWluaW11bTp0aGlzLl9vcHRpb25zLmF4aXNYJiZ0aGlzLl9vcHRpb25zLmF4aXNYLm1pbmltdW0/dGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtOi1JbmZpbml0eSxuPXRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5pbnRlcm5hbE1heGltdW0/dGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLmludGVybmFsTWF4aW11bTp0aGlzLl9vcHRpb25zLmF4aXNYJiZ0aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW0/dGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtOkluZmluaXR5O2lmKGguZGF0YVBvaW50c1tsXS54JiZoLmRhdGFQb2ludHNbbF0ueC5nZXRUaW1lfHwiZGF0ZVRpbWUiPT09aC54VmFsdWVUeXBlKWY9ITA7Citmb3IobD0wO2w8aC5kYXRhUG9pbnRzLmxlbmd0aDtsKyspeyJ1bmRlZmluZWQiPT09dHlwZW9mIGguZGF0YVBvaW50c1tsXS54JiYoaC5kYXRhUG9pbnRzW2xdLng9bCk7aC5kYXRhUG9pbnRzW2xdLnguZ2V0VGltZT8oZj0hMCxkPWguZGF0YVBvaW50c1tsXS54LmdldFRpbWUoKSk6ZD1oLmRhdGFQb2ludHNbbF0ueDtlPWguZGF0YVBvaW50c1tsXS55O2Q8Yy5taW4mJihjLm1pbj1kKTtkPmMubWF4JiYoYy5tYXg9ZCk7aWYoMDxsKXt2YXIgcz1kLWguZGF0YVBvaW50c1tsLTFdLng7MD5zJiYocyo9LTEpO2MubWluRGlmZj5zJiYwIT09cyYmKGMubWluRGlmZj1zKX1pZighKGQ8cSl8fHIpe2lmKCFyJiYocj0hMCwwPGwpKXtsLT0yO2NvbnRpbnVlfWlmKGQ+biYmIW0pbT0hMDtlbHNlIGlmKGQ+biYmbSljb250aW51ZTtoLmRhdGFQb2ludHNbbF0ubGFiZWwmJihhLmF4aXNYLmxhYmVsc1tkXT1oLmRhdGFQb2ludHNbbF0ubGFiZWwpO2Q8Yy52aWV3UG9ydE1pbiYmKGMudmlld1BvcnRNaW49CitkKTtkPmMudmlld1BvcnRNYXgmJihjLnZpZXdQb3J0TWF4PWQpO251bGwhPT1lJiYoYS55VG90YWxzW2RdPShhLnlUb3RhbHNbZF0/YS55VG90YWxzW2RdOjApK01hdGguYWJzKGUpLDA8PWU/Z1tkXT1nW2RdP2dbZF0rZTplOmtbZF09a1tkXT9rW2RdK2U6ZSl9fXRoaXMucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGU9aC54VmFsdWVUeXBlPWY/ImRhdGVUaW1lIjoibnVtYmVyIn1mb3IobCBpbiBnKWlzTmFOKGwpfHwoYT1nW2xdLGE8Yi5taW4mJihiLm1pbj1hKSxhPmIubWF4JiYoYi5tYXg9YSksbDxjLnZpZXdQb3J0TWlufHxsPmMudmlld1BvcnRNYXh8fChhPGIudmlld1BvcnRNaW4mJihiLnZpZXdQb3J0TWluPWEpLGE+Yi52aWV3UG9ydE1heCYmKGIudmlld1BvcnRNYXg9YSkpKTtmb3IobCBpbiBrKWlzTmFOKGwpfHwoYT1rW2xdLGE8Yi5taW4mJihiLm1pbj1hKSxhPmIubWF4JiYoYi5tYXg9YSksbDxjLnZpZXdQb3J0TWlufHxsPmMudmlld1BvcnRNYXh8fChhPGIudmlld1BvcnRNaW4mJgorKGIudmlld1BvcnRNaW49YSksYT5iLnZpZXdQb3J0TWF4JiYoYi52aWV3UG9ydE1heD1hKSkpfX07di5wcm90b3R5cGUuX3Byb2Nlc3NTdGFja2VkMTAwUGxvdFVuaXQ9ZnVuY3Rpb24oYSl7aWYoYS5kYXRhU2VyaWVzSW5kZXhlcyYmISgxPmEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoKSl7Zm9yKHZhciBiPWEuYXhpc1kuZGF0YUluZm8sYz1hLmF4aXNYLmRhdGFJbmZvLGQsZSxmPSExLGc9ITEsaz0hMSxwPVtdLGg9MDtoPGEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2grKyl7dmFyIGw9dGhpcy5kYXRhW2EuZGF0YVNlcmllc0luZGV4ZXNbaF1dLHI9MCxtPSExLHE9ITE7aWYoIm5vcm1hbCI9PT1sLmF4aXNQbGFjZW1lbnR8fCJ4eVN3YXBwZWQiPT09bC5heGlzUGxhY2VtZW50KXZhciBuPXRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5pbnRlcm5hbE1pbmltdW0/dGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLmludGVybmFsTWluaW11bTp0aGlzLl9vcHRpb25zLmF4aXNYJiYKK3RoaXMuX29wdGlvbnMuYXhpc1gubWluaW11bT90aGlzLl9vcHRpb25zLmF4aXNYLm1pbmltdW06LUluZmluaXR5LHM9dGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLmludGVybmFsTWF4aW11bT90aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1guaW50ZXJuYWxNYXhpbXVtOnRoaXMuX29wdGlvbnMuYXhpc1gmJnRoaXMuX29wdGlvbnMuYXhpc1gubWF4aW11bT90aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW06SW5maW5pdHk7aWYobC5kYXRhUG9pbnRzW3JdLngmJmwuZGF0YVBvaW50c1tyXS54LmdldFRpbWV8fCJkYXRlVGltZSI9PT1sLnhWYWx1ZVR5cGUpZj0hMDtmb3Iocj0wO3I8bC5kYXRhUG9pbnRzLmxlbmd0aDtyKyspeyJ1bmRlZmluZWQiPT09dHlwZW9mIGwuZGF0YVBvaW50c1tyXS54JiYobC5kYXRhUG9pbnRzW3JdLng9cik7bC5kYXRhUG9pbnRzW3JdLnguZ2V0VGltZT8oZj0hMCxkPWwuZGF0YVBvaW50c1tyXS54LmdldFRpbWUoKSk6ZD1sLmRhdGFQb2ludHNbcl0ueDsKK2U9bC5kYXRhUG9pbnRzW3JdLnk7ZDxjLm1pbiYmKGMubWluPWQpO2Q+Yy5tYXgmJihjLm1heD1kKTtpZigwPHIpe3ZhciB0PWQtbC5kYXRhUG9pbnRzW3ItMV0ueDswPnQmJih0Kj0tMSk7Yy5taW5EaWZmPnQmJjAhPT10JiYoYy5taW5EaWZmPXQpfWlmKCEoZDxuKXx8bSl7aWYoIW0mJihtPSEwLDA8cikpe3ItPTI7Y29udGludWV9aWYoZD5zJiYhcSlxPSEwO2Vsc2UgaWYoZD5zJiZxKWNvbnRpbnVlO2wuZGF0YVBvaW50c1tyXS5sYWJlbCYmKGEuYXhpc1gubGFiZWxzW2RdPWwuZGF0YVBvaW50c1tyXS5sYWJlbCk7ZDxjLnZpZXdQb3J0TWluJiYoYy52aWV3UG9ydE1pbj1kKTtkPmMudmlld1BvcnRNYXgmJihjLnZpZXdQb3J0TWF4PWQpO251bGwhPT1lJiYoYS55VG90YWxzW2RdPShhLnlUb3RhbHNbZF0/YS55VG90YWxzW2RdOjApK01hdGguYWJzKGUpLDA8PWU/Zz0hMDprPSEwLHBbZF09cFtkXT9wW2RdK01hdGguYWJzKGUpOk1hdGguYWJzKGUpKX19dGhpcy5wbG90SW5mby5heGlzWFZhbHVlVHlwZT0KK2wueFZhbHVlVHlwZT1mPyJkYXRlVGltZSI6Im51bWJlciJ9ZyYmIWs/KGIubWF4PTk5LGIubWluPTEpOmcmJms/KGIubWF4PTk5LGIubWluPS05OSk6IWcmJmsmJihiLm1heD0tMSxiLm1pbj0tOTkpO2Iudmlld1BvcnRNaW49Yi5taW47Yi52aWV3UG9ydE1heD1iLm1heDthLmRhdGFQb2ludFlTdW1zPXB9fTt2LnByb3RvdHlwZS5fcHJvY2Vzc011bHRpWVBsb3RVbml0PWZ1bmN0aW9uKGEpe2lmKGEuZGF0YVNlcmllc0luZGV4ZXMmJiEoMT5hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpZm9yKHZhciBiPWEuYXhpc1kuZGF0YUluZm8sYz1hLmF4aXNYLmRhdGFJbmZvLGQsZSxmLGcsaz0hMSxwPTA7cDxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtwKyspe3ZhciBoPXRoaXMuZGF0YVthLmRhdGFTZXJpZXNJbmRleGVzW3BdXSxsPTAscj0hMSxtPSExO2lmKCJub3JtYWwiPT09aC5heGlzUGxhY2VtZW50fHwieHlTd2FwcGVkIj09PWguYXhpc1BsYWNlbWVudCl2YXIgcT10aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1guaW50ZXJuYWxNaW5pbXVtPwordGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLmludGVybmFsTWluaW11bTp0aGlzLl9vcHRpb25zLmF4aXNYJiZ0aGlzLl9vcHRpb25zLmF4aXNYLm1pbmltdW0/dGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtOi1JbmZpbml0eSxuPXRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5pbnRlcm5hbE1heGltdW0/dGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLmludGVybmFsTWF4aW11bTp0aGlzLl9vcHRpb25zLmF4aXNYJiZ0aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW0/dGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtOkluZmluaXR5O2lmKGguZGF0YVBvaW50c1tsXS54JiZoLmRhdGFQb2ludHNbbF0ueC5nZXRUaW1lfHwiZGF0ZVRpbWUiPT09aC54VmFsdWVUeXBlKWs9ITA7Zm9yKGw9MDtsPGguZGF0YVBvaW50cy5sZW5ndGg7bCsrKXsidW5kZWZpbmVkIj09PXR5cGVvZiBoLmRhdGFQb2ludHNbbF0ueCYmKGguZGF0YVBvaW50c1tsXS54PWwpO2guZGF0YVBvaW50c1tsXS54LmdldFRpbWU/Cisoaz0hMCxkPWguZGF0YVBvaW50c1tsXS54LmdldFRpbWUoKSk6ZD1oLmRhdGFQb2ludHNbbF0ueDsoZT1oLmRhdGFQb2ludHNbbF0ueSkmJmUubGVuZ3RoJiYoZj1NYXRoLm1pbi5hcHBseShudWxsLGUpLGc9TWF0aC5tYXguYXBwbHkobnVsbCxlKSk7ZDxjLm1pbiYmKGMubWluPWQpO2Q+Yy5tYXgmJihjLm1heD1kKTtmPGIubWluJiYoYi5taW49Zik7Zz5iLm1heCYmKGIubWF4PWcpO2lmKDA8bCl7dmFyIHM9ZC1oLmRhdGFQb2ludHNbbC0xXS54OzA+cyYmKHMqPS0xKTtjLm1pbkRpZmY+cyYmMCE9PXMmJihjLm1pbkRpZmY9cyl9aWYoIShkPHEpfHxyKXtpZighciYmKHI9ITAsMDxsKSl7bC09Mjtjb250aW51ZX1pZihkPm4mJiFtKW09ITA7ZWxzZSBpZihkPm4mJm0pY29udGludWU7aC5kYXRhUG9pbnRzW2xdLmxhYmVsJiYoYS5heGlzWC5sYWJlbHNbZF09aC5kYXRhUG9pbnRzW2xdLmxhYmVsKTtkPGMudmlld1BvcnRNaW4mJihjLnZpZXdQb3J0TWluPWQpO2Q+Yy52aWV3UG9ydE1heCYmCisoYy52aWV3UG9ydE1heD1kKTtudWxsIT09ZSYmKGY8Yi52aWV3UG9ydE1pbiYmKGIudmlld1BvcnRNaW49ZiksZz5iLnZpZXdQb3J0TWF4JiYoYi52aWV3UG9ydE1heD1nKSl9fXRoaXMucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGU9aC54VmFsdWVUeXBlPWs/ImRhdGVUaW1lIjoibnVtYmVyIn19O3YucHJvdG90eXBlLmdldERhdGFQb2ludEF0WFk9ZnVuY3Rpb24oYSxiLGMpe2M9Y3x8ITE7Zm9yKHZhciBkPVtdLGU9dGhpcy5fZGF0YUluUmVuZGVyZWRPcmRlci5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIGY9bnVsbDsoZj10aGlzLl9kYXRhSW5SZW5kZXJlZE9yZGVyW2VdLmdldERhdGFQb2ludEF0WFkoYSxiLGMpKSYmZC5wdXNoKGYpfWE9bnVsbDtiPSExO2ZvcihjPTA7YzxkLmxlbmd0aDtjKyspaWYoImxpbmUiPT09ZFtjXS5kYXRhU2VyaWVzLnR5cGV8fCJzdGVwTGluZSI9PT1kW2NdLmRhdGFTZXJpZXMudHlwZXx8ImFyZWEiPT09ZFtjXS5kYXRhU2VyaWVzLnR5cGV8fCJzdGVwQXJlYSI9PT0KK2RbY10uZGF0YVNlcmllcy50eXBlKWlmKGU9VCgibWFya2VyU2l6ZSIsZFtjXS5kYXRhUG9pbnQsZFtjXS5kYXRhU2VyaWVzKXx8OCxkW2NdLmRpc3RhbmNlPD1lLzIpe2I9ITA7YnJlYWt9Zm9yKGM9MDtjPGQubGVuZ3RoO2MrKyliJiYibGluZSIhPT1kW2NdLmRhdGFTZXJpZXMudHlwZSYmInN0ZXBMaW5lIiE9PWRbY10uZGF0YVNlcmllcy50eXBlJiYiYXJlYSIhPT1kW2NdLmRhdGFTZXJpZXMudHlwZSYmInN0ZXBBcmVhIiE9PWRbY10uZGF0YVNlcmllcy50eXBlfHwoYT9kW2NdLmRpc3RhbmNlPD1hLmRpc3RhbmNlJiYoYT1kW2NdKTphPWRbY10pO3JldHVybiBhfTt2LnByb3RvdHlwZS5nZXRPYmplY3RBdFhZPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1udWxsO2lmKGM9dGhpcy5nZXREYXRhUG9pbnRBdFhZKGEsYixjfHwhMSkpZD1jLmRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2MuZGF0YVBvaW50SW5kZXhdO2Vsc2UgaWYodClkPXRhKGEsYix0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgpOworZWxzZSBmb3IoYz0wO2M8dGhpcy5sZWdlbmQuaXRlbXMubGVuZ3RoO2MrKyl7dmFyIGU9dGhpcy5sZWdlbmQuaXRlbXNbY107YT49ZS54MSYmKGE8PWUueDImJmI+PWUueTEmJmI8PWUueTIpJiYoZD1lLmlkKX1yZXR1cm4gZH07di5wcm90b3R5cGUuZ2V0QXV0b0ZvbnRTaXplPWZ1bmN0aW9uKGEsYixjKXthLz00MDA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5taW4odGhpcy53aWR0aCx0aGlzLmhlaWdodCkqYSl9O3YucHJvdG90eXBlLnJlc2V0T3ZlcmxheWVkQ2FudmFzPWZ1bmN0aW9uKCl7dGhpcy5vdmVybGFpZENhbnZhc0N0eC5jbGVhclJlY3QoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfTt2LnByb3RvdHlwZS5jbGVhckNhbnZhcz1mdW5jdGlvbigpe3RoaXMuY3R4LmNsZWFyUmVjdCgwLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCk7dGhpcy5iYWNrZ3JvdW5kQ29sb3ImJih0aGlzLmN0eC5maWxsU3R5bGU9dGhpcy5iYWNrZ3JvdW5kQ29sb3IsdGhpcy5jdHguZmlsbFJlY3QoMCwKKzAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCkpfTt2LnByb3RvdHlwZS5hdHRhY2hFdmVudD1mdW5jdGlvbihhKXt0aGlzLl9ldmVudHMucHVzaChhKX07di5wcm90b3R5cGUuX3RvdWNoRXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGEpe2lmKGEuY2hhbmdlZFRvdWNoZXMmJnRoaXMuaW50ZXJhY3Rpdml0eUVuYWJsZWQpe3ZhciBiPVtdLGM9YS5jaGFuZ2VkVG91Y2hlcyxkPWM/Y1swXTphLGU9bnVsbDtzd2l0Y2goYS50eXBlKXtjYXNlICJ0b3VjaHN0YXJ0IjpjYXNlICJNU1BvaW50ZXJEb3duIjpiPVsibW91c2Vtb3ZlIiwibW91c2Vkb3duIl07dGhpcy5fbGFzdFRvdWNoRGF0YT1pYShkKTt0aGlzLl9sYXN0VG91Y2hEYXRhLnRpbWU9bmV3IERhdGU7YnJlYWs7Y2FzZSAidG91Y2htb3ZlIjpjYXNlICJNU1BvaW50ZXJNb3ZlIjpiPVsibW91c2Vtb3ZlIl07YnJlYWs7Y2FzZSAidG91Y2hlbmQiOmNhc2UgIk1TUG9pbnRlclVwIjpiPSJ0b3VjaHN0YXJ0Ij09PXRoaXMuX2xhc3RUb3VjaEV2ZW50VHlwZXx8CisiTVNQb2ludGVyRG93biI9PT10aGlzLl9sYXN0VG91Y2hFdmVudFR5cGU/WyJtb3VzZXVwIiwiY2xpY2siXTpbIm1vdXNldXAiXTticmVhaztkZWZhdWx0OnJldHVybn1pZighKGMmJjE8Yy5sZW5ndGgpKXtlPWlhKGQpO2UudGltZT1uZXcgRGF0ZTt0cnl7dmFyIGY9ZS55LXRoaXMuX2xhc3RUb3VjaERhdGEueSxnPWUudGltZS10aGlzLl9sYXN0VG91Y2hEYXRhLnRpbWU7aWYoMTU8TWF0aC5hYnMoZikmJih0aGlzLl9sYXN0VG91Y2hEYXRhLnNjcm9sbHx8MjAwPmcpKXt0aGlzLl9sYXN0VG91Y2hEYXRhLnNjcm9sbD0hMDt2YXIgaz13aW5kb3cucGFyZW50fHx3aW5kb3c7ayYmay5zY3JvbGxCeSYmay5zY3JvbGxCeSgwLC1mKX19Y2F0Y2gocCl7fXRoaXMuX2xhc3RUb3VjaEV2ZW50VHlwZT1hLnR5cGU7aWYodGhpcy5fbGFzdFRvdWNoRGF0YS5zY3JvbGwmJnRoaXMuem9vbUVuYWJsZWQpdGhpcy5pc0RyYWcmJnRoaXMucmVzZXRPdmVybGF5ZWRDYW52YXMoKSx0aGlzLmlzRHJhZz0KKyExO2Vsc2UgZm9yKGM9MDtjPGIubGVuZ3RoO2MrKyllPWJbY10sZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIpLGYuaW5pdE1vdXNlRXZlbnQoZSwhMCwhMCx3aW5kb3csMSxkLnNjcmVlblgsZC5zY3JlZW5ZLGQuY2xpZW50WCxkLmNsaWVudFksITEsITEsITEsITEsMCxudWxsKSxkLnRhcmdldC5kaXNwYXRjaEV2ZW50KGYpLGEucHJldmVudE1hbmlwdWxhdGlvbiYmYS5wcmV2ZW50TWFuaXB1bGF0aW9uKCksYS5wcmV2ZW50RGVmYXVsdCYmYS5wcmV2ZW50RGVmYXVsdCgpfX19O3YucHJvdG90eXBlLl9tb3VzZUV2ZW50SGFuZGxlcj1mdW5jdGlvbihhKXtpZih0aGlzLmludGVyYWN0aXZpdHlFbmFibGVkKWlmKHRoaXMuX2lnbm9yZU5leHRFdmVudCl0aGlzLl9pZ25vcmVOZXh0RXZlbnQ9ITE7ZWxzZXthLnByZXZlbnRNYW5pcHVsYXRpb24mJmEucHJldmVudE1hbmlwdWxhdGlvbigpO2EucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKTsidW5kZWZpbmVkIj09PQordHlwZW9mIGEudGFyZ2V0JiZhLnNyY0VsZW1lbnQmJihhLnRhcmdldD1hLnNyY0VsZW1lbnQpO3ZhciBiPWlhKGEpLGM9YS50eXBlLGQsZTthLndoaWNoP2U9Mz09YS53aGljaDphLmJ1dHRvbiYmKGU9Mj09YS5idXR0b24pO2lmKCFlKXtpZih2LmNhcHR1cmVkRXZlbnRQYXJhbSlkPXYuY2FwdHVyZWRFdmVudFBhcmFtLCJtb3VzZXVwIj09PWMmJih2LmNhcHR1cmVkRXZlbnRQYXJhbT1udWxsLGQuY2hhcnQub3ZlcmxhaWRDYW52YXMucmVsZWFzZUNhcHR1cmU/ZC5jaGFydC5vdmVybGFpZENhbnZhcy5yZWxlYXNlQ2FwdHVyZSgpOmRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZC5jaGFydC5fbW91c2VFdmVudEhhbmRsZXIsITEpKSxkLmhhc093blByb3BlcnR5KGMpJiZkW2NdLmNhbGwoZC5jb250ZXh0LGIueCxiLnkpO2Vsc2UgaWYodGhpcy5fZXZlbnRzKXtmb3IoZT0wO2U8dGhpcy5fZXZlbnRzLmxlbmd0aDtlKyspaWYodGhpcy5fZXZlbnRzW2VdLmhhc093blByb3BlcnR5KGMpKXtkPQordGhpcy5fZXZlbnRzW2VdO3ZhciBmPWQuYm91bmRzO2lmKGIueD49Zi54MSYmYi54PD1mLngyJiZiLnk+PWYueTEmJmIueTw9Zi55Mil7ZFtjXS5jYWxsKGQuY29udGV4dCxiLngsYi55KTsibW91c2Vkb3duIj09PWMmJiEwPT09ZC5jYXB0dXJlPyh2LmNhcHR1cmVkRXZlbnRQYXJhbT1kLHRoaXMub3ZlcmxhaWRDYW52YXMuc2V0Q2FwdHVyZT90aGlzLm92ZXJsYWlkQ2FudmFzLnNldENhcHR1cmUoKTpkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMuX21vdXNlRXZlbnRIYW5kbGVyLCExKSk6Im1vdXNldXAiPT09YyYmKGQuY2hhcnQub3ZlcmxhaWRDYW52YXMucmVsZWFzZUNhcHR1cmU/ZC5jaGFydC5vdmVybGFpZENhbnZhcy5yZWxlYXNlQ2FwdHVyZSgpOmRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcy5fbW91c2VFdmVudEhhbmRsZXIsITEpKTticmVha31lbHNlIGQ9bnVsbH1hLnRhcmdldC5zdHlsZS5jdXJzb3I9CitkJiZkLmN1cnNvcj9kLmN1cnNvcjp0aGlzLl9kZWZhdWx0Q3Vyc29yfXRoaXMuX3Rvb2xUaXAmJnRoaXMuX3Rvb2xUaXAuZW5hYmxlZCYmKGM9dGhpcy5wbG90QXJlYSwoYi54PGMueDF8fGIueD5jLngyfHxiLnk8Yy55MXx8Yi55PmMueTIpJiZ0aGlzLl90b29sVGlwLmhpZGUoKSk7dGhpcy5pc0RyYWcmJnRoaXMuem9vbUVuYWJsZWR8fCF0aGlzLl9ldmVudE1hbmFnZXJ8fHRoaXMuX2V2ZW50TWFuYWdlci5tb3VzZUV2ZW50SGFuZGxlcihhKX19fTt2LnByb3RvdHlwZS5fcGxvdEFyZWFNb3VzZURvd249ZnVuY3Rpb24oYSxiKXt0aGlzLmlzRHJhZz0hMDt0aGlzLmRyYWdTdGFydFBvaW50PSJub25lIiE9PXRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudD97eDphLHk6Yix4TWluaW11bTp0aGlzLmF4aXNYLm1pbmltdW0seE1heGltdW06dGhpcy5heGlzWC5tYXhpbXVtfTp7eDphLHk6Yn19O3YucHJvdG90eXBlLl9wbG90QXJlYU1vdXNlVXA9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2lmKCgibm9ybWFsIj09PQordGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50fHwieHlTd2FwcGVkIj09PXRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCkmJnRoaXMuaXNEcmFnKXt2YXIgZT0wLGU9dGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMsZT0ieHlTd2FwcGVkIj09PXRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudD9iLXRoaXMuZHJhZ1N0YXJ0UG9pbnQueTp0aGlzLmRyYWdTdGFydFBvaW50LngtYTtNYXRoLmFicyh0aGlzLmF4aXNYLm1heGltdW0tdGhpcy5heGlzWC5taW5pbXVtKTtpZigyPE1hdGguYWJzKGUpKXtpZih0aGlzLnBhbkVuYWJsZWQpZT0hMSxkPTAsdGhpcy5heGlzWC5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWluaW11bTx0aGlzLmF4aXNYLl9hYnNvbHV0ZU1pbmltdW0/KGQ9dGhpcy5heGlzWC5fYWJzb2x1dGVNaW5pbXVtLXRoaXMuYXhpc1guc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1pbmltdW0sdGhpcy5heGlzWC5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWluaW11bSs9CitkLHRoaXMuYXhpc1guc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1heGltdW0rPWQsZT0hMCk6dGhpcy5heGlzWC5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWF4aW11bT50aGlzLmF4aXNYLl9hYnNvbHV0ZU1heGltdW0mJihkPXRoaXMuYXhpc1guc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1heGltdW0tdGhpcy5heGlzWC5fYWJzb2x1dGVNYXhpbXVtLHRoaXMuYXhpc1guc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1heGltdW0tPWQsdGhpcy5heGlzWC5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWluaW11bS09ZCxlPSEwKSxlJiZ0aGlzLnJlbmRlcigpO2Vsc2UgaWYodGhpcy56b29tRW5hYmxlZCl7dGhpcy5yZXNldE92ZXJsYXllZENhbnZhcygpO2lmKCF0aGlzLmRyYWdTdGFydFBvaW50KXJldHVybjsieHlTd2FwcGVkIj09PXRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudD8oYz1NYXRoLm1pbih0aGlzLmRyYWdTdGFydFBvaW50LnksYiksZD1NYXRoLm1heCh0aGlzLmRyYWdTdGFydFBvaW50LnksCitiKSwxPE1hdGguYWJzKGMtZCkmJihlPXRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLGQ9dGhpcy5heGlzWC5tYXhpbXVtLSh0aGlzLmF4aXNYLm1heGltdW0tdGhpcy5heGlzWC5taW5pbXVtKS9lLmhlaWdodCooZC1lLnkxKSxlPXRoaXMuYXhpc1gubWF4aW11bS0odGhpcy5heGlzWC5tYXhpbXVtLXRoaXMuYXhpc1gubWluaW11bSkvZS5oZWlnaHQqKGMtZS55MSksZD1NYXRoLm1heChkLHRoaXMuYXhpc1guZGF0YUluZm8ubWluKSxlPU1hdGgubWluKGUsdGhpcy5heGlzWC5kYXRhSW5mby5tYXgpLE1hdGguYWJzKGUtZCk+MipNYXRoLmFicyh0aGlzLmF4aXNYLmRhdGFJbmZvLm1pbkRpZmYpJiYodGhpcy5heGlzWC5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWluaW11bT1kLHRoaXMuYXhpc1guc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1heGltdW09ZSx0aGlzLnJlbmRlcigpKSkpOiJub3JtYWwiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50JiYoZD1NYXRoLm1pbih0aGlzLmRyYWdTdGFydFBvaW50LngsCithKSxjPU1hdGgubWF4KHRoaXMuZHJhZ1N0YXJ0UG9pbnQueCxhKSwxPE1hdGguYWJzKGQtYykmJihlPXRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLGQ9KHRoaXMuYXhpc1gubWF4aW11bS10aGlzLmF4aXNYLm1pbmltdW0pL2Uud2lkdGgqKGQtZS54MSkrdGhpcy5heGlzWC5taW5pbXVtLGU9KHRoaXMuYXhpc1gubWF4aW11bS10aGlzLmF4aXNYLm1pbmltdW0pL2Uud2lkdGgqKGMtZS54MSkrdGhpcy5heGlzWC5taW5pbXVtLGQ9TWF0aC5tYXgoZCx0aGlzLmF4aXNYLmRhdGFJbmZvLm1pbiksZT1NYXRoLm1pbihlLHRoaXMuYXhpc1guZGF0YUluZm8ubWF4KSxNYXRoLmFicyhlLWQpPjIqTWF0aC5hYnModGhpcy5heGlzWC5kYXRhSW5mby5taW5EaWZmKSYmKHRoaXMuYXhpc1guc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1pbmltdW09ZCx0aGlzLmF4aXNYLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNYXhpbXVtPWUsdGhpcy5yZW5kZXIoKSkpKX10aGlzLl9pZ25vcmVOZXh0RXZlbnQ9CishMDt0aGlzLnpvb21FbmFibGVkJiYibm9uZSI9PT10aGlzLl96b29tQnV0dG9uLnN0eWxlLmRpc3BsYXkmJihrYSh0aGlzLl96b29tQnV0dG9uLHRoaXMuX3Jlc2V0QnV0dG9uKSxNKHRoaXMsdGhpcy5fem9vbUJ1dHRvbiwicGFuIiksTSh0aGlzLHRoaXMuX3Jlc2V0QnV0dG9uLCJyZXNldCIpKX19dGhpcy5pc0RyYWc9ITF9O3YucHJvdG90eXBlLl9wbG90QXJlYU1vdXNlTW92ZT1mdW5jdGlvbihhLGIpe2lmKHRoaXMuaXNEcmFnJiYibm9uZSIhPT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQpe3ZhciBjPTAsZD0wLGQ9dGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXM7Inh5U3dhcHBlZCI9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQ/KGM9Yi10aGlzLmRyYWdTdGFydFBvaW50LnksZD1NYXRoLmFicyh0aGlzLmF4aXNYLm1heGltdW0tdGhpcy5heGlzWC5taW5pbXVtKS9kLmhlaWdodCpjKTooYz10aGlzLmRyYWdTdGFydFBvaW50LngtYSxkPU1hdGguYWJzKHRoaXMuYXhpc1gubWF4aW11bS0KK3RoaXMuYXhpc1gubWluaW11bSkvZC53aWR0aCpjKTsyPE1hdGguYWJzKGMpJiY4Pk1hdGguYWJzKGMpJiYodGhpcy5wYW5FbmFibGVkfHx0aGlzLnpvb21FbmFibGVkKT90aGlzLl90b29sVGlwLmhpZGUoKTohdGhpcy5fdG9vbFRpcC5lbmFibGVkfHwodGhpcy5wYW5FbmFibGVkfHx0aGlzLnpvb21FbmFibGVkKXx8dGhpcy5fdG9vbFRpcC5tb3VzZU1vdmVIYW5kbGVyKGEsYik7aWYoMjxNYXRoLmFicyhjKSYmKHRoaXMucGFuRW5hYmxlZHx8dGhpcy56b29tRW5hYmxlZCkpaWYodGhpcy5wYW5FbmFibGVkKXt0aGlzLmF4aXNYLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNaW5pbXVtPXRoaXMuZHJhZ1N0YXJ0UG9pbnQueE1pbmltdW0rZDt0aGlzLmF4aXNYLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNYXhpbXVtPXRoaXMuZHJhZ1N0YXJ0UG9pbnQueE1heGltdW0rZDtjPTA7dGhpcy5heGlzWC5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWluaW11bTx0aGlzLmF4aXNYLl9hYnNvbHV0ZU1pbmltdW0tCitZKHRoaXMuYXhpc1guaW50ZXJ2YWwsdGhpcy5heGlzWC5pbnRlcnZhbFR5cGUpPyhjPXRoaXMuYXhpc1guX2Fic29sdXRlTWluaW11bS1ZKHRoaXMuYXhpc1guaW50ZXJ2YWwsdGhpcy5heGlzWC5pbnRlcnZhbFR5cGUpLXRoaXMuYXhpc1guc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1pbmltdW0sdGhpcy5heGlzWC5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWluaW11bSs9Yyx0aGlzLmF4aXNYLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNYXhpbXVtKz1jKTp0aGlzLmF4aXNYLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNYXhpbXVtPnRoaXMuYXhpc1guX2Fic29sdXRlTWF4aW11bStZKHRoaXMuYXhpc1guaW50ZXJ2YWwsdGhpcy5heGlzWC5pbnRlcnZhbFR5cGUpJiYoYz10aGlzLmF4aXNYLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNYXhpbXVtLSh0aGlzLmF4aXNYLl9hYnNvbHV0ZU1heGltdW0rWSh0aGlzLmF4aXNYLmludGVydmFsLHRoaXMuYXhpc1guaW50ZXJ2YWxUeXBlKSksCit0aGlzLmF4aXNYLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNYXhpbXVtLT1jLHRoaXMuYXhpc1guc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1pbmltdW0tPWMpO3ZhciBlPXRoaXM7Y2xlYXJUaW1lb3V0KHRoaXMuX3BhblRpbWVySWQpO3RoaXMuX3BhblRpbWVySWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UucmVuZGVyKCl9LDApfWVsc2UgdGhpcy56b29tRW5hYmxlZCYmKGM9dGhpcy5wbG90QXJlYSx0aGlzLnJlc2V0T3ZlcmxheWVkQ2FudmFzKCksZD10aGlzLm92ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhLHRoaXMub3ZlcmxhaWRDYW52YXNDdHguZ2xvYmFsQWxwaGE9MC43LHRoaXMub3ZlcmxhaWRDYW52YXNDdHguZmlsbFN0eWxlPSIjQTBBQkI4IiwieHlTd2FwcGVkIj09PXRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudD90aGlzLm92ZXJsYWlkQ2FudmFzQ3R4LmZpbGxSZWN0KGMueDEsdGhpcy5kcmFnU3RhcnRQb2ludC55LGMueDItYy54MSxiLXRoaXMuZHJhZ1N0YXJ0UG9pbnQueSk6Cisibm9ybWFsIj09PXRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCYmdGhpcy5vdmVybGFpZENhbnZhc0N0eC5maWxsUmVjdCh0aGlzLmRyYWdTdGFydFBvaW50LngsYy55MSxhLXRoaXMuZHJhZ1N0YXJ0UG9pbnQueCxjLnkyLWMueTEpLHRoaXMub3ZlcmxhaWRDYW52YXNDdHguZ2xvYmFsQWxwaGE9ZCl9ZWxzZSB0aGlzLl90b29sVGlwLmVuYWJsZWQmJnRoaXMuX3Rvb2xUaXAubW91c2VNb3ZlSGFuZGxlcihhLGIpfTt2LnByb3RvdHlwZS5wcmVwYXJlUGxvdEFyZWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsb3RBcmVhLGI9dGhpcy5heGlzWT90aGlzLmF4aXNZOnRoaXMuYXhpc1kyOyF0JiYoMDxhLngxfHwwPGEueTEpJiZhLmN0eC50cmFuc2xhdGUoYS54MSxhLnkxKTt0aGlzLmF4aXNYJiZiPyhhLngxPXRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngxPHRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngyP3RoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngxOmIubGluZUNvb3JkaW5hdGVzLngxLAorYS55MT10aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy55MTxiLmxpbmVDb29yZGluYXRlcy55MT90aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy55MTpiLmxpbmVDb29yZGluYXRlcy55MSxhLngyPXRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngyPmIubGluZUNvb3JkaW5hdGVzLngyP3RoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngyOmIubGluZUNvb3JkaW5hdGVzLngyLGEueTI9dGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueTI+dGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueTE/dGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueTI6Yi5saW5lQ29vcmRpbmF0ZXMueTIsYS53aWR0aD1hLngyLWEueDEsYS5oZWlnaHQ9YS55Mi1hLnkxKTooYj10aGlzLmxheW91dE1hbmFnZXIuZ2V0RnJlZVNwYWNlKCksYS54MT1iLngxLGEueDI9Yi54MixhLnkxPWIueTEsYS55Mj1iLnkyLGEud2lkdGg9Yi53aWR0aCxhLmhlaWdodD1iLmhlaWdodCk7dHx8KGEuY2FudmFzLndpZHRoPWEud2lkdGgsCithLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMuc3R5bGUubGVmdD1hLngxKyJweCIsYS5jYW52YXMuc3R5bGUudG9wPWEueTErInB4IiwoMDxhLngxfHwwPGEueTEpJiZhLmN0eC50cmFuc2xhdGUoLWEueDEsLWEueTEpKX07di5wcm90b3R5cGUuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWE9ZnVuY3Rpb24oYSxiKXtyZXR1cm57eDp0aGlzLmF4aXNYLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMoYSkueCx5OnRoaXMuYXhpc1kuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyhiKS55fX07di5wcm90b3R5cGUucmVuZGVySW5kZXhMYWJlbHM9ZnVuY3Rpb24oYSl7YT1hfHx0aGlzLnBsb3RBcmVhLmN0eDthLnRleHRCYXNlbGluZT0ibWlkZGxlIjtmb3IodmFyIGI9dGhpcy5wbG90QXJlYSxjPTA7Yzx0aGlzLl9pbmRleExhYmVscy5sZW5ndGg7YysrKXt2YXIgZD10aGlzLl9pbmRleExhYmVsc1tjXSxlLGYsZzthLmZpbGxTdHlsZT1UKCJpbmRleExhYmVsRm9udENvbG9yIiwKK2QuZGF0YVBvaW50LGQuZGF0YVNlcmllcyk7YS5mb250PXVhKCJpbmRleExhYmVsIixkLmRhdGFQb2ludCxkLmRhdGFTZXJpZXMpO3ZhciBrPXRoaXMucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKFQoImluZGV4TGFiZWwiLGQuZGF0YVBvaW50LGQuZGF0YVNlcmllcyksZC5kYXRhUG9pbnQsZC5kYXRhU2VyaWVzLG51bGwsZC5pbmRleEtleXdvcmQpLHA9YS5tZWFzdXJlVGV4dChrKS53aWR0aCxoPVQoImluZGV4TGFiZWxGb250U2l6ZSIsZC5kYXRhUG9pbnQsZC5kYXRhU2VyaWVzKSxsPVQoImluZGV4TGFiZWxQbGFjZW1lbnQiLGQuZGF0YVBvaW50LGQuZGF0YVNlcmllcykscj1UKCJpbmRleExhYmVsT3JpZW50YXRpb24iLGQuZGF0YVBvaW50LGQuZGF0YVNlcmllcyksbT1nPTAscT0wLG49MCxuPW09cT0wLHM9ZC5kaXJlY3Rpb24sbT1kLmRhdGFTZXJpZXMuYXhpc1gsbj1kLmRhdGFTZXJpZXMuYXhpc1k7ZC5kYXRhUG9pbnQueDxtLm1pbmltdW18fChkLmRhdGFQb2ludC54Pm0ubWF4aW11bXx8CitkLmRhdGFQb2ludC55PG4ubWluaW11bXx8ZC5kYXRhUG9pbnQueT5uLm1heGltdW0pfHwoImNvbHVtbiI9PT1kLmNoYXJ0VHlwZXx8InN0YWNrZWRDb2x1bW4iPT09ZC5jaGFydFR5cGV8fCJzdGFja2VkQ29sdW1uMTAwIj09PWQuY2hhcnRUeXBlfHwiYmFyIj09PWQuY2hhcnRUeXBlfHwic3RhY2tlZEJhciI9PT1kLmNoYXJ0VHlwZXx8InN0YWNrZWRCYXIxMDAiPT09ZC5jaGFydFR5cGV8fCJjYW5kbGVzdGljayI9PT1kLmNoYXJ0VHlwZXx8Im9obGMiPT09ZC5jaGFydFR5cGV8fCJyYW5nZUNvbHVtbiI9PT1kLmNoYXJ0VHlwZXx8InJhbmdlQmFyIj09PWQuY2hhcnRUeXBlPyhtPW49NSxNYXRoLmFicyhkLmJvdW5kcy54MSxkLmJvdW5kcy54MiksTWF0aC5hYnMoZC5ib3VuZHMueTEsZC5ib3VuZHMueTIpLCJub3JtYWwiPT09dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50PygiaW5zaWRlIiE9PWw/KG09Yi55MSxxPWIueTIpOihtPWQuYm91bmRzLnkxLHE9ZC5ib3VuZHMueTIpLCJob3Jpem9udGFsIj09PQorcj8oZT1kLnBvaW50LngtcC8yLGY9MDw9cz9kLnBvaW50LnktaC8yLW48bStoLzI/ImF1dG8iPT09bD9NYXRoLm1pbihNYXRoLm1heChkLnBvaW50LnksbSkraC8yKzEscS1oLzItbik6TWF0aC5taW4obStoLzIrMSxxLWgvMi1uKTpNYXRoLm1pbihkLnBvaW50LnktaC8yLW4rMSxxLWgvMi1uKTpkLnBvaW50LnkraC8yK24+cS1oLzItMT8iYXV0byI9PT1sP01hdGgubWF4KE1hdGgubWluKGQucG9pbnQueSxxKS1oLzItMSxtK2gvMituKTpNYXRoLm1heChxLWgvMi0xLG0raC8yK24pOk1hdGgubWF4KGQucG9pbnQueStoLzIrbixtK2gvMituKSk6InZlcnRpY2FsIj09PXImJihlPWQucG9pbnQueCxmPTA8PXM/ZC5wb2ludC55LW48bStwKzE/ImF1dG8iPT09bD9NYXRoLm1pbihNYXRoLm1heChkLnBvaW50LnksbSkrcCsxLHEpOk1hdGgubWluKG0rcCsxLHEpOk1hdGgubWluKGQucG9pbnQueS1uLHEtMSk6ZC5wb2ludC55K3Arbj5xLTE/ImF1dG8iPT09bD9NYXRoLm1heChNYXRoLm1pbihkLnBvaW50LnksCitxKS1uLG0pOk1hdGgubWF4KHEtMSxtKTpNYXRoLm1heChkLnBvaW50LnkrcCtuLG0pLGc9LTkwKSk6Inh5U3dhcHBlZCI9PT10aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQmJigiaW5zaWRlIiE9PWw/KG49Yi54MSxxPWIueDIpOihuPWQuYm91bmRzLngxLHE9ZC5ib3VuZHMueDIpLCJob3Jpem9udGFsIj09PXI/KGY9ZC5wb2ludC55LGU9MDw9cz9kLnBvaW50LngrbT5xLXA/ImF1dG8iPT09bD9NYXRoLm1heChNYXRoLm1pbihkLnBvaW50LngscSktcCxuKTpNYXRoLm1heChxLXAsbik6TWF0aC5tYXgoZC5wb2ludC54K20sbik6ZC5wb2ludC54LXAtbTxuPyJhdXRvIj09PWw/TWF0aC5taW4oTWF0aC5tYXgoZC5wb2ludC54LG4pKzEscSk6TWF0aC5taW4obisxLHEpOk1hdGgubWluKGQucG9pbnQueC1wLW0scSkpOiJ2ZXJ0aWNhbCI9PT1yJiYoZj1kLnBvaW50LnkrcC8yLGU9MDw9cz9kLnBvaW50LngraC8yK20+cS1oLzI/ImF1dG8iPT09bD9NYXRoLm1heChNYXRoLm1pbihkLnBvaW50LngsCitxKS1oLzIsbik6TWF0aC5tYXgocS1oLzIsbik6TWF0aC5tYXgoZC5wb2ludC54K2gvMittLG4pOmQucG9pbnQueC1oLzItbTxuK2gvMj8iYXV0byI9PT1sP01hdGgubWluKE1hdGgubWF4KGQucG9pbnQueCxuKStoLzIscStoLzIpOk1hdGgubWluKG4raC8yLHEraC8yKTpNYXRoLm1pbihkLnBvaW50LngtaC8yLW0scStoLzIpLGc9LTkwKSkpOihuPTUsImhvcml6b250YWwiPT09cj8oZT1kLnBvaW50LngtcC8yLCJidWJibGUiPT09ZC5jaGFydFR5cGUmJihuPS1oLzIpLGY9MDxzP01hdGgubWF4KGQucG9pbnQueS1oLzItbixiLnkxK2gvMik6TWF0aC5taW4oZC5wb2ludC55K2gvMituLGIueTItaC8yKSk6InZlcnRpY2FsIj09PXImJihlPWQucG9pbnQueCwiYnViYmxlIj09PWQuY2hhcnRUeXBlJiYobj0tcC8yKSxmPTA8cz9NYXRoLm1heChkLnBvaW50LnktbixiLnkxK3ApOk1hdGgubWluKGQucG9pbnQueStwK24sYi55MiksZz0tOTApKSxhLnNhdmUoKSxhLnRyYW5zbGF0ZShlLGYpLAorYS5yb3RhdGUoTWF0aC5QSS8xODAqZyksYS5maWxsVGV4dChrLDAsMCksYS5yZXN0b3JlKCkpfXJldHVybntzb3VyY2U6YSxkZXN0OnRoaXMucGxvdEFyZWEuY3R4LGFuaW1hdGlvbkNhbGxiYWNrOnkuZmFkZUluQW5pbWF0aW9uLGVhc2luZ0Z1bmN0aW9uOnkuZWFzaW5nLmVhc2VJblF1YWQsYW5pbWF0aW9uQmFzZTowLHN0YXJ0VGltZVBlcmNlbnQ6MC43fX07di5wcm90b3R5cGUucmVuZGVyTGluZT1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBjPXRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtiLnNhdmUoKTt2YXIgZD10aGlzLnBsb3RBcmVhO2IuYmVnaW5QYXRoKCk7Yi5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KTtiLmNsaXAoKTtmb3IodmFyIGQ9W10sZT0wO2U8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7ZSsrKXt2YXIgZj1hLmRhdGFTZXJpZXNJbmRleGVzW2VdLAorZz10aGlzLmRhdGFbZl07Yi5saW5lV2lkdGg9Zy5saW5lVGhpY2tuZXNzO3ZhciBrPWcuZGF0YVBvaW50cyxwPWcuaWQ7dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtwXT17b2JqZWN0VHlwZToiZGF0YVNlcmllcyIsZGF0YVNlcmllc0luZGV4OmZ9O3A9QyhwKTtjLnN0cm9rZVN0eWxlPXA7Yy5saW5lV2lkdGg9MDxnLmxpbmVUaGlja25lc3M/TWF0aC5tYXgoZy5saW5lVGhpY2tuZXNzLDQpOjA7cD1nLl9jb2xvclNldFswXTtiLnN0cm9rZVN0eWxlPXA7dmFyIGg9ITAsbD0wLHIsbTtiLmJlZ2luUGF0aCgpO2lmKDA8ay5sZW5ndGgpe2Zvcih2YXIgcT0hMSxsPTA7bDxrLmxlbmd0aDtsKyspaWYocj1rW2xdLnguZ2V0VGltZT9rW2xdLnguZ2V0VGltZSgpOmtbbF0ueCwhKHI8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8cj5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSlpZigibnVtYmVyIiE9PXR5cGVvZiBrW2xdLnkpMDxsJiYoYi5zdHJva2UoKSx0JiZjLnN0cm9rZSgpKSwKK3E9ITA7ZWxzZXtyPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihyLWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO209YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKGtbbF0ueS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDt2YXIgbj1nLmRhdGFQb2ludElkc1tsXTt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW25dPXtpZDpuLG9iamVjdFR5cGU6ImRhdGFQb2ludCIsZGF0YVNlcmllc0luZGV4OmYsZGF0YVBvaW50SW5kZXg6bCx4MTpyLHkxOm19O2h8fHE/KGIuYmVnaW5QYXRoKCksYi5tb3ZlVG8ocixtKSx0JiYoYy5iZWdpblBhdGgoKSxjLm1vdmVUbyhyLG0pKSxxPWg9ITEpOihiLmxpbmVUbyhyLG0pLHQmJgorYy5saW5lVG8ocixtKSwwPT1sJTUwMCYmKGIuc3Ryb2tlKCksYi5iZWdpblBhdGgoKSxiLm1vdmVUbyhyLG0pLHQmJihjLnN0cm9rZSgpLGMuYmVnaW5QYXRoKCksYy5tb3ZlVG8ocixtKSkpKTtpZigwPGtbbF0ubWFya2VyU2l6ZXx8MDxnLm1hcmtlclNpemUpe3ZhciBzPWcuZ2V0TWFya2VyUHJvcGVydGllcyhsLHIsbSxiKTtkLnB1c2gocyk7bj1DKG4pO3QmJmQucHVzaCh7eDpyLHk6bSxjdHg6Yyx0eXBlOnMudHlwZSxzaXplOnMuc2l6ZSxjb2xvcjpuLGJvcmRlckNvbG9yOm4sYm9yZGVyVGhpY2tuZXNzOnMuYm9yZGVyVGhpY2tuZXNzfSl9KGtbbF0uaW5kZXhMYWJlbHx8Zy5pbmRleExhYmVsKSYmdGhpcy5faW5kZXhMYWJlbHMucHVzaCh7Y2hhcnRUeXBlOiJsaW5lIixkYXRhUG9pbnQ6a1tsXSxkYXRhU2VyaWVzOmcscG9pbnQ6e3g6cix5Om19LGRpcmVjdGlvbjowPD1rW2xdLnk/MTotMSxjb2xvcjpwfSl9Yi5zdHJva2UoKTt0JiZjLnN0cm9rZSgpfX1KLmRyYXdNYXJrZXJzKGQpOworYi5yZXN0b3JlKCk7Yi5iZWdpblBhdGgoKTt0JiZjLmJlZ2luUGF0aCgpO3JldHVybntzb3VyY2U6YixkZXN0OnRoaXMucGxvdEFyZWEuY3R4LGFuaW1hdGlvbkNhbGxiYWNrOnkueENsaXBBbmltYXRpb24sZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcubGluZWFyLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJTdGVwTGluZT1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBjPXRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtiLnNhdmUoKTt2YXIgZD10aGlzLnBsb3RBcmVhO2IuYmVnaW5QYXRoKCk7Yi5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KTtiLmNsaXAoKTtmb3IodmFyIGQ9W10sZT0wO2U8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7ZSsrKXt2YXIgZj1hLmRhdGFTZXJpZXNJbmRleGVzW2VdLGc9dGhpcy5kYXRhW2ZdOworYi5saW5lV2lkdGg9Zy5saW5lVGhpY2tuZXNzO3ZhciBrPWcuZGF0YVBvaW50cyxwPWcuaWQ7dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtwXT17b2JqZWN0VHlwZToiZGF0YVNlcmllcyIsZGF0YVNlcmllc0luZGV4OmZ9O3A9QyhwKTtjLnN0cm9rZVN0eWxlPXA7Yy5saW5lV2lkdGg9MDxnLmxpbmVUaGlja25lc3M/TWF0aC5tYXgoZy5saW5lVGhpY2tuZXNzLDQpOjA7cD1nLl9jb2xvclNldFswXTtiLnN0cm9rZVN0eWxlPXA7dmFyIGg9ITAsbD0wLHIsbTtiLmJlZ2luUGF0aCgpO2lmKDA8ay5sZW5ndGgpe2Zvcih2YXIgcT0hMSxsPTA7bDxrLmxlbmd0aDtsKyspaWYocj1rW2xdLmdldFRpbWU/a1tsXS54LmdldFRpbWUoKTprW2xdLngsIShyPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fHI+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkpaWYoIm51bWJlciIhPT10eXBlb2Yga1tsXS55KTA8bCYmKGIuc3Ryb2tlKCksdCYmYy5zdHJva2UoKSkscT0hMDtlbHNle3ZhciBuPQorbTtyPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihyLWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO209YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKGtbbF0ueS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDt2YXIgcz1nLmRhdGFQb2ludElkc1tsXTt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3NdPXtpZDpzLG9iamVjdFR5cGU6ImRhdGFQb2ludCIsZGF0YVNlcmllc0luZGV4OmYsZGF0YVBvaW50SW5kZXg6bCx4MTpyLHkxOm19O2h8fHE/KGIuYmVnaW5QYXRoKCksYi5tb3ZlVG8ocixtKSx0JiYoYy5iZWdpblBhdGgoKSxjLm1vdmVUbyhyLG0pKSxxPWg9ITEpOihiLmxpbmVUbyhyLG4pLHQmJmMubGluZVRvKHIsCituKSxiLmxpbmVUbyhyLG0pLHQmJmMubGluZVRvKHIsbSksMD09bCU1MDAmJihiLnN0cm9rZSgpLGIuYmVnaW5QYXRoKCksYi5tb3ZlVG8ocixtKSx0JiYoYy5zdHJva2UoKSxjLmJlZ2luUGF0aCgpLGMubW92ZVRvKHIsbSkpKSk7aWYoMDxrW2xdLm1hcmtlclNpemV8fDA8Zy5tYXJrZXJTaXplKW49Zy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGwscixtLGIpLGQucHVzaChuKSxzPUMocyksdCYmZC5wdXNoKHt4OnIseTptLGN0eDpjLHR5cGU6bi50eXBlLHNpemU6bi5zaXplLGNvbG9yOnMsYm9yZGVyQ29sb3I6cyxib3JkZXJUaGlja25lc3M6bi5ib3JkZXJUaGlja25lc3N9KTsoa1tsXS5pbmRleExhYmVsfHxnLmluZGV4TGFiZWwpJiZ0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6InN0ZXBMaW5lIixkYXRhUG9pbnQ6a1tsXSxkYXRhU2VyaWVzOmcscG9pbnQ6e3g6cix5Om19LGRpcmVjdGlvbjowPD1rW2xdLnk/MTotMSxjb2xvcjpwfSl9Yi5zdHJva2UoKTt0JiZjLnN0cm9rZSgpfX1KLmRyYXdNYXJrZXJzKGQpOworYi5yZXN0b3JlKCk7Yi5iZWdpblBhdGgoKTt0JiZjLmJlZ2luUGF0aCgpO3JldHVybntzb3VyY2U6YixkZXN0OnRoaXMucGxvdEFyZWEuY3R4LGFuaW1hdGlvbkNhbGxiYWNrOnkueENsaXBBbmltYXRpb24sZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcubGluZWFyLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJTcGxpbmU9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXthPWZhKGEsMik7aWYoMDxhLmxlbmd0aCl7Yy5iZWdpblBhdGgoKTt0JiZkLmJlZ2luUGF0aCgpO2MubW92ZVRvKGFbMF0ueCxhWzBdLnkpO3QmJmQubW92ZVRvKGFbMF0ueCxhWzBdLnkpO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGgtMztiKz0zKWMuYmV6aWVyQ3VydmVUbyhhW2IrMV0ueCxhW2IrMV0ueSxhW2IrMl0ueCxhW2IrMl0ueSxhW2IrM10ueCxhW2IrM10ueSksdCYmZC5iZXppZXJDdXJ2ZVRvKGFbYisxXS54LGFbYisxXS55LGFbYisyXS54LGFbYisyXS55LGFbYiszXS54LGFbYiszXS55KSwwPAorYiYmMD09PWIlM0UzJiYoYy5zdHJva2UoKSxjLmJlZ2luUGF0aCgpLGMubW92ZVRvKGFbYiszXS54LGFbYiszXS55KSx0JiYoZC5zdHJva2UoKSxkLmJlZ2luUGF0aCgpLGQubW92ZVRvKGFbYiszXS54LGFbYiszXS55KSkpO2Muc3Ryb2tlKCk7dCYmZC5zdHJva2UoKX19dmFyIGM9YS50YXJnZXRDYW52YXNDdHh8fHRoaXMucGxvdEFyZWEuY3R4O2lmKCEoMD49YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGgpKXt2YXIgZD10aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHg7Yy5zYXZlKCk7dmFyIGU9dGhpcy5wbG90QXJlYTtjLmJlZ2luUGF0aCgpO2MucmVjdChlLngxLGUueTEsZS53aWR0aCxlLmhlaWdodCk7Yy5jbGlwKCk7Zm9yKHZhciBlPVtdLGY9MDtmPGEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2YrKyl7dmFyIGc9YS5kYXRhU2VyaWVzSW5kZXhlc1tmXSxrPXRoaXMuZGF0YVtnXTtjLmxpbmVXaWR0aD1rLmxpbmVUaGlja25lc3M7dmFyIHA9ay5kYXRhUG9pbnRzLGg9ay5pZDsKK3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaF09e29iamVjdFR5cGU6ImRhdGFTZXJpZXMiLGRhdGFTZXJpZXNJbmRleDpnfTtoPUMoaCk7ZC5zdHJva2VTdHlsZT1oO2QubGluZVdpZHRoPTA8ay5saW5lVGhpY2tuZXNzP01hdGgubWF4KGsubGluZVRoaWNrbmVzcyw0KTowO2g9ay5fY29sb3JTZXRbMF07Yy5zdHJva2VTdHlsZT1oO3ZhciBsPTAscixtLHE9W107Yy5iZWdpblBhdGgoKTtpZigwPHAubGVuZ3RoKWZvcihsPTA7bDxwLmxlbmd0aDtsKyspaWYocj1wW2xdLmdldFRpbWU/cFtsXS54LmdldFRpbWUoKTpwW2xdLngsIShyPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fHI+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkpaWYoIm51bWJlciIhPT10eXBlb2YgcFtsXS55KTA8bCYmKGIocSkscT1bXSk7ZWxzZXtyPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KgorKHItYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7bT1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoocFtsXS55LWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO3ZhciBuPWsuZGF0YVBvaW50SWRzW2xdO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbbl09e2lkOm4sb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhU2VyaWVzSW5kZXg6ZyxkYXRhUG9pbnRJbmRleDpsLHgxOnIseTE6bX07cVtxLmxlbmd0aF09e3g6cix5Om19O2lmKDA8cFtsXS5tYXJrZXJTaXplfHwwPGsubWFya2VyU2l6ZSl7dmFyIHM9ay5nZXRNYXJrZXJQcm9wZXJ0aWVzKGwscixtLGMpO2UucHVzaChzKTtuPUMobik7dCYmZS5wdXNoKHt4OnIseTptLGN0eDpkLHR5cGU6cy50eXBlLHNpemU6cy5zaXplLGNvbG9yOm4sYm9yZGVyQ29sb3I6bixib3JkZXJUaGlja25lc3M6cy5ib3JkZXJUaGlja25lc3N9KX0ocFtsXS5pbmRleExhYmVsfHwKK2suaW5kZXhMYWJlbCkmJnRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToic3BsaW5lIixkYXRhUG9pbnQ6cFtsXSxkYXRhU2VyaWVzOmsscG9pbnQ6e3g6cix5Om19LGRpcmVjdGlvbjowPD1wW2xdLnk/MTotMSxjb2xvcjpofSl9YihxKX1KLmRyYXdNYXJrZXJzKGUpO2MucmVzdG9yZSgpO2MuYmVnaW5QYXRoKCk7dCYmZC5iZWdpblBhdGgoKTtyZXR1cm57c291cmNlOmMsZGVzdDp0aGlzLnBsb3RBcmVhLmN0eCxhbmltYXRpb25DYWxsYmFjazp5LnhDbGlwQW5pbWF0aW9uLGVhc2luZ0Z1bmN0aW9uOnkuZWFzaW5nLmxpbmVhcixhbmltYXRpb25CYXNlOjB9fX07dmFyIEY9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxrLHAsaCxsLHIsbSl7InVuZGVmaW5lZCI9PT10eXBlb2YgbSYmKG09MSk7Zz1nfHwwO2s9a3x8ImJsYWNrIjt2YXIgcT0xNTxkLWImJjE1PGUtYz84OjAuMzUqTWF0aC5taW4oZC1iLGUtYyk7YS5iZWdpblBhdGgoKTthLm1vdmVUbyhiLGMpO2Euc2F2ZSgpOworYS5maWxsU3R5bGU9ZjthLmdsb2JhbEFscGhhPW07YS5maWxsUmVjdChiLGMsZC1iLGUtYyk7YS5nbG9iYWxBbHBoYT0xOzA8ZyYmKG09MD09PWclMj8wOjAuNSxhLmJlZ2luUGF0aCgpLGEubGluZVdpZHRoPWcsYS5zdHJva2VTdHlsZT1rLGEubW92ZVRvKGIsYyksYS5yZWN0KGItbSxjLW0sZC1iKzIqbSxlLWMrMiptKSxhLnN0cm9rZSgpKTthLnJlc3RvcmUoKTshMD09PXAmJihhLnNhdmUoKSxhLmJlZ2luUGF0aCgpLGEubW92ZVRvKGIsYyksYS5saW5lVG8oYitxLGMrcSksYS5saW5lVG8oZC1xLGMrcSksYS5saW5lVG8oZCxjKSxhLmNsb3NlUGF0aCgpLGc9YS5jcmVhdGVMaW5lYXJHcmFkaWVudCgoZCtiKS8yLGMrcSwoZCtiKS8yLGMpLGcuYWRkQ29sb3JTdG9wKDAsZiksZy5hZGRDb2xvclN0b3AoMSwicmdiYSgyNTUsIDI1NSwgMjU1LCAuNCkiKSxhLmZpbGxTdHlsZT1nLGEuZmlsbCgpLGEucmVzdG9yZSgpKTshMD09PWgmJihhLnNhdmUoKSxhLmJlZ2luUGF0aCgpLGEubW92ZVRvKGIsCitlKSxhLmxpbmVUbyhiK3EsZS1xKSxhLmxpbmVUbyhkLXEsZS1xKSxhLmxpbmVUbyhkLGUpLGEuY2xvc2VQYXRoKCksZz1hLmNyZWF0ZUxpbmVhckdyYWRpZW50KChkK2IpLzIsZS1xLChkK2IpLzIsZSksZy5hZGRDb2xvclN0b3AoMCxmKSxnLmFkZENvbG9yU3RvcCgxLCJyZ2JhKDI1NSwgMjU1LCAyNTUsIC40KSIpLGEuZmlsbFN0eWxlPWcsYS5maWxsKCksYS5yZXN0b3JlKCkpOyEwPT09bCYmKGEuc2F2ZSgpLGEuYmVnaW5QYXRoKCksYS5tb3ZlVG8oYixjKSxhLmxpbmVUbyhiK3EsYytxKSxhLmxpbmVUbyhiK3EsZS1xKSxhLmxpbmVUbyhiLGUpLGEuY2xvc2VQYXRoKCksZz1hLmNyZWF0ZUxpbmVhckdyYWRpZW50KGIrcSwoZStjKS8yLGIsKGUrYykvMiksZy5hZGRDb2xvclN0b3AoMCxmKSxnLmFkZENvbG9yU3RvcCgxLCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkiKSxhLmZpbGxTdHlsZT1nLGEuZmlsbCgpLGEucmVzdG9yZSgpKTshMD09PXImJihhLnNhdmUoKSxhLmJlZ2luUGF0aCgpLAorYS5tb3ZlVG8oZCxjKSxhLmxpbmVUbyhkLXEsYytxKSxhLmxpbmVUbyhkLXEsZS1xKSxhLmxpbmVUbyhkLGUpLGc9YS5jcmVhdGVMaW5lYXJHcmFkaWVudChkLXEsKGUrYykvMixkLChlK2MpLzIpLGcuYWRkQ29sb3JTdG9wKDAsZiksZy5hZGRDb2xvclN0b3AoMSwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpIiksYS5maWxsU3R5bGU9ZyxnLmFkZENvbG9yU3RvcCgwLGYpLGcuYWRkQ29sb3JTdG9wKDEsInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpLGEuZmlsbFN0eWxlPWcsYS5maWxsKCksYS5jbG9zZVBhdGgoKSxhLnJlc3RvcmUoKSl9O3YucHJvdG90eXBlLnJlbmRlckNvbHVtbj1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBjPW51bGwsZD10aGlzLnBsb3RBcmVhLGU9MCxmLGcsayxwPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlKworYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKDAtYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKTw8MCxlPU1hdGgubWluKDAuMTUqdGhpcy53aWR0aCwwLjkqKHRoaXMucGxvdEFyZWEud2lkdGgvYS5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMpKTw8MCxoPWEuYXhpc1guZGF0YUluZm8ubWluRGlmZixsPTAuOSooZC53aWR0aC9NYXRoLmFicyhhLmF4aXNYLm1heGltdW0tYS5heGlzWC5taW5pbXVtKSpNYXRoLmFicyhoKS9hLnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcyk8PDA7bD5lP2w9ZTpJbmZpbml0eT09PWg/bD1lOjE+bCYmKGw9MSk7Yi5zYXZlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtiLmJlZ2luUGF0aCgpO2IucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCk7Yi5jbGlwKCk7dCYmKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KSwKK3RoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCkpO2ZvcihkPTA7ZDxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtkKyspe3ZhciBoPWEuZGF0YVNlcmllc0luZGV4ZXNbZF0scj10aGlzLmRhdGFbaF0sbT1yLmRhdGFQb2ludHM7aWYoMDxtLmxlbmd0aClmb3IodmFyIHE9NTxsJiZyLmJldmVsRW5hYmxlZD8hMDohMSxlPTA7ZTxtLmxlbmd0aDtlKyspaWYobVtlXS5nZXRUaW1lP2s9bVtlXS54LmdldFRpbWUoKTprPW1bZV0ueCwhKGs8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8az5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSYmIm51bWJlciI9PT10eXBlb2YgbVtlXS55KXtmPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihrLWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO2c9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrCithLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoobVtlXS55LWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO2Y9Zi1hLnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcypsLzIrKGEucHJldmlvdXNEYXRhU2VyaWVzQ291bnQrZCkqbDw8MDt2YXIgbj1mK2w8PDAsczswPD1tW2VdLnk/cz1wOihzPWcsZz1wKTtnPnMmJihzPWc9cyk7Yz1tW2VdLmNvbG9yP21bZV0uY29sb3I6ci5fY29sb3JTZXRbZSVyLl9jb2xvclNldC5sZW5ndGhdO0YoYixmLGcsbixzLGMsMCxudWxsLHEmJjA8PW1bZV0ueSwwPm1bZV0ueSYmcSwhMSwhMSxyLmZpbGxPcGFjaXR5KTtjPXIuZGF0YVBvaW50SWRzW2VdO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbY109e2lkOmMsb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhU2VyaWVzSW5kZXg6aCxkYXRhUG9pbnRJbmRleDplLHgxOmYseTE6Zyx4MjpuLHkyOnN9O2M9QyhjKTt0JiZGKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCwKK2YsZyxuLHMsYywwLG51bGwsITEsITEsITEsITEpOyhtW2VdLmluZGV4TGFiZWx8fHIuaW5kZXhMYWJlbCkmJnRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToiY29sdW1uIixkYXRhUG9pbnQ6bVtlXSxkYXRhU2VyaWVzOnIscG9pbnQ6e3g6Zisobi1mKS8yLHk6MDw9bVtlXS55P2c6c30sZGlyZWN0aW9uOjA8PW1bZV0ueT8xOi0xLGJvdW5kczp7eDE6Zix5MTpNYXRoLm1pbihnLHMpLHgyOm4seTI6TWF0aC5tYXgoZyxzKX0sY29sb3I6Y30pfX1iLnJlc3RvcmUoKTt0JiZ0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO2E9TWF0aC5taW4ocCxhLmF4aXNZLmJvdW5kaW5nUmVjdC55Mik7cmV0dXJue3NvdXJjZTpiLGRlc3Q6dGhpcy5wbG90QXJlYS5jdHgsYW5pbWF0aW9uQ2FsbGJhY2s6eS55U2NhbGVBbmltYXRpb24sZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcuZWFzZU91dFF1YXJ0LGFuaW1hdGlvbkJhc2U6YX19fTt2LnByb3RvdHlwZS5yZW5kZXJTdGFja2VkQ29sdW1uPQorZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXRDYW52YXNDdHh8fHRoaXMucGxvdEFyZWEuY3R4O2lmKCEoMD49YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGgpKXt2YXIgYz1udWxsLGQ9dGhpcy5wbG90QXJlYSxlPVtdLGY9W10sZz0wLGsscD1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooMC1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pPDwwLGc9MC4xNSp0aGlzLndpZHRoPDwwLGg9YS5heGlzWC5kYXRhSW5mby5taW5EaWZmLGw9MC45KihkLndpZHRoL01hdGguYWJzKGEuYXhpc1gubWF4aW11bS1hLmF4aXNYLm1pbmltdW0pKk1hdGguYWJzKGgpL2EucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCk8PDA7bD5nP2w9ZzpJbmZpbml0eT09PWg/bD1nOjE+bCYmKGw9MSk7Yi5zYXZlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtiLmJlZ2luUGF0aCgpOworYi5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KTtiLmNsaXAoKTt0JiYodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlY3QoZC54MSxkLnkxLGQud2lkdGgsZC5oZWlnaHQpLHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCkpO2ZvcihoPTA7aDxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtoKyspe3ZhciByPWEuZGF0YVNlcmllc0luZGV4ZXNbaF0sbT10aGlzLmRhdGFbcl0scT1tLmRhdGFQb2ludHM7aWYoMDxxLmxlbmd0aCl7dmFyIG49NTxsJiZtLmJldmVsRW5hYmxlZD8hMDohMTtiLnN0cm9rZVN0eWxlPSIjNDU3MkE3ICI7Zm9yKGc9MDtnPHEubGVuZ3RoO2crKylpZihjPXFbZ10ueC5nZXRUaW1lP3FbZ10ueC5nZXRUaW1lKCk6cVtnXS54LCEoYzxhLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWlufHxjPmEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpJiYibnVtYmVyIj09PXR5cGVvZiBxW2ddLnkpe2Q9YS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrCithLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooYy1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtrPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihxW2ddLnktYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKTt2YXIgcz1kLWEucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCpsLzIrYS5pbmRleCpsPDwwLEI9cytsPDwwLHU7aWYoMDw9cVtnXS55KXt2YXIgeD1lW2NdP2VbY106MDtrLT14O3U9cC14O2VbY109eCsodS1rKX1lbHNlIHg9ZltjXT9mW2NdOjAsdT1rK3gsaz1wK3gsZltjXT14Kyh1LWspO2M9cVtnXS5jb2xvcj9xW2ddLmNvbG9yOm0uX2NvbG9yU2V0W2clbS5fY29sb3JTZXQubGVuZ3RoXTtGKGIscyxrLEIsdSxjLDAsbnVsbCxuJiYwPD1xW2ddLnksMD5xW2ddLnkmJm4sITEsITEsbS5maWxsT3BhY2l0eSk7CitjPW0uZGF0YVBvaW50SWRzW2ddO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbY109e2lkOmMsb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhU2VyaWVzSW5kZXg6cixkYXRhUG9pbnRJbmRleDpnLHgxOnMseTE6ayx4MjpCLHkyOnV9O2M9QyhjKTt0JiZGKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCxzLGssQix1LGMsMCxudWxsLCExLCExLCExLCExKTsocVtnXS5pbmRleExhYmVsfHxtLmluZGV4TGFiZWwpJiZ0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6InN0YWNrZWRDb2x1bW4iLGRhdGFQb2ludDpxW2ddLGRhdGFTZXJpZXM6bSxwb2ludDp7eDpkLHk6MDw9cVtnXS55P2s6dX0sZGlyZWN0aW9uOjA8PXFbZ10ueT8xOi0xLGJvdW5kczp7eDE6cyx5MTpNYXRoLm1pbihrLHUpLHgyOkIseTI6TWF0aC5tYXgoayx1KX0sY29sb3I6Y30pfX19Yi5yZXN0b3JlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTthPU1hdGgubWluKHAsCithLmF4aXNZLmJvdW5kaW5nUmVjdC55Mik7cmV0dXJue3NvdXJjZTpiLGRlc3Q6dGhpcy5wbG90QXJlYS5jdHgsYW5pbWF0aW9uQ2FsbGJhY2s6eS55U2NhbGVBbmltYXRpb24sZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcuZWFzZU91dFF1YXJ0LGFuaW1hdGlvbkJhc2U6YX19fTt2LnByb3RvdHlwZS5yZW5kZXJTdGFja2VkQ29sdW1uMTAwPWZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0Q2FudmFzQ3R4fHx0aGlzLnBsb3RBcmVhLmN0eDtpZighKDA+PWEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoKSl7dmFyIGM9bnVsbCxkPXRoaXMucGxvdEFyZWEsZT1bXSxmPVtdLGc9MCxrLHA9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKDAtYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKTw8MCxnPTAuMTUqdGhpcy53aWR0aDw8MCxoPWEuYXhpc1guZGF0YUluZm8ubWluRGlmZiwKK2w9MC45KihkLndpZHRoL01hdGguYWJzKGEuYXhpc1gubWF4aW11bS1hLmF4aXNYLm1pbmltdW0pKk1hdGguYWJzKGgpL2EucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCk8PDA7bD5nP2w9ZzpJbmZpbml0eT09PWg/bD1nOjE+bCYmKGw9MSk7Yi5zYXZlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtiLmJlZ2luUGF0aCgpO2IucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCk7Yi5jbGlwKCk7dCYmKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KSx0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpKTtmb3IoaD0wO2g8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7aCsrKXt2YXIgcj1hLmRhdGFTZXJpZXNJbmRleGVzW2hdLG09dGhpcy5kYXRhW3JdLHE9bS5kYXRhUG9pbnRzO2lmKDA8cS5sZW5ndGgpZm9yKHZhciBuPTU8bCYmbS5iZXZlbEVuYWJsZWQ/ITA6ITEsZz0wO2c8cS5sZW5ndGg7ZysrKWlmKGM9CitxW2ddLnguZ2V0VGltZT9xW2ddLnguZ2V0VGltZSgpOnFbZ10ueCwhKGM8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8Yz5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSYmIm51bWJlciI9PT10eXBlb2YgcVtnXS55KXtkPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihjLWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO2s9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKCgwIT09YS5kYXRhUG9pbnRZU3Vtc1tjXT8xMDAqKHFbZ10ueS9hLmRhdGFQb2ludFlTdW1zW2NdKTowKS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pO3ZhciBzPWQtYS5wbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoKmwvMithLmluZGV4Kmw8PDAsQj0KK3MrbDw8MCx1O2lmKDA8PXFbZ10ueSl7dmFyIHg9ZVtjXT9lW2NdOjA7ay09eDt1PXAteDtlW2NdPXgrKHUtayl9ZWxzZSB4PWZbY10/ZltjXTowLHU9ayt4LGs9cCt4LGZbY109eCsodS1rKTtjPXFbZ10uY29sb3I/cVtnXS5jb2xvcjptLl9jb2xvclNldFtnJW0uX2NvbG9yU2V0Lmxlbmd0aF07RihiLHMsayxCLHUsYywwLG51bGwsbiYmMDw9cVtnXS55LDA+cVtnXS55JiZuLCExLCExLG0uZmlsbE9wYWNpdHkpO2M9bS5kYXRhUG9pbnRJZHNbZ107dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtjXT17aWQ6YyxvYmplY3RUeXBlOiJkYXRhUG9pbnQiLGRhdGFTZXJpZXNJbmRleDpyLGRhdGFQb2ludEluZGV4OmcseDE6cyx5MTprLHgyOkIseTI6dX07Yz1DKGMpO3QmJkYodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LHMsayxCLHUsYywwLG51bGwsITEsITEsITEsITEpOyhxW2ddLmluZGV4TGFiZWx8fG0uaW5kZXhMYWJlbCkmJnRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToic3RhY2tlZENvbHVtbjEwMCIsCitkYXRhUG9pbnQ6cVtnXSxkYXRhU2VyaWVzOm0scG9pbnQ6e3g6ZCx5OjA8PXFbZ10ueT9rOnV9LGRpcmVjdGlvbjowPD1xW2ddLnk/MTotMSxib3VuZHM6e3gxOnMseTE6TWF0aC5taW4oayx1KSx4MjpCLHkyOk1hdGgubWF4KGssdSl9LGNvbG9yOmN9KX19Yi5yZXN0b3JlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTthPU1hdGgubWluKHAsYS5heGlzWS5ib3VuZGluZ1JlY3QueTIpO3JldHVybntzb3VyY2U6YixkZXN0OnRoaXMucGxvdEFyZWEuY3R4LGFuaW1hdGlvbkNhbGxiYWNrOnkueVNjYWxlQW5pbWF0aW9uLGVhc2luZ0Z1bmN0aW9uOnkuZWFzaW5nLmVhc2VPdXRRdWFydCxhbmltYXRpb25CYXNlOmF9fX07di5wcm90b3R5cGUucmVuZGVyQmFyPWZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0Q2FudmFzQ3R4fHx0aGlzLnBsb3RBcmVhLmN0eDtpZighKDA+PWEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoKSl7dmFyIGM9bnVsbCxkPXRoaXMucGxvdEFyZWEsCitlPTAsZixnLGsscD1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooMC1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pPDwwLGU9TWF0aC5taW4oMC4xNSp0aGlzLmhlaWdodCwwLjkqKHRoaXMucGxvdEFyZWEuaGVpZ2h0L2EucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzKSk8PDAsaD1hLmF4aXNYLmRhdGFJbmZvLm1pbkRpZmYsbD0wLjkqKGQuaGVpZ2h0L01hdGguYWJzKGEuYXhpc1gubWF4aW11bS1hLmF4aXNYLm1pbmltdW0pKk1hdGguYWJzKGgpL2EucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzKTw8MDtsPmU/bD1lOkluZmluaXR5PT09aD9sPWU6MT5sJiYobD0xKTtiLnNhdmUoKTt0JiZ0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO2IuYmVnaW5QYXRoKCk7Yi5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KTtiLmNsaXAoKTt0JiYodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlY3QoZC54MSwKK2QueTEsZC53aWR0aCxkLmhlaWdodCksdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LmNsaXAoKSk7Zm9yKGQ9MDtkPGEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2QrKyl7dmFyIGg9YS5kYXRhU2VyaWVzSW5kZXhlc1tkXSxyPXRoaXMuZGF0YVtoXSxtPXIuZGF0YVBvaW50cztpZigwPG0ubGVuZ3RoKXt2YXIgcT01PGwmJnIuYmV2ZWxFbmFibGVkPyEwOiExO2Iuc3Ryb2tlU3R5bGU9IiM0NTcyQTcgIjtmb3IoZT0wO2U8bS5sZW5ndGg7ZSsrKWlmKG1bZV0uZ2V0VGltZT9rPW1bZV0ueC5nZXRUaW1lKCk6az1tW2VdLngsIShrPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fGs+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkmJiJudW1iZXIiPT09dHlwZW9mIG1bZV0ueSl7Zz1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooay1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKworMC41PDwwO2Y9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKG1bZV0ueS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtnPWctYS5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMqbC8yKyhhLnByZXZpb3VzRGF0YVNlcmllc0NvdW50K2QpKmw8PDA7dmFyIG49ZytsPDwwLHM7MDw9bVtlXS55P3M9cDoocz1mLGY9cCk7Yz1tW2VdLmNvbG9yP21bZV0uY29sb3I6ci5fY29sb3JTZXRbZSVyLl9jb2xvclNldC5sZW5ndGhdO0YoYixzLGcsZixuLGMsMCxudWxsLHEsITEsITEsITEsci5maWxsT3BhY2l0eSk7Yz1yLmRhdGFQb2ludElkc1tlXTt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2NdPXtpZDpjLG9iamVjdFR5cGU6ImRhdGFQb2ludCIsZGF0YVNlcmllc0luZGV4OmgsZGF0YVBvaW50SW5kZXg6ZSx4MTpzLHkxOmcseDI6Zix5MjpufTtjPUMoYyk7Cit0JiZGKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCxzLGcsZixuLGMsMCxudWxsLCExLCExLCExLCExKTt0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6ImJhciIsZGF0YVBvaW50Om1bZV0sZGF0YVNlcmllczpyLHBvaW50Ont4OjA8PW1bZV0ueT9mOnMseTpnKyhuLWcpLzJ9LGRpcmVjdGlvbjowPD1tW2VdLnk/MTotMSxib3VuZHM6e3gxOk1hdGgubWluKHMsZikseTE6Zyx4MjpNYXRoLm1heChzLGYpLHkyOm59LGNvbG9yOmN9KX19fWIucmVzdG9yZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7YT1NYXRoLm1heChwLGEuYXhpc1guYm91bmRpbmdSZWN0LngyKTtyZXR1cm57c291cmNlOmIsZGVzdDp0aGlzLnBsb3RBcmVhLmN0eCxhbmltYXRpb25DYWxsYmFjazp5LnhTY2FsZUFuaW1hdGlvbixlYXNpbmdGdW5jdGlvbjp5LmVhc2luZy5lYXNlT3V0UXVhcnQsYW5pbWF0aW9uQmFzZTphfX19O3YucHJvdG90eXBlLnJlbmRlclN0YWNrZWRCYXI9CitmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBjPW51bGwsZD10aGlzLnBsb3RBcmVhLGU9W10sZj1bXSxnPTAsayxwPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KigwLWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSk8PDAsZz0wLjE1KnRoaXMuaGVpZ2h0PDwwLGg9YS5heGlzWC5kYXRhSW5mby5taW5EaWZmLGw9MC45KihkLmhlaWdodC9NYXRoLmFicyhhLmF4aXNYLm1heGltdW0tYS5heGlzWC5taW5pbXVtKSpNYXRoLmFicyhoKS9hLnBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGgpPDwwO2w+Zz9sPWc6SW5maW5pdHk9PT1oP2w9ZzoxPmwmJihsPTEpO2Iuc2F2ZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5zYXZlKCk7Yi5iZWdpblBhdGgoKTsKK2IucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCk7Yi5jbGlwKCk7dCYmKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KSx0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpKTtmb3IoaD0wO2g8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7aCsrKXt2YXIgcj1hLmRhdGFTZXJpZXNJbmRleGVzW2hdLG09dGhpcy5kYXRhW3JdLHE9bS5kYXRhUG9pbnRzO2lmKDA8cS5sZW5ndGgpe3ZhciBuPTU8bCYmbS5iZXZlbEVuYWJsZWQ/ITA6ITE7Yi5zdHJva2VTdHlsZT0iIzQ1NzJBNyAiO2ZvcihnPTA7ZzxxLmxlbmd0aDtnKyspaWYoYz1xW2ddLnguZ2V0VGltZT9xW2ddLnguZ2V0VGltZSgpOnFbZ10ueCwhKGM8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8Yz5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSYmIm51bWJlciI9PT10eXBlb2YgcVtnXS55KXtkPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlKworYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKGMtYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7az1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoocVtnXS55LWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSk7dmFyIHM9ZC1hLnBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGgqbC8yK2EuaW5kZXgqbDw8MCxCPXMrbDw8MCx1O2lmKDA8PXFbZ10ueSl7dmFyIHg9ZVtjXT9lW2NdOjA7dT1wK3g7ays9eDtlW2NdPXgrKGstdSl9ZWxzZSB4PWZbY10/ZltjXTowLHU9ay14LGs9cC14LGZbY109eCsoay11KTtjPXFbZ10uY29sb3I/cVtnXS5jb2xvcjptLl9jb2xvclNldFtnJW0uX2NvbG9yU2V0Lmxlbmd0aF07RihiLHUscyxrLEIsYywwLG51bGwsbiwhMSwhMSwhMSxtLmZpbGxPcGFjaXR5KTtjPW0uZGF0YVBvaW50SWRzW2ddOwordGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtjXT17aWQ6YyxvYmplY3RUeXBlOiJkYXRhUG9pbnQiLGRhdGFTZXJpZXNJbmRleDpyLGRhdGFQb2ludEluZGV4OmcseDE6dSx5MTpzLHgyOmsseTI6Qn07Yz1DKGMpO3QmJkYodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LHUscyxrLEIsYywwLG51bGwsITEsITEsITEsITEpO3RoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToic3RhY2tlZEJhciIsZGF0YVBvaW50OnFbZ10sZGF0YVNlcmllczptLHBvaW50Ont4OjA8PXFbZ10ueT9rOnUseTpkfSxkaXJlY3Rpb246MDw9cVtnXS55PzE6LTEsYm91bmRzOnt4MTpNYXRoLm1pbih1LGspLHkxOnMseDI6TWF0aC5tYXgodSxrKSx5MjpCfSxjb2xvcjpjfSl9fX1iLnJlc3RvcmUoKTt0JiZ0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO2E9TWF0aC5tYXgocCxhLmF4aXNYLmJvdW5kaW5nUmVjdC54Mik7cmV0dXJue3NvdXJjZTpiLGRlc3Q6dGhpcy5wbG90QXJlYS5jdHgsCithbmltYXRpb25DYWxsYmFjazp5LnhTY2FsZUFuaW1hdGlvbixlYXNpbmdGdW5jdGlvbjp5LmVhc2luZy5lYXNlT3V0UXVhcnQsYW5pbWF0aW9uQmFzZTphfX19O3YucHJvdG90eXBlLnJlbmRlclN0YWNrZWRCYXIxMDA9ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXRDYW52YXNDdHh8fHRoaXMucGxvdEFyZWEuY3R4O2lmKCEoMD49YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGgpKXt2YXIgYz1udWxsLGQ9dGhpcy5wbG90QXJlYSxlPVtdLGY9W10sZz0wLGsscD1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooMC1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pPDwwLGc9MC4xNSp0aGlzLmhlaWdodDw8MCxoPWEuYXhpc1guZGF0YUluZm8ubWluRGlmZixsPTAuOSooZC5oZWlnaHQvTWF0aC5hYnMoYS5heGlzWC5tYXhpbXVtLWEuYXhpc1gubWluaW11bSkqTWF0aC5hYnMoaCkvCithLnBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGgpPDwwO2w+Zz9sPWc6SW5maW5pdHk9PT1oP2w9ZzoxPmwmJihsPTEpO2Iuc2F2ZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5zYXZlKCk7Yi5iZWdpblBhdGgoKTtiLnJlY3QoZC54MSxkLnkxLGQud2lkdGgsZC5oZWlnaHQpO2IuY2xpcCgpO3QmJih0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCksdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LmNsaXAoKSk7Zm9yKGg9MDtoPGEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2grKyl7dmFyIHI9YS5kYXRhU2VyaWVzSW5kZXhlc1toXSxtPXRoaXMuZGF0YVtyXSxxPW0uZGF0YVBvaW50cztpZigwPHEubGVuZ3RoKXt2YXIgbj01PGwmJm0uYmV2ZWxFbmFibGVkPyEwOiExO2Iuc3Ryb2tlU3R5bGU9IiM0NTcyQTcgIjtmb3IoZz0wO2c8cS5sZW5ndGg7ZysrKWlmKGM9cVtnXS54LmdldFRpbWU/cVtnXS54LmdldFRpbWUoKToKK3FbZ10ueCwhKGM8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8Yz5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSYmIm51bWJlciI9PT10eXBlb2YgcVtnXS55KXtkPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihjLWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO2s9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKCgwIT09YS5kYXRhUG9pbnRZU3Vtc1tjXT8xMDAqKHFbZ10ueS9hLmRhdGFQb2ludFlTdW1zW2NdKTowKS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pO3ZhciBzPWQtYS5wbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoKmwvMithLmluZGV4Kmw8PDAsQj1zK2w8PDAsdTtpZigwPD1xW2ddLnkpe3ZhciB4PWVbY10/CitlW2NdOjA7dT1wK3g7ays9eDtlW2NdPXgrKGstdSl9ZWxzZSB4PWZbY10/ZltjXTowLHU9ay14LGs9cC14LGZbY109eCsoay11KTtjPXFbZ10uY29sb3I/cVtnXS5jb2xvcjptLl9jb2xvclNldFtnJW0uX2NvbG9yU2V0Lmxlbmd0aF07RihiLHUscyxrLEIsYywwLG51bGwsbiwhMSwhMSwhMSxtLmZpbGxPcGFjaXR5KTtjPW0uZGF0YVBvaW50SWRzW2ddO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbY109e2lkOmMsb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhU2VyaWVzSW5kZXg6cixkYXRhUG9pbnRJbmRleDpnLHgxOnUseTE6cyx4MjprLHkyOkJ9O2M9QyhjKTt0JiZGKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCx1LHMsayxCLGMsMCxudWxsLCExLCExLCExLCExKTt0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6InN0YWNrZWRCYXIxMDAiLGRhdGFQb2ludDpxW2ddLGRhdGFTZXJpZXM6bSxwb2ludDp7eDowPD1xW2ddLnk/azp1LHk6ZH0sZGlyZWN0aW9uOjA8PQorcVtnXS55PzE6LTEsYm91bmRzOnt4MTpNYXRoLm1pbih1LGspLHkxOnMseDI6TWF0aC5tYXgodSxrKSx5MjpCfSxjb2xvcjpjfSl9fX1iLnJlc3RvcmUoKTt0JiZ0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO2E9TWF0aC5tYXgocCxhLmF4aXNYLmJvdW5kaW5nUmVjdC54Mik7cmV0dXJue3NvdXJjZTpiLGRlc3Q6dGhpcy5wbG90QXJlYS5jdHgsYW5pbWF0aW9uQ2FsbGJhY2s6eS54U2NhbGVBbmltYXRpb24sZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcuZWFzZU91dFF1YXJ0LGFuaW1hdGlvbkJhc2U6YX19fTt2LnByb3RvdHlwZS5yZW5kZXJBcmVhPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt4JiYoMDxoLmxpbmVUaGlja25lc3MmJmMuc3Ryb2tlKCksMD49YS5heGlzWS5taW5pbXVtJiYwPD1hLmF4aXNZLm1heGltdW0/dT1COjA+YS5heGlzWS5tYXhpbXVtP3U9Zi55MTowPGEuYXhpc1kubWluaW11bSYmKHU9ZS55MiksYy5saW5lVG8ocSx1KSxjLmxpbmVUbyh4LngsCit1KSxjLmNsb3NlUGF0aCgpLGMuZ2xvYmFsQWxwaGE9aC5maWxsT3BhY2l0eSxjLmZpbGwoKSxjLmdsb2JhbEFscGhhPTEsdCYmKGQubGluZVRvKHEsdSksZC5saW5lVG8oeC54LHUpLGQuY2xvc2VQYXRoKCksZC5maWxsKCkpLGMuYmVnaW5QYXRoKCksYy5tb3ZlVG8ocSxuKSxkLmJlZ2luUGF0aCgpLGQubW92ZVRvKHEsbikseD17eDpxLHk6bn0pfXZhciBjPWEudGFyZ2V0Q2FudmFzQ3R4fHx0aGlzLnBsb3RBcmVhLmN0eDtpZighKDA+PWEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoKSl7dmFyIGQ9dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LGU9YS5heGlzWC5saW5lQ29vcmRpbmF0ZXMsZj1hLmF4aXNZLmxpbmVDb29yZGluYXRlcyxnPVtdLGs9dGhpcy5wbG90QXJlYTtjLnNhdmUoKTt0JiZkLnNhdmUoKTtjLmJlZ2luUGF0aCgpO2MucmVjdChrLngxLGsueTEsay53aWR0aCxrLmhlaWdodCk7Yy5jbGlwKCk7dCYmKGQuYmVnaW5QYXRoKCksZC5yZWN0KGsueDEsay55MSxrLndpZHRoLAoray5oZWlnaHQpLGQuY2xpcCgpKTtmb3Ioaz0wO2s8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7aysrKXt2YXIgcD1hLmRhdGFTZXJpZXNJbmRleGVzW2tdLGg9dGhpcy5kYXRhW3BdLGw9aC5kYXRhUG9pbnRzLGc9aC5pZDt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2ddPXtvYmplY3RUeXBlOiJkYXRhU2VyaWVzIixkYXRhU2VyaWVzSW5kZXg6cH07Zz1DKGcpO2QuZmlsbFN0eWxlPWc7dmFyIGc9W10scj0hMCxtPTAscSxuLHMsQj1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooMC1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MCx1LHg9bnVsbDtpZigwPGwubGVuZ3RoKXt2YXIgdz1oLl9jb2xvclNldFttJWguX2NvbG9yU2V0Lmxlbmd0aF07Yy5maWxsU3R5bGU9dztjLnN0cm9rZVN0eWxlPXc7Yy5saW5lV2lkdGg9aC5saW5lVGhpY2tuZXNzOworZm9yKHZhciBRPSEwO208bC5sZW5ndGg7bSsrKWlmKHM9bFttXS54LmdldFRpbWU/bFttXS54LmdldFRpbWUoKTpsW21dLngsIShzPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fHM+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkpaWYoIm51bWJlciIhPT10eXBlb2YgbFttXS55KWIoKSxRPSEwO2Vsc2V7cT1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoocy1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtuPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihsW21dLnktYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7cnx8UT8oYy5iZWdpblBhdGgoKSxjLm1vdmVUbyhxLG4pLHg9e3g6cSx5Om59LHQmJihkLmJlZ2luUGF0aCgpLAorZC5tb3ZlVG8ocSxuKSksUT1yPSExKTooYy5saW5lVG8ocSxuKSx0JiZkLmxpbmVUbyhxLG4pLDA9PW0lMjUwJiZiKCkpO3ZhciBHPWguZGF0YVBvaW50SWRzW21dO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbR109e2lkOkcsb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhU2VyaWVzSW5kZXg6cCxkYXRhUG9pbnRJbmRleDptLHgxOnEseTE6bn07MCE9PWxbbV0ubWFya2VyU2l6ZSYmKDA8bFttXS5tYXJrZXJTaXplfHwwPGgubWFya2VyU2l6ZSkmJihzPWguZ2V0TWFya2VyUHJvcGVydGllcyhtLHEsbixjKSxnLnB1c2gocyksRz1DKEcpLHQmJmcucHVzaCh7eDpxLHk6bixjdHg6ZCx0eXBlOnMudHlwZSxzaXplOnMuc2l6ZSxjb2xvcjpHLGJvcmRlckNvbG9yOkcsYm9yZGVyVGhpY2tuZXNzOnMuYm9yZGVyVGhpY2tuZXNzfSkpOyhsW21dLmluZGV4TGFiZWx8fGguaW5kZXhMYWJlbCkmJnRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToiYXJlYSIsZGF0YVBvaW50OmxbbV0sCitkYXRhU2VyaWVzOmgscG9pbnQ6e3g6cSx5Om59LGRpcmVjdGlvbjowPD1sW21dLnk/MTotMSxjb2xvcjp3fSl9YigpO0ouZHJhd01hcmtlcnMoZyl9fWMucmVzdG9yZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7cmV0dXJue3NvdXJjZTpjLGRlc3Q6dGhpcy5wbG90QXJlYS5jdHgsYW5pbWF0aW9uQ2FsbGJhY2s6eS54Q2xpcEFuaW1hdGlvbixlYXNpbmdGdW5jdGlvbjp5LmVhc2luZy5saW5lYXIsYW5pbWF0aW9uQmFzZTowfX19O3YucHJvdG90eXBlLnJlbmRlclNwbGluZUFyZWE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3ZhciBiPWZhKHUsMik7aWYoMDxiLmxlbmd0aCl7Yy5iZWdpblBhdGgoKTtjLm1vdmVUbyhiWzBdLngsYlswXS55KTt0JiYoZC5iZWdpblBhdGgoKSxkLm1vdmVUbyhiWzBdLngsYlswXS55KSk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aC0zO2crPTMpYy5iZXppZXJDdXJ2ZVRvKGJbZysxXS54LGJbZysxXS55LGJbZysyXS54LGJbZysKKzJdLnksYltnKzNdLngsYltnKzNdLnkpLHQmJmQuYmV6aWVyQ3VydmVUbyhiW2crMV0ueCxiW2crMV0ueSxiW2crMl0ueCxiW2crMl0ueSxiW2crM10ueCxiW2crM10ueSk7MDxoLmxpbmVUaGlja25lc3MmJmMuc3Ryb2tlKCk7MD49YS5heGlzWS5taW5pbXVtJiYwPD1hLmF4aXNZLm1heGltdW0/cz1uOjA+YS5heGlzWS5tYXhpbXVtP3M9Zi55MTowPGEuYXhpc1kubWluaW11bSYmKHM9ZS55Mik7Qj17eDpiWzBdLngseTpiWzBdLnl9O2MubGluZVRvKGJbYi5sZW5ndGgtMV0ueCxzKTtjLmxpbmVUbyhCLngscyk7Yy5jbG9zZVBhdGgoKTtjLmdsb2JhbEFscGhhPWguZmlsbE9wYWNpdHk7Yy5maWxsKCk7Yy5nbG9iYWxBbHBoYT0xO3QmJihkLmxpbmVUbyhiW2IubGVuZ3RoLTFdLngscyksZC5saW5lVG8oQi54LHMpLGQuY2xvc2VQYXRoKCksZC5maWxsKCkpfX12YXIgYz1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBkPQordGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LGU9YS5heGlzWC5saW5lQ29vcmRpbmF0ZXMsZj1hLmF4aXNZLmxpbmVDb29yZGluYXRlcyxnPVtdLGs9dGhpcy5wbG90QXJlYTtjLnNhdmUoKTt0JiZkLnNhdmUoKTtjLmJlZ2luUGF0aCgpO2MucmVjdChrLngxLGsueTEsay53aWR0aCxrLmhlaWdodCk7Yy5jbGlwKCk7dCYmKGQuYmVnaW5QYXRoKCksZC5yZWN0KGsueDEsay55MSxrLndpZHRoLGsuaGVpZ2h0KSxkLmNsaXAoKSk7Zm9yKGs9MDtrPGEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2srKyl7dmFyIHA9YS5kYXRhU2VyaWVzSW5kZXhlc1trXSxoPXRoaXMuZGF0YVtwXSxsPWguZGF0YVBvaW50cyxnPWguaWQ7dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtnXT17b2JqZWN0VHlwZToiZGF0YVNlcmllcyIsZGF0YVNlcmllc0luZGV4OnB9O2c9QyhnKTtkLmZpbGxTdHlsZT1nO3ZhciBnPVtdLHI9MCxtLHEsbj1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSsKK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KigwLWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwLHMsQj1udWxsLHU9W107aWYoMDxsLmxlbmd0aCl7Y29sb3I9aC5fY29sb3JTZXRbciVoLl9jb2xvclNldC5sZW5ndGhdO2MuZmlsbFN0eWxlPWNvbG9yO2Muc3Ryb2tlU3R5bGU9Y29sb3I7Zm9yKGMubGluZVdpZHRoPWgubGluZVRoaWNrbmVzcztyPGwubGVuZ3RoO3IrKylpZihtPWxbcl0ueC5nZXRUaW1lP2xbcl0ueC5nZXRUaW1lKCk6bFtyXS54LCEobTxhLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWlufHxtPmEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpKWlmKCJudW1iZXIiIT09dHlwZW9mIGxbcl0ueSkwPHImJihiKCksdT1bXSk7ZWxzZXttPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihtLWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrCiswLjU8PDA7cT1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoobFtyXS55LWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO3ZhciB4PWguZGF0YVBvaW50SWRzW3JdO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbeF09e2lkOngsb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhU2VyaWVzSW5kZXg6cCxkYXRhUG9pbnRJbmRleDpyLHgxOm0seTE6cX07dVt1Lmxlbmd0aF09e3g6bSx5OnF9O2lmKDAhPT1sW3JdLm1hcmtlclNpemUmJigwPGxbcl0ubWFya2VyU2l6ZXx8MDxoLm1hcmtlclNpemUpKXt2YXIgdz1oLmdldE1hcmtlclByb3BlcnRpZXMocixtLHEsYyk7Zy5wdXNoKHcpO3g9Qyh4KTt0JiZnLnB1c2goe3g6bSx5OnEsY3R4OmQsdHlwZTp3LnR5cGUsc2l6ZTp3LnNpemUsY29sb3I6eCxib3JkZXJDb2xvcjp4LGJvcmRlclRoaWNrbmVzczp3LmJvcmRlclRoaWNrbmVzc30pfShsW3JdLmluZGV4TGFiZWx8fAoraC5pbmRleExhYmVsKSYmdGhpcy5faW5kZXhMYWJlbHMucHVzaCh7Y2hhcnRUeXBlOiJzcGxpbmVBcmVhIixkYXRhUG9pbnQ6bFtyXSxkYXRhU2VyaWVzOmgscG9pbnQ6e3g6bSx5OnF9LGRpcmVjdGlvbjowPD1sW3JdLnk/MTotMSxjb2xvcjpjb2xvcn0pfWIoKTtKLmRyYXdNYXJrZXJzKGcpfX1jLnJlc3RvcmUoKTt0JiZ0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO3JldHVybntzb3VyY2U6YyxkZXN0OnRoaXMucGxvdEFyZWEuY3R4LGFuaW1hdGlvbkNhbGxiYWNrOnkueENsaXBBbmltYXRpb24sZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcubGluZWFyLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJTdGVwQXJlYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7eCYmKDA8aC5saW5lVGhpY2tuZXNzJiZjLnN0cm9rZSgpLDA+PWEuYXhpc1kubWluaW11bSYmMDw9YS5heGlzWS5tYXhpbXVtP3U9QjowPmEuYXhpc1kubWF4aW11bT91PWYueTE6MDxhLmF4aXNZLm1pbmltdW0mJgorKHU9ZS55MiksYy5saW5lVG8ocSx1KSxjLmxpbmVUbyh4LngsdSksYy5jbG9zZVBhdGgoKSxjLmdsb2JhbEFscGhhPWguZmlsbE9wYWNpdHksYy5maWxsKCksYy5nbG9iYWxBbHBoYT0xLHQmJihkLmxpbmVUbyhxLHUpLGQubGluZVRvKHgueCx1KSxkLmNsb3NlUGF0aCgpLGQuZmlsbCgpKSxjLmJlZ2luUGF0aCgpLGMubW92ZVRvKHEsbiksZC5iZWdpblBhdGgoKSxkLm1vdmVUbyhxLG4pLHg9e3g6cSx5Om59KX12YXIgYz1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBkPXRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCxlPWEuYXhpc1gubGluZUNvb3JkaW5hdGVzLGY9YS5heGlzWS5saW5lQ29vcmRpbmF0ZXMsZz1bXSxrPXRoaXMucGxvdEFyZWE7Yy5zYXZlKCk7dCYmZC5zYXZlKCk7Yy5iZWdpblBhdGgoKTtjLnJlY3Qoay54MSxrLnkxLGsud2lkdGgsay5oZWlnaHQpO2MuY2xpcCgpO3QmJgorKGQuYmVnaW5QYXRoKCksZC5yZWN0KGsueDEsay55MSxrLndpZHRoLGsuaGVpZ2h0KSxkLmNsaXAoKSk7Zm9yKGs9MDtrPGEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2srKyl7dmFyIHA9YS5kYXRhU2VyaWVzSW5kZXhlc1trXSxoPXRoaXMuZGF0YVtwXSxsPWguZGF0YVBvaW50cyxnPWguaWQ7dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtnXT17b2JqZWN0VHlwZToiZGF0YVNlcmllcyIsZGF0YVNlcmllc0luZGV4OnB9O2c9QyhnKTtkLmZpbGxTdHlsZT1nO3ZhciBnPVtdLHI9ITAsbT0wLHEsbixzLEI9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKDAtYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDAsdSx4PW51bGwsdz0hMTtpZigwPGwubGVuZ3RoKXt2YXIgUT1oLl9jb2xvclNldFttJWguX2NvbG9yU2V0Lmxlbmd0aF07Yy5maWxsU3R5bGU9CitRO2Muc3Ryb2tlU3R5bGU9UTtmb3IoYy5saW5lV2lkdGg9aC5saW5lVGhpY2tuZXNzO208bC5sZW5ndGg7bSsrKWlmKHM9bFttXS54LmdldFRpbWU/bFttXS54LmdldFRpbWUoKTpsW21dLngsIShzPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fHM+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkpe3ZhciB2PW47Im51bWJlciIhPT10eXBlb2YgbFttXS55PyhiKCksdz0hMCk6KHE9YS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKHMtYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDAsbj1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoobFttXS55LWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwLHJ8fHc/KGMuYmVnaW5QYXRoKCksCitjLm1vdmVUbyhxLG4pLHg9e3g6cSx5Om59LHQmJihkLmJlZ2luUGF0aCgpLGQubW92ZVRvKHEsbikpLHc9cj0hMSk6KGMubGluZVRvKHEsdiksdCYmZC5saW5lVG8ocSx2KSxjLmxpbmVUbyhxLG4pLHQmJmQubGluZVRvKHEsbiksMD09bSUyNTAmJmIoKSksdj1oLmRhdGFQb2ludElkc1ttXSx0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3ZdPXtpZDp2LG9iamVjdFR5cGU6ImRhdGFQb2ludCIsZGF0YVNlcmllc0luZGV4OnAsZGF0YVBvaW50SW5kZXg6bSx4MTpxLHkxOm59LDAhPT1sW21dLm1hcmtlclNpemUmJigwPGxbbV0ubWFya2VyU2l6ZXx8MDxoLm1hcmtlclNpemUpJiYocz1oLmdldE1hcmtlclByb3BlcnRpZXMobSxxLG4sYyksZy5wdXNoKHMpLHY9Qyh2KSx0JiZnLnB1c2goe3g6cSx5Om4sY3R4OmQsdHlwZTpzLnR5cGUsc2l6ZTpzLnNpemUsY29sb3I6dixib3JkZXJDb2xvcjp2LGJvcmRlclRoaWNrbmVzczpzLmJvcmRlclRoaWNrbmVzc30pKSwobFttXS5pbmRleExhYmVsfHwKK2guaW5kZXhMYWJlbCkmJnRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToic3RlcEFyZWEiLGRhdGFQb2ludDpsW21dLGRhdGFTZXJpZXM6aCxwb2ludDp7eDpxLHk6bn0sZGlyZWN0aW9uOjA8PWxbbV0ueT8xOi0xLGNvbG9yOlF9KSl9YigpO0ouZHJhd01hcmtlcnMoZyl9fWMucmVzdG9yZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7cmV0dXJue3NvdXJjZTpjLGRlc3Q6dGhpcy5wbG90QXJlYS5jdHgsYW5pbWF0aW9uQ2FsbGJhY2s6eS54Q2xpcEFuaW1hdGlvbixlYXNpbmdGdW5jdGlvbjp5LmVhc2luZy5saW5lYXIsYW5pbWF0aW9uQmFzZTowfX19O3YucHJvdG90eXBlLnJlbmRlclN0YWNrZWRBcmVhPWZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0Q2FudmFzQ3R4fHx0aGlzLnBsb3RBcmVhLmN0eDtpZighKDA+PWEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoKSl7dmFyIGM9bnVsbCxkPVtdLGU9dGhpcy5wbG90QXJlYSxmPVtdLGc9W10sCitrPTAscCxoLGwscj1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooMC1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pPDwwLG09dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O3QmJm0uYmVnaW5QYXRoKCk7Yi5zYXZlKCk7dCYmbS5zYXZlKCk7Yi5iZWdpblBhdGgoKTtiLnJlY3QoZS54MSxlLnkxLGUud2lkdGgsZS5oZWlnaHQpO2IuY2xpcCgpO3QmJihtLmJlZ2luUGF0aCgpLG0ucmVjdChlLngxLGUueTEsZS53aWR0aCxlLmhlaWdodCksbS5jbGlwKCkpO3hWYWx1ZVByZXNlbnQ9W107Zm9yKGU9MDtlPGEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2UrKyl7dmFyIHE9YS5kYXRhU2VyaWVzSW5kZXhlc1tlXSxuPXRoaXMuZGF0YVtxXSxzPW4uZGF0YVBvaW50cztuLmRhdGFQb2ludEluZGV4ZXM9W107Zm9yKGs9MDtrPHMubGVuZ3RoO2srKylxPXNba10ueC5nZXRUaW1lPworc1trXS54LmdldFRpbWUoKTpzW2tdLngsbi5kYXRhUG9pbnRJbmRleGVzW3FdPWsseFZhbHVlUHJlc2VudFtxXXx8KGcucHVzaChxKSx4VmFsdWVQcmVzZW50W3FdPSEwKTtnLnNvcnQocmEpfWZvcihlPTA7ZTxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtlKyspe3ZhciBxPWEuZGF0YVNlcmllc0luZGV4ZXNbZV0sbj10aGlzLmRhdGFbcV0scz1uLmRhdGFQb2ludHMsQj0hMCx1PVtdLGs9bi5pZDt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2tdPXtvYmplY3RUeXBlOiJkYXRhU2VyaWVzIixkYXRhU2VyaWVzSW5kZXg6cX07az1DKGspO20uZmlsbFN0eWxlPWs7aWYoMDxnLmxlbmd0aCl7Yz1uLl9jb2xvclNldFswXTtiLmZpbGxTdHlsZT1jO2Iuc3Ryb2tlU3R5bGU9YztiLmxpbmVXaWR0aD1uLmxpbmVUaGlja25lc3M7Zm9yKGs9MDtrPGcubGVuZ3RoO2srKyl7bD1nW2tdO3ZhciB4PW51bGwseD0wPD1uLmRhdGFQb2ludEluZGV4ZXNbbF0/c1tuLmRhdGFQb2ludEluZGV4ZXNbbF1dOgore3g6bCx5OjB9O2lmKCEobDxhLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWlufHxsPmEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpJiYibnVtYmVyIj09PXR5cGVvZiB4Lnkpe3A9YS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKGwtYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7aD1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooeC55LWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSk7dmFyIHc9ZltsXT9mW2xdOjA7aC09dzt1LnB1c2goe3g6cCx5OnItd30pO2ZbbF09ci1oO2lmKEIpYi5iZWdpblBhdGgoKSxiLm1vdmVUbyhwLGgpLHQmJihtLmJlZ2luUGF0aCgpLG0ubW92ZVRvKHAsaCkpLEI9ITE7ZWxzZSBpZihiLmxpbmVUbyhwLAoraCksdCYmbS5saW5lVG8ocCxoKSwwPT1rJTI1MCl7Zm9yKDA8bi5saW5lVGhpY2tuZXNzJiZiLnN0cm9rZSgpOzA8dS5sZW5ndGg7KXt2YXIgdj11LnBvcCgpO2IubGluZVRvKHYueCx2LnkpO3QmJm0ubGluZVRvKHYueCx2LnkpfWIuY2xvc2VQYXRoKCk7Yi5nbG9iYWxBbHBoYT1uLmZpbGxPcGFjaXR5O2IuZmlsbCgpO2IuZ2xvYmFsQWxwaGE9MTtiLmJlZ2luUGF0aCgpO2IubW92ZVRvKHAsaCk7dCYmKG0uY2xvc2VQYXRoKCksbS5maWxsKCksbS5iZWdpblBhdGgoKSxtLm1vdmVUbyhwLGgpKTt1LnB1c2goe3g6cCx5OnItd30pfWlmKDA8PW4uZGF0YVBvaW50SW5kZXhlc1tsXSl7dmFyIEc9bi5kYXRhUG9pbnRJZHNbbi5kYXRhUG9pbnRJbmRleGVzW2xdXTt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW0ddPXtpZDpHLG9iamVjdFR5cGU6ImRhdGFQb2ludCIsZGF0YVNlcmllc0luZGV4OnEsZGF0YVBvaW50SW5kZXg6bi5kYXRhUG9pbnRJbmRleGVzW2xdLHgxOnAseTE6aH19MDw9CituLmRhdGFQb2ludEluZGV4ZXNbbF0mJjAhPT14Lm1hcmtlclNpemUmJigwPHgubWFya2VyU2l6ZXx8MDxuLm1hcmtlclNpemUpJiYobD1uLmdldE1hcmtlclByb3BlcnRpZXMoayxwLGgsYiksZC5wdXNoKGwpLG1hcmtlckNvbG9yPUMoRyksdCYmZC5wdXNoKHt4OnAseTpoLGN0eDptLHR5cGU6bC50eXBlLHNpemU6bC5zaXplLGNvbG9yOm1hcmtlckNvbG9yLGJvcmRlckNvbG9yOm1hcmtlckNvbG9yLGJvcmRlclRoaWNrbmVzczpsLmJvcmRlclRoaWNrbmVzc30pKTsoeC5pbmRleExhYmVsfHxuLmluZGV4TGFiZWwpJiZ0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6InN0YWNrZWRBcmVhIixkYXRhUG9pbnQ6eCxkYXRhU2VyaWVzOm4scG9pbnQ6e3g6cCx5Omh9LGRpcmVjdGlvbjowPD1zW2tdLnk/MTotMSxjb2xvcjpjfSl9fWZvcigwPG4ubGluZVRoaWNrbmVzcyYmYi5zdHJva2UoKTswPHUubGVuZ3RoOyl2PXUucG9wKCksYi5saW5lVG8odi54LHYueSksdCYmbS5saW5lVG8odi54LAordi55KTtiLmNsb3NlUGF0aCgpO2IuZ2xvYmFsQWxwaGE9bi5maWxsT3BhY2l0eTtiLmZpbGwoKTtiLmdsb2JhbEFscGhhPTE7Yi5iZWdpblBhdGgoKTtiLm1vdmVUbyhwLGgpO3QmJihtLmNsb3NlUGF0aCgpLG0uZmlsbCgpLG0uYmVnaW5QYXRoKCksbS5tb3ZlVG8ocCxoKSl9ZGVsZXRlIG4uZGF0YVBvaW50SW5kZXhlc31KLmRyYXdNYXJrZXJzKGQpO2IucmVzdG9yZSgpO3QmJm0ucmVzdG9yZSgpO3JldHVybntzb3VyY2U6YixkZXN0OnRoaXMucGxvdEFyZWEuY3R4LGFuaW1hdGlvbkNhbGxiYWNrOnkueENsaXBBbmltYXRpb24sZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcubGluZWFyLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJTdGFja2VkQXJlYTEwMD1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBjPW51bGwsZD10aGlzLnBsb3RBcmVhLAorZT1bXSxmPVtdLGc9W10saz0wLHAsaCxsLHI9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKDAtYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKTw8MCxtPTAuMTUqdGhpcy53aWR0aDw8MCxxPWEuYXhpc1guZGF0YUluZm8ubWluRGlmZixxPTAuOSpkLndpZHRoL01hdGguYWJzKGEuYXhpc1gubWF4aW11bS1hLmF4aXNYLm1pbmltdW0pKk1hdGguYWJzKHEpPDwwLG49dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O2Iuc2F2ZSgpO3QmJm4uc2F2ZSgpO2IuYmVnaW5QYXRoKCk7Yi5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KTtiLmNsaXAoKTt0JiYobi5iZWdpblBhdGgoKSxuLnJlY3QoZC54MSxkLnkxLGQud2lkdGgsZC5oZWlnaHQpLG4uY2xpcCgpKTt4VmFsdWVQcmVzZW50PVtdO2ZvcihkPTA7ZDxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtkKyspe3ZhciBzPQorYS5kYXRhU2VyaWVzSW5kZXhlc1tkXSxCPXRoaXMuZGF0YVtzXSx1PUIuZGF0YVBvaW50cztCLmRhdGFQb2ludEluZGV4ZXM9W107Zm9yKGs9MDtrPHUubGVuZ3RoO2srKylzPXVba10ueC5nZXRUaW1lP3Vba10ueC5nZXRUaW1lKCk6dVtrXS54LEIuZGF0YVBvaW50SW5kZXhlc1tzXT1rLHhWYWx1ZVByZXNlbnRbc118fChnLnB1c2gocykseFZhbHVlUHJlc2VudFtzXT0hMCk7Zy5zb3J0KHJhKX1mb3IoZD0wO2Q8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7ZCsrKXt2YXIgcz1hLmRhdGFTZXJpZXNJbmRleGVzW2RdLEI9dGhpcy5kYXRhW3NdLHU9Qi5kYXRhUG9pbnRzLHg9ITAsYz1CLmlkO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbY109e29iamVjdFR5cGU6ImRhdGFTZXJpZXMiLGRhdGFTZXJpZXNJbmRleDpzfTtjPUMoYyk7bi5maWxsU3R5bGU9YzsxPT11Lmxlbmd0aCYmKHE9bSk7MT5xP3E9MTpxPm0mJihxPW0pO3ZhciB3PVtdO2lmKDA8Zy5sZW5ndGgpe2M9Qi5fY29sb3JTZXRbayUKK0IuX2NvbG9yU2V0Lmxlbmd0aF07Yi5maWxsU3R5bGU9YztiLnN0cm9rZVN0eWxlPWM7Yi5saW5lV2lkdGg9Qi5saW5lVGhpY2tuZXNzO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspe2w9Z1trXTt2YXIgdj1udWxsLHY9MDw9Qi5kYXRhUG9pbnRJbmRleGVzW2xdP3VbQi5kYXRhUG9pbnRJbmRleGVzW2xdXTp7eDpsLHk6MH07aWYoIShsPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fGw+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkmJiJudW1iZXIiPT09dHlwZW9mIHYueSl7aD0wIT09YS5kYXRhUG9pbnRZU3Vtc1tsXT8xMDAqKHYueS9hLmRhdGFQb2ludFlTdW1zW2xdKTowO3A9YS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKGwtYS5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7aD1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSsKK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihoLWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSk7dmFyIEc9ZltsXT9mW2xdOjA7aC09Rzt3LnB1c2goe3g6cCx5OnItR30pO2ZbbF09ci1oO2lmKHgpYi5iZWdpblBhdGgoKSxiLm1vdmVUbyhwLGgpLHQmJihuLmJlZ2luUGF0aCgpLG4ubW92ZVRvKHAsaCkpLHg9ITE7ZWxzZSBpZihiLmxpbmVUbyhwLGgpLHQmJm4ubGluZVRvKHAsaCksMD09ayUyNTApe2ZvcigwPEIubGluZVRoaWNrbmVzcyYmYi5zdHJva2UoKTswPHcubGVuZ3RoOyl7dmFyIHo9dy5wb3AoKTtiLmxpbmVUbyh6Lngsei55KTt0JiZuLmxpbmVUbyh6Lngsei55KX1iLmNsb3NlUGF0aCgpO2IuZ2xvYmFsQWxwaGE9Qi5maWxsT3BhY2l0eTtiLmZpbGwoKTtiLmdsb2JhbEFscGhhPTE7Yi5iZWdpblBhdGgoKTtiLm1vdmVUbyhwLGgpO3QmJihuLmNsb3NlUGF0aCgpLG4uZmlsbCgpLG4uYmVnaW5QYXRoKCksbi5tb3ZlVG8ocCwKK2gpKTt3LnB1c2goe3g6cCx5OnItR30pfWlmKDA8PUIuZGF0YVBvaW50SW5kZXhlc1tsXSl7dmFyIEE9Qi5kYXRhUG9pbnRJZHNbQi5kYXRhUG9pbnRJbmRleGVzW2xdXTt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW0FdPXtpZDpBLG9iamVjdFR5cGU6ImRhdGFQb2ludCIsZGF0YVNlcmllc0luZGV4OnMsZGF0YVBvaW50SW5kZXg6Qi5kYXRhUG9pbnRJbmRleGVzW2xdLHgxOnAseTE6aH19MDw9Qi5kYXRhUG9pbnRJbmRleGVzW2xdJiYwIT09di5tYXJrZXJTaXplJiYoMDx2Lm1hcmtlclNpemV8fDA8Qi5tYXJrZXJTaXplKSYmKGw9Qi5nZXRNYXJrZXJQcm9wZXJ0aWVzKGsscCxoLGIpLGUucHVzaChsKSxtYXJrZXJDb2xvcj1DKEEpLHQmJmUucHVzaCh7eDpwLHk6aCxjdHg6bix0eXBlOmwudHlwZSxzaXplOmwuc2l6ZSxjb2xvcjptYXJrZXJDb2xvcixib3JkZXJDb2xvcjptYXJrZXJDb2xvcixib3JkZXJUaGlja25lc3M6bC5ib3JkZXJUaGlja25lc3N9KSk7KHYuaW5kZXhMYWJlbHx8CitCLmluZGV4TGFiZWwpJiZ0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6InN0YWNrZWRBcmVhMTAwIixkYXRhUG9pbnQ6dixkYXRhU2VyaWVzOkIscG9pbnQ6e3g6cCx5Omh9LGRpcmVjdGlvbjowPD11W2tdLnk/MTotMSxjb2xvcjpjfSl9fWZvcigwPEIubGluZVRoaWNrbmVzcyYmYi5zdHJva2UoKTswPHcubGVuZ3RoOyl6PXcucG9wKCksYi5saW5lVG8oei54LHoueSksdCYmbi5saW5lVG8oei54LHoueSk7Yi5jbG9zZVBhdGgoKTtiLmdsb2JhbEFscGhhPUIuZmlsbE9wYWNpdHk7Yi5maWxsKCk7Yi5nbG9iYWxBbHBoYT0xO2IuYmVnaW5QYXRoKCk7Yi5tb3ZlVG8ocCxoKTt0JiYobi5jbG9zZVBhdGgoKSxuLmZpbGwoKSxuLmJlZ2luUGF0aCgpLG4ubW92ZVRvKHAsaCkpfWRlbGV0ZSBCLmRhdGFQb2ludEluZGV4ZXN9Si5kcmF3TWFya2VycyhlKTtiLnJlc3RvcmUoKTt0JiZuLnJlc3RvcmUoKTtyZXR1cm57c291cmNlOmIsZGVzdDp0aGlzLnBsb3RBcmVhLmN0eCxhbmltYXRpb25DYWxsYmFjazp5LnhDbGlwQW5pbWF0aW9uLAorZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcubGluZWFyLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJCdWJibGU9ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXRDYW52YXNDdHh8fHRoaXMucGxvdEFyZWEuY3R4LGM9YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7aWYoISgwPj1jKSl7dmFyIGQ9dGhpcy5wbG90QXJlYSxlPTAsZixnLGs9MC4xNSp0aGlzLndpZHRoPDwwLGU9YS5heGlzWC5kYXRhSW5mby5taW5EaWZmLGM9MC45KihkLndpZHRoL01hdGguYWJzKGEuYXhpc1gubWF4aW11bS1hLmF4aXNYLm1pbmltdW0pKk1hdGguYWJzKGUpL2MpPDwwO2Iuc2F2ZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5zYXZlKCk7Yi5iZWdpblBhdGgoKTtiLnJlY3QoZC54MSxkLnkxLGQud2lkdGgsZC5oZWlnaHQpO2IuY2xpcCgpO3QmJih0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCksdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LmNsaXAoKSk7Citmb3IodmFyIHA9LUluZmluaXR5LGg9SW5maW5pdHksbD0wO2w8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7bCsrKWZvcih2YXIgcj1hLmRhdGFTZXJpZXNJbmRleGVzW2xdLG09dGhpcy5kYXRhW3JdLHE9bS5kYXRhUG9pbnRzLG49MCxlPTA7ZTxxLmxlbmd0aDtlKyspZj1xW2VdLmdldFRpbWU/Zj1xW2VdLnguZ2V0VGltZSgpOmY9cVtlXS54LGY8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8Zj5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4fHwidW5kZWZpbmVkIj09PXR5cGVvZiBxW2VdLnp8fChuPXFbZV0ueixuPnAmJihwPW4pLG48aCYmKGg9bikpO2Zvcih2YXIgcz0yNSpNYXRoLlBJLGQ9TWF0aC5tYXgoTWF0aC5wb3coMC4yNSpNYXRoLm1pbihkLmhlaWdodCxkLndpZHRoKS8yLDIpKk1hdGguUEkscyksbD0wO2w8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7bCsrKWlmKHI9YS5kYXRhU2VyaWVzSW5kZXhlc1tsXSxtPXRoaXMuZGF0YVtyXSxxPW0uZGF0YVBvaW50cywKKzE9PXEubGVuZ3RoJiYoYz1rKSwxPmM/Yz0xOmM+ayYmKGM9ayksMDxxLmxlbmd0aClmb3IoYi5zdHJva2VTdHlsZT0iIzQ1NzJBNyAiLGU9MDtlPHEubGVuZ3RoO2UrKylpZihmPXFbZV0uZ2V0VGltZT9mPXFbZV0ueC5nZXRUaW1lKCk6Zj1xW2VdLngsIShmPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fGY+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkmJiJudW1iZXIiPT09dHlwZW9mIHFbZV0ueSl7Zj1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooZi1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtnPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihxW2VdLnktYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PAorMDt2YXIgbj1xW2VdLnosQj0yKk1hdGgubWF4KE1hdGguc3FydCgocD09PWg/ZC8yOnMrKGQtcykvKHAtaCkqKG4taCkpL01hdGguUEkpPDwwLDEpLG49bS5nZXRNYXJrZXJQcm9wZXJ0aWVzKGUsYik7bi5zaXplPUI7Yi5nbG9iYWxBbHBoYT1tLmZpbGxPcGFjaXR5O0ouZHJhd01hcmtlcihmLGcsYixuLnR5cGUsbi5zaXplLG4uY29sb3Isbi5ib3JkZXJDb2xvcixuLmJvcmRlclRoaWNrbmVzcyk7Yi5nbG9iYWxBbHBoYT0xO3ZhciB1PW0uZGF0YVBvaW50SWRzW2VdO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbdV09e2lkOnUsb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhU2VyaWVzSW5kZXg6cixkYXRhUG9pbnRJbmRleDplLHgxOmYseTE6ZyxzaXplOkJ9O0I9Qyh1KTt0JiZKLmRyYXdNYXJrZXIoZixnLHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCxuLnR5cGUsbi5zaXplLEIsQixuLmJvcmRlclRoaWNrbmVzcyk7KHFbZV0uaW5kZXhMYWJlbHx8bS5pbmRleExhYmVsKSYmCit0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6ImJ1YmJsZSIsZGF0YVBvaW50OnFbZV0sZGF0YVNlcmllczptLHBvaW50Ont4OmYseTpnfSxkaXJlY3Rpb246MSxjb2xvcjpudWxsfSl9Yi5yZXN0b3JlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtyZXR1cm57c291cmNlOmIsZGVzdDp0aGlzLnBsb3RBcmVhLmN0eCxhbmltYXRpb25DYWxsYmFjazp5LmZhZGVJbkFuaW1hdGlvbixlYXNpbmdGdW5jdGlvbjp5LmVhc2luZy5lYXNlSW5RdWFkLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJTY2F0dGVyPWZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0Q2FudmFzQ3R4fHx0aGlzLnBsb3RBcmVhLmN0eCxjPWEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2lmKCEoMD49Yykpe3ZhciBkPXRoaXMucGxvdEFyZWEsZT0wLGYsZyxrPTAuMTUqdGhpcy53aWR0aDw8MCxlPWEuYXhpc1guZGF0YUluZm8ubWluRGlmZixjPTAuOSooZC53aWR0aC8KK01hdGguYWJzKGEuYXhpc1gubWF4aW11bS1hLmF4aXNYLm1pbmltdW0pKk1hdGguYWJzKGUpL2MpPDwwO2Iuc2F2ZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5zYXZlKCk7Yi5iZWdpblBhdGgoKTtiLnJlY3QoZC54MSxkLnkxLGQud2lkdGgsZC5oZWlnaHQpO2IuY2xpcCgpO3QmJih0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCksdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LmNsaXAoKSk7Zm9yKHZhciBwPTA7cDxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtwKyspe3ZhciBoPWEuZGF0YVNlcmllc0luZGV4ZXNbcF0sbD10aGlzLmRhdGFbaF0scj1sLmRhdGFQb2ludHM7MT09ci5sZW5ndGgmJihjPWspOzE+Yz9jPTE6Yz5rJiYoYz1rKTtpZigwPHIubGVuZ3RoKXtiLnN0cm9rZVN0eWxlPSIjNDU3MkE3ICI7TWF0aC5wb3coMC4zKk1hdGgubWluKGQuaGVpZ2h0LGQud2lkdGgpLzIsMik7Zm9yKHZhciBtPQorMCxxPTAsZT0wO2U8ci5sZW5ndGg7ZSsrKWlmKGY9cltlXS5nZXRUaW1lP2Y9cltlXS54LmdldFRpbWUoKTpmPXJbZV0ueCwhKGY8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8Zj5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSYmIm51bWJlciI9PT10eXBlb2YgcltlXS55KXtmPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihmLWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO2c9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKHJbZV0ueS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDt2YXIgbj1sLmdldE1hcmtlclByb3BlcnRpZXMoZSxmLGcsYik7Yi5nbG9iYWxBbHBoYT1sLmZpbGxPcGFjaXR5O0ouZHJhd01hcmtlcihuLngsCituLnksbi5jdHgsbi50eXBlLG4uc2l6ZSxuLmNvbG9yLG4uYm9yZGVyQ29sb3Isbi5ib3JkZXJUaGlja25lc3MpO2IuZ2xvYmFsQWxwaGE9MTtNYXRoLnNxcnQoKG0tZikqKG0tZikrKHEtZykqKHEtZykpPE1hdGgubWluKG4uc2l6ZSw1KSYmci5sZW5ndGg+TWF0aC5taW4odGhpcy5wbG90QXJlYS53aWR0aCx0aGlzLnBsb3RBcmVhLmhlaWdodCl8fChtPWwuZGF0YVBvaW50SWRzW2VdLHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbbV09e2lkOm0sb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhU2VyaWVzSW5kZXg6aCxkYXRhUG9pbnRJbmRleDplLHgxOmYseTE6Z30sbT1DKG0pLHQmJkouZHJhd01hcmtlcihuLngsbi55LHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCxuLnR5cGUsbi5zaXplLG0sbSxuLmJvcmRlclRoaWNrbmVzcyksKHJbZV0uaW5kZXhMYWJlbHx8bC5pbmRleExhYmVsKSYmdGhpcy5faW5kZXhMYWJlbHMucHVzaCh7Y2hhcnRUeXBlOiJzY2F0dGVyIixkYXRhUG9pbnQ6cltlXSwKK2RhdGFTZXJpZXM6bCxwb2ludDp7eDpmLHk6Z30sZGlyZWN0aW9uOjEsY29sb3I6bnVsbH0pLG09ZixxPWcpfX19Yi5yZXN0b3JlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtyZXR1cm57c291cmNlOmIsZGVzdDp0aGlzLnBsb3RBcmVhLmN0eCxhbmltYXRpb25DYWxsYmFjazp5LmZhZGVJbkFuaW1hdGlvbixlYXNpbmdGdW5jdGlvbjp5LmVhc2luZy5lYXNlSW5RdWFkLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJDYW5kbGVzdGljaz1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHgsYz10aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBkPW51bGwsZD10aGlzLnBsb3RBcmVhLGU9MCxmLGcsayxwLGgsbCxlPTAuMDE1KnRoaXMud2lkdGg7Zj1hLmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7dmFyIHI9MC43KmQud2lkdGgvCitNYXRoLmFicyhhLmF4aXNYLm1heGltdW0tYS5heGlzWC5taW5pbXVtKSpNYXRoLmFicyhmKTw8MDtyPmU/cj1lOkluZmluaXR5PT09Zj9yPWU6MT5yJiYocj0xKTtiLnNhdmUoKTt0JiZjLnNhdmUoKTtiLmJlZ2luUGF0aCgpO2IucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCk7Yi5jbGlwKCk7dCYmKGMucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCksYy5jbGlwKCkpO2Zvcih2YXIgbT0wO208YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7bSsrKXt2YXIgcT1hLmRhdGFTZXJpZXNJbmRleGVzW21dLG49dGhpcy5kYXRhW3FdLHM9bi5kYXRhUG9pbnRzO2lmKDA8cy5sZW5ndGgpZm9yKHZhciBCPTU8ciYmbi5iZXZlbEVuYWJsZWQ/ITA6ITEsZT0wO2U8cy5sZW5ndGg7ZSsrKWlmKHNbZV0uZ2V0VGltZT9sPXNbZV0ueC5nZXRUaW1lKCk6bD1zW2VdLngsIShsPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fGw+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkmJgorbnVsbCE9PXNbZV0ueSYmc1tlXS55Lmxlbmd0aCYmIm51bWJlciI9PT10eXBlb2Ygc1tlXS55WzBdJiYibnVtYmVyIj09PXR5cGVvZiBzW2VdLnlbMV0mJiJudW1iZXIiPT09dHlwZW9mIHNbZV0ueVsyXSYmIm51bWJlciI9PT10eXBlb2Ygc1tlXS55WzNdKXtmPWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihsLWEuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO2c9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKHNbZV0ueVswXS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtrPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihzW2VdLnlbMV0tCithLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtwPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihzW2VdLnlbMl0tYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7aD1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooc1tlXS55WzNdLWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkrMC41PDwwO3ZhciB1PWYtci8yPDwwLHg9dStyPDwwLGQ9c1tlXS5jb2xvcj9zW2VdLmNvbG9yOm4uX2NvbG9yU2V0WzBdLHc9TWF0aC5yb3VuZChNYXRoLm1heCgxLDAuMTUqcikpLHY9MD09PXclMj8wOjAuNSxHPW4uZGF0YVBvaW50SWRzW2VdO3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbR109e2lkOkcsb2JqZWN0VHlwZToiZGF0YVBvaW50IiwKK2RhdGFTZXJpZXNJbmRleDpxLGRhdGFQb2ludEluZGV4OmUseDE6dSx5MTpnLHgyOngseTI6ayx4MzpmLHkzOnAseDQ6Zix5NDpoLGJvcmRlclRoaWNrbmVzczp3LGNvbG9yOmR9O2Iuc3Ryb2tlU3R5bGU9ZDtiLmJlZ2luUGF0aCgpO2IubGluZVdpZHRoPXc7Yy5saW5lV2lkdGg9TWF0aC5tYXgodyw0KTsiY2FuZGxlc3RpY2siPT09bi50eXBlPyhiLm1vdmVUbyhmLXYsayksYi5saW5lVG8oZi12LE1hdGgubWluKGcsaCkpLGIuc3Ryb2tlKCksYi5tb3ZlVG8oZi12LE1hdGgubWF4KGcsaCkpLGIubGluZVRvKGYtdixwKSxiLnN0cm9rZSgpLEYoYix1LE1hdGgubWluKGcsaCkseCxNYXRoLm1heChnLGgpLHNbZV0ueVswXTw9c1tlXS55WzNdP24ucmlzaW5nQ29sb3I6ZCx3LGQsQixCLCExLCExLG4uZmlsbE9wYWNpdHkpLHQmJihkPUMoRyksYy5zdHJva2VTdHlsZT1kLGMubW92ZVRvKGYtdixrKSxjLmxpbmVUbyhmLXYsTWF0aC5taW4oZyxoKSksYy5zdHJva2UoKSxjLm1vdmVUbyhmLQordixNYXRoLm1heChnLGgpKSxjLmxpbmVUbyhmLXYscCksYy5zdHJva2UoKSxGKGMsdSxNYXRoLm1pbihnLGgpLHgsTWF0aC5tYXgoZyxoKSxkLDAsbnVsbCwhMSwhMSwhMSwhMSkpKToib2hsYyI9PT1uLnR5cGUmJihiLm1vdmVUbyhmLXYsayksYi5saW5lVG8oZi12LHApLGIuc3Ryb2tlKCksYi5iZWdpblBhdGgoKSxiLm1vdmVUbyhmLGcpLGIubGluZVRvKHUsZyksYi5zdHJva2UoKSxiLmJlZ2luUGF0aCgpLGIubW92ZVRvKGYsaCksYi5saW5lVG8oeCxoKSxiLnN0cm9rZSgpLHQmJihkPUMoRyksYy5zdHJva2VTdHlsZT1kLGMubW92ZVRvKGYtdixrKSxjLmxpbmVUbyhmLXYscCksYy5zdHJva2UoKSxjLmJlZ2luUGF0aCgpLGMubW92ZVRvKGYsZyksYy5saW5lVG8odSxnKSxjLnN0cm9rZSgpLGMuYmVnaW5QYXRoKCksYy5tb3ZlVG8oZixoKSxjLmxpbmVUbyh4LGgpLGMuc3Ryb2tlKCkpKTsoc1tlXS5pbmRleExhYmVsfHxuLmluZGV4TGFiZWwpJiZ0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6bi50eXBlLAorZGF0YVBvaW50OnNbZV0sZGF0YVNlcmllczpuLHBvaW50Ont4OnUrKHgtdSkvMix5Omt9LGRpcmVjdGlvbjoxLGJvdW5kczp7eDE6dSx5MTpNYXRoLm1pbihrLHApLHgyOngseTI6TWF0aC5tYXgoayxwKX0sY29sb3I6ZH0pfX1iLnJlc3RvcmUoKTt0JiZjLnJlc3RvcmUoKTtyZXR1cm57c291cmNlOmIsZGVzdDp0aGlzLnBsb3RBcmVhLmN0eCxhbmltYXRpb25DYWxsYmFjazp5LmZhZGVJbkFuaW1hdGlvbixlYXNpbmdGdW5jdGlvbjp5LmVhc2luZy5lYXNlSW5RdWFkLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJSYW5nZUNvbHVtbj1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBjPW51bGwsZD10aGlzLnBsb3RBcmVhLGU9MCxmLGcsZT0wLjAzKnRoaXMud2lkdGg7Zj1hLmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7dmFyIGs9MC45KihkLndpZHRoLworTWF0aC5hYnMoYS5heGlzWC5tYXhpbXVtLWEuYXhpc1gubWluaW11bSkqTWF0aC5hYnMoZikvYS5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMpPDwwO2s+ZT9rPWU6SW5maW5pdHk9PT1mP2s9ZToxPmsmJihrPTEpO2Iuc2F2ZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5zYXZlKCk7Yi5iZWdpblBhdGgoKTtiLnJlY3QoZC54MSxkLnkxLGQud2lkdGgsZC5oZWlnaHQpO2IuY2xpcCgpO3QmJih0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCksdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LmNsaXAoKSk7Zm9yKHZhciBwPTA7cDxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtwKyspe3ZhciBoPWEuZGF0YVNlcmllc0luZGV4ZXNbcF0sbD10aGlzLmRhdGFbaF0scj1sLmRhdGFQb2ludHM7aWYoMDxyLmxlbmd0aClmb3IodmFyIG09NTxrJiZsLmJldmVsRW5hYmxlZD8hMDohMSxlPTA7ZTxyLmxlbmd0aDtlKyspaWYocltlXS5nZXRUaW1lPworZz1yW2VdLnguZ2V0VGltZSgpOmc9cltlXS54LCEoZzxhLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWlufHxnPmEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpJiZudWxsIT09cltlXS55JiZyW2VdLnkubGVuZ3RoJiYibnVtYmVyIj09PXR5cGVvZiByW2VdLnlbMF0mJiJudW1iZXIiPT09dHlwZW9mIHJbZV0ueVsxXSl7Yz1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooZy1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtkPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihyW2VdLnlbMF0tYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7Zj1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoKKyhyW2VdLnlbMV0tYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7dmFyIHE9Yy1hLnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcyprLzIrKGEucHJldmlvdXNEYXRhU2VyaWVzQ291bnQrcCkqazw8MCxuPXErazw8MCxjPXJbZV0uY29sb3I/cltlXS5jb2xvcjpsLl9jb2xvclNldFtlJWwuX2NvbG9yU2V0Lmxlbmd0aF07aWYoZD5mKXt2YXIgcz1kLGQ9ZjtmPXN9cz1sLmRhdGFQb2ludElkc1tlXTt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3NdPXtpZDpzLG9iamVjdFR5cGU6ImRhdGFQb2ludCIsZGF0YVNlcmllc0luZGV4OmgsZGF0YVBvaW50SW5kZXg6ZSx4MTpxLHkxOmQseDI6bix5MjpmfTtGKGIscSxkLG4sZixjLDAsYyxtLG0sITEsITEsbC5maWxsT3BhY2l0eSk7Yz1DKHMpO3QmJkYodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LHEsZCxuLGYsYywwLG51bGwsITEsITEsITEsITEpO2lmKHJbZV0uaW5kZXhMYWJlbHx8bC5pbmRleExhYmVsKXRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToicmFuZ2VDb2x1bW4iLAorZGF0YVBvaW50OnJbZV0sZGF0YVNlcmllczpsLGluZGV4S2V5d29yZDowLHBvaW50Ont4OnErKG4tcSkvMix5OnJbZV0ueVsxXT49cltlXS55WzBdP2Y6ZH0sZGlyZWN0aW9uOnJbZV0ueVsxXT49cltlXS55WzBdPy0xOjEsYm91bmRzOnt4MTpxLHkxOk1hdGgubWluKGQsZikseDI6bix5MjpNYXRoLm1heChkLGYpfSxjb2xvcjpjfSksdGhpcy5faW5kZXhMYWJlbHMucHVzaCh7Y2hhcnRUeXBlOiJyYW5nZUNvbHVtbiIsZGF0YVBvaW50OnJbZV0sZGF0YVNlcmllczpsLGluZGV4S2V5d29yZDoxLHBvaW50Ont4OnErKG4tcSkvMix5OnJbZV0ueVsxXT49cltlXS55WzBdP2Q6Zn0sZGlyZWN0aW9uOnJbZV0ueVsxXT49cltlXS55WzBdPzE6LTEsYm91bmRzOnt4MTpxLHkxOk1hdGgubWluKGQsZikseDI6bix5MjpNYXRoLm1heChkLGYpfSxjb2xvcjpjfSl9fWIucmVzdG9yZSgpO3QmJnRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7cmV0dXJue3NvdXJjZTpiLGRlc3Q6dGhpcy5wbG90QXJlYS5jdHgsCithbmltYXRpb25DYWxsYmFjazp5LmZhZGVJbkFuaW1hdGlvbixlYXNpbmdGdW5jdGlvbjp5LmVhc2luZy5lYXNlSW5RdWFkLGFuaW1hdGlvbkJhc2U6MH19fTt2LnByb3RvdHlwZS5yZW5kZXJSYW5nZUJhcj1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBjPW51bGwsZD10aGlzLnBsb3RBcmVhLGU9MCxmLGcsayxlPU1hdGgubWluKDAuMTUqdGhpcy5oZWlnaHQsMC45Kih0aGlzLnBsb3RBcmVhLmhlaWdodC9hLnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcykpPDwwO2Y9YS5heGlzWC5kYXRhSW5mby5taW5EaWZmO3ZhciBwPTAuOSooZC5oZWlnaHQvTWF0aC5hYnMoYS5heGlzWC5tYXhpbXVtLWEuYXhpc1gubWluaW11bSkqTWF0aC5hYnMoZikvYS5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMpPDwwO3A+ZT9wPWU6SW5maW5pdHk9PT1mP3A9ZToxPnAmJihwPTEpO2Iuc2F2ZSgpOwordCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtiLmJlZ2luUGF0aCgpO2IucmVjdChkLngxLGQueTEsZC53aWR0aCxkLmhlaWdodCk7Yi5jbGlwKCk7dCYmKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZWN0KGQueDEsZC55MSxkLndpZHRoLGQuaGVpZ2h0KSx0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpKTtmb3IodmFyIGg9MDtoPGEuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO2grKyl7dmFyIGw9YS5kYXRhU2VyaWVzSW5kZXhlc1toXSxyPXRoaXMuZGF0YVtsXSxtPXIuZGF0YVBvaW50cztpZigwPG0ubGVuZ3RoKXt2YXIgcT01PHAmJnIuYmV2ZWxFbmFibGVkPyEwOiExO2Iuc3Ryb2tlU3R5bGU9IiM0NTcyQTcgIjtmb3IoZT0wO2U8bS5sZW5ndGg7ZSsrKWlmKG1bZV0uZ2V0VGltZT9rPW1bZV0ueC5nZXRUaW1lKCk6az1tW2VdLngsIShrPGEuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW58fGs+YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkmJgorbnVsbCE9PW1bZV0ueSYmbVtlXS55Lmxlbmd0aCYmIm51bWJlciI9PT10eXBlb2YgbVtlXS55WzBdJiYibnVtYmVyIj09PXR5cGVvZiBtW2VdLnlbMV0pe2Q9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKG1bZV0ueVswXS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtmPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihtW2VdLnlbMV0tYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7Zz1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCooay1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtnPWctCithLnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcypwLzIrKGEucHJldmlvdXNEYXRhU2VyaWVzQ291bnQraCkqcDw8MDt2YXIgbj1nK3A8PDA7ZD5mJiYoYz1kLGQ9ZixmPWMpO2M9bVtlXS5jb2xvcj9tW2VdLmNvbG9yOnIuX2NvbG9yU2V0W2Ulci5fY29sb3JTZXQubGVuZ3RoXTtGKGIsZCxnLGYsbixjLDAsbnVsbCxxLCExLCExLCExLHIuZmlsbE9wYWNpdHkpO2M9ci5kYXRhUG9pbnRJZHNbZV07dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtjXT17aWQ6YyxvYmplY3RUeXBlOiJkYXRhUG9pbnQiLGRhdGFTZXJpZXNJbmRleDpsLGRhdGFQb2ludEluZGV4OmUseDE6ZCx5MTpnLHgyOmYseTI6bn07Yz1DKGMpO3QmJkYodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LGQsZyxmLG4sYywwLG51bGwsITEsITEsITEsITEpO2lmKG1bZV0uaW5kZXhMYWJlbHx8ci5pbmRleExhYmVsKXRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToicmFuZ2VCYXIiLGRhdGFQb2ludDptW2VdLAorZGF0YVNlcmllczpyLGluZGV4S2V5d29yZDowLHBvaW50Ont4Om1bZV0ueVsxXT49bVtlXS55WzBdP2Q6Zix5OmcrKG4tZykvMn0sZGlyZWN0aW9uOm1bZV0ueVsxXT49bVtlXS55WzBdPy0xOjEsYm91bmRzOnt4MTpNYXRoLm1pbihkLGYpLHkxOmcseDI6TWF0aC5tYXgoZCxmKSx5MjpufSxjb2xvcjpjfSksdGhpcy5faW5kZXhMYWJlbHMucHVzaCh7Y2hhcnRUeXBlOiJyYW5nZUJhciIsZGF0YVBvaW50Om1bZV0sZGF0YVNlcmllczpyLGluZGV4S2V5d29yZDoxLHBvaW50Ont4Om1bZV0ueVsxXT49bVtlXS55WzBdP2Y6ZCx5OmcrKG4tZykvMn0sZGlyZWN0aW9uOm1bZV0ueVsxXT49bVtlXS55WzBdPzE6LTEsYm91bmRzOnt4MTpNYXRoLm1pbihkLGYpLHkxOmcseDI6TWF0aC5tYXgoZCxmKSx5MjpufSxjb2xvcjpjfSl9fX1iLnJlc3RvcmUoKTt0JiZ0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO3JldHVybntzb3VyY2U6YixkZXN0OnRoaXMucGxvdEFyZWEuY3R4LAorYW5pbWF0aW9uQ2FsbGJhY2s6eS5mYWRlSW5BbmltYXRpb24sZWFzaW5nRnVuY3Rpb246eS5lYXNpbmcuZWFzZUluUXVhZCxhbmltYXRpb25CYXNlOjB9fX07di5wcm90b3R5cGUucmVuZGVyUmFuZ2VBcmVhPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtpZih2KXt2YXIgYT1udWxsOzA8cC5saW5lVGhpY2tuZXNzJiZjLnN0cm9rZSgpO2Zvcih2YXIgYj1nLmxlbmd0aC0xOzA8PWI7Yi0tKWE9Z1tiXSxjLmxpbmVUbyhhLngsYS55KSxkLmxpbmVUbyhhLngsYS55KTtjLmNsb3NlUGF0aCgpO2MuZ2xvYmFsQWxwaGE9cC5maWxsT3BhY2l0eTtjLmZpbGwoKTtjLmdsb2JhbEFscGhhPTE7ZC5maWxsKCk7aWYoMDxwLmxpbmVUaGlja25lc3Mpe2MuYmVnaW5QYXRoKCk7Yy5tb3ZlVG8oYS54LGEueSk7Zm9yKGI9MDtiPGcubGVuZ3RoO2IrKylhPWdbYl0sYy5saW5lVG8oYS54LGEueSk7Yy5zdHJva2UoKX1jLmJlZ2luUGF0aCgpO2MubW92ZVRvKG0scSk7ZC5iZWdpblBhdGgoKTtkLm1vdmVUbyhtLAorcSk7dj17eDptLHk6cX07Zz1bXTtnLnB1c2goe3g6bSx5Om59KX19dmFyIGM9YS50YXJnZXRDYW52YXNDdHh8fHRoaXMucGxvdEFyZWEuY3R4O2lmKCEoMD49YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGgpKXt2YXIgZD10aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsZT1bXSxmPXRoaXMucGxvdEFyZWE7Yy5zYXZlKCk7dCYmZC5zYXZlKCk7Yy5iZWdpblBhdGgoKTtjLnJlY3QoZi54MSxmLnkxLGYud2lkdGgsZi5oZWlnaHQpO2MuY2xpcCgpO3QmJihkLmJlZ2luUGF0aCgpLGQucmVjdChmLngxLGYueTEsZi53aWR0aCxmLmhlaWdodCksZC5jbGlwKCkpO2ZvcihmPTA7ZjxhLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtmKyspe3ZhciBnPVtdLGs9YS5kYXRhU2VyaWVzSW5kZXhlc1tmXSxwPXRoaXMuZGF0YVtrXSxoPXAuZGF0YVBvaW50cyxlPXAuaWQ7dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtlXT17b2JqZWN0VHlwZToiZGF0YVNlcmllcyIsZGF0YVNlcmllc0luZGV4Omt9OworZT1DKGUpO2QuZmlsbFN0eWxlPWU7dmFyIGU9W10sbD0hMCxyPTAsbSxxLG4scyx2PW51bGw7aWYoMDxoLmxlbmd0aCl7dmFyIHU9cC5fY29sb3JTZXRbciVwLl9jb2xvclNldC5sZW5ndGhdO2MuZmlsbFN0eWxlPXU7Yy5zdHJva2VTdHlsZT11O2MubGluZVdpZHRoPXAubGluZVRoaWNrbmVzcztmb3IodmFyIHg9ITA7cjxoLmxlbmd0aDtyKyspaWYocz1oW3JdLnguZ2V0VGltZT9oW3JdLnguZ2V0VGltZSgpOmhbcl0ueCwhKHM8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8cz5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSlpZihudWxsIT09aFtyXS55JiZoW3JdLnkubGVuZ3RoJiYibnVtYmVyIj09PXR5cGVvZiBoW3JdLnlbMF0mJiJudW1iZXIiPT09dHlwZW9mIGhbcl0ueVsxXSl7bT1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoocy1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKworMC41PDwwO3E9YS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UrYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqKGhbcl0ueVswXS1hLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtuPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihoW3JdLnlbMV0tYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7bHx8eD8oYy5iZWdpblBhdGgoKSxjLm1vdmVUbyhtLHEpLHY9e3g6bSx5OnF9LGc9W10sZy5wdXNoKHt4Om0seTpufSksdCYmKGQuYmVnaW5QYXRoKCksZC5tb3ZlVG8obSxxKSkseD1sPSExKTooYy5saW5lVG8obSxxKSxnLnB1c2goe3g6bSx5Om59KSx0JiZkLmxpbmVUbyhtLHEpLDA9PXIlMjUwJiZiKCkpO3M9cC5kYXRhUG9pbnRJZHNbcl07dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtzXT0KK3tpZDpzLG9iamVjdFR5cGU6ImRhdGFQb2ludCIsZGF0YVNlcmllc0luZGV4OmssZGF0YVBvaW50SW5kZXg6cix4MTptLHkxOnEseTI6bn07aWYoMCE9PWhbcl0ubWFya2VyU2l6ZSYmKDA8aFtyXS5tYXJrZXJTaXplfHwwPHAubWFya2VyU2l6ZSkpe3ZhciB3PXAuZ2V0TWFya2VyUHJvcGVydGllcyhyLG0sbixjKTtlLnB1c2godyk7dmFyIHo9QyhzKTt0JiZlLnB1c2goe3g6bSx5Om4sY3R4OmQsdHlwZTp3LnR5cGUsc2l6ZTp3LnNpemUsY29sb3I6eixib3JkZXJDb2xvcjp6LGJvcmRlclRoaWNrbmVzczp3LmJvcmRlclRoaWNrbmVzc30pO3c9cC5nZXRNYXJrZXJQcm9wZXJ0aWVzKHIsbSxxLGMpO2UucHVzaCh3KTt6PUMocyk7dCYmZS5wdXNoKHt4Om0seTpxLGN0eDpkLHR5cGU6dy50eXBlLHNpemU6dy5zaXplLGNvbG9yOnosYm9yZGVyQ29sb3I6eixib3JkZXJUaGlja25lc3M6dy5ib3JkZXJUaGlja25lc3N9KX1pZihoW3JdLmluZGV4TGFiZWx8fHAuaW5kZXhMYWJlbCl0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6InJhbmdlQXJlYSIsCitkYXRhUG9pbnQ6aFtyXSxkYXRhU2VyaWVzOnAsaW5kZXhLZXl3b3JkOjAscG9pbnQ6e3g6bSx5OnF9LGRpcmVjdGlvbjpoW3JdLnlbMF08PWhbcl0ueVsxXT8tMToxLGNvbG9yOnV9KSx0aGlzLl9pbmRleExhYmVscy5wdXNoKHtjaGFydFR5cGU6InJhbmdlQXJlYSIsZGF0YVBvaW50Omhbcl0sZGF0YVNlcmllczpwLGluZGV4S2V5d29yZDoxLHBvaW50Ont4Om0seTpufSxkaXJlY3Rpb246aFtyXS55WzBdPD1oW3JdLnlbMV0/MTotMSxjb2xvcjp1fSl9ZWxzZSBiKCkseD0hMDtiKCk7Si5kcmF3TWFya2VycyhlKX19Yy5yZXN0b3JlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtyZXR1cm57c291cmNlOmMsZGVzdDp0aGlzLnBsb3RBcmVhLmN0eCxhbmltYXRpb25DYWxsYmFjazp5LnhDbGlwQW5pbWF0aW9uLGVhc2luZ0Z1bmN0aW9uOnkuZWFzaW5nLmxpbmVhcixhbmltYXRpb25CYXNlOjB9fX07di5wcm90b3R5cGUucmVuZGVyUmFuZ2VTcGxpbmVBcmVhPQorZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3ZhciBhPWZhKHEsMik7aWYoMDxhLmxlbmd0aCl7Yy5iZWdpblBhdGgoKTtjLm1vdmVUbyhhWzBdLngsYVswXS55KTt0JiYoZC5iZWdpblBhdGgoKSxkLm1vdmVUbyhhWzBdLngsYVswXS55KSk7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aC0zO2IrPTMpYy5iZXppZXJDdXJ2ZVRvKGFbYisxXS54LGFbYisxXS55LGFbYisyXS54LGFbYisyXS55LGFbYiszXS54LGFbYiszXS55KSx0JiZkLmJlemllckN1cnZlVG8oYVtiKzFdLngsYVtiKzFdLnksYVtiKzJdLngsYVtiKzJdLnksYVtiKzNdLngsYVtiKzNdLnkpOzA8ay5saW5lVGhpY2tuZXNzJiZjLnN0cm9rZSgpO2E9ZmEobiwyKTtjLmxpbmVUbyhuW24ubGVuZ3RoLTFdLngsbltuLmxlbmd0aC0xXS55KTtmb3IoYj1hLmxlbmd0aC0xOzI8YjtiLT0zKWMuYmV6aWVyQ3VydmVUbyhhW2ItMV0ueCxhW2ItMV0ueSxhW2ItMl0ueCxhW2ItMl0ueSxhW2ItM10ueCxhW2ItM10ueSksdCYmZC5iZXppZXJDdXJ2ZVRvKGFbYi0KKzFdLngsYVtiLTFdLnksYVtiLTJdLngsYVtiLTJdLnksYVtiLTNdLngsYVtiLTNdLnkpO2MuY2xvc2VQYXRoKCk7Yy5nbG9iYWxBbHBoYT1rLmZpbGxPcGFjaXR5O2MuZmlsbCgpO2MuZ2xvYmFsQWxwaGE9MTtpZigwPGsubGluZVRoaWNrbmVzcyl7Yy5iZWdpblBhdGgoKTtjLm1vdmVUbyhuW24ubGVuZ3RoLTFdLngsbltuLmxlbmd0aC0xXS55KTtmb3IoYj1hLmxlbmd0aC0xOzI8YjtiLT0zKWMuYmV6aWVyQ3VydmVUbyhhW2ItMV0ueCxhW2ItMV0ueSxhW2ItMl0ueCxhW2ItMl0ueSxhW2ItM10ueCxhW2ItM10ueSksdCYmZC5iZXppZXJDdXJ2ZVRvKGFbYi0xXS54LGFbYi0xXS55LGFbYi0yXS54LGFbYi0yXS55LGFbYi0zXS54LGFbYi0zXS55KTtjLnN0cm9rZSgpfWMuYmVnaW5QYXRoKCk7dCYmKGQuY2xvc2VQYXRoKCksZC5maWxsKCkpfX12YXIgYz1hLnRhcmdldENhbnZhc0N0eHx8dGhpcy5wbG90QXJlYS5jdHg7aWYoISgwPj1hLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCkpe3ZhciBkPQordGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LGU9W10sZj10aGlzLnBsb3RBcmVhO2Muc2F2ZSgpO3QmJmQuc2F2ZSgpO2MuYmVnaW5QYXRoKCk7Yy5yZWN0KGYueDEsZi55MSxmLndpZHRoLGYuaGVpZ2h0KTtjLmNsaXAoKTt0JiYoZC5iZWdpblBhdGgoKSxkLnJlY3QoZi54MSxmLnkxLGYud2lkdGgsZi5oZWlnaHQpLGQuY2xpcCgpKTtmb3IoZj0wO2Y8YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7ZisrKXt2YXIgZz1hLmRhdGFTZXJpZXNJbmRleGVzW2ZdLGs9dGhpcy5kYXRhW2ddLHA9ay5kYXRhUG9pbnRzLGU9ay5pZDt0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2VdPXtvYmplY3RUeXBlOiJkYXRhU2VyaWVzIixkYXRhU2VyaWVzSW5kZXg6Z307ZT1DKGUpO2QuZmlsbFN0eWxlPWU7dmFyIGU9W10saD0wLGwscixtLHE9W10sbj1bXTtpZigwPHAubGVuZ3RoKXtjb2xvcj1rLl9jb2xvclNldFtoJWsuX2NvbG9yU2V0Lmxlbmd0aF07Yy5maWxsU3R5bGU9Y29sb3I7Yy5zdHJva2VTdHlsZT0KK2NvbG9yO2ZvcihjLmxpbmVXaWR0aD1rLmxpbmVUaGlja25lc3M7aDxwLmxlbmd0aDtoKyspaWYobD1wW2hdLnguZ2V0VGltZT9wW2hdLnguZ2V0VGltZSgpOnBbaF0ueCwhKGw8YS5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbnx8bD5hLmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSlpZihudWxsIT09cFtoXS55JiZwW2hdLnkubGVuZ3RoJiYibnVtYmVyIj09PXR5cGVvZiBwW2hdLnlbMF0mJiJudW1iZXIiPT09dHlwZW9mIHBbaF0ueVsxXSl7bD1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSthLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCoobC1hLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKzAuNTw8MDtyPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihwW2hdLnlbMF0tYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSsKKzAuNTw8MDttPWEuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlK2EuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KihwW2hdLnlbMV0tYS5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSswLjU8PDA7dmFyIHM9ay5kYXRhUG9pbnRJZHNbaF07dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtzXT17aWQ6cyxvYmplY3RUeXBlOiJkYXRhUG9pbnQiLGRhdGFTZXJpZXNJbmRleDpnLGRhdGFQb2ludEluZGV4OmgseDE6bCx5MTpyLHkyOm19O3FbcS5sZW5ndGhdPXt4OmwseTpyfTtuW24ubGVuZ3RoXT17eDpsLHk6bX07aWYoMCE9PXBbaF0ubWFya2VyU2l6ZSYmKDA8cFtoXS5tYXJrZXJTaXplfHwwPGsubWFya2VyU2l6ZSkpe3ZhciB2PWsuZ2V0TWFya2VyUHJvcGVydGllcyhoLGwscixjKTtlLnB1c2godik7dmFyIHU9QyhzKTt0JiZlLnB1c2goe3g6bCx5OnIsY3R4OmQsdHlwZTp2LnR5cGUsc2l6ZTp2LnNpemUsY29sb3I6dSwKK2JvcmRlckNvbG9yOnUsYm9yZGVyVGhpY2tuZXNzOnYuYm9yZGVyVGhpY2tuZXNzfSk7dj1rLmdldE1hcmtlclByb3BlcnRpZXMoaCxsLG0sYyk7ZS5wdXNoKHYpO3U9QyhzKTt0JiZlLnB1c2goe3g6bCx5Om0sY3R4OmQsdHlwZTp2LnR5cGUsc2l6ZTp2LnNpemUsY29sb3I6dSxib3JkZXJDb2xvcjp1LGJvcmRlclRoaWNrbmVzczp2LmJvcmRlclRoaWNrbmVzc30pfWlmKHBbaF0uaW5kZXhMYWJlbHx8ay5pbmRleExhYmVsKXRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToic3BsaW5lQXJlYSIsZGF0YVBvaW50OnBbaF0sZGF0YVNlcmllczprLGluZGV4S2V5d29yZDowLHBvaW50Ont4OmwseTpyfSxkaXJlY3Rpb246cFtoXS55WzBdPD1wW2hdLnlbMV0/LTE6MSxjb2xvcjpjb2xvcn0pLHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe2NoYXJ0VHlwZToic3BsaW5lQXJlYSIsZGF0YVBvaW50OnBbaF0sZGF0YVNlcmllczprLGluZGV4S2V5d29yZDoxLHBvaW50Ont4OmwseTptfSwKK2RpcmVjdGlvbjpwW2hdLnlbMF08PXBbaF0ueVsxXT8xOi0xLGNvbG9yOmNvbG9yfSl9ZWxzZSAwPGgmJihiKCkscT1bXSxuPVtdKTtiKCk7Si5kcmF3TWFya2VycyhlKX19Yy5yZXN0b3JlKCk7dCYmdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtyZXR1cm57c291cmNlOmMsZGVzdDp0aGlzLnBsb3RBcmVhLmN0eCxhbmltYXRpb25DYWxsYmFjazp5LnhDbGlwQW5pbWF0aW9uLGVhc2luZ0Z1bmN0aW9uOnkuZWFzaW5nLmxpbmVhcixhbmltYXRpb25CYXNlOjB9fX07dmFyIHBhPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsayl7InVuZGVmaW5lZCI9PT10eXBlb2YgayYmKGs9MSk7aWYoIXQpe3ZhciBwPU51bWJlcigoZyUoMipNYXRoLlBJKSkudG9GaXhlZCg4KSk7TnVtYmVyKChmJSgyKk1hdGguUEkpKS50b0ZpeGVkKDgpKT09PXAmJihnLT0xRS00KX1hLnNhdmUoKTthLmdsb2JhbEFscGhhPWs7InBpZSI9PT1lPyhhLmJlZ2luUGF0aCgpLGEubW92ZVRvKGIueCxiLnkpLAorYS5hcmMoYi54LGIueSxjLGYsZywhMSksYS5maWxsU3R5bGU9ZCxhLnN0cm9rZVN0eWxlPSJ3aGl0ZSIsYS5saW5lV2lkdGg9MixhLmNsb3NlUGF0aCgpLGEuZmlsbCgpKToiZG91Z2hudXQiPT09ZSYmKGEuYmVnaW5QYXRoKCksYS5hcmMoYi54LGIueSxjLGYsZywhMSksYS5hcmMoYi54LGIueSwwLjYqYyxnLGYsITApLGEuY2xvc2VQYXRoKCksYS5maWxsU3R5bGU9ZCxhLnN0cm9rZVN0eWxlPSJ3aGl0ZSIsYS5saW5lV2lkdGg9MixhLmZpbGwoKSk7YS5nbG9iYWxBbHBoYT0xO2EucmVzdG9yZSgpfTt2LnByb3RvdHlwZS5yZW5kZXJQaWU9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe2lmKGgmJmwpe3ZhciBhPTAsYj0wLGM9MCxkPTA7Zm9yKEE9MDtBPGwubGVuZ3RoO0ErKyl7dmFyIGU9bFtBXSxnPWguZGF0YVBvaW50SWRzW0FdLGY9e2lkOmcsb2JqZWN0VHlwZToiZGF0YVBvaW50IixkYXRhUG9pbnRJbmRleDpBLGRhdGFTZXJpZXNJbmRleDowfTtuLnB1c2goZik7dmFyIGs9ZS5pbmRleExhYmVsPworZS5pbmRleExhYmVsOmguaW5kZXhMYWJlbD9oLmluZGV4TGFiZWw6ZS5sYWJlbD9lLmxhYmVsOmgubGFiZWw/aC5sYWJlbDoiIjtwLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2ddPWY7Zi5jZW50ZXI9e3g6dy54LHk6dy55fTtmLnk9ZS55O2YucmFkaXVzPXk7Zi5pbmRleExhYmVsVGV4dD1wLnJlcGxhY2VLZXl3b3Jkc1dpdGhWYWx1ZShrLGUsaCxBKTtmLmluZGV4TGFiZWxQbGFjZW1lbnQ9aC5pbmRleExhYmVsUGxhY2VtZW50O2YuaW5kZXhMYWJlbExpbmVDb2xvcj1lLmluZGV4TGFiZWxMaW5lQ29sb3I/ZS5pbmRleExhYmVsTGluZUNvbG9yOmguaW5kZXhMYWJlbExpbmVDb2xvcj9oLmluZGV4TGFiZWxMaW5lQ29sb3I6ZS5jb2xvcj9lLmNvbG9yOmguX2NvbG9yU2V0W0ElaC5fY29sb3JTZXQubGVuZ3RoXTtmLmluZGV4TGFiZWxMaW5lVGhpY2tuZXNzPWUuaW5kZXhMYWJlbExpbmVUaGlja25lc3M/ZS5pbmRleExhYmVsTGluZVRoaWNrbmVzczpoLmluZGV4TGFiZWxMaW5lVGhpY2tuZXNzOworZi5pbmRleExhYmVsRm9udENvbG9yPWUuaW5kZXhMYWJlbEZvbnRDb2xvcj9lLmluZGV4TGFiZWxGb250Q29sb3I6aC5pbmRleExhYmVsRm9udENvbG9yO2YuaW5kZXhMYWJlbEZvbnRTdHlsZT1lLmluZGV4TGFiZWxGb250U3R5bGU/ZS5pbmRleExhYmVsRm9udFN0eWxlOmguaW5kZXhMYWJlbEZvbnRTdHlsZTtmLmluZGV4TGFiZWxGb250V2VpZ2h0PWUuaW5kZXhMYWJlbEZvbnRXZWlnaHQ/ZS5pbmRleExhYmVsRm9udFdlaWdodDpoLmluZGV4TGFiZWxGb250V2VpZ2h0O2YuaW5kZXhMYWJlbEZvbnRTaXplPWUuaW5kZXhMYWJlbEZvbnRTaXplP2UuaW5kZXhMYWJlbEZvbnRTaXplOmguaW5kZXhMYWJlbEZvbnRTaXplO2YuaW5kZXhMYWJlbEZvbnRGYW1pbHk9ZS5pbmRleExhYmVsRm9udEZhbWlseT9lLmluZGV4TGFiZWxGb250RmFtaWx5OmguaW5kZXhMYWJlbEZvbnRGYW1pbHk7Zi5pbmRleExhYmVsQmFja2dyb3VuZENvbG9yPWUuaW5kZXhMYWJlbEJhY2tncm91bmRDb2xvcj9lLmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3I6CitoLmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3I/aC5pbmRleExhYmVsQmFja2dyb3VuZENvbG9yOm51bGw7Zi5pbmRleExhYmVsTWF4V2lkdGg9ZS5pbmRleExhYmVsTWF4V2lkdGg/ZS5pbmRleExhYmVsTWF4V2lkdGg6aC5pbmRleExhYmVsTWF4V2lkdGg/aC5pbmRleExhYmVsTWF4V2lkdGg6MC4zMyptLndpZHRoO2YuaW5kZXhMYWJlbFdyYXA9InVuZGVmaW5lZCIhPT10eXBlb2YgZS5pbmRleExhYmVsV3JhcD9lLmluZGV4TGFiZWxXcmFwOmguaW5kZXhMYWJlbFdyYXA7Zi5zdGFydEFuZ2xlPTA9PT1BP2guc3RhcnRBbmdsZT9oLnN0YXJ0QW5nbGUvMTgwKk1hdGguUEk6MDpuW0EtMV0uZW5kQW5nbGU7Zi5zdGFydEFuZ2xlPShmLnN0YXJ0QW5nbGUrMipNYXRoLlBJKSUoMipNYXRoLlBJKTtmLmVuZEFuZ2xlPWYuc3RhcnRBbmdsZSsyKk1hdGguUEkvQypNYXRoLmFicyhlLnkpO2U9KGYuZW5kQW5nbGUrZi5zdGFydEFuZ2xlKS8yO2U9KGUrMipNYXRoLlBJKSUoMipNYXRoLlBJKTsKK2YubWlkQW5nbGU9ZTtpZihmLm1pZEFuZ2xlPk1hdGguUEkvMi11JiZmLm1pZEFuZ2xlPE1hdGguUEkvMit1KXtpZigwPT09YXx8bltjXS5taWRBbmdsZT5mLm1pZEFuZ2xlKWM9QTthKyt9ZWxzZSBpZihmLm1pZEFuZ2xlPjMqTWF0aC5QSS8yLXUmJmYubWlkQW5nbGU8MypNYXRoLlBJLzIrdSl7aWYoMD09PWJ8fG5bZF0ubWlkQW5nbGU+Zi5taWRBbmdsZSlkPUE7YisrfWYuaGVtaXNwaGVyZT1lPk1hdGguUEkvMiYmZTw9MypNYXRoLlBJLzI/ImxlZnQiOiJyaWdodCI7Zi5pbmRleExhYmVsVGV4dEJsb2NrPW5ldyBJKHAucGxvdEFyZWEuY3R4LHtmb250U2l6ZTpmLmluZGV4TGFiZWxGb250U2l6ZSxmb250RmFtaWx5OmYuaW5kZXhMYWJlbEZvbnRGYW1pbHksZm9udENvbG9yOmYuaW5kZXhMYWJlbEZvbnRDb2xvcixmb250U3R5bGU6Zi5pbmRleExhYmVsRm9udFN0eWxlLGZvbnRXZWlnaHQ6Zi5pbmRleExhYmVsRm9udFdlaWdodCxob3Jpem9udGFsQWxpZ246ImxlZnQiLGJhY2tncm91bmRDb2xvcjpmLmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3IsCittYXhXaWR0aDpmLmluZGV4TGFiZWxNYXhXaWR0aCxtYXhIZWlnaHQ6Zi5pbmRleExhYmVsV3JhcD81KmYuaW5kZXhMYWJlbEZvbnRTaXplOjEuNSpmLmluZGV4TGFiZWxGb250U2l6ZSx0ZXh0OmYuaW5kZXhMYWJlbFRleHQscGFkZGluZzowLHRleHRCYXNlbGluZToidG9wIn0pO2YuaW5kZXhMYWJlbFRleHRCbG9jay5tZWFzdXJlVGV4dCgpfWc9ZT0wO2s9ITE7Zm9yKEE9MDtBPGwubGVuZ3RoO0ErKylmPW5bKGMrQSklbC5sZW5ndGhdLDE8YSYmKGYubWlkQW5nbGU+TWF0aC5QSS8yLXUmJmYubWlkQW5nbGU8TWF0aC5QSS8yK3UpJiYoZTw9YS8yJiYhaz8oZi5oZW1pc3BoZXJlPSJyaWdodCIsZSsrKTooZi5oZW1pc3BoZXJlPSJsZWZ0IixrPSEwKSk7az0hMTtmb3IoQT0wO0E8bC5sZW5ndGg7QSsrKWY9blsoZCtBKSVsLmxlbmd0aF0sMTxiJiYoZi5taWRBbmdsZT4zKk1hdGguUEkvMi11JiZmLm1pZEFuZ2xlPDMqTWF0aC5QSS8yK3UpJiYoZzw9Yi8yJiYhaz8oZi5oZW1pc3BoZXJlPQorImxlZnQiLGcrKyk6KGYuaGVtaXNwaGVyZT0icmlnaHQiLGs9ITApKX19ZnVuY3Rpb24gYyhhKXt2YXIgYj1wLnBsb3RBcmVhLmN0eDtiLmNsZWFyUmVjdChtLngxLG0ueTEsbS53aWR0aCxtLmhlaWdodCk7Yi5maWxsU3R5bGU9cC5iYWNrZ3JvdW5kQ29sb3I7Yi5maWxsUmVjdChtLngxLG0ueTEsbS53aWR0aCxtLmhlaWdodCk7Zm9yKGI9MDtiPGwubGVuZ3RoO2IrKyl7dmFyIGM9bltiXS5zdGFydEFuZ2xlLGQ9bltiXS5lbmRBbmdsZTtpZihkPmMpe3ZhciBlPTAuMDcqeSpNYXRoLmNvcyhuW2JdLm1pZEFuZ2xlKSxmPTAuMDcqeSpNYXRoLnNpbihuW2JdLm1pZEFuZ2xlKSxnPSExO2lmKGxbYl0uZXhwbG9kZWQpe2lmKDFFLTk8TWF0aC5hYnMobltiXS5jZW50ZXIueC0ody54K2UpKXx8MUUtOTxNYXRoLmFicyhuW2JdLmNlbnRlci55LSh3LnkrZikpKW5bYl0uY2VudGVyLng9dy54K2UqYSxuW2JdLmNlbnRlci55PXcueStmKmEsZz0hMH1lbHNlIGlmKDA8TWF0aC5hYnMobltiXS5jZW50ZXIueC0KK3cueCl8fDA8TWF0aC5hYnMobltiXS5jZW50ZXIueS13LnkpKW5bYl0uY2VudGVyLng9dy54K2UqKDEtYSksbltiXS5jZW50ZXIueT13LnkrZiooMS1hKSxnPSEwO2cmJihlPXt9LGUuZGF0YVNlcmllcz1oLGUuZGF0YVBvaW50PWguZGF0YVBvaW50c1tiXSxlLmluZGV4PWIscC5fdG9vbFRpcC5oaWdobGlnaHRPYmplY3RzKFtlXSkpO3BhKHAucGxvdEFyZWEuY3R4LG5bYl0uY2VudGVyLG5bYl0ucmFkaXVzLGxbYl0uY29sb3I/bFtiXS5jb2xvcjpoLl9jb2xvclNldFtiJWguX2NvbG9yU2V0Lmxlbmd0aF0saC50eXBlLGMsZCxoLmZpbGxPcGFjaXR5KX19YT1wLnBsb3RBcmVhLmN0eDthLmZpbGxTdHlsZT0iYmxhY2siO2Euc3Ryb2tlU3R5bGU9ImdyZXkiO2EudGV4dEJhc2VsaW5lPSJtaWRkbGUiO2EubGluZUpvaW49InJvdW5kIjtmb3IoYj1iPTA7YjxsLmxlbmd0aDtiKyspYz1uW2JdLGMuaW5kZXhMYWJlbFRleHQmJihjLmluZGV4TGFiZWxUZXh0QmxvY2sueS09Yy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodC8KKzIsZD0wLGQ9ImxlZnQiPT09Yy5oZW1pc3BoZXJlPyJpbnNpZGUiIT09aC5pbmRleExhYmVsUGxhY2VtZW50Py0oYy5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoK3IpOi1jLmluZGV4TGFiZWxUZXh0QmxvY2sud2lkdGgvMjoiaW5zaWRlIiE9PWguaW5kZXhMYWJlbFBsYWNlbWVudD9yOi1jLmluZGV4TGFiZWxUZXh0QmxvY2sud2lkdGgvMixjLmluZGV4TGFiZWxUZXh0QmxvY2sueCs9ZCxjLmluZGV4TGFiZWxUZXh0QmxvY2sucmVuZGVyKCEwKSxjLmluZGV4TGFiZWxUZXh0QmxvY2sueC09ZCxjLmluZGV4TGFiZWxUZXh0QmxvY2sueSs9Yy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodC8yLCJpbnNpZGUiIT09Yy5pbmRleExhYmVsUGxhY2VtZW50JiYoZD1jLmNlbnRlci54K3kqTWF0aC5jb3MoYy5taWRBbmdsZSksZT1jLmNlbnRlci55K3kqTWF0aC5zaW4oYy5taWRBbmdsZSksYS5zdHJva2VTdHlsZT1jLmluZGV4TGFiZWxMaW5lQ29sb3IsYS5saW5lV2lkdGg9Yy5pbmRleExhYmVsTGluZVRoaWNrbmVzcywKK2EuYmVnaW5QYXRoKCksYS5tb3ZlVG8oZCxlKSxhLmxpbmVUbyhjLmluZGV4TGFiZWxUZXh0QmxvY2sueCxjLmluZGV4TGFiZWxUZXh0QmxvY2sueSksYS5saW5lVG8oYy5pbmRleExhYmVsVGV4dEJsb2NrLngrKCJsZWZ0Ij09PWMuaGVtaXNwaGVyZT8tcjpyKSxjLmluZGV4TGFiZWxUZXh0QmxvY2sueSksYS5zdHJva2UoKSksYS5saW5lSm9pbj0ibWl0ZXIiKX1mdW5jdGlvbiBkKGEsYil7dmFyIGM9YS5pbmRleExhYmVsVGV4dEJsb2NrLngsZD1hLmluZGV4TGFiZWxUZXh0QmxvY2sueS1hLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzIsZT1hLmluZGV4TGFiZWxUZXh0QmxvY2sueSthLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzIsZj1iLmluZGV4TGFiZWxUZXh0QmxvY2sueS1iLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzIsZz1iLmluZGV4TGFiZWxUZXh0QmxvY2sueCtiLmluZGV4TGFiZWxUZXh0QmxvY2sud2lkdGgsbD1iLmluZGV4TGFiZWxUZXh0QmxvY2sueSsKK2IuaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQvMjtyZXR1cm4gYS5pbmRleExhYmVsVGV4dEJsb2NrLngrYS5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoPGIuaW5kZXhMYWJlbFRleHRCbG9jay54LXJ8fGM+ZytyfHxkPmwrcnx8ZTxmLXI/ITE6ITB9ZnVuY3Rpb24gZShhLGIpe3ZhciBjPTAsYz1hLmluZGV4TGFiZWxUZXh0QmxvY2sueS1hLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzIsZD1hLmluZGV4TGFiZWxUZXh0QmxvY2sueSthLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzIsZT1iLmluZGV4TGFiZWxUZXh0QmxvY2sueS1iLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzIsZj1iLmluZGV4TGFiZWxUZXh0QmxvY2sueStiLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzI7cmV0dXJuIGM9Yi5pbmRleExhYmVsVGV4dEJsb2NrLnk+YS5pbmRleExhYmVsVGV4dEJsb2NrLnk/ZS1kOmMtZn1mdW5jdGlvbiBmKGEpe2Zvcih2YXIgYj1udWxsLGM9MTtjPGwubGVuZ3RoO2MrKylpZihiPQorKGErYytuLmxlbmd0aCklbi5sZW5ndGgsbltiXS5oZW1pc3BoZXJlIT09blthXS5oZW1pc3BoZXJlKXtiPW51bGw7YnJlYWt9ZWxzZSBpZihuW2JdLmluZGV4TGFiZWxUZXh0JiZiIT09YSYmKDA+ZShuW2JdLG5bYV0pfHwoInJpZ2h0Ij09PW5bYV0uaGVtaXNwaGVyZT9uW2JdLmluZGV4TGFiZWxUZXh0QmxvY2sueT49blthXS5pbmRleExhYmVsVGV4dEJsb2NrLnk6bltiXS5pbmRleExhYmVsVGV4dEJsb2NrLnk8PW5bYV0uaW5kZXhMYWJlbFRleHRCbG9jay55KSkpYnJlYWs7ZWxzZSBiPW51bGw7cmV0dXJuIGJ9ZnVuY3Rpb24gZyhhLGIpe2I9Ynx8MDt2YXIgYz0wLGQ9dy55LTEqeixoPXcueSsxKno7aWYoMDw9YSYmYTxsLmxlbmd0aCl7dmFyIG09blthXTtpZigwPmImJm0uaW5kZXhMYWJlbFRleHRCbG9jay55PGR8fDA8YiYmbS5pbmRleExhYmVsVGV4dEJsb2NrLnk+aClyZXR1cm4gMDt2YXIgaz1iLHA9MCxyPTAscj1wPXA9MDswPms/bS5pbmRleExhYmVsVGV4dEJsb2NrLnktCittLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzI+ZCYmbS5pbmRleExhYmVsVGV4dEJsb2NrLnktbS5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodC8yK2s8ZCYmKGs9LShkLShtLmluZGV4TGFiZWxUZXh0QmxvY2sueS1tLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzIraykpKTptLmluZGV4TGFiZWxUZXh0QmxvY2sueSttLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzI8ZCYmbS5pbmRleExhYmVsVGV4dEJsb2NrLnkrbS5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodC8yK2s+aCYmKGs9bS5pbmRleExhYmVsVGV4dEJsb2NrLnkrbS5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodC8yK2staCk7az1tLmluZGV4TGFiZWxUZXh0QmxvY2sueStrO2Q9MDtkPSJyaWdodCI9PT1tLmhlbWlzcGhlcmU/dy54K01hdGguc3FydChNYXRoLnBvdyh6LDIpLU1hdGgucG93KGstdy55LDIpKTp3LngtTWF0aC5zcXJ0KE1hdGgucG93KHosMiktTWF0aC5wb3coay13LnksMikpO3I9dy54K3kqCitNYXRoLmNvcyhtLm1pZEFuZ2xlKTtwPXcueSt5Kk1hdGguc2luKG0ubWlkQW5nbGUpO3A9TWF0aC5zcXJ0KE1hdGgucG93KGQtciwyKStNYXRoLnBvdyhrLXAsMikpO3I9TWF0aC5hY29zKHkveik7cD1NYXRoLmFjb3MoKHoqeit5KnktcCpwKS8oMip5KnopKTtrPXA8cj9rLW0uaW5kZXhMYWJlbFRleHRCbG9jay55OjA7ZD1udWxsO2ZvcihoPTE7aDxsLmxlbmd0aDtoKyspaWYoZD0oYS1oK24ubGVuZ3RoKSVuLmxlbmd0aCxuW2RdLmhlbWlzcGhlcmUhPT1uW2FdLmhlbWlzcGhlcmUpe2Q9bnVsbDticmVha31lbHNlIGlmKG5bZF0uaW5kZXhMYWJlbFRleHQmJm5bZF0uaGVtaXNwaGVyZT09PW5bYV0uaGVtaXNwaGVyZSYmZCE9PWEmJigwPmUobltkXSxuW2FdKXx8KCJyaWdodCI9PT1uW2FdLmhlbWlzcGhlcmU/bltkXS5pbmRleExhYmVsVGV4dEJsb2NrLnk8PW5bYV0uaW5kZXhMYWJlbFRleHRCbG9jay55Om5bZF0uaW5kZXhMYWJlbFRleHRCbG9jay55Pj1uW2FdLmluZGV4TGFiZWxUZXh0QmxvY2sueSkpKWJyZWFrOworZWxzZSBkPW51bGw7cj1kO3A9ZihhKTtoPWQ9MDswPms/KGg9InJpZ2h0Ij09PW0uaGVtaXNwaGVyZT9yOnAsYz1rLG51bGwhPT1oJiYocj0tayxrPW0uaW5kZXhMYWJlbFRleHRCbG9jay55LW0uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQvMi0obltoXS5pbmRleExhYmVsVGV4dEJsb2NrLnkrbltoXS5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodC8yKSxrLXI8cyYmKGQ9LXIscSsrLGg9ZyhoLGQpLCtoLnRvRml4ZWQodik+K2QudG9GaXhlZCh2KSYmKGM9az5zPy0oay1zKTotKHItKGgtZCkpKSkpKTowPGsmJihoPSJyaWdodCI9PT1tLmhlbWlzcGhlcmU/cDpyLGM9ayxudWxsIT09aCYmKHI9ayxrPW5baF0uaW5kZXhMYWJlbFRleHRCbG9jay55LW5baF0uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQvMi0obS5pbmRleExhYmVsVGV4dEJsb2NrLnkrbS5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodC8yKSxrLXI8cyYmKGQ9cixxKyssaD1nKGgsZCksK2gudG9GaXhlZCh2KTwrZC50b0ZpeGVkKHYpJiYKKyhjPWs+cz9rLXM6ci0oZC1oKSkpKSk7YyYmKGs9bS5pbmRleExhYmVsVGV4dEJsb2NrLnkrYyxkPTAsZD0icmlnaHQiPT09bS5oZW1pc3BoZXJlP3cueCtNYXRoLnNxcnQoTWF0aC5wb3coeiwyKS1NYXRoLnBvdyhrLXcueSwyKSk6dy54LU1hdGguc3FydChNYXRoLnBvdyh6LDIpLU1hdGgucG93KGstdy55LDIpKSxtLm1pZEFuZ2xlPk1hdGguUEkvMi11JiZtLm1pZEFuZ2xlPE1hdGguUEkvMit1PyhoPShhLTErbi5sZW5ndGgpJW4ubGVuZ3RoLGg9bltoXSxyPW5bKGErMStuLmxlbmd0aCklbi5sZW5ndGhdLCJsZWZ0Ij09PW0uaGVtaXNwaGVyZSYmInJpZ2h0Ij09PWguaGVtaXNwaGVyZSYmZD5oLmluZGV4TGFiZWxUZXh0QmxvY2sueD9kPWguaW5kZXhMYWJlbFRleHRCbG9jay54LTE1OiJyaWdodCI9PT1tLmhlbWlzcGhlcmUmJigibGVmdCI9PT1yLmhlbWlzcGhlcmUmJmQ8ci5pbmRleExhYmVsVGV4dEJsb2NrLngpJiYoZD1yLmluZGV4TGFiZWxUZXh0QmxvY2sueCsxNSkpOm0ubWlkQW5nbGU+CiszKk1hdGguUEkvMi11JiZtLm1pZEFuZ2xlPDMqTWF0aC5QSS8yK3UmJihoPShhLTErbi5sZW5ndGgpJW4ubGVuZ3RoLGg9bltoXSxyPW5bKGErMStuLmxlbmd0aCklbi5sZW5ndGhdLCJyaWdodCI9PT1tLmhlbWlzcGhlcmUmJiJsZWZ0Ij09PWguaGVtaXNwaGVyZSYmZDxoLmluZGV4TGFiZWxUZXh0QmxvY2sueD9kPWguaW5kZXhMYWJlbFRleHRCbG9jay54KzE1OiJsZWZ0Ij09PW0uaGVtaXNwaGVyZSYmKCJyaWdodCI9PT1yLmhlbWlzcGhlcmUmJmQ+ci5pbmRleExhYmVsVGV4dEJsb2NrLngpJiYoZD1yLmluZGV4TGFiZWxUZXh0QmxvY2sueC0xNSkpLG0uaW5kZXhMYWJlbFRleHRCbG9jay55PWssbS5pbmRleExhYmVsVGV4dEJsb2NrLng9ZCxtLmluZGV4TGFiZWxBbmdsZT1NYXRoLmF0YW4yKG0uaW5kZXhMYWJlbFRleHRCbG9jay55LXcueSxtLmluZGV4TGFiZWxUZXh0QmxvY2sueC13LngpKX1yZXR1cm4gY31mdW5jdGlvbiBrKCl7dmFyIGE9cC5wbG90QXJlYS5jdHg7YS5maWxsU3R5bGU9CisiZ3JleSI7YS5zdHJva2VTdHlsZT0iZ3JleSI7YS5mb250PSIxNnB4IEFyaWFsIjthLnRleHRCYXNlbGluZT0ibWlkZGxlIjtmb3IodmFyIGI9MCxjPWE9MCxhPTA7MTA+YSYmKDE+YXx8MDxjKTthKyspe3ktPWM7Yz0wO2lmKCJpbnNpZGUiIT09aC5pbmRleExhYmVsUGxhY2VtZW50KXt6PXkqdDtmb3IoYj0wO2I8bC5sZW5ndGg7YisrKXt2YXIgaz1uW2JdO2suaW5kZXhMYWJlbFRleHRCbG9jay54PXcueCt6Kk1hdGguY29zKGsubWlkQW5nbGUpO2suaW5kZXhMYWJlbFRleHRCbG9jay55PXcueSt6Kk1hdGguc2luKGsubWlkQW5nbGUpO2suaW5kZXhMYWJlbEFuZ2xlPWsubWlkQW5nbGU7ay5yYWRpdXM9eX1mb3IodmFyIHEsdSxiPTA7YjxsLmxlbmd0aDtiKyspe3ZhciBrPW5bYl0sQT1mKGIpO2lmKG51bGwhPT1BKXtxPW5bYl07dT1uW0FdO3ZhciBEPTAsRD1lKHEsdSktcztpZigwPkQpe2Zvcih2YXIgQz11PXE9MDtDPGwubGVuZ3RoO0MrKylDIT09YiYmbltDXS5oZW1pc3BoZXJlPT09CitrLmhlbWlzcGhlcmUmJihuW0NdLmluZGV4TGFiZWxUZXh0QmxvY2sueTxrLmluZGV4TGFiZWxUZXh0QmxvY2sueT9xKys6dSsrKTtDPUQvKHErdXx8MSkqdTtxPS0xKihELUMpO3ZhciBFPXU9MDsicmlnaHQiPT09ay5oZW1pc3BoZXJlPyh1PWcoYixDKSxxPS0xKihELXUpLEU9ZyhBLHEpLCtFLnRvRml4ZWQodik8K3EudG9GaXhlZCh2KSYmK3UudG9GaXhlZCh2KTw9K0MudG9GaXhlZCh2KSYmZyhiLC0ocS1FKSkpOih1PWcoQSxDKSxxPS0xKihELXUpLEU9ZyhiLHEpLCtFLnRvRml4ZWQodik8K3EudG9GaXhlZCh2KSYmK3UudG9GaXhlZCh2KTw9K0MudG9GaXhlZCh2KSYmZyhBLC0ocS1FKSkpfX19fWVsc2UgZm9yKGI9MDtiPGwubGVuZ3RoO2IrKylrPW5bYl0sej0icGllIj09PWgudHlwZT8wLjcqeTowLjgqeSxEPXcueCt6Kk1hdGguY29zKGsubWlkQW5nbGUpLEM9dy55K3oqTWF0aC5zaW4oay5taWRBbmdsZSksay5pbmRleExhYmVsVGV4dEJsb2NrLng9RCxrLmluZGV4TGFiZWxUZXh0QmxvY2sueT0KK0M7Zm9yKGI9MDtiPGwubGVuZ3RoO2IrKylrPW5bYl0sRD1rLmluZGV4TGFiZWxUZXh0QmxvY2subWVhc3VyZVRleHQoKSwwIT09RC5oZWlnaHQmJjAhPT1ELndpZHRoJiYoRD1EPTAsInJpZ2h0Ij09PWsuaGVtaXNwaGVyZT8oRD1tLngyLShrLmluZGV4TGFiZWxUZXh0QmxvY2sueCtrLmluZGV4TGFiZWxUZXh0QmxvY2sud2lkdGgrciksRCo9LTEpOkQ9bS54MS0oay5pbmRleExhYmVsVGV4dEJsb2NrLngtay5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoLXIpLDA8RCYmKE1hdGguYWJzKGsuaW5kZXhMYWJlbFRleHRCbG9jay55LWsuaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQvMi13LnkpPHl8fE1hdGguYWJzKGsuaW5kZXhMYWJlbFRleHRCbG9jay55K2suaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQvMi13LnkpPHkpJiYoRC89TWF0aC5hYnMoTWF0aC5jb3Moay5pbmRleExhYmVsQW5nbGUpKSw5PEQmJihEKj0wLjMpLEQ+YyYmKGM9RCkpLEQ9RD0wLDA8ay5pbmRleExhYmVsQW5nbGUmJgoray5pbmRleExhYmVsQW5nbGU8TWF0aC5QST8oRD1tLnkyLShrLmluZGV4TGFiZWxUZXh0QmxvY2sueStrLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LzIrNSksRCo9LTEpOkQ9bS55MS0oay5pbmRleExhYmVsVGV4dEJsb2NrLnktay5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodC8yLTUpLDA8RCYmTWF0aC5hYnMoay5pbmRleExhYmVsVGV4dEJsb2NrLngtdy54KTx5JiYoRC89TWF0aC5hYnMoTWF0aC5zaW4oay5pbmRleExhYmVsQW5nbGUpKSw5PEQmJihEKj0wLjMpLEQ+YyYmKGM9RCkpKTtiPWZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9W10sZT0wO2QucHVzaChuW2JdKSxiIT09YztiPShiKzErbC5sZW5ndGgpJWwubGVuZ3RoKTtkLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS55LWIueX0pO2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspaWYoYz1kW2JdLGU8YSllKz1jLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0LGMuaW5kZXhMYWJlbFRleHRCbG9jay50ZXh0PSIiLGMuaW5kZXhMYWJlbFRleHQ9CisiIixjLmluZGV4TGFiZWxUZXh0QmxvY2subWVhc3VyZVRleHQoKTtlbHNlIGJyZWFrfTtBPWs9LTE7Zm9yKEM9RT0wO0M8bC5sZW5ndGg7QysrKWlmKHE9bltDXSxxLmluZGV4TGFiZWxUZXh0KXt2YXIgRj1mKEMpO251bGwhPT1GJiYodT1uW0ZdLEQ9MCxEPWUocSx1KSwwPkQmJmQocSx1KT8oMD5rJiYoaz1DKSxGIT09ayYmKEE9RiksRSs9LUQpOjA8RSYmKGIoRSxrLEEpLEE9az0tMSxFPTApKX0wPEUmJmIoRSxrLEEpfX12YXIgcD10aGlzO2lmKCEoMD49YS5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGgpKXtmb3IodmFyIGg9dGhpcy5kYXRhW2EuZGF0YVNlcmllc0luZGV4ZXNbMF1dLGw9aC5kYXRhUG9pbnRzLHI9MTAsbT10aGlzLnBsb3RBcmVhLHE9MCxuPVtdLHM9Mix0PTEuMyx1PTIwLzE4MCpNYXRoLlBJLHY9Nix3PXt4OihtLngyK20ueDEpLzIseToobS55MittLnkxKS8yfSx5PSJpbnNpZGUiPT09aC5pbmRleExhYmVsUGxhY2VtZW50PzAuOTIqTWF0aC5taW4obS53aWR0aCwKK20uaGVpZ2h0KS8yOjAuOCpNYXRoLm1pbihtLndpZHRoLG0uaGVpZ2h0KS8yLHo9eSp0LEM9MCxBPTA7QTxsLmxlbmd0aDtBKyspQys9TWF0aC5hYnMobFtBXS55KTswIT09QyYmKHRoaXMucGllRG91Z2hudXRDbGlja0hhbmRsZXI9ZnVuY3Rpb24oYSl7cC5pc0FuaW1hdGluZ3x8KGE9YS5kYXRhUG9pbnQsYS5leHBsb2RlZD1hLmV4cGxvZGVkPyExOiEwLDE8dGhpcy5kYXRhUG9pbnRzLmxlbmd0aCYmcC5fYW5pbWF0b3IuYW5pbWF0ZSgwLDUwMCxmdW5jdGlvbihhKXtjKGEpfSkpfSxiKCksaygpLHRoaXMuZGlzYWJsZVRvb2xUaXA9ITAsdGhpcy5fYW5pbWF0b3IuYW5pbWF0ZSgwLHRoaXMuYW5pbWF0ZWRSZW5kZXI/dGhpcy5hbmltYXRpb25EdXJhdGlvbjowLGZ1bmN0aW9uKGEpe3ZhciBiPXAucGxvdEFyZWEuY3R4O2IuY2xlYXJSZWN0KG0ueDEsbS55MSxtLndpZHRoLG0uaGVpZ2h0KTtiLmZpbGxTdHlsZT1wLmJhY2tncm91bmRDb2xvcjtiLmZpbGxSZWN0KG0ueDEsbS55MSxtLndpZHRoLAorbS5oZWlnaHQpO2E9blswXS5zdGFydEFuZ2xlKzIqTWF0aC5QSSphO2ZvcihiPTA7YjxsLmxlbmd0aDtiKyspe3ZhciBjPTA9PT1iP25bYl0uc3RhcnRBbmdsZTpkLGQ9YysobltiXS5lbmRBbmdsZS1uW2JdLnN0YXJ0QW5nbGUpLGU9ITE7ZD5hJiYoZD1hLGU9ITApO3ZhciBmPWxbYl0uY29sb3I/bFtiXS5jb2xvcjpoLl9jb2xvclNldFtiJWguX2NvbG9yU2V0Lmxlbmd0aF07ZD5jJiZwYShwLnBsb3RBcmVhLmN0eCxuW2JdLmNlbnRlcixuW2JdLnJhZGl1cyxmLGgudHlwZSxjLGQsaC5maWxsT3BhY2l0eSk7aWYoZSlicmVha319LGZ1bmN0aW9uKCl7cC5kaXNhYmxlVG9vbFRpcD0hMTtwLl9hbmltYXRvci5hbmltYXRlKDAscC5hbmltYXRlZFJlbmRlcj81MDA6MCxmdW5jdGlvbihhKXtjKGEpfSl9KSl9fTt2LnByb3RvdHlwZS5hbmltYXRpb25SZXF1ZXN0SWQ9bnVsbDt2LnByb3RvdHlwZS5yZXF1ZXN0QW5pbUZyYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fAord2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoYSwxRTMvNjApfX0oKTt2LnByb3RvdHlwZS5jYW5jZWxSZXF1ZXN0QW5pbUZyYW1lPXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdENhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1vekNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm9DYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc0NhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZXx8Y2xlYXJUaW1lb3V0O2FhLnByb3RvdHlwZS5yZWdpc3RlclNwYWNlPWZ1bmN0aW9uKGEsYil7InRvcCI9PT1hP3RoaXMuX3RvcE9jY3VwaWVkKz1iLmhlaWdodDoiYm90dG9tIj09PWE/Cit0aGlzLl9ib3R0b21PY2N1cGllZCs9Yi5oZWlnaHQ6ImxlZnQiPT09YT90aGlzLl9sZWZ0T2NjdXBpZWQrPWIud2lkdGg6InJpZ2h0Ij09PWEmJih0aGlzLl9yaWdodE9jY3VwaWVkKz1iLndpZHRoKX07YWEucHJvdG90eXBlLnVuUmVnaXN0ZXJTcGFjZT1mdW5jdGlvbihhLGIpeyJ0b3AiPT09YT90aGlzLl90b3BPY2N1cGllZC09Yi5oZWlnaHQ6ImJvdHRvbSI9PT1hP3RoaXMuX2JvdHRvbU9jY3VwaWVkLT1iLmhlaWdodDoibGVmdCI9PT1hP3RoaXMuX2xlZnRPY2N1cGllZC09Yi53aWR0aDoicmlnaHQiPT09YSYmKHRoaXMuX3JpZ2h0T2NjdXBpZWQtPWIud2lkdGgpfTthYS5wcm90b3R5cGUuZ2V0RnJlZVNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJue3gxOnRoaXMuX2xlZnRPY2N1cGllZCx5MTp0aGlzLl90b3BPY2N1cGllZCx4Mjp0aGlzLmNoYXJ0LndpZHRoLXRoaXMuX3JpZ2h0T2NjdXBpZWQseTI6dGhpcy5jaGFydC5oZWlnaHQtdGhpcy5fYm90dG9tT2NjdXBpZWQsd2lkdGg6dGhpcy5jaGFydC53aWR0aC0KK3RoaXMuX3JpZ2h0T2NjdXBpZWQtdGhpcy5fbGVmdE9jY3VwaWVkLGhlaWdodDp0aGlzLmNoYXJ0LmhlaWdodC10aGlzLl9ib3R0b21PY2N1cGllZC10aGlzLl90b3BPY2N1cGllZH19O2FhLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX3RvcE9jY3VwaWVkPTA7dGhpcy5fYm90dG9tT2NjdXBpZWQ9Mzt0aGlzLl9yaWdodE9jY3VwaWVkPXRoaXMuX2xlZnRPY2N1cGllZD0wfTtPKEksTCk7SS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe2EmJnRoaXMuY3R4LnNhdmUoKTt2YXIgYj10aGlzLmN0eC5mb250O3RoaXMuY3R4LnRleHRCYXNlbGluZT10aGlzLnRleHRCYXNlbGluZTt2YXIgYz0wO3RoaXMuX2lzRGlydHkmJnRoaXMubWVhc3VyZVRleHQodGhpcy5jdHgpO3RoaXMuY3R4LnRyYW5zbGF0ZSh0aGlzLngsdGhpcy55K2MpOyJtaWRkbGUiPT09dGhpcy50ZXh0QmFzZWxpbmUmJihjPS10aGlzLl9saW5lSGVpZ2h0LzIpO3RoaXMuY3R4LmZvbnQ9dGhpcy5fZ2V0Rm9udFN0cmluZygpOwordGhpcy5jdHgucm90YXRlKE1hdGguUEkvMTgwKnRoaXMuYW5nbGUpO3ZhciBkPTAsZT10aGlzLnBhZGRpbmcsZj1udWxsOygwPHRoaXMuYm9yZGVyVGhpY2tuZXNzJiZ0aGlzLmJvcmRlckNvbG9yfHx0aGlzLmJhY2tncm91bmRDb2xvcikmJnRoaXMuY3R4LnJvdW5kUmVjdCgwLGMsdGhpcy53aWR0aCx0aGlzLmhlaWdodCx0aGlzLmNvcm5lclJhZGl1cyx0aGlzLmJvcmRlclRoaWNrbmVzcyx0aGlzLmJhY2tncm91bmRDb2xvcix0aGlzLmJvcmRlckNvbG9yKTt0aGlzLmN0eC5maWxsU3R5bGU9dGhpcy5mb250Q29sb3I7Zm9yKGM9MDtjPHRoaXMuX3dyYXBwZWRUZXh0LmxpbmVzLmxlbmd0aDtjKyspZj10aGlzLl93cmFwcGVkVGV4dC5saW5lc1tjXSwicmlnaHQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24/ZD10aGlzLndpZHRoLWYud2lkdGgtdGhpcy5wYWRkaW5nOiJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduP2Q9dGhpcy5wYWRkaW5nOiJjZW50ZXIiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24mJgorKGQ9KHRoaXMud2lkdGgtMip0aGlzLnBhZGRpbmcpLzItZi53aWR0aC8yK3RoaXMucGFkZGluZyksdGhpcy5jdHguZmlsbFRleHQoZi50ZXh0LGQsZSksZSs9Zi5oZWlnaHQ7dGhpcy5jdHguZm9udD1iO2EmJnRoaXMuY3R4LnJlc3RvcmUoKX07SS5wcm90b3R5cGUuc2V0VGV4dD1mdW5jdGlvbihhKXt0aGlzLnRleHQ9YTt0aGlzLl9pc0RpcnR5PSEwO3RoaXMuX3dyYXBwZWRUZXh0PW51bGx9O0kucHJvdG90eXBlLm1lYXN1cmVUZXh0PWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMubWF4V2lkdGgpdGhyb3ciUGxlYXNlIHNldCBtYXhXaWR0aCBhbmQgaGVpZ2h0IGZvciBUZXh0QmxvY2siO3RoaXMuX3dyYXBUZXh0KHRoaXMuY3R4KTt0aGlzLl9pc0RpcnR5PSExO3JldHVybnt3aWR0aDp0aGlzLndpZHRoLGhlaWdodDp0aGlzLmhlaWdodH19O0kucHJvdG90eXBlLl9nZXRMaW5lV2l0aFdpZHRoPWZ1bmN0aW9uKGEsYixjKXthPVN0cmluZyhhKTtpZighYSlyZXR1cm57dGV4dDoiIix3aWR0aDowfTsKK3ZhciBkPWM9MCxlPWEubGVuZ3RoLTEsZj1JbmZpbml0eTtmb3IodGhpcy5jdHguZm9udD10aGlzLl9nZXRGb250U3RyaW5nKCk7ZDw9ZTspe3ZhciBmPU1hdGguZmxvb3IoKGQrZSkvMiksZz1hLnN1YnN0cigwLGYrMSk7Yz10aGlzLmN0eC5tZWFzdXJlVGV4dChnKS53aWR0aDtpZihjPGIpZD1mKzE7ZWxzZSBpZihjPmIpZT1mLTE7ZWxzZSBicmVha31jPmImJjE8Zy5sZW5ndGgmJihnPWcuc3Vic3RyKDAsZy5sZW5ndGgtMSksYz10aGlzLmN0eC5tZWFzdXJlVGV4dChnKS53aWR0aCk7Yj0hMDtpZihnLmxlbmd0aD09PWEubGVuZ3RofHwiICI9PT1hW2cubGVuZ3RoXSliPSExO2ImJihhPWcuc3BsaXQoIiAiKSwxPGEubGVuZ3RoJiZhLnBvcCgpLGc9YS5qb2luKCIgIiksYz10aGlzLmN0eC5tZWFzdXJlVGV4dChnKS53aWR0aCk7cmV0dXJue3RleHQ6Zyx3aWR0aDpjfX07SS5wcm90b3R5cGUuX3dyYXBUZXh0PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IFN0cmluZyhaKHRoaXMudGV4dCkpLAorYj1bXSxjPXRoaXMuY3R4LmZvbnQsZD0wLGU9MDtmb3IodGhpcy5jdHguZm9udD10aGlzLl9nZXRGb250U3RyaW5nKCk7MDxhLmxlbmd0aDspe3ZhciBmPXRoaXMubWF4SGVpZ2h0LTIqdGhpcy5wYWRkaW5nLGc9dGhpcy5fZ2V0TGluZVdpdGhXaWR0aChhLHRoaXMubWF4V2lkdGgtMip0aGlzLnBhZGRpbmcsITEpO2cuaGVpZ2h0PXRoaXMuX2xpbmVIZWlnaHQ7Yi5wdXNoKGcpO2U9TWF0aC5tYXgoZSxnLndpZHRoKTtkKz1nLmhlaWdodDthPVooYS5zbGljZShnLnRleHQubGVuZ3RoLGEubGVuZ3RoKSk7ZiYmZD5mJiYoZz1iLnBvcCgpLGQtPWcuaGVpZ2h0KX10aGlzLl93cmFwcGVkVGV4dD17bGluZXM6Yix3aWR0aDplLGhlaWdodDpkfTt0aGlzLndpZHRoPWUrMip0aGlzLnBhZGRpbmc7dGhpcy5oZWlnaHQ9ZCsyKnRoaXMucGFkZGluZzt0aGlzLmN0eC5mb250PWN9O0kucHJvdG90eXBlLl9nZXRGb250U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHVhKCIiLHRoaXMsbnVsbCl9O08oYmEsCitMKTtiYS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7aWYodGhpcy50ZXh0KXt2YXIgYT10aGlzLmNoYXJ0LmxheW91dE1hbmFnZXIuZ2V0RnJlZVNwYWNlKCksYj0wLGM9MCxkPTAsZT0wLGY9MCxnLGs7InRvcCI9PT10aGlzLnZlcnRpY2FsQWxpZ258fCJib3R0b20iPT09dGhpcy52ZXJ0aWNhbEFsaWduPyhlPWEud2lkdGgtMip0aGlzLm1hcmdpbixmPTAuNSphLmhlaWdodC0yKnRoaXMubWFyZ2luLGQ9MCk6ImNlbnRlciI9PT10aGlzLnZlcnRpY2FsQWxpZ24mJigibGVmdCI9PT10aGlzLmhvcml6b250YWxBbGlnbnx8InJpZ2h0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduPyhlPWEuaGVpZ2h0LTIqdGhpcy5tYXJnaW4sZj0wLjUqYS53aWR0aC0yKnRoaXMubWFyZ2luKToiY2VudGVyIj09PXRoaXMuaG9yaXpvbnRhbEFsaWduJiYoZT1hLndpZHRoLTIqdGhpcy5tYXJnaW4sZj0wLjUqYS5oZWlnaHQtMip0aGlzLm1hcmdpbikpO3ZhciBmPW5ldyBJKHRoaXMuY3R4LHtmb250U2l6ZTp0aGlzLmZvbnRTaXplLAorZm9udEZhbWlseTp0aGlzLmZvbnRGYW1pbHksZm9udENvbG9yOnRoaXMuZm9udENvbG9yLGZvbnRTdHlsZTp0aGlzLmZvbnRTdHlsZSxmb250V2VpZ2h0OnRoaXMuZm9udFdlaWdodCxob3Jpem9udGFsQWxpZ246dGhpcy5ob3Jpem9udGFsQWxpZ24sdmVydGljYWxBbGlnbjp0aGlzLnZlcnRpY2FsQWxpZ24sYm9yZGVyQ29sb3I6dGhpcy5ib3JkZXJDb2xvcixib3JkZXJUaGlja25lc3M6dGhpcy5ib3JkZXJUaGlja25lc3MsYmFja2dyb3VuZENvbG9yOnRoaXMuYmFja2dyb3VuZENvbG9yLG1heFdpZHRoOmUsbWF4SGVpZ2h0OmYsY29ybmVyUmFkaXVzOnRoaXMuY29ybmVyUmFkaXVzLHRleHQ6dGhpcy50ZXh0LHBhZGRpbmc6dGhpcy5wYWRkaW5nLHRleHRCYXNlbGluZToidG9wIn0pLHA9Zi5tZWFzdXJlVGV4dCgpOyJ0b3AiPT09dGhpcy52ZXJ0aWNhbEFsaWdufHwiYm90dG9tIj09PXRoaXMudmVydGljYWxBbGlnbj8oInRvcCI9PT10aGlzLnZlcnRpY2FsQWxpZ24/KGM9dGhpcy5tYXJnaW4sCitrPSJ0b3AiKToiYm90dG9tIj09PXRoaXMudmVydGljYWxBbGlnbiYmKGM9YS55Mi10aGlzLm1hcmdpbi1wLmhlaWdodCxrPSJib3R0b20iKSwibGVmdCI9PT10aGlzLmhvcml6b250YWxBbGlnbj9iPWEueDErdGhpcy5tYXJnaW46ImNlbnRlciI9PT10aGlzLmhvcml6b250YWxBbGlnbj9iPWEueDErKGUvMi1wLndpZHRoLzIpK3RoaXMubWFyZ2luOiJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbiYmKGI9YS54Mi10aGlzLm1hcmdpbi1wLndpZHRoKSxnPXRoaXMuaG9yaXpvbnRhbEFsaWduLHRoaXMud2lkdGg9cC53aWR0aCx0aGlzLmhlaWdodD1wLmhlaWdodCk6ImNlbnRlciI9PT10aGlzLnZlcnRpY2FsQWxpZ24mJigibGVmdCI9PT10aGlzLmhvcml6b250YWxBbGlnbj8oYj1hLngxK3RoaXMubWFyZ2luLGM9YS55Mi10aGlzLm1hcmdpbi0oZS8yLXAud2lkdGgvMiksZD0tOTAsaz0ibGVmdCIsdGhpcy53aWR0aD1wLmhlaWdodCx0aGlzLmhlaWdodD1wLndpZHRoKToicmlnaHQiPT09Cit0aGlzLmhvcml6b250YWxBbGlnbj8oYj1hLngyLXRoaXMubWFyZ2luLGM9YS55MSt0aGlzLm1hcmdpbisoZS8yLXAud2lkdGgvMiksZD05MCxrPSJyaWdodCIsdGhpcy53aWR0aD1wLmhlaWdodCx0aGlzLmhlaWdodD1wLndpZHRoKToiY2VudGVyIj09PXRoaXMuaG9yaXpvbnRhbEFsaWduJiYoYz1hLnkxKyhhLmhlaWdodC8yLXAuaGVpZ2h0LzIpLGI9YS54MSsoYS53aWR0aC8yLXAud2lkdGgvMiksaz0iY2VudGVyIix0aGlzLndpZHRoPXAud2lkdGgsdGhpcy5oZWlnaHQ9cC5oZWlnaHQpLGc9ImNlbnRlciIpO2YueD1iO2YueT1jO2YuYW5nbGU9ZDtmLmhvcml6b250YWxBbGlnbj1nO2YucmVuZGVyKCEwKTt0aGlzLmNoYXJ0LmxheW91dE1hbmFnZXIucmVnaXN0ZXJTcGFjZShrLHt3aWR0aDp0aGlzLndpZHRoKzIqdGhpcy5tYXJnaW4saGVpZ2h0OnRoaXMuaGVpZ2h0KzIqdGhpcy5tYXJnaW59KTt0aGlzLmJvdW5kcz17eDE6Yix5MTpjLHgyOmIrdGhpcy53aWR0aCx5MjpjK3RoaXMuaGVpZ2h0fTsKK3RoaXMuY3R4LnRleHRCYXNlbGluZT0idG9wIn19O08oZ2EsTCk7Z2EucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKSxiPW51bGwsYz0wLGQ9MCxlPTAsZj0wLGc9W10saz1bXTsidG9wIj09PXRoaXMudmVydGljYWxBbGlnbnx8ImJvdHRvbSI9PT10aGlzLnZlcnRpY2FsQWxpZ24/KHRoaXMub3JpZW50YXRpb249Imhvcml6b250YWwiLGI9dGhpcy52ZXJ0aWNhbEFsaWduLGU9MC45KmEud2lkdGgsZj0wLjUqYS5oZWlnaHQpOiJjZW50ZXIiPT09dGhpcy52ZXJ0aWNhbEFsaWduJiYodGhpcy5vcmllbnRhdGlvbj0idmVydGljYWwiLGI9dGhpcy5ob3Jpem9udGFsQWxpZ24sZT0wLjUqYS53aWR0aCxmPTAuOSphLmhlaWdodCk7Zm9yKHZhciBwPTA7cDx0aGlzLmRhdGFTZXJpZXMubGVuZ3RoO3ArKyl7dmFyIGg9dGhpcy5kYXRhU2VyaWVzW3BdLGw9aC5sZWdlbmRNYXJrZXJUeXBlP2gubGVnZW5kTWFya2VyVHlwZToKKyJsaW5lIiE9PWgudHlwZSYmInN0ZXBMaW5lIiE9PWgudHlwZSYmInNwbGluZSIhPT1oLnR5cGUmJiJzY2F0dGVyIiE9PWgudHlwZSYmImJ1YmJsZSIhPT1oLnR5cGV8fCFoLm1hcmtlclR5cGU/UC5nZXREZWZhdWx0TGVnZW5kTWFya2VyKGgudHlwZSk6aC5tYXJrZXJUeXBlLHI9aC5sZWdlbmRUZXh0P2gubGVnZW5kVGV4dDpoLm5hbWUsbT1oLmxlZ2VuZE1hcmtlckNvbG9yP2gubGVnZW5kTWFya2VyQ29sb3I6aC5tYXJrZXJDb2xvcj9oLm1hcmtlckNvbG9yOmguX2NvbG9yU2V0WzBdLHE9aC5tYXJrZXJTaXplfHwibGluZSIhPT1oLnR5cGUmJiJzdGVwTGluZSIhPT1oLnR5cGUmJiJzcGxpbmUiIT09aC50eXBlPzAuNip0aGlzLmxpbmVIZWlnaHQ6MCxuPWgubGVnZW5kTWFya2VyQm9yZGVyQ29sb3I/aC5sZWdlbmRNYXJrZXJCb3JkZXJDb2xvcjpoLm1hcmtlckJvcmRlckNvbG9yLHM9aC5sZWdlbmRNYXJrZXJCb3JkZXJUaGlja25lc3M/aC5sZWdlbmRNYXJrZXJCb3JkZXJUaGlja25lc3M6CitoLm1hcmtlckJvcmRlclRoaWNrbmVzcz9NYXRoLm1heCgxLE1hdGgucm91bmQoMC4yKnEpKTowO2lmKCJwaWUiIT09aC50eXBlJiYiZG91Z2hudXQiIT09aC50eXBlJiYiZnVubmVsIiE9PWgudHlwZSlsPXttYXJrZXJUeXBlOmwsbWFya2VyQ29sb3I6bSx0ZXh0OnIsdGV4dEJsb2NrOm51bGwsY2hhcnRUeXBlOmgudHlwZSxtYXJrZXJTaXplOnEsbGluZUNvbG9yOmguX2NvbG9yU2V0WzBdLGRhdGFTZXJpZXNJbmRleDpoLmluZGV4LGRhdGFQb2ludEluZGV4Om51bGwsbWFya2VyQm9yZGVyQ29sb3I6bixtYXJrZXJCb3JkZXJUaGlja25lc3M6c30sZy5wdXNoKGwpO2Vsc2UgZm9yKHZhciB0PTA7dDxoLmRhdGFQb2ludHMubGVuZ3RoO3QrKylzPWguZGF0YVBvaW50c1t0XSxsPXMubGVnZW5kTWFya2VyVHlwZT9zLmxlZ2VuZE1hcmtlclR5cGU6aC5sZWdlbmRNYXJrZXJUeXBlP2gubGVnZW5kTWFya2VyVHlwZTpQLmdldERlZmF1bHRMZWdlbmRNYXJrZXIoaC50eXBlKSxyPXMubGVnZW5kVGV4dD8KK3MubGVnZW5kVGV4dDpoLmxlZ2VuZFRleHQ/aC5sZWdlbmRUZXh0OnMubmFtZT9zLm5hbWU6IkRhdGFQb2ludDogIisodCsxKSxtPXMubGVnZW5kTWFya2VyQ29sb3I/cy5sZWdlbmRNYXJrZXJDb2xvcjpoLmxlZ2VuZE1hcmtlckNvbG9yP2gubGVnZW5kTWFya2VyQ29sb3I6cy5jb2xvcj9zLmNvbG9yOmguY29sb3I/aC5jb2xvcjpoLl9jb2xvclNldFt0JWguX2NvbG9yU2V0Lmxlbmd0aF0scT0wPT09cy5tYXJrZXJTaXplfHwwPT09aC5tYXJrZXJTaXplJiYhcy5tYXJrZXJTaXplPzA6MC42KnRoaXMubGluZUhlaWdodCxuPXMubGVnZW5kTWFya2VyQm9yZGVyQ29sb3I/cy5sZWdlbmRNYXJrZXJCb3JkZXJDb2xvcjpoLmxlZ2VuZE1hcmtlckJvcmRlckNvbG9yP2gubGVnZW5kTWFya2VyQm9yZGVyQ29sb3I6cy5tYXJrZXJCb3JkZXJDb2xvcj9zLm1hcmtlckJvcmRlckNvbG9yOmgubWFya2VyQm9yZGVyQ29sb3Iscz1zLmxlZ2VuZE1hcmtlckJvcmRlclRoaWNrbmVzcz9zLmxlZ2VuZE1hcmtlckJvcmRlclRoaWNrbmVzczoKK2gubGVnZW5kTWFya2VyQm9yZGVyVGhpY2tuZXNzP2gubGVnZW5kTWFya2VyQm9yZGVyVGhpY2tuZXNzOnMubWFya2VyQm9yZGVyVGhpY2tuZXNzfHxoLm1hcmtlckJvcmRlclRoaWNrbmVzcz9NYXRoLm1heCgxLE1hdGgucm91bmQoMC4yKnEpKTowLGw9e21hcmtlclR5cGU6bCxtYXJrZXJDb2xvcjptLHRleHQ6cix0ZXh0QmxvY2s6bnVsbCxjaGFydFR5cGU6aC50eXBlLG1hcmtlclNpemU6cSxkYXRhU2VyaWVzSW5kZXg6cCxkYXRhUG9pbnRJbmRleDp0LG1hcmtlckJvcmRlckNvbG9yOm4sbWFya2VyQm9yZGVyVGhpY2tuZXNzOnN9LGcucHVzaChsKX1pZigwPGcubGVuZ3RoKXtoPW51bGw7Zm9yKHA9dD0wO3A8Zy5sZW5ndGg7cCsrKXtsPWdbcF07aWYoImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbil7bC50ZXh0QmxvY2s9bmV3IEkodGhpcy5jdHgse3g6MCx5OjAsbWF4V2lkdGg6ZSxtYXhIZWlnaHQ6dGhpcy5saW5lSGVpZ2h0LGFuZ2xlOjAsdGV4dDpsLnRleHQsaG9yaXpvbnRhbEFsaWduOiJsZWZ0IiwKK2ZvbnRTaXplOnRoaXMuZm9udFNpemUsZm9udEZhbWlseTp0aGlzLmZvbnRGYW1pbHksZm9udFdlaWdodDp0aGlzLmZvbnRXZWlnaHQsZm9udENvbG9yOnRoaXMuZm9udENvbG9yLGZvbnRTdHlsZTp0aGlzLmZvbnRTdHlsZSx0ZXh0QmFzZWxpbmU6InRvcCJ9KTtsLnRleHRCbG9jay5tZWFzdXJlVGV4dCgpO2lmKCFofHxoLndpZHRoK2wudGV4dEJsb2NrLndpZHRoKygwPT09aC53aWR0aD8wOnRoaXMuaG9yaXpvbnRhbFNwYWNpbmcpPmUpaD17aXRlbXM6W10sd2lkdGg6MH0say5wdXNoKGgpLHRoaXMuaGVpZ2h0PWsubGVuZ3RoKihsLnRleHRCbG9jay5oZWlnaHQrNSk7bC50ZXh0QmxvY2sueD1oLndpZHRoO2wudGV4dEJsb2NrLnk9MDtoLndpZHRoKz1NYXRoLnJvdW5kKGwudGV4dEJsb2NrLndpZHRoK2wudGV4dEJsb2NrLl9saW5lSGVpZ2h0KygwPT09aC53aWR0aD8wOjAuNSpsLnRleHRCbG9jay5fbGluZUhlaWdodCkpfWVsc2UgdGhpcy5oZWlnaHQrdGhpcy5saW5lSGVpZ2h0PAorZj8oaD17aXRlbXM6W10sd2lkdGg6MH0say5wdXNoKGgpLHRoaXMuaGVpZ2h0PWsubGVuZ3RoKnRoaXMubGluZUhlaWdodCk6KGg9a1t0XSx0PSh0KzEpJWsubGVuZ3RoKSxsLnRleHRCbG9jaz1uZXcgSSh0aGlzLmN0eCx7eDowLHk6MCxtYXhXaWR0aDplLG1heEhlaWdodDoxLjUqdGhpcy5mb250U2l6ZSxhbmdsZTowLHRleHQ6bC50ZXh0LGhvcml6b250YWxBbGlnbjoibGVmdCIsZm9udFNpemU6dGhpcy5mb250U2l6ZSxmb250RmFtaWx5OnRoaXMuZm9udEZhbWlseSxmb250V2VpZ2h0OnRoaXMuZm9udFdlaWdodCxmb250Q29sb3I6dGhpcy5mb250Q29sb3IsZm9udFN0eWxlOnRoaXMuZm9udFN0eWxlLHRleHRCYXNlbGluZToidG9wIn0pLGwudGV4dEJsb2NrLm1lYXN1cmVUZXh0KCksbC50ZXh0QmxvY2sueD1oLndpZHRoLGwudGV4dEJsb2NrLnk9MCxoLndpZHRoKz1sLnRleHRCbG9jay53aWR0aCtsLnRleHRCbG9jay5fbGluZUhlaWdodCsoMD09PWgud2lkdGg/MDowLjUqbC50ZXh0QmxvY2suX2xpbmVIZWlnaHQpOworaC5pdGVtcy5wdXNoKGwpO3RoaXMud2lkdGg9TWF0aC5tYXgoaC53aWR0aCx0aGlzLndpZHRoKX10aGlzLmhlaWdodD1rLmxlbmd0aCp0aGlzLmxpbmVIZWlnaHR9InRvcCI9PT10aGlzLnZlcnRpY2FsQWxpZ24/KGQ9ImxlZnQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24/YS54MSsyOiJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbj9hLngyLXRoaXMud2lkdGgtMjphLngxK2Eud2lkdGgvMi10aGlzLndpZHRoLzIsYz1hLnkxKToiY2VudGVyIj09PXRoaXMudmVydGljYWxBbGlnbj8oZD0ibGVmdCI9PT10aGlzLmhvcml6b250YWxBbGlnbj9hLngxKzI6InJpZ2h0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduP2EueDItdGhpcy53aWR0aC0yOmEueDErYS53aWR0aC8yLXRoaXMud2lkdGgvMixjPWEueTErYS5oZWlnaHQvMi10aGlzLmhlaWdodC8yKToiYm90dG9tIj09PXRoaXMudmVydGljYWxBbGlnbiYmKGQ9ImxlZnQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24/YS54MSsyOiJyaWdodCI9PT0KK3RoaXMuaG9yaXpvbnRhbEFsaWduP2EueDItdGhpcy53aWR0aC0yOmEueDErYS53aWR0aC8yLXRoaXMud2lkdGgvMixjPWEueTItdGhpcy5oZWlnaHQtNSk7dGhpcy5pdGVtcz1nO2ZvcihwPTA7cDx0aGlzLml0ZW1zLmxlbmd0aDtwKyspbD1nW3BdLGwuaWQ9Kyt0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIubGFzdE9iamVjdElkLHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbbC5pZF09e2lkOmwuaWQsb2JqZWN0VHlwZToibGVnZW5kSXRlbSIsbGVnZW5kSXRlbUluZGV4OnAsZGF0YVNlcmllc0luZGV4OmwuZGF0YVNlcmllc0luZGV4LGRhdGFQb2ludEluZGV4OmwuZGF0YVBvaW50SW5kZXh9O2ZvcihwPTA7cDxrLmxlbmd0aDtwKyspZm9yKGg9a1twXSxhPTA7YTxoLml0ZW1zLmxlbmd0aDthKyspe2w9aC5pdGVtc1thXTtmPWwudGV4dEJsb2NrLngrZCsoMD09PWE/MC4yKmwubWFya2VyU2l6ZTowLjQqdGhpcy5saW5lSGVpZ2h0KzAuMipsLm1hcmtlclNpemUpO2c9YysKK3AqdGhpcy5saW5lSGVpZ2h0O2U9Zjt0aGlzLmNoYXJ0LmRhdGFbbC5kYXRhU2VyaWVzSW5kZXhdLnZpc2libGV8fCh0aGlzLmN0eC5nbG9iYWxBbHBoYT0wLjUpO2lmKCJsaW5lIj09PWwuY2hhcnRUeXBlfHwic3RlcExpbmUiPT09bC5jaGFydFR5cGV8fCJzcGxpbmUiPT09bC5jaGFydFR5cGUpdGhpcy5jdHguc3Ryb2tlU3R5bGU9bC5saW5lQ29sb3IsdGhpcy5jdHgubGluZVdpZHRoPU1hdGguY2VpbCh0aGlzLmxpbmVIZWlnaHQvOCksdGhpcy5jdHguYmVnaW5QYXRoKCksdGhpcy5jdHgubW92ZVRvKGYtMC4xKnRoaXMubGluZUhlaWdodCxnK3RoaXMubGluZUhlaWdodC8yKSx0aGlzLmN0eC5saW5lVG8oZiswLjcqdGhpcy5saW5lSGVpZ2h0LGcrdGhpcy5saW5lSGVpZ2h0LzIpLHRoaXMuY3R4LnN0cm9rZSgpLGUtPTAuMSp0aGlzLmxpbmVIZWlnaHQ7Si5kcmF3TWFya2VyKGYrbC5tYXJrZXJTaXplLzIsZyt0aGlzLmxpbmVIZWlnaHQvMix0aGlzLmN0eCxsLm1hcmtlclR5cGUsbC5tYXJrZXJTaXplLAorbC5tYXJrZXJDb2xvcixsLm1hcmtlckJvcmRlckNvbG9yLGwubWFya2VyQm9yZGVyVGhpY2tuZXNzKTtsLnRleHRCbG9jay54PWYrTWF0aC5yb3VuZCgwLjkqdGhpcy5saW5lSGVpZ2h0KTtsLnRleHRCbG9jay55PWc7bC50ZXh0QmxvY2sucmVuZGVyKCEwKTt0aGlzLmNoYXJ0LmRhdGFbbC5kYXRhU2VyaWVzSW5kZXhdLnZpc2libGV8fCh0aGlzLmN0eC5nbG9iYWxBbHBoYT0xKTtmPUMobC5pZCk7dGhpcy5naG9zdEN0eC5maWxsU3R5bGU9Zjt0aGlzLmdob3N0Q3R4LmJlZ2luUGF0aCgpO3RoaXMuZ2hvc3RDdHguZmlsbFJlY3QoZSxsLnRleHRCbG9jay55LGwudGV4dEJsb2NrLngrbC50ZXh0QmxvY2sud2lkdGgtZSxsLnRleHRCbG9jay5oZWlnaHQpO2wueDE9dGhpcy5jaGFydC5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtsLmlkXS54MT1lO2wueTE9dGhpcy5jaGFydC5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtsLmlkXS55MT1sLnRleHRCbG9jay55O2wueDI9dGhpcy5jaGFydC5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtsLmlkXS54Mj0KK2wudGV4dEJsb2NrLngrbC50ZXh0QmxvY2sud2lkdGg7bC55Mj10aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2wuaWRdLnkyPWwudGV4dEJsb2NrLnkrbC50ZXh0QmxvY2suaGVpZ2h0fXRoaXMuY2hhcnQubGF5b3V0TWFuYWdlci5yZWdpc3RlclNwYWNlKGIse3dpZHRoOnRoaXMud2lkdGgrMisyLGhlaWdodDp0aGlzLmhlaWdodCs1KzV9KTt0aGlzLmJvdW5kcz17eDE6ZCx5MTpjLHgyOmQrdGhpcy53aWR0aCx5MjpjK3RoaXMuaGVpZ2h0fX07TyhsYSxMKTtsYS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydC5sYXlvdXRNYW5hZ2VyLmdldEZyZWVTcGFjZSgpO3RoaXMuY3R4LmZpbGxTdHlsZT0icmVkIjt0aGlzLmN0eC5maWxsUmVjdChhLngxLGEueTEsYS54MixhLnkyKX07TyhQLEwpO1AucHJvdG90eXBlLmdldERlZmF1bHRBeGlzUGxhY2VtZW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO2lmKCJjb2x1bW4iPT09YXx8ImxpbmUiPT09CithfHwic3RlcExpbmUiPT09YXx8InNwbGluZSI9PT1hfHwiYXJlYSI9PT1hfHwic3RlcEFyZWEiPT09YXx8InNwbGluZUFyZWEiPT09YXx8InN0YWNrZWRDb2x1bW4iPT09YXx8InN0YWNrZWRMaW5lIj09PWF8fCJidWJibGUiPT09YXx8InNjYXR0ZXIiPT09YXx8InN0YWNrZWRBcmVhIj09PWF8fCJzdGFja2VkQ29sdW1uMTAwIj09PWF8fCJzdGFja2VkTGluZTEwMCI9PT1hfHwic3RhY2tlZEFyZWExMDAiPT09YXx8ImNhbmRsZXN0aWNrIj09PWF8fCJvaGxjIj09PWF8fCJyYW5nZUNvbHVtbiI9PT1hfHwicmFuZ2VBcmVhIj09PWF8fCJyYW5nZVNwbGluZUFyZWEiPT09YSlyZXR1cm4ibm9ybWFsIjtpZigiYmFyIj09PWF8fCJzdGFja2VkQmFyIj09PWF8fCJzdGFja2VkQmFyMTAwIj09PWF8fCJyYW5nZUJhciI9PT1hKXJldHVybiJ4eVN3YXBwZWQiO2lmKCJwaWUiPT09YXx8ImRvdWdobnV0Ij09PWF8fCJmdW5uZWwiPT09YSlyZXR1cm4ibm9uZSI7d2luZG93LmNvbnNvbGUubG9nKCJVbmtub3duIENoYXJ0IFR5cGU6ICIrCithKTtyZXR1cm4gbnVsbH07UC5nZXREZWZhdWx0TGVnZW5kTWFya2VyPWZ1bmN0aW9uKGEpe2lmKCJjb2x1bW4iPT09YXx8InN0YWNrZWRDb2x1bW4iPT09YXx8InN0YWNrZWRMaW5lIj09PWF8fCJiYXIiPT09YXx8InN0YWNrZWRCYXIiPT09YXx8InN0YWNrZWRCYXIxMDAiPT09YXx8ImJ1YmJsZSI9PT1hfHwic2NhdHRlciI9PT1hfHwic3RhY2tlZENvbHVtbjEwMCI9PT1hfHwic3RhY2tlZExpbmUxMDAiPT09YXx8InN0ZXBBcmVhIj09PWF8fCJjYW5kbGVzdGljayI9PT1hfHwib2hsYyI9PT1hfHwicmFuZ2VDb2x1bW4iPT09YXx8InJhbmdlQmFyIj09PWF8fCJyYW5nZUFyZWEiPT09YXx8InJhbmdlU3BsaW5lQXJlYSI9PT1hKXJldHVybiJzcXVhcmUiO2lmKCJsaW5lIj09PWF8fCJzdGVwTGluZSI9PT1hfHwic3BsaW5lIj09PWF8fCJwaWUiPT09YXx8ImRvdWdobnV0Ij09PWF8fCJmdW5uZWwiPT09YSlyZXR1cm4iY2lyY2xlIjtpZigiYXJlYSI9PT1hfHwic3BsaW5lQXJlYSI9PT0KK2F8fCJzdGFja2VkQXJlYSI9PT1hfHwic3RhY2tlZEFyZWExMDAiPT09YSlyZXR1cm4idHJpYW5nbGUiO3dpbmRvdy5jb25zb2xlLmxvZygiVW5rbm93biBDaGFydCBUeXBlOiAiK2EpO3JldHVybiBudWxsfTtQLnByb3RvdHlwZS5nZXREYXRhUG9pbnRBdFg9ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5kYXRhUG9pbnRzfHwwPT09dGhpcy5kYXRhUG9pbnRzLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgYz17ZGF0YVBvaW50Om51bGwsZGlzdGFuY2U6SW5maW5pdHksaW5kZXg6TmFOfSxkPW51bGwsZT0wLGY9MCxnPTEsaz1JbmZpbml0eSxwPTAsaD0wLGw9MDsibm9uZSIhPT10aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQmJihsPXRoaXMuZGF0YVBvaW50c1t0aGlzLmRhdGFQb2ludHMubGVuZ3RoLTFdLngtdGhpcy5kYXRhUG9pbnRzWzBdLngsbD0wPGw/TWF0aC5taW4oTWF0aC5tYXgoKHRoaXMuZGF0YVBvaW50cy5sZW5ndGgtMSkvbCooYS10aGlzLmRhdGFQb2ludHNbMF0ueCk+PgorMCwwKSx0aGlzLmRhdGFQb2ludHMubGVuZ3RoKTowKTtmb3IoOzspe2Y9MDxnP2wrZTpsLWU7aWYoMDw9ZiYmZjx0aGlzLmRhdGFQb2ludHMubGVuZ3RoKXt2YXIgZD10aGlzLmRhdGFQb2ludHNbZl0scj1NYXRoLmFicyhkLngtYSk7cjxjLmRpc3RhbmNlJiYoYy5kYXRhUG9pbnQ9ZCxjLmRpc3RhbmNlPXIsYy5pbmRleD1mKTtkPU1hdGguYWJzKGQueC1hKTtkPD1rP2s9ZDowPGc/cCsrOmgrKztpZigxRTM8cCYmMUUzPGgpYnJlYWt9ZWxzZSBpZigwPmwtZSYmbCtlPj10aGlzLmRhdGFQb2ludHMubGVuZ3RoKWJyZWFrOy0xPT09Zz8oZSsrLGc9MSk6Zz0tMX1yZXR1cm4gYnx8Yy5kYXRhUG9pbnQueCE9PWE/YiYmbnVsbCE9PWMuZGF0YVBvaW50P2M6bnVsbDpjfTtQLnByb3RvdHlwZS5nZXREYXRhUG9pbnRBdFhZPWZ1bmN0aW9uKGEsYixjKXtpZighdGhpcy5kYXRhUG9pbnRzfHwwPT09dGhpcy5kYXRhUG9pbnRzLmxlbmd0aClyZXR1cm4gbnVsbDtjPWN8fCExO3ZhciBkPVtdLGU9CiswLGY9MCxnPTEsaz0hMSxwPUluZmluaXR5LGg9MCxsPTAscj0wOyJub25lIiE9PXRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1BsYWNlbWVudCYmKHI9dGhpcy5jaGFydC5heGlzWC5nZXRYVmFsdWVBdCh7eDphLHk6Yn0pLGY9dGhpcy5kYXRhUG9pbnRzW3RoaXMuZGF0YVBvaW50cy5sZW5ndGgtMV0ueC10aGlzLmRhdGFQb2ludHNbMF0ueCxyPTA8Zj9NYXRoLm1pbihNYXRoLm1heCgodGhpcy5kYXRhUG9pbnRzLmxlbmd0aC0xKS9mKihyLXRoaXMuZGF0YVBvaW50c1swXS54KT4+MCwwKSx0aGlzLmRhdGFQb2ludHMubGVuZ3RoKTowKTtmb3IoOzspe2Y9MDxnP3IrZTpyLWU7aWYoMDw9ZiYmZjx0aGlzLmRhdGFQb2ludHMubGVuZ3RoKXt2YXIgbT10aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3RoaXMuZGF0YVBvaW50SWRzW2ZdXSxxPXRoaXMuZGF0YVBvaW50c1tmXSxuPW51bGw7aWYobSl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSAiY29sdW1uIjpjYXNlICJzdGFja2VkQ29sdW1uIjpjYXNlICJzdGFja2VkQ29sdW1uMTAwIjpjYXNlICJiYXIiOmNhc2UgInN0YWNrZWRCYXIiOmNhc2UgInN0YWNrZWRCYXIxMDAiOmNhc2UgInJhbmdlQ29sdW1uIjpjYXNlICJyYW5nZUJhciI6YT49CittLngxJiYoYTw9bS54MiYmYj49bS55MSYmYjw9bS55MikmJihkLnB1c2goe2RhdGFQb2ludDpxLGRhdGFQb2ludEluZGV4OmYsZGF0YVNlcmllczp0aGlzLGRpc3RhbmNlOk1hdGgubWluKE1hdGguYWJzKG0ueDEtYSksTWF0aC5hYnMobS54Mi1hKSxNYXRoLmFicyhtLnkxLWIpLE1hdGguYWJzKG0ueTItYikpfSksaz0hMCk7YnJlYWs7Y2FzZSAibGluZSI6Y2FzZSAic3RlcExpbmUiOmNhc2UgInNwbGluZSI6Y2FzZSAiYXJlYSI6Y2FzZSAic3RlcEFyZWEiOmNhc2UgInN0YWNrZWRBcmVhIjpjYXNlICJzdGFja2VkQXJlYTEwMCI6Y2FzZSAic3BsaW5lQXJlYSI6Y2FzZSAic2NhdHRlciI6dmFyIHM9VCgibWFya2VyU2l6ZSIscSx0aGlzKXx8NCx0PWM/MjA6cyxuPU1hdGguc3FydChNYXRoLnBvdyhtLngxLWEsMikrTWF0aC5wb3cobS55MS1iLDIpKTtuPD10JiZkLnB1c2goe2RhdGFQb2ludDpxLGRhdGFQb2ludEluZGV4OmYsZGF0YVNlcmllczp0aGlzLGRpc3RhbmNlOm59KTtmPU1hdGguYWJzKG0ueDEtCithKTtmPD1wP3A9ZjowPGc/aCsrOmwrKztuPD1zLzImJihrPSEwKTticmVhaztjYXNlICJyYW5nZUFyZWEiOmNhc2UgInJhbmdlU3BsaW5lQXJlYSI6cz1UKCJtYXJrZXJTaXplIixxLHRoaXMpfHw0O3Q9Yz8yMDpzO249TWF0aC5taW4oTWF0aC5zcXJ0KE1hdGgucG93KG0ueDEtYSwyKStNYXRoLnBvdyhtLnkxLWIsMikpLE1hdGguc3FydChNYXRoLnBvdyhtLngxLWEsMikrTWF0aC5wb3cobS55Mi1iLDIpKSk7bjw9dCYmZC5wdXNoKHtkYXRhUG9pbnQ6cSxkYXRhUG9pbnRJbmRleDpmLGRhdGFTZXJpZXM6dGhpcyxkaXN0YW5jZTpufSk7Zj1NYXRoLmFicyhtLngxLWEpO2Y8PXA/cD1mOjA8Zz9oKys6bCsrO248PXMvMiYmKGs9ITApO2JyZWFrO2Nhc2UgImJ1YmJsZSI6cz1tLnNpemU7bj1NYXRoLnNxcnQoTWF0aC5wb3cobS54MS1hLDIpK01hdGgucG93KG0ueTEtYiwyKSk7bjw9cy8yJiYoZC5wdXNoKHtkYXRhUG9pbnQ6cSxkYXRhUG9pbnRJbmRleDpmLGRhdGFTZXJpZXM6dGhpcywKK2Rpc3RhbmNlOm59KSxrPSEwKTticmVhaztjYXNlICJwaWUiOmNhc2UgImRvdWdobnV0IjpzPW0uY2VudGVyO3Q9ImRvdWdobnV0Ij09PXRoaXMudHlwZT8wLjYqbS5yYWRpdXM6MDtuPU1hdGguc3FydChNYXRoLnBvdyhzLngtYSwyKStNYXRoLnBvdyhzLnktYiwyKSk7bjxtLnJhZGl1cyYmbj50JiYobj1NYXRoLmF0YW4yKGItcy55LGEtcy54KSwwPm4mJihuKz0yKk1hdGguUEkpLG49TnVtYmVyKCgoMTgwKihuL01hdGguUEkpJTM2MCszNjApJTM2MCkudG9GaXhlZCgxMikpLHM9TnVtYmVyKCgoMTgwKihtLnN0YXJ0QW5nbGUvTWF0aC5QSSklMzYwKzM2MCklMzYwKS50b0ZpeGVkKDEyKSksdD1OdW1iZXIoKCgxODAqKG0uZW5kQW5nbGUvTWF0aC5QSSklMzYwKzM2MCklMzYwKS50b0ZpeGVkKDEyKSksMD09PXQmJjE8bS5lbmRBbmdsZSYmKHQ9MzYwKSxzPj10JiYwIT09cS55JiYodCs9MzYwLG48cyYmKG4rPTM2MCkpLG4+cyYmbjx0JiYoZC5wdXNoKHtkYXRhUG9pbnQ6cSxkYXRhUG9pbnRJbmRleDpmLAorZGF0YVNlcmllczp0aGlzLGRpc3RhbmNlOjB9KSxrPSEwKSk7YnJlYWs7Y2FzZSAiY2FuZGxlc3RpY2siOmlmKGE+PW0ueDEtbS5ib3JkZXJUaGlja25lc3MvMiYmYTw9bS54MittLmJvcmRlclRoaWNrbmVzcy8yJiZiPj1tLnkyLW0uYm9yZGVyVGhpY2tuZXNzLzImJmI8PW0ueTMrbS5ib3JkZXJUaGlja25lc3MvMnx8TWF0aC5hYnMobS54Mi1hK20ueDEtYSk8bS5ib3JkZXJUaGlja25lc3MmJmI+PW0ueTEmJmI8PW0ueTQpZC5wdXNoKHtkYXRhUG9pbnQ6cSxkYXRhUG9pbnRJbmRleDpmLGRhdGFTZXJpZXM6dGhpcyxkaXN0YW5jZTpNYXRoLm1pbihNYXRoLmFicyhtLngxLWEpLE1hdGguYWJzKG0ueDItYSksTWF0aC5hYnMobS55Mi1iKSxNYXRoLmFicyhtLnkzLWIpKX0pLGs9ITA7YnJlYWs7Y2FzZSAib2hsYyI6aWYoTWF0aC5hYnMobS54Mi1hK20ueDEtYSk8bS5ib3JkZXJUaGlja25lc3MmJmI+PW0ueTImJmI8PW0ueTN8fGE+PW0ueDEmJmE8PShtLngyK20ueDEpLzImJmI+PW0ueTEtCittLmJvcmRlclRoaWNrbmVzcy8yJiZiPD1tLnkxK20uYm9yZGVyVGhpY2tuZXNzLzJ8fGE+PShtLngxK20ueDIpLzImJmE8PW0ueDImJmI+PW0ueTQtbS5ib3JkZXJUaGlja25lc3MvMiYmYjw9bS55NCttLmJvcmRlclRoaWNrbmVzcy8yKWQucHVzaCh7ZGF0YVBvaW50OnEsZGF0YVBvaW50SW5kZXg6ZixkYXRhU2VyaWVzOnRoaXMsZGlzdGFuY2U6TWF0aC5taW4oTWF0aC5hYnMobS54MS1hKSxNYXRoLmFicyhtLngyLWEpLE1hdGguYWJzKG0ueTItYiksTWF0aC5hYnMobS55My1iKSl9KSxrPSEwfWlmKGt8fDFFMzxoJiYxRTM8bClicmVha319ZWxzZSBpZigwPnItZSYmcitlPj10aGlzLmRhdGFQb2ludHMubGVuZ3RoKWJyZWFrOy0xPT09Zz8oZSsrLGc9MSk6Zz0tMX1hPW51bGw7Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKylhP2RbYl0uZGlzdGFuY2U8PWEuZGlzdGFuY2UmJihhPWRbYl0pOmE9ZFtiXTtyZXR1cm4gYX07UC5wcm90b3R5cGUuZ2V0TWFya2VyUHJvcGVydGllcz1mdW5jdGlvbihhLAorYixjLGQpe3ZhciBlPXRoaXMuZGF0YVBvaW50cztyZXR1cm57eDpiLHk6YyxjdHg6ZCx0eXBlOmVbYV0ubWFya2VyVHlwZT9lW2FdLm1hcmtlclR5cGU6dGhpcy5tYXJrZXJUeXBlLHNpemU6ZVthXS5tYXJrZXJTaXplP2VbYV0ubWFya2VyU2l6ZTp0aGlzLm1hcmtlclNpemUsY29sb3I6ZVthXS5tYXJrZXJDb2xvcj9lW2FdLm1hcmtlckNvbG9yOnRoaXMubWFya2VyQ29sb3I/dGhpcy5tYXJrZXJDb2xvcjplW2FdLmNvbG9yP2VbYV0uY29sb3I6dGhpcy5jb2xvcj90aGlzLmNvbG9yOnRoaXMuX2NvbG9yU2V0W2EldGhpcy5fY29sb3JTZXQubGVuZ3RoXSxib3JkZXJDb2xvcjplW2FdLm1hcmtlckJvcmRlckNvbG9yP2VbYV0ubWFya2VyQm9yZGVyQ29sb3I6dGhpcy5tYXJrZXJCb3JkZXJDb2xvcj90aGlzLm1hcmtlckJvcmRlckNvbG9yOm51bGwsYm9yZGVyVGhpY2tuZXNzOmVbYV0ubWFya2VyQm9yZGVyVGhpY2tuZXNzP2VbYV0ubWFya2VyQm9yZGVyVGhpY2tuZXNzOnRoaXMubWFya2VyQm9yZGVyVGhpY2tuZXNzPwordGhpcy5tYXJrZXJCb3JkZXJUaGlja25lc3M6bnVsbH19O08oQSxMKTtBLnByb3RvdHlwZS5jcmVhdGVMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgYSxiPTAsYyxkPTAsZT0wLGI9MDtpZigiYm90dG9tIj09PXRoaXMuX3Bvc2l0aW9ufHwidG9wIj09PXRoaXMuX3Bvc2l0aW9uKWI9dGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGgvTWF0aC5hYnModGhpcy5tYXhpbXVtLXRoaXMubWluaW11bSkqdGhpcy5pbnRlcnZhbCxkPXRoaXMubGFiZWxBdXRvRml0PyJ1bmRlZmluZWQiPT09dHlwZW9mIHRoaXMuX29wdGlvbnMubGFiZWxNYXhXaWR0aD8wLjkqYj4+MDp0aGlzLmxhYmVsTWF4V2lkdGg6InVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5fb3B0aW9ucy5sYWJlbE1heFdpZHRoPzAuNyp0aGlzLmNoYXJ0LndpZHRoPj4wOnRoaXMubGFiZWxNYXhXaWR0aCxlPSJ1bmRlZmluZWQiPT09dHlwZW9mIHRoaXMuX29wdGlvbnMubGFiZWxXcmFwfHx0aGlzLmxhYmVsV3JhcD8wLjUqdGhpcy5jaGFydC5oZWlnaHQ+PgorMDoxLjUqdGhpcy5sYWJlbEZvbnRTaXplO2Vsc2UgaWYoImxlZnQiPT09dGhpcy5fcG9zaXRpb258fCJyaWdodCI9PT10aGlzLl9wb3NpdGlvbiliPXRoaXMubGluZUNvb3JkaW5hdGVzLmhlaWdodC9NYXRoLmFicyh0aGlzLm1heGltdW0tdGhpcy5taW5pbXVtKSp0aGlzLmludGVydmFsLGQ9dGhpcy5sYWJlbEF1dG9GaXQ/InVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5fb3B0aW9ucy5sYWJlbE1heFdpZHRoPzAuMyp0aGlzLmNoYXJ0LndpZHRoPj4wOnRoaXMubGFiZWxNYXhXaWR0aDoidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9vcHRpb25zLmxhYmVsTWF4V2lkdGg/MC41KnRoaXMuY2hhcnQud2lkdGg+PjA6dGhpcy5sYWJlbE1heFdpZHRoLGU9InVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5fb3B0aW9ucy5sYWJlbFdyYXB8fHRoaXMubGFiZWxXcmFwPzIqYj4+MDoxLjUqdGhpcy5sYWJlbEZvbnRTaXplO2lmKCJheGlzWCI9PT10aGlzLnR5cGUmJiJkYXRlVGltZSI9PT10aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlKWZvcihjPQorcWEobmV3IERhdGUodGhpcy5tYXhpbXVtKSx0aGlzLmludGVydmFsLHRoaXMuaW50ZXJ2YWxUeXBlKSxiPXRoaXMuaW50ZXJ2YWxzdGFydFRpbWVQZXJjZW50O2I8YztxYShiLHRoaXMuaW50ZXJ2YWwsdGhpcy5pbnRlcnZhbFR5cGUpKWE9Yi5nZXRUaW1lKCksYT0iYXhpc1giPT09dGhpcy50eXBlJiZ0aGlzLmxhYmVsc1thXT90aGlzLmxhYmVsc1thXTp5YShiLHRoaXMudmFsdWVGb3JtYXRTdHJpbmcsdGhpcy5jaGFydC5fY3VsdHVyZUluZm8pLGE9bmV3IEkodGhpcy5jdHgse3g6MCx5OjAsbWF4V2lkdGg6ZCxtYXhIZWlnaHQ6ZSxhbmdsZTp0aGlzLmxhYmVsQW5nbGUsdGV4dDp0aGlzLnByZWZpeCthK3RoaXMuc3VmZml4LGhvcml6b250YWxBbGlnbjoibGVmdCIsZm9udFNpemU6dGhpcy5sYWJlbEZvbnRTaXplLGZvbnRGYW1pbHk6dGhpcy5sYWJlbEZvbnRGYW1pbHksZm9udFdlaWdodDp0aGlzLmxhYmVsRm9udFdlaWdodCxmb250Q29sb3I6dGhpcy5sYWJlbEZvbnRDb2xvcixmb250U3R5bGU6dGhpcy5sYWJlbEZvbnRTdHlsZSwKK3RleHRCYXNlbGluZToibWlkZGxlIn0pLHRoaXMuX2xhYmVscy5wdXNoKHtwb3NpdGlvbjpiLmdldFRpbWUoKSx0ZXh0QmxvY2s6YSxlZmZlY3RpdmVIZWlnaHQ6bnVsbH0pO2Vsc2V7Yz10aGlzLm1heGltdW07aWYodGhpcy5sYWJlbHMmJnRoaXMubGFiZWxzLmxlbmd0aCl7YT1NYXRoLmNlaWwodGhpcy5pbnRlcnZhbCk7Zm9yKHZhciBmPU1hdGguY2VpbCh0aGlzLmludGVydmFsc3RhcnRUaW1lUGVyY2VudCksZz0hMSxiPWY7Yjx0aGlzLm1heGltdW07Yis9YSlpZih0aGlzLmxhYmVsc1tiXSlnPSEwO2Vsc2V7Zz0hMTticmVha31nJiYodGhpcy5pbnRlcnZhbD1hLHRoaXMuaW50ZXJ2YWxzdGFydFRpbWVQZXJjZW50PWYpfWZvcihiPXRoaXMuaW50ZXJ2YWxzdGFydFRpbWVQZXJjZW50O2I8PWM7Yj1wYXJzZUZsb2F0KChiK3RoaXMuaW50ZXJ2YWwpLnRvRml4ZWQoMTQpKSlhPSJheGlzWCI9PT10aGlzLnR5cGUmJnRoaXMubGFiZWxzW2JdP3RoaXMubGFiZWxzW2JdOlgoYix0aGlzLnZhbHVlRm9ybWF0U3RyaW5nLAordGhpcy5jaGFydC5fY3VsdHVyZUluZm8pLGE9bmV3IEkodGhpcy5jdHgse3g6MCx5OjAsbWF4V2lkdGg6ZCxtYXhIZWlnaHQ6ZSxhbmdsZTp0aGlzLmxhYmVsQW5nbGUsdGV4dDp0aGlzLnByZWZpeCthK3RoaXMuc3VmZml4LGhvcml6b250YWxBbGlnbjoibGVmdCIsZm9udFNpemU6dGhpcy5sYWJlbEZvbnRTaXplLGZvbnRGYW1pbHk6dGhpcy5sYWJlbEZvbnRGYW1pbHksZm9udFdlaWdodDp0aGlzLmxhYmVsRm9udFdlaWdodCxmb250Q29sb3I6dGhpcy5sYWJlbEZvbnRDb2xvcixmb250U3R5bGU6dGhpcy5sYWJlbEZvbnRTdHlsZSx0ZXh0QmFzZWxpbmU6Im1pZGRsZSIsYm9yZGVyVGhpY2tuZXNzOjB9KSx0aGlzLl9sYWJlbHMucHVzaCh7cG9zaXRpb246Yix0ZXh0QmxvY2s6YSxlZmZlY3RpdmVIZWlnaHQ6bnVsbH0pfWZvcihiPTA7Yjx0aGlzLnN0cmlwTGluZXMubGVuZ3RoO2IrKyljPXRoaXMuc3RyaXBMaW5lc1tiXSxhPW5ldyBJKHRoaXMuY3R4LHt4OjAseTowLGJhY2tncm91bmRDb2xvcjpjLmxhYmVsQmFja2dyb3VuZENvbG9yLAorbWF4V2lkdGg6ZCxtYXhIZWlnaHQ6ZSxhbmdsZTp0aGlzLmxhYmVsQW5nbGUsdGV4dDpjLmxhYmVsLGhvcml6b250YWxBbGlnbjoibGVmdCIsZm9udFNpemU6Yy5sYWJlbEZvbnRTaXplLGZvbnRGYW1pbHk6Yy5sYWJlbEZvbnRGYW1pbHksZm9udFdlaWdodDpjLmxhYmVsRm9udFdlaWdodCxmb250Q29sb3I6Yy5sYWJlbEZvbnRDb2xvcixmb250U3R5bGU6Yy5sYWJlbEZvbnRTdHlsZSx0ZXh0QmFzZWxpbmU6Im1pZGRsZSIsYm9yZGVyVGhpY2tuZXNzOjB9KSx0aGlzLl9sYWJlbHMucHVzaCh7cG9zaXRpb246Yy52YWx1ZSx0ZXh0QmxvY2s6YSxlZmZlY3RpdmVIZWlnaHQ6bnVsbCxzdHJpcExpbmU6Y30pfTtBLnByb3RvdHlwZS5jcmVhdGVMYWJlbHNBbmRDYWxjdWxhdGVXaWR0aD1mdW5jdGlvbigpe3ZhciBhPTA7dGhpcy5fbGFiZWxzPVtdO2lmKCJsZWZ0Ij09PXRoaXMuX3Bvc2l0aW9ufHwicmlnaHQiPT09dGhpcy5fcG9zaXRpb24pZm9yKHRoaXMuY3JlYXRlTGFiZWxzKCksaT0wO2k8Cit0aGlzLl9sYWJlbHMubGVuZ3RoO2krKyl7dmFyIGI9dGhpcy5fbGFiZWxzW2ldLnRleHRCbG9jay5tZWFzdXJlVGV4dCgpLGM9MCxjPTA9PT10aGlzLmxhYmVsQW5nbGU/Yi53aWR0aDpiLndpZHRoKk1hdGguY29zKE1hdGguUEkvMTgwKk1hdGguYWJzKHRoaXMubGFiZWxBbmdsZSkpK2IuaGVpZ2h0LzIqTWF0aC5zaW4oTWF0aC5QSS8xODAqTWF0aC5hYnModGhpcy5sYWJlbEFuZ2xlKSk7YTxjJiYoYT1jKTt0aGlzLl9sYWJlbHNbaV0uZWZmZWN0aXZlV2lkdGg9Y31yZXR1cm4odGhpcy50aXRsZT9jYSh0aGlzLnRpdGxlRm9udEZhbWlseSx0aGlzLnRpdGxlRm9udFNpemUsdGhpcy50aXRsZUZvbnRXZWlnaHQpKzI6MCkrYSt0aGlzLnRpY2tMZW5ndGgrNX07QS5wcm90b3R5cGUuY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIGE9MDt0aGlzLl9sYWJlbHM9W107dmFyIGIsYz0wO3RoaXMuY3JlYXRlTGFiZWxzKCk7aWYoImJvdHRvbSI9PT10aGlzLl9wb3NpdGlvbnx8CisidG9wIj09PXRoaXMuX3Bvc2l0aW9uKWZvcihjPTA7Yzx0aGlzLl9sYWJlbHMubGVuZ3RoO2MrKyl7Yj10aGlzLl9sYWJlbHNbY10udGV4dEJsb2NrO2I9Yi5tZWFzdXJlVGV4dCgpO3ZhciBkPTAsZD0wPT09dGhpcy5sYWJlbEFuZ2xlP2IuaGVpZ2h0OmIud2lkdGgqTWF0aC5zaW4oTWF0aC5QSS8xODAqTWF0aC5hYnModGhpcy5sYWJlbEFuZ2xlKSkrYi5oZWlnaHQvMipNYXRoLmNvcyhNYXRoLlBJLzE4MCpNYXRoLmFicyh0aGlzLmxhYmVsQW5nbGUpKTthPGQmJihhPWQpO3RoaXMuX2xhYmVsc1tjXS5lZmZlY3RpdmVIZWlnaHQ9ZH1yZXR1cm4odGhpcy50aXRsZT9jYSh0aGlzLnRpdGxlRm9udEZhbWlseSx0aGlzLnRpdGxlRm9udFNpemUsdGhpcy50aXRsZUZvbnRXZWlnaHQpKzI6MCkrYSt0aGlzLnRpY2tMZW5ndGgrNX07QS5zZXRMYXlvdXRBbmRSZW5kZXI9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGsscD1hLmNoYXJ0LGg9cC5jdHg7YS5jYWxjdWxhdGVBeGlzUGFyYW1ldGVycygpOworYiYmYi5jYWxjdWxhdGVBeGlzUGFyYW1ldGVycygpO2MmJmMuY2FsY3VsYXRlQXhpc1BhcmFtZXRlcnMoKTtpZihiJiZjJiYidW5kZWZpbmVkIj09PXR5cGVvZiBiLl9vcHRpb25zLm1heGltdW0mJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuX29wdGlvbnMubWluaW11bSYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5fb3B0aW9ucy5pbnRlcnZhbCYmInVuZGVmaW5lZCI9PT10eXBlb2YgYy5fb3B0aW9ucy5tYXhpbXVtJiYidW5kZWZpbmVkIj09PXR5cGVvZiBjLl9vcHRpb25zLm1pbmltdW0mJiJ1bmRlZmluZWQiPT09dHlwZW9mIGMuX29wdGlvbnMuaW50ZXJ2YWwpe2s9KGIubWF4aW11bS1iLm1pbmltdW0pL2IuaW50ZXJ2YWw7dmFyIGw9KGMubWF4aW11bS1jLm1pbmltdW0pL2MuaW50ZXJ2YWw7az5sP2MubWF4aW11bT1jLmludGVydmFsKmsrYy5taW5pbXVtOmw+ayYmKGIubWF4aW11bT1iLmludGVydmFsKmwrYi5taW5pbXVtKX1sPWI/Yi5tYXJnaW46MDtpZigibm9ybWFsIj09PWQpe2EubGluZUNvb3JkaW5hdGVzPQore307dmFyIHI9TWF0aC5jZWlsKGI/Yi5jcmVhdGVMYWJlbHNBbmRDYWxjdWxhdGVXaWR0aCgpOjApO2Y9TWF0aC5yb3VuZChlLngxK3IrbCk7YS5saW5lQ29vcmRpbmF0ZXMueDE9ZjtsPU1hdGguY2VpbChjP2MuY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlV2lkdGgoKTowKTtnPU1hdGgucm91bmQoZS54Mi1sPmEuY2hhcnQud2lkdGgtMTA/YS5jaGFydC53aWR0aC0xMDplLngyLWwpO2EubGluZUNvb3JkaW5hdGVzLngyPWc7YS5saW5lQ29vcmRpbmF0ZXMud2lkdGg9TWF0aC5hYnMoZy1mKTt2YXIgbT1NYXRoLmNlaWwoYS5jcmVhdGVMYWJlbHNBbmRDYWxjdWxhdGVIZWlnaHQoKSk7ZD1NYXRoLnJvdW5kKGUueTItbS1hLm1hcmdpbik7az1NYXRoLnJvdW5kKGUueTItYS5tYXJnaW4pO2EubGluZUNvb3JkaW5hdGVzLnkxPWQ7YS5saW5lQ29vcmRpbmF0ZXMueTI9ZDthLmJvdW5kaW5nUmVjdD17eDE6Zix5MTpkLHgyOmcseTI6ayx3aWR0aDpnLWYsaGVpZ2h0OmstZH07YiYmKGY9TWF0aC5yb3VuZChlLngxKworYi5tYXJnaW4pLGQ9TWF0aC5yb3VuZCgxMD5lLnkxPzEwOmUueTEpLGc9TWF0aC5yb3VuZChlLngxK3IrYi5tYXJnaW4pLGs9TWF0aC5yb3VuZChlLnkyLW0tYS5tYXJnaW4pLGIubGluZUNvb3JkaW5hdGVzPXt4MTpnLHkxOmQseDI6Zyx5MjprLGhlaWdodDpNYXRoLmFicyhrLWQpfSxiLmJvdW5kaW5nUmVjdD17eDE6Zix5MTpkLHgyOmcseTI6ayx3aWR0aDpnLWYsaGVpZ2h0OmstZH0pO2MmJihmPU1hdGgucm91bmQoYS5saW5lQ29vcmRpbmF0ZXMueDIpLGQ9TWF0aC5yb3VuZCgxMD5lLnkxPzEwOmUueTEpLGc9TWF0aC5yb3VuZChmK2wrYy5tYXJnaW4pLGs9TWF0aC5yb3VuZChlLnkyLW0tYS5tYXJnaW4pLGMubGluZUNvb3JkaW5hdGVzPXt4MTpmLHkxOmQseDI6Zix5MjprLGhlaWdodDpNYXRoLmFicyhrLWQpfSxjLmJvdW5kaW5nUmVjdD17eDE6Zix5MTpkLHgyOmcseTI6ayx3aWR0aDpnLWYsaGVpZ2h0OmstZH0pO2EuY2FsY3VsYXRlVmFsdWVUb1BpeGVsY29udmVyc2lvblBhcmFtZXRlcnMoKTsKK2ImJmIuY2FsY3VsYXRlVmFsdWVUb1BpeGVsY29udmVyc2lvblBhcmFtZXRlcnMoKTtjJiZjLmNhbGN1bGF0ZVZhbHVlVG9QaXhlbGNvbnZlcnNpb25QYXJhbWV0ZXJzKCk7aC5zYXZlKCk7aC5yZWN0KDUsYS5ib3VuZGluZ1JlY3QueTEsYS5jaGFydC53aWR0aC0xMCxhLmJvdW5kaW5nUmVjdC5oZWlnaHQpO2guY2xpcCgpO2EucmVuZGVyTGFiZWxzVGlja3NBbmRUaXRsZSgpO2gucmVzdG9yZSgpO2ImJmIucmVuZGVyTGFiZWxzVGlja3NBbmRUaXRsZSgpO2MmJmMucmVuZGVyTGFiZWxzVGlja3NBbmRUaXRsZSgpfWVsc2V7cj1NYXRoLmNlaWwoYS5jcmVhdGVMYWJlbHNBbmRDYWxjdWxhdGVXaWR0aCgpKTtiJiYoYi5saW5lQ29vcmRpbmF0ZXM9e30sZj1NYXRoLnJvdW5kKGUueDErcithLm1hcmdpbiksZz1NYXRoLnJvdW5kKGUueDI+Yi5jaGFydC53aWR0aC0xMD9iLmNoYXJ0LndpZHRoLTEwOmUueDIpLGIubGluZUNvb3JkaW5hdGVzLngxPWYsYi5saW5lQ29vcmRpbmF0ZXMueDI9ZywKK2IubGluZUNvb3JkaW5hdGVzLndpZHRoPU1hdGguYWJzKGctZikpO2MmJihjLmxpbmVDb29yZGluYXRlcz17fSxmPU1hdGgucm91bmQoZS54MStyK2EubWFyZ2luKSxnPU1hdGgucm91bmQoZS54Mj5jLmNoYXJ0LndpZHRoLTEwP2MuY2hhcnQud2lkdGgtMTA6ZS54MiksYy5saW5lQ29vcmRpbmF0ZXMueDE9ZixjLmxpbmVDb29yZGluYXRlcy54Mj1nLGMubGluZUNvb3JkaW5hdGVzLndpZHRoPU1hdGguYWJzKGctZikpO3ZhciBtPU1hdGguY2VpbChiP2IuY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlSGVpZ2h0KCk6MCkscT1NYXRoLmNlaWwoYz9jLmNyZWF0ZUxhYmVsc0FuZENhbGN1bGF0ZUhlaWdodCgpOjApO2ImJihkPU1hdGgucm91bmQoZS55Mi1tLWIubWFyZ2luKSxrPU1hdGgucm91bmQoZS55Mi1sPmIuY2hhcnQuaGVpZ2h0LTEwP2IuY2hhcnQuaGVpZ2h0LTEwOmUueTItbCksYi5saW5lQ29vcmRpbmF0ZXMueTE9ZCxiLmxpbmVDb29yZGluYXRlcy55Mj1kLGIuYm91bmRpbmdSZWN0PQore3gxOmYseTE6ZCx4MjpnLHkyOmssd2lkdGg6Zy1mLGhlaWdodDptfSk7YyYmKGQ9TWF0aC5yb3VuZChlLnkxK2MubWFyZ2luKSxrPWUueTErYy5tYXJnaW4rcSxjLmxpbmVDb29yZGluYXRlcy55MT1rLGMubGluZUNvb3JkaW5hdGVzLnkyPWssYy5ib3VuZGluZ1JlY3Q9e3gxOmYseTE6ZCx4MjpnLHkyOmssd2lkdGg6Zy1mLGhlaWdodDpxfSk7Zj1NYXRoLnJvdW5kKGUueDErYS5tYXJnaW4pO2Q9TWF0aC5yb3VuZChjP2MubGluZUNvb3JkaW5hdGVzLnkyOjEwPmUueTE/MTA6ZS55MSk7Zz1NYXRoLnJvdW5kKGUueDErcithLm1hcmdpbik7az1NYXRoLnJvdW5kKGI/Yi5saW5lQ29vcmRpbmF0ZXMueTE6ZS55Mi1sPmEuY2hhcnQuaGVpZ2h0LTEwP2EuY2hhcnQuaGVpZ2h0LTEwOmUueTItbCk7YS5saW5lQ29vcmRpbmF0ZXM9e3gxOmcseTE6ZCx4MjpnLHkyOmssaGVpZ2h0Ok1hdGguYWJzKGstZCl9O2EuYm91bmRpbmdSZWN0PXt4MTpmLHkxOmQseDI6Zyx5MjprLHdpZHRoOmctZixoZWlnaHQ6ay0KK2R9O2EuY2FsY3VsYXRlVmFsdWVUb1BpeGVsY29udmVyc2lvblBhcmFtZXRlcnMoKTtiJiZiLmNhbGN1bGF0ZVZhbHVlVG9QaXhlbGNvbnZlcnNpb25QYXJhbWV0ZXJzKCk7YyYmYy5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxjb252ZXJzaW9uUGFyYW1ldGVycygpO2ImJmIucmVuZGVyTGFiZWxzVGlja3NBbmRUaXRsZSgpO2MmJmMucmVuZGVyTGFiZWxzVGlja3NBbmRUaXRsZSgpO2EucmVuZGVyTGFiZWxzVGlja3NBbmRUaXRsZSgpfXAucHJlcGFyZVBsb3RBcmVhKCk7ZT1hLmNoYXJ0LnBsb3RBcmVhO2guc2F2ZSgpO2gucmVjdChlLngxLGUueTEsTWF0aC5hYnMoZS54Mi1lLngxKSxNYXRoLmFicyhlLnkyLWUueTEpKTtoLmNsaXAoKTthLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoInZhbHVlIik7YiYmYi5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKCJ2YWx1ZSIpO2MmJmMucmVuZGVyU3RyaXBMaW5lc09mVGhpY2tuZXNzVHlwZSgidmFsdWUiKTthLnJlbmRlckludGVybGFjZWRDb2xvcnMoKTsKK2ImJmIucmVuZGVySW50ZXJsYWNlZENvbG9ycygpO2MmJmMucmVuZGVySW50ZXJsYWNlZENvbG9ycygpO2gucmVzdG9yZSgpO2EucmVuZGVyR3JpZCgpO2ImJmIucmVuZGVyR3JpZCgpO2MmJmMucmVuZGVyR3JpZCgpO2EucmVuZGVyQXhpc0xpbmUoKTtiJiZiLnJlbmRlckF4aXNMaW5lKCk7YyYmYy5yZW5kZXJBeGlzTGluZSgpO2EucmVuZGVyU3RyaXBMaW5lc09mVGhpY2tuZXNzVHlwZSgicGl4ZWwiKTtiJiZiLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoInBpeGVsIik7YyYmYy5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKCJwaXhlbCIpfTtBLnByb3RvdHlwZS5yZW5kZXJMYWJlbHNUaWNrc0FuZFRpdGxlPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0wLGM9MSxkPTA7MCE9PXRoaXMubGFiZWxBbmdsZSYmMzYwIT09dGhpcy5sYWJlbEFuZ2xlJiYoYz0xLjIpO2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpe2lmKCJib3R0b20iPT09Cit0aGlzLl9wb3NpdGlvbnx8InRvcCI9PT10aGlzLl9wb3NpdGlvbil7Zm9yKGU9MDtlPHRoaXMuX2xhYmVscy5sZW5ndGg7ZSsrKWY9dGhpcy5fbGFiZWxzW2VdLGYucG9zaXRpb248dGhpcy5taW5pbXVtfHxmLnN0cmlwTGluZXx8KGY9Zi50ZXh0QmxvY2sud2lkdGgqTWF0aC5jb3MoTWF0aC5QSS8xODAqdGhpcy5sYWJlbEFuZ2xlKStmLnRleHRCbG9jay5oZWlnaHQqTWF0aC5zaW4oTWF0aC5QSS8xODAqdGhpcy5sYWJlbEFuZ2xlKSxiKz1mKTtiPnRoaXMubGluZUNvb3JkaW5hdGVzLndpZHRoKmMmJihhPSEwKX1pZigibGVmdCI9PT10aGlzLl9wb3NpdGlvbnx8InJpZ2h0Ij09PXRoaXMuX3Bvc2l0aW9uKXtmb3IoZT0wO2U8dGhpcy5fbGFiZWxzLmxlbmd0aDtlKyspZj10aGlzLl9sYWJlbHNbZV0sZi5wb3NpdGlvbjx0aGlzLm1pbmltdW18fGYuc3RyaXBMaW5lfHwoZj1mLnRleHRCbG9jay5oZWlnaHQqTWF0aC5jb3MoTWF0aC5QSS8xODAqdGhpcy5sYWJlbEFuZ2xlKStmLnRleHRCbG9jay53aWR0aCoKK01hdGguc2luKE1hdGguUEkvMTgwKnRoaXMubGFiZWxBbmdsZSksYis9Zik7Yj50aGlzLmxpbmVDb29yZGluYXRlcy5oZWlnaHQqYyYmKGE9ITApfX1pZigiYm90dG9tIj09PXRoaXMuX3Bvc2l0aW9uKXtmb3IodmFyIGU9MCxmLGU9MDtlPHRoaXMuX2xhYmVscy5sZW5ndGg7ZSsrKWlmKGY9dGhpcy5fbGFiZWxzW2VdLCEoZi5wb3NpdGlvbjx0aGlzLm1pbmltdW18fGYucG9zaXRpb24+dGhpcy5tYXhpbXVtKSl7Yj10aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMoZi5wb3NpdGlvbik7aWYodGhpcy50aWNrVGhpY2tuZXNzJiYhdGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZXx8dGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZSYmInBpeGVsIj09PXRoaXMuX2xhYmVsc1tlXS5zdHJpcExpbmUuX3RoaWNrbmVzc1R5cGUpdGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZT8oYz10aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lLHRoaXMuY3R4LmxpbmVXaWR0aD1jLnRoaWNrbmVzcyx0aGlzLmN0eC5zdHJva2VTdHlsZT0KK2MuY29sb3IpOih0aGlzLmN0eC5saW5lV2lkdGg9dGhpcy50aWNrVGhpY2tuZXNzLHRoaXMuY3R4LnN0cm9rZVN0eWxlPXRoaXMudGlja0NvbG9yKSxjPTE9PT10aGlzLmN0eC5saW5lV2lkdGglMj8oYi54PDwwKSswLjU6Yi54PDwwLHRoaXMuY3R4LmJlZ2luUGF0aCgpLHRoaXMuY3R4Lm1vdmVUbyhjLGIueTw8MCksdGhpcy5jdHgubGluZVRvKGMsYi55K3RoaXMudGlja0xlbmd0aDw8MCksdGhpcy5jdHguc3Ryb2tlKCk7aWYoIWF8fDA9PT1kKyslMnx8dGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZSkwPT09Zi50ZXh0QmxvY2suYW5nbGU/KGIueC09Zi50ZXh0QmxvY2sud2lkdGgvMixiLnkrPXRoaXMudGlja0xlbmd0aCtmLnRleHRCbG9jay5mb250U2l6ZS8yKTooYi54LT0wPnRoaXMubGFiZWxBbmdsZT9mLnRleHRCbG9jay53aWR0aCpNYXRoLmNvcyhNYXRoLlBJLzE4MCp0aGlzLmxhYmVsQW5nbGUpOjAsYi55Kz10aGlzLnRpY2tMZW5ndGgrTWF0aC5hYnMoMD50aGlzLmxhYmVsQW5nbGU/CitmLnRleHRCbG9jay53aWR0aCpNYXRoLnNpbihNYXRoLlBJLzE4MCp0aGlzLmxhYmVsQW5nbGUpLTU6NSkpLGYudGV4dEJsb2NrLng9Yi54LGYudGV4dEJsb2NrLnk9Yi55LGYudGV4dEJsb2NrLnJlbmRlcighMCl9dGhpcy50aXRsZSYmKHRoaXMuX3RpdGxlVGV4dEJsb2NrPW5ldyBJKHRoaXMuY3R4LHt4OnRoaXMubGluZUNvb3JkaW5hdGVzLngxLHk6dGhpcy5ib3VuZGluZ1JlY3QueTItdGhpcy50aXRsZUZvbnRTaXplLTUsbWF4V2lkdGg6dGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGgsbWF4SGVpZ2h0OjEuNSp0aGlzLnRpdGxlRm9udFNpemUsYW5nbGU6MCx0ZXh0OnRoaXMudGl0bGUsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLGZvbnRTaXplOnRoaXMudGl0bGVGb250U2l6ZSxmb250RmFtaWx5OnRoaXMudGl0bGVGb250RmFtaWx5LGZvbnRXZWlnaHQ6dGhpcy50aXRsZUZvbnRXZWlnaHQsZm9udENvbG9yOnRoaXMudGl0bGVGb250Q29sb3IsZm9udFN0eWxlOnRoaXMudGl0bGVGb250U3R5bGUsCit0ZXh0QmFzZWxpbmU6InRvcCJ9KSx0aGlzLl90aXRsZVRleHRCbG9jay5tZWFzdXJlVGV4dCgpLHRoaXMuX3RpdGxlVGV4dEJsb2NrLng9dGhpcy5saW5lQ29vcmRpbmF0ZXMueDErdGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGgvMi10aGlzLl90aXRsZVRleHRCbG9jay53aWR0aC8yLHRoaXMuX3RpdGxlVGV4dEJsb2NrLnk9dGhpcy5ib3VuZGluZ1JlY3QueTItdGhpcy5fdGl0bGVUZXh0QmxvY2suaGVpZ2h0LTMsdGhpcy5fdGl0bGVUZXh0QmxvY2sucmVuZGVyKCEwKSl9ZWxzZSBpZigidG9wIj09PXRoaXMuX3Bvc2l0aW9uKXtmb3IoZT0wO2U8dGhpcy5fbGFiZWxzLmxlbmd0aDtlKyspaWYoZj10aGlzLl9sYWJlbHNbZV0sIShmLnBvc2l0aW9uPHRoaXMubWluaW11bXx8Zi5wb3NpdGlvbj50aGlzLm1heGltdW0pKXtiPXRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyhmLnBvc2l0aW9uKTtpZih0aGlzLnRpY2tUaGlja25lc3MmJiF0aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lfHwKK3RoaXMuX2xhYmVsc1tlXS5zdHJpcExpbmUmJiJwaXhlbCI9PT10aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lLl90aGlja25lc3NUeXBlKXRoaXMuX2xhYmVsc1tlXS5zdHJpcExpbmU/KGM9dGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZSx0aGlzLmN0eC5saW5lV2lkdGg9Yy50aGlja25lc3MsdGhpcy5jdHguc3Ryb2tlU3R5bGU9Yy5jb2xvcik6KHRoaXMuY3R4LmxpbmVXaWR0aD10aGlzLnRpY2tUaGlja25lc3MsdGhpcy5jdHguc3Ryb2tlU3R5bGU9dGhpcy50aWNrQ29sb3IpLGM9MT09PXRoaXMuY3R4LmxpbmVXaWR0aCUyPyhiLng8PDApKzAuNTpiLng8PDAsdGhpcy5jdHguYmVnaW5QYXRoKCksdGhpcy5jdHgubW92ZVRvKGMsYi55PDwwKSx0aGlzLmN0eC5saW5lVG8oYyxiLnktdGhpcy50aWNrTGVuZ3RoPDwwKSx0aGlzLmN0eC5zdHJva2UoKTtpZighYXx8MD09PWQrKyUyfHx0aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lKTA9PT1mLnRleHRCbG9jay5hbmdsZT8oYi54LT1mLnRleHRCbG9jay53aWR0aC8KKzIsYi55LT10aGlzLnRpY2tMZW5ndGgrZi50ZXh0QmxvY2suaGVpZ2h0LzIpOihiLngtPTA8dGhpcy5sYWJlbEFuZ2xlP2YudGV4dEJsb2NrLndpZHRoKk1hdGguY29zKE1hdGguUEkvMTgwKnRoaXMubGFiZWxBbmdsZSk6MCxiLnktPXRoaXMudGlja0xlbmd0aCtNYXRoLmFicygwPHRoaXMubGFiZWxBbmdsZT9mLnRleHRCbG9jay53aWR0aCpNYXRoLnNpbihNYXRoLlBJLzE4MCp0aGlzLmxhYmVsQW5nbGUpKzU6NSkpLGYudGV4dEJsb2NrLng9Yi54LGYudGV4dEJsb2NrLnk9Yi55LGYudGV4dEJsb2NrLnJlbmRlcighMCl9dGhpcy50aXRsZSYmKHRoaXMuX3RpdGxlVGV4dEJsb2NrPW5ldyBJKHRoaXMuY3R4LHt4OnRoaXMubGluZUNvb3JkaW5hdGVzLngxLHk6dGhpcy5ib3VuZGluZ1JlY3QueTErMSxtYXhXaWR0aDp0aGlzLmxpbmVDb29yZGluYXRlcy53aWR0aCxtYXhIZWlnaHQ6MS41KnRoaXMudGl0bGVGb250U2l6ZSxhbmdsZTowLHRleHQ6dGhpcy50aXRsZSxob3Jpem9udGFsQWxpZ246ImNlbnRlciIsCitmb250U2l6ZTp0aGlzLnRpdGxlRm9udFNpemUsZm9udEZhbWlseTp0aGlzLnRpdGxlRm9udEZhbWlseSxmb250V2VpZ2h0OnRoaXMudGl0bGVGb250V2VpZ2h0LGZvbnRDb2xvcjp0aGlzLnRpdGxlRm9udENvbG9yLGZvbnRTdHlsZTp0aGlzLnRpdGxlRm9udFN0eWxlLHRleHRCYXNlbGluZToidG9wIn0pLHRoaXMuX3RpdGxlVGV4dEJsb2NrLm1lYXN1cmVUZXh0KCksdGhpcy5fdGl0bGVUZXh0QmxvY2sueD10aGlzLmxpbmVDb29yZGluYXRlcy54MSt0aGlzLmxpbmVDb29yZGluYXRlcy53aWR0aC8yLXRoaXMuX3RpdGxlVGV4dEJsb2NrLndpZHRoLzIsdGhpcy5fdGl0bGVUZXh0QmxvY2sucmVuZGVyKCEwKSl9ZWxzZSBpZigibGVmdCI9PT10aGlzLl9wb3NpdGlvbil7Zm9yKGU9MDtlPHRoaXMuX2xhYmVscy5sZW5ndGg7ZSsrKWlmKGY9dGhpcy5fbGFiZWxzW2VdLCEoZi5wb3NpdGlvbjx0aGlzLm1pbmltdW18fGYucG9zaXRpb24+dGhpcy5tYXhpbXVtKSl7Yj10aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMoZi5wb3NpdGlvbik7CitpZih0aGlzLnRpY2tUaGlja25lc3MmJiF0aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lfHx0aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lJiYicGl4ZWwiPT09dGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZS5fdGhpY2tuZXNzVHlwZSl0aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lPyhjPXRoaXMuX2xhYmVsc1tlXS5zdHJpcExpbmUsdGhpcy5jdHgubGluZVdpZHRoPWMudGhpY2tuZXNzLHRoaXMuY3R4LnN0cm9rZVN0eWxlPWMuY29sb3IpOih0aGlzLmN0eC5saW5lV2lkdGg9dGhpcy50aWNrVGhpY2tuZXNzLHRoaXMuY3R4LnN0cm9rZVN0eWxlPXRoaXMudGlja0NvbG9yKSxjPTE9PT10aGlzLmN0eC5saW5lV2lkdGglMj8oYi55PDwwKSswLjU6Yi55PDwwLHRoaXMuY3R4LmJlZ2luUGF0aCgpLHRoaXMuY3R4Lm1vdmVUbyhiLng8PDAsYyksdGhpcy5jdHgubGluZVRvKGIueC10aGlzLnRpY2tMZW5ndGg8PDAsYyksdGhpcy5jdHguc3Ryb2tlKCk7aWYoIWF8fDA9PT1kKyslMnx8dGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZSlmLnRleHRCbG9jay54PQorYi54LWYudGV4dEJsb2NrLndpZHRoKk1hdGguY29zKE1hdGguUEkvMTgwKnRoaXMubGFiZWxBbmdsZSktdGhpcy50aWNrTGVuZ3RoLTUsZi50ZXh0QmxvY2sueT0wPT09dGhpcy5sYWJlbEFuZ2xlP2IueS1mLnRleHRCbG9jay5oZWlnaHQvMit0aGlzLmxhYmVsRm9udFNpemUvMjpiLnktZi50ZXh0QmxvY2sud2lkdGgqTWF0aC5zaW4oTWF0aC5QSS8xODAqdGhpcy5sYWJlbEFuZ2xlKSxmLnRleHRCbG9jay5yZW5kZXIoITApfXRoaXMudGl0bGUmJih0aGlzLl90aXRsZVRleHRCbG9jaz1uZXcgSSh0aGlzLmN0eCx7eDp0aGlzLmJvdW5kaW5nUmVjdC54MSsxLHk6dGhpcy5saW5lQ29vcmRpbmF0ZXMueTIsbWF4V2lkdGg6dGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0LG1heEhlaWdodDoxLjUqdGhpcy50aXRsZUZvbnRTaXplLGFuZ2xlOi05MCx0ZXh0OnRoaXMudGl0bGUsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLGZvbnRTaXplOnRoaXMudGl0bGVGb250U2l6ZSxmb250RmFtaWx5OnRoaXMudGl0bGVGb250RmFtaWx5LAorZm9udFdlaWdodDp0aGlzLnRpdGxlRm9udFdlaWdodCxmb250Q29sb3I6dGhpcy50aXRsZUZvbnRDb2xvcixmb250U3R5bGU6dGhpcy50aXRsZUZvbnRTdHlsZSx0ZXh0QmFzZWxpbmU6InRvcCJ9KSx0aGlzLl90aXRsZVRleHRCbG9jay5tZWFzdXJlVGV4dCgpLHRoaXMuX3RpdGxlVGV4dEJsb2NrLnk9dGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0LzIrdGhpcy5fdGl0bGVUZXh0QmxvY2sud2lkdGgvMit0aGlzLmxpbmVDb29yZGluYXRlcy55MSx0aGlzLl90aXRsZVRleHRCbG9jay5yZW5kZXIoITApKX1lbHNlIGlmKCJyaWdodCI9PT10aGlzLl9wb3NpdGlvbil7Zm9yKGU9MDtlPHRoaXMuX2xhYmVscy5sZW5ndGg7ZSsrKWlmKGY9dGhpcy5fbGFiZWxzW2VdLCEoZi5wb3NpdGlvbjx0aGlzLm1pbmltdW18fGYucG9zaXRpb24+dGhpcy5tYXhpbXVtKSl7Yj10aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMoZi5wb3NpdGlvbik7aWYodGhpcy50aWNrVGhpY2tuZXNzJiYhdGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZXx8Cit0aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lJiYicGl4ZWwiPT09dGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZS5fdGhpY2tuZXNzVHlwZSl0aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lPyhjPXRoaXMuX2xhYmVsc1tlXS5zdHJpcExpbmUsdGhpcy5jdHgubGluZVdpZHRoPWMudGhpY2tuZXNzLHRoaXMuY3R4LnN0cm9rZVN0eWxlPWMuY29sb3IpOih0aGlzLmN0eC5saW5lV2lkdGg9dGhpcy50aWNrVGhpY2tuZXNzLHRoaXMuY3R4LnN0cm9rZVN0eWxlPXRoaXMudGlja0NvbG9yKSxjPTE9PT10aGlzLmN0eC5saW5lV2lkdGglMj8oYi55PDwwKSswLjU6Yi55PDwwLHRoaXMuY3R4LmJlZ2luUGF0aCgpLHRoaXMuY3R4Lm1vdmVUbyhiLng8PDAsYyksdGhpcy5jdHgubGluZVRvKGIueCt0aGlzLnRpY2tMZW5ndGg8PDAsYyksdGhpcy5jdHguc3Ryb2tlKCk7aWYoIWF8fDA9PT1kKyslMnx8dGhpcy5fbGFiZWxzW2VdLnN0cmlwTGluZSlmLnRleHRCbG9jay54PWIueCt0aGlzLnRpY2tMZW5ndGgrCis1LGYudGV4dEJsb2NrLnk9MD09PXRoaXMubGFiZWxBbmdsZT9iLnktZi50ZXh0QmxvY2suaGVpZ2h0LzIrdGhpcy5sYWJlbEZvbnRTaXplLzI6Yi55LGYudGV4dEJsb2NrLnJlbmRlcighMCl9dGhpcy50aXRsZSYmKHRoaXMuX3RpdGxlVGV4dEJsb2NrPW5ldyBJKHRoaXMuY3R4LHt4OnRoaXMuYm91bmRpbmdSZWN0LngyLTEseTp0aGlzLmxpbmVDb29yZGluYXRlcy55MixtYXhXaWR0aDp0aGlzLmxpbmVDb29yZGluYXRlcy5oZWlnaHQsbWF4SGVpZ2h0OjEuNSp0aGlzLnRpdGxlRm9udFNpemUsYW5nbGU6OTAsdGV4dDp0aGlzLnRpdGxlLGhvcml6b250YWxBbGlnbjoiY2VudGVyIixmb250U2l6ZTp0aGlzLnRpdGxlRm9udFNpemUsZm9udEZhbWlseTp0aGlzLnRpdGxlRm9udEZhbWlseSxmb250V2VpZ2h0OnRoaXMudGl0bGVGb250V2VpZ2h0LGZvbnRDb2xvcjp0aGlzLnRpdGxlRm9udENvbG9yLGZvbnRTdHlsZTp0aGlzLnRpdGxlRm9udFN0eWxlLHRleHRCYXNlbGluZToidG9wIn0pLAordGhpcy5fdGl0bGVUZXh0QmxvY2subWVhc3VyZVRleHQoKSx0aGlzLl90aXRsZVRleHRCbG9jay55PXRoaXMubGluZUNvb3JkaW5hdGVzLmhlaWdodC8yLXRoaXMuX3RpdGxlVGV4dEJsb2NrLndpZHRoLzIrdGhpcy5saW5lQ29vcmRpbmF0ZXMueTEsdGhpcy5fdGl0bGVUZXh0QmxvY2sucmVuZGVyKCEwKSl9fTtBLnByb3RvdHlwZS5yZW5kZXJJbnRlcmxhY2VkQ29sb3JzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydC5wbG90QXJlYS5jdHgsYixjLGQ9dGhpcy5jaGFydC5wbG90QXJlYSxlPTA7Yj0hMDtpZigoImJvdHRvbSI9PT10aGlzLl9wb3NpdGlvbnx8InRvcCI9PT10aGlzLl9wb3NpdGlvbikmJnRoaXMuaW50ZXJsYWNlZENvbG9yKWZvcihhLmZpbGxTdHlsZT10aGlzLmludGVybGFjZWRDb2xvcixlPTA7ZTx0aGlzLl9sYWJlbHMubGVuZ3RoO2UrKyl0aGlzLl9sYWJlbHNbZV0uc3RyaXBMaW5lfHwoYj8oYj10aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXModGhpcy5fbGFiZWxzW2VdLnBvc2l0aW9uKSwKK2M9ZSsxPj10aGlzLl9sYWJlbHMubGVuZ3RoP3RoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLm1heGltdW0pOnRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLl9sYWJlbHNbZSsxXS5wb3NpdGlvbiksYS5maWxsUmVjdChiLngsZC55MSxNYXRoLmFicyhjLngtYi54KSxNYXRoLmFicyhkLnkxLWQueTIpKSxiPSExKTpiPSEwKTtlbHNlIGlmKCgibGVmdCI9PT10aGlzLl9wb3NpdGlvbnx8InJpZ2h0Ij09PXRoaXMuX3Bvc2l0aW9uKSYmdGhpcy5pbnRlcmxhY2VkQ29sb3IpZm9yKGEuZmlsbFN0eWxlPXRoaXMuaW50ZXJsYWNlZENvbG9yLGU9MDtlPHRoaXMuX2xhYmVscy5sZW5ndGg7ZSsrKXRoaXMuX2xhYmVsc1tlXS5zdHJpcExpbmV8fChiPyhjPXRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLl9sYWJlbHNbZV0ucG9zaXRpb24pLGI9ZSsxPj10aGlzLl9sYWJlbHMubGVuZ3RoP3RoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLm1heGltdW0pOgordGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHRoaXMuX2xhYmVsc1tlKzFdLnBvc2l0aW9uKSxhLmZpbGxSZWN0KGQueDEsYi55LE1hdGguYWJzKGQueDEtZC54MiksTWF0aC5hYnMoYi55LWMueSkpLGI9ITEpOmI9ITApO2EuYmVnaW5QYXRoKCl9O0EucHJvdG90eXBlLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGU9ZnVuY3Rpb24oYSl7aWYodGhpcy5zdHJpcExpbmVzJiYwPHRoaXMuc3RyaXBMaW5lcy5sZW5ndGgmJmEpZm9yKHZhciBiPXRoaXMuY2hhcnQucGxvdEFyZWEuY3R4LGM9MCxjPTA7Yzx0aGlzLnN0cmlwTGluZXMubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5zdHJpcExpbmVzW2NdO2lmKGQuX3RoaWNrbmVzc1R5cGU9PT1hJiYoInBpeGVsIiE9PWF8fCEoZC52YWx1ZTx0aGlzLm1pbmltdW18fGQudmFsdWU+dGhpcy5tYXhpbXVtKSkpe3ZhciBlPXRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyhkLnZhbHVlKSxmPU1hdGguYWJzKCJwaXhlbCI9PT1hPworZC50aGlja25lc3M6dGhpcy5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQqZC50aGlja25lc3MpO2lmKCEoMD49Zikpe2Iuc3Ryb2tlU3R5bGU9ZC5jb2xvcjtiLmJlZ2luUGF0aCgpO0MoZC5pZCk7dmFyIGcsayxwLGg7Yi5saW5lV2lkdGg9ZjtpZigiYm90dG9tIj09PXRoaXMuX3Bvc2l0aW9ufHwidG9wIj09PXRoaXMuX3Bvc2l0aW9uKWc9az0xPT09Yi5saW5lV2lkdGglMj8oZS54PDwwKSswLjU6ZS54PDwwLHA9dGhpcy5jaGFydC5wbG90QXJlYS55MSxoPXRoaXMuY2hhcnQucGxvdEFyZWEueTI7ZWxzZSBpZigibGVmdCI9PT10aGlzLl9wb3NpdGlvbnx8InJpZ2h0Ij09PXRoaXMuX3Bvc2l0aW9uKXA9aD0xPT09Yi5saW5lV2lkdGglMj8oZS55PDwwKSswLjU6ZS55PDwwLGc9dGhpcy5jaGFydC5wbG90QXJlYS54MSxrPXRoaXMuY2hhcnQucGxvdEFyZWEueDI7Yi5tb3ZlVG8oZyxwKTtiLmxpbmVUbyhrLGgpO2Iuc3Ryb2tlKCl9fX19O0EucHJvdG90eXBlLnJlbmRlckdyaWQ9CitmdW5jdGlvbigpe2lmKHRoaXMuZ3JpZFRoaWNrbmVzcyYmMDx0aGlzLmdyaWRUaGlja25lc3Mpe3ZhciBhPXRoaXMuY2hhcnQuY3R4LGIsYz10aGlzLmNoYXJ0LnBsb3RBcmVhO2EubGluZVdpZHRoPXRoaXMuZ3JpZFRoaWNrbmVzczthLnN0cm9rZVN0eWxlPXRoaXMuZ3JpZENvbG9yO2lmKCJib3R0b20iPT09dGhpcy5fcG9zaXRpb258fCJ0b3AiPT09dGhpcy5fcG9zaXRpb24pZm9yKGQ9MDtkPHRoaXMuX2xhYmVscy5sZW5ndGgmJiF0aGlzLl9sYWJlbHNbZF0uc3RyaXBMaW5lO2QrKyl0aGlzLl9sYWJlbHNbZF0ucG9zaXRpb248dGhpcy5taW5pbXVtfHx0aGlzLl9sYWJlbHNbZF0ucG9zaXRpb24+dGhpcy5tYXhpbXVtfHwoYS5iZWdpblBhdGgoKSxiPXRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLl9sYWJlbHNbZF0ucG9zaXRpb24pLGI9MT09PWEubGluZVdpZHRoJTI/KGIueDw8MCkrMC41OmIueDw8MCxhLm1vdmVUbyhiLGMueTE8PDApLGEubGluZVRvKGIsYy55Mjw8CiswKSxhLnN0cm9rZSgpKTtlbHNlIGlmKCJsZWZ0Ij09PXRoaXMuX3Bvc2l0aW9ufHwicmlnaHQiPT09dGhpcy5fcG9zaXRpb24pZm9yKHZhciBkPTA7ZDx0aGlzLl9sYWJlbHMubGVuZ3RoJiYhdGhpcy5fbGFiZWxzW2RdLnN0cmlwTGluZTtkKyspdGhpcy5fbGFiZWxzW2RdLnBvc2l0aW9uPHRoaXMubWluaW11bXx8dGhpcy5fbGFiZWxzW2RdLnBvc2l0aW9uPnRoaXMubWF4aW11bXx8KGEuYmVnaW5QYXRoKCksYj10aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXModGhpcy5fbGFiZWxzW2RdLnBvc2l0aW9uKSxiPTE9PT1hLmxpbmVXaWR0aCUyPyhiLnk8PDApKzAuNTpiLnk8PDAsYS5tb3ZlVG8oYy54MTw8MCxiKSxhLmxpbmVUbyhjLngyPDwwLGIpLGEuc3Ryb2tlKCkpfX07QS5wcm90b3R5cGUucmVuZGVyQXhpc0xpbmU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LmN0eDtpZigiYm90dG9tIj09PXRoaXMuX3Bvc2l0aW9ufHwidG9wIj09PXRoaXMuX3Bvc2l0aW9uKXtpZih0aGlzLmxpbmVUaGlja25lc3Mpe2EubGluZVdpZHRoPQordGhpcy5saW5lVGhpY2tuZXNzO2Euc3Ryb2tlU3R5bGU9dGhpcy5saW5lQ29sb3I/dGhpcy5saW5lQ29sb3I6ImJsYWNrIjt2YXIgYj0xPT09dGhpcy5saW5lVGhpY2tuZXNzJTI/KHRoaXMubGluZUNvb3JkaW5hdGVzLnkxPDwwKSswLjU6dGhpcy5saW5lQ29vcmRpbmF0ZXMueTE8PDA7YS5iZWdpblBhdGgoKTthLm1vdmVUbyh0aGlzLmxpbmVDb29yZGluYXRlcy54MSxiKTthLmxpbmVUbyh0aGlzLmxpbmVDb29yZGluYXRlcy54MixiKTthLnN0cm9rZSgpfX1lbHNlImxlZnQiIT09dGhpcy5fcG9zaXRpb24mJiJyaWdodCIhPT10aGlzLl9wb3NpdGlvbnx8IXRoaXMubGluZVRoaWNrbmVzc3x8KGEubGluZVdpZHRoPXRoaXMubGluZVRoaWNrbmVzcyxhLnN0cm9rZVN0eWxlPXRoaXMubGluZUNvbG9yLGI9MT09PXRoaXMubGluZVRoaWNrbmVzcyUyPyh0aGlzLmxpbmVDb29yZGluYXRlcy54MTw8MCkrMC41OnRoaXMubGluZUNvb3JkaW5hdGVzLngxPDwwLGEuYmVnaW5QYXRoKCksYS5tb3ZlVG8oYiwKK3RoaXMubGluZUNvb3JkaW5hdGVzLnkxKSxhLmxpbmVUbyhiLHRoaXMubGluZUNvb3JkaW5hdGVzLnkyKSxhLnN0cm9rZSgpKX07QS5wcm90b3R5cGUuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcz1mdW5jdGlvbihhKXt2YXIgYj17fSxjPXRoaXMubGluZUNvb3JkaW5hdGVzLndpZHRoLGQ9dGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0O2lmKCJib3R0b20iPT09dGhpcy5fcG9zaXRpb258fCJ0b3AiPT09dGhpcy5fcG9zaXRpb24pYy89TWF0aC5hYnModGhpcy5tYXhpbXVtLXRoaXMubWluaW11bSksYi54PXRoaXMubGluZUNvb3JkaW5hdGVzLngxK2MqKGEtdGhpcy5taW5pbXVtKSxiLnk9dGhpcy5saW5lQ29vcmRpbmF0ZXMueTE7aWYoImxlZnQiPT09dGhpcy5fcG9zaXRpb258fCJyaWdodCI9PT10aGlzLl9wb3NpdGlvbiljPWQvTWF0aC5hYnModGhpcy5tYXhpbXVtLXRoaXMubWluaW11bSksYi55PXRoaXMubGluZUNvb3JkaW5hdGVzLnkyLWMqKGEtdGhpcy5taW5pbXVtKSxiLng9Cit0aGlzLmxpbmVDb29yZGluYXRlcy54MjtyZXR1cm4gYn07QS5wcm90b3R5cGUuZ2V0WFZhbHVlQXQ9ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIG51bGw7dmFyIGI9bnVsbDsibGVmdCI9PT10aGlzLl9wb3NpdGlvbj9iPSh0aGlzLmNoYXJ0LmF4aXNYLm1heGltdW0tdGhpcy5jaGFydC5heGlzWC5taW5pbXVtKS90aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy5oZWlnaHQqKHRoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLnkyLWEueSkrdGhpcy5jaGFydC5heGlzWC5taW5pbXVtOiJib3R0b20iPT09dGhpcy5fcG9zaXRpb24mJihiPSh0aGlzLmNoYXJ0LmF4aXNYLm1heGltdW0tdGhpcy5jaGFydC5heGlzWC5taW5pbXVtKS90aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy53aWR0aCooYS54LXRoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLngxKSt0aGlzLmNoYXJ0LmF4aXNYLm1pbmltdW0pO3JldHVybiBifTtBLnByb3RvdHlwZS5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxjb252ZXJzaW9uUGFyYW1ldGVycz0KK2Z1bmN0aW9uKGEpe2E9e3BpeGVsUGVyVW5pdDpudWxsLG1pbmltdW06bnVsbCxyZWZlcmVuY2U6bnVsbH07dmFyIGI9dGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGgsYz10aGlzLmxpbmVDb29yZGluYXRlcy5oZWlnaHQ7YS5taW5pbXVtPXRoaXMubWluaW11bTtpZigiYm90dG9tIj09PXRoaXMuX3Bvc2l0aW9ufHwidG9wIj09PXRoaXMuX3Bvc2l0aW9uKWEucGl4ZWxQZXJVbml0PWIvTWF0aC5hYnModGhpcy5tYXhpbXVtLXRoaXMubWluaW11bSksYS5yZWZlcmVuY2U9dGhpcy5saW5lQ29vcmRpbmF0ZXMueDE7aWYoImxlZnQiPT09dGhpcy5fcG9zaXRpb258fCJyaWdodCI9PT10aGlzLl9wb3NpdGlvbilhLnBpeGVsUGVyVW5pdD0tMSpjL01hdGguYWJzKHRoaXMubWF4aW11bS10aGlzLm1pbmltdW0pLGEucmVmZXJlbmNlPXRoaXMubGluZUNvb3JkaW5hdGVzLnkyO3RoaXMuY29udmVyc2lvblBhcmFtZXRlcnM9YX07QS5wcm90b3R5cGUuY2FsY3VsYXRlQXhpc1BhcmFtZXRlcnM9ZnVuY3Rpb24oKXt2YXIgYT0KK3RoaXMuY2hhcnQubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTsiYm90dG9tIj09PXRoaXMuX3Bvc2l0aW9ufHwidG9wIj09PXRoaXMuX3Bvc2l0aW9uPyh0aGlzLm1heFdpZHRoPWEud2lkdGgsdGhpcy5tYXhIZWlnaHQ9YS5oZWlnaHQpOih0aGlzLm1heFdpZHRoPWEuaGVpZ2h0LHRoaXMubWF4SGVpZ2h0PWEud2lkdGgpO3ZhciBhPSJheGlzWCI9PT10aGlzLnR5cGU/NTAwPnRoaXMubWF4V2lkdGg/ODpNYXRoLm1heCg2LE1hdGguZmxvb3IodGhpcy5tYXhXaWR0aC82MikpOk1hdGgubWF4KE1hdGguZmxvb3IodGhpcy5tYXhXaWR0aC80MCksMiksYixjLGQsZTtlPTA7ImF4aXNYIj09PXRoaXMudHlwZT8oYj1udWxsIT09dGhpcy5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWluaW11bT90aGlzLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNaW5pbXVtOnRoaXMuZGF0YUluZm8udmlld1BvcnRNaW4sYz1udWxsIT09dGhpcy5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWF4aW11bT8KK3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1heGltdW06dGhpcy5kYXRhSW5mby52aWV3UG9ydE1heCwwPT09Yy1iJiYoYys9MC40LGItPTAuNCksZD1JbmZpbml0eSE9PXRoaXMuZGF0YUluZm8ubWluRGlmZj90aGlzLmRhdGFJbmZvLm1pbkRpZmY6MTxjLWI/MC41Kk1hdGguYWJzKGMtYik6MSk6ImF4aXNZIj09PXRoaXMudHlwZSYmKGI9InVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5fb3B0aW9ucy5taW5pbXVtP3RoaXMuZGF0YUluZm8udmlld1BvcnRNaW46dGhpcy5fb3B0aW9ucy5taW5pbXVtLGM9InVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5fb3B0aW9ucy5tYXhpbXVtP3RoaXMuZGF0YUluZm8udmlld1BvcnRNYXg6dGhpcy5fb3B0aW9ucy5tYXhpbXVtLDA9PT1iJiYwPT09Yz8oYys9OSxiPTApOjA9PT1jLWI/KGU9TWF0aC5taW4oTWF0aC5hYnMoMC4wMSpNYXRoLmFicyhjKSksNSksYys9ZSxiLT1lKTooZT1NYXRoLm1pbihNYXRoLmFicygwLjAxKk1hdGguYWJzKGMtCitiKSksMC4wNSksMCE9PWMmJihjKz1lKSwwIT09YiYmKGItPWUpKSx0aGlzLmluY2x1ZGVaZXJvJiYidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9vcHRpb25zLm1pbmltdW0mJjA8YiYmKGI9MCksdGhpcy5pbmNsdWRlWmVybyYmInVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5fb3B0aW9ucy5tYXhpbXVtJiYwPmMmJihjPTApKTsiYXhpc1giPT09dGhpcy50eXBlJiYiZGF0ZVRpbWUiPT09dGhpcy5jaGFydC5wbG90SW5mby5heGlzWFZhbHVlVHlwZT8oZT1jLWIsdGhpcy5pbnRlcnZhbFR5cGV8fChlLzE8PWE/KHRoaXMuaW50ZXJ2YWw9MSx0aGlzLmludGVydmFsVHlwZT0ibWlsbGlzZWNvbmQiKTplLzI8PWE/KHRoaXMuaW50ZXJ2YWw9Mix0aGlzLmludGVydmFsVHlwZT0ibWlsbGlzZWNvbmQiKTplLzU8PWE/KHRoaXMuaW50ZXJ2YWw9NSx0aGlzLmludGVydmFsVHlwZT0ibWlsbGlzZWNvbmQiKTplLzEwPD1hPyh0aGlzLmludGVydmFsPTEwLHRoaXMuaW50ZXJ2YWxUeXBlPSJtaWxsaXNlY29uZCIpOgorZS8yMDw9YT8odGhpcy5pbnRlcnZhbD0yMCx0aGlzLmludGVydmFsVHlwZT0ibWlsbGlzZWNvbmQiKTplLzUwPD1hPyh0aGlzLmludGVydmFsPTUwLHRoaXMuaW50ZXJ2YWxUeXBlPSJtaWxsaXNlY29uZCIpOmUvMTAwPD1hPyh0aGlzLmludGVydmFsPTEwMCx0aGlzLmludGVydmFsVHlwZT0ibWlsbGlzZWNvbmQiKTplLzIwMDw9YT8odGhpcy5pbnRlcnZhbD0yMDAsdGhpcy5pbnRlcnZhbFR5cGU9Im1pbGxpc2Vjb25kIik6ZS8yNTA8PWE/KHRoaXMuaW50ZXJ2YWw9MjUwLHRoaXMuaW50ZXJ2YWxUeXBlPSJtaWxsaXNlY29uZCIpOmUvMzAwPD1hPyh0aGlzLmludGVydmFsPTMwMCx0aGlzLmludGVydmFsVHlwZT0ibWlsbGlzZWNvbmQiKTplLzQwMDw9YT8odGhpcy5pbnRlcnZhbD00MDAsdGhpcy5pbnRlcnZhbFR5cGU9Im1pbGxpc2Vjb25kIik6ZS81MDA8PWE/KHRoaXMuaW50ZXJ2YWw9NTAwLHRoaXMuaW50ZXJ2YWxUeXBlPSJtaWxsaXNlY29uZCIpOmUvKDEqei5zZWNvbmREdXJhdGlvbik8PQorYT8odGhpcy5pbnRlcnZhbD0xLHRoaXMuaW50ZXJ2YWxUeXBlPSJzZWNvbmQiKTplLygyKnouc2Vjb25kRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTIsdGhpcy5pbnRlcnZhbFR5cGU9InNlY29uZCIpOmUvKDUqei5zZWNvbmREdXJhdGlvbik8PWE/KHRoaXMuaW50ZXJ2YWw9NSx0aGlzLmludGVydmFsVHlwZT0ic2Vjb25kIik6ZS8oMTAqei5zZWNvbmREdXJhdGlvbik8PWE/KHRoaXMuaW50ZXJ2YWw9MTAsdGhpcy5pbnRlcnZhbFR5cGU9InNlY29uZCIpOmUvKDE1Knouc2Vjb25kRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTE1LHRoaXMuaW50ZXJ2YWxUeXBlPSJzZWNvbmQiKTplLygyMCp6LnNlY29uZER1cmF0aW9uKTw9YT8odGhpcy5pbnRlcnZhbD0yMCx0aGlzLmludGVydmFsVHlwZT0ic2Vjb25kIik6ZS8oMzAqei5zZWNvbmREdXJhdGlvbik8PWE/KHRoaXMuaW50ZXJ2YWw9MzAsdGhpcy5pbnRlcnZhbFR5cGU9InNlY29uZCIpOmUvKDEqei5taW51dGVEdXJhdGlvbik8PQorYT8odGhpcy5pbnRlcnZhbD0xLHRoaXMuaW50ZXJ2YWxUeXBlPSJtaW51dGUiKTplLygyKnoubWludXRlRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTIsdGhpcy5pbnRlcnZhbFR5cGU9Im1pbnV0ZSIpOmUvKDUqei5taW51dGVEdXJhdGlvbik8PWE/KHRoaXMuaW50ZXJ2YWw9NSx0aGlzLmludGVydmFsVHlwZT0ibWludXRlIik6ZS8oMTAqei5taW51dGVEdXJhdGlvbik8PWE/KHRoaXMuaW50ZXJ2YWw9MTAsdGhpcy5pbnRlcnZhbFR5cGU9Im1pbnV0ZSIpOmUvKDE1KnoubWludXRlRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTE1LHRoaXMuaW50ZXJ2YWxUeXBlPSJtaW51dGUiKTplLygyMCp6Lm1pbnV0ZUR1cmF0aW9uKTw9YT8odGhpcy5pbnRlcnZhbD0yMCx0aGlzLmludGVydmFsVHlwZT0ibWludXRlIik6ZS8oMzAqei5taW51dGVEdXJhdGlvbik8PWE/KHRoaXMuaW50ZXJ2YWw9MzAsdGhpcy5pbnRlcnZhbFR5cGU9Im1pbnV0ZSIpOmUvKDEqei5ob3VyRHVyYXRpb24pPD0KK2E/KHRoaXMuaW50ZXJ2YWw9MSx0aGlzLmludGVydmFsVHlwZT0iaG91ciIpOmUvKDIqei5ob3VyRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTIsdGhpcy5pbnRlcnZhbFR5cGU9ImhvdXIiKTplLygzKnouaG91ckR1cmF0aW9uKTw9YT8odGhpcy5pbnRlcnZhbD0zLHRoaXMuaW50ZXJ2YWxUeXBlPSJob3VyIik6ZS8oNip6LmhvdXJEdXJhdGlvbik8PWE/KHRoaXMuaW50ZXJ2YWw9Nix0aGlzLmludGVydmFsVHlwZT0iaG91ciIpOmUvKDEqei5kYXlEdXJhdGlvbik8PWE/KHRoaXMuaW50ZXJ2YWw9MSx0aGlzLmludGVydmFsVHlwZT0iZGF5Iik6ZS8oMip6LmRheUR1cmF0aW9uKTw9YT8odGhpcy5pbnRlcnZhbD0yLHRoaXMuaW50ZXJ2YWxUeXBlPSJkYXkiKTplLyg0KnouZGF5RHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTQsdGhpcy5pbnRlcnZhbFR5cGU9ImRheSIpOmUvKDEqei53ZWVrRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTEsdGhpcy5pbnRlcnZhbFR5cGU9IndlZWsiKToKK2UvKDIqei53ZWVrRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTIsdGhpcy5pbnRlcnZhbFR5cGU9IndlZWsiKTplLygzKnoud2Vla0R1cmF0aW9uKTw9YT8odGhpcy5pbnRlcnZhbD0zLHRoaXMuaW50ZXJ2YWxUeXBlPSJ3ZWVrIik6ZS8oMSp6Lm1vbnRoRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTEsdGhpcy5pbnRlcnZhbFR5cGU9Im1vbnRoIik6ZS8oMip6Lm1vbnRoRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTIsdGhpcy5pbnRlcnZhbFR5cGU9Im1vbnRoIik6ZS8oMyp6Lm1vbnRoRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTMsdGhpcy5pbnRlcnZhbFR5cGU9Im1vbnRoIik6ZS8oNip6Lm1vbnRoRHVyYXRpb24pPD1hPyh0aGlzLmludGVydmFsPTYsdGhpcy5pbnRlcnZhbFR5cGU9Im1vbnRoIik6KHRoaXMuaW50ZXJ2YWw9ZS8oMSp6LnllYXJEdXJhdGlvbik8PWE/MTplLygyKnoueWVhckR1cmF0aW9uKTw9YT8yOmUvKDQqei55ZWFyRHVyYXRpb24pPD1hPworNDpNYXRoLmZsb29yKEEuZ2V0TmljZU51bWJlcihlLyhhLTEpLCEwKS96LnllYXJEdXJhdGlvbiksdGhpcy5pbnRlcnZhbFR5cGU9InllYXIiKSksdGhpcy5taW5pbXVtPW51bGwhPT10aGlzLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNaW5pbXVtP3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1pbmltdW06Yi1kLzIsdGhpcy5tYXhpbXVtPXRoaXMuc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1heGltdW0/dGhpcy5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWF4aW11bTpjK2QvMix0aGlzLnZhbHVlRm9ybWF0U3RyaW5nfHwoInllYXIiPT09dGhpcy5pbnRlcnZhbFR5cGU/dGhpcy52YWx1ZUZvcm1hdFN0cmluZz0iWVlZWSI6Im1vbnRoIj09PXRoaXMuaW50ZXJ2YWxUeXBlP3RoaXMudmFsdWVGb3JtYXRTdHJpbmc9Ik1NTSBZWVlZIjoid2VlayI9PT10aGlzLmludGVydmFsVHlwZT90aGlzLnZhbHVlRm9ybWF0U3RyaW5nPSJNTU0gREQgWVlZWSI6ImRheSI9PT10aGlzLmludGVydmFsVHlwZT8KK3RoaXMudmFsdWVGb3JtYXRTdHJpbmc9Ik1NTSBERCBZWVlZIjoiaG91ciI9PT10aGlzLmludGVydmFsVHlwZT90aGlzLnZhbHVlRm9ybWF0U3RyaW5nPSJoaDptbSBUVCI6Im1pbnV0ZSI9PT10aGlzLmludGVydmFsVHlwZT90aGlzLnZhbHVlRm9ybWF0U3RyaW5nPSJoaDptbSBUVCI6InNlY29uZCI9PT10aGlzLmludGVydmFsVHlwZT90aGlzLnZhbHVlRm9ybWF0U3RyaW5nPSJoaDptbTpzcyBUVCI6Im1pbGxpc2Vjb25kIj09PXRoaXMuaW50ZXJ2YWxUeXBlJiYodGhpcy52YWx1ZUZvcm1hdFN0cmluZz0iZmZmJ21zJyIpKSx0aGlzLmludGVydmFsc3RhcnRUaW1lUGVyY2VudD10aGlzLmdldExhYmVsU3RhcnRQb2ludChuZXcgRGF0ZSh0aGlzLm1pbmltdW0pLHRoaXMuaW50ZXJ2YWxUeXBlLHRoaXMuaW50ZXJ2YWwpKToodGhpcy5pbnRlcnZhbFR5cGU9Im51bWJlciIsZT1BLmdldE5pY2VOdW1iZXIoYy1iLCExKSx0aGlzLmludGVydmFsPXRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMuaW50ZXJ2YWw/Cit0aGlzLl9vcHRpb25zLmludGVydmFsOkEuZ2V0TmljZU51bWJlcihlLyhhLTEpLCEwKSx0aGlzLm1pbmltdW09bnVsbCE9PXRoaXMuc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1pbmltdW0/dGhpcy5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWluaW11bTpNYXRoLmZsb29yKGIvdGhpcy5pbnRlcnZhbCkqdGhpcy5pbnRlcnZhbCx0aGlzLm1heGltdW09bnVsbCE9PXRoaXMuc2Vzc2lvblZhcmlhYmxlcy5pbnRlcm5hbE1heGltdW0/dGhpcy5zZXNzaW9uVmFyaWFibGVzLmludGVybmFsTWF4aW11bTpNYXRoLmNlaWwoYy90aGlzLmludGVydmFsKSp0aGlzLmludGVydmFsLCJheGlzWCI9PT10aGlzLnR5cGU/KG51bGw9PT10aGlzLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNaW5pbXVtJiYodGhpcy5taW5pbXVtPWItZC8yKSx0aGlzLnNlc3Npb25WYXJpYWJsZXMuaW50ZXJuYWxNYXhpbXVtfHwodGhpcy5tYXhpbXVtPWMrZC8yKSx0aGlzLmludGVydmFsc3RhcnRUaW1lUGVyY2VudD0KK01hdGguZmxvb3IoKHRoaXMubWluaW11bSswLjIqdGhpcy5pbnRlcnZhbCkvdGhpcy5pbnRlcnZhbCkqdGhpcy5pbnRlcnZhbCk6ImF4aXNZIj09PXRoaXMudHlwZSYmKHRoaXMuaW50ZXJ2YWxzdGFydFRpbWVQZXJjZW50PXRoaXMubWluaW11bSkpOyJheGlzWCI9PT10aGlzLnR5cGUmJih0aGlzLl9hYnNvbHV0ZU1pbmltdW09dGhpcy5fb3B0aW9ucyYmInVuZGVmaW5lZCIhPT10eXBlb2YgdGhpcy5fb3B0aW9ucy5taW5pbXVtP3RoaXMuX29wdGlvbnMubWluaW11bTp0aGlzLmRhdGFJbmZvLm1pbi1kLzIsdGhpcy5fYWJzb2x1dGVNYXhpbXVtPXRoaXMuX29wdGlvbnMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHRoaXMuX29wdGlvbnMubWF4aW11bT90aGlzLl9vcHRpb25zLm1heGltdW06dGhpcy5kYXRhSW5mby5tYXgrZC8yKTtpZighdGhpcy52YWx1ZUZvcm1hdFN0cmluZyYmKHRoaXMudmFsdWVGb3JtYXRTdHJpbmc9IiMsIyMwLiMjIixlPU1hdGguYWJzKHRoaXMubWF4aW11bS10aGlzLm1pbmltdW0pLAorMT5lJiYoYj1NYXRoLmZsb29yKE1hdGguYWJzKE1hdGgubG9nKGUpL01hdGguTE4xMCkpKzIsMjxiKSkpZm9yKGM9MDtjPGItMjtjKyspdGhpcy52YWx1ZUZvcm1hdFN0cmluZys9IiMifTtBLmdldE5pY2VOdW1iZXI9ZnVuY3Rpb24oYSxiKXt2YXIgYz1NYXRoLmZsb29yKE1hdGgubG9nKGEpL01hdGguTE4xMCksZD1hL01hdGgucG93KDEwLGMpO3JldHVybiBOdW1iZXIoKChiPzEuNT5kPzE6Mz5kPzI6Nz5kPzU6MTA6MT49ZD8xOjI+PWQ/Mjo1Pj1kPzU6MTApKk1hdGgucG93KDEwLGMpKS50b0ZpeGVkKDIwKSl9O0EucHJvdG90eXBlLmdldExhYmVsU3RhcnRQb2ludD1mdW5jdGlvbigpe3ZhciBhPVkodGhpcy5pbnRlcnZhbCx0aGlzLmludGVydmFsVHlwZSksYT1uZXcgRGF0ZShNYXRoLmZsb29yKHRoaXMubWluaW11bS9hKSphKTtpZigibWlsbGlzZWNvbmQiIT09dGhpcy5pbnRlcnZhbFR5cGUpaWYoInNlY29uZCI9PT10aGlzLmludGVydmFsVHlwZSkwPGEuZ2V0TWlsbGlzZWNvbmRzKCkmJgorKGEuc2V0U2Vjb25kcyhhLmdldFNlY29uZHMoKSsxKSxhLnNldE1pbGxpc2Vjb25kcygwKSk7ZWxzZSBpZigibWludXRlIj09PXRoaXMuaW50ZXJ2YWxUeXBlKXtpZigwPGEuZ2V0U2Vjb25kcygpfHwwPGEuZ2V0TWlsbGlzZWNvbmRzKCkpYS5zZXRNaW51dGVzKGEuZ2V0TWludXRlcygpKzEpLGEuc2V0U2Vjb25kcygwKSxhLnNldE1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKCJob3VyIj09PXRoaXMuaW50ZXJ2YWxUeXBlKXtpZigwPGEuZ2V0TWludXRlcygpfHwwPGEuZ2V0U2Vjb25kcygpfHwwPGEuZ2V0TWlsbGlzZWNvbmRzKCkpYS5zZXRIb3VycyhhLmdldEhvdXJzKCkrMSksYS5zZXRNaW51dGVzKDApLGEuc2V0U2Vjb25kcygwKSxhLnNldE1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKCJkYXkiPT09dGhpcy5pbnRlcnZhbFR5cGUpe2lmKDA8YS5nZXRIb3VycygpfHwwPGEuZ2V0TWludXRlcygpfHwwPGEuZ2V0U2Vjb25kcygpfHwwPGEuZ2V0TWlsbGlzZWNvbmRzKCkpYS5zZXREYXRlKGEuZ2V0RGF0ZSgpKworMSksYS5zZXRIb3VycygwKSxhLnNldE1pbnV0ZXMoMCksYS5zZXRTZWNvbmRzKDApLGEuc2V0TWlsbGlzZWNvbmRzKDApfWVsc2UgaWYoIndlZWsiPT09dGhpcy5pbnRlcnZhbFR5cGUpe2lmKDA8YS5nZXREYXkoKXx8MDxhLmdldEhvdXJzKCl8fDA8YS5nZXRNaW51dGVzKCl8fDA8YS5nZXRTZWNvbmRzKCl8fDA8YS5nZXRNaWxsaXNlY29uZHMoKSlhLnNldERhdGUoYS5nZXREYXRlKCkrKDctYS5nZXREYXkoKSkpLGEuc2V0SG91cnMoMCksYS5zZXRNaW51dGVzKDApLGEuc2V0U2Vjb25kcygwKSxhLnNldE1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKCJtb250aCI9PT10aGlzLmludGVydmFsVHlwZSl7aWYoMTxhLmdldERhdGUoKXx8MDxhLmdldEhvdXJzKCl8fDA8YS5nZXRNaW51dGVzKCl8fDA8YS5nZXRTZWNvbmRzKCl8fDA8YS5nZXRNaWxsaXNlY29uZHMoKSlhLnNldE1vbnRoKGEuZ2V0TW9udGgoKSsxKSxhLnNldERhdGUoMSksYS5zZXRIb3VycygwKSxhLnNldE1pbnV0ZXMoMCksCithLnNldFNlY29uZHMoMCksYS5zZXRNaWxsaXNlY29uZHMoMCl9ZWxzZSJ5ZWFyIj09PXRoaXMuaW50ZXJ2YWxUeXBlJiYoMDxhLmdldE1vbnRoKCl8fDE8YS5nZXREYXRlKCl8fDA8YS5nZXRIb3VycygpfHwwPGEuZ2V0TWludXRlcygpfHwwPGEuZ2V0U2Vjb25kcygpfHwwPGEuZ2V0TWlsbGlzZWNvbmRzKCkpJiYoYS5zZXRGdWxsWWVhcihhLmdldEZ1bGxZZWFyKCkrMSksYS5zZXRNb250aCgwKSxhLnNldERhdGUoMSksYS5zZXRIb3VycygwKSxhLnNldE1pbnV0ZXMoMCksYS5zZXRTZWNvbmRzKDApLGEuc2V0TWlsbGlzZWNvbmRzKDApKTtyZXR1cm4gYX07TyhtYSxMKTtPKE4sTCk7Ti5wcm90b3R5cGUuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXtpZih0aGlzLmVuYWJsZWQpe3RoaXMuY29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJjYW52YXNqcy1jaGFydC10b29sdGlwIik7dGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb249CisiYWJzb2x1dGUiO3RoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodD0iYXV0byI7dGhpcy5jb250YWluZXIuc3R5bGUuYm94U2hhZG93PSIxcHggMXB4IDJweCAycHggcmdiYSgwLDAsMCwwLjEpIjt0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXg9IjEwMDAiO3RoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBhO2E9JzxkaXYgc3R5bGU9IiB3aWR0aDogYXV0bztoZWlnaHQ6IGF1dG87bWluLXdpZHRoOiA1MHB4Oyc7YSs9ImxpbmUtaGVpZ2h0OiAyMHB4OyI7YSs9Im1hcmdpbjogMHB4IDBweCAwcHggMHB4OyI7YSs9InBhZGRpbmc6IDVweDsiO2ErPSJmb250LWZhbWlseTogQ2FsaWJyaSwgQXJpYWwsIEdlb3JnaWEsIHNlcmlmOyI7YSs9ImZvbnQtd2VpZ2h0OiA0MDA7IjthKz0iZm9udC1zdHlsZTogIisodD8iaXRhbGljOyI6Im5vcm1hbDsiKTthKz0iZm9udC1zaXplOiAxNHB4OyI7YSs9ImNvbG9yOiAjMDAwMDAwOyI7YSs9InRleHQtc2hhZG93OiAxcHggMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMSk7IjsKK2ErPSJ0ZXh0LWFsaWduOiBsZWZ0OyI7YSs9ImJvcmRlcjogMnB4IHNvbGlkIGdyYXk7IjthKz10PyJiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LC45KTsiOiJiYWNrZ3JvdW5kOiByZ2IoMjU1LDI1NSwyNTUpOyI7YSs9InRleHQtaW5kZW50OiAwcHg7IjthKz0id2hpdGUtc3BhY2U6IG5vd3JhcDsiO2ErPSJib3JkZXItcmFkaXVzOiA1cHg7IjthKz0iLW1vei11c2VyLXNlbGVjdDpub25lOyI7YSs9Ii1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsiO2ErPSItd2Via2l0LXVzZXItc2VsZWN0OiBub25lOyI7YSs9Ii1tcy11c2VyLXNlbGVjdDogbm9uZTsiO2ErPSJ1c2VyLXNlbGVjdDogbm9uZTsiO3R8fChhKz0iZmlsdGVyOiBhbHBoYShvcGFjaXR5ID0gOTApOyIsYSs9ImZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LlNoYWRvdyhTdHJlbmd0aD0zLCBEaXJlY3Rpb249MTM1LCBDb2xvcj0nIzY2NjY2NicpOyIpO2ErPSd9ICI+IFNhbXBsZSBUb29sdGlwPC9kaXY+JzsKK3RoaXMuY29udGFpbmVyLmlubmVySFRNTD1hO3RoaXMuY29udGVudERpdj10aGlzLmNvbnRhaW5lci5maXJzdENoaWxkO3RoaXMuY29udGFpbmVyLnN0eWxlLmJvcmRlclJhZGl1cz10aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyUmFkaXVzO3RoaXMuY2hhcnQuX2NhbnZhc0pTQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKX19O04ucHJvdG90eXBlLm1vdXNlTW92ZUhhbmRsZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLl9sYXN0VXBkYXRlZCYmNDA+KG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fbGFzdFVwZGF0ZWR8fCh0aGlzLl9sYXN0VXBkYXRlZD0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLl91cGRhdGVUb29sVGlwKGEsYikpfTtOLnByb3RvdHlwZS5fdXBkYXRlVG9vbFRpcD1mdW5jdGlvbihhLGIpe2lmKHRoaXMuZW5hYmxlZCYmIXRoaXMuY2hhcnQuZGlzYWJsZVRvb2xUaXApe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGIpe2lmKGlzTmFOKHRoaXMuX3ByZXZYKXx8Citpc05hTih0aGlzLl9wcmV2WSkpcmV0dXJuO2E9dGhpcy5fcHJldlg7Yj10aGlzLl9wcmV2WX1lbHNlIHRoaXMuX3ByZXZYPWEsdGhpcy5fcHJldlk9Yjt2YXIgYz1udWxsLGQ9bnVsbCxlPVtdLGY9MDtpZih0aGlzLnNoYXJlZCYmIm5vbmUiIT09dGhpcy5jaGFydC5wbG90SW5mby5heGlzUGxhY2VtZW50KXtmPSJ4eVN3YXBwZWQiPT09dGhpcy5jaGFydC5wbG90SW5mby5heGlzUGxhY2VtZW50Pyh0aGlzLmNoYXJ0LmF4aXNYLm1heGltdW0tdGhpcy5jaGFydC5heGlzWC5taW5pbXVtKS90aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy5oZWlnaHQqKHRoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLnkyLWIpK3RoaXMuY2hhcnQuYXhpc1gubWluaW11bToodGhpcy5jaGFydC5heGlzWC5tYXhpbXVtLXRoaXMuY2hhcnQuYXhpc1gubWluaW11bSkvdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMud2lkdGgqKGEtdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEpKwordGhpcy5jaGFydC5heGlzWC5taW5pbXVtO2M9W107Zm9yKGQ9MDtkPHRoaXMuY2hhcnQuZGF0YS5sZW5ndGg7ZCsrKXt2YXIgZz10aGlzLmNoYXJ0LmRhdGFbZF0uZ2V0RGF0YVBvaW50QXRYKGYsITApO2cmJjA8PWcuaW5kZXgmJihnLmRhdGFTZXJpZXM9dGhpcy5jaGFydC5kYXRhW2RdLG51bGwhPT1nLmRhdGFQb2ludC55JiZjLnB1c2goZykpfWlmKDA9PT1jLmxlbmd0aClyZXR1cm47Yy5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZGlzdGFuY2UtYi5kaXN0YW5jZX0pO2Y9Y1swXTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF0uZGF0YVBvaW50LngudmFsdWVPZigpPT09Zi5kYXRhUG9pbnQueC52YWx1ZU9mKCkmJmUucHVzaChjW2RdKTtjPW51bGx9ZWxzZSBpZigoZz10aGlzLmNoYXJ0LmdldERhdGFQb2ludEF0WFkoYSxiLCEwKSk/KHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4PWcuZGF0YVBvaW50SW5kZXgsdGhpcy5jdXJyZW50U2VyaWVzSW5kZXg9Zy5kYXRhU2VyaWVzLmluZGV4KToKK3Q/KGc9dGEoYSxiLHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5naG9zdEN0eCksMDxnJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2ddPyhldmVudE9iamVjdD10aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2ddLHRoaXMuY3VycmVudFNlcmllc0luZGV4PWV2ZW50T2JqZWN0LmRhdGFTZXJpZXNJbmRleCx0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleD0wPD1ldmVudE9iamVjdC5kYXRhUG9pbnRJbmRleD9ldmVudE9iamVjdC5kYXRhUG9pbnRJbmRleDotMSk6dGhpcy5jdXJyZW50RGF0YVBvaW50SW5kZXg9LTEpOnRoaXMuY3VycmVudERhdGFQb2ludEluZGV4PS0xLDA8PXRoaXMuY3VycmVudFNlcmllc0luZGV4KXtkPXRoaXMuY2hhcnQuZGF0YVt0aGlzLmN1cnJlbnRTZXJpZXNJbmRleF07Zz17fTtpZigwPD10aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleCljPWQuZGF0YVBvaW50c1t0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleF0sCitnLmRhdGFTZXJpZXM9ZCxnLmRhdGFQb2ludD1jLGcuaW5kZXg9dGhpcy5jdXJyZW50RGF0YVBvaW50SW5kZXgsZy5kaXN0YW5jZT1NYXRoLmFicyhjLngtZik7ZWxzZSBpZigibGluZSI9PT1kLnR5cGV8fCJzdGVwTGluZSI9PT1kLnR5cGV8fCJzcGxpbmUiPT09ZC50eXBlfHwiYXJlYSI9PT1kLnR5cGV8fCJzdGVwQXJlYSI9PT1kLnR5cGV8fCJzcGxpbmVBcmVhIj09PWQudHlwZXx8InN0YWNrZWRBcmVhIj09PWQudHlwZXx8InN0YWNrZWRBcmVhMTAwIj09PWQudHlwZXx8InJhbmdlQXJlYSI9PT1kLnR5cGV8fCJyYW5nZVNwbGluZUFyZWEiPT09ZC50eXBlfHwiY2FuZGxlc3RpY2siPT09ZC50eXBlfHwib2hsYyI9PT1kLnR5cGUpZj0odGhpcy5jaGFydC5heGlzWC5tYXhpbXVtLXRoaXMuY2hhcnQuYXhpc1gubWluaW11bSkvdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMud2lkdGgqKGEtdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEpK3RoaXMuY2hhcnQuYXhpc1gubWluaW11bS52YWx1ZU9mKCksCitnPWQuZ2V0RGF0YVBvaW50QXRYKGYsITApLGcuZGF0YVNlcmllcz1kLHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4PWcuaW5kZXgsYz1nLmRhdGFQb2ludDtlbHNlIHJldHVybjtudWxsIT09Zy5kYXRhUG9pbnQueSYmZS5wdXNoKGcpfWlmKDA8ZS5sZW5ndGgpaWYodGhpcy5oaWdobGlnaHRPYmplY3RzKGUpLGY9IiIsZj10aGlzLmdldFRvb2xUaXBJbm5lckhUTUwoe2VudHJpZXM6ZX0pLG51bGwhPT1mKXt0aGlzLmNvbnRlbnREaXYuaW5uZXJIVE1MPWY7dGhpcy5jb250ZW50RGl2LmlubmVySFRNTD1mO2Y9ITE7Im5vbmUiPT09dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSYmKGY9ITAsdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0cnl7dGhpcy5jb250ZW50RGl2LnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9dGhpcy5jb250ZW50RGl2LnN0eWxlLmJvcmRlckxlZnRDb2xvcj10aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyQ29sb3I9dGhpcy5ib3JkZXJDb2xvcj8KK3RoaXMuYm9yZGVyQ29sb3I6ZVswXS5kYXRhUG9pbnQuY29sb3I/ZVswXS5kYXRhUG9pbnQuY29sb3I6ZVswXS5kYXRhU2VyaWVzLmNvbG9yP2VbMF0uZGF0YVNlcmllcy5jb2xvcjplWzBdLmRhdGFTZXJpZXMuX2NvbG9yU2V0W2VbMF0uaW5kZXglZVswXS5kYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdfWNhdGNoKGspe30icGllIj09PWVbMF0uZGF0YVNlcmllcy50eXBlfHwiZG91Z2hudXQiPT09ZVswXS5kYXRhU2VyaWVzLnR5cGV8fCJmdW5uZWwiPT09ZVswXS5kYXRhU2VyaWVzLnR5cGV8fCJiYXIiPT09ZVswXS5kYXRhU2VyaWVzLnR5cGV8fCJyYW5nZUJhciI9PT1lWzBdLmRhdGFTZXJpZXMudHlwZXx8InN0YWNrZWRCYXIiPT09ZVswXS5kYXRhU2VyaWVzLnR5cGV8fCJzdGFja2VkQmFyMTAwIj09PWVbMF0uZGF0YVNlcmllcy50eXBlP3Rvb2xUaXBMZWZ0PWEtMTAtdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGg6KHRvb2xUaXBMZWZ0PXRoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLndpZHRoLworTWF0aC5hYnModGhpcy5jaGFydC5heGlzWC5tYXhpbXVtLXRoaXMuY2hhcnQuYXhpc1gubWluaW11bSkqTWF0aC5hYnMoZVswXS5kYXRhUG9pbnQueC10aGlzLmNoYXJ0LmF4aXNYLm1pbmltdW0pK3RoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLngxKzAuNS10aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aDw8MCx0b29sVGlwTGVmdC09MTApOzA+dG9vbFRpcExlZnQmJih0b29sVGlwTGVmdCs9dGhpcy5jb250YWluZXIuY2xpZW50V2lkdGgrMjApO3Rvb2xUaXBMZWZ0K3RoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoPnRoaXMuY2hhcnQuX2NvbnRhaW5lci5jbGllbnRXaWR0aCYmKHRvb2xUaXBMZWZ0PU1hdGgubWF4KDAsdGhpcy5jaGFydC5fY29udGFpbmVyLmNsaWVudFdpZHRoLXRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoKSk7dG9vbFRpcExlZnQrPSJweCI7ZT0xIT09ZS5sZW5ndGh8fHRoaXMuc2hhcmVkfHwibGluZSIhPT1lWzBdLmRhdGFTZXJpZXMudHlwZSYmInN0ZXBMaW5lIiE9PQorZVswXS5kYXRhU2VyaWVzLnR5cGUmJiJzcGxpbmUiIT09ZVswXS5kYXRhU2VyaWVzLnR5cGUmJiJhcmVhIiE9PWVbMF0uZGF0YVNlcmllcy50eXBlJiYic3RlcEFyZWEiIT09ZVswXS5kYXRhU2VyaWVzLnR5cGUmJiJzcGxpbmVBcmVhIiE9PWVbMF0uZGF0YVNlcmllcy50eXBlJiYic3RhY2tlZEFyZWEiIT09ZVswXS5kYXRhU2VyaWVzLnR5cGUmJiJzdGFja2VkQXJlYTEwMCIhPT1lWzBdLmRhdGFTZXJpZXMudHlwZT8iYmFyIj09PWVbMF0uZGF0YVNlcmllcy50eXBlfHwicmFuZ2VCYXIiPT09ZVswXS5kYXRhU2VyaWVzLnR5cGV8fCJzdGFja2VkQmFyIj09PWVbMF0uZGF0YVNlcmllcy50eXBlfHwic3RhY2tlZEJhcjEwMCI9PT1lWzBdLmRhdGFTZXJpZXMudHlwZT9lWzBdLmRhdGFTZXJpZXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLnkyLWVbMF0uZGF0YVNlcmllcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0L01hdGguYWJzKGVbMF0uZGF0YVNlcmllcy5heGlzWC5tYXhpbXVtLQorZVswXS5kYXRhU2VyaWVzLmF4aXNYLm1pbmltdW0pKk1hdGguYWJzKGVbMF0uZGF0YVBvaW50LngtZVswXS5kYXRhU2VyaWVzLmF4aXNYLm1pbmltdW0pKzAuNTw8MDpiOmVbMF0uZGF0YVNlcmllcy5heGlzWS5saW5lQ29vcmRpbmF0ZXMueTItZVswXS5kYXRhU2VyaWVzLmF4aXNZLmxpbmVDb29yZGluYXRlcy5oZWlnaHQvTWF0aC5hYnMoZVswXS5kYXRhU2VyaWVzLmF4aXNZLm1heGltdW0tZVswXS5kYXRhU2VyaWVzLmF4aXNZLm1pbmltdW0pKk1hdGguYWJzKGVbMF0uZGF0YVBvaW50LnktZVswXS5kYXRhU2VyaWVzLmF4aXNZLm1pbmltdW0pKzAuNTw8MDtlPS1lKzEwOzA8ZSt0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQrNSYmKGUtPWUrdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0KzUtMCk7dGhpcy5jb250YWluZXIuc3R5bGUubGVmdD10b29sVGlwTGVmdDt0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b209ZSsicHgiOyF0aGlzLmFuaW1hdGlvbkVuYWJsZWR8fGY/dGhpcy5kaXNhYmxlQW5pbWF0aW9uKCk6Cit0aGlzLmVuYWJsZUFuaW1hdGlvbigpfWVsc2UgdGhpcy5oaWRlKCExKX19O04ucHJvdG90eXBlLmhpZ2hsaWdodE9iamVjdHM9ZnVuY3Rpb24oYSl7aWYodGhpcy5lbmFibGVkKXt2YXIgYj10aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4O3RoaXMuY2hhcnQucmVzZXRPdmVybGF5ZWRDYW52YXMoKTtiLnNhdmUoKTtmb3IodmFyIGM9MCxkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWFbZF07aWYoKGU9dGhpcy5jaGFydC5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtlLmRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2UuaW5kZXhdXSkmJmUub2JqZWN0VHlwZSYmImRhdGFQb2ludCI9PT1lLm9iamVjdFR5cGUpe3ZhciBjPXRoaXMuY2hhcnQuZGF0YVtlLmRhdGFTZXJpZXNJbmRleF0sZj1lLmRhdGFQb2ludEluZGV4O2lmKCJsaW5lIj09PWMudHlwZXx8InN0ZXBMaW5lIj09PWMudHlwZXx8InNwbGluZSI9PT1jLnR5cGV8fCJzY2F0dGVyIj09PWMudHlwZXx8ImFyZWEiPT09Yy50eXBlfHwKKyJzdGVwQXJlYSI9PT1jLnR5cGV8fCJzcGxpbmVBcmVhIj09PWMudHlwZXx8InN0YWNrZWRBcmVhIj09PWMudHlwZXx8InN0YWNrZWRBcmVhMTAwIj09PWMudHlwZXx8InJhbmdlQXJlYSI9PT1jLnR5cGV8fCJyYW5nZVNwbGluZUFyZWEiPT09Yy50eXBlKXt2YXIgZz1jLmdldE1hcmtlclByb3BlcnRpZXMoZixlLngxLGUueTEsdGhpcy5jaGFydC5vdmVybGFpZENhbnZhc0N0eCk7Zy5zaXplPU1hdGgubWF4KDEuNSpnLnNpemU8PDAsMTApO2cuYm9yZGVyQ29sb3I9Zy5ib3JkZXJDb2xvcnx8IiNGRkZGRkYiO2cuYm9yZGVyVGhpY2tuZXNzPWcuYm9yZGVyVGhpY2tuZXNzfHxNYXRoLmNlaWwoMC4xKmcuc2l6ZSk7Si5kcmF3TWFya2VycyhbZ10pOyJ1bmRlZmluZWQiIT09dHlwZW9mIGUueTImJihnPWMuZ2V0TWFya2VyUHJvcGVydGllcyhmLGUueDEsZS55Mix0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4KSxnLnNpemU9TWF0aC5tYXgoMS41Kmcuc2l6ZTw8MCwxMCksZy5ib3JkZXJDb2xvcj0KK2cuYm9yZGVyQ29sb3J8fCIjRkZGRkZGIixnLmJvcmRlclRoaWNrbmVzcz1nLmJvcmRlclRoaWNrbmVzc3x8TWF0aC5jZWlsKDAuMSpnLnNpemUpLEouZHJhd01hcmtlcnMoW2ddKSl9ZWxzZSJidWJibGUiPT09Yy50eXBlPyhnPWMuZ2V0TWFya2VyUHJvcGVydGllcyhmLGUueDEsZS55MSx0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4KSxnLnNpemU9ZS5zaXplLGcuY29sb3I9IndoaXRlIixnLmJvcmRlckNvbG9yPSJ3aGl0ZSIsYi5nbG9iYWxBbHBoYT0wLjMsSi5kcmF3TWFya2VycyhbZ10pLGIuZ2xvYmFsQWxwaGE9MSk6ImNvbHVtbiI9PT1jLnR5cGV8fCJzdGFja2VkQ29sdW1uIj09PWMudHlwZXx8InN0YWNrZWRDb2x1bW4xMDAiPT09Yy50eXBlfHwiYmFyIj09PWMudHlwZXx8InJhbmdlQmFyIj09PWMudHlwZXx8InN0YWNrZWRCYXIiPT09Yy50eXBlfHwic3RhY2tlZEJhcjEwMCI9PT1jLnR5cGV8fCJyYW5nZUNvbHVtbiI9PT1jLnR5cGU/RihiLGUueDEsZS55MSxlLngyLAorZS55Miwid2hpdGUiLDAsbnVsbCwhMSwhMSwhMSwhMSwwLjMpOiJwaWUiPT09Yy50eXBlfHwiZG91Z2hudXQiPT09Yy50eXBlP3BhKGIsZS5jZW50ZXIsZS5yYWRpdXMsIndoaXRlIixjLnR5cGUsZS5zdGFydEFuZ2xlLGUuZW5kQW5nbGUsMC4zKToiY2FuZGxlc3RpY2siPT09Yy50eXBlPyhiLmdsb2JhbEFscGhhPTEsYi5zdHJva2VTdHlsZT1lLmNvbG9yLGIubGluZVdpZHRoPTIqZS5ib3JkZXJUaGlja25lc3MsYz0wPT09Yi5saW5lV2lkdGglMj8wOjAuNSxiLmJlZ2luUGF0aCgpLGIubW92ZVRvKGUueDMtYyxlLnkyKSxiLmxpbmVUbyhlLngzLWMsTWF0aC5taW4oZS55MSxlLnk0KSksYi5zdHJva2UoKSxiLmJlZ2luUGF0aCgpLGIubW92ZVRvKGUueDMtYyxNYXRoLm1heChlLnkxLGUueTQpKSxiLmxpbmVUbyhlLngzLWMsZS55MyksYi5zdHJva2UoKSxGKGIsZS54MSxNYXRoLm1pbihlLnkxLGUueTQpLGUueDIsTWF0aC5tYXgoZS55MSxlLnk0KSwidHJhbnNwYXJlbnQiLDIqZS5ib3JkZXJUaGlja25lc3MsCitlLmNvbG9yLCExLCExLCExLCExKSxiLmdsb2JhbEFscGhhPTEpOiJvaGxjIj09PWMudHlwZSYmKGIuZ2xvYmFsQWxwaGE9MSxiLnN0cm9rZVN0eWxlPWUuY29sb3IsYi5saW5lV2lkdGg9MiplLmJvcmRlclRoaWNrbmVzcyxjPTA9PT1iLmxpbmVXaWR0aCUyPzA6MC41LGIuYmVnaW5QYXRoKCksYi5tb3ZlVG8oZS54My1jLGUueTIpLGIubGluZVRvKGUueDMtYyxlLnkzKSxiLnN0cm9rZSgpLGIuYmVnaW5QYXRoKCksYi5tb3ZlVG8oZS54MyxlLnkxKSxiLmxpbmVUbyhlLngxLGUueTEpLGIuc3Ryb2tlKCksYi5iZWdpblBhdGgoKSxiLm1vdmVUbyhlLngzLGUueTQpLGIubGluZVRvKGUueDIsZS55NCksYi5zdHJva2UoKSxiLmdsb2JhbEFscGhhPTEpfX1iLmdsb2JhbEFscGhhPTE7Yi5iZWdpblBhdGgoKX19O04ucHJvdG90eXBlLmdldFRvb2xUaXBJbm5lckhUTUw9ZnVuY3Rpb24oYSl7YT1hLmVudHJpZXM7Zm9yKHZhciBiPW51bGwsYz1udWxsLGQ9bnVsbCxlPTAsZj0iIixnPSEwLGs9CiswO2s8YS5sZW5ndGg7aysrKWlmKGFba10uZGF0YVNlcmllcy50b29sVGlwQ29udGVudHx8YVtrXS5kYXRhUG9pbnQudG9vbFRpcENvbnRlbnQpe2c9ITE7YnJlYWt9aWYoZyYmdGhpcy5jb250ZW50JiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGVudCliPXRoaXMuY29udGVudCh7ZW50cmllczphfSk7ZWxzZSBpZih0aGlzLnNoYXJlZCl7Zm9yKHZhciBwPSIiLGs9MDtrPGEubGVuZ3RoO2srKylpZihjPWFba10uZGF0YVNlcmllcyxkPWFba10uZGF0YVBvaW50LGU9YVtrXS5pbmRleCxmPSIiLDA9PT1rJiYoZyYmIXRoaXMuY29udGVudCkmJihwKz0idW5kZWZpbmVkIiE9PXR5cGVvZiB0aGlzLmNoYXJ0LmF4aXNYLmxhYmVsc1tkLnhdP3RoaXMuY2hhcnQuYXhpc1gubGFiZWxzW2QueF06Int4fSIscCs9IjwvYnI+IixwPXRoaXMuY2hhcnQucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKHAsZCxjLGUpKSxudWxsIT09ZC50b29sVGlwQ29udGVudCYmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGQudG9vbFRpcENvbnRlbnR8fAorbnVsbCE9PWMuX29wdGlvbnMudG9vbFRpcENvbnRlbnQpKXtpZigibGluZSI9PT1jLnR5cGV8fCJzdGVwTGluZSI9PT1jLnR5cGV8fCJzcGxpbmUiPT09Yy50eXBlfHwiYXJlYSI9PT1jLnR5cGV8fCJzdGVwQXJlYSI9PT1jLnR5cGV8fCJzcGxpbmVBcmVhIj09PWMudHlwZXx8ImNvbHVtbiI9PT1jLnR5cGV8fCJiYXIiPT09Yy50eXBlfHwic2NhdHRlciI9PT1jLnR5cGV8fCJzdGFja2VkQ29sdW1uIj09PWMudHlwZXx8InN0YWNrZWRDb2x1bW4xMDAiPT09Yy50eXBlfHwic3RhY2tlZEJhciI9PT1jLnR5cGV8fCJzdGFja2VkQmFyMTAwIj09PWMudHlwZXx8InN0YWNrZWRBcmVhIj09PWMudHlwZXx8InN0YWNrZWRBcmVhMTAwIj09PWMudHlwZSlmKz1kLnRvb2xUaXBDb250ZW50P2QudG9vbFRpcENvbnRlbnQ6Yy50b29sVGlwQ29udGVudD9jLnRvb2xUaXBDb250ZW50OnRoaXMuY29udGVudCYmImZ1bmN0aW9uIiE9PXR5cGVvZiB0aGlzLmNvbnRlbnQ/dGhpcy5jb250ZW50OiI8c3BhbiBzdHlsZT0nXCInY29sb3I6e2NvbG9yfTsnXCInPntuYW1lfTo8L3NwYW4+Jm5ic3A7Jm5ic3A7e3l9IjsKK2Vsc2UgaWYoImJ1YmJsZSI9PT1jLnR5cGUpZis9ZC50b29sVGlwQ29udGVudD9kLnRvb2xUaXBDb250ZW50OmMudG9vbFRpcENvbnRlbnQ/Yy50b29sVGlwQ29udGVudDp0aGlzLmNvbnRlbnQmJiJmdW5jdGlvbiIhPT10eXBlb2YgdGhpcy5jb250ZW50P3RoaXMuY29udGVudDoiPHNwYW4gc3R5bGU9J1wiJ2NvbG9yOntjb2xvcn07J1wiJz57bmFtZX06PC9zcGFuPiZuYnNwOyZuYnNwO3t5fSwgJm5ic3A7Jm5ic3A7e3p9IjtlbHNlIGlmKCJwaWUiPT09Yy50eXBlfHwiZG91Z2hudXQiPT09Yy50eXBlfHwiZnVubmVsIj09PWMudHlwZSlmKz1kLnRvb2xUaXBDb250ZW50P2QudG9vbFRpcENvbnRlbnQ6Yy50b29sVGlwQ29udGVudD9jLnRvb2xUaXBDb250ZW50OnRoaXMuY29udGVudCYmImZ1bmN0aW9uIiE9PXR5cGVvZiB0aGlzLmNvbnRlbnQ/dGhpcy5jb250ZW50OiImbmJzcDsmbmJzcDt7eX0iO2Vsc2UgaWYoInJhbmdlQ29sdW1uIj09PWMudHlwZXx8InJhbmdlQmFyIj09PWMudHlwZXx8CisicmFuZ2VBcmVhIj09PWMudHlwZXx8InJhbmdlU3BsaW5lQXJlYSI9PT1jLnR5cGUpZis9ZC50b29sVGlwQ29udGVudD9kLnRvb2xUaXBDb250ZW50OmMudG9vbFRpcENvbnRlbnQ/Yy50b29sVGlwQ29udGVudDp0aGlzLmNvbnRlbnQmJiJmdW5jdGlvbiIhPT10eXBlb2YgdGhpcy5jb250ZW50P3RoaXMuY29udGVudDoiPHNwYW4gc3R5bGU9J1wiJ2NvbG9yOntjb2xvcn07J1wiJz57bmFtZX06PC9zcGFuPiZuYnNwOyZuYnNwO3t5WzBdfSwmbmJzcDt7eVsxXX0iO2Vsc2UgaWYoImNhbmRsZXN0aWNrIj09PWMudHlwZXx8Im9obGMiPT09Yy50eXBlKWYrPWQudG9vbFRpcENvbnRlbnQ/ZC50b29sVGlwQ29udGVudDpjLnRvb2xUaXBDb250ZW50P2MudG9vbFRpcENvbnRlbnQ6dGhpcy5jb250ZW50JiYiZnVuY3Rpb24iIT09dHlwZW9mIHRoaXMuY29udGVudD90aGlzLmNvbnRlbnQ6IjxzcGFuIHN0eWxlPSdcIidjb2xvcjp7Y29sb3J9OydcIic+e25hbWV9Ojwvc3Bhbj48YnIvPk9wZW46ICZuYnNwOyZuYnNwO3t5WzBdfTxici8+SGlnaDogJm5ic3A7Jm5ic3A7Jm5ic3A7e3lbMV19PGJyLz5Mb3c6Jm5ic3A7Jm5ic3A7Jm5ic3A7e3lbMl19PGJyLz5DbG9zZTogJm5ic3A7Jm5ic3A7e3lbM119IjsKK251bGw9PT1iJiYoYj0iIik7Yis9dGhpcy5jaGFydC5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUoZixkLGMsZSk7azxhLmxlbmd0aC0xJiYoYis9IjwvYnI+Iil9bnVsbCE9PWImJihiPXArYil9ZWxzZXtjPWFbMF0uZGF0YVNlcmllcztkPWFbMF0uZGF0YVBvaW50O2U9YVswXS5pbmRleDtpZihudWxsPT09ZC50b29sVGlwQ29udGVudHx8InVuZGVmaW5lZCI9PT10eXBlb2YgZC50b29sVGlwQ29udGVudCYmbnVsbD09PWMuX29wdGlvbnMudG9vbFRpcENvbnRlbnQpcmV0dXJuIG51bGw7aWYoImxpbmUiPT09Yy50eXBlfHwic3RlcExpbmUiPT09Yy50eXBlfHwic3BsaW5lIj09PWMudHlwZXx8ImFyZWEiPT09Yy50eXBlfHwic3RlcEFyZWEiPT09Yy50eXBlfHwic3BsaW5lQXJlYSI9PT1jLnR5cGV8fCJjb2x1bW4iPT09Yy50eXBlfHwiYmFyIj09PWMudHlwZXx8InNjYXR0ZXIiPT09Yy50eXBlfHwic3RhY2tlZENvbHVtbiI9PT1jLnR5cGV8fCJzdGFja2VkQ29sdW1uMTAwIj09PWMudHlwZXx8Cisic3RhY2tlZEJhciI9PT1jLnR5cGV8fCJzdGFja2VkQmFyMTAwIj09PWMudHlwZXx8InN0YWNrZWRBcmVhIj09PWMudHlwZXx8InN0YWNrZWRBcmVhMTAwIj09PWMudHlwZSlmPWQudG9vbFRpcENvbnRlbnQ/ZC50b29sVGlwQ29udGVudDpjLnRvb2xUaXBDb250ZW50P2MudG9vbFRpcENvbnRlbnQ6dGhpcy5jb250ZW50JiYiZnVuY3Rpb24iIT09dHlwZW9mIHRoaXMuY29udGVudD90aGlzLmNvbnRlbnQ6IjxzcGFuIHN0eWxlPSdcIidjb2xvcjp7Y29sb3J9OydcIic+IisoZC5sYWJlbD8ie2xhYmVsfSI6Int4fSIpKyIgOjwvc3Bhbj4mbmJzcDsmbmJzcDt7eX0iO2Vsc2UgaWYoImJ1YmJsZSI9PT1jLnR5cGUpZj1kLnRvb2xUaXBDb250ZW50P2QudG9vbFRpcENvbnRlbnQ6Yy50b29sVGlwQ29udGVudD9jLnRvb2xUaXBDb250ZW50OnRoaXMuY29udGVudCYmImZ1bmN0aW9uIiE9PXR5cGVvZiB0aGlzLmNvbnRlbnQ/dGhpcy5jb250ZW50OiI8c3BhbiBzdHlsZT0nXCInY29sb3I6e2NvbG9yfTsnXCInPiIrCisoZC5sYWJlbD8ie2xhYmVsfSI6Int4fSIpKyI6PC9zcGFuPiZuYnNwOyZuYnNwO3t5fSwgJm5ic3A7Jm5ic3A7e3p9IjtlbHNlIGlmKCJwaWUiPT09Yy50eXBlfHwiZG91Z2hudXQiPT09Yy50eXBlfHwiZnVubmVsIj09PWMudHlwZSlmPWQudG9vbFRpcENvbnRlbnQ/ZC50b29sVGlwQ29udGVudDpjLnRvb2xUaXBDb250ZW50P2MudG9vbFRpcENvbnRlbnQ6dGhpcy5jb250ZW50JiYiZnVuY3Rpb24iIT09dHlwZW9mIHRoaXMuY29udGVudD90aGlzLmNvbnRlbnQ6KGQubmFtZT8ie25hbWV9OiZuYnNwOyZuYnNwOyI6ZC5sYWJlbD8ie2xhYmVsfTombmJzcDsmbmJzcDsiOiIiKSsie3l9IjtlbHNlIGlmKCJyYW5nZUNvbHVtbiI9PT1jLnR5cGV8fCJyYW5nZUJhciI9PT1jLnR5cGV8fCJyYW5nZUFyZWEiPT09Yy50eXBlfHwicmFuZ2VTcGxpbmVBcmVhIj09PWMudHlwZSlmPWQudG9vbFRpcENvbnRlbnQ/ZC50b29sVGlwQ29udGVudDpjLnRvb2xUaXBDb250ZW50P2MudG9vbFRpcENvbnRlbnQ6Cit0aGlzLmNvbnRlbnQmJiJmdW5jdGlvbiIhPT10eXBlb2YgdGhpcy5jb250ZW50P3RoaXMuY29udGVudDoiPHNwYW4gc3R5bGU9J1wiJ2NvbG9yOntjb2xvcn07J1wiJz4iKyhkLmxhYmVsPyJ7bGFiZWx9Ijoie3h9IikrIiA6PC9zcGFuPiZuYnNwOyZuYnNwO3t5WzBdfSwgJm5ic3A7e3lbMV19IjtlbHNlIGlmKCJjYW5kbGVzdGljayI9PT1jLnR5cGV8fCJvaGxjIj09PWMudHlwZSlmPWQudG9vbFRpcENvbnRlbnQ/ZC50b29sVGlwQ29udGVudDpjLnRvb2xUaXBDb250ZW50P2MudG9vbFRpcENvbnRlbnQ6dGhpcy5jb250ZW50JiYiZnVuY3Rpb24iIT09dHlwZW9mIHRoaXMuY29udGVudD90aGlzLmNvbnRlbnQ6IjxzcGFuIHN0eWxlPSdcIidjb2xvcjp7Y29sb3J9OydcIic+IisoZC5sYWJlbD8ie2xhYmVsfSI6Int4fSIpKyI8L3NwYW4+PGJyLz5PcGVuOiAmbmJzcDsmbmJzcDt7eVswXX08YnIvPkhpZ2g6ICZuYnNwOyZuYnNwOyZuYnNwO3t5WzFdfTxici8+TG93OiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7eVsyXX08YnIvPkNsb3NlOiAmbmJzcDsmbmJzcDt7eVszXX0iOworbnVsbD09PWImJihiPSIiKTtiKz10aGlzLmNoYXJ0LnJlcGxhY2VLZXl3b3Jkc1dpdGhWYWx1ZShmLGQsYyxlKX1yZXR1cm4gYn07Ti5wcm90b3R5cGUuZW5hYmxlQW5pbWF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5jb250YWluZXIuc3R5bGUuV2Via2l0VHJhbnNpdGlvbnx8KHRoaXMuY29udGFpbmVyLnN0eWxlLldlYmtpdFRyYW5zaXRpb249ImxlZnQgLjJzIGVhc2Utb3V0LCBib3R0b20gLjJzIGVhc2Utb3V0Iix0aGlzLmNvbnRhaW5lci5zdHlsZS5Nb3pUcmFuc2l0aW9uPSJsZWZ0IC4ycyBlYXNlLW91dCwgYm90dG9tIC4ycyBlYXNlLW91dCIsdGhpcy5jb250YWluZXIuc3R5bGUuTXNUcmFuc2l0aW9uPSJsZWZ0IC4ycyBlYXNlLW91dCwgYm90dG9tIC4ycyBlYXNlLW91dCIsdGhpcy5jb250YWluZXIuc3R5bGUudHJhbnNpdGlvbj0ibGVmdCAuMnMgZWFzZS1vdXQsIGJvdHRvbSAuMnMgZWFzZS1vdXQiKX07Ti5wcm90b3R5cGUuZGlzYWJsZUFuaW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuY29udGFpbmVyLnN0eWxlLldlYmtpdFRyYW5zaXRpb24mJgorKHRoaXMuY29udGFpbmVyLnN0eWxlLldlYmtpdFRyYW5zaXRpb249IiIsdGhpcy5jb250YWluZXIuc3R5bGUuTW96VHJhbnNpdGlvbj0iIix0aGlzLmNvbnRhaW5lci5zdHlsZS5Nc1RyYW5zaXRpb249IiIsdGhpcy5jb250YWluZXIuc3R5bGUudHJhbnNpdGlvbj0iIil9O04ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYSl7dGhpcy5lbmFibGVkJiYodGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5jdXJyZW50U2VyaWVzSW5kZXg9LTEsdGhpcy5fcHJldlk9dGhpcy5fcHJldlg9TmFOLCgidW5kZWZpbmVkIj09PXR5cGVvZiBhfHxhKSYmdGhpcy5jaGFydC5yZXNldE92ZXJsYXllZENhbnZhcygpKX07di5wcm90b3R5cGUucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9dGhpcztlPSJ1bmRlZmluZWQiPT09dHlwZW9mIGU/MDplO2lmKCgwPD1jLnR5cGUuaW5kZXhPZigic3RhY2tlZCIpfHwicGllIj09PWMudHlwZXx8CisiZG91Z2hudXQiPT09Yy50eXBlKSYmKDA8PWEuaW5kZXhPZigiI3BlcmNlbnQiKXx8MDw9YS5pbmRleE9mKCIjdG90YWwiKSkpe3ZhciBnPSIjcGVyY2VudCIsaz0iI3RvdGFsIixwPW51bGw7aWYoMDw9Yy50eXBlLmluZGV4T2YoInN0YWNrZWQiKSlrPTAscD1iLnguZ2V0VGltZT9iLnguZ2V0VGltZSgpOmIueCxwIGluIGMucGxvdFVuaXQueVRvdGFscyYmKGs9Yy5wbG90VW5pdC55VG90YWxzW3BdLGc9aXNOYU4oYi55KT8wOjEwMCooYi55L2spKTtlbHNlIGlmKCJwaWUiPT09Yy50eXBlfHwiZG91Z2hudXQiPT09Yy50eXBlKXtmb3IoaT1rPTA7aTxjLmRhdGFQb2ludHMubGVuZ3RoO2krKylpc05hTihjLmRhdGFQb2ludHNbaV0ueSl8fChrKz1jLmRhdGFQb2ludHNbaV0ueSk7Zz1pc05hTihiLnkpPzA6MTAwKihiLnkvayl9ZG97cD0iIjtpZihjLnBlcmNlbnRGb3JtYXRTdHJpbmcpcD1jLnBlcmNlbnRGb3JtYXRTdHJpbmc7ZWxzZXt2YXIgcD0iIywjIzAuIixoPU1hdGgubWF4KE1hdGguY2VpbChNYXRoLmxvZygxLworTWF0aC5hYnMoZykpL01hdGguTE4xMCksMik7aWYoaXNOYU4oaCl8fCFpc0Zpbml0ZShoKSloPTI7Zm9yKHZhciBsPTA7bDxoO2wrKylwKz0iIyJ9YT1hLnJlcGxhY2UoIiNwZXJjZW50IixYKGcscCxmLl9jdWx0dXJlSW5mbykpO2E9YS5yZXBsYWNlKCIjdG90YWwiLFgoayxjLnlWYWx1ZUZvcm1hdFN0cmluZz9jLnlWYWx1ZUZvcm1hdFN0cmluZzoiIywjIzAuIyMjIyMjIyMiKSl9d2hpbGUoMDw9YS5pbmRleE9mKCIjcGVyY2VudCIpfHwwPD1hLmluZGV4T2YoIiN0b3RhbCIpKX1yZXR1cm4gYS5yZXBsYWNlKC9cey4qP1x9fCJbXiJdKiJ8J1teJ10qJy9nLGZ1bmN0aW9uKGEpe2lmKCciJz09PWFbMF0mJiciJz09PWFbYS5sZW5ndGgtMV18fCInIj09PWFbMF0mJiInIj09PWFbYS5sZW5ndGgtMV0pcmV0dXJuIGEuc2xpY2UoMSxhLmxlbmd0aC0xKTthPVooYS5zbGljZSgxLGEubGVuZ3RoLTEpKTthPWEucmVwbGFjZSgiI2luZGV4IixlKTt2YXIgZz1udWxsO3RyeXt2YXIgaD1hLm1hdGNoKC8oLio/KVxzKlxbXHMqKC4qPylccypcXS8pOworaCYmMDxoLmxlbmd0aCYmKGc9WihoWzJdKSxhPVooaFsxXSkpfWNhdGNoKGspe31oPW51bGw7aWYoImNvbG9yIj09PWEpcmV0dXJuIGIuY29sb3I/Yi5jb2xvcjpjLmNvbG9yP2MuY29sb3I6Yy5fY29sb3JTZXRbZCVjLl9jb2xvclNldC5sZW5ndGhdO2lmKGIuaGFzT3duUHJvcGVydHkoYSkpaD1iO2Vsc2UgaWYoYy5oYXNPd25Qcm9wZXJ0eShhKSloPWM7ZWxzZSByZXR1cm4iIjtoPWhbYV07bnVsbCE9PWcmJihoPWhbZ10pO3JldHVybiJ4Ij09PWE/Zi5heGlzWCYmImRhdGVUaW1lIj09PWYucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGU/eWEoaCxiLnhWYWx1ZUZvcm1hdFN0cmluZz9iLnhWYWx1ZUZvcm1hdFN0cmluZzpjLnhWYWx1ZUZvcm1hdFN0cmluZz9jLnhWYWx1ZUZvcm1hdFN0cmluZzpmLmF4aXNYJiZmLmF4aXNYLnZhbHVlRm9ybWF0U3RyaW5nP2YuYXhpc1gudmFsdWVGb3JtYXRTdHJpbmc6IkREIE1NTSBZWSIsZi5fY3VsdHVyZUluZm8pOlgoaCxiLnhWYWx1ZUZvcm1hdFN0cmluZz8KK2IueFZhbHVlRm9ybWF0U3RyaW5nOmMueFZhbHVlRm9ybWF0U3RyaW5nP2MueFZhbHVlRm9ybWF0U3RyaW5nOiIjLCMjMC4jIyMjIyMjIyIsZi5fY3VsdHVyZUluZm8pOiJ5Ij09PWE/WChoLGIueVZhbHVlRm9ybWF0U3RyaW5nP2IueVZhbHVlRm9ybWF0U3RyaW5nOmMueVZhbHVlRm9ybWF0U3RyaW5nP2MueVZhbHVlRm9ybWF0U3RyaW5nOiIjLCMjMC4jIyMjIyMjIyIsZi5fY3VsdHVyZUluZm8pOiJ6Ij09PWE/WChoLGIuelZhbHVlRm9ybWF0U3RyaW5nP2IuelZhbHVlRm9ybWF0U3RyaW5nOmMuelZhbHVlRm9ybWF0U3RyaW5nP2MuelZhbHVlRm9ybWF0U3RyaW5nOiIjLCMjMC4jIyMjIyMjIyIsZi5fY3VsdHVyZUluZm8pOmh9KX07JC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmxhc3RPYmplY3RJZD0wO3RoaXMub2JqZWN0TWFwPVtdO3RoaXMucmVjdGFuZ3VsYXJSZWdpb25FdmVudFN1YnNjcmlwdGlvbnM9W107dGhpcy5wcmV2aW91c0RhdGFQb2ludEV2ZW50T2JqZWN0PQorbnVsbDt0aGlzLmV2ZW50T2JqZWN0cz1bXTt0JiYodGhpcy5naG9zdEN0eC5jbGVhclJlY3QoMCwwLHRoaXMuY2hhcnQud2lkdGgsdGhpcy5jaGFydC5oZWlnaHQpLHRoaXMuZ2hvc3RDdHguYmVnaW5QYXRoKCkpfTskLnByb3RvdHlwZS5nZXROZXdPYmplY3RUcmFja2luZ0lkPWZ1bmN0aW9uKCl7cmV0dXJuKyt0aGlzLmxhc3RPYmplY3RJZH07JC5wcm90b3R5cGUubW91c2VFdmVudEhhbmRsZXI9ZnVuY3Rpb24oYSl7aWYoIm1vdXNlbW92ZSI9PT1hLnR5cGV8fCJjbGljayI9PT1hLnR5cGUpe3ZhciBiPVtdLGM9aWEoYSksZD1udWxsO2lmKChkPXRoaXMuY2hhcnQuZ2V0T2JqZWN0QXRYWShjLngsYy55LCExKSkmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHRoaXMub2JqZWN0TWFwW2RdKWlmKGQ9dGhpcy5vYmplY3RNYXBbZF0sImRhdGFQb2ludCI9PT1kLm9iamVjdFR5cGUpe3ZhciBlPXRoaXMuY2hhcnQuZGF0YVtkLmRhdGFTZXJpZXNJbmRleF0sZj1lLmRhdGFQb2ludHNbZC5kYXRhUG9pbnRJbmRleF0sCitnPWQuZGF0YVBvaW50SW5kZXg7ZC5ldmVudFBhcmFtZXRlcj17eDpjLngseTpjLnksZGF0YVBvaW50OmYsZGF0YVNlcmllczplLl9vcHRpb25zLGRhdGFQb2ludEluZGV4OmcsZGF0YVNlcmllc0luZGV4OmUuaW5kZXgsY2hhcnQ6dGhpcy5jaGFydC5fcHVibGljQ2hhcnRSZWZlcmVuY2V9O2QuZXZlbnRDb250ZXh0PXtjb250ZXh0OmYsdXNlckNvbnRleHQ6Zixtb3VzZW92ZXI6Im1vdXNlb3ZlciIsbW91c2Vtb3ZlOiJtb3VzZW1vdmUiLG1vdXNlb3V0OiJtb3VzZW91dCIsY2xpY2s6ImNsaWNrIn07Yi5wdXNoKGQpO2Q9dGhpcy5vYmplY3RNYXBbZS5pZF07ZC5ldmVudFBhcmFtZXRlcj17eDpjLngseTpjLnksZGF0YVBvaW50OmYsZGF0YVNlcmllczplLl9vcHRpb25zLGRhdGFQb2ludEluZGV4OmcsZGF0YVNlcmllc0luZGV4OmUuaW5kZXgsY2hhcnQ6dGhpcy5jaGFydC5fcHVibGljQ2hhcnRSZWZlcmVuY2V9O2QuZXZlbnRDb250ZXh0PXtjb250ZXh0OmUsdXNlckNvbnRleHQ6ZS5fb3B0aW9ucywKK21vdXNlb3ZlcjoibW91c2VvdmVyIixtb3VzZW1vdmU6Im1vdXNlbW92ZSIsbW91c2VvdXQ6Im1vdXNlb3V0IixjbGljazoiY2xpY2sifTtiLnB1c2godGhpcy5vYmplY3RNYXBbZS5pZF0pfWVsc2UibGVnZW5kSXRlbSI9PT1kLm9iamVjdFR5cGUmJihlPXRoaXMuY2hhcnQuZGF0YVtkLmRhdGFTZXJpZXNJbmRleF0sZj1udWxsIT09ZC5kYXRhUG9pbnRJbmRleD9lLmRhdGFQb2ludHNbZC5kYXRhUG9pbnRJbmRleF06bnVsbCxkLmV2ZW50UGFyYW1ldGVyPXt4OmMueCx5OmMueSxkYXRhU2VyaWVzOmUuX29wdGlvbnMsZGF0YVBvaW50OmYsZGF0YVBvaW50SW5kZXg6ZC5kYXRhUG9pbnRJbmRleCxkYXRhU2VyaWVzSW5kZXg6ZC5kYXRhU2VyaWVzSW5kZXgsY2hhcnQ6dGhpcy5jaGFydC5fcHVibGljQ2hhcnRSZWZlcmVuY2V9LGQuZXZlbnRDb250ZXh0PXtjb250ZXh0OnRoaXMuY2hhcnQubGVnZW5kLHVzZXJDb250ZXh0OnRoaXMuY2hhcnQubGVnZW5kLl9vcHRpb25zLG1vdXNlb3ZlcjoiaXRlbW1vdXNlb3ZlciIsCittb3VzZW1vdmU6Iml0ZW1tb3VzZW1vdmUiLG1vdXNlb3V0OiJpdGVtbW91c2VvdXQiLGNsaWNrOiJpdGVtY2xpY2sifSxiLnB1c2goZCkpO2U9W107Zm9yKGM9MDtjPHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzLmxlbmd0aDtjKyspe2Y9ITA7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylpZihiW2RdLmlkPT09dGhpcy5tb3VzZW92ZXJlZE9iamVjdE1hcHNbY10uaWQpe2Y9ITE7YnJlYWt9Zj90aGlzLmZpcmVFdmVudCh0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwc1tjXSwibW91c2VvdXQiLGEpOmUucHVzaCh0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwc1tjXSl9dGhpcy5tb3VzZW92ZXJlZE9iamVjdE1hcHM9ZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtlPSExO2ZvcihkPTA7ZDx0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwcy5sZW5ndGg7ZCsrKWlmKGJbY10uaWQ9PT10aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwc1tkXS5pZCl7ZT0hMDticmVha31lfHwodGhpcy5maXJlRXZlbnQoYltjXSwKKyJtb3VzZW92ZXIiLGEpLHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzLnB1c2goYltjXSkpOyJjbGljayI9PT1hLnR5cGU/dGhpcy5maXJlRXZlbnQoYltjXSwiY2xpY2siLGEpOiJtb3VzZW1vdmUiPT09YS50eXBlJiZ0aGlzLmZpcmVFdmVudChiW2NdLCJtb3VzZW1vdmUiLGEpfX19OyQucHJvdG90eXBlLmZpcmVFdmVudD1mdW5jdGlvbihhLGIsYyl7aWYoYSYmYil7dmFyIGQ9YS5ldmVudFBhcmFtZXRlcixlPWEuZXZlbnRDb250ZXh0LGY9YS5ldmVudENvbnRleHQudXNlckNvbnRleHQ7ZiYmKGUmJmZbZVtiXV0pJiZmW2VbYl1dLmNhbGwoZixkKTsibW91c2VvdXQiIT09Yj9mLmN1cnNvciYmZi5jdXJzb3IhPT1jLnRhcmdldC5zdHlsZS5jdXJzb3ImJihjLnRhcmdldC5zdHlsZS5jdXJzb3I9Zi5jdXJzb3IpOihjLnRhcmdldC5zdHlsZS5jdXJzb3I9dGhpcy5jaGFydC5fZGVmYXVsdEN1cnNvcixkZWxldGUgYS5ldmVudFBhcmFtZXRlcixkZWxldGUgYS5ldmVudENvbnRleHQpOworImNsaWNrIj09PWImJigiZGF0YVBvaW50Ij09PWEub2JqZWN0VHlwZSYmdGhpcy5jaGFydC5waWVEb3VnaG51dENsaWNrSGFuZGxlcikmJnRoaXMuY2hhcnQucGllRG91Z2hudXRDbGlja0hhbmRsZXIuY2FsbCh0aGlzLmNoYXJ0LmRhdGFbYS5kYXRhU2VyaWVzSW5kZXhdLGQpfX07Tyh4YSxMKTtvYS5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXM7dGhpcy5jaGFydC5pc0FuaW1hdGluZz0hMDtlPWV8fHkuZWFzaW5nLmxpbmVhcjtjJiZ0aGlzLmFuaW1hdGlvbnMucHVzaCh7c3RhcnRUaW1lOihuZXcgRGF0ZSkuZ2V0VGltZSgpKyhhP2E6MCksZHVyYXRpb246YixhbmltYXRpb25DYWxsYmFjazpjLG9uQ29tcGxldGU6ZH0pO2ZvcihhPVtdOzA8dGhpcy5hbmltYXRpb25zLmxlbmd0aDspaWYoYj10aGlzLmFuaW1hdGlvbnMuc2hpZnQoKSxjPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGQ9MCxiLnN0YXJ0VGltZTw9YyYmKGQ9ZShNYXRoLm1pbihjLWIuc3RhcnRUaW1lLAorYi5kdXJhdGlvbiksMCwxLGIuZHVyYXRpb24pLGQ9TWF0aC5taW4oZCwxKSxpc05hTihkKXx8IWlzRmluaXRlKGQpKSYmKGQ9MSksMT5kJiZhLnB1c2goYiksYi5hbmltYXRpb25DYWxsYmFjayhkKSwxPD1kJiZiLm9uQ29tcGxldGUpYi5vbkNvbXBsZXRlKCk7dGhpcy5hbmltYXRpb25zPWE7MDx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoP3RoaXMuYW5pbWF0aW9uUmVxdWVzdElkPXRoaXMuY2hhcnQucmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdyxmdW5jdGlvbigpe2YuYW5pbWF0ZS5jYWxsKGYpfSk6dGhpcy5jaGFydC5pc0FuaW1hdGluZz0hMX07b2EucHJvdG90eXBlLmNhbmNlbEFsbEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbnM9W107dGhpcy5hbmltYXRpb25SZXF1ZXN0SWQmJnRoaXMuY2hhcnQuY2FuY2VsUmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdyx0aGlzLmFuaW1hdGlvblJlcXVlc3RJZCk7dGhpcy5hbmltYXRpb25SZXF1ZXN0SWQ9bnVsbDt0aGlzLmNoYXJ0LmlzQW5pbWF0aW5nPQorITF9O3ZhciB5PXt5U2NhbGVBbmltYXRpb246ZnVuY3Rpb24oYSxiKXtpZigwIT09YSl7dmFyIGM9Yi5kZXN0LGQ9Yi5zb3VyY2UuY2FudmFzLGU9Yi5hbmltYXRpb25CYXNlO2MuZHJhd0ltYWdlKGQsMCwwLGQud2lkdGgsZC5oZWlnaHQsMCxlLWUqYSxjLmNhbnZhcy53aWR0aC9ILGEqYy5jYW52YXMuaGVpZ2h0L0gpfX0seFNjYWxlQW5pbWF0aW9uOmZ1bmN0aW9uKGEsYil7aWYoMCE9PWEpe3ZhciBjPWIuZGVzdCxkPWIuc291cmNlLmNhbnZhcyxlPWIuYW5pbWF0aW9uQmFzZTtjLmRyYXdJbWFnZShkLDAsMCxkLndpZHRoLGQuaGVpZ2h0LGUtZSphLDAsYSpjLmNhbnZhcy53aWR0aC9ILGMuY2FudmFzLmhlaWdodC9IKX19LHhDbGlwQW5pbWF0aW9uOmZ1bmN0aW9uKGEsYil7aWYoMCE9PWEpe3ZhciBjPWIuZGVzdCxkPWIuc291cmNlLmNhbnZhcztjLnNhdmUoKTswPGEmJmMuZHJhd0ltYWdlKGQsMCwwLGQud2lkdGgqYSxkLmhlaWdodCwwLDAsZC53aWR0aCphL0gsZC5oZWlnaHQvCitIKTtjLnJlc3RvcmUoKX19LGZhZGVJbkFuaW1hdGlvbjpmdW5jdGlvbihhLGIpe2lmKDAhPT1hKXt2YXIgYz1iLmRlc3QsZD1iLnNvdXJjZS5jYW52YXM7Yy5zYXZlKCk7Yy5nbG9iYWxBbHBoYT1hO2MuZHJhd0ltYWdlKGQsMCwwLGQud2lkdGgsZC5oZWlnaHQsMCwwLGMuY2FudmFzLndpZHRoL0gsYy5jYW52YXMuaGVpZ2h0L0gpO2MucmVzdG9yZSgpfX0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMqYS9kK2J9LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybi1jKihhLz1kKSooYS0yKStifSxlYXNlT3V0UXVhcnQ6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuLWMqKChhPWEvZC0xKSphKmEqYS0xKStifSxlYXNlSW5RdWFkOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjKihhLz1kKSphK2J9LGVhc2VJblF1YXJ0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjKihhLz1kKSphKmEqYStifX19LEo9e2RyYXdNYXJrZXI6ZnVuY3Rpb24oYSwKK2IsYyxkLGUsZixnLGspe2lmKGMpe3ZhciBwPTE7Yy5maWxsU3R5bGU9Zj9mOiIjMDAwMDAwIjtjLnN0cm9rZVN0eWxlPWc/ZzoiIzAwMDAwMCI7Yy5saW5lV2lkdGg9az9rOjA7ImNpcmNsZSI9PT1kPyhjLm1vdmVUbyhhLGIpLGMuYmVnaW5QYXRoKCksYy5hcmMoYSxiLGUvMiwwLDIqTWF0aC5QSSwhMSksZiYmYy5maWxsKCksayYmKGc/Yy5zdHJva2UoKToocD1jLmdsb2JhbEFscGhhLGMuZ2xvYmFsQWxwaGE9MC4xNSxjLnN0cm9rZVN0eWxlPSJibGFjayIsYy5zdHJva2UoKSxjLmdsb2JhbEFscGhhPXApKSk6InNxdWFyZSI9PT1kPyhjLmJlZ2luUGF0aCgpLGMucmVjdChhLWUvMixiLWUvMixlLGUpLGYmJmMuZmlsbCgpLGsmJihnP2Muc3Ryb2tlKCk6KHA9Yy5nbG9iYWxBbHBoYSxjLmdsb2JhbEFscGhhPTAuMTUsYy5zdHJva2VTdHlsZT0iYmxhY2siLGMuc3Ryb2tlKCksYy5nbG9iYWxBbHBoYT1wKSkpOiJ0cmlhbmdsZSI9PT1kPyhjLmJlZ2luUGF0aCgpLGMubW92ZVRvKGEtZS8KKzIsYitlLzIpLGMubGluZVRvKGErZS8yLGIrZS8yKSxjLmxpbmVUbyhhLGItZS8yKSxjLmNsb3NlUGF0aCgpLGYmJmMuZmlsbCgpLGsmJihnP2Muc3Ryb2tlKCk6KHA9Yy5nbG9iYWxBbHBoYSxjLmdsb2JhbEFscGhhPTAuMTUsYy5zdHJva2VTdHlsZT0iYmxhY2siLGMuc3Ryb2tlKCksYy5nbG9iYWxBbHBoYT1wKSksYy5iZWdpblBhdGgoKSk6ImNyb3NzIj09PWQmJihjLnN0cm9rZVN0eWxlPWYsYy5saW5lV2lkdGg9ZS80LGMuYmVnaW5QYXRoKCksYy5tb3ZlVG8oYS1lLzIsYi1lLzIpLGMubGluZVRvKGErZS8yLGIrZS8yKSxjLnN0cm9rZSgpLGMubW92ZVRvKGErZS8yLGItZS8yKSxjLmxpbmVUbyhhLWUvMixiK2UvMiksYy5zdHJva2UoKSl9fSxkcmF3TWFya2VyczpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtKLmRyYXdNYXJrZXIoYy54LGMueSxjLmN0eCxjLnR5cGUsYy5zaXplLGMuY29sb3IsYy5ib3JkZXJDb2xvcixjLmJvcmRlclRoaWNrbmVzcyl9fX0sCit6YT17Q2hhcnQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdihhLGIsdGhpcyk7dGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXtjLnJlbmRlcih0aGlzLm9wdGlvbnMpfTt0aGlzLm9wdGlvbnM9Yy5fb3B0aW9uc30sYWRkQ29sb3JTZXQ6ZnVuY3Rpb24oYSxiKXtWW2FdPWJ9LGFkZEN1bHR1cmVJbmZvOmZ1bmN0aW9uKGEsYil7bmFbYV09Yn19O3phLkNoYXJ0LnZlcnNpb249InYxLjYuMSBHQSI7d2luZG93LkNhbnZhc0pTPXphfSkoKTsKKy8qCisgIGV4Y2FudmFzIGlzIHVzZWQgdG8gc3VwcG9ydCBJRTY3OCB3aGljaCBkbyBub3QgaW1wbGVtZW50IEhUTUw1IENhbnZhcyBFbGVtZW50LiBZb3UgY2FuIHNhZmVseSByZW1vdmUgdGhlIGZvbGxvd2luZyBleGNhbnZhcyBjb2RlIGlmIHlvdSBkb24ndCBuZWVkIHRvIHN1cHBvcnQgb2xkZXIgYnJvd3NlcnMuCisKKyAgQ29weXJpZ2h0IDIwMDYgR29vZ2xlIEluYy4gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9leHBsb3JlcmNhbnZhcy8KKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKi8KK2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHR8fGZ1bmN0aW9uKCl7ZnVuY3Rpb24gVigpe3JldHVybiB0aGlzLmNvbnRleHRffHwodGhpcy5jb250ZXh0Xz1uZXcgQyh0aGlzKSl9ZnVuY3Rpb24gVyhhLGIsYyl7dmFyIGc9TS5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShiLGcuY29uY2F0KE0uY2FsbChhcmd1bWVudHMpKSl9fWZ1bmN0aW9uIE4oYSl7cmV0dXJuIFN0cmluZyhhKS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX1mdW5jdGlvbiBPKGEpe2EubmFtZXNwYWNlcy5nX3ZtbF98fGEubmFtZXNwYWNlcy5hZGQoImdfdm1sXyIsInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIiwiI2RlZmF1bHQjVk1MIik7YS5uYW1lc3BhY2VzLmdfb198fGEubmFtZXNwYWNlcy5hZGQoImdfb18iLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiLCIjZGVmYXVsdCNWTUwiKTsKK2Euc3R5bGVTaGVldHMuZXhfY2FudmFzX3x8KGE9YS5jcmVhdGVTdHlsZVNoZWV0KCksYS5vd25pbmdFbGVtZW50LmlkPSJleF9jYW52YXNfIixhLmNzc1RleHQ9ImNhbnZhc3tkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47dGV4dC1hbGlnbjpsZWZ0O3dpZHRoOjMwMHB4O2hlaWdodDoxNTBweH0iKX1mdW5jdGlvbiBYKGEpe3ZhciBiPWEuc3JjRWxlbWVudDtzd2l0Y2goYS5wcm9wZXJ0eU5hbWUpe2Nhc2UgIndpZHRoIjpiLmdldENvbnRleHQoKS5jbGVhclJlY3QoKTtiLnN0eWxlLndpZHRoPWIuYXR0cmlidXRlcy53aWR0aC5ub2RlVmFsdWUrInB4IjtiLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yi5jbGllbnRXaWR0aCsicHgiO2JyZWFrO2Nhc2UgImhlaWdodCI6Yi5nZXRDb250ZXh0KCkuY2xlYXJSZWN0KCksYi5zdHlsZS5oZWlnaHQ9Yi5hdHRyaWJ1dGVzLmhlaWdodC5ub2RlVmFsdWUrInB4IixiLmZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0PWIuY2xpZW50SGVpZ2h0KworInB4In19ZnVuY3Rpb24gWShhKXthPWEuc3JjRWxlbWVudDthLmZpcnN0Q2hpbGQmJihhLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9YS5jbGllbnRXaWR0aCsicHgiLGEuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQ9YS5jbGllbnRIZWlnaHQrInB4Iil9ZnVuY3Rpb24gRCgpe3JldHVybltbMSwwLDBdLFswLDEsMF0sWzAsMCwxXV19ZnVuY3Rpb24gdChhLGIpe2Zvcih2YXIgYz1EKCksZz0wOzM+ZztnKyspZm9yKHZhciBlPTA7Mz5lO2UrKyl7Zm9yKHZhciBmPTAsZD0wOzM+ZDtkKyspZis9YVtnXVtkXSpiW2RdW2VdO2NbZ11bZV09Zn1yZXR1cm4gY31mdW5jdGlvbiBQKGEsYil7Yi5maWxsU3R5bGU9YS5maWxsU3R5bGU7Yi5saW5lQ2FwPWEubGluZUNhcDtiLmxpbmVKb2luPWEubGluZUpvaW47Yi5saW5lV2lkdGg9YS5saW5lV2lkdGg7Yi5taXRlckxpbWl0PWEubWl0ZXJMaW1pdDtiLnNoYWRvd0JsdXI9YS5zaGFkb3dCbHVyO2Iuc2hhZG93Q29sb3I9YS5zaGFkb3dDb2xvcjtiLnNoYWRvd09mZnNldFg9CithLnNoYWRvd09mZnNldFg7Yi5zaGFkb3dPZmZzZXRZPWEuc2hhZG93T2Zmc2V0WTtiLnN0cm9rZVN0eWxlPWEuc3Ryb2tlU3R5bGU7Yi5nbG9iYWxBbHBoYT1hLmdsb2JhbEFscGhhO2IuZm9udD1hLmZvbnQ7Yi50ZXh0QWxpZ249YS50ZXh0QWxpZ247Yi50ZXh0QmFzZWxpbmU9YS50ZXh0QmFzZWxpbmU7Yi5hcmNTY2FsZVhfPWEuYXJjU2NhbGVYXztiLmFyY1NjYWxlWV89YS5hcmNTY2FsZVlfO2IubGluZVNjYWxlXz1hLmxpbmVTY2FsZV99ZnVuY3Rpb24gUShhKXt2YXIgYj1hLmluZGV4T2YoIigiLDMpLGM9YS5pbmRleE9mKCIpIixiKzEpLGI9YS5zdWJzdHJpbmcoYisxLGMpLnNwbGl0KCIsIik7aWYoNCE9Yi5sZW5ndGh8fCJhIiE9YS5jaGFyQXQoMykpYlszXT0xO3JldHVybiBifWZ1bmN0aW9uIEUoYSxiLGMpe3JldHVybiBNYXRoLm1pbihjLE1hdGgubWF4KGIsYSkpfWZ1bmN0aW9uIEYoYSxiLGMpezA+YyYmYysrOzE8YyYmYy0tO3JldHVybiAxPjYqYz9hKzYqKGItYSkqYzoKKzE+MipjP2I6Mj4zKmM/YSs2KihiLWEpKigyLzMtYyk6YX1mdW5jdGlvbiBHKGEpe2lmKGEgaW4gSClyZXR1cm4gSFthXTt2YXIgYixjPTE7YT1TdHJpbmcoYSk7aWYoIiMiPT1hLmNoYXJBdCgwKSliPWE7ZWxzZSBpZigvXnJnYi8udGVzdChhKSl7Yz1RKGEpO2I9IiMiO2Zvcih2YXIgZyxlPTA7Mz5lO2UrKylnPS0xIT1jW2VdLmluZGV4T2YoIiUiKT9NYXRoLmZsb29yKDI1NSoocGFyc2VGbG9hdChjW2VdKS8xMDApKTorY1tlXSxiKz12W0UoZywwLDI1NSldO2M9K2NbM119ZWxzZSBpZigvXmhzbC8udGVzdChhKSl7ZT1jPVEoYSk7Yj1wYXJzZUZsb2F0KGVbMF0pLzM2MCUzNjA7MD5iJiZiKys7Zz1FKHBhcnNlRmxvYXQoZVsxXSkvMTAwLDAsMSk7ZT1FKHBhcnNlRmxvYXQoZVsyXSkvMTAwLDAsMSk7aWYoMD09ZylnPWU9Yj1lO2Vsc2V7dmFyIGY9MC41PmU/ZSooMStnKTplK2ctZSpnLGQ9MiplLWY7Zz1GKGQsZixiKzEvMyk7ZT1GKGQsZixiKTtiPUYoZCxmLGItMS8zKX1iPSIjIisKK3ZbTWF0aC5mbG9vcigyNTUqZyldK3ZbTWF0aC5mbG9vcigyNTUqZSldK3ZbTWF0aC5mbG9vcigyNTUqYildO2M9Y1szXX1lbHNlIGI9WlthXXx8YTtyZXR1cm4gSFthXT17Y29sb3I6YixhbHBoYTpjfX1mdW5jdGlvbiBDKGEpe3RoaXMubV89RCgpO3RoaXMubVN0YWNrXz1bXTt0aGlzLmFTdGFja189W107dGhpcy5jdXJyZW50UGF0aF89W107dGhpcy5maWxsU3R5bGU9dGhpcy5zdHJva2VTdHlsZT0iIzAwMCI7dGhpcy5saW5lV2lkdGg9MTt0aGlzLmxpbmVKb2luPSJtaXRlciI7dGhpcy5saW5lQ2FwPSJidXR0Ijt0aGlzLm1pdGVyTGltaXQ9MSpxO3RoaXMuZ2xvYmFsQWxwaGE9MTt0aGlzLmZvbnQ9IjEwcHggc2Fucy1zZXJpZiI7dGhpcy50ZXh0QWxpZ249ImxlZnQiO3RoaXMudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIjt0aGlzLmNhbnZhcz1hO3ZhciBiPSJ3aWR0aDoiK2EuY2xpZW50V2lkdGgrInB4O2hlaWdodDoiK2EuY2xpZW50SGVpZ2h0KyJweDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGUiLAorYz1hLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5zdHlsZS5jc3NUZXh0PWI7YS5hcHBlbmRDaGlsZChjKTtiPWMuY2xvbmVOb2RlKCExKTtiLnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmVkIjtiLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0wKSI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLmVsZW1lbnRfPWM7dGhpcy5saW5lU2NhbGVfPXRoaXMuYXJjU2NhbGVZXz10aGlzLmFyY1NjYWxlWF89MX1mdW5jdGlvbiBSKGEsYixjLGcpe2EuY3VycmVudFBhdGhfLnB1c2goe3R5cGU6ImJlemllckN1cnZlVG8iLGNwMXg6Yi54LGNwMXk6Yi55LGNwMng6Yy54LGNwMnk6Yy55LHg6Zy54LHk6Zy55fSk7YS5jdXJyZW50WF89Zy54O2EuY3VycmVudFlfPWcueX1mdW5jdGlvbiBTKGEsYil7dmFyIGM9RyhhLnN0cm9rZVN0eWxlKSxnPWMuY29sb3IsYz1jLmFscGhhKmEuZ2xvYmFsQWxwaGEsZT1hLmxpbmVTY2FsZV8qYS5saW5lV2lkdGg7MT5lJiYoYyo9ZSk7Yi5wdXNoKCI8Z192bWxfOnN0cm9rZSIsCisnIG9wYWNpdHk9IicsYywnIicsJyBqb2luc3R5bGU9IicsYS5saW5lSm9pbiwnIicsJyBtaXRlcmxpbWl0PSInLGEubWl0ZXJMaW1pdCwnIicsJyBlbmRjYXA9IicsJFthLmxpbmVDYXBdfHwic3F1YXJlIiwnIicsJyB3ZWlnaHQ9IicsZSwncHgiJywnIGNvbG9yPSInLGcsJyIgLz4nKX1mdW5jdGlvbiBUKGEsYixjLGcpe3ZhciBlPWEuZmlsbFN0eWxlLGY9YS5hcmNTY2FsZVhfLGQ9YS5hcmNTY2FsZVlfLGs9Zy54LWMueCxuPWcueS1jLnk7aWYoZSBpbnN0YW5jZW9mIHcpe3ZhciBoPTAsbD1nPTAsdT0wLG09MTtpZigiZ3JhZGllbnQiPT1lLnR5cGVfKXtoPWUueDFfL2Y7Yz1lLnkxXy9kO3ZhciBwPXMoYSxlLngwXy9mLGUueTBfL2QpLGg9cyhhLGgsYyksaD0xODAqTWF0aC5hdGFuMihoLngtcC54LGgueS1wLnkpL01hdGguUEk7MD5oJiYoaCs9MzYwKTsxRS02PmgmJihoPTApfWVsc2UgcD1zKGEsZS54MF8sZS55MF8pLGc9KHAueC1jLngpL2ssbD0ocC55LWMueSkvbixrLz1mKnEsCituLz1kKnEsbT14Lm1heChrLG4pLHU9MiplLnIwXy9tLG09MiplLnIxXy9tLXU7Zj1lLmNvbG9yc187Zi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSk7ZD1mLmxlbmd0aDtwPWZbMF0uY29sb3I7Yz1mW2QtMV0uY29sb3I7az1mWzBdLmFscGhhKmEuZ2xvYmFsQWxwaGE7YT1mW2QtMV0uYWxwaGEqYS5nbG9iYWxBbHBoYTtmb3IodmFyIG49W10scj0wO3I8ZDtyKyspe3ZhciB0PWZbcl07bi5wdXNoKHQub2Zmc2V0Km0rdSsiICIrdC5jb2xvcil9Yi5wdXNoKCc8Z192bWxfOmZpbGwgdHlwZT0iJyxlLnR5cGVfLCciJywnIG1ldGhvZD0ibm9uZSIgZm9jdXM9IjEwMCUiJywnIGNvbG9yPSInLHAsJyInLCcgY29sb3IyPSInLGMsJyInLCcgY29sb3JzPSInLG4uam9pbigiLCIpLCciJywnIG9wYWNpdHk9IicsYSwnIicsJyBnX29fOm9wYWNpdHkyPSInLGssJyInLCcgYW5nbGU9IicsaCwnIicsJyBmb2N1c3Bvc2l0aW9uPSInLGcsIiwiLGwsJyIgLz4nKX1lbHNlIGUgaW5zdGFuY2VvZgorST9rJiZuJiZiLnB1c2goIjxnX3ZtbF86ZmlsbCIsJyBwb3NpdGlvbj0iJywtYy54L2sqZipmLCIsIiwtYy55L24qZCpkLCciJywnIHR5cGU9InRpbGUiJywnIHNyYz0iJyxlLnNyY18sJyIgLz4nKTooZT1HKGEuZmlsbFN0eWxlKSxiLnB1c2goJzxnX3ZtbF86ZmlsbCBjb2xvcj0iJyxlLmNvbG9yLCciIG9wYWNpdHk9IicsZS5hbHBoYSphLmdsb2JhbEFscGhhLCciIC8+JykpfWZ1bmN0aW9uIHMoYSxiLGMpe2E9YS5tXztyZXR1cm57eDpxKihiKmFbMF1bMF0rYyphWzFdWzBdK2FbMl1bMF0pLXIseTpxKihiKmFbMF1bMV0rYyphWzFdWzFdK2FbMl1bMV0pLXJ9fWZ1bmN0aW9uIHooYSxiLGMpe2lzRmluaXRlKGJbMF1bMF0pJiYoaXNGaW5pdGUoYlswXVsxXSkmJmlzRmluaXRlKGJbMV1bMF0pJiZpc0Zpbml0ZShiWzFdWzFdKSYmaXNGaW5pdGUoYlsyXVswXSkmJmlzRmluaXRlKGJbMl1bMV0pKSYmKGEubV89YixjJiYoYS5saW5lU2NhbGVfPWFhKGJhKGJbMF1bMF0qYlsxXVsxXS1iWzBdWzFdKgorYlsxXVswXSkpKSl9ZnVuY3Rpb24gdyhhKXt0aGlzLnR5cGVfPWE7dGhpcy5yMV89dGhpcy55MV89dGhpcy54MV89dGhpcy5yMF89dGhpcy55MF89dGhpcy54MF89MDt0aGlzLmNvbG9yc189W119ZnVuY3Rpb24gSShhLGIpe2lmKCFhfHwxIT1hLm5vZGVUeXBlfHwiSU1HIiE9YS50YWdOYW1lKXRocm93IG5ldyBBKCJUWVBFX01JU01BVENIX0VSUiIpO2lmKCJjb21wbGV0ZSIhPWEucmVhZHlTdGF0ZSl0aHJvdyBuZXcgQSgiSU5WQUxJRF9TVEFURV9FUlIiKTtzd2l0Y2goYil7Y2FzZSAicmVwZWF0IjpjYXNlIG51bGw6Y2FzZSAiIjp0aGlzLnJlcGV0aXRpb25fPSJyZXBlYXQiO2JyZWFrO2Nhc2UgInJlcGVhdC14IjpjYXNlICJyZXBlYXQteSI6Y2FzZSAibm8tcmVwZWF0Ijp0aGlzLnJlcGV0aXRpb25fPWI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgQSgiU1lOVEFYX0VSUiIpO310aGlzLnNyY189YS5zcmM7dGhpcy53aWR0aF89YS53aWR0aDt0aGlzLmhlaWdodF89YS5oZWlnaHR9CitmdW5jdGlvbiBBKGEpe3RoaXMuY29kZT10aGlzW2FdO3RoaXMubWVzc2FnZT1hKyI6IERPTSBFeGNlcHRpb24gIit0aGlzLmNvZGV9dmFyIHg9TWF0aCxrPXgucm91bmQsSj14LnNpbixLPXguY29zLGJhPXguYWJzLGFhPXguc3FydCxxPTEwLHI9cS8yO25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01TSUUgKFtcZC5dKyk/Lyk7dmFyIE09QXJyYXkucHJvdG90eXBlLnNsaWNlO08oZG9jdW1lbnQpO3ZhciBVPXtpbml0OmZ1bmN0aW9uKGEpe2E9YXx8ZG9jdW1lbnQ7YS5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTthLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLFcodGhpcy5pbml0Xyx0aGlzLGEpKX0saW5pdF86ZnVuY3Rpb24oYSl7YT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjYW52YXMiKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLmluaXRFbGVtZW50KGFbYl0pfSxpbml0RWxlbWVudDpmdW5jdGlvbihhKXtpZighYS5nZXRDb250ZXh0KXthLmdldENvbnRleHQ9CitWO08oYS5vd25lckRvY3VtZW50KTthLmlubmVySFRNTD0iIjthLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixYKTthLmF0dGFjaEV2ZW50KCJvbnJlc2l6ZSIsWSk7dmFyIGI9YS5hdHRyaWJ1dGVzO2Iud2lkdGgmJmIud2lkdGguc3BlY2lmaWVkP2Euc3R5bGUud2lkdGg9Yi53aWR0aC5ub2RlVmFsdWUrInB4IjphLndpZHRoPWEuY2xpZW50V2lkdGg7Yi5oZWlnaHQmJmIuaGVpZ2h0LnNwZWNpZmllZD9hLnN0eWxlLmhlaWdodD1iLmhlaWdodC5ub2RlVmFsdWUrInB4IjphLmhlaWdodD1hLmNsaWVudEhlaWdodH1yZXR1cm4gYX19O1UuaW5pdCgpO2Zvcih2YXIgdj1bXSxkPTA7MTY+ZDtkKyspZm9yKHZhciBCPTA7MTY+QjtCKyspdlsxNipkK0JdPWQudG9TdHJpbmcoMTYpK0IudG9TdHJpbmcoMTYpO3ZhciBaPXthbGljZWJsdWU6IiNGMEY4RkYiLGFudGlxdWV3aGl0ZToiI0ZBRUJENyIsYXF1YW1hcmluZToiIzdGRkZENCIsYXp1cmU6IiNGMEZGRkYiLGJlaWdlOiIjRjVGNURDIiwKK2Jpc3F1ZToiI0ZGRTRDNCIsYmxhY2s6IiMwMDAwMDAiLGJsYW5jaGVkYWxtb25kOiIjRkZFQkNEIixibHVldmlvbGV0OiIjOEEyQkUyIixicm93bjoiI0E1MkEyQSIsYnVybHl3b29kOiIjREVCODg3IixjYWRldGJsdWU6IiM1RjlFQTAiLGNoYXJ0cmV1c2U6IiM3RkZGMDAiLGNob2NvbGF0ZToiI0QyNjkxRSIsY29yYWw6IiNGRjdGNTAiLGNvcm5mbG93ZXJibHVlOiIjNjQ5NUVEIixjb3Juc2lsazoiI0ZGRjhEQyIsY3JpbXNvbjoiI0RDMTQzQyIsY3lhbjoiIzAwRkZGRiIsZGFya2JsdWU6IiMwMDAwOEIiLGRhcmtjeWFuOiIjMDA4QjhCIixkYXJrZ29sZGVucm9kOiIjQjg4NjBCIixkYXJrZ3JheToiI0E5QTlBOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJrZ3JleToiI0E5QTlBOSIsZGFya2toYWtpOiIjQkRCNzZCIixkYXJrbWFnZW50YToiIzhCMDA4QiIsZGFya29saXZlZ3JlZW46IiM1NTZCMkYiLGRhcmtvcmFuZ2U6IiNGRjhDMDAiLGRhcmtvcmNoaWQ6IiM5OTMyQ0MiLGRhcmtyZWQ6IiM4QjAwMDAiLAorZGFya3NhbG1vbjoiI0U5OTY3QSIsZGFya3NlYWdyZWVuOiIjOEZCQzhGIixkYXJrc2xhdGVibHVlOiIjNDgzRDhCIixkYXJrc2xhdGVncmF5OiIjMkY0RjRGIixkYXJrc2xhdGVncmV5OiIjMkY0RjRGIixkYXJrdHVycXVvaXNlOiIjMDBDRUQxIixkYXJrdmlvbGV0OiIjOTQwMEQzIixkZWVwcGluazoiI0ZGMTQ5MyIsZGVlcHNreWJsdWU6IiMwMEJGRkYiLGRpbWdyYXk6IiM2OTY5NjkiLGRpbWdyZXk6IiM2OTY5NjkiLGRvZGdlcmJsdWU6IiMxRTkwRkYiLGZpcmVicmljazoiI0IyMjIyMiIsZmxvcmFsd2hpdGU6IiNGRkZBRjAiLGZvcmVzdGdyZWVuOiIjMjI4QjIyIixnYWluc2Jvcm86IiNEQ0RDREMiLGdob3N0d2hpdGU6IiNGOEY4RkYiLGdvbGQ6IiNGRkQ3MDAiLGdvbGRlbnJvZDoiI0RBQTUyMCIsZ3JleToiIzgwODA4MCIsZ3JlZW55ZWxsb3c6IiNBREZGMkYiLGhvbmV5ZGV3OiIjRjBGRkYwIixob3RwaW5rOiIjRkY2OUI0IixpbmRpYW5yZWQ6IiNDRDVDNUMiLGluZGlnbzoiIzRCMDA4MiIsCitpdm9yeToiI0ZGRkZGMCIsa2hha2k6IiNGMEU2OEMiLGxhdmVuZGVyOiIjRTZFNkZBIixsYXZlbmRlcmJsdXNoOiIjRkZGMEY1IixsYXduZ3JlZW46IiM3Q0ZDMDAiLGxlbW9uY2hpZmZvbjoiI0ZGRkFDRCIsbGlnaHRibHVlOiIjQUREOEU2IixsaWdodGNvcmFsOiIjRjA4MDgwIixsaWdodGN5YW46IiNFMEZGRkYiLGxpZ2h0Z29sZGVucm9keWVsbG93OiIjRkFGQUQyIixsaWdodGdyZWVuOiIjOTBFRTkwIixsaWdodGdyZXk6IiNEM0QzRDMiLGxpZ2h0cGluazoiI0ZGQjZDMSIsbGlnaHRzYWxtb246IiNGRkEwN0EiLGxpZ2h0c2VhZ3JlZW46IiMyMEIyQUEiLGxpZ2h0c2t5Ymx1ZToiIzg3Q0VGQSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI0IwQzRERSIsbGlnaHR5ZWxsb3c6IiNGRkZGRTAiLGxpbWVncmVlbjoiIzMyQ0QzMiIsbGluZW46IiNGQUYwRTYiLG1hZ2VudGE6IiNGRjAwRkYiLG1lZGl1bWFxdWFtYXJpbmU6IiM2NkNEQUEiLAorbWVkaXVtYmx1ZToiIzAwMDBDRCIsbWVkaXVtb3JjaGlkOiIjQkE1NUQzIixtZWRpdW1wdXJwbGU6IiM5MzcwREIiLG1lZGl1bXNlYWdyZWVuOiIjM0NCMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3QjY4RUUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBGQTlBIixtZWRpdW10dXJxdW9pc2U6IiM0OEQxQ0MiLG1lZGl1bXZpb2xldHJlZDoiI0M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNGNUZGRkEiLG1pc3R5cm9zZToiI0ZGRTRFMSIsbW9jY2FzaW46IiNGRkU0QjUiLG5hdmFqb3doaXRlOiIjRkZERUFEIixvbGRsYWNlOiIjRkRGNUU2IixvbGl2ZWRyYWI6IiM2QjhFMjMiLG9yYW5nZToiI0ZGQTUwMCIsb3JhbmdlcmVkOiIjRkY0NTAwIixvcmNoaWQ6IiNEQTcwRDYiLHBhbGVnb2xkZW5yb2Q6IiNFRUU4QUEiLHBhbGVncmVlbjoiIzk4RkI5OCIscGFsZXR1cnF1b2lzZToiI0FGRUVFRSIscGFsZXZpb2xldHJlZDoiI0RCNzA5MyIscGFwYXlhd2hpcDoiI0ZGRUZENSIsCitwZWFjaHB1ZmY6IiNGRkRBQjkiLHBlcnU6IiNDRDg1M0YiLHBpbms6IiNGRkMwQ0IiLHBsdW06IiNEREEwREQiLHBvd2RlcmJsdWU6IiNCMEUwRTYiLHJvc3licm93bjoiI0JDOEY4RiIscm95YWxibHVlOiIjNDE2OUUxIixzYWRkbGVicm93bjoiIzhCNDUxMyIsc2FsbW9uOiIjRkE4MDcyIixzYW5keWJyb3duOiIjRjRBNDYwIixzZWFncmVlbjoiIzJFOEI1NyIsc2Vhc2hlbGw6IiNGRkY1RUUiLHNpZW5uYToiI0EwNTIyRCIsc2t5Ymx1ZToiIzg3Q0VFQiIsc2xhdGVibHVlOiIjNkE1QUNEIixzbGF0ZWdyYXk6IiM3MDgwOTAiLHNsYXRlZ3JleToiIzcwODA5MCIsc25vdzoiI0ZGRkFGQSIsc3ByaW5nZ3JlZW46IiMwMEZGN0YiLHN0ZWVsYmx1ZToiIzQ2ODJCNCIsdGFuOiIjRDJCNDhDIix0aGlzdGxlOiIjRDhCRkQ4Iix0b21hdG86IiNGRjYzNDciLHR1cnF1b2lzZToiIzQwRTBEMCIsdmlvbGV0OiIjRUU4MkVFIix3aGVhdDoiI0Y1REVCMyIsd2hpdGVzbW9rZToiI0Y1RjVGNSIseWVsbG93Z3JlZW46IiM5QUNEMzIifSwKK0g9e30sTD17fSwkPXtidXR0OiJmbGF0Iixyb3VuZDoicm91bmQifSxkPUMucHJvdG90eXBlO2QuY2xlYXJSZWN0PWZ1bmN0aW9uKCl7dGhpcy50ZXh0TWVhc3VyZUVsXyYmKHRoaXMudGV4dE1lYXN1cmVFbF8ucmVtb3ZlTm9kZSghMCksdGhpcy50ZXh0TWVhc3VyZUVsXz1udWxsKTt0aGlzLmVsZW1lbnRfLmlubmVySFRNTD0iIn07ZC5iZWdpblBhdGg9ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRQYXRoXz1bXX07ZC5tb3ZlVG89ZnVuY3Rpb24oYSxiKXt2YXIgYz1zKHRoaXMsYSxiKTt0aGlzLmN1cnJlbnRQYXRoXy5wdXNoKHt0eXBlOiJtb3ZlVG8iLHg6Yy54LHk6Yy55fSk7dGhpcy5jdXJyZW50WF89Yy54O3RoaXMuY3VycmVudFlfPWMueX07ZC5saW5lVG89ZnVuY3Rpb24oYSxiKXt2YXIgYz1zKHRoaXMsYSxiKTt0aGlzLmN1cnJlbnRQYXRoXy5wdXNoKHt0eXBlOiJsaW5lVG8iLHg6Yy54LHk6Yy55fSk7dGhpcy5jdXJyZW50WF89Yy54O3RoaXMuY3VycmVudFlfPWMueX07ZC5iZXppZXJDdXJ2ZVRvPQorZnVuY3Rpb24oYSxiLGMsZyxlLGYpe2U9cyh0aGlzLGUsZik7YT1zKHRoaXMsYSxiKTtjPXModGhpcyxjLGcpO1IodGhpcyxhLGMsZSl9O2QucXVhZHJhdGljQ3VydmVUbz1mdW5jdGlvbihhLGIsYyxnKXthPXModGhpcyxhLGIpO2M9cyh0aGlzLGMsZyk7Zz17eDp0aGlzLmN1cnJlbnRYXysyLzMqKGEueC10aGlzLmN1cnJlbnRYXykseTp0aGlzLmN1cnJlbnRZXysyLzMqKGEueS10aGlzLmN1cnJlbnRZXyl9O1IodGhpcyxnLHt4OmcueCsoYy54LXRoaXMuY3VycmVudFhfKS8zLHk6Zy55KyhjLnktdGhpcy5jdXJyZW50WV8pLzN9LGMpfTtkLmFyYz1mdW5jdGlvbihhLGIsYyxnLGUsZil7Yyo9cTt2YXIgZD1mPyJhdCI6IndhIixrPWErSyhnKSpjLXIsbj1iK0ooZykqYy1yO2c9YStLKGUpKmMtcjtlPWIrSihlKSpjLXI7ayE9Z3x8Znx8KGsrPTAuMTI1KTthPXModGhpcyxhLGIpO2s9cyh0aGlzLGssbik7Zz1zKHRoaXMsZyxlKTt0aGlzLmN1cnJlbnRQYXRoXy5wdXNoKHt0eXBlOmQsCit4OmEueCx5OmEueSxyYWRpdXM6Yyx4U3RhcnQ6ay54LHlTdGFydDprLnkseEVuZDpnLngseUVuZDpnLnl9KX07ZC5yZWN0PWZ1bmN0aW9uKGEsYixjLGcpe3RoaXMubW92ZVRvKGEsYik7dGhpcy5saW5lVG8oYStjLGIpO3RoaXMubGluZVRvKGErYyxiK2cpO3RoaXMubGluZVRvKGEsYitnKTt0aGlzLmNsb3NlUGF0aCgpfTtkLnN0cm9rZVJlY3Q9ZnVuY3Rpb24oYSxiLGMsZyl7dmFyIGU9dGhpcy5jdXJyZW50UGF0aF87dGhpcy5iZWdpblBhdGgoKTt0aGlzLm1vdmVUbyhhLGIpO3RoaXMubGluZVRvKGErYyxiKTt0aGlzLmxpbmVUbyhhK2MsYitnKTt0aGlzLmxpbmVUbyhhLGIrZyk7dGhpcy5jbG9zZVBhdGgoKTt0aGlzLnN0cm9rZSgpO3RoaXMuY3VycmVudFBhdGhfPWV9O2QuZmlsbFJlY3Q9ZnVuY3Rpb24oYSxiLGMsZyl7dmFyIGU9dGhpcy5jdXJyZW50UGF0aF87dGhpcy5iZWdpblBhdGgoKTt0aGlzLm1vdmVUbyhhLGIpO3RoaXMubGluZVRvKGErYyxiKTt0aGlzLmxpbmVUbyhhKworYyxiK2cpO3RoaXMubGluZVRvKGEsYitnKTt0aGlzLmNsb3NlUGF0aCgpO3RoaXMuZmlsbCgpO3RoaXMuY3VycmVudFBhdGhfPWV9O2QuY3JlYXRlTGluZWFyR3JhZGllbnQ9ZnVuY3Rpb24oYSxiLGMsZyl7dmFyIGU9bmV3IHcoImdyYWRpZW50Iik7ZS54MF89YTtlLnkwXz1iO2UueDFfPWM7ZS55MV89ZztyZXR1cm4gZX07ZC5jcmVhdGVSYWRpYWxHcmFkaWVudD1mdW5jdGlvbihhLGIsYyxnLGUsZil7dmFyIGQ9bmV3IHcoImdyYWRpZW50cmFkaWFsIik7ZC54MF89YTtkLnkwXz1iO2QucjBfPWM7ZC54MV89ZztkLnkxXz1lO2QucjFfPWY7cmV0dXJuIGR9O2QuZHJhd0ltYWdlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZyxlLGQscix5LG4saDtlPWEucnVudGltZVN0eWxlLndpZHRoO2Q9YS5ydW50aW1lU3R5bGUuaGVpZ2h0O2EucnVudGltZVN0eWxlLndpZHRoPSJhdXRvIjthLnJ1bnRpbWVTdHlsZS5oZWlnaHQ9ImF1dG8iO3ZhciBsPWEud2lkdGgsdT1hLmhlaWdodDthLnJ1bnRpbWVTdHlsZS53aWR0aD0KK2U7YS5ydW50aW1lU3R5bGUuaGVpZ2h0PWQ7aWYoMz09YXJndW1lbnRzLmxlbmd0aCljPWFyZ3VtZW50c1sxXSxnPWFyZ3VtZW50c1syXSxyPXk9MCxuPWU9bCxoPWQ9dTtlbHNlIGlmKDU9PWFyZ3VtZW50cy5sZW5ndGgpYz1hcmd1bWVudHNbMV0sZz1hcmd1bWVudHNbMl0sZT1hcmd1bWVudHNbM10sZD1hcmd1bWVudHNbNF0scj15PTAsbj1sLGg9dTtlbHNlIGlmKDk9PWFyZ3VtZW50cy5sZW5ndGgpcj1hcmd1bWVudHNbMV0seT1hcmd1bWVudHNbMl0sbj1hcmd1bWVudHNbM10saD1hcmd1bWVudHNbNF0sYz1hcmd1bWVudHNbNV0sZz1hcmd1bWVudHNbNl0sZT1hcmd1bWVudHNbN10sZD1hcmd1bWVudHNbOF07ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7dmFyIG09cyh0aGlzLGMsZykscD1bXTtwLnB1c2goIiA8Z192bWxfOmdyb3VwIiwnIGNvb3Jkc2l6ZT0iJywxMCpxLCIsIiwxMCpxLCciJywnIGNvb3Jkb3JpZ2luPSIwLDAiJywnIHN0eWxlPSJ3aWR0aDonLAorMTAsInB4O2hlaWdodDoiLDEwLCJweDtwb3NpdGlvbjphYnNvbHV0ZTsiKTtpZigxIT10aGlzLm1fWzBdWzBdfHx0aGlzLm1fWzBdWzFdfHwxIT10aGlzLm1fWzFdWzFdfHx0aGlzLm1fWzFdWzBdKXt2YXIgdD1bXTt0LnB1c2goIk0xMT0iLHRoaXMubV9bMF1bMF0sIiwiLCJNMTI9Iix0aGlzLm1fWzFdWzBdLCIsIiwiTTIxPSIsdGhpcy5tX1swXVsxXSwiLCIsIk0yMj0iLHRoaXMubV9bMV1bMV0sIiwiLCJEeD0iLGsobS54L3EpLCIsIiwiRHk9IixrKG0ueS9xKSwiIik7dmFyIHY9cyh0aGlzLGMrZSxnKSx3PXModGhpcyxjLGcrZCk7Yz1zKHRoaXMsYytlLGcrZCk7bS54PXgubWF4KG0ueCx2Lngsdy54LGMueCk7bS55PXgubWF4KG0ueSx2Lnksdy55LGMueSk7cC5wdXNoKCJwYWRkaW5nOjAgIixrKG0ueC9xKSwicHggIixrKG0ueS9xKSwicHggMDtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0Lk1hdHJpeCgiLHQuam9pbigiIiksIiwgc2l6aW5nbWV0aG9kPSdjbGlwJyk7Iil9ZWxzZSBwLnB1c2goInRvcDoiLAorayhtLnkvcSksInB4O2xlZnQ6IixrKG0ueC9xKSwicHg7Iik7cC5wdXNoKCcgIj4nLCc8Z192bWxfOmltYWdlIHNyYz0iJyxhLnNyYywnIicsJyBzdHlsZT0id2lkdGg6JyxxKmUsInB4OyIsIiBoZWlnaHQ6IixxKmQsJ3B4IicsJyBjcm9wbGVmdD0iJyxyL2wsJyInLCcgY3JvcHRvcD0iJyx5L3UsJyInLCcgY3JvcHJpZ2h0PSInLChsLXItbikvbCwnIicsJyBjcm9wYm90dG9tPSInLCh1LXktaCkvdSwnIicsIiAvPiIsIjwvZ192bWxfOmdyb3VwPiIpO3RoaXMuZWxlbWVudF8uaW5zZXJ0QWRqYWNlbnRIVE1MKCJCZWZvcmVFbmQiLHAuam9pbigiIikpfTtkLnN0cm9rZT1mdW5jdGlvbihhKXt2YXIgYj1bXTtiLnB1c2goIjxnX3ZtbF86c2hhcGUiLCcgZmlsbGVkPSInLCEhYSwnIicsJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2lkdGg6JywxMCwicHg7aGVpZ2h0OiIsMTAsJ3B4OyInLCcgY29vcmRvcmlnaW49IjAsMCInLCcgY29vcmRzaXplPSInLDEwKnEsIiwiLDEwKnEsJyInLAorJyBzdHJva2VkPSInLCFhLCciJywnIHBhdGg9IicpO2Zvcih2YXIgYz17eDpudWxsLHk6bnVsbH0sZD17eDpudWxsLHk6bnVsbH0sZT0wO2U8dGhpcy5jdXJyZW50UGF0aF8ubGVuZ3RoO2UrKyl7dmFyIGY9dGhpcy5jdXJyZW50UGF0aF9bZV07c3dpdGNoKGYudHlwZSl7Y2FzZSAibW92ZVRvIjpiLnB1c2goIiBtICIsayhmLngpLCIsIixrKGYueSkpO2JyZWFrO2Nhc2UgImxpbmVUbyI6Yi5wdXNoKCIgbCAiLGsoZi54KSwiLCIsayhmLnkpKTticmVhaztjYXNlICJjbG9zZSI6Yi5wdXNoKCIgeCAiKTtmPW51bGw7YnJlYWs7Y2FzZSAiYmV6aWVyQ3VydmVUbyI6Yi5wdXNoKCIgYyAiLGsoZi5jcDF4KSwiLCIsayhmLmNwMXkpLCIsIixrKGYuY3AyeCksIiwiLGsoZi5jcDJ5KSwiLCIsayhmLngpLCIsIixrKGYueSkpO2JyZWFrO2Nhc2UgImF0IjpjYXNlICJ3YSI6Yi5wdXNoKCIgIixmLnR5cGUsIiAiLGsoZi54LXRoaXMuYXJjU2NhbGVYXypmLnJhZGl1cyksIiwiLGsoZi55LXRoaXMuYXJjU2NhbGVZXyoKK2YucmFkaXVzKSwiICIsayhmLngrdGhpcy5hcmNTY2FsZVhfKmYucmFkaXVzKSwiLCIsayhmLnkrdGhpcy5hcmNTY2FsZVlfKmYucmFkaXVzKSwiICIsayhmLnhTdGFydCksIiwiLGsoZi55U3RhcnQpLCIgIixrKGYueEVuZCksIiwiLGsoZi55RW5kKSl9aWYoZil7aWYobnVsbD09Yy54fHxmLng8Yy54KWMueD1mLng7aWYobnVsbD09ZC54fHxmLng+ZC54KWQueD1mLng7aWYobnVsbD09Yy55fHxmLnk8Yy55KWMueT1mLnk7aWYobnVsbD09ZC55fHxmLnk+ZC55KWQueT1mLnl9fWIucHVzaCgnICI+Jyk7YT9UKHRoaXMsYixjLGQpOlModGhpcyxiKTtiLnB1c2goIjwvZ192bWxfOnNoYXBlPiIpO3RoaXMuZWxlbWVudF8uaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVFbmQiLGIuam9pbigiIikpfTtkLmZpbGw9ZnVuY3Rpb24oKXt0aGlzLnN0cm9rZSghMCl9O2QuY2xvc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50UGF0aF8ucHVzaCh7dHlwZToiY2xvc2UifSl9O2Quc2F2ZT1mdW5jdGlvbigpe3ZhciBhPQore307UCh0aGlzLGEpO3RoaXMuYVN0YWNrXy5wdXNoKGEpO3RoaXMubVN0YWNrXy5wdXNoKHRoaXMubV8pO3RoaXMubV89dChEKCksdGhpcy5tXyl9O2QucmVzdG9yZT1mdW5jdGlvbigpe3RoaXMuYVN0YWNrXy5sZW5ndGgmJihQKHRoaXMuYVN0YWNrXy5wb3AoKSx0aGlzKSx0aGlzLm1fPXRoaXMubVN0YWNrXy5wb3AoKSl9O2QudHJhbnNsYXRlPWZ1bmN0aW9uKGEsYil7eih0aGlzLHQoW1sxLDAsMF0sWzAsMSwwXSxbYSxiLDFdXSx0aGlzLm1fKSwhMSl9O2Qucm90YXRlPWZ1bmN0aW9uKGEpe3ZhciBiPUsoYSk7YT1KKGEpO3oodGhpcyx0KFtbYixhLDBdLFstYSxiLDBdLFswLDAsMV1dLHRoaXMubV8pLCExKX07ZC5zY2FsZT1mdW5jdGlvbihhLGIpe3RoaXMuYXJjU2NhbGVYXyo9YTt0aGlzLmFyY1NjYWxlWV8qPWI7eih0aGlzLHQoW1thLDAsMF0sWzAsYiwwXSxbMCwwLDFdXSx0aGlzLm1fKSwhMCl9O2QudHJhbnNmb3JtPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt6KHRoaXMsdChbW2EsCitiLDBdLFtjLGQsMF0sW2UsZiwxXV0sdGhpcy5tXyksITApfTtkLnNldFRyYW5zZm9ybT1mdW5jdGlvbihhLGIsYyxkLGUsZil7eih0aGlzLFtbYSxiLDBdLFtjLGQsMF0sW2UsZiwxXV0sITApfTtkLmRyYXdUZXh0Xz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXMubV87ZD0wO3ZhciByPTFFMyx0PTAsbj1bXSxoO2g9dGhpcy5mb250O2lmKExbaF0paD1MW2hdO2Vsc2V7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7dHJ5e2wuZm9udD1ofWNhdGNoKHUpe31oPUxbaF09e3N0eWxlOmwuZm9udFN0eWxlfHwibm9ybWFsIix2YXJpYW50OmwuZm9udFZhcmlhbnR8fCJub3JtYWwiLHdlaWdodDpsLmZvbnRXZWlnaHR8fCJub3JtYWwiLHNpemU6bC5mb250U2l6ZXx8MTAsZmFtaWx5OmwuZm9udEZhbWlseXx8InNhbnMtc2VyaWYifX12YXIgbD1oLG09dGhpcy5lbGVtZW50XztoPXt9O2Zvcih2YXIgcCBpbiBsKWhbcF09bFtwXTtwPXBhcnNlRmxvYXQobS5jdXJyZW50U3R5bGUuZm9udFNpemUpOworbT1wYXJzZUZsb2F0KGwuc2l6ZSk7Im51bWJlciI9PXR5cGVvZiBsLnNpemU/aC5zaXplPWwuc2l6ZTotMSE9bC5zaXplLmluZGV4T2YoInB4Iik/aC5zaXplPW06LTEhPWwuc2l6ZS5pbmRleE9mKCJlbSIpP2guc2l6ZT1wKm06LTEhPWwuc2l6ZS5pbmRleE9mKCIlIik/aC5zaXplPXAvMTAwKm06LTEhPWwuc2l6ZS5pbmRleE9mKCJwdCIpP2guc2l6ZT1tLzAuNzU6aC5zaXplPXA7aC5zaXplKj0wLjk4MTtwPWguc3R5bGUrIiAiK2gudmFyaWFudCsiICIraC53ZWlnaHQrIiAiK2guc2l6ZSsicHggIitoLmZhbWlseTttPXRoaXMuZWxlbWVudF8uY3VycmVudFN0eWxlO2w9dGhpcy50ZXh0QWxpZ24udG9Mb3dlckNhc2UoKTtzd2l0Y2gobCl7Y2FzZSAibGVmdCI6Y2FzZSAiY2VudGVyIjpjYXNlICJyaWdodCI6YnJlYWs7Y2FzZSAiZW5kIjpsPSJsdHIiPT1tLmRpcmVjdGlvbj8icmlnaHQiOiJsZWZ0IjticmVhaztjYXNlICJzdGFydCI6bD0icnRsIj09bS5kaXJlY3Rpb24/InJpZ2h0IjoKKyJsZWZ0IjticmVhaztkZWZhdWx0Omw9ImxlZnQifXN3aXRjaCh0aGlzLnRleHRCYXNlbGluZSl7Y2FzZSAiaGFuZ2luZyI6Y2FzZSAidG9wIjp0PWguc2l6ZS8xLjc1O2JyZWFrO2Nhc2UgIm1pZGRsZSI6YnJlYWs7ZGVmYXVsdDpjYXNlIG51bGw6Y2FzZSAiYWxwaGFiZXRpYyI6Y2FzZSAiaWRlb2dyYXBoaWMiOmNhc2UgImJvdHRvbSI6dD0taC5zaXplLzIuMjV9c3dpdGNoKGwpe2Nhc2UgInJpZ2h0IjpkPTFFMztyPTAuMDU7YnJlYWs7Y2FzZSAiY2VudGVyIjpkPXI9NTAwfWI9cyh0aGlzLGIrMCxjK3QpO24ucHVzaCgnPGdfdm1sXzpsaW5lIGZyb209IicsLWQsJyAwIiB0bz0iJyxyLCcgMC4wNSIgJywnIGNvb3Jkc2l6ZT0iMTAwIDEwMCIgY29vcmRvcmlnaW49IjAgMCInLCcgZmlsbGVkPSInLCFlLCciIHN0cm9rZWQ9IicsISFlLCciIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiPicpO2U/Uyh0aGlzLG4pOlQodGhpcyxuLHt4Oi1kLHk6MH0sCit7eDpyLHk6aC5zaXplfSk7ZT1mWzBdWzBdLnRvRml4ZWQoMykrIiwiK2ZbMV1bMF0udG9GaXhlZCgzKSsiLCIrZlswXVsxXS50b0ZpeGVkKDMpKyIsIitmWzFdWzFdLnRvRml4ZWQoMykrIiwwLDAiO2I9ayhiLngvcSkrIiwiK2soYi55L3EpO24ucHVzaCgnPGdfdm1sXzpza2V3IG9uPSJ0IiBtYXRyaXg9IicsZSwnIiAnLCcgb2Zmc2V0PSInLGIsJyIgb3JpZ2luPSInLGQsJyAwIiAvPicsJzxnX3ZtbF86cGF0aCB0ZXh0cGF0aG9rPSJ0cnVlIiAvPicsJzxnX3ZtbF86dGV4dHBhdGggb249InRydWUiIHN0cmluZz0iJyxOKGEpLCciIHN0eWxlPSJ2LXRleHQtYWxpZ246JyxsLCI7Zm9udDoiLE4ocCksJyIgLz48L2dfdm1sXzpsaW5lPicpO3RoaXMuZWxlbWVudF8uaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVFbmQiLG4uam9pbigiIikpfTtkLmZpbGxUZXh0PWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuZHJhd1RleHRfKGEsYixjLGQsITEpfTtkLnN0cm9rZVRleHQ9ZnVuY3Rpb24oYSwKK2IsYyxkKXt0aGlzLmRyYXdUZXh0XyhhLGIsYyxkLCEwKX07ZC5tZWFzdXJlVGV4dD1mdW5jdGlvbihhKXt0aGlzLnRleHRNZWFzdXJlRWxffHwodGhpcy5lbGVtZW50Xy5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZUVuZCIsJzxzcGFuIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTIwMDAwcHg7bGVmdDowO3BhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6bm9uZTt3aGl0ZS1zcGFjZTpwcmU7Ij48L3NwYW4+JyksdGhpcy50ZXh0TWVhc3VyZUVsXz10aGlzLmVsZW1lbnRfLmxhc3RDaGlsZCk7dmFyIGI9dGhpcy5lbGVtZW50Xy5vd25lckRvY3VtZW50O3RoaXMudGV4dE1lYXN1cmVFbF8uaW5uZXJIVE1MPSIiO3RoaXMudGV4dE1lYXN1cmVFbF8uc3R5bGUuZm9udD10aGlzLmZvbnQ7dGhpcy50ZXh0TWVhc3VyZUVsXy5hcHBlbmRDaGlsZChiLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm57d2lkdGg6dGhpcy50ZXh0TWVhc3VyZUVsXy5vZmZzZXRXaWR0aH19O2QuY2xpcD1mdW5jdGlvbigpe307CitkLmFyY1RvPWZ1bmN0aW9uKCl7fTtkLmNyZWF0ZVBhdHRlcm49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEkoYSxiKX07dy5wcm90b3R5cGUuYWRkQ29sb3JTdG9wPWZ1bmN0aW9uKGEsYil7Yj1HKGIpO3RoaXMuY29sb3JzXy5wdXNoKHtvZmZzZXQ6YSxjb2xvcjpiLmNvbG9yLGFscGhhOmIuYWxwaGF9KX07ZD1BLnByb3RvdHlwZT1FcnJvcigpO2QuSU5ERVhfU0laRV9FUlI9MTtkLkRPTVNUUklOR19TSVpFX0VSUj0yO2QuSElFUkFSQ0hZX1JFUVVFU1RfRVJSPTM7ZC5XUk9OR19ET0NVTUVOVF9FUlI9NDtkLklOVkFMSURfQ0hBUkFDVEVSX0VSUj01O2QuTk9fREFUQV9BTExPV0VEX0VSUj02O2QuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSPTc7ZC5OT1RfRk9VTkRfRVJSPTg7ZC5OT1RfU1VQUE9SVEVEX0VSUj05O2QuSU5VU0VfQVRUUklCVVRFX0VSUj0xMDtkLklOVkFMSURfU1RBVEVfRVJSPTExO2QuU1lOVEFYX0VSUj0xMjtkLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUj0KKzEzO2QuTkFNRVNQQUNFX0VSUj0xNDtkLklOVkFMSURfQUNDRVNTX0VSUj0xNTtkLlZBTElEQVRJT05fRVJSPTE2O2QuVFlQRV9NSVNNQVRDSF9FUlI9MTc7R192bWxDYW52YXNNYW5hZ2VyPVU7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPUM7Q2FudmFzR3JhZGllbnQ9dztDYW52YXNQYXR0ZXJuPUk7RE9NRXhjZXB0aW9uPUF9KCk7CmRpZmYgLS1naXQgYS95MjAxNS9odHRwX3N0YXR1cy93d3cvbGliL2pxdWVyeS0xLjQuNC5qcyBiL3kyMDE1L2h0dHBfc3RhdHVzL3d3dy9saWIvanF1ZXJ5LTEuNC40LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjExNDUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9odHRwX3N0YXR1cy93d3cvbGliL2pxdWVyeS0xLjQuNC5qcwpAQCAtMCwwICsxLDcxNzkgQEAKKy8qIQorICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2MS40LjQKKyAqIGh0dHA6Ly9qcXVlcnkuY29tLworICoKKyAqIENvcHlyaWdodCAyMDEwLCBKb2huIFJlc2lnCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KKyAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKKyAqCisgKiBJbmNsdWRlcyBTaXp6bGUuanMKKyAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCisgKiBDb3B5cmlnaHQgMjAxMCwgVGhlIERvam8gRm91bmRhdGlvbgorICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgorICoKKyAqIERhdGU6IFRodSBOb3YgMTEgMTk6MDQ6NTMgMjAxMCAtMDUwMAorICovCisoZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZpbmVkICkgeworCisvLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkgd2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCit2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cit2YXIgalF1ZXJ5ID0gKGZ1bmN0aW9uKCkgeworCisvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeQordmFyIGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKKwkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCisJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CisJfSwKKworCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQorCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAorCisJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKKwlfJCA9IHdpbmRvdy4kLAorCisJLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpCisJcm9vdGpRdWVyeSwKKworCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKKwkvLyAoYm90aCBvZiB3aGljaCB3ZSBvcHRpbWl6ZSBmb3IpCisJcXVpY2tFeHByID0gL14oPzpbXjxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKykkKS8sCisKKwkvLyBJcyBpdCBhIHNpbXBsZSBzZWxlY3RvcgorCWlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKKworCS8vIENoZWNrIGlmIGEgc3RyaW5nIGhhcyBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBpdAorCXJub3R3aGl0ZSA9IC9cUy8sCisJcndoaXRlID0gL1xzLywKKworCS8vIFVzZWQgZm9yIHRyaW1taW5nIHdoaXRlc3BhY2UKKwl0cmltTGVmdCA9IC9eXHMrLywKKwl0cmltUmlnaHQgPSAvXHMrJC8sCisKKwkvLyBDaGVjayBmb3Igbm9uLXdvcmQgY2hhcmFjdGVycworCXJub253b3JkID0gL1xXLywKKworCS8vIENoZWNrIGZvciBkaWdpdHMKKwlyZGlnaXQgPSAvXGQvLAorCisJLy8gTWF0Y2ggYSBzdGFuZGFsb25lIHRhZworCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLAorCisJLy8gSlNPTiBSZWdFeHAKKwlydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKKwlydmFsaWRlc2NhcGUgPSAvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLAorCXJ2YWxpZHRva2VucyA9IC8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZywKKwlydmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAorCisJLy8gVXNlcmFnZW50IFJlZ0V4cAorCXJ3ZWJraXQgPSAvKHdlYmtpdClbIFwvXShbXHcuXSspLywKKwlyb3BlcmEgPSAvKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sCisJcm1zaWUgPSAvKG1zaWUpIChbXHcuXSspLywKKwlybW96aWxsYSA9IC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sCisKKwkvLyBLZWVwIGEgVXNlckFnZW50IHN0cmluZyBmb3IgdXNlIHdpdGggalF1ZXJ5LmJyb3dzZXIKKwl1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LAorCisJLy8gRm9yIG1hdGNoaW5nIHRoZSBlbmdpbmUgYW5kIHZlcnNpb24gb2YgdGhlIGJyb3dzZXIKKwlicm93c2VyTWF0Y2gsCisJCisJLy8gSGFzIHRoZSByZWFkeSBldmVudHMgYWxyZWFkeSBiZWVuIGJvdW5kPworCXJlYWR5Qm91bmQgPSBmYWxzZSwKKwkKKwkvLyBUaGUgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgb24gRE9NIHJlYWR5CisJcmVhZHlMaXN0ID0gW10sCisKKwkvLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlcgorCURPTUNvbnRlbnRMb2FkZWQsCisKKwkvLyBTYXZlIGEgcmVmZXJlbmNlIHRvIHNvbWUgY29yZSBtZXRob2RzCisJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAorCWhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksCisJcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoLAorCXNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAorCXRyaW0gPSBTdHJpbmcucHJvdG90eXBlLnRyaW0sCisJaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLAorCQorCS8vIFtbQ2xhc3NdXSAtPiB0eXBlIHBhaXJzCisJY2xhc3MydHlwZSA9IHt9OworCitqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0geworCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKKwkJdmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYzsKKworCQkvLyBIYW5kbGUgJCgiIiksICQobnVsbCksIG9yICQodW5kZWZpbmVkKQorCQlpZiAoICFzZWxlY3RvciApIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJLy8gSGFuZGxlICQoRE9NRWxlbWVudCkKKwkJaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKKwkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKKwkJCXRoaXMubGVuZ3RoID0gMTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCQorCQkvLyBUaGUgYm9keSBlbGVtZW50IG9ubHkgZXhpc3RzIG9uY2UsIG9wdGltaXplIGZpbmRpbmcgaXQKKwkJaWYgKCBzZWxlY3RvciA9PT0gImJvZHkiICYmICFjb250ZXh0ICYmIGRvY3VtZW50LmJvZHkgKSB7CisJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKKwkJCXRoaXNbMF0gPSBkb2N1bWVudC5ib2R5OworCQkJdGhpcy5zZWxlY3RvciA9ICJib2R5IjsKKwkJCXRoaXMubGVuZ3RoID0gMTsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJLy8gSGFuZGxlIEhUTUwgc3RyaW5ncworCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CisJCQkvLyBBcmUgd2UgZGVhbGluZyB3aXRoIEhUTUwgc3RyaW5nIG9yIGFuIElEPworCQkJbWF0Y2ggPSBxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKKworCQkJLy8gVmVyaWZ5IGEgbWF0Y2gsIGFuZCB0aGF0IG5vIGNvbnRleHQgd2FzIHNwZWNpZmllZCBmb3IgI2lkCisJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CisKKwkJCQkvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKKwkJCQlpZiAoIG1hdGNoWzFdICkgeworCQkJCQlkb2MgPSAoY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQpOworCisJCQkJCS8vIElmIGEgc2luZ2xlIHN0cmluZyBpcyBwYXNzZWQgaW4gYW5kIGl0J3MgYSBzaW5nbGUgdGFnCisJCQkJCS8vIGp1c3QgZG8gYSBjcmVhdGVFbGVtZW50IGFuZCBza2lwIHRoZSByZXN0CisJCQkJCXJldCA9IHJzaW5nbGVUYWcuZXhlYyggc2VsZWN0b3IgKTsKKworCQkJCQlpZiAoIHJldCApIHsKKwkJCQkJCWlmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHsKKwkJCQkJCQlzZWxlY3RvciA9IFsgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggcmV0WzFdICkgXTsKKwkJCQkJCQlqUXVlcnkuZm4uYXR0ci5jYWxsKCBzZWxlY3RvciwgY29udGV4dCwgdHJ1ZSApOworCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXNlbGVjdG9yID0gWyBkb2MuY3JlYXRlRWxlbWVudCggcmV0WzFdICkgXTsKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0ID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgbWF0Y2hbMV0gXSwgWyBkb2MgXSApOworCQkJCQkJc2VsZWN0b3IgPSAocmV0LmNhY2hlYWJsZSA/IHJldC5mcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiByZXQuZnJhZ21lbnQpLmNoaWxkTm9kZXM7CisJCQkJCX0KKwkJCQkJCisJCQkJCXJldHVybiBqUXVlcnkubWVyZ2UoIHRoaXMsIHNlbGVjdG9yICk7CisJCQkJCQorCQkJCS8vIEhBTkRMRTogJCgiI2lkIikKKwkJCQl9IGVsc2UgeworCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7CisKKwkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKKwkJCQkJLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgeworCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKKwkJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAorCQkJCQkJaWYgKCBlbGVtLmlkICE9PSBtYXRjaFsyXSApIHsKKwkJCQkJCQlyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApOworCQkJCQkJfQorCisJCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CisJCQkJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQkJCQl0aGlzWzBdID0gZWxlbTsKKwkJCQkJfQorCisJCQkJCXRoaXMuY29udGV4dCA9IGRvY3VtZW50OworCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0KKworCQkJLy8gSEFORExFOiAkKCJUQUciKQorCQkJfSBlbHNlIGlmICggIWNvbnRleHQgJiYgIXJub253b3JkLnRlc3QoIHNlbGVjdG9yICkgKSB7CisJCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworCQkJCXRoaXMuY29udGV4dCA9IGRvY3VtZW50OworCQkJCXNlbGVjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICk7CisJCQkJcmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTsKKworCQkJLy8gSEFORExFOiAkKGV4cHIsICQoLi4uKSkKKwkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgeworCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOworCisJCQkvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dCkKKwkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQorCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4galF1ZXJ5KCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKKwkJCX0KKworCQkvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCisJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQorCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHsKKwkJCXJldHVybiByb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApOworCQl9CisKKwkJaWYgKHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQpIHsKKwkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKKwkJCXRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKKwl9LAorCisJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgorCXNlbGVjdG9yOiAiIiwKKworCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKKwlqcXVlcnk6ICIxLjQuNCIsCisKKwkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKKwlsZW5ndGg6IDAsCisKKwkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAorCXNpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5sZW5ndGg7CisJfSwKKworCXRvQXJyYXk6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcywgMCApOworCX0sCisKKwkvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SCisJLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKKwlnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CisJCXJldHVybiBudW0gPT0gbnVsbCA/CisKKwkJCS8vIFJldHVybiBhICdjbGVhbicgYXJyYXkKKwkJCXRoaXMudG9BcnJheSgpIDoKKworCQkJLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAorCQkJKCBudW0gPCAwID8gdGhpcy5zbGljZShudW0pWyAwIF0gOiB0aGlzWyBudW0gXSApOworCX0sCisKKwkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCisJLy8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpCisJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgeworCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAorCQl2YXIgcmV0ID0galF1ZXJ5KCk7CisKKwkJaWYgKCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIHsKKwkJCXB1c2guYXBwbHkoIHJldCwgZWxlbXMgKTsKKwkJCisJCX0gZWxzZSB7CisJCQlqUXVlcnkubWVyZ2UoIHJldCwgZWxlbXMgKTsKKwkJfQorCisJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpCisJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKKworCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKKworCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApIHsKKwkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOworCQl9IGVsc2UgaWYgKCBuYW1lICkgeworCQkJcmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArICIuIiArIG5hbWUgKyAiKCIgKyBzZWxlY3RvciArICIpIjsKKwkJfQorCisJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCisJLy8gKFlvdSBjYW4gc2VlZCB0aGUgYXJndW1lbnRzIHdpdGggYW4gYXJyYXkgb2YgYXJncywgYnV0IHRoaXMgaXMKKwkvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCisJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgeworCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7CisJfSwKKwkKKwlyZWFkeTogZnVuY3Rpb24oIGZuICkgeworCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycworCQlqUXVlcnkuYmluZFJlYWR5KCk7CisKKwkJLy8gSWYgdGhlIERPTSBpcyBhbHJlYWR5IHJlYWR5CisJCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CisJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQorCQkJZm4uY2FsbCggZG9jdW1lbnQsIGpRdWVyeSApOworCisJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgorCQl9IGVsc2UgaWYgKCByZWFkeUxpc3QgKSB7CisJCQkvLyBBZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSB3YWl0IGxpc3QKKwkJCXJlYWR5TGlzdC5wdXNoKCBmbiApOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwkKKwllcTogZnVuY3Rpb24oIGkgKSB7CisJCXJldHVybiBpID09PSAtMSA/CisJCQl0aGlzLnNsaWNlKCBpICkgOgorCQkJdGhpcy5zbGljZSggaSwgK2kgKyAxICk7CisJfSwKKworCWZpcnN0OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKKwl9LAorCisJbGFzdDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmVxKCAtMSApOworCX0sCisKKwlzbGljZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApLAorCQkJInNsaWNlIiwgc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOworCX0sCisKKwltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKKwkJfSkpOworCX0sCisJCisJZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCBqUXVlcnkobnVsbCk7CisJfSwKKworCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KKwkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KKwlwdXNoOiBwdXNoLAorCXNvcnQ6IFtdLnNvcnQsCisJc3BsaWNlOiBbXS5zcGxpY2UKK307CisKKy8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KK2pRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKKworalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKKwkgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLAorCQl0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sCisJCWkgPSAxLAorCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAorCQlkZWVwID0gZmFsc2U7CisKKwkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCisJaWYgKCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7CisJCWRlZXAgPSB0YXJnZXQ7CisJCXRhcmdldCA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKKwkJLy8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAorCQlpID0gMjsKKwl9CisKKwkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKKwlpZiAoIHR5cGVvZiB0YXJnZXQgIT09ICJvYmplY3QiICYmICFqUXVlcnkuaXNGdW5jdGlvbih0YXJnZXQpICkgeworCQl0YXJnZXQgPSB7fTsKKwl9CisKKwkvLyBleHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWQKKwlpZiAoIGxlbmd0aCA9PT0gaSApIHsKKwkJdGFyZ2V0ID0gdGhpczsKKwkJLS1pOworCX0KKworCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCisJCWlmICggKG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSkgIT0gbnVsbCApIHsKKwkJCS8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3QKKwkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKKwkJCQljb3B5ID0gb3B0aW9uc1sgbmFtZSBdOworCisJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAorCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5ICkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKKwkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5KGNvcHkpKSApICkgeworCQkJCQlpZiAoIGNvcHlJc0FycmF5ICkgeworCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKKwkJCQkJCWNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9OworCQkJCQl9CisKKwkJCQkJLy8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCisJCQkJCXRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTsKKworCQkJCS8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKKwkJCQl9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAorCXJldHVybiB0YXJnZXQ7Cit9OworCitqUXVlcnkuZXh0ZW5kKHsKKwlub0NvbmZsaWN0OiBmdW5jdGlvbiggZGVlcCApIHsKKwkJd2luZG93LiQgPSBfJDsKKworCQlpZiAoIGRlZXAgKSB7CisJCQl3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTsKKwkJfQorCisJCXJldHVybiBqUXVlcnk7CisJfSwKKwkKKwkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgorCWlzUmVhZHk6IGZhbHNlLAorCisJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQorCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCisJcmVhZHlXYWl0OiAxLAorCQorCS8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKKwlyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CisJCS8vIEEgdGhpcmQtcGFydHkgaXMgcHVzaGluZyB0aGUgcmVhZHkgZXZlbnQgZm9yd2FyZHMKKwkJaWYgKCB3YWl0ID09PSB0cnVlICkgeworCQkJalF1ZXJ5LnJlYWR5V2FpdC0tOworCQl9CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIERPTSBpcyBub3QgYWxyZWFkeSBsb2FkZWQKKwkJaWYgKCAhalF1ZXJ5LnJlYWR5V2FpdCB8fCAod2FpdCAhPT0gdHJ1ZSAmJiAhalF1ZXJ5LmlzUmVhZHkpICkgeworCQkJLy8gTWFrZSBzdXJlIGJvZHkgZXhpc3RzLCBhdCBsZWFzdCwgaW4gY2FzZSBJRSBnZXRzIGEgbGl0dGxlIG92ZXJ6ZWFsb3VzICh0aWNrZXQgIzU0NDMpLgorCQkJaWYgKCAhZG9jdW1lbnQuYm9keSApIHsKKwkJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQorCQkJalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOworCisJCQkvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQorCQkJaWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCisJCQlpZiAoIHJlYWR5TGlzdCApIHsKKwkJCQkvLyBFeGVjdXRlIGFsbCBvZiB0aGVtCisJCQkJdmFyIGZuLAorCQkJCQlpID0gMCwKKwkJCQkJcmVhZHkgPSByZWFkeUxpc3Q7CisKKwkJCQkvLyBSZXNldCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMKKwkJCQlyZWFkeUxpc3QgPSBudWxsOworCisJCQkJd2hpbGUgKCAoZm4gPSByZWFkeVsgaSsrIF0pICkgeworCQkJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CisJCQkJfQorCisJCQkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCisJCQkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKKwkJCQkJalF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXIoICJyZWFkeSIgKS51bmJpbmQoICJyZWFkeSIgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCQorCWJpbmRSZWFkeTogZnVuY3Rpb24oKSB7CisJCWlmICggcmVhZHlCb3VuZCApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlYWR5Qm91bmQgPSB0cnVlOworCisJCS8vIENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1lbnQpLnJlYWR5KCkgaXMgY2FsbGVkIGFmdGVyIHRoZQorCQkvLyBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLgorCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CisJCQkvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHkKKwkJCXJldHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHksIDEgKTsKKwkJfQorCisJCS8vIE1vemlsbGEsIE9wZXJhIGFuZCB3ZWJraXQgbmlnaHRsaWVzIGN1cnJlbnRseSBzdXBwb3J0IHRoaXMgZXZlbnQKKwkJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgeworCQkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjaworCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBET01Db250ZW50TG9hZGVkLCBmYWxzZSApOworCQkJCisJCQkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yaworCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICJsb2FkIiwgalF1ZXJ5LnJlYWR5LCBmYWxzZSApOworCisJCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKKwkJfSBlbHNlIGlmICggZG9jdW1lbnQuYXR0YWNoRXZlbnQgKSB7CisJCQkvLyBlbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsCisJCQkvLyBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMKKwkJCWRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBET01Db250ZW50TG9hZGVkKTsKKwkJCQorCQkJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKwkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOworCisJCQkvLyBJZiBJRSBhbmQgbm90IGEgZnJhbWUKKwkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKKwkJCXZhciB0b3BsZXZlbCA9IGZhbHNlOworCisJCQl0cnkgeworCQkJCXRvcGxldmVsID0gd2luZG93LmZyYW1lRWxlbWVudCA9PSBudWxsOworCQkJfSBjYXRjaChlKSB7fQorCisJCQlpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB0b3BsZXZlbCApIHsKKwkJCQlkb1Njcm9sbENoZWNrKCk7CisJCQl9CisJCX0KKwl9LAorCisJLy8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBkZXRhaWxzIGNvbmNlcm5pbmcgaXNGdW5jdGlvbi4KKwkvLyBTaW5jZSB2ZXJzaW9uIDEuMywgRE9NIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBsaWtlIGFsZXJ0CisJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KKwlpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkgeworCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImZ1bmN0aW9uIjsKKwl9LAorCisJaXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiggb2JqICkgeworCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKKwl9LAorCisJLy8gQSBjcnVkZSB3YXkgb2YgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGlzIGEgd2luZG93CisJaXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgJiYgInNldEludGVydmFsIiBpbiBvYmo7CisJfSwKKworCWlzTmFOOiBmdW5jdGlvbiggb2JqICkgeworCQlyZXR1cm4gb2JqID09IG51bGwgfHwgIXJkaWdpdC50ZXN0KCBvYmogKSB8fCBpc05hTiggb2JqICk7CisJfSwKKworCXR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiBvYmogPT0gbnVsbCA/CisJCQlTdHJpbmcoIG9iaiApIDoKKwkJCWNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiOworCX0sCisKKwlpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgeworCQkvLyBNdXN0IGJlIGFuIE9iamVjdC4KKwkJLy8gQmVjYXVzZSBvZiBJRSwgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiB0aGUgY29uc3RydWN0b3IgcHJvcGVydHkuCisJCS8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCisJCWlmICggIW9iaiB8fCBqUXVlcnkudHlwZShvYmopICE9PSAib2JqZWN0IiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJLy8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdAorCQlpZiAoIG9iai5jb25zdHJ1Y3RvciAmJgorCQkJIWhhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIikgJiYKKwkJCSFoYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAiaXNQcm90b3R5cGVPZiIpICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQkvLyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCwKKwkJLy8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd24uCisJCisJCXZhciBrZXk7CisJCWZvciAoIGtleSBpbiBvYmogKSB7fQorCQkKKwkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkIHx8IGhhc093bi5jYWxsKCBvYmosIGtleSApOworCX0sCisKKwlpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkgeworCQlmb3IgKCB2YXIgbmFtZSBpbiBvYmogKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKwkKKwllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKKwkJdGhyb3cgbXNnOworCX0sCisJCisJcGFyc2VKU09OOiBmdW5jdGlvbiggZGF0YSApIHsKKwkJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgfHwgIWRhdGEgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCAoSUUgY2FuJ3QgaGFuZGxlIGl0KQorCQlkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgZGF0YSBpcyBhY3R1YWwgSlNPTgorCQkvLyBMb2dpYyBib3Jyb3dlZCBmcm9tIGh0dHA6Ly9qc29uLm9yZy9qc29uMi5qcworCQlpZiAoIHJ2YWxpZGNoYXJzLnRlc3QoZGF0YS5yZXBsYWNlKHJ2YWxpZGVzY2FwZSwgIkAiKQorCQkJLnJlcGxhY2UocnZhbGlkdG9rZW5zLCAiXSIpCisJCQkucmVwbGFjZShydmFsaWRicmFjZXMsICIiKSkgKSB7CisKKwkJCS8vIFRyeSB0byB1c2UgdGhlIG5hdGl2ZSBKU09OIHBhcnNlciBmaXJzdAorCQkJcmV0dXJuIHdpbmRvdy5KU09OICYmIHdpbmRvdy5KU09OLnBhcnNlID8KKwkJCQl3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApIDoKKwkJCQkobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIiArIGRhdGEpKSgpOworCisJCX0gZWxzZSB7CisJCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIEpTT046ICIgKyBkYXRhICk7CisJCX0KKwl9LAorCisJbm9vcDogZnVuY3Rpb24oKSB7fSwKKworCS8vIEV2YWx1bGF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAorCWdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBkYXRhICkgeworCQlpZiAoIGRhdGEgJiYgcm5vdHdoaXRlLnRlc3QoZGF0YSkgKSB7CisJCQkvLyBJbnNwaXJlZCBieSBjb2RlIGJ5IEFuZHJlYSBHaWFtbWFyY2hpCisJCQkvLyBodHRwOi8vd2VicmVmbGVjdGlvbi5ibG9nc3BvdC5jb20vMjAwNy8wOC9nbG9iYWwtc2NvcGUtZXZhbHVhdGlvbi1hbmQtZG9tLmh0bWwKKwkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CisKKwkJCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisKKwkJCWlmICggalF1ZXJ5LnN1cHBvcnQuc2NyaXB0RXZhbCApIHsKKwkJCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBkYXRhICkgKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NyaXB0LnRleHQgPSBkYXRhOworCQkJfQorCisJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgorCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSkuCisJCQloZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQgKTsKKwkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQl9CisJfSwKKworCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKwkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7CisJfSwKKworCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwllYWNoOiBmdW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKKwkJdmFyIG5hbWUsIGkgPSAwLAorCQkJbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aCwKKwkJCWlzT2JqID0gbGVuZ3RoID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRnVuY3Rpb24ob2JqZWN0KTsKKworCQlpZiAoIGFyZ3MgKSB7CisJCQlpZiAoIGlzT2JqICkgeworCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgeworCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkgeworCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIGkrKyBdLCBhcmdzICkgPT09IGZhbHNlICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKKwkJfSBlbHNlIHsKKwkJCWlmICggaXNPYmogKSB7CisJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKSB7CisJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoIHZhciB2YWx1ZSA9IG9iamVjdFswXTsKKwkJCQkJaSA8IGxlbmd0aCAmJiBjYWxsYmFjay5jYWxsKCB2YWx1ZSwgaSwgdmFsdWUgKSAhPT0gZmFsc2U7IHZhbHVlID0gb2JqZWN0WysraV0gKSB7fQorCQkJfQorCQl9CisKKwkJcmV0dXJuIG9iamVjdDsKKwl9LAorCisJLy8gVXNlIG5hdGl2ZSBTdHJpbmcudHJpbSBmdW5jdGlvbiB3aGVyZXZlciBwb3NzaWJsZQorCXRyaW06IHRyaW0gPworCQlmdW5jdGlvbiggdGV4dCApIHsKKwkJCXJldHVybiB0ZXh0ID09IG51bGwgPworCQkJCSIiIDoKKwkJCQl0cmltLmNhbGwoIHRleHQgKTsKKwkJfSA6CisKKwkJLy8gT3RoZXJ3aXNlIHVzZSBvdXIgb3duIHRyaW1taW5nIGZ1bmN0aW9uYWxpdHkKKwkJZnVuY3Rpb24oIHRleHQgKSB7CisJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KKwkJCQkiIiA6CisJCQkJdGV4dC50b1N0cmluZygpLnJlcGxhY2UoIHRyaW1MZWZ0LCAiIiApLnJlcGxhY2UoIHRyaW1SaWdodCwgIiIgKTsKKwkJfSwKKworCS8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKKwkJdmFyIHJldCA9IHJlc3VsdHMgfHwgW107CisKKwkJaWYgKCBhcnJheSAhPSBudWxsICkgeworCQkJLy8gVGhlIHdpbmRvdywgc3RyaW5ncyAoYW5kIGZ1bmN0aW9ucykgYWxzbyBoYXZlICdsZW5ndGgnCisJCQkvLyBUaGUgZXh0cmEgdHlwZW9mIGZ1bmN0aW9uIGNoZWNrIGlzIHRvIHByZXZlbnQgY3Jhc2hlcworCQkJLy8gaW4gU2FmYXJpIDIgKFNlZTogIzMwMzkpCisJCQkvLyBUd2Vha2VkIGxvZ2ljIHNsaWdodGx5IHRvIGhhbmRsZSBCbGFja2JlcnJ5IDQuNyBSZWdFeHAgaXNzdWVzICM2OTMwCisJCQl2YXIgdHlwZSA9IGpRdWVyeS50eXBlKGFycmF5KTsKKworCQkJaWYgKCBhcnJheS5sZW5ndGggPT0gbnVsbCB8fCB0eXBlID09PSAic3RyaW5nIiB8fCB0eXBlID09PSAiZnVuY3Rpb24iIHx8IHR5cGUgPT09ICJyZWdleHAiIHx8IGpRdWVyeS5pc1dpbmRvdyggYXJyYXkgKSApIHsKKwkJCQlwdXNoLmNhbGwoIHJldCwgYXJyYXkgKTsKKwkJCX0gZWxzZSB7CisJCQkJalF1ZXJ5Lm1lcmdlKCByZXQsIGFycmF5ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CisJCWlmICggYXJyYXkuaW5kZXhPZiApIHsKKwkJCXJldHVybiBhcnJheS5pbmRleE9mKCBlbGVtICk7CisJCX0KKworCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJaWYgKCBhcnJheVsgaSBdID09PSBlbGVtICkgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIC0xOworCX0sCisKKwltZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7CisJCXZhciBpID0gZmlyc3QubGVuZ3RoLAorCQkJaiA9IDA7CisKKwkJaWYgKCB0eXBlb2Ygc2Vjb25kLmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CisJCQlmb3IgKCB2YXIgbCA9IHNlY29uZC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CisJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07CisJCQl9CisJCQorCQl9IGVsc2UgeworCQkJd2hpbGUgKCBzZWNvbmRbal0gIT09IHVuZGVmaW5lZCApIHsKKwkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGorKyBdOworCQkJfQorCQl9CisKKwkJZmlyc3QubGVuZ3RoID0gaTsKKworCQlyZXR1cm4gZmlyc3Q7CisJfSwKKworCWdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiApIHsKKwkJdmFyIHJldCA9IFtdLCByZXRWYWw7CisJCWludiA9ICEhaW52OworCisJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKKwkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KKwkJZm9yICggdmFyIGkgPSAwLCBsZW5ndGggPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJCXJldFZhbCA9ICEhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKKwkJCWlmICggaW52ICE9PSByZXRWYWwgKSB7CisJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCS8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorCW1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkgeworCQl2YXIgcmV0ID0gW10sIHZhbHVlOworCisJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpcgorCQkvLyBuZXcgdmFsdWUgKG9yIHZhbHVlcykuCisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKKworCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgeworCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOworCX0sCisKKwkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKKwlndWlkOiAxLAorCisJcHJveHk6IGZ1bmN0aW9uKCBmbiwgcHJveHksIHRoaXNPYmplY3QgKSB7CisJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMiApIHsKKwkJCWlmICggdHlwZW9mIHByb3h5ID09PSAic3RyaW5nIiApIHsKKwkJCQl0aGlzT2JqZWN0ID0gZm47CisJCQkJZm4gPSB0aGlzT2JqZWN0WyBwcm94eSBdOworCQkJCXByb3h5ID0gdW5kZWZpbmVkOworCisJCQl9IGVsc2UgaWYgKCBwcm94eSAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3h5ICkgKSB7CisJCQkJdGhpc09iamVjdCA9IHByb3h5OworCQkJCXByb3h5ID0gdW5kZWZpbmVkOworCQkJfQorCQl9CisKKwkJaWYgKCAhcHJveHkgJiYgZm4gKSB7CisJCQlwcm94eSA9IGZ1bmN0aW9uKCkgeworCQkJCXJldHVybiBmbi5hcHBseSggdGhpc09iamVjdCB8fCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJCX07CisJCX0KKworCQkvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWQKKwkJaWYgKCBmbiApIHsKKwkJCXByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBwcm94eS5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CisJCX0KKworCQkvLyBTbyBwcm94eSBjYW4gYmUgZGVjbGFyZWQgYXMgYW4gYXJndW1lbnQKKwkJcmV0dXJuIHByb3h5OworCX0sCisKKwkvLyBNdXRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIHRvIGEgY29sbGVjdGlvbgorCS8vIFRoZSB2YWx1ZS9zIGNhbiBiZSBvcHRpb25hbGx5IGJ5IGV4ZWN1dGVkIGlmIGl0cyBhIGZ1bmN0aW9uCisJYWNjZXNzOiBmdW5jdGlvbiggZWxlbXMsIGtleSwgdmFsdWUsIGV4ZWMsIGZuLCBwYXNzICkgeworCQl2YXIgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOworCQorCQkvLyBTZXR0aW5nIG1hbnkgYXR0cmlidXRlcworCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgeworCQkJZm9yICggdmFyIGsgaW4ga2V5ICkgeworCQkJCWpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBrLCBrZXlba10sIGV4ZWMsIGZuLCB2YWx1ZSApOworCQkJfQorCQkJcmV0dXJuIGVsZW1zOworCQl9CisJCisJCS8vIFNldHRpbmcgb25lIGF0dHJpYnV0ZQorCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisJCQkvLyBPcHRpb25hbGx5LCBmdW5jdGlvbiB2YWx1ZXMgZ2V0IGV4ZWN1dGVkIGlmIGV4ZWMgaXMgdHJ1ZQorCQkJZXhlYyA9ICFwYXNzICYmIGV4ZWMgJiYgalF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpOworCQkKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJCWZuKCBlbGVtc1tpXSwga2V5LCBleGVjID8gdmFsdWUuY2FsbCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSA6IHZhbHVlLCBwYXNzICk7CisJCQl9CisJCQorCQkJcmV0dXJuIGVsZW1zOworCQl9CisJCisJCS8vIEdldHRpbmcgYW4gYXR0cmlidXRlCisJCXJldHVybiBsZW5ndGggPyBmbiggZWxlbXNbMF0sIGtleSApIDogdW5kZWZpbmVkOworCX0sCisKKwlub3c6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKwl9LAorCisJLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi4KKwkvLyBNb3JlIGRldGFpbHM6IGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVXRpbGl0aWVzL2pRdWVyeS5icm93c2VyCisJdWFNYXRjaDogZnVuY3Rpb24oIHVhICkgeworCQl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7CisKKwkJdmFyIG1hdGNoID0gcndlYmtpdC5leGVjKCB1YSApIHx8CisJCQlyb3BlcmEuZXhlYyggdWEgKSB8fAorCQkJcm1zaWUuZXhlYyggdWEgKSB8fAorCQkJdWEuaW5kZXhPZigiY29tcGF0aWJsZSIpIDwgMCAmJiBybW96aWxsYS5leGVjKCB1YSApIHx8CisJCQlbXTsKKworCQlyZXR1cm4geyBicm93c2VyOiBtYXRjaFsxXSB8fCAiIiwgdmVyc2lvbjogbWF0Y2hbMl0gfHwgIjAiIH07CisJfSwKKworCWJyb3dzZXI6IHt9Cit9KTsKKworLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCitqUXVlcnkuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgbmFtZSkgeworCWNsYXNzMnR5cGVbICJbb2JqZWN0ICIgKyBuYW1lICsgIl0iIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7Cit9KTsKKworYnJvd3Nlck1hdGNoID0galF1ZXJ5LnVhTWF0Y2goIHVzZXJBZ2VudCApOworaWYgKCBicm93c2VyTWF0Y2guYnJvd3NlciApIHsKKwlqUXVlcnkuYnJvd3NlclsgYnJvd3Nlck1hdGNoLmJyb3dzZXIgXSA9IHRydWU7CisJalF1ZXJ5LmJyb3dzZXIudmVyc2lvbiA9IGJyb3dzZXJNYXRjaC52ZXJzaW9uOworfQorCisvLyBEZXByZWNhdGVkLCB1c2UgalF1ZXJ5LmJyb3dzZXIud2Via2l0IGluc3RlYWQKK2lmICggalF1ZXJ5LmJyb3dzZXIud2Via2l0ICkgeworCWpRdWVyeS5icm93c2VyLnNhZmFyaSA9IHRydWU7Cit9CisKK2lmICggaW5kZXhPZiApIHsKKwlqUXVlcnkuaW5BcnJheSA9IGZ1bmN0aW9uKCBlbGVtLCBhcnJheSApIHsKKwkJcmV0dXJuIGluZGV4T2YuY2FsbCggYXJyYXksIGVsZW0gKTsKKwl9OworfQorCisvLyBWZXJpZnkgdGhhdCBccyBtYXRjaGVzIG5vbi1icmVha2luZyBzcGFjZXMKKy8vIChJRSBmYWlscyBvbiB0aGlzIHRlc3QpCitpZiAoICFyd2hpdGUudGVzdCggIlx4QTAiICkgKSB7CisJdHJpbUxlZnQgPSAvXltcc1x4QTBdKy87CisJdHJpbVJpZ2h0ID0gL1tcc1x4QTBdKyQvOworfQorCisvLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKK3Jvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOworCisvLyBDbGVhbnVwIGZ1bmN0aW9ucyBmb3IgdGhlIGRvY3VtZW50IHJlYWR5IG1ldGhvZAoraWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgeworCURPTUNvbnRlbnRMb2FkZWQgPSBmdW5jdGlvbigpIHsKKwkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBET01Db250ZW50TG9hZGVkLCBmYWxzZSApOworCQlqUXVlcnkucmVhZHkoKTsKKwl9OworCit9IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCApIHsKKwlET01Db250ZW50TG9hZGVkID0gZnVuY3Rpb24oKSB7CisJCS8vIE1ha2Ugc3VyZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2UgSUUgZ2V0cyBhIGxpdHRsZSBvdmVyemVhbG91cyAodGlja2V0ICM1NDQzKS4KKwkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBET01Db250ZW50TG9hZGVkICk7CisJCQlqUXVlcnkucmVhZHkoKTsKKwkJfQorCX07Cit9CisKKy8vIFRoZSBET00gcmVhZHkgY2hlY2sgZm9yIEludGVybmV0IEV4cGxvcmVyCitmdW5jdGlvbiBkb1Njcm9sbENoZWNrKCkgeworCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CisJCXJldHVybjsKKwl9CisKKwl0cnkgeworCQkvLyBJZiBJRSBpcyB1c2VkLCB1c2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaQorCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLworCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTsKKwl9IGNhdGNoKGUpIHsKKwkJc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgMSApOworCQlyZXR1cm47CisJfQorCisJLy8gYW5kIGV4ZWN1dGUgYW55IHdhaXRpbmcgZnVuY3Rpb25zCisJalF1ZXJ5LnJlYWR5KCk7Cit9CisKKy8vIEV4cG9zZSBqUXVlcnkgdG8gdGhlIGdsb2JhbCBvYmplY3QKK3JldHVybiAod2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5KTsKKworfSkoKTsKKworCisoZnVuY3Rpb24oKSB7CisKKwlqUXVlcnkuc3VwcG9ydCA9IHt9OworCisJdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLAorCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKKwkJaWQgPSAic2NyaXB0IiArIGpRdWVyeS5ub3coKTsKKworCWRpdi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCWRpdi5pbm5lckhUTUwgPSAiICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0nY29sb3I6cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7CisKKwl2YXIgYWxsID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksCisJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSwKKwkJc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksCisJCW9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIikgKTsKKworCS8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKKwlpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CisJCXJldHVybjsKKwl9CisKKwlqUXVlcnkuc3VwcG9ydCA9IHsKKwkJLy8gSUUgc3RyaXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIC5pbm5lckhUTUwgaXMgdXNlZAorCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMsCisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKKwkJLy8gSUUgd2lsbCBpbnNlcnQgdGhlbSBpbnRvIGVtcHR5IHRhYmxlcworCQl0Ym9keTogIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsCisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MCisJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQgaW4gSUUKKwkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsCisKKwkJLy8gR2V0IHRoZSBzdHlsZSBpbmZvcm1hdGlvbiBmcm9tIGdldEF0dHJpYnV0ZQorCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWQpCisJCXN0eWxlOiAvcmVkLy50ZXN0KCBhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSApLAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCisJCS8vIChJRSBub3JtYWxpemVzIGl0IGJ5IGRlZmF1bHQpCisJCWhyZWZOb3JtYWxpemVkOiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiL2EiLAorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKKwkJLy8gKElFIHVzZXMgZmlsdGVyIGluc3RlYWQpCisJCS8vIFVzZSBhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgV2ViS2l0IGlzc3VlLiBTZWUgIzUxNDUKKwkJb3BhY2l0eTogL14wLjU1JC8udGVzdCggYS5zdHlsZS5vcGFjaXR5ICksCisKKwkJLy8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQorCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCisJCWNzc0Zsb2F0OiAhIWEuc3R5bGUuY3NzRmxvYXQsCisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBhIGNoZWNrYm94CisJCS8vIHRoYXQgaXQgZGVmYXVsdHMgdG8gIm9uIi4KKwkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byAiIiBpbnN0ZWFkKQorCQljaGVja09uOiBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0udmFsdWUgPT09ICJvbiIsCisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgYSBzZWxlY3RlZC1ieS1kZWZhdWx0IG9wdGlvbiBoYXMgYSB3b3JraW5nIHNlbGVjdGVkIHByb3BlcnR5LgorCQkvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9wdGdyb3VwKQorCQlvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLAorCisJCS8vIFdpbGwgYmUgZGVmaW5lZCBsYXRlcgorCQlkZWxldGVFeHBhbmRvOiB0cnVlLAorCQlvcHREaXNhYmxlZDogZmFsc2UsCisJCWNoZWNrQ2xvbmU6IGZhbHNlLAorCQlzY3JpcHRFdmFsOiBmYWxzZSwKKwkJbm9DbG9uZUV2ZW50OiB0cnVlLAorCQlib3hNb2RlbDogbnVsbCwKKwkJaW5saW5lQmxvY2tOZWVkc0xheW91dDogZmFsc2UsCisJCXNocmlua1dyYXBCbG9ja3M6IGZhbHNlLAorCQlyZWxpYWJsZUhpZGRlbk9mZnNldHM6IHRydWUKKwl9OworCisJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG9wdGlvbnMgaW5zaWRlIGRpc2FibGVkIHNlbGVjdHMgYXJlbid0IG1hcmtlZCBhcyBkaXNhYmxlZAorCS8vIChXZWJLaXQgbWFya3MgdGhlbSBhcyBkaWFibGVkKQorCXNlbGVjdC5kaXNhYmxlZCA9IHRydWU7CisJalF1ZXJ5LnN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkOworCisJc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKKwl0cnkgeworCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCAid2luZG93LiIgKyBpZCArICI9MTsiICkgKTsKKwl9IGNhdGNoKGUpIHt9CisKKwlyb290Lmluc2VydEJlZm9yZSggc2NyaXB0LCByb290LmZpcnN0Q2hpbGQgKTsKKworCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBleGVjdXRpb24gb2YgY29kZSB3b3JrcyBieSBpbmplY3RpbmcgYSBzY3JpcHQKKwkvLyB0YWcgd2l0aCBhcHBlbmRDaGlsZC9jcmVhdGVUZXh0Tm9kZQorCS8vIChJRSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgZmFpbHMsIGFuZCB1c2VzIC50ZXh0IGluc3RlYWQpCisJaWYgKCB3aW5kb3dbIGlkIF0gKSB7CisJCWpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgPSB0cnVlOworCQlkZWxldGUgd2luZG93WyBpZCBdOworCX0KKworCS8vIFRlc3QgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZGVsZXRlIGFuIGV4cGFuZG8gZnJvbSBhbiBlbGVtZW50CisJLy8gRmFpbHMgaW4gSW50ZXJuZXQgRXhwbG9yZXIKKwl0cnkgeworCQlkZWxldGUgc2NyaXB0LnRlc3Q7CisKKwl9IGNhdGNoKGUpIHsKKwkJalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOworCX0KKworCXJvb3QucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCisJaWYgKCBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHsKKwkJZGl2LmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgZnVuY3Rpb24gY2xpY2soKSB7CisJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQorCQkJLy8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcykKKwkJCWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOworCQkJZGl2LmRldGFjaEV2ZW50KCJvbmNsaWNrIiwgY2xpY2spOworCQl9KTsKKwkJZGl2LmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKTsKKwl9CisKKwlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuaW5uZXJIVE1MID0gIjxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0ncmFkaW90ZXN0JyBjaGVja2VkPSdjaGVja2VkJy8+IjsKKworCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKwlmcmFnbWVudC5hcHBlbmRDaGlsZCggZGl2LmZpcnN0Q2hpbGQgKTsKKworCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cworCWpRdWVyeS5zdXBwb3J0LmNoZWNrQ2xvbmUgPSBmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkuY2xvbmVOb2RlKHRydWUpLmxhc3RDaGlsZC5jaGVja2VkOworCisJLy8gRmlndXJlIG91dCBpZiB0aGUgVzNDIGJveCBtb2RlbCB3b3JrcyBhcyBleHBlY3RlZAorCS8vIGRvY3VtZW50LmJvZHkgbXVzdCBleGlzdCBiZWZvcmUgd2UgY2FuIGRvIHRoaXMKKwlqUXVlcnkoZnVuY3Rpb24oKSB7CisJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLnBhZGRpbmdMZWZ0ID0gIjFweCI7CisKKwkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZGl2ICk7CisJCWpRdWVyeS5ib3hNb2RlbCA9IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsID0gZGl2Lm9mZnNldFdpZHRoID09PSAyOworCisJCWlmICggInpvb20iIGluIGRpdi5zdHlsZSApIHsKKwkJCS8vIENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRzIGFjdCBsaWtlIGlubGluZS1ibG9jaworCQkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZworCQkJLy8gdGhlbSBsYXlvdXQKKwkJCS8vIChJRSA8IDggZG9lcyB0aGlzKQorCQkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKKwkJCWRpdi5zdHlsZS56b29tID0gMTsKKwkJCWpRdWVyeS5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgPSBkaXYub2Zmc2V0V2lkdGggPT09IDI7CisKKwkJCS8vIENoZWNrIGlmIGVsZW1lbnRzIHdpdGggbGF5b3V0IHNocmluay13cmFwIHRoZWlyIGNoaWxkcmVuCisJCQkvLyAoSUUgNiBkb2VzIHRoaXMpCisJCQlkaXYuc3R5bGUuZGlzcGxheSA9ICIiOworCQkJZGl2LmlubmVySFRNTCA9ICI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iOworCQkJalF1ZXJ5LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9IGRpdi5vZmZzZXRXaWR0aCAhPT0gMjsKKwkJfQorCisJCWRpdi5pbm5lckhUTUwgPSAiPHRhYmxlPjx0cj48dGQgc3R5bGU9J3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iOworCQl2YXIgdGRzID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCisJCS8vIENoZWNrIGlmIHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhleSBhcmUgc2V0CisJCS8vIHRvIGRpc3BsYXk6bm9uZSBhbmQgdGhlcmUgYXJlIHN0aWxsIG90aGVyIHZpc2libGUgdGFibGUgY2VsbHMgaW4gYQorCQkvLyB0YWJsZSByb3c7IGlmIHNvLCBvZmZzZXRXaWR0aC9IZWlnaHQgYXJlIG5vdCByZWxpYWJsZSBmb3IgdXNlIHdoZW4KKwkJLy8gZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVlbiBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKKwkJLy8gZGlzcGxheTpub25lIChpdCBpcyBzdGlsbCBzYWZlIHRvIHVzZSBvZmZzZXRzIGlmIGEgcGFyZW50IGVsZW1lbnQgaXMKKwkJLy8gaGlkZGVuOyBkb24gc2FmZXR5IGdvZ2dsZXMgYW5kIHNlZSBidWcgIzQ1MTIgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgorCQkvLyAob25seSBJRSA4IGZhaWxzIHRoaXMgdGVzdCkKKwkJalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzID0gdGRzWzBdLm9mZnNldEhlaWdodCA9PT0gMDsKKworCQl0ZHNbMF0uc3R5bGUuZGlzcGxheSA9ICIiOworCQl0ZHNbMV0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKworCQkvLyBDaGVjayBpZiBlbXB0eSB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodAorCQkvLyAoSUUgPCA4IGZhaWwgdGhpcyB0ZXN0KQorCQlqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgPSBqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgdGRzWzBdLm9mZnNldEhlaWdodCA9PT0gMDsKKwkJZGl2LmlubmVySFRNTCA9ICIiOworCisJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCWRpdiA9IHRkcyA9IG51bGw7CisJfSk7CisKKwkvLyBUZWNobmlxdWUgZnJvbSBKdXJpeSBaYXl0c2V2CisJLy8gaHR0cDovL3RoaW5rd2ViMi5jb20vcHJvamVjdHMvcHJvdG90eXBlL2RldGVjdGluZy1ldmVudC1zdXBwb3J0LXdpdGhvdXQtYnJvd3Nlci1zbmlmZmluZy8KKwl2YXIgZXZlbnRTdXBwb3J0ZWQgPSBmdW5jdGlvbiggZXZlbnROYW1lICkgeworCQl2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJZXZlbnROYW1lID0gIm9uIiArIGV2ZW50TmFtZTsKKworCQl2YXIgaXNTdXBwb3J0ZWQgPSAoZXZlbnROYW1lIGluIGVsKTsKKwkJaWYgKCAhaXNTdXBwb3J0ZWQgKSB7CisJCQllbC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAicmV0dXJuOyIpOworCQkJaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxbZXZlbnROYW1lXSA9PT0gImZ1bmN0aW9uIjsKKwkJfQorCQllbCA9IG51bGw7CisKKwkJcmV0dXJuIGlzU3VwcG9ydGVkOworCX07CisKKwlqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzID0gZXZlbnRTdXBwb3J0ZWQoInN1Ym1pdCIpOworCWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgPSBldmVudFN1cHBvcnRlZCgiY2hhbmdlIik7CisKKwkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQorCXJvb3QgPSBzY3JpcHQgPSBkaXYgPSBhbGwgPSBhID0gbnVsbDsKK30pKCk7CisKKworCit2YXIgd2luZG93RGF0YSA9IHt9LAorCXJicmFjZSA9IC9eKD86XHsuKlx9fFxbLipcXSkkLzsKKworalF1ZXJ5LmV4dGVuZCh7CisJY2FjaGU6IHt9LAorCisJLy8gUGxlYXNlIHVzZSB3aXRoIGNhdXRpb24KKwl1dWlkOiAwLAorCisJLy8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCQorCWV4cGFuZG86ICJqUXVlcnkiICsgalF1ZXJ5Lm5vdygpLAorCisJLy8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNhdGNoYWJsZSBleGNlcHRpb25zIGlmIHlvdQorCS8vIGF0dGVtcHQgdG8gYWRkIGV4cGFuZG8gcHJvcGVydGllcyB0byB0aGVtLgorCW5vRGF0YTogeworCQkiZW1iZWQiOiB0cnVlLAorCQkvLyBCYW4gYWxsIG9iamVjdHMgZXhjZXB0IGZvciBGbGFzaCAod2hpY2ggaGFuZGxlIGV4cGFuZG9zKQorCQkib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsCisJCSJhcHBsZXQiOiB0cnVlCisJfSwKKworCWRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgeworCQlpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KKwkJCXdpbmRvd0RhdGEgOgorCQkJZWxlbTsKKworCQl2YXIgaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKKwkJCWlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IG51bGwsCisJCQljYWNoZSA9IGpRdWVyeS5jYWNoZSwgdGhpc0NhY2hlOworCisJCWlmICggaXNOb2RlICYmICFpZCAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIgJiYgZGF0YSA9PT0gdW5kZWZpbmVkICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gR2V0IHRoZSBkYXRhIGZyb20gdGhlIG9iamVjdCBkaXJlY3RseQorCQlpZiAoICFpc05vZGUgKSB7CisJCQljYWNoZSA9IGVsZW07CisKKwkJLy8gQ29tcHV0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQKKwkJfSBlbHNlIGlmICggIWlkICkgeworCQkJZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA9IGlkID0gKytqUXVlcnkudXVpZDsKKwkJfQorCisJCS8vIEF2b2lkIGdlbmVyYXRpbmcgYSBuZXcgY2FjaGUgdW5sZXNzIG5vbmUgZXhpc3RzIGFuZCB3ZQorCQkvLyB3YW50IHRvIG1hbmlwdWxhdGUgaXQuCisJCWlmICggdHlwZW9mIG5hbWUgPT09ICJvYmplY3QiICkgeworCQkJaWYgKCBpc05vZGUgKSB7CisJCQkJY2FjaGVbIGlkIF0gPSBqUXVlcnkuZXh0ZW5kKGNhY2hlWyBpZCBdLCBuYW1lKTsKKworCQkJfSBlbHNlIHsKKwkJCQlqUXVlcnkuZXh0ZW5kKCBjYWNoZSwgbmFtZSApOworCQkJfQorCisJCX0gZWxzZSBpZiAoIGlzTm9kZSAmJiAhY2FjaGVbIGlkIF0gKSB7CisJCQljYWNoZVsgaWQgXSA9IHt9OworCQl9CisKKwkJdGhpc0NhY2hlID0gaXNOb2RlID8gY2FjaGVbIGlkIF0gOiBjYWNoZTsKKworCQkvLyBQcmV2ZW50IG92ZXJyaWRpbmcgdGhlIG5hbWVkIGNhY2hlIHdpdGggdW5kZWZpbmVkIHZhbHVlcworCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKKwkJCXRoaXNDYWNoZVsgbmFtZSBdID0gZGF0YTsKKwkJfQorCisJCXJldHVybiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIgPyB0aGlzQ2FjaGVbIG5hbWUgXSA6IHRoaXNDYWNoZTsKKwl9LAorCisJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPworCQkJd2luZG93RGF0YSA6CisJCQllbGVtOworCisJCXZhciBpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAorCQkJaWQgPSBpc05vZGUgPyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIDogZWxlbSwKKwkJCWNhY2hlID0galF1ZXJ5LmNhY2hlLAorCQkJdGhpc0NhY2hlID0gaXNOb2RlID8gY2FjaGVbIGlkIF0gOiBpZDsKKworCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhCisJCWlmICggbmFtZSApIHsKKwkJCWlmICggdGhpc0NhY2hlICkgeworCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCisJCQkJZGVsZXRlIHRoaXNDYWNoZVsgbmFtZSBdOworCisJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCisJCQkJaWYgKCBpc05vZGUgJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QodGhpc0NhY2hlKSApIHsKKwkJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0gKTsKKwkJCQl9CisJCQl9CisKKwkJLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVsZW1lbnQncyBkYXRhCisJCX0gZWxzZSB7CisJCQlpZiAoIGlzTm9kZSAmJiBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvICkgeworCQkJCWRlbGV0ZSBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOworCisJCQl9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHsKKwkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKKworCQkJLy8gQ29tcGxldGVseSByZW1vdmUgdGhlIGRhdGEgY2FjaGUKKwkJCX0gZWxzZSBpZiAoIGlzTm9kZSApIHsKKwkJCQlkZWxldGUgY2FjaGVbIGlkIF07CisKKwkJCS8vIFJlbW92ZSBhbGwgZmllbGRzIGZyb20gdGhlIG9iamVjdAorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIgbiBpbiBlbGVtICkgeworCQkJCQlkZWxldGUgZWxlbVsgbiBdOworCQkJCX0KKwkJCX0KKwkJfQorCX0sCisKKwkvLyBBIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBET00gbm9kZSBjYW4gaGFuZGxlIHRoZSBkYXRhIGV4cGFuZG8KKwlhY2NlcHREYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJaWYgKCBlbGVtLm5vZGVOYW1lICkgeworCQkJdmFyIG1hdGNoID0galF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CisKKwkJCWlmICggbWF0Y2ggKSB7CisJCQkJcmV0dXJuICEobWF0Y2ggPT09IHRydWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSAhPT0gbWF0Y2gpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworCQl2YXIgZGF0YSA9IG51bGw7CisKKwkJaWYgKCB0eXBlb2Yga2V5ID09PSAidW5kZWZpbmVkIiApIHsKKwkJCWlmICggdGhpcy5sZW5ndGggKSB7CisJCQkJdmFyIGF0dHIgPSB0aGlzWzBdLmF0dHJpYnV0ZXMsIG5hbWU7CisJCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCB0aGlzWzBdICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJbmFtZSA9IGF0dHJbaV0ubmFtZTsKKworCQkJCQlpZiAoIG5hbWUuaW5kZXhPZiggImRhdGEtIiApID09PSAwICkgeworCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyKCA1ICk7CisJCQkJCQlkYXRhQXR0ciggdGhpc1swXSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBkYXRhOworCisJCX0gZWxzZSBpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5ICk7CisJCQl9KTsKKwkJfQorCisJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOworCQlwYXJ0c1sxXSA9IHBhcnRzWzFdID8gIi4iICsgcGFydHNbMV0gOiAiIjsKKworCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CisJCQlkYXRhID0gdGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIgKyBwYXJ0c1sxXSArICIhIiwgW3BhcnRzWzBdXSk7CisKKwkJCS8vIFRyeSB0byBmZXRjaCBhbnkgaW50ZXJuYWxseSBzdG9yZWQgZGF0YSBmaXJzdAorCQkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5sZW5ndGggKSB7CisJCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCB0aGlzWzBdLCBrZXkgKTsKKwkJCQlkYXRhID0gZGF0YUF0dHIoIHRoaXNbMF0sIGtleSwgZGF0YSApOworCQkJfQorCisJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KKwkJCQl0aGlzLmRhdGEoIHBhcnRzWzBdICkgOgorCQkJCWRhdGE7CisKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJdmFyICR0aGlzID0galF1ZXJ5KCB0aGlzICksCisJCQkJCWFyZ3MgPSBbIHBhcnRzWzBdLCB2YWx1ZSBdOworCisJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CisJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKKwkJCQkkdGhpcy50cmlnZ2VySGFuZGxlciggImNoYW5nZURhdGEiICsgcGFydHNbMV0gKyAiISIsIGFyZ3MgKTsKKwkJCX0pOworCQl9CisJfSwKKworCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CisJCX0pOworCX0KK30pOworCitmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgeworCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKKwkvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUKKwlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJkYXRhLSIgKyBrZXkgKTsKKworCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKKwkJCXRyeSB7CisJCQkJZGF0YSA9IGRhdGEgPT09ICJ0cnVlIiA/IHRydWUgOgorCQkJCWRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CisJCQkJZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6CisJCQkJIWpRdWVyeS5pc05hTiggZGF0YSApID8gcGFyc2VGbG9hdCggZGF0YSApIDoKKwkJCQkJcmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6CisJCQkJCWRhdGE7CisJCQl9IGNhdGNoKCBlICkge30KKworCQkJLy8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyCisJCQlqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBkYXRhICk7CisKKwkJfSBlbHNlIHsKKwkJCWRhdGEgPSB1bmRlZmluZWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworCisKKworalF1ZXJ5LmV4dGVuZCh7CisJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgeworCQlpZiAoICFlbGVtICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgInF1ZXVlIjsKKwkJdmFyIHEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSApOworCisJCS8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXAKKwkJaWYgKCAhZGF0YSApIHsKKwkJCXJldHVybiBxIHx8IFtdOworCQl9CisKKwkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKKwkJCXEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOworCisJCX0gZWxzZSB7CisJCQlxLnB1c2goIGRhdGEgKTsKKwkJfQorCisJCXJldHVybiBxOworCX0sCisKKwlkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKwkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKKwkJCWZuID0gcXVldWUuc2hpZnQoKTsKKworCQkvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsCisJCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKKwkJCWZuID0gcXVldWUuc2hpZnQoKTsKKwkJfQorCisJCWlmICggZm4gKSB7CisJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCisJCQkvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCisJCQlpZiAoIHR5cGUgPT09ICJmeCIgKSB7CisJCQkJcXVldWUudW5zaGlmdCgiaW5wcm9ncmVzcyIpOworCQkJfQorCisJCQlmbi5jYWxsKGVsZW0sIGZ1bmN0aW9uKCkgeworCQkJCWpRdWVyeS5kZXF1ZXVlKGVsZW0sIHR5cGUpOworCQkJfSk7CisJCX0KKwl9Cit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKKwkJCWRhdGEgPSB0eXBlOworCQkJdHlwZSA9ICJmeCI7CisJCX0KKworCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKKwkJCXJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbMF0sIHR5cGUgKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgeworCQkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7CisKKwkJCWlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlucHJvZ3Jlc3MiICkgeworCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CisJCQl9CisJCX0pOworCX0sCisJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworCQl9KTsKKwl9LAorCisJLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLgorCS8vIGh0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBocC8yMDA5LzA3L2pxdWVyeS1kZWxheS8KKwlkZWxheTogZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7CisJCXRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzW3RpbWVdIHx8IHRpbWUgOiB0aW1lOworCQl0eXBlID0gdHlwZSB8fCAiZngiOworCisJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbigpIHsKKwkJCXZhciBlbGVtID0gdGhpczsKKwkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsKKwkJCX0sIHRpbWUgKTsKKwkJfSk7CisJfSwKKworCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworCX0KK30pOworCisKKworCit2YXIgcmNsYXNzID0gL1tcblx0XS9nLAorCXJzcGFjZXMgPSAvXHMrLywKKwlycmV0dXJuID0gL1xyL2csCisJcnNwZWNpYWx1cmwgPSAvXig/OmhyZWZ8c3JjfHN0eWxlKSQvLAorCXJ0eXBlID0gL14oPzpidXR0b258aW5wdXQpJC9pLAorCXJmb2N1c2FibGUgPSAvXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSwKKwlyY2xpY2thYmxlID0gL15hKD86cmVhKT8kL2ksCisJcnJhZGlvY2hlY2sgPSAvXig/OnJhZGlvfGNoZWNrYm94KSQvaTsKKworalF1ZXJ5LnByb3BzID0geworCSJmb3IiOiAiaHRtbEZvciIsCisJImNsYXNzIjogImNsYXNzTmFtZSIsCisJcmVhZG9ubHk6ICJyZWFkT25seSIsCisJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwKKwljZWxsc3BhY2luZzogImNlbGxTcGFjaW5nIiwKKwlyb3dzcGFuOiAicm93U3BhbiIsCisJY29sc3BhbjogImNvbFNwYW4iLAorCXRhYmluZGV4OiAidGFiSW5kZXgiLAorCXVzZW1hcDogInVzZU1hcCIsCisJZnJhbWVib3JkZXI6ICJmcmFtZUJvcmRlciIKK307CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKKwkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIG5hbWUsIHZhbHVlLCB0cnVlLCBqUXVlcnkuYXR0ciApOworCX0sCisKKwlyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSwgZm4gKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5hdHRyKCB0aGlzLCBuYW1lLCAiIiApOworCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICkgeworCQkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7CisJCQl9CisJCX0pOworCX0sCisKKwlhZGRDbGFzczogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCXZhciBzZWxmID0galF1ZXJ5KHRoaXMpOworCQkJCXNlbGYuYWRkQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgc2VsZi5hdHRyKCJjbGFzcyIpKSApOworCQkJfSk7CisJCX0KKworCQlpZiAoIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CisJCQl2YXIgY2xhc3NOYW1lcyA9ICh2YWx1ZSB8fCAiIikuc3BsaXQoIHJzcGFjZXMgKTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJdmFyIGVsZW0gPSB0aGlzW2ldOworCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCQlpZiAoICFlbGVtLmNsYXNzTmFtZSApIHsKKwkJCQkJCWVsZW0uY2xhc3NOYW1lID0gdmFsdWU7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXZhciBjbGFzc05hbWUgPSAiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIiwKKwkJCQkJCQlzZXRDbGFzcyA9IGVsZW0uY2xhc3NOYW1lOworCisJCQkJCQlmb3IgKCB2YXIgYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkgeworCQkJCQkJCWlmICggY2xhc3NOYW1lLmluZGV4T2YoICIgIiArIGNsYXNzTmFtZXNbY10gKyAiICIgKSA8IDAgKSB7CisJCQkJCQkJCXNldENsYXNzICs9ICIgIiArIGNsYXNzTmFtZXNbY107CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggc2V0Q2xhc3MgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCXZhciBzZWxmID0galF1ZXJ5KHRoaXMpOworCQkJCXNlbGYucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgc2VsZi5hdHRyKCJjbGFzcyIpKSApOworCQkJfSk7CisJCX0KKworCQlpZiAoICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCQkJdmFyIGNsYXNzTmFtZXMgPSAodmFsdWUgfHwgIiIpLnNwbGl0KCByc3BhY2VzICk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCXZhciBlbGVtID0gdGhpc1tpXTsKKworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmNsYXNzTmFtZSApIHsKKwkJCQkJaWYgKCB2YWx1ZSApIHsKKwkJCQkJCXZhciBjbGFzc05hbWUgPSAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpOworCQkJCQkJZm9yICggdmFyIGMgPSAwLCBjbCA9IGNsYXNzTmFtZXMubGVuZ3RoOyBjIDwgY2w7IGMrKyApIHsKKwkJCQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiICIgKyBjbGFzc05hbWVzW2NdICsgIiAiLCAiICIpOworCQkJCQkJfQorCQkJCQkJZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggY2xhc3NOYW1lICk7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVsZW0uY2xhc3NOYW1lID0gIiI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CisJCXZhciB0eXBlID0gdHlwZW9mIHZhbHVlLAorCQkJaXNCb29sID0gdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiI7CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCXZhciBzZWxmID0galF1ZXJ5KHRoaXMpOworCQkJCXNlbGYudG9nZ2xlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgc2VsZi5hdHRyKCJjbGFzcyIpLCBzdGF0ZVZhbCksIHN0YXRlVmFsICk7CisJCQl9KTsKKwkJfQorCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICkgeworCQkJCS8vIHRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCisJCQkJdmFyIGNsYXNzTmFtZSwKKwkJCQkJaSA9IDAsCisJCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKSwKKwkJCQkJc3RhdGUgPSBzdGF0ZVZhbCwKKwkJCQkJY2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCByc3BhY2VzICk7CisKKwkJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CisJCQkJCS8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBlcmF0ZWQgbGlzdAorCQkJCQlzdGF0ZSA9IGlzQm9vbCA/IHN0YXRlIDogIXNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApOworCQkJCQlzZWxmWyBzdGF0ZSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiIF0oIGNsYXNzTmFtZSApOworCQkJCX0KKworCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgeworCQkJCWlmICggdGhpcy5jbGFzc05hbWUgKSB7CisJCQkJCS8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKKwkJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKKwkJCQl9CisKKwkJCQkvLyB0b2dnbGUgd2hvbGUgY2xhc3NOYW1lCisJCQkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIjsKKwkJCX0KKwkJfSk7CisJfSwKKworCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIjsKKwkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQlpZiAoICgiICIgKyB0aGlzW2ldLmNsYXNzTmFtZSArICIgIikucmVwbGFjZShyY2xhc3MsICIgIikuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMSApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CisJCQl2YXIgZWxlbSA9IHRoaXNbMF07CisKKwkJCWlmICggZWxlbSApIHsKKwkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgIm9wdGlvbiIgKSApIHsKKwkJCQkJLy8gYXR0cmlidXRlcy52YWx1ZSBpcyB1bmRlZmluZWQgaW4gQmxhY2tiZXJyeSA0LjcgYnV0CisJCQkJCS8vIHVzZXMgLnZhbHVlLiBTZWUgIzY5MzIKKwkJCQkJdmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTsKKwkJCQkJcmV0dXJuICF2YWwgfHwgdmFsLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7CisJCQkJfQorCisJCQkJLy8gV2UgbmVlZCB0byBoYW5kbGUgc2VsZWN0IGJveGVzIHNwZWNpYWwKKwkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKKwkJCQkJdmFyIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAorCQkJCQkJdmFsdWVzID0gW10sCisJCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAorCQkJCQkJb25lID0gZWxlbS50eXBlID09PSAic2VsZWN0LW9uZSI7CisKKwkJCQkJLy8gTm90aGluZyB3YXMgc2VsZWN0ZWQKKwkJCQkJaWYgKCBpbmRleCA8IDAgKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKKwkJCQkJZm9yICggdmFyIGkgPSBvbmUgPyBpbmRleCA6IDAsIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKysgKSB7CisJCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCisJCQkJCQkvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwCisJCQkJCQlpZiAoIG9wdGlvbi5zZWxlY3RlZCAmJiAoalF1ZXJ5LnN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PT0gbnVsbCkgJiYgCisJCQkJCQkJCSghb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwgIWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsICJvcHRncm91cCIgKSkgKSB7CisKKwkJCQkJCQkvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uCisJCQkJCQkJdmFsdWUgPSBqUXVlcnkob3B0aW9uKS52YWwoKTsKKworCQkJCQkJCS8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCisJCQkJCQkJaWYgKCBvbmUgKSB7CisJCQkJCQkJCXJldHVybiB2YWx1ZTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQorCQkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcmV0dXJuIHZhbHVlczsKKwkJCQl9CisKKwkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaW4gV2Via2l0ICIiIGlzIHJldHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBhIHZhbHVlIGlzbid0IHNwZWNpZmllZAorCQkJCWlmICggcnJhZGlvY2hlY2sudGVzdCggZWxlbS50eXBlICkgJiYgIWpRdWVyeS5zdXBwb3J0LmNoZWNrT24gKSB7CisJCQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgidmFsdWUiKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOworCQkJCX0KKwkJCQkKKworCQkJCS8vIEV2ZXJ5dGhpbmcgZWxzZSwgd2UganVzdCBncmFiIHRoZSB2YWx1ZQorCQkJCXJldHVybiAoZWxlbS52YWx1ZSB8fCAiIikucmVwbGFjZShycmV0dXJuLCAiIik7CisKKwkJCX0KKworCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJCXZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIHZhbCA9IHZhbHVlOworCisJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAoIGlzRnVuY3Rpb24gKSB7CisJCQkJdmFsID0gdmFsdWUuY2FsbCh0aGlzLCBpLCBzZWxmLnZhbCgpKTsKKwkJCX0KKworCQkJLy8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgIiI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmcKKwkJCWlmICggdmFsID09IG51bGwgKSB7CisJCQkJdmFsID0gIiI7CisJCQl9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSAibnVtYmVyIiApIHsKKwkJCQl2YWwgKz0gIiI7CisJCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSh2YWwpICkgeworCQkJCXZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAodmFsdWUpIHsKKwkJCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiI7CisJCQkJfSk7CisJCQl9CisKKwkJCWlmICggalF1ZXJ5LmlzQXJyYXkodmFsKSAmJiBycmFkaW9jaGVjay50ZXN0KCB0aGlzLnR5cGUgKSApIHsKKwkJCQl0aGlzLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggc2VsZi52YWwoKSwgdmFsICkgPj0gMDsKKworCQkJfSBlbHNlIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAic2VsZWN0IiApICkgeworCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbCk7CisKKwkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpIHsKKwkJCQkJdGhpcy5zZWxlY3RlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkodGhpcykudmFsKCksIHZhbHVlcyApID49IDA7CisJCQkJfSk7CisKKwkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkgeworCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy52YWx1ZSA9IHZhbDsKKwkJCX0KKwkJfSk7CisJfQorfSk7CisKK2pRdWVyeS5leHRlbmQoeworCWF0dHJGbjogeworCQl2YWw6IHRydWUsCisJCWNzczogdHJ1ZSwKKwkJaHRtbDogdHJ1ZSwKKwkJdGV4dDogdHJ1ZSwKKwkJZGF0YTogdHJ1ZSwKKwkJd2lkdGg6IHRydWUsCisJCWhlaWdodDogdHJ1ZSwKKwkJb2Zmc2V0OiB0cnVlCisJfSwKKwkJCisJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkgeworCQkvLyBkb24ndCBzZXQgYXR0cmlidXRlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisJCWlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgeworCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJCWlmICggcGFzcyAmJiBuYW1lIGluIGpRdWVyeS5hdHRyRm4gKSB7CisJCQlyZXR1cm4galF1ZXJ5KGVsZW0pW25hbWVdKHZhbHVlKTsKKwkJfQorCisJCXZhciBub3R4bWwgPSBlbGVtLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSwKKwkJCS8vIFdoZXRoZXIgd2UgYXJlIHNldHRpbmcgKG9yIGdldHRpbmcpCisJCQlzZXQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkOworCisJCS8vIFRyeSB0byBub3JtYWxpemUvZml4IHRoZSBuYW1lCisJCW5hbWUgPSBub3R4bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0gfHwgbmFtZTsKKworCQkvLyBUaGVzZSBhdHRyaWJ1dGVzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKKwkJdmFyIHNwZWNpYWwgPSByc3BlY2lhbHVybC50ZXN0KCBuYW1lICk7CisKKwkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGFuIG9wdGlvbgorCQkvLyBBY2Nlc3NpbmcgdGhlIHBhcmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXQKKwkJaWYgKCBuYW1lID09PSAic2VsZWN0ZWQiICYmICFqUXVlcnkuc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKKwkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCQlpZiAoIHBhcmVudCApIHsKKwkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKKworCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGl0IGFsc28gd29ya3Mgd2l0aCBvcHRncm91cHMsIHNlZSAjNTcwMQorCQkJCWlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7CisJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gSWYgYXBwbGljYWJsZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKKwkJLy8gJ2luJyBjaGVja3MgZmFpbCBpbiBCbGFja2JlcnJ5IDQuNyAjNjkzMQorCQlpZiAoIChuYW1lIGluIGVsZW0gfHwgZWxlbVsgbmFtZSBdICE9PSB1bmRlZmluZWQpICYmIG5vdHhtbCAmJiAhc3BlY2lhbCApIHsKKwkJCWlmICggc2V0ICkgeworCQkJCS8vIFdlIGNhbid0IGFsbG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJRSkKKwkJCQlpZiAoIG5hbWUgPT09ICJ0eXBlIiAmJiBydHlwZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5wYXJlbnROb2RlICkgeworCQkJCQlqUXVlcnkuZXJyb3IoICJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiICk7CisJCQkJfQorCisJCQkJaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHsKKwkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKwkJCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CisJCQkJfQorCQkJfQorCisJCQkvLyBicm93c2VycyBpbmRleCBlbGVtZW50cyBieSBpZC9uYW1lIG9uIGZvcm1zLCBnaXZlIHByaW9yaXR5IHRvIGF0dHJpYnV0ZXMuCisJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImZvcm0iICkgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICkgeworCQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKS5ub2RlVmFsdWU7CisJCQl9CisKKwkJCS8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKKwkJCS8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCisJCQlpZiAoIG5hbWUgPT09ICJ0YWJJbmRleCIgKSB7CisJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoICJ0YWJJbmRleCIgKTsKKworCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkID8KKwkJCQkJYXR0cmlidXRlTm9kZS52YWx1ZSA6CisJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0uaHJlZiA/CisJCQkJCQkwIDoKKwkJCQkJCXVuZGVmaW5lZDsKKwkJCX0KKworCQkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKKwkJfQorCisJCWlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICYmIG5vdHhtbCAmJiBuYW1lID09PSAic3R5bGUiICkgeworCQkJaWYgKCBzZXQgKSB7CisJCQkJZWxlbS5zdHlsZS5jc3NUZXh0ID0gIiIgKyB2YWx1ZTsKKwkJCX0KKworCQkJcmV0dXJuIGVsZW0uc3R5bGUuY3NzVGV4dDsKKwkJfQorCisJCWlmICggc2V0ICkgeworCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCisJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgIiIgKyB2YWx1ZSApOworCQl9CisKKwkJLy8gRW5zdXJlIHRoYXQgbWlzc2luZyBhdHRyaWJ1dGVzIHJldHVybiB1bmRlZmluZWQKKwkJLy8gQmxhY2tiZXJyeSA0LjcgcmV0dXJucyAiIiBmcm9tIGdldEF0dHJpYnV0ZSAjNjkzOAorCQlpZiAoICFlbGVtLmF0dHJpYnV0ZXNbIG5hbWUgXSAmJiAoZWxlbS5oYXNBdHRyaWJ1dGUgJiYgIWVsZW0uaGFzQXR0cmlidXRlKCBuYW1lICkpICkgeworCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJCXZhciBhdHRyID0gIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICYmIG5vdHhtbCAmJiBzcGVjaWFsID8KKwkJCQkvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQorCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCAyICkgOgorCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CisKKwkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKKwkJcmV0dXJuIGF0dHIgPT09IG51bGwgPyB1bmRlZmluZWQgOiBhdHRyOworCX0KK30pOworCisKKworCit2YXIgcm5hbWVzcGFjZXMgPSAvXC4oLiopJC8sCisJcmZvcm1FbGVtcyA9IC9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSwKKwlycGVyaW9kID0gL1wuL2csCisJcnNwYWNlID0gLyAvZywKKwlyZXNjYXBlID0gL1teXHdccy58YF0vZywKKwlmY2xlYW51cCA9IGZ1bmN0aW9uKCBubSApIHsKKwkJcmV0dXJuIG5tLnJlcGxhY2UocmVzY2FwZSwgIlxcJCYiKTsKKwl9LAorCWZvY3VzQ291bnRzID0geyBmb2N1c2luOiAwLCBmb2N1c291dDogMCB9OworCisvKgorICogQSBudW1iZXIgb2YgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciBtYW5hZ2luZyBldmVudHMuCisgKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWdpbmF0ZWQgZnJvbQorICogRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5LgorICovCitqUXVlcnkuZXZlbnQgPSB7CisKKwkvLyBCaW5kIGFuIGV2ZW50IHRvIGFuIGVsZW1lbnQKKwkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKKwlhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSApIHsKKwkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBGb3Igd2hhdGV2ZXIgcmVhc29uLCBJRSBoYXMgdHJvdWJsZSBwYXNzaW5nIHRoZSB3aW5kb3cgb2JqZWN0CisJCS8vIGFyb3VuZCwgY2F1c2luZyBpdCB0byBiZSBjbG9uZWQgaW4gdGhlIHByb2Nlc3MKKwkJaWYgKCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSAmJiAoIGVsZW0gIT09IHdpbmRvdyAmJiAhZWxlbS5mcmFtZUVsZW1lbnQgKSApIHsKKwkJCWVsZW0gPSB3aW5kb3c7CisJCX0KKworCQlpZiAoIGhhbmRsZXIgPT09IGZhbHNlICkgeworCQkJaGFuZGxlciA9IHJldHVybkZhbHNlOworCQl9IGVsc2UgaWYgKCAhaGFuZGxlciApIHsKKwkJCS8vIEZpeGVzIGJ1ZyAjNzIyOS4gRml4IHJlY29tbWVuZGVkIGJ5IGpkYWx0b24KKwkJICByZXR1cm47CisJCX0KKworCQl2YXIgaGFuZGxlT2JqSW4sIGhhbmRsZU9iajsKKworCQlpZiAoIGhhbmRsZXIuaGFuZGxlciApIHsKKwkJCWhhbmRsZU9iakluID0gaGFuZGxlcjsKKwkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOworCQl9CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAorCQlpZiAoICFoYW5kbGVyLmd1aWQgKSB7CisJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOworCQl9CisKKwkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZQorCQl2YXIgZWxlbURhdGEgPSBqUXVlcnkuZGF0YSggZWxlbSApOworCisJCS8vIElmIG5vIGVsZW1EYXRhIGlzIGZvdW5kIHRoZW4gd2UgbXVzdCBiZSB0cnlpbmcgdG8gYmluZCB0byBvbmUgb2YgdGhlCisJCS8vIGJhbm5lZCBub0RhdGEgZWxlbWVudHMKKwkJaWYgKCAhZWxlbURhdGEgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBVc2UgYSBrZXkgbGVzcyBsaWtlbHkgdG8gcmVzdWx0IGluIGNvbGxpc2lvbnMgZm9yIHBsYWluIEpTIG9iamVjdHMuCisJCS8vIEZpeGVzIGJ1ZyAjNzE1MC4KKwkJdmFyIGV2ZW50S2V5ID0gZWxlbS5ub2RlVHlwZSA/ICJldmVudHMiIDogIl9fZXZlbnRzX18iLAorCQkJZXZlbnRzID0gZWxlbURhdGFbIGV2ZW50S2V5IF0sCisJCQlldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZTsKKwkJCQorCQlpZiAoIHR5cGVvZiBldmVudHMgPT09ICJmdW5jdGlvbiIgKSB7CisJCQkvLyBPbiBwbGFpbiBvYmplY3RzIGV2ZW50cyBpcyBhIGZuIHRoYXQgaG9sZHMgdGhlIHRoZSBkYXRhCisJCQkvLyB3aGljaCBwcmV2ZW50cyB0aGlzIGRhdGEgZnJvbSBiZWluZyBKU09OIHNlcmlhbGl6ZWQKKwkJCS8vIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGNhbGxlZCwgaXQganVzdCBjb250YWlucyB0aGUgZGF0YQorCQkJZXZlbnRIYW5kbGUgPSBldmVudHMuaGFuZGxlOworCQkJZXZlbnRzID0gZXZlbnRzLmV2ZW50czsKKworCQl9IGVsc2UgaWYgKCAhZXZlbnRzICkgeworCQkJaWYgKCAhZWxlbS5ub2RlVHlwZSApIHsKKwkJCQkvLyBPbiBwbGFpbiBvYmplY3RzLCBjcmVhdGUgYSBmbiB0aGF0IGFjdHMgYXMgdGhlIGhvbGRlcgorCQkJCS8vIG9mIHRoZSB2YWx1ZXMgdG8gYXZvaWQgSlNPTiBzZXJpYWxpemF0aW9uIG9mIGV2ZW50IGRhdGEKKwkJCQllbGVtRGF0YVsgZXZlbnRLZXkgXSA9IGVsZW1EYXRhID0gZnVuY3Rpb24oKXt9OworCQkJfQorCisJCQllbGVtRGF0YS5ldmVudHMgPSBldmVudHMgPSB7fTsKKwkJfQorCisJCWlmICggIWV2ZW50SGFuZGxlICkgeworCQkJZWxlbURhdGEuaGFuZGxlID0gZXZlbnRIYW5kbGUgPSBmdW5jdGlvbigpIHsKKwkJCQkvLyBIYW5kbGUgdGhlIHNlY29uZCBldmVudCBvZiBhIHRyaWdnZXIgYW5kIHdoZW4KKwkJCQkvLyBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAorCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiAhalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA/CisJCQkJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIGV2ZW50SGFuZGxlLmVsZW0sIGFyZ3VtZW50cyApIDoKKwkJCQkJdW5kZWZpbmVkOworCQkJfTsKKwkJfQorCisJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgorCQkvLyBUaGlzIGlzIHRvIHByZXZlbnQgYSBtZW1vcnkgbGVhayB3aXRoIG5vbi1uYXRpdmUgZXZlbnRzIGluIElFLgorCQlldmVudEhhbmRsZS5lbGVtID0gZWxlbTsKKworCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCisJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKKwkJdHlwZXMgPSB0eXBlcy5zcGxpdCgiICIpOworCisJCXZhciB0eXBlLCBpID0gMCwgbmFtZXNwYWNlczsKKworCQl3aGlsZSAoICh0eXBlID0gdHlwZXNbIGkrKyBdKSApIHsKKwkJCWhhbmRsZU9iaiA9IGhhbmRsZU9iakluID8KKwkJCQlqUXVlcnkuZXh0ZW5kKHt9LCBoYW5kbGVPYmpJbikgOgorCQkJCXsgaGFuZGxlcjogaGFuZGxlciwgZGF0YTogZGF0YSB9OworCisJCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCisJCQlpZiAoIHR5cGUuaW5kZXhPZigiLiIpID4gLTEgKSB7CisJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKKwkJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLnNsaWNlKDApLnNvcnQoKS5qb2luKCIuIik7CisKKwkJCX0gZWxzZSB7CisJCQkJbmFtZXNwYWNlcyA9IFtdOworCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPSAiIjsKKwkJCX0KKworCQkJaGFuZGxlT2JqLnR5cGUgPSB0eXBlOworCQkJaWYgKCAhaGFuZGxlT2JqLmd1aWQgKSB7CisJCQkJaGFuZGxlT2JqLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CisJCQl9CisKKwkJCS8vIEdldCB0aGUgY3VycmVudCBsaXN0IG9mIGZ1bmN0aW9ucyBib3VuZCB0byB0aGlzIGV2ZW50CisJCQl2YXIgaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSwKKwkJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworCQkJLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZQorCQkJaWYgKCAhaGFuZGxlcnMgKSB7CisJCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdOworCisJCQkJLy8gQ2hlY2sgZm9yIGEgc3BlY2lhbCBldmVudCBoYW5kbGVyCisJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAorCQkJCS8vIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKKwkJCQlpZiAoICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CisJCQkJCS8vIEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50CisJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgeworCQkJCQkJZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSwgZmFsc2UgKTsKKworCQkJCQl9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2ZW50ICkgeworCQkJCQkJZWxlbS5hdHRhY2hFdmVudCggIm9uIiArIHR5cGUsIGV2ZW50SGFuZGxlICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmICggc3BlY2lhbC5hZGQgKSB7IAorCQkJCXNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOyAKKworCQkJCWlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7CisJCQkJCWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CisJCQkJfQorCQkJfQorCisJCQkvLyBBZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0CisJCQloYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTsKKworCQkJLy8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBiZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJpZ2dlcmluZworCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKKwkJfQorCisJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorCQllbGVtID0gbnVsbDsKKwl9LAorCisJZ2xvYmFsOiB7fSwKKworCS8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudAorCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBwb3MgKSB7CisJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCBoYW5kbGVyID09PSBmYWxzZSApIHsKKwkJCWhhbmRsZXIgPSByZXR1cm5GYWxzZTsKKwkJfQorCisJCXZhciByZXQsIHR5cGUsIGZuLCBqLCBpID0gMCwgYWxsLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2UsIHNwZWNpYWwsIGV2ZW50VHlwZSwgaGFuZGxlT2JqLCBvcmlnVHlwZSwKKwkJCWV2ZW50S2V5ID0gZWxlbS5ub2RlVHlwZSA/ICJldmVudHMiIDogIl9fZXZlbnRzX18iLAorCQkJZWxlbURhdGEgPSBqUXVlcnkuZGF0YSggZWxlbSApLAorCQkJZXZlbnRzID0gZWxlbURhdGEgJiYgZWxlbURhdGFbIGV2ZW50S2V5IF07CisKKwkJaWYgKCAhZWxlbURhdGEgfHwgIWV2ZW50cyApIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKCB0eXBlb2YgZXZlbnRzID09PSAiZnVuY3Rpb24iICkgeworCQkJZWxlbURhdGEgPSBldmVudHM7CisJCQlldmVudHMgPSBldmVudHMuZXZlbnRzOworCQl9CisKKwkJLy8gdHlwZXMgaXMgYWN0dWFsbHkgYW4gZXZlbnQgb2JqZWN0IGhlcmUKKwkJaWYgKCB0eXBlcyAmJiB0eXBlcy50eXBlICkgeworCQkJaGFuZGxlciA9IHR5cGVzLmhhbmRsZXI7CisJCQl0eXBlcyA9IHR5cGVzLnR5cGU7CisJCX0KKworCQkvLyBVbmJpbmQgYWxsIGV2ZW50cyBmb3IgdGhlIGVsZW1lbnQKKwkJaWYgKCAhdHlwZXMgfHwgdHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT09ICIuIiApIHsKKwkJCXR5cGVzID0gdHlwZXMgfHwgIiI7CisKKwkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgeworCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlcyApOworCQkJfQorCisJCQlyZXR1cm47CisJCX0KKworCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCisJCS8vIGpRdWVyeSguLi4pLnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOworCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CisKKwkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CisJCQlvcmlnVHlwZSA9IHR5cGU7CisJCQloYW5kbGVPYmogPSBudWxsOworCQkJYWxsID0gdHlwZS5pbmRleE9mKCIuIikgPCAwOworCQkJbmFtZXNwYWNlcyA9IFtdOworCisJCQlpZiAoICFhbGwgKSB7CisJCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycworCQkJCW5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CisJCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKworCQkJCW5hbWVzcGFjZSA9IG5ldyBSZWdFeHAoIihefFxcLikiICsgCisJCQkJCWpRdWVyeS5tYXAoIG5hbWVzcGFjZXMuc2xpY2UoMCkuc29ydCgpLCBmY2xlYW51cCApLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CisJCQl9CisKKwkJCWV2ZW50VHlwZSA9IGV2ZW50c1sgdHlwZSBdOworCisJCQlpZiAoICFldmVudFR5cGUgKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICggIWhhbmRsZXIgKSB7CisJCQkJZm9yICggaiA9IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7CisJCQkJCWhhbmRsZU9iaiA9IGV2ZW50VHlwZVsgaiBdOworCisJCQkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CisJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCBvcmlnVHlwZSwgaGFuZGxlT2JqLmhhbmRsZXIsIGogKTsKKwkJCQkJCWV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApOworCQkJCQl9CisJCQkJfQorCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OworCisJCQlmb3IgKCBqID0gcG9zIHx8IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7CisJCQkJaGFuZGxlT2JqID0gZXZlbnRUeXBlWyBqIF07CisKKwkJCQlpZiAoIGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSB7CisJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2ZW4gaGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUKKwkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKKwkJCQkJCWlmICggcG9zID09IG51bGwgKSB7CisJCQkJCQkJZXZlbnRUeXBlLnNwbGljZSggai0tLCAxICk7CisJCQkJCQl9CisKKwkJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CisJCQkJCQkJc3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoIHBvcyAhPSBudWxsICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIHJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgbm8gbW9yZSBoYW5kbGVycyBleGlzdAorCQkJaWYgKCBldmVudFR5cGUubGVuZ3RoID09PSAwIHx8IHBvcyAhPSBudWxsICYmIGV2ZW50VHlwZS5sZW5ndGggPT09IDEgKSB7CisJCQkJaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMgKSA9PT0gZmFsc2UgKSB7CisJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7CisJCQkJfQorCisJCQkJcmV0ID0gbnVsbDsKKwkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CisJCQl9CisJCX0KKworCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAorCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsKKwkJCXZhciBoYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGU7CisJCQlpZiAoIGhhbmRsZSApIHsKKwkJCQloYW5kbGUuZWxlbSA9IG51bGw7CisJCQl9CisKKwkJCWRlbGV0ZSBlbGVtRGF0YS5ldmVudHM7CisJCQlkZWxldGUgZWxlbURhdGEuaGFuZGxlOworCisJCQlpZiAoIHR5cGVvZiBlbGVtRGF0YSA9PT0gImZ1bmN0aW9uIiApIHsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgZXZlbnRLZXkgKTsKKworCQkJfSBlbHNlIGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGVsZW1EYXRhICkgKSB7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0gKTsKKwkJCX0KKwkJfQorCX0sCisKKwkvLyBidWJibGluZyBpcyBpbnRlcm5hbAorCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSAvKiwgYnViYmxpbmcgKi8gKSB7CisJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCisJCXZhciB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudCwKKwkJCWJ1YmJsaW5nID0gYXJndW1lbnRzWzNdOworCisJCWlmICggIWJ1YmJsaW5nICkgeworCQkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KKwkJCQkvLyBqUXVlcnkuRXZlbnQgb2JqZWN0CisJCQkJZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gPyBldmVudCA6CisJCQkJLy8gT2JqZWN0IGxpdGVyYWwKKwkJCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuRXZlbnQodHlwZSksIGV2ZW50ICkgOgorCQkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0cmluZykKKwkJCQlqUXVlcnkuRXZlbnQodHlwZSk7CisKKwkJCWlmICggdHlwZS5pbmRleE9mKCIhIikgPj0gMCApIHsKKwkJCQlldmVudC50eXBlID0gdHlwZSA9IHR5cGUuc2xpY2UoMCwgLTEpOworCQkJCWV2ZW50LmV4Y2x1c2l2ZSA9IHRydWU7CisJCQl9CisKKwkJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCisJCQlpZiAoICFlbGVtICkgeworCQkJCS8vIERvbid0IGJ1YmJsZSBjdXN0b20gZXZlbnRzIHdoZW4gZ2xvYmFsICh0byBhdm9pZCB0b28gbXVjaCBvdmVyaGVhZCkKKwkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKworCQkJCS8vIE9ubHkgdHJpZ2dlciBpZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZvciBpdAorCQkJCWlmICggalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkgeworCQkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LmNhY2hlLCBmdW5jdGlvbigpIHsKKwkJCQkJCWlmICggdGhpcy5ldmVudHMgJiYgdGhpcy5ldmVudHNbdHlwZV0gKSB7CisJCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzLmhhbmRsZS5lbGVtICk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCX0KKworCQkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgYSBzaW5nbGUgZWxlbWVudAorCisJCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CisJCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJCX0KKworCQkJLy8gQ2xlYW4gdXAgaW4gY2FzZSBpdCBpcyByZXVzZWQKKwkJCWV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKKwkJCWV2ZW50LnRhcmdldCA9IGVsZW07CisKKwkJCS8vIENsb25lIHRoZSBpbmNvbWluZyBkYXRhLCBpZiBhbnkKKwkJCWRhdGEgPSBqUXVlcnkubWFrZUFycmF5KCBkYXRhICk7CisJCQlkYXRhLnVuc2hpZnQoIGV2ZW50ICk7CisJCX0KKworCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gZWxlbTsKKworCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KKwkJdmFyIGhhbmRsZSA9IGVsZW0ubm9kZVR5cGUgPworCQkJalF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICkgOgorCQkJKGpRdWVyeS5kYXRhKCBlbGVtLCAiX19ldmVudHNfXyIgKSB8fCB7fSkuaGFuZGxlOworCisJCWlmICggaGFuZGxlICkgeworCQkJaGFuZGxlLmFwcGx5KCBlbGVtLCBkYXRhICk7CisJCX0KKworCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlIHx8IGVsZW0ub3duZXJEb2N1bWVudDsKKworCQkvLyBUcmlnZ2VyIGFuIGlubGluZSBib3VuZCBzY3JpcHQKKwkJdHJ5IHsKKwkJCWlmICggIShlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgalF1ZXJ5Lm5vRGF0YVtlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSApIHsKKwkJCQlpZiAoIGVsZW1bICJvbiIgKyB0eXBlIF0gJiYgZWxlbVsgIm9uIiArIHR5cGUgXS5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKKwkJCQkJZXZlbnQucmVzdWx0ID0gZmFsc2U7CisJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJfQorCQkJfQorCisJCS8vIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJvciBmb3Igc29tZSBlbGVtZW50cyB3aXRoIHNvbWUgZXZlbnQgdHlwZXMsIHNlZSAjMzUzMworCQl9IGNhdGNoIChpbmxpbmVFcnJvcikge30KKworCQlpZiAoICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICYmIHBhcmVudCApIHsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgcGFyZW50LCB0cnVlICk7CisKKwkJfSBlbHNlIGlmICggIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkgeworCQkJdmFyIG9sZCwKKwkJCQl0YXJnZXQgPSBldmVudC50YXJnZXQsCisJCQkJdGFyZ2V0VHlwZSA9IHR5cGUucmVwbGFjZSggcm5hbWVzcGFjZXMsICIiICksCisJCQkJaXNDbGljayA9IGpRdWVyeS5ub2RlTmFtZSggdGFyZ2V0LCAiYSIgKSAmJiB0YXJnZXRUeXBlID09PSAiY2xpY2siLAorCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdGFyZ2V0VHlwZSBdIHx8IHt9OworCisJCQlpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmNhbGwoIGVsZW0sIGV2ZW50ICkgPT09IGZhbHNlKSAmJiAKKwkJCQkhaXNDbGljayAmJiAhKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUgJiYgalF1ZXJ5Lm5vRGF0YVt0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pICkgeworCisJCQkJdHJ5IHsKKwkJCQkJaWYgKCB0YXJnZXRbIHRhcmdldFR5cGUgXSApIHsKKwkJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGFjY2lkZW50YWxseSByZS10cmlnZ2VyIHRoZSBvbkZPTyBldmVudHMKKwkJCQkJCW9sZCA9IHRhcmdldFsgIm9uIiArIHRhcmdldFR5cGUgXTsKKworCQkJCQkJaWYgKCBvbGQgKSB7CisJCQkJCQkJdGFyZ2V0WyAib24iICsgdGFyZ2V0VHlwZSBdID0gbnVsbDsKKwkJCQkJCX0KKworCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHRydWU7CisJCQkJCQl0YXJnZXRbIHRhcmdldFR5cGUgXSgpOworCQkJCQl9CisKKwkJCQkvLyBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgYW4gZXJyb3IgZm9yIHNvbWUgZWxlbWVudHMgd2l0aCBzb21lIGV2ZW50IHR5cGVzLCBzZWUgIzM1MzMKKwkJCQl9IGNhdGNoICh0cmlnZ2VyRXJyb3IpIHt9CisKKwkJCQlpZiAoIG9sZCApIHsKKwkJCQkJdGFyZ2V0WyAib24iICsgdGFyZ2V0VHlwZSBdID0gb2xkOworCQkJCX0KKworCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSBmYWxzZTsKKwkJCX0KKwkJfQorCX0sCisKKwloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJdmFyIGFsbCwgaGFuZGxlcnMsIG5hbWVzcGFjZXMsIG5hbWVzcGFjZV9yZSwgZXZlbnRzLAorCQkJbmFtZXNwYWNlX3NvcnQgPSBbXSwKKwkJCWFyZ3MgPSBqUXVlcnkubWFrZUFycmF5KCBhcmd1bWVudHMgKTsKKworCQlldmVudCA9IGFyZ3NbMF0gPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCB8fCB3aW5kb3cuZXZlbnQgKTsKKwkJZXZlbnQuY3VycmVudFRhcmdldCA9IHRoaXM7CisKKwkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycworCQlhbGwgPSBldmVudC50eXBlLmluZGV4T2YoIi4iKSA8IDAgJiYgIWV2ZW50LmV4Y2x1c2l2ZTsKKworCQlpZiAoICFhbGwgKSB7CisJCQluYW1lc3BhY2VzID0gZXZlbnQudHlwZS5zcGxpdCgiLiIpOworCQkJZXZlbnQudHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKwkJCW5hbWVzcGFjZV9zb3J0ID0gbmFtZXNwYWNlcy5zbGljZSgwKS5zb3J0KCk7CisJCQluYW1lc3BhY2VfcmUgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZV9zb3J0LmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CisJCX0KKworCQlldmVudC5uYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgfHwgbmFtZXNwYWNlX3NvcnQuam9pbigiLiIpOworCisJCWV2ZW50cyA9IGpRdWVyeS5kYXRhKHRoaXMsIHRoaXMubm9kZVR5cGUgPyAiZXZlbnRzIiA6ICJfX2V2ZW50c19fIik7CisKKwkJaWYgKCB0eXBlb2YgZXZlbnRzID09PSAiZnVuY3Rpb24iICkgeworCQkJZXZlbnRzID0gZXZlbnRzLmV2ZW50czsKKwkJfQorCisJCWhhbmRsZXJzID0gKGV2ZW50cyB8fCB7fSlbIGV2ZW50LnR5cGUgXTsKKworCQlpZiAoIGV2ZW50cyAmJiBoYW5kbGVycyApIHsKKwkJCS8vIENsb25lIHRoZSBoYW5kbGVycyB0byBwcmV2ZW50IG1hbmlwdWxhdGlvbgorCQkJaGFuZGxlcnMgPSBoYW5kbGVycy5zbGljZSgwKTsKKworCQkJZm9yICggdmFyIGogPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBqIDwgbDsgaisrICkgeworCQkJCXZhciBoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBdOworCisJCQkJLy8gRmlsdGVyIHRoZSBmdW5jdGlvbnMgYnkgY2xhc3MKKwkJCQlpZiAoIGFsbCB8fCBuYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgeworCQkJCQkvLyBQYXNzIGluIGEgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGl0c2VsZgorCQkJCQkvLyBTbyB0aGF0IHdlIGNhbiBsYXRlciByZW1vdmUgaXQKKwkJCQkJZXZlbnQuaGFuZGxlciA9IGhhbmRsZU9iai5oYW5kbGVyOworCQkJCQlldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7CisJCQkJCWV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajsKKwkKKwkJCQkJdmFyIHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmdzICk7CisKKwkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJCWV2ZW50LnJlc3VsdCA9IHJldDsKKwkJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKKwkJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gZXZlbnQucmVzdWx0OworCX0sCisKKwlwcm9wczogImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLAorCisJZml4OiBmdW5jdGlvbiggZXZlbnQgKSB7CisJCWlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CisJCQlyZXR1cm4gZXZlbnQ7CisJCX0KKworCQkvLyBzdG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdAorCQkvLyBhbmQgImNsb25lIiB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMKKwkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKKwkJZXZlbnQgPSBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKKworCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApIHsKKwkJCXByb3AgPSB0aGlzLnByb3BzWyAtLWkgXTsKKwkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07CisJCX0KKworCQkvLyBGaXggdGFyZ2V0IHByb3BlcnR5LCBpZiBuZWNlc3NhcnkKKwkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgeworCQkJLy8gRml4ZXMgIzE5MjUgd2hlcmUgc3JjRWxlbWVudCBtaWdodCBub3QgYmUgZGVmaW5lZCBlaXRoZXIKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7CisJCX0KKworCQkvLyBjaGVjayBpZiB0YXJnZXQgaXMgYSB0ZXh0bm9kZSAoc2FmYXJpKQorCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOworCQl9CisKKwkJLy8gQWRkIHJlbGF0ZWRUYXJnZXQsIGlmIG5lY2Vzc2FyeQorCQlpZiAoICFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGV2ZW50LmZyb21FbGVtZW50ICkgeworCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKKwkJfQorCisJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKKwkJaWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIGV2ZW50LmNsaWVudFggIT0gbnVsbCApIHsKKwkJCXZhciBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisJCQkJYm9keSA9IGRvY3VtZW50LmJvZHk7CisKKwkJCWV2ZW50LnBhZ2VYID0gZXZlbnQuY2xpZW50WCArIChkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRMZWZ0IHx8IGJvZHkgJiYgYm9keS5jbGllbnRMZWZ0IHx8IDApOworCQkJZXZlbnQucGFnZVkgPSBldmVudC5jbGllbnRZICsgKGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCk7CisJCX0KKworCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKKwkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICYmIChldmVudC5jaGFyQ29kZSAhPSBudWxsIHx8IGV2ZW50LmtleUNvZGUgIT0gbnVsbCkgKSB7CisJCQlldmVudC53aGljaCA9IGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CisJCX0KKworCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKKwkJaWYgKCAhZXZlbnQubWV0YUtleSAmJiBldmVudC5jdHJsS2V5ICkgeworCQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CisJCX0KKworCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CisJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CisJCWlmICggIWV2ZW50LndoaWNoICYmIGV2ZW50LmJ1dHRvbiAhPT0gdW5kZWZpbmVkICkgeworCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKKwkJfQorCisJCXJldHVybiBldmVudDsKKwl9LAorCisJLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5ndWlkIGluc3RlYWQKKwlndWlkOiAxRTgsCisKKwkvLyBEZXByZWNhdGVkLCB1c2UgalF1ZXJ5LnByb3h5IGluc3RlYWQKKwlwcm94eTogalF1ZXJ5LnByb3h5LAorCisJc3BlY2lhbDogeworCQlyZWFkeTogeworCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAorCQkJc2V0dXA6IGpRdWVyeS5iaW5kUmVhZHksCisJCQl0ZWFyZG93bjogalF1ZXJ5Lm5vb3AKKwkJfSwKKworCQlsaXZlOiB7CisJCQlhZGQ6IGZ1bmN0aW9uKCBoYW5kbGVPYmogKSB7CisJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywKKwkJCQkJbGl2ZUNvbnZlcnQoIGhhbmRsZU9iai5vcmlnVHlwZSwgaGFuZGxlT2JqLnNlbGVjdG9yICksCisJCQkJCWpRdWVyeS5leHRlbmQoe30sIGhhbmRsZU9iaiwge2hhbmRsZXI6IGxpdmVIYW5kbGVyLCBndWlkOiBoYW5kbGVPYmouaGFuZGxlci5ndWlkfSkgKTsgCisJCQl9LAorCisJCQlyZW1vdmU6IGZ1bmN0aW9uKCBoYW5kbGVPYmogKSB7CisJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgbGl2ZUNvbnZlcnQoIGhhbmRsZU9iai5vcmlnVHlwZSwgaGFuZGxlT2JqLnNlbGVjdG9yICksIGhhbmRsZU9iaiApOworCQkJfQorCQl9LAorCisJCWJlZm9yZXVubG9hZDogeworCQkJc2V0dXA6IGZ1bmN0aW9uKCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKKwkJCQkvLyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBzcGVjaWFsIGNhc2Ugb24gd2luZG93cworCQkJCWlmICggalF1ZXJ5LmlzV2luZG93KCB0aGlzICkgKSB7CisJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBldmVudEhhbmRsZTsKKwkJCQl9CisJCQl9LAorCisJCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgeworCQkJCWlmICggdGhpcy5vbmJlZm9yZXVubG9hZCA9PT0gZXZlbnRIYW5kbGUgKSB7CisJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKK2pRdWVyeS5yZW1vdmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPworCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CisJCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgeworCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7CisJCX0KKwl9IDogCisJZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKKwkJaWYgKCBlbGVtLmRldGFjaEV2ZW50ICkgeworCQkJZWxlbS5kZXRhY2hFdmVudCggIm9uIiArIHR5cGUsIGhhbmRsZSApOworCQl9CisJfTsKKworalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYyApIHsKKwkvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmQKKwlpZiAoICF0aGlzLnByZXZlbnREZWZhdWx0ICkgeworCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjICk7CisJfQorCisJLy8gRXZlbnQgb2JqZWN0CisJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CisJCXRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKwkJdGhpcy50eXBlID0gc3JjLnR5cGU7CisJLy8gRXZlbnQgdHlwZQorCX0gZWxzZSB7CisJCXRoaXMudHlwZSA9IHNyYzsKKwl9CisKKwkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCisJLy8gU28gd2Ugd29uJ3QgcmVseSBvbiB0aGUgbmF0aXZlIHZhbHVlCisJdGhpcy50aW1lU3RhbXAgPSBqUXVlcnkubm93KCk7CisKKwkvLyBNYXJrIGl0IGFzIGZpeGVkCisJdGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7Cit9OworCitmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CitmdW5jdGlvbiByZXR1cm5UcnVlKCkgeworCXJldHVybiB0cnVlOworfQorCisvLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKKy8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbAoralF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHsKKwlwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CisJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKKwkJaWYgKCAhZSApIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJaWYgKCBlLnByZXZlbnREZWZhdWx0ICkgeworCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCisJCS8vIG90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZSAoSUUpCisJCX0gZWxzZSB7CisJCQllLnJldHVyblZhbHVlID0gZmFsc2U7CisJCX0KKwl9LAorCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CisJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCisJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCQlpZiAoICFlICkgeworCQkJcmV0dXJuOworCQl9CisJCS8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAorCQlpZiAoIGUuc3RvcFByb3BhZ2F0aW9uICkgeworCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKKwkJfQorCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIHRydWUgKElFKQorCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7CisJfSwKKwlzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKwkJdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKKwl9LAorCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCisJaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAorCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQorfTsKKworLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGluIGFub3RoZXIgZWxlbWVudAorLy8gVXNlZCBpbiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCit2YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0aW9uKCBldmVudCApIHsKKwkvLyBDaGVjayBpZiBtb3VzZShvdmVyfG91dCkgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgZWxlbWVudAorCXZhciBwYXJlbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0OworCisJLy8gRmlyZWZveCBzb21ldGltZXMgYXNzaWducyByZWxhdGVkVGFyZ2V0IGEgWFVMIGVsZW1lbnQKKwkvLyB3aGljaCB3ZSBjYW5ub3QgYWNjZXNzIHRoZSBwYXJlbnROb2RlIHByb3BlcnR5IG9mCisJdHJ5IHsKKwkJLy8gVHJhdmVyc2UgdXAgdGhlIHRyZWUKKwkJd2hpbGUgKCBwYXJlbnQgJiYgcGFyZW50ICE9PSB0aGlzICkgeworCQkJcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7CisJCX0KKworCQlpZiAoIHBhcmVudCAhPT0gdGhpcyApIHsKKwkJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCisJCQlldmVudC50eXBlID0gZXZlbnQuZGF0YTsKKworCQkJLy8gaGFuZGxlIGV2ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CisJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJfQorCisJLy8gYXNzdW1pbmcgd2UndmUgbGVmdCB0aGUgZWxlbWVudCBzaW5jZSB3ZSBtb3N0IGxpa2VseSBtb3VzZWRvdmVyIGEgeHVsIGVsZW1lbnQKKwl9IGNhdGNoKGUpIHsgfQorfSwKKworLy8gSW4gY2FzZSBvZiBldmVudCBkZWxlZ2F0aW9uLCB3ZSBvbmx5IG5lZWQgdG8gcmVuYW1lIHRoZSBldmVudC50eXBlLAorLy8gbGl2ZUhhbmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QuCitkZWxlZ2F0ZSA9IGZ1bmN0aW9uKCBldmVudCApIHsKKwlldmVudC50eXBlID0gZXZlbnQuZGF0YTsKKwlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKK307CisKKy8vIENyZWF0ZSBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cworalF1ZXJ5LmVhY2goeworCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAorCW1vdXNlbGVhdmU6ICJtb3VzZW91dCIKK30sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CisJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKKwkJc2V0dXA6IGZ1bmN0aW9uKCBkYXRhICkgeworCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgZml4LCBkYXRhICYmIGRhdGEuc2VsZWN0b3IgPyBkZWxlZ2F0ZSA6IHdpdGhpbkVsZW1lbnQsIG9yaWcgKTsKKwkJfSwKKwkJdGVhcmRvd246IGZ1bmN0aW9uKCBkYXRhICkgeworCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgZml4LCBkYXRhICYmIGRhdGEuc2VsZWN0b3IgPyBkZWxlZ2F0ZSA6IHdpdGhpbkVsZW1lbnQgKTsKKwkJfQorCX07Cit9KTsKKworLy8gc3VibWl0IGRlbGVnYXRpb24KK2lmICggIWpRdWVyeS5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMgKSB7CisKKwlqUXVlcnkuZXZlbnQuc3BlY2lhbC5zdWJtaXQgPSB7CisJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcyApIHsKKwkJCWlmICggdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAiZm9ybSIgKSB7CisJCQkJalF1ZXJ5LmV2ZW50LmFkZCh0aGlzLCAiY2xpY2suc3BlY2lhbFN1Ym1pdCIsIGZ1bmN0aW9uKCBlICkgeworCQkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0LAorCQkJCQkJdHlwZSA9IGVsZW0udHlwZTsKKworCQkJCQlpZiAoICh0eXBlID09PSAic3VibWl0IiB8fCB0eXBlID09PSAiaW1hZ2UiKSAmJiBqUXVlcnkoIGVsZW0gKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoICkgeworCQkJCQkJZS5saXZlRmlyZWQgPSB1bmRlZmluZWQ7CisJCQkJCQlyZXR1cm4gdHJpZ2dlciggInN1Ym1pdCIsIHRoaXMsIGFyZ3VtZW50cyApOworCQkJCQl9CisJCQkJfSk7CisJIAorCQkJCWpRdWVyeS5ldmVudC5hZGQodGhpcywgImtleXByZXNzLnNwZWNpYWxTdWJtaXQiLCBmdW5jdGlvbiggZSApIHsKKwkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKKwkJCQkJCXR5cGUgPSBlbGVtLnR5cGU7CisKKwkJCQkJaWYgKCAodHlwZSA9PT0gInRleHQiIHx8IHR5cGUgPT09ICJwYXNzd29yZCIpICYmIGpRdWVyeSggZWxlbSApLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGggJiYgZS5rZXlDb2RlID09PSAxMyApIHsKKwkJCQkJCWUubGl2ZUZpcmVkID0gdW5kZWZpbmVkOworCQkJCQkJcmV0dXJuIHRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJCQkJfQorCQkJCX0pOworCisJCQl9IGVsc2UgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSwKKworCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CisJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCAiLnNwZWNpYWxTdWJtaXQiICk7CisJCX0KKwl9OworCit9CisKKy8vIGNoYW5nZSBkZWxlZ2F0aW9uLCBoYXBwZW5zIGhlcmUgc28gd2UgaGF2ZSBiaW5kLgoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hhbmdlQnViYmxlcyApIHsKKworCXZhciBjaGFuZ2VGaWx0ZXJzLAorCisJZ2V0VmFsID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJCXZhciB0eXBlID0gZWxlbS50eXBlLCB2YWwgPSBlbGVtLnZhbHVlOworCisJCWlmICggdHlwZSA9PT0gInJhZGlvIiB8fCB0eXBlID09PSAiY2hlY2tib3giICkgeworCQkJdmFsID0gZWxlbS5jaGVja2VkOworCisJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJzZWxlY3QtbXVsdGlwbGUiICkgeworCQkJdmFsID0gZWxlbS5zZWxlY3RlZEluZGV4ID4gLTEgPworCQkJCWpRdWVyeS5tYXAoIGVsZW0ub3B0aW9ucywgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJCXJldHVybiBlbGVtLnNlbGVjdGVkOworCQkJCX0pLmpvaW4oIi0iKSA6CisJCQkJIiI7CisKKwkJfSBlbHNlIGlmICggZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2VsZWN0IiApIHsKKwkJCXZhbCA9IGVsZW0uc2VsZWN0ZWRJbmRleDsKKwkJfQorCisJCXJldHVybiB2YWw7CisJfSwKKworCXRlc3RDaGFuZ2UgPSBmdW5jdGlvbiB0ZXN0Q2hhbmdlKCBlICkgeworCQl2YXIgZWxlbSA9IGUudGFyZ2V0LCBkYXRhLCB2YWw7CisKKwkJaWYgKCAhcmZvcm1FbGVtcy50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgZWxlbS5yZWFkT25seSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWRhdGEgPSBqUXVlcnkuZGF0YSggZWxlbSwgIl9jaGFuZ2VfZGF0YSIgKTsKKwkJdmFsID0gZ2V0VmFsKGVsZW0pOworCisJCS8vIHRoZSBjdXJyZW50IGRhdGEgd2lsbCBiZSBhbHNvIHJldHJpZXZlZCBieSBiZWZvcmVhY3RpdmF0ZQorCQlpZiAoIGUudHlwZSAhPT0gImZvY3Vzb3V0IiB8fCBlbGVtLnR5cGUgIT09ICJyYWRpbyIgKSB7CisJCQlqUXVlcnkuZGF0YSggZWxlbSwgIl9jaGFuZ2VfZGF0YSIsIHZhbCApOworCQl9CisJCQorCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IGRhdGEgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIGRhdGEgIT0gbnVsbCB8fCB2YWwgKSB7CisJCQllLnR5cGUgPSAiY2hhbmdlIjsKKwkJCWUubGl2ZUZpcmVkID0gdW5kZWZpbmVkOworCQkJcmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBhcmd1bWVudHNbMV0sIGVsZW0gKTsKKwkJfQorCX07CisKKwlqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UgPSB7CisJCWZpbHRlcnM6IHsKKwkJCWZvY3Vzb3V0OiB0ZXN0Q2hhbmdlLCAKKworCQkJYmVmb3JlZGVhY3RpdmF0ZTogdGVzdENoYW5nZSwKKworCQkJY2xpY2s6IGZ1bmN0aW9uKCBlICkgeworCQkJCXZhciBlbGVtID0gZS50YXJnZXQsIHR5cGUgPSBlbGVtLnR5cGU7CisKKwkJCQlpZiAoIHR5cGUgPT09ICJyYWRpbyIgfHwgdHlwZSA9PT0gImNoZWNrYm94IiB8fCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJzZWxlY3QiICkgeworCQkJCQlyZXR1cm4gdGVzdENoYW5nZS5jYWxsKCB0aGlzLCBlICk7CisJCQkJfQorCQkJfSwKKworCQkJLy8gQ2hhbmdlIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIHN1Ym1pdAorCQkJLy8gS2V5ZG93biB3aWxsIGJlIGNhbGxlZCBiZWZvcmUga2V5cHJlc3MsIHdoaWNoIGlzIHVzZWQgaW4gc3VibWl0LWV2ZW50IGRlbGVnYXRpb24KKwkJCWtleWRvd246IGZ1bmN0aW9uKCBlICkgeworCQkJCXZhciBlbGVtID0gZS50YXJnZXQsIHR5cGUgPSBlbGVtLnR5cGU7CisKKwkJCQlpZiAoIChlLmtleUNvZGUgPT09IDEzICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gInRleHRhcmVhIikgfHwKKwkJCQkJKGUua2V5Q29kZSA9PT0gMzIgJiYgKHR5cGUgPT09ICJjaGVja2JveCIgfHwgdHlwZSA9PT0gInJhZGlvIikpIHx8CisJCQkJCXR5cGUgPT09ICJzZWxlY3QtbXVsdGlwbGUiICkgeworCQkJCQlyZXR1cm4gdGVzdENoYW5nZS5jYWxsKCB0aGlzLCBlICk7CisJCQkJfQorCQkJfSwKKworCQkJLy8gQmVmb3JlYWN0aXZhdGUgaGFwcGVucyBhbHNvIGJlZm9yZSB0aGUgcHJldmlvdXMgZWxlbWVudCBpcyBibHVycmVkCisJCQkvLyB3aXRoIHRoaXMgZXZlbnQgeW91IGNhbid0IHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQsIGJ1dCB5b3UgY2FuIHN0b3JlCisJCQkvLyBpbmZvcm1hdGlvbgorCQkJYmVmb3JlYWN0aXZhdGU6IGZ1bmN0aW9uKCBlICkgeworCQkJCXZhciBlbGVtID0gZS50YXJnZXQ7CisJCQkJalF1ZXJ5LmRhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiLCBnZXRWYWwoZWxlbSkgKTsKKwkJCX0KKwkJfSwKKworCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMgKSB7CisJCQlpZiAoIHRoaXMudHlwZSA9PT0gImZpbGUiICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJZm9yICggdmFyIHR5cGUgaW4gY2hhbmdlRmlsdGVycyApIHsKKwkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlICsgIi5zcGVjaWFsQ2hhbmdlIiwgY2hhbmdlRmlsdGVyc1t0eXBlXSApOworCQkJfQorCisJCQlyZXR1cm4gcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICk7CisJCX0sCisKKwkJdGVhcmRvd246IGZ1bmN0aW9uKCBuYW1lc3BhY2VzICkgeworCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5zcGVjaWFsQ2hhbmdlIiApOworCisJCQlyZXR1cm4gcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICk7CisJCX0KKwl9OworCisJY2hhbmdlRmlsdGVycyA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0ZXJzOworCisJLy8gSGFuZGxlIHdoZW4gdGhlIGlucHV0IGlzIC5mb2N1cygpJ2QKKwljaGFuZ2VGaWx0ZXJzLmZvY3VzID0gY2hhbmdlRmlsdGVycy5iZWZvcmVhY3RpdmF0ZTsKK30KKworZnVuY3Rpb24gdHJpZ2dlciggdHlwZSwgZWxlbSwgYXJncyApIHsKKwlhcmdzWzBdLnR5cGUgPSB0eXBlOworCXJldHVybiBqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBlbGVtLCBhcmdzICk7Cit9CisKKy8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50cworaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgeworCWpRdWVyeS5lYWNoKHsgZm9jdXM6ICJmb2N1c2luIiwgYmx1cjogImZvY3Vzb3V0IiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgeworCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CisJCQlzZXR1cDogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCBmb2N1c0NvdW50c1tmaXhdKysgPT09IDAgKSB7CisJCQkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKKwkJCQl9CisJCQl9LCAKKwkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsgCisJCQkJaWYgKCAtLWZvY3VzQ291bnRzW2ZpeF0gPT09IDAgKSB7CisJCQkJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkJZnVuY3Rpb24gaGFuZGxlciggZSApIHsgCisJCQllID0galF1ZXJ5LmV2ZW50LmZpeCggZSApOworCQkJZS50eXBlID0gZml4OworCQkJcmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlLnRhcmdldCApOworCQl9CisJfSk7Cit9CisKK2pRdWVyeS5lYWNoKFsiYmluZCIsICJvbmUiXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4gKSB7CisJCS8vIEhhbmRsZSBvYmplY3QgbGl0ZXJhbHMKKwkJaWYgKCB0eXBlb2YgdHlwZSA9PT0gIm9iamVjdCIgKSB7CisJCQlmb3IgKCB2YXIga2V5IGluIHR5cGUgKSB7CisJCQkJdGhpc1sgbmFtZSBdKGtleSwgZGF0YSwgdHlwZVtrZXldLCBmbik7CisJCQl9CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQkKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApIHx8IGRhdGEgPT09IGZhbHNlICkgeworCQkJZm4gPSBkYXRhOworCQkJZGF0YSA9IHVuZGVmaW5lZDsKKwkJfQorCisJCXZhciBoYW5kbGVyID0gbmFtZSA9PT0gIm9uZSIgPyBqUXVlcnkucHJveHkoIGZuLCBmdW5jdGlvbiggZXZlbnQgKSB7CisJCQlqUXVlcnkoIHRoaXMgKS51bmJpbmQoIGV2ZW50LCBoYW5kbGVyICk7CisJCQlyZXR1cm4gZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQl9KSA6IGZuOworCisJCWlmICggdHlwZSA9PT0gInVubG9hZCIgJiYgbmFtZSAhPT0gIm9uZSIgKSB7CisJCQl0aGlzLm9uZSggdHlwZSwgZGF0YSwgZm4gKTsKKworCQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpc1tpXSwgdHlwZSwgaGFuZGxlciwgZGF0YSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfTsKK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBmbiApIHsKKwkJLy8gSGFuZGxlIG9iamVjdCBsaXRlcmFscworCQlpZiAoIHR5cGVvZiB0eXBlID09PSAib2JqZWN0IiAmJiAhdHlwZS5wcmV2ZW50RGVmYXVsdCApIHsKKwkJCWZvciAoIHZhciBrZXkgaW4gdHlwZSApIHsKKwkJCQl0aGlzLnVuYmluZChrZXksIHR5cGVba2V5XSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXNbaV0sIHR5cGUsIGZuICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCQorCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMubGl2ZSggdHlwZXMsIGRhdGEsIGZuLCBzZWxlY3RvciApOworCX0sCisJCisJdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CisJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMCApIHsKKwkJCQlyZXR1cm4gdGhpcy51bmJpbmQoICJsaXZlIiApOworCQkKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLmRpZSggdHlwZXMsIG51bGwsIGZuLCBzZWxlY3RvciApOworCQl9CisJfSwKKwkKKwl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CisJCX0pOworCX0sCisKKwl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CisJCWlmICggdGhpc1swXSApIHsKKwkJCXZhciBldmVudCA9IGpRdWVyeS5FdmVudCggdHlwZSApOworCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzWzBdICk7CisJCQlyZXR1cm4gZXZlbnQucmVzdWx0OworCQl9CisJfSwKKworCXRvZ2dsZTogZnVuY3Rpb24oIGZuICkgeworCQkvLyBTYXZlIHJlZmVyZW5jZSB0byBhcmd1bWVudHMgZm9yIGFjY2VzcyBpbiBjbG9zdXJlCisJCXZhciBhcmdzID0gYXJndW1lbnRzLAorCQkJaSA9IDE7CisKKwkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKKwkJd2hpbGUgKCBpIDwgYXJncy5sZW5ndGggKSB7CisJCQlqUXVlcnkucHJveHkoIGZuLCBhcmdzWyBpKysgXSApOworCQl9CisKKwkJcmV0dXJuIHRoaXMuY2xpY2soIGpRdWVyeS5wcm94eSggZm4sIGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQorCQkJdmFyIGxhc3RUb2dnbGUgPSAoIGpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkICkgfHwgMCApICUgaTsKKwkJCWpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkLCBsYXN0VG9nZ2xlICsgMSApOworCisJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3RvcAorCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKworCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCisJCQlyZXR1cm4gYXJnc1sgbGFzdFRvZ2dsZSBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxzZTsKKwkJfSkpOworCX0sCisKKwlob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7CisJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOworCX0KK30pOworCit2YXIgbGl2ZU1hcCA9IHsKKwlmb2N1czogImZvY3VzaW4iLAorCWJsdXI6ICJmb2N1c291dCIsCisJbW91c2VlbnRlcjogIm1vdXNlb3ZlciIsCisJbW91c2VsZWF2ZTogIm1vdXNlb3V0IgorfTsKKworalF1ZXJ5LmVhY2goWyJsaXZlIiwgImRpZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4sIG9yaWdTZWxlY3RvciAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKKwkJdmFyIHR5cGUsIGkgPSAwLCBtYXRjaCwgbmFtZXNwYWNlcywgcHJlVHlwZSwKKwkJCXNlbGVjdG9yID0gb3JpZ1NlbGVjdG9yIHx8IHRoaXMuc2VsZWN0b3IsCisJCQljb250ZXh0ID0gb3JpZ1NlbGVjdG9yID8gdGhpcyA6IGpRdWVyeSggdGhpcy5jb250ZXh0ICk7CisJCQorCQlpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgJiYgIXR5cGVzLnByZXZlbnREZWZhdWx0ICkgeworCQkJZm9yICggdmFyIGtleSBpbiB0eXBlcyApIHsKKwkJCQljb250ZXh0WyBuYW1lIF0oIGtleSwgZGF0YSwgdHlwZXNba2V5XSwgc2VsZWN0b3IgKTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CisJCQlmbiA9IGRhdGE7CisJCQlkYXRhID0gdW5kZWZpbmVkOworCQl9CisKKwkJdHlwZXMgPSAodHlwZXMgfHwgIiIpLnNwbGl0KCIgIik7CisKKwkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgIT0gbnVsbCApIHsKKwkJCW1hdGNoID0gcm5hbWVzcGFjZXMuZXhlYyggdHlwZSApOworCQkJbmFtZXNwYWNlcyA9ICIiOworCisJCQlpZiAoIG1hdGNoICkgIHsKKwkJCQluYW1lc3BhY2VzID0gbWF0Y2hbMF07CisJCQkJdHlwZSA9IHR5cGUucmVwbGFjZSggcm5hbWVzcGFjZXMsICIiICk7CisJCQl9CisKKwkJCWlmICggdHlwZSA9PT0gImhvdmVyIiApIHsKKwkJCQl0eXBlcy5wdXNoKCAibW91c2VlbnRlciIgKyBuYW1lc3BhY2VzLCAibW91c2VsZWF2ZSIgKyBuYW1lc3BhY2VzICk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXByZVR5cGUgPSB0eXBlOworCisJCQlpZiAoIHR5cGUgPT09ICJmb2N1cyIgfHwgdHlwZSA9PT0gImJsdXIiICkgeworCQkJCXR5cGVzLnB1c2goIGxpdmVNYXBbIHR5cGUgXSArIG5hbWVzcGFjZXMgKTsKKwkJCQl0eXBlID0gdHlwZSArIG5hbWVzcGFjZXM7CisKKwkJCX0gZWxzZSB7CisJCQkJdHlwZSA9IChsaXZlTWFwWyB0eXBlIF0gfHwgdHlwZSkgKyBuYW1lc3BhY2VzOworCQkJfQorCisJCQlpZiAoIG5hbWUgPT09ICJsaXZlIiApIHsKKwkJCQkvLyBiaW5kIGxpdmUgaGFuZGxlcgorCQkJCWZvciAoIHZhciBqID0gMCwgbCA9IGNvbnRleHQubGVuZ3RoOyBqIDwgbDsgaisrICkgeworCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCBjb250ZXh0W2pdLCAibGl2ZS4iICsgbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICksCisJCQkJCQl7IGRhdGE6IGRhdGEsIHNlbGVjdG9yOiBzZWxlY3RvciwgaGFuZGxlcjogZm4sIG9yaWdUeXBlOiB0eXBlLCBvcmlnSGFuZGxlcjogZm4sIHByZVR5cGU6IHByZVR5cGUgfSApOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQkvLyB1bmJpbmQgbGl2ZSBoYW5kbGVyCisJCQkJY29udGV4dC51bmJpbmQoICJsaXZlLiIgKyBsaXZlQ29udmVydCggdHlwZSwgc2VsZWN0b3IgKSwgZm4gKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHRoaXM7CisJfTsKK30pOworCitmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7CisJdmFyIHN0b3AsIG1heExldmVsLCByZWxhdGVkLCBtYXRjaCwgaGFuZGxlT2JqLCBlbGVtLCBqLCBpLCBsLCBkYXRhLCBjbG9zZSwgbmFtZXNwYWNlLCByZXQsCisJCWVsZW1zID0gW10sCisJCXNlbGVjdG9ycyA9IFtdLAorCQlldmVudHMgPSBqUXVlcnkuZGF0YSggdGhpcywgdGhpcy5ub2RlVHlwZSA/ICJldmVudHMiIDogIl9fZXZlbnRzX18iICk7CisKKwlpZiAoIHR5cGVvZiBldmVudHMgPT09ICJmdW5jdGlvbiIgKSB7CisJCWV2ZW50cyA9IGV2ZW50cy5ldmVudHM7CisJfQorCisJLy8gTWFrZSBzdXJlIHdlIGF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJsaW5nIGluIEZpcmVmb3ggKCMzODYxKQorCWlmICggZXZlbnQubGl2ZUZpcmVkID09PSB0aGlzIHx8ICFldmVudHMgfHwgIWV2ZW50cy5saXZlIHx8IGV2ZW50LmJ1dHRvbiAmJiBldmVudC50eXBlID09PSAiY2xpY2siICkgeworCQlyZXR1cm47CisJfQorCQorCWlmICggZXZlbnQubmFtZXNwYWNlICkgeworCQluYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCgiLiIpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CisJfQorCisJZXZlbnQubGl2ZUZpcmVkID0gdGhpczsKKworCXZhciBsaXZlID0gZXZlbnRzLmxpdmUuc2xpY2UoMCk7CisKKwlmb3IgKCBqID0gMDsgaiA8IGxpdmUubGVuZ3RoOyBqKysgKSB7CisJCWhhbmRsZU9iaiA9IGxpdmVbal07CisKKwkJaWYgKCBoYW5kbGVPYmoub3JpZ1R5cGUucmVwbGFjZSggcm5hbWVzcGFjZXMsICIiICkgPT09IGV2ZW50LnR5cGUgKSB7CisJCQlzZWxlY3RvcnMucHVzaCggaGFuZGxlT2JqLnNlbGVjdG9yICk7CisKKwkJfSBlbHNlIHsKKwkJCWxpdmUuc3BsaWNlKCBqLS0sIDEgKTsKKwkJfQorCX0KKworCW1hdGNoID0galF1ZXJ5KCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCBzZWxlY3RvcnMsIGV2ZW50LmN1cnJlbnRUYXJnZXQgKTsKKworCWZvciAoIGkgPSAwLCBsID0gbWF0Y2gubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQljbG9zZSA9IG1hdGNoW2ldOworCisJCWZvciAoIGogPSAwOyBqIDwgbGl2ZS5sZW5ndGg7IGorKyApIHsKKwkJCWhhbmRsZU9iaiA9IGxpdmVbal07CisKKwkJCWlmICggY2xvc2Uuc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciAmJiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApKSApIHsKKwkJCQllbGVtID0gY2xvc2UuZWxlbTsKKwkJCQlyZWxhdGVkID0gbnVsbDsKKworCQkJCS8vIFRob3NlIHR3byBldmVudHMgcmVxdWlyZSBhZGRpdGlvbmFsIGNoZWNraW5nCisJCQkJaWYgKCBoYW5kbGVPYmoucHJlVHlwZSA9PT0gIm1vdXNlZW50ZXIiIHx8IGhhbmRsZU9iai5wcmVUeXBlID09PSAibW91c2VsZWF2ZSIgKSB7CisJCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoucHJlVHlwZTsKKwkJCQkJcmVsYXRlZCA9IGpRdWVyeSggZXZlbnQucmVsYXRlZFRhcmdldCApLmNsb3Nlc3QoIGhhbmRsZU9iai5zZWxlY3RvciApWzBdOworCQkJCX0KKworCQkJCWlmICggIXJlbGF0ZWQgfHwgcmVsYXRlZCAhPT0gZWxlbSApIHsKKwkJCQkJZWxlbXMucHVzaCh7IGVsZW06IGVsZW0sIGhhbmRsZU9iajogaGFuZGxlT2JqLCBsZXZlbDogY2xvc2UubGV2ZWwgfSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJZm9yICggaSA9IDAsIGwgPSBlbGVtcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCW1hdGNoID0gZWxlbXNbaV07CisKKwkJaWYgKCBtYXhMZXZlbCAmJiBtYXRjaC5sZXZlbCA+IG1heExldmVsICkgeworCQkJYnJlYWs7CisJCX0KKworCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2guZWxlbTsKKwkJZXZlbnQuZGF0YSA9IG1hdGNoLmhhbmRsZU9iai5kYXRhOworCQlldmVudC5oYW5kbGVPYmogPSBtYXRjaC5oYW5kbGVPYmo7CisKKwkJcmV0ID0gbWF0Y2guaGFuZGxlT2JqLm9yaWdIYW5kbGVyLmFwcGx5KCBtYXRjaC5lbGVtLCBhcmd1bWVudHMgKTsKKworCQlpZiAoIHJldCA9PT0gZmFsc2UgfHwgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKwkJCW1heExldmVsID0gbWF0Y2gubGV2ZWw7CisKKwkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKKwkJCQlzdG9wID0gZmFsc2U7CisJCQl9CisJCQlpZiAoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc3RvcDsKK30KKworZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgeworCXJldHVybiAodHlwZSAmJiB0eXBlICE9PSAiKiIgPyB0eXBlICsgIi4iIDogIiIpICsgc2VsZWN0b3IucmVwbGFjZShycGVyaW9kLCAiYCIpLnJlcGxhY2UocnNwYWNlLCAiJiIpOworfQorCitqUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKKwkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCisJImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiKS5zcGxpdCgiICIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKworCS8vIEhhbmRsZSBldmVudCBiaW5kaW5nCisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CisJCWlmICggZm4gPT0gbnVsbCApIHsKKwkJCWZuID0gZGF0YTsKKwkJCWRhdGEgPSBudWxsOworCQl9CisKKwkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KKwkJCXRoaXMuYmluZCggbmFtZSwgZGF0YSwgZm4gKSA6CisJCQl0aGlzLnRyaWdnZXIoIG5hbWUgKTsKKwl9OworCisJaWYgKCBqUXVlcnkuYXR0ckZuICkgeworCQlqUXVlcnkuYXR0ckZuWyBuYW1lIF0gPSB0cnVlOworCX0KK30pOworCisvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorLy8gV2luZG93IGlzbid0IGluY2x1ZGVkIHNvIGFzIG5vdCB0byB1bmJpbmQgZXhpc3RpbmcgdW5sb2FkIGV2ZW50cworLy8gTW9yZSBpbmZvOgorLy8gIC0gaHR0cDovL2lzYWFjc2NobHVldGVyLmNvbS8yMDA2LzEwL21zaWUtbWVtb3J5LWxlYWtzLworaWYgKCB3aW5kb3cuYXR0YWNoRXZlbnQgJiYgIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgeworCWpRdWVyeSh3aW5kb3cpLmJpbmQoInVubG9hZCIsIGZ1bmN0aW9uKCkgeworCQlmb3IgKCB2YXIgaWQgaW4galF1ZXJ5LmNhY2hlICkgeworCQkJaWYgKCBqUXVlcnkuY2FjaGVbIGlkIF0uaGFuZGxlICkgeworCQkJCS8vIFRyeS9DYXRjaCBpcyB0byBoYW5kbGUgaWZyYW1lcyBiZWluZyB1bmxvYWRlZCwgc2VlICM0MjgwCisJCQkJdHJ5IHsKKwkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggalF1ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZS5lbGVtICk7CisJCQkJfSBjYXRjaChlKSB7fQorCQkJfQorCQl9CisJfSk7Cit9CisKKworLyohCisgKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYxLjAKKyAqICBDb3B5cmlnaHQgMjAwOSwgVGhlIERvam8gRm91bmRhdGlvbgorICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KKyAqICBNb3JlIGluZm9ybWF0aW9uOiBodHRwOi8vc2l6emxlanMuY29tLworICovCisoZnVuY3Rpb24oKXsKKwordmFyIGNodW5rZXIgPSAvKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXlxbXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteXFtcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8oKD86LnxccnxcbikqKS9nLAorCWRvbmUgPSAwLAorCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKKwloYXNEdXBsaWNhdGUgPSBmYWxzZSwKKwliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZTsKKworLy8gSGVyZSB3ZSBjaGVjayBpZiB0aGUgSmF2YVNjcmlwdCBlbmdpbmUgaXMgdXNpbmcgc29tZSBzb3J0IG9mCisvLyBvcHRpbWl6YXRpb24gd2hlcmUgaXQgZG9lcyBub3QgYWx3YXlzIGNhbGwgb3VyIGNvbXBhcmlzaW9uCisvLyBmdW5jdGlvbi4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgZGlzY2FyZCB0aGUgaGFzRHVwbGljYXRlIHZhbHVlLgorLy8gICBUaHVzIGZhciB0aGF0IGluY2x1ZGVzIEdvb2dsZSBDaHJvbWUuCitbMCwgMF0uc29ydChmdW5jdGlvbigpIHsKKwliYXNlSGFzRHVwbGljYXRlID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9KTsKKwordmFyIFNpenpsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsKKwlyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKKwljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKworCXZhciBvcmlnQ29udGV4dCA9IGNvbnRleHQ7CisKKwlpZiAoIGNvbnRleHQubm9kZVR5cGUgIT09IDEgJiYgY29udGV4dC5ub2RlVHlwZSAhPT0gOSApIHsKKwkJcmV0dXJuIFtdOworCX0KKwkKKwlpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgeworCQlyZXR1cm4gcmVzdWx0czsKKwl9CisKKwl2YXIgbSwgc2V0LCBjaGVja1NldCwgZXh0cmEsIHJldCwgY3VyLCBwb3AsIGksCisJCXBydW5lID0gdHJ1ZSwKKwkJY29udGV4dFhNTCA9IFNpenpsZS5pc1hNTCggY29udGV4dCApLAorCQlwYXJ0cyA9IFtdLAorCQlzb0ZhciA9IHNlbGVjdG9yOworCQorCS8vIFJlc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmtlciByZWdleHAgKHN0YXJ0IGZyb20gaGVhZCkKKwlkbyB7CisJCWNodW5rZXIuZXhlYyggIiIgKTsKKwkJbSA9IGNodW5rZXIuZXhlYyggc29GYXIgKTsKKworCQlpZiAoIG0gKSB7CisJCQlzb0ZhciA9IG1bM107CisJCQorCQkJcGFydHMucHVzaCggbVsxXSApOworCQkKKwkJCWlmICggbVsyXSApIHsKKwkJCQlleHRyYSA9IG1bM107CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlICggbSApOworCisJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKKworCQlpZiAoIHBhcnRzLmxlbmd0aCA9PT0gMiAmJiBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdICkgeworCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOworCisJCX0gZWxzZSB7CisJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KKwkJCQlbIGNvbnRleHQgXSA6CisJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0ICk7CisKKwkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgeworCQkJCXNlbGVjdG9yID0gcGFydHMuc2hpZnQoKTsKKworCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgc2VsZWN0b3IgXSApIHsKKwkJCQkJc2VsZWN0b3IgKz0gcGFydHMuc2hpZnQoKTsKKwkJCQl9CisJCQkJCisJCQkJc2V0ID0gcG9zUHJvY2Vzcyggc2VsZWN0b3IsIHNldCApOworCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQkvLyBUYWtlIGEgc2hvcnRjdXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRAorCQkvLyAoYnV0IG5vdCBpZiBpdCdsbCBiZSBmYXN0ZXIgaWYgdGhlIGlubmVyIHNlbGVjdG9yIGlzIGFuIElEKQorCQlpZiAoICFzZWVkICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhY29udGV4dFhNTCAmJgorCQkJCUV4cHIubWF0Y2guSUQudGVzdChwYXJ0c1swXSkgJiYgIUV4cHIubWF0Y2guSUQudGVzdChwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSkgKSB7CisKKwkJCXJldCA9IFNpenpsZS5maW5kKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0LCBjb250ZXh0WE1MICk7CisJCQljb250ZXh0ID0gcmV0LmV4cHIgPworCQkJCVNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0IClbMF0gOgorCQkJCXJldC5zZXRbMF07CisJCX0KKworCQlpZiAoIGNvbnRleHQgKSB7CisJCQlyZXQgPSBzZWVkID8KKwkJCQl7IGV4cHI6IHBhcnRzLnBvcCgpLCBzZXQ6IG1ha2VBcnJheShzZWVkKSB9IDoKKwkJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiAocGFydHNbMF0gPT09ICJ+IiB8fCBwYXJ0c1swXSA9PT0gIisiKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBjb250ZXh0WE1MICk7CisKKwkJCXNldCA9IHJldC5leHByID8KKwkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDoKKwkJCQlyZXQuc2V0OworCisJCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CisJCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoIHNldCApOworCisJCQl9IGVsc2UgeworCQkJCXBydW5lID0gZmFsc2U7CisJCQl9CisKKwkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgeworCQkJCWN1ciA9IHBhcnRzLnBvcCgpOworCQkJCXBvcCA9IGN1cjsKKworCQkJCWlmICggIUV4cHIucmVsYXRpdmVbIGN1ciBdICkgeworCQkJCQljdXIgPSAiIjsKKwkJCQl9IGVsc2UgeworCQkJCQlwb3AgPSBwYXJ0cy5wb3AoKTsKKwkJCQl9CisKKwkJCQlpZiAoIHBvcCA9PSBudWxsICkgeworCQkJCQlwb3AgPSBjb250ZXh0OworCQkJCX0KKworCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWNoZWNrU2V0ID0gcGFydHMgPSBbXTsKKwkJfQorCX0KKworCWlmICggIWNoZWNrU2V0ICkgeworCQljaGVja1NldCA9IHNldDsKKwl9CisKKwlpZiAoICFjaGVja1NldCApIHsKKwkJU2l6emxlLmVycm9yKCBjdXIgfHwgc2VsZWN0b3IgKTsKKwl9CisKKwlpZiAoIHRvU3RyaW5nLmNhbGwoY2hlY2tTZXQpID09PSAiW29iamVjdCBBcnJheV0iICkgeworCQlpZiAoICFwcnVuZSApIHsKKwkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKKworCQl9IGVsc2UgaWYgKCBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CisJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggY2hlY2tTZXRbaV0gJiYgKGNoZWNrU2V0W2ldID09PSB0cnVlIHx8IGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICYmIFNpenpsZS5jb250YWlucyhjb250ZXh0LCBjaGVja1NldFtpXSkpICkgeworCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOworCQkJCX0KKwkJCX0KKworCQl9IGVsc2UgeworCQkJZm9yICggaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgeworCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJfSBlbHNlIHsKKwkJbWFrZUFycmF5KCBjaGVja1NldCwgcmVzdWx0cyApOworCX0KKworCWlmICggZXh0cmEgKSB7CisJCVNpenpsZSggZXh0cmEsIG9yaWdDb250ZXh0LCByZXN1bHRzLCBzZWVkICk7CisJCVNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7CisJfQorCisJcmV0dXJuIHJlc3VsdHM7Cit9OworCitTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgeworCWlmICggc29ydE9yZGVyICkgeworCQloYXNEdXBsaWNhdGUgPSBiYXNlSGFzRHVwbGljYXRlOworCQlyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApOworCisJCWlmICggaGFzRHVwbGljYXRlICkgeworCQkJZm9yICggdmFyIGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKKwkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbIGkgLSAxIF0gKSB7CisJCQkJCXJlc3VsdHMuc3BsaWNlKCBpLS0sIDEgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0czsKK307CisKK1NpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIHNldCApIHsKKwlyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBzZXQgKTsKK307CisKK1NpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggbm9kZSwgZXhwciApIHsKKwlyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBbbm9kZV0gKS5sZW5ndGggPiAwOworfTsKKworU2l6emxlLmZpbmQgPSBmdW5jdGlvbiggZXhwciwgY29udGV4dCwgaXNYTUwgKSB7CisJdmFyIHNldDsKKworCWlmICggIWV4cHIgKSB7CisJCXJldHVybiBbXTsKKwl9CisKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSBFeHByLm9yZGVyLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJdmFyIG1hdGNoLAorCQkJdHlwZSA9IEV4cHIub3JkZXJbaV07CisJCQorCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsKKwkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07CisJCQltYXRjaC5zcGxpY2UoIDEsIDEgKTsKKworCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CisJCQkJbWF0Y2hbMV0gPSAobWF0Y2hbMV0gfHwgIiIpLnJlcGxhY2UoL1xcL2csICIiKTsKKwkJCQlzZXQgPSBFeHByLmZpbmRbIHR5cGUgXSggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICk7CisKKwkJCQlpZiAoIHNldCAhPSBudWxsICkgeworCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmICggIXNldCApIHsKKwkJc2V0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CisJfQorCisJcmV0dXJuIHsgc2V0OiBzZXQsIGV4cHI6IGV4cHIgfTsKK307CisKK1NpenpsZS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgc2V0LCBpbnBsYWNlLCBub3QgKSB7CisJdmFyIG1hdGNoLCBhbnlGb3VuZCwKKwkJb2xkID0gZXhwciwKKwkJcmVzdWx0ID0gW10sCisJCWN1ckxvb3AgPSBzZXQsCisJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBTaXp6bGUuaXNYTUwoIHNldFswXSApOworCisJd2hpbGUgKCBleHByICYmIHNldC5sZW5ndGggKSB7CisJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgeworCQkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgIT0gbnVsbCAmJiBtYXRjaFsyXSApIHsKKwkJCQl2YXIgZm91bmQsIGl0ZW0sCisJCQkJCWZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sCisJCQkJCWxlZnQgPSBtYXRjaFsxXTsKKworCQkJCWFueUZvdW5kID0gZmFsc2U7CisKKwkJCQltYXRjaC5zcGxpY2UoMSwxKTsKKworCQkJCWlmICggbGVmdC5zdWJzdHIoIGxlZnQubGVuZ3RoIC0gMSApID09PSAiXFwiICkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoIGN1ckxvb3AgPT09IHJlc3VsdCApIHsKKwkJCQkJcmVzdWx0ID0gW107CisJCQkJfQorCisJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgeworCQkJCQltYXRjaCA9IEV4cHIucHJlRmlsdGVyWyB0eXBlIF0oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUxGaWx0ZXIgKTsKKworCQkJCQlpZiAoICFtYXRjaCApIHsKKwkJCQkJCWFueUZvdW5kID0gZm91bmQgPSB0cnVlOworCisJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIG1hdGNoICkgeworCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJCQkJaWYgKCBpdGVtICkgeworCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOworCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKKworCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgeworCQkJCQkJCQlpZiAoIHBhc3MgKSB7CisJCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7CisKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKKwkJCQkJCQkJfQorCisJCQkJCQkJfSBlbHNlIGlmICggcGFzcyApIHsKKwkJCQkJCQkJcmVzdWx0LnB1c2goIGl0ZW0gKTsKKwkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJaWYgKCAhaW5wbGFjZSApIHsKKwkJCQkJCWN1ckxvb3AgPSByZXN1bHQ7CisJCQkJCX0KKworCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7CisKKwkJCQkJaWYgKCAhYW55Rm91bmQgKSB7CisJCQkJCQlyZXR1cm4gW107CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBJbXByb3BlciBleHByZXNzaW9uCisJCWlmICggZXhwciA9PT0gb2xkICkgeworCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgeworCQkJCVNpenpsZS5lcnJvciggZXhwciApOworCisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJb2xkID0gZXhwcjsKKwl9CisKKwlyZXR1cm4gY3VyTG9vcDsKK307CisKK1NpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7CisJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2c7Cit9OworCit2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CisJb3JkZXI6IFsgIklEIiwgIk5BTUUiLCAiVEFHIiBdLAorCisJbWF0Y2g6IHsKKwkJSUQ6IC8jKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLywKKwkJQ0xBU1M6IC9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sCisJCU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLywKKwkJQVRUUjogL1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywKKwkJVEFHOiAvXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLywKKwkJQ0hJTEQ6IC86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbitcLV0qKVwpKT8vLAorCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLAorCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vCisJfSwKKworCWxlZnRNYXRjaDoge30sCisKKwlhdHRyTWFwOiB7CisJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAorCQkiZm9yIjogImh0bWxGb3IiCisJfSwKKworCWF0dHJIYW5kbGU6IHsKKwkJaHJlZjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJocmVmIiApOworCQl9CisJfSwKKworCXJlbGF0aXZlOiB7CisJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQpeworCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKKwkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KCBwYXJ0ICksCisJCQkJaXNQYXJ0U3RyTm90VGFnID0gaXNQYXJ0U3RyICYmICFpc1RhZzsKKworCQkJaWYgKCBpc1RhZyApIHsKKwkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOworCQkJfQorCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CisJCQkJaWYgKCAoZWxlbSA9IGNoZWNrU2V0W2ldKSApIHsKKwkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJldmlvdXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30KKworCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ck5vdFRhZyB8fCBlbGVtICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/CisJCQkJCQllbGVtIHx8IGZhbHNlIDoKKwkJCQkJCWVsZW0gPT09IHBhcnQ7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIGlzUGFydFN0ck5vdFRhZyApIHsKKwkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOworCQkJfQorCQl9LAorCisJCSI+IjogZnVuY3Rpb24oIGNoZWNrU2V0LCBwYXJ0ICkgeworCQkJdmFyIGVsZW0sCisJCQkJaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciLAorCQkJCWkgPSAwLAorCQkJCWwgPSBjaGVja1NldC5sZW5ndGg7CisKKwkJCWlmICggaXNQYXJ0U3RyICYmICEvXFcvLnRlc3QoIHBhcnQgKSApIHsKKwkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOworCisJCQkJZm9yICggOyBpIDwgbDsgaSsrICkgeworCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CisKKwkJCQkJaWYgKCBlbGVtICkgeworCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKwkJCQkJCWNoZWNrU2V0W2ldID0gcGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisJCQkJCWVsZW0gPSBjaGVja1NldFtpXTsKKworCQkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ciA/CisJCQkJCQkJZWxlbS5wYXJlbnROb2RlIDoKKwkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGlzUGFydFN0ciApIHsKKwkJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKKwkJCQl9CisJCQl9CisJCX0sCisKKwkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CisJCQl2YXIgbm9kZUNoZWNrLAorCQkJCWRvbmVOYW1lID0gZG9uZSsrLAorCQkJCWNoZWNrRm4gPSBkaXJDaGVjazsKKworCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsKKwkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOworCQkJCW5vZGVDaGVjayA9IHBhcnQ7CisJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKKwkJCX0KKworCQkJY2hlY2tGbiggInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKKwkJfSwKKworCQkifiI6IGZ1bmN0aW9uKCBjaGVja1NldCwgcGFydCwgaXNYTUwgKSB7CisJCQl2YXIgbm9kZUNoZWNrLAorCQkJCWRvbmVOYW1lID0gZG9uZSsrLAorCQkJCWNoZWNrRm4gPSBkaXJDaGVjazsKKworCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIS9cVy8udGVzdCggcGFydCApICkgeworCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7CisJCQkJbm9kZUNoZWNrID0gcGFydDsKKwkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOworCQkJfQorCisJCQljaGVja0ZuKCAicHJldmlvdXNTaWJsaW5nIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICk7CisJCX0KKwl9LAorCisJZmluZDogeworCQlJRDogZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApIHsKKwkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKKwkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOworCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisJCQkJLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworCQkJCXJldHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFttXSA6IFtdOworCQkJfQorCQl9LAorCisJCU5BTUU6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKKwkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgeworCQkJCXZhciByZXQgPSBbXSwKKwkJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIG1hdGNoWzFdICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSByZXN1bHRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKKwkJCQkJCXJldC5wdXNoKCByZXN1bHRzW2ldICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gcmV0Lmxlbmd0aCA9PT0gMCA/IG51bGwgOiByZXQ7CisJCQl9CisJCX0sCisKKwkJVEFHOiBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQgKSB7CisJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggbWF0Y2hbMV0gKTsKKwkJfQorCX0sCisJcHJlRmlsdGVyOiB7CisJCUNMQVNTOiBmdW5jdGlvbiggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCApIHsKKwkJCW1hdGNoID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOworCisJCQlpZiAoIGlzWE1MICkgeworCQkJCXJldHVybiBtYXRjaDsKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5dL2csICIgIikuaW5kZXhPZihtYXRjaCkgPj0gMCkgKSB7CisJCQkJCQlpZiAoICFpbnBsYWNlICkgeworCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKKwkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGZhbHNlOworCQl9LAorCisJCUlEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisJCQlyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOworCQl9LAorCisJCVRBRzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wICkgeworCQkJcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7CisJCX0sCisKKwkJQ0hJTEQ6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKwkJCWlmICggbWF0Y2hbMV0gPT09ICJudGgiICkgeworCQkJCS8vIHBhcnNlIGVxdWF0aW9ucyBsaWtlICdldmVuJywgJ29kZCcsICc1JywgJzJuJywgJzNuKzInLCAnNG4tMScsICctbis2JworCQkJCXZhciB0ZXN0ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYygKKwkJCQkJbWF0Y2hbMl0gPT09ICJldmVuIiAmJiAiMm4iIHx8IG1hdGNoWzJdID09PSAib2RkIiAmJiAiMm4rMSIgfHwKKwkJCQkJIS9cRC8udGVzdCggbWF0Y2hbMl0gKSAmJiAiMG4rIiArIG1hdGNoWzJdIHx8IG1hdGNoWzJdKTsKKworCQkJCS8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVycyAoZmlyc3QpbisobGFzdCkgaW5jbHVkaW5nIGlmIHRoZXkgYXJlIG5lZ2F0aXZlCisJCQkJbWF0Y2hbMl0gPSAodGVzdFsxXSArICh0ZXN0WzJdIHx8IDEpKSAtIDA7CisJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKKwkJCX0KKworCQkJLy8gVE9ETzogTW92ZSB0byBub3JtYWwgY2FjaGluZyBzeXN0ZW0KKwkJCW1hdGNoWzBdID0gZG9uZSsrOworCisJCQlyZXR1cm4gbWF0Y2g7CisJCX0sCisKKwkJQVRUUjogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwgKSB7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsKKwkJCQorCQkJaWYgKCAhaXNYTUwgJiYgRXhwci5hdHRyTWFwW25hbWVdICkgeworCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVdOworCQkJfQorCisJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworCQkJCW1hdGNoWzRdID0gIiAiICsgbWF0Y2hbNF0gKyAiICI7CisJCQl9CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKworCQlQU0VVRE86IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QgKSB7CisJCQlpZiAoIG1hdGNoWzFdID09PSAibm90IiApIHsKKwkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQorCQkJCWlmICggKCBjaHVua2VyLmV4ZWMobWF0Y2hbM10pIHx8ICIiICkubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsKKwkJCQkJbWF0Y2hbM10gPSBTaXp6bGUobWF0Y2hbM10sIG51bGwsIG51bGwsIGN1ckxvb3ApOworCisJCQkJfSBlbHNlIHsKKwkJCQkJdmFyIHJldCA9IFNpenpsZS5maWx0ZXIobWF0Y2hbM10sIGN1ckxvb3AsIGlucGxhY2UsIHRydWUgXiBub3QpOworCisJCQkJCWlmICggIWlucGxhY2UgKSB7CisJCQkJCQlyZXN1bHQucHVzaC5hcHBseSggcmVzdWx0LCByZXQgKTsKKwkJCQkJfQorCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoIEV4cHIubWF0Y2guUE9TLnRlc3QoIG1hdGNoWzBdICkgfHwgRXhwci5tYXRjaC5DSElMRC50ZXN0KCBtYXRjaFswXSApICkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJCisJCQlyZXR1cm4gbWF0Y2g7CisJCX0sCisKKwkJUE9TOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisJCQltYXRjaC51bnNoaWZ0KCB0cnVlICk7CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0sCisJCisJZmlsdGVyczogeworCQllbmFibGVkOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOworCQl9LAorCisJCWRpc2FibGVkOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOworCQl9LAorCisJCWNoZWNrZWQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0uY2hlY2tlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJCisJCXNlbGVjdGVkOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKKwkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKKwkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworCQkJCisJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKKwkJfSwKKworCQlwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICEhZWxlbS5maXJzdENoaWxkOworCQl9LAorCisJCWVtcHR5OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAhZWxlbS5maXJzdENoaWxkOworCQl9LAorCisJCWhhczogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoICkgeworCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKKwkJfSwKKworCQloZWFkZXI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICgvaFxkL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKKwkJfSwKKworCQl0ZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAidGV4dCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJcmFkaW86IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICJyYWRpbyIgPT09IGVsZW0udHlwZTsKKwkJfSwKKworCQljaGVja2JveDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gImNoZWNrYm94IiA9PT0gZWxlbS50eXBlOworCQl9LAorCisJCWZpbGU6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICJmaWxlIiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlwYXNzd29yZDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gInBhc3N3b3JkIiA9PT0gZWxlbS50eXBlOworCQl9LAorCisJCXN1Ym1pdDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gInN1Ym1pdCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKworCQlpbWFnZTogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gImltYWdlIiA9PT0gZWxlbS50eXBlOworCQl9LAorCisJCXJlc2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAicmVzZXQiID09PSBlbGVtLnR5cGU7CisJCX0sCisKKwkJYnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAiYnV0dG9uIiA9PT0gZWxlbS50eXBlIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImJ1dHRvbiI7CisJCX0sCisKKwkJaW5wdXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICgvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pKS50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CisJCX0KKwl9LAorCXNldEZpbHRlcnM6IHsKKwkJZmlyc3Q6IGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQkJcmV0dXJuIGkgPT09IDA7CisJCX0sCisKKwkJbGFzdDogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoLCBhcnJheSApIHsKKwkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOworCQl9LAorCisJCWV2ZW46IGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQkJcmV0dXJuIGkgJSAyID09PSAwOworCQl9LAorCisJCW9kZDogZnVuY3Rpb24oIGVsZW0sIGkgKSB7CisJCQlyZXR1cm4gaSAlIDIgPT09IDE7CisJCX0sCisKKwkJbHQ6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKKwkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOworCQl9LAorCisJCWd0OiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CisJCQlyZXR1cm4gaSA+IG1hdGNoWzNdIC0gMDsKKwkJfSwKKworCQludGg6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKKwkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CisJCX0sCisKKwkJZXE6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKKwkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CisJCX0KKwl9LAorCWZpbHRlcjogeworCQlQU0VVRE86IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCwgaSwgYXJyYXkgKSB7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAorCQkJCWZpbHRlciA9IEV4cHIuZmlsdGVyc1sgbmFtZSBdOworCisJCQlpZiAoIGZpbHRlciApIHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKKworCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKKwkJCQlyZXR1cm4gKGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgU2l6emxlLmdldFRleHQoWyBlbGVtIF0pIHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOworCisJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKKwkJCQl2YXIgbm90ID0gbWF0Y2hbM107CisKKwkJCQlmb3IgKCB2YXIgaiA9IDAsIGwgPSBub3QubGVuZ3RoOyBqIDwgbDsgaisrICkgeworCQkJCQlpZiAoIG5vdFtqXSA9PT0gZWxlbSApIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiB0cnVlOworCisJCQl9IGVsc2UgeworCQkJCVNpenpsZS5lcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBuYW1lICk7CisJCQl9CisJCX0sCisKKwkJQ0hJTEQ6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKKwkJCXZhciB0eXBlID0gbWF0Y2hbMV0sCisJCQkJbm9kZSA9IGVsZW07CisKKwkJCXN3aXRjaCAoIHR5cGUgKSB7CisJCQkJY2FzZSAib25seSI6CisJCQkJY2FzZSAiZmlyc3QiOgorCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkJIHsKKwkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsgCisJCQkJCQkJcmV0dXJuIGZhbHNlOyAKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmICggdHlwZSA9PT0gImZpcnN0IiApIHsgCisJCQkJCQlyZXR1cm4gdHJ1ZTsgCisJCQkJCX0KKworCQkJCQlub2RlID0gZWxlbTsKKworCQkJCWNhc2UgImxhc3QiOgorCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKQkgeworCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyAKKwkJCQkJCQlyZXR1cm4gZmFsc2U7IAorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcmV0dXJuIHRydWU7CisKKwkJCQljYXNlICJudGgiOgorCQkJCQl2YXIgZmlyc3QgPSBtYXRjaFsyXSwKKwkJCQkJCWxhc3QgPSBtYXRjaFszXTsKKworCQkJCQlpZiAoIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCisJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCisJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CisJCQkJCQl2YXIgY291bnQgPSAwOworCQkJCQkJCisJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgeworCQkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCQkJbm9kZS5ub2RlSW5kZXggPSArK2NvdW50OworCQkJCQkJCX0KKwkJCQkJCX0gCisKKwkJCQkJCXBhcmVudC5zaXpjYWNoZSA9IGRvbmVOYW1lOworCQkJCQl9CisJCQkJCQorCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsKKworCQkJCQlpZiAoIGZpcnN0ID09PSAwICkgeworCQkJCQkJcmV0dXJuIGRpZmYgPT09IDA7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOworCQkJCQl9CisJCQl9CisJCX0sCisKKwkJSUQ6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKKwkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsKKwkJfSwKKworCQlUQUc6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKKwkJCXJldHVybiAobWF0Y2ggPT09ICIqIiAmJiBlbGVtLm5vZGVUeXBlID09PSAxKSB8fCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG1hdGNoOworCQl9LAorCQkKKwkJQ0xBU1M6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKKwkJCXJldHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSArICIgIikKKwkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOworCQl9LAorCisJCUFUVFI6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0sCisJCQkJcmVzdWx0ID0gRXhwci5hdHRySGFuZGxlWyBuYW1lIF0gPworCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKKwkJCQkJZWxlbVsgbmFtZSBdICE9IG51bGwgPworCQkJCQkJZWxlbVsgbmFtZSBdIDoKKwkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCisJCQkJdmFsdWUgPSByZXN1bHQgKyAiIiwKKwkJCQl0eXBlID0gbWF0Y2hbMl0sCisJCQkJY2hlY2sgPSBtYXRjaFs0XTsKKworCQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8KKwkJCQl0eXBlID09PSAiIT0iIDoKKwkJCQl0eXBlID09PSAiPSIgPworCQkJCXZhbHVlID09PSBjaGVjayA6CisJCQkJdHlwZSA9PT0gIio9IiA/CisJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPj0gMCA6CisJCQkJdHlwZSA9PT0gIn49IiA/CisJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKKwkJCQkhY2hlY2sgPworCQkJCXZhbHVlICYmIHJlc3VsdCAhPT0gZmFsc2UgOgorCQkJCXR5cGUgPT09ICIhPSIgPworCQkJCXZhbHVlICE9PSBjaGVjayA6CisJCQkJdHlwZSA9PT0gIl49IiA/CisJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgorCQkJCXR5cGUgPT09ICIkPSIgPworCQkJCXZhbHVlLnN1YnN0cih2YWx1ZS5sZW5ndGggLSBjaGVjay5sZW5ndGgpID09PSBjaGVjayA6CisJCQkJdHlwZSA9PT0gInw9IiA/CisJCQkJdmFsdWUgPT09IGNoZWNrIHx8IHZhbHVlLnN1YnN0cigwLCBjaGVjay5sZW5ndGggKyAxKSA9PT0gY2hlY2sgKyAiLSIgOgorCQkJCWZhbHNlOworCQl9LAorCisJCVBPUzogZnVuY3Rpb24oIGVsZW0sIG1hdGNoLCBpLCBhcnJheSApIHsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMl0sCisJCQkJZmlsdGVyID0gRXhwci5zZXRGaWx0ZXJzWyBuYW1lIF07CisKKwkJCWlmICggZmlsdGVyICkgeworCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOworCQkJfQorCQl9CisJfQorfTsKKwordmFyIG9yaWdQT1MgPSBFeHByLm1hdGNoLlBPUywKKwlmZXNjYXBlID0gZnVuY3Rpb24oYWxsLCBudW0peworCQlyZXR1cm4gIlxcIiArIChudW0gLSAwICsgMSk7CisJfTsKKworZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKKwlFeHByLm1hdGNoWyB0eXBlIF0gPSBuZXcgUmVnRXhwKCBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlICsgKC8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSkgKTsKKwlFeHByLmxlZnRNYXRjaFsgdHlwZSBdID0gbmV3IFJlZ0V4cCggLyheKD86LnxccnxcbikqPykvLnNvdXJjZSArIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLCBmZXNjYXBlKSApOworfQorCit2YXIgbWFrZUFycmF5ID0gZnVuY3Rpb24oIGFycmF5LCByZXN1bHRzICkgeworCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5LCAwICk7CisKKwlpZiAoIHJlc3VsdHMgKSB7CisJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCQorCXJldHVybiBhcnJheTsKK307CisKKy8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKKy8vIGNvbnZlcnRpbmcgYSBOb2RlTGlzdCB0byBhbiBhcnJheSB1c2luZyBidWlsdGluIG1ldGhvZHMuCisvLyBBbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGhvbGRzIERPTSBub2RlcworLy8gKHdoaWNoIGlzIG5vdCB0aGUgY2FzZSBpbiB0aGUgQmxhY2tiZXJyeSBicm93c2VyKQordHJ5IHsKKwlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsKKworLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCit9IGNhdGNoKCBlICkgeworCW1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKKwkJdmFyIGkgPSAwLAorCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKKworCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgeworCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsKKworCQl9IGVsc2UgeworCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVtYmVyIiApIHsKKwkJCQlmb3IgKCB2YXIgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsKKwkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9OworfQorCit2YXIgc29ydE9yZGVyLCBzaWJsaW5nQ2hlY2s7CisKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQlpZiAoIGEgPT09IGIgKSB7CisJCQloYXNEdXBsaWNhdGUgPSB0cnVlOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHx8ICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgeworCQkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPyAtMSA6IDE7CisJCX0KKworCQlyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IDE7CisJfTsKKworfSBlbHNlIHsKKwlzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKKwkJdmFyIGFsLCBibCwKKwkJCWFwID0gW10sCisJCQlicCA9IFtdLAorCQkJYXVwID0gYS5wYXJlbnROb2RlLAorCQkJYnVwID0gYi5wYXJlbnROb2RlLAorCQkJY3VyID0gYXVwOworCisJCS8vIFRoZSBub2RlcyBhcmUgaWRlbnRpY2FsLCB3ZSBjYW4gZXhpdCBlYXJseQorCQlpZiAoIGEgPT09IGIgKSB7CisJCQloYXNEdXBsaWNhdGUgPSB0cnVlOworCQkJcmV0dXJuIDA7CisKKwkJLy8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncyAob3IgaWRlbnRpY2FsKSB3ZSBjYW4gZG8gYSBxdWljayBjaGVjaworCQl9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHsKKwkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKKworCQkvLyBJZiBubyBwYXJlbnRzIHdlcmUgZm91bmQgdGhlbiB0aGUgbm9kZXMgYXJlIGRpc2Nvbm5lY3RlZAorCQl9IGVsc2UgaWYgKCAhYXVwICkgeworCQkJcmV0dXJuIC0xOworCisJCX0gZWxzZSBpZiAoICFidXAgKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQKKwkJLy8gdG8gYnVpbGQgdXAgYSBmdWxsIGxpc3Qgb2YgdGhlIHBhcmVudE5vZGVzIGZvciBjb21wYXJpc29uCisJCXdoaWxlICggY3VyICkgeworCQkJYXAudW5zaGlmdCggY3VyICk7CisJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKKwkJfQorCisJCWN1ciA9IGJ1cDsKKworCQl3aGlsZSAoIGN1ciApIHsKKwkJCWJwLnVuc2hpZnQoIGN1ciApOworCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CisJCX0KKworCQlhbCA9IGFwLmxlbmd0aDsKKwkJYmwgPSBicC5sZW5ndGg7CisKKwkJLy8gU3RhcnQgd2Fsa2luZyBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3kKKwkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7CisJCQlpZiAoIGFwW2ldICE9PSBicFtpXSApIHsKKwkJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhcFtpXSwgYnBbaV0gKTsKKwkJCX0KKwkJfQorCisJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sKKwkJcmV0dXJuIGkgPT09IGFsID8KKwkJCXNpYmxpbmdDaGVjayggYSwgYnBbaV0sIC0xICkgOgorCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOworCX07CisKKwlzaWJsaW5nQ2hlY2sgPSBmdW5jdGlvbiggYSwgYiwgcmV0ICkgeworCQlpZiAoIGEgPT09IGIgKSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJdmFyIGN1ciA9IGEubmV4dFNpYmxpbmc7CisKKwkJd2hpbGUgKCBjdXIgKSB7CisJCQlpZiAoIGN1ciA9PT0gYiApIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWN1ciA9IGN1ci5uZXh0U2libGluZzsKKwkJfQorCisJCXJldHVybiAxOworCX07Cit9CisKKy8vIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJlaXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzCitTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtcyApIHsKKwl2YXIgcmV0ID0gIiIsIGVsZW07CisKKwlmb3IgKCB2YXIgaSA9IDA7IGVsZW1zW2ldOyBpKysgKSB7CisJCWVsZW0gPSBlbGVtc1tpXTsKKworCQkvLyBHZXQgdGhlIHRleHQgZnJvbSB0ZXh0IG5vZGVzIGFuZCBDREFUQSBub2RlcworCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsKKwkJCXJldCArPSBlbGVtLm5vZGVWYWx1ZTsKKworCQkvLyBUcmF2ZXJzZSBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCBjb21tZW50IG5vZGVzCisJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgIT09IDggKSB7CisJCQlyZXQgKz0gU2l6emxlLmdldFRleHQoIGVsZW0uY2hpbGROb2RlcyApOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK307CisKKy8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgorLy8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVudEJ5SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3VuZCkKKyhmdW5jdGlvbigpeworCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKKwl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAorCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKSwKKwkJcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKworCWZvcm0uaW5uZXJIVE1MID0gIjxhIG5hbWU9JyIgKyBpZCArICInLz4iOworCisJLy8gSW5qZWN0IGl0IGludG8gdGhlIHJvb3QgZWxlbWVudCwgY2hlY2sgaXRzIHN0YXR1cywgYW5kIHJlbW92ZSBpdCBxdWlja2x5CisJcm9vdC5pbnNlcnRCZWZvcmUoIGZvcm0sIHJvb3QuZmlyc3RDaGlsZCApOworCisJLy8gVGhlIHdvcmthcm91bmQgaGFzIHRvIGRvIGFkZGl0aW9uYWwgY2hlY2tzIGFmdGVyIGEgZ2V0RWxlbWVudEJ5SWQKKwkvLyBXaGljaCBzbG93cyB0aGluZ3MgZG93biBmb3Igb3RoZXIgYnJvd3NlcnMgKGhlbmNlIHRoZSBicmFuY2hpbmcpCisJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKKwkJRXhwci5maW5kLklEID0gZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApIHsKKwkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKKwkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOworCisJCQkJcmV0dXJuIG0gPworCQkJCQltLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/CisJCQkJCQlbbV0gOgorCQkJCQkJdW5kZWZpbmVkIDoKKwkJCQkJW107CisJCQl9CisJCX07CisKKwkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CisJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKKworCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7CisJCX07CisJfQorCisJcm9vdC5yZW1vdmVDaGlsZCggZm9ybSApOworCisJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwlyb290ID0gZm9ybSA9IG51bGw7Cit9KSgpOworCisoZnVuY3Rpb24oKXsKKwkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzCisJLy8gd2hlbiBkb2luZyBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpCisKKwkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQKKwl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOworCisJLy8gTWFrZSBzdXJlIG5vIGNvbW1lbnRzIGFyZSBmb3VuZAorCWlmICggZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoID4gMCApIHsKKwkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKKwkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggbWF0Y2hbMV0gKTsKKworCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cworCQkJaWYgKCBtYXRjaFsxXSA9PT0gIioiICkgeworCQkJCXZhciB0bXAgPSBbXTsKKworCQkJCWZvciAoIHZhciBpID0gMDsgcmVzdWx0c1tpXTsgaSsrICkgeworCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmVzdWx0cyA9IHRtcDsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdHM7CisJCX07CisJfQorCisJLy8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBhdHRyaWJ1dGVzCisJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKKworCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYKKwkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CisKKwkJRXhwci5hdHRySGFuZGxlLmhyZWYgPSBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiLCAyICk7CisJCX07CisJfQorCisJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwlkaXYgPSBudWxsOworfSkoKTsKKworaWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgeworCShmdW5jdGlvbigpeworCQl2YXIgb2xkU2l6emxlID0gU2l6emxlLAorCQkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCisJCQlpZCA9ICJfX3NpenpsZV9fIjsKKworCQlkaXYuaW5uZXJIVE1MID0gIjxwIGNsYXNzPSdURVNUJz48L3A+IjsKKworCQkvLyBTYWZhcmkgY2FuJ3QgaGFuZGxlIHVwcGVyY2FzZSBvciB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbgorCQkvLyBpbiBxdWlya3MgbW9kZS4KKwkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CisJCQlyZXR1cm47CisJCX0KKwkKKwkJU2l6emxlID0gZnVuY3Rpb24oIHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCApIHsKKwkJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OworCisJCQkvLyBNYWtlIHN1cmUgdGhhdCBhdHRyaWJ1dGUgc2VsZWN0b3JzIGFyZSBxdW90ZWQKKwkJCXF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywgIj0nJDEnXSIpOworCisJCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzCisJCQkvLyAoSUQgc2VsZWN0b3JzIGRvbid0IHdvcmsgaW4gbm9uLUhUTUwgZG9jdW1lbnRzKQorCQkJaWYgKCAhc2VlZCAmJiAhU2l6emxlLmlzWE1MKGNvbnRleHQpICkgeworCQkJCWlmICggY29udGV4dC5ub2RlVHlwZSA9PT0gOSApIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChxdWVyeSksIGV4dHJhICk7CisJCQkJCX0gY2F0Y2gocXNhRXJyb3IpIHt9CisKKwkJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJpZXMKKwkJCQkvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290CisJCQkJLy8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpCisJCQkJLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCisJCQkJfSBlbHNlIGlmICggY29udGV4dC5ub2RlVHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJvYmplY3QiICkgeworCQkJCQl2YXIgb2xkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSwKKwkJCQkJCW5pZCA9IG9sZCB8fCBpZDsKKworCQkJCQlpZiAoICFvbGQgKSB7CisJCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgbmlkICk7CisJCQkJCX0KKworCQkJCQl0cnkgeworCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCAiIyIgKyBuaWQgKyAiICIgKyBxdWVyeSApLCBleHRyYSApOworCisJCQkJCX0gY2F0Y2gocHNldWRvRXJyb3IpIHsKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCWlmICggIW9sZCApIHsKKwkJCQkJCQljb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggImlkIiApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkKKwkJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKKwkJfTsKKworCQlmb3IgKCB2YXIgcHJvcCBpbiBvbGRTaXp6bGUgKSB7CisJCQlTaXp6bGVbIHByb3AgXSA9IG9sZFNpenpsZVsgcHJvcCBdOworCQl9CisKKwkJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwkJZGl2ID0gbnVsbDsKKwl9KSgpOworfQorCisoZnVuY3Rpb24oKXsKKwl2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKKwkJbWF0Y2hlcyA9IGh0bWwubWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubXNNYXRjaGVzU2VsZWN0b3IsCisJCXBzZXVkb1dvcmtzID0gZmFsc2U7CisKKwl0cnkgeworCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCisJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKKwkJbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJbdGVzdCE9JyddOnNpenpsZSIgKTsKKwkKKwl9IGNhdGNoKCBwc2V1ZG9FcnJvciApIHsKKwkJcHNldWRvV29ya3MgPSB0cnVlOworCX0KKworCWlmICggbWF0Y2hlcyApIHsKKwkJU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBub2RlLCBleHByICkgeworCQkJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCisJCQlleHByID0gZXhwci5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCAiPSckMSddIik7CisKKwkJCWlmICggIVNpenpsZS5pc1hNTCggbm9kZSApICkgeworCQkJCXRyeSB7IAorCQkJCQlpZiAoIHBzZXVkb1dvcmtzIHx8ICFFeHByLm1hdGNoLlBTRVVETy50ZXN0KCBleHByICkgJiYgIS8hPS8udGVzdCggZXhwciApICkgeworCQkJCQkJcmV0dXJuIG1hdGNoZXMuY2FsbCggbm9kZSwgZXhwciApOworCQkJCQl9CisJCQkJfSBjYXRjaChlKSB7fQorCQkJfQorCisJCQlyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIFtub2RlXSkubGVuZ3RoID4gMDsKKwkJfTsKKwl9Cit9KSgpOworCisoZnVuY3Rpb24oKXsKKwl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisKKwlkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjsKKworCS8vIE9wZXJhIGNhbid0IGZpbmQgYSBzZWNvbmQgY2xhc3NuYW1lIChpbiA5LjYpCisJLy8gQWxzbywgbWFrZSBzdXJlIHRoYXQgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSBhY3R1YWxseSBleGlzdHMKKwlpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApIHsKKwkJcmV0dXJuOworCX0KKworCS8vIFNhZmFyaSBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcywgZG9lc24ndCBjYXRjaCBjaGFuZ2VzIChpbiAzLjIpCisJZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7CisKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAxICkgeworCQlyZXR1cm47CisJfQorCQorCUV4cHIub3JkZXIuc3BsaWNlKDEsIDAsICJDTEFTUyIpOworCUV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKSB7CisJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgeworCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShtYXRjaFsxXSk7CisJCX0KKwl9OworCisJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwlkaXYgPSBudWxsOworfSkoKTsKKworZnVuY3Rpb24gZGlyTm9kZUNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkgeworCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKKworCQlpZiAoIGVsZW0gKSB7CisJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKKworCQkJZWxlbSA9IGVsZW1bZGlyXTsKKworCQkJd2hpbGUgKCBlbGVtICkgeworCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWlzWE1MICl7CisJCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKKwkJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJCX0KKworCQkJCWlmICggZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBjdXIgKSB7CisJCQkJCW1hdGNoID0gZWxlbTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZWxlbSA9IGVsZW1bZGlyXTsKKwkJCX0KKworCQkJY2hlY2tTZXRbaV0gPSBtYXRjaDsKKwkJfQorCX0KK30KKworZnVuY3Rpb24gZGlyQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7CisJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOworCisJCWlmICggZWxlbSApIHsKKwkJCXZhciBtYXRjaCA9IGZhbHNlOworCQkJCisJCQllbGVtID0gZWxlbVtkaXJdOworCisJCQl3aGlsZSAoIGVsZW0gKSB7CisJCQkJaWYgKCBlbGVtLnNpemNhY2hlID09PSBkb25lTmFtZSApIHsKKwkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJaWYgKCAhaXNYTUwgKSB7CisJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJCQllbGVtLnNpenNldCA9IGk7CisJCQkJCX0KKworCQkJCQlpZiAoIHR5cGVvZiBjdXIgIT09ICJzdHJpbmciICkgeworCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7CisJCQkJCQkJbWF0Y2ggPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCX0gZWxzZSBpZiAoIFNpenpsZS5maWx0ZXIoIGN1ciwgW2VsZW1dICkubGVuZ3RoID4gMCApIHsKKwkJCQkJCW1hdGNoID0gZWxlbTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJZWxlbSA9IGVsZW1bZGlyXTsKKwkJCX0KKworCQkJY2hlY2tTZXRbaV0gPSBtYXRjaDsKKwkJfQorCX0KK30KKworaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMgKSB7CisJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGEsIGIgKSB7CisJCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOworCX07CisKK30gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsKKwlTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKKwkJcmV0dXJuICEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiAxNik7CisJfTsKKworfSBlbHNlIHsKKwlTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX07Cit9CisKK1NpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkgeworCS8vIGRvY3VtZW50RWxlbWVudCBpcyB2ZXJpZmllZCBmb3IgY2FzZXMgd2hlcmUgaXQgZG9lc24ndCB5ZXQgZXhpc3QKKwkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykgCisJdmFyIGRvY3VtZW50RWxlbWVudCA9IChlbGVtID8gZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gOiAwKS5kb2N1bWVudEVsZW1lbnQ7CisKKwlyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsKK307CisKK3ZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCXZhciBtYXRjaCwKKwkJdG1wU2V0ID0gW10sCisJCWxhdGVyID0gIiIsCisJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKKworCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgorCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCisJd2hpbGUgKCAobWF0Y2ggPSBFeHByLm1hdGNoLlBTRVVETy5leGVjKCBzZWxlY3RvciApKSApIHsKKwkJbGF0ZXIgKz0gbWF0Y2hbMF07CisJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7CisJfQorCisJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CisKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7CisJfQorCisJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKK307CisKKy8vIEVYUE9TRQoralF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CitqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIuZmlsdGVyczsKK2pRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDsKK2pRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CitqUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CitqUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7CisKKworfSkoKTsKKworCit2YXIgcnVudGlsID0gL1VudGlsJC8sCisJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sCisJLy8gTm90ZTogVGhpcyBSZWdFeHAgc2hvdWxkIGJlIGltcHJvdmVkLCBvciBsaWtlbHkgcHVsbGVkIGZyb20gU2l6emxlCisJcm11bHRpc2VsZWN0b3IgPSAvLC8sCisJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAorCXNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAorCVBPUyA9IGpRdWVyeS5leHByLm1hdGNoLlBPUzsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcmV0ID0gdGhpcy5wdXNoU3RhY2soICIiLCAiZmluZCIsIHNlbGVjdG9yICksCisJCQlsZW5ndGggPSAwOworCisJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJbGVuZ3RoID0gcmV0Lmxlbmd0aDsKKwkJCWpRdWVyeS5maW5kKCBzZWxlY3RvciwgdGhpc1tpXSwgcmV0ICk7CisKKwkJCWlmICggaSA+IDAgKSB7CisJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdHMgYXJlIHVuaXF1ZQorCQkJCWZvciAoIHZhciBuID0gbGVuZ3RoOyBuIDwgcmV0Lmxlbmd0aDsgbisrICkgeworCQkJCQlmb3IgKCB2YXIgciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHsKKwkJCQkJCWlmICggcmV0W3JdID09PSByZXRbbl0gKSB7CisJCQkJCQkJcmV0LnNwbGljZShuLS0sIDEpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJaGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkgeworCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0ICk7CisJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfSwKKworCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciwgZmFsc2UpLCAibm90Iiwgc2VsZWN0b3IpOworCX0sCisKKwlmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IsIHRydWUpLCAiZmlsdGVyIiwgc2VsZWN0b3IgKTsKKwl9LAorCQorCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiAhIXNlbGVjdG9yICYmIGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMDsKKwl9LAorCisJY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHsKKwkJdmFyIHJldCA9IFtdLCBpLCBsLCBjdXIgPSB0aGlzWzBdOworCisJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9ycyApICkgeworCQkJdmFyIG1hdGNoLCBzZWxlY3RvciwKKwkJCQltYXRjaGVzID0ge30sCisJCQkJbGV2ZWwgPSAxOworCisJCQlpZiAoIGN1ciAmJiBzZWxlY3RvcnMubGVuZ3RoICkgeworCQkJCWZvciAoIGkgPSAwLCBsID0gc2VsZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07CisKKwkJCQkJaWYgKCAhbWF0Y2hlc1tzZWxlY3Rvcl0gKSB7CisJCQkJCQltYXRjaGVzW3NlbGVjdG9yXSA9IGpRdWVyeS5leHByLm1hdGNoLlBPUy50ZXN0KCBzZWxlY3RvciApID8gCisJCQkJCQkJalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6CisJCQkJCQkJc2VsZWN0b3I7CisJCQkJCX0KKwkJCQl9CisKKwkJCQl3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCAmJiBjdXIgIT09IGNvbnRleHQgKSB7CisJCQkJCWZvciAoIHNlbGVjdG9yIGluIG1hdGNoZXMgKSB7CisJCQkJCQltYXRjaCA9IG1hdGNoZXNbc2VsZWN0b3JdOworCisJCQkJCQlpZiAoIG1hdGNoLmpxdWVyeSA/IG1hdGNoLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeShjdXIpLmlzKG1hdGNoKSApIHsKKwkJCQkJCQlyZXQucHVzaCh7IHNlbGVjdG9yOiBzZWxlY3RvciwgZWxlbTogY3VyLCBsZXZlbDogbGV2ZWwgfSk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKKwkJCQkJbGV2ZWwrKzsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQl2YXIgcG9zID0gUE9TLnRlc3QoIHNlbGVjdG9ycyApID8gCisJCQlqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6IG51bGw7CisKKwkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCWN1ciA9IHRoaXNbaV07CisKKwkJCXdoaWxlICggY3VyICkgeworCQkJCWlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykgKSB7CisJCQkJCXJldC5wdXNoKCBjdXIgKTsKKwkJCQkJYnJlYWs7CisKKwkJCQl9IGVsc2UgeworCQkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKKwkJCQkJaWYgKCAhY3VyIHx8ICFjdXIub3duZXJEb2N1bWVudCB8fCBjdXIgPT09IGNvbnRleHQgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldCA9IHJldC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZShyZXQpIDogcmV0OworCQkKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsICJjbG9zZXN0Iiwgc2VsZWN0b3JzICk7CisJfSwKKwkKKwkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCisJLy8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzCisJaW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlpZiAoICFlbGVtIHx8IHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKKwkJCXJldHVybiBqUXVlcnkuaW5BcnJheSggdGhpc1swXSwKKwkJCQkvLyBJZiBpdCByZWNlaXZlcyBhIHN0cmluZywgdGhlIHNlbGVjdG9yIGlzIHVzZWQKKwkJCQkvLyBJZiBpdCByZWNlaXZlcyBub3RoaW5nLCB0aGUgc2libGluZ3MgYXJlIHVzZWQKKwkJCQllbGVtID8galF1ZXJ5KCBlbGVtICkgOiB0aGlzLnBhcmVudCgpLmNoaWxkcmVuKCkgKTsKKwkJfQorCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KAorCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCisJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7CisJfSwKKworCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCQl2YXIgc2V0ID0gdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiA/CisJCQkJalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6CisJCQkJalF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IgKSwKKwkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CisKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBpc0Rpc2Nvbm5lY3RlZCggc2V0WzBdICkgfHwgaXNEaXNjb25uZWN0ZWQoIGFsbFswXSApID8KKwkJCWFsbCA6CisJCQlqUXVlcnkudW5pcXVlKCBhbGwgKSApOworCX0sCisKKwlhbmRTZWxmOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuYWRkKCB0aGlzLnByZXZPYmplY3QgKTsKKwl9Cit9KTsKKworLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZAorLy8gZnJvbSBhIGRvY3VtZW50IChzaG91bGQgYmUgaW1wcm92ZWQsIHdoZXJlIGZlYXNpYmxlKS4KK2Z1bmN0aW9uIGlzRGlzY29ubmVjdGVkKCBub2RlICkgeworCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7Cit9CisKK2pRdWVyeS5lYWNoKHsKKwlwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOworCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOworCX0sCisJcGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIgKTsKKwl9LAorCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOworCX0sCisJbmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkubnRoKCBlbGVtLCAyLCAibmV4dFNpYmxpbmciICk7CisJfSwKKwlwcmV2OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5udGgoIGVsZW0sIDIsICJwcmV2aW91c1NpYmxpbmciICk7CisJfSwKKwluZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKKwl9LAorCXByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKKwl9LAorCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiwgdW50aWwgKTsKKwl9LAorCXByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7CisJfSwKKwlzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsIGVsZW0gKTsKKwl9LAorCWNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKKwl9LAorCWNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/CisJCQllbGVtLmNvbnRlbnREb2N1bWVudCB8fCBlbGVtLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQgOgorCQkJalF1ZXJ5Lm1ha2VBcnJheSggZWxlbS5jaGlsZE5vZGVzICk7CisJfQorfSwgZnVuY3Rpb24oIG5hbWUsIGZuICkgeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKKwkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOworCQkKKwkJaWYgKCAhcnVudGlsLnRlc3QoIG5hbWUgKSApIHsKKwkJCXNlbGVjdG9yID0gdW50aWw7CisJCX0KKworCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CisJCQlyZXQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgcmV0ICk7CisJCX0KKworCQlyZXQgPSB0aGlzLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDsKKworCQlpZiAoICh0aGlzLmxlbmd0aCA+IDEgfHwgcm11bHRpc2VsZWN0b3IudGVzdCggc2VsZWN0b3IgKSkgJiYgcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKKwkJCXJldCA9IHJldC5yZXZlcnNlKCk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOworCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisJZmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKKwkJaWYgKCBub3QgKSB7CisJCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7CisJCX0KKworCQlyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxID8KKwkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6CisJCQlqUXVlcnkuZmluZC5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKKwl9LAorCQorCWRpcjogZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7CisJCXZhciBtYXRjaGVkID0gW10sCisJCQljdXIgPSBlbGVtWyBkaXIgXTsKKworCQl3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHsKKwkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICkgeworCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CisJCQl9CisJCQljdXIgPSBjdXJbZGlyXTsKKwkJfQorCQlyZXR1cm4gbWF0Y2hlZDsKKwl9LAorCisJbnRoOiBmdW5jdGlvbiggY3VyLCByZXN1bHQsIGRpciwgZWxlbSApIHsKKwkJcmVzdWx0ID0gcmVzdWx0IHx8IDE7CisJCXZhciBudW0gPSAwOworCisJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXJbZGlyXSApIHsKKwkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICsrbnVtID09PSByZXN1bHQgKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyZXR1cm4gY3VyOworCX0sCisKKwlzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHsKKwkJdmFyIHIgPSBbXTsKKworCQlmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgeworCQkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CisJCQkJci5wdXNoKCBuICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcjsKKwl9Cit9KTsKKworLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3QKK2Z1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCApIHsKKwlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCXZhciByZXRWYWwgPSAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisJCQlyZXR1cm4gcmV0VmFsID09PSBrZWVwOworCQl9KTsKKworCX0gZWxzZSBpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHsKKwkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCXJldHVybiAoZWxlbSA9PT0gcXVhbGlmaWVyKSA9PT0ga2VlcDsKKwkJfSk7CisKKwl9IGVsc2UgaWYgKCB0eXBlb2YgcXVhbGlmaWVyID09PSAic3RyaW5nIiApIHsKKwkJdmFyIGZpbHRlcmVkID0galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CisJCX0pOworCisJCWlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CisJCQlyZXR1cm4galF1ZXJ5LmZpbHRlcihxdWFsaWZpZXIsIGZpbHRlcmVkLCAha2VlcCk7CisJCX0gZWxzZSB7CisJCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7CisJCX0KKwl9CisKKwlyZXR1cm4galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQlyZXR1cm4gKGpRdWVyeS5pbkFycmF5KCBlbGVtLCBxdWFsaWZpZXIgKSA+PSAwKSA9PT0ga2VlcDsKKwl9KTsKK30KKworCisKKwordmFyIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLAorCXJsZWFkaW5nV2hpdGVzcGFjZSA9IC9eXHMrLywKKwlyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLAorCXJ0YWdOYW1lID0gLzwoW1x3Ol0rKS8sCisJcnRib2R5ID0gLzx0Ym9keS9pLAorCXJodG1sID0gLzx8JiM/XHcrOy8sCisJcm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLAorCS8vIGNoZWNrZWQ9ImNoZWNrZWQiIG9yIGNoZWNrZWQgKGh0bWw1KQorCXJjaGVja2VkID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksCisJcmFjdGlvbiA9IC9cPShbXj0iJz5cc10rXC8pPi9nLAorCXdyYXBNYXAgPSB7CisJCW9wdGlvbjogWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iIF0sCisJCWxlZ2VuZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKKwkJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCisJCXRyOiBbIDIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBdLAorCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKKwkJY29sOiBbIDIsICI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAorCQlhcmVhOiBbIDEsICI8bWFwPiIsICI8L21hcD4iIF0sCisJCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCisJfTsKKword3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOword3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDsKK3dyYXBNYXAudGggPSB3cmFwTWFwLnRkOworCisvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CitpZiAoICFqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXplICkgeworCXdyYXBNYXAuX2RlZmF1bHQgPSBbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF07Cit9CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXRleHQ6IGZ1bmN0aW9uKCB0ZXh0ICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKHRleHQpICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CisJCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKKworCQkJCXNlbGYudGV4dCggdGV4dC5jYWxsKHRoaXMsIGksIHNlbGYudGV4dCgpKSApOworCQkJfSk7CisJCX0KKworCQlpZiAoIHR5cGVvZiB0ZXh0ICE9PSAib2JqZWN0IiAmJiB0ZXh0ICE9PSB1bmRlZmluZWQgKSB7CisJCQlyZXR1cm4gdGhpcy5lbXB0eSgpLmFwcGVuZCggKHRoaXNbMF0gJiYgdGhpc1swXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZSggdGV4dCApICk7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LnRleHQoIHRoaXMgKTsKKwl9LAorCisJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCWpRdWVyeSh0aGlzKS53cmFwQWxsKCBodG1sLmNhbGwodGhpcywgaSkgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCB0aGlzWzBdICkgeworCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKKwkJCXZhciB3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQgKS5lcSgwKS5jbG9uZSh0cnVlKTsKKworCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CisJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTsKKwkJCX0KKworCQkJd3JhcC5tYXAoZnVuY3Rpb24oKSB7CisJCQkJdmFyIGVsZW0gPSB0aGlzOworCisJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgJiYgZWxlbS5maXJzdENoaWxkLm5vZGVUeXBlID09PSAxICkgeworCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOworCQkJCX0KKworCQkJCXJldHVybiBlbGVtOworCQkJfSkuYXBwZW5kKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7CisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCWpRdWVyeSh0aGlzKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApOworCQkJfSk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSwKKwkJCQljb250ZW50cyA9IHNlbGYuY29udGVudHMoKTsKKworCQkJaWYgKCBjb250ZW50cy5sZW5ndGggKSB7CisJCQkJY29udGVudHMud3JhcEFsbCggaHRtbCApOworCisJCQl9IGVsc2UgeworCQkJCXNlbGYuYXBwZW5kKCBodG1sICk7CisJCQl9CisJCX0pOworCX0sCisKKwl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKKwkJfSk7CisJfSwKKworCXVud3JhcDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKSB7CisJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgeworCQkJCWpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsKKwkJCX0KKwkJfSkuZW5kKCk7CisJfSwKKworCWFwcGVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOworCQkJfQorCQl9KTsKKwl9LAorCisJcHJlcGVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJdGhpcy5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMuZmlyc3RDaGlsZCApOworCQkJfQorCQl9KTsKKwl9LAorCisJYmVmb3JlOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKKwkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKKwkJCX0pOworCQl9IGVsc2UgaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgeworCQkJdmFyIHNldCA9IGpRdWVyeShhcmd1bWVudHNbMF0pOworCQkJc2V0LnB1c2guYXBwbHkoIHNldCwgdGhpcy50b0FycmF5KCkgKTsKKwkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggc2V0LCAiYmVmb3JlIiwgYXJndW1lbnRzICk7CisJCX0KKwl9LAorCisJYWZ0ZXI6IGZ1bmN0aW9uKCkgeworCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgeworCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApOworCQkJfSk7CisJCX0gZWxzZSBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CisJCQl2YXIgc2V0ID0gdGhpcy5wdXNoU3RhY2soIHRoaXMsICJhZnRlciIsIGFyZ3VtZW50cyApOworCQkJc2V0LnB1c2guYXBwbHkoIHNldCwgalF1ZXJ5KGFyZ3VtZW50c1swXSkudG9BcnJheSgpICk7CisJCQlyZXR1cm4gc2V0OworCQl9CisJfSwKKwkKKwkvLyBrZWVwRGF0YSBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHktLWRvIG5vdCBkb2N1bWVudAorCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKKwkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCWlmICggIXNlbGVjdG9yIHx8IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBbIGVsZW0gXSApLmxlbmd0aCApIHsKKwkJCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKKwkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggWyBlbGVtIF0gKTsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKKwkJCQkJIGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWVtcHR5OiBmdW5jdGlvbigpIHsKKwkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCS8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcworCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOworCQkJfQorCisJCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcworCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7CisJCQkJZWxlbS5yZW1vdmVDaGlsZCggZWxlbS5maXJzdENoaWxkICk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiB0aGlzOworCX0sCisKKwljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKKwkJLy8gRG8gdGhlIGNsb25lCisJCXZhciByZXQgPSB0aGlzLm1hcChmdW5jdGlvbigpIHsKKwkJCWlmICggIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCAmJiAhalF1ZXJ5LmlzWE1MRG9jKHRoaXMpICkgeworCQkJCS8vIElFIGNvcGllcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50IHdoZW4KKwkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlCisJCQkJLy8gY2xvbmUgd2lsbCBhbHNvIHJlbW92ZSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWduYWwKKwkJCQkvLyBJbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoaXMsIHdlIHVzZSBpbm5lckhUTUwuCisJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KKwkJCQkvLyBhdHRyaWJ1dGVzIGluIElFIHRoYXQgYXJlIGFjdHVhbGx5IG9ubHkgc3RvcmVkCisJCQkJLy8gYXMgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBjb3BpZWQgKHN1Y2ggYXMgdGhlCisJCQkJLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0KS4KKwkJCQl2YXIgaHRtbCA9IHRoaXMub3V0ZXJIVE1MLAorCQkJCQlvd25lckRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50OworCisJCQkJaWYgKCAhaHRtbCApIHsKKwkJCQkJdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQkJCWRpdi5hcHBlbmRDaGlsZCggdGhpcy5jbG9uZU5vZGUodHJ1ZSkgKTsKKwkJCQkJaHRtbCA9IGRpdi5pbm5lckhUTUw7CisJCQkJfQorCisJCQkJcmV0dXJuIGpRdWVyeS5jbGVhbihbaHRtbC5yZXBsYWNlKHJpbmxpbmVqUXVlcnksICIiKQorCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2UgaW4gSUUgOCB3aGVyZSBhY3Rpb249L3Rlc3QvPiBzZWxmLWNsb3NlcyBhIHRhZworCQkJCQkucmVwbGFjZShyYWN0aW9uLCAnPSIkMSI+JykKKwkJCQkJLnJlcGxhY2UocmxlYWRpbmdXaGl0ZXNwYWNlLCAiIildLCBvd25lckRvY3VtZW50KVswXTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpOworCQkJfQorCQl9KTsKKworCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCisJCWlmICggZXZlbnRzID09PSB0cnVlICkgeworCQkJY2xvbmVDb3B5RXZlbnQoIHRoaXMsIHJldCApOworCQkJY2xvbmVDb3B5RXZlbnQoIHRoaXMuZmluZCgiKiIpLCByZXQuZmluZCgiKiIpICk7CisJCX0KKworCQkvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CisJCQlyZXR1cm4gdGhpc1swXSAmJiB0aGlzWzBdLm5vZGVUeXBlID09PSAxID8KKwkJCQl0aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKHJpbmxpbmVqUXVlcnksICIiKSA6CisJCQkJbnVsbDsKKworCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCisJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub2NhY2hlLnRlc3QoIHZhbHVlICkgJiYKKwkJCShqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSB8fCAhcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIHZhbHVlICkpICYmCisJCQkhd3JhcE1hcFsgKHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyIiLCAiIl0pWzFdLnRvTG93ZXJDYXNlKCkgXSApIHsKKworCQkJdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJ4aHRtbFRhZywgIjwkMT48LyQyPiIpOworCisJCQl0cnkgeworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKKwkJCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggdGhpc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpICk7CisJCQkJCQl0aGlzW2ldLmlubmVySFRNTCA9IHZhbHVlOworCQkJCQl9CisJCQkJfQorCisJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKKwkJCX0gY2F0Y2goZSkgeworCQkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CisJCQl9CisKKwkJfSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisJCQl0aGlzLmVhY2goZnVuY3Rpb24oaSl7CisJCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKKworCQkJCXNlbGYuaHRtbCggdmFsdWUuY2FsbCh0aGlzLCBpLCBzZWxmLmh0bWwoKSkgKTsKKwkJCX0pOworCisJCX0gZWxzZSB7CisJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCWlmICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CisJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZWxlbWVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGJlZm9yZSB0aGV5IGFyZSBpbnNlcnRlZAorCQkJLy8gdGhpcyBjYW4gaGVscCBmaXggcmVwbGFjaW5nIGEgcGFyZW50IHdpdGggY2hpbGQgZWxlbWVudHMKKwkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CisJCQkJCXZhciBzZWxmID0galF1ZXJ5KHRoaXMpLCBvbGQgPSBzZWxmLmh0bWwoKTsKKwkJCQkJc2VsZi5yZXBsYWNlV2l0aCggdmFsdWUuY2FsbCggdGhpcywgaSwgb2xkICkgKTsKKwkJCQl9KTsKKwkJCX0KKworCQkJaWYgKCB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgeworCQkJCXZhbHVlID0galF1ZXJ5KCB2YWx1ZSApLmRldGFjaCgpOworCQkJfQorCisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCXZhciBuZXh0ID0gdGhpcy5uZXh0U2libGluZywKKwkJCQkJcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOworCisJCQkJalF1ZXJ5KCB0aGlzICkucmVtb3ZlKCk7CisKKwkJCQlpZiAoIG5leHQgKSB7CisJCQkJCWpRdWVyeShuZXh0KS5iZWZvcmUoIHZhbHVlICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJalF1ZXJ5KHBhcmVudCkuYXBwZW5kKCB2YWx1ZSApOworCQkJCX0KKwkJCX0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoalF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUoKSA6IHZhbHVlKSwgInJlcGxhY2VXaXRoIiwgdmFsdWUgKTsKKwkJfQorCX0sCisKKwlkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuIHRoaXMucmVtb3ZlKCBzZWxlY3RvciwgdHJ1ZSApOworCX0sCisKKwlkb21NYW5pcDogZnVuY3Rpb24oIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApIHsKKwkJdmFyIHJlc3VsdHMsIGZpcnN0LCBmcmFnbWVudCwgcGFyZW50LAorCQkJdmFsdWUgPSBhcmdzWzBdLAorCQkJc2NyaXB0cyA9IFtdOworCisJCS8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdAorCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQlqUXVlcnkodGhpcykuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjaywgdHJ1ZSApOworCQkJfSk7CisJCX0KKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworCQkJCXZhciBzZWxmID0galF1ZXJ5KHRoaXMpOworCQkJCWFyZ3NbMF0gPSB2YWx1ZS5jYWxsKHRoaXMsIGksIHRhYmxlID8gc2VsZi5odG1sKCkgOiB1bmRlZmluZWQpOworCQkJCXNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApOworCQkJfSk7CisJCX0KKworCQlpZiAoIHRoaXNbMF0gKSB7CisJCQlwYXJlbnQgPSB2YWx1ZSAmJiB2YWx1ZS5wYXJlbnROb2RlOworCisJCQkvLyBJZiB3ZSdyZSBpbiBhIGZyYWdtZW50LCBqdXN0IHVzZSB0aGF0IGluc3RlYWQgb2YgYnVpbGRpbmcgYSBuZXcgb25lCisJCQlpZiAoIGpRdWVyeS5zdXBwb3J0LnBhcmVudE5vZGUgJiYgcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSB0aGlzLmxlbmd0aCApIHsKKwkJCQlyZXN1bHRzID0geyBmcmFnbWVudDogcGFyZW50IH07CisKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0cyA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzLCBzY3JpcHRzICk7CisJCQl9CisJCQkKKwkJCWZyYWdtZW50ID0gcmVzdWx0cy5mcmFnbWVudDsKKwkJCQorCQkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKKwkJCQlmaXJzdCA9IGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKKwkJCX0gZWxzZSB7CisJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOworCQkJfQorCisJCQlpZiAoIGZpcnN0ICkgeworCQkJCXRhYmxlID0gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBmaXJzdCwgInRyIiApOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCWNhbGxiYWNrLmNhbGwoCisJCQkJCQl0YWJsZSA/CisJCQkJCQkJcm9vdCh0aGlzW2ldLCBmaXJzdCkgOgorCQkJCQkJCXRoaXNbaV0sCisJCQkJCQlpID4gMCB8fCByZXN1bHRzLmNhY2hlYWJsZSB8fCB0aGlzLmxlbmd0aCA+IDEgID8KKwkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOgorCQkJCQkJCWZyYWdtZW50CisJCQkJCSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIHNjcmlwdHMubGVuZ3RoICkgeworCQkJCWpRdWVyeS5lYWNoKCBzY3JpcHRzLCBldmFsU2NyaXB0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9Cit9KTsKKworZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgeworCXJldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwgInRhYmxlIikgPworCQkoZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSB8fAorCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgorCQllbGVtOworfQorCitmdW5jdGlvbiBjbG9uZUNvcHlFdmVudChvcmlnLCByZXQpIHsKKwl2YXIgaSA9IDA7CisKKwlyZXQuZWFjaChmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzLm5vZGVOYW1lICE9PSAob3JpZ1tpXSAmJiBvcmlnW2ldLm5vZGVOYW1lKSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXZhciBvbGREYXRhID0galF1ZXJ5LmRhdGEoIG9yaWdbaSsrXSApLAorCQkJY3VyRGF0YSA9IGpRdWVyeS5kYXRhKCB0aGlzLCBvbGREYXRhICksCisJCQlldmVudHMgPSBvbGREYXRhICYmIG9sZERhdGEuZXZlbnRzOworCisJCWlmICggZXZlbnRzICkgeworCQkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOworCQkJY3VyRGF0YS5ldmVudHMgPSB7fTsKKworCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgeworCQkJCWZvciAoIHZhciBoYW5kbGVyIGluIGV2ZW50c1sgdHlwZSBdICkgeworCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLmRhdGEgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9KTsKK30KKworalF1ZXJ5LmJ1aWxkRnJhZ21lbnQgPSBmdW5jdGlvbiggYXJncywgbm9kZXMsIHNjcmlwdHMgKSB7CisJdmFyIGZyYWdtZW50LCBjYWNoZWFibGUsIGNhY2hlcmVzdWx0cywKKwkJZG9jID0gKG5vZGVzICYmIG5vZGVzWzBdID8gbm9kZXNbMF0ub3duZXJEb2N1bWVudCB8fCBub2Rlc1swXSA6IGRvY3VtZW50KTsKKworCS8vIE9ubHkgY2FjaGUgInNtYWxsIiAoMS8yIEtCKSBzdHJpbmdzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiBkb2N1bWVudAorCS8vIENsb25pbmcgb3B0aW9ucyBsb3NlcyB0aGUgc2VsZWN0ZWQgc3RhdGUsIHNvIGRvbid0IGNhY2hlIHRoZW0KKwkvLyBJRSA2IGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHlvdSBwdXQgPG9iamVjdD4gb3IgPGVtYmVkPiBlbGVtZW50cyBpbiBhIGZyYWdtZW50CisJLy8gQWxzbywgV2ViS2l0IGRvZXMgbm90IGNsb25lICdjaGVja2VkJyBhdHRyaWJ1dGVzIG9uIGNsb25lTm9kZSwgc28gZG9uJ3QgY2FjaGUKKwlpZiAoIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAic3RyaW5nIiAmJiBhcmdzWzBdLmxlbmd0aCA8IDUxMiAmJiBkb2MgPT09IGRvY3VtZW50ICYmCisJCSFybm9jYWNoZS50ZXN0KCBhcmdzWzBdICkgJiYgKGpRdWVyeS5zdXBwb3J0LmNoZWNrQ2xvbmUgfHwgIXJjaGVja2VkLnRlc3QoIGFyZ3NbMF0gKSkgKSB7CisKKwkJY2FjaGVhYmxlID0gdHJ1ZTsKKwkJY2FjaGVyZXN1bHRzID0galF1ZXJ5LmZyYWdtZW50c1sgYXJnc1swXSBdOworCQlpZiAoIGNhY2hlcmVzdWx0cyApIHsKKwkJCWlmICggY2FjaGVyZXN1bHRzICE9PSAxICkgeworCQkJCWZyYWdtZW50ID0gY2FjaGVyZXN1bHRzOworCQkJfQorCQl9CisJfQorCisJaWYgKCAhZnJhZ21lbnQgKSB7CisJCWZyYWdtZW50ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKwkJalF1ZXJ5LmNsZWFuKCBhcmdzLCBkb2MsIGZyYWdtZW50LCBzY3JpcHRzICk7CisJfQorCisJaWYgKCBjYWNoZWFibGUgKSB7CisJCWpRdWVyeS5mcmFnbWVudHNbIGFyZ3NbMF0gXSA9IGNhY2hlcmVzdWx0cyA/IGZyYWdtZW50IDogMTsKKwl9CisKKwlyZXR1cm4geyBmcmFnbWVudDogZnJhZ21lbnQsIGNhY2hlYWJsZTogY2FjaGVhYmxlIH07Cit9OworCitqUXVlcnkuZnJhZ21lbnRzID0ge307CisKK2pRdWVyeS5lYWNoKHsKKwlhcHBlbmRUbzogImFwcGVuZCIsCisJcHJlcGVuZFRvOiAicHJlcGVuZCIsCisJaW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwKKwlpbnNlcnRBZnRlcjogImFmdGVyIiwKKwlyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCit9LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciByZXQgPSBbXSwKKwkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKKwkJCXBhcmVudCA9IHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXNbMF0ucGFyZW50Tm9kZTsKKwkJCisJCWlmICggcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGluc2VydC5sZW5ndGggPT09IDEgKSB7CisJCQlpbnNlcnRbIG9yaWdpbmFsIF0oIHRoaXNbMF0gKTsKKwkJCXJldHVybiB0aGlzOworCQkJCisJCX0gZWxzZSB7CisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5nZXQoKTsKKwkJCQlqUXVlcnkoIGluc2VydFtpXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOworCQkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CisJCQl9CisJCQorCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIGluc2VydC5zZWxlY3RvciApOworCQl9CisJfTsKK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKwljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCwgc2NyaXB0cyApIHsKKwkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JworCQlpZiAoIHR5cGVvZiBjb250ZXh0LmNyZWF0ZUVsZW1lbnQgPT09ICJ1bmRlZmluZWQiICkgeworCQkJY29udGV4dCA9IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0WzBdICYmIGNvbnRleHRbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsKKwkJfQorCisJCXZhciByZXQgPSBbXTsKKworCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCWlmICggdHlwZW9mIGVsZW0gPT09ICJudW1iZXIiICkgeworCQkJCWVsZW0gKz0gIiI7CisJCQl9CisKKwkJCWlmICggIWVsZW0gKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIENvbnZlcnQgaHRtbCBzdHJpbmcgaW50byBET00gbm9kZXMKKwkJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICYmICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7CisJCQkJZWxlbSA9IGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKTsKKworCQkJfSBlbHNlIGlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgeworCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCisJCQkJZWxlbSA9IGVsZW0ucmVwbGFjZShyeGh0bWxUYWcsICI8JDE+PC8kMj4iKTsKKworCQkJCS8vIFRyaW0gd2hpdGVzcGFjZSwgb3RoZXJ3aXNlIGluZGV4T2Ygd29uJ3Qgd29yayBhcyBleHBlY3RlZAorCQkJCXZhciB0YWcgPSAocnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpLAorCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdCwKKwkJCQkJZGVwdGggPSB3cmFwWzBdLAorCQkJCQlkaXYgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCisJCQkJLy8gR28gdG8gaHRtbCBhbmQgYmFjaywgdGhlbiBwZWVsIG9mZiBleHRyYSB3cmFwcGVycworCQkJCWRpdi5pbm5lckhUTUwgPSB3cmFwWzFdICsgZWxlbSArIHdyYXBbMl07CisKKwkJCQkvLyBNb3ZlIHRvIHRoZSByaWdodCBkZXB0aAorCQkJCXdoaWxlICggZGVwdGgtLSApIHsKKwkJCQkJZGl2ID0gZGl2Lmxhc3RDaGlsZDsKKwkJCQl9CisKKwkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cworCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgeworCisJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KKwkJCQkJdmFyIGhhc0JvZHkgPSBydGJvZHkudGVzdChlbGVtKSwKKwkJCQkJCXRib2R5ID0gdGFnID09PSAidGFibGUiICYmICFoYXNCb2R5ID8KKwkJCQkJCQlkaXYuZmlyc3RDaGlsZCAmJiBkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzIDoKKworCQkJCQkJCS8vIFN0cmluZyB3YXMgYSBiYXJlIDx0aGVhZD4gb3IgPHRmb290PgorCQkJCQkJCXdyYXBbMV0gPT09ICI8dGFibGU+IiAmJiAhaGFzQm9keSA/CisJCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKKwkJCQkJCQkJW107CisKKwkJCQkJZm9yICggdmFyIGogPSB0Ym9keS5sZW5ndGggLSAxOyBqID49IDAgOyAtLWogKSB7CisJCQkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGJvZHlbIGogXSwgInRib2R5IiApICYmICF0Ym9keVsgaiBdLmNoaWxkTm9kZXMubGVuZ3RoICkgeworCQkJCQkJCXRib2R5WyBqIF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGJvZHlbIGogXSApOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQl9CisKKwkJCQkvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkCisJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgJiYgcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIGVsZW0gKSApIHsKKwkJCQkJZGl2Lmluc2VydEJlZm9yZSggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggcmxlYWRpbmdXaGl0ZXNwYWNlLmV4ZWMoZWxlbSlbMF0gKSwgZGl2LmZpcnN0Q2hpbGQgKTsKKwkJCQl9CisKKwkJCQllbGVtID0gZGl2LmNoaWxkTm9kZXM7CisJCQl9CisKKwkJCWlmICggZWxlbS5ub2RlVHlwZSApIHsKKwkJCQlyZXQucHVzaCggZWxlbSApOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSBqUXVlcnkubWVyZ2UoIHJldCwgZWxlbSApOworCQkJfQorCQl9CisKKwkJaWYgKCBmcmFnbWVudCApIHsKKwkJCWZvciAoIGkgPSAwOyByZXRbaV07IGkrKyApIHsKKwkJCQlpZiAoIHNjcmlwdHMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCByZXRbaV0sICJzY3JpcHQiICkgJiYgKCFyZXRbaV0udHlwZSB8fCByZXRbaV0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAidGV4dC9qYXZhc2NyaXB0IikgKSB7CisJCQkJCXNjcmlwdHMucHVzaCggcmV0W2ldLnBhcmVudE5vZGUgPyByZXRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggcmV0W2ldICkgOiByZXRbaV0gKTsKKwkJCQkKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIHJldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoalF1ZXJ5Lm1ha2VBcnJheShyZXRbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSkgKTsKKwkJCQkJfQorCQkJCQlmcmFnbWVudC5hcHBlbmRDaGlsZCggcmV0W2ldICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCQorCWNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkgeworCQl2YXIgZGF0YSwgaWQsIGNhY2hlID0galF1ZXJ5LmNhY2hlLAorCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAorCQkJZGVsZXRlRXhwYW5kbyA9IGpRdWVyeS5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87CisJCQorCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCWlmICggZWxlbS5ub2RlTmFtZSAmJiBqUXVlcnkubm9EYXRhW2VsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0gKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlkID0gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKKwkJCQorCQkJaWYgKCBpZCApIHsKKwkJCQlkYXRhID0gY2FjaGVbIGlkIF07CisJCQkJCisJCQkJaWYgKCBkYXRhICYmIGRhdGEuZXZlbnRzICkgeworCQkJCQlmb3IgKCB2YXIgdHlwZSBpbiBkYXRhLmV2ZW50cyApIHsKKwkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgeworCQkJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTsKKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJaWYgKCBkZWxldGVFeHBhbmRvICkgeworCQkJCQlkZWxldGUgZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKKworCQkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgeworCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKKwkJCQl9CisJCQkJCisJCQkJZGVsZXRlIGNhY2hlWyBpZCBdOworCQkJfQorCQl9CisJfQorfSk7CisKK2Z1bmN0aW9uIGV2YWxTY3JpcHQoIGksIGVsZW0gKSB7CisJaWYgKCBlbGVtLnNyYyApIHsKKwkJalF1ZXJ5LmFqYXgoeworCQkJdXJsOiBlbGVtLnNyYywKKwkJCWFzeW5jOiBmYWxzZSwKKwkJCWRhdGFUeXBlOiAic2NyaXB0IgorCQl9KTsKKwl9IGVsc2UgeworCQlqUXVlcnkuZ2xvYmFsRXZhbCggZWxlbS50ZXh0IHx8IGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lckhUTUwgfHwgIiIgKTsKKwl9CisKKwlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKKwkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CisJfQorfQorCisKKworCit2YXIgcmFscGhhID0gL2FscGhhXChbXildKlwpL2ksCisJcm9wYWNpdHkgPSAvb3BhY2l0eT0oW14pXSopLywKKwlyZGFzaEFscGhhID0gLy0oW2Etel0pL2lnLAorCXJ1cHBlciA9IC8oW0EtWl0pL2csCisJcm51bXB4ID0gL14tP1xkKyg/OnB4KT8kL2ksCisJcm51bSA9IC9eLT9cZC8sCisKKwljc3NTaG93ID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKKwljc3NXaWR0aCA9IFsgIkxlZnQiLCAiUmlnaHQiIF0sCisJY3NzSGVpZ2h0ID0gWyAiVG9wIiwgIkJvdHRvbSIgXSwKKwljdXJDU1MsCisKKwlnZXRDb21wdXRlZFN0eWxlLAorCWN1cnJlbnRTdHlsZSwKKworCWZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7CisJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKKwl9OworCitqUXVlcnkuZm4uY3NzID0gZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgeworCS8vIFNldHRpbmcgJ3VuZGVmaW5lZCcgaXMgYSBuby1vcAorCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgbmFtZSwgdmFsdWUsIHRydWUsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKwkJcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPworCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDoKKwkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKKwl9KTsKK307CisKK2pRdWVyeS5leHRlbmQoeworCS8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdAorCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQorCWNzc0hvb2tzOiB7CisJCW9wYWNpdHk6IHsKKwkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworCQkJCWlmICggY29tcHV0ZWQgKSB7CisJCQkJCS8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5CisJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiwgIm9wYWNpdHkiICk7CisJCQkJCXJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0OworCisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIGVsZW0uc3R5bGUub3BhY2l0eTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJLy8gRXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAorCWNzc051bWJlcjogeworCQkiekluZGV4IjogdHJ1ZSwKKwkJImZvbnRXZWlnaHQiOiB0cnVlLAorCQkib3BhY2l0eSI6IHRydWUsCisJCSJ6b29tIjogdHJ1ZSwKKwkJImxpbmVIZWlnaHQiOiB0cnVlCisJfSwKKworCS8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmUKKwkvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlCisJY3NzUHJvcHM6IHsKKwkJLy8gbm9ybWFsaXplIGZsb2F0IGNzcyBwcm9wZXJ0eQorCQkiZmxvYXQiOiBqUXVlcnkuc3VwcG9ydC5jc3NGbG9hdCA/ICJjc3NGbG9hdCIgOiAic3R5bGVGbG9hdCIKKwl9LAorCisJLy8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGUKKwlzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKKwkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisJCWlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lCisJCXZhciByZXQsIG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLAorCQkJc3R5bGUgPSBlbGVtLnN0eWxlLCBob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKKworCQluYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8IG9yaWdOYW1lOworCisJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQorCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisJCQkvLyBNYWtlIHN1cmUgdGhhdCBOYU4gYW5kIG51bGwgdmFsdWVzIGFyZW4ndCBzZXQuIFNlZTogIzcxMTYKKwkJCWlmICggdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiAmJiBpc05hTiggdmFsdWUgKSB8fCB2YWx1ZSA9PSBudWxsICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCisJCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CisJCQkJdmFsdWUgKz0gInB4IjsKKwkJCX0KKworCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCisJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKKwkJCQkvLyBGaXhlcyBidWcgIzU1MDkKKwkJCQl0cnkgeworCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CisJCQkJfSBjYXRjaChlKSB7fQorCQkJfQorCisJCX0gZWxzZSB7CisJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKKwkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJLy8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3QKKwkJCXJldHVybiBzdHlsZVsgbmFtZSBdOworCQl9CisJfSwKKworCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhICkgeworCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKKwkJdmFyIHJldCwgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCisJCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKKworCQluYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8IG9yaWdOYW1lOworCisJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCisJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKKwkJCXJldHVybiByZXQ7CisKKwkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKKwkJfSBlbHNlIGlmICggY3VyQ1NTICkgeworCQkJcmV0dXJuIGN1ckNTUyggZWxlbSwgbmFtZSwgb3JpZ05hbWUgKTsKKwkJfQorCX0sCisKKwkvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zCisJc3dhcDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkgeworCQl2YXIgb2xkID0ge307CisKKwkJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCisJCWZvciAoIHZhciBuYW1lIGluIG9wdGlvbnMgKSB7CisJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKwkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKKwkJfQorCisJCWNhbGxiYWNrLmNhbGwoIGVsZW0gKTsKKworCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKKwkJZm9yICggbmFtZSBpbiBvcHRpb25zICkgeworCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07CisJCX0KKwl9LAorCisJY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgeworCQlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKKwl9Cit9KTsKKworLy8gREVQUkVDQVRFRCwgVXNlIGpRdWVyeS5jc3MoKSBpbnN0ZWFkCitqUXVlcnkuY3VyQ1NTID0galF1ZXJ5LmNzczsKKworalF1ZXJ5LmVhY2goWyJoZWlnaHQiLCAid2lkdGgiXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisJalF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7CisJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKKwkJCXZhciB2YWw7CisKKwkJCWlmICggY29tcHV0ZWQgKSB7CisJCQkJaWYgKCBlbGVtLm9mZnNldFdpZHRoICE9PSAwICkgeworCQkJCQl2YWwgPSBnZXRXSCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCWpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKKwkJCQkJCXZhbCA9IGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOworCQkJCQl9KTsKKwkJCQl9CisKKwkJCQlpZiAoIHZhbCA8PSAwICkgeworCQkJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIG5hbWUgKTsKKworCQkJCQlpZiAoIHZhbCA9PT0gIjBweCIgJiYgY3VycmVudFN0eWxlICkgeworCQkJCQkJdmFsID0gY3VycmVudFN0eWxlKCBlbGVtLCBuYW1lLCBuYW1lICk7CisJCQkJCX0KKworCQkJCQlpZiAoIHZhbCAhPSBudWxsICkgeworCQkJCQkJLy8gU2hvdWxkIHJldHVybiAiYXV0byIgaW5zdGVhZCBvZiAwLCB1c2UgMCBmb3IKKwkJCQkJCS8vIHRlbXBvcmFyeSBiYWNrd2FyZHMtY29tcGF0CisJCQkJCQlyZXR1cm4gdmFsID09PSAiIiB8fCB2YWwgPT09ICJhdXRvIiA/ICIwcHgiIDogdmFsOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkgeworCQkJCQl2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07CisKKwkJCQkJLy8gU2hvdWxkIHJldHVybiAiYXV0byIgaW5zdGVhZCBvZiAwLCB1c2UgMCBmb3IKKwkJCQkJLy8gdGVtcG9yYXJ5IGJhY2t3YXJkcy1jb21wYXQKKwkJCQkJcmV0dXJuIHZhbCA9PT0gIiIgfHwgdmFsID09PSAiYXV0byIgPyAiMHB4IiA6IHZhbDsKKwkJCQl9CisKKwkJCQlyZXR1cm4gdHlwZW9mIHZhbCA9PT0gInN0cmluZyIgPyB2YWwgOiB2YWwgKyAicHgiOworCQkJfQorCQl9LAorCisJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworCQkJaWYgKCBybnVtcHgudGVzdCggdmFsdWUgKSApIHsKKwkJCQkvLyBpZ25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgIzE1OTkKKwkJCQl2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpOworCisJCQkJaWYgKCB2YWx1ZSA+PSAwICkgeworCQkJCQlyZXR1cm4gdmFsdWUgKyAicHgiOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisJCX0KKwl9OworfSk7CisKK2lmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CisJalF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7CisJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworCQkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CisJCQlyZXR1cm4gcm9wYWNpdHkudGVzdCgoY29tcHV0ZWQgJiYgZWxlbS5jdXJyZW50U3R5bGUgPyBlbGVtLmN1cnJlbnRTdHlsZS5maWx0ZXIgOiBlbGVtLnN0eWxlLmZpbHRlcikgfHwgIiIpID8KKwkJCQkocGFyc2VGbG9hdChSZWdFeHAuJDEpIC8gMTAwKSArICIiIDoKKwkJCQljb21wdXRlZCA/ICIxIiA6ICIiOworCQl9LAorCisJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworCQkJdmFyIHN0eWxlID0gZWxlbS5zdHlsZTsKKworCQkJLy8gSUUgaGFzIHRyb3VibGUgd2l0aCBvcGFjaXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgbGF5b3V0CisJCQkvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCisJCQlzdHlsZS56b29tID0gMTsKKworCQkJLy8gU2V0IHRoZSBhbHBoYSBmaWx0ZXIgdG8gc2V0IHRoZSBvcGFjaXR5CisJCQl2YXIgb3BhY2l0eSA9IGpRdWVyeS5pc05hTih2YWx1ZSkgPworCQkJCSIiIDoKKwkJCQkiYWxwaGEob3BhY2l0eT0iICsgdmFsdWUgKiAxMDAgKyAiKSIsCisJCQkJZmlsdGVyID0gc3R5bGUuZmlsdGVyIHx8ICIiOworCisJCQlzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdChmaWx0ZXIpID8KKwkJCQlmaWx0ZXIucmVwbGFjZShyYWxwaGEsIG9wYWNpdHkpIDoKKwkJCQlzdHlsZS5maWx0ZXIgKyAnICcgKyBvcGFjaXR5OworCQl9CisJfTsKK30KKworaWYgKCBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlICkgeworCWdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgbmV3TmFtZSwgbmFtZSApIHsKKwkJdmFyIHJldCwgZGVmYXVsdFZpZXcsIGNvbXB1dGVkU3R5bGU7CisKKwkJbmFtZSA9IG5hbWUucmVwbGFjZSggcnVwcGVyLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CisKKwkJaWYgKCAhKGRlZmF1bHRWaWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSApIHsKKwkJCXJldHVybiB1bmRlZmluZWQ7CisJCX0KKworCQlpZiAoIChjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApKSApIHsKKwkJCXJldCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApOworCQkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGVsZW0gKSApIHsKKwkJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfTsKK30KKworaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlICkgeworCWN1cnJlbnRTdHlsZSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQl2YXIgbGVmdCwgcnNMZWZ0LAorCQkJcmV0ID0gZWxlbS5jdXJyZW50U3R5bGUgJiYgZWxlbS5jdXJyZW50U3R5bGVbIG5hbWUgXSwKKwkJCXN0eWxlID0gZWxlbS5zdHlsZTsKKworCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCisJCS8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTEKKworCQkvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXIKKwkJLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzCisJCWlmICggIXJudW1weC50ZXN0KCByZXQgKSAmJiBybnVtLnRlc3QoIHJldCApICkgeworCQkJLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcworCQkJbGVmdCA9IHN0eWxlLmxlZnQ7CisJCQlyc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0OworCisJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CisJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gZWxlbS5jdXJyZW50U3R5bGUubGVmdDsKKwkJCXN0eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUiID8gIjFlbSIgOiAocmV0IHx8IDApOworCQkJcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgInB4IjsKKworCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcworCQkJc3R5bGUubGVmdCA9IGxlZnQ7CisJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OworCQl9CisKKwkJcmV0dXJuIHJldCA9PT0gIiIgPyAiYXV0byIgOiByZXQ7CisJfTsKK30KKworY3VyQ1NTID0gZ2V0Q29tcHV0ZWRTdHlsZSB8fCBjdXJyZW50U3R5bGU7CisKK2Z1bmN0aW9uIGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApIHsKKwl2YXIgd2hpY2ggPSBuYW1lID09PSAid2lkdGgiID8gY3NzV2lkdGggOiBjc3NIZWlnaHQsCisJCXZhbCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQ7CisKKwlpZiAoIGV4dHJhID09PSAiYm9yZGVyIiApIHsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwlqUXVlcnkuZWFjaCggd2hpY2gsIGZ1bmN0aW9uKCkgeworCQlpZiAoICFleHRyYSApIHsKKwkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMgKSkgfHwgMDsKKwkJfQorCisJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgeworCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzICkpIHx8IDA7CisKKwkJfSBlbHNlIHsKKwkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIgKSkgfHwgMDsKKwkJfQorCX0pOworCisJcmV0dXJuIHZhbDsKK30KKworaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgeworCWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsCisJCQloZWlnaHQgPSBlbGVtLm9mZnNldEhlaWdodDsKKworCQlyZXR1cm4gKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkgfHwgKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKGVsZW0uc3R5bGUuZGlzcGxheSB8fCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7CisJfTsKKworCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7CisJfTsKK30KKworCisKKwordmFyIGpzYyA9IGpRdWVyeS5ub3coKSwKKwlyc2NyaXB0ID0gLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksCisJcnNlbGVjdFRleHRhcmVhID0gL14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksCisJcmlucHV0ID0gL14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLAorCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAorCXJicmFja2V0ID0gL1xbXF0kLywKKwlqc3JlID0gL1w9XD8oJnwkKS8sCisJcnF1ZXJ5ID0gL1w/LywKKwlydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCisJcnVybCA9IC9eKFx3KzopP1wvXC8oW15cLz8jXSspLywKKwlyMjAgPSAvJTIwL2csCisJcmhhc2ggPSAvIy4qJC8sCisKKwkvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9kCisJX2xvYWQgPSBqUXVlcnkuZm4ubG9hZDsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJbG9hZDogZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKKwkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKKwkJCXJldHVybiBfbG9hZC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisKKwkJLy8gRG9uJ3QgZG8gYSByZXF1ZXN0IGlmIG5vIGVsZW1lbnRzIGFyZSBiZWluZyByZXF1ZXN0ZWQKKwkJfSBlbHNlIGlmICggIXRoaXMubGVuZ3RoICkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQl2YXIgb2ZmID0gdXJsLmluZGV4T2YoIiAiKTsKKwkJaWYgKCBvZmYgPj0gMCApIHsKKwkJCXZhciBzZWxlY3RvciA9IHVybC5zbGljZShvZmYsIHVybC5sZW5ndGgpOworCQkJdXJsID0gdXJsLnNsaWNlKDAsIG9mZik7CisJCX0KKworCQkvLyBEZWZhdWx0IHRvIGEgR0VUIHJlcXVlc3QKKwkJdmFyIHR5cGUgPSAiR0VUIjsKKworCQkvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciB3YXMgcHJvdmlkZWQKKwkJaWYgKCBwYXJhbXMgKSB7CisJCQkvLyBJZiBpdCdzIGEgZnVuY3Rpb24KKwkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgeworCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCisJCQkJY2FsbGJhY2sgPSBwYXJhbXM7CisJCQkJcGFyYW1zID0gbnVsbDsKKworCQkJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZworCQkJfSBlbHNlIGlmICggdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CisJCQkJcGFyYW1zID0galF1ZXJ5LnBhcmFtKCBwYXJhbXMsIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwgKTsKKwkJCQl0eXBlID0gIlBPU1QiOworCQkJfQorCQl9CisKKwkJdmFyIHNlbGYgPSB0aGlzOworCisJCS8vIFJlcXVlc3QgdGhlIHJlbW90ZSBkb2N1bWVudAorCQlqUXVlcnkuYWpheCh7CisJCQl1cmw6IHVybCwKKwkJCXR5cGU6IHR5cGUsCisJCQlkYXRhVHlwZTogImh0bWwiLAorCQkJZGF0YTogcGFyYW1zLAorCQkJY29tcGxldGU6IGZ1bmN0aW9uKCByZXMsIHN0YXR1cyApIHsKKwkJCQkvLyBJZiBzdWNjZXNzZnVsLCBpbmplY3QgdGhlIEhUTUwgaW50byBhbGwgdGhlIG1hdGNoZWQgZWxlbWVudHMKKwkJCQlpZiAoIHN0YXR1cyA9PT0gInN1Y2Nlc3MiIHx8IHN0YXR1cyA9PT0gIm5vdG1vZGlmaWVkIiApIHsKKwkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAorCQkJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KKwkJCQkJCS8vIENyZWF0ZSBhIGR1bW15IGRpdiB0byBob2xkIHRoZSByZXN1bHRzCisJCQkJCQlqUXVlcnkoIjxkaXY+IikKKwkJCQkJCQkvLyBpbmplY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCBpbiwgcmVtb3ZpbmcgdGhlIHNjcmlwdHMKKwkJCQkJCQkvLyB0byBhdm9pZCBhbnkgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMgaW4gSUUKKwkJCQkJCQkuYXBwZW5kKHJlcy5yZXNwb25zZVRleHQucmVwbGFjZShyc2NyaXB0LCAiIikpCisKKwkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cworCQkJCQkJCS5maW5kKHNlbGVjdG9yKSA6CisKKwkJCQkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0CisJCQkJCQlyZXMucmVzcG9uc2VUZXh0ICk7CisJCQkJfQorCisJCQkJaWYgKCBjYWxsYmFjayApIHsKKwkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25zZVRleHQsIHN0YXR1cywgcmVzXSApOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiBqUXVlcnkucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKTsKKwl9LAorCisJc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7CisJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkodGhpcy5lbGVtZW50cykgOiB0aGlzOworCQl9KQorCQkuZmlsdGVyKGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgorCQkJCSh0aGlzLmNoZWNrZWQgfHwgcnNlbGVjdFRleHRhcmVhLnRlc3QodGhpcy5ub2RlTmFtZSkgfHwKKwkJCQkJcmlucHV0LnRlc3QodGhpcy50eXBlKSk7CisJCX0pCisJCS5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKSB7CisJCQl2YXIgdmFsID0galF1ZXJ5KHRoaXMpLnZhbCgpOworCisJCQlyZXR1cm4gdmFsID09IG51bGwgPworCQkJCW51bGwgOgorCQkJCWpRdWVyeS5pc0FycmF5KHZhbCkgPworCQkJCQlqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwsIGkgKSB7CisJCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwgfTsKKwkJCQkJfSkgOgorCQkJCQl7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbCB9OworCQl9KS5nZXQoKTsKKwl9Cit9KTsKKworLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKK2pRdWVyeS5lYWNoKCAiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksIGZ1bmN0aW9uKCBpLCBvICkgeworCWpRdWVyeS5mbltvXSA9IGZ1bmN0aW9uKCBmICkgeworCQlyZXR1cm4gdGhpcy5iaW5kKG8sIGYpOworCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKKwkJLy8gc2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXRlZAorCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CisJCQl0eXBlID0gdHlwZSB8fCBjYWxsYmFjazsKKwkJCWNhbGxiYWNrID0gZGF0YTsKKwkJCWRhdGEgPSBudWxsOworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5hamF4KHsKKwkJCXR5cGU6ICJHRVQiLAorCQkJdXJsOiB1cmwsCisJCQlkYXRhOiBkYXRhLAorCQkJc3VjY2VzczogY2FsbGJhY2ssCisJCQlkYXRhVHlwZTogdHlwZQorCQl9KTsKKwl9LAorCisJZ2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIGpRdWVyeS5nZXQodXJsLCBudWxsLCBjYWxsYmFjaywgInNjcmlwdCIpOworCX0sCisKKwlnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIGpRdWVyeS5nZXQodXJsLCBkYXRhLCBjYWxsYmFjaywgImpzb24iKTsKKwl9LAorCisJcG9zdDogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7CisJCS8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0ZWQKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0ge307CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgoeworCQkJdHlwZTogIlBPU1QiLAorCQkJdXJsOiB1cmwsCisJCQlkYXRhOiBkYXRhLAorCQkJc3VjY2VzczogY2FsbGJhY2ssCisJCQlkYXRhVHlwZTogdHlwZQorCQl9KTsKKwl9LAorCisJYWpheFNldHVwOiBmdW5jdGlvbiggc2V0dGluZ3MgKSB7CisJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7CisJfSwKKworCWFqYXhTZXR0aW5nczogeworCQl1cmw6IGxvY2F0aW9uLmhyZWYsCisJCWdsb2JhbDogdHJ1ZSwKKwkJdHlwZTogIkdFVCIsCisJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKKwkJcHJvY2Vzc0RhdGE6IHRydWUsCisJCWFzeW5jOiB0cnVlLAorCQkvKgorCQl0aW1lb3V0OiAwLAorCQlkYXRhOiBudWxsLAorCQl1c2VybmFtZTogbnVsbCwKKwkJcGFzc3dvcmQ6IG51bGwsCisJCXRyYWRpdGlvbmFsOiBmYWxzZSwKKwkJKi8KKwkJLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGNhbGxpbmcgalF1ZXJ5LmFqYXhTZXR1cAorCQl4aHI6IGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKKwkJfSwKKwkJYWNjZXB0czogeworCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCisJCQlodG1sOiAidGV4dC9odG1sIiwKKwkJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCIsCisJCQlqc29uOiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwKKwkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKKwkJCV9kZWZhdWx0OiAiKi8qIgorCQl9CisJfSwKKworCWFqYXg6IGZ1bmN0aW9uKCBvcmlnU2V0dGluZ3MgKSB7CisJCXZhciBzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCB7fSwgalF1ZXJ5LmFqYXhTZXR0aW5ncywgb3JpZ1NldHRpbmdzKSwKKwkJCWpzb25wLCBzdGF0dXMsIGRhdGEsIHR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKSwgbm9Db250ZW50ID0gcm5vQ29udGVudC50ZXN0KHR5cGUpOworCisJCXMudXJsID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CisKKwkJLy8gVXNlIG9yaWdpbmFsIChub3QgZXh0ZW5kZWQpIGNvbnRleHQgb2JqZWN0IGlmIGl0IHdhcyBwcm92aWRlZAorCQlzLmNvbnRleHQgPSBvcmlnU2V0dGluZ3MgJiYgb3JpZ1NldHRpbmdzLmNvbnRleHQgIT0gbnVsbCA/IG9yaWdTZXR0aW5ncy5jb250ZXh0IDogczsKKworCQkvLyBjb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKKwkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKKwkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7CisJCX0KKworCQkvLyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcworCQlpZiAoIHMuZGF0YVR5cGUgPT09ICJqc29ucCIgKSB7CisJCQlpZiAoIHR5cGUgPT09ICJHRVQiICkgeworCQkJCWlmICggIWpzcmUudGVzdCggcy51cmwgKSApIHsKKwkJCQkJcy51cmwgKz0gKHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCAhcy5kYXRhIHx8ICFqc3JlLnRlc3Qocy5kYXRhKSApIHsKKwkJCQlzLmRhdGEgPSAocy5kYXRhID8gcy5kYXRhICsgIiYiIDogIiIpICsgKHMuanNvbnAgfHwgImNhbGxiYWNrIikgKyAiPT8iOworCQkJfQorCQkJcy5kYXRhVHlwZSA9ICJqc29uIjsKKwkJfQorCisJCS8vIEJ1aWxkIHRlbXBvcmFyeSBKU09OUCBmdW5jdGlvbgorCQlpZiAoIHMuZGF0YVR5cGUgPT09ICJqc29uIiAmJiAocy5kYXRhICYmIGpzcmUudGVzdChzLmRhdGEpIHx8IGpzcmUudGVzdChzLnVybCkpICkgeworCQkJanNvbnAgPSBzLmpzb25wQ2FsbGJhY2sgfHwgKCJqc29ucCIgKyBqc2MrKyk7CisKKwkJCS8vIFJlcGxhY2UgdGhlID0/IHNlcXVlbmNlIGJvdGggaW4gdGhlIHF1ZXJ5IHN0cmluZyBhbmQgdGhlIGRhdGEKKwkJCWlmICggcy5kYXRhICkgeworCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOworCQkJfQorCisJCQlzLnVybCA9IHMudXJsLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKKworCQkJLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUKKwkJCS8vIHRoYXQgYSBKU09OUCBzdHlsZSByZXNwb25zZSBpcyBleGVjdXRlZCBwcm9wZXJseQorCQkJcy5kYXRhVHlwZSA9ICJzY3JpcHQiOworCisJCQkvLyBIYW5kbGUgSlNPTlAtc3R5bGUgbG9hZGluZworCQkJdmFyIGN1c3RvbUpzb25wID0gd2luZG93WyBqc29ucCBdOworCisJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbiggdG1wICkgeworCQkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGN1c3RvbUpzb25wICkgKSB7CisJCQkJCWN1c3RvbUpzb25wKCB0bXAgKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCS8vIEdhcmJhZ2UgY29sbGVjdAorCQkJCQl3aW5kb3dbIGpzb25wIF0gPSB1bmRlZmluZWQ7CisKKwkJCQkJdHJ5IHsKKwkJCQkJCWRlbGV0ZSB3aW5kb3dbIGpzb25wIF07CisJCQkJCX0gY2F0Y2goIGpzb25wRXJyb3IgKSB7fQorCQkJCX0KKworCQkJCWRhdGEgPSB0bXA7CisJCQkJalF1ZXJ5LmhhbmRsZVN1Y2Nlc3MoIHMsIHhociwgc3RhdHVzLCBkYXRhICk7CisJCQkJalF1ZXJ5LmhhbmRsZUNvbXBsZXRlKCBzLCB4aHIsIHN0YXR1cywgZGF0YSApOworCQkJCQorCQkJCWlmICggaGVhZCApIHsKKwkJCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisJCQkJfQorCQkJfTsKKwkJfQorCisJCWlmICggcy5kYXRhVHlwZSA9PT0gInNjcmlwdCIgJiYgcy5jYWNoZSA9PT0gbnVsbCApIHsKKwkJCXMuY2FjaGUgPSBmYWxzZTsKKwkJfQorCisJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgJiYgbm9Db250ZW50ICkgeworCQkJdmFyIHRzID0galF1ZXJ5Lm5vdygpOworCisJCQkvLyB0cnkgcmVwbGFjaW5nIF89IGlmIGl0IGlzIHRoZXJlCisJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZShydHMsICIkMV89IiArIHRzKTsKKworCQkJLy8gaWYgbm90aGluZyB3YXMgcmVwbGFjZWQsIGFkZCB0aW1lc3RhbXAgdG8gdGhlIGVuZAorCQkJcy51cmwgPSByZXQgKyAoKHJldCA9PT0gcy51cmwpID8gKHJxdWVyeS50ZXN0KHMudXJsKSA/ICImIiA6ICI/IikgKyAiXz0iICsgdHMgOiAiIik7CisJCX0KKworCQkvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsIGZvciBHRVQvSEVBRCByZXF1ZXN0cworCQlpZiAoIHMuZGF0YSAmJiBub0NvbnRlbnQgKSB7CisJCQlzLnVybCArPSAocnF1ZXJ5LnRlc3Qocy51cmwpID8gIiYiIDogIj8iKSArIHMuZGF0YTsKKwkJfQorCisJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKKwkJaWYgKCBzLmdsb2JhbCAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdGFydCIgKTsKKwkJfQorCisJCS8vIE1hdGNoZXMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgc2F2ZXMgdGhlIGRvbWFpbgorCQl2YXIgcGFydHMgPSBydXJsLmV4ZWMoIHMudXJsICksCisJCQlyZW1vdGUgPSBwYXJ0cyAmJiAocGFydHNbMV0gJiYgcGFydHNbMV0udG9Mb3dlckNhc2UoKSAhPT0gbG9jYXRpb24ucHJvdG9jb2wgfHwgcGFydHNbMl0udG9Mb3dlckNhc2UoKSAhPT0gbG9jYXRpb24uaG9zdCk7CisKKwkJLy8gSWYgd2UncmUgcmVxdWVzdGluZyBhIHJlbW90ZSBkb2N1bWVudAorCQkvLyBhbmQgdHJ5aW5nIHRvIGxvYWQgSlNPTiBvciBTY3JpcHQgd2l0aCBhIEdFVAorCQlpZiAoIHMuZGF0YVR5cGUgPT09ICJzY3JpcHQiICYmIHR5cGUgPT09ICJHRVQiICYmIHJlbW90ZSApIHsKKwkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisJCQl2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CisJCQlpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKKwkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKKwkJCX0KKwkJCXNjcmlwdC5zcmMgPSBzLnVybDsKKworCQkJLy8gSGFuZGxlIFNjcmlwdCBsb2FkaW5nCisJCQlpZiAoICFqc29ucCApIHsKKwkJCQl2YXIgZG9uZSA9IGZhbHNlOworCisJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKKwkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworCQkJCQlpZiAoICFkb25lICYmICghdGhpcy5yZWFkeVN0YXRlIHx8CisJCQkJCQkJdGhpcy5yZWFkeVN0YXRlID09PSAibG9hZGVkIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpICkgeworCQkJCQkJZG9uZSA9IHRydWU7CisJCQkJCQlqUXVlcnkuaGFuZGxlU3VjY2VzcyggcywgeGhyLCBzdGF0dXMsIGRhdGEgKTsKKwkJCQkJCWpRdWVyeS5oYW5kbGVDb21wbGV0ZSggcywgeGhyLCBzdGF0dXMsIGRhdGEgKTsKKworCQkJCQkJLy8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFCisJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CisJCQkJCQlpZiAoIGhlYWQgJiYgc2NyaXB0LnBhcmVudE5vZGUgKSB7CisJCQkJCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KKwkJCS8vIFRoaXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkgYW5kICM0Mzc4KS4KKwkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOworCisJCQkvLyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0aGUgc2NyaXB0IGVsZW1lbnQgaW5qZWN0aW9uCisJCQlyZXR1cm4gdW5kZWZpbmVkOworCQl9CisKKwkJdmFyIHJlcXVlc3REb25lID0gZmFsc2U7CisKKwkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAorCQl2YXIgeGhyID0gcy54aHIoKTsKKworCQlpZiAoICF4aHIgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBPcGVuIHRoZSBzb2NrZXQKKwkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCisJCWlmICggcy51c2VybmFtZSApIHsKKwkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkKTsKKwkJfSBlbHNlIHsKKwkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jKTsKKwkJfQorCisJCS8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZveCAzCisJCXRyeSB7CisJCQkvLyBTZXQgY29udGVudC10eXBlIGlmIGRhdGEgc3BlY2lmaWVkIGFuZCBjb250ZW50LWJvZHkgaXMgdmFsaWQgZm9yIHRoaXMgdHlwZQorCQkJaWYgKCAocy5kYXRhICE9IG51bGwgJiYgIW5vQ29udGVudCkgfHwgKG9yaWdTZXR0aW5ncyAmJiBvcmlnU2V0dGluZ3MuY29udGVudFR5cGUpICkgeworCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlKTsKKwkJCX0KKworCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KKwkJCWlmICggcy5pZk1vZGlmaWVkICkgeworCQkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gKSB7CisJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdKTsKKwkJCQl9CisKKwkJCQlpZiAoIGpRdWVyeS5ldGFnW3MudXJsXSApIHsKKwkJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1tzLnVybF0pOworCQkJCX0KKwkJCX0KKworCQkJLy8gU2V0IGhlYWRlciBzbyB0aGUgY2FsbGVkIHNjcmlwdCBrbm93cyB0aGF0IGl0J3MgYW4gWE1MSHR0cFJlcXVlc3QKKwkJCS8vIE9ubHkgc2VuZCB0aGUgaGVhZGVyIGlmIGl0J3Mgbm90IGEgcmVtb3RlIFhIUgorCQkJaWYgKCAhcmVtb3RlICkgeworCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwgIlhNTEh0dHBSZXF1ZXN0Iik7CisJCQl9CisKKwkJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKKwkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLCBzLmRhdGFUeXBlICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZSBdID8KKwkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIsICovKjsgcT0wLjAxIiA6CisJCQkJcy5hY2NlcHRzLl9kZWZhdWx0ICk7CisJCX0gY2F0Y2goIGhlYWRlckVycm9yICkge30KKworCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CisJCWlmICggcy5iZWZvcmVTZW5kICYmIHMuYmVmb3JlU2VuZC5jYWxsKHMuY29udGV4dCwgeGhyLCBzKSA9PT0gZmFsc2UgKSB7CisJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKKwkJCWlmICggcy5nbG9iYWwgJiYgalF1ZXJ5LmFjdGl2ZS0tID09PSAxICkgeworCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CisJCQl9CisKKwkJCS8vIGNsb3NlIG9wZW5kZWQgc29ja2V0CisJCQl4aHIuYWJvcnQoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICggcy5nbG9iYWwgKSB7CisJCQlqUXVlcnkudHJpZ2dlckdsb2JhbCggcywgImFqYXhTZW5kIiwgW3hociwgc10gKTsKKwkJfQorCisJCS8vIFdhaXQgZm9yIGEgcmVzcG9uc2UgdG8gY29tZSBiYWNrCisJCXZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIGlzVGltZW91dCApIHsKKwkJCS8vIFRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkCisJCQlpZiAoICF4aHIgfHwgeGhyLnJlYWR5U3RhdGUgPT09IDAgfHwgaXNUaW1lb3V0ID09PSAiYWJvcnQiICkgeworCQkJCS8vIE9wZXJhIGRvZXNuJ3QgY2FsbCBvbnJlYWR5c3RhdGVjaGFuZ2UgYmVmb3JlIHRoaXMgcG9pbnQKKwkJCQkvLyBzbyB3ZSBzaW11bGF0ZSB0aGUgY2FsbAorCQkJCWlmICggIXJlcXVlc3REb25lICkgeworCQkJCQlqUXVlcnkuaGFuZGxlQ29tcGxldGUoIHMsIHhociwgc3RhdHVzLCBkYXRhICk7CisJCQkJfQorCisJCQkJcmVxdWVzdERvbmUgPSB0cnVlOworCQkJCWlmICggeGhyICkgeworCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7CisJCQkJfQorCisJCQkvLyBUaGUgdHJhbnNmZXIgaXMgY29tcGxldGUgYW5kIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSwgb3IgdGhlIHJlcXVlc3QgdGltZWQgb3V0CisJCQl9IGVsc2UgaWYgKCAhcmVxdWVzdERvbmUgJiYgeGhyICYmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCB8fCBpc1RpbWVvdXQgPT09ICJ0aW1lb3V0IikgKSB7CisJCQkJcmVxdWVzdERvbmUgPSB0cnVlOworCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBqUXVlcnkubm9vcDsKKworCQkJCXN0YXR1cyA9IGlzVGltZW91dCA9PT0gInRpbWVvdXQiID8KKwkJCQkJInRpbWVvdXQiIDoKKwkJCQkJIWpRdWVyeS5odHRwU3VjY2VzcyggeGhyICkgPworCQkJCQkJImVycm9yIiA6CisJCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBzLnVybCApID8KKwkJCQkJCQkibm90bW9kaWZpZWQiIDoKKwkJCQkJCQkic3VjY2VzcyI7CisKKwkJCQl2YXIgZXJyTXNnOworCisJCQkJaWYgKCBzdGF0dXMgPT09ICJzdWNjZXNzIiApIHsKKwkJCQkJLy8gV2F0Y2ggZm9yLCBhbmQgY2F0Y2gsIFhNTCBkb2N1bWVudCBwYXJzZSBlcnJvcnMKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vIHByb2Nlc3MgdGhlIGRhdGEgKHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBEYXRhIHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2spCisJCQkJCQlkYXRhID0galF1ZXJ5Lmh0dHBEYXRhKCB4aHIsIHMuZGF0YVR5cGUsIHMgKTsKKwkJCQkJfSBjYXRjaCggcGFyc2VyRXJyb3IgKSB7CisJCQkJCQlzdGF0dXMgPSAicGFyc2VyZXJyb3IiOworCQkJCQkJZXJyTXNnID0gcGFyc2VyRXJyb3I7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBub3Rtb2RpZmllZAorCQkJCWlmICggc3RhdHVzID09PSAic3VjY2VzcyIgfHwgc3RhdHVzID09PSAibm90bW9kaWZpZWQiICkgeworCQkJCQkvLyBKU09OUCBoYW5kbGVzIGl0cyBvd24gc3VjY2VzcyBjYWxsYmFjaworCQkJCQlpZiAoICFqc29ucCApIHsKKwkJCQkJCWpRdWVyeS5oYW5kbGVTdWNjZXNzKCBzLCB4aHIsIHN0YXR1cywgZGF0YSApOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJalF1ZXJ5LmhhbmRsZUVycm9yKCBzLCB4aHIsIHN0YXR1cywgZXJyTXNnICk7CisJCQkJfQorCisJCQkJLy8gRmlyZSB0aGUgY29tcGxldGUgaGFuZGxlcnMKKwkJCQlpZiAoICFqc29ucCApIHsKKwkJCQkJalF1ZXJ5LmhhbmRsZUNvbXBsZXRlKCBzLCB4aHIsIHN0YXR1cywgZGF0YSApOworCQkJCX0KKworCQkJCWlmICggaXNUaW1lb3V0ID09PSAidGltZW91dCIgKSB7CisJCQkJCXhoci5hYm9ydCgpOworCQkJCX0KKworCQkJCS8vIFN0b3AgbWVtb3J5IGxlYWtzCisJCQkJaWYgKCBzLmFzeW5jICkgeworCQkJCQl4aHIgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJfTsKKworCQkvLyBPdmVycmlkZSB0aGUgYWJvcnQgaGFuZGxlciwgaWYgd2UgY2FuIChJRSA2IGRvZXNuJ3QgYWxsb3cgaXQsIGJ1dCB0aGF0J3MgT0spCisJCS8vIE9wZXJhIGRvZXNuJ3QgZmlyZSBvbnJlYWR5c3RhdGVjaGFuZ2UgYXQgYWxsIG9uIGFib3J0CisJCXRyeSB7CisJCQl2YXIgb2xkQWJvcnQgPSB4aHIuYWJvcnQ7CisJCQl4aHIuYWJvcnQgPSBmdW5jdGlvbigpIHsKKwkJCQlpZiAoIHhociApIHsKKwkJCQkJLy8gb2xkQWJvcnQgaGFzIG5vIGNhbGwgcHJvcGVydHkgaW4gSUU3IHNvCisJCQkJCS8vIGp1c3QgZG8gaXQgdGhpcyB3YXksIHdoaWNoIHdvcmtzIGluIGFsbAorCQkJCQkvLyBicm93c2VycworCQkJCQlGdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5jYWxsKCBvbGRBYm9ydCwgeGhyICk7CisJCQkJfQorCisJCQkJb25yZWFkeXN0YXRlY2hhbmdlKCAiYWJvcnQiICk7CisJCQl9OworCQl9IGNhdGNoKCBhYm9ydEVycm9yICkge30KKworCQkvLyBUaW1lb3V0IGNoZWNrZXIKKwkJaWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7CisJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBpcyBzdGlsbCBoYXBwZW5pbmcKKwkJCQlpZiAoIHhociAmJiAhcmVxdWVzdERvbmUgKSB7CisJCQkJCW9ucmVhZHlzdGF0ZWNoYW5nZSggInRpbWVvdXQiICk7CisJCQkJfQorCQkJfSwgcy50aW1lb3V0KTsKKwkJfQorCisJCS8vIFNlbmQgdGhlIGRhdGEKKwkJdHJ5IHsKKwkJCXhoci5zZW5kKCBub0NvbnRlbnQgfHwgcy5kYXRhID09IG51bGwgPyBudWxsIDogcy5kYXRhICk7CisKKwkJfSBjYXRjaCggc2VuZEVycm9yICkgeworCQkJalF1ZXJ5LmhhbmRsZUVycm9yKCBzLCB4aHIsIG51bGwsIHNlbmRFcnJvciApOworCisJCQkvLyBGaXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVycworCQkJalF1ZXJ5LmhhbmRsZUNvbXBsZXRlKCBzLCB4aHIsIHN0YXR1cywgZGF0YSApOworCQl9CisKKwkJLy8gZmlyZWZveCAxLjUgZG9lc24ndCBmaXJlIHN0YXRlY2hhbmdlIGZvciBzeW5jIHJlcXVlc3RzCisJCWlmICggIXMuYXN5bmMgKSB7CisJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoKTsKKwkJfQorCisJCS8vIHJldHVybiBYTUxIdHRwUmVxdWVzdCB0byBhbGxvdyBhYm9ydGluZyB0aGUgcmVxdWVzdCBldGMuCisJCXJldHVybiB4aHI7CisJfSwKKworCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCisJLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCisJcGFyYW06IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHsKKwkJdmFyIHMgPSBbXSwKKwkJCWFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworCQkJCS8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZQorCQkJCXZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUoKSA6IHZhbHVlOworCQkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisJCQl9OworCQkKKwkJLy8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KKwkJaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkgeworCQkJdHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOworCQl9CisJCQorCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLgorCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkgeworCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCisJCQlqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7CisJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKKwkJCX0pOworCQkJCisJCX0gZWxzZSB7CisJCQkvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKKwkJCS8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LgorCQkJZm9yICggdmFyIHByZWZpeCBpbiBhICkgeworCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbcHJlZml4XSwgdHJhZGl0aW9uYWwsIGFkZCApOworCQkJfQorCQl9CisKKwkJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgorCQlyZXR1cm4gcy5qb2luKCImIikucmVwbGFjZShyMjAsICIrIik7CisJfQorfSk7CisKK2Z1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKKwlpZiAoIGpRdWVyeS5pc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCApIHsKKwkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCisJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgeworCQkJaWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHsKKwkJCQkvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuCisJCQkJYWRkKCBwcmVmaXgsIHYgKTsKKworCQkJfSBlbHNlIHsKKwkJCQkvLyBJZiBhcnJheSBpdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMKKwkJCQkvLyBudW1lcmljIGluZGV4IHRvIHJlc29sdmUgZGVzZXJpYWxpemF0aW9uIGFtYmlndWl0eSBpc3N1ZXMuCisJCQkJLy8gTm90ZSB0aGF0IHJhY2sgKGFzIG9mIDEuMC4wKSBjYW4ndCBjdXJyZW50bHkgZGVzZXJpYWxpemUKKwkJCQkvLyBuZXN0ZWQgYXJyYXlzIHByb3Blcmx5LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyBtYXkgY2F1c2UKKwkJCQkvLyBhIHNlcnZlciBlcnJvci4gUG9zc2libGUgZml4ZXMgYXJlIHRvIG1vZGlmeSByYWNrJ3MKKwkJCQkvLyBkZXNlcmlhbGl6YXRpb24gYWxnb3JpdGhtIG9yIHRvIHByb3ZpZGUgYW4gb3B0aW9uIG9yIGZsYWcKKwkJCQkvLyB0byBmb3JjZSBhcnJheSBzZXJpYWxpemF0aW9uIHRvIGJlIHNoYWxsb3cuCisJCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArICggdHlwZW9mIHYgPT09ICJvYmplY3QiIHx8IGpRdWVyeS5pc0FycmF5KHYpID8gaSA6ICIiICkgKyAiXSIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTsKKwkJCX0KKwkJfSk7CisJCQkKKwl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgb2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgKSB7CisJCWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9iaiApICkgeworCQkJYWRkKCBwcmVmaXgsICIiICk7CisKKwkJLy8gU2VyaWFsaXplIG9iamVjdCBpdGVtLgorCQl9IGVsc2UgeworCQkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGssIHYgKSB7CisJCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIGsgKyAiXSIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTsKKwkJCX0pOworCQl9CisJCQkJCQorCX0gZWxzZSB7CisJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KKwkJYWRkKCBwcmVmaXgsIG9iaiApOworCX0KK30KKworLy8gVGhpcyBpcyBzdGlsbCBvbiB0aGUgalF1ZXJ5IG9iamVjdC4uLiBmb3Igbm93CisvLyBXYW50IHRvIG1vdmUgdGhpcyB0byBqUXVlcnkuYWpheCBzb21lIGRheQoralF1ZXJ5LmV4dGVuZCh7CisKKwkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKKwlhY3RpdmU6IDAsCisKKwkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CisJbGFzdE1vZGlmaWVkOiB7fSwKKwlldGFnOiB7fSwKKworCWhhbmRsZUVycm9yOiBmdW5jdGlvbiggcywgeGhyLCBzdGF0dXMsIGUgKSB7CisJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgZmlyZSBpdAorCQlpZiAoIHMuZXJyb3IgKSB7CisJCQlzLmVycm9yLmNhbGwoIHMuY29udGV4dCwgeGhyLCBzdGF0dXMsIGUgKTsKKwkJfQorCisJCS8vIEZpcmUgdGhlIGdsb2JhbCBjYWxsYmFjaworCQlpZiAoIHMuZ2xvYmFsICkgeworCQkJalF1ZXJ5LnRyaWdnZXJHbG9iYWwoIHMsICJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSApOworCQl9CisJfSwKKworCWhhbmRsZVN1Y2Nlc3M6IGZ1bmN0aW9uKCBzLCB4aHIsIHN0YXR1cywgZGF0YSApIHsKKwkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0IGFuZCBwYXNzIGl0IHRoZSBkYXRhCisJCWlmICggcy5zdWNjZXNzICkgeworCQkJcy5zdWNjZXNzLmNhbGwoIHMuY29udGV4dCwgZGF0YSwgc3RhdHVzLCB4aHIgKTsKKwkJfQorCisJCS8vIEZpcmUgdGhlIGdsb2JhbCBjYWxsYmFjaworCQlpZiAoIHMuZ2xvYmFsICkgeworCQkJalF1ZXJ5LnRyaWdnZXJHbG9iYWwoIHMsICJhamF4U3VjY2VzcyIsIFt4aHIsIHNdICk7CisJCX0KKwl9LAorCisJaGFuZGxlQ29tcGxldGU6IGZ1bmN0aW9uKCBzLCB4aHIsIHN0YXR1cyApIHsKKwkJLy8gUHJvY2VzcyByZXN1bHQKKwkJaWYgKCBzLmNvbXBsZXRlICkgeworCQkJcy5jb21wbGV0ZS5jYWxsKCBzLmNvbnRleHQsIHhociwgc3RhdHVzICk7CisJCX0KKworCQkvLyBUaGUgcmVxdWVzdCB3YXMgY29tcGxldGVkCisJCWlmICggcy5nbG9iYWwgKSB7CisJCQlqUXVlcnkudHJpZ2dlckdsb2JhbCggcywgImFqYXhDb21wbGV0ZSIsIFt4aHIsIHNdICk7CisJCX0KKworCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKKwkJaWYgKCBzLmdsb2JhbCAmJiBqUXVlcnkuYWN0aXZlLS0gPT09IDEgKSB7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQl9CisJfSwKKwkJCisJdHJpZ2dlckdsb2JhbDogZnVuY3Rpb24oIHMsIHR5cGUsIGFyZ3MgKSB7CisJCShzLmNvbnRleHQgJiYgcy5jb250ZXh0LnVybCA9PSBudWxsID8galF1ZXJ5KHMuY29udGV4dCkgOiBqUXVlcnkuZXZlbnQpLnRyaWdnZXIodHlwZSwgYXJncyk7CisJfSwKKworCS8vIERldGVybWluZXMgaWYgYW4gWE1MSHR0cFJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90CisJaHR0cFN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIgKSB7CisJCXRyeSB7CisJCQkvLyBJRSBlcnJvciBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNCBzbyB0cmVhdCBpdCBhcyBzdWNjZXNzLCBzZWUgIzE0NTAKKwkJCXJldHVybiAheGhyLnN0YXR1cyAmJiBsb2NhdGlvbi5wcm90b2NvbCA9PT0gImZpbGU6IiB8fAorCQkJCXhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgfHwKKwkJCQl4aHIuc3RhdHVzID09PSAzMDQgfHwgeGhyLnN0YXR1cyA9PT0gMTIyMzsKKwkJfSBjYXRjaChlKSB7fQorCisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCisJaHR0cE5vdE1vZGlmaWVkOiBmdW5jdGlvbiggeGhyLCB1cmwgKSB7CisJCXZhciBsYXN0TW9kaWZpZWQgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSwKKwkJCWV0YWcgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKTsKKworCQlpZiAoIGxhc3RNb2RpZmllZCApIHsKKwkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbdXJsXSA9IGxhc3RNb2RpZmllZDsKKwkJfQorCisJCWlmICggZXRhZyApIHsKKwkJCWpRdWVyeS5ldGFnW3VybF0gPSBldGFnOworCQl9CisKKwkJcmV0dXJuIHhoci5zdGF0dXMgPT09IDMwNDsKKwl9LAorCisJaHR0cERhdGE6IGZ1bmN0aW9uKCB4aHIsIHR5cGUsIHMgKSB7CisJCXZhciBjdCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikgfHwgIiIsCisJCQl4bWwgPSB0eXBlID09PSAieG1sIiB8fCAhdHlwZSAmJiBjdC5pbmRleE9mKCJ4bWwiKSA+PSAwLAorCQkJZGF0YSA9IHhtbCA/IHhoci5yZXNwb25zZVhNTCA6IHhoci5yZXNwb25zZVRleHQ7CisKKwkJaWYgKCB4bWwgJiYgZGF0YS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgPT09ICJwYXJzZXJlcnJvciIgKSB7CisJCQlqUXVlcnkuZXJyb3IoICJwYXJzZXJlcnJvciIgKTsKKwkJfQorCisJCS8vIEFsbG93IGEgcHJlLWZpbHRlcmluZyBmdW5jdGlvbiB0byBzYW5pdGl6ZSB0aGUgcmVzcG9uc2UKKwkJLy8gcyBpcyBjaGVja2VkIHRvIGtlZXAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJaWYgKCBzICYmIHMuZGF0YUZpbHRlciApIHsKKwkJCWRhdGEgPSBzLmRhdGFGaWx0ZXIoIGRhdGEsIHR5cGUgKTsKKwkJfQorCisJCS8vIFRoZSBmaWx0ZXIgY2FuIGFjdHVhbGx5IHBhcnNlIHRoZSByZXNwb25zZQorCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKKwkJCS8vIEdldCB0aGUgSmF2YVNjcmlwdCBvYmplY3QsIGlmIEpTT04gaXMgdXNlZC4KKwkJCWlmICggdHlwZSA9PT0gImpzb24iIHx8ICF0eXBlICYmIGN0LmluZGV4T2YoImpzb24iKSA+PSAwICkgeworCQkJCWRhdGEgPSBqUXVlcnkucGFyc2VKU09OKCBkYXRhICk7CisKKwkJCS8vIElmIHRoZSB0eXBlIGlzICJzY3JpcHQiLCBldmFsIGl0IGluIGdsb2JhbCBjb250ZXh0CisJCQl9IGVsc2UgaWYgKCB0eXBlID09PSAic2NyaXB0IiB8fCAhdHlwZSAmJiBjdC5pbmRleE9mKCJqYXZhc2NyaXB0IikgPj0gMCApIHsKKwkJCQlqUXVlcnkuZ2xvYmFsRXZhbCggZGF0YSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGRhdGE7CisJfQorCit9KTsKKworLyoKKyAqIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3Q7IE1pY3Jvc29mdCBmYWlsZWQgdG8gcHJvcGVybHkKKyAqIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3IChjYW4ndCByZXF1ZXN0IGxvY2FsIGZpbGVzKSwKKyAqIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZQorICogQWRkaXRpb25hbGx5IFhNTEh0dHBSZXF1ZXN0IGNhbiBiZSBkaXNhYmxlZCBpbiBJRTcvSUU4IHNvCisgKiB3ZSBuZWVkIGEgZmFsbGJhY2suCisgKi8KK2lmICggd2luZG93LkFjdGl2ZVhPYmplY3QgKSB7CisJalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHsKKwkJaWYgKCB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgIT09ICJmaWxlOiIgKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7CisJCQl9IGNhdGNoKHhockVycm9yKSB7fQorCQl9CisKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik7CisJCX0gY2F0Y2goYWN0aXZlRXJyb3IpIHt9CisJfTsKK30KKworLy8gRG9lcyB0aGlzIGJyb3dzZXIgc3VwcG9ydCBYSFIgcmVxdWVzdHM/CitqUXVlcnkuc3VwcG9ydC5hamF4ID0gISFqUXVlcnkuYWpheFNldHRpbmdzLnhocigpOworCisKKworCit2YXIgZWxlbWRpc3BsYXkgPSB7fSwKKwlyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLywKKwlyZnhudW0gPSAvXihbK1wtXT0pPyhbXGQrLlwtXSspKC4qKSQvLAorCXRpbWVySWQsCisJZnhBdHRycyA9IFsKKwkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKKwkJWyAiaGVpZ2h0IiwgIm1hcmdpblRvcCIsICJtYXJnaW5Cb3R0b20iLCAicGFkZGluZ1RvcCIsICJwYWRkaW5nQm90dG9tIiBdLAorCQkvLyB3aWR0aCBhbmltYXRpb25zCisJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAorCQkvLyBvcGFjaXR5IGFuaW1hdGlvbnMKKwkJWyAib3BhY2l0eSIgXQorCV07CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXNob3c6IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJdmFyIGVsZW0sIGRpc3BsYXk7CisKKwkJaWYgKCBzcGVlZCB8fCBzcGVlZCA9PT0gMCApIHsKKwkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJzaG93IiwgMyksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKKworCQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkgPSAwLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKysgKSB7CisJCQkJZWxlbSA9IHRoaXNbaV07CisJCQkJZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTsKKworCQkJCS8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKKwkJCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90CisJCQkJaWYgKCAhalF1ZXJ5LmRhdGEoZWxlbSwgIm9sZGRpc3BsYXkiKSAmJiBkaXNwbGF5ID09PSAibm9uZSIgKSB7CisJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgPSAiIjsKKwkJCQl9CisKKwkJCQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCisJCQkJLy8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXMKKwkJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50CisJCQkJaWYgKCBkaXNwbGF5ID09PSAiIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiICkgeworCQkJCQlqUXVlcnkuZGF0YShlbGVtLCAib2xkZGlzcGxheSIsIGRlZmF1bHREaXNwbGF5KGVsZW0ubm9kZU5hbWUpKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wCisJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CisJCQlmb3IgKCBpID0gMDsgaSA8IGo7IGkrKyApIHsKKwkJCQllbGVtID0gdGhpc1tpXTsKKwkJCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OworCisJCQkJaWYgKCBkaXNwbGF5ID09PSAiIiB8fCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CisJCQkJCWVsZW0uc3R5bGUuZGlzcGxheSA9IGpRdWVyeS5kYXRhKGVsZW0sICJvbGRkaXNwbGF5IikgfHwgIiI7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0sCisKKwloaWRlOiBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCWlmICggc3BlZWQgfHwgc3BlZWQgPT09IDAgKSB7CisJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CisKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrICkgeworCQkJCXZhciBkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGhpc1tpXSwgImRpc3BsYXkiICk7CisKKwkJCQlpZiAoIGRpc3BsYXkgIT09ICJub25lIiApIHsKKwkJCQkJalF1ZXJ5LmRhdGEoIHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSApOworCQkJCX0KKwkJCX0KKworCQkJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wCisJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CisJCQlmb3IgKCBpID0gMDsgaSA8IGo7IGkrKyApIHsKKwkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCQl9CisJfSwKKworCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KKwlfdG9nZ2xlOiBqUXVlcnkuZm4udG9nZ2xlLAorCisJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiwgY2FsbGJhY2sgKSB7CisJCXZhciBib29sID0gdHlwZW9mIGZuID09PSAiYm9vbGVhbiI7CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSApIHsKKwkJCXRoaXMuX3RvZ2dsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisKKwkJfSBlbHNlIGlmICggZm4gPT0gbnVsbCB8fCBib29sICkgeworCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpOworCQkJCWpRdWVyeSh0aGlzKVsgc3RhdGUgPyAic2hvdyIgOiAiaGlkZSIgXSgpOworCQkJfSk7CisKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYW5pbWF0ZShnZW5GeCgidG9nZ2xlIiwgMyksIGZuLCBmbjIsIGNhbGxiYWNrKTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwlmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCXJldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsIDApLnNob3coKS5lbmQoKQorCQkJCQkuYW5pbWF0ZSh7b3BhY2l0eTogdG99LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CisJfSwKKworCWFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJdmFyIG9wdGFsbCA9IGpRdWVyeS5zcGVlZChzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CisKKwkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaCggb3B0YWxsLmNvbXBsZXRlICk7CisJCX0KKworCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpIHsKKwkJCS8vIFhYWCAndGhpcycgZG9lcyBub3QgYWx3YXlzIGhhdmUgYSBub2RlTmFtZSB3aGVuIHJ1bm5pbmcgdGhlCisJCQkvLyB0ZXN0IHN1aXRlCisKKwkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKHt9LCBvcHRhbGwpLCBwLAorCQkJCWlzRWxlbWVudCA9IHRoaXMubm9kZVR5cGUgPT09IDEsCisJCQkJaGlkZGVuID0gaXNFbGVtZW50ICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAorCQkJCXNlbGYgPSB0aGlzOworCisJCQlmb3IgKCBwIGluIHByb3AgKSB7CisJCQkJdmFyIG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBwICk7CisKKwkJCQlpZiAoIHAgIT09IG5hbWUgKSB7CisJCQkJCXByb3BbIG5hbWUgXSA9IHByb3BbIHAgXTsKKwkJCQkJZGVsZXRlIHByb3BbIHAgXTsKKwkJCQkJcCA9IG5hbWU7CisJCQkJfQorCisJCQkJaWYgKCBwcm9wW3BdID09PSAiaGlkZSIgJiYgaGlkZGVuIHx8IHByb3BbcF0gPT09ICJzaG93IiAmJiAhaGlkZGVuICkgeworCQkJCQlyZXR1cm4gb3B0LmNvbXBsZXRlLmNhbGwodGhpcyk7CisJCQkJfQorCisJCQkJaWYgKCBpc0VsZW1lbnQgJiYgKCBwID09PSAiaGVpZ2h0IiB8fCBwID09PSAid2lkdGgiICkgKSB7CisJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAorCQkJCQkvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90CisJCQkJCS8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAorCQkJCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQorCQkJCQlvcHQub3ZlcmZsb3cgPSBbIHRoaXMuc3R5bGUub3ZlcmZsb3csIHRoaXMuc3R5bGUub3ZlcmZsb3dYLCB0aGlzLnN0eWxlLm92ZXJmbG93WSBdOworCisJCQkJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCisJCQkJCS8vIGFuaW1hdGlvbnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0aC9oZWlnaHQKKwkJCQkJLy8gYW5pbWF0ZWQKKwkJCQkJaWYgKCBqUXVlcnkuY3NzKCB0aGlzLCAiZGlzcGxheSIgKSA9PT0gImlubGluZSIgJiYKKwkJCQkJCQlqUXVlcnkuY3NzKCB0aGlzLCAiZmxvYXQiICkgPT09ICJub25lIiApIHsKKwkJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgKSB7CisJCQkJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CisKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdmFyIGRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheSh0aGlzLm5vZGVOYW1lKTsKKworCQkJCQkJCS8vIGlubGluZS1sZXZlbCBlbGVtZW50cyBhY2NlcHQgaW5saW5lLWJsb2NrOworCQkJCQkJCS8vIGJsb2NrLWxldmVsIGVsZW1lbnRzIG5lZWQgdG8gYmUgaW5saW5lIHdpdGggbGF5b3V0CisJCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiApIHsKKwkJCQkJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CisKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKKwkJCQkJCQkJdGhpcy5zdHlsZS56b29tID0gMTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGpRdWVyeS5pc0FycmF5KCBwcm9wW3BdICkgKSB7CisJCQkJCS8vIENyZWF0ZSAoaWYgbmVlZGVkKSBhbmQgYWRkIHRvIHNwZWNpYWxFYXNpbmcKKwkJCQkJKG9wdC5zcGVjaWFsRWFzaW5nID0gb3B0LnNwZWNpYWxFYXNpbmcgfHwge30pW3BdID0gcHJvcFtwXVsxXTsKKwkJCQkJcHJvcFtwXSA9IHByb3BbcF1bMF07CisJCQkJfQorCQkJfQorCisJCQlpZiAoIG9wdC5vdmVyZmxvdyAhPSBudWxsICkgeworCQkJCXRoaXMuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCX0KKworCQkJb3B0LmN1ckFuaW0gPSBqUXVlcnkuZXh0ZW5kKHt9LCBwcm9wKTsKKworCQkJalF1ZXJ5LmVhY2goIHByb3AsIGZ1bmN0aW9uKCBuYW1lLCB2YWwgKSB7CisJCQkJdmFyIGUgPSBuZXcgalF1ZXJ5LmZ4KCBzZWxmLCBvcHQsIG5hbWUgKTsKKworCQkJCWlmICggcmZ4dHlwZXMudGVzdCh2YWwpICkgeworCQkJCQllWyB2YWwgPT09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oIHByb3AgKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXZhciBwYXJ0cyA9IHJmeG51bS5leGVjKHZhbCksCisJCQkJCQlzdGFydCA9IGUuY3VyKCkgfHwgMDsKKworCQkJCQlpZiAoIHBhcnRzICkgeworCQkJCQkJdmFyIGVuZCA9IHBhcnNlRmxvYXQoIHBhcnRzWzJdICksCisJCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICJweCI7CisKKwkJCQkJCS8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQorCQkJCQkJaWYgKCB1bml0ICE9PSAicHgiICkgeworCQkJCQkJCWpRdWVyeS5zdHlsZSggc2VsZiwgbmFtZSwgKGVuZCB8fCAxKSArIHVuaXQpOworCQkJCQkJCXN0YXJ0ID0gKChlbmQgfHwgMSkgLyBlLmN1cigpKSAqIHN0YXJ0OworCQkJCQkJCWpRdWVyeS5zdHlsZSggc2VsZiwgbmFtZSwgc3RhcnQgKyB1bml0KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCisJCQkJCQlpZiAoIHBhcnRzWzFdICkgeworCQkJCQkJCWVuZCA9ICgocGFydHNbMV0gPT09ICItPSIgPyAtMSA6IDEpICogZW5kKSArIHN0YXJ0OworCQkJCQkJfQorCisJCQkJCQllLmN1c3RvbSggc3RhcnQsIGVuZCwgdW5pdCApOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQllLmN1c3RvbSggc3RhcnQsIHZhbCwgIiIgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCisJCQkvLyBGb3IgSlMgc3RyaWN0IGNvbXBsaWFuY2UKKwkJCXJldHVybiB0cnVlOworCQl9KTsKKwl9LAorCisJc3RvcDogZnVuY3Rpb24oIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7CisJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOworCisJCWlmICggY2xlYXJRdWV1ZSApIHsKKwkJCXRoaXMucXVldWUoW10pOworCQl9CisKKwkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJLy8gZ28gaW4gcmV2ZXJzZSBvcmRlciBzbyBhbnl0aGluZyBhZGRlZCB0byB0aGUgcXVldWUgZHVyaW5nIHRoZSBsb29wIGlzIGlnbm9yZWQKKwkJCWZvciAoIHZhciBpID0gdGltZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkgeworCQkJCWlmICggdGltZXJzW2ldLmVsZW0gPT09IHRoaXMgKSB7CisJCQkJCWlmIChnb3RvRW5kKSB7CisJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CisJCQkJCQl0aW1lcnNbaV0odHJ1ZSk7CisJCQkJCX0KKworCQkJCQl0aW1lcnMuc3BsaWNlKGksIDEpOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAorCQlpZiAoICFnb3RvRW5kICkgeworCQkJdGhpcy5kZXF1ZXVlKCk7CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCitmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICkgeworCXZhciBvYmogPSB7fTsKKworCWpRdWVyeS5lYWNoKCBmeEF0dHJzLmNvbmNhdC5hcHBseShbXSwgZnhBdHRycy5zbGljZSgwLG51bSkpLCBmdW5jdGlvbigpIHsKKwkJb2JqWyB0aGlzIF0gPSB0eXBlOworCX0pOworCisJcmV0dXJuIG9iajsKK30KKworLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucworalF1ZXJ5LmVhY2goeworCXNsaWRlRG93bjogZ2VuRngoInNob3ciLCAxKSwKKwlzbGlkZVVwOiBnZW5GeCgiaGlkZSIsIDEpLAorCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCisJZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAorCWZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0sCisJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cit9LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOworCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisJc3BlZWQ6IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHsKKwkJdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKHt9LCBzcGVlZCkgOiB7CisJCQljb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fAorCQkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLAorCQkJZHVyYXRpb246IHNwZWVkLAorCQkJZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbihlYXNpbmcpICYmIGVhc2luZworCQl9OworCisJCW9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgorCQkJb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzW29wdC5kdXJhdGlvbl0gOiBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0OworCisJCS8vIFF1ZXVlaW5nCisJCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CisJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgeworCQkJaWYgKCBvcHQucXVldWUgIT09IGZhbHNlICkgeworCQkJCWpRdWVyeSh0aGlzKS5kZXF1ZXVlKCk7CisJCQl9CisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7CisJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CisJCQl9CisJCX07CisKKwkJcmV0dXJuIG9wdDsKKwl9LAorCisJZWFzaW5nOiB7CisJCWxpbmVhcjogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgeworCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CisJCX0sCisJCXN3aW5nOiBmdW5jdGlvbiggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CisJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CisJCX0KKwl9LAorCisJdGltZXJzOiBbXSwKKworCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApIHsKKwkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKwkJdGhpcy5lbGVtID0gZWxlbTsKKwkJdGhpcy5wcm9wID0gcHJvcDsKKworCQlpZiAoICFvcHRpb25zLm9yaWcgKSB7CisJCQlvcHRpb25zLm9yaWcgPSB7fTsKKwkJfQorCX0KKworfSk7CisKK2pRdWVyeS5meC5wcm90b3R5cGUgPSB7CisJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKKwl1cGRhdGU6IGZ1bmN0aW9uKCkgeworCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkgeworCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOworCQl9CisKKwkJKGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7CisJfSwKKworCS8vIEdldCB0aGUgY3VycmVudCBzaXplCisJY3VyOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzLmVsZW1bdGhpcy5wcm9wXSAhPSBudWxsICYmICghdGhpcy5lbGVtLnN0eWxlIHx8IHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdID09IG51bGwpICkgeworCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CisJCX0KKworCQl2YXIgciA9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICkgKTsKKwkJcmV0dXJuIHIgJiYgciA+IC0xMDAwMCA/IHIgOiAwOworCX0sCisKKwkvLyBTdGFydCBhbiBhbmltYXRpb24gZnJvbSBvbmUgbnVtYmVyIHRvIGFub3RoZXIKKwljdXN0b206IGZ1bmN0aW9uKCBmcm9tLCB0bywgdW5pdCApIHsKKwkJdmFyIHNlbGYgPSB0aGlzLAorCQkJZnggPSBqUXVlcnkuZng7CisKKwkJdGhpcy5zdGFydFRpbWUgPSBqUXVlcnkubm93KCk7CisJCXRoaXMuc3RhcnQgPSBmcm9tOworCQl0aGlzLmVuZCA9IHRvOworCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAicHgiOworCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQ7CisJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CisKKwkJZnVuY3Rpb24gdCggZ290b0VuZCApIHsKKwkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CisJCX0KKworCQl0LmVsZW0gPSB0aGlzLmVsZW07CisKKwkJaWYgKCB0KCkgJiYgalF1ZXJ5LnRpbWVycy5wdXNoKHQpICYmICF0aW1lcklkICkgeworCQkJdGltZXJJZCA9IHNldEludGVydmFsKGZ4LnRpY2ssIGZ4LmludGVydmFsKTsKKwkJfQorCX0sCisKKwkvLyBTaW1wbGUgJ3Nob3cnIGZ1bmN0aW9uCisJc2hvdzogZnVuY3Rpb24oKSB7CisJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKKwkJdGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5zdHlsZSggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKKwkJdGhpcy5vcHRpb25zLnNob3cgPSB0cnVlOworCisJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KKwkJLy8gTWFrZSBzdXJlIHRoYXQgd2Ugc3RhcnQgYXQgYSBzbWFsbCB3aWR0aC9oZWlnaHQgdG8gYXZvaWQgYW55CisJCS8vIGZsYXNoIG9mIGNvbnRlbnQKKwkJdGhpcy5jdXN0b20odGhpcy5wcm9wID09PSAid2lkdGgiIHx8IHRoaXMucHJvcCA9PT0gImhlaWdodCIgPyAxIDogMCwgdGhpcy5jdXIoKSk7CisKKwkJLy8gU3RhcnQgYnkgc2hvd2luZyB0aGUgZWxlbWVudAorCQlqUXVlcnkoIHRoaXMuZWxlbSApLnNob3coKTsKKwl9LAorCisJLy8gU2ltcGxlICdoaWRlJyBmdW5jdGlvbgorCWhpZGU6IGZ1bmN0aW9uKCkgeworCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCisJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuc3R5bGUoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CisJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKKworCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCisJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOworCX0sCisKKwkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCisJc3RlcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7CisJCXZhciB0ID0galF1ZXJ5Lm5vdygpLCBkb25lID0gdHJ1ZTsKKworCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0VGltZSApIHsKKwkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CisJCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUgPSAxOworCQkJdGhpcy51cGRhdGUoKTsKKworCQkJdGhpcy5vcHRpb25zLmN1ckFuaW1bIHRoaXMucHJvcCBdID0gdHJ1ZTsKKworCQkJZm9yICggdmFyIGkgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKSB7CisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuY3VyQW5pbVtpXSAhPT0gdHJ1ZSApIHsKKwkJCQkJZG9uZSA9IGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBkb25lICkgeworCQkJCS8vIFJlc2V0IHRoZSBvdmVyZmxvdworCQkJCWlmICggdGhpcy5vcHRpb25zLm92ZXJmbG93ICE9IG51bGwgJiYgIWpRdWVyeS5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MgKSB7CisJCQkJCXZhciBlbGVtID0gdGhpcy5lbGVtLAorCQkJCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKKworCQkJCQlqUXVlcnkuZWFjaCggWyAiIiwgIlgiLCAiWSIgXSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgeworCQkJCQkJZWxlbS5zdHlsZVsgIm92ZXJmbG93IiArIHZhbHVlIF0gPSBvcHRpb25zLm92ZXJmbG93W2luZGV4XTsKKwkJCQkJfSApOworCQkJCX0KKworCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKKwkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlICkgeworCQkJCQlqUXVlcnkodGhpcy5lbGVtKS5oaWRlKCk7CisJCQkJfQorCisJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgorCQkJCWlmICggdGhpcy5vcHRpb25zLmhpZGUgfHwgdGhpcy5vcHRpb25zLnNob3cgKSB7CisJCQkJCWZvciAoIHZhciBwIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkgeworCQkJCQkJalF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHAsIHRoaXMub3B0aW9ucy5vcmlnW3BdICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgorCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKKwkJCX0KKworCQkJcmV0dXJuIGZhbHNlOworCisJCX0gZWxzZSB7CisJCQl2YXIgbiA9IHQgLSB0aGlzLnN0YXJ0VGltZTsKKwkJCXRoaXMuc3RhdGUgPSBuIC8gdGhpcy5vcHRpb25zLmR1cmF0aW9uOworCisJCQkvLyBQZXJmb3JtIHRoZSBlYXNpbmcgZnVuY3Rpb24sIGRlZmF1bHRzIHRvIHN3aW5nCisJCQl2YXIgc3BlY2lhbEVhc2luZyA9IHRoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nICYmIHRoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nW3RoaXMucHJvcF07CisJCQl2YXIgZGVmYXVsdEVhc2luZyA9IHRoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpOworCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3NwZWNpYWxFYXNpbmcgfHwgZGVmYXVsdEVhc2luZ10odGhpcy5zdGF0ZSwgbiwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uKTsKKwkJCXRoaXMubm93ID0gdGhpcy5zdGFydCArICgodGhpcy5lbmQgLSB0aGlzLnN0YXJ0KSAqIHRoaXMucG9zKTsKKworCQkJLy8gUGVyZm9ybSB0aGUgbmV4dCBzdGVwIG9mIHRoZSBhbmltYXRpb24KKwkJCXRoaXMudXBkYXRlKCk7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9OworCitqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZngsIHsKKwl0aWNrOiBmdW5jdGlvbigpIHsKKwkJdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnM7CisKKwkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkgeworCQkJaWYgKCAhdGltZXJzW2ldKCkgKSB7CisJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOworCQkJfQorCQl9CisKKwkJaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKKwkJCWpRdWVyeS5meC5zdG9wKCk7CisJCX0KKwl9LAorCisJaW50ZXJ2YWw6IDEzLAorCisJc3RvcDogZnVuY3Rpb24oKSB7CisJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKwkJdGltZXJJZCA9IG51bGw7CisJfSwKKworCXNwZWVkczogeworCQlzbG93OiA2MDAsCisJCWZhc3Q6IDIwMCwKKwkJLy8gRGVmYXVsdCBzcGVlZAorCQlfZGVmYXVsdDogNDAwCisJfSwKKworCXN0ZXA6IHsKKwkJb3BhY2l0eTogZnVuY3Rpb24oIGZ4ICkgeworCQkJalF1ZXJ5LnN0eWxlKCBmeC5lbGVtLCAib3BhY2l0eSIsIGZ4Lm5vdyApOworCQl9LAorCisJCV9kZWZhdWx0OiBmdW5jdGlvbiggZnggKSB7CisJCQlpZiAoIGZ4LmVsZW0uc3R5bGUgJiYgZnguZWxlbS5zdHlsZVsgZngucHJvcCBdICE9IG51bGwgKSB7CisJCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gKGZ4LnByb3AgPT09ICJ3aWR0aCIgfHwgZngucHJvcCA9PT0gImhlaWdodCIgPyBNYXRoLm1heCgwLCBmeC5ub3cpIDogZngubm93KSArIGZ4LnVuaXQ7CisJCQl9IGVsc2UgeworCQkJCWZ4LmVsZW1bIGZ4LnByb3AgXSA9IGZ4Lm5vdzsKKwkJCX0KKwkJfQorCX0KK30pOworCitpZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7CisJalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkgeworCQkJcmV0dXJuIGVsZW0gPT09IGZuLmVsZW07CisJCX0pLmxlbmd0aDsKKwl9OworfQorCitmdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CisJaWYgKCAhZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7CisJCXZhciBlbGVtID0galF1ZXJ5KCI8IiArIG5vZGVOYW1lICsgIj4iKS5hcHBlbmRUbygiYm9keSIpLAorCQkJZGlzcGxheSA9IGVsZW0uY3NzKCJkaXNwbGF5Iik7CisKKwkJZWxlbS5yZW1vdmUoKTsKKworCQlpZiAoIGRpc3BsYXkgPT09ICJub25lIiB8fCBkaXNwbGF5ID09PSAiIiApIHsKKwkJCWRpc3BsYXkgPSAiYmxvY2siOworCQl9CisKKwkJZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OworCX0KKworCXJldHVybiBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTsKK30KKworCisKKwordmFyIHJ0YWJsZSA9IC9edCg/OmFibGV8ZHxoKSQvaSwKKwlycm9vdCA9IC9eKD86Ym9keXxodG1sKSQvaTsKKworaWYgKCAiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgKSB7CisJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgeworCQl2YXIgZWxlbSA9IHRoaXNbMF0sIGJveDsKKworCQlpZiAoIG9wdGlvbnMgKSB7IAorCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKwkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOworCQkJfSk7CisJCX0KKworCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWlmICggZWxlbSA9PT0gZWxlbS5vd25lckRvY3VtZW50LmJvZHkgKSB7CisJCQlyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CisJCX0KKworCQl0cnkgeworCQkJYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKwkJfSBjYXRjaChlKSB7fQorCisJCXZhciBkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCisJCQlkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsKKworCQkvLyBNYWtlIHN1cmUgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIGRpc2Nvbm5lY3RlZCBET00gbm9kZQorCQlpZiAoICFib3ggfHwgIWpRdWVyeS5jb250YWlucyggZG9jRWxlbSwgZWxlbSApICkgeworCQkJcmV0dXJuIGJveCB8fCB7IHRvcDogMCwgbGVmdDogMCB9OworCQl9CisKKwkJdmFyIGJvZHkgPSBkb2MuYm9keSwKKwkJCXdpbiA9IGdldFdpbmRvdyhkb2MpLAorCQkJY2xpZW50VG9wICA9IGRvY0VsZW0uY2xpZW50VG9wICB8fCBib2R5LmNsaWVudFRvcCAgfHwgMCwKKwkJCWNsaWVudExlZnQgPSBkb2NFbGVtLmNsaWVudExlZnQgfHwgYm9keS5jbGllbnRMZWZ0IHx8IDAsCisJCQlzY3JvbGxUb3AgID0gKHdpbi5wYWdlWU9mZnNldCB8fCBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbFRvcCAgfHwgYm9keS5zY3JvbGxUb3AgKSwKKwkJCXNjcm9sbExlZnQgPSAod2luLnBhZ2VYT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQpLAorCQkJdG9wICA9IGJveC50b3AgICsgc2Nyb2xsVG9wICAtIGNsaWVudFRvcCwKKwkJCWxlZnQgPSBib3gubGVmdCArIHNjcm9sbExlZnQgLSBjbGllbnRMZWZ0OworCisJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKKworfSBlbHNlIHsKKwlqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CisJCXZhciBlbGVtID0gdGhpc1swXTsKKworCQlpZiAoIG9wdGlvbnMgKSB7IAorCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKwkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOworCQkJfSk7CisJCX0KKworCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWlmICggZWxlbSA9PT0gZWxlbS5vd25lckRvY3VtZW50LmJvZHkgKSB7CisJCQlyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CisJCX0KKworCQlqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTsKKworCQl2YXIgY29tcHV0ZWRTdHlsZSwKKwkJCW9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50LAorCQkJcHJldk9mZnNldFBhcmVudCA9IGVsZW0sCisJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCisJCQlkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCwKKwkJCWJvZHkgPSBkb2MuYm9keSwKKwkJCWRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAorCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0VmlldyA/IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKSA6IGVsZW0uY3VycmVudFN0eWxlLAorCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsCisJCQlsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OworCisJCXdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsKKwkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24gJiYgcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJmaXhlZCIgKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0VmlldyA/IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCkgOiBlbGVtLmN1cnJlbnRTdHlsZTsKKwkJCXRvcCAgLT0gZWxlbS5zY3JvbGxUb3A7CisJCQlsZWZ0IC09IGVsZW0uc2Nyb2xsTGVmdDsKKworCQkJaWYgKCBlbGVtID09PSBvZmZzZXRQYXJlbnQgKSB7CisJCQkJdG9wICArPSBlbGVtLm9mZnNldFRvcDsKKwkJCQlsZWZ0ICs9IGVsZW0ub2Zmc2V0TGVmdDsKKworCQkJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90QWRkQm9yZGVyICYmICEoalF1ZXJ5Lm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscyAmJiBydGFibGUudGVzdChlbGVtLm5vZGVOYW1lKSkgKSB7CisJCQkJCXRvcCAgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCAgKSB8fCAwOworCQkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKKwkJCQl9CisKKwkJCQlwcmV2T2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50OworCQkJCW9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50OworCQkJfQorCisJCQlpZiAoIGpRdWVyeS5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlICYmIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3cgIT09ICJ2aXNpYmxlIiApIHsKKwkJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGggICkgfHwgMDsKKwkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKKwkJCX0KKworCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOworCQl9CisKKwkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CisJCQl0b3AgICs9IGJvZHkub2Zmc2V0VG9wOworCQkJbGVmdCArPSBib2R5Lm9mZnNldExlZnQ7CisJCX0KKworCQlpZiAoIGpRdWVyeS5vZmZzZXQuc3VwcG9ydHNGaXhlZFBvc2l0aW9uICYmIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAiZml4ZWQiICkgeworCQkJdG9wICArPSBNYXRoLm1heCggZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Nyb2xsVG9wICk7CisJCQlsZWZ0ICs9IE1hdGgubWF4KCBkb2NFbGVtLnNjcm9sbExlZnQsIGJvZHkuc2Nyb2xsTGVmdCApOworCQl9CisKKwkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKKwl9OworfQorCitqUXVlcnkub2Zmc2V0ID0geworCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgeworCQl2YXIgYm9keSA9IGRvY3VtZW50LmJvZHksIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLCBpbm5lckRpdiwgY2hlY2tEaXYsIHRhYmxlLCB0ZCwgYm9keU1hcmdpblRvcCA9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgIm1hcmdpblRvcCIpICkgfHwgMCwKKwkJCWh0bWwgPSAiPGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Jz48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJsZSBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IjsKKworCQlqUXVlcnkuZXh0ZW5kKCBjb250YWluZXIuc3R5bGUsIHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHRvcDogMCwgbGVmdDogMCwgbWFyZ2luOiAwLCBib3JkZXI6IDAsIHdpZHRoOiAiMXB4IiwgaGVpZ2h0OiAiMXB4IiwgdmlzaWJpbGl0eTogImhpZGRlbiIgfSApOworCisJCWNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOworCQlib2R5Lmluc2VydEJlZm9yZSggY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQgKTsKKwkJaW5uZXJEaXYgPSBjb250YWluZXIuZmlyc3RDaGlsZDsKKwkJY2hlY2tEaXYgPSBpbm5lckRpdi5maXJzdENoaWxkOworCQl0ZCA9IGlubmVyRGl2Lm5leHRTaWJsaW5nLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDsKKworCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKKwkJdGhpcy5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscyA9ICh0ZC5vZmZzZXRUb3AgPT09IDUpOworCisJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKKwkJY2hlY2tEaXYuc3R5bGUudG9wID0gIjIwcHgiOworCisJCS8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAorCQl0aGlzLnN1cHBvcnRzRml4ZWRQb3NpdGlvbiA9IChjaGVja0Rpdi5vZmZzZXRUb3AgPT09IDIwIHx8IGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMTUpOworCQljaGVja0Rpdi5zdHlsZS5wb3NpdGlvbiA9IGNoZWNrRGl2LnN0eWxlLnRvcCA9ICIiOworCisJCWlubmVyRGl2LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisJCWlubmVyRGl2LnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKworCQl0aGlzLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSA9IChjaGVja0Rpdi5vZmZzZXRUb3AgPT09IC01KTsKKworCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wICE9PSBib2R5TWFyZ2luVG9wKTsKKworCQlib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKKwkJYm9keSA9IGNvbnRhaW5lciA9IGlubmVyRGl2ID0gY2hlY2tEaXYgPSB0YWJsZSA9IHRkID0gbnVsbDsKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplID0galF1ZXJ5Lm5vb3A7CisJfSwKKworCWJvZHlPZmZzZXQ6IGZ1bmN0aW9uKCBib2R5ICkgeworCQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsCisJCQlsZWZ0ID0gYm9keS5vZmZzZXRMZWZ0OworCisJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOworCisJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApIHsKKwkJCXRvcCAgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luVG9wIikgKSB8fCAwOworCQkJbGVmdCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5MZWZ0IikgKSB8fCAwOworCQl9CisKKwkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKKwl9LAorCQorCXNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7CisJCXZhciBwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKTsKKworCQkvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCisJCWlmICggcG9zaXRpb24gPT09ICJzdGF0aWMiICkgeworCQkJZWxlbS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJCX0KKworCQl2YXIgY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAorCQkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKSwKKwkJCWN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sICJ0b3AiICksCisJCQljdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgImxlZnQiICksCisJCQljYWxjdWxhdGVQb3NpdGlvbiA9IChwb3NpdGlvbiA9PT0gImFic29sdXRlIiAmJiBqUXVlcnkuaW5BcnJheSgnYXV0bycsIFtjdXJDU1NUb3AsIGN1ckNTU0xlZnRdKSA+IC0xKSwKKwkJCXByb3BzID0ge30sIGN1clBvc2l0aW9uID0ge30sIGN1clRvcCwgY3VyTGVmdDsKKworCQkvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBhYnNvbHV0ZQorCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgeworCQkJY3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7CisJCX0KKworCQljdXJUb3AgID0gY2FsY3VsYXRlUG9zaXRpb24gPyBjdXJQb3NpdGlvbi50b3AgIDogcGFyc2VJbnQoIGN1ckNTU1RvcCwgIDEwICkgfHwgMDsKKwkJY3VyTGVmdCA9IGNhbGN1bGF0ZVBvc2l0aW9uID8gY3VyUG9zaXRpb24ubGVmdCA6IHBhcnNlSW50KCBjdXJDU1NMZWZ0LCAxMCApIHx8IDA7CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkgeworCQkJb3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7CisJCX0KKworCQlpZiAob3B0aW9ucy50b3AgIT0gbnVsbCkgeworCQkJcHJvcHMudG9wID0gKG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCkgKyBjdXJUb3A7CisJCX0KKwkJaWYgKG9wdGlvbnMubGVmdCAhPSBudWxsKSB7CisJCQlwcm9wcy5sZWZ0ID0gKG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0KSArIGN1ckxlZnQ7CisJCX0KKwkJCisJCWlmICggInVzaW5nIiBpbiBvcHRpb25zICkgeworCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOworCQl9IGVsc2UgeworCQkJY3VyRWxlbS5jc3MoIHByb3BzICk7CisJCX0KKwl9Cit9OworCisKK2pRdWVyeS5mbi5leHRlbmQoeworCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKwkJaWYgKCAhdGhpc1swXSApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJdmFyIGVsZW0gPSB0aGlzWzBdLAorCisJCS8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CisJCW9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCksCisKKwkJLy8gR2V0IGNvcnJlY3Qgb2Zmc2V0cworCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAorCQlwYXJlbnRPZmZzZXQgPSBycm9vdC50ZXN0KG9mZnNldFBhcmVudFswXS5ub2RlTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOworCisJCS8vIFN1YnRyYWN0IGVsZW1lbnQgbWFyZ2lucworCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdAorCQkvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5jb3JyZWN0bHkgYmUgMAorCQlvZmZzZXQudG9wICAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGVsZW0sICJtYXJnaW5Ub3AiKSApIHx8IDA7CisJCW9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgIm1hcmdpbkxlZnQiKSApIHx8IDA7CisKKwkJLy8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzCisJCXBhcmVudE9mZnNldC50b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCAiYm9yZGVyVG9wV2lkdGgiKSApIHx8IDA7CisJCXBhcmVudE9mZnNldC5sZWZ0ICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCAiYm9yZGVyTGVmdFdpZHRoIikgKSB8fCAwOworCisJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cworCQlyZXR1cm4geworCQkJdG9wOiAgb2Zmc2V0LnRvcCAgLSBwYXJlbnRPZmZzZXQudG9wLAorCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAorCQl9OworCX0sCisKKwlvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7CisJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKKwkJCXdoaWxlICggb2Zmc2V0UGFyZW50ICYmICghcnJvb3QudGVzdChvZmZzZXRQYXJlbnQubm9kZU5hbWUpICYmIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50LCAicG9zaXRpb24iKSA9PT0gInN0YXRpYyIpICkgeworCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7CisJCQl9CisJCQlyZXR1cm4gb2Zmc2V0UGFyZW50OworCQl9KTsKKwl9Cit9KTsKKworCisvLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVyeS5lYWNoKCBbIkxlZnQiLCAiVG9wIl0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCXZhciBtZXRob2QgPSAic2Nyb2xsIiArIG5hbWU7CisKKwlqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24odmFsKSB7CisJCXZhciBlbGVtID0gdGhpc1swXSwgd2luOworCQkKKwkJaWYgKCAhZWxlbSApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJaWYgKCB2YWwgIT09IHVuZGVmaW5lZCApIHsKKwkJCS8vIFNldCB0aGUgc2Nyb2xsIG9mZnNldAorCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQl3aW4gPSBnZXRXaW5kb3coIHRoaXMgKTsKKworCQkJCWlmICggd2luICkgeworCQkJCQl3aW4uc2Nyb2xsVG8oCisJCQkJCQkhaSA/IHZhbCA6IGpRdWVyeSh3aW4pLnNjcm9sbExlZnQoKSwKKwkJCQkJCSBpID8gdmFsIDogalF1ZXJ5KHdpbikuc2Nyb2xsVG9wKCkKKwkJCQkJKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXNbIG1ldGhvZCBdID0gdmFsOworCQkJCX0KKwkJCX0pOworCQl9IGVsc2UgeworCQkJd2luID0gZ2V0V2luZG93KCBlbGVtICk7CisKKwkJCS8vIFJldHVybiB0aGUgc2Nyb2xsIG9mZnNldAorCQkJcmV0dXJuIHdpbiA/ICgicGFnZVhPZmZzZXQiIGluIHdpbikgPyB3aW5bIGkgPyAicGFnZVlPZmZzZXQiIDogInBhZ2VYT2Zmc2V0IiBdIDoKKwkJCQlqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSB8fAorCQkJCQl3aW4uZG9jdW1lbnQuYm9keVsgbWV0aG9kIF0gOgorCQkJCWVsZW1bIG1ldGhvZCBdOworCQl9CisJfTsKK30pOworCitmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CisJcmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8KKwkJZWxlbSA6CisJCWVsZW0ubm9kZVR5cGUgPT09IDkgPworCQkJZWxlbS5kZWZhdWx0VmlldyB8fCBlbGVtLnBhcmVudFdpbmRvdyA6CisJCQlmYWxzZTsKK30KKworCisKKworLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCitqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCisJdmFyIHR5cGUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisKKwkvLyBpbm5lckhlaWdodCBhbmQgaW5uZXJXaWR0aAorCWpRdWVyeS5mblsiaW5uZXIiICsgbmFtZV0gPSBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXNbMF0gPworCQkJcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggdGhpc1swXSwgdHlwZSwgInBhZGRpbmciICkgKSA6CisJCQludWxsOworCX07CisKKwkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAorCWpRdWVyeS5mblsib3V0ZXIiICsgbmFtZV0gPSBmdW5jdGlvbiggbWFyZ2luICkgeworCQlyZXR1cm4gdGhpc1swXSA/CisJCQlwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlLCBtYXJnaW4gPyAibWFyZ2luIiA6ICJib3JkZXIiICkgKSA6CisJCQludWxsOworCX07CisKKwlqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBzaXplICkgeworCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAorCQl2YXIgZWxlbSA9IHRoaXNbMF07CisJCWlmICggIWVsZW0gKSB7CisJCQlyZXR1cm4gc2l6ZSA9PSBudWxsID8gbnVsbCA6IHRoaXM7CisJCX0KKwkJCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNpemUgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKKwkJCQlzZWxmWyB0eXBlIF0oIHNpemUuY2FsbCggdGhpcywgaSwgc2VsZlsgdHlwZSBdKCkgKSApOworCQkJfSk7CisJCX0KKworCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgeworCQkJLy8gRXZlcnlvbmUgZWxzZSB1c2UgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LmJvZHkgZGVwZW5kaW5nIG9uIFF1aXJrcyB2cyBTdGFuZGFyZHMgbW9kZQorCQkJcmV0dXJuIGVsZW0uZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gIkNTUzFDb21wYXQiICYmIGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUgXSB8fAorCQkJCWVsZW0uZG9jdW1lbnQuYm9keVsgImNsaWVudCIgKyBuYW1lIF07CisKKwkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAorCQl9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkgeworCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlcgorCQkJcmV0dXJuIE1hdGgubWF4KAorCQkJCWVsZW0uZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiICsgbmFtZV0sCisJCQkJZWxlbS5ib2R5WyJzY3JvbGwiICsgbmFtZV0sIGVsZW0uZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiICsgbmFtZV0sCisJCQkJZWxlbS5ib2R5WyJvZmZzZXQiICsgbmFtZV0sIGVsZW0uZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KKwkJCSk7CisKKwkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKKwkJfSBlbHNlIGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgeworCQkJdmFyIG9yaWcgPSBqUXVlcnkuY3NzKCBlbGVtLCB0eXBlICksCisJCQkJcmV0ID0gcGFyc2VGbG9hdCggb3JpZyApOworCisJCQlyZXR1cm4galF1ZXJ5LmlzTmFOKCByZXQgKSA/IG9yaWcgOiByZXQ7CisKKwkJLy8gU2V0IHRoZSB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQgKGRlZmF1bHQgdG8gcGl4ZWxzIGlmIHZhbHVlIGlzIHVuaXRsZXNzKQorCQl9IGVsc2UgeworCQkJcmV0dXJuIHRoaXMuY3NzKCB0eXBlLCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBzaXplIDogc2l6ZSArICJweCIgKTsKKwkJfQorCX07CisKK30pOworCisKK30pKHdpbmRvdyk7CmRpZmYgLS1naXQgYS95MjAxNS9odHRwX3N0YXR1cy93d3cvbGliL3JlY29ubmVjdGluZy13ZWJzb2NrZXQubWluLmpzIGIveTIwMTUvaHR0cF9zdGF0dXMvd3d3L2xpYi9yZWNvbm5lY3Rpbmctd2Vic29ja2V0Lm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDBiNmM3Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvaHR0cF9zdGF0dXMvd3d3L2xpYi9yZWNvbm5lY3Rpbmctd2Vic29ja2V0Lm1pbi5qcwpAQCAtMCwwICsxLDk2IEBACisvLyBNSVQgTGljZW5zZToKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiwgSm9lIFdhbG5lcworLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKy8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisvLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisvLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisvLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKy8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisvLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKy8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKy8vIFRIRSBTT0ZUV0FSRS4KKworLyoqCisgKiBUaGlzIGJlaGF2ZXMgbGlrZSBhIFdlYlNvY2tldCBpbiBldmVyeSB3YXksIGV4Y2VwdCBpZiBpdCBmYWlscyB0byBjb25uZWN0LAorICogb3IgaXQgZ2V0cyBkaXNjb25uZWN0ZWQsIGl0IHdpbGwgcmVwZWF0ZWRseSBwb2xsIHVudGlsIGl0IHN1Y2Nlc3NmdWxseSBjb25uZWN0cworICogYWdhaW4uCisgKgorICogSXQgaXMgQVBJIGNvbXBhdGlibGUsIHNvIHdoZW4geW91IGhhdmU6CisgKiAgIHdzID0gbmV3IFdlYlNvY2tldCgnd3M6Ly8uLi4uJyk7CisgKiB5b3UgY2FuIHJlcGxhY2Ugd2l0aDoKKyAqICAgd3MgPSBuZXcgUmVjb25uZWN0aW5nV2ViU29ja2V0KCd3czovLy4uLi4nKTsKKyAqCisgKiBUaGUgZXZlbnQgc3RyZWFtIHdpbGwgdHlwaWNhbGx5IGxvb2sgbGlrZToKKyAqICBvbmNvbm5lY3RpbmcKKyAqICBvbm9wZW4KKyAqICBvbm1lc3NhZ2UKKyAqICBvbm1lc3NhZ2UKKyAqICBvbmNsb3NlIC8vIGxvc3QgY29ubmVjdGlvbgorICogIG9uY29ubmVjdGluZworICogIG9ub3BlbiAgLy8gc29tZXRpbWUgbGF0ZXIuLi4KKyAqICBvbm1lc3NhZ2UKKyAqICBvbm1lc3NhZ2UKKyAqICBldGMuLi4KKyAqCisgKiBJdCBpcyBBUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBXZWJTb2NrZXQgQVBJLCBhcGFydCBmcm9tIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKKyAqCisgKiAtIGBidWZmZXJlZEFtb3VudGAKKyAqIC0gYGV4dGVuc2lvbnNgCisgKiAtIGBiaW5hcnlUeXBlYAorICoKKyAqIExhdGVzdCB2ZXJzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vam9ld2FsbmVzL3JlY29ubmVjdGluZy13ZWJzb2NrZXQvCisgKiAtIEpvZSBXYWxuZXMKKyAqCisgKiBTeW50YXgKKyAqID09PT09PQorICogdmFyIHNvY2tldCA9IG5ldyBSZWNvbm5lY3RpbmdXZWJTb2NrZXQodXJsLCBwcm90b2NvbHMsIG9wdGlvbnMpOworICoKKyAqIFBhcmFtZXRlcnMKKyAqID09PT09PT09PT0KKyAqIHVybCAtIFRoZSB1cmwgeW91IGFyZSBjb25uZWN0aW5nIHRvLgorICogcHJvdG9jb2xzIC0gT3B0aW9uYWwgc3RyaW5nIG9yIGFycmF5IG9mIHByb3RvY29scy4KKyAqIG9wdGlvbnMgLSBTZWUgYmVsb3cKKyAqCisgKiBPcHRpb25zCisgKiA9PT09PT09CisgKiBPcHRpb25zIGNhbiBlaXRoZXIgYmUgcGFzc2VkIHVwb24gaW5zdGFudGlhdGlvbiBvciBzZXQgYWZ0ZXIgaW5zdGFudGlhdGlvbjoKKyAqCisgKiB2YXIgc29ja2V0ID0gbmV3IFJlY29ubmVjdGluZ1dlYlNvY2tldCh1cmwsIG51bGwsIHsgZGVidWc6IHRydWUsIHJlY29ubmVjdEludGVydmFsOiA0MDAwIH0pOworICoKKyAqIG9yCisgKgorICogdmFyIHNvY2tldCA9IG5ldyBSZWNvbm5lY3RpbmdXZWJTb2NrZXQodXJsKTsKKyAqIHNvY2tldC5kZWJ1ZyA9IHRydWU7CisgKiBzb2NrZXQucmVjb25uZWN0SW50ZXJ2YWwgPSA0MDAwOworICoKKyAqIGRlYnVnCisgKiAtIFdoZXRoZXIgdGhpcyBpbnN0YW5jZSBzaG91bGQgbG9nIGRlYnVnIG1lc3NhZ2VzLiBBY2NlcHRzIHRydWUgb3IgZmFsc2UuIERlZmF1bHQ6IGZhbHNlLgorICoKKyAqIGF1dG9tYXRpY09wZW4KKyAqIC0gV2hldGhlciBvciBub3QgdGhlIHdlYnNvY2tldCBzaG91bGQgYXR0ZW1wdCB0byBjb25uZWN0IGltbWVkaWF0ZWx5IHVwb24gaW5zdGFudGlhdGlvbi4gVGhlIHNvY2tldCBjYW4gYmUgbWFudWFsbHkgb3BlbmVkIG9yIGNsb3NlZCBhdCBhbnkgdGltZSB1c2luZyB3cy5vcGVuKCkgYW5kIHdzLmNsb3NlKCkuCisgKgorICogcmVjb25uZWN0SW50ZXJ2YWwKKyAqIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVjb25uZWN0LiBBY2NlcHRzIGludGVnZXIuIERlZmF1bHQ6IDEwMDAuCisgKgorICogbWF4UmVjb25uZWN0SW50ZXJ2YWwKKyAqIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBhIHJlY29ubmVjdGlvbiBhdHRlbXB0LiBBY2NlcHRzIGludGVnZXIuIERlZmF1bHQ6IDMwMDAwLgorICoKKyAqIHJlY29ubmVjdERlY2F5CisgKiAtIFRoZSByYXRlIG9mIGluY3JlYXNlIG9mIHRoZSByZWNvbm5lY3QgZGVsYXkuIEFsbG93cyByZWNvbm5lY3QgYXR0ZW1wdHMgdG8gYmFjayBvZmYgd2hlbiBwcm9ibGVtcyBwZXJzaXN0LiBBY2NlcHRzIGludGVnZXIgb3IgZmxvYXQuIERlZmF1bHQ6IDEuNS4KKyAqCisgKiB0aW1lb3V0SW50ZXJ2YWwKKyAqIC0gVGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYSBjb25uZWN0aW9uIHRvIHN1Y2NlZWQgYmVmb3JlIGNsb3NpbmcgYW5kIHJldHJ5aW5nLiBBY2NlcHRzIGludGVnZXIuIERlZmF1bHQ6IDIwMDAuCisgKgorICovCisKKyFmdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGIpOiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1iKCk6YS5SZWNvbm5lY3RpbmdXZWJTb2NrZXQ9YigpfSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMsZCl7ZnVuY3Rpb24gbChhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO3JldHVybiBjLmluaXRDdXN0b21FdmVudChhLCExLCExLGIpLGN9dmFyIGU9e2RlYnVnOiExLGF1dG9tYXRpY09wZW46ITAscmVjb25uZWN0SW50ZXJ2YWw6MWUzLG1heFJlY29ubmVjdEludGVydmFsOjNlNCxyZWNvbm5lY3REZWNheToxLjUsdGltZW91dEludGVydmFsOjJlM307ZHx8KGQ9e30pO2Zvcih2YXIgZiBpbiBlKXRoaXNbZl09InVuZGVmaW5lZCIhPXR5cGVvZiBkW2ZdP2RbZl06ZVtmXTt0aGlzLnVybD1iLHRoaXMucmVjb25uZWN0QXR0ZW1wdHM9MCx0aGlzLnJlYWR5U3RhdGU9V2ViU29ja2V0LkNPTk5FQ1RJTkcsdGhpcy5wcm90b2NvbD1udWxsO3ZhciBoLGc9dGhpcyxpPSExLGo9ITEsaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLGZ1bmN0aW9uKGEpe2cub25vcGVuKGEpfSksay5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oYSl7Zy5vbmNsb3NlKGEpfSksay5hZGRFdmVudExpc3RlbmVyKCJjb25uZWN0aW5nIixmdW5jdGlvbihhKXtnLm9uY29ubmVjdGluZyhhKX0pLGsuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7Zy5vbm1lc3NhZ2UoYSl9KSxrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihhKXtnLm9uZXJyb3IoYSl9KSx0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ay5hZGRFdmVudExpc3RlbmVyLmJpbmQoayksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWsucmVtb3ZlRXZlbnRMaXN0ZW5lci5iaW5kKGspLHRoaXMuZGlzcGF0Y2hFdmVudD1rLmRpc3BhdGNoRXZlbnQuYmluZChrKSx0aGlzLm9wZW49ZnVuY3Rpb24oYil7aD1uZXcgV2ViU29ja2V0KGcudXJsLGN8fFtdKSxifHxrLmRpc3BhdGNoRXZlbnQobCgiY29ubmVjdGluZyIpKSwoZy5kZWJ1Z3x8YS5kZWJ1Z0FsbCkmJmNvbnNvbGUuZGVidWcoIlJlY29ubmVjdGluZ1dlYlNvY2tldCIsImF0dGVtcHQtY29ubmVjdCIsZy51cmwpO3ZhciBkPWgsZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7KGcuZGVidWd8fGEuZGVidWdBbGwpJiZjb25zb2xlLmRlYnVnKCJSZWNvbm5lY3RpbmdXZWJTb2NrZXQiLCJjb25uZWN0aW9uLXRpbWVvdXQiLGcudXJsKSxqPSEwLGQuY2xvc2UoKSxqPSExfSxnLnRpbWVvdXRJbnRlcnZhbCk7aC5vbm9wZW49ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZSksKGcuZGVidWd8fGEuZGVidWdBbGwpJiZjb25zb2xlLmRlYnVnKCJSZWNvbm5lY3RpbmdXZWJTb2NrZXQiLCJvbm9wZW4iLGcudXJsKSxnLnByb3RvY29sPWgucHJvdG9jb2wsZy5yZWFkeVN0YXRlPVdlYlNvY2tldC5PUEVOLGcucmVjb25uZWN0QXR0ZW1wdHM9MDt2YXIgZD1sKCJvcGVuIik7ZC5pc1JlY29ubmVjdD1iLGI9ITEsay5kaXNwYXRjaEV2ZW50KGQpfSxoLm9uY2xvc2U9ZnVuY3Rpb24oYyl7aWYoY2xlYXJUaW1lb3V0KGUpLGg9bnVsbCxpKWcucmVhZHlTdGF0ZT1XZWJTb2NrZXQuQ0xPU0VELGsuZGlzcGF0Y2hFdmVudChsKCJjbG9zZSIpKTtlbHNle2cucmVhZHlTdGF0ZT1XZWJTb2NrZXQuQ09OTkVDVElORzt2YXIgZD1sKCJjb25uZWN0aW5nIik7ZC5jb2RlPWMuY29kZSxkLnJlYXNvbj1jLnJlYXNvbixkLndhc0NsZWFuPWMud2FzQ2xlYW4say5kaXNwYXRjaEV2ZW50KGQpLGJ8fGp8fCgoZy5kZWJ1Z3x8YS5kZWJ1Z0FsbCkmJmNvbnNvbGUuZGVidWcoIlJlY29ubmVjdGluZ1dlYlNvY2tldCIsIm9uY2xvc2UiLGcudXJsKSxrLmRpc3BhdGNoRXZlbnQobCgiY2xvc2UiKSkpO3ZhciBlPWcucmVjb25uZWN0SW50ZXJ2YWwqTWF0aC5wb3coZy5yZWNvbm5lY3REZWNheSxnLnJlY29ubmVjdEF0dGVtcHRzKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5yZWNvbm5lY3RBdHRlbXB0cysrLGcub3BlbighMCl9LGU+Zy5tYXhSZWNvbm5lY3RJbnRlcnZhbD9nLm1heFJlY29ubmVjdEludGVydmFsOmUpfX0saC5vbm1lc3NhZ2U9ZnVuY3Rpb24oYil7KGcuZGVidWd8fGEuZGVidWdBbGwpJiZjb25zb2xlLmRlYnVnKCJSZWNvbm5lY3RpbmdXZWJTb2NrZXQiLCJvbm1lc3NhZ2UiLGcudXJsLGIuZGF0YSk7dmFyIGM9bCgibWVzc2FnZSIpO2MuZGF0YT1iLmRhdGEsay5kaXNwYXRjaEV2ZW50KGMpfSxoLm9uZXJyb3I9ZnVuY3Rpb24oYil7KGcuZGVidWd8fGEuZGVidWdBbGwpJiZjb25zb2xlLmRlYnVnKCJSZWNvbm5lY3RpbmdXZWJTb2NrZXQiLCJvbmVycm9yIixnLnVybCxiKSxrLmRpc3BhdGNoRXZlbnQobCgiZXJyb3IiKSl9fSwxPT10aGlzLmF1dG9tYXRpY09wZW4mJnRoaXMub3BlbighMSksdGhpcy5zZW5kPWZ1bmN0aW9uKGIpe2lmKGgpcmV0dXJuKGcuZGVidWd8fGEuZGVidWdBbGwpJiZjb25zb2xlLmRlYnVnKCJSZWNvbm5lY3RpbmdXZWJTb2NrZXQiLCJzZW5kIixnLnVybCxiKSxoLnNlbmQoYik7dGhyb3ciSU5WQUxJRF9TVEFURV9FUlIgOiBQYXVzaW5nIHRvIHJlY29ubmVjdCB3ZWJzb2NrZXQifSx0aGlzLmNsb3NlPWZ1bmN0aW9uKGEsYil7InVuZGVmaW5lZCI9PXR5cGVvZiBhJiYoYT0xZTMpLGk9ITAsaCYmaC5jbG9zZShhLGIpfSx0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXtoJiZoLmNsb3NlKCl9fXJldHVybiBhLnByb3RvdHlwZS5vbm9wZW49ZnVuY3Rpb24oKXt9LGEucHJvdG90eXBlLm9uY2xvc2U9ZnVuY3Rpb24oKXt9LGEucHJvdG90eXBlLm9uY29ubmVjdGluZz1mdW5jdGlvbigpe30sYS5wcm90b3R5cGUub25tZXNzYWdlPWZ1bmN0aW9uKCl7fSxhLnByb3RvdHlwZS5vbmVycm9yPWZ1bmN0aW9uKCl7fSxhLmRlYnVnQWxsPSExLGEuQ09OTkVDVElORz1XZWJTb2NrZXQuQ09OTkVDVElORyxhLk9QRU49V2ViU29ja2V0Lk9QRU4sYS5DTE9TSU5HPVdlYlNvY2tldC5DTE9TSU5HLGEuQ0xPU0VEPVdlYlNvY2tldC5DTE9TRUQsYX0pOwpkaWZmIC0tZ2l0IGEveTIwMTUvaHR0cF9zdGF0dXMvd3d3X2RlZmF1bHRzL180MDQucG5nIGIveTIwMTUvaHR0cF9zdGF0dXMvd3d3X2RlZmF1bHRzL180MDQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDNjYjgKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvXzQwNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveTIwMTUvaHR0cF9zdGF0dXMvd3d3X2RlZmF1bHRzL19lcnJvci5jc3MgYi95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvX2Vycm9yLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjVkMGE0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvaHR0cF9zdGF0dXMvd3d3X2RlZmF1bHRzL19lcnJvci5jc3MKQEAgLTAsMCArMSw2MCBAQAorLyoKK0Zyb20gU2Vhc29ja3MgdmVyc2lvbiAxLjEuMiwgdW5kZXIgL3NyYy9tYWluL3dlYgorCitDb3B5cmlnaHQgKGMpIDIwMTMsIE1hdHQgR29kYm9sdAorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKK1JlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKK2xpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIAorb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgCitGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIAorU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgCitDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCAKK09SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIAorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK2JvZHkgeworICAgIGZvbnQtZmFtaWx5OiBzZWdvZSB1aSwgdGFob21hLCBhcmlhbCwgc2Fucy1zZXJpZjsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzIxZTI5OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworYSB7CisgICAgY29sb3I6ICNmZmZmMDA7Cit9CisKKy5mb290ZXIgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLm1lc3NhZ2UgeworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICBib3JkZXI6IDFweCBzb2xpZCB3aGl0ZTsKKyAgICBwYWRkaW5nOiA1MHB4OworICAgIGZvbnQtc2l6ZTogMjBweDsKK30KKworLmhlYWRsaW5lIHsKKyAgICBwYWRkaW5nOiA1MHB4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIGZvbnQtc2l6ZTogMzJweDsKK30KKworLmZvb3RlciB7CisgICAgcGFkZGluZy10b3A6IDUwcHg7CisgICAgZm9udC1zaXplOiAxMnB4OworfQorCmRpZmYgLS1naXQgYS95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvX2Vycm9yLmh0bWwgYi95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvX2Vycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkNDIyZAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2h0dHBfc3RhdHVzL3d3d19kZWZhdWx0cy9fZXJyb3IuaHRtbApAQCAtMCwwICsxLDQyIEBACis8IS0tCitGcm9tIFNlYXNvY2tzIHZlcnNpb24gMS4xLjIsIHVuZGVyIC9zcmMvbWFpbi93ZWIKKworQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCitSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCitsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KK1JlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKK2xpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciAKK290aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIAorRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgCitEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiAKK1NFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIAorQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgCitPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSAKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCistLT4KKworPGh0bWwgRE9DVFlQRT1odG1sPgorPGhlYWQ+CisgIDx0aXRsZT4lJUVSUk9SQ09ERSUlIC0gJSVNRVNTQUdFJSUgLSBLZWVwIENhbG0gQW5kIENhcnJ5IE9uITwvdGl0bGU+CisgIDxsaW5rIGhyZWY9Ii9fZXJyb3IuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorPC9oZWFkPgorPGJvZHk+CisgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgorICAgIDxpbWcgc3JjPSIvXzQwNC5wbmciIGhlaWdodD0iMjAwIiB3aWR0aD0iMTA3Ij4KKyAgICA8ZGl2IGNsYXNzPSJoZWFkbGluZSI+SFRUUF9TVEFUVVM6ICUlRVJST1JDT0RFJSUgJiM4MjEyOyAlJU1FU1NBR0UlJTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImluZm8iPiUlQk9EWSUlPC9kaXY+CisgIDwvZGl2PgorCisgIDxkaXYgY2xhc3M9ImZvb3RlciI+aHR0cF9zdGF0dXMgZGV2ZWxvcGVkIGJ5IDk3MSBTcGFydGFuIFJvYm90aWNzLiBTZXJ2ZXIgcG93ZXJlZCBieSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWF0dGdvZGJvbHQvc2Vhc29ja3MiPlNlYVNvY2tzPC9hPi4gQ29udGFjdCBDb21yYW4gTW9yc2hlZChjb21yYW5tb3JzaEBnbWFpbC5jb20pIGlmIHRoaXMgNDA0IGVycm9yIHNob3VsZCBub3QgYmUgaGFwcGVuaW5nLi4uPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvX3NlYXNvY2tzLmNzcyBiL3kyMDE1L2h0dHBfc3RhdHVzL3d3d19kZWZhdWx0cy9fc2Vhc29ja3MuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMGI2NTUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvX3NlYXNvY2tzLmNzcwpAQCAtMCwwICsxLDQ5IEBACisvKgorRnJvbSBTZWFzb2NrcyB2ZXJzaW9uIDEuMS4yLCB1bmRlciAvc3JjL21haW4vd2ViCisKK0NvcHlyaWdodCAoYykgMjAxMywgTWF0dCBHb2Rib2x0CitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCitSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCitsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3IgCitvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSAKK0ZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIAorREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgCitTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiAKK0NBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIAorT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworYm9keSB7CisgICAgZm9udC1mYW1pbHk6IHNlZ29lIHVpLCB0YWhvbWEsIGFyaWFsLCBzYW5zLXNlcmlmOworICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOworICAgIG1hcmdpbjogMDsKK30KKworYSB7CisgICAgY29sb3I6ICNmZmZmMDA7Cit9CisKK3RhYmxlIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIHdpZHRoOiAxMDAlOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLnRlbXBsYXRlIHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCmRpZmYgLS1naXQgYS95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvX3N0YXRzLmh0bWwgYi95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvX3N0YXRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5MDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L2h0dHBfc3RhdHVzL3d3d19kZWZhdWx0cy9fc3RhdHMuaHRtbApAQCAtMCwwICsxLDg4IEBACis8IS0tCitGcm9tIFNlYXNvY2tzIHZlcnNpb24gMS4xLjIsIHVuZGVyIC9zcmMvbWFpbi93ZWIKKworQ29weXJpZ2h0IChjKSAyMDEzLCBNYXR0IEdvZGJvbHQKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCitSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgCitsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KK1JlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKK2xpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciAKK290aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIAorRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgCitEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiAKK1NFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIAorQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgCitPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSAKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCistLT4KKworPGh0bWwgRE9DVFlQRT1odG1sPgorPGhlYWQ+CisgIDx0aXRsZT5TZWFTb2NrcyBTdGF0czwvdGl0bGU+CisgIDxsaW5rIGhyZWY9Ii9fc2Vhc29ja3MuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICA8c2NyaXB0IHNyYz0iL19qcXVlcnkubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0PgorICBmdW5jdGlvbiBjbGVhcigpIHsKKyAgICAkKCcjY3ggdGJvZHkgdHI6dmlzaWJsZScpLnJlbW92ZSgpOworICB9CisgIGZ1bmN0aW9uIGNvbm5lY3Rpb24oc3RhdHMpIHsKKyAgICBjID0gJCgnI2N4IC50ZW1wbGF0ZScpLmNsb25lKCkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJykuYXBwZW5kVG8oJyNjeCcpOworICAgIGZvciAoc3RhdCBpbiBzdGF0cykgeworICAgICAgYy5maW5kKCcuJyArIHN0YXQpLnRleHQoc3RhdHNbc3RhdF0pOworICAgIH0KKyAgfQorICBmdW5jdGlvbiByZWZyZXNoKCkgeworICAgIHZhciBzdGF0cyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICAgIHN0YXRzLm9wZW4oIkdFVCIsICIvX2xpdmVzdGF0cy5qcyIsIGZhbHNlKTsKKyAgICBzdGF0cy5zZW5kKG51bGwpOworICAgIGV2YWwoc3RhdHMucmVzcG9uc2VUZXh0KTsKKyAgfQorICAkKGZ1bmN0aW9uKCkgeworICAgIHNldEludGVydmFsKHJlZnJlc2gsIDEwMDApOworICAgIHJlZnJlc2goKTsKKyAgfSk7CisgIDwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+PGgxPlNlYVNvY2tzIFN0YXRzPC9oMT48L2JvZHk+CisKKzxoMj5Db25uZWN0aW9uczwvaDI+Cis8dGFibGUgaWQ9ImN4Ij4KKyAgPHRoZWFkPgorICAgIDx0cj4KKyAgICAgIDx0aD5Db25uZWN0aW9uIHRpbWU8L3RoPgorICAgICAgPHRoPkZkPC90aD4KKyAgICAgIDx0aD5BZGRyPC90aD4KKyAgICAgIDx0aD5VUkk8L3RoPgorICAgICAgPHRoPlVzZXJuYW1lPC90aD4KKyAgICAgIDx0aD5QZW5kaW5nIHJlYWQ8L3RoPgorICAgICAgPHRoPkJ5dGVzIHJlYWQ8L3RoPgorICAgICAgPHRoPlBlbmRpbmcgc2VuZDwvdGg+CisgICAgICA8dGg+Qnl0ZXMgc2VudDwvdGg+CisgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgorICAgIDx0ciBjbGFzcz0idGVtcGxhdGUiPgorICAgICAgPHRkIGNsYXNzPSJzaW5jZSI+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0iZmQiPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImFkZHIiPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9InVyaSI+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0idXNlciI+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0iaW5wdXQiPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9InJlYWQiPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9Im91dHB1dCI+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0id3JpdHRlbiI+PC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEveTIwMTUvaHR0cF9zdGF0dXMvd3d3X2RlZmF1bHRzL2Zhdmljb24uaWNvIGIveTIwMTUvaHR0cF9zdGF0dXMvd3d3X2RlZmF1bHRzL2Zhdmljb24uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTk1YjkKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9odHRwX3N0YXR1cy93d3dfZGVmYXVsdHMvZmF2aWNvbi5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveTIwMTUvam95c3RpY2tfcmVhZGVyLmNjIGIveTIwMTUvam95c3RpY2tfcmVhZGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjU0MzEKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9qb3lzdGlja19yZWFkZXIuY2MKQEAgLTAsMCArMSw1NDkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvcHJpbWUvaW5wdXQvam95c3RpY2tfaW5wdXQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2lucHV0L2RyaXZlcl9zdGF0aW9uX2RhdGEuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9jb21tb24vdXRpbC9sb2dfaW50ZXJ2YWwuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5oIgorCisjaW5jbHVkZSAieTIwMTUvY29udHJvbF9sb29wcy9jbGF3L2NsYXcucS5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UucS5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImZyYzk3MS9xdWV1ZXMvZ3lyby5xLmgiCisjaW5jbHVkZSAiZnJjOTcxL2F1dG9ub21vdXMvYXV0by5xLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL3BpY2t1cF9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9zdGFja19hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9zY29yZV9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9zdGFja19hbmRfbGlmdF9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9zdGFja19hbmRfaG9sZF9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9oZWxkX3RvX2xpZnRfYWN0b3IuaCIKKyNpbmNsdWRlICJ5MjAxNS9hY3RvcnMvbGlmdF9hY3Rvci5oIgorI2luY2x1ZGUgInkyMDE1L2FjdG9ycy9jYW5fcGlja3VwX2FjdG9yLmgiCisjaW5jbHVkZSAieTIwMTUvYWN0b3JzL2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rvci5oIgorCit1c2luZyA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6Y2xhd19xdWV1ZTsKK3VzaW5nIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlOwordXNpbmcgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZTsKK3VzaW5nIDo6ZnJjOTcxOjpzZW5zb3JzOjpneXJvX3JlYWRpbmc7CisKK3VzaW5nIDo6YW9zOjppbnB1dDo6ZHJpdmVyX3N0YXRpb246OkJ1dHRvbkxvY2F0aW9uOwordXNpbmcgOjphb3M6OmlucHV0Ojpkcml2ZXJfc3RhdGlvbjo6UE9WTG9jYXRpb247Cit1c2luZyA6OmFvczo6aW5wdXQ6OmRyaXZlcl9zdGF0aW9uOjpKb3lzdGlja0F4aXM7Cit1c2luZyA6OmFvczo6aW5wdXQ6OmRyaXZlcl9zdGF0aW9uOjpDb250cm9sQml0OworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSBpbnB1dCB7CituYW1lc3BhY2Ugam95c3RpY2tzIHsKKworLy8gQWN0aW9ucyBuZWVkZWQuCisKKy8vIEh1bWFuIFBsYXllciBTdGF0aW9uIEludGFrZSBCdXR0b24KKy8vIENsYXcgb3BlbgorLy8gQ2xhdyBjbG9zZQorLy8gQ2xhdyBkb3duCisKKy8vIFN0YWNrICsgTGlmdCAodG9nZXRoZXIpCisvLyBQbGFjZQorCisvLyBIb2xkIHN0YWNrCisKKy8vIEhvcml6b250YWwgY2FuIHBpY2t1cAorLy8gVmVydGljYWwgY2FuIHBpY2t1cAorCisvLyBUT0RPKGF1c3Rpbik6IFB1bGwgYSBsb3Qgb2YgdGhlIGNvbnN0YW50cyBiZWxvdyBvdXQgdXAgaGVyZSBzbyB0aGV5IGNhbiBiZQorLy8gZ2xvYmFsbHkgY2hhbmdlZCBlYXNpZXIuCisKKy8vIHByZXNldCBtb3Rpb24gbGltaXRzCitjb25zdGV4cHIgYWN0b3JzOjpQcm9maWxlUGFyYW1zIGtBcm1Nb3ZlezAuNSwgMS4wfTsKK2NvbnN0ZXhwciBhY3RvcnM6OlByb2ZpbGVQYXJhbXMga0VsZXZhdG9yTW92ZXswLjMsIDEuMH07CisKK2NvbnN0IEpveXN0aWNrQXhpcyBrU3RlZXJpbmdXaGVlbCgxLCAxKSwga0RyaXZlVGhyb3R0bGUoMiwgMik7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrU2hpZnRIaWdoKDIsIDEpLCBrU2hpZnRMb3coMiwgMyk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrUXVpY2tUdXJuKDEsIDUpOworCisvL2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtDbGF3Q2xvc2VkKDMsIDUpOworLy9jb25zdCBCdXR0b25Mb2NhdGlvbiBrRnJpZGdlQ2xvc2VkKDMsIDEpOworCisKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtTdGFja0FuZEhvbGQoMywgNSk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrUm9sbGVyc0luKDMsIDIpOworY29uc3QgQnV0dG9uTG9jYXRpb24ga0hvcml6b250YWxDYW5Sb2xsZXJzSW4oNCwgNSk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrQ2xhd1RvZ2dsZSg0LCAxKTsKKworY29uc3QgUE9WTG9jYXRpb24ga0VsZXZhdG9yQ2FuVXAoNCwgMCk7CisKKy8vIFBPViBzdGljayAzLCAxODAKK2NvbnN0IFBPVkxvY2F0aW9uIGtDYW5QaWNrdXAoNCwgMTgwKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtUb3RlQ2h1dGUoNCwgNik7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrU3RhY2tBbmRMaWZ0KDQsIDcpOworCisvLyBQdWxsIGluIHRoZSA2dGggdG90ZS4KKy8vY29uc3QgQnV0dG9uTG9jYXRpb24ga1NpeHRoVG90ZSg0LCAxMCk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrQ2FuVXAoNCwgMTApOworCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrSGVsZFRvTGlmdCg0LCAxMSk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrUGlja3VwKDQsIDkpOworCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrU3RhY2soNCwgMik7CisKKy8vIE1vdmUgdGhlIGZyaWRnZSBvdXQgd2l0aCB0aGUgc3RhY2sgaW4gcHJlcGFyYXRpb24gZm9yIHNjb3JpbmcuCitjb25zdCBCdXR0b25Mb2NhdGlvbiBrU2NvcmUoNCwgOCk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrQ29vcFRvcCgzLCA4KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtDb29wVG9wUmV0cmFjdCgzLCA3KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtDb29wQm90dG9tKDMsIDYpOworY29uc3QgQnV0dG9uTG9jYXRpb24ga0Nvb3BCb3R0b21SZXRyYWN0KDQsIDEyKTsKKworY29uc3QgQnV0dG9uTG9jYXRpb24ga0NhblJlc2V0KDMsIDkpOworCitjb25zdCBQT1ZMb2NhdGlvbiBrRnJpZGdlVG9nZ2xlKDQsIDI3MCk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrU3BpdCg0LCAzKTsKKworLy8gU2V0IHN0YWNrIGRvd24gaW4gdGhlIGJvdC4KK2NvbnN0IFBPVkxvY2F0aW9uIGtTZXRTdGFja0Rvd25BbmRIb2xkKDQsIDkwKTsKKworY29uc3QgZG91YmxlIGtDbGF3VG90ZVBhY2tBbmdsZSA9IDAuOTA7Citjb25zdCBkb3VibGUga0FybVJhaXNlTG93ZXJDbGVhcmFuY2UgPSAtMC4wODsKK2NvbnN0IGRvdWJsZSBrQ2xhd1N0YWNrQ2xlYXJhbmNlID0gMC41NTsKK2NvbnN0IGRvdWJsZSBrSG9yaXpvbnRhbENhbkNsYXdBbmdsZSA9IDAuMTI7CisKK2NvbnN0IGRvdWJsZSBrU3RhY2tVcEhlaWdodCA9IDAuNjA7Citjb25zdCBkb3VibGUga1N0YWNrVXBBcm0gPSAwLjA7CisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyA6OmFvczo6aW5wdXQ6OkpveXN0aWNrSW5wdXQgeworIHB1YmxpYzoKKyAgUmVhZGVyKCkgOiB3YXNfcnVubmluZ18oZmFsc2UpIHt9CisKKyAgc3RhdGljIGFjdG9yczo6U2NvcmVQYXJhbXMgTWFrZVNjb3JlUGFyYW1zKCkgeworICAgIGFjdG9yczo6U2NvcmVQYXJhbXMgcjsKKyAgICByLm1vdmVfdGhlX3N0YWNrID0gci5wbGFjZV90aGVfc3RhY2sgPSB0cnVlOworICAgIHIudXBwZXJfbW92ZV9oZWlnaHQgPSAwLjE0OworICAgIHIuYmVnaW5faG9yaXpvbnRhbF9tb3ZlX2hlaWdodCA9IDAuMTM7CisgICAgci5ob3Jpem9udGFsX21vdmVfdGFyZ2V0ID0gLTAuNzsKKyAgICByLmhvcml6b250YWxfc3RhcnRfbG93ZXJpbmcgPSAtMC42NTsKKyAgICByLmhvbWVfbGlmdF9ob3Jpem9udGFsX3N0YXJ0X3Bvc2l0aW9uID0gLTAuNjA7CisgICAgci5wbGFjZV9oZWlnaHQgPSAtMC4xMDsKKyAgICByLmhvbWVfcmV0dXJuX2hlaWdodCA9IDAuMDU7CisgICAgcmV0dXJuIHI7CisgIH0KKworICBzdGF0aWMgYWN0b3JzOjpTY29yZVBhcmFtcyBNYWtlQ29vcFRvcFBhcmFtcyhib29sIHBsYWNlX3RoZV9zdGFjaykgeworICAgIGFjdG9yczo6U2NvcmVQYXJhbXMgcjsKKyAgICByLm1vdmVfdGhlX3N0YWNrID0gIXBsYWNlX3RoZV9zdGFjazsKKyAgICByLnBsYWNlX3RoZV9zdGFjayA9IHBsYWNlX3RoZV9zdGFjazsKKyAgICByLnVwcGVyX21vdmVfaGVpZ2h0ID0gMC41MjsKKyAgICByLmJlZ2luX2hvcml6b250YWxfbW92ZV9oZWlnaHQgPSAwLjU7CisgICAgci5ob3Jpem9udGFsX21vdmVfdGFyZ2V0ID0gLTAuNDg7CisgICAgci5ob3Jpem9udGFsX3N0YXJ0X2xvd2VyaW5nID0gci5ob3Jpem9udGFsX21vdmVfdGFyZ2V0OworICAgIHIuaG9tZV9saWZ0X2hvcml6b250YWxfc3RhcnRfcG9zaXRpb24gPSAtMC4zOworICAgIHIucGxhY2VfaGVpZ2h0ID0gMC4zNTsKKyAgICByLmhvbWVfcmV0dXJuX2hlaWdodCA9IDAuMTsKKyAgICByZXR1cm4gcjsKKyAgfQorCisgIHN0YXRpYyBhY3RvcnM6OlNjb3JlUGFyYW1zIE1ha2VDb29wQm90dG9tUGFyYW1zKGJvb2wgcGxhY2VfdGhlX3N0YWNrKSB7CisgICAgYWN0b3JzOjpTY29yZVBhcmFtcyByOworICAgIHIubW92ZV90aGVfc3RhY2sgPSAhcGxhY2VfdGhlX3N0YWNrOworICAgIHIucGxhY2VfdGhlX3N0YWNrID0gcGxhY2VfdGhlX3N0YWNrOworICAgIHIudXBwZXJfbW92ZV9oZWlnaHQgPSAwLjE3OworICAgIHIuYmVnaW5faG9yaXpvbnRhbF9tb3ZlX2hlaWdodCA9IDAuMTY7CisgICAgci5ob3Jpem9udGFsX21vdmVfdGFyZ2V0ID0gLTAuNzsKKyAgICByLmhvcml6b250YWxfc3RhcnRfbG93ZXJpbmcgPSByLmhvcml6b250YWxfbW92ZV90YXJnZXQ7CisgICAgci5ob21lX2xpZnRfaG9yaXpvbnRhbF9zdGFydF9wb3NpdGlvbiA9IC0wLjM7CisgICAgci5wbGFjZV9oZWlnaHQgPSAwLjA7CisgICAgci5ob21lX3JldHVybl9oZWlnaHQgPSAwLjE7CisgICAgcmV0dXJuIHI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgUnVuSXRlcmF0aW9uKGNvbnN0IDo6YW9zOjppbnB1dDo6ZHJpdmVyX3N0YXRpb246OkRhdGEgJmRhdGEpIHsKKyAgICBib29sIGxhc3RfYXV0b19ydW5uaW5nID0gYXV0b19ydW5uaW5nXzsKKyAgICBhdXRvX3J1bm5pbmdfID0gZGF0YS5HZXRDb250cm9sQml0KENvbnRyb2xCaXQ6OmtBdXRvbm9tb3VzKSAmJgorICAgICAgICAgICAgICAgICAgICBkYXRhLkdldENvbnRyb2xCaXQoQ29udHJvbEJpdDo6a0VuYWJsZWQpOworICAgIGlmIChhdXRvX3J1bm5pbmdfICE9IGxhc3RfYXV0b19ydW5uaW5nKSB7CisgICAgICBpZiAoYXV0b19ydW5uaW5nXykgeworICAgICAgICBTdGFydEF1dG8oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0b3BBdXRvKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFkYXRhLkdldENvbnRyb2xCaXQoQ29udHJvbEJpdDo6a0F1dG9ub21vdXMpKSB7CisgICAgICBIYW5kbGVEcml2ZXRyYWluKGRhdGEpOworICAgICAgSGFuZGxlVGVsZW9wKGRhdGEpOworICAgIH0KKyAgfQorCisgIHZvaWQgSGFuZGxlRHJpdmV0cmFpbihjb25zdCA6OmFvczo6aW5wdXQ6OmRyaXZlcl9zdGF0aW9uOjpEYXRhICZkYXRhKSB7CisgICAgY29uc3QgZG91YmxlIHdoZWVsID0gLWRhdGEuR2V0QXhpcyhrU3RlZXJpbmdXaGVlbCk7CisgICAgY29uc3QgZG91YmxlIHRocm90dGxlID0gLWRhdGEuR2V0QXhpcyhrRHJpdmVUaHJvdHRsZSk7CisKKyAgICBpZiAoIWRyaXZldHJhaW5fcXVldWUuZ29hbC5NYWtlV2l0aEJ1aWxkZXIoKQorICAgICAgICAgICAgIC5zdGVlcmluZyh3aGVlbCkKKyAgICAgICAgICAgICAudGhyb3R0bGUodGhyb3R0bGUpCisgICAgICAgICAgICAgLnF1aWNrdHVybihkYXRhLklzUHJlc3NlZChrUXVpY2tUdXJuKSkKKyAgICAgICAgICAgICAuY29udHJvbF9sb29wX2RyaXZpbmcoZmFsc2UpCisgICAgICAgICAgICAgLlNlbmQoKSkgeworICAgICAgTE9HKFdBUk5JTkcsICJzZW5kaW5nIHN0aWNrIHZhbHVlcyBmYWlsZWRcbiIpOworICAgIH0KKyAgfQorCisgIHZvaWQgSGFuZGxlVGVsZW9wKGNvbnN0IDo6YW9zOjppbnB1dDo6ZHJpdmVyX3N0YXRpb246OkRhdGEgJmRhdGEpIHsKKyAgICBkb3VibGUgaW50YWtlX3Bvd2VyID0gMC4wOworICAgIGlmICghZGF0YS5HZXRDb250cm9sQml0KENvbnRyb2xCaXQ6OmtFbmFibGVkKSkgeworICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICBMT0coREVCVUcsICJDYW5jZWxpbmdcbiIpOworICAgIH0KKworICAgIGlmIChkYXRhLklzUHJlc3NlZChrUm9sbGVyc0luKSkgeworICAgICAgaW50YWtlX3Bvd2VyID0gMTAuMDsKKyAgICAgIGNsYXdfZ29hbF8gPSAwLjA7CisgICAgfQorICAgIGlmIChkYXRhLklzUHJlc3NlZChrSG9yaXpvbnRhbENhblJvbGxlcnNJbikpIHsKKyAgICAgIGludGFrZV9wb3dlciA9IDEwLjA7CisgICAgICBjbGF3X2dvYWxfID0ga0hvcml6b250YWxDYW5DbGF3QW5nbGU7CisgICAgfQorICAgIGlmIChkYXRhLklzUHJlc3NlZChrU3BpdCkpIHsKKyAgICAgIGludGFrZV9wb3dlciA9IC0xMi4wOworICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgfQorCisgICAgLy8gVG9nZ2xlIGJ1dHRvbiBmb3IgdGhlIGNsYXcKKyAgICBpZiAoZGF0YS5Qb3NFZGdlKGtDbGF3VG9nZ2xlKSkgeworICAgICAgY2xhd19yb2xsZXJzX2Nsb3NlZF8gPSAhY2xhd19yb2xsZXJzX2Nsb3NlZF87CisgICAgfQorCisgICAgLyoKKyAgICBpZiAoZGF0YS5Jc1ByZXNzZWQoa0NsYXdDbG9zZWQpKSB7CisgICAgICBjbGF3X3JvbGxlcnNfY2xvc2VkXyA9IHRydWU7CisgICAgfQorICAgICovCisKKyAgICAvLyBIb3Jpem9udGFsIGNhbiBwaWNrdXAuCisgICAgaWYgKGRhdGEuUG9zRWRnZShrRWxldmF0b3JDYW5VcCkpIHsKKyAgICAgIGFjdG9yczo6SG9yaXpvbnRhbENhblBpY2t1cFBhcmFtcyBwYXJhbXM7CisgICAgICBwYXJhbXMuZWxldmF0b3JfaGVpZ2h0ID0gMC4zOworICAgICAgcGFyYW1zLnBpY2t1cF9hbmdsZSA9IDAuODAgKyBrSG9yaXpvbnRhbENhbkNsYXdBbmdsZTsKKyAgICAgIHBhcmFtcy5zcGl0X3RpbWUgPSAwLjAxOworICAgICAgcGFyYW1zLnNwaXRfcG93ZXIgPSAtOC4wOworCisgICAgICBwYXJhbXMuc3Vja190aW1lID0gMC4xMDsKKyAgICAgIHBhcmFtcy5zdWNrX3Bvd2VyID0gMTAuMDsKKworICAgICAgcGFyYW1zLmNsYXdfc2V0dGxlX3RpbWUgPSAwLjA1OworICAgICAgcGFyYW1zLmNsYXdfc2V0dGxlX3Bvd2VyID0gNS4wOworICAgICAgcGFyYW1zLmNsYXdfZnVsbF9saWZ0X2FuZ2xlID0gMS4zNTsKKyAgICAgIHBhcmFtcy5jbGF3X2VuZF9hbmdsZSA9IDAuNTsKKworICAgICAgLy8gRW5kIGxvdyBzbyB3ZSBkb24ndCBkcm9wIGl0LgorICAgICAgcGFyYW1zLmVsZXZhdG9yX2VuZF9oZWlnaHQgPSAwLjI4OworICAgICAgcGFyYW1zLmFybV9lbmRfYW5nbGUgPSAwLjA7CisgICAgICBhY3Rpb25fcXVldWVfLkVucXVldWVBY3Rpb24oCisgICAgICAgICAgYWN0b3JzOjpNYWtlSG9yaXpvbnRhbENhblBpY2t1cEFjdGlvbihwYXJhbXMpKTsKKyAgICAgIGZyaWRnZV9jbG9zZWRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAtMC45NDI1MDMgYXJtLCAwLjM3NDc1MiBlbGV2YXRvcgorICAgIC8vIFZlcnRpY2FsIGNhbiBwaWNrdXAuCisgICAgaWYgKGRhdGEuUG9zRWRnZShrQ2FuUGlja3VwKSkgeworICAgICAgYWN0b3JzOjpDYW5QaWNrdXBQYXJhbXMgcGFyYW1zOworICAgICAgcGFyYW1zLnBpY2t1cF94ID0gMC42OworICAgICAgcGFyYW1zLnBpY2t1cF95ID0gMC4xOworICAgICAgcGFyYW1zLmxpZnRfaGVpZ2h0ID0gMC4yNTsKKyAgICAgIHBhcmFtcy5waWNrdXBfZ29hbF9iZWZvcmVfbW92ZV9oZWlnaHQgPSAwLjM7CisgICAgICBwYXJhbXMuc3RhcnRfbG93ZXJpbmdfeCA9IDAuMTsKKyAgICAgIC8vIEVuZCBsb3cgc28gdGhlIGNhbiBpcyBzdXBwb3J0ZWQuCisgICAgICBwYXJhbXMuYmVmb3JlX3BsYWNlX2hlaWdodCA9IDAuNDsKKyAgICAgIHBhcmFtcy5lbmRfaGVpZ2h0ID0gMC4yODsKKyAgICAgIHBhcmFtcy5lbmRfYW5nbGUgPSAwLjA7CisgICAgICBhY3Rpb25fcXVldWVfLkVucXVldWVBY3Rpb24oYWN0b3JzOjpNYWtlQ2FuUGlja3VwQWN0aW9uKHBhcmFtcykpOworICAgICAgZnJpZGdlX2Nsb3NlZF8gPSB0cnVlOworICAgIH0KKworICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0NhblJlc2V0KSkgeworICAgICAgYWN0aW9uX3F1ZXVlXy5DYW5jZWxBbGxBY3Rpb25zKCk7CisgICAgICBlbGV2YXRvcl9nb2FsXyA9IDAuMjg7CisgICAgICBhcm1fZ29hbF8gPSAwLjA7CisgICAgfQorCisgICAgLy8gVG90ZSBjaHV0ZSBwdWxsIGluIHdoZW4gYnV0dG9uIGlzIHByZXNzZWQsIHBhY2sgd2hlbiBkb25lLgorICAgIGlmIChkYXRhLklzUHJlc3NlZChrVG90ZUNodXRlKSkgeworICAgICAgY2xhd19nb2FsXyA9IDAuODsKKyAgICAgIGludGFrZV9wb3dlciA9IDYuMDsKKyAgICB9CisgICAgaWYgKGRhdGEuTmVnRWRnZShrVG90ZUNodXRlKSkgeworICAgICAgY2xhd19nb2FsXyA9IGtDbGF3VG90ZVBhY2tBbmdsZTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS5Qb3NFZGdlKGtTdGFja0FuZExpZnQpKSB7CisgICAgICBhY3RvcnM6OlN0YWNrQW5kTGlmdFBhcmFtcyBwYXJhbXM7CisgICAgICBwYXJhbXMuc3RhY2tfcGFyYW1zLmNsYXdfb3V0X2FuZ2xlID0ga0NsYXdUb3RlUGFja0FuZ2xlOworICAgICAgcGFyYW1zLnN0YWNrX3BhcmFtcy5ib3R0b20gPSAwLjAyMDsKKyAgICAgIHBhcmFtcy5zdGFja19wYXJhbXMub3Zlcl9ib3hfYmVmb3JlX3BsYWNlX2hlaWdodCA9IDAuMzk7CisgICAgICBwYXJhbXMuc3RhY2tfcGFyYW1zLmFybV9jbGVhcmFuY2UgPSBrQXJtUmFpc2VMb3dlckNsZWFyYW5jZTsKKworICAgICAgcGFyYW1zLmdyYWJfYWZ0ZXJfc3RhY2sgPSB0cnVlOworICAgICAgcGFyYW1zLmNsYW1wX3BhdXNlX3RpbWUgPSAwLjA7CisgICAgICBwYXJhbXMubGlmdF9wYXJhbXMubGlmdF9oZWlnaHQgPSBrU3RhY2tVcEhlaWdodDsKKyAgICAgIHBhcmFtcy5saWZ0X3BhcmFtcy5saWZ0X2FybSA9IGtTdGFja1VwQXJtOworICAgICAgcGFyYW1zLmxpZnRfcGFyYW1zLnNlY29uZF9saWZ0ID0gZmFsc2U7CisgICAgICBwYXJhbXMuZ3JhYl9hZnRlcl9saWZ0ID0gdHJ1ZTsKKyAgICAgIGZyaWRnZV9jbG9zZWRfID0gdHJ1ZTsKKworICAgICAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKGFjdG9yczo6TWFrZVN0YWNrQW5kTGlmdEFjdGlvbihwYXJhbXMpKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS5Qb3NFZGdlKGtTdGFja0FuZEhvbGQpIHx8IGRhdGEuUG9zRWRnZShrU2V0U3RhY2tEb3duQW5kSG9sZCkpIHsKKyAgICAgIGFjdG9yczo6U3RhY2tBbmRIb2xkUGFyYW1zIHBhcmFtczsKKyAgICAgIHBhcmFtcy5ib3R0b20gPSAwLjAyMDsKKyAgICAgIHBhcmFtcy5vdmVyX2JveF9iZWZvcmVfcGxhY2VfaGVpZ2h0ID0gMC4zOTsKKworICAgICAgcGFyYW1zLmFybV9jbGVhcmFuY2UgPSBrQXJtUmFpc2VMb3dlckNsZWFyYW5jZTsKKyAgICAgIHBhcmFtcy5jbGFtcF9wYXVzZV90aW1lID0gMC4yNTsKKyAgICAgIHBhcmFtcy5jbGF3X2NsYW1wX2FuZ2xlID0ga0NsYXdUb3RlUGFja0FuZ2xlOworCisgICAgICBwYXJhbXMuaG9sZF9oZWlnaHQgPSAwLjY4OworICAgICAgcGFyYW1zLmNsYXdfb3V0X2FuZ2xlID0ga0NsYXdUb3RlUGFja0FuZ2xlOworCisgICAgICBpZiAoZGF0YS5Qb3NFZGdlKGtTZXRTdGFja0Rvd25BbmRIb2xkKSkgeworICAgICAgICBwYXJhbXMucGxhY2Vfbm90X3N0YWNrID0gdHJ1ZTsKKyAgICAgICAgcGFyYW1zLmNsYW1wX3BhdXNlX3RpbWUgPSAwLjE7CisgICAgICAgIC8vcGFyYW1zLmNsYXdfY2xhbXBfYW5nbGUgPSBrQ2xhd1RvdGVQYWNrQW5nbGUgLSAwLjU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJhbXMucGxhY2Vfbm90X3N0YWNrID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGFjdGlvbl9xdWV1ZV8uRW5xdWV1ZUFjdGlvbihhY3RvcnM6Ok1ha2VTdGFja0FuZEhvbGRBY3Rpb24ocGFyYW1zKSk7CisgICAgICBmcmlkZ2VfY2xvc2VkXyA9IHRydWU7CisgICAgfQorCisgICAgLy8gVE9ETyhhdXN0aW4pOiBGaWd1cmUgb3V0IHdoYXQgYWN0aW9uIG5lZWRlZCB0byBwdWxsIHRoZSA2dGggdG90ZSBpbnRvIHRoZQorICAgIC8vIGNsYXcuCisKKyAgICAvLyBMb3dlciB0aGUgZnJpZGdlIGZyb20gaG9sZGluZyB0aGUgc3RhY2ssIGdyYWIgdGhlIHN0YWNrLCBhbmQgdGhlbiBsaWZ0LgorICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0hlbGRUb0xpZnQpKSB7CisgICAgICBhY3RvcnM6OkhlbGRUb0xpZnRQYXJhbXMgcGFyYW1zOworICAgICAgcGFyYW1zLmFybV9jbGVhcmFuY2UgPSBrQXJtUmFpc2VMb3dlckNsZWFyYW5jZTsKKyAgICAgIHBhcmFtcy5jbGFtcF9wYXVzZV90aW1lID0gMC4xOworICAgICAgcGFyYW1zLmJlZm9yZV9saWZ0X3NldHRsZV90aW1lID0gMC4xOworICAgICAgcGFyYW1zLmJvdHRvbV9oZWlnaHQgPSAwLjAyMDsKKyAgICAgIHBhcmFtcy5jbGF3X291dF9hbmdsZSA9IGtDbGF3U3RhY2tDbGVhcmFuY2U7CisgICAgICBwYXJhbXMubGlmdF9wYXJhbXMubGlmdF9oZWlnaHQgPSBrU3RhY2tVcEhlaWdodDsKKyAgICAgIHBhcmFtcy5saWZ0X3BhcmFtcy5saWZ0X2FybSA9IGtTdGFja1VwQXJtOworICAgICAgcGFyYW1zLmxpZnRfcGFyYW1zLnNlY29uZF9saWZ0ID0gZmFsc2U7CisgICAgICBmcmlkZ2VfY2xvc2VkXyA9IHRydWU7CisKKyAgICAgIGFjdGlvbl9xdWV1ZV8uRW5xdWV1ZUFjdGlvbihhY3RvcnM6Ok1ha2VIZWxkVG9MaWZ0QWN0aW9uKHBhcmFtcykpOworICAgIH0KKworICAgIC8vIExpZnQgdGhlIGNhbiB1cC4KKyAgICBpZiAoZGF0YS5Qb3NFZGdlKGtDYW5VcCkpIHsKKyAgICAgIGFjdG9yczo6TGlmdFBhcmFtcyBwYXJhbXM7CisgICAgICBwYXJhbXMubGlmdF9oZWlnaHQgPSAwLjY4OworICAgICAgcGFyYW1zLmxpZnRfYXJtID0gMC4zOworICAgICAgcGFyYW1zLnBhY2tfY2xhdyA9IGZhbHNlOworICAgICAgcGFyYW1zLnBhY2tfY2xhd19hbmdsZSA9IDA7CisgICAgICBwYXJhbXMuaW50ZXJtZWRpYXRlX2xpZnRfaGVpZ2h0ID0gMC4zNzsKKyAgICAgIHBhcmFtcy5zZWNvbmRfbGlmdCA9IHRydWU7CisgICAgICBmcmlkZ2VfY2xvc2VkXyA9IHRydWU7CisKKyAgICAgIGFjdGlvbl9xdWV1ZV8uRW5xdWV1ZUFjdGlvbihhY3RvcnM6Ok1ha2VMaWZ0QWN0aW9uKHBhcmFtcykpOworICAgIH0KKworICAgIC8vIFBpY2sgdXAgYSB0b3RlIGZyb20gdGhlIGdyb3VuZCBhbmQgcHV0IGl0IGluIHRoZSBib3R0b20gb2YgdGhlIGJvdC4KKyAgICBpZiAoZGF0YS5Qb3NFZGdlKGtQaWNrdXApKSB7CisgICAgICBhY3RvcnM6OlBpY2t1cFBhcmFtcyBwYXJhbXM7CisgICAgICAvLyBUT0RPKGF1c3Rpbik6IFRoZXNlIHBhcmFtZXRlcnMgYXJlIGNvcHBpZWQgaW50byBhdXRvIHJpZ2h0IG5vdywgbmVlZAorICAgICAgLy8gdG8gZGVkdXAuLi4KKworICAgICAgLy8gTGlmdCB0byBoZXJlIGluaXRpYWxseS4KKyAgICAgIHBhcmFtcy5waWNrdXBfYW5nbGUgPSAwLjk7CisgICAgICAvLyBTdGFydCBzdWNraW5nIGhlcmUKKyAgICAgIHBhcmFtcy5zdWNrX2FuZ2xlID0gMC44OworICAgICAgLy8gR28gYmFjayBkb3duIHRvIGhlcmUgdG8gZmluaXNoIHN1Y2tpbmcuCisgICAgICBwYXJhbXMuc3Vja19hbmdsZV9maW5pc2ggPSAwLjQ7CisgICAgICAvLyBQYWNrIHRoZSBib3ggYmFjayBpbiBoZXJlLgorICAgICAgcGFyYW1zLnBpY2t1cF9maW5pc2hfYW5nbGUgPSBrQ2xhd1RvdGVQYWNrQW5nbGU7CisgICAgICBwYXJhbXMuaW50YWtlX3RpbWUgPSAwLjg7CisgICAgICBwYXJhbXMuaW50YWtlX3ZvbHRhZ2UgPSA3LjA7CisgICAgICBhY3Rpb25fcXVldWVfLkVucXVldWVBY3Rpb24oYWN0b3JzOjpNYWtlUGlja3VwQWN0aW9uKHBhcmFtcykpOworICAgIH0KKworICAgIC8vIFBsYWNlIHN0YWNrIG9uIGEgdG90ZSBpbiB0aGUgdHJheSwgYW5kIGdyYWIgaXQuCisgICAgaWYgKGRhdGEuUG9zRWRnZShrU3RhY2spKSB7CisgICAgICBhY3RvcnM6OlN0YWNrUGFyYW1zIHBhcmFtczsKKyAgICAgIHBhcmFtcy5jbGF3X291dF9hbmdsZSA9IGtDbGF3VG90ZVBhY2tBbmdsZTsKKyAgICAgIHBhcmFtcy5ib3R0b20gPSAwLjAyMDsKKyAgICAgIHBhcmFtcy5vbmx5X3BsYWNlID0gZmFsc2U7CisgICAgICBwYXJhbXMuYXJtX2NsZWFyYW5jZSA9IGtBcm1SYWlzZUxvd2VyQ2xlYXJhbmNlOworICAgICAgcGFyYW1zLm92ZXJfYm94X2JlZm9yZV9wbGFjZV9oZWlnaHQgPSAwLjM5OworICAgICAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKGFjdG9yczo6TWFrZVN0YWNrQWN0aW9uKHBhcmFtcykpOworICAgICAgY2xhd19yb2xsZXJzX2Nsb3NlZF8gPSB0cnVlOworICAgICAgZnJpZGdlX2Nsb3NlZF8gPSB0cnVlOworICAgIH0KKworICAgIGlmIChkYXRhLlBvc0VkZ2Uoa1Njb3JlKSkgeworICAgICAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKAorICAgICAgICAgIGFjdG9yczo6TWFrZVNjb3JlQWN0aW9uKE1ha2VTY29yZVBhcmFtcygpKSk7CisgICAgICBmcmlkZ2VfY2xvc2VkXyA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0Nvb3BUb3ApKSB7CisgICAgICBhY3Rpb25fcXVldWVfLkVucXVldWVBY3Rpb24oCisgICAgICAgICAgYWN0b3JzOjpNYWtlU2NvcmVBY3Rpb24oTWFrZUNvb3BUb3BQYXJhbXMoZmFsc2UpKSk7CisgICAgfQorICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0Nvb3BUb3BSZXRyYWN0KSkgeworICAgICAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKAorICAgICAgICAgIGFjdG9yczo6TWFrZVNjb3JlQWN0aW9uKE1ha2VDb29wVG9wUGFyYW1zKHRydWUpKSk7CisgICAgICBmcmlkZ2VfY2xvc2VkXyA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0Nvb3BCb3R0b20pKSB7CisgICAgICBhY3Rpb25fcXVldWVfLkVucXVldWVBY3Rpb24oCisgICAgICAgICAgYWN0b3JzOjpNYWtlU2NvcmVBY3Rpb24oTWFrZUNvb3BCb3R0b21QYXJhbXMoZmFsc2UpKSk7CisgICAgfQorICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0Nvb3BCb3R0b21SZXRyYWN0KSkgeworICAgICAgYWN0aW9uX3F1ZXVlXy5FbnF1ZXVlQWN0aW9uKAorICAgICAgICAgIGFjdG9yczo6TWFrZVNjb3JlQWN0aW9uKE1ha2VDb29wQm90dG9tUGFyYW1zKHRydWUpKSk7CisgICAgICBmcmlkZ2VfY2xvc2VkXyA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChkYXRhLlBvc0VkZ2Uoa0ZyaWRnZVRvZ2dsZSkpIHsKKyAgICAgIGZyaWRnZV9jbG9zZWRfID0gIWZyaWRnZV9jbG9zZWRfOworICAgIH0KKworICAgIGlmIChkYXRhLlBvc0VkZ2UoQ29udHJvbEJpdDo6a0VuYWJsZWQpKSB7CisgICAgICAvLyBJZiB3ZSBnb3QgZW5hYmxlZCwgd2FpdCBmb3IgZXZlcnl0aGluZyB0byB6ZXJvLgorICAgICAgTE9HKElORk8sICJXYWl0aW5nIGZvciB6ZXJvLlxuIik7CisgICAgICB3YWl0aW5nX2Zvcl96ZXJvXyA9IHRydWU7CisgICAgfQorCisgICAgY2xhd19xdWV1ZS5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgICBmcmlkZ2VfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgICAgaWYgKCFjbGF3X3F1ZXVlLnN0YXR1cy5nZXQoKSkgeworICAgICAgTE9HKEVSUk9SLCAiR290IG5vIGNsYXcgc3RhdHVzIHBhY2tldC5cbiIpOworICAgIH0KKyAgICBpZiAoIWZyaWRnZV9xdWV1ZS5zdGF0dXMuZ2V0KCkpIHsKKyAgICAgIExPRyhFUlJPUiwgIkdvdCBubyBmcmlkZ2Ugc3RhdHVzIHBhY2tldC5cbiIpOworICAgIH0KKworICAgIGlmIChjbGF3X3F1ZXVlLnN0YXR1cy5nZXQoKSAmJiBmcmlkZ2VfcXVldWUuc3RhdHVzLmdldCgpICYmCisgICAgICAgIGNsYXdfcXVldWUuc3RhdHVzLT56ZXJvZWQgJiYgZnJpZGdlX3F1ZXVlLnN0YXR1cy0+emVyb2VkKSB7CisgICAgICBpZiAod2FpdGluZ19mb3JfemVyb18pIHsKKyAgICAgICAgTE9HKElORk8sICJaZXJvZWQhIFN0YXJ0aW5nIHRlbGVvcCBtb2RlLlxuIik7CisgICAgICAgIHdhaXRpbmdfZm9yX3plcm9fID0gZmFsc2U7CisKKyAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIGdvYWxzIHRvIHdoZXJlIHdlIGFyZSBub3cuCisgICAgICAgIGVsZXZhdG9yX2dvYWxfID0gMC4zOworICAgICAgICBhcm1fZ29hbF8gPSAwLjA7CisgICAgICAgIGNsYXdfZ29hbF8gPSAwLjY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHdhaXRpbmdfZm9yX3plcm9fID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIXdhaXRpbmdfZm9yX3plcm9fKSB7CisgICAgICBpZiAoIWFjdGlvbl9xdWV1ZV8uUnVubmluZygpKSB7CisgICAgICAgIGF1dG8gbmV3X2ZyaWRnZV9nb2FsID0gZnJpZGdlX3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgICAgICAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfdmVsb2NpdHkgPSBlbGV2YXRvcl9wYXJhbXNfLnZlbG9jaXR5OworICAgICAgICBuZXdfZnJpZGdlX2dvYWwtPm1heF9hY2NlbGVyYXRpb24gPSBlbGV2YXRvcl9wYXJhbXNfLmFjY2VsZXJhdGlvbjsKKyAgICAgICAgbmV3X2ZyaWRnZV9nb2FsLT5wcm9maWxpbmdfdHlwZSA9IDA7CisgICAgICAgIG5ld19mcmlkZ2VfZ29hbC0+aGVpZ2h0ID0gZWxldmF0b3JfZ29hbF87CisgICAgICAgIG5ld19mcmlkZ2VfZ29hbC0+dmVsb2NpdHkgPSAwLjA7CisgICAgICAgIG5ld19mcmlkZ2VfZ29hbC0+bWF4X2FuZ3VsYXJfdmVsb2NpdHkgPSBhcm1fcGFyYW1zXy52ZWxvY2l0eTsKKyAgICAgICAgbmV3X2ZyaWRnZV9nb2FsLT5tYXhfYW5ndWxhcl9hY2NlbGVyYXRpb24gPSBhcm1fcGFyYW1zXy5hY2NlbGVyYXRpb247CisgICAgICAgIG5ld19mcmlkZ2VfZ29hbC0+YW5nbGUgPSBhcm1fZ29hbF87CisgICAgICAgIG5ld19mcmlkZ2VfZ29hbC0+YW5ndWxhcl92ZWxvY2l0eSA9IDAuMDsKKyAgICAgICAgbmV3X2ZyaWRnZV9nb2FsLT5ncmFiYmVycy50b3BfZnJvbnQgPSBmcmlkZ2VfY2xvc2VkXzsKKyAgICAgICAgbmV3X2ZyaWRnZV9nb2FsLT5ncmFiYmVycy50b3BfYmFjayA9IGZyaWRnZV9jbG9zZWRfOworICAgICAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLmJvdHRvbV9mcm9udCA9IGZyaWRnZV9jbG9zZWRfOworICAgICAgICBuZXdfZnJpZGdlX2dvYWwtPmdyYWJiZXJzLmJvdHRvbV9iYWNrID0gZnJpZGdlX2Nsb3NlZF87CisKKyAgICAgICAgaWYgKCFuZXdfZnJpZGdlX2dvYWwuU2VuZCgpKSB7CisgICAgICAgICAgTE9HKEVSUk9SLCAiU2VuZGluZyBmcmlkZ2UgZ29hbCBmYWlsZWQuXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBMT0coREVCVUcsICJzZW5kaW5nIGdvYWxzOiBlbGV2YXRvcjogJWYsIGFybTogJWZcbiIsIGVsZXZhdG9yX2dvYWxfLAorICAgICAgICAgICAgICBhcm1fZ29hbF8pOworICAgICAgICB9CisgICAgICAgIGlmICghY2xhd19xdWV1ZS5nb2FsLk1ha2VXaXRoQnVpbGRlcigpCisgICAgICAgICAgICAgICAgIC5hbmdsZShjbGF3X2dvYWxfKQorICAgICAgICAgICAgICAgICAucm9sbGVyc19jbG9zZWQoY2xhd19yb2xsZXJzX2Nsb3NlZF8pCisgICAgICAgICAgICAgICAgIC5tYXhfdmVsb2NpdHkoNS4wKQorICAgICAgICAgICAgICAgICAubWF4X2FjY2VsZXJhdGlvbig2LjApCisgICAgICAgICAgICAgICAgIC5pbnRha2UoaW50YWtlX3Bvd2VyKQorICAgICAgICAgICAgICAgICAuU2VuZCgpKSB7CisgICAgICAgICAgTE9HKEVSUk9SLCAiU2VuZGluZyBjbGF3IGdvYWwgZmFpbGVkLlxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWN0aW9uX3F1ZXVlXy5SdW5uaW5nKCkpIHsKKyAgICAgIC8vIElmIHdlIGFyZSBydW5uaW5nIGFuIGFjdGlvbiwgdXBkYXRlIG91ciBnb2FscyB0byB0aGUgY3VycmVudCBnb2Fscy4KKyAgICAgIGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgICAgIGlmIChjb250cm9sX2xvb3BzOjpmcmlkZ2VfcXVldWUuc3RhdHVzLmdldCgpKSB7CisgICAgICAgIGFybV9nb2FsXyA9IGNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5zdGF0dXMtPmdvYWxfYW5nbGU7CisgICAgICAgIGVsZXZhdG9yX2dvYWxfID0gY29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLnN0YXR1cy0+Z29hbF9oZWlnaHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IsICJObyBmcmlkZ2Ugc3RhdHVzIVxuIik7CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGFyZSBydW5uaW5nIGFuIGFjdGlvbiwgdXBkYXRlIG91ciBnb2FscyB0byB0aGUgY3VycmVudCBnb2Fscy4KKyAgICAgIGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisgICAgICBpZiAoY29udHJvbF9sb29wczo6Y2xhd19xdWV1ZS5zdGF0dXMuZ2V0KCkpIHsKKyAgICAgICAgY2xhd19nb2FsXyA9IGNvbnRyb2xfbG9vcHM6OmNsYXdfcXVldWUuc3RhdHVzLT5nb2FsX2FuZ2xlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SLCAiTm8gY2xhdyBzdGF0dXMhXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgYWN0aW9uX3F1ZXVlXy5UaWNrKCk7CisgICAgd2FzX3J1bm5pbmdfID0gYWN0aW9uX3F1ZXVlXy5SdW5uaW5nKCk7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgU3RhcnRBdXRvKCkgeworICAgIExPRyhJTkZPLCAiU3RhcnRpbmcgYXV0byBtb2RlXG4iKTsKKyAgICA6OmZyYzk3MTo6YXV0b25vbW91czo6YXV0b25vbW91cy5NYWtlV2l0aEJ1aWxkZXIoKS5ydW5fYXV0byh0cnVlKS5TZW5kKCk7CisgIH0KKworICB2b2lkIFN0b3BBdXRvKCkgeworICAgIExPRyhJTkZPLCAiU3RvcHBpbmcgYXV0byBtb2RlXG4iKTsKKyAgICA6OmZyYzk3MTo6YXV0b25vbW91czo6YXV0b25vbW91cy5NYWtlV2l0aEJ1aWxkZXIoKS5ydW5fYXV0byhmYWxzZSkuU2VuZCgpOworICB9CisKKyAgYm9vbCB3YXNfcnVubmluZ187CisKKyAgLy8gUHJldmlvdXMgZ29hbHMgZm9yIHN5c3RlbXMuCisgIGRvdWJsZSBlbGV2YXRvcl9nb2FsXyA9IDAuMjsKKyAgZG91YmxlIGFybV9nb2FsXyA9IDAuMDsKKyAgZG91YmxlIGNsYXdfZ29hbF8gPSAwLjA7CisgIGJvb2wgY2xhd19yb2xsZXJzX2Nsb3NlZF8gPSBmYWxzZTsKKyAgYm9vbCBmcmlkZ2VfY2xvc2VkXyA9IGZhbHNlOworICBhY3RvcnM6OlByb2ZpbGVQYXJhbXMgYXJtX3BhcmFtc18gPSBrQXJtTW92ZTsKKyAgYWN0b3JzOjpQcm9maWxlUGFyYW1zIGVsZXZhdG9yX3BhcmFtc18gPSBrRWxldmF0b3JNb3ZlOworCisgIC8vIElmIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBzdWJzeXN0ZW1zIHRvIHplcm8uCisgIGJvb2wgd2FpdGluZ19mb3JfemVyb18gPSB0cnVlOworCisgIGJvb2wgYXV0b19ydW5uaW5nXyA9IGZhbHNlOworCisgIDo6YW9zOjpjb21tb246OmFjdGlvbnM6OkFjdGlvblF1ZXVlIGFjdGlvbl9xdWV1ZV87CisKKyAgOjphb3M6OnV0aWw6OlNpbXBsZUxvZ0ludGVydmFsIG5vX2RyaXZldHJhaW5fc3RhdHVzXyA9CisgICAgICA6OmFvczo6dXRpbDo6U2ltcGxlTG9nSW50ZXJ2YWwoOjphb3M6OnRpbWU6OlRpbWU6OkluU2Vjb25kcygwLjIpLCBXQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBkcml2ZXRyYWluIHN0YXR1cyIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGpveXN0aWNrcworfSAgLy8gbmFtZXNwYWNlIGlucHV0Cit9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCisKK2ludCBtYWluKCkgeworICA6OmFvczo6SW5pdCgpOworICA6OmZyYzk3MTo6aW5wdXQ6OmpveXN0aWNrczo6UmVhZGVyIHJlYWRlcjsKKyAgcmVhZGVyLlJ1bigpOworICA6OmFvczo6Q2xlYW51cCgpOworfQpkaWZmIC0tZ2l0IGEveTIwMTUvcHJpbWUvYnVpbGQuc2ggYi95MjAxNS9wcmltZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NmNmZjQwCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvcHJpbWUvYnVpbGQuc2gKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vYmFzaAorCitjZCAkKGRpcm5hbWUgJDApCisKK2V4ZWMgLi4vLi4vYW9zL2J1aWxkL2J1aWxkLnB5ICQwIHByaW1lIHkyMDE1IHByaW1lLmd5cCAiJEAiCmRpZmYgLS1naXQgYS95MjAxNS9wcmltZS9jb21waWxlX2xvb3Auc2ggYi95MjAxNS9wcmltZS9jb21waWxlX2xvb3Auc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGU2YjBkMwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L3ByaW1lL2NvbXBpbGVfbG9vcC5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCisjIFJ1bnMgYGJ1aWxkLnNoIGFsbGAgYW5kIHRoZW4gd2FpdHMgZm9yIGEgZmlsZSB0byBiZSBtb2RpZmllZCBpbiBhIGxvb3AuCisjIFVzZWZ1bCBmb3IgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGNvZGUgd2hpbGUgY29udGludW91c2x5IG1ha2luZyBzdXJlIHRoZXkKKyMgY29tcGlsZS4KKyMgUmVxdWlyZXMgdGhlIHV0aWwtbGludXggYW5kIGlub3RpZnktdG9vbHMgcGFja2FnZXMuCisKK2NocnQgLWkgLXAgMCAkJAoraW9uaWNlIC1jIDMgLXAgJCQKKword2hpbGUgdHJ1ZTsgZG8KKwkkKGRpcm5hbWUgJDApL2J1aWxkLnNoIGFsbAorCWVjaG8gJ2NvbXBpbGVfbG9vcC5zaDogV2FpdGluZyBmb3IgYSBmaWxlIG1vZGlmaWNhdGlvbi4uLicgMT4mMgorCWlub3RpZnl3YWl0IC1lIGNsb3NlX3dyaXRlIC1yIGFvcyBmcmM5NzEgYmJiX2NhcGUKKwllY2hvICdjb21waWxlX2xvb3Auc2g6IERvbmUgd2FpdGluZyBmb3IgYSBmaWxlIG1vZGlmaWNhdGlvbicgMT4mMgorZG9uZQpkaWZmIC0tZ2l0IGEveTIwMTUvcHJpbWUvcHJpbWUuZ3lwIGIveTIwMTUvcHJpbWUvcHJpbWUuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOGIwMDYKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS9wcmltZS9wcmltZS5neXAKQEAgLTAsMCArMSw0MSBAQAoreworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnQWxsJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJy4uLy4uL2ZyYzk3MS9mcmM5NzEuZ3lwOkFsbCcsCisKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpkcml2ZXRyYWluJywKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpkcml2ZXRyYWluX2xpYl90ZXN0JywKKyAgICAgICAgJy4uL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpyZXBsYXlfZHJpdmV0cmFpbicsCisgICAgICAgICcuLi9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuZ3lwOmZyaWRnZScsCisgICAgICAgICcuLi9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuZ3lwOmZyaWRnZV9saWJfdGVzdCcsCisgICAgICAgICcuLi9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuZ3lwOnJlcGxheV9mcmlkZ2UnLAorICAgICAgICAnLi4vY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwOmNsYXcnLAorICAgICAgICAnLi4vY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwOmNsYXdfbGliX3Rlc3QnLAorICAgICAgICAnLi4vY29udHJvbF9sb29wcy9jbGF3L2NsYXcuZ3lwOnJlcGxheV9jbGF3JywKKyAgICAgICAgJy4uL2F1dG9ub21vdXMvYXV0b25vbW91cy5neXA6YXV0bycsCisgICAgICAgICcuLi95MjAxNS5neXA6am95c3RpY2tfcmVhZGVyJywKKyAgICAgICAgJy4uL2h0dHBfc3RhdHVzL2h0dHBfc3RhdHVzLmd5cDpodHRwX3N0YXR1cycsCisgICAgICAgICcuLi91dGlsL3V0aWwuZ3lwOmtpbmVtYXRpY3NfdGVzdCcsCisgICAgICAgICcuLi9hY3RvcnMvYWN0b3JzLmd5cDpiaW5hcmllcycsCisgICAgICBdLAorICAgICAgJ2NvcGllcyc6IFsKKyAgICAgICAgeworICAgICAgICAgICdkZXN0aW5hdGlvbic6ICc8KHJzeW5jX2RpciknLAorICAgICAgICAgICdmaWxlcyc6IFsKKyAgICAgICAgICAgICdzdGFydF9saXN0LnR4dCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgIF0sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydBUkNISVRFQ1RVUkU9PSJhcm1fZnJjIicsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJy4uL3dwaWxpYi93cGlsaWIuZ3lwOndwaWxpYl9pbnRlcmZhY2UnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEveTIwMTUvcHJpbWUvc3RhcnRfbGlzdC50eHQgYi95MjAxNS9wcmltZS9zdGFydF9saXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGYwYThhCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvcHJpbWUvc3RhcnRfbGlzdC50eHQKQEAgLTAsMCArMSwxOCBAQAorY2FuX3BpY2t1cF9hY3Rpb24KK2pveXN0aWNrX3JlYWRlcgorcGlja3VwX2FjdGlvbgorc2NvcmVfYWN0aW9uCitzdGFja19hY3Rpb24KK3dwaWxpYl9pbnRlcmZhY2UKK2JpbmFyeV9sb2dfd3JpdGVyCitjbGF3CitmcmlkZ2UKK2hvcml6b250YWxfY2FuX3BpY2t1cF9hY3Rpb24KK2xpZnRfYWN0aW9uCitzdGFja19hbmRfbGlmdF9hY3Rpb24KK3N0YWNrX2FuZF9ob2xkX2FjdGlvbgoraGVsZF90b19saWZ0X2FjdGlvbgorZHJpdmV0cmFpbgorYXV0bworZHJpdmV0cmFpbl9hY3Rpb24KK2h0dHBfc3RhdHVzCmRpZmYgLS1naXQgYS95MjAxNS91dGlsL2tpbmVtYXRpY3MuaCBiL3kyMDE1L3V0aWwva2luZW1hdGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTAxMmUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxNS91dGlsL2tpbmVtYXRpY3MuaApAQCAtMCwwICsxLDM4OCBAQAorI2lmbmRlZiBZMjAxNV9VVElMX0tJTkVNQVRJQ1NfSF8KKyNkZWZpbmUgWTIwMTVfVVRJTF9LSU5FTUFUSUNTX0hfCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlICJFaWdlbi9EZW5zZSIKKyNpbmNsdWRlICJ5MjAxNS9jb25zdGFudHMuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdXRpbCB7CisKKy8vIEEgY2xhc3MgZm9yIHBlcmZvcm1pbmcgZm9yd2FyZCBhbmQgaW52ZXJzZSBraW5lbWF0aWNzIG9uIHRoZSBlbGV2YXRvci1hcm0KKy8vIHN5c3RlbS4gSXQgY2FuIGNhbGN1bGF0ZSB3aGVyZSB0aGUgZnJpZGdlIGdyYWJiZXJzIHdpbGwgYmUgaWYgdGhlIGFybSBhbmQKKy8vIGVsZXZhdG9yIGFyZSBhdCBhIGdpdmVuIHBvc2l0aW9uLCBhcyB3ZWxsIGFzIHdoZXJlIHRoZSBhcm0gYW5kIGVsZXZhdG9yCisvLyBzaG91bGQgZ28gaW4gb3JkZXIgdG8gZ2V0IHRoZSBncmFiYmVycyB0byBhIHNwZWNpZmljIGxvY2F0aW9uLgorY2xhc3MgRWxldmF0b3JBcm1LaW5lbWF0aWNzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgZW51bSB7CisgICAgLy8gVGhlc2Ugc3BlY2lmeSB0aGUgcGFydGljdWxhciByZWdpb24gdGhhdCBhbiBpbnZhbGlkIHJlcXVlc3Qgd2FzIGluLiBSaWdodAorICAgIC8vIGlzIHRvd2FyZCB0aGUgZnJvbnQgb2YgdGhlIHJvYm90LCBsZWZ0IGlzIHRvd2FyZCB0aGUgYmFjay4KKworICAgIC8vIFJlcXVlc3QgaXMgdmFsaWQuCisgICAgUkVHSU9OX1ZBTElEID0gMCwKKyAgICAvLyBSZXF1ZXN0IGlzIGZhcnRoZXIgcmlnaHQgdGhhbiB0aGUgYXJtIGNhbiBleHRlbmQuCisgICAgUkVHSU9OX1JJR0hUID0gMSA8PCAwLAorICAgIC8vIFJlcXVlc3QgaXMgdG93YXJkcyB0aGUgZnJvbnQgb2YgdGhlIHJvYm90IGJ1dCBoaWdoZXIgdGhhbiB3ZSBjYW4gZXh0ZW5kCisgICAgLy8gd2l0aCB0aGUgZWxldmF0b3IgYW5kIHRoZSBhcm0uCisgICAgUkVHSU9OX1VQUEVSX1JJR0hUID0gMSA8PCAxLAorICAgIC8vIFdlIGNhbiBnZXQgdGhlIHggcGFydCBvZiB0aGUgcmVxdWVzdCwgd2hpY2ggaXMgdG93YXJkcyB0aGUgZnJvbnQgb2YgdGhlCisgICAgLy8gcm9ib3QsIGJ1dCBub3QgdGhlIGggcGFydCwgd2hpY2ggaXMgdG9vIGhpZ2guCisgICAgUkVHSU9OX0lOU0lERV9VUFBFUl9SSUdIVCA9IDEgPDwgMiwKKyAgICAvLyBXZSBjYW4gZ2V0IHRoZSB4IHBhcnQgb2YgdGhlIHJlcXVlc3QsIHdoaWNoIGlzIHRvd2FyZHMgdGhlIGZyb250IG9mIHRoZQorICAgIC8vIHJvYm90LCBidXQgbm90IHRoZSBoIHBhcnQsIHdoaWNoIGlzIHRvbyBsb3cuCisgICAgUkVHSU9OX0lOU0lERV9MT1dFUl9SSUdIVCA9IDEgPDwgMywKKyAgICAvLyBSZXF1ZXN0IGlzIHRvd2FyZHMgdGhlIGZyb250IG9mIHRoZSByb2JvdCBidXQgbG93ZXIgdGhhbiB3ZSBjYW4gZXh0ZW5kCisgICAgLy8gd2l0aCB0aGUgZWxldmF0b3IgYW5kIHRoZSBhcm0uCisgICAgUkVHSU9OX0xPV0VSX1JJR0hUID0gMSA8PCA0LAorICAgIC8vIFJlcXVlc3QgaXMgZmFydGhlciBsZWZ0IHRoYW4gdGhlIGFybSBjYW4gZXh0ZW5kLgorICAgIFJFR0lPTl9MRUZUID0gMSA8PCA1LAorICAgIC8vIFJlcXVlc3QgaXMgdG93YXJkcyB0aGUgYmFjayBvZiB0aGUgcm9ib3QgYnV0IGhpZ2hlciB0aGFuIHdlIGNhbiBleHRlbmQKKyAgICAvLyB3aXRoIHRoZSBlbGV2YXRvciBhbmQgdGhlIGFybS4KKyAgICBSRUdJT05fVVBQRVJfTEVGVCA9IDEgPDwgNiwKKyAgICAvLyBXZSBjYW4gZ2V0IHRoZSB4IHBhcnQgb2YgdGhlIHJlcXVlc3QsIHdoaWNoIGlzIHRvd2FyZHMgdGhlIGZyb250IG9mIHRoZQorICAgIC8vIHJvYm90LCBidXQgbm90IHRoZSBoIHBhcnQsIHdoaWNoIGlzIHRvbyBoaWdoLgorICAgIFJFR0lPTl9JTlNJREVfVVBQRVJfTEVGVCA9IDEgPDwgNywKKyAgICAvLyBXZSBjYW4gZ2V0IHRoZSB4IHBhcnQgb2YgdGhlIHJlcXVlc3QsIHdoaWNoIGlzIHRvd2FyZHMgdGhlIGJhY2sgb2YgdGhlCisgICAgLy8gcm9ib3QsIGJ1dCBub3QgdGhlIGggcGFydCwgd2hpY2ggaXMgdG9vIGxvdy4KKyAgICBSRUdJT05fSU5TSURFX0xPV0VSX0xFRlQgPSAxIDw8IDgsCisgICAgLy8gUmVxdWVzdCBpcyB0b3dhcmRzIHRoZSBiYWNrIG9mIHRoZSByb2JvdCBidXQgbG93ZXIgdGhhbiB3ZSBjYW4gZXh0ZW5kCisgICAgLy8gd2l0aCB0aGUgZWxldmF0b3IgYW5kIHRoZSBhcm0uCisgICAgUkVHSU9OX0xPV0VSX0xFRlQgPSAxIDw8IDksCisgICAgLy8gUmVxdWVzdCBpcyBpbnZhbGlkLCBidXQgZG9uJ3Qga25vdyB3aGVyZSBpdCBpcyBvdXQgb2YgcmFuZ2UuCisgICAgUkVHSU9OX1VOS05PV04gPSAxIDw8IDEwLAorICB9IFJlZ2lvbjsKKworICBjbGFzcyBLaW5lbWF0aWNSZXN1bHQgeworICAgcHVibGljOgorICAgIC8vIFRoZSBlbGV2YXRvciBoZWlnaHQgcmVzdWx0IGZyb20gYW4gaW52ZXJzZSBraW5lbWF0aWMuCisgICAgZG91YmxlIGVsZXZhdG9yX2hlaWdodDsKKyAgICAvLyBUaGUgYXJtIGFuZ2xlIHJlc3VsdCBmcm9tIGFuIGludmVyc2Uga2luZW1hdGljLgorICAgIGRvdWJsZSBhcm1fYW5nbGU7CisgICAgLy8gUmVzdWx0aW5nIHZlbG9jaXR5IG9mIHRoZSBlbGV2YXRvciBnaXZlbiB4LHkgdmVsb2NpdGllcy4KKyAgICBkb3VibGUgZWxldmF0b3JfdmVsb2NpdHk7CisgICAgLy8gUmVzdWx0aW5nIHZlbG9jaXR5IG9mIHRoZSBhcm0gZ2l2ZW4geCx5IHZlbG9jaXRpZXMuCisgICAgZG91YmxlIGFybV92ZWxvY2l0eTsKKyAgICAvLyBUaGUgZnJpZGdlIGhlaWdodCB2YWx1ZSBmcm9tIGEgZm9yd2FyZCBraW5lbWF0aWMuCisgICAgZG91YmxlIGZyaWRnZV9oOworICAgIC8vIFRoZSBmcmlkZ2UgeCB2YWx1ZSBmcm9tIGEgZm9yd2FyZCBraW5lbWF0aWMuCisgICAgZG91YmxlIGZyaWRnZV94OworICAgIC8vIFJlc3VsdGluZyB2ZWxvY2l0eSBvZiB0aGUgZnJpZGdlIGhlaWdodCBnaXZlbiBhcm0gYW5kIGVsZXZhdG9yCisgICAgLy8gdmVsb2NpdGllcy4KKyAgICBkb3VibGUgZnJpZGdlX2hfdmVsb2NpdHk7CisgICAgLy8gUmVzdWx0aW5nIHZlbG9jaXR5IG9mIHRoZSBmcmlkZ2UgeCBnaXZlbiBhcm0gYW5kIGVsZXZhdG9yIHZlbG9jaXRpZXMuCisgICAgZG91YmxlIGZyaWRnZV94X3ZlbG9jaXR5OworICB9OworCisgIC8vIElmIHdlIHVzZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3ZSB3aWwganVzdCBhbHdheXMgbm90IGJlIGFibGUgdG8gbW92ZS4KKyAgRWxldmF0b3JBcm1LaW5lbWF0aWNzKCkKKyAgICAgIDogbGVuZ3RoX2FybV8oMS4wKSwKKyAgICAgICAgZWxldmF0b3JfbWF4XygwLjApLAorICAgICAgICBlbGV2YXRvcl9taW5fKDAuMCksCisgICAgICAgIHVwcGVyX2FuZ2xlX2xpbWl0XygwLjApLAorICAgICAgICBsb3dlcl9hbmdsZV9saW1pdF8oMC4wKSB7fQorCisgIEVsZXZhdG9yQXJtS2luZW1hdGljcyhkb3VibGUgbGVuZ3RoX2FybSwgZG91YmxlIGhlaWdodF9tYXgsIGRvdWJsZSBoZWlnaHRfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFuZ2xlX21heCwgZG91YmxlIGFuZ2xlX21pbikKKyAgICAgIDogbGVuZ3RoX2FybV8obGVuZ3RoX2FybSksCisgICAgICAgIGVsZXZhdG9yX21heF8oaGVpZ2h0X21heCksCisgICAgICAgIGVsZXZhdG9yX21pbl8oaGVpZ2h0X21pbiksCisgICAgICAgIHVwcGVyX2FuZ2xlX2xpbWl0XyhhbmdsZV9tYXgpLAorICAgICAgICBsb3dlcl9hbmdsZV9saW1pdF8oYW5nbGVfbWluKSwKKyAgICAgICAgZ2VvbWV0cnlfKGZyYzk3MTo6Y29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbGF3R2VvbWV0cnkpIHt9CisKKyAgfkVsZXZhdG9yQXJtS2luZW1hdGljcygpIHt9CisKKyAgLy8gTGltaXQgYSBudW1iZXIgdG8gdGhlIHNwZWVkIG9mIGxpZ2h0LiBUaGUgbG9vcHMgc2hvdWxkIGhhbmRsZSB0aGlzIGEgbG90CisgIC8vIGJldHRlciB0aGFuIG92ZXJmbG93LgorICB2b2lkIExpbWl0TGlnaHRTcGVlZChkb3VibGUqIG51bSkgeworICAgIGlmICgqbnVtID4gMjk5NzkyNDU4LjApIHsKKyAgICAgICpudW0gPSAyOTk3OTI0NTguMDsKKyAgICB9CisgICAgaWYgKCpudW0gPCAtMjk5NzkyNDU4LjApIHsKKyAgICAgICpudW0gPSAtMjk5NzkyNDU4LjA7CisgICAgfQorICAgIGlmICghOjpzdGQ6OmlzZmluaXRlKCpudW0pKSB7CisgICAgICAqbnVtID0gMC4wOworICAgIH0KKyAgfQorCisgIC8vIENhbGN1bGF0ZXMgdGhlIGFybSBhbmdsZSBpbiByYWRpYW5zIGFuZCB0aGUgZWxldmF0b3IgaGVpZ2h0IGluIG1ldGVycyBmb3IKKyAgLy8gYSBkZXNpcmVkIEZyaWRnZSBncmFiYmVyIGhlaWdodCBhbmQgeCBsb2NhdGlvbi4geCBpcyBwb3NpdGl2ZSBnb2luZworICAvLyB0b3dhcmQgdGhlIGZyb250IG9mIHRoZSByb2JvdC4KKyAgLy8gaCBpcyBwb3NpdGl2ZSBnb2luZyB1cC4geD0wIGFuZCBoPTAgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB0b3AgZnJpZGdlCisgIC8vIGdyYWJiZXIgd2hlbiB0aGUgZWxldmF0b3IgaXMgYXQgMCBoZWlnaHQgYW5kIHRoZSBhcm0gYW5nbGUgaXMgMCAodmVydGljYWwpLgorICAvLyBCb3RoIHRoZSB4IGFuZCBoIHZhbHVlcyBhcmUgZ2l2ZW4gaW4gbWV0ZXJzLgorICAvLyBSZXR1cm5zIHRoZSByZWdpb24gb2YgdGhlIHJlcXVlc3QuCisgIC8vIFJlc3VsdCBpczoKKyAgLy8gdGhlIGFuZ2xlIG9mIHRoZSBhcm0gaW4gcmFkaWFucworICAvLyB0aGUgaGVpZ2h0IG9mIHRoZSBlbGV2YXRvciBpbiBtZXRlcnMKKyAgLy8gdGhlIHJlc3VsdGluZyB4CisgIC8vIGFuZCB0aGUgcmVzdWx0aW5nIGgKKyAgLy8gSWYgYW4gaW1wb3NzaWJsZSBsb2NhdGlvbiBpcyByZXF1ZXN0ZWQsIHRoZSBhcm0gYW5nbGUgYW5kIGVsZXZhdG9yIGhlaWdodAorICAvLyByZXR1cm5lZCBhcmUgdGhlIGNsb3Nlc3QgcG9zc2libGUgZm9yIHRoZSByZXF1ZXN0ZWQgZnJpZGdlIGdyYWJiZXIgaGVpZ2h0LgorICAvLyBJZiB0aGUgcmVxdWVzdGVkIGhlaWdodCBpcyBhYm92ZSB0aGUgbWF4IHBvc3NpYmxlIGhlaWdodCwgdGhlIGFuZ2xlCisgIC8vIHdpbGwgYmUgMCBhbmQgdGhlIGhlaWdodCB3aWxsIGJlIHRoZSBtYXggcG9zc2libGUgaGVpZ2h0IG9mIHRoZSBlbGV2YXRvci4KKyAgaW50IEludmVyc2VLaW5lbWF0aWMoZG91YmxlIHJlcXVlc3RfeCwgZG91YmxlIHJlcXVlc3RfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlcXVlc3RfeF92ZWxvY2l0eSwgZG91YmxlIHJlcXVlc3RfeV92ZWxvY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgS2luZW1hdGljUmVzdWx0KiByZXN1bHQpIHsKKyAgICBpbnQgdmFsaWRfb3JfaW52YWxpZCA9IFJFR0lPTl9WQUxJRDsKKworICAgIGRvdWJsZSBzcXVhcmVfYXJtID0gbGVuZ3RoX2FybV8gKiBsZW5ndGhfYXJtXzsKKyAgICBkb3VibGUgdGVybSA9IDo6c3RkOjpzcXJ0KHNxdWFyZV9hcm0gLSByZXF1ZXN0X3ggKiByZXF1ZXN0X3gpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB4IGxvY2F0aW9uIGNhbiBiZSBzYXRpc2ZpZWQuICBJZiB0aGUgcmVxdWVzdGVkIHgKKyAgICAvLyBsb2NhdGlvbgorICAgIC8vIGlzIGZ1cnRoZXIgb3V0IHRoYW4gdGhlIGFybSBjYW4gZ28sIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYW55IGVsZXZhdG9yCisgICAgLy8gbG9jYXRpb24uCisgICAgaWYgKHJlcXVlc3RfeCA+IGxlbmd0aF9hcm1fKSB7CisgICAgICByZXN1bHQtPmFybV9hbmdsZSA9IC1NX1BJICogMC41OworICAgICAgdmFsaWRfb3JfaW52YWxpZCB8PSBSRUdJT05fUklHSFQ7CisgICAgfSBlbHNlIGlmIChyZXF1ZXN0X3ggPCAtbGVuZ3RoX2FybV8pIHsKKyAgICAgIHJlc3VsdC0+YXJtX2FuZ2xlID0gTV9QSSAqIDAuNTsKKyAgICAgIHZhbGlkX29yX2ludmFsaWQgfD0gUkVHSU9OX0xFRlQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC0+YXJtX2FuZ2xlID0gOjpzdGQ6OmFzaW4oLXJlcXVlc3RfeCAvIGxlbmd0aF9hcm1fKTsKKyAgICAgIHJlc3VsdC0+YXJtX3ZlbG9jaXR5ID0gKC0xLjAgLyB0ZXJtKSAqIHJlcXVlc3RfeF92ZWxvY2l0eTsKKyAgICAgIExpbWl0TGlnaHRTcGVlZCgmcmVzdWx0LT5hcm1fdmVsb2NpdHkpOworICAgIH0KKworICAgIHJlc3VsdC0+ZWxldmF0b3JfaGVpZ2h0ID0KKyAgICAgICAgcmVxdWVzdF9oICsgbGVuZ3RoX2FybV8gKiAoMS4wIC0gOjpzdGQ6OmNvcyhyZXN1bHQtPmFybV9hbmdsZSkpOworICAgIHJlc3VsdC0+ZWxldmF0b3JfdmVsb2NpdHkgPQorICAgICAgICAocmVxdWVzdF94IC8gKHNxdWFyZV9hcm0gKiB0ZXJtKSkgKiByZXF1ZXN0X3hfdmVsb2NpdHkgKworICAgICAgICByZXF1ZXN0X3lfdmVsb2NpdHk7CisgICAgTGltaXRMaWdodFNwZWVkKCZyZXN1bHQtPmVsZXZhdG9yX3ZlbG9jaXR5KTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWVzdGVkIGVsZXZhdG9yIGhlaWdodCBpcyBwb3NzaWJsZQorICAgIGlmIChyZXF1ZXN0X2ggPiBlbGV2YXRvcl9tYXhfKSB7CisgICAgICAvLyBUaGUgZWxldmF0b3IgY2Fubm90IGdvIGhpZ2ggZW5vdWdoIHdpdGggYW55IGFybSBhbmdsZSB0byBzYXRpc2Z5IHRoaXMKKyAgICAgIC8vIHJlcXVlc3QuIFNvIHBvc2l0aW9uIHRoZSBlbGV2YXRvciBhdCB0aGUgdG9wIGFuZCB0aGUgYXJtIGFuZ2xlIHNldCB0bworICAgICAgLy8gdmVydGljYWwuCisgICAgICByZXN1bHQtPmVsZXZhdG9yX2hlaWdodCA9IGVsZXZhdG9yX21heF87CisgICAgICByZXN1bHQtPmFybV9hbmdsZSA9IDAuMDsKKyAgICAgIGlmIChyZXF1ZXN0X3ggPj0gMCkgeworICAgICAgICB2YWxpZF9vcl9pbnZhbGlkIHw9IFJFR0lPTl9VUFBFUl9SSUdIVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhbGlkX29yX2ludmFsaWQgfD0gUkVHSU9OX1VQUEVSX0xFRlQ7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXF1ZXN0X2ggPCAtbGVuZ3RoX2FybV8gKyBlbGV2YXRvcl9taW5fKSB7CisgICAgICAvLyBUaGUgZWxldmF0b3IgY2Fubm90IGdvIGxvdyBlbm91Z2ggd2l0aCBhbnkgYXJtIGFuZ2xlIHRvIHNhdGlzZnkgdGhpcworICAgICAgLy8gcmVxdWVzdC4gU28gcG9zaXRpb24gdGhlIGVsZXZhdG9yIGF0IHRoZSBib3R0b20gYW5kIHRoZSBhcm0gYW5nbGUgdG8KKyAgICAgIC8vIHNhdGlzZnkgdGhlIHggcmVxdWVzdCBUaGUgZWxldmF0b3Igd2lsbCBtb3ZlIHVwIGFzIHRoZSBncmFiYmVyIG1vdmVzIHRvCisgICAgICAvLyB0aGUgY2VudGVyIG9mIHRoZSByb2JvdCB3aGVuIGluIHRoaXMgcGFydCBvZiB0aGUgbW90aW9uIHNwYWNlLgorICAgICAgcmVzdWx0LT5lbGV2YXRvcl9oZWlnaHQgPSBlbGV2YXRvcl9taW5fOworICAgICAgaWYgKHJlcXVlc3RfeCA+PSAwKSB7CisgICAgICAgIHZhbGlkX29yX2ludmFsaWQgfD0gUkVHSU9OX0xPV0VSX1JJR0hUOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsaWRfb3JfaW52YWxpZCB8PSBSRUdJT05fTE9XRVJfTEVGVDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlc3VsdC0+ZWxldmF0b3JfaGVpZ2h0ID4gZWxldmF0b3JfbWF4XykgeworICAgICAgLy8gSW1wb3NzaWJseSBoaWdoIHJlcXVlc3QuICBTbyBnZXQgYXMgY2xvc2UgdG8gdGhlIHggcmVxdWVzdCB3aXRoIHRoZQorICAgICAgLy8gZWxldmF0b3IgYXQgdGhlIHRvcCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXN1bHQtPmVsZXZhdG9yX2hlaWdodCA9IGVsZXZhdG9yX21heF87CisgICAgICBpZiAocmVxdWVzdF94ID49IDApIHsKKyAgICAgICAgcmVzdWx0LT5hcm1fYW5nbGUgPQorICAgICAgICAgICAgLTo6c3RkOjphY29zKChsZW5ndGhfYXJtXyArIHJlcXVlc3RfaCAtIGVsZXZhdG9yX21heF8pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfYXJtXyk7CisgICAgICAgIHZhbGlkX29yX2ludmFsaWQgfD0gUkVHSU9OX0lOU0lERV9VUFBFUl9SSUdIVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC0+YXJtX2FuZ2xlID0gOjpzdGQ6OmFjb3MoCisgICAgICAgICAgICAobGVuZ3RoX2FybV8gKyByZXF1ZXN0X2ggLSBlbGV2YXRvcl9tYXhfKSAvIGxlbmd0aF9hcm1fKTsKKyAgICAgICAgdmFsaWRfb3JfaW52YWxpZCB8PSBSRUdJT05fSU5TSURFX1VQUEVSX0xFRlQ7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXN1bHQtPmVsZXZhdG9yX2hlaWdodCA8IGVsZXZhdG9yX21pbl8pIHsKKyAgICAgIC8vIEltcG9zc2libHkgbG93IHJlcXVlc3QuICBTbyBzYXRpc2Z5IHRoZSB4IHJlcXVlc3Qgd2l0aCB0aGUgZWxldmF0b3IKKyAgICAgIC8vIGF0IHRoZSBib3R0b20gb2YgaXRzIHJhbmdlLgorICAgICAgLy8gVGhlIGVsZXZhdG9yIHdpbGwgbW92ZSB1cCBhcyB0aGUgZ3JhYmJlciBtb3ZlcyB0byB0aGUgY2VudGVyIG9mIHRoZQorICAgICAgLy8gcm9ib3QKKyAgICAgIC8vIHdoZW4gaW4gdGhpcyBwYXJ0IG9mIHRoZSBtb3Rpb24gc3BhY2UuCisgICAgICByZXN1bHQtPmVsZXZhdG9yX2hlaWdodCA9IGVsZXZhdG9yX21pbl87CisgICAgICBpZiAocmVxdWVzdF94ID49IDApIHsKKyAgICAgICAgdmFsaWRfb3JfaW52YWxpZCB8PSBSRUdJT05fSU5TSURFX0xPV0VSX1JJR0hUOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsaWRfb3JfaW52YWxpZCB8PSBSRUdJT05fSU5TSURFX0xPV0VSX0xFRlQ7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgd2UgYXJlIG5vdCBpbiBhIHZhbGlkIHJlZ2lvbiB3ZSB3aWxsIHplcm8gdGhlIHZlbG9jaXR5IGZvciBub3cKKyAgICBpZiAodmFsaWRfb3JfaW52YWxpZCAhPSBSRUdJT05fVkFMSUQpIHsKKyAgICAgIHJlc3VsdC0+YXJtX3ZlbG9jaXR5ID0gMC4wOworICAgICAgcmVzdWx0LT5lbGV2YXRvcl92ZWxvY2l0eSA9IDAuMDsKKyAgICB9CisKKyAgICBpZiAoRm9yd2FyZEtpbmVtYXRpYyhyZXN1bHQtPmVsZXZhdG9yX2hlaWdodCwgcmVzdWx0LT5hcm1fYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5lbGV2YXRvcl92ZWxvY2l0eSwgcmVzdWx0LT5hcm1fdmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSA9PSBSRUdJT05fVU5LTk9XTikgeworICAgICAgcmV0dXJuIFJFR0lPTl9VTktOT1dOOworICAgIH0KKyAgICByZXR1cm4gdmFsaWRfb3JfaW52YWxpZDsKKyAgfQorCisgIC8vIFRha2VzIGFuIGVsZXZhdG9yIGhlaWdodCBhbmQgYXJtIGFuZ2xlIGFuZCBwcm9qZWN0cyB0aGVzZSB0byB0aGUgcmVzdWx0aW5nCisgIC8vIGZyaWRnZSBoZWlnaHQgYW5kIHggb2Zmc2V0LiBSZXR1cm5zIFJFR0lPTl9VTktOT1dOIGlmIHRoZSB2YWx1ZXMgYXJlCisgIC8vIG91dHNpZGUKKyAgLy8gbGltaXRzLiBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSBoZWlnaHQvYW5nbGUgYmVpbmcgYm91bmRlZCBhbmQgdGhlCisgIC8vIHJlc3VsdGluZyBwb3NpdGlvbiB3aWxsIGJlIHJldHVybmVkLgorICBSZWdpb24gRm9yd2FyZEtpbmVtYXRpYyhkb3VibGUgZWxldmF0b3JfaGVpZ2h0LCBkb3VibGUgYXJtX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZWxldmF0b3JfdmVsb2NpdHksIGRvdWJsZSBhcm1fdmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmVtYXRpY1Jlc3VsdCogcmVzdWx0KSB7CisgICAgcmVzdWx0LT5lbGV2YXRvcl9oZWlnaHQgPSBlbGV2YXRvcl9oZWlnaHQ7CisgICAgcmVzdWx0LT5hcm1fYW5nbGUgPSBhcm1fYW5nbGU7CisKKyAgICBSZWdpb24gdmFsaWQgPSBSRUdJT05fVkFMSUQ7CisgICAgaWYgKGVsZXZhdG9yX2hlaWdodCA8IGVsZXZhdG9yX21pbl8pIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiZWxldmF0b3IgJS4yZiBsaW1pdGVkIGF0ICUuMmZcbiIsIHJlc3VsdC0+ZWxldmF0b3JfaGVpZ2h0LAorICAgICAgICAgIGVsZXZhdG9yX21pbl8pOworICAgICAgcmVzdWx0LT5lbGV2YXRvcl9oZWlnaHQgPSBlbGV2YXRvcl9taW5fOworICAgICAgdmFsaWQgPSBSRUdJT05fVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKGVsZXZhdG9yX2hlaWdodCA+IGVsZXZhdG9yX21heF8pIHsKKyAgICAgIExPRyhXQVJOSU5HLCAiZWxldmF0b3IgJS4yZiBsaW1pdGVkIGF0ICUuMmZcbiIsIHJlc3VsdC0+ZWxldmF0b3JfaGVpZ2h0LAorICAgICAgICAgIGVsZXZhdG9yX21heF8pOworICAgICAgcmVzdWx0LT5lbGV2YXRvcl9oZWlnaHQgPSBlbGV2YXRvcl9tYXhfOworICAgICAgdmFsaWQgPSBSRUdJT05fVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKGFybV9hbmdsZSA8IGxvd2VyX2FuZ2xlX2xpbWl0XykgeworICAgICAgTE9HKFdBUk5JTkcsICJhcm0gJS4yZiBsaW1pdGVkIGF0ICUuMmZcbiIsIHJlc3VsdC0+YXJtX2FuZ2xlLAorICAgICAgICAgIGxvd2VyX2FuZ2xlX2xpbWl0Xyk7CisgICAgICByZXN1bHQtPmFybV9hbmdsZSA9IGxvd2VyX2FuZ2xlX2xpbWl0XzsKKyAgICAgIHZhbGlkID0gUkVHSU9OX1VOS05PV047CisgICAgfQorICAgIGlmIChhcm1fYW5nbGUgPiB1cHBlcl9hbmdsZV9saW1pdF8pIHsKKyAgICAgIHJlc3VsdC0+YXJtX2FuZ2xlID0gdXBwZXJfYW5nbGVfbGltaXRfOworICAgICAgTE9HKFdBUk5JTkcsICJhcm0gJS4yZiBsaW1pdGVkIGF0ICUuMmZcbiIsIHJlc3VsdC0+YXJtX2FuZ2xlLAorICAgICAgICAgIHVwcGVyX2FuZ2xlX2xpbWl0Xyk7CisgICAgICB2YWxpZCA9IFJFR0lPTl9VTktOT1dOOworICAgIH0KKyAgICAvLyBDb21wdXRlIHRoZSBmcmlkZ2UgZ3JhYmJlciBoZWlnaHQgYW5kIHggbG9jYXRpb24gdXNpbmcgdGhlIGNvbXB1dGVkCisgICAgLy8gZWxldmF0b3IgaGVpZ2h0IGFuZCBhcm0gYW5nbGUuCisgICAgcmVzdWx0LT5mcmlkZ2VfaCA9IHJlc3VsdC0+ZWxldmF0b3JfaGVpZ2h0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgKDo6c3RkOjpjb3MocmVzdWx0LT5hcm1fYW5nbGUpIC0gMS4wKSAqIGxlbmd0aF9hcm1fOworICAgIHJlc3VsdC0+ZnJpZGdlX3ggPSAtOjpzdGQ6OnNpbihyZXN1bHQtPmFybV9hbmdsZSkgKiBsZW5ndGhfYXJtXzsKKyAgICAvLyB2ZWxvY2l0eSBiYXNlZCBvbiBqb2Fjb2JpYW4KKyAgICByZXN1bHQtPmZyaWRnZV94X3ZlbG9jaXR5ID0KKyAgICAgICAgLWxlbmd0aF9hcm1fICogOjpzdGQ6OmNvcyhyZXN1bHQtPmFybV9hbmdsZSkgKiBhcm1fdmVsb2NpdHk7CisgICAgTGltaXRMaWdodFNwZWVkKCZyZXN1bHQtPmZyaWRnZV94X3ZlbG9jaXR5KTsKKyAgICByZXN1bHQtPmZyaWRnZV9oX3ZlbG9jaXR5ID0KKyAgICAgICAgLWxlbmd0aF9hcm1fICogOjpzdGQ6OnNpbihyZXN1bHQtPmFybV9hbmdsZSkgKiBhcm1fdmVsb2NpdHkgKworICAgICAgICBlbGV2YXRvcl92ZWxvY2l0eTsKKyAgICBMaW1pdExpZ2h0U3BlZWQoJnJlc3VsdC0+ZnJpZGdlX2hfdmVsb2NpdHkpOworICAgIHJldHVybiB2YWxpZDsKKyAgfQorCisgIC8vIFNhbWUgYXMgRm9yd2FyZEtpbmVtYXRpYyBidXQgd2l0aG91dCBhbnkgY2hlY2tpbmcuCisgIEVpZ2VuOjpWZWN0b3IyZCBGb3J3YXJkS2luZW1hdGljTm9DaGVja2luZyhkb3VibGUgZWxldmF0b3JfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFybV9hbmdsZSkgeworICAgIC8vIENvbXB1dGUgdGhlIGZyaWRnZSBncmFiYmVyIGhlaWdodCBhbmQgeCBsb2NhdGlvbiB1c2luZyB0aGUgY29tcHV0ZWQKKyAgICAvLyBlbGV2YXRvciBoZWlnaHQgYW5kIGFybSBhbmdsZS4KKyAgICBFaWdlbjo6VmVjdG9yMmQgZ3JhYmJlcl9sb2NhdGlvbjsKKyAgICBncmFiYmVyX2xvY2F0aW9uLnkoKSA9CisgICAgICAgIGVsZXZhdG9yX2hlaWdodCArICg6OnN0ZDo6Y29zKGFybV9hbmdsZSkgLSAxLjApICogbGVuZ3RoX2FybV87CisgICAgZ3JhYmJlcl9sb2NhdGlvbi54KCkgPSAtOjpzdGQ6OnNpbihhcm1fYW5nbGUpICogbGVuZ3RoX2FybV87CisgICAgcmV0dXJuIGdyYWJiZXJfbG9jYXRpb247CisgIH0KKworICAvLyAyIGRpbWVuc2lvbmFsIHZlcnNpb24gb2YgY3Jvc3MgcHJvZHVjdAorICBkb3VibGUgQ3Jvc3MoRWlnZW46OlZlY3RvcjJkIGEsIEVpZ2VuOjpWZWN0b3IyZCBiKSB7CisgICAgZG91YmxlIGNyb3NzUHJvZHVjdCA9IGEueCgpICogYi55KCkgLSBhLnkoKSAqIGIueCgpOworICAgIHJldHVybiBjcm9zc1Byb2R1Y3Q7CisgIH0KKworICAvLyBUZWxsIHdoZXRoZXIgb3Igbm90IGl0IGlzIHNhZmUgdG8gbW92ZSB0aGUgZ3JhYmJlciB0byBhIHBvc2l0aW9uLgorICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgbW92ZSBpcyBzYWZlLgorICAvLyBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZW4gYSBzYWZlX2NsYXdfYW5nbGUgdGhhdCBpcyBncmVhdGVyIHRoYW4gemVybyBpcworICAvLyBhY2NlcHRhYmxlIG90aGVyd2lzZSBpZiBzYWZlX2NsYXdfYW5nbGUgaXMgbGVzcyB0aGFuIHplcm8gdGhlcmUgd2lsbCBiZSBubworICAvLyB2YWxpZCBzb2x1dGlvbi4KKyAgYm9vbCBHcmFiYmVyQXJtSW50ZXJzZWN0aW9uQ2hlY2soZG91YmxlIGVsZXZhdG9yX2hlaWdodCwgZG91YmxlIGFybV9hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNsYXdfYW5nbGUsIGRvdWJsZSogc2FmZV9jbGF3X2FuZ2xlKSB7CisgICAgRWlnZW46OlZlY3RvcjJkIGdyYWJiZXJfbG9jYXRpb24gPQorICAgICAgICBGb3J3YXJkS2luZW1hdGljTm9DaGVja2luZyhlbGV2YXRvcl9oZWlnaHQsIGFybV9hbmdsZSk7CisgICAgaWYgKGdyYWJiZXJfbG9jYXRpb24ueCgpIDwgZ2VvbWV0cnlfLmdyYWJiZXJfYWx3YXlzX3NhZmVfeF9tYXggfHwKKyAgICAgICAgZ3JhYmJlcl9sb2NhdGlvbi55KCkgPiBnZW9tZXRyeV8uZ3JhYmJlcl9hbHdheXNfc2FmZV9oX21pbikgeworICAgICAgKnNhZmVfY2xhd19hbmdsZSA9IGNsYXdfYW5nbGU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgRWlnZW46OlZlY3RvcjJkIGdyYWJiZXJfYm90dG9tX2VuZDsKKyAgICBFaWdlbjo6VmVjdG9yMmQgY2xhd19pX3VuaXRfZGlyZWN0aW9uKDo6c3RkOjpjb3MoY2xhd19hbmdsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW4oY2xhd19hbmdsZSkpOworICAgIEVpZ2VuOjpWZWN0b3IyZCBjbGF3X2pfdW5pdF9kaXJlY3Rpb24oLTo6c3RkOjpzaW4oY2xhd19hbmdsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3MoY2xhd19hbmdsZSkpOworCisgICAgLy8gVmVjdG9yIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgYXJtIHJvdGF0aW9uIGF4aXMgdG8gZnJvbnQgYm90dG9tCisgICAgLy8gY29ybmVyIG9mIHRoZSBncmFiYmVyLgorICAgIEVpZ2VuOjpWZWN0b3IyZCBncmFiYmVyX2VuZF9sb2NhdGlvbl9mcm9tX2FybV9heGlzKAorICAgICAgICBnZW9tZXRyeV8uZ3JhYmJlcl9oYWxmX2xlbmd0aCwgLWdlb21ldHJ5Xy5ncmFiYmVyX2RlbHRhX3kpOworCisgICAgLy8gQm90dG9tIGZyb250IGNvcm5lciBvZiB0aGUgZ3JhYmJlci4gIFRoaXMgaXMgd2hhdCB3aWxsIHVzdWFsbHkgaGl0IHRoZQorICAgIC8vIGNsYXcgZmlyc3QuCisgICAgZ3JhYmJlcl9ib3R0b21fZW5kID0gZ3JhYmJlcl9sb2NhdGlvbiArIGdyYWJiZXJfZW5kX2xvY2F0aW9uX2Zyb21fYXJtX2F4aXM7CisKKyAgICAvLyBMb2NhdGlvbiBvZiB0aGUgY2xhdyBob3Jpem9udGFsIGF4aXMgb2Ygcm90YXRpb24gcmVsYXRpdmUgdG8gdGhlCisgICAgLy8gYXJtIGF4aXMgb2Ygcm90YXRpb24gd2l0aCB0aGUgZWxldmF0b3IgYXQgMCBhbmQgdGhlIGFybSBhbmdsZSBvZiAwCisgICAgLy8gVGhlIGhvcml6b250YWwgYXhpcyBpcyB0aGUgdXAgYW5kIGRvd24gbW90aW9uIGF4aXMuCisgICAgRWlnZW46OlZlY3RvcjJkIGNsYXdfdXBkb3duX2F4aXMoZ2VvbWV0cnlfLmdyYWJiZXJfYXJtX2hvcnpfc2VwYXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZ2VvbWV0cnlfLmdyYWJiZXJfYXJtX3ZlcnRfc2VwYXJhdGlvbik7CisKKyAgICAvLyBUaGlzIHBvaW50IGlzIHVzZWQgdG8gbWFrZSBhIGNyb3NzIHByb2R1Y3Qgd2l0aCB0aGUgYm90dG9tIGVuZCBvZiB0aGUKKyAgICAvLyBncmFiYmVyCisgICAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgY3Jvc3MgcHJvZHVjdCB0ZWxscyBpZiB0aGUgcGFydHMgaW50ZXJzZWN0IG9yIG5vdC4KKyAgICBFaWdlbjo6VmVjdG9yMmQgY2xhd190b3BfcmVmX3BvaW50ID0KKyAgICAgICAgY2xhd191cGRvd25fYXhpcyArIGdlb21ldHJ5Xy5jbGF3X3RvcF90aGlja25lc3MgKiBjbGF3X2pfdW5pdF9kaXJlY3Rpb247CisKKyAgICBFaWdlbjo6VmVjdG9yMmQgY2xhd190b3BfcmVmX3BvaW50X3RvX2dyYWJiZXJfYm90dG9tX2VuZCA9CisgICAgICAgIGdyYWJiZXJfYm90dG9tX2VuZCAtIGNsYXdfdG9wX3JlZl9wb2ludDsKKyAgICBkb3VibGUgY2xhd19ncmFiYmVyX2NoZWNrID0KKyAgICAgICAgQ3Jvc3MoY2xhd19pX3VuaXRfZGlyZWN0aW9uLCBjbGF3X3RvcF9yZWZfcG9pbnRfdG9fZ3JhYmJlcl9ib3R0b21fZW5kKTsKKworICAgIC8vIE5vdyBzZXQgdGhlIHNhZmUgY2xhdyBhbmdsZS4KKyAgICBpZiAoY2xhd19ncmFiYmVyX2NoZWNrID4gMC4wKSB7CisgICAgICAqc2FmZV9jbGF3X2FuZ2xlID0gY2xhd19hbmdsZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoZ3JhYmJlcl9ib3R0b21fZW5kLnkoKSA8CisgICAgICAgICAgICAgICBjbGF3X3VwZG93bl9heGlzLnkoKSArCisgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnlfLmNsYXdfdG9wX3RoaWNrbmVzcykgeyAgLy8gZ3JhYmJlciBpcyB0b28gY2xvc2UKKyAgICAgICpzYWZlX2NsYXdfYW5nbGUgPSAtMS4wOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAvLyAgVG8gZmluZCB0aGUgc2FmZSBhbmdsZSBmb3IgdGhlIGNsYXcsIGRyYXcgYSBsaW5lIGJldHdlZW4gdGhlIGNsYXcKKyAgICAgIC8vICByb3RhdGlvbiBheGlzIGFuZCB0aGUgbG93ZXIgZnJvbnQgY29ybmVyIG9mIHRoZSBncmFiYmVyLiAgVGhlIGFuZ2xlIG9mCisgICAgICAvLyAgdGhpcyBsaW5lIGlzIHVzZWQgd2l0aCB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgZWRnZSBvZiB0aGUgY2xhdyBhbmQgdGhlCisgICAgICAvLyAgY2VudGVyIGxpbmUgb2YgdGhlIGNsYXcgdG8gZGV0ZXJtaW5lIHRoZSBhbmdsZSBvZiB0aGUgY2xhdy4KKyAgICAgIEVpZ2VuOjpWZWN0b3IyZCBjbGF3X2F4aXNfdG9fZ3JhYmJlcl9ib3R0b21fZW5kID0KKyAgICAgICAgICBncmFiYmVyX2JvdHRvbV9lbmQgLSBjbGF3X3VwZG93bl9heGlzOworICAgICAgZG91YmxlIGh5cG90ID0gY2xhd19heGlzX3RvX2dyYWJiZXJfYm90dG9tX2VuZC5ub3JtKCk7CisgICAgICBkb3VibGUgYW5nbGVEaWZmID0gOjpzdGQ6OmFzaW4oZ2VvbWV0cnlfLmNsYXdfdG9wX3RoaWNrbmVzcyAvIGh5cG90KTsKKyAgICAgICpzYWZlX2NsYXdfYW5nbGUgPSA6OnN0ZDo6YXRhbjIoY2xhd19heGlzX3RvX2dyYWJiZXJfYm90dG9tX2VuZC55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXdfYXhpc190b19ncmFiYmVyX2JvdHRvbV9lbmQueCgpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGVEaWZmOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGRvdWJsZSBnZXRfZWxldmF0b3JfbWluKCkgeyByZXR1cm4gZWxldmF0b3JfbWluXzsgfQorCisgIGRvdWJsZSBnZXRfZWxldmF0b3JfbWF4KCkgeyByZXR1cm4gZWxldmF0b3JfbWF4XzsgfQorCisgIGRvdWJsZSBnZXRfdXBwZXJfYW5nbGVfbGltaXQoKSB7IHJldHVybiB1cHBlcl9hbmdsZV9saW1pdF87IH0KKworICBkb3VibGUgZ2V0X2xvd2VyX2FuZ2xlX2xpbWl0KCkgeyByZXR1cm4gbG93ZXJfYW5nbGVfbGltaXRfOyB9CisKKyBwcml2YXRlOgorICAvLyBsZW5ndGggb2YgdGhlIGFybQorICBkb3VibGUgbGVuZ3RoX2FybV87CisgIC8vIG1heCBoZWlnaHQgdGhlIGVsZXZhdG9yIGNhbiBnby4KKyAgZG91YmxlIGVsZXZhdG9yX21heF87CisgIC8vIG1pbiBoZWlnaHQgdGhlIGVsZXZhdG9yIGNhbiBnby4KKyAgZG91YmxlIGVsZXZhdG9yX21pbl87CisgIC8vIGFybSBhbmdsZSB1cHBlciBsaW1pdAorICBkb3VibGUgdXBwZXJfYW5nbGVfbGltaXRfOworICAvLyBhcm0gYW5nbGUgbG93ZXIgbGltaXQKKyAgZG91YmxlIGxvd2VyX2FuZ2xlX2xpbWl0XzsKKyAgLy8gR2VvbWV0cnkgb2YgdGhlIGFybSArIGZyaWRnZQorICBmcmM5NzE6OmNvbnN0YW50czo6VmFsdWVzOjpDbGF3R2VvbWV0cnkgZ2VvbWV0cnlfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBhb3MKKworI2VuZGlmICAvLyBZMjAxNV9VVElMX0tJTkVNQVRJQ1NfSF8KZGlmZiAtLWdpdCBhL3kyMDE1L3V0aWwva2luZW1hdGljc190ZXN0LmNjIGIveTIwMTUvdXRpbC9raW5lbWF0aWNzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxNjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L3V0aWwva2luZW1hdGljc190ZXN0LmNjCkBAIC0wLDAgKzEsMjQyIEBACisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3F1ZXVlX3Rlc3R1dGlscy5oIgorI2luY2x1ZGUgInkyMDE1L3V0aWwva2luZW1hdGljcy5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL3RlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQuaCIKKworbmFtZXNwYWNlIGFvcyB7CituYW1lc3BhY2UgdXRpbCB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZvciB2ZXJpZmNhdGlvbiBhZ2FpbnN0IE1yLiBTY2h1aCdzIGludGVybmFsIHRlc3RzLgorLy8gUGxlYXNlIGRvIG5vdCBjb21tZW50IG9uIHRoaXMgaW4gYSBjb2RlIHJldmlldy4gV2UgY2FuIHJlbW92ZSB0aGlzIGFmdGVyIHRoZQorLy8gc2Vhc29uIHRvIHNhdGlzZnkgYW55IE9DRC4KK2Jvb2wga19pbnRlcm5hbF9kZWJ1ZyA9IGZhbHNlOworCitjbGFzcyBLaW5lbWF0aWNzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgS2luZW1hdGljc1Rlc3QoKQorICAgICAgOiBsb3dlcl9oZWlnaHRfbGltaXRfKDAuMDEpLAorICAgICAgICB1cHBlcl9oZWlnaHRfbGltaXRfKDAuNjUpLAorICAgICAgICBsb3dlcl9hbmdsZV9saW1pdF8oLU1fUEkgLyAyLjApLAorICAgICAgICB1cHBlcl9hbmdsZV9saW1pdF8oTV9QSSAvIDIuMCkge30KKworICB2b2lkIFNldFVwKCkgeworICAgICAgOjphb3M6OmNvbW1vbjo6dGVzdGluZzo6RW5hYmxlVGVzdExvZ2dpbmcoKTsKKyAgICAgIGtpbmVtYXRpY3NfID0gRWxldmF0b3JBcm1LaW5lbWF0aWNzKGFybV9sZW5ndGhfLCB1cHBlcl9oZWlnaHRfbGltaXRfLCBsb3dlcl9oZWlnaHRfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICB1cHBlcl9hbmdsZV9saW1pdF8sIGxvd2VyX2FuZ2xlX2xpbWl0Xyk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgZG91YmxlIGxvd2VyX2hlaWdodF9saW1pdF87CisgIGRvdWJsZSB1cHBlcl9oZWlnaHRfbGltaXRfOworICBkb3VibGUgbG93ZXJfYW5nbGVfbGltaXRfOworICBkb3VibGUgdXBwZXJfYW5nbGVfbGltaXRfOworICBkb3VibGUgYXJtX2xlbmd0aF8gPSAwLjczNjY7CisKKyAgRWxldmF0b3JBcm1LaW5lbWF0aWNzIGtpbmVtYXRpY3NfOworfTsKKworLy8gVXNlZCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIGFuZCB2ZXJpZmljYXRpb24gb25seSBub3QgYWNjdHVhbCB0ZXN0aW5nLgorLy8gUGxlYXNlIGRvIG5vdCBjb21tZW50IG9uIHRoaXMgaW4gYSBjb2RlIHJldmlldy4gV2UgY2FuIHJlbW92ZSB0aGlzIGFmdGVyCisvLyB0aGUgc2Vhc29uIHRvIHNhdGlzZnkgYW55IE9DRC4KK1RFU1RfRihLaW5lbWF0aWNzVGVzdCwKKyAgICAgICBQcmludFBvaW50c1NvV2VDYW5IYW5kVmVyaWZ5VGhlbVVudGlsQUJldHRlclRlc3RJc01hZGVBbmRCcmlhbklzSGFwcHkpIHsKKyAgaWYgKGtfaW50ZXJuYWxfZGVidWcpIHsKKyAgICBmb3IgKGRvdWJsZSB5ID0gLTEuMDsgeSA8PSAxLjA7IHkgKz0gMC4yKSB7CisgICAgICBmb3IgKGRvdWJsZSB4ID0gLTEuMDsgeCA8PSAxLjA7IHggKz0gMC4yKSB7CisgICAgICAgIEVsZXZhdG9yQXJtS2luZW1hdGljczo6S2luZW1hdGljUmVzdWx0IHJlczsKKyAgICAgICAgaW50IHJlZ2lvbiA9IGtpbmVtYXRpY3NfLkludmVyc2VLaW5lbWF0aWMoeCwgeSwgMC4wLCAwLjAsICZyZXMpOworICAgICAgICBwcmludGYoCisgICAgICAgICAgICAiICUxMi4zZiAlMTIuM2YgICAlOC4zZiAgJTkuM2YgICU4LjJmICUxMmQgICAlMTIuNGYgICAgICAlMTAuNGYgIgorICAgICAgICAgICAgIiUxNS40ZiAlMTYuNGZcbiIsCisgICAgICAgICAgICB4LCB5LCByZXMuZWxldmF0b3JfaGVpZ2h0LCByZXMuYXJtX2FuZ2xlLAorICAgICAgICAgICAgcmVzLmFybV9hbmdsZSAqIDE4MC4wIC8gTV9QSSwgcmVnaW9uLCByZXMuZnJpZGdlX3gsIHJlcy5mcmlkZ2VfaCwKKyAgICAgICAgICAgIHJlcy5mcmlkZ2VfeCAtIHgsIHJlcy5mcmlkZ2VfaCAtIHkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIE1ha2UgYSBzZXQgb2YgY2FsbHMgdG8gdGVzdCB0aGUgZ3JhYmJlciBhcm0gaW50ZXJzZWN0aW9uIHRlc3QgY29kZS4KKyAgICBwcmludGYoCisgICAgICAgICIjICBBcm1BbmdsZSAoZGVncmVlcykgRWxldmF0b3JIZWlnaHQgIENsYXdBbmdsZSAoZGVncmVlcykgR3JhYmJlclggIgorICAgICAgICAiR3JhYmJlckggaW50ZXJzZWN0UmV0dXJuIFNhZmVDbGF3QW5nbGUgKGRlZ3JlZXMpXG4iKTsKKyAgICBmb3IgKGRvdWJsZSBlbGV2YXRvcl9oZWlnaHQgPSBraW5lbWF0aWNzXy5nZXRfZWxldmF0b3JfbWluKCk7CisgICAgICAgICBlbGV2YXRvcl9oZWlnaHQgPD0ga2luZW1hdGljc18uZ2V0X2VsZXZhdG9yX21heCgpOworICAgICAgICAgZWxldmF0b3JfaGVpZ2h0ICs9IDAuMTApIHsKKyAgICAgIGZvciAoZG91YmxlIGFybV9hbmdsZSA9IGtpbmVtYXRpY3NfLmdldF9sb3dlcl9hbmdsZV9saW1pdCgpOworICAgICAgICAgICBhcm1fYW5nbGUgPD0ga2luZW1hdGljc18uZ2V0X3VwcGVyX2FuZ2xlX2xpbWl0KCkgKyAwLjAxOworICAgICAgICAgICBhcm1fYW5nbGUgKz0gTV9QSSAqIDAuNSAvIDkuMCkgeworICAgICAgICBkb3VibGUgY2xhd19hbmdsZSA9IE1fUEkgKiAwLjI1OworICAgICAgICBkb3VibGUgc2FmZV9jbGF3X2FuZ2xlOworICAgICAgICBkb3VibGUgaW50ZXJzZWN0UmV0dXJuVmFsdWUgPSBraW5lbWF0aWNzXy5HcmFiYmVyQXJtSW50ZXJzZWN0aW9uQ2hlY2soCisgICAgICAgICAgICBlbGV2YXRvcl9oZWlnaHQsIGFybV9hbmdsZSwgY2xhd19hbmdsZSwgJnNhZmVfY2xhd19hbmdsZSk7CisgICAgICAgIEVpZ2VuOjpWZWN0b3IyZCBncmFiYmVyX2xvY2F0aW9uID0KKyAgICAgICAgICAgIGtpbmVtYXRpY3NfLkZvcndhcmRLaW5lbWF0aWNOb0NoZWNraW5nKGVsZXZhdG9yX2hlaWdodCwgYXJtX2FuZ2xlKTsKKworICAgICAgICBwcmludGYoCisgICAgICAgICAgICAiICAlOC40ZiAlOC4yZiAgICU4LjJmICUxNC40ZiAlOS4yZiAlOS4yZiAlOS4yZiAlMTAuM2YgICUxMy40ZiAiCisgICAgICAgICAgICAiJTEyLjNmXG4iLAorICAgICAgICAgICAgYXJtX2FuZ2xlLCBhcm1fYW5nbGUgKiAxODAuMCAvIE1fUEksIGVsZXZhdG9yX2hlaWdodCwgY2xhd19hbmdsZSwKKyAgICAgICAgICAgIGNsYXdfYW5nbGUgKiAxODAuMCAvIE1fUEksIGdyYWJiZXJfbG9jYXRpb24ueCgpLAorICAgICAgICAgICAgZ3JhYmJlcl9sb2NhdGlvbi55KCksIGludGVyc2VjdFJldHVyblZhbHVlLCBzYWZlX2NsYXdfYW5nbGUsCisgICAgICAgICAgICBzYWZlX2NsYXdfYW5nbGUgKiAxODAuMCAvIE1fUEkpOworICAgICAgfQorICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgfQorfQorCitURVNUX0YoS2luZW1hdGljc1Rlc3QsIFZhbGlkSW50ZXJzZWN0Q2hlY2tQb2ludEF0Qm90dG9tT2ZFbGV2YXRvclJhbmdlKSB7CisgIGRvdWJsZSBzYWZlX2NsYXdfYW5nbGU7CisgIGRvdWJsZSBlbGV2YXRvcl9oZWlnaHQgPSAwLjAxOworICBkb3VibGUgYXJtX2FuZ2xlID0gMzAuMCAqIE1fUEkgLyAxODAuMDsKKyAgZG91YmxlIGNsYXdfYW5nbGUgPSBNX1BJICogMC4yNTsKKyAgYm9vbCBpbnRlcnNlY3RSZXR1cm5WYWx1ZSA9IGtpbmVtYXRpY3NfLkdyYWJiZXJBcm1JbnRlcnNlY3Rpb25DaGVjaygKKyAgICAgIGVsZXZhdG9yX2hlaWdodCwgYXJtX2FuZ2xlLCBjbGF3X2FuZ2xlLCAmc2FmZV9jbGF3X2FuZ2xlKTsKKyAgRVhQRUNUX1RSVUUoaW50ZXJzZWN0UmV0dXJuVmFsdWUpOworICBFWFBFQ1RfRVEoc2FmZV9jbGF3X2FuZ2xlLCBjbGF3X2FuZ2xlKTsKK30KKworVEVTVF9GKEtpbmVtYXRpY3NUZXN0LCBWYWxpZEludGVyc2VjdENoZWNrUG9pbnRBdE1pZGRsZU9mRWxldmF0b3JSYW5nZSkgeworICBkb3VibGUgc2FmZV9jbGF3X2FuZ2xlOworICBkb3VibGUgZWxldmF0b3JfaGVpZ2h0ID0gMC40OworICBkb3VibGUgYXJtX2FuZ2xlID0gMzAuMCAqIE1fUEkgLyAxODAuMDsKKyAgZG91YmxlIGNsYXdfYW5nbGUgPSBNX1BJICogMC4yNTsKKyAgYm9vbCBpbnRlcnNlY3RSZXR1cm5WYWx1ZSA9IGtpbmVtYXRpY3NfLkdyYWJiZXJBcm1JbnRlcnNlY3Rpb25DaGVjaygKKyAgICAgIGVsZXZhdG9yX2hlaWdodCwgYXJtX2FuZ2xlLCBjbGF3X2FuZ2xlLCAmc2FmZV9jbGF3X2FuZ2xlKTsKKyAgRVhQRUNUX1RSVUUoaW50ZXJzZWN0UmV0dXJuVmFsdWUpOworICBFWFBFQ1RfRVEoc2FmZV9jbGF3X2FuZ2xlLCBjbGF3X2FuZ2xlKTsKK30KKworVEVTVF9GKEtpbmVtYXRpY3NUZXN0LAorICAgICAgIGludmFsaWRJbnRlcnNlY3RDaGVja1BvaW50QXRCb3R0b21PZkVsZXZhdG9yUmFuZ2VXaXRoU2FmZUNsYXdBbmdsZSkgeworICBkb3VibGUgc2FmZV9jbGF3X2FuZ2xlOworICBkb3VibGUgZWxldmF0b3JfaGVpZ2h0ID0gMC4wMTsKKyAgZG91YmxlIGFybV9hbmdsZSA9IC0yMC4wICogTV9QSSAvIDE4MC4wOworICBkb3VibGUgY2xhd19hbmdsZSA9IE1fUEkgKiAwLjI1OworICBib29sIGludGVyc2VjdFJldHVyblZhbHVlID0ga2luZW1hdGljc18uR3JhYmJlckFybUludGVyc2VjdGlvbkNoZWNrKAorICAgICAgZWxldmF0b3JfaGVpZ2h0LCBhcm1fYW5nbGUsIGNsYXdfYW5nbGUsICZzYWZlX2NsYXdfYW5nbGUpOworICBFWFBFQ1RfRkFMU0UoaW50ZXJzZWN0UmV0dXJuVmFsdWUpOworICBFWFBFQ1RfTkVBUihzYWZlX2NsYXdfYW5nbGUsIDAuMDQzNTczMywgMC4wMDAwMDEpOworfQorCitURVNUX0YoS2luZW1hdGljc1Rlc3QsCisgICAgICAgaW52YWxpZEludGVyc2VjdENoZWNrUG9pbnRBdE1pZGRsZU9mRWxldmF0b3JSYW5nZVdpdGhTYWZlQ2xhd0FuZ2xlKSB7CisgIGRvdWJsZSBzYWZlX2NsYXdfYW5nbGU7CisgIGRvdWJsZSBlbGV2YXRvcl9oZWlnaHQgPSAwLjQxOworICBkb3VibGUgYXJtX2FuZ2xlID0gLTYwLjAgKiBNX1BJIC8gMTgwLjA7CisgIGRvdWJsZSBjbGF3X2FuZ2xlID0gTV9QSSAqIDAuMjU7CisgIGJvb2wgaW50ZXJzZWN0UmV0dXJuVmFsdWUgPSBraW5lbWF0aWNzXy5HcmFiYmVyQXJtSW50ZXJzZWN0aW9uQ2hlY2soCisgICAgICBlbGV2YXRvcl9oZWlnaHQsIGFybV9hbmdsZSwgY2xhd19hbmdsZSwgJnNhZmVfY2xhd19hbmdsZSk7CisgIEVYUEVDVF9GQUxTRShpbnRlcnNlY3RSZXR1cm5WYWx1ZSk7CisgIEVYUEVDVF9ORUFSKHNhZmVfY2xhd19hbmdsZSwgMC4xMjY1NTM0MSwgMC4wMDAwMDEpOworfQorCitURVNUX0YoS2luZW1hdGljc1Rlc3QsCisgICAgICAgaW52YWxpZEludGVyc2VjdENoZWNrUG9pbnRBdEJvdHRvbU9mRWxldmF0b3JSYW5nZU5vU2FmZUNsYXdBbmdsZSkgeworICBkb3VibGUgc2FmZV9jbGF3X2FuZ2xlOworICBkb3VibGUgZWxldmF0b3JfaGVpZ2h0ID0gMC4wMTsKKyAgZG91YmxlIGFybV9hbmdsZSA9IC0zMC4wICogTV9QSSAvIDE4MC4wOworICBkb3VibGUgY2xhd19hbmdsZSA9IE1fUEkgKiAwLjI1OworICBib29sIGludGVyc2VjdFJldHVyblZhbHVlID0ga2luZW1hdGljc18uR3JhYmJlckFybUludGVyc2VjdGlvbkNoZWNrKAorICAgICAgZWxldmF0b3JfaGVpZ2h0LCBhcm1fYW5nbGUsIGNsYXdfYW5nbGUsICZzYWZlX2NsYXdfYW5nbGUpOworICBFWFBFQ1RfRkFMU0UoaW50ZXJzZWN0UmV0dXJuVmFsdWUpOworICBFWFBFQ1RfRVEoc2FmZV9jbGF3X2FuZ2xlLCAtMS4wKTsKK30KKworVEVTVF9GKEtpbmVtYXRpY3NUZXN0LAorICAgICAgIGludmFsaWRJbnRlcnNlY3RDaGVja1BvaW50QXRNaWRkbGVPZkVsZXZhdG9yUmFuZ2VOb1NhZmVDbGF3QW5nbGUpIHsKKyAgZG91YmxlIHNhZmVfY2xhd19hbmdsZTsKKyAgZG91YmxlIGVsZXZhdG9yX2hlaWdodCA9IDAuNDE7CisgIGRvdWJsZSBhcm1fYW5nbGUgPSAtNzAuMCAqIE1fUEkgLyAxODAuMDsKKyAgZG91YmxlIGNsYXdfYW5nbGUgPSBNX1BJICogMC4yNTsKKyAgYm9vbCBpbnRlcnNlY3RSZXR1cm5WYWx1ZSA9IGtpbmVtYXRpY3NfLkdyYWJiZXJBcm1JbnRlcnNlY3Rpb25DaGVjaygKKyAgICAgIGVsZXZhdG9yX2hlaWdodCwgYXJtX2FuZ2xlLCBjbGF3X2FuZ2xlLCAmc2FmZV9jbGF3X2FuZ2xlKTsKKyAgRVhQRUNUX0ZBTFNFKGludGVyc2VjdFJldHVyblZhbHVlKTsKKyAgRVhQRUNUX0VRKHNhZmVfY2xhd19hbmdsZSwgLTEuMCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgdmVsb2NpdHkgY2FsdWxhdGlvbnMgYXJlIGNvcnJlY3QKK1RFU1RfRihLaW5lbWF0aWNzVGVzdCwgSW52ZXJzZUtpbmVtYXRpY1ZlbG9jaXR5KSB7CisgIEVsZXZhdG9yQXJtS2luZW1hdGljczo6S2luZW1hdGljUmVzdWx0IHJlc3VsdDsKKyAgLy8gbW92ZSBzdHJpYWdodCB1cCBhbmQgdmVyaWZ5IHRoYXQgb25seSBoaWVnaHQgY2hhbmdlcworICBFWFBFQ1RfRVEoMCwga2luZW1hdGljc18uSW52ZXJzZUtpbmVtYXRpYygwLjAsIDAuMiwgMC4wLCAwLjcsICZyZXN1bHQpKTsKKyAgRVhQRUNUX05FQVIoMC4wLCByZXN1bHQuYXJtX3ZlbG9jaXR5LCAwLjAwMDAxKTsKKyAgRVhQRUNUX05FQVIoMC43LCByZXN1bHQuZWxldmF0b3JfdmVsb2NpdHksIDAuMDAwMDEpOworICAvLyBjaGVjayB0aGUgbmVnYXRpdmUKKyAgRVhQRUNUX0VRKDAsIGtpbmVtYXRpY3NfLkludmVyc2VLaW5lbWF0aWMoMC4wLCAwLjIsIDAuMCwgLTAuNywgJnJlc3VsdCkpOworICBFWFBFQ1RfTkVBUigwLjAsIHJlc3VsdC5hcm1fdmVsb2NpdHksIDAuMDAwMDEpOworICBFWFBFQ1RfTkVBUigtMC43LCByZXN1bHQuZWxldmF0b3JfdmVsb2NpdHksIDAuMDAwMDEpOworICAvLyBldmVuIHdpdGggdGhlIGFybSBvdXQgd2Ugc2hvdWxkIHN0aWxsIGp1c3QgbW92ZSB1cAorICBFWFBFQ1RfRVEoMCwga2luZW1hdGljc18uSW52ZXJzZUtpbmVtYXRpYyhNX1BJIC8gNiwgMC4yLCAwLjAsIDAuNywgJnJlc3VsdCkpOworICBFWFBFQ1RfTkVBUigwLjAsIHJlc3VsdC5hcm1fdmVsb2NpdHksIDAuMDAwMDEpOworICBFWFBFQ1RfTkVBUigwLjcsIHJlc3VsdC5lbGV2YXRvcl92ZWxvY2l0eSwgMC4wMDAwMSk7CisgIC8vIGV2ZW4gd2l0aCB0aGUgYXJtIGJhY2sgd2Ugc2hvdWxkIHN0aWxsIGp1c3QgbW92ZSB1cAorICBFWFBFQ1RfRVEoMCwga2luZW1hdGljc18uSW52ZXJzZUtpbmVtYXRpYygtTV9QSSAvIDYsIDAuMiwgMC4wLCAwLjcsICZyZXN1bHQpKTsKKyAgRVhQRUNUX05FQVIoMC4wLCByZXN1bHQuYXJtX3ZlbG9jaXR5LCAwLjAwMDAxKTsKKyAgRVhQRUNUX05FQVIoMC43LCByZXN1bHQuZWxldmF0b3JfdmVsb2NpdHksIDAuMDAwMDEpOworCisgIC8vIHNob3VsZCBtb3ZlIG9ubHkgYW5nbGUgZm9yd2FyZAorICBFWFBFQ1RfRVEoMCwga2luZW1hdGljc18uSW52ZXJzZUtpbmVtYXRpYygwLjAsIDAuMiwgMS4wLCAwLjAsICZyZXN1bHQpKTsKKyAgRVhQRUNUX05FQVIoLTEuMzU3NTksIHJlc3VsdC5hcm1fdmVsb2NpdHksIDAuMDAwMDEpOworICBFWFBFQ1RfTkVBUigwLjAsIHJlc3VsdC5lbGV2YXRvcl92ZWxvY2l0eSwgMC4wMDAwMSk7CisgIC8vIGNoZWNrIHRoZSBuZWdhdGl2ZQorICBFWFBFQ1RfRVEoMCwga2luZW1hdGljc18uSW52ZXJzZUtpbmVtYXRpYygwLjAsIDAuMiwgLTEuMCwgMC4wLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9ORUFSKDEuMzU3NTksIHJlc3VsdC5hcm1fdmVsb2NpdHksIDAuMDAwMDEpOworICBFWFBFQ1RfTkVBUigwLjAsIHJlc3VsdC5lbGV2YXRvcl92ZWxvY2l0eSwgMC4wMDAwMSk7CisgIC8vIHdpdGggdGhlIGFybSBvdXQgYSBjaGFuZ2UgaW4geCBzaG91bGQgbWFrZSBhcm0gYW5nbGUgZ3JlYXRlciBhbmQKKyAgLy8gYnJpbmcgdGhlIGV2ZXZhdG9yIGRvd24uCisgIEVYUEVDVF9FUSgwLCBraW5lbWF0aWNzXy5JbnZlcnNlS2luZW1hdGljKDAuMiwgMC4yLCAxLjAsIDAuMCwgJnJlc3VsdCkpOworICBFWFBFQ1RfR1QoMC4wLCByZXN1bHQuYXJtX3ZlbG9jaXR5KTsKKyAgRVhQRUNUX0xUKDAuMCwgcmVzdWx0LmVsZXZhdG9yX3ZlbG9jaXR5KTsKKyAgLy8gd2l0aCB0aGUgYXJtIG91dCBhIGNoYW5nZSBpbiB4IHNob3VsZCBtYWtlIGFybSBhbmdsZSBncmVhdGVyIGFuZAorICAvLyBicmluZyB0aGUgZXZldmF0b3IgZG93bi4KKyAgRVhQRUNUX0VRKDAsIGtpbmVtYXRpY3NfLkludmVyc2VLaW5lbWF0aWMoLTAuMiwgMC4yLCAxLjAsIDAuMCwgJnJlc3VsdCkpOworICBFWFBFQ1RfR1QoMC4wLCByZXN1bHQuYXJtX3ZlbG9jaXR5KTsKKyAgRVhQRUNUX0dUKDAuMCwgcmVzdWx0LmVsZXZhdG9yX3ZlbG9jaXR5KTsKK30KKworLy8gVGVzdHMgdGhhdCB2ZWxvY2l0eSBjYWx1bGF0aW9ucyBhcmUgY29ycmVjdAorVEVTVF9GKEtpbmVtYXRpY3NUZXN0LCBGb3J3YXJkS2luZW1hdGljVmVsb2NpdHkpIHsKKyAgRWxldmF0b3JBcm1LaW5lbWF0aWNzOjpLaW5lbWF0aWNSZXN1bHQgcmVzdWx0OworCisgIC8vIG1vdmluZyB0aGUgYXJtIGZvcndhcmQgYXQgemVybyBzaG91bGQgcmVzdWx0IGluIHggdmVsb2NpdHkKKyAgRVhQRUNUX0VRKDAsIGtpbmVtYXRpY3NfLkZvcndhcmRLaW5lbWF0aWMoMC4yLCAwLjAsIDAuMCwgMS4zNTc1OSwgJnJlc3VsdCkpOworICBFWFBFQ1RfTkVBUigtMS4wLCByZXN1bHQuZnJpZGdlX3hfdmVsb2NpdHksIDAuMDAwMDEpOworICBFWFBFQ1RfTkVBUigwLjAsIHJlc3VsdC5mcmlkZ2VfaF92ZWxvY2l0eSwgMC4wMDAwMSk7CisgIC8vIGNoZWNrIHRoZSBuZWdhdGl2ZQorICBFWFBFQ1RfRVEoMCwga2luZW1hdGljc18uRm9yd2FyZEtpbmVtYXRpYygwLjIsIDAuMCwgMC4wLCAtMS4zNTc1OSwgJnJlc3VsdCkpOworICBFWFBFQ1RfTkVBUigxLjAsIHJlc3VsdC5mcmlkZ2VfeF92ZWxvY2l0eSwgMC4wMDAwMSk7CisgIEVYUEVDVF9ORUFSKDAuMCwgcmVzdWx0LmZyaWRnZV9oX3ZlbG9jaXR5LCAwLjAwMDAxKTsKKyAgLy8gbW92aW5nIHRoZSBhcm0gdXAgYXQgemVybyBzaG91bGQgcmVzdWx0IGluIGggdmVsb2NpdHkKKyAgRVhQRUNUX0VRKDAsIGtpbmVtYXRpY3NfLkZvcndhcmRLaW5lbWF0aWMoMC4yLCAwLjAsIDEuMCwgMC4wLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9ORUFSKDAuMCwgcmVzdWx0LmZyaWRnZV94X3ZlbG9jaXR5LCAwLjAwMDAxKTsKKyAgRVhQRUNUX05FQVIoMS4wLCByZXN1bHQuZnJpZGdlX2hfdmVsb2NpdHksIDAuMDAwMDEpOworICAvLyBjaGVjayB0aGUgbmVnYXRpdmUKKyAgRVhQRUNUX0VRKDAsIGtpbmVtYXRpY3NfLkZvcndhcmRLaW5lbWF0aWMoMC4yLCAwLjAsIC0xLjAsIDAuMCwgJnJlc3VsdCkpOworICBFWFBFQ1RfTkVBUigwLjAsIHJlc3VsdC5mcmlkZ2VfeF92ZWxvY2l0eSwgMC4wMDAwMSk7CisgIEVYUEVDVF9ORUFSKC0xLjAsIHJlc3VsdC5mcmlkZ2VfaF92ZWxvY2l0eSwgMC4wMDAwMSk7CisgIC8vIGFybSBpcyBmb3J3YXJkIGEgbmVnYXRpdmUgYW5nbGUgc2hvdWxkIG1ha2UgeCBoZWFkIGZvcndhcmQgYW5kIHkgaGVhZCBkb3duLgorICBFWFBFQ1RfRVEoMCwga2luZW1hdGljc18uRm9yd2FyZEtpbmVtYXRpYygwLjUsIC0wLjIsIDAuMCwgLTEuMCwgJnJlc3VsdCkpOworICBFWFBFQ1RfR1QocmVzdWx0LmZyaWRnZV94X3ZlbG9jaXR5LCAwLjApOworICBFWFBFQ1RfTFQocmVzdWx0LmZyaWRnZV9oX3ZlbG9jaXR5LCAwLjApOworICAvLyBhcm0gaXMgZm9yd2FyZCBhIHBvc2l0aXZlIGFuZ2xlIHNob3VsZCBtYWtlIHggaGVhZCBiYWNrd2FyZHdhcmQgYW5kIHkgaGVhZCB1cC4KKyAgRVhQRUNUX0VRKDAsIGtpbmVtYXRpY3NfLkZvcndhcmRLaW5lbWF0aWMoMC41LCAtMC4yLCAwLjAsIDEuMCwgJnJlc3VsdCkpOworICBFWFBFQ1RfTFQocmVzdWx0LmZyaWRnZV94X3ZlbG9jaXR5LCAwLjApOworICBFWFBFQ1RfR1QocmVzdWx0LmZyaWRnZV9oX3ZlbG9jaXR5LCAwLjApOworICAvLyBhcm0gaXMgYmFja3dhcmQgYSBuZWdhdGl2ZSBhbmdsZSBzaG91bGQgbWFrZSB4IGhlYWQgZm9yd2FyZCBhbmQgeSBoZWFkIGRvd24uCisgIEVYUEVDVF9FUSgwLCBraW5lbWF0aWNzXy5Gb3J3YXJkS2luZW1hdGljKDAuNSwgMC4yLCAwLjAsIC0xLjAsICZyZXN1bHQpKTsKKyAgRVhQRUNUX0dUKHJlc3VsdC5mcmlkZ2VfeF92ZWxvY2l0eSwgMC4wKTsKKyAgRVhQRUNUX0dUKHJlc3VsdC5mcmlkZ2VfaF92ZWxvY2l0eSwgMC4wKTsKKyAgLy8gYXJtIGlzIGJhY2t3YXJkIGEgbmVnYXRpdmUgYW5nbGUgc2hvdWxkIG1ha2UgeCBoZWFkIGZvcndhcmQgYW5kIHkgaGVhZCBkb3duLgorICBFWFBFQ1RfRVEoMCwga2luZW1hdGljc18uRm9yd2FyZEtpbmVtYXRpYygwLjUsIDAuMiwgMC4wLCAxLjAsICZyZXN1bHQpKTsKKyAgRVhQRUNUX0xUKHJlc3VsdC5mcmlkZ2VfeF92ZWxvY2l0eSwgMC4wKTsKKyAgRVhQRUNUX0xUKHJlc3VsdC5mcmlkZ2VfaF92ZWxvY2l0eSwgMC4wKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgYW9zCmRpZmYgLS1naXQgYS95MjAxNS91dGlsL3V0aWwuZ3lwIGIveTIwMTUvdXRpbC91dGlsLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA3OWMxCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvdXRpbC91dGlsLmd5cApAQCAtMCwwICsxLDMzIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdraW5lbWF0aWNzJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAjJ2tpbmVtYXRpY3MuaCcsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTplaWdlbicsCisgICAgICAgICc8KERFUFRIKS95MjAxNS95MjAxNS5neXA6Y29uc3RhbnRzJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoRVhURVJOQUxTKTplaWdlbicsCisgICAgICAgICc8KERFUFRIKS95MjAxNS95MjAxNS5neXA6Y29uc3RhbnRzJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAna2luZW1hdGljc190ZXN0JywKKyAgICAgICd0eXBlJzogJ2V4ZWN1dGFibGUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdraW5lbWF0aWNzX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEVYVEVSTkFMUyk6Z3Rlc3QnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnF1ZXVlX3Rlc3R1dGlscycsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMuZ3lwOnRlYW1fbnVtYmVyX3Rlc3RfZW52aXJvbm1lbnQnLAorICAgICAgICAna2luZW1hdGljcycKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3kyMDE1L3dwaWxpYi93cGlsaWIuZ3lwIGIveTIwMTUvd3BpbGliL3dwaWxpYi5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxYmUzOQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L3dwaWxpYi93cGlsaWIuZ3lwCkBAIC0wLDAgKzEsMzggQEAKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3dwaWxpYl9pbnRlcmZhY2UnLAorICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3dwaWxpYl9pbnRlcmZhY2UuY2MnCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoQU9TKS9saW51eF9jb2RlL2xpbnV4X2NvZGUuZ3lwOmluaXQnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnN0bF9tdXRleCcsCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoRVhURVJOQUxTKTpXUElMaWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUveTIwMTUuZ3lwOmNvbnN0YW50cycsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5neXA6ZHJpdmV0cmFpbl9xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UuZ3lwOmZyaWRnZV9xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9jb250cm9sX2xvb3BzL2NsYXcvY2xhdy5neXA6Y2xhd19xdWV1ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbnRyb2xzL2NvbnRyb2xzLmd5cDpjb250cm9sX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOmxvZ19pbnRlcnZhbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2NvbW1vbi5neXA6dGltZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZy5neXA6cXVldWVfbG9nZ2luZycsCisgICAgICAgICc8KEFPUykvY29tbW9uL21lc3NhZ2VzL21lc3NhZ2VzLmd5cDpyb2JvdF9zdGF0ZScsCisgICAgICAgICc8KEFPUykvY29tbW9uL3V0aWwvdXRpbC5neXA6cGhhc2VkX2xvb3AnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9tZXNzYWdlcy9tZXNzYWdlcy5neXA6cm9ib3Rfc3RhdGUnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmhhbGxfZWZmZWN0JywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDpqb3lzdGlja19zZW5kZXInLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmxvb3Bfb3V0cHV0X2hhbmRsZXInLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmJ1ZmZlcmVkX3BjbScsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6Z3lyb19zZW5kZXInLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmRtYV9lZGdlX2NvdW50aW5nJywKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS93cGlsaWIvd3BpbGliLmd5cDppbnRlcnJ1cHRfZWRnZV9jb3VudGluZycsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvd3BpbGliL3dwaWxpYi5neXA6ZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlcicsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpxdWV1ZXMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL3dwaWxpYi93cGlsaWIuZ3lwOmxvZ2dpbmdfcXVldWUnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEveTIwMTUvd3BpbGliL3dwaWxpYl9pbnRlcmZhY2UuY2MgYi95MjAxNS93cGlsaWIvd3BpbGliX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjgzNmExCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTUvd3BpbGliL3dwaWxpYl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw3MTYgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImFvcy9jb21tb24vbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi9sb2dnaW5nL3F1ZXVlX2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3RpbWUuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3V0aWwvbG9nX2ludGVydmFsLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3BoYXNlZF9sb29wLmgiCisjaW5jbHVkZSAiYW9zL2NvbW1vbi91dGlsL3dyYXBwaW5nX2NvdW50ZXIuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL3N0bF9tdXRleC5oIgorI2luY2x1ZGUgImFvcy9saW51eF9jb2RlL2luaXQuaCIKKyNpbmNsdWRlICJhb3MvY29tbW9uL21lc3NhZ2VzL3JvYm90X3N0YXRlLnEuaCIKKworI2luY2x1ZGUgInkyMDE1L2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMucS5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEuaCIKKyNpbmNsdWRlICJ5MjAxNS9jb250cm9sX2xvb3BzL2ZyaWRnZS9mcmlkZ2UucS5oIgorI2luY2x1ZGUgInkyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3LnEuaCIKKworI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvaGFsbF9lZmZlY3QuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2pveXN0aWNrX3NlbmRlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvbG9vcF9vdXRwdXRfaGFuZGxlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYnVmZmVyZWRfc29sZW5vaWQuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3BjbS5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvZ3lyb19zZW5kZXIuaCIKKyNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmgiCisjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9pbnRlcnJ1cHRfZWRnZV9jb3VudGluZy5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvZW5jb2Rlcl9hbmRfcG90ZW50aW9tZXRlci5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvbG9nZ2luZy5xLmgiCisKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisjaW5jbHVkZSAiVGFsb24uaCIKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJDb21wcmVzc29yLmgiCisjaW5jbHVkZSAiUmVsYXkuaCIKKyNpbmNsdWRlICJSb2JvdEJhc2UuaCIKKyNpbmNsdWRlICJkbWEuaCIKKyNpbmNsdWRlICJDb250cm9sbGVyUG93ZXIuaCIKKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKK3VzaW5nIDo6YW9zOjp1dGlsOjpTaW1wbGVMb2dJbnRlcnZhbDsKK3VzaW5nIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluX3F1ZXVlOwordXNpbmcgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZTsKK3VzaW5nIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlOworCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB3cGlsaWIgeworCitkb3VibGUgZHJpdmV0cmFpbl90cmFuc2xhdGUoaW50MzJfdCBpbikgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihpbikgLworICAgICAgICAgKDI1Ni4wIC8qY3ByKi8gKiA0LjAgLyo0eCovKSAqCisgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmRyaXZldHJhaW5fZW5jb2Rlcl9yYXRpbyAqCisgICAgICAgICAoNCAvKndoZWVsIGRpYW1ldGVyKi8gKiAyLjU0IC8gMTAwLjAgKiBNX1BJKTsKK30KKworZG91YmxlIGFybV90cmFuc2xhdGUoaW50MzJfdCBpbikgeworICByZXR1cm4gLXN0YXRpY19jYXN0PGRvdWJsZT4oaW4pIC8KKyAgICAgICAgICAoNTEyLjAgLypjcHIqLyAqIDQuMCAvKjR4Ki8pICoKKyAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmFybV9lbmNvZGVyX3JhdGlvICoKKyAgICAgICAgICAoMiAqIE1fUEkgLypyYWRpYW5zKi8pOworfQorCitkb3VibGUgYXJtX3BvdGVudGlvbWV0ZXJfdHJhbnNsYXRlKGRvdWJsZSB2b2x0YWdlKSB7CisgIHJldHVybiB2b2x0YWdlICoKKyAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmFybV9wb3RfcmF0aW8gKgorICAgICAgICAgICg1LjAgLyp0dXJucyovIC8gNS4wIC8qdm9sdHMqLykgKgorICAgICAgICAgICgyICogTV9QSSAvKnJhZGlhbnMqLyk7Cit9CisKK2RvdWJsZSBlbGV2YXRvcl90cmFuc2xhdGUoaW50MzJfdCBpbikgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihpbikgLworICAgICAgICAgICg1MTIuMCAvKmNwciovICogNC4wIC8qNHgqLykgKgorICAgICAgICAgIGNvbnN0YW50czo6R2V0VmFsdWVzKCkuZWxldl9lbmNvZGVyX3JhdGlvICoKKyAgICAgICAgICAoMiAqIE1fUEkgLypyYWRpYW5zKi8pICoKKyAgICAgICAgICBjb25zdGFudHM6OkdldFZhbHVlcygpLmVsZXZfZGlzdGFuY2VfcGVyX3JhZGlhbjsKK30KKworZG91YmxlIGVsZXZhdG9yX3BvdGVudGlvbWV0ZXJfdHJhbnNsYXRlKGRvdWJsZSB2b2x0YWdlKSB7CisgIHJldHVybiAtdm9sdGFnZSAqCisgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5lbGV2X3BvdF9yYXRpbyAqCisgICAgICAgICAgKDIgKiBNX1BJIC8qcmFkaWFucyovKSAqCisgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5lbGV2X2Rpc3RhbmNlX3Blcl9yYWRpYW4gKgorICAgICAgICAgICg1LjAgLyp0dXJucyovIC8gNS4wIC8qdm9sdHMqLyk7Cit9CisKK2RvdWJsZSBjbGF3X3RyYW5zbGF0ZShpbnQzMl90IGluKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGluKSAvCisgICAgICAgICAgKDUxMi4wIC8qY3ByKi8gKiA0LjAgLyo0eCovKSAqCisgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbGF3X2VuY29kZXJfcmF0aW8gKgorICAgICAgICAgICgyICogTV9QSSAvKnJhZGlhbnMqLyk7Cit9CisKK2RvdWJsZSBjbGF3X3BvdGVudGlvbWV0ZXJfdHJhbnNsYXRlKGRvdWJsZSB2b2x0YWdlKSB7CisgIHJldHVybiAtdm9sdGFnZSAqCisgICAgICAgICAgY29uc3RhbnRzOjpHZXRWYWx1ZXMoKS5jbGF3X3BvdF9yYXRpbyAqCisgICAgICAgICAgKDUuMCAvKnR1cm5zKi8gLyA1LjAgLyp2b2x0cyovKSAqCisgICAgICAgICAgKDIgKiBNX1BJIC8qcmFkaWFucyovKTsKK30KKworc3RhdGljIGNvbnN0IGRvdWJsZSBrTWF4aW11bUVuY29kZXJQdWxzZXNQZXJTZWNvbmQgPQorICAgIDE5NTAwLjAgLyogZnJlZSBzcGVlZCBSUE0gKi8gKiAxMi4wIC8gNTYuMCAvKiBiZWx0IHJlZHVjdGlvbiAqLyAvCisgICAgNjAuMCAvKiBzZWNvbmRzIC8gbWludXRlICovICogMjU2LjAgLyogQ1BSICovICoKKyAgICA0LjAgLyogaW5kZXggcHVsc2UgPSAxLzQgY3ljbGUgKi87CisKK2NsYXNzIFNlbnNvclJlYWRlciB7CisgcHVibGljOgorICBTZW5zb3JSZWFkZXIoKSB7CisgICAgLy8gU2V0IGl0IHRvIGZpbHRlciBvdXQgYW55dGhpbmcgc2hvcnRlciB0aGFuIDEvNCBvZiB0aGUgbWluaW11bSBwdWxzZSB3aWR0aAorICAgIC8vIHdlIHNob3VsZCBldmVyIHNlZS4KKyAgICBmaWx0ZXJfLlNldFBlcmlvZE5hbm9TZWNvbmRzKAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KDEgLyA0LjAgLyBrTWF4aW11bUVuY29kZXJQdWxzZXNQZXJTZWNvbmQgKiAxZTkgKyAwLjUpKTsKKyAgfQorCisgIHZvaWQgc2V0X2FybV9sZWZ0X2VuY29kZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2RlcikgeworICAgIGZpbHRlcl8uQWRkKGVuY29kZXIuZ2V0KCkpOworICAgIGFybV9sZWZ0X2VuY29kZXJfLnNldF9lbmNvZGVyKDo6c3RkOjptb3ZlKGVuY29kZXIpKTsKKyAgfQorCisgIHZvaWQgc2V0X2FybV9sZWZ0X2luZGV4KDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IGluZGV4KSB7CisgICAgZmlsdGVyXy5BZGQoaW5kZXguZ2V0KCkpOworICAgIGFybV9sZWZ0X2VuY29kZXJfLnNldF9pbmRleCg6OnN0ZDo6bW92ZShpbmRleCkpOworICB9CisKKyAgdm9pZCBzZXRfYXJtX2xlZnRfcG90ZW50aW9tZXRlcigKKyAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPEFuYWxvZ0lucHV0PiBwb3RlbnRpb21ldGVyKSB7CisgICAgYXJtX2xlZnRfZW5jb2Rlcl8uc2V0X3BvdGVudGlvbWV0ZXIoOjpzdGQ6Om1vdmUocG90ZW50aW9tZXRlcikpOworICB9CisKKyAgdm9pZCBzZXRfYXJtX3JpZ2h0X2VuY29kZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2RlcikgeworICAgIGZpbHRlcl8uQWRkKGVuY29kZXIuZ2V0KCkpOworICAgIGFybV9yaWdodF9lbmNvZGVyXy5zZXRfZW5jb2Rlcig6OnN0ZDo6bW92ZShlbmNvZGVyKSk7CisgIH0KKworICB2b2lkIHNldF9hcm1fcmlnaHRfaW5kZXgoOjpzdGQ6OnVuaXF1ZV9wdHI8RGlnaXRhbFNvdXJjZT4gaW5kZXgpIHsKKyAgICBmaWx0ZXJfLkFkZChpbmRleC5nZXQoKSk7CisgICAgYXJtX3JpZ2h0X2VuY29kZXJfLnNldF9pbmRleCg6OnN0ZDo6bW92ZShpbmRleCkpOworICB9CisKKyAgdm9pZCBzZXRfYXJtX3JpZ2h0X3BvdGVudGlvbWV0ZXIoCisgICAgICA6OnN0ZDo6dW5pcXVlX3B0cjxBbmFsb2dJbnB1dD4gcG90ZW50aW9tZXRlcikgeworICAgIGFybV9yaWdodF9lbmNvZGVyXy5zZXRfcG90ZW50aW9tZXRlcig6OnN0ZDo6bW92ZShwb3RlbnRpb21ldGVyKSk7CisgIH0KKworICB2b2lkIHNldF9lbGV2YXRvcl9sZWZ0X2VuY29kZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2RlcikgeworICAgIGZpbHRlcl8uQWRkKGVuY29kZXIuZ2V0KCkpOworICAgIGVsZXZhdG9yX2xlZnRfZW5jb2Rlcl8uc2V0X2VuY29kZXIoOjpzdGQ6Om1vdmUoZW5jb2RlcikpOworICB9CisKKyAgdm9pZCBzZXRfZWxldmF0b3JfbGVmdF9pbmRleCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBpbmRleCkgeworICAgIGZpbHRlcl8uQWRkKGluZGV4LmdldCgpKTsKKyAgICBlbGV2YXRvcl9sZWZ0X2VuY29kZXJfLnNldF9pbmRleCg6OnN0ZDo6bW92ZShpbmRleCkpOworICB9CisKKyAgdm9pZCBzZXRfZWxldmF0b3JfbGVmdF9wb3RlbnRpb21ldGVyKAorICAgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8QW5hbG9nSW5wdXQ+IHBvdGVudGlvbWV0ZXIpIHsKKyAgICBlbGV2YXRvcl9sZWZ0X2VuY29kZXJfLnNldF9wb3RlbnRpb21ldGVyKDo6c3RkOjptb3ZlKHBvdGVudGlvbWV0ZXIpKTsKKyAgfQorCisgIHZvaWQgc2V0X2VsZXZhdG9yX3JpZ2h0X2VuY29kZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2RlcikgeworICAgIGZpbHRlcl8uQWRkKGVuY29kZXIuZ2V0KCkpOworICAgIGVsZXZhdG9yX3JpZ2h0X2VuY29kZXJfLnNldF9lbmNvZGVyKDo6c3RkOjptb3ZlKGVuY29kZXIpKTsKKyAgfQorCisgIHZvaWQgc2V0X2VsZXZhdG9yX3JpZ2h0X2luZGV4KDo6c3RkOjp1bmlxdWVfcHRyPERpZ2l0YWxTb3VyY2U+IGluZGV4KSB7CisgICAgZmlsdGVyXy5BZGQoaW5kZXguZ2V0KCkpOworICAgIGVsZXZhdG9yX3JpZ2h0X2VuY29kZXJfLnNldF9pbmRleCg6OnN0ZDo6bW92ZShpbmRleCkpOworICB9CisKKyAgdm9pZCBzZXRfZWxldmF0b3JfcmlnaHRfcG90ZW50aW9tZXRlcigKKyAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPEFuYWxvZ0lucHV0PiBwb3RlbnRpb21ldGVyKSB7CisgICAgZWxldmF0b3JfcmlnaHRfZW5jb2Rlcl8uc2V0X3BvdGVudGlvbWV0ZXIoOjpzdGQ6Om1vdmUocG90ZW50aW9tZXRlcikpOworICB9CisKKyAgdm9pZCBzZXRfd3Jpc3RfZW5jb2Rlcig6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBlbmNvZGVyKSB7CisgICAgZmlsdGVyXy5BZGQoZW5jb2Rlci5nZXQoKSk7CisgICAgd3Jpc3RfZW5jb2Rlcl8uc2V0X2VuY29kZXIoOjpzdGQ6Om1vdmUoZW5jb2RlcikpOworICB9CisKKyAgdm9pZCBzZXRfd3Jpc3RfaW5kZXgoOjpzdGQ6OnVuaXF1ZV9wdHI8RGlnaXRhbFNvdXJjZT4gaW5kZXgpIHsKKyAgICBmaWx0ZXJfLkFkZChpbmRleC5nZXQoKSk7CisgICAgd3Jpc3RfZW5jb2Rlcl8uc2V0X2luZGV4KDo6c3RkOjptb3ZlKGluZGV4KSk7CisgIH0KKworICB2b2lkIHNldF93cmlzdF9wb3RlbnRpb21ldGVyKDo6c3RkOjp1bmlxdWVfcHRyPEFuYWxvZ0lucHV0PiBwb3RlbnRpb21ldGVyKSB7CisgICAgd3Jpc3RfZW5jb2Rlcl8uc2V0X3BvdGVudGlvbWV0ZXIoOjpzdGQ6Om1vdmUocG90ZW50aW9tZXRlcikpOworICB9CisKKyAgdm9pZCBzZXRfbGVmdF9lbmNvZGVyKDo6c3RkOjp1bmlxdWVfcHRyPEVuY29kZXI+IGxlZnRfZW5jb2RlcikgeworICAgIGxlZnRfZW5jb2Rlcl8gPSA6OnN0ZDo6bW92ZShsZWZ0X2VuY29kZXIpOworICB9CisKKyAgdm9pZCBzZXRfcmlnaHRfZW5jb2Rlcig6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiByaWdodF9lbmNvZGVyKSB7CisgICAgcmlnaHRfZW5jb2Rlcl8gPSA6OnN0ZDo6bW92ZShyaWdodF9lbmNvZGVyKTsKKyAgfQorCisgIC8vIEFsbCBvZiB0aGUgRE1BLXJlbGF0ZWQgc2V0XyogY2FsbHMgbXVzdCBiZSBtYWRlIGJlZm9yZSB0aGlzLCBhbmQgaXQgZG9lc24ndAorICAvLyBodXJ0IHRvIGRvIGFsbCBvZiB0aGVtLgorICB2b2lkIHNldF9kbWEoOjpzdGQ6OnVuaXF1ZV9wdHI8RE1BPiBkbWEpIHsKKyAgICBkbWFfc3luY2hyb25pemVyXy5yZXNldChuZXcgRE1BU3luY2hyb25pemVyKDo6c3RkOjptb3ZlKGRtYSkpKTsKKyAgICBkbWFfc3luY2hyb25pemVyXy0+QWRkKCZhcm1fbGVmdF9lbmNvZGVyXyk7CisgICAgZG1hX3N5bmNocm9uaXplcl8tPkFkZCgmZWxldmF0b3JfbGVmdF9lbmNvZGVyXyk7CisgICAgZG1hX3N5bmNocm9uaXplcl8tPkFkZCgmYXJtX3JpZ2h0X2VuY29kZXJfKTsKKyAgICBkbWFfc3luY2hyb25pemVyXy0+QWRkKCZlbGV2YXRvcl9yaWdodF9lbmNvZGVyXyk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkoKSB7CisgICAgTE9HKElORk8sICJJbiBzZW5zb3IgcmVhZGVyIHRocmVhZFxuIik7CisgICAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWROYW1lKCJTZW5zb3JSZWFkZXIiKTsKKworICAgIG15X3BpZF8gPSBnZXRwaWQoKTsKKyAgICBkc18gPSBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpOworCisgICAgd3Jpc3RfZW5jb2Rlcl8uU3RhcnQoKTsKKyAgICBkbWFfc3luY2hyb25pemVyXy0+U3RhcnQoKTsKKyAgICBMT0coSU5GTywgIlRoaW5ncyBhcmUgbm93IHN0YXJ0ZWRcbiIpOworCisgICAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWRSZWFsdGltZVByaW9yaXR5KGtQcmlvcml0eSk7CisgICAgd2hpbGUgKHJ1bl8pIHsKKyAgICAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wWE1TKDUsIDQwMDApOworICAgICAgUnVuSXRlcmF0aW9uKCk7CisgICAgfQorCisgICAgd3Jpc3RfZW5jb2Rlcl8uU3RvcCgpOworICB9CisKKyAgdm9pZCBSdW5JdGVyYXRpb24oKSB7CisgICAgeworICAgICAgYXV0byBuZXdfc3RhdGUgPSA6OmFvczo6cm9ib3Rfc3RhdGUuTWFrZU1lc3NhZ2UoKTsKKworICAgICAgbmV3X3N0YXRlLT5yZWFkZXJfcGlkID0gbXlfcGlkXzsKKyAgICAgIG5ld19zdGF0ZS0+b3V0cHV0c19lbmFibGVkID0gZHNfLT5Jc1N5c0FjdGl2ZSgpOworICAgICAgbmV3X3N0YXRlLT5icm93bmVkX291dCA9IGRzXy0+SXNTeXNCcm93bmVkT3V0KCk7CisKKyAgICAgIG5ld19zdGF0ZS0+aXNfM3YzX2FjdGl2ZSA9IENvbnRyb2xsZXJQb3dlcjo6R2V0RW5hYmxlZDNWMygpOworICAgICAgbmV3X3N0YXRlLT5pc181dl9hY3RpdmUgPSBDb250cm9sbGVyUG93ZXI6OkdldEVuYWJsZWQ1VigpOworICAgICAgbmV3X3N0YXRlLT52b2x0YWdlXzN2MyA9IENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTNWMygpOworICAgICAgbmV3X3N0YXRlLT52b2x0YWdlXzV2ID0gQ29udHJvbGxlclBvd2VyOjpHZXRWb2x0YWdlNVYoKTsKKworICAgICAgbmV3X3N0YXRlLT52b2x0YWdlX3JvYm9yaW9faW4gPSBDb250cm9sbGVyUG93ZXI6OkdldElucHV0Vm9sdGFnZSgpOworICAgICAgbmV3X3N0YXRlLT52b2x0YWdlX2JhdHRlcnkgPSBkc18tPkdldEJhdHRlcnlWb2x0YWdlKCk7CisKKyAgICAgIExPR19TVFJVQ1QoREVCVUcsICJyb2JvdF9zdGF0ZSIsICpuZXdfc3RhdGUpOworCisgICAgICBuZXdfc3RhdGUuU2VuZCgpOworICAgIH0KKworICAgIHsKKyAgICAgIGF1dG8gZHJpdmV0cmFpbl9tZXNzYWdlID0gZHJpdmV0cmFpbl9xdWV1ZS5wb3NpdGlvbi5NYWtlTWVzc2FnZSgpOworICAgICAgZHJpdmV0cmFpbl9tZXNzYWdlLT5yaWdodF9lbmNvZGVyID0KKyAgICAgICAgICAtZHJpdmV0cmFpbl90cmFuc2xhdGUocmlnaHRfZW5jb2Rlcl8tPkdldFJhdygpKTsKKyAgICAgIGRyaXZldHJhaW5fbWVzc2FnZS0+bGVmdF9lbmNvZGVyID0KKyAgICAgICAgICBkcml2ZXRyYWluX3RyYW5zbGF0ZShsZWZ0X2VuY29kZXJfLT5HZXRSYXcoKSk7CisKKyAgICAgIGRyaXZldHJhaW5fbWVzc2FnZS5TZW5kKCk7CisgICAgfQorCisgICAgZG1hX3N5bmNocm9uaXplcl8tPlJ1bkl0ZXJhdGlvbigpOworCisgICAgY29uc3QgYXV0byAmdmFsdWVzID0gY29uc3RhbnRzOjpHZXRWYWx1ZXMoKTsKKworICAgIHsKKyAgICAgIGF1dG8gZnJpZGdlX21lc3NhZ2UgPSBmcmlkZ2VfcXVldWUucG9zaXRpb24uTWFrZU1lc3NhZ2UoKTsKKyAgICAgIENvcHlQb3RBbmRJbmRleFBvc2l0aW9uKGFybV9sZWZ0X2VuY29kZXJfLCAmZnJpZGdlX21lc3NhZ2UtPmFybS5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX3RyYW5zbGF0ZSwgYXJtX3BvdGVudGlvbWV0ZXJfdHJhbnNsYXRlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5mcmlkZ2UubGVmdF9hcm1fcG90ZW50aW9tZXRlcl9vZmZzZXQpOworICAgICAgQ29weVBvdEFuZEluZGV4UG9zaXRpb24oCisgICAgICAgICAgYXJtX3JpZ2h0X2VuY29kZXJfLCAmZnJpZGdlX21lc3NhZ2UtPmFybS5yaWdodCwgYXJtX3RyYW5zbGF0ZSwKKyAgICAgICAgICBhcm1fcG90ZW50aW9tZXRlcl90cmFuc2xhdGUsIHRydWUsCisgICAgICAgICAgdmFsdWVzLmZyaWRnZS5yaWdodF9hcm1fcG90ZW50aW9tZXRlcl9vZmZzZXQpOworICAgICAgQ29weVBvdEFuZEluZGV4UG9zaXRpb24oCisgICAgICAgICAgZWxldmF0b3JfbGVmdF9lbmNvZGVyXywgJmZyaWRnZV9tZXNzYWdlLT5lbGV2YXRvci5sZWZ0LAorICAgICAgICAgIGVsZXZhdG9yX3RyYW5zbGF0ZSwgZWxldmF0b3JfcG90ZW50aW9tZXRlcl90cmFuc2xhdGUsIGZhbHNlLAorICAgICAgICAgIHZhbHVlcy5mcmlkZ2UubGVmdF9lbGV2YXRvcl9wb3RlbnRpb21ldGVyX29mZnNldCk7CisgICAgICBDb3B5UG90QW5kSW5kZXhQb3NpdGlvbigKKyAgICAgICAgICBlbGV2YXRvcl9yaWdodF9lbmNvZGVyXywgJmZyaWRnZV9tZXNzYWdlLT5lbGV2YXRvci5yaWdodCwKKyAgICAgICAgICBlbGV2YXRvcl90cmFuc2xhdGUsIGVsZXZhdG9yX3BvdGVudGlvbWV0ZXJfdHJhbnNsYXRlLCB0cnVlLAorICAgICAgICAgIHZhbHVlcy5mcmlkZ2UucmlnaHRfZWxldmF0b3JfcG90ZW50aW9tZXRlcl9vZmZzZXQpOworICAgICAgZnJpZGdlX21lc3NhZ2UuU2VuZCgpOworICAgIH0KKworICAgIHsKKyAgICAgIGF1dG8gY2xhd19tZXNzYWdlID0gY2xhd19xdWV1ZS5wb3NpdGlvbi5NYWtlTWVzc2FnZSgpOworICAgICAgQ29weVBvdEFuZEluZGV4UG9zaXRpb24od3Jpc3RfZW5jb2Rlcl8sICZjbGF3X21lc3NhZ2UtPmpvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhd190cmFuc2xhdGUsIGNsYXdfcG90ZW50aW9tZXRlcl90cmFuc2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdmFsdWVzLmNsYXcucG90ZW50aW9tZXRlcl9vZmZzZXQpOworICAgICAgY2xhd19tZXNzYWdlLlNlbmQoKTsKKyAgICB9CisgIH0KKworICB2b2lkIFF1aXQoKSB7IHJ1bl8gPSBmYWxzZTsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IGludCBrUHJpb3JpdHkgPSAzMDsKKyAgc3RhdGljIGNvbnN0IGludCBrSW50ZXJydXB0UHJpb3JpdHkgPSA1NTsKKworICBpbnQzMl90IG15X3BpZF87CisgIERyaXZlclN0YXRpb24gKmRzXzsKKworICB2b2lkIENvcHlQb3RBbmRJbmRleFBvc2l0aW9uKAorICAgICAgY29uc3QgRE1BRW5jb2RlckFuZFBvdGVudGlvbWV0ZXIgJmVuY29kZXIsIFBvdEFuZEluZGV4UG9zaXRpb24gKnBvc2l0aW9uLAorICAgICAgOjpzdGQ6OmZ1bmN0aW9uPGRvdWJsZShpbnQzMl90KT4gZW5jb2Rlcl90cmFuc2xhdGUsCisgICAgICA6OnN0ZDo6ZnVuY3Rpb248ZG91YmxlKGRvdWJsZSk+IHBvdGVudGlvbWV0ZXJfdHJhbnNsYXRlLCBib29sIHJldmVyc2UsCisgICAgICBkb3VibGUgcG90ZW50aW9tZXRlcl9vZmZzZXQpIHsKKyAgICBjb25zdCBkb3VibGUgbXVsdGlwbGllciA9IHJldmVyc2UgPyAtMS4wIDogMS4wOworICAgIHBvc2l0aW9uLT5lbmNvZGVyID0KKyAgICAgICAgbXVsdGlwbGllciAqIGVuY29kZXJfdHJhbnNsYXRlKGVuY29kZXIucG9sbGVkX2VuY29kZXJfdmFsdWUoKSk7CisgICAgcG9zaXRpb24tPnBvdCA9IG11bHRpcGxpZXIgKiBwb3RlbnRpb21ldGVyX3RyYW5zbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnBvbGxlZF9wb3RlbnRpb21ldGVyX3ZvbHRhZ2UoKSkgKworICAgICAgICAgICAgICAgICAgICBwb3RlbnRpb21ldGVyX29mZnNldDsKKyAgICBwb3NpdGlvbi0+bGF0Y2hlZF9lbmNvZGVyID0KKyAgICAgICAgbXVsdGlwbGllciAqIGVuY29kZXJfdHJhbnNsYXRlKGVuY29kZXIubGFzdF9lbmNvZGVyX3ZhbHVlKCkpOworICAgIHBvc2l0aW9uLT5sYXRjaGVkX3BvdCA9CisgICAgICAgIG11bHRpcGxpZXIgKgorICAgICAgICAgICAgcG90ZW50aW9tZXRlcl90cmFuc2xhdGUoZW5jb2Rlci5sYXN0X3BvdGVudGlvbWV0ZXJfdm9sdGFnZSgpKSArCisgICAgICAgIHBvdGVudGlvbWV0ZXJfb2Zmc2V0OworICAgIHBvc2l0aW9uLT5pbmRleF9wdWxzZXMgPSBlbmNvZGVyLmluZGV4X3Bvc2VkZ2VfY291bnQoKTsKKyAgfQorCisgIHZvaWQgQ29weVBvdEFuZEluZGV4UG9zaXRpb24oCisgICAgICBjb25zdCBJbnRlcnJ1cHRFbmNvZGVyQW5kUG90ZW50aW9tZXRlciAmZW5jb2RlciwKKyAgICAgIFBvdEFuZEluZGV4UG9zaXRpb24gKnBvc2l0aW9uLAorICAgICAgOjpzdGQ6OmZ1bmN0aW9uPGRvdWJsZShpbnQzMl90KT4gZW5jb2Rlcl90cmFuc2xhdGUsCisgICAgICA6OnN0ZDo6ZnVuY3Rpb248ZG91YmxlKGRvdWJsZSk+IHBvdGVudGlvbWV0ZXJfdHJhbnNsYXRlLCBib29sIHJldmVyc2UsCisgICAgICBkb3VibGUgcG90ZW50aW9tZXRlcl9vZmZzZXQpIHsKKyAgICBjb25zdCBkb3VibGUgbXVsdGlwbGllciA9IHJldmVyc2UgPyAtMS4wIDogMS4wOworICAgIHBvc2l0aW9uLT5lbmNvZGVyID0KKyAgICAgICAgbXVsdGlwbGllciAqIGVuY29kZXJfdHJhbnNsYXRlKGVuY29kZXIuZW5jb2RlcigpLT5HZXRSYXcoKSk7CisgICAgcG9zaXRpb24tPnBvdCA9IG11bHRpcGxpZXIgKiBwb3RlbnRpb21ldGVyX3RyYW5zbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnBvdGVudGlvbWV0ZXIoKS0+R2V0Vm9sdGFnZSgpKSArCisgICAgICAgICAgICAgICAgICAgIHBvdGVudGlvbWV0ZXJfb2Zmc2V0OworICAgIHBvc2l0aW9uLT5sYXRjaGVkX2VuY29kZXIgPQorICAgICAgICBtdWx0aXBsaWVyICogZW5jb2Rlcl90cmFuc2xhdGUoZW5jb2Rlci5sYXN0X2VuY29kZXJfdmFsdWUoKSk7CisgICAgcG9zaXRpb24tPmxhdGNoZWRfcG90ID0KKyAgICAgICAgbXVsdGlwbGllciAqCisgICAgICAgICAgICBwb3RlbnRpb21ldGVyX3RyYW5zbGF0ZShlbmNvZGVyLmxhc3RfcG90ZW50aW9tZXRlcl92b2x0YWdlKCkpICsKKyAgICAgICAgcG90ZW50aW9tZXRlcl9vZmZzZXQ7CisgICAgcG9zaXRpb24tPmluZGV4X3B1bHNlcyA9IGVuY29kZXIuaW5kZXhfcG9zZWRnZV9jb3VudCgpOworICB9CisKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RE1BU3luY2hyb25pemVyPiBkbWFfc3luY2hyb25pemVyXzsKKworICBETUFFbmNvZGVyQW5kUG90ZW50aW9tZXRlciBhcm1fbGVmdF9lbmNvZGVyXywgYXJtX3JpZ2h0X2VuY29kZXJfLAorICAgICAgZWxldmF0b3JfbGVmdF9lbmNvZGVyXywgZWxldmF0b3JfcmlnaHRfZW5jb2Rlcl87CisKKyAgSW50ZXJydXB0RW5jb2RlckFuZFBvdGVudGlvbWV0ZXIgd3Jpc3RfZW5jb2Rlcl97a0ludGVycnVwdFByaW9yaXR5fTsKKworICA6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiBsZWZ0X2VuY29kZXJfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxFbmNvZGVyPiByaWdodF9lbmNvZGVyXzsKKworICA6OnN0ZDo6YXRvbWljPGJvb2w+IHJ1bl97dHJ1ZX07CisgIERpZ2l0YWxHbGl0Y2hGaWx0ZXIgZmlsdGVyXzsKK307CisKK2NsYXNzIFNvbGVub2lkV3JpdGVyIHsKKyBwdWJsaWM6CisgIFNvbGVub2lkV3JpdGVyKGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkUGNtPiAmcGNtKQorICAgICAgOiBwY21fKHBjbSksCisgICAgICAgIGZyaWRnZV8oIi5mcmM5NzEuY29udHJvbF9sb29wcy5mcmlkZ2VfcXVldWUub3V0cHV0IiksCisgICAgICAgIGNsYXdfKCIuZnJjOTcxLmNvbnRyb2xfbG9vcHMuY2xhd19xdWV1ZS5vdXRwdXQiKSB7fQorCisgIHZvaWQgc2V0X3ByZXNzdXJlX3N3aXRjaCg6OnN0ZDo6dW5pcXVlX3B0cjxEaWdpdGFsU291cmNlPiBwcmVzc3VyZV9zd2l0Y2gpIHsKKyAgICBwcmVzc3VyZV9zd2l0Y2hfID0gOjpzdGQ6Om1vdmUocHJlc3N1cmVfc3dpdGNoKTsKKyAgfQorCisgIHZvaWQgc2V0X2NvbXByZXNzb3JfcmVsYXkoOjpzdGQ6OnVuaXF1ZV9wdHI8UmVsYXk+IGNvbXByZXNzb3JfcmVsYXkpIHsKKyAgICBjb21wcmVzc29yX3JlbGF5XyA9IDo6c3RkOjptb3ZlKGNvbXByZXNzb3JfcmVsYXkpOworICB9CisKKyAgdm9pZCBzZXRfZnJpZGdlX2dyYWJiZXJzX3RvcF9mcm9udCg6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBzKSB7CisgICAgZnJpZGdlX2dyYWJiZXJzX3RvcF9mcm9udF8gPSA6OnN0ZDo6bW92ZShzKTsKKyAgfQorCisgIHZvaWQgc2V0X2ZyaWRnZV9ncmFiYmVyc190b3BfYmFjayg6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBzKSB7CisgICAgZnJpZGdlX2dyYWJiZXJzX3RvcF9iYWNrXyA9IDo6c3RkOjptb3ZlKHMpOworICB9CisKKyAgdm9pZCBzZXRfZnJpZGdlX2dyYWJiZXJzX2JvdHRvbV9mcm9udCgKKyAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkU29sZW5vaWQ+IHMpIHsKKyAgICBmcmlkZ2VfZ3JhYmJlcnNfYm90dG9tX2Zyb250XyA9IDo6c3RkOjptb3ZlKHMpOworICB9CisKKyAgdm9pZCBzZXRfZnJpZGdlX2dyYWJiZXJzX2JvdHRvbV9iYWNrKAorICAgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4gcykgeworICAgIGZyaWRnZV9ncmFiYmVyc19ib3R0b21fYmFja18gPSA6OnN0ZDo6bW92ZShzKTsKKyAgfQorCisgIHZvaWQgc2V0X2NsYXdfcGluY2hlcnMoOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4gcykgeworICAgIGNsYXdfcGluY2hlcnNfID0gOjpzdGQ6Om1vdmUocyk7CisgIH0KKworICB2b2lkIHNldF9ncmFiYmVyX2xhdGNoX3JlbGVhc2UoOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4gcykgeworICAgIGdyYWJiZXJfbGF0Y2hfcmVsZWFzZV8gPSA6OnN0ZDo6bW92ZShzKTsKKyAgfQorCisgIHZvaWQgc2V0X2dyYWJiZXJfZm9sZF91cCg6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBzKSB7CisgICAgZ3JhYmJlcl9mb2xkX3VwXyA9IDo6c3RkOjptb3ZlKHMpOworICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKCkgeworICAgIDo6YW9zOjpTZXRDdXJyZW50VGhyZWFkTmFtZSgiU29sZW5vaWRzIik7CisgICAgOjphb3M6OlNldEN1cnJlbnRUaHJlYWRSZWFsdGltZVByaW9yaXR5KDMwKTsKKworICAgIHdoaWxlIChydW5fKSB7CisgICAgICA6OmFvczo6dGltZTo6UGhhc2VkTG9vcFhNUygyMCwgMTAwMCk7CisKKyAgICAgIHsKKyAgICAgICAgZnJpZGdlXy5GZXRjaExhdGVzdCgpOworICAgICAgICBpZiAoZnJpZGdlXy5nZXQoKSkgeworICAgICAgICAgIExPR19TVFJVQ1QoREVCVUcsICJzb2xlbm9pZHMiLCAqZnJpZGdlXyk7CisgICAgICAgICAgZnJpZGdlX2dyYWJiZXJzX3RvcF9mcm9udF8tPlNldCghZnJpZGdlXy0+Z3JhYmJlcnMudG9wX2Zyb250KTsKKyAgICAgICAgICBmcmlkZ2VfZ3JhYmJlcnNfdG9wX2JhY2tfLT5TZXQoIWZyaWRnZV8tPmdyYWJiZXJzLnRvcF9iYWNrKTsKKyAgICAgICAgICBmcmlkZ2VfZ3JhYmJlcnNfYm90dG9tX2Zyb250Xy0+U2V0KCFmcmlkZ2VfLT5ncmFiYmVycy5ib3R0b21fZnJvbnQpOworICAgICAgICAgIGZyaWRnZV9ncmFiYmVyc19ib3R0b21fYmFja18tPlNldCghZnJpZGdlXy0+Z3JhYmJlcnMuYm90dG9tX2JhY2spOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgY2xhd18uRmV0Y2hMYXRlc3QoKTsKKyAgICAgICAgaWYgKGNsYXdfLmdldCgpKSB7CisgICAgICAgICAgTE9HX1NUUlVDVChERUJVRywgInNvbGVub2lkcyIsICpjbGF3Xyk7CisgICAgICAgICAgY2xhd19waW5jaGVyc18tPlNldChjbGF3Xy0+cm9sbGVyc19jbG9zZWQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIDo6YW9zOjpqb3lzdGlja19zdGF0ZS5GZXRjaExhdGVzdCgpOworICAgICAgZ3JhYmJlcl9sYXRjaF9yZWxlYXNlXy0+U2V0KDo6YW9zOjpqb3lzdGlja19zdGF0ZS5nZXQoKSAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjphb3M6OmpveXN0aWNrX3N0YXRlLT5hdXRvbm9tb3VzKTsKKyAgICAgIGdyYWJiZXJfZm9sZF91cF8tPlNldCg6OmFvczo6am95c3RpY2tfc3RhdGUuZ2V0KCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6YW9zOjpqb3lzdGlja19zdGF0ZS0+am95c3RpY2tzWzFdLmJ1dHRvbnMgJiAxKTsKKworICAgICAgeworICAgICAgICBQbmV1bWF0aWNzVG9Mb2cgdG9fbG9nOworICAgICAgICB7CisgICAgICAgICAgY29uc3QgYm9vbCBjb21wcmVzc29yX29uID0gIXByZXNzdXJlX3N3aXRjaF8tPkdldCgpOworICAgICAgICAgIHRvX2xvZy5jb21wcmVzc29yX29uID0gY29tcHJlc3Nvcl9vbjsKKyAgICAgICAgICBpZiAoY29tcHJlc3Nvcl9vbikgeworICAgICAgICAgICAgY29tcHJlc3Nvcl9yZWxheV8tPlNldChSZWxheTo6a0ZvcndhcmQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wcmVzc29yX3JlbGF5Xy0+U2V0KFJlbGF5OjprT2ZmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwY21fLT5GbHVzaCgpOworICAgICAgICB0b19sb2cucmVhZF9zb2xlbm9pZHMgPSBwY21fLT5HZXRBbGwoKTsKKyAgICAgICAgTE9HX1NUUlVDVChERUJVRywgInBuZXVtYXRpY3MgaW5mbyIsIHRvX2xvZyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBRdWl0KCkgeyBydW5fID0gZmFsc2U7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkUGNtPiAmcGNtXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4gZnJpZGdlX2dyYWJiZXJzX3RvcF9mcm9udF87CisgIDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkU29sZW5vaWQ+IGZyaWRnZV9ncmFiYmVyc190b3BfYmFja187CisgIDo6c3RkOjp1bmlxdWVfcHRyPEJ1ZmZlcmVkU29sZW5vaWQ+IGZyaWRnZV9ncmFiYmVyc19ib3R0b21fZnJvbnRfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBmcmlkZ2VfZ3JhYmJlcnNfYm90dG9tX2JhY2tfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJlZFNvbGVub2lkPiBjbGF3X3BpbmNoZXJzXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4gZ3JhYmJlcl9sYXRjaF9yZWxlYXNlXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyZWRTb2xlbm9pZD4gZ3JhYmJlcl9mb2xkX3VwXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RGlnaXRhbFNvdXJjZT4gcHJlc3N1cmVfc3dpdGNoXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8UmVsYXk+IGNvbXByZXNzb3JfcmVsYXlfOworCisgIDo6YW9zOjpRdWV1ZTw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RnJpZGdlUXVldWU6Ok91dHB1dD4gZnJpZGdlXzsKKyAgOjphb3M6OlF1ZXVlPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpDbGF3UXVldWU6Ok91dHB1dD4gY2xhd187CisKKyAgOjpzdGQ6OmF0b21pYzxib29sPiBydW5fe3RydWV9OworfTsKKworY2xhc3MgRHJpdmV0cmFpbldyaXRlciA6IHB1YmxpYyBMb29wT3V0cHV0SGFuZGxlciB7CisgcHVibGljOgorICB2b2lkIHNldF9sZWZ0X2RyaXZldHJhaW5fdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICBsZWZ0X2RyaXZldHJhaW5fdGFsb25fID0gOjpzdGQ6Om1vdmUodCk7CisgIH0KKworICB2b2lkIHNldF9yaWdodF9kcml2ZXRyYWluX3RhbG9uKDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiB0KSB7CisgICAgcmlnaHRfZHJpdmV0cmFpbl90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIFJlYWQoKSBvdmVycmlkZSB7CisgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUub3V0cHV0LkZldGNoQW5vdGhlcigpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFdyaXRlKCkgb3ZlcnJpZGUgeworICAgIGF1dG8gJnF1ZXVlID0gOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmRyaXZldHJhaW5fcXVldWUub3V0cHV0OworICAgIExPR19TVFJVQ1QoREVCVUcsICJ3aWxsIG91dHB1dCIsICpxdWV1ZSk7CisgICAgbGVmdF9kcml2ZXRyYWluX3RhbG9uXy0+U2V0KHF1ZXVlLT5sZWZ0X3ZvbHRhZ2UgLyAxMi4wKTsKKyAgICByaWdodF9kcml2ZXRyYWluX3RhbG9uXy0+U2V0KC1xdWV1ZS0+cmlnaHRfdm9sdGFnZSAvIDEyLjApOworICB9CisKKyAgdmlydHVhbCB2b2lkIFN0b3AoKSBvdmVycmlkZSB7CisgICAgTE9HKFdBUk5JTkcsICJkcml2ZXRyYWluIG91dHB1dCB0b28gb2xkXG4iKTsKKyAgICBsZWZ0X2RyaXZldHJhaW5fdGFsb25fLT5EaXNhYmxlKCk7CisgICAgcmlnaHRfZHJpdmV0cmFpbl90YWxvbl8tPkRpc2FibGUoKTsKKyAgfQorCisgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiBsZWZ0X2RyaXZldHJhaW5fdGFsb25fOworICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gcmlnaHRfZHJpdmV0cmFpbl90YWxvbl87Cit9OworCitjbGFzcyBGcmlkZ2VXcml0ZXIgOiBwdWJsaWMgTG9vcE91dHB1dEhhbmRsZXIgeworIHB1YmxpYzoKKyAgdm9pZCBzZXRfbGVmdF9hcm1fdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICBsZWZ0X2FybV90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgIHZvaWQgc2V0X3JpZ2h0X2FybV90YWxvbig6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gdCkgeworICAgIHJpZ2h0X2FybV90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgIHZvaWQgc2V0X2xlZnRfZWxldmF0b3JfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICBsZWZ0X2VsZXZhdG9yX3RhbG9uXyA9IDo6c3RkOjptb3ZlKHQpOworICB9CisKKyAgdm9pZCBzZXRfcmlnaHRfZWxldmF0b3JfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICByaWdodF9lbGV2YXRvcl90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIFJlYWQoKSBvdmVycmlkZSB7CisgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OmZyaWRnZV9xdWV1ZS5vdXRwdXQuRmV0Y2hBbm90aGVyKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgV3JpdGUoKSBvdmVycmlkZSB7CisgICAgYXV0byAmcXVldWUgPSA6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6ZnJpZGdlX3F1ZXVlLm91dHB1dDsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAid2lsbCBvdXRwdXQiLCAqcXVldWUpOworICAgIGxlZnRfYXJtX3RhbG9uXy0+U2V0KHF1ZXVlLT5sZWZ0X2FybSAvIDEyLjApOworICAgIHJpZ2h0X2FybV90YWxvbl8tPlNldCgtcXVldWUtPnJpZ2h0X2FybSAvIDEyLjApOworICAgIGxlZnRfZWxldmF0b3JfdGFsb25fLT5TZXQocXVldWUtPmxlZnRfZWxldmF0b3IgLyAxMi4wKTsKKyAgICByaWdodF9lbGV2YXRvcl90YWxvbl8tPlNldCgtcXVldWUtPnJpZ2h0X2VsZXZhdG9yIC8gMTIuMCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHsKKyAgICBMT0coV0FSTklORywgIkZyaWRnZSBvdXRwdXQgdG9vIG9sZC5cbiIpOworICAgIGxlZnRfYXJtX3RhbG9uXy0+RGlzYWJsZSgpOworICAgIHJpZ2h0X2FybV90YWxvbl8tPkRpc2FibGUoKTsKKyAgICBsZWZ0X2VsZXZhdG9yX3RhbG9uXy0+RGlzYWJsZSgpOworICAgIHJpZ2h0X2VsZXZhdG9yX3RhbG9uXy0+RGlzYWJsZSgpOworICB9CisKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IGxlZnRfYXJtX3RhbG9uXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHJpZ2h0X2FybV90YWxvbl87CisgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiBsZWZ0X2VsZXZhdG9yX3RhbG9uXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHJpZ2h0X2VsZXZhdG9yX3RhbG9uXzsKK307CisKK2NsYXNzIENsYXdXcml0ZXIgOiBwdWJsaWMgTG9vcE91dHB1dEhhbmRsZXIgeworIHB1YmxpYzoKKyAgdm9pZCBzZXRfbGVmdF9pbnRha2VfdGFsb24oOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHQpIHsKKyAgICBsZWZ0X2ludGFrZV90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgIHZvaWQgc2V0X3JpZ2h0X2ludGFrZV90YWxvbig6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gdCkgeworICAgIHJpZ2h0X2ludGFrZV90YWxvbl8gPSA6OnN0ZDo6bW92ZSh0KTsKKyAgfQorCisgIHZvaWQgc2V0X3dyaXN0X3RhbG9uKDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPiB0KSB7CisgICAgd3Jpc3RfdGFsb25fID0gOjpzdGQ6Om1vdmUodCk7CisgIH0KKworIHByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBSZWFkKCkgb3ZlcnJpZGUgeworICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLm91dHB1dC5GZXRjaEFub3RoZXIoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBXcml0ZSgpIG92ZXJyaWRlIHsKKyAgICBhdXRvICZxdWV1ZSA9IDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpjbGF3X3F1ZXVlLm91dHB1dDsKKyAgICBMT0dfU1RSVUNUKERFQlVHLCAid2lsbCBvdXRwdXQiLCAqcXVldWUpOworICAgIGxlZnRfaW50YWtlX3RhbG9uXy0+U2V0KHF1ZXVlLT5pbnRha2Vfdm9sdGFnZSAvIDEyLjApOworICAgIHJpZ2h0X2ludGFrZV90YWxvbl8tPlNldCgtcXVldWUtPmludGFrZV92b2x0YWdlIC8gMTIuMCk7CisgICAgd3Jpc3RfdGFsb25fLT5TZXQoLXF1ZXVlLT52b2x0YWdlIC8gMTIuMCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHsKKyAgICBMT0coV0FSTklORywgIkNsYXcgb3V0cHV0IHRvbyBvbGQuXG4iKTsKKyAgICBsZWZ0X2ludGFrZV90YWxvbl8tPkRpc2FibGUoKTsKKyAgICByaWdodF9pbnRha2VfdGFsb25fLT5EaXNhYmxlKCk7CisgICAgd3Jpc3RfdGFsb25fLT5EaXNhYmxlKCk7CisgIH0KKworICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gbGVmdF9pbnRha2VfdGFsb25fOworICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4gcmlnaHRfaW50YWtlX3RhbG9uXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VGFsb24+IHdyaXN0X3RhbG9uXzsKK307CisKKy8vIFRPRE8oYnJpYW4pOiBSZXBsYWNlIHRoaXMgd2l0aCA6OnN0ZDo6bWFrZV91bmlxdWUgb25jZSBhbGwgb3VyIHRvb2xjaGFpbnMKKy8vIGhhdmUgc3VwcG9ydC4KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBVPgorc3RkOjp1bmlxdWVfcHRyPFQ+IG1ha2VfdW5pcXVlKFUgJiYuLi4gdSkgeworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFQ+KG5ldyBUKHN0ZDo6Zm9yd2FyZDxVPih1KS4uLikpOworfQorCitjbGFzcyBXUElMaWJSb2JvdCA6IHB1YmxpYyBSb2JvdEJhc2UgeworIHB1YmxpYzoKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RW5jb2Rlcj4gZW5jb2RlcihpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gbWFrZV91bmlxdWU8RW5jb2Rlcj4oMTAgKyBpbmRleCAqIDIsIDExICsgaW5kZXggKiAyLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2Rlcjo6azRYKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgU3RhcnRDb21wZXRpdGlvbigpIHsKKyAgICA6OmFvczo6SW5pdE5SVCgpOworICAgIDo6YW9zOjpTZXRDdXJyZW50VGhyZWFkTmFtZSgiU3RhcnRDb21wZXRpdGlvbiIpOworCisgICAgSm95c3RpY2tTZW5kZXIgam95c3RpY2tfc2VuZGVyOworICAgIDo6c3RkOjp0aHJlYWQgam95c3RpY2tfdGhyZWFkKDo6c3RkOjpyZWYoam95c3RpY2tfc2VuZGVyKSk7CisgICAgLy8gVE9ETyhhdXN0aW4pOiBDb21wcmVzc29yIG5lZWRzIHRvIHVzZSBhIHNwaWtlLgorCisgICAgU2Vuc29yUmVhZGVyIHJlYWRlcjsKKyAgICBMT0coSU5GTywgIkNyZWF0aW5nIHRoZSByZWFkZXJcbiIpOworICAgIHJlYWRlci5zZXRfYXJtX2xlZnRfZW5jb2RlcihlbmNvZGVyKDEpKTsKKyAgICByZWFkZXIuc2V0X2FybV9sZWZ0X2luZGV4KG1ha2VfdW5pcXVlPERpZ2l0YWxJbnB1dD4oMSkpOworICAgIHJlYWRlci5zZXRfYXJtX2xlZnRfcG90ZW50aW9tZXRlcihtYWtlX3VuaXF1ZTxBbmFsb2dJbnB1dD4oMSkpOworCisgICAgcmVhZGVyLnNldF9hcm1fcmlnaHRfZW5jb2RlcihlbmNvZGVyKDUpKTsKKyAgICByZWFkZXIuc2V0X2FybV9yaWdodF9pbmRleChtYWtlX3VuaXF1ZTxEaWdpdGFsSW5wdXQ+KDUpKTsKKyAgICByZWFkZXIuc2V0X2FybV9yaWdodF9wb3RlbnRpb21ldGVyKG1ha2VfdW5pcXVlPEFuYWxvZ0lucHV0Pig1KSk7CisKKyAgICByZWFkZXIuc2V0X2VsZXZhdG9yX2xlZnRfZW5jb2RlcihlbmNvZGVyKDApKTsKKyAgICByZWFkZXIuc2V0X2VsZXZhdG9yX2xlZnRfaW5kZXgobWFrZV91bmlxdWU8RGlnaXRhbElucHV0PigwKSk7CisgICAgcmVhZGVyLnNldF9lbGV2YXRvcl9sZWZ0X3BvdGVudGlvbWV0ZXIobWFrZV91bmlxdWU8QW5hbG9nSW5wdXQ+KDApKTsKKworICAgIHJlYWRlci5zZXRfZWxldmF0b3JfcmlnaHRfZW5jb2RlcihlbmNvZGVyKDQpKTsKKyAgICByZWFkZXIuc2V0X2VsZXZhdG9yX3JpZ2h0X2luZGV4KG1ha2VfdW5pcXVlPERpZ2l0YWxJbnB1dD4oNCkpOworICAgIHJlYWRlci5zZXRfZWxldmF0b3JfcmlnaHRfcG90ZW50aW9tZXRlcihtYWtlX3VuaXF1ZTxBbmFsb2dJbnB1dD4oNCkpOworCisgICAgcmVhZGVyLnNldF93cmlzdF9lbmNvZGVyKGVuY29kZXIoNikpOworICAgIHJlYWRlci5zZXRfd3Jpc3RfaW5kZXgobWFrZV91bmlxdWU8RGlnaXRhbElucHV0Pig2KSk7CisgICAgcmVhZGVyLnNldF93cmlzdF9wb3RlbnRpb21ldGVyKG1ha2VfdW5pcXVlPEFuYWxvZ0lucHV0Pig2KSk7CisKKyAgICByZWFkZXIuc2V0X2xlZnRfZW5jb2RlcihlbmNvZGVyKDIpKTsKKyAgICByZWFkZXIuc2V0X3JpZ2h0X2VuY29kZXIoZW5jb2RlcigzKSk7CisgICAgcmVhZGVyLnNldF9kbWEobWFrZV91bmlxdWU8RE1BPigpKTsKKyAgICA6OnN0ZDo6dGhyZWFkIHJlYWRlcl90aHJlYWQoOjpzdGQ6OnJlZihyZWFkZXIpKTsKKyAgICBHeXJvU2VuZGVyIGd5cm9fc2VuZGVyOworICAgIDo6c3RkOjp0aHJlYWQgZ3lyb190aHJlYWQoOjpzdGQ6OnJlZihneXJvX3NlbmRlcikpOworCisgICAgRHJpdmV0cmFpbldyaXRlciBkcml2ZXRyYWluX3dyaXRlcjsKKyAgICBkcml2ZXRyYWluX3dyaXRlci5zZXRfbGVmdF9kcml2ZXRyYWluX3RhbG9uKAorICAgICAgICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4obmV3IFRhbG9uKDgpKSk7CisgICAgZHJpdmV0cmFpbl93cml0ZXIuc2V0X3JpZ2h0X2RyaXZldHJhaW5fdGFsb24oCisgICAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPihuZXcgVGFsb24oMCkpKTsKKyAgICA6OnN0ZDo6dGhyZWFkIGRyaXZldHJhaW5fd3JpdGVyX3RocmVhZCg6OnN0ZDo6cmVmKGRyaXZldHJhaW5fd3JpdGVyKSk7CisKKyAgICAvLyBUT0RPKHNlbnNvcnMpOiBHZXQgcmVhbCBQV00gb3V0cHV0IGFuZCByZWxheSBudW1iZXJzIGZvciB0aGUgZnJpZGdlIGFuZAorICAgIC8vIGNsYXcuCisgICAgRnJpZGdlV3JpdGVyIGZyaWRnZV93cml0ZXI7CisgICAgZnJpZGdlX3dyaXRlci5zZXRfbGVmdF9hcm1fdGFsb24oCisgICAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPihuZXcgVGFsb24oNikpKTsKKyAgICBmcmlkZ2Vfd3JpdGVyLnNldF9yaWdodF9hcm1fdGFsb24oCisgICAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPihuZXcgVGFsb24oMikpKTsKKyAgICBmcmlkZ2Vfd3JpdGVyLnNldF9sZWZ0X2VsZXZhdG9yX3RhbG9uKAorICAgICAgICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4obmV3IFRhbG9uKDcpKSk7CisgICAgZnJpZGdlX3dyaXRlci5zZXRfcmlnaHRfZWxldmF0b3JfdGFsb24oCisgICAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPihuZXcgVGFsb24oMSkpKTsKKyAgICA6OnN0ZDo6dGhyZWFkIGZyaWRnZV93cml0ZXJfdGhyZWFkKDo6c3RkOjpyZWYoZnJpZGdlX3dyaXRlcikpOworCisgICAgQ2xhd1dyaXRlciBjbGF3X3dyaXRlcjsKKyAgICBjbGF3X3dyaXRlci5zZXRfbGVmdF9pbnRha2VfdGFsb24oCisgICAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPFRhbG9uPihuZXcgVGFsb24oNSkpKTsKKyAgICBjbGF3X3dyaXRlci5zZXRfcmlnaHRfaW50YWtlX3RhbG9uKAorICAgICAgICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4obmV3IFRhbG9uKDMpKSk7CisgICAgY2xhd193cml0ZXIuc2V0X3dyaXN0X3RhbG9uKAorICAgICAgICA6OnN0ZDo6dW5pcXVlX3B0cjxUYWxvbj4obmV3IFRhbG9uKDQpKSk7CisgICAgOjpzdGQ6OnRocmVhZCBjbGF3X3dyaXRlcl90aHJlYWQoOjpzdGQ6OnJlZihjbGF3X3dyaXRlcikpOworCisgICAgOjpzdGQ6OnVuaXF1ZV9wdHI8OjpmcmM5NzE6OndwaWxpYjo6QnVmZmVyZWRQY20+IHBjbSgKKyAgICAgICAgbmV3IDo6ZnJjOTcxOjp3cGlsaWI6OkJ1ZmZlcmVkUGNtKCkpOworICAgIFNvbGVub2lkV3JpdGVyIHNvbGVub2lkX3dyaXRlcihwY20pOworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfZnJpZGdlX2dyYWJiZXJzX3RvcF9mcm9udChwY20tPk1ha2VTb2xlbm9pZCgwKSk7CisgICAgc29sZW5vaWRfd3JpdGVyLnNldF9mcmlkZ2VfZ3JhYmJlcnNfdG9wX2JhY2socGNtLT5NYWtlU29sZW5vaWQoMCkpOworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfZnJpZGdlX2dyYWJiZXJzX2JvdHRvbV9mcm9udChwY20tPk1ha2VTb2xlbm9pZCgyKSk7CisgICAgc29sZW5vaWRfd3JpdGVyLnNldF9mcmlkZ2VfZ3JhYmJlcnNfYm90dG9tX2JhY2socGNtLT5NYWtlU29sZW5vaWQoMSkpOworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfY2xhd19waW5jaGVycyhwY20tPk1ha2VTb2xlbm9pZCg0KSk7CisgICAgc29sZW5vaWRfd3JpdGVyLnNldF9ncmFiYmVyX2xhdGNoX3JlbGVhc2UocGNtLT5NYWtlU29sZW5vaWQoNykpOworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfZ3JhYmJlcl9mb2xkX3VwKHBjbS0+TWFrZVNvbGVub2lkKDUpKTsKKworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfcHJlc3N1cmVfc3dpdGNoKG1ha2VfdW5pcXVlPERpZ2l0YWxJbnB1dD4oOSkpOworICAgIHNvbGVub2lkX3dyaXRlci5zZXRfY29tcHJlc3Nvcl9yZWxheShtYWtlX3VuaXF1ZTxSZWxheT4oMCkpOworICAgIDo6c3RkOjp0aHJlYWQgc29sZW5vaWRfdGhyZWFkKDo6c3RkOjpyZWYoc29sZW5vaWRfd3JpdGVyKSk7CisKKyAgICAvLyBXYWl0IGZvcmV2ZXIuIE5vdCBtdWNoIGVsc2UgdG8gZG8uLi4KKyAgICBQQ0hFQ0soc2VsZWN0KDAsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKTsKKworICAgIExPRyhFUlJPUiwgIkV4aXRpbmcgV1BJTGliUm9ib3RcbiIpOworCisgICAgam95c3RpY2tfc2VuZGVyLlF1aXQoKTsKKyAgICBqb3lzdGlja190aHJlYWQuam9pbigpOworICAgIHJlYWRlci5RdWl0KCk7CisgICAgcmVhZGVyX3RocmVhZC5qb2luKCk7CisgICAgZ3lyb19zZW5kZXIuUXVpdCgpOworICAgIGd5cm9fdGhyZWFkLmpvaW4oKTsKKworICAgIGRyaXZldHJhaW5fd3JpdGVyLlF1aXQoKTsKKyAgICBkcml2ZXRyYWluX3dyaXRlcl90aHJlYWQuam9pbigpOworICAgIHNvbGVub2lkX3dyaXRlci5RdWl0KCk7CisgICAgc29sZW5vaWRfdGhyZWFkLmpvaW4oKTsKKworICAgIDo6YW9zOjpDbGVhbnVwKCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSB3cGlsaWIKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworCitTVEFSVF9ST0JPVF9DTEFTUyg6OmZyYzk3MTo6d3BpbGliOjpXUElMaWJSb2JvdCk7CmRpZmYgLS1naXQgYS95MjAxNS95MjAxNS5neXAgYi95MjAxNS95MjAxNS5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5MjlkOQotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE1L3kyMDE1Lmd5cApAQCAtMCwwICsxLDUzIEBACit7CisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdjb25zdGFudHMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjb25zdGFudHMuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KEFPUykvYnVpbGQvYW9zLmd5cDpsb2dnaW5nJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vY29tbW9uLmd5cDpvbmNlJywKKyAgICAgICAgJzwoQU9TKS9jb21tb24vbmV0d29yay9uZXR3b3JrLmd5cDp0ZWFtX251bWJlcicsCisgICAgICAgICc8KERFUFRIKS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLmd5cDpzdGF0ZV9mZWVkYmFja19sb29wJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpwb2x5ZHJpdmV0cmFpbl9wbGFudHMnLAorICAgICAgXSwKKyAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWworICAgICAgICAnPChERVBUSCkvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5neXA6c3RhdGVfZmVlZGJhY2tfbG9vcCcsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2pveXN0aWNrX3JlYWRlcicsCisgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnam95c3RpY2tfcmVhZGVyLmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChBT1MpL3ByaW1lL2lucHV0L2lucHV0Lmd5cDpqb3lzdGlja19pbnB1dCcsCisgICAgICAgICc8KEFPUykvbGludXhfY29kZS9saW51eF9jb2RlLmd5cDppbml0JywKKyAgICAgICAgJzwoQU9TKS9idWlsZC9hb3MuZ3lwOmxvZ2dpbmcnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi9jb21tb24uZ3lwOnRpbWUnLAorICAgICAgICAnPChBT1MpL2NvbW1vbi91dGlsL3V0aWwuZ3lwOmxvZ19pbnRlcnZhbCcsCisgICAgICAgICc8KEFPUykvY29tbW9uL2FjdGlvbnMvYWN0aW9ucy5neXA6YWN0aW9uX2xpYicsCisKKyAgICAgICAgJzwoREVQVEgpL2ZyYzk3MS9xdWV1ZXMvcXVldWVzLmd5cDpneXJvJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2NvbnRyb2xfbG9vcHMvY2xhdy9jbGF3Lmd5cDpjbGF3X3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLmd5cDpkcml2ZXRyYWluX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2NvbnRyb2xfbG9vcHMvZnJpZGdlL2ZyaWRnZS5neXA6ZnJpZGdlX3F1ZXVlJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L3kyMDE1Lmd5cDpjb25zdGFudHMnLAorICAgICAgICAnPChERVBUSCkvZnJjOTcxL2F1dG9ub21vdXMvYXV0b25vbW91cy5neXA6YXV0b19xdWV1ZScsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9hY3RvcnMvYWN0b3JzLmd5cDpzdGFja19hY3Rpb25fbGliJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2FjdG9ycy9hY3RvcnMuZ3lwOnN0YWNrX2FuZF9saWZ0X2FjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUvYWN0b3JzL2FjdG9ycy5neXA6c3RhY2tfYW5kX2hvbGRfYWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9hY3RvcnMvYWN0b3JzLmd5cDpwaWNrdXBfYWN0aW9uX2xpYicsCisgICAgICAgICc8KERFUFRIKS95MjAxNS9hY3RvcnMvYWN0b3JzLmd5cDpsaWZ0X2FjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUvYWN0b3JzL2FjdG9ycy5neXA6aGVsZF90b19saWZ0X2FjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUvYWN0b3JzL2FjdG9ycy5neXA6Y2FuX3BpY2t1cF9hY3Rpb25fbGliJywKKyAgICAgICAgJzwoREVQVEgpL3kyMDE1L2FjdG9ycy9hY3RvcnMuZ3lwOnNjb3JlX2FjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUvYWN0b3JzL2FjdG9ycy5neXA6aG9yaXpvbnRhbF9jYW5fcGlja3VwX2FjdGlvbl9saWInLAorICAgICAgICAnPChERVBUSCkveTIwMTUvYWN0b3JzL2FjdG9ycy5neXA6ZnJpZGdlX3Byb2ZpbGVfbGliJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30K